diff --git a/dist/default_installation.cjs b/dist/default_installation.cjs index f2342ad..cd10f8e 100755 --- a/dist/default_installation.cjs +++ b/dist/default_installation.cjs @@ -47825,6 +47825,31 @@ const puppeteerLaunchOptions = { +/***/ }), + +/***/ "./src/pages/confirm-installation-page.ts": +/*!************************************************!*\ + !*** ./src/pages/confirm-installation-page.ts ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ ConfirmInstallationPopup: () => (/* binding */ ConfirmInstallationPopup) +/* harmony export */ }); +class ConfirmInstallationPopup { + page; + continueText = () => this.page.locator("button::-p-text('Continue')"); + constructor(page) { + this.page = page; + } + async continue() { + await this.continueText().click(); + } +} + + /***/ }), /***/ "./src/pages/create-user-page.ts": @@ -47893,6 +47918,31 @@ class LoginAsRootPage { } +/***/ }), + +/***/ "./src/pages/overiew-page.ts": +/*!***********************************!*\ + !*** ./src/pages/overiew-page.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ OverviewPage: () => (/* binding */ OverviewPage) +/* harmony export */ }); +class OverviewPage { + page; + installText = () => this.page.locator("button::-p-text('Install')"); + constructor(page) { + this.page = page; + } + async install() { + await this.installText().click(); + } +} + + /***/ }), /***/ "./src/pages/product-selection-page.ts": @@ -48064,6 +48114,10 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _pages_users_page__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../pages/users-page */ "./src/pages/users-page.ts"); /* harmony import */ var _pages_root_password_page__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../pages/root-password-page */ "./src/pages/root-password-page.ts"); /* harmony import */ var _pages_create_user_page__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../pages/create-user-page */ "./src/pages/create-user-page.ts"); +/* harmony import */ var _pages_overiew_page__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../pages/overiew-page */ "./src/pages/overiew-page.ts"); +/* harmony import */ var _pages_confirm_installation_page__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../pages/confirm-installation-page */ "./src/pages/confirm-installation-page.ts"); + + @@ -48192,7 +48246,8 @@ const agamaUserFullName = "Bernhard M. Wiedemann"; }); } it("should be ready for installation", async function () { - await page.locator("a[href='#/overview']").click(); + const sidebar = new _pages_sidebar_page__WEBPACK_IMPORTED_MODULE_8__.SidebarPage(page); + await sidebar.goToOverview(); // In Overview, Storage section takes more time to refresh changing // the position in the screen of text 'Ready for installation and button 'Install' // page.waitForNetworkIdle solves this issue @@ -48201,8 +48256,10 @@ const agamaUserFullName = "Bernhard M. Wiedemann"; // For development will be useful to stop before starting installation if (agamaInstall === true) { it("should start installation", async function () { - await page.locator("button::-p-text('Install')").click(); - await page.locator("button::-p-text('Continue')").click(); + const overview = new _pages_overiew_page__WEBPACK_IMPORTED_MODULE_12__.OverviewPage(page); + const install = new _pages_confirm_installation_page__WEBPACK_IMPORTED_MODULE_13__.ConfirmInstallationPopup(page); + await overview.install(); + await install.continue(); await page.locator("::-p-text(Installing the)").wait(); }); it("should finish installation", async function () { @@ -94225,7 +94282,7 @@ const REQUIRE_DIRECTORY_ERROR = 'loading a directory of commands is not supporte let __dirname; try { - __dirname = (0,url__WEBPACK_IMPORTED_MODULE_5__.fileURLToPath)("file:///home/jrivera/Code/agama-integration-test-webpack/node_modules/yargs/lib/platform-shims/esm.mjs"); + __dirname = (0,url__WEBPACK_IMPORTED_MODULE_5__.fileURLToPath)("file:///srv/Work/agama-integration-test-webpack/node_modules/yargs/lib/platform-shims/esm.mjs"); } catch (e) { __dirname = process.cwd(); } @@ -94508,4 +94565,4 @@ module.exports = /*#__PURE__*/JSON.parse('{"name":"escodegen","description":"ECM /******/ /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLDZCQUE2QjtBQUMzRCxpQkFBaUI7QUFDakI7QUFDQSw4QkFBOEIsNkJBQTZCO0FBQzNELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsdUJBQXVCO0FBQy9DO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHVEQUF1RCxTQUFTO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0ZBQW9GLGtCQUFrQjtBQUN0RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBZTtBQUNmOzs7Ozs7Ozs7Ozs7QUMvUGE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLDJDQUEyQyxtQkFBTyxDQUFDLGdFQUFjO0FBQ2pFLHFDQUFxQyxtQkFBTyxDQUFDLG9EQUFRO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDVmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLHNDQUFzQyxtQkFBTyxDQUFDLDJEQUFjO0FBQzVELHVDQUF1QyxtQkFBTyxDQUFDLDZEQUFlO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDelNhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixzQ0FBc0MsbUJBQU8sQ0FBQywyREFBYztBQUM1RCx1Q0FBdUMsbUJBQU8sQ0FBQyw2REFBZTtBQUM5RCxxQ0FBcUMsbUJBQU8sQ0FBQyxvREFBUTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFlO0FBQ2Y7Ozs7Ozs7Ozs7OztBQ2hDYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0Isb0NBQW9DLG1CQUFPLENBQUMsa0RBQU87QUFDbkQsc0NBQXNDLG1CQUFPLENBQUMsMkRBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDZmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLHFDQUFxQyxtQkFBTyxDQUFDLG9EQUFRO0FBQ3JELHNDQUFzQyxtQkFBTyxDQUFDLDJEQUFjO0FBQzVELHVDQUF1QyxtQkFBTyxDQUFDLDZEQUFlO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGlDQUFpQztBQUMzRDtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDak5hO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixvQ0FBb0MsbUJBQU8sQ0FBQyxrREFBTztBQUNuRCxzQ0FBc0MsbUJBQU8sQ0FBQywyREFBYztBQUM1RCx1Q0FBdUMsbUJBQU8sQ0FBQyw2REFBZTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDakNhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixvQ0FBb0MsbUJBQU8sQ0FBQyxrREFBTztBQUNuRCxzQ0FBc0MsbUJBQU8sQ0FBQywyREFBYztBQUM1RCx1Q0FBdUMsbUJBQU8sQ0FBQyw2REFBZTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFlO0FBQ2Y7Ozs7Ozs7Ozs7OztBQ2hEYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0Isb0NBQW9DLG1CQUFPLENBQUMsa0RBQU87QUFDbkQsaURBQWlELG1CQUFPLENBQUMsNEVBQW9CO0FBQzdFLHNDQUFzQyxtQkFBTyxDQUFDLDJEQUFjO0FBQzVELHVDQUF1QyxtQkFBTyxDQUFDLDZEQUFlO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qix3QkFBd0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEZBQTBGLGtCQUFrQjtBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsYUFBYTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBZTtBQUNmOzs7Ozs7Ozs7Ozs7QUMxWmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLHNDQUFzQyxtQkFBTyxDQUFDLHNEQUFTO0FBQ3ZELDBDQUEwQyxtQkFBTyxDQUFDLDhEQUFhO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG1CQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFVBQVU7QUFDbEM7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGVBQWU7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsZ0JBQWdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFlO0FBQ2Y7Ozs7Ozs7Ozs7OztBQ3RWYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0Isc0NBQXNDLG1CQUFPLENBQUMsc0RBQVM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQXVCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFdBQVc7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFNBQVM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixTQUFTO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLHVCQUF1QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQXVCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsVUFBVTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qix1QkFBdUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qix1QkFBdUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFdBQVc7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixXQUFXO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDMVVhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixzQ0FBc0MsbUJBQU8sQ0FBQyxzREFBUztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGFBQWE7QUFDakMsb0JBQW9CLG1CQUFtQjtBQUN2Qyx3QkFBd0IsdUNBQXVDO0FBQy9ELHFCQUFxQixjQUFjO0FBQ25DLHNCQUFzQixvQkFBb0I7QUFDMUMsd0JBQXdCLFdBQVc7QUFDbkMscUJBQXFCLFdBQVc7QUFDaEMsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0EsZ0VBQWdFLFFBQVEsMEJBQTBCLFlBQVk7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFVBQVU7QUFDNUQ7QUFDQSxpQ0FBaUMsVUFBVTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxRQUFRLFlBQVksVUFBVTtBQUM3RTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxXQUFXLEVBQUUsVUFBVTtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDLDJGQUEyRjtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxRQUFRO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELGlCQUFpQjtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsMkJBQTJCLElBQUk7QUFDakcsa0RBQWtELHlCQUF5QjtBQUMzRTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELFFBQVE7QUFDekQ7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLDRDQUE0Qzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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O0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxRQUFRO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdURBQXVELFFBQVE7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsUUFBUTtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSwyQ0FBMkM7QUFDM0MsMkJBQTJCO0FBQzNCO0FBQ0EsK0JBQStCLDZCQUE2QjtBQUM1RDtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQSw2REFBNkQsUUFBUTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QseURBQXlELFFBQVE7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQSx5REFBeUQsUUFBUTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBeUQsUUFBUTtBQUNqRTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsUUFBUTtBQUN6RDtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQSxtREFBbUQsUUFBUTtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsUUFBUTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsUUFBUTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0EsZ0NBQWdDLGdDQUFtQjs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGdCQUFnQixzQ0FBc0Msa0JBQWtCO0FBQ3BGLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsZ0RBQWdELGFBQWE7QUFDN0QsbUJBQW1CLGdDQUFtQjtBQUN0QyxlQUFlLGdDQUFtQjtBQUNsQyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDLFlBQVksZ0NBQW1CO0FBQy9CLGdCQUFnQixnQ0FBbUI7QUFDbkMsZUFBZSxnQ0FBbUI7QUFDbEMsd0JBQXdCLGdDQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQiw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQSxnQ0FBZ0MsZ0NBQW1COztBQUVuRDtBQUNBLGdEQUFnRCxhQUFhO0FBQzdELGdCQUFnQixnQ0FBbUI7QUFDbkMsdUJBQXVCLGdDQUFtQjtBQUMxQyxrQkFBa0IsZ0NBQW1CO0FBQ3JDLFlBQVksZ0NBQW1CO0FBQy9CLGlCQUFpQixnQ0FBbUI7QUFDcEMsZ0JBQWdCLGdDQUFtQjtBQUNuQyxlQUFlLGdDQUFtQjtBQUNsQztBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHVCQUF1QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdUJBQXVCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFCQUFxQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSwwQkFBMEI7QUFDMUIsOEJBQThCO0FBQzlCO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0QsMEJBQTBCO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCwwQkFBMEI7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMEJBQTBCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLDRCQUE0QjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsd0JBQXdCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLHdCQUF3QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsNkJBQTZCO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGlCQUFpQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMkJBQTJCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw2QkFBNkI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsbUJBQW1CO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxjQUFjO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RkFBOEYsY0FBYztBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qiw4QkFBOEI7QUFDOUI7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxjQUFjO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLGFBQWE7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLGFBQWE7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsb0JBQW9CO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELG1FQUFtRTtBQUMvSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQyx1QkFBdUI7QUFDdkIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsU0FBUztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsK0JBQStCO0FBQy9CLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsaUJBQWlCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLE1BQU0sSUFBSSxNQUFNO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxnQkFBZ0IsaUJBQWlCLEVBQUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsc0JBQXNCO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsK0ZBQStGO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxhQUFhO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBLGdDQUFnQyxpQ0FBbUI7O0FBRW5EO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0QsdUJBQXVCLGlDQUFtQjtBQUMxQyxpQkFBaUIsaUNBQW1CO0FBQ3BDLGVBQWUsaUNBQW1CO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFCQUFxQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7Ozs7Ozs7O0FDcGpOQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0QsUUFBUTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0QsUUFBUTtBQUMxRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsU0FBUztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1EQUFtRCxTQUFTO0FBQzVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxlQUFlOztBQUU1RDtBQUNBLENBQUM7QUFDRDs7Ozs7Ozs7Ozs7QUNweUJBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7Ozs7Ozs7Ozs7QUNyVWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsZUFBZTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFFBQVE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFFBQVE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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QUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN0REEsK0dBQStDOzs7Ozs7Ozs7OztBQ0EvQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxlQUFlO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGVBQWU7QUFDMUIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUIsa0JBQWtCO0FBQ2xCLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBLDJDQUEyQyxnQkFBZ0I7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkNBQTJDLGdCQUFnQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Qy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsU0FBUztBQUMvQix1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTO0FBQ2hDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsU0FBUztBQUMvQix1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTO0FBQ2hDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTO0FBQ2hDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGtDQUFrQyw4RkFBOEY7QUFDN0s7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxrREFBa0QsS0FBSyxvQ0FBb0M7QUFDM0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGlDQUFpQztBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLHFCQUFxQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQywrREFBK0QsS0FBSyxvQ0FBb0M7QUFDeEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsaUNBQWlDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx3REFBd0QsSUFBSSxzQ0FBc0M7QUFDbEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0dBQStHO0FBQy9HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGlDQUFpQztBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxpQ0FBaUM7QUFDdEU7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O0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsa0NBQWtDO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUF1RCxZQUFZO0FBQ25FO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsY0FBYztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHdDQUF3QztBQUNoRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxvQkFBb0I7QUFDcEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkNBQTJDLFNBQVM7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBCQUEwQjs7Ozs7Ozs7Ozs7QUN4YTFCLGlCQUFpQixvQkFBb0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsK0hBQW9EO0FBQzdFLFdBQVcsbUJBQU8sQ0FBQyxxREFBUTs7QUFFM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVE7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLFNBQVM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxTQUFTO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDLFNBQVM7QUFDbkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxjQUFjO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxXQUFXO0FBQ1g7O0FBRUEsa0JBQWtCOzs7Ozs7Ozs7OztBQzVabEIsaUJBQWlCLG9CQUFvQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLGNBQWM7O0FBRWQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7O0FBRVosa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJDQUEyQzs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EseUJBQXlCLGlGQUFpRixJQUFJO0FBQzlHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUIsaUZBQWlGLElBQUk7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHdCQUF3QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBZ0MsYUFBYTtBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGtDQUFrQztBQUM5RDtBQUNBOztBQUVB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QUFJO0FBQ3ZCLGFBQWEsbUJBQU8sQ0FBQyxrQkFBTTs7QUFFM0I7O0FBRUEsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBFQUEwRSxnRUFBZ0U7O0FBRTFJLG9DQUFvQztBQUNwQztBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGVBQWU7QUFDZjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FB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QUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUM5UkEsMkJBQTJCLG1CQUFPLENBQUMsMkZBQTRCO0FBQy9ELG9CQUFvQixtQkFBTyxDQUFDLDJFQUFvQjs7QUFFaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQzNEQSxZQUFZLG1CQUFPLENBQUMsd0NBQUs7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNkQSxZQUFZLG1CQUFPLENBQUMsd0NBQUs7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEVBQTBFLHFCQUFxQjtBQUMvRjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEseUNBQXlDLE9BQU87QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDL0ZBLGFBQWEsbUJBQU8sQ0FBQyxzQkFBUTs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHFDQUFxQztBQUNyQyw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEc0QztBQUNMO0FBRXZDLG1EQUFtRDtBQUNuRCxTQUFTLFVBQVUsQ0FBQyxJQUFZLEVBQUUsYUFBc0I7SUFDdEQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0QixPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBQ0QsUUFBUSxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUMxQixLQUFLLEdBQUcsQ0FBQztRQUNULEtBQUssT0FBTyxDQUFDO1FBQ2IsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLFVBQVUsQ0FBQztRQUNoQixLQUFLLElBQUk7WUFDUCxPQUFPLEtBQUssQ0FBQztRQUNmLEtBQUssR0FBRyxDQUFDO1FBQ1QsS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssU0FBUyxDQUFDO1FBQ2YsS0FBSyxLQUFLO1lBQ1IsT0FBTyxJQUFJLENBQUM7UUFDZDtZQUNFLE9BQU8sYUFBYSxDQUFDO0lBQ3pCLENBQUM7QUFDSCxDQUFDO0FBT0QsOENBQThDO0FBQzlDLFNBQVMsZUFBZSxDQUFDLElBQVk7SUFDbkMsUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztRQUMzQixLQUFLLFNBQVM7WUFDWixPQUFPO2dCQUNMLE9BQU8sRUFBRSxTQUFTO2dCQUNsQixjQUFjLEVBQUUsa0JBQWtCO2FBQ25DLENBQUM7UUFDSixLQUFLLFFBQVE7WUFDWCxPQUFPO2dCQUNMLE9BQU8sRUFBRSxRQUFRO2dCQUNqQixjQUFjLEVBQUUsK0JBQStCO2FBQ2hELENBQUM7UUFDSixLQUFLLFVBQVU7WUFDYixPQUFPO2dCQUNMLE9BQU8sRUFBRSxRQUFRO2dCQUNqQixjQUFjLEVBQUUsbUJBQW1CO2FBQ3BDLENBQUM7UUFDSjtZQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLElBQUksRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztBQUNILENBQUM7QUFFRCw0Q0FBNEM7QUFDNUMsU0FBUyxNQUFNLENBQUMsS0FBYTtJQUMzQixnREFBZ0Q7SUFDaEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSwyREFBOEIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsbURBQW1EO0FBQ25ELHlDQUF5QztBQUN6Qyw4Q0FBTztLQUNKLFdBQVcsQ0FBQyxxQ0FBcUMsQ0FBQztLQUNsRCxNQUFNLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7S0FDakUsTUFBTSxDQUFDLDJCQUEyQixFQUFFLHNCQUFzQixFQUFFLFdBQVcsQ0FBQztLQUN4RSxTQUFTLENBQUMsSUFBSSw2Q0FBTSxDQUFDLHlCQUF5QixFQUFFLG1DQUFtQyxDQUFDO0tBQ2xGLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FDMUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUNwQjtLQUNBLE1BQU0sQ0FBQyxjQUFjLEVBQUUsdUVBQXVFLENBQUM7S0FDL0YsU0FBUyxDQUFDLElBQUksNkNBQU0sQ0FBQywyQkFBMkIsRUFBRSwwREFBMEQsQ0FBQztLQUMzRyxTQUFTLENBQUMsTUFBTSxDQUFDO0tBQ2pCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDWjtLQUNBLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxtRUFBbUUsQ0FBQztLQUM3RixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRXZCLHNDQUFzQztBQUN0QyxNQUFNLE9BQU8sR0FBRyw4Q0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0FBRS9CLE1BQU0sc0JBQXNCLEdBQUc7SUFDN0IsMkVBQTJFO0lBQzNFLFFBQVEsRUFBRSxlQUErQjtJQUN6QyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTTtJQUN6QixpQkFBaUIsRUFBRSxJQUFJO0lBQ3ZCLE9BQU8sRUFBRSxLQUFLO0lBQ2QsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLO0lBQ3JCLGVBQWUsRUFBRTtRQUNmLEtBQUssRUFBRSxJQUFJO1FBQ1gsTUFBTSxFQUFFLEdBQUc7S0FDWjtJQUNELEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7Q0FDcEM7QUFFc0Q7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyR2hELE1BQU0sbUJBQW1CO0lBQ1gsSUFBSSxDQUFPO0lBQ1gsYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDOUQsYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDMUQsYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDMUQseUJBQXlCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUNsRixZQUFZLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUV4RixZQUFZLElBQVU7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBZ0I7UUFDL0IsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQWdCO1FBQy9CLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFnQjtRQUMvQixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxRQUFnQjtRQUMzQyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU07UUFDUixNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvQk0sTUFBTSxlQUFlO0lBQ1AsSUFBSSxDQUFPO0lBQ1gsYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDMUQsV0FBVyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFFaEYsWUFBWSxJQUFVO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQWdCO1FBQ3hCLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiTSxNQUFNLG9CQUFvQjtJQUNaLElBQUksQ0FBTztJQUNYLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ25FLFdBQVcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ3ZFLGNBQWMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQzdFLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBRS9GLFlBQVksSUFBVTtRQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDWixNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWE7UUFDZixNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQjtRQUNsQixNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6Qk0sTUFBTSxvQkFBb0I7SUFDWixJQUFJLENBQU87SUFDWCxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMxRCx5QkFBeUIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ2xGLFdBQVcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ2xFLFVBQVUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBRWpGLFlBQVksSUFBVTtRQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFnQjtRQUMvQixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxRQUFnQjtRQUMzQyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU87UUFDVCxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0Qk0sTUFBTSxXQUFXO0lBQ0gsSUFBSSxDQUFPO0lBQ1gsWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDL0QsZ0JBQWdCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUMvRCxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUM3RCxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUM3RCxZQUFZLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMvRCxTQUFTLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUUxRSxZQUFZLElBQVU7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZO1FBQ2QsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0I7UUFDbEIsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDYixNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDYixNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVk7UUFDZCxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVM7UUFDWCxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0NBRUo7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQ00sTUFBTSxTQUFTO0lBQ0QsSUFBSSxDQUFPO0lBQ1gsYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDbkUsZ0JBQWdCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUUvRixZQUFZLElBQVU7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjO1FBQ2hCLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWTtRQUNkLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUMsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xCbUI7QUFDSTtBQUU0QztBQUVJO0FBQ2hDO0FBRXVDO0FBR2pCO0FBQ1M7QUFDbkI7QUFDSjtBQUNtQjtBQUNKO0FBRS9ELElBQUksSUFBVSxDQUFDO0FBQ2YsSUFBSSxPQUFnQixDQUFDO0FBQ3JCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztBQUVuQiw2REFBNkQ7QUFDN0QsS0FBSyxVQUFVLEVBQUUsQ0FBQyxLQUFhLEVBQUUsSUFBeUIsRUFBRSxPQUFnQjtJQUMxRSw2Q0FBTSxDQUFDLEtBQUs7SUFDVixpREFBaUQ7SUFDakQsRUFBRSxPQUFPLEVBQUUsT0FBTyxJQUFJLEtBQUssRUFBRSxFQUM3QixLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDVixJQUFJLENBQUM7WUFDSCxJQUFJLE1BQU07Z0JBQ1IsQ0FBQyxDQUFDLElBQUksRUFBRTs7Z0JBRVIsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxtREFBTyxDQUFDLFFBQVE7Z0JBQUUsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNyQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULGlDQUFpQztnQkFDakMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDO2dCQUNsQixJQUFJLENBQUMsb0RBQWEsQ0FBQyxHQUFHLENBQUM7b0JBQUUsbURBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFM0MsK0JBQStCO2dCQUMvQixNQUFNLElBQUksR0FBRyxnREFBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQy9DLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsQyx1REFBZ0IsQ0FBQyxJQUFJLEdBQUcsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pDLENBQUM7WUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFBQSxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUcsMERBQVUsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkQsTUFBTSxTQUFTLEdBQUcsMERBQVUsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbEQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUksWUFBWSxDQUFDO0FBRS9ELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUM3QixNQUFNLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDO0FBRWxELG1EQUFRLENBQUMsWUFBWSxFQUFFO0lBQ3JCLGlEQUFNLENBQUMsS0FBSztRQUNWLE9BQU8sR0FBRyxNQUFNLDZEQUFnQixDQUFDLGtFQUFzQixDQUFDLENBQUM7UUFDekQsSUFBSSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsbURBQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDaEYsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUMsQ0FBQztJQUVILGdEQUFLLENBQUMsS0FBSztRQUNULE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hCLENBQUMsQ0FBQztJQUVGLEVBQUUsQ0FBQyw4QkFBOEIsRUFBRSxLQUFLO1FBQ3RDLG1FQUFnQixDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG1CQUFtQixFQUFFLEtBQUs7UUFDM0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxzRUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLE1BQU0sV0FBVyxDQUFDLEtBQUssQ0FBQyxtREFBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEtBQUs7UUFDckQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLCtFQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXhELElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBRTVCLElBQUksWUFBWSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzVCLE1BQU0sZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEMsQ0FBQzthQUNJLENBQUM7WUFDSixNQUFNLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDNUMsQ0FBQztRQUNELGtEQUFrRDtRQUNsRCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVoRSxtREFBbUQ7UUFDbkQsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlDQUFpQyxFQUFFLEtBQUs7UUFDekMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkQsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUUsS0FBSztRQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLDREQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSx3REFBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSw0RUFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV4RCxNQUFNLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMxQixNQUFNLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQixNQUFNLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxtREFBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsbURBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRSxNQUFNLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWpDLHFFQUFxRTtRQUNyRSw0Q0FBNEM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMEJBQTBCLEVBQUUsS0FBSztRQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLHdEQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxlQUFlLEdBQUcsSUFBSSx5RUFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxNQUFNLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM3QixNQUFNLGVBQWUsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN0RCxNQUFNLGVBQWUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsTUFBTSxlQUFlLENBQUMsWUFBWSxDQUFDLG1EQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckQsTUFBTSxlQUFlLENBQUMsd0JBQXdCLENBQUMsbURBQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRSxNQUFNLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksU0FBUyxFQUFFLENBQUM7UUFDZCxFQUFFLENBQUMsd0JBQXdCLEVBQUUsS0FBSztZQUVoQyxvREFBb0Q7WUFDcEQsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDakUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDakUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEUsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0QsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFFbkUseURBQXlEO1lBQ3pELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRXhELGdDQUFnQztZQUNoQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMvRSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMvRCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxFQUFFLENBQUMsa0NBQWtDLEVBQUUsS0FBSztRQUMxQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuRCxvRUFBb0U7UUFDcEUsa0ZBQWtGO1FBQ2xGLDRDQUE0QztRQUM1QyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsdUNBQXVDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyRSxDQUFDLENBQUMsQ0FBQztJQUVILHNFQUFzRTtJQUN0RSxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMxQixFQUFFLENBQUMsMkJBQTJCLEVBQUUsS0FBSztZQUNuQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6RCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxRCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxLQUFLO1lBQ3BDLE1BQU0sSUFBSTtpQkFDUCxPQUFPLENBQUMsaUNBQWlDLENBQUM7aUJBQzFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztpQkFDMUIsSUFBSSxFQUFFLENBQUM7UUFDWixDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNyQixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7O0FDakxILGNBQWMsbUJBQU8sQ0FBQyxnREFBUztBQUMvQixVQUFVLG1CQUFPLENBQUMsK0RBQWE7QUFDL0Isa0JBQWtCLG1CQUFPLENBQUMsNkVBQW9COztBQUU5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGFBQWE7QUFDYixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0ZBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLGtCQUFrQjtBQUMvQjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsa0JBQWtCO0FBQy9CO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FB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UUFBUTtBQUNyQixjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07O0FBRU47QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixhQUFhO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msb0JBQW9CO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsMEJBQTBCLGFBQWE7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWMsOEJBQThCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLEtBQUs7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEdBQUc7QUFDaEIsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsR0FBRztBQUNoQixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxpQkFBaUI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEdBQUc7QUFDaEIsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxrQkFBa0I7QUFDM0UsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELE9BQU87QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFF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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzMkNZO0FBQ1o7QUFDQTtBQUNBLGlDQUFpQyxRQUFRO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNQWTtBQUNaOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLElBQUk7QUFDSiwwQ0FBMEMsT0FBTztBQUNqRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3Q0FBd0MsT0FBTztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QyxPQUFPO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDLGlCQUFpQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0RBQW9ELGlCQUFpQjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQywwQkFBMEI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQ0FBc0MsMEJBQTBCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixnQkFBZ0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsZ0JBQWdCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUEsa0JBQWtCLGlCQUFpQjtBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQSxnQ0FBZ0MsaUJBQWlCO0FBQ2pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0MsaUJBQWlCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNDQUFzQyxpQkFBaUI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyw2QkFBNkI7QUFDbkU7QUFDQTtBQUNBLFNBQVMsMkJBQTJCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELDJCQUEyQjtBQUMzRTtBQUNBO0FBQ0EsU0FBUyw2QkFBNkI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0NBQXNDLDhCQUE4QjtBQUNwRTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCLDJCQUEyQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixrQkFBa0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGlCQUFpQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRSxtQkFBTyxDQUFDLHlEQUFlO0FBQ3pCLEVBQUU7Ozs7Ozs7Ozs7O0FDemFGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQ1JBLFNBQVMsbUJBQU8sQ0FBQyxjQUFJO0FBQ3JCLFdBQVcsbUJBQU8sQ0FBQyxrQkFBTTtBQUN6QixnQkFBZ0IsbUJBQU8sQ0FBQyxvREFBVztBQUNuQyxZQUFZLG1CQUFPLENBQUMsMERBQWM7QUFDbEMsV0FBVyxtQkFBTyxDQUFDLGtCQUFNO0FBQ3pCLG1CQUFtQiwwREFBOEI7QUFDakQsZ0JBQWdCLHVEQUEyQjtBQUMzQyxrQkFBa0IseURBQTZCO0FBQy9DLGVBQWUsc0RBQTBCOztBQUV6QyxZQUFZO0FBQ1osY0FBYztBQUNkLGtCQUFrQjtBQUNsQiw4QkFBOEI7QUFDOUIseUJBQXlCO0FBQ3pCLHdCQUF3QjtBQUN4QixlQUFlO0FBQ2YsYUFBYTtBQUNiLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxnQkFBZ0I7QUFDN0Q7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELHNCQUFzQjtBQUN6RTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFFBQVE7QUFDL0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDhCQUE4QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDhCQUE4QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekIscUNBQXFDO0FBQ3JDLHdDQUF3Qzs7QUFFeEM7QUFDQSxrQ0FBa0M7QUFDbEMsaUNBQWlDO0FBQ2pDLGdDQUFnQzs7QUFFaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsK0JBQStCO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyx3Q0FBd0M7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwrRUFBK0UsaUVBQWlFLEVBQUU7QUFDbEo7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0Esd0JBQXdCLFNBQVM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzN4QkE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUSxVQUFVO0FBQzFDLDhEQUE4RDtBQUM5RCw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRSxZQUFZO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxPQUFPO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFdBQVc7QUFDN0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGNBQWMsU0FBUztBQUN2Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWMsUUFBUTtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixjQUFjLFNBQVM7QUFDdkI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGNBQWMsU0FBUztBQUN2Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxR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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBLFlBQVksd0JBQXdCO0FBQ3BDLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQix1QkFBdUI7QUFDbEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsK0JBQStCLElBQUk7QUFDaEQ7QUFDQSw4QkFBOEIsTUFBTTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYywrQkFBK0IsSUFBSTtBQUNqRDtBQUNBLDhCQUE4QixNQUFNO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQyxrQkFBa0I7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQyxrQkFBa0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsK0NBQStDLElBQUk7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksK0JBQStCLElBQUk7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsVUFBVTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFVBQVU7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix5Q0FBeUM7QUFDaEU7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsa0JBQWtCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsdUJBQXVCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQywwREFBMEQ7O0FBRTNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsMERBQTBELE9BQU87QUFDakU7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0EsaURBQWlELEdBQUc7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msb0JBQW9CO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHlCQUF5QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxrQkFBa0I7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDdUQ7QUFDRTtBQUNnQjtBQUNoQjtBQUNkO0FBQ2E7QUFDTjtBQUNFO0FBQ1k7QUFDaEU7QUFDQTtBQUNBO0FBQ08sNkJBQTZCLGlFQUFZO0FBQ2hEO0FBQ0EsK0JBQStCLHdFQUFtQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLCtEQUFlO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGFBQWEsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGFBQWEsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGFBQWEsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGFBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsYUFBYTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUMsdUNBQXVDLFNBQVM7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUMsdUNBQXVDLFNBQVM7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsR0FBRyxPQUFPO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLEdBQUcsT0FBTztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGVBQWUsT0FBTztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGVBQWUsT0FBTztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFEQUFxRCxlQUFlLFdBQVc7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxxREFBcUQsZUFBZSxXQUFXO0FBQy9FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EscURBQXFELGVBQWUsV0FBVztBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGFBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsYUFBYTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLDRDQUFLO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGNBQWMsVUFBVTtBQUN4QjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUZBQW1GO0FBQ25GO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUtFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdNRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpREFBaUQ7O0FBRWpEO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDLG9FQUFvRTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHVCQUF1QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHVCQUF1QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFLFVBQVU7QUFDcEY7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLGtCQUFrQjtBQUNsQixVQUFVO0FBQ1Y7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUNBQXVDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix5Q0FBeUM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsdUJBQXVCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsS0FBSyxFQUFFLEVBQWM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix3Q0FBd0M7QUFDNUQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRkFBa0Ysb0JBQW9CO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixjQUFjO0FBQ2QsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsdUJBQXVCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLElBQUk7QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsdUJBQXVCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQSxzQkFBc0IsWUFBWTtBQUNsQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQix1QkFBdUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHVCQUF1QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsOEJBQThCLHNCQUFzQjtBQUNwRDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix1QkFBdUI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHVCQUF1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V0FDQTtXQUNBOzs7OztXQ1BBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRUFBRTtXQUNGOzs7OztXQ1JBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7Ozs7O1dDSkE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7OztXQ05BO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7Ozs7O1dDSkE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsZ0JBQWdCLHFCQUFxQjtXQUNyQzs7V0FFQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGFBQWE7V0FDYjtXQUNBLElBQUk7V0FDSjtXQUNBOztXQUVBOztXQUVBOztXQUVBOzs7OztVRXJDQTtVQUNBO1VBQ0E7VUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvbm9kZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2FzeW5jaWZ5LWhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9jb250ZXh0LWFzeW5jaWZ5LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvY29udGV4dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2RlYnVnLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvZGVmZXJyZWQtcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2Vycm9ycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2VzbUhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9nZW5lcmF0ZWQvZW1zY3JpcHRlbi1tb2R1bGUuV0FTTV9SRUxFQVNFX1NZTkMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9nZW5lcmF0ZWQvZmZpLldBU01fUkVMRUFTRV9TWU5DLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9saWZldGltZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L21lbW9yeS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L21vZHVsZS1hc3luY2lmeS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L21vZHVsZS10ZXN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvbW9kdWxlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvcnVudGltZS1hc3luY2lmeS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L3J1bnRpbWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC90eXBlcy1mZmkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC90eXBlcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L3ZhcmlhbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3Qvdm0taW50ZXJmYWNlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hZ2VudC1iYXNlL2Rpc3QvaGVscGVycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYWdlbnQtYmFzZS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hbnNpLXJlZ2V4L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hbnNpLXN0eWxlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi9iYWJlbC1jb3JlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2JhYmVsLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2NvcmUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvZXMtcHJvcG9zYWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2VzMjAyMC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi9lczYuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvZXM3LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2VzcHJpbWEuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvZmxvdy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi9qc3guanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvdHlwZS1hbm5vdGF0aW9ucy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi90eXBlc2NyaXB0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZm9yay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2dlbi9uYW1lZFR5cGVzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvbGliL2VxdWl2LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvbGliL25vZGUtcGF0aC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2xpYi9wYXRoLXZpc2l0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9saWIvcGF0aC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2xpYi9zY29wZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2xpYi9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9saWIvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9tYWluLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iNGEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L0NsaWVudC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvRmlsZUluZm8uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L0Z0cENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L1Byb2dyZXNzVHJhY2tlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvU3RyaW5nRW5jb2RpbmcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L1N0cmluZ1dyaXRlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L25ldFV0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC9wYXJzZUNvbnRyb2xSZXNwb25zZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvcGFyc2VMaXN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC9wYXJzZUxpc3RET1MuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L3BhcnNlTGlzdE1MU0QuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L3BhcnNlTGlzdFVuaXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L3RyYW5zZmVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9idWZmZXItY3JjMzIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2J1ZmZlcnV0aWwvZmFsbGJhY2suanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2J1ZmZlcnV0aWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvY29udmVyc2lvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvcm91dGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbG9yLW5hbWUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RhdGEtdXJpLXRvLWJ1ZmZlci9kaXN0L2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGF0YS11cmktdG8tYnVmZmVyL2Rpc3Qvbm9kZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9jb21tb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RlZ2VuZXJhdG9yL2Rpc3QvY29tcGlsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGVnZW5lcmF0b3IvZGlzdC9kZWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGVnZW5lcmF0b3IvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZW1vamktcmVnZXgvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VuZC1vZi1zdHJlYW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzY2FsYWRlL3N5bmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzY29kZWdlbi9lc2NvZGVnZW4uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzcHJpbWEvZGlzdC9lc3ByaW1hLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9lc3RyYXZlcnNlL2VzdHJhdmVyc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzdXRpbHMvbGliL2FzdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZXN1dGlscy9saWIvY29kZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZXN1dGlscy9saWIva2V5d29yZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZXN1dGlscy9saWIvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2V4dHJhY3QtemlwL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mYXN0LWZpZm8vZml4ZWQtc2l6ZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZmFzdC1maWZvL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mZC1zbGljZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9jb3B5L2NvcHktc3luYy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2NvcHkvY29weS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2NvcHkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9lbXB0eS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2Vuc3VyZS9maWxlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvZW5zdXJlL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvZW5zdXJlL2xpbmsuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9lbnN1cmUvc3ltbGluay1wYXRocy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2Vuc3VyZS9zeW1saW5rLXR5cGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9lbnN1cmUvc3ltbGluay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2ZzL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9qc29uL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvanNvbi9qc29uZmlsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2pzb24vb3V0cHV0LWpzb24tc3luYy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2pzb24vb3V0cHV0LWpzb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9ta2RpcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9ta2RpcnMvbWFrZS1kaXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9ta2RpcnMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9tb3ZlL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvbW92ZS9tb3ZlLXN5bmMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9tb3ZlL21vdmUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9vdXRwdXQtZmlsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL3BhdGgtZXhpc3RzL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvcmVtb3ZlL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvdXRpbC9zdGF0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvdXRpbC91dGltZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC1jYWxsZXItZmlsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXN0cmVhbS9idWZmZXItc3RyZWFtLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtc3RyZWFtL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtdXJpL2Rpc3QvZGF0YS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXVyaS9kaXN0L2ZpbGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC11cmkvZGlzdC9mdHAuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC11cmkvZGlzdC9odHRwLWVycm9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtdXJpL2Rpc3QvaHR0cC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXVyaS9kaXN0L2h0dHBzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtdXJpL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC11cmkvZGlzdC9ub3Rmb3VuZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXVyaS9kaXN0L25vdG1vZGlmaWVkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9ncmFjZWZ1bC1mcy9jbG9uZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ3JhY2VmdWwtZnMvZ3JhY2VmdWwtZnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dyYWNlZnVsLWZzL2xlZ2FjeS1zdHJlYW1zLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9ncmFjZWZ1bC1mcy9wb2x5ZmlsbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2hhcy1mbGFnL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9odHRwLXByb3h5LWFnZW50L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2h0dHBzLXByb3h5LWFnZW50L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2h0dHBzLXByb3h5LWFnZW50L2Rpc3QvcGFyc2UtcHJveHktcmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2lwLWFkZHJlc3MvZGlzdC9hZGRyZXNzLWVycm9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvY29tbW9uLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvaXAtYWRkcmVzcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvaXAtYWRkcmVzcy9kaXN0L2lwdjQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2lwLWFkZHJlc3MvZGlzdC9pcHY2LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvdjQvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvdjYvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvdjYvaGVscGVycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvaXAtYWRkcmVzcy9kaXN0L3Y2L3JlZ3VsYXItZXhwcmVzc2lvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9qc2JuL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9qc29uZmlsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvanNvbmZpbGUvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9uZXRtYXNrL2xpYi9uZXRtYXNrLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9ub2RlLWd5cC1idWlsZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvbm9kZS1neXAtYnVpbGQvbm9kZS1neXAtYnVpbGQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL29uY2Uvb25jZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXByb3h5LWFnZW50L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2RhdGVSYW5nZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvZG5zRG9tYWluSXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2Ruc0RvbWFpbkxldmVscy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvZG5zUmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2lwLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wYWMtcmVzb2x2ZXIvZGlzdC9pc0luTmV0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wYWMtcmVzb2x2ZXIvZGlzdC9pc1BsYWluSG9zdE5hbWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2lzUmVzb2x2YWJsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvbG9jYWxIb3N0T3JEb21haW5Jcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvbXlJcEFkZHJlc3MuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L3NoRXhwTWF0Y2guanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L3RpbWVSYW5nZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvdXRpbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3Qvd2Vla2RheVJhbmdlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wZW5kL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wcm9ncmVzcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHJvZ3Jlc3MvbGliL25vZGUtcHJvZ3Jlc3MuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Byb3h5LWFnZW50L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Byb3h5LWZyb20tZW52L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdW1wL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9xdWV1ZS10aWNrL3Byb2Nlc3MtbmV4dC10aWNrLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9xdWV1ZS10aWNrL3F1ZXVlLW1pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcmVxdWlyZS1kaXJlY3RvcnkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9jbGFzc2VzL2NvbXBhcmF0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9jbGFzc2VzL3JhbmdlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvY2xhc3Nlcy9zZW12ZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY2xlYW4uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY21wLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2NvZXJjZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLWJ1aWxkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUtbG9vc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9kaWZmLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2VxLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2d0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2d0ZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9pbmMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvbHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvbHRlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL21ham9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL21pbm9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL25lcS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9wYXJzZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9wYXRjaC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9wcmVyZWxlYXNlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3Jjb21wYXJlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3Jzb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3NhdGlzZmllcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9zb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3ZhbGlkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9kZWJ1Zy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL2lkZW50aWZpZXJzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvcGFyc2Utb3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL3JlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvbm9kZV9tb2R1bGVzL2xydS1jYWNoZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9ndHIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvaW50ZXJzZWN0cy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9sdHIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvbWF4LXNhdGlzZnlpbmcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvbWluLXNhdGlzZnlpbmcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvb3V0c2lkZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9zaW1wbGlmeS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9zdWJzZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvdG8tY29tcGFyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvdmFsaWQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NtYXJ0LWJ1ZmZlci9idWlsZC9zbWFydGJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc21hcnQtYnVmZmVyL2J1aWxkL3V0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb2Nrcy1wcm94eS1hZ2VudC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb2Nrcy9idWlsZC9jbGllbnQvc29ja3NjbGllbnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvY2tzL2J1aWxkL2NvbW1vbi9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvY2tzL2J1aWxkL2NvbW1vbi9oZWxwZXJzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb2Nrcy9idWlsZC9jb21tb24vcmVjZWl2ZWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc29ja3MvYnVpbGQvY29tbW9uL3V0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvY2tzL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2Jhc2U2NC12bHEuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2Jhc2U2NC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvbWFwcGluZy1saXN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9xdWljay1zb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwLWNvbnN1bWVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW5vZGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3V0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvc291cmNlLW1hcC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc3ByaW50Zi1qcy9zcmMvc3ByaW50Zi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc3RyZWFteC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc3RyaW5nLXdpZHRoL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zdHJpcC1hbnNpL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zdXBwb3J0cy1jb2xvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGFyLWZzL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGFyLXN0cmVhbS9leHRyYWN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL2hlYWRlcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Rhci1zdHJlYW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Rhci1zdHJlYW0vcGFjay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGV4dC1kZWNvZGVyL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90ZXh0LWRlY29kZXIvbGliL3Bhc3MtdGhyb3VnaC1kZWNvZGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90ZXh0LWRlY29kZXIvbGliL3V0ZjgtZGVjb2Rlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGhyb3VnaC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9zcmMvY29uZmlndXJhdGlvbi50cyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9zcmMvcGFnZXMvY3JlYXRlLXVzZXItcGFnZS50cyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9zcmMvcGFnZXMvbG9naW4tYXMtcm9vdC1wYWdlLnRzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL3NyYy9wYWdlcy9wcm9kdWN0LXNlbGVjdGlvbi1wYWdlLnRzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL3NyYy9wYWdlcy9yb290LXBhc3N3b3JkLXBhZ2UudHMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vc3JjL3BhZ2VzL3NpZGViYXItcGFnZS50cyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9zcmMvcGFnZXMvdXNlcnMtcGFnZS50cyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9zcmMvdGVzdHMvZGVmYXVsdF9pbnN0YWxsYXRpb24udHMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3VuYnppcDItc3RyZWFtL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy91bmJ6aXAyLXN0cmVhbS9saWIvYml0X2l0ZXJhdG9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy91bmJ6aXAyLXN0cmVhbS9saWIvYnppcDIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3VuaXZlcnNhbGlmeS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdXRmLTgtdmFsaWRhdGUvZmFsbGJhY2suanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3V0Zi04LXZhbGlkYXRlL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cmFwLWFuc2kvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dyYXBweS93cmFwcHkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9idWZmZXItdXRpbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL2V2ZW50LXRhcmdldC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL2V4dGVuc2lvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL2xpbWl0ZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9wZXJtZXNzYWdlLWRlZmxhdGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9yZWNlaXZlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL3NlbmRlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL3N0cmVhbS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL3N1YnByb3RvY29sLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cy9saWIvdmFsaWRhdGlvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL3dlYnNvY2tldC1zZXJ2ZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi93ZWJzb2NrZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhbGxpc3QvaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhbGxpc3QveWFsbGlzdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkLyBzeW5jIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC8gc3luYyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWF1emwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJhc3NlcnRcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImJ1ZmZlclwiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiY2hpbGRfcHJvY2Vzc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiY29uc3RhbnRzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImRuc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiZXZlbnRzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJmc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiZnMvcHJvbWlzZXNcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImh0dHBcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImh0dHBzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJuZXRcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm5vZGU6YXNzZXJ0L3N0cmljdFwiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwibm9kZTpjaGlsZF9wcm9jZXNzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJub2RlOmV2ZW50c1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwibm9kZTpmc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwibm9kZTpwYXRoXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJub2RlOnByb2Nlc3NcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm5vZGU6dGVzdFwiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwib3NcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInBhdGhcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInByb2Nlc3NcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInJlYWRsaW5lXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJzdHJlYW1cIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInRsc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwidHR5XCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJ1cmxcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInV0aWxcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInpsaWJcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY2xpdWkvYnVpbGQvaW5kZXguY2pzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jb21tYW5kZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvYXJndW1lbnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvY29tbWFuZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY29tbWFuZGVyL2xpYi9lcnJvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY29tbWFuZGVyL2xpYi9oZWxwLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jb21tYW5kZXIvbGliL29wdGlvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY29tbWFuZGVyL2xpYi9zdWdnZXN0U2ltaWxhci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvbHJ1LWNhY2hlL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95MThuL2J1aWxkL2luZGV4LmNqcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkL2luZGV4LmNqcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvaW5kZXguY2pzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vQ0xJLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9icm93c2VyLWRhdGEvYnJvd3Nlci1kYXRhLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vYnJvd3Nlci1kYXRhL2Nocm9tZS1oZWFkbGVzcy1zaGVsbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2Jyb3dzZXItZGF0YS9jaHJvbWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9icm93c2VyLWRhdGEvY2hyb21lZHJpdmVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vYnJvd3Nlci1kYXRhL2Nocm9taXVtLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vYnJvd3Nlci1kYXRhL2ZpcmVmb3guanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9icm93c2VyLWRhdGEvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9kZWJ1Zy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2RldGVjdFBsYXRmb3JtLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vZmlsZVV0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9odHRwVXRpbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2luc3RhbGwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9sYXVuY2guanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9tYWluLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jbGl1aS9idWlsZC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NsaXVpL2J1aWxkL2xpYi9zdHJpbmctdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NsaXVpL2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY29tbWFuZGVyL2VzbS5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzY2FsYWRlL3N5bmMvaW5kZXgubWpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvQnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0Jyb3dzZXJDb250ZXh0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvQ0RQU2Vzc2lvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0RpYWxvZy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0VsZW1lbnRIYW5kbGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9FbGVtZW50SGFuZGxlU3ltYm9sLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvRW52aXJvbm1lbnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9GcmFtZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0hUVFBSZXF1ZXN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvSFRUUFJlc3BvbnNlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvSW5wdXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9KU0hhbmRsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL1BhZ2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9SZWFsbS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL1RhcmdldC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL1dlYldvcmtlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL2FwaS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL2xvY2F0b3JzL2xvY2F0b3JzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9iaWRpL0Jyb3dzZXJDb25uZWN0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9BY2Nlc3NpYmlsaXR5LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQXJpYVF1ZXJ5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0JpbmRpbmcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9Ccm93c2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQnJvd3NlckNvbm5lY3Rvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0Jyb3dzZXJDb250ZXh0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQ0RQU2Vzc2lvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0NkcFByZWxvYWRTY3JpcHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9DaHJvbWVUYXJnZXRNYW5hZ2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQ29ubmVjdGlvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0NvdmVyYWdlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRGV2aWNlUmVxdWVzdFByb21wdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0RpYWxvZy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0VsZW1lbnRIYW5kbGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9FbXVsYXRpb25NYW5hZ2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRXhlY3V0aW9uQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0V4dGVuc2lvblRyYW5zcG9ydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0ZpcmVmb3hUYXJnZXRNYW5hZ2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRnJhbWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9GcmFtZU1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9GcmFtZU1hbmFnZXJFdmVudHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9GcmFtZVRyZWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9IVFRQUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0hUVFBSZXNwb25zZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0lucHV0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvSXNvbGF0ZWRXb3JsZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0lzb2xhdGVkV29ybGRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvSlNIYW5kbGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9MaWZlY3ljbGVXYXRjaGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvTmV0d29ya0V2ZW50TWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL05ldHdvcmtNYW5hZ2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvUGFnZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL1ByZWRlZmluZWROZXR3b3JrQ29uZGl0aW9ucy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL1RhcmdldC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL1RhcmdldE1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9UcmFjaW5nLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvV2ViV29ya2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvY2RwLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9Ccm93c2VyQ29ubmVjdG9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0NTU1F1ZXJ5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0NhbGxiYWNrUmVnaXN0cnkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9Db25maWd1cmF0aW9uLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQ29ubmVjdE9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9Db25uZWN0aW9uVHJhbnNwb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQ29uc29sZU1lc3NhZ2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9Db29raWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9DdXN0b21RdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9EZWJ1Zy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0RldmljZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0Vycm9ycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0V2ZW50RW1pdHRlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0ZpbGVDaG9vc2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vR2V0UXVlcnlIYW5kbGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vSGFuZGxlSXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9MYXp5QXJnLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vTmV0d29ya01hbmFnZXJFdmVudHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9QREZPcHRpb25zLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vUFF1ZXJ5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1BTZWxlY3RvclBhcnNlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1BpZXJjZVF1ZXJ5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1Byb2R1Y3QuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9QdXBwZXRlZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9RdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9TY3JpcHRJbmplY3Rvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1NlY3VyaXR5RGV0YWlscy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1Rhc2tRdWV1ZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1RleHRRdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9UaW1lb3V0U2V0dGluZ3MuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9VU0tleWJvYXJkTGF5b3V0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vVmlld3BvcnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9XYWl0VGFzay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1hQYXRoUXVlcnlIYW5kbGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vY29tbW9uLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vdHlwZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi91dGlsLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9lbnZpcm9ubWVudC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvZ2VuZXJhdGVkL2luamVjdGVkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9nZW5lcmF0ZWQvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvaW5kZXgtYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL25vZGUvQ2hyb21lTGF1bmNoZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL25vZGUvRmlyZWZveExhdW5jaGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL0xhdW5jaE9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL25vZGUvTm9kZVdlYlNvY2tldFRyYW5zcG9ydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvbm9kZS9QaXBlVHJhbnNwb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL1Byb2R1Y3RMYXVuY2hlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvbm9kZS9QdXBwZXRlZXJOb2RlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL1NjcmVlblJlY29yZGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL25vZGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL25vZGUvdXRpbC9mcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvcHVwcGV0ZWVyLWNvcmUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3JldmlzaW9ucy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvdXRpbC9Bc3luY0l0ZXJhYmxlVXRpbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvdXRpbC9EZWZlcnJlZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvdXRpbC9FcnJvckxpa2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvTXV0ZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvYXNzZXJ0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci91dGlsL2RlY29yYXRvcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvZGlzcG9zYWJsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvdXRpbC91dGlsLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3RoaXJkX3BhcnR5L21pdHQvbWl0dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS90aGlyZF9wYXJ0eS9wYXJzZWwtanMvcGFyc2VsLWpzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2Lm1qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3Mvd3JhcHBlci5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3kxOG4vYnVpbGQvbGliL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95MThuL2J1aWxkL2xpYi9wbGF0Zm9ybS1zaGltcy9ub2RlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95MThuL2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkL2xpYi9zdHJpbmctdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvdG9rZW5pemUtYXJnLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkL2xpYi95YXJncy1wYXJzZXItdHlwZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIveWFyZ3MtcGFyc2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvYXBwbHktZXh0ZW5kcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL3Byb2Nlc3MtYXJndi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3llcnJvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvaGVscGVycy9oZWxwZXJzLm1qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvbGliL3BsYXRmb3JtLXNoaW1zL2VzbS5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzL3lhcmdzLm1qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3Qvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvY3JlYXRlIGZha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3Qvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvZW5zdXJlIGNodW5rIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvZ2V0IGphdmFzY3JpcHQgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svcnVudGltZS9yZXF1aXJlIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svYmVmb3JlLXN0YXJ0dXAiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svc3RhcnR1cCIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3Qvd2VicGFjay9hZnRlci1zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGRlYnVnIGluc3RhbmNlIHRvIGJlIGNvbG9yZWRcblx0KiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBBbiBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG5cdFx0bGV0IGhhc2ggPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcblx0XHR9XG5cblx0XHRyZXR1cm4gY3JlYXRlRGVidWcuY29sb3JzW01hdGguYWJzKGhhc2gpICUgY3JlYXRlRGVidWcuY29sb3JzLmxlbmd0aF07XG5cdH1cblx0Y3JlYXRlRGVidWcuc2VsZWN0Q29sb3IgPSBzZWxlY3RDb2xvcjtcblxuXHQvKipcblx0KiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblx0XHRsZXQgcHJldlRpbWU7XG5cdFx0bGV0IGVuYWJsZU92ZXJyaWRlID0gbnVsbDtcblx0XHRsZXQgbmFtZXNwYWNlc0NhY2hlO1xuXHRcdGxldCBlbmFibGVkQ2FjaGU7XG5cblx0XHRmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG5cdFx0XHQvLyBEaXNhYmxlZD9cblx0XHRcdGlmICghZGVidWcuZW5hYmxlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNlbGYgPSBkZWJ1ZztcblxuXHRcdFx0Ly8gU2V0IGBkaWZmYCB0aW1lc3RhbXBcblx0XHRcdGNvbnN0IGN1cnIgPSBOdW1iZXIobmV3IERhdGUoKSk7XG5cdFx0XHRjb25zdCBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG5cdFx0XHRzZWxmLmRpZmYgPSBtcztcblx0XHRcdHNlbGYucHJldiA9IHByZXZUaW1lO1xuXHRcdFx0c2VsZi5jdXJyID0gY3Vycjtcblx0XHRcdHByZXZUaW1lID0gY3VycjtcblxuXHRcdFx0YXJnc1swXSA9IGNyZWF0ZURlYnVnLmNvZXJjZShhcmdzWzBdKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdFx0XHRhcmdzLnVuc2hpZnQoJyVPJyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0YXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIChtYXRjaCwgZm9ybWF0KSA9PiB7XG5cdFx0XHRcdC8vIElmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcblx0XHRcdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuICclJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZXIgPSBjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cdFx0XHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gYXJnc1tpbmRleF07XG5cdFx0XHRcdFx0bWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG5cdFx0XHRcdFx0Ly8gTm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuXHRcdFx0XHRcdGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdFx0XHRpbmRleC0tO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtYXRjaDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuXHRcdFx0Y3JlYXRlRGVidWcuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG5cdFx0XHRjb25zdCBsb2dGbiA9IHNlbGYubG9nIHx8IGNyZWF0ZURlYnVnLmxvZztcblx0XHRcdGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdH1cblxuXHRcdGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblx0XHRkZWJ1Zy51c2VDb2xvcnMgPSBjcmVhdGVEZWJ1Zy51c2VDb2xvcnMoKTtcblx0XHRkZWJ1Zy5jb2xvciA9IGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cdFx0ZGVidWcuZXh0ZW5kID0gZXh0ZW5kO1xuXHRcdGRlYnVnLmRlc3Ryb3kgPSBjcmVhdGVEZWJ1Zy5kZXN0cm95OyAvLyBYWFggVGVtcG9yYXJ5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWJ1ZywgJ2VuYWJsZWQnLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoZW5hYmxlT3ZlcnJpZGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW5hYmxlT3ZlcnJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5hbWVzcGFjZXNDYWNoZSAhPT0gY3JlYXRlRGVidWcubmFtZXNwYWNlcykge1xuXHRcdFx0XHRcdG5hbWVzcGFjZXNDYWNoZSA9IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXM7XG5cdFx0XHRcdFx0ZW5hYmxlZENhY2hlID0gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVuYWJsZWRDYWNoZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cdFx0Y3JlYXRlRGVidWcubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zbGljZSgxKSArICckJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLm1hcCh0b05hbWVzcGFjZSksXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5za2lwcy5tYXAodG9OYW1lc3BhY2UpLm1hcChuYW1lc3BhY2UgPT4gJy0nICsgbmFtZXNwYWNlKVxuXHRcdF0uam9pbignLCcpO1xuXHRcdGNyZWF0ZURlYnVnLmVuYWJsZSgnJyk7XG5cdFx0cmV0dXJuIG5hbWVzcGFjZXM7XG5cdH1cblxuXHQvKipcblx0KiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHQqIEByZXR1cm4ge0Jvb2xlYW59XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG5cdFx0aWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRsZXQgaTtcblx0XHRsZXQgbGVuO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCogQ29udmVydCByZWdleHAgdG8gbmFtZXNwYWNlXG5cdCpcblx0KiBAcGFyYW0ge1JlZ0V4cH0gcmVneGVwXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gdG9OYW1lc3BhY2UocmVnZXhwKSB7XG5cdFx0cmV0dXJuIHJlZ2V4cC50b1N0cmluZygpXG5cdFx0XHQuc3Vic3RyaW5nKDIsIHJlZ2V4cC50b1N0cmluZygpLmxlbmd0aCAtIDIpXG5cdFx0XHQucmVwbGFjZSgvXFwuXFwqXFw/JC8sICcqJyk7XG5cdH1cblxuXHQvKipcblx0KiBDb2VyY2UgYHZhbGAuXG5cdCpcblx0KiBAcGFyYW0ge01peGVkfSB2YWxcblx0KiBAcmV0dXJuIHtNaXhlZH1cblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0cmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxuXG5cdC8qKlxuXHQqIFhYWCBETyBOT1QgVVNFLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0dWIgZnVuY3Rpb24uXG5cdCogWFhYIEl0IFdJTEwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXHQqL1xuXHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHR9XG5cblx0Y3JlYXRlRGVidWcuZW5hYmxlKGNyZWF0ZURlYnVnLmxvYWQoKSk7XG5cblx0cmV0dXJuIGNyZWF0ZURlYnVnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHVwO1xuIiwiLyoqXG4gKiBEZXRlY3QgRWxlY3Ryb24gcmVuZGVyZXIgLyBud2pzIHByb2Nlc3MsIHdoaWNoIGlzIG5vZGUsIGJ1dCB3ZSBzaG91bGRcbiAqIHRyZWF0IGFzIGEgYnJvd3Nlci5cbiAqL1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8IHByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCBwcm9jZXNzLmJyb3dzZXIgPT09IHRydWUgfHwgcHJvY2Vzcy5fX253anMpIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Jyb3dzZXIuanMnKTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9ub2RlLmpzJyk7XG59XG4iLCIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxuY29uc3QgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5kZXN0cm95ID0gdXRpbC5kZXByZWNhdGUoXG5cdCgpID0+IHt9LFxuXHQnSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLidcbik7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gWzYsIDIsIDMsIDQsIDUsIDFdO1xuXG50cnkge1xuXHQvLyBPcHRpb25hbCBkZXBlbmRlbmN5IChhcyBpbiwgZG9lc24ndCBuZWVkIHRvIGJlIGluc3RhbGxlZCwgTk9UIGxpa2Ugb3B0aW9uYWxEZXBlbmRlbmNpZXMgaW4gcGFja2FnZS5qc29uKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5cdGNvbnN0IHN1cHBvcnRzQ29sb3IgPSByZXF1aXJlKCdzdXBwb3J0cy1jb2xvcicpO1xuXG5cdGlmIChzdXBwb3J0c0NvbG9yICYmIChzdXBwb3J0c0NvbG9yLnN0ZGVyciB8fCBzdXBwb3J0c0NvbG9yKS5sZXZlbCA+PSAyKSB7XG5cdFx0ZXhwb3J0cy5jb2xvcnMgPSBbXG5cdFx0XHQyMCxcblx0XHRcdDIxLFxuXHRcdFx0MjYsXG5cdFx0XHQyNyxcblx0XHRcdDMyLFxuXHRcdFx0MzMsXG5cdFx0XHQzOCxcblx0XHRcdDM5LFxuXHRcdFx0NDAsXG5cdFx0XHQ0MSxcblx0XHRcdDQyLFxuXHRcdFx0NDMsXG5cdFx0XHQ0NCxcblx0XHRcdDQ1LFxuXHRcdFx0NTYsXG5cdFx0XHQ1Nyxcblx0XHRcdDYyLFxuXHRcdFx0NjMsXG5cdFx0XHQ2OCxcblx0XHRcdDY5LFxuXHRcdFx0NzQsXG5cdFx0XHQ3NSxcblx0XHRcdDc2LFxuXHRcdFx0NzcsXG5cdFx0XHQ3OCxcblx0XHRcdDc5LFxuXHRcdFx0ODAsXG5cdFx0XHQ4MSxcblx0XHRcdDkyLFxuXHRcdFx0OTMsXG5cdFx0XHQ5OCxcblx0XHRcdDk5LFxuXHRcdFx0MTEyLFxuXHRcdFx0MTEzLFxuXHRcdFx0MTI4LFxuXHRcdFx0MTI5LFxuXHRcdFx0MTM0LFxuXHRcdFx0MTM1LFxuXHRcdFx0MTQ4LFxuXHRcdFx0MTQ5LFxuXHRcdFx0MTYwLFxuXHRcdFx0MTYxLFxuXHRcdFx0MTYyLFxuXHRcdFx0MTYzLFxuXHRcdFx0MTY0LFxuXHRcdFx0MTY1LFxuXHRcdFx0MTY2LFxuXHRcdFx0MTY3LFxuXHRcdFx0MTY4LFxuXHRcdFx0MTY5LFxuXHRcdFx0MTcwLFxuXHRcdFx0MTcxLFxuXHRcdFx0MTcyLFxuXHRcdFx0MTczLFxuXHRcdFx0MTc4LFxuXHRcdFx0MTc5LFxuXHRcdFx0MTg0LFxuXHRcdFx0MTg1LFxuXHRcdFx0MTk2LFxuXHRcdFx0MTk3LFxuXHRcdFx0MTk4LFxuXHRcdFx0MTk5LFxuXHRcdFx0MjAwLFxuXHRcdFx0MjAxLFxuXHRcdFx0MjAyLFxuXHRcdFx0MjAzLFxuXHRcdFx0MjA0LFxuXHRcdFx0MjA1LFxuXHRcdFx0MjA2LFxuXHRcdFx0MjA3LFxuXHRcdFx0MjA4LFxuXHRcdFx0MjA5LFxuXHRcdFx0MjE0LFxuXHRcdFx0MjE1LFxuXHRcdFx0MjIwLFxuXHRcdFx0MjIxXG5cdFx0XTtcblx0fVxufSBjYXRjaCAoZXJyb3IpIHtcblx0Ly8gU3dhbGxvdyAtIHdlIG9ubHkgY2FyZSBpZiBgc3VwcG9ydHMtY29sb3JgIGlzIGF2YWlsYWJsZTsgaXQgZG9lc24ndCBoYXZlIHRvIGJlLlxufVxuXG4vKipcbiAqIEJ1aWxkIHVwIHRoZSBkZWZhdWx0IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiAgICQgREVCVUdfQ09MT1JTPW5vIERFQlVHX0RFUFRIPTEwIERFQlVHX1NIT1dfSElEREVOPWVuYWJsZWQgbm9kZSBzY3JpcHQuanNcbiAqL1xuXG5leHBvcnRzLmluc3BlY3RPcHRzID0gT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmZpbHRlcihrZXkgPT4ge1xuXHRyZXR1cm4gL15kZWJ1Z18vaS50ZXN0KGtleSk7XG59KS5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XG5cdC8vIENhbWVsLWNhc2Vcblx0Y29uc3QgcHJvcCA9IGtleVxuXHRcdC5zdWJzdHJpbmcoNilcblx0XHQudG9Mb3dlckNhc2UoKVxuXHRcdC5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgaykgPT4ge1xuXHRcdFx0cmV0dXJuIGsudG9VcHBlckNhc2UoKTtcblx0XHR9KTtcblxuXHQvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlIGludG8gSlMgdmFsdWVcblx0bGV0IHZhbCA9IHByb2Nlc3MuZW52W2tleV07XG5cdGlmICgvXih5ZXN8b258dHJ1ZXxlbmFibGVkKSQvaS50ZXN0KHZhbCkpIHtcblx0XHR2YWwgPSB0cnVlO1xuXHR9IGVsc2UgaWYgKC9eKG5vfG9mZnxmYWxzZXxkaXNhYmxlZCkkL2kudGVzdCh2YWwpKSB7XG5cdFx0dmFsID0gZmFsc2U7XG5cdH0gZWxzZSBpZiAodmFsID09PSAnbnVsbCcpIHtcblx0XHR2YWwgPSBudWxsO1xuXHR9IGVsc2Uge1xuXHRcdHZhbCA9IE51bWJlcih2YWwpO1xuXHR9XG5cblx0b2JqW3Byb3BdID0gdmFsO1xuXHRyZXR1cm4gb2JqO1xufSwge30pO1xuXG4vKipcbiAqIElzIHN0ZG91dCBhIFRUWT8gQ29sb3JlZCBvdXRwdXQgaXMgZW5hYmxlZCB3aGVuIGB0cnVlYC5cbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdHJldHVybiAnY29sb3JzJyBpbiBleHBvcnRzLmluc3BlY3RPcHRzID9cblx0XHRCb29sZWFuKGV4cG9ydHMuaW5zcGVjdE9wdHMuY29sb3JzKSA6XG5cdFx0dHR5LmlzYXR0eShwcm9jZXNzLnN0ZGVyci5mZCk7XG59XG5cbi8qKlxuICogQWRkcyBBTlNJIGNvbG9yIGVzY2FwZSBjb2RlcyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdGNvbnN0IHtuYW1lc3BhY2U6IG5hbWUsIHVzZUNvbG9yc30gPSB0aGlzO1xuXG5cdGlmICh1c2VDb2xvcnMpIHtcblx0XHRjb25zdCBjID0gdGhpcy5jb2xvcjtcblx0XHRjb25zdCBjb2xvckNvZGUgPSAnXFx1MDAxQlszJyArIChjIDwgOCA/IGMgOiAnODs1OycgKyBjKTtcblx0XHRjb25zdCBwcmVmaXggPSBgICAke2NvbG9yQ29kZX07MW0ke25hbWV9IFxcdTAwMUJbMG1gO1xuXG5cdFx0YXJnc1swXSA9IHByZWZpeCArIGFyZ3NbMF0uc3BsaXQoJ1xcbicpLmpvaW4oJ1xcbicgKyBwcmVmaXgpO1xuXHRcdGFyZ3MucHVzaChjb2xvckNvZGUgKyAnbSsnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKSArICdcXHUwMDFCWzBtJyk7XG5cdH0gZWxzZSB7XG5cdFx0YXJnc1swXSA9IGdldERhdGUoKSArIG5hbWUgKyAnICcgKyBhcmdzWzBdO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldERhdGUoKSB7XG5cdGlmIChleHBvcnRzLmluc3BlY3RPcHRzLmhpZGVEYXRlKSB7XG5cdFx0cmV0dXJuICcnO1xuXHR9XG5cdHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgKyAnICc7XG59XG5cbi8qKlxuICogSW52b2tlcyBgdXRpbC5mb3JtYXQoKWAgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBhbmQgd3JpdGVzIHRvIHN0ZGVyci5cbiAqL1xuXG5mdW5jdGlvbiBsb2coLi4uYXJncykge1xuXHRyZXR1cm4gcHJvY2Vzcy5zdGRlcnIud3JpdGUodXRpbC5mb3JtYXQoLi4uYXJncykgKyAnXFxuJyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcblx0aWYgKG5hbWVzcGFjZXMpIHtcblx0XHRwcm9jZXNzLmVudi5ERUJVRyA9IG5hbWVzcGFjZXM7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSWYgeW91IHNldCBhIHByb2Nlc3MuZW52IGZpZWxkIHRvIG51bGwgb3IgdW5kZWZpbmVkLCBpdCBnZXRzIGNhc3QgdG8gdGhlXG5cdFx0Ly8gc3RyaW5nICdudWxsJyBvciAndW5kZWZpbmVkJy4gSnVzdCBkZWxldGUgaW5zdGVhZC5cblx0XHRkZWxldGUgcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRyZXR1cm4gcHJvY2Vzcy5lbnYuREVCVUc7XG59XG5cbi8qKlxuICogSW5pdCBsb2dpYyBmb3IgYGRlYnVnYCBpbnN0YW5jZXMuXG4gKlxuICogQ3JlYXRlIGEgbmV3IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGluIGNhc2UgYHVzZUNvbG9yc2AgaXMgc2V0XG4gKiBkaWZmZXJlbnRseSBmb3IgYSBwYXJ0aWN1bGFyIGBkZWJ1Z2AgaW5zdGFuY2UuXG4gKi9cblxuZnVuY3Rpb24gaW5pdChkZWJ1Zykge1xuXHRkZWJ1Zy5pbnNwZWN0T3B0cyA9IHt9O1xuXG5cdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhleHBvcnRzLmluc3BlY3RPcHRzKTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0ZGVidWcuaW5zcGVjdE9wdHNba2V5c1tpXV0gPSBleHBvcnRzLmluc3BlY3RPcHRzW2tleXNbaV1dO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9jb21tb24nKShleHBvcnRzKTtcblxuY29uc3Qge2Zvcm1hdHRlcnN9ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogTWFwICVvIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbCBvbiBhIHNpbmdsZSBsaW5lLlxuICovXG5cbmZvcm1hdHRlcnMubyA9IGZ1bmN0aW9uICh2KSB7XG5cdHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cdHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cylcblx0XHQuc3BsaXQoJ1xcbicpXG5cdFx0Lm1hcChzdHIgPT4gc3RyLnRyaW0oKSlcblx0XHQuam9pbignICcpO1xufTtcblxuLyoqXG4gKiBNYXAgJU8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsb3dpbmcgbXVsdGlwbGUgbGluZXMgaWYgbmVlZGVkLlxuICovXG5cbmZvcm1hdHRlcnMuTyA9IGZ1bmN0aW9uICh2KSB7XG5cdHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cdHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cyk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmF3YWl0RWFjaFlpZWxkZWRQcm9taXNlID0gZXhwb3J0cy5tYXliZUFzeW5jID0gZXhwb3J0cy5tYXliZUFzeW5jRm4gPSB2b2lkIDA7XG5mdW5jdGlvbiogYXdhaXRZaWVsZCh2YWx1ZSkge1xuICAgIHJldHVybiAoeWllbGQgdmFsdWUpO1xufVxuZnVuY3Rpb24gYXdhaXRZaWVsZE9mKGdlbmVyYXRvcikge1xuICAgIHJldHVybiBhd2FpdFlpZWxkKGF3YWl0RWFjaFlpZWxkZWRQcm9taXNlKGdlbmVyYXRvcikpO1xufVxuY29uc3QgQXdhaXRZaWVsZCA9IGF3YWl0WWllbGQ7XG5Bd2FpdFlpZWxkLm9mID0gYXdhaXRZaWVsZE9mO1xuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB0aGF0IG1heSBvciBtYXkgbm90IGJlIGFzeW5jLCB1c2luZyBhIGdlbmVyYXRvclxuICpcbiAqIFdpdGhpbiB0aGUgZ2VuZXJhdG9yLCBjYWxsIGB5aWVsZCogYXdhaXRlZChtYXliZVByb21pc2UpYCB0byBhd2FpdCBhIHZhbHVlXG4gKiB0aGF0IG1heSBvciBtYXkgbm90IGJlIGEgcHJvbWlzZS5cbiAqXG4gKiBJZiB0aGUgaW5uZXIgZnVuY3Rpb24gbmV2ZXIgeWllbGRzIGEgcHJvbWlzZSwgaXQgd2lsbCByZXR1cm4gc3luY2hyb25vdXNseS5cbiAqL1xuZnVuY3Rpb24gbWF5YmVBc3luY0ZuKHRoYXQsIGZuKSB7XG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRvciA9IGZuLmNhbGwodGhhdCwgQXdhaXRZaWVsZCwgLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBhd2FpdEVhY2hZaWVsZGVkUHJvbWlzZShnZW5lcmF0b3IpO1xuICAgIH07XG59XG5leHBvcnRzLm1heWJlQXN5bmNGbiA9IG1heWJlQXN5bmNGbjtcbmNsYXNzIEV4YW1wbGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm1heWJlQXN5bmNNZXRob2QgPSBtYXliZUFzeW5jRm4odGhpcywgZnVuY3Rpb24qIChhd2FpdGVkLCBhKSB7XG4gICAgICAgICAgICB5aWVsZCogYXdhaXRlZChuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBhKSkpO1xuICAgICAgICAgICAgcmV0dXJuIDU7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1heWJlQXN5bmModGhhdCwgc3RhcnRHZW5lcmF0b3IpIHtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBzdGFydEdlbmVyYXRvci5jYWxsKHRoYXQsIEF3YWl0WWllbGQpO1xuICAgIHJldHVybiBhd2FpdEVhY2hZaWVsZGVkUHJvbWlzZShnZW5lcmF0b3IpO1xufVxuZXhwb3J0cy5tYXliZUFzeW5jID0gbWF5YmVBc3luYztcbmZ1bmN0aW9uIGF3YWl0RWFjaFlpZWxkZWRQcm9taXNlKGdlbikge1xuICAgIGZ1bmN0aW9uIGhhbmRsZU5leHRTdGVwKHN0ZXApIHtcbiAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXAudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZXAudmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RlcC52YWx1ZS50aGVuKCh2YWx1ZSkgPT4gaGFuZGxlTmV4dFN0ZXAoZ2VuLm5leHQodmFsdWUpKSwgKGVycm9yKSA9PiBoYW5kbGVOZXh0U3RlcChnZW4udGhyb3coZXJyb3IpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZU5leHRTdGVwKGdlbi5uZXh0KHN0ZXAudmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhbmRsZU5leHRTdGVwKGdlbi5uZXh0KCkpO1xufVxuZXhwb3J0cy5hd2FpdEVhY2hZaWVsZGVkUHJvbWlzZSA9IGF3YWl0RWFjaFlpZWxkZWRQcm9taXNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXN5bmNpZnktaGVscGVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU0FzeW5jQ29udGV4dCA9IHZvaWQgMDtcbmNvbnN0IGNvbnRleHRfMSA9IHJlcXVpcmUoXCIuL2NvbnRleHRcIik7XG5jb25zdCBkZWJ1Z18xID0gcmVxdWlyZShcIi4vZGVidWdcIik7XG5jb25zdCB0eXBlc18xID0gcmVxdWlyZShcIi4vdHlwZXNcIik7XG4vKipcbiAqIEFzeW5jaWZpZWQgdmVyc2lvbiBvZiBbW1F1aWNrSlNDb250ZXh0XV0uXG4gKlxuICogKkFzeW5jaWZ5KiBhbGxvd3Mgbm9ybWFsbHkgc3luY2hyb25vdXMgY29kZSB0byB3YWl0IGZvciBhc3luY2hyb25vdXMgUHJvbWlzZXNcbiAqIG9yIGNhbGxiYWNrcy4gVGhlIGFzeW5jaWZpZWQgdmVyc2lvbiBvZiBRdWlja0pTQ29udGV4dCBjYW4gd2FpdCBmb3IgYXN5bmNcbiAqIGhvc3QgZnVuY3Rpb25zIGFzIHRob3VnaCB0aGV5IHdlcmUgc3luY2hyb25vdXMuXG4gKi9cbmNsYXNzIFF1aWNrSlNBc3luY0NvbnRleHQgZXh0ZW5kcyBjb250ZXh0XzEuUXVpY2tKU0NvbnRleHQge1xuICAgIC8qKlxuICAgICAqIEFzeW5jaWZpZWQgdmVyc2lvbiBvZiBbW2V2YWxDb2RlXV0uXG4gICAgICovXG4gICAgYXN5bmMgZXZhbENvZGVBc3luYyhjb2RlLCBmaWxlbmFtZSA9IFwiZXZhbC5qc1wiLCBcbiAgICAvKiogU2VlIFtbRXZhbEZsYWdzXV0gZm9yIG51bWJlciBzZW1hbnRpY3MgKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGRldGVjdE1vZHVsZSA9IChvcHRpb25zID09PSB1bmRlZmluZWQgPyAxIDogMCk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gKDAsIHR5cGVzXzEuZXZhbE9wdGlvbnNUb0ZsYWdzKShvcHRpb25zKTtcbiAgICAgICAgbGV0IHJlc3VsdFB0ciA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHRQdHIgPSBhd2FpdCB0aGlzLm1lbW9yeVxuICAgICAgICAgICAgICAgIC5uZXdIZWFwQ2hhclBvaW50ZXIoY29kZSlcbiAgICAgICAgICAgICAgICAuY29uc3VtZSgoY2hhckhhbmRsZSkgPT4gdGhpcy5mZmkuUVRTX0V2YWxfTWF5YmVBc3luYyh0aGlzLmN0eC52YWx1ZSwgY2hhckhhbmRsZS52YWx1ZSwgZmlsZW5hbWUsIGRldGVjdE1vZHVsZSwgZmxhZ3MpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICgwLCBkZWJ1Z18xLmRlYnVnTG9nKShcIlFUU19FdmFsX01heWJlQXN5bmMgdGhyZXdcIiwgZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyb3JQdHIgPSB0aGlzLmZmaS5RVFNfUmVzb2x2ZUV4Y2VwdGlvbih0aGlzLmN0eC52YWx1ZSwgcmVzdWx0UHRyKTtcbiAgICAgICAgaWYgKGVycm9yUHRyKSB7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZVZhbHVlUG9pbnRlcih0aGlzLmN0eC52YWx1ZSwgcmVzdWx0UHRyKTtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUoZXJyb3JQdHIpIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShyZXN1bHRQdHIpIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbWlsYXIgdG8gW1tuZXdGdW5jdGlvbl1dLlxuICAgICAqIENvbnZlcnQgYW4gYXN5bmMgaG9zdCBKYXZhc2NyaXB0IGZ1bmN0aW9uIGludG8gYSBzeW5jaHJvbm91cyBRdWlja0pTIGZ1bmN0aW9uIHZhbHVlLlxuICAgICAqXG4gICAgICogV2hlbmV2ZXIgUXVpY2tKUyBjYWxscyB0aGlzIGZ1bmN0aW9uLCB0aGUgVk0ncyBzdGFjayB3aWxsIGJlIHVud291bmQgd2hpbGVcbiAgICAgKiB3YWl0aW5nIHRoZSBhc3luYyBmdW5jdGlvbiB0byBjb21wbGV0ZSwgYW5kIHRoZW4gcmVzdG9yZWQgd2hlbiB0aGUgcmV0dXJuZWRcbiAgICAgKiBwcm9taXNlIHJlc29sdmVzLlxuICAgICAqXG4gICAgICogQXN5bmNpZmllZCBmdW5jdGlvbnMgbXVzdCBuZXZlciBjYWxsIG90aGVyIGFzeW5jaWZpZWQgZnVuY3Rpb25zIG9yXG4gICAgICogYGltcG9ydGAsIGV2ZW4gaW5kaXJlY3RseSwgYmVjYXVzZSB0aGUgc3RhY2sgY2Fubm90IGJlIHVud291bmQgdHdpY2UuXG4gICAgICpcbiAgICAgKiBTZWUgW0Vtc2NyaXB0ZW4ncyBkb2NzIG9uIEFzeW5jaWZ5XShodHRwczovL2Vtc2NyaXB0ZW4ub3JnL2RvY3MvcG9ydGluZy9hc3luY2lmeS5odG1sKS5cbiAgICAgKi9cbiAgICBuZXdBc3luY2lmaWVkRnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3RnVuY3Rpb24obmFtZSwgZm4pO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU0FzeW5jQ29udGV4dCA9IFF1aWNrSlNBc3luY0NvbnRleHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb250ZXh0LWFzeW5jaWZ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWlja0pTQ29udGV4dCA9IHZvaWQgMDtcbmNvbnN0IGRlYnVnXzEgPSByZXF1aXJlKFwiLi9kZWJ1Z1wiKTtcbmNvbnN0IGRlZmVycmVkX3Byb21pc2VfMSA9IHJlcXVpcmUoXCIuL2RlZmVycmVkLXByb21pc2VcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuL2Vycm9yc1wiKTtcbmNvbnN0IGxpZmV0aW1lXzEgPSByZXF1aXJlKFwiLi9saWZldGltZVwiKTtcbmNvbnN0IG1lbW9yeV8xID0gcmVxdWlyZShcIi4vbWVtb3J5XCIpO1xuY29uc3QgdHlwZXNfMSA9IHJlcXVpcmUoXCIuL3R5cGVzXCIpO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDb250ZXh0TWVtb3J5IGV4dGVuZHMgbWVtb3J5XzEuTW9kdWxlTWVtb3J5IHtcbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIHN1cGVyKGFyZ3MubW9kdWxlKTtcbiAgICAgICAgdGhpcy5zY29wZSA9IG5ldyBsaWZldGltZV8xLlNjb3BlKCk7XG4gICAgICAgIHRoaXMuY29weUpTVmFsdWUgPSAocHRyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mZmkuUVRTX0R1cFZhbHVlUG9pbnRlcih0aGlzLmN0eC52YWx1ZSwgcHRyKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mcmVlSlNWYWx1ZSA9IChwdHIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmZpLlFUU19GcmVlVmFsdWVQb2ludGVyKHRoaXMuY3R4LnZhbHVlLCBwdHIpO1xuICAgICAgICB9O1xuICAgICAgICBhcmdzLm93bmVkTGlmZXRpbWVzPy5mb3JFYWNoKChsaWZldGltZSkgPT4gdGhpcy5zY29wZS5tYW5hZ2UobGlmZXRpbWUpKTtcbiAgICAgICAgdGhpcy5vd25lciA9IGFyZ3Mub3duZXI7XG4gICAgICAgIHRoaXMubW9kdWxlID0gYXJncy5tb2R1bGU7XG4gICAgICAgIHRoaXMuZmZpID0gYXJncy5mZmk7XG4gICAgICAgIHRoaXMucnQgPSBhcmdzLnJ0O1xuICAgICAgICB0aGlzLmN0eCA9IHRoaXMuc2NvcGUubWFuYWdlKGFyZ3MuY3R4KTtcbiAgICB9XG4gICAgZ2V0IGFsaXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZS5hbGl2ZTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGUuZGlzcG9zZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmFjayBgbGlmZXRpbWVgIHNvIHRoYXQgaXQgaXMgZGlzcG9zZWQgd2hlbiB0aGlzIHNjb3BlIGlzIGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIG1hbmFnZShsaWZldGltZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZS5tYW5hZ2UobGlmZXRpbWUpO1xuICAgIH1cbiAgICBjb25zdW1lSlNDaGFyUG9pbnRlcihwdHIpIHtcbiAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5tb2R1bGUuVVRGOFRvU3RyaW5nKHB0cik7XG4gICAgICAgIHRoaXMuZmZpLlFUU19GcmVlQ1N0cmluZyh0aGlzLmN0eC52YWx1ZSwgcHRyKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgaGVhcFZhbHVlSGFuZGxlKHB0cikge1xuICAgICAgICByZXR1cm4gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUocHRyLCB0aGlzLmNvcHlKU1ZhbHVlLCB0aGlzLmZyZWVKU1ZhbHVlLCB0aGlzLm93bmVyKTtcbiAgICB9XG59XG4vKipcbiAqIFF1aWNrSlNDb250ZXh0IHdyYXBzIGEgUXVpY2tKUyBKYXZhc2NyaXB0IGNvbnRleHQgKEpTQ29udGV4dCopIHdpdGhpbiBhXG4gKiBydW50aW1lLiBUaGUgY29udGV4dHMgd2l0aGluIHRoZSBzYW1lIHJ1bnRpbWUgbWF5IGV4Y2hhbmdlIG9iamVjdHMgZnJlZWx5LlxuICogWW91IGNhbiB0aGluayBvZiBzZXBhcmF0ZSBydW50aW1lcyBsaWtlIGRpZmZlcmVudCBkb21haW5zIGluIGEgYnJvd3NlciwgYW5kXG4gKiB0aGUgY29udGV4dHMgd2l0aGluIGEgcnVudGltZSBsaWtlIHRoZSBkaWZmZXJlbnQgd2luZG93cyBvcGVuIHRvIHRoZSBzYW1lXG4gKiBkb21haW4uIFRoZSB7QGxpbmsgcnVudGltZX0gcmVmZXJlbmNlcyB0aGUgY29udGV4dCdzIHJ1bnRpbWUuXG4gKlxuICogVGhpcyBjbGFzcydzIG1ldGhvZHMgcmV0dXJuIHtAbGluayBRdWlja0pTSGFuZGxlfSwgd2hpY2ggd3JhcCBDIHBvaW50ZXJzIChKU1ZhbHVlKikuXG4gKiBJdCdzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBjYWxsIGAuZGlzcG9zZSgpYCBvbiBhbnlcbiAqIGhhbmRsZXMgeW91IGNyZWF0ZSB0byBmcmVlIG1lbW9yeSBvbmNlIHlvdSdyZSBkb25lIHdpdGggdGhlIGhhbmRsZS5cbiAqXG4gKiBVc2Uge0BsaW5rIFF1aWNrSlNSdW50aW1lLm5ld0NvbnRleHR9IG9yIHtAbGluayBRdWlja0pTV0FTTU1vZHVsZS5uZXdDb250ZXh0fVxuICogdG8gY3JlYXRlIGEgbmV3IFF1aWNrSlNDb250ZXh0LlxuICpcbiAqIENyZWF0ZSBRdWlja0pTIHZhbHVlcyBpbnNpZGUgdGhlIGludGVycHJldGVyIHdpdGggbWV0aG9kcyBsaWtlXG4gKiBbW25ld051bWJlcl1dLCBbW25ld1N0cmluZ11dLCBbW25ld0FycmF5XV0sIFtbbmV3T2JqZWN0XV0sXG4gKiBbW25ld0Z1bmN0aW9uXV0sIGFuZCBbW25ld1Byb21pc2VdXS5cbiAqXG4gKiBDYWxsIFtbc2V0UHJvcF1dIG9yIFtbZGVmaW5lUHJvcF1dIHRvIGN1c3RvbWl6ZSBvYmplY3RzLiBVc2UgdGhvc2UgbWV0aG9kc1xuICogd2l0aCBbW2dsb2JhbF1dIHRvIGV4cG9zZSB0aGUgdmFsdWVzIHlvdSBjcmVhdGUgdG8gdGhlIGludGVyaW9yIG9mIHRoZVxuICogaW50ZXJwcmV0ZXIsIHNvIHRoZXkgY2FuIGJlIHVzZWQgaW4gW1tldmFsQ29kZV1dLlxuICpcbiAqIFVzZSBbW2V2YWxDb2RlXV0gb3IgW1tjYWxsRnVuY3Rpb25dXSB0byBleGVjdXRlIEphdmFzY3JpcHQgaW5zaWRlIHRoZSBWTS4gSWZcbiAqIHlvdSdyZSB1c2luZyBhc3luY2hyb25vdXMgY29kZSBpbnNpZGUgdGhlIFF1aWNrSlNDb250ZXh0LCB5b3UgbWF5IG5lZWQgdG8gYWxzb1xuICogY2FsbCBbW2V4ZWN1dGVQZW5kaW5nSm9ic11dLiBFeGVjdXRpbmcgY29kZSBpbnNpZGUgdGhlIHJ1bnRpbWUgcmV0dXJucyBhXG4gKiByZXN1bHQgb2JqZWN0IHJlcHJlc2VudGluZyBzdWNjZXNzZnVsIGV4ZWN1dGlvbiBvciBhbiBlcnJvci4gWW91IG11c3QgZGlzcG9zZVxuICogb2YgYW55IHN1Y2ggcmVzdWx0cyB0byBhdm9pZCBsZWFraW5nIG1lbW9yeSBpbnNpZGUgdGhlIFZNLlxuICpcbiAqIEltcGxlbWVudCBtZW1vcnkgYW5kIENQVSBjb25zdHJhaW50cyBhdCB0aGUgcnVudGltZSBsZXZlbCwgdXNpbmcgW1tydW50aW1lXV0uXG4gKiBTZWUge0BsaW5rIFF1aWNrSlNSdW50aW1lfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKi9cbi8vIFRPRE86IE1hbmFnZSBvd24gY2FsbGJhY2sgcmVnaXN0cmF0aW9uXG5jbGFzcyBRdWlja0pTQ29udGV4dCB7XG4gICAgLyoqXG4gICAgICogVXNlIHtAbGluayBRdWlja0pTLmNyZWF0ZVZtfSB0byBjcmVhdGUgYSBRdWlja0pTQ29udGV4dCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLl91bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLl9udWxsID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5fZmFsc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLl90cnVlID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5fZ2xvYmFsID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5fQmlnSW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5mbk5leHRJZCA9IC0zMjc2ODsgLy8gbWluIHZhbHVlIG9mIHNpZ25lZCAxNmJpdCBpbnQgdXNlZCBieSBRdWlja2pzXG4gICAgICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmZuTWFwcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY1RvSG9zdENhbGxiYWNrcyA9IHtcbiAgICAgICAgICAgIGNhbGxGdW5jdGlvbjogKGN0eCwgdGhpc19wdHIsIGFyZ2MsIGFyZ3YsIGZuX2lkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN0eCAhPT0gdGhpcy5jdHgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUXVpY2tKU0NvbnRleHQgaW5zdGFuY2UgcmVjZWl2ZWQgQyAtPiBKUyBjYWxsIHdpdGggbWlzbWF0Y2hlZCBjdHhcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZuID0gdGhpcy5nZXRGdW5jdGlvbihmbl9pZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFmbikge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIFwidGhyb3dcIiBpcyBub3QgY2F0Y2gtYWJsZSBmcm9tIHRoZSBUUyBzaWRlLiBjb3VsZCB3ZSBzb21laG93IGhhbmRsZSB0aGlzIGhpZ2hlciB1cD9cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWlja0pTQ29udGV4dCBoYWQgbm8gY2FsbGJhY2sgd2l0aCBpZCAke2ZuX2lkfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGlmZXRpbWVfMS5TY29wZS53aXRoU2NvcGVNYXliZUFzeW5jKHRoaXMsIGZ1bmN0aW9uKiAoYXdhaXRlZCwgc2NvcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhpc0hhbmRsZSA9IHNjb3BlLm1hbmFnZShuZXcgbGlmZXRpbWVfMS5XZWFrTGlmZXRpbWUodGhpc19wdHIsIHRoaXMubWVtb3J5LmNvcHlKU1ZhbHVlLCB0aGlzLm1lbW9yeS5mcmVlSlNWYWx1ZSwgdGhpcy5ydW50aW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ0hhbmRsZXMgPSBuZXcgQXJyYXkoYXJnYyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdHIgPSB0aGlzLmZmaS5RVFNfQXJndkdldEpTVmFsdWVDb25zdFBvaW50ZXIoYXJndiwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdIYW5kbGVzW2ldID0gc2NvcGUubWFuYWdlKG5ldyBsaWZldGltZV8xLldlYWtMaWZldGltZShwdHIsIHRoaXMubWVtb3J5LmNvcHlKU1ZhbHVlLCB0aGlzLm1lbW9yeS5mcmVlSlNWYWx1ZSwgdGhpcy5ydW50aW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkKiBhd2FpdGVkKGZuLmFwcGx5KHRoaXNIYW5kbGUsIGFyZ0hhbmRsZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXCJlcnJvclwiIGluIHJlc3VsdCAmJiByZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwidGhyb3cgZXJyb3JcIiwgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBzY29wZS5tYW5hZ2UocmVzdWx0IGluc3RhbmNlb2YgbGlmZXRpbWVfMS5MaWZldGltZSA/IHJlc3VsdCA6IHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmZpLlFUU19EdXBWYWx1ZVBvaW50ZXIodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yVG9IYW5kbGUoZXJyb3IpLmNvbnN1bWUoKGVycm9ySGFuZGxlKSA9PiB0aGlzLmZmaS5RVFNfVGhyb3codGhpcy5jdHgudmFsdWUsIGVycm9ySGFuZGxlLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucnVudGltZSA9IGFyZ3MucnVudGltZTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBhcmdzLm1vZHVsZTtcbiAgICAgICAgdGhpcy5mZmkgPSBhcmdzLmZmaTtcbiAgICAgICAgdGhpcy5ydCA9IGFyZ3MucnQ7XG4gICAgICAgIHRoaXMuY3R4ID0gYXJncy5jdHg7XG4gICAgICAgIHRoaXMubWVtb3J5ID0gbmV3IENvbnRleHRNZW1vcnkoe1xuICAgICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgICAgIG93bmVyOiB0aGlzLnJ1bnRpbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBhcmdzLmNhbGxiYWNrcy5zZXRDb250ZXh0Q2FsbGJhY2tzKHRoaXMuY3R4LnZhbHVlLCB0aGlzLmNUb0hvc3RDYWxsYmFja3MpO1xuICAgICAgICB0aGlzLmR1bXAgPSB0aGlzLmR1bXAuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5nZXRTdHJpbmcgPSB0aGlzLmdldFN0cmluZy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmdldE51bWJlciA9IHRoaXMuZ2V0TnVtYmVyLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucmVzb2x2ZVByb21pc2UgPSB0aGlzLnJlc29sdmVQcm9taXNlLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIC8vIEBpbXBsZW1lbnQgRGlzcG9zYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZ2V0IGFsaXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkuYWxpdmU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc3Bvc2Ugb2YgdGhpcyBWTSdzIHVuZGVybHlpbmcgcmVzb3VyY2VzLlxuICAgICAqXG4gICAgICogQHRocm93cyBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGhvdXQgZGlzcG9zaW5nIG9mIGFsbCBjcmVhdGVkIGhhbmRsZXNcbiAgICAgKiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLm1lbW9yeS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIC8vIEdsb2JhbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogW2B1bmRlZmluZWRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy91bmRlZmluZWQpLlxuICAgICAqL1xuICAgIGdldCB1bmRlZmluZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl91bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVW5kZWZpbmVkIGlzIGEgY29uc3RhbnQsIGltbXV0YWJsZSB2YWx1ZSBpbiBRdWlja0pTLlxuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLmZmaS5RVFNfR2V0VW5kZWZpbmVkKCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fdW5kZWZpbmVkID0gbmV3IGxpZmV0aW1lXzEuU3RhdGljTGlmZXRpbWUocHRyKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtgbnVsbGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL251bGwpLlxuICAgICAqL1xuICAgIGdldCBudWxsKCkge1xuICAgICAgICBpZiAodGhpcy5fbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX251bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTnVsbCBpcyBhIGNvbnN0YW50LCBpbW11dGFibGUgdmFsdWUgaW4gUXVpY2tKUy5cbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5mZmkuUVRTX0dldE51bGwoKTtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9udWxsID0gbmV3IGxpZmV0aW1lXzEuU3RhdGljTGlmZXRpbWUocHRyKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtgdHJ1ZWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL3RydWUpLlxuICAgICAqL1xuICAgIGdldCB0cnVlKCkge1xuICAgICAgICBpZiAodGhpcy5fdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJ1ZSBpcyBhIGNvbnN0YW50LCBpbW11dGFibGUgdmFsdWUgaW4gUXVpY2tKUy5cbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5mZmkuUVRTX0dldFRydWUoKTtcbiAgICAgICAgcmV0dXJuICh0aGlzLl90cnVlID0gbmV3IGxpZmV0aW1lXzEuU3RhdGljTGlmZXRpbWUocHRyKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtgZmFsc2VgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9mYWxzZSkuXG4gICAgICovXG4gICAgZ2V0IGZhbHNlKCkge1xuICAgICAgICBpZiAodGhpcy5fZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxzZSBpcyBhIGNvbnN0YW50LCBpbW11dGFibGUgdmFsdWUgaW4gUXVpY2tKUy5cbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5mZmkuUVRTX0dldEZhbHNlKCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fZmFsc2UgPSBuZXcgbGlmZXRpbWVfMS5TdGF0aWNMaWZldGltZShwdHIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogW2BnbG9iYWxgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cykuXG4gICAgICogQSBoYW5kbGUgdG8gdGhlIGdsb2JhbCBvYmplY3QgaW5zaWRlIHRoZSBpbnRlcnByZXRlci5cbiAgICAgKiBZb3UgY2FuIHNldCBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBnbG9iYWwgdmFyaWFibGVzLlxuICAgICAqL1xuICAgIGdldCBnbG9iYWwoKSB7XG4gICAgICAgIGlmICh0aGlzLl9nbG9iYWwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nbG9iYWw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGdsb2JhbCBpcyBhIEpTVmFsdWUsIGJ1dCBzaW5jZSBpdCdzIGxpZmV0aW1lIGlzIGFzIGxvbmcgYXMgdGhlIFZNJ3MsXG4gICAgICAgIC8vIHdlIHNob3VsZCBtYW5hZ2UgaXQuXG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMuZmZpLlFUU19HZXRHbG9iYWxPYmplY3QodGhpcy5jdHgudmFsdWUpO1xuICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGNsZWFuIHVwIHRoaXMgcmVmZXJlbmNlIHdoZW4gd2UgZGlzcG9zZVxuICAgICAgICB0aGlzLm1lbW9yeS5tYW5hZ2UodGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHB0cikpO1xuICAgICAgICAvLyBUaGlzIGlzbid0IHRlY2huaWNhbGx5IGEgc3RhdGljIGxpZmV0aW1lLCBidXQgc2luY2UgaXQgaGFzIHRoZSBzYW1lXG4gICAgICAgIC8vIGxpZmV0aW1lIGFzIHRoZSBWTSwgaXQncyBva2F5IHRvIGZha2Ugb25lIHNpbmNlIHdoZW4gdGhlIFZNIGlzXG4gICAgICAgIC8vIGRpc3Bvc2VkLCBubyBvdGhlciBmdW5jdGlvbnMgd2lsbCBhY2NlcHQgdGhlIHZhbHVlLlxuICAgICAgICB0aGlzLl9nbG9iYWwgPSBuZXcgbGlmZXRpbWVfMS5TdGF0aWNMaWZldGltZShwdHIsIHRoaXMucnVudGltZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9nbG9iYWw7XG4gICAgfVxuICAgIC8vIE5ldyB2YWx1ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSBKYXZhc2NyaXB0IG51bWJlciBpbnRvIGEgUXVpY2tKUyB2YWx1ZS5cbiAgICAgKi9cbiAgICBuZXdOdW1iZXIobnVtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUodGhpcy5mZmkuUVRTX05ld0Zsb2F0NjQodGhpcy5jdHgudmFsdWUsIG51bSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBRdWlja0pTIFtzdHJpbmddKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZykgdmFsdWUuXG4gICAgICovXG4gICAgbmV3U3RyaW5nKHN0cikge1xuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLm1lbW9yeVxuICAgICAgICAgICAgLm5ld0hlYXBDaGFyUG9pbnRlcihzdHIpXG4gICAgICAgICAgICAuY29uc3VtZSgoY2hhckhhbmRsZSkgPT4gdGhpcy5mZmkuUVRTX05ld1N0cmluZyh0aGlzLmN0eC52YWx1ZSwgY2hhckhhbmRsZS52YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHB0cik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIFF1aWNrSlMgW3N5bWJvbF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3ltYm9sKSB2YWx1ZS5cbiAgICAgKiBObyB0d28gc3ltYm9scyBjcmVhdGVkIHdpdGggdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHRoZSBzYW1lIHZhbHVlLlxuICAgICAqL1xuICAgIG5ld1VuaXF1ZVN5bWJvbChkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCBrZXkgPSAodHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInN5bWJvbFwiID8gZGVzY3JpcHRpb24uZGVzY3JpcHRpb24gOiBkZXNjcmlwdGlvbikgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5tZW1vcnlcbiAgICAgICAgICAgIC5uZXdIZWFwQ2hhclBvaW50ZXIoa2V5KVxuICAgICAgICAgICAgLmNvbnN1bWUoKGNoYXJIYW5kbGUpID0+IHRoaXMuZmZpLlFUU19OZXdTeW1ib2wodGhpcy5jdHgudmFsdWUsIGNoYXJIYW5kbGUudmFsdWUsIDApKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShwdHIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzeW1ib2wgZnJvbSB0aGUgW2dsb2JhbCByZWdpc3RyeV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3ltYm9sI3NoYXJlZF9zeW1ib2xzX2luX3RoZV9nbG9iYWxfc3ltYm9sX3JlZ2lzdHJ5KSBmb3IgdGhlIGdpdmVuIGtleS5cbiAgICAgKiBBbGwgc3ltYm9scyBjcmVhdGVkIHdpdGggdGhlIHNhbWUga2V5IHdpbGwgYmUgdGhlIHNhbWUgdmFsdWUuXG4gICAgICovXG4gICAgbmV3U3ltYm9sRm9yKGtleSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9ICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiID8ga2V5LmRlc2NyaXB0aW9uIDoga2V5KSA/PyBcIlwiO1xuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLm1lbW9yeVxuICAgICAgICAgICAgLm5ld0hlYXBDaGFyUG9pbnRlcihkZXNjcmlwdGlvbilcbiAgICAgICAgICAgIC5jb25zdW1lKChjaGFySGFuZGxlKSA9PiB0aGlzLmZmaS5RVFNfTmV3U3ltYm9sKHRoaXMuY3R4LnZhbHVlLCBjaGFySGFuZGxlLnZhbHVlLCAxKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocHRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgUXVpY2tKUyBbYmlnaW50XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9CaWdJbnQpIHZhbHVlLlxuICAgICAqL1xuICAgIG5ld0JpZ0ludChudW0pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9CaWdJbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpZ0ludEhhbmRsZSA9IHRoaXMuZ2V0UHJvcCh0aGlzLmdsb2JhbCwgXCJCaWdJbnRcIik7XG4gICAgICAgICAgICB0aGlzLm1lbW9yeS5tYW5hZ2UoYmlnSW50SGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMuX0JpZ0ludCA9IG5ldyBsaWZldGltZV8xLlN0YXRpY0xpZmV0aW1lKGJpZ0ludEhhbmRsZS52YWx1ZSwgdGhpcy5ydW50aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiaWdJbnRIYW5kbGUgPSB0aGlzLl9CaWdJbnQ7XG4gICAgICAgIGNvbnN0IGFzU3RyaW5nID0gU3RyaW5nKG51bSk7XG4gICAgICAgIHJldHVybiB0aGlzLm5ld1N0cmluZyhhc1N0cmluZykuY29uc3VtZSgoaGFuZGxlKSA9PiB0aGlzLnVud3JhcFJlc3VsdCh0aGlzLmNhbGxGdW5jdGlvbihiaWdJbnRIYW5kbGUsIHRoaXMudW5kZWZpbmVkLCBoYW5kbGUpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGB7fWAuXG4gICAgICogQ3JlYXRlIGEgbmV3IFF1aWNrSlMgW29iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL09iamVjdF9pbml0aWFsaXplcikuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvdG90eXBlIC0gTGlrZSBbYE9iamVjdC5jcmVhdGVgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvY3JlYXRlKS5cbiAgICAgKi9cbiAgICBuZXdPYmplY3QocHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm90b3R5cGUpIHtcbiAgICAgICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChwcm90b3R5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB0ciA9IHByb3RvdHlwZVxuICAgICAgICAgICAgPyB0aGlzLmZmaS5RVFNfTmV3T2JqZWN0UHJvdG8odGhpcy5jdHgudmFsdWUsIHByb3RvdHlwZS52YWx1ZSlcbiAgICAgICAgICAgIDogdGhpcy5mZmkuUVRTX05ld09iamVjdCh0aGlzLmN0eC52YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocHRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYFtdYC5cbiAgICAgKiBDcmVhdGUgYSBuZXcgUXVpY2tKUyBbYXJyYXldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5KS5cbiAgICAgKi9cbiAgICBuZXdBcnJheSgpIHtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5mZmkuUVRTX05ld0FycmF5KHRoaXMuY3R4LnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShwdHIpO1xuICAgIH1cbiAgICBuZXdQcm9taXNlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkUHJvbWlzZSA9IGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlKChzY29wZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbXV0YWJsZVBvaW50ZXJBcnJheSA9IHNjb3BlLm1hbmFnZSh0aGlzLm1lbW9yeS5uZXdNdXRhYmxlUG9pbnRlckFycmF5KDIpKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VQdHIgPSB0aGlzLmZmaS5RVFNfTmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcy5jdHgudmFsdWUsIG11dGFibGVQb2ludGVyQXJyYXkudmFsdWUucHRyKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VIYW5kbGUgPSB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocHJvbWlzZVB0cik7XG4gICAgICAgICAgICBjb25zdCBbcmVzb2x2ZUhhbmRsZSwgcmVqZWN0SGFuZGxlXSA9IEFycmF5LmZyb20obXV0YWJsZVBvaW50ZXJBcnJheS52YWx1ZS50eXBlZEFycmF5KS5tYXAoKGpzdmFsdWVQdHIpID0+IHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShqc3ZhbHVlUHRyKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGRlZmVycmVkX3Byb21pc2VfMS5RdWlja0pTRGVmZXJyZWRQcm9taXNlKHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB0aGlzLFxuICAgICAgICAgICAgICAgIHByb21pc2VIYW5kbGUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUhhbmRsZSxcbiAgICAgICAgICAgICAgICByZWplY3RIYW5kbGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgUHJvbWlzZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZGVmZXJyZWRQcm9taXNlLnJlc29sdmUsIChlcnJvcikgPT4gZXJyb3IgaW5zdGFuY2VvZiBsaWZldGltZV8xLkxpZmV0aW1lXG4gICAgICAgICAgICAgICAgPyBkZWZlcnJlZFByb21pc2UucmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgICAgIDogdGhpcy5uZXdFcnJvcihlcnJvcikuY29uc3VtZShkZWZlcnJlZFByb21pc2UucmVqZWN0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkUHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIEphdmFzY3JpcHQgZnVuY3Rpb24gaW50byBhIFF1aWNrSlMgZnVuY3Rpb24gdmFsdWUuXG4gICAgICogU2VlIFtbVm1GdW5jdGlvbkltcGxlbWVudGF0aW9uXV0gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEEgW1tWbUZ1bmN0aW9uSW1wbGVtZW50YXRpb25dXSBzaG91bGQgbm90IGZyZWUgaXRzIGFyZ3VtZW50cyBvciBpdHMgcmV0dXJuXG4gICAgICogdmFsdWUuIEEgVm1GdW5jdGlvbkltcGxlbWVudGF0aW9uIHNob3VsZCBhbHNvIG5vdCByZXRhaW4gYW55IHJlZmVyZW5jZXMgdG9cbiAgICAgKiBpdHMgcmV0dXJuIHZhbHVlLlxuICAgICAqXG4gICAgICogVG8gaW1wbGVtZW50IGFuIGFzeW5jIGZ1bmN0aW9uLCBjcmVhdGUgYSBwcm9taXNlIHdpdGggW1tuZXdQcm9taXNlXV0sIHRoZW5cbiAgICAgKiByZXR1cm4gdGhlIGRlZmVycmVkIHByb21pc2UgaGFuZGxlIGZyb20gYGRlZmVycmVkLmhhbmRsZWAgZnJvbSB5b3VyXG4gICAgICogZnVuY3Rpb24gaW1wbGVtZW50YXRpb246XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBjb25zdCBkZWZlcnJlZCA9IHZtLm5ld1Byb21pc2UoKVxuICAgICAqIHNvbWVOYXRpdmVBc3luY0Z1bmN0aW9uKCkudGhlbihkZWZlcnJlZC5yZXNvbHZlKVxuICAgICAqIHJldHVybiBkZWZlcnJlZC5oYW5kbGVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBuZXdGdW5jdGlvbihuYW1lLCBmbikge1xuICAgICAgICBjb25zdCBmbklkID0gKyt0aGlzLmZuTmV4dElkO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uKGZuSWQsIGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZSh0aGlzLmZmaS5RVFNfTmV3RnVuY3Rpb24odGhpcy5jdHgudmFsdWUsIGZuSWQsIG5hbWUpKTtcbiAgICB9XG4gICAgbmV3RXJyb3IoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JIYW5kbGUgPSB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUodGhpcy5mZmkuUVRTX05ld0Vycm9yKHRoaXMuY3R4LnZhbHVlKSk7XG4gICAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5ld1N0cmluZyhlcnJvci5uYW1lKS5jb25zdW1lKChoYW5kbGUpID0+IHRoaXMuc2V0UHJvcChlcnJvckhhbmRsZSwgXCJuYW1lXCIsIGhhbmRsZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubmV3U3RyaW5nKGVycm9yLm1lc3NhZ2UpLmNvbnN1bWUoKGhhbmRsZSkgPT4gdGhpcy5zZXRQcm9wKGVycm9ySGFuZGxlLCBcIm1lc3NhZ2VcIiwgaGFuZGxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLm5ld1N0cmluZyhlcnJvcikuY29uc3VtZSgoaGFuZGxlKSA9PiB0aGlzLnNldFByb3AoZXJyb3JIYW5kbGUsIFwibWVzc2FnZVwiLCBoYW5kbGUpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzbid0IHN1cHBvcnRlZCBpbiB0aGUgdHlwZSBzaWduYXR1cmUgYnV0IG1heWJlIGl0IHdpbGwgbWFrZSBsaWZlIGVhc2llci5cbiAgICAgICAgICAgIHRoaXMubmV3U3RyaW5nKFN0cmluZyhlcnJvcikpLmNvbnN1bWUoKGhhbmRsZSkgPT4gdGhpcy5zZXRQcm9wKGVycm9ySGFuZGxlLCBcIm1lc3NhZ2VcIiwgaGFuZGxlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9ySGFuZGxlO1xuICAgIH1cbiAgICAvLyBSZWFkIHZhbHVlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIGB0eXBlb2ZgIG9wZXJhdG9yLiAqKk5vdCoqIFtzdGFuZGFyZHMgY29tcGxpYW50XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvdHlwZW9mKS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRG9lcyBub3Qgc3VwcG9ydCBCaWdJbnQgdmFsdWVzIGNvcnJlY3RseS5cbiAgICAgKi9cbiAgICB0eXBlb2YoaGFuZGxlKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChoYW5kbGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkuY29uc3VtZUhlYXBDaGFyUG9pbnRlcih0aGlzLmZmaS5RVFNfVHlwZW9mKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYGhhbmRsZWAgaW50byBhIEphdmFzY3JpcHQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIGBOYU5gIG9uIGVycm9yLCBvdGhlcndpc2UgYSBgbnVtYmVyYC5cbiAgICAgKi9cbiAgICBnZXROdW1iZXIoaGFuZGxlKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChoYW5kbGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5mZmkuUVRTX0dldEZsb2F0NjQodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBoYW5kbGVgIHRvIGEgSmF2YXNjcmlwdCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0U3RyaW5nKGhhbmRsZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmNvbnN1bWVKU0NoYXJQb2ludGVyKHRoaXMuZmZpLlFUU19HZXRTdHJpbmcodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgaGFuZGxlYCBpbnRvIGEgSmF2YXNjcmlwdCBzeW1ib2wuIElmIHRoZSBzeW1ib2wgaXMgaW4gdGhlIGdsb2JhbFxuICAgICAqIHJlZ2lzdHJ5IGluIHRoZSBndWVzdCwgaXQgd2lsbCBiZSBjcmVhdGVkIHdpdGggU3ltYm9sLmZvciBvbiB0aGUgaG9zdC5cbiAgICAgKi9cbiAgICBnZXRTeW1ib2woaGFuZGxlKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChoYW5kbGUpO1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLm1lbW9yeS5jb25zdW1lSlNDaGFyUG9pbnRlcih0aGlzLmZmaS5RVFNfR2V0U3ltYm9sRGVzY3JpcHRpb25PcktleSh0aGlzLmN0eC52YWx1ZSwgaGFuZGxlLnZhbHVlKSk7XG4gICAgICAgIGNvbnN0IGlzR2xvYmFsID0gdGhpcy5mZmkuUVRTX0lzR2xvYmFsU3ltYm9sKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNHbG9iYWwgPyBTeW1ib2wuZm9yKGtleSkgOiBTeW1ib2woa2V5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYGhhbmRsZWAgdG8gYSBKYXZhc2NyaXB0IGJpZ2ludC5cbiAgICAgKi9cbiAgICBnZXRCaWdJbnQoaGFuZGxlKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChoYW5kbGUpO1xuICAgICAgICBjb25zdCBhc1N0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKGhhbmRsZSk7XG4gICAgICAgIHJldHVybiBCaWdJbnQoYXNTdHJpbmcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKWAuXG4gICAgICogQ29udmVydCBhIGhhbmRsZSBjb250YWluaW5nIGEgUHJvbWlzZS1saWtlIHZhbHVlIGluc2lkZSB0aGUgVk0gaW50byBhblxuICAgICAqIGFjdHVhbCBwcm9taXNlIG9uIHRoZSBob3N0LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBZb3UgbWF5IG5lZWQgdG8gY2FsbCBbW2V4ZWN1dGVQZW5kaW5nSm9ic11dIHRvIGVuc3VyZSB0aGF0IHRoZSBwcm9taXNlIGlzIHJlc29sdmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb21pc2VMaWtlSGFuZGxlIC0gQSBoYW5kbGUgdG8gYSBQcm9taXNlLWxpa2UgdmFsdWUgd2l0aCBhIGAudGhlbihvblN1Y2Nlc3MsIG9uRXJyb3IpYCBtZXRob2QuXG4gICAgICovXG4gICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZUxpa2VIYW5kbGUpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmFzc2VydE93bmVkKHByb21pc2VMaWtlSGFuZGxlKTtcbiAgICAgICAgY29uc3Qgdm1SZXNvbHZlUmVzdWx0ID0gbGlmZXRpbWVfMS5TY29wZS53aXRoU2NvcGUoKHNjb3BlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2bVByb21pc2UgPSBzY29wZS5tYW5hZ2UodGhpcy5nZXRQcm9wKHRoaXMuZ2xvYmFsLCBcIlByb21pc2VcIikpO1xuICAgICAgICAgICAgY29uc3Qgdm1Qcm9taXNlUmVzb2x2ZSA9IHNjb3BlLm1hbmFnZSh0aGlzLmdldFByb3Aodm1Qcm9taXNlLCBcInJlc29sdmVcIikpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEZ1bmN0aW9uKHZtUHJvbWlzZVJlc29sdmUsIHZtUHJvbWlzZSwgcHJvbWlzZUxpa2VIYW5kbGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHZtUmVzb2x2ZVJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2bVJlc29sdmVSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgbGlmZXRpbWVfMS5TY29wZS53aXRoU2NvcGUoKHNjb3BlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZUhhbmRsZSA9IHNjb3BlLm1hbmFnZSh0aGlzLm5ld0Z1bmN0aW9uKFwicmVzb2x2ZVwiLCAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHZhbHVlOiB2YWx1ZSAmJiB2YWx1ZS5kdXAoKSB9KTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVqZWN0SGFuZGxlID0gc2NvcGUubWFuYWdlKHRoaXMubmV3RnVuY3Rpb24oXCJyZWplY3RcIiwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBlcnJvcjogZXJyb3IgJiYgZXJyb3IuZHVwKCkgfSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2VIYW5kbGUgPSBzY29wZS5tYW5hZ2Uodm1SZXNvbHZlUmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlVGhlbkhhbmRsZSA9IHNjb3BlLm1hbmFnZSh0aGlzLmdldFByb3AocHJvbWlzZUhhbmRsZSwgXCJ0aGVuXCIpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVud3JhcFJlc3VsdCh0aGlzLmNhbGxGdW5jdGlvbihwcm9taXNlVGhlbkhhbmRsZSwgcHJvbWlzZUhhbmRsZSwgcmVzb2x2ZUhhbmRsZSwgcmVqZWN0SGFuZGxlKSkuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBQcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIGBoYW5kbGVba2V5XWAuXG4gICAgICogR2V0IGEgcHJvcGVydHkgZnJvbSBhIEpTVmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IG1heSBiZSBzcGVjaWZpZWQgYXMgYSBKU1ZhbHVlIGhhbmRsZSwgb3IgYXMgYVxuICAgICAqIEphdmFzY3JpcHQgc3RyaW5nICh3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5KS5cbiAgICAgKi9cbiAgICBnZXRQcm9wKGhhbmRsZSwga2V5KSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChoYW5kbGUpO1xuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLmJvcnJvd1Byb3BlcnR5S2V5KGtleSkuY29uc3VtZSgocXVpY2tKU0tleSkgPT4gdGhpcy5mZmkuUVRTX0dldFByb3AodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSwgcXVpY2tKU0tleS52YWx1ZSkpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocHRyKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYGhhbmRsZVtrZXldID0gdmFsdWVgLlxuICAgICAqIFNldCBhIHByb3BlcnR5IG9uIGEgSlNWYWx1ZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogTm90ZSB0aGF0IHRoZSBRdWlja0pTIGF1dGhvcnMgcmVjb21tZW5kIHVzaW5nIFtbZGVmaW5lUHJvcF1dIHRvIGRlZmluZSBuZXdcbiAgICAgKiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgSlNWYWx1ZSBoYW5kbGUsIG9yIGFzIGFcbiAgICAgKiBKYXZhc2NyaXB0IHN0cmluZyBvciBudW1iZXIgKHdoaWNoIHdpbGwgYmUgY29udmVydGVkIGF1dG9tYXRpY2FsbHkgdG8gYSBKU1ZhbHVlKS5cbiAgICAgKi9cbiAgICBzZXRQcm9wKGhhbmRsZSwga2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgLy8gZnJlZSBuZXdseSBhbGxvY2F0ZWQgdmFsdWUgaWYga2V5IHdhcyBhIHN0cmluZyBvciBudW1iZXIuIE5vLW9wIGlmIHN0cmluZyB3YXMgYWxyZWFkeVxuICAgICAgICAvLyBhIFF1aWNrSlMgaGFuZGxlLlxuICAgICAgICB0aGlzLmJvcnJvd1Byb3BlcnR5S2V5KGtleSkuY29uc3VtZSgocXVpY2tKU0tleSkgPT4gdGhpcy5mZmkuUVRTX1NldFByb3AodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSwgcXVpY2tKU0tleS52YWx1ZSwgdmFsdWUudmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogW2BPYmplY3QuZGVmaW5lUHJvcGVydHkoaGFuZGxlLCBrZXksIGRlc2NyaXB0b3IpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2RlZmluZVByb3BlcnR5KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkgbWF5IGJlIHNwZWNpZmllZCBhcyBhIEpTVmFsdWUgaGFuZGxlLCBvciBhcyBhXG4gICAgICogSmF2YXNjcmlwdCBzdHJpbmcgb3IgbnVtYmVyICh3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5IHRvIGEgSlNWYWx1ZSkuXG4gICAgICovXG4gICAgZGVmaW5lUHJvcChoYW5kbGUsIGtleSwgZGVzY3JpcHRvcikge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgbGlmZXRpbWVfMS5TY29wZS53aXRoU2NvcGUoKHNjb3BlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxdWlja0pTS2V5ID0gc2NvcGUubWFuYWdlKHRoaXMuYm9ycm93UHJvcGVydHlLZXkoa2V5KSk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRlc2NyaXB0b3IudmFsdWUgfHwgdGhpcy51bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBjb25maWd1cmFibGUgPSBCb29sZWFuKGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGVudW1lcmFibGUgPSBCb29sZWFuKGRlc2NyaXB0b3IuZW51bWVyYWJsZSk7XG4gICAgICAgICAgICBjb25zdCBoYXNWYWx1ZSA9IEJvb2xlYW4oZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBnZXQgPSBkZXNjcmlwdG9yLmdldFxuICAgICAgICAgICAgICAgID8gc2NvcGUubWFuYWdlKHRoaXMubmV3RnVuY3Rpb24oZGVzY3JpcHRvci5nZXQubmFtZSwgZGVzY3JpcHRvci5nZXQpKVxuICAgICAgICAgICAgICAgIDogdGhpcy51bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBzZXQgPSBkZXNjcmlwdG9yLnNldFxuICAgICAgICAgICAgICAgID8gc2NvcGUubWFuYWdlKHRoaXMubmV3RnVuY3Rpb24oZGVzY3JpcHRvci5zZXQubmFtZSwgZGVzY3JpcHRvci5zZXQpKVxuICAgICAgICAgICAgICAgIDogdGhpcy51bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRGVmaW5lUHJvcCh0aGlzLmN0eC52YWx1ZSwgaGFuZGxlLnZhbHVlLCBxdWlja0pTS2V5LnZhbHVlLCB2YWx1ZS52YWx1ZSwgZ2V0LnZhbHVlLCBzZXQudmFsdWUsIGNvbmZpZ3VyYWJsZSwgZW51bWVyYWJsZSwgaGFzVmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gRXZhbHVhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBbYGZ1bmMuY2FsbCh0aGlzVmFsLCAuLi5hcmdzKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Z1bmN0aW9uL2NhbGwpLlxuICAgICAqIENhbGwgYSBKU1ZhbHVlIGFzIGEgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBTZWUgW1t1bndyYXBSZXN1bHRdXSwgd2hpY2ggd2lsbCB0aHJvdyBpZiB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYW4gZXJyb3IsIG9yXG4gICAgICogcmV0dXJuIHRoZSByZXN1bHQgaGFuZGxlIGRpcmVjdGx5LiBJZiBldmFsdWF0aW9uIHJldHVybmVkIGEgaGFuZGxlIGNvbnRhaW5pbmdcbiAgICAgKiBhIHByb21pc2UsIHVzZSBbW3Jlc29sdmVQcm9taXNlXV0gdG8gY29udmVydCBpdCB0byBhIG5hdGl2ZSBwcm9taXNlIGFuZFxuICAgICAqIFtbZXhlY3V0ZVBlbmRpbmdKb2JzXV0gdG8gZmluaXNoIGV2YWx1YXRpbmcgdGhlIHByb21pc2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHJlc3VsdC4gSWYgdGhlIGZ1bmN0aW9uIHRocmV3IHN5bmNocm9ub3VzbHksIGByZXN1bHQuZXJyb3JgIGJlIGFcbiAgICAgKiBoYW5kbGUgdG8gdGhlIGV4Y2VwdGlvbi4gT3RoZXJ3aXNlIGByZXN1bHQudmFsdWVgIHdpbGwgYmUgYSBoYW5kbGUgdG8gdGhlXG4gICAgICogdmFsdWUuXG4gICAgICovXG4gICAgY2FsbEZ1bmN0aW9uKGZ1bmMsIHRoaXNWYWwsIC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmFzc2VydE93bmVkKGZ1bmMpO1xuICAgICAgICBjb25zdCByZXN1bHRQdHIgPSB0aGlzLm1lbW9yeVxuICAgICAgICAgICAgLnRvUG9pbnRlckFycmF5KGFyZ3MpXG4gICAgICAgICAgICAuY29uc3VtZSgoYXJnc0FycmF5UHRyKSA9PiB0aGlzLmZmaS5RVFNfQ2FsbCh0aGlzLmN0eC52YWx1ZSwgZnVuYy52YWx1ZSwgdGhpc1ZhbC52YWx1ZSwgYXJncy5sZW5ndGgsIGFyZ3NBcnJheVB0ci52YWx1ZSkpO1xuICAgICAgICBjb25zdCBlcnJvclB0ciA9IHRoaXMuZmZpLlFUU19SZXNvbHZlRXhjZXB0aW9uKHRoaXMuY3R4LnZhbHVlLCByZXN1bHRQdHIpO1xuICAgICAgICBpZiAoZXJyb3JQdHIpIHtcbiAgICAgICAgICAgIHRoaXMuZmZpLlFUU19GcmVlVmFsdWVQb2ludGVyKHRoaXMuY3R4LnZhbHVlLCByZXN1bHRQdHIpO1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShlcnJvclB0cikgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWx1ZTogdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHJlc3VsdFB0cikgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlrZSBbYGV2YWwoY29kZSlgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9ldmFsI0Rlc2NyaXB0aW9uKS5cbiAgICAgKiBFdmFsdWF0ZXMgdGhlIEphdmFzY3JpcHQgc291cmNlIGBjb2RlYCBpbiB0aGUgZ2xvYmFsIHNjb3BlIG9mIHRoaXMgVk0uXG4gICAgICogV2hlbiB3b3JraW5nIHdpdGggYXN5bmMgY29kZSwgeW91IG1hbnkgbmVlZCB0byBjYWxsIFtbZXhlY3V0ZVBlbmRpbmdKb2JzXV1cbiAgICAgKiB0byBleGVjdXRlIGNhbGxiYWNrcyBwZW5kaW5nIGFmdGVyIHN5bmNocm9ub3VzIGV2YWx1YXRpb24gcmV0dXJucy5cbiAgICAgKlxuICAgICAqIFNlZSBbW3Vud3JhcFJlc3VsdF1dLCB3aGljaCB3aWxsIHRocm93IGlmIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBhbiBlcnJvciwgb3JcbiAgICAgKiByZXR1cm4gdGhlIHJlc3VsdCBoYW5kbGUgZGlyZWN0bHkuIElmIGV2YWx1YXRpb24gcmV0dXJuZWQgYSBoYW5kbGUgY29udGFpbmluZ1xuICAgICAqIGEgcHJvbWlzZSwgdXNlIFtbcmVzb2x2ZVByb21pc2VdXSB0byBjb252ZXJ0IGl0IHRvIGEgbmF0aXZlIHByb21pc2UgYW5kXG4gICAgICogW1tleGVjdXRlUGVuZGluZ0pvYnNdXSB0byBmaW5pc2ggZXZhbHVhdGluZyB0aGUgcHJvbWlzZS5cbiAgICAgKlxuICAgICAqICpOb3RlKjogdG8gcHJvdGVjdCBhZ2FpbnN0IGluZmluaXRlIGxvb3BzLCBwcm92aWRlIGFuIGludGVycnVwdCBoYW5kbGVyIHRvXG4gICAgICogW1tzZXRJbnRlcnJ1cHRIYW5kbGVyXV0uIFlvdSBjYW4gdXNlIFtbc2hvdWxkSW50ZXJydXB0QWZ0ZXJEZWFkbGluZV1dIHRvXG4gICAgICogY3JlYXRlIGEgdGltZS1iYXNlZCBkZWFkbGluZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBsYXN0IHN0YXRlbWVudCdzIHZhbHVlLiBJZiB0aGUgY29kZSB0aHJldyBzeW5jaHJvbm91c2x5LFxuICAgICAqIGByZXN1bHQuZXJyb3JgIHdpbGwgYmUgYSBoYW5kbGUgdG8gdGhlIGV4Y2VwdGlvbi4gSWYgZXhlY3V0aW9uIHdhc1xuICAgICAqIGludGVycnVwdGVkLCB0aGUgZXJyb3Igd2lsbCBoYXZlIG5hbWUgYEludGVybmFsRXJyb3JgIGFuZCBtZXNzYWdlXG4gICAgICogYGludGVycnVwdGVkYC5cbiAgICAgKi9cbiAgICBldmFsQ29kZShjb2RlLCBmaWxlbmFtZSA9IFwiZXZhbC5qc1wiLCBcbiAgICAvKipcbiAgICAgKiBJZiBubyBvcHRpb25zIGFyZSBwYXNzZWQsIGEgaGV1cmlzdGljIHdpbGwgYmUgdXNlZCB0byBkZXRlY3QgaWYgYGNvZGVgIGlzXG4gICAgICogYW4gRVMgbW9kdWxlLlxuICAgICAqXG4gICAgICogU2VlIFtbRXZhbEZsYWdzXV0gZm9yIG51bWJlciBzZW1hbnRpY3MuXG4gICAgICovXG4gICAgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBkZXRlY3RNb2R1bGUgPSAob3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gMSA6IDApO1xuICAgICAgICBjb25zdCBmbGFncyA9ICgwLCB0eXBlc18xLmV2YWxPcHRpb25zVG9GbGFncykob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFB0ciA9IHRoaXMubWVtb3J5XG4gICAgICAgICAgICAubmV3SGVhcENoYXJQb2ludGVyKGNvZGUpXG4gICAgICAgICAgICAuY29uc3VtZSgoY2hhckhhbmRsZSkgPT4gdGhpcy5mZmkuUVRTX0V2YWwodGhpcy5jdHgudmFsdWUsIGNoYXJIYW5kbGUudmFsdWUsIGZpbGVuYW1lLCBkZXRlY3RNb2R1bGUsIGZsYWdzKSk7XG4gICAgICAgIGNvbnN0IGVycm9yUHRyID0gdGhpcy5mZmkuUVRTX1Jlc29sdmVFeGNlcHRpb24odGhpcy5jdHgudmFsdWUsIHJlc3VsdFB0cik7XG4gICAgICAgIGlmIChlcnJvclB0cikge1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX0ZyZWVWYWx1ZVBvaW50ZXIodGhpcy5jdHgudmFsdWUsIHJlc3VsdFB0cik7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKGVycm9yUHRyKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocmVzdWx0UHRyKSB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaHJvdyBhbiBlcnJvciBpbiB0aGUgVk0sIGludGVycnVwdGVkIHdoYXRldmVyIGN1cnJlbnQgZXhlY3V0aW9uIGlzIGluIHByb2dyZXNzIHdoZW4gZXhlY3V0aW9uIHJlc3VtZXMuXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqL1xuICAgIHRocm93KGVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yVG9IYW5kbGUoZXJyb3IpLmNvbnN1bWUoKGhhbmRsZSkgPT4gdGhpcy5mZmkuUVRTX1Rocm93KHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBib3Jyb3dQcm9wZXJ0eUtleShrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5ld051bWJlcihrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uZXdTdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBrZXkgaXMgYWxyZWFkeSBhIEpTVmFsdWUsIGJ1dCB3ZSdyZSBib3Jyb3dpbmcgaXQuIFJldHVybiBhIHN0YXRpYyBoYW5kbGVcbiAgICAgICAgLy8gZm9yIGludGVybmFsIHVzZSBvbmx5LlxuICAgICAgICByZXR1cm4gbmV3IGxpZmV0aW1lXzEuU3RhdGljTGlmZXRpbWUoa2V5LnZhbHVlLCB0aGlzLnJ1bnRpbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldE1lbW9yeShydCkge1xuICAgICAgICBpZiAocnQgPT09IHRoaXMucnQudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1lbW9yeTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlByaXZhdGUgQVBJLiBDYW5ub3QgZ2V0IG1lbW9yeSBmcm9tIGEgZGlmZmVyZW50IHJ1bnRpbWVcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVXRpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBEdW1wIGEgSlNWYWx1ZSB0byBKYXZhc2NyaXB0IGluIGEgYmVzdC1lZmZvcnQgZmFzaGlvbi5cbiAgICAgKiBSZXR1cm5zIGBoYW5kbGUudG9TdHJpbmcoKWAgaWYgaXQgY2Fubm90IGJlIHNlcmlhbGl6ZWQgdG8gSlNPTi5cbiAgICAgKi9cbiAgICBkdW1wKGhhbmRsZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZW9mKGhhbmRsZSk7XG4gICAgICAgIGlmICh0eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmcoaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRCaWdJbnQoaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFN5bWJvbChoYW5kbGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0ciA9IHRoaXMubWVtb3J5LmNvbnN1bWVKU0NoYXJQb2ludGVyKHRoaXMuZmZpLlFUU19EdW1wKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0cik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbndyYXAgYSBTdWNjZXNzT3JGYWlsIHJlc3VsdCBzdWNoIGFzIGEgW1tWbUNhbGxSZXN1bHRdXSBvciBhXG4gICAgICogW1tFeGVjdXRlUGVuZGluZ0pvYnNSZXN1bHRdXSwgd2hlcmUgdGhlIGZhaWwgYnJhbmNoIGNvbnRhaW5zIGEgaGFuZGxlIHRvIGEgUXVpY2tKUyBlcnJvciB2YWx1ZS5cbiAgICAgKiBJZiB0aGUgcmVzdWx0IGlzIGEgc3VjY2VzcywgcmV0dXJucyB0aGUgdmFsdWUuXG4gICAgICogSWYgdGhlIHJlc3VsdCBpcyBhbiBlcnJvciwgY29udmVydHMgdGhlIGVycm9yIHRvIGEgbmF0aXZlIG9iamVjdCBhbmQgdGhyb3dzIHRoZSBlcnJvci5cbiAgICAgKi9cbiAgICB1bndyYXBSZXN1bHQocmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBcImNvbnRleHRcIiBpbiByZXN1bHQuZXJyb3IgPyByZXN1bHQuZXJyb3IuY29udGV4dCA6IHRoaXM7XG4gICAgICAgICAgICBjb25zdCBjYXVzZSA9IHJlc3VsdC5lcnJvci5jb25zdW1lKChlcnJvcikgPT4gdGhpcy5kdW1wKGVycm9yKSk7XG4gICAgICAgICAgICBpZiAoY2F1c2UgJiYgdHlwZW9mIGNhdXNlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBjYXVzZS5tZXNzYWdlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBuYW1lLCBzdGFjayB9ID0gY2F1c2U7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gbmV3IGVycm9yc18xLlF1aWNrSlNVbndyYXBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0U3RhY2sgPSBleGNlcHRpb24uc3RhY2s7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5uYW1lID0gY2F1c2UubmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzdGFjayA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24uc3RhY2sgPSBgJHtuYW1lfTogJHttZXNzYWdlfVxcbiR7Y2F1c2Uuc3RhY2t9SG9zdDogJHtob3N0U3RhY2t9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihleGNlcHRpb24sIHsgY2F1c2UsIGNvbnRleHQsIG1lc3NhZ2UgfSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNVbndyYXBFcnJvcihjYXVzZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0RnVuY3Rpb24oZm5faWQpIHtcbiAgICAgICAgY29uc3QgbWFwX2lkID0gZm5faWQgPj4gODtcbiAgICAgICAgY29uc3QgZm5NYXAgPSB0aGlzLmZuTWFwcy5nZXQobWFwX2lkKTtcbiAgICAgICAgaWYgKCFmbk1hcCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm5NYXAuZ2V0KGZuX2lkKTtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgc2V0RnVuY3Rpb24oZm5faWQsIGhhbmRsZSkge1xuICAgICAgICBjb25zdCBtYXBfaWQgPSBmbl9pZCA+PiA4O1xuICAgICAgICBsZXQgZm5NYXAgPSB0aGlzLmZuTWFwcy5nZXQobWFwX2lkKTtcbiAgICAgICAgaWYgKCFmbk1hcCkge1xuICAgICAgICAgICAgZm5NYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICB0aGlzLmZuTWFwcy5zZXQobWFwX2lkLCBmbk1hcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuTWFwLnNldChmbl9pZCwgaGFuZGxlKTtcbiAgICB9XG4gICAgZXJyb3JUb0hhbmRsZShlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBsaWZldGltZV8xLkxpZmV0aW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV3RXJyb3IoZXJyb3IpO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU0NvbnRleHQgPSBRdWlja0pTQ29udGV4dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRleHQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlYnVnTG9nID0gZXhwb3J0cy5RVFNfREVCVUcgPSB2b2lkIDA7XG5leHBvcnRzLlFUU19ERUJVRyA9IGZhbHNlIHx8IEJvb2xlYW4odHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgcHJvY2Vzcy5lbnYuUVRTX0RFQlVHKTtcbmV4cG9ydHMuZGVidWdMb2cgPSBleHBvcnRzLlFUU19ERUJVRyA/IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSkgOiAoKSA9PiB7IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWJ1Zy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU0RlZmVycmVkUHJvbWlzZSA9IHZvaWQgMDtcbi8qKlxuICogUXVpY2tKU0RlZmVycmVkUHJvbWlzZSB3cmFwcyBhIFF1aWNrSlMgcHJvbWlzZSBbW2hhbmRsZV1dIGFuZCBhbGxvd3NcbiAqIFtbcmVzb2x2ZV1daW5nIG9yIFtbcmVqZWN0XV1pbmcgdGhhdCBwcm9taXNlLiBVc2UgaXQgdG8gYnJpZGdlIGFzeW5jaHJvbm91c1xuICogY29kZSBvbiB0aGUgaG9zdCB0byBBUElzIGluc2lkZSBhIFF1aWNrSlNDb250ZXh0LlxuICpcbiAqIE1hbmFnaW5nIHRoZSBsaWZldGltZSBvZiBwcm9taXNlcyBpcyB0cmlja3kuIFRoZXJlIGFyZSB0aHJlZVxuICogW1tRdWlja0pTSGFuZGxlXV1zIGluc2lkZSBvZiBlYWNoIGRlZmVycmVkIHByb21pc2Ugb2JqZWN0OiAoMSkgdGhlIHByb21pc2VcbiAqIGl0c2VsZiwgKDIpIHRoZSBgcmVzb2x2ZWAgY2FsbGJhY2ssIGFuZCAoMykgdGhlIGByZWplY3RgIGNhbGxiYWNrLlxuICpcbiAqIC0gSWYgdGhlIHByb21pc2Ugd2lsbCBiZSBmdWxmaWxsZWQgYmVmb3JlIHRoZSBlbmQgb2YgaXQncyBbW293bmVyXV0ncyBsaWZldGltZSxcbiAqICAgdGhlIG9ubHkgY2xlYW51cCBuZWNlc3NhcnkgaXMgYGRlZmVycmVkLmhhbmRsZS5kaXNwb3NlKClgLCBiZWNhdXNlXG4gKiAgIGNhbGxpbmcgW1tyZXNvbHZlXV0gb3IgW1tyZWplY3RdXSB3aWxsIGRpc3Bvc2Ugb2YgYm90aCBjYWxsYmFja3MgYXV0b21hdGljYWxseS5cbiAqXG4gKiAtIEFzIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBbW1ZtRnVuY3Rpb25JbXBsZW1lbnRhdGlvbl1dLCByZXR1cm4gW1toYW5kbGVdXSxcbiAqICAgYW5kIGVuc3VyZSB0aGF0IGVpdGhlciBbW3Jlc29sdmVdXSBvciBbW3JlamVjdF1dIHdpbGwgYmUgY2FsbGVkLiBObyBvdGhlclxuICogICBjbGVhbi11cCBpcyBuZWNlc3NhcnkuXG4gKlxuICogLSBJbiBvdGhlciBjYXNlcywgY2FsbCBbW2Rpc3Bvc2VdXSwgd2hpY2ggd2lsbCBkaXNwb3NlIFtbaGFuZGxlXV0gYXMgd2VsbCBhcyB0aGVcbiAqICAgUXVpY2tKUyBoYW5kbGVzIHRoYXQgYmFjayBbW3Jlc29sdmVdXSBhbmQgW1tyZWplY3RdXS4gRm9yIHRoaXMgb2JqZWN0LFxuICogICBbW2Rpc3Bvc2VdXSBpcyBpZGVtcG90ZW50LlxuICovXG5jbGFzcyBRdWlja0pTRGVmZXJyZWRQcm9taXNlIHtcbiAgICAvKipcbiAgICAgKiBVc2UgW1tRdWlja0pTQ29udGV4dC5uZXdQcm9taXNlXV0gdG8gY3JlYXRlIGEgbmV3IHByb21pc2UgaW5zdGVhZCBvZiBjYWxsaW5nXG4gICAgICogdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS5cbiAgICAgKiBAdW5zdGFibGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXNvbHZlIFtbaGFuZGxlXV0gd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGlmIGFueS5cbiAgICAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBhZnRlciBjYWxsaW5nIFtbZGlzcG9zZV1dIGlzIGEgbm8tb3AuXG4gICAgICAgICAqXG4gICAgICAgICAqIE5vdGUgdGhhdCBhZnRlciByZXNvbHZpbmcgYSBwcm9taXNlLCB5b3UgbWF5IG5lZWQgdG8gY2FsbFxuICAgICAgICAgKiBbW1F1aWNrSlNDb250ZXh0LmV4ZWN1dGVQZW5kaW5nSm9ic11dIHRvIHByb3BhZ2F0ZSB0aGUgcmVzdWx0IHRvIHRoZSBwcm9taXNlJ3NcbiAgICAgICAgICogY2FsbGJhY2tzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXNvbHZlID0gKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzb2x2ZUhhbmRsZS5hbGl2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGV4dFxuICAgICAgICAgICAgICAgIC51bndyYXBSZXN1bHQodGhpcy5jb250ZXh0LmNhbGxGdW5jdGlvbih0aGlzLnJlc29sdmVIYW5kbGUsIHRoaXMuY29udGV4dC51bmRlZmluZWQsIHZhbHVlIHx8IHRoaXMuY29udGV4dC51bmRlZmluZWQpKVxuICAgICAgICAgICAgICAgIC5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VSZXNvbHZlcnMoKTtcbiAgICAgICAgICAgIHRoaXMub25TZXR0bGVkKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWplY3QgW1toYW5kbGVdXSB3aXRoIHRoZSBnaXZlbiB2YWx1ZSwgaWYgYW55LlxuICAgICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGFmdGVyIGNhbGxpbmcgW1tkaXNwb3NlXV0gaXMgYSBuby1vcC5cbiAgICAgICAgICpcbiAgICAgICAgICogTm90ZSB0aGF0IGFmdGVyIHJlamVjdGluZyBhIHByb21pc2UsIHlvdSBtYXkgbmVlZCB0byBjYWxsXG4gICAgICAgICAqIFtbUXVpY2tKU0NvbnRleHQuZXhlY3V0ZVBlbmRpbmdKb2JzXV0gdG8gcHJvcGFnYXRlIHRoZSByZXN1bHQgdG8gdGhlIHByb21pc2Unc1xuICAgICAgICAgKiBjYWxsYmFja3MuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlamVjdCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlamVjdEhhbmRsZS5hbGl2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGV4dFxuICAgICAgICAgICAgICAgIC51bndyYXBSZXN1bHQodGhpcy5jb250ZXh0LmNhbGxGdW5jdGlvbih0aGlzLnJlamVjdEhhbmRsZSwgdGhpcy5jb250ZXh0LnVuZGVmaW5lZCwgdmFsdWUgfHwgdGhpcy5jb250ZXh0LnVuZGVmaW5lZCkpXG4gICAgICAgICAgICAgICAgLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZVJlc29sdmVycygpO1xuICAgICAgICAgICAgdGhpcy5vblNldHRsZWQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFuZGxlLmFsaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kaXNwb3NlUmVzb2x2ZXJzKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGFyZ3MuY29udGV4dDtcbiAgICAgICAgdGhpcy5vd25lciA9IGFyZ3MuY29udGV4dC5ydW50aW1lO1xuICAgICAgICB0aGlzLmhhbmRsZSA9IGFyZ3MucHJvbWlzZUhhbmRsZTtcbiAgICAgICAgdGhpcy5zZXR0bGVkID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25TZXR0bGVkID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzb2x2ZUhhbmRsZSA9IGFyZ3MucmVzb2x2ZUhhbmRsZTtcbiAgICAgICAgdGhpcy5yZWplY3RIYW5kbGUgPSBhcmdzLnJlamVjdEhhbmRsZTtcbiAgICB9XG4gICAgZ2V0IGFsaXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGUuYWxpdmUgfHwgdGhpcy5yZXNvbHZlSGFuZGxlLmFsaXZlIHx8IHRoaXMucmVqZWN0SGFuZGxlLmFsaXZlO1xuICAgIH1cbiAgICBkaXNwb3NlUmVzb2x2ZXJzKCkge1xuICAgICAgICBpZiAodGhpcy5yZXNvbHZlSGFuZGxlLmFsaXZlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlamVjdEhhbmRsZS5hbGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5yZWplY3RIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTRGVmZXJyZWRQcm9taXNlID0gUXVpY2tKU0RlZmVycmVkUHJvbWlzZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlZmVycmVkLXByb21pc2UuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQgPSBleHBvcnRzLlF1aWNrSlNBc3luY2lmeVN1c3BlbmRlZCA9IGV4cG9ydHMuUXVpY2tKU0FzeW5jaWZ5RXJyb3IgPSBleHBvcnRzLlF1aWNrSlNOb3RJbXBsZW1lbnRlZCA9IGV4cG9ydHMuUXVpY2tKU1VzZUFmdGVyRnJlZSA9IGV4cG9ydHMuUXVpY2tKU1dyb25nT3duZXIgPSBleHBvcnRzLlF1aWNrSlNVbndyYXBFcnJvciA9IHZvaWQgMDtcbi8qKlxuICogRXJyb3IgdGhyb3duIGlmIFtbUXVpY2tKU0NvbnRleHQudW53cmFwUmVzdWx0XV0gdW53cmFwcyBhbiBlcnJvciB2YWx1ZSB0aGF0IGlzbid0IGFuIG9iamVjdC5cbiAqL1xuY2xhc3MgUXVpY2tKU1Vud3JhcEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNhdXNlLCBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKFN0cmluZyhjYXVzZSkpO1xuICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU1Vud3JhcEVycm9yXCI7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTVW53cmFwRXJyb3IgPSBRdWlja0pTVW53cmFwRXJyb3I7XG5jbGFzcyBRdWlja0pTV3JvbmdPd25lciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJRdWlja0pTV3JvbmdPd25lclwiO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU1dyb25nT3duZXIgPSBRdWlja0pTV3JvbmdPd25lcjtcbmNsYXNzIFF1aWNrSlNVc2VBZnRlckZyZWUgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU1VzZUFmdGVyRnJlZVwiO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU1VzZUFmdGVyRnJlZSA9IFF1aWNrSlNVc2VBZnRlckZyZWU7XG5jbGFzcyBRdWlja0pTTm90SW1wbGVtZW50ZWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU05vdEltcGxlbWVudGVkXCI7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTTm90SW1wbGVtZW50ZWQgPSBRdWlja0pTTm90SW1wbGVtZW50ZWQ7XG5jbGFzcyBRdWlja0pTQXN5bmNpZnlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJRdWlja0pTQXN5bmNpZnlFcnJvclwiO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU0FzeW5jaWZ5RXJyb3IgPSBRdWlja0pTQXN5bmNpZnlFcnJvcjtcbmNsYXNzIFF1aWNrSlNBc3luY2lmeVN1c3BlbmRlZCBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJRdWlja0pTQXN5bmNpZnlTdXNwZW5kZWRcIjtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNBc3luY2lmeVN1c3BlbmRlZCA9IFF1aWNrSlNBc3luY2lmeVN1c3BlbmRlZDtcbmNsYXNzIFF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU01lbW9yeUxlYWtEZXRlY3RlZFwiO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU01lbW9yeUxlYWtEZXRlY3RlZCA9IFF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVud3JhcEphdmFzY3JpcHQgPSBleHBvcnRzLnVud3JhcFR5cGVzY3JpcHQgPSB2b2lkIDA7XG4vKiogVHlwZXNjcmlwdCB0aGlua3MgaW1wb3J0KCcuLi5qcy8uZC50cycpIG5lZWRzIG1vZC5kZWZhdWx0LmRlZmF1bHQgKi9cbmZ1bmN0aW9uIGZha2VVbndyYXBEZWZhdWx0KG1vZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiZmFrZVVud3JhcERlZmF1bHRcIiwgbW9kKVxuICAgIHJldHVybiBtb2QuZGVmYXVsdDtcbn1cbi8qKiBUeXBlc2NyaXB0IHRoaW5rcyBpbXBvcnQoJy4uLnRzJykgZG9lc24ndCBuZWVkIG1vZC5kZWZhdWx0LmRlZmF1bHQsIGJ1dCBkb2VzICovXG5mdW5jdGlvbiBhY3R1YWxVbndyYXBEZWZhdWx0KG1vZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiYWN0dWFsVW53cmFwRGVmYXVsdFwiLCBtb2QpXG4gICAgY29uc3QgbWF5YmVVbndyYXAgPSBtb2QuZGVmYXVsdDtcbiAgICByZXR1cm4gbWF5YmVVbndyYXAgPz8gbW9kO1xufVxuLy8gSSdtIG5vdCBzdXJlIGlmIHRoaXMgYmVoYXZpb3IgaXMgbmVlZGVkIGluIGFsbCBydW50aW1lcyxcbi8vIG9yIGp1c3QgZm9yIG1vY2hhICsgdHMtbm9kZS5cbmV4cG9ydHMudW53cmFwVHlwZXNjcmlwdCA9IGFjdHVhbFVud3JhcERlZmF1bHQ7XG5leHBvcnRzLnVud3JhcEphdmFzY3JpcHQgPSBmYWtlVW53cmFwRGVmYXVsdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVzbUhlbHBlcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgUXVpY2tKU1JhdyA9ICgoKSA9PiB7XG4gICAgdmFyIF9zY3JpcHREaXIgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA6IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIF9fZmlsZW5hbWUgIT09ICd1bmRlZmluZWQnKVxuICAgICAgICBfc2NyaXB0RGlyID0gX3NjcmlwdERpciB8fCBfX2ZpbGVuYW1lO1xuICAgIHJldHVybiAoZnVuY3Rpb24gKFF1aWNrSlNSYXcgPSB7fSkge1xuICAgICAgICB2YXIgYTtcbiAgICAgICAgYSB8fCAoYSA9IHR5cGVvZiBRdWlja0pTUmF3ICE9PSAndW5kZWZpbmVkJyA/IFF1aWNrSlNSYXcgOiB7fSk7XG4gICAgICAgIHZhciBtLCBuO1xuICAgICAgICBhLnJlYWR5ID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGIsIGMpIHsgbSA9IGI7IG4gPSBjOyB9KTtcbiAgICAgICAgdmFyIHAgPSBPYmplY3QuYXNzaWduKHt9LCBhKSwgdCA9IFwiLi90aGlzLnByb2dyYW1cIiwgdSA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIHdpbmRvdywgdiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgaW1wb3J0U2NyaXB0cywgdyA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIHByb2Nlc3MgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUsIHggPSBcIlwiLCB5LCB6LCBBO1xuICAgICAgICBpZiAodykge1xuICAgICAgICAgICAgdmFyIGZzID0gcmVxdWlyZShcImZzXCIpLCBCID0gcmVxdWlyZShcInBhdGhcIik7XG4gICAgICAgICAgICB4ID0gdiA/IEIuZGlybmFtZSh4KSArIFwiL1wiIDogX19kaXJuYW1lICsgXCIvXCI7XG4gICAgICAgICAgICB5ID0gKGIsIGMpID0+IHsgdmFyIGQgPSBDKGIpOyBpZiAoZClcbiAgICAgICAgICAgICAgICByZXR1cm4gYyA/IGQgOiBkLnRvU3RyaW5nKCk7IGIgPSBiLnN0YXJ0c1dpdGgoXCJmaWxlOi8vXCIpID8gbmV3IFVSTChiKSA6IEIubm9ybWFsaXplKGIpOyByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGIsIGMgPyB2b2lkIDAgOiBcInV0ZjhcIik7IH07XG4gICAgICAgICAgICBBID0gYiA9PiB7IGIgPSB5KGIsICEwKTsgYi5idWZmZXIgfHwgKGIgPSBuZXcgVWludDhBcnJheShiKSk7IHJldHVybiBiOyB9O1xuICAgICAgICAgICAgeiA9IChiLCBjLCBkKSA9PiB7IHZhciBlID0gQyhiKTsgZSAmJiBjKGUpOyBiID0gYi5zdGFydHNXaXRoKFwiZmlsZTovL1wiKSA/IG5ldyBVUkwoYikgOiBCLm5vcm1hbGl6ZShiKTsgZnMucmVhZEZpbGUoYiwgZnVuY3Rpb24gKGYsIGcpIHsgZiA/IGQoZikgOiBjKGcuYnVmZmVyKTsgfSk7IH07XG4gICAgICAgICAgICAhYS50aGlzUHJvZ3JhbSAmJiAxIDwgcHJvY2Vzcy5hcmd2Lmxlbmd0aCAmJiAodCA9IHByb2Nlc3MuYXJndlsxXS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKSk7XG4gICAgICAgICAgICBwcm9jZXNzLmFyZ3Yuc2xpY2UoMik7XG4gICAgICAgICAgICBhLmluc3BlY3QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBcIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdXCI7IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodSB8fCB2KVxuICAgICAgICAgICAgdiA/IHggPSBzZWxmLmxvY2F0aW9uLmhyZWYgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBkb2N1bWVudCAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmICh4ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLCBfc2NyaXB0RGlyICYmICh4ID0gX3NjcmlwdERpciksIDAgIT09IHguaW5kZXhPZihcImJsb2I6XCIpID8geCA9IHguc3Vic3RyKDAsIHgucmVwbGFjZSgvWz8jXS4qLywgXCJcIikubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgOiB4ID0gXCJcIiwgeSA9IGIgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjID0gbmV3IFhNTEh0dHBSZXF1ZXN0O1xuICAgICAgICAgICAgICAgICAgICBjLm9wZW4oXCJHRVRcIiwgYiwgITEpO1xuICAgICAgICAgICAgICAgICAgICBjLnNlbmQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGYpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPSBDKGIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8IGIubGVuZ3RoOyBkKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGJbZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1IDwgZSAmJiAoZSAmPSAyNTUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB2ICYmIChBID0gYiA9PiB7IHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgWE1MSHR0cFJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgYy5vcGVuKFwiR0VUXCIsIGIsICExKTtcbiAgICAgICAgICAgICAgICBjLnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjtcbiAgICAgICAgICAgICAgICBjLnNlbmQobnVsbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGMucmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYiA9IEMoYikpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICAgICAgICAgIHRocm93IGQ7XG4gICAgICAgICAgICB9IH0pLCB6ID0gKGIsIGMsIGQpID0+IHsgdmFyIGUgPSBuZXcgWE1MSHR0cFJlcXVlc3Q7IGUub3BlbihcIkdFVFwiLCBiLCAhMCk7IGUucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiOyBlLm9ubG9hZCA9ICgpID0+IHsgaWYgKDIwMCA9PSBlLnN0YXR1cyB8fCAwID09IGUuc3RhdHVzICYmIGUucmVzcG9uc2UpXG4gICAgICAgICAgICAgICAgYyhlLnJlc3BvbnNlKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmID0gQyhiKTtcbiAgICAgICAgICAgICAgICBmID8gYyhmLmJ1ZmZlcikgOiBkKCk7XG4gICAgICAgICAgICB9IH07IGUub25lcnJvciA9IGQ7IGUuc2VuZChudWxsKTsgfTtcbiAgICAgICAgdmFyIGFhID0gYS5wcmludCB8fCBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLCBEID0gYS5wcmludEVyciB8fCBjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhLCBwKTtcbiAgICAgICAgcCA9IG51bGw7XG4gICAgICAgIGEudGhpc1Byb2dyYW0gJiYgKHQgPSBhLnRoaXNQcm9ncmFtKTtcbiAgICAgICAgdmFyIEU7XG4gICAgICAgIGEud2FzbUJpbmFyeSAmJiAoRSA9IGEud2FzbUJpbmFyeSk7XG4gICAgICAgIHZhciBub0V4aXRSdW50aW1lID0gYS5ub0V4aXRSdW50aW1lIHx8ICEwO1xuICAgICAgICBcIm9iamVjdFwiICE9IHR5cGVvZiBXZWJBc3NlbWJseSAmJiBGKFwibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZFwiKTtcbiAgICAgICAgdmFyIEcsIEggPSAhMSwgSSwgSiwgSywgTDtcbiAgICAgICAgZnVuY3Rpb24gTSgpIHsgdmFyIGIgPSBHLmJ1ZmZlcjsgYS5IRUFQOCA9IEkgPSBuZXcgSW50OEFycmF5KGIpOyBhLkhFQVAxNiA9IG5ldyBJbnQxNkFycmF5KGIpOyBhLkhFQVAzMiA9IEsgPSBuZXcgSW50MzJBcnJheShiKTsgYS5IRUFQVTggPSBKID0gbmV3IFVpbnQ4QXJyYXkoYik7IGEuSEVBUFUxNiA9IG5ldyBVaW50MTZBcnJheShiKTsgYS5IRUFQVTMyID0gTCA9IG5ldyBVaW50MzJBcnJheShiKTsgYS5IRUFQRjMyID0gbmV3IEZsb2F0MzJBcnJheShiKTsgYS5IRUFQRjY0ID0gbmV3IEZsb2F0NjRBcnJheShiKTsgfVxuICAgICAgICB2YXIgYmEgPSBbXSwgY2EgPSBbXSwgZGEgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gZWEoKSB7IHZhciBiID0gYS5wcmVSdW4uc2hpZnQoKTsgYmEudW5zaGlmdChiKTsgfVxuICAgICAgICB2YXIgTiA9IDAsIE8gPSBudWxsLCBQID0gbnVsbDtcbiAgICAgICAgZnVuY3Rpb24gRihiKSB7IGlmIChhLm9uQWJvcnQpXG4gICAgICAgICAgICBhLm9uQWJvcnQoYik7IGIgPSBcIkFib3J0ZWQoXCIgKyBiICsgXCIpXCI7IEQoYik7IEggPSAhMDsgYiA9IG5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoYiArIFwiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLlwiKTsgbihiKTsgdGhyb3cgYjsgfVxuICAgICAgICB2YXIgUSA9IFwiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LFwiLCBSO1xuICAgICAgICBSID0gXCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsQUdGemJRRUFBQUFCOVFaeFlBSi9md0JnQTM5L2Z3Ri9ZQVIvZm45L0FYNWdBbjkvQVg5Z0FYOEJmMkFGZjM1L2YzOEJmbUFEZjM5L0FHQUVmMzkvZndGL1lBSi9mZ0YrWUFGL0FHQUZmMzkvZjM4QmYyQUJmQUY4WUFKL2ZnQmdBbjkvQVg1Z0FuOStBWDlnQTM5L2ZnRi9ZQU4vZm44QmZtQURmMzUvQUdBR2YzNS9mMzkvQVg1Z0JuOS9mMzkvZndGL1lBUi9mMzkvQUdBRGYzNS9BWDlnQm45K2ZuOS9md0YrWUFSL2YzNS9BWDlnQTM5K2ZnRitZQU4vZjM4QmZtQUZmMzkvZm40QmYyQUVmMzkvZmdGL1lBUi9mMzUrQVg5Z0JYOStmbjUrQUdBQmZ3RitZQU4vZm40QmYyQUVmMzkvZndGK1lBZC9mMzkvZjM5L0FYOWdCWDkvZjM5L0FYNWdBbng4QVh4Z0FBRi9ZQVYvZjM5L2Z3QmdCWDkrZjM1L0FYOWdCWDkrZm45L0FYNWdBWDRCZjJBRWYzNStmd0JnQjM5K2YzNStmbjhCZjJBSWYzOS9mMzkvZjM4QmYyQUZmMzUrZm44QmYyQUdmMzUvZm41L0FYOWdCSDkrZjM0QmZtQUVmMzUvZndCZ0JIOStmMzRBWUFaL2YzOS9mMzhCZm1BRWYzNStmd0YvWUFsL2YzOS9mMzkvZjM4QmYyQUVmMzUrZndGK1lBUi9mbjkvQVg5Z0EzOStmZ0JnQTM1L2Z3Ri9ZQVYvZm41L2Z3QmdBMzkvZmdGK1lBZC9mbjkvZjM5L0FYNWdBQUJnQTM5L2ZnQmdCSDkrZjM0QmYyQUZmMzkrZjM4QmYyQUVmMzUrZmdGL1lBZC9mMzkvZjM5L0FHQUNmSDhCZkdBQmZBRi9ZQU44Zkg4QmZHQUNmMzhCZkdBRWYzOStmd0JnQkg5K2ZuNEJmbUFCZmdGK1lBSi9mQUYvWUFaL2ZIOS9mMzhCZjJBQUFYeGdCWDkrZjM1L0FYNWdCbjkvZm41K2ZnRi9ZQUorZndCZ0FuOThBR0FFZjM5K2Z3RitZQVYvZjM5L2ZnRitZQWQvZm41K2YzOS9BWDVnQkg1K2ZuNEJmMkFIZjM5L2YzOS9mZ0YrWUFwL2YzOS9mMzkvZjM5L0FYOWdCMzkvZm41L2YzOEJmMkFGZjN4L2YzOEJmbUFDZm44QmYyQUdmSDkvZjM5L0FHQUZmMzUvZjM4QVlBVi9mMzUvZndCZ0JuOStmbjUrZndGL1lBVi9mMzUrZndGL1lBWi9mbjkvZjM4QmYyQURmM3gvQVg5Z0JYOStmMzkvQVg5Z0JYOS9mbjUrQVg1Z0JYOStmbjUrQVg5Z0JuOS9mbjUvZndGL1lBZC9mMzkrZm41L0FYOWdCSDkvZjM0QmZtQUNmSDhCZjJBR2YzOS9mMzkvQUdBSWYzOS9mMzkvZjM4QVlBTi9mbndCZm1BQUFYNWdBbng4QVg5Z0FuNStBWHhnQVg4QmZHQURmbjUrQVg5Z0EzOS9mQUJnQ0g5K2ZuNStmMzUrQVg1Z0NYOS9mMzkvZjM5L2Z3QUNXdzhCWVFGaEFCUUJZUUZpQURzQllRRmpBQWNCWVFGa0FBUUJZUUZsQUFNQllRRm1BQU1CWVFGbkFBY0JZUUZvQUFFQllRRnBBQW9CWVFGcUFBUUJZUUZyQUFZQllRRnNBQUFCWVFGdEFFb0JZUUZ1QUFRQllRRnZBQW9EeWduSUNRd0FBQVFBU3dZR0FBTW1BQWtCQUFBQlBDY3ZEQWtJRGdFSUF3QUJBdzBkSnc0T0JBWWVDUjRJRGdBR0F3OEJIZ1F3QXc4S0F6MEdDQUFRQXhVSEdBY0JCZ2NmS0FBRUJENEJDQVlHRFFZR0F3NEJEU1VBRUIwcEFRRS9DUWdxRHdFZEZRWVlURDRORHdvQUJ3UUpBd0VPQkJjeEF5QXlQdzREQUF3REFBZ0tCZ0VFRGhVR0NnUWVEdzRRQ1FaTkFUTUhBQVFQQmowUEFnY0dBMDRCRlRRbUVBUVFEaFVyQXdRQkF3OFBNaXhQVUFsQUV3b0tCQU1CR0FNT0NnY0lBVEVtQXl3REFUVVBMRkVBUVRZR0F6QURRQU1KR0FvUEFSQUlDUUVBQUZJRUpnRlRCQWtEVkFrS0lRTWZBUTRPQlFBR0JBTURBRlVBQ0FFQk56SUlEaWxXRUFBR0dRUlhPQXNIQVFBUEFBRUJCZ1FCQXdRS0JnUUJDUVlDR0FVRkFEVkNCQU1CRFFrSkFTSUlEZzhJUWlVNUFRTVhBUmdVQmdBS1dGa0hDdzBVUXlNRUN3WmFBQWNUQVFNRUV3TUlJQUZFQmdRSEFRQUVCd2NCQXdFRUFRTUVEaEFERTFzUEdRNE9HRVVBQ2dBQUVBNEJBUWtaQVFBRUF4a0hYQU1OSXlNbkJ3TURBRjB2QVNRQkZBWW5CUU1OWGdNQUtBa0VBd3NEQVFvRUJ3TUNCQUVMQVFvSUFBNWZLQVFCQXdNRER3RUpCd2tCQ2dBSEJ3TXpBd2NIQndRRERnTWVDQnhnQWlnRUF3SmhOQUFWUEFBSER3Y0tJUUVVRXhFQUN3QmlHUVlHQXdNVUNnTUFCQ2tCR0FnREZ3TUdHV01kQ0E0M0xUWUpEeFlIQWdnUUFBQURGQU5HRnd4a0dBb0pCbVVMRXhSbUt3b0pFeE1oS3pkbkJ3Y0RCQ3NEQmdFR0J3UUJCQUFCQUFFN0FnSUlCQVFCQVFvT0FRVW1CV2dOUjBjQkFRVnBBZ1FKREFFQUF3UURBUUVBQXdNSkF3RVRBd0VBQUFNVE13b1RGQTBKQVNFQ0F3RUJCd2dGQlM0QkR3WnFDQThRRUFoRk5RQUJBQUFBS1E4bEFRNElEd0VEQVFvSEVBUUFBUkFOQkFRRUNSRUpDUUFQRFFNREJBTUlEd0VERXdjRE1BRUJBd0FlTVFFQlNBRUhBeDlySHhBWEJnOFBLQlluQVRvWERnMERBQjhHQVFNc0JRVU5IeFVBRUFnWFJnQU5Bd1FkYkFBWkFBQnRDUlFHQUFFWkpRTUFBeUlnRFFNZEFnVTJBaThSQndnREZBUWhRVU1lS1IxdUFRc2pCQVFCRkFjVEF3UVRBZ29ISlJRSEV5VWhBQU1KQmdjaEF3TUJBd1FCQVFNZmJ3SUZCQUVDQWdJQ0FnSUNBZ0lDQlFVQ0FnSUNCUVVGQWdJQ0FnSUZCUVVDQWdJQ0VnSUNDd0lDQ3lNTEJRSUNCUUlGQWdVQ0FnVUNBZ2dDQWdJQ0VnSUNBZ1VDQWdJQ0FnSUVDUllXRmhZQ0FnSUNBZ0lDQWdJUUNBZ1NDQ0lDQWhFTUxTNFZLaFViR3hjU0FnVUZFQVVhQlFVRkJSSUNCVGtRRFEwTkRRME5EUTBERFEwQkFRRUJBUUVCQVFFQkJRVUJBZ0lDQWdVQ0JRVWtBZ2dGQWdnQ0pBSUdCU1FGRUJFa0RCRU1EQXdSREJJU0pCSUNBZ0lJQWdBU0JRSVNCUmtTQlJrQkFnSUVCUVVGQlFNQ0FRQUFFUXdSREF3TUVRd1JEQXdSREF3TUVRd0VFUXdSREJFTURCRU1FUXdxS2hVWEZRTUFBQUFTQVNBZ0lBa0JFZ1FKSkJrSkFBY0JDUWtEQXdFRkF3UURDZ01EQ25BVUFRRUVBd01CQTBSSUJBTUVBd0FBQUFBSkFpSWJHaHdJRmhZV0ZnSUNBZ0lGRmdJNkFnRUFTUUlMQ3dzTEVBc0xBUkFMQ3dzTEN3c2pDd3NMQ3dzTEFSQUVCd0lIQndvS0NnSUNCZ1lHQmdZR0JnWUdCZ0VGQWdJRkFnSUNCUUlDQWdJQ0JRVUZHQWdDQWdJQ0FnZ0lBZ0lDQWdVQ0JRRUNBZ0lDQlFJQ0JRSUNBZ0lDQWdJQ0JRVUNBZ0lGQWdJQ0N3UUZBWEFBbXdNRkJ3RUJnQUtBZ0FJR0NRRi9BVUdRM3NRQ0N3ZkFBandCY0FJQUFYRUF1d1FCY2dDeEFRRnpBS01JQVhRQWtnZ0JkUUNBQ0FGMkFQd0hBWGNBOXdjQmVBQ1lBd0Y1QUpnREFYb0E2Z2NCUVFEakJ3RkNBTmtIQVVNQTFRY0JSQURSQndGRkFNb0hBVVlBK2dZQlJ3RDVCZ0ZJQU5jSUFVa0ExZ2dCU2dDYkFRRkxBTlVJQVV3QTFBZ0JUUURUQ0FGT0FOSUlBVThBMFFnQlVBRFFDQUZSQU04SUFWSUF6Z2dCVXdETkNBRlVBTXdJQVZVQTl3VUJWZ0RMQ0FGWEFNb0lBVmdBeVFnQldRRElDQUZhQU1jSUFWOEF4Z2dCSkFERkNBSmhZUURFQ0FKaVlRRERDQUpqWVFEQ0NBSmtZUURCQ0FKbFlRREFDQUptWVFDL0NBSm5ZUUMrQ0FKb1lRQzlDQUpwWVFDc0NBSnFZUUNZQXdKcllRQ1lBd0pzWVFDN0NBSnRZUUM2Q0FKdVlRQzRDQUp2WVFDM0NBSndZUUMwQ0FKeFlRQ3pDQUp5WVFFQUFuTmhBTEVJQW5SaEFMQUlBblZoQUs4SUNic0dBUUJCQVF1YUEvY0lpd2IyQ05nRDJBT3lCNmdIb0FlWEI0MEhqQWYwQlA0Ry9RYjhCdnNHK0FiQ0J0VUp2UW1wQ1p3SnJnT1FDWThKbHdhSkNlNEk2Z2pwQ0pnRTZBam5DUHdGNWdqbENPUUk0d2o2QmVJSTRRamdDTjhJM2dqNUJkMEkzQWpiQ05vSTJRallDUE1FOHdlOENMa0l0Z2kxQ09zSTlBU3lDTlVGcmdpdENLY0lxQWltQ0tVSXBBajBCNDRKalFtS0NZZ0pqQW53Qi9FSDdnZnJCK1FINGdmaEI5TUh3UWVhQi9FRXZBbWJDWm9KbVFtWUNaY0psZ21WQ1pRSmt3bVNDWkVKaXdudENPd0luUWljQ0pzSW1naVpDS0FGbUFpWENKWUlsUWlVQ0pNSWtRaVFDSThJamdpTkNJd0lpd2lLQ0lrSWlBaUhDSVlJNlFPRkNPa0RoQWlEQ0lJSWdRaWVDS0VJb0FpZkNLSUkyUVAvQi80SGtRZVFCNWtIbUFlV0I1VUhsQWVUQjVJSDRBZmZCOTRINlFQZEI2QUYzQWZiQjlvSDJBZXJDS29JcVFqL0Jvb0hpUWVJQjRjSGhnZUZCNFFIZ3dlQ0I0RUhnQWZvQjRzSGp3ZU9CNXNIcEFlaEI2TUhvZ2VmQjU0SG5RZWNCNlVINXdmbUIrVUgvZ0hzQitrSDdRZnZCL0lIOVFiUEJQUUc4d2J5QnZFR3lBVHdCdThHOXdiUkJQWUc5Z2YxQi9zSCtnZjVCL2dIL1Flb0NlTUdwd25tQnFZSnBRbWtDYU1KNFFiZkJzWUVvZ21oQ2FBSnNRYWZDWjRKblFtd0JySUpzUW13Q2E4SnJnbXRDYXdKcXdtcUNiZ0puUU8zQ2JZSnRRbTBDYk1KeGduSkI4Z0h4UW5FQ2NNSndnbldBOEVKd0FuM0JQZ0V2d20rQ2JzSnVnbTVDY2tKeUFuSENkQUp6d205Qkx3RXpnbk5DY3dKeXduS0NiUUcxQW5UQ2RJSjBRbTRCcmNHdGdhMUJyb0d1UWE5QnJ3R3V3YlNCdEVHMEFiUEJzNEd6UWJNQnNzR3lnYkpCc2dHeHdiR0JzVUd4QWJEQnNFR3dBYS9CcjRHMHdiY0JvQUorZ2o3Q05zR2d3bUVDWUVKblFUK0NQa0k2d1BNQXRvRzlRanhDTzhJMlFiNENQUUk4QWlDQ2Y4SS9RaVhBcWNEMWdueUNQd0kyQWJYQnRZRzFRYlVCdWdHNXdibEJ1UUc0Z2JnQnQ0RzNRYnJCdW9HNlFidEJ1d0c3Z2FwQjZjSHBnZlBCNEVGMXdlQUJjNEh6UWZNQjhzSHh3ZkdCOFVIeEFmREI4SUh3QWUvQjlJSDBBZldCOVFIdEFlekI3RUhzQWV2QjY0SHJRZXNCNnNIcWdlK0I3MEh2QWU3QjdvSHVRZTRCN2NIdGdlMUI0Y0poUW1HQ2RnRDh3Z0sxNVlYeUFrMUFRRi9Ba0FnQVVJZ2lLZEJkVWtOQUNBQnB5SUNJQUlvQWdBaUFrRUJhellDQUNBQ1FRRktEUUFnQUNnQ0VDQUJFSllFQ3d0TkFRSi9JQUFvQWtBaUFrR0FBbW9oQXlBQ0tBS2NBaUFBS0FJRVJ3UkFJQU5Cd2dFUUVTQURJQUFvQWdRUUhTQUNJQUFvQWdRMkFwd0NDeUFDSUFJb0FvUUNOZ0tZQWlBRElBRVFFUXNtQVFGL0l3QkJFR3NpQWlRQUlBSWdBVG9BRHlBQUlBSkJEMnBCQVJCeUlBSkJFR29rQUF2L0Z3SUdmd0orSXdCQkVHc2lBaVFBQW44Q1FDQUFLQUlBS0FJUUtBSjRJQUpMQkVBZ0FFR05Ja0VBRUJZTUFRc2dBQ0FBUVJCcUlnUVEvd0VnQUNBQUtBSTRJZ0UyQWpRZ0FpQUJOZ0lNSUFCQkFEWUNNQ0FBSUFBb0FoUTJBZ1FEUUNBQUlBRTJBaGdnQUNBQUtBSUlJZ00yQWhRQ1FBSkFBa0FDUUFKQUFrQUNRQUovQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FTd0FBQ0lGUWY4QmNTSUdEbjBBRnhjWEZ4Y1hGeGNFQXdRRUFoY1hGeGNYRnhjWEZ4Y1hGeGNYRnhjWEZ3UVNHZ2dIREJNYUZ4Y0xEUmNPQ1FVS0hSMGRIUjBkSFIwZEZ4Y1BFUkFXRndjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NIRndZWEZBY0JCd2NIQndjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NIQndjSEJ3Y1hGUmNMUVFBaEJTQUJJQUFvQWp4SkRSZ2dCRUdzZnpZQ0FBd2dDeUFBSUFGQkFXb1F6d01OSFNBQ0lBQW9BamcyQWd3TUh3c2dBVUVCYWlBQklBRXRBQUZCQ2tZYklRRUxJQUlnQVVFQmFqWUNEQXdlQ3lBQ0lBRkJBV28yQWd3TUhnc0NRQUpBSUFFdEFBRWlBMEVxUndSQUlBTkJMMFlOQVNBRFFUMUhEUUlnQWlBQlFRSnFOZ0lNSUFSQmhuODJBZ0FNSGdzZ0FpQUJRUUpxSWdFMkFnd0RRQUpBQWtBQ1FBSkFBa0FDUUNBQkxRQUFJZ05CQ21zT0JBRURBd0lBQ3lBRFFTcEhCRUFnQXcwRElBRWdBQ2dDUEVrTkJDQUFRZFVzUVFBUUZnd2lDeUFCTFFBQlFTOUhEUU1nQWlBQlFRSnFOZ0lNRENVTElBQkJBVFlDTUNBQUlBQW9BZ2hCQVdvMkFnZ2dBaUFCUVFGcU5nSU1EQU1MSUFCQkFUWUNNQ0FDSUFGQkFXbzJBZ3dNQWdzZ0E4QkJBRTROQUNBQlFRWWdBa0VNYWhCWUlnRkJmbkZCcU1BQVJnUkFJQUJCQVRZQ01Bd0NDeUFCUVg5SERRRWdBaUFDS0FJTVFRRnFOZ0lNREFFTElBSWdBVUVCYWpZQ0RBc2dBaWdDRENFQkRBQUxBQXNnQVVFQ2FpRUJRUUFNRndzZ0FpQUJRUUZxTmdJTUlBUkJMellDQUF3YkMwSGNBQ0VGSUFFdEFBRkI5UUJIRFJJZ0FpQUJRUUZxTmdJRUlBSkJCR3BCQVJENUFTSUdRUUJJRFJJZ0JoRHZBa1VORWlBQ0lBSW9BZ1EyQWd3Z0FrRUJOZ0lJREJjTElBSkJBRFlDQ0NBQ0lBRkJBV28yQWd3TUZnc2dBaUFCUVFKcU5nSUVRZHdBSVFNQ1FDQUJMUUFCSWdWQjNBQkdCRUFnQVMwQUFrSDFBRWNOQVNBQ1FRUnFRUUVRK1FFaEF3d0JDeUFGSWdQQVFRQk9EUUFnQVVFQmFrRUdJQUpCQkdvUVdDRURDeUFERU84Q1JRUkFJQUJCeE9jQVFRQVFGZ3dYQ3lBQ0lBSW9BZ1EyQWd3Z0FDQUNRUXhxSUFKQkNHb2dBMEVCRU9vRUlnRkZEUllnQUVHcmZ6WUNFQ0FBSUFFMkFpQU1HQXRCTGlFRklBRXRBQUVpQTBFdVJ3ME9JQUV0QUFKQkxrY05EeUFDSUFGQkEybzJBZ3dnQkVHbmZ6WUNBQXdYQ3lBQkxRQUJRVHByUVhaSkRSSWdBQ2dDUUMwQWJrRUJjVVVORWlBQVFmdnNBRUVBRUJZTUZBdEJLaUVGSUFFdEFBRWlBMEVxUndSQUlBTkJQVWNORGlBQ0lBRkJBbW8yQWd3Z0JFR0ZmellDQUF3V0N5QUJMUUFDUVQxR0JFQWdBaUFCUVFOcU5nSU1JQVJCa1g4MkFnQU1GZ3NnQWlBQlFRSnFOZ0lNSUFSQnBYODJBZ0FNRlF0QkpTRUZJQUV0QUFGQlBVY05EQ0FDSUFGQkFtbzJBZ3dnQkVHSGZ6WUNBQXdVQzBFcklRVWdBUzBBQVNJRFFTdEhCRUFnQTBFOVJ3ME1JQUlnQVVFQ2FqWUNEQ0FFUVloL05nSUFEQlFMSUFJZ0FVRUNhallDRENBRVFaWi9OZ0lBREJNTFFTMGhCU0FCTFFBQklnWkJMVWNFUUNBR1FUMUhEUXNnQWlBQlFRSnFOZ0lNSUFSQmlYODJBZ0FNRXdzQ1FDQUFLQUpJUlEwQUlBRXRBQUpCUGtjTkFDQUFLQUlFSUFOSERRMExJQUlnQVVFQ2FqWUNEQ0FFUVpWL05nSUFEQklMQWtBQ1FBSkFJQUV0QUFFaUEwRThhdzRDQVFBQ0N5QUNJQUZCQW1vMkFnd2dCRUdiZnpZQ0FBd1RDeUFCTFFBQ1FUMUdCRUFnQWlBQlFRTnFOZ0lNSUFSQmluODJBZ0FNRXdzZ0FpQUJRUUpxTmdJTUlBUkJsMzgyQWdBTUVndEJQQ0VGSUFOQklVY05DU0FBS0FKSVJRMEpJQUV0QUFKQkxVY05DU0FCTFFBRFFTMUdEUXNNQ1F0QlBpRUZBa0FDUUNBQkxRQUJRVDFyRGdJQUFRb0xJQUlnQVVFQ2FqWUNEQ0FFUVoxL05nSUFEQkVMQWtBQ1FBSkFJQUV0QUFKQlBXc09BZ0VBQWdzZ0FTMEFBMEU5UmdSQUlBSWdBVUVFYWpZQ0RDQUVRWXgvTmdJQURCTUxJQUlnQVVFRGFqWUNEQ0FFUVpsL05nSUFEQklMSUFJZ0FVRURhallDRENBRVFZdC9OZ0lBREJFTElBSWdBVUVDYWpZQ0RDQUVRWmgvTmdJQURCQUxRVDBoQlFKQUFrQWdBUzBBQVVFOWF3NENBQUVKQ3lBQkxRQUNRVDFHQkVBZ0FpQUJRUU5xTmdJTUlBUkJuMzgyQWdBTUVRc2dBaUFCUVFKcU5nSU1JQVJCbm44MkFnQU1FQXNnQWlBQlFRSnFOZ0lNSUFSQnBuODJBZ0FNRHd0QklTRUZJQUV0QUFGQlBVY05CaUFCTFFBQ1FUMUdCRUFnQWlBQlFRTnFOZ0lNSUFSQm9YODJBZ0FNRHdzZ0FpQUJRUUpxTmdJTUlBUkJvSDgyQWdBTURndEJKaUVGSUFFdEFBRWlBMEVtUndSQUlBTkJQVWNOQmlBQ0lBRkJBbW8yQWd3Z0JFR05mellDQUF3T0N5QUJMUUFDUVQxR0JFQWdBaUFCUVFOcU5nSU1JQVJCa244MkFnQU1EZ3NnQWlBQlFRSnFOZ0lNSUFSQm9uODJBZ0FNRFFzQ1FDQUJMUUFCSWdOQjNnQkhCRUFnQTBFOVJ3MEJJQUlnQVVFQ2FqWUNEQ0FBS0FKQUxRQnVRUVJ4QkVBZ0JFR1FmellDQUF3UEN5QUVRWTUvTmdJQURBNExJQUV0QUFKQlBVWUVRQ0FDSUFGQkEybzJBZ3dnQkVHT2Z6WUNBQXdPQ3lBQ0lBRkJBbW8yQWd3Z0JFSGVBRFlDQUF3TkN5QUNJQUZCQVdvMkFnd2dBQ2dDUUMwQWJrRUVjUVJBSUFSQnBIODJBZ0FNRFFzZ0JFSGVBRFlDQUF3TUMwSDhBQ0VGSUFFdEFBRWlBMEg4QUVjRVFDQURRVDFIRFFRZ0FpQUJRUUpxTmdJTUlBUkJqMzgyQWdBTURBc2dBUzBBQWtFOVJnUkFJQUlnQVVFRGFqWUNEQ0FFUVpOL05nSUFEQXdMSUFJZ0FVRUNhallDRENBRVFhTi9OZ0lBREFzTFFUOGhCU0FCTFFBQklnTkJMa2NFUUNBRFFUOUhEUU1nQVMwQUFrRTlSZ1JBSUFJZ0FVRURhallDRENBRVFaUi9OZ0lBREF3TElBSWdBVUVDYWpZQ0RDQUVRYWgvTmdJQURBc0xJQUV0QUFKQk1HdEIvd0Z4UVFwSkRRSWdBaUFCUVFKcU5nSU1JQVJCcVg4MkFnQU1DZ3NnQlVFQVRnMEJJQUZCQmlBQ1FReHFFRmdpQmtGK2NVR293QUJHQkVBZ0FDZ0NDQ0VEREFzTElBWVFod01OQ3lBR0VPOENCRUFnQWtFQU5nSUlEQWNMSUFCQjBjTUFRUUFRRmd3SEN5QURRVEJyUWY4QmNVRUtTUTBFQ3lBRUlBVkIvd0Z4TmdJQUlBSWdBVUVCYWpZQ0RBd0hDeUFBSUFaQkFTQUJRUUZxSUFRZ0FrRU1haER6QWtVTkJnd0VDMEVCQ3lFREEwQUNmd0pBQWtBQ1FBSkFJQU5GQkVBZ0FpQUJOZ0lNREFFTElBRXRBQUFpQTBVTkFnSkFJQU5CQ21zT0JBMEFBQTBBQ3lBRHdFRUFUZzBESUFGQkJpQUNRUXhxRUZnaUEwRitjVUdvd0FCR0RRd2dBaWdDRENFQklBTkJmMFlOQVF0QkFTRUREQVFMSUFGQkFXb01BZ3NnQVNBQUtBSThUdzBKQ3lBQlFRRnFDeUVCUVFBaEF3d0FDd0FMSUFBb0FrQXRBRzRoQXlBQVFTaHFJZ1ZCQURZQ0FBSkFJQUFvQWdBZ0FTQUNRUXhxUVFCQjlBWkI5QUFnQTBFRWNSc2dCUkMzQlNJSFFvQ0FnSUJ3Z3lJSVFvQ0FnSURBZmxJRVFDQUlRb0NBZ0lEZ0FGRU5BeUFDS0FJTVFRWWdBa0VJYWhCWUVNVUJSUTBCQ3lBQUtBSUFJQWNRRHlBQVFkWFZBRUVBRUJZTUFnc2dBQ0FITndNZ0lBQkJnSDgyQWhBTUF3c2dBQ0FDUVF4cUlBSkJDR29nQmtFQUVPb0VJZ0ZGRFFBZ0FDQUJOZ0lnSUFJb0FnZ2hCU0FBUVFBMkFpZ2dBQ0FGTmdJa0FrQWdBVUVsU1EwQUlBRkJMVTBFUUNBQUtBSkFJZ010QUc1QkFYRU5BU0FCUVMxSERRTWdBeThCYkNJR1FRRnhEUUVnQmtHQS9nTnhRWUFHUncwRElBTW9BbVFOQXlBREtBSUVJZ05GRFFNZ0F5MEFiRUVCY1EwQkRBTUxJQUZCTGtjTkFpQUFLQUpFRFFBZ0FDZ0NRQ0lETHdGc0lnWkJBbkVOQUNBR1FZRCtBM0ZCZ0FaSERRSWdBeWdDWkEwQ0lBTW9BZ1FpQTBVTkFpQURMUUJzUVFKeFJRMENDeUFGQkVBZ0FFR0RmellDRUNBQVFRRTJBaWdNQXdzZ0JDQUJRZFFBYXpZQ0FBd0NDeUFFUWFwL05nSUFEQVVMSUFSQmczODJBZ0FMSUFBZ0FpZ0NERFlDT0VFQURBUUxJQUJCQVRZQ01DQUFJQU5CQVdvMkFnZ0xJQUlvQWd3aEFRd0FDd0FMUVg4TElRRWdBa0VRYWlRQUlBRUxGUUFnQVVIZUFVNEVRQ0FBS0FJUUlBRVE2QVVMQzdvSEFnWi9BWDRqQUVFZ2F5SUhKQUJDZ0lDQWdPQUFJUXNDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQlFpQ0lweUlHUVFGcURnZ0RCUVVBQVFVRkNRSUxJQUFnQWtHSDFBQVFqd0VNQmdzZ0FDQUNRZmY0QUJDUEFRd0ZDeUFHUVhsR0RRRU1BZ3NnQWFjaEJnd0NDeUFCcHlFR0lBSkJBRWdFUUNBQ1FmLy8vLzhIY1NJRklBWXBBZ1FpQzZkQi8vLy8vd2R4VHcwQklBWkJFR29oQWlBQUFuOGdDMEtBZ0lDQUNJTlFSUVJBSUFJZ0JVRUJkR292QVFBTUFRc2dBaUFGYWkwQUFBdEIvLzhEY1JDZkF5RUxEQVVMSUFKQk1FY05BQ0FHS1FJRVF2Ly8vLzhIZ3lFTERBUUxJQUFnQVJDTkJLY2lCa1VOQWdzZ0FrSC8vLy8vQjNFaENRTkFJQVlvQWhBaUJVRXdhaUVLSUFVZ0JTZ0NHQ0FDY1VGL2MwRUNkR29vQWdBaEJRSkFBMEFnQlVVTkFTQUNJQW9nQlVFQmEwRURkQ0lGYWlJSUtBSUVSd1JBSUFnb0FnQkIvLy8vSDNFaEJRd0JDd3NnQmlnQ0ZDQUZhaUVGQWtBQ1FBSkFBa0FnQ0NnQ0FFRWVka0VCYXc0REFBRUNBd3NnQlNnQ0FDSUNSUTBHSUFJZ0FpZ0NBRUVCYWpZQ0FDQUFJQUt0UW9DQWdJQndoQ0FEUVFCQkFCQXZJUXNNQndzZ0JTZ0NBQ2dDRUNrREFDSUxRb0NBZ0lCd2cwS0FnSUNBd0FCUkJFQWdBQ0FDRU5rQkRBVUxJQXRDSUlpblFYVkpEUVlnQzZjaUFDQUFLQUlBUVFGcU5nSUFEQVlMSUFBZ0JpQUNJQVVnQ0JESUFrVU5BZ3dEQ3lBRktRTUFJZ3RDSUlpblFYVkpEUVFnQzZjaUFDQUFLQUlBUVFGcU5nSUFEQVFMQWtBZ0JpMEFCU0lGUVFSeFJRMEFJQVZCQ0hFRVFDQUNRUUJJQkVBZ0JpZ0NLQ0FKU3dSQUlBQWdCcTFDZ0lDQWdIQ0VJQWtRc0FFaEN3d0hDeUFHTHdFR1FTQnJRZi8vQTNGQjlmOERUdzBGREFJTElBWXZBUVpCRld0Qi8vOERjVUVLU3cwQklBQWdBaENlQXlJRlJRMEJRb0NBZ0lEZ0FFS0FnSUNBTUNBRlFRQklHeUVMREFVTElBQW9BaEFvQWtRZ0JpOEJCa0VZYkdvb0FoUWlCVVVOQUNBRktBSVVJZ2dFUUNBR0lBWW9BZ0JCQVdvMkFnQWdBQ0FHclVLQWdJQ0FjSVFpQVNBQ0lBTWdDQkV1QUNFTElBQWdBUkFQREFVTElBVW9BZ0FpQlVVTkFDQUdJQVlvQWdCQkFXbzJBZ0FnQUNBSElBYXRRb0NBZ0lCd2hDSUJJQUlnQlJFWEFDRUZJQUFnQVJBUElBVkJBRWdOQWlBRlJRMEFJQWN0QUFCQkVIRUVRQ0FBSUFjcEF4Z1FEeUFBSUFjcEF4QWdBMEVBUVFBUUx5RUxEQVVMSUFjcEF3Z2hDd3dFQ3lBR0tBSVFLQUlzSWdZTkFBdENnSUNBZ0RBaEN5QUVSUTBDSUFBZ0FoREhBZ3RDZ0lDQWdPQUFJUXNNQVF0Q2dJQ0FnREFoQ3dzZ0IwRWdhaVFBSUFzTERRQWdBQ0FCSUFKQkJCRE9BZ3RmQVFOL0l3QkJFR3NpQkNRQUlBQW9BZ0FoQXlBRUlBSTJBZ3dnQTBFRElBRWdBa0VBRVBBRklBTWdBeWdDRUNrRGdBRWdBQ2dDRENBQUtBSUlJQUFvQWtBaUFRUi9JQUVvQW1oQkFFZEJBWFFGUVFBTEVNb0NJQVJCRUdva0FBc01BQ0FBUVlBQ2FpQUJFQ29MS3dBZ0FVSGVBVTRFUUNBQUtBSVFLQUk0SUFGQkFuUnFLQUlBSWdBZ0FDZ0NBRUVCYWpZQ0FBc2dBUXNwQUNBQUlBRWdBaUFEUW9DQWdJQXdRb0NBZ0lBd0lBUkJnTTRBY2hCdElRSWdBQ0FERUE4Z0Fnc1pBQ0FBS0FJQUlBRVFHQ0VCSUFCQlFHc29BZ0FnQVJBNUN5MEJBWDhDUUNBQUtBSUFJZ0ZGRFFBZ0FDZ0NFQ0lBUlEwQUlBRW9BZ0FnQUVFQUlBRW9BZ1FSQVFBYUN3dGNBUUYvSUFCQlFHc29BZ0FpQXhEbUFrVUVRRUYvRHdzZ0FrRUFTQVJBSUFNUU1pRUNDeUFBSUFGQi93RnhFQkFnQUVGQWF5SUFLQUlBSUFJUU9TQUFLQUlBS0FLa0FpQUNRUlJzYWlJQUlBQW9BZ0JCQVdvMkFnQWdBZ3NtQVFGL0l3QkJFR3NpQWlRQUlBSWdBVFlDRENBQUlBSkJER3BCQkJCeUlBSkJFR29rQUFzNUFDQUJRUUJPQkVBZ0FFRzJBUkFRSUFCQlFHc2lBQ2dDQUNBQkVEa2dBQ2dDQUNJQUtBS2tBaUFCUVJSc2FpQUFLQUtFQWpZQ0JBc0xNd0VCZnlBQ0JFQWdBQ0VEQTBBZ0F5QUJMUUFBT2dBQUlBTkJBV29oQXlBQlFRRnFJUUVnQWtFQmF5SUNEUUFMQ3lBQUN4Z0JBWDRnQVNrREFDRURJQUVnQWpjREFDQUFJQU1RRHdzWEFDQUFJQUVnQWtLQWdJQ0FNQ0FESUFSQkFoRFlBUXZBQlFJQ2ZnWi9Jd0JCNEFCcklna2tBQ0FEUVFBZ0EwRUFTaHNoQ3dOQUlBb2dDMFpGQkVBZ0FDQUNJQXBCQkhScUlnTW9BZ0FRdEFVaEJpQURMUUFFSVFkQ2dJQ0FnREFoQkFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBTXRBQVVPQ2dFQ0FnVUhBd1FJQlFBR0N5QUFJQU1vQWdnUXRBVWhDQUorQWtBQ1FBSkFJQU1vQWd4QkFXb09Bd0lBQVFrTElBQWdBQ2tEd0FFaUJDQUlJQVJCQUJBVURBSUxJQUFnQUNnQ0tDa0RFQ0lFSUFnZ0JFRUFFQlFNQVFzZ0FDQUJJQWdnQVVFQUVCUUxJUVFnQUNBSUVCTWdCa0hRQVVZRVFFRUJJUWNNQ0FzZ0JrSFpBVWNOQjBFQUlRY01Cd3NDUUNBR1FkQUJSZ1JBUVFFaEJ3d0JDeUFHUWRrQlJ3MEFRUUFoQndzZ0FDQUJJQVpCQWlBRElBY1FsUU1hREFjTFFvQ0FnSUF3SVFVZ0F5Z0NDQVJBSUFrZ0F5Z0NBRFlDRUNBSlFTQnFJZ2hCd0FCQnpEd2dDVUVRYWhCT0dpQUFJQU1vQWdnZ0NFRUFRUXBCQ0NBRExRQUZRUUpHR3lBRExnRUdFSUlCSVFVTElBTW9BZ3dFUUNBSklBTW9BZ0EyQWdBZ0NVRWdhaUlJUWNBQVFjVThJQWtRVGhvZ0FDQURLQUlNSUFoQkFVRUxRUWtnQXkwQUJVRUNSaHNnQXk0QkJoQ0NBU0VFQ3lBQUlBRWdCa0tBZ0lDQU1DQUZJQVFnQjBHQU9uSVFiUm9nQUNBRkVBOGdBQ0FFRUE4TUJnc2dBeWtEQ0NJRVFvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBRVF2Ly8vLzhQZ3lFRURBVUxRb0NBZ0lEQWZpQUV1YjBpQkVLQWdJQ0F3SUdBL1A4QWZTQUVRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d5RUVEQVFMUW9DQWdJREFmaUFES1FNSUlnUkNnSUNBZ01DQmdQei9BSDBnQkVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNoQkF3REN5QUFJQUVnQmtFQ0lBTWdCeENWQXhvTUF3c1FBUUFMSUFNMUFnZ2hCQXNnQUNBQklBWWdCQ0FIRUJrYUN5QUFJQVlRRXlBS1FRRnFJUW9NQVFzTElBbEI0QUJxSkFBTE1nRUJmd0pBSUFGQ0lJaW5RWFZKRFFBZ0FhY2lBaUFDS0FJQUlnSkJBV3MyQWdBZ0FrRUJTZzBBSUFBZ0FSQ1dCQXNMQ3dBZ0FFR0FNVUVBRUJVTG9nSUNBbjRCZndKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQkJCeUFCUWlDSXB5SUVJQVJCQjJ0QmJra2JRUXRxRGhNRUFnTUlCZ0FBQUFBQUFRVUhBQUFBQUFFRkFBc2dBRUdWTUVFQUVCVkNnSUNBZ09BQUR3c2dCRUYxU1EwSUlBR25JZ0FnQUNnQ0FFRUJhallDQUF3SUN5QUFRU0VRZGlFQ0RBWUxJQUJCSWhCMklRSU1CUXNnQUVFa0VIWWhBZ3dFQ3lBQVFRUVFkaUVDREFNTElBQWdBRUVGRUhZaUFrRXdJQUduS1FJRVF2Ly8vLzhIZzBFQUVCa2FEQUlMSUFCQkJoQjJJUUlNQVFzZ0FFRUhFSFloQWd0Q2dJQ0FnT0FBSVFNZ0FrS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSK0lBUkJkVThFUUNBQnB5SUVJQVFvQWdCQkFXbzJBZ0FMSUFBZ0FpQUJFTnNCSUFJRlFvQ0FnSURnQUFzUEN5QUJDOWtCQWdKL0FYNUJmeUVDQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FCUWlDSXB5SURRUXRxRGhJSEJ3Y0ZBZ1VGQlFVRkJBQUJBUUVGQlFZRkN5QUJwMEVBUnc4TElBR25Ed3NnQWFjcEFnUWhCQ0FBSUFFUUR5QUVRdi8vLy84SGcwSUFVZzhMQUFzZ0FhY3NBQVVoQWlBQUlBRVFEeUFDUVFCT0R3c2dBMEVIYTBGdFRRUkFJQUZDZ0lDQWdNQ0JnUHovQUh4Qy8vLy8vLy8vLy8vL0FJTkNBWDFDZ0lDQWdJQ0FnUGovQUZRUEN5QUFJQUVRRDBFQklRSUxJQUlQQ3lBQnB5Z0NEQ0VDSUFBZ0FSQVBJQUpCLy8vLy93ZHFRWDVKQzZnRUFRdC9JQUFvQWdBaEJTTUFRUkJySWdnZ0FqWUNERUYvSVFrQ1FBTkFBa0FnQ0NBQ0lnTkJCR29pQWpZQ0RDQURLQUlBSWdkQmYwWU5BQ0FBS0FJRUlRb0RRQ0FCSWdRZ0NrNE5BeUFFSUFRZ0JXb2lEQzBBQUNJR1FRSjBJZzFCZ0xnQmFpMEFBR29pQVNBS1NnMERJQVpCd2dGR0JFQWdEQ2dBQVNFSkRBRUxDeUFHSUFkSEJFQWdCaUFIUWY4QmNVWWdCaUFIUVFoMlFmOEJjVVp5SUFZZ0IwRVFka0gvQVhGR2NrVWdCMEVZZGlBR1IzRWdCa1VnQjBHQUFrbHljZzBESUFBZ0JqWUNFQXNnQkVFQmFpRUVBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQU5RWU80QVdvdEFBQkJCV3NPR0FBSkFBa0pBUWtKQVFrSkFRRUJBZ0lDQWdRRkJnY0pBd2tMSUFRZ0JXb3RBQUFoQkNBSUlBTkJDR29pQWpZQ0RDQURLQUlFSWdOQmYwWUVRQ0FBSUFRMkFoUU1DUXNnQXlBRVJnMElEQWtMSUFRZ0JXb3ZBQUFoQkNBSUlBTkJDR29pQWpZQ0RDQURLQUlFSWdOQmYwWUVRQ0FBSUFRMkFoUU1DQXNnQXlBRVJnMEhEQWdMSUFBZ0JDQUZhaWdBQURZQ0dBd0dDeUFBSUFRZ0JXb2lBeWdBQURZQ0dDQUFJQU12QUFRMkFod01CUXNnQUNBRUlBVnFLQUFBTmdJZ0RBUUxJQUFnQkNBRmFpSURLQUFBTmdJZ0lBQWdBeTBBQkRZQ0hBd0RDeUFBSUFRZ0JXb2lBeWdBQURZQ0lDQUFJQU12QUFRMkFod01BZ3NnQUNBRUlBVnFJZ01vQUFBMkFpQWdBQ0FES0FBRU5nSVlJQUFnQXkwQUNEWUNIQXdCQ3dzZ0FDQUpOZ0lNSUFBZ0FUWUNDRUVCSVFzTElBc0xDd0FnQUNBQlFRQVFqZ1FMSkFFQmZ5QUFLQUlRSWdKQkVHb2dBU0FDS0FJQUVRTUFJZ0ZGQkVBZ0FCQjhDeUFCQ3lZQkFYOGpBRUVRYXlJQ0pBQWdBaUFCT3dFT0lBQWdBa0VPYWtFQ0VISWdBa0VRYWlRQUN5a0JBWDhnQWdSQUlBQWhBd05BSUFNZ0FUb0FBQ0FEUVFGcUlRTWdBa0VCYXlJQ0RRQUxDeUFBQ3o4QkFYOGpBRUVRYXlJQ0pBQUNmeUFCSUFBb0FoQkhCRUFnQWlBQk5nSUFJQUJCb0pnQklBSVFGa0YvREFFTElBQVFFZ3NoQUNBQ1FSQnFKQUFnQUFzTEFDQUFJQUZCQVJEbUJRdkRDZ0lGZnc5K0l3QkI0QUJySWdVa0FDQUVRdi8vLy8vLy96K0RJUXdnQWlBRWhVS0FnSUNBZ0lDQWdJQi9neUVLSUFKQy8vLy8vLy8vUDRNaURVSWdpQ0VPSUFSQ01JaW5RZi8vQVhFaEJ3SkFBa0FnQWtJd2lLZEIvLzhCY1NJSlFmLy9BV3RCZ29CK1R3UkFJQWRCLy84QmEwR0JnSDVMRFFFTElBRlFJQUpDLy8vLy8vLy8vLy8vQUlNaUMwS0FnSUNBZ0lEQS8vOEFWQ0FMUW9DQWdJQ0FnTUQvL3dCUkcwVUVRQ0FDUW9DQWdJQ0FnQ0NFSVFvTUFnc2dBMUFnQkVMLy8vLy8vLy8vLy84QWd5SUNRb0NBZ0lDQWdNRC8vd0JVSUFKQ2dJQ0FnSUNBd1AvL0FGRWJSUVJBSUFSQ2dJQ0FnSUNBSUlRaENpQURJUUVNQWdzZ0FTQUxRb0NBZ0lDQWdNRC8vd0NGaEZBRVFDQUNJQU9FVUFSQVFvQ0FnSUNBZ09ELy93QWhDa0lBSVFFTUF3c2dDa0tBZ0lDQWdJREEvLzhBaENFS1FnQWhBUXdDQ3lBRElBSkNnSUNBZ0lDQXdQLy9BSVdFVUFSQUlBRWdDNFFoQWtJQUlRRWdBbEFFUUVLQWdJQ0FnSURnLy84QUlRb01Bd3NnQ2tLQWdJQ0FnSURBLy84QWhDRUtEQUlMSUFFZ0M0UlFCRUJDQUNFQkRBSUxJQUlnQTRSUUJFQkNBQ0VCREFJTElBdEMvLy8vLy8vL1AxZ0VRQ0FGUWRBQWFpQUJJQTBnQVNBTklBMVFJZ1liZVNBR1FRWjByWHluSWdaQkQyc1FaMEVRSUFacklRWWdCU2tEV0NJTlFpQ0lJUTRnQlNrRFVDRUJDeUFDUXYvLy8vLy8vejlXRFFBZ0JVRkFheUFESUF3Z0F5QU1JQXhRSWdnYmVTQUlRUVowclh5bklnaEJEMnNRWnlBR0lBaHJRUkJxSVFZZ0JTa0RTQ0VNSUFVcEEwQWhBd3NnQTBJUGhpSUxRb0NBL3Y4UGd5SUNJQUZDSUlnaUJINGlFQ0FMUWlDSUloTWdBVUwvLy8vL0Q0TWlBWDU4SWc5Q0lJWWlFU0FCSUFKK2ZDSUxJQkZVclNBQ0lBMUMvLy8vL3crRElnMStJaFVnQkNBVGZud2lFU0FNUWcrR0loSWdBMEl4aUlSQy8vLy8vdytESWdNZ0FYNThJaFFnRHlBUVZLMUNJSVlnRDBJZ2lJUjhJZzhnQWlBT1FvQ0FCSVFpREg0aUZpQU5JQk4rZkNJT0lCSkNJSWhDZ0lDQWdBaUVJZ0lnQVg1OEloQWdBeUFFZm53aUVrSWdobndpRjN3aEFTQUhJQWxxSUFacVFmLy9BR3NoQmdKQUlBSWdCSDRpR0NBTUlCTitmQ0lFSUJoVXJTQUVJQVFnQXlBTmZud2lCRmF0ZkNBQ0lBeCtmQ0FFSUFRZ0VTQVZWSzBnRVNBVVZxMThmQ0lFVnExOElBTWdESDRpQXlBQ0lBMStmQ0lDSUFOVXJVSWdoaUFDUWlDSWhId2dCQ0FDUWlDR2ZDSUNJQVJVclh3Z0FpQUNJQkFnRWxhdElBNGdGbFN0SUE0Z0VGYXRmSHhDSUlZZ0VrSWdpSVI4SWdKV3JYd2dBaUFDSUE4Z0ZGU3RJQThnRjFhdGZId2lBbGF0ZkNJRVFvQ0FnSUNBZ01BQWcxQkZCRUFnQmtFQmFpRUdEQUVMSUF0Q1A0Z2hBeUFFUWdHR0lBSkNQNGlFSVFRZ0FrSUJoaUFCUWorSWhDRUNJQXRDQVlZaEN5QURJQUZDQVlhRUlRRUxJQVpCLy84QlRnUkFJQXBDZ0lDQWdJQ0F3UC8vQUlRaENrSUFJUUVNQVFzQ2ZpQUdRUUJNQkVCQkFTQUdheUlIUWY4QVRRUkFJQVZCTUdvZ0N5QUJJQVpCL3dCcUlnWVFaeUFGUVNCcUlBSWdCQ0FHRUdjZ0JVRVFhaUFMSUFFZ0J4Q09BaUFGSUFJZ0JDQUhFSTRDSUFVcEF6QWdCU2tET0lSQ0FGS3RJQVVwQXlBZ0JTa0RFSVNFSVFzZ0JTa0RLQ0FGS1FNWWhDRUJJQVVwQXdBaEFpQUZLUU1JREFJTFFnQWhBUXdDQ3lBRVF2Ly8vLy8vL3orRElBYXRRakNHaEFzZ0NvUWhDaUFMVUNBQlFnQlpJQUZDZ0lDQWdJQ0FnSUNBZjFFYlJRUkFJQW9nQWtJQmZDSUJVSzE4SVFvTUFRc2dDeUFCUW9DQWdJQ0FnSUNBZ0grRmhGQkZCRUFnQWlFQkRBRUxJQW9nQWlBQ1FnR0RmQ0lCSUFKVXJYd2hDZ3NnQUNBQk53TUFJQUFnQ2pjRENDQUZRZUFBYWlRQUN5RUFJQUFnQVNBQ1FvQ0FnSUF3SUFNZ0JFRUNFTmdCSVFJZ0FDQUJFQThnQWd1bUFRRUVmeUFBUVFBMkFnUWdBVkFFUUNBQVFZQ0FnSUI0TmdJSUlBQkJBQkJCR2tFQUR3c0NRQ0FCUXYvLy8vOFBXQVJBSUFCQkFSQkJEUUVnQUNnQ0VDQUJJQUduWnlJQ3JZWStBZ0FnQUVFZ0lBSnJOZ0lJUVFBUEN5QUFRUUlRUVEwQUlBQW9BaEFpQXlBQnB5SUVJQUZDSUlpbklnVm5JZ0owTmdJQUlBTWdCU0FDZENBRVFTQWdBbXQyY2pZQ0JDQUFRY0FBSUFKck5nSUlRUUFQQ3lBQUVEVkJJQXQvQWdKL0FYNGdBVUlnaUtjaUF5QUJweUlDUVFCSWNrVUVRQ0FDUVlDQWdJQjRjZzhMSUFOQmVFWUVRQ0FBSUFBb0FoQWdBaERCQWhBWUR3c2dBQ0FCRUlNRUlnRkNnSUNBZ0hDRElnUkNnSUNBZ09BQVVRUkFRUUFQQ3lBRVFvQ0FnSUNBZjFFRVFDQUFLQUlRSUFFUWpRSVBDeUFBS0FJUUlBR25FUHdEQ3drQUlBQkJmeERJQXd0cUFRSi9Ba0FnQUNnQzJBSWlBMFVOQUNBQUtBTGdBaUlFSUFBb0F0d0NUZzBBSUFBb0F1Z0NJQUZMRFFBZ0FDZ0M1QUlnQWtZTkFDQURJQVJCQTNScUlnTWdBallDQkNBRElBRTJBZ0FnQUNBQk5nTG9BaUFBSUFSQkFXbzJBdUFDSUFBZ0FqWUM1QUlMQ3hBQUlBQWdBQ2dDS0NrRENFRUJFRWtMR1FBZ0FFRUFFRUVhSUFCQ2dJQ0FnUEQvLy8vL0FEY0NCQXVEQWdJRGZ3RitRb0NBZ0lEZ0FDRUVJQUFvQWhRRWZrS0FnSUNBNEFBRklBQW9BZ1FoQVNBQUtBSUlJZ0pGQkVBZ0FDZ0NBQ2dDRUNJQ1FSQnFJQUVnQWlnQ0JCRUFBQ0FBUVFBMkFnUWdBQ2dDQUVFdkVDMFBDeUFBS0FJTUlBSktCRUFnQUNnQ0FDZ0NFQ0lEUVJCcUlBRWdBaUFBS0FJUUlnRjBJQUZyUVJGcUlBTW9BZ2dSQVFBaUFVVUVRQ0FBS0FJRUlRRUxJQUFnQVRZQ0JBc2dBU0FBS0FJUUlnSUVmeUFDQlNBQklBQW9BZ2hxUVFBNkFCQWdBQ2dDRUF0QkgzU3RJQUVwQWdSQy8vLy8vM2VEaENJRU53SUVJQUVnQkVLQWdJQ0FlSU1nQURVQ0NFTC8vLy8vQjRPRU53SUVJQUJCQURZQ0JDQUJyVUtBZ0lDQWtIK0VDd3NVQVFGK0lBQWdBUkFvSVFJZ0FDQUJFQThnQWd0TEFRSi9JQUZDZ0lDQWdIQmFCSDhnQWFjaUF5OEJCaUlDUVExR0JFQkJBUThMSUFKQk1FWUVRQ0FES0FJZ0xRQVFEd3NnQUNnQ0VDZ0NSQ0FDUVJoc2FpZ0NFRUVBUndWQkFBc0xEQUFnQUVHQUFtb2dBUkFkQ3l3QkFYOGpBRUVRYXlJREpBQWdBeUFDTmdJTUlBQkIzQUJxUVlBQklBRWdBaERMQWhvZ0EwRVFhaVFBQzJrQkFuOENmeUFBS0FJSUlnSWdBQ2dDREU0RVFFRi9JQUFnQWtFQmFpQUJFTGNDRFFFYUlBQW9BZ2doQWdzZ0FDQUNRUUZxTmdJSUlBQW9BZ1JCRUdvaEF3SkFJQUFvQWhBRVFDQURJQUpCQVhScUlBRTdBUUFNQVFzZ0FpQURhaUFCT2dBQUMwRUFDd3MxQUNBQUlBSkJNQ0FDUVFBUUZDSUNRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBVUlBTndNQVFYOFBDeUFBSUFFZ0FoQ2pBUXNOQUNBQUlBRWdBa0VBRUlvREN4OEJBWDhnQUNnQ0pDSUJJQUVvQWdCQkFXbzJBZ0FnQUNBQlFRSVE3d1VMYVFFRGZ3SkFJQUFpQVVFRGNRUkFBMEFnQVMwQUFFVU5BaUFCUVFGcUlnRkJBM0VOQUFzTEEwQWdBU0lDUVFScUlRRWdBaWdDQUNJRFFYOXpJQU5CZ1lLRUNHdHhRWUNCZ29SNGNVVU5BQXNEUUNBQ0lnRkJBV29oQWlBQkxRQUFEUUFMQ3lBQklBQnJDeDhBSUFBZ0FTQUFJQUlRcWdFaUFpQURRWUNBQVJEUUFSb2dBQ0FDRUJNTFR3RUJmd0ovUVFBZ0FDZ0NEQ0FCUmcwQUdpQUFLQUlBSWdJb0FnQWdBQ2dDRUNBQlFRSjBJQUlvQWdRUkFRQWhBaUFCQkVCQmZ5QUNSUTBCR2dzZ0FDQUJOZ0lNSUFBZ0FqWUNFRUVBQ3dzb0FRRi9JQUpDSUlpblFYVlBCRUFnQXFjaUF5QURLQUlBUVFGcU5nSUFDeUFBSUFFZ0FoQnVDN0lFQVFoL0l3QkJJR3NpQnlRQUlBRWdBaUFCS0FJTUlBSW9BZ3hKSWdZYklnZ29BZ1FnQWlBQklBWWJJZ2tvQWdSeklRb0NRQUpBSUFnb0Fnd2lBa1VFUUFKQUlBa29BZ2dpQVVILy8vLy9CMGNFUUNBSUtBSUlJZ0pCLy8vLy93ZEhEUUVMSUFBUU5VRUFJUUlNQXdzZ0FVSCsvLy8vQjBjZ0FrSCsvLy8vQjBkeFJRUkFBa0FnQVVIKy8vLy9CMFlFUUNBQ1FZQ0FnSUI0UmcwQkRBUUxJQUZCZ0lDQWdIaEhJQUpCL3YvLy93ZEhjZzBEQ3lBQUVEVkJBU0VDREFNTElBQWdDaENKQVVFQUlRSU1BZ3NnQ1NnQ0RDSUdJUVVnQWlFQklBUkJCM0ZCQmtZRVFDQUNJQU5CSVdwQkJYWWlCU0FDSUFWSUd5RUJJQVlnQlNBRklBWktHeUVGQ3lBSUtBSVFJQUpCQW5ScUlBRkJBblJySVFzZ0NTZ0NFQ0FHUVFKMGFpQUZRUUowYXlFTUFuOENRQUpBQWtBZ0FVSGtBRThFUUVFQUlRWWdBQ2dDQUNBQUlBd2dCU0FMSUFFZ0FDQUpSaUlCUVFKeUlBRWdBQ0FJUmhzUW53WU5BUXdEQ3dKL0FrQWdBQ0FKUmcwQVFRQWhCaUFBSUFoR0RRQWdBQXdCQ3lBQUtBSUFJUUlnQjBJQU53SVlJQWRDZ0lDQWdJQ0FnSUNBZnpjQ0VDQUhJQUkyQWd3Z0FDRUdJQWRCREdvTElnSWdBU0FGYWhCQlJRMEJJQUloQUFzZ0FCQTFRU0FNQWdzZ0FpZ0NFQ0FNSUFVZ0N5QUJFSjRHSUFJaEFBc2dBQ0FLTmdJRUlBQWdDQ2dDQ0NBSktBSUlhallDQ0NBQUlBTWdCQkN6QWdzaEFpQUFJQWRCREdwSERRRWdCaUFIUVF4cUVLQUdEQUVMSUFBZ0NoQ01BVUVBSVFJTElBZEJJR29rQUNBQ0MwZ0FJQUFnQVVjRVFDQUFJQUVvQWd3UVFRUkFJQUFRTlVFZ0R3c2dBQ0FCS0FJRU5nSUVJQUFnQVNnQ0NEWUNDQ0FBS0FJUUlBRW9BaEFnQVNnQ0RFRUNkQkFmR2d0QkFBc1JBQ0FBSUFFZ0FpQURRWUNBQVJEUUFRc05BQ0FBSUFFZ0FrRUdFTTRDQ3dvQUlBQWdBVUVCRUVrTEhRQWdBQ0FCS1FNUUVBOGdBQ0FCS1FNWUVBOGdBQ0FCS1FNSUVBOExwZ0VCQTM4Z0FDZ0NFQ0lES0FMVUFTQUJwMEVBSUFGQy8vLy8vMjlXR3lJRVFZR0EzUEY1YkVILy82T09CbXNpQlVFZ0lBTW9Bc2dCYTNaQkFuUnFJUU1DUUFKQUEwQWdBeWdDQUNJREJFQUNRQ0FES0FJVUlBVkhEUUFnQXlnQ0xDQUVSdzBBSUFNb0FpQkZEUU1MSUFOQktHb2hBd3dCQ3dzZ0FDQUVRUUlReFFRaUF3MEJRb0NBZ0lEZ0FBOExJQU1nQXlnQ0FFRUJhallDQUFzZ0FDQURJQUlRN3dVTEpnRUJmd0pBSUFBb0FoQkJnMzlIRFFBZ0FDZ0NJQ0FCUncwQUlBQW9BaVJGSVFJTElBSUxPQUVCZndKQUFrQWdBVUtBZ0lDQWNGUU5BQ0FCcHlJREx3RUdJQUpIRFFBZ0F5Z0NJQ0lERFFFTElBQWdBaENHQTBFQUlRTUxJQU1MbFFVQ0EzOEJmZ0pBQWtBQ1FBSkFBa0FDUUFOQUlBSW9BaEFpQkVFd2FpRUZJQVFnQkNnQ0dDQURjVUYvYzBFQ2RHb29BZ0FoQkFOQUlBUkZEUVFnQXlBRklBUkJBV3RCQTNRaUJtb2lCQ2dDQkVjRVFDQUVLQUlBUWYvLy94OXhJUVFNQVFzTElBSW9BaFFnQm1vaEJTQUVLQUlBSVFZZ0FVVU5BU0FCUW9DQWdJQXdOd01ZSUFGQ2dJQ0FnREEzQXhBZ0FVS0FnSUNBTURjRENDQUJJQVpCR25aQkIzRWlCallDQUFKQUFrQUNRQUpBSUFRb0FnQkJIblpCQVdzT0F3QUJBZ01MSUFFZ0JrRVFjallDQUNBRktBSUFJZ0FFUUNBQUlBQW9BZ0JCQVdvMkFnQWdBU0FBclVLQWdJQ0FjSVEzQXhBTElBVW9BZ1FpQUVVTkNTQUFJQUFvQWdCQkFXbzJBZ0FnQVNBQXJVS0FnSUNBY0lRM0F4aEJBUThMSUFVb0FnQW9BaEFwQXdBaUIwS0FnSUNBY0lOQ2dJQ0FnTUFBVVEwRUlBZENJSWluUVhWUEJFQWdCNmNpQUNBQUtBSUFRUUZxTmdJQUN5QUJJQWMzQXdnTUNBc2dBQ0FDSUFNZ0JTQUVFTWdDUlEwQkRBWUxDeUFGS1FNQUlnZENJSWluUVhWUEJFQWdCNmNpQUNBQUtBSUFRUUZxTmdJQUN5QUJJQWMzQXdnTUJRdEJBU0VFSUFaQmdJQ0FnSHh4UVlDQWdJQjRSdzBDSUFVb0FnQW9BaEExQWdSQ0lJWkNnSUNBZ01BQVVnMENDeUFBSUFNUTJRRU1BZ3RCQUNFRUlBSXRBQVVpQlVFRWNVVU5BQ0FGUVFoeEJFQWdBMEVBVGcwQklBTkIvLy8vL3dkeElnTWdBaWdDS0NJRlNTRUVJQUZGSUFNZ0JVOXlEUUVnQVVLQWdJQ0FNRGNER0NBQlFvQ0FnSUF3TndNUUlBRkJCellDQUNBQklBQWdBcTFDZ0lDQWdIQ0VJQU1Rc0FFM0F3Z01Bd3NnQUNnQ0VDZ0NSQ0FDTHdFR1FSaHNhaWdDRkNJRlJRMEFJQVVvQWdBaUJVVU5BQ0FBSUFFZ0FxMUNnSUNBZ0hDRUlBTWdCUkVYQUNFRUN5QUVEd3RCZnc4TFFRRUxvUVFCQW44Q1FBSkFJQUZDZ0lDQWdIQlVJQUpDLy8vLy93OVdjZzBBSUFLbklnUWdBYWNpQXlnQ0tFOE5BQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0F5OEJCa0VDYXc0ZUFBc0xDd3NMQUFzTEN3c0xDd3NMQ3dzTEN3SUJBZ01FQlFZSENBa0tDd3NnQXlnQ0pDQUVRUU4wYWlrREFDSUJRaUNJcDBGMVNRMExJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FDQUJEd3NnQXlnQ0pDQUVhakFBQUVMLy8vLy9ENE1QQ3lBREtBSWtJQVJxTVFBQUR3c2dBeWdDSkNBRVFRRjBhaklCQUVMLy8vLy9ENE1QQ3lBREtBSWtJQVJCQVhScU13RUFEd3NnQXlnQ0pDQUVRUUowYWpVQ0FBOExJQU1vQWlRZ0JFRUNkR29vQWdBaUFFRUFUZ1JBSUFDdER3dENnSUNBZ01CK0lBQzR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkR3c2dBQ0FES0FJa0lBUkJBM1JxS1FNQUVJY0NEd3NnQUNBREtBSWtJQVJCQTNScUtRTUFFUHNERHd0Q2dJQ0FnTUIrSUFNb0FpUWdCRUVDZEdvcUFnQzd2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkR3dENnSUNBZ01CK0lBTW9BaVFnQkVFRGRHb3BBd0FpQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3OExJQUFnQWhBeElRTWdBQ0FDRUE4Z0EwVUVRRUtBZ0lDQTRBQVBDeUFBSUFFZ0F5QUJRUUFRRkNFQklBQWdBeEFUQ3lBQkN5b0JBWDhqQUVFUWF5SUVKQUFnQkNBRE5nSU1JQUFnQVNBQ0lBTVF5d0loQUNBRVFSQnFKQUFnQUF1TUFRRUNmeUFCS0FKOElnUkJnSUFFVGdSQUlBQkJqVHBCQUJCR1FYOFBDMEYvSVFNZ0FDQUJRZlFBYWtFUUlBRkIrQUJxSUFSQkFXb1FlQVIvUVg4RklBRWdBU2dDZkNJRFFRRnFOZ0o4SUFFb0FuUWdBMEVFZEdvaUEwSUFOd0lBSUFOQ0FEY0NDQ0FESUFBZ0FoQVlOZ0lBSUFNZ0F5Z0NERUdBLy8vL0IzSTJBZ3dnQVNnQ2ZFRUJhd3NMRFFBZ0FDQUJJQUpCQVJET0FndXJBZ0VFZndKQUlBSWdBMDhOQUNBRElBSnJJUVVnQVVFUWFpRUVJQUV0QUFkQmdBRnhCRUJCQUNFRElBVkJBQ0FGUVFCS0d5RUdJQVFnQWtFQmRHb2hBVUVBSVFJRFFDQUNJQVpHUlFSQUlBTWdBU0FDUVFGMGFpOEJBSEloQXlBQ1FRRnFJUUlNQVFzTEFrQWdBQ2dDQ0NBRmFpSUNJQUFvQWd3aUIwb0VRRUYvSVFRZ0FDQUNJQU1RdHdKRkRRRU1Bd3NnQUNnQ0VDQURRWUFDU0hJTkFFRi9JUVFnQUNBSEVQVUREUUlMQWtBZ0FDZ0NFRVVFUUVFQUlRSURRQ0FDSUFaR0RRSWdBQ2dDQkNBQUtBSUlJQUpxYWlBQklBSkJBWFJxTFFBQU9nQVFJQUpCQVdvaEFnd0FDd0FMSUFBb0FnUWdBQ2dDQ0VFQmRHcEJFR29nQVNBRlFRRjBFQjhhQ3lBQUlBQW9BZ2dnQldvMkFnaEJBQThMSUFBZ0FpQUVhaUFGRUlnQ0lRUUxJQVFMUndFQmZ5QUJRaUNJcDBGMVR3UkFJQUduSWdNZ0F5Z0NBRUVCYWpZQ0FBc2dBa0lnaUtkQmRVOEVRQ0FDcHlJRElBTW9BZ0JCQVdvMkFnQUxJQUFnQVNBQ1FRRVF2QUVMRndFQmYwRUlFTEVCSWdFRVFDQUJJQUEzQXdBTElBRUxHUUFnQVFSQUlBQWdBVUVRYTYxQ2dJQ0FnSkIvaEJBUEN3dUNBd0lFZndKK0FrQWdBQ2tEY0NJRlVFVWdCU0FBS1FONElBQW9BZ1FpQVNBQUtBSXNJZ0pyckh3aUJsZHhSUVJBSXdCQkVHc2lBaVFBUVg4aEFRSkFBbjhnQUNBQUtBSklJZ05CQVdzZ0EzSTJBa2dnQUNnQ0ZDQUFLQUljUndSQUlBQkJBRUVBSUFBb0FpUVJBUUFhQ3lBQVFRQTJBaHdnQUVJQU53TVFJQUFvQWdBaUEwRUVjUVJBSUFBZ0EwRWdjallDQUVGL0RBRUxJQUFnQUNnQ0xDQUFLQUl3YWlJRU5nSUlJQUFnQkRZQ0JDQURRUnQwUVI5MUN3MEFJQUFnQWtFUGFrRUJJQUFvQWlBUkFRQkJBVWNOQUNBQ0xRQVBJUUVMSUFKQkVHb2tBQ0FCSWdOQkFFNE5BU0FBS0FJRUlRRWdBQ2dDTENFQ0N5QUFRbjgzQTNBZ0FDQUJOZ0pvSUFBZ0JpQUNJQUZyckh3M0EzaEJmdzhMSUFaQ0FYd2hCaUFBS0FJRUlRRWdBQ2dDQ0NFQ0FrQWdBQ2tEY0NJRlVBMEFJQVVnQm4waUJTQUNJQUZyckZrTkFDQUJJQVduYWlFQ0N5QUFJQUkyQW1nZ0FDQUdJQUFvQWl3aUFDQUJhNng4TndONElBQWdBVThFUUNBQlFRRnJJQU02QUFBTElBTUxDUUFnQUVFQkVMWUJDMk1CQVg4Z0FrSWdpS2RCZFU4RVFDQUNweUlGSUFVb0FnQkJBV28yQWdBTEFrQWdBQ0FCSUFJUWl3VWlCUTBBQWtBZ0FTZ0NBQ0lBUVFCSUJFQWdBQ0FFYWlJQVFRQWdBRUVBU2hzaEF3d0JDeUFBSUFOTURRRUxJQUVnQXpZQ0FBc2dCUXZSQVFFR2Z5QUFRUUZxSVFVQ1FBSkFJQUF0QUFBaUE4QWlCMEVBVGdSQUlBVWhBUXdCQzBGL0lRUWdCMEZBYTBIL0FYRWlBMEU5U3cwQklBTkJBblJCNUo4RWFpZ0NBQ0lHSUFGT0RRRWdCa0VCYXlFSUlBQWdCbXBCQVdvaEFTQUhJQVpCd3A4RWFpMEFBSEVoQTBFQUlRQURRQ0FBSUFaSEJFQWdCU3dBQUNJRVFiOS9TZ1JBUVg4UEJTQUVRVDl4SUFOQkJuUnlJUU1nQUVFQmFpRUFJQVZCQVdvaEJRd0NDd0FMQzBGL0lRUWdBeUFJUVFKMFFkQ2ZCR29vQWdCSkRRRUxJQUlnQVRZQ0FDQURJUVFMSUFRTExRQWdBVUtBZ0lDQVlJTkNnSUNBZ0NCUkJFQWdBRUc3MFFCQkFCQVZRb0NBZ0lEZ0FBOExJQUFnQVJBb0MwRUJBWDhnQVFSQUEwQWdBaUFEUmtVRVFDQUFJQUVnQTBFRGRHb29BZ1FRRXlBRFFRRnFJUU1NQVFzTElBQW9BaEFpQUVFUWFpQUJJQUFvQWdRUkFBQUxDeGdBSUFBdEFBQkJJSEZGQkVBZ0FTQUNJQUFRdWdRYUN3c0xBQ0FBSUFGQkFCRG1CUXV1QWdBQ1FBSkFBa0FDUUNBQ1FRTk1CRUFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQVVIWUFHc09DUUFCQWdNRUJRWUhDQW9MSUFBZ0FrRTdhMEgvQVhFUUVROExJQUFnQWtFM2EwSC9BWEVRRVE4TElBQWdBa0V6YTBIL0FYRVFFUThMSUFBZ0FrRXZhMEgvQVhFUUVROExJQUFnQWtFcmEwSC9BWEVRRVE4TElBQWdBa0VuYTBIL0FYRVFFUThMSUFBZ0FrRWphMEgvQVhFUUVROExJQUFnQWtFZmEwSC9BWEVRRVE4TElBQWdBa0ViYTBIL0FYRVFFUThMSUFKQi93RkxEUUVDUUFKQUFrQWdBVUhZQUdzT0F3QUJBZ1FMSUFCQndnRVFFUXdGQ3lBQVFjTUJFQkVNQkFzZ0FFSEVBUkFSREFNTElBRkJJa1lOQVFzZ0FDQUJRZjhCY1JBUklBQWdBa0gvL3dOeEVDb1BDeUFBSUFKQkVtdEIvd0Z4RUJFUEN5QUFJQUpCL3dGeEVCRUxJUUFnQVNBQ1JnUkFJQUVRR3c4TElBQWdBVUVFYTYxQ2dJQ0FnUEIraEJBUEN5d0JBWDhnQUNnQ0VDSUNRUkJxSUFFZ0FpZ0NBQkVEQUNJQ0JFQWdBa0VBSUFFUUt3OExJQUFRZkNBQ0N4d0JBWDhnQUNBQkVEZ0VmMEVBQlNBQVFadk1BRUVBRUJWQmZ3c0xRd0VEZndKQUlBSkZEUUFEUUNBQUxRQUFJZ1FnQVMwQUFDSUZSZ1JBSUFGQkFXb2hBU0FBUVFGcUlRQWdBa0VCYXlJQ0RRRU1BZ3NMSUFRZ0JXc2hBd3NnQXdzTkFDQUFJQUVnQVJBL0VKTUNDMjBCQVg4akFFR0FBbXNpQlNRQUlBUkJnTUFFY1NBQ0lBTk1ja1VFUUNBRklBRkIvd0Z4SUFJZ0Eyc2lBMEdBQWlBRFFZQUNTU0lCR3hBckdpQUJSUVJBQTBBZ0FDQUZRWUFDRUZzZ0EwR0FBbXNpQTBIL0FVc05BQXNMSUFBZ0JTQURFRnNMSUFWQmdBSnFKQUFMREFBZ0FFR0FBbW9nQVJBUkM3NEJBZ0YrQVg4Q1FBSkFJQUZDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUFvQWlnZ0FrRURkR29wQXdBaUEwSWdpS2RCZEVzTkFRd0NDeUFBSUFGQk95QUJRUUFRRkNJRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0F3OExJQU5DLy8vLy8yOVdEUUVnQUNBREVBOGdBQ0FCRUlBRElnUkZCRUJDZ0lDQWdPQUFEd3NnQkNnQ0tDQUNRUU4wYWlrREFDSURRaUNJcDBGMVNRMEJDeUFEcHlJRUlBUW9BZ0JCQVdvMkFnQUxJQUFnQXlBQ0VFa2hBU0FBSUFNUUR5QUJDM1VCQVg0Z0FDQUJJQVIrSUFJZ0EzNThJQU5DSUlnaUFpQUJRaUNJSWdSK2ZDQURRdi8vLy84UGd5SURJQUZDLy8vLy93K0RJZ0YrSWdWQ0lJZ2dBeUFFZm53aUEwSWdpSHdnQVNBQ2ZpQURRdi8vLy84UGczd2lBVUlnaUh3M0F3Z2dBQ0FGUXYvLy8vOFBneUFCUWlDR2hEY0RBQXRRQVFGK0FrQWdBMEhBQUhFRVFDQUJJQU5CUUdxdGhpRUNRZ0FoQVF3QkN5QURSUTBBSUFJZ0E2MGlCSVlnQVVIQUFDQURhNjJJaENFQ0lBRWdCSVloQVFzZ0FDQUJOd01BSUFBZ0FqY0RDQXRWQVFOL0lBRWdBa0VGZFNJRVN3UkFJQUFnQkVFQ2RHb29BZ0FoQXdzZ0FrRWZjU0lDQkg4Z0FTQUVRUUZxSWdSTEJIOGdBQ0FFUVFKMGFpZ0NBQVZCQUF0QkFYUWdBa0VmYzNRZ0F5QUNkbklGSUFNTEMyUUFBa0FDUUNBQlFRQklEUUFnQUNnQ3JBSWdBVXdOQUNBQUtBS2tBaUFCUVJSc2FpSUFJQUFvQWdBZ0Ftb2lBRFlDQUNBQVFRQklEUUVnQUE4TFFZVXBRYTc4QUVISXFBRkJsTlVBRUFBQUMwR21qZ0ZCcnZ3QVFjdW9BVUdVMVFBUUFBQUxZQUFnQUNBQklBSkNnSUNBZ0FoOFF2Ly8vLzhQV0FSK0lBSkMvLy8vL3crREJVS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElBTkJoNEFCRUwwQkN3d0FJQUJCaHZzQVFRQVFGUXNMQUNBQUlBRkJBUkRCQlF2U0VBSU1md0YrSXdCQkVHc2lDaVFBQWtBQ1FDQUJRdi8vLy85dldBUkFJQUFRSkF3QkN5QUdRWUF3Y1NJT1JTQUdJQVpCQ0hZaUVIRWdFRUYvYzNKQkIzRWlFVUVIUm5FaEVpQUdRWURBQUhFaERDQUNRZi8vLy84SGNTRU5JQUduSVFrQ1FBSkFBa0FDUUFKQUEwQWdDU2dDRUNJSFFUQnFJUWdnQnlBSEtBSVlJQUp4UVg5elFRSjBhaWdDQUNFSEFrQURRQ0FIUlEwQklBSWdDQ0FIUVFGclFRTjBJZ3RxSWdjb0FnUkhCRUFnQnlnQ0FFSC8vLzhmY1NFSERBRUxDeUFKS0FJVUlBdHFJUWdnQ2lBSE5nSU1JQXhGSUFjb0FnQWlDMEdBZ0lDQUFuRkZja1VFUUNBRFFpQ0lwMEYxVHdSQUlBT25JZ2NnQnlnQ0FFRUJhallDQUFzZ0FDQUtRUWhxSUFOQkFCRENBZzBJQW40Z0NpZ0NDQ0lIUVFCT0JFQWdCNjBNQVF0Q2dJQ0FnTUIrSUFlNHZTSURRb0NBZ0lEQWdZRDgvd0I5SUFOQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3lFRElBa29BaEFpQjBFd2FpRUlJQWNnQnlnQ0dDQUNjVUYvYzBFQ2RHb29BZ0FoQndKQUEwQWdCd1JBSUFnZ0IwRUJhMEVEZENJTGFpSUhLQUlFSUFKR0RRSWdCeWdDQUVILy8vOGZjU0VIREFFTEMwSDRnd0ZCcnZ3QVFkakdBRUhQSEJBQUFBc2dDU2dDRkNBTGFpRUlJQW9nQnpZQ0RDQUhLQUlBSVFzTElBdEJHbllpRHlBR0VKTURSUTBHSUE5Qk1IRWlEMEV3UmdSQUlBQWdDU0FDSUFnZ0J4RElBa1VOQWd3SUN5QUdRWUQwQUhGRkRRVWdEZ1JBSUFTbklnMUJBQ0FBSUFRUU9Cc2hBaUFGcHlJT1FRQWdBQ0FGRURnYklRd0NRQ0FMUVlDQWdJQjhjVUdBZ0lDQUJFY0VRRUYvSVFjZ0FDQUpJQXBCREdvUTFBRU5Dd0pBSUFvb0Fnd29BZ0JCZ0lDQWdIeHhRWUNBZ0lCNFJnUkFJQUFvQWhBZ0NDZ0NBQkRyQVF3QkN5QUFJQWdwQXdBUUR3c2dDaWdDRENJSElBY29BZ0JCLy8vL3Z3RnhRWUNBZ0lBRWNqWUNBQ0FJUWdBM0F3QU1BUXNnQzBHQWdJQWdjUTBBSUFaQmdCQnhCRUFnQWlBSUtBSUFSdzBKQ3lBR1FZQWdjVVVOQUNBTUlBZ29BZ1JIRFFnTElBWkJnQkJ4QkVBZ0NDZ0NBQ0lIQkVBZ0FDQUhyVUtBZ0lDQWNJUVFEd3NnQWtVZ0JFSWdpS2RCZFVseVJRUkFJQTBnRFNnQ0FFRUJhallDQUFzZ0NDQUNOZ0lBQ3lBR1FZQWdjVVVOQmlBSUtBSUVJZ0lFUUNBQUlBS3RRb0NBZ0lCd2hCQVBDeUFNUlNBRlFpQ0lwMEYxU1hKRkJFQWdEaUFPS0FJQVFRRnFOZ0lBQ3lBSUlBdzJBZ1FNQmdzZ0QwRWdSZzBFSUE5QkVFWUVRRUYvSVFjZ0FDQUpJQXBCREdvUTFBRU5DU0FJS0FJQUlnSUVRQ0FBSUFLdFFvQ0FnSUJ3aEJBUEN5QUlLQUlFSWdJRVFDQUFJQUt0UW9DQWdJQndoQkFQQ3lBS0tBSU1JZ0lnQWlnQ0FFSC8vLysvQTNFMkFnQWdDRUtBZ0lDQU1EY0RBQ0FLS0FJTUtBSUFJUXNNQlFzZ0RFVWdDMEdBZ0lEZ0FIRnlEUVJCQVNFSElBQWdBeUFJS1FNQUVGSkZEUVlNQ0FzZ0NrRUFOZ0lNSUFrdEFBVkJDSEZGRFFJZ0NTOEJCaUlIUVFKSERRRWdBa0VBVGcwQ0lBMGdDU2dDS0U4TkFpQVNSUVJBSUFBZ0NSQ1NBMFVOQVF3SEN3dEJBU0VISUF4RkRRWWdDU2dDSkNBTlFRTjBhaUVDSUFOQ0lJaW5RWFZQQkVBZ0E2Y2lCaUFHS0FJQVFRRnFOZ0lBQ3lBQUlBSWdBeEFnREFZTElBZEJGV3RCLy84RGNVRUtTdzBBQWtBQ1FDQUNRUUJPQkVBZ0FDQUNFTTBGSWdGQ2dJQ0FnSENESWhOQ2dJQ0FnREJSRFFOQmZ5RUhJQk5DZ0lDQWdPQUFVUTBJSUFBZ0FSRE1CU0lDUVFCSUJFQWdBQ0FCRUE4TUNRc2dBa1VFUUNBQUlBRVFEeUFBSUFaQnZoNFFieUVIREFrTFFRQWhCd0pBQWtBQ1FBSkFBa0JCQnlBQlFpQ0lweUlDSUFKQkIydEJia2tiSWdKQkMyb09Bd01CQWdBTElBSkJCMGNFUUNBQ0RRUWdBVUtBZ0lDQUNJTkNINGluSVFjTUJBc2dBVUtBZ0lDQXdJR0EvUDhBZkVJL2lLY2hCd3dEQ3lBQnB5SUNLQUlJUlEwQ0lBSW9BZ3hCZ0lDQWdIaEhJUWNNQWdzZ0FhY29BZ2doQnd3QkN5QUJweWdDQ0NFSEN5QUFJQUVRRHlBSFJRMEJJQUFnQmtIZkhoQnZJUWNNQ0FzZ0RTQUpLQUlnS0FJVUlBZEI1YVlCYWkwQUFIWkpEUUVMSUFBZ0JrSDlIaEJ2SVFjTUJnc2dEa1VnRVVFSFJuRkZCRUFnQUNBR1FiYzRFRzhoQnd3R0MwRUJJUWNnREVVTkJTQURRaUNJcDBGMVR3UkFJQU9uSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dBQ0FCSUEydElBTWdCaERYQVNFSERBVUxJQUFnQ1NBQ0lBTWdCQ0FGSUFZUWdRUWhCd3dFQ3lBTFFZQ0FnSUI4Y1VHQWdJQ0FlRVlFUUNBTUJFQWdDUzhCQmtFTFJnUkFJQUFnQXlBSUtBSUFLQUlRS1FNQUVGSkZEUVFMSUFnb0FnQW9BaEFoQWlBRFFpQ0lwMEYxVHdSQUlBT25JZ2NnQnlnQ0FFRUJhallDQUFzZ0FDQUNJQU1RSUFzZ0JrR0NCSEZCZ0FSSERRRkJmeUVISUFBZ0NTQUtRUXhxRU5RQkRRUWdDQ2dDQUNJSEtBSVFLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lBaUFDS0FJQVFRRnFOZ0lBSUFnb0FnQWhCd3NnQUNnQ0VDQUhFT3NCSUFnZ0FUY0RBQ0FLS0FJTUlnSWdBaWdDQUVILy8vKy9BM0UyQWdBTUFRc2dDMEdBZ0lDQUFuRUVRRUVCSVFJZ0RBUkFJQU5DSUlpblFYVlBCRUFnQTZjaUFpQUNLQUlBUVFGcU5nSUFDeUFBSUFrZ0F5QUdFTXNGSVFJTElBWkJnZ1J4UVlBRVJnUkFJQW9nQ1NnQ0VDSUdRVEJxTmdJTVFYOGhCeUFBSUFrZ0NrRU1haUFHS0FJd1FScDJRVDF4RUpFRERRVUxJQUloQnd3RUN5QU1CRUFnQUNBSUtRTUFFQThnQTBJZ2lLZEJkVThFUUNBRHB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFnZ0F6Y0RBQXNnQmtHQUJIRkZEUUJCZnlFSElBQWdDU0FLUVF4cUlBb29BZ3dvQWdCQkduWkJQWEVnQmtFQ2NYSVFrUU1OQXd0QmYwRUJJQUFnQ1NBS1FReHFJQkJCQlhFaUFFRi9jeUFLS0FJTUtBSUFRUnAyY1NBQUlBWnhjaENSQXhzaEJ3d0NDeUFBSUFaQjRla0FFRzhoQnd3QkMwRi9JUWNMSUFwQkVHb2tBQ0FIQy84QkFnSi9BWHdqQUVFUWF5SUVKQUFDUUNBQ1FpQ0lweUlEUVFKTkJFQWdBU0FDcDdjNUF3QkJBQ0VBREFFTElBTkJCMnRCYlUwRVFDQUJJQUpDZ0lDQWdNQ0JnUHovQUh3M0F3QkJBQ0VBREFFTEFuOGdBQ0FDRUkwQklnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFUUFBQUFBQUFENGZ5RUZRWDhNQVFzQ2ZBSkFBa0JCQnlBQ1FpQ0lweUlESUFOQkIydEJia2tiSWdOQkNtcEJBazhFUUNBRFFRZEdEUUlnQXcwQklBS250d3dEQ3lBQ3AwRUVhaUFFUVFocUVMVUZJQUFnQWhBUElBUXJBd2doQlVFQURBTUxFQUVBQ3lBQ1FvQ0FnSURBZ1lEOC93Qjh2d3NoQlVFQUN5RUFJQUVnQlRrREFBc2dCRUVRYWlRQUlBQUxYUUVDZnlNQVFSQnJJZ01rQUFKQUlBRkJnSUFCY1VVRVFDQUJRWUNBQW5GRkRRRWdBQ2dDRUNnQ2pBRWlBVVVOQVNBQkxRQW9RUUZ4UlEwQkN5QURRUUEyQWd3Z0FFRUVJQUpCQUJDU0JFRi9JUVFMSUFOQkVHb2tBQ0FFQzhZSkFnUi9CWDRqQUVId0FHc2lCaVFBSUFSQy8vLy8vLy8vLy8vL0FJTWhDUUpBQWtBZ0FWQWlCU0FDUXYvLy8vLy8vLy8vL3dDRElncENnSUNBZ0lDQXdQLy9BSDFDZ0lDQWdJQ0F3SUNBZjFRZ0NsQWJSUVJBSUFOQ0FGSWdDVUtBZ0lDQWdJREEvLzhBZlNJTFFvQ0FnSUNBZ01DQWdIOVdJQXRDZ0lDQWdJQ0F3SUNBZjFFYkRRRUxJQVVnQ2tLQWdJQ0FnSURBLy84QVZDQUtRb0NBZ0lDQWdNRC8vd0JSRzBVRVFDQUNRb0NBZ0lDQWdDQ0VJUVFnQVNFRERBSUxJQU5RSUFsQ2dJQ0FnSUNBd1AvL0FGUWdDVUtBZ0lDQWdJREEvLzhBVVJ0RkJFQWdCRUtBZ0lDQWdJQWdoQ0VFREFJTElBRWdDa0tBZ0lDQWdJREEvLzhBaFlSUUJFQkNnSUNBZ0lDQTRQLy9BQ0FDSUFFZ0E0VWdBaUFFaFVLQWdJQ0FnSUNBZ0lCL2hZUlFJZ1ViSVFSQ0FDQUJJQVViSVFNTUFnc2dBeUFKUW9DQWdJQ0FnTUQvL3dDRmhGQU5BU0FCSUFxRVVBUkFJQU1nQ1lSQ0FGSU5BaUFCSUFPRElRTWdBaUFFZ3lFRURBSUxJQU1nQ1lSUVJRMEFJQUVoQXlBQ0lRUU1BUXNnQXlBQklBRWdBMVFnQ1NBS1ZpQUpJQXBSR3lJSUd5RUtJQVFnQWlBSUd5SUxRdi8vLy8vLy96K0RJUWtnQWlBRUlBZ2JJZ0pDTUlpblFmLy9BWEVoQnlBTFFqQ0lwMEgvL3dGeElnVkZCRUFnQmtIZ0FHb2dDaUFKSUFvZ0NTQUpVQ0lGRzNrZ0JVRUdkSzE4cHlJRlFROXJFR2NnQmlrRGFDRUpJQVlwQTJBaENrRVFJQVZySVFVTElBRWdBeUFJR3lFRElBSkMvLy8vLy8vL1A0TWhCQ0FIUlFSQUlBWkIwQUJxSUFNZ0JDQURJQVFnQkZBaUJ4dDVJQWRCQm5TdGZLY2lCMEVQYXhCblFSQWdCMnNoQnlBR0tRTllJUVFnQmlrRFVDRURDeUFFUWdPR0lBTkNQWWlFUW9DQWdJQ0FnSUFFaENFQklBbENBNFlnQ2tJOWlJUWhCQ0FDSUF1RklRMENmaUFEUWdPR0lnSWdCU0FIUmcwQUdpQUZJQWRySWdkQi93QkxCRUJDQUNFQlFnRU1BUXNnQmtGQWF5QUNJQUZCZ0FFZ0Iyc1FaeUFHUVRCcUlBSWdBU0FIRUk0Q0lBWXBBemdoQVNBR0tRTXdJQVlwQTBBZ0Jpa0RTSVJDQUZLdGhBc2hDU0FFUW9DQWdJQ0FnSUFFaENFTUlBcENBNFloQ2dKQUlBMUNBRk1FUUVJQUlRTkNBQ0VFSUFrZ0NvVWdBU0FNaFlSUURRSWdDaUFKZlNFQ0lBd2dBWDBnQ1NBS1ZxMTlJZ1JDLy8vLy8vLy8vd05XRFFFZ0JrRWdhaUFDSUFRZ0FpQUVJQVJRSWdjYmVTQUhRUVowclh5blFReHJJZ2NRWnlBRklBZHJJUVVnQmlrREtDRUVJQVlwQXlBaEFnd0JDeUFKSUFwOElnSWdDVlN0SUFFZ0RIeDhJZ1JDZ0lDQWdJQ0FnQWlEVUEwQUlBbENBWU1nQkVJL2hpQUNRZ0dJaElRaEFpQUZRUUZxSVFVZ0JFSUJpQ0VFQ3lBTFFvQ0FnSUNBZ0lDQWdIK0RJUUVnQlVILy93Rk9CRUFnQVVLQWdJQ0FnSURBLy84QWhDRUVRZ0FoQXd3QkMwRUFJUWNDUUNBRlFRQktCRUFnQlNFSERBRUxJQVpCRUdvZ0FpQUVJQVZCL3dCcUVHY2dCaUFDSUFSQkFTQUZheENPQWlBR0tRTUFJQVlwQXhBZ0Jpa0RHSVJDQUZLdGhDRUNJQVlwQXdnaEJBc2dBcWRCQjNFaUJVRUVTNjBnQkVJOWhpQUNRZ09JaENJQ2ZDSURJQUpVclNBRVFnT0lRdi8vLy8vLy96K0RJQWV0UWpDR2hDQUJoSHdoQkFKQUlBVkJCRVlFUUNBRUlBTkNBWU1pQVNBRGZDSURJQUZVclh3aEJBd0JDeUFGUlEwQkN3c2dBQ0FETndNQUlBQWdCRGNEQ0NBR1FmQUFhaVFBQzkwQkFRSi9Ba0FnQVVLQWdJQ0FjRm9FUUNBQnB5RURBMEFDUUNBRExRQUZRUVJ4UlEwQUlBQW9BaEFvQWtRZ0F5OEJCa0VZYkdvb0FoUWlCRVVOQUNBRUtBSVFJZ1JGRFFBZ0F5QURLQUlBUVFGcU5nSUFJQUFnQTYxQ2dJQ0FnSENFSWdFZ0FpQUVFUlVBSVFJZ0FDQUJFQThnQWc4TElBTWdBeWdDQUVFQmFqWUNBQ0FBUVFBZ0F5QUNFRXdoQkNBQUlBT3RRb0NBZ0lCd2hCQVBJQVFOQWdKQUlBTXZBUVpCRld0Qi8vOERjVUVLU3cwQUlBQWdBaENlQXlJRVJRMEFJQVJCSDNVUEN5QURLQUlRS0FJc0lnTU5BQXNMUVFBaEJBc2dCQXROQVFKL0FuOGdBQ2dDQkNJRElBSnFJZ1FnQUNnQ0NFc0VmMEYvSUFBZ0JCREdBUTBCR2lBQUtBSUVCU0FEQ3lBQUtBSUFhaUFCSUFJUUh4b2dBQ0FBS0FJRUlBSnFOZ0lFUVFBTEdndEVBUUYvSUFKQy8vLy8vd2RZQkVBZ0FDQUJJQUlRVFE4TElBQWdBaEQ0QWlJRFJRUkFRb0NBZ0lEZ0FBOExJQUFnQVNBRElBRkJBQkFVSVFFZ0FDQURFQk1nQVF0akFRRi9JQUpDSUlpblFYVlBCRUFnQXFjaUJpQUdLQUlBUVFGcU5nSUFDd0pBSUFBZ0FTQUNFSkFGSWdBTkFDQUJLUU1BSWdKQ0FGTUVRQ0FCSUFJZ0JYd2lBamNEQUFzZ0FpQURXUVJBSUFRaUF5QUNXUTBCQ3lBQklBTTNBd0FMSUFBTFh3RURmeU1BUVNCcklnVWtBQ0FBS0FJQUlRWWdCVUlBTndJWUlBVkNnSUNBZ0lDQWdJQ0FmemNDRUNBRklBWTJBZ3dnQlVFTWFpSUhJQUlRdWdJaEJpQUFJQUVnQnlBRElBUVF5d0VoQUNBSEVCc2dCVUVnYWlRQUlBQWdCbklMRmdBZ0FDQUFLQUlvSUFGQkEzUnFLUU1BSUFFUVNRc3BBUUYvSUFKQ0lJaW5RWFZQQkVBZ0FxY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBRWdBaENZQVF0d0FRRi9JQVFnQXlnQ0FFb0VmeU1BUVJCcklnVWtBQ0FBSUFFb0FnQWdCQ0FES0FJQVFRTnNRUUp0SWdBZ0FDQUVTQnNpQUNBQ2JDQUZRUXhxRUtnQklnUUVmeUFESUFVb0Fnd2dBbTRnQUdvMkFnQWdBU0FFTmdJQVFRQUZRWDhMSVFBZ0JVRVFhaVFBSUFBRlFRQUxDMzRDQW44QmZpTUFRUkJySWdNa0FDQUFBbjRnQVVVRVFFSUFEQUVMSUFNZ0FTQUJRUjkxSWdKeklBSnJJZ0t0UWdBZ0FtY2lBa0hSQUdvUVp5QURLUU1JUW9DQWdJQ0FnTUFBaFVHZWdBRWdBbXV0UWpDR2ZDQUJRWUNBZ0lCNGNhMUNJSWFFSVFRZ0F5a0RBQXMzQXdBZ0FDQUVOd01JSUFOQkVHb2tBQXZkQXdFSmZ5QUJRUkJxSVFjQ1FBSkFBbjhDUUFKQUlBRW9BaEFpQkMwQUVBUkFJQUFvQWhBaUNDZ0MxQUVnQkNnQ0ZDQUNha0dCZ056eGVXd2dBMnBCZ1lEYzhYbHNJZ3RCSUNBSUtBTElBV3QyUVFKMGFpRUdBa0FEUUNBR0tBSUFJZ1ZGRFFFQ1FBSkFJQVVvQWhRZ0MwY05BQ0FGS0FJc0lBUW9BaXhIRFFCQkFDRUdJQVVvQWlBZ0JDZ0NJQ0lLUVFGcVJ3MEFBMEFnQmlBS1J3UkFJQVVnQmtFRGRDSUphaUlNS0FJMElBUWdDV29pQ1NnQ05FY05BaUFHUVFGcUlRWWdDU2dDTUNBTUtBSXdjMEdBZ0lBZ1NRMEJEQUlMQ3lBRklBcEJBM1JxSWdZb0FqUWdBa2NOQUNBR0tBSXdRUnAySUFOR0RRRUxJQVZCS0dvaEJnd0JDd3NnQlNnQ0hDSUNJQVFvQWh4SEJFQWdBQ0FCS0FJVUlBSkJBM1FRaVFJaUFrVU5CeUFCSUFJMkFoUWdBQ2dDRUNFSUN5QUZJQVVvQWdCQkFXbzJBZ0FnQnlBRk5nSUFJQWdnQkJDUkFnd0RDeUFFS0FJQVFRRkdEUUVnQUNBRUVNNEZJZ1JGRFFVZ0JFRUJPZ0FRSUFBb0FoQWdCQkNVQXlBQUtBSVFJQWNvQWdBUWtRSWdCeUFFTmdJQUN5QUVLQUlBUVFGSERRTUxRUUFnQUNBSElBRWdBaUFERU1NRURRRWFJQWNvQWdBaEJRc2dBU2dDRkNBRktBSWdRUU4wYWtFSWF3c1BDMEg4akFGQnJ2d0FRY3crUWRjYUVBQUFDMEVBQzVFQkFnTi9BWDRnQUNBQUtBTHNBU0lCUVFGck5nTHNBU0FCUVFGTUJIOUJBQ0VCSUFCQmtNNEFOZ0xzQVFKQUlBQW9BaEFpQWlnQ2tBRWlBMFVOQUNBQ0lBSW9BcFFCSUFNUkF3QkZEUUFnQUVHLzlnQkJBQkJHUVg4aEFTQUFLQUlRS1FPQUFTSUVRb0NBZ0lCd1ZBMEFJQVNuSWdBdkFRWkJBMGNOQUNBQUlBQXRBQVZCSUhJNkFBVUxJQUVGUVFBTEN5d0JBWDhnQUNnQ0VDSUJMUUNJQVVVRVFDQUJRUUU2QUlnQklBQkIvaHhCQUJCR0lBRkJBRG9BaUFFTEM1b0hBUWQvSXdCQjRBQnJJZ1FrQUNBRUlBRTJBbHdDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUEwQWdCQ0FDUVFGcklnRkJGR3hxSVFVRFFBSkFJQVFnQkNnQ1hDSURRUVJxTmdKY0FrQUNRQUpBQWtBQ1FDQURLQUlBSWdjT0NBQUJBZ01EQXdRSUJRc2dBa0VFVGcwUUlBUWdBMEVJYWpZQ1hDQURLQUlFSVFVZ0FDZ0NFQ0VESUFRZ0FrRVViR29pQVNBQUtBSU1OZ0lNSUFGQkFEWUNDQ0FCUWdBM0FnQWdBU0FEUWRjQUlBTWJOZ0lRSUFKQkFXb2hBaUFCSUFVUW9RWkZEUVlNQ1FzZ0FrRUVUZzBPSUFRZ0EwRUlhallDWENBREtBSUVJUVVnQUNnQ0VDRURJQVFnQWtFVWJHb2lBU0FBS0FJTU5nSU1JQUZCQURZQ0NDQUJRZ0EzQWdBZ0FTQURRZGNBSUFNYk5nSVFJQUpCQVdvaEFpQUJJQVVRcGdaRkRRVU1DQXNnQWtFRVRnME1JQVFnQTBFSWFqWUNYQ0FES0FJRUlRVWdBQ2dDRUNFRElBUWdBa0VVYkdvaUFTQUFLQUlNTmdJTUlBRkJBRFlDQ0NBQlFnQTNBZ0FnQVNBRFFkY0FJQU1iTmdJUUlBSkJBV29oQWlBQklBVVFyUU5GRFFRTUJ3c2dBa0VCVEEwS0lBSkJCRThOQ1NBQUtBSU1JUVlnQkNBQ1FSUnNhaUlESUFBb0FoQWlDRUhYQUNBSUd6WUNFQ0FESUFZMkFnd2dBMEVBTmdJSUlBTkNBRGNDQUNBRElBTkJLR3NpQmlnQ0NDQUdLQUlBSUFVb0FnZ2dCU2dDQUNBSFFRTnJFTnNDRFFVZ0JDQUNRUUpyUVJSc2FpSUNLQUlNSUFZb0FnaEJBQ0FDS0FJUUVRRUFHaUFGS0FJTUlBVW9BZ2hCQUNBRktBSVFFUUVBR2lBR0lBTW9BaEEyQWhBZ0JpQURLUUlJTndJSUlBWWdBeWtDQURjQ0FDQUJJUUlNQXdzZ0FrRUFUQTBISUFVUTJnSkZEUUVNQlFzTEN4QUJBQXNnQWtFQlJ3MENBbjhnQUNBRUtBSUFJZ0VRMlFJRVFDQUVLQUlJSVFKQmZ3d0JDeUFBS0FJSUlBUW9BZ2dpQWlBQlFRSjBFQjhhSUFBZ0FUWUNBRUVBQ3lFQklBUW9BZ3dnQWtFQUlBUW9BaEFSQVFBYURBa0xJQUpCQVdvaEFnc2dBa0VBSUFKQkFFb2JJUUpCQUNFQkEwQWdBU0FDUmdSQVFYOGhBUXdKQlNBRUlBRkJGR3hxSWdBb0Fnd2dBQ2dDQ0VFQUlBQW9BaEFSQVFBYUlBRkJBV29oQVF3QkN3QUxBQXRCbkkwQlFlVDhBRUdtQ2tHRE5oQUFBQXRCMUl3QlFlVDhBRUdiQ2tHRE5oQUFBQXRCOTRBQlFlVDhBRUdNQ2tHRE5oQUFBQXRCNDRzQlFlVDhBRUdMQ2tHRE5oQUFBQXRCOTRBQlFlVDhBRUdBQ2tHRE5oQUFBQXRCOTRBQlFlVDhBRUg1Q1VHRE5oQUFBQXRCOTRBQlFlVDhBRUh5Q1VHRE5oQUFBQXNnQkVIZ0FHb2tBQ0FCQzJrQkFuOENmeUFBS0FJQUlnTkJBbW9pQkNBQUtBSUVTZ1JBUVg4Z0FDQUVFTmtDRFFFYUlBQW9BZ0FoQXdzZ0FDQURRUUZxTmdJQUlBQW9BZ2dpQkNBRFFRSjBhaUFCTmdJQUlBQWdBQ2dDQUNJQVFRRnFOZ0lBSUFRZ0FFRUNkR29nQWpZQ0FFRUFDd3QyQVFGL0lBQW9BaFFFUUNBQUtBSUFJQUVRRDBGL0R3c0NRQ0FCUW9DQWdJQndnMEtBZ0lDQWtIOVJEUUFnQUNnQ0FDQUJFRGNpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBBSUFBUWd3TkJmdzhMSUFBZ0FhY2lBa0VBSUFJb0FnUkIvLy8vL3dkeEVGRWhBaUFBS0FJQUlBRVFEeUFDQzdVQ0FRZC9Jd0JCRUdzaUJTUUFBa0FnQUVGQWF5Z0NBQ0lCUlFSQURBRUxBa0FnQVFKL0lBRW9Bc2dCSWdRZ0FTZ0N4QUVpQWtnRVFDQUJLQUxNQVNFRElBUU1BUXNnQkVFQmFpSURJQUpCQTJ4QkFtMGlBaUFDSUFOSUd5SUdRUU4wSVFJZ0FDZ0NBQ0VEQWtBZ0FTZ0N6QUVpQnlBQlFkQUJha1lFUUNBRFFRQWdBaUFGUVF4cUVLZ0JJZ05GRFFNZ0F5QUJLQUxNQVNBQktBTElBVUVEZEJBZkdnd0JDeUFESUFjZ0FpQUZRUXhxRUtnQklnTkZEUUlMSUFVb0Fnd2hBaUFCSUFNMkFzd0JJQUVnQWtFRGRpQUdhallDeEFFZ0FTZ0N5QUVMUVFGcU5nTElBU0FESUFSQkEzUnFJZ0lnQVNnQ3ZBRTJBZ0FnQWlBQktBTEFBVFlDQkNBQVFiUUJFQkFnQUVGQWF5Z0NBQ0FFUWYvL0EzRVFGeUFCSUFRMkFyd0JEQUVMUVg4aEJBc2dCVUVRYWlRQUlBUUxvUUVDQTM4QmZpTUFJUVlDUUNBQ1FvQ0FnSUJ3VkEwQUlBS25JZ1V2QVFaQk1FY05BQ0FGS0FJZ0lRUUxBbjhnQmlBQUtBSVFLQUo0U1FSQUlBQVE2UUZCQUF3QkN5QUVMUUFSQkVBZ0FCQzJBa0VBREFFTFFRQWdBQ0FFS1FNSUlnSWdBeUFDUVFBUUZDSUhRb0NBZ0lCd2d5SUNRb0NBZ0lEZ0FGRU5BQm9nQVVLQWdJQ0FNQ0FISUFKQ2dJQ0FnQ0JSR3pjREFDQUVDeUVGSUFZa0FDQUZDeFlBSUFBZ0FTQUNJQU1nQkNBRklBQXBBekFROFFFTEtRRUJmeU1BUVJCcklnSWtBQ0FDSUFBMkFnd2dBa0VNYWlBQkVKTUVJUUFnQWtFUWFpUUFJQUFMbmdJQ0EzOEJmaUFDSUFFcEFnUWlCNmRCLy8vLy93ZHhJQU5IY2tVRVFDQUJJQUVvQWdCQkFXbzJBZ0FnQWExQ2dJQ0FnSkIvaEE4TElBRkJFR29oQlNBSFFvQ0FnSUFJZzFBZ0F5QUNheUlFUVFCTWNrVUVRQ0FESUFJZ0FpQURTQnNoQmtFQUlRTWdBaUVCQTBBZ0FTQUdSa1VFUUNBRklBRkJBWFJxTHdFQUlBTnlJUU1nQVVFQmFpRUJEQUVMQ3lBRFFmLy9BM0ZCZ0FKUEJFQWdBQ0FGSUFKQkFYUnFJQVFRN2dNUEMwRUFJUUVnQUNBRVFRQVE2Z0VpQUVVRVFFS0FnSUNBNEFBUEN5QUFRUkJxSVFNRFFDQUJJQVJHUlFSQUlBRWdBMm9nQlNBQklBSnFRUUYwYWkwQUFEb0FBQ0FCUVFGcUlRRU1BUXNMSUFNZ0JHcEJBRG9BQUNBQXJVS0FnSUNBa0grRUR3c2dBQ0FDSUFWcUlBUVFoQU1MdWdFQkFuOENRQUpBSUFKQy8vLy8vd2RZQkVBZ0FDQUJJQUtuUVlDQWdJQjRjaEJ4SWdSQkFFd05BU0FBSUFFZ0FoQk5JZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5Ba0YvSVFRTUFnc2dBQ0FDRVBnQ0lnVkZCRUJCZnlFRURBRUxBa0FnQUNBQklBVVFjU0lFUVFCTUJFQkNnSUNBZ0RBaEFnd0JDeUFBSUFFZ0JTQUJRUUFRRkNJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFCQmZ5RUVDeUFBSUFVUUV3d0JDMEtBZ0lDQU1DRUNDeUFESUFJM0F3QWdCQXRLQVFKL0lBSkMvLy8vL3dkWUJFQWdBQ0FCSUFJZ0EwR0FnQUVRMXdFUEN5QUFJQUlRK0FJaUJFVUVRQ0FBSUFNUUQwRi9Ed3NnQUNBQklBUWdBeEJGSVFVZ0FDQUVFQk1nQlF1SUFRRUJmMEYvSVFJZ0FDZ0NGQVIvUVg4RklBRkNnSUNBZ0hDRFFvQ0FnSUNRZjFJRVFDQUFLQUlBSUFFUUtDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQkNEQTBGL0R3c2dBQ0FCcHlJQ1FRQWdBaWdDQkVILy8vLy9CM0VRVVNFQ0lBQW9BZ0FnQVJBUElBSVBDeUFBSUFHbklnQkJBQ0FBS0FJRVFmLy8vLzhIY1JCUkN3c05BQ0FBSUFFZ0FSQS9FSWdDQ3hzQUlBQkJBQkJCR2lBQUlBRTJBZ1FnQUVHQWdJQ0FlRFlDQ0FzWkFDQUFJQUFvQWhBaUFDa0RnQUVRRHlBQUlBRTNBNEFCQzRRQ0FRRi9Ba0FnQUNnQ0NDSUNJQUFvQWd4T0RRQWdBQ2dDRUFSQUlBQWdBa0VCYWpZQ0NDQUFLQUlFSUFKQkFYUnFJQUU3QVJCQkFBOExJQUZCL3dGTERRQWdBQ0FDUVFGcU5nSUlJQUFvQWdRZ0Ftb2dBVG9BRUVFQUR3c0NmeUFBS0FJSUlnSWdBQ2dDREU0RVFFRi9JQUFnQWtFQmFpQUJFTGNDRFFFYUN3SkFJQUFvQWhBRVFDQUFJQUFvQWdnaUFrRUJhallDQ0NBQUtBSUVJQUpCQVhScUlBRTdBUkFNQVFzZ0FVSC9BVTBFUUNBQUlBQW9BZ2dpQWtFQmFqWUNDQ0FDSUFBb0FnUnFJQUU2QUJBTUFRdEJmeUFBSUFBb0Fnd1E5UU1OQVJvZ0FDQUFLQUlJSWdKQkFXbzJBZ2dnQUNnQ0JDQUNRUUYwYWlBQk93RVFDMEVBQ3dzYkFDQUFRUUFRUVJvZ0FDQUJOZ0lFSUFCQi92Ly8vd2MyQWdnTEN3QWdBQ0FCUVFBUXdRVUwyZ29DRW44QmZpTUFRVEJySWdna0FDQUJRUUEyQWdBZ0FrRUFOZ0lBSUFoQkFEWUNMQ0FJUVFBMkFpZ2dCRUV3Y1NFTklBUkJFSEVoRUNBREtBSVFJZzVCTUdvaEJnSkFBa0FDUUFKQUEwQWdEaWdDSUNBSlNnUkFBa0FnQmlnQ0JDSUZSUTBBUVFBZ0VDQUdLQUlBUVlDQWdJQUJjUnNnQkNBQUlBVVFqQU1pQjNaQkFYRkZjZzBBQWtBZ0RVVWdCaWdDQUVHQWdJQ0FmSEZCZ0lDQWdIaEhjZzBBSUFNb0FoUWdDVUVEZEdvb0FnQW9BaEExQWdSQ0lJWkNnSUNBZ01BQVVnMEFJQUFnQmlnQ0JCRFpBVUYvSVFrTUJBc2dBQ0FJUVNScUlBVVFyQUVFUUNBTFFRRnFJUXNNQVFzZ0IwVUVRQ0FNUVFGcUlRd01BUXNnQ2tFQmFpRUtDeUFHUVFocUlRWWdDVUVCYWlFSkRBRUxDMEVBSVFZQ1FDQURMUUFGSWdWQkJIRkZEUUFnQlVFSWNRUkFJQVJCQVhGRkRRRWdBeWdDS0NBTGFpRUxEQUVMSUFNdkFRWWlCVUVGUmdSQUlBUkJBWEZGRFFGQkFDRUpJQU1wQXlBaUYwS0FnSUNBY0lOQ2dJQ0FnSkIvVVFSL0lCZW5LQUlFUWYvLy8vOEhjUVZCQUFzZ0Myb2hDd3dCQ3lBQUtBSVFLQUpFSUFWQkdHeHFLQUlVSWdWRkRRQWdCU2dDQkNJRlJRMEFRWDhoQ1NBQUlBaEJMR29nQ0VFb2FpQURyVUtBZ0lDQWNJUWdCUkViQUEwQlFRQWhCUU5BSUFVZ0NDZ0NLRThOQVFKQUlBUWdBQ0FGUVFOMElnNGdDQ2dDTEdvb0FnUWlCeENNQTNaQkFYRUVRQUpBSUExRkJFQkJBQ0VIREFFTElBQWdDQ0FESUFjUVRDSUhRUUJJRFFJZ0J3Ui9JQWdvQWdBaEJ5QUFJQWdRU0NBSFFRSjJRUUZ4QlVFQUN5RUhJQWdvQWl3Z0Rtb2dCellDQUFzZ0JpQVFSU0FIY21vaEJnc2dCVUVCYWlFRkRBRUxDeUFBSUFnb0Fpd2dDQ2dDS0JCYURBRUxJQUJCQVNBTElBeHFJaE1nQ21vZ0Jtb2lFU0FSUVFGTUcwRURkQkFwSWc5RkJFQWdBQ0FJS0FJc0lBZ29BaWdRV2tGL0lRa01BUXNnQXlnQ0VDSVZRVEJxSVFaQkFDRUZJQXNoRENBVElRZEJBU0VVUVFBaENRTkFJQWtnRlNnQ0lFNUZCRUFDUUNBR0tBSUVJaEpGRFFCQkFDQVFJQVlvQWdCQmdJQ0FnQUZ4SWdvYklBUWdBQ0FTRUl3RElnMTJRUUZ4UlhJTkFDQUtRUngySVJZQ2Z5QUFJQWhCSkdvZ0VoQ3NBUVJBSUFWQkFXb2hDa0VBSVJRZ0J5RU9JQXdNQVFzZ0RVVUVRQ0FGSVFvZ0J5RU9JQXdpQlVFQmFnd0JDeUFIUVFGcUlRNGdCU0VLSUFjaEJTQU1DeUVOSUFBZ0VoQVlJUWNnRHlBRlFRTjBhaUlGSUJZMkFnQWdCU0FITmdJRUlBb2hCU0FOSVF3Z0RpRUhDeUFHUVFocUlRWWdDVUVCYWlFSkRBRUxDd0pBSUFNdEFBVWlDa0VFY1VVTkFBSi9JQXBCQ0hFRVFDQUVRUUZ4UlEwQ0lBTW9BaWdNQVFzZ0F5OEJCa0VGUndSQVFRQWhCZ05BSUFnb0Fpd2hBeUFHSUFnb0FpaFBSUVJBQWtCQkFDQVFJQU1nQmtFRGRHb2lDaWdDQUNJREd5QUVJQUFnQ2lnQ0JDSUtFSXdEZGtFQmNVVnlSUVJBSUE4Z0IwRURkR29pRFNBRE5nSUFJQTBnQ2pZQ0JDQUhRUUZxSVFjTUFRc2dBQ0FLRUJNTElBWkJBV29oQmd3QkN3c2dBQ2dDRUNJRVFSQnFJQU1nQkNnQ0JCRUFBQXdDQ3lBRVFRRnhSUTBCUVFBZ0F5a0RJQ0lYUW9DQWdJQndnMEtBZ0lDQWtIOVNEUUFhSUJlbktBSUVRZi8vLy84SGNRc2hDVUVBSVFZZ0NVRUFJQWxCQUVvYklRTURRQ0FESUFaR0RRRWdEeUFGUVFOMGFpSUVRUUUyQWdBZ0JDQUdRWUNBZ0lCNGNqWUNCQ0FHUVFGcUlRWWdCVUVCYWlFRkRBQUxBQXNnQlNBTFJ3MEJJQXdnRTBjTkFpQUhJQkZIRFFNZ0MwVWdGSEpGQkVBZ0R5QUxRUWhCUHlBQUVMNENDeUFCSUE4MkFnQWdBaUFSTmdJQVFRQWhDUXNnQ0VFd2FpUUFJQWtQQzBHOEtFR3UvQUJCeWp0Qno5WUFFQUFBQzBHUEtFR3UvQUJCeXp0Qno5WUFFQUFBQzBIdEtFR3UvQUJCekR0Qno5WUFFQUFBQ3pJQkFYOGpBRUhRQUdzaUF5UUFJQU1nQUNnQ0VDQURRUkJxSUFFUWtBRTJBZ0FnQUNBQ0lBTVFGU0FEUWRBQWFpUUFDd3NBSUFBZ0FTQUNFSVlGQ3drQUlBQkJBUkRaQkFzMkFRSi9RWDhoQXlBQUlBRkJBQkNUQVNJQ0JIOGdBaWdDSUNnQ0RDZ0NJQzBBQkFSQUlBQVFhMEYvRHdzZ0FpZ0NLQVZCZndzTGFRRURmeU1BUVJCcklnTWtBQUpBQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlFTHdFR0lRVWdBZ1JBSUFWQklFY05BUXdDQ3lBRlFSVnJRZi8vQTNGQkMwa05BUXNnQTBHN0lrSFNIeUFDR3pZQ0FDQUFRZmM4SUFNUUZVRUFJUVFMSUFOQkVHb2tBQ0FFQ3lRQkFYOGpBRUVRYXlJREpBQWdBeUFDTmdJTUlBQWdBU0FDRUpzRUlBTkJFR29rQUFzU0FDQUFJQUVnQWlBRElBUkJ4Z0FRcEFRTERRQWdBRUVhUVNSQkdSRC9CUXNPQUNBQVFvQ0FnSURnZmhDQUJndXhBZ0lDZndGOEl3QkJFR3NpQkNRQUFuOENRQU5BQWtBQ1FBSkFBbjhDUUFKQVFRY2dBa0lnaUtjaUF5QURRUWRyUVc1Skd5SUREZ2dBQUFBQUJRVUZBUVFMSUFLbkRBRUxJQUpDZ0lDQWdNQ0JnUHovQUh3aUFrSTBpS2RCL3c5eElnQkJuUWhMRFFFZ0FyOGlCWmxFQUFBQUFBQUE0RUZqQkVBZ0Jhb01BUXRCZ0lDQWdIZ0xJUU5CQUF3RkMwRUFJUU5CQUNBQVFkSUlTdzBFR2tFQUlBSkMvLy8vLy8vLy93ZURRb0NBZ0lDQWdJQUloQ0FBUVpNSWE2MkdRaUNJcHlJRGF5QURJQUpDQUZNYklRTkJBQXdFQ3lBRFFYZEdEUUlMSUFBZ0FoQ05BU0lDUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUFMUVFBaEEwRi9EQUVMSUFSQkRHb2dBcWRCQkdwQkFSQ3BBU0FBSUFJUUR5QUVLQUlNSVFOQkFBc2hBQ0FCSUFNMkFnQWdCRUVRYWlRQUlBQUx6Z0VCQTM4akFFRVFheUlFSkFBQ1FDQUJRb0NBZ0lCd1ZBUkFEQUVMSUFHbklnSXZBUVpCTUVZRVFBSkFJQUFnQkVFSWFpQUJRZUVBRUlFQklnTkZEUUFnQkNrRENDSUJRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFJQU1wQXdBUW1RRWhBZ3dEQ3lBQUlBRWdBeWtEQ0VFQklBTVFMeUlCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBQkVDWWhBaUFBSUFNcEF3QVFtUUVpQTBFQVNBMEFJQUlnQTBZTkFpQUFRWkRwQUVFQUVCVUxRWDhoQWd3QkN5QUNMUUFGUVFGeElRSUxJQVJCRUdva0FDQUNDNGdEQWdKK0FuOGpBRUVRYXlJR0pBQUNRQ0FCUW9DQWdJQndWQVJBSUFFaEF3d0JDeUFDUVc5eElRVUNRQUpBQWtBZ0FrRVFjUTBBSUFBZ0FVSFFBU0FCUVFBUUZDSUVRb0NBZ0lCd2d5SURRb0NBZ0lBZ1VTQURRb0NBZ0lBd1VYSU5BQ0FEUW9DQWdJRGdBRkVOQVNBR0lBQkJ4Z0JCRmlBRlFRRkdHMEhJQUNBRkd4QXROd01JSUFBZ0JDQUJRUUVnQmtFSWFoQXZJUU1nQUNBR0tRTUlFQThnQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCSUFBZ0FSQVBJQU5DZ0lDQWdIQlVEUU1nQUNBREVBOGdBRUdXNFFCQkFCQVZEQUlMSUFWQkFFY2hCVUVBSVFJRFFDQUNRUUpIQkVBZ0FDQUJRVGRCT1NBQ0lBVkdHeUFCUVFBUUZDSURRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSUNRQ0FBSUFNUU9FVU5BQ0FBSUFNZ0FVRUFRUUFRTHlJRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFNZ0EwTC8vLy8vYjFZTkFDQUFJQUVRRHd3RkN5QUFJQU1RRHlBQ1FRRnFJUUlNQVFzTElBQkJsdUVBUVFBUUZRc2dBQ0FCRUE4TFFvQ0FnSURnQUNFREN5QUdRUkJxSkFBZ0F3dnVDd0VIZndKQUlBQkZEUUFnQUVFSWF5SUNJQUJCQkdzb0FnQWlBVUY0Y1NJQWFpRUZBa0FnQVVFQmNRMEFJQUZCQTNGRkRRRWdBaUFDS0FJQUlnRnJJZ0pCd05BRUtBSUFTUTBCSUFBZ0FXb2hBRUhFMEFRb0FnQWdBa2NFUUNBQlFmOEJUUVJBSUFGQkEzWWhBU0FDS0FJTUlnTWdBaWdDQ0NJRVJnUkFRYkRRQkVHdzBBUW9BZ0JCZmlBQmQzRTJBZ0FNQXdzZ0JDQUROZ0lNSUFNZ0JEWUNDQXdDQ3lBQ0tBSVlJUVlDUUNBQ0lBSW9BZ3dpQVVjRVFDQUNLQUlJSWdNZ0FUWUNEQ0FCSUFNMkFnZ01BUXNDUUNBQ1FSUnFJZ1FvQWdBaUF3MEFJQUpCRUdvaUJDZ0NBQ0lERFFCQkFDRUJEQUVMQTBBZ0JDRUhJQU1pQVVFVWFpSUVLQUlBSWdNTkFDQUJRUkJxSVFRZ0FTZ0NFQ0lERFFBTElBZEJBRFlDQUFzZ0JrVU5BUUpBSUFJb0Fod2lCRUVDZEVIZzBnUnFJZ01vQWdBZ0FrWUVRQ0FESUFFMkFnQWdBUTBCUWJUUUJFRzAwQVFvQWdCQmZpQUVkM0UyQWdBTUF3c2dCa0VRUVJRZ0JpZ0NFQ0FDUmh0cUlBRTJBZ0FnQVVVTkFnc2dBU0FHTmdJWUlBSW9BaEFpQXdSQUlBRWdBellDRUNBRElBRTJBaGdMSUFJb0FoUWlBMFVOQVNBQklBTTJBaFFnQXlBQk5nSVlEQUVMSUFVb0FnUWlBVUVEY1VFRFJ3MEFRYmpRQkNBQU5nSUFJQVVnQVVGK2NUWUNCQ0FDSUFCQkFYSTJBZ1FnQUNBQ2FpQUFOZ0lBRHdzZ0FpQUZUdzBBSUFVb0FnUWlBVUVCY1VVTkFBSkFJQUZCQW5GRkJFQkJ5TkFFS0FJQUlBVkdCRUJCeU5BRUlBSTJBZ0JCdk5BRVFielFCQ2dDQUNBQWFpSUFOZ0lBSUFJZ0FFRUJjallDQkNBQ1FjVFFCQ2dDQUVjTkEwRzQwQVJCQURZQ0FFSEUwQVJCQURZQ0FBOExRY1RRQkNnQ0FDQUZSZ1JBUWNUUUJDQUNOZ0lBUWJqUUJFRzQwQVFvQWdBZ0FHb2lBRFlDQUNBQ0lBQkJBWEkyQWdRZ0FDQUNhaUFBTmdJQUR3c2dBVUY0Y1NBQWFpRUFBa0FnQVVIL0FVMEVRQ0FCUVFOMklRRWdCU2dDRENJRElBVW9BZ2dpQkVZRVFFR3cwQVJCc05BRUtBSUFRWDRnQVhkeE5nSUFEQUlMSUFRZ0F6WUNEQ0FESUFRMkFnZ01BUXNnQlNnQ0dDRUdBa0FnQlNBRktBSU1JZ0ZIQkVCQndOQUVLQUlBR2lBRktBSUlJZ01nQVRZQ0RDQUJJQU0yQWdnTUFRc0NRQ0FGUVJScUlnUW9BZ0FpQXcwQUlBVkJFR29pQkNnQ0FDSUREUUJCQUNFQkRBRUxBMEFnQkNFSElBTWlBVUVVYWlJRUtBSUFJZ01OQUNBQlFSQnFJUVFnQVNnQ0VDSUREUUFMSUFkQkFEWUNBQXNnQmtVTkFBSkFJQVVvQWh3aUJFRUNkRUhnMGdScUlnTW9BZ0FnQlVZRVFDQURJQUUyQWdBZ0FRMEJRYlRRQkVHMDBBUW9BZ0JCZmlBRWQzRTJBZ0FNQWdzZ0JrRVFRUlFnQmlnQ0VDQUZSaHRxSUFFMkFnQWdBVVVOQVFzZ0FTQUdOZ0lZSUFVb0FoQWlBd1JBSUFFZ0F6WUNFQ0FESUFFMkFoZ0xJQVVvQWhRaUEwVU5BQ0FCSUFNMkFoUWdBeUFCTmdJWUN5QUNJQUJCQVhJMkFnUWdBQ0FDYWlBQU5nSUFJQUpCeE5BRUtBSUFSdzBCUWJqUUJDQUFOZ0lBRHdzZ0JTQUJRWDV4TmdJRUlBSWdBRUVCY2pZQ0JDQUFJQUpxSUFBMkFnQUxJQUJCL3dGTkJFQWdBRUY0Y1VIWTBBUnFJUUVDZjBHdzBBUW9BZ0FpQTBFQklBQkJBM1owSWdCeFJRUkFRYkRRQkNBQUlBTnlOZ0lBSUFFTUFRc2dBU2dDQ0FzaEFDQUJJQUkyQWdnZ0FDQUNOZ0lNSUFJZ0FUWUNEQ0FDSUFBMkFnZ1BDMEVmSVFRZ0FFSC8vLzhIVFFSQUlBQkJKaUFBUVFoMlp5SUJhM1pCQVhFZ0FVRUJkR3RCUG1vaEJBc2dBaUFFTmdJY0lBSkNBRGNDRUNBRVFRSjBRZURTQkdvaEJ3SkFBa0FDUUVHMDBBUW9BZ0FpQTBFQklBUjBJZ0Z4UlFSQVFiVFFCQ0FCSUFOeU5nSUFJQWNnQWpZQ0FDQUNJQWMyQWhnTUFRc2dBRUVaSUFSQkFYWnJRUUFnQkVFZlJ4dDBJUVFnQnlnQ0FDRUJBMEFnQVNJREtBSUVRWGh4SUFCR0RRSWdCRUVkZGlFQklBUkJBWFFoQkNBRElBRkJCSEZxSWdkQkVHb29BZ0FpQVEwQUN5QUhJQUkyQWhBZ0FpQUROZ0lZQ3lBQ0lBSTJBZ3dnQWlBQ05nSUlEQUVMSUFNb0FnZ2lBQ0FDTmdJTUlBTWdBallDQ0NBQ1FRQTJBaGdnQWlBRE5nSU1JQUlnQURZQ0NBdEIwTkFFUWREUUJDZ0NBRUVCYXlJQVFYOGdBQnMyQWdBTEMwY0FJQUFnQVVrRVFDQUFJQUVnQWhBZkdnOExJQUlFUUNBQUlBSnFJUUFnQVNBQ2FpRUJBMEFnQUVFQmF5SUFJQUZCQVdzaUFTMEFBRG9BQUNBQ1FRRnJJZ0lOQUFzTEN4NEFJQUJDZ0lDQWdIQ0RRb0NBZ0lDUWYxRUVRQ0FBcHlBQkVMY0VDd3UvQlFFSGZ5TUFRWkFDYXlJR0pBQWdCa0VBT2dBUUlBWWdBQ2dDQkRZQ0FDQUdJQUFvQWhRMkFnUWdCaUFBS0FJWU5nSU1JQVlnQUNnQ01EWUNDQ0FBUVJCcUlRbEJBU0VFQWtBQ1FBTkFRWDRoQ0FKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdDU2dDQUNJRFFmNEFhZzRGQVFrSkNRY0FDd0pBQWtBQ1FBSkFBa0FnQTBFb2F3NENBUUlBQ3dKQUlBTkJPMnNPQXdjTkNRQUxBa0FnQTBIYkFHc09Bd0VOQXdBTEFrQWdBMEg3QUdzT0F3RU5CQUFMSUFOQnAzOUdEUWNnQTBFdlJnMEpJQU5Cckg5SERRd01FQXNnQkVIL0FVME5CQXdPQ3lBRVFRRnJJZ1FnQmtFUWFtb3RBQUJCS0VjTkRRd0pDeUFFUVFGcklnUWdCa0VRYW1vdEFBQkIyd0JIRFF3TUNBdEIvUUFoQlNBRVFRRnJJZ1FnQmtFUWFtb3RBQUFpQ0VIN0FFWU5DVUdzZnlFRElBaEI0QUJIRFF3Z0FDQUpFUDhCSUFCQkFEWUNNQ0FBSUFBb0FoUTJBZ1FnQUNBQUtBSTRFTThERFF3TElBQW9BaWhCNEFCR0RRWkI0QUFoQXlBRVFmOEJTdzBLQ3lBR1FSQnFJQVJxSUFNNkFBQWdCRUVCYWlFRURBVUxJQWNnQkVFQ1JuSWhCMEU3SVFVTUJnc2dCMEVDY2lBSElBUkJBa1liSVFkQnAzOGhCUXdGQ3lBSFFRUnlJUWRCUFNFRkRBUUxRWDhoQ0FzZ0JVR0FBV29pQTBFV1RVRUFRUUVnQTNSQm00Q0FBM0ViRFFBZ0JVRXBSaUFGUWQwQVJuSWdCVUhUQUdvaUEwRUhUVUVBUVFFZ0EzUkJod0Z4RzNJZ0JVSDlBRVp5RFFBZ0FDQUFLQUk0SUFocU5nSTRJQUFRMkFRTkJBc2dDU2dDQUNFREN5QURRWU4vUndSQUlBTWhCUXdCQzBGYklRVWdBRUhEQUJCS0RRQWdBRUV0RUVvTkFFR0RmeUVGQ3lBQUVCSU5BU0FFUVFGTERRQUxRVnNnQUNnQ0VDQUFRY01BRUVvYklRTWdBa1VOQVVFS0lBTWdBQ2dDQkNBQUtBSVVSeHNoQXd3QkMwR3NmeUVEQ3lBQkJFQWdBU0FITmdJQUN5QUFJQVlRN2dJaEFDQUdRWkFDYWlRQVFYOGdBeUFBR3dzWkFDQUFJQUVnQWtFQklBTWdCQ0FGSUFZZ0J5QUlFUFVCQzZvR0FRWi9JQUFvQWdBaEJRSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRERnY0VBQUFBQUFFQ0F3c2dBU0FDSUFFb0FzQUJRUUVRd1FNaUNVRUFTQVJBSUFFb0Fyd0JJUVFNQmdzQ1FDQUpRZi8vLy84RFRRUkFJQUVvQW5RaUNDQUpRUVIwYWlJSEtBSUVJZ1lnQVNnQ3ZBRWlCRVlFUUNBRFFRTkhEUUlnQVMwQWJrRUJjUTBDSUFnZ0NVRUVkR29vQWd4QitBQnhRUWhIRFFJTUNRc2dCeWdDREVINEFIRkJHRWNnQmtFQ2FpQUVSM0lOQnd3QkN5QUJLQUs4QVNJRUlBRW9BdkFCUncwR0N5QUFRWkRFQUVFQUVCWU1Cd3NnQlNBQklBSkJBeERqQWc4TElBRWdBaUFCS0FMQUFVRUFFTUVEUVFCT0RRSWdBU2dDS0FSQUFrQWdBU0FDRUtJQ0lnTkZEUUFnQXkwQUJFRUNjVVVOQUNBREtBSUlJQUVvQXJ3QlJ3MEFJQUVvQWlSQkFVWU5CQXRCZ0lDQWdBUkJmeUFGSUFFZ0FoRGtBaHNQQ3lBQklBSVE5QUVpQkVFQVRnMElJQVVnQVNBQ0VFOGlCRUVBU0EwSUFrQWdBa0hOQUVjTkFDQUJLQUpJUlEwQUlBRWdCRFlDbUFFTElBRW9BblFnQkVFRWRHb2dBU2dDdkFFMkFnZ2dCQThMRUFFQUN5QUZJQUVnQWtFQUVPTUNJUVFNQmdzZ0FFR1F4QUJCQUJBV0RBSUxBa0FnQTBFQ1N3MEFJQVFnQVNnQzhBRkhEUUFnQkNFR0lBRWdBaERnQkVFQVNBMEJJQUJCeStZQVFRQVFGZ3dDQ3lBRUlRWUxRUUFoQkNBQktBSjhJZ2RCQUNBSFFRQktHeUVIQWtBRFFDQUVJQWRHRFFFQ1FBSkFJQUVvQW5RZ0JFRUVkR29pQ0NnQ0FDQUNSdzBBSUFnb0FnUU5BQ0FCSUFnb0FnZ2dCaERhQkEwQkN5QUVRUUZxSVFRTUFRc0xJQVJCQUVnTkFDQUFRZUhxQUVFQUVCWU1BUXNDUUNBQktBSW9SUTBBSUFFZ0FoQ2lBaUlFUlEwQUlBRWdCQ2dDQ0NBR0VOb0VSUTBBSUFCQjQ4UUFRUUFRRmd3QkN5QUJLQUlnUlEwQ0lBRW9BaVJCQVVzTkFpQUdJQUVvQXZBQlJ3MENJQVVnQVNBQ0VPUUNJZ0FOQVF0QmZ3OExJQUFnQUMwQUJFSDVBWEZCQmtFQ0lBTkJBa1liY2pvQUJFR0FnSUNBQkE4TElBVWdBU0FDUVFFZ0EwRUVSa0VCZENBRFFRTkdHeERqQWlJRVFRQklEUUFnQVNnQ2RDQUVRUVIwYWlJQUlBQW9BZ3hCZkhFZ0EwRUNSbkpCQW5JMkFnd2dCQThMSUFRTHNnRUJCWDhDUUFKQUlBQW9Ba0FpQWlnQ21BSWlBMEVBU0EwQUlBSW9Bb0FDSWdRZ0Eyb2lCUzBBQUNJR1FjRUJSd1JBSUFaQnpRQkhEUUVnQWtGL05nS1lBaUFDSUFNMkFvUUNJQUJCelFBUUVDQUFJQUVRR2c4TElBUWdBeUFGS0FBQmEwRUJhaUlEYWlJRUxRQUFRZFlBUncwQklBQW9BZ0FnQkNnQUFSQVRJQUlvQW9BQ0lBTnFJQUFvQWdBZ0FSQVlOZ0FCSUFKQmZ6WUNtQUlMRHd0QjNUUkJydndBUWRPd0FVSE41UUFRQUFBTDJRa0NDSDhCZmlNQVFaQUJheUlDSkFBQ2Z3SkFJQUFvQWdBb0FoQW9BbmdnQWtzRVFDQUFRWTBpUVFBUUZnd0JDeUFBSUFCQkVHb2lCaEQvQVNBQUlBQW9BamdpQVRZQ05DQUNJQUUyQWdRZ0FDQUFLQUlVTmdJRUFrQURRQUpBSUFBZ0FUWUNHQ0FBSUFBb0FnZ2lCVFlDRkFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQVN3QUFDSURRZjhCY1NJRURuc0FDUWtKQ1FrSkNRa0dCQVVGQXdrSkNRa0pDUWtKQ1FrSkNRa0pDUWtKQ1FZSkFna09DUWtCQ1FrSkN3a0tDUWNJREF3TURBd01EQXdNQ1FrSkNRa0pDUTRPRGc0T0RnNE9EZzRPRGc0T0RnNE9EZzRPRGc0T0RnNE9DUWtKQ1E0SkRnNE9EZzRPRGc0T0RnNE9EZzRPRGc0T0RnNE9EZzRPRGc0SkMwRUFJUU1nQVNBQUtBSThTUTBNSUFaQnJIODJBZ0FNRGd0Qkp5RURJQUFvQWt4RkRRdEJKeUVFQ3lBQUlBUkJBU0FCUVFGcUlBWWdBa0VFYWhEekFrVU5EQXdRQ3lBQlFRRnFJQUVnQVMwQUFVRUtSaHNoQVFzZ0FpQUJRUUZxSWdFMkFnUWdBQ0FGUVFGcU5nSUlEQTBMSUFBb0FreEZEUWNMSUFJZ0FVRUJhaUlCTmdJRURBc0xJQUFvQWt4RkJFQkJMeUVEREFZTFFTOGhBeUFCTFFBQklnUkJMMFlOQ0NBRVFTcEhEUVVnQVVFQ2FpRUJBMEFnQWlBQk5nSUVBMEFDUUFKQUFrQUNRQ0FCTFFBQUlnTkJDbXNPQkFFQ0FnTUFDeUFEUVNwSEJFQWdBdzBDSUFFZ0FDZ0NQRWtOQTBIVkxDRUJEQThMSUFFdEFBRkJMMGNOQWlBQ0lBRkJBbW9pQVRZQ0JBd1BDeUFBSUFBb0FnaEJBV28yQWdnTUFRc2dBOEJCQUU0TkFDQUJRUVlnQWtFRWFoQllJUU1nQWlnQ0JDRUJJQU5CZjBjTkFRc0xJQUZCQVdvaEFRd0FDd0FMUVRBaEF5QUJMUUFCUVRwclFYWkpEUU1NQkFzZ0EwRUFUZzBEUWRIREFDRUJEQWNMUVMwaEF5QUJMUUFCUVRwclFYWkpEUUlNQVF0Qkt5RURJQUFvQWt4RkRRRWdBUzBBQVVFNmEwRjJTUTBCQ3lBQUtBSUFJQUVnQWtFRWFrRUFRUW9nQUNnQ1RDSUJHeUFCUVFCSFFRSjBFTGdDSWdsQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQmlBQVFZQi9OZ0lRSUFBZ0NUY0RJQXdDQ3lBR0lBTkIvd0Z4TmdJQUlBSWdBVUVCYWpZQ0JBd0JDeUFDSUFGQkFXb2lCellDQkVHQUFTRUVJQUpCZ0FFMkFnZ2dBaUFDUVJCcUlnVTJBZ3hCQUNFQkFuOERRQ0FFUVFacklRZ0NRQU5BSUFFZ0JXb2dBem9BQUNBQlFRRnFJUUVnQnkwQUFDSUV3Q0lEUVFCSURRRWdCRUVEZGtFY2NVR2dnUUpxS0FJQUlBUjJRUUZ4UlEwQklBZEJBV29oQnlBQklBaEpEUUFMSUFBb0FnQWdBa0VNYWlBQ1FRaHFJQUpCRUdvUTlRUWhCQ0FDS0FJTUlRVkJBQ0FFRFFJYUlBSW9BZ2doQkF3QkN3c2dBQ2dDQUNBRklBRVFoUU1MSVFFZ0FrRVFhaUFGUndSQUlBQW9BZ0FvQWhBaUEwRVFhaUFGSUFNb0FnUVJBQUFMSUFJZ0J6WUNCQ0FCUlEwRUlBQkNBRGNDSkNBQVFZTi9OZ0lRSUFBZ0FUWUNJQXNnQUNBQ0tBSUVOZ0k0UVFBTUJRc2dBVUVDYWlFQkEwQWdBaUFCTmdJRUEwQUNRQUpBSUFFdEFBQWlBd1JBSUFOQkNtc09CQVlCQVFZQkN5QUJJQUFvQWp4UERRVU1BUXNnQThCQkFFNE5BQ0FCUVFZZ0FrRUVhaEJZSWdOQmZuRkJxTUFBUmdSQUlBSW9BZ1FoQVF3RkN5QUNLQUlFSVFFZ0EwRi9SdzBCQ3dzZ0FVRUJhaUVCREFBTEFBc0xJQUFnQVVFQUVCWUxJQVpCcW44MkFnQUxRWDhMSVFFZ0FrR1FBV29rQUNBQkN5RUFJQUFnQVNBQ1FnQkMvLy8vLy8vLy93OUNBQkIwSVFFZ0FDQUNFQThnQVFzcUFRRi9Jd0JCRUdzaUF5UUFJQU1nQWpZQ0RDQUFJQUVnQWtIakFFRUFFSmtFR2lBRFFSQnFKQUFMVHdBZ0FDQUJJQUpCQUU0RWZpQUNyUVZDZ0lDQWdNQitJQUs0dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeUFEUVlDQUFSRFhBUXRaQVFKL0l3QkJFR3NpQXlRQVFYOGhCQ0FBSUFOQkNHb2dBaERpQTBVRVFFRUFJUVFnQVNBREtRTUlJZ0pDZ0lDQWdJQ0FnQkJhQkg0Z0FFR0FJRUVBRUZCQmZ5RUVRZ0FGSUFJTE53TUFDeUFEUVJCcUpBQWdCQXNSQUNBQUlBRWdBU0FDSUFOQkFoQ0tCQXRUQVFGL0lBQW9BaEFpQkVFUWFpQUJJQUlnQkNnQ0NCRUJBQ0lCSUFKRmNrVUVRQ0FBRUh3Z0FROExJQU1FUUNBRElBRWdBQ2dDRUNnQ0RCRUVBQ0lBSUFKcklnSkJBQ0FBSUFKUEd6WUNBQXNnQVF2QUFRQWdBQUovSUFFb0FnZ2lBRUgrLy8vL0IwNEVRRUVBSUFKQkFYRU5BUnBCLy8vLy93Y2dBRUgrLy8vL0IwY05BUm9nQVNnQ0JFSC8vLy8vQjJvTUFRdEJBQ0FBUVFCTURRQWFJQUJCSDAwRVFFRUFJQUVvQWhBZ0FTZ0NERUVDZEdwQkJHc29BZ0JCSUNBQWEzWWlBbXNnQWlBQktBSUVHd3dCQ3lBQ1FRRnhSUVJBUVlDQWdJQjRRZi8vLy84SElBRW9BZ1FiREFFTFFRQWdBU2dDRUNBQktBSU1JZ0lnQWtFRmRDQUFheEJvSWdKcklBSWdBU2dDQkJzTE5nSUFDdzBBSUFBZ0FTQUJFRDhRaFFNTCtRRUNBMzRDZnlNQVFSQnJJZ1VrQUFKK0lBRzlJZ05DLy8vLy8vLy8vLy8vQUlNaUFrS0FnSUNBZ0lDQUNIMUMvLy8vLy8vLy8rLy9BRmdFUUNBQ1FqeUdJUVFnQWtJRWlFS0FnSUNBZ0lDQWdEeDhEQUVMSUFKQ2dJQ0FnSUNBZ1BqL0FGb0VRQ0FEUWp5R0lRUWdBMElFaUVLQWdJQ0FnSURBLy84QWhBd0JDeUFDVUFSQVFnQU1BUXNnQlNBQ1FnQWdBNmRuUVNCcUlBSkNJSWluWnlBQ1FvQ0FnSUFRVkJzaUJrRXhhaEJuSUFVcEF3QWhCQ0FGS1FNSVFvQ0FnSUNBZ01BQWhVR00rQUFnQm11dFFqQ0doQXNoQWlBQUlBUTNBd0FnQUNBQ0lBTkNnSUNBZ0lDQWdJQ0FmNE9FTndNSUlBVkJFR29rQUF1MkFRRUJmeU1BUVJCcklnTWtBQUpBQWtBZ0FrRUFTQVJBSUFFZ0FrSC8vLy8vQjNFMkFnQkJBU0VDREFFTElBQW9BaEFpQUNnQ0xDQUNUUTBCQW44Q1FDQUFLQUk0SUFKQkFuUnFLQUlBSWdBcEFnUkNnSUNBZ0lDQWdJQkFnMEtBZ0lDQWdJQ0FnTUFBVWcwQUlBTkJER29nQUJDOUJVVU5BRUVCSUFNb0Fnd2lBRUYvUncwQkdndEJBQ0VBUVFBTElRSWdBU0FBTmdJQUN5QURRUkJxSkFBZ0FnOExRZS9mQUVHdS9BQkJ2eGhCcnlBUUFBQUwxUUVDQW44RGZnSi9JQUpGQkVCQ2dJQ0FnREFoQlVFQURBRUxJQUFvQWhBaUF5a0RnQUVoQlNBRFFvQ0FnSUFnTndPQUFVRi9DeUVEQWtBZ0FDQUJRUVlnQVVFQUVCUWlCMEtBZ0lDQWNJTWlCa0tBZ0lDQUlGRWdCa0tBZ0lDQU1GRnlSUVJBUVg4aEJDQUdRb0NBZ0lEZ0FGRU5BU0FBSUFjZ0FVRUFRUUFRTHlFQkFuOGdBeUFDRFFBYVFYOGdBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFHaUFESUFGQy8vLy8vMjlXRFFBYUlBQVFKRUYvQ3lFRUlBQWdBUkFQREFFTElBTWhCQXNnQWdSQUlBQWdCUkNLQVFzZ0JBdkZBUUlCZmdKL0l3QkJFR3NpQlNRQVFvQ0FnSURnQUNFRUFrQUNRQ0FBSUFFZ0FrRUFRUUFnQlVFTWFoREhCU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQlNnQ0RDSUdRUUpIQkVBZ0F5QUdOZ0lBSUFFaEJBd0NDeUFBSUFGQjZRQWdBVUVBRUJRaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBTWdBQ0FDRUNZaUF6WUNBRUtBZ0lDQU1DRUVJQU5GQkVBZ0FDQUJRY0FBSUFGQkFCQVVJUVFMSUFBZ0FSQVBEQUVMSUFBZ0FSQVBJQU5CQURZQ0FBc2dCVUVRYWlRQUlBUUxUUUFnQUNBQklBSkJBRTRFZmlBQ3JRVkNnSUNBZ01CK0lBSzR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN5QURJQVFRdlFFTFNBQWdBQ0FCSUFKQkFFNEVmaUFDclFWQ2dJQ0FnTUIrSUFLNHZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCTkM2Y3BBUXQvSXdCQkVHc2lDeVFBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FBUWZRQlRRUkFRYkRRQkNnQ0FDSUpRUkFnQUVFTGFrRjRjU0FBUVF0Skd5SUdRUU4ySWdGMklnSkJBM0VFUUFKQUlBSkJmM05CQVhFZ0FXb2lBVUVEZENJQVFkalFCR29pQWlBQVFlRFFCR29vQWdBaUF5Z0NDQ0lBUmdSQVFiRFFCQ0FKUVg0Z0FYZHhOZ0lBREFFTElBQWdBallDRENBQ0lBQTJBZ2dMSUFOQkNHb2hBQ0FESUFGQkEzUWlBa0VEY2pZQ0JDQUNJQU5xSWdJZ0FpZ0NCRUVCY2pZQ0JBd0pDeUFHUWJqUUJDZ0NBQ0lLVFEwQklBSUVRQUpBUVFJZ0FYUWlBRUVBSUFCcmNpQUNJQUYwY1NJQVFRQWdBR3R4YUNJRFFRTjBJZ0JCMk5BRWFpSUNJQUJCNE5BRWFpZ0NBQ0lIS0FJSUlnQkdCRUJCc05BRUlBbEJmaUFEZDNFaUNUWUNBQXdCQ3lBQUlBSTJBZ3dnQWlBQU5nSUlDeUFISUFaQkEzSTJBZ1FnQmlBSGFpSUJJQU5CQTNRaUFDQUdheUlFUVFGeU5nSUVJQUFnQjJvZ0JEWUNBQ0FLQkVBZ0NrRjRjVUhZMEFScUlRQkJ4TkFFS0FJQUlRVUNmeUFKUVFFZ0NrRURkblFpQW5GRkJFQkJzTkFFSUFJZ0NYSTJBZ0FnQUF3QkN5QUFLQUlJQ3lFRElBQWdCVFlDQ0NBRElBVTJBZ3dnQlNBQU5nSU1JQVVnQXpZQ0NBc2dCMEVJYWlFQVFjVFFCQ0FCTmdJQVFialFCQ0FFTmdJQURBa0xRYlRRQkNnQ0FDSUhSUTBCSUFkQkFDQUhhM0ZvUVFKMFFlRFNCR29vQWdBaUFTZ0NCRUY0Y1NBR2F5RUVJQUVoQWdOQUFrQWdBaWdDRUNJQVJRUkFJQUlvQWhRaUFFVU5BUXNnQUNnQ0JFRjRjU0FHYXlJQ0lBUWdBaUFFU1NJQ0d5RUVJQUFnQVNBQ0d5RUJJQUFoQWd3QkN3c2dBU2dDR0NFSUlBRWdBU2dDRENJRFJ3UkFRY0RRQkNnQ0FCb2dBU2dDQ0NJQUlBTTJBZ3dnQXlBQU5nSUlEQWdMSUFGQkZHb2lBaWdDQUNJQVJRUkFJQUVvQWhBaUFFVU5BeUFCUVJCcUlRSUxBMEFnQWlFRklBQWlBMEVVYWlJQ0tBSUFJZ0FOQUNBRFFSQnFJUUlnQXlnQ0VDSUFEUUFMSUFWQkFEWUNBQXdIQzBGL0lRWWdBRUcvZjBzTkFDQUFRUXRxSWdCQmVIRWhCa0cwMEFRb0FnQWlDRVVOQUVFQUlBWnJJUVFDUUFKQUFrQUNmMEVBSUFaQmdBSkpEUUFhUVI4Z0JrSC8vLzhIU3cwQUdpQUdRU1lnQUVFSWRtY2lBR3QyUVFGeElBQkJBWFJyUVQ1cUN5SUhRUUowUWVEU0JHb29BZ0FpQWtVRVFFRUFJUUFNQVF0QkFDRUFJQVpCR1NBSFFRRjJhMEVBSUFkQkgwY2JkQ0VCQTBBQ1FDQUNLQUlFUVhoeElBWnJJZ1VnQkU4TkFDQUNJUU1nQlNJRURRQkJBQ0VFSUFJaEFBd0RDeUFBSUFJb0FoUWlCU0FGSUFJZ0FVRWRka0VFY1dvb0FoQWlBa1liSUFBZ0JSc2hBQ0FCUVFGMElRRWdBZzBBQ3dzZ0FDQURja1VFUUVFQUlRTkJBaUFIZENJQVFRQWdBR3R5SUFoeElnQkZEUU1nQUVFQUlBQnJjV2hCQW5SQjROSUVhaWdDQUNFQUN5QUFSUTBCQ3dOQUlBQW9BZ1JCZUhFZ0Jtc2lBU0FFU1NFRklBRWdCQ0FGR3lFRUlBQWdBeUFGR3lFRElBQW9BaEFpQWdSL0lBSUZJQUFvQWhRTElnQU5BQXNMSUFORkRRQWdCRUc0MEFRb0FnQWdCbXRQRFFBZ0F5Z0NHQ0VISUFNZ0F5Z0NEQ0lCUndSQVFjRFFCQ2dDQUJvZ0F5Z0NDQ0lBSUFFMkFnd2dBU0FBTmdJSURBWUxJQU5CRkdvaUFpZ0NBQ0lBUlFSQUlBTW9BaEFpQUVVTkF5QURRUkJxSVFJTEEwQWdBaUVGSUFBaUFVRVVhaUlDS0FJQUlnQU5BQ0FCUVJCcUlRSWdBU2dDRUNJQURRQUxJQVZCQURZQ0FBd0ZDeUFHUWJqUUJDZ0NBQ0lBVFFSQVFjVFFCQ2dDQUNFREFrQWdBQ0FHYXlJQ1FSQlBCRUFnQXlBR2FpSUJJQUpCQVhJMkFnUWdBQ0FEYWlBQ05nSUFJQU1nQmtFRGNqWUNCQXdCQ3lBRElBQkJBM0kyQWdRZ0FDQURhaUlBSUFBb0FnUkJBWEkyQWdSQkFDRUJRUUFoQWd0QnVOQUVJQUkyQWdCQnhOQUVJQUUyQWdBZ0EwRUlhaUVBREFjTElBWkJ2TkFFS0FJQUlncEpCRUJCdk5BRUlBb2dCbXNpQWpZQ0FFSEkwQVJCeU5BRUtBSUFJZ0VnQm1vaUFEWUNBQ0FBSUFKQkFYSTJBZ1FnQVNBR1FRTnlOZ0lFSUFGQkNHb2hBQXdIQzBFQUlRQWdCa0V2YWlJSUFuOUJpTlFFS0FJQUJFQkJrTlFFS0FJQURBRUxRWlRVQkVKL053SUFRWXpVQkVLQW9JQ0FnSUFFTndJQVFZalVCQ0FMUVF4cVFYQnhRZGlxMWFvRmN6WUNBRUdjMUFSQkFEWUNBRUhzMHdSQkFEWUNBRUdBSUFzaUJHb2lCMEVBSUFScklnVnhJZ0lnQmswTkJrSG8wd1FvQWdBaUJBUkFRZURUQkNnQ0FDSURJQUpxSWdFZ0EwMGdBU0FFUzNJTkJ3c0NRRUhzMHdRdEFBQkJCSEZGQkVBQ1FBSkFBa0FDUUVISTBBUW9BZ0FpQXdSQVFmRFRCQ0VFQTBBZ0F5QUVLQUlBSWdGUEJFQWdBU0FFS0FJRWFpQURTdzBEQ3lBRUtBSUlJZ1FOQUFzTFFRQVFsQUlpQVVGL1JnMERJQUloQjBHTTFBUW9BZ0FpQkVFQmF5SURJQUZ4QkVBZ0FpQUJheUFCSUFOcVFRQWdCR3R4YWlFSEN5QUdJQWRQRFFOQjZOTUVLQUlBSWdVRVFFSGcwd1FvQWdBaUJDQUhhaUlESUFSTklBTWdCVXR5RFFRTElBY1FsQUlpQkNBQlJ3MEJEQVVMSUFjZ0Ntc2dCWEVpQnhDVUFpSUJJQVFvQWdBZ0JDZ0NCR3BHRFFFZ0FTRUVDeUFFUVg5R0RRRWdCeUFHUVRCcVR3UkFJQVFoQVF3RUMwR1ExQVFvQWdBaUFTQUlJQWRyYWtFQUlBRnJjU0lCRUpRQ1FYOUdEUUVnQVNBSGFpRUhJQVFoQVF3REN5QUJRWDlIRFFJTFFlelRCRUhzMHdRb0FnQkJCSEkyQWdBTElBSVFsQUlpQVVGL1JrRUFFSlFDSWdKQmYwWnlJQUVnQWs5eURRY2dBaUFCYXlJSElBWkJLR3BORFFjTFFlRFRCRUhnMHdRb0FnQWdCMm9pQURZQ0FFSGswd1FvQWdBZ0FFa0VRRUhrMHdRZ0FEWUNBQXNDUUVISTBBUW9BZ0FpQlFSQVFmRFRCQ0VBQTBBZ0FTQUFLQUlBSWdNZ0FDZ0NCQ0lDYWtZTkFpQUFLQUlJSWdBTkFBc01CQXRCd05BRUtBSUFJZ0JCQUNBQUlBRk5HMFVFUUVIQTBBUWdBVFlDQUF0QkFDRUFRZlRUQkNBSE5nSUFRZkRUQkNBQk5nSUFRZERRQkVGL05nSUFRZFRRQkVHSTFBUW9BZ0EyQWdCQi9OTUVRUUEyQWdBRFFDQUFRUU4wSWdOQjROQUVhaUFEUWRqUUJHb2lBallDQUNBRFFlVFFCR29nQWpZQ0FDQUFRUUZxSWdCQklFY05BQXRCdk5BRUlBZEJLR3NpQTBGNElBRnJRUWR4UVFBZ0FVRUlha0VIY1JzaUFHc2lBallDQUVISTBBUWdBQ0FCYWlJQU5nSUFJQUFnQWtFQmNqWUNCQ0FCSUFOcVFTZzJBZ1JCek5BRVFaalVCQ2dDQURZQ0FBd0VDeUFBTFFBTVFRaHhJQU1nQlV0eUlBRWdCVTF5RFFJZ0FDQUNJQWRxTmdJRVFjalFCQ0FGUVhnZ0JXdEJCM0ZCQUNBRlFRaHFRUWR4R3lJQWFpSUJOZ0lBUWJ6UUJFRzgwQVFvQWdBZ0Iyb2lBaUFBYXlJQU5nSUFJQUVnQUVFQmNqWUNCQ0FDSUFWcVFTZzJBZ1JCek5BRVFaalVCQ2dDQURZQ0FBd0RDMEVBSVFNTUJBdEJBQ0VCREFJTFFjRFFCQ2dDQUNBQlN3UkFRY0RRQkNBQk5nSUFDeUFCSUFkcUlRSkI4Tk1FSVFBQ1FBSkFBa0FDUUFKQUFrQURRQ0FDSUFBb0FnQkhCRUFnQUNnQ0NDSUFEUUVNQWdzTElBQXRBQXhCQ0hGRkRRRUxRZkRUQkNFQUEwQWdCU0FBS0FJQUlnSlBCRUFnQWlBQUtBSUVhaUlFSUFWTERRTUxJQUFvQWdnaEFBd0FDd0FMSUFBZ0FUWUNBQ0FBSUFBb0FnUWdCMm8yQWdRZ0FVRjRJQUZyUVFkeFFRQWdBVUVJYWtFSGNSdHFJZ2NnQmtFRGNqWUNCQ0FDUVhnZ0FtdEJCM0ZCQUNBQ1FRaHFRUWR4RzJvaUNTQUdJQWRxSWdocklRQWdCU0FKUmdSQVFjalFCQ0FJTmdJQVFielFCRUc4MEFRb0FnQWdBR29pQURZQ0FDQUlJQUJCQVhJMkFnUU1Bd3RCeE5BRUtBSUFJQWxHQkVCQnhOQUVJQWcyQWdCQnVOQUVRYmpRQkNnQ0FDQUFhaUlBTmdJQUlBZ2dBRUVCY2pZQ0JDQUFJQWhxSUFBMkFnQU1Bd3NnQ1NnQ0JDSUVRUU54UVFGR0JFQWdCRUY0Y1NFRkFrQWdCRUgvQVUwRVFDQUVRUU4ySVFJZ0NTZ0NEQ0lCSUFrb0FnZ2lBMFlFUUVHdzBBUkJzTkFFS0FJQVFYNGdBbmR4TmdJQURBSUxJQU1nQVRZQ0RDQUJJQU0yQWdnTUFRc2dDU2dDR0NFR0FrQWdDU0FKS0FJTUlnRkhCRUFnQ1NnQ0NDSUNJQUUyQWd3Z0FTQUNOZ0lJREFFTEFrQWdDVUVVYWlJRUtBSUFJZ0lOQUNBSlFSQnFJZ1FvQWdBaUFnMEFRUUFoQVF3QkN3TkFJQVFoQXlBQ0lnRkJGR29pQkNnQ0FDSUNEUUFnQVVFUWFpRUVJQUVvQWhBaUFnMEFDeUFEUVFBMkFnQUxJQVpGRFFBQ1FDQUpLQUljSWdOQkFuUkI0TklFYWlJQ0tBSUFJQWxHQkVBZ0FpQUJOZ0lBSUFFTkFVRzAwQVJCdE5BRUtBSUFRWDRnQTNkeE5nSUFEQUlMSUFaQkVFRVVJQVlvQWhBZ0NVWWJhaUFCTmdJQUlBRkZEUUVMSUFFZ0JqWUNHQ0FKS0FJUUlnSUVRQ0FCSUFJMkFoQWdBaUFCTmdJWUN5QUpLQUlVSWdKRkRRQWdBU0FDTmdJVUlBSWdBVFlDR0FzZ0JTQUphaUlKS0FJRUlRUWdBQ0FGYWlFQUN5QUpJQVJCZm5FMkFnUWdDQ0FBUVFGeU5nSUVJQUFnQ0dvZ0FEWUNBQ0FBUWY4QlRRUkFJQUJCZUhGQjJOQUVhaUVDQW45QnNOQUVLQUlBSWdGQkFTQUFRUU4yZENJQWNVVUVRRUd3MEFRZ0FDQUJjallDQUNBQ0RBRUxJQUlvQWdnTElRQWdBaUFJTmdJSUlBQWdDRFlDRENBSUlBSTJBZ3dnQ0NBQU5nSUlEQU1MUVI4aEJDQUFRZi8vL3dkTkJFQWdBRUVtSUFCQkNIWm5JZ0pyZGtFQmNTQUNRUUYwYTBFK2FpRUVDeUFJSUFRMkFod2dDRUlBTndJUUlBUkJBblJCNE5JRWFpRURBa0JCdE5BRUtBSUFJZ0ZCQVNBRWRDSUNjVVVFUUVHMDBBUWdBU0FDY2pZQ0FDQURJQWcyQWdBZ0NDQUROZ0lZREFFTElBQkJHU0FFUVFGMmEwRUFJQVJCSDBjYmRDRUVJQU1vQWdBaEFRTkFJQUVpQWlnQ0JFRjRjU0FBUmcwRElBUkJIWFloQVNBRVFRRjBJUVFnQWlBQlFRUnhhaUlEUVJCcUtBSUFJZ0VOQUFzZ0F5QUlOZ0lRSUFnZ0FqWUNHQXNnQ0NBSU5nSU1JQWdnQ0RZQ0NBd0NDMEc4MEFRZ0IwRW9heUlEUVhnZ0FXdEJCM0ZCQUNBQlFRaHFRUWR4R3lJQWF5SUNOZ0lBUWNqUUJDQUFJQUZxSWdBMkFnQWdBQ0FDUVFGeU5nSUVJQUVnQTJwQktEWUNCRUhNMEFSQm1OUUVLQUlBTmdJQUlBVWdCRUVuSUFSclFRZHhRUUFnQkVFbmEwRUhjUnRxUVM5cklnQWdBQ0FGUVJCcVNSc2lBMEViTmdJRUlBTkIrTk1FS1FJQU53SVFJQU5COE5NRUtRSUFOd0lJUWZqVEJDQURRUWhxTmdJQVFmVFRCQ0FITmdJQVFmRFRCQ0FCTmdJQVFmelRCRUVBTmdJQUlBTkJHR29oQUFOQUlBQkJCellDQkNBQVFRaHFJUUlnQUVFRWFpRUFJQUlnQkVrTkFBc2dBeUFGUmcwRElBTWdBeWdDQkVGK2NUWUNCQ0FGSUFNZ0JXc2lCRUVCY2pZQ0JDQURJQVEyQWdBZ0JFSC9BVTBFUUNBRVFYaHhRZGpRQkdvaEFBSi9RYkRRQkNnQ0FDSUJRUUVnQkVFRGRuUWlBbkZGQkVCQnNOQUVJQUVnQW5JMkFnQWdBQXdCQ3lBQUtBSUlDeUVDSUFBZ0JUWUNDQ0FDSUFVMkFnd2dCU0FBTmdJTUlBVWdBallDQ0F3RUMwRWZJUUFnQkVILy8vOEhUUVJBSUFSQkppQUVRUWgyWnlJQWEzWkJBWEVnQUVFQmRHdEJQbW9oQUFzZ0JTQUFOZ0ljSUFWQ0FEY0NFQ0FBUVFKMFFlRFNCR29oQXdKQVFiVFFCQ2dDQUNJQlFRRWdBSFFpQW5GRkJFQkJ0TkFFSUFFZ0FuSTJBZ0FnQXlBRk5nSUFJQVVnQXpZQ0dBd0JDeUFFUVJrZ0FFRUJkbXRCQUNBQVFSOUhHM1FoQUNBREtBSUFJUU1EUUNBRElnSW9BZ1JCZUhFZ0JFWU5CQ0FBUVIxMklRRWdBRUVCZENFQUlBSWdBVUVFY1dvaUFVRVFhaWdDQUNJRERRQUxJQUVnQlRZQ0VDQUZJQUkyQWhnTElBVWdCVFlDRENBRklBVTJBZ2dNQXdzZ0FpZ0NDQ0lBSUFnMkFnd2dBaUFJTmdJSUlBaEJBRFlDR0NBSUlBSTJBZ3dnQ0NBQU5nSUlDeUFIUVFocUlRQU1CQXNnQWlnQ0NDSUFJQVUyQWd3Z0FpQUZOZ0lJSUFWQkFEWUNHQ0FGSUFJMkFnd2dCU0FBTmdJSUMwRUFJUUJCdk5BRUtBSUFJZ0lnQmswTkFrRzgwQVFnQWlBR2F5SUNOZ0lBUWNqUUJFSEkwQVFvQWdBaUFTQUdhaUlBTmdJQUlBQWdBa0VCY2pZQ0JDQUJJQVpCQTNJMkFnUWdBVUVJYWlFQURBSUxBa0FnQjBVTkFBSkFJQU1vQWh3aUFrRUNkRUhnMGdScUlnQW9BZ0FnQTBZRVFDQUFJQUUyQWdBZ0FRMEJRYlRRQkNBSVFYNGdBbmR4SWdnMkFnQU1BZ3NnQjBFUVFSUWdCeWdDRUNBRFJodHFJQUUyQWdBZ0FVVU5BUXNnQVNBSE5nSVlJQU1vQWhBaUFBUkFJQUVnQURZQ0VDQUFJQUUyQWhnTElBTW9BaFFpQUVVTkFDQUJJQUEyQWhRZ0FDQUJOZ0lZQ3dKQUlBUkJEMDBFUUNBRElBUWdCbW9pQUVFRGNqWUNCQ0FBSUFOcUlnQWdBQ2dDQkVFQmNqWUNCQXdCQ3lBRElBWkJBM0kyQWdRZ0F5QUdhaUlGSUFSQkFYSTJBZ1FnQkNBRmFpQUVOZ0lBSUFSQi93Rk5CRUFnQkVGNGNVSFkwQVJxSVFBQ2YwR3cwQVFvQWdBaUFVRUJJQVJCQTNaMElnSnhSUVJBUWJEUUJDQUJJQUp5TmdJQUlBQU1BUXNnQUNnQ0NBc2hCQ0FBSUFVMkFnZ2dCQ0FGTmdJTUlBVWdBRFlDRENBRklBUTJBZ2dNQVF0Qkh5RUFJQVJCLy8vL0IwMEVRQ0FFUVNZZ0JFRUlkbWNpQUd0MlFRRnhJQUJCQVhSclFUNXFJUUFMSUFVZ0FEWUNIQ0FGUWdBM0FoQWdBRUVDZEVIZzBnUnFJUUVDUUFKQUlBaEJBU0FBZENJQ2NVVUVRRUcwMEFRZ0FpQUljallDQUNBQklBVTJBZ0FnQlNBQk5nSVlEQUVMSUFSQkdTQUFRUUYyYTBFQUlBQkJIMGNiZENFQUlBRW9BZ0FoQmdOQUlBWWlBaWdDQkVGNGNTQUVSZzBDSUFCQkhYWWhBU0FBUVFGMElRQWdBaUFCUVFSeGFpSUJRUkJxS0FJQUlnWU5BQXNnQVNBRk5nSVFJQVVnQWpZQ0dBc2dCU0FGTmdJTUlBVWdCVFlDQ0F3QkN5QUNLQUlJSWdBZ0JUWUNEQ0FDSUFVMkFnZ2dCVUVBTmdJWUlBVWdBallDRENBRklBQTJBZ2dMSUFOQkNHb2hBQXdCQ3dKQUlBaEZEUUFDUUNBQktBSWNJZ0pCQW5SQjROSUVhaUlBS0FJQUlBRkdCRUFnQUNBRE5nSUFJQU1OQVVHMDBBUWdCMEYrSUFKM2NUWUNBQXdDQ3lBSVFSQkJGQ0FJS0FJUUlBRkdHMm9nQXpZQ0FDQURSUTBCQ3lBRElBZzJBaGdnQVNnQ0VDSUFCRUFnQXlBQU5nSVFJQUFnQXpZQ0dBc2dBU2dDRkNJQVJRMEFJQU1nQURZQ0ZDQUFJQU0yQWhnTEFrQWdCRUVQVFFSQUlBRWdCQ0FHYWlJQVFRTnlOZ0lFSUFBZ0FXb2lBQ0FBS0FJRVFRRnlOZ0lFREFFTElBRWdCa0VEY2pZQ0JDQUJJQVpxSWdVZ0JFRUJjallDQkNBRUlBVnFJQVEyQWdBZ0NnUkFJQXBCZUhGQjJOQUVhaUVBUWNUUUJDZ0NBQ0VIQW45QkFTQUtRUU4yZENJQ0lBbHhSUVJBUWJEUUJDQUNJQWx5TmdJQUlBQU1BUXNnQUNnQ0NBc2hBeUFBSUFjMkFnZ2dBeUFITmdJTUlBY2dBRFlDRENBSElBTTJBZ2dMUWNUUUJDQUZOZ0lBUWJqUUJDQUVOZ0lBQ3lBQlFRaHFJUUFMSUF0QkVHb2tBQ0FBQ3g4QUlBQWdBU0FBSUFJUXFnRWlBaUFCUVFBUUZDRUJJQUFnQWhBVElBRUxEUUFnQUVFQUlBRkJBQkNWQkF1WUFRRUJmd0pBSUFKRklBRkNnSUNBZ0hDRFFvQ0FnSUNRZjFKeVJRUkFJQUduSWdNZ0F5Z0NBRUVCYWpZQ0FFRUVJUUlnQUNnQ0FDZ0NFQ0FERVB3RElnTkJBRW9OQVFzZ0FVSWdpS2RCZFU4RVFDQUJweUlDSUFJb0FnQkJBV28yQWdBTFFRSWhBaUFBS0FJQUlBQkJRR3NvQWdBZ0FSQytBeUlEUVFCT0RRQkJmdzhMSUFBZ0FoQVFJQUJCUUdzb0FnQWdBeEE1UVFBTHNRVUJCMzhDUUFKQUFrQWdBRUZBYXlnQ0FDSUxLQUtZQWlJT1FRQklEUUJCQWlFTkFrQUNRQ0FMS0FLQUFpQU9haUlNTFFBQUlnaEJ4d0JyRGdRRUFnSUJBQXNnQ0VIQkFFWU5BaUFJUWI0QlJ3UkFJQWhCdUFGSERRSWdEQ2dBQVNJSlFRaEdEUUlnREM4QUJTRUtJQWxCT2tjRVFDQUpRZkVBUmcwRElBbEJ6UUJIRFFVTElBc3RBRzVCQVhGRkRRUWdBRUhTNndCQkFCQVdRWDhQQ3lBTUx3QUZJUW9nRENnQUFTRUpRUUVoRFF3REMwRURJUTBNQWdzZ0IwRzlmMFlFUUNBQVFaUHZBRUVBRUJaQmZ3OExJQWRCNndCcVFRRk5CRUFnQUVIYTh3QkJBQkFXUVg4UEN5QUhRVjl4UWRzQVJnUkFJQUJCaFM5QkFCQVdRWDhQQ3lBQVFiVHZBRUVBRUJaQmZ3OExJQXdvQUFFaENVRUJJUTBMUVg4aEJ5QUxRWDgyQXBnQ0lBc2dEallDaEFJQ1FBSkFJQVlFUUFKQUFrQUNRQUpBSUFoQnh3QnJEZ1FCQXdNQ0FBc0NRQ0FJUWNFQVJ3UkFJQWhCdmdGR0RRRWdDRUc0QVVjTkJDQUxFREloQnlBQVFic0JFQkFnQUNBSkVCb2dBRUZBYXlJR0tBSUFJQWNRT1NBR0tBSUFJQW9RRnlBTElBZEJBUkJwR2tFOElRZ2dBRUU4RUJBTUJ3c2dBRUhDQUJBUUlBQWdDUkFhUWNFQUlRZ01CZ3NnQUVHL0FSQVFJQUFnQ1JBYUlBQkJRR3NvQWdBZ0NoQVhRYjRCSVFnTUJRc2dBRUh4QUJBUUlBQkJFeEFRUWNjQUlRZ01Bd3NnQUVId0FCQVFJQUJCRkJBUVFjb0FJUWdNQWdzUUFRQUxBa0FDUUFKQUlBaEJ4d0JyRGdRQkJBUUNBQXNnQ0VHNEFVY05BeUFMRURJaEJ5QUFRYnNCRUJBZ0FDQUpFQm9nQUVGQWF5SUFLQUlBSUFjUU9TQUFLQUlBSUFvUUZ5QUxJQWRCQVJCcEdrRThJUWdNQXdzZ0FFSHhBQkFRUWNjQUlRZ01BZ3NnQUVId0FCQVFRY29BSVFnTUFRc2dBQ0FJRUJBTElBRWdDRFlDQUNBQ0lBbzJBZ0FnQXlBSk5nSUFJQVFnQnpZQ0FDQUZCRUFnQlNBTk5nSUFDMEVBQzhjTUFRWi9Jd0JCSUdzaUJDUUFBa0FDUUFKQUFrQUNRQUpBQWtBQ2Z5QUFLQUlRSWdKQmczOUhCRUJCQUNBQ1FWbEhEUUVhSUFCQlFHc29BZ0FpQWkwQWJFRUJjVVVFUUNBQVFabnhBRUVBRUJZTUF3c2dBaWdDWkVVRVFDQUFRYXpOQUVFQUVCWU1Bd3RCZnlFRElBQVFFZzBJQWtBQ1FBSkFBa0FnQUNnQ0VDSUZRU2xyRGdRQ0FRRUNBQXNnQlVIZEFFWWdCVUU2YTBFQ1NYSWdCVUg5QUVaeURRRUxJQUFvQWpBTkFFRUFJUUlnQlVFcVJnUkFJQUFRRWcwTFFRRWhBZ3NnQUNBQkVMWUJSUTBCREFvTElBQkJCaEFRUVFBaEFnc2dBRUZBYXlJRktBSUFJZ010QUd3aEFTQUNCRUFnQXhBeUlRTWdCU2dDQUJBeUlRSWdBRUgrQUVIOUFDQUJRUU5HR3hBUUlBQkJEaEFRSUFCQkJoQVFJQUJCQmhBUUlBQWdBeEFlSUFCQmhRRVFFQ0FCUVFOSElnZEZCRUFnQUVHTEFSQVFDeUFBUVlFQkVCQWdBRUhDQUJBUUlBQkI2UUFRR2lBQVFlb0FRWDhRSENFR0lBQWdBaEFlUVlrQklRVWdBQ0FIQkg5QmlRRUZJQUJCd1FBUUVDQUFRY0FBRUJvZ0FFR0xBUkFRUVlvQkN4QVFJQUJCRVJBUUlBQkI2Z0JCZnhBY0lRVWdBRUVPRUJBZ0FFSHJBQ0FERUJ3YUlBQWdCUkFlSUFCQkFSQVFJQUJCUUdzaUF5Z0NBRUVDRURrZ0FFR3JBUkFRSUFCQjZnQkJmeEFjSVFVZ0FVRURSeUlIUlFSQUlBQkJpd0VRRUFzZ0FFR0dBUkFRSUFNb0FnQkJBQkJrSUFCQjZnQkJmeEFjSVFNZ0IwVUVRQ0FBUVlzQkVCQUxJQUJCZ1FFUUVDQUFRY0lBRUJBZ0FFSHBBQkFhSUFCQjZRQWdBaEFjR2lBQVFjRUFFQkFnQUVIQUFCQWFJQUFnQXhBZUlBQkJEeEFRSUFCQkR4QVFJQUJCRHhBUUlBQkJBUkRsQWlBQUlBVVFIaUFBUVlZQkVCQWdBRUZBYXlJREtBSUFRUUVRWkNBQVFlb0FRWDhRSENFRklBRkJBMGNpQVVVRVFDQUFRWXNCRUJBTElBQkJnUUVRRUNBQVFjSUFFQkFnQUVIcEFCQWFJQUJCNlFBZ0FoQWNHaUFBUWVzQUlBWVFIQm9nQUNBRkVCNGdBRUdHQVJBUUlBTW9BZ0JCQWhCa0lBQkI2Z0JCZnhBY0lRSWdBVVVFUUNBQVFZc0JFQkFMSUFBZ0FoQWVJQUJCTUJBUVFRQWhBeUFBUVFBUUdpQUFRVUJyS0FJQVFRUVFaQ0FBSUFZUUhpQUFRY0VBRUJBZ0FFSEFBQkFhSUFCQkR4QVFJQUJCRHhBUUlBQkJEeEFRREFrTElBRkJBMFlFUUNBQVFZc0JFQkFMSUFCQmlBRVFFQ0FBUWVrQVFYOFFIQ0VCSUFCQkFSRGxBZ3dFQ3lBQUtBSWdDeUVGUVg4aEF5QUFRYU4vSUFGQkJISVF1Z01OQmlBQUtBSVFJZ0pCcUg5R0JFQWdBVUY3Y1NFR0lBQkJRR3NvQWdBUU1pRUNBMEFnQUJBU0RRZ2dBRUVSRUJBZ0FFR3dBUkFRSUFCQjZRQWdBaEFjR2lBQVFRNFFFQ0FBUVFnZ0JoQ2VBZzBJSUFBb0FoQkJxSDlHRFFBTElBQWdBaEFlSUFBb0FoQWhBZ3NnQWtFL1JnUkFJQUFRRWcwSElBQkI2UUJCZnhBY0lRSWdBQkJXRFFjZ0FFRTZFQ3dOQnlBQVFlc0FRWDhRSENFR0lBQWdBaEFlSUFBZ0FVRUJjUkMyQVEwSElBQWdCaEFlSUFBb0FoQWhBZ3NnQWtFOVJ5QUNRZnNBYWlJRFFReExjVVVFUUNBQUVCSU5BU0FBSUFSQkhHb2dCRUVZYWlBRVFSUnFJQVJCRUdwQkFDQUNRVDFISUFJUXRRRkJBRWdOQVNBQUlBRVF0Z0VFUUNBQUtBSUFJQVFvQWhRUUV3d0NDeUFDUVQxR0JFQWdCQ2dDSENJQlFUeEhEUWNnQkNnQ0ZDQUZSdzBHSUFBZ0JSQ2hBUXdHQ3lBQVFiSi9JQU5COE5JQmFpMEFBQ0lCSUFOQkFrWWJJQUVnQUNnQ1FDMEFia0VFY1J0Qi93RnhFQkFnQkNnQ0hDRUJEQVlMUVFBaEF5QUNRZTRBYWtFQ1N3MEdJQUFRRWcwQUlBQWdCRUVjYWlBRVFSaHFJQVJCRkdvZ0JFRVFhaUFFUVF4cVFRRWdBaEMxQVVFQVNBMEFJQUJCRVJBUUlBSkJsSDlHQkVBZ0FFR3dBUkFRQ3lBQVFlb0FRZWtBSUFKQmszOUdHMEYvRUJ3aEFpQUFRUTRRRUNBQUlBRVF0Z0ZGRFFFZ0FDZ0NBQ0FFS0FJVUVCTUxRWDhoQXd3RkN5QUVLQUljSWdGQlBFY2dCQ2dDRkNJRElBVkhja1VFUUNBQUlBVVFvUUVMSUFRb0FneEJBV3NpQlVFRFR3MEJJQUFnQlVFVmFrSC9BWEVRRUNBQUlBRWdCQ2dDR0NBRElBUW9BaEJCQVVFQUVNRUJJQUJCNndCQmZ4QWNJUUVnQUNBQ0VCNGdCQ2dDRENFREEwQWdBd1JBSUFCQkR4QVFJQVFnQkNnQ0RFRUJheUlETmdJTURBRUxDd3NnQUNBQkVCNUJBQ0VEREFNTEVBRUFDMEU4SVFFTFFRQWhBeUFBSUFFZ0JDZ0NHQ0FFS0FJVUlBUW9BaEJCQWtFQUVNRUJDeUFFUVNCcUpBQWdBd3RhQVFOL0l3QkJFR3NpQVNRQUFrQWdBQ2dDRUNJRFFheC9SZzBBSUFOQk8wY0VRQ0FEUWYwQVJnMEJJQUFvQWpBTkFTQUJRVHMyQWdBZ0FFR2dtQUVnQVJBV1FYOGhBZ3dCQ3lBQUVCSWhBZ3NnQVVFUWFpUUFJQUlMR3dBZ0FDQUJRZjhCY1JBUklBQW9BZ1FoQVNBQUlBSVFIU0FCQ3pzQUFuOGdBQ0FCUVlDQUJFOEVmMEYvSUFBZ0FVR0FnQVJyUVFwMlFZQ3dBMm9RaXdFTkFSb2dBVUgvQjNGQmdMZ0RjZ1VnQVFzUWl3RUxDeWtCQVg4Z0FrSWdpS2RCZFU4RVFDQUNweUlESUFNb0FnQkJBV28yQWdBTElBQWdBU0FDRUlzRkN5a0JBWDhnQWtJZ2lLZEJkVThFUUNBQ3B5SURJQU1vQWdCQkFXbzJBZ0FMSUFBZ0FTQUNFS3NGQzRZR0F3ZC9BbndDZmlNQVFUQnJJZ2NrQUVFSElBSkNJSWluSWdRZ0JFRUhhMEZ1U1JzaEJVRUFJUVFDUUFKQUFrQUNRQUpBQW53Q1FBSkFBa0FDUUFKQUFrQUNRRUVISUFGQ0lJaW5JZ1lnQmtFSGEwRnVTUnNpQmtFTGFnNFRDZ2dKQXdJTEN3c0xDd1FGQUFFQkN3c0xCZ3NMSUFWQkFVY05DaUFCcHlBQ3AwWWhCQXdMQ3lBRklBWkdJUVFNQ1FzZ0JVRjVSdzBJSUFHbklBS25FSU1DUlNFRURBZ0xJQUduSUFLblJpQUZRWGhHY1NFRURBY0xJQVZCZjBjTkJpQUJweUFDcDBZaEJBd0dDeUFCcDdjaEN5QUZRUWRIQkVBZ0JRMEdJQUtudHd3Q0N5QUNRb0NBZ0lEQWdZRDgvd0I4dnd3QkN5QUJRb0NBZ0lEQWdZRDgvd0I4dnlFTElBVUVRQ0FGUVFkSERRVWdBa0tBZ0lDQXdJR0EvUDhBZkw4TUFRc2dBcWUzQ3lFTUFrQWdBd1JBSUF5OUlnSkMvLy8vLy8vLy8vLy9BSU1pQVVLQmdJQ0FnSUNBK1A4QVZDQUx2U0lOUXYvLy8vLy8vLy8vL3dDRElnNUNnSUNBZ0lDQWdQai9BRmh4UlFSQUlBNUNnWUNBZ0lDQWdQai9BRlFnQVVLQWdJQ0FnSUNBK1A4QVZuTWhCQXdIQ3lBRFFRSkhEUUVMSUFzZ0RHRWhCQXdGQ3lBQ0lBMVJJUVFNQkFzZ0JVRjJSdzBDSUFBZ0IwRWNhaUlHSUFFUXV3SWlBeUFBSUFkQkNHb2dBaEM3QWlJRkVJSUNJUVFnQXlBR1JnUkFJQWRCSEdvUUd3c2dCU0FIUVFocVJ3MENJQWRCQ0dvUUd3d0NDeUFGUVhkSERRRWdBcWNpQlVFRWFpRUlJQUduSWdaQkJHb2hDUUpBQWtBQ1FBSkFBa0FDUUFKQUlBTU9Bd1lCQUFFTElBWW9BZ3dpQkVHQWdJQ0FlRWNOQVVFQklRUWdCU2dDREVHQWdJQ0FlRVlOQnlBRktBSU1JUU5CZ0lDQWdIZ2hCQXdDQ3lBR0tBSU1JUVFMSUFVb0Fnd2hBeUFFUWYvLy8vOEhSZzBCQ3lBRFFmLy8vLzhIUnlFS1FmLy8vLzhISVFNZ0NnMEJDeUFESUFSR0lRUU1Bd3RCQUNFRUlBWW9BZ2dpQXlBRktBSUlSdzBDUVFBZ0NTQUlFTk1CSWdScklBUWdBeHRGSVFRTUFnc2dDU0FJRUlJQ0lRUU1BUXNnQlVGMVJ3MEFJQUduUVFScUlBS25RUVJxRUlnRFJTRUVDeUFBSUFFUUR5QUFJQUlRRHdzZ0IwRXdhaVFBSUFRTE53RUJmeUFBSUFJUU1TRUZJQUFnQWhBUElBVkZCRUFnQUNBREVBOUJmdzhMSUFBZ0FTQUZJQU1nQkJBWklRUWdBQ0FGRUJNZ0JBdkNBUUVGZnlNQVFTQnJJZ1VrQUFKK0FrQWdBa0tBZ0lDQWNJTkNnSUNBZ0pCL1VnUkFJQUFnQWhBM0lnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFRc2dBQ0FGUVFocUlBRVFQeUlISUFNUVB5SUlhaUFDcHlJR0tBSUVJZ1JCLy8vLy93ZHhhaUFFUVI5MkVJb0REUUFnQlVFSWFpSUVJQUVnQnhDSUFob2dCQ0FHUVFBZ0JpZ0NCRUgvLy8vL0IzRVFVUm9nQkNBRElBZ1FpQUlhSUFBZ0FoQVBJQVFRTmd3QkN5QUFJQUlRRDBLQWdJQ0E0QUFMSVFJZ0JVRWdhaVFBSUFJTElBRUJmaUFBSUFBZ0FpQUJJQU5CQkVFQUVJSUJJZ1VnQVNBRUVONEJJQVVMTkFFQmZ5QUFRVUJySWdFb0FnQW9BcVFCUVFCT0JFQWdBRUVHRUJBZ0FFSFpBQkFRSUFFb0FnQWlBQ0FBTHdHa0FSQVhDd3VKQXdBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFGQnh3QnJEZ1FCRFEwQ0FBc2dBVUU4UndSQUlBRkJ2Z0ZIQkVBZ0FVRzRBVVlOQnlBQlFjRUFSdzBPQzBFVklRUUNRQ0FGRGdVR0JnVUVBQTRMUVJzaEJBd0VDeUFBS0FJQUlBTVFFeUFBSUFRUUhndEJzd0VoQkFKQUFrQUNRQ0FGRGdVRkJnQUJBZzRMUVJZaEJBd0VDMEVaSVFRTUF3dEJIU0VFREFJTFFSY2hBUUpBSUFVT0JRb0tDUWdBQ3d0Qkh5RUJEQWdMUVJnaEJBc2dBQ0FFRUJBTEFrQWdBVUhIQUdzT0JBTUlDQWNBQ3lBQlFUeEdEUU1nQVVIQkFFWU5DQ0FCUWI0QlJnMEJJQUZCdUFGSERRY0xJQVZCQWs4TkNDQUFRYjBCUWJrQklBWWJFQkFNQ1FzZ0FFSEFBUkFRREFnTElBQkJ5UUFRRUE4TElBQkJQUkFRRHd0QkdpRUJDeUFBSUFFUUVBc2dBRUhMQUJBUUR3c1FBUUFMSUFCQnd3QVFFQ0FBUVVCcktBSUFJQU1RT1E4TFFmNkVBVUd1L0FCQnQ3a0JRYUxoQUJBQUFBc2dBRUZBYXlJQUtBSUFJQU1RT1NBQUtBSUFJQUpCLy84RGNSQVhDODBUQVF0L0l3QkJRR29pQmlRQUlBUkJBRWdFUUNBQUlBWkJLR3BCQUJDZUFSb2dCaWdDS0VFQ2NTRUVDeUFBUVVCcklnY29BZ0FRTWlFTElBY29BZ0FRTWlFTUlBY29BZ0FvQW9RQ0lRNENRQ0FEQkVBZ0FFRVJFQkFnQUVFR0VCQWdBRUdyQVJBUUlBQkI2Z0FnQ3hBY0dpQUFJQXdRSGd3QkN5QUFRZXNBSUFzUUhCb2dBQ0FNRUI0Z0FFRVJFQkFMSUFCQlFHc29BZ0FvQW9RQ0lROENRQUpBQWtBQ1FBSkFJQUFvQWhBaUIwSGJBRWNFUUNBSFFmc0FSZ1JBUVg4aEJ5QUFFQklOQmlBQVFlOEFFQkFnQkFSQUlBQkJDeEFRSUFCQkd4QVFDeUFCUVV0R0lBRkJVMFp5SVEwZ0FVR3pmMGNoRUFOQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FBS0FJUUlnZEJwMzlIQkVBZ0IwSDlBRVlOQ3lBQUlBWkJPR3BCQUVFQlFRQVF4QU1pQjBFQVNBMFNJQVpCdUFFMkFqQWdCa0VBTmdJMElBQkJRR3NpQ1NnQ0FDSUtLQUs4QVNFSUlBWkJmellDUENBR0lBZzJBaXdnQmtFQU5nSUlJQWNOQWlBQUVCSkZEUUVnQmlnQ09DRUhEQVlMSUFSRkJFQWdBQ2dDQUVHSTBRQkJBQkJHREJJTFFYOGhCeUFBRUJJTkVnSkFJQUVFUUNBR0lBQWdBaEM4QXlJSU5nSTBJQWhGRFJRZ0JrRzRBVFlDTUNBQVFVQnJLQUlBS0FLOEFTRUhJQVpCZnpZQ1BDQUdJQWMyQWl3Z0JrRUFOZ0lJREFFTElBQVFvd0lORXlBQUlBWkJNR29nQmtFc2FpQUdRVFJxSUFaQlBHb2dCa0VJYWtFQVFmc0FFTFVCRFJNTElBQW9BaEJCL1FCR0RRSWdBRUhvSmtFQUVCWU1FQXNDUUNBQUtBSVFRU0J5UWZzQVJ3MEFJQUFnQmtFb2FrRUFFSjRCSWdkQkxFWWdCMEg5QUVaeVJTQUhRVDFIY1EwQUFrQWdCaWdDT0NJSFJRUkFJQVFFUUNBQVFmQUFFQkFnQUVFWUVCQWdBRUVIRUJBZ0FFSFJBQkFRSUFCQkdCQVFDeUFBUWNnQUVCQU1BUXNnQkFSQUlBQkJHeEFRSUFCQkJ4QVFJQUJCekFBUUVDQUFJQWNRR2lBQVFSc1FFQXNnQUVIQ0FCQVFJQWtvQWdBZ0J4QTVDMEYvSVFjZ0FDQUJJQUpCQVVGL1FRRVF3Z0ZCQUVnTkVpQUFLQUlRUWYwQVJnMEtJQUJCTEJBc1JRMExEQklMQWtBQ2Z5QUdLQUk0SWdkRkJFQWdBRUh4QUJBUUlBUkZCRUJCRWlFSURBTUxRUmdoQ2lBQVFSZ1FFQ0FBUVFjUUVDQUFRZEVBRUJCQkVnd0JDeUFFUlFSQVFSRWhDQXdDQzBFYklRb2dBRUViRUJBZ0FFRUhFQkFnQUVITUFCQVFJQUFnQnhBYVFSRUxJUWdnQUNBS0VCQUxJQUFnQ0JBUUlBRUVRQ0FHSUFBZ0FoQzhBeUlJTmdJMElBaEZEUVVnQjBVTkJBd0dDeUFBRUtNQ0RRUU1BZ3NDUUNBQ0JIOGdBQ0FHS0FJNElnY1Exd1FOQlNBSktBSUFCU0FLQ3kwQWJrRUJjVVVOQUNBR0tBSTRJZ2RCelFCSElBZEJPa2R4RFFBZ0FFR0ZMMEVBRUJZTUJBc2dCQVJBSUFCQkd4QVFJQUJCQnhBUUlBQkJ6QUFRRUNBQUlBWW9BamdRR2lBQVFSc1FFQXNnQVVFQUlCQWJSUVJBSUFCQkVSQVFJQUJCdUFFUUVDQUFJQVlvQWpnaUJ4QWFJQWtvQWdBaUNDQUlMd0c4QVJBWERBSUxJQVlnQUNnQ0FDQUdLQUk0RUJnaUJ6WUNOQ0FBUWNJQUVCQWdDU2dDQUNBSEVEa01CZ3NnQUVFTEVCQWdBRUhUQUJBUUlBQkJRR3NvQWdBZ0JpZ0NDQ0lIUVFKMFFRUnFJQWRCQlhSQlFHdHlRZndCY1JCa0RBUUxJQUFnQmtFd2FpQUdRU3hxSUFaQk5Hb2dCa0U4YWlBR1FRaHFRUUJCK3dBUXRRRU5BU0FHS0FJSUlRZ0NRQUpBSUFkRkJFQkJIaUVIQWtBZ0NFRUJhdzREQXdJQUJBdEJJQ0VISUFCQklCQVFEQUlMSUFoQkFXc2lDRUVEVHcwRUlBQWdDRUVCZEVFYmFrSC9BWEVRRUF3RUMwRWNJUWNMSUFBZ0J4QVFDeUFBUWNjQUVCQU1BZ3NnQUNnQ0FDQUhFQk1NQ2dzZ0FFSEJBQkFRSUFrb0FnQWdCeEE1Q3lBQlJRMEJJQVlvQWpRaEJ3c2dBQ0FISUFFUW9RSU5CeUFHSUFCQlFHc29BZ0FvQXJ3Qk5nSXNDd0pBSUFBb0FoQkJQVWNFUUNBR0tBSXdJUWNNQVFzZ0FFRVJFQkFnQUVFR0VCQWdBRUdyQVJBUUlBQkI2UUJCZnhBY0lRZ2dBQkFTRFFjZ0FFRU9FQkFnQUJCV0RRY2dCaWdDTUNJSFFiZ0JSeUFIUVR4SGNVVUVRQ0FBSUFZb0FqUVFvUUVMSUFBZ0NCQWVDeUFBSUFjZ0JpZ0NMQ0FHS0FJMElBWW9BanhCQVNBTkVNRUJJQUFvQWhCQi9RQkdEUUJCZnlFSElBQkJMQkFzUlEwQkRBZ0xDeUFBUVE0UUVDQUVCRUFnQUVFT0VCQUxRWDhoQnlBQUVCSkZEUUlNQmdzZ0FFSGpJRUVBRUJZTUJBc2dBQkFTRFFNZ0JpQUFRVUJySWdrb0FnQWlCQ2dDc0FJMkFnZ2dCQ0FHUVFocU5nS3dBaUFHUVg4MkFod2dCa0wvLy8vL0x6Y0NGQ0FHUW9DQWdJQndOd0lNSUFRb0Fyd0JJUVFnQmtFQk5nSWtJQVlnQkRZQ0lDQUFRZjBBRUJBZ0FVRkxSaUFCUVZOR2NpRU5BMEFDUUNBQUtBSVFJZ2RCM1FCR0RRQWdCeUlFUWFkL1J5SUtSUVJBSUFBUUVnMEdRY0NRQVNFSUlBQW9BaEFpQkVFc1JpQUVRZDBBUm5JTkJBc0NRQUpBSUFSQit3QkdJQVJCMndCR2NrVUVRQ0FFUVN4SERRRWdBRUdBQVJBUUlBa29BZ0JCQUJCa0lBQkJEaEFRSUFCQkRoQVFEQUlMSUFBZ0JrRW9ha0VBRUo0QklnUkJMRVlnQkVIZEFFWnlSU0FFUVQxSGNRMEFBa0FnQ2tVRVFDQUVRVDFHQkVCQnpPRUFJUWdNQ0FzZ0FFRUFFTllFREFFTElBQkJnQUVRRUNBSktBSUFRUUFRWkNBQVFRNFFFQXNnQUNBQklBSkJBU0FHS0FJb1FRSnhRUUVRd2dGQkFFZ05Cd3dCQ3lBR1FRQTJBamdnQmtFQU5nSTBBa0FnQVFSQUlBWWdBQ0FDRUx3RElnUTJBalFnQkVVTkJ5QUFJQVFnQVJDaEFnMEhJQVpCdUFFMkFqQWdCaUFKS0FJQUtBSzhBVFlDTEF3QkN5QUFFS01DRFFjZ0FDQUdRVEJxSUFaQkxHb2dCa0UwYWlBR1FUeHFJQVpCT0dwQkFFSGJBQkMxQVEwSEN3SkFJQXBGQkVBZ0FDQUdLQUk0RU5ZRURBRUxJQUJCZ0FFUUVDQUpLQUlBSUFZdEFEZ1FaQ0FBUVE0UUVDQUFLQUlRUVQxSERRQWdBRUVSRUJBZ0FFRUdFQkFnQUVHckFSQVFJQUJCNlFCQmZ4QWNJUVFnQUJBU0RRWWdBRUVPRUJBZ0FCQldEUVlnQmlnQ01DSUlRYmdCUnlBSVFUeEhjVVVFUUNBQUlBWW9BalFRb1FFTElBQWdCQkFlQ3lBQUlBWW9BakFnQmlnQ0xDQUdLQUkwSUFZb0FqeEJBU0FORU1FQkN5QUFLQUlRUWQwQVJnMEFJQWRCcDM5R0JFQkI2ZVFBSVFnTUJBc2dBRUVzRUN4RkRRRU1CUXNMSUFCQmd3RVFFQ0FBUVVCcktBSUFJZ0VnQVNnQ3NBSW9BZ0EyQXJBQ0lBQVFFZzBEQ3dKQUlBVkZEUUFnQUNnQ0VFRTlSdzBBUVg4aEJ5QUFRZXNBUVg4UUhDRUJJQUFRRWcwRUlBQWdDeEFlSUFNRVFDQUFRUTRRRUFzZ0FCQldEUVFnQUVIckFDQU1FQndhSUFBZ0FSQWVRUUVoQnd3RUN5QURSUVJBSUFCQmhjOEFRUUFRRmd3REN5QUFRVUJySWdBb0FnQW9Bb0FDSUE1cVFiTUJJQThnRG1zUUt4b2dBQ2dDQUNnQ3BBSWdDMEVVYkdvaUFDQUFLQUlBUVFGck5nSUFRUUFoQnd3REN5QUFJQWhCQUJBV0RBRUxJQUFvQWdBZ0JpZ0NOQkFUQzBGL0lRY0xJQVpCUUdza0FDQUhDNDBDQVFKL0l3QkJNR3NpQlNRQUFuOGdBaUFCS0FJQVR3UkFJQVVnQWpZQ0pDQUZJQU0yQWlBZ0FFSDdrZ0VnQlVFZ2FoQkdRWDhNQVFzQ1FDQUJLQUlFSUFST0RRQWdBU0FFTmdJRUlBUkIvLzhEU0EwQUlBVWdBallDQkNBRklBTTJBZ0FnQUVHamt3RWdCUkJHUVg4TUFRc2dBU2dDQ0NBQ1FRRjBhaUlETHdFQUlnWkIvLzhEUndSQVFRQWdCQ0FHUmcwQkdpQUZJQUkyQWhnZ0JTQUVOZ0lVSUFVZ0JqWUNFQ0FBUWRTU0FTQUZRUkJxRUVaQmZ3d0JDeUFESUFRN0FRQkJmeUFBSUFGQkRHcEJCQ0FCUVJScUlBRW9BaEJCQVdvUWVBMEFHaUFCSUFFb0FoQWlBRUVCYWpZQ0VDQUJLQUlNSUFCQkFuUnFJQUkyQWdCQkFBc2hBeUFGUVRCcUpBQWdBd3NUQUNBQUlBRWdBaUFESUFSQkFFRUFFUGdCQ3prQUlBQkIvd0JOQkVBZ0FFRURka0g4Ly8vL0FYRkJvSUVDYWlnQ0FDQUFka0VCY1E4TElBQkJmbkZCak1BQVJpQUFFTklFUVFCSGNndG1BUUYvQW45QkFDQUFLQUlJSWdJZ0FVOE5BQnBCZnlBQUtBSU1EUUFhSUFBb0FoUWdBQ2dDQUNBQ1FRTnNRUUYySWdJZ0FTQUJJQUpKR3lJQklBQW9BaEFSQVFBaUFrVUVRQ0FBUVFFMkFneEJmdzhMSUFBZ0FUWUNDQ0FBSUFJMkFnQkJBQXNMckFFQ0FYOEJmaUFBS1FJRUlnU25RZi8vLy84SGNTRURBa0FDUUNBRVFvQ0FnSUFJZzFCRkJFQWdBaUFESUFJZ0Ewb2JJUU1nQUVFUWFpRUFBMEFnQWlBRFJnMENJQUFnQWtFQmRHb3ZBUUFnQVVZTkF5QUNRUUZxSVFJTUFBc0FDeUFCUWY4QlN3MEFJQUlnQXlBQ0lBTktHeUVESUFCQkVHb2hBQ0FCUWY4QmNTRUJBMEFnQWlBRFJnMEJJQUFnQW1vdEFBQWdBVVlOQWlBQ1FRRnFJUUlNQUFzQUMwRi9JUUlMSUFJTHBnRUJBWDhqQUVFUWF5SURKQUFnQXlBQ053TUlBa0FnQUNBQlFZWUJJQUZCQUJBVUlnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQUlRT0FSQUlBQWdBaUFCUVFFZ0EwRUlhaEF2SWdKQy8vLy8vMjlXSUFKQ2dJQ0FnTEIvZzBLQWdJQ0FJRkZ5RFFFZ0FDQUNFQThnQUVHSzB3QkJBQkFWUW9DQWdJRGdBQ0VDREFFTElBQWdBaEFQSUFBZ0FTQURJQU5CQ0dvUThRUWhBZ3NnQTBFUWFpUUFJQUlMb3dFQ0EzOEJmaUFBUVJCcUlRSWdBU2dDQUNJRVFRRnFJUU1DUUNBQUtRSUVJZ1ZDZ0lDQWdBaURVRVVFUUNBQ0lBUkJBWFJxTHdFQUlnQkJnUGdEY1VHQXNBTkhJQU1nQmFkQi8vLy8vd2R4VG5JTkFTQUNJQU5CQVhScUx3RUFJZ0pCZ1BnRGNVR0F1QU5IRFFFZ0FFRUtkRUdBK0Q5eElBSkIvd2R4Y2tHQWdBUnFJUUFnQkVFQ2FpRUREQUVMSUFJZ0JHb3RBQUFoQUFzZ0FTQUROZ0lBSUFBTFVRRURmd0pBQTBBZ0FVS0FnSUNBY0ZRTkFTQUJweUlDTHdFR0lnUkJNRVlFUUNBQ0tBSWdJZ0pGRFFJZ0FpMEFFUVJBSUFBUXRnSkJmdzhMSUFJcEF3QWhBUXdCQ3dzZ0JFRUNSaUVEQ3lBREN4SUFJQUFnQVNBQ0lBTWdCRUhLQUJDa0JBdE9BUUYvSUFBb0Fnd2lCRVVFUUVFQUR3c2dBQ0FBS0FJSVFmLy8vLzhEUVlHQWdJQjhJQUVnQVVHQmdJQ0FmRXdiSWdFZ0FVSC8vLy8vQTA0YmFqWUNDQ0FBSUFJZ0F5QUVRUUFRcWdNTEpRQWdBQ0FCSUFBb0FoQW9Bb3dCSWdBRWZ5QUFLQUlvUVFKMlFRRnhCVUVBQ3hDV0JRc2ZBUUYvSUFBb0Fnd2lBMFVFUUVFQUR3c2dBQ0FCSUFJZ0EwRUFFS29EQzkwQkFnSi9BbjRDUUNBQUlBQXBBekJCRHhCSklnaENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQVJCQTNSQkNHb1FLU0lHUlFSQUlBQWdDQkFQREFFTElBWWdBenNCQmlBR0lBUTZBQVVnQmlBQ09nQUVJQVlnQVRZQ0FFRUFJUU1nQkVFQUlBUkJBRW9iSVFFRFFDQUJJQU5IQkVBZ0JTQURRUU4wSWdScUtRTUFJZ2xDSUlpblFYVlBCRUFnQ2FjaUJ5QUhLQUlBUVFGcU5nSUFDeUFFSUFacUlBazNBd2dnQTBFQmFpRUREQUVMQ3lBSVFvQ0FnSUJ3V2dSQUlBaW5JQVkyQWlBTElBQWdDRUV2SUFJUWxnTWdDQThMUW9DQWdJRGdBQXVEQ3dJSGZ3RitJd0JCSUdzaUNTUUFBa0FDUUFKQUFrQUNRQUpBQW44Q1FBSkFBa0FDUUFKQUlBRkNJSWluUVFGcURnVURBZ0lBQVFJTElBQWdBeEFQSUFBZ0FrSG0wd0FRandGQmZ5RUZEQW9MSUFBZ0F4QVBJQUFnQWtIUitBQVFqd0ZCZnlFRkRBa0xJQUFnQVJDTkJLY2hCZ3dCQ3lBQnB5RUdBa0FEUUNBR0tBSVFJZ2RCTUdvaENDQUhJQWNvQWhnZ0FuRkJmM05CQW5ScUtBSUFJUVVEUUNBRlJRUkFJQVloQjBFQURBVUxJQUlnQ0NBRlFRRnJRUU4wSWdkcUlnVW9BZ1JIQkVBZ0JTZ0NBRUgvLy84ZmNTRUZEQUVMQ3lBR0tBSVVJQWRxSVFjZ0JTZ0NBQ0lJUVlDQWdNQitjVUdBZ0lEQUFFWUVRQ0FBSUFjZ0F4QWdEQVVMQWtBZ0NFR0FnSUNBQW5FRVFDQUdMd0VHUVFKSERRRWdBa0V3UncwRElBQWdCaUFESUFRUXl3VWhCUXdMQ3lBSVFScDJRVEJ4SWdoQk1FY0VRQ0FJUVNCSEJFQWdDRUVRUncwSUlBQWdCeWdDQkNBQklBTWdCQkNMQXlFRkRBd0xJQVl2QVFaQkMwWU5CeUFBSUFjb0FnQW9BaEFnQXhBZ0RBWUxJQUFnQmlBQ0lBY2dCUkRJQWtVTkFRd0pDd3RCMllBQlFhNzhBRUdQd2dCQnVOWUFFQUFBQzBISzJBQkJydndBUVpEQ0FFRzQxZ0FRQUFBTFFRRUxJUVVEUUFKQUFrQWdCVVVFUUFKQUlBWXRBQVVpQlVFRWNVVU5BQUpBSUFWQkNIRUVRQ0FDUVFCSUJFQWdBa0gvLy8vL0IzRWlCU0FHS0FJb1R3MENJQVlnQjBjTkJTQUFJQUVnQmEwZ0F5QUVFTmNCSVFVTURRc2dCaThCQmtFVmEwSC8vd054UVFwTERRSWdBQ0FDRUo0RElnaEZEUUpCZnlFRklBaEJBRTROQ1F3S0N5QUFLQUlRS0FKRUlBWXZBUVpCR0d4cUtBSVVJZ1ZGRFFFZ0JTZ0NHQ0lJQkVBZ0JpQUdLQUlBUVFGcU5nSUFJQUFnQnExQ2dJQ0FnSENFSWd3Z0FpQURJQUVnQkNBSUVTMEFJUVVnQUNBTUVBOE1DZ3NnQlNnQ0FDSUZSUTBCSUFZZ0JpZ0NBRUVCYWpZQ0FDQUFJQWtnQnExQ2dJQ0FnSENFSWd3Z0FpQUZFUmNBSVFVZ0FDQU1FQThnQlVFQVNBMEpJQVZGRFFFZ0NTMEFBRUVRY1FSQUlBQWdDU2tER0NJTXAwRUFJQXhDZ0lDQWdIQ0RRb0NBZ0lBd1Voc2dBU0FESUFRUWl3TWhCU0FBSUFrcEF4QVFEeUFBSUFrcEF4Z1FEd3dNQ3lBQUlBa3BBd2dRRHlBSkxRQUFRUUp4UlEwSElBWWdCMGNOQXlBQUlBRWdBaUFEUW9DQWdJQXdRb0NBZ0lBd1FZREFBQkJ0SVFVTUNRc2dCaThCQmtFVmEwSC8vd054UVF0SkRRY0xJQVlvQWhBb0Fpd2hCa0VCSVFVTUF3c2dCa1VOQUFOQUlBWW9BaEFpQlVFd2FpRUtJQVVnQlNnQ0dDQUNjVUYvYzBFQ2RHb29BZ0FoQlFOQUlBVkZEUU1nQWlBS0lBVkJBV3RCQTNRaUJXb2lDQ2dDQkVjRVFDQUlLQUlBUWYvLy94OXhJUVVNQVFzTElBWW9BaFFnQldvaENnSkFJQWdvQWdBaUJVRWFka0V3Y1NJTFFUQkhCRUFnQzBFUVJ3MEJJQUFnQ2lnQ0JDQUJJQU1nQkJDTEF5RUZEQXNMUVg4aEJTQUFJQVlnQWlBS0lBZ1F5QUpGRFFFTUNnc0xJQVZCZ0lDQXdBQnhEUUVNQkFzZ0JFR0FnQVJ4QkVBZ0FDQURFQThnQUNBQ0VNY0NRWDhoQlF3SUN5QUhSUVJBSUFBZ0F4QVBJQUFnQkVHQU1SQnZJUVVNQ0FzZ0J5MEFCU0lHUVFGeFJRUkFJQUFnQXhBUElBQWdCRUgzNkFBUWJ5RUZEQWdMSUFaQkJIRUVRQUpBSUFKQkFFNE5BQ0FHUVFoeFJTQUhMd0VHUVFKSGNnMEFJQWNvQWlnZ0FrSC8vLy8vQjNGSERRQWdBQ0FISUFNZ0JCRDlBeUVGREFrTElBQWdCeUFDSUFOQ2dJQ0FnREJDZ0lDQWdEQWdCRUdIemdCeUVJRUVJUVVNQmdzZ0FDQUhJQUpCQnhCNklnSkZEUVlnQWlBRE53TUFEQUlMUVFBaEJRd0FDd0FMUVFFaEJRd0VDeUFBSUFNUUR5QUFJQVFnQWhEQUFpRUZEQU1MSUFBZ0FDQURFSTBCSWdFUUQwRi9JUVVnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBZ0JFR1VJQkJ2SVFVTUFnc2dBQ0FERUE4TUFRc2dBQ0FERUE5QmZ5RUZDeUFKUVNCcUpBQWdCUXNPQUNBQVFRQWdBVUVRY2hET0FRdGhBQ0FBSUFFZ0FrS0FnSUNBQ0h4Qy8vLy8vdzlZQkg0Z0FrTC8vLy8vRDRNRlFvQ0FnSURBZmlBQ3ViMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzZ0F5QUVRUWR5RUwwQkM2c0JBUWgvSUFBb0FnZ2lBeUFCS0FJSUlnSkhCRUJCZjBFQklBSWdBMG9iRHdzZ0FTZ0NEQ0lGSUFBb0Fnd2lCaUFGSUFVZ0JrZ2JJZ0pySVFnZ0JpQUNheUVKQW44RFFFRUFJQUpCQVdzaUFrRUFTQTBCR2tFQUlRTkJBQ0VFSUFJZ0NXb2lCeUFHU1FSQUlBQW9BaEFnQjBFQ2RHb29BZ0FoQkFzZ0FpQUlhaUlISUFWSkJFQWdBU2dDRUNBSFFRSjBhaWdDQUNFREN5QURJQVJHRFFBTFFYOUJBU0FESUFSTEd3c0xpZ0VCQW44Z0FTZ0NFQ0lETFFBUVJRUkFRUUFQQ3dKQUlBTW9BZ0JCQVVjRVFDQUNCSDhnQWlnQ0FDQURhMEV3YTBFRGRRVkJBQXNoQkNBQUlBTVF6Z1VpQTBVRVFFRi9Ed3NnQUNnQ0VDQUJLQUlRRUpFQ0lBRWdBellDRUNBQ1JRMEJJQUlnQXlBRVFRTjBha0V3YWpZQ0FFRUFEd3NnQUNnQ0VDQURFSkFFSUFOQkFEb0FFQXRCQUF0N0FRRi9RWDhoQkFKQUlBQWdBUkFsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBR25JQUlRK1FNaEJDQUFJQUVRRHlBRURRQWdBMEdBZ0FGeFJRUkFRUUFoQkNBRFFZQ0FBbkZGRFFFZ0FDZ0NFQ2dDakFFaUFrVU5BU0FDTFFBb1FRRnhSUTBCQ3lBQVFhd2JRUUFRRlVGL0lRUUxJQVFMTlFBZ0FDQUNRVEFnQWtFQUVCUWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQUZCQURZQ0FFRi9Ed3NnQUNBQklBSVFtQUVMeEFVQkJIOGpBRUVnYXlJSUpBQUNRQUpBQWtBQ1FBSkFJQUZDZ0lDQWdIQlVJQUpDLy8vLy93OVdjZzBBSUFLbklRWUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FCcHlJRkx3RUdRUUpyRGg0QUNnb0tDZ29KQ2dvS0Nnb0tDZ29LQ2dvS0J3WUdCUVVFQkFNREFnRUtDeUFGS0FJb0lnY2dCa3NOQ3lBR0lBZEhEUWtnQlMwQUJVRUpjVUVKUncwSklBVW9BaEFoQmdOQUFrQWdCaWdDTENJSEJFQWdCeWdDRUNFR0FrQWdCeThCQmtFQmF3NENBQUlOQ3lBR0xRQVJSUTBDREF3TElBQWdCU0FESUFRUS9RTWhCd3dQQ3lBSExRQUZRUWh4RFFBTERBa0xRWDhoQnlBQUlBaEJHR29nQXhCdURRd2dCU2dDS0NBR1RRMEdJQVVvQWlRZ0JrRURkR29nQ0NzREdEa0RBQXdMQzBGL0lRY2dBQ0FJUVJocUlBTVFiZzBMSUFVb0FpZ2dCazBOQlNBRktBSWtJQVpCQW5ScUlBZ3JBeGkyT0FJQURBb0xJQUFnQ0VFSWFpQURFTVVGRFFjZ0JTZ0NLQ0FHVFEwRUlBVW9BaVFnQmtFRGRHb2dDQ2tEQ0RjREFBd0pDMEYvSVFjZ0FDQUlRUlJxSUFNUW1BRU5DU0FGS0FJb0lBWk5EUU1nQlNnQ0pDQUdRUUowYWlBSUtBSVVOZ0lBREFnTFFYOGhCeUFBSUFoQkZHb2dBeENZQVEwSUlBVW9BaWdnQmswTkFrRUJJUWNnQlNnQ0pDQUdRUUYwYWlBSUtBSVVPd0VBREFnTFFYOGhCeUFBSUFoQkZHb2dBeENZQVEwSElBVW9BaWdnQmswTkFTQUZLQUlrSUFacUlBZ29BaFE2QUFBTUJndEJmeUVISUFBZ0NFRVVhaUFERU1RRkRRWWdCU2dDS0NBR1RRMEFJQVVvQWlRZ0Jtb2dDQ2dDRkRvQUFBd0ZDeUFBSUFSQmxDQVFieUVIREFVTElBVW9BaWdnQmswTkFDQUFJQVVvQWlRZ0JrRURkR29nQXhBZ0RBTUxJQUFnQWhBeElRVWdBQ0FDRUE4Z0JVVUVRQ0FBSUFNUUR3d0JDeUFBSUFFZ0JTQURJQVFRMEFFaEJ5QUFJQVVRRXd3REMwRi9JUWNNQWdzZ0FDQUZLQUlrSUFaQkEzUnFJQU1RSUF0QkFTRUhDeUFJUVNCcUpBQWdCd3V1eUFFREpuOEhmZ044SXdCQm9BRnJJZ2doRGlBSUpBQWdBQ2dDRUNFV1FvQ0FnSURnQUNFdUFrQWdBQkI3RFFBQ2Z3SkFBa0FDUUFKQUFrQWdBVUwvLy8vL2IxZ0VRQ0FHUVFSeFJRMEJJQUduSWdjb0Fqd2hDQ0FIS0FJWUlob29BaVFoRkNBYUtBSWdJaE1vQWpBaEJpQVRMd0VxSVEwZ0IwRUFOZ0k4SUFjZ0ZpZ0NqQUUyQWhBZ0J5Z0NJQ0VWSUFjb0FqQWhDaUFIS0FJa0lSRWdGaUFIUVJCcUloSTJBb3dCSUJFZ0RVRURkR29oSENBVklSY2dDaUVOSUFjb0FneEZEUVFNQlFzZ0FhY2lHaThCQmlJSFFRMUdEUUlnRmlnQ1JDQUhRUmhzYWlnQ0VDSUlEUUVMSUFCQm04d0FRUUFRRlF3RkN5QUFJQUVnQWlBRUlBVWdCaUFJRVJZQUlTNE1CQXNnRmlnQ2VDQU9JQm9vQWlBaUV5OEJMaUFUTHdFcUlndHFJQk12QVNnaUJ5QUhRUUFnQkNBSFNCc2dCa0VDY1VFQmRoc2lCbXBCQTNRaUZXdExCRUFnQUJEcEFRd0VDeUFUTFFBUUlRb2dEaUFPUWNnQWFpSVhOZ0pNSUE0Z0JEWUNWQ0FPSUFvMkFsZ2dEaUFYTmdKSUlBNGdBVGNET0NBYUtBSWtJUlFnQ0NBVlFROXFRZkQvL3dGeGF5SVhKQUFnQlNFVklBWUVRQ0FISUFRZ0J5QUVJQWRJR3lJSVFRQWdDRUVBU2hzaUNHc2lGVUVBSUFjZ0ZVOGJJUkVEUUFKQUlBZ2dDVVlFUUFOQUlBZ2dFVVlOQWlBWElBaEJBM1JxUW9DQWdJQXdOd01BSUFoQkFXb2hDQXdBQ3dBTElBVWdDVUVEZENJVmFpa0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnb2dDaWdDQUVFQmFqWUNBQXNnRlNBWGFpQUJOd01BSUJGQkFXb2hFU0FKUVFGcUlRa01BUXNMSUE0Z0J6WUNWQ0FYSVJVTElBNGdGVFlDUUNBT0lCY2dCa0VEZEdvaUVUWUNSRUVBSVFnRFFDQUlJQXRIQkVBZ0VTQUlRUU4wYWtLQWdJQ0FNRGNEQUNBSVFRRnFJUWdNQVFzTElCTW9BaFFoQ2lBT0lCWW9Bb3dCTmdJd0lCWWdEa0V3YWlJU05nS01BU0FUS0FJd0lRWWdFU0FMUVFOMGFpSUlJUndMUVFBTUFRdEJBUXNoQndOQUFrQUNRQUpBQWtBZ0IwVUVRQ0FFUVFOMElTY2dBMEtBZ0lDQWNJTWhNeUFSUVFocUlSMGdFVUVRYWlFZUlCRkJHR29oSHlBVlFRaHFJU0FnRlVFUWFpRWhJQlZCR0dvaElpQVNRUmhxSVNnZ0JrSElBV29oR3lBY1FSaHFJU2tnQmtIQUFXb2hHU0FDUWlDSXB5SWtRWDV4SVNvZ0EwSWdpS2NoS3lBRXJTRXlJQU9uSVNVZ0RrRXdhaUVzSUE1QjZBQnFJU1lnQ0NFSEFrQURRQUpBSUFwQkFXb2hEVUlCSVM1Q2dJQ0FnREFoQVFKL0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSi9Ba0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdDaTBBQUNJSlFRRnJEdlVCQUFFbENaSUJDZ3NNRFE0UEVCRVNFeFFWR0JZWEdSb2JIQ0VpSXlRZElCNGZLU2NuS2lvckxOc0IrZ0V0TGk4dzJRRXhNak0wTlRZM09EazVPam83bndHaUFUMDhQbzhCa0FHUkFaTUJsQUdWQVowQm5nR2hBYUFCb3dHV0FaY0JtQUdaQVpvQnBBR21BYWNCbXdHYkFad0JuQUUvUUVGQ1EwUnNiVzV5YzNSMWIzQnhkbjE4ZVlBQmdRR0NBY3NCekFITkFjNEJ6Z0hPQWM0QnpnSE9BWGQzZDNpREFZVUJod0dFQVlZQmlRR0lBWW9CaXdHTUFZMEIyUUg1QWRnQjJBSGFBYkFCcndHeUFiRUJzd0d6QWJVQnRBR3BBYllCamdISUFja0J5Z0dyQWF3QnJRR29BYW9CcmdHM0Fia0J1QUc5QWI0QnZ3SEFBY2NCeGdIQkFjSUJ3d0hFQWJvQnZBRzdBZFFCeFFHdEFmTUJBZ0lDQWdJQ0FnSUNBd1FGQmdkRlJrZElTVXBMVEUxT1QxQlJVbE5VVlZaWFdGbGFXMXhkWGw5Z1lXSmpaR1ZtWjJocGFtc0lmMzU3ZWlZbUppYlBBZEFCMFFIU0FkWUJDeUFJSUFvMUFBRTNBd0FnQ2tFRmFpRU5JQWhCQ0dvaEJ3enlBUXNnRXlnQ05DQU5LQUFBUVFOMGFpa0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnY2dCeWdDQUVFQmFqWUNBQXNnQ0NBQk53TUFJQXBCQldvaERTQUlRUWhxSVFjTThRRUxJQWdnQ1VHMUFXdXROd01BSUFoQkNHb2hCd3p3QVFzZ0NDQUtNQUFCUXYvLy8vOFBnemNEQUNBS1FRSnFJUTBnQ0VFSWFpRUhETzhCQ3lBSUlBb3lBQUZDLy8vLy93K0ROd01BSUFwQkEyb2hEU0FJUVFocUlRY003Z0VMSUJNb0FqUWdDaTBBQVVFRGRHb3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFwQkFtb2hEU0FJSUFFM0F3QWdDRUVJYWlFSERPMEJDeUFUS0FJMElBb3RBQUZCQTNScUtRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFLUVFKcUlRMGdDQ0FHSUFFZ0ZDQVNFSXdFSWdFM0F3QWdDRUVJYWlFSElBRkNnSUNBZ0hDRFFvQ0FnSURnQUZJTjdBRU03Z0VMSUFnZ0JrRXZFQzAzQXdBZ0NFRUlhaUVIRE9zQkN5QUdJQWhCQ0dzaUJ5a0RBQ0lCUVRBZ0FVRUFFQlFpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTN1QVNBR0lBY3BBd0FRRHlBSElBRTNBd0FNNUFFTElBZ2dCaUFLS0FBQkVGdzNBd0FnQ2tFRmFpRU5JQWhCQ0dvaEJ3enBBUXNnQ0VLQWdJQ0FNRGNEQUNBSVFRaHFJUWNNNkFFTElBaENnSUNBZ0NBM0F3QWdDRUVJYWlFSERPY0JDd0pBQWtBQ1FDQWtRWDlHRFFBZ0V5MEFFRUVCY1EwQUlDcEJBa1lFUUNBWktRTUFJaTVDSUlpblFYUkxEUUlNQXdzZ0JpQUNFQ1VpTGtLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBDRE8wQkN5QUNJUzRnSkVGMVNRMEJDeUF1cHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnTGpjREFDQUlRUWhxSVFjTTVnRUxJQWhDZ0lDQWdCQTNBd0FnQ0VFSWFpRUhET1VCQ3lBSVFvR0FnSUFRTndNQUlBaEJDR29oQnd6a0FRc2dDQ0FHRURRaUFUY0RBQ0FJUVFocUlRY2dBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnM2pBUXpsQVFzZ0NrRUNhaUVOQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FLTFFBQkRnY0FBUUlEQkFVR0J3c0NRQ0FHSUFZb0FpZ3BBd2hCQ0JCSklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUdJQUduSWd0Qk1FRURFSG9nTWpjREFDQUVRUUJNQkVCQkFDRUpET3NCQzBFQUlRY2dCaUFuRUNraUNRMEJJQVlnQVJBUEN5QUlRb0NBZ0lEZ0FEY0RBQ0FJUVFocUlRZ003Z0VMQTBBZ0JDQUhSZzNwQVNBRklBZEJBM1FpQ21vcEF3QWlMVUlnaUtkQmRVOEVRQ0F0cHlJTUlBd29BZ0JCQVdvMkFnQUxJQWtnQ21vZ0xUY0RBQ0FIUVFGcUlRY01BQXNBQ3lBVEx3RW9JUWtnQmlBR0tBSW9LUU1JUVFrUVNTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRlWUJJQVlnQWFjaURFRXdRUU1RZWlBeU53TUFRUUFoQnlBRUlBa2dCQ0FKU0JzaUNVRUFJQWxCQUVvYklROERRQ0FISUE5SEJFQWdCaUFTSUFkQkFSQ0xCQ0lMUlEzbkFTQUdJQXdnQjBHQWdJQ0FlSEpCSnhCNkloQUVRQ0FRSUFzMkFnQWdCMEVCYWlFSERBSUZJQVlvQWhBZ0N4RHJBUXpvQVFzQUN3c0RRQ0FFSUFsSEJFQWdCU0FKUVFOMGFpa0RBQ0l0UWlDSXAwRjFUd1JBSUMybklnY2dCeWdDQUVFQmFqWUNBQXNnQmlBQklBa2dMVUVIRUs4QklRY2dDVUVCYWlFSklBZEJBRTROQVF6bkFRc0xJQVlwQTZnQklpMUNJSWluUVhWUEJFQWdMYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUdJQUZCMFFFZ0xVRURFQmthSUFZb0FoQW9Bb3dCS1FNSUlpMUNJSWluUVhWUEJFQWdMYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUdJQUZCemdBZ0xVRURFQmthSUFnZ0FUY0RBQ0FJUVFocUlRY002QUVMSUJJcEF3Z2lBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnQVRjREFDQUlRUWhxSVFjTTV3RUxJQ3RCZFU4RVFDQWxJQ1VvQWdCQkFXbzJBZ0FMSUFnZ0F6Y0RBQ0FJUVFocUlRY001Z0VMSUFnZ0dpZ0NLQ0lIQkg0Z0J5QUhLQUlBUVFGcU5nSUFJQWV0UW9DQWdJQndoQVZDZ0lDQWdEQUxOd01BSUFoQkNHb2hCd3psQVFzZ0NDQUdRb0NBZ0lBZ0VFY2lBVGNEQUNBSVFRaHFJUWNnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZzNrQVF6bUFRc0NRQ0FHRU9JRklna0VRQ0FHSUFrUTRRVWhCeUFHSUFrUUV5QUhEUUVMSUFaQmd5VkJBQkFWSUFoQ2dJQ0FnT0FBTndNQUlBaEJDR29oQ0F6b0FRc2dCeWtEYUNJdVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBR1FvQ0FnSUFnRUVjaUxrS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBaENnSUNBZ09BQU53TUFJQWhCQ0dvaENBenBBUXNnQnlBdU53Tm9DeUF1UWlDSXAwRjFUd1JBSUM2bklnY2dCeWdDQUVFQmFqWUNBQXNnQ0NBdU53TUFJQWhCQ0dvaEJ5QXVRb0NBZ0lCd2cwS0FnSUNBNEFCU0RlTUJET1VCQ3hBQkFBc2dDa0VEYWlFTklBb3ZBQUVoQ1FKQUlBWVFQaUlCUW9DQWdJQndnMEtBZ0lDQTRBQlNCRUFnQkNBSklBUWdDVW9iSVFzZ0NTRUhBMEFnQnlBTFJnMENJQVVnQjBFRGRHb3BBd0FpTFVJZ2lLZEJkVThFUUNBdHB5SU1JQXdvQWdCQkFXbzJBZ0FMSUFjZ0NXc2hEQ0FIUVFGcUlRY2dCaUFCSUF3Z0xVRUhFSzhCUVFCT0RRQUxJQVlnQVJBUEN5QUlRb0NBZ0lEZ0FEY0RBQ0FJUVFocUlRZ001Z0VMSUFnZ0FUY0RBQ0FJUVFocUlRY000UUVMSUFZZ0NFRUlheUlIS1FNQUVBOE00QUVMSUFZZ0NFRVFheUlIS1FNQUVBOGdCeUFJUVFocklnY3BBd0EzQXdBTTN3RUxJQVlnQ0VFWWF5SUhLUU1BRUE4Z0J5QUlRUkJySWdjcEF3QTNBd0FnQnlBSVFRaHJJZ2NwQXdBM0F3QU0zZ0VMSUFoQkNHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0FUY0RBQ0FJUVFocUlRY00zUUVMSUFoQkVHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0FUY0RBQ0FJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFJSUFFM0F3Z2dDRUVRYWlFSEROd0JDeUFJUVJocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFJSUFFM0F3QWdDRUVRYXlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDQ0FCTndNSUlBaEJDR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dBVGNERUNBSVFSaHFJUWNNMndFTElBZ2dDRUVJYXlJSEtRTUFOd01BSUFoQkVHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUtJQW9vQWdCQkFXbzJBZ0FMSUFjZ0FUY0RBQ0FJUVFocUlRY00yZ0VMSUFnZ0NFRUlheUlIS1FNQUlnRTNBd0FnQnlBSVFSQnJJZ2NwQXdBM0F3QWdBVUlnaUtkQmRVOEVRQ0FCcHlJS0lBb29BZ0JCQVdvMkFnQUxJQWNnQVRjREFDQUlRUWhxSVFjTTJRRUxJQWdnQ0VFSWF5SUhLUU1BSWdFM0F3QWdDRUVRYXlJS0tRTUFJUzBnQ2lBSVFSaHJJZ29wQXdBM0F3QWdCeUF0TndNQUlBRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUtJQUUzQXdBZ0NFRUlhaUVIRE5nQkN5QUlJQWhCQ0dzaUJ5a0RBQ0lCTndNQUlBaEJFR3NpQ2lrREFDRXRJQW9nQ0VFWWF5SUtLUU1BTndNQUlBY2dMVGNEQUNBS0lBaEJJR3NpQnlrREFEY0RBQ0FCUWlDSXAwRjFUd1JBSUFHbklnb2dDaWdDQUVFQmFqWUNBQXNnQnlBQk53TUFJQWhCQ0dvaEJ3elhBUXNnQ0VFUWF5SUhLUU1BSVFFZ0J5QUlRUmhySWdjcEF3QTNBd0FnQnlBQk53TUFETkFCQ3lBSVFSaHJJZ2NwQXdBaEFTQUhJQWhCRUdzaUJ5a0RBRGNEQUNBSVFRaHJJZ29wQXdBaExTQUtJQUUzQXdBZ0J5QXROd01BRE04QkN5QUlRU0JySWdjcEF3QWhBU0FISUFoQkdHc2lCeWtEQURjREFDQUlRUkJySWdvcEF3QWhMU0FLSUFoQkNHc2lDaWtEQURjREFDQUhJQzAzQXdBZ0NpQUJOd01BRE00QkN5QUlRU2hySWdjcEF3QWhBU0FISUFoQklHc2lCeWtEQURjREFDQUlRUmhySWdvcEF3QWhMU0FLSUFoQkVHc2lDaWtEQURjREFDQUhJQzAzQXdBZ0NpQUlRUWhySWdjcEF3QTNBd0FnQnlBQk53TUFETTBCQ3lBSVFRaHJJZ2NwQXdBaEFTQUhJQWhCRUdzaUJ5a0RBRGNEQUNBSVFSaHJJZ29wQXdBaExTQUtJQUUzQXdBZ0J5QXROd01BRE13QkN5QUlRUkJySWdjcEF3QWhBU0FISUFoQkdHc2lCeWtEQURjREFDQUlRU0JySWdvcEF3QWhMU0FLSUFFM0F3QWdCeUF0TndNQURNc0JDeUFJUVJCcklnY3BBd0FoQVNBSElBaEJHR3NpQnlrREFEY0RBQ0FJUVNCcklnb3BBd0FoTFNBS0lBaEJLR3NpQ2lrREFEY0RBQ0FISUMwM0F3QWdDaUFCTndNQURNb0JDeUFJUVFocklnY3BBd0FoQVNBSElBaEJFR3NpQnlrREFEY0RBQ0FISUFFM0F3QU15UUVMSUFoQklHc2lCeWtEQUNFQklBY2dDRUVRYXlJSEtRTUFOd01BSUFoQkNHc2lDaWtEQUNFdElBb2dDRUVZYXlJS0tRTUFOd01BSUFjZ0FUY0RBQ0FLSUMwM0F3QU15QUVMSUJNb0FqUWdEU2dBQUVFRGRHb3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0JpQUJJQlFnRWhDTUJDSUJOd01BSUFoQkNHb2hCeUFLUVFWcUlRMGdBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMS9ETTBCQ3lBSlFlNEJhd3dCQ3lBS1FRTnFJUTBnQ2k4QUFRc2hDeUFTSUEwMkFpQWdCaUFJSUF0QkEzUnJJZ3hCQ0dzcEF3QkNnSUNBZ0RCQ2dJQ0FnREFnQ3lBTVFRQVEyQUVpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTNPQVVGL0lRY2dDVUVqUmczUkFRTkFJQWNnQzBjRVFDQUdJQXdnQjBFRGRHb3BBd0FRRHlBSFFRRnFJUWNNQVFzTElBZ2dDMEYvYzBFRGRHb2lDQ0FCTndNQUlBaEJDR29oQnd6S0FRc2dDaThBQVNFSklCSWdDa0VEYWlJTk5nSWdRWDRoQnlBR0lBZ2dDVUVEZEdzaUMwRVFheWtEQUNBTFFRaHJLUU1BSUFrZ0MwRUFFSW9FSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOelFFRFFDQUhJQWxIQkVBZ0JpQUxJQWRCQTNScUtRTUFFQThnQjBFQmFpRUhEQUVMQ3lBSVFYNGdDV3RCQTNScUlnZ2dBVGNEQUNBSVFRaHFJUWNNeVFFTElBb3ZBQUVoQ3lBU0lBcEJBMm9pRFRZQ0lDQUdJQWdnQzBFRGRHc2lERUVJYXlrREFDQU1RUkJyS1FNQVFvQ0FnSUF3SUFzZ0RFRUFFTmdCSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOekFGQmZpRUhJQWxCSlVZTnp3RURRQ0FISUF0SEJFQWdCaUFNSUFkQkEzUnFLUU1BRUE4Z0IwRUJhaUVIREFFTEN5QUlRWDRnQzJ0QkEzUnFJZ2dnQVRjREFDQUlRUWhxSVFjTXlBRUxJQXBCQTJvaERTQUtMd0FCSVFzZ0JoQStJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU55d0VnQ0NBTFFRTjBheUVKUVFBaEJ3SkFBMEFnQnlBTFJnMEJJQVlnQVNBSFFZQ0FnSUI0Y2lBSklBZEJBM1JxSWd3cEF3QkJoNEFCRUJraER5QU1Rb0NBZ0lBd053TUFJQWRCQVdvaEJ5QVBRUUJPRFFBTElBWWdBUkFQRE13QkN5QUpJQUUzQXdBZ0NVRUlhaUVIRE1jQkN5QUtRUU5xSVEwZ0JpQUlRUmhySWdrcEF3QWdDQ0FJUVJCcklnY2dDaThBQVJDZEF5SUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRjb0JJQVlnQ1NrREFCQVBJQVlnQnlrREFCQVBJQVlnQ0VFSWF5a0RBQkFQSUFrZ0FUY0RBQXpHQVF0Q2dJQ0FnQkFoTGdKQUlBaEJDR3NwQXdBaUFVTC8vLy8vYjFZTkFFS0JnSUNBRUNFdUlBRkNnSUNBZ0hDRFFvQ0FnSUF3VVEwQUlBQkJsUGdBUVFBUUZRektBUXNnQ0NBdU53TUFJQWhCQ0dvaEJ3ekZBUXNnTTBLQWdJQ0FNRklOdmdFZ0JrSFJsQUZCQUJBVkRNZ0JDeUFJUVFocktRTUFJaTFDLy8vLy8yOVlEYjhCSUFoQkVHc3BBd0FoQVNBdHB5SUhMd0VHRU80QlJRMi9BU0FIS0FJb0lnZEZEYjhCSUFjb0FoQWlDVUV3YWlFTElBa2dDU2dDR0VGL2MwRUNkRUhBZVhKcUtBSUFJUWtDUUFOQUlBa0VRQ0FMSUFsQkFXdEJBM1FpQ1dvaURDZ0NCRUhQQVVZTkFpQU1LQUlBUWYvLy94OXhJUWtNQVFzTElBWkJuL1VBUVFBUUZReklBUXNnQVVLQWdJQ0FjRlFOdndFZ0J5Z0NGQ0FKYWlrREFDSXRRb0NBZ0lCd2cwS0FnSUNBZ0g5U0RiOEJJQVlvQWhBZ0xSQ05BaUVKSUFHbktBSVFJZ2RCTUdvaEN5QUhJQWtnQnlnQ0dIRkJmM05CQW5ScUtBSUFJUWNEUUNBSEJFQWdDeUFIUVFGclFRTjBhaUlIS0FJRUlBbEdEYjhCSUFjb0FnQkIvLy8vSDNFaEJ3d0JDd3NnQmtHdU1FRUFFQlVNeHdFTElBaEJDR3NpRENrREFDSUJRdi8vLy85dldBMitBU0FJUVJCcklna3BBd0FoTFNBQnB5SUxLQUlRSWdkQk1Hb2hEeUFISUFjb0FoaEJmM05CQW5SQndIbHlhaWdDQUNFSEFrQUNRQU5BSUFjRVFDQVBJQWRCQVd0QkEzUWlCMm9pRUNnQ0JFSFBBVVlOQWlBUUtBSUFRZi8vL3g5eElRY01BUXNMSUFaQjl3QVE0QVVpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTNJQVNBR0lBdEJ6d0ZCQnhCNklnZEZCRUFnQmlBQkVBOE15UUVMSUFGQ0lJaW5RWFZQQkVBZ0FhY2lDeUFMS0FJQVFRRnFOZ0lBQ3lBSElBRTNBd0FNQVFzZ0N5Z0NGQ0FIYWlrREFDSUJRaUNJcDBGMVNRMEFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dCaWdDRUNBQkVJMENJUWNnTFVMLy8vLy9iMWdFUUNBR0VDUWdCaUFIRUJNTXh3RUxJQVlnTGFjZ0IwRUhFSG9oQ3lBR0lBY1FFeUFMUlEzR0FTQUxRb0NBZ0lBd053TUFJQVlnQ1NrREFCQVBJQVlnRENrREFCQVBJQWtoQnd6Q0FRc2dCaUFJUVFocklnZ3BBd0FRaWdFTXhRRUxJQXBCQm1vaERTQUtLQUFCSVFjQ1FBSkFBa0FDUUFKQUFrQWdDaTBBQlNJSkRnVUFBUUlEQkFVTElBWWdCMEhPSFJDUEFRekpBUXNnQmlBSEVOOEZETWdCQ3lBR0lBY1EyUUVNeHdFTElBWkJ2cGNCUVFBUXhnSU14Z0VMSUFaQnh2RUFRUUFRRlF6RkFRc2dEaUFKTmdJUUlBWkIzZnNBSUE1QkVHb1FSZ3pFQVFzZ0NpOEFBU0VKSUFvdkFBTWhEQ0FTSUFwQkJXb2lEVFlDSUVGL0lRY0NmaUFHSUFnZ0NVRURkR3NpQzBFSWF5SVBLUU1BSUFZcEE3Z0JFRklFUUNBR1FvQ0FnSUF3SUFrRWZpQUxLUU1BQlVLQWdJQ0FNQXRCQWlBTVFRRnJFSndEREFFTElBWWdEeWtEQUVLQWdJQ0FNRUtBZ0lDQU1DQUpJQXRCQUJEWUFRc2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRM0RBUU5BSUFjZ0NVY0VRQ0FHSUFzZ0IwRURkR29wQXdBUUR5QUhRUUZxSVFjTUFRc0xJQWdnQ1VGL2MwRURkR29pQ0NBQk53TUFJQWhCQ0dvaEJ3eS9BUXNnQ2tFRGFpRU5JQW92QUFFaER5QUdJQTVCNEFCcUlBaEJDR3NpQnlrREFCQ0pCQ0lKUlEzQ0FRSitJQVlnQ0VFUWF5SUxLUU1BSUFZcEE3Z0JFRklFUUNBR1FvQ0FnSUF3SUE0b0FtQWlEQVIrSUFrcEF3QUZRb0NBZ0lBd0MwRUNJQTlCQVdzUW5BTU1BUXNnQmlBTEtRTUFRb0NBZ0lBd0lBNG9BbUFpRENBSkVDRUxJUUVnQmlBSklBd1Ftd01nQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTNDQVNBR0lBc3BBd0FRRHlBR0lBY3BBd0FRRHlBTElBRTNBd0FNdmdFTElBaEJFR3NpQnlBR1FvQ0FnSUF3SUFjcEF3QWdDRUVJYXlJSEtRTUFFTjRGTndNQURMMEJDeUFHSUFoQkNHc2lCeWtEQUJEb0FTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRjQUJJQVlnQnlrREFCQVBJQWNnQVRjREFBeTJBUXNnQ0VFSWF5SUhLUU1BSVFFQ1FDQUdFT0lGSWdsRkJFQkNnSUNBZ0NBaExnd0JDeUFHSUFrUVhDRXVJQVlnQ1JBVElDNUNnSUNBZ0hDRFFvQ0FnSURnQUZFTndBRUxJQVlnRGtHQUFXb1F6UUlpTFVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFZZ0xoQVBETUFCQ3lBT0lBNHBBNEFCSWk4M0EyQWdEaUFCTndONElBNGdMamNEY0NBT0lBNHBBNGdCSWdFM0EyZ2dCa0U4UVFRZ0RrSGdBR29RbWdNZ0JpQXVFQThnQmlBdkVBOGdCaUFCRUE4Z0JpQUhLUU1BRUE4Z0J5QXROd01BRExVQkN5QUtRUVZxSVEwZ0d5Z0NBQ2dDRUNJSFFUQnFJUXdnQnlBS0tBQUJJZ2tnQnlnQ0dIRkJmM05CQW5ScUtBSUFJUWNDUUFOQUlBY0VRRUVCSVFzZ0RDQUhRUUZyUVFOMGFpSUhLQUlFSUFsR0RRSWdCeWdDQUVILy8vOGZjU0VIREFFTEN5QUdJQVlwQThBQklBa1FjU0lMUVFCSURiOEJDeUFJSUF0QkFFZXRRb0NBZ0lBUWhEY0RBQ0FJUVFocUlRY011Z0VMSUFsQk4yc2hDeUFLUVFWcUlRMGdHeWdDQUNJTUtBSVFJZ2RCTUdvaER5QUhJQW9vQUFFaUNTQUhLQUlZY1VGL2MwRUNkR29vQWdBaEJ3SkFBa0FEUUNBSFJRMEJJQWtnRHlBSFFRRnJRUU4wSWdkcUloQW9BZ1JIQkVBZ0VDZ0NBRUgvLy84ZmNTRUhEQUVMQ3lBTUtBSVVJQWRxS1FNQUlpNUNnSUNBZ0hDRElnRkNnSUNBZ01BQVVRUkFJQVlnQ1JEWkFRekFBUXNnTGtJZ2lLZEJkVWtOQVNBdXB5SUhJQWNvQWdCQkFXbzJBZ0FNQVFzZ0JpQUdLUVBBQVNJQklBa2dBU0FMRUJRaUxrS0FnSUNBY0lNaEFRc2dBVUtBZ0lDQTRBQlJEYjBCSUFnZ0xqY0RBQ0FJUVFocUlRY011UUVMSUFwQkJXb2hEU0FHSUFvb0FBRWdDRUVJYXlJSEtRTUFJQWxCT1dzUTNRVkJBRWdOYWd5NEFRc2dDa0VGYWlFTklBb29BQUVoQ1NBSVFSQnJJZ2NvQWdCRkJFQWdCaUFKRU1jQ0RMd0JDeUFHSUFrZ0NFRUlheWtEQUVFQ0VOMEZJZ2hCQUU0TnR3RWdDRUVlZGtFQ2NReTRBUXNnQ2tFR2FpRU5JQmtvQWdBaURDZ0NFQ0lKUVRCcUlROGdDU0FLS0FBQklnY2dDU2dDR0hGQmYzTkJBblJxS0FJQUlRa2dDaXdBQlNFTEFrQURRQ0FKUlEwQklBY2dDVUVEZENBUGFrRUlheUlKS0FJRVJ3UkFJQWtvQWdCQi8vLy9IM0VoQ1F3QkN3c2dDMEVBU0FSQUlBa3RBQU5CQkhFTnNRRU1zd0VMSUF0QndBQnhSUTJ3QVNBSktBSUFJZ2xCZ0lDQUlIRU5zQUVnQ1VHQWdJQ0FmSEZCZ0lDQWdBUkdEYThCSUFsQmdJQ0F3QUZ4UVlDQWdNQUJSZzJ3QVF5dkFRc2dDMEVBVGcydEFReXZBUXNnQ2l3QUJTSUhRUUZ4UVFaeUlBZEJBbkZCQlhJZ0IwRUFUaUlIR3lFUUlCa2dHeUFIR3lnQ0FDSUpLQUlRSWd3Z0NpZ0FBU0lQSUF3b0FoaHhRWDl6UVFKMGFpZ0NBQ0VMSUFwQkJtb2hEU0FNUVRCcUlRd0RRQ0FMQkVBZ0RDQUxRUUZyUVFOMGFpSUxLQUlFSUE5R0RiRUJJQXNvQWdCQi8vLy9IM0VoQ3d3QkN3c2dDUzBBQlVFQmNVVU5yd0VnQmlBSklBOGdFQkI2SWdsRkRia0JJQWxDZ0lDQWdEQkNnSUNBZ01BQUlBY2JOd01BREs4QkN5QUtRUVpxSVEwZ0dTa0RBQ0lCcHlnQ0VDSUhRVEJxSVF3Z0J5QUtLQUFCSWdzZ0J5Z0NHSEZCZjNOQkFuUnFLQUlBSVFjZ0NpMEFCU0VQSUFZZ0FTQUxJQWhCQ0dzaUNTa0RBRUtBZ0lDQU1FS0FnSUNBTUFKL0FrQURRQ0FIUlEwQklBZEJBM1FnREdwQkNHc2lFQ2dDQUNFSElBc2dFQ2dDQkVjRVFDQUhRZi8vL3g5eElRY01BUXNMUVlEQUFTQUhRWUNBZ0NCeFJRMEJHZ3NnRDBHR3pnRnlDeEJ0UVFCSURiZ0JJQVlnQ1NrREFCQVBJQWtoQnd5MEFRc2dFU0FLTHdBQlFRTjBhaWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NrRURhaUVOSUFnZ0FUY0RBQ0FJUVFocUlRY01zd0VMSUFZZ0VTQUtMd0FCUVFOMGFpQUlRUWhySWdjcEF3QVFJQ0FLUVFOcUlRME1zZ0VMSUJFZ0NpOEFBVUVEZEdvaEJ5QUlRUWhyS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpRFNBTktBSUFRUUZxTmdJQUN5QUtRUU5xSVEwZ0JpQUhJQUVRSUF5ckFRc2dGU0FLTHdBQlFRTjBhaWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NrRURhaUVOSUFnZ0FUY0RBQ0FJUVFocUlRY01zQUVMSUFZZ0ZTQUtMd0FCUVFOMGFpQUlRUWhySWdjcEF3QVFJQ0FLUVFOcUlRME1yd0VMSUJVZ0NpOEFBVUVEZEdvaEJ5QUlRUWhyS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpRFNBTktBSUFRUUZxTmdJQUN5QUtRUU5xSVEwZ0JpQUhJQUVRSUF5b0FRc2dFU0FLTFFBQlFRTjBhaWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NrRUNhaUVOSUFnZ0FUY0RBQ0FJUVFocUlRY01yUUVMSUFZZ0VTQUtMUUFCUVFOMGFpQUlRUWhySWdjcEF3QVFJQ0FLUVFKcUlRME1yQUVMSUJFZ0NpMEFBVUVEZEdvaEJ5QUlRUWhyS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpRFNBTktBSUFRUUZxTmdJQUN5QUtRUUpxSVEwZ0JpQUhJQUVRSUF5bEFRc2dFU2tEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQUJOd01BSUFoQkNHb2hCd3lxQVFzZ0hTa0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnY2dCeWdDQUVFQmFqWUNBQXNnQ0NBQk53TUFJQWhCQ0dvaEJ3eXBBUXNnSGlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDQ0FCTndNQUlBaEJDR29oQnd5b0FRc2dIeWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQUJOd01BSUFoQkNHb2hCd3luQVFzZ0JpQVJJQWhCQ0dzaUJ5a0RBQkFnREtZQkN5QUdJQjBnQ0VFSWF5SUhLUU1BRUNBTXBRRUxJQVlnSGlBSVFRaHJJZ2NwQXdBUUlBeWtBUXNnQmlBZklBaEJDR3NpQnlrREFCQWdES01CQ3lBSVFRaHJLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBR0lCRWdBUkFnREp3QkN5QUlRUWhyS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUdJQjBnQVJBZ0RKc0JDeUFJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUI0Z0FSQWdESm9CQ3lBSVFRaHJLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBR0lCOGdBUkFnREprQkN5QVZLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBSUlBRTNBd0FnQ0VFSWFpRUhESjRCQ3lBZ0tRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFJSUFFM0F3QWdDRUVJYWlFSERKMEJDeUFoS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUlJQUUzQXdBZ0NFRUlhaUVIREp3QkN5QWlLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBSUlBRTNBd0FnQ0VFSWFpRUhESnNCQ3lBR0lCVWdDRUVJYXlJSEtRTUFFQ0FNbWdFTElBWWdJQ0FJUVFocklnY3BBd0FRSUF5WkFRc2dCaUFoSUFoQkNHc2lCeWtEQUJBZ0RKZ0JDeUFHSUNJZ0NFRUlheUlIS1FNQUVDQU1sd0VMSUFoQkNHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFZZ0ZTQUJFQ0FNa0FFTElBaEJDR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBWWdJQ0FCRUNBTWp3RUxJQWhCQ0dzcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQVlnSVNBQkVDQU1qZ0VMSUFoQkNHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFZZ0lpQUJFQ0FNalFFTElCUW9BZ0FvQWhBcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnQVRjREFDQUlRUWhxSVFjTWtnRUxJQlFvQWdRb0FoQXBBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0FUY0RBQ0FJUVFocUlRY01rUUVMSUJRb0FnZ29BaEFwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dBVGNEQUNBSVFRaHFJUWNNa0FFTElCUW9BZ3dvQWhBcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnQVRjREFDQUlRUWhxSVFjTWp3RUxJQVlnRkNnQ0FDZ0NFQ0FJUVFocklnY3BBd0FRSUF5T0FRc2dCaUFVS0FJRUtBSVFJQWhCQ0dzaUJ5a0RBQkFnREkwQkN5QUdJQlFvQWdnb0FoQWdDRUVJYXlJSEtRTUFFQ0FNakFFTElBWWdGQ2dDRENnQ0VDQUlRUWhySWdjcEF3QVFJQXlMQVFzZ0ZDZ0NBQ2dDRUNFSElBaEJDR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlLSUFvb0FnQkJBV28yQWdBTElBWWdCeUFCRUNBTWhBRUxJQlFvQWdRb0FoQWhCeUFJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUNpQUtLQUlBUVFGcU5nSUFDeUFHSUFjZ0FSQWdESU1CQ3lBVUtBSUlLQUlRSVFjZ0NFRUlheWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ29nQ2lnQ0FFRUJhallDQUFzZ0JpQUhJQUVRSUF5Q0FRc2dGQ2dDRENnQ0VDRUhJQWhCQ0dzcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJS0lBb29BZ0JCQVdvMkFnQUxJQVlnQnlBQkVDQU1nUUVMSUJRZ0NpOEFBVUVDZEdvb0FnQW9BaEFwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBcEJBMm9oRFNBSUlBRTNBd0FnQ0VFSWFpRUhESVlCQ3lBR0lCUWdDaThBQVVFQ2RHb29BZ0FvQWhBZ0NFRUlheUlIS1FNQUVDQWdDa0VEYWlFTkRJVUJDeUFVSUFvdkFBRkJBblJxS0FJQUtBSVFJUWNnQ0VFSWF5a0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnMGdEU2dDQUVFQmFqWUNBQXNnQ2tFRGFpRU5JQVlnQnlBQkVDQU1mZ3NnQ2tFRGFpRU5JQlFnQ2k4QUFTSUhRUUowYWlnQ0FDZ0NFQ2tEQUNJQlFvQ0FnSUJ3ZzBLQWdJQ0F3QUJTQkVBZ0FVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dBVGNEQUNBSVFRaHFJUWNNaEFFTElBWWdFeUFIUVFFUXhRSU1od0VMSUFwQkEyb2hEU0FVSUFvdkFBRWlCMEVDZEdvb0FnQW9BaEFpQ1RVQ0JFSWdoa0tBZ0lDQXdBQlNCRUFnQmlBSklBaEJDR3NpQnlrREFCQWdESU1CQ3lBR0lCTWdCMEVCRU1VQ0RJWUJDeUFLUVFOcUlRMGdGQ0FLTHdBQklnZEJBblJxS0FJQUtBSVFJZ2sxQWdSQ0lJWkNnSUNBZ01BQVVnUkFJQVlnRXlBSFFRRVF4UUlNaGdFTElBWWdDU0FJUVFocklnY3BBd0FRSUF5QkFRc2dCaUFSSUFvdkFBRkJBM1JxUW9DQWdJREFBQkFnSUFwQkEyb2hEUXg2Q3lBS1FRTnFJUTBnRVNBS0x3QUJJZ2RCQTNScUtRTUFJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEQUFGSUVRQ0FCUWlDSXAwRjFUd1JBSUFHbklnY2dCeWdDQUVFQmFqWUNBQXNnQ0NBQk53TUFJQWhCQ0dvaEJ3eUFBUXNnQmlBVElBZEJBQkRGQWd5REFRc2dDa0VEYWlFTklCRWdDaThBQVNJSFFRTjBhaUlKTlFJRVFpQ0dRb0NBZ0lEQUFGSUVRQ0FHSUFrZ0NFRUlheUlIS1FNQUVDQU1md3NnQmlBVElBZEJBQkRGQWd5Q0FRc2dDa0VEYWlFTklCRWdDaThBQVVFRGRHb2lCelVDQkVJZ2hrS0FnSUNBd0FCU0JFQWdCa0hrN3dCQkFCREdBZ3lDQVFzZ0JpQUhJQWhCQ0dzaUJ5a0RBQkFnREgwTElCSW9BaHdoQ1NBTkx3QUFJUXNEUUNBSklnY2dLRVlOWVNBSEtBSUVJUWtnQjBFQ2F5OEJBQ0FMUncwQUlBZEJBMnNpRFMwQUFFRUNjUTBBSUJJb0FoUWdDMEVEZEdvcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJTUlBd29BZ0JCQVdvMkFnQUxJQWNnQVRjREVDQUhJQWRCRUdvMkFnZ2dCeWdDQUNJTUlBazJBZ1FnQ1NBTU5nSUFJQWRCQURZQ0FDQU5JQTB0QUFCQkFYSTZBQUFnQmlnQ0VDRU5JQWRCQkd0QkF6b0FBQ0FOS0FKUUlnd2dCellDQkNBSElBMUIwQUJxTmdJRUlBY2dERFlDQUNBTklBYzJBbEFNQUFzQUN5QUtMd0FGSVFzZ0NpZ0FBU0VNSUFnZ0JrS0FnSUNBSUJCSElnRTNBd0FnQ0VFSWFpRUhJQXBCQjJvaERRSkFBa0FnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBQWtBZ0NVSDZBRVlFUUNBVUlBdEJBblJxS0FJQUlna2dDU2dDQUVFQmFqWUNBQXdCQ3lBR0lCSWdDeUFKUWZrQVJoQ0xCQ0lKUlEwQkN5QUdJQWdvQWdBZ0RFRWlFSG9pQ3cwQklCWWdDUkRyQVFzZ0J5RUlESUFCQ3lBTElBazJBZ0FnQ0NBR0lBd1FYRGNEQ0NBSVFSQnFJUWNNZXdzZ0NrRUZhaUVOSUJzcEF3QWlMcWNpQ3lnQ0VDSUhRVEJxSVF3Z0J5QUtLQUFCSWdrZ0J5Z0NHSEZCZjNOQkFuUnFLQUlBSVFjQ1FBSkFBa0FDUUFOQUlBZEZEUUVnQ1NBTUlBZEJBV3RCQTNRaUQyb2lCeWdDQkVjRVFDQUhLQUlBUWYvLy94OXhJUWNNQVFzTElBc29BaFFnRDJvMUFnUkNJSVpDZ0lDQWdNQUFVUVJBSUFZZ0NSRFpBUXlEQVFzZ0J5MEFBMEVJY1VVTkF5QXVRaUNJcDBGMFN3MEJEQUlMSUFZZ0Jpa0R3QUVnQ1JCeElnZEJBRWdOZ1FFZ0IwVUVRRUtBZ0lDQU1DRXVEQUlMSUJrcEF3QWlMa0lnaUtkQmRVa05BU0F1cHlFTEN5QUxJQXNvQWdCQkFXbzJBZ0FMSUFnZ0xqY0RBQ0FJSUFZZ0NSQmNOd01JSUFoQkVHb2hCd3g3Q3lBR0lBbEJ6aDBRandFTWZnc2dEU0FOS0FBQWFpRU5JQWdoQnlBR0VIdEZEWGtNZlFzZ0RTQU5MZ0FBYWlFTklBZ2hCeUFHRUh0RkRYZ01mQXNnRFNBTkxBQUFhaUVOSUFnaEJ5QUdFSHRGRFhjTWV3c2dDa0VGYWlFSkFuOGdDRUVJYXlJSEtRTUFJZ0ZDLy8vLy96OVlCRUFnQWFjTUFRc2dCaUFCRUNZTEJIOGdEU2dBQUNBSmFrRUVhd1VnQ1FzaERTQUdFSHRGRFhZTUtBc2dDa0VGYWlFSkFuOGdDRUVJYXlJSEtRTUFJZ0ZDLy8vLy96OVlCRUFnQWFjTUFRc2dCaUFCRUNZTEJIOGdDUVVnRFNnQUFDQUpha0VFYXdzaERTQUdFSHRGRFhVTUp3c2dDa0VDYWlFSkFuOGdDRUVJYXlJSEtRTUFJZ0ZDLy8vLy96OVlCRUFnQWFjTUFRc2dCaUFCRUNZTEJIOGdEU3dBQUNBSmFrRUJhd1VnQ1FzaERTQUdFSHRGRFhRTUpnc2dDa0VDYWlFSkFuOGdDRUVJYXlJSEtRTUFJZ0ZDLy8vLy96OVlCRUFnQWFjTUFRc2dCaUFCRUNZTEJIOGdDUVVnRFN3QUFDQUpha0VCYXdzaERTQUdFSHRGRFhNTUpRc2dDQ0FOSUFvb0FBRnFJQk1vQWhScnJVS0FnSUNBMEFDRU53TUFJQXBCQldvaERTQUlRUWhxSVFjTWNnc2dDaWdBQVNFSElBZ2dDaUFUS0FJVWEwRUZhcTAzQXdBZ0J5QU5haUVOSUFoQkNHb2hCd3h4Q3dKQUlBaEJDR3NpQnlrREFDSUJRdi8vLy84UFZnMEFJQUduSWdrZ0V5Z0NHRThOQUNBVEtBSVVJQWxxSVEwTWNRc2dCa0gxNFFCQkFCQkdESFFMSUFoQkNHc2lEeWtEQUNJdFFpQ0lweUlIUVFGcUlnbEJCRTFCQUVFQklBbDBRUmx4RzBVRVFDQUdJQzBRM0FVaExRc0NRQ0FHUVJnUUtTSUpCRUFnQmtLQWdJQ0FJRUVSRUVraUxrS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQklBWW9BaEFpQjBFUWFpQUpJQWNvQWdRUkFBQUxJQzBoTGd4bEN5QUpRUUEyQWhBZ0NTQXROd01BSUFsQkFEWUNDQ0F1cHlBSk5nSWdJQWRCZm5GQkFrWU5aU0F0SWdGQ0lJaW5JZ2RCZFU4RVFDQXRweUlMSUFzb0FnQkJBV28yQWdBTEEwQWdCaUFCRUl3Q0lnRkNnSUNBZ0hDRElpOUNnSUNBZ0NCU0JFQWdMMEtBZ0lDQTRBQlJEV1lnQmlBT1FlQUFhaUFPUVlBQmFpQUJwMEVSRUk0QkRXVWdCaUFPS0FKZ0lBNG9Bb0FCSWdzUVdpQUxCRUFnQmlBQkVBOGdCMEYxU1ExbElDMm5JZ2NnQnlnQ0FFRUJhallDQUF4bEN5QUdFSHRGRFFFTVpRc0xBa0FDUUNBdHB5SU1MUUFGUVFoeFJRMEFRUUFoQnlBTUtBSVFJZ3NvQWlBaUVFRUFJQkJCQUVvYklSQWdDMEV3YWlFTEEwQWdCeUFRUmcwQ0lBc3RBQU5CRUhFTkFTQUxRUWhxSVFzZ0IwRUJhaUVIREFBTEFBc2dCaUFPUWVBQWFpQU9RWUFCYWlBTVFSRVFqZ0VOWlVFQUlRY2dEaWdDWUNFS0lBNG9Bb0FCSVFrRFFDQUhJQWxIQkVBZ0JpQXVJQW9nQjBFRGRHb29BZ1JDZ0lDQWdDQkJBQkRRQVJvZ0IwRUJhaUVIREFFTEN5QUdJQW9nQ1JCYURHWUxJQWxCQVRZQ0NDQUpJQXdvQWlnMkFnd01aUXRDZ1lDQWdCQWhMZ0pBSUFoQkNHc3BBd0FpTFVLQWdJQ0FjRlFOQUNBdHB5SUxMd0VHUVJGSERRQWdDeWdDSUNFSEEwQUNRQ0FIS0FJSUJFQWdCeWdDRUNJSklBY29BZ3hQRFFNZ0J5QUpRUUZxTmdJUUlBbEJnSUNBZ0hoeUlRa01BUXNnQnlnQ0VDSU1JQXNvQWhBaUNTZ0NJRThOQWlBSlFUQnFJQXhCQTNScUlnOG9BZ1FoQ1NBSElBeEJBV28yQWhBZ0NVVU5BU0FQTFFBRFFSQnhSUTBCQ3lBR0lBY3BBd0FnQ1JCeElneEJBRWdOZENBTVJRMEFDMEtBZ0lDQUVDRXVJQVlnQ1JCY0lRRUxJQWdnTGpjRENDQUlJQUUzQXdBZ0NFRVFhaUVIREc0TElBWWdDRUVBRUprRERYRWdDRUtBZ0lDQTBBQTNBd2dnQ0VFUWFpRUhERzBMSUFvdEFBRWhDVUVCSVFjZ0RrRUJOZ0pnSUFwQkFtb2hEVUtBZ0lDQU1DRXVJQWhCZlNBSmEwRURkR29pQ3lrREFDSUJRb0NBZ0lCd2cwS0FnSUNBTUZFTlhpQUdJQUVnQ0VGK0lBbHJRUU4wYWlrREFDQU9RZUFBYWhDdUFTSXVRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQkJmeUVISUE1QmZ6WUNZQXhlQ3lBT0tBSmdJZ2NOWFVFQUlRY01YZ3NnQmlBSVFRRVFtUU1OYnlBSVFvQ0FnSURRQURjRENDQUlRUkJxSVFjTWF3c2dDRUVJYXlJSEtRTUFJZ0ZDLy8vLy8yOVlCRUFnQmtHT01VRUFFQlVNYndzZ0JpQUJJQTVCNEFCcUVOc0ZJaTFDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5iaUFHSUFFUUR5QUhJQzAzQXdBZ0NDQU9LQUpnUVFCSHJVS0FnSUNBRUlRM0F3QWdDRUVJYWlFSERHb0xJQWhCQ0dzcEF3QkMvLy8vLzI5V0RXTWdCa0dPTVVFQUVCVU1iUXNnQmlBSVFSQnJJZ2twQXdBUUR5QUlRUmhySWdjcEF3QWlBVUtBZ0lDQWNJTkNnSUNBZ0RCUkRXZ2dCaUFCUVFBUXJRRUVRQ0FKSVFnTWJRc2dCaUFIS1FNQUVBOE1hQXNnQ0VFSWF5SUlLUU1BSVFFRFFBSkFJQWdnSEUwTkFDQUlRUWhySWdjcEF3QWlMVUtBZ0lDQWNJTkNnSUNBZ05BQVVRMEFJQVlnTFJBUElBY2hDQXdCQ3dzZ0NDQXBTUVJBSUFaQjNjb0FRUUFRUmlBR0lBRVFEd3hzQ3lBSUlBaEJDR3NpQnlrREFEY0RBQ0FJUVJCcklnb3BBd0FoTFNBS0lBaEJHR3NpQ2lrREFEY0RBQ0FISUMwM0F3QWdDaUFCTndNQUlBaEJDR29oQnd4bkN5QUdJQWhCR0dzcEF3QWdDRUVnYXlrREFFRUJJQWhCQ0dzaUJ4QWhJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5haUFHSUFjcEF3QVFEeUFISUFFM0F3QU1ZQXNnQ2tFQ2FpRU5JQWdnQmlBSVFTQnJJZ2NwQXdBaUFVRVhRUVlnQ2kwQUFTSUpRUUZ4R3lBQlFRQVFGQ0lCUW9DQWdJQndneUl0UW9DQWdJQWdVU0F0UW9DQWdJQXdVWElFZmtLQmdJQ0FFQVVnTFVLQWdJQ0E0QUJSRFdvZ0J5a0RBQ0V0QW40Z0NVRUNjUVJBSUFZZ0FTQXRRUUJCQUJBdkRBRUxJQVlnQVNBdFFRRWdDRUVJYXhBdkN5SUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRXb2dCaUFJUVFocklnY3BBd0FRRHlBSElBRTNBd0JDZ0lDQWdCQUxOd01BSUFoQkNHb2hCd3hsQ3dKL0lBaEJDR3NpQnlrREFDSUJRdi8vLy84L1dBUkFJQUduUVFCSERBRUxJQVlnQVJBbUN5RUtJQWNnQ2tXdFFvQ0FnSUFRaERjREFBeGVDeUFLUVFWcUlRMGdCaUFJUVFocklnY3BBd0FpQVNBS0tBQUJJQUZCQUJBVUlnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTlp5QUdJQWNwQXdBUUR5QUhJQUUzQXdBTVhRc2dDa0VGYWlFTklBWWdDRUVJYXlrREFDSUJJQW9vQUFFZ0FVRUFFQlFpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTFtSUFnZ0FUY0RBQ0FJUVFocUlRY01ZZ3NnQmlBSVFSQnJJZ2NwQXdBZ0NpZ0FBU0FJUVFocktRTUFRWUNBQWhEUUFTRUlJQVlnQnlrREFCQVBJQXBCQldvaERTQUlRUUJPRFdFTUV3c2dDa0VGYWlFTklBWWdDaWdBQVJEZ0JTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRXUWdDQ0FCTndNQUlBaEJDR29oQnd4Z0N5QUlRUWhySVFjQ1FDQUlRUkJySWdrcEF3QWlBVUwvLy8vL2IxZ0VRQ0FHRUNSQ2dJQ0FnT0FBSVM0TUFRc2dCeWtEQUNJdFFvQ0FnSUJ3ZzBLQWdJQ0FnSDlTQkVBZ0JoQ0lCRUtBZ0lDQTRBQWhMZ3dCQ3lBR0tBSVFJQzBRalFJaENDQUJweUlNS0FJUUlndEJNR29oRHlBTElBZ2dDeWdDR0hGQmYzTkJBblJxS0FJQUlRc0NRQU5BSUFzRVFDQVBJQXRCQVd0QkEzUWlDMm9pRUNnQ0JDQUlSZzBDSUJBb0FnQkIvLy8vSDNFaEN3d0JDd3NnQmlBSUVOb0ZRb0NBZ0lEZ0FDRXVEQUVMSUF3b0FoUWdDMm9wQXdBaUxrSWdpS2RCZFVrTkFDQXVweUlJSUFnb0FnQkJBV28yQWdBTElBWWdCeWtEQUJBUElBWWdDU2tEQUJBUElBa2dMamNEQUNBdVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFY4TUVRc2dDRUVRYXlrREFDRUJJQWhCQ0dzaENRSkFBa0FnQ0VFWWF5SUhLUU1BSWkxQy8vLy8vMjlZQkVBZ0JoQWtEQUVMSUFrcEF3QWlMa0tBZ0lDQWNJTkNnSUNBZ0lCL1VnUkFJQVlRaUFRTUFRc2dCaWdDRUNBdUVJMENJUWdnTGFjaURDZ0NFQ0lMUVRCcUlROGdDeUFJSUFzb0FoaHhRWDl6UVFKMGFpZ0NBQ0VMQTBBZ0N3UkFJQThnQzBFQmEwRURkQ0lMYWlJUUtBSUVJQWhHRFFNZ0VDZ0NBRUgvLy84ZmNTRUxEQUVMQ3lBR0lBZ1EyZ1VMSUFZZ0FSQVBJQVlnQnlrREFCQVBJQVlnQ1NrREFCQVBJQWNoQ0F4akN5QUdJQXdvQWhRZ0Myb2dBUkFnSUFZZ0J5a0RBQkFQSUFZZ0NTa0RBQkFQREY0TElBaEJHR3NoQnlBSVFRaHJLUU1BSVFFZ0NFRVFheUVJQWtBQ1FDQUhLUU1BSWkxQy8vLy8vMjlZQkVBZ0JoQWtEQUVMSUFncEF3QWlMa0tBZ0lDQWNJTkNnSUNBZ0lCL1VnUkFJQVlRaUFRTUFRc2dCaWdDRUNBdUVJMENJUWNnTGFjaUN5Z0NFQ0lKUVRCcUlRd2dDU0FISUFrb0FoaHhRWDl6UVFKMGFpZ0NBQ0VKQWtBRFFDQUpSUTBCSUFjZ0RDQUpRUUZyUVFOMGFpSUpLQUlFUndSQUlBa29BZ0JCLy8vL0gzRWhDUXdCQ3dzZ0JpQUhRWmd6RUk4QkRBRUxJQVlnQ3lBSFFRY1FlaUlIRFFFTElBWWdBUkFQSUFZZ0NDa0RBQkFQREdJTElBY2dBVGNEQUNBR0lBZ3BBd0FRRHd4WEN5QUtRUVZxSVEwZ0JpQUlRUkJyS1FNQUlBb29BQUVnQ0VFSWF5SUhLUU1BUVllQUFSQVpRUUJPRFZ3TURnc2dDa0VGYWlFTklBZ2hCeUFHSUFoQkNHc3BBd0FnQ2lnQUFSRFpCVUVBVGcxYkRGOExJQWdoQnlBR0lBaEJDR3NwQXdBZ0NFRVFheWtEQUJEWUJVRUFUZzFhREY0TElBaEJDR3NpQnlrREFDSUJRdi8vLy85dldDQUJRb0NBZ0lCd2cwS0FnSUNBSUZKeFJRUkFJQVlnQ0VFUWF5a0RBQ0FCUVFFUWl3SkJBRWdOWGdzZ0JpQUJFQThNV1FzZ0JpQUlRUWhyS1FNQUlBaEJFR3NwQXdBUWh3UU1VZ3NnQ0FKL0lBbEIxUUJHQkVCQmZTQUdJQWhCRUdzcEF3QVFNU0lMRFFFYURGMExJQXBCQldvaERTQUtLQUFCSVF0QmZndEJBM1JxSVFjQ2ZnSitBa0FDUUFKQUlBMHRBQUFpREVFRGNRNENBQUVDQzBHRHpnRWhDaUFJUVFocktRTUFJZ0VoTDBLQWdJQ0FNQXdDQzBLQWdJQ0FNQ0V2UVlHYUFTRUtRb0NBZ0lBd0lTMGdDRUVJYXlrREFDSUJEQUlMUW9DQWdJQXdJUzlCZ2FvQklRb2dDRUVJYXlrREFDSUJDeUV0UW9DQWdJQXdDeUV4SUFjcEF3QWhNRUcybVFFaEJ5QUdJQXNRMXdVaExnSkFJQXBCZ0JCeFJRUkFRYkdaQVNFSElBcEJnQ0J4UlEwQkN5QUdJQWNnTGtITW5nRVF2Z0VoTGdzZ0NFRUlheUVIQW45QmZ5QXVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWFRWDhnQmlBQlFUWWdMa0VCRUJsQkFFZ05BQm9nQmlBQklEQVFod1FnQmlBd0lBc2dMeUF4SUMwZ0NpQU1RUVJ4Y2hCdEN5RUtJQVlnQnlrREFCQVBJQTFCQVdvaERTQUlJQWxCMVFCR0JIOGdCaUFMRUJNZ0JpQUlRUkJyS1FNQUVBOUJmZ1ZCZnd0QkEzUnFJUWNnQ2tFQVRnMVhJQXBCSG5aQkFuRU1XQXNnQ2tFR2FpRU5JQWhCQ0dzaURDa0RBQ0V4SUFoQkVHc2hDeUFLS0FBQklROENRQUpBSUFvdEFBVkJBWEVFUUVLQWdJQ0FJQ0V0SUFzcEF3QWlNRUtBZ0lDQWNJTkNnSUNBZ0NCUkJFQWdCaWtETUNJd1FpQ0lwMEYwU3cwQ0RBTUxRb0NBZ0lBd0lTOUJnVDRoQnlBd1FvQ0FnSUJ3VkExR0lEQ25MUUFGUVJCeFJRMUdJQVlnTUVFN0lEQkJBQkFVSWkxQ2dJQ0FnSENESWdGQ2dJQ0FnQ0JSRFFJZ0FVS0FnSUNBNEFCUkRVZ2dMVUtBZ0lDQWNGb05Ba0c3MHdBaEJ3eEhDeUFHS0FJb0tRTUlJaTFDSUlpblFYVlBCRUFnTGFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHS1FNd0lqQkNJSWluUVhWSkRRRUxJRENuSWdjZ0J5Z0NBRUVCYWpZQ0FBdENnSUNBZ09BQUlTOGdCaUF0RUVjaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVExRklER25JZ2N0QUJGQk1IRU5QMEtBZ0lDQTRBQWhMaUFHSURCQkRSQkpJaTlDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5Ra0tBZ0lDQU1DRXhJQVlnTHlBSElCUWdFaERXQlNJdVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFVJZ0JpQXVJQUVRaHdRZ0xrS0FnSUNBY0ZvRVFDQXVweUlRSUJBdEFBVkJFSEk2QUFVTElBWWdMa0V3SUFjekFTeEJBUkFaR2dKQUlBbEIxd0JHQkVBZ0JpQXVJQWhCR0dzcEF3QVEyQVZCQUVnTlJBd0JDeUFHSUM0Z0R4RFpCVUVBU0ExREN5QXVRaUNJcDBGMVR3UkFJQzZuSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dCaUFCUVR3Z0xrR0RnQUVRR1VFQVNBMUNJQUZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUM1Qk95QUJRWUNBQVJBWlFRQklEVUlnQmlBdEVBOGdCaUF3RUE4Z0N5QXVOd01BSUF3Z0FUY0RBQXhRQ3lBR0lBaEJFR3NpQ1NrREFDQUlRUWhySWdjcEF3QVFUU0VCSUFZZ0NTa0RBQkFQSUFrZ0FUY0RBQ0FCUW9DQWdJQndnMEtBZ0lDQTRBQlNEVlVNQndzZ0NFRUlheUlISUFZZ0NFRVFheWtEQUNBSEtRTUFFRTBpQVRjREFDQUlJUWNnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZzFVREZnTElBaEJDR3NwQXdBaEFTQUlRUkJyS1FNQUlpMUNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBWWdBUkF4SWdkRkRWZ2dCaUFIRU1jQ0lBWWdCeEFUREZnTElBRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUdJQzBnQVJCTklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTlZ5QUlJQUUzQXdBZ0NFRUlhaUVIREZNTElBWWdDRUVJYXlJTUtRTUFFREVpQ1VVTlZpQUdJQWhCRUdzaUJ5a0RBQ0FKSUFoQkdHc2lDeWtEQUVFQUVCUWhBU0FHSUFrUUV5QUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRWWWdCaUFNS1FNQUVBOGdCaUFIS1FNQUVBOGdCaUFMS1FNQUVBOGdDeUFCTndNQURGSUxJQVlnQ0VFWWF5SUhLUU1BSUFoQkVHc3BBd0FnQ0VFSWF5a0RBRUdBZ0FJUTF3RWhDQ0FHSUFjcEF3QVFEeUFJUVFCT0RWRU1Bd3NnQmlnQ0VDZ0NqQUVoQ1FKL0FrQWdDRUVZYXlJSEtRTUFJaTVDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFBa0FnQ1VVTkFDQUpMUUFvUVFGeFJRMEFJQVlnQ0VFUWF5a0RBQkF4SWdkRkRWZ2dCaUFIRU1jQ0lBWWdCeEFUREZnTElCa3BBd0FpTGtJZ2lLZEJkVThFUUNBdXB5SUtJQW9vQWdCQkFXbzJBZ0FMSUFjZ0xqY0RBQXdCQ3lBSlJRMEFRWUNBQmlBSktBSW9RUUZ4RFFFYUMwR0FnQUlMSVFvZ0JpQXVJQWhCRUdzcEF3QWdDRUVJYXlrREFDQUtFTmNCSVFnZ0JpQUhLUU1BRUE4Z0NFRUFUZzFRSUFoQkhuWkJBbkVNVVFzZ0NFRVlheUlKS1FNQVF2Ly8vLzl2V0ExTElBWWdDRUVRYXlJTUtRTUFFREVpQzBVTlV5QUdJQWtwQXdBZ0N5QUlRUWhyS1FNQUlBaEJJR3NpQnlrREFFR0FnQUlRaGdRaENDQUdJQXNRRXlBR0lBY3BBd0FRRHlBR0lBa3BBd0FRRHlBR0lBd3BBd0FRRHlBSVFRQk9EVThnQ0VFZWRrRUNjUXhRQ3lBSVFSaHJLUU1BSVMwZ0NFRVFheWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0JpQXRJQUVnQ0VFSWF5SUhLUU1BUVllQUFSQzlBVUVBVGcxT0N5QUhJUWdNVVFzZ0NFRVFheUlNS1FNQUlpNUNnSUNBZ0JCYUJFQWdCa0gyOGdCQkFCQkdERkVMSUFZZ0NFRUlheUlIS1FNQUlnRkIwUUVnQVVFQUVCUWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMVFJQUZCUFVFQkVJVUVJUXNnQmlBQkVBOGdCaUFIS1FNQVFRQVE1d0VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTFRSUFZZ0FVSHFBQ0FCUVFBUUZDSXRRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdCaUFCRUE4TVVRc2dMcWNoQ1FKQUFrQWdDMFVOQUNBdFFUNUJBQkNGQkVVTkFDQUhLUU1BSWk0Z0RrSGdBR29nRGtHQUFXb1FpZ0pGRFFBZ0JpQU9RWndCYWlBdUVOWUJEVGtnRGlnQ25BRWlEeUFPS0FLQUFVY05BQ0FJUVJocklSQkJBQ0VMSUE0b0FtQWhJd05BSUFzZ0QwWU5BaUFRS1FNQUlTOGdJeUFMUVFOMGFpa0RBQ0l1UWlDSXAwRjFUd1JBSUM2bkloZ2dHQ2dDQUVFQmFqWUNBQXNnQmlBdklBa2dMa0VIRUs4QklSZ2dDMEVCYWlFTElBbEJBV29oQ1NBWVFRQk9EUUFMRERrTElBaEJHR3NoQ3dOQUlBWWdBU0F0SUE1Qm5BRnFFSzRCSWk1Q2dJQ0FnSENEUW9DQWdJRGdBRkVOT1NBT0tBS2NBUTBCSUFZZ0N5a0RBQ0FKSUM1QkJ4Q3ZBVUVBU0EwNUlBbEJBV29oQ1F3QUN3QUxJQXdnQ2EwM0F3QWdCaUFCRUE4Z0JpQXRFQThnQmlBSEtRTUFFQThNVEFzZ0NrRUNhaUVOSUFnaEJ5QUdJQWdnQ2kwQUFTSUpRWDl6SWd0QkEzUkJZSEpxS1FNQUlBZ2dDMEVCZEVGQWNrRjRjV29wQXdBZ0NDQUpRUVYyUVg5elFRTjBhaWtEQUVFQUVOUUZSUTFMREU4TEFrQWdDRUVJYXlJSEtRTUFJZ0ZDSUlpbklnc2dDRUVRYXlJSktRTUFJaTFDSUlpbklneHlSUVJBSUFIRUlDM0VmQ0lCUW9DQWdJQUlmRUwvLy8vL0QxWU5BU0FKSUFGQy8vLy8vdytETndNQURFd0xJQXhCQjJ0QmJVc2dDMEVIYTBGdFMzSU5BQ0FKUW9DQWdJREFmaUF0UW9DQWdJREFnWUQ4L3dCOHZ5QUJRb0NBZ0lEQWdZRDgvd0I4djZDOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHMzQXdBTVN3c2dCaUFJRU5NRlJRMUtERTRMSUFwQkFtb2hEUUpBSUFoQkNHc2lDQ2tEQUNJdElCRWdDaTBBQVVFRGRHb2lCeWtEQUNJQmhFTC8vLy8vRDFnRVFDQXR4Q0FCeEh3aUxVS0FnSUNBQ0h4Qy8vLy8vdzlXRFFFZ0J5QXRRdi8vLy84UGd6Y0RBQXhGQ3lBQlFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFBZ0JpQXRRUUlRbWdFaUxVS0FnSUNBY0lOQ2dJQ0FnT0FBVVExT0lBY3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUpJQWtvQWdCQkFXbzJBZ0FMSUFZZ0FTQXRFTVFDSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOVGlBR0lBY2dBUkFnREVRTElBRkNJSWluUVhWUEJFQWdBYWNpQ1NBSktBSUFRUUZxTmdJQUN5QU9JQUUzQXlBZ0RpQUlLUU1BTndNb0lBWWdMQkRUQlExTklBWWdCeUFPS1FNZ0VDQU1Rd3NnQ0VFSWF5SUhLUU1BSWdGQ0lJaW5JZ3dnQ0VFUWF5SUxLUU1BSWkxQ0lJaW5JZzl5UlFSQUlDM0VJQUhFZlNJQlFvQ0FnSUFJZkVMLy8vLy9EMVlOQkNBTElBRkMvLy8vL3crRE53TUFERWtMSUE5QkIydEJiVXNnREVFSGEwRnRTM0lOQXlBTFFvQ0FnSURBZmlBdFFvQ0FnSURBZ1lEOC93Qjh2eUFCUW9DQWdJREFnWUQ4L3dCOHY2RzlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzM0F3QU1TQXNDZkNBSVFRaHJJZ2NwQXdBaUxVSWdpS2NpRENBSVFSQnJJZ3NwQXdBaUxrSWdpS2NpRDNKRkJFQWdMY1FnTHNSK0lnRkNnSUNBZ0FoOFFvQ0FnSUFRV2dSQUlCSXRBQ2hCQkhGQkFDQUJRb0NBZ0lDQWdJQVFmVUtCZ0lDQWdJQ0FZRlFiRFFVZ0Fia01BZ3RFQUFBQUFBQUFBSUFnTFNBdWhFS0FnSUNBQ0lOUUlBRkNBRkp5UlEwQkdpQUxJQUZDLy8vLy93K0ROd01BREVrTElBOUJCMnRCYlVzZ0RFRUhhMEZ0UzNJTkF5QVNMUUFvUVFSeERRTWdMa0tBZ0lDQXdJR0EvUDhBZkw4Z0xVS0FnSUNBd0lHQS9QOEFmTCtpQ3lFMElBdENnSUNBZ01CK0lEUzlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzM0F3QU1Sd3NnQ0VFSWF5SUhLUU1BSWdFZ0NFRVFheUlMS1FNQUlpMkVRdi8vLy84UFZnMEJJQkl0QUNoQkJIRU5BU0FMQW40Z0xhZTNJQUdudDZNaU5MMGlBUUovSURTWlJBQUFBQUFBQU9CQll3UkFJRFNxREFFTFFZQ0FnSUI0Q3lJSXQ3MVJCRUFnQ0swTUFRdENnSUNBZ01CK0lBRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMTndNQURFWUxJQWhCQ0dzaUJ5a0RBQ0lCSUFoQkVHc2lDeWtEQUNJdGhFTC8vLy8vRDFZTkFDQXRweUlNUVFCSURRQWdBYWNpRDBFQVRBMEFJQXNnRENBUGNLMDNBd0FNUlFzakFFRWdheUlISkFBQ2Z3SkFBa0FDUUFKQUFuNENRQUpBQWtBQ1FBSkFBa0FDUUVFSElBaEJFR3NpQ3lrREFDSUJRaUNJcHlJTUlBeEJCMnRCYmtrYklneEJCMGRCQnlBSVFRaHJJaU1wQXdBaUxrSWdpS2NpRHlBUFFRZHJRVzVKR3lJUFFRZEhja1VFUUNBSElDNUNnSUNBZ01DQmdQei9BSHczQXdnZ0J5QUJRb0NBZ0lEQWdZRDgvd0I4TndNUURBRUxBa0FnREVGL1JpQVBRWDV4UVFKSGNVVWdERUYrY1VFQ1JpQVBRWDlIY25FTkFDQUdJQWRCR0dvZ0FTQXVJQWxCQVVFQUVJVUNJZ3hGRFFBZ0JpQUJFQThnQmlBdUVBOGdERUVBU0EwTUlBc2dCeWtER0RjREFBd0pDeUFHSUFFUWJDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRb2dCaUF1RUd3aUxrS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBWWdBUkFQREF3TFFRY2dBVUlnaUtjaURDQU1RUWRyUVc1Skd5SU1RUWNnTGtJZ2lLY2lEeUFQUVFkclFXNUpHeUlQY2tVRVFDQXVweUVNSUFHbklROENRQUpBQWtBQ1FBSkFBa0FnQ1VHYUFXc09CZ0FCQWdrRkF3UUxJQzdFSUFIRWZpRXRBa0FnQmlnQ0VDSVFLQUtNQVNJWVJRMEFJQmd0QUNoQkJIRkZEUUFnTFVLQWdJQ0FnSUNBRUgxQ2dZQ0FnSUNBZ0dCVURRZ0xRZ0FoQVNBdFFnQlNEUW9nRENBUGNrRUFUZzBMSUF0Q2dJQ0FnTUQrL3dNM0F3QU1EZ3NnQmlnQ0VDSVFLQUtNQVNJWUJFQWdHQzBBS0VFRWNRMEhDeUFMUW9DQWdJREFmaUFQdHlBTXQ2TzlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzM0F3QU1EUXNnREVFQVNpQVBRUUJPY1VVRVFDQUxBbjRnRDdjZ0RMY1FqZ01pTkwwaUFRSi9JRFNaUkFBQUFBQUFBT0JCWXdSQUlEU3FEQUVMUVlDQWdJQjRDeUlKdDcxUkJFQWdDYTBNQVF0Q2dJQ0FnTUIrSUFGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xOd01BREEwTElBOGdESEN0SVMwTUNBc2dCaWdDRUNJUUtBS01BU0lZQkVBZ0dDMEFLRUVFY1EwRkN5QVB0eUUwSUFzQ2ZnSjhJQXkzSWpXOVFvQ0FnSUNBZ0lENC93Q0RRb0NBZ0lDQWdJRDQvd0JSQkVCRUFBQUFBQUFBK0g4Z05KbEVBQUFBQUFBQThEOWhEUUVhQ3lBMElEVVFqd01MSWpTOUlnRUNmeUEwbVVRQUFBQUFBQURnUVdNRVFDQTBxZ3dCQzBHQWdJQ0FlQXNpQ2JlOVVRUkFJQW10REFFTFFvQ0FnSURBZmlBQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDemNEQUF3TEN5QUpRYklCUmcwRkRBUUxJQUhFSUM3RWZTRXREQVVMSUF4QmRVY2dEMEYxUjNGRkJFQWdCaUFKSUFzZ0FTQXVJQVlvQWhBb0F0Z0NFUm9BRFF3TUNRc2dERUYzUnlBUFFYZEhjVVVFUUNBR0lBa2dDeUFCSUM0Z0JpZ0NFQ2dDdkFJUkdnQkZEUWtNREFzZ0RFRjJSeUFQUVhaSGNVVUVRQ0FHS0FJUUlSQU1BZ3NnQmlBSFFSQnFJQUVRYmcwS0lBWWdCMEVJYWlBdUVHNE5Dd3NDUUNBR0tBSVFJaEFvQW93QklneEZEUUFnREMwQUtFRUVjVVVOQUNBSEt3TVFFTDBDUlEwQUlBY3JBd2dRdlFJTkFRc0NRQUpBQWtBQ1FBSkFBa0FDUUNBSlFab0JhdzRHQUFFQ0NBVUVBd3NnQnlzREVDQUhLd01Jb2lFMERBVUxJQWNyQXhBZ0J5c0RDS01oTkF3RUN5QUhLd01RSUFjckF3Z1FqZ01oTkF3REN5QUpRYklCUncwRUlBY3JBeEFnQnlzRENKa2lOUkNPQXlJMFJBQUFBQUFBQUFBQVkwVU5BaUExSURTZ0lUUU1BZ3NnQnlzREVDRTFJQWNyQXdnaU5yMUNnSUNBZ0lDQWdQai9BSU5DZ0lDQWdJQ0FnUGovQUZFRVFFUUFBQUFBQUFENGZ5RTBJRFdaUkFBQUFBQUFBUEEvWVEwQ0N5QTFJRFlRandNaE5Bd0JDeUFIS3dNUUlBY3JBd2loSVRRTElBdENnSUNBZ01CK0lEUzlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzM0F3QU1Cd3NnQmlBSklBc2dBU0F1SUJBb0FxQUNFUm9BUlEwR0RBa0xFQUVBQ3lBTVJRMEZJQUhFSUM3RUlnR0JJaTFDQUZrTkFDQU1RUUJJQkVBZ0xTQUJmU0V0REFFTElBRWdMWHdoTFFzZ0xVS0FnSUNBQ0h4Qy8vLy8vdzlXRFFFZ0xTRUJDeUFCUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnTGJtOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMSVFFZ0N5QUJOd01BQzBFQURBTUxJQVpCQWhDRUFnd0JDeUFHSUM0UUR3c2dDMEtBZ0lDQU1EY0RBQ0FqUW9DQWdJQXdOd01BUVg4TElRa2dCMEVnYWlRQUlBa05TQ0FJUVFocklRY01SQXNnQ0VFRWF5Z0NBQ0lIUlNBSFFRZHJRVzVKY2cwOUlBZ2hCeUFHSUFoQmpRRVE1Z0ZGRFVNTVJ3c0NRQUo4SUFoQkNHc2lCeWtEQUNJQlFpQ0lweUlKUlFSQVJBQUFBQUFBQUFDQUlBR25JZ3BGRFFFYVJBQUFBQUFBQU9CQklBcEJnSUNBZ0hoR0RRRWFJQWRDQUNBQmZVTC8vLy8vRDRNM0F3QU1Qd3NnQ1VFSGEwRnRTdzBCSUFGQ2dJQ0FnTUQrL3dOOXZ3c2hOQ0FIUW9DQWdJREFmaUEwdlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJOd01BREQwTElBZ2hCeUFHSUFoQmpBRVE1Z0ZGRFVJTVJnc2dDRUVJYXlJSEtRTUFJZ0ZDLy8vLy93OVdJQUZDLy8vLy93K0RRdi8vLy84SFVYSkZCRUFnQnlBQlFnRjhRdi8vLy84UGd6Y0RBQXc4Q3lBSUlRY2dCaUFJUVk4QkVPWUJSUTFCREVVTElBaEJDR3NpQnlrREFDSUJRdi8vLy84UFZpQUJRdi8vLy84UGcwS0FnSUNBQ0ZGeVJRUkFJQWNnQVVJQmZVTC8vLy8vRDRNM0F3QU1Pd3NnQ0NFSElBWWdDRUdPQVJEbUFVVU5RQXhFQ3lBR0lBaEJDR3NpQnlrREFCQnNJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FIUW9DQWdJQXdOd01BREVRTElBY2dBVGNEQUNBQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQUJOd01BSUFZZ0NFRUlhaUlISUFsQkFtc1E1Z0ZGRFQ4TVF3c2dDa0VDYWlFTklCRWdDaTBBQVVFRGRHb2lCeWtEQUNJQlF2Ly8vLzhQVmlBQlF2Ly8vLzhQZzBMLy8vLy9CMUZ5UlFSQUlBY2dBVUlCZkVMLy8vLy9ENE0zQXdBTU9Rc2dBVUlnaUtkQmRVOEVRQ0FCcHlJSklBa29BZ0JCQVdvMkFnQUxJQTRnQVRjRFlDQUdJQ1pCandFUTVnRU5RaUFHSUFjZ0Rpa0RZQkFnRERnTElBcEJBbW9oRFNBUklBb3RBQUZCQTNScUlnY3BBd0FpQVVMLy8vLy9EMVlnQVVMLy8vLy9ENE5DZ0lDQWdBaFJja1VFUUNBSElBRkNBWDFDLy8vLy93K0ROd01BRERnTElBRkNJSWluUVhWUEJFQWdBYWNpQ1NBSktBSUFRUUZxTmdJQUN5QU9JQUUzQTJBZ0JpQW1RWTRCRU9ZQkRVRWdCaUFISUE0cEEyQVFJQXczQ3lBSVFRaHJJZ2NwQXdBaUFVTC8vLy8vRDFnRVFDQUhJQUZDLy8vLy93K0ZOd01BRERjTElBZ2hCeU1BUVJCcklna2tBQUovQWtBQ1FBSkFJQWhCQ0dzaUN5a0RBQ0lCUW9DQWdJQndWQTBBSUFZZ0NVRUlhaUFCUVpVQkVNSUZJZ3hCQUVnTkFTQU1SUTBBSUFZZ0FSQVBJQXNnQ1NrRENEY0RBQXdDQ3dKQUlBWWdBUkJzSWdGQ2dJQ0FnSENESWkxQ2dJQ0FnT0FBVVEwQUlBWW9BaEFpRENnQ2pBRWlEd1IvSUE4dEFDaEJCSEZCQW5ZRlFRQUxSU0F0UW9DQWdJRGdmbEp4UlFSQUlBWWdDMEdWQVNBQklBd29BcHdDRVJzQURRRU1Bd3NnQmlBSlFRUnFJQUVRbUFFTkFDQUxJQWsxQWdSQy8vLy8vdytGTndNQURBSUxJQXRDZ0lDQWdEQTNBd0FMUVg4TUFRdEJBQXNoQ3lBSlFSQnFKQUFnQzBVTlBBeEFDd0pBQWtBQ1FDQUlRUWhySWdjcEF3QWlBU0FJUVJCcklnc3BBd0FpTFlSQy8vLy8vdzlXRFFBZ0FhY2hDU0FTTFFBb1FRUnhSUTBCSUFsQkgwc05BQ0F0SUFHR1FvQ0FnSUFJZkVLQWdJQ0FFRlFOQWdzZ0JpQUlRYUFCRU1NQ1JRMDlERUVMSUFsQkgzRWhDUXNnQ3lBdHB5QUpkSzAzQXdBTU93c2dDRUVJYXlJSEtRTUFJZ0VnQ0VFUWF5SUpLUU1BSWkyRVF2Ly8vLzhQV0FSQUlBa0NmaUF0cHlBQnAzWWlDRUVBVGdSQUlBaXREQUVMUW9DQWdJREFmaUFJdUwwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3MzQXdBTU93c2pBRUVRYXlJSkpBQWdDRUVJYXlJTUtRTUFJUzBDZndKQUFrQWdCaUFJUVJCcklnc3BBd0FRYkNJQlFvQ0FnSUJ3Z3lJdVFvQ0FnSURnQUZFRVFDQUdJQzBRRHd3QkN5QUdJQzBRYkNJdFFvQ0FnSUJ3Z3lJdlFvQ0FnSURnQUZFRVFDQUdJQUVRRHd3QkN5QUdLQUlRS0FLTUFTSVBCRUFnRHkwQUtFRUVjUTBDQ3lBdVFvQ0FnSURnZmxJZ0wwS0FnSUNBNEg1U2NRMEJJQVpCK29nQlFRQVFGU0FHSUFFUUR5QUdJQzBRRHdzZ0MwS0FnSUNBTURjREFDQU1Rb0NBZ0lBd053TUFRWDhNQVFzZ0JpQUpRUXhxSUFFUW1BRWFJQVlnQ1VFSWFpQXRFSmdCR2lBTEFuNGdDU2dDRENBSktBSUlkaUlMUVFCT0JFQWdDNjBNQVF0Q2dJQ0FnTUIrSUF1NHZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3pjREFFRUFDeUVMSUFsQkVHb2tBQ0FMUlEwNkRENExBa0FnQ0VFSWF5SUhLUU1BSWdFZ0NFRVFheUlKS1FNQUlpMkVRdi8vLy84UFZnMEFJQWtnTGFjZ0FhY2lDVUVnVHdSL0lCSXRBQ2hCQkhFTkFTQUpRUjl4QlNBSkMzV3ROd01BRERvTElBWWdDRUdoQVJEREFrVU5PUXc5Q3lBSVFRaHJJZ2NwQXdBaUFTQUlRUkJySWdrcEF3QWlMWVJDLy8vLy93OVlCRUFnQ1NBQklDMkROd01BRERrTElBWWdDRUd0QVJEREFrVU5PQXc4Q3lBSVFRaHJJZ2NwQXdBZ0NFRVFheUlKS1FNQWhDSUJRdi8vLy84UFdBUkFJQWtnQVRjREFBdzRDeUFHSUFoQnJ3RVF3d0pGRFRjTU93c2dDRUVJYXlJSEtRTUFJZ0VnQ0VFUWF5SUpLUU1BSWkyRVF2Ly8vLzhQV0FSQUlBa2dBU0F0aFRjREFBdzNDeUFHSUFoQnJnRVF3d0pGRFRZTU9nc2dDRUVJYXlJSEtRTUFJZ0VnQ0VFUWF5SUpLUU1BSWkyRVF2Ly8vLzhQV0FSQUlBa2dMYWNnQWFkSXJVS0FnSUNBRUlRM0F3QU1OZ3NnQmlBSVFhTUJFSmNEUlEwMUREa0xJQWhCQ0dzaUJ5a0RBQ0lCSUFoQkVHc2lDU2tEQUNJdGhFTC8vLy8vRDFnRVFDQUpJQzJuSUFHblRLMUNnSUNBZ0JDRU53TUFERFVMSUFZZ0NFR2tBUkNYQTBVTk5BdzRDeUFJUVFocklnY3BBd0FpQVNBSVFSQnJJZ2twQXdBaUxZUkMvLy8vL3c5WUJFQWdDU0F0cHlBQnAwcXRRb0NBZ0lBUWhEY0RBQXcwQ3lBR0lBaEJwUUVRbHdORkRUTU1Od3NnQ0VFSWF5SUhLUU1BSWdFZ0NFRVFheUlKS1FNQUlpMkVRdi8vLy84UFdBUkFJQWtnTGFjZ0FhZE9yVUtBZ0lDQUVJUTNBd0FNTXdzZ0JpQUlRYVlCRUpjRFJRMHlERFlMSUFoQkNHc2lCeWtEQUNJQklBaEJFR3NpQ1NrREFDSXRoRUwvLy8vL0QxZ0VRQ0FKSUMybklBR25ScTFDZ0lDQWdCQ0VOd01BRERJTElBWWdDRUVBRU5JRlJRMHhERFVMSUFoQkNHc2lCeWtEQUNJQklBaEJFR3NpQ1NrREFDSXRoRUwvLy8vL0QxZ0VRQ0FKSUMybklBR25SNjFDZ0lDQWdCQ0VOd01BRERFTElBWWdDRUVCRU5JRlJRMHdERFFMSUFoQkNHc2lCeWtEQUNJQklBaEJFR3NpQ2lrREFDSXRoRUwvLy8vL0QxZ0VRQ0FLSUMybklBR25ScTFDZ0lDQWdCQ0VOd01BRERBTElBWWdDRUVBRU5FRkRDOExJQWhCQ0dzaUJ5a0RBQ0lCSUFoQkVHc2lDaWtEQUNJdGhFTC8vLy8vRDFnRVFDQUtJQzJuSUFHblI2MUNnSUNBZ0JDRU53TUFEQzhMSUFZZ0NFRUJFTkVGREM0TElBWWdDQ0FXS0FMSUFoRURBQTB4SUFoQkNHc2hCd3d0Q3lBSVFRaHJJZ2NwQXdBaUFVTC8vLy8vYjFnRVFDQUdRYUgwQUVFQUVCVU1NUXNnQmlBSVFSQnJJZ3dwQXdBaUxSQXhJZ2xGRFRBZ0JpQUJJQWtRY1NFTElBWWdDUkFUSUF0QkFFZ05NQ0FHSUMwUUR5QUdJQUVRRHlBTUlBdEJBRWV0UW9DQWdJQVFoRGNEQUF3c0N5QUdJQWhCRUdzaUNTa0RBQ0lCSUFoQkNHc2lCeWtEQUNJdEVOQUZJZ3RCQUVnTkx5QUdJQUVRRHlBR0lDMFFEeUFKSUF0QkFFZXRRb0NBZ0lBUWhEY0RBQXdyQ3lBR0lBaEJDR3NpQnlrREFDSUJFSVFFSVFvZ0JpQUJFQThnQnlBR0lBb1FMVGNEQUF3a0N5QUlRUkJySWd3cEF3QWhBU0FHSUFoQkNHc2lCeWtEQUNJdEVERWlDVVVOTFNBR0lBRWdDVUdBZ0FJUTFRRWhDeUFHSUFrUUV5QUxRUUJJRFMwZ0JpQUJFQThnQmlBdEVBOGdEQ0FMUVFCSHJVS0FnSUNBRUlRM0F3QU1LUXNnQ2tFRmFpRU5JQVlnQmlrRHdBRWdDaWdBQVVFQUVOVUJJZ2RCQUVnTkxDQUlJQWRCQUVldFFvQ0FnSUFRaERjREFDQUlRUWhxSVFjTUtBc2dDRUVJYXlJSEtRTUFJZ0ZDLy8vLy8yOVdEU0VnQmlBQkVDVWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMHJJQVlnQnlrREFCQVBJQWNnQVRjREFBd2hDeUFJUVFocklnY3BBd0FpQVVJZ2lLZEJDR29pQ1VFSVRVRUFRUUVnQ1hSQmd3SnhHdzBnSUFZZ0FSQ0RCQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEU29nQmlBSEtRTUFFQThnQnlBQk53TUFEQ0FMSUFoQkVHc3BBd0JDZ0lDQWdCQ0VRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUdRWlliUVFBUUZRd3FDeUFJUVFocklnY3BBd0FpQVVJZ2lLZEJDR29pQ1VFSVRVRUFRUUVnQ1hSQmd3SnhHdzBmSUFZZ0FSQ0RCQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEU2tnQmlBSEtRTUFFQThnQnlBQk53TUFEQjhMSUFwQkNtb2hEU0FLTFFBSklRc2dDaWdBQlNFUElBWWdDRUVJYXlJSEtRTUFJZ0VnQ2lnQUFTSU1FSEVpRUVFQVNBMG9Ba0FnRUVVTkFDQUxCRUJCQUNFTElBWWdBVUhiQVNBQlFRQVFGQ0l0UW9DQWdJQndnMEtBZ0lDQTRBQlJEU29nTFVLQWdJQ0FjRm9FUUNBR0lBWWdMU0FNSUMxQkFCQVVFQ1loQ3dzZ0JpQXRFQThnQzBFQVNBMHFJQXNOQVFzQ1FBSkFBa0FDUUFKQUFrQUNRQ0FKUWZJQWF3NEdBQUVDQXdRRkJnc2dCaUFCSUF3Z0FVRUFFQlFpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTB2SUFZZ0J5QUJFQ0FNQlFzZ0JpQUJJQXdnQ0VFUWF5SUlLUU1BUVlDQUFoRFFBU0VKSUFZZ0J5a0RBQkFQSUFsQkFFNE5CQXd1Q3lBR0lBRWdERUVBRU5VQklnbEJBRWdOTFNBR0lBY3BBd0FRRHlBSElBbEJBRWV0UW9DQWdJQVFoRGNEQUF3REN5QUlJQVlnREJCY053TUFJQWhCQ0dvaENBd0NDeUFHSUFFZ0RDQUJRUUFRRkNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFNzZ0NDQUJOd01BSUFoQkNHb2hDQXdCQ3lBR0lBRWdEQ0FCUVFBUUZDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRTb2dCaUFIS1FNQUVBOGdCMEtBZ0lDQU1EY0RBQ0FJSUFFM0F3QWdDRUVJYWlFSUN5QU5JQTlxUVFWcklRME1Id3NnQmlBSEtRTUFFQThNSkFzZ0NFRUlheWtEQUNJdVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVORFF3RkN5QUlRUWhyS1FNQUlpNUNnSUNBZ0hDRFFvQ0FnSUFnVVEwTURBUUxJQVlnQ0VFSWF5a0RBQ0l1RUlRRVFjVUFSZzBCREFNTElBWWdDRUVJYXlrREFDSXVFSVFFUVJ0SERRSUxJQVlnTGhBUERBa0xJQWhCQ0dzcEF3QWlMa0tBZ0lDQVlJTkNnSUNBZ0NCUkRRZ0xJQVlnTGhBUElBaEJDR3RDZ0lDQWdCQTNBd0FNRndzZ0V5Z0NGQ0VISUE0Z0NUWUNCQ0FPSUFkQmYzTWdEV28yQWdBZ0JrR0lJU0FPRUVZTUlBc2dDa0VEYWlFTkRCVUxRZ0loTGd3Z0MwS0FnSUNBTUNFdURCOExRZ0FoTGd3ZUN5QUlRUWhySWdncEF3QWhBUXdlQzBISWhBRkJydndBUWFqOEFFSEtOQkFBQUFzZ0NFRUlhMEtCZ0lDQUVEY0RBQXdQQ3lBR0lBRkJBUkN0QVJvZ0JpQUJFQThnQmlBdEVBOE1HQXNnQVNFdkRBTUxRb0NBZ0lBd0lTMExJQVlnQjBFQUVCVUxRb0NBZ0lBd0lTNExJQVlnTUJBUElBWWdMUkFQSUFZZ01SQVBJQVlnTHhBUElBWWdMaEFQSUF0Q2dJQ0FnREEzQXdBZ0RFS0FnSUNBTURjREFBd1RDeUFHSUFzcEF3QVFEeUFMUW9DQWdJQXdOd01BSUFkQkFFZ05FaUFHSUM0UUQwS0FnSUNBTUNFdUN5QUlJQzQzQXdBZ0NDQUhRUUJIclVLQWdJQ0FFSVEzQXdnZ0NFRVFhaUVIREEwTElDMGhBUU5BSUFZZ0RrSGdBR29nRGtHQUFXb2dBYWRCSVJDT0FRMEJRUUFoQnlBT0tBSmdJUWtnRGlnQ2dBRWhDd05BSUFjZ0MwY0VRQ0FHSUM0Z0NTQUhRUU4wYWlJTUtBSUVRb0NBZ0lBZ0lBd29BZ0JCQUVkQkFuUVFHUm9nQjBFQmFpRUhEQUVMQ3lBR0lBa2dDeEJhSUFZZ0FSQ01BaUlCUW9DQWdJQndneUl0UW9DQWdJQWdVUTBESUMxQ2dJQ0FnT0FBVVEwQ0lBWVFlMFVOQUFzTElBWWdBUkFQQ3lBR0lDNFFEeUFQUW9DQWdJRGdBRGNEQUF3T0N5QVBJQzQzQXdBTUF3c2dEQzBBQlVFQmNRMEJDeUFHSUFkQmhaY0JFSThCREFzTElCc29BZ0FvQWhBaUNVRXdhaUVMSUFrZ0NTZ0NHQ0FIY1VGL2MwRUNkR29vQWdBaENRTkFJQWxGRFFFZ0N5QUpRUUZyUVFOMGFpSUpLQUlFSUFkR0RRSWdDU2dDQUVILy8vOGZjU0VKREFBTEFBc2dDQ0VIREFVTElBWWdCeERmQlF3SUN5QUdFQ1FNQndzZ0JpQUJFQThMSUFoQ2dJQ0FnT0FBTndNQUlBaEJDR29oQ0F3RkN5QUxJQWsyQWlRZ0N5QUVOZ0lvSUFZcEE2Z0JJaTFDSUlpblFYVlBCRUFnTGFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUFGQjBRRWdMVUVERUJrYUlBWWdBVUhPQUVLQWdJQ0FNQ0FHS1FPd0FTSXRJQzFCZ0RBUWJSb2dDQ0FCTndNQUlBaEJDR29oQnd0QkFBc2hDU0FISVFnZ0RTRUtJQWxGRFFFTEN5QUhJUWdMUVFFaEJ3d0ZDd0pBQWtBZ0Zpa0RnQUVpTGtLQWdJQ0FjRlFOQUNBdXB5SUhMd0VHUVFOSERRQWdCeWdDRUNJSFFUQnFJUW9nQnlBSEtBSVlRWDl6UVFKMFFhaCtjbW9vQWdBaEJ3SkFBMEFnQndSQUlBb2dCMEVCYTBFRGRHb2lCeWdDQkVFMVJnMENJQWNvQWdCQi8vLy9IM0VoQnd3QkN3c2dFaUFOTmdJZ0lBWWdMa0VBUVFCQkFCREtBaUFXS1FPQUFTRXVDeUF1UW9DQWdJQndWQTBBSUM2bklnY3ZBUVpCQTBjTkFDQUhMUUFGUVNCeERRRUxBMEFnSENBSUlnZFBEUUVnQmlBSFFRaHJJZ2dwQXdBaUFSQVBJQUZDZ0lDQWdIQ0RRb0NBZ0lEUUFGSU5BQ0FCcHlJS0RRVWdCaUFIUVJCcklnZ3BBd0FRRHlBR0lBZEJHR3NwQXdCQkFSQ3RBUm9NQUFzQUMwS0FnSUNBNEFBaExrS0FnSUNBNEFBaEFTQVRMUUFSUVRCeFJRMEJDeUFTSUFnMkFpd2dFaUFOTmdJZ0RBRUxJQklvQWh3Z0VrRVlha2NFUUNBV0lCSVF6d1VMQTM0Z0NDQVhUUVIrSUFFRklBWWdGeWtEQUJBUElCZEJDR29oRnd3QkN3c2hMZ3NnRmlBU0tBSUFOZ0tNQVF3Q0N5QUlJQllwQTRBQk53TUFJQlpDZ0lDQWdDQTNBNEFCSUJNb0FoUWdDbW9oQ2lBSElRaEJBQ0VIREFBTEFBc2dEa0dnQVdva0FDQXVDejhCQVg4akFFSFFBR3NpQWlRQUlBSWdBUVIvSUFBb0FoQWdBa0VRYWlBQkVKQUJCVUhRNmdBTE5nSUFJQUJCdi9VQUlBSVF4Z0lnQWtIUUFHb2tBQXVvQVFBQ1FDQUJRWUFJVGdSQUlBQkVBQUFBQUFBQTRIK2lJUUFnQVVIL0Qwa0VRQ0FCUWY4SGF5RUJEQUlMSUFCRUFBQUFBQUFBNEgraUlRQkIvUmNnQVNBQlFmMFhUaHRCL2c5cklRRU1BUXNnQVVHQmVFb05BQ0FBUkFBQUFBQUFBR0FEb2lFQUlBRkJ1SEJMQkVBZ0FVSEpCMm9oQVF3QkN5QUFSQUFBQUFBQUFHQURvaUVBUWZCb0lBRWdBVUh3YUV3YlFaSVBhaUVCQ3lBQUlBRkIvd2RxclVJMGhyK2lDM1VCQTM4Q1FBSkFJQUZDZ0lDQWdIQmFCRUFnQWFjaUF5OEJCaUlFUVFwcklnVkJHazFCQUVFQklBVjBRWUdBZ0N4eEd5QUVRUVJyUVFSSmNnMEJDeUFBSUFJUUR5QUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBRUhINUFCQkFCQVZEd3NnQUNBREtRTWdFQThnQXlBQ053TWdDd3NiQUNBQUlBRkIvd0Z4RUJFZ0FDQUNJQUFvQWdSclFRUnJFQjBMamdFQkFuOGpBRUVRYXlJQ0pBQUNmeUFCQkVBZ0FFRWdhaUFBSUFCQndRQnJRUnBKR3lBQVFmOEFUUTBCR2lBQ1FRUnFJQUJCQWhDeUF4b2dBaWdDQkF3QkN5QUFRU0JySUFBZ0FFSGhBR3RCR2trYklBQkIvd0JORFFBYUlBSkJCR29nQUVFQUVMSURJUUVnQWlnQ0JDSURJQUFnQTBIL0FFc2JJQUFnQVVFQlJoc0xJUUFnQWtFUWFpUUFJQUFMUndJQmZnRi9JQUFwQThBQklRUWdBVUlnaUtkQmRVOEVRQ0FCcHlJRklBVW9BZ0JCQVdvMkFnQUxJQUFnQkNBQ0lBRkJBeER2QVJvZ0FDQUJJQU1RK3dVZ0FDQUJFQThMaUFnQ0JYOEJmaU1BUVJCcklnTWtBQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUFLQUlRSWdKQnl3QnFEZ01FQVFNQUN5QUNRZXNBYWtFQ1NRMEJBa0FnQWtFcmF3NERBUVlCQUFzZ0FrRmFSZzBFSUFKQi9nQkdEUUFnQWtFaFJ3MEZDMEYvSVFRZ0FCQVNEUWtnQUVFUUVOOEJEUWtDUUFKQUFrQUNRQUpBQWtBZ0FrRXJhdzREQWdVQkFBc2dBa0cyZjBZTkF5QUNRU0ZHRFFJZ0FrSCtBRWNOQkNBQVFaVUJFQkFNRFFzZ0FFR01BUkFRREF3TElBQkJqUUVRRUF3TEN5QUFRWllCRUJBTUNnc2dBRUVPRUJBZ0FFRUdFQkFNQ1FzUUFRQUxJQUFRRWcwRklBQkJBQkRmQVEwRklBQWdBMEVNYWlBRFFRaHFJQU1nQTBFRWFrRUFRUUVnQWhDMUFRMEZJQUFnQWtFSGEwSC9BWEVRRUNBQUlBTW9BZ3dnQXlnQ0NDQURLQUlBSUFNb0FnUkJBa0VBRU1FQkRBUUxRWDhoQkNBQUVCSU5CeUFBUVJBUTN3RU5CMEVBSVFRQ1FDQUFLQUpBSWdFb0FwZ0NJZ0pCQUVnTkFDQUJLQUtBQWlBQ2FpSUJMUUFBUWJnQlJ3MEFJQUZCdHdFNkFBQUxJQUJCbHdFUUVBd0hDeUFBUVVCcktBSUFJUUZCZnlFRUlBQVFFZzBHSUFCQkVCRGZBUTBHUVFBaEJBSkFJQUVvQXBnQ0lnSkJBRWdOQUFKQUFrQUNRQUpBQWtBQ1FDQUJLQUtBQWlBQ2FpSUZMUUFBSWdaQnh3QnJEZ1FCQmdZRkFBc2dCa0crQVVZTkF5QUdRYmdCUmcwQ0lBWkJ3UUJIRFFVZ0JTZ0FBU0VGUVg4aEJDQUJRWDgyQXBnQ0lBRWdBallDaEFJZ0FDQUFLQUlBSUFVUVhDSUhRUUVRdEFFaEFTQUFLQUlBSUFjUUR5QUFLQUlBSUFVUUV5QUJSUTBCREF3TElBRkJmellDbUFJZ0FTQUNOZ0tFQWdzZ0FFR1lBUkFRREFrTElBVW9BQUVpQWtFSVJpQUNRZkVBUm5JTkFpQUJMUUJ1UVFGeEJFQWdBRUdWN0FCQkFCQVdEQWNMSUFWQnVnRTZBQUFNQ0FzZ0FFSDc5QUJCQUJBV0RBVUxJQUJCTUJBUUlBQkJBQkFhSUFCQlFHc29BZ0JCQXhCa0RBY0xJQUJCRGhBUUlBQkJDaEFRREFZTElBQW9Ba0FpQVMwQWJFRUNjVVVFUUNBQVFmN3dBRUVBRUJZTUF3c2dBU2dDWkVVRVFDQUFRWkROQUVFQUVCWU1Bd3RCZnlFRUlBQVFFZzBGSUFCQkVCRGZBUTBGSUFCQml3RVFFQXdFQzBGL0lRUWdBQ0FCUVFSeFFRSnlFTHNERFFRZ0FDZ0NNQTBBSUFBb0FoQWlBa0hyQUdwQkFVc05BQ0FBSUFOQkRHb2dBMEVJYWlBRElBTkJCR3BCQUVFQklBSVF0UUVOQkNBQUlBSkJCV3RCL3dGeEVCQWdBQ0FES0FJTUlBTW9BZ2dnQXlnQ0FDQURLQUlFUVFOQkFCREJBU0FBRUJJTkJBdEJBQ0VFSUFGQkdIRkZEUU1nQUNnQ0VFRitjVUdrZjBjTkF5QUJRUkJ4UlEwQklBQW9Ba0F0QUc1QkJIRU5BU0FBS0FJQVFhK1lBVUVBRUlBQ0MwRi9JUVFNQWd0QmZ5RUVJQUFRRWcwQklBQkJDQkRmQVEwQklBQkJud0VRRUF0QkFDRUVDeUFEUVJCcUpBQWdCQXRnQUNBRVFmSUFJQU5CeGdCcklBTkJ0d0ZHRzBIL0FYRVFFU0FFSUFBZ0FoQVlFQjBnQlNBQklBVW9BZ0FReUFNaUFEWUNBQ0FFSUFBUUhTQUVJQVpCL3dGeEVCRWdBU0FGS0FJQVFRRVFhUm9nQVNBQktBTFFBa0VCYWpZQzBBSUw4aXNCRVg4akFFR1FBV3NpQXlRQUlBQW9BZ0FoRGdKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FBS0FJUUlnUkJnMzlIRFFBZ0FDZ0NLQTBDSUFBb0FqaEJBQkNEQVVFNlJ3MEJJQTRnQUNnQ0lCQVlJUWtnQUVGQWF5Z0NBRUd3QW1vaEFnSkFBMEFnQWlnQ0FDSUNSUTBCSUFJb0FnUWdDVWNOQUFzZ0FFR3Y1d0JCQUJBV0RCc0xJQUFRRWcwYUlBQkJPaEFzRFJvZ0FDZ0NFQ0lFUWNVQWFrRURTUTBBSUFCQlFHc2lCU2dDQUJBeUlRY2dBeUFGS0FJQUlnUW9BckFDTmdKUUlBUWdBMEhRQUdvMkFyQUNJQU5CZnpZQ1pDQURRdi8vLy84UE53SmNJQU1nQnpZQ1dDQURJQWsyQWxRZ0F5QUVLQUs4QVRZQ2FFRUFJUUlnQTBFQU5nSnNJQUFnQVVFZWRFRWZkVUVBUVFNZ0JDMEFia0VCY1J0eEVPRUJEUm9nQUNBSEVCNGdCU2dDQUNJQUlBQW9BckFDS0FJQU5nS3dBZ3djQ3dKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFSQjBBQnFEaVFERkFFbEZCUVVGQlFVRkFVRUJnY0hDQlFVQWdrVUZBd1NDeEVrRXhNVEZCUVVGQ1FBQ3lBRVFZTi9SZzBNSUFSQk8wWU5DU0FFUWZzQVJ3MFRJQUFRNGdJTkpRd21DeUFBS0FKQUtBSWdCRUFnQUVHcXpBQkJBQkFXRENVTElBQVFFZzBrUVFBaEFpQUFBbjlCQUNBQUtBSVFJZ1JCTzBZTkFCcEJBQ0FFUWYwQVJnMEFHa0VBSUFBb0FqQU5BQm9nQUJDUkFRMGxRUUVMRU9VQ0lBQVF0d0VOSkF3bUN5QUFFQklOSXlBQUtBSXdCRUFnQUVISklVRUFFQllNSkFzZ0FCQ1JBUTBqSUFCQkx4QVFJQUFRdHdGRkRTUU1Jd3NnQUJBU0RTSWdBQkNBQVJvZ0FCREFBU0FBRVBJQkRTSWdBRUhwQUVGL0VCd2hBU0FBSUFBb0FrQXRBRzVCQVhGRklnSVE0UUVOSWdKQUlBQW9BaEJCc1g5SEJFQWdBU0VFREFFTElBQkI2d0JCZnhBY0lRUWdBQkFTRFNNZ0FDQUJFQjRnQUNBQ0VPRUJEU01MSUFBZ0JCQWVEQjhMSUFCQlFHc2lCQ2dDQUJBeUlRRWdCQ2dDQUJBeUlRSWdBeUFFS0FJQUlnUW9BckFDTmdKUUlBUWdBMEhRQUdvMkFyQUNJQU5DZ0lDQWdIQTNBbUFnQXlBQk5nSmNJQU1nQWpZQ1dDQURJQWsyQWxRZ0JDZ0N2QUVoQkNBRFFRQTJBbXdnQXlBRU5nSm9JQUFRRWcwaElBQVF3QUVnQUNBQkVCNGdBQkR5QVEwaElBQkI2UUFnQWhBY0dpQUFFS0FDRFNFZ0FFSHJBQ0FCRUJ3YUlBQWdBaEFlSUFCQlFHc29BZ0FpQUNBQUtBS3dBaWdDQURZQ3NBSU1JZ3NnQUVGQWF5SUJLQUlBRURJaEFpQUJLQUlBRURJaEJDQUJLQUlBRURJaEJTQURJQUVvQWdBaUFTZ0NzQUkyQWxBZ0FTQURRZEFBYWpZQ3NBSWdBMEtBZ0lDQWNEY0NZQ0FESUFJMkFsd2dBeUFFTmdKWUlBTWdDVFlDVkNBQktBSzhBU0VCSUFOQkFEWUNiQ0FESUFFMkFtZ2dBQkFTRFNBZ0FDQUZFQjRnQUJEQUFTQUFFS0FDRFNBZ0FDQUNFQjRnQUVHOGZ4QXNEU0FnQUJEeUFRMGdJQUFvQWhCQk8wWUVRQ0FBRUJJTklRc2dBRUhxQUNBRkVCd2FJQUFnQkJBZUlBQkJRR3NvQWdBaUFDQUFLQUt3QWlnQ0FEWUNzQUlNSVFzZ0FCQVNEUjhnQUJEQUFTQURRUUEyQWhnQ1FDQUFLQUlRSWdKQldrY0VRRUVCSVFFZ0FrRW9SdzBCSUFBZ0EwRVlha0VBRUo0Qkdnd0JDeUFBS0FKQUxRQnNRUUp4UlFSQUlBQkJtVFpCQUJBV0RDRUxJQUFRRWcwZ1FRQWhBUXNnQUVFb0VDd05IMEVCSVFRZ0F5MEFHRUVCY1VVRVFDQUFLQUlBSVFvZ0FFRkFheUlDS0FJQUlnZ29BcndCSVE4Z0NCQXlJUWNnQWlnQ0FCQXlJUkFnQWlnQ0FCQXlJUkVnQWlnQ0FCQXlJUklnQUJDQUFSb2dBeUFDS0FJQUlnVW9BckFDTmdKUUlBVWdBMEhRQUdvMkFyQUNJQU5CQURZQ2JDQURRb0dBZ0lCd053SmdJQU1nQnpZQ1hDQURJQkUyQWxnZ0F5QUpOZ0pVSUFNZ0R6WUNhQ0FBUWVzQVFYOFFIQ0VNSUFJb0FnQW9Bb1FDSVFzZ0FDQVNFQjRnQUNnQ0VDRUNRVk1oQlFKQUFrQUNRQUpBSUFCQkJCQzlBdzRDQUFFa0N5QUNRVXRHSVEwZ0FrRlRSaUVFSUFRZ0FrR3pmMFp5UlNBQ1FVdEhjUTBCSUFJaEJRc2dBQkFTRFNJZ0FDZ0NFQ0lDUWZzQVJpQUNRZHNBUm5JTkVnSkFJQUpCZzM5R0JFQWdBQ2dDS0VVTkFRc2dBRUhKOXdCQkFCQVdEQ01MSUFvZ0FDZ0NJQkFZSVFZZ0FCQVNCRUFnQUNnQ0FDQUdFQk1NSXdzZ0FDQUdJQVVRb1FJRVFDQUFLQUlBSUFZUUV3d2pDeUFBUWIwQlFiMEJRYmtCSUFRYklBMGJFQkFnQUNBR0VCb2dBRUZBYXlnQ0FDQUlMd0c4QVJBWERBRUxBa0FDUUNBQUtBSVFRU0J5UWZzQVJ3MEFJQUFnQTBGQWEwRUFFSjRCSWdSQlcwY2dCRUc1ZjBkeERRQWdBRUVBUVFCQkFTQURLQUpBUVFKeFFRRVF3Z0ZCQUU0TkFRd2pDeUFBRUtNQ0RTSWdBQ0FEUWNnQWFpQURRY1FBYWlBRFFjd0FhaUFEUVR4cVFRQkJBRUc5ZnhDMUFRMGlJQUFnQXlnQ1NDQURLQUpFSUFNb0Frd2dBeWdDUEVFRVFRQVF3UUVMSUFJaEJRdEJBQ0VDREJ3TElBQkJRR3NvQWdBb0Fyd0JJUVlnQUJDQUFSb2dBQ2dDRUNJQlFUdEdEUnBCVXlFRUFrQWdBRUVFRUwwRERnSUFHU0FMSUFGQnMzOUdJQUZCVTBaeURSY2dBU0lFUVV0R0RSZ2dBRUVBRU5rRURSOGdBRUVPRUJBTUdRc2dBQkFTRFI0Q1FDQUFLQUl3RFFBZ0FDZ0NFRUdEZjBjTkFDQUFLQUlvRFFBZ0FDZ0NJQ0VIQ3lBQUtBSkFJZ0pCc0FKcUlRRWdBaWdDdkFFaEJTQUVRYjUvUmlFR0FrQURRQ0FCS0FJQUlnRUVRQ0FBSUFVZ0FTZ0NHQkNmQWlBQktBSVlJUVVDUUNBR1JRUkFJQUVvQWd3aUFrRi9SZzBCSUFkRkRRUWdBU2dDQkNBSFJ3MEJEQmtMSUFFb0FnZ2lBa0YvUmcwQUlBZEZEUU1nQVNnQ0JDQUhSZzBZQ3lBQktBSWNCSDhnQUVHREFSQVFRUU1GUVFBTElRSURRQ0FDSUFFb0FoQk9SUVJBSUFCQkRoQVFJQUpCQVdvaEFnd0JDd3NnQVNnQ0ZFRi9SZzBCSUFCQkJoQVFJQUJCN1FBZ0FTZ0NGQkFjR2lBQVFRNFFFQXdCQ3dzZ0IwVUVRQ0FFUWI1L1JnMFBJQUJCMDhrQVFRQVFGZ3dnQ3lBQVFjRHlBRUVBRUJZTUh3c2dBRUhyQUNBQ0VCd2FEQlVMSUFBUUVnMGRJQUFRd0FFZ0FCRHlBUTBkSUFBUWdBRWFJQUJCUUdzaUJDZ0NBQkF5SVFVZ0F5QUVLQUlBSWdJb0FyQUNOZ0pRSUFJZ0EwSFFBR28yQXJBQ1FYOGhBU0FEUVg4MkFtUWdBMEwvLy8vL0h6Y0NYQ0FESUFVMkFsZ2dBeUFKTmdKVUlBSW9BcndCSVFJZ0EwRUFOZ0pzSUFNZ0FqWUNhQ0FBUWZzQUVDd05IVUYvSVFjRFFBSkFBa0FDUUNBQUtBSVFJZ0pCUDJvT0FnQUJBZ3NnQVVFQVNBUi9RWDhGSUFCQjZ3QkJmeEFjQ3lFQ0lBQWdBUkFlQTBBZ0FCQVNEU0VnQUVFUkVCQWdBQkNSQVEwaElBQkJPaEFzRFNFZ0FFR3JBUkFRSUFBb0FoQkJRVVlFUUNBQVFlb0FJQUlRSENFQ0RBRUxDeUFBUWVrQVFYOFFIQ0VCSUFBZ0FoQWVEQUlMSUFBUUVnMGZJQUJCT2hBc0RSOGdCMEVBVGdSQVFaZ3RJUUlNRlFzZ0FVRUFTQVJBSUFCQjZ3QkJmeEFjSVFFTElBQkJ0Z0VRRUNBRUtBSUFRUUFRT1NBRUtBSUFLQUtFQWtFRWF5RUhEQUVMSUFKQi9RQkhCRUFnQVVFQVNBUkFRZThzSVFJTUZRc2dBRUVIRU9FQlJRMEJEQjhMQ3lBQVFmMEFFQ3dOSFFKQUlBZEJBRTRFUUNBQVFVQnJLQUlBSWdJb0FvQUNJQWRxSUFFMkFBQWdBaWdDcEFJZ0FVRVViR29nQjBFRWFqWUNCQXdCQ3lBQUlBRVFIZ3NnQUNBRkVCNGdBRUVPRUJBZ0FFRkFheWdDQUNJQklBRW9BckFDS0FJQU5nS3dBZ3dhQ3lBQUVNQUJJQUFRRWcwY0lBQkJRR3NpQkNnQ0FCQXlJUVVnQkNnQ0FCQXlJUUVnQkNnQ0FCQXlJUUlnQkNnQ0FCQXlJUWNnQUVIc0FDQUZFQndhSUFNZ0JDZ0NBQ0lHS0FLd0FqWUNVQ0FHSUFOQjBBQnFOZ0t3QWlBRFF2Ly8vLzhmTndKY0lBTkNnSUNBZ0hBM0FsUWdCaWdDdkFFaEJpQURRUUEyQW13Z0F5QUdOZ0pvSUFNZ0FqWUNaQ0FBRU9JQ0RSd2dCQ2dDQUNJRUlBUW9BckFDS0FJQU5nS3dBaUFFRU9ZQ0JFQWdBRUVPRUJBZ0FFRUdFQkFnQUVIdEFDQUNFQndhSUFCQkRoQVFJQUJCNndBZ0J4QWNHZ3NDUUFKQUFrQWdBQ2dDRUVFN2FnNENBQk1CQ3lBQUVCSU5IaUFBRUlBQkdpQUFJQVVRSGlBQUtBSVFRZnNBUmdSQUlBQkJEaEFRREJJTElBQkJLQkFzRFI0Z0FDZ0NFQ0lFUWZzQVJpQUVRZHNBUm5JTkFRSkFJQVJCZzM5R0JFQWdBQ2dDS0VVTkFRc2dBRUhlOWdCQkFCQVdEQjhMSUE0Z0FDZ0NJQkFZSVFRQ1FDQUFFQkpGQkVBZ0FDQUVRVVVRb1FKQkFFNE5BUXNnRGlBRUVCTU1Id3NnQUVHNUFSQVFJQUJCUUdzaUJTZ0NBQ0FFRURrZ0JTZ0NBQ0lFSUFRdkFid0JFQmNNRUFzZ0FFSGdIVUVBRUJZTUhRc2dBRUZUUVFCQkFVRi9RUUVRd2dGQkFFNE5EZ3djQ3lBQUVCSkZEUndNR3dzZ0FFRkFheWdDQUMwQWJrRUJjUVJBSUFCQm9OZ0FRUUFRRmd3YkN5QUFFQklOR2lBQUVQSUJEUm9nQUJDQUFSb2dBQ0FBUVVCcklnRW9BZ0JCMUFCQkFCQ2dBU0lDUVFCSURSb2dBRUh2QUJBUUlBQkIyUUFRRUNBQktBSUFJQUpCLy84RGNSQVhJQUFRd0FFZ0FCQ2dBZzBhREJjTElBRkJBWEZGRFFNZ0FVRUVjUTBLSUFBb0FqaEJBQkNEQVVFcVJnMEREQW9MSUFBb0FpaEZEUUVMSUFBUTRnRU1Gd3RCVXlFRUFrQWdBQ0FCRUwwRERnSUFGUmNMSUFCQmhRRVFTa1VOQkNBQUtBSTRRUUVRZ3dGQlIwY05CQ0FCUVFSeERRY0xJQUJCbXlOQkFCQVdEQlVMSUFGQkJIRkZCRUFnQUVIZklrRUFFQllNRlF0QmZ5RUJRUUFoQWlBQVFRQkJBQkR0QWtVTkZnd1hDeUFBRUJJTkV5QUFFTGNCUlEwVURCTUxJQU1nQUNnQ0FDZ0NFQ0FEUWRBQWFpQUFLQUlnRUpBQk5nSVFJQUJCZ0QwZ0EwRVFhaEFXREJJTElBQVFrUUVORVFKQUlBQkJRR3NpQVNnQ0FDZ0NwQUZCQUU0RVFDQUFRZGtBRUJBZ0FTZ0NBQ0lCSUFFdkFhUUJFQmNNQVFzZ0FFRU9FQkFMSUFBUXR3RkZEUklNRVFzZ0FFSHIyUUJCQUJBV0RCQUxRUUVoQWlBQUlBVkJBRUVCUVg5QkFCRENBVUVBVGcwTERBOExRUUFoQWlBQVFRRkJBQ0FBS0FJWUlBQW9BaFFReEFFTkRnd1FDeUFBUVNrUUxBME5DeUFBUWV3QUlBRVFIQm9nQUJDQUFSb2dBeUFBUVVCcklnUW9BZ0FpQlNnQ3NBSTJBbEFnQlNBRFFkQUFhallDc0FJZ0EwTC8vLy8vSHpjQ1hDQURRb0NBZ0lCd053SlVJQVVvQXJ3QklRVWdBMEVBTmdKc0lBTWdCVFlDYUNBRElBSTJBbVFnQUJEaUFnME1JQVFvQWdBaUJTQUZLQUt3QWlnQ0FEWUNzQUlnQUJEekFTQUFFUE1CSUFRb0FnQVE1Z0lFUUNBQVFRNFFFQ0FBUVFZUUVDQUFRZTBBSUFJUUhCb2dBRUVPRUJBZ0FFSHJBQ0FIRUJ3YUN5QUJJUVVMSUFBZ0JSQWVJQUJCN1FBZ0FoQWNHaUFBUVM4UUVDQUFJQUlRSGlBQUtBSVFRVVpHQkVBZ0FCQVNEUXdnQXlBQVFVQnJLQUlBSWdJb0FyQUNOZ0pRSUFJZ0EwSFFBR28yQXJBQ0lBTkJmellDWkNBRFF2Ly8vLzh2TndKY0lBTkNnSUNBZ0hBM0FsUWdBaWdDdkFFaEJFRUFJUUVnQTBFQU5nSnNJQU1nQkRZQ2FDQUNLQUtrQVVFQVRnUkFJQUFvQWdBZ0FrSFJBQkJQSWdGQkFFZ05EU0FBUWRnQUVCQWdBRUZBYXlJQ0tBSUFJZ1FnQkM4QnBBRVFGeUFBUWRrQUVCQWdBaWdDQUNBQlFmLy9BM0VRRnlBQUVNQUJDeUFBRU9JQ0RRd2dBRUZBYXlJRUtBSUFJZ0lvQXFRQlFRQk9CRUFnQUVIWUFCQVFJQVFvQWdBZ0FVSC8vd054RUJjZ0FFSFpBQkFRSUFRb0FnQWlBU0FCTHdHa0FSQVhJQVFvQWdBaEFnc2dBaUFDS0FLd0FpZ0NBRFlDc0FJTElBQkI3Z0FRRUNBQUlBY1FIZ3dNQ3lBQUlBSkJBQkFXREFvTElBQkI2d0FnQWhBY0dpQUFFQklOQ1FzZ0FCQzNBVVVOQ1F3SUN5QUJJUVFMSUFBUUVnMEdJQUJCQUNBRVFRQVF6QU1OQmdzZ0FDQUFRVUJyS0FJQUtBSzhBU0FHRUo4Q0N5QUFRVHNRTEEwRUlBQkJRR3NpQWlnQ0FCQXlJUVVnQWlnQ0FCQXlJUVFnQWlnQ0FCQXlJUUVnQWlnQ0FCQXlJUWNnQXlBQ0tBSUFJZ0lvQXJBQ05nSWNJQUlnQTBFY2FqWUNzQUlnQTBLQWdJQ0FjRGNDTENBRElBUTJBaWdnQXlBSE5nSWtJQU1nQ1RZQ0lDQUNLQUs4QVNFQ0lBTkJBRFlDT0NBRElBSTJBalFnQVNFQ0lBQW9BaEJCTzBjRVFDQUFJQVVRSGlBQUVKRUJEUVVnQUVIcEFDQUhFQndhSUFVaEFnc2dBRUU3RUN3TkJBSkFJQUFvQWhCQktVWUVRQ0FESUFJMkFpaEJBQ0VGSUFJaEJBd0JDeUFBUWVzQUlBRVFIQm9nQUVGQWF5Z0NBQ2dDaEFJaEJTQUFJQVFRSGlBQUVKRUJEUVVnQUVFT0VCQWdBU0FDUmcwQUlBQkI2d0FnQWhBY0dnc2dBRUVwRUN3TkJDQUFRVUJySWdnb0FnQW9Bb1FDSVFzZ0FDQUJFQjRnQUJDZ0FnMEVJQUFnQ0NnQ0FDZ0N2QUVnQmhDZkFnSkFJQUVnQWtZZ0FpQUVSbkpGQkVBZ0FFRkFheUlHS0FJQUlnRkJnQUpxSWdnZ0FTZ0NoQUlpQ2lBTElBVnJJZ0pxRU1ZQkdpQUlJQUVvQW9BQ0lBVnFJQUlRY2lBQktBS0FBaUFGYWtHekFTQUNFQ3NhSUFZb0FnQWlBaUFCS0FLRUFrRUZhellDbUFJZ0JDQUNLQUtzQWlJQklBRWdCRWdiSVFZZ0NpQUZheUVJQTBBZ0JDQUdSZzBDSUFJb0FxUUNJQVJCRkd4cUlnb29BZ1FpQVNBRlNDQUJJQXRPY2tVRVFDQUtJQUVnQ0dvMkFnUUxJQVJCQVdvaEJBd0FDd0FMSUFCQjZ3QWdCQkFjR2dzZ0FDQUhFQjRnQUVGQWF5Z0NBQ0lCSUFFb0FyQUNLQUlBTmdLd0Fnd0JDeUFBUWVzQUlCQVFIQm9nQUVGQWF5Z0NBQ2dDaEFJaERTQUFJQXdRSGdKQUlBQW9BaEFpREVFOVJ3MEFBa0FnQUJBU1JRUkFJQUJCQUJDMkFVVU5BUXNnQ2lBR0VCTU1CUXNnQmtVTkFDQUFRYmtCRUJBZ0FDQUdFQm9nQUVGQWF5Z0NBQ0FJTHdHOEFSQVhDeUFLSUFZUUV3SkFBa0FDUUNBQVFjTUFFRW9pQkFSQUlBTkJBVFlDYkNBRElBTW9BbUJCQW1vMkFtQkJxZDBBSVFZZ0RFRTlSZzBCREFNTElBQW9BaEJCdVg5SERRRWdBVVVFUUNBQVFmYVhBVUVBRUJZTUJ3c2dERUU5UncwQ1FjVFFBQ0VHSUFWQnMzOUhEUUFnQ0MwQWJrRUJjVVVnQWtGL2MzRU5BZ3NnQXlBR05nSUFJQUJCL2NBQUlBTVFGZ3dGQ3lBQVFkWE9BRUVBRUJZTUJBc2dBQkFTRFFNQ1FDQUVCRUFnQUJCV1JRMEJEQVVMSUFBUWtRRU5CQXNnQUNBQVFVQnJJZ1VvQWdBb0Fyd0JJQThRbndJZ0FFSDlBRUgrQUNBQkcwSDhBQ0FFR3hBUUlBQkI2d0FnQnhBY0dpQUFRU2tRTEEwRElBVW9BZ0FpQWtHQUFtb2lDQ0FDS0FLRUFpSUtJQTBnQzJzaUJtb1F4Z0VhSUFnZ0FpZ0NnQUlnQzJvZ0JoQnlJQUlvQW9BQ0lBdHFRYk1CSUFZUUt4b2dCU2dDQUNJRklBSW9Bb1FDUVFWck5nS1lBaUFISUFVb0Fxd0NJZ0lnQWlBSFNCc2hDQ0FLSUF0cklRb2dCeUVDQTBBZ0FpQUlSd1JBSUFVb0FxUUNJQUpCRkd4cUlnd29BZ1FpQmlBTFNDQUdJQTFPY2tVRVFDQU1JQVlnQ21vMkFnUUxJQUpCQVdvaEFnd0JDd3NnQUNBUUVCNGdBQkNnQWcwRElBQWdBRUZBYXlnQ0FDZ0N2QUVnRHhDZkFpQUFJQWNRSGdKL0lBUUVRQ0FCUlFSQUlBQkJGQkFRSUFCQkRoQVFJQUJCSkJBUUlBQkJRR3NvQWdCQkFCQVhJQUJCaXdFUUVDQUFRWUlCRUJCQmd3RU1BZ3NnQUVHQUFSQVFJQUJCUUdzb0FnQkJBQkJrUVlNQkRBRUxJQUJCL3dBUUVFRU9DeUVDSUFCQjZRQWdFaEFjR2lBQVFRNFFFQ0FBSUJFUUhpQUFJQUlRRUNBQVFVQnJLQUlBSWdFZ0FTZ0NzQUlvQWdBMkFyQUNDeUFBRVBNQkRBTUxJQUZCQkhFTkFDQUFRZG9qUVFBUUZnd0JDeUFBRUJJTkFFRUFJUUlnQUVFQklBUkJBQkRNQXcwQUlBQVF0d0ZGRFFJTFFYOGhBZ3dCQzBFQUlRSUxJQTRnQ1JBVElBSWhBUXNnQTBHUUFXb2tBQ0FCQ3pvQkFYOGpBRUhRQUdzaUFTUUFJQUVnQUNnQ0FDZ0NFQ0FCUVJCcUlBQW9BaUFRa0FFMkFnQWdBRUdzeFFBZ0FSQVdJQUZCMEFCcUpBQUxqZ0lCQVg0Q1FBSkFBa0FDUUNBQlF2Ly8vLzl2V0EwQUlBQWdBVUU4SUFGQkFCQVVJZ0ZDZ0lDQWdIQ0RJZ05DZ0lDQWdPQUFVUVJBSUFFUEN5QURRb0NBZ0lBd1VRUkFJQUpDSUlpblFYVkpEUU1NQkFzZ0FVTC8vLy8vYjFnRVFDQUFJQUVRRHd3QkN5QUFJQUZCMmdFZ0FVRUFFQlFoQXlBQUlBRVFEd0pBQWtBZ0EwS0FnSUNBY0lNaUFVS0FnSUNBSUZJRVFDQUJRb0NBZ0lEZ0FGRU5BaUFCUW9DQWdJQXdVZzBCQ3lBQ1FpQ0lwMEYxU1EwRURBVUxJQU5DZ0lDQWdIQmFCRUFnQTZjdEFBVkJFSEVOQVFzZ0FDQURFQThnQUVHaVBrRUFFQlVNQWdzZ0F3OExJQUFRSkF0Q2dJQ0FnT0FBSVFJTElBSVBDeUFDcHlJQUlBQW9BZ0JCQVdvMkFnQWdBZ3NTQUNBQUlBRWdBaUFESUFSQnh3QVFwQVFMRFFBZ0FDQUJJQUpCQUJDVkJBdnNCQU1DZmdGOEEzOGpBRUVRYXlJSEpBQUNRQUpBQWtBQ1FBSitBa0FDUUFKQUFrQWdBVUVJYXlJR0tRTUFJZ1JDSUlpblFRZHJRVzVKRFFBQ1FDQUVRb0NBZ0lCd1ZBMEFJQUFnQjBFSWFpQUVJQUlRd2dVaUFVRUFTQVJBUVg4aEFRd0tDeUFCUlEwQUlBQWdCQkFQUVFBaEFTQUhLUU1JSVFNTUNBdEJmeUVCUW9DQWdJQXdJUU1nQUNBRUVHd2lCRUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEhBa0FDUUFKQUFrQWdCRUlnaUtjaUNFRUxhZzREQXdFQ0FBc2dDQTBESUFURUlRTUNRQUpBQWtBZ0FrR01BV3NPQkFBQ0FRRUhDeUFFUWlDR1VBUkFRUUFoQVVLQWdJQ0F3UDcvQXlFRERBMExRZ0FnQTMwaEF3d0JDeUFESUFKQkFYUkJuUUpyckh3aEF3c2dBMEwvLy8vL0Q0TWdBMEtBZ0lDQUNIeEMvLy8vL3c5WURRY2FRb0NBZ0lEQWZpQUR1YjBpQTBLQWdJQ0F3SUdBL1A4QWZTQURRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3d0hDeUFBS0FJUUlRRU1Cd3NnQUNBR0lBSWdCQ0FBS0FJUUtBSzRBaEViQUVVTkJ3d0lDeUFBSUFZZ0FpQUVJQUFvQWhBb0F0UUNFUnNBRFFjTUJnc2dBQ2dDRUNJQktBS01BU0lJQkVBZ0NDMEFLRUVFY1EwRkN5QUVRb0NBZ0lEQWdZRDgvd0I4dnlFRkFrQWdBa0dNQVdzT0JBQURBZ0lCQ3lBRm1pRUZEQUlMRUFFQUN5QUNRUUYwUVowQ2E3Y2dCYUFoQlF0Q2dJQ0FnTUIrSUFXOUlnTkNnSUNBZ01DQmdQei9BSDBnQTBMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMSVFOQkFDRUJEQUlMSUFBZ0JpQUNJQVFnQVNnQ25BSVJHd0JGRFFCQmZ5RUJRb0NBZ0lBd0lRTU1BUXRCQUNFQkRBRUxJQVlnQXpjREFBc2dCMEVRYWlRQUlBRUxuZ01DQTM0QmZ3SkFBa0FnQWdSQUlBQWdBVUhjQVNBQlFRQVFGQ0lEUW9DQWdJQndneUlFUW9DQWdJQWdVZ1JBSUFSQ2dJQ0FnT0FBVVEwRElBUkNnSUNBZ0RCU0RRSUxJQUFnQVVIUkFTQUJRUUFRRkNJRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJZ0FDQUJJQU1RK2dNaEJDQUFJQU1RRHlBRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0JBOExRb0NBZ0lEZ0FDRURBa0FnQUNBRVFlb0FJQVJCQUJBVUlnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFRVGNRZGlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUZFQThNQVFzZ0FFRVFFRjhpQWtVRVFDQUFJQUVRRHlBQUlBVVFEd3dCQ3lBRVFpQ0lwMEYxVHdSQUlBU25JZ1lnQmlnQ0FFRUJhallDQUFzZ0FpQUZOd01JSUFJZ0JEY0RBQ0FCUW9DQWdJQndXZ1JBSUFHbklBSTJBaUFMSUFFaEF3c2dBQ0FFRUE4Z0F3OExJQUFnQVVIUkFTQUJRUUFRRkNJRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFTElBQWdBeEE0UlFSQUlBQWdBeEFQSUFCQi91a0FRUUFRRlVLQWdJQ0E0QUFQQ3lBQUlBRWdBeEQ2QXlFQklBQWdBeEFQSUFFaEF3c2dBd3YvQWdJRGZ3SitJd0JCRUdzaUF5UUFBa0FDUUNBQlFvQ0FnSUJ3V2dSQUlBR25JZ0l2QVFaQk1FWUVRQUpBSUFBZ0EwRUlhaUFCUWQ4QUVJRUJJZ0pGRFFBZ0F5a0RDQ0lCUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FBSUFJcEF3QVE2QUVoQVF3RkN5QUFJQUVnQWlrRENFRUJJQUlRTHlJRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFNQ1FBSkFJQVZDSUlpblFRRnFEZ1FBQVFFQUFRc2dBQ0FDS1FNQUVKa0JJZ1JCQUVnRVFDQUFJQVVRRHd3Q0N5QUVEUVJDZ0lDQWdPQUFJUUVnQUNBQ0tRTUFFT2dCSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUlBVVFEd3dHQ3lBQUlBWVFEeUFHcHlBRnAwWU5CQXNnQUNBRkVBOGdBRUdFNUFCQkFCQVZDMEtBZ0lDQTRBQWhBUXdEQ3lBQ0tBSVFLQUlzSWdCRkJFQkNnSUNBZ0NBaEFRd0RDeUFBSUFBb0FnQkJBV28yQWdBZ0FLMUNnSUNBZ0hDRUlRRU1BZ3NnQUNBQkVJMEVJZ0ZDSUlpblFYVkpEUUVnQWFjaUFDQUFLQUlBUVFGcU5nSUFEQUVMSUFVaEFRc2dBMEVRYWlRQUlBRUxDd0FnQUVHTklrRUFFRVlMR2dBZ0FDZ0NFQ0FCSUFJUTd3UWlBVVVFUUNBQUVId0xJQUVMZ0FFQkFuOENRQUpBSUFGRkRRQWdBU2dDQUNJQ1FRQk1EUUVnQVNBQ1FRRnJJZ0kyQWdBZ0FnMEFJQUV0QUFWQkFYRUVRQ0FBSUFFcEF4Z1FJd3NnQVNnQ0NDSUNJQUVvQWd3aUF6WUNCQ0FESUFJMkFnQWdBVUlBTndJSUlBQkJFR29nQVNBQUtBSUVFUUFBQ3c4TFFkYU5BVUd1L0FCQjlDaEI2dDBBRUFBQUN4SUFJQUZCM2dGT0JFQWdBQ0FCRU9nRkN3dmJBUUlCZndKK1FRRWhCQUpBSUFCQ0FGSWdBVUwvLy8vLy8vLy8vLzhBZ3lJRlFvQ0FnSUNBZ01ELy93QldJQVZDZ0lDQWdJQ0F3UC8vQUZFYkRRQWdBa0lBVWlBRFF2Ly8vLy8vLy8vLy93Q0RJZ1pDZ0lDQWdJQ0F3UC8vQUZZZ0JrS0FnSUNBZ0lEQS8vOEFVUnNOQUNBQUlBS0VJQVVnQm9TRVVBUkFRUUFQQ3lBQklBT0RRZ0JaQkVCQmZ5RUVJQUFnQWxRZ0FTQURVeUFCSUFOUkd3MEJJQUFnQW9VZ0FTQURoWVJDQUZJUEMwRi9JUVFnQUNBQ1ZpQUJJQU5WSUFFZ0ExRWJEUUFnQUNBQ2hTQUJJQU9GaEVJQVVpRUVDeUFFQ3kwQkFYOUJBU0VCQWtBQ1FBSkFJQUJCRFdzT0JBSUJBUUlBQ3lBQVFUUkdEUUVMSUFCQk9FWWhBUXNnQVFzZkFDQUFJQUVnQUNBQ0VLb0JJZ0lnQXlBRUVCa2hCQ0FBSUFJUUV5QUVDMFFCQVg5QmZ5RURJQUFnQUNnQ0JDQUNhaERHQVFSL1FYOEZJQUFvQWdBZ0FXb2lBeUFDYWlBRElBQW9BZ1FnQVdzUW5BRWdBQ0FBS0FJRUlBSnFOZ0lFUVFBTEM0NEJBUUYvSUFBZ0JrRU1FRWtpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBSUFBZ0FDZ0NBRUVCYWpZQ0FDQUdweUlISUFVN0FTb2dCeUFFT2dBcElBY2dBem9BS0NBSElBRTJBaVFnQnlBQU5nSWdJQWNnQnkwQUJVSHZBWEVnQkVFQ2EwRUVTVUVFZEhJNkFBVWdBQ0FHSUFBZ0FrSE1uZ0VnQWhzUXFnRWlBU0FERUpZRElBQWdBUkFUQ3lBR0N5a0JBWDlCZnlFQkFrQWdBRUVvRUN3TkFDQUFFSkVCRFFCQmYwRUFJQUJCS1JBc0d5RUJDeUFCQzRJQkFRTi9JQUJCUUdzaUF5Z0NBQ0lCQkVBZ0FTZ0N2QUVoQWlBQVFiVUJFQkFnQXlnQ0FDQUNRZi8vQTNFUUZ5QUJJQUVvQXN3QklnTWdBa0VEZEdvb0FnQWlBRFlDdkFFRFFBSkFJQUJCQUVnRVFFRi9JUUFNQVFzZ0F5QUFRUU4wYWlJQ0tBSUVJZ0JCQUU0TkFDQUNLQUlBSVFBTUFRc0xJQUVnQURZQ3dBRUxDMGNCQW44Z0FDZ0NmQ0VDQWtBRFFDQUNRUUJLQkVBZ0FDZ0NkQ0FDUVFGcklnSkJCSFJxSWdNb0FnQWdBVWNOQVNBREtBSUVEUUVNQWdzTElBQWdBUkRnQkNFQ0N5QUNDN1lCQVFKL0FrQWdBaUFCS0FJRUlncEdCRUFnQXlFTERBRUxJQUFnQ2lBQ0lBTWdCQ0FGSUFZZ0J5QUlJQWtROVFFaUJVRUFUZzBBUVg4UEMwRUFJUUlnQVNnQ3dBSWlBMEVBSUFOQkFFb2JJUU1DUUFOQUlBSWdBMGNFUUFKQUlBVWdBU2dDeUFJZ0FrRURkR29pQ2k4QkFrY05BQ0FLTFFBQUlncEJBWFpCQVhFZ0JFY05BQ0FMSUFwQkFYRkdEUU1MSUFKQkFXb2hBZ3dCQ3dzZ0FDQUJJQXNnQkNBRklBWWdCeUFJSUFrUXlRTWhBZ3NnQWdzMUFRRi9JQUFvQWdBaUFRUkFJQUFvQWhRZ0FVRUFJQUFvQWhBUkFRQWFDeUFBUWdBM0FnQWdBRUlBTndJUUlBQkNBRGNDQ0F2RUFRRUNmeU1BUWRBQWF5SUZKQUFnQUNnQ0FDRUdBa0FnQVNBREVLMEZCRUFnQlNBR0tBSVFJQVZCRUdvZ0F4Q1FBVFlDQUNBQVFlU1ZBU0FGRUJaQkFDRUFEQUVMUVFBaEFDQUdJQUZCSEdwQkZDQUJRU1JxSUFFb0FpQkJBV29RZUEwQUlBRWdBU2dDSUNJQVFRRnFOZ0lnSUFFb0Fod2dBRUVVYkdvaUFFSUFOd0lBSUFCQkVHcEJBRFlDQUNBQVFRaHFRZ0EzQWdBZ0FDQUdJQUlRR0RZQ0RDQUdJQU1RR0NFQklBQWdCRFlDQ0NBQUlBRTJBaEFMSUFWQjBBQnFKQUFnQUF2M0ZnRU1meU1BUVJCckloQWtBQ0FBUVVCcktBSUFJUWdnQUNnQ0FDRUxBa0FDUUFKQUlBRkJBa3NOQUFKQUlBSU5BRUVBSVFJZ0FFR0ZBUkJLUlEwQUlBQW9BamhCQVJDREFVRUtSZzBBUVg4aEJ5QUFFQklOQTBFQ0lRSUxRWDhoQnlBQUVCSU5BaUFBS0FJUUlnbEJLa1lFUUNBQUVCSU5BeUFBS0FJUUlRa2dBa0VCY2lFQ0N3SkFBa0FDUUFKQUFrQWdDVUVuYWc0Q0FRSUFDeUFKUVlOL1J3MERBa0FnQUNnQ0tBMEFJQUZCQWtjaURDQUNRUUZ4UlhKRklBQW9BaUFpQ1VFdFJuRU5BQ0FNSUFKQkFuRkZjaUFKUVM1SGNnMERDeUFBRU9JQkRBWUxJQUZCQWtjTkFpQUlMUUJ1UVFGeFJRMEJEQUlMSUFGQkFrY05BU0FBS0FKRURRRUxJQXNnQUNnQ0lCQVlJUXdnQUJBU1JRMEJEQUlMSUFGQkFrWWdCVUVDUm5JTkFDQUFRYkwzQUVFQUVCWU1BZ3NDUUFKQUFrQWdDQ2dDSUNJSFJTQUJRUUZMY2cwQUlBZ29BaVJCQVVjTkFDQUlJQXdRb2dJaUNVVU5BQ0FKS0FJSUlBZ29BcndCUncwQUlBQkJwKzRBUVFBUUZnd0JDMEYvSVJFQ1FDQUJRUUZIQkVBTUFRc0NRQ0FDRFFBZ0NDMEFia0VCY1EwQUlBZ2dEQ0FJS0FMQUFVRUFFTUVEUVFCT0RRQWdDQ0FNRVBRQlFZQ0FnSUI2Y1VHQWdJQ0FBa1lOQUNBTVFjMEFSZ1JBSUFnb0FrZ05BUXRCQVNFUEN3SkFJQWRGRFFBZ0NDZ0NKRUVCU3cwQUlBZ29BcndCSWdjZ0NDZ0M4QUZIRFFBZ0NDQU1FS0lDSWdsRkRRRWdDU2dDQ0NBSFJ3MEJJQUJCNDhRQVFRQVFGZ3dDQzBGL0lRY2dBQ0FJSUF4QkJFRURJQUliRUtBQkloRkJBRWdOQXdzZ0N5QUlRUUFnQVVFQlN5QUFLQUlNSUFRUTZBTWlCQTBCQ3lBTElBd1FFMEYvSVFjTUFnc2dCZ1JBSUFZZ0JEWUNBQXNnQUVGQWF5QUVOZ0lBSUFRZ0FrVWdBVUVEU1hFMkFqUWdCQ0FNTmdKd0lBUWdBVUVJUmlJSE5nSmdJQVFnQVVFRFJ5SU5OZ0pNSUFRZ0RUWUNTQ0FFSUFjZ0FVRjhjVUVFUm5JaUNUWUNNRUVCSVFoQkFTRUtJQTFGQkVBZ0JDZ0NCQ0lJS0FKY0lRb2dDQ2dDV0NFSklBZ29BbFFoQnlBSUtBSlFJUWdMSUFRZ0NqWUNYQ0FFSUFrMkFsZ2dCQ0FITmdKVUlBUWdDRFlDVUNBRUlBSkIvd0Z4SUFGQkNIUnlPd0ZzQWtBQ1FBSkFBa0FDUUNBQlFRZHJRUUZOQkVBZ0FFRXJFQkFnQVVFSFJnUkFJQUFRd0FNTElBUkNBVGNDT0NBRVFUeHFJUWtnQkVFNGFpRUlEQUVMSUFSQ0FUY0NPQ0FFUVR4cUlRa2dCRUU0YWlFSUlBRkJBMGNOQUNBQUtBSVFRWU4vUncwQUlBQW9BaWdOQXlBTElBUWdBQ2dDSUJDL0EwRUFTQTBFSUFSQkFUWUNqQUVNQVFzQ1FDQUFLQUlRUVNoR0JFQWdBQ0FRUVF4cVFRQVFuZ0VhSUJBdEFBeEJCSEVFUUNBSlFRRTJBZ0FMSUFBUUVrVU5BUXdGQ3lBQVFTZ1FMQTBFQ3lBSktBSUFCRUJCZnlFSElBUkJmellDdkFFZ0FCQ0FBVUVBU0EwR0N5QUFRVUJySVExQkFDRUtBa0FEUUNBQUtBSVFJZ2RCS1VZTkFTQUhRYWQvUnlJT1JRUkFJQWhCQURZQ0FDQUFFQklOQmlBQUtBSVFJUWNMQWtBQ1FBSkFBa0FnQjBHRGYwY0VRQ0FIUWZzQVJ5QUhRZHNBUjNFTkJDQUlRUUEyQWdBQ1FDQU9SUVJBSUFCQkRSQVFJQVFvQW9nQklRY01BUXNnQ3lBRVFRQVF2d01oQnlBQVFkc0FFQkFMSUEwb0FnQWdCMEgvL3dOeEVCY2dBRUZUUWJOL0lBa29BZ0FiUVFGQkFVRi9RUUVRd2dFaUIwRUFTQTBLSUFjZ0NuSWhCMEVCSVFvZ0IwVUVRQ0FFSUFRb0Fvd0JRUUZxTmdLTUFVRUFJUW9MSUE1RkRRRU1Bd3NnQUNnQ0tBMElJQUFvQWlBaUIwRXRSZ1JBSUFRdEFHeEJBVVlOQ1FzZ0NTZ0NBQVJBSUFBZ0JDQUhRUUVRb0FGQkFFZ05DZ3NnQ3lBRUlBY1F2d01pRWtFQVNBMEpJQUFRRWcwSklBNE5BU0FBUVEwUUVDQUFRVUJySWdvb0FnQWdFa0gvL3dOeElnMFFGeUFKS0FJQUJFQWdBRUVSRUJBZ0FFRzlBUkFRSUFBZ0J4QWFJQW9vQWdBZ0JDOEJ2QUVRRndzZ0FFSGNBQkFRSUFvb0FnQWdEUkFYSUFoQkFEWUNBQXNnQUNnQ0VFRXBSZzBFSUFCQktSQXNHZ3dJQ3dKQUlBQW9BaEJCUFVZRVFDQUlRUUEyQWdBZ0FCQVNEUWtnRFNnQ0FCQXlJUW9nQUVIYkFCQVFJQTBvQWdBZ0VrSC8vd054SWc0UUZ5QUFRUkVRRUNBQVFRWVFFQ0FBUWFzQkVCQWdBRUhwQUNBS0VCd2FJQUJCRGhBUUlBQVFWZzBKSUFBZ0J4Q2hBU0FBUVJFUUVDQUFRZHdBRUJBZ0RTZ0NBQ0FPRUJjZ0FDQUtFQjVCQVNFS0RBRUxJQXBGQkVBZ0JDQUVLQUtNQVVFQmFqWUNqQUVMSUFrb0FnQkZEUUVnQUVIYkFCQVFJQTBvQWdBZ0VrSC8vd054RUJjTElBQkJ2UUVRRUNBQUlBY1FHaUFOS0FJQUlBUXZBYndCRUJjTElBQW9BaEJCS1VZTkFpQUFRU3dRTEVVTkFRd0dDd3NnQUVIWndnQkJBQkFXREFRTEFrQUNRQ0FCUVFSckRnSUJBQUlMSUFRb0FvZ0JRUUZHRFFFTUFnc2dCQ2dDaUFFTkFRc2dDU2dDQUFSQUlBUW9Bc3dCSUFRb0Fyd0JRUU4wYWtFRWFpRUhJQUJCUUdzaENBTkFBa0FnQnlnQ0FDSUpRUUJJRFFBZ0JDZ0NkQ0lISUFsQkJIUWlDV29pQ2lnQ0JDQUVLQUs4QVVjTkFDQUVJQW9vQWdBaUNoRDBBVUVBU0FSQUlBc2dCQ0FLRUU5QkFFZ05CaUFFS0FKMElRY2dBRUc0QVJBUUlBQWdCeUFKYWlJS0tBSUFFQm9nQ0NnQ0FDQUVMd0c4QVJBWElBQkJ1UUVRRUNBQUlBb29BZ0FRR2lBSUtBSUFRUUFRRndzZ0J5QUpha0VJYWlFSERBRUxDeUFBUWJVQkVCQWdBRUZBYXlnQ0FDQUVMd0c4QVJBWElBUkJBRFlDdkFFZ0JDQUVLQUxNQVNnQ0JEWUN3QUVMSUFBUUVnMENJQUpCZlhGQkFVWUVRQ0FBUVljQkVCQUxJQVJCQVRZQ1pDQUFFSUFCR2lBRUlBUW9BcndCTmdMd0FRSkFBa0FnQUNnQ0VFR21mMGNOQUNBQUVCSU5CQ0FBS0FJUVFmc0FSZzBBSUFBZ0JDQU1FTnNFRFFRZ0FCQldEUVFnQUVFdVFTZ2dBaHNRRUNBRUxRQnVRUUp4RFFFZ0JDQUFLQUkwSUFOcklnSTJBcEFESUFRZ0N5QURJQUlRZ1FNaUFqWUNqQU1nQWcwQkRBUUxJQUJCK3dBUUxBMERJQUFRblFVTkF5QUFJQVFnREJEYkJBMERBMEFnQUNnQ0VFSDlBRWNFUUNBQUVKd0ZSUTBCREFVTEN5QUVMUUJ1UVFKeFJRUkFJQVFnQUNnQ09DQURheUlDTmdLUUF5QUVJQXNnQXlBQ0VJRURJZ0kyQW93RElBSkZEUVFMSUFBUUVnMERJQUJCUUdzb0FnQVE1Z0pGRFFBZ0FFRUFFT1VDQ3lBQVFVQnJJQVFvQWdRaUF6WUNBQ0FFS0FKd0lRSWdCQ0FBS0FJQUlBTkNnSUNBZ0NBUXZnTWlBellDQ0NBQlFRSlBCRUJCQUNFSElBRkJDV3RCZlVzTkJTQUFRUU1RRUNBQVFVQnJJZ0VvQWdBZ0F4QTVJQUlOQlNBQVFjMEFFQkFnQVNnQ0FFRUFFRGtNQlFzZ0FVRUJSZ1JBSUFCQkF4QVFJQUJCUUdzaUFTZ0NBQ0FERURrZ0R3UkFBa0FnQVNnQ0FDSUJLQUlvQkVBZ0N5QUJJQUlRNUFJaUFVVU5CaUFCUVFBMkFnZ2dBU0FCTFFBRVFmNEJjU0FBUVVCcktBSUFMUUJ1UVFGeGNqb0FCQXdCQ3lBQklBSVE5QUZCQUU0TkFDQUxJQUVnQWhCUFFRQklEUVVMSUFCQkVSQVFJQUJCdVFFUUVDQUFJQUlRR2lBQVFVQnJLQUlBUVFBUUZ3dEJBQ0VISUJGQkFFNEVRQ0FBUVVCcktBSUFLQUowSUJGQkJIUnFJZ0VnQVNnQ0RFSC9nSUNBZUhFZ0EwRUhkRUdBLy8vL0IzRnlOZ0lNSUFCQkRoQVFEQVlMSUFCQnZRRVFFQ0FBSUFJUUdpQUFRVUJyS0FJQUlnQWdBQzhCdkFFUUZ3d0ZDd0pBQWtBZ0FFRkFheWdDQUNJQktBSW9SUVJBSUFBZ0FTQUNRUVlRb0FFaUFVRUFTQTBGSUFCQlFHc29BZ0FoQUNBQlFZQ0FnSUFDY1FSQUlBQW9Bb0FCSUFGQkJIUnFJZ0FnQUNnQ0RFSC9nSUNBZUhFZ0EwRUhkRUdBLy8vL0IzRnlOZ0lNREFJTElBQW9BblFnQVVFRWRHb2lBQ0FBS0FJTVFmK0FnSUI0Y1NBRFFRZDBRWUQvLy84SGNYSTJBZ3dNQVFzZ0N5QUJJQUpCL0FBZ0Foc2lBUkRrQWlJQ1JRMEVJQUlnQXpZQ0FDQUZEUUVMUVFBaEJ3d0ZDMEVBSVFjZ0FDQUFRVUJyS0FJQUtBS1VBeUFCUVJZZ0FTQUZRUUZIRzBFQUVQY0JEUVFNQWdzZ0FFR0R3Z0JCQUJBV0RBRUxJQUFRNGdFTElBQkJRR3NnQkNnQ0JEWUNBQ0FMSUFRUS9RSkJmeUVISUFaRkRRRWdCa0VBTmdJQURBRUxJQXNnREJBVEN5QVFRUkJxSkFBZ0J3dmxCQUVHZnlBQUtBSUFJZ1JCQVdvaEFrRUlJUU1DUUFKQUFrQWdCQzBBQUNJR1FUQnJJZ2RCQ0U4RVFFRitJUVVDUUFKQUFrQUNRQUpBQWtBZ0JrSHVBR3NPQ3dFSkNRa0NDUU1GQkFrRkFBc0NRQ0FHUWVJQWF3NEZDQWtKQ1FBSkMwRU1JUU1NQnd0QkNpRUREQVlMUVEwaEF3d0ZDMEVKSVFNTUJBdEJDeUVEREFNTEFrQWdBVVVOQUNBQ0xRQUFRZnNBUncwQUlBUkJBbW9oQWlBRUxRQUNJUVJCQUNFREEwQWdBaUVCUVg4aEJTQUVFTFlFSWdKQkFFZ05CU0FDSUFOQkJIUnlJZ05CLy8vREFFc05CU0FCUVFGcUlnSXRBQUFpQkVIOUFFY05BQXNnQVVFQ2FpRUNEQU1MSUFSQkFrRUVJQVpCK0FCR0d5SUhha0VCYWlFRVFRQWhBMEVBSVFVRFFDQUZJQWRIQkVBZ0FpMEFBQkMyQkNJR1FRQklCRUJCZnc4RklBVkJBV29oQlNBQ1FRRnFJUUlnQmlBRFFRUjBjaUVEREFJTEFBc0xJQUZCQWtjZ0EwR0FlSEZCZ0xBRFIzSU5BU0FFTFFBQVFkd0FSdzBCSUFRdEFBRkI5UUJIRFFGQkFDRUNRUUFoQlFOQUFrQWdBa0VFUmcwQUlBSWdCR290QUFJUXRnUWlBVUVBU0EwQUlBSkJBV29oQWlBQklBVkJCSFJ5SVFVTUFRc0xJQUpCQkVjZ0JVR0F1QU5KY2lBRlFmKy9BMHR5RFFFZ0EwRUtkRUdBK0Q5eElBVkIvd2R4Y2tHQWdBUnFJUU1nQkVFR2FpRUNEQUlMSUFGQkFrWUVRRUYvSVFVZ0J3MERRUUFoQXlBQ0xRQUFRVHByUVhaSkRRSU1Bd3NnQWkwQUFFRXdheUlCUVFkTEJFQWdCeUVEREFJTElBUkJBbW9oQWlBQklBZEJBM1J5SWdOQkgwc05BU0FFTFFBQ1FUQnJJZ0ZCQjBzTkFTQUVRUU5xSVFJZ0FTQURRUU4wY2lFRERBRUxJQVFoQWdzZ0FDQUNOZ0lBSUFNaEJRc2dCUXROQVFKL0lBSkMvLy8vL3dkWUJFQWdBQ0FCSUFLblFZQ0FnSUI0Y2tHQWdBRVExUUVQQ3lBQUlBSVErQUlpQTBVRVFFRi9Ed3NnQUNBQklBTkJnSUFCRU5VQklRUWdBQ0FERUJNZ0JBdmdBUUVDZnlBQ1FRQkhJUU1DUUFKQUFrQWdBRUVEY1VVZ0FrVnlEUUFnQVVIL0FYRWhCQU5BSUFBdEFBQWdCRVlOQWlBQ1FRRnJJZ0pCQUVjaEF5QUFRUUZxSWdCQkEzRkZEUUVnQWcwQUN3c2dBMFVOQVNBQUxRQUFJQUZCL3dGeFJpQUNRUVJKY2tVRVFDQUJRZjhCY1VHQmdvUUliQ0VEQTBBZ0FDZ0NBQ0FEY3lJRVFYOXpJQVJCZ1lLRUNHdHhRWUNCZ29SNGNRMENJQUJCQkdvaEFDQUNRUVJySWdKQkEwc05BQXNMSUFKRkRRRUxJQUZCL3dGeElRRURRQ0FCSUFBdEFBQkdCRUFnQUE4TElBQkJBV29oQUNBQ1FRRnJJZ0lOQUFzTFFRQUxHUUFnQUNBQkVBOGdBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRc21BUUYvSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQUlBRVFKZ3VvQWdJQmZnRi9Jd0JCRUdzaUFpUUFBa0FnQVVMLy8vLy9iMWdFUUNBQUVDUkNnSUNBZ09BQUlRVU1BUXNDUUNBRURRQWdBeWtEQUNJRlFvQ0FnSUJ3VkEwQUlBV25JZ1l2QVFaQk1VY05BQ0FHS0FJZ1JRMEFJQUFnQlVFOElBVkJBQkFVSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBVWdBUkJTSVFZZ0FDQUZFQThnQmtVTkFDQURLUU1BSWdWQ0lJaW5RWFZKRFFFZ0JhY2lBQ0FBS0FJQVFRRnFOZ0lBREFFTElBQWdBaUFCRUw4Q0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUFJQUlnQkVFRGRHb3BBd0JDZ0lDQWdEQkJBU0FERUNFaEJTQUFJQUlwQXdBUUR5QUFJQUlwQXdnUUR5QUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQ0FCRUE4TUFnc2dBQ0FGRUE4TElBRWhCUXNnQWtFUWFpUUFJQVVMZVFFQmZ3SkFBa0FDUUFKQUFrQWdBU2dDQUNJQ1FZQUJhZzRGQkFRRUFnQUJDeUFBS0FJQUlBRXBBeEFRRHlBQUtBSUFJQUVwQXhnUUR3OExJQUpCcTM5SERRRUxJQUFvQWdBZ0FTZ0NFQkFURHdzZ0FrSFRBR3BCTFUwRVFDQUFLQUlBSUFFb0FoQVFFd3NQQ3lBQUtBSUFJQUVwQXhBUUR3c05BQ0FBSUFFZ0FrRURFTTRDQzNBQkEzOGpBRUVRYXlJQ0pBQWdBQ0VCQTBBQ1FDQUJMQUFBSWdOQkFFNEVRQ0FEUWY4QmNVRUpheUlEUVJkTFFRRWdBM1JCbjRDQUJIRkZjZzBCSUFGQkFXb2hBUXdDQ3lBQlFRWWdBa0VNYWhCWUVJY0RSUTBBSUFJb0Fnd2hBUXdCQ3dzZ0FrRVFhaVFBSUFFZ0FHc0xDZ0FnQUNBQkVJZ0RSUXROQVFGL0FrQWdBQ0FCSUFBb0FnUkIvLy8vL3dkeElnQWdBU2dDQkVILy8vLy9CM0VpQWlBQUlBSklHeEM3QlNJQkRRQkJBQ0VCSUFBZ0FrWU5BRUYvUVFFZ0FDQUNTUnNoQVFzZ0FRdEtBUUYvSXdCQkVHc2lBaVFBQWtBZ0FVRWdjUVJBSUFBUWZBd0JDeUFDUWNUS0FFSG96QUJCL0NFZ0FVRUJjUnNnQVVFQ2NSczJBZ0FnQUVHVlBTQUNFRkFMSUFKQkVHb2tBQXYwQlFJR2Z3TitJd0JCSUdzaUNTUUFBbjlCQUNBQUx3SG9BVUdBQWtrTkFCcENnSUNBZ0RBaERrRUFJQUFnQWtIZEFTQUNRUUFRRkNJUFFvQ0FnSUJ3Z3lJTlFvQ0FnSUF3VVEwQUdnSkFJQTFDZ0lDQWdPQUFVUTBBSUFBZ0QwRWxFRXNpQ0VVTkFDQUFJQU5CM1FFZ0EwRUFFQlFpRGtLQWdJQ0FjSU1pRFVLQWdJQ0E0QUJSRFFBZ0RVS0FnSUNBTUZFRVFDQUFJQThRRDBFQURBSUxJQUFnRGtFbEVFc2lDMFVOQUFKQUlBZ29BZ1JGRFFBZ0N5Z0NCRVVOQUNBQUlBOFFEeUFBSUE0UUQwRUFEQUlMSUFRUTl3TWhCd0ovSUFnb0FnQWlDaUFMS0FJQUlneEdCRUFnQ0NBSFFRSjBhaWdDQ0F3QkN5QUtJQXhMQkVBZ0NFSFVBR29nRENBSEVMZ0ZEQUVMSUF0QjNBQnFJQW9nQnhDNEJRc2lDa1VFUUNBSklBZEJBblJCd01BQmFqWUNBQ0FBUVpMNkFDQUpFQlVNQVFzQ1FDQUlLQUlFQkVBQ2ZpQUZCRUFnQUNBQ0VMa0NEQUVMSUFBZ0FpQUdFSkFDQ3lJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTUFnc2dBa0lnaUtkQmRVa05BQ0FDcHlJSUlBZ29BZ0JCQVdvMkFnQUxBa0FnQ3lnQ0JBUkFBbjRnQlFSQUlBQWdBeEM1QWd3QkN5QUFJQU1nQmhDUUFnc2lBMEtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJJQUFnQWhBUERBSUxJQU5DSUlpblFYVkpEUUFnQTZjaUJTQUZLQUlBUVFGcU5nSUFDeUFLSUFvb0FnQkJBV28yQWdBZ0NTQUNJQU1nQkVGK2NVR2tBVVlnQjBFTlJuRWlCUnMzQXhnZ0NTQURJQUlnQlJzM0F4QWdBQ0FLclVLQWdJQ0FjSVJDZ0lDQWdEQkJBaUFKUVJCcUVDOGhEU0FBSUFJUUR5QUFJQU1RRHlBTlFvQ0FnSUJ3Z3lJQ1FvQ0FnSURnQUZFTkFBSitJQWRCREVZRVFDQUFJQTBRSmlBRVFhb0JSa2V0UW9DQWdJQVFoQXdCQ3lBTklBZEJEVWNOQUJwQ2dJQ0FnQkFnQWtLQWdJQ0FNRkVOQUJvZ0FDQU5FQ1lnQkVGOWNVR2tBVVpIclVLQWdJQ0FFSVFMSVFNZ0FDQVBFQThnQUNBT0VBOGdBU0FETndNQVFRRU1BUXNnQUNBUEVBOGdBQ0FPRUE4Z0FVS0FnSUNBTURjREFFRi9DeUVISUFsQklHb2tBQ0FIQzJNQ0FYOEJmaU1BUVJCcklnSWtBQ0FBQW40Z0FVVUVRRUlBREFFTElBSWdBYTFDQUNBQlp5SUJRZEVBYWhCbklBSXBBd2hDZ0lDQWdJQ0F3QUNGUVo2QUFTQUJhNjFDTUlaOElRTWdBaWtEQUFzM0F3QWdBQ0FETndNSUlBSkJFR29rQUF2SEFRSUJmZ0YvQWtBZ0FDZ0NFQ2dDakFFaUEwVWdBVUwvLy8vLy8vLy9EM3hDL3YvLy8vLy8veDlXY2cwQUlBTW9BaWhCQkhGRkRRQWdBVUtBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBVUwvLy8vL0Q0TVBDMEtBZ0lDQXdINGdBYm05SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc1BDeUFBRUpjQklnSkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUNwMEVFYWlBQkVMb0NSUVJBSUFJUEN5QUFJQUlRRHlBQUVId0xRb0NBZ0lEZ0FBdVRBUUVDZndKL0lBQW9BZ2dnQW1vaUJDQUFLQUlNU2dSQVFYOGdBQ0FFUVFBUXR3SU5BUm9MQWtBZ0FDZ0NFQVJBSUFKQkFDQUNRUUJLR3lFRUEwQWdBeUFFUmcwQ0lBQW9BZ1FnQUNnQ0NDQURha0VCZEdvZ0FTQURhaTBBQURzQkVDQURRUUZxSVFNTUFBc0FDeUFBS0FJRUlBQW9BZ2hxUVJCcUlBRWdBaEFmR2dzZ0FDQUFLQUlJSUFKcU5nSUlRUUFMQ3lvQkFYOGdBQ2dDRUNJRFFSQnFJQUVnQWlBREtBSUlFUUVBSWdFZ0FrVnlSUVJBSUFBUWZBc2dBUXRFQVFKL0FrQWdBRUtBZ0lDQWNGUU5BQ0FBcHlJREx3RUdRUUpIRFFBZ0F5MEFCVUVJY1VVTkFDQUNJQU1vQWlnMkFnQWdBU0FES0FJa05nSUFRUUVoQkFzZ0JBdWdCQUlGZndGK0l3QkJJR3NpQmlRQUFrQUNRQUpBQWtBZ0F3UkFJQUZDZ0lDQWdHQ0RRb0NBZ0lBZ1VnMEJEQUlMSUFGQ2dJQ0FnSEJVRFFFTFFRRWhCQUpBQWtBZ0FrSWdpS2NpQ0VFQmFnNEVBQUlDQVFJTElBS25JUVVMSUFGQy8vLy8vMjlZUVFBZ0F4c05BZ0pBSUFHbklnY3ZBUVpCTUVZRVFDQUFJQVpCR0dvZ0FVSGdBQkNCQVNJRlJRMERJQVVwQXdBaENTQUdLUU1ZSWdGQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFBZ0NTQUNJQU1RaXdJaEJBd0ZDeUFHSUFJM0F3Z2dCaUFKTndNQUlBQWdBU0FGS1FNSVFRSWdCaEF2SWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQUlBRVFKa1VFUUNBRFJRMENJQUJCb3VRQVFRQVFGUXdFQ3lBQUlBVXBBd0FRbVFFaUEwRUFTQTBESUFNTkJDQUFJQVVwQXdBUTZBRWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMERJQUFnQVJBUElBS25JQUduUmcwRUlBQkJoT1FBUVFBUUZRd0RDeUFIS0FJUUtBSXNJQVZHRFFNZ0J5MEFCVUVCY1VVRVFDQURSUTBCSUFCQjkrZ0FRUUFRRlF3REN3SkFJQVZGRFFBZ0JTRUVBMEFnQkNBSFJnUkFJQU5GRFFNZ0FFR3UwQUJCQUJBVkRBVUxJQVFvQWhBb0Fpd2lCQTBBQ3lBSVFYVkpEUUFnQXFjaUF5QURLQUlBUVFGcU5nSUFDMEYvSVFRZ0FDQUhRUUFRMUFFTkF5QUhLQUlRSWdRb0Fpd2lBd1JBSUFBZ0E2MUNnSUNBZ0hDRUVBOExJQVFnQlRZQ0xFRUJJUVFNQXd0QkFDRUVEQUlMSUFBUUpBdEJmeUVFQ3lBR1FTQnFKQUFnQkFzVkFRRitJQUFnQVJEb0FTRUNJQUFnQVJBUElBSUxDZ0FnQUNBQnB4REJBZ3RRQVFGK0FrQWdBMEhBQUhFRVFDQUNJQU5CUUdxdGlDRUJRZ0FoQWd3QkN5QURSUTBBSUFKQndBQWdBMnV0aGlBQklBT3RJZ1NJaENFQklBSWdCSWdoQWdzZ0FDQUJOd01BSUFBZ0FqY0RDQXZSQ3dJRWZ3UitJd0JCb0FOcklnVWtBQUpBSUFHOUlnbENnSUNBZ0lDQWdQai9BSU5DZ0lDQWdJQ0FnUGovQUZFRVFDQUpRdi8vLy8vLy8vLy8vd0NEUW9HQWdJQ0FnSUQ0L3dCYUJFQWdCVUhPd3JrQ05nS2dBZ3dDQ3lBRlFhQUNhaUVESUFGRUFBQUFBQUFBQUFCakJFQWdCVUV0T2dDZ0FpQUZRYUFDYWtFQmNpRURDeUFEUWYwY0xRQUFPZ0FJSUFOQjlSd3BBQUEzQUFBTUFRc0NRQUpBQWtBZ0JFVUVRQUorSUFHWlJBQUFBQUFBQU9CRFl3UkFJQUd3REFFTFFvQ0FnSUNBZ0lDQWdIOExJZ3BDZ0lDQWdJQ0FnQkI5UW9HQWdJQ0FnSUJnVkNBS3VTQUJZbklOQVNBRlFRQTZBT1VCSUFvZ0NrSS9oeUlKaFNBSmZTRUpJQUt0SVFzZ0JVSGxBV29oQXdOQUlBTWlBa0VCYXlJRFFUQkIxd0FnQ1NBSklBdUFJZ3dnQzM1OXB5SUVRUXBJR3lBRWFqb0FBQ0FKSUF0YUlRUWdEQ0VKSUFRTkFBc2dDa0lBVXdSQUlBSkJBbXNpQTBFdE9nQUFDeUFGUWFBQ2FpQURFT1VGREFRTFJBQUFBQUFBQUFBQUlBRWdBVVFBQUFBQUFBQUFBR0ViSVFFZ0JFRUNSZ1JBQWtBZ0JVR2dBbW9nQVNBRFFRRnFJZ0lRb0FNZ0JXb3RBSjhDUVRWSERRQWdCVUdnQW1vZ0FTQUNFS0FESWdRZ0JVR2dBV29nQVNBQ0VLQURSdzBBSUFWQm9BSnFJQVZCb0FGcUlBUVFZUTBBSUFVdEFLQUNHZ3NnQlVHZ0Ftb2dBU0FERUtBREdnd0VDeUFFUVFOeFFRRkdEUUVMUVJFaEJrRUJJUWNEUUNBR0lBZE5CRUJCRlNFRERBTUxJQUVnQmlBSGFrRUJkaUlESUFWQkhHb2dCVUVnYWlBRlFhQUJhaUFGUWFBQ2FpSUNFTWtDSUFJUTVBVWdBV0VFUUVFQklBTWdBMEVBU2hzaEJnTkFJQU1pQWtFQ1NBMENJQUpCQVdzaUF5QUZRYUFCYW1vdEFBQkJNRVlOQUFzZ0FpRUdCU0FEUVFGcUlRY0xEQUFMQUFzZ0FTQURRUUZxSWdJZ0JVRWNhaUFGUVJocUlBVkJvQUZxSWdZZ0JVR2dBbW9ReVFJQ1FDQURJQVpxTFFBQVFUVkhEUUFnQVNBQ0lBVkJIR29nQlVFWWFpQUZRYUFCYWlJR0lBVkJvQUpxSWdjUXlRSWdBU0FDSUFWQkZHb2dCVUVRYWlBRlFTQnFJZ2dnQnhESkFpQUdJQWdnQWhCaERRQWdCU2dDSENBRktBSVVSdzBBSUFVb0FoZ2FDeUFESVFZTElBRWdCaUFGUVJ4cUlBVkJJR29nQlVHZ0FXb2dCVUdnQW1vUXlRSWdCU2dDSUFSL0lBVkJMVG9Bb0FJZ0JVR2dBbXBCQVhJRklBVkJvQUpxQ3lFQ0lBVW9BaHdoQndKQUlBUkJCSEVOQUNBRElBZElJQWRCQUV4eVJRUkFJQVlnQjB3RVFFRUFJUU1nQnlBR2F5SUVRUUFnQkVFQVNoc2hCQ0FDSUFWQm9BRnFJQVlRSHlBR2FpRUNBMEFnQXlBRVJ3UkFJQUpCTURvQUFDQURRUUZxSVFNZ0FrRUJhaUVDREFFTEN5QUNRUUE2QUFBTUF3c2dBaUFGUWFBQmFpQUhFQjhnQjJvaUFrRXVPZ0FBUVFBaEF5QUdJQWRySWdSQkFDQUVRUUJLR3lFRUEwQWdBa0VCYWlFQ0lBTWdCRWNFUUNBQ0lBVkJvQUZxSUFNZ0IycHFMUUFBT2dBQUlBTkJBV29oQXd3QkN3c2dBa0VBT2dBQURBSUxJQWRCQldwQkJVc05BQ0FDUWJEY0FEc0FBRUVBSVFOQkFDQUhheUVFSUFKQkFtb2hBZ05BSUFNZ0JFY0VRQ0FDUVRBNkFBQWdBMEVCYWlFRElBSkJBV29oQWd3QkN3c2dBaUFGUWFBQmFpQUdFQjhnQm1wQkFEb0FBQXdCQ3lBQ0lBVXRBS0FCT2dBQUFrQWdCa0VDU0FSQUlBSkJBV29oQWd3QkN5QUNRUzQ2QUFFZ0FrRUNhaUVDUVFFaEF3TkFJQU1nQmtZTkFTQUNJQVZCb0FGcUlBTnFMUUFBT2dBQUlBTkJBV29oQXlBQ1FRRnFJUUlNQUFzQUN5QUNRZVVBT2dBQUlBZEJBV3NoQXlBSFFRQk1CSDhnQWtFQmFnVWdBa0VyT2dBQklBSkJBbW9MSVFJZ0JTQUROZ0lBSXdCQkVHc2lCQ1FBSUFRZ0JUWUNEQ01BUVpBQmF5SURKQUFnQTBIQXhRUkJrQUVRSHlJRElBSTJBaXdnQXlBQ05nSVVJQU5CLy8vLy93ZEJmaUFDYXlJR0lBWkIvLy8vL3dkUEd5SUdOZ0l3SUFNZ0FpQUdhaUlDTmdJY0lBTWdBallDRUNBRFFmVDdBQ0FGRUpzRUlBWUVRQ0FES0FJVUlnSWdBaUFES0FJUVJtdEJBRG9BQUFzZ0EwR1FBV29rQUNBRVFSQnFKQUFMSUFBZ0JVR2dBbW9RWWlFSklBVkJvQU5xSkFBZ0NRc3BBUUYvSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBRWdBaENhQVF2TUFRRUNmeUFCSUFFb0FnQWlBa0VCYXlJRE5nSUFBa0FnQWtFQlRBUkFJQU1OQVNBQkxRQVFCRUFnQUNBQkVKQUVDeUFCS0FJc0lnSUVRQ0FBSUFLdFFvQ0FnSUJ3aEJBakN5QUJRVEJxSVFKQkFDRURBMEFnQXlBQktBSWdUMFVFUUNBQUlBSW9BZ1FRN0FFZ0EwRUJhaUVESUFKQkNHb2hBZ3dCQ3dzZ0FTZ0NDQ0lDSUFFb0Fnd2lBellDQkNBRElBSTJBZ0FnQVVJQU53SUlJQUJCRUdvZ0FTQUJLQUlZUVg5elFRSjBhaUFBS0FJRUVRQUFDdzhMUVk2UEFVR3UvQUJCd3lKQnE0MEJFQUFBQzRRQkFRTi9Jd0JCa0FGcklnTWtBQ0FESUFJMkFvd0JBa0FnQTBHQUFTQUJJQUlReXdJaUJFSC9BRTBFUUNBQUlBTWdCQkJ5REFFTElBQWdCQ0FBS0FJRWFrRUJhaERHQVEwQUlBTWdBallDakFFZ0FDZ0NCQ0lGSUFBb0FnQnFJQUFvQWdnZ0JXc2dBU0FDRU1zQ0dpQUFJQUFvQWdRZ0JHbzJBZ1FMSUFOQmtBRnFKQUFMb0FNQ0JIOEJmaU1BUVNCcklnUWtBQ0FCSUFKcUlRVWdBU0VEQTBBQ1FDQURJQVZQRFFBZ0F5d0FBRUVBU0EwQUlBTkJBV29oQXd3QkN3c0NmZ0pBSUFNZ0FXc2lCa0dBZ0lDQUJFOEVRQ0FBUWNEYUFFRUFFRVlNQVFzZ0F5QUZSZ1JBSUFBZ0FTQUNFSVFEREFJTElBQWdCRUVFYWlBQ0VEMUZCRUFnQkVFRWFpQUJJQVlRaUFJYUEwQWdBeUFGU1FSQUlBTXNBQUFpQUVFQVRnUkFJQVJCQkdvZ0FFSC9BWEVRT3hvZ0EwRUJhaUVEREFJRkFrQWdBeUFGSUFOcklBUkJIR29RV0NJQlFmLy9BMDBFUUNBRUtBSWNJUU1NQVFzZ0FVSC8vOE1BVFFSQUlBUW9BaHdoQXlBRVFRUnFJQUZCZ0lBRWEwRUtka0dBc0FOcUVJc0JHaUFCUWY4SGNVR0F1QU55SVFFTUFRc0RRRUg5L3dNaEFTQURJQVZQRFFFZ0F5d0FBRUZBU0FSQUlBTkJBV29oQXd3QkN3c0RRQ0FGSUFOQkFXb2lBMDBFUUNBRklRTU1BZ3NnQXl3QUFFRkFTQTBBQ3dzZ0JFRUVhaUFCRUlzQkdnd0NDd0FMQ3lBRVFRUnFFRFlNQWdzZ0JDZ0NCQ2dDRUNJQVFSQnFJQVFvQWdnZ0FDZ0NCQkVBQUF0Q2dJQ0FnT0FBQ3lFSElBUkJJR29rQUNBSEMwNEJBMzlCME1ZRUtBSUFJZ0lnQUVFSGFrRjRjU0lEYWlFQlFYOGhBQUpBSUFOQkFDQUJJQUpOR3cwQUlBRS9BRUVRZEVzRVFDQUJFQWxGRFFFTFFkREdCQ0FCTmdJQUlBSWhBQXNnQUF1RkFRSURmd0YrQWtBZ0FFS0FnSUNBRUZRRVFDQUFJUVVNQVFzRFFDQUJRUUZySWdFZ0FFSUtnQ0lGUXZZQmZpQUFmS2RCTUhJNkFBQWdBRUwvLy8vL253RldJUUlnQlNFQUlBSU5BQXNMSUFXbklnSUVRQU5BSUFGQkFXc2lBU0FDUVFwdUlnTkI5Z0ZzSUFKcVFUQnlPZ0FBSUFKQkNVc2hCQ0FESVFJZ0JBMEFDd3NnQVF0V0FRRi9JQUpDSUlpblFYVlBCRUFnQXFjaUJTQUZLQUlBUVFGcU5nSUFDeUFBSUFGQk95QUNJQU1RR1JvZ0FVSWdpS2RCZFU4RVFDQUJweUlESUFNb0FnQkJBV28yQWdBTElBQWdBa0U4SUFFZ0JCQVpHZ3ZsQlFNRWZBRi9BWDRDUUFKQUFrQUNmQUpBSUFDOUlnWkNJSWluUWYvLy8vOEhjU0lGUWZyUWpZSUVUd1JBSUFDOVF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXRFFVZ0JrSUFVd1JBUkFBQUFBQUFBUEMvRHdzZ0FFVHZPZnIrUWk2R1FHUkZEUUVnQUVRQUFBQUFBQURnZjZJUEN5QUZRY1BjMlA0RFNRMENJQVZCc2NYQy93TkxEUUFnQmtJQVdRUkFRUUVoQlVSMlBIazE3em5xUFNFQklBQkVBQURnL2tJdTVyK2dEQUlMUVg4aEJVUjJQSGsxN3pucXZTRUJJQUJFQUFEZy9rSXU1aitnREFFTEFuOGdBRVQrZ2l0bFJ4WDNQNkpFQUFBQUFBQUE0RDhnQUthZ0lnR1pSQUFBQUFBQUFPQkJZd1JBSUFHcURBRUxRWUNBZ0lCNEN5SUZ0eUlDUkhZOGVUWHZPZW85b2lFQklBQWdBa1FBQU9EK1FpN212NktnQ3lJQUlBQWdBYUVpQUtFZ0FhRWhBUXdCQ3lBRlFZQ0F3T1FEU1EwQlFRQWhCUXNnQUNBQVJBQUFBQUFBQU9BL29pSURvaUlDSUFJZ0FpQUNJQUlnQWtRdHd3bHV0LzJLdnFKRU9WTG1oc3JQMEQ2Z29rUzMyNnFlR2M0VXY2Q2lSSVZWL2htZ0FWby9vS0pFOUJBUkVSRVJvYitnb2tRQUFBQUFBQUR3UDZBaUJFUUFBQUFBQUFBSVFDQUVJQU9pb1NJRG9VUUFBQUFBQUFBWVFDQUFJQU9pb2FPaUlRTWdCVVVFUUNBQUlBQWdBNklnQXFHaER3c2dBQ0FESUFHaG9pQUJvU0FDb1NFQkFrQUNRQUpBSUFWQkFXb09Bd0FDQVFJTElBQWdBYUZFQUFBQUFBQUE0RCtpUkFBQUFBQUFBT0Mvb0E4TElBQkVBQUFBQUFBQTBMOWpCRUFnQVNBQVJBQUFBQUFBQU9BL29LRkVBQUFBQUFBQUFNQ2lEd3NnQUNBQm9TSUFJQUNnUkFBQUFBQUFBUEEvb0E4TElBVkIvd2RxclVJMGhyOGhBaUFGUVRsUEJFQWdBQ0FCb1VRQUFBQUFBQUR3UDZBaUFDQUFvRVFBQUFBQUFBRGdmNklnQUNBQ29pQUZRWUFJUmh0RUFBQUFBQUFBOEwrZ0R3dEVBQUFBQUFBQThEOUIvd2NnQld1dFFqU0d2eUlEb1NBQUlBR2hvQ0FBSUFFZ0E2Q2hSQUFBQUFBQUFQQS9vQ0FGUVJOTkd5QUNvaUVBQ3lBQUMxOEJCWDhnQTBFQUlBTkJBRW9iSVFaQkFDRURBMEFnQXlBR1JrVUVRQ0FBSUFOQkFuUWlCV29nQVNBRmFpZ0NBQ0lISUFJZ0JXb29BZ0FpQldzaUNDQUVhellDQUNBRklBZExJQVFnQ0V0eUlRUWdBMEVCYWlFRERBRUxDeUFFQ3k4QkFYOENRQ0FDUVFCSURRQWdBU0FDUVFWMUlnRk5EUUFnQUNBQlFRSjBhaWdDQUNBQ2RrRUJjU0VEQ3lBREM1d0JBUVIvSXdCQkVHc2lBaVFBSUFKQkpUb0FDa0VCSVFNZ0FVR0FBazRFUUNBQ1FmVUFPZ0FMSUFJZ0FVRUlka0VQY1VHRmhnRnFMUUFBT2dBTklBSWdBVUVNZGtFUGNVR0ZoZ0ZxTFFBQU9nQU1RUVFoQXdzZ0FrRUthaUlFSUFOcUlnVWdBVUVQY1VHRmhnRnFMUUFBT2dBQklBVWdBVUVFZGtFUGNVR0ZoZ0ZxTFFBQU9nQUFJQUFnQkNBRFFRSnlFSWdDR2lBQ1FSQnFKQUFMVFFFQmZ3SkFJQUpDZ0lDQWdIQlVEUUFnQXFjaUF5OEJCa0VLUncwQUlBTXBBeUFpQWtJZ2lLY2lBMEVBSUFOQkMycEJFa2tiRFFBZ0FDQUJJQUlRUWc4TElBQkJyVEZCQUJBVlFYOExad0lDZndGK0lBQkJFR29oQXlBQktBSUFJUUlEUUFKQUlBSWdBQ2tDQkNJRXAwSC8vLy8vQjNGT0RRQUNmeUFFUW9DQWdJQUlnMUJGQkVBZ0F5QUNRUUYwYWk4QkFBd0JDeUFDSUFOcUxRQUFDMEVnUncwQUlBRWdBa0VCYWlJQ05nSUFEQUVMQ3d1M0FRSUNmZ1YvUVg4aEJRSkFJQUVvQWdBaUJpQUFLUUlFSWdPblFmLy8vLzhIY1NJSFRnMEFJQUJCRUdvaENDQURRb0NBZ0lBSWd5RUVRZ0FoQXlBR0lRQURRQUpBQWtBZ0FDQUhSZ1JBSUFjaEFBd0JDd0ovSUFSUVJRUkFJQWdnQUVFQmRHb3ZBUUFNQVFzZ0FDQUlhaTBBQUFzaUNVRXdhMEVLU1EwQklBQWdCa1lOQXdzZ0FpQUROd01BSUFFZ0FEWUNBRUVBSVFVTUFnc2dBRUVCYWlFQUlBbXRJQU5DQ241OFFqQjlJUU1NQUFzQUN5QUZDN3NEQVFWL0lBRkZCRUFnQUNBQ1FRUnhRUWh5RU44QkR3dEJmeUVEQWtBQ1FDQUFJQUZCQVdzaUJDQUNFSjRDRFFBZ0FrRjdjU0VGSUFKQkFYRWhCaUFCUVFGcklRY0RRQ0FBS0FJUUlRRUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FIRGdjQUFRSURCQVVHQndzZ0FVRWxSd1JBUVpvQklRSWdBVUVxUmcwSklBRkJMMGNOREVHYkFTRUNEQWtMUWJKL1FaeC9JQUFvQWtBdEFHNUJCSEViSVFJTUNBdEJuUUVoQWtFQUlRTUNRQ0FCUVN0ckRnTUlDZ0FLQzBHZUFTRUNEQWNMSUFGQjZRQnFJZ0ZCQTA4TkNTQUJRZUFBYXlFQ0RBWUxRUUFoQXdKQUFrQUNRQUpBSUFGQjVRQnFEZ01CQ3dJQUN3SkFJQUZCeHdCcURnSUlBd0FMUWFNQklRSUNRQ0FCUVR4ckRnTUpDd0FMQzBHbEFTRUNEQWdMUWFRQklRSU1Cd3RCcGdFaEFnd0dDMEduQVNFQ0RBVUxJQUZCNGdCcUlnRkJCRThOQjBHcDE2cmxlaUFCUVFOMGRpRUNEQVFMUWEwQklRSWdBVUVtUncwR0RBTUxRYTRCSVFJZ0FVSGVBRWNOQlF3Q0MwR3ZBU0VDSUFGQi9BQkhEUVFNQVF0QnFBRWhBaUFHUlEwQ0MwRi9JUU1nQUJBU0RRRWdBQ0FFSUFVUW5nSU5BU0FBSUFKQi93RnhFQkFNQUFzQUN5QUREd3RCQUF0Q0FRRi9JQUJCUUdzaEF3TkFJQUVnQWt4RkJFQWdBRUcxQVJBUUlBTW9BZ0FnQVVILy93TnhFQmNnQXlnQ0FDZ0N6QUVnQVVFRGRHb29BZ0FoQVF3QkN3c0xDUUFnQUVFQUVPRUJDOW9CQVFGL0lBQWdBQ2dDUUNJRElBRUNmd0pBQWtBQ1FBSkFBa0FnQVVFblJnMEFJQUZCelFCR0lBRkJPa1p5UlFSQUlBRkJ4UUJHRFFFZ0FVRXRSdzBDSUFNdEFHeEJBVWNOQWlBQVFZM0ZBRUVBRUJaQmZ3OExJQU10QUc1QkFYRUVRQ0FBUWZEckFFRUFFQlpCZnc4TElBRkJ4UUJIRFFFTElBSkJzMzlHRFFNZ0FrRkZSZzBCSUFKQlUwY2dBa0ZMUjNFTkFpQUFRZXpuQUVFQUVCWkJmdzhMSUFKQnMzOUdEUUlnQWtGRlJnMEFRUUVnQWtGVFJnMERHaUFDUVV0SERRRkJBZ3dEQzBFRkRBSUxFQUVBQzBFR0N4Q2dBVUVmZFF0VEFRUi9JQUFvQXZRQklnSkJBQ0FDUVFCS0d5RUVRUUFoQWdKQUEwQWdBaUFFUmcwQklBRWdBQ2dDL0FFaUJTQUNRUVIwYWlnQ0RFY0VRQ0FDUVFGcUlRSU1BUXNMSUFVZ0FrRUVkR29oQXdzZ0F3c0pBQ0FBUVFJUXV3TUw3d0VCQkg4RFFBSkFJQUlnQTB3TkFDQUJJQU5xSWdVdEFBQWlCa0VDZENJSFFZQzRBV290QUFBaENBSkFBa0FnQmtHMkFVY0VRQ0FHUWNJQlJ3MEJJQVFnQlNnQUFUWUNBQXdDQ3lBQUlBVW9BQUVpQlVFQUVHa05BaUFBS0FLa0FpQUZRUlJzYWlnQ0VFVU5BVUdyZ3dGQnJ2d0FRWWp3QVVITzdRQVFBQUFMSUFkQmc3Z0JhaTBBQUNJR1FSeExEUUJCQVNBR2RDSUdRWUNBZ0J4eFJRUkFJQVpCZ0lDQTRBQnhSUVJBSUFaQmdJQ0FnZ0Z4UlEwQ0lBQWdCU2dBQVVGL0VHa2FEQUlMSUFBZ0JTZ0FCVUYvRUdrYUN5QUFLQUlBSUFVb0FBRVFFd3NnQXlBSWFpRUREQUVMQ3lBREN4b0FJQUJCM2dCQjJBQWdBUnNRRVNBQUlBSkIvLzhEY1JBcUMvd0JBUWQvSXdCQkVHc2lCQ1FBQWtBZ0JFRU1haUFBUWJES0EwRWJFS1FHSWdGQkFFZ05BQ0FCUVpETEEyb2hBaUFFS0FJTUlRRURRQ0FCSVFVZ0FpMEFBQ0lCd0NJSFFRQk9BbjhnQWtFQmFpQUJRVDl4SWdGQk1Fa05BQm9nQVVFSWRDRUdJQUZCTjAwRVFDQUdJQUl0QUFGcVFkRGZBR3NoQVNBQ1FRSnFEQUVMSUFJdEFBSWdCa0dBOEFCcklBSXRBQUZCQ0hSeWFrR3dFR29oQVNBQ1FRTnFDMm9oQWlBQklBVnFRUUZxSWdFZ0FFME5BQXNDUUFKQUFrQWdCMEhBQVhGQkJuWU9Bd0FCQXdJTElBSkJBV3N0QUFBaEF3d0NDeUFDUVFGckxRQUFJQUFnQld0cUlRTU1BUXRCNWdFaEF3c2dCRUVRYWlRQUlBTUxxUWNDQ1g4QmZnSkFBa0FDUUFKL0lBSkJBa3dFUUNBQ0lBRXBBZ1FpREVJK2lLZEdCRUFnQUNBQkVNRUNJZ1JCM1FGS0RRVWdBU0FCS0FJQVFRRnJOZ0lBSUFRUEN5QUFLQUkwSUFBb0FpUkJBV3NnQVNBQ0VMQUZRZi8vLy84RGNTSUhjU0lLUVFKMGFpRURJQXluUWYvLy8vOEhjU0VGQTBBZ0FpQURLQUlBSWdSRkRRSWFBa0FnQUNnQ09DQUVRUUowYWlnQ0FDSURLUUlFSWd4Q0lJaW5RZi8vLy84RGNTQUhSeUFNUWo2SXB5QUNSM0lnREtkQi8vLy8vd2R4SUFWSGNnMEFJQU1nQVNBRkVMc0ZEUUFnQkVIZUFVZ05CQ0FESUFNb0FnQkJBV28yQWdBTUJBc2dBMEVNYWlFRERBQUxBQXNnQWtFRFJ5RUhRUU1MSVFVQ1FDQUFLQUk4RFFCQkFDRUVJQUJCRUdvaUN5QUFLQUk0UWRNQklBQW9BaXhCQTJ4QkFtMGlBaUFDUWRNQlRCc2lBa0VDZENBQUtBSUlFUUVBSWdoRkRRRWdBQ2dDTENJSklRTWdDVVVFUUNBTFFSQWdBQ2dDQUJFREFDSUdSUVJBSUFzZ0NDQUFLQUlFRVFBQURBTUxJQVpDZ0lDQWdJQ0FnSUJBTndJRUlBWkJBVFlDQUNBR1FRQTJBQXdnQ0NBR05nSUFJQUFnQUNnQ0tFRUJhallDS0VFQklRTUxJQUFnQXpZQ1BDQUFJQWcyQWpnZ0FDQUNOZ0lzSUFrZ0FpQUNJQWxKR3lFRUlBSkJBV3NoQmdOQUlBTWdCRVlOQVNBQUtBSTRJQU5CQW5ScVFRRWdBMEVCYWlJQ1FRRjBRUUZ5SUFNZ0JrWWJOZ0lBSUFJaEF3d0FDd0FMQWtBZ0FRUkFJQUVwQWdRaURFTC8vLy8vLy8vLy96OVlCRUFnQVNBTUlBV3RRajZHaERjQ0JBd0NDeUFBUVJCcUlBeW5JZ0pCSDNVZ0FrSC8vLy8vQjNFZ0FrRWZkblJxUVJGcUlBQW9BZ0FSQXdBaUFrVUVRRUVBSVFRTUJBc2dBa0VCTmdJQUlBSWdBaWtDQkVMLy8vLy9kNE1nQVNrQ0JFS0FnSUNBQ0lPRUlndzNBZ1FnQWlBTVFvQ0FnSUI0Z3lBQktRSUVRdi8vLy84SGc0UTNBZ1FnQWtFUWFpQUJRUkJxSUFFb0FnUWlBMEgvLy8vL0IzRWdBMEVmZG5RZ0EwRi9jMEVmZG1vUUh4b2dBQ0FCRVBZRElBSWhBUXdCQ3lBQVFSQnFRUkFnQUNnQ0FCRURBQ0lCUlFSQVFRQVBDeUFCUW9HQWdJQ0FnSUNBZ0g4M0FnQUxJQUFnQUNnQ09DQUFLQUk4SWdSQkFuUnFJZ0lvQWdCQkFYWTJBandnQWlBQk5nSUFJQUVnQkRZQ0RDQUJJQUUxQWdRZ0I2MUNJSWFFSUFXdFFqNkdoRGNDQkNBQUlBQW9BaWhCQVdvMkFpZ2dCVUVEUmcwQ0lBRWdBQ2dDTkNBS1FRSjBhaUlCS0FJQU5nSU1JQUVnQkRZQ0FDQUFLQUlvSUFBb0FqQklEUUlnQUNBQUtBSWtRUUYwRVBJRUdnd0NDeUFCUlEwQkN5QUFJQUVROWdNZ0JBOExJQVFMQ3dBZ0FFSCtIRUVBRURvTEZnQWdBQ0FCUWY4QmNSQVJJQUFnQWtIL0FYRVFFUXVPQkFJSWZ3TitJd0JCTUdzaUJDUUFRb0NBZ0lEZ0FDRU5JQUFnQVJBbElneENnSUNBZ0hDRFFvQ0FnSURnQUZJRVFBSkFJQUFDZmtLQWdJQ0FNQ0FBSUFSQkxHb2dCRUVvYWlBTXB5SUlJQUpCYjNFUWpnRU5BQnBDZ0lDQWdPQUFJQUFRUGlJTlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBYUlBSkJFSEVoQ1NBRUtBSXNJUVVnQkNnQ0tDRUdJQU5CQVdzaENrRUFJUUlDUUFOQUlBSWdCa1lOQXlBRklBSkJBM1JxS0FJRUlRTUNRQUpBSUFrRVFDQUFJQVJCQ0dvZ0NDQURFRXdpQzBFQVNBMEVJQXRGRFFFZ0FDQUVRUWhxRUVnZ0JDZ0NDRUVFY1VVTkFRc0NRQUpBQWtBQ1FDQUtEZ0lCQWdBTElBQWdBeEJjSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRklOQWd3R0N5QUFJQXdnQXlBTVFRQVFGQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVNQlFzZ0FCQStJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQ0FBSUFNUVhDSU9Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSWdBQ0FCUWdBZ0RrR0hnQUVRdlFGQkFFZ05BaUFBSUF3Z0F5QU1RUUFRRkNJT1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJZ0FDQUJRZ0VnRGtHSGdBRVF2UUZCQUVnTkFnc2dBQ0FOSUFldElBRkJBQkRTQVVFQVNBMERJQWRCQVdvaEJ3c2dBa0VCYWlFQ0RBRUxDeUFBSUFFUUR3c2dEUXNRRDBLQWdJQ0E0QUFoRFNBRUtBSW9JUVlnQkNnQ0xDRUZDeUFBSUFVZ0JoQmFJQUFnREJBUEN5QUVRVEJxSkFBZ0RRdlFBZ0VDZnlNQVFSQnJJZ01rQUNBRElBSTNBd2dDUUFKQUlBQWdBUkRLQVNJRVFRQklEUUFnQkVVRVFDQUFRb0NBZ0lBd1FRRWdBMEVJYWhDdUF5RUJEQUlMSUFBZ0FVRThJQUZCQUJBVUlnSkNnSUNBZ0hDRElnRkNnSUNBZ09BQVVRUkFJQUloQVF3Q0N3SkFBa0FnQWtLQWdJQ0FjRm9FZmdKQUlBS25MUUFGUVJCeFJRMEFJQUFnQWhDQUF5SUVSUVJBSUFBZ0FoQVBEQVVMSUFBZ0JFWU5BQ0FBSUFJZ0JDa0RRQkJTUlEwQUlBQWdBaEFQREFJTElBQWdBa0hhQVNBQ1FRQVFGQ0VCSUFBZ0FoQVBJQUZDZ0lDQWdIQ0RJZ0pDZ0lDQWdPQUFVUTBFUW9DQWdJQXdJQUVnQWtLQWdJQ0FJRkViSWdKQ2dJQ0FnSENEQlNBQkMwS0FnSUNBTUZJTkFRc2dBRUtBZ0lDQU1FRUJJQU5CQ0dvUXJnTWhBUXdDQ3lBQUlBSkJBU0FEUVFocUVLY0JJUUVnQUNBQ0VBOE1BUXRDZ0lDQWdPQUFJUUVMSUFOQkVHb2tBQ0FCQ3pNQkFYNGdBQ0FCSUFJZ0FVRUFFQlFpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1IrSUFBZ0JTQUJJQU1nQkJBdkJTQUZDd3NiQVFGK0lBQWdBU0FDSUFNZ0JCQ3NBaUVGSUFBZ0FSQVBJQVVMTEFBZ0FDQUJLUU1JRUNNZ0FDQUJLUU1RRUNNZ0FDQUJLUU1ZRUNNZ0FFRVFhaUFCSUFBb0FnUVJBQUFMMGdRQ0IzOEJmaU1BUVRCcklnVWtBQUovUVFBZ0FVS0FnSUNBY0ZRTkFCcEJBQ0FCcHlJRUx3RUdRVEZIRFFBYUlBUW9BaUFMSVFjZ0JVSUFOd0lvQWtBRFFDQUdRUUpIQkVCQkFDRUVJQUJCSUJCZklnaEZCRUJCZnlFRUlBWkJBVWNOQXlBQUtBSVFJQVVvQWlnUXJnSU1Bd3NEUUNBRVFRSkhCRUFnQXlBRVFRTjBJZ2xxS1FNQUlndENJSWluUVhWUEJFQWdDNmNpQ2lBS0tBSUFRUUZxTmdJQUN5QUlJQWxxSUFzM0F3Z2dCRUVCYWlFRURBRUxDeUFDSUFaQkEzUnFLUU1BSWd0Q2dJQ0FnREFnQUNBTEVEZ2JJZ3RDSUlpblFYVlBCRUFnQzZjaUJDQUVLQUlBUVFGcU5nSUFDeUFJSUFzM0F4Z2dCVUVvYWlBR1FRSjBhaUFJTmdJQUlBWkJBV29oQmd3QkN3c0NRQ0FIS0FJQUlnUkZCRUJCQUNFRUEwQWdCRUVDUmcwQ0lBY2dCRUVEZEdvaUFrRUVhaUlES0FJQUlnWWdCVUVvYWlBRVFRSjBhaWdDQUNJQU5nSUVJQUFnQXpZQ0JDQUFJQVkyQWdBZ0FpQUFOZ0lFSUFSQkFXb2hCQXdBQ3dBTEFrQWdCRUVDUncwQVFRSWhCQ0FIS0FJVURRQWdBQ2dDRUNJQ0tBS1lBU0lEUlEwQUlBQWdBU0FIS1FNWVFRRWdBaWdDbkFFZ0F4RTRBQ0FIS0FJQUlRUUxJQVVnQlVFb2FpQUVRUUZySWdOQkFuUnFLQUlBSWdJcEF3ZzNBd0FnQlNBQ0tRTVFOd01JSUFVZ0Fpa0RHRGNERUVFQUlRUWdCU0FEUVFCSHJVS0FnSUNBRUlRM0F4Z2dCU0FIS1FNWU53TWdJQUJCeXdCQkJTQUZFSm9EQTBBZ0JFRUNSZzBCSUFBb0FoQWdCVUVvYWlBRVFRSjBhaWdDQUJDdUFpQUVRUUZxSVFRTUFBc0FDeUFIUVFFMkFoUkJBQ0VFQ3lBRlFUQnFKQUFnQkFzSkFDQUF2VUkwaUtjTFRBRUVmeUFBS0FJTUlRSURRQUpBSUFFZ0FrY0VmeUFBS0FJUUlBRkJBblJxS0FJQUlnUkZEUUVnQUNnQ0NDQUVhQ0FCSUFKclFRVjBjbW9GUVFBTER3c2dBVUVCYWlFQkRBQUxBQXNNQUNBQUlBRVFpQU5CSDNZTHZnRUJCMzhnQUNnQ0RDSUZJUU1DUUFOQUlBTWlCRVVOQVNBQUtBSVFJZ2tnQkVFQmF5SURRUUowYWlJR0tBSUFSUTBBQ3lBQUlBQW9BZ2dnQkNBRmEwRUZkR28yQWdnZ0JpZ0NBR2NpQndSQVFTQWdCMnNoQlVFQUlRTURRQ0FESUFSR1JRUkFJQWtnQTBFQ2RHb2lCaUFJSUFWMklBWW9BZ0FpQ0NBSGRISTJBZ0FnQTBFQmFpRUREQUVMQ3lBQUlBQW9BZ2dnQjJzMkFnZ0xJQUFnQVNBQ0lBUkJBQkNxQXc4TElBQkJnSUNBZ0hnMkFnZ2dBRUVBRUVFYVFRQUxUZ0lCZndGK0FuNGpBQ0lDSUFBb0FoQW9BbmhKQkVBZ0FCRHBBVUtBZ0lDQTRBQU1BUXNnQUNBQnJTQUJLUU1BUW9DQWdJQXdJQUVvQWdnZ0FTZ0NJRUVFRU5nQkN5RURJQUlrQUNBREN3d0FJQUJCK3N3QVFRQVFGUXNMQUNBQVFjTWFRUUFRRlF2VkFRRURmeU1BUVJCcklnVWtBRUYvSVFNQ1FDQUFLQUlVRFFBQ1FBSkFJQUZCZ0lDQWdBUk9CRUFnQUNnQ0FFSEEyZ0JCQUJCR0RBRUxJQUVnQUNnQ0RFRURiRUVDYlNJRUlBRWdCRW9iSVFFZ0FDZ0NFQ0lFSUFKQmdBSklja1VFUUNBQUlBRVE5UU1oQXd3REN5QUFLQUlBSUFBb0FnUWdBU0FFZENBRWEwRVJhaUFGUVF4cUVLZ0JJZ0lOQVFzZ0FCQ0RBd3dCQ3lBRktBSU1JUU1nQUNBQ05nSUVJQUJCLy8vLy93TWdBeUFBS0FJUWRpQUJhaUlBSUFCQi8vLy8vd05PR3pZQ0RFRUFJUU1MSUFWQkVHb2tBQ0FEQ3hFQUlBQWdBU0FDSUFNZ0JFRUFFTGNGQ3lZQkFYOGdBVUlnaUtkQmRVOEVRQ0FCcHlJQ0lBSW9BZ0JCQVdvMkFnQUxJQUFnQVJCc0N5Y0JBWDhnQVVJQVV3UkFJQUJDQUNBQmZSQXdJUUlnQUVFQk5nSUVJQUlQQ3lBQUlBRVFNQXZzQVFFQmZ3SkFBa0FDUUFKQUFrQUNRQUpBUVFjZ0FrSWdpS2NpQXlBRFFRZHJRVzVKR3lJRERnZ0FBQUFFQkFRRUFRTUxJQUFvQXRnQklRQWdBVUlBTndJTUlBRkNnSUNBZ0lDQWdJQ0FmemNDQkNBQklBQTJBZ0FnQVNBQ3hCQzZBZzBCREFRTElBQW9BdGdCSVFBZ0FVSUFOd0lNSUFGQ2dJQ0FnSUNBZ0lDQWZ6Y0NCQ0FCSUFBMkFnQWdBU0FDUW9DQWdJREFnWUQ4L3dCOHZ4QzZCVVVOQXdzZ0FSQWJRUUFQQ3lBRFFRcHFRUUpKRFFJTElBQW9BdGdCSVFBZ0FVSUFOd0lNSUFGQ2dJQ0FnSUNBZ0lDQWZ6Y0NCQ0FCSUFBMkFnQWdBUkExQ3lBQkR3c2dBcWRCQkdvTDVBRUJCSDhqQUVFUWF5SUNKQUFnQUNBQ1FRaHFJQUVRNVFFaEF5QUFJQUVRRHdKQUlBTkZCRUJDZ0lDQWdPQUFJUUVNQVFzZ0FpQURJQU1RZ1FJaUJHb2lCVFlDREFKQUlBSW9BZ2dnQkVZRVFDQUFRZ0FRaHdJaEFRd0JDeUFBSUFVZ0FrRU1ha0VBQW44Z0FDZ0NFQ2dDakFFaUJBUkFRWVVGSUFRb0FpaEJCSEVOQVJvTFFZVUJDeEM0QWlFQklBSWdBaWdDREJDQkFpQUNLQUlNYWlJRU5nSU1JQUZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FDS0FJSUlBUWdBMnRHRFFBZ0FDQUJFQTlDZ0lDQWdNQitJUUVMSUFBZ0F4QlVDeUFDUVJCcUpBQWdBUXN5QUNBQXZVS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVWlBQW5DQUFZWEVnQUpsRS8vLy8vLy8vUDBObGNRdUlDQUVQZnlNQVFlQUVheUlOSkFBZ0FDQUNFS3dFSVE0Z0FDQUNRWUFCY2hDc0JDRVNBa0FnQWtVZ0FVRUNTWElOQUNBTklBRTJBZ1FnRFNBQU5nSUFJQTFCQURZQ0NFRUFJQUpySVE4Z0RVRU1jaUVKQTBBZ0NTQU5UUTBCUVRJZ0NVRU1heUlKS0FJSUlnd2dERUV5VEJzaEV5QUpLQUlBSVFBZ0NTZ0NCQ0VIQTBBQ1FDQUhRUWRKRFFBZ0RDQVRSZ1JBSUFJZ0Iyd2lCaUFDYXlFS0lBZEJBWFlnQW13aEJ5QUFJQUlRckFRaENBTkFJQWNFUUNBSElBSnJJZ2NoQlFOQUlBVkJBWFFnQW1vaUFTQUdUdzBDSUFFZ0Nra0VRQ0FCSUFKQkFDQUFJQUZxSWdFZ0FTQUNhaUFFSUFNUkFRQkJBRXdiYWlFQkN5QUFJQVZxSWdVZ0FDQUJhaUlNSUFRZ0F4RUJBRUVBU2cwQ0lBVWdEQ0FDSUFnUkJnQWdBU0VGREFBTEFBc0xBMEFnQmlBQ2F5SUdSUVJBUVFBaEJ3d0RDeUFBSUFBZ0Jtb2dBaUFJRVFZQUlBWWdBbXNoQjBFQUlRVURRQ0FGUVFGMElBSnFJZ0VnQms4TkFTQUJJQWRKQkVBZ0FTQUNRUUFnQUNBQmFpSUJJQUVnQW1vZ0JDQURFUUVBUVFCTUcyb2hBUXNnQUNBRmFpSUZJQUFnQVdvaUNpQUVJQU1SQVFCQkFFb05BU0FGSUFvZ0FpQUlFUVlBSUFFaEJRd0FDd0FMQUFzZ0FDQUhRUUoySUFKc0lnVnFJZ1lnQUNBRlFRRjBhaUlCSUFRZ0F4RUJBQ0VLSUFFZ0FDQUZRUU5zYWlJRklBUWdBeEVCQUNFSUFrQWdDa0VBU0FSQUlBaEJBRWdOQVNBRklBWWdCaUFGSUFRZ0F4RUJBRUVBU0JzaEFRd0JDeUFJUVFCS0RRQWdCaUFGSUFZZ0JTQUVJQU1SQVFCQkFFZ2JJUUVMSUF4QkFXb2hEQ0FBSUFFZ0FpQU9FUVlBUVFFaEJpQUFJQUlnQjJ4cUlnZ2hCU0FJSVFvZ0FDQUNhaUlMSVFGQkFTRVFBMEFDUUFKQUlBRWdCVThOQUNBQUlBRWdCQ0FERVFFQUloRkJBRWdOQUNBUkRRRWdDeUFCSUFJZ0RoRUdBQ0FDSUF0cUlRc2dFRUVCYWlFUURBRUxBa0FEUUNBQklBVWdEMm9pQlU4TkFTQUFJQVVnQkNBREVRRUFJaEZCQUV3RVFDQVJEUUVnQ2lBUGFpSUtJQVVnQWlBT0VRWUFJQWRCQVdzaEJ3d0JDd3NnQVNBRklBSWdEaEVHQUF3QkN5QUFJQUVnQ3lBQWF5SUZJQUVnQzJzaUN5QUZJQXRKR3lJRmF5QUZJQklSQmdBZ0FTQUlJQWdnQ21zaUN5QUtJQUZySWdVZ0JTQUxTeHNpQVdzZ0FTQVNFUVlBSUFjZ0Jtc2hBU0FJSUFWcklRVUNRQ0FCSUFZZ0VHc2lCMGtFUUNBQUlRWWdCeUVJSUFVaEFDQUJJUWNNQVFzZ0JTRUdJQUVoQ0FzZ0NTQU1OZ0lJSUFrZ0NEWUNCQ0FKSUFZMkFnQWdDVUVNYWlFSkRBTUxJQUVnQW1vaEFTQUdRUUZxSVFZTUFBc0FDd3NnQUNBQ0lBZHNhaUVISUFBaEJnTkFJQUlnQm1vaUJpRUJJQVlnQjA4TkFRTkFJQUFnQVU4TkFTQUJJQTlxSWdVZ0FTQUVJQU1SQVFCQkFFd05BU0FCSUFVZ0FpQU9FUVlBSUFVaEFRd0FDd0FMQUFzQUN5QU5RZUFFYWlRQUMrb0NBZ1IvQW40akFFRWdheUlESkFBZ0EwS0FnSUNBTURjREdDQURRb0NBZ0lBd053TVFJQU1nQUVIQUFFRUNRUUJCQWlBRFFSQnFFTThCSWdjM0F3Z2dCMEtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFRb0NBZ0lEZ0FDRUhJQUFDZmdKK0lBSkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQWdBa0VBSUFOQkNHb1ErUVVNQVFzZ0FDQUNRUUVnQTBFSWFoQ25BUXNpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBQW45QkFDQURLUU1JSWdoQ2dJQ0FnSEJVRFFBYVFRQWdDS2NpQlM4QkJrRVBSdzBBR2lBRktBSWdDeUVHQTBBZ0JFRUNSZ1JBUVFBaEJBTkFJQVJCQWtjRVFDQUdJQVJCQTNRaUJXb3BBd2dpQjBJZ2lLZEJkVThFUUNBSHB5SUFJQUFvQWdCQkFXbzJBZ0FMSUFFZ0JXb2dCemNEQUNBRVFRRnFJUVFNQVFzTElBSWhCeUFES1FNSURBTUxJQVJCQTNRaEJTQUVRUUZxSVFRZ0FDQUZJQVpxS1FNSUVHQkZEUUFMQ3lBQUlBTXBBd2dRRHlBQ0N4QVBDeUFEUVNCcUpBQWdCd3RGQVFGL0FrQWdBVUdBZ0FGeFJRUkFJQUZCZ0lBQ2NVVU5BU0FBS0FJUUtBS01BU0lCUlEwQklBRXRBQ2hCQVhGRkRRRUxJQUFnQWtIT0hSQ1BBVUYvSVFNTElBTUxnUUVDQW44QmZnSkFJQUVwQWdRaUJFTC8vLy8vLy8vLy83OS9WZ1JBSUFFb0Fnd2hBQXdCQ3lBQUtBSTBJQVJDSUlpbklBQW9BaVJCQVd0eFFRSjBhaUVDSUFBb0FqZ2hBd05BSUFNZ0FpZ0NBQ0lBUVFKMGFpZ0NBQ0lDSUFGR0RRRWdBa0VNYWlFQ0lBQU5BQXRCbVpBQlFhNzhBRUg0RkVIdUh4QUFBQXNnQUF1aUF3SURmd0Y4SXdCQklHc2lCQ1FBQWtBQ1FBSkFJQUpDSUlpbklnVkJBMDhFUUNBRlFRcHFRUUpKQkVBZ0JFRWNhaUFDcDBFRWFpSUZRUUVRcVFFZ0FDZ0MyQUVoQXlBRVFnQTNBaFFnQkVLQWdJQ0FnSUNBZ0lCL053SU1JQVFnQXpZQ0NDQUVRUWhxSWdZZ0JDZ0NIQ0lEclJBd0dpQUdJQVVRZ2dJaEJTQUdFQnNnQUNBQ0VBOGdCVVVOQXd3Q0N5QUZRUWRyUVcxTkJFQUNmeUFDUW9DQWdJREFnWUQ4L3dCOHZ5SUhSQUFBQUFBQUFQQkJZeUFIUkFBQUFBQUFBQUFBWm5FRVFDQUhxd3dCQzBFQUN5SUR1Q0FIWWcwRERBSUxJQU1FUUVGL0lRTWdBQ0FDRUkwQklnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkJDQUFJQVJCSEdvZ0FrRUJFTUlDRFFRZ0JDZ0NIQ0VEREFJTElBQWdCRUVjYWlBQ0VIY0VRQ0FBSUFJUUQwRi9JUU1NQkF0QmZ5RURJQUFnQWhDTkFTSUNRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdBQ0FFUVFScUlBSkJBQkRDQWcwRElBUW9BZ1FpQXlBRUtBSWNSZzBCREFJTElBS25JZ05CQUVnTkFRc2dBU0FETmdJQVFRQWhBd3dCQ3lBQVFlSFlBRUVBRUZCQmZ5RURDeUFFUVNCcUpBQWdBd3VqQkFJRmZ3SitJd0JCRUdzaUF5UUFRUWNnQVVFSWF5SUdLUU1BSWdoQ0lJaW5JZ1FnQkVFSGEwRnVTUnNoQkFKL0FrQUNRQUpBUVFjZ0FVRVFheUlCS1FNQUlnbENJSWluSWdVZ0JVRUhhMEZ1U1JzaUJVRi9SaUFFUVg1eFFRSkhjVVVnQlVGK2NVRUNSaUFFUVg5SGNuRU5BQ0FBSUFOQkNHb2dDU0FJSUFKQkFVRUFFSVVDSWdSRkRRQWdBQ0FKRUE4Z0FDQUlFQThnQkVFQVNBMEJJQUVnQXlrRENEY0RBQXdDQ3lBQUlBa1FiQ0lKUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBSUVBOE1BUXNnQUNBSUVHd2lDRUtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQUFnQ1JBUERBRUxBa0FDUUNBQUtBSVFJZ1VvQW93QklnUUVRQ0FFTFFBb1FRUnhEUUVMSUFsQ0lJaW5JZ2RCZGtjZ0NFSWdpS2NpQkVGMlIzRU5BU0FFSUFkR0RRQWdBQ0FKRUE4Z0FDQUlFQThnQUVHRkxFRUFFQlVNQWdzZ0FDQUNJQUVnQ1NBSUlBVW9BcUFDRVJvQURRRU1BZ3NnQUNBRFFRUnFJQWtRbUFFRVFDQUFJQWdRRHd3QkN5QUFJQU1nQ0JDWUFRMEFJQUVDZndKQUFrQUNRQUpBQWtBQ1FDQUNRYTBCYXc0REFRTUNBQXNDUUNBQ1FhQUJhdzRDQlFBRUN5QURLQUlFSUFNb0FnQjFEQVVMSUFNb0FnQWdBeWdDQkhFTUJBc2dBeWdDQUNBREtBSUVjZ3dEQ3lBREtBSUFJQU1vQWdSekRBSUxFQUVBQ3lBREtBSUVJQU1vQWdCMEM2MDNBd0FNQVFzZ0FVS0FnSUNBTURjREFDQUdRb0NBZ0lBd053TUFRWDhNQVF0QkFBc2hBQ0FEUVJCcUpBQWdBQXVHQlFJSGZ3SitBa0FnQVVLQWdJQ0FjSU5DZ0lDQWdKQi9VZ1JBUW9DQWdJRGdBQ0VLSUFBZ0FSQTNJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BUXNDUUNBQ1FvQ0FnSUJ3ZzBLQWdJQ0FrSDlSRFFCQ2dJQ0FnT0FBSVFvZ0FDQUNFRGNpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBBSUFFaEFnd0JDd0pBSUFLbklnVXBBZ1FpQ2tMLy8vLy9CNE5RRFFBZ0FhY2lBeWtDQkNFTEFrQWdBeWdDQUVFQlJ5QUtJQXVGUW9DQWdJQUlnMElBVW5JTkFDQURJQUFvQWhBb0Fnd1JCQUFnQlNrQ0JDSUtweUlFUWYvLy8vOEhjU0lISUFNcEFnUWlDNmNpQmtILy8vLy9CM0VpQ0dvZ0JFRWZkblFnQmtFZmRpSUpRUkZ6YWtrTkFDQUZRUkJxSVFZZ0EwRVFhaUVFSUFrRVFDQUVJQWhCQVhScUlBWWdCMEVCZEJBZkdpQURJQU1wQWdRaUNpQUZLUUlFZkVMLy8vLy9CNE1nQ2tLQWdJQ0FlSU9FTndJRURBSUxJQVFnQ0dvZ0JpQUhFQjhhSUFNZ0F5a0NCQ0lLSUFVcEFnUjhRdi8vLy84SGd5SUxJQXBDZ0lDQWdIaURoRGNDQkNBRUlBdW5ha0VBT2dBQURBRUxBbjRDUUFKQUlBdW5RZi8vLy84SGNTQUtwMEgvLy8vL0IzRnFJZ2RCZ0lDQWdBUlBCRUFnQUVIQTJnQkJBQkJHREFFTElBQWdCeUFLSUF1RXB5SUdRUjkyRU9vQklnZ05BUXRDZ0lDQWdPQUFEQUVMSUFoQkVHb2hCQUpBSUFaQkFFNEVRQ0FFSUFOQkVHb2dBeWdDQkVILy8vLy9CM0VRSHlJRUlBTW9BZ1JCLy8vLy93ZHhhaUFGUVJCcUlBVW9BZ1JCLy8vLy93ZHhFQjhhSUFRZ0IycEJBRG9BQUF3QkN5QUVJQU1nQXlnQ0JFSC8vLy8vQjNFUXd3VWdCQ0FES0FJRVFRRjBhaUFGSUFVb0FnUkIvLy8vL3dkeEVNTUZDeUFJclVLQWdJQ0FrSCtFQ3lFS0lBQWdBUkFQREFFTElBRWhDZ3NnQUNBQ0VBOGdDZ3RBQUNBQUFuOENmeUFEQkVBZ0FTZ0NKQ0FDUVFOMGFrRUVhZ3dCQzBFQUlBRW9BaUFpQTBVTkFSb2dBeUFCTHdFb0lBSnFRUVIwYWdzb0FnQUxFTmtCQ3cwQUlBQWdBU0FDUVFJUXpnSUxOUUVCZnlNQVFkQUFheUlDSkFBZ0FpQUFLQUlRSUFKQkVHb2dBUkNRQVRZQ0FDQUFRZWY1QUNBQ0VNWUNJQUpCMEFCcUpBQUxvd0VDQVg4QmZpTUFRUkJySWdVa0FDQUZJQVEyQWd4QmZ5RUVJQUFnQVNBRlFReHFFTlFCUlFSQUlBTW9BZ0FpQUVGOGNTQUJJQUlnQXlnQ0JDQUFRUU54UVFKMFFaVEFBV29vQWdBUklBQWhCaUFES0FJQUVPb0ZJQVVvQWd3aUFDQUFLQUlBUWYvLy8vOERjVFlDQUNBRFFvQ0FnSUF3SUFZZ0JrS0FnSUNBY0lOQ2dJQ0FnT0FBVVNJQUd6Y0RBRUYvUVFBZ0FCc2hCQXNnQlVFUWFpUUFJQVFMOVFFQkEzOGpBRUVRYXlJR0pBQWdCaUFBT1FNSUlBWWdBVUVCYXlJSE5nSUFJQVZCZ0FGQitQQUFJQVlRVGhvZ0F5QUZMUUFBUVMxR05nSUFJQVFnQlMwQUFUb0FBQ0FCUVFKT0JFQWdCRUVCYWlBRlFRTnFJQWNRSHhvTElBRWdCR3BCQURvQUFDQUNJUWdnQVNBRmFpQUJRUUZLYWtFQ2FpRUNRUUFoQTBFQUlRUURRQ0FDSWdGQkFXb2hBaUFCTEFBQUlnVVFqZ1lOQUFzQ1FBSkFBa0FnQlVFcmF3NERBUUlBQWd0QkFTRUVDeUFDSVFFTEEwQWdBU3dBQUNJQ0VORUNCRUFnQVVFQmFpRUJJQU5CQ213Z0FtdEJNR29oQXd3QkN3c2dDQ0FEUVFBZ0Eyc2dCQnRCQVdvMkFnQWdCa0VRYWlRQUM1a0hBZ3AvQVg0akFFSHdBR3NpQlNRQUlBQW9BaEFoQmlBRlFnQTNBMWdnQlVJQU53TlFJQVVnQmpZQ1pDQUZRVHMyQW1BQ1FDQUNCSDhnQlNBQ05nSkFJQVZCMEFCcVFkTThJQVZCUUdzUWtnSWdBMEYvUndSQUlBVWdBellDTUNBRlFkQUFha0haK3dBZ0JVRXdhaENTQWdzZ0JVSFFBR3BCQ2hBUklBQWdBVUV4SUFBZ0FoQmlRUU1RR1JvZ0FDQUJRVElnQTYxQkF4QVpHaUFFUVFKeERRRWdBQ2dDRUFVZ0JndEJqQUZxSVFnZ0JFRUJjVVVoQ3dOQUlBZ29BZ0FpQ0VVTkFTQUxSUVJBUVFFaEN3d0JDMEhnaUFFaEFrRUFJUVlDUUNBSUtRTUlJZzlDZ0lDQWdIQlVEUUFnRDZjaUJDZ0NFQ0lEUVRCcUlRY2dBeUFES0FJWVFYOXpRUUowUWFSK2Ntb29BZ0FoQXdOQUlBTkZEUUVnQnlBRFFRRnJRUU4wSWdscUlnb29BZ0FoQXlBS0tBSUVRVFpIQkVBZ0EwSC8vLzhmY1NFRERBRUxDeUFEUWYvLy8vOERTdzBBSUFRb0FoUWdDV29wQXdBaUQwS0FnSUNBY0lOQ2dJQ0FnSkIvVWcwQUlBQWdEeEN6QVNJRFJRMEFJQU5CNElnQklBTXRBQUFiSVFJZ0F5RUdDeUFGSUFJMkFpQWdCVUhRQUdwQjB6d2dCVUVnYWhDU0FpQUFJQVlRVkFKQUlBZ29BZ2dpQWk4QkJoRHVBUVJBSUFJb0FpQWlCeThBRVNJQ1FRdDJRUUZ4SVFvZ0FrR0FDSEZGRFFGQmZ5RUdBa0FnQnlnQ1VDSUNSUTBBSUFnb0FpQWdCeWdDRkVGL2Myb2hEaUFDSUFjb0FreHFJUWtnQnlnQ1JDRUVRUUFoREFOQUlBUWhCaUFDSUFsUERRRWdBa0VCYWlFREFuOGdBaTBBQUNJQ1JRUkFBa0FnQlVIb0FHb2dBeUFKRU80RklnSkJBRWdOQUNBRktBSm9JUTBnQlVIc0FHb2dBaUFEYWlJQ0lBa1E3Z1VpQTBFQVNBMEFJQVVvQW13aUJFRUJka0VBSUFSQkFYRnJjeUFHYWlFRUlBSWdBMm9NQWdzZ0J5Z0NSQ0VHREFNTElBWWdBa0VCYXlJQ1FmOEJjVUVGYmlJTlFYdHNJQUpxUWY4QmNXcEJBV3NoQkNBREN5RUNJQXdnRFdvaURDQU9UUTBBQ3dzZ0JTQUFJQWNvQWtBUWtRUWlBa0h6aUFFZ0FoczJBaEFnQlVIUUFHcEJ3RHdnQlVFUWFoQ1NBaUFBSUFJUVZDQUdRWDlIQkVBZ0JTQUdOZ0lBSUFWQjBBQnFRZG43QUNBRkVKSUNDeUFGUWRBQWFrRXBFQkVNQVF0QkFDRUtJQVZCMEFCcVFhZVNBVUVBRUpJQ0N5QUZRZEFBYWtFS0VCRWdDa1VOQUFzTElBVkIwQUJxUVFBUUVVS0FnSUNBSUNFUElBVW9BbEFoQWlBRktBSmNSUVJBSUFBZ0FoQmlJUThMSUFJRVFDQUZLQUprSUFKQkFDQUZLQUpnRVFFQUdnc2dBQ0FCUVRVZ0QwRURFQmthSUFWQjhBQnFKQUFMcGdFQkEzOGpBRUdnQVdzaUJDUUFJQVFnQUNBRVFaNEJhaUFCR3lJRk5nS1VBVUYvSVFBZ0JDQUJRUUZySWdaQkFDQUJJQVpQR3pZQ21BRWdCRUVBUVpBQkVDc2lCRUYvTmdKTUlBUkJPallDSkNBRVFYODJBbEFnQkNBRVFaOEJhallDTENBRUlBUkJsQUZxTmdKVUFrQWdBVUVBU0FSQVFhRFVCRUU5TmdJQURBRUxJQVZCQURvQUFDQUVJQUlnQTBIakFFSGtBQkNaQkNFQUN5QUVRYUFCYWlRQUlBQUxuUU1EQVg0RGZ3TjhBa0FDUUFKQUFrQWdBTDBpQVVJQVdRUkFJQUZDSUlpbklnSkIvLzgvU3cwQkN5QUJRdi8vLy8vLy8vLy8vd0NEVUFSQVJBQUFBQUFBQVBDL0lBQWdBS0tqRHdzZ0FVSUFXUTBCSUFBZ0FLRkVBQUFBQUFBQUFBQ2pEd3NnQWtILy83Ly9CMHNOQWtHQWdNRC9BeUVEUVlGNElRUWdBa0dBZ01EL0EwY0VRQ0FDSVFNTUFnc2dBYWNOQVVRQUFBQUFBQUFBQUE4TElBQkVBQUFBQUFBQVVFT2l2U0lCUWlDSXB5RURRY3QzSVFRTElBUWdBMEhpdmlWcUlnSkJGSFpxdHlJR1JBQUE0UDVDTHVZL29pQUJRdi8vLy84UGd5QUNRZi8vUDNGQm5zR2Evd05xclVJZ2hvUy9SQUFBQUFBQUFQQy9vQ0lBSUFBZ0FFUUFBQUFBQUFBQVFLQ2pJZ1VnQUNBQVJBQUFBQUFBQU9BL29xSWlCeUFGSUFXaUlnVWdCYUlpQUNBQUlBQkVuOFo0MEFtYXd6K2lSSzk0amgzRmNjdy9vS0pFQlBxWG1abVoyVCtnb2lBRklBQWdBQ0FBUkVSU1B0OFM4Y0kvb2tUZUE4dVdaRWJIUDZDaVJGbVRJcFFrU2RJL29LSkVrMVZWVlZWVjVUK2dvcUNnb2lBR1JIWThlVFh2T2VvOW9xQWdCNkdnb0NFQUN5QUFDdzhBSUFBZ0FVS0FnSUNBTUJDL0Fnc21BUUYvSXdCQkVHc2lCQ1FBSUFRZ0FqWUNEQ0FBSUFNZ0FTQUNFSklFSUFSQkVHb2tBQXVaQVFFRGZDQUFJQUNpSWdNZ0F5QURvcUlnQTBSODFjOWFPdG5sUGFKRTY1d3JpdWJsV3I2Z29pQURJQU5FZmY2eFYrTWR4ejZpUk5WaHdSbWdBU3Evb0tKRXB2Z1FFUkVSZ1QrZ29DRUZJQU1nQUtJaEJDQUNSUVJBSUFRZ0F5QUZva1JKVlZWVlZWWEZ2NkNpSUFDZ0R3c2dBQ0FESUFGRUFBQUFBQUFBNEQraUlBVWdCS0tob2lBQm9TQUVSRWxWVlZWVlZjVS9vcUNoQzVJQkFRTjhSQUFBQUFBQUFQQS9JQUFnQUtJaUFrUUFBQUFBQUFEZ1A2SWlBNkVpQkVRQUFBQUFBQUR3UHlBRW9TQURvU0FDSUFJZ0FpQUNSSkFWeXhtZ0Fmbytva1IzVWNFV2JNRld2NkNpUkV4VlZWVlZWYVUvb0tJZ0FpQUNvaUlESUFPaUlBSWdBa1RVT0lpKzZmcW92YUpFeExHMHZaN3VJVDZnb2tTdFVweUFUMzZTdnFDaW9LSWdBQ0FCb3FHZ29Bc0tBQ0FBUVRCclFRcEpDNDBCQUNBQUlBQWdBQ0FBSUFCRUNmZjlEZUU5QWoraVJJaXlBWFhnNzBrL29LSkVPNDlvdFNpQ3BMK2dva1JWUklnT1ZjSEpQNkNpUkgxdjZ3TVMxdFMvb0tKRVZWVlZWVlZWeFQrZ0lBQ2lJQUFnQUNBQUlBQkVncEl1c2NXNHN6K2lSRmtCalJ0c0J1YS9vS0pFeUlwWm5PVXFBRUNnb2tSTExZb2NKem9Ed0tDaVJBQUFBQUFBQVBBL29LTUxxd0lCQ0g4akFFRXdheUlFSkFBZ0FrRUhjU0VKSUFBb0FnQWlCVUVJYWlFR1FTQWhCd05BSUFVb0Fod2lBeUFCSUFkcUlnaEpCRUFDUUNBRktBSVVCRUFnQmlnQ0FDRUREQUVMSUFBb0FnQWhBeUFGUWdBM0FoUWdCVUtBZ0lDQWdJQ0FnSUIvTndJTUlBVWdBellDQ0FzZ0JFSUFOd0lvSUFSQ2dJQ0FnSUNBZ0lDQWZ6Y0NJQ0FFSUFNMkFod2dCRUlBTndJVUlBUkNnSUNBZ0lDQWdJQ0FmemNDRENBRUlBTTJBZ2dnQmlBRVFSeHFJZ29nQkVFSWFpSURRUUFnQ0VFUGFrRURia0VCYWtFQUVLQUVJQVlnQmlBRElBaEJBQkNWQVJvZ0NoQWJJQU1RR3lBRklBZzJBaHdnQ0NFREN5QUFJQVlRUkJvZ0FFRUFOZ0lFSUFBZ0FTQUpJQU1RNFFORkJFQWdCMEVCZGlBSGFpRUhEQUVMQ3lBQUlBRWdBaERPQVJvZ0JFRXdhaVFBQzFjQkFuOGpBRUVnYXlJRkpBQWdBQ2dDQUNFR0lBVkNBRGNDR0NBRlFvQ0FnSUNBZ0lDQWdIODNBaEFnQlNBR05nSU1JQVZCREdvaUJpQUNFTG9DR2lBQUlBRWdCaUFESUFRUVF4b2dCaEFiSUFWQklHb2tBQXNlQUNBQkJFQWdBQ2dDQUNJQUtBSUFJQUZCQUNBQUtBSUVFUUVBR2dzTEVBQWdBYTBnQUsxK0lBSWdBeENvQkF0aUFRRi9Jd0JCSUdzaUJpUUFBa0FDUUNBRElBVWdBeUFGU0J0QjVBQk9CRUFnQmlBQk5nSWNRWDhoQVNBQUlBWkJER29nQWlBRElBUWdCVUVFRUo4R1JRMEJEQUlMSUFFZ0FpQURJQVFnQlJDZUJndEJBQ0VCQ3lBR1FTQnFKQUFnQVF0UUFRSi9JQUpCQUNBQ1FRQktHeUVDQWtBRFFDQUNJQVJHRFFFZ0FDQUVRUUowYWlJRElBTW9BZ0FpQXlBQmF6WUNBQ0FFUVFGcUlRUWdBU0FEU3lFRFFRRWhBU0FERFFBTFFRQWhBUXNnQVF0VEFRRi9JQUVnQUNnQ0JDSUNTZ1JBSUFBb0Fnd2dBQ2dDQ0NBQklBSkJBMnhCQW0waUFpQUJJQUpLR3lJQlFRSjBJQUFvQWhBUkFRQWlBa1VFUUVGL0R3c2dBQ0FCTmdJRUlBQWdBallDQ0F0QkFBdFpBUU4vUVg4aEFTQUFJQUFvQWdBaUFrRUNhaUlERU5rQ0JIOUJmd1VnQUNnQ0NDSUJRUVJxSUFFZ0FrRUNkQ0lDRUp3QklBQW9BZ2dpQVVFQU5nSUFJQUVnQW1wQmZ6WUNCQ0FBSUFNMkFnQWdBQkNpQmtFQUN3dWxBZ0VGZndOQUFrQUNRQUpBQWtBQ2Z5QUNJQWRNSWdrZ0JDQUdUSEpGQkVBZ0FTQUhRUUowYWlnQ0FDSUlJQU1nQmtFQ2RHb29BZ0FpQ1VrRVFDQUlEQUlMSUFnZ0NVY05BeUFHUVFGcUlRWWdCMEVCYWlFSElBZ2hDUXdFQ3lBSkRRRWdBU0FIUVFKMGFpZ0NBQXNoQ1NBSFFRRnFJUWNNQWdzZ0JDQUdUQTBDSUFNZ0JrRUNkR29vQWdBaENRc2dCa0VCYWlFR0N3Si9Ba0FDUUFKQUFrQWdCUTREQXdBQkFnc2dCaUFIY1VFQmNRd0RDeUFHSUFkelFRRnhEQUlMRUFFQUN5QUdJQWR5UVFGeEN5RUtJQW9nQUNnQ0FDSUlRUUZ4UmcwQklBQW9BZ1FnQ0V3RVFDQUFJQWhCQVdvUTJRSUVRRUYvRHdzZ0FDZ0NBQ0VJQ3lBQUlBaEJBV28yQWdBZ0FDZ0NDQ0FJUVFKMGFpQUpOZ0lBREFFTEN5QUFFS0lHUVFBTGF3SUJmZ0ovSUFBb0FnQWhBd05BSUFNdEFBQWlCRUU2YTBIL0FYRkI5Z0ZQQkVBZ0FrSUtmaUFFclVML0FZTjhRakI5SWdKQy8vLy8vd2RVSWdRZ0FYSUVRQ0FDUXYvLy8vOEhJQVFiSVFJZ0EwRUJhaUVEREFJRlFYOFBDd0FMQ3lBQUlBTTJBZ0FnQXFjTFpBRUJmd0pBSUFGQ0lJaW5JZ0pGSUFKQkMycEJFVXR5RFFBQ1FDQUJRb0NBZ0lCd1ZBMEFJQUduSWdJdkFRWkJCRWNOQUNBQ0tRTWdJZ0ZDSUlpbklnSkZJQUpCQzJwQkVVdHlEUUVMSUFCQjlzY0FRUUFRRlVLQWdJQ0E0QUFoQVFzZ0FRc1JBQ0FBSUFFZ0FpQURRUUJCQUJDQ0FRdStBUUlHZndKK0lBRW9BZ0FpQXlBQUtRSUVJZ21uUWYvLy8vOEhjU0lFSUFNZ0JFb2JJQU5ySVFjZ0FFRVFhaUVGSUFOQkFtb2hDQ0FKUW9DQWdJQUlneUVLUVFBaEFFSUFJUWtDUUFOQUlBQkJBa2NFUUVGL0lRWWdBQ0FIUmcwQ0FuOGdDbEJGQkVBZ0JTQURRUUYwYWk4QkFBd0JDeUFESUFWcUxRQUFDeUlFUVRCclFRbExEUUlnQUVFQmFpRUFJQU5CQVdvaEF5QUVyU0FKUWdwK2ZFSXdmU0VKREFFTEN5QUNJQWszQXdBZ0FTQUlOZ0lBUVFBaEJnc2dCZ3VhQXdNQ2ZBTi9BWDRDZnlBQUt3TUlJZ0pFQUFBQUFBQUFLRUFRamdNaUE1bEVBQUFBQUFBQTRFRmpCRUFnQTZvTUFRdEJnSUNBZ0hnTElnUkJER29nQkNBRVFRQklHeUlFUVFCS0lRWWdCRUVBSUFZYklRWUNmaUFBS3dNQUlBSkVBQUFBQUFBQUtFQ2puS0FpQXBsRUFBQUFBQUFBNEVOakJFQWdBckFNQVF0Q2dJQ0FnSUNBZ0lDQWZ3c2lCeERNQkxraEFnTkFJQVVnQmtaRkJFQWdCVUVDZEVHUTBnRnFLQUlBSVFRZ0JVRUJSZ1JBSUFRZ0J4RExCS2RxUWUwQ2F5RUVDeUFGUVFGcUlRVWdBaUFFdDZBaEFnd0JDd3NnQWlBQUt3TVFSQUFBQUFBQUFQQy9vS0JFQUFBQUFIQ1psRUdpSUFBckF6QWdBQ3NES0VRQUFBQUFBRUNQUUtJZ0FDc0RHRVFBQUFBQVFIZExRYUlnQUNzRElFUUFBQUFBQUV6dFFLS2dvS0NnSVFJZ0FRUkFJQUlDZmlBQ21VUUFBQUFBQUFEZ1EyTUVRQ0FDc0F3QkMwS0FnSUNBZ0lDQWdJQi9DeEM0QTBIZzFBTnN0NkFoQWdzZ0FwMUVBQUFBQUFBQUFBQ2dSQUFBQUFBQUFQaC9JQUpFQUFEY3dnaXlQa05sRzBRQUFBQUFBQUQ0ZnlBQ1JBQUEzTUlJc2o3RFpoc0xkZ0VDZnlBQktBSUFRUUJJQkVBZ0FTQUFRVUJyS0FJQUVESTJBZ0FMSUFCQkVSQVFJQUJCc0FFUUVDQUNRUUFnQWtFQVNoc2hBaUFBUWVrQVFYOFFIQ0VFQTBBZ0FpQURSa1VFUUNBQVFRNFFFQ0FEUVFGcUlRTU1BUXNMSUFCQkJoQVFJQUJCNndBZ0FTZ0NBQkFjR2lBQUlBUVFIZ3RQQVFGL1FYOGhBUUpBSUFCQit3QVFMQTBBSUFBb0FoQkIvUUJIQkVBZ0FCQ0FBUm9EUUNBQVFRY1E0UUVOQWlBQUtBSVFRZjBBUncwQUN5QUFFUE1CQzBGL1FRQWdBQkFTR3lFQkN5QUJDMmdBSUFBZ0FTQUNFRThpQUVFQVRnUkFJQUVvQW5RZ0FFRUVkR29pQWlBQ0tBSU1RWWQvY1NBRFFRTjBRZmdBY1hJMkFnd2dBaUFCS0FLOEFTSUROZ0lFSUFJZ0FTZ0N3QUUyQWdnZ0FTZ0N6QUVnQTBFRGRHb2dBRFlDQkNBQklBQTJBc0FCQ3lBQUMyMEJBWDhnQUNBQlFmd0Jha0VRSUFGQitBRnFJQUVvQXZRQlFRRnFFSGhGQkVBZ0FTQUJLQUwwQVNJRFFRRnFOZ0wwQVNBQktBTDhBU0FEUVFSMGFpSURRWDgyQWdBZ0F5QURMUUFFUWZnQmNUb0FCQ0FESUFFb0Fyd0JOZ0lJSUFNZ0FDQUNFQmcyQWd3TElBTUx4Z01CQkg4Z0FFRkFheUlGS0FJQVFiQUNhaUVEQTBCQkFDRUNBa0FEUUNBREtBSUFJZ05GRFFFZ0F5Z0NIQVJBSUFGRkJFQWdBRUVHRUJBTElBQkJoQUVRRUVHREFTRUNJQUFnQlNnQ0FDMEFiRUVEUmdSL0lBQkJEaEFRSUFCQkRoQVFJQUJCd2dBUUVDQUFRUVlRR2lBQVFSRVFFQ0FBUWJBQkVCQWdBRUhxQUVGL0VCd2hBU0FBUVNRUUVDQUZLQUlBUVFBUUZ5QUFRWUVCRUJBZ0FFR0xBUkFRSUFCQjZ3QkJmeEFjSVFRZ0FDQUJFQjRnQUVFT0VCQWdBQ0FFRUI1QkRnVkJnd0VMRUJCQmZTRUNRUUVoQVFzZ0F5Z0NFQ0FDYWlFQ0lBTW9BaFJCZjBZTkFBdEJEMEVPSUFFYklRUURRQ0FDQkVBZ0FDQUVFQkFnQWtFQmF5RUNEQUVMQ3lBQlJRUkFJQUJCQmhBUUN5QUFRZTBBSUFNb0FoUVFIQnBCQVNFQkRBRUxDd0pBSUFCQlFHc29BZ0FpQWlnQ1lBUkFBa0FnQVVVRVFFRi9JUUlNQVFzZ0FFRXFFQkFnQUVIcEFFRi9FQndoQWlBQVFRNFFFQXNnQUVHNEFSQVFJQUJCQ0JBYUlBQkJRR3NvQWdCQkFCQVhJQUFnQWhBZVFTZ2hBZ3dCQ3lBQ0xRQnNJZ01FUUNBQlJRUkFJQUJCQmhBUVFTNGhBZ3dDQzBFdUlRSWdBMEVEUncwQklBQkJpd0VRRUF3QkMwRW9RU2tnQVJzaEFnc2dBQ0FDRUJBTFhRRUNmd0pBQWtBZ0FDZ0NtQUlpQVVFQVNBMEFJQUFvQW9BQ0lBRnFMUUFBSWdCQkkyc2lBVUVOVFVFQVFRRWdBWFJCNWZBQWNSc05BUUpBSUFCQjZ3QnJEZ1FDQVFFQ0FBc2dBRUhzQVd0QkFra05BUXRCQVNFQ0N5QUNDeThBSUFBZ0FTQUNJQU1RNHdJaUFFRUFUZ1JBSUFFb0FuUWdBRUVFZEdvaUFTQUJLQUlNUVFOeU5nSU1DeUFBQ3k0QUlBQkJEQkFwSWdBRVFDQUFJQU0yQWdnZ0FDQUNOZ0lFSUFBZ0FTZ0NFRFlDQUNBQklBQTJBaEFMSUFBTGF3RUJmd0pBSUFFb0FxQUJJZ05CQUU0TkFDQUFJQUVnQWhCUElnTkJBRWdOQUNBQklBTTJBcUFCSUFOQkJIUWlBQ0FCS0FKMGFpSUNJQUlvQWd4QmgzOXhRU0J5TmdJTUlBRXRBRzVCQVhGRkRRQWdBU2dDZENBQWFpSUFJQUFvQWd4QkFYSTJBZ3dMSUFNTExnRUJmd0pBSUFFb0FwZ0JJZ0pCQUU0TkFDQUFJQUZCelFBUVR5SUNRUUJJRFFBZ0FTQUNOZ0tZQVFzZ0FndVlBUUVFZnlBQktBSVVJZ1ZCQUNBRlFRQktHeUVHSUFGQkVHb2hCQUpBQTBBZ0F5QUdSd1JBSUFRb0FnQWdBMEVEZEdvb0FnQWdBa1lOQWlBRFFRRnFJUU1NQVFzTFFYOGhBeUFBSUFSQkNDQUJRUmhxSUFWQkFXb1FlQTBBSUFFZ0FTZ0NGQ0lFUVFGcU5nSVVJQUVvQWhBaEF5QUFJQUlRR0NFQklBTWdCRUVEZEdvaUFFRUFOZ0lFSUFBZ0FUWUNBQ0FHSVFNTElBTUxaUUVCZnlBQVFmb0FFRXBGQkVBZ0FFR2Q5d0JCQUJBV1FRQVBDd0pBSUFBUUVnMEFJQUFvQWhCQmdYOUhCRUFnQUVHTjl3QkJBQkFXUVFBUEN5QUFLQUlBSUFBcEF5QVFNU0lCUlEwQUlBQVFFa1VFUUNBQkR3c2dBQ2dDQUNBQkVCTUxRUUFMNEJNQkdIOGpBRUhRQUdzaUJDUUFJQUJCUUdzb0FnQWhCU0FBS0FJQUlRY2dCRUVBTmdJOElBQW9BaGdoRWlBRklBVXRBRzRpRlVFQmNqb0FiZ0ovQWtBQ1FDQUFFQklOQUFKQUFrQWdBQ2dDRUVHRGYwWUVRQ0FBS0FJb1JRMEJJQUFRNGdFTUF3c2dBU0FDUVFKR2NnMEJJQUJCeHVnQVFRQVFGZ3dDQ3lBSElBQW9BaUFRR0NFSklBQVFFZzBDQ3lBQlJRUkFJQWNnQ1VIOEFDQUpHeEFZSVFzTElBQVFnQUVhQW44Z0FDZ0NFQ0lPUVU1R0JFQWdBQkFTRFFNZ0FCQ2pBZzBEUVFFTUFRc2dBRUVHRUJCQkFBc2hBU0FKQkVBZ0FDQUZJQWxCQWhDZ0FVRUFTQTBDQ3lBQVFmc0FFQ3dOQVNBT1FVNUdJUllnQUJDQUFSb2dBRUVDRUJBZ0JTZ0NoQUloRnlBQVFVQnJJZ01vQWdCQkFCQTVJQUJCMWdBUUVDQUFJQWxCRmtFdklBc2JJQWtiRUJvZ0F5Z0NBQ0FCRUdRZ0JTZ0NtQUloR0VFQUlRTURRQ0FEUVFKR1JRUkFJQVJCRUdvZ0EwRUVkR29pQVVFQU5nSUlJQUZDQURjREFDQURRUUZxSVFNTUFRc0xJQVJCQURZQ05FRUlRUWNnRGtGT1Joc2hFeUFPUVU1SElSa2dBRUZBYXlFS0EwQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNmd0ovQWtBZ0FDZ0NFQ0lEUVR0SEJFQWdBMEg5QUVZTkJFRUFJQU5CV0VjTkFob2dBQkFTUlEwQkRBd0xRUUFoQXlBQUVCSkZEUXdNRGdzQ1FBSkFJQUFvQWhCQk8yc09Bd0FCQUFFTFFTd2hBU0FFUVN3MkFqd2dBQ2dDR0NFUlFRQWhEMEVBSVFaQkFBd0NDeUFBUVJzUUVFRUJDeUVQSUFBb0FoZ2hFU0FBSUFSQlBHcEJBVUVBUVFFUXhBTWhCaUFFS0FJOElRRWdCa0VBU0EwRUlBTkJXRVlMSVJCQlBDRURBa0FnQVVFOFJ5QVFjaUlhUVFFZ0JrRnZjU0lOR3dSQUlBRkJPMFlnRUhGRklBRkIrQUJIY1EwQklBRWhBd3NnQUVHSzZBQkJBQkFXREF3TElBWkJFSEVoREFKQUFrQUNRQ0FHUVc1eFFRSkdCRUFnREVVTkJpQUZJQUVnQlNnQ3ZBRVF3d01pQTBFQVRnUkFJQVVvQW5RZ0EwRUVkR29pQmlnQ0RDSUlRUU4yUVE5eElnTkJDVTFCQUVFQklBTjBRZUFFY1JzZ0F5QU5RUVZxUm5JTkFpQUdJQWhCaDM5eFFjZ0FjallDREF3R0N5QUFLQUlBSUFVZ0FTQU5RUVZxRU9jQ1FRQk9EUVVNQnd0QkJpRVVRUUVoQTBFQUlRaEJBQ0VHQWtBQ1FBSkFBa0FDUUFKQUlBME9Cd0FDQWdJRkF3RUNDeUFBS0FJUVFTaEdEUUVnQVVFN2EwRUJUUVJBSUFCQnMrZ0FRUUFRRmd3TUN5QU1CRUFnQlNBQklBVW9BcndCRU1NRFFRQk9EUVlnQUNnQ0FDQUZJQUZCQlJEbkFrRUFTQTBNSUFCQkJSQVFJQUFnQVJBYUlBQkJ2UUVRRUNBQUlBRVFHaUFLS0FJQUlnTWdBeThCdkFFUUZ3c2dCRUVRYWlBUFFRUjBhaUlJS0FJQVJRUkFJQUFnQ0JEZUJBME1DeUFCUlFSQUlBUWdDQ2dDQkRZQ0FDQUVRVUJySWdaQkVFSGNJaUFFRUU0YVFRQWhBeUFIUWZVQVFmUUFJQkFiSUFZUTRRUWlCa1VORkNBQUlBVWdCa0VDRUtBQlFRQklCRUFnQnlBR0VCTU1GUXNnQUVId0FCQVFJQUJCdlFFUUVDQUFJQVlRR2lBS0tBSUFJZ01nQXk4QnZBRVFGd3NnQ2lBSUtBSUFOZ0lBSUFCQnVBRVFFQ0FBUVFnUUdpQUtLQUlBUVFBUUZ3SkFJQUZGQkVBZ0FFRzRBUkFRSUFBZ0JoQWFJQW9vQWdBaUF5QURMd0c4QVJBWElBZ2dDQ2dDQkVFQmFqWUNCQ0FISUFZUUV3d0JDeUFNUlEwQUlBQkJ1QUVRRUNBQUlBRVFHaUFLS0FJQUlnTWdBeThCdkFFUUZ3c0NRQ0FBS0FJUVFUMUdCRUFnQUJBU0RRMGdBQkJXRFEwTUFRc2dBRUVHRUJBTEFrQWdEQVJBSUFBUXdnTWdBRUhHQUJBUURBRUxJQUZGQkVBZ0FCRENBeUFBUWRFQUVCQWdBRUVPRUJBTUFRc2dBQ0FCRUtFQklBQkJ6QUFRRUNBQUlBRVFHZ3NnQ2lBS0tBSUFLQUlFTmdJQUlBQVF0d0VOQ3d3UEMwRURJUU1NQWd0QkFDRURJQm9FUUF3Q0N5QVdJUWdnR1NFR0lCTWhGQ0FFS0FJMFJRMENJQUJCaVBBQVFRQVFGa0U4SVFNTUVRdEJBaUVEQ3dzZ0RBUkFJQUFnQkVFUWFpQVBRUVIwYWhEZEJFRUFTQTBIQ3lBQUlCUWdBeUFSSUFBb0FoUkJBQ0FFUVRocUVQZ0JEUVlnQmlBSWNrRUJSZ1JBSUFRZ0JDZ0NPRFlDTkF3TEN5QU1SUTBDSUFRb0FqaEJBVFlDdUFFZ0JTQUJJQVVvQXJ3QkVNTURRUUJJRFFFTElBQkJ3UGtBUVFBUUZnd0ZDeUFBS0FJQUlBVWdBVUVHRU9jQ1FRQklEUVFnQUVIUUFCQVFJQUJCelFBUUVDQUFJQUVRR2lBQVFiMEJFQkFnQUNBQkVCb2dDaWdDQUNJRElBTXZBYndCRUJjTUNBc0NRQ0FCUlFSQUlBQkIxUUFRRUF3QkN5QUFRZFFBRUJBZ0FDQUJFQm9MSUFvb0FnQkJBQkJrREFjTElBUW9BalFpQTBVRVFDQUVJQUFvQWdRMkFrQWdCQ0FBS0FJVUlnWTJBa1FnQkNBQUtBSVlOZ0pNSUFRZ0FDZ0NNRFlDU0NBQVFhVVpRYUFaSUE1QlRrWWlBUnNpQXpZQ09DQUFLQUk4SVFnZ0FDQURRUmhCQkNBQkcybzJBanhCZnlFQklBQVFFa1VFUUNBQUlCTkJBQ0FESUFaQkFDQUVRVFJxRVBnQklRRUxJQUFnQ0RZQ1BFRUFJUU1nQUNBRVFVQnJFTzRDSUFGeURRc2dCQ2dDTkNFREN5QUZLQUtBQWlBWGFpQURLQUlJTmdBQUlBVXRBRzVCQW5GRkJFQWdCeWdDRUNJQlFSQnFJQU1vQW93RElBRW9BZ1FSQUFBZ0JDZ0NOQ0FBS0FJNElCSnJJZ0UyQXBBRElBY2dFaUFCRUlFRElRRWdCQ2dDTkNBQk5nS01BeUFCUlEwSUMwRUFJUU1nQUJBU0RRb2dBQ0FGUWZZQVFRSVFvQUZCQUVnTkNnSkFJQVFvQWhBRVFDQUFJQVJCRUdvUTNBUU1BUXNnQUVFR0VCQUxJQUJCdlFFUUVDQUFRZllBRUJvZ0FFRkFheUlCS0FJQUlnTWdBeThCdkFFUUZ5QUFRUTRRRUNBRUtBSWdCRUFnQUVFUkVCQWdBQ0FFUVNCcUVOd0VJQUJCSkJBUUlBRW9BZ0JCQUJBWElBQkJEaEFRQ3lBSkJFQWdBRUVSRUJBZ0FFRzlBUkFRSUFBZ0NSQWFJQUJCUUdzb0FnQWdCUzhCdkFFUUZ3c2dBQkR6QVNBQUVQTUJBa0FnQ3dSQVFRQWhBeUFBSUFVZ0MwRUJFS0FCUVFCSURRd2dBRUc5QVJBUUlBQWdDeEFhSUFCQlFHc29BZ0FnQlM4QnZBRVFGd3dCQ3lBSkRRQWdBRUhCQVJBUUlBQkJRR3NvQWdBZ0JTZ0NtQUlnR0d0QkFXb1FPUXRCQUNBQ1JRMExHa0VBSWdNZ0FDQUZLQUtVQXlBTFFSWWdDeUFDUVFGSEcwRUFFUGNCRFFzYURBb0xJQUFnQkVFUWFpQVBRUVIwYWhEZEJFRUFTQTBCQ3lBQUlBMUJBbXBCQUNBUklBQW9BaFJCQUNBRVFVQnJFUGdCRFFBZ0RFVU5BeUFFS0FKQVFRRTJBcmdCSUFCQjBBQVFFQ0FBUWIwQkVCQWdEVUVDUmcwQklBY2dBUkRuQkNJRFJRMEFJQUFnQXhBYUlBQW9BZ0FnQlNBRFFRZ1E1d0loQmlBSElBTVFFeUFHUVFCT0RRSUxJQUVoQXd3SEN5QUFJQUVRR2dzZ0NpZ0NBQ0lESUFNdkFid0JFQmNNQVFzQ1FDQUJSUVJBSUFCQjFRQVFFQXdCQ3lBQVFkUUFFQkFnQUNBQkVCb0xJQW9vQWdBZ0RVRUJhMEgvQVhFUVpBc2dFQVJBSUFCQkd4QVFDeUFISUFFUUV5QUVRUUEyQWp3TUFRc0xRUUFoQXd3QkN3c2dCeUFERUJOQmZ3c2hBeUFISUFrUUV5QUhJQXNRRXlBRklCVTZBRzRnQkVIUUFHb2tBQ0FEQ3k0QUlBQWdBU2dDQURZQ0ZDQUFJQUVvQWdRMkFnZ2dBQ0FCS0FJTU5nSTRJQUFnQVNnQ0NEWUNNQ0FBRUJJTEt3QWdBRUgvQUUwRVFDQUFRUU4yUWZ6Ly8vOEJjVUdRZ1FKcUtBSUFJQUIyUVFGeER3c2dBQkM1QXdzdUFRRi9Ba0FnQVVLQWdJQ0FjRlFOQUNBQnB5SUNMd0VHUVJKSERRQWdBa0VnYWc4TElBQkJFaENHQTBFQUMyY0NBWDhCZmlNQVFSQnJJZ01rQUFKK0FrQUNRQ0FDUlEwQUlBQXBBZ1FpQkVMLy8vLy9CNE1nQVZjTkFDQUVRb0NBZ0lBSWcwSUFVZzBCQ3lBQlFnRjhEQUVMSUFNZ0FUNENEQ0FBSUFOQkRHb1F5UUVhSUFNMEFnd0xJUUVnQTBFUWFpUUFJQUVMemdFQkJIOENRQ01BSWdVZ0FDZ0NRQ2dDRUNnQ2VFa0VRQ0FBUVkwaVFRQVFPa0YvSVFRTUFRc2dBQ2dDQkNFRFFYOGhCQ0FBSUFFUXJRWU5BQU5BSUFBb0FoZ2lBaTBBQUVIOEFFY0VRRUVBSVFRTUFnc2dBQ0FDUVFGcU5nSVlJQUFvQWdRaEFpQUFJQU5CQlJEd0FRUkFJQUFRcUFJTUFnc2dBQ2dDQUNBRGFrRUpPZ0FBSUFBb0FnQWdBMm9nQWlBRGEwRUZhallBQVNBQVFRZEJBQkM0QVNFQ0lBQWdBUkN0QmcwQklBQW9BZ0FnQW1vZ0FDZ0NCQ0FDYTBFRWF6WUFBQXdBQ3dBTElBVWtBQ0FFQzVFR0FRWi9Jd0JCSUdzaUJ5UUFJQWNnQXpZQ0hBSi9Ba0FnQUNnQ0FDQUhRUVJxUVNBUVBRMEFJQUZCNEFCSElRc0RRQUpBQWtBQ1FBSkFJQU1nQUNnQ1BDSUtUdzBBQWtBZ0F5MEFBQ0lHUVI5TERRQWdBQ2dDUUVVRVFFR3Yyd0FoQmlBQ0RRTU1Cd3NnQzBVRVFDQUdRUTFIRFFGQkNpRUdJQU5CQVdvZ0F5QURMUUFCUVFwR0d5RUREQUVMSUFaQkNtc09CQUVBQUFFQUN5QUhJQU5CQVdvaUNEWUNIQUpBQWtBQ1FBSkFBa0FnQVNBR1J3UkFJQVpCM0FCR0RRRWdCa0VrUncwQ1FTUWhCaUFMRFFrZ0NDMEFBRUg3QUVjTkNTQURRUUpxSVFoQkpDRUJDeUFFUVlGL05nSUFJQVFnQVRZQ0dDQUVJQWRCQkdvUU5qY0RFQ0FGSUFnMkFnQkJBQXdMQzBFQklRWUNRQUpBQWtBQ1FDQUlMUUFBSWdsQkNtc09CQUlEQXdFQUN5QUpRZHdBUmlBSlFTSkdjaUFKUVNkR2NnMEVJQWtOQWlBSUlBcFBEUWNnQnlBRFFRSnFOZ0ljUVFBaEJnd0tDMEVDUVFFZ0F5MEFBa0VLUmhzaEJnc2dCeUFHSUFocUlnTTJBaHdnQVVIZ0FFWU5DU0FBSUFBb0FnaEJBV28yQWdnTUNRc0NRQUpBQWtBZ0NjQWlCa0V3YTBIL0FYRkJDVTBFUUNBQUtBSkFJZ3BGRFFJZ0FVSGdBRWNFUUNBS0xRQnVRUUZ4UlEwQ0N5QUJRZUFBUmlBR1FUQkdCSDhnQXkwQUFrRXdhMEgvQVhGQkNrOE5DMEV3QlNBR0MwRTNTM0lOQWtIRjdBQWhCaUFDRFFrTURRc2dCa0VBVGcwQUlBaEJCaUFIRUZnaUJrR0FnTVFBVHcwR0lBY2dCeWdDQUNJRE5nSWNJQVpCZm5GQnFNQUFSZzBMREFvTElBZEJIR3BCQVJENUFTSUdRWDlIRFFFTFFlelZBQ0VHSUFJTkJnd0tDeUFHUVFCT0RRY2dCeUFIS0FJY1FRRnFOZ0ljREFJTElBYkFRUUJPRFFZZ0EwRUdJQWNRV0NJR1FmLy93d0JMRFFJZ0J5QUhLQUlBTmdJY0RBWUxJQWNnQTBFQ2FqWUNIQXNnQ1NFR0RBUUxRYlR3QUNFR0lBSU5BUXdGQzBHSjJ3QWhCaUFDUlEwRUN5QUFJQVpCQUJBV0RBTUxJQWNnQTBFQ2FqWUNIRUVBSVFZTElBZEJCR29nQmhDNUFRMEJJQWNvQWh3aEF3d0FDd0FMSUFjb0FnUW9BaEFpQUVFUWFpQUhLQUlJSUFBb0FnUVJBQUJCZndzaEJpQUhRU0JxSkFBZ0JndWpBUUlEZmdOL0l3QkJFR3NpQ1NRQUlBUkNBQ0FFUWdCVkd5RUlJQVZCQUVnaENnTkFBa0FnQmlBSVVRUkFRUUFoQlF3QkMwRi9JUVVnQUNBQklBWkNmNFVnQkh3Z0JpQUtHeUlISUFOOElBbEJDR29RaFFFaUMwRUFTQTBBSUFJZ0Izd2hCd0pBSUFzRVFDQUFJQUVnQnlBSktRTUlFSVlCUVFCT0RRRU1BZ3NnQUNBQklBY1ErZ0ZCQUVnTkFRc2dCa0lCZkNFR0RBRUxDeUFKUVJCcUpBQWdCUXVrQVFJRmZ3RitJQUVvQWhBaUJDQUJLQUlVUVFGcklBSVExd054UVFOMElnWnFRUVJxSVFNZ0FxY2hCU0FDUWlDSXAwRjFTU0VIQTM4Z0F5Z0NBQ0lESUFRZ0JtcEdCRUJCQUE4TElBTXBBd2dpQ0VJZ2lLZEJkVThFUUNBSXB5SUVJQVFvQWdCQkFXbzJBZ0FMSUFkRkJFQWdCU0FGS0FJQVFRRnFOZ0lBQ3lBQUlBZ2dBa0VDRUx3QkJIOGdBMEVZYXdVZ0EwRUVhaUVESUFFb0FoQWhCQXdCQ3dzTGtBRUNBbjRCZnlBQUlBSXBBd0FpQTBFQUVKTUJJZ1ZGQkVCQ2dJQ0FnT0FBRHdzZ0FDQURRb0NBZ0lBd0VPTUJJZ05DZ0lDQWdIQ0RJZ1JDZ0lDQWdPQUFVUVJBSUFNUEN5QUNRUWhxSVFJZ0JFS0FnSUNBTUZFRVFDQUFRb0NBZ0lBd0lBQWdBaUFGTHdFR0VQb0ZEd3NnQUNBRFFRRWdBU0FCUVFGTUcwRUJheUFDRU5vRElRUWdBQ0FERUE4Z0JBc3dBUUovQWtBZ0FDQUJRUUFRa3dFaUF3UkFJQU1vQWlBb0Fnd29BaUF0QUFSRkRRRWdBQkJyQzBGL0lRSUxJQUlMY3dFQ2Z5TUFRVEJySWdJa0FBSi9JQUduUVlDQWdJQjRjaUFCUXYvLy8vOEhXQTBBR2lBQ0lBRTNBd0FnQWtFUWFpSURRUmhCeXZRQUlBSVFUaHBCQUNBQUlBTVFZaUlCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFhSUFBb0FoQWdBYWRCQVJDbkFnc2hBQ0FDUVRCcUpBQWdBQXNOQUNBQUlBRWdBa0VURU53REN6OEJBWDhnQWtJZ2lLZEJkVThFUUNBQ3B5SUVJQVFvQWdCQkFXbzJBZ0FMSUFBZ0FpQURFUDhDSVFJZ0FDQUJLQUpNSUFKQkFCQ0RCU0FBSUFJUUR3c01BQ0FBSUFFZ0FSQS9FSElMZ2dFQkFuOGpBRUVnYXlJRkpBQUNRQ0FCUVFwSElBSkJDVXR5UlFSQUlBQWdBa0VDZEVHUXBRUnFOUUlBRURBaEFnd0JDeUFBS0FJQUlRWWdCVUlBTndJWUlBVkNnSUNBZ0lDQWdJQ0FmemNDRUNBRklBWTJBZ3dnQlVFTWFpSUdJQUd0RURBZ0FDQUdJQUlnQXlBRUVLSUVjaUVDSUFZUUd3c2dCVUVnYWlRQUlBSUxtd1VCQTM4Z0FVRVFhaUVESUFFb0FoUWhBZ05BSUFJZ0EwWkZCRUFnQWtFWWF5RUVJQUlvQWdRaEFpQUFJQVFRL1FJTUFRc0xJQUFvQWhBZ0FTZ0NnQUlnQVNnQ2hBSWdBU2dDb0FJUTZ3VWdBVUdBQW1vUTlnRWdBQ2dDRUNJQ1FSQnFJQUVvQXN3Q0lBSW9BZ1FSQUFBZ0FDZ0NFQ0lDUVJCcUlBRW9BcVFDSUFJb0FnUVJBQUFnQUNnQ0VDSUNRUkJxSUFFb0F0Z0NJQUlvQWdRUkFBQkJBQ0VDQTBBZ0FTZ0N0QUloQXlBQ0lBRW9BcmdDVGtVRVFDQUFJQU1nQWtFRGRHb3BBd0FRRHlBQ1FRRnFJUUlNQVFzTElBQW9BaEFpQWtFUWFpQURJQUlvQWdRUkFBQWdBQ0FCS0FKd0VCTkJBQ0VDQTBBZ0FTZ0NkQ0VESUFJZ0FTZ0NmRTVGQkVBZ0FDQURJQUpCQkhScUtBSUFFQk1nQWtFQmFpRUNEQUVMQ3lBQUtBSVFJZ0pCRUdvZ0F5QUNLQUlFRVFBQVFRQWhBZ05BSUFFb0FvQUJJUU1nQWlBQktBS0lBVTVGQkVBZ0FDQURJQUpCQkhScUtBSUFFQk1nQWtFQmFpRUNEQUVMQ3lBQUtBSVFJZ0pCRUdvZ0F5QUNLQUlFRVFBQVFRQWhBZ05BSUFFb0F2d0JJUU1nQWlBQktBTDBBVTVGQkVBZ0FDQURJQUpCQkhScUtBSU1FQk1nQWtFQmFpRUNEQUVMQ3lBQUtBSVFJZ0pCRUdvZ0F5QUNLQUlFRVFBQVFRQWhBZ05BSUFFb0FzZ0NJUU1nQWlBQktBTEFBazVGQkVBZ0FDQURJQUpCQTNScUtBSUVFQk1nQWtFQmFpRUNEQUVMQ3lBQUtBSVFJZ0pCRUdvZ0F5QUNLQUlFRVFBQUlBRW9Bc3dCSWdJZ0FVSFFBV3BIQkVBZ0FDZ0NFQ0lEUVJCcUlBSWdBeWdDQkJFQUFBc2dBQ0FCS0FMc0FoQVRJQUZCOUFKcUVQWUJJQUFvQWhBaUFrRVFhaUFCS0FLTUF5QUNLQUlFRVFBQUlBRW9BZ1FFUUNBQktBSVlJZ0lnQVNnQ0hDSUROZ0lFSUFNZ0FqWUNBQ0FCUWdBM0FoZ0xJQUFvQWhBaUFFRVFhaUFCSUFBb0FnUVJBQUFMZ2dFQkFuOGdBQ0FCUVJCcUVNOEZBa0FnQVNnQ0lDSUNCRUFnQVNnQ1BDSURSUTBCQTBBZ0FpQURUMFVFUUNBQUlBSXBBd0FRSXlBQ1FRaHFJUUlnQVNnQ1BDRUREQUVMQ3lBQVFSQnFJQUVvQWlBZ0FDZ0NCQkVBQUFzZ0FDQUJLUU1ZRUNNZ0FDQUJLUU1BRUNNUEMwR0VoQUZCcnZ3QVFZbVVBVUhDNndBUUFBQUxhQUVCZmdKQUFrQWdBQkEwSWdOQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRTU1BUXNnQUNBRFFjQUFJQUZCQnhBWlFRQklEUUFnQUNBRFFla0FJQUpCQUVldFFvQ0FnSUFRaEVFSEVCbEJBRTROQVFzZ0FDQURFQTlDZ0lDQWdPQUFJUU1MSUFNTGpBRUJBbjhDUUFOQUlBRkNnSUNBZ0hCVURRRUNRQUpBQWtBQ1FBSkFBa0FnQWFjaUFpOEJCaUlEUVF4ckRnVUZBUU1IQVFBTElBTkJNRVlOQVNBRFFUUnJEZ1VBQmdZR0FBWUxJQUlvQWlBb0FqQVBDeUFDS0FJZ0lnSkZEUVFnQWkwQUVVVU5BU0FBRUxZQ1FRQVBDeUFDS0FJZ0lRSUxJQUlwQXdBaEFRd0JDd3NnQWlnQ0lDRUFDeUFBQ3lJQUlBQWdBa0VCYWhBcElnQUVRQ0FBSUFFZ0FoQWZJQUpxUVFBNkFBQUxJQUFMalFNQ0EzNEVmd0pBSUFFb0FnZ2lCa0grLy8vL0IwNEVRRUVCSVFjZ0FrRUJjUTBCUXYvLy8vLy8vLy8vL3dBaEF5QUdRZjcvLy84SFJ3MEJJQUUwQWdSQy8vLy8vLy8vLy8vL0FId2hBd3dCQ3lBR1FRQk1CRUFNQVFzZ0JrRS9UUVJBSUFFb0FoQWlDU0FCS0FJTUlnSkJBblJxUVFScktBSUFJUWhDQUNBR1FTQk5CSDRnQ0VFZ0lBWnJkcTBGSUFKQkFrOEVmaUFDUVFKMElBbHFRUWhyTlFJQUJVSUFDeUFJclVJZ2hvUkJ3QUFnQm11dGlBc2lBMzBnQXlBQktBSUVHeUVEREFFTElBSkJBWEZGQkVBZ0FTZ0NCRVVFUUVMLy8vLy8vLy8vLy84QUlRTkJBU0VIREFJTFFvQ0FnSUNBZ0lDQWdIOGhBMEVCSVFjZ0JrSEFBRWNOQVNBQktBSVFJQUVvQWd3aUFVRUNkR29pQWtFRWF6VUNBRUlnaGlFRUlBRkJBazhFZmlBQ1FRaHJOUUlBQlVJQUN5QUVoRUtBZ0lDQWdJQ0FnSUIvVWlFSERBRUxRZ0FnQVNnQ0VDSUlJQUVvQWd3aUFpQUNRUVYwSUFacklnWVFhSzBnQ0NBQ0lBWkJJR29RYUsxQ0lJYUVJZ045SUFNZ0FTZ0NCQnNoQXdzZ0FDQUROd01BSUFjTE13RUJmeUFBS0FJQUtBSVFJZ0ZCRUdvZ0FDZ0NCQ0FCS0FJRUVRQUFJQUJCQURZQ0RDQUFRZ0EzQWdRZ0FFRi9OZ0lVQzBZQUlBSkJBRXdFUUNBQVFTOFFMUThMSUFBZ0FrRUFFT29CSWdCRkJFQkNnSUNBZ09BQUR3c2dBRUVRYWlBQklBSVFIeUFDYWtFQU9nQUFJQUN0UW9DQWdJQ1FmNFFMYndJQmZ3RitBa0FDUUFKL0lBSkZCRUFnQUNnQ0VDQUJRUUFRc3dVTUFRc2dBU3dBQUVFNmEwRjJUdzBCSUFBb0FoQWdBU0FDRUxNRkN5SUREUUVMUVFBaEF5QUFJQUVnQWhDVEFpSUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ2dDRUNBRXB4RDhBeUVEQ3lBREN4d0FJQUFnQUNnQ0VDZ0NSQ0FCUVJoc2FpZ0NCRUhMOWdBUWp3RUxTQUVDZndKQUEwQWdBVUVLUmcwQklBRkJBblJCNG9BQ2FpOEJBQ0FBU2cwQklBRkJBWFFoQWlBQlFRRnFJUUVnQWtFQmRFSGtnQUpxTHdFQUlBQk1EUUFMUVFFUEMwRUFDM1FCQkg5QkFpRUNBa0FnQUNnQ0NDSUVRZi8vLy84SFJnMEFJQUVvQWdnaUJVSC8vLy8vQjBZTkFDQUFLQUlFSWdNZ0FTZ0NCRWNFUUNBRVFZQ0FnSUI0UmdSQVFRQWhBaUFGUVlDQWdJQjRSZzBDQzBFQklBTkJBWFJyRHd0QkFDQUFJQUVRMHdFaUFHc2dBQ0FER3lFQ0N5QUNDNGtCQVFSK0lBQVFQaUlFUW9DQWdJQndnMEtBZ0lDQTRBQlNCRUFnQVVFQUlBRkJBRW9iclNFR0EwQWdBeUFHVVFSQUlBUVBDeUFDSUFPblFRTjBhaWtEQUNJRlFpQ0lwMEYxVHdSQUlBV25JZ0VnQVNnQ0FFRUJhallDQUFzZ0FDQUVJQU1nQlVFQUVOSUJJUUVnQTBJQmZDRURJQUZCQUU0TkFBc2dBQ0FFRUE4TFFvQ0FnSURnQUF0UEFRRi9JQUVnQWpZQ0RDQUJJQUEyQWdBZ0FVRUFOZ0lVSUFFZ0F6WUNFQ0FCUVFBMkFnZ2dBU0FBSUFJZ0F4RHFBU0lBTmdJRUlBQUVmMEVBQlNBQlFYODJBaFFnQVVFQU5nSU1RWDhMQzd3QkFRRi9Jd0JCRUdzaUJTUUFJQVVnQXpjRENBSkFJQUVFUUNBQklBRW9BZ0JCQVdvMkFnQWdBQ0FCclVLQWdJQ0FjSVFnQWtFQklBVkJDR29RTHlFQ0lBQWdCU2tEQ0JBUFFYOGhBU0FDUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQUNBQ0VBOUJBU0VCREFFTElBQWdBeEFQSUFSQmdJQUJjVVVFUUVFQUlRRWdCRUdBZ0FKeFJRMEJJQUFvQWhBb0Fvd0JJZ1JGRFFFZ0JDMEFLRUVCY1VVTkFRc2dBRUgvR2tFQUVCVkJmeUVCQ3lBRlFSQnFKQUFnQVF0aEFnRi9BWDRDUUNBQlFRQklEUUFDUUFKQUFrQWdBQ2dDRUNnQ09DQUJRUUowYWlnQ0FDa0NCQ0lEUWo2SXAwRUJhdzREQXdJQUFRdEJBU0VDQWtBZ0EwSWdpS2RCLy8vLy93TnhEZ0lEQUFFTFFRSVBDeEFCQUF0QkFTRUNDeUFDQzZjRkFnbC9BbjRqQUVFZ2F5SURKQUFDUUNBQktRTkFJZ3RDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFRb0NBZ0lEZ0FDRU1JQUJCQ3hCMklndENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQURRZ0EzQXhnZ0EwSUFOd01RSUFOQ0FEY0RDQ0FBSUFOQkNHb2dBVUVBRUs4RklRUWdBQ2dDRUNJQ1FSQnFJQU1vQWdnZ0FpZ0NCQkVBQUFKQUFrQWdCQVJBSUFNb0FoUWhCZ3dCQ3lBTHB5RUhJQU1vQWh3aUNFRUFJQWhCQUVvYklRa2dBeWdDRkNFR1FRQWhCQUpBQTBBZ0JDQUpSd1JBQWtBQ1FBSkFJQVlnQkVFTWJHb2lBaWdDQ0NJRkJFQWdBeUFCTmdJQURBRUxBa0FnQUNBRElBTkJCR29nQVNBQ0tBSUFFUFFESWdVT0JBQUdCZ0lHQ3lBREtBSUVJUVVMSUFVb0FneEIvUUJHQkVBZ0FrRUNOZ0lFSUFJZ0F5Z0NBQ2dDRUNBRktBSUFRUU4wYWlnQ0JEWUNDQXdDQ3lBQ1FRRTJBZ1FnQlNnQ0JDSUtCRUFnQWlBS05nSUlEQUlMSUFJZ0F5Z0NBQ2dDU0NnQ0pDQUZLQUlBUVFKMGFpZ0NBRFlDQ0F3QkN5QUNRUUEyQWdRTElBUkJBV29oQkF3QkN3c2dCaUFJUVF4QndRQWdBQkMrQWtFQUlRUURRQ0FFSUFsR0RRTUNRQUpBQWtBZ0JpQUVRUXhzYWlJQ0tBSUVRUUZyRGdJQUFRSUxJQUlvQWdnaEJTQUFJQWNnQWlnQ0FFRW1FSG9pQWtVTkJDQUZJQVVvQWdCQkFXbzJBZ0FnQWlBRk5nSUFEQUVMSUFBZ0N5QUNLQUlBUVFFZ0FpZ0NDRUVHRUpVRFFRQklEUU1MSUFSQkFXb2hCQXdBQ3dBTElBQWdCU0FCSUFJb0FnQVE4d01MSUFBb0FoQWlBVUVRYWlBR0lBRW9BZ1FSQUFBZ0FDQUxFQThNQWdzZ0FDZ0NFQ0lFUVJCcUlBWWdCQ2dDQkJFQUFDQUFJQXRCMXdFZ0FFSCtBQkF0UVFBUUdSb2dCeUFITFFBRlFmNEJjVG9BQlNBQklBczNBMEFMSUF0Q0lJaW5RWFZQQkVBZ0M2Y2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBTElRd0xJQU5CSUdva0FDQU1DNGtFQWdSK0FuOENRQUpBSUFHOUlnUkNBWVlpQTFBTkFDQUJ2U0VDSUFDOUlnVkNOSWluUWY4UGNTSUdRZjhQUmcwQUlBSkMvLy8vLy8vLy8vLy9BSU5DZ1lDQWdJQ0FnUGovQUZRTkFRc2dBQ0FCb2lJQUlBQ2pEd3NnQXlBRlFnR0dJZ0phQkVBZ0FFUUFBQUFBQUFBQUFLSWdBQ0FDSUFOUkd3OExJQVJDTklpblFmOFBjU0VIQW40Z0JrVUVRRUVBSVFZZ0JVSU1oaUlDUWdCWkJFQURRQ0FHUVFGcklRWWdBa0lCaGlJQ1FnQlpEUUFMQ3lBRlFRRWdCbXV0aGd3QkN5QUZRdi8vLy8vLy8vOEhnMEtBZ0lDQWdJQ0FDSVFMSVFJQ2ZpQUhSUVJBUVFBaEJ5QUVRZ3lHSWdOQ0FGa0VRQU5BSUFkQkFXc2hCeUFEUWdHR0lnTkNBRmtOQUFzTElBUkJBU0FIYTYyR0RBRUxJQVJDLy8vLy8vLy8vd2VEUW9DQWdJQ0FnSUFJaEFzaEJDQUdJQWRLQkVBRFFBSkFJQUlnQkgwaUEwSUFVdzBBSUFNaUFrSUFVZzBBSUFCRUFBQUFBQUFBQUFDaUR3c2dBa0lCaGlFQ0lBWkJBV3NpQmlBSFNnMEFDeUFISVFZTEFrQWdBaUFFZlNJRFFnQlREUUFnQXlJQ1FnQlNEUUFnQUVRQUFBQUFBQUFBQUtJUEN3SkFJQUpDLy8vLy8vLy8vd2RXQkVBZ0FpRUREQUVMQTBBZ0JrRUJheUVHSUFKQ2dJQ0FnSUNBZ0FSVUlRY2dBa0lCaGlJRElRSWdCdzBBQ3dzZ0JVS0FnSUNBZ0lDQWdJQi9neUFEUW9DQWdJQ0FnSUFJZlNBR3JVSTBob1FnQTBFQklBWnJyWWdnQmtFQVNodUV2d3ZvRHdNSGZBaC9BbjVFQUFBQUFBQUE4RDhoQXdKQUFrQUNRQ0FCdlNJUlFpQ0lweUlQUWYvLy8vOEhjU0lKSUJHbklneHlSUTBBSUFDOUloSkNJSWluSVFvZ0VxY2lFRVVnQ2tHQWdNRC9BMFp4RFFBZ0NrSC8vLy8vQjNFaUMwR0FnTUQvQjBzZ0MwR0FnTUQvQjBZZ0VFRUFSM0Z5SUFsQmdJREEvd2RMY2tVZ0RFVWdDVUdBZ01EL0IwZHljVVVFUUNBQUlBR2dEd3NDUUFKQUFrQUNRQUpBQW45QkFDQVNRZ0JaRFFBYVFRSWdDVUgvLy8rWkJFc05BQnBCQUNBSlFZQ0F3UDhEU1EwQUdpQUpRUlIySVEwZ0NVR0FnSUNLQkVrTkFVRUFJQXhCc3dnZ0RXc2lEbllpRFNBT2RDQU1SdzBBR2tFQ0lBMUJBWEZyQ3lFT0lBd05BaUFKUVlDQXdQOEhSdzBCSUF0QmdJREEvd05ySUJCeVJRMEZJQXRCZ0lEQS93TkpEUU1nQVVRQUFBQUFBQUFBQUNBUlFnQlpHdzhMSUF3TkFTQUpRWk1JSUExcklneDJJZzBnREhRZ0NVY05BRUVDSUExQkFYRnJJUTRMSUFsQmdJREEvd05HQkVBZ0VVSUFXUVJBSUFBUEMwUUFBQUFBQUFEd1B5QUFvdzhMSUE5QmdJQ0FnQVJHQkVBZ0FDQUFvZzhMSUE5QmdJQ0Evd05ISUJKQ0FGTnlEUUFnQUo4UEN5QUFtU0VDSUJBTkFRSkFJQXBCQUVnRVFDQUtRWUNBZ0lCNFJpQUtRWUNBd1A5N1JuSWdDa0dBZ0VCR2NnMEJEQU1MSUFwRklBcEJnSURBL3dkR2NnMEFJQXBCZ0lEQS93TkhEUUlMUkFBQUFBQUFBUEEvSUFLaklBSWdFVUlBVXhzaEF5QVNRZ0JaRFFJZ0RpQUxRWUNBd1A4RGEzSkZCRUFnQXlBRG9TSUFJQUNqRHdzZ0E1b2dBeUFPUVFGR0d3OExSQUFBQUFBQUFBQUFJQUdhSUJGQ0FGa2JEd3NDUUNBU1FnQlpEUUFDUUFKQUlBNE9BZ0FCQWdzZ0FDQUFvU0lBSUFDakR3dEVBQUFBQUFBQThMOGhBd3NDZkNBSlFZR0FnSThFVHdSQUlBbEJnWURBbndSUEJFQWdDMEgvLzcvL0EwMEVRRVFBQUFBQUFBRHdmMFFBQUFBQUFBQUFBQ0FSUWdCVEd3OExSQUFBQUFBQUFQQi9SQUFBQUFBQUFBQUFJQTlCQUVvYkR3c2dDMEgrLzcvL0EwMEVRQ0FEUkp4MUFJZzg1RGQrb2tTY2RRQ0lQT1EzZnFJZ0EwUlo4L2pDSDI2bEFhSkVXZlA0d2g5dXBRR2lJQkZDQUZNYkR3c2dDMEdCZ01EL0EwOEVRQ0FEUkp4MUFJZzg1RGQrb2tTY2RRQ0lQT1EzZnFJZ0EwUlo4L2pDSDI2bEFhSkVXZlA0d2g5dXBRR2lJQTlCQUVvYkR3c2dBa1FBQUFBQUFBRHd2NkFpQUVSRTMxMzRDNjVVUHFJZ0FDQUFva1FBQUFBQUFBRGdQeUFBSUFCRUFBQUFBQUFBMEwraVJGVlZWVlZWVmRVL29LS2hva1QrZ2l0bFJ4WDN2NktnSWdJZ0FpQUFSQUFBQUdCSEZmYy9vaUlDb0wxQ2dJQ0FnSENEdnlJQUlBS2hvUXdCQ3lBQ1JBQUFBQUFBQUVCRG9pSUFJQUlnQzBHQWdNQUFTU0lKR3lFQ0lBQzlRaUNJcHlBTElBa2JJZ3hCLy84L2NTSUtRWUNBd1A4RGNpRUxJQXhCRkhWQnpIZEJnWGdnQ1J0cUlReEJBQ0VKQWtBZ0NrR1BzUTVKRFFBZ0NrSDY3QzVKQkVCQkFTRUpEQUVMSUFwQmdJQ0Evd055SVFzZ0RFRUJhaUVNQ3lBSlFRTjBJZ3BCZ0JscUt3TUFJQUs5UXYvLy8vOFBneUFMclVJZ2hvUy9JZ1FnQ2tId0dHb3JBd0FpQmFFaUJrUUFBQUFBQUFEd1B5QUZJQVNnb3lJSG9pSUN2VUtBZ0lDQWNJTy9JZ0FnQUNBQW9pSUlSQUFBQUFBQUFBaEFvQ0FISUFZZ0FDQUpRUkowSUF0QkFYWnFRWUNBb0lBQ2FxMUNJSWEvSWdhaW9TQUFJQVFnQmlBRm9hR2lvYUlpQkNBQ0lBQ2dvaUFDSUFLaUlnQWdBS0lnQUNBQUlBQWdBQ0FBUk85T1JVb29mc28vb2tSbDI4bVRTb2JOUDZDaVJBRkJIYWxnZE5FL29LSkVUU2FQVVZWVjFUK2dva1QvcTIvYnRtM2JQNkNpUkFNek16TXpNK00vb0tLZ0lnV2d2VUtBZ0lDQWNJTy9JZ0NpSWdZZ0JDQUFvaUFDSUFVZ0FFUUFBQUFBQUFBSXdLQWdDS0dob3FBaUFxQzlRb0NBZ0lCd2c3OGlBRVQxQVZzVTRDOCt2cUlnQWlBQUlBYWhvVVQ5QXpyY0NjZnVQNktnb0NJQ0lBcEJrQmxxS3dNQUlnUWdBaUFBUkFBQUFPQUp4KzQvb2lJQ29LQWdETGNpQmFDOVFvQ0FnSUJ3Zzc4aUFDQUZvU0FFb1NBQ29hRUxJUUlnQVNBUlFvQ0FnSUJ3Zzc4aUJLRWdBS0lnQWlBQm9xQWlBaUFBSUFTaUlnR2dJZ0M5SWhHbklRa0NRQ0FSUWlDSXB5SUtRWUNBd0lRRVRnUkFJQXBCZ0lEQWhBUnJJQWx5RFFNZ0FrVCtnaXRsUnhXWFBLQWdBQ0FCb1dSRkRRRU1Bd3NnQ2tHQStQLy9CM0ZCZ0pqRGhBUkpEUUFnQ2tHQTZMejdBMm9nQ1hJTkF5QUNJQUFnQWFGbFJRMEFEQU1MUVFBaENTQURBbndnQ2tILy8vLy9CM0VpQzBHQmdJRC9BMDhFZmtFQVFZQ0F3QUFnQzBFVWRrSCtCMnQySUFwcUlncEIvLzgvY1VHQWdNQUFja0dUQ0NBS1FSUjJRZjhQY1NJTGEzWWlDV3NnQ1NBUlFnQlRHeUVKSUFJZ0FVR0FnRUFnQzBIL0IydDFJQXB4clVJZ2hyK2hJZ0dndlFVZ0VRdENnSUNBZ0hDRHZ5SUFSQUFBQUFCREx1WS9vaUlESUFJZ0FDQUJvYUZFN3puNi9rSXU1aitpSUFCRU9XeW9ER0ZjSUw2aW9DSUNvQ0lBSUFBZ0FDQUFJQUNpSWdFZ0FTQUJJQUVnQVVUUXBMNXlhVGRtUHFKRThXdlN4VUc5dTc2Z29rUXMzaVd2YWxZUlA2Q2lSSk85dmhac3dXYS9vS0pFUGxWVlZWVlZ4VCtnb3FFaUFhSWdBVVFBQUFBQUFBQUF3S0NqSUFBZ0FpQUFJQU9ob1NJQW9pQUFvS0doUkFBQUFBQUFBUEEvb0NJQXZTSVJRaUNJcHlBSlFSUjBhaUlLUWYvL1Awd0VRQ0FBSUFrUTJnRU1BUXNnRVVMLy8vLy9ENE1nQ3ExQ0lJYUV2d3VpSVFNTElBTVBDeUFEUkp4MUFJZzg1RGQrb2tTY2RRQ0lQT1EzZnFJUEN5QURSRm56K01JZmJxVUJva1JaOC9qQ0gyNmxBYUlMRVFBZ0FDQUJJQUlnQXlBRVFRSVFpZ1FMUXdBQ2YwRUFJQUlvQWdBb0FnQkJHbllnQTBZTkFCcEJmeUFBSUFFZ0FoRFVBUTBBR2lBQ0tBSUFJZ0FnQUNnQ0FFSC8vLzhmY1NBRFFScDBjallDQUVFQUN3dThBUUVFZjBGL0lRSUNRQ0FBSUFGQkFCRFVBUTBBSUFFb0FpZ2lCQ0FCS0FJUUlnTW9BaUJxSWdVZ0F5Z0NIRXNFUUNBQUlBRkJFR29nQVNBRkVMd0ZEUUVMSUFFb0FpUWhBMEVBSVFJRFFDQUNJQVJHUlFSQUlBQWdBU0FDUVlDQWdJQjRja0VIRUhvZ0F5a0RBRGNEQUNBQ1FRRnFJUUlnQTBFSWFpRUREQUVMQ3lBQUtBSVFJZ0JCRUdvZ0FTZ0NKQ0FBS0FJRUVRQUFRUUFoQWlBQlFRQTJBaWdnQVVJQU53TWdJQUVnQVMwQUJVSDNBWEU2QUFVTElBSUxkQUVEZndKQUFrQWdBRUVCY1EwQUlBRkJnUUp4UVlFQ1JpQUJRWUFJY1VFQUlBQWdBWE5CQkhFYmNnMEJJQUZCZ1BRQWNVVU5BQ0FBUVRCeElnTkJFRVlnQVVHQU1IRWlCRUVBUjNNTkFTQUFRUUp4SUFGQmdnUnhRWUlFUjNJZ0EwRVFSbklOQUNBRVJRMEJDMEVCSVFJTElBSUxQUUVCZnlBQklBQW9BdFFCSUFFb0FoUkJJQ0FBS0FMSUFXdDJRUUowYWlJQ0tBSUFOZ0lvSUFJZ0FUWUNBQ0FBSUFBb0F0QUJRUUZxTmdMUUFRdkpBUUVEZndKQUlBRkNnSUNBZ0hCYUJFQWdBYWNpQnlnQ0VDSUdRVEJxSVFnZ0JpQUdLQUlZSUFKeFFYOXpRUUowYWlnQ0FDRUdBa0FEUUNBR1JRMEJJQUlnQ0NBR1FRRnJRUU4wYWlJR0tBSUVSd1JBSUFZb0FnQkIvLy8vSDNFaEJnd0JDd3NRQVFBTElBQWdCeUFDSUFWQkIzRkJNSElRZWlJQ1JRUkFRWDhQQzBFQklRWWdBQ0FBS0FJQVFRRnFOZ0lBSUFJZ0FEWUNBQ0FBUVFOeERRRWdBaUFFTmdJRUlBSWdBQ0FEY2pZQ0FBc2dCZzhMUWN1UEFVR3UvQUJCM3NnQVFlQWJFQUFBQ3lFQUlBQWdBVUV3SUFPdFFRRVFHUm9nQUNBQlFUWWdBQ0FDRUMxQkFSQVpHZ3ZGQndNQ2ZnVi9BbndqQUVFUWF5SUdKQUJCQnlBQlFRaHJJZ2dwQXdBaUJFSWdpS2NpQlNBRlFRZHJRVzVKR3lFRkFuOENRQUpBUVFjZ0FVRVFheUlIS1FNQUlnTkNJSWluSWdFZ0FVRUhhMEZ1U1JzaUFVRi9SaUFGUVg1eFFRSkhjVVVnQVVGK2NVRUNSaUFGUVg5SGNuRU5BQ0FBSUFaQkNHb2dBeUFFSUFKQkFFRUJFSVVDSWdGRkRRQWdBQ0FERUE4Z0FDQUVFQThnQVVFQVNBMEJJQWNnQmlrRENEY0RBRUVBREFJTEFrQWdBQ0FEUVFFUW1nRWlBMEtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQVFoQXd3QkN5QUFJQVJCQVJDYUFTSUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQUNRRUVISUFOQ0lJaW5JZ0VnQVVFSGEwRnVTUnNpQlVGNVIwRUhJQVJDSUlpbklnRWdBVUVIYTBGdVNSc2lBVUY1UjNKRkJFQWdBNmNnQktjUWd3SWhBUUovQWtBQ1FBSkFBa0FnQWtHakFXc09Bd0FCQWdNTElBRkJIM1lNQXdzZ0FVRUFUQXdDQ3lBQlFRQktEQUVMSUFGQkFFNExJUUVnQUNBREVBOGdBQ0FFRUE4TUFRc0NRRUVCSUFWMFFZY0JjVVVnQlVFSFMzSWdBVUVIUzNKQkFVRUJJQUYwUVljQmNSdEZEUUFDUUFKQUlBVkJka1lnQVVGNVJuRWdBVUYyUmlBRlFYbEdjWEpGRFFBZ0FDZ0NFQ2dDakFFaUNRUkFJQWt0QUNoQkJIRU5BUXNDUUNBRlFYbEdCRUFnQUNBREVMd0NJZ05DZ0lDQWdIQ0RRb0NBZ0lEZ2ZsSU5BUXNnQVVGNVJ3MENJQUFnQkJDOEFpSUVRb0NBZ0lCd2cwS0FnSUNBNEg1UkRRSUxJQUFnQXhBUElBQWdCQkFQUVFBaEFRd0RDeUFBSUFNUWJDSURRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdCQ0VEREFRTElBQWdCQkJzSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXdzQ1FFRUhJQU5DSUlpbklnRWdBVUVIYTBGdVNSc2lCVUYxUndSQVFRY2dCRUlnaUtjaUFTQUJRUWRyUVc1Skd5SUJRWFZIRFFFTElBQWdBaUFESUFRZ0FDZ0NFQ2dDM0FJUkhBQWlBVUVBU0EwRURBSUxJQVZCZDBjZ0FVRjNSM0ZGQkVBZ0FDQUNJQU1nQkNBQUtBSVFLQUxBQWhFY0FDSUJRUUJJRFFRTUFnc2dCVUYyUnlBQlFYWkhjUTBBSUFBZ0FpQURJQVFnQUNnQ0VDZ0NwQUlSSEFBaUFVRUFUZzBCREFNTElBUkNnSUNBZ01DQmdQei9BSHkvSUFTbnR5QUJRUWRHR3lFS0lBTkNnSUNBZ01DQmdQei9BSHkvSUFPbnR5QUZRUWRHR3lFTEFrQUNRQUpBQWtBZ0FrR2pBV3NPQXdBQkFnTUxJQW9nQzJRaEFRd0RDeUFLSUF0bUlRRU1BZ3NnQ2lBTFl5RUJEQUVMSUFvZ0MyVWhBUXNnQnlBQlFRQkhyVUtBZ0lDQUVJUTNBd0JCQUF3Q0N5QUFJQU1RRHdzZ0IwS0FnSUNBTURjREFDQUlRb0NBZ0lBd053TUFRWDhMSVFBZ0JrRVFhaVFBSUFBTEJBQkJBQXR0QWdKK0FuOUJmeUVGQWtBZ0FDQUJRUWhySWdZcEF3QWlCQ0FDRU9jQklnTkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQVFRRHlBR0lBTTNBd0FnQUNBRFFlb0FJQU5CQUJBVUlnTkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUJJQU0zQXdCQkFDRUZDeUFGQzdFQkFnTi9BWDRnQUNnQ0VDRUZJQUFnQWtFRGRFRVlhaEFwSWdRRVFDQUVJQUkyQWhBZ0JDQUJOZ0lNSUFRZ0FEWUNDRUVBSVFBZ0FrRUFJQUpCQUVvYklRRURRQ0FBSUFGSEJFQWdBeUFBUVFOMElnSnFLUU1BSWdkQ0lJaW5RWFZQQkVBZ0I2Y2lCaUFHS0FJQVFRRnFOZ0lBQ3lBQ0lBUnFJQWMzQXhnZ0FFRUJhaUVBREFFTEN5QUZLQUtnQVNJQUlBUTJBZ1FnQkNBRlFhQUJhallDQkNBRUlBQTJBZ0FnQlNBRU5nS2dBUXNMUEFFQmZ3TkFJQUlnQTBaRkJFQWdBQ0FCSUFOQkEzUnFLUU1BRUE4Z0EwRUJhaUVEREFFTEN5QUFLQUlRSWdCQkVHb2dBU0FBS0FJRUVRQUFDNFVCQVFKL0l3QkJFR3NpQlNRQUFrQWdBa0tBZ0lDQWNJTkNnSUNBZ0pCL1VnUkFJQUpDSUlpblFYVkpEUUVnQXFjaUFDQUFLQUlBUVFGcU5nSUFEQUVMSUFBZ0JVRU1haUFDRU9VQklnWkZCRUJDZ0lDQWdPQUFJUUlNQVFzZ0FDQUJJQVlnQlNnQ0RFSFNpQUVnQXlBRUVNb0ZJUUlnQUNBR0VGUUxJQVZCRUdva0FDQUNDN3dCQWdOK0FYOGpBRUVRYXlJQ0pBQkNnSUNBZ09BQUlRVUNRQ0FBSUFFUVlBMEFJQU1wQXdBaEJnSkFBa0FnQXlrRENDSUhRaUNJcHlJRFFRTkhCRUFnQkVFQ1JnMENJQU5CQWtZTkFRd0NDeUFFUVFKR0RRRUxJQUFnQVNBR1FRQkJBQkFoSVFVTUFRc2dBQ0FDUVF4cUlBY1FpUVFpQTBVTkFDQUNLQUlNSVFnQ2ZpQUVRUUZ4QkVBZ0FDQUJJQVlnQ0NBREVKQUREQUVMSUFBZ0FTQUdJQWdnQXhBaEN5RUZJQUFnQXlBSUVKc0RDeUFDUVJCcUpBQWdCUXM5QWdGL0FuNGdBQ0FCRU0wRklnTkNnSUNBZ0hDRElnUkNnSUNBZ0RCU0JIOGdCRUtBZ0lDQTRBQlNCRUFnQUNBREVBOUJBUThMUVg4RlFRQUxDMDRDQVg4QmZpTUFRUkJySWdJa0FBSitJQUZCL3dGTkJFQWdBaUFCT2dBUElBQWdBa0VQYWtFQkVJUUREQUVMSUFJZ0FUc0JEQ0FBSUFKQkRHcEJBUkR1QXdzaEF5QUNRUkJxSkFBZ0F3dE5BUUYvSXdCQkVHc2lBeVFBSUFNZ0FUa0RDQ0FESUFJMkFnQWdBRUdBQVVHVjN3QWdBeEJPSWdCQmdBRk9CRUJCb09BQVFhNzhBRUdEMlFCQmlZd0JFQUFBQ3lBRFFSQnFKQUFnQUF1WUFnRUNmd0ovSUFGQi93Qk5CRUFnQUNBQk9nQUFJQUJCQVdvTUFRc0NRQ0FCUWY4UFRRUkFJQUFnQVVFR2RrSEFBWEk2QUFBZ0FDRUNEQUVMQW44Z0FVSC8vd05OQkVBZ0FDQUJRUXgyUWVBQmNqb0FBQ0FBUVFGcURBRUxBa0FnQVVILy8vOEFUUVJBSUFBZ0FVRVNka0h3QVhJNkFBQWdBQ0VDREFFTEFuOGdBVUgvLy84ZlRRUkFJQUZCR0haQmVISWhBeUFBUVFGcURBRUxJQUFnQVVFWWRrRS9jVUdBQVhJNkFBRWdBVUVlZGtGOGNpRURJQUJCQW1vTElRSWdBQ0FET2dBQUlBSWdBVUVTZGtFL2NVR0FBWEk2QUFBTElBSWdBVUVNZGtFL2NVR0FBWEk2QUFFZ0FrRUNhZ3NpQWlBQlFRWjJRVDl4UVlBQmNqb0FBQXNnQWlBQlFUOXhRWUFCY2pvQUFTQUNRUUpxQ3lBQWF3dUlBZ0lGZndGK0lBRW9BZ3doQWdKQUFrQUNRQ0FCS1FJRUlnZENnSUNBZ0lDQWdJQkFXZ1JBSUFBb0FqZ2hCQXdCQ3dKQUlBRWdBQ2dDT0NJRUlBQW9BalFnQjBJZ2lLY2dBQ2dDSkVFQmEzRkJBblJxSWdNb0FnQWlCVUVDZEdvb0FnQWlCa1lFUUNBRElBSTJBZ0FNQVFzRFFDQUdJUU1nQlVVTkF5QUVJQU1vQWd3aUJVRUNkR29vQWdBaUJpQUJSdzBBQ3lBRElBSTJBZ3dMSUFVaEFnc2dCQ0FDUVFKMGFpQUFLQUk4UVFGMFFRRnlOZ0lBSUFBZ0FqWUNQQ0FBUVJCcUlBRWdBQ2dDQkJFQUFDQUFJQUFvQWlnaUFFRUJhellDS0NBQVFRQk1EUUVQQzBHWmtBRkJydndBUWRnV1Fjd3ZFQUFBQzBHU2pnRkJydndBUWV3V1Fjd3ZFQUFBQ3lrQkFuOENRQ0FBUW9DQWdJQndWQTBBSUFDbklnSXZBUVlRN2dGRkRRQWdBaWdDSUNFQkN5QUJDNG9EQVFOL0lBQWdBQ2dDQUNJQlFRRnJJZ0kyQWdBQ1FDQUJRUUZLRFFBZ0FrVUVRQ0FBS0FJUUlRSkJBQ0VCSUFCQkFCQ1BCQ0FBSUFBcEE4QUJFQThnQUNBQUtRUElBUkFQSUFBZ0FDa0RzQUVRRHlBQUlBQXBBN2dCRUE4Z0FDQUFLUU9vQVJBUEEwQWdBVUVJUmdSQVFRQWhBUU5BSUFBb0FpZ2hBeUFCSUFJb0FrQk9SUVJBSUFBZ0F5QUJRUU4wYWlrREFCQVBJQUZCQVdvaEFRd0JDd3NnQWtFUWFpQURJQUlvQWdRUkFBQWdBQ0FBS1FPWUFSQVBJQUFnQUNrRG9BRVFEeUFBSUFBcEExQVFEeUFBSUFBcEEwQVFEeUFBSUFBcEEwZ1FEeUFBSUFBcEF6Z1FEeUFBSUFBcEF6QVFEeUFBS0FJa0lnRUVRQ0FBS0FJUUlBRVFrUUlMSUFBb0FoUWlBU0FBS0FJWUlnSTJBZ1FnQWlBQk5nSUFJQUJDQURjQ0ZDQUFLQUlJSWdFZ0FDZ0NEQ0lDTmdJRUlBSWdBVFlDQUNBQVFnQTNBZ2dnQUNnQ0VDSUJRUkJxSUFBZ0FTZ0NCQkVBQUF3REJTQUFJQUFnQVVFRGRHb3BBMWdRRHlBQlFRRnFJUUVNQVFzQUN3QUxRZk9PQVVHdS9BQkI2QkZCclNVUUFBQUxDL1lCQVFOL0FrQWdBRVVFUUVHZ3lRUW9BZ0FFUUVHZ3lRUW9BZ0FRcFFNaEFRdEJpTWdFS0FJQUJFQkJpTWdFS0FJQUVLVURJQUZ5SVFFTFFhVFVCQ2dDQUNJQVJRMEJBMEFnQUNnQ1RCb2dBQ2dDRkNBQUtBSWNSd1JBSUFBUXBRTWdBWEloQVFzZ0FDZ0NPQ0lBRFFBTERBRUxJQUFvQWt4QkFFNGhBZ0pBQWtBZ0FDZ0NGQ0FBS0FJY1JnMEFJQUJCQUVFQUlBQW9BaVFSQVFBYUlBQW9BaFFOQUVGL0lRRWdBZzBCREFJTElBQW9BZ1FpQVNBQUtBSUlJZ05IQkVBZ0FDQUJJQU5yckVFQklBQW9BaWdSRUFBYUMwRUFJUUVnQUVFQU5nSWNJQUJDQURjREVDQUFRZ0EzQWdRZ0FrVU5BUXNMSUFFTDd3RUJBbjhDZndKQUlBRkIvd0Z4SWdNRVFDQUFRUU54QkVBRFFDQUFMUUFBSWdKRklBSWdBVUgvQVhGR2NnMERJQUJCQVdvaUFFRURjUTBBQ3dzQ1FDQUFLQUlBSWdKQmYzTWdBa0dCZ29RSWEzRkJnSUdDaEhoeERRQWdBMEdCZ29RSWJDRURBMEFnQWlBRGN5SUNRWDl6SUFKQmdZS0VDR3R4UVlDQmdvUjRjUTBCSUFBb0FnUWhBaUFBUVFScUlRQWdBa0dCZ29RSWF5QUNRWDl6Y1VHQWdZS0VlSEZGRFFBTEN3TkFJQUFpQWkwQUFDSURCRUFnQWtFQmFpRUFJQU1nQVVIL0FYRkhEUUVMQ3lBQ0RBSUxJQUFRUHlBQWFnd0JDeUFBQ3lJQVFRQWdBQzBBQUNBQlFmOEJjVVliQzlRREF3Si9CSHdCZmlBQXZTSUhRaUNJcHlFQkFrQUNmQUo4QWtBZ0FVSDVoT3IrQTBzZ0IwSUFXWEZGQkVBZ0FVR0FnTUQvZTA4RVFFUUFBQUFBQUFEdy95QUFSQUFBQUFBQUFQQy9ZUTBFR2lBQUlBQ2hSQUFBQUFBQUFBQUFvdzhMSUFGQkFYUkJnSUNBeWdkSkRRUWdBVUhGL2NyK2UwOE5BVVFBQUFBQUFBQUFBQXdDQ3lBQlFmLy92LzhIU3cwREN5QUFSQUFBQUFBQUFQQS9vQ0lEdlNJSFFpQ0lwMEhpdmlWcUlnRkJGSFpCL3dkcklRSWdBQ0FEb1VRQUFBQUFBQUR3UDZBZ0FDQURSQUFBQUFBQUFQQy9vS0VnQVVILy83K0FCRXNiSUFPalJBQUFBQUFBQUFBQUlBRkIvLysvbWdSTkd5RUZJQWRDLy8vLy93K0RJQUZCLy84L2NVR2V3WnIvQTJxdFFpQ0doTDlFQUFBQUFBQUE4TCtnSVFBZ0FyY0xJZ05FQUFEZy9rSXU1aitpSUFBZ0FDQUFSQUFBQUFBQUFBQkFvS01pQkNBQUlBQkVBQUFBQUFBQTREK2lvaUlHSUFRZ0JLSWlCQ0FFb2lJQUlBQWdBRVNmeG5qUUNackRQNkpFcjNpT0hjVnh6RCtnb2tRRStwZVptWm5aUDZDaUlBUWdBQ0FBSUFCRVJGSSszeEx4d2oraVJONER5NVprUnNjL29LSkVXWk1pbENSSjBqK2dva1NUVlZWVlZWWGxQNkNpb0tDaUlBTkVkang1TmU4NTZqMmlJQVdnb0NBR29hQ2dDdzhMSUFBTE9RRUNmeUFCUVFBZ0FVRUFTaHNoQVFOQUlBRWdBa1lFUUVFQUR3c2dBa0VDZENFRElBSkJBV29oQWlBQUlBTnFLQUlBUlEwQUMwRUJDejhCQW44RFFDQUJSU0FDSUFOTmNrVUVRQ0FBSUFOQkFuUnFJZ1FnQVNBRUtBSUFJZ0ZxSWdRMkFnQWdBU0FFU3lFQklBTkJBV29oQXd3QkN3c2dBUXVDQndFTWYwRURRWUNBZ0lBQ1FRRkJIQ0FDUVFWMlFUOXhJZ1ZyZENBRlFUOUdHeUlPYXlFUEFrQUNRQUpBQW44Z0FrRVFjUVJBUWYvLy8vOERJQUZCLy8vLy93TkdEUUVhSUFBb0FnZ2dBV29NQVFzZ0FTQUFLQUlJSWdVZ0QwNE5BQm9nQVNBQ1FRaHhSUTBBR2lBQlFmLy8vLzhEUmcwQklBNUJBMnNnQVdvZ0JXb0xJUVlnQTBFRmRDRUxBa0FDUUNBQ1FRZHhJZ3hCQmtZRVFDQUFLQUlRSWdjZ0F5QUxJQVpCZjNOcUVKa0NJUVVNQVFzQ2Z5QUxRWDhnQmlBR1FRQklHMnRCQW1zaUNFRUFTQVJBSUFBb0FoQWhCMEVBREFFTFFRRWhDU0FBS0FJUUlnY2dDRUVGZGlJRlFRSjBhaWdDQUVGL1FYNGdDSFJCZjNNZ0NFRWZjVUVmUmh0eFJRUkFBMEFnQlVFQVNpRUpRUUFnQlVFQVRBMENHaUFISUFWQkFXc2lCVUVDZEdvb0FnQkZEUUFMQzBFQkN5QUhJQU1nQ3lBR1FYOXphaENaQWlJSWNpRUtRUUFoQlFKQUFrQUNRQUpBQWtBQ1FDQU1EZ2NBQlFRRUFnRUNBd3NnQ1NBSUlnVkZjZzBFSUFjZ0F5QUxJQVpyRUprQ0lRVU1CQXRCQVNFRklBb05CQ0FHUVFCS0RRY01DQXNnQ0NFRklBb05Bd3dFQ3hBQkFBc2dDa0VBSUFBb0FnUWdERUVDUmtZYklRVUxJQXBGRFFFTElBUkJFSEloQkFzZ0JrRUFUQVJBSUFWRkRRTWdBRUVCRUVFYUlBQW9BaEJCZ0lDQWdIZzJBZ0FnQUNBQUtBSUlJQVpyUVFGcU5nSUlJQVJCR0hJUEN5QUZSUTBCSUFzZ0Jtc2lCVUVGZFNJSUlBTWdBeUFJU1JzaERFRUJJUXBCQVNBRmRDRUpJQWdoQlFOQUlBVWdERVlFUUNBRElRVURRQ0FGUVFGcklnVWdDRWhGQkVBZ0J5QUZRUUowYWlJSklBcEJIM1FnQ1NnQ0FDSUtRUUYyY2pZQ0FBd0JDd3NnQUNBQUtBSUlRUUZxTmdJSURBTUxJQWNnQlVFQ2RHb2lEU0FOS0FJQUlnMGdDV29pRURZQ0FFRUJJUWtnQlVFQmFpRUZJQTBnRUVzTkFBc01BUXRCOElVQlFkVDhBRUg1QTBHMThnQVFBQUFMSUE4Z0FDZ0NDQ0lGU2dSQUlBSkJDSEZGRFFFZ0JFRUJka0VJY1NBRWNpRUVDeUFGSUE1S0JFQWdBQ0FBS0FJRUlBRWdBaENyQkE4TFFRQWhCUUpBSUFzZ0Jtc2lBVUVBU0EwQUlBRkJCWFVoQlNBQlFSOXhJZ0ZGRFFBZ0J5QUZRUUowYWlJQ0lBSW9BZ0JCZjBFZ0lBRnJkRUYvY3lBQmRIRTJBZ0FMQTBBZ0JTSUJRUUZxSVFVZ0J5QUJRUUowYWlJQ0tBSUFSUTBBQ3lBQlFRQktCRUFnQnlBQ0lBTWdBV3NpQTBFQ2RCQ2NBUXNnQUNBREVFRWFJQVFQQ3lBQUlBQW9BZ1FRaVFFZ0JFRVljZ3NyQUNBQVFZQUJUd1IvSUFCQnp3Rk5CRUFnQUVHQUJXb1BDeUFBUVFGMFFmN0dBMm92QVFBRklBQUxDNHNDQVFOL0l3QkJFR3NpQkNRQUFrQWdCRUVNYWlBQUlBSWdBeENrQmlJQ1FRQklEUUFnQVNBQ2FpRURJQVFvQWd3aEFRTkFJQU5CQVdvaEFnSkFJQU10QUFBaUJVRS9UUVJBSUFWQkEzWWdBV3BCQVdvaUFTQUFTdzBESUFRZ0JVRUhjU0FCYWtFQmFpSUJOZ0lNSUFaQkFYTWhCZ3dCQ3lBRndFRUFTQVJBSUFRZ0FTQUZha0gvQUdzaUFUWUNEQXdCQ3lBQ0xRQUFJUUlnQlVIZkFFMEVRQ0FFSUFWQkNIUWdBbklnQVdwQi8vOEFheUlCTmdJTUlBTkJBbW9oQWd3QkN5QUVJQU10QUFJZ0JVRVFkQ0FDUVFoMGNuSWdBV3BCLy8vL0Ftc2lBVFlDRENBRFFRTnFJUUlMSUFBZ0FVa05BU0FHUVFGeklRWWdBaUVEREFBTEFBc2dCRUVRYWlRQUlBWUx2UUlCQjM4Q1FDQUJSUTBBQTBBZ0FrRURSZ1JBSUFGQkFYRWlCVVVnQVVFR2NVVnlJUWNEUUNBRVFla0NSZzBEQWtBQ1FDQURJQVJCQW5SQmtJSUNhaWdDQUNJQ1FRUjJRUTl4SWdaMlFRRnhSUTBBSUFKQkQzWWhBU0FDUVFoMlFmOEFjU0VJQWtBQ1FBSkFJQVpCQkdzT0FnQUJBZ3NnQjBVTkFTQUJJQVZxSVFaQkFDRUNBMEFnQWlBSVR3MERJQUlnQm1vaEFTQUNRUUpxSVFJZ0FDQUJJQUZCQVdvUWZrVU5BQXNNQXdzZ0IwVU5BQ0FCUVFGcUlRSWdCVVVFUUNBQUlBRWdBaEIrRFFNTElBQWdBaUFCUVFKcUlnSVFma1VFUUNBRlJRMENJQUFnQWlBQlFRTnFFSDVGRFFJTFFYOFBDeUFBSUFFZ0FTQUlhaEIrRFFFTElBUkJBV29oQkF3QkN3dEJmdzhGSUFFZ0FuWkJBWEVFUUNBQ1FRSjBRYkQrQTJvb0FnQWdBM0loQXdzZ0FrRUJhaUVDREFFTEFBc0FDMEVBQzdBQ0FnTi9BWDRqQUVFUWF5SUZKQUFDUUNBQUlBRkJBaEJsSWdkQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUFKQUFrQWdBa0VCUncwQUlBTXBBd0FpQVVJZ2lLY2lCRUVBSUFSQkMycEJFa2tiRFFBZ0FDQUZRUXhxSUFGQkFSRENBZzBCSUFBZ0IwRXdBbjRnQlNnQ0RDSUNRUUJPQkVBZ0FxME1BUXRDZ0lDQWdNQitJQUs0dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJGUVFCSURRRU1BZ3RCQUNFRUlBSkJBQ0FDUVFCS0d5RUNBMEFnQWlBRVJnMENJQU1nQkVFRGRHb3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUdJQVlvQWdCQkFXbzJBZ0FMSUFBZ0J5QUVJQUVRcFFFaEJpQUVRUUZxSVFRZ0JrRUFUZzBBQ3dzZ0FDQUhFQTlDZ0lDQWdPQUFJUWNMSUFWQkVHb2tBQ0FIQ3g0QUlBQkJNR3RCQ2trZ0FFRmZjVUhCQUd0QkdrbHlJQUJCM3dCR2NndE1BUUovSXdCQkVHc2lBeVFBQW44Z0FpQUJLQUlBSWdRdEFBQkhCRUFnQXlBQ05nSUFJQUJCb0pnQklBTVFPa0YvREFFTElBRWdCRUVCYWpZQ0FFRUFDeUVCSUFOQkVHb2tBQ0FCQzZ3QkF3RjhBWDRCZnlBQXZTSUNRalNJcDBIL0QzRWlBMEd5Q0UwRWZDQURRZjBIVFFSQUlBQkVBQUFBQUFBQUFBQ2lEd3NDZkNBQUlBQ2FJQUpDQUZrYklnQkVBQUFBQUFBQU1FT2dSQUFBQUFBQUFERERvQ0FBb1NJQlJBQUFBQUFBQU9BL1pBUkFJQUFnQWFCRUFBQUFBQUFBOEwrZ0RBRUxJQUFnQWFBaUFDQUJSQUFBQUFBQUFPQy9aVVVOQUJvZ0FFUUFBQUFBQUFEd1A2QUxJZ0FnQUpvZ0FrSUFXUnNGSUFBTEM1QUZBUWQvQWtBQ1FDQUJRZjhBVFFSQUlBSkZEUUVnQVVFZ2FpQUJJQUZCd1FCclFScEpHeUVCREFJTElBSkJBRWNoQ0VIb0FpRUZBMEFnQXlBRlNnMENJQUVnQXlBRmFrRUJkaUlHUVFKMFFaQ0NBbW9vQWdBaUIwRVBkaUlFU1FSQUlBWkJBV3NoQlF3QkN5QUJJQWRCQ0haQi93QnhJQVJxVHdSQUlBWkJBV29oQXd3QkN3c2dCMEVJZEVHQUhuRWlDU0FHUWNDTkFtb3RBQUFpQlhJaEF3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUhRUVIySWdkQkQzRWlCZzROQUFBQUFBRUNBd1FGQmdZSEJ3Z0xJQUpCQWtjZ0JrRUNTWElnQWlBSFFRRnhSM0VOQ1NBQklBUnJJQU5CQW5SQmtJSUNhaWdDQUVFUGRtb2hBUXdKQ3lBQklBUnJJZ05CQVhFZ0FrRUFSMFlOQ0NBRFFRRnpJQVJxSVFFTUNBc2dBU0FFYXlJRVFRRkdCRUJCQVVGL0lBSWJJQUZxSVFFTUNBc2dCQ0FDUlVFQmRFY05CMEVDUVg0Z0Foc2dBV29oQVF3SEN5QUJJQVJySVFFZ0FrVUVRQ0FBUVprSE5nSUVJQUFnQVNBRFFRVjJRZjRBY1VHd2tBSnFMd0VBYWpZQ0FFRUNEd3NnQVNBRlFUOXhRUUYwUWJDUUFtb3ZBUUJxSVFFTUJnc2dBa0VCUmcwRklBTWdBa0VDUmtFRmRHb2hBUXdGQ3lBQ1FRRkdEUVFnQTBFQmRFR3drQUpxTHdFQUlBSkJBa1pxSVFFTUJBc2dCa0VKYXlBSVJ3MERJQU5CQVhSQnNKQUNhaThCQUNFQkRBTUxJQVpCQzJzZ0FrY05BaUFBSUFWQlAzRkJBWFJCc0pBQ2FpOEJBRFlDQkNBQUlBTkJCWFpCL2dCeFFiQ1FBbW92QVFBZ0FTQUVhMm8yQWdCQkFnOExJQUlOQVNBQUlBbEJCM1pCc0pBQ2FpOEJBRFlDQUNBQUlBVkJEM0ZCQVhSQnNKQUNhaThCQURZQ0NDQUFJQVZCQTNaQkhuRkJzSkFDYWk4QkFEWUNCRUVERHdzZ0FVRWdheUFCSUFGQjRRQnJRUnBKR3lFQkN5QUFJQUUyQWdCQkFRdWdBUUVHZnlBRVFRQWdCRUVBU2hzaENTQUJRUkJxSVFjZ0FFRVFhaUVJSUFBaENrRUFJUVFDUUFOQUlBUWdDVVlOQVNBQ0lBUnFJUUFnQXlBRWFpRUZJQVJCQVdvaEJBSi9JQW90QUFkQmdBRnhCRUFnQ0NBQVFRRjBhaThCQUF3QkN5QUFJQWhxTFFBQUN5SUFBbjhnQVMwQUIwR0FBWEVFUUNBSElBVkJBWFJxTHdFQURBRUxJQVVnQjJvdEFBQUxJZ1ZHRFFBTElBQWdCV3NoQmdzZ0JndHNBUUYvQWtBQ1FDQUJRaUNJcHlJQ1FYOUhCRUFnQWtGNFJ3MEJEQUlMSUFHbklnSXZBUVpCQjBjTkFDQUNLUU1nSWdGQ2dJQ0FnSENEUW9DQWdJQ0FmMUlOQUF3QkN5QUFRZmJTQUVFQUVCVkNnSUNBZ09BQUR3c2dBYWNpQUNBQUtBSUFRUUZxTmdJQUlBRUxDUUFnQUNBQkVPd0RDOXdCQVFOL0l3QkJFR3NpQkNRQUFrQUNRQ0FCUW9DQWdJQndWQTBBSUFHbklnSXZBUVpCTUVZRVFBSkFJQUFnQkVFSWFpQUJRZUlBRUlFQklnTkZEUUFnQkNrRENDSUJRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFJQU1wQXdBUXRnTWhBZ3dFQ3lBQUlBRWdBeWtEQ0VFQklBTVFMeUlCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBQkVDWWlBa1VOQWlBQUlBTXBBd0FRbVFFaUEwRUFTQTBBSUFORkRRTWdBRUdUTjBFQUVCVUxRWDhoQWd3Q0N5QUNJQUl0QUFWQi9nRnhPZ0FGUVFFaEFnd0JDMEVBSVFJTElBUkJFR29rQUNBQ0M3QUVBd1YrQTM4QmZDTUFRUkJySWdza0FFRi9JUW9DUUNBQUlBdEJDR29nQVJDYkFnMEFBbndnQ3lzRENDSU52VUwvLy8vLy8vLy8vLzhBZzBLQmdJQ0FnSUNBK1A4QVdnUkFJQVFFUUVJQUlRRkVBQUFBQUFBQUFBQU1BZ3RCQUNFS0RBSUxBbjRnRFpsRUFBQUFBQUFBNEVOakJFQWdEYkFNQVF0Q2dJQ0FnSUNBZ0lDQWZ3c2hBVVFBQUFBQUFBQUFBQ0FEUlEwQUdrRUFJQUVRdUFOcklnQ3NRdURVQTM0Z0FYd2hBU0FBdHdzaERTQUJJQUZDZ0xpWktZRWlBVUkvaDBLQXVKa3BneUFCZkNJRmZVS0F1SmtwZnlJSVFwRE9BSDRpQVNBQlFzbjIzZ0dCSWdGOUlBRkNQNGRDdDRtaGZvTjhRc24yM2dGL1FySVBmQ0VCSUFXbklneEI0TlFEYlNFQUlBaENCSHhDQjRFaENRTkFBa0FnQ0NBQkVNd0VmU0lIUWdCVEJFQkNmeUVHREFFTFFnRWhCaUFISUFFUXl3UWlCVm9OQUNBRlF1MENmU0VJSUF4QmdOM2JBVzBoQ2lBQXdVRThieUVFSUF4QjZBZHRJZ0JCUEc4aEF5QUpRaitIUWdlRElBbDhJUWtnQUVHWWVHd2dER29oQUVJQUlRWURRRUlMSVFVQ1FDQUdRZ3RTQkVBZ0J5QUdwMEVDZEVHUTBnRnFOQUlBSUFoQ0FDQUdRZ0ZSRzN3aUJWa05BU0FHSVFVTElBSWdEVGtEUUNBQ0lBbTVPUU00SUFJZ0FMYzVBekFnQWlBRHR6a0RLQ0FDSUFTM09RTWdJQUlnQ3JjNUF4Z2dBaUFGdVRrRENDQUNJQUc1T1FNQUlBSWdCMElCZkxrNUF4QkJBU0VLREFRTElBWkNBWHdoQmlBSElBVjlJUWNNQUFzQUN5QUJJQVo4SVFFTUFBc0FDeUFMUVJCcUpBQWdDZ3QvQVFKL0l3QkJRR29pQVNRQUlBRWdBRUxvQjM4M0F6Z0NRRUg0M1FRdEFBQkJBWEVOQUVINDNRUXRBQUJCQVhFTkFFSDgzUVJCZ040RVFZVGVCQkFLUWZqZEJFRUJPZ0FBQ3lBQlFUaHFJQUZCREdvUUN5QUJRWWplQkVHRTNnUWdBU2dDTEJzb0FnQTJBalFnQVNnQ01DRUNJQUZCUUdza0FDQUNRVVJ0Q3hFQUlBQkJrSmtDUWJDaEFrRWhFS3dEQzlvQkFRTi9Ba0FDUUNBQlFhSi9SZ1JBUVg4aEF5QUFRUWdnQWhDZUFrVU5BUXdDQzBGL0lRTWdBRUdpZnlBQ0VMb0REUUVMUVFBaEF5QUFLQUlRSUFGSERRQkI2UUJCNmdBZ0FVR2lmMFliSVFVZ0FrRjdjU0VDSUFCQlFHc29BZ0FRTWlFRUEwQkJmeUVESUFBUUVnMEJJQUJCRVJBUUlBQWdCU0FFRUJ3YUlBQkJEaEFRQWtBZ0FVR2lmMFlFUUNBQVFRZ2dBaENlQWtVTkFRd0RDeUFBUWFKL0lBSVF1Z01OQWdzZ0FDZ0NFQ0lESUFGR0RRQUxJQU5CcUg5R0JFQWdBRUhYR1VFQUVCWkJmdzhMSUFBZ0JCQWVRUUFoQXdzZ0F3dTFJd0lLZndGK0l3QkJJR3NpQlNRQUlBRkJBbkVpQmtFQmRpRUtRWDRoQkFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQUNnQ0VDSURRWUFCYWc0SEFnTVBEUUVCQlFBTEFrQWdBMEhUQUdvT0RBa0xEQUVCQVFFS0FRRUJFZ0FMQWtBZ0EwRTVhZzRLQndFQkNBRUJBUUVRRVFBTElBTkJLRVlOQlNBRFFTOUdEUU1nQTBIYkFFWWdBMEg3QUVaeURRMExJQUFvQWpnaEFTQUZJQUFvQWhnaUF6WUNCQ0FGSUFFZ0EyczJBZ0FnQUVHT2xRRWdCUkFXREJZTEFrQUNRQUpBSUFBcEF5QWlERUlnaUtjaUFVRjNSd1JBSUFFTkFTQUFRUUVRRUNBQVFVQnJLQUlBSUF5bkVEa01Bd3NnQUNBTVFRQVF0QUZCQUU0TkFRd1lDeUFBSUF4QkFCQzBBVUVBU0EwWERBRUxJQUFvQWlnaEFTQUFRUUVRRUNBQVFVQnJLQUlBSUFFUU9TQUFRYkVCRUJBTFFYOGhBaUFBRUJJTkZnd1RDMEYvSVFJZ0FDQUFLUU1nUVFFUXRBRU5GU0FBRUJKRkRSSU1GUXRCZnlFRUN5QUFJQUFvQWpnZ0JHbzJBamdnQUNnQ0FDZ0MvQUZGQkVBZ0FFR205Z0JCQUJBV0RCTUxRWDhoQWlBQUVOZ0VEUk5CQUNFQklBQWdBQ2tESUVFQUVMUUJHaUFBS0FJQUlnTWdBQ2tESUNBQUtRTW9JQU1vQXZ3QkVSZ0FJZ3hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FBS0FKQUlnTUVRQ0FES0FKb1FRQkhRUUYwSVFFTElBQW9BZ0FpQXlBREtBSVFLUU9BQVNBQUtBSU1JQUFvQWhRZ0FSREtBZ3dVQ3lBQUlBeEJBQkMwQVNFQklBQW9BZ0FnREJBUElBRU5FeUFBUVRNUUVDQUFFQkpGRFJBTUV3c0NRQ0FCUVFSeFJRMEFRUUFoQkNBQVFRQkJBUkNlQVVHbWYwY05BRUYvSVFJZ0FFRURRUUFnQUNnQ0dDQUFLQUlVRU1RQlJRMFJEQk1MUVg4aEFpQUFFUElCUlEwUERCSUxRWDhoQWtFQUlRUWdBRUVDUVFBZ0FDZ0NHQ0FBS0FJVUVNUUJSUTBQREJFTFFYOGhBa0VBSVFRZ0FFRUJRUUFRN1FKRkRRNE1FQXRCZnlFQ0lBQVFFZzBQSUFCQkJ4QVFEQXdMUVg4aEFpQUFFQklORGlBQVFiZ0JFQkFnQUVFSUVCcEJBQ0VFSUFCQlFHc29BZ0JCQUJBWERBd0xRWDhoQWlBQUVCSU5EU0FBUVFrUUVBd0tDMEYvSVFJZ0FCQVNEUXdnQUVFS0VCQU1DUXNnQUNnQ0tBUkFJQUFRNGdFTUN3c0NRQ0FCUVFSeElnZEZEUUFnQUNnQ09FRUJFSU1CUWFaL1J3MEFRWDhoQWtFQUlRUWdBRUVEUVFBZ0FDZ0NHQ0FBS0FJVUVNUUJSUTBLREF3TEFrQWdBRUdGQVJCS1JRMEFJQUFvQWpoQkFSQ0RBVUVLUmcwQUlBQW9BaFFoQVNBQUtBSVlJUVpCZnlFQ0lBQVFFZzBNSUFBb0FoQWlBMEZIUmdSQUlBQkJBa0VDSUFZZ0FSREVBVVVOQ2d3TkMwR0ZBU0VFSUFkRkRRZ0NRQ0FEUVNoR0JIOGdBRUVBUVFFUW5nRkJwbjlHRFFFZ0FDZ0NFQVVnQXd0QmczOUhEUWtnQUNnQ0tBMEpJQUFvQWpoQkFSQ0RBVUdtZjBjTkNRc2dBRUVEUVFJZ0JpQUJFTVFCUlEwSkRBd0xJQUFvQWlBaUJFSE5BRWNFUUNBQUtBSUFJQVFRR0JvTUJ3c2dBQ2dDUUNnQ1hBMEdJQUJCd3NFQVFRQVFGZ3dLQ3lBQUlBVkJHR3BCQUJDZUFVRTlSZ1JBSUFCQkFFRUFRUUFnQlNnQ0dFRUNjVUVCRU1JQlFRQklEUW9NQ0FzZ0FDZ0NFRUg3QUVZRVFFRUFJUUVnQlVFQU5nSWNJQUFRRWcwRklBQkJDeEFRSUFCQlFHc2hBa0VBSVFRQ1FBTkFJQUFvQWhBaUFVSDlBRVlOQVFKQUFrQWdBVUduZjBZRVFDQUFFQklORHlBQUVGWU5EeUFBUVFjUUVDQUFRZE1BRUJBZ0FpZ0NBRUVHRUdRZ0FFRU9FQkFnQUVFT0VCQU1BUXNnQUNnQ0ZDRUhJQUFvQWhnaENDQUFJQVZCSEdwQkFVRUJRUUFReEFNaUJrRUFTQTBCQWtBQ1FDQUdRUUZHQkVBZ0FFRzRBUkFRSUFBZ0JTZ0NIQ0lCRUJvZ0FpZ0NBQ0lESUFNdkFid0JFQmNNQVFzZ0FDZ0NFRUVvUmdSQUlBQUNmeUFHUVg1eElnbEJBa1lFUUVFQUlRTWdCa0VDYWd3QkN5QUdRUU5yUVFBZ0JrRUVhMEVEU1JzaEEwRUdDeUFESUFnZ0J4REVBUTBFQWtBZ0JTZ0NIQ0lCUlFSQUlBQkIxUUFRRUF3QkN5QUFRZFFBRUJBZ0FDQUJFQm9MSUFJb0FnQkJCQ0FHUVFGclFRUnlJQWxCQWtjYlFmOEJjUkJrREFJTElBQkJPaEFzRFFNZ0FCQldEUU1DUUNBRktBSWNJZ0ZCeEFCSEJFQWdBUTBCSUFBUXdnTWdBRUhSQUJBUUlBQkJEaEFRUVFBaEFRd0RDeUFFQkVBZ0FFR3A1Z0JCQUJBV1FjUUFJUUVNRFFzZ0FFSFBBQkFRUVFFaEJFSEVBQ0VCREFJTElBQWdBUkNoQVFzZ0FFSE1BQkFRSUFBZ0FSQWFDeUFBS0FJQUlBRVFFd3NnQlVFQU5nSWNJQUFvQWhCQkxFY05BaUFBRUJKRkRRRUxDeUFGS0FJY0lRRU1CZ3RCQUNFQklBQkIvUUFRTEVVTkNBd0ZDeUFBRUJJTkNVRUFJUUVDUUFOQUlBQW9BaEFoQWdKQUEwQWdBa0hkQUVZZ0FVRWZTM0lnQWtHbmYwWnlJQUpCTEVaeURRRWdBQkJXRFEwZ0FVRUJhaUVCSUFBb0FoQWlBa0hkQUVZTkFBc2dBa0VzUncwQ0lBQVFFZzBNREFFTEN5QUFRU1lRRUNBQVFVQnJJZ01vQWdBZ0FVSC8vd054RUJkQkFDRUVBa0FDUUFOQUlBQW9BaEFoQWdKQUEwQWdBVUgvLy8vL0IwWU5BU0FDUWFkL1JnMEVJQUpCM1FCR0RRTUNRQ0FDUVN4R0JFQkJBU0VFSUFGQkFXb2hBUXdCQ3lBQUVGWU5FQ0FBUWN3QUVCQWdBeWdDQUNBQlFZQ0FnSUI0Y2hBNUlBRkJBV29oQVVFQUlRUWdBQ2dDRUNJQ1FTeEhEUUVMQ3lBQUVCSU5EZ3dCQ3d0Qi8vLy8vd2NoQVNBQ1FkMEFSdzBCQ3lBRVJRMEJJQUJCRVJBUUlBQkJBUkFRSUFCQlFHc29BZ0FnQVJBNUlBQkJ3d0FRRUNBQVFUQVFHZ3dCQ3lBQVFRRVFFQ0FBUVVCcktBSUFJQUVRT1FOQUFrQUNRQUpBSUFBb0FoQWlBVUduZjBjRVFFR1BBU0VDSUFGQkxFY05BVUVCSVFRTUFnc2dBQkFTRFE1QjBnQWhBaUFBRUZZTkRnd0JDeUFCUWQwQVJnMEJJQUFRVmcwTklBQkIwUUFRRUVFQUlRUUxJQUFnQWhBUUlBQW9BaEJCTEVjTkFDQUFFQkpGRFFFTURBc0xJQVFFUUNBQVFSSVFFQ0FBUWNNQUVCQWdBRUV3RUJvTUFRc2dBRUVPRUJBTElBQkIzUUFRTEEwSkRBY0xRWDhoQWtFQUlRUWdBRUVBUVFBUTFRUU5DUXdIQzBGL0lRSWdBQkFTRFFnZ0FDZ0NFRUV1UmdSQUlBQVFFZzBKSUFCQit3QVFTa1VFUUNBQVFlRDNBRUVBRUJZTUNnc2dBQ2dDUkVVRVFDQUFRZUR1QUVFQUVCWU1DZ3NnQUJBU0RRa2dBRUVNRUJBZ0FFRkFheWdDQUVFR0VHUU1CZ3NnQUVFb0VDd05DQ0FHUlFSQUlBQkIrNWdCUVFBUUZnd0pDeUFBRUZZTkNDQUFRU2tRTEEwSUlBQkJOUkFRUVFBaEJFRUJJUW9NQmd0QmZ5RUNJQUFRRWcwSEFrQWdBQ2dDRUNJQlFkc0FSaUFCUVM1R2NrVUVRQ0FCUVNoSERRRkJBaUVFSUFBb0FrQW9BbFFOQnlBQVFjdzlRUUFRRmd3SkN5QUFRVUJySWdFb0FnQW9BbGhGQkVBZ0FFR004Z0JCQUJBV0RBa0xJQUJCdUFFUUVDQUFRUWdRR2tFQUlRUWdBU2dDQUVFQUVCY2dBRUc0QVJBUUlBQkI4d0FRR2lBQktBSUFRUUFRRnlBQVFUUVFFQXdHQ3lBQVFkK1hBVUVBRUJZTUJ3dEJmeUVDSUFBUUVnMEdJQUFvQWhCQkxrWUVRQ0FBRUJJTkJ5QUFRZFlBRUVwRkJFQWdBRUgwTGtFQUVCWU1DQXNnQUVGQWF5Z0NBQ2dDVUVVRVFDQUFRY3MyUVFBUUZnd0lDeUFBRUJJTkJ5QUFRYmdCRUJBZ0FFSHhBQkFhUVFBaEJDQUFRVUJyS0FJQVFRQVFGd3dGQ3lBQVFRQVF1d01OQmtFQklRb2dBQ2dDRUVFb1JnUkFRUUVoQkF3RkN5QUFRUkVRRUNBQVFTRVFFRUVBSVFRZ0FFRkFheWdDQUVFQUVCY01CQXNnQUNnQ0FDQUJFQk1NQkF0QmZ5RUNJQUFRRWcwRUN5QUFRYmdCRUJBZ0FFRkFheUlCS0FJQUlBUVFPU0FCS0FJQUlnRWdBUzhCdkFFUUZ3dEJBQ0VFQ3lBRlFYODJBaHdnQUVGQWF5RUhBMEFnQnlnQ0FDRUdBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBbjhDUUNBQUtBSVFJZ0ZCcVg5SElnTkZCRUFnQUJBU0RRMGdBQ2dDRUNJQlFTaEdCRUJCQVNFSklBb05BZ3NnQVVIYkFFY05DQXdMQ3lBQlFZSi9SeUFFY2tVRVFFRUFJUWtnQlNnQ0hFRUFTQVJBUVFBaENFRUREQU1MSUFCQitzOEFRUUFRRmd3TkN5QUJRU2hIRFFaQkFDRUpJQXBGRFFZTElBQVFFZzBMSUFRTkFVRUJJUWhCQUFzaEJFRUFJUU5CQVNFQkFrQUNRQ0FHS0FLWUFpSUNRUUJJRFFBQ2Z3Si9Ba0FDUUFKQUFrQWdCaWdDZ0FJZ0Ftb2lDeTBBQUNJQ1FjY0FhdzRFQVFZR0F3QUxJQUpCd1FCR0JFQkJ3Z0FoQ0NBQ0RBUUxJQUpCdUFGR0RRRWdBa0crQVVjTkJVRy9BU0VJUWI0QkRBTUxRY2dBSVFoQnh3QU1BZ3NnQ1VVRVFFRXhJUU1nQ0NBTEtBQUJRVHBHY1EwRkN5QUxMd0FGSVFJZ0JpRURBMEFnQTBVRVFFRzRBU0VEREFVTElBTW9Bc3dCSUFKQkEzUnFRUVJxSVFJRFFDQUNLQUlBSWdKQkFFNEVRQ0FES0FKMElBSkJCSFJxSWdJb0FnQkIxQUJHQkVCQnZBRWhDRUc4QVNFRFFRRU1CZ1VnQWtFSWFpRUNEQUlMQUFzTElBTW9BZ3doQWlBREtBSUVJUU1NQUFzQUMwSEhBQ0VJUWNjQUN5RURRUUlMSVFFZ0N5QUlPZ0FBQ3lBSlJRMEFJQUFnQlVFY2FpQUJFT0VDQzBFQUlRa2dCRUVEUncwQklBQkJBU0FGUVJScUVOVUVEUW9NQXdzZ0JFRUNSaUVKUVFBaEF5QUVRUUpIRFFBZ0FFRzRBUkFRSUFCQjhnQVFHaUFIS0FJQVFRQVFGeUFBUVRRUUVDQUFRYmdCRUJBZ0FFSHhBQkFhSUFjb0FnQkJBQkFYUVFBaEFRd0JDMEVBSVFFZ0JFRUJSdzBBSUFCQkVSQVFDd0pBQTBBZ0FDZ0NFQ0lDUVNsR0RRRWdBVUgvL3dOR0JFQWdBRUhUTTBFQUVCWU1DZ3NnQWtHbmYwY0VRRUYvSVFJZ0FCQldEUXNnQVVFQmFpRUJJQUFvQWhCQktVWU5BaUFBUVN3UUxFVU5BUXdMQ3dzZ0JTQUJOZ0lVSUFCQkpoQVFJQWNvQWdBZ0FVSC8vd054RUJjZ0FFRUJFQkFnQnlnQ0FDQUJFRGtEUUFKQUFrQWdBQ2dDRUNJQlFhZC9Sd1JBSUFGQktVWU5BaUFBRUZZTkRDQUFRZEVBRUJCQmp3RWhBUXdCQzBGL0lRSWdBQkFTRFF4QjBnQWhBU0FBRUZZTkRBc2dBQ0FCRUJBZ0FDZ0NFRUVwUmcwQVFYOGhBaUFBUVN3UUxFVU5BUXdMQ3dzZ0FCQVNEUWdnQUVFT0VCQUNRQUpBQWtBQ1FDQURRYndCYXc0REFRTUJBQXNnQTBFeFJnMEJJQU5CeHdCR0RRQWdBMEhCQUVjTkFnc2dBRUVZRUJBZ0FFRW5FQkFnQnlnQ0FDQUVRUUZHRUJkQkFDRUVEQWtMSUFCQk1oQVFEQVlMSUFrRVFDQUFRU2NRRUNBSEtBSUFRUUVRRnlBQVFSRVFFQ0FBUWIwQkVCQWdBRUVJRUJwQkFDRUVJQWNvQWdCQkFCQVhJQUFRd0FNTUNBc2dCRUVCUmdSQUlBQkJHQkFRSUFCQkp4QVFJQWNvQWdCQkFSQVhRUUFoQkF3SUN5QUFRUVlRRUNBQVFSc1FFQ0FBUVNjUUVFRUFJUVFnQnlnQ0FFRUFFQmNNQndzZ0JTQUJOZ0lVSUFBUUVnMEhDd0pBQWtBQ1FBSkFJQU5CdkFGckRnTUJBd0VBQ3lBRFFURkdEUUVnQTBISEFFWU5BQ0FEUWNFQVJ3MENDeUFBUVNRUUVDQUhLQUlBSUFVdkFSUVFGMEVBSVFRTUJ3c2dBRUV4RUJBZ0J5Z0NBQ0FGTHdFVUVCY01CQXNDUUFKQUFrQWdCRUVCYXc0Q0FRQUNDeUFBUVNFUUVDQUhLQUlBSUFVdkFSUVFGeUFBUVJFUUVDQUFRYjBCRUJBZ0FFRUlFQnBCQUNFRUlBY29BZ0JCQUJBWElBQVF3QU1NQndzZ0FFRWhFQkFnQnlnQ0FDQUZMd0VVRUJkQkFDRUVEQVlMSUFCQkloQVFJQWNvQWdBZ0JTOEJGQkFYUVFBaEJBd0ZDeUFCUWRzQVJnMERJQUZCTGtjTkFTQUFFQklOQlNBQUtBSVFJUUVMQWtBZ0FVR3JmMFlFUUFKQUlBWW9BcGdDSWdGQkFFZ05BQ0FHS0FLQUFpQUJhaTBBQUVFMFJ3MEFJQUJCNXNNQVFRQVFGZ3dIQ3lBRFJRUkFJQUFnQlVFY2FrRUJFT0VDQ3lBQVFiNEJFQkFnQUNBQUtBSWdFQm9nQnlnQ0FDSUJJQUV2QWJ3QkVCY01BUXNnQVVHRGYwWWdBVUVsYWtGUlMzSkZCRUFnQUVHZTZBQkJBQkFXREFZTEFrQWdCaWdDbUFJaUFVRUFTQTBBSUFZb0FvQUNJQUZxTFFBQVFUUkhEUUFnQUNBQUtBSUFJQUFvQWlBUVhDSU1RUUVRdEFFaEFTQUFLQUlBSUF3UUR5QUJEUVlnQUVIS0FCQVFEQUVMSUFORkJFQWdBQ0FGUVJ4cVFRRVE0UUlMSUFCQndRQVFFQ0FBSUFBb0FpQVFHZ3RCZnlFQ0lBQVFFa1VOQXd3RkMwRUFJUUlnQlNnQ0hDSUJRUUJJRFFRZ0FDQUJFQjRNQkFzZ0J5Z0NBQ0FHTHdHOEFSQVhJQVpCQVRZQ1JFRUFJUVFNQVF0QkFDRUJJQVlvQXBnQ0lnSkJBRTRFUUNBR0tBS0FBaUFDYWkwQUFDRUJDeUFEUlFSQUlBQWdCVUVjYWtFQkVPRUNDMEYvSVFJZ0FCQVNEUUlnQUJDUkFRMENJQUJCM1FBUUxBMENJQUZCTkVZRVFDQUFRY29BRUJBRklBQkJ4d0FRRUFzTUFBc0FDMEYvSVFJTElBVkJJR29rQUNBQ0M0RUJBUUYvQWtBQ1FDQUFLQUlRUVlOL1J3MEFJQUFvQWlnTkFDQUFLQUlnSVFJZ0FDZ0NRQzBBYmtFQmNVVU5BU0FDUWMwQVJnMEFJQUpCT2tjTkFRc2dBRUdGTDBFQUVCWkJBQThMSUFBb0FnQWdBaEFZSVFJQ1FBSkFJQUVFUUNBQUlBSVExd1FOQVFzZ0FCQVNSUTBCQ3lBQUtBSUFJQUlRRTBFQUlRSUxJQUlMd0FFQkEzOGpBRUVRYXlJQ0pBQWdBRUVuRUVvRWZ5QUNJQUFvQWdRMkFnQWdBaUFBS0FJVU5nSUVJQUlnQUNnQ0dEWUNEQ0FDSUFBb0FqQTJBZ2hCZndKL1FYOGdBQkFTRFFBYUFrQWdBQ2dDRUNJRFFTMXFJZ1JCQjAxQkFFRUJJQVIwUWNFQmNSc2dBMEg3QUVaeVJRUkFRUUVnQTBIYkFFWU5BaG9nQTBHRGYwY05BVUVBSUFBb0FpZ05BaG9MSUFGQkJIRkJBbllnQUNnQ0JDQUFLQUlVUm5JTUFRdEJBQXNnQUNBQ0VPNENHd1ZCQUFzaEFDQUNRUkJxSkFBZ0FBdExBUUYvUVg4aEF5QUFJQUZCdEFKcVFRZ2dBVUc4QW1vZ0FTZ0N1QUpCQVdvUWVFVUVRQ0FCSUFFb0FyZ0NJZ05CQVdvMkFyZ0NJQUVvQXJRQ0lBTkJBM1JxSUFJM0F3QUxJQU1Ma1FFQkFuOGdBU2dDaUFFaUJFR0FnQVJPQkVBZ0FFSEFNMEVBRUVaQmZ3OExRWDhoQXlBQUlBRkJnQUZxUVJBZ0FVR0VBV29nQkVFQmFoQjRCSDlCZndVZ0FTQUJLQUtJQVNJRFFRRnFOZ0tJQVNBQktBS0FBU0FEUVFSMGFpSURRZ0EzQWdBZ0EwSUFOd0lJSUFNZ0FDQUNFQmcyQWdBZ0F5QURLQUlNUVlELy8vOEhjallDRENBQktBS0lBVUVCYXdzTGJnRUNmeUFBUWJnQkVCQWdBRUgyQUJBYUlBQkJRR3NpQWlnQ0FDSUJJQUV2QWJ3QkVCY2dBRUVSRUJBZ0FFSHBBRUYvRUJ3aEFTQUFRYmdCRUJBZ0FFRUlFQm9nQWlnQ0FFRUFFQmNnQUVFYkVCQWdBRUVrRUJBZ0FpZ0NBRUVBRUJjZ0FDQUJFQjRnQUVFT0VCQUxoZ0VCQW44Q1FBTkFJQUpCQUU0RVFBSkFJQUFvQW5RZ0FrRUVkR29pQkNnQ0FDQUJSdzBBSUFRb0Fnd2lCVUVDY1EwRElBTkZEUUFnQlVINEFIRkJHRVlOQXdzZ0JDZ0NDQ0VDREFFTEMwRi9JUUlnQUNnQ0lFVU5BQ0FBS0FJa0RRQWdBQ0FCRUtJQ0lnQUVRRUdBZ0lDQUJDRUNJQUF0QUFSQkFuRU5BUXRCZnlFQ0N5QUNDNUVCQVFWL0FrQUNRQ0FBS0FKQUlnRW9BcGdDSWdKQkFFZ05BQ0FCS0FLQUFpSURJQUpxSWdRdEFBQWlCVUhCQVVjRVFDQUZRYzBBUncwQklBRkJmellDbUFJZ0FTQUNOZ0tFQWlBQVFjNEFFQkFQQ3lBQ0lBUW9BQUZySUFOcUlnQkJBV290QUFCQjFnQkhEUUVnQUVIWEFEb0FBU0FCUVg4MkFwZ0NDdzhMUWQwMFFhNzhBRUh0c0FGQjQvVUFFQUFBQzFrQkEzOGdBQ2dDekFFZ0FrRURkR3BCQkdvaEF3TkFBa0JCZnlFRUlBTW9BZ0FpQTBGL1JnMEFJQUFvQW5RZ0EwRUVkR29pQlNnQ0JDQUNSdzBBSUFNaEJDQUZLQUlBSUFGR0RRQWdCVUVJYWlFRERBRUxDeUFFQzhvRkFnUi9BWDRDUUFKQUFrQUNmd0pBQWtBQ1FBSkFBa0FnQWtVTkFBSkFJQUJCd1FBUVNrVUVRQ0FBUWNJQUVFcEZEUUVMSUFBb0FnQWdBQ2dDSUJBWUlRVWdBQkFTRFFSQkFTRUhBa0FDUUNBQUtBSVFJZ2hCS0dzT0JRUUJBUUVFQUFzZ0NFRTZSaUFJUWYwQVJuSU5Bd3NnQUNnQ0FDQUZFQk5CQTBFQ0lBVkJ3Z0JHR3lFR0RBRUxJQUFvQWhCQktrWUVRQ0FBRUJJTkNFRUVJUVlNQVFzZ0FFR0ZBUkJLUlEwQUlBQW9BamhCQVJDREFVRUtSZzBBSUFBb0FnQWdBQ2dDSUJBWUlRVWdBQkFTRFFOQkFTRUhBa0FDUUNBQUtBSVFJZ2hCS0dzT0JRTUJBUUVEQUFzZ0NFRTZSaUFJUWYwQVJuSU5BZ3NnQUNnQ0FDQUZFQk5CQlNFR0lBQW9BaEJCS2tjTkFDQUFFQklOQjBFR0lRWUxJQUFvQWhBaUJVR0RmMGNnQlVFbGFrRlNTWEVOQVVFQUlRY2dCVUdEZjBZRVFDQUFLQUlvUlNFSEN5QUFLQUlBSUFBb0FpQVFHQ0VGSUFBUUVnMENDMEVBSUFZZ0EwVWdCMFZ5Y2cwREdpQUFLQUlRSWdCQk9rY2dBa1VnQUVFb1IzSnhJUVpCQUNFRURBWUxBa0FDUUFKQUlBVkJnQUZxRGdJQkFBSUxJQUFvQWdBZ0FDa0RJQkF4SWdWRkRRWWdBQkFTRFFJTUF3c0NRQ0FBS1FNZ0lnbENnSUNBZ0hDRFFvQ0FnSUR3ZmxFRVFDQUFLQUlBSWdJZ0NhZEJCR29nQURRQ0tDQUNLQUlRS0FMRUFoRTVBQ0lKUW9DQWdJQndnMEtBZ0lDQTRBQlJEUWNnQUNnQ0FDQUpFREVoQlNBQUtBSUFJQWtRRHd3QkN5QUFLQUlBSUFrUU1TRUZDeUFGUlEwRklBQVFFa1VOQWd3QkN5QUZRZHNBUndSQUlBUkZJQVZCcTM5SGNnMEVJQUFvQWdBZ0FDZ0NJQkFZSVFVZ0FCQVNEUUZCRUF3REN5QUFFQklOQkNBQUVKRUJEUVFnQUVIZEFCQXNEUVJCQUNFRlFRQU1BZ3NnQUNnQ0FDQUZFQk1NQXd0QkFBc2hCQ0FHUVFKSkRRSWdBQ2dDRUVFb1JnMENJQUFvQWdBZ0JSQVRDeUFBUVpQbUFFRUFFQllMSUFGQkFEWUNBRUYvRHdzZ0FTQUZOZ0lBSUFRZ0JuSUxhUUFnQVVFQmFrRUlUUVJBSUFBZ0FVSExBR3RCL3dGeEVCRVBDeUFCUVlBQmFrSC9BVTBFUUNBQVFiMEJFQkVnQUNBQlFmOEJjUkFSRHdzZ0FVR0FnQUpxUWYvL0EwMEVRQ0FBUWI0QkVCRWdBQ0FCUWYvL0EzRVFLZzhMSUFCQkFSQVJJQUFnQVJBZEMxOEJBMzhDUUFOQUlBRWdBa3dOQVFKQUFrQWdBQ0FDYWlJRkxRQUFJZ1pCdGdGSEJFQWdCa0hDQVVZTkFTQUdRZXNBUncwRUlBVW9BQUVnQTBjTkJBd0NDeUFGS0FBQklBTkdEUUVMSUFKQkJXb2hBZ3dCQ3d0QkFTRUVDeUFFQzRFQ0FRVi9JQUFnQVVGL0VHa2FBa0FEUUNBR1FRcEdCRUJCNndBaEJBd0NDd0pBSUFGQkFFZ05BQ0FCSUFBb0Fxd0NUZzBBSUFBb0FxUUNJQUZCRkd4cUtBSUlJUVVnQUNnQ2dBSWhCd05BQWtBQ1FDQUZJQWRxSWdndEFBQWlCRUcyQVVZTkFDQUVRY0lCUndSQUlBUkJEa2NOQWtFT0lRUURRQ0FISUFWQkFXb2lCV290QUFBaUEwRU9SZzBBQ3lBRFFTbEhEUVpCS1NFRURBWUxJQU5GRFFBZ0F5QUlLQUFCTmdJQUN5QUZJQVJCQW5SQmdMZ0JhaTBBQUdvaEJRd0JDd3NnQkVIckFFY05BaUFHUVFGcUlRWWdDQ2dBQVNFQkRBRUxDMEdGS1VHdS9BQkIvL01CUWVNdUVBQUFDeUFDSUFRMkFnQWdBQ0FCUVFFUWFSb2dBUXRvQUFKQUlBRkJBRTROQUVGL0lRRWdBQ2dDQUNBQVFhUUNha0VVSUFCQnFBSnFJQUFvQXF3Q1FRRnFFSGdOQUNBQUlBQW9BcXdDSWdGQkFXbzJBcXdDSUFBb0FxUUNJQUZCRkd4cUlnQkJBRFlDRUNBQVFuODNBZ2dnQUVLQWdJQ0FjRGNDQUFzZ0FRdWtBUUVDZnlBQktBTEFBaUlLUVlDQUJFNEVRQ0FBUWFZNlFRQVFSa0YvRHd0QmZ5RUpJQUFnQVVISUFtcEJDQ0FCUWNRQ2FpQUtRUUZxRUhnRWYwRi9CU0FCSUFFb0FzQUNJZ2xCQVdvMkFzQUNJQUVvQXNnQ0lBbEJBM1JxSWdrZ0JEc0JBaUFKSUFkQkEzUkJDSEVnQmtFQ2RFRUVjU0FEUVFGMFFRSnhJQUpCQVhGeWNuSWdDRUVFZEhJNkFBQWdDU0FBSUFVUUdEWUNCQ0FCS0FMQUFrRUJhd3NMTmdBQ1FDQUFJQUZCQ0JCUElnQkJBRWdOQUNBQktBSmdSUTBBSUFFb0FuUWdBRUVFZEdvaUFTQUJLQUlNUVFKeU5nSU1DeUFBQzRJQ0FRVi9Ba0FDUUFKQUlBSkJ6UUJHSUFKQk9rWnlSUVJBSUFBb0FnQWhCU0FDUVJaSERRRWdBQ2dDUUNFR0RBSUxJQUJCOE53QVFRQVFGZ3dDQ3lBQUtBSkFJZ1lvQXNBQ0lnZEJBQ0FIUVFCS0d5RUhBMEFnQkNBSFJnMEJJQVJCQTNRaENDQUVRUUZxSVFRZ0NDQUdLQUxJQW1vb0FnUWdBa2NOQUFzZ0FFSFgzQUJCQUJBV0RBRUxJQVVnQmlBRFFmMEFSa0VBSUFFb0FqZ2dBa0VCUVFGQkFCREpBeUlBUVFCSURRQWdCU0FCUVRScVFRd2dBVUU4YWlBQktBSTRRUUZxRUhnTkFDQUJJQUVvQWpnaUFrRUJhallDT0NBQktBSTBJUUVnQlNBREVCZ2hBeUFCSUFKQkRHeHFJZ0VnQURZQ0FDQUJJQU0yQWdSQkFBOExRWDhMdlFRQkNIOGpBRUVRYXlJRkpBQWdBRUZBYXlJR0tBSUFJUWdnQUNnQ0FDRUhJQUpCczM5SElRcEJ2WDlCdlg5QnVYOGdBa0ZUUmlJSkd5QUNRVXRHRzBIL0FYRWhDd0ovQWtBQ1FBTkFBa0FDUUNBQUtBSVFJZ1JCZzM5R0JFQWdBQ2dDS0FSQUlBQVE0Z0VNQmdzZ0NVVWdBa0ZMUjNFZ0J5QUFLQUlnRUJnaUJFRW5SM0pGQkVBZ0FFRzd4QUJCQUJBV1FTY2hCQXdGQ3lBQUVCSU5CQ0FBSUFRZ0FoQ2hBZzBFSUFNRVFDQUFJQVlvQWdBb0FwUURJQVFnQkVFQUVQY0JSUTBGQ3dKQUlBQW9BaEJCUFVZRVFDQUFFQklOQmlBS1JRUkFJQUJCdUFFUUVDQUFJQVFRR2lBR0tBSUFJQWd2QWJ3QkVCY2dBQ0FGUVF4cUlBVkJDR29nQlNBRlFRUnFRUUJCQUVFOUVMVUJRUUJJRFFjZ0FDQUJFTFlCQkVBZ0J5QUZLQUlBRUJNTUNBc2dBQ0FFRUtFQklBQWdCU2dDRENBRktBSUlJQVVvQWdBZ0JTZ0NCRUVBUVFBUXdRRU1BZ3NnQUNBQkVMWUJEUVlnQUNBRUVLRUJJQUFnQ3hBUUlBQWdCQkFhSUFZb0FnQWdDQzhCdkFFUUZ3d0JDeUFKUlFSQUlBSkJTMGNOQVNBQVFhbnFBRUVBRUJZTUJnc2dBRUVHRUJBZ0FFRzlBUkFRSUFBZ0JCQWFJQVlvQWdBZ0NDOEJ2QUVRRndzZ0J5QUVFQk1NQVFzZ0JFRWdja0g3QUVjTkFTQUFJQVZCREdwQkFCQ2VBVUU5UncwQklBQkJCaEFRUVg4Z0FDQUNRUUJCQVNBRktBSU1RUUp4UVFFUXdnRkJBRWdOQlJvTFFRQWdBQ2dDRUVFc1J3MEVHaUFBRUJKRkRRRU1Bd3NMSUFCQnlmY0FRUUFRRmd3QkN5QUhJQVFRRXd0QmZ3c2hCQ0FGUVJCcUpBQWdCQXZJQXdFT2YwR0FnQVFnQW1zaUNVRUFJQWxCZ0lBRVRSc2hEQ0FEUVFBZ0EwRUFTaHNoRFNBQVFSQnFJUXNnQUVITUFHb2hDU0FBUWNnQWFpRU9BMEFnQkNBTlJnUkFRUUFQQ3dKQUlBUWdERVlOQUNBQklBUkJER3hxSWdNb0FnQWhDaUFES0FJSUlROGdBeWdDQkNFUUFrQWdBQ2dDUUNJRElBSWdCR29pQlVzRVFDQUFLQUpFSWdNZ0JVRVliR29vQWdCRkRRRU1BZ3RCT2lBRlFRRnFJZ1lnQTBFRGJFRUJkaUlESUFNZ0JrZ2JJZ01nQTBFNlRCc2lCa0VEZENFUklBa2hBd05BQWtBZ0FDZ0NDQ0VISUFNb0FnQWlDQ0FPUmcwQUlBc2dDQ2dDRkNBUklBY1JBUUFpQjBVTkF5QUFLQUpBSVFNRFFDQURJQVpPUlFSQUlBY2dBMEVEZEdwQ2dJQ0FnQ0EzQXdBZ0EwRUJhaUVEREFFTEN5QUlJQWMyQWhRZ0NFRUVhaUVEREFFTEN5QUxJQUFvQWtRZ0JrRVliQ0FIRVFFQUlnTkZEUUVnQXlBQUtBSkFJZ2hCR0d4cVFRQWdCaUFJYTBFWWJCQXJHaUFBSUFZMkFrQWdBQ0FETmdKRUN5QURJQVZCR0d4cUlnTWdCVFlDQUNBS1FkNEJUZ1JBSUFBb0FqZ2dDa0VDZEdvb0FnQWlCU0FGS0FJQVFRRnFOZ0lBQ3lBRFFnQTNBaEFnQXlBUE5nSU1JQU1nRURZQ0NDQURJQW8yQWdRZ0JFRUJhaUVFREFFTEMwRi9DMWtCQVg4Z0FDQUFLQUpJSWdGQkFXc2dBWEkyQWtnZ0FDZ0NBQ0lCUVFoeEJFQWdBQ0FCUVNCeU5nSUFRWDhQQ3lBQVFnQTNBZ1FnQUNBQUtBSXNJZ0UyQWh3Z0FDQUJOZ0lVSUFBZ0FTQUFLQUl3YWpZQ0VFRUFDL2dDQWdSL0FYNGpBRUVnYXlJQ0pBQUNmd0pBSUFBb0FnQWdBa0VJYWtFZ0VEME5BQUpBQTBBQ1FDQUJJZ01nQUNnQ1BFOE5BQ0FEUVFGcUlRRUNRQUpBQWtBQ1FBSkFJQU10QUFBaUJVSGNBR3NPQlFJREF3TUJBQXNnQlVFa1J3MENRU1FoQkNBQkxRQUFRZnNBUncwRElBTkJBbW9oQVFzZ0FFR0NmellDRUNBQUlBVTJBaWdnQWtFSWFoQTJJUVlnQUNBQk5nSTRJQUFnQmpjRElFRUFEQWNMSUFKQkNHcEIzQUFRT3cwRklBRWdBQ2dDUEU4TkFpQURRUUpxSVFFZ0F5MEFBU0VGQ3dKQUFrQUNRQ0FGSWdSQkNtc09CQUVDQWdBQ0N5QUJJQUV0QUFCQkNrWnFJUUVMSUFBZ0FDZ0NDRUVCYWpZQ0NFRUtJUVFNQVFzZ0JNQkJBRTROQUNBQlFRRnJRUVlnQWtFRWFoQllJZ1JCLy8vREFFc05BeUFDS0FJRUlRRUxJQUpCQ0dvZ0JCQzVBVVVOQVF3REN3c2dBRUdKMndCQkFCQVdEQUVMSUFCQnRQQUFRUUFRRmdzZ0FpZ0NDQ2dDRUNJQVFSQnFJQUlvQWd3Z0FDZ0NCQkVBQUVGL0N5RUJJQUpCSUdva0FDQUJDMVlCQW40Q2YwRUFJQUZDZ0lDQWdIQlVEUUFhSUFBZ0FVSFNBU0FCUVFBUUZDSUNRb0NBZ0lCd2d5SURRb0NBZ0lBd1VnUkFRWDhnQTBLQWdJQ0E0QUJSRFFFYUlBQWdBaEFtRHdzZ0FhY3ZBUVpCRWtZTEMwQUJBWDhqQUVFUWF5SUNKQUFDZnlBQklBQW9BaEJIQkVBZ0FpQUJOZ0lBSUFCQm9KZ0JJQUlRRmtGL0RBRUxJQUFRb2dFTElRQWdBa0VRYWlRQUlBQUx6d1VDQW40RWZ5TUFRUkJySWdZa0FDQUFLQUlBSVFVQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUFvQWhBaUJFR0FBV29PQkFJQkJRTUFDeUFFUWF4L1JnMERJQVJCMndCSEJFQWdCRUg3QUVjTkJVS0FnSUNBSUNFQklBQVFvZ0VOQ1VLQWdJQ0E0QUFoQVNBRkVEUWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEpBa0FnQUNnQ0VDSURRZjBBUmcwQUEwQUNRQ0FEUVlGL1JnUkFJQVVnQUNrRElCQXhJZ01OQVF3TUN5QUFLQUpNUlNBRFFZTi9SM0lOQ2lBRklBQW9BaUFRR0NFREN3SkFBa0FnQUJDaUFRMEFJQUJCT2hEUkF3MEFJQUFRMGdNaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkN5QUZJQU1RRXd3TEN5QUZJQUlnQXlBQlFRY1FHU0VFSUFVZ0F4QVRJQVJCQUVnTkNpQUFLQUlRUVN4SERRRWdBQkNpQVEwS0lBQW9Ba3hGSUFBb0FoQWlBMEg5QUVkeURRQUxDeUFDSVFFZ0FFSDlBQkRSQXcwSkRBb0xRb0NBZ0lBZ0lRRWdBQkNpQVEwSVFvQ0FnSURnQUNFQklBVVFQaUlDUW9DQWdJQndnMEtBZ0lDQTRBQlJEUWdDUUNBQUtBSVFRZDBBUmcwQUEwQWdBQkRTQXlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFrZ0JTQUNJQU1nQVVFSEVLOEJRUUJJRFFrZ0FDZ0NFRUVzUncwQklBQVFvZ0VOQ1NBRFFRRnFJUU1nQUNnQ1RFVU5BQ0FBS0FJUVFkMEFSdzBBQ3dzZ0FpRUJJQUJCM1FBUTBRTU5DQXdKQ3lBQUtRTWdJZ0ZDSUlpblFYVlBCRUFnQWFjaUJDQUVLQUlBUVFGcU5nSUFDeUFCSVFJZ0FCQ2lBUTBIREFnTElBQXBBeUFpQVNFQ0lBQVFvZ0VOQmd3SEN5QUFLQUlnUVFGcklnUkJBa3NOQVNBRVFRTjBRYWorQVdvcEF3QWlBU0VDSUFBUW9nRU5CUXdHQ3lBQVFmb2xRUUFRRmd3QkN5QUFLQUk0SVFNZ0JpQUFLQUlZSWdRMkFnUWdCaUFESUFSck5nSUFJQUJCdFpVQklBWVFGZ3RDZ0lDQWdDQWhBUXdDQ3lBQVFkM2xBRUVBRUJZTElBSWhBUXNnQlNBQkVBOUNnSUNBZ09BQUlRSUxJQVpCRUdva0FDQUNDeFVCQVg0Z0FDQUJFUFlFSVFJZ0FDQUJFQThnQWd1NER3SUVmd3ArSXdCQkVHc2lCU1FBSUFVZ0FqY0RDQUpBQWtBQ2ZnSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FFRUhJQUpDSUlpbklnUWdCRUVIYTBGdVNSdEJDbW9PRWdjRUFnTUNBZ0lDQWdBRUJBUUNBZ0lDQVFJTEFrQUNRQUpBQWtBQ1FBSkFJQUtuSWdRdkFRWWlCa0VFYXc0REFnRURBQXNnQmtFaGF3NENDd01FQzBLQWdJQ0FNQ0VLSUFBZ0FoQTNJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5DeUFBSUFJUTB3TWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMExJQUVvQWlnZ0FoQi9JUVFNRGd0Q2dJQ0FnREFoQ2lBQUlBSVFqUUVpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBLSUFFb0FpZ2dBaEIvSVFRTURRc2dBU2dDS0NBRUtRTWdFSWNCSVFRZ0FDQUNFQThNREFzZ0FTZ0NLQ0FDRUg4aEJBd0xDMEtBZ0lDQU1DRUxJQUFnQVNrRENFRUJJQVZCQ0dvUTFnTWlDRUtBZ0lDQThBQ0RRb0NBZ0lEZ0FGRU5CU0FBSUFnUUpnUkFJQUJCeS9BQVFRQVFGUXdHQ3lBRFFpQ0lwMEYxVHdSQUlBT25JZ1FnQkNnQ0FFRUJhallDQUFzZ0FTa0RHQ0lJUWlDSXAwRjFUd1JBSUFpbklnUWdCQ2dDQUVFQmFqWUNBQXNDUUFKQUFrQUNRQ0FBSUFNZ0NCREVBaUlNUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJDZ0lDQWdEQWhDZ3dCQ3lBQktRTVlJZ2hDZ0lDQWdIQ0RRb0NBZ0lDUWYxRUVRQ0FJcHlnQ0JFSC8vLy8vQjNGRkRRTUxJQXhDSUlpblFYVlBCRUFnREtjaUJDQUVLQUlBUVFGcU5nSUFDeUFBUWN1ZUFTQU1RY3llQVJDK0FTSUtRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRRUxRb0NBZ0lBd0lRME1Cd3NnQUVHRW1nRVFZaUlOUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVNQmdzZ0FTa0RJQ0lLUWlDSXAwRjFUd1JBSUFxbklnUWdCQ2dDQUVFQ2FqWUNBQXNnQ2lFTkN5QUFJQUFnQVNrRENFRUJJQVZCQ0dwQkFCRDRCQkQ4QVEwRUlBQWdBaERLQVNJRVFRQklEUVFDUUFKQUlBUUVRQ0FBSUFVZ0FoQThEUWNnQVNnQ0tFSGJBQkE3R2lBRktRTUFJZzVDQUNBT1FnQlZHeUVRSUFGQktHb2hCZ0pBQTBBZ0NTQVFVUTBCSUFFb0FpZ2hCQUpBQWtBZ0NWQkZCRUFnQkVFc0VEc2FJQUVvQWlnZ0NoQ0hBUm9nQUNBQ0lBa1FjeUlQUW9DQWdJQndnMEtBZ0lDQTRBQlJEUXdnQ1VLQWdJQ0FDRm9OQVNBSklRZ01BZ3NnQkNBS0VJY0JHa0lBSVFnZ0FDQUNRZ0FRVFNJUFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFzTUFRdENnSUNBZ01CK0lBbTV2U0lJUW9DQWdJREFnWUQ4L3dCOUlBaEMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYklRZ0xJQUFnQ0JBM0lnaENnSUNBZ0hDRFFvQ0FnSURnQUZFTkRpQUFJQUVnQWlBUElBZ1ExUU1oRHlBQUlBZ1FEeUFQUW9DQWdJQndneUlSUW9DQWdJRGdBRkVOQ1NBSlFnRjhJUWxDZ0lDQWdEQWhDQ0FBSUFGQ2dJQ0FnQ0FnRHlBUlFvQ0FnSUF3VVJzZ0RCRFVBMFVOQUFzTURRc2dEa0lBVndSQVFkMEFJUVJDZ0lDQWdEQWhDQXdEQ3lBQktRTVlJZ2xDZ0lDQWdIQ0RRb0NBZ0lDUWYxSUVRRUhkQUNFRVFvQ0FnSUF3SVFnTUFndEIzUUFoQkVLQWdJQ0FNQ0VJSUFtbktBSUVRZi8vLy84SGNRMEJEQUlMQWtBZ0FTa0RFQ0lMUW9DQWdJQndneUlKUW9DQWdJQXdVZ1JBSUF0Q0lJaW5RWFZKRFFFZ0M2Y2lCQ0FFS0FJQVFRRnFOZ0lBREFFTElBQWdBa0VSUVFBUXFnSWlDMEtBZ0lDQWNJTWhDUXRDZ0lDQWdEQWhDQ0FKUW9DQWdJRGdBRkVOQ3lBQUlBVWdDeEE4RFFzZ0FTZ0NLRUg3QUJBN0drSUFJUWtnQlNrREFDSUlRZ0FnQ0VJQVZSc2hEeUFCUVNocUlRWkJBQ0VFUW9DQWdJQXdJUWdEUUNBSklBOVNCRUFnQUNBSUVBOGdBQ0FMSUFrUWN5SUlRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRMGdDRUlnaUtkQmRVOEVRQ0FJcHlJSElBY29BZ0JCQVdvMkFnQUxJQUFnQWlBSUVFMGlEa0tBZ0lDQWNJTkNnSUNBZ09BQVVRME5JQUFnQVNBQ0lBNGdDQkRWQXlJT1FvQ0FnSUJ3Z3lJUVFvQ0FnSUF3VWdSQUlCQkNnSUNBZ09BQVVRME9JQVFFUUNBQktBSW9RU3dRT3hvTElBQWdDQkRUQXlJSVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQU9FQThNRHdzZ0FTZ0NLQ0FLRUljQkdpQUJLQUlvSUFnUWh3RWFJQUVvQWloQk9oQTdHaUFCS0FJb0lBMFFod0VhUVFFaEJDQUFJQUVnRGlBTUVOUUREUTRMSUFsQ0FYd2hDUXdCQ3dzZ0JFVUVRRUg5QUNFRURBSUxRZjBBSVFRZ0FTZ0NHQ2dDQkVILy8vLy9CM0ZGRFFFTElBWW9BZ0JCQ2hBN0dpQUdLQUlBSUFNUWh3RWFDeUFCS0FJb0lBUVFPeHBCQUNFRUlBQWdBQ0FCS1FNSUlBVWdCVUVBRVBjRUVQd0JEUWtnQUNBQ0VBOGdBQ0FMRUE4Z0FDQUtFQThnQUNBTkVBOGdBQ0FNRUE4Z0FDQUlFQThNQ2d0Q2dJQ0FnQ0FnQWlBQ1FvQ0FnSURBZ1lEOC93QjhRb0NBZ0lDQWdJRDQvd0NEUW9DQWdJQ0FnSUQ0L3dCUkd5RUNEQUlMSUFBZ0FoQVBRUUFoQkF3SUMwS0FnSUNBTUNFS1FvQ0FnSUF3SVExQ2dJQ0FnREFoQzBLQWdJQ0FNQ0VJUW9DQWdJQXdJUXdnQUNBQ0VOTURJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CZ3NnQVNnQ0tDQUNFSDhoQkF3R0MwS0FnSUNBTUNFSURBUUxRb0NBZ0lBd0lRcENnSUNBZ0RBTUFnc2dBRUdDSGtFQUVCVkNnSUNBZ0RBaENndENnSUNBZ0RBaEMwS0FnSUNBTUFzaERVS0FnSUNBTUNFSVFvQ0FnSUF3SVF3TElBQWdBaEFQSUFBZ0N4QVBJQUFnQ2hBUElBQWdEUkFQSUFBZ0RCQVBJQUFnQ0JBUFFYOGhCQXNnQlVFUWFpUUFJQVFML0FJQ0FYOEJmaU1BUVNCcklnVWtBQ0FGSUFRM0F4Z0NRQUpBQWtBZ0EwS0FnSUNBY0lOQ2dJQ0FnT0IrVWlBRFF2Ly8vLzl2V0hGRkJFQkNnSUNBZ09BQUlRWWdBQ0FEUVpFQklBTkJBQkFVSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBRElRUU1Bd3NnQUNBRUVEZ0VRQ0FBSUFRZ0EwRUJJQVZCR0dvUUx5RUVJQUFnQXhBUElBUkNnSUNBZ0hDRFFvQ0FnSURnQUZJTkFnd0RDeUFBSUFRUUR3c2dBeUVFQ3dKQUlBRXBBd0FpQTBLQWdJQ0FjSU5DZ0lDQWdEQlJCRUFnQkNFRERBRUxJQVVnQkRjRENDQUZJQVVwQXhnM0F3QWdBQ0FESUFKQkFpQUZFQ0VoQXlBQUlBUVFEMEtBZ0lDQTRBQWhCaUFESVFRZ0EwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQkN3SkFRUWNnQTBJZ2lLY2lBU0FCUVFkclFXNUpHMEVLYWlJQlFSRkxEUUJCQVNBQmRFR0x1QXh4RFFJZ0FVRUpSdzBBSUFNaEJFS0FnSUNBTUNFR0lBQWdBeEE0UlEwQ0RBRUxJQU1oQkVLQWdJQ0FNQ0VHQ3lBQUlBUVFEeUFHSVFNTElBVkJJR29rQUNBREM1NERBZ1YrQW44akFFRWdheUlKSkFCQ2dJQ0FnT0FBSVFRQ1FDQUFJQWxCR0dvZ0FDQUJFQ1VpQnhBOERRQUNRQ0FKS1FNWUlnVkNBRmNOQUNBSlFnQTNBeEFnQWtFQ1RnUkFJQUFnQ1VFUWFpQURLUU1JUWdBZ0JTQUZFSFFOQWdzQ1FBSkFJQWNnQ1VFTWFpQUpRUWhxRUlvQ1JRUkFJQWtwQXhBaEFRd0JDeUFKS1FNUUlnRWdDVFVDQ0NJRUlBRWdCRlViSVFnZ0NTZ0NEQ0VDQTBBZ0FTQUlVUTBCSUFNcEF3QWlCRUlnaUtkQmRVOEVRQ0FFcHlJS0lBb29BZ0JCQVdvMkFnQUxJQUlnQWFkQkEzUnFLUU1BSWdaQ0lJaW5RWFZQQkVBZ0JxY2lDaUFLS0FJQVFRRnFOZ0lBQ3lBQUlBUWdCa0VDRUx3QkRRSWdBVUlCZkNFQkRBQUxBQXNnQVNBRklBRWdCVlViSVFVRFFDQUJJQVZSRFFKQ2dJQ0FnT0FBSVFRZ0FDQUhJQUVRY3lJR1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFNZ0F5a0RBQ0lFUWlDSXAwRjFUd1JBSUFTbklnSWdBaWdDQUVFQmFqWUNBQXNnQUNBRUlBWkJBaEM4QVEwQklBRkNBWHdoQVF3QUN3QUxRb0dBZ0lBUUlRUU1BUXRDZ0lDQWdCQWhCQXNnQUNBSEVBOGdDVUVnYWlRQUlBUUx0d0VCQW44Q1FBSjhBa0FDUUFKQUFrQUNRRUVISUFCQ0lJaW5JZ0lnQWtFSGEwRnVTUnNpQWtFSWFnNEtBZ0VHQmdZR0JnSURBQVFMSUFDbklRRU1CUXNnQUtkQkFCQ3dCU0VCREFRTElBQ25RZHNZYkNFQkRBTUxJQUNuUWRzWWJMY01BUXNnQWtFSFJ3MEJSQUFBQUFBQUFQaC9JQUJDZ0lDQWdNQ0JnUHovQUh3aUFMOGdBRUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0x2U0lBUWlDSUlBQ0ZwMEhiR0d3aEFRc2dBU0FDY3dzRUFFRUFDMWdCQW44Z0FRUkFBa0FnQUNnQ0NDQUFLQUlFSWdNZ0FXcEpEUUFnQVJDeEFTSUJSUTBBSUFBZ0EwRUlhallDQkNBQUlBQW9BZ0JCQVdvMkFnQWdBU0VDQ3lBQ0R3dEJvSkFCUWE3OEFFR2lEVUg2K3dBUUFBQUxwQUVDQW44QmZpTUFRUkJySWdRa0FBSkFJQUFnQVNBQ0lBTVFwd0VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBQWtBZ0FDQUJFSklCSWdWQkFFZ05BQ0FDUVFGSERRRWdBeWtEQUNJR1FpQ0lwMEYxVHdSQUlBYW5JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUVRUWhxSUFZUW93RU5BQ0FFS1FNSUlBV3RWdzBCSUFCQjBOUUFRUUFRRlFzZ0FDQUJFQTlDZ0lDQWdPQUFJUUVMSUFSQkVHb2tBQ0FCQzVnQkFRUi9JQUduSWdZdkFRWkI1YVlCYWpFQUFDRUJJQUJCR0JBcElnVkZCRUFnQUNBQ0VBOUJmdzhMSUFLbklnY29BaUFoQUNBRklBUWdBWVkrQWhRZ0JTQURweUlJTmdJUUlBVWdCellDRENBRklBWTJBZ2dnQUNnQ0RDSUhJQVUyQWdRZ0JTQUFRUXhxTmdJRUlBVWdCellDQUNBQUlBVTJBZ3dnQmlBRVBnSW9JQVlnQlRZQ0lDQUdJQUFvQWdnZ0NHbzJBaVJCQUF1b0FnRUVmeUFBS0FJUUlRWUNRQUpBSUFBZ0FTQURFR1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFKQ2dJQ0FnQWhhQkVBZ0FFSDIyQUJCQUJCUURBSUxJQUJCSEJBcElnUkZCRUJCQUNFRURBSUxJQVFnQXFjaUJUWUNBQUpBQWtBZ0EwRVVSdzBBSUFZb0FyZ0JJZ2RGRFFBZ0JDQUdLQUxFQVVFQklBVWdCVUVCVEJzZ0J4RURBQ0lHTmdJSUlBWkZEUU1nQmtFQUlBVVFLeG9NQVFzZ0JDQUFRUUVnQlNBRlFRRk1HeEJmSWdVMkFnZ2dCVVVOQWdzZ0JFSFNBRFlDR0NBRVFRQTJBaFFnQkVFQU9nQUVJQVFnQkVFTWFpSUFOZ0lRSUFRZ0FEWUNEQ0FFSUFOQkZFWTZBQVVnQVVLQWdJQ0FjRlFOQUNBQnB5QUVOZ0lnQ3lBQkR3c2dBQ0FCRUE4Z0FDZ0NFQ0lBUVJCcUlBUWdBQ2dDQkJFQUFFS0FnSUNBNEFBTEd3QWdBU2dDSUFSQUlBQWdBVUVvYWhEK0FpQUJRUUEyQWlBTEMyWUNBbjhCZmlNQVFSQnJJZ01rQUVGL0lRUUNRQ0FBSUFGQ0FCQk5JZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFOQkRHb2dCUkNZQVEwQUlBQWdBVUVBSUFNb0Fnd2dBbW9pQUswUXBRRkJBRWdOQUNBQVJTRUVDeUFEUVJCcUpBQWdCQXNOQUNBQUlBRWdBa0VCRUlNRkN5RUFJQUVvQWdSQkJVY0VRQ0FCUVFVMkFnUWdBQ2dDRUNBQlFRaHFFUDRDQ3d1UkFRRURmd0pBSUFBb0FnZ2lCRUg5Ly8vL0Iwb05BQ0FDUVFaR0JFQWdBU0FEU0E4TElBUkJnSUNBZ0hoR0lBRkJBbW9nQTBweURRQWdBQ2dDRUNJR0lBQW9BZ3dpQkNBQlFYOXpJZ0FnQkVFRmRHb2lBUkNaQWlBQ1FYdHhSWE1oQWlBQUlBTnFJUUFEUUNBQVJRMEJJQUJCQVdzaEFDQUdJQVFnQVVFQmF5SUJFSmtDSUFKR0RRQUxRUUVoQlFzZ0JRc3BBUUYvSUFKQ0lJaW5RWFZQQkVBZ0FxY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBRWdBaENRQlF1akJRRU1meU1BUVRCcklnUWtBQUpBQWtBQ1FDQUFJQUZHSUFBZ0FrWnlSUVJBSUFFb0FnaEJBRW9FUUNBQktBSUVJUVlMSUFJb0FnaEJBRW9FUUNBQ0tBSUVJUWNMSUFaRkJFQWdBU0VGREFJTElBQW9BZ0FoQlNBRVFnQTNBaFFnQkVLQWdJQ0FnSUNBZ0lCL053SU1JQVFnQlRZQ0NDQUVRUWhxSVFVZ0JTQUJRZ0ZCLy8vLy93TkJBUkIxUlEwQlFRQWhBZ3dDQzBHcWpBRkIxUHdBUVpvU1FmREpBQkFBQUFzQ1FBSkFBbjhnQjBVRVFFRUFJQU5CQWs4TkFSb2dCa1VoQ1NBR0lRZ01BZ3NnQUNnQ0FDRUJJQVJDQURjQ0tDQUVRb0NBZ0lDQWdJQ0FnSDgzQWlBZ0JDQUJOZ0ljSUFSQkhHb2dBa0lCUWYvLy8vOERRUUVRZFFSQUlBUkJIR29oQWd3RUN5QUVRUnhxSVFJZ0JpQUhJQU1Ra0FZTElnaEZJUWtnQTBFQ1J5QUljZzBBQW44Z0JpQUhja1VFUUNBRktBSUlJZ0VnQWlnQ0NDSUlJQUVnQ0VnYkRBRUxJQVpGQkVBZ0JTZ0NDQXdCQ3lBQ0tBSUlDeUVCUVFBaENFRUJJUWtNQVFzZ0JTZ0NDQ0lCSUFJb0FnZ2lDaUFCSUFwS0d5RUJDeUFBUVFFZ0FTQUJRUUZNRzBFZmFpSUtRUVYySWdzUVFRMEFRUUFoQVVFQUlBaHJJUXhCQUNBSGF5RUhRUUFnQm1zaEJpQUNLQUlNUVFWMElBSW9BZ2hySVEwZ0JTZ0NERUVGZENBRktBSUlheUVPQTBBZ0FTQUxSa1VFUUNBQUtBSVFJQUZCQW5ScUlBVW9BaEFnQlNnQ0RDQU9JQUZCQlhRaUQyb1FhQ0FHY3lBQ0tBSVFJQUlvQWd3Z0RTQVBhaEJvSUFkeklBTVFrQVlnREhNMkFnQWdBVUVCYWlFQkRBRUxDeUFBSUFnMkFnUWdBQ0FLUVdCeE5nSUlJQUJCLy8vLy93TkJBUkN6QWhwQkFDRUJJQWtOQVNBQUlBQkNmMEgvLy8vL0EwRUJFSFZGRFFFTElBQVFOVUVnSVFFTElBUkJDR29nQlVZRVFDQUVRUWhxRUJzTElBUkJIR29nQWtZRVFDQUVRUnhxRUJzTElBUkJNR29rQUNBQkMvNEZBUWQvSXdCQk1Hc2lCU1FBQWtBQ1FDQUFJQUpHSUFBZ0EwWnlSUVJBSUFFZ0FrWWdBU0FEUm5JTkFTQUFJQUZHRFFJQ1FBSkFJQUlvQWd3aUNBUkFJQU1vQWd3aUNRMEJDMEVBSVFRZ0FFRUFFSWtCQWtBZ0FpZ0NDQ0lBUWYvLy8vOEhSd1JBSUFNb0FnZ2lBMEgvLy8vL0IwY05BUXNnQVJBMURBSUxJQUJCL3YvLy93ZEhJQU5CZ0lDQWdIaEhjVVVFUUNBQkVEVkJBU0VFREFJTElBRWdBaEJFR2lBQlFmLy8vLzhEUVFFUXpnRWhCQXdCQ3lBQ0tBSUVJZ2NnQXlnQ0JITWhDZ0pBQWtBQ1FBSkFBa0FnQkVFQ2F3NEZBQUVFQWdNRUN5QUtJUVlNQXdzZ0NrRUJjeUVHREFJTFFRRWhCZ3dCQ3lBSElRWUxJQVVnQWlnQ0NDSUhOZ0lrSUFJb0FoQWhDeUFGSUFnMkFpZ2dCU0FMTmdJc0lBVkJBRFlDSUNBRklBTW9BZ2dpQ0RZQ0VDQURLQUlRSVFNZ0JTQUpOZ0lVSUFVZ0F6WUNHQ0FGUVFBMkFnd0NRQ0FGUVJ4cUlBVkJDR29RMHdGQkFFZ0VRQ0FBUWdBUU1Cb2dBU0FGUVJ4cUVFUWFEQUVMSUFBZ0JVRWNhaUlKSUFWQkNHb2lDMEVCSUFjZ0NHc2lBeUFEUVFGTUcwRUJha0VCRUpVQkdpQUFRUUVRMFFFYUlBRWdBQ0FMUWYvLy8vOERRUUVRUXhvZ0FTQUpJQUZCLy8vLy93TkJBUkRrQVJvTEFrQWdBQ2dDQ0NJSFFmLy8vLzhIUmcwQUlBRW9BZ2hCLy8vLy93ZEdEUUFDUUNBQktBSU1SUTBBQWtBQ1FBSkFJQVFPQlFBQkFRRUFBUXNnQlNBRktBSVFJZ1pCQVdzMkFoQWdBU0FGUVFocUVOTUJJUU1nQlNBR05nSVFJQU5CQUVvTkFTQUREUUlnQkVFRVJnMEJJQUFvQWhBZ0FDZ0NEQ0lESUFOQkJYUWdCMnNRbVFJTkFRd0NDeUFHUlEwQkN5QUFJQUJDQVVILy8vLy9BMEVCRUhVZ0FTQUJJQVZCQ0dwQi8vLy8vd05CQVJEa0FYSkJJSEVOQVFzZ0FTQUJLQUlFSUFJb0FnUnpOZ0lFSUFBZ0NqWUNCQ0FCUWYvLy8vOERRUUVRemdFaEJBd0JDeUFBRURVZ0FSQTFRU0FoQkFzZ0JVRXdhaVFBSUFRUEMwSEQvUUJCMVB3QVFjd05RZC9TQUJBQUFBdEJzdjBBUWRUOEFFSE5EVUhmMGdBUUFBQUxRZkhJQUVIVS9BQkJ6ZzFCMzlJQUVBQUFDL2NCQVFSL0l3QkJJR3NpQnlRQUFrQWdBa0VCUmdSQUlBQWdBVFVDQUJBd0lRTU1BUXNnQkVFQmRDQURRUUZxSWdsMlFRRnFRUUYySVFnZ0JpQURRUlJzYWlJS0tBSU1SUVJBSUFvZ0JTQUlRZi8vLy84RFFRRVEvQUlpQXcwQkN5QUFJQUVnQ0VFQ2RHb2dBaUFJYXlBSklBUWdCU0FHRU9VRElnTU5BQ0FBSUFBZ0NrSC8vLy8vQTBFQkVFTWlBdzBBSUFBb0FnQWhBaUFIUWdBM0FoZ2dCMEtBZ0lDQWdJQ0FnSUIvTndJUUlBY2dBallDRENBSFFReHFJQUVnQ0NBSklBUWdCU0FHRU9VRElnTkZCRUFnQUNBQUlBZEJER3BCLy8vLy93TkJBUkRMQVNFREN5QUhRUXhxRUJzTElBZEJJR29rQUNBREM2WUJBUVYvUVg4aEJnSkFJQUVvQWdBaUJFRUFTQVJBSUFBb0FnQWlCU2dDQUNBQUtBSVFJQUFvQWd3aUEwRUJhaUlISUFOQkEyeEJBWFlpQXlBRElBZElHeUlEUVFKMElBVW9BZ1FSQVFBaUJVVU5BU0FBSUFVMkFoQWdCU0FESUFBb0Fnd2lCbXNpQjBFQ2RHb2dCU0FHUVFKMEVKd0JJQUFnQXpZQ0RDQUVJQWRxSVFRTElBQW9BaEFnQkVFQ2RHb2dBallDQUNBQklBUkJBV3MyQWdCQkFDRUdDeUFHQzNZQkFuOGdBU0FCTFFBQVFYeHhRUUZ5SWdRNkFBQWdBU0FDTFFBTVFRSjBRUVJ4SUFSQmVYRnlJZ1E2QUFBZ0FTQUVRWFZ4SUFJdEFBeEJBblJCQ0hGeUlnUTZBQUFnQWkwQURDRUZJQUVnQXpzQkFpQUJJQVJCRFhFZ0JVRUJkRUh3QVhGeU9nQUFJQUVnQUNBQ0tBSUFFQmcyQWdRTHl3SUJBMzhnQUVHWUF4QmZJZ1lFUUNBR0lBQTJBZ0FnQmtGL05nSUlJQVlnQVRZQ0JDQUdJQVpCRUdvaUJ6WUNGQ0FHSUFjMkFoQWdBUVJBSUFFb0FoQWlCeUFHUVJocUlnZzJBZ1FnQmlBQlFSQnFOZ0ljSUFZZ0J6WUNHQ0FCSUFnMkFoQWdCaUFCTFFCdU9nQnVJQVlnQVNnQ3ZBRTJBZ3dMSUFZZ0F6WUNMQ0FHSUFJMkFpQWdBQ2dDRUNFQklBWkNBRGNDaUFJZ0JrSUFOd0tBQWlBR0lBRTJBcFFDSUFaQmZ6WUNtQUlnQmtFN05nS1FBaUFHUVFBMkFuQWdCa0dRQVdwQi93RkJLQkFyR2lBR1FvU0FnSUFRTndMRUFTQUdJQVpCMEFGcU5nTE1BU0FHUW44M0F0QUJJQVpCZnpZQzhBRWdCa0tBZ0lDQWNEY0N2QUVnQUNBRUVLb0JJUUVnQmlBRk5nTHdBaUFHSUFFMkF1d0NJQUFvQWhBaEFDQUdRZ0EzQXZ3Q0lBWkNBRGNDOUFJZ0JpQUFOZ0tJQXlBR1FUczJBb1FESUFZZ0JUWUNuQUlMSUFZTExBRUJmd0pBSUFHbktBSWdJZ05GRFFBZ0F5a0RBQ0lCUW9DQWdJQmdWQTBBSUFBZ0FhY2dBaEVBQUFzTFpRRUNmeUFCSUFFb0FnQkJBV3NpQWpZQ0FBSkFJQUpGQkVBZ0FTZ0NCRVVOQVNBQktBSVFJZ0lnQVNnQ0ZDSUROZ0lFSUFNZ0FqWUNBQ0FCUWdBM0FoQWdBRUVRYWlBQklBQW9BZ1FSQUFBTER3dEI0aHhCcnZ3QVFjYmxBa0cwOFFBUUFBQUx2QVFEQTN3RGZ3SitBbndDUUNBQUVMQUNRZjhQY1NJRlJBQUFBQUFBQUpBOEVMQUNJZ1JyUkFBQUFBQUFBSUJBRUxBQ0lBUnJTUVJBSUFVaEJBd0JDeUFFSUFWTEJFQWdBRVFBQUFBQUFBRHdQNkFQQzBFQUlRUkVBQUFBQUFBQWtFQVFzQUlnQlVzTkFFUUFBQUFBQUFBQUFDQUF2U0lIUW9DQWdJQ0FnSUI0VVEwQkdrUUFBQUFBQUFEd2Z4Q3dBaUFGVFFSQUlBQkVBQUFBQUFBQThEK2dEd3NnQjBJQVV3UkFSQUFBQUFBQUFBQVFFSXdHRHd0RUFBQUFBQUFBQUhBUWpBWVBDMEdBQ0NzREFDQUFva0dJQ0NzREFDSUJvQ0lDSUFHaElnRkJtQWdyQXdDaUlBRkJrQWdyQXdDaUlBQ2dvQ0lCSUFHaUlnQWdBS0lnQVVHNENDc0RBS0pCc0FnckF3Q2dvaUFBSUFGQnFBZ3JBd0NpUWFBSUt3TUFvS0lnQXIwaUI2ZEJCSFJCOEE5eElnVkI4QWhxS3dNQUlBR2dvS0FoQVNBRlFmZ0lhaWtEQUNBSFFpMkdmQ0VJSUFSRkJFQUNmQ0FIUW9DQWdJQUlnMUFFUUNBSVFvQ0FnSUNBZ0lDSVAzMi9JZ0FnQWFJZ0FLQkVBQUFBQUFBQUFIK2lEQUVMSUFoQ2dJQ0FnSUNBZ1BBL2ZMOGlBaUFCb2lJQklBS2dJZ05FQUFBQUFBQUE4RDlqQkh3akFFRVFheUlFSVFZZ0JFS0FnSUNBZ0lDQUNEY0RDQ0FHSUFRckF3aEVBQUFBQUFBQUVBQ2lPUU1JUkFBQUFBQUFBQUFBSUFORUFBQUFBQUFBOEQrZ0lnQWdBU0FDSUFPaG9DQURSQUFBQUFBQUFQQS9JQUNob0tDZ1JBQUFBQUFBQVBDL29DSUFJQUJFQUFBQUFBQUFBQUJoR3dVZ0F3dEVBQUFBQUFBQUVBQ2lDdzhMSUFpL0lnQWdBYUlnQUtBTEN4NEFJQUVvQWdCQkJFY0VRQ0FBSUFGQkNHb1EvZ0lnQVVFRU5nSUFDd3Z6QWdFRmZ5QUJJQUZCS0dvaUJqWUNMQ0FCSUFZMkFpZ2dBU0FDcHlJSEtBSWdJZ1l0QUJBMkFqZ2dBU0FHS0FJVU5nSXdJQUVnQUVFQklBWXZBUzRnQmk4QktDSUFJQVFnQUNBRVNoc2lDQ0FHTHdFcWFtb2lBQ0FBUVFGTUcwRURkQkFwSWdBMkFpQWdBRVVFUUVGL0R3c2dBa0lnaUtkQmRVOEVRQ0FISUFjb0FnQkJBV28yQWdBTElBRWdBamNER0NBRFFpQ0lwMEYxVHdSQUlBT25JZ2NnQnlnQ0FFRUJhallDQUFzZ0FTQUVOZ0lJSUFFZ0F6Y0RBQ0FCSUFnMkFqUWdBU0FBSUFoQkEzUnFJZ2MyQWlRZ0FTQUhJQVl2QVNvaUJrRURkR28yQWp4QkFDRUJJQVJCQUNBRVFRQktHeUVIQTBBZ0FTQUhSd1JBSUFVZ0FVRURkQ0lKYWlrREFDSUNRaUNJcDBGMVR3UkFJQUtuSWdvZ0NpZ0NBRUVCYWpZQ0FBc2dBQ0FKYWlBQ053TUFJQUZCQVdvaEFRd0JDd3NnQkNBR0lBaHFJZ0VnQVNBRVNCc2hBUU4vSUFFZ0JFWUVmMEVBQlNBQUlBUkJBM1JxUW9DQWdJQXdOd01BSUFSQkFXb2hCQXdCQ3dzTE13QWdBQ0FDUVFFUTZnRWlBRVVFUUVLQWdJQ0E0QUFQQ3lBQVFSQnFJQUVnQWtFQmRCQWZHaUFBclVLQWdJQ0FrSCtFQzRZQkFnRitBbjhnQVNrREdDSURRb0NBZ0lCZ1dnUkFJQUFnQTZjZ0FoRUFBQXNnQVNrREFDSURRb0NBZ0lCZ1dnUkFJQUFnQTZjZ0FoRUFBQXNDUUNBQktBSThJZ1ZGRFFBZ0FTZ0NJQ0VFQTBBZ0JDQUZUdzBCSUFRcEF3QWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFnQVNnQ1BDRUZDeUFFUVFocUlRUU1BQXNBQ3d2VkNRSUJmZ1YvQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FTMEFCRUVQY1E0R0FBRUVBZ01GQ0FzZ0FDQUJLQUlRSWdZZ0FoRUFBQ0FHUVRCcUlRY0RRQ0FFSUFZb0FpQk9SUVJBQWtBZ0J5Z0NCRVVOQUNBQktBSVVJQVJCQTNScUlRVUNRQUpBQWtBQ1FDQUhLQUlBUVI1MlFRRnJEZ01BQVFJREN5QUZLQUlBSWdnRVFDQUFJQWdnQWhFQUFBc2dCU2dDQkNJRlJRMERJQUFnQlNBQ0VRQUFEQU1MSUFVb0FnQWlCUzBBQlVFQmNVVU5BaUFBSUFVZ0FoRUFBQXdDQ3lBQUlBVW9BZ0JCZkhFZ0FoRUFBQXdCQ3lBRktRTUFJZ05DZ0lDQWdHQlVEUUFnQUNBRHB5QUNFUUFBQ3lBRVFRRnFJUVFnQjBFSWFpRUhEQUVMQ3lBQkx3RUdJZ1JCQVVZTkJTQUFLQUpFSUFSQkdHeHFLQUlNSWdSRkRRVWdBQ0FCclVLQWdJQ0FjSVFnQWlBRUVSRUFEd3NEUUNBQktBSTRJQVJLQkVBZ0FTZ0NOQ0FFUVFOMGFpa0RBQ0lEUW9DQWdJQmdXZ1JBSUFBZ0E2Y2dBaEVBQUFzZ0JFRUJhaUVFREFFTEN5QUJLQUl3SWdGRkRRUWdBQ0FCSUFJUkFBQVBDeUFCTFFBRlFRRnhSUTBFSUFFb0FoQXBBd0FpQTBLQWdJQ0FZRlFOQXd3R0N5QUJLQUlnQkVBZ0FDQUJRU2hxSUFJUTd3TUxJQUVwQXhBaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQXhnaUEwS0FnSUNBWUZRTkFnd0ZDeUFCS0FJc0lnRkZEUUVnQUNBQklBSVJBQUFQQ3lBQlFmZ0JhaUVFSUFGQjlBRnFJUWNEUUNBSElBUW9BZ0FpQlVjRVFFRUFJUVFEUUNBRUlBVW9BaGhPUlFSQUFrQWdCU2dDRkNBRVFSUnNhaUlHS0FJSURRQWdCaWdDQkNJR1JRMEFJQUFnQmlBQ0VRQUFDeUFFUVFGcUlRUU1BUXNMSUFVcEF6Z2lBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFVcEEwQWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFVcEExZ2lBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFVcEEyQWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFWQkJHb2hCQXdCQ3dzZ0FTa0R3QUVpQTBLQWdJQ0FZRm9FUUNBQUlBT25JQUlSQUFBTElBRXBBOGdCSWdOQ2dJQ0FnR0JhQkVBZ0FDQURweUFDRVFBQUN5QUJLUU93QVNJRFFvQ0FnSUJnV2dSQUlBQWdBNmNnQWhFQUFBc2dBU2tEdUFFaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxRUUFoQkNBQktRT29BU0lEUW9DQWdJQmdXZ1JBSUFBZ0E2Y2dBaEVBQUFzRFFBSkFJQVJCQ0VZRVFFRUFJUVFEUUNBRUlBQW9Ba0JPRFFJZ0FTZ0NLQ0FFUVFOMGFpa0RBQ0lEUW9DQWdJQmdXZ1JBSUFBZ0E2Y2dBaEVBQUFzZ0JFRUJhaUVFREFBTEFBc2dBU0FFUVFOMGFpa0RXQ0lEUW9DQWdJQmdXZ1JBSUFBZ0E2Y2dBaEVBQUFzZ0JFRUJhaUVFREFFTEN5QUJLUU9ZQVNJRFFvQ0FnSUJnV2dSQUlBQWdBNmNnQWhFQUFBc2dBU2tEb0FFaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQTFBaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQTBBaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQTBnaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQXpnaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQXpBaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVvQWlRaUFVVU5BQ0FBSUFFZ0FoRUFBQXNQQzBIeCtnQkJydndBUVk0c1FlRFFBQkFBQUFzUUFRQUxJQUFnQTZjZ0FoRUFBQXQ4QVFKL0lBQkJJQkFwSWdJRVFDQUNRUUUyQWdBZ0FrS0FnSUNBd0FCQ2dJQ0FnREFnQVJzM0F4Z2dBaUFDUVJocU5nSVFJQUlnQWkwQUJVRUJjam9BQlNBQUtBSVFJUUFnQWtFRE9nQUVJQUFvQWxBaUFTQUNRUWhxSWdNMkFnUWdBaUFBUWRBQWFqWUNEQ0FDSUFFMkFnZ2dBQ0FETmdKUUN5QUNDMG9CQW44Q1FDQUFMUUFBSWdKRklBSWdBUzBBQUNJRFIzSU5BQU5BSUFFdEFBRWhBeUFBTFFBQklnSkZEUUVnQVVFQmFpRUJJQUJCQVdvaEFDQUNJQU5HRFFBTEN5QUNJQU5yQzNzQkFuOGpBRUdRQVdzaUJDUUFRY0NXQVNFRkFrQUNRQUpBQWtBZ0FVRUJhZzRGQXdJQ0FBRUNDMEdCbGdFaEJRd0JDMEh3TWlFRkN5QUFLQUlRSUFSQjBBQnFJQU1Ra0FFaEFTQUVJQUFvQWhBZ0JFRVFhaUFDS0FJRUVKQUJOZ0lFSUFRZ0FUWUNBQ0FBSUFVZ0JCQ0FBZ3NnQkVHUUFXb2tBQXVJQVFFQ2Z5TUFRUkJySWdVa0FDQUZRUUEyQWd3Z0JVSUFOd0lFSUFBZ0FTQUNJQU1nQkNBRlFRUnFFSzRGSVFJZ0JTZ0NEQ0lCUVFBZ0FVRUFTaHNoQXlBRktBSUVJUUVEUUNBRElBWkdSUVJBSUFBZ0FTQUdRUU4wYWlnQ0JCQVRJQVpCQVdvaEJnd0JDd3NnQUNnQ0VDSUFRUkJxSUFFZ0FDZ0NCQkVBQUNBRlFSQnFKQUFnQWd1bEFRRUZmeU1BUVJCcklnTWtBRUYvSVFJQ1FDQUFLQUlVRFFBZ0FDZ0NBQ0FBS0FJRUlBRkJBWFJCRUdvZ0EwRU1haENvQVNJRVJRUkFJQUFRZ3dNTUFRc2dCRUVRYWlFRklBQW9BZ2doQWlBREtBSU1JUVlEUUNBQ1FRQk1SUVJBSUFVZ0FrRUJheUlDUVFGMGFpQUNJQVZxTFFBQU93RUFEQUVMQ3lBQVFRRTJBaEFnQUNBRU5nSUVJQUFnQmtFQmRpQUJhallDREVFQUlRSUxJQU5CRUdva0FDQUNDMFlCQVg4Z0FTQUJLQUlBSWdKQkFXczJBZ0FnQWtFQlRBUkFJQUVwQWdSQ2dJQ0FnSUNBZ0lEQUFGb0VRQ0FBSUFFUW9nTVBDeUFBUVJCcUlBRWdBQ2dDQkJFQUFBc0xNZ0FnQUVHTUFXc2lBRUVuVDBLUGdQKy81Z2tnQUsySVFnR0RVSEpGQkVBZ0FFRUNkRUhBL2dGcUtBSUFEd3NRQVFBTGNRRUJmZ0pBSUFBZ0FTQUFJQU1RcWdFaUF5QUJRUUFRRkNJRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQUlBSWdBeUFDUVFBUUZDSUNRb0NBZ0lCd2d5SUVRb0NBZ0lBd1VTQUVRb0NBZ0lEZ0FGRnlEUUVnQUNBQklBTWdBaEN4QlF3QkN5QUFJQVFRRHdzZ0FDQURFQk1MaXdrQkMzOGpBRUVRYXlJSUpBQUNRQUpBQWtBQ1FBSkFBa0FEUUNBQktBSVFJZ05CTUdvaEJpQURJQU1vQWhnZ0FuRkJmM01pQ1VFQ2RHb29BZ0FoQkVFQUlRTURRQ0FFQkVBZ0NDQUdJQVJCQVdzaUNrRURkR29pQlRZQ0RDQUZLQUlBSVFjZ0FpQUZLQUlFUmdSQVFRQWhCQ0FIUVlDQWdDQnhSUTBKUVg4aEJDQUFJQUVnQ0VFTWFoRFVBUTBKSUFFb0FoQWhBZ0pBSUFNRVFDQUNJQU1nQm10QkEzVkJBQ0FERzBFRGRHb2lBMEV3YWlBREtBSXdRWUNBZ0dCeElBZ29BZ3dvQWdCQi8vLy9IM0Z5TmdJQUlBZ29BZ3doQ1F3QkN5QUNJQWxCQW5ScUlBZ29BZ3dpQ1NnQ0FFSC8vLzhmY1RZQ0FBdEJBU0VFSUFJZ0FpZ0NKRUVCYWpZQ0pDQUFLQUlRSUFFb0FoUWdDa0VEZEdvaUF5QUpLQUlBUVJwMkVPd0ZJQUFnQ0NnQ0RDZ0NCQkFUSUFnb0Fnd2lCU0FGS0FJQVFmLy8veDl4TmdJQUlBZ29BZ3hCQURZQ0JDQURRb0NBZ0lBd053TUFJQUlvQWlRaUEwRUlTQTBKSUFNZ0FpZ0NJRUVCZGtrTkNTQUJLQUlRSWdjdEFCQU5CVUVDSUFjb0FpQWdCeWdDSkdzaUFpQUNRUUpNR3lJS0lBY29BaHhMRFFZZ0J5Z0NHRUVCYWlFRUEwQWdCQ0lDUVFGMklnUWdDazhOQUFzZ0FDQUtRUU4wSWcwZ0FrRUNkQ0lGYWtFd2FoQXBJZ1JGRFFnZ0FrRUJheUVMSUFjb0FnZ2lBaUFIS0FJTUlnTTJBZ1FnQXlBQ05nSUFJQWRDQURjQ0NDQUVJQVZxSUFkQk1CQWZJUVlnQUNnQ0VDSUNLQUpRSWdNZ0JrRUlhaUlKTmdJRUlBWWdBa0hRQUdvMkFnd2dCaUFETmdJSUlBSWdDVFlDVUVFQUlRTWdCRUVBSUFVUUt4b2dCMEV3YWlFRUlBWkJNR29oQWlBQktBSVVJUXhCQUNFSkEwQWdDU0FHS0FJZ0lnVlBSUVJBSUFRb0FnUWlCUVJBSUFJZ0JUWUNCQ0FDSUFRb0FnQkJnSUNBWUhFaUJTQUNLQUlBUWYvLy94OXhjallDQUNBQ0lBVWdCaUFFS0FJRUlBdHhRWDl6UVFKMGFpSUZLQUlBUWYvLy94OXhjallDQUNBRklBTkJBV29pQlRZQ0FDQU1JQU5CQTNScUlBd2dDVUVEZEdvcEF3QTNBd0FnQlNFRElBSkJDR29oQWdzZ0NVRUJhaUVKSUFSQkNHb2hCQXdCQ3dzZ0F5QUZJQVlvQWlSclJ3MEhJQVpCQURZQ0pDQUdJQW8yQWh3Z0JpQUxOZ0lZSUFZZ0F6WUNJQ0FCSUFZMkFoQWdBQ2dDRUNJQ1FSQnFJQWNnQnlnQ0dFRi9jMEVDZEdvZ0FpZ0NCQkVBQUVFQklRUWdBQ0FCS0FJVUlBMFFpUUlpQUVVTkNTQUJJQUEyQWhRTUNRVWdCMEgvLy84ZmNTRUVJQVVoQXd3Q0N3QUxDMEVCSVFRZ0FTMEFCU0lEUVFSeFJRMEdJQU5CQ0hGRkRRRWdBQ0FJUVFocUlBSVFyQUZGRFFZZ0NDZ0NDQ0lESUFFb0FpZ2lCVThOQmlBQkx3RUdJZ1JCQ0VZZ0JFRUNSbkpGQkVCQkFDRUVEQWNMSUFWQkFXc2dBMFlFUUNBQUlBRW9BaVFnQTBFRGRHb3BBd0FRRHlBQklBTTJBaWdNQmdzZ0FDQUJFSklEUlEwQUMwRi9JUVFNQlFzZ0FDZ0NFQ2dDUkNBQkx3RUdRUmhzYWlnQ0ZDSURSUTBFSUFNb0FnZ2lBMFVOQkNBQUlBR3RRb0NBZ0lCd2hDQUNJQU1SRlFBaEJBd0VDMEhpK2dCQnJ2d0FRYTBqUWNFNkVBQUFDMEcvM3dCQnJ2d0FRYkVqUWNFNkVBQUFDMEdxa1FGQnJ2d0FRZFlqUWNFNkVBQUFDMEVCSVFRTElBaEJFR29rQUNBRUMwRUFJQUFnQWlBQlFRQkJBQkFoSWdGQy8vLy8vMjlXSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkZ5UlFSQUlBQWdBUkFQSUFBUUpFS0FnSUNBNEFBUEN5QUJDNjRCQWdGK0FYOENRQ0FBS0FJUUtBS01BU0lEUlNBQlF2Ly8vLy8vLy84UFZuSU5BQ0FES0FJb1FRUnhSUTBBSUFGQ2dJQ0FnQWhVQkVBZ0FROExRb0NBZ0lEQWZpQUJ1YjBpQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3OExJQUFRbHdFaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBS25RUVJxSUFFUU1FVUVRQ0FDRHdzZ0FDQUNFQThnQUJCOEMwS0FnSUNBNEFBTFVnRUNmeU1BUVJCcklnSWtBQUovQWtBZ0FrRU1haUFCRUwwRlJRMEFJQUlvQWd3aUEwRUFTQTBBSUFBZ0FSRDJBeUFEUVlDQWdJQjRjZ3dCQ3lBQUlBRkJBUkNuQWdzaEFTQUNRUkJxSkFBZ0FRdVFBUUlEZndGK0lBRW9BaFFpQlNrREFDSUhRdi8vLy84UFZpQUJLQUlvSWdaQkFXb2lCQ0FIcDAxeVJRUkFJQUVvQWhBdEFETkJDSEZGQkVBZ0FDQUNFQThnQUNBRFFUQVF3QUlQQ3lBRklBU3ROd01BQ3dKQUlBUWdBU2dDSUUwTkFDQUFJQUVnQkJDc0JVVU5BQ0FBSUFJUUQwRi9Ed3NnQVNnQ0pDQUdRUU4wYWlBQ053TUFJQUVnQkRZQ0tFRUJDNjBCQWdaL0FYNENRQ0FCS1FKVUlnaW5RZjhCY1EwQUlBRWdDRUtBZm9OQ0FZUTNBbFFEUUNBQktBSVVJQUpNQkVCQkFBOExJQUVvQWhBZ0FrRURkR29pQnlnQ0FDRURRWDhoQmlBQUlBRW9BZ1FRa1FRaUJFVU5BUUpBSUFBZ0F4Q1JCQ0lEUlFSQVFRQWhCUXdCQ3lBQUlBUWdBeERKQlNFRklBQWdCQkJVSUFNaEJBc2dBQ0FFRUZRZ0JVVU5BU0FISUFVMkFnUWdBa0VCYWlFQ0lBQWdCUkQrQTBFQVRnMEFDd3NnQmdzekFRRi9Jd0JCMEFCcklnTWtBQ0FESUFBb0FoQWdBMEVRYWlBQkVKQUJOZ0lBSUFBZ0FpQURFSUFDSUFOQjBBQnFKQUFMT2dFQmZ5QUFLQUlRSWdNZ0FTQUNFS2NDSWdGRkJFQWdBQkI4UW9DQWdJRGdBQThMSUFNb0FqZ2dBVUVDZEdvMUFnQkNnSUNBZ0lCL2hBdU9CZ0lEZndGK0l3QkJFR3NpQ0NRQUFrQUNRQUpBQWtBQ1FDQUJMUUFGSWdkQkJIRkZEUUFnQVM4QkJpSUpRUUpHQkVBQ1FDQUhRUWh4QkVBQ1FDQUNRUUJJQkVBZ0NDQUNRZi8vLy84SGNTSUpOZ0lNSUFrZ0FTZ0NLRWNOQVNBSFFRRnhSUTBHSUFaQmdEQnhJQVlnQmtFSWRuRkJCM0ZCQjBkeURRRWdBMElnaUtkQmRVOEVRQ0FEcHlJQ0lBSW9BZ0JCQVdvMkFnQUxJQUFnQVNBRElBWVEvUU1oQnd3SkN5QUFJQWhCREdvZ0FoQ3NBVVVOQkF0QmZ5RUhJQUFnQVJDU0EwVU5BUXdIQ3lBQUlBaEJER29nQWhDc0FVVU5BZ3NnQUNBSVFRaHFJQUVvQWhRaUNTa0RBQkIzR2lBSUtBSU1RUUZxSWdjZ0NDZ0NDRTBOQVNBQktBSVFMUUF6UVFoeFJRUkFJQUFnQmtFd0VNQUNJUWNNQmdzZ0FDQUpJQWRCQUU0RWZpQUhyUVZDZ0lDQWdNQitJQWU0dlNJS1FvQ0FnSURBZ1lEOC93QjlJQXBDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEFnREFFTElBbEJGV3RCLy84RGNVRUtUUVJBSUFBZ0FoQ2VBeUlIUlEwQklBZEJBRWdOQkNBQUlBWkJueDhRYnlFSERBVUxJQVpCZ0lBSWNRMEFJQUFvQWhBb0FrUWdDVUVZYkdvb0FoUWlCMFVOQUNBQnJVS0FnSUNBY0lRaENpQUhLQUlNSWdjRVFDQUFJQW9nQWlBRElBUWdCU0FHSUFjUktnQWhCd3dGQ3lBQUlBb1FtUUVpQjBFQVNBMERJQWRGRFFFTElBRXRBQVZCQVhFTkFRc2dBQ0FHUWZmb0FCQnZJUWNNQWdzZ0FDQUJJQUlnQmtFRmNVRVFjaUFHUVFkeElBWkJnREJ4SWdJYkVIb2lBVVVOQUNBQ0JFQWdBVUVBTmdJQUFrQWdCa0dBRUhGRkRRQWdBQ0FFRURoRkRRQWdCS2NoQWlBRVFpQ0lwMEYxVHdSQUlBSWdBaWdDQUVFQmFqWUNBQXNnQVNBQ05nSUFDeUFCUVFBMkFnUkJBU0VISUFaQmdDQnhSUTBDSUFBZ0JSQTRSUTBDSUFXbklRQWdCVUlnaUtkQmRVOEVRQ0FBSUFBb0FnQkJBV28yQWdBTElBRWdBRFlDQkF3Q0N3SkFJQVpCZ01BQWNRUkFJQU5DSUlpblFYVlBCRUFnQTZjaUFDQUFLQUlBUVFGcU5nSUFDeUFCSUFNM0F3QU1BUXNnQVVLQWdJQ0FNRGNEQUF0QkFTRUhEQUVMUVg4aEJ3c2dDRUVRYWlRQUlBY0xSQUVCZnlNQVFSQnJJZ1VrQUNBRklBRWdBaUFESUFSQ2dJQ0FnSUNBZ0lDQWY0VVFjQ0FGS1FNQUlRRWdBQ0FGS1FNSU53TUlJQUFnQVRjREFDQUZRUkJxSkFBTEN3QWdBQ0FCUVFFUWpnUUxsd0VCQW45Qml3RWhBZ0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FFRUhJQUZDSUlpbklnTWdBMEVIYTBGdVNSdEJDMm9PRXdFTEFBa0VDZ29LQ2dvRkFnTUlCZ29LQ2dJS0MwR01BUThMUVkwQkR3dEJ4Z0FQQzBISEFBOExRY2dBRHdzZ0FhY3NBQVZCQUU0TkFRdEJ4UUFQQzBFYklRSWdBQ0FCRURnTkF3dEJ5UUFQQzBIS0FBOExRY3dBSVFJTElBSUxOUUVDZndKQUlBQkNnSUNBZ0hCVURRQWdBS2NpQkM4QkJrRU1SdzBBSUFRb0FpUWdBVWNOQUNBRUxnRXFJQUpHSVFNTElBTUxtd1FDQTM4QmZpTUFRU0JySWdja0FDQUJRaUNJcDBGMVR3UkFJQUduSWdZZ0JpZ0NBRUVCYWpZQ0FBc0NRQUpBQWtBQ1FBSkFBMEFDUUFKQUFrQWdBYWNpQmkwQUJVRUVjVVVOQUNBQUtBSVFLQUpFSUFZdkFRWkJHR3hxS0FJVUlnaEZEUUFnQ0NnQ0dDSUlSUTBBSUFBZ0FTQUNJQU1nQkNBRklBZ1JMUUFoQmd3QkN5QUFJQWNnQmlBQ0VFd2lCa0VBVGcwQkN5QUFJQUVRRHd3RkN3SkFJQVlFUUNBSExRQUFRUkJ4QkVBZ0FDQUhLUU1ZSWdtblFRQWdDVUtBZ0lDQWNJTkNnSUNBZ0RCU0d5QUVJQU1nQlJDTEF5RUdJQUFnQnlrREVCQVBJQUFnQnlrREdCQVBJQUFnQVJBUERBZ0xJQUFnQnlrRENCQVBJQWN0QUFCQkFuRU5BU0FBSUFFUUR3d0RDeUFBSUFFUWpBSWlBVUtBZ0lDQWNJTkNnSUNBZ0NCU0RRRUxDeUFBSUFFUUR5QUVRdi8vLy85dldBUkFJQUFnQXhBUElBQWdCVUgwTUJCdklRWU1CUXNnQUNBSElBU25JZ2dnQWhCTUlnWkJBRWdOQXlBR1JRMENJQWN0QUFCQkVIRUVRQ0FBSUFjcEF4QVFEeUFBSUFjcEF4Z1FEeUFBSUFNUUR5QUFJQVZCcDlFQUVHOGhCZ3dGQ3lBQUlBY3BBd2dRRHlBSExRQUFRUUp4UlEwQUlBZ3ZBUVpCQzBjTkFRc2dBQ0FERUE4Z0FDQUZJQUlRd0FJaEJnd0RDeUFBSUFRZ0FpQURRb0NBZ0lBd1FvQ0FnSUF3UVlEQUFCQnRJUVlNQVFzZ0FDQUlJQUlnQTBLQWdJQ0FNRUtBZ0lDQU1DQUZRWWZPQUhJUWdRUWhCZ3NnQUNBREVBOExJQWRCSUdva0FDQUdDMjBCQW44Q1FDQUJRb0NBZ0lCd1ZBMEFJQUduSWdNdkFRWVE3Z0ZGRFFBZ0F5Z0NJQzBBRVVFSWNVVU5BQ0FES0FJb0lnUUVRQ0FBSUFTdFFvQ0FnSUJ3aEJBUEMwRUFJUUFnQWtLQWdJQ0FjRm9FUUNBQ3B5SUFJQUFvQWdCQkFXbzJBZ0FMSUFNZ0FEWUNLQXNMREFBZ0FFSDIwZ0JCQUJBVkM4RUNBZ1ovQVg0akFFRVFheUlHSkFBQ1FDQUNRdi8vLy85dldBUkFJQUJCdnpGQkFCQVZEQUVMSUFBZ0JrRU1haUFDRU5ZQkRRQWdCaWdDRENJRVFZR0FCRThFUUNBQVFjQXpRUUFRUmd3QkN5QUFRUUVnQkNBRVFRRk5HMEVEZEJCZklnVkZEUUFDUUFKQUlBS25JZ2N2QVFZaUNFRUlSeUFJUVFKSGNRMEFJQWN0QUFWQkNIRkZEUUFnQkNBSEtBSW9SdzBBQTBBZ0F5QUVSZzBDSUFOQkEzUWlDQ0FIS0FJa2Fpa0RBQ0lDUWlDSXAwRjFUd1JBSUFLbklnQWdBQ2dDQUVFQmFqWUNBQXNnQlNBSWFpQUNOd01BSUFOQkFXb2hBd3dBQ3dBTEEwQWdBeUFFUmcwQklBQWdBaUFERUxBQklnbENnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUZJQU5CQTNScUlBazNBd0FnQTBFQmFpRUREQUVMQ3lBQUlBVWdBeENiQTBFQUlRTU1BUXNnQVNBRU5nSUFJQVVoQXdzZ0JrRVFhaVFBSUFNTG5RSUNBbjhCZmdKK1FvQ0FnSURnQUNBQUVIc05BQm9DUUFKQUlBRkNnSUNBZ0hCYUJFQWdBYWNpQnkwQUJVRVFjVVVFUUNBQVFhSStRUUFRRlVLQWdJQ0E0QUFQQ3lBRlFRRnlJUVlnQnk4QkJpSUZRUTFHRFFJZ0FDZ0NFQ2dDUkNBRlFSaHNhaWdDRUNJRkRRRUxJQUJCbTh3QVFRQVFGVUtBZ0lDQTRBQVBDeUFBSUFFZ0FpQURJQVFnQmlBRkVSWUFEd3NnQnlnQ0lDMEFFVUVFY1FSQUlBQWdBVUtBZ0lDQU1DQUNJQU1nQkNBR0VOZ0JEd3RDZ0lDQWdPQUFJQUFnQWtFQkVHVWlDRUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFHaUFBSUFFZ0NDQUNJQU1nQkNBR0VOZ0JJZ0ZDLy8vLy8yOVlJQUZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSnhSUVJBSUFBZ0NCQVBJQUVQQ3lBQUlBRVFEeUFJQ3d2bUFRRURmeUFCUVJ4cUlRUWdBVUVZYWlFRkEwQWdCU0FFS0FJQUlnUkhCRUFDUUNBRVFRSnJMd0VBSUFKSERRQWdCRUVEYXkwQUFFRUJka0VCY1NBRFJ3MEFJQVJCQ0dzaUFDQUFLQUlBUVFGcU5nSUFJQUFQQ3lBRVFRUnFJUVFNQVFzTElBQkJJQkFwSWdCRkJFQkJBQThMSUFCQkFUWUNBQ0FBSUFJN0FRWWdBQ0FBTFFBRlFmd0JjU0FEUVFGMFFRSnhjam9BQlNBQktBSVlJZ1FnQUVFSWFpSUdOZ0lFSUFBZ0JUWUNEQ0FBSUFRMkFnZ2dBU0FHTmdJWUlBRkJFRUVVSUFNYmFpZ0NBQ0VCSUFCQ2dJQ0FnREEzQXhnZ0FDQUJJQUpCQTNScU5nSVFJQUFMaXdJQ0FYOEJmZ0pBQWtBZ0FDQUJweUlFTHdBUlFRTjJRUVp4UWE3QUFXb3ZBUUFRZGlJRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBTUFRc0NRQ0FBSUFVZ0JDQUNJQU1RMWdVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdBU0FFS0FJY0lnSkJMeUFDR3lBRUx3RXNFSllESUFRdkFCRWlBa0VRY1FSQUlBQWdBQ2dDS0VISUEwSDRBaUFDUVRCeFFUQkdHMm9wQXdBUVJ5SUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBQ0FCUVRzZ0JVRUNFQmthSUFFUEN5QUNRUUZ4UlEwQ0lBRkNnSUNBZ0hCYUJFQWdBYWNpQWlBQ0xRQUZRUkJ5T2dBRkN5QUFJQUZCTzBFQVFRQkJBaENWQXhvZ0FROExDeUFBSUFFUUQwS0FnSUNBNEFBaEFRc2dBUXRZQWdGL0FYNUNnSUNBZ0NBaEEwRVNJQUZDSUlpbklnSkJDMm9nQWtFSGEwRnVTUnNpQWtFU1MwR2ZzQkFnQW5aQkFYRkZjZ1IrUW9DQWdJQWdCU0FBS0FJb0lBSkJBblJCc1AwQmFpZ0NBRUVEZEdvcEF3QUxDNmNEQWdGK0EzOGpBRUV3YXlJRUpBQkI1UDhBSVFWQ2dJQ0FnT0FBSVFNQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQkJCeUFCUWlDSXB5SUdJQVpCQjJ0QmJra2JRUXRxRGhNS0NBa0dBQXNMQ3dzTUJRRUNBd1FMQ3c0SEN3c2dCa0YxU1EwTUlBR25JZ0FnQUNnQ0FFRUJhallDQUF3TUN5QUVJQUUrQWdBZ0JFRVFhaUlGUVNCQjlQc0FJQVFRVGhvTUNnc2dBRUVEUVFJZ0FhY2JFQzBoQXd3TEN5QUFRUUVRTFNFRERBb0xJQUJCeFFBUUxTRUREQWtMSUFBZ0FVRUFFSkFDSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRTU1DUXNnQUNBQklBSVFqZ1FoQXlBQUlBRVFEd3dJQ3lBQ0JFQWdCa0YxU1EwSElBR25JZ0FnQUNnQ0FFRUJhallDQUF3SEN5QUFRZW5hQUVFQUVCVU1Cd3NnQUNBQlFvQ0FnSURBZ1lEOC93Qjh2MEVLUVFCQkFCQ1BBaUVEREFZTElBQWdBU0FBS0FJUUtBS1VBaEVJQUNFRERBVUxJQUFnQVNBQUtBSVFLQUt3QWhFSUFDRUREQVFMSUFBZ0FTQUFLQUlRS0FMTUFoRUlBQ0VEREFNTFFkSC9BQ0VGQ3lBQUlBVVFZaUVEREFFTElBRWhBd3NnQkVFd2FpUUFJQU1MWEFFRGZ5QUFRZlFCYWlFRUlBQW9BdmdCSVFNRFFDQUVJQU1pQWtjRVFDQUNLQUlFSVFNQ1FBSkFBa0FnQVE0REFnQUJCQXNnQWkwQVRBMEREQUVMSUFJcEFreENJSVpDT0llbkRRSUxJQUFnQWtFSWF4RG5CUXdCQ3dzTFVBRURmeUFBS0FMVUFTQUJLQUlVUVNBZ0FDZ0N5QUZyZGtFQ2RHb2hBZ05BSUFJaUF5Z0NBQ0lFUVNocUlRSWdBU0FFUncwQUN5QURJQUVvQWlnMkFnQWdBQ0FBS0FMUUFVRUJhellDMEFFTE1RSUJmd0YrSUFBZ0FSQXRJZ05DZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FBSUFNUXN3RWhBaUFBSUFNUUR3c2dBZ3MzQUNBQUlBRWdBaUFEQW45QkFDQUFLQUlRSWdBdEFJZ0JEUUFhUVFFZ0FDZ0NqQUVpQUVVTkFCb2dBQ2tEQ0JDakEwVUxFUEFGQy9vRUFRVi9JQUFvQWdBaEF3SkFBa0FEUUNBRExRQUFJUVFnQXlFQ0FrQURRQ0FDUVFGcUlRTWdCQ0lHUVM5SEJFQWdCa0VKYXlJRlFSZExEUVJCQVNBRmRDSUZRWTJBZ0FSeERRTWdCVUVTY1VVTkJDQUJSUTBEREFJTElBTXRBQUFpQWtFcVJnUkFJQU1oQWdOQUlBSWlBMEVCYWlFQ0lBTXRBQUVpQkVFTlJ3UkFJQVJGRFFNZ0FVRUFJQVJCQ2tZYkRRUWdCRUVxUncwQklBTXRBQUpCTDBjTkFTQURRUU5xSVFNTUJRc2dBVVVOQUFzTUFnc0xRUzhoQlNBQ1FTOUhEUU5CTHlFRUlBRU5BQU5BQWtBQ1FDQUVJZ0pCQ21zT0JBUUJBUVFBQ3lBQ1JRMERDeUFETFFBQklRUWdBMEVCYWlFRERBQUxBQXNMUVFvUEMwRTlJUVVDZnlBR1FUMUdCRUJCcG44Z0F5MEFBRUUrUmcwQkdnd0NDeUFFSWdVUTd3SkZEUUVDUUFKQUFrQUNRQUpBSUFRaUFVSGxBR3NPQlFFQ0JBUUFBd3NDUUFKQUlBTXRBQUJCN1FCckRnSUJBQVVMSUFJdEFBSVF4UUVOQkVHNWZ3OExJQUl0QUFKQjhBQkhEUU1nQWkwQUEwSHZBRWNOQXlBQ0xRQUVRZklBUncwRElBSXRBQVZCOUFCSERRTWdBaTBBQmhERkFRMERJQUFnQWtFR2FqWUNBRUZQRHdzZ0F5MEFBRUg0QUVjTkFpQUNMUUFDUWZBQVJ3MENJQUl0QUFOQjd3QkhEUUlnQWkwQUJFSHlBRWNOQWlBQ0xRQUZRZlFBUncwQ0lBSXRBQVlReFFFTkFpQUFJQUpCQm1vMkFnQkJUUThMSUFNdEFBQkI5UUJIRFFFZ0FpMEFBa0h1QUVjTkFTQUNMUUFEUWVNQVJ3MEJJQUl0QUFSQjlBQkhEUUVnQWkwQUJVSHBBRWNOQVNBQ0xRQUdRZThBUncwQklBSXRBQWRCN2dCSERRRWdBaTBBQ0JERkFRMEJRVWNQQ3lBQlFlOEFSdzBBSUFNdEFBQkI1Z0JIRFFBZ0FpMEFBaERGQVEwQVFWc1BDMEdEZndzUEN5QUZDNFVKQWdSL0NYNGpBRUhnQUdzaUJDUUFRb0NBZ0lBd0lRc2dCRUtBZ0lDQU1EY0RNQ0FFUW9DQWdJQXdOd01vSUFSQ2dJQ0FnREEzQXhnZ0JDQUVRY2dBYWlJR05nSkFJQVFnQUVFdkVDMGlDamNET0NBQUlBWkJBQkE5R2lBRUlBQVFQaUlJTndNZ1FvQ0FnSURnQUNFSkFrQUNRQ0FJUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFDUUFKQUlBQWdBaEE0QkVBZ0JDQUNOd01ZREFFTElBQWdBaERLQVNJRlFRQklEUUlnQlVVTkFDQUVJQUFRUGlJTk53TW9JQTFDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BaUFBSUFSQkNHb2dBaEE4RFFJZ0JDa0RDQ0lKUWdBZ0NVSUFWUnNoRUFOQUlBd2dFRkVOQVNBRUlBQWdBaUFNRUhNaUNEY0RFRUtBZ0lDQTRBQWhDU0FJUW9DQWdJQndneUlQUW9DQWdJRGdBRkVOQXdKQUFrQUNRQ0FJUW9DQWdJQndXZ1JBSUFpbkx3RUdRZjcvQTNGQkJFY05BaUFFSUFBZ0NCQTNJZ2czQXhBZ0NFS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkRBWUxJQWhDSUlpbklnVkJBQ0FGUVF0cVFSSkpHMFVFUUNBRUlBQWdDQkEzSWdnM0F4QWdDRUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEdEQUVMSUE5Q2dJQ0FnSkIvVWcwQkN5QUFJQTFCQVNBRVFSQnFFTllESWc5Q2dJQ0FnUEFBZzBLQWdJQ0E0QUJSQkVBZ0FDQUlFQThNQmdzZ0FDQVBFQ1lOQUNBQUlBMGdEaUFJRUlZQkdpQU9RZ0Y4SVE0TUFRc2dBQ0FJRUE4TElBeENBWHdoREF3QUN3QUxJQU5DSUlpbklnVkJkVThFUUNBRHB5SUhJQWNvQWdCQkFXbzJBZ0FMQWtBZ0EwS0FnSUNBY0ZvRVFBSkFBa0FDUUNBRHB5OEJCa0VFYXc0Q0FBRUNDeUFBSUFNUWpRRWhBd3dCQ3lBQUlBTVFOeUVEQzBLQWdJQ0E0QUFoQ1NBRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0EwSWdpS2NoQlFzQ1FDQUZRUUFnQlVFTGFrRVNTUnRGQkVBZ0FDQUVRUVJxSUFOQkNrRUFFRmNOQXlBRUlBQkIrNWtCSUFRb0FnUVFrd0lpQWpjRE1Bd0JDeUFEUW9DQWdJQndnMEtBZ0lDQWtIOVJCRUFnQkNBQUlBT25JZ1ZCQUVFS0lBVW9BZ1JCLy8vLy93ZHhJZ1VnQlVFS1R4c1FoQUVpQWpjRE1Bd0JDeUFLUWlDSXAwRjFUd1JBSUFxbklnVWdCU2dDQUVFQmFqWUNBQXNnQkNBS053TXdJQW9oQWdzZ0FDQURFQTlDZ0lDQWdPQUFJUWtnQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBUU5DSUxRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQkNnSUNBZ09BQUlRc01Bd3NnQVVJZ2lLY2lCVUYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0FDQUxRUzhnQVVFSEVCbEJBRWdOQWlBRlFYVlBCRUFnQWFjaUJTQUZLQUlBUVFGcU5nSUFDMEtBZ0lDQU1DRUpJQUFnQkVFWWFpQUxJQUVnQ2hEVkF5SUNRb0NBZ0lCd2d5SUJRb0NBZ0lBd1VRMENRb0NBZ0lEZ0FDRUpJQUZDZ0lDQWdPQUFVUVJBSUFFaENRd0RDeUFBSUFSQkdHb2dBaUFLRU5RRElRVWdCQ2dDUUNFR0lBVU5BaUFHRURZaENRd0RDeUFBSUFNUUR3d0JDMEtBZ0lDQTRBQWhDUXNnQmlnQ0FDZ0NFQ0lGUVJCcUlBWW9BZ1FnQlNnQ0JCRUFBQ0FHUVFBMkFnUUxJQUFnQ3hBUElBQWdCQ2tET0JBUElBQWdCQ2tETUJBUElBQWdCQ2tES0JBUElBQWdCQ2tESUJBUElBUkI0QUJxSkFBZ0NRdkZCQUlJZndGK0FrQUNRQUpBQWtBQ1FDQUNRb0NBZ0lCd2cwS0FnSUNBa0g5U0JFQWdBQ0FDRUNnaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ0lBS25JUVFNQVFzZ0FxY2lCQ0FFS0FJQVFRRnFOZ0lBQ3lBRVFSQnFJUWNnQkNrQ0JDSU1wMEgvLy8vL0IzRWhCZ0pBSUF4Q2dJQ0FnQWlEVUFSQVFRQWhCRUVBSVFNRFFDQUVJQVpHUlFSQUlBTWdCQ0FIYWkwQUFFRUhkbW9oQXlBRVFRRnFJUVFNQVFzTElBTkZCRUFnQnlFRUlBRU5CQXdHQ3lBQUlBTWdCbXBCQUJEcUFTSUlSUTBDSUFoQkVHb2hCRUVBSVFNRFFDQURJQVpHRFFJZ0F5QUhhaXdBQUNJRlFRQk9CSDhnQkVFQmFnVWdCQ0FGUVQ5eFFZQUJjam9BQVNBRlFjQUJjVUVHZGtGQWNpRUZJQVJCQW1vTElRa2dCQ0FGT2dBQUlBTkJBV29oQXlBSklRUU1BQXNBQ3lBQUlBWkJBMnhCQUJEcUFTSUlSUTBCSUFoQkVHb2hCQU5BSUFVaUNpQUdUZzBCSUFwQkFXb2hCU0FISUFwQkFYUnFMd0VBSWdsQi93Qk5CRUFnQkNBSk9nQUFJQVJCQVdvaEJBVUNRQ0FKUVlENEEzRkJnTEFEUnlBRGNpQUZJQVpPY2cwQUlBY2dCVUVCZEdvdkFRQWlDMEdBK0FOeFFZQzRBMGNOQUNBSlFRcDBRWUQ0UDNFZ0MwSC9CM0Z5UVlDQUJHb2hDU0FLUVFKcUlRVUxJQVFnQ1JDaEF5QUVhaUVFQ3d3QUN3QUxJQVJCQURvQUFDQUlJQVFnQ0VFUWFpSUhhMEgvLy8vL0IzR3RJQWdwQWdSQ2dJQ0FnSGlEaERjQ0JDQUFJQUlRRHlBQlJRMENJQWdvQWdSQi8vLy8vd2R4SVFZTUFRdEJBQ0VHUVFBaEIwRUFJUVFnQVVVTkFnc2dBU0FHTmdJQUN5QUhJUVFMSUFRTGp3TUJCSDhqQUVFUWF5SUVKQUFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQlFpQ0lweUlDUVF0cURnc0RBZ0lFQUFVRkJRWUJBUVVMSUFHbklnSXBBZ1JDZ0lDQWdJQ0FnSURBQUZRTkJpQUFJQUlRb2dNTUJ3c2dBQzBBYUVFQ1JnMEdJQUduSWdJb0FnZ2lBeUFDS0FJTUlnVTJBZ1FnQlNBRE5nSUFJQUpCQURZQ0RDQUFLQUpjSVFNZ0FDQUNRUWhxSWdVMkFsd2dBaUFETmdJTUlBSWdBRUhZQUdvaUFqWUNDQ0FESUFVMkFnQWdBQzBBYUEwR0lBQkJBVG9BYUFOQUlBSWdBQ2dDWENJRFJ3UkFJQU5CQ0dzaUF5Z0NBQTBKSUFBZ0F4RHRCUXdCQ3dzZ0FFRUFPZ0JvREFZTElBR25JZ0pCQkdvUUd5QUFRUkJxSUFJZ0FDZ0NCQkVBQUF3RkN5QUJweUlDUVFScUVCc2dBRUVRYWlBQ0lBQW9BZ1FSQUFBTUJBc2dBQ0FCcHhDaUF3d0RDeUFFSUFJMkFnQWpBRUVRYXlJQUpBQWdBQ0FFTmdJTVFaRElCRUdUbXdFZ0JCQ2JCQ0FBUVJCcUpBQUxFQUVBQ3lBQVFSQnFJQUlnQUNnQ0JCRUFBQXNnQkVFUWFpUUFEd3RCNFk0QlFhNzhBRUhiS2tIWEp4QUFBQXNnQVFGK0lBQWdBQ0FDSUFGQkFVRUNRUUFRZ2dFaUJDQUJJQU1RM2dFZ0JBdjlDUUlMZndGK0l3QkJ3QUpySWdNa0FBSkFJQUpDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFRb0NBZ0lEZ0FDRU9JQUFnQTBIY0FHb2dBaERsQVNJR1JRMEJJQU1vQWx3aENBTkFJQVFnQ0VjRVFBSkFJQVFnQm1vc0FBQkI1d0JyUVI5M0lnZEJDVXRCeXdVZ0IzWkJBWEZGY2tVRVFDQUhRUUowUWZ6OUFXb29BZ0FpQnlBRmNVVU5BUXNnQUNBR0VGUWdBRUhRT0VFQUVJQUNEQVFMSUFSQkFXb2hCQ0FGSUFkeUlRVU1BUXNMSUFBZ0JoQlVDMEtBZ0lDQTRBQWhEaUFBSUFOQjNBQnFJQUVnQlVFRWRrRUJjU0lFUlJDVkJDSUlSUTBBSUFNb0Fsd2hCaUFEUWJ3QmFrRUFRWUFCRUNzYUlBTkNBRGNEYUNBRFFnQTNBcXdCSUFNZ0FEWUN1QUVnQTBFME5nSzBBU0FEUVg4MkFwd0JJQU5DZ1lDQWdIQTNBcFFCSUFNZ0JEWUNpQUVnQXlBSU5nS0FBU0FESUFZZ0NHbzJBbndnQXlBSU5nSjRJQU1nQURZQ29BRWdBMElBTndOZ0lBTWdBRFlDZENBRFFnQTNBcVFCSUFOQk5EWUNjQ0FESUFVMkFvUUJJQU1nQlVFRGRrRUJjVFlDa0FFZ0F5QUZRUUYyUVFGeE5nS01BU0FEUWVBQWFpSUVJQVZCL3dGeEVCRWdCRUVBRUJFZ0JFRUFFQkVnQkVFQUVCMGdCVUVnY1VVRVFDQURRZUFBYWlJRVFRaEJCaEM0QVJvZ0JFRUVFQkVnQkVFSFFYVVF1QUVhQ3lBRFFlQUFhaUlFUVF0QkFCQ3BBZ0ovQWtBZ0JFRUFFUElDRFFBZ0EwSGdBR29pQkVFTVFRQVFxUUlnQkVFS0VCRWdBeWdDZUMwQUFBUkFJQU5CNEFCcVFZL3pBRUVBRURvTUFRc2dBeWdDYkFSQUlBTkI0QUJxRUtnQ0RBRUxJQU1vQW1SQkIyc2hDeUFES0FKZ0lneEJCMm9oRFVFQUlRUkJBQ0VGQWtBQ1FBSkFBa0FDUUFOQUlBVWdDMGdFUUNBRklBMXFJZ1l0QUFBaUNrRWRUdzBFSUFVZ0NrSHdnUUpxTFFBQUlnZHFJQXRLRFFVQ1FBSkFBa0FDUUFKQUlBcEJEMnNPREFBQkJBUUVCQUlEQkFRQUFRUUxJQVJCQVdvaEJpQUVJQWxJQkVBZ0JpRUVEQVFMSUFSQi9nRktJUW9nQmlJRUlRa2dDa1VOQXd3R0N5QUVRUUJNRFFrZ0JFRUJheUVFREFJTElBWXZBQUZCQW5RZ0Iyb2hCd3dCQ3lBR0x3QUJRUU4wSUFkcUlRY0xJQVVnQjJvaEJRd0JDd3NnQ1VFQVRnMEJDeUFEUWVBQWFrSGpOVUVBRURvTUJBc2dEQ0FES0FLVUFUb0FBU0FES0FKZ0lBazZBQUlnQXlnQ1lDQURLQUprUVFkck5nQURJQU1vQXFnQklnUWdBeWdDbEFGQkFXdExCRUFnQTBIZ0FHb2dBeWdDcEFFZ0JCQnlJQU1vQW1BaUJDQUVMUUFBUVlBQmNqb0FBQXNnQXlnQ3BBRWlCQVJBSUFNb0FyZ0JJQVJCQUNBREtBSzBBUkVCQUJvTElBTkJBRG9BRUNBREtBSmdJUVVnQXlnQ1pBd0VDMEd4Z1FGQndQd0FRZm9OUVlUZ0FCQUFBQXRCN3RBQVFjRDhBRUg3RFVHRTRBQVFBQUFMUWZTTkFVSEEvQUJCaUE1QmhPQUFFQUFBQ3lBREtBSmdJZ1FFUUNBREtBSjBJQVJCQUNBREtBSndFUUVBR2dzZ0EwSUFOd053SUFOQ0FEY0RhQ0FEUWdBM0EyQWdBeWdDcEFFaUJBUkFJQU1vQXJnQklBUkJBQ0FES0FLMEFSRUJBQm9MSUFOQnBBRnFJZ1JDQURjQ0FDQUVRZ0EzQWhBZ0JFSUFOd0lJSUFOQnZBRnFJUVJCQUNFRkEwQWdBMEVRYWlBRmFpRUdJQVF0QUFBaUIwVWdCVUUrUzNKRkJFQWdCaUFIT2dBQUlBVkJBV29oQlNBRVFRRnFJUVFNQVFzTElBWkJBRG9BQUVFQUlRVkJBQXNoQkNBQUlBZ1FWQ0FGUlFSQUlBTWdBMEVRYWpZQ0FDQUFRWlU5SUFNUWdBSU1BUXNnQUNBRklBUVFoQU1oRGlBQUtBSVFJZ0JCRUdvZ0JTQUFLQUlFRVFBQUN5QURRY0FDYWlRQUlBNEwxQUlCQkg4akFFSFFBV3NpQlNRQUlBVWdBallDekFFZ0JVR2dBV29pQWtFQVFTZ1FLeG9nQlNBRktBTE1BVFlDeUFFQ1FFRUFJQUVnQlVISUFXb2dCVUhRQUdvZ0FpQURJQVFRaEFaQkFFZ0VRRUYvSVFRTUFRc2dBQ2dDVEVFQVRpRUdJQUFvQWdBaEJ5QUFLQUpJUVFCTUJFQWdBQ0FIUVY5eE5nSUFDd0ovQWtBQ1FDQUFLQUl3UlFSQUlBQkIwQUEyQWpBZ0FFRUFOZ0ljSUFCQ0FEY0RFQ0FBS0FJc0lRZ2dBQ0FGTmdJc0RBRUxJQUFvQWhBTkFRdEJmeUFBRU00RERRRWFDeUFBSUFFZ0JVSElBV29nQlVIUUFHb2dCVUdnQVdvZ0F5QUVFSVFHQ3lFQ0lBZ0VRQ0FBUVFCQkFDQUFLQUlrRVFFQUdpQUFRUUEyQWpBZ0FDQUlOZ0lzSUFCQkFEWUNIQ0FBS0FJVUlRRWdBRUlBTndNUUlBSkJmeUFCR3lFQ0N5QUFJQUFvQWdBaUFDQUhRU0J4Y2pZQ0FFRi9JQUlnQUVFZ2NSc2hCQ0FHUlEwQUN5QUZRZEFCYWlRQUlBUUxKQUFnQUVJQU53TndJQUFnQUNnQ0NEWUNhQ0FBSUFBb0Fpd2dBQ2dDQkd1c053TjRDeEFBSUFBZ0FTQUNRUUJCQUJDWkJCb0x0UmdERkg4RWZBRitJd0JCTUdzaUNTUUFBa0FDUUFKQUlBQzlJaHBDSUlpbklnSkIvLy8vL3dkeElnTkIrdFM5Z0FSTkJFQWdBa0gvL3o5eFFmdkRKRVlOQVNBRFFmeXlpNEFFVFFSQUlCcENBRmtFUUNBQklBQkVBQUJBVlBzaCtiK2dJZ0JFTVdOaUdtRzAwTDJnSWhZNUF3QWdBU0FBSUJhaFJERmpZaHBodE5DOW9Ea0RDRUVCSVFJTUJRc2dBU0FBUkFBQVFGVDdJZmsvb0NJQVJERmpZaHBodE5BOW9DSVdPUU1BSUFFZ0FDQVdvVVF4WTJJYVliVFFQYUE1QXdoQmZ5RUNEQVFMSUJwQ0FGa0VRQ0FCSUFCRUFBQkFWUHNoQ2NDZ0lnQkVNV05pR21HMDRMMmdJaFk1QXdBZ0FTQUFJQmFoUkRGallocGh0T0M5b0RrRENFRUNJUUlNQkFzZ0FTQUFSQUFBUUZUN0lRbEFvQ0lBUkRGallocGh0T0E5b0NJV09RTUFJQUVnQUNBV29VUXhZMklhWWJUZ1BhQTVBd2hCZmlFQ0RBTUxJQU5CdTR6eGdBUk5CRUFnQTBHOCs5ZUFCRTBFUUNBRFFmeXl5NEFFUmcwQ0lCcENBRmtFUUNBQklBQkVBQUF3ZjN6WkVzQ2dJZ0JFeXBTVHA1RU82YjJnSWhZNUF3QWdBU0FBSUJhaFJNcVVrNmVSRHVtOW9Ea0RDRUVESVFJTUJRc2dBU0FBUkFBQU1IOTgyUkpBb0NJQVJNcVVrNmVSRHVrOW9DSVdPUU1BSUFFZ0FDQVdvVVRLbEpPbmtRN3BQYUE1QXdoQmZTRUNEQVFMSUFOQis4UGtnQVJHRFFFZ0drSUFXUVJBSUFFZ0FFUUFBRUJVK3lFWndLQWlBRVF4WTJJYVliVHd2YUFpRmprREFDQUJJQUFnRnFGRU1XTmlHbUcwOEwyZ09RTUlRUVFoQWd3RUN5QUJJQUJFQUFCQVZQc2hHVUNnSWdCRU1XTmlHbUcwOEQyZ0loWTVBd0FnQVNBQUlCYWhSREZqWWhwaHRQQTlvRGtEQ0VGOElRSU1Bd3NnQTBINncrU0pCRXNOQVFzZ0FDQUFSSVBJeVcwd1grUS9va1FBQUFBQUFBQTRRNkJFQUFBQUFBQUFPTU9nSWhkRUFBQkFWUHNoK2IraW9DSVdJQmRFTVdOaUdtRzAwRDJpSWhpaElobEVHQzFFVlBzaDZiOWpJUVFDZnlBWG1VUUFBQUFBQUFEZ1FXTUVRQ0FYcWd3QkMwR0FnSUNBZUFzaEFnSkFJQVFFUUNBQ1FRRnJJUUlnRjBRQUFBQUFBQUR3djZBaUYwUXhZMklhWWJUUVBhSWhHQ0FBSUJkRUFBQkFWUHNoK2IraW9DRVdEQUVMSUJsRUdDMUVWUHNoNlQ5a1JRMEFJQUpCQVdvaEFpQVhSQUFBQUFBQUFQQS9vQ0lYUkRGallocGh0TkE5b2lFWUlBQWdGMFFBQUVCVSt5SDV2NktnSVJZTElBRWdGaUFZb1NJQU9RTUFBa0FnQTBFVWRpSUVJQUM5UWpTSXAwSC9EM0ZyUVJGSURRQWdBU0FXSUJkRUFBQmdHbUcwMEQyaUlnQ2hJaGtnRjBSemNBTXVpaG1qTzZJZ0ZpQVpvU0FBb2FFaUdLRWlBRGtEQUNBRUlBQzlRalNJcDBIL0QzRnJRVEpJQkVBZ0dTRVdEQUVMSUFFZ0dTQVhSQUFBQUM2S0dhTTdvaUlBb1NJV0lCZEV3VWtnSlpxRGV6bWlJQmtnRnFFZ0FLR2hJaGloSWdBNUF3QUxJQUVnRmlBQW9TQVlvVGtEQ0F3QkN5QURRWUNBd1A4SFR3UkFJQUVnQUNBQW9TSUFPUU1BSUFFZ0FEa0RDRUVBSVFJTUFRc2dHa0wvLy8vLy8vLy9CNE5DZ0lDQWdJQ0FnTERCQUlTL0lRQkJBQ0VDUVFFaEJBTkFJQWxCRUdvZ0FrRURkR29DZnlBQW1VUUFBQUFBQUFEZ1FXTUVRQ0FBcWd3QkMwR0FnSUNBZUF1M0loWTVBd0FnQUNBV29VUUFBQUFBQUFCd1FhSWhBRUVCSVFJZ0JDRUdRUUFoQkNBR0RRQUxJQWtnQURrRElFRUNJUUlEUUNBQ0lncEJBV3NoQWlBSlFSQnFJQXBCQTNScUt3TUFSQUFBQUFBQUFBQUFZUTBBQ3lBSlFSQnFJUTRqQUVHd0JHc2lCU1FBSUFOQkZIWkJsZ2hySWdKQkEydEJHRzBpQmtFQUlBWkJBRW9iSWc5QmFHd2dBbW9oQmtHVXF3UW9BZ0FpQ3lBS1FRRnFJZ3hCQVdzaUNHcEJBRTRFUUNBTElBeHFJUUlnRHlBSWF5RURBMEFnQlVIQUFtb2dCRUVEZEdvZ0EwRUFTQVI4UkFBQUFBQUFBQUFBQlNBRFFRSjBRYUNyQkdvb0FnQzNDemtEQUNBRFFRRnFJUU1nQkVFQmFpSUVJQUpIRFFBTEN5QUdRUmhySVFwQkFDRUNJQXRCQUNBTFFRQktHeUVFSUF4QkFFd2hEUU5BQWtBZ0RRUkFSQUFBQUFBQUFBQUFJUUFNQVFzZ0FpQUlhaUVIUVFBaEEwUUFBQUFBQUFBQUFDRUFBMEFnRGlBRFFRTjBhaXNEQUNBRlFjQUNhaUFISUFOclFRTjBhaXNEQUtJZ0FLQWhBQ0FEUVFGcUlnTWdERWNOQUFzTElBVWdBa0VEZEdvZ0FEa0RBQ0FDSUFSR0lRTWdBa0VCYWlFQ0lBTkZEUUFMUVM4Z0Jtc2hFMEV3SUFacklSQWdCa0VaU0NFUklBWkJHV3NoRkNBTElRSUNRQU5BSUFVZ0FrRURkR29yQXdBaEFFRUFJUU1nQWlFRUlBSkJBRXdpQjBVRVFBTkFJQVZCNEFOcUlBTkJBblJxQW44Q2Z5QUFSQUFBQUFBQUFIQStvaUlXbVVRQUFBQUFBQURnUVdNRVFDQVdxZ3dCQzBHQWdJQ0FlQXUzSWhaRUFBQUFBQUFBY01HaUlBQ2dJZ0NaUkFBQUFBQUFBT0JCWXdSQUlBQ3FEQUVMUVlDQWdJQjRDellDQUNBRklBUkJBV3NpQkVFRGRHb3JBd0FnRnFBaEFDQURRUUZxSWdNZ0FrY05BQXNMQW44Z0FDQUtFTm9CSWdBZ0FFUUFBQUFBQUFEQVA2S2NSQUFBQUFBQUFDREFvcUFpQUpsRUFBQUFBQUFBNEVGakJFQWdBS29NQVF0QmdJQ0FnSGdMSVFnZ0FDQUl0NkVoQUFKQUFrQUNRQUovSUJGRkJFQWdBa0VDZENBRmFpSUVJQVFvQXR3RElnUWdCQ0FRZFNJRUlCQjBheUlETmdMY0F5QUVJQWhxSVFnZ0F5QVRkUXdCQ3lBS0RRRWdBa0VDZENBRmFpZ0MzQU5CRjNVTElnMUJBRXdOQWd3QkMwRUNJUTBnQUVRQUFBQUFBQURnUDJZTkFFRUFJUTBNQVF0QkFDRURRUUFoQkNBSFJRUkFBMEFnQlVIZ0Eyb2dBMEVDZEdvaUZTZ0NBQ0VTUWYvLy93Y2hCd0ovQWtBZ0JBMEFRWUNBZ0FnaEJ5QVNEUUJCQUF3QkN5QVZJQWNnRW1zMkFnQkJBUXNoQkNBRFFRRnFJZ01nQWtjTkFBc0xBa0FnRVEwQVFmLy8vd01oQXdKQUFrQWdGQTRDQVFBQ0MwSC8vLzhCSVFNTElBSkJBblFnQldvaUJ5QUhLQUxjQXlBRGNUWUMzQU1MSUFoQkFXb2hDQ0FOUVFKSERRQkVBQUFBQUFBQThEOGdBS0VoQUVFQ0lRMGdCRVVOQUNBQVJBQUFBQUFBQVBBL0lBb1EyZ0doSVFBTElBQkVBQUFBQUFBQUFBQmhCRUJCQVNFRFFRQWhCeUFDSVFRQ1FDQUNJQXRNRFFBRFFDQUZRZUFEYWlBRVFRRnJJZ1JCQW5ScUtBSUFJQWR5SVFjZ0JDQUxTZzBBQ3lBSFJRMEFJQW9oQmdOQUlBWkJHR3NoQmlBRlFlQURhaUFDUVFGcklnSkJBblJxS0FJQVJRMEFDd3dEQ3dOQUlBTWlCRUVCYWlFRElBVkI0QU5xSUFzZ0JHdEJBblJxS0FJQVJRMEFDeUFDSUFScUlRUURRQ0FGUWNBQ2FpQUNJQXhxSWdoQkEzUnFJQUpCQVdvaUFpQVBha0VDZEVHZ3F3UnFLQUlBdHprREFFRUFJUU5FQUFBQUFBQUFBQUFoQUNBTVFRQktCRUFEUUNBT0lBTkJBM1JxS3dNQUlBVkJ3QUpxSUFnZ0EydEJBM1JxS3dNQW9pQUFvQ0VBSUFOQkFXb2lBeUFNUncwQUN3c2dCU0FDUVFOMGFpQUFPUU1BSUFJZ0JFZ05BQXNnQkNFQ0RBRUxDd0pBSUFCQkdDQUdheERhQVNJQVJBQUFBQUFBQUhCQlpnUkFJQVZCNEFOcUlBSkJBblJxQW44Q2Z5QUFSQUFBQUFBQUFIQStvaUlXbVVRQUFBQUFBQURnUVdNRVFDQVdxZ3dCQzBHQWdJQ0FlQXNpQTdkRUFBQUFBQUFBY01HaUlBQ2dJZ0NaUkFBQUFBQUFBT0JCWXdSQUlBQ3FEQUVMUVlDQWdJQjRDellDQUNBQ1FRRnFJUUlNQVFzQ2Z5QUFtVVFBQUFBQUFBRGdRV01FUUNBQXFnd0JDMEdBZ0lDQWVBc2hBeUFLSVFZTElBVkI0QU5xSUFKQkFuUnFJQU0yQWdBTFJBQUFBQUFBQVBBL0lBWVEyZ0VoQUNBQ1FRQk9CRUFnQWlFRUEwQWdCU0FFSWdaQkEzUnFJQUFnQlVIZ0Eyb2dCRUVDZEdvb0FnQzNvamtEQUNBRVFRRnJJUVFnQUVRQUFBQUFBQUJ3UHFJaEFDQUdEUUFMSUFJaEJBTkFSQUFBQUFBQUFBQUFJUUJCQUNFRElBc2dBaUFFYXlJR0lBWWdDMG9iSWdwQkFFNEVRQU5BSUFOQkEzUkI4TUFFYWlzREFDQUZJQU1nQkdwQkEzUnFLd01Bb2lBQW9DRUFJQU1nQ2tjaERDQURRUUZxSVFNZ0RBMEFDd3NnQlVHZ0FXb2dCa0VEZEdvZ0FEa0RBQ0FFUVFCS0lRWWdCRUVCYXlFRUlBWU5BQXNMUkFBQUFBQUFBQUFBSVFBZ0FrRUFUZ1JBSUFJaEJBTkFJQVFpQmtFQmF5RUVJQUFnQlVHZ0FXb2dCa0VEZEdvckF3Q2dJUUFnQmcwQUN3c2dDU0FBbWlBQUlBMGJPUU1BSUFVckE2QUJJQUNoSVFCQkFTRURJQUpCQUVvRVFBTkFJQUFnQlVHZ0FXb2dBMEVEZEdvckF3Q2dJUUFnQWlBRFJ5RUVJQU5CQVdvaEF5QUVEUUFMQ3lBSklBQ2FJQUFnRFJzNUF3Z2dCVUd3Qkdva0FDQUlRUWR4SVFJZ0NTc0RBQ0VBSUJwQ0FGTUVRQ0FCSUFDYU9RTUFJQUVnQ1NzRENKbzVBd2hCQUNBQ2F5RUNEQUVMSUFFZ0FEa0RBQ0FCSUFrckF3ZzVBd2dMSUFsQk1Hb2tBQ0FDQy80REF3TjhBbjhCZmlBQXZTSUdRaUNJcDBILy8vLy9CM0VpQkVHQWdNQ2dCRThFUUNBQVJCZ3RSRlQ3SWZrL0lBQ21JQUM5UXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHdzhMQWtBQ2Z5QUVRZi8vNy80RFRRUkFRWDhnQkVHQWdJRHlBMDhOQVJvTUFnc2dBSmtoQUNBRVFmLy95LzhEVFFSQUlBUkIvLytYL3dOTkJFQWdBQ0FBb0VRQUFBQUFBQUR3djZBZ0FFUUFBQUFBQUFBQVFLQ2pJUUJCQUF3Q0N5QUFSQUFBQUFBQUFQQy9vQ0FBUkFBQUFBQUFBUEEvb0tNaEFFRUJEQUVMSUFSQi8vK05nQVJOQkVBZ0FFUUFBQUFBQUFENHY2QWdBRVFBQUFBQUFBRDRQNkpFQUFBQUFBQUE4RCtnb3lFQVFRSU1BUXRFQUFBQUFBQUE4TDhnQUtNaEFFRURDeUVGSUFBZ0FLSWlBaUFDb2lJQklBRWdBU0FCSUFGRUwyeHFMRVMwb3IraVJKcjkzbEl0M3EyL29LSkViWnAwci9Ld3M3K2dva1J4RmlQK3huRzh2NkNpUk1Ucm1KbVptY20vb0tJaEF5QUNJQUVnQVNBQklBRWdBVVFSMmlMak9xMlFQNkpFNncxMkpFdDdxVCtnb2tSUlBkQ2daZzJ4UDZDaVJHNGdUTVhOUmJjL29LSkUvNE1Ba2lSSndqK2dva1FOVlZWVlZWWFZQNkNpSVFFZ0JFSC8vKy8rQTAwRVFDQUFJQUFnQXlBQm9LS2hEd3NnQlVFRGRDSUVRWkNxQkdvckF3QWdBQ0FESUFHZ29pQUVRYkNxQkdvckF3Q2hJQUNob1NJQW1pQUFJQVpDQUZNYklRQUxJQUFMaUFFQkJIOENRQUovQWtBZ0EwRUhjU0lJUVFaSEJFQkJJQ0VIQTBBZ0FDQUJJQUlnQjJvaUNTQUZJQVFSQndBaUJrRXNjUTBFSUFaQkVIRkZEUUlnQjBFQmRDRUhJQUFnQWlBSUlBa1E0UU5GRFFBTFFSQU1BZ3NnQUNBQklBSWdCU0FFRVFjQUdndEJBQXNoQmlBQUtBSU1JZ0ZGRFFBZ0FDQUNJQU1nQVNBR0VLb0RJUVlMSUFZTDRnRUJBbjhqQUVFZ2F5SUVKQUFnQUNBQlJ3UkFBa0FDUUFKQUlBRW9BZ3hGQkVBQ1FBSkFJQUVvQWdoQi92Ly8vd2RyRGdJQUF3RUxJQUVvQWdRTkFpQUFRUUFRakFFTUJBc2dBRUVCRUl3QkRBTUxJQUVvQWdSRkRRRUxJQUFRTlF3QkN5QUFLQUlBSVFVZ0JFSUFOd0lZSUFSQ2dJQ0FnSUNBZ0lDQWZ6Y0NFQ0FFSUFVMkFnd2dCRUVNYWlJRlFnRVFNQm9nQVNBRkVJSUNCRUFnQUVFQUVJa0JJQVJCREdvUUd3d0JDeUFFUVF4cUVCc2dBQ0FCSUFJZ0EwSGlBRUVBRUo0RUdnc2dCRUVnYWlRQUR3dEIyUDBBUWRUOEFFRzNJMEdxMmdBUUFBQUw4Z0lCQTM4akFFRkFhaUlHSkFBQ1FDQUVJQU5ySWdoQkFVWUVRQUpBSUFORkJFQWdBVUlERURBYURBRUxJQUVnQTYwUU1Cb2dBVUVCTmdJRUN5QUNJQU5CQVhSQkFYS3RFREFhSUFJZ0FpZ0NDRUVDYWpZQ0NDQUFJQUVRUkJvTUFRc2dBQ2dDQUNFSElBQWdBU0FDSUFNZ0NFRUJkaUFEYWlJRFFRRVFvQVFnQmtJQU53STRJQVpDZ0lDQWdJQ0FnSUNBZnpjQ01DQUdJQWMyQWl3Z0JrSUFOd0lrSUFaQ2dJQ0FnSUNBZ0lDQWZ6Y0NIQ0FHSUFjMkFoZ2dCa0lBTndJUUlBWkNnSUNBZ0lDQWdJQ0FmemNDQ0NBR0lBYzJBZ1FnQmtFc2FpSUhJQVpCR0dvZ0JrRUVhaUlJSUFNZ0JDQUZFS0FFSUFBZ0FDQUlRZi8vLy84RFFRRVFReG9nQnlBSElBRkIvLy8vL3dOQkFSQkRHaUFBSUFBZ0IwSC8vLy8vQTBFQkVNc0JHaUFGQkVBZ0FTQUJJQVpCR0dwQi8vLy8vd05CQVJCREdnc2dBaUFDSUFaQkJHb2lBRUgvLy8vL0EwRUJFRU1hSUFaQkxHb1FHeUFHUVJocUVCc2dBQkFiQ3lBR1FVQnJKQUFMemdVQ0IzOERmaU1BUVRCcklnZ2tBQUovQWtBQ1FBSkFBa0FDUUNBRERnTUFBUUlEQzBIY2pBRkIxUHdBUWJVYVFaYjhBQkFBQUFzZ0FTQUNLQUlRSUFJb0Fnd2lBQ0FBUVFWMElBSW9BZ2hyRUdnMkFnQU1BZ3NnQWlnQ0VDSURJQUlvQWd3aUFDQUFRUVYwSUFJb0FnaHJJZ0pCSUdvUWFLMUNJSVlnQXlBQUlBSVFhSzJFSVE4Z0JrR0FsT3ZjQTBZRVFDQUJJQTlDZ0pUcjNBT0FJaEErQWdRZ0FTQVFRb0RzbEtNTWZpQVBmRDRDQUF3Q0N5QUJJQThnQnEwaUVJQWlFVDRDQkNBQklBOGdFQ0FSZm4wK0FnQU1BUXNnQWlnQ0FDRUtJQWhDQURjQ0tDQUlRb0NBZ0lDQWdJQ0FnSDgzQWlBZ0NDQUtOZ0ljSUFoQ0FEY0NGQ0FJUW9DQWdJQ0FnSUNBZ0g4M0Fnd2dDQ0FLTmdJSUlBTWdCVUVCZENBRVFRRnFJZ3QyUVFGcVFRRjJJZ3BySVF3Z0FDQUVRUUYwUVFGeVFSUnNhaUVOUVFBaEF5QUFJQVJCS0d4cUlnUW9BZ3hGQkVBZ0JDQUdJQXBCLy8vLy93TkJBUkQ4QWlBSVFRaHFJZ2xDQVJBd2NpQU5JQWtnQkNBS1FRRnFJQWRzUVFKcVFRQVFsUUZ5SVFrTEFrQUNRQ0FJUVJ4cUlnNGdBaUFOSUFjZ0RHeEJBQkJESUFseUlBNUJBUkRSQVhJZ0NFRUlhaUlKSUE0Z0JFSC8vLy8vQTBFQkVFTnlJQWtnQWlBSlFmLy8vLzhEUVFFUTVBRnlRU0J4RFFBRFFBSkFJQWdvQWd4RkRRQWdDQ2dDRkVVTkFDQUlRUWhxSWdJZ0FpQUVRZi8vLy84RFFRRVF5d0VOQWlBRFFRRnJJUU1NQVFzTEEwQWdDRUVJYWlBRUVOTUJRUUJPQkVBZ0NFRUlhaUlDSUFJZ0JFSC8vLy8vQTBFQkVPUUJEUUlnQTBFQmFpRUREQUVMQ3lBREJFQWdDRUVjYWlJQ0lBSWdBNnhCLy8vLy93TkJBUkIxRFFFTElBQWdBU0FLUVFKMGFpQUlRUnhxSUF3Z0N5QUZJQVlnQnhDaEJBMEFJQUFnQVNBSVFRaHFJQW9nQ3lBRklBWWdCeENoQkVVTkFRc2dDRUVjYWhBYklBaEJDR29RRzBGL0RBSUxJQWhCSEdvUUd5QUlRUWhxRUJzTFFRQUxJUU1nQ0VFd2FpUUFJQU1MaEFFQkFuOENRQ0FBSUFGSEJFQWdBa1VFUUNBQVFnRVFNQ0VGREFJTFFSNGdBbWRySVFZZ0FDQUJFRVFoQlFOQUlBWkJBRWdOQWlBQUlBQWdBQ0FESUFRUVF5QUZjaUVGSUFJZ0JuWkJBWEVFUUNBQUlBQWdBU0FESUFRUVF5QUZjaUVGQ3lBR1FRRnJJUVlNQUFzQUMwSFkvUUJCMVB3QVFkb1JRZXpYQUJBQUFBc2dCUXQxQWdKOEFYNGdBQUorRUF3aUFVUUFBQUFBQUVDUFFLTWlBcGxFQUFBQUFBQUE0RU5qQkVBZ0FyQU1BUXRDZ0lDQWdJQ0FnSUNBZndzaUF6Y0RBQ0FBQW44Z0FTQURRdWdIZnJtaFJBQUFBQUFBUUk5QW9pSUJtVVFBQUFBQUFBRGdRV01FUUNBQnFnd0JDMEdBZ0lDQWVBczJBZ2dMZlFFQ2Z5TUFRU0JySWdZa0FBSkFJQUFnQVVjZ0FDQUNSM0ZGQkVBZ0FDZ0NBQ0VISUFaQ0FEY0NHQ0FHUW9DQWdJQ0FnSUNBZ0g4M0FoQWdCaUFITmdJTUlBWkJER29pQnlBQklBSWdBeUFFSUFVUkNnQWhBU0FBSUFjUW9BWU1BUXNnQUNBQklBSWdBeUFFSUFVUkNnQWhBUXNnQmtFZ2FpUUFJQUVMNWdvQ0MzOERmaU1BUVJCcklnMGtBQ0FFSUFWQkFXc2lCa0VDZEdvb0FnQWhCd0pBQWtBQ1FDQUZRUUZHQkVCQkFDRUdJQTFCQURZQ0RBSkFJQU5CQWswRVFDQUhyU0VSQTBBZ0EwRUFUQTBDSUFFZ0EwRUJheUlEUVFKMElnQnFJQUFnQW1vMUFnQWdCcTFDSUlhRUloSWdFWUFpRXo0Q0FDQVNJQkVnRTM1OXB5RUdEQUFMQUFzZ0IwRi9jNjFDSUlaQy8vLy8vdytFSUFldGdLY2hBQU5BSUFOQkFXc2lBMEVBU0EwQklBRWdBMEVDZENJRWFpQU5RUXhxSUFZZ0FpQUVhaWdDQUNBSElBQVFtQVkyQWdBZ0RTZ0NEQ0VHREFBTEFBc2dBaUFHTmdJQURBRUxBa0FDUUFKQUFrQUNRQ0FESUFWcklnZ2dCU0FGSUFoS0cwRXlUZ1JBSUFnRVFDQUFLQUlBUVFBZ0NFRUJhaUlPSUFnZ0JTQUlTeHNpQ1VFQmFpSU1RUUowSUFBb0FnUVJBUUFpQzBVZ0FDZ0NBRUVBSUF4QkEzUWdBQ2dDQkJFQkFDSUhSWElOQlNBRklBbExEUUlnQ1NBRmF5RVBRUUFoQmdOQUlBb2dEMFlFUUFOQUlBVWdCa1lOQmlBSElBWWdEMnBCQW5ScUlBUWdCa0VDZEdvb0FnQTJBZ0FnQmtFQmFpRUdEQUFMQUFVZ0J5QUtRUUowYWtFQU5nSUFJQXBCQVdvaENnd0JDd0FMQUF0QnpJd0JRZFQ4QUVHa0MwR1Y2d0FRQUFBTElBaEJBMDhFUUNBSFFYOXpyVUlnaGtMLy8vLy9ENFFnQjYyQXB5RUpDd0pBQWtBQ1FBTkFJQVpCQUVnTkFTQUdRUUowSVFBZ0JpQUlhaUVESUFaQkFXc2hCaUFDSUFOQkFuUnFLQUlBSWdNZ0FDQUVhaWdDQUNJQVJnMEFDeUFCSUFoQkFuUnFJQUFnQTAwaUFEWUNBQ0FBRFFFTUFnc2dBU0FJUVFKMGFrRUJOZ0lBQ3lBQ0lBaEJBblJxSWdBZ0FDQUVJQVVRbUFJYUN5QUhyU0VSQTBBZ0NFRUJheUlJUVFCSURRZ2dBaUFJUVFKMElnNXFJUXdDZjBGL0lBY2dBaUFGSUFocVFRSjBhaUlHS0FJQUlnQk5EUUFhSUFrRVFDQU5RUWhxSUFBZ0JrRUVheWdDQUNBSElBa1FtQVlNQVFzZ0JrRUVhelVDQUNBQXJVSWdob1FnRVlDbkN5SUFyU0VTUVFBaENrRUFJUU1EUUNBRElBVkdSUVJBSUF3Z0EwRUNkQ0lQYWlJUUlCQTFBZ0FnQ3EwZ0JDQVBhalVDQUNBU2ZueDlJaE0rQWdCQkFDQVRRaUNJcDJzaENpQURRUUZxSVFNTUFRc0xJQVlnQmlnQ0FDSURJQXByTmdJQUlBTWdDa2tFUUFOQUlBQkJBV3NoQUNBTUlBd2dCQ0FGRUtvRVJRMEFJQVlnQmlnQ0FFRUJhaUlETmdJQUlBTU5BQXNMSUFFZ0Rtb2dBRFlDQUF3QUN3QUxJQVVnQ1dzaENrRUFJUVlEUUNBR0lBbEdSUVJBSUFjZ0JrRUNkR29nQkNBR0lBcHFRUUowYWlnQ0FEWUNBQ0FHUVFGcUlRWU1BUXNMSUFkQkFTQUpFS2tEUlEwQUlBdEJBQ0FKUVFKMElnWVFLeUFHYWtFQk5nSUFEQUVMSUFBZ0N5QUhJQWtRbVFZTkFRc2dBQ0FISUFzZ0RDQUNJQU5CQW5ScUlBbEJmM05CQW5ScUlBd1Exd0lOQUNBSVFYOXpJQXhCQVhScUlRaEJBQ0VHQTBBZ0JpQU9Sa1VFUUNBQklBWkJBblJxSUFjZ0JpQUlha0VDZEdvb0FnQTJBZ0FnQmtFQmFpRUdEQUVMQ3lBQUtBSUFJQWRCQUNBQUtBSUVFUUVBR2lBQUtBSUFJQXRCQUNBQUtBSUVFUUVBR2lBQUtBSUFRUUFnQTBFQ2RFRUVhaUFBS0FJRUVRRUFJZ2RGRFFNZ0FDQUhJQUVnRGlBRUlBVVExd0lOQVNBQ0lBSWdCeUFGUVFGcUVKZ0NHaUFBS0FJQUlBZEJBQ0FBS0FJRUVRRUFHaUFDSUFWQkFuUnFJUUFEUUNBRklRTUNRQ0FBS0FJQURRQURRQ0FEUVFCTURRRWdBaUFEUVFGcklnTkJBblFpQm1vb0FnQWlDQ0FFSUFacUtBSUFJZ1pHRFFBTElBWWdDRXNOQkFzZ0FpQUNJQVFnQlJDWUFpRURJQUFnQUNnQ0FDQURhellDQUNBQlFRRWdEaENwQXhvTUFBc0FDeUFMQkVBZ0FDZ0NBQ0FMUVFBZ0FDZ0NCQkVCQUJvTElBZEZEUUlMSUFBb0FnQWdCMEVBSUFBb0FnUVJBUUFhREFFTFFRQWhDd3dCQzBGL0lRc0xJQTFCRUdva0FDQUxDNVlGQWhGL0EzNUJBU0FFZENJUVFRRjJJUklnQmtFQ2RFR1FxUVJxS0FJQUloVkJBWFFoQ2tFQklRc0RRQ0FDSVF3Q1FBSkFJQkJCQWtZRVFFRUFJUUFEUUNBUklCSkdEUUlnQVNBUlFRSjBJZ05xSUF3Z0VTQVNha0VDZENJRWFpZ0NBQ0lDSUFNZ0RHb29BZ0FpQTJvaUJTQUtRUUFnQlNBS1R4dHJOZ0lBSUFFZ0JHb2dBeUFDYXlBS1FRQWdBaUFEU3h0cU5nSUFJQkZCQVdvaEVRd0FDd0FMUVFBaEFnSkFJQVJCRTBvTkFDQUFJQVpCb0FGc2FpQUZRZEFBYkdvZ0JFRUNkR3BCcUExcUlnMG9BZ0FpQWcwQUlBWkJBblJCa0trRWFpZ0NBQ0VIUVFBaEFpQUFLQUlBSWdnb0FnQkJBRUVFSUFSMElBZ29BZ1FSQVFBaUNFVU5BQ0FFUVFGcklRNGdBQ0FHUWFnQmJHb2dCVUhVQUd4cUlBUkJBblJxSWdJMUF1QUdJUmdnQWlnQ0dDRVRJQWV0SVJsQkFTRUNRUUFoQ1FOQUlBa2dEblpGQkVBZ0NDQUpRUU4wYWlJUElBSTJBZ0FnRHlBQ3JTSWFRaUNHSUJtQVBnSUVJQUlnRTJ3Z0J5QVlJQnArUWlDSXAyeHJJZ0lnQjBFQUlBSWdCMDhiYXlFQ0lBbEJBV29oQ1F3QkN3c2dEU0FJTmdJQUlBZ2hBZ3NnQWlJSERRRkJmeUVBQ3lBQUR3c2dFRUVCZGlFUUlBdEJBWFFoQ0VFQUlRbEJBQ0VOUVFBaERnTkFJQWtnRUVjRVFDQUhOUUlFSVJnZ0J5Z0NBQ0VUUVFBaEFnTkFJQUlnQzBjRVFDQURJQUlnRG1vaUQwRUNkR29nRENBQ0lBMXFJaFFnRW1wQkFuUnFLQUlBSWhZZ0RDQVVRUUowYWlnQ0FDSVVhaUlYSUFwQkFDQUtJQmRORzJzMkFnQWdBeUFMSUE5cVFRSjBhaUFVSUJacklBcHFJZzhnRTJ3Z0ZTQVByU0FZZmtJZ2lLZHNhellDQUNBQ1FRRnFJUUlNQVFzTElBbEJBV29oQ1NBSUlBNXFJUTRnQ3lBTmFpRU5JQWRCQ0dvaEJ3d0JDd3NnQkVFQmF5RUVJQU1oQWlBTUlRTWdDQ0VMREFBTEFBdlVCQUVKZndKQUlBQW9BZ0FpQ1NnQ0FFRUFJQVJCQW5RZ0NTZ0NCQkVCQUNJTFJRMEFBa0FnQTBVRVFDQUFJQUVnQVNBTElBSWdCaUFIRUtZRVJRMEJEQUlMSUFBb0FnQWlDU2dDQUVFQUlBUkJCblFnQ1NnQ0JCRUJBQ0lKUlEwQkFrQWdCVUVQY1VVRVFDQUFJQWRCcUFGc2FpQUdRZFFBYkdvZ0FpQURha0VDZEdvb0FoZ2hFQ0FIUVFKMElnTkJrS2tFYWlnQ0FDRU9JQUFnQTJvb0FnUWhEMEVCSVEwRFFFRUFJUU1nQlNBTVRRMENBMEJCQUNFS0lBTWdCRVlFUUVFQUlRZ0RRQUpBSUFoQkVFY0VRQ0FKSUFRZ0NHeEJBblJxSVFNQ1FDQUdSUVJBSUFBZ0F5QURJQXNnQWtFQUlBY1FwZ1FOQVNBRElBUWdEU0FPSUE4UW1nWU1Bd3NnQXlBRUlBMGdEaUFQRUpvR0lBQWdBeUFESUFzZ0FrRUJJQWNRcGdSRkRRSUxJQWtoQ0F3SkN3TkFBa0FnQkNBS1J3UkFJQVVnQ213Z0RHb2hBMEVBSVFnRFFDQUlRUkJHRFFJZ0FTQURJQWhxUVFKMGFpQUpJQVFnQ0d3Z0NtcEJBblJxS0FJQU5nSUFJQWhCQVdvaENBd0FDd0FMSUF4QkVHb2hEQXdHQ3lBS1FRRnFJUW9NQUFzQUN5QUlRUUZxSVFnZ0RTQVFJQTRnRHhEV0FpRU5EQUFMQUFVZ0F5QUZiQ0FNYWlFS1FRQWhDQU5BSUFoQkVFWkZCRUFnQ1NBRUlBaHNJQU5xUVFKMGFpQUJJQWdnQ21wQkFuUnFLQUlBTmdJQUlBaEJBV29oQ0F3QkN3c2dBMEVCYWlFRERBRUxBQXNBQ3dBTFFiV1BBVUhVL0FCQjRUMUJpOWNBRUFBQUN5QUFLQUlBSWdFb0FnQWdDVUVBSUFFb0FnUVJBUUFhQ3lBQUtBSUFJZ0FvQWdBZ0MwRUFJQUFvQWdRUkFRQWFRUUFQQ3lBQUlBZ1ExUUlnQUNBTEVOVUNRWDhMUUFBZ0FDQUJRUUYwclNBQnJTQUNyU0FBUWgySVF2Ly8vLzhQZzM1Q0lJaCtmSDBpQUNBQVFpQ0lwMEVCZFNBQmNhMThJZ0JDSUlpbklBRnhJQUNuYWd2OUFnSUxmd0orSUFGQkFDQUNJQWRzUVFKMEVDc2hDeUFDSUFVZ0JFRUZkR3BCQVdzZ0JXNGlBU0FCSUFKS0d5SUJRUUFnQVVFQVNoc2hERUYvSUFWMFFYOXpRWDhnQlVFZmNSc2hDaUFIUVFBZ0IwRUFTaHNoRFNBRlFTQktJUTRnQlVFK1NDRVBJQVZCUFVzaEVDQUZRY0VBU1NFUkEwQWdDU0FNUmtVRVFDQURJQVFnQlNBSmJDSUJFR2doQndKK0lBNUZCRUFnQnlBS2NhMGlFd3dCQ3lBRElBUWdBVUVnYWhCb0lRZ2dFRVVFUUNBSHJTSVRJQWdnQ25HdFFpQ0doQXdCQ3dKL0lCRkZCRUFnQXlBRUlBRkJRR3NRYUNBS2NRd0JDeUFJSUFweElRaEJBQXNoQVNBSFFmLy8vLzhIY2EwaEV5QUhRUjkyclNBSXJVSUJob1FnQWExQ0lZYUVDeUVVUVFBaEJ3TkFJQWNnRFVaRkJFQWdGQ0FHSUFkcVFRSjBJZ0ZCa0trRWFpZ0NBQ0lJSUFBZ0FXb29BZ1FpRWhDb0JDRUJJQXNnQWlBSGJDQUpha0VDZEdvZ0R3Ui9JQUVGSUFHdFFoK0dJQk9FSUFnZ0VoQ29CQXMyQWdBZ0IwRUJhaUVIREFFTEN5QUpRUUZxSVFrTUFRc0xDMDhCQkg4RFFDQURJQVZHUlFSQUlBQWdCVUVDZENJR2FpQUVJQUlnQm1vb0FnQWlCeUFCSUFacUtBSUFhaUlFYWlJR05nSUFJQVFnQjBrZ0JDQUdTM0loQkNBRlFRRnFJUVVNQVFzTElBUUw0d0VCQTM4Q1FBSkFJQU5CQTNGRklBTkJCM0VpQkVFRlJpQUNRZi8vLy84RFJuSnlJQUZCQVVZZ0JFRUNSbkZ5UlFSQUlBRWdCRUVEUjNJTkFRc2dBQ0FCRUl3QkRBRUxJQUFnQWtFZmFrRUZkaUlFRUVFRVFDQUFFRFZCSUE4TElBQW9BaEFpQlVGL1FTQkJBQ0FDYXlJQ1FSOXhJZ1pyZEVGL2N5QUNkRUYvSUFZYk5nSUFRUUVnQkNBRVFRRk5HeUVFUVFFaEFnTkFJQUlnQkVaRkJFQWdCU0FDUVFKMGFrRi9OZ0lBSUFKQkFXb2hBZ3dCQ3dzZ0FDQUJOZ0lFSUFCQmdJQ0FnQUpCQVVFY0lBTkJCWFpCUDNFaUFHdDBJQUJCUDBZYk5nSUlDMEVVQzJzQUFrQUNRQUpBQWtBQ1FDQUFJQUZ5UVE5eERnOEFCQU1FQWdRREJBRUVBd1FDQkFNRUMwSFlBRUhaQUNBQlFSQkdHdzhMUWRvQVFkc0FJQUZCQ0VZYkR3dEIzQUJCM1FBZ0FVRUVSaHNQQzBIZUFFSGZBQ0FCUVFKR0d3OExRZUFBUWVFQUlBRkJBVVliQ3pFQkFYOUJBU0VCQWtBQ1FBSkFJQUJCQ21zT0JBSUJBUUlBQ3lBQVFhakFBRVlOQVFzZ0FFR3B3QUJHSVFFTElBRUx0UUlCQTM4Q1FBSkFJQUFvQWpBaUNVRUJhaUlLSUFBb0Fpd2lDRTBFUUNBQUtBSW9JUWdNQVFzZ0FDZ0NJQ2dDRUNJSlFSQnFJQUFvQWloQkNDQUlRUU5zUVFGMklnZ2dDRUVJVFJzaUNpQUFLQUlrYkNBSktBSUlFUUVBSWdoRkJFQkJmeUVJREFJTElBQWdDRFlDS0NBQUlBbzJBaXdnQUNnQ01DSUpRUUZxSVFvTElBQWdDallDTUNBSUlBQW9BaVFnQ1d4cUlnZ2dCellDQkNBSUlBWTZBQUFnQ0NBRU5nSU1JQWdnQlRZQ0NDQUlJQU02QUFFZ0NFRVFhaUVFSUFBb0FneEJBWFFoQlVFQUlRQURRQ0FBSUFWR1JRUkFJQVFnQUVFQ2RDSUdhaUFCSUFacUtBSUFOZ0lBSUFCQkFXb2hBQXdCQ3dzZ0JDQUZRUUowYWlFQlFRQWhDRUVBSVFBRFFDQUFJQU5HRFFFZ0FTQUFRUUowSWdScUlBSWdCR29vQWdBMkFnQWdBRUVCYWlFQURBQUxBQXNnQ0F0cEFRUi9JQUVRUHlFREEwQUNRQ0FBTFFBQVJRUkFRWDhoQWd3QkN3TkFBbjhnQUVFc0VLWURJZ1JGQkVBZ0FCQS9EQUVMSUFRZ0FHc0xJZ1VnQTBZRVFDQUFJQUVnQXhCaFJRMENDeUFBSUFWcVFRRnFJUUFnQkEwQUN5QUNRUUZxSVFJTUFRc0xJQUlMVEFFQ2Z3SkFJQUFvQWdRaUF5QUNhaUlFSUFBb0FnaExCSDhnQUNBRUVNWUJEUUVnQUNnQ0JBVWdBd3NnQUNnQ0FDSURhaUFCSUFOcUlBSVFIeG9nQUNBQUtBSUVJQUpxTmdJRUN3dE5BUVIvSUFBb0FnZ2hBeUFBUVFBMkFnZ2dBQ2dDQUNFRUlBQkNBRGNDQUNBQUtBSVFJUVVnQUNnQ0RDRUdJQUFnQXlBRUlBRWdBa0VBRU5zQ0lRQWdCaUFEUVFBZ0JSRUJBQm9nQUFzWEFDQUFJQUZCL3dGeEVCRWdBQ0FDUWYvL0EzRVFLZ3VqR2dFTmZ5TUFRZEFGYXlJRUpBQWdCQ0FDS0FJQUlnVTJBcHdFQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUZMUUFBSWdnRVFDQUlRZHdBUncwR0lBVkJBV29pQnlBQUtBSWNUdzBCSUFRZ0JVRUNhaUlHTmdLY0JBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQVV0QUFFaUNFSFRBR3NPQlFRQkFRRUdBQXNDUUNBSVFlTUFhdzRDQ0FjQUN3SkFJQWhCOHdCckRnVURBUUVCQlFBTElBaEJ4QUJHRFFFZ0NFSFFBRVlnQ0VId0FFWnlEUWdMSUFBb0FpZ2hBUXdOQzBFQklRa01CQXRCQWlFSkRBTUxRUU1oQ1F3Q0MwRUVJUWtNQVF0QkJTRUpDeUFKUVFGMFFReHhRYkNCQW1vb0FnQWlCaThCQUNFRklBQW9Ba0FoQUNBQlFUUTJBaEFnQVNBQU5nSU1RUUFoQXlBQlFRQTJBZ2dnQVVJQU53SUFJQWxCQVhFaEFDQUdRUUpxSVFZZ0JVRUJkQ0VKUVFBaENBSkFBMEFnQ0NBSlJ3UkFJQVlnQ0VFQmRHb3ZBUUFoQnlBQktBSUFJZ1VnQVNnQ0JFNEVRQ0FCSUFWQkFXb1EyUUlOQXlBQktBSUFJUVVnQVNnQ0NDRURDeUFCSUFWQkFXbzJBZ0FnQXlBRlFRSjBhaUFITmdJQUlBaEJBV29oQ0F3QkN3dEJnSUNBZ0FRaENDQUFSUTBMSUFFUTJnSkZEUXNMSUFFb0Fnd2dBU2dDQ0VFQUlBRW9BaEFSQVFBYURBd0xBa0FnQmkwQUFDSUJRZDhCY1VIQkFHdEIvd0Z4UVJwUEJFQWdBQ2dDS0NFR0lBTkZJQUZCM3dCR0lBRkJNR3RCL3dGeFFRcEpja1Z5RFFFZ0JnME1DeUFFSUFWQkEybzJBcHdFSUFGQkgzRWhDQXdLQ3lBR0RRb2dCQ0FITmdLY0JFSGNBQ0VJREFrTElBQW9BaWhGQkVCQkFDRUJEQVlMSUFZdEFBQkIrd0JIRFFJZ0JFSGdCR29oQlFKQUFrQUNRQUpBQWtBRFFBSkFJQVpCQVdvaENTQUdMUUFCSWdNUXJ3TkZEUUFnQlNBRVFlQUVhbXRCUGtzTkFpQUZJQU02QUFBZ0JVRUJhaUVGSUFraEJnd0JDd3NnQlVFQU9nQUFJQVJCb0FScUlRVUNRQ0FKTFFBQUlnTkJQVWNOQUNBR1FRSnFJUWtnQkVHZ0JHb2hCUU5BSUFrdEFBQWlBeEN2QTBVTkFTQUZJQVJCb0FScWEwRS9Ud1JBSUFCQnJlRUFRUUFRT2d3U0JTQUZJQU02QUFBZ0JVRUJhaUVGSUFsQkFXb2hDUXdCQ3dBTEFBc2dCVUVBT2dBQUlBTkIvUUJIQkVBZ0FFSERsQUZCQUJBNkRCQUxRUUVoQXdKQUFrQWdCRUhnQkdwQnlpZEJCeEJoUlEwQUlBUkI0QVJxUWZmN0FFRURFR0ZGRFFCQkFDRURJQVJCNEFScVFiazNRUklRWVVVTkFDQUVLQUxnQkVIenh1RURSdzBCQ3lBQUtBSkFJUVlnQVVFME5nSVFJQUVnQmpZQ0RDQUJRUUEyQWdnZ0FVSUFOd0lBUWVDbkFpQUVRYUFFYWhDdkJDSU1RUUJJQkVBZ0JrRUFRUUFROHdRYUlBQkJzeWRCQUJBNkRCRUxJQUVoQlNBRFJRUkFJQVJCTkRZQ3pBVWdCQ0FHTmdMSUJTQUVRUUEyQXNRRklBUkNBRGNDdkFVZ0JFRTBOZ0s0QlNBRUlBWTJBclFGSUFSQkFEWUNzQVVnQkVJQU53S29CU0FFUWJ3RmFpRUZDeUFNUVFGcUlRNUIwTGtDSVFCQkFDRUhBa0FEUUNBQVFZSE9Ba2tFUUNBSElRc2dBQzBBQUNJR3dDRU5BbjhnQUVFQmFpQUdRZjhBY1NJSFFlQUFTUTBBR2lBQUxRQUJJUW9nQjBIdkFFMEVRQ0FIUVFoMElBcHlRYUMvQVdzaEJ5QUFRUUpxREFFTElBQXRBQUlnQjBFUWRISWdDa0VJZEhKQm9OKy9BMnNoQnlBQVFRTnFDeUVHSUExQkFFNEVRQ0FISUF0cVFRRnFJUWNnQmlFQURBSUxJQVpCQVdvaEFDQUhJQXRxUVFGcUlRY2dEaUFHTFFBQVJ3MEJJQVVnQ3lBSEVINUZEUUVNQWdzTElBTU5DMEdRemdJaEFFRUFJUVlnREVFMlJpRU5JQXhCR0VjaER3TkFJQUJCcjlRQ1NRUkFJQVloQ3lBQUxBQUFJZ1pCL3dGeElRY0NmeUFBUVFGcUlBWkJBRTROQUJvZ0FDMEFBU0VLSUFaQnYzOU5CRUFnQjBFSWRDQUtja0dBL3dGcklRY2dBRUVDYWd3QkN5QUFMUUFDSUFkQkVIUnlJQXBCQ0hSeVFZRC8vZ1ZySVFjZ0FFRURhZ3NpQUVFQmFpRUtJQWNnQzJwQkFXb2hCaUFBTFFBQUlRY0NRQUpBSUExRkJFQkJBQ0VBSUE4TkFRc2dCMFVOQVNBRVFhZ0ZhaUFMSUFZUWZrVU5BUXdFQ3dOQUlBQWdCMFlOQVNBQUlBcHFJUkFnQUVFQmFpRUFJQTRnRUMwQUFFY05BQXNnQkVHb0JXb2dDeUFHRUg0TkF3c2dCeUFLYWlFQURBRUxDeUFNUVRaSElBeEJHRWR4UlFSQUlBUkJxQVZxRU5vQ0RRRWdBU0FGS0FJSUlBVW9BZ0FnQkNnQ3NBVWlBQ0FFS0FLb0JVRUJFTnNDRFFFTUN3c2dBU0FGS0FJSUlBVW9BZ0FnQkNnQ3NBVWlBQ0FFS0FLb0JVRUFFTnNDUlEwS0N5QUVLQUt3QlNFQUlBUW9BclFGSVFFZ0JDZ0N1QVVoQWdOQUlBTU5BQ0FGS0FJTUlBVW9BZ2hCQUNBRktBSVFFUUVBR2lBQklBQkJBQ0FDRVFFQUdnd0FDd0FMQWtBZ0JFSGdCR3BCclIxQkVSQmhCRUFnQkVIZ0JHcEJqdndBUVFNUVlRMEJDeUFBS0FKQUlRTWdBVUUwTmdJUUlBRWdBellDRENBQlFRQTJBZ2dnQVVJQU53SUFJQUVnQkVHZ0JHb1Fwd1lpQTBVTkNpQUJLQUlNSUFFb0FnaEJBQ0FCS0FJUUVRRUFHaUFEUVg1SERRVWdBRUdNSFVFQUVEb01FQXNnQkMwQW9BUU5BQ0FBS0FKQUlRTWdBVUUwTmdJUUlBRWdBellDRENBQlFRQTJBZ2dnQVVJQU53SUFJQUVnQkVIZ0JHb1Fwd1lpQTBGL1JnMERJQU5CQUU0TkNRSkFRZkRaQWlBRVFlQUVhaEN2QkNJRFFRQklEUUFDZndKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRFFTSnJEaE1XQlJVQUJBNE1DdzhOQ2dZSEVBSUJBd2tJRVFzZ0JFS0dnSUNBOEFBM0F3Z2dCRUtBZ0lDQUVEY0RBQ0FCSUFRUWZRd1JDeUFFUW9PQWdJRHdBRGNESUNBRVFvR0FnSUFRTndNWUlBUkNnSUNBZ0lDQUJEY0RFQ0FCSUFSQkVHb1FmUXdRQ3lBRVFVQnJRb09BZ0lEd0FEY0RBQ0FFUW9HQWdJQXdOd000SUFSQ2dJQ0FnTUFBTndNd0lBRWdCRUV3YWhCOURBOExJQVJDZzRDQWdQQUFOd05nSUFSQ2dZQ0FnTUFBTndOWUlBUkNnSUNBZ0NBM0ExQWdBU0FFUWRBQWFoQjlEQTRMSUFSQkJ6WUNrQUVnQkVLRGdJQ0FNRGNEaUFFZ0JFS0RnSUNBRURjRGdBRWdCRUtCZ0lDQXdBQTNBM2dnQkVLQWdJQ0E0QUUzQTNBZ0FTQUVRZkFBYWhCOURBMExJQVJDZzRDQWdQQUFOd1BJQVNBRVFvR0FnSUFnTndQQUFTQUVRb09BZ0lBd053TzRBU0FFUW9PQWdJQVFOd093QVNBRVFvR0FnSURBQURjRHFBRWdCRUtBZ0lDQTRJY0JOd09nQVNBQklBUkJvQUZxRUgwTURBc2dCRUVITmdMb0FTQUVRb09BZ0lEZ0FEY0Q0QUVnQkVLQmdJQ0EwQUEzQTlnQklBUkNnSUNBZ0pDb2dJQS9Od1BRQVNBQklBUkIwQUZxRUgwTUN3c2dCRUtEZ0lDQThBQTNBNEFDSUFSQ2dZQ0FnTkFBTndQNEFTQUVRb0NBZ0lDQUtEY0Q4QUVnQVNBRVFmQUJhaEI5REFvTElBUkNoSUNBZ1BBQU53UElBaUFFUW9PQWdJRGdBRGNEd0FJZ0JFS0JnSUNBc0FFM0E3Z0NJQVJDbm9DQWdEQTNBN0FDSUFSQ25ZQ0FnQkEzQTZnQ0lBUkNnNENBZ0JBM0E2QUNJQVJDZ1lDQWdQQUFOd09ZQWlBRVFvQ0FnSURnaHdFM0E1QUNJQUVnQkVHUUFtb1FmUXdKQ3lBRVFRYzJBcGdESUFSQ2hvQ0FnTUFBTndPUUF5QUVRb3lBZ0lBd053T0lBeUFFUW9PQWdJQVFOd09BQXlBRVFvR0FnSURnQXpjRCtBSWdCRUtCZ0lDQTBBTTNBL0FDSUFSQ2lJQ0FnREEzQStnQ0lBUkNnNENBZ0JBM0ErQUNJQVJDZ1lDQWdQQUFOd1BZQWlBRVFvQ0FnSURnMzhFQU53UFFBaUFCSUFSQjBBSnFFSDBNQ0FzZ0FVRUJFSzBEREFjTElBRkJBaEN0QXd3R0N5QUJRUWNRclFNTUJRc2dCRUtGZ0lDQThBQTNBN0FESUFSQ2dZQ0FnTkFCTndPb0F5QUVRb0tBZ0lBUU53T2dBeUFCSUFSQm9BTnFFSDBNQkFzZ0JFS0ZnSUNBOEFBM0E5QURJQVJDZ1lDQWdPQUJOd1BJQXlBRVFvS0FnSURBQURjRHdBTWdBU0FFUWNBRGFoQjlEQU1MSUFSQ2hZQ0FnUEFBTndQd0F5QUVRb0dBZ0lEd0FUY0Q2QU1nQkVLQ2dJQ0F3QUEzQStBRElBRWdCRUhnQTJvUWZRd0NDeUFFUW9XQWdJRHdBRGNEa0FRZ0JFS0JnSUNBb0FFM0E0Z0VJQVJDZ1lDQWdJQUdOd09BQkNBQklBUkJnQVJxRUgwTUFRc2dBMEVoU3cwQklBRWdBMEVRYWhDbUJndEZEUW9NQkFzZ0FTZ0NEQ0FCS0FJSVFRQWdBU2dDRUJFQkFCb0xJQUJCOWVVQVFRQVFPZ3dPQ3lBQlFRQkJnSURFQUJCK0RRRU1Cd3NnQVVFQVFZQUJFSDVGRFFZTElBRW9BZ3dnQVNnQ0NFRUFJQUVvQWhBUkFRQWFDeUFBRUtnQ0RBb0xRUUFoQ0NBRklBQW9BaHhKRFFZTElBQkJ5L01BUVFBUU9nd0lDeUFBUWFmS0FFRUFFRG9NQndzZ0JTZ0NEQ0FGS0FJSVFRQWdCU2dDRUJFQkFCb2dCQ2dDdEFVZ0FFRUFJQVFvQXJnRkVRRUFHZ3NDUUNBSVFkQUFSdzBBSUFFUTJnSkZEUUFnQVNnQ0RDQUJLQUlJUVFBZ0FTZ0NFQkVCQUJvTUJnc2dCQ0FKUVFGcU5nS2NCRUdBZ0lDQUJDRUlEQU1MSUFRZ0J6WUNuQVFnQkVHY0JHb2dBVUVCZEJENUFTSURRUUJPQkVBZ0F5RUlEQU1MQWtBZ0EwRitSdzBBSUFRb0Fwd0VJZ1V0QUFBaUEwVU5BRUdxa0FFZ0EwRVFFUHNCSUFGRmNnMEJEQVFMSUFFTkF5QUVLQUtjQkNFRkN5QUl3RUVBVGcwQUlBVkJCaUFFUVp3RWFoQllJZ2hCZ0lBRVNRMEJJQUFvQWlnTkFTQUFRWTdJQUVFQUVEb01Bd3NnQkNBRlFRRnFOZ0tjQkFzZ0FpQUVLQUtjQkRZQ0FBd0NDeUFBUWFmT0FFRUFFRG9MUVg4aENBc2dCRUhRQldva0FDQUlDeDhCQVg4Z0FDZ0NQQ0lCUVFCSUJIOGdBQkNxQmhvZ0FDZ0NQQVVnQVFzTGdRTUJCSDhqQUVFUWF5SUVKQUFnQkNBQktBSUFJZ1UyQWd3Z0FrRUJkQ0VHSUFBaEF3Si9BMEFDUUFKQUFrQUNmd0pBQWtBZ0JTMEFBQ0lDUWR3QVJ3UkFJQUpCUGtjTkFTQUFJQU5HRFFZZ0EwRUFPZ0FBSUFFZ0JDZ0NERUVCYWpZQ0FFRUFEQWdMSUFRZ0JVRUJhallDRENBRkxRQUJRZlVBUmcwQkRBVUxJQUxBUVFCT0RRSWdCVUVHSUFSQkRHb1FXQXdCQ3lBRVFReHFJQVlRK1FFTElnSkIvLy9EQUVzTkFnd0JDeUFFSUFWQkFXbzJBZ3dMQWtBZ0FDQURSZ1JBQW44Z0FrSC9BRTBFUUNBQ1FRTjJRZnovLy84QmNVR1FnUUpxS0FJQUlBSjJRUUZ4REFFTElBSVF1UU1MUlEwQ0RBRUxBbjhnQWtIL0FFMEVRQ0FDUVFOMlFmei8vLzhCY1VHZ2dRSnFLQUlBSUFKMlFRRnhEQUVMSUFKQi92Ly9BSEZCak1BQVJpQUNFTklFUVFCSGNndEZEUUVMSUFNZ0FHdEIrUUJLRFFBQ2Z5QUNRZjhBVFFSQUlBTWdBam9BQUNBRFFRRnFEQUVMSUFNZ0FoQ2hBeUFEYWdzaEF5QUVLQUlNSVFVTUFRc0xRWDhMSVFJZ0JFRVFhaVFBSUFJTERRQWdBRUVHUVg5QkJSRC9CUXRnQVFGOElBQXBBZ1JDLy8vLy8vLy8vLzgvV0FSQUlBRWdBU3NEQ0VRQUFBQUFBQUR3UHlBQUtBSUF0eUlDbzZBNUF3Z2dBU0FCS3dNUUlBQW9BZ1FpQUVFZmRTQUFRZi8vLy84SGNTQUFRUjkyZEdwQkVXcTRJQUtqb0RrREVBc0xtZ0VCQkg4Z0FFRVFhaUVGSUFBaEJnSkFBMEFnQWtFQVRBMEJBa0FDUUFKL0lBWXRBQWRCZ0FGeEJFQWdCU0FCUVFGMGFpOEJBQXdCQ3lBQklBVnFMUUFBQ3lJQVFUQnJJZ1JCQ2trTkFDQUFRY0VBYTBFRlRRUkFJQUJCTjJzaEJBd0JDeUFBUWVjQWEwRjZTUTBCSUFCQjF3QnJJUVFMSUFKQkFXc2hBaUFCUVFGcUlRRWdCQ0FEUVFSMGNpRUREQUVMQzBGL0lRTUxJQU1MSmdFQmZ5TUFRUkJySWdJa0FDQUNRUUEyQWd3Z0FFRUZJQUZCQUJDU0JDQUNRUkJxSkFBTHdRRUJBMzhDUUNBQklBSW9BaEFpQXdSL0lBTUZJQUlRemdNTkFTQUNLQUlRQ3lBQ0tBSVVJZ1ZyU3dSQUlBSWdBQ0FCSUFJb0FpUVJBUUFQQ3dKQUlBSW9BbEJCQUVnRVFFRUFJUU1NQVFzZ0FTRUVBMEFnQkNJRFJRUkFRUUFoQXd3Q0N5QUFJQU5CQVdzaUJHb3RBQUJCQ2tjTkFBc2dBaUFBSUFNZ0FpZ0NKQkVCQUNJRUlBTkpEUUVnQUNBRGFpRUFJQUVnQTJzaEFTQUNLQUlVSVFVTElBVWdBQ0FCRUI4YUlBSWdBaWdDRkNBQmFqWUNGQ0FCSUFOcUlRUUxJQVFMaXdFQkEzOGpBRUVRYXlJQUpBQUNRQ0FBUVF4cUlBQkJDR29RQlEwQVFZemVCQ0FBS0FJTVFRSjBRUVJxRUxFQklnRTJBZ0FnQVVVTkFDQUFLQUlJRUxFQklnRUVRRUdNM2dRb0FnQWlBaUFBS0FJTVFRSjBha0VBTmdJQUlBSWdBUkFFUlEwQkMwR00zZ1JCQURZQ0FBc2dBRUVRYWlRQVFZalZCRUhNMVFRMkFnQkJ3TlFFUVNvMkFnQUxWQUFqQUVFUWF5SUNKQUFnQUNBQ1FRaHFJQU1wQXdBUVFnUitRb0NBZ0lEZ0FBVWdBaWtEQ0VLQWdJQ0FnSUNBK1A4QWcwS0FnSUNBZ0lDQStQOEFVcTFDZ0lDQWdCQ0VDeUVCSUFKQkVHb2tBQ0FCQzFRQUl3QkJFR3NpQWlRQUlBQWdBa0VJYWlBREtRTUFFRUlFZmtLQWdJQ0E0QUFGSUFJcEF3aEMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZhdFFvQ0FnSUFRaEFzaEFTQUNRUkJxSkFBZ0FRdFZBUUYvQWtBQ1FBSkFJQUZDSUlpblFRRnFEZ01BQVFJQkN5QUJweUlDTHdFR1FRWkhEUUFnQWlrRElDSUJRb0NBZ0lCd2cwS0FnSUNBRUZFTkFRc2dBRUhrMFFCQkFCQVZRb0NBZ0lEZ0FDRUJDeUFCQzI0QkJYOUI2QUloQVFOQUlBRWdBazRFUUNBQUlBRWdBbXBCQVhZaUEwRUNkRUdRZ2dKcUtBSUFJZ1JCRDNZaUJVa0VRQ0FEUVFGcklRRU1BZ3NnQUNBRVFRaDJRZjhBY1NBRmFra0VRRUVCRHdVZ0EwRUJhaUVDREFJTEFBc0xJQUJCc0pFQ1FlQ1NBa0VHRUt3REN4RUFJQUJCZ0pNQ1FjQ1lBa0VXRUt3REMwWUJBWDhDUUNBQUtBSUlJQUpxSWdNZ0FDZ0NERW9FUUNBQUlBTWdBUkMzQWcwQkN3TkFJQUpCQUV3RVFFRUFEd3NnQWtFQmF5RUNJQUFnQVJDTEFVVU5BQXNMUVg4TG1BRUNCWDhCZmlBQktRSUVJZ2luUWYvLy8vOEhjU0lFUlFSQUlBSVBDeUFBS0FJRUlRTUNmeUFJUW9DQWdJQUlnMUJGQkVBZ0FTOEJFQXdCQ3lBQkxRQVFDeUVHSUFOQi8vLy8vd2R4SVFVZ0JFRUJheUVIQWtBRFFDQUNJQVJxSUFWS0RRRWdBQ0FHSUFJUXh3RWlBMEVBU0NBRElBUnFJQVZLY2cwQklBQWdBU0FEUVFGcUlnSkJBU0FIRUxNRERRQUxJQU1QQzBGL0M1WUNBUVIvSUFBb0FoQWhCaUFCS0FJQUlnVXRBQkFFZnlBR0lBVVFrQVFnQlNnQ0ZDQURha0dCZ056eGVXd2dCR3BCZ1lEYzhYbHNCVUVBQ3lFSEFuOGdCU2dDSUNJSUlBVW9BaHhPQkVBZ0FDQUJJQUlnQ0VFQmFoQzhCUVJBUVg4Z0JTMEFFRVVOQWhvZ0JpQUZFSlFEUVg4UEN5QUJLQUlBSVFVTElBVXRBQkFFUUNBRklBYzJBaFFnQmlBRkVKUURDeUFGSUFVb0FpQWlBVUVCYWpZQ0lDQUZJQUZCQTNScUlnRWdBQ0FERUJnaUFEWUNOQ0FCSUFFb0FqQkIvLy8vSDNFZ0JFRWFkSEkyQWpBZ0JTQUZMUUFSSUFCQkgzWnlPZ0FSSUFFZ0FTZ0NNRUdBZ0lCZ2NTQUZJQUFnQlNnQ0dIRkJmM05CQW5ScUlnQW9BZ0JCLy8vL0gzRnlOZ0l3SUFBZ0JTZ0NJRFlDQUVFQUN3dW5BUUlDZndGK0FrQUNRQ0FBSUFFUTBBTWlBMEVBU0EwQUlBTkZEUUZCbFRBaEFpQUFJQUFnQVVIdEFDQUJRUUFRRkNJRVFvQ0FnSUJ3Z3lJQlFvQ0FnSUFnVVNBQlFvQ0FnSUF3VVhJRWYwR1ZNQVVnQVVLQWdJQ0E0QUJSRFFFZ0FDQUVFRGNpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCUVFBaEFpQUJwMEhuQUVFQUVNY0JJUU1nQUNBQkVBOGdBMEVBVGcwQ1FZdmRBQXRCQUJBVkMwRi9JUUlMSUFJTHFRTUJDMzhDUUNBQUtBSVFJZ1FvQXRBQlFRRjBRUUpxSUFRb0Fzd0JUQTBBSUFSQkVHb2lDVUVFSUFRb0FzZ0JJZ05CQVdvaUNIUWlCU0FFS0FJQUVRTUFJZ2RGRFFCQkFTQUlkQ0VLSUFkQkFDQUZFQ3NoQnlBRUtBTE1BU0lGUVFBZ0JVRUFTaHNoQzBFZklBTnJJUXdEUUNBRUtBTFVBU0VESUFZZ0MwWkZCRUFnQXlBR1FRSjBhaWdDQUNFREEwQWdBd1JBSUFNb0FpZ2hCU0FESUFjZ0F5Z0NGQ0FNZGtFQ2RHb2lEU2dDQURZQ0tDQU5JQU0yQWdBZ0JTRUREQUVMQ3lBR1FRRnFJUVlNQVFzTElBa2dBeUFFS0FJRUVRQUFJQVFnQnpZQzFBRWdCQ0FLTmdMTUFTQUVJQWcyQXNnQkN5QUFJQUpCQTNSQlFHc1FLU0lEUlFSQVFRQVBDeUFEUVFJNkFCUWdBMEVCTmdJUUlBUW9BbEFpQlNBRFFSaHFJZ1kyQWdRZ0F5QUVRZEFBYWpZQ0hDQURJQVUyQWhnZ0JDQUdOZ0pRSUFFRVFDQUJJQUVvQWdCQkFXbzJBZ0FMSUFOQ0FEY0NBQ0FESUFFMkFqd2dBMElBTndJd0lBTWdBallDTENBRFFRTTJBaWdnQTBFQk93RWdJQU5DQURjQ0NDQURJQUZCZ1lEYzhYbHNRZi8vbzQ0R2F6WUNKQ0FBS0FJUUlBTkJFR29pQUJDVUF5QUFDNDRFQVFKK0l3QkJJR3NpQWlRQUlBTXBBd0FoQlFKQUFrQUNRQ0FFQkVBZ0JVTC8vLy8vYjFnRVFDQUFFQ1FNQXdzZ0JhY2lCQ0FFS0FJQVFRRnFOZ0lBREFFTElBQWdCUkFsSWdVaEFTQUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSUxBa0FnQUNBREtRTUlFREVpQTBVTkFFS0FnSUNBTUNFQkFrQUNRQ0FGUW9DQWdJQndWQTBBSUFBZ0FpQUZweUFERUV3aUJFRUFTQTBDSUFSRkRRQWdBQkEwSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVFKQUlBSXRBQUJCRUhFRVFDQUNLUU1RSWdaQ0lJaW5RWFZQQkVBZ0JxY2lCQ0FFS0FJQVFRRnFOZ0lBQ3lBQUlBRkJ3UUFnQmtHSGdBRVFHVUVBU0EwRElBSXBBeGdpQmtJZ2lLZEJkVThFUUNBR3B5SUVJQVFvQWdCQkFXbzJBZ0FMSUFBZ0FVSENBQ0FHUVllQUFSQVpRUUJPRFFFTUF3c2dBaWtEQ0NJR1FpQ0lwMEYxVHdSQUlBYW5JZ1FnQkNnQ0FFRUJhallDQUFzZ0FDQUJRY0FBSUFaQmg0QUJFQmxCQUVnTkFpQUFJQUZCUGlBQ05RSUFRZ0dJUWdHRFFvQ0FnSUFRaEVHSGdBRVFHVUVBU0EwQ0N5QUFJQUZCUHlBQ05RSUFRZ0tJUWdHRFFvQ0FnSUFRaEVHSGdBRVFHVUVBU0EwQklBQWdBVUU5SUFJMUFnQkNBWU5DZ0lDQWdCQ0VRWWVBQVJBWlFRQklEUUVnQUNBQ0VFZ0xJQUFnQXhBVElBQWdCUkFQREFNTElBQWdBaEJJSUFBZ0FSQVBDeUFBSUFNUUV5QUFJQVVRRHd0Q2dJQ0FnT0FBSVFFTElBSkJJR29rQUNBQkMxVUJBWDhqQUVFZ2F5SUZKQUFDUUNBQUlBVWdBeEQ3QkVFQVNBUkFRWDhoQkF3QkN5QUFJQUVnQWlBRktRTUlJQVVwQXhBZ0JTa0RHQ0FGS0FJQUlBUnlFRzBoQkNBQUlBVVFTQXNnQlVFZ2FpUUFJQVFMZ2dJREJIOEJmZ0o4SXdCQjRBQnJJZ1lrQUVLQWdJQ0E0QUFoQ1FKQUlBQWdBU0FHUVJCcUlBUkJEM0VpQ0NBRVFRaDJRUTl4SWdkRkVMY0RJZ1ZCQUVnTkFFUUFBQUFBQUFENGZ5RUtBa0FnQlVVZ0FrRUFUSElOQUVFQUlRVWdCRUVFZGtFUGNTQUhheUlFSUFJZ0FpQUVTaHNpQWtFQUlBSkJBRW9iSVFJRFFDQUNJQVZIQkVBZ0FDQUdRUWhxSUFNZ0JVRURkR29wQXdBUVFnMERJQVlyQXdnaUM3MUNnSUNBZ0lDQWdQai9BSU5DZ0lDQWdJQ0FnUGovQUZFTkFpQUdRUkJxSUFVZ0IycEJBM1JxSUF1ZE9RTUFJQVZCQVdvaEJRd0JDd3NnQmtFUWFpQUlFT0FDSVFvTElBQWdBU0FLRU1rRUlRa0xJQVpCNEFCcUpBQWdDUXZIQVFFQmZ3SkFBa0FnQVVLQWdJQ0FjRlFOQUNBQnB5SURMd0VHUVFwSERRQWdBQ0FES1FNZ0VBOGdBd0orSUFLOUlnRUNmeUFDbVVRQUFBQUFBQURnUVdNRVFDQUNxZ3dCQzBHQWdJQ0FlQXNpQUxlOVVRUkFJQUN0REFFTFFvQ0FnSURBZmlBQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeUlCTndNZ0lBRkNJSWluUVhWSkRRRWdBYWNpQUNBQUtBSUFRUUZxTmdJQUlBRVBDeUFBUWEweFFRQVFGVUtBZ0lDQTRBQWhBUXNnQVFzcEFRRitJQUFnQVJDcUFTSUJSUVJBUW9DQWdJRGdBQThMSUFBZ0FSQXRJUUlnQUNBQkVCTWdBZ3NoQUNBQVFwQURnVkN0UXU0Q1F1MENJQUJDQTROUUd5QUFRdVFBZ1ZDdGZYd0xXUUVCZmlBQVF1MENmaUFBUXJFUGZVSUNoM3dnQUVMdERuMGlBU0FCUXVRQWdTSUJmU0FCUWorSFFweC9nM3hDbkg5L2ZDQUFRc0VNZlNJQUlBQkNrQU9CSWdCOUlBQkNQNGRDOEh5RGZFS1FBMzk4UXNyeEszMEx4UUVDQ0g4QmZpQUFJQUVRbkFKQmZ5RUVBa0FnQVNnQ0FDSUhRUU5xSWdnZ0FDa0NCQ0lMcDBILy8vLy9CM0ZLRFFBZ0FFRVFhaUVGSUF0Q2dJQ0FnQWlESVFzRFFDQURRUXhHRFFFZ0EwRURiQ0VKUVFBaEFBSkFBMEFnQUVFRFJnMEJJQUFnQjJvaEJpQUFJQWxxSVFvZ0FFRUJhaUVBQW44Z0MxQkZCRUFnQlNBR1FRRjBhaThCQUF3QkN5QUZJQVpxTFFBQUN5QUtRZURSQVdvc0FBQkdEUUFMSUFOQkFXb2hBd3dCQ3dzZ0FpQURyVGNEQUNBQklBZzJBZ0JCQUNFRUN5QUVDN1FCQWdSL0FYNGpBRUVRYXlJREpBQWdBeUFCS0FJQUlnUTJBZ3hCZnlFR0lBQXBBZ1FpQjZkQi8vLy8vd2R4SUFSS0JFQWdBRUVRYWlFRkFrQUNRQUovSUFkQ2dJQ0FnQWlEVUVVRVFDQUZJQVJCQVhScUx3RUFEQUVMSUFRZ0JXb3RBQUFMSWdWQksyc09Bd0FCQUFFTElBTWdCRUVCYWpZQ0RBc2dBQ0FEUVF4cUlBSVFuUUlpQmlBRlFTMUhja1VFUUNBQ1FnQWdBaWtEQUgwM0F3QUxJQUVnQXlnQ0REWUNBQXNnQTBFUWFpUUFJQVlMOFFrREFYd0xmd0YrSXdCQjBBSnJJZ0lrQUVLQWdJQ0E0QUFoRVFKQUlBQWdBU0FDUWNBQmFpQUVRUVIySWdOQkFYRkJBQkMzQXlJR1FRQklEUUFnQTBFUGNTRU5JQVpGQkVBZ0RVRUNSZ1JBSUFCQjg0SUJRUUFRVUF3Q0N5QUFRZDNpQUJCaUlSRU1BUXNDZnlBQ0t3T0FBaUlGbVVRQUFBQUFBQURnUVdNRVFDQUZxZ3dCQzBHQWdJQ0FlQXNoRGdKL0lBSXJBL2dCSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Q3lFUEFuOGdBaXNEOEFFaUJabEVBQUFBQUFBQTRFRmpCRUFnQmFvTUFRdEJnSUNBZ0hnTElSQUNmeUFDS3dQb0FTSUZtVVFBQUFBQUFBRGdRV01FUUNBRnFnd0JDMEdBZ0lDQWVBc2hDUUovSUFJckErQUJJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDeUVLQW44Z0Fpc0QyQUVpQlpsRUFBQUFBQUFBNEVGakJFQWdCYW9NQVF0QmdJQ0FnSGdMSVFjQ2Z5QUNLd1BRQVNJRm1VUUFBQUFBQUFEZ1FXTUVRQ0FGcWd3QkMwR0FnSUNBZUFzaEN3Si9JQUlyQThnQklnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEN5RU1JQVJCQVhFaENBSi9JQUlyQThBQklnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEN5RUdRUUFoQXdKQUlBaEZEUUFnQkVFUGNTRUlBa0FDUUFKQUFrQWdEUTRFQUFFQ0F3UUxJQUlnQmpZQ1lDQUNJQXMyQWxRZ0FpQUdRUjkyUVFSeU5nSmNJQUlnREVFRGJFSGcwUUZxTmdKWUlBSWdEMEVEYkVIQTBRRnFOZ0pRSUFKQmtBSnFRY0FBUWR1WkFTQUNRZEFBYWhCT0lRTU1Bd3NnQWlBR05nS0FBU0FDSUFzMkFuZ2dBaUFHUVI5MlFRUnlOZ0o4SUFJZ0RFRURiRUhnMFFGcU5nSjBJQUlnRDBFRGJFSEEwUUZxTmdKd0lBSkJrQUpxUWNBQVFjWDdBQ0FDUWZBQWFoQk9JUU1nQ0VFRFJ3MENJQUpCa0FKcUlBTnFRU0E2QUFBZ0EwRUJhaUVEREFJTElBSWdCallDb0FFZ0FrR1FBbW9pQ0VIQUFFR28rd0JCb3ZzQUlBWkJrTTRBU1JzZ0FrR2dBV29RVGlFRElBSWdDellDbEFFZ0FpQU1RUUZxTmdLUUFTQURJQWhxUWNBQUlBTnJRWldCQVNBQ1FaQUJhaEJPSUFOcUlRTU1BUXNnQWlBTE5nSzBBU0FDSUF4QkFXbzJBckFCSUFJZ0JqWUN2QUVnQWlBR1FSOTJRUVJ5TmdLNEFTQUNRWkFDYWtIQUFFRzIrd0FnQWtHd0FXb1FUaUVESUFoQkEwY05BQ0FDUVpBQ2FpQURha0dzd0FBN0FBQWdBMEVDYWlFREN3SkFJQVJCQW5GRkRRQUNRQUpBQWtBQ1FDQU5EZ1FBQVFJREJBc2dBaUFKTmdJSUlBSWdDallDQkNBQ0lBYzJBZ0FnQWtHUUFtb2dBMnBCd0FBZ0EydEIxNEVCSUFJUVRpQURhaUVEREFNTElBSWdDVFlDS0NBQ0lBbzJBaVFnQWlBSE5nSWdJQUpCa0FKcUlnY2dBMnBCd0FBZ0EydEIxNEVCSUFKQklHb1FUaUFEYWlJRElBZHFRUzFCS3lBT1FRQklHem9BQUNBQ0lBNGdEa0VmZFNJRWN5QUVheUlFUVR4dUlnWTJBaEFnQWlBR1FVUnNJQVJxTmdJVUlBY2dBMEVCYWlJRWFrRS9JQU5yUWEzN0FDQUNRUkJxRUU0Z0JHb2hBd3dDQ3lBQ0lCQTJBandnQWlBSk5nSTRJQUlnQ2pZQ05DQUNJQWMyQWpBZ0FrR1FBbW9nQTJwQndBQWdBMnRCb0lBQklBSkJNR29RVGlBRGFpRUREQUVMSUFJZ0NUWUNTQ0FDSUFvMkFrUWdBa0hCQUVIUUFDQUhRUXhJR3pZQ1RDQUNJQWRCQVdwQkRHOUJBV3MyQWtBZ0FrR1FBbW9nQTJwQndBQWdBMnRCbUlNQklBSkJRR3NRVGlBRGFpRURDeUFBSUFKQmtBSnFJQU1Ra3dJaEVRc2dBa0hRQW1va0FDQVJDemNDQW44QmZpTUFRUkJySWdBa0FDQUFFS01FSUFBcEF3QWhBaUFBS0FJSUlRRWdBRUVRYWlRQUlBRkI2QWR0ckNBQ1F1Z0hmbndMbEF3REMzOERmZ0Y4SXdCQm9BRnJJZ1FrQUNBRVFlQUFha0VBUVRnUUt4b2dCRUlCTndOd0lBUkNBVGNEYUVLQWdJQ0E0QUFoQVNBQUlBTXBBd0FRS0NJUlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0JFRUFOZ0lNSUJHbklnVXBBZ1FpRDBLQWdJQ0FDSU1oRUFKQUFrQUNRQUpBSUE5Qy8vLy8vd2VEVUEwQUlBVkJFR29oQndKQUFuOGdFRkFpREVVRVFDQUhMd0VBREFFTElBY3RBQUFMSWdOQk1HdEJDa2tOQUNBRFFTdHJEZ01BQVFBQkMwS0FnSUNBd0g0aEFTQUZJQVJCREdvZ0JFSGdBR29RemdRTkF5QVBwMEgvLy8vL0IzRWhCa0VCSVFrRFFBSkFBa0FDUUNBSlFRZEdJQVFvQWd3aUF5QUdUbklOQUNBSlFRSjBRZGovQVdvb0FnQWhBZ0ovSUF4RkJFQWdCeUFEUVFGMGFpOEJBQXdCQ3lBRElBZHFMUUFBQ3lBQ1J3MEFJQVFnQTBFQmFpSUlOZ0lNSUFsQkJrY05BU0FHSUFoTURRZEI2QWNoQWtFQUlRc2dDQ0VEQTBBQ1FBSkFJQU1nQmtZRVFDQUdJUU1NQVFzQ2Z5QU1SUVJBSUFjZ0EwRUJkR292QVFBTUFRc2dBeUFIYWkwQUFBc2lDa0V3YXlJTlFRcEpEUUVnQXlBSVJnMEtDeUFFSUFNMkFnd2dCQ0FMckRjRGtBRU1CQXNnQWtFQlJpRU9JQTBnQWtFS2JTSUNiQ0FMYWlBT0lBcEJORXR4YWlFTElBTkJBV29oQXd3QUN3QUxJQVFnQkNrRGFFSUJmVGNEYUNBRElBWk9CRUFnQ1VFRFN5RUtEQVVMQW44Q1FBSkFBbjhnREVVRVFDQUhJQU5CQVhScUx3RUFEQUVMSUFNZ0Iyb3RBQUFMSWdKQksyc09Bd0VKQVFBTElBSkIyZ0JIRFFoQ0FDRVBJQU5CQVdvTUFRc2dCQ0FEUVFGcUlnTTJBZ3dnQmlBRGF5SURRUVpyUVg1SkRRY2dCU0FFUVF4cUlBUkJHR29RM3dJTkJ5QURRUVZHQkVBZ0JDZ0NEQ0VEQW44Z0RFVUVRQ0FISUFOQkFYUnFMd0VBREFFTElBTWdCMm90QUFBTFFUcEhEUWdnQkNBRFFRRnFOZ0lNQ3lBRklBUkJER29nQkVFUWFoRGZBZzBIUWdBZ0JDa0RFQ0FFS1FNWVFqeCtmQ0lQZlNBUElBSkJMVVliSVE4Z0JDZ0NEQXNoQTBFQUlRb2dBeUFHUmcwRkRBWUxJQVVnQkVFTWFpQUVRZUFBYWlBSlFRTjBhaENkQWcwRkN5QUpRUUZxSVFrTUFBc0FDeUFGUVJCcUlRZ2dENmRCLy8vLy93ZHhJUVpCQUNFQ0EwQUNRQ0FHSUFJaUEwWUVRQ0FHSVFNTUFRc2dBMEVCYWlFQ0FuOGdFRkJGQkVBZ0NDQURRUUYwYWk4QkFBd0JDeUFESUFocUxRQUFDMEVnUncwQkN3c2dCQ0FETmdJTUlBVWdCRUVNYWhDY0FrS0FnSUNBd0g0aEFTQUVLQUlNSWdJZ0JrNE5BaUFFUWZBQWFpRUtJQVJCNEFCcVFRaHlJUWNDUUFKL0lCQlFJZ2xGQkVBZ0NDQUNRUUYwYWk4QkFBd0JDeUFDSUFocUxRQUFDMEV3YTBFSlRRUkFJQVVnQkVFTWFpQUtFSjBDRFFRZ0JTQUVRUXhxSUFjUXpRUkZEUUVNQkFzZ0JTQUVRUXhxSUFjUXpRUU5BeUFGSUFSQkRHb2lBaENjQWlBRklBSWdDaENkQWcwREN5QUZJQVJCREdvaUFoQ2NBaUFGSUFJZ0JFSGdBR29RemdRTkFpQUZJQVJCREdvUW5BSkJBQ0VEQTBBZ0EwRURSZ1JBSUFRb0Fnd2lBeUFHSUFNZ0Jrb2JJUUlEUUVFQUlRb2dBaUFEUmcwREFrQUNRQUovSUFsRkJFQWdDQ0FEUVFGMGFpOEJBQXdCQ3lBRElBaHFMUUFBQ3lJTFFTdHJEZ01BQVFBQkN5QUVJQU5CQVdvMkFnd2dCU0FFUVF4cUlBUkJHR29RM3dJTkJpQUZJQVJCREdvZ0JFRVFhaERmQWcwR1FnQWdCQ2tERUNBRUtRTVlRangrZkNJQmZTQUJJQXRCTFVZYklROE1CUXNnQTBFQmFpRUREQUFMQUFzZ0EwRUJhMEVCVFFSQUlBUW9BZ3dpQWlBR1RnMEVBbjhnQ1VVRVFDQUlJQUpCQVhScUx3RUFEQUVMSUFJZ0NHb3RBQUFMUVRwSERRUWdCQ0FDUVFGcU5nSU1DeUFEUVFOMElRSWdBMEVCYWlFRElBVWdCRUVNYWlBQ0lBUnFRZmdBYWhDZEFrVU5BQXNNQWd0Q0FDRVBDMEVBSVFNRFFDQURRUWRHUlFSQUlBTkJBM1FpQWlBRVFTQnFhaUFFUWVBQWFpQUNhaWtEQUxrNUF3QWdBMEVCYWlFRERBRUxDeUFFUVNCcUlBb1E0QUlnRDBMZzFBTit1YUVpRXIwaUFRSi9JQktaUkFBQUFBQUFBT0JCWXdSQUlCS3FEQUVMUVlDQWdJQjRDeUlEdDcxUkJFQWdBNjBoQVF3QkMwS0FnSUNBd0g0Z0FVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeUVCQ3lBQUlCRVFEd3NnQkVHZ0FXb2tBQ0FCQ3lJQkFYOUJBU0VCSUFBUXVRTUVmMEVCQlNBQVFhQ2lBa0dncHdKQkZCQ3NBd3NMZlFFQ2Z5TUFRUkJySWdFa0FDQUJRUW82QUE4Q1FBSkFJQUFvQWhBaUFnUi9JQUlGSUFBUXpnTU5BaUFBS0FJUUN5QUFLQUlVSWdKR0RRQWdBQ2dDVUVFS1JnMEFJQUFnQWtFQmFqWUNGQ0FDUVFvNkFBQU1BUXNnQUNBQlFROXFRUUVnQUNnQ0pCRUJBRUVCUncwQUlBRXRBQThhQ3lBQlFSQnFKQUFMbXdFQkJIOGpBRUVRYXlJREpBQWdBYWNpQkNnQ0VDSUNRVEJxSVFVZ0FpQUNLQUlZUVg5elFRSjBRYngrY21vb0FnQWhBZ0pBQWtBRFFDQUNSUTBCSUFKQkEzUWdCV3BCQ0dzaUFpZ0NCRUV3UndSQUlBSW9BZ0JCLy8vL0gzRWhBZ3dCQ3dzZ0F5QUNOZ0lNSUFBZ0JDQURRUXhxSUFJb0FnQkJHblpCUEhFUWtRTU5BUXNnQkNBRUxRQUZRZjRCY1RvQUJRc2dBMEVRYWlRQUM3Y0ZBZ1ovQTM0akFFRXdheUlFSkFBZ0FDZ0NBQ0VGUW9DQWdJQXdJUXRDZ0lDQWdEQWhDZ0pBSUFFRVFFRi9JUU1nQlJBK0lncENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQXBCQUJDMEFTRUdJQVVnQ2hBUElBWU5BU0FGRUQ0aUMwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBVWdDa0h3QUNBTFFZQ0FBUkFaUVFCSURRRUxJQUJCRUdvaEJrRUFJUU1DUUFKQUEwQWdCaWdDQUVHQ2YwWUVRQ0FBS0FJWUlRY2dCQ0FHS1FNWU53TW9JQVFnQmlrREVEY0RJQ0FFSUFZcEF3ZzNBeGdnQkNBR0tRTUFOd01RSUFkQkFXb2hCeUFBS1FNZ0lRa0NRQUpBQWtBZ0FRUkFJQWxDSUlpblFYVlBCRUFnQ2FjaUNDQUlLQUlBUVFGcU5nSUFDeUFGSUFzZ0F5QUpRWVNBQVJDdkFVRUFTQTBDSUFVZ0NpQURBbjRnQUVIZ0FFRUFJQWNnQkVFUWFpQUVRUXhxRVBNQ1JRUkFJQVFwQXlBTUFRc2dCRUtBZ0lDQU1EY0RJRUtBZ0lDQU1BdEJoSUFCRUs4QlFRQklEUUlnQUNnQ0tFSGdBRWNOQVNBRklBc1ExQVFnQlNBS0VOUUVJQUlnQTBFQmFqWUNBQXdIQ3lBRklBa1FEeUFBUW9DQWdJQXdOd01nSUFCQjRBQkJBU0FISUFSQkVHb2dCRUVNYWhEekFnMEJBa0FnQkNrRElDSUpweWdDQkVILy8vLy9CM0ZCQVNBREd3UkFJQUFnQ1VFQkVMUUJJUWNnQUNnQ0FDQUpFQThnQncwRElBTkZCRUFnQUNnQ0tFSGdBRVlOQ1NBQVFjSUFFQkFnQUVIY0FCQWFDeUFEUVFGcUlRTU1BUXNnQUNnQ0FDQUpFQThMSUFBb0FpaEI0QUJHRFFVTElBQVFFZzBBSUFBUWtRRU5BQ0FHS0FJQVFmMEFSd1JBSUFCQnJzOEFRUUFRRmd3QkN5QUFJQVlRL3dFZ0FFRUFOZ0l3SUFBZ0FDZ0NGRFlDQkNBQUlBQW9BamdRendORkRRRUxRWDhoQXd3RkN5QURRUUZxSVFNTUFRc0xJQUJCZ244UUxDRUREQUlMSUFCQkpCQVFJQUJCUUdzb0FnQWdBMEVCYTBILy93TnhFQmNMSUFBUUVpRURDeUFFUVRCcUpBQWdBd3VBQVFFQ2Z5QUFRU1lRRUNBQVFVQnJJZ0lvQWdCQkFCQVhJQUJCQVJBUUlBSW9BZ0JCQUJBNUlBQWdBaWdDQUJBeUlnTVFIaUFBUVlBQkVCQWdBaWdDQUNBQlFRSnFRZjhCY1JCa0lBQkI2Z0JCZnhBY0lRRWdBRUhSQUJBUUlBQkJqd0VRRUNBQVFlc0FJQU1RSEJvZ0FDQUJFQjRnQUVFT0VCQWdBRUVPRUJBTG5RRUJCWDhnQUNnQ1FDSUVLQUtJQVNJRFFRQWdBMEVBU2hzaEF3SkFBMEFDUUNBQ0lBTkdCRUJCQUNFRElBUW9BbndpQWtFQUlBSkJBRW9iSVFWQkFDRUNBMEFnQWlBRlJnMEVJQUpCQkhRaEJpQUNRUUZxSVFJZ0JpQUVLQUowYWlnQ0FDQUJSdzBBQ3d3QkN5QUNRUVIwSVFVZ0FrRUJhaUVDSUFVZ0JDZ0NnQUZxS0FJQUlBRkhEUUVMQ3lBQVFjMGtRUUFRRmtGL0lRTUxJQU1MaGdVQ0NIOEJmaU1BUVVCcUlnRWtBQ0FBS0FJNElRSkJmeUVJQWtBZ0FDZ0NBQ0FCUVNocVFTQVFQUTBBQWtBZ0FDZ0NBQ0FCUVJCcVFRRVFQUTBBSUFKQkFXb2hBMEVBSVFJQ1FBTkFJQU1pQlNBQUtBSThUdzBCSUFJaEJrRUJJUUlnQlVFQmFpRURBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUZMUUFBSWdSQjJ3QnJEZ01HQXdFQUN5QUVRUzlIQkVBZ0JFRUthdzRFQndJQ0J3SUxRUzhoQkNBR0RRVURRQ0FCSUFOQkFXbzJBZ3dDUUNBRExBQUFJZ0pCQUU0RVFDQUNRZjhCY1NFQ0RBRUxJQU5CQmlBQlFReHFFRmdpQWtHQWdNUUFUdzBHQ3lBQ0VNVUJCRUFnQVVFUWFpQUNFTGtCRFFzZ0FTZ0NEQ0VEREFFTEN5QUFRWVIvTmdJUUlBQWdBVUVvYWhBMk53TWdJQUZCRUdvUU5pRUpJQUFnQXpZQ09DQUFJQWszQXloQkFDRUlEQW9MUWQwQUlRUkJBQ0VDREFRTElBVEFRUUJPRFFFZ0JVRUdJQUZCQ0dvUVdDSUVRWUNBeEFCUERRSWdCRUYrY1VHb3dBQkdEUVFnQVNnQ0NDRUREQUVMSUFGQktHcEIzQUFRT3cwR0lBVkJBbW9oQndKQUlBVXRBQUVpQkFSQUlBUkJDbXNPQkFVQkFRVUJDMEVBSVFRZ0JpRUNJQWNpQXlBQUtBSThUdzBHREFNTElBVEFRUUJPQkVBZ0JpRUNJQWNoQXd3REMwRUhRUVpCQUNBRFFRWWdBVUVNYWhCWUlnUkJmbkZCcU1BQVJoc2dCRUgvLzhNQVN5SUNHeUlEUlFSQUlBY2dBU2dDRENBQ0d5RUREQUVMSUFOQkJtc09BZ01CQndzZ0JpRUNEQUVMSUFCQnRQQUFRUUFRRmd3RUN5QUJRU2hxSUFRUXVRRkZEUUVNQXdzTElBQkIrTWdBUVFBUUZnd0JDeUFBUVozSkFFRUFFQllMSUFFb0FpZ29BaEFpQUVFUWFpQUJLQUlzSUFBb0FnUVJBQUFnQVNnQ0VDZ0NFQ0lBUVJCcUlBRW9BaFFnQUNnQ0JCRUFBQXNnQVVGQWF5UUFJQWdMVVFFQ2YwRi9JUUpCQVNFREEwQUNRQ0FBSUFFUXRnRU5BQ0FEUlFSQUlBQW9Ba0JCZnpZQ21BSUxJQUFvQWhCQkxFY0VRRUVBSVFJTUFRc2dBQkFTRFFBZ0FFRU9FQkJCQUNFRERBRUxDeUFDQ3pNQkFYOERRQUpBSUFGQkFFNEVmeUFCSUFKSERRRkJBUVZCQUFzUEN5QUFLQUxNQVNBQlFRTjBhaWdDQUNFQkRBQUxBQXVFQXdFR2Z5QUJLQUk0SVFNQ1FBSkFBa0FnQVMwQWJrRUJjUVJBSUFORkJFQkI4c0lBSVFNZ0FTZ0NRQTBEQzBHQzdnQWhBeUFDUVRwR0lBSkJ6UUJHY2cwQ1FRQWhBaUFCS0FLSUFTSURRUUFnQTBFQVNoc2hCQU5BSUFJZ0JFWU5Ba0hkN1FBaEF5QUJLQUtBQVNBQ1FRUjBhaWdDQUNJR1FUcEdJQVpCelFCR2NnMERJQUpCQVdvaEFnd0FDd0FMSUFORkRRQWdBUzhCYkNJQ1FZSU1SZzBBSUFKQkNIWkJBMnNPQkFBQ0FnQUNDMEVBSVFRZ0FTZ0NpQUVpQWtFQUlBSkJBRW9iSVFoQkFDRURBMEFnQXlBSVJnMENRUUFoQWdKQUlBRW9Bb0FCSWdVZ0EwRUVkR29vQWdBaUJrVU5BQU5BQWtBZ0FpQURSZ1JBUVFBaEFpQUJLQUo4SWdWQkFDQUZRUUJLR3lFRkEwQWdBaUFGUmcwRUlBWWdBU2dDZENBQ1FRUjBhaUlIS0FJQVJnUkFJQWNvQWdSRkRRTUxJQUpCQVdvaEFnd0FDd0FMSUFKQkJIUWhCeUFDUVFGcUlRSWdCU0FIYWlnQ0FDQUdSdzBCQ3d0Qm1DUWhBd3dDQ3lBRFFRRnFJUU1NQUFzQUN5QUFJQU5CQUJBV1FYOGhCQXNnQkF0YUFRSi9JQUJCUUdzaUF5QUJLQUlBTmdJQUlBQkJLUkFRSUFNZ0F5Z0NBQ2dDQkNJQ05nSUFJQUFvQWdBZ0FrS0FnSUNBSUJDK0F5RUNJQUVvQWdBZ0FqWUNDQ0FBUVFNUUVDQURLQUlBSUFJUU9TQUFRZEFBRUJBTFJ3RUJmd0ovUVFBZ0FTZ0NDQTBBR2lBQktBSUFJZ0lFZnlBQ0JVRi9JQUFnQVJEZUJBMEJHaUFCS0FJQUN5Z0NnQUlnQVNnQ0RHcEJDam9BQUNBQlFRRTJBZ2hCQUFzTDNBRUJBbjhnQUNnQ0FDQUFRVUJySWdNb0FnQkJBRUVBSUFBb0FneEJBQkRvQXlJQ1JRUkFJQUZCQURZQ0FFRi9Ed3NnQWtFQU5nSndJQUpCQURZQ1lDQUNRb0NBZ0lBUU53SklJQUpDQVRjQ01DQUNRWUFNT3dGc0lBSkNBVGNDV0NBQ1FnRTNBbEFnQVNBQ05nSUFJQU1nQWpZQ0FDQUFRUWtRRUNBQklBRW9BZ0FvQXBnQ05nSU1JQUJCNlFCQmZ4QWNJUUVnQUVHNEFSQVFJQUJCQ0JBYUlBTW9BZ0JCQUJBWElBQkJ1QUVRRUNBQVFmTUFFQm9nQXlnQ0FFRUFFQmNnQUVFdEVCQWdBQ0FCRUI0Z0F5QURLQUlBS0FJRU5nSUFRUUFMM2dRQkNYOGpBRUVRYXlJR0pBQWdBQ0FBS1FPQUFSQWpJQUJCRUdvaEF5QUFRYUFCYWlFRUlBQW9BcVFCSVFFRFFDQUJJQVJHUlFSQUlBRW9BZ1FoQlVFQUlRSURRQ0FDSUFFb0FoQk9SUVJBSUFBZ0FTQUNRUU4wYWlrREdCQWpJQUpCQVdvaEFnd0JDd3NnQXlBQklBQW9BZ1FSQUFBZ0JTRUJEQUVMQ3lBQUlBUTJBcVFCSUFBZ0FFR2dBV28yQXFBQklBQVFvZ1VnQUNnQ1ZDQUFRZEFBYWtZRVFFRUFJUUlEUUFKQUlBQW9Ba1FoQVNBQ0lBQW9Ba0JPRFFBZ0FTQUNRUmhzYWlJQktBSUFCRUFnQUNBQktBSUVFT3dCQ3lBQ1FRRnFJUUlNQVFzTElBTWdBU0FBS0FJRUVRQUFJQUFvQXBBQ0lnUUVRRUVBSVFFRFFFRUFJUVVnQVVFRlJrVUVRQU5BUVFBaEFpQUZRUUpHUlFSQUEwQWdBa0VVUndSQUlBUWdBVUdnQVd4cUlBVkIwQUJzYWlBQ1FRSjBha0dvRFdvaUJ5Z0NBQ0lJQkVBZ0JDZ0NBQ0lKS0FJQUlBaEJBQ0FKS0FJRUVRRUFHaUFIUVFBMkFnQUxJQUpCQVdvaEFnd0JDd3NnQlVFQmFpRUZEQUVMQ3lBQlFRRnFJUUVNQVFzTElBQW9BdGdCSUFSQkFDQUFLQUxjQVJFQkFCb2dBRUVBTmdLUUFnc2dBRUhnQVdvUW9RVWdBRUg0QVdvUW9RVkJBQ0VDQTBBQ1FDQUFLQUk0SVFFZ0FpQUFLQUlzVGcwQUlBRWdBa0VDZEdvb0FnQWlBVUVCY1VVRVFDQURJQUVnQUNnQ0JCRUFBQXNnQWtFQmFpRUNEQUVMQ3lBRElBRWdBQ2dDQkJFQUFDQURJQUFvQWpRZ0FDZ0NCQkVBQUNBRElBQW9BdFFCSUFBb0FnUVJBQUFnQmlBREtRSUlOd01JSUFZZ0F5a0NBRGNEQUNBR0lBQWdBQ2dDQkJFQUFDQUdRUkJxSkFBUEMwR05rUUZCcnZ3QVFiOFBRYVRsQUJBQUFBdERBUUovSUFBb0FvZ0JJUUpCZnlFREFrQURRQ0FDUVFCTURRRWdBQ2dDZ0FFZ0FrRUJheUlDUVFSMGFpZ0NBQ0FCUncwQUN5QUNRWUNBZ0lBQ2NpRURDeUFEQzhZQkFnUi9BWDRqQUVFUWF5SURKQUFnQUNBQkVDMGlCMEtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFBa0FnQUNBRFFReHFJQWNRNVFFaUJrVUVRQXdCQ3dKQUlBQWdBaEEvSWdFZ0F5Z0NER3BCQVdvUUtTSUVSUVJBUVFBaEJBd0JDeUFFSUFZZ0F5Z0NEQkFmSWdVZ0F5Z0NER29nQWlBQkVCOGFJQVVnQXlnQ0RDQUJhbXBCQURvQUFDQUFJQVVnQXlnQ0RDQUJhaENGQXlFRUlBQW9BaEFpQVVFUWFpQUZJQUVvQWdRUkFBQUxJQUFnQmhCVUN5QUFJQWNRRHdzZ0EwRVFhaVFBSUFRTHZ3RUJBWDhnQVNBRGFpMEFBRUU4UmdSQUlBQWdCRUgvQVhFUUVTQUFJQVZCLy84RGNSQXFJQU5CQVdvaEF3c2dBU0FDS0FJRUlnQkJCV3NpQW1vaUJpMEFBRUcyQVVZRVFDQUFJQUZxTFFBQVFSWkdCRUFnQmtFUk9nQUFJQUJCQkdzaEFnc2dBRUVDYWlFQUlBRWdBbW9pQmlBRk93QUJJQVlnQkVFQmFqb0FBQ0FDUVFOcUlRSURRQ0FBSUFKTVJRUkFJQUVnQW1wQnN3RTZBQUFnQWtFQmFpRUNEQUVMQ3lBRER3dEJvZFVBUWE3OEFFSHM1UUZCdGQ0QUVBQUFDMElCQVg4Q1FDQUFJQUZxSWdBdEFBRkJQVWNOQUVFQklRSUNRQUpBSUFBdEFBQWlBRUVXYXc0RUFnRUJBZ0FMSUFCQnN3RkdEUUVMSUFCQkhVWWhBZ3NnQWd1ekFRRUJmMEYvSVFNQ1FDQUJLQUpNUlEwQUFrQUNRQUpBQWtBZ0FrSHhBR3NPQXdJQkFBTUxJQUVvQXJRQklnTkJBRTROQXlBQklBQWdBVUh6QUJCUElnQTJBclFCSUFBUEN5QUJLQUt3QVNJRFFRQk9EUUlnQVNBQUlBRkI4Z0FRVHlJQU5nS3dBU0FBRHdzZ0FTZ0NyQUVpQTBFQVRnMEJJQUVnQUNBQlFmRUFFRThpQURZQ3JBRWdBQThMSUFKQkNFY05BQ0FCS0FLb0FTSURRUUJPRFFBZ0FTQUFJQUVReWdNaUF6WUNxQUVMSUFNTFJRQWdBQ2dDekFFZ0FVRURkR3BCQkdvaEFRTkFJQUVvQWdBaUFVRUFTRVVFUUNBQUtBSjBJQUZCQkhScUlnRWdBU2dDREVFRWNqWUNEQ0FCUVFocUlRRU1BUXNMQ3pBQUEwQWdBVUdBQVVsRkJFQWdBQ0FCUVlBQmNrSC9BWEVRRVNBQlFRZDJJUUVNQVFzTElBQWdBVUgvQVhFUUVRc05BQ0FBSUFGQjJvZ0JFT0VFQy9rQ0FRUi9RUUVoQ1NBRElRY0NRQU5BSUFjb0Fzd0JJQVZCQTNScVFRUnFJUVVDUUFKQUEwQWdCU2dDQUNJRlFRQklEUUVnQkNBSEtBSjBJZ1lnQlVFRWRHb2lDQ2dDQUVjRVFDQUlRUWhxSVFVTUFRc0xJQVlnQlVFRWRHb29BZ3hCQTNaQkQzRWhDRUVCSVFZZ0NRUkFRUUFoQmd3Q0N5QUFJQU1nQjBFQUlBVWdCRUVCUVFGQkFCQ2ZBU0lGUVFCT0RRRU1Bd3NnQnlnQ0JDSUdSUVJBQWtBZ0J5Z0NJRVVOQUVFQUlRVWdCeWdDd0FJaUJrRUFJQVpCQUVvYklRWURRQ0FGSUFaR0RRRWdCQ0FIS0FMSUFpSUlJQVZCQTNScUtBSUVSZ1JBSUFnZ0JVRURkR290QUFBaUNVRUVkaUVJSUFNZ0IwWUVRRUVCSVFZTUJRdEJBU0VHSUFBZ0F5QUhRUUFnQ1VFQmRrRUJjU0FGSUFRZ0NVRUNka0VCY1NBSlFRTjJRUUZ4SUFnUTlRRWlCVUVBU0EwR0RBUUZJQVZCQVdvaEJRd0JDd0FMQUFzZ0FDQUVRYUdYQVJEL0F3d0RDeUFIS0FJTUlRVkJBQ0VKSUFZaEJ3d0JDd3NnQVNBR05nSUFJQUlnQ0RZQ0FDQUZEd3RCZnd2R0Z3RUdmeU1BUVJCcklnd2tBQ0FNUVg4MkFnd0NmMEVCSUFKQjhRQnJRUU5KRFFBYVFRRWdBa0VJUmcwQUdrRUFDeUVMSUFFb0Fzd0JJQU5CQTNScVFRUnFJUU1DUUFKQUFrQUNRQUpBQWtBRFFDQURLQUlBSWdOQkFFNEVRQ0FDSUFFb0FuUWlDaUFEUVFSMGFpSUpLQUlBSWcxR0JFQWdCRUY5Y1VHNUFVY0VRQ0FESVFrTUJBc2dDaUFESWdsQkJIUnFMUUFNUVFGeFJRMERJQVZCTUJBUklBVWdBQ0FDRUJnUUhTQUZRUUFRRVF3SEN5QUxJQTFCMUFCSGNrVUVRQ0FGUWRnQUVCRWdCU0FEUWYvL0EzRVFLaUFBSUFFZ0FpQUVJQVVnREVFTWFrRUJFT0FCQ3lBSlFRaHFJUU1NQVFzTFFYOGhDU0FEUVg1SEJFQWdBU0FDRVBRQklRa0xJQXRCQVhNZ0NVRUFUbkpGQkVBZ0FDQUJJQUlRNUFRaENRc0NRQ0FDUWMwQVJ5QUpRUUJPY2tVRVFDQUJLQUpJUlEwQklBQWdBUkRxQWlFSkN5QUpRUUJPRFFFTEFrQWdBU2dDTEFSQUlBRW9BbkFnQWtZTkFRc2dBMEYrUncwRERBUUxJQUFnQVNBQ0VPa0NJZ2xCQUVnTkFRc0NRQUpBQWtBQ1FDQUVRYmNCYXc0SEFnSUFBd0FCQWdjTEFrQWdDVUdBZ0lDQUFuRWlBdzBBSUFFb0FuUWdDVUVFZEdvdEFBeEJBWEZGRFFBZ0JVRXdFQkVnQlNBQUlBSVFHQkFkSUFWQkFCQVJEQWNMQWtBZ0JFRzVBV3NPQXdJREFBY0xBa0FnQXcwQUlBRW9BblFnQ1VFRWRHb29BZ3hCK0FCeFFTQkhEUUFnQlVFTEVCRWdCVUhZQUJBUklBVWdDVUgvL3dOeEVDb2dCVUhNQUJBUklBVWdBQ0FDRUJnaUFoQWRJQVZCQkJBUklBVWdBQ0FDRUJnUUhRd0hDd0pBSUF3b0FneEJmMGNOQUNBR0lBY29BZ1FRNHdSRkRRQWdCU0FHSUFjZ0NBSi9JQU1FUUNBSlFZQ0FnSUFDYXlFSlFkc0FEQUVMUWVJQVFkZ0FJQUVvQW5RZ0NVRUVkR290QUF4QkFuRWJDeUFKRU9JRUlRZ01Cd3NnQXdSQUlBVkIrUUFRRVNBRklBQWdBaEFZRUIwZ0JTQUpRZi8vQTNFUUtnd0hDeUFGUWZnQUVCRWdCU0FBSUFJUUdCQWRJQVVnQ1VILy93TnhFQ29NQmdzZ0JVRUdFQkVMSUFsQmdJQ0FnQUp4QkVBZ0JVSGNBRUhjQUVIYkFDQUVRYjBCUmhzZ0JFRzVBVVliRUJFZ0JTQUpRZi8vQTNFUUtnd0ZDd0pBQWtBQ1FDQUVRYmtCYXc0RkFBRUJBUUFCQzBIakFFSFpBQ0FCS0FKMElBbEJCSFJxS0FJTVFRSnhJZ0JCQVhZYklRTWdBRVVnQkVHOUFVZHlEUUZCNUFCQjJRQWdBa0VJUmhzaEF3d0JDMEhpQUVIWUFDQUJLQUowSUFsQkJIUnFMUUFNUVFKeEd5RURDeUFGSUFNUUVTQUZJQWxCLy84RGNSQXFEQVFMSUFWQkNSQVJEQU1MSUFOQmZrWU5BUXNnQ3lBQktBS1FBVUVBU0hJTkFDQUZRZGdBRUJFZ0JTQUJMd0dRQVJBcUlBQWdBU0FDSUFRZ0JTQU1RUXhxUVFBUTRBRUxJQXNnQVNJREtBS1VBVUVBU0hKRkJFQWdCVUhZQUJBUklBVWdBUzhCbEFFUUtpQUFJQUVnQWlBRUlBVWdERUVNYWtFQUVPQUJDd0pBQWtBQ2Z3SkFBa0FDUUFOQUlBTW9BZ1FpQ2tVRVFDQURJUW9NQXdzZ0NpZ0N6QUVnQXlnQ0RFRURkR3BCQkdvaEF3TkFJQU1vQWdBaUNVRUFUZ1JBSUFJZ0NpZ0NkQ0lOSUFsQkJIUnFJZ01vQWdBaURrWUVRQ0FFUVgxeFFia0JSd1JBSUFraEF3d0ZDeUFOSUFraUEwRUVkR290QUF4QkFYRkZEUVFnQlVFd0VCRWdCU0FBSUFJUUdCQWRJQVZCQUJBUkRBb0ZBa0FnQ3lBT1FkUUFSM0lOQUNBRElBTW9BZ3hCQkhJMkFnd2dBQ0FCSUFwQkFDQUpRZFFBUVFCQkFFRUFFSjhCSWdsQkFFZ05BQ0FGUWQ0QUVCRWdCU0FKUWYvL0EzRVFLaUFBSUFFZ0FpQUVJQVVnREVFTWFrRUJFT0FCQ3lBRFFRaHFJUU1NQWdzQUN3c2dDVUYrUndSQUlBb2dBaEQwQVNJRFFRQk9EUUlMSUFzRVFDQUFJQW9nQWhEa0JDSURRUUJPRFFJTEFrQUNRQ0FDUWMwQVJ3MEFJQW9vQWtoRkRRQWdBQ0FLRU9vQ0lRTU1BUXNDUUNBS0tBSXNSUTBBSUFvb0FuQWdBa2NOQUNBQUlBb2dBaERwQWlFRERBRUxBa0FnQ1VGK1JnMEFJQXNnQ2lnQ2tBRWlBMEVBU0hJTkFDQUtLQUowSUFOQkJIUnFJZ01nQXlnQ0RFRUVjallDRENBQUlBRWdDa0VBSUFvb0FwQUJJQU1vQWdCQkFFRUFRUUFRbndFaEF5QUZRZDRBRUJFZ0JTQURRZi8vQTNFUUtpQUFJQUVnQWlBRUlBVWdERUVNYWtFQUVPQUJDeUFMSUFvb0FwUUJJZ05CQUVoeVJRUkFJQW9vQW5RZ0EwRUVkR29pQXlBREtBSU1RUVJ5TmdJTUlBQWdBU0FLUVFBZ0NpZ0NsQUVnQXlnQ0FFRUFRUUJCQUJDZkFTRURJQVZCM2dBUUVTQUZJQU5CLy84RGNSQXFJQUFnQVNBQ0lBUWdCU0FNUVF4cVFRQVE0QUVMSUFvaUF5Z0NJRVVOQVF3REN3c2dBMEVBU0EwQkN5QURRWUNBZ0lBQ2NVVU5BU0FLS0FLQUFTQURRWUNBZ0lBQ2F5SURRUVIwYWlJSklBa29BZ3hCQkhJMkFnd2dBQ0FCSUFwQkFTQURJQUpCQUVFQVFRQVFud0VNQWdzZ0NpZ0NJRVVOQTBFQUlRTURRQ0FESUFvb0FzQUNUZzBFSUFJZ0NpZ0N5QUlnQTBFRGRHb2lEaWdDQkNJTlJnUkFJQUVnQ2tZTkJDQUFJQUVnQ2tFQUlBNHRBQUFpQ2tFQmRrRUJjU0FESUFJZ0NrRUNka0VCY1NBS1FRTjJRUUZ4SUFwQkJIWVE5UUVoQXd3RUJRSkFBa0FnRFVGK2NVSFNBRWNFUUNBTElBMUIxQUJIY2tVTkFRd0NDeUFMRFFFTElBTWhDU0FCSUFwSEJFQWdBQ0FCSUFwQkFDQU9MUUFBUVFGMlFRRnhJQU1nRFVFQVFRQkJBQkQxQVNFSkN5QUZRZDRBRUJFZ0JTQUpRZi8vQTNFUUtpQUFJQUVnQWlBRUlBVWdERUVNYWlBTlFkUUFSaERnQVFzZ0EwRUJhaUVEREFFTEFBc0FDeUFEUVFSMElna2dDaWdDZEdvaUN5QUxLQUlNUVFSeU5nSU1JQUFnQVNBS1FRQWdBeUFDSUFvb0FuUWdDV29vQWd3aUEwRUJjU0FEUVFGMlFRRnhJQU5CQTNaQkQzRVFud0VMSWdOQkFFZ05BUXNDUUFKQUFrQUNRQUpBQWtBQ1FDQUVRYmNCYXc0SEFRRUFCZ0FEQVFnTElBRW9Bc2dDSUFOQkEzUnFMUUFBSWdsQkJIRUVRQ0FGUVRBUUVTQUZJQUFnQWhBWUVCMGdCVUVBRUJFTUNBdEJBQ0VLQWtBZ0JFRzVBV3NPQXdJR0FBZ0xJQWxCOEFGeFFjQUFSZ1JBSUFWQkN4QVJJQVZCM2dBUUVTQUZJQU5CLy84RGNSQXFJQVZCekFBUUVTQUZJQUFnQWhBWUlnSVFIU0FGUVFRUUVTQUZJQUFnQWhBWUVCME1DQXNDUUNBTUtBSU1RWDlIRFFBZ0JpQUhLQUlFRU9NRVJRMEFJQVVnQmlBSElBaEI1UUJCM2dBZ0NVRUljUnNnQXhEaUJDRUlEQWdMSUFWQitnQVFFU0FGSUFBZ0FoQVlFQjBnQlNBRFFmLy9BM0VRS2d3SEN5QUVRYjBCUmlFS0lBUkJ1UUZyRGdVQUFnSUNBQUlMUWVZQVFkOEFJQUVvQXNnQ0lBTkJBM1JxTFFBQVFRaHhJZ0JCQTNZYklRa2dBRVVnQ2tWeURRSkI1d0JCM3dBZ0FrRUlSaHNoQ1F3Q0N5QUZRUVlRRVF0QjVRQkIzZ0FnQVNnQ3lBSWdBMEVEZEdvdEFBQkJDSEViSVFrTElBVWdDUkFSSUFVZ0EwSC8vd054RUNvTUFnc2dCVUVKRUJFTUFRc0NRQUpBQWtBQ1FBSkFJQVJCdHdGckRnY0NBZ0lFQUFFREJRc0NRQ0FNS0FJTVFYOUhEUUFnQnlnQ0JDQUdhaUlETFFBQlFUMUhEUUFDUUFKQUlBTXRBQUFpQTBFWmF3NEZBUUlDQWdFQUN5QURRYk1CUmcwQUlBTkJGa2NOQVFzZ0FTMEFia0VCY1NJRUJFQWdCVUUyRUJFZ0JTQUFJQUlRR0JBZEN5QUdJQWhxTFFBQVFUeEdCRUFnQlVFNEVCRWdCU0FBSUFJUUdCQWRJQWhCQVdvaENBc2dCaUFIS0FJRUlnZEJCV3NpQ21vaUNTMEFBRUcyQVVjTkJpQUdJQWRxTFFBQUlRTUNRQUpBSUFRRVFFRTdJUXNDUUFKQUFrQUNRQ0FEUVJsckRnVUNBUUVCQXdBTFFSVWhCQ0FEUVJaR0RRUWdBMEd6QVVZTkJRc1FBUUFMUVJnaEJBd0NDMEViSVFRTUFRdEJPU0VMUVJFaEJDQURRUlpIRFFFTElBa2dCRG9BQUNBSFFRUnJJUW9MSUFkQkFtb2hCQ0FHSUFwcUlnTWdDem9BQUNBRElBQWdBaEFZTmdBQklBcEJCV29oQXdOQUlBTWdCRTROQmlBRElBWnFRYk1CT2dBQUlBTkJBV29oQXd3QUN3QUxJQVZCK3dBUUVTQUZJQUFnQWhBWUVCME1CQXNnQlVFR0VCRWdCVUU0RUJFZ0JTQUFJQUlRR0JBZERBTUxJQVVnQkVHQUFYTkIvd0Z4RUJFZ0JTQUFJQUlRR0JBZERBSUxJQVZCT2hBUklBVWdBQ0FDRUJnUUhRd0JDeUFGUVprQkVCRWdCU0FBSUFJUUdCQWRDeUFNS0FJTUlnQkJBRTRFUUNBRlFiWUJFQkVnQlNBQUVCMGdBU2dDcEFJZ0FFRVViR29nQlNnQ0JEWUNDQXNnREVFUWFpUUFJQWdQQzBHaDFRQkJydndBUVozbUFVSDMzUUFRQUFBTDFnSUJCSDhqQUVHZ0FXc2lCU1FBSUFFb0FnQWhCaUFGUVlBQk5nSUlJQVVnQlVFUWFqWUNEQ0FFQkg4Z0JVRWpPZ0FRUVFFRlFRQUxJUVFDZndKQUEwQUNmeUFEUWY4QVRBUkFJQVVvQWd3aUJ5QUVhaUFET2dBQUlBUkJBV29NQVFzZ0JTZ0NEQ0lISUFScUlBTVFvUU1nQkdvTElRUWdCU0FHUVFGcU5nS2NBVUhjQUNFREFrQWdCaTBBQUNJSVFkd0FSZ1JBSUFZdEFBRkI5UUJIRFFFZ0JVR2NBV3BCQVJENUFTRURJQUpCQVRZQ0FBd0JDeUFJSWdQQVFRQk9EUUFnQmtFR0lBVkJuQUZxRUZnaEF3c2dBeERGQVVVTkFTQUZLQUtjQVNFR0lBUWdCU2dDQ0VFR2Ewa05BQ0FBS0FJQUlBVkJER29nQlVFSWFpQUZRUkJxRVBVRVJRMEFDeUFGS0FJTUlRZEJBQXdCQ3lBQUtBSUFJQWNnQkJDRkF3c2hBeUFGUVJCcUlBZEhCRUFnQUNnQ0FDZ0NFQ0lBUVJCcUlBY2dBQ2dDQkJFQUFBc2dBU0FHTmdJQUlBVkJvQUZxSkFBZ0F3dWFCZ0VFZjBFQklRa2dBa0VCZEVIZzl3SnFMd0VBSVFJZ0JVVUVRQ0FBSUFJMkFnQkJBUThMSUFKQjBJSURhaUVHUVJJaEJ3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBVkJBV3NPSWdBQUFBQUFBQUFCQVFJQ0FnSUNCQU1EQXdNREF3VUZCUVVGQlFVRkJnY0lDUWtMQ3lBR0lBRWdBMnNnQld4QkFYUnFJUUZCQUNFQ0EwQWdBaUFGUmdSQUlBVVBDeUFBSUFKQkFuUnFJQUVnQWtFQmRHb3ZBQUFpQXpZQ0FDQUNRUUZxSVFJZ0F3MEFDd3dMQ3lBRlFRZHJJZ2dnQVNBRGEyd2hBaUFFSUFoc1FRRjBJUUZCQUNFSEEwQWdCeUFJUmcwS0lBWWdBa0VCZENJRGFpOEFBQ0FHSUFKQkFuWWdBV3BxTFFBQUlBTkJCbkYyUVJCMFFZQ0FESEZ5SWdORkRRc2dBQ0FIUVFKMGFpQUROZ0lBSUFkQkFXb2hCeUFDUVFGcUlRSU1BQXNBQ3lBR0lBVkJDV3NpQ0NBQklBTnJiR29oQVVFQUlRSURRQ0FDSUFoR0RRa2dBQ0FDUVFKMGFpQUJJQUpxTFFBQUVLc0RJZ00yQWdBZ0FrRUJhaUVDSUFNTkFBc01DUXNnQlVFQmNTQUZRUkJySWdKQkFVdHFJUWdnQWtFQmRrRUNhaUVKQ3lBQklBTnJJUUZCQUNFQ0EwQWdBaUFKUmdSQUlBa1BCU0FBSUFKQkFuUnFJQVlnQWtFQmRHb3ZBQUFnQVVFQUlBSWdDRVliYWpZQ0FDQUNRUUZxSVFJTUFRc0FDd0FMSUFWQkZXc2hCd3NnQnlBQklBTnJiQ0FHYWtFQ2FpRUJJQVl2QUFBaEEwRUFJUUlEUUNBQ0lBZEdCRUFnQnc4RklBQWdBa0VDZEdwQklDQURJQUVnQW1vdEFBQWlCR29nQkVIL0FVWWJOZ0lBSUFKQkFXb2hBZ3dCQ3dBTEFBc2dBQ0FHSUFFZ0EydEJBMnhxSWdFdkFBQWlBallDQUNBQ1JRMERJQUFnQVMwQUFoQ3JBellDQkF3Q0N5QUFJQVl2QUFJMkFnZ2dBQ0FHTHdBQU5nSUFJQUFnQVNBRGEwRUJkQ0FHYWk4QUJEWUNCRUVERHdzZ0FTQURheUVCQW44Z0JVRWhSZ1JBSUFZZ0FVRitjV29pQWtFQmFpRURJQUl0QUFBUXF3TU1BUXNnQmlBQlFRRjJRUU5zYWlJQ1FRSnFJUU1nQWk4QUFBc2hBaUFBUVNCQklFRUJJQUpCa0FoclFTQkpHeUFDUVlBQ1NSc2dBbW9nQWlBQlFRRnhHellDQUNBQUlBTXRBQUFRcXdNMkFnUUxRUUloQ0FzZ0NBOExRUUFMdEFJQkNIOGpBRUhRQUdzaUJ5UUFJQUpCQUNBQ1FRQktHeUVMQTBBQ1FBSkFJQVlnQzBjRVFDQUJJQVpCQW5ScUtBSUFJZ1ZCZ05nQ2F5SUNRYVBYQUUwTkFVR3hCU0VDUVFBaEJBSkFBMEFnQWlBRVNBMEJJQVVnQWlBRWFrRUNiU0lJUVFKMFFaRGlBbW9vQWdBaUNVRU9kaUlLU1FSQUlBaEJBV3NoQWd3QkN5QUZJQWxCQjNaQi93QnhJZ1FnQ21wUEJFQWdDRUVCYWlFRURBRUxDeUFKUVFGeElBTkxEUUFnQnlBRklBZ2dDaUFFSUFsQkFYWkJQM0VRNndRaUFrVU5BQ0FBSUFjZ0FpQURFT3dFREFNTElBQWdCUkFkREFJTElBZEIwQUJxSkFBUEN5QUFJQUpCLy84RGNTSUZRY3dFYmlJRVFZQWljaEFkSUFBZ0JFRzBlMndnQW1wQi8vOERjVUVjYmtIaEltb1FIU0FGUVJ4d0lnSkZEUUFnQUNBQ1FhY2phaEFkQ3lBR1FRRnFJUVlNQUFzQUM5c0dBZ3gvQm40akFFRXdheUlDSkFBQ2ZnSkFBa0FnQVNrREtDSU9Rb0NBZ0lCd2cwS0FnSUNBa0g5UkJFQWdBU2tEQ0NJUVFvQ0FnSUJ3ZzBLQWdJQ0FrSDlSRFFFTElBQkJvdHNBUVFBUUZRd0JDeUFCS1FNZ0lSSWdBU2tER0NFUElBRXBBd0FoRXlBQUlBSkJER3BCQUJBOUdpQUNRUUEyQWlRQ1FDQVBRb0NBZ0lCd2cwS0FnSUNBTUZJRVFDQUFJQUpCSkdvZ0R4RFdBUTBCQ3lBQUlBSkJLR29nRXhEV0FRMEFJQUFnQWtFc2FpQUJLUU1RRUhkQkFFZ05BQ0FRcHlFSUlCSkNnSUNBZ0hDRElSQWdBaWdDTENJTUlBSW9BaWhxSVEwZ0RxY2lCRUVRYWlFSElBUW9BZ1JCLy8vLy93ZHhJUW9nQWlnQ0pDRUxRUUFoQVFOQUFrQUNRQUpBSUFSQkpDQUJFTWNCSWdaQkFFZ05BQ0FHUVFGcUlnTWdDazhOQUNBQ1FReHFJQVFnQVNBR0VGRWFJQVpCQW1vaEFRSkFBa0FDUUFKQUFuOGdCQ2tDQkVLQWdJQ0FDSU5RSWdsRkJFQWdCeUFEUVFGMGFpOEJBQXdCQ3lBRElBZHFMUUFBQ3lJRFFTUnJEZ1FBQXdVQkFnc2dBa0VNYWtFa0VEc2FEQVlMSUFKQkRHb2dDQ0FOSUFnb0FnUkIvLy8vL3dkeEVGRWFEQVVMSUFOQjRBQkdEUU1MQWtBZ0EwRXdheUlGUVFsTkJFQUNRQ0FCSUFwUERRQUNmeUFKUlFSQUlBY2dBVUVCZEdvdkFRQU1BUXNnQVNBSGFpMEFBQXNpQTBFd2EwRUpTdzBBSUFaQkEyb2dBU0FESUFWQkNteHFJZ0ZCTUVzZ0FVRXdheUlESUF0SmNTSUpHeUVCSUFNZ0JTQUpHeUVGQ3lBRlJTQUZJQXRQY2cwQklBQWdEeUFGclJCeklnNUNnSUNBZ0hDREloRkNnSUNBZ0RCUkRRVWdFVUtBZ0lDQTRBQlJEUVlnQWtFTWFpQU9FSDlGRFFVTUJnc2dBMEU4UnlBUVFvQ0FnSUF3VVhJTkFDQUVRVDRnQVJESEFTSURRUUJJRFFBZ0FDQUVJQUVnQXhDRUFTSU9Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRVWdBQ0FTSUE0UVRTSU9Rb0NBZ0lCd2d5SVJRb0NBZ0lBd1VnUkFJQkZDZ0lDQWdPQUFVUTBHSUFKQkRHb2dEaEIvRFFZTElBTkJBV29oQVF3RUN5QUNRUXhxSUFRZ0JpQUJFRkVhREFNTElBSkJER29pQUNBRUlBRWdCQ2dDQkVILy8vLy9CM0VRVVJvZ0FCQTJEQVVMSUFKQkRHb2dFeENIQVVVTkFRd0NDeUFDUVF4cUlBaEJBQ0FNRUZFYURBQUxBQXNnQWlnQ0RDZ0NFQ0lBUVJCcUlBSW9BaEFnQUNnQ0JCRUFBQXRDZ0lDQWdPQUFDeUVQSUFKQk1Hb2tBQ0FQQzI4QkEzOERRQ0FBS0FJb0lnRkJBRXhGQkVBZ0FDQUJRUUZySWdFMkFpZ2dBQ2dDQUNBQUtBSUVJQUZCQTNScUtRTUFFQThNQVFzTElBQW9BZ1FpQVNBQVFRaHFJZ0pIQkVBZ0FDZ0NBQ2dDRUNJRFFSQnFJQUVnQXlnQ0JCRUFBQXNnQUVFRU5nSXNJQUFnQWpZQ0JBdEVBQ0FBUVJCcUlBRWdBblFnQW10QkVXb2dBQ2dDQUJFREFDSUFCRUFnQUVFQU5nSU1JQUJCQVRZQ0FDQUFJQUZCLy8vLy93ZHhJQUpCSDNSeXJUY0NCQXNnQUF1cEFnRUVmeU1BUVVCcUlnY2tBQ0FISUFFdEFBQWlDRUVCZGtFQmNUWUNKQ0FISUFoQkFuWkJBWEUyQWlBZ0J5QUlRUVIyUVFGeElnZzJBaWdnQnlBQkxRQUJJZ2syQWhnZ0FTMEFBaUVLSUFkQkFEWUNQQ0FISUFZMkFpd2dCeUFGUVFJZ0JTQUlHeUFGUVFGSEd6WUNGQ0FISUFJZ0JDQUZkR28yQWhBZ0J5QUNOZ0lNSUFjZ0NqWUNIQ0FIUWdBM0FqUWdCeUFLUVFKMElnWWdDVUVEZEdwQkVHbzJBakFnQ1VFQmRDRUVRUUFoQ0FOQUlBUWdDRVpGQkVBZ0FDQUlRUUowYWtFQU5nSUFJQWhCQVdvaENBd0JDd3NnQnlBR1FROXFRZkFQY1dzaUJDUUFJQWRCREdvZ0FDQUVRUUFnQVVFSGFpQUNJQU1nQlhScVFRQVFwUVloQVNBSEtBSXNLQUlRSWdCQkVHb2dCeWdDTkVFQUlBQW9BZ2dSQVFBYUlBZEJRR3NrQUNBQkMvd0dBZ2gvQTM0akFFRVFheUlHSkFBQ1FBSkFJQUFnQVJEd0FpSUNSUTBBSUFBZ0F5a0RBQkFvSWc1Q2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBT0lRRU1BZ3NDUUNBQUlBRkIxUUFnQVVFQUVCUWlERUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQmtFSWFpQU1FS01CRFFBZ0FpZ0NCQ0lGTFFBUVFTRnhJZ05GQkVBZ0JrSUFOd01JQ3dKQUlBVXRBQkVpQ1VVRVFFRUFJUUlNQVFzZ0FDQUpRUU4wRUNraUFrVU5BUXNDUUFKK0FrQUNRQUpBQWtBQ1FBSkFBa0FnQmlrRENDSU1JQTZuSWdvcEFnUWlEVUwvLy8vL0I0TlZEUUFnQWlBRlFSQnFJQXBCRUdvaUJ5QU1weUFOcHlJRVFmLy8vLzhIY1NBRVFSOTJJZ2dnQUJEd0JDSUVRUUZHRFFNZ0JFRUFTQTBCSUFNTkFDQUVRUUpIRFFJTElBQWdBVUhWQUVJQUVFVkJBRTROQVF3RkN5QUFRWXZMQUVFQUVFWU1CQXNnQUNBT0VBOUNnSUNBZ0NBaEFRd0JDeUFEQkVBZ0FDQUJRZFVBSUFJb0FnUWdCMnNnQ0hXdEVFVkJBRWdOQXd0Q2dJQ0FnREFoRFVLQWdJQ0E0QUFnQUJBK0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF4cEJBQ0VEUVFBaEJDQUZMQUFRUVFCSUJFQWdCU2dBRXlFRUlBQkNnSUNBZ0NBUVJ5SU5Rb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQkNnSUNBZ09BQUlRME1Bd3NnQkNBRmFrRVhhaUVFQ3dOQUlBTWdDVWNFUUVLQWdJQ0FNQ0VNQWtBZ0FpQURRUU4wYWlnQ0FDSUZSUTBBSUFJZ0EwRURkRUVFY21vb0FnQWlDMFVOQUNBQUlBb2dCU0FIYXlBSWRTQUxJQWRySUFoMUVJUUJJZ3hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQXNnQkVVZ0EwVnlSUVJBQWtBZ0JDMEFBRVVOQUNBTVFpQ0lwMEYxVHdSQUlBeW5JZ1VnQlNnQ0FFRUJhallDQUFzZ0FDQU5JQVFnREVHSGdBRVE3d0ZCQUU0TkFDQUFJQXdRRHd3RkN5QUVFRDhnQkdwQkFXb2hCQXNnQUNBQklBTWdERUdIZ0FFUXJ3RWhCU0FEUVFGcUlRTWdCVUVBVGcwQkRBTUxDeUFBSUFGQmh3RWdEVUdIZ0FFUUdVRUFTQTBCSUFBZ0FVSFhBQ0FDS0FJQUlBZHJJQWgxclVHSGdBRVFHVUVBU0EwQklBRWhEQ0FBSUFGQjJBQWdEa0dIZ0FFUUdVRUFTQTBFQ3lBQUtBSVFJZ0JCRUdvZ0FpQUFLQUlFRVFBQURBWUxJQUVNQVF0Q2dJQ0FnREFoRFVLQWdJQ0FJQXNoRENBQUlBMFFEeUFBSUE0UUR3c2dBQ0FNRUE4Z0FDZ0NFQ0lBUVJCcUlBSWdBQ2dDQkJFQUFBd0JDeUFBSUE0UUR3dENnSUNBZ09BQUlRRUxJQVpCRUdva0FDQUJDL1VCQVFoL1FYOGhBaUFCSUFGQkFXdHhSUVJBSUFCQkVHb2lDQ0FCUVFKMElnTWdBQ2dDQUJFREFDSUZCSDhnQlVFQUlBTVFLeUVHSUFGQi8vLy8vd05xUWYvLy8vOERjU0VKSUFBb0FqUWhCd05BSUFRZ0FDZ0NKRTlGQkVBZ0J5QUVRUUowYWlnQ0FDRUNBMEFnQWdSQUlBQW9BamdnQWtFQ2RHb29BZ0FpQXlnQ0RDRUZJQU1nQmlBSklBTW9BZ2h4UVFKMGFpSURLQUlBTmdJTUlBTWdBallDQUNBRklRSU1BUXNMSUFSQkFXb2hCQXdCQ3dzZ0NDQUhJQUFvQWdRUkFBQWdBQ0FCUVFGME5nSXdJQUFnQVRZQ0pDQUFJQVkyQWpSQkFBVkJmd3NQQzBIdWp3RkJydndBUVlBVVFjM1pBQkFBQUFzWUFDQUFLQUlRSWdCQkVHb2dBU0FDSUFBb0FnZ1JBUUFMRXdBZ0FFRVFhaUFCSUFJZ0FDZ0NDQkVCQUF0dUFRUi9RWDhoQmtGL0lBSW9BZ0FpQkVFQmRpQUVhaUFFUWFuVnF0VjZTeHNoQlFKQUFrQWdBeUFCS0FJQUlnZEdCRUFnQUNBRkVDa2lBRVVOQWlBQUlBTWdCQkFmR2d3QkN5QUFJQWNnQlJDSkFpSUFSUTBCQ3lBQklBQTJBZ0FnQWlBRk5nSUFRUUFoQmdzZ0JndU5Bd0VEZnlNQVFVQnFJZ0lrQUFKQUlBQWdBUkJaSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUFKQUlBQWdBa0VrYWlBQnB5SUVLQUlFUWYvLy8vOEhjVUVDYWhBOURRQWdBa0VrYWtFaUVEc05BQ0FDUVFBMkFqd0RRQ0FFS0FJRVFmLy8vLzhIY1NBRFNnUkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQkNBQ1FUeHFFTWtCSWdOQkNHc09CZ1VDQkFFR0F3QUxJQU5CSWtZZ0EwSGNBRVp5RFFZTElBTkJnUEQvQUhGQmdMQURSeUFEUVNCUGNRMEdJQUlnQXpZQ0FDQUNRUkJxSWdOQkVFR0JJU0FDRUU0YUlBSkJKR29nQXhDSUFRMEtEQWNMUWZRQUlRTU1CQXRCOGdBaEF3d0RDMEh1QUNFRERBSUxRZUlBSVFNTUFRdEI1Z0FoQXdzZ0FrRWtha0hjQUJBN0RRUWdBa0VrYWlBREVEdEZEUUVNQkFzZ0FrRWthaUFERUxrQkRRTUxJQUlvQWp3aEF3d0JDd3NnQWtFa2FrRWlFRHNOQUNBQUlBRVFEeUFDUVNScUVEWWhBUXdCQ3lBQUlBRVFEeUFDS0FJa0tBSVFJZ0JCRUdvZ0FpZ0NLQ0FBS0FJRUVRQUFRb0NBZ0lEZ0FDRUJDeUFDUVVCckpBQWdBUXVLQXdJRGZnSi9Jd0JCRUdzaUFpUUFRb0NBZ0lBd0lRWUNRQUpBSUFBZ0FrRUlhaUFBSUFFUUpTSUJFRHdOQUFKQUlBSXBBd2dpQjBJQVZ3UkFEQUVMSUFkQ0FYMGhCUUpBQWtBQ1FBSkFJQUVnQWtFRWFpQUNFSW9DUlEwQUlBY2dBaWdDQUNJSXJWSU5BQ0FCcHlFSklBSW9BZ1FoQXlBRVJRMEJJQU1wQXdBaEJpQURJQU5CQ0dvZ0NFRURkRUVJYXhDY0FRd0NDd0pBSUFRRVFDQUFJQUZDQUJCTklnWkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkJpQUFJQUZDQUVJQklBVkJBUkQwQWtVTkFRd0dDeUFBSUFFZ0JSQnpJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CUXNnQUNBQklBVVErZ0ZCQUU0TkFnd0VDeUFJUVFOMElBTnFRUWhyS1FNQUlRWUxJQWtnQ1NnQ0tFRUJhellDS0FzZ0IwS0JnSUNBQ0ZRTkFFS0FnSUNBd0g0Z0JibTlJZ1ZDZ0lDQWdNQ0JnUHovQUgwZ0JVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzaEJRc2dBQ0FCUVRBZ0JSQkZRUUJPRFFFTElBQWdCaEFQUW9DQWdJRGdBQ0VHQ3lBQUlBRVFEeUFDUVJCcUpBQWdCZ3ZrQlFJR2ZnUi9Jd0JCRUdzaURDUUFBbjRDUUFKQUFrQWdBQ0FCRUNVaUJrS0FnSUNBY0ZRTkFDQUdweUlMTHdFR1FRSkhEUUFnQ3kwQUJVRUpjVUVKUncwQUlBc29BaEF0QUROQkNIRkZEUUFnQ3lnQ0ZDa0RBQ0lCUXYvLy8vOFBWZzBBSUF3Z0FjUWlCemNEQ0NBSElBczFBaWhTRFFBZ0J5QUNySHdpQlVMLy8vLy9CMVVOQUNBTE5RSWdJQVZUQkVBZ0FDQUxJQVduRUt3RkRRTUxBbjhnQkVVZ0FrRUFUSEpGQkVBZ0N5Z0NKQ0lFSUFKQkEzUnFJQVFnQWFkQkEzUVFuQUZCQUF3QkN5QUJwd3NoRFVFQUlRUWdBa0VBSUFKQkFFb2JJUUlEUUNBQ0lBUkhCRUFnQXlBRVFRTjBhaWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZzRnRGlnQ0FFRUJhallDQUFzZ0N5Z0NKQ0FFSUExcVFRTjBhaUFCTndNQUlBUkJBV29oQkF3QkN3c2dDeUFGUGdJb0lBc29BaFFnQlVMLy8vLy9ENE0zQXdBZ0JVS0FnSUNBQ0h3aEFRd0JDeUFBSUF4QkNHb2dCaEE4RFFFZ0RDa0RDQ0lCSUFLc0lnaDhJZ1ZDZ0lDQWdJQ0FnQkJaQkVBZ0FFSFEyZ0JCQUJBVkRBSUxBa0FnQkVVZ0FrRUFUSEpGQkVCQ0FDRUhJQUFnQmlBSVFnQWdBVUYvRVBRQ0RRTU1BUXNnQVNFSEN5QUNRUUFnQWtFQVNodXRJUWxDQUNFQkEwQWdBU0FKVWdSQUlBTWdBYWRCQTNScUtRTUFJZ2hDSUlpblFYVlBCRUFnQ0tjaUFpQUNLQUlBUVFGcU5nSUFDeUFCSUFkOElRb2dBVUlCZkNFQklBQWdCaUFLSUFnUWhnRkJBRTROQVF3REN3c2dBQ0FHUVRBZ0JVS0FnSUNBQ0h3aUFVTC8vLy8vRDFnRWZpQUZRdi8vLy84UGd3VkNnSUNBZ01CK0lBVzV2U0lIUW9DQWdJREFnWUQ4L3dCOUlBZEMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkZRUUJJRFFFTElBQWdCaEFQSUFWQy8vLy8vdytESUFGQy8vLy8vdzlZRFFFYVFvQ0FnSURBZmlBRnViMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3d3QkN5QUFJQVlRRDBLQWdJQ0E0QUFMSVFFZ0RFRVFhaVFBSUFFTDBnTUNCMzhEZmlNQVFTQnJJZ1FrQUNBRVFRQTJBZ3dnQkVFQU5nSUlBa0FDUUNBRUlBQW9BaEFvQW5oSkJFQWdBQkRwQVF3QkN5QUFJQUVnQWlBQlFRQVFGQ0lMUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQ3lFQkRBSUxBa0FDUUNBTFFvQ0FnSUJ3VkEwQUlBQWdDeERLQVNJS1FRQklEUUVDUUNBS0JFQWdBQ0FFUVF4cUlBc1ExZ0ZGRFFFTUF3c2dBQ0FFUVFocUlBUkJER29nQzZkQkVSQ09BU0VKSUFRb0FnZ2hCU0FKUVFCSURRSUxJQVFvQWd3aENBTkFJQWNnQ0VZTkFRSkFJQW9FUUNBQUlBY1FxUVVpQmtVTkJBd0JDeUFBSUFVZ0IwRURkR29vQWdRUUdDRUdDd0ovQWtBZ0FDQUxJQVlnQXhENUJDSU5Rb0NBZ0lCd2d5SU1Rb0NBZ0lBd1VnUkFJQXhDZ0lDQWdPQUFVZzBCSUFBZ0JoQVREQVVMSUFBZ0N5QUdRUUFRMVFFTUFRc2dBQ0FMSUFZZ0RVRUhFQmtMSVFrZ0FDQUdFQk1nQjBFQmFpRUhJQWxCQUU0TkFBc01BUXNnQUNBRklBZ1FXa0VBSVFVZ0FDQUNFRndpREVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFRZ0N6Y0RHQ0FFSUF3M0F4QWdBQ0FESUFGQkFpQUVRUkJxRUNFaEFTQUFJQXdRRHlBQUlBc1FEd3dDQ3lBQUlBVWdCQ2dDREJCYUlBQWdDeEFQQzBLQWdJQ0E0QUFoQVFzZ0JFRWdhaVFBSUFFTFB3RUJmeUFCUVFBZ0FVRUFTaHNoQVFOQUFrQWdBU0FEUmdSQVFYOGhBd3dCQ3lBQUlBTkJBM1JxS0FJRUlBSkdEUUFnQTBFQmFpRUREQUVMQ3lBREMvOEVBZ0ovQkg0Q1FDQUNRdi8vLy85dldBUkFJQUFRSkF3QkN3SkFJQUFnQWtFOUVIRUVmMEtBZ0lDQU1DRUZRb0NBZ0lBd0lRWkNnSUNBZ0RBaENDQUFJQUpCUFNBQ1FRQVFGQ0lIUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUZCZ1FKQmdBSWdBQ0FIRUNZYkJVRUFDeUVESUFBZ0FrRStFSEVFUUVLQWdJQ0FNQ0VGUW9DQWdJQXdJUVpDZ0lDQWdEQWhDQ0FBSUFKQlBpQUNRUUFRRkNJSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFGQmdnUkJnQVFnQUNBSEVDWWJJQU55SVFNTElBQWdBa0UvRUhFRVFFS0FnSUNBTUNFRlFvQ0FnSUF3SVFaQ2dJQ0FnREFoQ0NBQUlBSkJQeUFDUVFBUUZDSUhRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRkJoQWhCZ0FnZ0FDQUhFQ1liSUFOeUlRTUxRb0NBZ0lBd0lRWUNRQ0FBSUFKQndBQVFjVVVFUUVLQWdJQ0FNQ0VJREFFTFFvQ0FnSUF3SVFVZ0FDQUNRY0FBSUFKQkFCQVVJZ2hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQXdDQ3lBRFFZREFBSEloQXdzQ1FBSkFJQUFnQWtIQkFCQnhSUTBBUW9DQWdJQXdJUVVnQTBHQUVISWhBeUFBSUFKQndRQWdBa0VBRUJRaUJrS0FnSUNBY0lNaUIwS0FnSUNBTUZFTkFFSER3Z0FoQkNBSFFvQ0FnSURnQUZFTkFTQUFJQVlRT0VVTkFRc0NRQ0FBSUFKQndnQVFjVVVFUUVLQWdJQ0FNQ0VGREFFTElBTkJnQ0J5SVFNZ0FDQUNRY0lBSUFKQkFCQVVJZ1ZDZ0lDQWdIQ0RJZ0pDZ0lDQWdEQlJEUUJCdE1JQUlRUWdBa0tBZ0lDQTRBQlJEUUVnQUNBRkVEaEZEUUVMSUFOQmdEQnhCRUJCc2VrQUlRUWdBMEdBeEFCeERRRUxJQUVnQlRjREdDQUJJQVkzQXhBZ0FTQUlOd01JSUFFZ0F6WUNBRUVBRHdzZ0FDQUVRUUFRRlFzZ0FDQUlFQThnQUNBR0VBOGdBQ0FGRUE4TFFYOEx3Z0VCQW44Z0FpZ0NCRVVFUUNBQ0tBSVlJZ01nQWlnQ0hDSUVOZ0lFSUFRZ0F6WUNBQ0FDUWdBM0FoZ0NRQ0FCS0FJQUJFQWdBaENmQlF3QkN5QUFJQUlwQXlBUUl3c2dBQ0FDS1FNb0VDTWdBaUFDS0FJQVFRRnJJZ00yQWdBQ1FDQURSUVJBSUFJb0FoQWlBeUFDS0FJVUlnUTJBZ1FnQkNBRE5nSUFJQUpDQURjQ0VDQUFRUkJxSUFJZ0FDZ0NCQkVBQUF3QkN5QUNRb0NBZ0lBd053TW9JQUpDZ0lDQWdEQTNBeUFnQWtFQk5nSUVDeUFCSUFFb0FneEJBV3MyQWd3TEM1VUJBUU4rSUFHOUlnSkMvLy8vLy8vLy8vLy9BSU1oQXlBQXZTSUVRdi8vLy8vLy8vLy8vd0NEUW9HQWdJQ0FnSUQ0L3dCYUJFQWdBMEtCZ0lDQWdJQ0ErUDhBVkE4TEFuOUJmeUFEUW9DQWdJQ0FnSUQ0L3dCV0lBQWdBV055RFFBYVFRRWdBQ0FCWkEwQUdrRUFJQUJFQUFBQUFBQUFBQUJpRFFBYUlBUkNBRk1FUUNBQ1FqK0hwMEYvY3c4TElBSkNQNGluQ3dzd0FDQUJRb0NBZ0lBUWhFS0FnSUNBY0lOQ2dJQ0FnREJSQkVBZ0FDQUJFRGNQQ3lBQUlBRkJPRUVBUVFBUXJRSUxLUUVCZnlBQ1FpQ0lwMEYxVHdSQUlBS25JZ01nQXlnQ0FFRUJhallDQUFzZ0FDQUJJQUlReFFVTFVnSUJmd0YrUW9DQWdJRGdBQ0VFSUFBZ0FTQUNFSk1CSWdNRWZpQURLQUlnSWdNb0Fnd29BaUF0QUFRRVFDQUNSUVJBUWdBUEN5QUFFR3RDZ0lDQWdPQUFEd3NnQXpVQ0VBVkNnSUNBZ09BQUN3czRBQ0FBSUFFZ0FoQ1RBU0lBUlFSQVFvQ0FnSURnQUE4TElBQW9BaUFvQWd3aUFDQUFLQUlBUVFGcU5nSUFJQUN0UW9DQWdJQndoQXRSQWdGK0FYOGdBQ0FBS1FPUUFVRURFRWtpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBSkJOQ0FCUVFNUUdSb0xJQUlMbFFFQkEzOGpBRUVRYXlJRUpBQWdCQ0FDTndNSUlBRW9BZ0FpQlNBQktBSUVJZ1kyQWdRZ0JpQUZOZ0lBSUFGQ0FEY0NBQ0FBSUFBZ0FVRWdhaUFEUVFOMGFpa0RBRUtBZ0lDQU1FRUJJQVJCQ0dvUUlSQVBJQUFnQVNrREVCQVBJQUFnQVNrREdCQVBJQUFnQVNrRElCQVBJQUFnQVNrREtCQVBJQUFvQWhBaUFFRVFhaUFCSUFBb0FnUVJBQUFnQkVFUWFpUUFDNDBCQVFOL0l3QkJFR3NpQkNRQUlBUWdBVGNEQ0NBRFFRRjBJUVpCQUNFREEwQUNRQUpBSUFOQkFrWU5BQ0FBUWN3QVFRRWdBeUFHYWtFQklBUkJDR29RendFaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQlFYOGhCU0FEUVFGSERRQWdBQ0FDS1FNQUVBOExJQVJCRUdva0FDQUZEd3NnQWlBRFFRTjBhaUFCTndNQUlBTkJBV29oQXd3QUN3QUx5QVlDQm44Q2ZpTUFRVEJySWdNa0FDQUJRUWhxSVFVZ0FVSElBR29oQmdKQUFrQUNRQUpBQTBBZ0FTZ0NUQ0lDSUFaR0RRUUNRQUpBQW44Q1FBSkFBa0FDUUNBQktBSUVJZ1FPQmdBQ0FnVUxBUVlMSUFJb0FnaEZEUUlnQUNBQkVPQUREQVlMQWtBQ1FDQUNLQUlJRGdJSUFBRUxJQUZCQkRZQ0JDQURJQUlwQXhBM0F5Z2dBQ0FBS1FOUUlBRWdBMEVvYWtFQUVQNEJJZ2hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5DaUFBSUFFMUFnQkNnSUNBZ0hDRUlBTkJBUkNFQlVVRVFDQURRb0NBZ0lBd053TVlJQU5DZ0lDQWdEQTNBeEFnQUNBSUlBTWdBMEVRYWhDdkFob2dBQ0FES1FNQUVBOGdBQ0FES1FNSUVBOExJQUFnQ0JBUERBb0xJQUFnQWlBQ0tRTVFFTjhEREFrTElBSXBBeEFpQ0VJZ2lLZEJkVThFUUNBSXB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFSQkFVY2dBaWdDQ0NJRVFRSkhja1VFUUNBQUlBZ1FpZ0ZCQVF3Q0N5QUJLQUpFSWdJZ0JLMDNBd0FnQWtFSWF5QUlOd01BSUFFZ0FrRUlhallDUkF0QkFBc2hBaUFCUVFNMkFnUWdBU0FDTmdJVUN5QUFJQVVRdEFJaUNVS0FnSUNBY0lNaUNFS0FnSUNBNEFCUkJFQWdBQ2dDRUNJQ0tRT0FBU0VJSUFKQ2dJQ0FnQ0EzQTRBQklBQWdBUkRnQXlBQUlBRW9Ba3dnQ0JEZkF5QUFJQWdRRHd3Q0N5QUpRdi8vLy84UFdBUkFJQUVvQWtSQkNHc2lBaWtEQUNFSUlBSkNnSUNBZ0RBM0F3QUNRQUpBSUFtbklnSU9Bd0VBQUFNTElBRWdBallDQkNBQUlBRWdDRUVBRVBvQ0lBQWdDQkFQREFNTElBTWdDRGNES0NBQUlBQXBBMUFnQVNBRFFTaHFRUUFRL2dFaUNVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRklBQWdBVFVDQUVLQWdJQ0FjSVFnQTBFUWFrRUFFSVFGQkVBZ0FDQUpFQThNQmdzZ0EwS0FnSUNBTURjRENDQURRb0NBZ0lBd053TUFJQUFnQ1NBRFFSQnFJQU1RcndJYUlBQWdDUkFQUVFBaEFRTkFJQUZCQWtZTkJpQUFJQU5CRUdvZ0FVRURkR29wQXdBUUR5QUJRUUZxSVFFTUFBc0FDeUFJUW9DQWdJQXdVZzBESUFFb0FrUkJDR3NpQWlrREFDRUlJQUpDZ0lDQWdEQTNBd0FnQUNBQkVPQURJQUFnQVNBSVFRRVErZ0lnQUNBSUVBOE1BUXNMRUFFQUN5QUFJQUZDZ0lDQWdEQkJBUkQ2QWd3Q0MwSFprUUZCcnZ3QVFiV1pBVUhiSlJBQUFBc2dBQ0FJRUE4TElBTkJNR29rQUF1bEF3SUVmd0YrSXdCQkVHc2lCaVFBQWtBQ1FBSkFBa0FnQWtFQVNBUkFJQVlnQWtILy8vLy9CM0UyQWdBZ0FVSEFBRUhjSWlBR0VFNGFEQUVMSUFBb0Fpd2dBazBOQWlBQ1JRUkFJQUZCOW9nQktBQUFOZ0FESUFGQjg0Z0JLQUFBTmdBQURBRUxJQUFvQWpnZ0FrRUNkR29vQWdBaUJFRUJjUTBESUFFaEFnSkFJQVJGRFFBZ0JDa0NCQ0lIUW9DQWdJQUlnMUFFUUNBRVFSQnFJUU1nQjZkQi8vLy8vd2R4SVFWQkFDRUNRUUFoQUFOQUlBSWdCVVpGQkVBZ0FDQUNJQU5xTFFBQWNpRUFJQUpCQVdvaEFnd0JDd3NnQUVHQUFVZ05Bd3NnQkVFUWFpRUZRUUFoQUNBQklRSURRQ0FBSUFlblFmLy8vLzhIY1U4TkFRSi9JQWRDZ0lDQWdBaURVRVVFUUNBRklBQkJBWFJxTHdFQURBRUxJQUFnQldvdEFBQUxJUU1nQWlBQmEwRTVTZzBCQW44Z0EwSC9BRTBFUUNBQ0lBTTZBQUFnQWtFQmFnd0JDeUFDSUFNUW9RTWdBbW9MSVFJZ0FFRUJhaUVBSUFRcEFnUWhCd3dBQ3dBTElBSkJBRG9BQUFzZ0FTRURDeUFHUVJCcUpBQWdBdzhMUWUvZkFFR3UvQUJCM3hkQm9ZRUJFQUFBQzBHUGtnRkJydndBUWVrWFFhR0JBUkFBQUF1SEFRRUVmeUFBUVJCcUlRTWdBVUhJQUdvaEJDQUJLQUpNSVFJRFFDQUNJQVJHUlFSQUlBSW9BZ1FoQlNBQUlBSXBBeEFRSXlBQUlBSXBBeGdRSXlBQUlBSXBBeUFRSXlBQUlBSXBBeWdRSXlBRElBSWdBQ2dDQkJFQUFDQUZJUUlNQVFzTElBRW9BZ1JCZm5GQkJFY0VRQ0FBSUFGQkNHb1EvZ0lMSUFNZ0FTQUFLQUlFRVFBQUMyQUJBbjhnQVNBQktBSUFRUUZySWdJMkFnQWdBa1VFUUNBQUlBRVEzUU1nQUNBQktRTVFFQ01nQUNBQktRTVlFQ01nQVNnQ0NDSUNJQUVvQWd3aUF6WUNCQ0FESUFJMkFnQWdBVUlBTndJSUlBQkJFR29nQVNBQUtBSUVFUUFBQ3d2ekF3SURmd0orSXdCQk1Hc2lBaVFBQWtBQ1FDQUFJQUZCS0dvUXRBSWlCVUtBZ0lDQWNJTWlCa0tBZ0lDQTRBQlJEUUFnQWlBQktBSmtRUWhySWdNcEF3QTNBeUFnQTBLQWdJQ0FNRGNEQUNBR1FvQ0FnSUF3VVFSQUlBQWdBQ0FCS1FNUVFvQ0FnSUF3UVFFZ0FrRWdhaEFoRUE4Z0FDQUNLUU1nRUE4Z0FDZ0NFQ0FCRU4wRERBSUxJQUFnQlJBUFFRQWhBeUFBSUFBcEExQWdBQ0FDUVNCcVFRQVEvZ0VoQlNBQUlBSXBBeUFRRHlBRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBRFFBSkFJQU5CQWtjRVFDQUNRUkJxSUFOQkEzUnFJQUFnQUNrRE1DQURRVFZxRUVraUJqY0RBQ0FHUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVnQTBFQlJnUkFJQUFnQWlrREVCQVBDeUFBSUFVUUR3d0RDeUFDUW9DQWdJQXdOd01JSUFKQ2dJQ0FnREEzQXdBZ0FDQUZJQUpCRUdvZ0FoQ3ZBaUVFSUFBZ0JSQVBRUUFoQXdOQUlBTkJBa1pGQkVBZ0FDQUNRUkJxSUFOQkEzUnFLUU1BRUE4Z0EwRUJhaUVEREFFTEN5QUVEUUlNQXdzZ0FTQUJLQUlBUVFGcU5nSUFJQWFuSUFFMkFpQWdBMEVCYWlFRERBQUxBQXNnQUNnQ0VDSURLUU9BQVNFRklBTkNnSUNBZ0NBM0E0QUJJQUlnQlRjREtDQUFJQUVwQXhoQ2dJQ0FnREJCQVNBQ1FTaHFFQ0VoQlNBQUlBSXBBeWdRRHlBQUtBSVFJQUVRM1FNZ0FDQUZFQThMSUFKQk1Hb2tBQXVmQXdJSGZ3RitJd0JCTUdzaUJpUUFBa0FnQVVLQWdJQ0FjRlFOQUNBQnB5SUVMd0VHUVRGSERRQWdCQ2dDSUNJRlJRMEFJQVVvQWdBTkFDQUNRaUNJcDBGMVR3UkFJQUtuSWdRZ0JDZ0NBRUVCYWpZQ0FBc2dBQ0FGUVJocUlBSVFJQ0FGSUFOQkFXb2lCRFlDQUFKQUlBUkJBa2NOQUNBRktBSVVEUUFnQUNnQ0VDSUVLQUtZQVNJSFJRMEFJQUFnQVNBQ1FRQWdCQ2dDbkFFZ0J4RTRBQXNnQTBFQVI2MUNnSUNBZ0JDRUlRRWdCU0FEUVFOMGFpSUVRUVJxSVFnZ0JDZ0NDQ0VFQTBBZ0JDQUlSa1VFUUNBRUtBSUVJUWNnQmlBRUtRTUlOd01BSUFZZ0JDa0RFRGNEQ0NBRUtRTVlJUXNnQmlBQ053TWdJQVlnQVRjREdDQUdJQXMzQXhBZ0FFSExBRUVGSUFZUW1nTWdCQ2dDQUNJSklBUW9BZ1FpQ2pZQ0JDQUtJQWsyQWdBZ0JFSUFOd0lBSUFBb0FoQWdCQkN1QWlBSElRUU1BUXNMSUFWQkFTQURhMEVEZEdvaUEwRUVhaUVISUFNb0FnZ2hCQU5BSUFRZ0IwWU5BU0FFS0FJQUlnVWdCQ2dDQkNJRE5nSUVJQU1nQlRZQ0FDQUVRZ0EzQWdBZ0FDZ0NFQ0FFRUs0Q0lBTWhCQXdBQ3dBTElBWkJNR29rQUF1b0FnSUVmd0Y4SXdCQkVHc2lCU1FBQTBBQ1FFRi9JUVFDUUFKQUFrQUNRRUVISUFKQ0lJaW5JZ1lnQmtFSGEwRnVTUnRCQ1dvT0VRSURBd01EQXdNREF3QUFBQUFEQXdRQkF3c2dBcWNoQTBFQUlRUU1Bd3RCQUNFRUlBSkNnSUNBZ01DQmdQei9BSHdpQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWZ1JBREFNTFFZQ0FnSUI0SVFNZ0FyOGlCMFFBQUFBQUFBRGd3V01OQWtILy8vLy9CeUVESUFkRUFBREEvLy8vMzBGa0RRSWdCNWxFQUFBQUFBQUE0RUZqQkVBZ0I2b2hBd3dEQzBHQWdJQ0FlQ0VEREFJTFFRQWhCQ0FGUVF4cUlBS25RUVJxUVFBUXFRRWdBQ0FDRUE4Z0JTZ0NEQ0VEREFFTElBQWdBaENOQVNJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTEN5QUJJQU0yQWdBZ0JVRVFhaVFBSUFRTHNRWUJEWDhqQUVId0FHc2lCeVFBQWtBQ1FBSi9JQUlnQWtFQmF5SUZjVVVFUUNBQktBSU1RUVYwSUFFb0FnaEJJQ0FGWjJzaUNXOGlCV3NnQ1VFQUlBVkJBRW9iYWlFTklBbEJJQ0FKUWY4QmNXNGlER3doRGlBQkRBRUxJQUlRbHdVaENDQUJLQUlBSVFVZ0IwSUFOd0lZSUFkQ2dJQ0FnSUNBZ0lDQWZ6Y0NFQ0FISUFVMkFnd2dCMEVNYWlBRElBSkIzcWdFYWkwQUFDSU1ha0VCYXlBTWJpSU5FRUVOQVVFQUlRVWdCeWdDRENJTEtBSUFRUUJCQkVIRUFDQUhLQUlZSWdsQkFXdG5RUUYwYXlBSlFRSkpHeUlLUVJSc0lBc29BZ1FSQVFBaUJrVU5BUU5BSUFVZ0NrWkZCRUFnQnlnQ0RDRVFJQVlnQlVFVWJHb2lEa0lBTndJTUlBNUNnSUNBZ0lDQWdJQ0FmemNDQkNBT0lCQTJBZ0FnQlVFQmFpRUZEQUVMQzBFQUlRVWdCaUFIS0FJY0lBRWdDVUVBSUFrZ0NFRWdJQWhCQVd0bmEwRUFJQWhCQWs4YkVLRUVJUWdEUUNBRklBcEdSUVJBSUFZZ0JVRVViR29RR3lBRlFRRnFJUVVNQVFzTFFRQWhDU0FMS0FJQUlBWkJBQ0FMS0FJRUVRRUFHaUFJRFFFZ0RDQU5iQ0FEYXlFTFFRRWhEaUFIUVF4cUN5RUlRWDhnQ1hSQmYzTWhFRUVBSVFvZ0FrRUtSeUVSSUF3aEJRTkFJQU1nQ2swTkFpQUZJQXhHQkVBZ0RTQU9heUVOQWtBZ0NVVUVRRUVBSVFVZ0RTQUlLQUlNU1FSQUlBZ29BaEFnRFVFQ2RHb29BZ0FoQlFzZ0RDRUdJQkZGQkVBRFFDQUdRUUJNRFFNZ0JrRUJheUlHSUFkQklHcHFJQVVnQlVFS2JpSUZRZllCYkdwQk1ISTZBQUFNQUFzQUN3TkFJQVpCQUV3TkFpQUdRUUZySWdZZ0IwRWdhbXBCTUVIWEFDQUZJQVVnQW00aUJTQUNiR3NpRDBFS1NCc2dEMm82QUFBTUFBc0FDeUFJS0FJUUlBZ29BZ3dnRFJCb0lRWWdEQ0VGQTBBZ0JVRUFUQTBCSUFWQkFXc2lCU0FIUVNCcWFrRXdRZGNBSUFZZ0VIRWlEMEVLU0JzZ0QybzZBQUFnQmlBSmRpRUdEQUFMQUFzZ0N5RUZRUUFoQ3dzQ1FDQUtJQVFpQmtrTkFDQURJUVlnQkNBS1J3MEFJQUJCTGhBUkN5QUFJQWRCSUdvZ0JXb2dEQ0FGYXlJUElBWWdDbXNpQmlBR0lBOUtHeUlHRUhJZ0JpQUthaUVLSUFVZ0Jtb2hCUXdBQ3dBTElBQkJBVFlDRENBSFFReHFJUWdMSUFFZ0NFY0VRQ0FJRUJzTElBZEI4QUJxSkFBTHdnRUNBMzhCZmlBQUlBQkJIM1VpQTNNZ0Eyc2hBMEVBQW44Z0FTQUJRUUZySWdSeFJRUkFRU0FnQkdjaUJXc2hCQ0FDQkVCQkh5QUZhMEVBSUFCQkFFNGJJQU5xSUFSdURBSUxJQVJCQUNBQlFRSlBHeUFEYkF3QkN5QUFRWDl6UVI5MklRUWdBVUVDYXlFQklBUUNmaUFDQkVBZ0E2MGlCaUFCUVFOMElnRkI1S0VFYWpVQ0FINUNJSWdnQVVIZ29RUnFOUUlBSUFaK2ZFSWZpQXdCQ3lBQlFRSjBRWUNrQkdvMUFnQWdBNjErUWgySUM2ZHFDeUlCYXlBQklBQkJBRWdiQzBnQkFuOGpBRUVRYXlJQ0pBQkJmeUVEQWtBZ0FDQUNRUXhxSUFFUXVnRU5BQ0FDS0FJTUlnTkJKV3RCWEVzTkFDQUFRZG1KQVVFQUVGQkJmeUVEQ3lBQ1FSQnFKQUFnQXd0MUFRRi9Ba0FnQVVLQWdJQ0FjSU5DZ0lDQWdPQitVUVJBREFFTEFrQWdBVUtBZ0lDQWNGUU5BQ0FCcHlJQ0x3RUdRU0ZIRFFBZ0Fpa0RJQ0lCUW9DQWdJQndnMEtBZ0lDQTRINVNEUUFNQVFzZ0FFR2lMRUVBRUJWQ2dJQ0FnT0FBRHdzZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBSUFFTHJnSUNBWHdCZndKQUEwQUNRQUpBQWtBQ1FBSkFRUWNnQWtJZ2lLY2lCQ0FFUVFkclFXNUpHMEVKYWc0UkFnTURBd01EQXdNREFBQUFBQU1EQkFFREN5QUJJQUxFTndNQURBVUxJQUpDZ0lDQWdNQ0JnUHovQUh3aUFrTC8vLy8vLy8vLy8vOEFnMEtCZ0lDQWdJQ0ErUDhBV2dSQUlBRkNBRGNEQUF3RkN5QUN2eUlEUkFBQUFBQUFBT0REWXdSQUlBRkNnSUNBZ0lDQWdJQ0FmemNEQUF3RkN5QURSQUFBQUFBQUFPQkRaQVJBSUFGQy8vLy8vLy8vLy8vL0FEY0RBQXdGQ3lBQkFuNGdBNWxFQUFBQUFBQUE0RU5qQkVBZ0E3QU1BUXRDZ0lDQWdJQ0FnSUNBZndzM0F3QU1CQXNnQVNBQ3AwRUVha0VBRUlJREdpQUFJQUlRRHd3REN5QUFJQUlRalFFaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkN3c2dBVUlBTndNQVFYOFBDMEVBQzdFQ0FRSi9Jd0JCSUdzaUJDUUFBa0FDUUFKQUlBSW9BZ3hGQkVBQ1FBSkFBa0FDUUNBQ0tBSUlRZjcvLy84SGF3NENBUUFDQ3lBQUVEVU1BZ3NnQWlnQ0JBMERDeUFBSUFJUVJCb0xRUUFoQWlBQlJRMERJQUZDQUJBd0dnd0RDeUFDS0FJRVJRMEJDeUFBRURWQkFTRUNJQUZGRFFFZ0FVSUFFREFhREFFTElBQWdBaUFDS0FJSVFRRnFRUUp0UVFFUWtRWWdBRUVCRU5FQkdpQUJJZ05GQkVBZ0FDZ0NBQ0VESUFSQ0FEY0NHQ0FFUW9DQWdJQ0FnSUNBZ0g4M0FoQWdCQ0FETmdJTUlBUkJER29oQXdzZ0F5QUFJQUJCLy8vLy93TkJBUkJER2lBRElBTW9BZ1JCQVhNMkFnUWdBeUFESUFKQi8vLy8vd05CQVJETEFScEJJQ0VDSUFNb0FnaEIvLy8vL3dkSEJFQWdBeWdDREVFQVIwRUVkQ0VDQ3lBQkRRQWdBeEFiQ3lBRVFTQnFKQUFnQWdzTUFDQUFJQUVRaUFOQkFFd0xEUUFnQUNBQklBSkJBaERqQXd2UkRBRUlmeU1BUVlBQmF5SUZKQUFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBU2dDREFSQUlBSW9BZ3dOQVFzZ0FpZ0NDRUdBZ0lDQWVFWUVRQ0FBUWdFUU1Cb01Dd3NnQVNnQ0NFSC8vLy8vQjBZTkNTQUFRZ0VRTUJvQ1FDQUJJQUFRMHdFaUF5QUVRWUNBQkhGRmNrVUVRQ0FDS0FJSVFmNy8vLzhIVGcwTERBRUxJQU1OQWdzZ0FTZ0NCRVVOQ2lBQ0tBSUlRZi8vLy84SFJnMEpEQW9MSUFBb0FnQWhCeUFGUWdBM0Fqd2dCVUtBZ0lDQWdJQ0FnSUIvTndJMElBVWdCellDTUNBRlFUQnFJQUVRUkJvZ0FoQ3hBaUVLSUFRaENDQUJLQUlFQkVBZ0NrRUFTQVJBSUFBUU5TQUZRVEJxRUJ0QkFTRUdEQXdMSUFVZ0JTZ0NORUVCY3pZQ05DQUtSU0lNSUFSQkJuRkJBa1p4SUFSeklRZ0xJQUJDQVJBd0dpQUZRVEJxSUFBUWdnSU5CQ0FGUWdBM0FpZ2dCVUtBZ0lDQWdJQ0FnSUIvTndJZ0lBVWdCellDSENBRlFnQTNBaFFnQlVLQWdJQ0FnSUNBZ0lCL053SU1JQVVnQnpZQ0NDQUZRUnhxSWdFZ0JVRXdhaUlKUVNCQkFoQ2ZCQ0FGUVFocUlnWWdDVUVnUVFNUW53UWdBU0FCSUFKQklDQUNLQUlFUVFKekVFTWFJQVlnQmlBQ1FTQWdBaWdDQkVFRGN4QkRHa0VBSVFZQ1FDQUZLQUlRUVFCTURRQWdCVUlBTndKa0lBVkNnSUNBZ0lDQWdJQ0FmemNDWENBRklBYzJBbGdnQlVJQU53SlFJQVZDZ0lDQWdJQ0FnSUNBZnpjQ1NDQUZJQWMyQWtRZ0JVSEVBR29pQ1VFZ1FRTVEwd0lnQlVJQU53SjRJQVZDZ0lDQWdJQ0FnSUNBZnpjQ2NDQUZJQVVvQWxnMkFtd2dCVUhzQUdvaUIwR0FnSUNBQWtFQlFSd2dDRUVGZGtFL2NTSUJhM1FnQVVFL1Joc2lBYXdRTUJvZ0JVSFlBR29pQ3lBSklBZEJJRUVERUVNYUlBY1FHeUFMSUFWQkhHb1FzZ0lFUUNBRlFkZ0FhaEFiSUFWQnhBQnFFQnNnQUVFQUlBTWdDQkNyQkNFR0RBRUxJQVZCeEFCcUlnZEJJRUVDRU5NQ0lBVkIyQUJxSWdrZ0IwRUJJQUVnQTBFQmF5QUlRUngwUVI5MWNXb2lBV3VzUVNCQkFoRFVBaUFGUVFocUlBa1FzZ0lFUUNBRlFkZ0FhaEFiSUFWQnhBQnFFQnNnQ0VFSGNVRURSZ1JBSUFCQ0FSQXdHaUFBUVFNZ0FXczJBZ2hCR0NFR0RBSUxJQUJCQUJDSkFVRVlJUVlNQVFzZ0JVSEVBR29RR3lBRlFkZ0FhaEFiQ3lBRlFSeHFFQnNnQlVFSWFoQWJJQVlOQkNBRVFRZHhJUVlnQ2tFQVRnMENJQVpCQmtZTkEwRUFJUWNnQUNnQ0FDRUpJQVZCTUdvUXNRSWhBUUpBUVFBZ0Ntc2lCRUVnVHdSQUlBRkZEUUVNQlFzZ0FVRi9JQVIwUVg5emNRMEVJQUVnQkhVaEJ3c2dCU2dDUUNBRktBSThJZ3NnQVNBRktBSTRheUFMUVFWMGFoQm9RUWR4UVFGSERRTWdCVUlBTndKNElBVkNnSUNBZ0lDQWdJQ0FmemNDY0NBRklBazJBbXdnQlVIc0FHb2dCVUV3YWhCRUdpQUZJQVVvQW5RZ0FXczJBblJCQUNFQkEwQWdBU0FFUmcwQ0lBRUVRQ0FGUWV3QWFpQUFFRVFhQ3lBQlFRRnFJUUVnQUVFQUlBVkI3QUJxRUpFRlJRMEFDd3dEQ3lBQ0tBSUlRZjcvLy84SGF3NENCZ2NGQ3lBQUlBQW9BZ2dnQjJvMkFnZ2dCVUV3YWlBQUVFUWFJQVVnQWlnQ0VEWUNmQ0FGSUFJb0FndzJBbmdnQlNBQ0tBSUVOZ0p3SUFVZ0FpZ0NDQ0FLYXpZQ2RDQUZRZXdBYWlFQ0N5QUZLQUk0SWdFZ0JVRXdhaEN4QW1zaUJFRUJSZ1JBSUFWQk1Hb2lCQ0FDSUFGQkFXdXNRU0JCQVJEVUFpQUZRUVJxSUFSQkFCQ3BBU0FBUWdFUU1Cb2dBQ0FGS0FJRUlBTWdDQkRNQVNFR0RBSUxJQU5CLy8vLy93TkdCRUFnQlVIWUFHb2dBa0VBRUtrQklBSW9BZ1FOQXlBRktBSllJZ0ZCLy8vLy93Rk1CRUFnQUNBRlFUQnFJQUZCLy8vLy93TkJBUkNpQkNFR0RBTUxJQVZCTUdvUUd5QUFRUUJCLy8vLy93TWdDQkNyQkNFR0RBZ0xJQUlvQWdoQklFNEVRQ0FHUVFaR0RRRWdBaWdDQkEwQklBQWdBaUFFUVFGcnJFRWdRUUVRMUFJZ0JVRUVhaUFBUVFBUXFRRWdCU2dDQkNBRFN3MEJDeUFBSUFWQk1Hb2dBeUFJUWNnQUlBSVFuZ1FoQmd3QkN5QUFJQVZCTUdvZ0F5QUlRY2tBSUFJUW5nUWhCZ3NnQlVFd2FoQWJJQUFnRERZQ0JBd0ZDMEhPMEFCQjFQd0FRYUVsUWZFaEVBQUFDeUFCS0FJRUlBSVFzUUpGY1NFRElBSW9BZ1FnQVNnQ0NFR0FnSUNBZUVaR0JFQWdBQ0FERUl3QlFRSWhCaUFDS0FJRVJRMEREQVFMSUFBZ0F4Q0pBUXdDQ3lBQ0tBSUVJQU5CQUVwR0JFQWdBRUVBRUlrQkRBSUxJQUJCQUJDTUFRd0JDeUFBRURVTFFRQWhCZ3NnQlVHQUFXb2tBQ0FHQzFNQkFuOGpBRUVnYXlJRUpBQWdBQ2dDQUNFRklBUkNBRGNDR0NBRVFvQ0FnSUNBZ0lDQWdIODNBaEFnQkNBRk5nSU1JQVJCREdvaUJTQUFJQUVnQWlBREVPUURJUUFnQlJBYklBUkJJR29rQUNBQUM0Z0NBZ0ovQVg0akFFRVFheUlFSkFBQ1FBSkFJQUZDZ0lDQWdIQ0RRb0NBZ0lEZ2ZsSU5BQ0FCcHlFREFrQWdBa1VOQUNBRVFRaHFJQU5CQkdwQkFCQ0NBdzBBSUFRcEF3Z2lCVUtCZ0lDQWdJQ0FjRk1nQlVMLy8vLy8vLy8vRDFWeURRQWdBQ0FCRUE4Z0JVS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0JVTC8vLy8vRDRNaEFRd0NDMEtBZ0lDQXdINGdCYm05SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2hBUXdCQ3lBREtBSU1RWUNBZ0lCNFJ3MEFJQU1vQWdoRkRRQWdBeWdDQUVFQlJ3MEJJQU5CQURZQ0NBc2dCRUVRYWlRQUlBRVBDMEhqakFGQnJ2d0FRYkhnQUVHU2pBRVFBQUFMUUFFRGYwRUJJQUJCM3FnRWFpMEFBQ0lCSUFGQkFVMGJJUU5CQVNFQ0lBQWhBUU5BSUFJZ0EwWkZCRUFnQWtFQmFpRUNJQUFnQVd3aEFRd0JDd3NnQVF1MkZRTUpmd3grQW53akFFRkFhaUlDSkFBZ0FrRUFRY0FBRUNzaEJDQUJRUUJCMEFFUUt5SUNJQUExQWhBM0F4Z2dBaUFBTlFJVU53TUFJQUExQWhnaEN5QUNRZ0kzQXlBZ0FpQUxOd01JSUFJZ0FDZ0NRRUVEZEVId0FtcXROd01RSUFCQnpBQnFJUUVnQUVISUFHb2hDQU5BSUFFb0FnQWlCU0FJUmtVRVFDQUZLQUlRSVFFZ0FpQUNLUU1nUWdKOE53TWdJQUlnQWlrREVDQUFLQUpBUVFOMFFZZ0NhcTE4TndNUUlBSWdBaWtEd0FFZ0JUTUJDSHczQThBQklBSWdBaWtEeUFFZ0JUUUNESHczQThnQkFrQWdBVVVOQUNBQkxRQVFEUUFnQVNnQ0dDRURJQUlnQWlrRGFFSUJmRGNEYUNBQ0lBSXBBM0FnQTBFQ2RDQUJLQUljUVFOMGFrRTBhcTE4TndOd0N5QUZRZVFCYWlFQklBVkI0QUZxSVFrRFFDQUpJQUVvQWdBaUEwY0VRQ0FDSUFJcEF5QWlEVUlCZkNJTU53TWdJQUlnQWlrREVFTHdBSHdpQ3pjREVDQURLQUlJQkVBZ0FpQU5RZ0o4SWd3M0F5QWdBaUFMSUFNb0FneEJBM1N0ZkNJTE53TVFDd0pBSUFNb0FoUkZEUUFnQWlBTVFnRjhOd01nSUFJZ0N5QURLQUlZSWdaQkZHeXRmRGNERUVFQUlRRURRQ0FCSUFaT0RRRUNRQ0FES0FJVUlBRkJGR3hxSWdjb0FnZ05BQ0FIS0FJRVJRMEFJQUlnQWlrRElFSUJmRGNESUNBSEtBSUVLUU1ZSUFRUW5RRWdBeWdDR0NFR0N5QUJRUUZxSVFFTUFBc0FDeUFES0FJZ0JFQWdBaUFDS1FNZ1FnRjhOd01nSUFJZ0Fpa0RFQ0FES0FJa1FRSjByWHczQXhBTElBTW9BaXdFUUNBQ0lBSXBBeUJDQVh3M0F5QWdBaUFDS1FNUUlBTW9BakJCREd5dGZEY0RFQXNnQXlrRE9DQUVFSjBCSUFNcEEwQWdCQkNkQVNBRFFRUnFJUUVNQVFzTElBVkJCR29oQVF3QkN3c2dBRUhVQUdvaEFTQUFRZEFBYWlFSUEwQWdBU2dDQUNJRElBaEdSUVJBQWtBQ1FBSkFJQU5CQkdzdEFBQkJEM0VPQWdFQUFnc2dBeWdDR0FSL0lBTXZBU0lnQXk4QklHcEJCSFJCUUdzRlFjQUFDeUVHSUFNb0Fpd0VRRUVBSVFFZ0F5Z0NNQ0lISVFVRFFDQUJJQVZPUlFSQUlBTW9BaXdnQVVFRGRHb3BBd0FnQkJDZEFTQUJRUUZxSVFFZ0F5Z0NNQ0VGREFFTEN5QUhRUU4wSUFacUlRWUxJQU1vQWh3RVFDQURLQUkwUVFOMElBWnFJUVlMQWtBZ0F5OEFDU0lGUVlBZ2NRMEFJQU1vQWd4RkRRQWdCQ0FFS1FNb0lBTTBBaEI4TndNb0N3Si9RUUFnQlVHQUNIRkZEUUFhQW44Z0F5Z0NURVVFUUNBR1FSaHFJUVpCQUF3QkN5QUdJQU1vQWtCcVFSbHFJUVpCQVFzaUFTQURLQUpFSWdWRkRRQWFJQVFnQkNrRE1FSUJmRGNETUNBRUlBUXBBemdnQmF4OE53TTRJQUZCQVdvTElRRWdCQ0FFS1FNWVFnRjhOd01ZSUFRZ0JDc0RJQ0FHdDZBNUF5QWdCQ0FFS3dNQUlBRzNvRGtEQUF3QkN5QURLQUlJSVFjZ0FpQUNLUU5JUWdGOE53TklBa0FnQXlnQ0RFVU5BQ0FDSUFJcEF5QkNBWHczQXlBZ0FpQUNLUU5nSUFjb0FoeEJBM1N0ZkRjRFlDQUNJQUlwQTFnZ0J5Z0NJQ0lHckh3M0ExZ2dCMEV3YWlFQlFRQWhCUU5BSUFVZ0JrNE5BUUpBSUFFb0FnUkZEUUFnQVNnQ0FFSC8vLy8vQTBzTkFDQURLQUlNSUFWQkEzUnFLUU1BSUFRUW5RRWdCeWdDSUNFR0N5QUZRUUZxSVFVZ0FVRUlhaUVCREFBTEFBc2dCeTBBRUVVRVFDQUhLQUlZSVFFZ0FpQUNLUU5vUWdGOE53Tm9JQUlnQWlrRGNDQUJRUUowSUFjb0FoeEJBM1JxUVRScXJYdzNBM0FMQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0EwRUNheThCQUVFQ2F3NGpBQWtCQVFFQkFBa0JDUUlEQkFVSkJ3WUlDQWtKQ1FrSkNRa0pDUWtKQ1FFQkNRRUpDeUFDSUFJcEE2Z0JRZ0Y4TndPb0FTQURRUU5yTFFBQVFRaHhSUTBKSUFJZ0Fpa0RzQUZDQVh3M0E3QUJJQU1vQWh4RkRRa2dBaUFDS1FNZ1FnRjhOd01nSUFJZ0Fpa0RFQ0FES0FJZ1FRTjByWHczQXhBZ0FpQUNLUU80QVNBRE5RSWdmRGNEdUFGQkFDRUJBMEFnQVNBREtBSWdUdzBLSUFNb0Fod2dBVUVEZEdvcEF3QWdCQkNkQVNBQlFRRnFJUUVNQUFzQUN5QURLUU1ZSUFRUW5RRU1DQXNnQWlBQ0tRT2dBVUlCZkRjRG9BRU1Cd3NnQXlnQ0hDSUpSUTBHSUFNb0FoZ2hCeUFDSUFJcEF5QkNBWHczQXlBZ0FpQUNLUU9BQVNBSEtBSThJZ1pCQW5TdGZEY0RnQUZCQUNFQkEwQWdBU0FHVGcwSEFrQWdDU0FCUVFKMGFpZ0NBQ0lGUlEwQUlBSUNma1FBQUFBQUFBRHdQeUFGS0FJQXR5SVhveUFDS1FNZ3VhQWlHSmxFQUFBQUFBQUE0RU5qQkVBZ0dMQU1BUXRDZ0lDQWdJQ0FnSUNBZndzM0F5QWdBZ0orUkFBQUFBQUFBRUJBSUJlaklBSXBBNEFCdWFBaUY1bEVBQUFBQUFBQTRFTmpCRUFnRjdBTUFRdENnSUNBZ0lDQWdJQ0Fmd3MzQTRBQklBVW9BaEFpQ2lBRlFSaHFSdzBBSUFvcEF3QWdCQkNkQVNBSEtBSThJUVlMSUFGQkFXb2hBUXdBQ3dBTElBTW9BaGdoQmtFQUlRRURRQ0FCSUFZb0FoQWlCVTVGQkVBZ0JpQUJRUU4wYWlrREdDQUVFSjBCSUFGQkFXb2hBUXdCQ3dzZ0FpQUNLUU1nUWdGOE53TWdJQUlnQWlrREVDQUZRUU4wUVJocXJYdzNBeEFNQlFzZ0F5Z0NHQ0lHUlEwRVFRQWhBUU5BSUFFZ0JpMEFCU0lGVDBVRVFDQUdJQUZCQTNScUtRTUlJQVFRblFFZ0FVRUJhaUVCREFFTEN5QUNJQUlwQXlCQ0FYdzNBeUFnQWlBQ0tRTVFJQVd0UWdPR2ZFSUlmRGNERUF3RUN5QURLQUlZSUFRUXR3UWdBeWdDSENBRUVMY0VEQU1MSUFNb0FoZ2lBVVVOQWlBQktRTUFJQVFRblFFZ0FpQUNLUU1nUWdGOE53TWdJQUlnQWlrREVFSVlmRGNERUF3Q0N5QURLQUlZSWdGRkRRRWdBaUFDS1FNZ0lndENBWHczQXlBZ0FpQUNLUU1RUWh4OElndzNBeEFnQVNnQ0NFVU5BU0FDSUF0Q0FudzNBeUFnQWlBTUlBRTBBZ0I4TndNUURBRUxJQU1vQWhoRkRRQWdBaUFDS1FNZ1FnRjhOd01nQ3lBRFFRUnFJUUVNQVFzTElBSWdBaWtEVUNBQ0tRTklJZzVDTUg1OElnODNBMUFnQWlBQ0tRTVFJQUFvQXN3QklnRkJBblN0ZkNJUU53TVFRUUFoQlNBQlFRQWdBVUVBU2hzaEF5QUNLUU1nSVFzRFFDQURJQVZHUlFSQUlBQW9BdFFCSUFWQkFuUnFJUUVEUUNBQktBSUFJZ0VFUUNBQktBSVlJUVlnQWlBQ0tRTm9RZ0Y4TndOb0lBSWdBaWtEY0NBR1FRSjBJQUVvQWh4QkEzUnFRVFJxclh3M0EzQWdBVUVvYWlFQkRBRUxDeUFGUVFGcUlRVU1BUXNMSUFJZ0MwSURmQ0lSTndNZ0lBSWdBQ2dDS0NJR3JEY0RLQ0FDSUFBb0Fpd2lBeUFBS0FJa2FrRUNkSzBpQ3pjRE1FRUFJUUVnQTBFQUlBTkJBRW9iSVFVRFFDQUJJQVZIQkVBZ0FDZ0NPQ0FCUVFKMGFpZ0NBQ0lEUVFGeFJRUkFJQUlnQ3lBREtBSUVJZ05CSDNVZ0EwSC8vLy8vQjNFZ0EwRWZkblJxUVJGcXJYd2lDemNETUFzZ0FVRUJhaUVCREFFTEN5QUNBbjRnQkNzRENCQ3hBeUlYbVVRQUFBQUFBQURnUTJNRVFDQVhzQXdCQzBLQWdJQ0FnSUNBZ0lCL0N5SU1Od000SUFJQ2ZpQUVLd01RRUxFREloZVpSQUFBQUFBQUFPQkRZd1JBSUJld0RBRUxRb0NBZ0lDQWdJQ0FnSDhMSWcwM0EwQWdBaUFFS1FNWUloSTNBM2dnQWdKK0lBUXJBeUFRc1FNaUY1bEVBQUFBQUFBQTRFTmpCRUFnRjdBTUFRdENnSUNBZ0lDQWdJQ0Fmd3NpRXpjRGdBRWdBaUFFS1FNb0loUTNBNGdCSUFJZ0JDa0RNQ0lWTndPUUFTQUNJQVFwQXpnaUZqY0RtQUVnQkNzREFDRVhJQUlnQWlrRGNDQUNLUU5nSUJZZ0ZDQVBJQkI4SUExOElCTjhmSHdnQzN4OGZEY0RFQ0FDQW40Z0Z4Q3hBeUFHdDZBZ0RMbWdJQTY1b0NBQ0tRTm91YUFnRXJtZ0lCVzVvQ0FSdWFBaUY1bEVBQUFBQUFBQTRFTmpCRUFnRjdBTUFRdENnSUNBZ0lDQWdJQ0Fmd3MzQXlBZ0JFRkFheVFBQzFBQkFuOERRQ0FCTEFBQUlnUUVRQ0FFSUFBc0FBQWlBMEVnYWlBRElBTkJ3UUJyUVJwSkcwY0VRRUVBRHdVZ0FVRUJhaUVCSUFCQkFXb2hBQXdDQ3dBTEN5QUNCRUFnQWlBQU5nSUFDMEVCQzcwSEFncC9BWDRqQUVIZ0FHc2lBeVFBUW9DQWdJRGdBQ0VOQWtBZ0FDQURRUXhxSUFFUXV3RWlCa1VOQUNBR0tBSUVJZ3doQlNBR0tBSUlJZ1JCZ0lDQWdIaEdCRUFnQmtFQU5nSUVRUUFoQlFzZ0JpZ0NBQ0VLSUFOQ0FEY0RVQ0FEUWdBM0EwZ2dBeUFLTmdKY0lBTkJ4UUEyQWxnQ2Z3SkFBa0FnQkVILy8vLy9CMFlFUUNBRFFjZ0Fha0dCZ3dFUSt3SU1BUXNnQlFSQUlBTkJ5QUJxUVMwUUVTQUdLQUlJSVFRTElBUkIvdi8vL3dkR0JFQWdBMEhJQUdwQjlSd1Erd0lNQVF0QkFDRUZJQU5DQURjQ1FDQURRb0NBZ0lDQWdJQ0FnSDgzQWpnZ0F5QUtOZ0kwSUFJZ0FrRUJheUlJY1VVRVFFRWdJQWhuYTBFQUlBSkJBazhiSVFVTEFrQUNRQUpBQWtBZ0JRUkFJQU5CTkdvZ0JoQkVEUUVnQTBFMGFrRUFRUkVRemdGQklIRU5BU0FES0FJOElnUWdCVUVCYTBFQUlBUkJBRTRiYWlBRmJTRUZJQVJCZ0lDQWdIaEdCRUFnQTBISUFHcEJxSkFCRVBzQ0RBVUxRUUFoQkNBRlFRQktEUUlnQTBISUFHcEJ2WkFCRVBzQ1FRQWdCV3NoQWdOQUlBSWdCRVlOQlNBRFFjZ0Fha0V3RUJFZ0JFRUJhaUVFREFBTEFBc2dBeUFHS0FJUU5nSXdJQU1nQmlnQ0RDSUZOZ0lzSUFOQkFEWUNKQ0FESUFRMkFpZ2dCRUVBSUFSQkFFb2JJQUpCQVJDTkJVRUJhaUVJQWtBZ0JRUkFJQWdnQWtFQUVJMEZJUVZCRUNFRUEwQWdBMEUwYWlJTElBSkJBQ0FFSUFWcUlnbEJBV29pQjBIZ0R4RDhBaUFMSUFzZ0EwRWdhaUFIUWVBUEVFTnlJZ2RCSUhFTkF5QUhRUkJ4UlEwQ0lBTkJOR29nQXlnQ1BFRUJJQWtRNFFNTkFpQUVRUUp0SUFScUlRUU1BQXNBQ3lBRFFUUnFJQU5CSUdvUVJBMEJEQU1MSUFOQk5HcEJBUkRSQVVFZ2NVVU5BZ3NnQTBFMGFoQWJEQVFMSUFOQnlBQnFJQU5CTkdvZ0FpQUZJQVVRakFVTUFRc2dBeWdDVENFRklBTkJ5QUJxSUFOQk5Hb2dBaUFJSUFnUWpBVWdBeWdDVENJSklBVkJBV29pQWlBQ0lBbEpHMEVCYXlFSUlBTW9Ba2doQnlBRklRUURRQUpBSUFrZ0JDSUNRUUZxSWdSTkJFQWdDQ0VDREFFTElBSWdCMm90QUFCQk1FY05BQ0FFSUFkcUxRQUFRUzVIRFFFTEN5QUNJQVZORFFBZ0JTQUhhaUFDSUFkcUlBa2dBbXNRbkFFZ0F5QUZJQUpySUFscU5nSk1DeUFEUVRScUVCc0xJQU5CeUFCcVFRQVFFU0FES0FKVURRQWdBeWdDU0F3QkMwRUFJQU1vQWtnaUFrVU5BQm9nQ2lnQ0FDQUNRUUFnQ2lnQ0JCRUJBQnBCQUFzaEJDQUdJQXcyQWdRZ0FDQUdJQU5CREdvUVhpQUVSUVJBSUFBUWZBd0JDeUFBSUFRUVlpRU5JQUFvQXRnQklnQW9BZ0FnQkVFQUlBQW9BZ1FSQVFBYUN5QURRZUFBYWlRQUlBMEx3M1VDRW44QmZpTUFRYUFHYXlJREpBQWdBU2dDeUFFaUJFRUFJQVJCQUVvYklRWURRQ0FDSUFaR1JRUkFJQUVvQXN3QklBSkJBM1JxUVg4MkFnUWdBa0VCYWlFQ0RBRUxDeUFCS0FJOEJFQWdBU2dDekFGQmZqWUNEQXRCQUNFQ0lBRW9BbndpQmtFQUlBWkJBRW9iSVFZQ2ZnSkFBa0FEUUNBQ0lBWkdCRUFDUUVFQ0lRSkJBaUFFSUFSQkFrd2JJUWdEUUFKQUlBSWdDRVlFUUVFQUlRSURRQ0FDSUFaR0RRSUNRQ0FCS0FKMElBSkJCSFJxSWdRb0FnaEJBRTROQUNBRUtBSUVJZ2hCQWtnTkFDQUVJQUVvQXN3QklnUWdCQ0FJUVFOMGFpZ0NBRUVEZEdvb0FnUTJBZ2dMSUFKQkFXb2hBZ3dBQ3dBTElBRW9Bc3dCSWdjZ0FrRURkR29pQkNnQ0JFRUFTQVJBSUFRZ0J5QUVLQUlBUVFOMGFpZ0NCRFlDQkFzZ0FrRUJhaUVDREFFTEN3SkFJQUVvQWtSRkRRQUNRQ0FCS0FJZ0RRQWdBUzBBYmtFQmNRMEFJQUVnQUNBQlFkSUFFRTgyQXBBQklBRW9BanhGRFFBZ0FTQUFJQUZCMHdBUVR6WUNsQUVMQWtBZ0FTZ0NUQ0lJUlEwQUlBRW9BcWdCUVFCSUJFQWdBU0FBSUFFUXlnTTJBcWdCQ3lBQktBS3NBVUVBU0FSQUlBRWdBQ0FCUWZFQUVFODJBcXdCQ3dKQUlBRW9BbUJGRFFBZ0FTZ0NzQUZCQUU0TkFDQUJJQUFnQVVIeUFCQlBOZ0t3QVFzZ0FTZ0NNRVVOQUNBQktBSzBBVUVBVGcwQUlBRWdBQ0FCUWZNQUVFODJBclFCQ3dKQUlBRW9Ba2dpQkVVTkFDQUFJQUVRNmdJYUlBRW9BanhGRFFBZ0FTMEFia0VCY1EwQUlBRW9BcHdCUVFCT0RRQWdBU2dDekFGQkRHb2hBZ05BQWtBZ0FpZ0NBQ0lDUVFCSURRQWdBU2dDZENBQ1FRUjBhaUlDS0FJRVFRRkhEUUFnQWlnQ0FFSE5BRVlOQWlBQ1FRaHFJUUlNQVFzTElBQWdBVUhOQUJCUElnSkJBRWdOQUNBQktBSjBJQUpCQkhScUlnWWdBU2dDekFFaUIwRU1haWdDQURZQ0NDQUhJQUkyQWd3Z0JrRUJOZ0lFSUFZZ0JpZ0NERUVDY2pZQ0RDQUJJQUkyQXB3QkN3SkFJQUVvQWl4RkRRQWdBU2dDY0NJQ1JRMEFJQUFnQVNBQ0VPa0NHZ3NDUUNBQktBSWdCRUFnQVNFRkRBRUxJQUVoQlNBQktBTEFBZzBDQ3dOQUlBVW9BZ1FpQWtVTkFTQUZLQUlNSVFZQ1FDQUlEUUFnQWlnQ1RFVUVRRUVBSVFnTUFRc2dBaWdDcUFGQkFFZ0VRQ0FDSUFBZ0FoREtBellDcUFFTElBSW9BcXdCUVFCSUJFQWdBaUFBSUFKQjhRQVFUellDckFFTEFrQWdBaWdDWUVVTkFDQUNLQUt3QVVFQVRnMEFJQUlnQUNBQ1FmSUFFRTgyQXJBQkMwRUJJUWdnQWlnQ01FVU5BQ0FDS0FLMEFVRUFUZzBBSUFJZ0FDQUNRZk1BRUU4MkFyUUJDd0pBSUFRTkFDQUNLQUpJUlFSQVFRQWhCQXdCQ3lBQUlBSVE2Z0lhUVFFaEJBc0NRQ0FDS0FJc1JRMEFJQUlvQW5BaUIwVU5BQ0FBSUFJZ0J4RHBBaG9MSUFJb0Fzd0JJQVpCQTNScVFRUnFJUVVEUUNBRktBSUFJZ1pCQUVoRkJFQWdBaWdDZENBR1FRUjBhaUlISUFjb0Fnd2lCVUVFY2pZQ0RDQUFJQUVnQWtFQUlBWWdCeWdDQUNBRlFRRnhJQVZCQVhaQkFYRWdCVUVEZGtFUGNSQ2ZBUm9nQjBFSWFpRUZEQUVMQ3dKQUlBWkJma2NFUUVFQUlRVURRQ0FDS0FLSUFTQUZUQVJBUVFBaEJRTkFJQVVnQWlnQ2ZFNE5CQUpBSUFJb0FuUWdCVUVFZEdvaUJpZ0NCQTBBSUFZb0FnQWlCa1VnQmtIUkFFWnlEUUFnQUNBQklBSkJBQ0FGSUFaQkFFRUFRUUFRbndFYUN5QUZRUUZxSVFVTUFBc0FDeUFDS0FLQUFTQUZRUVIwYWlnQ0FDSUdCRUFnQUNBQklBSkJBU0FGSUFaQkFFRUFRUUFRbndFYUN5QUZRUUZxSVFVTUFBc0FDMEVBSVFVRFFDQUZJQUlvQW54T0RRRUNRQ0FDS0FKMElBVkJCSFJxSWdZb0FnUU5BQ0FHRUo0RlJRMEFJQUFnQVNBQ1FRQWdCU0FHS0FJQVFRQkJBRUVBRUo4Qkdnc2dCVUVCYWlFRkRBQUxBQXNnQWlJRktBSWdSUTBBUVFBaEJRTkFJQUlvQXNBQ0lBVk1CRUFnQWlFRkRBSUZJQUFnQVNBQ1FRQWdBaWdDeUFJZ0JVRURkR29pQnkwQUFDSUdRUUYyUVFGeElBVWdCeWdDQkNBR1FRSjJRUUZ4SUFaQkEzWkJBWEVnQmtFRWRoRDFBUm9nQlVFQmFpRUZEQUVMQUFzQUN3QUxJQUVvQXBRRElnUkZEUU5CQUNFQ0EwQWdBU2dDOUFFZ0Frd0VRRUVBSVFjRFFDQUhJQVFvQWlCT0RRWWdCQ2dDSENBSFFSUnNhaUlHS0FJSVJRUkFRUUFoQWlBQktBTEFBaUlJUVFBZ0NFRUFTaHNoQlNBR0tBSU1JUWdDUUFKQUEwQWdBaUFGUmcwQklBZ2dBU2dDeUFJZ0FrRURkR29vQWdSSEJFQWdBa0VCYWlFQ0RBRUxDeUFDUVFCT0RRRUxJQUFnQ0VHVkpoRC9Bd3dKQ3lBR0lBSTJBZ0FMSUFkQkFXb2hCd3dBQ3dBTElBQWdBVUVCUVFBZ0FpQUJLQUw4QVNBQ1FRUjBhaUlHS0FJTUlBWXRBQVFpQmtFQ2RrRUJjU0FHUVFGMlFRRnhRUUFReVFNaEJpQUNRUUZxSVFJZ0JrRUFUZzBBQ3d3RUN3VWdBU2dDZENBQ1FRUjBhaUlJSUFFb0Fzd0JJQWdvQWdSQkEzUnFJZ2dvQWdRMkFnZ2dDQ0FDTmdJRUlBSkJBV29oQWd3QkN3dEJ1WTRCUWE3OEFFRzE3QUZCNkRrUUFBQUxJQUZCRUdvaENDQUJLQUlVSVFJQ1FBTkFJQUlnQ0VjRVFDQUNLQUlFSVFRZ0FrRVFheWdDQUNFR0lBQWdBa0VZYXhDYkJTSVVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdCa0VBU0EwQ0lBRW9BclFDSUFaQkEzUnFJQlEzQXdBZ0JDRUNEQUVMQ3lBRElBRW9Bb0FDSWcwMkF0d0ZJQU1nQVNnQ2hBSWlEallDNEFVZ0FDZ0NFQ0VDSUFOQ0FEY0RpQVlnQTBJQU53T0FCaUFESUFJMkFwUUdJQU5CT3pZQ2tBWWdBVUdBQW1vaERFRUFJUVFEUUNBQktBTDBBU0FFVEFSQVFRQWhCa0VBSVFnRlFRQWhBaUFCS0FMQUFpSUdRUUFnQmtFQVNoc2hDQ0FCS0FMOEFTQUVRUVIwYWlFR0FrQWdBMEdBQm1vQ2Z3TkFJQUlnQ0VjRVFDQUJLQUxJQWlBQ1FRTjBhaUlIS0FJRUlnVWdCaWdDREVZRVFDQUJLQUlrUVFKSERRUWdCeTBBQUVFSWNVVU5CQ0FEUVlBR2FpSUNRVEFRRVNBQ0lBQWdCaWdDREJBWUVCMUJBUXdEQ3lBRlFYNXhRZElBUmcwRElBSkJBV29oQWd3QkN3c2dBMEdBQm1vaUFrRS9FQkVnQWlBQUlBWW9BZ3dRR0JBZElBWXRBQVJCQm5RaUFrR0FmM0VnQWtIQUFISWdCaWdDQUVFQVNCc0xRZjhCY1JBUkN5QUVRUUZxSVFRTUFRc0xBMEFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnRGlBSUlnSktCRUFnQWlBQ0lBMXFJZ2t0QUFBaUJFRUNkRUdBdUFGcUxRQUFJZzlxSVFnQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUVRYk1CYXc0UUZBVU5CQUVCQVFFQ0FRRURBd01VQ3dBTElBUkJFV3NpQWtFZlN3ME9RUUVnQW5SQmdJRFFqSHh4RFE4Z0FrVU5DeUFDUVFWSERRNGdBMEYvTmdJWUlBTkN5ZnFBZ09BQk53TVFJQU5CM0FWcUlBZ2dBMEVRYWhBblJRMFJJQU5CZ0FacUlBTXRBT3dGRUJFZ0F5Z0M1QVVoQ0NBREtBTG9CU0lDUVg5R0lBSWdCa1p5RFJNZ0FTQUJLQUxjQWtFQmFqWUMzQUlnQTBHQUJtb2lCRUhDQVJBUklBUWdBaEFkSUFJaEJnd1RDeUFBSUFFZ0NTZ0FBU0lDSUFrdkFBVWdCQ0FEUVlBR2FrRUFRUUFnQ0JEcEJDRUlJQUFnQWhBVERCSUxJQWt2QUFraEJ5QUpLQUFCSVFJZ0FTZ0NwQUlnQ1NnQUJVRVViR29pQkNBRUtBSUFRUUZyTmdJQUlBQWdBU0FDSUFkQnV3RWdBMEdBQm1vZ0RTQUVJQWdRNlFRaENDQUFJQUlRRXd3UkN5QUFJQU5CbUFacUlBTkJuQVpxSUFFZ0NTZ0FBU0lISUFrdkFBVWlDUkRvQkNJRlFRQklEUVVnQXlnQ25BWWlDa1VOQkFKQUFrQUNRQUpBQWtBZ0JFRytBV3NPQXdBQUFRSUxBa0FDUUFKQUlBcEJCV3NPQlFBQkFnVUNCQXNnQkVHL0FVWUVRQ0FEUVlBR2FrRVJFQkVMSUFOQmdBWnFJZ0lnQXlnQ21BWWdCUkNsQWlBQ1FjUUFFQkVNQlFzZ0EwR0FCbW9pQWlBREtBS1lCaUFGRUtVQ0lBSkJMQkFSSUFSQnZ3RkdEUVFnQTBHQUJtcEJEeEFSREFRTElBUkJ2d0ZHQkVBZ0EwR0FCbXBCRVJBUkN5QURRWUFHYWlJQ0lBTW9BcGdHSUFVUXBRSWdBa0VzRUJFZ0FrRWtFQkVnQWtFQUVDb01Bd3NDUUFKQUFrQWdDa0VGYXc0RkFBRUJBZ0lEQ3lBRFFZQUdhaUlDSUFNb0FwZ0dJQVVRcFFJZ0FrSEZBQkFSREFRTElBTkJnQVpxSWdKQk1CQVJJQUlnQUNBSEVCZ1FIU0FDUVFBUUVRd0RDeUFBSUFjUTV3UWlCRVVOQ0NBQUlBTkJtQVpxSUFOQm5BWnFJQUVnQkNBSkVPZ0VJUVVnQUNBRUVCTWdCVUVBU0EwSUlBTW9BcHdHUVFoSERRWWdBMEdBQm1vaUFpQURLQUtZQmlBRkVLVUNJQUpCR3hBUklBSkJIaEFSSUFKQkxCQVJJQUpCSFJBUklBSkJKQkFSSUFKQkFSQXFEQUlMRUFFQUN5QURRWUFHYWlJQ1FUQVFFU0FDSUFBZ0J4QVlFQjBnQWtFQUVCRUxJQUFnQnhBVERCQUxJQWtvQUFFaUFrRUFTQTBCSUFJZ0FTZ0NyQUpPRFFFZ0FTZ0NwQUlnQWtFVWJHb2dBeWdDaEFZZ0QybzJBZ2dNRFF0QkFDRUZRUUFoQWlBSkx3QUJJZzhnQVNnQzhBRkhEUWdEUUNBQktBS0lBU0FDU2dSQUlBRW9Bb0FCSUFKQkJIUnFJZ1F0QUE5QndBQnhSUVJBSUFOQmdBWnFJZ2RCQXhBUklBY2dCQ2dDREVFQmRFRUlkUkFkSUFkQjNBQVFFU0FISUFKQi8vOERjUkFxQ3lBQ1FRRnFJUUlNQVFzTEEwQWdCU0FCS0FKOFRrVUVRQUpBSUFFb0FuUWdCVUVFZEdvaUFpZ0NCQTBBSUFJdEFBOUJ3QUJ4RFFBZ0EwR0FCbW9pQkVFREVCRWdCQ0FDS0FJTVFRRjBRUWgxRUIwZ0JFSFpBQkFSSUFRZ0JVSC8vd054RUNvTElBVkJBV29oQlF3QkN3c0NRQ0FCS0FLVUEwVUVRRUYvSVFzTUFRc2dBVUYvRU1nRElRc2dBMEdBQm1vaUFrRUlFQkVnQWtIcEFCQVJJQUlnQ3hBZElBRWdDMEVCRUdrYUlBRWdBU2dDMEFKQkFXbzJBdEFDQzBFQUlRUURRQUpBQWtBZ0FTZ0M5QUVnQkVvRVFFRUFJUUlnQVNnQ3dBSWlCMEVBSUFkQkFFb2JJUWNnQVNnQy9BRWdCRUVFZEdvaUNTMEFCQ0lRUVFGeElRb0Nmd05BSUFJZ0IwY0VRQ0FCS0FMSUFpQUNRUU4wYWlnQ0JDSUZJQWtvQWd4R0JFQkJBQ0VLSUFJaEIwRUNEQU1MSUFWQmZuRkIwZ0JHQkVBZ0EwR0FCbW9pQlVIZUFCQVJJQVVnQWtILy93TnhFQ3BCQVNFS0lBSWhCMEVCREFNRklBSkJBV29oQWd3Q0N3QUxDeUFCS0FJa1FRQkhJUkVnRUVFQ2NTSUNSU0FKS0FJQVFRQk9jUTBDSUFOQmdBWnFJZ1ZCUGhBUklBVWdBQ0FKS0FJTUVCZ1FIU0FGUVlCL1FZSi9JQkJCQkhFYlFRQWdBaHNnRVhKQmd3RnhFQkZCQUFzaEJTQUtSU0FKS0FJQUlnSkJBRWh4RFFJQ1FDQUNRUUJPQkVBZ0EwR0FCbW9pQWtFREVCRWdBaUFKS0FJQUVCMGdDU2dDREVIOEFFY05BU0FEUVlBR2FpSUNRYzBBRUJFZ0FrRVdFQjBNQVFzZ0EwR0FCbXBCQmhBUkN3SkFBa0FDUUNBRlFRRnJEZ0lCQUFJTElBTkJnQVpxSWdKQjN3QVFFU0FDSUFkQi8vOERjUkFxREFRTElBTkJnQVpxSWdKQnpBQVFFU0FDSUFBZ0NTZ0NEQkFZRUIwZ0FrRU9FQkVNQXdzZ0EwR0FCbW9pQWtFNUVCRWdBaUFBSUFrb0Fnd1FHQkFkREFJTElBRW9BcFFEQkVBZ0EwR0FCbW9pQWtFcEVCRWdBa0cyQVJBUklBSWdDeEFkSUFFb0FxUUNJQXRCRkd4cUlBTW9Bb1FHTmdJSUN5QUFLQUlRSWdKQkVHb2dBU2dDL0FFZ0FpZ0NCQkVBQUNBQlFnQTNBdlFCSUFGQkFEWUMvQUVNQ3dzZ0EwR0FCbW9pQWtFREVCRWdBaUFKS0FJQUVCMGdBa0hBQUJBUklBSWdBQ0FKS0FJTUVCZ1FIU0FDSUJFUUVRc2dBQ0FKS0FJTUVCTWdCRUVCYWlFRURBQUxBQXRCaFNsQnJ2d0FRWXp5QVVIN09SQUFBQXRCbW9JQlFhNzhBRUhZNndGQjMvUUFFQUFBQzBHdWhBRkJydndBUVp2ckFVSGY5QUFRQUFBTEEwQWdBaUFPVGtVRVFDQURRWUFHYWlBQ0lBMXFJZ1FnQkMwQUFFRUNkRUdBdUFGcUxRQUFJZ1FRY2lBQ0lBUnFJUUlNQVFzTElBd1E5Z0VnRENBREtRT1FCamNDRUNBTUlBTXBBNGdHTndJSUlBd2dBeWtEZ0FZM0FnQU1EQXNnREJEMkFTQU1JQU1wQTVBR053SVFJQXdnQXlrRGlBWTNBZ2dnRENBREtRT0FCamNDQUFKQUlBRW9Bb3dDRFFBZ0FTZ0NwQUloRFNBRElBRW9BdkFDTmdLWUJpQURJQUVvQW9BQ0lnazJBdHdGSUFNZ0FTZ0NoQUlpQ3pZQzRBVWdBQ2dDRUNFQ0lBTkNBRGNEaUFZZ0EwSUFOd09BQmlBRElBSTJBcFFHSUFOQk96WUNrQVlnQVNnQzBBSWlBZ1JBSUFFZ0FTZ0NBQ0FDUVFSMEVGOGlBallDekFJZ0FrVU5EUXNDUUNBQktBTGNBaUlDUlEwQUlBRXRBRzVCQW5FTkFDQUJJQUVvQWdBZ0FrRURkQkJmSWdJMkF0Z0NJQUpGRFEwZ0FVRUFOZ0xvQWlBQklBRW9BdkFDTmdMa0Fnc2dBU2dDdEFGQkFFNEVRQ0FEUVlBR2FpSUNRUXdRRVNBQ1FRUVFFU0FDUWRrQUlBRW9BclFCRUYwTElBRW9BckFCUVFCT0JFQWdBMEdBQm1vaUFrRU1FQkVnQWtFQ0VCRWdBa0haQUNBQktBS3dBUkJkQ3lBQktBS3NBVUVBVGdSQUlBTkJnQVpxSWdKQkRCQVJJQUpCQXhBUklBSkIyUUFnQVNnQ3JBRVFYUXNDUUNBQktBS29BVUVBU0EwQUlBRW9BbUFFUUNBRFFZQUdhaUlDUWVFQUVCRWdBaUFCTHdHb0FSQXFEQUVMSUFOQmdBWnFJZ0pCQ0JBUklBSkIyUUFnQVNnQ3FBRVFYUXNnQVNnQ21BRkJBRTRFUUVFQUlRSWdBUzBBYmtFQmNVVUVRQ0FCS0FJNFFRQkhJUUlMSUFOQmdBWnFJZ1JCREJBUklBUWdBaEFSSUFFb0Fwd0JJZ0pCQUU0RVFDQURRWUFHYWtIYUFDQUNFRjBMSUFOQmdBWnFRZGtBSUFFb0FwZ0JFRjBMSUFFb0FxQUJRUUJPQkVBZ0EwR0FCbW9pQWtFTUVCRWdBa0VDRUJFZ0FrSFpBQ0FCS0FLZ0FSQmRDeUFCS0FLUUFVRUFUZ1JBSUFOQmdBWnFJZ0pCREJBUklBSkJCUkFSSUFKQjJRQWdBU2dDa0FFUVhRc2dBU2dDbEFGQkFFNEVRQ0FEUVlBR2FpSUNRUXdRRVNBQ1FRVVFFU0FDUWRrQUlBRW9BcFFCRUYwTFFRQWhBZ0pBQTBBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBaUFMVGdSQVFRQWhBaUFCS0FLc0FpSUVRUUFnQkVFQVNoc2hCQU5BSUFJZ0JFWU5BaUFDUVJSc0lRWWdBa0VCYWlFQ0lBWWdEV29vQWhCRkRRQUxRZFdEQVVHdS9BQkIvZm9CUVpRNEVBQUFDeUFDSUFJZ0NXb2lCaTBBQUNJRlFRSjBRWUM0QVdvdEFBQWlCMm9oQkFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdCVUhZQUdzT0lCQVNHaEVTR2hFU0dob2FHaG9hR2hvYUJBUUJBd0lhR2d3TUJRVUZCUVVGQUFzQ1FDQUZRUUZyRGhVSkNnb0xHZzBIR2dnSUdob2FCaG9hRHhvYUdnNEFDeUFGUVNKcklnaEJIMHNOR0VFQklBaDBJZ3BCd09FQmNRMFNJQXBCQlhGRkJFQWdDRUVmUncwWklBWW9BQUZCTUVjTkdpQUJJQU1vQW9RR0lBTW9BcGdHRURNZ0EwR0FCbXBCNlFFUUVTQUVJUUlNSXdzZ0JpOEFBU0VDSUFOQ3FJQ0FnSEEzQTFBZ0EwSGNCV29nQkNBRFFkQUFhaEFuQkVBQ1FDQURLQUxvQlNJRVFRQklCRUFnQXlnQ21BWWhCQXdCQ3lBRElBUTJBcGdHQ3lBQklBTW9Bb1FHSUFRUU15QURRWUFHYWlBRlFRRnFJQUlRWFNBQklBa2dDeUFES0FMa0JTQURRWmdHYWhDa0FpRUNEQ01MSUFFZ0F5Z0NoQVlnQXlnQ21BWVFNeUFEUVlBR2FpQUZJQUlRWFNBRUlRSU1JZ3NnQmlnQUFTRUZJQVFoQmd3V0N5QUdLQUFCSVFkQjdRQWhCUXdVQ3lBR0tBQUJJUWRCN0FBaEJRd1RDeUFCSUFZb0FBRWdBMEdjQm1wQkFCREhBeUVISUFNb0F0d0ZJQU1vQXVBRklBUWdCeERHQXdSQUlBRWdCMEYvRUdrYUlBTkJnQVpxUVE0UUVTQUVJUUlNSHdzZ0EwTHJnSUNBY0RjRFlDQURRZHdGYWlBRUlBTkI0QUJxRUNkRkRSSWdBeWdDNkFVaENDQURLQUxjQlNBREtBTGdCU0FES0FMa0JTSUdJQWNReGdORkRSSWdDRUVBVGdSQUlBTWdDRFlDbUFZTElBRWdCMEYvRUdrYUlBVkJBM01oQlNBREtBTDBCU0VIREJ3TElBWXRBQWtoQ0NBR0tBQUJJUWNnQVNBR0tBQUZJQU5CbkFacVFRQVF4d01pQWtFQVNBMFBJQUlnQVNnQ3JBSk9EUThnQVNBREtBS0VCaUFES0FLWUJoQXpJQUVnQVNnQzFBSWlCa0VCYWpZQzFBSWdBU2dDekFJZ0JrRUVkR29pQmtFRU5nSUVJQVlnQlRZQ0FDQURLQUtFQmlFS0lBWWdBallDRENBR0lBcEJCV28yQWdnZ0EwR0FCbW9pQmlBRkVCRWdCaUFIRUIwZ0JpQU5JQUpCRkd4cUlnSW9BZ3dnQXlnQ2hBWnJFQjBnQWlnQ0RFRi9SZ1JBSUFBZ0FpQURLQUtFQmtFRWEwRUVFT2dDUlEwZEN5QURRWUFHYWlBSUVCRWdCQ0VDREIwTElBTkNxWUNBZ0hBM0EzQWdBMEhjQldvZ0JDQURRZkFBYWhBblJRMFRJQVFoQWlBREtBTG9CU0lFUVFCSURSd2dBeUFFTmdLWUJnd2NDeUFEUXF1QmdJQndOd09nQVNBRFFkd0ZhaUFFSUFOQm9BRnFFQ2NFUUFKQUlBTW9BdWdGSWdKQkFFZ0VRQ0FES0FLWUJpRUNEQUVMSUFNZ0FqWUNtQVlMSUFFZ0F5Z0NoQVlnQWhBeklBTkJnQVpxUWZNQkVCRU1HQXNnQTBGL05nS1lBU0FEUXF5QmdJQ1F6Um8zQTVBQklBTkIzQVZxSUFRZ0EwR1FBV29RSjBVTkFBSkFJQU1vQXVnRklnVkJBRWdFUUNBREtBS1lCaUVGREFFTElBTWdCVFlDbUFZTElBRWdBeWdDaEFZZ0JSQXpJQU5CZ0FacVFmTUJFQkVnQXlnQzdBVkJBM01oQlF3WUN5QURRdW5VZ1lCd053T0FBU0FEUWR3RmFpQUVJQU5CZ0FGcUVDZEZEUkVnQlVFS1JpRUtEQTBMQWtBZ0JpZ0FBU0lHUVlDQWdJQjRja0dBZ0lDQWVFWU5BQ0FEUW95QmdJQndOd1BnQVNBRFFkd0ZhaUFFSUFOQjRBRnFFQ2RGRFFBZ0F5Z0M2QVVpQWtFQVRnUkFJQU1nQWpZQ21BWUxJQU5Dam9DQWdIQTNBOUFCSUFOQjNBVnFJQU1vQXVRRklBTkIwQUZxRUNjRVFDQURLQUxvQlNJQ1FRQklEUmNnQXlBQ05nS1lCZ3dYQ3lBQklBTW9Bb1FHSUFNb0FwZ0dFRE1nQTBHQUJtcEJBQ0FHYXhERkF3d1dDeUFEUW82QWdJQndOd1BBQVNBRFFkd0ZhaUFFSUFOQndBRnFFQ2NFUUNBREtBTG9CU0lDUVFCSURSWWdBeUFDTmdLWUJnd1dDeUFEUXVuVWdZQndOd093QVNBRFFkd0ZhaUFFSUFOQnNBRnFFQ2NFUUNBR1FRQkhJUW9NRFFzZ0FTQURLQUtFQmlBREtBS1lCaEF6SUFOQmdBWnFJQVlReFFNZ0JDRUNEQmtMSUFZb0FBRWlBa0gvQVVvTkR5QUJJQU1vQW9RR0lBTW9BcGdHRURNZ0EwR0FCbW9pQmlBRlFjTUFhMEgvQVhFUUVTQUdJQUpCL3dGeEVCRWdCQ0VDREJnTElBWW9BQUVoQWlBRFFvNkFnSUJ3TndQd0FTQURRZHdGYWlBRUlBTkI4QUZxRUNjRVFDQUFJQUlRRXlBREtBTG9CU0lDUVFCSURSUWdBeUFDTmdLWUJnd1VDeUFDUVM5SERRNGdBU0FES0FLRUJpQURLQUtZQmhBeklBTkJnQVpxUWNFQkVCRWdCQ0VDREJjTElBTkN5WUNBZ0hBM0E2Z0NJQU5DMkxiNWduQTNBNkFDSUFOQjNBVnFJQVFpQWlBRFFhQUNhaEFuRFJZZ0EwRi9OZ0tZQWlBRFFvR0VrSUNRQ1RjRGtBSWdBMEhjQldvZ0FpQURRWkFDYWhBbkRSWWdBMEYvTmdLSUFpQURRb2FPcU1pUUNUY0RnQUlnQTBIY0JXb2dBaUFEUVlBQ2FoQW5EUllNRFFzZ0EwS09nSUNBY0RjRDhBSWdBMEhjQldvZ0JDQURRZkFDYWhBbkJFQWdBeWdDNkFVaUFrRUFTQTBTSUFNZ0FqWUNtQVlNRWdzZ0EwS29nSUNBY0RjRDRBSWdBMEhjQldvZ0JDQURRZUFDYWhBbkJFQUNRQ0FES0FMb0JTSUNRUUJJQkVBZ0F5Z0NtQVloQWd3QkN5QURJQUkyQXBnR0N5QUJJQU1vQW9RR0lBSVFNeUFEUVlBR2FrRXBFQkVNRWdzZ0EwTHAxSUdBY0RjRDBBSkJBQ0VLSUFOQjNBVnFJQVFnQTBIUUFtb1FKdzBJSUFOQ3E0R0FnSEEzQThBQ0lBTkIzQVZxSUFRZ0EwSEFBbW9RSndSQUFrQWdBeWdDNkFVaUFrRUFTQVJBSUFNb0FwZ0dJUUlNQVFzZ0F5QUNOZ0tZQmdzZ0FTQURLQUtFQmlBQ0VETWdBMEdBQm1wQjhnRVFFUXdTQ3lBRFFYODJBcmdDSUFOQ3JJR0FnSkROR2pjRHNBSWdBMEhjQldvZ0JDQURRYkFDYWhBblJRME1Ba0FnQXlnQzZBVWlCVUVBU0FSQUlBTW9BcGdHSVFVTUFRc2dBeUFGTmdLWUJnc2dBU0FES0FLRUJpQUZFRE1nQTBHQUJtcEI4Z0VRRVNBREtBTHNCVUVEY3lFRkRCSUxJQU5CZnpZQ2lBTWdBMExEOW9DQTRBRTNBNEFESUFOQjNBVnFJQVFnQTBHQUEyb1FKMFVOQ3dKQUlBTW9BdWdGSWdKQkFFZ0VRQ0FES0FLWUJpRUNEQUVMSUFNZ0FqWUNtQVlMSUFFZ0F5Z0NoQVlnQWhBeklBTkJnQVpxSWdJZ0F5MEE3QVVRRVNBQ0lBTW9BdndGRUIwTUVBc2dBMEYvTmdLNEF5QURRdG00L1lKd053T3dBeUFEUWR3RmFpQUVJQU5Cc0FOcUVDZEZEUW9nQXlnQzZBVWlBa0VBVGdSQUlBTWdBallDbUFZTElBTkNqb0NBZ0hBM0E2QURJQU1vQXV3RklnVkJBV29oQmdKQUlBTkIzQVZxSUFNb0F1UUZJZ0lnQTBHZ0Eyb1FKd1IvSUFNb0F1Z0ZJZ0pCQUU0RVFDQURJQUkyQXBnR0N5QURJQU1vQXZBRk5nS1VBMEYvSVFRZ0EwRi9OZ0tZQXlBRElBVkJBV3MyQXBBRElBTkIzQVZxSUFNb0F1UUZJZ0lnQTBHUUEyb1FKMFVOQVNBREtBTGtCU0VDSUFNb0F1Z0ZCVUYvQ3lFRUlBWWhCUXNnQVNBREtBS0VCaUFES0FLWUJoQXpJQU5CZ0FacUlBVWdBeWdDOEFVUVhTQUVRUUJJRFJNZ0F5QUVOZ0tZQmd3VEN5QUdMd0FCSWdKQi93RkxEUWtnQTBLT2dJQ0FjRGNDekFRZ0F5QUNOZ0xJQkNBRFFwQ2pnb0NRQ3pjRHdBUUNRQ0FEUWR3RmFpQUVJQU5Cd0FScUVDZEZCRUFnQTBLT2dJQ0FjRGNEc0FRZ0F5QUNOZ0tzQkNBRFFka0FOZ0tvQkNBRFFvNmZnb0NRQWpjRG9BUWdBMEhjQldvZ0JDQURRYUFFYWhBblJRMEJDd0pBSUFNb0F1Z0ZJZ1ZCQUVnRVFDQURLQUtZQmlFRkRBRUxJQU1nQlRZQ21BWUxJQUVnQXlnQ2hBWWdCUkF6SUFOQmdBWnFJZ1pCa3dGQmt3RkJrZ0VnQXlnQzdBVWlCRUdSQVVZYklBUkJqd0ZHR3hBUklBWWdBa0gvQVhFUUVRd1BDeUFEUW82QWdJQndOd0tVQkNBRElBSTJBcEFFSUFOQ2tZQ0FnSkFMTndPSUJDQURRb1NBZ0lEUUV6Y0RnQVFnQTBIY0JXb2dCQ0FEUVlBRWFoQW5CRUFDUUNBREtBTG9CU0lGUVFCSUJFQWdBeWdDbUFZaEJRd0JDeUFESUFVMkFwZ0dDeUFCSUFNb0FvUUdJQVVRTXdKQUlBTW9BdndGUVM5R0JFQWdBMEdBQm1wQndRRVFFUXdCQ3lBRFFZQUdhaUlFUVFRUUVTQUVJQU1vQXZ3RkVCMExJQU5CZ0FacUlnUkJsQUVRRVNBRUlBSkIvd0Z4RUJFTUR3c2dBMEtPZ0lDQWNEY0M5QU1nQXlBQ05nTHdBeUFEUXBHQWdJQ1FDemNENkFNZ0EwS0JnSUNBMEJNM0ErQURJQU5CM0FWcUlBUWdBMEhnQTJvUUp3UkFBa0FnQXlnQzZBVWlCVUVBU0FSQUlBTW9BcGdHSVFVTUFRc2dBeUFGTmdLWUJnc2dBU0FES0FLRUJpQUZFRE1nQTBHQUJtb2lCQ0FES0FMMEJSREZBeUFFUVpRQkVCRWdCQ0FDUWY4QmNSQVJEQThMSUFOQ2pvQ0FnSEEzQTlnRElBTWdBallDMUFNZ0EwSFpBRFlDMEFNZ0EwS2RnWUNBa0FJM0E4Z0RJQU5DMkxiNWduQTNBOEFESUFOQjNBVnFJQVFnQTBIQUEyb1FKd1JBQWtBZ0F5Z0M2QVVpQlVFQVNBUkFJQU1vQXBnR0lRVU1BUXNnQXlBRk5nS1lCZ3NnQVNBREtBS0VCaUFGRURNZ0EwR0FCbW9pQkNBREtBTHNCU0FES0FMd0JSQmRJQVJCbEFFUUVTQUVJQUpCL3dGeEVCRU1Ed3NnQVNBREtBS0VCaUFES0FLWUJoQXpJQU5CZ0FacVFkZ0FJQUlRWFNBRUlRSU1FZ3NnQmk4QUFTRUNJQUVnQXlnQ2hBWWdBeWdDbUFZUU15QURRWUFHYWlBRklBSVFYU0FFSVFJTUVRc2dBeUFHTHdBQklnSTJBdVFFSUFOQmZ6WUM2QVFnQXlBRlFRRnJOZ0xnQkNBRFFkd0ZhaUFFSUFOQjRBUnFFQ2NFUUFKQUlBTW9BdWdGSWdSQkFFZ0VRQ0FES0FLWUJpRUVEQUVMSUFNZ0JEWUNtQVlMSUFFZ0F5Z0NoQVlnQkJBeklBTkJnQVpxSUFWQkFXb2dBaEJkREEwTElBRWdBeWdDaEFZZ0F5Z0NtQVlRTXlBRFFZQUdhaUFGSUFJUVhTQUVJUUlNRUFzZ0FTQUpJQXNnQkNBRFFaZ0dhaENrQWlFRURBWUxJQUVvQXRRQ0lRc2dBU2dDekFJaEJrRUFJUXBCQUNFSkEwQUNRQ0FLSUF0SUJFQkJBeUVJSUFZb0FnQWlBa0hwQUd0QkEwOEVRQ0FDUWUwQlJ3MENRUUVoQ0FzQ1FDQUJLQUtrQWlBR0tBSU1RUlJzYWlnQ0RDQUdLQUlJSWdWcklnUkJnSDlJSUFRZ0NFSC9BR3BLY2tVRVFDQUdRUUUyQWdRZ0FrSHRBVVlFUUVIc0FTRUNJQVpCN0FFMkFnQU1BZ3NnQmlBQ1FZRUJhaUlDTmdJQURBRUxJQUpCNndCSElBUkJnSUFDYWtILy93TkxjZzBDSUFaQzdZR0FnQ0EzQWdCQkFpRUlRZTBCSVFJTElBVWdBeWdDZ0FacVFRRnJJQUk2QUFBZ0JpZ0NCQ0lDSUFNb0FvQUdJQVZxYWlJRUlBUWdDR29nQXlnQ2hBWWdCU0FJYWlBQ2Ftc1FuQUVnQXlBREtBS0VCaUFJYXpZQ2hBWkJBQ0VFSUFFb0Fxd0NJZ0pCQUNBQ1FRQktHeUVISUFFb0FxUUNJUUlEUUNBRUlBZEdCRUFnQVNnQzFBSWhDeUFHSVFjZ0NpRUVBMEFDUUNBTElBUkJBV29pQkV3RVFFRUFJUUlnQVNnQzRBSWlCRUVBSUFSQkFFb2JJUVFEUUNBQ0lBUkdEUUlnQlNBQktBTFlBaUFDUVFOMGFpSUhLQUlBSWcxSkJFQWdCeUFOSUFock5nSUFDeUFDUVFGcUlRSU1BQXNBQ3lBSElnSkJFR29oQnlBQ0tBSVlJZzBnQlV3TkFTQUNJQTBnQ0dzMkFoZ01BUXNMSUFsQkFXb2hDUXdEQ3lBRklBSW9BZ3dpQzBnRVFDQUNJQXNnQ0dzMkFnd0xJQUpCRkdvaEFpQUVRUUZxSVFRTUFBc0FDd0pBSUFsRkRRQWdBU2dDekFJaEFrRUFJUVVEUUNBRklBdE9EUUVnQVNnQ3BBSWdBaWdDREVFVWJHb29BZ3dnQWlnQ0NDSUVheUVHQWtBQ1FBSkFBa0FnQWlnQ0JFRUJhdzRFQUFFREFnTUxJQU1vQW9BR0lBUnFJQVk2QUFBZ0FTZ0MxQUloQ3d3Q0N5QURLQUtBQmlBRWFpQUdPd0FBREFFTElBTW9Bb0FHSUFScUlBWTJBQUFMSUFKQkVHb2hBaUFGUVFGcUlRVU1BQXNBQ3lBQUtBSVFJZ0pCRUdvZ0FTZ0N6QUlnQWlnQ0JCRUFBQ0FCUVFBMkFzd0NJQUFvQWhBaUFrRVFhaUFCS0FLa0FpQUNLQUlFRVFBQUlBRkJBRFlDcEFJQ1FDQUJMUUJ1UVFKeERRQWdBU2dDMkFKRkRRQWdBU2dDQUNnQ0VDRUNJQUZDQURjQzlBSWdBVUlBTndMOEFpQUJJQUkyQW9nRElBRkJPellDaEFNZ0FVSDBBbW9oQlNBQktBTHdBaUVIUVFBaEFrRUFJUWdEUUNBQ0lBRW9BdUFDVGcwQkFrQWdBU2dDMkFJZ0FrRURkR29pQmlnQ0JDSUVRUUJJSUFRZ0IwWnlEUUFnQmlnQ0FDSUdJQWhySWdwQkFFZ05BQUpBSUFRZ0Iyc2lDRUVCYWlJSFFRUkxJQXBCTWt0eVJRUkFJQVVnQnlBS1FRVnNha0VCYWtIL0FYRVFFUXdCQ3lBRlFRQVFFU0FGSUFvUTVnUWdCU0FJUVFGMElBaEJIM1Z6RU9ZRUN5QUdJUWdnQkNFSEN5QUNRUUZxSVFJTUFBc0FDeUFBS0FJUUlnSkJFR29nQVNnQzJBSWdBaWdDQkJFQUFDQUJRUUEyQXRnQ0lBd1E5Z0VnRENBREtRT1FCamNDRUNBTUlBTXBBNGdHTndJSUlBd2dBeWtEZ0FZM0FnQWdBVUVCTmdLZ0FpQUJLQUtNQWcwU0lBRW9Bb0FDSVFjZ0F5QUJLQUtFQWlJRU5nTGNCU0FESUFBZ0JFRUJkQkFwSWdZMkF1UUZJQVpGRFI1QkFDRUNJQVJCQUNBRVFRQktHeUVFQTBBZ0FpQUVSa1VFUUNBR0lBSkJBWFJxUWYvL0F6c0JBQ0FDUVFGcUlRSU1BUXNMSUFOQkFEWUM4QVVnQTBJQU53TG9CU0FEUVFBMkF1QUZBa0FnQUNBRFFkd0Zha0VBUVFCQkFCRERBUTBBQTBBQ1FBSkFBa0FnQXlnQzdBVWlBa0VBU2dSQUlBTWdBa0VCYXlJQ05nTHNCU0FISUFNb0F1Z0ZJQUpCQW5ScUtBSUFJZ1JxSWdndEFBQWlBa0VLYWtIL0FYRkJDMGtFUUVIZ2t3RWhCUXdFQ3lBRUlBSkJEMm9nQWlBQ1FiTUJTeHNpQmtFQ2RDSUtRWUM0QVdvdEFBQnFJZ2tnQXlnQzNBVktCRUJCKzVJQklRVU1CQXNnQXlnQzVBVWdCRUVCZEdvdkFRQWhEQ0FLUVlHNEFXb3RBQUFoQlFKQUlBWkJJV3NpQzBFUVMwRUJJQXQwUWIrQUJIRkZja1VFUUNBSUx3QUJJQVZxSVFVTUFRc2dCa0g5QVd0QkEwc05BQ0FDSUFWcVFlNEJheUVGQ3lBRklBeEtCRUJCd1pNQklRVU1CQXNDUUNBS1FZSzRBV290QUFBZ0JXc2dER29pQmlBREtBTGdCVXdOQUNBRElBWTJBdUFGSUFaQi92OERUQTBBUWFPVEFTRUZEQVFMQWtBQ1FBSkFBa0FDUUFKQUFrQWdBa0hwQUdzT0R3SUNBUUlEQ3drSkNRUUdCQVVGQlFBTElBSkJJMnNpQlVFTlN3MEhRUUVnQlhSQjVmQUFjUTBLREFjTElBUWdDQ2dBQVdwQkFXb2hDUXdIQ3lBQUlBTkIzQVZxSUFRZ0NDZ0FBV3BCQVdvZ0FpQUdFTU1CUlEwR0RBa0xJQUFnQTBIY0JXb2dCQ0FJS0FBQmFrRUJhaUFDSUFaQkFXb1F3d0ZGRFFVTUNBc2dBQ0FEUWR3RmFpQUVJQWdvQUFWcVFRVnFJQUlnQmtFQmFoRERBVVVOQkF3SEN5QUFJQU5CM0FWcUlBUWdDQ2dBQldwQkJXb2dBaUFHUVFKcUVNTUJSUTBEREFZTElBQWdBMEhjQldvZ0JDQUlLQUFGYWtFRmFpQUNJQVpCQVdzUXd3RU5CUXdDQ3lBQUtBSVFJZ0pCRUdvZ0F5Z0M1QVVnQWlnQ0JCRUFBQ0FBS0FJUUlnSkJFR29nQXlnQzZBVWdBaWdDQkJFQUFFSEFBRUhZQUNBQkxRQnVRUUp4SWdRYklnZ2dBU2dDdUFKQkEzUnFJUUlnQXlnQzRBVWhDaUFBQW44Z0JBUkFJQUlnQVNnQ1JFVU5BUm9MSUFFb0Fud2dBU2dDaUFGcVFRUjBJQUpxQ3lJSElBRW9Bc0FDUVFOMGFpSUVJQUVvQW9RQ2FoQmZJZ1pGRFNNZ0JrRUJOZ0lBSUFZZ0JDQUdhaUlFTmdJVUlBWWdBU2dDaEFJaUJUWUNHQ0FFSUFFb0FvQUNJQVVRSHhvZ0FDZ0NFQ0lFUVJCcUlBRW9Bb0FDSUFRb0FnUVJBQUFnQVVFQU5nS0FBaUFHSUFFb0FuQTJBaHdnQVNnQ2ZDSUVJQUVvQW9nQklnVnFRUUJLQkVBQ1FBSkFJQUV0QUc1QkFuRkZEUUFnQVNnQ1JBMEFRUUFoQlFOQUlBUWdCVXdFUUVFQUlRVURRQ0FCS0FLSUFTQUZUQVJBUVFBaEJRTkFJQVVnQVNnQ3dBSk9EUVlnQUNBRlFRTjBJZ0lnQVNnQ3lBSnFLQUlFRUJNZ0FTZ0N5QUlnQW1wQkFEWUNCQ0FGUVFGcUlRVU1BQXNBQlNBQUlBRW9Bb0FCSUFWQkJIUnFLQUlBRUJNZ0JVRUJhaUVGREFFTEFBc0FCU0FBSUFFb0FuUWdCVUVFZEdvb0FnQVFFeUFGUVFGcUlRVWdBU2dDZkNFRURBRUxBQXNBQ3lBR0lBSWdCbW9pQWpZQ0lDQUNJQUVvQW9BQklBVkJCSFFRSHhvZ0JpZ0NJQ0FCS0FLSUFVRUVkR29nQVNnQ2RDQUJLQUo4UVFSMEVCOGFDeUFHSUFFb0FudzdBU29nQmlBQktBS0lBVHNCS0NBR0lBRW9Bb3dCT3dFc0lBQW9BaEFpQWtFUWFpQUJLQUtBQVNBQ0tBSUVFUUFBSUFBb0FoQWlBa0VRYWlBQktBSjBJQUlvQWdRUkFBQUxJQVlnQVNnQ3VBSWlBallDT0NBQ0JFQWdCaUFHSUFocUlnUTJBalFnQkNBQktBSzBBaUFDUVFOMEVCOGFDeUFBS0FJUUlnSkJFR29nQVNnQ3RBSWdBaWdDQkJFQUFDQUJRUUEyQXJRQ0lBWWdDanNCTGdKQUlBRXRBRzVCQW5FRVFDQUFJQUVvQXV3Q0VCTWdBVUgwQW1vUTlnRU1BUXNnQmlBR0x3QVJRWUFJY2pzQUVTQUdJQUVvQXV3Q05nSkFJQVlnQVNnQzhBSTJBa1FnQmlBQUlBRW9BdlFDSUFFb0F2Z0NFSWtDSWdJMkFsQWdBa1VFUUNBR0lBRW9BdlFDTmdKUUN5QUdJQUVvQXZnQ05nSk1JQVlnQVNnQ2pBTTJBbFFnQmlBQktBS1FBellDU0FzZ0FTZ0N6QUVpQWlBQlFkQUJha2NFUUNBQUtBSVFJZ1JCRUdvZ0FpQUVLQUlFRVFBQUN5QUdJQUVvQXNBQ0lnSTJBandnQWdSQUlBWWdCaUFIYWlJRU5nSWtJQVFnQVNnQ3lBSWdBa0VEZEJBZkdnc2dBQ2dDRUNJQ1FSQnFJQUVvQXNnQ0lBSW9BZ1FSQUFBZ0FVRUFOZ0xJQWlBR0lBWXZBQkZCZm5FZ0FTOEJORUVCY1hJaUFqc0FFU0FHSUFFdkFUaEJBWFJCQW5FZ0FrRjljWElpQWpzQUVTQUdJQUV0QUc0NkFCQWdCaUFCTHdGZ1FRSjBRUVJ4SUFKQmUzRnlJZ0k3QUJFZ0JpQUNRVTl4SUFFdkFXeEJCSFJCTUhGeUlnSTdBQkZCQ0NFRklBWWdBU2dDdEFGQkFFZ0VmeUFCS0FLNEFVRUFSMEVEZEFWQkNBc2dBa0YzY1hJaUFqc0FFU0FHSUFFdkFWQkJCblJCd0FCeElBSkJ2Mzl4Y2lJQ093QVJJQVlnQWtIL2ZuRWdBUzhCVkVFSGRFR0FBWEZ5SWdJN0FCRWdCaUFDUWY5OWNTQUJMd0ZZUVFoMFFZQUNjWElpQWpzQUVTQUdJQUpCLzN0eElBRXZBVnhCQ1hSQmdBUnhjaUlDT3dBUklBWWdBa0gvN3dOeElBRXZBV2hCQzNSQmdCQnhjanNBRVNBQUlBQW9BZ0JCQVdvMkFnQWdCaUFBTmdJd0lBQW9BaEFoQWlBR1FRRTZBQVFnQWlnQ1VDSUVJQVpCQ0dvaUNEWUNCQ0FHSUFKQjBBQnFOZ0lNSUFZZ0JEWUNDQ0FDSUFnMkFsQWdBU2dDQkFSQUlBRW9BaGdpQWlBQktBSWNJZ1EyQWdRZ0JDQUNOZ0lBSUFGQ0FEY0NHQXNnQUNnQ0VDSUFRUkJxSUFFZ0FDZ0NCQkVBQUNBR3JVS0FnSUNBWUlRTUpBc0NRQUpBQWtBZ0FrSHFBV3NPQkFJQ0FRQURDeUFFSUFndUFBRnFRUUZxSVFrTUFnc2dCRUVCYWlJRUlBUWdCMm9zQUFCcUlRa01BUXNnQUNBRFFkd0ZhaUFFUVFGcUlnUWdCQ0FIYWl3QUFHb2dBaUFHRU1NQkRRTUxJQUFnQTBIY0JXb2dDU0FDSUFZUXd3RkZEUUVNQWdzTElBTWdCRFlDMUFVZ0F5QUNOZ0xRQlNBQUlBVWdBMEhRQldvUVJnc2dBQ2dDRUNJQ1FSQnFJQU1vQXVRRklBSW9BZ1FSQUFBZ0FDZ0NFQ0lDUVJCcUlBTW9BdWdGSUFJb0FnUVJBQUFNSGdzZ0JrRVFhaUVHSUFwQkFXb2hDZ3dBQ3dBTFFZVXBRYTc4QUVHczl3RkJsRGdRQUFBTElBTW9BdWdGSWdSQkFFNEVRQ0FESUFRMkFwZ0dDeUFES0FMMEJTRUZJQU1vQXVRRklRWWdBeWdDN0FWQjZRQnJJQXBHRFFFZ0FTQUZRWDhRYVJvZ0JpRUNEQXdMSUFRaEJnd0pDeUFEUVg4MkF0Z0ZJQUVnQlNBRFFad0dhaUFEUWRnRmFoREhBeUVISUFNb0F0d0ZJQU1vQXVBRklBWWdCeERHQXdSQUlBRWdCMEYvRUdrYUlBWWhBZ3dMQ3lBREtBS2NCaUlFUVNocklnaEJCMHRCQVNBSWRFR0RBWEZGY2tVRVFDQUJJQWRCZnhCcEdpQUJJQU1vQW9RR0lBTW9BcGdHRURNZ0EwR0FCbW9nQkVIL0FYRVFFU0FCSUFrZ0N5QUdJQU5CbUFacUVLUUNJUUlNQ3d0QjZ3QWhCUXdJQ3dKQUlBVkJrQUZyUVFKUEJFQWdCVUdYQVVZTkFTQUZRYllCUndSQUlBVkJ3Z0ZIRFFNZ0F5QUdLQUFCTmdLWUJpQUVJUUlNREFzZ0JpZ0FBU0lDUVFCSURRTWdBaUFCS0FLc0FrNE5BeUFOSUFKQkZHeHFJZ2dvQWd4QmYwY05CQ0FJSUFNb0FvUUdOZ0lNSUFnb0FoQWhCd05BSUFjaUFnUkFJQWdvQWd3Z0FpZ0NCQ0lGYXlFR0lBSW9BZ0FoQndKQUFrQUNRQUpBSUFJb0FnaEJBV3NPQkFJQkF3QURDeUFES0FLQUJpQUZhaUFHTmdBQURBSUxJQVpCZ0lBQ2FrR0FnQVJQRFFrZ0F5Z0NnQVlnQldvZ0Jqc0FBQXdCQ3lBR1FZQUJha0dBQWs4TkNTQURLQUtBQmlBRmFpQUdPZ0FBQ3lBQUtBSVFJZ1pCRUdvZ0FpQUdLQUlFRVFBQURBRUxDeUFJUVFBMkFoQWdCQ0VDREFzTElBTkNqb0NBZ0hBM0E2Z0ZJQU5DMmJqOWduQTNBNkFGSUFOQjNBVnFJQVFnQTBHZ0JXb1FKd1JBSUFNb0F1Z0ZJZ0pCQUU0RVFDQURJQUkyQXBnR0N5QURJQU1vQXZBRklnWTJBcFFGSUFOQmZ6WUNtQVVnQXlBREtBTHNCU0lFUVFGck5nS1FCU0FEUWR3RmFpQURLQUxrQlNJQ0lBTkJrQVZxRUNjRVFDQURLQUxvQlNJQ1FRQk9CRUFnQXlBQ05nS1lCZ3NnQkVFQmFpRUVJQU1vQXVRRklRSUxJQUVnQXlnQ2hBWWdBeWdDbUFZUU15QURRWUFHYWlJSElBVkJBbXRCL3dGeEVCRWdCeUFFSUFZUVhRd0xDeUFEUW82QWdJQndOd09JQlNBRFFwaUFnSUN3NkE0M0E0QUZJQU5CM0FWcUlBUWdBMEdBQldvUUp3UkFBa0FnQXlnQzZBVWlBa0VBU0FSQUlBTW9BcGdHSVFJTUFRc2dBeUFDTmdLWUJnc2dBU0FES0FLRUJpQUNFRE1nQTBHQUJtb2lBaUFGUVFKclFmOEJjUkFSSUFJZ0F5MEE3QVVRRVNBQ0lBTW9BdndGRUIwTUJ3c2dBMEtPZ0lDQWNEY0QrQVFnQTBLWmdJQ0FrQWszQS9BRUlBTkIzQVZxSUFRZ0EwSHdCR29RSjBVTkFRSkFJQU1vQXVnRklnSkJBRWdFUUNBREtBS1lCaUVDREFFTElBTWdBallDbUFZTElBRWdBeWdDaEFZZ0FoQXpJQU5CZ0FacUlnSWdCVUVDYTBIL0FYRVFFU0FDUWNrQUVCRU1CZ3NnQTBGL05nTElCU0FEUW9TQWdJQ3dsZXZVcW44M0E4QUZJQU5CM0FWcUlBUWdBMEhBQldvUUowVU5BQ0FES0FMb0JTSUlRUUJPQkVBZ0F5QUlOZ0tZQmdzZ0F5Z0M3QVVoQ0NBREtBTDhCU0lGUWNVQVJnUi9RZlFCQlNBRlFSdEhEUUZCOVFFTElRb2dDRUY5Y1VHcEFVWUVRQ0FCSUFNb0FvUUdJQU1vQXBnR0VETWdBMEdBQm1vZ0NoQVJJQUFnQXlnQy9BVVFFd3dHQ3lBRFF1bUFnSUJ3TndPd0JTQURRZHdGYWlBREtBTGtCU0FEUWJBRmFoQW5SUTBBQWtBZ0F5Z0M2QVVpQlVFQVNBUkFJQU1vQXBnR0lRVU1BUXNnQXlBRk5nS1lCZ3NnQVNBREtBS0VCaUFGRURNZ0EwR0FCbW9nQ2hBUklBQWdBeWdDL0FVUUUwSHFBQ0VGREFZTElBRWdBeWdDaEFZZ0F5Z0NtQVlRTXlBRFFZQUdhaUFHSUFjUWNpQUVJUUlNQ0F0QmhTbEJydndBUWVQMUFVR1VPQkFBQUF0QnZZd0JRYTc4QUVIbDlRRkJsRGdRQUFBTFFjWGRBRUd1L0FCQjhQVUJRWlE0RUFBQUMwR3czUUJCcnZ3QVFmVDFBVUdVT0JBQUFBc2dBeWdDNUFVaEFnd0RDeUFES0FMMEJTRUhJQU1vQXVRRklRWUxJQUVnQXlnQ2hBWWdBeWdDbUFZUU15QUZRZXNBUnlJS1JRUkFJQUVnQ1NBTElBWWdBMEdZQm1vUXBBSWhCZ3NnQjBFQVNBMENJQWNnQVNnQ3JBSk9EUUlnQVNBQktBTFVBaUlFUVFGcU5nTFVBaUFCS0FMTUFpQUVRUVIwYWlJRVFRUTJBZ1FnQkNBRk5nSUFJQU1vQW9RR0lRNGdCQ0FITmdJTUlBUWdEa0VCYWpZQ0NBSkFJQTBnQjBFVWJHb2lDQ2dDRENJSFFYOUdCRUFnQ0NnQ0NDQUNRWDl6YWlJQ1FmOEFTaUFGUWVrQWEwRUNTM0pGQkVBZ0JFRUJOZ0lFSUFRZ0JVR0JBV29pQWpZQ0FDQURRWUFHYWlJRUlBSkIvd0Z4RUJFZ0JFRUFFQkVnQmlFQ0lBQWdDQ0FES0FLRUJrRUJhMEVCRU9nQ0RRUU1Bd3NnQ2lBQ1FmLy9BVXB5RFFFZ0JFRUNOZ0lFSUFSQjdRRTJBZ0FnQTBHQUJtb2lBa0h0QVJBUklBSkJBQkFxSUFZaEFpQUFJQWdnQXlnQ2hBWkJBbXRCQWhEb0FnMEREQUlMSUFjZ0RrRi9jMm9pQWtHQUFXcEIvd0ZMSUFWQjZRQnJRUUpMY2tVRVFDQUVRUUUyQWdRZ0JDQUZRWUVCYWlJRU5nSUFJQU5CZ0FacUlnVWdCRUgvQVhFUUVTQUZJQUpCL3dGeEVCRWdCaUVDREFNTElBb2dBa0dBZ0FKcVFmLy9BMHR5RFFBZ0JFRUNOZ0lFSUFSQjdRRTJBZ0FnQTBHQUJtb2lCRUh0QVJBUklBUWdBa0gvL3dOeEVDb2dCaUVDREFJTElBTkJnQVpxSWdJZ0JVSC9BWEVRRVNBQ0lBZ29BZ3dnQXlnQ2hBWnJFQjBnQmlFQ0lBZ29BZ3hCZjBjTkFTQUFJQWdnQXlnQ2hBWkJCR3RCQkJEb0FnMEJDd3NnQXlnQ2dBWWlBa1VORFNBREtBS1VCaUFDUVFBZ0F5Z0NrQVlSQVFBYURBMExRWVVwUWE3OEFFSGw5Z0ZCbERnUUFBQUxJQUFRZkF3TEN5QUpLQUFCSVFZZ0FTQUJLQUxjQWtFQmFqWUMzQUlNQmdzZ0EwRi9OZ0pJSUFOQzZkU0JnT0FCTndOQUlBTkIzQVZxSUFnZ0EwRkFheEFuUlEwRkFrQWdBeWdDOUFVaUIwRUFTQTBBSUFjZ0FTZ0NyQUpPRFFBZ0F5Z0M2QVVoQkNBREtBTGtCU0VLSUFNb0F1d0ZJUkFnQnlFRkEwQWdBU2dDZ0FJaEVTQUJLQUtrQWlFU1FRQWhDd05BQWtBZ0MwRVVSZzBBSUJJZ0JVRVViR29vQWdRaEFnTkFJQUlnRVdvaUV5MEFBQ0lGUWJZQlJpQUZRY0lCUm5JRVFDQUNRUVZxSVFJTUFRVWdCVUhyQUVjTkFpQUxRUUZxSVFzZ0V5Z0FBU0VGREFNTEFBc0FDd3NnQTBLT2dJQ0FjRGNET0NBRElCQTJBalFnQTBFUk5nSXdJQU5CM0FWcUlBSWdBMEV3YWhBbkJFQWdBeWdDOUFVaEJRd0JDd3NnQTBGL05nSWtJQU1nRURZQ0lDQURRZHdGYWlBQ0lBTkJJR29RSjBVTkJpQUJJQUVvQXRBQ1FRRnFOZ0xRQWlBQklBZEJmeEJwR2lBQklBTW9BdlFGSWdKQkFSQnBHaUFEUVlBR2FpSUZJQkJCL3dGeEVCRWdCU0FDRUIwZ0NpRUlJQVJCZjBZZ0JDQUdSbklOQ0NBQklBRW9BdHdDUVFGcU5nTGNBaUFEUVlBR2FpSUNRY0lCRUJFZ0FpQUVFQjBnQkNFR0RBZ0xRYW9wUWE3OEFFSGQ4Z0ZCK3prUUFBQUxJQUVvQXN3QklBa3ZBQUVpQjBFRGRHcEJCR29oQWdOQUlBSW9BZ0FpQWtFQVNBMEhJQUVvQW5RZ0FrRUVkR29pQkNnQ0JDQUhSdzBISUFRdEFBeEJCSEVFUUNBRFFZQUdhaUlGUWVnQUVCRWdCU0FDUWYvL0EzRVFLZ3NnQkVFSWFpRUNEQUFMQUFzZ0FTZ0N6QUVnRDBFRGRHcEJCR29oQWdOQUlBSW9BZ0FpQWtFQVNBMEdJQUVvQW5RZ0FrRUVkR29pQnlnQ0JDQVBSdzBHSUFFb0Fwd0JJQUpIQkVCQjRRQWhCQ0FEUVlBR2FpSUZJQWNvQWd4QkEzWkJEM0ZCQVd0QkFVMEVmeUFEUVlBR2FpSUVRUU1RRVNBRUlBY29BZ3hCQVhSQkNIVVFIVUhaQUFWQjRRQUxFQkVnQlNBQ1FmLy9BM0VRS2dzZ0IwRUlhaUVDREFBTEFBc0NRQUpBQWtBZ0JFSHBBR3NPQmdRRUFnUUJBd0FMSUFSQk1VWUVRQ0FKTHdBQklRSWdBU0FKTHdBRElnUVE1UVFnQTBHQUJtb2lCVUV4RUJFZ0JTQUNFQ29nQlNBQktBTE1BU0FFUVFOMGFpOEJCRUVCYWtILy93TnhFQ29NQndzZ0JFRXlSd1JBSUFSQnpRQkhEUVVnQ1NnQUFVVU5Cd3dGQ3lBQklBa3ZBQUVpQWhEbEJDQURRWUFHYWlJRVFUSVFFU0FFSUFFb0Fzd0JJQUpCQTNScUx3RUVRUUZxUWYvL0EzRVFLZ3dHQ3lBQklBRW9BdEFDUVFGcU5nTFFBaUFKS0FBQklnSkJBRWdOQkNBQ0lBRW9BcXdDVGcwRUlBRW9BcVFDSUFKQkZHeHFJZ0lvQWdRaEJDQURRdTZBZ0lCd053TUFJQU5CM0FWcUlBUWdBeEFuUlEwRElBSWdBaWdDQUVFQmF6WUNBQXdGQ3lBQklBRW9BdEFDUVFGcU5nTFFBZ3NnQTBGL05nS2NCaUFEUVlBR2FpQUpJQThRY2lBQklBMGdEaUFJSUFOQm5BWnFFS1FDSWdnZ0RrNE5BeUFES0FLY0JpSUNRUUJJSUFJZ0JrWnlEUU1nQVNBQktBTGNBa0VCYWpZQzNBSWdBMEdBQm1vaUJFSENBUkFSSUFRZ0FoQWRJQUloQmd3REN5QUJJQUVvQXRBQ1FRRnFOZ0xRQWdzZ0EwR0FCbW9nQ1NBUEVISU1BUXNMUVlVcFFhNzhBRUc4OFFGQit6a1FBQUFMUVlPT0FVR3UvQUJCZy80QlFmM0xBQkFBQUFzZ0FDQUJFUDBDUW9DQWdJRGdBQXNoRkNBRFFhQUdhaVFBSUJRTHh3MEJCMzhDUUFKQUFrQUNRQUpBSUFBb0FoQWlBMEZIUndSQUlBQkJRR3NvQWdBaEFTQUFRWVVCRUVwRkRRRWdBQ2dDT0VFQkVJTUJRVWRIRFFFTFFYOGhCaUFBUVFCQkFDQUFLQUlZSUFBb0FoUVF4QUZGRFFFTUFnc0NRQUpBQWtBQ1FBSkFBa0FnQTBFemFnNERBQUlCQWdzZ0FTZ0NsQU1pQTBVTkFTQUFLQUlBSVFGQmZ5RUdJQUFRRWcwR0FrQUNRQUpBQWtBZ0FDZ0NFQ0lDUVRscURnUUNBUUVBQVFzZ0FFRUFRUUVRN1FJaEFBd0hDeUFBUVlVQkVFcEZEUUVnQUNnQ09FRUJFSU1CUVVkSERRRUxJQUJCQUVFQUlBQW9BaGdnQUNnQ0ZFRUJRUUFRK0FFaEFBd0ZDeUFBRUJJTkJnSkFBa0FnQWtHemYwWU5BQUpBSUFKQlFrY0VRQ0FDUVV0R0lBSkJVMFp5RFFJZ0FrRXFSd1JBSUFKQit3QkhEUVFnQXlnQ0lDRUVBMEFDUUNBQUtBSVFJZ0pCL1FCR0RRQWdBa0dEZjBZZ0FrRWxha0ZSUzNKRkJFQU1Ed3RCQUNFQ0lBRWdBQ2dDSUJBWUlRVUNRQUpBQWtBZ0FCQVNEUUFnQUVINUFCQktSUTBCSUFBUUVnMEFJQUFvQWhBaUFrR0RmMFlnQWtFbGFrRlJTM0pGQkVCQkFDRUNJQUJCM3ZZQVFRQVFGZ3dCQ3lBQklBQW9BaUFRR0NFQ0lBQVFFa1VOQWdzZ0FTQUZFQk1NREFzZ0FTQUZFQmdoQWdzZ0FDQURJQVVnQWtFQUVQY0JJUWNnQVNBRkVCTWdBU0FDRUJNZ0IwVU5EU0FBS0FJUVFTeEhEUUFnQUJBU1JRMEJEQTBMQ3lBQVFmMEFFQ3dOQ3lBQVFmb0FFRXBGRFFJZ0FCRHNBaUlDUlEwTElBRWdBeUFDRU9zQ0lRVWdBU0FDRUJNZ0JVRUFTQTBMQTBBZ0JDQURLQUlnVGcwRElBTW9BaHdnQkVFVWJHb2lBU0FGTmdJQUlBRkJBVFlDQ0NBRVFRRnFJUVFNQUFzQUN5QUFRZmtBRUVvRVFDQUFFQklOQ3lBQUtBSVFJZ0pCZzM5R0lBSkJKV3BCVVV0eVJRUkFEQTBMSUFFZ0FDZ0NJQkFZSVFJZ0FCQVNEUWdnQUJEc0FpSUVSUTBJSUFFZ0F5QUVFT3NDSVFVZ0FTQUVFQk1nQlVFQVNBMElJQUFnQTBIOUFDQUNRUUVROXdFaEF5QUJJQUlRRXlBRFJRMExJQU1nQlRZQ0FBd0NDeUFBRU93Q0lnSkZEUW9nQVNBRElBSVE2d0loQkNBQklBSVFFeUFFUVFCSURRb2dBU0FEUVNocVFRUWdBMEV3YWlBREtBSXNRUUZxRUhnTkNpQURJQU1vQWl3aUFVRUJhallDTENBREtBSW9JQUZCQW5ScUlBUTJBZ0FNQVFzQ1FBSkFBa0FDUUNBQUtBSVFRVGxxRGdRQ0FRRUFBUXNnQUVFQVFRSVE3UUloQUF3S0N5QUFRWVVCRUVwRkRRRWdBQ2dDT0VFQkVJTUJRVWRIRFFFTElBQkJBRUVBSUFBb0FoZ2dBQ2dDRkVFQ1FRQVErQUVoQUF3SUN5QUFFRllOQ1NBQVFSWVFvUUVnQUNBQVFVQnJJZ0VvQWdCQi9BQkJBUkNnQVVFQVNBMEpJQUJCdlFFUUVDQUFRZndBRUJvZ0FTZ0NBRUVBRUJjZ0FDQURRZndBUVJaQkFCRDNBVVVOQ1FzZ0FCQzNBU0VBREFZTElBQkJBU0FDUVFFUXpBTWhBQXdGQ3lBQVFjMGdRUUFRRmd3SUN5QUJLQUtVQXlJRVJRMEFJQUFvQWpoQkFCQ0RBU0lCUVNoR0lBRkJMa1p5RFFBZ0FDZ0NBQ0VEUVg4aEJpQUFFQklOQlNBRUtBSTRJUVVDUUFKQUFrQUNRQUpBSUFBb0FoQWlBVUgvQUdvT0F3QUNBUUlMSUFNZ0FDa0RJQkF4SWdKRkRRa2dBQkFTUlEwRElBTWdBaEFUREFzTElBQW9BaWdFUUNBQUVPSUJEQXNMUVJZaEFpQURJQUFvQWlBUUdDRUJJQUFRRWcwRUlBQWdCQ0FCUVJZUXl3TU5CQ0FESUFFUUV5QUFLQUlRUVN4SERRRWdBQkFTRFFnZ0FDZ0NFQ0VCQ3lBQlFmc0FSd1JBSUFGQktrY05BU0FBRUJJTkNDQUFRZmtBRUVwRkJFQWdBRUgvbEFGQkFCQVdEQXNMSUFBUUVnMElJQUFvQWhBaUFVR0RmMFlnQVVFbGFrRlJTM0pGQkVBTUNndEIvUUFoQWlBRElBQW9BaUFRR0NFQklBQVFFZzBFSUFBZ0JDQUJRZjBBRU1zRERRUWdBeUFCRUJNTUFRc2dBQkFTRFFjRFFBSkFJQUFvQWhBaUFVSDlBRVlOQUNBQlFZTi9SaUFCUVNWcVFWRkxja1VFUUF3TEMwRUFJUUVnQXlBQUtBSWdFQmdoQWlBQUVCSU5CUUpBSUFCQitRQVFTZ1JBSUFBUUVnMEhJQUFvQWhBaUFVR0RmMFlnQVVFbGFrRlJTM0pGQkVCQkFDRUJJQUJCM3ZZQVFRQVFGZ3dJQ3lBRElBQW9BaUFRR0NFQklBQVFFa1VOQVF3SEN5QURJQUlRR0NFQkN5QUFJQVFnQVNBQ0VNc0REUVVnQXlBQkVCTWdBeUFDRUJNZ0FDZ0NFRUVzUncwQUlBQVFFa1VOQVF3SkN3c2dBRUg5QUJBc0RRY0xJQUFRN0FJaUFrVU5CZ3NnQXlBRUlBSVE2d0loQVNBRElBSVFFeUFCUVFCSURRVWdCU0FFS0FJNElnTWdBeUFGU0JzaEF3TkFJQU1nQlVaRkJFQWdCQ2dDTkNBRlFReHNhaUFCTmdJSUlBVkJBV29oQlF3QkN3c2dBQkMzQVVVTkJBd0ZDMEYvSVFZZ0FFRUhFT0VCRFFRTUF3c2dBeUFCRUJNZ0F5QUNFQk1NQlFzZ0FTQUNFQk1NQkFzZ0FBMEJDMEVBSVFZTElBWVBDeUFBUWQ3MkFFRUFFQllMUVg4THRRTUJBMzhqQUVGQWFpSUJKQUFDUUNBQUtBSVFRWUYvUncwQUlBRWdBQ2dDQkRZQ0VDQUJJQUFvQWhRMkFoUWdBU0FBS0FJWU5nSWNJQUVnQUNnQ01EWUNHRUdCZnlFQ0EwQUNRQ0FDUVlGL1J3MEFJQUFvQWpnaEFpQUJJQUFvQWhnaUEwRUJhallDQkNBQklBSWdBMnRCQW1zMkFnQWdBVUVnYWtFVVFiczhJQUVRVGhwQmZ5RUNJQUFRRWcwQ0FrQUNRQUpBSUFBb0FoQWlBMEdBQVdvT1dRRUJBUUVCQXdNREF3TURBd01EQXdNREF3TURBd0VCQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREFnRUJBUUVEQVFFQkFRTUJBUU1EQVFFQkF3TUJBd01CQVFNREFRRUJBUUVCQVFNQkFRTUJBUUVCQVFFQkFBc2dBMEg5QUVZTkFTQURRVHRIRFFJZ0FCQVNSUTBCREFRTElBQW9BakJGRFFFTEFrQUNmeUFCUVNCcVFkNHZRUXNRWVVVRVFDQUFLQUpBSWdKQkFUWUNRRUVCREFFTElBRkJJR3BCaWNvQVFRb1FZVVVFUUNBQUtBSkFJUUpCQWd3QkN5QUFLQUlBTFFEb0FVVU5BU0FCUVNCcVFiVFpBRUVKRUdFTkFTQUFLQUpBSVFKQkJBc2hBeUFDSUFJdEFHNGdBM0k2QUc0TElBQW9BaEFoQWd3QkN3c2dBQ0FCUVJCcUVPNENJUUlMSUFGQlFHc2tBQ0FDQ3pVQkFuOUJBU0VDSUFBb0FnQWlBVUh4QUd0QkEwa2dBVUVJUm5JZ0FVSFRBRVp5Qkg5QkFRVWdBQ2dDREVINEFIRkJJRVlMQzB3QkEzOGdBQ2dDSUVFWWFpRUJBa0FEUUNBQklnTW9BZ0FpQWtVTkFTQUNRUXhxSVFFZ0FDQUNSdzBBQ3lBRElBQW9BZ3cyQWdBUEMwR2loQUZCcnZ3QVFhUGxBa0dsM2dBUUFBQUxHQUVCZnlBQnB5Z0NJQ0lEQkVBZ0FDQURJQUlSQUFBTEN4c0FJQUFRR3lBQVFnQTNBaEFnQUVJQU53SUlJQUJDQURjQ0FBdkVCQUVJZnlBQVFlUUFhaUlISUFCQjRBQnFJZ00yQWdBZ0FDQUROZ0pnSUFCQjBBQnFJUVFnQUVIVUFHb2lCU2dDQUNFQ0EwQWdCQ0FDSWdGR0JFQUNRQUpBQTBBQ1FDQUVJQVVvQWdBaUFVWUVRQ0FISVFFRFFDQUJLQUlBSWdFZ0EwWU5BaUFBSUFGQkNHdEJ3Z0FROEFNZ0FVRUVhaUVCREFBTEFBc2dBVUVJYXlJQ0tBSUFRUUJNRFFJZ0FVRUVheUlGSUFVdEFBQkJEM0U2QUFBZ0FDQUNRY01BRVBBRElBRkJCR29oQlF3QkN3c2dBRUVDT2dCb0lBQkIyQUJxSVFJRFFDQURJQWNvQWdBaUFVY0VRQ0FCUVFSckxRQUFRUTV4QkVBZ0FTZ0NBQ0lFSUFFb0FnUWlCVFlDQkNBRklBUTJBZ0FnQVVFQU5nSUFJQUlvQWdBaUJDQUJOZ0lFSUFFZ0FqWUNCQ0FCSUFRMkFnQWdBaUFCTmdJQURBSUZJQUFnQVVFSWF4RHRCUXdDQ3dBTEN5QUFRUUE2QUdnZ0FFRVFhaUVESUFBb0Fsd2hBUU5BSUFFZ0FrY0VRQ0FCUVFSckxRQUFRUTV4RFFNZ0FTZ0NCQ0VISUFNZ0FVRUlheUFBS0FJRUVRQUFJQWNoQVF3QkN3c2dBQ0FDTmdKY0lBQWdBRUhZQUdvMkFsZ1BDMEhGalFGQnJ2d0FRZWNzUWZyUkFCQUFBQXRCK1lZQlFhNzhBRUdkTFVIWk9SQUFBQXNnQVVFRWF5SUdMUUFBUVJCSkJFQWdBU2dDQkNFQ0lBQWdBVUVJYXlJSVFjUUFFUEFESUFZZ0JpMEFBRUVQY1VFUWNqb0FBQ0FJS0FJQURRRWdBU2dDQUNJR0lBRW9BZ1FpQ0RZQ0JDQUlJQVkyQWdBZ0FVRUFOZ0lBSUFNb0FnQWlCaUFCTmdJRUlBRWdBellDQkNBQklBWTJBZ0FnQXlBQk5nSUFEQUVMQzBHb2p3RkJydndBUWNRc1FlRGRBQkFBQUFzb0FRRi9JQUVnQVNnQ0FFRUJheUlDTmdJQUlBSkZCRUFnQUVFUWFpQUJJQUFvQWdRUkFBQUxDL0VCQWdaL0FYNGdBRUVJRUNraUJFVUVRRUYvRHdzZ0JFSUJOd0lBSUFLbklRWWdBa0lnaUtkQmRVa2hDQU5BQWtBQ1FDQURRUUpHRFFBZ0FDQUFLUU13SUFOQk1tb1FTU0lKUW9DQWdJQndnMEtBZ0lDQTRBQlNCRUFnQUVFUUVDa2lCUTBDSUFBZ0NSQVBDMEYvSVFjZ0EwVU5BQ0FBSUFFcEF3QVFEd3NnQUNnQ0VDQUVFS01GSUFjUEN5QUVJQVFvQWdCQkFXbzJBZ0FnQlNBRU5nSUlJQWhGQkVBZ0JpQUdLQUlBUVFGcU5nSUFDeUFGSUFJM0F3QWdDVUtBZ0lDQWNGb0VRQ0FKcHlBRk5nSWdDeUFBSUFsQkwwRUJFSllESUFFZ0EwRURkR29nQ1RjREFDQURRUUZxSVFNTUFBc0FDNWdEQWdKK0FuOUNnSUNBZ0RBaEFnSkFBa0FnQVNrQ1ZDSURRaGlHUWppSHB3MEFJQU5DSUlaQ09JZW5CRUFnQTBJUWhrSTRoNmRGRFFFZ0FTa0RZQ0lDUWlDSXAwRjFUd1JBSUFLbklnRWdBU2dDQUVFQmFqWUNBQXNnQUNBQ0VJb0JRb0NBZ0lEZ0FBOExJQUVnQTBMLy8vLy9qMkNEUW9DQWdJQVFoRGNDVkFOQUlBRW9BaFFnQkVvRVFDQUJLQUlRSUFSQkEzUnFLQUlFSWdVcEFsUkNHSVpDT0llblJRUkFJQUFnQlJDbEJTSUNRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRUWdBQ0FDRUE4TElBUkJBV29oQkF3QkN3c0NRQ0FCS0FKUUlnUUVRRUtBZ0lDQTRBQkNnSUNBZ0RBZ0FDQUJJQVFSQXdCQkFFZ2JJUUlNQVFzZ0FDQUJLUU5JUW9DQWdJQXdRUUJCQUJBdklRSWdBVUtBZ0lDQU1EY0RTQXNnQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFGQkFUb0FXU0FBS0FJUUtRT0FBU0lEUWlDSXAwRjFUd1JBSUFPbklnQWdBQ2dDQUVFQmFqWUNBQXNnQVNBRE53TmdDeUFCSUFFcEFsUkMvLy8vaDRCZ2cwS0FnSUFJaERjQ1ZBc2dBZzhMSUFFZ0FTa0NWRUwvLy8vL2oyQ0ROd0pVSUFJTDVnVUNCMzhCZmlNQVFSQnJJZ1VrQUFKQUlBRXBBbFFpQ1VJb2hrSTRoNmNOQUNBQklBbEMvLytEZUlOQ2dJQUVoRGNDVkFOQUFrQWdBU2dDRkNBRFRBUkFRUUFoQXdOQUlBRW9BaUFnQTBvRVFBSkFJQUVvQWh3aUJDQURRUlJzYWlJQ0tBSUlRUUZIRFFBZ0FpZ0NEQ0lIUWYwQVJnMEFJQUFnQlVFSWFpQUZRUXhxSUFFb0FoQWdBaWdDQUVFRGRHb29BZ1FnQnhEMEF5SUNSUTBBSUFBZ0FpQUJJQVFnQTBFVWJHb29BaEFROHdNTUJBc2dBMEVCYWlFRERBRUxDMEVBSVFJZ0FTZ0NVQTBESUFFb0FrZ29BaVFoQ0VFQUlRTkJBQ0VFQTBBQ1FDQUJLQUk0SUFSTUJFQURRQ0FESUFFb0FpQk9EUUlnQVNnQ0hDQURRUlJzYWlJQ0tBSUlSUVJBSUFnZ0FpZ0NBRUVDZEdvb0FnQWlCQ0FFS0FJQVFRRnFOZ0lBSUFJZ0JEWUNCQXNnQTBFQmFpRUREQUFMQUFzZ0FTZ0NFQ0FCS0FJMElBUkJER3hxSWdjb0FnaEJBM1JxS0FJRUlRSUNRQUpBSUFjb0FnUWlCa0g5QUVZRVFDQUFJQUlRalFNaUNVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkRBWUxJQUFnQlVFSWFpQUZRUXhxSUFJZ0JoRDBBeUlHQkVBZ0FDQUdJQUlnQnlnQ0JCRHpBd3dHQ3dKQUlBVW9BZ3dpQmlnQ0RFSDlBRVlFUUNBQUlBVW9BZ2dvQWhBZ0JpZ0NBRUVEZEdvb0FnUVFqUU1pQ1VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBISUFCQkFSRHhBeUlDUlFSQUlBQWdDUkFQREFnTElBQWdBa0VZYWlBSkVDQU1BUXNnQmlnQ0JDSUNSUVJBSUFVb0FnZ29Ba2dvQWlRZ0JpZ0NBRUVDZEdvb0FnQWhBZ3NnQWlBQ0tBSUFRUUZxTmdJQUN5QUlJQWNvQWdCQkFuUnFJQUkyQWdBTUFRc2dBQ0FJSUFjb0FnQkJBblJxS0FJQVFSaHFJQWtRSUFzZ0JFRUJhaUVFREFFTEMwRi9JUUlnQUNBQktRTklRb0dBZ0lBUVFRQkJBQkFoSWdsQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQUlBa1FEMEVBSVFJTUF3c2dBMEVEZENFRVFYOGhBaUFEUVFGcUlRTWdBQ0FFSUFFb0FoQnFLQUlFRUtZRlFRQk9EUUVNQWdzTFFYOGhBZ3NnQlVFUWFpUUFJQUlML2dJQ0JIOENmZ0pBSUFFcEFsUkNNSVpDT0llbkRRQUNRQ0FCS0FKUUJFQURRQ0FDSUFFb0FpQk9EUUlnQVNnQ0hDQUNRUlJzYWlJREtBSUlSUVJBSUFCQkFCRHhBeUlFUlFSQVFYOFBDeUFESUFRMkFnUUxJQUpCQVdvaEFnd0FDd0FMSUFFcEEwZ2hCMEYvSVFNZ0FDQUFLUU13UVEwUVNTSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdCcWNpQWlBSHB5SUROZ0lnSUFNZ0F5Z0NBRUVCYWpZQ0FDQUNRZ0EzQWlRQ1FDQURLQUk4SWdSRkRRQUNRQ0FBSUFSQkFuUVFYeUlFUlEwQUlBSWdCRFlDSkVFQUlRSURRQ0FDSUFNb0FqeE9EUUlnQXlnQ0pDQUNRUU4wYWkwQUFDSUZRUUZ4QkVBZ0FDQUZRUU4yUVFGeEVQRURJZ1ZGRFFJZ0JDQUNRUUowYWlBRk5nSUFDeUFDUVFGcUlRSU1BQXNBQ3lBQUlBWVFEMEYvRHdzZ0FTQUdOd05JSUFBZ0J4QVBDeUFCUVFFNkFGVkJBQ0VDQTBBZ0FTZ0NGQ0FDVEFSQVFRQVBDeUFDUVFOMElRUkJmeUVESUFKQkFXb2hBaUFBSUFRZ0FTZ0NFR29vQWdRUXB3VkJBRTROQUFzTElBTUxNUUVDZndKL0lBQVFQMEVCYWlFQkEwQkJBQ0FCUlEwQkdpQUFJQUZCQVdzaUFXb2lBaTBBQUVFdlJ3MEFDeUFDQ3d0d0FnSi9BWDRqQUVFUWF5SUNKQUFDUUNBQlFRQk9CRUFnQVVHQWdJQ0FlSEloQXd3QkN5QUNJQUUyQWdBZ0FrRUZhaUlCUVF0QjNDSWdBaEJPR2lBQUlBRVFZaUlFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNnQ0VDQUVwMEVCRUtjQ0lRTUxJQUpCRUdva0FDQURDeklBSUFBZ0FSQzhBaUlCUW9DQWdJQndnMEtBZ0lDQXdINVJCSDRnQUVHKzFRQkJBQkNBQWtLQWdJQ0E0QUFGSUFFTEM5QURBZ0ovQVg0Q1FBTkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FFRUhJQUpDSUlpbklnTWdBMEVIYTBGdVNSdEJDbW9PRWdNRUJ3VUhCd2NIQndZQUFRQUFCd2NIQWdjTElBQW9BaEFvQW93QklnTkZEUVlnQXkwQUtFRUVjVVVOQmdzZ0FDZ0MyQUVoQUNBQlFnQTNBZ3dnQVVLQWdJQ0FnSUNBZ0lCL053SUVJQUVnQURZQ0FDQUJJQUxFRUxvQ0dpQUJEd3NnQUNnQ0VDZ0NqQUVpQTBVTkJDQURMUUFvUVFSeFJRMEVJQUpDZ0lDQWdNQ0JnUHovQUh3aUJVS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVVEwRUlBQW9BdGdCSVFBZ0FVSUFOd0lNSUFGQ2dJQ0FnSUNBZ0lDQWZ6Y0NCQ0FCSUFBMkFnQWdBU0FGdjUwUXVnVWFJQUVQQ3lBQ3AwRUVhZzhMSUFBb0FoQW9Bb3dCSWdORkRRSWdBeTBBS0VFRWNVVU5BaUFDcHlJREtBSU1RZjMvLy84SFNnMENJQUFvQXRnQklRUWdBVUlBTndJTUlBRkNnSUNBZ0lDQWdJQ0FmemNDQkNBQklBUTJBZ0FnQVNBRFFRUnFFRVFhSUFGQkFSRFJBUm9nQUNBQ0VBOGdBUThMSUFBZ0FoQ3FCU0lDUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUlNQXdzZ0FDQUNRUUVRbWdFaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkRBSUxDeUFBSUFJUUR5QUFRZXdyUVFBUUZVRUFEd3RCQUF0bUFRSi9Jd0JCRUdzaUF5UUFJQUFnQVNnQ0pDQUNJQUVvQWlCQkEyeEJBWFlpQUNBQUlBSklHeUlBUVFOMElBTkJER29RcUFFaUFnUi9JQU1vQWd3aEJDQUJJQUkyQWlRZ0FTQUVRUU4ySUFCcU5nSWdRUUFGUVg4TElRRWdBMEVRYWlRQUlBRUxVZ0VFZnlBQUtBSWdJZ0pCQUNBQ1FRQktHeUVFUVFBaEFnTkFBa0FnQWlBRVJ3Ui9JQUFvQWh3aUJTQUNRUlJzYWlnQ0VDQUJSdzBCSUFVZ0FrRVViR29GUVFBTER3c2dBa0VCYWlFQ0RBQUxBQXZoQXdFR2Z5TUFRUkJySWdja0FDQUZRUVJxSVFrQ1FBSkFBMEJCQUNFR0lBRkJBRFlDQUNBQ1FRQTJBZ0FnQlNnQ0NDSUlRUUFnQ0VFQVNoc2hDZ0pBQTBBZ0JpQUtSZzBCQWtBZ0F5QUZLQUlBSUFaQkEzUnFJZ3NvQWdCR0JFQWdDeWdDQkNBRVJnMEJDeUFHUVFGcUlRWU1BUXNMSUFaQkFFZ05BRUVDSVFRTUF3c2dBQ0FGUVFnZ0NTQUlRUUZxRUhnRVFFRi9JUVFNQXdzZ0JTQUZLQUlJSWdaQkFXbzJBZ2dnQlNnQ0FDQUdRUU4wYWlJR0lBTTJBZ0FnQmlBQUlBUVFHQ0lJTmdJRUlBTWdDQkN0QlNJR0JFQWdCaWdDQ0VVTkFpQUdLQUlNSWdSQi9RQkdEUUlnQXlnQ0VDQUdLQUlBUVFOMGFpZ0NCQ0VEREFFTEN5QUlRUlpIQkVCQkFDRUdBMEFnQXlnQ0xDQUdTZ1JBQWtBQ1FDQUFJQWRCREdvZ0IwRUlhaUFES0FJUUlBTW9BaWdnQmtFQ2RHb29BZ0JCQTNScUtBSUVJQWdnQlJDdUJTSUVRUUZxRGdVR0FBRUJCZ0VMSUFJb0FnQWlCQVJBSUFFb0FnQWdCeWdDREVZRVFDQUhLQUlJS0FJTUlBUW9BZ3hHRFFJTElBRkJBRFlDQUNBQ1FRQTJBZ0JCQXlFRURBWUxJQUVnQnlnQ0REWUNBQ0FDSUFjb0FnZzJBZ0FMSUFaQkFXb2hCZ3dCQ3d0QkFDRUVJQUlvQWdBTkFndEJBU0VFREFFTElBRWdBellDQUNBQ0lBWTJBZ0JCQUNFRUN5QUhRUkJxSkFBZ0JBdkNBd0VKZnlBQktBSUlJZ1pCQUNBR1FRQktHeUVGQWtBQ1FBTkFJQVFnQlVZTkFTQUVRUUowSVFjZ0JFRUJhaUVFSUFjZ0FTZ0NBR29vQWdBZ0FrY05BQXRCQUNFRkRBRUxRWDhoQlNBQUlBRkJCQ0FCUVFScUlBWkJBV29RZUEwQUlBRWdBU2dDQ0NJRVFRRnFOZ0lJSUFFb0FnQWdCRUVDZEdvZ0FqWUNBQ0FCUVJCcUlRa2dBVUVNYWlFSFFRQWhCUU5BQWtBZ0FpZ0NJQ0FGVEFSQVFRQWhCVUVBSVFRRFFDQUVJQUlvQWl4T0RRUWdCRUVDZENFRElBUkJBV29oQkNBQUlBRWdBaWdDRUNBRElBSW9BaWhxS0FJQVFRTjBhaWdDQkVFQkVLOEZSUTBBQ3d3QkN3SkFJQU5CQUNBQ0tBSWNJQVZCRkd4cUlnWW9BaEFpQ2tFV1Joc05BRUVBSVFRZ0FTZ0NGQ0lJUVFBZ0NFRUFTaHNoQ3dKQUFrQURRQ0FFSUF0R0RRRWdDaUFIS0FJQUlBUkJER3hxSWd3b0FnQkhCRUFnQkVFQmFpRUVEQUVMQ3lBRVFRQk9EUUVMSUFBZ0IwRU1JQWtnQ0VFQmFoQjREUUlnQVNBQktBSVVJZ1JCQVdvMkFoUWdBU2dDRENBRVFReHNhaUlFSUFZb0FoQTJBZ0FDUUNBRFJRUkFJQVlvQWdoRkRRRUxJQVJCQURZQ0NBd0NDeUFFSUFZMkFnZ01BUXNnREVFQU5nSUlDeUFGUVFGcUlRVU1BUXNMUVg4UEN5QUZDMmdDQW44QmZpQUFRUkJxSVFJZ0FDa0NCQ0lFcDBILy8vLy9CM0VoQXdKQUlBUkNnSUNBZ0FpRFVFVUVRRUVBSVFBRFFDQUFJQU5HRFFJZ0FpQUFRUUYwYWk4QkFDQUJRWWNDYkdvaEFTQUFRUUZxSVFBTUFBc0FDeUFDSUFNZ0FSQ3lCU0VCQ3lBQkN4SUFJQUFnQVNBQ0lBTkJnSUFCRU5BQkdnc3NBUUYvQTBBZ0FTQURSa1VFUUNBQUlBTnFMUUFBSUFKQmh3SnNhaUVDSUFOQkFXb2hBd3dCQ3dzZ0Fndk9BUUlEZndGK0lBRWdBa0VCRUxJRklnTkIvLy8vL3dOeElRVWdBQ2dDTkNBQUtBSWtRUUZySUFOeFFRSjBhaUVEQTBBZ0F5Z0NBQ0lFUlFSQVFRQVBDd0pBSUFBb0FqZ2dCRUVDZEdvb0FnQWlBeWtDQkNJR1FpQ0lwMEgvLy8vL0EzRWdCVWNnQmtLQWdJQ0FnSUNBZ0VDRFFvQ0FnSUNBZ0lDQXdBQlNjaUFHcDBILy8vLy9CM0VnQWtjZ0JrS0FnSUNBQ0lOQ0FGSnljZzBBSUFOQkVHb2dBU0FDRUdFTkFDQUVRZDRCVGdSQUlBTWdBeWdDQUVFQmFqWUNBQXNnQkE4TElBTkJER29oQXd3QUN3QUxmd0VFZnlBQkxRQUFRZHNBUmdSQUlBRkJBV29pQXhBL1FRRnJJUUlnQUNnQ0VDZ0NPQ0VFUWRBQklRRURRQ0FCUWQ0QlJ3UkFBa0FnQkNBQlFRSjBhaWdDQUNJRktBSUVRZi8vLy84SGNTQUNSdzBBSUFWQkVHb2dBeUFDRUdFTkFDQUFJQUVRR0E4TElBRkJBV29oQVF3QkN3c1FBUUFMSUFBZ0FSQ3FBUXVzQWdNQ2Z3SitBWHdqQUVFZ2F5SUNKQUJFQUFBQUFBQUErSDhoQmlBQUtBSUlRZi8vLy84SFJ3UkFJQUFvQWdBaEF5QUNRZ0EzQWhnZ0FrS0FnSUNBZ0lDQWdJQi9Od0lRSUFJZ0F6WUNEQ0FDUVF4cUlBQVFSQm9DZmlBQ0tBSVVJZ0JCL2YvLy93ZE1CRUFnQWtFTWFrRTFRY2dFRU00QkdpQUNLQUlVSVFBTFFvQ0FnSUNBZ0lENC93QWdBRUgrLy8vL0IwWU5BQm9nQUVHQWdJQ0FlRVlFUUVJQURBRUxJQUlvQWh3aEF3SitJQUlvQWhoQkFrWUVRQ0FES1FJQURBRUxJQU0xQWdCQ0lJWUxJUVFnQUVHQ2VFd0VRQ0FFUVk1NElBQnJyWWdoQkVJQURBRUxJQVJDQzRoQy8vLy8vLy8vL3dlRElRUWdBRUgrQjJxdFFqU0dDeUVGSUFRZ0JZUWdBalVDRUVJL2hvUy9JUVlnQWtFTWFoQWJDeUFCSUFZNUF3QWdBa0VnYWlRQUN3NEFJQUJDZ0lDQWdQQitFSUFHQys0UEF3dC9BMzRCZkNNQVFVQnFJaEFrQUVIZkFFR0FBaUFFUVNCeEd5RUpJQVJCZ0FOeElRc0NRQUpBQWtBQ2Z3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUJMUUFBSWdaQksyc09Bd0VEQUFNTFFRRWhEaUFCUVFGcUlRRU1BUXNnQVVFQmFpRUJDeUFFUVlBSWNVVU5BU0FCTFFBQUlRWUxJQVpCL3dGeFFUQkhEUUFDUUFKQUFrQWdBUzBBQVNJSFFmZ0FSd1JBSUFkQjd3QkdEUUlnQjBIWUFFY05BUXNnQTBGdmNRMEZJQUZCQW1vaEIwRVFJUU1NQ1FzZ0F5QUhRYzhBUjNJTkFRd0ZDeUFEUlEwRURBTUxBa0FDUUNBSFFlSUFSd1JBSUFORklBZEJ3Z0JHY1EwQklBTWdCMEV3YTBIL0FYRkJDVXR5RFFRZ0JFRVFjUTBDREFjTElBTU5CQXNnQkVFRWNVVU5CVUVDSVFNZ0FVRUNhaUVIREFjTElBRkJBV29oQjBFQklRWURRQ0FCSUFacUlRTWdCa0VCYWlFR0lBTXRBQUFpQ0VINEFYRkJNRVlOQUF0QkNDRURRWUFDSVFsQkFTRUtJQWhCL2dGeFFUaEdEUVFNQmdzZ0JFRUJjU0FMUVlBQ2NrR0FBa2R5RFFBZ0FVRUlhaUVIUWZVY0lRWWdBU0VJQTBBZ0JrSDlIRWNFUUNBSUxRQUFJQVl0QUFCSERRSWdCa0VCYWlFR0lBaEJBV29oQ0F3QkN3c2dDMEdBQWtZRVFDQUFFTFlGSWhGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0E0QUFoRVF3SkN5QVJwMEVFYWlBT0VJd0JEQWdMUkFBQUFBQUFBUEQvUkFBQUFBQUFBUEIvSUE0YkloUzlJaEVDZnlBVW1VUUFBQUFBQUFEZ1FXTUVRQ0FVcWd3QkMwR0FnSUNBZUFzaUJyZTlVUVJBSUFhdElSRU1DQXRDZ0lDQWdNQitJQkZDZ0lDQWdNQ0JnUHovQUgwZ0VVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzaEVRd0hDeUFCSWdjZ0EwVU5BeG9NQlFzZ0FTRUhEQVFMSUFSQkJIRkZEUUFnQVVFQ2FpRUhRUWdoQXd3Q0N5QUJDeUVIUVFvaEF3d0JDMEtBZ0lDQXdINGhFU0FITFFBQUVKWUJJQU5QRFFFTFFRQWhCaUFEUVFwSElRd2dCeUVCQTBBQ1FDQUdJQWRxSWcwdEFBQWlDTUFoRHlBSUVKWUJJQU5PQkVBZ0NTQVBSdzBCQWtBZ0RDQUdRUUZIY2cwQUlBMUJBV3N0QUFCQk1FY05BRUVCSVFZTUFnc2dEUzBBQVJDV0FTQURUZzBCQ3lBSElBWkJBV29pQm1vaEFRd0JDd3RCQUNFTUFrQUNRQ0FFUVFGeERRQUNRQ0FJUVM1SERRQWdEUzBBQVNFSUlBWkZCRUFnQ0JDV0FTQURUZzBCQ3lBTlFRRnFJUUZDZ0lDQWdNQitJUkVnQ1NBSXdFWU5BZ05BQWtBZ0NFSC9BWEVRbGdFZ0EwZ0VRQ0FCTFFBQklRZ01BUXRCQVNFTUlBa2dDTUJIRFFJZ0FTMEFBU0lJRUpZQklBTk9EUUlMSUFGQkFXb2hBUXdBQ3dBTElBRWdCMDBOQUFKQUlBRXRBQUFpQmtIbEFFY0VRQ0FEUVFwR0lBWkJ4UUJHY1EwQklBWkJJSEpCOEFCSElBTkJFRXR5RFFKQkFTQURkRUdFZ2dSeERRRU1BZ3NnQTBFS1J3MEJDMEVCSVF3Z0FVRUJhaUVHQWtBQ1FBSkFJQUV0QUFGQksyc09Bd0FDQVFJTElBRkJBbW9oQmd3QkN5QUJRUUpxSVFZTElBWXRBQUJCT210QmRra05BQ0FHSVFFRFFDQUJJZ1pCQVdvaEFTQUdMUUFCSWdqQUlRMGdDRUU2YTBGMVN3MEFJQWtnRFVjTkFTQUdMUUFDUVRwclFYVkxEUUFMQ3lBQklBZEdCRUJDZ0lDQWdNQitJUkVNQVFzZ0VDRUpBa0FnQVNBSGF5SU5RUUpxSWc5QndRQlBCRUFnQUNnQ0VDSUdRUkJxSUE4Z0JpZ0NBQkVEQUNJSlJRMEJDMEVBSVFaQkFDRUlJQTRFUUNBSlFTMDZBQUJCQVNFSUN5QU5RUUFnRFVFQVNoc2hEZ05BSUFZZ0RrWkZCRUFnQmlBSGFpMEFBQ0lOUWQ4QVJ3UkFJQWdnQ1dvZ0RUb0FBQ0FJUVFGcUlRZ0xJQVpCQVdvaEJnd0JDd3NnQ0NBSmFrRUFPZ0FBQW40Q1FBSkFJQVJCd0FCeEJFQUNRQUpBQWtBQ1FDQUJMUUFBUWV3QWF3NERBUUlBQXdzZ0FVRUJhaUVCUVlBQklRc01CUXNnQVVFQmFpRUJRWUFDSVFzTUJBc2dBVUVCYWlFQlFZQURJUXNNQXdzZ0JFR0FCSEVFUUVLQWdJQ0F3SDRnQ2cwRUdpQUxRWUFCSUF3YklRc01Bd3NnQTBFS1J3MEJEQUlMSUFzTkFTQUVRWUFFY1FSQVFvQ0FnSURBZmlBS0RRTWFJQXhGUVFkMElRc01BZ3RCQUNFTElBTkJDa1lOQVF0Q2dJQ0FnTUIrSUF3TkFSb0xBa0FDUUFKQUFrQUNRQUpBSUF0QkdYY09CQUFCQWdNRUN3SjhJQXdnQTBFS1JuRkZCRUFnQ1NBSkxRQUFJZ1JCTFVacUlRY0RRQ0FISWdaQkFXb2hCeUFHTFFBQUlnaEJNRVlOQUF0Q21MUG16Sm16NXN3WklSSWdBMEVLUndSQVFRQWdBMnVzSUFPc2dDRVNDeUFEclNFVFFRQWhCMElBSVJFRFFBSkFJQWhCL3dGeElnVkZEUUFnQlJDV0FTSUZJQU5PRFFBZ0VTQUZyU0FSSUJOK2ZDQVJJQkpXSWdVYklSRWdCU0FIYWlFSElBWXRBQUVoQ0NBR1FRRnFJUVlNQVFzTElCRzZJUlFnQndSQUlBTzNJQWUzRUk4RElCU2lJUlFMSUJTYUlCUWdCRUV0UmhzTUFRc2dDUkRrQlFzaUZMMGhFU0FSQW44Z0ZKbEVBQUFBQUFBQTRFRmpCRUFnRktvTUFRdEJnSUNBZ0hnTElnYTN2VklOQkNBR3JRd0ZDMEtBZ0lDQXdINGdDaUFNY2cwRUdpQUFJQWtnQXlBRVFRQWdBQ2dDRUNnQ21BSVJJZ0FNQkF0Q2dJQ0FnTUIrSUFvTkF4b2dBQ0FKSUFNZ0JDQUZJQUFvQWhBb0FyUUNFU0lBREFNTFFvQ0FnSURBZmlBRFFRcEhEUUlhSUFBZ0NVRUtJQVJCQUNBQUtBSVFLQUxRQWhFaUFBd0NDeEFCQUF0Q2dJQ0FnTUIrSUJGQ2dJQ0FnTUNCZ1B6L0FIMGdFVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xJUkVnRDBIQkFFa05BU0FBS0FJUUlnQkJFR29nQ1NBQUtBSUVFUUFBREFFTElBQVFmRUtBZ0lDQTRBQWhFUXNnQVNFSEN5QUNCRUFnQWlBSE5nSUFDeUFRUVVCckpBQWdFUXRiQVFSL0lBQW9BZ0FpQTBFQUlBTkJBRW9iSVFWQkFDRURBMEFDUUNBRElBVkhCSDhnQUNnQ0JDSUdJQU5CUEd4cUtBSUFJQUZIRFFFZ0JpQURRVHhzYWlBQ1FRSjBhaWdDQkFWQkFBc1BDeUFEUVFGcUlRTU1BQXNBQzBnQkEzOGdBa0VBSUFKQkFFb2JJUUlEUUNBQ0lBTkdCRUJCQUE4TElBRWdBMm9oQkNBRFFRRjBJUVVnQTBFQmFpRURJQUFnQldvdkFRQWdCQzBBQUdzaUJFVU5BQXNnQkF1L0FRSUNmZ0ovSUFHOUlnTkMvLy8vLy8vLy93ZURJUUlnQTBJL2lLY2hCQUpBQWtBZ0EwSTBpS2RCL3c5eElnVUVRQ0FGUWY4UFJ3MEJJQUpRUlFSQUlBQVFOVUVBRHdzZ0FDQUVFSXdCUVFBUEN5QUNVQVJBSUFBZ0JCQ0pBVUVBRHdzZ0FrSU1oaUlDSUFKNUlnT0dJUUpCQUNBRHAyc2hCUXdCQ3lBQ1FndUdRb0NBZ0lDQWdJQ0FnSCtFSVFJTElBQWdCVUgrQjJzMkFnZ2dBRUVDRUVGRkJFQWdBQ2dDRUNBQ053SUFJQUFnQkRZQ0JFRUFEd3NnQUJBMVFTQUxxd0VDQVg0Q2Z5QUJLUUlFUW9DQWdJQUlneUVESUFBdEFBZEJnQUZ4UlFSQUlBTlFCRUFnQUVFUWFpQUJRUkJxSUFJUVlROExRUUFnQVVFUWFpQUFRUkJxSUFJUXVRVnJEd3NnQVVFUWFpRUVJQUJCRUdvaEFDQURVQVJBSUFBZ0JDQUNFTGtGRHdzZ0FrRUFJQUpCQUVvYklRVkJBQ0VCQTBBZ0FTQUZSZ1JBUVFBUEN5QUJRUUYwSVFJZ0FVRUJhaUVCSUFBZ0Ftb3ZBUUFnQWlBRWFpOEJBR3NpQWtVTkFBc2dBZ3ZUQkFFSWZ5QURJQUVvQWdBaUJDZ0NIRUVEYkVFQ2JTSUZJQU1nQlVvYklRZ0NRQ0FDQkVBZ0FDQUNLQUlVSUFoQkEzUVFpUUlpQTBVTkFTQUNJQU0yQWhRTElBUW9BaGdpQmtFQmFpSUZJUU1EUUNBRElnSkJBWFFoQXlBQ0lBaEpEUUFMQWtBZ0FpQUZSd1JBSUFBZ0FrRUNkQ0lISUFoQkEzUnFRVEJxRUNraUNrVU5BaUFFS0FJSUlnTWdCQ2dDRENJRk5nSUVJQVVnQXpZQ0FDQUVRZ0EzQWdnZ0J5QUthaUlHSUFRZ0JDZ0NJRUVEZEVFd2FoQWZJUVVnQUNnQ0VDSURLQUpRSWdrZ0JVRUlhaUlMTmdJRUlBVWdBMEhRQUdvMkFnd2dCU0FKTmdJSUlBTWdDellDVUNBRklBSkJBV3NpQ1RZQ0dFRUFJUU1nQ2tFQUlBY1FLeG9nQlVFd2FpRUNBMEFnQXlBRktBSWdUMFVFUUFKQUlBSW9BZ1FpQjBVRVFDQURRUUZxSVFNTUFRc2dBaUFDS0FJQVFZQ0FnR0J4SUFVZ0J5QUpjVUYvYzBFQ2RHb2lCeWdDQUVILy8vOGZjWEkyQWdBZ0J5QURRUUZxSWdNMkFnQUxJQUpCQ0dvaEFnd0JDd3NnQUNnQ0VDSUFRUkJxSUFRZ0JDZ0NHRUYvYzBFQ2RHb2dBQ2dDQkJFQUFBd0JDeUFFS0FJSUlnSWdCQ2dDRENJRE5nSUVJQU1nQWpZQ0FDQUVRZ0EzQWdnZ0FDQUVJQVpCZjNOQkFuUnFJQVZCQW5RaUFpQUlRUU4wYWtFd2FoQ0pBaUlEUlFSQUlBQW9BaEFpQUNnQ1VDSUJJQVJCQ0dvaUFqWUNCQ0FFSUFCQjBBQnFOZ0lNSUFRZ0FUWUNDQ0FBSUFJMkFsQkJmdzhMSUFBb0FoQWlBQ2dDVUNJRUlBSWdBMm9pQmtFSWFpSUNOZ0lFSUFZZ0FFSFFBR28yQWd3Z0JpQUVOZ0lJSUFBZ0FqWUNVQXNnQVNBR05nSUFJQVlnQ0RZQ0hFRUFEd3RCZnd2VEFRSUZmd0YrQWtBZ0FTa0NCQ0lIcDBILy8vLy9CM0VpQkVFTGEwRjJTUTBBSUFGQkVHb2hBZ0ovSUFkQ2dJQ0FnQWlEVUNJRlJRUkFJQUl2QVFBTUFRc2dBaTBBQUFzaUFVRXdheUlEUVFsTERRQUNmd0pBSUFGQk1FY0VRRUVCSVFFRFFDQUJJQVJHRFFJQ2Z5QUZSUVJBSUFJZ0FVRUJkR292QVFBTUFRc2dBU0FDYWkwQUFBdEJNR3NpQmtFSlN3MEVJQUZCQVdvaEFTQUdyU0FEclVJS2Zud2lCNmNoQXlBSFFvQ0FnSUFRVkEwQUN3d0RDMEVBSWdNZ0JFRUJSdzBCR2dzZ0FDQUROZ0lBUVFFTER3dEJBQXVwQWdJRGZ3RitBa0FnQUNBQ0VEaEZEUUFnQXFjaUJDOEJCa0VPUmdSQUlBQWdBU0FFS0FJZ0tRTUFFTkFGRHdzZ0FVS0FnSUNBY0ZRTkFBSkFJQUFnQWtFN0lBSkJBQkFVSWdKQy8vLy8vMjlZQkVCQmZ5RURJQUpDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBUWNZd1FRQVFGUXdCQ3lBQnB5RUVJQUtuSVFVQ1FBTkFBa0FnQkNnQ0VDZ0NMQ0lEUlFSQVFRQWhBeUFFTHdFR1FUQkhEUVFnQkNBRUtBSUFRUUZxTmdJQUlBU3RRb0NBZ0lCd2hDRUJBMEFnQUNBQkVJd0NJZ0ZDZ0lDQWdIQ0RJZ1pDZ0lDQWdDQlJEUVJCZnlFRElBWkNnSUNBZ09BQVVRMEZJQUduSUFWR0JFQWdBQ0FCRUE4TUF3c2dBQkI3UlEwQUN5QUFJQUVRRHd3RUN5QURJZ1FnQlVjTkFRc0xRUUVoQXd3QkMwRUFJUU1MSUFBZ0FoQVBDeUFEQzlJREFnSitBbjhqQUVFZ2F5SUVKQUFDUUNBQlF2Ly8vLy8vLy8vLy93Q0RJZ05DZ0lDQWdJQ0F3SUE4ZlNBRFFvQ0FnSUNBZ01EL3d3QjlWQVJBSUFGQ0JJWWdBRUk4aUlRaEF5QUFRdi8vLy8vLy8vLy9ENE1pQUVLQmdJQ0FnSUNBZ0FoYUJFQWdBMEtCZ0lDQWdJQ0FnTUFBZkNFQ0RBSUxJQU5DZ0lDQWdJQ0FnSUJBZlNFQ0lBQkNnSUNBZ0lDQWdJQUlVZzBCSUFJZ0EwSUJnM3doQWd3QkN5QUFVQ0FEUW9DQWdJQ0FnTUQvL3dCVUlBTkNnSUNBZ0lDQXdQLy9BRkViUlFSQUlBRkNCSVlnQUVJOGlJUkMvLy8vLy8vLy93T0RRb0NBZ0lDQWdJRDgvd0NFSVFJTUFRdENnSUNBZ0lDQWdQai9BQ0VDSUFOQy8vLy8vLy8vdi8vREFGWU5BRUlBSVFJZ0EwSXdpS2NpQlVHUjl3QkpEUUFnQkVFUWFpQUFJQUZDLy8vLy8vLy9QNE5DZ0lDQWdJQ0F3QUNFSWdJZ0JVR0I5d0JyRUdjZ0JDQUFJQUpCZ2ZnQUlBVnJFSTRDSUFRcEF3aENCSVlnQkNrREFDSUFRanlJaENFQ0lBUXBBeEFnQkNrREdJUkNBRkt0SUFCQy8vLy8vLy8vLy84UGc0UWlBRUtCZ0lDQWdJQ0FnQWhhQkVBZ0FrSUJmQ0VDREFFTElBQkNnSUNBZ0lDQWdJQUlVZzBBSUFKQ0FZTWdBbndoQWdzZ0JFRWdhaVFBSUFJZ0FVS0FnSUNBZ0lDQWdJQi9nNFMvQ3cwQUlBQWdBU0FDUVFBUXZBRUx1Z01DQVg0RGZ5TUFRUkJySWdRa0FBSkFBa0FDUUFKQUFrQURRQUpBSUFFaEF3SkFBa0FDUUFKQUFrQUNRQUpBUVFjZ0FVSWdpS2NpQlNBRlFRZHJRVzVKRzBFTGFnNFRBQUVDQ1FjS0Nnb0tDZ1lOQlFVTENnb05EUW9MSUFKQkFVWU5BaUFBSUFFUUR5QUFRZExIQUVFQUVCVU1Dd3NnQWtFQlJnMEJJQUFnQVJBUElBQkI4TVlBUVFBUUZRd0tDeUFDUVFGSERRRUxJQUVoQXd3SkN5QUFJQUVRRHlBQVFaREhBRUVBRUJVTUJ3c2dBVUwvLy8vL0Q0TWhBd3dIQzBLQWdJQ0E0QUFoQXlBQUlBRkJBUkNhQVNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTUJnc0xJQUFnQkVFSWFpQUJFT1VCSVFJZ0FDQUJFQThnQWtVTkF5QUVJQUlnQWhDQkFpSUZhaUlHTmdJTVFnQWhBd0pBSUFVZ0JDZ0NDRVlOQUNBQUlBWWdCRUVNYWtFQVFRUVF1QUlpQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFRZ0JDZ0NEQkNCQWlBRUtBSU1haUlGTmdJTUlBUW9BZ2dnQlNBQ2EwWU5BQ0FBSUFNUUQwS0FnSUNBd0g0aEF3c2dBQ0FDRUZRTUJBc2dBQ0FCRUE4Z0FFR3l4d0JCQUJBVkRBSUxJQUFnQVJBUEMwS0FnSUNBd0g0aEF3d0JDMEtBZ0lDQTRBQWhBd3NnQkVFUWFpUUFJQU1MaXdJQ0EzOEJmaU1BUVJCcklnVWtBQ0FGSUFJM0F3Z0NRQ0FBTHdIb0FVR0FBa2tOQUNBQUlBSkIzUUVnQWtFQUVCUWlBa0tBZ0lDQWNJTWlCMEtBZ0lDQU1GRU5BQUpBSUFkQ2dJQ0FnT0FBVVEwQUlBQWdBa0VsRUVzaUJrVU5BQ0FHS0FJRUJFQWdBQ0FDRUE4TUFnc2dCaUFERVBjRFFRSjBJZ1JxS0FJSUlnTkZCRUFnQlNBRVFjREFBV28yQWdBZ0FFSGRQQ0FGRUJVTUFRdEJBU0VFSUFNZ0F5Z0NBRUVCYWpZQ0FDQUFJQU90UW9DQWdJQndoRUtBZ0lDQU1FRUJJQVZCQ0dvUUx5SUhRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FDRUE4Z0FTQUhOd01BREFFTElBQWdBaEFQSUFGQ2dJQ0FnREEzQXdCQmZ5RUVDeUFGUVJCcUpBQWdCQXRmQVFGL0lBRkJFR29oQXdKQUlBRXRBQWRCZ0FGeEJFQWdBQ0FESUFKQkFYUVFIeG9NQVF0QkFDRUJJQUpCQUNBQ1FRQktHeUVDQTBBZ0FTQUNSZzBCSUFBZ0FVRUJkR29nQVNBRGFpMEFBRHNCQUNBQlFRRnFJUUVNQUFzQUN3dnZBZ0lCZndGOEl3QkJJR3NpQXlRQUlBRUNmd0ovQWtBQ1FBTkFBa0FDUUFKQUFrQkJCeUFDUWlDSXB5SUJJQUZCQjJ0QmJra2JJZ0VPQ0FBQUFBQURBd01CQWdzZ0FxY01CZ3RCQUNFQUlBSkNnSUNBZ01DQmdQei9BSHdpQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWZzBESUFLL0lnUkVBQUFBQUFBQUFBQmpEUU5CL3dFZ0JFUUFBQUFBQU9CdlFHUU5CaG9DZnlBRW5pSUVtVVFBQUFBQUFBRGdRV01FUUNBRXFnd0JDMEdBZ0lDQWVBc01CZ3NnQVVGM1JnMERDeUFBSUFJUWpRRWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVnMEFDMEYvSVFBTFFRQU1BZ3NnQUNnQzJBRWhBU0FEUWdBM0FoUWdBMEtBZ0lDQWdJQ0FnSUIvTndJTUlBTWdBVFlDQ0NBRFFRaHFJZ0VnQXFkQkJHb1FSQm9nQVVFQUVORUJHaUFEUVJ4cUlBRkJBQkNwQVNBQkVCc2dBQ0FDRUE4Z0F5Z0NIQXNoQVVFQUlRQkIvd0VnQVNBQlFmOEJUaHNpQVVFQUlBRkJBRW9iQ3pZQ0FDQURRU0JxSkFBZ0FBdFBBUUovSXdCQklHc2lBeVFBQW44Z0FDQURRUXhxSUFJUXF3VWlCRVVFUUNBQlFnQTNBd0JCZnd3QkN5QUJJQVJCQVJDQ0F4b2dBQ0FFSUFOQkRHb1FYa0VBQ3lFQUlBTkJJR29rQUNBQUM2Z0JBUVYvSUFDbklnTW9BaEFpQVVFd2FpRUVJQUVnQVNnQ0dFRi9jMEVDZEVHa2ZuSnFLQUlBSVFFRFFDQUJSUVJBUVFBUEN5QUVJQUZCQVdzaUJVRURkR29pQVNnQ0FDRUNJQUVvQWdSQk5rY0VRQ0FDUWYvLy94OXhJUUVNQVFzTFFRRWhBUUpBSUFKQi8vLy8vd05MRFFBZ0F5Z0NGQ0FGUVFOMGFpa0RBQ0lBUW9DQWdJQndnMEtBZ0lDQWtIOVNEUUFnQUtjb0FnUkIvLy8vL3dkeFFRQkhJUUVMSUFFTHl3RUNBbjhCZmlNQVFSQnJJZ1lrQUFKQUFrQWdBa0tBZ0lDQWNGUU5BQ0FDcHlJSEx3RUdRUXhIRFFBZ0J5MEFLVUVNUncwQUlBQWdBU0FESUFNRWZ5QUVCU0FHUW9DQWdJQXdOd01JSUFaQkNHb0xJQVVnQnk0QktpQUhLQUlrRVJJQUlRZ01BUXRDZ0lDQWdPQUFJUWdDUUNBQUlBSWdBU0FESUFRUUlTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCU0JFQWdBVUwvLy8vL2IxWU5BU0FBSUFFUUR5QUFRWTR4UVFBUUZRc2dCVUVBTmdJQURBRUxJQVZCQWpZQ0FDQUJJUWdMSUFaQkVHb2tBQ0FJQzVjQkFBSkFBa0FDUUFKQUFrQWdBVUlnaUtkQkEyb09BZ0VBQWdzZ0FDQUFJQUVnQXlBRUVJd0VJQUpCQUVFQUVDOFBDeUFBSUFFUUR3SkFJQUFnQWFjaUF4Q25CVUVBU0EwQUlBQWdBeENtQlVFQVNBMEFJQUFnQXhDbEJTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRTUxJQUJCQWhDUEJBd0JDeUFBSUFFUUR5QUFRZkwyQUVFQUVCVUxRb0NBZ0lEZ0FDRUJDeUFCQytvREFRVi9Jd0JCRUdzaUJpUUFBa0FDUUFKQUFuOGdBQ2dDRUNJRUtBS29BU0lEUlFSQUlBSXRBQUJCTGtjRVFDQUFJQUlROFFVTUFnc2dBUkNvQlNFRlFRQWhBeUFBSUFJUVB5QUZJQUZyUVFBZ0JSc2lCV3BCQW1vUUtTSUhSUTBFSUFjZ0FTQUZFQjhpQVNBRmFrRUFPZ0FBQWtBRFFBSkFJQUl0QUFCQkxrY05BRUVDSVFNQ1FBSkFJQUl0QUFGQkxtc09BZ0FCQWdzZ0FpMEFBa0V2UncwQklBRXRBQUJGRFFNZ0FSQ29CU0lEUVFGcUlBRWdBeHNpQTBIWmtBRVE4Z05GRFFFZ0EwSFlrQUVROGdORkRRRWdBeUFCSUFOSmEwRUFPZ0FBUVFNaEF3c2dBaUFEYWlFQ0RBRUxDeUFCTFFBQVJRMEFJQUVRUHlBQmFrRXZPd0FBQ3lBQkVEOGdBV29nQWhEbEJTQUJJUUlNQWdzZ0FDQUJJQUlnQkNnQ3NBRWdBeEVIQUFzaUFrVU5BUXNnQUNBQ0VLb0JJZ0ZGQkVBZ0FDZ0NFQ0lBUVJCcUlBSWdBQ2dDQkJFQUFBd0JDeUFBSUFFUTRRVWlBd1JBSUFBb0FoQWlCRUVRYWlBQ0lBUW9BZ1FSQUFBZ0FDQUJFQk1NQWdzZ0FDQUJFQk1nQkNnQ3JBRWlBVVVFUUNBR0lBSTJBZ0FnQUVIcWxnRWdCaERHQWlBQUtBSVFJZ0JCRUdvZ0FpQUFLQUlFRVFBQURBRUxJQUFnQWlBRUtBS3dBU0FCRVFFQUlRTWdBQ2dDRUNJQVFSQnFJQUlnQUNnQ0JCRUFBQXdCQzBFQUlRTUxJQVpCRUdva0FDQURDelVCQVg4Z0FDZ0NnQUlpQjBVRVFDQUFRWkQyQUVFQUVCVkNnSUNBZ09BQUR3c2dBQ0FCSUFJZ0F5QUVJQVVnQmlBSEVUb0FDLzRFQVFsL0l3QkJFR3NpQmlRQUFuOUJmeUFBSUFaQkRHb2dBa0VBRU1JQ0RRQWFJQUVvQWhBdEFETkJDSEZGQkVBZ0FDQURRVEFRd0FJTUFRc2dBUzBBQlVFSWNRUkFJQVlvQWd3aUF5QUJLQUlvSWdWSkJFQWdBeUVFQTBBZ0JDQUZSa1VFUUNBQUlBRW9BaVFnQkVFRGRHb3BBd0FRRHlBRVFRRnFJUVFNQVFzTElBRWdBellDS0FzZ0FTZ0NGQ0FEUVFCT0JINGdBNjBGUW9DQWdJREFmaUFEdUwwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3MzQXdCQkFRd0JDeUFBSUFaQkJHb2dBU2dDRkNrREFCQjNHaUFHS0FJTUlnZ2hCUUpBSUFZb0FnUWlCeUFJVFEwQUlBRW9BaEFpQ2lnQ0lDSUVJQWNnQ0d0UEJFQURRQ0FISWdVZ0NFME5BaUFBSUFFZ0FDQUZRUUZySWdjUXFRVWlDUkQ1QXlFRUlBQWdDUkFUSUFRTkFBd0NDd0FMSUFwQk1Hb2lCeUVNQTBBZ0JDQUpUQVJBQTBBZ0JDQUxUQTBEQWtBZ0J5Z0NCQ0lFUlEwQUlBQWdCa0VJYWlBRUVLd0JSUTBBSUFZb0FnZ2dCVWtOQUNBQUlBRWdCeWdDQkJENUF4b2dBU2dDRUNJS0lBdEJBM1JxUVRCcUlRY0xJQWRCQ0dvaEJ5QUxRUUZxSVFzZ0NpZ0NJQ0VFREFBTEFBVUNRQ0FNS0FJRUlnUkZEUUFnQUNBR1FRaHFJQVFRckFGRkRRQWdCaWdDQ0NJRUlBVkpEUUFnQlNBRVFRRnFJQXd0QUFOQkJIRWJJUVVMSUF4QkNHb2hEQ0FKUVFGcUlRa2dDaWdDSUNFRURBRUxBQXNBQ3lBQUlBRW9BaFFnQlVFQVRnUitJQVd0QlVLQWdJQ0F3SDRnQmJpOUlnSkNnSUNBZ01DQmdQei9BSDBnQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUNCQkFTQUZJQWhORFFBYUlBQWdBMEh0NlFBUWJ3c2hCQ0FHUVJCcUpBQWdCQXRzQWdKL0FYd2pBRUVRYXlJQ0pBQUNmeUFCUWlDSXB5SURCRUJCQUNBRFFRdHFRUkpKRFFFYUMwRi9JQUFnQWtFSWFpQUJFRUlOQUJvZ0Fpc0RDQ0lFdlVLQWdJQ0FnSUNBK1A4QWcwS0FnSUNBZ0lDQStQOEFVaUFFbkNBRVlYRUxJUUFnQWtFUWFpUUFJQUFMNEFNQ0JIOENmaUFCUVFCSUJFQWdBVUgvLy8vL0IzR3REd3NDUUNBQklBQW9BaEFpQkNnQ0xFa0VRQUorQWtBZ0JDZ0NPQ0FCUVFKMGFpZ0NBQ0lDS1FJRUlnWkNnSUNBZ0lDQWdJQkFnMEtBZ0lDQWdJQ0FnTUFBVWcwQUlBSkJFR29oQkNBR3AwSC8vLy8vQjNFaEJRSkFJQVpDZ0lDQWdBaURVRVVFUUNBRlJRMENBa0FnQkNJQkx3RUFJZ05CTFVjTkFDQUNRUkpxSVFFZ0FpOEJFaUlEUVRCSERRQkNnSUNBZ01EKy93TWdCVUVDUmcwRUdnc2dBMEU2YTBGMVN3MEJJQU5CeVFCSElBUWdCVUVCZEdvZ0FXdEJFRWR5RFFJZ0FVRUNha0dnd0FGQkRoQmhSUTBCREFJTElBVkZEUUVDUUNBRUlnRXRBQUFpQTBFdFJ3MEFJQUpCRVdvaEFTQUNMUUFSSWdOQk1FY05BRUtBZ0lDQXdQNy9BeUFGUVFKR0RRTWFDeUFEUVRwclFYVkxEUUFnQTBISkFFY2dCQ0FGYWlBQmEwRUlSM0lOQVNBQlFRRnFRZlljUVFjUVlRMEJDeUFDSUFJb0FnQkJBV28yQWdBZ0FDQUNyVUtBZ0lDQWtIK0VFSTBCSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQUlBWVFLQ0lIUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBR0VBOGdCdzhMSUFJZ0I2Y1Fnd0loQVNBQUlBY1FEeUFCUlEwRElBQWdCaEFQQzBLQWdJQ0FNQXNQQzBIdjN3QkJydndBUWRrWVFmS0xBUkFBQUFzZ0JndmJBUUVEZndKQUlBQWdBU2dDR0VFQmFrRUNkQ0lDSUFFb0FoeEJBM1JxUVRCcUlnTVFLU0lFUlFSQVFRQWhBZ3dCQ3lBRUlBRWdBU2dDR0VGL2MwRUNkR29nQXhBZklBSnFJZ0pCQVRZQ0FDQUFLQUlRSVFFZ0FrRUNPZ0FFSUFFb0FsQWlBeUFDUVFocUlnUTJBZ1FnQWlBQlFkQUFhallDRENBQ0lBTTJBZ2dnQVNBRU5nSlFRUUFoQVNBQ1FRQTZBQkFnQWlnQ0xDSURCRUFnQXlBREtBSUFRUUZxTmdJQUN5QUNRVEJxSVFNRFFDQUJJQUlvQWlCUERRRWdBQ0FES0FJRUVCZ2FJQU5CQ0dvaEF5QUJRUUZxSVFFTUFBc0FDeUFDQytvQkFnZC9BWDRnQUNJRFFkQUFhaUVHSUFGQkdHb2hCeUFCS0FJY0lRQURRQ0FBSUFkR1JRUkFJQUFvQWdRaENDQUFRUUpyTHdFQUlRSUNRQUpBSUFCQkEyc2lCQzBBQUNJRlFRSnhCRUFnQVNnQ0VDQUNRUU4wYWlrREFDSUpRaUNJcDBGMFN3MEJEQUlMSUFFb0FoUWdBa0VEZEdvcEF3QWlDVUlnaUtkQmRVa05BUXNnQ2FjaUFpQUNLQUlBUVFGcU5nSUFJQVF0QUFBaEJRc2dBQ0FKTndNUUlBQWdBRUVRYWpZQ0NDQUVJQVZCQVhJNkFBQWdBRUVFYTBFRE9nQUFJQU1vQWxBaUFpQUFOZ0lFSUFBZ0JqWUNCQ0FBSUFJMkFnQWdBeUFBTmdKUUlBZ2hBQXdCQ3dzTG93RUNBWDhDZmlNQVFSQnJJZ01rQUNBRElBRTNBd2dDZndKQUlBSkNnSUNBZ0hCYUJFQWdBQ0FDUWRrQklBSkJBQkFVSWdWQ2dJQ0FnSENESWdSQ2dJQ0FnQ0JSSUFSQ2dJQ0FnREJSY2tVRVFFRi9JQVJDZ0lDQWdPQUFVUTBER2lBQUlBQWdCU0FDUVFFZ0EwRUlhaEF2RUNZTUF3c2dBQ0FDRURnTkFRc2dBRUgrOHdCQkFCQVZRWDhNQVFzZ0FDQUJJQUlRdmdVTElRQWdBMEVRYWlRQUlBQUxLd0VCZnlBQlFSQnJJZ01nQUNBREtRTUFJQUZCQ0dzcEF3QVF3QVVnQWtldFFvQ0FnSUFRaERjREFBdVZDZ01FZmdsL0Fud2pBRUVRYXlJS0pBQkJxZ0ZCcVFFZ0Foc2hEaUFCUVFocklnOHBBd0FoQXlBQlFSQnJJZ3dwQXdBaEJRSkFBa0FDUUFKQUEwQkJCeUFEUWlDSXB5SUJJQUZCQjJ0QmJra2JJUWNnQlVMLy8vLy9ENE1oQmdKQUFrQUNRQUpBQWtBQ1FBTkFBa0JCQnlBRklnUkNJSWluSWdFZ0FVRUhhMEZ1U1JzaUFVRUxhaUlJUVJKTFFRRWdDSFJCaDVBUWNVVnlEUUFnQjBFTGFpSUlRUkpMUVFFZ0NIUkJoNUFRY1VWeURRQWdBU0FIY2tVRVFDQUVweUFEcDBZaENRd01Dd0pBQW53Q2ZDQUJRUWRHQkVBZ0IwRUFJQWRCQjBjYkRRTWdCRUtBZ0lDQXdJR0EvUDhBZkw4aUVDQUhRUWRHRFFFYUlBT250d3dDQ3lBSFFRZEhJQUZ5RFFJZ0JLZTNDeUVRSUFOQ2dJQ0FnTUNCZ1B6L0FIeS9DeUVSSUJBZ0VXRWhDUXdNQ3lBQlFYVkhJQWRCZFVkeFJRUkFJQUJCcVFFZ0JDQURJQUFvQWhBb0F0d0NFUndBSWdsQkFFNE5EQXdMQ3lBQUtBSVFJUWdnQVVGM1J5QUhRWGRIY1VVRVFDQUFRYWtCSUFRZ0F5QUlLQUxBQWhFY0FDSUpRUUJPRFF3TUN3c2dBRUdwQVNBRUlBTWdDQ2dDcEFJUkhBQWlDVUVBVGcwTERBb0xJQUVnQjBZRVFBSkFJQWRCZjBjTkFDQUFJQXBCQ0dvZ0JDQURJQTVCQUVFQ0VJVUNJZ0ZGRFFBZ0FDQUVFQThnQUNBREVBOGdBVUVBU0EwTElBd2dDaWtEQ0RjREFFRUFJUUVNRFFzZ0FDQUVJQU5CQUJDOEFTRUpEQXNMUVFFaENTQUJRUUpHSUFkQkEwWnhJQWRCQWtZZ0FVRURSbkZ5RFFvQ1FBSkFJQUZCZVVZRVFFRUFJUWxCZVNFTElBY2lEU0VJQWtBZ0IwRUxhZzROQWdJQ0J3Z0hCd2NIQndjQ0JRQUxJQWRCQjBZTkFRd0dDeUFIUVhsSERRRkJlU0VOSUFZaEJTQUJJUWdDUUFKQUlBRkJBV29PQ1FrQkJBZ0lDQWdJQVFBTElBRkJDMnBCQTBrTkFBd0hDeUFCUVhaR0lRbEJlU0VIQ3dKQUFrQWdDVVVnQjBGMlIzRU5BQ0FBS0FJUUtBS01BU0lJQkVBZ0NDMEFLRUVFY1EwQkN3SkFBa0FnQVVGNVJ3UkFJQVFoQlF3QkN5QUFJQVFRdkFJaUJVS0FnSUNBY0lOQ2dJQ0FnT0IrVWcwQkN5QUhRWGxIRFFJZ0FDQURFTHdDSWdOQ2dJQ0FnSENEUW9DQWdJRGdmbEVOQWdzZ0FDQUZFQThnQUNBREVBOUJBQ0VKREEwTElBQWdCQkJzSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQ0NBQUlBTVFiQ0lEUW9DQWdJQndnMEtBZ0lDQTRBQlJEUW9MSUFBZ0JTQURFTUFGSVFrTUN3c2dCaUVGSUFGQkFVWU5BQXNnQjBFQlJ3MEJDeUFEUXYvLy8vOFBneUVESUFRaEJRd0ZDeUFCSWd0QmYwY05BQ0FIUVF0cUlnRkJFazFCQUVFQklBRjBRWWVRRUhFYkRRSkJmeUVMSUFkQmZuRkJlRVlOQWdzZ0IwRi9Sd1IvSUFjRklBdEJmbkZCZUVZZ0MwRUxhaUlCUVJKTlFRQkJBU0FCZEVHSGtCQnhHM0lOQWtGL0N5RU5JQXNoQ0FzQ2Z3SkFJQVJDZ0lDQWdIQlVEUUFnQktjc0FBVkJBRTROQUVFQklBMUJmbkZCQWtZTkFSb0xRUUFoQVNBRFFvQ0FnSUJ3V2dSL0lBT25MQUFGUVFCSUJVRUFDeUFJUVg1eFFRSkdjUXNoQ1NBQUlBUVFEeUFBSUFNUUR3d0ZDeUFBSUFwQkNHb2dCQ0FESUE1QkFFRUNFSVVDSWdnRVFDQUFJQVFRRHlBQUlBTVFEMEVBSVFFZ0NFRUFTQTBFSUF3Z0Npa0RDRGNEQUF3R0N5QUFJQVJCQWhDYUFTSUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FEUVFJUW1nRWlBMEtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQUlMQ3lBRElRVUxJQUFnQlJBUEN5QU1Rb0NBZ0lBd053TUFJQTlDZ0lDQWdEQTNBd0JCZnlFQkRBRUxJQXdnQWlBSlI2MUNnSUNBZ0JDRU53TUFRUUFoQVFzZ0NrRVFhaVFBSUFFTGhBZ0NBbjRGZnlNQVFTQnJJZ1lrQUVFSElBRkJDR3NpQnlrREFDSURRaUNJcHlJRklBVkJCMnRCYmtrYklRUUNRQUpBQWtBQ1FFRUhJQUZCRUdzaUJTa0RBQ0lDUWlDSXB5SUJJQUZCQjJ0QmJra2JJZ0ZCQjBjZ0JFRUhSM0pGQkVBZ0JVS0FnSUNBd0g0Z0FrS0FnSUNBd0lHQS9QOEFmTDhnQTBLQWdJQ0F3SUdBL1A4QWZMK2d2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYk53TUFEQUVMSUFGQmYwY2dCRUYvUjNFRWZ5QUJCUUpBQWtBZ0FVRi9SZ1JBSUFSQkIyb2lDRUVLUzBFQklBaDBRWUVNY1VWeURRRUxJQVJCZjBjTkFTQUJRUWRxSWdGQkNrc05BRUVCSUFGMFFZRU1jUTBCQ3lBQUlBWkJHR29nQWlBRFFaMEJRUUJCQWhDRkFpSUJSUTBBSUFBZ0FoQVBJQUFnQXhBUElBRkJBRWdOQkNBRklBWXBBeGczQXdBTUFnc2dBQ0FDUVFJUW1nRWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQUFnQTBFQ0VKb0JJZ05DZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FBSUFJUUR3d0VDMEVISUFOQ0lJaW5JZ0VnQVVFSGEwRnVTUnNoQkVFSElBSkNJSWluSWdFZ0FVRUhhMEZ1U1JzTFFYbEhJQVJCZVVkeFJRUkFJQVVnQUNBQ0lBTVF4QUlpQWpjREFFRUFJUUVnQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBEREFRTElBQWdBaEJzSWdKQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBTVFiQ0lEUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBQ0VBOE1Bd3RCQnlBQ1FpQ0lweUlCSUFGQkIydEJia2tiSWdGQkJ5QURRaUNJcHlJRUlBUkJCMnRCYmtrYklnUnlSUVJBSUFVQ2ZpQUR4Q0FDeEh3aUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN6Y0RBQXdCQ3lBQlFYVkhJQVJCZFVkeFJRUkFJQUJCblFFZ0JTQUNJQU1nQUNnQ0VDZ0MyQUlSR2dBTkF3d0JDeUFCUVhkSElBUkJkMGR4UlFSQUlBQkJuUUVnQlNBQ0lBTWdBQ2dDRUNnQ3ZBSVJHZ0JGRFFFTUF3c0NRQ0FCUVhaSElBUkJka2R4UlFSQUlBQW9BaEFoQVF3QkN5QUFJQVpCRUdvZ0FoQnVCRUFnQUNBREVBOE1CQXNnQUNBR1FRaHFJQU1RYmcwREFrQWdBQ2dDRUNJQktBS01BU0lFUlEwQUlBUXRBQ2hCQkhGRkRRQWdCaXNERUJDOUFrVU5BQ0FHS3dNSUVMMENEUUVMSUFWQ2dJQ0FnTUIrSUFZckF4QWdCaXNEQ0tDOUlnSkNnSUNBZ01DQmdQei9BSDBnQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHMzQXdBTUFRc2dBRUdkQVNBRklBSWdBeUFCS0FLZ0FoRWFBQTBDQzBFQUlRRU1BZ3NnQUNBREVBOExJQVZDZ0lDQWdEQTNBd0FnQjBLQWdJQ0FNRGNEQUVGL0lRRUxJQVpCSUdva0FDQUJDNUFEQVFsL0l3QkJNR3NpQnlRQUFrQWdBa0tBZ0lDQWNGUU5BRUVUSVFVQ1FDQUNweUlLTFFBRlFRUnhSUTBBSUFBb0FoQW9Ba1FnQ2k4QkJrRVliR29vQWhRaUNFVU5BRUVEUVJNZ0NDZ0NCQnNoQlF0QmZ5RUpJQUFnQjBFc2FpQUhRU2hxSUFvZ0JSQ09BUTBBSUFPblFRQWdBMEwvLy8vL2IxWWJJUXdnQnlnQ0xDRUlJQWNvQWlnaEN5QUZRUTlMSVExQkFDRUZBa0FEUUNBRklBdEhCRUFDUUFKQUlBeEZEUUFnQUVFQUlBd2dDQ0FGUVFOMGFpZ0NCQkJNSWdaRkRRQWdCa0VBVGcwQkRBUUxJQTFGQkVBZ0FDQUhRUWhxSUFvZ0NDQUZRUU4wYWlnQ0JCQk1JZ1pCQUVnTkJDQUdSUTBCSUFjb0FnZ2hCaUFBSUFkQkNHb1FTQ0FHUVFSeFJRMEJDeUFBSUFJZ0NDQUZRUU4wYWlJR0tBSUVJQUpCQUJBVUlnTkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF5QUdLQUlFSVFZQ2Z5QUVCRUFnQUNBQklBWWdBeEJGREFFTElBQWdBU0FHSUFOQkJ4QVpDMEVBU0EwREN5QUZRUUZxSVFVTUFRc0xJQUFnQ0NBTEVGcEJBQ0VKREFFTElBQWdDQ0FMRUZvTElBZEJNR29rQUNBSkM2VUJBUUYrQWtBQ1FBSitJQVJCQkhFRVFFRXRJUUlnQUNBQkVGa01BUXRCTENFQ0lBQWdBUkFsQ3lJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUNFSFlpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFCQkVCQXBJZ0lFUUNBQ1FRQTJBZ3dnQWlBRVFRTnhOZ0lJSUFJZ0FUY0RBQ0FGUW9DQWdJQndWQTBDSUFXbklBSTJBaUFNQWdzZ0FDQUZFQThMSUFBZ0FSQVBRb0NBZ0lEZ0FBOExJQVVMeEFFQkJIOGdBYWNpQlNBQ05nSWdJQVZDQURjQ0pBSkFJQUlvQWp3aUJrVU5BQUpBSUFBZ0JrRUNkQkJmSWdoRkRRQWdCU0FJTmdJa1FRQWhCUU5BSUFVZ0FpZ0NQRTROQWlBQ0tBSWtJQVZCQTNScUlnY3ZBUUloQmdKQUlBY3RBQUFpQjBFQmNRUkFJQUFnQkNBR0lBZEJBWFpCQVhFUWl3UWlCZzBCREFNTElBTWdCa0VDZEdvb0FnQWlCaUFHS0FJQVFRRnFOZ0lBQ3lBSUlBVkJBblJxSUFZMkFnQWdCVUVCYWlFRkRBQUxBQXNnQUNBQkVBOUNnSUNBZ09BQUlRRUxJQUVMaUFFQkFuNGdBQ0FCRUMwaEFnSkFJQUZCQUVnTkFDQUFLQUlRS0FJNElBRkJBblJxS0FJQUtRSUVJZ05DZ0lDQWdJQ0FnSUJBZzBLQWdJQ0FnSUNBZ0lCL1VpQURRb0NBZ0lEdy8vLy9QNE5DQUZJZ0EwS0FnSUNBZ0lDQWdFQlVjbkVnQTBMLy8vLy9ENE5DZ0lDQWdBaFJjZzBBSUFCQm5vQUJJQUpCbklBQkVMNEJJUUlMSUFJTFpBRUNmd0pBQWtBZ0FVS0FnSUNBY0ZRTkFDQUJFTVlGRFFCQmZ5RURJQUFnQWhBeElnUkZEUUVnQUNBRUVOY0ZJUUlnQUNBRUVCTWdBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEJJQUFnQVVFMklBSkJBUkFaUVFCSURRRUxRUUFoQXdzZ0F3czFBQUpBSUFKRklBRkNnSUNBZ0hCVWNnMEFJQUVReGdVTkFDQUFJQUZCTmlBQUlBSVFMVUVCRUJsQkFFNE5BRUYvRHd0QkFBc01BQ0FBSUFGQnV5WVFqd0VMYUFJQmZ3RitBa0FnQUNBQlFla0FJQUZCQUJBVUlnUkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUFJQVFRSmlFRElBQWdBVUhBQUNBQlFRQVFGQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVMUVFBaEEwS0FnSUNBNEFBaEFRc2dBaUFETmdJQUlBRUxGQUVCZmlBQUlBRVFKU0VDSUFBZ0FSQVBJQUlMOWdFQkJIOGdBQ2dDeUFFaUJTZ0NFQ0lFUVRCcUlRWWdCQ0FFS0FJWUlBRnhRWDl6UVFKMGFpZ0NBQ0VFQWtBRFFDQUVSUTBCSUFFZ0JpQUVRUUZySWdkQkEzUnFJZ1FvQWdSSEJFQWdCQ2dDQUVILy8vOGZjU0VFREFFTEN5QUZLQUlVSUFkQkEzUnFJUVVDUUNBRFFRRkdEUUFnQlRVQ0JFSWdoa0tBZ0lDQXdBQlJCRUFnQUNBQ0VBOGdBQ0FFS0FJRUVOa0JRWDhQQ3lBRUxRQURRUWh4RFFBZ0FDQUNFQThnQUNBQlFjNGRFSThCUVg4UEN5QUFJQVVnQWhBZ1FRQVBDeUFBSUFBcEE4QUJJQUVnQWdKL0lBQW9BaEFvQW93QklnTUVRRUdBZ0FZZ0F5Z0NLRUVCY1EwQkdndEJnSUFDQ3hEUUFRdUtBUUVCZndKQUlBSkNnSUNBZ0hDRFFvQ0FnSUNRZjFFZ0EwS0FnSUNBY0lOQ2dJQ0FnSkIvVVhGRkJFQWdBRUdOOXdCQkFCQVZEQUVMSUFBZ0FVRVNFR1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFHbklnUWdBejRDSkNBRUlBSStBaUFnQUNBQlFkVUFRZ0JCQWhBWkdpQUJEd3NnQUNBREVBOGdBQ0FDRUE5Q2dJQ0FnT0FBQ3cwQUlBQWdBVUhPbFFFUS93TUxad0VCZndKQUlBRkJBRTRFUUNBQUtBSVFJZ0lvQWl3Z0FVME5BU0FDS0FJNElBRkJBblJxS0FJQUlnRWdBU2dDQUVFQmFqWUNBQ0FBSUFGQkJCQ0FCQThMUWZLUkFVR3UvQUJCemhkQm1kSUFFQUFBQzBIWjN3QkJydndBUWM4WFFablNBQkFBQUF0RUFRRi9JQUJCK0FGcUlRSWdBRUgwQVdvaEFBTi9JQUFnQWlnQ0FDSUNSZ1JBUVFBUEN5QUJJQUpCQkdzb0FnQkdCSDhnQWtFSWF3VWdBa0VFYWlFQ0RBRUxDd3RTQWdKL0FYNENRQ0FBS0FJUUtBS01BU0lCUlEwQUlBRXBBd2dpQTBLQWdJQ0FjRlFOQUNBRHB5SUJMd0VHRU80QlJRMEFJQUVvQWlBaUFTMEFFa0VFY1VVTkFDQUFJQUVvQWtBUUdDRUNDeUFDQzZvUEFnVi9EMzRqQUVIUUFtc2lCU1FBSUFSQy8vLy8vLy8vUDRNaEN5QUNRdi8vLy8vLy96K0RJUW9nQWlBRWhVS0FnSUNBZ0lDQWdJQi9neUVOSUFSQ01JaW5RZi8vQVhFaENBSkFBa0FnQWtJd2lLZEIvLzhCY1NJSlFmLy9BV3RCZ29CK1R3UkFJQWhCLy84QmEwR0JnSDVMRFFFTElBRlFJQUpDLy8vLy8vLy8vLy8vQUlNaURFS0FnSUNBZ0lEQS8vOEFWQ0FNUW9DQWdJQ0FnTUQvL3dCUkcwVUVRQ0FDUW9DQWdJQ0FnQ0NFSVEwTUFnc2dBMUFnQkVMLy8vLy8vLy8vLy84QWd5SUNRb0NBZ0lDQWdNRC8vd0JVSUFKQ2dJQ0FnSUNBd1AvL0FGRWJSUVJBSUFSQ2dJQ0FnSUNBSUlRaERTQURJUUVNQWdzZ0FTQU1Rb0NBZ0lDQWdNRC8vd0NGaEZBRVFDQURJQUpDZ0lDQWdJQ0F3UC8vQUlXRVVBUkFRZ0FoQVVLQWdJQ0FnSURnLy84QUlRME1Bd3NnRFVLQWdJQ0FnSURBLy84QWhDRU5RZ0FoQVF3Q0N5QURJQUpDZ0lDQWdJQ0F3UC8vQUlXRVVBUkFRZ0FoQVF3Q0N5QUJJQXlFVUFSQVFvQ0FnSUNBZ09ELy93QWdEU0FDSUFPRVVCc2hEVUlBSVFFTUFnc2dBaUFEaEZBRVFDQU5Rb0NBZ0lDQWdNRC8vd0NFSVExQ0FDRUJEQUlMSUF4Qy8vLy8vLy8vUDFnRVFDQUZRY0FDYWlBQklBb2dBU0FLSUFwUUlnWWJlU0FHUVFaMHJYeW5JZ1pCRDJzUVowRVFJQVpySVFZZ0JTa0R5QUloQ2lBRktRUEFBaUVCQ3lBQ1F2Ly8vLy8vL3o5V0RRQWdCVUd3QW1vZ0F5QUxJQU1nQ3lBTFVDSUhHM2tnQjBFR2RLMThweUlIUVE5ckVHY2dCaUFIYWtFUWF5RUdJQVVwQTdnQ0lRc2dCU2tEc0FJaEF3c2dCVUdnQW1vZ0MwS0FnSUNBZ0lEQUFJUWlFa0lQaGlBRFFqR0loQ0lDUWdCQ2dJQ0FnTERtdklMMUFDQUNmU0lFUWdBUVppQUZRWkFDYWtJQUlBVXBBNmdDZlVJQUlBUkNBQkJtSUFWQmdBSnFJQVVwQTVnQ1FnR0dJQVVwQTVBQ1FqK0loQ0lFUWdBZ0FrSUFFR1lnQlVId0FXb2dCRUlBUWdBZ0JTa0RpQUo5UWdBUVppQUZRZUFCYWlBRktRUDRBVUlCaGlBRktRUHdBVUkvaUlRaUJFSUFJQUpDQUJCbUlBVkIwQUZxSUFSQ0FFSUFJQVVwQStnQmZVSUFFR1lnQlVIQUFXb2dCU2tEMkFGQ0FZWWdCU2tEMEFGQ1A0aUVJZ1JDQUNBQ1FnQVFaaUFGUWJBQmFpQUVRZ0JDQUNBRktRUElBWDFDQUJCbUlBVkJvQUZxSUFKQ0FDQUZLUU80QVVJQmhpQUZLUU93QVVJL2lJUkNBWDBpQWtJQUVHWWdCVUdRQVdvZ0EwSVBoa0lBSUFKQ0FCQm1JQVZCOEFCcUlBSkNBRUlBSUFVcEE2Z0JJQVVwQTZBQklnd2dCU2tEbUFGOElnUWdERlN0ZkNBRVFnRldyWHg5UWdBUVppQUZRWUFCYWtJQklBUjlRZ0FnQWtJQUVHWWdCaUFKSUFocmFpRUdBbjhnQlNrRGNDSVRRZ0dHSWc0Z0JTa0RpQUVpRDBJQmhpQUZLUU9BQVVJL2lJUjhJaEJDNSt3QWZTSVVRaUNJSWdJZ0NrS0FnSUNBZ0lEQUFJUWlGVUlCaGlJV1FpQ0lJZ1IrSWhFZ0FVSUJoaUlNUWlDSUlnc2dFQ0FVVnEwZ0RpQVFWcTBnQlNrRGVFSUJoaUFUUWorSWhDQVBRaitJZkh4OFFnRjlJaE5DSUlnaUVINThJZzRnRVZTdElBNGdEaUFUUXYvLy8vOFBneUlUSUFGQ1A0Z2lGeUFLUWdHR2hFTC8vLy8vRDRNaUNuNThJZzVXclh3Z0JDQVFmbndnQkNBVGZpSVJJQW9nRUg1OElnOGdFVlN0UWlDR0lBOUNJSWlFZkNBT0lBNGdEMElnaG53aURsYXRmQ0FPSUE0Z0ZFTC8vLy8vRDRNaUZDQUtmaUlSSUFJZ0MzNThJZzhnRVZTdElBOGdEeUFUSUF4Qy92Ly8vdytESWhGK2ZDSVBWcTE4ZkNJT1ZxMThJQTRnQkNBVWZpSVlJQkFnRVg1OElnUWdBaUFLZm53aUNpQUxJQk4rZkNJUVFpQ0lJQW9nRUZhdElBUWdHRlN0SUFRZ0NsYXRmSHhDSUlhRWZDSUVJQTVVclh3Z0JDQVBJQUlnRVg0aUFpQUxJQlIrZkNJTFFpQ0lJQUlnQzFhdFFpQ0doSHdpQWlBUFZLMGdBaUFRUWlDR2ZDQUNWSzE4ZkNJQ0lBUlVyWHdpQkVMLy8vLy8vLy8vQUZnRVFDQVdJQmVFSVJVZ0JVSFFBR29nQWlBRUlBTWdFaEJtSUFGQ01ZWWdCU2tEV0gwZ0JTa0RVQ0lCUWdCU3JYMGhDa0lBSUFGOUlRc2dCa0grL3dCcURBRUxJQVZCNEFCcUlBUkNQNFlnQWtJQmlJUWlBaUFFUWdHSUlnUWdBeUFTRUdZZ0FVSXdoaUFGS1FOb2ZTQUZLUU5nSWd4Q0FGS3RmU0VLUWdBZ0RIMGhDeUFCSVF3Z0JrSC8vd0JxQ3lJR1FmLy9BVTRFUUNBTlFvQ0FnSUNBZ01ELy93Q0VJUTFDQUNFQkRBRUxBbjRnQmtFQVNnUkFJQXBDQVlZZ0MwSS9pSVFoQ2lBRVF2Ly8vLy8vL3orRElBYXRRakNHaENFTUlBdENBWVlNQVFzZ0JrR1BmMHdFUUVJQUlRRU1BZ3NnQlVGQWF5QUNJQVJCQVNBR2F4Q09BaUFGUVRCcUlBd2dGU0FHUWZBQWFoQm5JQVZCSUdvZ0F5QVNJQVVwQTBBaUFpQUZLUU5JSWd3UVppQUZLUU00SUFVcEF5aENBWVlnQlNrRElDSUJRaitJaEgwZ0JTa0RNQ0lFSUFGQ0FZWWlBVlN0ZlNFS0lBUWdBWDBMSVFRZ0JVRVFhaUFESUJKQ0EwSUFFR1lnQlNBRElCSkNCVUlBRUdZZ0RDQUNJQUlnQXlBQ1FnR0RJZ0VnQkh3aUExUWdDaUFCSUFOV3JYd2lBU0FTVmlBQklCSlJHNjE4SWdKV3JYd2lCQ0FDSUFJZ0JFS0FnSUNBZ0lEQS8vOEFWQ0FESUFVcEF4QldJQUVnQlNrREdDSUVWaUFCSUFSUkczR3RmQ0lDVnExOElnUWdBaUFFUW9DQWdJQ0FnTUQvL3dCVUlBTWdCU2tEQUZZZ0FTQUZLUU1JSWdOV0lBRWdBMUViY2ExOElnRWdBbFN0ZkNBTmhDRU5DeUFBSUFFM0F3QWdBQ0FOTndNSUlBVkIwQUpxSkFBTHlESURFWDhIZmdGOEl3QkJFR3NpRUNRQUl3QkJvQUZySWc4a0FDQVBJQUEyQWp3Z0R5QUFOZ0lVSUE5QmZ6WUNHQ0FQUVJCcUlnSVFtZ1FqQUVFd2F5SU9KQUFEUUFKL0lBSW9BZ1FpQUNBQ0tBSm9Sd1JBSUFJZ0FFRUJhallDQkNBQUxRQUFEQUVMSUFJUVZRc2lCUkNPQmcwQUMwRUJJUU1DUUFKQUlBVkJLMnNPQXdBQkFBRUxRWDlCQVNBRlFTMUdHeUVESUFJb0FnUWlBQ0FDS0FKb1J3UkFJQUlnQUVFQmFqWUNCQ0FBTFFBQUlRVU1BUXNnQWhCVklRVUxBa0FDUUFKQUEwQWdCa0hzSEdvc0FBQWdCVUVnY2tZRVFBSkFJQVpCQmtzTkFDQUNLQUlFSWdBZ0FpZ0NhRWNFUUNBQ0lBQkJBV28yQWdRZ0FDMEFBQ0VGREFFTElBSVFWU0VGQ3lBR1FRRnFJZ1pCQ0VjTkFRd0NDd3NnQmtFRFJ3UkFJQVpCQ0VZTkFTQUdRUVJKRFFJZ0JrRUlSZzBCQ3lBQ0tRTndJaEpDQUZrRVFDQUNJQUlvQWdSQkFXczJBZ1FMSUFaQkJFa05BQ0FTUWdCVElRQURRQ0FBUlFSQUlBSWdBaWdDQkVFQmF6WUNCQXNnQmtFQmF5SUdRUU5MRFFBTEMwSUFJUklqQUVFUWF5SUZKQUFDZmlBRHNrTUFBSUIvbEx3aUEwSC8vLy8vQjNFaUFFR0FnSUFFYTBILy8vLzNCMDBFUUNBQXJVSVpoa0tBZ0lDQWdJQ0F3RDk4REFFTElBT3RRaG1HUW9DQWdJQ0FnTUQvL3dDRUlBQkJnSUNBL0FkUERRQWFRZ0FnQUVVTkFCb2dCU0FBclVJQUlBQm5JZ0JCMFFCcUVHY2dCU2tEQUNFU0lBVXBBd2hDZ0lDQWdJQ0F3QUNGUVluL0FDQUFhNjFDTUlhRUN5RVRJQTRnRWpjREFDQU9JQk1nQTBHQWdJQ0FlSEd0UWlDR2hEY0RDQ0FGUVJCcUpBQWdEaWtEQ0NFU0lBNHBBd0FoRXd3QkN3SkFBa0FnQmcwQVFRQWhCZ05BSUFaQjRORUFhaXdBQUNBRlFTQnlSdzBCQWtBZ0JrRUJTdzBBSUFJb0FnUWlBQ0FDS0FKb1J3UkFJQUlnQUVFQmFqWUNCQ0FBTFFBQUlRVU1BUXNnQWhCVklRVUxJQVpCQVdvaUJrRURSdzBBQ3d3QkN3SkFBa0FnQmc0RUFBRUJBZ0VMQWtBZ0JVRXdSdzBBQW44Z0FpZ0NCQ0lBSUFJb0FtaEhCRUFnQWlBQVFRRnFOZ0lFSUFBdEFBQU1BUXNnQWhCVkMwRmZjVUhZQUVZRVFDQURJUUJCQUNFREl3QkJzQU5ySWdRa0FBSi9Ba0FnQWlnQ0JDSUZJQUlvQW1oSEJFQWdBaUFGUVFGcU5nSUVJQVV0QUFBaEF3d0JDMEVBREFFTFFRRUxJUVlEUUFKQUFrQUNRQUpBQW40Q1FBSkFBbjhnQmtVRVFDQUNFRlVNQVFzZ0EwRXdSd1JBUW9DQWdJQ0FnTUQvUHlFVElBTkJMa1lOQTBJQURBUUxJQUlvQWdRaUJTQUNLQUpvUmcwQlFRRWhDeUFDSUFWQkFXbzJBZ1FnQlMwQUFBc2hBMEVCSVFZTUJ3dEJBU0VMREFRTEFuOGdBaWdDQkNJRElBSW9BbWhIQkVBZ0FpQURRUUZxTmdJRUlBTXRBQUFNQVFzZ0FoQlZDeUlEUVRCR0RRRkJBU0VNUWdBTElSWU1BUXNEUUNBVlFnRjlJUlZCQVNFTUFuOGdBaWdDQkNJRElBSW9BbWhIQkVBZ0FpQURRUUZxTmdJRUlBTXRBQUFNQVFzZ0FoQlZDeUlEUVRCR0RRQUxRUUVoQ3dzRFFDQURRU0J5SVFvQ1FBSkFJQU5CTUdzaUJVRUtTUTBBSUFOQkxrWWdDa0hoQUd0QkJrbHlSUVJBSUFNaEJnd0ZDMEV1SVFZZ0EwRXVSdzBBSUF3TkJFRUJJUXdnRWlFVkRBRUxJQXBCMXdCcklBVWdBMEU1U2hzaEF3SkFJQkpDQjFjRVFDQURJQWRCQkhScUlRY01BUXNnRWtJY1dBUkFJQVJCTUdvZ0F4QjVJQVJCSUdvZ0Z5QVRRZ0JDZ0lDQWdJQ0F3UDAvRUM0Z0JFRVFhaUFFS1FNd0lBUXBBemdnQkNrRElDSVhJQVFwQXlnaUV4QXVJQVFnQkNrREVDQUVLUU1ZSUJRZ0ZoQndJQVFwQXdnaEZpQUVLUU1BSVJRTUFRc2dBMFVnQ0hJTkFDQUVRZEFBYWlBWElCTkNBRUtBZ0lDQWdJQ0EvejhRTGlBRVFVQnJJQVFwQTFBZ0JDa0RXQ0FVSUJZUWNDQUVLUU5JSVJaQkFTRUlJQVFwQTBBaEZBc2dFa0lCZkNFU1FRRWhDd3NnQWlnQ0JDSURJQUlvQW1oSEJIOGdBaUFEUVFGcU5nSUVJQU10QUFBRklBSVFWUXNoQXd3QUN3QUxRUUFoQmd3QkN3c0NmaUFMUlFSQUFrQWdBaWtEY0VJQVV3MEFJQUlnQWlnQ0JDSURRUUpyTmdJRUlBeEZEUUFnQWlBRFFRTnJOZ0lFQ3lBRVFlQUFhaUFBdDBRQUFBQUFBQUFBQUtJUXF3RWdCQ2tEWUNFVUlBUXBBMmdNQVFzZ0VrSUhWd1JBSUJJaEV3TkFJQWRCQkhRaEJ5QVRRZ0Y4SWhOQ0NGSU5BQXNMQWtBQ1FBSkFJQVpCWDNGQjBBQkdCRUFnQWhDSEJpSVRRb0NBZ0lDQWdJQ0FnSDlTRFFNZ0Fpa0RjRUlBV1EwQkRBSUxRZ0FoRXlBQ0tRTndRZ0JURFFJTElBSWdBaWdDQkVFQmF6WUNCQXRDQUNFVEN5QUhSUVJBSUFSQjhBQnFJQUMzUkFBQUFBQUFBQUFBb2hDckFTQUVLUU53SVJRZ0JDa0RlQXdCQ3lBVklCSWdEQnRDQW9ZZ0UzeENJSDBpRWtLekNGa0VRRUdnMUFSQnhBQTJBZ0FnQkVHZ0FXb2dBQkI1SUFSQmtBRnFJQVFwQTZBQklBUXBBNmdCUW45Qy8vLy8vLy8vdi8vL0FCQXVJQVJCZ0FGcUlBUXBBNUFCSUFRcEE1Z0JRbjlDLy8vLy8vLy92Ly8vQUJBdUlBUXBBNEFCSVJRZ0JDa0RpQUVNQVFzZ0VrTHNkVmtFUUNBSFFRQk9CRUFEUUNBRVFhQURhaUFVSUJaQ0FFS0FnSUNBZ0lEQS83OS9FSEFnRkNBV1FvQ0FnSUNBZ0lEL1B4RHBCU0VESUFSQmtBTnFJQlFnRmlBRUtRT2dBeUFVSUFOQkFFNGlBeHNnQkNrRHFBTWdGaUFER3hCd0lCSkNBWDBoRWlBRUtRT1lBeUVXSUFRcEE1QURJUlFnQjBFQmRDQURjaUlIUVFCT0RRQUxDd0orUVRVZ0VrTFNDSHdpRTZjaUEwRUFJQU5CQUVvYklCTkNOVmtiSWdOQjhRQlBCRUFnQkVHQUEyb2dBQkI1SUFRcEE0Z0RJUlVnQkNrRGdBTWhGMElBREFFTElBUkI0QUpxUkFBQUFBQUFBUEEvUVpBQklBTnJFTm9CRUtzQklBUkIwQUpxSUFBUWVTQUVRZkFDYWlBRUtRUGdBaUFFS1FQb0FpQUVLUVBRQWlJWElBUXBBOWdDSWhVUWlRWWdCQ2tEK0FJaEdDQUVLUVB3QWdzaEV5QUVRY0FDYWlBSElBZEJBWEZGSUJRZ0ZrSUFRZ0FRN1FGQkFFY2dBMEVnU1hGeElnQnFFSVlDSUFSQnNBSnFJQmNnRlNBRUtRUEFBaUFFS1FQSUFoQXVJQVJCa0FKcUlBUXBBN0FDSUFRcEE3Z0NJQk1nR0JCd0lBUkJvQUpxSUJjZ0ZVSUFJQlFnQUJ0Q0FDQVdJQUFiRUM0Z0JFR0FBbW9nQkNrRG9BSWdCQ2tEcUFJZ0JDa0RrQUlnQkNrRG1BSVFjQ0FFUWZBQmFpQUVLUU9BQWlBRUtRT0lBaUFUSUJnUWdnUWdCQ2tEOEFFaUZTQUVLUVA0QVNJVFFnQkNBQkR0QVVVRVFFR2cxQVJCeEFBMkFnQUxJQVJCNEFGcUlCVWdFeUFTcHhDSUJpQUVLUVBnQVNFVUlBUXBBK2dCREFFTFFhRFVCRUhFQURZQ0FDQUVRZEFCYWlBQUVIa2dCRUhBQVdvZ0JDa0QwQUVnQkNrRDJBRkNBRUtBZ0lDQWdJREFBQkF1SUFSQnNBRnFJQVFwQThBQklBUXBBOGdCUWdCQ2dJQ0FnSUNBd0FBUUxpQUVLUU93QVNFVUlBUXBBN2dCQ3lFU0lBNGdGRGNERUNBT0lCSTNBeGdnQkVHd0Eyb2tBQ0FPS1FNWUlSSWdEaWtERUNFVERBUUxJQUlwQTNCQ0FGTU5BQ0FDSUFJb0FnUkJBV3MyQWdRTElBVWhBQ0FESVFaQkFDRURJd0JCa01ZQWF5SUJKQUFDUUFKL0EwQWdBRUV3UndSQUFrQWdBRUV1UncwRUlBSW9BZ1FpQUNBQ0tBSm9SZzBBSUFJZ0FFRUJhallDQkNBQUxRQUFEQU1MQlNBQ0tBSUVJZ0FnQWlnQ2FFY0VmMEVCSVFNZ0FpQUFRUUZxTmdJRUlBQXRBQUFGUVFFaEF5QUNFRlVMSVFBTUFRc0xJQUlRVlFzaEFFRUJJUWdnQUVFd1J3MEFBMEFnRWtJQmZTRVNBbjhnQWlnQ0JDSUFJQUlvQW1oSEJFQWdBaUFBUVFGcU5nSUVJQUF0QUFBTUFRc2dBaEJWQ3lJQVFUQkdEUUFMUVFFaEF3c2dBVUVBTmdLUUJpQU9BbjRDUUFKQUFrQWdBRUV1UmlJRklBQkJNR3NpRFVFSlRYSUVRQU5BQWtBZ0JVRUJjUVJBSUFoRkJFQWdFeUVTUVFFaENBd0NDeUFEUlNFRkRBUUxJQk5DQVh3aEV5QUhRZndQVEFSQUlBc2dFNmNnQUVFd1Joc2hDeUFCUVpBR2FpQUhRUUowYWlJRElBb0VmeUFBSUFNb0FnQkJDbXhxUVRCckJTQU5DellDQUVFQklRTkJBQ0FLUVFGcUlnQWdBRUVKUmlJQUd5RUtJQUFnQjJvaEJ3d0JDeUFBUVRCR0RRQWdBU0FCS0FLQVJrRUJjallDZ0VaQjNJOEJJUXNMQW44Z0FpZ0NCQ0lBSUFJb0FtaEhCRUFnQWlBQVFRRnFOZ0lFSUFBdEFBQU1BUXNnQWhCVkN5SUFRUzVHSWdVZ0FFRXdheUlOUVFwSmNnMEFDd3NnRWlBVElBZ2JJUklnQTBVZ0FFRmZjVUhGQUVkeVJRUkFBa0FnQWhDSEJpSVVRb0NBZ0lDQWdJQ0FnSDlTRFFCQ0FDRVVJQUlwQTNCQ0FGTU5BQ0FDSUFJb0FnUkJBV3MyQWdRTElCSWdGSHdoRWd3REN5QURSU0VGSUFCQkFFZ05BUXNnQWlrRGNFSUFVdzBBSUFJZ0FpZ0NCRUVCYXpZQ0JBc2dCVVVOQUVHZzFBUkJIRFlDQUNBQ0VKb0VRZ0FoRTBJQURBRUxJQUVvQXBBR0lnQkZCRUFnQVNBR3QwUUFBQUFBQUFBQUFLSVFxd0VnQVNrREFDRVRJQUVwQXdnTUFRc2dFaUFUVWlBVFFnbFZja1VFUUNBQlFUQnFJQVlRZVNBQlFTQnFJQUFRaGdJZ0FVRVFhaUFCS1FNd0lBRXBBemdnQVNrRElDQUJLUU1vRUM0Z0FTa0RFQ0VUSUFFcEF4Z01BUXNnRWtLYUJGa0VRRUdnMUFSQnhBQTJBZ0FnQVVIZ0FHb2dCaEI1SUFGQjBBQnFJQUVwQTJBZ0FTa0RhRUovUXYvLy8vLy8vNy8vL3dBUUxpQUJRVUJySUFFcEExQWdBU2tEV0VKL1F2Ly8vLy8vLzcvLy93QVFMaUFCS1FOQUlSTWdBU2tEU0F3QkN5QVNRdXQxVndSQVFhRFVCRUhFQURZQ0FDQUJRWkFCYWlBR0VIa2dBVUdBQVdvZ0FTa0RrQUVnQVNrRG1BRkNBRUtBZ0lDQWdJREFBQkF1SUFGQjhBQnFJQUVwQTRBQklBRXBBNGdCUWdCQ2dJQ0FnSUNBd0FBUUxpQUJLUU53SVJNZ0FTa0RlQXdCQ3lBS0JFQWdDa0VJVEFSQUlBRkJrQVpxSUFkQkFuUnFJZ0FvQWdBaENRTkFJQWxCQ213aENTQUtRUUZxSWdwQkNVY05BQXNnQUNBSk5nSUFDeUFIUVFGcUlRY0xBa0FnQ3lBU3B5SUlTaUFMUVFoS2NpQUlRUkZLY2cwQUlBaEJDVVlFUUNBQlFjQUJhaUFHRUhrZ0FVR3dBV29nQVNnQ2tBWVFoZ0lnQVVHZ0FXb2dBU2tEd0FFZ0FTa0R5QUVnQVNrRHNBRWdBU2tEdUFFUUxpQUJLUU9nQVNFVElBRXBBNmdCREFJTElBaEJDRXdFUUNBQlFaQUNhaUFHRUhrZ0FVR0FBbW9nQVNnQ2tBWVFoZ0lnQVVId0FXb2dBU2tEa0FJZ0FTa0RtQUlnQVNrRGdBSWdBU2tEaUFJUUxpQUJRZUFCYWtFQUlBaHJRUUowUWVEQkJHb29BZ0FRZVNBQlFkQUJhaUFCS1FQd0FTQUJLUVA0QVNBQktRUGdBU0FCS1FQb0FSRGpCU0FCS1FQUUFTRVRJQUVwQTlnQkRBSUxJQWhCRVU1QkFDQUJLQUtRQmlJQUlBaEJmV3hCMEFCcWRoc05BQ0FCUWVBQ2FpQUdFSGtnQVVIUUFtb2dBQkNHQWlBQlFjQUNhaUFCS1FQZ0FpQUJLUVBvQWlBQktRUFFBaUFCS1FQWUFoQXVJQUZCc0FKcUlBaEJBblJCbU1FRWFpZ0NBQkI1SUFGQm9BSnFJQUVwQThBQ0lBRXBBOGdDSUFFcEE3QUNJQUVwQTdnQ0VDNGdBU2tEb0FJaEV5QUJLUU9vQWd3QkN3TkFJQUZCa0FacUlBY2lBRUVCYXlJSFFRSjBhaWdDQUVVTkFBc0NRQ0FJUVFsdklnTkZCRUJCQUNFS1FRQWhCUXdCQzBFQUlRb2dBMEVKYWlBRElBaEJBRWdiSVFRQ1FDQUFSUVJBUVFBaEJVRUFJUUFNQVF0QmdKVHIzQU5CQUNBRWEwRUNkRUhnd1FScUtBSUFJZ3R0SVF4QkFDRU5RUUFoQ1VFQUlRVURRQ0FCUVpBR2FpQUpRUUowYWlJRElBMGdBeWdDQUNJQ0lBdHVJZ2RxSWdNMkFnQWdCVUVCYWtIL0QzRWdCU0FEUlNBRklBbEdjU0lER3lFRklBaEJDV3NnQ0NBREd5RUlJQXdnQWlBSElBdHNhMndoRFNBSlFRRnFJZ2tnQUVjTkFBc2dEVVVOQUNBQlFaQUdhaUFBUVFKMGFpQU5OZ0lBSUFCQkFXb2hBQXNnQ0NBRWEwRUphaUVJQ3dOQUlBRkJrQVpxSUFWQkFuUnFJUXdnQ0VFa1NDRUNBa0FEUUFKQUlBSU5BQ0FJUVNSSERRSWdEQ2dDQUVIUTZma0VUUTBBUVNRaENBd0NDeUFBUWY4UGFpRUhRUUFoRFNBQUlRTURRQ0FESVFBZ0RhMGdBVUdRQm1vZ0IwSC9EM0VpQzBFQ2RHb2lBelVDQUVJZGhud2lFa0tCbE92Y0ExUUVmMEVBQlNBU1FvQ1U2OXdEZ0NJVFFvRHNsS044ZmlBU2ZDRVNJQk9uQ3lFTklBTWdFcWNpQXpZQ0FDQUFJQUFnQUNBTElBTWJJQVVnQzBZYklBc2dBRUVCYTBIL0QzRkhHeUVESUF0QkFXc2hCeUFGSUF0SERRQUxJQXBCSFdzaENpQU5SUTBBQ3lBRElBVkJBV3RCL3c5eElnVkdCRUFnQVVHUUJtb2lCeUFEUWY0UGFrSC9EM0ZCQW5ScUlnQWdBQ2dDQUNBSElBTkJBV3RCL3c5eElnQkJBblJxS0FJQWNqWUNBQXNnQ0VFSmFpRUlJQUZCa0FacUlBVkJBblJxSUEwMkFnQU1BUXNMQWtBRFFDQUFRUUZxUWY4UGNTRUhJQUZCa0FacUlBQkJBV3RCL3c5eFFRSjBhaUVOQTBCQkNVRUJJQWhCTFVvYklSRUNRQU5BSUFVaEEwRUFJUWtDUUFOQUFrQWdBeUFKYWtIL0QzRWlCU0FBUmcwQUlBRkJrQVpxSUFWQkFuUnFLQUlBSWdJZ0NVRUNkRUd3d1FScUtBSUFJZ1ZKRFFBZ0FpQUZTdzBDSUFsQkFXb2lDVUVFUncwQkN3c2dDRUVrUncwQVFnQWhFa0VBSVFsQ0FDRVRBMEFnQUNBRElBbHFRZjhQY1NJRlJnUkFJQUJCQVdwQi93OXhJZ0JCQW5RZ0FXcEJBRFlDakFZTElBRkJnQVpxSUFGQmtBWnFJQVZCQW5ScUtBSUFFSVlDSUFGQjhBVnFJQklnRTBJQVFvQ0FnSURsbXJlT3dBQVFMaUFCUWVBRmFpQUJLUVB3QlNBQktRUDRCU0FCS1FPQUJpQUJLUU9JQmhCd0lBRXBBK2dGSVJNZ0FTa0Q0QVVoRWlBSlFRRnFJZ2xCQkVjTkFBc2dBVUhRQldvZ0JoQjVJQUZCd0FWcUlCSWdFeUFCS1FQUUJTQUJLUVBZQlJBdUlBRXBBOGdGSVJOQ0FDRVNJQUVwQThBRklSUkJOU0FLUWFNSmFpSUNRUUFnQWtFQVNoc2dDa0dTZDA0YklneEI4QUJORFFJTUJRc2dDaUFSYWlFS0lBQWhCU0FBSUFOR0RRQUxRWUNVNjl3RElCRjJJUVJCZnlBUmRFRi9jeUVMUVFBaENTQURJUVVEUUNBQlFaQUdhaUFEUVFKMGFpSUNJQWtnQWlnQ0FDSU1JQkYyYWlJQ05nSUFJQVZCQVdwQi93OXhJQVVnQWtVZ0F5QUZSbkVpQWhzaEJTQUlRUWxySUFnZ0Foc2hDQ0FMSUF4eElBUnNJUWtnQTBFQmFrSC9EM0VpQXlBQVJ3MEFDeUFKUlEwQklBVWdCMGNFUUNBQlFaQUdhaUFBUVFKMGFpQUpOZ0lBSUFjaEFBd0RDeUFOSUEwb0FnQkJBWEkyQWdBTUFRc0xDeUFCUVpBRmFrUUFBQUFBQUFEd1AwSGhBU0FNYXhEYUFSQ3JBU0FCUWJBRmFpQUJLUU9RQlNBQktRT1lCU0FVSUJNUWlRWWdBU2tEdUFVaEZ5QUJLUU93QlNFV0lBRkJnQVZxUkFBQUFBQUFBUEEvUWZFQUlBeHJFTm9CRUtzQklBRkJvQVZxSUJRZ0V5QUJLUU9BQlNBQktRT0lCUkQ0QlNBQlFmQUVhaUFVSUJNZ0FTa0RvQVVpRWlBQktRT29CU0lWRUlJRUlBRkI0QVJxSUJZZ0Z5QUJLUVB3QkNBQktRUDRCQkJ3SUFFcEErZ0VJUk1nQVNrRDRBUWhGQXNnQ2tIeEFHb2hCd0pBSUFOQkJHcEIvdzl4SWdVZ0FFWU5BQUpBSUFGQmtBWnFJQVZCQW5ScUtBSUFJZ1ZCLzhtMTdnRk5CRUFnQlVVZ0EwRUZha0gvRDNFZ0FFWnhEUUVnQVVId0Eyb2dCcmRFQUFBQUFBQUEwRCtpRUtzQklBRkI0QU5xSUJJZ0ZTQUJLUVB3QXlBQktRUDRBeEJ3SUFFcEErZ0RJUlVnQVNrRDRBTWhFZ3dCQ3lBRlFZREt0ZTRCUndSQUlBRkIwQVJxSUFhM1JBQUFBQUFBQU9nL29oQ3JBU0FCUWNBRWFpQVNJQlVnQVNrRDBBUWdBU2tEMkFRUWNDQUJLUVBJQkNFVklBRXBBOEFFSVJJTUFRc2dCcmNoR1NBQUlBTkJCV3BCL3c5eFJnUkFJQUZCa0FScUlCbEVBQUFBQUFBQTREK2lFS3NCSUFGQmdBUnFJQklnRlNBQktRT1FCQ0FCS1FPWUJCQndJQUVwQTRnRUlSVWdBU2tEZ0FRaEVnd0JDeUFCUWJBRWFpQVpSQUFBQUFBQUFPZy9vaENyQVNBQlFhQUVhaUFTSUJVZ0FTa0RzQVFnQVNrRHVBUVFjQ0FCS1FPb0JDRVZJQUVwQTZBRUlSSUxJQXhCN3dCTERRQWdBVUhRQTJvZ0VpQVZRZ0JDZ0lDQWdJQ0F3UDgvRVBnRklBRXBBOUFESUFFcEE5Z0RRZ0JDQUJEdEFRMEFJQUZCd0FOcUlCSWdGVUlBUW9DQWdJQ0FnTUQvUHhCd0lBRXBBOGdESVJVZ0FTa0R3QU1oRWdzZ0FVR3dBMm9nRkNBVElCSWdGUkJ3SUFGQm9BTnFJQUVwQTdBRElBRXBBN2dESUJZZ0Z4Q0NCQ0FCS1FPb0F5RVRJQUVwQTZBRElSUUNRQ0FIUWZ6Ly8vOEhjVUg4QjBrRVFDQUtJUUFNQVFzZ0FTQVRRdi8vLy8vLy8vLy8vd0NETndPWUF5QUJJQlEzQTVBRElBRkJnQU5xSUJRZ0UwSUFRb0NBZ0lDQWdJRC9QeEF1SUFFcEE1QURJQUVwQTVnRFFvQ0FnSUNBZ0lDNHdBQVE2UVVoQUNBQktRT0lBeUFUSUFCQkFFNGlCUnNoRXlBQktRT0FBeUFVSUFVYklSUWdFaUFWUWdCQ0FCRHRBU0VESUFVZ0Ntb2lBRUdQQjB3RVFDQURRUUJISUFwQmtuZElJZ01nQWlBTVIzRWdBeUFGRzNGRkRRRUxRYURVQkVIRUFEWUNBQXNnQVVId0Ftb2dGQ0FUSUFBUWlBWWdBU2tEOEFJaEV5QUJLUVA0QWdzM0F5Z2dEaUFUTndNZ0lBRkJrTVlBYWlRQUlBNHBBeWdoRWlBT0tRTWdJUk1NQWdzZ0Fpa0RjRUlBV1FSQUlBSWdBaWdDQkVFQmF6WUNCQXRCb05RRVFSdzJBZ0FnQWhDYUJBd0JDd0pBQW44Z0FpZ0NCQ0lBSUFJb0FtaEhCRUFnQWlBQVFRRnFOZ0lFSUFBdEFBQU1BUXNnQWhCVkMwRW9SZ1JBUVFFaEJnd0JDMEtBZ0lDQWdJRGcvLzhBSVJJZ0Fpa0RjRUlBVXcwQklBSWdBaWdDQkVFQmF6WUNCQXdCQ3dOQUFuOGdBaWdDQkNJQUlBSW9BbWhIQkVBZ0FpQUFRUUZxTmdJRUlBQXRBQUFNQVFzZ0FoQlZDeUlBUVRCclFRcEpJQUJCd1FCclFScEpjaUFBUWQ4QVJuSkZJQUJCNFFCclFScFBjVVVFUUNBR1FRRnFJUVlNQVFzTFFvQ0FnSUNBZ09ELy93QWhFaUFBUVNsR0RRQWdBaWtEY0NJVlFnQlpCRUFnQWlBQ0tBSUVRUUZyTmdJRUN5QUdSUTBBQTBBZ0JrRUJheUVHSUJWQ0FGa0VRQ0FDSUFJb0FnUkJBV3MyQWdRTElBWU5BQXNMSUE4Z0V6Y0RBQ0FQSUJJM0F3Z2dEa0V3YWlRQUlBOHBBd0FoRWlBUUlBOHBBd2czQXdnZ0VDQVNOd01BSUE5Qm9BRnFKQUFnRUNrREFDQVFLUU1JRUw4RklSa2dFRUVRYWlRQUlCa0wwUUVCQVg4Q1FBSkFJQUFnQVhOQkEzRUVRQ0FCTFFBQUlRSU1BUXNnQVVFRGNRUkFBMEFnQUNBQkxRQUFJZ0k2QUFBZ0FrVU5BeUFBUVFGcUlRQWdBVUVCYWlJQlFRTnhEUUFMQ3lBQktBSUFJZ0pCZjNNZ0FrR0Jnb1FJYTNGQmdJR0NoSGh4RFFBRFFDQUFJQUkyQWdBZ0FTZ0NCQ0VDSUFCQkJHb2hBQ0FCUVFScUlRRWdBa0dCZ29RSWF5QUNRWDl6Y1VHQWdZS0VlSEZGRFFBTEN5QUFJQUk2QUFBZ0FrSC9BWEZGRFFBRFFDQUFJQUV0QUFFaUFqb0FBU0FBUVFGcUlRQWdBVUVCYWlFQklBSU5BQXNMQy9VQkFnRi9BWDRqQUVIUUFHc2lBeVFBQWtBQ2ZpQUJRUUJJQkVBZ0F5QUJRZi8vLy84SGNUWUNBQ0FEUVJCcUlnRkJ3QUJCM0NJZ0F4Qk9HaUFBSUFFUVlnd0JDeUFBS0FJUUlnQW9BaXdnQVUwTkFRSkFBa0FnQUNnQ09DSUFJQUZCQW5ScUtBSUFJZ0VwQWdRaUJFS0FnSUNBZ0lDQWdFQ0RRb0NBZ0lDQWdJQ0F3QUJSRFFBZ0FrVU5BU0FFcDBHQWdJQ0FlRWNOQUNBQUtBSzhBU0VCQ3lBQklBRW9BZ0JCQVdvMkFnQWdBYTFDZ0lDQWdKQi9oQXdCQ3lBQklBRW9BZ0JCQVdvMkFnQWdBYTFDZ0lDQWdJQi9oQXNoQkNBRFFkQUFhaVFBSUFRUEMwSHYzd0JCcnZ3QVFaZ1lRWWZpQUJBQUFBdnJBZ0VDZnlBQUlBRW9BZ1FRRXdOQUlBRW9BaEFoQXlBQ0lBRW9BaFJPUlFSQUlBQWdBeUFDUVFOMGFpZ0NBQkFUSUFKQkFXb2hBZ3dCQ3dzZ0FDZ0NFQ0lDUVJCcUlBTWdBaWdDQkJFQUFFRUFJUUlEUUFKQUlBRW9BaHdoQXlBQ0lBRW9BaUJPRFFBZ0F5QUNRUlJzYWlJREtBSUlSUVJBSUFBb0FoQWdBeWdDQkJEckFRc2dBQ0FES0FJUUVCTWdBQ0FES0FJTUVCTWdBa0VCYWlFQ0RBRUxDeUFBS0FJUUlnSkJFR29nQXlBQ0tBSUVFUUFBSUFBb0FoQWlBa0VRYWlBQktBSW9JQUlvQWdRUkFBQkJBQ0VDQTBBZ0FTZ0NOQ0VESUFJZ0FTZ0NPRTVGQkVBZ0FDQURJQUpCREd4cUtBSUVFQk1nQWtFQmFpRUNEQUVMQ3lBQUtBSVFJZ0pCRUdvZ0F5QUNLQUlFRVFBQUlBQWdBU2tEUUJBUElBQWdBU2tEU0JBUElBQWdBU2tEWUJBUElBQWdBU2tEYUJBUElBRW9BZ2dpQWlBQktBSU1JZ00yQWdRZ0F5QUNOZ0lBSUFGQ0FEY0NDQ0FBS0FJUUlnQkJFR29nQVNBQUtBSUVFUUFBQ3pBQkFYOGdBQ2dDT0NBQlFRSjBhaWdDQUNJQklBRW9BZ0FpQWtFQmF6WUNBQ0FDUVFGTUJFQWdBQ0FCRUtJREN3dkFBUUlCZndKK1FYOGhBd0pBSUFCQ0FGSWdBVUwvLy8vLy8vLy8vLzhBZ3lJRVFvQ0FnSUNBZ01ELy93QldJQVJDZ0lDQWdJQ0F3UC8vQUZFYkRRQWdBa0wvLy8vLy8vLy8vLzhBZ3lJRlFvQ0FnSUNBZ01ELy93QldJQVZDZ0lDQWdJQ0F3UC8vQUZKeERRQWdBQ0FFSUFXRWhGQUVRRUVBRHdzZ0FTQUNnMElBV1FSQUlBRWdBbElnQVNBQ1UzRU5BU0FBSUFFZ0FvV0VRZ0JTRHdzZ0FFSUFVaUFCSUFKVklBRWdBbEViRFFBZ0FDQUJJQUtGaEVJQVVpRURDeUFEQ3dvQUlBQkJmSEVRcEFNTFpRRUVmd05BSUFJZ0JVb0VRQ0FCSUFWcUlnWXRBQUFpQkVFUGFpQUVJQVJCc3dGTEd5QUVJQU1iUVFKMElnUkJnTGdCYWkwQUFDRUhJQVJCZzdnQmFpMEFBRUVYYTBIL0FYRkJCRTBFUUNBQUlBWW9BQUVRN0FFTElBVWdCMm9oQlF3QkN3c0xjQUFDUUFKQUFrQUNRQUpBSUFKQkJIWkJBM0ZCQVdzT0F3QUJBZ01MSUFFb0FnQWlBZ1JBSUFBZ0FxMUNnSUNBZ0hDRUVDTUxJQUVvQWdRaUFVVU5BeUFBSUFHdFFvQ0FnSUJ3aEJBakR3c2dBQ0FCS0FJQUVPc0JEd3NnQVNnQ0FCRHFCUThMSUFBZ0FTa0RBQkFqQ3d2SkJnRUZmd0pBQWtBQ1FBSkFBa0FDUUFKQUlBRXRBQVJCRDNFT0FnQUJCUXNnQVNBQkxRQUZRUUp5T2dBRklBRW9BaEFpQkVFd2FpRURBMEFnQVNnQ0ZDRUZJQUlnQkNnQ0lFNUZCRUFnQUNBRklBSkJBM1JxSUFNb0FnQkJHbllRN0FVZ0FrRUJhaUVDSUFOQkNHb2hBd3dCQ3dzZ0FFRVFhaUlHSUFVZ0FDZ0NCQkVBQUNBQUlBUVFrUUlnQVVJQU53TVFJQUVvQWhnaUFnUkFJQUloQXdOQUlBTUVRQ0FES0FJSUtBSUFSUTBGSUFNb0FnUU5CQ0FES0FJWUlnUWdBeWdDSENJRk5nSUVJQVVnQkRZQ0FDQURRZ0EzQWhnZ0F5Z0NFQ0lFSUFNb0FoUWlCVFlDQkNBRklBUTJBZ0FnQTBJQU53SVFJQU1vQWd3aEF3d0JDd3NEUUNBQ0JFQWdBaWdDRENFRElBQWdBaWtES0JBaklBWWdBaUFBS0FJRUVRQUFJQU1oQWd3QkN3c2dBVUVBTmdJWUN5QUFLQUpFSUFFdkFRWkJHR3hxS0FJSUlnSUVRQ0FBSUFHdFFvQ0FnSUJ3aENBQ0VRd0FDeUFCUWdBM0F5QWdBVUVBT3dFR0lBRkJBRFlDS0NBQktBSUlJZ0lnQVNnQ0RDSUROZ0lFSUFNZ0FqWUNBQ0FCUWdBM0FnZ2dBQzBBYUVFQ1J3MERJQUVvQWdCRkRRTU1CUXNnQUNBQktBSVVJQUVvQWhoQkFSRHJCUUpBSUFFb0FpQkZEUUFEUUNBQ0lBRXZBU29nQVM4QktHcFBEUUVnQUNBQktBSWdJQUpCQkhScUtBSUFFT3dCSUFKQkFXb2hBZ3dBQ3dBTFFRQWhBZ05BSUFFb0FqZ2dBa3dFUUVFQUlRSURRQ0FDSUFFb0FqeE9SUVJBSUFBZ0FTZ0NKQ0FDUVFOMGFpZ0NCQkRzQVNBQ1FRRnFJUUlNQVFzTElBRW9BakFpQWdSQUlBSVFwQU1MSUFBZ0FTZ0NIQkRzQVNBQkxRQVNRUVJ4QkVBZ0FDQUJLQUpBRU93QklBQkJFR29pQWlBQktBSlFJQUFvQWdRUkFBQWdBaUFCS0FKVUlBQW9BZ1FSQUFBTElBRW9BZ2dpQWlBQktBSU1JZ00yQWdRZ0F5QUNOZ0lBSUFGQ0FEY0NDQUpBSUFBdEFHaEJBa2NOQUNBQktBSUFSUTBBREFjTElBQkJFR29nQVNBQUtBSUVFUUFBRHdVZ0FDQUJLQUkwSUFKQkEzUnFLUU1BRUNNZ0FrRUJhaUVDREFFTEFBc0FDMEhoSEVHdS9BQkIxdVVDUVpiZUFCQUFBQXRCNGRjQVFhNzhBRUhWNVFKQmx0NEFFQUFBQ3lBR0lBRWdBQ2dDQkJFQUFBOExFQUVBQ3lBQUtBSllJZ0lnQVVFSWFpSUROZ0lFSUFFZ0FFSFlBR28yQWd3Z0FTQUNOZ0lJSUFBZ0F6WUNXQXRjQVFSL0lBRWhBd0pBQTBBZ0FpQURUU0FFUVFSTGNnMEJJQU1zQUFBaUJrSC9BSEVnQkVFSGJIUWdCWEloQlNBRVFRRnFJUVFnQTBFQmFpRURJQVpCQUVnTkFBc2dBQ0FGTmdJQUlBTWdBV3NQQ3lBQVFRQTJBZ0JCZnd2SEF3RUNmeUFBS0FJUUlnTW9BaFJCTUdvZ0F5Z0NiRXNFUUNBREVLSUZJQU1nQXlnQ0ZDSURRUUYySUFOcU5nSnNDd0pBSUFCQk1CQXBJZ01FUUNBRFFRQTJBaUFnQTBFQU5nSVlJQU5CQVRvQUJTQURJQUk3QVFZZ0F5QUJOZ0lRSUFNZ0FDQUJLQUljUVFOMEVDa2lCRFlDRkNBRURRRWdBQ2dDRUNJQ1FSQnFJQU1nQWlnQ0JCRUFBQXNnQUNnQ0VDQUJFSkVDUW9DQWdJRGdBQThMQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FDUVFGckRpUUhBQVlFQkFRRUFnWUVCZ0VHQmdZR0JnVUdCZ0lDQWdJQ0FnSUNBZ0lDQXdRRUJnUUdDeUFEUWdBM0F5QWdBMEVBTmdJb0lBTWdBeTBBQlVFTWNqb0FCU0FCSUFBb0FpUkhCSDhnQUNBRFFUQkJDaEI2QlNBRUMwSUFOd01BREFZTElBUkNnSUNBZ0RBM0F3QU1CUXNnQTBJQU53SWtJQU1nQXkwQUJVRU1jam9BQlF3RUN5QURRZ0EzQWlRTUF3c2dBMEtBZ0lDQU1EY0RJQXdCQ3lBRFFnQTNBeUFMSUFBb0FoQW9Ba1FnQWtFWWJHb29BaFJGRFFBZ0F5QURMUUFGUVFSeU9nQUZDeUFEUVFFMkFnQWdBQ2dDRUNFQUlBTkJBRG9BQkNBQUtBSlFJZ0VnQTBFSWFpSUNOZ0lFSUFNZ0FFSFFBR28yQWd3Z0F5QUJOZ0lJSUFBZ0FqWUNVQ0FEclVLQWdJQ0FjSVFMZ1FFQ0FYNEJmeU1BUVlBQ2F5SUdKQUFnQmtHQUFpQUNJQU1ReXdJYUFrQWdBQ0FBSUFGQkEzUnFLUU5ZUVFNUVNTSUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQkNnSUNBZ0NBaEJRd0JDeUFBSUFWQk15QUFJQVlRWWtFREVCa2FDeUFFQkVBZ0FDQUZRUUJCQUVFQUVNb0NDeUFBSUFVUWlnRWdCa0dBQW1va0FBc05BQ0FBSUFFZ0FSQS9FSUVEQzZvTEFRWi9JQUFnQVdvaEJRSkFBa0FnQUNnQ0JDSUNRUUZ4RFFBZ0FrRURjVVVOQVNBQUtBSUFJZ0lnQVdvaEFRSkFJQUFnQW1zaUFFSEUwQVFvQWdCSEJFQWdBa0gvQVUwRVFDQUNRUU4ySVFJZ0FDZ0NDQ0lFSUFBb0Fnd2lBMGNOQWtHdzBBUkJzTkFFS0FJQVFYNGdBbmR4TmdJQURBTUxJQUFvQWhnaEJnSkFJQUFnQUNnQ0RDSUNSd1JBUWNEUUJDZ0NBQm9nQUNnQ0NDSURJQUkyQWd3Z0FpQUROZ0lJREFFTEFrQWdBRUVVYWlJRUtBSUFJZ01OQUNBQVFSQnFJZ1FvQWdBaUF3MEFRUUFoQWd3QkN3TkFJQVFoQnlBRElnSkJGR29pQkNnQ0FDSUREUUFnQWtFUWFpRUVJQUlvQWhBaUF3MEFDeUFIUVFBMkFnQUxJQVpGRFFJQ1FDQUFLQUljSWdSQkFuUkI0TklFYWlJREtBSUFJQUJHQkVBZ0F5QUNOZ0lBSUFJTkFVRzAwQVJCdE5BRUtBSUFRWDRnQkhkeE5nSUFEQVFMSUFaQkVFRVVJQVlvQWhBZ0FFWWJhaUFDTmdJQUlBSkZEUU1MSUFJZ0JqWUNHQ0FBS0FJUUlnTUVRQ0FDSUFNMkFoQWdBeUFDTmdJWUN5QUFLQUlVSWdORkRRSWdBaUFETmdJVUlBTWdBallDR0F3Q0N5QUZLQUlFSWdKQkEzRkJBMGNOQVVHNDBBUWdBVFlDQUNBRklBSkJmbkUyQWdRZ0FDQUJRUUZ5TmdJRUlBVWdBVFlDQUE4TElBUWdBellDRENBRElBUTJBZ2dMQWtBZ0JTZ0NCQ0lDUVFKeFJRUkFRY2pRQkNnQ0FDQUZSZ1JBUWNqUUJDQUFOZ0lBUWJ6UUJFRzgwQVFvQWdBZ0FXb2lBVFlDQUNBQUlBRkJBWEkyQWdRZ0FFSEUwQVFvQWdCSERRTkJ1TkFFUVFBMkFnQkJ4TkFFUVFBMkFnQVBDMEhFMEFRb0FnQWdCVVlFUUVIRTBBUWdBRFlDQUVHNDBBUkJ1TkFFS0FJQUlBRnFJZ0UyQWdBZ0FDQUJRUUZ5TmdJRUlBQWdBV29nQVRZQ0FBOExJQUpCZUhFZ0FXb2hBUUpBSUFKQi93Rk5CRUFnQWtFRGRpRUNJQVVvQWd3aUF5QUZLQUlJSWdSR0JFQkJzTkFFUWJEUUJDZ0NBRUYrSUFKM2NUWUNBQXdDQ3lBRUlBTTJBZ3dnQXlBRU5nSUlEQUVMSUFVb0FoZ2hCZ0pBSUFVZ0JTZ0NEQ0lDUndSQVFjRFFCQ2dDQUJvZ0JTZ0NDQ0lESUFJMkFnd2dBaUFETmdJSURBRUxBa0FnQlVFVWFpSURLQUlBSWdRTkFDQUZRUkJxSWdNb0FnQWlCQTBBUVFBaEFnd0JDd05BSUFNaEJ5QUVJZ0pCRkdvaUF5Z0NBQ0lFRFFBZ0FrRVFhaUVESUFJb0FoQWlCQTBBQ3lBSFFRQTJBZ0FMSUFaRkRRQUNRQ0FGS0FJY0lnUkJBblJCNE5JRWFpSURLQUlBSUFWR0JFQWdBeUFDTmdJQUlBSU5BVUcwMEFSQnROQUVLQUlBUVg0Z0JIZHhOZ0lBREFJTElBWkJFRUVVSUFZb0FoQWdCVVliYWlBQ05nSUFJQUpGRFFFTElBSWdCallDR0NBRktBSVFJZ01FUUNBQ0lBTTJBaEFnQXlBQ05nSVlDeUFGS0FJVUlnTkZEUUFnQWlBRE5nSVVJQU1nQWpZQ0dBc2dBQ0FCUVFGeU5nSUVJQUFnQVdvZ0FUWUNBQ0FBUWNUUUJDZ0NBRWNOQVVHNDBBUWdBVFlDQUE4TElBVWdBa0YrY1RZQ0JDQUFJQUZCQVhJMkFnUWdBQ0FCYWlBQk5nSUFDeUFCUWY4QlRRUkFJQUZCZUhGQjJOQUVhaUVDQW45QnNOQUVLQUlBSWdOQkFTQUJRUU4yZENJQmNVVUVRRUd3MEFRZ0FTQURjallDQUNBQ0RBRUxJQUlvQWdnTElRRWdBaUFBTmdJSUlBRWdBRFlDRENBQUlBSTJBZ3dnQUNBQk5nSUlEd3RCSHlFRUlBRkIvLy8vQjAwRVFDQUJRU1lnQVVFSWRtY2lBbXQyUVFGeElBSkJBWFJyUVQ1cUlRUUxJQUFnQkRZQ0hDQUFRZ0EzQWhBZ0JFRUNkRUhnMGdScUlRY0NRQUpBUWJUUUJDZ0NBQ0lEUVFFZ0JIUWlBbkZGQkVCQnROQUVJQUlnQTNJMkFnQWdCeUFBTmdJQUlBQWdCellDR0F3QkN5QUJRUmtnQkVFQmRtdEJBQ0FFUVI5SEczUWhCQ0FIS0FJQUlRSURRQ0FDSWdNb0FnUkJlSEVnQVVZTkFpQUVRUjEySVFJZ0JFRUJkQ0VFSUFNZ0FrRUVjV29pQjBFUWFpZ0NBQ0lDRFFBTElBY2dBRFlDRUNBQUlBTTJBaGdMSUFBZ0FEWUNEQ0FBSUFBMkFnZ1BDeUFES0FJSUlnRWdBRFlDRENBRElBQTJBZ2dnQUVFQU5nSVlJQUFnQXpZQ0RDQUFJQUUyQWdnTEMvOEhBUXgvSUFCRkJFQWdBUkN4QVE4TEFrQWdBVUcvZjBzTkFBSi9RUkFnQVVFTGFrRjRjU0FCUVF0Skd5RUZJQUJCQ0dzaUJDZ0NCQ0lJUVhoeElRSUNRQ0FJUVFOeFJRUkFRUUFnQlVHQUFra05BaG9nQlVFRWFpQUNUUVJBSUFRaEF5QUNJQVZyUVpEVUJDZ0NBRUVCZEUwTkFndEJBQXdDQ3lBQ0lBUnFJUVlDUUNBQ0lBVlBCRUFnQWlBRmF5SURRUkJKRFFFZ0JDQUlRUUZ4SUFWeVFRSnlOZ0lFSUFRZ0JXb2lBaUFEUVFOeU5nSUVJQVlnQmlnQ0JFRUJjallDQkNBQ0lBTVE4Z1VNQVF0QnlOQUVLQUlBSUFaR0JFQkJ2TkFFS0FJQUlBSnFJZ0lnQlUwTkFpQUVJQWhCQVhFZ0JYSkJBbkkyQWdRZ0JDQUZhaUlESUFJZ0JXc2lBa0VCY2pZQ0JFRzgwQVFnQWpZQ0FFSEkwQVFnQXpZQ0FBd0JDMEhFMEFRb0FnQWdCa1lFUUVHNDBBUW9BZ0FnQW1vaUFpQUZTUTBDQWtBZ0FpQUZheUlEUVJCUEJFQWdCQ0FJUVFGeElBVnlRUUp5TmdJRUlBUWdCV29pQnlBRFFRRnlOZ0lFSUFJZ0JHb2lBaUFETmdJQUlBSWdBaWdDQkVGK2NUWUNCQXdCQ3lBRUlBaEJBWEVnQW5KQkFuSTJBZ1FnQWlBRWFpSURJQU1vQWdSQkFYSTJBZ1JCQUNFREMwSEUwQVFnQnpZQ0FFRzQwQVFnQXpZQ0FBd0JDeUFHS0FJRUlnZEJBbkVOQVNBSFFYaHhJQUpxSWdrZ0JVa05BU0FKSUFWcklRc0NRQ0FIUWY4QlRRUkFJQVlvQWd3aUF5QUdLQUlJSWdKR0JFQkJzTkFFUWJEUUJDZ0NBRUYrSUFkQkEzWjNjVFlDQUF3Q0N5QUNJQU0yQWd3Z0F5QUNOZ0lJREFFTElBWW9BaGdoQ2dKQUlBWWdCaWdDRENJQ1J3UkFRY0RRQkNnQ0FCb2dCaWdDQ0NJRElBSTJBZ3dnQWlBRE5nSUlEQUVMQWtBZ0JrRVVhaUlIS0FJQUlnTU5BQ0FHUVJCcUlnY29BZ0FpQXcwQVFRQWhBZ3dCQ3dOQUlBY2hEQ0FESWdKQkZHb2lCeWdDQUNJRERRQWdBa0VRYWlFSElBSW9BaEFpQXcwQUN5QU1RUUEyQWdBTElBcEZEUUFDUUNBR0tBSWNJZ05CQW5SQjROSUVhaUlIS0FJQUlBWkdCRUFnQnlBQ05nSUFJQUlOQVVHMDBBUkJ0TkFFS0FJQVFYNGdBM2R4TmdJQURBSUxJQXBCRUVFVUlBb29BaEFnQmtZYmFpQUNOZ0lBSUFKRkRRRUxJQUlnQ2pZQ0dDQUdLQUlRSWdNRVFDQUNJQU0yQWhBZ0F5QUNOZ0lZQ3lBR0tBSVVJZ05GRFFBZ0FpQUROZ0lVSUFNZ0FqWUNHQXNnQzBFUFRRUkFJQVFnQ0VFQmNTQUpja0VDY2pZQ0JDQUVJQWxxSWdNZ0F5Z0NCRUVCY2pZQ0JBd0JDeUFFSUFoQkFYRWdCWEpCQW5JMkFnUWdCQ0FGYWlJRElBdEJBM0kyQWdRZ0JDQUphaUlDSUFJb0FnUkJBWEkyQWdRZ0F5QUxFUElGQ3lBRUlRTUxJQU1MSWdNRVFDQURRUWhxRHdzZ0FSQ3hBU0lEUlEwQUlBTWdBRUY4UVhnZ0FFRUVheWdDQUNJRVFRTnhHeUFFUVhoeGFpSUVJQUVnQVNBRVN4c1FIeG9nQUJDYkFTQURJUTBMSUEwTE1RQWdCRUVDY1FSQVFiU0dBVUd1L0FCQnZJY0NRYU00RUFBQUN5QUFJQUFwQThBQklBRWdBaUFESUFSQmZ4REtCUXV2QVFJQmZ3RitJd0JCMEFCcklnUWtBQ0FFUVFCQjBBQVFLeUlFSUFNMkFnd2dCQ0FBTmdJQUlBUkJBVFlDQ0NBRVFxQ0FnSUFRTndNUUlBUWdBVFlDT0NBRUlBRWdBbW8yQWp4Q2dJQ0FnREFoQlFKQUFrQWdCQkNpQVEwQUlBUVEwZ01pQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFRb0FoQkJySDlHRFFFZ0JFR3c4d0JCQUJBV0N5QUFJQVVRRHlBRUlBUkJFR29RL3dGQ2dJQ0FnT0FBSVFVTElBUkIwQUJxSkFBZ0JRdGlBZ04rQVg4Z0FDa0R3QUVpQWtJZ2lLZEJkVThFUUNBQ3B5SUZJQVVvQWdCQkFXbzJBZ0FMSUFBZ0FrR0Qwd0FRc2dFaEF5QUFJQUlRRHlBQUlBQWdBMEhkd0FBUXNnRWlBaUFEUVFFZ0FSQWhJUVFnQUNBQ0VBOGdBQ0FERUE4Z0JBc01BQ0FBSUFFcEF3QVFzd0VMeWdZQ0JIOERmaU1BUVlBQmF5SUZKQUFDUUFKQUFrQWdBeUFFUWdCQ0FCRHRBVVVOQUFKL0lBUkMvLy8vLy8vL1A0TWhDZ0ovSUFSQ01JaW5RZi8vQVhFaUJrSC8vd0ZIQkVCQkJDQUdEUUVhUVFKQkF5QURJQXFFVUJzTUFnc2dBeUFLaEZBTEN5RUdJQUpDTUlpbklnaEIvLzhCY1NJSFFmLy9BVVlOQUNBR0RRRUxJQVZCRUdvZ0FTQUNJQU1nQkJBdUlBVWdCU2tERUNJQ0lBVXBBeGdpQVNBQ0lBRVE0d1VnQlNrRENDRUNJQVVwQXdBaEJBd0JDeUFCSUFKQy8vLy8vLy8vLy8vL0FJTWlDaUFESUFSQy8vLy8vLy8vLy8vL0FJTWlDUkR0QVVFQVRBUkFJQUVnQ2lBRElBa1E3UUVFUUNBQklRUU1BZ3NnQlVId0FHb2dBU0FDUWdCQ0FCQXVJQVVwQTNnaEFpQUZLUU53SVFRTUFRc2dCRUl3aUtkQi8vOEJjU0VHSUFjRWZpQUJCU0FGUWVBQWFpQUJJQXBDQUVLQWdJQ0FnSURBdThBQUVDNGdCU2tEYUNJS1FqQ0lwMEg0QUdzaEJ5QUZLUU5nQ3lFRUlBWkZCRUFnQlVIUUFHb2dBeUFKUWdCQ2dJQ0FnSUNBd0x2QUFCQXVJQVVwQTFnaUNVSXdpS2RCK0FCcklRWWdCU2tEVUNFREN5QUpRdi8vLy8vLy96K0RRb0NBZ0lDQWdNQUFoQ0VMSUFwQy8vLy8vLy8vUDROQ2dJQ0FnSUNBd0FDRUlRb2dCaUFIU0FSQUEwQUNmaUFLSUF0OUlBTWdCRmF0ZlNJSlFnQlpCRUFnQ1NBRUlBTjlJZ1NFVUFSQUlBVkJJR29nQVNBQ1FnQkNBQkF1SUFVcEF5Z2hBaUFGS1FNZ0lRUU1CUXNnQ1VJQmhpQUVRaitJaEF3QkN5QUtRZ0dHSUFSQ1A0aUVDeUVLSUFSQ0FZWWhCQ0FIUVFGcklnY2dCa29OQUFzZ0JpRUhDd0pBSUFvZ0MzMGdBeUFFVnExOUlnbENBRk1FUUNBS0lRa01BUXNnQ1NBRUlBTjlJZ1NFUWdCU0RRQWdCVUV3YWlBQklBSkNBRUlBRUM0Z0JTa0RPQ0VDSUFVcEF6QWhCQXdCQ3lBSlF2Ly8vLy8vL3o5WUJFQURRQ0FFUWorSUlRRWdCMEVCYXlFSElBUkNBWVloQkNBQklBbENBWWFFSWdsQ2dJQ0FnSUNBd0FCVURRQUxDeUFJUVlDQUFuRWhCaUFIUVFCTUJFQWdCVUZBYXlBRUlBbEMvLy8vLy8vL1A0TWdCMEg0QUdvZ0JuS3RRakNHaEVJQVFvQ0FnSUNBZ01ERFB4QXVJQVVwQTBnaEFpQUZLUU5BSVFRTUFRc2dDVUwvLy8vLy8vOC9neUFHSUFkeXJVSXdob1FoQWdzZ0FDQUVOd01BSUFBZ0FqY0RDQ0FGUVlBQmFpUUFDNHNEQWdKK0EzOGpBRUVnYXlJQ0pBQkNnSUNBZ09BQUlRUUNRQ0FBSUFNcEF3QWlCUkJnRFFBZ0FDQUJRVEVRWlNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FBSitBa0FnQUVFZ0VGOGlCa1VOQUVFQUlRTWdCa0VBTmdJVUlBWkJBRFlDQUFOQUlBTkJBa1pGQkVBZ0JpQURRUU4wYWlJSElBZEJCR29pQ0RZQ0NDQUhJQWcyQWdRZ0EwRUJhaUVEREFFTEN5QUdRb0NBZ0lBd053TVlJQUZDZ0lDQWdIQmFCRUFnQWFjZ0JqWUNJQXNnQUNBQ1FSQnFJQUVRcEFVTkFBSkFJQUFnQlVLQWdJQ0FNRUVDSUFKQkVHb1FJU0lGUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNnQ0VDSURLUU9BQVNFRUlBTkNnSUNBZ0NBM0E0QUJJQUlnQkRjRENDQUFJQUlwQXhoQ2dJQ0FnREJCQVNBQ1FRaHFFQ0VoQkNBQUlBSXBBd2dRRHlBRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FDQUVFQThMSUFBZ0JSQVBJQUFnQWlrREVCQVBJQUVoQkNBQ0tRTVlEQUlMSUFBZ0Fpa0RFQkFQSUFBZ0Fpa0RHQkFQUW9DQWdJRGdBQ0VFQ3lBQkN4QVBDeUFDUVNCcUpBQWdCQXVTQ3dJSGZnVi9Jd0JCRUdzaUFpUUFJQVJCNWFZQmFpMEFBQ0lOclNFSkFrQUNRQUpBSUFNcEF3QWlCa0wvLy8vL2IxZ0VRRUtBZ0lDQTRBQWhCU0FBSUFKQkNHb2dCaENtQVEwRElBQkNnSUNBZ0RBZ0Fpa0RDQ0lISUFtR0VQa0NJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5Bd3dCQ3dKQUFrQWdCcWNpREM4QkJpSU9RUk5yUWYvL0EzRkJBVTBFUUNBTUtBSWdJUXhDZ0lDQWdPQUFJUVVnQUNBQ0lBTXBBd2dRcGdFTkJTQU1MUUFFRFFJQ1FDQUNLUU1BSWdoQmZ5QU5kRUYvY3lJTnJJTlFCRUFnQ0NBTUtBSUFJZzZzSWdaWURRRUxJQUJCK0MxQkFCQlFEQVlMQWtBZ0F5a0RFQ0lIUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FOSUE1eERRRWdCaUFJZlNBSmlDRUhEQU1MSUFBZ0FrRUlhaUFIRUtZQkRRWWdEQzBBQkEwRElBdzBBZ0FnQWlrRENDSUhJQW1HSUFoOFdnMENDeUFBUVpMWkFFRUFFRkFNQlFzQ2ZnSkFBa0FnQUVLQWdJQ0FNQUorQWtBQ1FBSitBa0FDUUFKQUlBNUJGV3RCLy84RGNVRUtUUVJBSUFBZ0FTQUVFR1VpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBQQWtBQ1FDQU1LQUlnSWc4b0Fnd2lBeWdDSUNJTkxRQUVSUVJBSUF3b0FpZ2hEa0tBZ0lDQU1DRUJJQTB0QUFWRkJFQWdBQ0FEclVLQWdJQ0FjSVJDZ0lDQWdEQVE0d0VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBEQ3lBQUlBRWdEcTBpQ0NBSmhoRDVBaUVISUFBZ0FSQVBJQWRDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BaUFNS0FJZ0tBSU1LQUlnTFFBRVJRMEJJQUFnQnhBUEN5QUFFR3NNQVF0QkFDRURBa0FnQjBLQWdJQ0FjRlFOQUNBSHB5SVFMd0VHUVJOSERRQWdFQ2dDSUNFREN5QUFJQVVnQjBJQUlBZ1Eyd01OQUNBTUx3RUdJQVJHRFFKQkFDRUVBMEFnQkNBT1JnMFJJQUFnQmlBRUVMQUJJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFVZ0JDQUJFS1VCSVFNZ0JFRUJhaUVFSUFOQkFFNE5BQXNMSUFBZ0JSQVBEQTRMUW9DQWdJRGdBQ0VGSUFBZ0FTQUVFR1VpQ2tLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBPUW9DQWdJQXdJUVVnQUNBR1FkRUJJQVpCQUJBVUlndENnSUNBZ0hDRElnZENnSUNBZ0NCUklBZENnSUNBZ0RCUmNnMEJRb0NBZ0lEZ0FDRUJJQWRDZ0lDQWdPQUFVUTBJUVFBaEF5QUFFRDRpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBGSUFBZ0JpQUxFUG9ESWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0FNQXdFQ3lBQUlBVkI2Z0FnQlVFQUVCUWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMENRUUFoQkFOQUlBQWdCU0FHSUFKQkNHb1FyZ0VpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBESUFJb0FnZ0VRQ0FFSVFNZ0J5RUJEQVlMSUFBZ0J5QUVyU0FJUVlDQUFSRFNBVUVBU0FSQUlBWWhDQ0FGSVFZZ0J5RUZEQVlGSUFSQkFXb2hCQXdCQ3dBTEFBc2dBeWdDQ0NBTktBSUlJQThvQWhCcUlBTW9BZ0FRSHhvTURRc2dBQ0FDUVFocUlBWVFQQTBHSUF3Z0RDZ0NBRUVCYWpZQ0FDQUdJUUVnQWlrRENBd0VDeUFHQ3lFSUlBVWhCaUFISVFVTElBQWdDQkFQSUFBZ0JoQVBJQUFnQlJBUEN5QUFJQXNRRHlBQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0E2MExJZ1VnQ1lZUStRSWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQ2lBR1FnQWdCUkRiQXcwQVFRQWhCQU5BSUFvZ0JLMGdCVmtOQXhvZ0FDQUJJQVFRc0FFaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBQWdDaUFFSUFZUXBRRWhBeUFFUVFGcUlRUWdBMEVBVGcwQUN3c2dBU0VGQ3lBQUlBVVFEeUFLSVFGQ2dJQ0FnT0FBQ3lFRklBQWdBUkFQREFRTElBTXBBd0FpQmtJZ2lLZEJkVWtOQVNBR3B5SURJQU1vQWdCQkFXbzJBZ0FNQVFzZ0FCQnJEQUlMSUFBZ0FTQUVFR1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFBZ0JoQVBEQUlMSUFBZ0FTQUdJQWdnQnhEYkEwVUVRQ0FCSVFVTUFnc2dBQ0FCRUE4TFFvQ0FnSURnQUNFRkN5QUNRUkJxSkFBZ0JRc1BBQ0FBSUFFZ0FrRUFRUU1RbGdJTDlBRUNBMzRCZndKQUlBTXBBd0FpQkVLQWdJQ0FjRm9FUUNBREtRTUlJZ1ZDLy8vLy8yOVdEUUVMSUFBUUpFS0FnSUNBNEFBUEMwS0FnSUNBNEFBaEJpQUFRb0NBZ0lBZ1FUQVFTU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlNCSDRnQUVFWUVDa2lBa1VFUUNBQUlBRVFEMEtBZ0lDQTRBQVBDeUFFcHlJRElBTW9BZ0JCQVdvMkFnQWdBaUFFTndNQUlBV25JZ2NnQnlnQ0FFRUJhallDQUNBQ0lBVTNBd2dnQUNBRUVEZ2hBQ0FDUVFBNkFCRWdBaUFBT2dBUUlBRkNnSUNBZ0hCYUJFQWdBYWNpQUNBQ05nSWdJQUFnQUMwQUJVSHZBWEVnQXkwQUJVRVFjWEk2QUFVTElBRUZRb0NBZ0lEZ0FBc0xYZ0VCZndKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQkM4QkJpQURSdzBBSUFRb0FpQWlCRVVOQUNBRUtRTUFJZ0ZDZ0lDQWdHQmFCRUFnQUNBQnB5QUNFUUFBQ3lBRUtRTUlJZ0ZDZ0lDQWdHQlVEUUFnQUNBQnB5QUNFUUFBQ3d0S0FRRi9Ba0FnQVVLQWdJQ0FjRlFOQUNBQnB5SURMd0VHSUFKSERRQWdBeWdDSUNJRFJRMEFJQUFnQXlrREFCQWpJQUFnQXlrRENCQWpJQUJCRUdvZ0F5QUFLQUlFRVFBQUN3czRBUUYvSUFCQk1Hc2lCRUVLVHdSL0lBQkJ3UUJySUFOTkJFQWdBRUUzYXc4TElBSWdBRUhYQUdzZ0FFSGhBR3NnQVU4YkJTQUVDd3RMQVFGL0lBQkJHQkFwSWdKRkJFQkNnSUNBZ09BQUR3c2dBa0VCTmdJQUlBQW9BdGdCSVFBZ0FrSUFOd0lRSUFKQ2dJQ0FnSUNBZ0lDQWZ6Y0NDQ0FDSUFBMkFnUWdBcTBnQVlRTGtRSUFJQUJGQkVCQkFBOExBbjhDUUNBQlFmOEFUUTBBQWtCQmlOVUVLQUlBS0FJQVJRUkFJQUZCZ0g5eFFZQy9BMFlOQWd3QkN5QUJRZjhQVFFSQUlBQWdBVUUvY1VHQUFYSTZBQUVnQUNBQlFRWjJRY0FCY2pvQUFFRUNEQU1MSUFGQmdFQnhRWURBQTBjZ0FVR0FzQU5QY1VVRVFDQUFJQUZCUDNGQmdBRnlPZ0FDSUFBZ0FVRU1ka0hnQVhJNkFBQWdBQ0FCUVFaMlFUOXhRWUFCY2pvQUFVRUREQU1MSUFGQmdJQUVhMEgvL3o5TkJFQWdBQ0FCUVQ5eFFZQUJjam9BQXlBQUlBRkJFblpCOEFGeU9nQUFJQUFnQVVFR2RrRS9jVUdBQVhJNkFBSWdBQ0FCUVF4MlFUOXhRWUFCY2pvQUFVRUVEQU1MQzBHZzFBUkJHVFlDQUVGL0RBRUxJQUFnQVRvQUFFRUJDd3ZFQWdBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQlFRbHJEaElBQ2dzTUNnc0NBd1FGREFzTURBb0xCd2dKQ3lBQ0lBSW9BZ0FpQVVFRWFqWUNBQ0FBSUFFb0FnQTJBZ0FQQ3dBTElBSWdBaWdDQUNJQlFRUnFOZ0lBSUFBZ0FUSUJBRGNEQUE4TElBSWdBaWdDQUNJQlFRUnFOZ0lBSUFBZ0FUTUJBRGNEQUE4TElBSWdBaWdDQUNJQlFRUnFOZ0lBSUFBZ0FUQUFBRGNEQUE4TElBSWdBaWdDQUNJQlFRUnFOZ0lBSUFBZ0FURUFBRGNEQUE4TEFBc2dBaUFDS0FJQVFRZHFRWGh4SWdGQkNHbzJBZ0FnQUNBQkt3TUFPUU1BRHdzZ0FDQUNJQU1SQUFBTER3c2dBaUFDS0FJQUlnRkJCR28yQWdBZ0FDQUJOQUlBTndNQUR3c2dBaUFDS0FJQUlnRkJCR28yQWdBZ0FDQUJOUUlBTndNQUR3c2dBaUFDS0FJQVFRZHFRWGh4SWdGQkNHbzJBZ0FnQUNBQktRTUFOd01BQzE0QkJIOGdBQ2dDQUNFQ0EwQWdBaXdBQUNJREVORUNCRUJCZnlFRUlBQWdBa0VCYWlJQ05nSUFJQUZCekptejVnQk5CSDlCZnlBRFFUQnJJZ01nQVVFS2JDSUVhaUFESUFSQi8vLy8vd2R6U2hzRlFYOExJUUVNQVFzTElBRUwzQklDRW44QmZpTUFRZEFBYXlJSUpBQWdDQ0FCTmdKTUlBaEJOMm9oRnlBSVFUaHFJUklDUUFKQUFrQUNRQU5BSUFFaERDQUhJQTVCLy8vLy93ZHpTZzBCSUFjZ0Rtb2hEZ0pBQWtBQ1FDQU1JZ2N0QUFBaUNRUkFBMEFDUUFKQUlBbEIvd0Z4SWdGRkJFQWdCeUVCREFFTElBRkJKVWNOQVNBSElRa0RRQ0FKTFFBQlFTVkhCRUFnQ1NFQkRBSUxJQWRCQVdvaEJ5QUpMUUFDSVFvZ0NVRUNhaUlCSVFrZ0NrRWxSZzBBQ3dzZ0J5QU1heUlISUE1Qi8vLy8vd2R6SWhoS0RRY2dBQVJBSUFBZ0RDQUhFRnNMSUFjTkJpQUlJQUUyQWt3Z0FVRUJhaUVIUVg4aER3SkFJQUVzQUFFaUNoRFJBa1VOQUNBQkxRQUNRU1JIRFFBZ0FVRURhaUVISUFwQk1Hc2hEMEVCSVJNTElBZ2dCellDVEVFQUlRMENRQ0FITEFBQUlnbEJJR3NpQVVFZlN3UkFJQWNoQ2d3QkN5QUhJUXBCQVNBQmRDSUJRWW5SQkhGRkRRQURRQ0FJSUFkQkFXb2lDallDVENBQklBMXlJUTBnQnl3QUFTSUpRU0JySWdGQklFOE5BU0FLSVFkQkFTQUJkQ0lCUVluUkJIRU5BQXNMQWtBZ0NVRXFSZ1JBQW44Q1FDQUtMQUFCSWdFUTBRSkZEUUFnQ2kwQUFrRWtSdzBBSUFGQkFuUWdCR3BCd0FGclFRbzJBZ0FnQ2tFRGFpRUpRUUVoRXlBS0xBQUJRUU4wSUFOcVFZQURheWdDQUF3QkN5QVREUVlnQ2tFQmFpRUpJQUJGQkVBZ0NDQUpOZ0pNUVFBaEUwRUFJUkFNQXdzZ0FpQUNLQUlBSWdGQkJHbzJBZ0JCQUNFVElBRW9BZ0FMSVJBZ0NDQUpOZ0pNSUJCQkFFNE5BVUVBSUJCcklSQWdEVUdBd0FCeUlRME1BUXNnQ0VITUFHb1Fnd1lpRUVFQVNBMElJQWdvQWt3aENRdEJBQ0VIUVg4aEN3Si9JQWt0QUFCQkxrY0VRQ0FKSVFGQkFBd0JDeUFKTFFBQlFTcEdCRUFDZndKQUlBa3NBQUlpQVJEUkFrVU5BQ0FKTFFBRFFTUkhEUUFnQVVFQ2RDQUVha0hBQVd0QkNqWUNBQ0FKUVFScUlRRWdDU3dBQWtFRGRDQURha0dBQTJzb0FnQU1BUXNnRXcwR0lBbEJBbW9oQVVFQUlBQkZEUUFhSUFJZ0FpZ0NBQ0lLUVFScU5nSUFJQW9vQWdBTElRc2dDQ0FCTmdKTUlBdEJmM05CSDNZTUFRc2dDQ0FKUVFGcU5nSk1JQWhCekFCcUVJTUdJUXNnQ0NnQ1RDRUJRUUVMSVJRRFFDQUhJUlZCSENFS0lBRWlFU3dBQUNJSFFmc0FhMEZHU1EwSklCRkJBV29oQVNBSElCVkJPbXhxUVovQkJHb3RBQUFpQjBFQmEwRUlTUTBBQ3lBSUlBRTJBa3dDUUFKQUlBZEJHMGNFUUNBSFJRMExJQTlCQUU0RVFDQUVJQTlCQW5ScUlBYzJBZ0FnQ0NBRElBOUJBM1JxS1FNQU53TkFEQUlMSUFCRkRRZ2dDRUZBYXlBSElBSWdCaENDQmd3Q0N5QVBRUUJPRFFvTFFRQWhCeUFBUlEwSEN5QU5RZi8vZTNFaUNTQU5JQTFCZ01BQWNSc2hEVUVBSVE5QnJDRWhGaUFTSVFvQ1FBSkFBa0FDZndKQUFrQUNRQUpBQW44Q1FBSkFBa0FDUUFKQUFrQUNRQ0FSTEFBQUlnZEJYM0VnQnlBSFFROXhRUU5HR3lBSElCVWJJZ2RCMkFCckRpRUVGQlFVRkJRVUZCUU9GQThHRGc0T0ZBWVVGQlFVQWdVREZCUUpGQUVVRkFRQUN3SkFJQWRCd1FCckRnY09GQXNVRGc0T0FBc2dCMEhUQUVZTkNRd1RDeUFJS1FOQUlSbEJyQ0VNQlF0QkFDRUhBa0FDUUFKQUFrQUNRQUpBQWtBZ0ZVSC9BWEVPQ0FBQkFnTUVHZ1VHR2dzZ0NDZ0NRQ0FPTmdJQURCa0xJQWdvQWtBZ0RqWUNBQXdZQ3lBSUtBSkFJQTZzTndNQURCY0xJQWdvQWtBZ0Rqc0JBQXdXQ3lBSUtBSkFJQTQ2QUFBTUZRc2dDQ2dDUUNBT05nSUFEQlFMSUFnb0FrQWdEcXczQXdBTUV3dEJDQ0FMSUF0QkNFMGJJUXNnRFVFSWNpRU5RZmdBSVFjTElCSWhEQ0FIUVNCeElSRWdDQ2tEUUNJWlVFVUVRQU5BSUF4QkFXc2lEQ0FacDBFUGNVR3d4UVJxTFFBQUlCRnlPZ0FBSUJsQ0QxWWhDU0FaUWdTSUlSa2dDUTBBQ3dzZ0RVRUljVVVnQ0NrRFFGQnlEUU1nQjBFRWRrR3NJV29oRmtFQ0lROE1Bd3NnRWlFSElBZ3BBMEFpR1ZCRkJFQURRQ0FIUVFGcklnY2dHYWRCQjNGQk1ISTZBQUFnR1VJSFZpRU1JQmxDQTRnaEdTQU1EUUFMQ3lBSElRd2dEVUVJY1VVTkFpQUxJQklnREdzaUIwRUJhaUFISUF0SUd5RUxEQUlMSUFncEEwQWlHVUlBVXdSQUlBaENBQ0FaZlNJWk53TkFRUUVoRDBHc0lRd0JDeUFOUVlBUWNRUkFRUUVoRDBHdElRd0JDMEd1SVVHc0lTQU5RUUZ4SWc4YkN5RVdJQmtnRWhDVkFpRU1DeUFVUVFBZ0MwRUFTQnNORGlBTlFmLy9lM0VnRFNBVUd5RU5JQWdwQTBBaUdVSUFVaUFMY2tVRVFDQVNJUXhCQUNFTERBd0xJQXNnR1ZBZ0VpQU1hMm9pQnlBSElBdElHeUVMREFzTElBZ29Ba0FpQjBHZ2tnRWdCeHNpREVFQVFmLy8vLzhISUFzZ0MwSC8vLy8vQjA4Yklnb1Erd0VpQnlBTWF5QUtJQWNiSWdjZ0RHb2hDaUFMUVFCT0JFQWdDU0VOSUFjaEN3d0xDeUFKSVEwZ0J5RUxJQW90QUFBTkRRd0tDeUFMQkVBZ0NDZ0NRQXdDQzBFQUlRY2dBRUVnSUJCQkFDQU5FR01NQWdzZ0NFRUFOZ0lNSUFnZ0NDa0RRRDRDQ0NBSUlBaEJDR29pQnpZQ1FFRi9JUXNnQndzaENVRUFJUWNDUUFOQUlBa29BZ0FpREVVTkFTQUlRUVJxSUF3UWdRWWlDa0VBU0NJTUlBb2dDeUFIYTB0eVJRUkFJQWxCQkdvaENTQUxJQWNnQ21vaUIwc05BUXdDQ3dzZ0RBME5DMEU5SVFvZ0IwRUFTQTBMSUFCQklDQVFJQWNnRFJCaklBZEZCRUJCQUNFSERBRUxRUUFoQ2lBSUtBSkFJUWtEUUNBSktBSUFJZ3hGRFFFZ0NFRUVhaUFNRUlFR0lnd2dDbW9pQ2lBSFN3MEJJQUFnQ0VFRWFpQU1FRnNnQ1VFRWFpRUpJQWNnQ2tzTkFBc0xJQUJCSUNBUUlBY2dEVUdBd0FCekVHTWdFQ0FISUFjZ0VFZ2JJUWNNQ0FzZ0ZFRUFJQXRCQUVnYkRRaEJQU0VLSUFBZ0NDc0RRQ0FRSUFzZ0RTQUhJQVVSU1FBaUIwRUFUZzBIREFrTElBZ2dDQ2tEUUR3QU4wRUJJUXNnRnlFTUlBa2hEUXdFQ3lBSExRQUJJUWtnQjBFQmFpRUhEQUFMQUFzZ0FBMEhJQk5GRFFKQkFTRUhBMEFnQkNBSFFRSjBhaWdDQUNJQUJFQWdBeUFIUVFOMGFpQUFJQUlnQmhDQ0JrRUJJUTRnQjBFQmFpSUhRUXBIRFFFTUNRc0xRUUVoRGlBSFFRcFBEUWNEUUNBRUlBZEJBblJxS0FJQURRRWdCMEVCYWlJSFFRcEhEUUFMREFjTFFSd2hDZ3dFQ3lBTElBb2dER3NpRVNBTElCRktHeUlKSUE5Qi8vLy8vd2R6U2cwQ1FUMGhDaUFRSUFrZ0Qyb2lDeUFMSUJCSUd5SUhJQmhLRFFNZ0FFRWdJQWNnQ3lBTkVHTWdBQ0FXSUE4UVd5QUFRVEFnQnlBTElBMUJnSUFFY3hCaklBQkJNQ0FKSUJGQkFCQmpJQUFnRENBUkVGc2dBRUVnSUFjZ0N5QU5RWURBQUhNUVl3d0JDd3RCQUNFT0RBTUxRVDBoQ2d0Qm9OUUVJQW8yQWdBTFFYOGhEZ3NnQ0VIUUFHb2tBQ0FPQzM4Q0FYOEJmaUFBdlNJRFFqU0lwMEgvRDNFaUFrSC9EMGNFZkNBQ1JRUkFJQUVnQUVRQUFBQUFBQUFBQUdFRWYwRUFCU0FBUkFBQUFBQUFBUEJEb2lBQkVJVUdJUUFnQVNnQ0FFRkFhZ3MyQWdBZ0FBOExJQUVnQWtIK0IyczJBZ0FnQTBMLy8vLy8vLy8vaDRCL2cwS0FnSUNBZ0lDQThEK0V2d1VnQUFzTHFBTURBbndEZndGK0lBQzlJZ2hDSUlpbklnVkIrUC8vL3dkeFFhaW9sdjhEU1NJR1JRUkFSQmd0UkZUN0llay9JQUFnQUpvZ0NFSUFXU0lIRzZGRUIxd1VNeWFtZ1R3Z0FTQUJtaUFIRzZHZ0lRQWdCVUVmZGlFRlJBQUFBQUFBQUFBQUlRRUxJQUFnQUNBQUlBQ2lJZ1NpSWdORVkxVlZWVlZWMVQraUlBUWdBeUFFSUFTaUlnTWdBeUFESUFNZ0EwUnpVMkRieTNYenZxSkVwcEkzb0loK0ZEK2dva1FCWmZMeTJFUkRQNkNpUkNnRFZza2liVzAvb0tKRU45WUdoUFJrbGorZ29rUjYvaEFSRVJIQlA2QWdCQ0FESUFNZ0F5QURJQU5FMUhxL2RIQXErejZpUk9tbjhESVB1Qkkvb0tKRWFCQ05HdmNtTUQrZ29rUVZnK0QreU50WFA2Q2lSSk9FYnVuakpvSS9vS0pFL2tHekc3cWhxeitnb3FDaUlBR2dvaUFCb0tBaUE2QWhBU0FHUlFSQVFRRWdBa0VCZEd1M0lnUWdBQ0FESUFFZ0FhSWdBU0FFb0tPaG9DSUFJQUNnb1NJQW1pQUFJQVViRHdzZ0FnUjhSQUFBQUFBQUFQQy9JQUdqSWdRZ0JMMUNnSUNBZ0hDRHZ5SUVJQU1nQWIxQ2dJQ0FnSENEdnlJQklBQ2hvYUlnQkNBQm9rUUFBQUFBQUFEd1A2Q2dvaUFFb0FVZ0FRc0w5d01DQkg4QmZnSkFBa0FDUUFKQUFrQUNRQUpBQW44Z0FDZ0NCQ0lCSUFBb0FtaEhCRUFnQUNBQlFRRnFOZ0lFSUFFdEFBQU1BUXNnQUJCVkN5SUNRU3RyRGdNQUFRQUJDd0ovSUFBb0FnUWlBU0FBS0FKb1J3UkFJQUFnQVVFQmFqWUNCQ0FCTFFBQURBRUxJQUFRVlFzaUFVRTZhMEYxU3dSQUlBSkJMVVloQkNBQklRSU1BZ3NnQUNrRGNFSUFXUTBDREFVTElBSkJPbXRCZGtrTkFnc2dBa0V3YXlJRFFRcEpCRUJCQUNFQkEwQWdBaUFCUVFwc2FpRUJJQUZCTUdzaUFVSE1tYlBtQUVnQ2Z5QUFLQUlFSWdJZ0FDZ0NhRWNFUUNBQUlBSkJBV28yQWdRZ0FpMEFBQXdCQ3lBQUVGVUxJZ0pCTUdzaUEwRUpUWEVOQUFzZ0Fhd2hCUXNDUUNBRFFRcFBEUUFEUUNBQ3JTQUZRZ3ArZkVJd2ZTRUZBbjhnQUNnQ0JDSUJJQUFvQW1oSEJFQWdBQ0FCUVFGcU5nSUVJQUV0QUFBTUFRc2dBQkJWQ3lJQ1FUQnJJZ05CQ1VzTkFTQUZRcTZQaGRmSHd1dWpBVk1OQUFzTElBTkJDa2tFUUFOQUFuOGdBQ2dDQkNJQklBQW9BbWhIQkVBZ0FDQUJRUUZxTmdJRUlBRXRBQUFNQVFzZ0FCQlZDMEV3YTBFS1NRMEFDd3NnQUNrRGNFSUFXUVJBSUFBZ0FDZ0NCRUVCYXpZQ0JBdENBQ0FGZlNBRklBUWJEd3NnQUNBQUtBSUVRUUZyTmdJRURBRUxJQUFwQTNCQ0FGTU5BUXNnQUNBQUtBSUVRUUZyTmdJRUMwS0FnSUNBZ0lDQWdJQi9DNzhDQVFGL0l3QkIwQUJySWdRa0FBSkFJQU5CZ0lBQlRnUkFJQVJCSUdvZ0FTQUNRZ0JDZ0lDQWdJQ0FnUC8vQUJBdUlBUXBBeWdoQWlBRUtRTWdJUUVnQTBILy93RkpCRUFnQTBILy93QnJJUU1NQWdzZ0JFRVFhaUFCSUFKQ0FFS0FnSUNBZ0lDQS8vOEFFQzVCL2Y4Q0lBTWdBMEg5L3dKT0cwSCsvd0ZySVFNZ0JDa0RHQ0VDSUFRcEF4QWhBUXdCQ3lBRFFZR0FmMG9OQUNBRVFVQnJJQUVnQWtJQVFvQ0FnSUNBZ0lBNUVDNGdCQ2tEU0NFQ0lBUXBBMEFoQVNBRFFmU0Fma3NFUUNBRFFZMy9BR29oQXd3QkN5QUVRVEJxSUFFZ0FrSUFRb0NBZ0lDQWdJQTVFQzVCNklGOUlBTWdBMEhvZ1gxTUcwR2EvZ0ZxSVFNZ0JDa0RPQ0VDSUFRcEF6QWhBUXNnQkNBQklBSkNBQ0FEUWYvL0FHcXRRakNHRUM0Z0FDQUVLUU1JTndNSUlBQWdCQ2tEQURjREFDQUVRZEFBYWlRQUN6VUFJQUFnQVRjREFDQUFJQUpDLy8vLy8vLy9QNE1nQkVJd2lLZEJnSUFDY1NBQ1FqQ0lwMEgvL3dGeGNxMUNNSWFFTndNSUMwVUJBbndnQUNBQ0lBS2lJZ1E1QXdBZ0FTQUNJQUpFQUFBQUFnQUFvRUdpSWdNZ0FpQURvYUFpQXFFaUF5QURvaUFDSUFLZ0lBT2lJQUlnQXFJZ0JLR2dvRGtEQUF2YUFRRUVmeUFBS0FKVUlRTUNRQ0FBS0FJVUlnWWdBQ2dDSENJRlJ3UkFJQUFnQlRZQ0ZDQUFJQVVnQmlBRmF5SUZFSXNHSUFWSkRRRUxBa0FnQXlnQ0VFSGhBRWNFUUNBREtBSUFJUVFNQVFzZ0F5QURLQUlFSWdRMkFnQUxJQU1vQWd3Z0JHb2dBU0FES0FJSUlBUnJJZ0VnQWlBQklBSkpHeUlFRUI4YUlBTWdBeWdDQUNBRWFpSUJOZ0lBSUFFZ0F5Z0NCRTBOQUNBRElBRTJBZ1FDZnlBREtBSUlJZ0lnQVVzRVFDQURLQUlNSUFGcURBRUxJQUF0QUFCQkJIRkZJQUpGY2cwQklBSWdBeWdDREdwQkFXc0xRUUE2QUFBTElBUUxHQUVCZnlNQVFSQnJJZ0VnQURrRENDQUJLd01JSUFDaUN5Z0FJQUZFQUFBQUFBQUF3SCtpSUFCRWk5MGFGV1lnbHNDZ0VPc0Rva1FBQUFBQUFBREFmNklMRUFBZ0FFRWdSaUFBUVFsclFRVkpjZ3NXQUNBQVJRUkFRUUFQQzBHZzFBUWdBRFlDQUVGL0N5TUFBa0FDUUFKQUlBSU9BZ0FCQWdzZ0FDQUJjZzhMSUFBZ0FYTVBDeUFBSUFGeEM0NEVBUXAvSXdCQklHc2lDU1FBSUFBZ0FVY0VRQUpBQWtBQ1FDQUJLQUlNUlFSQUFrQUNRQ0FCS0FJSVFmNy8vLzhIYXc0Q0FBTUJDeUFCS0FJRURRSUxJQUFnQVJCRUdnd0RDeUFCS0FJRURRQWdBU2dDQUNFRklBQWdBa0VCZEVIREFHb2lERUVHZGlJSUVFRU5BQ0FGS0FJQVFRQWdDRUVEZENJRUlBVW9BZ1FSQVFBaUJrVU5BQ0FFSUFaQkFDQUlRUUYwSWdjZ0J5QUJLQUlNSWdRZ0JDQUhTaHNpQzJ0QkFuUVFLeUlHYWlBTFFRSjBJZ1JySUFFb0FoQWdBU2dDREVFQ2RHb2dCR3NnQkJBZkdpQUJMUUFJUVFGeEJFQWdCaUFHSUFkQkFCQ1NCaUVLQ3lBQUtBSVFJUTBnQ1NFRUFrQWdERUdBQ0U4RVFDQUZLQUlBUVFBZ0IwSDgvLzgvY1VFRWFpQUZLQUlFRVFFQUlnUkZEUUVMSUFVZ0RTQUdJQWdnQkNBR0lBaEJBblJxRUpNR0lRY2dCQ0FKUndSQUlBVW9BZ0FnQkVFQUlBVW9BZ1FSQVFBYUN5QUhSUTBDQ3lBRktBSUFJQVpCQUNBRktBSUVFUUVBR2dzZ0FCQTFEQUVMQWtBQ1FDQUtSUVJBSUFZZ0NFRUJhaENvQXlFRUlBVW9BZ0FnQmtFQUlBVW9BZ1FSQVFBYUlBUU5BU0FCS0FJUUlBRW9BZ3dnQzJzUXFBTU5BUXdDQ3lBRktBSUFJQVpCQUNBRktBSUVFUUVBR2dzZ0FDZ0NFQ0lFSUFRb0FnQkJBWEkyQWdBTElBQkJBRFlDQkNBQUlBRW9BZ2hCQVdwQkFYVTJBZ2dnQUNBQ0lBTVF6Z0VhQ3lBSlFTQnFKQUFQQzBIWS9RQkIxUHdBUWRNUVFZNG5FQUFBQ3p3QkFYOERRQ0FDUVFCTVJRUkFJQUFnQWtFQmF5SUNRUUowSWdScUlBTkJIM1FnQVNBRWFpZ0NBQ0lEUVFGMmNqWUNBQXdCQ3dzZ0EwRUJjUXVlQkFJTWZ3SitJd0JCRUdzaUNDUUFBa0FDUUNBRFFRRkdCRUFnQWlnQ0FDRUFJQWhCREdvZ0FpZ0NCQkNVQmlFRElBQkIvLzhEY2EwZ0FFRVFkcTBnQ0RVQ0RFSVFob1FpRWlBU0lBTkJBWFN0SWhPQUloSWdFMzU5UWhDR2hDRVRJQU5CRUhRaEFDQVNweUlEUVlDQUJFOEVmaUFUUW9DQWdJQVFmUVVnRXlBU0lCSitRdjMvLy84UGczMExJUklnQUNBRGFpRUdJQkpDQUZNRVFDQVNJQVpCQVdzaUJxMUNBWVo4UWdGOElSSUxJQUVnQmpZQ0FDQUNJQkkrQWdBZ0VrSWdpS2NoQmd3QkMwRi9JUTBnQUNBQklBTkJBWFlpQjBFQ2RHb2lDU0FDSUFOQmZuRWlEMEVDZEdvaURDQURJQWRySWdvZ0JDQUlRUWhxRUpNR0RRRWdDQ2dDQ0NJTEJFQWdEQ0FNSUFrZ0NoQ1lBaG9MSUFBZ0JDQUNJQWRCQW5RaUJtb2lEaUFESUFrZ0NoQ2xCQTBCSUFRZ0Jtb29BZ0FoRUVFQUlRWURRQ0FHSUFkR1JRUkFJQUVnQmtFQ2RDSVJhaUFFSUJGcUtBSUFOZ0lBSUFaQkFXb2hCZ3dCQ3dzZ0N5QVFhaUlMUVFGMklRWWdBU0FCSUFjZ0MwRUJjUkNTQmdSL0lBNGdEaUFKSUFvUXFnUUZRUUFMSVFRZ0NTQUdJQW9RcVFNYUlBUWdEQ0FMUVFGTkJIOGdBQ0FDSUFOQkFuUnFJZ0FnQVNBSElBRWdCeERYQWcwQ0lBSWdBaUFBSUE4UW1BSUZJQVlMSUFOQkFYRVEyQUpySWdaQkFFNE5BQ0FCUVFFZ0F4RFlBaG9nQWlBQklBTkJBaENjQmlBR2FpQUNRUUVnQXhDcEEyb2hCZ3NnQlNBR05nSUFRUUFoRFFzZ0NFRVFhaVFBSUEwTG1BRUJBbjhnQUNBQlFmOEJjU0FCUVFoMlFmOEJjU0FCUVJkMlFmNERjVUhncEFScUx3RUFJZ0JCQVhRaUFrRi9jMEVBSUFGQkVIWWdBQ0FBYkdzaUFTQUNTeUlDR3lBQmFrRUlkSElpQVNBQUlBSnFJZ0pCQVhRaUEyNGlBQ0FBYkdzZ0FTQUFJQU5zYTBFSWRHb2lBVUVmZFNBQ1FRaDBJQUJxSWdCQkFXc2lBa0VCZEVFQmNuRWdBV28yQWdBZ0FpQUFJQUZCQUVnYkN6a0JBWDhqQUVFUWF5SUJKQUFnQUFSL0lBRkJER29nQUNBQVp5SUFRUjV4ZEJDVUJpQUFRUUYyZGdWQkFBc2hBQ0FCUVJCcUpBQWdBQXZlQ0FFUWZ5QUNJQUVnQVNBQ0VOTUJJZ2xCQUVnaUJ4c2hDQUpBSUFrZ0FpZ0NCQ0FGY3lJRklBRW9BZ1FpQm5NaURrVnlEUUFnQ0NnQ0NFSDkvLy8vQjBvTkFDQUFJQVJCQjNGQkFrWVFpUUZCQUE4TElBVWdCaUFIR3lFRklBRWdBaUFIR3lFSkFrQUNRQUpBSUFnb0Fnd2lCZ1JBSUFrb0Fnd2lDdzBCQ3lBSUtBSUlJZ0ZCL3YvLy93ZE9CRUFnQVVILy8vLy9CMFlFUUNBQUVEVkJBQThMSUE1RklBa29BZ2hCL3YvLy93ZEhja1VFUUNBQUVEVkJBUThMSUFBZ0JSQ01BVUVBRHdzZ0FDQUlFRVFhSUFBZ0JUWUNCQXdCQ3lBQUlBVTJBZ1FnQUNBSUtBSUlOZ0lJSUFnb0FnZ2lBU0FKS0FJSUlnZHJJUW9DUUNBT1JRUkFRUUFoQlF3QkMwRUJJUVVnQ2tFQlNnMEFJQVpCQlhSQkFXc2hBaUFMSUFaclFRVjBJQUZxSUFkclFSOXJJUThnQ1NnQ0VDRVFRUUFoQlFOQVFRQWhBU0FDUVFWMUlnY2dCa2tFUUNBSUtBSVFJQWRCQW5ScUtBSUFJUUVMSUJBZ0N5QUNJQTlxRUdnaUJ5QUJSZ1JBSUFKQklHc2hBaUFGUVNCcUlRVU1BUXNMSUFFZ0IzTWlEV2NpRVVFQmFpRU1Ba0FnRFVFQ1NRUkFJQVVnREdvaEJRd0JDeUFGSUFGQmYwRWZJQkZySWcxMFFYOXpJZ1Z4WnlJQklBVWdCMEYvYzNGbklnVWdBU0FGU0JzaUFXb2hCU0FCSUF4cklBMUhEUUVMQTBBZ0JTRUhRUUFoQVNBQ1FTQnJJZ0pCQlhVaUJTQUdTUVJBSUFnb0FoQWdCVUVDZEdvb0FnQWhBUXNnRUNBTElBSWdEMm9RYUNFTUlBRkZCRUFnQjBFZ2FpRUZJQXhCZjBZTkFRc0xJQUZuSWdFZ0RFRi9jMmNpQWlBQklBSklHeUFIYWlFRkN5QUFJQU1nQldwQklXcEJCWFlpQWlBR0lBcEJIMnBCSUcwZ0Myb2lBU0FCSUFaSUd5SUJJQUVnQWtvYklnY1FRUTBCUVFBZ0NDZ0NEQ0lUSUFkcklnOXJJZ0pCSDNVZ0FuRWhGQ0FISUFGcklRSkJBQ0FPYXlFUUlBa29BZ3dpREVFRmRDRU5RUUFnRENBSGEwRUZkQ0FLYWlJUmEwRUZkU0VTSUE0aEFVRUFJUXNEUUNBQ1FRQk9CRUFDUUVFQUlRSURRQ0FDSUFkR0RRRkJBQ0VGSUFBb0FoQWdBa0VDZEdvZ0FTQUNJQTlxSWdZZ0NDZ0NERWtFZnlBSUtBSVFJQVpCQW5ScUtBSUFCVUVBQ3lBSktBSVFJQWtvQWd3Z0FrRUZkQ0FSYWhCb0lCQnpJZ1ZxSWdGcUlnWTJBZ0FnQVNBRlNTQUJJQVpMY2lFQklBSkJBV29oQWd3QUN3QUxCU0FDUVFWMElCRnFJUVlDUUFKL0FrQWdBaUFQYWlJS1FRQk9JQW9nRTBseFJRUkFJQVpCWVVnaUZVVUVRRUVBSVFVZ0JpQU5TQTBDQ3lBS1FSOTFJQlJ4SWdJZ0VpQUNJQkpJR3lBQ0lCVWJJUUpCQUNFRlFRQWhDZ3dEQ3lBSUtBSVFJQXBCQW5ScUtBSUFJUVZCQUNBR1FXRklJQVlnRFU1eURRRWFDeUFKS0FJUUlBd2dCaEJvQ3lFS0lBSkJBV29oQWdzZ0NpQVFjeUlHSUFWcUlnVWdCa2tnQlNBQklBVnFJZ1ZMY2lFQklBVWdDM0loQ3d3QkN3c2dBQ2dDRUNJQ0lBSW9BZ0FnQzBFQVIzSTJBZ0FnRGlBQlJYSU5BQ0FBSUFkQkFXb1FRUTBCSUFBb0FoQWdCMEVDZEdwQkFUWUNBQ0FBSUFBb0FnaEJJR28yQWdnTElBQWdBeUFFRUxNQ0R3c2dBQkExUVNBTDJnRUJBbjRDUUFKQUlBSkZCRUFnQVVLQWdJQ0FjSU1oQlNBQVFTOFFMU0VFREFFTEFuNGdBVUtBZ0lDQWNJTWlCVUtBZ0lDQU1GSWdBeWtEQUNJRVFvQ0FnSUJ3ZzBLQWdJQ0FnSDlTY2tVRVFDQUFRYnVVQVNBQUlBQW9BaEFnQktjUXdRSVFMVUd0bEFFUXZnRU1BUXNnQUNBRUVDZ0xJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BUXNnQlVLQWdJQ0FNRkVOQUNBQUlBRkJCUkJsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRklFUUNBQUlBRWdCQkRiQVNBQUlBRkJNQ0FFcHlrQ0JFTC8vLy8vQjROQkFCQVpHZ3NnQVNFRUN5QUVDMVVCQVg0Z0FDQURyU0FFclNBQklBSkJIM1VpQUd1dGZpQUFJQU54SUFKcXJYeENJSWluSUFGcUlnQ3RRbitGZmlBQ3JTQUJyVUlnaG9SOElnVkNJSWluSWdFZ0EzRWdCYWRxTmdJQUlBQWdBV3BCQVdvTHRnVUJDMzhDUUFKQUFrQUNRQUpBQWtBZ0EwRUNUUVJBSUFBb0FnQkJBQ0FEUVFGMElnZEJBWElpQ0VFQ2RDQUFLQUlFRVFFQUlRWWdBQ2dDQUVFQUlBTkJBblJCQ0dvZ0FDZ0NCQkVCQUNJRlJTQUdSWElOQWdOQUlBUWdCMFpGQkVBZ0JpQUVRUUowYWtFQU5nSUFJQVJCQVdvaEJBd0JDd3NnQmlBSFFRSjBha0VCTmdJQUlBQWdCU0FHSUFnZ0FpQURFS1VFRFFJZ0EwRUJhaUVDUVFBaEJBTkFJQUlnQkVaRkJFQWdBU0FFUVFKMElnZHFJQVVnQjJvb0FnQTJBZ0FnQkVFQmFpRUVEQUVMQ3lBR0lBTVFxQU1OQVNBQlFRRWdBaERZQWhvTUFRc2dBQ2dDQUVFQUlBTWdBMEVCYTBFQmRpSUhheUlJSUFOcUlnUkJBV29pREVFQ2RDQUFLQUlFRVFFQUlnVkZJQUFvQWdCQkFDQUlRUXhzUVFocUlBQW9BZ1FSQVFBaUJrVnlEUUVnQUNBQklBZEJBblFpQ1dvaUNpQUNJQWxxSUFnUW1RWU5BaUFBSUFVZ0FpQURJQW9nQ0VFQmFpSUpFTmNDRFFJZ0JTQURRUUowYWlFTElBVWdCRUVDZEdvaERRTkFJQTBvQWdBRVFDQUtRUUVnQ1JEWUFob2dDeUFGSUFVZ0FpQURFSmdDSUFrUTJBSWFEQUVMQ3lBTVFRQWdERUVBU2hzaEEwRUFJUUpCQUNFRUEwQWdBeUFFUmtVRVFDQUZJQVJCQW5ScUlndEJBQ0FMS0FJQUlndHJJZzRnQW1zMkFnQWdDMEVBUnlBQ0lBNUxjaUVDSUFSQkFXb2hCQXdCQ3dzZ0RTQU5LQUlBUVFGcU5nSUFJQUFnQmlBRklBZEJBblJxSUF3Z0Iyc2dDaUFKRU5jQ0RRSWdDRUVCZENJQ0lBZHJJUU5CQUNFRUEwQWdCQ0FIUmtVRVFDQUJJQVJCQW5ScUlBWWdBeUFFYWtFQ2RHb29BZ0EyQWdBZ0JFRUJhaUVFREFFTEN5QUtJQW9nQmlBQ1FRSjBhaUFJRUtvRUdndEJBQ0VFSUFBb0FnQWdCVUVBSUFBb0FnUVJBUUFhREFNTElBVkZEUUVMSUFBb0FnQWdCVUVBSUFBb0FnUVJBUUFhQzBGL0lRUWdCa1VOQVFzZ0FDZ0NBQ0FHUVFBZ0FDZ0NCQkVCQUJvTElBUUxid0lEZndGK0lBS3RRaUNHSUFPdGdFTC8vLy8vRDRNaENFRUJJUVVEUUNBQklBWkdSUVJBSUFBZ0JrRUNkR29pQnlBSEtBSUFJQVVnQXlBRUVOWUNOZ0lBSUFJZ0JXd2dDQ0FGclg1Q0lJaW5JQU5zYXlJRklBTkJBQ0FESUFWTkcyc2hCU0FHUVFGcUlRWU1BUXNMQzE4QkFuOGdBa0VmY1NFRUlBRWdBa0VGZFNJQ1N3UkFJQUFnQWtFQ2RHb2lCU0FGS0FJQUlBTWdCSFJ5TmdJQUN3SkFJQVJGRFFBZ0FTQUNRUUZxSWdGTkRRQWdBQ0FCUVFKMGFpSUFJQUFvQWdBZ0EwRWdJQVJyZG5JMkFnQUxDMVFDQTM4Q2ZpQURyU0VIUVFBaEF3TkFJQUlnQTBaRkJFQWdBQ0FEUVFKMElnVnFJZ1lnQmpVQ0FDQUVyU0FCSUFWcU5RSUFJQWQrZkh3aUNENENBQ0FJUWlDSXB5RUVJQU5CQVdvaEF3d0JDd3NnQkF2VkFnSUpmd0YrUVg4aEJnSkFJQUFnQVNBRFFSTWdBMEVCZGlJSElBZEJFMDhiSUFOQkZFZ2JJZ2NnQXlBSGF5SUlRUUVnQjNRaUNVRUJJQWgwSWd4QkFDQUZFS2NFRFFBZ0FDQUNJQWNnQ0NBSklBeEJBQ0FGRUtjRURRQUNRQ0FESUFkSEJFQkJBQ0VHQTBBZ0JpQUpSZzBDSUFBZ0FTQUdJQWgwUVFKMElnTnFJQUlnQTJvZ0NDQUVJQVVRblFZYUlBWkJBV29oQmd3QUN3QUxJQUFnQlVHb0FXeHFJQVJCQTNScUlnUkJ6Qk5xTlFJQUlROGdCRUhJRTJvb0FnQWhEU0FGUVFKMElnWkJrS2tFYWlnQ0FDRUVJQUFnQm1vb0FnUWhEa0VBSVFZRFFDQUdJQU4yRFFFZ0FTQUdRUUowSWdwcUlnc2dDeWdDQUNJTElBUkJBQ0FFSUF0Tkcyc2dBaUFLYWlnQ0FDQUVJQTRRMWdJaUNpQU5iQ0FFSUFxdElBOStRaUNJcDJ4ck5nSUFJQVpCQVdvaEJnd0FDd0FMUVg5QkFDQUFJQUVnQnlBSUlBa2dERUVCSUFVUXB3UWJJUVlMSUFZTG9RRUNBMzhDZmlBRE5RSUFJUWdEUUNBQ0lBVkdSUVJBSUFBZ0JVRUNkQ0lIYWlBR3JTQUJJQWRxTlFJQUlBaCtmQ0lKUGdJQUlBVkJBV29oQlNBSlFpQ0lweUVHREFFTEN5QUFJQUpCQW5ScUlBWTJBZ0JCQVNBRUlBUkJBVTBiSVFSQkFTRUZBMEFnQkNBRlJrVUVRQ0FBSUFJZ0JXcEJBblJxSUFBZ0JVRUNkQ0lHYWlBQklBSWdBeUFHYWlnQ0FCQ2NCallDQUNBRlFRRnFJUVVNQVFzTEM1VVNBaHAvQW40Q1FDQUFLQUk0SWdvTkFDQUFLQUlBUVFCQnVCb2dBQ2dDQkJFQkFDSUtSUVJBUVg4UEN5QUtRUVJxUVFCQnRCb1FLeG9nQUNBS05nSTRJQW9nQURZQ0FBTkFJQWxCQlVZRVFFRUFJUWRCQUNFSUEwQWdCMEVFUmcwRElBZEJBV29pQnlFQUEwQWdBRUVGUmcwQklBb2dDRUVDZENJTmFrR1FHbW9nRFVIZ3FRUnFOUUlBUWlDR0lBQkJBblJCa0trRWFqVUNBSUErQWdBZ0FFRUJhaUVBSUFoQkFXb2hDQXdBQ3dBTEFBc2dDaUFKUVFKMElndHFRb0NBZ0lDQWdJQ0FJQ0FMUVpDcEJHb29BZ0FpRGEwaUlZQ25JZzQyQWdSQkFTRUlJQTFCQVdwQkFYWWhERUVBSVFkQkFDRUFBMEFnQUVFVlJ3UkFJQW9nQ1VHb0FXeHFJQUJCQTNScUloQkJ6Qk5xSUFpdFFpQ0dJQ0dBUGdJQUlCQkJ5Qk5xSUFnMkFnQWdBRUVCYWlFQUlBZ2dEQ0FOSUE0UTFnSWhDQXdCQ3dzRFFBSkFJQWRCQWtjRVFDQUhRUlJzSUF0cVFiQ3BCR29vQWdBaEFFRUFJUWdEUUNBSVFSUkdEUUlnQ2lBSlFhZ0JiR29nQjBIVUFHeHFRUlFnQ0d0QkFuUnFJZ3dnQUsxQ0lJWWdJWUErQXVBR0lBd2dBRFlDR0NBSVFRRnFJUWdnQUNBQUlBMGdEaERXQWlFQURBQUxBQXNnQ1VFQmFpRUpEQUlMSUFkQkFXb2hCd3dBQ3dBTEFBc2dBeUFGYWlJUVFRVjBJUTlCQkNFTFFRTWhDVUVBSVFkQkFDRU9RWDhoRFFOQUlBbEJCa2NFUUVIY0FFRUFJQWxyUVFKMFFkU2xCR29vQWdBaUVVRUVhMEVDYlNJQUlBQkIzQUJPR3lFQUEwQUNRRUVnSUFCQkFXc2lDQ0FQYWlBQWJpSU1RUUZyWjJ0QkFDQU1RUUpQR3lJTVFSUkxEUUFnRVNBTUlBQkJBWFJxVGdSQUlBeEJBV29nREhRZ0NXd2lDQ0FOVHcwQklBQWhCeUFNSVE0Z0NTRUxJQWdoRFF3QkN5QUlJZ0FOQVFzTElBbEJBV29oQ1F3QkN3c2dCd1JBQWtBQ1FBSkFJQVpCQTNGRkJFQWdCa0VFY1EwQklBRkJBQkJCR2d3QkN5QUdRUUp4RFFFTElBVWhEQ0FFSVEwTUFRc2dBeUVNSUFJaERTQUZJUU1nQkNFQ0N5QUtLQUlBSWdBb0FnQkJBQ0FMUVFRZ0RuUWlDR3dpRVNBQUtBSUVFUUVBSWdRRWZ5QUtJQVJCQVNBT2RDSUZJQUlnQTBFOUlBZEJQU0FPZENBUFR4c2dCeUFIUVQxS0d5SUNRUVVnQzJzaUJ5QUxFS2tFSUFaQkIzRkJBVVlFUUNBQlFRQVFRUm9MSUFaQkJIRWhBeUFLS0FJQUlnQW9BZ0FoQmlBQUtBSUVJUWtDUUFKQUFrQUNRQ0FPUVExTkJFQkJBQ0VBSUFaQkFDQVJJQWtSQVFBaUNVVU5BaUFLSUFrZ0JTQU5JQXdnQWlBSElBc1FxUVFnQXcwQklBRkJBQkJCR2d3QkMwRUFJUUFnQmtFQUlBZ2dDUkVCQUNJSlJRMEJDeUFMUVFBZ0MwRUFTaHNoQnlBT1FRNUpJUThDUUFOQUlBQWdCMFlOQVFKL0lBOUZCRUFnQ2lBSklBVWdEU0FNSUFJZ0FDQUxhMEVGYWlJSVFRRVFxUVFnQUNBT2RDRUdJQWtNQVFzZ0FDQUxhMEVGYWlFSUlBa2dBQ0FPZENJR1FRSjBhZ3NoRVNBQVFRRnFJUUFnQ2lBRUlBWkJBblJxSUJFZ0RpQU9JQWdRblFaRkRRQUxJQWtoQUF3QkN5QUREUUZCQUNFQUlBRkJBQkJCR2lBS0lBa1ExUUlnQVNBUUVFRkZEUUlMSUFvb0FnQWlBU2dDQUNBRVFRQWdBU2dDQkJFQkFCb2dDaUFBRU5VQ1FYOFBDeUFLSUFrUTFRSUxJQUVvQWhBaEF5QVFJUVVnQkNFSlFRQWhBRUVBSVJBakFFSGdBR3NpQnlRQUlBSWlCa0VmY1NFSVFYOGdBblJCZjNNaEJDQUxRUUZySWdFZ0MyeEJmbTFCQ21vaEZBTkFJQUJCQlVZRVFBSkFJQVpCQVdzaEFrRUFJQXRySVE5QkFDRUFBMEFnQUVFRlJ3UkFJQWRCSUdvZ0FFRUNkR3BCQURZQ0FDQUFRUUZxSVFBTUFRc0xJQU5CQUNBRlFRSjBFQ3NoRVVFQklBNTBJZ0FnQWlBRlFRVjBhaUFHYmlJRElBQWdBMGdiSWdCQkFDQUFRUUJLR3lFVklBUkJmeUFJR3lFV0lBSkJCWFlpQXlBQklBRWdBMGdiSVJjZ0FVRUFJQUZCQUVvYklSZ2dDMEVBSUF0QkFFb2JJUmtnQzBFQ2F5RU1JQU5CQVdvaERTQVBRUUowUWFTcEJHb2hEeUFVUVFKMElnQkI0S2tFYWlFVUlBQWdDbXBCa0JwcUlSb2dBVUVDZENJQUlBZEJJR29pQW1vaEd5QUhRVUJySUFCcUlSd2dBMEVDZENBQ2FpRWRJQWNnQVNBRGEwRUNkR29oSGlBSVFSOXpJUjhEUUVFQUlRQWdFQ0FWUmcwQkEwQWdBQ0FaUmdSQVFRQWhBRUVBSVFFRFFDQUFJQmhIQkVBZ0IwRkFheUFBUVFKMGFpRVNJQUJCQVdvaUFpRUFBMEFnQUNBTFRnUkFJQUloQUF3REJTQUFRUUowSWdRZ0IwRkFhMm9pRXlBRUlBOXFLQUlBSWdRZ0V5Z0NBQ0FTS0FJQWEyb2lFeUFVSUFGQkFuUWlJR29vQWdCc0lBUWdHaUFnYWpVQ0FDQVRyWDVDSUlpbmJHc2lFeUFFUVFBZ0JDQVRUUnRyTmdJQUlBQkJBV29oQUNBQlFRRnFJUUVNQVFzQUN3QUxDeUFISUJ3b0FnQTJBaUJCQVNFQklBd2hCQU5BSUFSQkFFb0VRQ0FQSUFSQkFuUWlBR28xQWdBaElTQUhRVUJySUFCcUtBSUFJUUpCQUNFQUEwQWdBQ0FCUndSQUlBZEJJR29nQUVFQ2RHb2lFaUFDclNBaElCSTFBZ0IrZkNJaVBnSUFJQUJCQVdvaEFDQWlRaUNJcHlFQ0RBRUxDeUFIUVNCcUlBRkJBblJxSUFJMkFnQWdCRUVCYXlFRUlBRkJBV29oQVF3QkN3c2dEeUFFUVFKMGFqVUNBQ0VoUVFBaEFDQUhLQUpBSVFJRFFDQUFJQUZKQkVBZ0FFRUNkQ0lFSUFkQklHcHFJaElnQkNBSGFqVUNBQ0FDclNBaElCSTFBZ0IrZkh3aUlqNENBQ0FpUWlDSXB5RUNJQUJCQVdvaEFBd0JDd3NnQVVFQ2RDSUFJQWRCSUdwcUlBQWdCMm9vQWdBZ0FtbzJBZ0FnQmlBUWJDRUNRUUFoQUFOQUlBQWdBMGNFUUNBUklBVWdBaUFIUVNCcUlBQkJBblJxS0FJQUVKc0dJQUJCQVdvaEFDQUNRU0JxSVFJTUFRc0xJQkVnQlNBQ0lCMG9BZ0FpQVNBV2NSQ2JCaUFOSVFJZ0F5RUFBa0FnQ0VVRVFBTkFJQUlnQzA0TkFpQUhJQUlnRFd0QkFuUnFJQWRCSUdvZ0FrRUNkR29vQWdBMkFnQWdBa0VCYWlFQ0RBQUxBQXNEUUNBQUlCZEhCRUFnQnlBQUlBTnJRUUowYWlBSFFTQnFJQUJCQVdvaUFFRUNkR29vQWdBaUFrRUJkQ0FmZENBQklBaDJjallDQUNBQ0lRRU1BUXNMSUI0Z0d5Z0NBQ0FJZGpZQ0FBc2dFRUVCYWlFUURBSUZJQUJCQW5RaUFTQUhRVUJyYWlBSklBQWdEblFnRUdwQkFuUnFLQUlBSWdJZ0FTQVBhaWdDQUNJQlFRQWdBU0FDVFJ0ck5nSUFJQUJCQVdvaEFBd0JDd0FMQUFzQUN3VWdCeUFBUVFKMGFrRUFOZ0lBSUFCQkFXb2hBQXdCQ3dzZ0IwSGdBR29rQUNBS0tBSUFJZ0FvQWdBZ0NVRUFJQUFvQWdRUkFRQWFRUUFGUVg4TER3c1FBUUFMU3dFQ2Z5QUFJQUZIQkVBZ0FDZ0NFQ0lDQkVBZ0FDZ0NBQ0lES0FJQUlBSkJBQ0FES0FJRUVRRUFHZ3NnQUNBQktRSUFOd0lBSUFBZ0FTZ0NFRFlDRUNBQUlBRXBBZ2czQWdnTEM2UUNBUWwvSUFGQkJuRWhCaUFCUVFKMlFRRnhJUXBCNE9BRElRTUNRQU5BSUFOQnJ2NERUdzBCSUFJaEJDQURMUUFBSWdKQkgzRWhCUUovSUFOQkFXb2dBa0VGZGlJQ1FRZEhEUUFhSUFNc0FBRWlDRUgvQVhFaEFpQUlRUUJPQkVBZ0FrRUhhaUVDSUFOQkFtb01BUXNnQXkwQUFpRUpJQWhCdjM5TkJFQWdBa0VJZENBSmNrSDUvZ0ZySVFJZ0EwRURhZ3dCQ3lBRExRQURJQUpCRUhSeUlBbEJDSFJ5UWZuKy9nVnJJUUlnQTBFRWFnc2hBeUFDSUFScVFRRnFJUUlDUUFKQUlBVkJIMFlFUUNBR1JRMERJQVpCQmtZTkFTQUVJQXBxSVFRRFFDQUNJQVJORFFRZ0FDQUVJQVJCQVdvUWZpRUZJQVJCQW1vaEJDQUZSUTBBQ3d3Q0N5QUJJQVYyUVFGeFJRMENDeUFBSUFRZ0FoQitSUTBCQ3d0QmZ5RUhDeUFIQzdVQkFRZC9JQUFvQWdBaEJTQUFLQUlJSVFJRFFDQUJRUUZxSWdNZ0JVNUZCRUFDUUNBQ0lBRkJBblJxS0FJQUlnY2dBaUFEUVFKMGFpZ0NBRVlFUUNBQklRTU1BUXNEUUFKQUlBRWlBMEVCYWlFR0lBRkJBMm9nQlU0TkFDQUNJQVpCQW5ScUtBSUFJQUlnQTBFQ2FpSUJRUUowYWlnQ0FFWU5BUXNMSUFJZ0JFRUNkR29pQVNBSE5nSUFJQUVnQWlBR1FRSjBhaWdDQURZQ0JDQUVRUUpxSVFRTElBTkJBbW9oQVF3QkN3c2dBQ0FFTmdJQUN6TUFJQUVDZnlBQ0tBSk1RUUJJQkVBZ0FDQUJJQUlRdWdRTUFRc2dBQ0FCSUFJUXVnUUxJZ0JHQkVBUEN5QUFJQUZ1R2d2UEFRRURmeUFCSUFJdkFBQWdBaTBBQWtFUWRFR0FnUHdBY1hKSkJFQWdBRUVBTmdJQVFRQVBDMEYvSVFVZ0FTQUNJQU5CQVdzaUJFRURiR29pQXk4QUFDQURMUUFDUVJCMGNra0VmMEVBSVFNRFFDQUVJQU5yUVFKSVJRUkFJQU1nQkdwQkFtMGlCU0FFSUFJZ0JVRURiR29pQkM4QUFDQUVMUUFDUVJCMFFZQ0EvQUJ4Y2lBQlN5SUdHeUVFSUFNZ0JTQUdHeUVEREFFTEN5QUFJQUlnQTBFRGJHb2lBQzhBQUNBQUxRQUNJZ0JCRUhSQmdJRDhBSEZ5TmdJQUlBTkJCWFFnQUVFRmRuSkJJR29GUVg4TEM5b2FBUXAvSUFBb0FnUWhEU0FBS0FJSUlRd0RRQ0FGSVFjZ0JFRUJhaUVJQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKL0FrQUNRQUpBSUFRdEFBQWlDVUVCYXc0Y0FnRUlDUVlIQlJVVkFBb0tDdzRNRFJFUkVoSWFHUVFFRHhBWUZ4WUxRUUVoQ1NBR1JRMGZJQWNQQzBFRklRb2dDQ2dBQUF3QkMwRURJUW9nQ0M4QUFBc2hDQ0FISUExUERSc0NRQ0FNUlFSQUlBZEJBV29oQlNBSExRQUFJUWtNQVFzZ0J5OEJBQ0lKUVlENEEzRkJnTEFEUnlBTVFRSkhjaUFOSUFkQkFtb2lCVTF5RFFBZ0JTOEJBQ0lMUVlENEEzRkJnTGdEUncwQUlBbEJDblJCZ1BnL2NTQUxRZjhIY1hKQmdJQUVhaUVKSUFkQkJHb2hCUXNnQkNBS2FpRUVJQUFvQWhnRWZ5QUpJQUFvQWh3UTNRRUZJQWtMSUFoR0RTQU1Hd3NnQUNBQklBSWdBeUFFS0FBQklBUkJCV29pQkdvZ0J5QUpRUlpyUVFBUXJnUkJBRTROSHd3WkN5QUlLQUFBSUFocVFRUnFJUVFNRndzZ0NDRUVJQVVnQUNnQ0FDSUhSZzBkSUFBb0FoUkZEUmdDUUNBTVJRUkFJQVZCQVdzdEFBQWhDZ3dCQ3lBRlFRSnJMd0VBSWdwQmdQZ0RjVUdBdUFOSElBeEJBa2R5RFFBZ0J5QUZRUVJySWdkTERRQWdCeThCQUNJSFFZRDRBM0ZCZ0xBRFJ3MEFJQXBCL3dkeElBZEIvd2R4UVFwMGNrR0FnQVJxSVFvTElBb1FyUVFOSFF3WUN5QUlJUVFnQnlBTklnVkdEUndnQUNnQ0ZFVU5Gd0pBSUF4RkJFQWdCeTBBQUNFSkRBRUxJQWN2QVFBaUNVR0ErQU54UVlDd0EwY2dERUVDUjNJZ0IwRUNhaUFOVDNJTkFDQUhMd0VDSWdWQmdQZ0RjVUdBdUFOSERRQWdDVUVLZEVHQStEOXhJQVZCL3dkeGNrR0FnQVJxSVFrTElBY2hCU0FKRUswRURSd01Gd3NnQnlBTlJnMFdBa0FnREVVRVFDQUhRUUZxSVFVZ0J5MEFBQ0VKREFFTElBY3ZBUUFpQ1VHQStBTnhRWUN3QTBjZ0RFRUNSM0lnRFNBSFFRSnFJZ1ZOY2cwQUlBVXZBUUFpQkVHQStBTnhRWUM0QTBjTkFDQUpRUXAwUVlENFAzRWdCRUgvQjNGeVFZQ0FCR29oQ1NBSFFRUnFJUVVMSUFnaEJDQUpFSzBFUlEwYkRCWUxJQWNnRFVZTkZTQU1SUVJBSUFkQkFXb2hCU0FJSVFRTUd3c2dCMEVDYWlFRklBZ2hCQ0FITHdFQVFZRDRBM0ZCZ0xBRFJ5QU1RUUpIY2cwYUlBVWdEVThOR2lBSFFRUnFJQVVnQnk4QkFrR0ErQU54UVlDNEEwWWJJUVVNR2dzZ0NDMEFBQ0lGSUFBb0FneFBEUWtnQ1NBRlFRRjBha0VDZENBQmFrRXNheUFITmdJQUlBUkJBbW9oQkF3U0N5QUVMUUFDSWdrZ0FDZ0NERThOQnlBRVFRTnFJUVFnQ0MwQUFDRUZBMEFnQlNBSlN3MFNJQUVnQlVFRGRHcENBRGNDQUNBRlFRRnFJUVVNQUFzQUN5QUNJQU5CQW5ScUlBUW9BQUUyQWdBZ0EwRUJhaUVESUFSQkJXb2hCQXdRQ3lBRFFRRnJJUU1NRGdzZ0JDZ0FBU0VGSUFOQkFuUWdBbXBCQkdzaUNDQUlLQUlBUVFGcklnZzJBZ0FnQkNBRlFRQWdDQnRxUVFWcUlRUU1EZ3NnQWlBRFFRSjBhaUFITmdJQUlBTkJBV29oQXd3TUN5QUVJQVFvQUFGQkFDQUNJQU5CQVdzaUEwRUNkR29vQWdBZ0IwY2Jha0VGYWlFRURBd0xRUUFoQzBFQUlRb2dBQ2dDQUNJRUlBZEhCRUFDUUNBTVJRUkFJQWRCQVdzdEFBQWhCUXdCQ3lBSFFRSnJMd0VBSWdWQmdQZ0RjVUdBdUFOSElBeEJBa2R5RFFBZ0JDQUhRUVJySWdSTERRQWdCQzhCQUNJRVFZRDRBM0ZCZ0xBRFJ3MEFJQVZCL3dkeElBUkIvd2R4UVFwMGNrR0FnQVJxSVFVTElBVVFyd01oQ2dzZ0J5QU5TUVJBQWtBZ0RFVUVRQ0FITFFBQUlRVU1BUXNnQnk4QkFDSUZRWUQ0QTNGQmdMQURSeUFNUVFKSGNpQUhRUUpxSUExUGNnMEFJQWN2QVFJaUJFR0ErQU54UVlDNEEwY05BQ0FGUVFwMFFZRDRQM0VnQkVIL0IzRnlRWUNBQkdvaEJRc2dCUkN2QXlFTEN5QUhJUVVnQ0NFRVFSSWdDV3NnQ2lBTGMwWU5FZ3dOQ3lBRUxRQUJJZ2dnQUNnQ0RFOE5EQ0FFUVFKcUlRUWdBU0FJUVFOMGFpSUhLQUlBSWdoRkRSRWdCeWdDQkNJS1JRMFJJQWxCRTBZTkNBTkFJQWdnQ2s4TkVpQUZJQUFvQWdBaURrWU5EUUpBQWtBQ1FDQU1CRUFnQ2tFQ2F5SUhMd0VBSWdsQmdQZ0RjVUdBdUFOSElBeEJBa2R5SUFjZ0NFMXlEUUVnQ2tFRWF5SUtMd0VBSWd0QmdQZ0RjVUdBc0FOSERRRWdDVUgvQjNFZ0MwSC9CM0ZCQ25SeVFZQ0FCR29oQ1F3Q0N5QUZRUUZySWdVdEFBQWhDeUFLUVFGcklnb3RBQUFoQ1F3Q0N5QUhJUW9MQWtBZ0JVRUNheUlITHdFQUlndEJnUGdEY1VHQXVBTkhJQXhCQWtkeUlBY2dEazF5RFFBZ0JVRUVheUlGTHdFQUlnNUJnUGdEY1VHQXNBTkhEUUFnQzBIL0IzRWdEa0gvQjNGQkNuUnlRWUNBQkdvaEN3d0JDeUFISVFVTElBQW9BaGdFZnlBSklBQW9BaHdpQnhEZEFTRUpJQXNnQnhEZEFRVWdDd3NnQ1VZTkFBc01EQXRCN2lsQndQd0FRZDBSUWM3WEFCQUFBQXRCMXlsQndQd0FRZFFSUWM3WEFCQUFBQXNnQkVFRmFpSUlJQWdnQkNnQUFXb2lDaUFKUVFsR0lnc2JJUVJCZnlFSklBQWdBU0FDSUFNZ0NpQUlJQXNiSUFkQkFFRUFFSzRFUVFCT0RRNE1Dd3NRQVFBTElBUkJFV29pRUNBRUtBQUJhaUVMSUFRb0FBa2hEeUFFS0FBRklRNUJBQ0VLQTBBQ1FBSkFJQUFnQVNBQ0lBTWdFQ0FGUVFFUXBRWWlDVUVCYWc0Q0RBRUFDeUFLUVFGcUlRb2dDU0VGSUE5Qi8vLy8vd2RHSUFvZ0QwbHlEUUVMQ3lBS0lBNUpEUWNnQ3lFRUlBb2dEazBORENBQUlBRWdBaUFESUFnZ0JVRURJQW9nRG1zUXJnUkJBRTROREF3R0N5QUhJQUFvQWdBaUNVWU5CaUFNUlFSQUlBZEJBV3NoQlNBSUlRUU1EQXNnQjBFQ2F5RUZJQWdoQkNBTVFRSkhEUXNnQlM4QkFFR0ErQU54UVlDNEEwY2dCU0FKVFhJTkN5QUhRUVJySWdjZ0JTQUhMd0VBUVlENEEzRkJnTEFEUmhzaEJRd0xDeUFISUExUERRVUNRQ0FNUlFSQUlBZEJBV29oQlNBSExRQUFJUWdNQVFzZ0J5OEJBQ0lJUVlENEEzRkJnTEFEUnlBTVFRSkhjaUFOSUFkQkFtb2lCVTF5RFFBZ0JTOEJBQ0lKUVlENEEzRkJnTGdEUncwQUlBaEJDblJCZ1BnL2NTQUpRZjhIY1hKQmdJQUVhaUVJSUFkQkJHb2hCUXNnQkM4QUFTRUhJQUFvQWhnRVFDQUlJQUFvQWh3UTNRRWhDQXNnQ0NBRVFRTnFJZ29vQUFCSkRRVkJBQ0VMSUFnZ0JDQUhRUUZySWdsQkEzUnFLQUFIU3cwRkEwQWdDU0FMU1EwR0lBb2dDU0FMYWtFQmRpSUVRUU4wYWlJT0tBQUFJQWhMQkVBZ0JFRUJheUVKREFFTElBNG9BQVFnQ0VrRVFDQUVRUUZxSVFzTUFRc0xJQW9nQjBFRGRHb2hCQXdLQ3lBSElBMVBEUVFDUUNBTVJRUkFJQWRCQVdvaEJTQUhMUUFBSVFnTUFRc2dCeThCQUNJSVFZRDRBM0ZCZ0xBRFJ5QU1RUUpIY2lBTklBZEJBbW9pQlUxeURRQWdCUzhCQUNJSlFZRDRBM0ZCZ0xnRFJ3MEFJQWhCQ25SQmdQZy9jU0FKUWY4SGNYSkJnSUFFYWlFSUlBZEJCR29oQlFzZ0JDOEFBU0VISUFBb0FoZ0VRQ0FJSUFBb0Fod1EzUUVoQ0FzZ0NDQUVRUU5xSWdvdkFBQkpEUVFDUUNBRUlBZEJBV3NpQ1VFQ2RHb3ZBQVVpQkVILy93TkdJQWhCLy84RFQzRU5BQ0FFSUFoSkRRVkJBQ0VFQTBBZ0JDQUpTdzBHSUFoQi8vOERjU0lPSUFvZ0JDQUpha0VCZGlJTFFRSjBhaUlQTHdBQVNRUkFJQXRCQVdzaENRd0JDeUFQTHdBQ0lBNVBEUUVnQzBFQmFpRUVEQUFMQUFzZ0NpQUhRUUowYWlFRURBa0xBMEFnQ0NBS1R3MEpJQVVnRFU4TkJBSi9BbjhDUUNBTUJFQWdDQzhCQUNJSlFZRDRBM0ZCZ0xBRFJ5QU1RUUpIY2lBSVFRSnFJZ2NnQ2s5eURRRWdCeThCQUNJTFFZRDRBM0ZCZ0xnRFJ3MEJJQWxCQ25SQmdQZy9jU0FMUWY4SGNYSkJnSUFFYWlFSklBaEJCR29NQWdzZ0JTMEFBQ0VMSUFndEFBQWhDU0FJUVFGcUlRZ2dCVUVCYWd3Q0N5QUhDeUVJQWtBZ0JTOEJBQ0lMUVlENEEzRkJnTEFEUnlBTVFRSkhjaUFGUVFKcUlnY2dEVTl5RFFBZ0J5OEJBQ0lPUVlENEEzRkJnTGdEUncwQUlBdEJDblJCZ1BnL2NTQU9RZjhIY1hKQmdJQUVhaUVMSUFWQkJHb01BUXNnQndzaEJTQUFLQUlZQkg4Z0NTQUFLQUljSWdjUTNRRWhDU0FMSUFjUTNRRUZJQXNMSUFsR0RRQUxEQU1MSUFnaEJBd0hDeUFISVFVTUJndEJmdzhMUVFBaENTQUdEUUVMSUFBb0FqQWhCUU5BSUFraEF5QUZSUVJBSUFNUEN3SkFBa0FDUUFKQUlBQW9BaWdnQlVFQmF5SUZJQUFvQWlSc2FpSUlMUUFBSWdRT0JBQUNBZ0VDQzBFQklRa2dBdzBDREFVTFFRRWhDU0FERFFFZ0FTQUlRUkJxSWdNZ0FDZ0NERUVEZEJBZkdpQUNJQU1nQUNnQ0RFRURkR29nQ0MwQUFTSURRUUowRUI4YUlBZ29BZ2doQlNBSUtBSU1JZ2tvQUF3aENrRUFJUVFEUUFKL0FrQWdCQ0FLUndSQUlBVkJBV3NnREVVTkFob2dCVUVDYXlFSElBeEJBa2NOQVNBSEx3RUFRWUQ0QTNGQmdMZ0RSdzBCSUFjZ0FDZ0NBRTBOQVNBRlFRUnJJZ1VnQnlBRkx3RUFRWUQ0QTNGQmdMQURSaHNNQWdzZ0NTZ0FBQ0VFSUFnZ0JUWUNDQ0FJSUFnb0FnUkJBV3NpQnpZQ0JDQUVJQWxxUVJCcUlRUWdCdzBKSUFBZ0FDZ0NNRUVCYXpZQ01Bd0pDeUFIQ3lFRklBUkJBV29oQkF3QUN3QUxJQU5CQUNBRVFRRkdHdzBFUVFBaENTQUREUUFnQkVFQ1JnMERDeUFBSUFVMkFqQU1BQXNBQ3lBSkR3c2dBU0FJUVJCcUlBQW9BZ3hCQTNRUUh4b0xJQWdvQWdnaEJTQUlLQUlNSVFRZ0FpQUlJQUFvQWd4QkEzUnFRUkJxSUFndEFBRWlBMEVDZEJBZkdpQUFJQUFvQWpCQkFXczJBakFNQUFzQUM0c0NBUWQvSUFGQkFuUkJ3UDREYWlnQ0FDSUNJQUZCQVhSQmtJQUVhaThCQUdvaENFRUFJUUVDUUFOQUlBSWdDRThOQVNBQ1FRRnFJUVlDUUFKQUlBSXRBQUFpQkVFL1RRUkFJQU1nQkVFRGRtcEJBV29oQWlBQkJFQWdBQ0FESUFJUWZnMERDeUFCUVFGeklRRWdCRUVIY1NBQ2FrRUJhaUVGREFFTEFuOGdBeUFFYWtIL0FHc2dCTUJCQUVnTkFCb2dCaTBBQUNFRklBUkIzd0JOQkVBZ0FrRUNhaUVHSUFNZ0JFRUlkR29nQldwQi8vOEFhd3dCQ3lBQ1FRTnFJUVlnQWkwQUFpQURJQVJCRUhScUlBVkJDSFJxYWtILy8vOENhd3NoQlNBRElRSUxJQUVFUUNBQUlBSWdCUkIrRFFFTElBRkJBWE1oQVNBR0lRSWdCU0VEREFFTEMwRi9JUWNMSUFjTE9BQkJzTlFDSUFFUXJ3UWlBVUVBU0FSQVFYNFBDeUFBSUFGQkhVMEVmMElCSUFHdGhxY0ZJQUZCQW5SQjJOZ0NhaWdDQUFzUW9RWUxOUUVCZnlNQVFSQnJJZ01rQUNBRElBRTJBZ2dnQXlBQ1FRRnFOZ0lNSUFBZ0EwRUlha0VDRUxFRUlRQWdBMEVRYWlRQUlBQUxsd0lCQTM4Z0FTZ0NBQ0lDUWY3L0IwOEVRQ0FBUVlZN1FRQVFPa0YvRHdzQ1FDQUNRUUZOQkVBZ0FFRUNRWDhRdUFFYURBRUxJQUVvQWdnZ0FrRUNkR29pQkVFRWF5Z0NBQ0lEUVg5R0JFQWdCRUVJYXlnQ0FDRURDeUFDUVFGMklRSWdBMEgvL3dOTkJFQWdBRUVWSUFJUXNnUkJBQ0VDQTBBZ0FpQUJLQUlBVGcwQ0lBQWdBa0VDZENJRElBRW9BZ2hxTHdFQUVDb2dBRUYvSUFFb0FnZ2dBMEVFY21vb0FnQkJBV3NpQXlBRFFYNUdHMEgvL3dOeEVDb2dBa0VDYWlFQ0RBQUxBQXNnQUVFV0lBSVFzZ1JCQUNFQ0EwQWdBaUFCS0FJQVRnMEJJQUFnQWtFQ2RDSURJQUVvQWdocUtBSUFFQjBnQUNBQktBSUlJQU5CQkhKcUtBSUFRUUZyRUIwZ0FrRUNhaUVDREFBTEFBdEJBQXNtQVFGL0lBQW9BamdpQVVFQVNBUkFJQUFnQUNBQVFUeHFRUUFRcXdZaUFUWUNPQXNnQVF2Z0FnRUZmeU1BUVpBQmF5SUVKQUFnQVVFQU5nSUFJQUFvQWlBaEEwRUJJUVlEUUNBRUlBTTJBb3dCQWtBQ1FBSkFJQUFvQWh3aUJ5QURUUVJBSUFZaEJRd0JDd0pBQWtBQ1FBSkFJQU10QUFBaUJVSGJBR3NPQWdFQ0FBc2dCVUVvUncwRklBTXRBQUZCUDBjTkFpQURMUUFDUVR4SERRVWdBeTBBQXlJRlFTRkdJQVZCUFVaeURRVWdBVUVCTmdJQUFrQWdBa1VOQUNBRUlBTkJBMm8yQW93QklBUWdCRUdNQVdvZ0FDZ0NLQkMxQkEwQUlBUWdBaER5QTBVTkJRc2dCa0VCYWlFRklBWkIvUUZLRFFNZ0JDZ0NqQUVoQXlBRklRWU1CUXNEUUNBRUlBTWlCVUVCYWlJRE5nS01BU0FESUFkUERRVUNRQ0FETFFBQVFkd0FhdzRDQUFZQkN5QUVJQVZCQW1vaUF6WUNqQUVNQUFzQUN5QUVJQU5CQVdvaUF6WUNqQUVNQXdzZ0JrSDlBVW9oQnlBR1FRRnFJZ1VoQmlBSFJRMENDMEYvSUFVZ0Foc2hCZ3NnQkVHUUFXb2tBQ0FHRHdzZ0EwRUJhaUVEREFBTEFBdFZBUU4vSUFBZ0FXb2hCQ0FDRUQ4aEEwRUJJUUVEUUFKQUlBQWdCRThFUUVGL0lRRU1BUXNnQXlBQUVEOGlCVVlFUUNBQ0lBQWdBeEJoUlEwQkN5QUJRUUZxSVFFZ0FDQUZha0VCYWlFQURBRUxDeUFCQytRaEFSZC9Jd0JCNEFKcklnSWtBRUVNSUFGcklSWWdBVUVMYWlFWElBQkJ4QUJxSVJJZ0FVRVRhaUVZSUFCQjNBQnFJUThnQUNnQ0JDRVRBa0FDUUFKQUEwQWdBQ2dDR0NJRElBQW9BaHhQRFFNZ0F5MEFBQ0lFUVNsR0lBUkIvQUJHY2cwRElBQW9BZ1FoRUNBQ0lBTTJBaHdDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDZndKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBUkIyd0JyRGdRQ0FRTUlBQXNDUUFKQUFrQUNRQUpBSUFSQkpHc09Dd0VKQ1FrRUNSa1pDUWtDQUFzZ0JFSDdBR3NPQXdJSUJnY0xJQUlnQTBFQmFpSUlOZ0ljSUFCQkJoQVJEQlFMSUFJZ0EwRUJhallDSENBQUtBSTBJUW9nQVVVTkNDQUFRUnNRRVNBQVFRUkJBeUFBS0FJd0d4QVJEQXdMSUFBb0FpZ0VRQ0FBUWRVL1FRQVFPZ3dYQ3lBRExRQUJRVHByUVhaSkRRVWdBaUFEUVFGcU5nSWdJQUpCSUdwQkFSRGNBaG9DUUNBQ0tBSWdJZ010QUFBaUJVRXNSdzBBSUFJZ0EwRUJhallDSUNBRExRQUJJZ1ZCT210QmRra05BQ0FDUVNCcVFRRVEzQUlhSUFJb0FpQXRBQUFoQlFzZ0JVSC9BWEZCL1FCSERRVU1GUXNDUUNBRExRQUJRVDlHQkVCQkF5RUhRUUFoQ2tFQUlRVkJBQ0VHQWtBQ1FBSkFBa0FnQXkwQUFpSUVRVHByRGdRQUF3RVNBZ3NnQUNBRFFRTnFOZ0lZSUFBb0FqUWhDaUFBSUFFUThnSU5HaUFDSUFBb0FoZzJBaHdnRUNFRElBQWdBa0VjYWtFcEVMQURSUTBTREJvTFFRRWhCVUVFSVFjZ0F5MEFBeUlFUVQxR0JFQkJBU0VHREJFTFFRRWhCaUFFUVNGR0RSQWdBaUFEUVFOcU5nSWNJQThnQWtFY2FpQUFLQUlvRUxVRUJFQWdBRUdjNXdCQkFCQTZEQm9MSUJJb0FnQWdBQ2dDU0NBUEVLd0dRUUJLQkVBZ0FFR0g1d0JCQUJBNkRCb0xJQklnRHlBUEVEOUJBV29RY2lBQVFRRTJBandNQXdzZ0JFRWhSZzBQQ3lBQVFjSEpBRUVBRURvTUZ3c2dBaUFEUVFGcU5nSWNJQkpCQUJBUkN5QUFLQUkwSWdwQi93Rk9CRUFnQUVHcU9VRUFFRG9NRmdzZ0FDQUtRUUZxTmdJMElBQW9BZ1FoQXlBQUlCY2dDaENwQWlBQUlBSW9BaHcyQWhnZ0FDQUJFUElDRFJVZ0FpQUFLQUlZTmdJY0lBQWdGaUFLRUtrQ0lBQWdBa0VjYWtFcEVMQURSUTBOREJVTEFrQUNRQUpBQWtBQ1FBSkFBa0FnQXkwQUFTSUVRVEJyRGhNREJBUUVCQVFFQkFRRUNnb0tDZ29LQ2dvQkFBc2dCRUhyQUVZTkFTQUVRZUlBUncwSkN5QUFRUkZCRWlBRVFlSUFSaHNRRVNBRFFRSnFJUWdNRWdzQ1FDQURMUUFDUVR4SEJFQkI4dVlBSVFVZ0FDZ0NLQTBCSUFBUXRBUU5BUXdKQ3lBQ0lBTkJBMm8yQWlBZ0R5QUNRU0JxSUFBb0FpZ1F0UVFFUUVHYzV3QWhCU0FBS0FJb0RRRWdBQkMwQkEwQkRBa0xJQklvQWdBZ0FDZ0NTQ0FQRUt3R0lnUkJBRTROQXlBQUlBSkJ3QUpxSUE4UXF3WWlCRUVBVGcwRFFmdjVBQ0VGSUFBb0FpZ05BQ0FBRUxRRVJRMElDeUFBSUFWQkFCQTZEQmdMSUFJZ0EwRUNhallDSENBRExRQUNJUVlnQUNnQ0tBUkFRUUFoQkNBR1FUcHJRWFpKRFFnZ0FFSEl6UUJCQUJBNkRCZ0xRUUFoQkNBR1FmZ0JjVUV3UncwSElBSWdBMEVEYWpZQ0hDQUdRVEJySVFRZ0F5MEFBeUlHUWZnQmNVRXdSdzBISUFJZ0EwRUVhallDSENBRVFRTjBJQVpxUVRCcklRUU1Cd3NnQWlBRFFRRnFJZ1UyQWh3Z0FrRWNha0VBRU53Q0lnUkJBRTRFUUNBRUlBQW9BalJJRFFJZ0FCQ3FCaUFFU2cwQ0N5QUFLQUlvUlFSQUlBSWdCVFlDSENBRkxRQUFJZ1JCTjAwRVFFRUFJUVlnQkVFelRRUkFJQUlnQTBFQ2FpSUZOZ0ljSUFSQk1Hc2hCaUFETFFBQ0lRUUxJQVJCK0FGeFFUQkhCRUFnQmlFRURBa0xJQUlnQlVFQmFqWUNIQ0FFUWY4QmNTQUdRUU4wYWtFd2F5RUVJQVV0QUFFaUEwSDRBWEZCTUVjTkNDQUNJQVZCQW1vMkFod2dCRUVEZENBRGFrRXdheUVFREFnTElBSWdBMEVDYWpZQ0hBd0hDeUFBUWZYTkFFRUFFRG9NRmdzZ0FpQUNLQUlnTmdJY0N5QUFLQUkwSVFvZ0FDZ0NCQ0VESUFBZ0dDQUVFS2tDREF3TElBQW9BalFoQ2lBQkJFQWdBRUViRUJFTElBQW9Ba0FoQkNBQ1FUUTJBdEFDSUFJZ0JEWUN6QUlnQWtFQU5nTElBaUFDUWdBM0FzQUNJQUlnQTBFQmFpSUhOZ0xVQWlBRExRQUJJZ1JCM2dCSElnZ05CaUFDSUFOQkFtb2lCellDMUFKQkFBd0hDeUFBS0FJb1JRMEJJQUJCMVQ5QkFCQTZEQklMSUFSQlAwWU5FQXNnQUNBQ1FRaHFJQUpCSEdwQkFCQ3pCQ0lFUVFCSURSQUxJQUFvQWpRaENpQUFLQUlFSVFNZ0FRUkFJQUJCR3hBUkN3SkFJQVJCZ0lDQWdBUk9CRUFnQUNBQ1FRaHFFS2tHSVFRZ0FpZ0NGQ0FDS0FJUVFRQWdBaWdDR0JFQkFCb2dCRVVOQVF3UkN5QUFLQUlzQkVBZ0JDQUFLQUlvRU4wQklRUUxJQVJCLy84RFRBUkFJQUJCQVNBRUVMSUVEQUVMSUFCQkFpQUVFTGdCR2dzZ0FVVU5CeUFBUVJzUUVRd0hDeUFBUVFSQkF5QUFLQUl3R3hBUkRBUUxJQUlnQTBFQmFpSUlOZ0ljSUFCQkJSQVJEQWtMUVFFTElRVURRQ0FGUlFSQUlBY3RBQUFoQkVFQklRVU1BUXNDUUFKQUFrQUNRQ0FFUWY4QmNVSGRBRWNFUUNBQUlBSkJyQUpxSUFKQjFBSnFRUUVRc3dRaUEwRUFTQTBEQWtBQ1FBSkFBa0FnQWlnQzFBSWlCeTBBQUVFdFJ3MEFJQWN0QUFGQjNRQkdEUUFnQWlBSFFRRnFOZ0lnSUFOQmdJQ0FnQVJQQkVBZ0FDZ0NLRVVOQVNBQ0tBSzRBaUFDS0FLMEFrRUFJQUlvQXJ3Q0VRRUFHZ3dEQ3lBQUlBSkJyQUpxSUFKQklHcEJBUkN6QkNJR1FRQklEUWNnQmtHQWdJQ0FCRWtOQVNBQ0tBSzRBaUFDS0FLMEFrRUFJQUlvQXJ3Q0VRRUFHaUFBS0FJb0RRSUxJQU5CZ0lDQWdBUkpEUUlnQWtIQUFtb2dBaWdDdEFJaUF5QUNLQUtzQWhDeEJDRUdJQUlvQXJnQ0lBTkJBQ0FDS0FLOEFoRUJBQm9nQmtVTkJ3d0ZDeUFDSUFJb0FpQWlCellDMUFJZ0F5QUdUUTBEQ3lBQVFhYnJBRUVBRURvTUJBc2dBa0hBQW1vZ0F5QURFS2dHUlEwRURBSUxJQUFvQWl3RVFDQUNRVFEyQWpBZ0FpQUNLQUxNQWpZQ0xDQUNRUUEyQWlnZ0FrSUFOd0lnSUFKQzRZQ0FnTEFQTndMWUFrRUJJUVVnQWtFZ2FpQUNLQUxJQWlBQ0tBTEFBaUFDUWRnQ2FrRUNRUUVRMndJaEJDQUNLQUlvSVFNZ0JFVUVRRUVBSVFVZ0FpZ0NJQ0lFUVFBZ0JFRUFTaHNoQmdOQUlBVWdCa1pGQkVBZ0F5QUZRUUowYWlJSklBa29BZ0JCSUdzMkFnQWdCVUVCYWlFRkRBRUxDeUFDUWNBQ2FpQURJQVFRc1FRaEJRc2dBaWdDTENBRFFRQWdBaWdDTUJFQkFCb2dCUTBDQ3lBSVJRUkFJQUpCd0FKcUVOb0NEUUlMSUFBZ0FrSEFBbW9RcVFZTkFpQUNLQUxNQWlBQ0tBTElBa0VBSUFJb0F0QUNFUUVBR2lBQ0lBZEJBV28yQWh3Z0FVVU5CZ3dGQ3lBQ1FjQUNhaUFESUFZUXFBWkZEUUlMSUFBUXFBSUxJQUlvQXN3Q0lBSW9Bc2dDUVFBZ0FpZ0MwQUlSQVFBYURBMExRUUFoQlF3QUN3QUxJQUJCR3hBUkN5QVFJUU1NQVFzZ0F5QUhhaUVIUVg4aEF3SkFJQVVOQUNBQUtBSW9EUUFnQUNnQ05DRUtJQkFoQXdzZ0FFRVlRUmNnQkVFaFJodEJBQkM0QVNFRUlBQWdCellDR0NBQUlBWVE4Z0lOQ0NBQ0lBQW9BaGcyQWh3Z0FDQUNRUnhxUVNrUXNBTU5DQ0FBUVFvUUVTQUFLQUlNRFFnZ0FDZ0NBQ0FFYWlBQUtBSUVJQVJyUVFSck5nQUFDeUFDS0FJY0lRZ2dBMEVBU0EwREFrQUNRQUpBQWtBQ1FDQUlMUUFBSWdSQkttc09BZ0VDQUFzZ0JFRS9SZzBDSUFSQit3QkhEUWNnQ0MwQUFVRTZhMEYxU3cwRElBQW9BaWhGRFFjTUNBc2dDRUVCYWlFSVFRQWhDMEgvLy8vL0J5RUpEQVVMUVFFaEN5QUlRUUZxSVFoQi8vLy8vd2NoQ1F3RUMwRUJJUWtnQWlBSVFRRnFJZ2cyQWh4QkFDRUxEQU1MSUFJZ0NFRUJhallDSENBQ1FSeHFRUUVRM0FJaUN5RUpBa0FnQWlnQ0hDSUVMUUFBSWdWQkxFY05BQ0FDSUFSQkFXbzJBaHhCLy8vLy93Y2hDU0FFTFFBQklnVkJPbXRCZGtrTkFDQUNRUnhxUVFFUTNBSWlDU0FMU0EwRklBSW9BaHd0QUFBaEJRc2dCVUgvQVhGQi9RQkdEUUVnQUNnQ0tBMEJDeUFDSUFnMkFod01BZ3NnQUNBQ1FSeHFRZjBBRUxBRERRVWdBaWdDSENFSUN3SkFBbjhnQ0MwQUFFRS9SZ1JBSUFJZ0NFRUJhaUlJTmdJY0lBQW9BZ1FnQTJzaEIwRUFJUVZCQUF3QkN5QUFLQUlNSVFRQ1FDQUpRUUJLQkVBZ0JBMERJQUFvQWdRZ0Eyc2hCeUFBS0FJQUloRWdBMm9oRFVFQUlRVkJBQ0VNQTBBZ0JTQUhTQVJBSUFVZ0RXb2lEaTBBQUNJVVFmQ0JBbW90QUFBaEJFRUNJUVlDUUFKQUFrQUNRQ0FVUVFGckRoWUNBZ0lDQXdNSEJ3Y0hCd2NIQndjSEF3TUhCd0VBQnd0QkF5RUdDeUFPTHdBQklBWjBJQVJxSVFRTElBeEJBV29oREFzZ0JDQUZhaUVGREFFTEN5QU1RUUJNRFFFZ0FFRUtFQkVnQUNBRFFSRVE4QUVOQXlBQUtBSUFJQU5xUVJ3NkFBQWdBQ2dDQkNFR0lBTWdBQ2dDQUdvaUJDQU1OZ0FOSUFRZ0NUWUFDU0FFSUFzMkFBVWdCQ0FHSUFOclFSRnJOZ0FCREFRTElBUU5BaUFBS0FJRUlBTnJJUWNnQUNnQ0FDRVJDMEVBSVFRZ0FrRWdha0VBUWY4QkVDc2FJQU1nRVdvaEZFRitJUTFCQUNFUkEwQWdCQ0FIVGtVRVFDQUVJQlJxSWc0dEFBQWlCVUh3Z1FKcUxRQUFJUVpCQWlFTUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRlFRRnJEaHNDQWdJQ0J3Y0dCZ1lHQXdNRUJnY0hCd2NGQlFFQUJnWUhCZ2NHQzBFRElRd0xJQTR2QUFFZ0RIUWdCbW9oQmd0QkFTQU5JQTFCZmtZYklRME1CQXNnRGkwQUFTQUNRU0JxYWlJRklBVXRBQUJCQVhJNkFBQU1Bd3NnRGkwQUFTSUZJQTR0QUFJaURDQUZJQXhMR3lFTUEwQWdCU0FNUmcwRElBSkJJR29nQldvaURpQU9MUUFBUVFGeU9nQUFJQVZCQVdvaEJRd0FDd0FMUVFFaEVTQU9MUUFCSUFKQklHcHFJZ1VnQlMwQUFFRUNjam9BQUF3QkN5QU5RUUFnRFVGK1J4c2hEUXNnQkNBR2FpRUVEQUVMQzBFQUlRVUNmd0pBSUJGRkRRQURRQ0FGUWY4QlJnMEJJQUpCSUdvZ0JXb2hCQ0FGUVFGcUlRVWdCQzBBQUVFRFJ3MEFDMEYvREFFTElBMUJBQ0FOUVg1SEd3dEZJUVZCQVFzaEJBSkFJQXRGQkVBZ0FDZ0NOQ0FLUndSQUlBQWdBMEVERVBBQkRRTWdBQ2dDQUNBRGFrRU5PZ0FBSUFNZ0FDZ0NBR29nQ2pvQUFTQURJQUFvQWdCcUlBQXRBRFJCQVdzNkFBSWdBMEVEYWlFREN3SkFBa0FDUUNBSkRnSUFBUUlMSUFBZ0F6WUNCQXdGQ3lBQUlBTkJCUkR3QVEwRElBQW9BZ0FnQTJvZ0JFRUljam9BQUNBQUtBSUFJQU5xSUFjMkFBRU1CQXNnQ1VILy8vLy9CMFlOQVNBQUlBTkJDaER3QVEwQ0lBQW9BZ0FnQTJwQkR6b0FBQ0FBS0FJQUlnWWdBMEVGYWlJRmFpQUVRUWh5T2dBQUlBTWdCbW9nQ1RZQUFTQURJQUFvQWdCcUlBZEJCV28yQUFZZ0FFRU9JQVVRM0FFZ0FFRVFFQkVNQXdzZ0JTQUxRUUZISUFsQi8vLy8vd2RIY25KRkJFQWdBQ0FFUVFseklBTVEzQUVNQXdzZ0MwRUJSd1JBSUFBZ0EwRUZFUEFCRFFJZ0FDZ0NBQ0FEYWtFUE9nQUFJQUFvQWdBZ0Eyb2dDellBQVNBQVFRNGdBMEVGYWlJREVOd0JJQUJCRUJBUkN5QUpRZi8vLy84SFJnUkFJQUFvQWdRaEJpQUFJQVJCQ0hJZ0JTQUhha0VGYWhDNEFSb2dCUVJBSUFCQkdSQVJJQUFnQXlBSEVMQUVJQUJCR2lBR0VOd0JEQVFMSUFBZ0F5QUhFTEFFSUFCQkJ5QUdFTndCREFNTElBa2dDMHdOQWlBQVFROGdDU0FMYXhDNEFSb2dBQ2dDQkNFR0lBQWdCRUVJY2lBSFFRVnFFTGdCR2lBQUlBTWdCeEN3QkNBQVFRNGdCaERjQVNBQVFSQVFFUXdDQ3lBQUlBTWdCVUVGYWhEd0FRMEFJQUFvQWdBZ0Eyb2dCRUVJY2pvQUFDQUFLQUlBSUFOcUlnUWdCU0FIYWtFRmFqWUFBU0FGQkVBZ0JFRVpPZ0FGSUFCQkdpQURFTndCREFJTElBQkJCeUFERU53QkRBRUxJQUFRcUFJTUJBc2dBQ0FJTmdJWUlBRkZEUUVnQUNBQUtBSUVJZ01nRUdzaUVDQURhaERHQVEwRElBQW9BZ0FnRTJvaUJDQVFhaUFFSUFNZ0Uyc1FuQUVnQUNnQ0FDSUVJQk5xSUFNZ0JHb2dFQkFmR2d3QkN3c2dBRUgzS2tFQUVEb01BUXNnQUVIdU1VRUFFRG9MUVg4aEZRc2dBa0hnQW1va0FDQVZDNDRDQWdaL0FYNGpBRUVRYXlJREpBQUNRQ0FCUXYvLy8vOXZXQVJBSUFBUUpFRi9JUVFNQVF0QmZ5RUVJQUFnQWhBbElnbENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFBSkFJQUFnQTBFTWFpQURRUWhxSUFtblFSTVFqZ0ZCQUVnRVFFS0FnSUNBTUNFQ0lBTW9BZ2doQmlBREtBSU1JUWNNQVF0QkFDRUVRb0NBZ0lBd0lRSWdBeWdDRENFSElBTW9BZ2doQmdOQUlBVWdCa1lOQVNBQUlBSVFEeUFBSUFrZ0J5QUZRUU4wYWlJSUtBSUVJQWxCQUJBVUlnSkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUZRUUZxSVFVZ0FDQUJJQWdvQWdRZ0FrR0FnQUVReHdSQkFFNE5BUXNMUVg4aEJBc2dBQ0FISUFZUVdpQUFJQWtRRHlBQUlBSVFEd3NnQTBFUWFpUUFJQVFMMmdNQ0EzOEVmaU1BUVRCcklnZ2tBQUpBSUFBb0FoQW9BbmdnQ0UwRVFDQURRZ0FnQTBJQVZSc2hEU0FGUVFGcklRa2dCa0tBZ0lDQWNJTWhEaUFGUVFCTUlRcENBQ0VEQTBBZ0F5QU5VUVJBSUFRaERBd0RDMEovSVF3Z0FDQUNJQU1nQ0VFb2FoQ0ZBU0lGUVFCSURRSUNRQ0FGUlEwQUlBNUNnSUNBZ0RCU0JFQWdDQ0FJS1FNb053TUFJQU1oQ3lBSUlBSTNBeEFnQ0NBRFFvQ0FnSUFJV2dSK1FvQ0FnSURBZmlBRHViMGlDMEtBZ0lDQXdJR0EvUDhBZlNBTFF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dVZ0N3czNBd2dnQ0NBQUlBWWdCMEVESUFnUUlTSUxOd01vSUFBZ0NDa0RBQkFQSUFBZ0NDa0RDQkFQSUF0Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQkFzQ1FBSkFBa0FnQ2cwQUlBQWdDQ2tES0NJTEVNb0JJZ1ZCQUVnTkFTQUZSUTBBSUFBZ0NFRWdhaUFMRUR4QkFFZ05BU0FBSUFFZ0N5QUlLUU1nSUFRZ0NVS0FnSUNBTUVLQWdJQ0FNQkN2QmlJRVFnQlREUUVnQUNBTEVBOE1Bd3NnQkVMLy8vLy8vLy8vRDFNTkFTQUFRYkhhQUVFQUVCVWdDQ2tES0NFTEN5QUFJQXNRRHd3RUN5QUFJQUVnQkNBSUtRTW9FR3BCQUVnTkF5QUVRZ0Y4SVFRTElBTkNBWHdoQXd3QUN3QUxJQUFRNlFGQ2Z5RU1DeUFJUVRCcUpBQWdEQXVaQWdFQmZnSkFBa0FDUUNBQlFvQ0FnSUJ3Z3lJRVFvQ0FnSUF3VWdSQUlBUkNnSUNBZ0NCU0RRRWdBRUdwMUFBUVlpRUVEQUlMSUFCQnR2a0FFR0loQkF3QkN5QUFJQUVRSlNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FDQUJFTW9CSWdOQkFFZ0VRQ0FBSUFFUUQwS0FnSUNBNEFBUEN3Si9RWk1CSUFNTkFCcEJuUUVnQUNBQkVEZ05BQnBCa2dFZ0FhY3ZBUVlpQTBFU1MwRUJJQU4wUWZpT0VIRkZjZzBBR2lBQUtBSVFLQUpFSUFOQkdHeHFLQUlFQ3lFQ0lBQWdBVUhYQVNBQlFRQVFGQ0VFSUFBZ0FSQVBJQVJDZ0lDQWdIQ0RJZ0ZDZ0lDQWdKQi9VUTBBSUFGQ2dJQ0FnT0FBVVEwQklBQWdCQkFQSUFBZ0FoQXRJUVFMSUFCQnU1a0JJQVJCbklBQkVMNEJJUUVMSUFFTDBBSUNCbjhCZmlNQVFUQnJJZ0lrQUFKQUFrQWdBeWtEQUNJQlF2Ly8vLzl2V0FSQUlBRkNJSWluUVhWSkRRRWdBYWNpQUNBQUtBSUFRUUZxTmdJQURBRUxRb0NBZ0lEZ0FDRUxJQUFnQVJDMkF5SURRUUJJRFFFZ0EwVUVRQ0FBUWZqaUFFRUFFQlVNQWdzZ0FDQUNRU3hxSUFKQktHb2dBYWNpQmtFREVJNEJEUUVnQWlnQ0xDRUhJQUlvQWlnaENFRUFJUU1DUUFOQUlBTWdDRWNFUUNBSElBTkJBM1JxS0FJRUlRbEJnSUlCSVFVQ1FDQUVSUTBBSUFBZ0FrRUlhaUFHSUFrUVRDSUtRUUJJRFFNZ0NrVU5BQ0FDS0FJSUlRVWdBQ0FDUVFocUVFaEJnSVlCUVlDQ0FTQUZRUUp4R3lFRkN5QUFJQUVnQ1VLQWdJQ0FNRUtBZ0lDQU1FS0FnSUNBTUNBRkVHMUJBRWdOQWlBRFFRRnFJUU1NQVFzTElBQWdCeUFJRUZvZ0JpQUdLQUlBUVFGcU5nSUFEQUVMSUFBZ0J5QUlFRm9NQVFzZ0FTRUxDeUFDUVRCcUpBQWdDd3NRQUVHaW1RRWdBRUVMRVBzQlFRQkhDNGtCQWdOL0FYNUJsWmtCSVFNQ1FBSkFJQUVwQWdRaUJxZEIvLy8vL3dkeElnVWdBa3dOQUNBQlFSQnFJUVFDZnlBR1FvQ0FnSUFJZzFCRkJFQWdCQ0FDUVFGMGFpOEJBQXdCQ3lBQ0lBUnFMUUFBQzBFbFJ3MEFRYjB0SVFNZ0FrRUNhaUFGVGcwQUlBRWdBa0VCYWtFQ0VMZ0VJZ0pCQUU0TkFRc2dBQ0FERUxrRVFYOGhBZ3NnQWd1TEFnSUJmZ0Y4SXdCQkVHc2lBaVFBUW9DQWdJRGdBQ0VFQWtBZ0FDQUJFTjBDSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRUU1BUXNnQUNBQ0lBRVFiZzBBSUFBZ0FrRU1haUFES1FNQUVMb0JEUUFnQWlzREFDSUZ2U0lCUW9DQWdJQ0FnSUQ0L3dDRFFvQ0FnSUNBZ0lENC93QlJCRUFnQUVLQWdJQ0F3SDRnQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d4QTNJUVFNQVFzZ0F6VUNCRUlnaGtLQWdJQ0FNRkVFUUNBQUlBVkJDa0VBUVFRUWp3SWhCQXdCQ3lBQ0tBSU1JZ05CNVFCUEJFQWdBRUdLTkVFQUVGQU1BUXNnQUNBRlFRb2dBMEVCYWtFRkVJOENJUVFMSUFKQkVHb2tBQ0FFQzE4QUl3QkJFR3NpQWlRQUFuNGdBeWtEQUNJQlFpQ0lweUlEQkVCQ2dJQ0FnQkFnQTBFTGFrRVNTUTBCR2d0Q2dJQ0FnT0FBSUFBZ0FrRUlhaUFCRUVJTkFCb2dBaXNEQ0JDOUFxMUNnSUNBZ0JDRUN5RUJJQUpCRUdva0FDQUJDeVlBUW9DQWdJRGdBQ0FBSUFNcEF3QVF6QVVpQUVFQVI2MUNnSUNBZ0JDRUlBQkJBRWdiQ3k4QkFYNENmaUFES0FJRUlnSUVRRUtBZ0lDQUVDSUVJQUpCQzJwQkVra05BUm9MSUFBZ0JDQURJQU1RdkFRTEN5OEJBWDRDZmlBREtBSUVJZ0lFUUVLQWdJQ0FFQ0lFSUFKQkMycEJFa2tOQVJvTElBQWdCQ0FESUFNUXZRUUxDd2tBSUFBZ0FSQytCQXNzQUNBQUlBRVF2Z1FpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1IrSUFCQkEwRUNJQUduR3hBdEJTQUJDd3ZNQWdJQmZ3ZCtJd0JCSUdzaUJDUUFJQUFnQkVFSWFrRUFFRDBhUW9DQWdJRGdBQ0VJUW9DQWdJQXdJUVVDUUFKQUFrQWdBQ0FES1FNQUVDVWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQUNBR1FmQUFJQVpCQUJBVUVOd0ZJZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFRZ0JSQThRUUJJRFFCQ0FDRUJJQVFwQXdBaUIwSUFJQWRDQUZVYklRa2dCMElCZlNFSElBS3NJUW9EUUNBQklBbFJEUUlnQUNBQUlBVWdBUkJ6RURjaUMwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBUkJDR29nQ3hCL0dpQUJJQWRaSVFJZ0FVSUJmQ0VCSUFFZ0Nsa2dBbklOQUNBRVFRaHFJQU1nQWFkQkEzUnFLUU1BRUljQlJRMEFDd3NnQUNBR0VBOGdBQ0FGRUE4Z0JDZ0NDQ2dDRUNJQVFSQnFJQVFvQWd3Z0FDZ0NCQkVBQUF3QkN5QUFJQVlRRHlBQUlBVVFEeUFFUVFocUVEWWhDQXNnQkVFZ2FpUUFJQWdMZ3dJQ0EzOEJmQ01BUVNCcklnUWtBQUorQWtBZ0FDQUVJQUlRUFEwQUlBSkJBQ0FDUVFCS0d5RUdBa0FEUUNBRklBWkhCRUFDUUNBRElBVkJBM1JxS1FNQUlnRkMvLy8vL3c5WUJFQWdBYWNpQWtILy84TUFUUTBCREFRTElBQWdCRUVZYWlBQkVFSU5CQ0FFS3dNWUlnZEVBQUFBQUFBQUFBQmpJQWRFQUFBQUFQLy9NRUZrY2cwRElBY0NmeUFIbVVRQUFBQUFBQURnUVdNRVFDQUhxZ3dCQzBHQWdJQ0FlQXNpQXJkaURRTUxJQVZCQVdvaEJTQUVJQUlRdVFGRkRRRU1Bd3NMSUFRUU5nd0NDeUFBUVpVclFRQVFVQXNnQkNnQ0FDZ0NFQ0lBUVJCcUlBUW9BZ1FnQUNnQ0JCRUFBRUtBZ0lDQTRBQUxJUUVnQkVFZ2FpUUFJQUVMbkFFQkFuOGpBRUVnYXlJRUpBQWdBQ0FFUVFocUlBSVFQUm9nQWtFQUlBSkJBRW9iSVFJQ2ZnTkFJQUlnQlVjRVFBSkFJQUFnQkVFRWFpQURJQVZCQTNScUtRTUFFSGRGQkVBZ0JFRUlhaUFFTHdFRUVJc0JSUTBCQ3lBRUtBSUlLQUlRSWdCQkVHb2dCQ2dDRENBQUtBSUVFUUFBUW9DQWdJRGdBQXdEQ3lBRlFRRnFJUVVNQVFzTElBUkJDR29RTmdzaEFTQUVRU0JxSkFBZ0FRdWJBd0lEZndKK0l3QkJJR3NpQWlRQVFvQ0FnSURnQUNFSUFrQWdBQ0FCRUZraUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdBa0VJYWlJRlFRY1FQUm9nQlVFOEVEc2FJQVVnQkVFRGRDSUZRWURyQVdvb0FnQWlCaENJQVJwQm5qMGdCSFpCQVhGRkJFQWdBa0VJYWlJRVFTQVFPeG9nQkNBRlFZVHJBV29vQWdBUWlBRWFJQVJCcnBrQkVJZ0JHaUFBSUFNcEF3QVFXU0lKUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBQkVBOGdBaWdDQ0NnQ0VDSUFRUkJxSUFJb0Fnd2dBQ2dDQkJFQUFBd0NDeUFKcHlJSFFSQnFJUVZCQUNFRUEwQWdCQ0FIS1FJRUlnaW5RZi8vLy84SGNVOUZCRUFDUUFKL0lBaENnSUNBZ0FpRFVFVUVRQ0FGSUFSQkFYUnFMd0VBREFFTElBUWdCV290QUFBTElnTkJJa1lFUUNBQ1FRaHFRYUNKQVJDSUFSb01BUXNnQWtFSWFpQURFSXNCR2dzZ0JFRUJhaUVFREFFTEN5QUFJQWtRRHlBQ1FRaHFRU0lRT3hvTElBSkJDR29pQUVFK0VEc2FJQUFnQVJCL0dpQUFRYnFRQVJDSUFSb2dBQ0FHRUlnQkdpQUNRUWhxUVQ0UU94b2dBQkEySVFnTElBSkJJR29rQUNBSUM1TUVBZ2gvQVg0akFFRXdheUlGSkFBQ1FDQUFJQUVRV1NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FhY2lCeWdDQkVILy8vLy9CM0VpQWtVTkFBSkFJQUFnQlVFVWFpQUNFRDBOQUVFQUlRSWdCVUVBTmdJUUlBZEJFR29oQ0FOQUFrQWdCeWtDQkNJTnAwSC8vLy8vQjNFaUNTQUNTZ1JBQW44Q1FDQUVSU0FISUFWQkVHb1F5UUVpQ2tHakIwZHlEUUFnQlNnQ0VDSUxRUUZySVFJRFFBSkFJQUpCQUV3RVFFRUFJUVlNQVFzZ0FrRUJheUVEQWtBZ0RVS0FnSUNBQ0lOUVJRUkFJQWdnQTBFQmRHb3ZBUUFpQmtHQStBTnhRWUM0QTBjZ0FrRUNTWElOQVNBSUlBSkJBbXNpQWtFQmRHb3ZBUUFpREVHQTBBQnFRZi8vQTNGQmdBaExEUUVnQmtIL0IzRWdERUgvQjNGQkNuUnlRWUNBQkdvaEJnd0NDeUFESUFocUxRQUFJUVlMSUFNaEFnc2dCaERBQkEwQUN5QUdFTDhFUlEwQUlBVWdDellDTEFKQUEwQWdCU2dDTENBSlRnMEJJQWNnQlVFc2FoREpBU0lDRU1BRURRQUxJQUlRdndRTkFRc2dCVUhDQnpZQ0JFRUJEQUVMSUFWQkJHb2dDaUFFRUxJREN5RURRUUFoQWdOQUlBSWdBMFlOQWlBQ1FRSjBJUVlnQWtFQmFpRUNJQVZCRkdvZ0JpQUZRUVJxYWlnQ0FCQzVBVVVOQUFzTUF3c2dBQ0FCRUE4Z0JVRVVhaEEySVFFTUF3c2dCU2dDRUNFQ0RBQUxBQXNnQUNBQkVBOGdCU2dDRkNnQ0VDSUFRUkJxSUFVb0FoZ2dBQ2dDQkJFQUFFS0FnSUNBNEFBaEFRc2dCVUV3YWlRQUlBRUxkQUVCZmtLQWdJQ0E0QUFoQkNBQUlBRVFXU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlNCSDRnQUNBREtRTUFFQ2dpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFBZ0FSQVBRb0NBZ0lEZ0FBOExJQUduSUFTbkVJTUNJUUlnQUNBQkVBOGdBQ0FFRUE4Z0FxMEZRb0NBZ0lEZ0FBc0xDUUFnQUNBQkVQWUVDeElBSUFCQnNqUkJBQkFWUW9DQWdJRGdBQXRxQUFKQUFrQWdBVUlnaUtjaUFrRi9Sd1JBSUFKQmVVY05BUXdDQ3lBQnB5SUNMd0VHUVFWSERRQWdBaWtESUNJQlFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFBTUFRc2dBRUdpMndCQkFCQVZRb0NBZ0lEZ0FBOExJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FDQUJDNFFDQWdKL0FuNGdBQ0FCRUZraUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBRVBDeUFCcHlJR0tRSUVJZ2VuUWYvLy8vOEhjU0VDQWtBZ0JFRUJjVVVOQUNBR1FSQnFJUU1nQjBLQWdJQ0FDSU1oQ0FOQUlBSWdCVVlFUUNBQ0lRVU1BZ3NDZnlBSVVFVUVRQ0FESUFWQkFYUnFMd0VBREFFTElBTWdCV290QUFBTEVJY0RSUTBCSUFWQkFXb2hCUXdBQ3dBTEFrQWdCRUVDY1VVRVFDQUNJUU1NQVFzZ0JrRVFhaUVFSUFkQ2dJQ0FnQWlESVFjRFFDQUNJZ01nQlV3TkFTQURRUUZySVFJQ2Z5QUhVRVVFUUNBRUlBSkJBWFJxTHdFQURBRUxJQUlnQkdvdEFBQUxFSWNERFFBTEN5QUFJQVlnQlNBREVJUUJJUWNnQUNBQkVBOGdCd3ZxQXdJR2Z3TitJd0JCSUdzaUJTUUFRb0NBZ0lEZ0FDRU1Ba0FnQUNBQkVGa2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFBa0FDUUNBQUlBVkJCR29nQXlrREFCQzZBUTBBSUFVb0FnUWlCeUFCcHlJSktBSUVRZi8vLy84SGNTSUlUQTBCUVNBaENrS0FnSUNBTUNFTEFrQWdBa0VDU0EwQUlBTXBBd2dpRFVLQWdJQ0FjSU5DZ0lDQWdEQlJEUUFnQUNBTkVDZ2lDMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMEJBa0FDUUNBTHB5SUdLUUlFSWcyblFmLy8vLzhIY1E0Q0FBRUNDeUFBSUFzUUR3d0RDd0ovSUExQ2dJQ0FnQWlEVUVVRVFDQUdMd0VRREFFTElBWXRBQkFMSVFwQkFDRUdDeUFIUVlDQWdJQUVUZ1JBSUFCQndOb0FRUUFRUmd3QkN5QUFJQVZCQ0dvZ0J4QTlSUVJBQWtBZ0JBUkFJQVZCQ0dvZ0NVRUFJQWdRVVEwQkN5QUhJQWhySVFNQ1FDQUdCRUFEUUNBRFFRQk1EUUlnQXlBRElBWW9BZ1JCLy8vLy93ZHhJZ0lnQWlBRFNoc2lBbXNoQXlBRlFRaHFJQVpCQUNBQ0VGRkZEUUFNQXdzQUN5QUZRUWhxSUFvZ0F4REJCQTBCQ3lBRVJRUkFJQVZCQ0dvZ0NVRUFJQWdRVVEwQkN5QUFJQXNRRHlBQUlBRVFEeUFGUVFocUVEWWhEQXdFQ3lBRktBSUlLQUlRSWdKQkVHb2dCU2dDRENBQ0tBSUVFUUFBQ3lBQUlBc1FEd3NnQUNBQkVBOE1BUXNnQVNFTUN5QUZRU0JxSkFBZ0RBdUJCZ0lGZmdWL0l3QkIwQUJySWdJa0FBSkFBa0FDUUFKQUlBRkNnSUNBZ0JDRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQVFaVXdRUUFRRlF3QkN5QURLUU1JSVFrZ0F5a0RBQ0lGUW9DQWdJQVFoRUtBZ0lDQWNJTkNnSUNBZ0RCUkRRSWdCRVVOQVNBQUlBVVF4QVJCQUU0TkFRdENnSUNBZ09BQUlRWU1BZ3NnQUNBRlFkUUJJQVZCQUJBVUlnZENnSUNBZ0hDRElnWkNnSUNBZ0NCUklBWkNnSUNBZ0RCUmNnMEFJQVpDZ0lDQWdPQUFVUTBCSUFJZ0NUY0RLQ0FDSUFFM0F5QWdBQ0FISUFWQkFpQUNRU0JxRUM4aEJnd0JDeUFBSUFKQkNHcEJBQkE5R2tLQWdJQ0E0QUFoQmtLQWdJQ0FNQ0VJQWtBZ0FDQUJFQ2dpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBUW9DQWdJQXdJUVVNQVFzZ0FDQUZFQ2dpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0NSQTRJZzVGQkVBZ0FDQUpFQ2dpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCQ3lBSHB5RUxJQVduSWcwcEFnUWhBUU5BQWtBQ1FDQUJRdi8vLy84SGcxQUVRRUVBSVFNZ0RFVU5BU0FLSUFzb0FnUkIvLy8vL3dkeFR3MENJQXBCQVdvaEF3d0JDeUFMSUEwZ0NoRENCQ0lEUVFCT0RRQWdEQTBCSUFJb0FnZ29BaEFpQTBFUWFpQUNLQUlNSUFNb0FnUVJBQUFnQUNBRkVBOGdBQ0FJRUE4Z0J5RUdEQVFMSUFJZ0JUY0RJQUorSUE0RVFDQUNJQWMzQXpBZ0FpQURyVGNES0NBQUlBQWdDVUtBZ0lDQU1FRURJQUpCSUdvUUlSQTNEQUVMSUFJZ0NEY0RTQ0FDUW9DQWdJQXdOd05BSUFKQ2dJQ0FnREEzQXpnZ0FpQUhOd01vSUFJZ0E2MDNBekFnQUNBQ1FTQnFFTzBFQ3lJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJZ0FrRUlhaUlNSUFzZ0NpQURFRkVhSUF3Z0FSQi9HaUFOS1FJRUlnR25RZi8vLy84SGNTQURhaUVLUVFFaERDQUVEUUVMQ3lBQ1FRaHFJZ01nQ3lBS0lBc29BZ1JCLy8vLy93ZHhFRkVhSUFBZ0JSQVBJQUFnQ0JBUElBQWdCeEFQSUFNUU5pRUdEQUVMSUFJb0FnZ29BaEFpQTBFUWFpQUNLQUlNSUFNb0FnUVJBQUFnQUNBRkVBOGdBQ0FJRUE4Z0FDQUhFQThMSUFKQjBBQnFKQUFnQmd1NEFnSURmd04rSXdCQklHc2lBaVFBUW9DQWdJRGdBQ0VIQWtBQ1FBSkFJQUFnQVJCWklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQUlnQXlrREFCRGlBdzBBSUFJcEF3QWlDRUtBZ0lDQUNGb0VRQ0FBUWVJcVFRQVFVQXdCQ3lBQnB5SUVLUUlFSWdtbklnWkIvLy8vL3dkeElnVkZEUUVnQ0tjaUEwRUJSZzBCSUFsQy8vLy8vd2VESUFoK1FvQ0FnSUFFV2dSQUlBQkJ3Tm9BUVFBUVJnd0JDeUFBSUFKQkNHb2dBeUFGYkNBR1FSOTJFSW9ERFFBQ1FDQUZRUUZIQkVBRFFDQURRUUJNRFFJZ0FrRUlhaUFFUVFBZ0JSQlJHaUFEUVFGcklRTU1BQXNBQ3lBQ1FRaHFBbjhnQkMwQUIwR0FBWEVFUUNBRUx3RVFEQUVMSUFRdEFCQUxJQU1Rd1FRYUN5QUFJQUVRRHlBQ1FRaHFFRFloQnd3Q0N5QUFJQUVRRHd3QkN5QUJJUWNMSUFKQklHb2tBQ0FIQzhFQkFnSi9BbjRqQUVFUWF5SUVKQUJDZ0lDQWdPQUFJUVlDUUNBQUlBRVFXU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQVNFR0RBRUxBa0FnQUNBRVFReHFJQU1wQXdBZ0FhY2lCU2dDQkVILy8vLy9CM0VpQWlBQ0VGY05BQ0FFSUFJMkFnZ2dBeWtEQ0NJSFFvQ0FnSUJ3ZzBLQWdJQ0FNRklFUUNBQUlBUkJDR29nQnlBQ0lBSVFWdzBCSUFRb0FnZ2hBZ3NnQUNBRklBUW9BZ3dpQXlBQ0lBTWdBaUFEU2hzUWhBRWhCZ3NnQUNBQkVBOExJQVJCRUdva0FDQUdDOEFCQWdOL0FuNGpBRUVRYXlJQ0pBQkNnSUNBZ09BQUlRY0NRQ0FBSUFFUVdTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBU0VIREFFTEFrQWdBQ0FDUVF4cUlBTXBBd0FnQWFjaUJpZ0NCRUgvLy8vL0IzRWlCQ0FFRUZjTkFDQUNJQVFnQWlnQ0RDSUZheUlFTmdJSUlBQWdCaUFGSUFNcEF3Z2lDRUtBZ0lDQWNJTkNnSUNBZ0RCU0JIOGdBQ0FDUVFocUlBZ2dCRUVBRUZjTkFTQUNLQUlJQlNBRUN5QUZhaENFQVNFSEN5QUFJQUVRRHdzZ0FrRVFhaVFBSUFjTDB3RUNBbjhDZmlNQVFSQnJJZ0lrQUVLQWdJQ0E0QUFoQmdKQUlBQWdBUkJaSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRWU1BUXNDUUNBQUlBSkJER29nQXlrREFDQUJweUlGS0FJRVFmLy8vLzhIY1VFQUVGY05BQ0FDSUFVb0FnUkIvLy8vL3dkeElnUTJBZ2dnQXlrRENDSUhRb0NBZ0lCd2cwS0FnSUNBTUZJRVFDQUFJQUpCQ0dvZ0J5QUVRUUFRVncwQklBSW9BZ2doQkFzZ0FDQUZJQUlvQWd3aUF5QUVJQU1nQkVnYklBTWdCQ0FESUFSS0d4Q0VBU0VHQ3lBQUlBRVFEd3NnQWtFUWFpUUFJQVlMcUFVQ0MzNENmeU1BUVJCcklnSWtBQUpBSUFGQ2dJQ0FnQkNFUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FBUVpVd1FRQVFGVUtBZ0lDQTRBQWhCd3dCQ3lBREtRTUlJUVlDUUNBREtRTUFJZ1JDZ0lDQWdIQ0RJZ2xDZ0lDQWdCQ0VRb0NBZ0lBd1VRMEFJQUFnQkVIV0FTQUVRUUFRRkNJRlFvQ0FnSUJ3Z3lJSFFvQ0FnSUFnVVNBSFFvQ0FnSUF3VVhJTkFDQUhRb0NBZ0lEZ0FGRU5BU0FDSUFZM0F3Z2dBaUFCTndNQUlBQWdCU0FFUVFJZ0FoQXZJUWNNQVF0Q2dJQ0FnT0FBSVFkQ2dJQ0FnREFoQ0NBQUFuNUNnSUNBZ0RBZ0FDQUJFQ2dpQ2tLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2tLQWdJQ0E0QUFnQUJBK0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFCb0NRQUpBSUFaQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFKQmZ6WUNBQXdCQ3lBQUlBSWdCaEIzUVFCSURRRUxJQXFuSWdNcEFnUWhDeUFBSUFRUUtDSUlRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQUNRQ0FDS0FJQUlnOUZEUUJDQUNFRUFrQWdDVUtBZ0lDQU1GRUVRRUlBSVFVTUFRc2dDS2NpRUNrQ0JFTC8vLy8vQjRNaEJpQUxRdi8vLy84SGd5SUZVRVVFUUNBRklBWjlJQVpRclNJSmZTRU1JQSt0SVExQ0FDRUZBMEFDUUNBRUlBbDhJZzRnREZVTkFDQURJQkFnRHFjUXdnUWlEMEVBU0EwQUlBQWdBeUFFcHlBUEVJUUJJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CU0FBSUFFZ0JTQUVRUUFRMGdGQkFFZ05CU0FHSUErc2ZDRUVJQVZDQVh3aUJTQU5VZzBCREFRTEN5QUZRdi8vLy84UGd5RUZEQUVMUWdBaEJTQUdVQTBCQ3lBQUlBTWdCS2NnQzZkQi8vLy8vd2R4RUlRQklnUkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQUVnQlNBRVFRQVEwZ0ZCQUVnTkFRc2dBQ0FLRUE4Z0FDQUlFQThnQVNFSERBSUxJQUVMRUE4Z0FDQUtFQThnQUNBSUVBOExJQUpCRUdva0FDQUhDNkFEQVFSK0l3QkJNR3NpQWlRQUlBSWdBVGNES0FKQUlBRkNnSUNBZ0JDRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQVFaVXdRUUFRRlVLQWdJQ0E0QUFoQmd3QkN3SkFJQU1wQXdBaUJVS0FnSUNBRUlSQ2dJQ0FnSENEUW9DQWdJQXdVUTBBUW9DQWdJRGdBQ0VHSUFBZ0JTQUVJQVZCQUJBVUlnZENnSUNBZ0hDRElnaENnSUNBZ09BQVVRMEJBa0FnQkVIVEFVY05BQ0FBSUFVUXhBUkJBRTROQUNBQUlBY1FEd3dDQ3lBSVFvQ0FnSUFRaEVLQWdJQ0FNRkVOQUNBQUlBY2dCVUVCSUFKQktHb1FMeUVHREFFTElBSWdBQ0FCRUNnaUJ6Y0RDRUtBZ0lDQTRBQWhCaUFIUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQWlBRk53TVFBa0FDUUFKL0lBUkIwd0ZIQkVCQ2dJQ0FnREFoQVVFQkRBRUxJQUJCcDkwQUVHSWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEJJQUlnQVRjREdFRUNDeUVESUFBZ0FDa0RTQ0FESUFKQkVHb1Fwd0VoQlNBQUlBRVFEeUFGUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVMSUFBZ0J4QVBEQUVMSUFBZ0JTQUVRUUVnQWtFSWFoQ3RBaUVHSUFBZ0Fpa0RDQkFQQ3lBQ1FUQnFKQUFnQmd1WUF3SUZmd04rSXdCQkVHc2lCaVFBQWtBZ0FDQUJFRmtpQ2tLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFvaEFRd0JDd0pBSUFBZ0F5a0RBQkRRQXlJRkJFQkNnSUNBZ09BQUlRRkNnSUNBZ0RBaEN5QUZRUUJNRFFFZ0FFSDg5UUJCQUJBVkRBRUxRb0NBZ0lEZ0FDRUJJQUFnQXlrREFCQW9JZ3RDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FMcHlJSEtBSUVJUWdnQmlBS3B5SUpLQUlFUWYvLy8vOEhjU0lGUVFBZ0JFRUNSaHMyQWd3Q1FDQUNRUUpJRFFBZ0F5a0RDQ0lNUW9DQWdJQndnMEtBZ0lDQU1GRU5BQ0FBSUFaQkRHb2dEQ0FGUVFBUVZ3MEJDeUFGSUFoQi8vLy8vd2R4SWdWcklRSUNRQUpBQWtBQ1FDQUVEZ0lBQVFJTElBWW9BZ3doQXd3Q0N5QUdLQUlNSWdNZ0Frb2hCRUtBZ0lDQUVDRUJJQU1oQWlBRVJRMEJEQUlMSUFZb0Fnd2dCV3NpQXlFQ0MwS0FnSUNBRUNFQklBTkJBRWdnQWlBRFNISU5BQU5BSUFrZ0J5QURRUUFnQlJDekEwVUVRRUtCZ0lDQUVDRUJEQUlMSUFJZ0EwY2hCQ0FEUVFGcUlRTWdCQTBBQ3dzZ0FDQUtFQThnQUNBTEVBOExJQVpCRUdva0FDQUJDN0FEQXdkL0FYd0JmaU1BUVJCcklnVWtBQUpBSUFBZ0FSQlpJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQUpBQWtBZ0FDQURLUU1BRUNnaURVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBMm5JZ2tvQWdSQi8vLy8vd2R4SVFZZ0FhY2lDaWdDQkVILy8vLy9CM0VoQndKQUlBUUVRQ0FGSUFjZ0Jtc2lDellDREVGL0lRaEJBQ0VFSUFKQkFrZ05BU0FBSUFVZ0F5a0RDQkJDRFFJZ0JTc0RBQ0lNdlVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWZzBCSUF4RUFBQUFBQUFBQUFCbEJFQWdCVUVBTmdJTURBSUxJQXdnQzdkalJRMEJJQVVDZnlBTW1VUUFBQUFBQUFEZ1FXTUVRQ0FNcWd3QkMwR0FnSUNBZUFzMkFnd01BUXNnQlVFQU5nSU1JQUpCQWs0RVFDQUFJQVZCREdvZ0F5a0RDQ0FIUVFBUVZ3MENDeUFISUFacklRUkJBU0VJQzBGL0lRSWdCaUFIU3cwQklBUWdCU2dDRENJRGF5QUliRUVBU0EwQkEwQWdDaUFKSUFOQkFDQUdFTE1EUlFSQUlBTWhBZ3dEQ3lBRElBUkdEUUlnQXlBSWFpRUREQUFMQUFzZ0FDQUJFQThnQUNBTkVBOUNnSUNBZ09BQUlRRU1BUXNnQUNBQkVBOGdBQ0FORUE4Z0FxMGhBUXNnQlVFUWFpUUFJQUVMa3dFQ0FYNEJmeU1BUVJCcklnSWtBRUtBZ0lDQTRBQWhCQUpBSUFBZ0FSQlpJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FCSVFRTUFRc0NRQ0FBSUFKQkRHb2dBeWtEQUJDNkFRMEFRb0NBZ0lBd0lRUWdBaWdDRENJRFFRQklEUUFnQXlBQnB5SUZLQUlFUWYvLy8vOEhjVThOQUNBRklBSkJER29ReVFHdElRUUxJQUFnQVJBUEN5QUNRUkJxSkFBZ0JBdHBBZ0ovQVg0Z0FDQUJFRmtoQVFOQUlBSWdCRXdnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVWEpGQkVBZ0F5QUVRUU4wYWlrREFDSUdRaUNJcDBGMVR3UkFJQWFuSWdVZ0JTZ0NBRUVCYWpZQ0FBc2dCRUVCYWlFRUlBQWdBU0FHRU1RQ0lRRU1BUXNMSUFFTHlBRUNBWDRCZnlNQVFSQnJJZ0lrQUVLQWdJQ0E0QUFoQkFKQUlBQWdBUkJaSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRUU1BUXNDUUNBQUlBSkJER29nQXlrREFCQzZBUTBBQWtBZ0FpZ0NEQ0lEUVFCT0JFQWdBeUFCcHlJRktRSUVJZ1NuUWYvLy8vOEhjVWtOQVFzZ0FFRXZFQzBoQkF3QkN5QUZRUkJxSVFVZ0FBSi9JQVJDZ0lDQWdBaURVRVVFUUNBRklBTkJBWFJxTHdFQURBRUxJQU1nQldvdEFBQUxRZi8vQTNFUW53TWhCQXNnQUNBQkVBOExJQUpCRUdva0FDQUVDN2dCQWdKK0FYOGpBRUVRYXlJQ0pBQkNnSUNBZ09BQUlRUUNRQ0FBSUFFUVdTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBU0VFREFFTEFrQWdBQ0FDUVF4cUlBTXBBd0FRdWdFTkFFS0FnSUNBd0g0aEJDQUNLQUlNSWdOQkFFZ05BQ0FESUFHbklnWXBBZ1FpQmFkQi8vLy8vd2R4VHcwQUlBWkJFR29oQmlBRlFvQ0FnSUFJZzFCRkJFQWdCaUFEUVFGMGFqTUJBQ0VFREFFTElBTWdCbW94QUFBaEJBc2dBQ0FCRUE4TElBSkJFR29rQUNBRUMrTUJBZ0YrQW44akFFRVFheUlDSkFBQ1FDQUFJQUZCTFJCTElnTkZCRUFnQkVFQU5nSUFRb0NBZ0lEZ0FDRUJEQUVMUW9DQWdJQXdJUUVDUUNBREtRTUFJZ1pDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFJQUlnQXlnQ0RDSUZOZ0lNSUFVZ0JxY2lCeWdDQkVILy8vLy9CM0ZKRFFFZ0FDQUdFQThnQTBLQWdJQ0FNRGNEQUFzZ0JFRUJOZ0lBREFFTElBY2dBa0VNYWhESkFTRUlJQU1nQWlnQ0REWUNEQ0FFUVFBMkFnQWdDRUgvL3dOTkJFQWdBQ0FJUWYvL0EzRVFud01oQVF3QkN5QUFJQWNnQlVFQmRHcEJFR3BCQWhEdUF5RUJDeUFDUVJCcUpBQWdBUXMzQUNNQVFSQnJJZ0lrQUNBQUlBSkJER29nQXlrREFCQjNJUUFnQWlnQ0RDRURJQUpCRUdva0FFS0FnSUNBNEFBZ0EyZXRJQUFiQzA0QUl3QkJFR3NpQWlRQVFvQ0FnSURnQUNFQkFrQWdBQ0FDUVF4cUlBTXBBd0FRZHcwQUlBQWdBa0VJYWlBREtRTUlFSGNOQUNBQ0tBSUlJQUlvQWd4c3JTRUJDeUFDUVJCcUpBQWdBUXNHQUNBQXRyc0xmd0FnQUNBQUtRUFFBU0lCUWd5SUlBR0ZJZ0ZDR1lZZ0FZVWlBVUliaUNBQmhTSUJOd1BRQVVLQWdJQ0F3SDRnQVVLZHVyUDdsSkw5b2lWK1FneUlRb0NBZ0lDQWdJRDRQNFMvUkFBQUFBQUFBUEMvb0wwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3VqQkFNRGZBVi9BMzRqQUVFUWF5SUlKQUFnQ0VJQU53TUlBa0FDUUNBQ1FRQk1EUUJDZ0lDQWdPQUFJUUVnQUNBSVFRaHFJQU1wQXdBUVFnMEJRUUVoQ1NBSUt3TUlJUVFnQWtFQlJ3UkFBMEFnQWlBSlJnMENJQUFnQ0NBRElBbEJBM1JxS1FNQUVFSU5BeUFKUVFGcUlRa2dDQ3NEQUNFRkl3QkJJR3NpQnlRQUlBUzlRdi8vLy8vLy8vLy8vd0NESWcwZ0JiMUMvLy8vLy8vLy8vLy9BSU1pRENBTUlBMVdHeUlPdnlFRUFrQWdEa0kwaUtjaUNrSC9EMFlOQUNBTklBd2dEQ0FOVkJzaURMOGhCUUpBSUE1UURRQWdERUkwaUtjaUMwSC9EMFlOQUNBTElBcHJRY0VBVGdSQUlBVWdCS0FoQkF3Q0N3SjhJQXRCL2d0UEJFQWdCRVFBQUFBQUFBQXdGS0loQkNBRlJBQUFBQUFBQURBVW9pRUZSQUFBQUFBQUFMQnJEQUVMUkFBQUFBQUFBUEEvSUFwQnZBUkxEUUFhSUFSRUFBQUFBQUFBc0d1aUlRUWdCVVFBQUFBQUFBQ3dhNkloQlVRQUFBQUFBQUF3RkFzaEJpQUhRUmhxSUFkQkVHb2dCUkNLQmlBSFFRaHFJQWNnQkJDS0JpQUdJQWNyQXdBZ0J5c0RFS0FnQnlzRENLQWdCeXNER0tDZm9pRUVEQUVMSUFVaEJBc2dCMEVnYWlRQURBQUxBQXNnQkpraEJBc2dCTDBpQVFKL0lBU1pSQUFBQUFBQUFPQkJZd1JBSUFTcURBRUxRWUNBZ0lCNEN5SUF0NzFSQkVBZ0FLMGhBUXdCQzBLQWdJQ0F3SDRnQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d5RUJDeUFJUVJCcUpBQWdBUXRPQUNBQUlBQkVBQUFBQUFBQThMOUVBQUFBQUFBQThEOGdBRVFBQUFBQUFBQUFBR01iSUFDOVF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3lBQVJBQUFBQUFBQUFBQVlSc0xRd0FDZkNBQnZVS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVVFSQVJBQUFBQUFBQVBoL0lBQ1pSQUFBQUFBQUFQQS9ZUTBCR2dzZ0FDQUJFSThEQ3d1REFRSUNmZ0YvSUFDOUlnRkNOSWluUWY4UGNTSURRZjRIVFFSQUlBRkNnSUNBZ0lDQWdJQ0FmNE1oQWlBRFFmNEhSeUFCUW9DQWdJQ0FnSUR3djM5UmNrVUVRQ0FDUW9DQWdJQ0FnSUQ0UDRTL0R3c2dBcjhQQ3lBRFFiSUlUUVI4SUFGQ1A0Y2dBWHhDQVVHekNDQURhNjJHSWdGQ0FZaDhRZ0FnQVgyRHZ3VWdBQXNMZ2dVREFud0Zmd0YrSXdCQkVHc2lDU1FBQW41Q2dJQ0FnTUQrLy92L0FFS0FnSUNBd1A3L2V5QUVHeUFDUlEwQUdnSjhJQU1wQXdBaUFVTC8vLy8vRDFnRVFFRUJJQUlnQWtFQlRCc2hDaUFCcHlFSVFRRWhCd05BSUFjZ0NrY0VRQ0FJdHlBRElBZEJBM1JxS1FNQUlnRkNnSUNBZ0JCYURRTWFJQWdnQWFjaUN5QUlJQXRLR3lBSUlBc2dDQ0FMU0JzZ0JCc2hDQ0FIUVFGcUlRY01BUXNMSUFpdERBSUxRb0NBZ0lEZ0FDQUFJQWxCQ0dvZ0FSQkNEUUVhUVFFaEJ5QUpLd01JQ3lFRklBY2dBaUFDSUFkSUd5RUNBMEFnQWlBSFJ3UkFRb0NBZ0lEZ0FDQUFJQWtnQXlBSFFRTjBhaWtEQUJCQ0RRSWFBa0FnQmIwaURFTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmcwQUlBa3JBd0FpQnIwaUFVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmdSQUlBWWhCUXdCQ3lBRlJBQUFBQUFBQUFBQVlTQUdSQUFBQUFBQUFBQUFZWEVoQ2lBRUJFQWdDZ1JBSUFFZ0RJTy9JUVVNQWdzZ0JTQUZJQWFsSUFhOVF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3lBR0lBVzlRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCWUd5RUZEQUVMSUFvRVFDQUJJQXlFdnlFRkRBRUxJQVVnQlNBR3BDQUd2VUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2dCaUFGdlVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFXQnNoQlFzZ0IwRUJhaUVIREFFTEN5QUZ2U0lCQW44Z0JabEVBQUFBQUFBQTRFRmpCRUFnQmFvTUFRdEJnSUNBZ0hnTElnQzN2VkVFUUNBQXJRd0JDMEtBZ0lDQXdINGdBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzaEFTQUpRUkJxSkFBZ0FRc3RBRUtBZ0lDQTRBQWdBQ0FES1FNQUlBTXBBd2hCQUJDTEFpSUFRUUJIclVLQWdJQ0FFSVFnQUVFQVNCc0xvQUVCQTM0Z0F5a0RBQ0lGSVFRZ0FrRUVUZ1JBSUFNcEF4Z2hCQXNnQlVMLy8vLy9iMWdFUUNBQUVDUkNnSUNBZ09BQUR3c2dBeWtERUNFQlFvQ0FnSURnQUNFR0FrQWdBQ0FES1FNSUVERWlBa1VOQUNBQlFpQ0lwMEYxVHdSQUlBR25JZ01nQXlnQ0FFRUJhallDQUFzZ0FDQUZJQUlnQVNBRVFRQVFoZ1FoQXlBQUlBSVFFeUFEUVFCSURRQWdBMEVBUjYxQ2dJQ0FnQkNFSVFZTElBWUxqd0VBQWtBQ1FDQURLUU1BSWdGQy8vLy8vMjlZQkVBZ0JBUkFJQUFRSkF3REN5QUJRaUNJcDBGMVNRMEJJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FDQUJEd3NnQUNBQkVMWURJZ0pCQUVnTkFTQUVCRUFnQWtFQVI2MUNnSUNBZ0JDRUR3c2dBa1VFUUNBQVFmamlBRUVBRUJVTUFnc2dBYWNpQUNBQUtBSUFRUUZxTmdJQUN5QUJEd3RDZ0lDQWdPQUFDeW9BSUFNcEF3QWlBVUwvLy8vL2IxZ0VRQ0FBRUNSQ2dJQ0FnT0FBRHdzZ0FDQUJRUU5CQUJDcUFndFBBQUpBQWtBZ0F5a0RBQ0lCUXYvLy8vOXZXQVJBSUFSRkJFQkNnSUNBZ0JBUEN5QUFFQ1FNQVFzZ0FDQUJFSmtCSWdCQkFFNE5BUXRDZ0lDQWdPQUFEd3NnQUVFQVI2MUNnSUNBZ0JDRUMyTUJBWDRnQXlrREFDSUVRdi8vLy85dldBUkFJQUFRSkVLQWdJQ0E0QUFQQzBLQWdJQ0E0QUFoQVFKQUlBQWdBeWtEQ0JBeElnSkZEUUFnQUNBRUlBSVFjU0VESUFBZ0FoQVRJQU5CQUVnTkFDQURRUUJIclVLQWdJQ0FFSVFoQVFzZ0FRczJBQ0FES1FNQUlnRkNJSWluSWdKQmYwWWdCRVVnQWtGK2NVRUNSM0Z5UlFSQUlBQVFKRUtBZ0lDQTRBQVBDeUFBSUFFUTZBRUxZd0VDZmdKQUFrQWdBeWtEQUNJQlF2Ly8vLzl2V0FSQUlBQVFKQXdCQ3lBREtRTUlJUVVnQVNFRUlBSkJBMDRFUUNBREtRTVFJUVFMSUFBZ0JSQXhJZ0lOQVF0Q2dJQ0FnT0FBRHdzZ0FDQUJJQUlnQkVFQUVCUWhBU0FBSUFJUUV5QUJDMllCQVg0Z0F5a0RBQ0lFUXYvLy8vOXZXQVJBSUFBUUpFS0FnSUNBNEFBUEMwS0FnSUNBNEFBaEFRSkFJQUFnQXlrRENCQXhJZ0pGRFFBZ0FDQUVJQUpCQUJEVkFTRURJQUFnQWhBVElBTkJBRWdOQUNBRFFRQkhyVUtBZ0lDQUVJUWhBUXNnQVF1TEFRRUNmaUFES1FNQUlnRkMvLy8vLzI5WUJFQWdBQkFrUW9DQWdJRGdBQThMSUFNcEF4QWhCa0tBZ0lDQTRBQWhCUUpBSUFBZ0F5a0RDQkF4SWdKRkRRQWdBQ0FCSUFJZ0JpQUVSVUVPZEJESEJDRURJQUFnQWhBVElBTkJBRWdOQUNBRUJFQWdBMEVBUjYxQ2dJQ0FnQkNFRHdzZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBSUFFaEJRc2dCUXVhQVFJQmZ3SitJd0JCRUdzaUJDUUFJQU1wQXdnaEJTQURLUU1BSWdZaEFRSkFBa0FDUUFKQUlBSkJBMGdOQUNBREtRTVFJZ0ZDZ0lDQWdIQmFCRUFnQWFjdEFBVkJFSEVOQVFzZ0FFR2lQa0VBRUJVTUFRc2dBQ0FFUVF4cUlBVVFpUVFpQWcwQkMwS0FnSUNBNEFBaEFRd0JDeUFBSUFZZ0FTQUVLQUlNSWdNZ0FoQ1FBeUVCSUFBZ0FpQURFSnNEQ3lBRVFSQnFKQUFnQVFzVkFDQUFJQU1wQXdBZ0F5QURRUWhxUVFJUW5RTUxWZ0lCZmdGL0lBQWdBUkMwQXlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FROExRb0NBZ0lBd0lRSWdBYWNpQXlnQ0JFR0FnSUNBZUVjRVFDQUFJQUFvQWhBZ0F4REJBaEF0SVFJTElBQWdBUkFQSUFJTENRQWdBQ0FCRUxRREMxc0JBWDRqQUVFUWF5SUNKQUFnQWlBQUlBRVF0QU1pQVRjRENBSkFJQUZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FCSVFRTUFRc2dBRUtBZ0lDQU1FRUJJQUpCQ0dvUWx3WWhCQ0FBSUFFUUR3c2dBa0VRYWlRQUlBUUxmZ0VCZmlBREtRTUFJZ0ZDZ0lDQWdIQ0RRb0NBZ0lDQWYxSUVRQ0FBUWZiU0FFRUFFQlZDZ0lDQWdPQUFEd3RDZ0lDQWdEQWhCQ0FCcHlJQUtRSUVRb0NBZ0lDQWdJQ0FRSU5DZ0lDQWdJQ0FnSUNBZjFFRWZpQUFJQUFvQWdCQkFXbzJBZ0FnQVVMLy8vLy9ENE5DZ0lDQWdKQi9oQVZDZ0lDQWdEQUxDendCQVg1Q2dJQ0FnT0FBSVFFZ0FDQURLUU1BRUNnaUJFS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSK0lBQWdCS2RCQWhDQUJBVkNnSUNBZ09BQUN3dUJCQUlCZmdGL0FrQUNRQUpBQWtBQ1FDQUJRb0NBZ0lCd1dnUkFJQUduSWdJdkFRWkJMMFlOQVFzZ0JFRUJOZ0lBREFFTElBSW9BaUFoQWlBRVFRRTJBZ0FnQWcwQkN5QUFRYlkvUVFBUUZRd0JDd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBaWdDQUNJSFFRRnJEZ1FDQWdjQkFBc2dCVVVOQWlBQUtBSVFJQUlRdFFNTFFvQ0FnSUF3SVFFZ0JVRUJhdzRDQXdRSEN5QURLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lBeUFES0FJQVFRRnFOZ0lBQ3dKQUlBVkJBa2NOQUVFQklRTWdCMEVCUncwQUlBQWdBUkNLQVF3Q0N5QUNLQUpFSWdNZ0JhMDNBd0FnQTBFSWF5QUJOd01BSUFJZ0EwRUlhallDUkF0QkFDRURDeUFDUVFNMkFnQWdBaUFETmdJVUlBQWdBa0VJYWhDMEFpRUJJQUpCQVRZQ0FDQUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQ2dDRUNBQ0VMVURJQUVQQ3lBQ0tBSkVRUWhySWdNcEF3QWhCaUFEUW9DQWdJQXdOd01BSUFGQy8vLy8vdzlZQkVBZ0FVSUNVUVJBSUFKQkFqWUNBQ0FFUVFJMkFnQWdCZzhMSUFSQkFEWUNBQ0FHRHdzZ0FDQUJFQThnQUNnQ0VDQUNFTFVESUFZUEN5QURLUU1BSWdGQ0lJaW5RWFZKRFFNZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBSUFFUEN5QURLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQUlBRVFpZ0VNQVFzZ0FFR1VQMEVBRUJVTFFvQ0FnSURnQUNFQkN5QUJDKzhCQVFOK0l3QkJFR3NpQWlRQVFvQ0FnSURnQUNFRUFrQWdBQ0FBSUFFUUpTSUJRUUVRa0FJaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBVkNJSWluSWdOQkFDQURRUXRxUVJKSkcwVUVRQ0FBSUFKQkNHb2dCUkJDUVFCSURRRkNnSUNBZ0NBaEJDQUNLUU1JUW9DQWdJQ0FnSUQ0L3dDRFFvQ0FnSUNBZ0lENC93QlJEUUVMUW9DQWdJRGdBQ0VFSUFBZ0FVRy8zQUFRc2dFaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdCaEE0UlFSQUlBQkI3UEVBUVFBUUZTQUFJQVlRRHd3QkN5QUFJQVlnQVVFQVFRQVFMeUVFQ3lBQUlBRVFEeUFBSUFVUUR5QUNRUkJxSkFBZ0JBdU5BZ0lCZkFGK0l3QkJFR3NpQWlRQVFvQ0FnSURnQUNFRkFrQWdBQ0FDUVFocUlBRVFtd0lOQUNBQUlBSkJDR29nQXlrREFCQkNEUUFnQWdKK0lBSXJBd2dpQkwwaUJVS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVWdSQUlBU2RJZ1JFQUFBQUFBQ3duVUNnSUFRZ0JFUUFBQUFBQUFCWlFHTWJJQVFnQkVRQUFBQUFBQUFBQUdZYklnUzlJUVVMQW44Z0JKbEVBQUFBQUFBQTRFRmpCRUFnQktvTUFRdEJnSUNBZ0hnTElnTzN2U0FGVVFSQUlBT3REQUVMUW9DQWdJREFmaUFGUW9DQWdJREFnWUQ4L3dCOUlBVkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN6Y0RBQ0FBSUFGQkFTQUNRUkVReUFRaEJRc2dBa0VRYWlRQUlBVUxpUUVDQVg0QmZDTUFRUkJySWdJa0FFS0FnSUNBNEFBaEJBSkFJQUFnQWtFSWFpQUJFSnNDRFFBZ0FDQUNRUWhxSUFNcEF3QVFRZzBBSUFBZ0FTQUNLd01JSWdXZFJBQUFBQUFBQUFBQW9FUUFBQUFBQUFENGZ5QUZSQUFBM01JSXNqNURaUnRFQUFBQUFBQUErSDhnQlVRQUFOekNDTEkrdzJZYkVNa0VJUVFMSUFKQkVHb2tBQ0FFQzljQkFRRjhJd0JCMEFCcklnSWtBQUorUW9DQWdJRGdBQ0FBSUFFZ0FpQUVRUTl4UVFBUXR3TWlBRUVBU0EwQUdrS0FnSUNBd0g0Z0FFVU5BQm9nQkVHQUFuRUVRQ0FDSUFJckF3QkVBQUFBQUFDd25jQ2dPUU1BQ3lBQ0lBUkJCSFpCRDNGQkEzUnFLd01BSWdXOUlnRUNmeUFGbVVRQUFBQUFBQURnUVdNRVFDQUZxZ3dCQzBHQWdJQ0FlQXNpQkxlOVVRUkFJQVN0REFFTFFvQ0FnSURBZmlBQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeUVCSUFKQjBBQnFKQUFnQVF1RkFRRUJmQ01BUVJCcklnSWtBQUorUW9DQWdJRGdBQ0FBSUFKQkNHb2dBUkNiQWcwQUdrS0FnSUNBd0g0Z0Fpc0RDQ0lFdlVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWZzBBR2dKK0lBU2RJZ1NaUkFBQUFBQUFBT0JEWXdSQUlBU3dEQUVMUW9DQWdJQ0FnSUNBZ0g4TEVMZ0RyUXNoQVNBQ1FSQnFKQUFnQVF1R0FRRUJmZ0pBSUFGQy8vLy8vMjlZQkVBZ0FCQWtEQUVMQWtBZ0F5a0RBQ0lFUW9DQWdJQndnMEtBZ0lDQWtIOVNEUUFnQUNBRUVERWlBa1VOQVNBQUlBSVFFMEVSSVFNQ1FBSkFBa0FnQWtIR0FHc09CZ0lEQVFNREFnQUxJQUpCRmtjTkFndEJFQ0VEQ3lBQUlBRWdBeENRQWc4TElBQkJ0aXRCQUJBVkMwS0FnSUNBNEFBTGxnRUJBWHdqQUVFUWF5SUNKQUFDZmtLQWdJQ0E0QUFnQUNBQ1FRaHFJQUVRbXdJTkFCb2dBaXNEQ0NJRXZTSUJBbjhnQkpsRUFBQUFBQUFBNEVGakJFQWdCS29NQVF0QmdJQ0FnSGdMSWdDM3ZWRUVRQ0FBclF3QkMwS0FnSUNBd0g0Z0FVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NoQVNBQ1FSQnFKQUFnQVF2c0FnSURmd0Y4SXdCQjBBQnJJZ1FrQUNBRVFSQnFRUUJCT0JBckdpQUVRb0NBZ0lDQWdJRDRQemNESUVLQWdJQ0F3SDRoQVFKQUlBSkZEUUJCQnlBQ0lBSkJCMDRiSWdKQkFDQUNRUUJLR3lFQ0EwQWdBaUFGUndSQUlBQWdCRUVJYWlBRElBVkJBM1FpQm1vcEF3QVFRZ1JBUW9DQWdJRGdBQ0VCREFNTElBUXJBd2dpQjcxQ2dJQ0FnSUNBZ1BqL0FJTkNnSUNBZ0lDQWdQai9BRkVOQWlBRVFSQnFJQVpxSUFlZE9RTUFBa0FnQlEwQUlBUXJBeEFpQjBRQUFBQUFBQUFBQUdaRklBZEVBQUFBQUFBQVdVQmpSWElOQUNBRUlBZEVBQUFBQUFDd25VQ2dPUU1RQ3lBRlFRRnFJUVVNQVFzTElBUkJFR3BCQUJEZ0FpSUh2U0lCQW44Z0I1bEVBQUFBQUFBQTRFRmpCRUFnQjZvTUFRdEJnSUNBZ0hnTElnVzN2VkVFUUNBRnJTRUJEQUVMUW9DQWdJREFmaUFCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYklRRUxJQVJCMEFCcUpBQWdBUXRXQUJEUUJDSUJRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUJRdi8vLy84UGd3OExRb0NBZ0lEQWZpQUJ1YjBpQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c0lBRUtBZ0lDQU1BdXFIUUlHZndSK0l3QkIwQUJySWdZa0FBSkFBa0FnQUVFUWFpSURRWWdDSUFBb0FnQVJBd0FpQVVVTkFDQUJRUVZxUVFCQmd3SVFLeG9nQVVFRk9nQUVJQUZCQVRZQ0FDQUFLQUpRSWdRZ0FVRUlhaUlGTmdJRUlBRWdBRUhRQUdvMkFnd2dBU0FFTmdJSUlBQWdCVFlDVUNBQklBTWdBQ2dDUUVFRGRDQUFLQUlBRVFNQUlnUTJBaWdnQkVVRVFDQURJQUVnQUNnQ0JCRUFBQXdCQ3lBQklBQTJBaEFnQUNnQ1NDSURJQUZCRkdvaUJUWUNCQ0FCSUFCQnlBQnFOZ0lZSUFFZ0F6WUNGQ0FBSUFVMkFrZ2dBVUx4Z0lDQWdEazNBdHdCSUFFZ0FFSFlBV28yQXRnQklBQW9Ba0FpQUVFQUlBQkJBRW9iSVFBRFFDQUFJQUpHUlFSQUlBUWdBa0VEZEdwQ2dJQ0FnQ0EzQXdBZ0FrRUJhaUVDREFFTEN5QUJRb0NBZ0lBZ053TlFJQUZDZ0lDQWdDQTNBMGdnQVVLQWdJQ0FJRGNEUUNBQklBRkI5QUZxSWdBMkF2Z0JJQUVnQURZQzlBRWdBVUtBZ0lDQUlCQkhJUWNnQVNnQ0tDQUhOd01JUVFBaEFpQUJJQUZCRVVITW5nRkJBRUVBUVFBZ0J4RHhBU0lITndNd0lBZENJSWluUVhWUEJFQWdCNmNpQUNBQUtBSUFRUUZxTmdJQUN5QUJLQUlvSUFjM0EyZ2dBUkEwSVFjZ0FTZ0NLQ0FITndNWUlBRWdCMEdRMVFGQkF4QWlBMEFnQVNnQ0tDRUFJQUpCQ0VaRkJFQWdBa0VDZEVHUXBnRnFLQUlBSVFNZ0FTQUJJQUFwQXhnUVJ5SUhRVFlnQVNBREVNb0VRUU1RR1JvZ0FTQUhRVE1nQVVFdkVDMUJBeEFaR2lBQklBSkJBM1JxSUFjM0ExZ2dBa0VCYWlFQ0RBRUxDeUFCSUFBcEF3aEJBaEJKSVFjZ0FTZ0NLQ0FITndNUVFRQWhBaUFCSUFFZ0I2ZEJBQ0FIUXYvLy8vOXZWaHRCQVJERkJEWUNKQ0FCSUFGQkpHcEJBRUV3UVFvUXd3UWFJQUVnQVVFU1FRQkJBQkRlQWpjRHNBRWdBVUVUUVFCQkFCRGVBaUVISUFFZ0FTa0RNRUhQQUVLQWdJQ0FNQ0FISUFFcEE3QUJRWUV5RUcwYUlBRWdBU2tETUVITkFFS0FnSUNBTUNBSElBRXBBN0FCUVlFeUVHMGFJQUVnQnhBUElBRWdBU0FISUFFZ0FVR3dBV3BCQVJDeEJoQVBJQUVnQVJBME53UEFBU0FCSUFGQ2dJQ0FnQ0FRUnpjRHlBRWdBU0FCUWM0eFFSUkJBU0FCS0FJb0tRTUlFTDhCUWNEVkFVRVdFQ0lnQVNBQktBSW9LUU1JUWFEWUFVRUxFQ0lnQVNBQktRTXdRZERaQVVFSEVDSWdBU0FCUVJWQjM4d0FRUUZCQlVFQUVJSUJJZ2MzQXpnZ0IwSWdpS2RCZFU4RVFDQUhweUlBSUFBb0FnQkJBV28yQWdBTElBRWdCMEhmekFBZ0FTa0RNQkRlQVNBQklBRkJGa0c4d0FCQkFVRUZRWDhRZ2dFaUIwRzh3QUFnQVNnQ0tDa0RHQkRlQVFOQUlBSkJDRVpGQkVBZ0FTQUJRUllnQWtFQ2RFR1FwZ0ZxS0FJQUlnQkJBa0VCSUFKQkIwWWJRUVVnQWlBSEVQRUJJQUFnQVNBQ1FRTjBhaWtEV0JEZUFTQUNRUUZxSVFJTUFRc0xJQUVnQVJBMElnYzNBNWdCSUFFZ0IwSEEyZ0ZCQVJBaUlBRWdBU2dDS0NrREVFSFEyZ0ZCSUJBaUlBRkIxeDlCRjBFQklBRW9BaWdwQXhBUXZ3RWlCMElnaUtkQmRVOEVRQ0FIcHlJQUlBQW9BZ0JCQVdvMkFnQUxJQUVnQnpjRFFDQUJJQWRCME40QlFRUVFJaUFHUWJDbUFVSEtBQkFmSWdNaEFrSGpBQ0VBSUFGQ2dJQ0FnQ0FRUnlFSEEwQWdBRUgvQVhFRVFDQUJJQWNnQWtLQmdJQ0FFRUVIRU84QkdpQUNFRDhnQW1wQkFXb2lBaTBBQUNFQURBRUxDeUFCSUFFb0FpZ3BBeEJCMndFZ0IwRUJFQmthSUFFZ0FTQUJLQUlvS1FNUUlnZEI2d0FnQjBFQUVCUTNBNmdCSUFFZ0FTa0RtQUVRUnlFSElBRW9BaWdnQnpjRDRBSWdBU0FIUVpEZkFVRUNFQ0lnQVNBQktRUEFBVUd3M3dGQkRoQWlJQUVnQVNnQ0tDa0RDRUVFRUVraEJ5QUJLQUlvSUFjM0F5QWdBU0FIUWdBUTJ3RWdBU0FCS0FJb0tRTWdRZURoQVVFR0VDSWdBU0FCUVlmSUFFRVlRUUVnQVNnQ0tDa0RJQkMvQVVIQTRnRkJEaEFpSUFFZ0FTZ0NLQ2tEQ0VFR0VFa2hCeUFCS0FJb0lBYzNBekFnQVNBSFFvQ0FnSUFRRU5zQklBRWdBU2dDS0NrRE1FR2c1QUZCQWhBaUlBRkI4dEVBUVJsQkFTQUJLQUlvS1FNd0VMOEJHaUFCSUFFb0FpZ3BBd2hCQlJCSklRY2dBU2dDS0NBSE53TW9JQUVnQnlBQlFTOFFMUkRiQVNBQklBRkIwTndBUVJwQkFTQUJLQUlvS1FNb0VMOEJRY0RrQVVFREVDSWdBU0FCS0FJb0tRTW9RZkRrQVVFeEVDSWdBU0FCS1FPWUFSQkhJUWNnQVNnQ0tDQUhOd1BvQWlBQklBZEI4T3NCUVFJUUlpQURFS01FSUFGQ0FTQUROQUlJSUFNcEF3QkN3SVE5Zm53aUJ5QUhRZ0ZZR3pjRDBBRWdBU0FCS1FQQUFVR1E3QUZCQVJBaUlBRWdBU2tEd0FGQjRQRUJRUUVRSWlBQkVEUWhCeUFCS0FJb0lBYzNBemdnQVNBSFFkRHpBVUVGRUNJZ0FTQUJRWVBUQUVFYlFRQWdBU2dDS0NrRE9CQy9BU0lIUWFEMEFVRUNFQ0pCMEFFaEFpQUJJUUFEUUNBQ1FkNEJSa1VFUUNBQUlBY2dBQ2dDRUNBRElBSVFrQUVpQkVFdUVLWURJZ1ZCQVdvZ0JDQUZHeUFBSUFJUVhFRUFFTzhCR2lBQ1FRRnFJUUlNQVFzTElBQWdBQ2tEbUFFUVJ5RUhJQUFvQWlnZ0J6Y0QrQUlnQUNBSFFjRDBBVUVFRUNJZ0FDQUFLUU13RUVjaEJ5QUFLQUlvSUFjM0E0QUJJQUJCRlVISXpBQkJBVUVGUVFFUWdnRWhCeUFBSUFBb0FpZ3BBNEFCUVlEMUFVRUJFQ0lnQUNBQUtBSW9JZ0lwQTRBQklBSXBBL2dDUVFGQkFSQ1dBaUFBSUFjZ0FDZ0NLQ2tEZ0FGQkFFRUJFSllDSUFBZ0J4QVBJQUFnQUVFY1FiblZBRUVCRU40Q0lnYzNBN2dCSUFBcEE4QUJJUWdnQjBJZ2lLZEJkVThFUUNBSHB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFBZ0NFRTZJQWRCQXhBWkdpQUFLUVBBQVNJSFFpQ0lwMEYxVHdSQUlBZW5JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUhRWW9CSUFkQkF4QVpHaUFBRURRaEJ5QUFLQUlvSUFjM0ExQWdBQ0FIUWRETEFVRXZFQ0lnQUNBQVFlWGlBRUVkUVFjZ0FDZ0NLQ2tEVUJDL0FVSEEwZ0ZCQXhBaUlBQkJIallDZ0FJZ0FDQUFLQUlvS1FNb1FaREJBVUVCRUNJZ0FFRWZOZ0w4QVNBQUVEUWhCeUFBS0FJb0lBYzNBNUFCSUFBZ0IwR2d3UUZCRVJBaUlBQkJ0c2tBUVNCQkFpQUFLQUlvS1FPUUFSQy9BU0lIUWlDSXAwRjFUd1JBSUFlbklnSWdBaWdDQUVFQmFqWUNBQXNnQUNBSE53TklJQUFnQjBHd3d3RkJBUkFpSUFBZ0FDa0RtQUVRUnlFSElBQW9BaWdnQnpjRDhBSWdBQ0FIUWNEREFVRUNFQ0lnQUNBQUtRUEFBVUhnd3dGQkFSQWlBa0FnQUNnQ0VDSUNLQUpBUVRGUEJFQWdBaWdDUkNnQ2dBa05BUXNnQWtIWXBBRkJNRUVCRU0wREdpQUNLQUpFSWdKQmtBbHFRU0UyQWdBZ0FrR1VDV3BCNUtRQk5nSUFDeUFBUVNKQjBScEJBa0VDUVFBUWdnRWlCMEtBZ0lDQWNGb0VRQ0FIcHlJQ0lBSXRBQVZCRUhJNkFBVUxJQUFnQjBHZ3hBRkJBUkFpSUFBZ0FDa0R3QUZCMFJvZ0IwRURFTzhCR2tFQUlRSURRQUpBSUFKQkJFWUVRRUVBSVFJRFFDQUNRUUpHRFFJZ0FDQUFLUU9ZQVJCSElRY2dBQ2dDS0NBQ1FRTjBhaUFITndQUUFpQUFJQWNnQWtFQ2RFR1FwUUZxS0FJQUlBSkJuS1VCYWkwQUFCQWlJQUpCQVdvaEFnd0FDd0FMSUFBb0FoQWdBeUFDUWJVQmFoQ1FBU0VFSUFBUU5DRUhJQUpCSm1wQkEzUWlCU0FBS0FJb2FpQUhOd01BSUFBZ0J5QUNRUUowUVlDbEFXb29BZ0FnQWtHWXBRRnFMUUFBRUNJZ0FFRWpJQVJCQUVFRElBSVFnZ0VoQnlBQ1FRRk5CRUFnQUNBSFFmRElBVUVCRUNJTElBQWdCeUFFSUFBb0FpZ2dCV29wQXdBUTNnRWdBa0VCYWlFQ0RBRUxDeUFBRURRaEJ5QUFLQUlvSUFjM0E1Z0JJQUFnQjBHUTlRRkJBeEFpSUFBZ0FFSGt4Z0JCSkNBQUtBSW9LUU9ZQVJDWEJFSEE5UUZCQWhBaUlBQVFOQ0VISUFBb0FpZ2dCemNEb0FFZ0FDQUhRZUQxQVVFREVDSWdBQ0FBUWIzR0FFRWxJQUFvQWlncEE2QUJFSmNFUVpEMkFVRUJFQ0lnQUNBQUVEUWlCMEdnOWdGQkhoQWlJQUFnQjBFM0lBQWdBQ2dDS0NrREVDSUlRVGNnQ0VFQUVCUkJBeEFaR2lBQUlBQkJKa0hTSDBFQUVONENJZ2hCZ1BvQlFRTVFJaUFBSUFnZ0J4RDdCVUVWSVFJRFFDQUNRU0JHUlFSQUlBRWdCeEJISVFrZ0FrRURkQ0lBSUFFb0FpaHFJQWszQXdBZ0FTQUpRY1dCQVVFQklBSkI1YVlCYWkwQUFIU3RJZ2xCQUJEdkFSb2dBU0FCUVNjZ0FTZ0NFQ0FESUFKQmpnRnFFSkFCSWdSQkEwRURJQUlnQ0JEeEFTSUtJQVFnQVNnQ0tDQUFhaWtEQUJEZUFTQUJJQXBCeFlFQklBbEJBQkR2QVJvZ0FrRUJhaUVDREFFTEN5QUJJQWNRRHlBQklBZ1FEeUFCRURRaEJ5QUJLQUlvSUFjM0E0QUNJQUVnQjBHdytnRkJHQkFpSUFGQnV5SkJLQ0FCS0FJb0tRT0FBaENYQkJvQ1FDQUJLQUlRSWdBb0FrQkJNazhFUUNBQUtBSkVLQUtZQ1EwQkN5QUFRYUNsQVVFeFFRa1F6UU1hSUFBb0FrUWlBRUhRQ21wQktUWUNBQ0FBUWFBS2FrRXFOZ0lBSUFCQmlBcHFRU28yQWdBZ0FFSHdDV3BCS3pZQ0FDQUFRZGdKYWtFc05nSUFJQUJCd0FscVFTdzJBZ0FMSUFFUU5DRUhJQUVvQWlnZ0J6Y0RpQU1nQVNBSFFZREpBVUVFRUNJZ0FVRXRRYWZqQUVFQlFRSkJBQkNDQVNJSFFpQ0lwMEYxVHdSQUlBZW5JZ0FnQUNnQ0FFRUJhallDQUFzZ0FTQUhOd05RSUFFZ0IwSEF5UUZCQnhBaUlBRWdCMEduNHdBZ0FTZ0NLQ2tEaUFNUTNnRWdBU0FCS1FNd0VFY2hCeUFCS0FJb0lBYzNBNkFESUFGQkZVSGF6QUJCQVVFRlFRSWdBU2tET0JEeEFTRUhJQUVnQVNnQ0tDa0RvQU5Cc01vQlFRRVFJaUFCSUFjZ0FTZ0NLQ2tEb0FOQkFFRUJFSllDSUFFZ0J4QVBJQUVnQVJBMElnYzNBNkFCSUFFZ0IwSEF5Z0ZCQVJBaUlBRWdBU2tEb0FFUVJ5RUhJQUVvQWlnZ0J6Y0R1QU1nQVNBSFFkREtBVUVERUNJZ0FTQUJLUU9nQVJCSElRY2dBU2dDS0NBSE53UElBeUFCSUFkQmdNc0JRUVFRSWlBQklBRXBBekFRUnlFSElBRW9BaWdnQnpjRHdBTWdBVUVWUWNQTUFFRUJRUVZCQXlBQktRTTRFUEVCSVFjZ0FTQUJLQUlvS1FQQUEwSEF5d0ZCQVJBaUlBRWdBU2dDS0NJQUtRUEFBeUFBS1FQSUEwRUJRUUVRbGdJZ0FTQUhJQUVvQWlncEE4QURRUUJCQVJDV0FpQUJJQWNRRHlBQktBSVFJZ0JCTGpZQ2xBSWdBRUV2TmdLa0FpQUFRVEEyQXFBQ0lBQkJNVFlDbkFJZ0FFRXlOZ0tZQWlBQkVEUWhCeUFCS0FJb0lBYzNBNGdDSUFFZ0IwR0Ewd0ZCQXhBaUlBRWdBVUdJTFVFelFRRWdBU2dDS0NrRGlBSVF2d0ZCc05NQlFRNFFJZ3dCQzBFQUlRRUxJQVpCMEFCcUpBQWdBUXNIQUNBQUVOOEVDNGNDQVFoL0FuNGdBQ2dDRUNnQ2VDTUFJZ2NpRENBQnB5Z0NJQ0lJS0FJUUlna2dBMm9pQzBFRGRDSUthMHNFUUNBQUVPa0JRb0NBZ0lEZ0FBd0JDeUFKUVFBZ0NVRUFTaHNoRFNBSElBcEJEMnBCY0hGcklnY2tBQU4rSUFZZ0RVWUVma0VBSVFZZ0EwRUFJQU5CQUVvYklRTURRQ0FESUFaR1JRUkFJQWNnQmlBSmFrRURkR29nQkNBR1FRTjBhaWtEQURjREFDQUdRUUZxSVFZTUFRc0xJQVZCQVhFRVFDQUFJQUVnQWhCU0lRTWdBQ0FJS1FNQUlnRWdBU0FDSUFNYklBc2dCeENRQXd3REN5QUFJQWdwQXdBZ0NDa0RDQ0FMSUFjUUlRVWdCeUFHUVFOMElncHFJQWdnQ21vcEF4ZzNBd0FnQmtFQmFpRUdEQUVMQ3dzaEFTQU1KQUFnQVF1eEFRRUJmeUFBUWNnQUVGOGlCUVJBSUFWQkFEWUNBQUpBSUFBZ0JVRUlhaUlHSUFFZ0FpQURJQVFRN1FNRVFDQUZRUVEyQWdBTUFRc2dBQ0FHRUxRQ0lnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQUlRRHlBQUlBRkJMeEJsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQlFvQ0FnSUJ3V2dSQUlBR25JQVUyQWlBTElBRVBDeUFBS0FJUUlBVVE3QU1nQUNnQ0VDSUFRUkJxSUFVZ0FDZ0NCQkVBQUF0Q2dJQ0FnT0FBQzRnSEFnbC9BWHdqQUVGQWFpSUdKQUFDUUNBQUtBSVFJZ29vQW5nZ0JpQUJweUlJTFFBb0lndEJBM1FpREd0TEJFQWdBQkRwQVVLQWdJQ0E0QUFoQVF3QkN5QUlMUUFwSVEwZ0JpQUtLQUtNQVNJQU5nSVFJQW9nQmtFUWFqWUNqQUVnQUFSL0lBQW9BaWhCQkhFRlFRQUxJUUFnQ0NnQ0lDRUhJQVlnQVRjREdDQUdJQUEyQWpnZ0JpQUROZ0kwQWtBZ0F5QUxUZ1JBSUFRaEFBd0JDeUFEUVFBZ0EwRUFTaHNoRGlBR0lBeEJEMnBCOEI5eGF5SUFKQUFEUUNBSklBNUdCRUFnQXlFRUEwQWdCQ0FMUmtVRVFDQUFJQVJCQTNScVFvQ0FnSUF3TndNQUlBUkJBV29oQkF3QkN3c2dCaUFMTmdJMEJTQUFJQWxCQTNRaURHb2dCQ0FNYWlrREFEY0RBQ0FKUVFGcUlRa01BUXNMQ3lBR0lBQTJBaUFnQ0NnQ0pDRUVBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUEwT0RRc0NBQUVBQVFjSUF3UUZCZ2tLQ3lBRlFRRnhEUXBDZ0lDQWdEQWhBaUFOUVFKSERRb01Dd3NnQlVFQmNRMEFRb0NBZ0lBd0lRSWdEVUVEUmcwS0N5QUhJQUlnQXlBQUlBZ3VBU29nQkJFRkFDRUJEQXNMSUFjZ0FpQUVFUWdBSVFFTUNnc2dCeUFDSUFBcEF3QWdCQkVZQUNFQkRBa0xJQWNnQWlBSUxnRXFJQVFSRUFBaEFRd0lDeUFISUFJZ0FDa0RBQ0FJTGdFcUlBUVJOQUFoQVF3SEN5QUhJQVpCQ0dvZ0FDa0RBQkJDRFFVZ0Jpc0RDQ0FFRVFzQUlnKzlJZ0VDZnlBUG1VUUFBQUFBQUFEZ1FXTUVRQ0FQcWd3QkMwR0FnSUNBZUFzaUFMZTlVUVJBSUFDdElRRU1Cd3RDZ0lDQWdNQitJQUZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzaEFRd0dDMEtBZ0lDQTRBQWhBU0FISUFaQkNHb2dBQ2tEQUJCQ0RRVWdCeUFHSUFBcEF3Z1FRZzBGSUFZckF3Z2dCaXNEQUNBRUVTTUFJZys5SWdFQ2Z5QVBtVVFBQUFBQUFBRGdRV01FUUNBUHFnd0JDMEdBZ0lDQWVBc2lBTGU5VVFSQUlBQ3RJUUVNQmd0Q2dJQ0FnTUIrSUFGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2hBUXdGQ3lBSElBSWdBeUFBSUFaQkNHb2dDQzRCS2lBRUVSSUFJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQ0FHS0FJSUlnQkJBa1lOQkNBSElBRWdBQkQvQWlFQkRBUUxFQUVBQ3lBSElBSWdBeUFBSUFRUkFnQWhBUXdDQ3lBSFFad2lRUUFRRlF0Q2dJQ0FnT0FBSVFFTElBb2dCaWdDRURZQ2pBRUxJQVpCUUdza0FDQUJDOVVCQVFWL0l3QWlCU0VJQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlHTHdFR1FROUhEUUFnQmlnQ0lDRUhDeUFBSUFJZ0F5QURJQWN0QUFRaUFFZ0VmMEVBSVFZZ0EwRUFJQU5CQUVvYklRa2dCU0FBUVFOMFFROXFRZkFmY1dzaUJTUUFBMzhnQmlBSlJnUi9JQU1oQkFOL0lBQWdCRVlFZnlBRkJTQUZJQVJCQTNScVFvQ0FnSUF3TndNQUlBUkJBV29oQkF3QkN3c0ZJQVVnQmtFRGRDSUthaUFFSUFwcUtRTUFOd01BSUFaQkFXb2hCZ3dCQ3dzRklBUUxJQWN2QVFZZ0IwRUlhaUFIS0FJQUVSSUFJUUVnQ0NRQUlBRUwwd29DRDM4QmZpTUFRVEJySWdVa0FBSkFJQUFnQVJCWklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFBSkFJQUFnQVJBb0loTkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFRi9JUVFNQVFzQ1FDQUFRUUVnRTZjaURDZ0NCRUgvLy8vL0IzRWlCaUFHUVFGTkcwRUNkQkFwSWd0RkJFQkJmeUVFREFFTElBVkJBRFlDRUFOQUlBWWdCMHdOQVNBTElBUkJBblJxSUF3Z0JVRVFhaERKQVRZQ0FDQUVRUUZxSVFRZ0JTZ0NFQ0VIREFBTEFBc2dBQ0FURUE4TElBQWdBUkFQUW9DQWdJRGdBQ0VCSUFSQkFFZ05BQUpBQWtBZ0FrVU5BQ0FES1FNQUloTkNnSUNBZ0hDRFFvQ0FnSUF3VVEwQUFrQWdBQ0FGUVF4cUlCTVE1UUVpQWdSQUFrQWdBaTBBQUVIT0FFY05BQ0FDTFFBQlFjWUFSdzBBSUFKQkEwRUNJQUl0QUFKQnl3QkdJZ01iYWkwQUFDSUdRY01BYTBIL0FYRkJBVXNOQUNBRktBSU1JQUpCQTJvZ0FrRUNhaUFER3lBQ2EwRUJha1lOQWdzZ0FDQUNFRlFnQUVHQzBnQkJBQkJRQ3lBQVFSQnFJUkFnQ3lFR0RBSUxJQUFnQWhCVUlBWWdBMEVCZEdwQnd3QnJJUWdMSUFBb0FoQWhBaUFGUWdBM0F4Z2dCVUlBTndNUUlBVWdBallDSkNBRlFUczJBaUFnQUNJTVFSQnFJUkJCZnlFQUFrQWdCVUVRYWlBRVFRSjBJZ0lReGdFRVFFRUFJUVlNQVFzQ1FDQUlSUVJBUVFBaEJ5QUVRUUFnQkVFQVNoc2hBd05BSUFNZ0IwWU5BaUFIUVFKMElRWWdCMEVCYWlFSElBWWdDMm9vQWdCQi93Rk5EUUFMQ3lBRlFSQnFJQXNnQkNBSVFRRjJFT3dFUVFBaEJpQUZLQUljRFFFZ0JTZ0NGQ0lIUVFKMklnQkJBV3NoQ2tFQUlRSWdCU2dDRUNFR0EwQUNRQ0FBSUFKS0JFQWdCaUFDSWdSQkFuUnFLQUlBRUtZQ1JRMEJBMEFnQkNBS1JnUkFJQUFoQWd3REN5QUdJQVJCQVdvaUEwRUNkR29vQWdBaURSQ21BaUlKQkVBRFFBSkFJQUlnQkVvTkFDQUdJQVJCQW5ScUlnNG9BZ0FpRHhDbUFpQUpUQTBBSUE0Z0R6WUNCQ0FFUVFGcklRUU1BUXNMSUFSQkFuUWdCbW9nRFRZQ0JDQURJUVFNQVFVZ0F5RUNEQU1MQUFzQUN5QUlRUUZ4SUFkQkNFbHlEUU5CQVNBQUlBQkJBVTBiSVE1QkFTRUlRUUVoQUFOQUlBZ2dEa1lOQkNBR0lBaEJBblJxS0FJQUlnTVFwZ0loQnlBQUlRUUNRQUpBQTBBZ0JFRUFUQTBCSUFZZ0JFRUJheUlFUVFKMGFpSVBLQUlBSWdJUXBnSWlDZ1JBSUFjZ0Nrb2hBa0dBQWlFSElBSU5BUXdDQ3dzQ1FDQURRZUVpYTBFVVN5QUNRWUFpYTBFU1MzSkZCRUFnQTBFY2JDQUNRY3dFYkdwQm5JMmhBV3NoQnd3QkN3SkFJQUpCZ05nQ2F5SUVRYVBYQUVzTkFDQUVRZi8vQTNGQkhIQWdBMEduSTJzaUJFRWJTM0lOQUNBQ0lBUnFJUWNNQVF0QnNBY2hCRUVBSVFvRFFDQUVJQXBJRFFJZ0JVRW9haUFFSUFwcVFRSnRJZzFCQVhSQjhORURhaThCQUNJSFFRWjJJaEZCQW5SQmtPSUNhaWdDQUNJSlFRNTJJaElnQjBFL2NXb2lCeUFSSUJJZ0NVRUhka0gvQUhFZ0NVRUJka0UvY1JEckJCb2dBeUFGS0FJc2F5QUNJQVVvQWlnaUNXc2dBaUFKUmhzaUNVRUFTQVJBSUExQkFXc2hCQXdCQ3lBSkJFQWdEVUVCYWlFS0RBRUxDeUFIUlEwQkN5QVBJQWMyQWdBTUFRc2dCaUFBUVFKMGFpQUROZ0lBSUFCQkFXb2hBQXNnQ0VFQmFpRUlEQUFMQUFzZ0FrRUJhaUVDREFBTEFBc2dCU2dDRUNJR0lBc2dBaEFmR2lBRUlRQUxJQXdvQWhBaUFrRVFhaUFMSUFJb0FnUVJBQUFnQUVFQVNBMEJJQXdnQlVFUWFpQUFFRDBOQUVFQUlRUUNRQU5BSUFBZ0JFWU5BU0FFUVFKMElRSWdCRUVCYWlFRUlBVkJFR29nQWlBR2FpZ0NBQkM1QVVVTkFBc2dCU2dDRUNnQ0VDSUFRUkJxSUFVb0FoUWdBQ2dDQkJFQUFBd0JDeUFGUVJCcUVEWWhBUXNnRUNnQ0FDSUFRUkJxSUFZZ0FDZ0NCQkVBQUFzZ0JVRXdhaVFBSUFFTDdBY0NDMzRFZnlNQVFUQnJJZzhrQUFKQUlBRkMvLy8vLzI5WUJFQWdBQkFrUW9DQWdJRGdBQ0VCREFFTFFvQ0FnSUF3SVFZQ1FBSkFJQUFnQXlrREFCQW9JZ3RDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRUtBZ0lDQU1DRUhRb0NBZ0lBd0lRRkNnSUNBZ0RBaENVS0FnSUNBTUNFTURBRUxJQUFnQVNBQUtRTklFT01CSWd4Q2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0FNQ0VIUW9DQWdJQXdJUUZDZ0lDQWdEQWhDUXdCQ3dKQUFrQWdBQ0FBSUFGQjdRQWdBVUVBRUJRUU55SUpRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdDYWNpQWtIMUFFRUFFTWNCSVJJZ0FrSDVBRUVBRU1jQlFRQklCRUFnQUVITW5nRWdDVUhzSHhDK0FTSUpRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRUxJQThnQ1RjREtDQVBJQUUzQXlBZ0FDQU1RUUlnRDBFZ2FoQ25BU0lIUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQUJBK0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFS0FnSUNBNEFBaEFRd0RDMEYvSVFJQ1FDQURLUU1JSWdSQ2dJQ0FnSENEUW9DQWdJQXdVUTBBSUFBZ0QwRWNhaUFFRUhkQkFFZ05BeUFQS0FJY0lnSU5BQXdFQ3dKK0lBdW5JaEFwQWdRaUJLZEIvLy8vL3dkeEloRUVRQ0FTUVg5elFSOTJJUklnQkVMLy8vLy9CNE1oRFNBQ3JTRU9RUUFoQWdOQUlBS3RJUVFnQWlFREEwQWdBeUFSVHdSQUlBQWdFQ0FDSUJFZ0FpQVJTUnNnRVJDRUFRd0VDeUFBSUFkQjFRQWdBNjBpQ2hCRlFRQklEUVlnQUNBR0VBOENRQ0FBSUFjZ0N4RElBU0lHUW9DQWdJQndneUlGUW9DQWdJQWdVZ1JBSUFWQ2dJQ0FnT0FBVVEwSUlBQWdEMEVRYWlBQUlBZEIxUUFnQjBFQUVCUVFvd0VOQ0NBUElBOHBBeEFpQlNBTklBVWdEVk1iSWdVM0F4QWdCQ0FGVWcwQkN5QVFJQW9nRWhEeEFxY2hBd3dCQ3dzZ0FDQVFJQUlnQXhDRUFTSUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRVWdBQ0FCSUFnZ0JCQnFRUUJJRFFVZ0NFSUJmQ0lFSUE1UkRRWWdBQ0FQUVFocUlBWVFQQTBGSUFXbklRSkNBU0VGSUFoQ0FTQVBLUU1JSWdvZ0NrSUJWeHQ4SVFnRFFDQUVJQWhSQkVBZ0JDRUlEQUlMSUFBZ0FDQUdJQVVRY3hBM0lncENnSUNBZ0hDRFFvQ0FnSURnQUZFTkJpQUFJQUVnQkNBS0VHcEJBRWdOQmlBRlFnRjhJUVVnQkVJQmZDSUVJQTVTRFFBTEN3d0ZDeUFBSUFjZ0N4RElBU0lHUW9DQWdJQndneUlFUW9DQWdJRGdBRkVOQXlBRVFvQ0FnSUFnVWcwRUlBQWdFRUVBUVFBUWhBRUxJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BaUFBSUFFZ0NDQUVFR3BCQUU0TkF3d0NDMEtBZ0lDQU1DRUhDMEtBZ0lDQU1DRUJDeUFBSUFFUUQwS0FnSUNBNEFBaEFRc2dBQ0FMRUE4Z0FDQU1FQThnQUNBSEVBOGdBQ0FKRUE4Z0FDQUdFQThMSUE5Qk1Hb2tBQ0FCQytBQ0FRWitJQUZDLy8vLy8yOVlCRUFnQUJBa1FvQ0FnSURnQUE4TFFvQ0FnSURnQUNFSVFvQ0FnSUF3SVFZQ1FBSkFBa0FnQUNBREtRTUFFQ2dpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBUW9DQWdJQXdJUVFNQVFzZ0FDQUJRZFVBSUFGQkFCQVVJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFSQ0FCQlNSUVJBSUFBZ0FVSFZBRUlBRUVWQkFFZ05BUXNnQUNBQklBY1F5QUVpQlVLQWdJQ0FjSU1pQ1VLQWdJQ0E0QUJSRFFFZ0FDQUJRZFVBSUFGQkFCQVVJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BUUpBSUFBZ0JpQUVFRklFUUNBQUlBUVFEd3dCQ3lBQUlBRkIxUUFnQkJCRlFRQk9EUUJDZ0lDQWdEQWhCQXdDQ3lBQUlBY1FEeUFBSUFZUUQwTC8vLy8vRHlFSUlBbENnSUNBZ0NCUkRRSWdBQ0FGUWRjQUlBVkJBQkFVSVFFZ0FDQUZFQThnQVE4TFFvQ0FnSUF3SVFVTElBQWdCUkFQSUFBZ0J4QVBJQUFnQmhBUElBQWdCQkFQQ3lBSUM4MEVBZ1orQVg4akFFRWdheUlDSkFBQ1FDQUJRdi8vLy85dldBUkFJQUFRSkVLQWdJQ0E0QUFoQnd3QkMwS0FnSUNBNEFBaEIwS0FnSUNBTUNFSUFrQWdBQ0FES1FNQUVDZ2lDVUtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFRb0NBZ0lBd0lRUkNnSUNBZ0RBaEJVS0FnSUNBTUNFR0RBRUxBa0FDUUNBQUlBRWdBQ2tEU0JEakFTSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQkNnSUNBZ0RBaEJBd0JDeUFBSUFBZ0FVSHRBQ0FCUVFBUUZCQTNJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5BUXRDZ0lDQWdEQWhCUXdCQ3lBQ0lBUTNBeGdnQWlBQk53TVFJQUFnQmtFQ0lBSkJFR29RcHdFaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdBa0VJYWlBQUlBRkIxUUFnQVVFQUVCUVFvd0VOQUNBQUlBVkIxUUFDZmlBQ0tRTUlJZ0ZDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQUZDLy8vLy93K0REQUVMUW9DQWdJREFmaUFCdWIwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUlVFQVNBMEFRb0NBZ0lEZ0FDRUlJQUJCTGhCMklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFRU0FRS1NJRFJRUkFJQUVoQ0F3QkN5QURJQWszQXdnZ0F5QUZOd01BSUFNZ0JLY2lDa0huQUVFQUVNY0JRWDl6UVI5Mk5nSVFJQXBCOVFCQkFCREhBU0VLSUFOQkFEWUNHQ0FESUFwQmYzTkJIM1kyQWhRZ0FVS0FnSUNBY0ZvRVFDQUJweUFETmdJZ0N5QUFJQVlRRHlBQUlBUVFEeUFCSVFjTUFRc2dBQ0FKRUE4Z0FDQUdFQThnQUNBRUVBOGdBQ0FGRUE4Z0FDQUlFQThMSUFKQklHb2tBQ0FIQzc0RUFnZCtBbjhqQUVFUWF5SUNKQUFDUUNBQlF2Ly8vLzl2V0FSQUlBQVFKRUtBZ0lDQTRBQWhCZ3dCQzBLQWdJQ0E0QUFoQmtLQWdJQ0FNQ0VGQWtBZ0FBSitBa0FnQUNBREtRTUFFQ2dpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0FDQUJRZTRBSUFGQkFCQVVFQ1lpQTBFQVNBMEFJQU5GQkVBZ0FDQUJJQWNReUFFaEJnd0RDeUFBSUFBZ0FVSHZBQ0FCUVFBUUZCQW1JZ3RCQUVnTkFDQUFJQUZCMVFCQ0FCQkZRUUJJRFFCQ2dJQ0FnT0FBSUFBUVBpSUlRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWFJQWVuSVF3Q1FBTkFJQUFnQlJBUElBQWdBU0FIRU1nQklnVkNnSUNBZ0hDRElnUkNnSUNBZ0NCUkRRRUNRQ0FFUW9DQWdJRGdBRkVOQUFKL0lBQWdBQ0FGUWdBUVRSQTNJZ1JDZ0lDQWdIQ0RJZ3BDZ0lDQWdKQi9VZ1JBUVFBZ0NrS0FnSUNBNEFCU0RRRWFEQUlMSUFTbktBSUVRZi8vLy84SGNVVUxJUU1nQUNBSUlBa2dCQkNHQVVFQVNBMEFJQWxDQVh3aENTQURSUTBCSUFBZ0FrRUlhaUFBSUFGQjFRQWdBVUVBRUJRUW93RkJBRWdOQUNBQUlBRkIxUUFDZmlBTUlBSXBBd2dnQ3hEeEFpSUVRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUVRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdCTG05SWdSQ2dJQ0FnTUNCZ1B6L0FIMGdCRUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRVZCQUU0TkFRc0xJQWdNQWdzZ0NhY0VRQ0FJSVFZTUF3c2dBQ0FJRUE5Q2dJQ0FnQ0FoQmd3Q0MwS0FnSUNBTUFzUUR3c2dBQ0FGRUE4Z0FDQUhFQThMSUFKQkVHb2tBQ0FHQzQwVkFncC9EWDRqQUVHUUFXc2lCQ1FBQWtBZ0FVTC8vLy8vYjFnRVFDQUFFQ1JDZ0lDQWdPQUFJUkFNQVFzZ0F5a0RDQ0VaSUFBZ0JFRTRha0VBRUQwYUlBUkJBRFlDTUNBRVFvQ0FnSURBQURjREtDQUVJQUEyQWdBZ0JDQUVRUWhxSWdvMkFnUkNnSUNBZ09BQUlSQkNnSUNBZ0RBaEVRSkFBa0FnQUNBREtRTUFFQ2dpRkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBUW9DQWdJQXdJUk5DZ0lDQWdEQWhBVUtBZ0lDQU1DRVBRb0NBZ0lBd0lSY01BUXRDZ0lDQWdEQWhGd0pBSUFBZ0dSQTRJZ2hGQkVBZ0FDQVpFQ2dpRjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBREFJTElCZW5JUVVMSUFBZ0FDQUJRZTRBSUFGQkFCQVVFQ1lpREVFQVNBMEFJQXdFUUNBQUlBQWdBVUh2QUNBQlFRQVFGQkFtSWcxQkFFZ05BU0FBSUFGQjFRQkNBQkJGUVFCSURRRUxJQlNuSVFsQ2dJQ0FnREFoRHdKQUFrQUNRQUpBSUFWRkRRQWdERVVOQUNBRktRSUVRdi8vLy84SGcwSUFVZzBBQWtBZ0FDQUJRVHdnQVVFQUVCUWlEa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnRGlBQUtRTklFRkloQWlBQUlBNFFEeUFDUlEwQklBQWdBVUdHQVNBQlFRQVFGQ0lPUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnRGtIVkFFRUFFSVVFSVFJZ0FDQU9FQThnQWtVTkFRc2dBQ0FCRVBBQ0lnSkZEUU5CQUNFRElBQWdCRUhRQUdwQkFCQTlHaUFBSUJRUUtDSVNRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSUNRQ0FDS0FJRUlnY3RBQkFpQmtFaGNTSUtSUVJBSUFSQ0FEY0RnQUVNQVFzZ0FDQUJRZFVBSUFGQkFCQVVJZzVDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BeUFBSUFSQmdBRnFJQTRRb3dFTkF3dEJBQ0VJQWtBZ0J5MEFFU0lDUlEwQUlBQWdBa0VEZEJBcElnTU5BRUVBSVFNTUF3c2dCMEVRYWlFTUlBWkJFSEVoRFNBR1FRRnhJUWNnRXFjaUMwRVFhaUVGSUFzcEFnUWlENmRCSDNZaENTQUVLUU9BQVNFUkEwQWdFU0FQUXYvLy8vOEhnMVVOQWdKQUlBTWdEQ0FGSUJHbklBK25RZi8vLy84SGNTQUpJQUFROEFRaUFrRUJSd1JBSUFKQkFFZ05BU0FLUlNBQ1FRSkhjUTBFSUFBZ0FVSFZBRUlBRUVWQkFFZ05CUXdFQ3lBREtBSUFJUVlnQkNBREtBSUVJQVZySUFsMUlnSTJBb3dCSUFZZ0JXc2dDWFVpQmlBSVNnUkFJQVJCMEFCcUlBc2dDQ0FHRUZFTkJRc2dCMFVFUUNBQUlBRkIxUUFnQWlJSXJSQkZRUUJPRFFRTUJRc2dBaUVJQWtBZ0FpQUdSdzBBQWtBQ1FDQU5SUTBBSUFZZ0N5a0NCQ0lPcDBILy8vLy9CM0ZQRFFBZ0RrS0FnSUNBQ0lOQ0FGSU5BUXNnQkNBR1FRRnFJZ2cyQW93QkRBRUxJQXNnQkVHTUFXb1F5UUVhSUFRb0Fvd0JJUWdMSUFzcEFnUWhEeUFJckNFUklBSWhDQXdCQ3dzZ0FFR0x5d0JCQUJCR0RBSUxBa0FDUUFKQUEwQUNRQ0FBSUFFZ0ZCRElBU0lTUW9DQWdJQndneUlPUW9DQWdJQWdVZ1JBSUE1Q2dJQ0FnT0FBVVFSQUlBNGhFQXdGQ3lBRUtBSXdEUVFDUUNBRUtBSW9JZ01nQkNnQ0xFZ0VRQ0FFS0FJRUlRVU1BUXNnQXlBRFFRRjFha0VmYWtGdmNTSURRUU4wSVFjZ0JDZ0NBQ0VHQWtBQ1FDQUtJQVFvQWdRaUFrWUVRQ0FHUVFBZ0J5QUVRZEFBYWhDb0FTSUZSUTBCSUFVZ0Npa0RBRGNEQUNBRklBb3BBeGczQXhnZ0JTQUtLUU1RTndNUUlBVWdDaWtEQ0RjRENBd0NDeUFHSUFJZ0J5QUVRZEFBYWhDb0FTSUZEUUVMSUFRUTdnUWdCQ2dDQUNBU0VBOGdCRUYvTmdJd0RBWUxJQVFnQlRZQ0JDQUVJQVFvQWxCQkEzWWdBMm8yQWl3Z0JDZ0NLQ0VEQ3lBRUlBTkJBV28yQWlnZ0JTQURRUU4wYWlBU053TUFJQXdOQVVLQWdJQ0FNQ0VQQ3lBVVFpQ0lwMEYxU1NFRFFRQWhCMEVBSVFWQ2dJQ0FnREFoRTBLQWdJQ0FNQ0VCQTBBZ0JDZ0NLQ0FGU2dSQUlBQWdCRUdNQVdvZ0JDZ0NCQ0FGUVFOMGFpa0RBQ0lXRU5ZQlFRQklEUVFnQUNBUEVBOGdBQ0FBSUJaQ0FCQk5FRGNpRDBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBMSUFBZ0JFR0FBV29nQUNBV1FkY0FJQlpCQUJBVUVLTUJEUXNDUUNBRUtRT0FBU0lTSUFrcEFnUkMvLy8vL3dlREloQlZCRUFnQkNBUU53T0FBU0FRSVJJTUFRc2dFa0lBV1EwQVFnQWhFaUFFUWdBM0E0QUJDeUFBSUFFUUQwS0FnSUNBNEFBaEVDQUFFRDRpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBUW9DQWdJRGdBQ0VCREF3TElBOUNJSWluUVhWUEJFQWdENmNpQWlBQ0tBSUFRUUZxTmdJQUN5QUFJQUZDQUNBUFFZZUFBUkM5QVVFQVNBMExRUUVnQkNnQ2pBRWlBaUFDUVFGTkd5SUdyU0VhUWdFaEdBTkFJQmdnR2xJRVFDQUFJQllnR0JCekloVkNnSUNBZ0hDRElnNUNnSUNBZ0RCU0JFQWdEa0tBZ0lDQTRBQlJCRUFnRGlFUURBOExJQUFnRlJBM0loVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkJ3c2dBQ0FCSUJnZ0ZSQnFJUUlnR0VJQmZDRVlJQUpCQUU0TkFRd05Dd3NnQUNBUkVBOGdBQ0FXUVljQklCWkJBQkFVSWhGQ2dJQ0FnSENESWc1Q2dJQ0FnT0FBVVEwTEFrQWdDQVJBSUFBZ0FTQWFJQkpDLy8vLy93K0RFR3BCQUVnTkRTQURSUVJBSUFrZ0NTZ0NBRUVCYWpZQ0FBc2dBQ0FCSUFaQkFXcXRJQlFRYWtFQVNBME5JQTVDZ0lDQWdEQlNCRUFnRVVJZ2lLZEJkVThFUUNBUnB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFBZ0FTQUdRUUpxclNBUkVHcEJBRWdORGdzZ0JDQUJOd05ZSUFSQ2dJQ0FnREEzQTFBZ0FDQVRFQThnQUNBQUlCa2dCQ0FFUWRBQWFrRUFFSjBERURjaEV3d0JDMEtBZ0lDQU1DRVZJQTVDZ0lDQWdEQlNCRUFnQUNBUkVDVWlGVUtBZ0lDQWNJTkNnSUNBZ09BQVVRME5DeUFFSUJjM0EzZ2dCQ0FWTndOd0lBUWdBVGNEYUNBRUlCUTNBMWdnQkNBUE53TlFJQVFnRWtMLy8vLy9ENE0zQTJBZ0FDQVRFQThnQUNBRVFkQUFhaER0QkNFVElBQWdGUkFQQ3lBVFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFzZ0I2d2dFbGNFUUNBRVFUaHFJZ0lnQ1NBSElCS25FRkVhSUFJZ0V4Q0hBUm9nRDZjcEFnUkMvLy8vL3dlRElCSjhweUVIQ3lBRlFRRnFJUVVNQVFzTElBUkJPR29pQWlBSklBY2dDU2dDQkVILy8vLy9CM0VRVVJvZ0FoQTJJUkFNQ2dzZ0FDQVBFQTlDZ0lDQWdEQWhFd0pBQW44Q1FDQUFJQUFnRWtJQUVFMFFOeUlQUW9DQWdJQndneUlPUW9DQWdJQ1FmMUlFUUNBT1FvQ0FnSURnQUZJTkFTQU9JUkFNQXdzZ0Q2Y29BZ1JCLy8vLy93ZHhEUUFnQUNBRVFkQUFhaUFBSUFGQjFRQWdBVUVBRUJRUW93RkJBRWdOQWlBQUlBRkIxUUFDZmlBSklBUXBBMUFnRFJEeEFpSU9Rb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQU9Rdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdEcm05SWc1Q2dJQ0FnTUNCZ1B6L0FIMGdEa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRVVpQWtFQVRnMEFJQUpCSG5aQkFuRU1BUXRCQUF0RkRRRUxDd3dDQ3d3R0MwS0FnSUNBTUNFVEMwS0FnSUNBTUNFQkRBUUxJQVJCMEFCcUlBc2dDQ0FMS0FJRVFmLy8vLzhIY1JCUkRRQWdBQ0FTRUE4Z0FDZ0NFQ0lDUVJCcUlBTWdBaWdDQkJFQUFDQUVRZEFBYWhBMklSQU1BUXNnQUNBU0VBOGdBQ2dDRUNJQ1FSQnFJQU1nQWlnQ0JCRUFBQ0FFS0FKUUtBSVFJZ0pCRUdvZ0JDZ0NWQ0FDS0FJRUVRQUFDMEtBZ0lDQU1DRVJDMEtBZ0lDQU1DRVRRb0NBZ0lBd0lRRkNnSUNBZ0RBaER3c2dCQ2dDT0NnQ0VDSUNRUkJxSUFRb0Fqd2dBaWdDQkJFQUFBc2dCQkR1QkNBQUlCY1FEeUFBSUE4UUR5QUFJQUVRRHlBQUlCTVFEeUFBSUJFUUR5QUFJQlFRRHdzZ0JFR1FBV29rQUNBUUM2SUJBQ01BUVNCcklnSWtBQUorQWtBZ0FVTC8vLy8vYjFnRVFDQUFFQ1FNQVFzZ0FDQUNRUWhxSWdOQkFCQTlHaUFEUVM4UU94b0NRQ0FESUFBZ0FVSHNBQ0FCUVFBUUZCQi9EUUFnQWtFSWFpSURRUzhRT3hvZ0F5QUFJQUZCN1FBZ0FVRUFFQlFRZncwQUlBSkJDR29RTmd3Q0N5QUNLQUlJS0FJUUlnQkJFR29nQWlnQ0RDQUFLQUlFRVFBQUMwS0FnSUNBNEFBTElRRWdBa0VnYWlRQUlBRUxUZ0VDZmtLQWdJQ0E0QUFoQkNBQUlBRWdBeWtEQUJESUFTSUJRb0NBZ0lCd2d5SUZRb0NBZ0lEZ0FGSUVmaUFBSUFFUUR5QUZRb0NBZ0lBZ1VxMUNnSUNBZ0JDRUJVS0FnSUNBNEFBTEMvZ0NBZ04rQVg4Q1FBSkFJQUFnQVJEd0FpSUNSUTBBSUFNcEF3Z2hCZ0pBQWtBQ1FDQURLUU1BSWdSQ2dJQ0FnSEJVRFFBZ0JLY2lBeThCQmtFU1J3MEFJQVpDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFJQUJCbnZrQVFRQVFGVUtBZ0lDQTRBQVBDeUFES0FJZ0lnY2dCeWdDQUVFQmFqWUNBQ0FES0FJa0lnTWdBeWdDQUVFQmFqWUNBQ0FIclVLQWdJQ0FrSCtFSVFRZ0E2MUNnSUNBZ0pCL2hDRUZEQUVMUW9DQWdJQXdJUVVDZmlBRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQVFTOFFMUXdCQ3lBQUlBUVFLQXNpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCSUFBZ0JDQUdFSmdFSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVFzZ0FDQUNOUUlBUW9DQWdJQ1FmNFFRRHlBQUlBSTFBZ1JDZ0lDQWdKQi9oQkFQSUFJZ0JUNENCQ0FDSUFRK0FnQWdBQ0FCUWRVQVFnQVFSVUVBU0EwQklBRkNJSWluUVhWSkRRSWdBYWNpQUNBQUtBSUFRUUZxTmdJQURBSUxJQUFnQkJBUElBQWdCUkFQQzBLQWdJQ0E0QUFQQ3lBQkMyb0JBWDhnQVVMLy8vLy9iMWdFUUNBQUVDUkNnSUNBZ09BQUR3c0NmaUFCcHlJREx3RUdRUkpIQkVCQ2dJQ0FnREFnQUNBQklBQW9BaWdwQTVBQkVGSU5BUm9nQUVFU0VJWURRb0NBZ0lEZ0FBOExJQU1vQWlRdEFCQWdBbkZCQUVldFFvQ0FnSUFRaEFzTHZRUUJDWDhqQUVFZ2F5SUhKQUFDUUFKQUFrQUNRQUpBSUFGQy8vLy8vMjlZQkVBZ0FCQWtEQUVMSUFBZ0FTQUFLQUlvS1FPUUFSQlNEUUlnQUNBQkVQQUNJZ0lOQVF0Q2dJQ0FnT0FBSVFFTUF3c2dBaWdDQUNJSUtBSUVJZ0pCLy8vLy93ZHhJZ01OQVFzZ0FFSCtrd0VRWWlFQkRBRUxJQUFnQjBFSWFpQURJQUpCSDNZUWlnTWFJQWhCRUdvaEJpQUlLQUlFUWYvLy8vOEhjU0VKUVFBaEFBTkFBa0FDUUNBQUlBbElCRUFnQUVFQmFpRUNRWDhoQlFKQUFuOENRQUpBQWtBQ1FBSkFBa0FDUUFKL0lBZ3BBZ1JDZ0lDQWdBaURJZ0ZRSWdwRkJFQWdCaUFBUVFGMGFpOEJBQXdCQ3lBQUlBWnFMUUFBQ3lJRFFkc0FhdzREQXdFQ0FBc2dBaUVBQWtBZ0EwRUthdzRFQkFzTEJRQUxJQU5CTDBjTkJ5QUVSUTBGUVFFaEJFRXZJUU1NQnd0QjNBQWhBeUFDSUFsT0RRWWdBRUVDYWlFQUlBcEZCRUFnQmlBQ1FRRjBhaThCQUNFRkRBb0xJQUlnQm1vdEFBQWhCUXdKQzBFQUlRUkIzUUFoQXd3RkMwSGJBQ0VESUFRZ0FpQUpUbklOQmlBQVFRSnFJUUFnQVZBRVFFSGRBRUYvSUFJZ0Jtb3RBQUJCM1FCR0lnUWJJUVVnQUNBQ0lBUWJJUUJCQVNFRURBZ0xRUUVoQkVIZEFFRi9JQVlnQWtFQmRHb3ZBUUJCM1FCR0lnb2JJUVVnQUNBQ0lBb2JJUUFNQnd0QjdnQU1BZ3RCOGdBTUFRdEJBQ0VFUVM4TElRVkIzQUFoQXdzZ0FpRUFEQUlMSUFkQkNHb1FOaUVCREFNTElBSWhBRUVCSVFRTElBZEJDR29nQXhDTEFSb2dCVUVBU0EwQUlBZEJDR29nQlJDTEFSb01BQXNBQ3lBSFFTQnFKQUFnQVF2V0FnSURmd0YrSXdCQkVHc2lCQ1FBQWtBZ0FVTC8vLy8vYjFnRVFDQUFFQ1JDZ0lDQWdPQUFJUVVNQVF0Q2dJQ0FnT0FBSVFVZ0FDQUFJQUZCN2dBZ0FVRUFFQlFRSmlJQ1FRQklEUUFnQWdSL0lBUkI1d0E2QUFnZ0JFRUphZ1VnQkVFSWFnc2hBaUFBSUFBZ0FVSHI0d0FRc2dFUUppSURRUUJJRFFBZ0F3UkFJQUpCNlFBNkFBQWdBa0VCYWlFQ0N5QUFJQUFnQVVHTDVRQVFzZ0VRSmlJRFFRQklEUUFnQXdSQUlBSkI3UUE2QUFBZ0FrRUJhaUVDQ3lBQUlBQWdBVUgwMUFBUXNnRVFKaUlEUVFCSURRQWdBd1JBSUFKQjh3QTZBQUFnQWtFQmFpRUNDeUFBSUFBZ0FVSHZBQ0FCUVFBUUZCQW1JZ05CQUVnTkFDQURCRUFnQWtIMUFEb0FBQ0FDUVFGcUlRSUxJQUFnQUNBQlFmc2RFTElCRUNZaUEwRUFTQTBBSUFBZ0JFRUlhaUlBSUFNRWZ5QUNRZmtBT2dBQUlBSkJBV29GSUFJTElBQnJFSk1DSVFVTElBUkJFR29rQUNBRkM2VURBUVIrSXdCQkVHc2lBeVFBSUFRQ2Z3SkFBa0FDUUFKQUlBQWdBVUV1RUVzaUFrVUVRRUtBZ0lDQU1DRUJEQUVMSUFJb0FoZ0VRRUtBZ0lDQU1DRUJRUUVNQlFzZ0FDQUNLUU1BSWdnZ0Fpa0RDQ0lHRU1nQklnRkNnSUNBZ0hDRElnZENnSUNBZ09BQVVnMEJDMEtBZ0lDQU1DRUhEQUVMSUFkQ2dJQ0FnQ0JSQkVBZ0FrRUJOZ0lZUW9DQWdJQXdJUUZCQVF3REN5QUNLQUlRQkVBZ0FDQUFJQUZDQUJCTkVEY2lCMEtBZ0lDQWNJTWlDVUtBZ0lDQTRBQlJEUUVDUUNBSlFvQ0FnSUNRZjFJTkFDQUhweWdDQkVILy8vLy9CM0VOQUNBQUlBTkJDR29nQUNBSVFkVUFJQWhCQUJBVUVLTUJRUUJJRFFJZ0FDQUlRZFVBQW40Z0JxY2dBeWtEQ0NBQ0tBSVVFUEVDSWdaQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFaQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBR3ViMGlCa0tBZ0lDQXdJR0EvUDhBZlNBR1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVJVRUFTQTBDQ3lBQUlBY1FEd3dDQ3lBQ1FRRTJBaGdNQVFzZ0FDQUJFQThnQUNBSEVBOUNnSUNBZ09BQUlRRUxRUUFMTmdJQUlBTkJFR29rQUNBQkN3NEFJQUFRdFFKQ2dJQ0FnT0FBQ3drQVFvQ0FnSURBZmdzV0FDQUFJQU1wQXdBZ0F5a0RDQ0FES1FNUUVKUUVDOUVCQWdOK0FuOGpBRUVRYXlJSEpBQUNRQ0FBSUFkQkRHb2dBeWtEQUJEbEFTSUlSUVJBUW9DQWdJRGdBQ0VFREFFTElBQWdDQ0FIS0FJTVFkS0lBUkQxQlNFQklBQWdDQkJVQWtBZ0FrRUNTQ0FCUW9DQWdJQndnMEtBZ0lDQTRBQlJjZzBBSUFBZ0F5a0RDQ0lHRURoRkRRQkNnSUNBZ09BQUlRUUNRQ0FBRURRaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBRWhCUXdCQ3lBQUlBVkJMeUFCUVFjUUdVRUFTQTBBSUFBZ0JVRXZJQVlRK1FRaEJBc2dBQ0FGRUE4TUFRc2dBU0VFQ3lBSFFSQnFKQUFnQkFzTkFDQUFJQUVnQWtFd0VQMEZDd3NBSUFBZ0FVRXdFUDRGQzdRREFnTi9BbjRqQUVIUUFHc2lCaVFBUVg4aEJ3SkFJQUFnQmtISUFHb2dBVUhDQUJDQkFTSUlSUTBBSUFZcEEwZ2lBVUtBZ0lDQWNJTkNnSUNBZ0RCUkJFQWdDQ2tEQUNFQklBTkNJSWluUVhWUEJFQWdBNmNpQnlBSEtBSUFRUUZxTmdJQUN5QUFJQUVnQWlBRElBUWdCUkNHQkNFSERBRUxJQUFnQWhCY0lnbENnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUFJQUVRRHd3QkN5QUlLUU1BSVFvZ0JpQUVOd000SUFZZ0F6Y0RNQ0FHSUFrM0F5Z2dCaUFLTndNZ0lBQWdBU0FJS1FNSVFRUWdCa0VnYWhBdklRRWdBQ0FKRUE4Z0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUFrQUNRQ0FBSUFFUUppSUhCRUFnQUNBR0lBZ29BZ0FnQWhCTUlnSkJBRWdOQVNBQ1JRMERBa0FnQmlnQ0FDSUNRUk54UlFSQUlBQWdCaWtEQ0NBREVGSkZEUUVNQkFzZ0FrRVJjVUVRUncwRElBWTFBaHhDSUlaQ2dJQ0FnREJTRFFNTElBQWdCaEJJSUFCQnl5NUJBQkFWREFFTElBVkJnSUFCY1VVRVFFRUFJUWNnQlVHQWdBSnhSUTBESUFBb0FoQW9Bb3dCSWdKRkRRTWdBaTBBS0VFQmNVVU5Bd3NnQUVIa0drRUFFQlVMUVg4aEJ3d0JDeUFBSUFZUVNBc2dCa0hRQUdva0FDQUhDOVFDQWdKL0FuNGpBRUZBYWlJRUpBQUNRQUpBSUFBZ0JFRTRhaUFCUWNFQUVJRUJJZ1ZGRFFBZ0JDa0RPQ0lCUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FBSUFVcEF3QWdBaUFEUVFBUUZDRUJEQUlMSUFBZ0FoQmNJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FBSUFFUUR3d0JDeUFGS1FNQUlRY2dCQ0FETndNd0lBUWdCamNES0NBRUlBYzNBeUFnQUNBQklBVXBBd2hCQXlBRVFTQnFFQzhoQVNBQUlBWVFEeUFCUW9DQWdJQndneUlEUW9DQWdJRGdBRkVOQUNBQUlBUWdCU2dDQUNBQ0VFd2lBa0VBU0EwQUlBSkZEUUVDUUFKQUlBUW9BZ0FpQWtFVGNVVUVRQ0FBSUFRcEF3Z2dBUkJTUlEwQkRBSUxJQUpCRVhGQkVFY05BU0FEUW9DQWdJQXdVU0FFTlFJVVFpQ0dRb0NBZ0lBd1VuSU5BUXNnQUNBRUVFZ2dBQ0FCRUE4Z0FFR2lMMEVBRUJVTUFRc2dBQ0FFRUVnTUFRdENnSUNBZ09BQUlRRUxJQVJCUUdza0FDQUJDNWtDQWdOL0FuNGpBRUZBYWlJREpBQkJmeUVFQWtBZ0FDQURRVGhxSUFGQjR3QVFnUUVpQlVVTkFDQURLUU00SWdGQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFBZ0JTa0RBQ0FDRUhFaEJBd0JDeUFBSUFJUVhDSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQ0FCRUE4TUFRc2dCU2tEQUNFSElBTWdCamNES0NBRElBYzNBeUFnQUNBQklBVXBBd2hCQWlBRFFTQnFFQzhoQVNBQUlBWVFEeUFCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBQkVDWWlCQTBBQWtBZ0FDQURJQVVvQWdBaUJDQUNFRXdpQWtFQVRnUkFJQUpGRFFFZ0F5Z0NBQ0VDSUFBZ0F4QklJQUpCQVhFRVFDQUVMUUFGUVFGeERRSUxJQUJCb3p4QkFCQVZDMEYvSVFRTUFRdEJBQ0VFQ3lBRFFVQnJKQUFnQkF1ZUJnSUhmd04rSXdCQlFHb2lCeVFBUVg4aENBSkFJQUFnQjBFNGFpQUJRZVVBRUlFQklnbEZEUUFnQnlrRE9DSU9Rb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFJQWtwQXdBZ0FpQURJQVFnQlNBR0VHMGhDQXdCQ3lBQUlBSVFYQ0lQUW9DQWdJQndnMEtBZ0lDQTRBQlNCRUFnQUJBMElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUdRWUFRY1NJTkJFQWdCRUlnaUtkQmRVOEVRQ0FFcHlJS0lBb29BZ0JCQVdvMkFnQUxJQUFnQVVIQkFDQUVRUWNRR1JvTElBWkJnQ0J4SWdvRVFDQUZRaUNJcDBGMVR3UkFJQVduSWdzZ0N5Z0NBRUVCYWpZQ0FBc2dBQ0FCUWNJQUlBVkJCeEFaR2dzZ0JrR0F3QUJ4SWdzRVFDQURRaUNJcDBGMVR3UkFJQU9uSWd3Z0RDZ0NBRUVCYWpZQ0FBc2dBQ0FCUWNBQUlBTkJCeEFaR2dzZ0JrR0FCSEVpREFSQUlBQWdBVUUrSUFaQkFYWkJBWEd0UW9DQWdJQVFoRUVIRUJrYUN5QUdRWUFJY1FSQUlBQWdBVUUvSUFaQkFuWkJBWEd0UW9DQWdJQVFoRUVIRUJrYUN5QUdRWUFDY1FSQUlBQWdBVUU5SUFaQkFYR3RRb0NBZ0lBUWhFRUhFQmthQ3lBSktRTUFJUkFnQnlBQk53TXdJQWNnRHpjREtDQUhJQkEzQXlBZ0FDQU9JQWtwQXdoQkF5QUhRU0JxRUM4aERpQUFJQThRRHlBQUlBRVFEeUFPUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlnQUNBT0VDWkZCRUJCQUNFSUlBWkJnSUFCY1VVTkF5QUFRYm5MQUVFQUVCVkJmeUVJREFNTElBQWdCeUFKS0FJQUlna2dBaEJNSWdKQkFFZ05BaUFHUVlFQ2NTRUlBa0FDUUNBQ1JRUkFJQWhCZ0FKR0RRRkJBU0VJSUFrdEFBVkJBWEZGRFFFTUJRc0NRQ0FIS0FJQUlnSWdCaENUQTBVZ0FrRUJjU0FJUVlBQ1JuRnlEUUFDUUNBR1FZQXdjUVJBSUFKQkVYRkJFRWNOQVNBTkJFQWdBQ0FFSUFjcEF4QVFVa1VOQXdzZ0NrVU5BU0FBSUFVZ0J5a0RHQkJTRFFFTUFnc2dDMFVOQUNBR1FRSnhSU0FDUVFOeElnSkJBa1p4RFFFZ0FnMEFJQUFnQXlBSEtRTUlFRkpGRFFFTElBeEZEUUlnQnlnQ0FFRVRjVUVDUncwQ0N5QUFJQWNRU0FzZ0FFR3NIRUVBRUJWQmZ5RUlEQU1MSUFBZ0J4QklRUUVoQ0F3Q0N5QUFJQThRRHdzZ0FDQU9FQThMSUFkQlFHc2tBQ0FJQzY0Q0FnTi9BbjRqQUVGQWFpSURKQUJCZnlFRUFrQWdBQ0FEUVRocUlBRkI1QUFRZ1FFaUJVVU5BQ0FES1FNNElnRkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQWdCU2tEQUNBQ1FRQVExUUVoQkF3QkN5QUFJQUlRWENJR1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUJFQThNQVFzZ0JTa0RBQ0VISUFNZ0JqY0RLQ0FESUFjM0F5QWdBQ0FCSUFVcEF3aEJBaUFEUVNCcUVDOGhBU0FBSUFZUUR5QUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FCRUNZaUJFVUVRRUVBSVFRTUFRc0NRQ0FBSUFNZ0JTZ0NBQ0FDRUV3aUFrRUFUZ1JBSUFKRkRRSUNRQ0FETFFBQVFRRnhCRUFnQUNBRktRTUFFSmtCSWdKQkFFZ05BU0FDRFFNTElBQkJpUnhCQUJBVkN5QUFJQU1RU0F0QmZ5RUVEQUVMSUFBZ0F4QklDeUFEUVVCckpBQWdCQXNQQUNBQUlBTVFEeUFBRUxVQ1FYOExsQVlDQzM4Q2ZpTUFRVUJxSWdVa0FFRi9JUXNDUUNBQUlBVkJPR29nQTBIbkFCQ0JBU0lHUlEwQUlBVXBBemdpQTBLQWdJQ0FjSU5DZ0lDQWdEQlJCRUFnQUNBQklBSWdCaWdDQUVFREVJNEJJUXNNQVFzZ0FDQURJQVlwQXdoQkFTQUdFQzhpQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFWQkFEWUNMQ0FGUVFBMkFqUWdCVUVBTmdJd0lBQWdCVUUwYWlBREVOWUJJUWNnQlNnQ05DRUtBa0FnQncwQUFrQWdDa1VOQUNBQUlBcEJBM1FRWHlJSkRRQkJBQ0VKREFFTEFuOENRQU5BQWtBZ0JDQUtSZ1JBUVFFZ0NpQUtRUUZOR3lFSVFRRWhCQU5BSUFRZ0NFWU5BaUFKSUFRZ0NTQUVRUU4wYWlnQ0JCRDZCQ0VISUFSQkFXb2hCQ0FIUVFCSURRQUxJQUJCeGh0QkFCQVZRUUFNQkFzZ0FDQURJQVFRc0FFaUQwS0FnSUNBY0lNaUVFS0FnSUNBZ0g5UklCQkNnSUNBZ0pCL1VYSkZCRUJCQUNBUVFvQ0FnSURnQUZFTkJCb2dBQ0FQRUE4Z0FFSFJOMEVBRUJWQkFBd0VDeUFBSUE4UU1TRUlJQUFnRHhBUElBaEZEUUlnQ1NBRVFRTjBhaUlIUVFBMkFnQWdCeUFJTmdJRUlBUkJBV29oQkF3QkN3dEJBQ0FBSUFZcEF3QVFtUUVpREVFQVNBMEJHaUFHTFFBUkJFQWdBQkMyQWd3QkN5QUFJQVZCTEdvZ0JVRXdhaUFHS0FJQVFRTVFqZ0VFUUNBRktBSXdJUVFnQlNnQ0xDRUlEQU1MSUFVb0Fpd2hDQ0FGS0FJd0lRUkJBQ0VIQTBBZ0JDQUhSd1JBSUFZdEFCRUVRQ0FBRUxZQ0RBVUxJQUFnQlVFSWFpQUdLQUlBSUFnZ0IwRURkR29pRFNnQ0JCQk1JZzVCQUVnTkJBSkFJQTVGRFFBZ0FDQUZRUWhxRUVnZ0JTMEFDRUVCY1VFQUlBd2JEUUFnQ1NBS0lBMG9BZ1FRK2dRaURVRUFTQVJBSUFCQnFqSkJBQkFWREFZTElBd05BQ0FKSUExQkEzUnFRUUUyQWdBTElBZEJBV29oQnd3QkN3c0NRQ0FNRFFCQkFDRUdBMEFnQmlBS1JnMEJJQVpCQTNRaEJ5QUdRUUZxSVFZZ0J5QUphaWdDQUEwQUN5QUFRZmNaUVFBUUZRd0RDeUFBSUFnZ0JCQmFJQUFnQXhBUElBRWdDVFlDQUNBQ0lBbzJBZ0JCQUNFTERBTUxRUUFMSVFSQkFDRUlDeUFBSUFnZ0JCQmFJQUFnQ1NBS0VGb2dBQ0FERUE4TElBVkJRR3NrQUNBTEM2OEVBZ1IvQW40akFFSGdBR3NpQkNRQVFYOGhCUUpBSUFBZ0JFSFlBR29nQWtIbUFCQ0JBU0lHUlEwQUlBWW9BZ0FoQnlBRUtRTllJZ0pDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUFnQVNBSElBTVFUQ0VGREFFTElBQWdBeEJjSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUlBSVFEd3dCQ3lBR0tRTUFJUWtnQkNBSU53TklJQVFnQ1RjRFFDQUFJQUlnQmlrRENFRUNJQVJCUUdzUUx5RUNJQUFnQ0JBUElBSkNnSUNBZ0hDRElnaENnSUNBZ09BQVVRMEFBa0FDUUFKQUlBaENnSUNBZ0RCUklBSkMvLy8vLzI5V2NrVUVRQ0FBSUFJUUR3d0JDeUFBSUFRZ0J5QURFRXdpQTBFQVNBMENBa0FnQTBVRVFFRUFJUVVnQ0VLQWdJQ0FNRkVOQlF3QkN5QUFJQVFRU0NBSVFvQ0FnSUF3VWcwQUlBUXRBQUJCQVhGRkRRRkJBQ0VGSUFjdEFBVkJBWEZGRFFFTUJBdEJmeUVGSUFBZ0Jpa0RBQkNaQVNJR1FRQklEUUlnQUNBRVFTQnFJQUlRK3dRaEJ5QUFJQUlRRHlBSFFRQklEUU1DUUNBREJFQWdCQ2dDQUNJRlFZQTZRWURPQUNBRUtBSWdJZ05CRUhFYklBTnlFSk1EUlEwQklBTkJBWEVOQXlBRlFRRnhEUUVnQTBFU2NRMERJQVZCQW5FTkFRd0RDeUFHUlEwQUlBUXRBQ0JCQVhFTkFnc2dBQ0FFUVNCcUVFZ0xJQUJCbnoxQkFCQVZRWDhoQlF3Q0N3SkFJQUVFUUNBQklBUXBBeUEzQXdBZ0FTQUVLUU00TndNWUlBRWdCQ2tETURjREVDQUJJQVFwQXlnM0F3Z01BUXNnQUNBRVFTQnFFRWdMUVFFaEJRd0JDeUFBSUFJUUR3c2dCRUhnQUdva0FDQUZDMG9BQWtBZ0JTa0RBQ0lCUW9DQWdJQndWQTBBSUFHbklnSXZBUVpCTUVjTkFDQUNLQUlnSWdKRkRRQWdBa0VCT2dBUklBQWdBUkFQSUFWQ2dJQ0FnQ0EzQXdBTFFvQ0FnSUF3Qzg4QkFRTitJd0JCRUdzaUFpUUFRb0NBZ0lEZ0FDRUZBa0FDUUFKK1FvQ0FnSUF3SUFCQ2dJQ0FnREFnQUNBREVQd0ZJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQm9nQWlBRU53TUlRb0NBZ0lEZ0FDQUFRZFFBUVFCQkFFRUJJQUpCQ0dvUXp3RWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEFHaUFBRURRaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQklBWUxJUUVnQUNBRUVBOGdBQ0FCRUE4TUFRc2dBQ0FCUVlNQklBUkJCeEFaR2lBQUlBRkJoQUVnQmtFSEVCa2FJQUVoQlFzZ0FrRVFhaVFBSUFVTHNnRUJBbjRnQUNBQklBUkJBM0VpQWtFbWFoQkxSUVJBUW9DQWdJRGdBQThMUW9DQWdJRGdBQ0VHSUFBZ0FrRXFhaEIySWdWQ2dJQ0FnSENEUW9DQWdJRGdBRklFZmlBQVFSQVFLU0lDUlFSQUlBQWdCUkFQUW9DQWdJRGdBQThMSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBQ1FRQTJBZ3dnQWlBRVFRSjFOZ0lJSUFJZ0FUY0RBQ0FGUW9DQWdJQndXZ1JBSUFXbklBSTJBaUFMSUFVRlFvQ0FnSURnQUFzTDBnSUNBMzREZnlNQVFTQnJJZ2drQUVLQWdJQ0E0QUFoQlFKQUlBQWdBU0FFUVNacUVFc2lDVVVOQUNBREtRTUFJUWRDZ0lDQWdEQWhCaUFDUVFKT0JFQWdBeWtEQ0NFR0N5QUFJQWNRWUEwQUlBbEJCR29oQ2lBSktBSUlJUU1EUUNBRElBcEdCRUJDZ0lDQWdEQWhCUXdDQ3lBRFFReHJLQUlBQkVBZ0F5Z0NCQ0VEQlNBRFFSQnJJZ0lnQWlnQ0FFRUJhallDQUNBREtRTVFJZ1ZDSUlpblFYVlBCRUFnQmFjaUNTQUpLQUlBUVFGcU5nSUFDeUFJSUFVM0F3Z0NRQ0FFRFFBZ0F5a0RHQ0lGUWlDSXAwRjFTUTBBSUFXbklna2dDU2dDQUVFQmFqWUNBQXNnQ0NBQk53TVFJQWdnQlRjREFDQUFJQWNnQmtFRElBZ1FJU0VGSUFBZ0NDa0RBQkFQSUFSRkJFQWdBQ0FJS1FNSUVBOExJQU1vQWdRaEF5QUFLQUlRSUFJUTZnTWdCVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQUFnQlJBUEN3d0FDd0FMSUFoQklHb2tBQ0FGQzJBQUlBQWdBU0FDUVNacUVFc2lBRVVFUUVLQWdJQ0E0QUFQQ3lBQUtBSU1JZ0JCQUU0RVFDQUFyUThMUW9DQWdJREFmaUFBdUwwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3RaQVFGL0lBQWdBU0FFUVNacUVFc2lBa1VFUUVLQWdJQ0E0QUFQQ3lBQ1FRUnFJUU1nQWlnQ0NDRUVBMzRnQXlBRVJnUitRb0NBZ0lBd0JTQUVRUkJySVFVZ0JDZ0NCQ0VFSUFBb0FoQWdBaUFGRVB3RURBRUxDd3NWQUNBQUlBTVFEeUFBSUFRUUR5QUFFTFVDUVg4TGhnRUFJQUFnQVNBRVFTWnFFRXNpQWtVRVFFS0FnSUNBNEFBUEN5QUFJQUlnQXlrREFDSUJRZ0FnQVVJZ2lLZEJCMnRCYms4YklBRWdBVUtBZ0lDQXdJR0EvUDhBZkVMLy8vLy8vLy8vLy84QWcxQWJFUFVDSWdCRkJFQkNnSUNBZ0RBUEN5QUFLUU1vSWdGQ0lJaW5RWFZQQkVBZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBQkMzVUFJQUFnQVNBRVFTWnFFRXNpQWtVRVFFS0FnSUNBNEFBUEN5QUFJQUlnQXlrREFDSUJRZ0FnQVVJZ2lLZEJCMnRCYms4YklBRWdBVUtBZ0lDQXdJR0EvUDhBZkVMLy8vLy8vLy8vLy84QWcxQWJFUFVDSWdORkJFQkNnSUNBZ0JBUEN5QUFLQUlRSUFJZ0F4RDhCRUtCZ0lDQUVBdGhBQ0FBSUFFZ0JFRW1haEJMSWdKRkJFQkNnSUNBZ09BQUR3c2dBQ0FDSUFNcEF3QWlBVUlBSUFGQ0lJaW5RUWRyUVc1UEd5QUJJQUZDZ0lDQWdNQ0JnUHovQUh4Qy8vLy8vLy8vLy8vL0FJTlFHeEQxQWtFQVI2MUNnSUNBZ0JDRUM3c0ZBZ04rQjM4akFFRVFheUlMSkFCQ2dJQ0FnT0FBSVFjQ1FDQUFJQUVnQkVFbWFoQkxJZ0pGRFFBZ0FpZ0NBRVVnQXlrREFDSUZRZ0FnQlVJZ2lLZEJCMnRCYms4YklBVWdCVUtBZ0lDQXdJR0EvUDhBZkVMLy8vLy8vLy8vLy84QWcxQWJJZ1ZDLy8vLy8yOVdja1VFUUNBQUVDUU1BUXRDZ0lDQWdEQWhCaUFFUVFGeFJRUkFJQU1wQXdnaEJnc0NRQ0FBSUFJZ0JSRDFBaUlEQkVBZ0FDQURLUU1vRUE4TUFRc2dBRUV3RUNraUEwVU5BU0FESUFJMkFnZ2dBMElCTndNQUFrQWdBaWdDQUFSQUlBTWdCYWNpQkNnQ0dEWUNEQ0FFSUFNMkFoZ01BUXNnQlVJZ2lLZEJkVWtOQUNBRnB5SUVJQVFvQWdCQkFXbzJBZ0FMSUFNZ0JUY0RJQ0FDS0FJUUlna2dBaWdDRkNJRVFRRnJJQVVRMXdOeFFRTjBhaUlJS0FJQUlnb2dBMEVZYWlJTU5nSUVJQU1nQ0RZQ0hDQURJQW8yQWhnZ0NDQU1OZ0lBSUFJb0FnUWlDQ0FEUVJCcUlnbzJBZ1FnQXlBQ1FRUnFJZ3cyQWhRZ0F5QUlOZ0lRSUFJZ0NqWUNCQ0FDSUFJb0FneEJBV29pQ0RZQ0RDQUlJQUlvQWhoSkRRQWdBQ0FKUVFRZ0JFRUJkQ0FFUVFGR0d5SUFRUU4wSUF0QkRHb1FxQUVpQ0VVTkFDQUxLQUlNUVFOMklBQnFJUVJCQUNFQUEwQWdBQ0FFUmtVRVFDQUlJQUJCQTNScUlna2dDVFlDQkNBSklBazJBZ0FnQUVFQmFpRUFEQUVMQ3lBRVFRRnJJUW9nQWtFSWFpRUFBMEFnRENBQUtBSUFJZ0JIQkVBZ0FFRU1heWdDQUVVRVFDQUlJQUFwQXhBUTF3TWdDbkZCQTNScUlna29BZ0FpRFNBQVFRaHFJZzQyQWdRZ0FDQUpOZ0lNSUFBZ0RUWUNDQ0FKSUE0MkFnQUxJQUJCQkdvaEFBd0JDd3NnQWlBRU5nSVVJQUlnQ0RZQ0VDQUNJQVJCQVhRMkFoZ0xJQVpDSUlpblFYVlBCRUFnQnFjaUFDQUFLQUlBUVFGcU5nSUFDeUFESUFZM0F5Z2dBVUlnaUtkQmRVOEVRQ0FCcHlJQUlBQW9BZ0JCQVdvMkFnQUxJQUVoQndzZ0MwRVFhaVFBSUFjTHF3TUNBMzhCZmlNQVFSQnJJZ2NrQUFKQUlBQWdBU0FGUVNwcUVFc2lBMFVFUUNBRVFRQTJBZ0JDZ0lDQWdPQUFJUUVNQVF0Q2dJQ0FnREFoQVFKQUlBTXBBd0FpQ1VLQWdJQ0FjSU5DZ0lDQWdEQlJEUUFDUUNBSlFvQ0FnSUJ3VkEwQUlBbW5JZ0l2QVFZZ0JVRW1ha2NOQUNBQ0tBSWdJZ1pGRFFBQ1FDQURLQUlNSWdoRkJFQWdCaWdDQ0NFQ0RBRUxJQWdvQWhRaEFpQUFLQUlRSUFnUTZnTUxJQVpCQkdvaEJnTkFJQUlnQmtZRVFDQURRUUEyQWd3Z0FDQURLUU1BRUE4Z0EwS0FnSUNBTURjREFBd0RDeUFDUVF4cktBSUFCRUFnQWlnQ0JDRUNEQUVMQ3lBQ1FSQnJJZ1lnQmlnQ0FFRUJhallDQUNBRElBWTJBZ3dnQkVFQU5nSUFJQU1vQWdnaUEwVUVRQ0FDS1FNUUlnRkNJSWluUVhWSkRRTWdBYWNpQUNBQUtBSUFRUUZxTmdJQURBTUxJQWNnQWlrREVDSUJOd01BSUFWRkJFQWdBaWtER0NFQkN5QUhJQUUzQXdnZ0EwRUJSZ1JBSUFGQ0lJaW5RWFZKRFFNZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBREFNTElBQkJBaUFIRUlrRElRRU1BZ3RCK29NQlFhNzhBRUg5NXdKQnhpVVFBQUFMSUFSQkFUWUNBQXNnQjBFUWFpUUFJQUVMUFFFQmZrS0FnSUNBRUNFQklBTXBBd0FpQkVLQWdJQ0FjRm9FZmlBRXB5OEJCa0VWYTBILy93TnhRUXhKclVLQWdJQ0FFSVFGUW9DQWdJQVFDd3ZxQXdJRWZnRi9Jd0JCSUdzaUFpUUFRb0NBZ0lEZ0FDRUZBa0FnQUNBQklBUVFTeUlKUlEwQUlBa3RBQVFFUUNBQUVHc01BUXNnQUNBQ1FSaHFJQU1wQXdCQ0FDQUpOQUlBSWdZZ0JoQjBEUUFnQWlBR053TVFJQU1wQXdnaUIwS0FnSUNBY0lOQ2dJQ0FnREJTQkVBZ0FDQUNRUkJxSUFkQ0FDQUdJQVlRZEEwQklBSXBBeEFoQmdzZ0Fpa0RHQ0VJSUFBZ0FVS0FnSUNBTUJEakFTSUhRb0NBZ0lCd2d5SUZRb0NBZ0lEZ0FGRUVRQ0FISVFVTUFRc2dCaUFJZlNJR1FnQWdCa0lBVlJzaEJnSkFJQVZDZ0lDQWdEQlJCRUFnQUVLQWdJQ0FNQ0FHSUFRUTNBTWhCUXdCQ3lBQ0lBWWlCVUtBZ0lDQUNGb0Vma0tBZ0lDQXdINGdCcm05SWdWQ2dJQ0FnTUNCZ1B6L0FIMGdCVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0ZJQVVMTndNSUlBQWdCMEVCSUFKQkNHb1Fwd0VoQlNBQUlBY1FEeUFBSUFJcEF3Z1FEd3NnQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBQWtBZ0FDQUZJQVFRU3lJRFJRMEFJQUFnQlNBQkVGSUVRQ0FBUWMvR0FFRUFFQlVNQVFzQ1FDQURMUUFFRFFBZ0F6UUNBQ0FHVXdSQUlBQkJzOVFBUVFBUUZRd0NDeUFKTFFBRURRQWdBeWdDQ0NBSktBSUlJQWluYWlBR3B4QWZHZ3dDQ3lBQUVHc0xJQUFnQlJBUFFvQ0FnSURnQUNFRkN5QUNRU0JxSkFBZ0JRc09BQ0FBRUxVQ1FvQ0FnSURnQUF0ZEFDQUFJQUVnQWhCTElnQkZCRUJDZ0lDQWdPQUFEd3NnQUNnQ0FDSUFRUUJPQkVBZ0FLMFBDMEtBZ0lDQXdINGdBTGk5SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xPUUVCZmtLQWdJQ0F3SDRnQVNrREFDSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3pzQkFYNUNnSUNBZ01CK0lBRXFBZ0M3dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDd3dBSUFBZ0FTa0RBQkQ3QXdzTUFDQUFJQUVwQXdBUWh3SUxTUUVCZmlBQktBSUFJZ0JCQUU0RVFDQUFyUThMUW9DQWdJREFmaUFBdUwwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NIQUNBQk5RSUFDd2NBSUFFekFRQUxEZ0FnQVRJQkFFTC8vLy8vRDRNTENRQWdBQkMxQWtGL0N3NEFJQUV3QUFCQy8vLy8vdytEQ3djQUlBRXhBQUFMRHdBZ0FDc0RBQ0FCS3dNQUVQMEVDeEVBSUFBcUFnQzdJQUVxQWdDN0VQMEVDeGtCQW40Z0FTa0RBQ0lESUFBcEF3QWlCRlFnQXlBRVZtc0xHUUVDZmlBQktRTUFJZ01nQUNrREFDSUVVeUFESUFSVmF3c1hBQ0FCS0FJQUlnRWdBQ2dDQUNJQVNTQUFJQUZKYXdzWEFDQUJLQUlBSWdFZ0FDZ0NBQ0lBU0NBQUlBRklhd3NOQUNBQUx3RUFJQUV2QVFCckN3MEFJQUF1QVFBZ0FTNEJBR3NMRFFBZ0FDd0FBQ0FCTEFBQWF3c05BQ0FBTFFBQUlBRXRBQUJyQzh3TkJBZC9BWHdCZmdGOUl3QkJJR3NpQmlRQVFvQ0FnSURnQUNFTkFrQWdBQ0FCRUpJQklncEJBRWdOQUVGL0lRVUNRQUpBQWtBZ0NrVU5BRUVCSVFnQ1FBSkFJQVJCQVVZRVFFRi9JUWdnQmlBS1FRRnJJZ1UyQWh3Z0FrRUNTQTBCSUFBZ0JrRUlhaUFES1FNSUVFSU5CaUFHS3dNSUlneTlRdi8vLy8vLy8vLy8vd0NEUW9HQWdJQ0FnSUQ0L3dCYUJFQWdCa0VBTmdJY0RBSUxJQXhFQUFBQUFBQUFBQUJtQkVBZ0RDQUZ0Mk5GRFFJZ0JnSi9JQXlaUkFBQUFBQUFBT0JCWXdSQUlBeXFEQUVMUVlDQWdJQjRDellDSEF3Q0MwRi9JUVVnRENBS3Q2QWlERVFBQUFBQUFBQUFBR01OQkNBR0FuOGdESmxFQUFBQUFBQUE0RUZqQkVBZ0RLb01BUXRCZ0lDQWdIZ0xOZ0ljREFFTElBWkJBRFlDSENBQ1FRSklCRUFnQ2lFQ0RBSUxJQUFnQmtFY2FpQURLUU1JSUFvaUFpQUNFRmNOQlF3QkMwRi9JUUlMSUFHbklna29BaUFvQWd3b0FpQXRBQVFFUUVGL0lRVWdCRUYvUncwQ1FYOUJBQ0FETlFJRVFpQ0dRb0NBZ0lBd1Voc2hCUXdEQ3lBR1FnQTNBeEFDZjBFSElBTXBBd0FpQVVJZ2lLY2lBeUFEUVFkclFXNUpHeUlEUVhaSEJFQWdBMEVIUndSQVFYOGhCU0FERFFNZ0JpQUJ4Q0lCTndNUUlBRzVJUXhCQVNFSFFRRU1BZ3NnQmdKK0lBRkNnSUNBZ01DQmdQei9BSHkvSWd5WlJBQUFBQUFBQU9CRFl3UkFJQXl3REFFTFFvQ0FnSUNBZ0lDQWdIOExJZzAzQXhCQkFTRUhJQXdnRGJsaERBRUxJQUduSVFOQmZ5RUZBbjhDUUFKQUlBa3ZBUVpCSEdzT0FnQUJCQXRCQUNBR1FSQnFJQU5CQkdwQkFCQ0NBMFVOQVJvTUF3c2dBeWdDRENJSFFmLy8vLzhIUmcwQ0lBWUNma0lBSUFkQkFFd05BQm9nQXlnQ0NBMERJQWRCd0FCTERRTWdBeWdDRkNJTElBTW9BaEFpQTBFQ2RHcEJCR3NvQWdBaEJTQUZRU0FnQjJ0MnJTQUhRU0JORFFBYVFnQWhEU0FEUVFKUEJINGdBMEVDZENBTGFrRUlhelVDQUFWQ0FBc2dCYTFDSUlhRVFjQUFJQWRycllnTE53TVFRUUFMSVFkRUFBQUFBQUFBQUFBaERFRUFDeUVEUVg4aEJRSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FKTHdFR1FSVnJEZ3NCQUFFREJBWUhDd3dKQ2c4TElBTkZEUTRnQmlrREVDSU5Rb0FCZkVLQUFsb05EZ3dCQ3lBRFJRME5JQVlwQXhBaURVTC9BVllORFFzZ0NTZ0NKQ0VBSUFSQkFVWUVRQ0FOcDBILy93TnhJUU1nQmlnQ0hDRUZBMEFnQWlBRlJnME5JQU1nQUNBRmFpMEFBRVlORGlBRklBaHFJUVVNQUFzQUN5QUFJQVlvQWh3aUFtb2dEYWRCLy84RGNTQUtJQUpyRVBzQklnSkZEUXdnQWlBQWF5RUZEQXdMSUFORkRRc2dCaWtERUNJTlFvQ0FBbnhDZ0lBRVdnMExEQUVMSUFORkRRb2dCaWtERUNJTlF2Ly9BMVlOQ2dzZ0NTZ0NKQ0VBSUFZb0Fod2hCU0FOcDBILy93TnhJUU1EUUNBQ0lBVkdEUWtnQUNBRlFRRjBhaThCQUNBRFJnMEtJQVVnQ0dvaEJRd0FDd0FMSUFORkRRZ2dCaWtERUNJTlFvQ0FnSUFJZkVLQWdJQ0FFRm9OQ0F3QkN5QURSUTBISUFZcEF4QWlEVUwvLy8vL0QxWU5Cd3NnRGFjaEFDQUpLQUlrSVFNZ0JpZ0NIQ0VGQTBBZ0FpQUZSZzBHSUFNZ0JVRUNkR29vQWdBZ0FFWU5CeUFGSUFocUlRVU1BQXNBQ3lBSFJRMEZJQXk5UXYvLy8vLy8vLy8vL3dDRFFvR0FnSUNBZ0lENC93QmFCRUFnQkVGL1J3MEhJQWtvQWlRaEFDQUdLQUljSVFVRFFDQUNJQVZHRFFZZ0FDQUZRUUowYWlnQ0FFSC8vLy8vQjNGQmdJQ0EvQWRMRFFjZ0JTQUlhaUVGREFBTEFBc2dEQ0FNdGlJT3UySU5CU0FKS0FJa0lRQWdCaWdDSENFRkEwQWdBaUFGUmcwRklBQWdCVUVDZEdvcUFnQWdEbHNOQmlBRklBaHFJUVVNQUFzQUN5QUhSUTBFSUFrb0FpUWhBQ0FNdlVMLy8vLy8vLy8vLy84QWcwS0JnSUNBZ0lDQStQOEFXZ1JBSUFSQmYwY05CaUFHS0FJY0lRVURRQ0FDSUFWR0RRVWdBQ0FGUVFOMGFpa0RBRUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZnMEdJQVVnQ0dvaEJRd0FDd0FMSUFZb0Fod2hCUU5BSUFJZ0JVWU5CQ0FBSUFWQkEzUnFLd01BSUF4aERRVWdCU0FJYWlFRkRBQUxBQXNnQjBVTkFTQUFLQUlRS0FLTUFTSUFCSDhnQUMwQUtFRUVjVUVDZGdWQkFBdEZEUU1nQTBVTkF5QUdLUU1RSWdGQ2dZQ0FnSUNBZ0hCVERRTWdBVUtBZ0lDQWdJQ0FFRmtOQXd3QkN5QUhSUTBBSUFBb0FoQW9Bb3dCSWdBRWZ5QUFMUUFvUVFSeFFRSjJCVUVBQzBVTkFpQURSUTBDSUFZcEF4QWlBVUlBVXcwQ0lBRkMvLy8vLy8vLy93OVZEUUlMSUFrb0FpUWhBQ0FHS0FJY0lRVWdCaWtERUNFQkEwQWdBaUFGUmcwQklBQWdCVUVEZEdvcEF3QWdBVkVOQWlBRklBaHFJUVVNQUFzQUMwRi9JUVVMSUFSQmYwWU5BUXNnQmEwaERRd0JDeUFGUVFCT3JVS0FnSUNBRUlRaERRc2dCa0VnYWlRQUlBMExnZ01DQkg4RGZpTUFRU0JySWdVa0FBSitJQUFnQVJDU0FTSUlRUUJPQkVCQkxDRUhBa0FnQWtFQVRDQUVja1VFUUVLQWdJQ0FNQ0VKSUFNcEF3QWlDa0tBZ0lDQWNJTkNnSUNBZ0RCUkRRRkNnSUNBZ09BQUlBQWdDaEFvSWdsQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXhwQmZ5RUhJQW1uSWdZb0FnUkJBVWNOQVNBR0xRQVFJUWNNQVF0Q2dJQ0FnREFoQ1FzZ0FDQUZRUWhxUVFBUVBScEJBQ0VDQWtBRFFDQUNJQWhIQkVBQ1FDQUNSUTBBSUFkQkFFNEVRQ0FGUVFocUlBY1FPMFVOQVF3RUN5QUZRUWhxSUFaQkFDQUdLQUlFUWYvLy8vOEhjUkJSRFFNTElBQWdBU0FDRUxBQklndENnSUNBZ0hDRElncENnSUNBZ0NCUklBcENnSUNBZ0RCUmNrVUVRQ0FLUW9DQWdJRGdBRkVOQXlBRlFRaHFJQVFFZmlBQUlBc1EvZ1FGSUFzTEVIOE5Bd3NnQWtFQmFpRUNEQUVMQ3lBQUlBa1FEeUFGUVFocUVEWU1BZ3NnQlNnQ0NDZ0NFQ0lDUVJCcUlBVW9BZ3dnQWlnQ0JCRUFBQ0FBSUFrUUR3dENnSUNBZ09BQUN5RUxJQVZCSUdva0FDQUxDN2dDQXdOL0FYNEJmQ01BUVNCcklnTWtBQ0FDS0FJRVJRUkFJQUVvQWdBaEJTQURJQUlvQWdBaUFTQUNLQUljSUFBb0FnQWlBQ0FDS0FJZ2JHb2dBaWdDR0JFTkFEY0RFQ0FESUFFZ0FpZ0NIQ0FGSUFJb0FpQnNhaUFDS0FJWUVRMEFOd01ZQWtBZ0FTQUNLUU1RUW9DQWdJQXdRUUlnQTBFUWFoQWhJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FDUVFFMkFnUU1BUXNDUUFKL0lBWkMvLy8vL3c5WUJFQWdCcWNpQkVFZmRTQUVRUUJIY2d3QkN5QUJJQU5CQ0dvZ0JoQnVRUUJJRFFFZ0F5c0RDQ0lIUkFBQUFBQUFBQUFBWkNBSFJBQUFBQUFBQUFBQVkyc0xJZ1JGQkVBZ0FDQUZTeUFBSUFWSmF5RUVDeUFCSUFJcEF3Z1E5d0pCQUU0TkFTQUNRUUUyQWdRTUFRc2dBa0VCTmdJRUN5QUJJQU1wQXhBUUR5QUJJQU1wQXhnUUR3c2dBMEVnYWlRQUlBUUx0d1VDQlg4RGZpTUFRVEJySWdJa0FDQUNJQUUzQXhBZ0FpQUFOZ0lJSUFKQkFEWUNEQ0FDSUFNcEF3QWlDVGNER0VLQWdJQ0E0QUFoQ2dKQUFrQWdBQ0FCRUpJQklnVkJBRWdOQUNBSlFvQ0FnSUJ3Z3lJTFFvQ0FnSUF3VWdSQUlBQWdDUkJnRFFFTEFrQWdCVUVDU1EwQUlBR25JZ012QVFaQkZXc2lCRUgvL3dOeFFRdFBEUUlnQWlBRVFRSjBRZnovRDNFaUJFR0FnQUpxS0FJQU5nSWdRUUVnQXk4QkJrSGxwZ0ZxTFFBQUlnWjBJUWdnQXlnQ0pDRUhJQXRDZ0lDQWdEQlNCRUFnQUNBRlFRSjBFQ2tpQkVVTkFrRUFJUU1EUUNBRElBVkdSUVJBSUFRZ0EwRUNkR29nQXpZQ0FDQURRUUZxSVFNTUFRc0xJQUlnQ0RZQ0tDQUNJQWMyQWlRZ0JDQUZRUVJCMHdBZ0FrRUlhaEMrQWdKQUlBSW9BZ3hGQkVBZ0FDQUZJQVowSWdNUUtTSUdEUUVMSUFBb0FoQWlBRUVRYWlBRUlBQW9BZ1FSQUFBTUF3c2dCaUFISUFNUUh5RUdRUUFoQXdKQUFrQUNRQUpBQWtBZ0NFRUJhdzRJQUFFSUFnZ0lDQU1JQ3dOQUlBTWdCVVlOQkNBRElBZHFJQVlnQkNBRFFRSjBhaWdDQUdvdEFBQTZBQUFnQTBFQmFpRUREQUFMQUFzRFFDQURJQVZHRFFNZ0J5QURRUUYwYWlBR0lBUWdBMEVDZEdvb0FnQkJBWFJxTHdFQU93RUFJQU5CQVdvaEF3d0FDd0FMQTBBZ0F5QUZSZzBDSUFjZ0EwRUNkQ0lJYWlBR0lBUWdDR29vQWdCQkFuUnFLQUlBTmdJQUlBTkJBV29oQXd3QUN3QUxBMEFnQXlBRlJnMEJJQWNnQTBFRGRHb2dCaUFFSUFOQkFuUnFLQUlBUVFOMGFpa0RBRGNEQUNBRFFRRnFJUU1NQUFzQUN5QUFLQUlRSWdOQkVHb2dCaUFES0FJRUVRQUFJQUFvQWhBaUFFRVFhaUFFSUFBb0FnUVJBQUFNQVFzZ0J5QUZJQWdnQkVHc2dBSnFLQUlBSUFKQkNHb1F2Z0lnQWlnQ0RBMEJDeUFCUWlDSXAwRjFUd1JBSUFHbklnQWdBQ2dDQUVFQmFqWUNBQXNnQVNFS0N5QUNRVEJxSkFBZ0NnOExFQUVBQzZFQ0FnSi9BMzRqQUVFd2F5SUNKQUJDZ0lDQWdPQUFJUVlDUUNBQUlBRkJBQkNUQVNJRlJRMEFJQUFnQWtFTWFpQURLUU1BSUFVb0FpZ2lCQ0FFRUZjTkFDQUNJQVEyQWdnZ0F5a0RDQ0lIUW9DQWdJQndnMEtBZ0lDQU1GSUVRQ0FBSUFKQkNHb2dCeUFFSUFRUVZ3MEJJQUlvQWdnaEJBc2dBaWdDRENFRElBQWdBVUVBRUlBRklnZENnSUNBZ1BBQWcwS0FnSUNBNEFCUkRRQWdCUzhCQmlFRklBQWdCeEFQSUFBZ0FVRUFFSUVGSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBRlFlV21BV290QUFBaEJTQUNJQWczQXhnZ0FpQUJOd01RSUFJZ0JDQURheUlFUVFBZ0JFRUFTaHV0TndNb0lBSWdCNmNnQXlBRmRHcXROd01nSUFCQkJDQUNRUkJxRVBZQ0lRWWdBQ0FJRUE4TElBSkJNR29rQUNBR0M4SURBZ1YvQkg0akFFRWdheUlDSkFCQ2dJQ0FnREFoQ1FKQUFrQWdBQ0FCRUpJQklnUkJBRWdOQUNBQUlBSkJER29nQXlrREFDQUVJQVFRVncwQUlBSWdCRFlDQ0NBREtRTUlJZ3BDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFJQUFnQWtFSWFpQUtJQVFnQkJCWERRRWdBaWdDQ0NFRUN5QUNLQUlNSVFNZ0FDQUJRUUFRa3dFaUJrVU5BQ0FHTHdFR0lRY2dBaUFFSUFOcklnVkJBQ0FGUVFCS0d5SUVyU0lMTndNWUlBSWdBVGNERUNBQVFRSWdBa0VRYWhEMkFpSUpRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdCVUVBVEEwQklBZEI1YVlCYWkwQUFDRUhJQUFnQVJEM0FnMEFJQUFnQ1JEM0FnMEFRZ0FoQ2dKQUlBQWdDVUVBRUpNQklnVkZEUUFnQmk4QkJpSUlJQVV2QVFaSERRQWdCU2dDSUNnQ0ZDQUlRZVdtQVdvdEFBQWlDSFlnQkVrTkFDQURJQVJxSUFZb0FpQW9BaFFnQ0haTERRQWdCU2dDSkNBR0tBSWtJQU1nQjNScUlBUWdCM1FRSHhvTUFnc0RRQ0FLSUF0UkRRSWdBQ0FCSUFNZ0NxZHFyUkJOSWd4Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBa2dDaUFNUVlDQUFSRFhBU0VFSUFwQ0FYd2hDaUFFUVFCT0RRQUxDeUFBSUFrUUQwS0FnSUNBNEFBaENRc2dBa0VnYWlRQUlBa0w1d0lCQVg0Z0FDQUJFSklCSWdKQkFFZ0VRRUtBZ0lDQTRBQVBDd0pBSUFKRkRRQUNRQUpBQWtBQ1FBSkFJQUduSWdBdkFRWkI1YVlCYWkwQUFBNEVBQUVDQXdRTElBQW9BaVFpQUNBQ2FpRUNBMEFnQUNBQ1FRRnJJZ0pQRFFVZ0FDMEFBQ0VESUFBZ0FpMEFBRG9BQUNBQ0lBTTZBQUFnQUVFQmFpRUFEQUFMQUFzZ0FDZ0NKQ0lBSUFKQkFYUnFJUUlEUUNBQUlBSkJBbXNpQWs4TkJDQUFMd0VBSVFNZ0FDQUNMd0VBT3dFQUlBSWdBenNCQUNBQVFRSnFJUUFNQUFzQUN5QUFLQUlrSWdBZ0FrRUNkR29oQWdOQUlBQWdBa0VFYXlJQ1R3MERJQUFvQWdBaEF5QUFJQUlvQWdBMkFnQWdBaUFETmdJQUlBQkJCR29oQUF3QUN3QUxJQUFvQWlRaUFDQUNRUU4wYWlFQ0EwQWdBQ0FDUVFocklnSlBEUUlnQUNrREFDRUVJQUFnQWlrREFEY0RBQ0FDSUFRM0F3QWdBRUVJYWlFQURBQUxBQXNRQVFBTElBRkNJSWluUVhWUEJFQWdBYWNpQUNBQUtBSUFRUUZxTmdJQUN5QUJDNGNDQWdaK0FuOGpBRUVnYXlJTEpBQkNnSUNBZ0RBaEJnSkFBa0FnQUNBQkVKSUJJZ3hCQUVnTkFDQUFJQU1wQXdBaUNCQmdEUUJDZ0lDQWdEQWhCeUFDUVFKT0JFQWdBeWtEQ0NFSEN5QU1yU0VKQTBBZ0JTQUpVZ1JBSUFBZ0FTQUZFRTBpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFzZ0FUY0RFQ0FMSUFVM0F3Z2dDeUFHTndNQUlBQWdDQ0FIUVFNZ0N4QWhJZ3BDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BaUFBSUFvUUpnUkFJQVJGQkVBZ0JpRUZEQVVMSUFBZ0JoQVBEQVFGSUFBZ0JoQVBJQVZDQVh3aEJRd0NDd0FMQzBMLy8vLy9EMEtBZ0lDQU1DQUVHeUVGREFFTElBQWdCaEFQUW9DQWdJRGdBQ0VGQ3lBTFFTQnFKQUFnQlF1ZkJRSUVmd0orSXdCQklHc2lCQ1FBUW9DQWdJRGdBQ0VJQWtBZ0FDQUJFSklCSWdaQkFFZ05BQUpBSUFHbklnVXZBUVlpQjBFVlJnUkFJQU1wQXdBaUNVSWdpS2RCZFU4RVFDQUpweUlISUFjb0FnQkJBV28yQWdBTElBQWdCRUVJYWlBSkVNUUZEUUlnQkNBRU5BSUlOd01RREFFTElBZEJHMDBFUUNBQUlBUkJDR29nQXlrREFCQjNEUUlnQkNBRU5RSUlOd01RREFFTElBZEJIVTBFUUNBQUlBUkJFR29nQXlrREFCRC9CRVVOQVF3Q0N5QUFJQVJCQ0dvZ0F5a0RBQkJDRFFFZ0JBSitJQVV2QVFaQkhrWUVRQ0FFS3dNSXRyeXREQUVMSUFRcEF3Z0xOd01RQ3lBRVFRQTJBZ2dDUUNBQ1FRRk1CRUFnQkNBR05nSWNEQUVMSUFBZ0JFRUlhaUFES1FNSUlBWWdCaEJYRFFFZ0JDQUdOZ0ljSUFKQkEwa05BQ0FES1FNUUlnbENnSUNBZ0hDRFFvQ0FnSUF3VVEwQUlBQWdCRUVjYWlBSklBWWdCaEJYRFFFTElBVW9BaUFvQWd3b0FpQXRBQVFFUUNBQUVHc01BUXNDUUFKQUFrQUNRQUpBQWtBZ0JTOEJCa0hscGdGcUxRQUFEZ1FBQVFJREJBc2dCQ2dDSENJQ0lBUW9BZ2dpQUV3TkJDQUZLQUlrSUFCcUlBUXRBQkFnQWlBQWF4QXJHZ3dFQ3lBRUtBSUlJZ0FnQkNnQ0hDSUNJQUFnQWtvYklRSWdCQzhCRUNFREEwQWdBQ0FDUmcwRUlBVW9BaVFnQUVFQmRHb2dBenNCQUNBQVFRRnFJUUFNQUFzQUN5QUVLQUlJSWdBZ0JDZ0NIQ0lDSUFBZ0Frb2JJUUlnQkNnQ0VDRURBMEFnQUNBQ1JnMERJQVVvQWlRZ0FFRUNkR29nQXpZQ0FDQUFRUUZxSVFBTUFBc0FDeUFFS0FJSUlnQWdCQ2dDSENJQ0lBQWdBa29iSVFJZ0JDa0RFQ0VJQTBBZ0FDQUNSZzBDSUFVb0FpUWdBRUVEZEdvZ0NEY0RBQ0FBUVFGcUlRQU1BQXNBQ3hBQkFBc2dBVUlnaUtkQmRVOEVRQ0FGSUFVb0FnQkJBV28yQWdBTElBRWhDQXNnQkVFZ2FpUUFJQWdMMndVQ0EzOElmaU1BUVVCcUlnVWtBRUtBZ0lDQU1DRUxJQVZDZ0lDQWdEQTNBemdnQlVLQWdJQ0FNRGNETUFKQUFrQUNRQ0FFUVFoeElnY0VRQ0FCUWlDSXAwRjFUd1JBSUFHbklnWWdCaWdDQUVFQmFqWUNBQXNnQlNBQUlBRVFrZ0VpQnF3M0F3Z2dCa0VBVGcwQkRBSUxJQUFnQlVFSWFpQUFJQUVRSlNJQkVEd05BUXNnQUNBREtRTUFJZzBRWUEwQUFrQWdBa0VCVEFSQUlBVXBBd2dpREVJQUlBeENBRlViSVFvZ0JFRUJjU0VFQTBBZ0NDQUtVUVJBSUFCQnNoNUJBQkFWREFRTElBd2dDRUovaFh3Z0NDQUVHeUVKSUFoQ0FYd2hDQ0FIQkVBZ0JTQUFJQUVnQ1JCeklnazNBekFnQ1VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBFREFNTElBQWdBU0FKSUFWQk1Hb1FoUUVpQWtFQVNBMERJQUpGRFFBTElBVXBBekFoQ1F3QkN5QURLUU1JSWdsQ0lJaW5RWFZQQkVBZ0NhY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBRVFRRnhJUVFnQlNrRENDRU1DeUFJSUF3Z0NDQU1WUnNoRGdOQUlBZ2dEbEVOQWlBTUlBaENmNFY4SUFnZ0JCc2hDZ0pBQWtBQ1FDQUhCRUFnQlNBQUlBRWdDaEJ6SWdzM0F6Z2dDMEtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQU1MSUFBZ0FTQUtJQVZCT0dvUWhRRWlBa0VBU0EwQ0lBSkZEUUVMSUFwQ2dJQ0FnQWg4UXYvLy8vOFBXQVIrSUFwQy8vLy8vdytEQlVLQWdJQ0F3SDRnQ3JtOUlncENnSUNBZ01DQmdQei9BSDBnQ2tMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMSWd0Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBRklBazNBeEFnQlNBQk53TW9JQVVnQ3pjRElDQUZJQVVwQXpnaUR6Y0RHQ0FBSUExQ2dJQ0FnREJCQkNBRlFSQnFFQ0VoQ2lBQUlBc1FEeUFBSUE4UUR5QUZRb0NBZ0lBd053TTRJQXBDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFrUUR5QUtJUWtMSUFoQ0FYd2hDQXdCQ3dzZ0JTQUpOd013SUFVcEF6Z2hDd3NnQUNBRktRTXdFQThnQUNBTEVBOUNnSUNBZ09BQUlRa0xJQUFnQVJBUElBVkJRR3NrQUNBSkM2d0lBZ04vQ1g0akFFRXdheUlGSkFCQ2dJQ0FnREFoQ1NBRlFvQ0FnSUF3TndNb0FrQUNRQUpBQWtBZ0JFRUljU0lIQkVBZ0FVSWdpS2RCZFU4RVFDQUJweUlHSUFZb0FnQkJBV28yQWdBTElBVWdBQ0FCRUpJQklnYXNOd01JSUFaQkFFNE5BUXdDQ3lBQUlBVkJDR29nQUNBQkVDVWlBUkE4RFFFTElBTXBBd0FoRDBLQWdJQ0FNQ0VPSUFKQkFrNEVRQ0FES1FNSUlRNExJQUFnRHhCZ0RRQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRURnMEZBQVlCQWdZR0JnVUFCZ01FQmd0Q2dJQ0FnQkFoQ1F3RkN5QUFJQUVDZmlBRktRTUlJZ2hDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQWhDLy8vLy93K0REQUVMUW9DQWdJREFmaUFJdWIwaUNFS0FnSUNBd0lHQS9QOEFmU0FJUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRcXdJaUNVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwRURBVUxJQUFnQVVJQUVLc0NJZ2xDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5Bd3dFQ3lBRklBRTNBeEFnQlNBRk5RSUlOd01ZSUFCQkFpQUZRUkJxRVBZQ0lnbENnSUNBZ0hDRFFvQ0FnSURnQUZJTkFnd0RDeUFBRUQ0aUNVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQlFvQ0FnSURnQUNFSkRBSUxRb0dBZ0lBUUlRa0xRZ0FoQ0NBRktRTUlJZ3BDQUNBS1FnQlZHeUVRQTBBZ0NDQVFVZ1JBQWtBQ1FDQUhCRUFnQlNBQUlBRWdDQkJ6SWdvM0F5Z2dDa0tBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQVVMSUFBZ0FTQUlJQVZCS0dvUWhRRWlBa0VBU0EwRUlBSkZEUUVMSUFnaENpQUlRb0NBZ0lBSVdnUkFRb0NBZ0lEQWZpQUl1YjBpQ2tLQWdJQ0F3SUdBL1A4QWZTQUtRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d5RUtDeUFLUW9DQWdJQndnMEtBZ0lDQTRBQlJEUU1nQlNBQk53TWdJQVVnQ2pjREdDQUZJQVVwQXlnaURUY0RFQ0FBSUE4Z0RrRURJQVZCRUdvUUlTRUxJQUFnQ2hBUElBdENnSUNBZ0hDRFFvQ0FnSURnQUZFTkF3SkFBa0FDUUFKQUFrQUNRQUpBSUFRT0RRQUJCUUlFQlFVRkFBRUZBd1FGQ3lBQUlBc1FKZzBGUW9DQWdJQVFJUWdNQ3dzZ0FDQUxFQ1pGRFFSQ2dZQ0FnQkFoQ0F3S0N5QUFJQWtnQ0NBTEVHcEJBRTROQXd3SEN5QUFJQWtnQ0VMLy8vLy9ENE1nQzBHQWdBRVExd0ZCQUU0TkFnd0dDeUFBSUFzUUprVU5BU0FOUWlDSXAwRjFUd1JBSUEybklnSWdBaWdDQUVFQmFqWUNBQXNnQUNBSklBd2dEUkJxUVFCSURRVWdERUlCZkNFTURBRUxJQUFnQ3hBUEN5QUFJQTBRRHlBRlFvQ0FnSUF3TndNb0N5QUlRZ0Y4SVFnTUFRc0xJQVJCREVjRVFDQUpJUWdNQXdzZ0JTQUJOd01RSUFVZ0RFTC8vLy8vRDRNM0F4Z2dBRUVDSUFWQkVHb1E5Z0lpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFVZ0NUY0RFQ0FBSUFBZ0NFSENBRUVCSUFWQkVHb1FyQUlRL0FGRkRRRUxRb0NBZ0lEZ0FDRUlDeUFBSUFrUUR3c2dBQ0FGS1FNb0VBOGdBQ0FCRUE4Z0JVRXdhaVFBSUFnTCtBVUNCMzhDZmlNQVFSQnJJZ0lrQUNBQ1FnQTNBd0FnQWtMLy8vLy9EemNEQ0FKQUlBSkI4QUlRMlFNaUFFVUVRQXdCQ3lBQVFTQnFRUUJCMEFJUUt4b2dBRUdncEFFcEFnQTNBZ2dnQUVHWXBBRXBBZ0EzQWdBZ0FFRUZOZ0lNSUFJcEF3Z2hCeUFDS1FNQUlRZ2dBRUdBZ0JBMkFtd2dBQ0FJTndNUUlBQWdCemNER0NBQVFlQUJha0VBUVRRUUt4b2dBRUVHTmdMa0FpQUFRUWMyQXVBQ0lBQkJDRFlDMkFJZ0FFRUpOZ0xVQWlBQVFRbzJBdEFDSUFCQkN6WUN6QUlnQUVFR05nTElBaUFBUVFjMkFzUUNJQUJCQ0RZQ3ZBSWdBRUVKTmdLNEFpQUFRUW8yQXJRQ0lBQkJDellDc0FJZ0FFRUdOZ0tzQWlBQVFRYzJBcWdDSUFCQkNEWUNvQUlnQUVFSk5nS2NBaUFBUVFvMkFwZ0NJQUJCQ3pZQ2xBSWdBRUVNTmdMY0FTQUFJQUEyQXRnQklBQWdBRUdnQVdvaUFUWUNwQUVnQUNBQk5nS2dBU0FBUVFBNkFHZ2dBQ0FBUWRnQWFpSUJOZ0pjSUFBZ0FUWUNXQ0FBSUFCQjBBQnFJZ0UyQWxRZ0FDQUJOZ0pRSUFBZ0FFSElBR29pQVRZQ1RDQUFJQUUyQWtnZ0FFRUFOZ0lrSUFCQkFEWUNOQ0FBUVFBMkFqd2dBRUlBTndNb0FrQUNRQ0FBUVlBQ0VQSUVEUUJCa0tjQklRUkJBU0VCQTBBZ0FVSGVBVWNFUUNBQUlBUVFQeUlGUVFBUTd3UWlCa1VOQWlBR1FSQnFJQVFnQlJBZklBVnFRUUE2QUFBZ0FDQUdRUVJCQTBFQklBRkJ6d0ZMR3lBQlFjOEJSaHNRcHdKRkRRSWdBVUVCYWlFQklBUWdCV3BCQVdvaEJBd0JDd3NnQUVHUW53RkJBVUV2RU0wRFFRQklEUUFnQUNnQ1JDSUJRUTAyQXZnQ0lBRkJEallDc0FJZ0FVSDhvd0UyQXB3Q0lBRkI0S01CTmdLTUFTQUJRY1NqQVRZQzFBRWdBVUVQTmdLUUF5QUJRUkEyQXVBQ0lBQkJBRFlDMEFFZ0FFS0VnSUNBZ0FJM0E4Z0JJQUJCRUdwQndBQWdBQ2dDQUJFREFDSUJEUUVnQUVFQU5nTFVBUXNnQUJEZkJBd0JDeUFCUVFCQndBQVFLeUVESUFCQ2dJQ0FnQ0EzQTRBQklBQWdBa0dBZ0JCck5nSjRJQUFnQWpZQ2RDQUFRWUNBRURZQ2NDQUFJQU0yQXRRQklBQWhBd3NnQWtFUWFpUUFJQU1McGdJQ0JIOENmaU1BUVJCcklnVWtBRUtBZ0lDQTRBQWhDQUpBSUFBZ0FSQ1NBU0lFUVFCSURRQWdBQ0FGUVF4cUlBTXBBd0FnQkNBRUVGY05BQ0FBSUFWQkNHb2dBeWtEQ0NBRUlBUVFWdzBBSUFVZ0JEWUNCQUovSUFRZ0FrRURTQTBBR2lBRUlBTXBBeEFpQ1VLQWdJQ0FjSU5DZ0lDQWdEQlJEUUFhSUFBZ0JVRUVhaUFKSUFRZ0JCQlhEUUVnQlNnQ0JBc2dCU2dDQ0NJSGF5SUdJQVFnQlNnQ0RDSURheUlDSUFJZ0Jrb2JJZ0pCQUVvRVFDQUJweUlHS0FJZ0tBSU1LQUlnTFFBRUJFQWdBQkJyREFJTElBWW9BaVFpQUNBRElBWXZBUVpCNWFZQmFpMEFBQ0lEZEdvZ0FDQUhJQU4wYWlBQ0lBTjBFSndCQ3lBQlFpQ0lwMEYxVHdSQUlBR25JZ0FnQUNnQ0FFRUJhallDQUFzZ0FTRUlDeUFGUVJCcUpBQWdDQXRLQWdGK0FYOUNnSUNBZ0RBaEFnSkFJQUZDZ0lDQWdIQlVEUUFnQWFjdkFRWWlBMEVWYTBILy93TnhRUXBMRFFBZ0FDQUFLQUlRS0FKRUlBTkJHR3hxS0FJRUVDMGhBZ3NnQWdzc0FRRitRb0NBZ0lEZ0FDRUZJQUFnQVJEM0FnUitRb0NBZ0lEZ0FBVWdBQ0FCSUFBZ0FDQUVFTlVGQ3d2Q0F3SUVmZ1IvSXdCQkVHc2lDQ1FBUW9DQWdJQXdJUVZDZ0lDQWdEQWhCQ0FDUVFKT0JFQWdBeWtEQ0NFRUN5QURLUU1BSVFaQ2dJQ0FnT0FBSVFjQ1FDQUFJQUZCQUJDVEFTSUNSUTBBSUFBZ0NDQUVFT0lERFFBQ1FBSkFBa0FDUUFKQUlBZ3BBd0FpQkVJQVV3UkFEQUVMSUFJb0FpQW9BZ3dvQWlBdEFBUU5CQ0FBSUFZUUpTSUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdCYWNpQXk4QkJpSUpRUlZyUWYvL0EzRkJDazBFUUNBREtBSWdJZ29vQWd3b0FpQWlDeTBBQkEwRklBUWdBalVDS0NBRE5RSW9JZ1o5VlEwQklBa2dBaThCQmlJRFJ3MENJQVFnQTBIbHBnRnFNUUFBSWdHR3B5QUNLQUlnSWdJb0Fnd29BaUFvQWdnZ0FpZ0NFR3BxSUFzb0FnZ2dDaWdDRUdvZ0JpQUJocWNRbkFFTUF3c2dBQ0FJUVFocUlBVVFQQTBESUFRZ0FqVUNLQ0FJS1FNSUlnWjlWdzBCQ3lBQVFlSFlBRUVBRUZBTUJBc2dCS2NoQWtFQUlRTURRQ0FHSUFPdFZ3MEJJQUFnQlNBREVMQUJJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQ0FDSUFOcUlRa2dBMEVCYWlFRElBQWdBU0FKSUFRUXBRRkJBRTROQUFzTUF3dENnSUNBZ0RBaEJ3d0NDd3dCQ3lBQUVHc0xJQUFnQlJBUElBaEJFR29rQUNBSEN4NEFJQUFnQVVFQUVKTUJJZ0JGQkVCQ2dJQ0FnT0FBRHdzZ0FEVUNLQXVyQVFJRGZ3RitJd0JCRUdzaUJTUUFJQVVnQXEwM0F3Z0NRQ0FBSUFGQkFTQUZRUWhxRU5vRElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUNRUUFnQWtFQVNoc2hBZ05BSUFJZ0JFWU5BU0FESUFSQkEzUnFLUU1BSWdkQ0lJaW5RWFZQQkVBZ0I2Y2lCaUFHS0FJQVFRRnFOZ0lBQ3lBQUlBRWdCQ0FIRUtVQklRWWdCRUVCYWlFRUlBWkJBRTROQUFzZ0FDQUJFQTlDZ0lDQWdPQUFJUUVMSUFWQkVHb2tBQ0FCQ3dZQVFmREdCQXVDQndJSmZnSi9Jd0JCTUdzaURTUUFJQU1wQXdBaEJDQU5Rb0NBZ0lBd053TVlRUUVoRGdKQUFrQUNmaUFDUVFKSUJFQkNnSUNBZ0RBaENrS0FnSUNBTUF3QkMwS0FnSUNBTUNBREtRTUlJZ3BDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFHa0tBZ0lDQU1DRUpRb0NBZ0lBd0lRWkNnSUNBZ0RBaEIwS0FnSUNBTUNFRklBQWdDaEJnRFFGQkFDRU9Rb0NBZ0lBd0lBSkJBMGtOQUJvZ0F5a0RFQXNoQ3dKQUFrQWdBQ0FFUWRFQklBUkJBQkFVSWdaQ2dJQ0FnSENESWdWQ2dJQ0FnREJTQkVBZ0JVS0FnSUNBNEFCUkJFQkNnSUNBZ0RBaENVS0FnSUNBTUNFR1FvQ0FnSUF3SVFjTUF3c2dBQ0FHRUE4Z0FCQStJZ2RDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRUtBZ0lDQU1DRUpRb0NBZ0lBd0lRWkNnSUNBZ09BQUlRY01Bd3NnQkVJZ2lLZEJkVThFUUNBRXB5SUNJQUlvQWdCQkFXbzJBZ0FMSUEwZ0JEY0RFQ0FBSUExQkVHcEJDSEpCQUJDWkF5RUNJQTBwQXhnaENTQU5LUU1RSVFZZ0FnMENRZ0FoQlFOQUlBQWdCaUFKSUExQkJHb1FyZ0VpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBSUEwb0FnUU5BeUFBSUFjZ0JTQUVFR29oQWlBRlFnRjhJUVVnQWtFQVRnMEJDd3RDZ0lDQWdEQWhCU0FHUW9DQWdJQndnMEtBZ0lDQU1GRU5BeUFBSUFaQkFSQ3RBUm9NQXd0Q2dJQ0FnREFoQ1VLQWdJQ0FNQ0VHUW9DQWdJQXdJUVVnQUNBRUVDVWlCMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMENDeUFBSUExQkNHb2dCeEE4UVFCSURRQWdEUUorSUEwcEF3Z2lCRUtBZ0lDQUNIeEMvLy8vL3c5WUJFQWdCRUwvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQVM1dlNJRlFvQ0FnSURBZ1lEOC93QjlJQVZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeUlJTndNZ0lBQWdBVUVCSUExQklHb1EyZ01oQlNBQUlBZ1FEd0pBSUFWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUVJQUlRZ2dCRUlBSUFSQ0FGVWJJUXdEUUNBSUlBeFJEUVFnQUNBSElBZ1FjeUlFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVDUUNBT0JFQWdCQ0VCREFFTElBMGdCRGNESUNBTklBaEMvLy8vL3crRE53TW9JQUFnQ2lBTFFRSWdEVUVnYWhBaElRRWdBQ0FFRUE4Z0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ0N5QUFJQVVnQ0NBQkVJWUJJUUlnQ0VJQmZDRUlJQUpCQUU0TkFBc0xEQUVMUW9DQWdJQXdJUVVMSUFBZ0JSQVBRb0NBZ0lEZ0FDRUZDeUFBSUFjUUR5QUFJQVlRRHlBQUlBa1FEeUFOUVRCcUpBQWdCUXNSQUNBQVFSQnFJQUlnQUNnQ0JCRUFBQXVuQkFJRWZ3RitJd0JCSUdzaUJTUUFRb0NBZ0lEZ0FDRUpBa0FnQUNBQlFTQVFTeUlIUlEwQUlBUkI1YVlCYWkwQUFDRUlJQUFnQlVFSWFpQURLUU1BRUtZQkRRQWdBeWtEQ0NFQklBVkNBRGNER0NBRlFRQTJBaFFDUUNBRVFSdE1CRUFnQUNBRlFSUnFJQUVRZDBVTkFRd0NDeUFFUVIxTkJFQWdBQ0FGUVJocUlBRVEvd1JGRFFFTUFnc2dBQ0FGSUFFUVFnMEJJQVJCSGtZRVFDQUZJQVVyQXdDMk9BSVVEQUVMSUFVZ0JTa0RBRGNER0F0QkFTRUdJQUpCQTA0RVFDQUFJQU1wQXhBUS9RRkJBWE1oQmdzZ0J5Z0NEQ2dDSUNJQ0xRQUVCRUFnQUJCckRBRUxJQWMxQWhRZ0JTa0RDQ0lCUVFFZ0NIU3NmRlFFUUNBQVFkL3lBRUVBRUZBTUFRc2dBYWNnQWlnQ0NDQUhLQUlRYW1vaEFBSkFBa0FDUUFKQUFrQWdCRUVXYXc0S0FBQUJBUUlDQXdNQ0F3UUxJQUFnQlNnQ0ZEb0FBRUtBZ0lDQU1DRUpEQVFMSUFBZ0JTOEJGQ0lBUVFoMElBQkJDSFp5SUFBZ0JoczdBQUJDZ0lDQWdEQWhDUXdEQ3lBQUlBVW9BaFFpQUVFWWRDQUFRWUQrQTNGQkNIUnlJQUJCQ0haQmdQNERjU0FBUVJoMmNuSWdBQ0FHR3pZQUFFS0FnSUNBTUNFSkRBSUxJQUFnQlNrREdDSUJRamlHSUFGQ2dQNERnMElvaG9RZ0FVS0FnUHdIZzBJWWhpQUJRb0NBZ1BnUGcwSUlob1NFSUFGQ0NJaENnSUNBK0ErRElBRkNHSWhDZ0lEOEI0T0VJQUZDS0loQ2dQNERneUFCUWppSWhJU0VJQUVnQmhzM0FBQkNnSUNBZ0RBaENRd0JDeEFCQUFzZ0JVRWdhaVFBSUFrTEJnQkI2TVlFQzZJSEFnRitCSDhqQUVFUWF5SUhKQUJDZ0lDQWdPQUFJUVVDUUNBQUlBRkJJQkJMSWdoRkRRQWdCRUhscGdGcUxRQUFJUWtnQUNBSFFRaHFJQU1wQXdBUXBnRU5BRUVCSVFZZ0FrRUNUZ1JBSUFBZ0F5a0RDQkQ5QVVFQmN5RUdDeUFJS0FJTUtBSWdJZ0l0QUFRRVFDQUFFR3NNQVFzZ0NEVUNGQ0FIS1FNSUlnRkJBU0FKZEt4OFZBUkFJQUJCMy9JQVFRQVFVQXdCQ3lBQnB5QUNLQUlJSUFnb0FoQnFhaUVDQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUVRUlpyRGdvS0FBRUNBd1FGQmdjSUNRc2dBakVBQUNFRkRBb0xJQUl2QUFBaUFFRUlkQ0FBUVFoMmNpQUFJQVlicmNOQy8vLy8vdytESVFVTUNRc2dBaThBQUNJQVFRaDBJQUJCQ0haeUlBQWdCaHV0UXYvL0E0TWhCUXdJQ3lBQ0tBQUFJZ0JCR0hRZ0FFR0EvZ054UVFoMGNpQUFRUWgyUVlEK0EzRWdBRUVZZG5KeUlBQWdCaHV0SVFVTUJ3c2dBaWdBQUNJQVFSaDBJQUJCZ1A0RGNVRUlkSElnQUVFSWRrR0EvZ054SUFCQkdIWnljaUFBSUFZYklnQkJBRTRFUUNBQXJTRUZEQWNMUW9DQWdJREFmaUFBdUwwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeUVGREFZTElBQWdBaWtBQUNJQlFqaUdJQUZDZ1A0RGcwSW9ob1FnQVVLQWdQd0hnMElZaGlBQlFvQ0FnUGdQZzBJSWhvU0VJQUZDQ0loQ2dJQ0ErQStESUFGQ0dJaENnSUQ4QjRPRUlBRkNLSWhDZ1A0RGd5QUJRamlJaElTRUlBRWdCaHNRaHdJaEJRd0ZDeUFBSUFJcEFBQWlBVUk0aGlBQlFvRCtBNE5DS0lhRUlBRkNnSUQ4QjROQ0dJWWdBVUtBZ0lENEQ0TkNDSWFFaENBQlFnaUlRb0NBZ1BnUGd5QUJRaGlJUW9DQS9BZURoQ0FCUWlpSVFvRCtBNE1nQVVJNGlJU0VoQ0FCSUFZYkVQc0RJUVVNQkF0Q2dJQ0FnTUIrSUFJb0FBQWlBRUVZZENBQVFZRCtBM0ZCQ0hSeUlBQkJDSFpCZ1A0RGNTQUFRUmgyY25JZ0FDQUdHNzY3dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJJUVVNQXd0Q2dJQ0FnTUIrSUFJcEFBQWlBVUk0aGlBQlFvRCtBNE5DS0lhRUlBRkNnSUQ4QjROQ0dJWWdBVUtBZ0lENEQ0TkNDSWFFaENBQlFnaUlRb0NBZ1BnUGd5QUJRaGlJUW9DQS9BZURoQ0FCUWlpSVFvRCtBNE1nQVVJNGlJU0VoQ0FCSUFZYklnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNoQlF3Q0N4QUJBQXNnQWpBQUFFTC8vLy8vRDRNaEJRc2dCMEVRYWlRQUlBVUxVZ0lCZndGK1FvQ0FnSURnQUNFRUlBQWdBU0FDRUpNQklnTUVmaUFES0FJZ0lnTW9BZ3dvQWlBdEFBUUVRQ0FDUlFSQVFnQVBDeUFBRUd0Q2dJQ0FnT0FBRHdzZ0F6VUNGQVZDZ0lDQWdPQUFDd3ZYQVFFRGZ3SkFJQUZDZ0lDQWdIQlVEUUFnQWFjaUF5OEJCa0U1UncwQUlBTW9BaUFpQkVVTkFDQUVRY3dBYWlFRElBUkJ5QUJxSVFVRFFDQUZJQU1vQWdBaUEwY0VRQ0FES1FNUUlnRkNnSUNBZ0dCYUJFQWdBQ0FCcHlBQ0VRQUFDeUFES1FNWUlnRkNnSUNBZ0dCYUJFQWdBQ0FCcHlBQ0VRQUFDeUFES1FNZ0lnRkNnSUNBZ0dCYUJFQWdBQ0FCcHlBQ0VRQUFDeUFES1FNb0lnRkNnSUNBZ0dCYUJFQWdBQ0FCcHlBQ0VRQUFDeUFEUVFScUlRTU1BUXNMSUFRb0FnUkJmbkZCQkVZTkFDQUFJQVJCQ0dvZ0FoRHZBd3NMQmdCQjRNWUVDekFCQVg4Q1FDQUJRb0NBZ0lCd1ZBMEFJQUduSWdJdkFRWkJPVWNOQUNBQ0tBSWdJZ0pGRFFBZ0FDQUNFSWNGQ3dzTkFDQUFJQUVnQWtFM0VQMEZDd3NBSUFBZ0FVRTNFUDRGQ3hZQkFYOGdBYWNvQWlBaUFnUkFJQUFnQWhDSUJRc0xNUUVCZnlBQnB5Z0NJQ0lDQkVBZ0FDQUNLQUlJRUtNRklBQWdBaWtEQUJBaklBQkJFR29nQWlBQUtBSUVFUUFBQ3d2Y0FRRUVmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lCQzhCQmtFeFJ3MEFJQVFvQWlBaUJrVU5BRUVBSVFRRFFDQUVRUUpHUlFSQUlBWWdCRUVEZEdvaUJVRUlhaUVESUFWQkJHb2hCUU5BSUFVZ0F5Z0NBQ0lEUndSQUlBTXBBd2dpQVVLQWdJQ0FZRm9FUUNBQUlBR25JQUlSQUFBTElBTXBBeEFpQVVLQWdJQ0FZRm9FUUNBQUlBR25JQUlSQUFBTElBTXBBeGdpQVVLQWdJQ0FZRm9FUUNBQUlBR25JQUlSQUFBTElBTkJCR29oQXd3QkN3c2dCRUVCYWlFRURBRUxDeUFHS1FNWUlnRkNnSUNBZ0dCVURRQWdBQ0FCcHlBQ0VRQUFDd3VNQVFFRmZ3SkFJQUZDZ0lDQWdIQlVEUUFnQWFjaUFpOEJCa0V4UncwQUlBSW9BaUFpQkVVTkFBTkFJQU5CQWtaRkJFQWdCQ0FEUVFOMGFpSUNRUVJxSVFVZ0FpZ0NDQ0VDQTBBZ0FpQUZSa1VFUUNBQ0tBSUVJUVlnQUNBQ0VLNENJQVloQWd3QkN3c2dBMEVCYWlFRERBRUxDeUFBSUFRcEF4Z1FJeUFBUVJCcUlBUWdBQ2dDQkJFQUFBc0xKUUFnQlNrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FBc2dBUXN4QUNBRktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUFpQUNLQUlBUVFGcU5nSUFDeUFBSUFFUWlnRkNnSUNBZ09BQUN3WUFRZGpHQkF2WUFRRUNmaU1BUVJCcklnSWtBQ0FGS1FNQUlRWWdBaUFBSUFVcEF3aENnSUNBZ0RCQkFFRUFFQ0VpQVRjRENBSkFJQUZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFZZ0FpQUNRUWhxUVFBUS9nRWhCaUFBSUFJcEF3Z1FEeUFHUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQmlFQkRBRUxJQUlnQUVIUUFFSFJBQ0FFRzBFQVFRQkJBU0FERU04QklnYzNBd0JDZ0lDQWdPQUFJUUVnQUNBSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkg0Z0FDQUdRZjhBUVFFZ0FoQ3RBaUVCSUFJcEF3QUZJQVlMRUE4TElBSkJFR29rQUNBQkM2SUNBUUorSXdCQklHc2lBaVFBSUFNcEF3QWhCQUpBSUFBZ0FVS0FnSUNBTUJEakFTSUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQUNRQ0FBSUFRUU9FVUVRQ0FFUWlDSXAwRjFUd1JBSUFTbklnTWdBeWdDQUVFQ2FqWUNBQXNnQWlBRU53TVlJQUlnQkRjREVBd0JDeUFDSUFRM0F3Z2dBaUFGTndNQVFRQWhBd05BSUFOQkFrWU5BU0FDUVJCcUlBTkJBM1JxSUFCQnp3QkJBU0FEUVFJZ0FoRFBBU0lFTndNQUlBUkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQURRUUZHQkVBZ0FDQUNLUU1RRUE4TElBQWdCUkFQUW9DQWdJRGdBQ0VGREFNRklBTkJBV29oQXd3QkN3QUxBQXNnQUNBRkVBOGdBQ0FCUWY4QVFRSWdBa0VRYWhDc0FpRUZJQUFnQWlrREVCQVBJQUFnQWlrREdCQVBDeUFDUVNCcUpBQWdCUXM1QUNNQVFSQnJJZ0lrQUNBQ1FvQ0FnSUF3TndNQUlBSWdBeWtEQURjRENDQUFJQUZCL3dCQkFpQUNFS3dDSVFFZ0FrRVFhaVFBSUFFTHVBRUNBbjRDZnlNQVFSQnJJZ1lrQUFKQUFrQWdBQ0FCUVRFUVN3UkFJQUFnQVVLQWdJQ0FNQkRqQVNJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJZ0FDQUdJQVFRdndJaEJTQUFJQVFRRHlBRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FDQUJJQU1nQmhDdkFpRUNBMEFnQjBFQ1JrVUVRQ0FBSUFZZ0IwRURkR29wQXdBUUR5QUhRUUZxSVFjTUFRc0xJQUpGRFFFZ0FDQUZFQThMUW9DQWdJRGdBQ0VFREFFTElBVWhCQXNnQmtFUWFpUUFJQVFMSUFBZ0FVSWdpS2RCZFU4RVFDQUJweUlBSUFBb0FnQkJBV28yQWdBTElBRUw1UU1CQlg0akFFRXdheUlDSkFBQ1FDQUJRdi8vLy85dldBUkFJQUFRSkVLQWdJQ0E0QUFoQlF3QkN5QUFJQUpCSUdvZ0FSQy9BaUlGUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUJDZ0lDQWdEQWhCa0tBZ0lDQU1DRUVBa0FDUUNBQUlBRkJnQUVnQVVFQUVCUWlDRUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQ0JCZ0RRQWdBQ0FES1FNQVFRQVE1d0VpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBREFFTElBQWdCRUhxQUNBRVFRQVFGQ0lHUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFEUUNBQ0lBQWdCQ0FHSUFKQkZHb1FyZ0VpQnpjREdDQUhRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBaWdDRkEwQ0lBQWdDQ0FCUVFFZ0FrRVlhaEFoSVFjZ0FDQUNLUU1ZRUE4Z0IwS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBQWdBQ0FIUWY4QVFRSWdBa0VnYWhDdEFoRDhBVVVOQVFzTElBQWdCRUVCRUswQkdnc2dBQ2dDRUNJREtRT0FBU0VCSUFOQ2dJQ0FnQ0EzQTRBQklBSWdBVGNEQ0NBQUlBSXBBeWhDZ0lDQWdEQkJBU0FDUVFocUVDRWhBU0FBSUFJcEF3Z1FEeUFBSUFVZ0FTQUJRb0NBZ0lCd2cwS0FnSUNBNEFCUklnTWJFQTlDZ0lDQWdPQUFJQVVnQXhzaEJRc2dBQ0FJRUE4Z0FDQUdFQThnQUNBRUVBOGdBQ0FDS1FNZ0VBOGdBQ0FDS1FNb0VBOExJQUpCTUdva0FDQUZDeDRBSUFBZ0FUWUNjQ0FBSUFFRWZ5QUFLQUowSUFGckJVRUFDellDZUF2ekF3SUZmZ0YvSXdCQklHc2lBaVFBSUFBZ0JTa0RBQkQ5QVNFTElBSWdCU2tERUNJSU53TVlJQVVwQXlBaENpQUZLUU1ZSVFrQ1FBSkFJQUFnQWtFVWFpQUZLUU1JRUhjTkFBSkFJQXNOQUNBRlFvR0FnSUFRTndNQUFrQWdCRUVEY1NJRlFRRkdCRUJDZ0lDQWdPQUFJUUVnQUJBMElnWkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkJBSkFJQUJCN3ZjQVFiNzZBQ0FFUVFSeElnUWJFR0lpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0JrR0lBU0FIUVFjUUdVRUFTQTBBSUFNcEF3QWlCMElnaUtkQmRVOEVRQ0FIcHlJRElBTW9BZ0JCQVdvMkFnQUxJQUFnQmtHSkFVSEFBQ0FFR3lBSFFRY1FHVUVBVGcwQ0N5QUFJQVlRRHd3RUN5QURLUU1BSWdaQ0lJaW5RWFZKRFFBZ0JxY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBZ2dBaWdDRkNBR1FRY1Fyd0ZCQUVnTkFVS0FnSUNBNEFBaEFTQUFJQXBCZnhEZUF5SURRUUJJRFFJZ0EwVU5BQUpBSUFWQkFrWUVRQ0FDSUFBZ0NCQ0NCU0lHTndNSUlBWkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkJDQUFJQWxDZ0lDQWdEQkJBU0FDUVFocUVDRWhBU0FBSUFJcEF3Z1FEd3dCQ3lBQUlBbENnSUNBZ0RCQkFTQUNRUmhxRUNFaEFRc2dBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQUFnQVJBUEMwS0FnSUNBTUNFQkRBRUxRb0NBZ0lEZ0FDRUJDeUFDUVNCcUpBQWdBUXVwQ0FJRGZ3MStJd0JCOEFCcklnVWtBQ0FGUW9DQWdJQXdOd05RQWtBZ0FVTC8vLy8vYjFnRVFDQUFFQ1JDZ0lDQWdPQUFJUXdNQVFzZ0FDQUZRZUFBYWlBQkVMOENJZ3hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BRUtBZ0lDQU1DRU5Rb0NBZ0lBd0lRaENnSUNBZ0RBaEN3SkFBa0FnQUNBQlFZQUJJQUZCQUJBVUloSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQklRWUEwQUFrQWdBQ0FES1FNQVFRQVE1d0VpQzBLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBREFFTElBQWdDMEhxQUNBTFFRQVFGQ0lOUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQlNBQUVENGlEamNEVUNBT1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FCQStJZ2hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRUtBZ0lDQTRBQWhDQXdDQ3lBQUlBaENBRUlCUVFjUXZRRkJBRWdOQVNBRlFlQUFhaUFFUVFKR1FRTjBjaUVHSUFVcEEyQWlFMElnaUtkQmRFc2hCeUFGS1FOb0loUkNJSWluUVhWSklRTUNRQUpBQWtBRFFDQUZJQUFnQ3lBTklBVkJER29RcmdFaUNUY0RXQ0FKUW9DQWdJQndnMEtBZ0lDQTRBQlJEUVVnQlNnQ0RFVUVRQ0FBSUJJZ0FVRUJJQVZCMkFCcUVDRWhFU0FBSUFVcEExZ1FEeUFSUW9DQWdJQndnMEtBZ0lDQTRBQlJEUVFnQlNBT053TWdJQVVnRURjREdDQUZRb0NBZ0lBUU53TVFJQVlwQXdBaENTQUZJQWczQXpBZ0JTQUpOd01vSUFCQnpnQkJBU0FFUVFVZ0JVRVFhaERQQVNJS1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJQ1FDQUVRUUZHQkVBZ0NpRVBJQUJCemdCQkFVRUZRUVVnQlVFUWFoRFBBU0lLUW9DQWdJQndnMEtBZ0lDQTRBQlJEUVFNQVFzQ1FDQUVRUUpHQkVBZ0FDQU9JQkNuUW9DQWdJQXdRUWNRcndGQkFFZ05CeUFUSWdraER5QUhEUUVNQWdzZ0NpRVBJQlFpQ1NFS0lBTU5BUXNnQ2FjaUFpQUNLQUlBUVFGcU5nSUFDeUFBSUFoQkFSRGVBMEVBU0FSQUlBQWdFUkFQSUFBZ0R4QVBEQVFMSUFVZ0NqY0RTQ0FGSUE4M0EwQWdBQ0FSUWY4QVFRSWdCVUZBYXhDdEFpRUpJQUFnRHhBUElBQWdDaEFQSUJCQ0FYd2hFQ0FBSUFrUS9BRkZEUUVNQkFzTElBQWdDRUYvRU40RElnSkJBRWdOQkNBQ1JRMEZJQVJCQWtZRVFDQUFJQTRRZ2dVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRklBQWdEaEFQSUFVZ0FUY0RVQXNnQUNBQUlBWXBBd0JDZ0lDQWdEQkJBU0FGUWRBQWFoQWhFUHdCRFFRTUJRc2dFU0VLQ3lBQUlBb1FEd3NnQUNBTFFRRVFyUUVhREFFTEN5QUFLQUlRSWdJcEE0QUJJUUVnQWtLQWdJQ0FJRGNEZ0FFZ0JTQUJOd01BSUFBZ0JTa0RhQ0lVUW9DQWdJQXdRUUVnQlJBaElRRWdBQ0FGS1FNQUVBOGdBQ0FNSUFFZ0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVNJQ0d4QVBRb0NBZ0lEZ0FDQU1JQUliSVF3Z0JTa0RZQ0VUQ3lBQUlCSVFEeUFBSUFnUUR5QUFJQVVwQTFBUUR5QUFJQTBRRHlBQUlBc1FEeUFBSUJNUUR5QUFJQlFRRHdzZ0JVSHdBR29rQUNBTUN5QUFJQUZDSUlpblFYVlBCRUFnQWFjaUFDQUFLQUlBUVFGcU5nSUFDeUFCQ3pRQUlBTXBBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFBZ0FTQUFJQVVwQXdBUS9RRVEvd0lMb0FZQ0FuOERmaU1BUVVCcUlnVWtBRUtBZ0lDQTRBQWhCd0pBSUFBZ0JVRWdhaEROQWlJSVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBQ1FDQUFJQVZCSUdvQ2Z3SkFBa0FDUUFKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQmk4QkJrRTNSdzBBSUFZb0FpQWlCZzBCQ3lBQVFmUStRUUFRRlF3QkN3SkFJQVJGQkVBZ0Jpa0RDQ0lIUWlDSXAwRjFTUTBCSUFlbklnUWdCQ2dDQUVFQmFqWUNBQXdCQ3lBQUlBWXBBd0FpQVVFR1FSY2dCRUVCUmhzZ0FVRUFFQlFpQjBLQWdJQ0FjSU1pQVVLQWdJQ0FJRklFUUNBQlFvQ0FnSURnQUZFTkFpQUJRb0NBZ0lBd1VnMEJDeUFES1FNQUlnRkNJSWluSVFJZ0JFRUJSZ1JBSUFKQmRVOEVRQ0FCcHlJQ0lBSW9BZ0JCQVdvMkFnQUxJQVVnQUNBQlFRRVEvd0kzQXdCQkFBd0VDeUFDUVhWUEJFQWdBYWNpQWlBQ0tBSUFRUUZxTmdJQUN3d0NDeUFGSUFBZ0Jpa0RBQ0FISUFKQkFFb2dBeUFGUVJScUVNY0ZJZ0UzQXhnZ0FDQUhFQThnQVVLQWdJQ0FjSU1pQjBLQWdJQ0E0QUJSRFFBZ0JTZ0NGRUVDUmdSQUlBVWdBQ0FCSUFWQkZHb1Eyd1VpQnpjREdDQUFJQUVRRHlBSFFvQ0FnSUJ3Z3lJSFFvQ0FnSURnQUZFTkFRc2dCMEtBZ0lDQTRBQlJEUUFnQUNBQUtRTlFJQVVnQlVFWWFrRUFFUDRCSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUlBVXBBeGdRRHd3QkN5QUZJQVVvQWhSQkFFZXRRb0NBZ0lBUWhEY0RPQ0FGSUFCQnpRQkJBVUVBUVFFZ0JVRTRhaERQQVNJSk53TUFRb0NBZ0lEZ0FDRUhJQWxDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FBSUFVcEF4Z1FEeUFGUW9DQWdJQXdOd01JSUFBZ0FTQUZJQVZCSUdvUXJ3SWhBaUFBSUFrUUR5QUFJQUVRRHlBQUlBVXBBeUFRRHlBQUlBVXBBeWdRRHlBQ1JRMEVJQUFnQ0JBUERBVUxJQUFnQVJBUElBQWdCU2tER0JBUElBQWdCU2tESUJBUElBQWdCU2tES0JBUElBQWdDQkFQREFRTElBQW9BaEFpQWlrRGdBRWhBU0FDUW9DQWdJQWdOd09BQVFzZ0JTQUJOd01BUVFFTFFRTjBjaWtEQUVLQWdJQ0FNRUVCSUFVUUlTRUJJQUFnQlNrREFCQVBJQUFnQVJBUElBQWdCU2tESUJBUElBQWdCU2tES0JBUEN5QUlJUWNMSUFWQlFHc2tBQ0FIQzlBQ0FnTitBbjhqQUVFUWF5SUdKQUFnQVVFRlJnUkFJQUlwQXhBaEJDQUFJQUlwQXhnUS9RRWhCeUFHSUFJcEF5QWlBemNEQ0FKL0FrQUNRQ0FFUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FEUWlDSXB5RUJJQWNFUUNBQlFYVlBCRUFnQTZjaUFTQUJLQUlBUVFGcU5nSUFDeUFBSUFNUWlnRU1Bd3NnQVVGMVNRMEJJQU9uSWdFZ0FTZ0NBRUVCYWpZQ0FBd0JDeUFBSUFSQ2dJQ0FnREJCQVNBR1FRaHFFQ0VoQXdzZ0JpQUROd01BUVFBZ0EwS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkdnc2dBQ2dDRUNJQktRT0FBU0VESUFGQ2dJQ0FnQ0EzQTRBQklBWWdBemNEQUVFQkN5RUJRb0NBZ0lBd0lRUWdBQ0FDSUFGQkEzUnFLUU1BSWdWQ2dJQ0FnSENEUW9DQWdJQXdVZ1IrSUFBZ0JVS0FnSUNBTUVFQklBWVFJU0VFSUFZcEF3QUZJQU1MRUE4Z0JrRVFhaVFBSUFRUEMwR2VpZ0ZCcnZ3QVFkZnBBa0g5L0FBUUFBQUxuZ0lCQVg5QkFDRUNBa0FnQlNrREFDSUJRb0NBZ0lCd1ZBMEFJQUduSWdVdkFRWkJPVWNOQUNBRktBSWdJUUlMSUFSQkFYRWhCU0FDS0FJRUlRWWdBeWtEQUNFQkFrQUNRQUpBSUFSQkFrNEVRQ0FHUVg1eFFRUkhEUUlnQWtFRk5nSUVJQVVFUUNBQUlBSW9Ba3dnQVJEZkF3d0NDeUFBSUFJZ0FVRUJFUG9DREFFTElBWkJBMGNOQWlBQ0lBVTJBaFFnQVVJZ2lLY2hBd0pBSUFVRVFDQURRWFZQQkVBZ0FhY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBRVFpZ0VNQVFzZ0EwRjFUd1JBSUFHbklnTWdBeWdDQUVFQmFqWUNBQXNnQWlnQ1JFRUlheUFCTndNQUN5QUFJQUlRaFFVTFFvQ0FnSUF3RHd0QjU0Y0JRYTc4QUVIVG1RRkIyY3NBRUFBQUMwSEJoUUZCcnZ3QVFkeVpBVUhaeXdBUUFBQUxqZ01DQW44Q2ZpTUFRU0JySWdJa0FBSkFJQUZDZ0lDQWdIQlVEUUFnQWFjaUJTOEJCa0U1UncwQUlBVW9BaUFoQmdzQ1FDQUFJQUpCRUdvUXpRSWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQVpGQkVBZ0FFSDRMMEVBRUJVZ0FDZ0NFQ0lES1FPQUFTRUhJQU5DZ0lDQWdDQTNBNEFCSUFJZ0J6Y0RDQ0FBSUFJcEF4Z2lCMEtBZ0lDQU1FRUJJQUpCQ0dvUUlTRUlJQUFnQWlrRENCQVBJQUFnQ0JBUElBQWdBaWtERUJBUElBQWdCeEFQREFJTElBQkJNQkJmSWdVRVFDQUZJQVEyQWdnZ0F5a0RBQ0lIUWlDSXAwRjFUd1JBSUFlbklnTWdBeWdDQUVFQmFqWUNBQXNnQlNBSE53TVFJQUZDSUlpblFYVlBCRUFnQWFjaUF5QURLQUlBUVFGcU5nSUFDeUFGSUFFM0F4Z2dCU0FDS1FNUU53TWdJQVVnQWlrREdEY0RLQ0FHS0FKSUlnTWdCVFlDQkNBRklBWkJ5QUJxTmdJRUlBVWdBellDQUNBR0lBVTJBa2dnQmlnQ0JFRURSZzBDSUFBZ0JoQ0ZCUXdDQ3lBQUlBSXBBeEFRRHlBQUlBSXBBeGdRRHlBQUlBRVFEd3RDZ0lDQWdPQUFJUUVMSUFKQklHb2tBQ0FCQzlzQkFnRi9BbjRqQUVFZ2F5SURKQUFnQVVFRFJnUkFJQUlwQXhBaEJDQUNLUU1JSVFVQ1FDQUFJQU5CRUdvZ0Fpa0RBQkNrQlVFQVNBUkFRb0NBZ0lEZ0FDRUVEQUVMSUFBZ0JDQUZRUUlnQTBFUWFoQWhJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FBS0FJUUlnRXBBNEFCSVFRZ0FVS0FnSUNBSURjRGdBRWdBeUFFTndNSUlBQWdBeWtER0VLQWdJQ0FNRUVCSUFOQkNHb1FJU0VFSUFBZ0F5a0RDQkFQQ3lBQUlBTXBBeEFRRHlBQUlBTXBBeGdRRHdzZ0EwRWdhaVFBSUFRUEMwSHdpZ0ZCcnZ3QVFidnFBa0dTL1FBUUFBQUxFd0FnQUNnQ0FDQUJJQUlnQUNnQ0JCRUJBQXNKQUNBQUlBRVFqd1VMZEFJQmZnRi9JQUFnQVJDUEJTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBUThMUVFvaEJRSitBa0FnQWtVTkFDQURLUU1BSWdSQ2dJQ0FnSENEUW9DQWdJQXdVUTBBSUFBZ0JCQ09CU0lGUVFCT0RRQkNnSUNBZ09BQURBRUxJQUFnQVNBRkVKb0ZDeUVFSUFBZ0FSQVBJQVFMelJBQ0NuOENmaU1BUWFBSWF5SUJKQUFDZjBHQUNCQ3hBU0lJSVFSQnhpSkJLeENtQXlFRkFrQUNRRUhVL1FCQjl3QVFwZ05GQkVCQm9OUUVRUncyQWdBTUFRdEJzQWxCc0JFZ0JCc1FzUUVpQWcwQkMwRUFEQUVMSUFKQkFFR2tBUkFyR2lBQ1FYODJBbEFnQWtGL05nSThJQUlnQWtHUUFXbzJBbFFnQWtHQUNEWUNNQ0FDSUFKQnJBRnFOZ0lzSUFSRkJFQWdBa0dzQ1dvaUJFRUFRWUFJRUNzYUN5QUNRZmNBTmdLZ0FTQUNRWUFJTmdLWUFTQUNJQVEyQXB3QkFrQWdCVVVFUUNBQ1FRUTJBZ0FNQVFzZ0JFRUFPZ0FBQ3lBQ1FRRTJBaWdnQWtFQ05nSWtJQUpCQXpZQ0lDQUNRUVEyQWd4QnJkVUVMUUFBUlFSQUlBSkJmellDVEFzZ0FrR2sxQVFvQWdBaUJEWUNPQ0FFQkVBZ0JDQUNOZ0kwQzBHazFBUWdBallDQUNBQ0N5RUNJQUFnQVVHZ0JHb1FtQVVnQVVFZ05nS1FCQ0FCSUFFMEFxZ0VOd09ZQkNBQ1FmMmRBU0FCUVpBRWFoQ1VBU0FBQkVBZ0FFRVFhaUVGQTBBZ0EwRUZSd1JBSUFVZ0EwRURkQ0lKUWJTa0FXb29BZ0FpQkNBQUtBSUFFUU1BSWdZRVFDQUVJQVlnQUNnQ0RCRUVBQ0lLVFFSQUlBRWdDVUd3cEFGcUtBSUFOZ0tJQkNBQklBUTJBb0FFSUFFZ0NpQUVhellDaEFRZ0FrRy9tZ0VnQVVHQUJHb1FsQUZCQVNFSEN5QUZJQVlnQUNnQ0JCRUFBQXNnQTBFQmFpRUREQUVMQ3lBSFJRUkFRZEdhQVVFaElBSVFvd1lMSUFGQnNBWnFRUUJCN0FFUUt4b2dBRUhVQUdvaEF5QUFRZEFBYWlFRUEwQWdCQ0FES0FJQUlnTkhCRUFnQTBFRWF5MEFBRUVQY1VVRVFDQUJRYkFHYWtFNklBTkJBbXN2QVFBaUJTQUZRVHBQRzBFQ2RHb2lCU0FGS0FJQVFRRnFOZ0lBQ3lBRFFRUnFJUU1NQVFzTFFRRWhBMEdNbWdGQkVpQUNFS01HSUFFb0FyQUdJZ1FFUUNBQlFlVGtBRFlDK0FNZ0FVRUFOZ0wwQXlBQklBUTJBdkFESUFKQnJwb0JJQUZCOEFOcUVKUUJDd05BSUFOQk9rY0VRQ0FCUWJBR2FpQURRUUowYWlnQ0FDSUVCRUFnQVNBQUlBRkI4QVZxSUFOQkRHeEJoSjhCYWlnQ0FCQ0dCVFlDNkFNZ0FTQUROZ0xrQXlBQklBUTJBdUFESUFKQnJwb0JJQUZCNEFOcUVKUUJDeUFEUVFGcUlRTU1BUXNMSUFFb0FwZ0lJZ0FFUUNBQlFjckZBRFlDMkFNZ0FVRUFOZ0xVQXlBQklBQTJBdEFESUFKQnJwb0JJQUZCMEFOcUVKUUJDd0pBQWtBZ0FpZ0NUQ0lBUVFCT0JFQWdBRVVOQVVIQTFBUW9BZ0FnQUVILy8vLy9lM0ZIRFFFTEFrQWdBaWdDVUVFS1JnMEFJQUlvQWhRaUFDQUNLQUlRUmcwQUlBSWdBRUVCYWpZQ0ZDQUFRUW82QUFBTUFnc2dBaERUQkF3QkN5QUNJQUlvQWt3aUFFSC8vLy8vQXlBQUd6WUNUQUpBQWtBZ0FpZ0NVRUVLUmcwQUlBSW9BaFFpQUNBQ0tBSVFSZzBBSUFJZ0FFRUJhallDRkNBQVFRbzZBQUFNQVFzZ0FoRFRCQXNnQWlnQ1RCb2dBa0VBTmdKTUN3c2dBVUdXaGdFMkFzZ0RJQUZCdjRFQk5nTEVBeUFCUWErR0FUWUN3QU1nQWtHZm1nRWdBVUhBQTJvUWxBRWdBU2tEdUFRaUMxQkZCRUFnQVNBQktRT2dCQ0lNTndPd0F5QUJJQXMzQTZnRElBRWdETGtnQzdtak9RTzRBeUFCUWZmM0FEWUNvQU1nQWtIVG5BRWdBVUdnQTJvUXBBRWdBVUVJTmdLSUF5QUJJQUVwQTdBRUlnczNBNEFESUFFZ0FTa0RvQVFnQzMyNUlBRXBBOEFFSWd1NW96a0RrQU1nQVVHSStBQTJBdkFDSUFFZ0N6Y0QrQUlnQWtINW5BRWdBVUh3QW1vUXBBRUxJQUVwQThnRUlndFFSUVJBSUFFZ0FTa0QwQVFpRERjRDRBSWdBU0FMTndQWUFpQUJJQXk1SUF1NW96a0Q2QUlnQVVITE56WUMwQUlnQWtHdW5BRWdBVUhRQW1vUXBBRUxJQUVwQTlnRUlndFFSUVJBSUFFZ0FTa0Q0QVFpRERjRHdBSWdBU0FMTndPNEFpQUJJQXk1SUF1NW96a0R5QUlnQVVHdk9EWUNzQUlnQWtHd25RRWdBVUd3QW1vUXBBRUxJQUVwQStnRUlndFFSUVJBSUFFZ0FTa0Q4QVFpRERjRG9BSWdBU0FMTndPWUFpQUJJQXk1SUF1NW96a0RxQUlnQVVHcU5EWUNrQUlnQWtIZW13RWdBVUdRQW1vUXBBRWdBU0FCS1FPQUJUY0RnQUlnQVNBQktRUDRCQ0lMdVNBQktRUG9CTG1qT1FPSUFpQUJRZFE2TmdMd0FTQUJJQXMzQS9nQklBSkIzcHNCSUFGQjhBRnFFS1FCSUFFZ0FTa0RrQVVpQ3pjRDRBRWdBU0FMdVNBQktRT0lCU0lMdWFNNUErZ0JJQUZCdkRrMkF0QUJJQUVnQ3pjRDJBRWdBa0hYblFFZ0FVSFFBV29RcEFFTEFrQWdBU2tEbUFVaUMxQU5BQ0FCSUFFcEE2QUZOd1BBQVNBQlFmUTJOZ0t3QVNBQklBczNBN2dCSUFKQmdKc0JJQUZCc0FGcUVKUUJJQUVnQVNrRHFBVWlDemNEb0FFZ0FTQUx1U0FCS1FPWUJTSUx1YU01QTZnQklBRkJzTzBBTmdLUUFTQUJJQXMzQTVnQklBSkJoWndCSUFGQmtBRnFFS1FCSUFFcEE3QUZJZ3RRRFFBZ0FTQUJLUU80QlNJTU53T0FBU0FCSUFzM0EzZ2dBU0FNdVNBTHVhTTVBNGdCSUFGQmxlVUFOZ0p3SUFKQmhad0JJQUZCOEFCcUVLUUJDeUFCS1FQQUJTSUxVRVVFUUNBQklBczNBMmdnQVVHSE56WUNZQ0FDUWZPYUFTQUJRZUFBYWhDVUFRc0NRQ0FCS1FQSUJTSUxVQTBBSUFFZ0N6Y0RXQ0FCUWVreU5nSlFJQUpCODVvQklBRkIwQUJxRUpRQklBRXBBOUFGSWd0UURRQWdBU0FMTndOSUlBRkI0akkyQWtBZ0FrSHptZ0VnQVVGQWF4Q1VBU0FCSUFFcEE5Z0ZJZ3RDQTRZM0F6QWdBU0FMdVNBQktRUFFCYm1qT1FNNElBRkIvek0yQWlBZ0FTQUxOd01vSUFKQnM1c0JJQUZCSUdvUXBBRUxJQUVwQStBRklndFFSUVJBSUFFZ0FTa0Q2QVUzQXhBZ0FVR2pORFlDQUNBQklBczNBd2dnQWtHQW13RWdBUkNVQVFzZ0FpZ0NUQm9nQWhDbEF4b2dBaUFDS0FJTUVRUUFHaUFDTFFBQVFRRnhSUVJBSUFJb0FqUWlBQVJBSUFBZ0FpZ0NPRFlDT0FzZ0FpZ0NPQ0lEQkVBZ0F5QUFOZ0kwQ3lBQ1FhVFVCQ2dDQUVZRVFFR2sxQVFnQXpZQ0FBc2dBaWdDWUJDYkFTQUNFSnNCQ3lBQlFhQUlhaVFBSUFnTG1BRUJBWDhqQUVFZ2F5SUZKQUFDUUNBQUlBVkJER29nQXlrREFCQzdBU0lDQkg0Q1FBSkFBa0FnQkE0Q0FBRUVDMEovSVFFZ0FpZ0NCQTBCSUFJb0FnZ2lBMEVBVEEwQklBTkJBV3V0SVFFTUFRdENmeUVCSUFJb0FnaEJnSUNBZ0hoR0RRQWdBaEN4QXF3aEFRc2dBQ0FDSUFWQkRHb1FYaUFBSUFFUWh3SUZRb0NBZ0lEZ0FBc2hBU0FGUVNCcUpBQWdBUThMRUFFQUMvb0JBZ04rQVg4akFFRWdheUlDSkFCQ2dJQ0FnT0FBSVFFQ1FDQUFFSmNCSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUVKY0JJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQUpBSUFBZ0FrRU1haUFES1FNQUVMc0JJZ05GRFFBZ0JhZEJCR29nQnFkQkJHb2dBeENSQlNFSUlBQWdBeUFDUVF4cUVGNGdDRUV2Y1FSQUlBQWdDQkNFQWd3QkN5QUFJQVVRelFFaEJTQUVCRUFnQUJBK0lnZENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQWRCQUNBRkVLVUJHaUFBSUFkQkFTQUFJQVlRelFFUXBRRWFJQWNoQVF3Q0N5QUFJQVlRRHlBRklRRU1BUXNnQUNBRkVBOGdBQ0FHRUE4TElBSkJJR29rQUNBQkM2NENBZ04rQW44akFFRXdheUlDSkFCQ2dJQ0FnT0FBSVFFQ1FDQUFFSmNCSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUFKQUlBQVFsd0VpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0FrRWNhaUFES1FNQUVMc0JJZ2hGRFFBZ0FDQUNRUWhxSUFNcEF3Z1F1d0VpQTBVRVFDQUFJQWdnQWtFY2FoQmVEQUVMSUFXblFRUnFJQWFuUVFScUlBZ2dBeUFFUVE5eEVPUURJUWtnQUNBSUlBSkJIR29RWGlBQUlBTWdBa0VJYWhCZUlBa0VRQ0FBSUFrUWhBSU1BUXNnQUNBRkVNMEJJUVVnQkVFUWNRUkFJQUFRUGlJSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FDQUhRUUFnQlJDbEFSb2dBQ0FIUVFFZ0FDQUdFTTBCRUtVQkdpQUhJUUVNQWdzZ0FDQUdFQThnQlNFQkRBRUxJQUFnQlJBUElBQWdCaEFQQ3lBQ1FUQnFKQUFnQVF2REFnSUJmZ0ovSXdCQk1Hc2lBaVFBUW9DQWdJRGdBQ0VCQWtBZ0FDQUNRU2hxSUFNcEF3QVFwZ0VOQUNBQUVKY0JJZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFKQkZHb2dBeWtEQ0JDN0FTSUdSUVJBSUFBZ0JSQVBEQUVMSUFBb0F0Z0JJUU1nQWtJQU53SU1JQUpDZ0lDQWdJQ0FnSUNBZnpjQ0JDQUNJQU0yQWdBZ0FrSUJFREFhSUFJZ0Fpa0RLQ0lCcHlJSFFmLy8vLzhEUVFFUXpBRWFJQUlnQWtKL1FmLy8vLzhEUVFFUWRSb2dCYWRCQkdvaUF5QUdJQUlRa3dVYUFrQWdCRVVnQVZCeURRQWdBa0lCRURBYUlBSWdCMEVCYTBILy8vLy9BMEVCRU13QkdpQURJQUlRMHdGQkFFZ05BQ0FDUWdFUU1Cb2dBaUFIUWYvLy8vOERRUUVRekFFYUlBTWdBeUFDUWYvLy8vOERRUUVRNUFFYUN5QUNFQnNnQUNBR0lBSkJGR29RWGlBQUlBVVF6UUVoQVFzZ0FrRXdhaVFBSUFFTDZoTUNBbjRCZnlNQVFkQUJheUlFSkFBZ0FDQUVFSmdGSUFFZ0FSQTBJZ05CcWkwQ2ZpQUVLUU1JSWdKQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFKQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBQ3ViMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVFDQUJJQU5CMytBQUFuNGdCQ2tERUNJQ1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBQ1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVFQWdBU0FEUWJvcUFuNGdCQ2tER0NJQ1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBQ1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVFQWdBU0FEUWFncUFuNGdCQ2tESUNJQ1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBQ1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVFQWdBU0FEUWZvb0FuNGdCQ2tES0NJQ1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBQ1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVFQWdBU0FEUWZyZkFBSitJQVFwQXpBaUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkFJQUVnQTBIWUtBSitJQVFwQXpnaUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkFJQUVnQTBHMjN3QUNmaUFFS1FOQUlnSkNnSUNBZ0FoOFF2Ly8vLzhQV0FSQUlBSkMvLy8vL3crRERBRUxRb0NBZ0lEQWZpQUN1YjBpQWtLQWdJQ0F3SUdBL1A4QWZTQUNRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c1FRQ0FCSUFOQnpTa0NmaUFFS1FOSUlnSkNnSUNBZ0FoOFF2Ly8vLzhQV0FSQUlBSkMvLy8vL3crRERBRUxRb0NBZ0lEQWZpQUN1YjBpQWtLQWdJQ0F3SUdBL1A4QWZTQUNRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c1FRQ0FCSUFOQmwrQUFBbjRnQkNrRFVDSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFlSW9BbjRnQkNrRFdDSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFjL2ZBQUorSUFRcEEyQWlBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFFZ0EwR0dLZ0orSUFRcEEyZ2lBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFFZ0EwR3Q0QUFDZmlBRUtRTndJZ0pDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQUpDLy8vLy93K0REQUVMUW9DQWdJREFmaUFDdWIwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUUNBQklBTkJ4eW9DZmlBRUtRTjRJZ0pDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQUpDLy8vLy93K0REQUVMUW9DQWdJREFmaUFDdWIwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUUNBQklBTkI4T0FBQW40Z0JDa0RnQUVpQWtLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQWtMLy8vLy9ENE1NQVF0Q2dJQ0FnTUIrSUFLNXZTSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCQUlBRWdBMEhONEFBQ2ZpQUVLUU9JQVNJQ1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBQ1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVFQWdBU0FEUVpJcUFuNGdCQ2tEa0FFaUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkFJQUVnQTBHNDRBQUNmaUFFS1FPWUFTSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFkVXFBbjRnQkNrRG9BRWlBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFFZ0EwSHZKd0orSUFRcEE2Z0JJZ0pDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQUpDLy8vLy93K0REQUVMUW9DQWdJREFmaUFDdWIwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUUNBQklBTkI2aWNDZmlBRUtRT3dBU0lDUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FDUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQXJtOUlnSkNnSUNBZ01DQmdQei9BSDBnQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUVBZ0FTQURRZXN6QW40Z0JDa0R1QUVpQWtLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQWtMLy8vLy9ENE1NQVF0Q2dJQ0FnTUIrSUFLNXZTSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCQUlBRWdBMEg3SndKK0lBUXBBOEFCSWdKQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFKQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBQ3ViMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVFDQUJJQU5Cbzk4QUFuNGdCQ2tEeUFFaUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkFJQU1RVXlFQUlBUkIwQUZxSkFBZ0FBdWZBZ0VEZmlBQlF2Ly8vLzl2V0FSQUlBQVFKRUtBZ0lDQTRBQVBDMEtBZ0lDQTRBQWhCUUorSUFBZ0FVRTJJQUZCQUJBVUlnUkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQkJsQUVRTFF3QkN5QUFJQVFRTndzaUJFS0FnSUNBY0lNaUJrS0FnSUNBNEFCU0JINENmaUFBSUFGQk15QUJRUUFRRkNJQlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQVFTOFFMUXdCQ3lBQUlBRVFOd3NpQVVLQWdJQ0FjSU1pQlVLQWdJQ0E0QUJSQkVBZ0FDQUVFQTlDZ0lDQWdPQUFEd3NDUUNBR1FvQ0FnSUNRZjFFRVFDQUVweWdDQkVILy8vLy9CM0ZGRFFFTElBVkNnSUNBZ0pCL1VRUkFJQUduS0FJRVFmLy8vLzhIY1VVTkFRc2dBRUhNbmdFZ0JFSDRtUUVRdmdFaEJBc2dBQ0FFSUFFUXhBSUZRb0NBZ0lEZ0FBc0xYd0VCZndKQUlBRkZCRUFnQWtVTkFTQUFJQUlRMlFNUEN5QUNSUVJBSUFBZ0FDZ0NBRUVCYXpZQ0FDQUFJQUFvQWdSQkNHczJBZ1FnQVJDYkFRd0JDeUFBS0FJSUlBQW9BZ1FnQW1wUEJIOGdBU0FDRVBNRkJVRUFDdzhMUVFBTEpnQWdBUVJBSUFBZ0FDZ0NBRUVCYXpZQ0FDQUFJQUFvQWdSQkNHczJBZ1FnQVJDYkFRc0xDUUFnQUNBQk5nSVlDeWdCQVg4Q1FDQUJweWdDSUNJRFJRMEFJQU1vQWdCQkJFWU5BQ0FBSUFOQkNHb2dBaER2QXdzTFB3RUJmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBaThCQmtFdlJ3MEFJQUlvQWlBaUFrVU5BQ0FBSUFJUTdBTWdBRUVRYWlBQ0lBQW9BZ1FSQUFBTEMwY0JBWDhDUUNBQnB5Z0NJQ0lEUlEwQUlBTXBBd0FpQVVLQWdJQ0FZRm9FUUNBQUlBR25JQUlSQUFBTElBTXBBd2dpQVVLQWdJQ0FZRlFOQUNBQUlBR25JQUlSQUFBTEN6QUJBWDhnQWFjb0FpQWlBZ1JBSUFBZ0Fpa0RBQkFqSUFBZ0Fpa0RDQkFqSUFCQkVHb2dBaUFBS0FJRUVRQUFDd3NuQVFGL0lBR25LQUlnSWdJRVFDQUFJQUlwQXdBUUl5QUFRUkJxSUFJZ0FDZ0NCQkVBQUFzTFdnRUNmeUFCcHlnQ0lDSUNCRUFDUUNBQ0tRTUFJZ0ZDZ0lDQWdIQlVEUUFnQWFjdEFBVkJBbkVOQUNBQ0tBSU1JZ05GRFFBZ0FDQURFT29ESUFJcEF3QWhBUXNnQUNBQkVDTWdBRUVRYWlBQ0lBQW9BZ1FSQUFBTEMzZ0JBMzhDUUNBQnB5Z0NJQ0lFUlEwQUlBUkJDR29oQXlBRVFRUnFJUVVEUUNBREtBSUFJZ01nQlVZTkFRSkFJQVFvQWdBTkFDQURLUU1RSWdGQ2dJQ0FnR0JVRFFBZ0FDQUJweUFDRVFBQUN5QURLUU1ZSWdGQ2dJQ0FnR0JhQkVBZ0FDQUJweUFDRVFBQUN5QURRUVJxSVFNTUFBc0FDd3VhQVFFR2Z5QUJweWdDSUNJREJFQWdBRUVRYWlFRUlBTkJCR29oQmlBREtBSUlJUUlEUUNBQ0lBWkhCRUFnQWlnQ0JDRUhJQUpCRUdzaEJTQUNRUXhyS0FJQVJRUkFBa0FnQXlnQ0FBUkFJQVVRbndVTUFRc2dBQ0FDS1FNUUVDTUxJQUFnQWlrREdCQWpDeUFFSUFVZ0FDZ0NCQkVBQUNBSElRSU1BUXNMSUFRZ0F5Z0NFQ0FBS0FJRUVRQUFJQVFnQXlBQUtBSUVFUUFBQ3d1VUFnRUZmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBeThCQmtFbFJ3MEFJQU1vQWlBaUJVVU5BRUVBSVFNRFFBSkFJQU5CRTBZRVFFRUFJUVFNQVFzZ0JTQURRUUowYWlnQ0NDSUVCRUFnQUNBRUlBSVJBQUFMSUFOQkFXb2hBd3dCQ3dzRFFDQUZLQUpVSUFSTUJFQkJBQ0VFQTBBZ0JDQUZLQUpjVGcwRElBVW9BbUFoQmtFQUlRTURRQ0FEUVE1SEJFQWdCaUFFUVR4c2FpQURRUUowYWlnQ0JDSUhCRUFnQUNBSElBSVJBQUFMSUFOQkFXb2hBd3dCQ3dzZ0JFRUJhaUVFREFBTEFBVWdCU2dDV0NFR1FRQWhBd05BSUFOQkRrY0VRQ0FHSUFSQlBHeHFJQU5CQW5ScUtBSUVJZ2NFUUNBQUlBY2dBaEVBQUFzZ0EwRUJhaUVEREFFTEN5QUVRUUZxSVFRTUFRc0FDd0FMQzgwQ0FRWi9Ba0FnQVVLQWdJQ0FjRlFOQUNBQnB5SUNMd0VHUVNWSERRQWdBaWdDSUNJRVJRMEFRUUFoQWdOQUlBSkJFMFlFUUVFQUlRTURRQ0FFS0FKWUlRVkJBQ0VDSUFRb0FsUWdBMHdFUUNBQVFSQnFJZ1lnQlNBQUtBSUVFUUFBUVFBaEF3TkFJQVFvQW1BaEJVRUFJUUlnQkNnQ1hDQURUQVJBSUFZZ0JTQUFLQUlFRVFBQUlBWWdCQ0FBS0FJRUVRQUFEQVlGQTBBZ0FrRU9Sd1JBSUFVZ0EwRThiR29nQWtFQ2RHb29BZ1FpQndSQUlBQWdCNjFDZ0lDQWdIQ0VFQ01MSUFKQkFXb2hBZ3dCQ3dzZ0EwRUJhaUVEREFFTEFBc0FCUU5BSUFKQkRrY0VRQ0FGSUFOQlBHeHFJQUpCQW5ScUtBSUVJZ1lFUUNBQUlBYXRRb0NBZ0lCd2hCQWpDeUFDUVFGcUlRSU1BUXNMSUFOQkFXb2hBd3dCQ3dBTEFBc2dCQ0FDUVFKMGFpZ0NDQ0lEQkVBZ0FDQURyVUtBZ0lDQWNJUVFJd3NnQWtFQmFpRUNEQUFMQUFzTE5RRUNmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBeThCQmtFalJ3MEFJQU1vQWlBaEFnc2dBRUVRYWlBQ0lBQW9BZ1FSQUFBTEd3RUJmeUFCcHlnQ0lDSURCRUFnQUNBREtBSU1JQUlSQUFBTEMyQUJBMzhnQWFjb0FpQWlBZ1JBSUFJb0Fnd2lBNjFDZ0lDQWdIQ0VJUUVnQXkwQUJVRUNjVVVFUUNBQ0tBSUFJZ01nQWlnQ0JDSUVOZ0lFSUFRZ0F6WUNBQ0FDUWdBM0FnQUxJQUFnQVJBaklBQkJFR29nQWlBQUtBSUVFUUFBQ3d0a0FRSi9JQUduS0FJZ0lnSUVRQUpBQWtBZ0FpMEFCVVVOQUNBQUtBSzhBU0lEUlEwQUlBQW9Bc1FCSUFJb0FnZ2dBeEVBQUF3QkN5QUNLQUlZSWdORkRRQWdBQ0FDS0FJVUlBSW9BZ2dnQXhFR0FBc2dBRUVRYWlBQ0lBQW9BZ1FSQUFBTEN5a0JBWDhnQUNBQnB5SUNOUUlrUW9DQWdJQ1FmNFFRSXlBQUlBSTFBaUJDZ0lDQWdKQi9oQkFqQ3lFQUlBR25LQUlnS1FNQUlnRkNnSUNBZ0dCYUJFQWdBQ0FCcHlBQ0VRQUFDd3NpQVFGL0lBQWdBYWNvQWlBaUFpa0RBQkFqSUFCQkVHb2dBaUFBS0FJRUVRQUFDd29BSUFCQkF4QjJFRk1MWlFFQ2Z3SkFJQUZDZ0lDQWdIQlVEUUFnQWFjaUF5OEJCa0VQUncwQUlBTW9BaUFpQkVVTkFFRUFJUU1EUUNBRElBUXRBQVZQRFFFZ0JDQURRUU4wYWlrRENDSUJRb0NBZ0lCZ1dnUkFJQUFnQWFjZ0FoRUFBQXNnQTBFQmFpRUREQUFMQUFzTFl3RUNmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBaThCQmtFUFJ3MEFJQUlvQWlBaUEwVU5BRUVBSVFJRFFDQUNJQU10QUFWUFJRUkFJQUFnQXlBQ1FRTjBhaWtEQ0JBaklBSkJBV29oQWd3QkN3c2dBRUVRYWlBRElBQW9BZ1FSQUFBTEMzZ0JBbjhnQWFjb0FpQWlCQ2tEQUNJQlFvQ0FnSUJnV2dSQUlBQWdBYWNnQWhFQUFBc2dCQ2tEQ0NJQlFvQ0FnSUJnV2dSQUlBQWdBYWNnQWhFQUFBc0RRQ0FFS0FJUUlBTktCRUFnQkNBRFFRTjBhaWtER0NJQlFvQ0FnSUJnV2dSQUlBQWdBYWNnQWhFQUFBc2dBMEVCYWlFRERBRUxDd3RTQVFKL0lBQWdBYWNvQWlBaUFpa0RBQkFqSUFBZ0Fpa0RDQkFqQTBBZ0F5QUNLQUlRVGtVRVFDQUFJQUlnQTBFRGRHb3BBeGdRSXlBRFFRRnFJUU1NQVFzTElBQkJFR29nQWlBQUtBSUVFUUFBQzRBQkFRUi9JQUduSWdNb0FpQWhCQ0FES0FJa0lRVWdBeWdDS0NJREJFQWdBQ0FESUFJUkFBQUxJQVFFUUFKQUlBVkZEUUJCQUNFREEwQWdBeUFFS0FJOFRnMEJBa0FnQlNBRFFRSjBhaWdDQUNJR1JRMEFJQVl0QUFWQkFYRkZEUUFnQUNBR0lBSVJBQUFMSUFOQkFXb2hBd3dBQ3dBTElBQWdCQ0FDRVFBQUN3dDhBUU4vSUFHbklnSW9BaWdpQXdSQUlBQWdBNjFDZ0lDQWdIQ0VFQ01MSUFJb0FpQWlBd1JBSUFJb0FpUWlCQVJBUVFBaEFnTkFJQUlnQXlnQ1BFNUZCRUFnQUNBRUlBSkJBblJxS0FJQUVPc0JJQUpCQVdvaEFnd0JDd3NnQUVFUWFpQUVJQUFvQWdRUkFBQUxJQUFnQTYxQ2dJQ0FnR0NFRUNNTEN4SUFJQUduS0FJZ0lnQUVRQ0FBRUtRREN3c2VBQ0FCcHlrRElDSUJRb0NBZ0lCZ1dnUkFJQUFnQWFjZ0FoRUFBQXNMR1FBZ0FDQUJweUlBS1FNZ0VDTWdBRUtBZ0lDQU1EY0RJQXRFQVFKL0lBR25JUVFEUUNBRUtBSW9JQU5MQkVBZ0JDZ0NKQ0FEUVFOMGFpa0RBQ0lCUW9DQWdJQmdXZ1JBSUFBZ0FhY2dBaEVBQUFzZ0EwRUJhaUVEREFFTEN3dEdBUU4vSUFHbklRTURRQ0FES0FJa0lRUWdBaUFES0FJb1QwVUVRQ0FBSUFRZ0FrRURkR29wQXdBUUl5QUNRUUZxSVFJTUFRc0xJQUJCRUdvZ0JDQUFLQUlFRVFBQUMya0JBbjhqQUVFUWF5SUhKQUFDZndKQUlBR25JZ2d0QUFWQkNIRkZEUUFnQUNBSFFReHFJQUlRckFGRkRRQWdCeWdDRENBSUtBSW9UdzBBUVg4Z0FDQUlFSklERFFFYUN5QUFJQUVnQWlBRElBUWdCU0FHUVlDQUNISVFiUXNoQUNBSFFSQnFKQUFnQUF1QkFnSURmd0YrQWtBQ1FDQUNRUUJPRFFBZ0FhY3BBeUFpQ2tLQWdJQ0FjSU5DZ0lDQWdKQi9VZzBBSUFKQi8vLy8vd2R4SWdnZ0NxY2lCeWtDQkNJS3AwSC8vLy8vQjNGUERRQUNRRUVFSUFZUWt3TkZEUUJCQVNFQ0lBWkJnTUFBY1VVTkFpQURRb0NBZ0lCd2cwS0FnSUNBa0g5U0RRQWdBNmNpQ1NrQ0JDSUJRdi8vLy84SGcwSUJVZzBBSUFkQkVHb2hCd0ovSUFwQ2dJQ0FnQWlEVUVVRVFDQUhJQWhCQVhScUx3RUFEQUVMSUFjZ0NHb3RBQUFMQW44Z0FVS0FnSUNBQ0lOUVJRUkFJQWt2QVJBTUFRc2dDUzBBRUF0R0RRSUxJQUFnQmtIaDZRQVFidzhMSUFBZ0FTQUNJQU1nQkNBRklBWkJnSUFJY2hCdElRSUxJQUlMUmdBQ2Z3SkFJQUpCQUU0TkFDQUJweWtESUNJQlFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFCQkFDQUNRZi8vLy84SGNTQUJweWdDQkVILy8vLy9CM0ZKRFFFYUMwRUJDd3V6QVFFQ2Z3SkFJQU5CQUU0TkFDQUNweWtESUNJQ1FvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFBZ0EwSC8vLy8vQjNFaUF5QUNweUlFS1FJRUlnS25RZi8vLy84SGNVOE5BRUVCSVFVZ0FVVU5BQ0FFUVJCcUlRUUNmeUFDUW9DQWdJQUlnMUJGQkVBZ0JDQURRUUYwYWk4QkFBd0JDeUFESUFScUxRQUFDeUVESUFGQkJEWUNBQ0FBSUFOQi8vOERjUkNmQXlFQ0lBRkNnSUNBZ0RBM0F4Z2dBVUtBZ0lDQU1EY0RFQ0FCSUFJM0F3Z0xJQVVMV3dFQ2Z5QUJweWdDRUNJQVFUQnFJUU1nQUNBQUtBSVlJQUp4UVg5elFRSjBhaWdDQUNFQUEwQUNRQ0FBUlEwQUlBTWdBRUVCYTBFRGRHb2lCQ2dDQkNBQ1JnMEFJQVFvQWdCQi8vLy9IM0VoQUF3QkN3c2dBRUVBUndzMUFRRitJQUVwQXdBaUFrSWdpS2RCZFU4RVFDQUNweUlCSUFFb0FnQkJBV28yQWdBTElBQWdBaENLQVVLQWdJQ0E0QUFRVXd1T0FRRUNmeUFCS0FJQUlnSkJBRW9FUUNBQklBSkJBV3NpQWpZQ0FBSkFJQUlOQUNBQkxRQUVRZkFCY1VFUVJ3MEFJQUVvQWdnaUFpQUJLQUlNSWdNMkFnUWdBeUFDTmdJQUlBRkJBRFlDQ0NBQUtBSmdJZ0lnQVVFSWFpSUROZ0lFSUFFZ0FFSGdBR28yQWd3Z0FTQUNOZ0lJSUFBZ0F6WUNZQXNQQzBIRmpRRkJydndBUWJBc1FjLzBBQkFBQUF0dkFRSi9JQUVnQVNnQ0FDSUNRUUZxTmdJQUlBSkZCRUFnQVNnQ0NDSUNJQUVvQWd3aUF6WUNCQ0FESUFJMkFnQWdBVUVBTmdJSUlBQW9BbEFpQWlBQlFRaHFJZ00yQWdRZ0FTQUFRZEFBYWpZQ0RDQUJJQUkyQWdnZ0FDQUROZ0pRSUFFZ0FTMEFCRUVQY1RvQUJBc0xEd0FnQVNBQktBSUFRUUZxTmdJQUM0Z0JBZ0YrQVg5QkFDRUNRb0NBZ0lBd0lRRURRQUpBSUFKQkFrY0VmaUFGSUFKQkEzUWlCR29pQnpVQ0JFSWdoa0tBZ0lDQU1GRU5BU0FBUWF3dVFRQVFGVUtBZ0lDQTRBQUZRb0NBZ0lBd0N3OExJQU1nQkdvcEF3QWlCa0lnaUtkQmRVOEVRQ0FHcHlJRUlBUW9BZ0JCQVdvMkFnQUxJQWNnQmpjREFDQUNRUUZxSVFJTUFBc0FDMXdCQW40Z0FpQUFLQUlBRUMwaEEwRUFJUUFnQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVU0FDSUFFb0FnQVFMU0lFUW9DQWdJQndnMEtBZ0lDQTRBQlJja1VFUUNBRHB5QUVweENEQWlFQUN5QUNJQU1RRHlBQ0lBUVFEeUFBQzJzQkFYNENRQUpBQWtBQ1FBSkFJQU10QUFVaUFRNEVBd0lDQUFFTElBQWdBeWdDQ0JES0JBOExJQUZCQ0VZTkFnc1FBUUFMSUFBZ0F5Z0NEQ0FES0FJQUlBTXRBQWdnQXkwQUNTQURMZ0VHRUlJQkR3c2dBQ0FBRURRaUJDQURLQUlJSUFNb0Fnd1FJaUFFQ3drQUlBQWdBeENOQXd0VEFRRitJQUFRTkNJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0FTQUJLQUlBUVFGcU5nSUFJQUFnQkVFOElBR3RRb0NBZ0lCd2hFRURFQmxCQUU0RVFDQUVEd3NnQUNBRUVBOExRb0NBZ0lEZ0FBc0RBQUVMYWdFQmZ5TUFRUkJySWdNa0FDQUJLQUlFSVFFZ0FpQURRUXhxSUFBb0FnUVFyQUZCQUNBQ0lBTkJDR29nQVJDc0FSdEZCRUJCME1VQVFhNzhBRUdET2tIOHlRQVFBQUFMSUFNb0FnZ2hBQ0FES0FJTUlRRWdBMEVRYWlRQVFYOGdBQ0FCUnlBQUlBRkxHd3ZhQXdJQ2ZnRi9Jd0JCSUdzaUJTUUFBa0FDUUNBQUlBRkJMQkJMSWdKRkRRQkNnSUNBZ0RBaEFRSkFJQUlwQXdBaUJrS0FnSUNBY0lOQ2dJQ0FnREJTQkVBQ2Z3SkFJQWFuSWdNdkFRWkJGV3RCLy84RGNVRUtUUVJBSUFNb0FpQW9BZ3dvQWlBdEFBUkZEUUVnQUJCckRBVUxJQUFnQlVFY2FpQUdFTllCRFFRZ0JVRWNhZ3dCQ3lBRFFTaHFDeUVJSUFJb0Fnd2lBeUFJS0FJQVNRMEJJQUFnQWlrREFCQVBJQUpDZ0lDQWdEQTNBd0FMSUFSQkFUWUNBQXdDQ3lBQ0lBTkJBV28yQWd3Z0JFRUFOZ0lBSUFJb0FnaEZCRUFnQTBFQVRnUkFJQU90SVFFTUF3dENnSUNBZ01CK0lBTzR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYklRRU1BZ3RDZ0lDQWdPQUFJUUVnQUNBQ0tRTUFJQU1Rc0FFaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBSW9BZ2hCQVVZRVFDQUdJUUVNQWdzZ0JTQUdOd01JSUFVZ0EwRUFUZ1IrSUFPdEJVS0FnSUNBd0g0Z0E3aTlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElnYzNBd0FnQUVFQ0lBVVFpUU1oQVNBQUlBWVFEeUFBSUFjUUR3d0JDeUFFUVFBMkFnQkNnSUNBZ09BQUlRRUxJQVZCSUdva0FDQUJDeEFBSXdBZ0FHdEJjSEVpQUNRQUlBQUxCZ0FnQUNRQUN3UUFJd0FMN2dJQ0JIOENmaU1BUVJCcklnTWtBQUpBQWtBZ0Fpa0RFQ0lIUW9DQWdJQndnMEtBZ0lDQWtIOVNCRUFnQUVHRGxBRkJBQkFWREFFTElBSXBBeGdoQ0NBQUlBY1Fzd0VpQkVVRVFFRUFJUVFNQVFzZ0FDQUlFTE1CSWdaRkRRQUNRQ0FBSUFRZ0JoREpCU0lCUlEwQUlBQWdBUkQrQTBFQVNBUkFJQUJCQVJDUEJBd0JDeUFCSUFFb0FnQkJBV28yQWdBZ0FDQUJyVUtBZ0lDQVVJUWdBQ2tEd0FGQkFFRUFFTWdGSWdkQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBY1FEeUFCSVFVTElBQWdCaEJVSUFWRkRRQWdBeUFBSUFVUWpRTWlCemNEQUNBSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUFJQUlwQXdCQ2dJQ0FnREJCQVNBREVDRVFEeUFBSUFNcEF3QVFEd3dCQ3lBQUtBSVFJZ0VwQTRBQklRY2dBVUtBZ0lDQUlEY0RnQUVnQXlBSE53TUlJQUFnQUNBQ0tRTUlRb0NBZ0lBd1FRRWdBMEVJYWhBaEVBOGdBQ0FES1FNSUVBOExJQUFnQkJCVUlBTkJFR29rQUVLQWdJQ0FNQXNTQUNBQVFRQTJBckFCSUFCQ0FEY0RxQUVMSHdBZ0FFRUFOZ0t3QVNBQVFUZzJBcXdCSUFCQk9VRUFJQUViTmdLb0FRc2ZBQ0FBSUFBb0FoQWdBQ0FCSUFJUUJpSUFFUEVGSVFFZ0FCQ2JBU0FCQzA4Q0FYOEJmaUFBS0FJUUlBQWdBUkFISWdKRkJFQkJBQThMSUFBZ0FpQUNFRDhnQVVFaEVQUUZJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FBSUFRUUR5QUVweUVEQ3lBQ0VKc0JJQU1MQ2dBZ0FFSUFOd09RQVFzU0FDQUFRUUEyQXBRQklBQkJOellDa0FFTEJnQWdBQkFOQ3dvQUlBQWdBVUVEZEdvTEV3QWdBRUUySUFKQkFFRUJJQUVRZ2dFUVV3dExBUUYvSXdCQkVHc2lCU1FBSUFVZ0FUY0RDQUpBSUFBZ0JVRUlhaUFDSUFNZ0JCQU9JZ0JGQkVCQ2dJQ0FnREFoQVF3QkN5QUFLUU1BSVFFZ0FCQ2JBUXNnQlVFUWFpUUFJQUVMUHdJQmZ3RitJd0JCRUdzaUFpUUFJQUFnQWhETkFpRURJQUVnQWlrREFCQlROZ0lBSUFFZ0Fpa0RDQkJUTmdJRUlBTVFVeUVBSUFKQkVHb2tBQ0FBQ3lvQkFYNGdBQ2tEd0FFaUFVSWdpS2RCZFU4RVFDQUJweUlBSUFBb0FnQkJBV28yQWdBTElBRVFVd3ZYQVFJQ2ZnRi9BbjlCL01jQUlBRXBBd0FpQWtJZ2lLY2lBVVVnQVVFTGFrRVJTM0lOQUJvQ1FBSkFJQUpDZ0lDQWdIQ0RJZ05DZ0lDQWdOQitVZ1JBUWFnc0lBTkNnSUNBZ09CK1VRMERHaUFEUW9DQWdJRHdmbElFUUVHNnpBQWdBQ0FDRURnTkJCb2dBMEtBZ0lDQWdBRjhRaUNJcHlJQVFRMUpEUUlNQXd0QjFURU1Bd3RCZ05jQURBSUxRWU04SUFCMlFRRnhSUTBBSUFCQkFuUkIwSjRCYWlnQ0FBd0JDMEhWeWdCQnhURWdBa0tBZ0lDQWNGUWJDeUlBRUQ5QkFXb2lBUkN4QVNJRUJIOGdCQ0FBSUFFUUh3VkJBQXNMZVFFQmZ5TUFRUkJySWdVa0FDQURCRUFnQlNBQk5nSU1RUUVoQXdKQUFrQUNRQ0FGUVF4cVFRQVFrd1JCTTJvT0F3SUJBQUVMSUFWQkRHcEJBQkNUQkNJRFFTNUhJQU5CS0VkeElRTU1BUXRCQUNFREN5QURJQVJ5SVFRTElBQWdBU0FCRUQ4Z0FpQUVFUFFGRUZNaEFDQUZRUkJxSkFBZ0FBdlVBUUlDZmdGL0FrQWdBQ0FCS1FNQVFvQ0FnSUF3UW9DQWdJQXdFSlFFSWdKQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBSVFzd0VoQkNBQUlBSVFEeUFFUlEwQUlBQWdCQ0FFRUQ5QjdJZ0JFUFVGSVFJZ0FDQUVFRlFnQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0FpQUJLUU1BUWVIb0FCRDRBeUFBSUFJZ0FTa0RBRUc2NndBUStBTWdBQ0FDSUFFcEF3QkJ5TmNBRVBnRElBQWdBa0tBZ0lDQU1FS0FnSUNBTUJDVUJDRURJQUFnQWhBUElBQWdBeEN6QVNFQklBQWdBeEFQSUFFUEN5QUFJQUVROXdVTE9RSUJmd0YrSUFFMUFnUkNJSVpDZ0lDQWdPQUFVUVIvSUFBb0FoQWlBQ2tEZ0FFaEF5QUFRb0NBZ0lBZ053T0FBU0FERUZNRlFRQUxDM0lCQkg4akFDSUdJUWNnQTBFQUlBTkJBRW9iSVFnZ0JpQURRUU4wUVE5cVFYQnhheUlHSkFBRFFDQUZJQWhHUlFSQUlBWWdCVUVEZEdvZ0JDQUZRUUowYWlnQ0FDa0RBRGNEQUNBRlFRRnFJUVVNQVFzTElBQWdBU2tEQUNBQ0tRTUFJQU1nQmhBaEVGTWhBQ0FISkFBZ0FBdU5BUUVDZmlBQUlBSXBBd0FRTVNFQ0lBQWdBU2tEQUNBQ0lBTXBBd0FnQkNrREFDSUpJQVVwQXdBaUNrR0JBa0VCSUFnYlFRQWdCaHRCaEFoQkJDQUlHMEVBSUFjYmNpSUJJQUZCZ0JCeUlBbENnSUNBZ0hDRFFvQ0FnSUF3VVJzaUFTQUJRWUFnY2lBS1FvQ0FnSUJ3ZzBLQWdJQ0FNRkViSWdGQmdNQUFjaUFCSUFnYkVHMGFJQUFnQWhBVEMwUUJBWDRnQUNBQ0tRTUFFREVoQWlBREtRTUFJZ1JDSUlpblFYVlBCRUFnQktjaUF5QURLQUlBUVFGcU5nSUFDeUFBSUFFcEF3QWdBaUFFRUxFRklBQWdBaEFUQ3l3QkFYNGdBQ0FDS1FNQUVERWhBaUFBSUFFcEF3QWlBeUFDSUFOQkFCQVVJUU1nQUNBQ0VCTWdBeEJUQy9RQkFnVi9BWDRnQUVHZ0FXb2hCd0pBQTBBQ1FDQUJJQVpHRFFBZ0FDZ0NwQUVpQXlBSFJnMEFJQU1vQWdBaUJTQURLQUlFSWdRMkFnUWdCQ0FGTmdJQUlBTkNBRGNDQUVFQUlRUWdBeWdDQ0NJRklBTW9BaEFnQTBFWWFpQURLQUlNRVJrQUlRZ0RRQ0FFSUFNb0FoQk9SUVJBSUFVZ0F5QUVRUU4wYWlrREdCQVBJQVJCQVdvaEJBd0JDd3NnQlNBSUVBOGdCU2dDRUNJRVFSQnFJQU1nQkNnQ0JCRUFBQ0FDSUFVMkFnQWdDRUtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQVVvQWhBaUFDa0RnQUVoQ0NBQVFvQ0FnSUFnTndPQUFRd0RCU0FHUVFGcUlRWU1BZ3NBQ3dzZ0JxMGhDQXNnQ0JCVEN3OEFJQUFvQXFRQklBQkJvQUZxUndzaEFRRitJQUFnQUNBQkVQWUZJZ0lRRHlBQ1FvQ0FnSUJ3ZzBLQWdJQ0FNRklMUHdFQmZpQUFJQUVROWdVaUFrS0FnSUNBY0lOQ2dJQ0FnREJSQkVBZ0FDQUJLUU1BUWEzTEFCQ3lBU0VDQ3lBQUlBSVFzd0VoQVNBQUlBSVFEeUFCQzdVQkFnSi9BMzRqQUVFUWF5SURKQUFnQUNrRHdBRWlCVUlnaUtkQmRVOEVRQ0FGcHlJRUlBUW9BZ0JCQVdvMkFnQUxJQUFnQlVHRDB3QVFzZ0VoQmlBQUlBVVFEeUFESUFBZ0FSQmlOd01JQWtBZ0FnUkFJQUFnQUNBR1FkbkFBQkN5QVNJRklBWkJBU0FEUVFocUVDRWhCeUFBSUFNcEF3Z1FEd3dCQ3lBQUlBWkNnSUNBZ0RCQkFTQURRUWhxRUNFaEJ5QURLUU1JSVFVTElBQWdCUkFQSUFBZ0JoQVBJQWNRVXlFQUlBTkJFR29rQUNBQUN3b0FJQUFnQVJCaUVGTUxQZ0lCZndGOEl3QkJFR3NpQWlRQUlBSkNnSUNBZ0lDQWdQei9BRGNEQ0NBQUlBSkJDR29nQVNrREFCQkNHaUFDS3dNSUlRTWdBa0VRYWlRQUlBTUxhUUVCZmdKK0lBRzlJZ0lDZnlBQm1VUUFBQUFBQUFEZ1FXTUVRQ0FCcWd3QkMwR0FnSUNBZUFzaUFMZTlVUVJBSUFDdERBRUxRb0NBZ0lEQWZpQUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCVEN3Z0FJQUFRUGhCVEN3MEFJQUFnQVNrREFCQkhFRk1MQ0FBZ0FCQTBFRk1MS1FFQmZpQUJLUU1BSWdKQ0lJaW5RWFZQQkVBZ0FxY2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBQ0VGTUxDQUFnQUNBQkVGUUxGZ0FnQUNnQ0VDSUFRUkJxSUFFZ0FDZ0NCQkVBQUFzK0FnRi9BWDRDUUNBQktRTUFJZ05DSUlpblFYVkpEUUFnQTZjaUFpQUNLQUlBSWdKQkFXczJBZ0FnQWtFQlNnMEFJQUFnQXhDV0JBc2dBUkNiQVFzUUFDQUFJQUVwQXdBUUR5QUJFSnNCQ3djQUlBQVFwQU1MMlFNQ0FuOEJmaU1BUVNCcklnSWtBQUpBQWtBZ0FVS0FnSUNBY0lOQ2dJQ0FnREJTQkVBZ0FFR2lQa0VBRUJVTUFRc2dBeWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ01nQXlnQ0FFRUJhallDQUFzRFFBSkFBa0FDUUFKQUFrQUNRRUVISUFGQ0lJaW5JZ01nQTBFSGEwRnVTUnRCQzJvT0V3SUlBUVVEQlFVRkJRVUVBQUFGQlFVRkJRRUZDeUFBSUFIRUVJY0NJUUVNQndzQ1FBSitJQUFnQWtFTWFpQUJFTHNDSWdNb0FnaEIvdi8vL3dkT0JFQWdBQ0FCRUE4Z0FFSERLMEVBRUZCQ2dJQ0FnT0FBREFFTElBQVFsd0VpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCSUFhblFRUnFJZ1FnQXhCRUlRVWdCRUVCRU5FQklRUWdBQ0FCRUE4Z0JDQUZjaUlFUVNCeEJFQWdBQ0FHRUE4Z0FCQjhRb0NBZ0lEZ0FBd0JDeUFFUVJCeEJFQWdBQ0FHRUE4Z0FFSDF4UUJCQUJCUVFvQ0FnSURnQUF3QkN5QUFJQVlRelFFTElRRWdBeUFDUVF4cVJ3MEhJQUpCREdvUUd3d0hDeUFBSUFFUUR3d0ZDeUFBSUFFUU55SUJRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRTU1CUXNnQUNBQkVLb0ZJUUVNQkFzZ0FDQUJRUUVRbWdFaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkRBTUxDeUFBSUFFUUR5QUFRZXdyUVFBUUZRdENnSUNBZ09BQUlRRUxJQUpCSUdva0FDQUJDNTRPQWcxL0FuNGpBRUhRQUdzaUJTUUFRb0NBZ0lEZ0FDRVRBa0FnQUJDWEFTSVNRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdCU0FCTmdJNElCS25RUVJxSVFvQ1FBSkFBa0FDUUFKQUlBSkJFRXdFUUNBQlFlRFJBQ0FGUVRocUVKa0ZEUUVnQlNnQ09DRUJDd0pBQWtBQ1FDQUJMUUFBSWdSQksyc09Bd0VDQUFJTFFRRWhFQXNnQlNBQlFRRnFJZ3cyQWpnZ0FTMEFBU0VFSUF3aEFRc0NRQUpBQWtBQ1FDQUVRZjhCY1VFd1JnUkFBa0FDUUNBQkxRQUJJZ1JCK0FCSEJFQWdCRUh2QUVZTkJTQUVRZGdBUncwQkN5QUNRVzl4UlFSQUlBVWdBVUVDYWpZQ09FRVFJUUlnQVMwQUFoQ1dBVUVRU1EwSERBZ0xJQVJCN3dCR0RRWWdBa1VoQmd3QkN5QUNSU0VHSUFJTkFDQUVRYzhBUmcwRUN5QUVRZUlBUmcwQklBWWdCRUhDQUVaeERRTU1BZ3NnQWtFUVNnMERJQUZCck4wQUlBVkJPR29RbVFWRkRRRU1Cd3NnQmlBQ1JYSkZEUUlNQVFzZ0FnMEJDMEVLSVFJTEFuOGdBaUFDUVFGcklnUnhCRUFnQ2lnQ0FDRUVJQVZDQURjQ0xDQUZRb0NBZ0lDQWdJQ0FnSDgzQWlRZ0JTQUVOZ0lnSUFWQklHb01BUXRCSUNBRVoydEJBQ0FDUVFKUEd5RUpJQW9MSVEwZ0JTZ0NPQ0VFQTBBZ0JDMEFBRUV3UjBVRVFDQUZJQVJCQVdvaUJEWUNPQXdCQ3d0QklDRU1JQWxGQkVBZ0FrSGVxQVJxTFFBQUlRd0xJQTFCQVJCQkdpQUZRUUEyQWpRZ0RDRUVRUUFoQmdKQUFrQUNRQUpBQTBBQ1FBSkFJQVVvQWpnaUNDMEFBQ0lSUVM1SERRQWdBU0FJVHdSQVFTNGhFU0FJTEFBQkVKWUJJQUpPRFFFTElBNE5BMEVCSVE0Z0JTQUlRUUZxSWdjMkFqZ2dDQzBBQVNFUklBc2hEd3dCQ3lBSUlRY0xJQUlnRWNBUWxnRWlDRXNFUUNBRklBZEJBV28yQWpnZ0MwRUJhaUVMSUFrRVFDQUVJQWxySWdSQkFFd0VRQ0FOSUFWQk5Hb2dDRUVBSUFScmRpQUdjaERtQXcwR0lBUkJIM1VnQ0NBRVFTQnFJZ1IwY1NFR0RBTUxJQWdnQkhRZ0JuSWhCZ3dDQ3lBSUlBSWdCbXhxSVFZZ0JFRUJheUlFRFFFZ0RTQUZRVFJxSUFZUTVnTWhCeUFNSVFSQkFDRUdJQWRGRFFFTUF3c0xJQThnQ3lBT0d5RVBDeUFFSUF4R0RRSWdDU0FFUlhKRkJFQURRQ0FDSUFac0lRWWdCRUVCYXlJRURRQUxDeUFOSUFWQk5Hb2dCaERtQTBVTkFpQUpEUUVMSUEwUUd3c2dDaEExREFNTElBMG9BaEJCQUNBRktBSTBJZzVCQW5SQkJHb1FLeG9nQlNnQ09DSUlJQUZIRFFFZ0NRMEFJQTBRR3dzZ0NoQTFEQU1MSUFndEFBQWhCQUpBQWtBQ2Z3Si9Ba0FnQWtFS1JnUkFJQVFpQjBFZ2NrSGxBRVlOQVVFQUlRdEJBQXdDQzBIQUFDRUhJQVJCd0FCR0RRQWdDVVVFUUVFQUlRWU1CQXNnQkNJSFFTQnlRZkFBUmcwQVFRQWhCaUFKREFJTFFRQWhDMEVBSUFFZ0NFOE5BQm9nQlNBSVFRRnFJZ1kyQWpnZ0IwSGZBWEVoQVVFQklRY0NRQUpBQWtBZ0NDMEFBVUVyYXc0REFBSUJBZ3NnQlNBSVFRSnFJZ1kyQWpnTUFRc2dCU0FJUVFKcUlnWTJBamhCQUNFSEN5QUJRZEFBUmlFTFFRQWhCQU5BSUFZc0FBQVFsZ0VpQVVFSlRRUkFJQVJCekptejVnQk9CRUFnQncwSUlBb2dFQkNKQVF3SkJTQUZJQVpCQVdvaUJqWUNPQ0FCSUFSQkNteHFJUVFNQWdzQUN3c2dCRUVBSUFScklBY2JDeUVHSUFsRkRRRkJBU0FKSUFzYkN5RUVJQTBnRURZQ0JDQU5JQVFnQm13Z0NTQVBiR28yQWdnZ0RVSC8vLy8vQTBFQkVMTUNJUVFNQVFzQ1FDQU5LQUlNSWdjZ0RrRUJhaUlMUmdSQUlBb2dFQkNKQVVFQUlRUU1BUXNnQ2lnQ0FDRUJJQVZDQURjQ0dDQUZRb0NBZ0lDQWdJQ0FnSDgzQWhBZ0JTQUJOZ0lNSUEwb0FoQWhEaUFDRUpjRklSRkJBQ0VFQWtBQ1FDQUJLQUlBUVFCQkFrRWlJQWNnQzJzaUIwRUJhMmRySUFkQkFra2JJZ2hCRkd3Z0FTZ0NCQkVCQUNJSkJFQWdEaUFMUVFKMGFpRU9JQThnQnlBTWJHc2dCbW9oREFOQUlBUWdDRVpGQkVBZ0JTZ0NEQ0VQSUFrZ0JFRVViR29pQzBJQU53SU1JQXRDZ0lDQWdJQ0FnSUNBZnpjQ0JDQUxJQTgyQWdBZ0JFRUJhaUVFREFFTEMwRUFJUVFnQlVFTWFpQU9JQWRCQUNBSElCRWdDUkRsQXlFSEEwQWdCQ0FJUmtVRVFDQUpJQVJCRkd4cUVCc2dCRUVCYWlFRURBRUxDeUFCS0FJQUlBbEJBQ0FCS0FJRUVRRUFHaUFIUlEwQkN5QUtFRFZCSUNFRURBRUxJQVVnRURZQ0VDQUZLQUlZUlFSQUlBb2dCVUVNYWhCRUlRUU1BUXNnREVVRVFDQUtJQVZCREdvUVJDQUtRZi8vLy84RFFRRVF6Z0Z5SVFRTUFRc2dDaWdDQUNFQklBVkNBRGNDU0NBRlFvQ0FnSUNBZ0lDQWdIODNBa0FnQlNBQk5nSThJQVZCUEdvZ0FpQU1JQXhCSDNVaUFYTWdBV3RCLy8vLy93TkJBQkQ4QWlFQkFuOGdERUVBU0FSQUlBb2dCVUVNYWlBRlFUeHFJQVVvQWhoQkJYUkJBQkNWQVF3QkN5QUtJQVZCREdvZ0JVRThha0gvLy8vL0EwRUFFRU1MSUFGeUlRUWdCVUU4YWhBYkN5QUZRUXhxRUJzTElBMFFHd3NnQkVFZ2NVVU5BZ3NnQUNBU0VBOGdBQkI4REFJTElBb2dFQkNNQVFzZ0FDQVNJQU5CQ1haQkFYRVFsZ1VoRXdzZ0JVSFFBR29rQUNBVEM4VUNBZ1IvQVg0akFFRWdheUlISkFBQ2Z3SkFBa0FDUUNBQ1FZMEJSdzBBSUFBb0FoQW9Bb3dCSWdRRVFDQUVMUUFvUVFSeERRRUxJQUJCMjVBQlFRQVFGUXdCQ3lBQUVKY0JJZ2hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5BUXNnQUNBREVBOUJmd3dCQ3lBSXB5SUZRUVJxSVFZZ0FDQUhRUXhxSUFNUXV3RWhCQUpBQWtBQ1FBSkFBa0FDUUNBQ1FZd0JhdzRLQVFBRUJBTURBd01EQWdNTElBWWdCQkJFSVFJTUJBc2dCaUFFRUVRaEFpQUZJQVVvQWdoQkFYTTJBZ2dNQXdzZ0JpQUVRZ0ZCLy8vLy93TkJBUkIxSVFJZ0JTQUZLQUlJUVFGek5nSUlEQUlMRUFFQUN5QUdJQVFnQWtFQmRFR2RBbXVzUWYvLy8vOERRUUVRZFNFQ0N5QUFJQVFnQjBFTWFoQmVJQUFnQXhBUElBSUVRQ0FBSUFnUUR5QUFJQUlRaEFKQmZ3d0JDeUFCSUFBZ0NCRE5BVGNEQUVFQUN5RUFJQWRCSUdva0FDQUFDN1lKQWdaL0JINGpBRUZBYWlJR0pBQkNnSUNBZ09BQUlRd0Nmd0pBQWtBZ0FCQ1hBU0lMUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFDUUNBQUlBWkJMR29nQXhDN0FTSUhSUTBBSUFBZ0JrRVlhaUFFRUxzQklnaEZCRUFnQUNBSElBWkJMR29RWGd3QkN5QUxwMEVFYWlFSkFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQVVHYUFXc09HUUVDQkEwQUJRZ0lEQXdNREF3TURBd01EQXdKQ3dvTURBTU1DeUFKSUFjZ0NFSC8vLy8vQTBFQkVPUUJJUVVNRFFzZ0NTQUhJQWhCLy8vLy93TkJBUkJESVFVTURBc2dBQ2dDRUNnQ2pBRWlCUVJBSUFVdEFDaEJCSEVOQkFzZ0FDZ0MyQUVoQVNBR1FnQTNBZ3dnQmtLQWdJQ0FnSUNBZ0lCL053SUVJQVlnQVRZQ0FDQUpJQVlnQnlBSVFRRVE1QU1oQlNBR0VCc01Dd3NnQ1NBSElBaEJCaENWQlVFQmNTRUZEQW9MSUFrZ0J5QUlRUUVRbFFWQkFYRWhCUXdKQ3lBSUtBSUVSUTBCUVFFaEJTQUFLQUlRS0FLTUFTSUpSUTBJSUFrdEFDaEJCSEZGRFFnTElBQWdDeEFQQWtBQ2Z3SkFBa0FnQUNBQUtBSW9LUU9JQWlJTFFkMEJJQXRCQUJBVUlndENnSUNBZ0hDRElneENnSUNBZ0RCU0JFQWdERUtBZ0lDQTRBQlJEUUlnQUNBTFFTVVFTeUlGUlEwQ0lBVWdBUkQzQTBFQ2RHb29BZ2dpQlEwQklBQWdDeEFQQzBLQWdJQ0E0QUFoRENBQUVMWUZJZ3RDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5BeUFBSUFjZ0JrRXNhaEJlSUFBZ0NDQUdRUmhxRUY0TURnc2dBQ0FERUxrQ0lneENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQVFRdVFJaURrS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBQWdEQkFQREFFTElBVWdCU2dDQUVFQmFqWUNBQ0FHSUE0M0F3Z2dCaUFNTndNQUlBQWdCYTFDZ0lDQWdIQ0VRb0NBZ0lBd1FRSWdCaEF2SVEwZ0FDQU1FQThnQUNBT0VBOUJBQ0FOUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVhQzBLQWdJQ0FNQ0VOUVFFTElRRWdBQ0FMRUE4Z0FDQUhJQVpCTEdvUVhpQUFJQWdnQmtFWWFoQmVJQUFnQXhBUElBQWdCQkFQUVg4Z0FRME5HaUFDSUEwM0F3QU1DUXNnQzZkQkJHb2hCU0FBS0FMZ0FTRUpJQUFvQXR3QklRb0NmeUFCUVpzQlJnUkFJQVVnQnlBSUlBb2dDUkNWQVF3QkN5QUZJQWNnQ0NBS0lBbEJnSUFFY2hDVUJRc2hBU0FBSUFjZ0JrRXNhaEJlSUFBZ0NDQUdRUmhxRUY0Z0FDQURFQThnQUNBRUVBOGdBVUVnY1NJQkJFQWdBQ0FMRUE4Z0FDQUJFSVFDREF3TElBSWdDemNEQUF3SUN5QUpJQWNnQ0VILy8vLy9BMEdCZ0FRUWxBVWhCUXdHQ3lBR0lBaEJBQkNwQVNBR0tBSUFJUVVnQ1NBSEVFUWdDVUVBUVlHQWdJQjRJQVVnQlVHQmdJQ0FlRXdiSWdWcklBVWdBVUdoQVVZYklnRkIvLy8vL3dOQkFSRE1BWEloQlNBQlFRQk9EUVVnQ1VFQ0VORUJRU1J4SUFWeUlRVU1CUXNnQ1NBSElBZ1Frd1VoQlF3RUN5QUpJQWNnQ0VFQUVPTURJUVVNQXdzZ0NTQUhJQWhCQVJEakF5RUZEQUlMRUFFQUN5QUpJQWNnQ0VILy8vLy9BMEVCRU1zQklRVUxJQUFnQnlBR1FTeHFFRjRnQUNBSUlBWkJHR29RWGlBQUlBTVFEeUFBSUFRUUR5QUZCRUFnQUNBTEVBOGdBQ0FGRUlRQ0RBUUxJQUlnQUNBTEVNMEJOd01BQzBFQURBTUxJQXNoREFzZ0FDQU1FQThnQUNBREVBOGdBQ0FFRUE4TFFYOExJUUFnQmtGQWF5UUFJQUFMNFFFQkJIOGpBRUV3YXlJRUpBQkJmeUVIQWtBZ0FDQUVRUnhxSUFJUXV3SWlCVVVOQUFKQUlBQWdCRUVJYWlBREVMc0NJZ1pGQkVBZ0JTQUVRUnhxUncwQklBUkJIR29RR3d3QkN3Si9Ba0FDUUFKQUFrQUNRQUpBSUFGQm93RnJEZ2NGQUFFQ0JBUURCQXNnQlNBR0VKSUZEQVVMSUFZZ0JSQ3lBZ3dFQ3lBR0lBVVFrZ1VNQXdzZ0JTQUdFSUlDREFJTEVBRUFDeUFGSUFZUXNnSUxJUWNnQkVFY2FpQUZSZ1JBSUFSQkhHb1FHd3NnQkVFSWFpQUdSZ1JBSUFSQkNHb1FHd3NnQUNBQ0VBOE1BUXNnQWlFREN5QUFJQU1RRHlBRVFUQnFKQUFnQndzTEFDQUFJQUZCQ2hDYUJRdXVBZ0lEZndGK0l3QkJJR3NpQlNRQUFrQWdBYWNpQnlnQ0lDSUdSUTBBSUFZb0FnZ2lDQ2dDQkEwQUlBaEJBVFlDQkNBSEx3RUdRVEpySVFjQ1FBSkFJQU5CQUV3RVFFS0FnSUNBTUNFQkRBRUxJQWNnQkNrREFDSUJRb0NBZ0lCd1ZISU5BQUpBQWtBZ0FDQUJJQVlwQXdBUVVnUkFJQUJCODhvQVFRQVFGUXdCQ3lBQUlBRkIvd0FnQVVFQUVCUWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVnMEJDeUFBS0FJUUlnTXBBNEFCSVFFZ0EwS0FnSUNBSURjRGdBRWdBQ0FHS1FNQUlBRkJBUkNLQlNBQUlBRVFEd3dEQ3lBQUlBSVFPQTBCSUFBZ0FoQVBDeUFBSUFZcEF3QWdBU0FIRUlvRkRBRUxJQVlwQXdBaENTQUZJQUkzQXhBZ0JTQUJOd01JSUFVZ0NUY0RBQ0FBUVRWQkF5QUZFSm9ESUFBZ0FoQVBDeUFGUVNCcUpBQkNnSUNBZ0RBTDN3RUNBMzhDZmlBQVFlZ0FFRjhpQlVVRVFFS0FnSUNBNEFBUEN5QUZRUUUyQWdBZ0FDZ0NFQ0VHSUFWQkJEb0FCQ0FHS0FKUUlnY2dCVUVJYWlJSU5nSUVJQVVnQmtIUUFHbzJBZ3dnQlNBSE5nSUlJQVlnQ0RZQ1VDQUZRb0NBZ0lBd053TVlJQVZDZ0lDQWdEQTNBeEFnQlVFQU5nSWdRb0NBZ0lEZ0FDRUpBa0FDUUNBQUlBVkJFR29RelFJaUNrS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBQWdCVUVvYWlBQklBSWdBeUFFRU8wRFJRMEJDeUFBSUFvUUR3d0JDeUFGUVFFMkFpQWdBQ0FGRUlrRklBb2hDUXNnQUNnQ0VDQUZFSWdGSUFrTG1BRUJBWDhnQWFjaUJTOEJCa0UxYXlFR0lBVW9BaUFoQlNBRFFRQk1CSDVDZ0lDQWdEQUZJQVFwQXdBTElRRWdCU0FHTmdJMElBRkNJSWluSVFNQ1FDQUdCRUFnQTBGMVR3UkFJQUduSWdNZ0F5Z0NBRUVCYWpZQ0FBc2dBQ0FCRUlvQkRBRUxJQU5CZFU4RVFDQUJweUlESUFNb0FnQkJBV28yQWdBTElBVW9BbVJCQ0dzZ0FUY0RBQXNnQUNBRkVJa0ZRb0NBZ0lBd0M3b0JBUUYvSUFCQjBBQVFYeUlGQkVBZ0JVRUFOZ0lFSUFVZ0JVSElBR29pQmpZQ1RDQUZJQVkyQWtnQ1FDQUFJQVZCQ0dvaUJpQUJJQUlnQXlBRUVPMERCRUFnQlVFRk5nSUVEQUVMSUFBZ0JoQzBBaUlDUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBQ0VBOGdBQ0FCUVRrUVpTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdCU0FCcHlJQU5nSUFJQUZDZ0lDQWdIQmFCRUFnQUNBRk5nSWdDeUFCRHdzZ0FDZ0NFQ0FGRUljRkMwS0FnSUNBNEFBTHNnTUNCWDhEZmlNQVFSQnJJZ1FrQUFKQUFrQWdBeWtEQUNJTFFvQ0FnSUJ3V2dSQUlBdW5JZ2N2QVFaQkUydEIvLzhEY1VFQ1NRMEJDeUFBUVJNUWhnTkNnSUNBZ09BQUlRb01BUXRDZ0lDQWdPQUFJUW9nQnlnQ0lDSUZSUTBBSUFSQ0FEY0RDQ0FDUVFKT0JFQWdBQ0FFUVFocUlBTXBBd2dRcGdFTkFRc2dCUzBBQkFSQUlBQVFhd3dCQ3lBRUtRTUlJZ2tnQlNnQ0FDSUdyRllFUUNBQVFZY3VRUUFRVUF3QkN5QUdJQW1uSWdocklRWUNRQ0FDUVFOSURRQWdBeWtERUNJSlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQUNBQUlBUWdDUkNtQVEwQklBUXBBd0FpQ1NBR3JWWUVRQ0FBUWFIWkFFRUFFRkFNQWdzZ0NhY2hCZ3NnQUNBQlFTQVFaU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFDUUFKQUlBVXRBQVFFUUNBQUVHc01BUXNnQUVFWUVDa2lBZzBCQ3lBQUlBRVFEd3dCQ3lBQ0lBR25JZ0EyQWdnZ0MwSWdpS2RCZFU4RVFDQUhJQWNvQWdCQkFXbzJBZ0FMSUFJZ0JqWUNGQ0FDSUFnMkFoQWdBaUFITmdJTUlBVW9BZ3dpQXlBQ05nSUVJQUlnQlVFTWFqWUNCQ0FDSUFNMkFnQWdCU0FDTmdJTUlBQWdBallDSUNBQklRb0xJQVJCRUdva0FDQUtDeE1BSUFCQnlQb0FRUUFRRlVLQWdJQ0E0QUFMUWdFQmZpTUFRUkJySWdJa0FFS0FnSUNBNEFBaEJDQUFJQUpCQ0dvZ0F5a0RBQkNtQVVVRVFDQUFJQUVnQWlrRENFRVVFTndESVFRTElBSkJFR29rQUNBRUMwQUJBWDRqQUVFUWF5SUNKQUJDZ0lDQWdPQUFJUVFnQUNBQ1FRaHFJQU1wQXdBUXBnRkZCRUFnQUNBQklBSXBBd2dRK1FJaEJBc2dBa0VRYWlRQUlBUUxoQVlDQTM4SGZpTUFRU0JySWdVa0FFS0FnSUNBNEFBaERRSkFJQUFnQVNBRVFTWnFFR1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBUW9DQWdJQXdJUW9DUUFKQUFrQUNRQ0FBUVJ3UVh5SUdSUTBBSUFZZ0JFRUJka0VCY1RZQ0FDQUdJQVpCQkdvaUJ6WUNDQ0FHSUFjMkFnUWdBVUtBZ0lDQWNGb0VRQ0FCcHlBR05nSWdDeUFHUVFFMkFoUWdCaUFBUVFnUUtTSUhOZ0lRUW9DQWdJQXdJUXRDZ0lDQWdEQWhDQ0FIUlEwQ0lBY2dCellDQkNBSElBYzJBZ0FnQmtFRU5nSVlJQUpCQUV3TkF5QURLUU1BSWdoQ2dJQ0FnQkNFUW9DQWdJQndnMEtBZ0lDQU1GRU5BeUFBSUFGQjZBQkJ3Z0FnQkVFQmNTSUNHeUFCUVFBUUZDSUtRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FLRURnTkFTQUFRWkRNQUVFQUVCVUxRb0NBZ0lBd0lRdENnSUNBZ0RBaENBd0JDeUFBSUFoQkFCRG5BU0lJUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFNQVFzQ1FDQUFJQWhCNmdBZ0NFRUFFQlFpQzBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBQWtBRFFDQUZJQUFnQ0NBTElBVkJGR29RcmdFaUNUY0RHQ0FKUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlnQlNnQ0ZFVUVRQUpBSUFJRVFDQUFJQW9nQVVFQklBVkJHR29RSVNJT1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFZ0FDQUZLUU1ZRUE4TUJRc0NRQUpBSUFsQy8vLy8vMjlZQkVBZ0FCQWtRb0NBZ0lBd0lRa01BUXNnQUNBSlFnQVFUU0lKUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVMUW9DQWdJQXdJUXdNQkFzZ0FDQUZLUU1ZUWdFUVRTSU1Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdCU0FNTndNSUlBVWdDVGNEQUNBQUlBb2dBVUVDSUFVUUlTSU9Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdBQ0FKRUE4Z0FDQU1FQThMSUFBZ0RoQVBJQUFnQlNrREdCQVBEQUVMQ3lBQUlBa1FEeUFBSUFzUUR5QUFJQWdRRHlBQUlBb1FEd3dEQ3lBQUlBVXBBeGdRRHlBQUlBa1FEeUFBSUF3UUR3c2dDRUtBZ0lDQWNGUU5BQ0FBSUFoQkFSQ3RBUm9MSUFBZ0N4QVBJQUFnQ0JBUElBQWdDaEFQSUFBZ0FSQVBEQUVMSUFFaERRc2dCVUVnYWlRQUlBMEwxd01DQVg4RGZpTUFRU0JySWdZa0FBSkFBa0FDUUNBRlFRRnhCRUJDZ0lDQWdPQUFJUWNnQUNBR1FSaHFJQUZCM2dBUWdRRWlCVVVOQXdKQUlBVXBBd0FpQVVLQWdJQ0FjRm9FUUNBQnB5MEFCVUVRY1EwQkN5QUFRYUkrUVFBUUZRd0VDeUFHS1FNWUlnaENnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQWdBU0FDSUFNZ0JCQ1FBeUVIREFRTElBQWdBeUFFRUlrRElnbENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFpQUZLUU1BSVFFZ0JpQUNOd01RSUFZZ0NUY0RDQ0FHSUFFM0F3QWdBQ0FJSUFVcEF3aEJBeUFHRUNFaUFVTC8vLy8vYjFZTkFTQUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBQ0FCRUE4Z0FCQWtEQUlMUW9DQWdJRGdBQ0VISUFBZ0JrRVlhaUFCUWRvQUVJRUJJZ1ZGRFFJZ0Jpa0RHQ0VCSUFVdEFCQkZCRUFnQUNBQkVBOGdBRUdiekFCQkFCQVZEQU1MSUFGQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFBZ0JTa0RBQ0FDSUFNZ0JCQWhJUWNNQXdzZ0FDQURJQVFRaVFNaUNFS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBVXBBd0FoQnlBR0lBZzNBeEFnQmlBQ053TUlJQVlnQnpjREFDQUFJQUVnQlNrRENFRURJQVlRSVNFSEN5QUFJQUVRRHlBQUlBZ1FEd3dDQ3lBQklRY0xJQUFnQ0JBUElBQWdDUkFQQ3lBR1FTQnFKQUFnQnd1Q0JRRURmaUFES1FNSUlRWUNRQ0FBSUFNcEF3QWlCQkRRQXlJQ1FRQk9CRUFDUUNBQlFvQ0FnSUJ3ZzBLQWdJQ0FNRklOQUNBQUtBSVFLQUtNQVNrRENDRUJJQUpGSUFaQ2dJQ0FnSENEUW9DQWdJQXdVbklOQUNBQUlBUkJQQ0FFUVFBUUZDSUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdCUThMSUFBZ0JTQUJFRkloQXlBQUlBVVFEeUFEUlEwQUlBUkNJSWluUVhWSkRRSWdCS2NpQUNBQUtBSUFRUUZxTmdJQURBSUxBa0FDUUFKQUFrQUNRQ0FFUW9DQWdJQndWQTBBSUFTbklnTXZBUVpCRWtjTkFDQURLQUlnSWdJZ0FpZ0NBRUVCYWpZQ0FDQUNyVUtBZ0lDQWtIK0VJUVVnQmtLQWdJQ0FjSU5DZ0lDQWdEQlNEUUVnQXlnQ0pDSUNJQUlvQWdCQkFXbzJBZ0FnQXExQ2dJQ0FnSkIvaENFRURBTUxBa0FDUUFKQUlBSUVRQ0FBSUFSQjdBQWdCRUVBRUJRaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQVFvQ0FnSUF3SVFZTUNBc2dCa0tBZ0lDQWNJTkNnSUNBZ0RCUkJFQWdBQ0FFUWUwQUlBUkJBQkFVSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRklOQkF3SUN5QUZJUVFnQmtJZ2lLZEJkRXNOQVF3REN5QUVRaUNJcDBGMVR3UkFJQVNuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dCa0lnaUtkQmRVa05BUXNnQnFjaUFpQUNLQUlBUVFGcU5nSUFDeUFFSVFVTElBVkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQkJMeEF0SVFVTUFnc2dBQ0FGRUNnaEJDQUFJQVVRRHlBRUlnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF3d0JDeUFBSUFZUUtDSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSUxJQUFnQlNBR0VKZ0VJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFZUUR3c2dBQ0FCSUFVZ0JCRGVCUThMSUFBZ0JSQVBJQUFnQmhBUEMwS0FnSUNBNEFBUEN5QUVDNklPQWdkL0FYNGpBRUhnQUdzaUJ5UUFJQWRCQ0dwQkFFSFFBQkFyR2lBSElBUTJBaFFnQnlBQU5nSUlJQWNnQWlBRGFpSUROZ0pFSUFjZ0FqWUNRQ0FIUVFFMkFoQWdCMEtnZ0lDQUVEY0RHQUpBSUFJdEFBQkJJMGNOQUNBQ0xRQUJRU0ZIRFFBZ0J5QUNRUUpxSWdJMkFsd0RRQUpBQWtBQ1FDQUNJQU5QRFFBQ1FDQUNMUUFBSWdoQkNtc09CQUVBQUFFQUN5QUl3RUVBVGcwQ0lBSkJCaUFIUWR3QWFoQllJZ2hCZm5GQnFNQUFSdzBCSUFjb0Fsd2hBZ3NnQnlBQ05nSkFEQU1MSUFjb0Fsd2hBaUFJUVg5SERRRUxJQWNnQWtFQmFpSUNOZ0pjREFBTEFBc0NRQUpBQWtBQ1FBSkFBa0FDZndKQUFrQUNRQUpBQW44Z0JVRURjU0lLUVFKR0JFQWdBQ2dDRUNnQ2pBRWlDMFVOQkNBTEtRTUlJZzVDLy8vLy8yOVlEUU1nRHFjaUFpOEJCaER1QVVVTkFpQUNLQUlrSVF4QkFDRUlJQUlvQWlBaUF5MEFFQXdCQ3lBRlFRTjJJUUlnQ2tFQlJ3UkFRUUFoQTBFQUlRZ2dBa0VEY1F3QkMwS0FnSUNBNEFBaERpQUFJQVFRcWdFaUEwVU5DeUFBUWZBQUVGOGlDRVVFUUNBQUlBTVFFd3dNQ3lBSVFvQ0FnSUF3TndOb0lBaENnSUNBZ0RBM0EyQWdDRUtBZ0lDQU1EY0RTQ0FJUW9DQWdJQXdOd05BSUFnZ0F6WUNCQ0FJUVFFMkFnQWdBQ2dDOUFFaUF5QUlRUWhxSWdrMkFnUWdDQ0FBUWZRQmFqWUNEQ0FJSUFNMkFnZ2dBQ0FKTmdMMEFVRUFJUU1nQWtFQ2NVRUJjZ3NoQ1NBQVFRQkJBVUVBSUFSQkFSRG9BeUlDUlEwSElBY2dBallDU0NBQ0lBcEJBa2NpQkRZQ1RDQUNJQW8yQWlRZ0FpQUZRUVoyUVFGeE5nSm9Ba0FnQkVVRVFDQUNJQU12QUJGQkJuWkJBWEUyQWxBZ0FpQURMd0FSUVFkMlFRRnhOZ0pVSUFJZ0F5MEFFa0VCY1RZQ1dDQURMd0FSSVFRZ0FrSFFBRFlDY0NBQ0lBazZBRzRnQWlBRVFRbDJRUUZ4TmdKY0RBRUxJQUpCMEFBMkFuQWdBaUFKT2dCdUlBSkNnSUNBZ0JBM0FsZ2dBa0lBTndKUUlBSWdBMFVOQlJvTElBTW9BandoQkNBREx3RXFJUWtnQXk4QktDRUtJQUpCQURZQ3dBSWdBa0VBTmdMSUFpQUNJQVFnQ1NBS2Ftb2lDVFlDeEFJZ0FpQUpSUTBFR2lBQ0lBQWdDVUVEZEJBcElnUTJBc2dDSUFSRkRRVURRQ0FHUVFCT0JFQWdBeWdDSUNBR0lBTXZBU2hxUVFSMGFpSUVLQUlFUVFCS0JFQWdBaUFDS0FMQUFpSUpRUUZxTmdMQUFpQUFJQUlvQXNnQ0lBbEJBM1JxSUFRZ0JoRG5Bd3NnQkNnQ0NDRUdEQUVMQzBFQUlRUWdCa0YrUmdSQUEwQWdCQ0FETHdFcVR3MEZBa0FnQXlnQ0lDQUVJQU12QVNocVFRUjBhaUlHS0FJRURRQWdCaENlQlVVTkFDQUNJQUlvQXNBQ0lnbEJBV28yQXNBQ0lBQWdBaWdDeUFJZ0NVRURkR29nQmlBRUVPY0RDeUFFUVFGcUlRUU1BQXNBQ3dOQUlBTXZBU2dnQkUwRVFFRUFJUVFEUUNBRUlBTXZBU3BQRFFZQ1FDQURLQUlnSUFRZ0F5OEJLR3BCQkhScUlnWW9BZ1FOQUNBR0tBSUFRZEVBUmcwQUlBSWdBaWdDd0FJaUNVRUJhallDd0FJZ0FDQUNLQUxJQWlBSlFRTjBhaUFHSUFRUTV3TUxJQVJCQVdvaEJBd0FDd0FGSUFJZ0FpZ0N3QUlpQmtFQmFqWUN3QUlnQXlnQ0lDRUpJQUlvQXNnQ0lBWkJBM1JxSWdZZ0JEc0JBaUFHUVFNNkFBQWdCaUFBSUFrZ0JFRUVkR29vQWdBUUdEWUNCQ0FFUVFGcUlRUU1BUXNBQ3dBTFFiR1NBVUd1L0FCQndJWUNRZTdXQUJBQUFBdEI2b0VCUWE3OEFFRytoZ0pCN3RZQUVBQUFDMEdYaEFGQnJ2d0FRYjJHQWtIdTFnQVFBQUFMUVFBaEJnTkFJQVlnQXlnQ1BFNUZCRUFnQXlnQ0pDRUpJQUlnQWlnQ3dBSWlCRUVCYWpZQ3dBSWdBaWdDeUFJZ0JFRURkR29pQkNBRUxRQUFJZ3BCL2dGeE9nQUFJQVFnQ1NBR1FRTjBhaUlKTFFBQVFRSnhJQXBCL0FGeGNpSUtPZ0FBSUFRZ0NrSDZBWEVnQ1MwQUFFRUVjWElpQ2pvQUFDQUVJQXBCOWdGeElBa3RBQUJCQ0hGeUlnbzZBQUFnQ1MwQUFDRU5JQVFnQmpzQkFpQUVJQXBCRG5FZ0RVSHdBWEZ5T2dBQUlBUWdBQ0FKS0FJRUVCZzJBZ1FnQmtFQmFpRUdEQUVMQ3lBSEtBSklDeUVFSUFJZ0NEWUNsQU1nQnlBSVJUWUNVQ0FISUFoQkFFYzJBa3dnQjBFSWFpSURFSUFCR2lBQ0lBSW9BcndCTmdMd0FTQURFQklOQUNBSFFRaHFFSjBGRFFCQkFTRURJQVFnQkNnQ0pFRUNUd1IvSUFRdEFHNUJBWEVGUVFBTFJUWUNLQ0FIS0FKTVJRUkFJQVFnQnlnQ0NDQUVRZEVBRUU4aUF6WUNwQUVnQTBFQVNBMEJDd05BSUFjb0FoaEJySDlHRFFJZ0IwRUlhaENjQlVVTkFBc0xJQWRCQ0dvZ0IwRVlhaEQvQVNBQUlBSVEvUUlNQVF0QktTRURJQWRCQ0dvZ0J5Z0NUQVIvUVNrRklBZEJDR3BCMkFBUUVDQUhLQUpJUVlBQ2FpQUVMd0drQVJBcVFTZ0xFQkFnQUNBQ0VKc0ZJZzVDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FJQkVBZ0NDQU9Od05JSUFBZ0NCRCtBMEVBU0EwQ0lBZ2dDQ2dDQUVFQmFqWUNBQ0FJclVLQWdJQ0FVSVFoRGdzZ0JVRWdjUTBESUFBZ0RpQUJJQXdnQ3hESUJTRU9EQU1MSUFoRkRRRUxJQUFnQ0JEbkJRdENnSUNBZ09BQUlRNExJQWRCNEFCcUpBQWdEZ3ZiQlFNRmZ3TitBWHdqQUVGQWFpSUZKQUFDUUFKOEFrQUNRQUpBQWtBQ1FDQUNRUUFnQVVLQWdJQ0FjSU1pQzBLQWdJQ0FNRkliSWdJT0FnSUFBUXNDUUNBREtRTUFJZ2xDZ0lDQWdIQlVEUUFnQ2FjaUJDOEJCa0VLUncwQUlBUXBBeUFpQ2tJZ2lLY2lCRUVBSUFSQkMycEJFa2tiRFFBZ0FDQUZJQW9RUWcwRERBUUxJQVVnQUNBSlFRSVFrQUlpQ1RjRE9DQUpRb0NBZ0lCd2cwS0FnSUNBa0g5UkJFQWdBQ0FCSUFRZ0JVRTRhaERSQkNFS0lBQWdDUkFQSUFwQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQUlBVWdDaEJ1UlEwRURBTUxJQUFnQlNBSkVHNUZEUU1NQWdzZ0JVRUFRVGdRS3lJR1FvQ0FnSUNBZ0lENFB6Y0RFRUVISUFJZ0FrRUhUaHNpQjBFQUlBZEJBRW9iSVFJRFFBSkFJQUlnQkVjRVFDQUFJQVpCT0dvZ0F5QUVRUU4wSWdocUtRTUFFRUlOQkNBR0t3TTRJZ3k5UW9DQWdJQ0FnSUQ0L3dDRFFvQ0FnSUNBZ0lENC93QlNEUUVnQkNFQ0MwUUFBQUFBQUFENGZ5QUNJQWRIRFFVYUlBWkJBUkRnQWd3RkN5QUdJQWhxSUF5ZE9RTUFBa0FnQkEwQUlBWXJBd0FpREVRQUFBQUFBQUFBQUdaRklBeEVBQUFBQUFBQVdVQmpSWElOQUNBR0lBeEVBQUFBQUFDd25VQ2dPUU1BQ3lBRVFRRnFJUVFNQUFzQUN4RFFCTGtNQWd0Q2dJQ0FnT0FBSVFFTUFnc2dCU3NEQUNJTW5VUUFBQUFBQUFBQUFLQkVBQUFBQUFBQStIOGdERVFBQU56Q0NMSStRMlViUkFBQUFBQUFBUGgvSUF4RUFBRGN3Z2l5UHNObUd3c2hEQUpBSUFBZ0FVRUtFR1VpQ1VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0NRSitJQXk5SWdFQ2Z5QU1tVVFBQUFBQUFBRGdRV01FUUNBTXFnd0JDMEdBZ0lDQWVBc2lCTGU5VVFSQUlBU3REQUVMUW9DQWdJREFmaUFCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4RGJBU0FMUW9DQWdJQXdVZzBBSUFBZ0NTQUVJQVJCRXhEUEJDRUJJQUFnQ1JBUERBRUxJQWtoQVFzZ0JVRkFheVFBSUFFTHFBRUJCWDhnQUNnQ1ZDSURLQUlBSVFVZ0F5Z0NCQ0lFSUFBb0FoUWdBQ2dDSENJSGF5SUdJQVFnQmtrYklnWUVRQ0FGSUFjZ0JoQWZHaUFESUFNb0FnQWdCbW9pQlRZQ0FDQURJQU1vQWdRZ0Jtc2lCRFlDQkFzZ0JDQUNJQUlnQkVzYklnUUVRQ0FGSUFFZ0JCQWZHaUFESUFNb0FnQWdCR29pQlRZQ0FDQURJQU1vQWdRZ0JHczJBZ1FMSUFWQkFEb0FBQ0FBSUFBb0Fpd2lBVFlDSENBQUlBRTJBaFFnQWdzcEFDQUJJQUVvQWdCQkIycEJlSEVpQVVFUWFqWUNBQ0FBSUFFcEF3QWdBU2tEQ0JDL0JUa0RBQXVUR0FNU2Z3RjhBMzRqQUVHd0JHc2lEQ1FBSUF4QkFEWUNMQUpBSUFHOUlobENBRk1FUUVFQklSRkJ0aUVoRXlBQm1pSUJ2U0VaREFFTElBUkJnQkJ4QkVCQkFTRVJRYmtoSVJNTUFRdEJ2Q0ZCdHlFZ0JFRUJjU0lSR3lFVElCRkZJUlVMQWtBZ0dVS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVVFSQUlBQkJJQ0FDSUJGQkEyb2lBeUFFUWYvL2UzRVFZeUFBSUJNZ0VSQmJJQUJCNE5FQVFaU0RBU0FGUVNCeElnVWJRYXpkQUVHQmhnRWdCUnNnQVNBQllodEJBeEJiSUFCQklDQUNJQU1nQkVHQXdBQnpFR01nQXlBQ0lBSWdBMGdiSVFrTUFRc2dERUVRYWlFU0FrQUNmd0pBSUFFZ0RFRXNhaENGQmlJQklBR2dJZ0ZFQUFBQUFBQUFBQUJpQkVBZ0RDQU1LQUlzSWdaQkFXczJBaXdnQlVFZ2NpSU9RZUVBUncwQkRBTUxJQVZCSUhJaURrSGhBRVlOQWlBTUtBSXNJUXBCQmlBRElBTkJBRWdiREFFTElBd2dCa0VkYXlJS05nSXNJQUZFQUFBQUFBQUFzRUdpSVFGQkJpQURJQU5CQUVnYkN5RUxJQXhCTUdwQm9BSkJBQ0FLUVFCT0cyb2lEU0VIQTBBZ0J3Si9JQUZFQUFBQUFBQUE4RUZqSUFGRUFBQUFBQUFBQUFCbWNRUkFJQUdyREFFTFFRQUxJZ00yQWdBZ0IwRUVhaUVISUFFZ0E3aWhSQUFBQUFCbHpjMUJvaUlCUkFBQUFBQUFBQUFBWWcwQUN3SkFJQXBCQUV3RVFDQUtJUU1nQnlFR0lBMGhDQXdCQ3lBTklRZ2dDaUVEQTBCQkhTQURJQU5CSFU0YklRTUNRQ0FIUVFScklnWWdDRWtOQUNBRHJTRWFRZ0FoR1FOQUlBWWdHVUwvLy8vL0Q0TWdCalVDQUNBYWhud2lHMEtBbE92Y0E0QWlHVUtBN0pTakRINGdHM3crQWdBZ0JrRUVheUlHSUFoUERRQUxJQm1uSWdaRkRRQWdDRUVFYXlJSUlBWTJBZ0FMQTBBZ0NDQUhJZ1pKQkVBZ0JrRUVheUlIS0FJQVJRMEJDd3NnRENBTUtBSXNJQU5ySWdNMkFpd2dCaUVISUFOQkFFb05BQXNMSUFOQkFFZ0VRQ0FMUVJscVFRbHVRUUZxSVE4Z0RrSG1BRVloRUFOQVFRbEJBQ0FEYXlJRElBTkJDVTRiSVFrQ1FDQUdJQWhOQkVBZ0NDZ0NBQ0VIREFFTFFZQ1U2OXdESUFsMklSUkJmeUFKZEVGL2N5RVdRUUFoQXlBSUlRY0RRQ0FISUFNZ0J5Z0NBQ0lYSUFsMmFqWUNBQ0FXSUJkeElCUnNJUU1nQjBFRWFpSUhJQVpKRFFBTElBZ29BZ0FoQnlBRFJRMEFJQVlnQXpZQ0FDQUdRUVJxSVFZTElBd2dEQ2dDTENBSmFpSUROZ0lzSUEwZ0NDQUhSVUVDZEdvaUNDQVFHeUlISUE5QkFuUnFJQVlnQmlBSGEwRUNkU0FQU2hzaEJpQURRUUJJRFFBTEMwRUFJUU1DUUNBR0lBaE5EUUFnRFNBSWEwRUNkVUVKYkNFRFFRb2hCeUFJS0FJQUlnbEJDa2tOQUFOQUlBTkJBV29oQXlBSklBZEJDbXdpQjA4TkFBc0xJQXNnQTBFQUlBNUI1Z0JIRzJzZ0RrSG5BRVlnQzBFQVIzRnJJZ2NnQmlBTmEwRUNkVUVKYkVFSmEwZ0VRRUVFUWFRQ0lBcEJBRWdiSUF4cUlBZEJnTWdBYWlJSlFRbHRJZzlCQW5ScVFkQWZheUVLUVFvaEJ5QVBRWGRzSUFscUlnbEJCMHdFUUFOQUlBZEJDbXdoQnlBSlFRRnFJZ2xCQ0VjTkFBc0xBa0FnQ2lnQ0FDSVFJQkFnQjI0aUR5QUhiQ0lKUmlBS1FRUnFJaFFnQmtaeERRQWdFQ0FKYXlFUUFrQWdEMEVCY1VVRVFFUUFBQUFBQUFCQVF5RUJJQWRCZ0pUcjNBTkhJQWdnQ2s5eURRRWdDa0VFYXkwQUFFRUJjVVVOQVF0RUFRQUFBQUFBUUVNaEFRdEVBQUFBQUFBQTREOUVBQUFBQUFBQThEOUVBQUFBQUFBQStEOGdCaUFVUmh0RUFBQUFBQUFBK0Q4Z0VDQUhRUUYySWhSR0d5QVFJQlJKR3lFWUFrQWdGUTBBSUJNdEFBQkJMVWNOQUNBWW1pRVlJQUdhSVFFTElBb2dDVFlDQUNBQklCaWdJQUZoRFFBZ0NpQUhJQWxxSWdNMkFnQWdBMEdBbE92Y0EwOEVRQU5BSUFwQkFEWUNBQ0FJSUFwQkJHc2lDa3NFUUNBSVFRUnJJZ2hCQURZQ0FBc2dDaUFLS0FJQVFRRnFJZ00yQWdBZ0EwSC9rK3ZjQTBzTkFBc0xJQTBnQ0d0QkFuVkJDV3doQTBFS0lRY2dDQ2dDQUNJSlFRcEpEUUFEUUNBRFFRRnFJUU1nQ1NBSFFRcHNJZ2RQRFFBTEN5QUtRUVJxSWdjZ0JpQUdJQWRMR3lFR0N3TkFJQVlpQnlBSVRTSUpSUVJBSUFkQkJHc2lCaWdDQUVVTkFRc0xBa0FnRGtIbkFFY0VRQ0FFUVFoeElRb01BUXNnQTBGL2MwRi9JQXRCQVNBTEd5SUdJQU5LSUFOQmUwcHhJZ29iSUFacUlRdEJmMEYrSUFvYklBVnFJUVVnQkVFSWNTSUtEUUJCZHlFR0FrQWdDUTBBSUFkQkJHc29BZ0FpRGtVTkFFRUtJUWxCQUNFR0lBNUJDbkFOQUFOQUlBWWlDa0VCYWlFR0lBNGdDVUVLYkNJSmNFVU5BQXNnQ2tGL2N5RUdDeUFISUExclFRSjFRUWxzSVFrZ0JVRmZjVUhHQUVZRVFFRUFJUW9nQ3lBR0lBbHFRUWxySWdaQkFDQUdRUUJLR3lJR0lBWWdDMG9iSVFzTUFRdEJBQ0VLSUFzZ0F5QUphaUFHYWtFSmF5SUdRUUFnQmtFQVNoc2lCaUFHSUF0S0d5RUxDMEYvSVFrZ0MwSDkvLy8vQjBIKy8vLy9CeUFLSUF0eUloQWJTZzBCSUFzZ0VFRUFSMnBCQVdvaERnSkFJQVZCWDNFaUZVSEdBRVlFUUNBRElBNUIvLy8vL3dkelNnMERJQU5CQUNBRFFRQktHeUVHREFFTElCSWdBeUFEUVI5MUlnWnpJQVpyclNBU0VKVUNJZ1pyUVFGTUJFQURRQ0FHUVFGcklnWkJNRG9BQUNBU0lBWnJRUUpJRFFBTEN5QUdRUUpySWc4Z0JUb0FBQ0FHUVFGclFTMUJLeUFEUVFCSUd6b0FBQ0FTSUE5cklnWWdEa0gvLy8vL0IzTktEUUlMSUFZZ0Rtb2lBeUFSUWYvLy8vOEhjMG9OQVNBQVFTQWdBaUFESUJGcUlnVWdCQkJqSUFBZ0V5QVJFRnNnQUVFd0lBSWdCU0FFUVlDQUJITVFZd0pBQWtBQ1FDQVZRY1lBUmdSQUlBeEJFR29pQmtFSWNpRURJQVpCQ1hJaENpQU5JQWdnQ0NBTlN4c2lDU0VJQTBBZ0NEVUNBQ0FLRUpVQ0lRWUNRQ0FJSUFsSEJFQWdCaUFNUVJCcVRRMEJBMEFnQmtFQmF5SUdRVEE2QUFBZ0JpQU1RUkJxU3cwQUN3d0JDeUFHSUFwSERRQWdERUV3T2dBWUlBTWhCZ3NnQUNBR0lBb2dCbXNRV3lBSVFRUnFJZ2dnRFUwTkFBc2dFQVJBSUFCQjJaQUJRUUVRV3dzZ0MwRUFUQ0FISUFoTmNnMEJBMEFnQ0RVQ0FDQUtFSlVDSWdZZ0RFRVFha3NFUUFOQUlBWkJBV3NpQmtFd09nQUFJQVlnREVFUWFrc05BQXNMSUFBZ0JrRUpJQXNnQzBFSlRoc1FXeUFMUVFscklRWWdDRUVFYWlJSUlBZFBEUU1nQzBFSlNpRURJQVloQ3lBRERRQUxEQUlMQWtBZ0MwRUFTQTBBSUFjZ0NFRUVhaUFISUFoTEd5RUpJQXhCRUdvaUJrRUljaUVESUFaQkNYSWhEU0FJSVFjRFFDQU5JQWMxQWdBZ0RSQ1ZBaUlHUmdSQUlBeEJNRG9BR0NBRElRWUxBa0FnQnlBSVJ3UkFJQVlnREVFUWFrME5BUU5BSUFaQkFXc2lCa0V3T2dBQUlBWWdERUVRYWtzTkFBc01BUXNnQUNBR1FRRVFXeUFHUVFGcUlRWWdDaUFMY2tVTkFDQUFRZG1RQVVFQkVGc0xJQUFnQmlBTElBMGdCbXNpQmlBR0lBdEtHeEJiSUFzZ0Jtc2hDeUFIUVFScUlnY2dDVThOQVNBTFFRQk9EUUFMQ3lBQVFUQWdDMEVTYWtFU1FRQVFZeUFBSUE4Z0VpQVBheEJiREFJTElBc2hCZ3NnQUVFd0lBWkJDV3BCQ1VFQUVHTUxJQUJCSUNBQ0lBVWdCRUdBd0FCekVHTWdCU0FDSUFJZ0JVZ2JJUWtNQVFzZ0V5QUZRUnAwUVI5MVFRbHhhaUVJQWtBZ0EwRUxTdzBBUVF3Z0Eyc2hCa1FBQUFBQUFBQXdRQ0VZQTBBZ0dFUUFBQUFBQUFBd1FLSWhHQ0FHUVFGcklnWU5BQXNnQ0MwQUFFRXRSZ1JBSUJnZ0Fab2dHS0dnbWlFQkRBRUxJQUVnR0tBZ0dLRWhBUXNnRVVFQ2NpRUxJQVZCSUhFaERTQVNJQXdvQWl3aUJ5QUhRUjkxSWdaeklBWnJyU0FTRUpVQ0lnWkdCRUFnREVFd09nQVBJQXhCRDJvaEJnc2dCa0VDYXlJS0lBVkJEMm82QUFBZ0JrRUJhMEV0UVNzZ0IwRUFTQnM2QUFBZ0JFRUljU0VHSUF4QkVHb2hCd05BSUFjaUJRSi9JQUdaUkFBQUFBQUFBT0JCWXdSQUlBR3FEQUVMUVlDQWdJQjRDeUlIUWJERkJHb3RBQUFnRFhJNkFBQWdCaUFEUVFCS2NrVWdBU0FIdDZGRUFBQUFBQUFBTUVDaUlnRkVBQUFBQUFBQUFBQmhjU0FGUVFGcUlnY2dERUVRYW10QkFVZHlSUVJBSUFWQkxqb0FBU0FGUVFKcUlRY0xJQUZFQUFBQUFBQUFBQUJpRFFBTFFYOGhDVUg5Ly8vL0J5QUxJQklnQ21zaUJtb2lEV3NnQTBnTkFDQUFRU0FnQWlBTklBTkJBbW9nQnlBTVFSQnFJZ2RySWdVZ0JVRUNheUFEU0JzZ0JTQURHeUlKYWlJRElBUVFZeUFBSUFnZ0N4QmJJQUJCTUNBQ0lBTWdCRUdBZ0FSekVHTWdBQ0FISUFVUVd5QUFRVEFnQ1NBRmEwRUFRUUFRWXlBQUlBb2dCaEJiSUFCQklDQUNJQU1nQkVHQXdBQnpFR01nQXlBQ0lBSWdBMGdiSVFrTElBeEJzQVJxSkFBZ0NRc1dBQ0FBSUFBcEE4QUJJQU1wQXdCQkEwRi9FSndEQ3dVQUlBQ2RDOTRCQXdGOEFYOEJmaUFBbVNFQkFrQWdBTDBpQTBLQWdJQ0E4UC8vLy84QWcwSWdpS2NpQWtIcnA0Yi9BMDhFUUNBQ1FZR0EwSUVFVHdSQVJBQUFBQUFBQUFDQUlBR2pSQUFBQUFBQUFQQS9vQ0VCREFJTFJBQUFBQUFBQVBBL1JBQUFBQUFBQUFCQUlBRWdBYUFRbHdKRUFBQUFBQUFBQUVDZ282RWhBUXdCQ3lBQ1FhK3h3ZjREVHdSQUlBRWdBYUFRbHdJaUFDQUFSQUFBQUFBQUFBQkFvS01oQVF3QkN5QUNRWUNBd0FCSkRRQWdBVVFBQUFBQUFBQUF3S0lRbHdJaUFKb2dBRVFBQUFBQUFBQUFRS0NqSVFFTElBR2FJQUVnQTBJQVV4c0xoQUVCQW44akFFRVFheUlCSkFBQ1FDQUF2VUlnaUtkQi8vLy8vd2R4SWdKQis4T2svd05OQkVBZ0FrR0FnSUR5QTBrTkFTQUFSQUFBQUFBQUFBQUFRUUFRaGdZaEFBd0JDeUFDUVlDQXdQOEhUd1JBSUFBZ0FLRWhBQXdCQ3lBQUlBRVFuQVFoQWlBQkt3TUFJQUVyQXdnZ0FrRUJjUkNHQmlFQUN5QUJRUkJxSkFBZ0FBdm1Bd01HZkFGK0EzOENRQUpBQWtBQ1FDQUF2U0lIUWdCWkJFQWdCMElnaUtjaUNFSC8vejlMRFFFTElBZEMvLy8vLy8vLy8vLy9BSU5RQkVCRUFBQUFBQUFBOEw4Z0FDQUFvcU1QQ3lBSFFnQlpEUUVnQUNBQW9VUUFBQUFBQUFBQUFLTVBDeUFJUWYvL3YvOEhTdzBDUVlDQXdQOERJUWxCZ1hnaENpQUlRWUNBd1A4RFJ3UkFJQWdoQ1F3Q0N5QUhwdzBCUkFBQUFBQUFBQUFBRHdzZ0FFUUFBQUFBQUFCUVE2SzlJZ2RDSUlpbklRbEJ5M2NoQ2dzZ0NpQUpRZUsrSldvaUNFRVVkbXEzSWdWRUFHQ2ZVQk5FMHoraUlnRWdCMEwvLy8vL0Q0TWdDRUgvL3o5eFFaN0JtdjhEYXExQ0lJYUV2MFFBQUFBQUFBRHd2NkFpQUNBQUlBQkVBQUFBQUFBQTREK2lvaUlEb2IxQ2dJQ0FnSENEdnlJRVJBQUFJQlY3eTlzL29pSUNvQ0lHSUFJZ0FTQUdvYUFnQUNBQVJBQUFBQUFBQUFCQW9LTWlBU0FESUFFZ0FhSWlBaUFDb2lJQklBRWdBVVNmeG5qUUNackRQNkpFcjNpT0hjVnh6RCtnb2tRRStwZVptWm5aUDZDaUlBSWdBU0FCSUFGRVJGSSszeEx4d2oraVJONER5NVprUnNjL29LSkVXWk1pbENSSjBqK2dva1NUVlZWVlZWWGxQNkNpb0tDaUlBQWdCS0VnQTZHZ0lnQkVBQUFnRlh2TDJ6K2lJQVZFTml2eEVmUCtXVDJpSUFBZ0JLQkUxYTJheWppVXV6MmlvS0Nnb0NFQUN5QUFDd1FBUWdBTG1RRUNBbndCZjBRQUFBQUFBQURnUHlBQXBpRUNJQUNaSVFFQ1FDQUF2VUtBZ0lDQThQLy8vLzhBZzBJZ2lLY2lBMEhCM0ppRUJFMEVRQ0FCRUpjQ0lRRWdBMEgvLzcvL0EwMEVRQ0FEUVlDQXdQSURTUTBDSUFJZ0FTQUJvQ0FCSUFHaUlBRkVBQUFBQUFBQThEK2dvNkdpRHdzZ0FpQUJJQUVnQVVRQUFBQUFBQUR3UDZDam9LSVBDeUFCSUFJZ0FxQVFqUVloQUFzZ0FBdkxBUUVDZnlNQVFSQnJJZ0VrQUFKQUlBQzlRaUNJcDBILy8vLy9CM0VpQWtIN3c2VC9BMDBFUUNBQ1FZQ0F3UElEU1EwQklBQkVBQUFBQUFBQUFBQkJBQkRQQWlFQURBRUxJQUpCZ0lEQS93ZFBCRUFnQUNBQW9TRUFEQUVMQWtBQ1FBSkFBa0FnQUNBQkVKd0VRUU54RGdNQUFRSURDeUFCS3dNQUlBRXJBd2hCQVJEUEFpRUFEQU1MSUFFckF3QWdBU3NEQ0JEUUFpRUFEQUlMSUFFckF3QWdBU3NEQ0VFQkVNOENtaUVBREFFTElBRXJBd0FnQVNzRENCRFFBcG9oQUFzZ0FVRVFhaVFBSUFBTG9RRUJCSDhnQWlBQUtBSlVJZ01vQWdRaUJDQURLQUlBSWdWcklnWkJBQ0FFSUFaUEd5SUVTd1JBSUFBZ0FDZ0NBRUVRY2pZQ0FDQUVJUUlMSUFFZ0F5Z0NEQ0FGYWlBQ0VCOGFJQU1nQXlnQ0FDQUNhaUlGTmdJQUlBQWdBQ2dDTENJQk5nSUVJQUFnQVNBRUlBSnJJZ1FnQUNnQ01DSUFJQUFnQkVzYklnQnFOZ0lJSUFFZ0F5Z0NEQ0FGYWlBQUVCOGFJQU1nQXlnQ0FDQUFhallDQUNBQ0M0c0JBUUYvSXdCQkVHc2lBeVFBQW40Q1FDQUNRUU5QRFFBZ0FDZ0NWQ0VBSUFOQkFEWUNCQ0FESUFBb0FnQTJBZ2dnQXlBQUtBSUVOZ0lNUVFBZ0EwRUVhaUFDUVFKMGFpZ0NBQ0lDYTZ3Z0FWVU5BQ0FBS0FJSUlBSnJyQ0FCVXcwQUlBQWdBaUFCcDJvaUFEWUNBQ0FBclF3QkMwR2cxQVJCSERZQ0FFSi9DeUVCSUFOQkVHb2tBQ0FCQzZJQkFnRjhBWDhnQUpraEFRSjhJQUM5UW9DQWdJRHcvLy8vL3dDRFFpQ0lweUlDUWNIY21QOERUUVJBUkFBQUFBQUFBUEEvSUFKQmdJREE4Z05KRFFFYUlBRVFsd0lpQUNBQW9pQUFSQUFBQUFBQUFQQS9vQ0lBSUFDZ28wUUFBQUFBQUFEd1A2QVBDeUFDUWNIY21JUUVUUVJBSUFFUTZ3TWlBRVFBQUFBQUFBRHdQeUFBbzZCRUFBQUFBQUFBNEQraUR3c2dBVVFBQUFBQUFBRHdQeENOQmdzTHh3RUJBbjhqQUVFUWF5SUJKQUFDZkNBQXZVSWdpS2RCLy8vLy93ZHhJZ0pCKzhPay93Tk5CRUJFQUFBQUFBQUE4RDhnQWtHZXdacnlBMGtOQVJvZ0FFUUFBQUFBQUFBQUFCRFFBZ3dCQ3lBQUlBQ2hJQUpCZ0lEQS93ZFBEUUFhQWtBQ1FBSkFBa0FnQUNBQkVKd0VRUU54RGdNQUFRSURDeUFCS3dNQUlBRXJBd2dRMEFJTUF3c2dBU3NEQUNBQkt3TUlRUUVRendLYURBSUxJQUVyQXdBZ0FTc0RDQkRRQXBvTUFRc2dBU3NEQUNBQkt3TUlRUUVRendJTElRQWdBVUVRYWlRQUlBQUxCUUFnQUp3TEJRQWdBSnNMZ3dJREFud0Nmd0YrSUFDOUlnVkNJSWluUWYvLy8vOEhjU0lEUVlDQXdQOEhUd1JBSUFBZ0FLQVBDMEdUOGYzVUFpRUVBa0FnQTBILy96OU5CRUJCay9IOXl3SWhCQ0FBUkFBQUFBQUFBRkJEb3IwaUJVSWdpS2RCLy8vLy93ZHhJZ05GRFFFTElBVkNnSUNBZ0lDQWdJQ0FmNE1nQTBFRGJpQUVhcTFDSUlhRXZ5SUNJQUtpSUFJZ0FLT2lJZ0VnQVNBQm9xSWdBVVRYN2VUVUFMRENQNkpFMlZIbnZzdEU2TCtnb2lBQklBRkV3dFpKU21EeCtUK2lSQ0FrOEpMZ0tQNi9vS0pFa3VaaEQrWUQvaitnb0NBQ29yMUNnSUNBZ0h5RFFvQ0FnSUFJZkw4aUFTQUFJQUVnQWFLaklnQWdBYUVnQVNBQm9DQUFvS09pSUFHZ0lRQUxJQUFMZXdNQmZBRitBWDhnQUpraEFRSkFBbndnQUwwaUFrSTBpS2RCL3c5eElnTkIvUWROQkVBZ0EwSGZCMGtOQWlBQklBR2dJZ0FnQUNBQm9rUUFBQUFBQUFEd1B5QUJvYU9nREFFTElBRkVBQUFBQUFBQThEOGdBYUdqSWdBZ0FLQUxFS2NEUkFBQUFBQUFBT0Evb2lFQkN5QUJtaUFCSUFKQ0FGTWJDNmdEQWdWL0FYNGdBTDFDLy8vLy8vLy8vLy8vQUlOQ2dZQ0FnSUNBZ1BqL0FGUWdBYjFDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGaHhSUVJBSUFBZ0FhQVBDeUFCdlNJSFFpQ0lweUlDUVlDQXdQOERheUFIcHlJRmNrVUVRQ0FBRUowRUR3c2dBa0VlZGtFQ2NTSUdJQUM5SWdkQ1A0aW5jaUVEQWtBZ0IwSWdpS2RCLy8vLy93ZHhJZ1FnQjZkeVJRUkFBa0FDUUNBRFFRSnJEZ0lBQVFNTFJCZ3RSRlQ3SVFsQUR3dEVHQzFFVlBzaENjQVBDeUFDUWYvLy8vOEhjU0lDSUFWeVJRUkFSQmd0UkZUN0lmay9JQUNtRHdzQ1FDQUNRWUNBd1A4SFJnUkFJQVJCZ0lEQS93ZEhEUUVnQTBFRGRFSFFxZ1JxS3dNQUR3c2dCRUdBZ01EL0IwY2dBa0dBZ0lBZ2FpQUVUM0ZGQkVCRUdDMUVWUHNoK1Q4Z0FLWVBDd0o4SUFZRVFFUUFBQUFBQUFBQUFDQUVRWUNBZ0NCcUlBSkpEUUVhQ3lBQUlBR2ptUkNkQkFzaEFBSkFBa0FDUUNBRERnTUVBQUVDQ3lBQW1nOExSQmd0UkZUN0lRbEFJQUJFQjF3VU15YW1vYnlnb1E4TElBQkVCMXdVTXlhbW9ieWdSQmd0UkZUN0lRbkFvQThMSUFOQkEzUkI4S29FYWlzREFDRUFDeUFBQzZZQkF3RjhBWDhCZmlBQW1TRUJBa0FnQUwwaUEwSTBpS2RCL3c5eElnSkJtUWhQQkVBZ0FSRE1Ba1R2T2ZyK1FpN21QNkFoQVF3QkN5QUNRWUFJVHdSQUlBRWdBYUJFQUFBQUFBQUE4RDhnQVNBQm9rUUFBQUFBQUFEd1A2Q2ZJQUdnbzZBUXpBSWhBUXdCQ3lBQ1FlVUhTUTBBSUFFZ0FhSWlBQ0FBUkFBQUFBQUFBUEEvb0o5RUFBQUFBQUFBOEQrZ295QUJvQkNuQXlFQkN5QUJtaUFCSUFOQ0FGTWJDd1VBSUFDWkM3a0NBd0YvQTN3QmZpQUF2U0lGUWlDSXAwSC8vLy8vQjNFaUFVR0FnTUQvQTA4RVFDQUZweUFCUVlDQXdQOERhM0pGQkVBZ0FFUVlMVVJVK3lINVA2SkVBQUFBQUFBQWNEaWdEd3RFQUFBQUFBQUFBQUFnQUNBQW9hTVBDd0pBSUFGQi8vLy8vZ05OQkVBZ0FVR0FnRUJxUVlDQWdQSURTUTBCSUFBZ0FDQUFvaERTQXFJZ0FLQVBDMFFBQUFBQUFBRHdQeUFBbWFGRUFBQUFBQUFBNEQraUlnT2ZJUUFnQXhEU0FpRUVBbndnQVVHejVyei9BMDhFUUVRWUxVUlUreUg1UHlBQUlBU2lJQUNnSWdBZ0FLQkVCMXdVTXlhbWtieWdvUXdCQzBRWUxVUlUreUhwUHlBQXZVS0FnSUNBY0lPL0lnSWdBcUNoSUFBZ0FLQWdCS0pFQjF3VU15YW1rVHdnQXlBQ0lBS2lvU0FBSUFLZ295SUFJQUNnb2FHaFJCZ3RSRlQ3SWVrL29Bc2lBSm9nQUNBRlFnQlRHeUVBQ3lBQUMzWUJBWDhnQUwxQ05JaW5RZjhQY1NJQlFmOEhUUVJBSUFCRUFBQUFBQUFBOEwrZ0lnQWdBQ0FBb2lBQUlBQ2dvSitnRUtjRER3c2dBVUdZQ0UwRVFDQUFJQUNnUkFBQUFBQUFBUEMvSUFBZ0FLSkVBQUFBQUFBQThMK2dueUFBb0tPZ0VNd0NEd3NnQUJETUFrVHZPZnIrUWk3bVA2QUxCUUFnQUo4THJnSURBWHdCZmdGL0lBQzlJZ0pDSUlpblFmLy8vLzhIY1NJRFFZQ0F3UDhEVHdSQUlBS25JQU5CZ0lEQS93TnJja1VFUUVRQUFBQUFBQUFBQUVRWUxVUlUreUVKUUNBQ1FnQlpHdzhMUkFBQUFBQUFBQUFBSUFBZ0FLR2pEd3NDZkNBRFFmLy8vLzREVFFSQVJCZ3RSRlQ3SWZrL0lBTkJnWUNBNHdOSkRRRWFSQWRjRkRNbXBwRThJQUFnQUNBQW9oRFNBcUtoSUFDaFJCZ3RSRlQ3SWZrL29BOExJQUpDQUZNRVFFUVlMVVJVK3lINVB5QUFSQUFBQUFBQUFQQS9vRVFBQUFBQUFBRGdQNklpQUo4aUFTQUJJQUFRMGdLaVJBZGNGRE1tcHBHOG9LQ2hJZ0FnQUtBUEMwUUFBQUFBQUFEd1B5QUFvVVFBQUFBQUFBRGdQNklpQUo4aUFTQUFFTklDb2lBQUlBRzlRb0NBZ0lCd2c3OGlBQ0FBb3FFZ0FTQUFvS09nSUFDZ0lnQWdBS0FMQzc0Q0FRZC9Jd0JCSUdzaUF5UUFJQU1nQUNnQ0hDSUVOZ0lRSUFBb0FoUWhCU0FESUFJMkFod2dBeUFCTmdJWUlBTWdCU0FFYXlJQk5nSVVJQUVnQW1vaEJVRUNJUVlnQTBFUWFpRUJBbjhEUUFKQUFrQUNRQ0FBS0FJOElBRWdCaUFEUVF4cUVBSVFqd1pGQkVBZ0JTQURLQUlNSWdkR0RRRWdCMEVBVGcwQ0RBTUxJQVZCZjBjTkFnc2dBQ0FBS0FJc0lnRTJBaHdnQUNBQk5nSVVJQUFnQVNBQUtBSXdhallDRUNBQ0RBTUxJQUVnQnlBQktBSUVJZ2hMSWdsQkEzUnFJZ1FnQnlBSVFRQWdDUnRySWdnZ0JDZ0NBR28yQWdBZ0FVRU1RUVFnQ1J0cUlnRWdBU2dDQUNBSWF6WUNBQ0FGSUFkcklRVWdCaUFKYXlFR0lBUWhBUXdCQ3dzZ0FFRUFOZ0ljSUFCQ0FEY0RFQ0FBSUFBb0FnQkJJSEkyQWdCQkFDQUdRUUpHRFFBYUlBSWdBU2dDQkdzTElRUWdBMEVnYWlRQUlBUUxSZ0VCZnlBQUtBSThJUU1qQUVFUWF5SUFKQUFnQXlBQnB5QUJRaUNJcHlBQ1FmOEJjU0FBUVFocUVBZ1Fqd1loQWlBQUtRTUlJUUVnQUVFUWFpUUFRbjhnQVNBQ0d3c0pBQ0FBS0FJOEVBTUx2Z1FDQkg4QmZpTUFRVUJxSWdRa0FDQUFLQUlBSVFZZ0JFSUFOd0lNSUFSQ2dJQ0FnSUNBZ0lDQWZ6Y0NCQ0FFSUFZMkFnQWdCQ0FCSUFKQklHb2lBVUhtRHhDZkJDQUVJQVFnQXlBQlFlWVBFRU1hQWtBQ1FDQUVLQUlJSWdGQi8vLy8vd2RHQkVBZ0FCQTFEQUVMSUFBZ0JFWU5BU0FBS0FJQUlRY2dCRUlBTndJNElBUkNnSUNBZ0lDQWdJQ0FmemNDTUNBRUlBYzJBaXdDZnlBQlFRQklCRUJCZjBFQUlBUW9BZ1FiREFFTElBUkJMR29pQVVFZ1FRRVEwd0lnQVNBRUlBRkJJRUVDRUpVQkdpQUVRU2hxSUFGQkFCQ3BBU0FFS0FJSUlRRWdCQ2dDS0FzaEJpQUVRU3hxSWdVZ0FpQUJRUUFnQVVFQVNodHFJQUpCSDJvZ0FrRWhha0VCZGhDVkJpSURia0VCYWlJQklBTnFRUUYwYWtFNmFpSUNRUVlRMHdJZ0JTQUZJQWFzSUFKQkFCRFVBaUFGSUFRZ0JTQUNRUUFRNUFFYUlBVkJBQ0FEYTBILy8vLy9BMEVCRU13QkdpQUVRZ0EzQWlBZ0JFS0FnSUNBZ0lDQWdJQi9Od0lZSUFRZ0J6WUNGQ0FBUWdFUU1Cb2dBYTBoQ0FOQUlBaW5RUUJNUlFSQUlBUkJGR29pQVNBSUVEQWFJQUVnQkVFc2FpQUJJQUpCQUJDVkFSb2dBQ0FBSUFFZ0FrRUFFRU1hSUFBZ0FFSUJJQUpCQUJCMUdpQUlRZ0Y5SVFnTUFRc0xRUUFoQVNBRFFRQWdBMEVBU2hzaEF5QUVRUlJxRUJzZ0JFRXNhaEFiQTBBZ0FTQURSa1VFUUNBQUlBQWdBQ0FDUWVBUEVFTWFJQUZCQVdvaEFRd0JDd3NnQUNBR1FmLy8vLzhEUWVFUEVNd0JHZ3NnQkJBYklBUkJRR3NrQUVFUUR3dEIyUDBBUWRUOEFFRytJVUdZMWdBUUFBQUxlUUVCZnlBQlFvQ0FnSUJ3ZzBLQWdJQ0FNRklFUUNBQVFhSStRUUFRRlVLQWdJQ0E0QUFQQ3dKK0FrQWdBa1VOQUNBREtRTUFJZ0ZDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFRb0NBZ0lEZ0FDQUFJQUVRS0NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFYUlBR25JUVFMSUFBZ0JFRURFSUFFQ3d1dkFRRUNmeU1BUVNCcklnUWtBQ0FBS0FJQUlRVWdCRUVJYWlBRFFRQVFxUUVnQUNBQklBUW9BZ2dpQVNBQlFSOTFJZ0Z6SUFGcklnRWdBa0hBQUNBQlFRRnJaMEVCZEd0QkFDQUJRUUpQRzJwQkNHb2lBa0hnRHhDaUJDRUJJQU1vQWdRRVFDQUVRZ0EzQWhnZ0JFS0FnSUNBZ0lDQWdJQi9Od0lRSUFRZ0JUWUNEQ0FFUVF4cUlnTkNBUkF3R2lBQUlBTWdBQ0FDUWVBUEVKVUJJQUZ5SVFFZ0F4QWJDeUFFUVNCcUpBQWdBUXVRQmdJSWZ3RitJd0JCOEFCcklnTWtBQ0FBSUFGSEJFQWdBQ2dDQUNFRUlBTkNBRGNDYUNBRFFvQ0FnSUNBZ0lDQWdIODNBbUFnQXlBRU5nSmNJQU5CM0FCcUlnVWdBUkJFR2lBRFFnQTNBbFFnQTBLQWdJQ0FnSUNBZ0lCL053Sk1JQU1nQkRZQ1NDQURLQUprSVFZZ0EwRUFOZ0prSUFOQnlBQnFJZ0ZDcXRXcTFRb1FNQm9nQTBFQU5nSlFJQVVnQVJDeUFnUkFJQU1nQXlnQ1pFRUJhallDWkNBR1FRRnJJUVlMSUFOQnlBQnFFQnNnQWtFQmFrRUJkaENWQmlFRklBTkNBRGNDVkNBRFFvQ0FnSUNBZ0lDQWdIODNBa3dnQXlBRU5nSklJQU5DQURjQ1FDQURRb0NBZ0lDQWdJQ0FnSDgzQWpnZ0F5QUVOZ0kwSUFOQjNBQnFJZ0VnQVVKL1FmLy8vLzhEUVFBUWRSb2dCVUVBSUFWQkFFb2JJUWtnQWlBRmFpQUNJQVZCQVhSdVFRRnFJZ3BCQVhScVFTQnFJUUpCQUNFQkEwQWdBU0FKUmtVRVFDQURRY2dBYWlJSElBTkIzQUJxSWdoQ0FTQUNRUUFRZFJvZ0EwRTBhaUlMSUFjZ0FrRUdFSkVHSUFjZ0MwSUJJQUpCQUJCMUdpQUlJQWdnQnlBQ1FRQVFsUUVhSUFGQkFXb2hBUXdCQ3dzZ0EwSUFOd0lzSUFOQ2dJQ0FnSUNBZ0lDQWZ6Y0NKQ0FESUFRMkFpQWdBMElBTndJWUlBTkNnSUNBZ0lDQWdJQ0FmemNDRUNBRElBUTJBZ3dnQTBFZ2FpSUJJQU5CM0FCcUlnUkNBaUFDUVFBUWRSb2dBU0FFSUFFZ0FrRUFFSlVCR2lBRFFReHFJQUVnQVNBQ1FRQVFReG9nQUVJQUVEQWFJQXFzSVF3RFFDQU1RZ0JYUlFSQUlBTkJ5QUJxSWdGQ0FSQXdHaUFEUVRScUlnUWdES2RCQVhSQkFYS3NFREFhSUFFZ0FTQUVJQUpCQUJDVkFSb2dBQ0FBSUFFZ0FrRUFFTXNCR2lBQUlBQWdBMEVNYWlBQ1FRQVFReG9nREVJQmZTRU1EQUVMQ3lBQUlBQkNBU0FDUVFBUWRSb2dBQ0FBSUFOQklHb2lBU0FDUVFBUVF4b2dBUkFiSUFOQkRHb1FHeUFEUVRScUVCc2dBMEhJQUdvUUd5QUFJQVZCQVdwQi8vLy8vd05CQVJETUFSb2dBMEhjQUdvaUFTQUNRUVlRMHdJZ0FTQUJJQWFzSUFKQkFCRFVBaUFBSUFBZ0FTQUNRUUFReXdFYUlBRVFHeUFEUWZBQWFpUUFRUkFQQzBIWS9RQkIxUHdBUWRjaVFhaldBQkFBQUFzUkFDQUFJQUVnQWlBRElBUkJBQkNXQmdzUkFDQUFJQUVnQWlBRElBUkJBUkNXQmd2WUF3RUhmeUFDS0FJRUlBRW9BZ1J6SVFjQ1FBSkFBa0FDUUFKQUFrQUNRQ0FCS0FJSUlnWkIvZi8vL3dkTUJFQWdBaWdDQ0NJRlFmMy8vLzhIU2cwQklBWkJnSUNBZ0hoSERRWWdCVUdBZ0lDQWVFWU5CQXdIQ3lBR1FmLy8vLzhIUmcwQklBSW9BZ2doQlFzZ0JVSC8vLy8vQjBjTkFRc2dBQkExUVFBUEN5QUdRZjcvLy84SFJ5SUJJQVZCL3YvLy93ZEhjZzBCQ3lBQUVEVkJBUThMSUFFTkFTQUFJQWNRakFGQkFBOExJQVZCZ0lDQWdIaEdCRUFnQUNBSEVJd0JRUUlQQ3dKQUlBQW9BZ0FpQlNnQ0FFRUFJQUVvQWd3aUJpQURRU0ZxUVFWMklnZ2dCaUFJU2hzaUNpQUNLQUlNSWdocUlnbEJBblJCQkdvZ0JTZ0NCQkVCQUNJR0JFQWdCa0VBSUFrZ0FTZ0NER3RCQW5RaUN4QXJJZ1lnQzJvZ0FTZ0NFQ0FCS0FJTVFRSjBFQjhhSUFBZ0NrRUJhaEJCUlFSQUlBVWdBQ2dDRUNBR0lBa2dBaWdDRUNBSUVLVUVSUTBDQ3lBRktBSUFJQVpCQUNBRktBSUVFUUVBR2dzZ0FCQTFRU0FQQ3lBR0lBZ1FxQU1FUUNBQUtBSVFJZ1VnQlNnQ0FFRUJjallDQUFzZ0FDZ0NBQ0lGS0FJQUlBWkJBQ0FGS0FJRUVRRUFHaUFDS0FJSUlRSWdBU2dDQ0NFQklBQWdCellDQkNBQUlBRWdBbXRCSUdvMkFnZ2dBQ0FESUFRUXN3SVBDeUFBSUFjUWlRRkJBQXRZQVFGK0lBQWdBeWtEQUJEOUFVRUFSNjFDZ0lDQWdCQ0VJUVFnQVVLQWdJQ0FjSU5DZ0lDQWdEQlJCRUFnQkE4TElBQWdBVUVHRUdVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBQWdBU0FFRU5zQkN5QUJDNU1DQWdGK0FYOGpBRUVRYXlJRkpBQUNRQUpBSUFKRkJFQU1BUXNnQUNBREtRTUFFTGtDSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVFKQUFrQWdCRUlnaUtkQkMyb09Bd0VBQUFJTElBU25RUVJxSUFWQkNHb1F0UVVnQUNBRUVBOUNnSUNBZ01CK0lBVXBBd2dpQkVLQWdJQ0F3SUdBL1A4QWZTQUVRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d5RUVEQUVMSUFBZ0JCQTNJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFRUWpRRWlCRUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEJDeUFCUW9DQWdJQndnMEtBZ0lDQU1GRU5BQ0FBSUFGQkJCQmxJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FBSUFFZ0JCRGJBUXNnQVNFRUN5QUZRUkJxSkFBZ0JBczdBUUYvQTBBZ0FnUkFJQUF0QUFBaEF5QUFJQUV0QUFBNkFBQWdBU0FET2dBQUlBRkJBV29oQVNBQVFRRnFJUUFnQWtFQmF5RUNEQUVMQ3dzYUFDQUFMUUFBSVFJZ0FDQUJMUUFBT2dBQUlBRWdBam9BQUF0Q0FRRi9JQUpCQVhZaEFnTkFJQUlFUUNBQUx3RUFJUU1nQUNBQkx3RUFPd0VBSUFFZ0F6c0JBQ0FCUVFKcUlRRWdBRUVDYWlFQUlBSkJBV3NoQWd3QkN3c0xHZ0FnQUM4QkFDRUNJQUFnQVM4QkFEc0JBQ0FCSUFJN0FRQUxRZ0VCZnlBQ1FRSjJJUUlEUUNBQ0JFQWdBQ2dDQUNFRElBQWdBU2dDQURZQ0FDQUJJQU0yQWdBZ0FVRUVhaUVCSUFCQkJHb2hBQ0FDUVFGcklRSU1BUXNMQ3hvQUlBQW9BZ0FoQWlBQUlBRW9BZ0EyQWdBZ0FTQUNOZ0lBQzBJQkFYNGdBa0VEZGlFQ0EwQWdBZ1JBSUFBcEF3QWhBeUFBSUFFcEF3QTNBd0FnQVNBRE53TUFJQUZCQ0dvaEFTQUFRUWhxSVFBZ0FrRUJheUVDREFFTEN3c2NBUUYrSUFBcEF3QWhBeUFBSUFFcEF3QTNBd0FnQVNBRE53TUFDMW9CQW40Z0FrRUVkaUVDQTBBZ0FnUkFJQUFwQXdBaEF5QUFJQUVwQXdBM0F3QWdBQ2tEQ0NFRUlBQWdBU2tEQ0RjRENDQUJJQVEzQXdnZ0FTQUROd01BSUFGQkVHb2hBU0FBUVJCcUlRQWdBa0VCYXlFQ0RBRUxDd3MwQVFKK0lBQXBBd0FoQXlBQUlBRXBBd0EzQXdBZ0FDa0RDQ0VFSUFBZ0FTa0RDRGNEQ0NBQklBUTNBd2dnQVNBRE53TUFDd2tBSUFFZ0FoRHpCUXZrQkFJR2ZnRi9Jd0JCRUdzaUFpUUFJQUZDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUFvQWhBb0Fvd0JLUU1JSVFFTEFrQWdBQ0FCUVRzZ0FVRUFFQlFpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFVaEFRd0JDd0pBQWtBZ0JVTC8vLy8vYjFZTkFDQUFJQVVRRHlBQUlBRVFnQU1pQzBVTkFRSi9JQVJCQUVnRVFDQUxLQUlvUVJocURBRUxJQXNnQkVFRGRHcEIyQUJxQ3lrREFDSUZRaUNJcDBGMVNRMEFJQVduSWdzZ0N5Z0NBRUVCYWpZQ0FBc2dBQ0FGUVFNUVNTRUJJQUFnQlJBUElBRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFBSkFJQU1nQkVFSFJrRURkR29wQXdBaUJVS0FnSUNBY0lOQ2dJQ0FnREJTQkVBZ0FDQUZFQ2dpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCSUFBZ0FVRXpJQVZCQXhBWkdnc2dCRUVIUmdSQVFvQ0FnSURnQUNFSFFvQ0FnSUF3SVFVQ1FBSkFJQUFnQXlrREFFRUFFT2NCSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0FNQ0VJREFFTElBQWdCa0hxQUNBR1FRQVFGQ0lJUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUJBK0lnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFS0FnSUNBNEFBaEJRd0JDd05BSUFBZ0JpQUlJQUpCREdvUXJnRWlDa0tBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQUlvQWd3RVFDQUZJUWNNQkFzZ0FDQUZJQWtnQ2hCcUlRTWdDVUlCZkNFSklBTkJBRTROQVFzTElBQWdCa0VCRUswQkdnc2dBQ0FGRUE4TElBQWdDQkFQSUFBZ0JoQVBJQWRDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFGQk5DQUhRUU1RR1JvTElBQWdBVUVBUVFCQkFSREtBZ3dDQ3lBQUlBRVFEd3RDZ0lDQWdPQUFJUUVMSUFKQkVHb2tBQ0FCQytzQ0FRWitJd0JCRUdzaUFpUUFJQU1wQXdBaEFVS0FnSUNBNEFBaEJTQUFFRFFpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBUW9DQWdJQXdJUVFDUUNBQUlBRkJBQkRuQVNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBQ1FDQUFJQUZCNmdBZ0FVRUFFQlFpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBQTBBZ0FDQUJJQVlnQWtFTWFoQ3VBU0lFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQWlnQ0RBUkFJQWNoQlF3RUN3SkFBa0FnQkVMLy8vLy9iMWdFUUNBQUVDUU1BUXNnQUNBRVFnQVFUU0lJUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBRVFnRVFUU0lKUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBSUVBOE1BUXNnQUNBSElBZ2dDVUdIZ0FFUXZRRkJBRTROQVFzZ0FDQUVFQThNQWdzZ0FDQUVFQThNQUFzQUN5QUJRb0NBZ0lCd1dnUkFJQUFnQVVFQkVLMEJHZ3NnQmlFRUN5QUJJUVlnQnlFQkN5QUFJQVFRRHlBQUlBWVFEeUFBSUFFUUR3c2dBa0VRYWlRQUlBVUxTZ0JCTHlFQ0lBQWdBeWtEQUNJQlFvQ0FnSUJ3V2dSL0lBR25Md0VHSWdKQk1FWUVRRUVOUVRBZ0FDQUJFRGdiSVFJTElBQW9BaEFvQWtRZ0FrRVliR29vQWdRRlFTOExFQzBMOGdFQ0JIOEJmaU1BUVRCcklnSWtBRUtCZ0lDQUVDRUJBa0FnQXlrREFDSUpRb0NBZ0lCd1ZBMEFRb0NBZ0lEZ0FDRUJJQUFnQWtFc2FpQUNRU2hxSUFtbklnaEJBeENPQVEwQUlBSW9BaXdoQmlBQ0tBSW9JUWRCQUNFREFrQURRQ0FESUFkSEJFQWdBQ0FDUVFocUlBZ2dCaUFEUVFOMGFpZ0NCQkJNSWdWQkFFZ05BZ0pBSUFWRkRRQWdBQ0FDUVFocUVFZ2dBaWdDQ0NJRlFRRnhSU0FFUlNBRlFRSnhSWEp4RFFCQ2dJQ0FnQkFoQVF3REN5QURRUUZxSVFNTUFRc0xJQUFnQ1JDWkFTSURRUUJJRFFFZ0EwRUJSNjFDZ0lDQWdCQ0VJUUVMSUFBZ0JpQUhFRm9MSUFKQk1Hb2tBQ0FCQzc4QkFnRitBWDlDZ0lDQWdEQWhBUUpBSUFBZ0F5a0RBQkFsSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUVFQklBSWdBa0VCVEJzaEJVRUJJUUlEUUNBQ0lBVkdCRUFnQkE4TElBTWdBa0VEZEdvcEF3QWlBVUtBZ0lDQUVJUkNnSUNBZ0hDRFFvQ0FnSUF3VWdSQUlBQWdBUkFsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQWlBQUlBUWdBVUtBZ0lDQU1FRUJFTlFGRFFJZ0FDQUJFQThMSUFKQkFXb2hBZ3dBQ3dBTElBQWdCQkFQSUFBZ0FSQVBRb0NBZ0lEZ0FBc1lBQ0FBSUFNcEF3QWdBeWtEQ0JCU3JVS0FnSUNBRUlRTDRnSUNBMzREZnlNQVFTQnJJZ0lrQUVLQWdJQ0E0QUFoQkNBQUlBTXBBd0FRSlNJRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVCQ2dJQ0FnREFoQVFKQUFrQWdBQ0FDUVJ4cUlBSkJHR29nQmFkQkF4Q09BUTBBUW9DQWdJRGdBQ0VCSUFBUU5DSUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBaWdDSENFSElBSW9BaGdoQ0VFQUlRTURRQ0FESUFoSEJFQUNRQUpBSUFBZ0J5QURRUU4wYWlJSktBSUVFRndpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFJZ0FUY0RDQ0FDSUFVM0F3QWdBQ0FFSUFBZ0FrRUFFTVlFSVFZZ0FDQUJFQThnQmtLQWdJQ0FjSU1pQVVLQWdJQ0FNRkVOQVNBQlFvQ0FnSURnQUZFTkFDQUFJQVFnQ1NnQ0JDQUdRWWVBQVJBWlFRQk9EUUVMSUFRaEFRd0RDeUFEUVFGcUlRTU1BUXNMSUFBZ0J5QUlFRm9nQlNFQkRBRUxJQUFnQWlnQ0hDQUNLQUlZRUZvZ0FDQUZFQTlDZ0lDQWdPQUFJUVFMSUFBZ0FSQVBDeUFDUVNCcUpBQWdCQXNRQUNBQUlBTXBBd0JCRVNBRUVLb0NDeEFBSUFBZ0F5a0RBRUVDUVFBUXFnSUxFQUFnQUNBREtRTUFRUUZCQUJDcUFndEhBUUYrUW9DQWdJRGdBQ0VFSUFBZ0F5a0RBQ0lCSUFNcEF3Z1FyZ1lFZmtLQWdJQ0E0QUFGSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBQkN3dEJBQ0FBSUFNcEF3QWlBU0FES1FNSVFRRVFpd0pCQUVnRVFFS0FnSUNBNEFBUEN5QUJRaUNJcDBGMVR3UkFJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FBc2dBUXVKQVFFQmZpQURLUU1BSWdGQy8vLy8vMjlXSUFGQ2dJQ0FnSENEUW9DQWdJQWdVWEpGQkVBZ0FFRzM1QUJCQUJBVlFvQ0FnSURnQUE4TEFrQWdBQ0FCRUVjaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBTXBBd2dpQkVLQWdJQ0FjSU5DZ0lDQWdEQlJEUUVnQUNBQklBUVFyZ1pGRFFFZ0FDQUJFQThMUW9DQWdJRGdBQThMSUFFTHBRUUNCWDhDZmlNQVFTQnJJZ1VrQUNBQUlBVkJDR29pQmtFQUVEMGFJQVpCS0JBN0dpQUVRWDV4UVFKR0JFQWdCVUVJYWtIeG1RRVFpQUVhQ3lBRlFRaHFRYnJNQUJDSUFSb2dCRUY5Y1VFQlJnUkFJQVZCQ0dwQktoQTdHZ3NnQlVFSWFrR3ZsQUVRaUFFYVFRQWhCaUFDUVFGcklnZEJBQ0FIUVFCS0d5RUlBa0FDUUFKQUEwQWdCaUFJUndSQUlBWUVRQ0FGUVFocVFTd1FPeG9MSUFaQkEzUWhDU0FHUVFGcUlRWWdCVUVJYWlBRElBbHFLUU1BRUljQlJRMEJEQUlMQ3lBRlFRaHFRWWFhQVJDSUFSb2dBa0VBU2dSQUlBVkJDR29nQXlBSFFRTjBhaWtEQUJDSEFRMEJDeUFGUVFocUlnSkJpWkVCRUlnQkdrS0FnSUNBTUNFTElBSVFOaUlLUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQUNBQUtRUEFBU0FLUVFOQmZ4Q2NBeUVMSUFBZ0NoQVBJQXRDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FCUW9DQWdJQndnMEtBZ0lDQU1GRU5BaUFBSUFGQk95QUJRUUFRRkNJS1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFQ1FDQUtRdi8vLy85dlZnMEFJQUFnQ2hBUElBQWdBUkNBQXlJQ1JRMENJQUlvQWlnZ0JFRUJkRUd1d0FGcUx3RUFRUU4wYWlrREFDSUtRaUNJcDBGMVNRMEFJQXFuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dBQ0FMSUFwQkFSQ0xBaUVDSUFBZ0NoQVBJQUpCQUU0TkFnd0JDeUFGS0FJSUtBSVFJZ0pCRUdvZ0JTZ0NEQ0FDS0FJRUVRQUFRb0NBZ0lBd0lRc0xJQUFnQ3hBUFFvQ0FnSURnQUNFTEN5QUZRU0JxSkFBZ0N3dUFBZ0lDZmdGL0l3QkJJR3NpQnlRQVFvQ0FnSURnQUNFRkFrQUNRQ0FBSUFFUUpTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FES1FNQUVERWlBMFVOQUFOQUlBQWdCeUFCcHlBREVFd2lBa0VBU0EwQ0lBSUVRRUtBZ0lDQU1DRUZBa0FnQnkwQUFFRVFjVVVOQUNBSFFSaEJFQ0FFRzJvcEF3QWlCVUlnaUtkQmRVa05BQ0FGcHlJQ0lBSW9BZ0JCQVdvMkFnQUxJQUFnQnhCSURBTUxJQUFnQVJDTUFpSUJRb0NBZ0lCd2d5SUdRb0NBZ0lBZ1VnUkFJQVpDZ0lDQWdPQUFVUVJBSUFZaEJRd0VDeUFBRUh0RkRRRU1Bd3NMUW9DQWdJQXdJUVVNQVF0QkFDRURDeUFBSUFNUUV5QUFJQUVRRHlBSFFTQnFKQUFnQlF1eEFRRURmaUFES1FNSUlRVWdBeWtEQUNFR1FvQ0FnSURnQUNFSEFrQWdBQ0FCRUNVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSK0lBQWdCUkJnRFFFZ0FDQUdFREVpQWtVTkFTQUFJQUVnQWtLQWdJQ0FNRUtBZ0lDQU1DQUZJQVFiSUFWQ2dJQ0FnREFnQkJ0Qmhhb0JRWVdhQVNBRUd4QnRJUU1nQUNBQkVBOGdBQ0FDRUJOQ2dJQ0FnT0FBUW9DQWdJQXdJQU5CQUVnYkJVS0FnSUNBNEFBTER3c2dBQ0FCRUE5Q2dJQ0FnT0FBQzNJQkFYNUNnSUNBZ0RBaEF5QUJRb0NBZ0lBUWhFS0FnSUNBY0lOQ2dJQ0FnREJSQkVBZ0FCQWtRb0NBZ0lEZ0FBOExJQUpDZ0lDQWdIQ0RRb0NBZ0lBZ1VpQUNRdi8vLy85dldIRUVma0tBZ0lDQU1BVkNnSUNBZ09BQVFvQ0FnSUF3SUFBZ0FTQUNRUUVRaXdKQkFFZ2JDd3N5QVFGK0lBQWdBUkFsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQkR3c2dBQ0FCRU9nQklRSWdBQ0FCRUE4Z0FndWdBUUlCZmdGL0l3QkJJR3NpQWlRQVFvQ0FnSURnQUNFRUFrQUNRQ0FBSUFFUUpTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FES1FNQUVERWlBMFVOQUNBQUlBSWdBYWNnQXhCTUlnVkJBRWdOQVNBRlJRUkFRb0NBZ0lBUUlRUU1BZ3NnQWpVQ0FDRUVJQUFnQWhCSUlBUkNBb2hDQVlOQ2dJQ0FnQkNFSVFRTUFRdEJBQ0VEQ3lBQUlBTVFFeUFBSUFFUUR5QUNRU0JxSkFBZ0JBdkJBUUVDZmdKQUFuNUNnSUNBZ0JBZ0F5a0RBQ0lFUW9DQWdJQndWQTBBR2tLQWdJQ0E0QUFnQUNBQkVDVWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFHaUFFcHlJQ0lBSW9BZ0JCQVdvMkFnQWdBYWNoQWdOQUlBQWdCQkNNQWlJRVFvQ0FnSUJ3Z3lJRlFvQ0FnSURnQUZJRVFDQUNJQVNuUmlBRlFvQ0FnSUFnVVhJTkF5QUFFSHRGRFFFTEN5QUFJQVFRRHlBQUlBRVFEMEtBZ0lDQTRBQUxEd3NnQUNBRUVBOGdBQ0FCRUE4Z0JVS0FnSUNBSUZLdFFvQ0FnSUFRaEF0NkFRRitJQUFnQXlrREFCQXhJZ0pGQkVCQ2dJQ0FnT0FBRHd0Q2dJQ0FnT0FBSVFRZ0FDQUJFQ1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFBZ0FoQVRJQUVQQ3lBQVFRQWdBYWNnQWhCTUlRTWdBQ0FDRUJNZ0FDQUJFQTlDZ0lDQWdPQUFJQU5CQUVldFFvQ0FnSUFRaENBRFFRQklHd3NJQUNBQUlBRVFKUXNQQUNBQUlBRkJOMEVBUVFBUXJBSUxMUUVCZmtLQWdJQ0FNQ0VDQWtBZ0FSQ2pBeUlBUlEwQUlBQXRBQkpCQkhGRkRRQWdBRFVDUkNFQ0N5QUNDek1DQVg0QmYwS0FnSUNBTUNFQ0FrQWdBUkNqQXlJRFJRMEFJQU10QUJKQkJIRkZEUUFnQUNBREtBSkFFQzBoQWdzZ0Fnc29BRUtBZ0lDQTRBQWdBQ0FES1FNQUlBRVF2Z1VpQUVFQVI2MUNnSUNBZ0JDRUlBQkJBRWdiQzdjQkFnRitBbjlDZ0lDQWdPQUFJUVFnQUNBQkVHQUVma0tBZ0lDQTRBQUZRY3FaQVNFQ0FrQWdBYWNpQXk4QkJoRHVBVVVOQUFKQUlBTW9BaUFpQXk4QUVTSUZRWUFJY1VVTkFDQURLQUpVSWdaRkRRQWdBQ0FHSUFNb0FrZ1Frd0lQQ3lBRlFRUjJRUU54UVFGcklnTkJBa3NOQUNBRFFRSjBRZlQvQVdvb0FnQWhBZ3NnQUNBQ0lBQWdBVUUySUFGQkFCQVVJZ0ZDZ0lDQWdIQ0RRb0NBZ0lBd1VRUitJQUJCTHhBdEJTQUJDMEcrR1JDK0FRc0w2UVVEQTM0R2Z3TjhBa0FDZmtLQWdJQ0E0QUFnQUNBQkVHQU5BQnBDZ0lDQWdPQUFJQUFnQUNrRE1FRU9FRWtpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2lBRnB5SUtJQUZDZ0lDQWdIQmFCSDhnQWFjdEFBVkJFSEVGUVFBTElBb3RBQVZCN3dGeGNqb0FCU0FBUVFFZ0FpQUNRUUZNR3lJTFFRRnJJZ2hCQTNSQkdHb1FLU0lIUlEwQklBRkNJSWluUVhWUEJFQWdBYWNpQWlBQ0tBSUFRUUZxTmdJQUN5QUhJQUUzQXdBZ0F5a0RBQ0lFUWlDSXAwRjFUd1JBSUFTbklnSWdBaWdDQUVFQmFqWUNBQXNnQnlBSU5nSVFJQWNnQkRjRENFRUFJUUlEUUNBQ0lBaEhCRUFnQXlBQ1FRRnFJZ2xCQTNScUtRTUFJZ1JDSUlpblFYVlBCRUFnQktjaURDQU1LQUlBUVFGcU5nSUFDeUFISUFKQkEzUnFJQVEzQXhnZ0NTRUNEQUVMQ3lBS0lBYzJBaUFnQVVMLy8vLy9iMWdFUUNBQUVDUU1BZ3NnQUVFQUlBR25RVEFRVENJQ1FRQklEUUZDQUNFRUFrQWdBa1VOQUNBQUlBRkJNQ0FCUVFBUUZDSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSWdCa0wvLy8vL0QxZ0VRQ0FHcHlJQ0lBaHJRUUFnQWlBTFRodXRJUVFNQVFzZ0JrSWdpS2RCQjJ0QmJVMEVRQUpBSUFaQ2dJQ0FnTUNCZ1B6L0FId2lCRUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZnMEFJQVMvblNJT0lBaTNJZzlsRFFBZ0RpQVBvU0VOQ3lBTnZTSUVBbjhnRFpsRUFBQUFBQUFBNEVGakJFQWdEYW9NQVF0QmdJQ0FnSGdMSWdLM3ZWRUVRQ0FDclNFRURBSUxRb0NBZ0lEQWZpQUVRb0NBZ0lEQWdZRDgvd0I5SUFSQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliSVFRTUFRc2dBQ0FHRUE4TElBQWdCVUV3SUFSQkFSQVpHaUFBUWRTWkFTQUFJQUZCTmlBQlFRQVFGQ0lFUW9DQWdJQndneUlCUW9DQWdJQ1FmMUlFZmlBQlFvQ0FnSURnQUZFTkFpQUFJQVFRRHlBQVFTOFFMUVVnQkF0QnpKNEJFTDRCSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBVkJOaUFCUVFFUUdSb2dCUXNQQ3lBQUlBVVFEMEtBZ0lDQTRBQUxNQUFnQWtFQVRBUkFJQUFnQVVLQWdJQ0FNRUVBUVFBUUlROExJQUFnQVNBREtRTUFJQUpCQVdzZ0EwRUlhaEFoQzZNQ0FnRi9CSDRqQUVFUWF5SUZKQUJDZ0lDQWdEQWhCZ0pBQWtBZ0FDQUZRUWhxSUFBZ0FSQWxJZ2tRUEEwQUlBVkJBVFlDQkFKQUlBUUVRQ0FES1FNQUlRaENnSUNBZ0RBaEJ5QUNRUUpPQkVBZ0F5a0RDQ0VIQ3lBQUlBZ1FZRVVOQVF3Q0N5QUNRUUJNQkVCQ2dJQ0FnREFoQ0VLQWdJQ0FNQ0VIREFFTFFvQ0FnSUF3SVFoQ2dJQ0FnREFoQnlBREtRTUFJZ0ZDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFJQUFnQlVFRWFpQUJFTG9CUVFCSURRRUxJQUFnQ1VJQUVLc0NJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FCSVFZTUFRc2dBU0VHSUFBZ0FTQUpJQVVwQXdoQ0FDQUZLQUlFSUFnZ0J4Q3ZCa0lBVXcwQUlBa2hCZ3dCQ3lBQUlBa1FEMEtBZ0lDQTRBQWhBUXNnQUNBR0VBOGdCVUVRYWlRQUlBRUwrUUVDQkg0QmZ5TUFRU0JySWdna0FBSkFBa0FnQUNBSVFSaHFJQUFnQVJBbElnRVFQQTBBSUFBZ0NFRUlhaUFES1FNQVFnQWdDQ2tER0NJRUlBUVFkQTBBSUFBZ0NFRVFhaUFES1FNSVFnQWdCQ0FFRUhRTkFDQUlJQVEzQXdBQ2ZpQUVJQUpCQTBnTkFCb2dCQ0FES1FNUUlnVkNnSUNBZ0hDRFFvQ0FnSUF3VVEwQUdpQUFJQWdnQlVJQUlBUWdCQkIwRFFFZ0NDa0RBQXNoQmlBQUlBRWdDQ2tEQ0NJRklBZ3BBeEFpQnlBR0lBZDlJZ1lnQkNBRmZTSUVJQVFnQmxVYklnUkJBVUYvUVFFZ0JTQUVJQWQ4VXhzZ0JTQUhWeHNROUFKRkRRRUxJQUFnQVJBUFFvQ0FnSURnQUNFQkN5QUlRU0JxSkFBZ0FRdXlDQUlKZmdOL0l3QkJNR3NpRGlRQVFvQ0FnSUF3SVFVQ1FBSkFJQUFnRGtFZ2FpQUFJQUVRSlNJS0VEd05BQ0FBSUE1QkdHb2dBeWtEQUVJQUlBNHBBeUFpQnlBSEVIUU5BQUpBSUFRRVFBSkFBa0FDUUNBQ0RnSUNBQUVMSUFjZ0Rpa0RHSDBoQ0VFQUlRSU1BUXNnQUNBT1FSQnFJQU1wQXdoQ0FDQUhJQTRwQXhoOVFnQVFkQTBESUFKQkFtc2hBaUFPS1FNUUlRZ0xJQWNnQXExOElBaDlRb0NBZ0lDQWdJQVFVdzBCSUFCQjBOb0FRUUFRRlF3Q0N5QU9JQWMzQXhBZ0J5RUJJQU1wQXdnaUMwS0FnSUNBY0lOQ2dJQ0FnREJTQkg0Z0FDQU9RUkJxSUF0Q0FDQUhJQWNRZEEwQ0lBNHBBeEFGSUFFTElBNHBBeGg5SWdGQ0FDQUJRZ0JWR3lFSVFRQWhBZ3NnQUNBS0lBaENnSUNBZ0FoOFF2Ly8vLzhQV0FSK0lBaEMvLy8vL3crREJVS0FnSUNBd0g0Z0NMbTlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElnVVFxd0loQVNBQUlBVVFEd0pBSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBT0tRTVlJZ3NnQ0h3aENRSkFBa0FnQ2lBT1FReHFJQTVCQ0dvUWlnSkZJQUZDLy8vLy8yOVljZzBBSUFHbklnOHZBUVpCQWtjTkFDQUxJUVVnRHkwQUJVRUljVVVOQVNBT0tBSU1JUThnRGpVQ0NDRU5BMEFnQlNBSldTQUZJQTFaY2cwQ0lBOGdCYWRCQTNScUtRTUFJZ3hDSUlpblFYVlBCRUFnREtjaUVDQVFLQUlBUVFGcU5nSUFDeUFBSUFFZ0JpQU1RWUNBQVJEU0FVRUFTQTBESUFaQ0FYd2hCaUFGUWdGOElRVU1BQXNBQ3lBTElRVUxJQVVnQ1NBRklBbFZHeUVKQTBBZ0JTQUpVZ1JBSUFBZ0NpQUZJQTVCS0dvUWhRRWlEMEVBU0EwQ0lBOEVRQ0FBSUFFZ0JpQU9LUU1vUVlDQUFSRFNBVUVBU0EwREN5QUdRZ0Y4SVFZZ0JVSUJmQ0VGREFFTEN5QUFJQUZCTUNBR1FvQ0FnSUFJV2dSK1FvQ0FnSURBZmlBR3ViMGlCVUtBZ0lDQXdJR0EvUDhBZlNBRlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dVZ0Jnc1FSVUVBU0EwQUlBUUVRQ0FISUFLdElnWjhJQWg5SVFsQ0FDRUZBa0FnQmlBSVVRMEFJQUFnQ2lBR0lBdDhJQWdnQzN3aURDQUhJQXg5UVg5QkFTQUdJQWhWR3hEMEFrRUFTQTBDQTBBZ0J5QUpWdzBCSUFBZ0NpQUhRZ0Y5SWdjUStnRkJBRTROQUFzTUFnc0RRQ0FGSUFaU0JFQWdCYWRCQTNRZ0Eyb3BBeEFpQjBJZ2lLZEJkVThFUUNBSHB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFVZ0Mzd2hDQ0FGUWdGOElRVWdBQ0FLSUFnZ0J4Q0dBVUVBVGcwQkRBTUxDeUFKUW9DQWdJQUlmRUwvLy8vL0QxZ0VmaUFKUXYvLy8vOFBnd1ZDZ0lDQWdNQitJQW01dlNJRlFvQ0FnSURBZ1lEOC93QjlJQVZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeUVHSUFFaEJTQUFJQXBCTUNBR0VFVkJBRWdOQWdzZ0NpRUZEQUlMSUFFaEJRc2dBQ0FLRUE5Q2dJQ0FnT0FBSVFFTElBQWdCUkFQSUE1Qk1Hb2tBQ0FCQytJQ0F3SitCWDhCZkNNQVFTQnJJZ1VrQUFKQUlBSW9BZ1FOQUNBQ0tBSUFJUVlDUUFKQUFuOGdBaWdDQ0FSQUlBQWdBVUVJRUdGRkRRSWdCU0FBS1FNQU53TVFJQVVnQVNrREFEY0RHQ0FHSUFJcEF4QkNnSUNBZ0RCQkFpQUZRUkJxRUNFaUEwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRElBTkMvLy8vL3c5WUJFQWdBNmNpQWtFZmRTQUNRUUJIY2d3Q0N5QUdJQVZCQ0dvZ0F4QnVRUUJJRFFNZ0JTc0RDQ0lLUkFBQUFBQUFBQUFBWkNBS1JBQUFBQUFBQUFBQVkyc01BUXNnQUNnQ0NDSUlSUVJBSUFZZ0FDa0RBQkFvSWdOQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQUlBT25JZ2cyQWdnTElBRW9BZ2dpQ1FSL0lBZ0ZJQVlnQVNrREFCQW9JZ05DZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BeUFCSUFPbklnazJBZ2dnQUNnQ0NBc2dDUkNEQWdzaUJ3MENDeUFBS1FNUUlnTWdBU2tERUNJRVZTQURJQVJUYXlFSERBRUxJQUpCQVRZQ0JBc2dCVUVnYWlRQUlBY0xYUUFDUUNBQlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQUNBQUtBSVFLQUtNQVNnQ0NDQUJwMFlOQUNBQUlBRkJBUkJsRHdzZ0F5a0RBQ0lCUWlDSXB5SUNRUXRxUVJGTElBSkJmbkZCQWtkeVJRUkFJQUFRTkE4TElBQWdBUkFsQzY0RkFnVitCSDhqQUVFd2F5SUxKQUFnQzBJQU53SWNJQXNnQURZQ0dDQUxJQU1wQXdBaUJEY0RLRUtBZ0lDQU1DRUdBa0FDUUFKL0lBUkNnSUNBZ0hDRFFvQ0FnSUF3VWdSQVFRQWhBa0VBSUFBZ0JCQmdEUUVhSUF0QkFUWUNJQXRCQUNFQ0FrQWdBQ0FMUVJCcUlBQWdBUkFsSWdZUVBBUkFEQUVMUWdBaEJBTkFJQXNwQXhBaUNDQUZWUVJBSUFrZ0NrOEVRQ0FBSUFJZ0NpQUtRUUYyYWtFZmFrRndjU0lLUVJoc0lBdEJER29RcUFFaUEwVU5BeUFMS0FJTVFSaHVJQXBxSVFvZ0F5RUNDMEVBSUFBZ0JpQUZJQUlnQ1VFWWJHb2lEQkNGQVNJRFFRQklEUU1hQWtBZ0EwVU5BQ0FNTlFJRVFpQ0dRb0NBZ0lBd1VRUkFJQVJDQVh3aEJBd0JDeUFNSUFVM0F4QWdERUVBTmdJSUlBbEJBV29oQ1FzZ0JVSUJmQ0VGREFFTEN5QUNJQWxCR0VIV0FDQUxRUmhxRUw0Q1FRQWdDeWdDSEEwQkdpQUVJQW10SWdGOElBUkNQNGNnQklOOUlRUkNBQ0VGQTBBQ1FDQUJJQVZTQkVBZ0FpQUZweUlLUVJoc2FpSURLQUlJSWd3RVFDQUFJQXl0UW9DQWdJQ1FmNFFRRHdzZ0F5a0RBQ0VISUFVZ0F5a0RFRkVFUUNBQUlBY1FEd3dDQ3lBQUlBWWdCU0FIRUlZQlFRQk9EUUVnQ2tFQmFnd0VDeUFBS0FJUUlnTkJFR29nQWlBREtBSUVFUUFBQTBBZ0FTQUVVUVJBQTBBZ0JDQUlXUTBJSUFBZ0JpQUVFUG9CSVFJZ0JFSUJmQ0VFSUFKQkFFNE5BQXdIQ3dBTElBQWdCaUFCUW9DQWdJQXdFSVlCSVFJZ0FVSUJmQ0VCSUFKQkFFNE5BQXNNQkFzZ0JVSUJmQ0VGREFBTEFBdEJBQXNoQXlBSklBTWdBeUFKU1JzaENRTkFJQU1nQ1VjRVFDQUFJQUlnQTBFWWJHb2lDaWtEQUJBUElBb29BZ2dpQ2dSQUlBQWdDcTFDZ0lDQWdKQi9oQkFQQ3lBRFFRRnFJUU1NQVFzTElBQW9BaEFpQTBFUWFpQUNJQU1vQWdRUkFBQUxJQUFnQmhBUFFvQ0FnSURnQUNFR0N5QUxRVEJxSkFBZ0JndXdBd0lEZmdKL0l3QkJNR3NpQWlRQVFvQ0FnSUF3SVFZZ0FrS0FnSUNBTURjREtBSkFBa0FnQUNBQ1FSQnFJQUFnQVJBbElnRVFQQTBBQWtBZ0FTQUNRUnhxSUFKQkRHb1FpZ0pGQkVBZ0Fpa0RFQ0VGREFFTElBSXBBeEFpQlNBQ0tBSU1JZ090VWcwQUlBTkJBa2tOQWtFQUlRQWdBaWdDSENFSEEwQWdBQ0FEUVFGcklnTlBEUU1nQnlBQVFRTjBhaUlJS1FNQUlRUWdDQ0FISUFOQkEzUnFJZ2dwQXdBM0F3QWdDQ0FFTndNQUlBQkJBV29oQUF3QUN3QUxBMEFnQkNBRlFnRjlJZ1ZaRFFJQ1FBSkFJQUFnQVNBRUlBSkJLR29RaFFFaUEwRUFTQTBBSUFBZ0FTQUZJQUpCSUdvUWhRRWlCMEVBU0EwQUFrQWdCd1JBSUFBZ0FTQUVJQUlwQXlBUWhnRkJBRWdOQWlBRFJRMEJJQUFnQVNBRklBSXBBeWdRaGdGQkFFZ05CU0FDUW9DQWdJQXdOd01vREFNTElBTkZEUUlnQUNBQklBUVErZ0ZCQUVnTkFTQUFJQUVnQlNBQ0tRTW9FSVlCUVFCSURRUWdBa0tBZ0lDQU1EY0RLQXdDQ3lBQUlBRWdCUkQ2QVVFQVRnMEJDeUFDS1FNb0lRWU1BZ3NnQkVJQmZDRUVEQUFMQUFzZ0FDQUdFQThnQUNBQkVBOUNnSUNBZ09BQUlRRUxJQUpCTUdva0FDQUJDNFVCQVFGK1FvQ0FnSURnQUNFRUlBQWdBUkFsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRklFUUFKK1FvQ0FnSURnQUNBQUlBRkIyd0FnQVVFQUVCUWlCRUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFHaUFBSUFRUU9FVUVRQ0FBSUFRUUR5QUFJQUVnQUNBQUVMQUdEQUVMSUFBZ0JDQUJRUUJCQUJBdkN5RUVJQUFnQVJBUEN5QUVDNkVEQWdKL0JYNGpBRUVnYXlJRkpBQUNmZ0pBSUFBZ0JTQUFJQUVRSlNJSkVEd05BRUVzSVFZQ1FDQUNRUUJNSUFSeVJRUkFRb0NBZ0lBd0lRZEJBQ0VDSUFNcEF3QWlBVUtBZ0lDQWNJTkNnSUNBZ0RCUkRRRWdBQ0FCRUNnaUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ1FYOGhCaUFIcHlJQ0tBSUVRUUZIRFFFZ0FpMEFFQ0VHREFFTFFvQ0FnSUF3SVFkQkFDRUNDeUFBSUFWQkNHcEJBQkE5R2tJQUlRRWdCU2tEQUNJSVFnQWdDRUlBVlJzaEN3SkFBMEFnQVNBTFVnUkFBa0FnQVZBTkFDQUdRUUJPQkVBZ0JVRUlhaUFHRURzYURBRUxJQVZCQ0dvZ0FrRUFJQUlvQWdSQi8vLy8vd2R4RUZFYUN5QUFJQWtnQWFjUXNBRWlDRUtBZ0lDQWNJTWlDa0tBZ0lDQUlGRWdDa0tBZ0lDQU1GRnlSUVJBSUFwQ2dJQ0FnT0FBVVEwRElBVkJDR29nQkFSK0lBQWdDQkQrQkFVZ0NBc1FmdzBEQ3lBQlFnRjhJUUVNQVFzTElBQWdCeEFQSUFBZ0NSQVBJQVZCQ0dvUU5nd0NDeUFGS0FJSUtBSVFJZ0pCRUdvZ0JTZ0NEQ0FDS0FJRUVRQUFJQUFnQnhBUEN5QUFJQWtRRDBLQWdJQ0E0QUFMSVFFZ0JVRWdhaVFBSUFFTHhRSUNBWDhEZmlNQVFTQnJJZ1FrQUFKK0FrQUNRQ0FBSUFSQkVHb2dBQ0FCRUNVaUJ4QThEUUJDZnlFR0lBUXBBeEFpQlVJQVZ3MEJJQVFnQlVJQmZTSUJOd01JSUFKQkFrNEVRQ0FBSUFSQkNHb2dBeWtEQ0VKL0lBRWdCUkIwRFFFZ0JDa0RDQ0VCQ3dOQUlBRkNBRk1OQWlBQUlBY2dBU0FFUVJocUVJVUJJZ0pCQUVnTkFRSkFJQUpGRFFBZ0F5a0RBQ0lGUWlDSXAwRjFUd1JBSUFXbklnSWdBaWdDQUVFQmFqWUNBQXNnQUNBRklBUXBBeGhCQUJDOEFVVU5BQ0FCSVFZTUF3c2dBVUlCZlNFQkRBQUxBQXNnQUNBSEVBOUNnSUNBZ09BQURBRUxJQUFnQnhBUElBWkMvLy8vL3crRElBWkNnSUNBZ0FoOFF2Ly8vLzhQV0EwQUdrS0FnSUNBd0g0Z0JybTlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElRRWdCRUVnYWlRQUlBRUw1UU1DQW44R2ZpTUFRU0JySWdRa0FBSitBa0FnQUNBRVFSQnFJQUFnQVJBbElnZ1FQQTBBUW44aENRSkFJQVFwQXhBaUJrSUFWdzBBSUFSQ0FEY0RDQ0FDUVFKT0JFQWdBQ0FFUVFocUlBTXBBd2hDQUNBR0lBWVFkQTBDQ3dKQUFrQWdDQ0FFUVFScUlBUVFpZ0pGQkVBZ0JDa0RDQ0VCREFFTElBUXBBd2dpQVNBRU5RSUFJZ2NnQVNBSFZSc2hDeUFFS0FJRUlRSURRQ0FCSUF0UkRRRWdBeWtEQUNJSFFpQ0lwMEYxVHdSQUlBZW5JZ1VnQlNnQ0FFRUJhallDQUFzZ0FpQUJwMEVEZEdvcEF3QWlDa0lnaUtkQmRVOEVRQ0FLcHlJRklBVW9BZ0JCQVdvMkFnQUxJQUFnQnlBS1FRQVF2QUVOQWlBQlFnRjhJUUVNQUFzQUN5QUJJQVlnQVNBR1ZSc2hCd05BSUFFZ0IxRU5BaUFBSUFnZ0FTQUVRUmhxRUlVQklnSkJBRWdOQXlBQ0JFQWdBeWtEQUNJR1FpQ0lwMEYxVHdSQUlBYW5JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUdJQVFwQXhoQkFCQzhBUTBDQ3lBQlFnRjhJUUVNQUFzQUN5QUJJUWtMSUFBZ0NCQVBJQWxDLy8vLy93K0RJQWxDZ0lDQWdBaDhRdi8vLy84UFdBMEJHa0tBZ0lDQXdINGdDYm05SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc01BUXNnQUNBSUVBOUNnSUNBZ09BQUN5RUJJQVJCSUdva0FDQUJDNjREQWdoK0FYOGpBRUV3YXlJTkpBQkNnSUNBZ0RBaEJnSkFBa0FnQUNBTlFRaHFJQUFnQVJBbElnY1FQQVJBUW9DQWdJQXdJUVVNQVF0Q2dJQ0FnREFoQlNBQUlBTXBBd0FpQ2hCZ0RRQkNnSUNBZ0RBaENTQUNRUUpPQkVBZ0F5a0RDQ0VKQ3lBTktRTUlJZ1ZDQUNBRlFnQlZHeUVMQTBBZ0NDQUxVZ1JBSUFnaUJVS0FnSUNBQ0ZvRVFFS0FnSUNBd0g0Z0NMbTlJZ1ZDZ0lDQWdNQ0JnUHovQUgwZ0JVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzaEJRc2dCVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQUFnQnlBRkVFMGlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQTBnQVRjRElDQU5JQVUzQXhnZ0RTQUdOd01RSUFBZ0NpQUpRUU1nRFVFUWFoQWhJZ3hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BaUFBSUF3UUpnUkFJQVFFUUNBQUlBWVFEeUFBSUFjUUR3d0ZDeUFBSUFVUUR5QUFJQWNRRHlBR0lRVU1CQVVnQUNBR0VBOGdBQ0FGRUE4Z0NFSUJmQ0VJREFJTEFBc0xJQUFnQnhBUFF2Ly8vLzhQUW9DQWdJQXdJQVFiSVFVTUFRc2dBQ0FGRUE4Z0FDQUdFQThnQUNBSEVBOUNnSUNBZ09BQUlRVUxJQTFCTUdva0FDQUZDNklDQWdOK0FYOGpBRUVnYXlJSEpBQUNRQUpBSUFBZ0IwRVlhaUFBSUFFUUpTSUZFRHdOQUNBSFFnQTNBeEFDUUNBQ1FRRk1CRUFnQnlrREdDRUVEQUVMSUFjcEF4Z2hCQ0FES1FNSUlnRkNnSUNBZ0hDRFFvQ0FnSUF3VWdSQUlBQWdCMEVRYWlBQlFnQWdCQ0FFRUhRTkFnc2dCeUFFTndNSUlBSkJBMGtOQUNBREtRTVFJZ0ZDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFJQUFnQjBFSWFpQUJRZ0FnQkNBRUVIUU5BU0FIS1FNSUlRUUxJQVFnQnlrREVDSUJJQUVnQkZNYklRWURRQ0FCSUFaUkRRSWdBeWtEQUNJRVFpQ0lwMEYxVHdSQUlBU25JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUZJQUVnQkJDR0FVRUFTQTBCSUFGQ0FYd2hBUXdBQ3dBTElBQWdCUkFQUW9DQWdJRGdBQ0VGQ3lBSFFTQnFKQUFnQlF1dUJBSUZmZ04vSXdCQkVHc2lDU1FBUW9DQWdJQXdJUVlDUUFKQUlBQWdBUkFsSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBaENBQkNyQWlJR1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFCQmZ5RUtRWDhnQWlBQ1FRQklHeUVMQWtBRFFDQUtJQXRIQkVBZ0NDRUZJQXBCQUU0RVFDQURJQXBCQTNScUtRTUFJUVVMQWtBQ1FDQUZRb0NBZ0lCd1ZBMEFBbjhnQUNBRlFkZ0JJQVZCQUJBVUlnRkNnSUNBZ0hDRElnZENnSUNBZ0RCU0JFQWdCMEtBZ0lDQTRBQlJEUWNnQUNBQkVDWU1BUXNnQUNBRkVNb0JDeUlDUVFCSURRVWdBa1VOQUNBQUlBa2dCUkE4RFFVZ0NTa0RBQ0lISUFSOFF2Ly8vLy8vLy84UFZRMEVRZ0FoQVNBSFFnQWdCMElBVlJzaEJ3TkFJQUVnQjFFTkFpQUFJQVVnQVNBSlFRaHFFSVVCSWdKQkFFZ05CaUFDQkVBZ0FDQUdJQVFnQ1NrRENCQnFRUUJJRFFjTElBUkNBWHdoQkNBQlFnRjhJUUVNQUFzQUN5QUVRdjcvLy8vLy8vOFBWUTBESUFWQ0lJaW5RWFZQQkVBZ0JhY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQUlBWWdCQ0FGRUdwQkFFZ05CQ0FFUWdGOElRUUxJQXBCQVdvaENnd0JDd3NnQUNBR1FUQWdCRUtBZ0lDQUNIeEMvLy8vL3c5WUJINGdCRUwvLy8vL0Q0TUZRb0NBZ0lEQWZpQUV1YjBpQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c1FSVUVBU0EwQkRBSUxJQUJCME5vQVFRQVFGUXNnQUNBR0VBOUNnSUNBZ09BQUlRWUxJQUFnQ0JBUElBbEJFR29rQUNBR0M3RUNBZ1IrQW44akFFRVFheUlJSkFCQ2dJQ0FnT0FBSVFVQ1FBSitBa0FnQVVLQWdJQ0FjRlFOQUNBQnB5MEFCVUVRY1VVTkFDQUlJQUt0TndNSUlBQWdBVUVCSUFoQkNHb1Fwd0VNQVFzZ0FCQStDeUlFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQWtFQUlBSkJBRW9iclNFSFFnQWhBUUpBQTBBZ0FTQUhVZ1JBSUFNZ0FhZEJBM1JxS1FNQUlnWkNJSWluUVhWUEJFQWdCcWNpQ1NBSktBSUFRUUZxTmdJQUN5QUFJQVFnQVNBR1FZQ0FBUkRTQVNFSklBRkNBWHdoQVNBSlFRQk9EUUVNQWdzTElBQWdCRUV3SUFKQkFFNEVmaUFDclFWQ2dJQ0FnTUIrSUFLNHZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCRlFRQklEUUFnQkNFRkRBRUxJQUFnQkJBUEN5QUlRUkJxSkFBZ0JRdTZDUUlDZndoK0l3QkJNR3NpQkNRQUlBTXBBd0FoQmlBRVFvQ0FnSUF3TndNWVFRRWhCUUpBQWtBQ2ZpQUNRUUpJQkVCQ2dJQ0FnREFoREVLQWdJQ0FNQXdCQzBLQWdJQ0FNQ0FES1FNSUlneENnSUNBZ0hDRFFvQ0FnSUF3VVEwQUdrS0FnSUNBTUNFS1FvQ0FnSUF3SVFsQ2dJQ0FnREFoQ0VLQWdJQ0FNQ0VMSUFBZ0RCQmdEUUZCQUNFRlFvQ0FnSUF3SUFKQkEwa05BQm9nQXlrREVBc2hEUUpBQWtBQ1FBSkFJQUFnQmtIUkFTQUdRUUFRRkNJSFFvQ0FnSUJ3Z3lJSVFvQ0FnSUF3VWdSQUFrQUNRQ0FJUW9DQWdJRGdBRkVFUUVLQWdJQ0FNQ0VLUW9DQWdJQXdJUWxDZ0lDQWdEQWhDQXdCQ3lBQUlBY1FEd0orQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweTBBQlVFUWNVVU5BQ0FBSUFGQkFFRUFFS2NCREFFTElBQVFQZ3NpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBUW9DQWdJQXdJUXBDZ0lDQWdEQWhDUXdCQ3lBR1FpQ0lwMEYxVHdSQUlBYW5JZ0lnQWlnQ0FFRUJhallDQUFzZ0JDQUdOd01RSUFBZ0JFRVFha0VJY2tFQUVKa0RJUUlnQkNrREdDRUtJQVFwQXhBaENTQUNSUTBCQzBLQWdJQ0FNQ0VMREFZTFFnQWhCd05BSUFBZ0NTQUtJQVJCQ0dvUXJnRWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQVFvQWdnRVFFS0FnSUNBTUNFTERBWUxBa0FnQlFSQUlBWWhBUXdCQ3lBRUlBWTNBeUFnQkNBSFF2Ly8vLzhQZ3pjREtDQUFJQXdnRFVFQ0lBUkJJR29RSVNFQklBQWdCaEFQSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXdzZ0FDQUlJQWNnQVJCcVFRQklEUUlnQjBJQmZDRUhEQUFMQUFzZ0FDQUdFQ1VpQzBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBZ0JFRUlhaUFMRUR4QkFFZ05BaUFFQW40Z0JDa0RDQ0lHUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FHUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQnJtOUlnZENnSUNBZ01DQmdQei9BSDBnQjBMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMSWdjM0F5QUNmZ0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY3RBQVZCRUhGRkRRQWdBQ0FCUVFFZ0JFRWdhaENuQVF3QkN5QUFRb0NBZ0lBd1FRRWdCRUVnYWhDdUF3c2hDQ0FBSUFjUUR5QUlRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQkNnSUNBZ0RBaENnd0NDMElBSVFjZ0JrSUFJQVpDQUZVYklRa0RRQ0FISUFsUkJFQkNnSUNBZ0RBaENrS0FnSUNBTUNFSkRBVUxRb0NBZ0lBd0lRb2dBQ0FMSUFjUWN5SUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSUNRQ0FGQkVBZ0JpRUJEQUVMSUFRZ0JqY0RJQ0FFSUFkQy8vLy8vdytETndNb0lBQWdEQ0FOUVFJZ0JFRWdhaEFoSVFFZ0FDQUdFQThnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBEQ3lBQUlBZ2dCeUFCRUdwQkFFZ05BaUFIUWdGOElRY01BQXNBQzBLQWdJQ0FNQ0VMSUFsQ2dJQ0FnSENEUW9DQWdJQXdVUTBESUFBZ0NVRUJFSzBCR2d3REMwS0FnSUNBTUNFSkRBSUxRb0NBZ0lBd0lRcENnSUNBZ0RBaENVS0FnSUNBTUNFSURBRUxJQUFnQ0VFd0lBZW5JZ0pCQUU0RWZpQUhRdi8vLy84UGd3VkNnSUNBZ01CK0lBSzR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkZRUUJPRFFFTElBQWdDQkFQUW9DQWdJRGdBQ0VJQ3lBQUlBc1FEeUFBSUFrUUR5QUFJQW9RRHlBRVFUQnFKQUFnQ0FzbUFFS0FnSUNBNEFBZ0FDQURLUU1BRU1vQklnQkJBRWV0UW9DQWdJQVFoQ0FBUVFCSUd3dUFBUUFqQUVFUWF5SUFKQUFnQUJDakJBSitJQUEwQWdnZ0FDa0RBRUxBaEQxK2ZDSUJRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUJRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBYm05SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xJUUVnQUVFUWFpUUFJQUVMeHdJQkJYOGpBRUVnYXlJRUpBQWdBQ0FES1FNQUVDZ2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQUFnQkVFSWFrRUFFRDBhSUFHbklnVkJFR29oQmlBRktBSUVRZi8vLy84SGNTRUhRUUFoQXdOQUlBTWdCMDVGQkVBQ1FBSi9JQVVwQWdSQ2dJQ0FnQWlEVUNJSVJRUkFJQVlnQTBFQmRHb3ZBUUFNQVFzZ0F5QUdhaTBBQUFzaUFrRWxSdzBBQWtBZ0EwRUdhaUFIU2cwQUlBTkJBV29oQWdKL0lBaEZCRUFnQmlBQ1FRRjBhaThCQUF3QkN5QUNJQVpxTFFBQUMwSDFBRWNOQUNBRklBTkJBbXBCQkJDNEJDSUNRUUJJRFFBZ0EwRUZhaUVEREFFTFFTVWhBaUFEUVFOcUlBZEtEUUFnQlNBRFFRRnFRUUlRdUFRaUFrRWxJQUpCQUU0aUNCc2hBaUFEUVFKcUlBTWdDQnNoQXdzZ0JFRUlhaUFDRUlzQkdpQURRUUZxSVFNTUFRc0xJQUFnQVJBUElBUkJDR29RTmlFQkN5QUVRU0JxSkFBZ0FRdmtBUUVFZnlNQVFTQnJJZ0lrQUNBQUlBTXBBd0FRS0NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0FDQUNRUWhxSUFHbklnVW9BZ1JCLy8vLy93ZHhFRDBhSUFWQkVHb2hCaUFGS0FJRVFmLy8vLzhIY1NFSFFRQWhBd05BSUFNZ0IwWkZCRUFDUUFKQUFrQWdCUzBBQjBHQUFYRkZCRUFnQXlBR2FpMEFBQ0VFREFFTElBWWdBMEVCZEdvdkFRQWlCRUgvQVVzTkFRdEJrT0VCSUFSQnhRQVErd0ZGRFFBZ0FrRUlhaUFFRUlzQkdnd0JDeUFDUVFocUlBUVFtZ0lMSUFOQkFXb2hBd3dCQ3dzZ0FDQUJFQThnQWtFSWFoQTJJUUVMSUFKQklHb2tBQ0FCQzg0RUFnWi9BWDRqQUVFZ2F5SUdKQUFDUUNBQUlBTXBBd0FRS0NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUdRUWhxSUFHbklna29BZ1JCLy8vLy93ZHhFRDBhSUFsQkVHb2hDRUVBSVFJQ1FBTkFJQWtwQWdRaUM2ZEIvLy8vL3dkeElnb2dBa29FUUNBQ1FRRnFJUVVDUUFKQUlBdENnSUNBZ0FpRElndFFCRUFnQWlBSWFpMEFBQ0VEREFFTElBZ2dBa0VCZEdvdkFRQWlBMEgvQVVzTkFRc0NRQ0FEUVRCclFRcEpJQU5CMy84RGNVSEJBR3RCR2tseURRQkJwWlFCSUFOQkNSRDdBUTBBSUFRTkFTQURFTElHUlEwQkN5QUdRUWhxSUFNUWl3RWFJQVVoQWd3Q0N3Si9BbjhDUUNBRFFZRDRBM0VpQjBHQXNBTkhCRUFnQjBHQXVBTkhEUUZCdjhNQUlRY01CZ3RCNU1BQUlRY2dCU0FLVGcwRkFuOGdDMUJGQkVBZ0NDQUZRUUYwYWk4QkFBd0JDeUFGSUFocUxRQUFDeUlGUVlEQUEydEJnSGhKRFFVZ0JrRUlhaUFGUWY4SGNTQURRUXAwUVlENFAzRnlRWUNBQkdvaUEwRVNka0h3QVhJUW1nSWdBMEVNZGtFL2NVR0FBWEloQnlBQ1FRSnFEQUVMSUFOQi93Qk5CRUFnQmtFSWFpQURFSm9DSUFVaEFnd0VDeUFEUWY4UFRRUkFJQVVoQWlBRFFRWjJRY0FCY2d3Q0N5QURRUXgyUWVBQmNpRUhJQVVMSVFJZ0JrRUlhaUFIRUpvQ0lBTkJCblpCUDNGQmdBRnlDeUVISUFaQkNHb2lCU0FIRUpvQ0lBVWdBMEUvY1VHQUFYSVFtZ0lNQVFzTElBQWdBUkFQSUFaQkNHb1FOaUVCREFFTElBQWdCeEM1QkNBQUlBRVFEeUFHS0FJSUtBSVFJZ0JCRUdvZ0JpZ0NEQ0FBS0FJRUVRQUFRb0NBZ0lEZ0FDRUJDeUFHUVNCcUpBQWdBUXVWQkFJR2Z3RitJd0JCSUdzaUJTUUFBa0FnQUNBREtRTUFFQ2dpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0JVRUlha0VBRUQwYUlBR25JZ2hCRUdvaENVRUFJUUlEUUFKQUFrQUNRQ0FJS1FJRUlndW5RZi8vLy84SGNTQUNTZ1JBQW44Z0MwS0FnSUNBQ0lOUVJRUkFJQWtnQWtFQmRHb3ZBUUFNQVFzZ0FpQUphaTBBQUFzaUEwRWxSZ1JBSUFBZ0NDQUNFTE1HSWdOQkFFZ05BeUFDUVFOcUlRWWdBMEgvQUUwRVFDQUVCRUFnQmlFQ0RBWUxRU1VnQXlBREVMSUdJZ2NiSVFNZ0FrRUJhaUFHSUFjYklRSU1CUXNDZnlBRFFXQnhRY0FCUmdSQUlBTkJIM0VoQTBHQUFTRUhRUUVNQVFzZ0EwRndjVUhnQVVZRVFDQURRUTl4SVFOQmdCQWhCMEVDREFFTElBTkJlSEZCOEFGSEJFQkJBU0VIUVFBaEEwRUFEQUVMSUFOQkIzRWhBMEdBZ0FRaEIwRURDeUVDQTBBZ0FrRUFUQTBESUFBZ0NDQUdFTE1HSWdwQkFFZ05CQ0FHUVFOcUlRWWdDa0hBQVhGQmdBRkhCRUJCQUNFRERBUUZJQUpCQVdzaEFpQUtRVDl4SUFOQkJuUnlJUU1NQVFzQUN3QUxJQUpCQVdvaEFnd0RDeUFBSUFFUUR5QUZRUWhxRURZaEFRd0VDeUFHSVFJZ0F5QUhTQ0FEUWYvL3d3Qktja1VnQTBHQWNIRkJnTEFEUjNFTkFTQUFRY21KQVJDNUJBc2dBQ0FCRUE4Z0JTZ0NDQ2dDRUNJQVFSQnFJQVVvQWd3Z0FDZ0NCQkVBQUVLQWdJQ0E0QUFoQVF3Q0N5QUZRUWhxSUFNUXVRRWFEQUFMQUFzZ0JVRWdhaVFBSUFFTE53QWdBQ0FES1FNQUVMTUJJZ0pGQkVCQ2dJQ0FnT0FBRHdzZ0FDQUNFSUVDSUFKcVFRQkJDa0VBRUxnQ0lRRWdBQ0FDRUZRZ0FRdUhBUUVCZnlNQVFSQnJJZ0lrQUFKQUlBQWdBeWtEQUJDekFTSUVSUVJBUW9DQWdJRGdBQ0VCREFFTEFuNUNnSUNBZ09BQUlBQWdBa0VNYWlBREtRTUlFSGNOQUJvZ0FpZ0NEQ0lEQkVCQ2dJQ0FnTUIrSUFOQkpXdEJYVWtOQVJvTElBQWdCQkNCQWlBRWFrRUFJQU5CZ1FnUXVBSUxJUUVnQUNBRUVGUUxJQUpCRUdva0FDQUJDd2tBSUFBZ0FSRGRBZ3VqQVFJQmZnRi9Jd0JCRUdzaUFpUUFBbjRnQUNBQkVOMENJZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FGREFFTFFRb2hCZ0pBQWtBZ0JBMEFJQU1wQXdBaUFVS0FnSUNBY0lOQ2dJQ0FnREJSRFFBZ0FDQUJFSTRGSWdaQkFFZ05BUXRDZ0lDQWdPQUFJQUFnQWtFSWFpQUZFRzROQVJvZ0FDQUNLd01JSUFaQkFFRUFFSThDREFFTElBQWdCUkFQUW9DQWdJRGdBQXNoQVNBQ1FSQnFKQUFnQVF1TUFnSUJmZ0Y4SXdCQkVHc2lBaVFBUW9DQWdJRGdBQ0VFQWtBZ0FDQUJFTjBDSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRUU1BUXNnQUNBQ0lBRVFiZzBBQWtBQ1FDQURLUU1BSWdGQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFJcEF3QWhBUXdCQ3lBQUlBSkJER29nQVJDNkFRMENJQUlyQXdBaUJiMGlBVUtBZ0lDQWdJQ0ErUDhBZzBLQWdJQ0FnSUNBK1A4QVVnMEJDeUFBUW9DQWdJREFmaUFCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkVEY2hCQXdCQ3lBQ0tBSU1JZ05CNVFCclFadC9UUVJBSUFCQmlqUkJBQkJRREFFTElBQWdCVUVLSUFOQkFSQ1BBaUVFQ3lBQ1FSQnFKQUFnQkF2WUFRSUJmZ0Y4SXdCQkVHc2lBaVFBUW9DQWdJRGdBQ0VFQWtBZ0FDQUJFTjBDSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRUU1BUXNnQUNBQ0lBRVFiZzBBSUFBZ0FrRU1haUFES1FNQUVMb0JEUUFnQWlnQ0RDSURRZVVBVHdSQUlBQkJpalJCQUJCUURBRUxJQUlyQXdBaUJabEVVTy9pMXVRYVMwUm1CRUFnQUVLQWdJQ0F3SDRnQmIwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeEEzSVFRTUFRc2dBQ0FGUVFvZ0EwRUNFSThDSVFRTElBSkJFR29rQUNBRUN6MEFBbjRDUUNBQkVLTURJZ0pGRFFBZ0FpMEFFRUVCY1EwQVFvQ0FnSUF3SUFJdEFCRkJBWEVOQVJvTElBQkJzalJCQUJBVlFvQ0FnSURnQUFzTHpRTURCWHdCZmdOL0FrQUNRQUpBQWtBZ0FMMGlCa0lBV1FSQUlBWkNJSWluSWdkQi8vOC9TdzBCQ3lBR1F2Ly8vLy8vLy8vLy93Q0RVQVJBUkFBQUFBQUFBUEMvSUFBZ0FLS2pEd3NnQmtJQVdRMEJJQUFnQUtGRUFBQUFBQUFBQUFDakR3c2dCMEgvLzcvL0Iwc05Ba0dBZ01EL0F5RUlRWUY0SVFrZ0IwR0FnTUQvQTBjRVFDQUhJUWdNQWdzZ0JxY05BVVFBQUFBQUFBQUFBQThMSUFCRUFBQUFBQUFBVUVPaXZTSUdRaUNJcHlFSVFjdDNJUWtMSUFaQy8vLy8vdytESUFoQjRyNGxhaUlIUWYvL1AzRkJuc0dhL3dOcXJVSWdob1MvUkFBQUFBQUFBUEMvb0NJQUlBQWdBRVFBQUFBQUFBRGdQNktpSWdPaHZVS0FnSUNBY0lPL0lnUkVBQUFnWlVjVjl6K2lJZ0VnQ1NBSFFSUjJhcmNpQXFBaUJTQUJJQUlnQmFHZ0lBQWdBRVFBQUFBQUFBQUFRS0NqSWdFZ0F5QUJJQUdpSWdJZ0FxSWlBU0FCSUFGRW44WjQwQW1hd3oraVJLOTRqaDNGY2N3L29LSkVCUHFYbVptWjJUK2dvaUFDSUFFZ0FTQUJSRVJTUHQ4UzhjSS9va1RlQTh1V1pFYkhQNkNpUkZtVElwUWtTZEkvb0tKRWsxVlZWVlZWNVQrZ29xQ2dvaUFBSUFTaElBT2hvQ0lBSUFTZ1JBQ2k3eTc4QmVjOW9pQUFSQUFBSUdWSEZmYy9vcUNnb0NFQUN5QUFDd3ZsdWdSbEFFR0FDQXR3L29JclpVY1ZaMEFBQUFBQUFBQTRRd0FBK3Y1Q0xuYS9PanVldkpyM0RMMjkvZi8vLy8vZlB6eFVWVlZWVmNVL2tTc1h6MVZWcFQ4WDBLUm5FUkdCUHdBQUFBQUFBTWhDN3puNi9rSXU1ajhreElML3ZiL09QN1gwRE5jSWE2dy96RkJHMHF1eWd6K0VPazZiNE5kVlB3QkIvZ2dMa2hEd1AyNi9pQnBQTzVzOE5UUDdxVDMyN3o5ZDNOaWNFMkJ4dkdHQWR6NmE3TzgvMFdhSEVIcGVrTHlGZjI3b0ZlUHZQeFAyWnpWUzBvdzhkSVVWMDdEWjd6LzZqdmtqZ002THZONzIzU2xyME84L1ljam1ZVTczWUR6SW0zVVlSY2Z2UDVuVE0xdmtvNUE4Zy9QR3lqNis3ejl0ZTROZHBwcVhQQStKK1d4WXRlOC8vTy85a2hxMWpqejNSM0lya3F6dlA5R2NMM0E5dmo0OG90SFRNdXlqN3o4TGJwQ0pOQU5xdkJ2VC9xOW1tKzgvRHIwdktsSldsYnhSV3hMUUFaUHZQMVhxVG96dmdGQzh6REZzd0wySzd6OFc5Tlc1SThtUnZPQXRxYTZhZ3U4L3IxVmM2ZVBUZ0R4UmpxWEltSHJ2UDBpVHBlb1ZHNEM4ZTFGOVBMaHk3ejg5TXQ1VjhCK1B2T3FOakRqNWF1OC92MU1UUDR5Sml6eDF5Mi9yVzJQdlB5YnJFWGFjMlphODFGd0VoT0JiN3o5Z0x6bys5K3lhUEtxNWFER0hWTzgvblRpR3k0TG5qN3dkMmZ3aVVFM3ZQNDNEcGtSQmI0bzgxb3hpaUR0Rzd6OTlCT1N3QlhxQVBKYmNmWkZKUCs4L2xLaW80LzJPbGp3NFluVnVlamp2UDMxSWRQSVlYb2M4UDZheVQ4NHg3ei95NXgrWUswZUFQTjE4NG1WRksrOC9YZ2h4UDN1NGxyeUJZL1hoM3lUdlB6R3JDVzNoOTRJODRkNGY5WjBlN3ovNnYyOGFteUU5dkpEWjJ0Qi9HTzgvdEFvTWNvSTNpendMQStTbWhSTHZQNC9Mem9tU0ZHNDhWaTgrcWE4TTd6KzJxN0JOZFUyRFBCVzNNUXIrQnU4L1RIU3M0Z0ZDaGp3eDJFejhjQUh2UDByNDAxMDUzWTg4L3haa3Nnajg3ajhFVzQ0N2dLT0d2UEdma2wvRjl1NC9hRkJMek8xS2tyekxxVG8zcC9IdVA0NHRVUnY0QjVtOFp0Z0ZiYTdzN2ovU05wUSs2TkZ4dlBlZjVUVGI1KzQvRlJ2T3N4a1ptYnpscUJQRExlUHVQMjFNS3FkSW40VThJalFTVEtiZTdqK0thU2g2WUJLVHZCeUFyQVJGMnU0L1c0a1hTSStuV0x3cUx2Y2hDdGJ1UHh1YVNXZWJMSHk4bDZoUTJmWFI3ajhSck1KZzdXTkRQQzJKWVdBSXp1NC83MlFHT3dsbWxqeFhBQjN0UWNydVAza0RvZHJoekc0ODBEekJ0YUxHN2o4d0VnOC9qditUUE43VDEvQXF3KzQvc0s5NnU4NlFkanduS2piVjJyL3VQM2ZnVk91OUhaTThEZDM5bWJLODdqK09vM0VBTkpTUHZLY3NuWGF5dWU0L1NhT1QzTXplaDd4Q1pzK2kycmJ1UDE4NEQ3M0czbmk4Z2srZFZpdTA3ai8yWEh2c1JoS0d2QStTWGNxa3NlNC9qdGY5R0FVMWt6emFKN1UyUjYvdVB3V2JpaSszbUhzOC9jZVgxQkt0N2o4SlZCemk0V09RUENsVVNOMEhxKzQvNnNZWlVJWEhORHkzUmxtS0pxbnVQelhBWkN2bU1wUThTQ0d0RlcrbjdqK2ZkcGxoU3VTTXZBbmNkcm5ocGU0L3FFM3ZPOFV6akx5RlZUcXdmcVR1UDY3cEs0bDRVNFM4SU1QTU5FYWo3ajlZV0ZaNDNjNlR2Q1VpVllJNG91NC9aQmwrZ0tvUVZ6eHpxVXpVVmFIdVB5Z2lYci92czVPOHpUdC9acDZnN2orQ3VUU0hyUkpxdkwvYUMzVVNvTzQvN3FsdHVPOW5ZN3d2R21VOHNwL3VQMUdJNEZROTNJQzhoSlJSK1gyZjdqL1BQbHArWkI5NHZIUmY3T2gxbis0L3NIMkx3RXJ1aHJ4MGdhVkltcC91UDRybVZSNHlHWWE4eVdkQ1Z1dWY3ai9UMUFsZXk1eVFQRDlkM2s5cG9PNC9IYVZOdWR3eWU3eUhBZXR6RktIdVAydkFaMVQ5N0pROE1zRXdBZTJoN2o5VmJOYXI0ZXRsUEdKT3p6YnpvdTQvUXMrekw4V2hpTHdTR2o1VUo2VHVQelEzTy9HMmFaTzhFODVNbVltbDdqOGUveGs2aEY2QXZLM0hJMFlhcCs0L2JsZHkyRkRVbEx6dGtrU2IyYWp1UHdDS0RsdG5yWkE4bVdhSzJjZXE3aiswNnZEQkw3ZU5QTnVnS2tMbHJPNC8vK2ZGbkdDMlpieU1STFVXTXEvdVAwUmY4MW1EOW5zOE5uY1ZtYTZ4N2orRFBSNm5Id21Udk1iL2tRdGJ0TzQvS1I1c2k3aXBYYnpseGMyd043ZnVQMW01a0h6NUkyeThEMUxJeTBTNjdqK3ErZlFpUTBPU3ZGQk8zcCtDdmU0L1M0NW0xMnpLaGJ5NkI4cHc4Y0R1UHlmT2tTdjhyM0U4a1BDamdwSEU3ais3Y3dyaE5kSnRQQ01qNHhsanlPNC9ZeUppSWdURmg3eGw1VjE3WnN6dVA5VXg0dU9HSElzOE15MUs3SnZRN2o4VnU3elQwYnVSdkYwbFBySUQxZTQvMGpIdW5ESE1rRHhZc3pBVG50bnVQN05hYzI2RWFZUTh2LzE1Vld2ZTdqKzBuWTZYemQrQ3ZIcnowNzlyNCs0L2h6UExrbmNhakR5dDAxcVpuK2p1UC9yWjBVcVBlNUM4WnJhTktRZnU3ais2cnR4VzJjTlZ2UHNWVDdpaTgrNC9RUGFtUFE2a2tMdzZXZVdOY3ZudVB6U1RyVGowMW1pOFIxNzc4bmIvN2o4MWlsaHI0dTZSdkVvR29UQ3dCZTgvemQxZkN0Zi9kRHpTd1V1UUhnenZQNnlZa3ZyN3ZaRzhDUjdYVzhJUzd6K3pESzh3cm01elBKeFNoZDJiR2U4L2xQMmZYRExqamp4NjBQOWZxeUR2UDZ4WkNkR1A0SVE4UzlGWEx2RW43ejluR2s0NHI4MWpQTFhuQnBSdEwrOC9hQm1TYkN4clp6eHBrTy9jSURmdlA5SzF6SU1ZaW9DOCtzTmRWUXMvN3o5dit2OC9YYTJQdkh5SkIwb3RSKzgvU2FsMU9LNE5rTHp5aVEwSWgwL3ZQNmNIUGFhRm8zUThoNlQ3M0JoWTd6OFBJa0FnbnBHQ3ZKaUR5UmJqWU84L3JKTEIxVkJhamp5Rk10c0Q1bW52UDB0ckFheFpPb1E4WUxRQjh5Rno3ejhmUHJRSElkV0N2RitiZXpPWGZPOC95UTFITzdrcWlid3BvZlVVUm9idlA5T0lPbUFFdG5RODlqK0w1eTZRN3o5eGNwMVI3TVdEUElOTXgvdFJtdTgvOEpIVGp4TDNqN3pha0tTaXI2VHZQMzEwSStLWXJvMjg4V2VPTFVpdjd6OElJS3BCdk1PT1BDZGFZZTRidXU4L011dXB3NVFyaER5WHVtczNLOFh2UCs2RjBUR3BaSW84UUVWdVczYlE3ei90NHp2a3VqZU92QlMrbkszOTIrOC9uYzJSVFR1SmR6ellrSjZCd2VmdlA0bk1ZRUhCQlZNODhYR1BLOEx6N3o4QUFBQUFBQUR3UHdBQUFBQUFBUGcvQUFBQUFBQUFBQUFHME05RDYvMU1QZ0JCbXhrTDU0VUJRQU80NGo4b0tYdDlBQ2dwZTNOMWNHVnlLQzR1TG1GeVozVnRaVzUwY3lrN2ZRQW9LU0I3Q2lBZ0lDQmJibUYwYVhabElHTnZaR1ZkQ24wQVkyRnVibTkwSUcxcGVDQS9QeUIzYVhSb0lDWW1JRzl5SUh4OEFHTjBlZ0J3Y205NGVUb2djSEp2Y0dWeWRIa2dibTkwSUhCeVpYTmxiblFnYVc0Z2RHRnlaMlYwSUhkbGNtVWdjbVYwZFhKdVpXUWdZbmtnYm05dUlHVjRkR1Z1YzJsaWJHVWdjSEp2ZUhrQWNtVjJiMnRsWkNCd2NtOTRlUUJRY205NGVRQmhaR1JmY0hKdmNHVnlkSGtBY0hKdmVIazZJR05oYm01dmRDQnpaWFFnY0hKdmNHVnlkSGtBYm04Z2MyVjBkR1Z5SUdadmNpQndjbTl3WlhKMGVRQjJZV3gxWlNCb1lYTWdibThnY0hKdmNHVnlkSGtBWTI5MWJHUWdibTkwSUdSbGJHVjBaU0J3Y205d1pYSjBlUUJ3Y205NGVUb2daSFZ3YkdsallYUmxJSEJ5YjNCbGNuUjVBRXBUWDBSbFptbHVaVUYxZEc5SmJtbDBVSEp2Y0dWeWRIa0FhR0Z6VDNkdVVISnZjR1Z5ZEhrQWNISnZlSGs2SUdsdVkyOXVjMmx6ZEdWdWRDQmtaV3hsZEdWUWNtOXdaWEowZVFCd2NtOTRlVG9nYVc1amIyNXphWE4wWlc1MElHUmxabWx1WlZCeWIzQmxjblI1QUVwVFgwUmxabWx1WlZCeWIzQmxjblI1QUNGdGNpMCtaVzF3ZEhrQWFXNW1hVzVwZEhrQVNXNW1hVzVwZEhrQWIzVjBJRzltSUcxbGJXOXllUUIxYm10dWIzZHVJSFZ1YVdOdlpHVWdaMlZ1WlhKaGJDQmpZWFJsWjI5eWVRQkhaVzVsY21Gc1gwTmhkR1ZuYjNKNUFHVjJaWEo1QUdGdWVRQmhjSEJzZVFBbkpYTW5JR2x6SUhKbFlXUXRiMjVzZVFCbGVIQmxZM1JwYm1jZ1kyRjBZMmdnYjNJZ1ptbHVZV3hzZVFCemRHbGphM2tBWW1sbmFXNTBJR0Z5WlNCbWIzSmlhV1JrWlc0Z2FXNGdTbE5QVGk1emRISnBibWRwWm5rQWMzVmlZWEp5WVhrQVpXMXdkSGtnWVhKeVlYa0FibTl1SUdsdWRHVm5aWElnYVc1a1pYZ2dhVzRnZEhsd1pXUWdZWEp5WVhrQWJtVm5ZWFJwZG1VZ2FXNWtaWGdnYVc0Z2RIbHdaV1FnWVhKeVlYa0FiM1YwTFc5bUxXSnZkVzVrSUdsdVpHVjRJR2x1SUhSNWNHVmtJR0Z5Y21GNUFHTmhibTV2ZENCamNtVmhkR1VnYm5WdFpYSnBZeUJwYm1SbGVDQnBiaUIwZVhCbFpDQmhjbkpoZVFCcGMwRnljbUY1QUZSNWNHVmtRWEp5WVhrQVoyVjBSR0Y1QUdkbGRGVlVRMFJoZVFCcWMxOW5aWFJmWVhSdmJWOXBibVJsZUFCcGJuWmhiR2xrSUdGeWNtRjVJR2x1WkdWNEFHOTFkQzF2WmkxaWIzVnVaQ0J1ZFcxbGNtbGpJR2x1WkdWNEFFcFRYMEYwYjIxSmMwRnljbUY1U1c1a1pYZ0FabWx1WkVsdVpHVjRBR2x1ZG1Gc2FXUWdaWGh3YjNKMElITjViblJoZUFCcGJuWmhiR2xrSUdGemMybG5ibTFsYm5RZ2MzbHVkR0Y0QUcxaGVBQmNkU1V3TkhnQWFXNTJZV3hwWkNCdmNHTnZaR1U2SUhCalBTVjFJRzl3WTI5a1pUMHdlQ1V3TW5nQUxTc2dJQ0F3V0RCNEFDMHdXQ3N3V0NBd1dDMHdlQ3N3ZUNBd2VBQnNhVzVsSUhSbGNtMXBibUYwYjNJZ2JtOTBJR0ZzYkc5M1pXUWdZV1owWlhJZ2RHaHliM2NBWW1aZmNHOTNBRzV2ZHdCcGJuUmxaMlZ5SUc5MlpYSm1iRzkzQUhOMFlXTnJJRzkyWlhKbWJHOTNBRzExYzNRZ1ltVWdZMkZzYkdWa0lIZHBkR2dnYm1WM0FHbHpWbWxsZHdCRVlYUmhWbWxsZHdCeVlYY0FkR1JwZGdCbVpHbDJBR1ZrYVhZQVkyUnBkZ0FsZFFCamJHRnpjeUJrWldOc1lYSmhkR2x2Ym5NZ1kyRnVKM1FnWVhCd1pXRnlJR2x1SUhOcGJtZHNaUzF6ZEdGMFpXMWxiblFnWTI5dWRHVjRkQUJtZFc1amRHbHZiaUJrWldOc1lYSmhkR2x2Ym5NZ1kyRnVKM1FnWVhCd1pXRnlJR2x1SUhOcGJtZHNaUzF6ZEdGMFpXMWxiblFnWTI5dWRHVjRkQUJzWlhocFkyRnNJR1JsWTJ4aGNtRjBhVzl1Y3lCallXNG5kQ0JoY0hCbFlYSWdhVzRnYzJsdVoyeGxMWE4wWVhSbGJXVnVkQ0JqYjI1MFpYaDBBR1IxY0d4cFkyRjBaU0JoY21kMWJXVnVkQ0J1WVcxbGN5QnViM1FnWVd4c2IzZGxaQ0JwYmlCMGFHbHpJR052Ym5SbGVIUUFaSFZ3YkdsallYUmxJSEJoY21GdFpYUmxjaUJ1WVcxbGN5QnViM1FnWVd4c2IzZGxaQ0JwYmlCMGFHbHpJR052Ym5SbGVIUUFhVzF3YjNKMExtMWxkR0VnYm05MElITjFjSEJ2Y25SbFpDQnBiaUIwYUdseklHTnZiblJsZUhRQVNsTmZSbkpsWlVOdmJuUmxlSFFBU2xORGIyNTBaWGgwQUdwelgyMWhjRjlwZEdWeVlYUnZjbDl1WlhoMEFHcHpYMkZ6ZVc1algyZGxibVZ5WVhSdmNsOXlaWE4xYldWZmJtVjRkQUIxYm1WNGNHVmpkR1ZrSUdWdVpDQnZaaUJwYm5CMWRBQjBkQUJsZUhCdmNuUmxaQ0IyWVhKcFlXSnNaU0FuSlhNbklHUnZaWE1nYm05MElHVjRhWE4wQUhCeWFYWmhkR1VnWTJ4aGMzTWdabWxsYkdRZ0p5VnpKeUJrYjJWeklHNXZkQ0JsZUdsemRBQjBaWE4wQUdGemMybG5ibTFsYm5RZ2NtVnpkQ0J3Y205d1pYSjBlU0J0ZFhOMElHSmxJR3hoYzNRQVltWmZjM0Z5ZEFCemIzSjBBR05pY25RQWRISnBiVk4wWVhKMEFIQmhaRk4wWVhKMEFIVnVhMjV2ZDI0Z2RXNXBZMjlrWlNCelkzSnBjSFFBVTJOeWFYQjBBR2g1Y0c5MEFHWnlaV1ZmZW1WeWIxOXlaV1pqYjNWdWRBQm1ZWE4wWDJGeWNtRjVYMk52ZFc1MEFHSnBibUZ5ZVY5dlltcGxZM1JmWTI5MWJuUUFjM1J5WDJsdVpHVjRJRDA5SUc1MWJWOXJaWGx6WDJOdmRXNTBJQ3NnYzNSeVgydGxlWE5mWTI5MWJuUUFiblZ0WDJsdVpHVjRJRDA5SUc1MWJWOXJaWGx6WDJOdmRXNTBBSE4wY2w5amIzVnVkQUJ3Y205d1gyTnZkVzUwQUhONWJWOXBibVJsZUNBOVBTQmhkRzl0WDJOdmRXNTBBR3hoWW1Wc0lENDlJREFnSmlZZ2JHRmlaV3dnUENCekxUNXNZV0psYkY5amIzVnVkQUJzWVdJeElENDlJREFnSmlZZ2JHRmlNU0E4SUhNdFBteGhZbVZzWDJOdmRXNTBBRzlpYWw5amIzVnVkQUIyWVd3Z1BDQnpMVDVqWVhCMGRYSmxYMk52ZFc1MEFIWmhiRElnUENCekxUNWpZWEIwZFhKbFgyTnZkVzUwQUhOb1lYQmxYMk52ZFc1MEFHcHpYMloxYm1OZmNHTXliR2x1WlY5amIzVnVkQUJ0WlcxdmNubGZkWE5sWkY5amIzVnVkQUJ0WVd4c2IyTmZZMjkxYm5RQWFuTmZablZ1WTE5amIzVnVkQUJqWDJaMWJtTmZZMjkxYm5RQWFXNTJZV3hwWkNCeVpYQmxZWFFnWTI5MWJuUUFhVzUyWVd4cFpDQnlaWEJsZEdsMGFXOXVJR052ZFc1MEFHWnZiblFBYVc1MllXeHBaQ0JqYjJSbElIQnZhVzUwQUdaeWIyMURiMlJsVUc5cGJuUUFhVzUyWVd4cFpDQm9hVzUwQUdOaGJtNXZkQ0JqYjI1MlpYSjBJRTVoVGlCdmNpQkpibVpwYm1sMGVTQjBieUJpYVdkcGJuUUFZMkZ1Ym05MElHTnZiblpsY25RZ2RHOGdZbWxuYVc1MEFHSnZkR2dnYjNCbGNtRnVaSE1nYlhWemRDQmlaU0JpYVdkcGJuUUFibTkwSUdFZ1ltbG5hVzUwQUdWdVkyOWtaVlZTU1VOdmJYQnZibVZ1ZEFCa1pXTnZaR1ZWVWtsRGIyMXdiMjVsYm5RQWRXNWxlSEJsWTNSbFpDQmxibVFnYjJZZ1kyOXRiV1Z1ZEFCcGJuWmhiR2xrSUhOM2FYUmphQ0J6ZEdGMFpXMWxiblFBUW1sblNXNTBBSEJoY25ObFNXNTBBR1IxY0d4cFkyRjBaU0JrWldaaGRXeDBBRzFoYkd4dlkxOXNhVzFwZEFCemNHeHBkQUJsZUhCbFkzUnBibWNnYUdWNElHUnBaMmwwQUhSeWFXMVNhV2RvZEFCeVpXUjFZMlZTYVdkb2RBQjFibk5vYVdaMEFIUnlhVzFNWldaMEFHbHVkbUZzYVdRZ2IyWm1jMlYwQUdsdWRtRnNhV1FnWW5sMFpVOW1abk5sZEFCblpYUlVhVzFsZW05dVpVOW1abk5sZEFCeVpYTnZiSFpwYm1jZ1puVnVZM1JwYjI0Z1lXeHlaV0ZrZVNCelpYUUFjSEp2ZUhrNklHbHVZMjl1YzJsemRHVnVkQ0J6WlhRQVptbHVaRjlxZFcxd1gzUmhjbWRsZEFCbGVIQmxZM1JwYm1jZ2RHRnlaMlYwQUdsdWRtRnNhV1FnWkdWemRISjFZM1IxY21sdVp5QjBZWEpuWlhRQWNISnZlSGs2SUdsdVkyOXVjMmx6ZEdWdWRDQm5aWFFBVjJWaGExTmxkQUJqYjI1emRISjFZM1FBU2xOZlJuSmxaVUYwYjIxVGRISjFZM1FBZFhObElITjBjbWxqZEFCU1pXWnNaV04wQUhKbGFtVmpkQUJ1YjNRZ1lXNGdRWE41Ym1OSFpXNWxjbUYwYjNJZ2IySnFaV04wQUdOaGJtNXZkQ0JqYjI1MlpYSjBJSFJ2SUc5aWFtVmpkQUJwYm5aaGJHbGtJR0p5WVc1a0lHOXVJRzlpYW1WamRBQnZjR1Z5WVc1a0lDZHdjbTkwYjNSNWNHVW5JSEJ5YjNCbGNuUjVJR2x6SUc1dmRDQmhiaUJ2WW1wbFkzUUFjbVZqWldsMlpYSWdhWE1nYm05MElHRnVJRzlpYW1WamRBQnBkR1Z5WVhSdmNpQnRkWE4wSUhKbGRIVnliaUJoYmlCdlltcGxZM1FBYm05MElHRWdSR0YwWlNCdlltcGxZM1FBYm05MElHRWdiMkpxWldOMEFFcFRUMkpxWldOMEFHSnBaMlpzYjJGMEFIQmhjbk5sUm14dllYUUFabXhoZEFCdWIzUm9hVzVuSUhSdklISmxjR1ZoZEFCamIyNWpZWFFBWTI5a1pWQnZhVzUwUVhRQVkyaGhja0YwQUdOb1lYSkRiMlJsUVhRQWEyVjVjd0J3Y205NGVUb2dkR0Z5WjJWMElIQnliM0JsY25SNUlHMTFjM1FnWW1VZ2NISmxjMlZ1ZENCcGJpQndjbTk0ZVNCdmQyNUxaWGx6QUNBZ1ptRnpkQ0JoY25KaGVYTUFaWGh3YjNKMElDY2xjeWNnYVc0Z2JXOWtkV3hsSUNjbGN5Y2dhWE1nWVcxaWFXZDFiM1Z6QUhCeWFYWmhkR1VnWTJ4aGMzTWdabWxsYkdRZ0p5VnpKeUJoYkhKbFlXUjVJR1Y0YVhOMGN3QjBiMjhnYldGdWVTQmhjbWQxYldWdWRITUFWRzl2SUcxaGJua2dZMkZzYkNCaGNtZDFiV1Z1ZEhNQVptRnpkRjloY25KaGVWOWxiR1Z0Wlc1MGN3QWdJR1ZzWlcxbGJuUnpBR2x1ZG1Gc2FXUWdiblZ0WW1WeUlHOW1JR1JwWjJsMGN3QmlhVzVoY25rZ2IySnFaV04wY3dCcGJuWmhiR2xrSUhCeWIzQmxjblI1SUdGalkyVnpjd0JxYzE5dmNGOWtaV1pwYm1WZlkyeGhjM01BWm1RdFBtSjVkR1ZmWTI5a1pTNWlkV1piWkdWbWFXNWxYMk5zWVhOelgzQnZjMTBnUFQwZ1QxQmZaR1ZtYVc1bFgyTnNZWE56QUY5ZloyVjBRMnhoYzNNQWMyVjBTRzkxY25NQVoyVjBTRzkxY25NQWMyVjBWVlJEU0c5MWNuTUFaMlYwVlZSRFNHOTFjbk1BWjJWMFQzZHVVSEp2Y0dWeWRIbEVaWE5qY21sd2RHOXljd0IwYjI4Z2JXRnVlU0JwYldKeWFXTmhkR1ZrSUhGMVlXNTBhV1pwWlhKekFIVnVhV052WkdWZmNISnZjRjl2Y0hNQVlXTnZjd0JtYjNJZ1lYZGhhWFFnYVhNZ2IyNXNlU0IyWVd4cFpDQnBiaUJoYzNsdVkyaHliMjV2ZFhNZ1puVnVZM1JwYjI1ekFHNWxkeTUwWVhKblpYUWdiMjVzZVNCaGJHeHZkMlZrSUhkcGRHaHBiaUJtZFc1amRHbHZibk1BWW5sMFpXTnZaR1VnWm5WdVkzUnBiMjV6QUVNZ1puVnVZM1JwYjI1ekFIQnliM2g1T2lCcGJtTnZibk5wYzNSbGJuUWdjSEpsZG1WdWRFVjRkR1Z1YzJsdmJuTUFVMk55YVhCMFgwVjRkR1Z1YzJsdmJuTUFZWFJ2YlhNQWNISnZlSGs2SUhCeWIzQmxjblJwWlhNZ2JYVnpkQ0JpWlNCemRISnBibWR6SUc5eUlITjViV0p2YkhNQVoyVjBUM2R1VUhKdmNHVnlkSGxUZVcxaWIyeHpBSEpsYzI5c2RtVmZiR0ZpWld4ekFFcFRYMFYyWVd4VWFHbHpBSE4wY21sdVozTUFhVzUyWVd4cFpDQmtaWE5qY21sd2RHOXlJR1pzWVdkekFHbHVkbUZzYVdRZ2NtVm5kV3hoY2lCbGVIQnlaWE56YVc5dUlHWnNZV2R6QUhaaGJIVmxjd0J6WlhSTmFXNTFkR1Z6QUdkbGRFMXBiblYwWlhNQWMyVjBWVlJEVFdsdWRYUmxjd0JuWlhSVlZFTk5hVzUxZEdWekFIUnZieUJ0WVc1NUlHTmhjSFIxY21WekFDQWdjMmhoY0dWekFHZGxkRTkzYmxCeWIzQmxjblI1VG1GdFpYTUFaMk5mWm5KbFpWOWplV05zWlhNQVlXUmtYMlYyWVd4ZmRtRnlhV0ZpYkdWekFISmxjMjlzZG1WZmRtRnlhV0ZpYkdWekFIUnZieUJ0WVc1NUlHeHZZMkZzSUhaaGNtbGhZbXhsY3dCMGIyOGdiV0Z1ZVNCamJHOXpkWEpsSUhaaGNtbGhZbXhsY3dCamIyMXdZV04wWDNCeWIzQmxjblJwWlhNQUlDQndjbTl3WlhKMGFXVnpBR1JsWm1sdVpWQnliM0JsY25ScFpYTUFaVzUwY21sbGN3Qm1jbTl0Ulc1MGNtbGxjd0IwYjI4Z2JXRnVlU0J5WVc1blpYTUFhVzVqYkhWa1pYTUFjMlYwVFdsc2JHbHpaV052Ym1SekFHZGxkRTFwYkd4cGMyVmpiMjVrY3dCelpYUlZWRU5OYVd4c2FYTmxZMjl1WkhNQVoyVjBWVlJEVFdsc2JHbHpaV052Ym1SekFITmxkRk5sWTI5dVpITUFaMlYwVTJWamIyNWtjd0J6WlhSVlZFTlRaV052Ym1SekFHZGxkRlZVUTFObFkyOXVaSE1BYVhSaGJHbGpjd0JoWW5NQWNISnZlSGs2SUdsdVkyOXVjMmx6ZEdWdWRDQm9ZWE1BSlM0cWN3QWdLQ1Z6QUhObGRDQWxjd0JuWlhRZ0pYTUFJQ0FnSUdGMElDVnpBRzV2SUc5MlpYSnNiMkZrWldRZ2IzQmxjbUYwYjNJZ0pYTUFibTkwSUdFZ0pYTUFkVzV6ZFhCd2IzSjBaV1FnYTJWNWQyOXlaRG9nSlhNQWMzVmljM1J5QUhCeWIzaDVPaUJwYm1OdmJuTnBjM1JsYm5RZ1oyVjBUM2R1VUhKdmNHVnlkSGxFWlhOamNtbHdkRzl5QUhOMWNHVnlLQ2tnYVhNZ2IyNXNlU0IyWVd4cFpDQnBiaUJoSUdSbGNtbDJaV1FnWTJ4aGMzTWdZMjl1YzNSeWRXTjBiM0lBY0dGeVpXNTBJR05zWVhOeklHMTFjM1FnWW1VZ1kyOXVjM1J5ZFdOMGIzSUFibTkwSUdFZ1kyOXVjM1J5ZFdOMGIzSUFRWEp5WVhrZ1NYUmxjbUYwYjNJQVUyVjBJRWwwWlhKaGRHOXlBRTFoY0NCSmRHVnlZWFJ2Y2dCU1pXZEZlSEFnVTNSeWFXNW5JRWwwWlhKaGRHOXlBRzV2ZENCaGJpQkJjM2x1WXkxbWNtOXRMVk41Ym1NZ1NYUmxjbUYwYjNJQVkyRnVibTkwSUdsdWRtOXJaU0JoSUhKMWJtNXBibWNnWjJWdVpYSmhkRzl5QUc1dmRDQmhJR2RsYm1WeVlYUnZjZ0JCYzNsdVkwZGxibVZ5WVhSdmNnQnplVzUwWVhnZ1pYSnliM0lBVTNsdWRHRjRSWEp5YjNJQVJYWmhiRVZ5Y205eUFFbHVkR1Z5Ym1Gc1JYSnliM0lBUVdkbmNtVm5ZWFJsUlhKeWIzSUFWSGx3WlVWeWNtOXlBRkpoYm1kbFJYSnliM0lBVW1WbVpYSmxibU5sUlhKeWIzSUFWVkpKUlhKeWIzSUFabXh2YjNJQVptOXVkR052Ykc5eUFHRnVZMmh2Y2dCbWIzSUFhMlY1Um05eUFHVjRjR1ZqZEdsdVp5QnpkWEp5YjJkaGRHVWdjR0ZwY2dCaElHUmxZMnhoY21GMGFXOXVJR2x1SUhSb1pTQm9aV0ZrSUc5bUlHRWdabTl5TFNWeklHeHZiM0FnWTJGdUozUWdhR0YyWlNCaGJpQnBibWwwYVdGc2FYcGxjZ0FuWVhKbmRXMWxiblJ6SnlCcFpHVnVkR2xtYVdWeUlHbHpJRzV2ZENCaGJHeHZkMlZrSUdsdUlHTnNZWE56SUdacFpXeGtJR2x1YVhScFlXeHBlbVZ5QUdsdWRtRnNhV1FnYm5WdFltVnlJRzltSUdGeVozVnRaVzUwY3lCbWIzSWdaMlYwZEdWeUlHOXlJSE5sZEhSbGNnQnBiblpoYkdsa0lITmxkSFJsY2dCcGJuWmhiR2xrSUdkbGRIUmxjZ0JtYVd4MFpYSUFiV2x6YzJsdVp5Qm1iM0p0WVd3Z2NHRnlZVzFsZEdWeUFDSjFjMlVnYzNSeWFXTjBJaUJ1YjNRZ1lXeHNiM2RsWkNCcGJpQm1kVzVqZEdsdmJpQjNhWFJvSUdSbFptRjFiSFFnYjNJZ1pHVnpkSEoxWTNSMWNtbHVaeUJ3WVhKaGJXVjBaWElBYVc1MllXeHBaQ0JqYUdGeVlXTjBaWElBZFc1bGVIQmxZM1JsWkNCamFHRnlZV04wWlhJQWNISnBkbUYwWlNCamJHRnpjeUJtYVdWc1pDQm1iM0ppYVdSa1pXNGdZV1owWlhJZ2MzVndaWElBYVc1MllXeHBaQ0J5WldSbFptbHVhWFJwYjI0Z2IyWWdiR1Y0YVdOaGJDQnBaR1Z1ZEdsbWFXVnlBQ2RzWlhRbklHbHpJRzV2ZENCaElIWmhiR2xrSUd4bGVHbGpZV3dnYVdSbGJuUnBabWxsY2dCcGJuWmhiR2xrSUhKbFpHVm1hVzVwZEdsdmJpQnZaaUJuYkc5aVlXd2dhV1JsYm5ScFptbGxjZ0I1YVdWc1pDQnBjeUJoSUhKbGMyVnlkbVZrSUdsa1pXNTBhV1pwWlhJQUp5VnpKeUJwY3lCaElISmxjMlZ5ZG1Wa0lHbGtaVzUwYVdacFpYSUFiM1JvWlhJQVlYUnZiVEZmYVhOZmFXNTBaV2RsY2lBbUppQmhkRzl0TWw5cGMxOXBiblJsWjJWeUFHTmhibTV2ZENCamIyNTJaWEowSUhSdklHSnBaMmx1ZERvZ2JtOTBJR0Z1SUdsdWRHVm5aWElBYVhOSmJuUmxaMlZ5QUdselUyRm1aVWx1ZEdWblpYSUFZblZtWm1WeUFGTm9ZWEpsWkVGeWNtRjVRblZtWm1WeUFHTmhibTV2ZENCMWMyVWdhV1JsYm5ScFkyRnNJRUZ5Y21GNVFuVm1abVZ5QUdOaGJtNXZkQ0JqYjI1MlpYSjBJR0pwWjJsdWRDQjBieUJ1ZFcxaVpYSUFZMkZ1Ym05MElHTnZiblpsY25RZ1ltbG5abXh2WVhRZ2RHOGdiblZ0WW1WeUFHTmhibTV2ZENCamIyNTJaWEowSUhONWJXSnZiQ0IwYnlCdWRXMWlaWElBWTJGdWJtOTBJR052Ym5abGNuUWdZbWxuWkdWamFXMWhiQ0IwYnlCdWRXMWlaWElBYm05MElHRWdiblZ0WW1WeUFHeHBibVZPZFcxaVpYSUFiV0ZzWm05eWJXVmtJSFZ1YVdOdlpHVWdZMmhoY2dCamJHVmhjZ0J6WlhSWlpXRnlBR2RsZEZsbFlYSUFjMlYwUm5Wc2JGbGxZWElBWjJWMFJuVnNiRmxsWVhJQWMyVjBWVlJEUm5Wc2JGbGxZWElBWjJWMFZWUkRSblZzYkZsbFlYSUFjU0FoUFNCeUFIVnVaWGh3WldOMFpXUWdiR2x1WlNCMFpYSnRhVzVoZEc5eUlHbHVJSEpsWjJWNGNBQjFibVY0Y0dWamRHVmtJR1Z1WkNCdlppQnlaV2RsZUhBQVVtVm5SWGh3QUhOMWNBQnBiblpoYkdsa0lHZHliM1Z3QUhCdmNBQmpiMjUwYVc1MVpTQnRkWE4wSUdKbElHbHVjMmxrWlNCc2IyOXdBR0ptWDJ4dloybGpYMjl3QUc1MWJWOXJaWGx6WDJOdGNBQjFjMlVnYzNSeWFYQUFiV0Z3QUdac1lYUk5ZWEFBVjJWaGEwMWhjQUJsZUhCbFkzUnBibWNnSjNzbklHRm1kR1Z5SUZ4d0FHeHZaekZ3QUdScGRtbHphVzl1SUdKNUlIcGxjbThBZFc1cmJtOTNiZ0JwZEdWeVlYUnZjbDlqYkc5elpWOXlaWFIxY200QWNISnZiV2x6WlNCelpXeG1JSEpsYzI5c2RYUnBiMjRBYjNWMElHOW1JRzFsYlc5eWVTQnBiaUJ5WldkbGVIQWdaWGhsWTNWMGFXOXVBR1JsYzJOeWFYQjBhVzl1QUhCeWIzaDVPaUJrWldacGJtVlFjbTl3WlhKMGVTQmxlR05sY0hScGIyNEFhbk5mWVhONWJtTmZaMlZ1WlhKaGRHOXlYM0psYzI5c2RtVmZablZ1WTNScGIyNEFhbk5mWTNKbFlYUmxYMloxYm1OMGFXOXVBSE5sZEM5aFpHUWdhWE1nYm05MElHRWdablZ1WTNScGIyNEFjbVYwZFhKdUlHNXZkQ0JwYmlCaElHWjFibU4wYVc5dUFFRnplVzVqUjJWdVpYSmhkRzl5Um5WdVkzUnBiMjRBUVhONWJtTkdkVzVqZEdsdmJnQnBiblpoYkdsa0lHOXdaWEpoZEdsdmJnQjFibk4xY0hCdmNuUmxaQ0J2Y0dWeVlYUnBiMjRBWVhkaGFYUWdhVzRnWkdWbVlYVnNkQ0JsZUhCeVpYTnphVzl1QUhscFpXeGtJR2x1SUdSbFptRjFiSFFnWlhod2NtVnpjMmx2YmdCcGJuWmhiR2xrSUdSbFkybHRZV3dnWlhOallYQmxJR2x1SUhKbFozVnNZWElnWlhod2NtVnpjMmx2YmdCaVlXTnJJSEpsWm1WeVpXNWpaU0J2ZFhRZ2IyWWdjbUZ1WjJVZ2FXNGdjbVZuZFd4aGNpQmxlSEJ5WlhOemFXOXVBR2x1ZG1Gc2FXUWdaWE5qWVhCbElITmxjWFZsYm1ObElHbHVJSEpsWjNWc1lYSWdaWGh3Y21WemMybHZiZ0JsZUhCbFkzUmxaQ0FuYjJZbklHOXlJQ2RwYmljZ2FXNGdabTl5SUdOdmJuUnliMndnWlhod2NtVnpjMmx2YmdCMGIyOGdZMjl0Y0d4cFkyRjBaV1FnWkdWemRISjFZM1IxY21sdVp5QmxlSEJ5WlhOemFXOXVBR1Y0Y0dWamRHVmtJQ2Q5SnlCaFpuUmxjaUIwWlcxd2JHRjBaU0JsZUhCeVpYTnphVzl1QUhSdlVISmxZMmx6YVc5dUFHRnphVzRBYW05cGJnQnRhVzRBWTI5d2VWZHBkR2hwYmdCMFpXMXdiR0YwWlNCc2FYUmxjbUZzSUdOaGJtNXZkQ0JoY0hCbFlYSWdhVzRnWVc0Z2IzQjBhVzl1WVd3Z1kyaGhhVzRBWTJseVkzVnNZWElnY0hKdmRHOTBlWEJsSUdOb1lXbHVBR0Z6YzJsbmJnQWhlUzArYzJsbmJnQnBjMFp5YjNwbGJnQnRZWEpyWDJOb2FXeGtjbVZ1QUNod2IzTWdLeUJzWlc0cElEdzlJR0pqWDJKMVpsOXNaVzRBZFc1bGVIQmxZM1JsWkNCbGJHeHBjSE5wY3lCMGIydGxiZ0IwYUdWdUFITmxkSFJsY2lCcGN5Qm1iM0ppYVdSa1pXNEFiblZzYkNCdmNpQjFibVJsWm1sdVpXUWdZWEpsSUdadmNtSnBaR1JsYmdCaGRHRnVBRzVoYmdCdWIzUWdZU0JpYjI5c1pXRnVBRUp2YjJ4bFlXNEFaMk5mYzJOaGJnQmlZV1FnYm05eWJXRnNhWHBoZEdsdmJpQm1iM0p0QUVwVFgwNWxkMU41YldKdmJFWnliMjFCZEc5dEFHWnliMjBBY21GdVpHOXRBSFJ5YVcwQWRHUnBkbkpsYlFCbVpHbDJjbVZ0QUdWa2FYWnlaVzBBWTJScGRuSmxiUUJpWmw5a2FYWnlaVzBBYzNGeWRISmxiUUJwYlhWc0FHNXZkQ0JoSUhONWJXSnZiQUJUZVcxaWIyd0FVbVZuUlhod0lHVjRaV01nYldWMGFHOWtJRzExYzNRZ2NtVjBkWEp1SUdGdUlHOWlhbVZqZENCdmNpQnVkV3hzQUhCaGNtVnVkQ0J3Y205MGIzUjVjR1VnYlhWemRDQmlaU0JoYmlCdlltcGxZM1FnYjNJZ2JuVnNiQUJqWVc1dWIzUWdjMlYwSUhCeWIzQmxjblI1SUNjbGN5Y2diMllnYm5Wc2JBQmpZVzV1YjNRZ2NtVmhaQ0J3Y205d1pYSjBlU0FuSlhNbklHOW1JRzUxYkd3QVRuVnNiQUJtYVd4c0FHNWxkeUJCY25KaGVVSjFabVpsY2lCcGN5QjBiMjhnYzIxaGJHd0FWSGx3WldSQmNuSmhlU0JzWlc1bmRHZ2dhWE1nZEc5dklITnRZV3hzQUdOaGJHd0FaRzkwUVd4c0FHMWhkR05vUVd4c0FISmxjR3hoWTJWQmJHd0FZMlZwYkFCMWNHUmhkR1ZmYkdGaVpXd0FZbU5mWW5WbVczQnZjMTBnUFQwZ1QxQmZiR0ZpWld3QVpYWmhiQUJwYm5aaGJHbGtJR0pwWjJsdWRDQnNhWFJsY21Gc0FHbHVkbUZzYVdRZ2JuVnRZbVZ5SUd4cGRHVnlZV3dBYldGc1ptOXliV1ZrSUdWelkyRndaU0J6WlhGMVpXNWpaU0JwYmlCemRISnBibWNnYkdsMFpYSmhiQUJpWmw5bGVIQmZhVzUwWlhKdVlXd0FZbVpmYkc5blgybHVkR1Z5Ym1Gc0FFcFRYMU5sZEZCeWIzQmxjblI1U1c1MFpYSnVZV3dBU2xOZlIyVjBUM2R1VUhKdmNHVnlkSGxPWVcxbGMwbHVkR1Z5Ym1Gc0FGOWZTbE5mUlhaaGJFbHVkR1Z5Ym1Gc0FHSnBaMlJsWTJsdFlXd0FiblIwWDJabWRGOXdZWEowYVdGc0FIUnZSWGh3YjI1bGJuUnBZV3dBYzJWaGJBQm5iRzlpWVd3QVlteHBibXNBWDE5a1lYUmxYMk5zYjJOckFITjBZV05yQUd4eVpWOWxlR1ZqWDJKaFkydDBjbUZqYXdCekxUNXBjMTkzWldGckFHSm1YM0J2ZDE5MWFRQnpaWFJOYjI1MGFBQm5aWFJOYjI1MGFBQnpaWFJWVkVOTmIyNTBhQUJuWlhSVlZFTk5iMjUwYUFCcGJuWmhiR2xrSUd0bGVYZHZjbVE2SUhkcGRHZ0FjM1JoY25SelYybDBhQUJsYm1SelYybDBhQUJ3Y205d0lEMDlJRXBUWDBGVVQwMWZiR1Z1WjNSb0FHbHVkbUZzYVdRZ1lYSnlZWGtnYkdWdVozUm9BR2x1ZG1Gc2FXUWdZWEp5WVhrZ1luVm1abVZ5SUd4bGJtZDBhQUJwYm5aaGJHbGtJR3hsYm1kMGFBQnBiblpoYkdsa0lHSjVkR1ZNWlc1bmRHZ0FkWE5sSUcxaGRHZ0FUV0YwYUFCd2RYTm9BR0ZqYjNOb0FFcFRYMUpsYzJsNlpVRjBiMjFJWVhOb0FHRnphVzVvQUdGMFlXNW9BR0p5WldGcklHMTFjM1FnWW1VZ2FXNXphV1JsSUd4dmIzQWdiM0lnYzNkcGRHTm9BRzFoZEdOb0FHTmhkR05vQUhObFlYSmphQUJtYjNKRllXTm9BR0ptWDJ4dlp3QkJjbkpoZVNCMGIyOGdiRzl1WndCemRISnBibWNnZEc5dklHeHZibWNBUVhKeVlYa2diRzl2SUd4dmJtY0FjM1ZpYzNSeWFXNW5BR05oYm01dmRDQmpiMjUyWlhKMElITjViV0p2YkNCMGJ5QnpkSEpwYm1jQWRXNWxlSEJsWTNSbFpDQmxibVFnYjJZZ2MzUnlhVzVuQUc1dmRDQmhJSE4wY21sdVp3QnBiblpoYkdsa0lHTm9ZWEpoWTNSbGNpQnBiaUJoSUVwVFQwNGdjM1J5YVc1bkFIUnZVM1J5YVc1bkFIUnZSR0YwWlZOMGNtbHVad0IwYjB4dlkyRnNaVVJoZEdWVGRISnBibWNBZEc5VWFXMWxVM1J5YVc1bkFIUnZURzlqWVd4bFZHbHRaVk4wY21sdVp3QjBiMHh2WTJGc1pWTjBjbWx1WndCMGIwZE5WRk4wY21sdVp3QktVMU4wY21sdVp3QjBiMGxUVDFOMGNtbHVad0IwYjFWVVExTjBjbWx1WndCa2RYQnNhV05oZEdVZ2FXMXdiM0owSUdKcGJtUnBibWNBYVc1MllXeHBaQ0JwYlhCdmNuUWdZbWx1WkdsdVp3QmlhV2NBY21WblpYaHdJRzExYzNRZ2FHRjJaU0IwYUdVZ0oyY25JR1pzWVdjQWIyWUFhVzVtQUdScFptWWdQVDBnS0dsdWREaGZkQ2xrYVdabUFHUnBabVlnUFQwZ0tHbHVkREUyWDNRcFpHbG1aZ0JvY21WbUFHZGpYMlJsWTNKbFpnQm1jbVZsWDNaaGNsOXlaV1lBYjNCMGFXMXBlbVZmYzJOdmNHVmZiV0ZyWlY5bmJHOWlZV3hmY21WbUFISmxjMlYwWDNkbFlXdGZjbVZtQUdSbGJHVjBaVjkzWldGclgzSmxaZ0J2Y0hScGJXbDZaVjl6WTI5d1pWOXRZV3RsWDNKbFpnQnBibVJsZUU5bUFHeGhjM1JKYm1SbGVFOW1BSFpoYkhWbFQyWUFjMlYwVUhKdmRHOTBlWEJsVDJZQVoyVjBVSEp2ZEc5MGVYQmxUMllBYVhOUWNtOTBiM1I1Y0dWUFpnQWxMaXBtQUdadmJuUnphWHBsQUdKcGJtRnllVjl2WW1wbFkzUmZjMmw2WlFCemRISmZjMmw2WlFCdVpYZGZjMmw2WlNBOFBTQnphQzArY0hKdmNGOXphWHBsQUdSbGMyTnlJRHdnY25RdFBtRjBiMjFmYzJsNlpRQmhkRzl0SUR3Z2NuUXRQbUYwYjIxZmMybDZaUUJqYjIxd2RYUmxYM04wWVdOclgzTnBlbVVBYjJKcVgzTnBlbVVBYmlBOElHSjFabDl6YVhwbEFITm9ZWEJsWDNOcGVtVUFhbk5mWm5WdVkxOXdZekpzYVc1bFgzTnBlbVVBYW5OZlpuVnVZMTlqYjJSbFgzTnBlbVVBYldWdGIzSjVYM1Z6WldSZmMybDZaUUJxYzE5bWRXNWpYM05wZW1VQWJtOXliV0ZzYVhwbEFHWnlaV1Y2WlFCeVpYTnZiSFpsQUhSdlVISnBiV2wwYVhabEFIQjFkRjlzZG1Gc2RXVUFkVzVyYm05M2JpQjFibWxqYjJSbElIQnliM0JsY25SNUlIWmhiSFZsQUhKbGMzUWdaV3hsYldWdWRDQmpZVzV1YjNRZ2FHRjJaU0JoSUdSbFptRjFiSFFnZG1Gc2RXVUFhVzUyWVd4cFpDQnlaWFFnZG1Gc2RXVUFYMTlLVTE5QmRHOXRWRzlXWVd4MVpRQmZYM0YxYjNSbEFHbHpSbWx1YVhSbEFHUmxiR1YwWlFCamNtVmhkR1VBYzJWMFJHRjBaUUJuWlhSRVlYUmxBSE5sZEZWVVEwUmhkR1VBWjJWMFZWUkRSR0YwWlFCSmJuWmhiR2xrSUVSaGRHVUFjbVYyWlhKelpRQndZWEp6WlFCd2NtOTRlU0J3Y21WMlpXNTBSWGgwWlc1emFXOXVjeUJvWVc1a2JHVnlJSEpsZEhWeWJtVmtJR1poYkhObEFGQnliMjFwYzJVQWRHOU1iM2RsY2tOaGMyVUFkRzlNYjJOaGJHVk1iM2RsY2tOaGMyVUFkRzlWY0hCbGNrTmhjMlVBZEc5TWIyTmhiR1ZWY0hCbGNrTmhjMlVBYVdkdWIzSmxRMkZ6WlFCc2IyTmhiR1ZEYjIxd1lYSmxBSEJ5YjNoNU9pQnBibU52Ym5OcGMzUmxiblFnY0hKdmRHOTBlWEJsQUhCeWIzaDVPaUJpWVdRZ2NISnZkRzkwZVhCbEFHNXZkQ0JoSUhCeWIzUnZkSGx3WlFCcGJuWmhiR2xrSUc5aWFtVmpkQ0IwZVhCbEFIVnVaWE5qWVhCbEFHNXZibVVBY21WemRDQmxiR1Z0Wlc1MElHMTFjM1FnWW1VZ2RHaGxJR3hoYzNRZ2IyNWxBRzExYkhScGJHbHVaUUFnSUhCak1teHBibVVBYzI5dFpRQktVMTlHY21WbFVuVnVkR2x0WlFCS1UxSjFiblJwYldVQWMyVjBWR2x0WlFCblpYUlVhVzFsQUhObGRGOXZZbXBsWTNSZmJtRnRaUUJsZUhCbFkzUnBibWNnY0hKdmNHVnlkSGtnYm1GdFpRQjFibXR1YjNkdUlIVnVhV052WkdVZ2NISnZjR1Z5ZEhrZ2JtRnRaUUJwYm5aaGJHbGtJSEJ5YjNCbGNuUjVJRzVoYldVQVpIVndiR2xqWVhSbElGOWZjSEp2ZEc5Zlh5QndjbTl3WlhKMGVTQnVZVzFsQUdsdWRtRnNhV1FnY21Wa1pXWnBibWwwYVc5dUlHOW1JSEJoY21GdFpYUmxjaUJ1WVcxbEFHVjRjR1ZqZEdsdVp5Qm5jbTkxY0NCdVlXMWxBR1IxY0d4cFkyRjBaU0JuY205MWNDQnVZVzFsQUdsdWRtRnNhV1FnWjNKdmRYQWdibUZ0WlFCa2RYQnNhV05oZEdVZ2JHRmlaV3dnYm1GdFpRQnBiblpoYkdsa0lHWnBjbk4wSUdOb1lYSmhZM1JsY2lCdlppQndjbWwyWVhSbElHNWhiV1VBYVc1MllXeHBaQ0JzWlhocFkyRnNJSFpoY21saFlteGxJRzVoYldVQWFXNTJZV3hwWkNCdFpYUm9iMlFnYm1GdFpRQmxlSEJsWTNScGJtY2dabWxsYkdRZ2JtRnRaUUJwYm5aaGJHbGtJR1pwWld4a0lHNWhiV1VBWTJ4aGMzTWdjM1JoZEdWdFpXNTBJSEpsY1hWcGNtVnpJR0VnYm1GdFpRQm1hV3hsVG1GdFpRQmpiMjF3YVd4bEFHOWlhbVZqZENCcGN5QnViM1FnWlhoMFpXNXphV0pzWlFCd2NtOTRlVG9nYVc1amIyNXphWE4wWlc1MElHbHpSWGgwWlc1emFXSnNaUUJqWVc1dWIzUWdhR0YyWlNCelpYUjBaWEl2WjJWMGRHVnlJR0Z1WkNCMllXeDFaU0J2Y2lCM2NtbDBZV0pzWlFCd2NtOXdaWEowZVNCcGN5QnViM1FnWTI5dVptbG5kWEpoWW14bEFIWmhiSFZsSUdseklHNXZkQ0JwZEdWeVlXSnNaUUJ3Y205d1pYSjBlVWx6Ulc1MWJXVnlZV0pzWlFCdGFYTnphVzVuSUdsdWFYUnBZV3hwZW1WeUlHWnZjaUJqYjI1emRDQjJZWEpwWVdKc1pRQnNaWGhwWTJGc0lIWmhjbWxoWW14bEFHbHVkbUZzYVdRZ2NtVmtaV1pwYm1sMGFXOXVJRzltSUdFZ2RtRnlhV0ZpYkdVQWNtVjJiMk5oWW14bEFITjBjbWxyWlFCdGNGOWthWFp1YjNKdFgyeGhjbWRsQUdsdWRtRnNhV1FnWTJ4aGMzTWdjbUZ1WjJVQWJXVnpjMkZuWlFCaGMzbHVZMTltZFc1algyWnlaV1VBYVc1MllXeHBaQ0JzZG1Gc2RXVWdhVzRnYzNSeWFXTjBJRzF2WkdVQWFXNTJZV3hwWkNCMllYSnBZV0pzWlNCdVlXMWxJR2x1SUhOMGNtbGpkQ0J0YjJSbEFHTmhibTV2ZENCa1pXeGxkR1VnWVNCa2FYSmxZM1FnY21WbVpYSmxibU5sSUdsdUlITjBjbWxqZENCdGIyUmxBRzlqZEdGc0lHVnpZMkZ3WlNCelpYRjFaVzVqWlhNZ1lYSmxJRzV2ZENCaGJHeHZkMlZrSUdsdUlITjBjbWxqZENCdGIyUmxBRzlqZEdGc0lHeHBkR1Z5WVd4eklHRnlaU0JrWlhCeVpXTmhkR1ZrSUdsdUlITjBjbWxqZENCdGIyUmxBSFZ1YVdOdlpHVUFJQ0JpZVhSbFkyOWtaUUJLVTBaMWJtTjBhVzl1UW5sMFpXTnZaR1VBYzJ0cGNGOWtaV0ZrWDJOdlpHVUFhVzUyWVd4cFpDQmhjbWQxYldWdWRDQnVZVzFsSUdsdUlITjBjbWxqZENCamIyUmxBR2x1ZG1Gc2FXUWdablZ1WTNScGIyNGdibUZ0WlNCcGJpQnpkSEpwWTNRZ1kyOWtaUUJwYm5aaGJHbGtJSEpsWkdWbWFXNXBkR2x2YmlCdlppQm5iRzlpWVd3Z2FXUmxiblJwWm1sbGNpQnBiaUJ0YjJSMWJHVWdZMjlrWlFCcGJYQnZjblF1YldWMFlTQnZibXg1SUhaaGJHbGtJR2x1SUcxdlpIVnNaU0JqYjJSbEFHWnliMjFEYUdGeVEyOWtaUUJwYm5aaGJHbGtJR1p2Y2lCcGJpOXZaaUJzWldaMElHaGhibVF0YzJsa1pRQnBiblpoYkdsa0lHRnpjMmxuYm0xbGJuUWdiR1ZtZEMxb1lXNWtJSE5wWkdVQWNtVmtkV05sQUhOdmRYSmpaUUFuZEdocGN5Y2dZMkZ1SUdKbElHbHVhWFJwWVd4cGVtVmtJRzl1YkhrZ2IyNWpaUUJ3Y205d1pYSjBlU0JqYjI1emRISjFZM1J2Y2lCaGNIQmxZWEp6SUcxdmNtVWdkR2hoYmlCdmJtTmxBR2x1ZG1Gc2FXUWdWVlJHTFRnZ2MyVnhkV1Z1WTJVQVkybHlZM1ZzWVhJZ2NtVm1aWEpsYm1ObEFITnNhV05sQUhOd2JHbGpaUUJ5WVdObEFISmxjR3hoWTJVQUpTc3VLbVVBZFc1bGVIQmxZM1JsWkNBbllYZGhhWFFuSUd0bGVYZHZjbVFBZFc1bGVIQmxZM1JsWkNBbmVXbGxiR1FuSUd0bGVYZHZjbVFBYldGd1gyUmxZM0psWmw5eVpXTnZjbVFBYVhSbGNtRjBiM0lnWkc5bGN5QnViM1FnYUdGMlpTQmhJSFJvY205M0lHMWxkR2h2WkFCdlltcGxZM1FnYm1WbFpITWdkRzlKVTA5VGRISnBibWNnYldWMGFHOWtBQ2R6ZFhCbGNpY2dhWE1nYjI1c2VTQjJZV3hwWkNCcGJpQmhJRzFsZEdodlpBQm1jbTkxYm1RQVgxOWlabDl5YjNWdVpBQmljbVZoYXk5amIyNTBhVzUxWlNCc1lXSmxiQ0J1YjNRZ1ptOTFibVFBYjNWMElHOW1JR0p2ZFc1a0FHWnBibVFBWW1sdVpBQnBiblpoYkdsa0lHbHVaR1Y0SUdadmNpQmhjSEJsYm1RQVpYaDBjbUZ1Wlc5MWN5QmphR0Z5WVdOMFpYSnpJR0YwSUhSb1pTQmxibVFBZFc1bGVIQmxZM1JsWkNCa1lYUmhJR0YwSUhSb1pTQmxibVFBZFc1bGVIQmxZM1JsWkNCbGJtUUFhVzUyWVd4cFpDQnBibU55WlcxbGJuUXZaR1ZqY21WdFpXNTBJRzl3WlhKaGJtUUFhVzUyWVd4cFpDQW5hVzV6ZEdGdVkyVnZaaWNnY21sbmFIUWdiM0JsY21GdVpBQnBiblpoYkdsa0lDZHBiaWNnYjNCbGNtRnVaQUIwY21sdFJXNWtBSEJoWkVWdVpBQmliMnhrQUNWc2JHUUFaMk5mWkdWamNtVm1YMk5vYVd4a0FISmxjMjlzZG1WZmMyTnZjR1ZmY0hKcGRtRjBaVjltYVdWc1pBQmpZVzV1YjNRZ1pHVnNaWFJsSUdFZ2NISnBkbUYwWlNCamJHRnpjeUJtYVdWc1pBQmxlSEJsWTNScGJtY2dQR0p5WVc1a1BpQndjbWwyWVhSbElHWnBaV3hrQUNWeklHbHpJRzV2ZENCcGJtbDBhV0ZzYVhwbFpBQm1hWGhsWkFCMGIwWnBlR1ZrQUhObGRGOXZZbXBsWTNSZmJtRnRaVjlqYjIxd2RYUmxaQUJ5WldkbGVDQnViM1FnYzNWd2NHOXlkR1ZrQUdWMllXd2dhWE1nYm05MElITjFjSEJ2Y25SbFpBQlNaV2RGZUhBZ1lYSmxJRzV2ZENCemRYQndiM0owWldRQWFXNTBaWEp5ZFhCMFpXUUFKWE1nYjJKcVpXTjBJR1Y0Y0dWamRHVmtBR2xrWlc1MGFXWnBaWElnWlhod1pXTjBaV1FBWW5sMFpXTnZaR1VnWm5WdVkzUnBiMjRnWlhod1pXTjBaV1FBYzNSeWFXNW5JR1Y0Y0dWamRHVmtBR1p5YjIwZ1kyeGhkWE5sSUdWNGNHVmpkR1ZrQUdaMWJtTjBhVzl1SUc1aGJXVWdaWGh3WldOMFpXUUFkbUZ5YVdGaWJHVWdibUZ0WlNCbGVIQmxZM1JsWkFCdFpYUmhJR1Y0Y0dWamRHVmtBSEpsYW1WamRHVmtBRzFsYlc5eWVTQmhiR3h2WTJGMFpXUUFiV1Z0YjNKNUlIVnpaV1FBWkdWeWFYWmxaQ0JqYkdGemN5QmpiMjV6ZEhKMVkzUnZjaUJ0ZFhOMElISmxkSFZ5YmlCaGJpQnZZbXBsWTNRZ2IzSWdkVzVrWldacGJtVmtBR05oYm01dmRDQnpaWFFnY0hKdmNHVnlkSGtnSnlWekp5QnZaaUIxYm1SbFptbHVaV1FBWTJGdWJtOTBJSEpsWVdRZ2NISnZjR1Z5ZEhrZ0p5VnpKeUJ2WmlCMWJtUmxabWx1WldRQVpteGhaM01nYlhWemRDQmlaU0IxYm1SbFptbHVaV1FBVlc1a1pXWnBibVZrQUhCeWFYWmhkR1VnWTJ4aGMzTWdabWxsYkdRZ2FYTWdZV3h5WldGa2VTQmtaV1pwYm1Wa0FDY2xjeWNnYVhNZ2JtOTBJR1JsWm1sdVpXUUFaM0p2ZFhBZ2JtRnRaU0J1YjNRZ1pHVm1hVzVsWkFCdmNHVnlZWFJ2Y2lBbGN6b2dibThnWm5WdVkzUnBiMjRnWkdWbWFXNWxaQUJoYkd4VFpYUjBiR1ZrQUdaMWJHWnBiR3hsWkFCallXNXViM1FnWW1VZ1kyRnNiR1ZrQUdselUyVmhiR1ZrQUNGemFDMCthWE5mYUdGemFHVmtBSFpoY2w5eVpXWXRQbWx6WDJSbGRHRmphR1ZrQUVGeWNtRjVRblZtWm1WeUlHbHpJR1JsZEdGamFHVmtBR0ZrWkFBbEt6QTNaQUFsTURSa0FDVXdNbVFsTURKa0FDVXdNbVF2SlRBeVpDOGxNQ3BrQUNVdU0zTWdKUzR6Y3lBbE1ESmtJQ1V3S21RQU9pVmtBR2x1ZG1Gc2FXUWdkR2h5YjNjZ2RtRnlJSFI1Y0dVZ0pXUUFjMk1BYW5OZlpHVm1YMjFoYkd4dll3QjBjblZ1WXdCbll3QmxlR1ZqQUdKbVgybHVkR1ZuWlhKZmRHOWZjbUZrYVhoZmNtVmpBSEYxYVdOcmFuTXZjWFZwWTJ0cWN5NWpBSEYxYVdOcmFuTXZiR2xpY21WblpYaHdMbU1BY1hWcFkydHFjeTlzYVdKaVppNWpBSEYxYVdOcmFuTXZiR2xpZFc1cFkyOWtaUzVqQUhOMVlnQndjbTl0YVhObFgzSmxZV04wYVc5dVgycHZZZ0JxYzE5d2NtOXRhWE5sWDNKbGMyOXNkbVZmZEdobGJtRmliR1ZmYW05aUFISWdJVDBnWVNBbUppQnlJQ0U5SUdJQWNTQWhQU0JoSUNZbUlIRWdJVDBnWWdCeWQyRUFjaUFoUFNCaEFGOWZiRzl2YTNWd1UyVjBkR1Z5WDE4QVgxOWtaV1pwYm1WVFpYUjBaWEpmWHdCZlgyeHZiMnQxY0VkbGRIUmxjbDlmQUY5ZlpHVm1hVzVsUjJWMGRHVnlYMThBWDE5d2NtOTBiMTlmQUZ0VGVXMWliMnd1YzNCc2FYUmRBRnRUZVcxaWIyd3VjM0JsWTJsbGMxMEFXMU41YldKdmJDNXBkR1Z5WVhSdmNsMEFXMU41YldKdmJDNWhjM2x1WTBsMFpYSmhkRzl5WFFCYlUzbHRZbTlzTG0xaGRHTm9RV3hzWFFCYlUzbHRZbTlzTG0xaGRHTm9YUUJiVTNsdFltOXNMbk5sWVhKamFGMEFXMU41YldKdmJDNTBiMU4wY21sdVoxUmhaMTBBVzFONWJXSnZiQzUwYjFCeWFXMXBkR2wyWlYwQVczVnVjM1Z3Y0c5eWRHVmtJSFI1Y0dWZEFGdG1kVzVqZEdsdmJpQmllWFJsWTI5a1pWMEFXMU41YldKdmJDNW9ZWE5KYm5OMFlXNWpaVjBBVzFONWJXSnZiQzV5WlhCc1lXTmxYUUJiQUNVd01tUTZKVEF5WkRvbE1ESmtMaVV3TTJSYUFGQlBVMGxVU1ZaRlgwbE9Sa2xPU1ZSWkFFNUZSMEZVU1ZaRlgwbE9Sa2xPU1ZSWkFIQXRQbU5zWVhOelgybGtJRDA5SUVwVFgwTk1RVk5UWDBGU1VrRlpBSE4wWVdOclgyeGxiaUE4SUZCUFVGOVRWRUZEUzE5TVJVNWZUVUZZQUMwbE1ESmtMU1V3TW1SVUFFcFRYMEYwYjIxSFpYUlRkSEpTVkFCdmNHTnZaR1VnUENCU1JVOVFYME5QVlU1VUFFSlpWRVZUWDFCRlVsOUZURVZOUlU1VUFDVXdNbVE2SlRBeVpEb2xNREprSUVkTlZBQktVMTlXUVV4VlJWOUhSVlJmVkVGSEtITm1MVDVqZFhKZlpuVnVZeWtnUFQwZ1NsTmZWRUZIWDA5Q1NrVkRWQUIyWVhKZmEybHVaQ0E5UFNCS1UxOVdRVkpmVUZKSlZrRlVSVjlUUlZSVVJWSUFUVUZZWDFOQlJrVmZTVTVVUlVkRlVnQk5TVTVmVTBGR1JWOUpUbFJGUjBWU0FHRnpWV2x1ZEU0QVlYTkpiblJPQUdselRtRk9BRVJoZEdVZ2RtRnNkV1VnYVhNZ1RtRk9BSFJ2U2xOUFRnQkZVRk5KVEU5T0FFNUJUZ0FsTURKa09pVXdNbVE2SlRBeVpDQWxZMDBBY3kwK2JHRmlaV3hmYzJ4dmRITmJiR0ZpWld4ZExtWnBjbk4wWDNKbGJHOWpJRDA5SUU1VlRFd0FiR0ZpWld4ZmMyeHZkSE5iYVYwdVptbHljM1JmY21Wc2IyTWdQVDBnVGxWTVRBQndjbk1nSVQwZ1RsVk1UQUJ6WmkwK1kzVnlYM053SUNFOUlFNVZURXdBYzJZZ0lUMGdUbFZNVEFCdGNqRWdJVDBnVGxWTVRBQjJZWEpmYTJsdVpDQWhQU0JLVTE5V1FWSmZUazlTVFVGTUFHSXRQbVoxYm1OZmEybHVaQ0E5UFNCS1UxOUdWVTVEWDA1UFVrMUJUQUJsYm1OdlpHVlZVa2tBWkdWamIyUmxWVkpKQUZCSkFITndaV05wWVd3Z1BUMGdVRlZVWDB4V1FVeFZSVjlPVDB0RlJWQWdmSHdnYzNCbFkybGhiQ0E5UFNCUVZWUmZURlpCVEZWRlgwNVBTMFZGVUY5RVJWQlVTQUJ6TFQ1emRHRjBaU0E5UFNCS1UxOUJVMWxPUTE5SFJVNUZVa0ZVVDFKZlUxUkJWRVZmUlZoRlExVlVTVTVIQUhCeVpXTXhJQ0U5SUVKR1gxQlNSVU5mU1U1R0FEQXhNak0wTlRZM09EbEJRa05FUlVZQVUwbGFSUUJOUVZoZlZrRk1WVVVBVFVsT1gxWkJURlZGQUU1QlRVVUFaWFpoYkY5MGVYQmxJRDA5SUVwVFgwVldRVXhmVkZsUVJWOUhURTlDUVV3Z2ZId2daWFpoYkY5MGVYQmxJRDA5SUVwVFgwVldRVXhmVkZsUVJWOU5UMFJWVEVVQWNDMCtaMk5mYjJKcVgzUjVjR1VnUFQwZ1NsTmZSME5mVDBKS1gxUlpVRVZmU2xOZlQwSktSVU5VSUh4OElIQXRQbWRqWDI5aWFsOTBlWEJsSUQwOUlFcFRYMGREWDA5Q1NsOVVXVkJGWDBaVlRrTlVTVTlPWDBKWlZFVkRUMFJGQUV4UFJ6SkZBRXhQUnpFd1JRQnpMVDV6ZEdGMFpTQTlQU0JLVTE5QlUxbE9RMTlIUlU1RlVrRlVUMUpmVTFSQlZFVmZRVmRCU1ZSSlRrZGZVa1ZVVlZKT0lIeDhJSE10UG5OMFlYUmxJRDA5SUVwVFgwRlRXVTVEWDBkRlRrVlNRVlJQVWw5VFZFRlVSVjlEVDAxUVRFVlVSVVFBVlZSREFEeHBibkIxZEQ0QVBITmxkRDRBUEdGdWIyNTViVzkxY3o0QVBHUjFiWEErQUR4dWRXeHNQZ0JpYVdkcGJuUWdiM0JsY21GdVpITWdZWEpsSUdadmNtSnBaR1JsYmlCbWIzSWdQajQrQUNaeGRXOTBPd0J6WlhSVmFXNTBPQUJuWlhSVmFXNTBPQUJ6WlhSSmJuUTRBR2RsZEVsdWREZ0FiV0ZzWm05eWJXVmtJRlZVUmkwNEFISmhaR2w0SUcxMWMzUWdZbVVnWW1WMGQyVmxiaUF5SUdGdVpDQXpOZ0J6WlhSVmFXNTBNVFlBWjJWMFZXbHVkREUyQUhObGRFbHVkREUyQUdkbGRFbHVkREUyQUdGeVoyTWdQVDBnTlFCelpYUkNhV2RWYVc1ME5qUUFaMlYwUW1sblZXbHVkRFkwQUhObGRFSnBaMGx1ZERZMEFHZGxkRUpwWjBsdWREWTBBSE5sZEVac2IyRjBOalFBWjJWMFJteHZZWFEyTkFCaGNtZGpJRDA5SURNQVlYUmhiaklBYkc5bk1nQm1iRzl2Y2t4dlp6SUFVMUZTVkRGZk1nQlRVVkpVTWdCTVRqSUFZMng2TXpJQWMyVjBWV2x1ZERNeUFHZGxkRlZwYm5Rek1nQnpaWFJKYm5Rek1nQm5aWFJKYm5Rek1nQnpaWFJHYkc5aGRETXlBR2RsZEVac2IyRjBNeklBYzNSaFkydGZiR1Z1SUQ0OUlESUFTbE5mUVhSdmJVbHpUblZ0WlhKcFkwbHVaR1Y0TVFCcWMxOW1ZM1owTVFCS1UxOURiMjF3WVdOMFFtbG5TVzUwTVFCbGVIQnRNUUJ5SUNFOUlHRXhJQ1ltSUhJZ0lUMGdZakVBYkhNdFBtRmtaSElnUFQwZ0xURUFibkVnUGowZ01RQnpkR0ZqYTE5c1pXNGdQajBnTVFCd0xUNW9aV0ZrWlhJdWNtVm1YMk52ZFc1MElEMDlJREVBY0MwK2MyaGhjR1V0UG1obFlXUmxjaTV5WldaZlkyOTFiblFnUFQwZ01RQnpkR0ZqYTE5c1pXNGdQVDBnTVFCcWMxOW1jbVZsWDNOb1lYQmxNQUJzYjJjeE1BQk1UakV3QUhBdFBuSmxabDlqYjNWdWRDQStJREFBZG1GeVgzSmxaaTArYUdWaFpHVnlMbkpsWmw5amIzVnVkQ0ErSURBQWMzUmhZMnRmYzJsNlpTQStJREFBWTNCdmIyeGZhV1I0SUQ0OUlEQUFjblF0UG1GMGIyMWZZMjkxYm5RZ1BqMGdNQUJzY3kwK2NtVm1YMk52ZFc1MElENDlJREFBY3kwK2FYTmZaWFpoYkNCOGZDQnpMVDVqYkc5emRYSmxYM1poY2w5amIzVnVkQ0E5UFNBd0FIQXRQbkpsWmw5amIzVnVkQ0E5UFNBd0FHTjBlQzArYUdWaFpHVnlMbkpsWmw5amIzVnVkQ0E5UFNBd0FITm9MVDVvWldGa1pYSXVjbVZtWDJOdmRXNTBJRDA5SURBQWNDMCtiV0Z5YXlBOVBTQXdBQ2h1TWlBbElITjBjbWx3WDJ4bGJpa2dQVDBnTUFBb2NISXRQblV1YVc1cGRDNXlaV0ZzYlY5aGJtUmZhV1FnSmlBektTQTlQU0F3QUNodVpYZGZhR0Z6YUY5emFYcGxJQ1lnS0c1bGQxOW9ZWE5vWDNOcGVtVWdMU0F4S1NrZ1BUMGdNQUJwSUNFOUlEQUFjMmw2WlNBaFBTQXdBRjRrWEM0cUt6OG9LVnRkZTMxOEx3QThMd0F3TGdCdGFYTnphVzVuSUdKcGJtUnBibWNnY0dGMGRHVnliaTR1TGdCaWFXZHBiblFnWVhKbmRXMWxiblFnZDJsMGFDQjFibUZ5ZVNBckFHRnplVzVqSUdaMWJtTjBhVzl1SUNvQUNuMHBBR3hwYzNSZlpXMXdkSGtvSm5KMExUNW5ZMTl2WW1wZmJHbHpkQ2tBYWlBOVBTQW9jMmd0UG5CeWIzQmZZMjkxYm5RZ0xTQnphQzArWkdWc1pYUmxaRjl3Y205d1gyTnZkVzUwS1FCS1UxOUpjMVZ1WkdWbWFXNWxaQ2htZFc1algzSmxkQ2tBSVY5ZlNsTmZRWFJ2YlVselZHRm5aMlZrU1c1MEtHUmxjMk55S1FBaFlYUnZiVjlwYzE5bWNtVmxLSEFwQUNodWRXeHNLUUFnS0c1aGRHbDJaU2tBYW5OZlkyeGhjM05mYUdGelgySjVkR1ZqYjJSbEtIQXRQbU5zWVhOelgybGtLUUIxYm1OdmJuTnBjM1JsYm5RZ2MzUmhZMnNnYzJsNlpUb2dKV1FnSldRZ0tIQmpQU1ZrS1FCaWVYUmxZMjlrWlNCaWRXWm1aWElnYjNabGNtWnNiM2NnS0c5d1BTVmtMQ0J3WXowbFpDa0FjM1JoWTJzZ2IzWmxjbVpzYjNjZ0tHOXdQU1ZrTENCd1l6MGxaQ2tBYzNSaFkyc2dkVzVrWlhKbWJHOTNJQ2h2Y0QwbFpDd2djR005SldRcEFHbHVkbUZzYVdRZ2IzQmpiMlJsSUNodmNEMGxaQ3dnY0dNOUpXUXBBQ2cvT2lrQWJtOGdablZ1WTNScGIyNGdabWxzWlc1aGJXVWdabTl5SUdsdGNHOXlkQ2dwQUMxZkxpRitLaWNvS1FBZ1lXNXZibmx0YjNWektBQlRlVzFpYjJ3b0FHVjRjR1ZqZEdsdVp5QW5mU2NBWTJ4aGMzTWdZMjl1YzNSeWRXTjBiM0p6SUcxMWMzUWdZbVVnYVc1MmIydGxaQ0IzYVhSb0lDZHVaWGNuQUdWNGNHVmpkR2x1WnlBbllYTW5BSFZ1Wlhod1pXTjBaV1FnZEc5clpXNGdhVzRnWlhod2NtVnpjMmx2YmpvZ0p5VXVLbk1uQUhWdVpYaHdaV04wWldRZ2RHOXJaVzQ2SUNjbExpcHpKd0J5WldSbFkyeGhjbUYwYVc5dUlHOW1JQ2NsY3ljQVpIVndiR2xqWVhSbElHVjRjRzl5ZEdWa0lHNWhiV1VnSnlWekp3QmphWEpqZFd4aGNpQnlaV1psY21WdVkyVWdkMmhsYmlCc2IyOXJhVzVuSUdadmNpQmxlSEJ2Y25RZ0p5VnpKeUJwYmlCdGIyUjFiR1VnSnlWekp3QkRiM1ZzWkNCdWIzUWdabWx1WkNCbGVIQnZjblFnSnlWekp5QnBiaUJ0YjJSMWJHVWdKeVZ6SndCamIzVnNaQ0J1YjNRZ2JHOWhaQ0J0YjJSMWJHVWdKeVZ6SndCallXNXViM1FnWkdWbWFXNWxJSFpoY21saFlteGxJQ2NsY3ljQWRXNWtaV1pwYm1Wa0lIQnlhWFpoZEdVZ1ptbGxiR1FnSnlWekp3QjFibk4xY0hCdmNuUmxaQ0J5WldabGNtVnVZMlVnZEc4Z0ozTjFjR1Z5SndCcGJuWmhiR2xrSUhWelpTQnZaaUFuYzNWd1pYSW5BQ2RtYjNJZ1lYZGhhWFFuSUd4dmIzQWdjMmh2ZFd4a0lHSmxJSFZ6WldRZ2QybDBhQ0FuYjJZbkFHVjRjR1ZqZEdsdVp5QW5KV01uQUhWdWNHRnlaVzUwYUdWemFYcGxaQ0IxYm1GeWVTQmxlSEJ5WlhOemFXOXVJR05oYmlkMElHRndjR1ZoY2lCdmJpQjBhR1VnYkdWbWRDMW9ZVzVrSUhOcFpHVWdiMllnSnlvcUp3QnBiblpoYkdsa0lIVnpaU0J2WmlBbmFXMXdiM0owS0NrbkFHVjRjR1ZqZEdsdVp5QWxKUUE3THo4NlFDWTlLeVFzSXdBOUlnQnpaWFFnQUdkbGRDQUFXMjlpYW1WamRDQUFZWE41Ym1NZ1puVnVZM1JwYjI0Z0FHSnZkVzVrSUFBbExqTnpMQ0FsTURKa0lDVXVNM01nSlRBcVpDQUFZWE41Ym1NZ0FEb2dBQ0FnSUNBZ0lDQWdJQ0FBQ2lrZ2V3b0FDa3BUVDJKcVpXTjBJR05zWVhOelpYTUtBQ1V0TWpCeklDVTRjeUFsT0hNS0FDQWdKVFZrSUNBbE1pNHdaQ0FsY3dvQUlDQWxNM1VnS3lBbExUSjFJQ0FsY3dvQUlDQnRZV3hzYjJOZmRYTmhZbXhsWDNOcGVtVWdkVzVoZG1GcGJHRmliR1VLQUNVdE1qQnpJQ1U0Ykd4a0NnQWxMVEl3Y3lBbE9HeHNaQ0FsT0d4c1pBb0FYMTlLVTE5R2NtVmxWbUZzZFdVNklIVnVhMjV2ZDI0Z2RHRm5QU1ZrQ2dBbExUSXdjeUFsT0d4c1pDQWxPR3hzWkNBZ0tDVXdMakZtSUhCbGNpQm1ZWE4wSUdGeWNtRjVLUW9BSlMweU1ITWdKVGhzYkdRZ0pUaHNiR1FnSUNnbE1DNHhaaUJ3WlhJZ2IySnFaV04wS1FvQUpTMHlNSE1nSlRoc2JHUWdKVGhzYkdRZ0lDZ2xNQzR4WmlCd1pYSWdablZ1WTNScGIyNHBDZ0FsTFRJd2N5QWxPR3hzWkNBbE9HeHNaQ0FnS0NVd0xqRm1JSEJsY2lCaGRHOXRLUW9BSlMweU1ITWdKVGhzYkdRZ0pUaHNiR1FnSUNnbE1DNHhaaUJ3WlhJZ1lteHZZMnNwQ2dBbExUSXdjeUFsT0d4c1pDQWxPR3hzWkNBZ0tDVmtJRzkyWlhKb1pXRmtMQ0FsTUM0eFppQmhkbVZ5WVdkbElITnNZV05yS1FvQUpTMHlNSE1nSlRoc2JHUWdKVGhzYkdRZ0lDZ2xNQzR4WmlCd1pYSWdjM1J5YVc1bktRb0FKUzB5TUhNZ0pUaHNiR1FnSlRoc2JHUWdJQ2dsTUM0eFppQndaWElnYzJoaGNHVXBDZ0JSZFdsamEwcFRJRzFsYlc5eWVTQjFjMkZuWlNBdExTQkNhV2RPZFcwZ01qQXlNUzB3TXkweU55QjJaWEp6YVc5dUxDQWxaQzFpYVhRc0lHMWhiR3h2WXlCc2FXMXBkRG9nSld4c1pBb0tBQUFBQUh3cEFBRExMUUFBNmlnQUFPb29BQURxS0FBQTZpZ0FBT29vQUFEcUtBQUE2aWdBQU9vb0FBREZHQUFBckR3QUFLdzhBRUdRbndFTEFaSUFRWnlmQVFzTmt3QUFBR1VBQUFCbUFBQUFsQUJCdEo4QkN6MlZBQUFBWndBQUFHZ0FBQUNXQUFBQVp3QUFBR2dBQUFDWEFBQUFad0FBQUdnQUFBQ1lBQUFBWndBQUFHZ0FBQUNaQUFBQVpRQUFBR1lBQUFDWkFFSDhud0VMRFp3QUFBQm5BQUFBYUFBQUFKSUFRWlNnQVF1dEE1MEFBQUJwQUFBQWFnQUFBSjBBQUFCckFBQUFiQUFBQUowQUFBQnRBQUFBYmdBQUFKMEFBQUJ2QUFBQWNBQUFBSjRBQUFCckFBQUFiQUFBQUo4QUFBQnhBQUFBY2dBQUFLQUFBQUJ6QUFBQUFBQUFBS0VBQUFCMEFBQUFBQUFBQUtJQUFBQjBBQUFBQUFBQUFLTUFBQUIxQUFBQWRnQUFBS1FBQUFCMUFBQUFkZ0FBQUtVQUFBQjFBQUFBZGdBQUFLWUFBQUIxQUFBQWRnQUFBS2NBQUFCMUFBQUFkZ0FBQUtnQUFBQjFBQUFBZGdBQUFLa0FBQUIxQUFBQWRnQUFBS29BQUFCMUFBQUFkZ0FBQUtzQUFBQjFBQUFBZGdBQUFLd0FBQUIxQUFBQWRnQUFBSzBBQUFCMUFBQUFkZ0FBQUs0QUFBQjFBQUFBZGdBQUFLOEFBQUJuQUFBQWFBQUFBTEFBQUFCbkFBQUFhQUFBQUxFQUFBQjNBQUFBQUFBQUFMSUFBQUJuQUFBQWFBQUFBTE1BQUFCNEFBQUFlUUFBQUxVQUFBQjZBQUFBZXdBQUFMWUFBQUI2QUFBQWV3QUFBTGNBQUFCNkFBQUFld0FBQUxnQUFBQjZBQUFBZXdBQUFMa0FBQUI4QUFBQWZRQUFBTG9BQUFCOEFBQUFmUUFBQUxzQUFBQitBQUFBZndBQUFMd0FBQUIrQUFBQWZ3QUFBTDBBQUFDQUFBQUFnUUFBQUw0QUFBQ0NBQUFBZ3dCQjBLTUJDd0dFQUVIZ293RUxEWVVBQUFBQUFBQUFoZ0FBQUljQVFZeWtBUXNCaUFCQm1LUUJDd21KQUFBQWlnQUFBSXNBUWJDa0FRdlZBck15QUFCd0FRQUF2QklBQUFnQkFBRE1HQUFBTUFBQUFEWXVBQUFRQUFBQXV6WUFBRmdBQUFDU0FBQUFqQUFBQUkwQUFBQ09BQUFBandBQUFKQUFBQUNSQUFBQWtnQUFBSk1BQUFDVUFBQUFNR0lBQVBCaUFBQ2dZd0FBOEdNQUFEQmtBQUJRWkFBQURBc0ZCQUlDQUFEQUFBQUFsUUFBQUpZQUFBREJBQUFBbHdBQUFKZ0FBQURDQUFBQWx3QUFBSmdBQUFEREFBQUFhd0FBQUd3QUFBREVBQUFBbVFBQUFKb0FBQURGQUFBQW1RQUFBSm9BQUFBdkFBQUFtd0FBQUp3QUFBREdBQUFBYXdBQUFHd0FBQURIQUFBQW5RQUFBSjRBQUFBQUFBQUE3aDhBQUI4Z0FBQXFJQUFBNGg4QUFCVWdBQUE1SUFBQStCOEFBQVlnQUFCamIzQjVWMmwwYUdsdUFHVnVkSEpwWlhNQVptbHNiQUJtYVc1a0FHWnBibVJKYm1SbGVBQm1iR0YwQUdac1lYUk5ZWEFBYVc1amJIVmtaWE1BYTJWNWN3QjJZV3gxWlhNQUFBQUFBQUVCQWdJREF3SURBRUdRcHdFTDN4QnVkV3hzQUdaaGJITmxBSFJ5ZFdVQWFXWUFaV3h6WlFCeVpYUjFjbTRBZG1GeUFIUm9hWE1BWkdWc1pYUmxBSFp2YVdRQWRIbHdaVzltQUc1bGR3QnBiZ0JwYm5OMFlXNWpaVzltQUdSdkFIZG9hV3hsQUdadmNnQmljbVZoYXdCamIyNTBhVzUxWlFCemQybDBZMmdBWTJGelpRQmtaV1poZFd4MEFIUm9jbTkzQUhSeWVRQmpZWFJqYUFCbWFXNWhiR3g1QUdaMWJtTjBhVzl1QUdSbFluVm5aMlZ5QUhkcGRHZ0FZMnhoYzNNQVkyOXVjM1FBWlc1MWJRQmxlSEJ2Y25RQVpYaDBaVzVrY3dCcGJYQnZjblFBYzNWd1pYSUFhVzF3YkdWdFpXNTBjd0JwYm5SbGNtWmhZMlVBYkdWMEFIQmhZMnRoWjJVQWNISnBkbUYwWlFCd2NtOTBaV04wWldRQWNIVmliR2xqQUhOMFlYUnBZd0I1YVdWc1pBQmhkMkZwZEFBQWJHVnVaM1JvQUdacGJHVk9ZVzFsQUd4cGJtVk9kVzFpWlhJQWJXVnpjMkZuWlFCbGNuSnZjbk1BYzNSaFkyc0FibUZ0WlFCMGIxTjBjbWx1WndCMGIweHZZMkZzWlZOMGNtbHVad0IyWVd4MVpVOW1BR1YyWVd3QWNISnZkRzkwZVhCbEFHTnZibk4wY25WamRHOXlBR052Ym1acFozVnlZV0pzWlFCM2NtbDBZV0pzWlFCbGJuVnRaWEpoWW14bEFIWmhiSFZsQUdkbGRBQnpaWFFBYjJZQVgxOXdjbTkwYjE5ZkFIVnVaR1ZtYVc1bFpBQnVkVzFpWlhJQVltOXZiR1ZoYmdCemRISnBibWNBYjJKcVpXTjBBSE41YldKdmJBQnBiblJsWjJWeUFIVnVhMjV2ZDI0QVlYSm5kVzFsYm5SekFHTmhiR3hsWlFCallXeHNaWElBUEdWMllXdytBRHh5WlhRK0FEeDJZWEkrQUR4aGNtZGZkbUZ5UGdBOGQybDBhRDRBYkdGemRFbHVaR1Y0QUhSaGNtZGxkQUJwYm1SbGVBQnBibkIxZEFCa1pXWnBibVZRY205d1pYSjBhV1Z6QUdGd2NHeDVBR3B2YVc0QVkyOXVZMkYwQUhOd2JHbDBBR052Ym5OMGNuVmpkQUJuWlhSUWNtOTBiM1I1Y0dWUFpnQnpaWFJRY205MGIzUjVjR1ZQWmdCcGMwVjRkR1Z1YzJsaWJHVUFjSEpsZG1WdWRFVjRkR1Z1YzJsdmJuTUFhR0Z6QUdSbGJHVjBaVkJ5YjNCbGNuUjVBR1JsWm1sdVpWQnliM0JsY25SNUFHZGxkRTkzYmxCeWIzQmxjblI1UkdWelkzSnBjSFJ2Y2dCdmQyNUxaWGx6QUdGa1pBQmtiMjVsQUc1bGVIUUFkbUZzZFdWekFITnZkWEpqWlFCbWJHRm5jd0JuYkc5aVlXd0FkVzVwWTI5a1pRQnlZWGNBYm1WM0xuUmhjbWRsZEFCMGFHbHpMbUZqZEdsMlpWOW1kVzVqQUR4b2IyMWxYMjlpYW1WamRENEFQR052YlhCMWRHVmtYMlpwWld4a1BnQThjM1JoZEdsalgyTnZiWEIxZEdWa1gyWnBaV3hrUGdBOFkyeGhjM05mWm1sbGJHUnpYMmx1YVhRK0FEeGljbUZ1WkQ0QUkyTnZibk4wY25WamRHOXlBR0Z6QUdaeWIyMEFiV1YwWVFBcVpHVm1ZWFZzZENvQUtnQk5iMlIxYkdVQWRHaGxiZ0J5WlhOdmJIWmxBSEpsYW1WamRBQndjbTl0YVhObEFIQnliM2g1QUhKbGRtOXJaUUJoYzNsdVl3QmxlR1ZqQUdkeWIzVndjd0J6ZEdGMGRYTUFjbVZoYzI5dUFHZHNiMkpoYkZSb2FYTUFZbWxuYVc1MEFHSnBaMlpzYjJGMEFHSnBaMlJsWTJsdFlXd0FjbTkxYm1ScGJtZE5iMlJsQUcxaGVHbHRkVzFUYVdkdWFXWnBZMkZ1ZEVScFoybDBjd0J0WVhocGJYVnRSbkpoWTNScGIyNUVhV2RwZEhNQWRHOUtVMDlPQUU5aWFtVmpkQUJCY25KaGVRQkZjbkp2Y2dCT2RXMWlaWElBVTNSeWFXNW5BRUp2YjJ4bFlXNEFVM2x0WW05c0FFRnlaM1Z0Wlc1MGN3Qk5ZWFJvQUVwVFQwNEFSR0YwWlFCR2RXNWpkR2x2YmdCSFpXNWxjbUYwYjNKR2RXNWpkR2x2YmdCR2IzSkpia2wwWlhKaGRHOXlBRkpsWjBWNGNBQkJjbkpoZVVKMVptWmxjZ0JUYUdGeVpXUkJjbkpoZVVKMVptWmxjZ0JWYVc1ME9FTnNZVzF3WldSQmNuSmhlUUJKYm5RNFFYSnlZWGtBVldsdWREaEJjbkpoZVFCSmJuUXhOa0Z5Y21GNUFGVnBiblF4TmtGeWNtRjVBRWx1ZERNeVFYSnlZWGtBVldsdWRETXlRWEp5WVhrQVFtbG5TVzUwTmpSQmNuSmhlUUJDYVdkVmFXNTBOalJCY25KaGVRQkdiRzloZERNeVFYSnlZWGtBUm14dllYUTJORUZ5Y21GNUFFUmhkR0ZXYVdWM0FFSnBaMGx1ZEFCQ2FXZEdiRzloZEFCQ2FXZEdiRzloZEVWdWRnQkNhV2RFWldOcGJXRnNBRTl3WlhKaGRHOXlVMlYwQUU5d1pYSmhkRzl5Y3dCTllYQUFVMlYwQUZkbFlXdE5ZWEFBVjJWaGExTmxkQUJOWVhBZ1NYUmxjbUYwYjNJQVUyVjBJRWwwWlhKaGRHOXlBRUZ5Y21GNUlFbDBaWEpoZEc5eUFGTjBjbWx1WnlCSmRHVnlZWFJ2Y2dCU1pXZEZlSEFnVTNSeWFXNW5JRWwwWlhKaGRHOXlBRWRsYm1WeVlYUnZjZ0JRY205NGVRQlFjbTl0YVhObEFGQnliMjFwYzJWU1pYTnZiSFpsUm5WdVkzUnBiMjRBVUhKdmJXbHpaVkpsYW1WamRFWjFibU4wYVc5dUFFRnplVzVqUm5WdVkzUnBiMjRBUVhONWJtTkdkVzVqZEdsdmJsSmxjMjlzZG1VQVFYTjVibU5HZFc1amRHbHZibEpsYW1WamRBQkJjM2x1WTBkbGJtVnlZWFJ2Y2taMWJtTjBhVzl1QUVGemVXNWpSMlZ1WlhKaGRHOXlBRVYyWVd4RmNuSnZjZ0JTWVc1blpVVnljbTl5QUZKbFptVnlaVzVqWlVWeWNtOXlBRk41Ym5SaGVFVnljbTl5QUZSNWNHVkZjbkp2Y2dCVlVrbEZjbkp2Y2dCSmJuUmxjbTVoYkVWeWNtOXlBRHhpY21GdVpENEFVM2x0WW05c0xuUnZVSEpwYldsMGFYWmxBRk41YldKdmJDNXBkR1Z5WVhSdmNnQlRlVzFpYjJ3dWJXRjBZMmdBVTNsdFltOXNMbTFoZEdOb1FXeHNBRk41YldKdmJDNXlaWEJzWVdObEFGTjViV0p2YkM1elpXRnlZMmdBVTNsdFltOXNMbk53YkdsMEFGTjViV0p2YkM1MGIxTjBjbWx1WjFSaFp3QlRlVzFpYjJ3dWFYTkRiMjVqWVhSVGNISmxZV1JoWW14bEFGTjViV0p2YkM1b1lYTkpibk4wWVc1alpRQlRlVzFpYjJ3dWMzQmxZMmxsY3dCVGVXMWliMnd1ZFc1elkyOXdZV0pzWlhNQVUzbHRZbTlzTG1GemVXNWpTWFJsY21GMGIzSUFVM2x0WW05c0xtOXdaWEpoZEc5eVUyVjBBRUdBdUFFTHRRZ0JBQUFBQlFBQkZBVUFBUlVGQUFFVkJRQUJGd1VBQVJjQkFBRUFBUUFCQUFFQUFRQUJBQUVBQVFBQkFBRUFBUUFDQUFFRkF3QUJDZ0VCQUFBQkFnRUFBUU1DQUFFQkFnQUJBZ01BQVFJRUFBRURCZ0FCQWdNQUFRTUVBQUVFQlFBQkF3TUFBUVFFQUFFRkJRQUJBZ0lBQVFRRUFBRURBd0FCQXdNQUFRUUVBQUVGQlFBREFnRU5Bd0VCRFFNQkFBMERBZ0VOQXdJQURRTUFBUTBEQXdFS0FRRUFBQUVBQUFBQkFRSUFBUUFBQUFFQ0FnQUJBZ0FBQVFFQUFBRUJBQUFHQUFBWUJRRUJEd01DQVFvQkFnRUFBUUVCQUFFQkFRQUZBQUVYQlFBQkZ3VUFBUmNGQVFBWEJRRUFGd1VDQUJjQkFnTUFBUU1BQUFZQUFCZ0dBQUFZQmdFQUdBVUJBUmNGQVFJWEJRSUFGd0VDQVFBQkF3QUFBUU1CQUFFQ0FRQUJBZ0lBQVFNQUFBRURBUUFCQkFBQUJRSUJGd1VCQVJjQkFnSUFBUUlCQUFFQ0FnQUJBd0lBQVFNQ0FBSURBd1VHQWdFWUFnTUJCUVlDQWhnR0F3TVlBd0FCRUFNQkFCQURBUUVRQXdBQkVRTUJBQkVEQVFFUkF3QUJFZ01CQUJJREFRRVNBd0FBRUFNQUFSQURBUUFRQXdFQUVBTUFBUklEQVFBU0F3RUFFZ01BQUJBRkFRQVdCUUVBRmdVQUFCWUZBQUVXQlFBQUZnRUJBQUFCQVFFQUFRRUJBQUVDQWdBS0FRQWFDZ0lCR2dvQkFCb0tBUUFhQ2dFQUdnb0JBQm9IQUFJWkJ3QUNHUWNBQWhrRkFBSVhBUUVCQUFFQkF3QUJBUU1BQVFFREFBSURCUVVCQVFFQUFRRUNBQUVEQUFBQkJBUUFBUVFFQUFJRUJRVUJBQUFBQVFFQ0FBRUJBZ0FCQVFJQUFRRUJBQUVCQVFBQkFRRUFBUUVCQUFFQkFRQUJBUUlBQVFFQ0FBSUFBQWNDQUFBSEFnRUFCd0VCQVFBQkFRRUFBUUVCQUFFQ0FRQUZBQUVYQVFJQkFBRUNBUUFCQWdFQUFRSUJBQUVDQVFBQkFnRUFBUUlCQUFFQ0FRQUJBZ0VBQVFJQkFBRUNBUUFCQWdFQUFRSUJBQUVDQVFBQkFnRUFBUUlCQUFFQ0FRQUJBZ0VBQVFJQkFBRUNBUUFCQWdFQUFRSUJBQUVCQVFBQkFnRUFBUUlCQUFFQUFBQURBQUFLQXdBQUNnVUFBQllIQUFFWkJ3QUJHUWNCQUJrSEFBRVpDd0FDR3djQUFoa0hBQUlaQndFQkdRY0JBaGtIQVFFWkJRRUJFd1VBQUJNQkFBRUJBUUFCQVFFQUFRRUJBQUVCQVFBQkFRRUFBUUVCQUFFQkFRQUJBUUVBQVFFQ0FBRUdBd0FCQ3dJQUFRZ0NBQUVJQVFBQkFBSUFBUWNDQVFBSEFnRUJCd0VBQVFJQkFBRUNBUUFCQWdFQUFRSUJBUUFDQVFFQUFnRUJBQUlCQVFBQ0FRRUJBZ0VCQVFJQkFRRUNBUUVCQWdFQUFRTUJBQUVEQVFBQkF3RUFBUU1CQVFBREFRRUFBd0VCQUFNQkFRQURBUUVCQXdFQkFRTUJBUUVEQVFFQkF3RUFBUVFCQUFFRUFRQUJCQUVBQVFRQkFRQUVBUUVBQkFFQkFBUUJBUUFFQVFFQkJBRUJBUVFCQVFFRUFRRUJCQUVCQVFBQ0FRQUpBZ0VBQ1FJQUFBa0RBQUFNQVFFQkRnRUJBUTRCQVFFT0FRRUJEZ0VCQVFBQkFRRUFBUUVCQUFFQkFRQ2ZBQUFBb0FBQUFLRUFBQUJ1QUdZQWFRQnVBR2tBZEFCNUFBMEFFQUEwQURnQVFjREFBUXVWRVNzQUFBQXRBQUFBS2dBQUFDOEFBQUFsQUFBQUtpb0FBSHdBQUFBbUFBQUFYZ0FBQUR3OEFBQStQZ0FBUGo0K0FEMDlBQUE4QUFBQWNHOXpBRzVsWndBckt3QUFMUzBBQUg0QUFBQUFBQUFBZlRBQUFBTUFBQUFBQUFBQW9nQUFBR3NjQUFBQkFRQUFvd0FBQUFBQUFBRGROd0FBQVFFQUFLUUFBQUFBQUFBQXJpc0FBQUVDQVFDbEFBQUFBQUFBQU9zeEFBQUJBZ0lBcFFBQUFBQUFBQUNMTWdBQUFRSUVBS1VBQUFBQUFBQUFkQ29BQUFFQ0NBQ2xBQUFBQUFBQUFLZzJBQUFCQWhBQXBRQUFBQUFBQUFEN0RnQUFBUUlnQUtVQUFBQUFBQUFBRVQ0QUFBTUFBQUFCQUFBQVZRQUFBRzgwQUFBREFBQUFBZ0FBQUtZQUFBQmpFd0FBQXdBQUFBRUFBQUNuQUFBQTBpMEFBQU1BQUFBQUFBQUFxQUFBQUExQUFBQURBQUFBQWdBQUFLa0FBQUNJUHdBQUF3QUFBQUVBQUFDcUFBQUFkajhBQUFNQUFBQUJBQUFBcXdBQUFKYy9BQUFEQUFBQUFRQUFBS3dBQUFBdFB3QUFBd0FBQUFJQUFBQ3RBQUFBUEQ4QUFBRUJBQUN1QUFBQUFBQUFBUFVTQUFBREFBQUFBQXdBQUs4QUFBQ25Qd0FBQVFNQUFGMGZBQUFBQUFBQWgwRUFBQU1JQUFEd1lRQUFBd0FBQUhJeEFBQURBQUFBQWdBQUFMQUFBQUFmRHdBQUF3QUFBQU1BQUFDeEFBQUFwejhBQUFFREFBQ0hRUUFBQUFBQUFJUTFBQUFEQUFBQUFnQUFBTElBQUFCZkZ3QUFBd0FBQUFJQkFBQ3pBQUFBdGhjQUFBTUFBQUFCQVFBQXRBQUFBRGNlQUFBREFBQUFBUUVBQUxVQUFBQXBNUUFBQXdBQUFBRUJBQUMyQUFBQUpTUUFBQU1BQUFBQUFRQUF0d0FBQUhnd0FBQUJBZ0FBdUFBQUFBQUFBQUFpTFFBQUF3QUFBQUVCQUFDNUFBQUFjUndBQUFNQUJBQUFBUUFBdWdBQUFDVVpBQUFEQUFBQUFBRUFBTG9BQUFCeUhRQUFBd0FJQUFBQkFBQzZBQUFBVFQ4QUFBTUpBQUJ5SFFBQS8vLy8vNmMvQUFBQkF3QUFJeVVBQUFBQUFBQ2VQUUFBQXdBQkFBRUJBQUN6QUFBQU54NEFBQU1BQVFBQkFRQUF0UUFBQUNreEFBQURBQUVBQVFFQUFMWUFBQUFsSkFBQUF3QUJBQUFCQUFDM0FBQUFlREFBQUFFQ0FRQzRBQUFBQUFBQUFDSXRBQUFEQUFFQUFRRUFBTGtBQUFCeEhBQUFBd0FCQUFBQkFBQzZBQUFBSlJrQUFBTUpBQUJ4SEFBQS8vLy8vMDAvQUFBRENRQUFjUndBQVAvLy8vOXlIUUFBQXdBSkFBQUJBQUM2QUFBQXB6OEFBQUVEQUFDK0Z3QUFBQUFBQUY4WEFBQURBQUlBQWdFQUFMTUFBQUMyRndBQUF3QUNBQUVCQUFDMEFBQUFOeDRBQUFNQUFnQUJBUUFBdFFBQUFDa3hBQUFEQUFJQUFRRUFBTFlBQUFDblB3QUFBUU1BQUI4bEFBQUFBQUFBbmowQUFBTUFBd0FCQVFBQXN3QUFBRGNlQUFBREFBTUFBUUVBQUxVQUFBQXBNUUFBQXdBREFBRUJBQUMyQUFBQXB6OEFBQUVEQUFDNkZ3QUFBQUFBQVBVU0FBQURBQUFBQUF3QUFMc0FBQUNuUHdBQUFRTUFBRkFmQUFBQUFBQUE5UklBQUFNQUFRQUFEQUFBdXdBQUFLYy9BQUFCQXdBQVF4OEFBQUFBQUFBOFB3QUFBUUVBQUs0QUFBQUFBQUFBb2lnQUFBTUFBQUFDQUFBQXZBQUFBQlV0QUFBREFBQUFBUUFBQUwwQUFBRHpEZ0FBQXdBQUFBRUFBQUMrQUFBQXB6OEFBQUVEQUFDbk1RQUFBQUFBQUk0d0FBQURBQUFBQVFFQUFMOEFBQUR4RndBQUF3QUJBQUVCQUFDL0FBQUFjQ29BQUFNQUFBQUJBUUFBd0FBQUFETTlBQUFEQUFFQUFRRUFBTUFBQUFERURnQUFBd0FDQUFFQkFBREFBQUFBYXpnQUFBTUFBQUFCQUFBQXdRQUFBRHcvQUFBQkFRQUFyZ0FBQUFBQUFBQ25Qd0FBQVFNQUFGb21BQUFBQUFBQVh6OEFBQU1BQUFBQUFBQUF3Z0FBQVBVU0FBQURBQUFBQVFFQUFNTUFBQUJzSlFBQUF3QUJBQUVCQUFEREFBQUE2eEFBQUFNQUFnQUJBUUFBd3dBQUFQVVNBQUFEQUFBQUFRRUFBTVFBQUFCc0pRQUFBd0FCQUFFQkFBREVBQUFBNnhBQUFBTUFBZ0FCQVFBQXhBQUFBS2MvQUFBQkF3QUF4aDhBQUFBQUFBQ25Qd0FBQVFNQUFFTW1BQUFBQUFBQVlTOEFBQU1BQUFBQUFBQUF4UUFBQU5JdEFBQURBQk1BQUFFQUFNWUFBQUM4UHdBQUF3QUFBQUVBQUFESEFBQUFTeTRBQUFNQUF3QUFBUUFBeGdBQUFDb3VBQUFEQ1FBQVN5NEFBUC8vLy84L0xnQUFBd0FqQUFBQkFBREdBQUFBMnkwQUFBTUFFUUFBQVFBQXhnQUFBUHN0QUFBREFCSUFBQUVBQU1ZQUFBQWJMZ0FBQXdBekFBQUJBQURHQUFBQTZDMEFBQU1BTVFBQUFRQUF4Z0FBQUFndUFBQURBRElBQUFFQUFNWUFBQUFhRndBQUF3QUFBQUFBQUFESUFBQUF4VElBQUFNQUFBQUFBQUFBeFFBQUFETWtBQUFEQUFFQkFBRUFBTWtBQUFCSEpBQUFBd0FCQUFBQkFBREpBQUFBWWlRQUFBTUFBQUFBQVFBQXlRQUFBUDhyQUFBREFCRUFBQUVBQU1rQUFBQVVMQUFBQXdBUUFBQUJBQURKQUFBQVB6RUFBQU1BSVFBQUFRQUF5UUFBQUZJeEFBQURBQ0FBQUFFQUFNa0FBQUNvR2dBQUF3QXhBQUFCQUFESkFBQUF2Um9BQUFNQU1BQUFBUUFBeVFBQUFJTWNBQUFEQUVFQUFBRUFBTWtBQUFDY0hBQUFBd0JBQUFBQkFBREpBQUFBOEIwQUFBTUFVUUFBQVFBQXlRQUFBQWtlQUFBREFGQUFBQUVBQU1rQUFBQ3ZIUUFBQXdCaEFBQUJBQURKQUFBQTBoMEFBQU1BWUFBQUFRQUF5UUFBQU4wUEFBQURBSEVBQUFFQUFNa0FBQURrRHdBQUF3QndBQUFCQUFESkFBQUF2VElBQUFNQUFBQUJBQUFBeWdBQUFKOGRBQUFEQUhFR0FRRUFBTXNBQUFDL0hRQUFBd0J3QmdFQkFBRExBQUFBNVIwQUFBTUFjUVVDQVFBQXl3QUFBUHNkQUFBREFIQUZBZ0VBQU1zQUFBQjRIQUFBQXdCeEJBTUJBQURMQUFBQWpod0FBQU1BY0FRREFRQUF5d0FBQUo4YUFBQURBSEVEQkFFQUFNc0FBQUN4R2dBQUF3QndBd1FCQUFETEFBQUFOekVBQUFNQU1RSUJBUUFBeXdBQUFFY3hBQUFEQURBQ0FRRUFBTXNBQUFEMkt3QUFBd0F4QVFJQkFBRExBQUFBQ0N3QUFBTUFNQUVDQVFBQXl3QUFBQ3NrQUFBREFBQUFBUUFBQU13QUFBQTdKQUFBQXdBeEFBTUJBQURMQUFBQVV5UUFBQU1BTUFBREFRQUF5d0FBQUlWQkFBQURBQUFBQVFBQUFNMEFBQUJUZFc1TmIyNVVkV1ZYWldSVWFIVkdjbWxUWVhRQVFlRFJBUXNrU21GdVJtVmlUV0Z5UVhCeVRXRjVTblZ1U25Wc1FYVm5VMlZ3VDJOMFRtOTJSR1ZqQUVHUTBnRUw1ZzRmQUFBQUhBQUFBQjhBQUFBZUFBQUFId0FBQUI0QUFBQWZBQUFBSHdBQUFCNEFBQUFmQUFBQUhnQUFBQjhBQUFENEVBQUFBd0FBQUFBQUFBRE9BQUFBY2pFQUFBTUFBQUFCQUFBQXp3QUFBRTVFQUFBREFBQUFCd0FBQU5BQUFBQ2FtNXlkbnFDaG9xMnVyNStmQUFBQTBpMEFBQU1BQUFBQUFBQUEwUUFBQUdFdkFBQURBQUFBQUFBQUFOSUFBQUNuUHdBQUFRTUFBSWdXQUFBQUFBQUFYa0VBQUFNQUFBQUNBUUFBMHdBQUFHWkJBQUFEQUFFQUFnRUFBTk1BQUFCSUVRQUFBd0FCQUFJQkFBRFVBQUFBVFJFQUFBTUFBZ0FDQVFBQTFBQUFBRmNSQUFBREFBTUFBZ0VBQU5RQUFBQlNFUUFBQXdBR0FBSUJBQURVQUFBQVB5a0FBQU1BRVFBQ0FRQUExQUFBQUVjcEFBQURBQklBQWdFQUFOUUFBQUJYS1FBQUF3QVRBQUlCQUFEVUFBQUFUeWtBQUFNQUZnQUNBUUFBMUFBQUFKRVRBQUFEQUFBQUFRRUFBTlVBQUFCcEtRQUFBd0FCQUFFQkFBRFZBQUFBaFVVQUFBTUFBQUFCQVFBQTFnQUFBUE1NQUFBREFBRUFBUUVBQU5ZQUFBRFNMUUFBQXdBQUFBQUFBQURYQUFBQVlUUUFBQU1EQUFBOElBQUFBQUFBQUxvMUFBQURBd0FBVEU4QUFBQUFBQUF3TVFBQUF3QUFBQUlBQUFEWUFBQUFlQzhBQUFNQUFBQUJBUUFBMlFBQUFHa3ZBQUFEQUFBQUFnQUFBTm9BQUFCQURnQUFBd0FBQUFNQkFBRGJBQUFBWVIwQUFBTUFBQUFDQUFBQTNBQUFBTVVjQUFBREFBQUFBUUFBQU4wQUFBRCtHd0FBQXdBQUFBRUFBQURlQUFBQUpSa0FBQU1BQUFBQkFRQUEzd0FBQUhFY0FBQURBQUVBQVFFQUFOOEFBQUJ5SFFBQUF3QUNBQUVCQUFEZkFBQUFwRFFBQUFNQUFBQUJBUUFBNEFBQUFLY2JBQUFEQUFBQUFRRUFBT0VBQUFDekhnQUFBd0FBQUFJQkFBRGlBQUFBeVJvQUFBTUFBQUFCQUFBQTR3QUFBQ3djQUFBREFBQUFBZ0FBQU9RQUFBQkhLQUFBQXdBQUFBSUFBQURsQUFBQXFTc0FBQU1BQUFBQkFRQUE1Z0FBQUljd0FBQURBQUVBQVFFQUFPWUFBQUJaUFFBQUF3QUFBQUVCQUFEbkFBQUFWeWdBQUFNQUFRQUJBUUFBNXdBQUFKUWFBQUFEQUFBQUFRQUFBT2dBQUFCNkhRQUFBd0FBQUFFQUFBRHBBQUFBMGkwQUFBTUFBQUFBQUFBQTZnQUFBQnN1QUFBREFBQUFBQUFBQU9zQUFBQmhMd0FBQXdBQUFBQUFBQURzQUFBQStnMEFBQU1BQUFBQkFBQUE3UUFBQUljdkFBQURBQUFBQVFBQUFPNEFBQUFVTlFBQUF3QUFBQUVBQUFEdkFBQUFJejhBQUFFQkFBRHdBQUFBOFFBQUFCSS9BQUFEQUFBQUFnRUFBUElBQUFEd1BnQUFBd0FCQUFJQkFBRHlBQUFBQVQ4QUFBTUFBQUFCQVFBQTh3QUFBTjgrQUFBREFBRUFBUUVBQVBNQUFBQnZLZ0FBQXdBQUFBRUFBQUQwQUFBQXlBNEFBQU1BQUFBQ0FRQUE5UUFBQUhFNUFBQURBQUFBQVFBQUFQWUFBQURTTFFBQUF3QUFBQUFBQUFEM0FBQUErRDhBQUFNQUFBQUJBQUFBK0FBQUFHWTBBQUFCQVFBQStRQUFBQUFBQUFBREpBQUFBUUVBQVBvQUFBQUFBQUFBVFQ4QUFBTUFBQUFBQUFBQXdnQUFBQUFaQUFBREFBQUFBUUFBQVBzQUFBQytEZ0FBQXdBQUFBRUJBQUQ4QUFBQW56SUFBQU1BQVFBQkFRQUEvQUFBQUNJdEFBQURBQUlBQVFFQUFQd0FBQUFUSlFBQUF3QURBQUVCQUFEOEFBQUFVaUVBQUFNQUJBQUJBUUFBL0FBQUFOWTNBQUFEQUFBQUFRRUFBUDBBQUFEYkZnQUFBd0FCQUFFQkFBRDlBQUFBTGlvQUFBTUFBQUFCQUFBQS9nQUFBR3c1QUFBREFBQUFBUUVBQVA4QUFBQkRFQUFBQXdBQkFBRUJBQUQvQUFBQVRTOEFBQU1BQUFBQkFBQUFBQUVBQUZVdkFBQURBQUFBQVFBQUFBRUJBQUNXSFFBQUF3QUFBQUVBQUFBQ0FRQUE1aWNBQUFNQUFBQUJBUUFBQXdFQUFOSXRBQUFEQUFBQUFBQUFBQVFCQUFBYkxnQUFBd0FCQUFBQkFBQURBUUFBenlRQUFBTUFBQUFBQVFBQUJRRUFBTUlzQUFBREFBQUFBUUVBQUFZQkFBRHBGZ0FBQXdBQkFBQUJBQUFGQVFBQTV4WUFBQU1BQVFBQkFRQUFCZ0VBQUdveEFBQURBQUFBQUFBQUFBY0JBQUNXRXdBQUF3QUFBQUVBQUFBSUFRQUFYamdBQUFNQUFBQUNBUUFBQ1FFQUFHUTRBQUFEQUFFQUFnRUFBQWtCQUFEdkp3QUFBd0FBQUFJQUFBQUtBUUFBRnlVQUFBTUFBUUFCQVFBQUN3RUFBT2tZQUFBREFBQUFBQUVBQUFzQkFBQnhIQUFBQXdBQkFBQUJBQUE5QUFBQVRUOEFBQU1KQUFCeEhBQUEvLy8vL3lVWkFBQURBQUFBQUFFQUFEMEFBQUJ5SFFBQUF3QUNBQUFCQUFBOUFBQUF5ZzhBQUFNQUFBQUJBQUFBREFFQUFDNHBBQUFEQUFBQUFRQUFBQTBCQUFDcExnQUFBd0FBQUFBQUFBQU9BUUFBUEQ4QUFBRUJBQUN1QUFBQUFBQUFBUFVTQUFBREFBQUFBQXdBQUQ0QUFBQ25Qd0FBQVFNQUFEUWZBQUFBQUFBQWp4WUFBQU1BQUFBQ0FBQUFEd0VBQU40WUFBQURBQUFBQVFBQUFCQUJBQUJ0UVFBQUF3QUFBQUVBQUFBUkFRQUFJREVBQUFNQUFBQUJBQUFBRWdFQUFIRkNBQUFEQUFBQUFRRUFBQk1CQUFCQ0ZnQUFBd0FCQUFFQkFBQVRBUUFBWjBJQUFBTUFBQUFCQVFBQUZBRUFBQzhXQUFBREFBRUFBUUVBQUJRQkFBQmRNZ0FBQXdBQUFBRUFBQUFWQVFBQVd6SUFBQU1BQUFBQkFBQUFGZ0VBQUhVT0FBQUFCZ0FBQUFBQUFBQUE4SCtCUVFBQUFBWUFBQUFBQUFBQUFQaC9yRHdBQUFBSEFFR0E0UUVMVmJzckFBQURBQUFBQUFBQUFCY0JBQUJCUWtORVJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXbUZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZNREV5TXpRMU5qYzRPVUFxWHlzdExpOEFRZURoQVF1V0E1c3JBQUFEQUFBQUFRQUFBQmdCQUFEYk9nQUFBd0FBQUFFQUFBQVpBUUFBMVNjQUFBTUFBQUFCQUFBQUdnRUFBTkl0QUFBREFBQUFBUUVBQUJzQkFBQWJMZ0FBQXdBQkFBQUJBQUFiQVFBQVlTOEFBQU1BQUFBQUFBQUFIQUVBQUk4V0FBQURDUUFBanhZQUFBQUFBQURlR0FBQUF3a0FBTjRZQUFBQUFBQUFiVUVBQUFNQUFBQUJBQUFBSFFFQUFDQXhBQUFEQUFBQUFRQUFBQjRCQUFBZUl3QUFBd0FBQUFFQUFBQWZBUUFBS0NNQUFBTUFBQUFCQUFBQUlBRUFBQnREQUFBQUJnQUEvLy8vLy8vLzczOGxRd0FBQUFZQUFBRUFBQUFBQUFBQWdVRUFBQUFHQUFBQUFBQUFBQUQ0ZjBkQUFBQUFCZ0FBQUFBQUFBQUE4UDgxUUFBQUFBWUFBQUFBQUFBQUFQQi9qRUVBQUFBR0FBQUFBQUFBQUFDd1BEeEJBQUFBQmdBQS8vLy8vLy8vUDBOTlFRQUFBQVlBQVAvLy8vLy8vei9EMGkwQUFBTUFBQUFBQUFBQUlRRUFBR0V2QUFBREFBQUFBQUFBQUNJQkFBQ0dOd0FBQXdBQUFBRUFBQUFqQVFBQXFCVUFBQU1BQUFBQkFBQUFKQUVBQUVRUkFBQURBQUFBQVFBQUFDVUJBQUNhTEFBQUFRUUFRWURsQVF2aUJob1pBQUFEQUFBQUFRQUFBQ1lCQUFBVEdRQUFBd0FBQUFFQUFBQW5BUUFBQUJrQUFBTUFBQUFCQUFBQUtBRUFBQWNaQUFBREFBQUFBUUFBQUNrQkFBQk5Md0FBQXdBQUFBRUJBQUFxQVFBQVZTOEFBQU1BQVFBQkFRQUFLZ0VBQUpZZEFBQURBQUFBQVFFQUFDc0JBQUJCTEFBQUF3QUNBQUVCQUFBckFRQUFOaXdBQUFNQUFRQUJBUUFBS3dFQUFBOHRBQUFEQU5JQUFRRUFBQ3dCQUFCN0tnQUFBd0RUQUFFQkFBQXNBUUFBR3kwQUFBTUExUUFCQVFBQUxBRUFBTGNXQUFBREFBQUFBZ0FBQUMwQkFBQmZMUUFBQXdBQUFBSUFBQUF1QVFBQW1CNEFBQU1BQUFBQ0FBQUFMd0VBQUY0NEFBQURBQUFBQWdBQUFEQUJBQUQ1R0FBQUF3QUFBQUVBQUFBeEFRQUFjRGdBQUFNQUFBQUNBUUFBTWdFQUFJUXFBQUFEQUFFQUFnRUFBRElCQUFBK09nQUFBd0FCQUFFQkFBQXpBUUFBcWhNQUFBTUFBQUFCQVFBQU13RUFBRG9wQUFBREFBTUFBQUVBQURRQkFBQTJPZ0FBQXdBQ0FBQUJBQUEwQVFBQTBSWUFBQU1KQUFBMk9nQUEvLy8vLzZBVEFBQURBQUVBQUFFQUFEUUJBQUR2RmdBQUF3a0FBS0FUQUFELy8vLy8waTBBQUFNQUFBQUFBQUFBTlFFQUFHRXZBQUFEQUFBQUFBQUFBRFVCQUFBWU1RQUFBd0FBQUFFQUFBQTJBUUFBOWpFQUFBTUFBQUFCQUFBQU53RUFBSzh4QUFBREFBRUFBQUVBQURnQkFBRE5NUUFBQXdBQUFBQUJBQUE0QVFBQXV6RUFBQU1BQVFBQUFRQUFPQUVBQU5reEFBQURBQUFBQUFFQUFEZ0JBQUJOUHdBQUF3QUZBQUFCQUFBOUFBQUFVaUFBQUFNQUFBQUJBUUFBT1FFQUFJY3VBQUFEQUFFQUFBRUFBRGtCQUFDMUt3QUFBd0FDQUFBQkFBQTVBUUFBUlRvQUFBTUFBd0FBQVFBQU9RRUFBTlU2QUFBREFBUUFBQUVBQURrQkFBQklJQUFBQXdBRkFBRUJBQUE1QVFBQW1pOEFBQU1BQmdBQkFRQUFPUUVBQUJjZUFBQURBQWNBQUFFQUFEa0JBQUMyS3dBQUF3QUlBQUVCQUFBNUFRQUFhU29BQUFNQUNRQUFBUUFBT1FFQUFJNDFBQUFEQUFvQUFBRUFBRGtCQUFCNVBnQUFBd0FMQUFBQkFBQTVBUUFBdlNRQUFBTUFEQUFBQVFBQU9RRUFBTjArQUFCaE5BQUFoeTRBQUFBQUFBQzFLd0FBQUFBQUFOSStBQUFBQUFBQUVoTUFBQUFBQUFDUUZRQUFUQ0FBQUpBVkFBQjRNQUFBOUNzQUFBQUFBQURkUGdBQTJ5NEFBR2txQUFBQUFBQUFqalVBQUFBQUFBQjVQZ0FBQUFBQUFMMGtBRUh3NndFTHNSTDFFZ0FBQXdBQUFBQU1BQUE2QVFBQXB6OEFBQUVEQUFCa0h3QUFBQUFBQUwwc0FBQURDQUFBSUhZQUFDd0FBQURySndBQUF3QUFBQUlCQUFBN0FRQUFmUkFBQUFNQUFRQUNBUUFBT3dFQUFCOGVBQUFEQUFBQUFRWUFBRHdCQUFCQ0lBQUFBd0FBQUFFR0FBQTlBUUFBanlvQUFBTUFBQUFCQmdBQVBnRUFBRG81QUFBREFBQUFBUVlBQUQ4QkFBQ1JFd0FBQXdBQUFBRUdBQUJBQVFBQUZCc0FBQU1BQUFBQkJnQUFRUUVBQU9FbkFBQURBQUFBQVFZQUFFSUJBQURiS0FBQUF3QUFBQUVHQUFCREFRQUFla1VBQUFNQUFBQUNCd0FBUkFFQUFCVWJBQUFEQUFBQUFRWUFBRVVCQUFDeUpBQUFBd0FBQUFFR0FBQkdBUUFBTFMwQUFBTUFBQUFCQmdBQVJ3RUFBUFFRQUFBREFBQUFBZ2NBQUVnQkFBRGlKd0FBQXdBQUFBRUdBQUJKQVFBQTNDZ0FBQU1BQUFBQkJnQUFTZ0VBQUFnK0FBQURBQUFBQVFZQUFFc0JBQUJTS0FBQUF3QUFBQUVHQUFCTUFRQUF5Q3dBQUFNQUFBQUJCZ0FBVFFFQUFPQXNBQUFEQUFBQUFRWUFBRTRCQUFEbUxBQUFBd0FBQUFFR0FBQlBBUUFBeHl3QUFBTUFBQUFCQmdBQVVBRUFBTjhzQUFBREFBQUFBUVlBQUZFQkFBRGxMQUFBQXdBQUFBRUdBQUJTQVFBQUpFWUFBQU1BQUFBQkJnQUFVd0VBQUQ0bEFBQURBQUFBQVFZQUFGUUJBQUNBUlFBQUF3QUFBQUVHQUFCVkFRQUF1a1lBQUFNQUFBQUJCZ0FBVmdFQUFKc1RBQUFEQUFBQUFRWUFBRmNCQUFEUkV3QUFBd0FBQUFJQUFBQllBUUFBTXlrQUFBTUFBQUFBQUFBQVdRRUFBQzQ1QUFBREFBQUFBUVlBQUZvQkFBQnhLUUFBQXdBQUFBSUFBQUJiQVFBQW9VVUFBQU1BQUFBQkFBQUFYQUVBQUtjL0FBQUJBd0FBdlN3QUFBQUFBQURsUXdBQUFBWUFBR2xYRklzS3Z3VkF3RVlBQUFBR0FBQVdWYlc3c1dzQ1FKMUZBQUFBQmdBQTd6bjYva0l1NWovYVF3QUFBQVlBQVA2Q0syVkhGZmMvNEVNQUFBQUdBQUFPNVNZVmU4dmJQM3RDQUFBQUJnQUFHQzFFVlBzaENVQ1BSUUFBQUFZQUFNMDdmMmFlb09ZL2wwVUFBQUFHQUFETk8zOW1ucUQyUCtrWEFBQURDQUFBOEhnQUFBNEFBQURJRGdBQUF3QUFBQU1BQUFCZEFRQUF3aGNBQUFNQUFBQUNBQUFBWGdFQUFFQU9BQUFEQUFFQUF3RUFBTnNBQUFBZERnQUFBd0FBQUFJQUFBQmZBUUFBdGhjQUFBTUFBQUFDQUFBQVlBRUFBTE1lQUFBREFBRUFBZ0VBQU9JQUFBQjRMd0FBQXdBQkFBRUJBQURaQUFBQU54NEFBQU1BQUFBQ0FBQUFZUUVBQUtRMEFBQURBQUVBQVFFQUFPQUFBQUJhR1FBQUF3QUFBQUVBQUFCaUFRQUFweHNBQUFNQUFRQUJBUUFBNFFBQUFGOFhBQUFEQUFBQUF3QUFBR01CQUFCcEx3QUFBd0FBQUFJQUFBQmtBUUFBcHo4QUFBRURBQURwRndBQUFBQUFBTkl0QUFBREFBQUFBQUFBQUdVQkFBQmhMd0FBQXdBQUFBQUFBQUJtQVFBQXZEOEFBQU1BQUFBQkFBQUFaZ0VBQUtjL0FBQUJBd0FBZ3lrQUFBQUFBQUN0SlFBQUFRRUFBR2NCQUFBQUFBQUFXU0FBQUFNQUFBQUJBQUFBYUFFQUFGMGdBQUFEQUFBQUFRQUFBR2tCQUFEMUVnQUFBd0FBQUFFTUFBQnFBUUFBYkNVQUFBTUFBUUFCREFBQWFnRUFBT3NRQUFBREFBSUFBUXdBQUdvQkFBQ25Qd0FBQVFNQUFNc2ZBQUFBQUFBQXB6OEFBQUVEQUFCSUpnQUFBQUFBQUtrc0FBQUJBaE1BYXdFQUFBQUFBQUJlT0FBQUF3QVRBQUlCQUFCc0FRQUFwejhBQUFFREFBQmtJd0FBQUFBQUFEUVJBQUFEQUFBQUFRQUFBRzBCQUFBOFB3QUFBUUVBQUs0QUFBQUFBQUFBcVN3QUFBRUNGQUJyQVFBQUFBQUFBRjQ0QUFBREFCUUFBZ0VBQUd3QkFBQ25Qd0FBQVFNQUFEMGpBQUFBQUFBQVBEOEFBQUVCQUFDdUFBQUFBQUFBQUpvc0FBQUJBUUFBYmdFQUFBQUFBQUEySXdBQUFRSUFBRzhCQUFBQUFBQUFxU3dBQUFFQ0FBQndBUUFBQUFBQUFBOFhBQUFCQWdBQWNRRUFBQUFBQUFCZkZ3QUFBd0FBQUFFQUFBQnlBUUFBY1J3QUFBTUFBUUFBQVFBQWN3RUFBRTAvQUFBRENRQUFjUndBQVAvLy8vOGxHUUFBQXdBQUFBQUJBQUJ6QVFBQWNoMEFBQU1BQWdBQUFRQUFjd0VBQUtjL0FBQUJBUUFBZEFFQUFBQUFBQUR2SndBQUF3QUFBQUlBQUFCMUFRQUF2ZzRBQUFNQUNBQUJBUUFBL0FBQUFKOHlBQUFEQUFrQUFRRUFBUHdBQUFBaUxRQUFBd0FLQUFFQkFBRDhBQUFBRXlVQUFBTUFDd0FCQVFBQS9BQUFBRkloQUFBREFBd0FBUUVBQVB3QUFBRFdOd0FBQXdBSUFBRUJBQUQ5QUFBQTJ4WUFBQU1BQ1FBQkFRQUEvUUFBQUM0cUFBQURBQUFBQVFBQUFIWUJBQUJzT1FBQUF3QUFBQUVCQUFCM0FRQUFReEFBQUFNQUFRQUJBUUFBZHdFQUFHb3hBQUFEQUFBQUFBQUFBSGdCQUFCZU9BQUFBd0FBQUFJQUFBQjVBUUFBS1E4QUFBTUFBQUFDQUFBQWVnRUFBSllUQUFBREFBQUFBUUFBQUhzQkFBRG1Kd0FBQXdBQUFBRUJBQUI4QVFBQUd5NEFBQU1BQVFBQUFRQUFmQUVBQUUwdkFBQURBQUFBQVFFQUFIMEJBQUJWTHdBQUF3QUJBQUVCQUFCOUFRQUFsaDBBQUFNQS8vOEJBUUFBZlFFQUFDNHBBQUFEQUFBQUFRQUFBSDRCQUFDcExnQUFBd0FBQUFBQUFBQi9BUUFBUEQ4QUFBRUJBQUN1QUFBQUFBQUFBRFlqQUFBQkFnRUFid0VBQUFBQUFBQ3BMQUFBQVFJQkFIQUJBQUFBQUFBQUR4Y0FBQUVDQVFCeEFRQUFBQUFBQU1GRUFBQURBQllBQVFFQUFJQUJBQUN3UkFBQUF3QVhBQUVCQUFDQUFRQUFGVVVBQUFNQUdBQUJBUUFBZ0FFQUFBSkZBQUFEQUJrQUFRRUFBSUFCQUFERVJRQUFBd0FhQUFFQkFBQ0FBUUFBc1VVQUFBTUFHd0FCQVFBQWdBRUFBRTVGQUFBREFCd0FBUUVBQUlBQkFBQTFSUUFBQXdBZEFBRUJBQUNBQVFBQTJFVUFBQU1BSGdBQkFRQUFnQUVBQUdWRkFBQURBQjhBQVFFQUFJQUJBQUM1UkFBQUF3QVdBQUlCQUFDQkFRQUFwMFFBQUFNQUZ3QUNBUUFBZ1FFQUFBeEZBQUFEQUJnQUFnRUFBSUVCQUFENFJBQUFBd0FaQUFJQkFBQ0JBUUFBdTBVQUFBTUFHZ0FDQVFBQWdRRUFBS2RGQUFBREFCc0FBZ0VBQUlFQkFBQkNSUUFBQXdBY0FBSUJBQUNCQVFBQUtFVUFBQU1BSFFBQ0FRQUFnUUVBQU0xRkFBQURBQjRBQWdFQUFJRUJBQUJhUlFBQUF3QWZBQUlCQUFDQkFRQUFwejhBQUFFREFBQTdFUUFBQUFBQUFDUUFBQUFoQUFBQUlnQUFBQWNBQUFBRkFBQUFJUUFBQUNFQUFBQWhBQUFBSVFBQUFDRUFBQUFoQUFBQUJBQUFBQVlBQUFBaEFBQUFJUUFBQUNFQUFBQWhBQUFBSVFBQUFBUUFBQUFCQUFBQUFnQUFBQUVBQUFBRUFBQUFBUUFBQUFFQUFBQUlBQUFBRUFBQUFBRUFBQUFnQUVHcy9nRUxJUUlBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBRHdBQUFBNEFBQUFSQUFBQUVBQkIrUDRCQ3pFQ0FBQUFBd0FBQUFRQUFBQUFBQUFBQVFBQUFBVUFBQUFKQUFBQUNnQUFBQXNBQUFBTkFBQUFEUUFBQUEwQUFBQU5BRUcwL3dFTEJRd0FBQUFNQUVIRS93RUxDUWNBQUFBSUFBQUFCZ0JCMlA4QkMzNEVBQUFBTFFBQUFDMEFBQUJVQUFBQU9nQUFBRG9BQUFBdUFBQUFma2dBQU1STUFBQjRTQUFBZ2dFQUFJTUJBQUNDQVFBQWhBRUFBSVVCQUFDR0FRQUFod0VBQUlnQkFBQ0pBUUFBaWdFQUFJc0JBQUNNQVFBQWpRRUFBSXdCQUFDT0FRQUFqd0VBQUpBQkFBQ1JBUUFBa2dFQUFKTUJBQUNVQVFBQWxRRUFRZUNBQWdzcUNnQUpBQTRBSUFBaEFLQUFvUUNBRm9FV0FDQUxJQ2dnS2lBdklEQWdYeUJnSUFBd0FURC8vZ0QvQUVHVWdRSUxMUkFBQUFEKy8vK0gvdi8vQndBQUFBQVFBUDhEL3YvL2gvNy8vd2U4Z0FBQVlJQUFBTkNBQUFBQkFEQUFPZ0JCMElFQ0N4RUVBREFBT2dCQkFGc0FYd0JnQUdFQWV3QkI4SUVDQzhRTEFRTUZBUUVCQVFVRkJRRUNBZ01GQlFFQkFRSUNBd01GQlFFRkFSRUFBQUF3bWlBQUFKb3dBSE9CV2dBd0YyQUFNQWRzQUxPQmJ3QUFGM0FBQUFkOEFBQ0Jmd0JBTUlBQXd3R1lBSkNCbUFCQUJwa0FRSkNjQUxTQnBBQkFMcVVBTUFHOEFFQ0d2QUJ3Z2I4QUFBSEFBRENCd0FCQUJNRUFNQUhEQUVDQ3d3QXdnc1FBUUlMRkFEQUJ4d0F3Z2NjQU1BSElBRUNDeUFBd2dja0FNQUhLQUFDQnlnQXdBY3NBTUlITEFFQUN6QUFBQWMwQU1BSE9BRENCemdBQUFjOEFNSUhQQUVBRzBBQXdBZE1BUUlMVEFEQ0IxQUJBQXRZQU1BSFhBRUNDMXdBd2d0Z0FRSVRaQURDQjJ3QkFBdHdBUUFMZUFBQ0Izd0JRQStJQVVJUGpBRkFENVFCQWtPWUFBSUh1QUVBUzd3QzBBZmdBVUlQNEFFQUMrZ0F3QWZzQU1JSDdBRUFvL0FBd0FSQUJRQklSQVRFQkhRRkFnaDBCTUlFZUFURUJId0VCZ2g4QlFJSWdBVENCSVFFd0FTSUJNSUVpQVVBS0l3RUJBU2dCQVlFb0FRRUJLUUVBZ1NrQkFBRXFBUUFDS3dFQWdTd0JBSUV0QVFFQkxnRUFBVEFCQVlFd0FRQ0JNUUVCZ1RJQkFRRXpBUUFCTkFFQWdUUUJBUUUxQVFHQk5RRUJBVFlCQUlFM0FRR0JPQUVBQVRrQkFJRTZBUUdCUGdFQUFVQUJBUUZCQVFDQlFRRUJnVU1CQUFGRUFRQ0JSQUVBQWtVQkFBRkdBUUFCU1FFQmdVNEJBUUZQQVhPQm9nRkFCTGdCUUFLN0FRQ0R2UUV3Z2I4Qk1BSERBVEFEeEFFd0FjWUJNQUxIQWRBQnlBRXdrY2dCTUluUkFRQUIxZ0VBZzlZQjB3SFlBUUNSMkFGekFlRUJBSW5oQVFBQjVnRUFndVlCTUlIbkFYTUI2QUZ6Z2VnQmM0SHFBWE1CNndFQWdlc0JRQmpzQVhNQitBRnpnZmdCQUFINUFRQ0IrUUdnQWZvQmM0SDZBVUNDK3dFd2dmd0JRQUw5QVRDRC9nRXdFQUFDTUNBSUFnQWdHQUlBRUNnQ1FDSXdBa0EyUlFJd0FXQUNRSTVnQWdDQlp3SkFZR2dDTUthWUFnQ21zQUsxZ2NNQ01TWlFDREdCWXdneGdXWUlBQ3RvQ0FDRGZnZ1JVTkFKRUFiNENTQUcvQWwwQVVBT2RJRkFEblFCUVE1MGdVRU9kQUZDRG5TQlFnNTBBVU1PZ0lGRERvQUJSQTR3SzBnT01JTmVEZ0dCdkE0QmdiNE9BUUhIRGtCK0FBOUFHRDhQdFFGTEQ3YUJTdysyQVV3UHRvRk1EN2NCVFErQWdVMFBNQUZQRDBCZ1VBOEFDSUFQTUFpRUR3QUdpQTh3Qm93UEFBaVFEekFJbEE4QUNKZ1BNQWljRHdBR29BOHdCcVFQc0FHb0R3Q0JxQS9UQWFrUEFJR3BEOU1CcWc4QWdhb1Awd0dyRHdDQnF3OHdnYXdQTUlHdER6Q0JyZzh3Z2E4UEFBaXdEekFJdEE4QUFyZ1BBQVM1RHdBQ3V3OEJBcndQQVFLOUR3RUN2ZyszQ01BUFp3akVEN2dJeUE5b0NNd1B1QWpRRDJnSTFBOEFBdGdQdVFIWkQ3R0IyUSs1QWRvUHNRSGJEOWVCMnc4d0F0d1BNQUxkRDJFQjNnOXpBZDhQdVFIaEQ3S0I0USs2QWVJUHNnSGpEOWlCNHc4d0JPUVBZZ0htRHdBQzZBL1FBZWtQMElIcEQ3QUI2dy9RZ2VzUE1BTHNEekFDN1E4QkF2QVAwd0h4RDlPQjhRKzZBZklQQVlIeUQ3QUI4dy9UZ2ZNUE1BTDBEekFDOVE4eEFmWVB1Z0g1RDdLQitRKzdBZm9Qc2dIN0Q5bUIrdzh3QXZ3UE1BTDlEMklCL2crZ0FaTVFvQUdWRUtDQmxSQXhBWmtRQVFHbkVERVFzQkFCRUxnUVFJTEJFREVhV3hJQkdtZ1NNUzhBRmdFdkdCWkFBakFXTUFFeEZqQ0JNUll3QVRJV0FJRXlGZ0FCTXhaQWhqTVdNSUUyRmpBQk54WXdnVGNXTUFFNEZrQUNPUlpBZ2pvV01BSS9Ga0JrUUJaQWhIVVdRQUo1RmdBbWdCWUFnWk1XQUlHV0ZrQXVJRk5BSEVCVFFBNlJVMEErbVZOQWhMeFRNSUcrVTBBS3YxTkFnc1ZUTUlIR1UwQUV5Rk1CQWNwVFFCVExVekFCMVZNd2dkVlRNQUhXVXpDQjFsTXdBZGRUTUFIWVV6Q0IyRk13QWRsVE1ZSFpVMEFNMmxOQUF1RlRNUUhpVXpDQjRsTXdBZU5UUUlUalUwQ0MrbE1CZ2FsVklGQzRWYklCZ0gyeWdZQjlzZ0dCZmRxQmdYM2FBWUo5czRHQ2ZiTUJnMzI3Z1lsOXV3R0tmYnVCaW4yOEFZdDl1NEdMZlRHYWtIOEJtcUIvTVNnQWdnRW9GSUl4SkZpQ0FTUnNnakV6UUlZQk0yQ0dNU0JRakFFZ1lJd3hJQ0MzQVNBd3R6RWlnUFFCSXBIMEFFSEFqUUlMNHdNQkFKd0dCMDBEQkJBQWp3c0FBQkVBQ0FCVFNsRUFVZ0JUQURwVVZRQlhXVDlkWEFCR1lXTkNaQUJtQUdnQWFnQnNBRzRBQUVBQUFBQUFHZ0NUQUFBZ05RQW5BQ0VBSkNJcUFCTnJiUUFtSkNjVUZoZ2JIRDRlUHg4NVBTSWhRUjVBSlNVbUtDQXFTU3hETGtzd1RESkVRcGtBQUpXUGZYNkRoQktBZ25aM0VudWpmSGg1aXBLWXBxQ0ZBSnFoazNVemxRQ09BSFNabUplV0FBQ2VBSndBb2FBVkxpOHd0TFZPcXFrU0ZCNGhJaUlxTkRXbXB6WWZTZ0FBbHdGYTJoMDJCUURFdzhiRnlNZkt5Y3pMeE5WRjFrTFhSdGpPME5MVTJ0bnU5djRPQncrQW53QWhnS1B0QU1CQXhtRG4yK2Fad0FBQUJtRGNLZjBWRWdZVytOMEdGUktFQ01ZVy85OER3RUFBUm1EZTRHMDNPRGtWRkJjV0FCb1pIQnNBWDdkbFJFY0FUMkpPVUFBQVNBQUFBS09rcFFBQUFBQUF0Z0FBV2dCSUFGdFdXR0JlY0dsdlRRQUFPMmU0QUFCRnFJcUxqS3VzV0ZpdmxMQnZzbHhiWGwxZ1gySmhaR05tWldobkFBQUFBQUFBQUprRENBTUJBNlVERXdNQUEwSURrUU9YQTZrRFJnQkpBRXdBVXdCcEFBY0R2QUpPQUVvQURBTTFCVklGU0FBeEExUUFWd0FLQTFrQVFRQytBZ2dmZ0I4b0g1QWZhQitnSDdvZmhnT3pIOG9maVFQREg2RUQraCtQQS9NZlJBVkdCVHNGVGdVOUJiZ0RZZ1JLcG1BZXlRTnJBT1VBUWJDUkFndkNBVUNwZ0k2QS9JRFRnSXlBallHTkFvRGhnSkdGbWdFQUFSRUFBUVFJQVFnd0NBRVZJQUE1bVRHZGhFQ1VnTmFDcG9CQllvQ21nRmQyK0FLQWo0Q3dRTnNJZ0VIUWdJeUFqNHprQXdHSkFCUW9FQkVDQVJnTEpFc21BUUdHNVlCZ2ViYUJRSkdCdllpVUJZQ1lnTWVDUXpTaUJvQ01ZU2lXMUlER0FRZ0pDNENMQUFhQXdBTVBCb0NiQXdRQUZvQkJVNEdZZ0ppQW5vQ1lnSjZBbUlDZWdKaUFub0NZQjFsam1ZV1poWmtBQUFBQXVRTGdvQjVBbnFaQXV0UUJpZGNCaXZFQkFFR0Frd0lMdEFXbUJZQ0tnS0lBZ01ZREFBTUJnVUgyUUw4WkdJZ0lnRUQ2aGtET0JJQ3dyQUFCQVFDcmdJcUZpWW9Bb29DSmxJK0E1RGlKQTZBQWdKMmEyb3E1aWhnSWw1ZXFndmF2dGdBRE93S0dpWUdNZ0k2QXVRTWZnSk9CbVFHQnVBTUxDUktBblFxQWlvRzRBeUFMZ0pPQmxTaUF1UUVBSHdhQmlvR2RnTHlBaTRDeEFvQzRGQkFlZ1lxQm5JQzVBUVVFZ1pPQm00RzRDeCtBazRHY2dNY0dFSURaQVlhS2lPRUJpSWdBaGNtQm1nQUFnTGFOQkFHRWlvQ2ppSURsR0NnSmdaZ0xnbytEakFFTmdJNkEzWUJDWDRKRHNZS2NncHlCbllHL0NEY0JpaEFncklPemdNQ0JvWUQxRTRHSUJZSkEyZ21BdVFBd0FBRTlpUWltQjVDK2c2OEFJQVNBcDRpTGdaOFpDSUszQUFvQWdyazVnYitGMFJDTUJoZ29FYkcraklDaDNnUkJ2QUNDaW9LTWdveUNqSUdMSjRHSkFRR0VzQ0NKQUl5QWo0eXlvRXVLZ2ZDQy9JQ09nTitmcm9CQjFJQ2pHaVNBM0lYY2dtQnZGWUJFNFlWQkRZRGhHSWtBbTRQUGdZMmh6WUNXZ3V3UEFnT0FtQXlBUUphQm1aR01nS1dIbUlxdGdxOEJHWUdRZ0pTQndTa0pnWXNIZ0tLQWlvQ3lBQkVNQ0lDYWdJME1DSURqaElpQytBRURnR0JQTDRCQWtvOUNQWThRaTQraEFZQkFxQVlGZ0lxQW9nQ0Fyb0NzZ2NLQWxJSkNBSUJBNFlCQWxJUkdoUkFNZzZjVGdFQ2tnVUk4ZzBHQ2dVQ1lpa0N2Z0xXT3Q0S3dHUW1Bam9DeGdxTWdoNzJBaTRHemlJa1pnTjRSQUEyQVFKOENoNVNCdUFxQXBES0VRTUk1RUlDV2dOTW9Bd2lCUU8wZENJR2FnZFE1QUlIcEFBRW9nT1FSR0lSQkFvZ0JRUDhJQTRCQWp4a0xnSitKcHlrZmdJZ3BncTJNQVVHVk1DaUEwWlVPQVFINUtnQUlNSURIQ2dDQVFWcUJWVHFJWURhMmhMcUdpSU5FQ29DK2tMOElnV0JNdHdpRFZNS0NpSThPbllOQWs0Skh1cmFEc1RpTmdKVWdqa1ZQTUpBT0FRUkJCSTFCcllORjM0YnNoMHF1aEd3TUFJQ2QzLzlBN3dCQndKZ0NDMEsrQlFEK0J3QlNDaUFGRENBN0RrQmhFRUFQR0NCREcyQjVIUUR4SUFBTnBrQXVxU0RlcWdBUC95RG5Da0dDRVNIRUZHRkVHUUZJSFNHa3ZBRSs0UUh3QVE0QVFaQ1pBZ3VWQ01DWmhabXVnSWtEQkphQW5vQkJ5WU9MalNZQWdFQ0FJQWtZQlFBUUFKT0Ewb0JBaW9kQXBZQ2xDSVdveHBvYnJLcWlDT0lBamc2QmlSR0Fqd0Nkbk5pS2dKZWdpQXNFbFJpSUFvQ1dtSWFLdEpTQWtidTFFSkVHaVk2UEh3bUJsUVlBRXhDUGdJd0lnbzJCaVFjckNaVUdBUUVCbmhpQWtvS1BpQUtBbFFZQkJCQ1JnSTZCbG9DS09RbVZCZ0VFRUowSWdvNkFrQUFxRUJvSUFBb0tFb3VWZ0xNNEVKYUFqeENaRklHZEF6Z1Fsb0NKQkJDZkFJR09nWkNJQW9Db0NJOEVGNEtYTEpHQ2w0Q0lBQTY1cndHTGhya0lBQ0NYQUlDSkFZZ0JJSUNVZzUrQXZqaWptb1R5cXBPQWp5c2FBZzRUakl1QWtLVUFJSUdxZ0VGTUF3NEFBNEdvQTRHZ0F3NEFBNEdPZ0xnRGdjS2tqNC9WRFlKQ2E0R1FnSm1FeW9LS2hvd0RqWkdOa1kyTUFvNnpvZ09Bd3RpR3FBQ0V4WW1lc0owTWlxdURtYldXaUxUUmdOeXVrSWEybll5QmlhdVpvNmlDaWFPQmlJYXFDcWdZS0FvRVFMKy9RUlVOZ2FVTkR3QUFBSUNlZ2JRR0FCSUdFdzJEakNJRzg0Q01nSStNNUFNQmlRQU5LQUFBZ0k4TEpCaVFxRXAycm9DdWdFQ0VLeEdMcFFBZ2diY3dqNWFJTURBd01EQXdNSVpDSllLWWlEUU1nOVVjZ05rRGhLcUEzWkNmcjQ5Qi8xbS92MkJSL0lKRWpNS3RnVUVNZ28rSmdaT3VqNTZCejZhSWdlYUJ0SUdJcVl3Q0E0Q1duTE9Oc2IwcUFJR0ttNG1XbUp5R3JwdUFqeUNKaVNDb2xoQ0hrNVlRZ3JFQUVRd0lBSmNSaWpLTEtTbUZpREF3cW9DTmhmS2NZQ3VqaTVhRHNHQWhBMEZ0Z2VtbGhvc2tBSW1BakFRQUFRR0E2NkJCYXBHL2diV25pL01nUUlham1ZV1ppdGdWRFEwS29vdUFtWUNTQVlDT2dZMmgrc1MwUVFxY2dyQ3VuNHlkaEtXSm5ZR2pId1NwUUoyUm80T2pnNmVIczBDYlFUYUlsWW1IUUpjcEFLc0JFSUdXaVphSW5zQ1NBWW1WaVpuRnR5bS9nSTRZRUp5cG5JS2NvamlibXJXSmxZbVNqSkh0eUxheWpMS01vMEZicVNuTm5Ja0hsZW1VbXBhTHRNcXNuNWlabzV3QkI2SVFpNitOZzVRQWdLS1JnSmpUTUFBWWpvQ0pocTZsT1FtVkJnRUVFSkdBaTRSQW5iU1JnNU9DbmErVENJQkF0NjZvZzZPdms0QzZxb3lBeHBwQTVLdnp2NTQ1QVRnSWw0NEFnTjA1cG84QWdKdUFpYWN3bElDS3JaS0FvYmhCQm9pQXBKQ0FzSjN2TUFpbGxJQ1lLQWlmallCQlJwSkF2SURPUTVubDdwQkF3MHE3UkM1UDBFSkdZQ0c0UWppR252Q2RrYStQZzU2VWhKSkNyNy8veWlEQmpMOElnSnRYOTRkRTFhbUlZQ0wyUVI2d2dwQWZRWXRKQStxRWpJS0lob2xYWmRTQXhnRUlDUXVBaXdBR2dNQUREd2FBbXdNRUFCYUFRVk9CbUlDWWdKNkFtSUNlZ0ppQW5vQ1lnSjZBbUFkSk02eUpobytBUVhDclJSTkF4THJETUVTekdKb0JBQWlBaVFNQUFDZ1lBQUFDQVFBSUFBQUFBQUVBQ3dZREF3Q0FpWUNRSWdTQWtGRkRZS2Jkb1ZBMGlrRGRnVmFCalYwd1RCNUNIVVhoVTBvQVFiQ2hBZ3RqOWdNZ3BnY0FxUWtBdEFvQXVnc0FQZzBBNEE0Z1Z4SUE2eFlBeWhrZ3dCMWdnQ0FBTGkwQXdERWdpYWNnOEtrQTQ2c0FQdjBBK3dBaE53ZGhBUW9CSFE4aExCSUJ5QlFoMFJraFJ4MEJPV29oQ1kwQnZOUUJxZGNoT3U0QjNxWWlTeE1EQUVHZ29nSUw4Z1N2aWFTQTFvQkNSKytXZ0VENmhFRUlyQUFCQVFESGlxK2VLT1F4S1FnWmlaYUFuWnJhaW82Sm9JaUlnSmNZaUFJRXFvTDJqb0NndFJDUkJva0ppWkNDdHdBeENZS0lnSWtKaVkwQmdyY0FJd2tTZ0pPTEVJcUN0d0E0RUlLVENZbUpLSUszQURFSkZvS0pDWW1SZ0xvaUVJT0lnSTJKajRTNE1CQWVnWW9KaVpDQ3R3QXdFQjZCaWdtSmo0TzJDREFRZzRpQWlRbUprSUxGQXlnQVBZa0p2QUdHaXppSjFnR0lpaW1KdlEySmlnQUFBNEd3a3dHRWlvQ2ppSURqazRDSml4c1FFVEtEakl1QWprSytnb2lJUTUrQ25JS2NnWjJCdjUrSUFZbWdFWWxBam9EMWk0T0xpWW4vaXJ1RXVJbUFuSUdLaFltVmpRRytoSzZRaW9tUWlJdUNuWXlCaWF1TnI1T0hpWVdKOVJDVUdDZ0tRTVc1QkVJK2daS0Erb3dZZ290TC9ZSkFqSURmbjBJcGhlaUJZSFdFaWNRRGlaK0J6NEZCRHdJRGdKWWpnTktCc1pHSmlZV1JqSXFiaDVpTXE0T3VqWTZKaW9DSmlhNk5pd2NKaWFDQ3NRQVJEQWlBcUNTQlFPczRDWWxnVHlPQVF1Q1BqNDhSbDRKQXY0bWtnRUs4Z0VEaGdFQ1VoRUVraVVWV0VBeURweE9BUUtTQlFqd2ZpVUZ3Z1VDWWlrQ3VnclNPbm9tT2c2eUt0SWtxbzQyQWlTR3JnSXVDcjQwN2dJdlJpeWhBbjR1RWlTdTJDREVKZ29pQWlRa3loRUMva1lpSkdOQ1RpNGxBMURHSW1vSFJrSTZKMEl5SGlkS09nNGxBOFk1QXBJbkZLQWtZQUlHTGlmWXhNb0NiaWFjd0g0Q0lpcTJQUVpRNGg0K0p0NVdBamZrcUFBZ3dCNG12SUFnbmlVRklnMkJMYUlsQWhZUzZocGlKUS9RQXRqUFFnSXFCWUV5cWdWVEZJaTg1aHAyRFFKT0NSWWl4UWYrMmc3RTRqWUNWSUk1RlR6Q1FEZ0VFUVFTR2lJbEJvWTFGMVlic05JbFNsWWxzQlFWQTd3QkJvS2NDQzZNUytnWUFoQWtBOEFvQWNBd0E5QTBBU2hBZ0doZ2dkQnNnM1NBQURLZ0FXcW9nR3Y4QXJRNEJPQklod1JVaDVSa2hxaDBoak5GQlN1RWg4QUVPQUFBQUFFRmtiR0Z0TEVGa2JHMEFRV2h2YlN4QmFHOXRBRUZ1WVhSdmJHbGhibDlJYVdWeWIyZHNlWEJvY3l4SWJIVjNBRUZ5WVdKcFl5eEJjbUZpQUVGeWJXVnVhV0Z1TEVGeWJXNEFRWFpsYzNSaGJpeEJkbk4wQUVKaGJHbHVaWE5sTEVKaGJHa0FRbUZ0ZFcwc1FtRnRkUUJDWVhOellWOVdZV2dzUW1GemN3QkNZWFJoYXl4Q1lYUnJBRUpsYm1kaGJHa3NRbVZ1WndCQ2FHRnBhM04xYTJrc1FtaHJjd0JDYjNCdmJXOW1ieXhDYjNCdkFFSnlZV2h0YVN4Q2NtRm9BRUp5WVdsc2JHVXNRbkpoYVFCQ2RXZHBibVZ6WlN4Q2RXZHBBRUoxYUdsa0xFSjFhR1FBUTJGdVlXUnBZVzVmUVdKdmNtbG5hVzVoYkN4RFlXNXpBRU5oY21saGJpeERZWEpwQUVOaGRXTmhjMmxoYmw5QmJHSmhibWxoYml4QloyaGlBRU5vWVd0dFlTeERZV3R0QUVOb1lXMHNRMmhoYlFCRGFHVnliMnRsWlN4RGFHVnlBRU5vYjNKaGMyMXBZVzRzUTJoeWN3QkRiMjF0YjI0c1dubDVlUUJEYjNCMGFXTXNRMjl3ZEN4UllXRmpBRU4xYm1WcFptOXliU3hZYzNWNEFFTjVjSEpwYjNRc1EzQnlkQUJEZVhKcGJHeHBZeXhEZVhKc0FFUmxjMlZ5WlhRc1JITnlkQUJFWlhaaGJtRm5ZWEpwTEVSbGRtRUFSR2wyWlhOZlFXdDFjblVzUkdsaGF3QkViMmR5WVN4RWIyZHlBRVIxY0d4dmVXRnVMRVIxY0d3QVJXZDVjSFJwWVc1ZlNHbGxjbTluYkhsd2FITXNSV2Q1Y0FCRmJHSmhjMkZ1TEVWc1ltRUFSV3g1YldGcFl5eEZiSGx0QUVWMGFHbHZjR2xqTEVWMGFHa0FSMlZ2Y21kcFlXNHNSMlZ2Y2dCSGJHRm5iMnhwZEdsakxFZHNZV2NBUjI5MGFHbGpMRWR2ZEdnQVIzSmhiblJvWVN4SGNtRnVBRWR5WldWckxFZHlaV3NBUjNWcVlYSmhkR2tzUjNWcWNnQkhkVzVxWVd4aFgwZHZibVJwTEVkdmJtY0FSM1Z5YlhWcmFHa3NSM1Z5ZFFCSVlXNHNTR0Z1YVFCSVlXNW5kV3dzU0dGdVp3QklZVzVwWm1sZlVtOW9hVzVuZVdFc1VtOW9ad0JJWVc1MWJtOXZMRWhoYm04QVNHRjBjbUZ1TEVoaGRISUFTR1ZpY21WM0xFaGxZbklBU0dseVlXZGhibUVzU0dseVlRQkpiWEJsY21saGJGOUJjbUZ0WVdsakxFRnliV2tBU1c1b1pYSnBkR1ZrTEZwcGJtZ3NVV0ZoYVFCSmJuTmpjbWx3ZEdsdmJtRnNYMUJoYUd4aGRta3NVR2hzYVFCSmJuTmpjbWx3ZEdsdmJtRnNYMUJoY25Sb2FXRnVMRkJ5ZEdrQVNtRjJZVzVsYzJVc1NtRjJZUUJMWVdsMGFHa3NTM1JvYVFCTFlXNXVZV1JoTEV0dVpHRUFTMkYwWVd0aGJtRXNTMkZ1WVFCTFlYbGhhRjlNYVN4TFlXeHBBRXRvWVhKdmMyaDBhR2tzUzJoaGNnQkxhRzFsY2l4TGFHMXlBRXRvYjJwcmFTeExhRzlxQUV0b2FYUmhibDlUYldGc2JGOVRZM0pwY0hRc1MybDBjd0JMYUhWa1lYZGhaR2tzVTJsdVpBQk1ZVzhzVEdGdmJ3Qk1ZWFJwYml4TVlYUnVBRXhsY0dOb1lTeE1aWEJqQUV4cGJXSjFMRXhwYldJQVRHbHVaV0Z5WDBFc1RHbHVZUUJNYVc1bFlYSmZRaXhNYVc1aUFFeHBjM1VzVEdsemRRQk1lV05wWVc0c1RIbGphUUJNZVdScFlXNHNUSGxrYVFCTllXdGhjMkZ5TEUxaGEyRUFUV0ZvWVdwaGJta3NUV0ZvYWdCTllXeGhlV0ZzWVcwc1RXeDViUUJOWVc1a1lXbGpMRTFoYm1RQVRXRnVhV05vWVdWaGJpeE5ZVzVwQUUxaGNtTm9aVzRzVFdGeVl3Qk5ZWE5oY21GdFgwZHZibVJwTEVkdmJtMEFUV1ZrWldaaGFXUnlhVzRzVFdWa1pnQk5aV1YwWldsZlRXRjVaV3NzVFhSbGFRQk5aVzVrWlY5TGFXdGhhM1ZwTEUxbGJtUUFUV1Z5YjJsMGFXTmZRM1Z5YzJsMlpTeE5aWEpqQUUxbGNtOXBkR2xqWDBocFpYSnZaMng1Y0doekxFMWxjbThBVFdsaGJ5eFFiSEprQUUxdlpHa3NUVzlrYVFCTmIyNW5iMnhwWVc0c1RXOXVad0JOY204c1RYSnZid0JOZFd4MFlXNXBMRTExYkhRQVRYbGhibTFoY2l4TmVXMXlBRTVoWW1GMFlXVmhiaXhPWW1GMEFFNWhibVJwYm1GbllYSnBMRTVoYm1RQVRtVjNYMVJoYVY5TWRXVXNWR0ZzZFFCT1pYZGhMRTVsZDJFQVRtdHZMRTVyYjI4QVRuVnphSFVzVG5Ob2RRQk9lV2xoYTJWdVoxOVFkV0ZqYUhWbFgwaHRiMjVuTEVodGJuQUFUMmRvWVcwc1QyZGhiUUJQYkY5RGFHbHJhU3hQYkdOckFFOXNaRjlJZFc1bllYSnBZVzRzU0hWdVp3QlBiR1JmU1hSaGJHbGpMRWwwWVd3QVQyeGtYMDV2Y25Sb1gwRnlZV0pwWVc0c1RtRnlZZ0JQYkdSZlVHVnliV2xqTEZCbGNtMEFUMnhrWDFCbGNuTnBZVzRzV0hCbGJ3QlBiR1JmVTI5blpHbGhiaXhUYjJkdkFFOXNaRjlUYjNWMGFGOUJjbUZpYVdGdUxGTmhjbUlBVDJ4a1gxUjFjbXRwWXl4UGNtdG9BRTl5YVhsaExFOXllV0VBVDNOaFoyVXNUM05uWlFCUGMyMWhibmxoTEU5emJXRUFVR0ZvWVhkb1gwaHRiMjVuTEVodGJtY0FVR0ZzYlhseVpXNWxMRkJoYkcwQVVHRjFYME5wYmw5SVlYVXNVR0YxWXdCUWFHRm5jMTlRWVN4UWFHRm5BRkJvYjJWdWFXTnBZVzRzVUdodWVBQlFjMkZzZEdWeVgxQmhhR3hoZG1rc1VHaHNjQUJTWldwaGJtY3NVbXB1WndCU2RXNXBZeXhTZFc1eUFGTmhiV0Z5YVhSaGJpeFRZVzF5QUZOaGRYSmhjMmgwY21Fc1UyRjFjZ0JUYUdGeVlXUmhMRk5vY21RQVUyaGhkbWxoYml4VGFHRjNBRk5wWkdSb1lXMHNVMmxrWkFCVGFXZHVWM0pwZEdsdVp5eFRaMjUzQUZOcGJtaGhiR0VzVTJsdWFBQlRiMmRrYVdGdUxGTnZaMlFBVTI5eVlWOVRiMjF3Wlc1bkxGTnZjbUVBVTI5NWIyMWlieXhUYjNsdkFGTjFibVJoYm1WelpTeFRkVzVrQUZONWJHOTBhVjlPWVdkeWFTeFRlV3h2QUZONWNtbGhZeXhUZVhKakFGUmhaMkZzYjJjc1ZHZHNad0JVWVdkaVlXNTNZU3hVWVdkaUFGUmhhVjlNWlN4VVlXeGxBRlJoYVY5VWFHRnRMRXhoYm1FQVZHRnBYMVpwWlhRc1ZHRjJkQUJVWVd0eWFTeFVZV3R5QUZSaGJXbHNMRlJoYld3QVZHRnVaM1YwTEZSaGJtY0FWR1ZzZFdkMUxGUmxiSFVBVkdoaFlXNWhMRlJvWVdFQVZHaGhhU3hVYUdGcEFGUnBZbVYwWVc0c1ZHbGlkQUJVYVdacGJtRm5hQ3hVWm01bkFGUnBjbWgxZEdFc1ZHbHlhQUJWWjJGeWFYUnBZeXhWWjJGeUFGWmhhU3hXWVdscEFGZGhibU5vYnl4WFkyaHZBRmRoY21GdVoxOURhWFJwTEZkaGNtRUFXV1Y2YVdScExGbGxlbWtBV1drc1dXbHBhUUJhWVc1aFltRjZZWEpmVTNGMVlYSmxMRnBoYm1JQVFkQzVBZ3V4Rk1BWm1VV0ZHWmxGcmhtQVJZNFpnRVdFR1paRmdCbWVSWUFaNFdCRnBobUVSWVFaZ1EyVEdlQVBONE1yZ0JtQ0t3R0RLNEFaZ0NzRGdDdUFHWUFyZ0JtQ0t3Q0FLd0NUS3dDK0s0MGFqeXZnSkIyQk4rQklIUUNsQlFHeEJRR0NCUUMyTkFlYU5BT0ZOQXFFQklBWmhRU0FHWTBFZ0JtQUJBQ0FCSUFabndTQUdZa0VpamVaQklBMzRBc0VnQm1oQkkySEFMdUhBWUtIcndTeGtRMjZZd0dDWTYxN0FZNTdBSnRRQVlCUUFJcUhOSlFFQUpFRUNvNEVnQm1jQk5BZmd6ZU9INEVabVIrREN3Q0hDd0dCQ3dHVkN3Q0dDd0NBQ3dLREN3R0lDd0dCQ3dHREN3ZUFDd09CQ3dDRUN3R1lDd0dDTGdDRkxnT0JMZ0dWTGdDR0xnQ0JMZ0NCTGdDQkxnR0FMZ0NFTGdPQkxnR0NMZ0tBTGdhRExnQ0FMZ2FRTGdtQ0xBQ0lMQUNDTEFDVkxBQ0dMQUNCTEFDRUxBR0pMQUNDTEFDQ0xBR0FMQTZETEFHTExBYUdMQUNDY0FDSGNBR0JjQUdWY0FDR2NBQ0JjQUNFY0FHSWNBR0JjQUdDY0FhQ2NBT0JjQUNFY0FHUmNBbUJqZ0NGamdLQ2pnQ0RqZ0tCamdDQWpnQ0JqZ0tCamdLQ2pnS0xqZ09FamdLQ2pnQ0RqZ0dBamdXQWpnMlVqZ1NNa0FDQ2tBQ1drQUNQa0FLSGtBQ0NrQUNEa0FhQmtBQ0NrQVNEa0FHSmtBYUlrSXc4QUlJOEFKWThBSWs4QUlROEFZZzhBSUk4QUlNOEJvRThCb0E4QUlNOEFZazhBSUU4REl4UEFJSlBBTEpQQUlKUEFJVlBBNDlQQVpsUEFJS0JBSkdCQXBlQkFJaUJBSUNCQVlhQkFvQ0JBNFdCQUlDQkFJZUJCWW1CQVlLQkM3bVNBNEFabTVJa2dVUUFnRVFBaEVRQWwwUUFnRVFBbGtRQmhFUUFnRVFBaFVRQmlVUUJnMFFmeDVNQW81TURwcE1BbzVNQWpwTUFocE9ER1lHVEpPQS9YcVVuQUlBbkJJQW5BYW9uZ0JtREorQ2ZNTWdtQUlNbUFZWW1BSUFtQUlNbUFhZ21BSU1tQWFBbUFJTW1BWVltQUlBbUFJTW1BWTRtQUxnbUFJTW1BY0ltQVo4bUFwa21CZFVYQVlVWEFlSWZFcHhtQXNwNmdobUtlZ2FNaUFDR2lBcVVNb0VaQ0pNUkM0eUpBSUtKQUlHSkM5MUFBWWxBQllsQUJZRmJnUm1BVzRBWmlGc0FpVnNGMkZzR3Fsc0V4UklKbmtjQWkwY0RpMGNEZ0VjQ2kwZWRpZ0dFaWdxcllRT1pZUVdLWVFLQllaOUFteEFCZ1JDK2l3Q2Npd0dLaXdXSml3V05pd0dRTno3TEJ3T3NCd0svaGJNS0I0TUt0MFlDamtZQ2drYXZaNGdkQnFvbkFZSW5oNFVIZ2plQUdZdzNnQm1HTjRNWmdEZUZHWUEzZ2htQk40QVpCS1ZGaEN1QUhiQkZoQ3VEUllRcmpFV0FIY1ZGZ0N1NU53Q0VOK0NmUlpVckFZVXJBYVVyQVlVckFZY3JBSUFyQUlBckFJQXJBSjRyQWJRckFJNHJBSTByQVlVckFKSXJBWUlyQUlnckFJc1pnVGZXR1FDS0dZQkZBWW9aZ0VXT0dRQ01SUUtmR1ErZ053NmxHWUFyZ2htQlJZVVpnRVdhR1lCRmtCbW9SWUlaQStJMkdSaUtHUlRqUHhuZ253L2lFeGtCbnhrQTRBZ1pyaWdBcmlnQW4wWGdFeG9FaGhxbEp3Q0FKd1NBSndHM2xBYUJsQTJBbEpZbUNJWW1BSVltQUlZbUFJWW1BSVltQUlZbUFJWW1BSVltQUo4ZDBoa3NtUzhBMkM4TDRIVXZHWXNaQTRRWmdDK0FHWUF2bUJtSUw0TTNnVENIR1lNdmd4a0ExVFVCZ1RlQkdZSTFnQm5aUFlFWmdqMEVxZzBBM1RBQWp4bWZEYU1aQzQ4OW5qQUF2eG1lTU5BWnJqMkFHZGM5NEVjWjhBbGZMNzhaOEVHY0x3TGtMSnNDdHBzSXIwcmd5NWNUM3gzWENBZWhHZUFGUllJWnRFVUJpRVVwaWtXc2hnS0pHUVczZGdmRmZBZUxmQVdmSDYwK2dCbUFQcU41Q29CNW5EQUN6VG9BZ0JtSk9nT0JPcDVlQUxZV0NJMFdBWWtXQVlNV24xN0NqQmVFakpaVkNZVW1BWVVtQVlVbUNJWW1BSVltQUtwRmdCbUlSWUFyZzBXQkdRUFBGNjFWQVlsVkJmQWJRekFMbGpBRHNEQndFS1BoRFM4QjRBa3ZKWVpGQzRRRkJKazBBSVEwQUlBMEFJRTBBSUUwQUlrMDRCRUVFT0VLQklFWkQ3OEVBYlVFSjQwRUFZODNpUmtGalRlQkhhSVpBSklaQUlNWkE0UUVBT0FtQkFHQUdRQ2ZHWmxGaFJtWlJZb1ppVDJBR2F3OWdSbWVNQUtGTUFHRk1BR0ZNQUdDTUFLR0dRQ0dHUW1FR1FHTFNRQ1pTUUNTU1FDQlNRQ09TUUdOU1NIZ0dra0VnaGtEckJrQ2lCbk9Ld0NNR1FLQUt5NnNHWUEzWUNHY1N3S3dFdzZBTjVvWkE2TnBDSUpwbWlrRXFtc0VuWllBZ0phamJBT05iQ25QSHE5K25YSUJpWElGbzNFRG8zRURweVFIc3hRS2dCUmdMK0RXU0FpVlNBbUhTR0EzaFJ3QmdCd0FxeHdBZ1J3Q2dCd0JnQnlWTmdDSU5wOTBubDhIaUY4dmtqTUFnVE1FaERPYmR3S0FkNWxNQklCTVA1OVlsMWNEazFjQnJWZURQd0NCUHdTSFB3Q0NQd0NjUHdHQ1B3T0pQd2FJUHdhZmJwOXFINlpSQTR0UkNMVUdBb1lHbFRrQmh6bVNPQVNIT0pGNEJvTjRDNFo0VDhodk5ySm9ETEpvQm9Wb3B6RUhpVEZneFo0RUFLbWFBSUthQVlHYVRhZHRCNm1DVlpzWUU1WWxDTTBPQTUwT0RvQU93VHNLZ0RzQm1JTUdpWU1GdEJVQWtSVUhwazRJMzMwQWs0RUtrVUVBcTBGQWhsMEFnRjBBZzEwQWpsMEFpbDBGdWtNRWlVTUZneW9BaHlvQmdTb0JsU29BaGlvQWdTb0FoQ29BZ0RlSUtnR0JLZ0dDS2dHQUtnV0FLZ1NHS2dHR0tnS0VLbUFxMjJJQWhHSWR4NVVIaVpWZ1JiVi9BYVYvSWNSYUNvbGFCWXhiRXJpTkJvbU5OWm9DQVk0Q0E0OENZRis3SVdBRDBwa0xnSm1HSUFHQUlBR0hJQUNCSUFDZElBQ0JJQUdMSUFpSklFV0hZQUd0WUFHS1lCckhuQWZTaEJ5NGRXQ21pQXdBckF3QWpRd0puQXdDbjFJQmxWSUFqVkpJaGxNQWdWTUFxMU1DZ0ZNQWdWTUFpRk1IaVZNRmhTMEFnUzBBcEMwQWdTMEFoUzBHaVMxZzFaaE5ZRmFBU2c2eGpneUFqdU01RzJBRjRBNGJBSVFiQ3VCakcycGI0ODRqQUlnamIyYmg1Z053RVZqaDJBZ0dubHdBaVZ3RGdWeGZuUWtCaFFrSnhYTUppWE1BaG5NQWxITUVrbk5pVDlwVVlBVEtXUU80V1FhUVdUK0FqNEJrZ1JtQVFncUJMdzN3QjVlUEIrS2ZqK0YxUWltSWozQVNsb0E5NEwwMU1JSTFFSU05QitFclpHaWo0QW9pQkl3aUFvZ2lCb2tpQVlNaWd4bHdBdnZnbFJrSnBoa0J2Um1DTjVBWmh6ZUJHWVkzblJtRE43b1pGc1VyWURtVEdRdldHUWlZR1dBbTFCa0F4aGtBZ1JrQmdCa0JnUmtCZ3hrQWl4a0FnQmtBaGhrQXdCa0FneGtCaHhrQWhoa0FteGtBZ3hrQWhCa0FnQmtDaGhrQTRQTVpBZURER1FHeEdlSXJnQTZFZ0FDT2dHVHZoaWdBa0NnQmhpZ0FnU2dBaENoZ2RLeGxBbzFsQVlsbEE0RmxZUSs1bUFTQW1HU2Y0R1JXQVk5V0tNc0JBNGtCQTRFQllyRERHVXU4R1dCaGd3UUFtZ1FBZ1FRQWdBUUJnQVFBaVFRQWd3UUFnQVFBZ0FRRmdBUURnQVFBZ0FRQWdBUUFnZ1FBZ1FRQWdBUUJnQVFBZ0FRQWdBUUFnQVFBZ0FRQWdRUUFnQVFCZ3dRQWhnUUFnd1FBZ3dRQWdBUUFpUVFBa0FRRWdnUUFoQVFBa0FRemdRUmdyYXNaQStBREdRdU9HUUdPR1FDT0dRQ2tHUW5nVFJrM21SbUFOWUVaREtzWkE0Z1pCb0VaRFlVWllEbmpkeGtIakJrQ2pCa0M0Qk1aQzlnWkJvc1pFNHNaQTdjWkI0a1pCYWNaQjUwWkFZRVpUZUFZR1FEUkdRRGdKaGtMalJrQmhCa0NnaGtFaGhrSW1Ca0doaGtJZ2hrTWhoa280RElaQUxZWkpJa1pZNlh3bG4wdkllL1VMd3JnZlM4QjhBWWhMdzN3RE5BdmE3N2h2UzlsZ2ZBQzZpOTYzRldBR1IzZkdXQWY0STgzQUVHUXpnSUxzZ3VDd1FBQUFTc0JBQUFCS3h3QURBRkZnSklBQUFJZGF3QUNIU2dCQWgxRkFBSWRLSUVEQUFBRkJER0hrWm9OQUFBRkJER0hrWm9BQXdTSGtRRUFBQVVFTVllUm1oOEFBQWdCQkZCUmVER0Nod2tBQ2dJRWh3a0FDUU1Fa1pvRkFBQUNCSWRpQUFBQ0JER0Ird0FBRFFzZktpd3VQRVZQY0gyT2tKVUFEQXNmS2l3dVBFVlBjSTZRbFJBQUFCUUxIeUV0VXlvc0xqeE9UMkJ3UTRHR2pZNlFsUUFWQ3g4aExWTXFMQzQ4UjA1UFlIQkRnWWFOanBDVkNRUWZJVHRPZFFBSkF3c1ZoblVBQ1FJdVhYVUFDUUlzUVlCMUFBMENLbzZBY1FBSkFqeGdnczhBQ1FNVlhvcUFNQUFBQWlkRmhiZ0FBUVFSTW9tSWdFb0FBUUpiZGdBQUFBSmJkb1JKQUFBRUN4OHFQQUFCSHdBRUN4OHFQQUFDSHlvQUFSOEJBZ3NmQUFJZmZRQUNDeDhBQWg5OUFBWWZQRTl3anBBQUFSOEJBaDk5QVFFZkFBSWZmUUFDQ3g4R0FSOEFBaDlnQUFJTEh3RUJId0FDQ3g4REFSOEFDQXNmS2p4Z2NKQ1ZBQUlmS2dBREh5bzhBUUlMSHdBQkN3RUNIeW9BQVdDQVJBQUJBU3MxQUFBQ0hZZUJ0UUFBQWtWYmdEOEFBQU1mS2tXTTBRQUFBaDBvZ1R3QUFRWU5NQzgxUFpzQUJRMHdMelU5QVFBQUFTOEFBQWtHRFRBdk5UMmJBQUFBQlEwd0x6VTlCd1lOTUM4MVBac0RCUTB3THpVOUNRQURBZzB2QVFBQUJRMHdMelU5QkFJMVBRQUFBQVVOTUM4MVBRTUFBUU12TlQwQkFTOVlBQU1DTlQwQ0FBQUNOVDFaQUFBR0RUQXZOVDJiQUFJMVBZQVNBQThCTHg4QUl3RXZPd0FuQVM4M0FEQUJMdzRBQ3dFdk1nQUFBUzlYQUJnQkx3a0FCQUV2WHdBZUFTL0FNZThBQUFJZEtJQVBBQWNDTDBXQXB3QUNEaDhoTEM1QlBEdE9UMXBnUTQyVkFnMGZJU3d1UVR3N1RscGdRNDJWQXdzZklTd3VRVHRPV2tPTmxZQTJBQUFDQ3g4QUFBQUNINDQ1QUFBRFBrVmVnQjhBQUFJUU9zQVRvUUFBQWdTUkNRQUFBZ1NSUmdBQkJRMHdMelU5Z0prQUJBWU5NQzgxUFpzSkFBQUNOVDBzQUFFQ05UMkEzd0FDQWh4SkF3QXNBeHhJU1FJQUNBSWNTWUVmQUJzQ0JCcVBoQUFBQWlxT0FBQUFBaXFPTmdBQkFpcU9qQklBQVFJcWpnQUFBQUlxanNCY1N3QURBU0tXT3dBUkFTK2VYUUFCQVMvT3pTMEFBRU51TEZWdVlYTnphV2R1WldRQVRIVXNWWEJ3WlhKallYTmxYMHhsZEhSbGNnQk1iQ3hNYjNkbGNtTmhjMlZmVEdWMGRHVnlBRXgwTEZScGRHeGxZMkZ6WlY5TVpYUjBaWElBVEcwc1RXOWthV1pwWlhKZlRHVjBkR1Z5QUV4dkxFOTBhR1Z5WDB4bGRIUmxjZ0JOYml4T2IyNXpjR0ZqYVc1blgwMWhjbXNBVFdNc1UzQmhZMmx1WjE5TllYSnJBRTFsTEVWdVkyeHZjMmx1WjE5TllYSnJBRTVrTEVSbFkybHRZV3hmVG5WdFltVnlMR1JwWjJsMEFFNXNMRXhsZEhSbGNsOU9kVzFpWlhJQVRtOHNUM1JvWlhKZlRuVnRZbVZ5QUZOdExFMWhkR2hmVTNsdFltOXNBRk5qTEVOMWNuSmxibU41WDFONWJXSnZiQUJUYXl4TmIyUnBabWxsY2w5VGVXMWliMndBVTI4c1QzUm9aWEpmVTNsdFltOXNBRkJqTEVOdmJtNWxZM1J2Y2w5UWRXNWpkSFZoZEdsdmJnQlFaQ3hFWVhOb1gxQjFibU4wZFdGMGFXOXVBRkJ6TEU5d1pXNWZVSFZ1WTNSMVlYUnBiMjRBVUdVc1EyeHZjMlZmVUhWdVkzUjFZWFJwYjI0QVVHa3NTVzVwZEdsaGJGOVFkVzVqZEhWaGRHbHZiZ0JRWml4R2FXNWhiRjlRZFc1amRIVmhkR2x2YmdCUWJ5eFBkR2hsY2w5UWRXNWpkSFZoZEdsdmJnQmFjeXhUY0dGalpWOVRaWEJoY21GMGIzSUFXbXdzVEdsdVpWOVRaWEJoY21GMGIzSUFXbkFzVUdGeVlXZHlZWEJvWDFObGNHRnlZWFJ2Y2dCRFl5eERiMjUwY205c0xHTnVkSEpzQUVObUxFWnZjbTFoZEFCRGN5eFRkWEp5YjJkaGRHVUFRMjhzVUhKcGRtRjBaVjlWYzJVQVRFTXNRMkZ6WldSZlRHVjBkR1Z5QUV3c1RHVjBkR1Z5QUUwc1RXRnlheXhEYjIxaWFXNXBibWRmVFdGeWF3Qk9MRTUxYldKbGNnQlRMRk41YldKdmJBQlFMRkIxYm1OMGRXRjBhVzl1TEhCMWJtTjBBRm9zVTJWd1lYSmhkRzl5QUVNc1QzUm9aWElBUWREWkFndXdDQTRBQUFBK0FBQUF3QUVBQUFBT0FBQUE4QUFBQUFCL0FBQUFnQU1CQUFBOFFWTkRTVWxmU0dWNFgwUnBaMmwwTEVGSVpYZ0FRbWxrYVY5RGIyNTBjbTlzTEVKcFpHbGZRd0JFWVhOb0FFUmxjSEpsWTJGMFpXUXNSR1Z3QUVScFlXTnlhWFJwWXl4RWFXRUFSWGgwWlc1a1pYSXNSWGgwQUVobGVGOUVhV2RwZEN4SVpYZ0FTVVJUWDBKcGJtRnllVjlQY0dWeVlYUnZjaXhKUkZOQ0FFbEVVMTlVY21sdVlYSjVYMDl3WlhKaGRHOXlMRWxFVTFRQVNXUmxiMmR5WVhCb2FXTXNTV1JsYndCS2IybHVYME52Ym5SeWIyd3NTbTlwYmw5REFFeHZaMmxqWVd4ZlQzSmtaWEpmUlhoalpYQjBhVzl1TEV4UFJRQk9iMjVqYUdGeVlXTjBaWEpmUTI5a1pWOVFiMmx1ZEN4T1EyaGhjZ0JRWVhSMFpYSnVYMU41Ym5SaGVDeFFZWFJmVTNsdUFGQmhkSFJsY201ZlYyaHBkR1ZmVTNCaFkyVXNVR0YwWDFkVEFGRjFiM1JoZEdsdmJsOU5ZWEpyTEZGTllYSnJBRkpoWkdsallXd0FVbVZuYVc5dVlXeGZTVzVrYVdOaGRHOXlMRkpKQUZObGJuUmxibU5sWDFSbGNtMXBibUZzTEZOVVpYSnRBRk52Wm5SZlJHOTBkR1ZrTEZORUFGUmxjbTFwYm1Gc1gxQjFibU4wZFdGMGFXOXVMRlJsY20wQVZXNXBabWxsWkY5SlpHVnZaM0poY0dnc1ZVbGtaVzhBVm1GeWFXRjBhVzl1WDFObGJHVmpkRzl5TEZaVEFGZG9hWFJsWDFOd1lXTmxMSE53WVdObEFFSnBaR2xmVFdseWNtOXlaV1FzUW1sa2FWOU5BRVZ0YjJwcEFFVnRiMnBwWDBOdmJYQnZibVZ1ZEN4RlEyOXRjQUJGYlc5cWFWOU5iMlJwWm1sbGNpeEZUVzlrQUVWdGIycHBYMDF2WkdsbWFXVnlYMEpoYzJVc1JVSmhjMlVBUlcxdmFtbGZVSEpsYzJWdWRHRjBhVzl1TEVWUWNtVnpBRVY0ZEdWdVpHVmtYMUJwWTNSdlozSmhjR2hwWXl4RmVIUlFhV04wQUVSbFptRjFiSFJmU1dkdWIzSmhZbXhsWDBOdlpHVmZVRzlwYm5Rc1JFa0FTVVJmVTNSaGNuUXNTVVJUQUVOaGMyVmZTV2R1YjNKaFlteGxMRU5KQUVGVFEwbEpBRUZzY0doaFltVjBhV01zUVd4d2FHRUFRVzU1QUVGemMybG5ibVZrQUVOaGMyVmtBRU5vWVc1blpYTmZWMmhsYmw5RFlYTmxabTlzWkdWa0xFTlhRMFlBUTJoaGJtZGxjMTlYYUdWdVgwTmhjMlZ0WVhCd1pXUXNRMWREVFFCRGFHRnVaMlZ6WDFkb1pXNWZURzkzWlhKallYTmxaQ3hEVjB3QVEyaGhibWRsYzE5WGFHVnVYMDVHUzBOZlEyRnpaV1p2YkdSbFpDeERWMHREUmdCRGFHRnVaMlZ6WDFkb1pXNWZWR2wwYkdWallYTmxaQ3hEVjFRQVEyaGhibWRsYzE5WGFHVnVYMVZ3Y0dWeVkyRnpaV1FzUTFkVkFFZHlZWEJvWlcxbFgwSmhjMlVzUjNKZlFtRnpaUUJIY21Gd2FHVnRaVjlGZUhSbGJtUXNSM0pmUlhoMEFFbEVYME52Ym5ScGJuVmxMRWxFUXdCTWIzZGxjbU5oYzJVc1RHOTNaWElBVFdGMGFBQlZjSEJsY21OaGMyVXNWWEJ3WlhJQVdFbEVYME52Ym5ScGJuVmxMRmhKUkVNQVdFbEVYMU4wWVhKMExGaEpSRk1BUVpEaUFndTBJSUVBS0FDWEFDb0FnWUFxQUpmQUt3QVZnU3dBbHdBdEFJRkFMUUNYQUM0QUZVRXVBSmtCTHdBV0lEQUFRZ2hBQUVLS1JBQkNCRW9BbGdCTUFCZUJUQUJDQWswQVFrTk9BQy9CVHdCQ3cxQUF2MEJTQUVJRFV3QkNDVlVBUWdoYUFKWUFYZ0JDUTE0QWdjQmZBRUlCYUFCQ3dXc0FoUUZ4QUJmRGNRQkVTSE1BUklOM0FFS0RlUUMrQW5zQWwwRjhBRUlCZlFCRUJINEFRZzZBQUVLQmh3QkVoNGtBZ3dTc0FCY0R0Z0NEQXJnQUZBTFFBSllBMFFDQUFOMEFsNERlQUlDQTN3Q1hBT0VBUGtIaEFJREE0UUMrQk9JQXJvUHFBSzZDOGdDdEFmUUFMc0gwQUFOQjlRQURBL3dBZ1VEK0FENENBQUcrd0FFQnZnRURBYjVBQmdHK1FBNEJQZ0lVQWI3QUZRRytBUmNCUklFZEFVUkJNQUZFQWpRQlJJRTFBVVNETmdGRWd6Z0JSSVk2QVVRQlBnR0Z3R0VCcm9LSUFTOUNuUUdFQWJBQmhNQzBBWVJBU2dLRVFFd0NoQUJOQWk0RVZnSXV3WElDSUFGM0FvVEFkd0tFd0l3Q2hJQ05BcTVCbGdLRWdKY0NoQURTQWk3QjBnSWdBZGNDaEFEbEFxNkI4Z0tFQUJJRGhBQXdBeUxCTVFNdWdUSURyb0ZTQTRTQWRnT3VBWGNEaGNDTUE0WEFyQU12QWJjRGdRRERBNFRBMEFPRVFOTURoSURVQTRUQTFRT0VBTmNEaEVEYUE0VEEzQU11UWQwRGhjRGRBNFFBM2dPRlFONERoRURnQTRUQTVBT0VRT2NEaElEb0E0VEE2UU9FQU9zRGhFRHVBNFNBQ1FTQkFEOEVoSVRCQm9TQXhBYUV3YzRHSUFIUUJvVEEwQWFEQTBzSEg4Uk1CNE1YVHdlQkFGNEhnOUptQjBRZGdBZENpWTRIUkJpVEIwSU5ud2NXZ3FVSGhZQ21CNzdBcGdkRURhZ0hSS0N1QnlJQndBZEVnOEFISWdIQ0IwU0R3Z2NpQWNRSFJJTEVCeUlCeGdkRWdzWUhQaEhJQjBTQzBBY2lBZElIUklMU0J5SUIxQWRFZzlRSFBreldCNEJBM0FlK2dOd0hnTURjQjc0QTNRZUFRTjBIdm9EZEI0REEzUWUrQU40SGdFRGVCNzZBM2dlQXdONEh2Z0RmQjRCQTN3Y2dDT0FISUFqa0J5QUk2QWUrQmV3SGdNRHVCNzRBN3dlWFFPOEhnSUR2QnhmQjd3YytSUEFIZ0VEeUI3NkE4Z2VBd1BJSHZnUHpCNERBOUFldWd2VUhnTUQyQno1RDl3ZUF3UGdIcmdQNUI0REErZ2MrQWZzSEFvSDdCNzZEL0FlQVFQNEh2b0QrQjREQS9nZStBUDhIZ0VEL0I1ZUEvd2NlQVFBSWxZUUFDSUZBQkFpWHdBVUlnUUFKQ0pkQUNRaVpnQWtJZ2NBTENJWEFEQWl4QUEwSWhZQU5DTEhBRFFpWEFROElsOEVSQ0xQQUZRaUJ3QmNJbFFVY0NJSEFIZ2dWQWg4SUh3VWdDSU9GSWdnVlJDVUlsd0FxQ0JrQlFBaUJnRUFJdjhCQUNCbEJRUWlCd0VFSXYwQkNDQzJGUWdpQlFFVUlsNEJGQ0pWQ1JnaVhBRWdJbVVCSUNKZUFTQWlCQUVrSWdJQkpDSUVBU2dnQ2dVb0lsUVJMQ0I5Q1RRaUJRRTRJbWNCT0NJTUNUd2lWUWxFSUdRRlVDSnVBVkFnWnhsUUlsOEJYQ0lFQVdBaVhRRmdJbVlCWUNKZkFXQWlCQUZrSWwwQlpDSm1BV1FpYndGa0lsd0JhQ0lGQVdnaVhnRm9JbWNCYUNKVUNXd2lYUUZ3SW1ZQmNDSmZBWEFpQkFGMElsMEJkQ0ptQVhRaWJ3RjBJbHdCZUNJRkFYZ2lYZ0Y0SW1jQmVDQlVDWHdpWlFHSUlQb0ZtQ0w2QWF3aStRWE1JdmdDQkNMNUFnZ2krQUlNSXZnR0pDSVVBaXdpeFFJc0loY0NMQ0xFQWpBaStRSkFJdmdDUkNMN0JrUWkrQVpnSXZrS2JDRVFCblFoRUFaNElSQUdnQ0VRQm9RaEVBYUlJUGdLckNFUUN1QWdnZ3JvSUhrSEtDSjhFR0FralJSb0psOEFjQ2FVRUhRa3JSUjhKbThBaENhRUVJZ2tsUlNRSm1jQW1DU1VOSndrZmpTMEpIdzAwQ1lHQU9nbXpBSU1LbVFDZENwZEFuUXFaZ0owS3ZnQzNDaFVCSHd1QndGc0xnY0NuQzRIQXZBdXRCTUFMclVUQ0M2MkV4QXVEODhZTExZWGdDd01kNHdzdGlQRUxnUUFBRElPQ0RReUVDeE1NaEVJWkRDSUJIQXdpd1J3TUlvRWREQ0pCSGd3aUFSOE1oQUFsRENQQkpneUVnQ2NNaGNBbkRJUUxLd3lFUWpFTUlnRTBEQ0xCTkF3aWdUVU1Ja0UyRENJQk53eUVBRDBNSU1JOURJU0FQd3lGd0Q4TUxVcE1EQjlGVVF5ZnlsTU1yUlZaREFPSFpBeEJCNEFNaVlDRERDbkJnd3lwUVlRTWlRQ0ZEQ2xCaFF5cHdvVU1pUUNIREk5QWh3eU5nSWNNUVJLSURBTUNrUXlaQUpRTW8wU1VEQ09EbGd3dEI1Z01yNFNiREtIQ25ReTFBSjhNczBDZkRJV0Fud3lER0tBTUkwS3NEQ05GclF5WHdLOE1vUVN3REtWQnNneVhBTE1NbVVDekRKZUFzd3lad0xNTXJSZTBESVhBdnd5ekFjQU1zY0RBRExNQXdRd3hRY0VNdGNEQkRMTUF3Z3l4UWNJTU13SEREREdCd3d5RkFNUU1zVURFRERPQnhBeUZBTVVNdFVERkRMZUF4UXkxd01VTXNRREdERFZCeGd5endNWU1zUUhIRExQQXh3eTFBTWdNczBESURMR0J5QXd2UXNrTU1VSEtETFhBeWd5eEFNc01zMERMRExXQXl3eXh3TXNNTHdITURMV0F6QXl6d013TXRRRE5ETEZBelF5MWdNME1oY0RORExFQ3pneXpRTThNc1lEUERJWEF6d3l4QWRBTXM4RFFETEVCMFF5MXdORU1zd0RTRElWQTBneTFnTklNaGNEU0RETUIwd3l4Z2RNTXMwRFVESVdBMUF5eHdOUU1zd0RWRElWQTFReTFnTlVNc2NEVkRDRUYxZ3dsaGRnTXBRTGJESmxBM0F3WGdkd01tUURkREpkQjNRd25BZDRNaFlMZURJbkEzd3cvQk9BTW1RRGlESnRBNGd5L2crSU1HVUxrREFWQzVRdy9RK1lNTWNIbkRJVkE2QXl4Z2VnTWhVRHBEQWVCNlF5SkFPb01sMERxREJtQzZneWRnT3NNamNEckREOEk3QXdGQWZBTW00RHdESmZCOEF5YmdQRU1tY0R4REJjRjhneVpnUFFNRjhIMERCbEI5UXlYd1BVTW13RDJESmxBOWd3WGd2WU1HWUgzREtFRStBd2xSZm9NSmNYOERDVkIvd3lad1A4TUF3R25LWUVBM0NrREFmNHBBd0xYS29GQTJpcUNGRUErZ245S1BvSS9hajRDb1lvK0VBR2JQb0l2bkQ2UXhiTStsd0hBUGhuQndENC9RY0UrcjhMRVBvUkJ4ejZ0Qk1nK2dVREtQZ1NEeWo2Z0E4dytvQUxPUG9TQXp6NGdBZEErSU1IUVBxNkUwVDZGd05NK0xUSFVQcTNMOUQ0dmlmbytMUUwvUGk4dkFEK2xnaGMvc2NBWVA2OEhHVCt2L3h3L3BZRThQNjlrUFQ4eElGUS9NWnRrUHpFQmZEK3pnM3cvc1VCK1A3MkFmais3d0g0L3N3Qi9Qd01GaEQrdEFZdy9GY09NUHkxR2pqOER6SkUvbGNhWFA2OEJuRCtGQUowL0w0V2RQNjA2b0Q4dlJMMC9IMi9BUHgvQjF6K3RYOWcvZ1FEb1B4OVA2RDhmZy9BL0g0UHlQeCtEOUQrZmdmWS9nd2Y0UDVLQkprU1N3Q3BFRW9GTFJCTEIwa1FTd2k1RkVvRnVSWklBVGthU2cxZDBFc051ZEI4TkFIVWZqUVoxSHcwTmRaK0RFM1VmaVJWMUh3MGFkUitOSUhVVkVDZDFuME12ZFo5Rk1YVWZEVFIxSDQwNmRaVURRWFVmUkVOMW40TkZkUitOUjNXVkIwNTFuNE5TZFIrTlZIVWZEVnQxSDQxaGRSOE5hSFVmalc1MUh3MTFkUitOZTNVZkRZSjFINDJJZFI4TmozVWZqWlYxSHcyY2RSK05vblVEQWFsMW53aXFkWUZBcm5XZmc2NTFnVUN3ZForTXNIV0J3TFoxTFFPM2RaK0l1SFdCd0x4MW53TzlkWUhBdm5XZkRMOTFnVURGZFMyRHhYV2ZDTWQxZ1VETGRaK0R5M1dCUU0xMW40ek5kWUhBMDNVdEE5UjFuNGpWZFlIQTJYV2ZBOXAxZ2NEYmRaOE0zSFdCUU9KMUxZUGlkWjhJNUhXQlFPaDFuNFBvZFlGQTZuV2ZqT3AxZ2NEd2RTMEU4WFVmaGZOMUh3WDJkUitGK0hVZkJmdDFINFg5ZFMwQ2dIdXRUWUY3QTBLSWU0SEFpWHN0UllwN0F3U05lNEdBa0hzRDNKRjdMUVdnZTYzSW9udURSS2g3cmNpcWU1Y0FRSHdoUlVCOEpRMUVmSWVBU253VndVcDhGMEZMZkI4TlRId1hnbEo4bVlCVGZKZkFVM3lYZ1ZwOGx3QmtmQzhCZ0h5QmdJQjhBeGFFZk1FRWtId0RBWlI4SHdYOGZxd0JBTDRRMFFDK3JFY0p2aEE1RGI0c2h5bStMQUl0dnBBM0xyNlEvMG0rRUx4cHZnQUFBQUFBQUFBQUlBQUFBR0VBQWdBRUFBWUF2QU1JQUFvQURBQVZBSlVBcFFDNUFNRUF3d0RIQU1zQTBRRFhBTjBBNEFEbUFQZ0FDQUVLQVhNQUVBRVNBUlFCSUFFc0FVUUJUUUZUQVdJQmFBRnFBWFlCa2dHVUFha0J1d0hIQWRFQjFRRzVBdGNCT3dEWkFkc0J0d0RoQWZ3QkRBSVlBaDBDSXdJbkFxTURNd0kvQWtJQ1N3Sk9BbEVDWFFKZ0Fta0NiQUp2QW5VQ2VBS0JBb29DbkFLZkFxTUNyd0s1QXNVQ3lRTE5BdEVDMVFMbkF1MEM4UUwxQXZrQy9RSUZBd2tERFFNVEF4Y0RHd01qQXljREt3TXZBelVEUFFOQkEwa0RUUU5SQXdzUFZ3TmJBMThEWXdObkEyc0Rid056QTNrRGZRT0JBNFVEaVFPTkE1RURsUU9aQTUwRG9RUGNFS1VEeVFQTkE5a0QzUVBoQSs4RDhRTTlCRThFbVFUd0JBSUZTZ1ZrQld3RmNBVnpCWm9GK2dYK0JRY0dDd1lVQmhnR0hnWWlCaWdHamdhVUJwZ0duZ2FpQnFzR3JBUHpCcTBEOWdhdUEva0dyd1A4QnN3RC93Yk5Bd0lIemdNRkJ3a0hEUWNSQjRZRE1nYzFCN2tETndjN0I0Z0RVd2VKQTFZSGtBTnJCNG9EZHdld0E0a0hqZ09aQjU4SG93ZU1BN2dIandPN0I3UUF2Z2ZBQjhJSEVDRExCeTRBelFmUEJ5QUEwZ2ZXQjlzSDN3ZmtCK29IOEFjZ0FQWUhFaUlCQ0FVSUJ3Z2RDQ1VJSndoREFDMElNQWlRQVRZSU9RaE9BRVVJUndoTUNFNElVUWhhQUtrRFdnQlRDRmNJWUFocEFHSUlaUWh2Q0hRSWVnaCtDS0lJU1FDa0NLWUlxUWhXQUtzSXJRaXdDTFFJV0FDMkNMZ0l1d2pBQ01JSXhRaDJBTWNJeVFqTUNOQUllQURTQ05RSTF3amJDTjRJNUFqbkNQQUk4d2oyQ1BrSUFna0dDUXNKRHdrVUNSY0pHZ2tqQ1N3Sk93aytDVUVKUkFsSENVb0pWZ2xjQ1dBSllnbGtDV2dKYWdsd0NYZ0pmQW1BQ1lZSmlRbVBDWkVKTUFDVENaa0puQW1lQ2FFSnBBbGhMYzFybjUrbUNiRUp2QW5IQ1pVS29Rb1ZDeUFBSndzeEM0MExvUXVsQzZrTHJRdXhDN1VMdVF1OUM4RUx4UXNoRERVTU9RdzlERUVNUlF4SkRFME1VUXhWREZrTWJ3eHhESE1Nb0F5OEROd001QXpzRFBRTS9Bd0VEUXdORkEwaURTNE5lZzJDRFlVTmlRMk5EWjBOc1EyMURid053ZzNHRFNnT0xBNHdEaklPTmc0OERqNE9RUTVERGtZT2R3NTdEb2tPamc2VURwd09vdzZwRHJRT3ZnN0dEc29Penc3WkR0ME81QTdzRHZNTytBNEVEd29QRlE4YkR5SVBLQTh6RHowUFJROU1EMUVQVnc5ZUQyTVBhUTl3RDNZUGZRK0NENGtQalErZUQ2UVBxUSt0RDdnUHZnL0pEOUFQMWcvYUQrRVA1US92RC9vUEFCQUVFQWtRRHhBVEVCb1FIeEFqRUNrUUx4QXlFRFlRT1JBL0VFVVFXUkJoRUhrUWZCQ0FFSlVRb1JDeEVNTVF5eERQRU5vUTNoRHFFUElROUJBQUVRVVJFUkZCRVVrUlRSRlRFVmNSV2hGdUVYRVJkUkY3RVgwUmdSR0VFWXdSa2hHV0Vad1JvaEdvRWFzUmI2ZXZFYk1SalFLN0VRMFNDeE1KRkkwVWtoUlFGV2tWYnhWMUZYc1ZoeFdURlNzQW5oVzJGYm9WdmhYQ0ZjWVZ5aFhlRmVJVlJoWmZGb1VXaXhaSkYwOFhWQmQwRjNRWWVoZ09HZEFaZEJwOEdwb2FueHF6R3IwYXd4clhHdHdhNGhyd0dpQWJMUnMxR3prYlR4dkdHOWdiMmh2Y0cyUXhIUndmSENFY0l4d2xIQ2NjUlJ4VEhGZ2NZUnhxSEh3Y2hSeUtIS29jeFJ6SEhNa2N5eHpOSE04YzBSelRIUE1jOVJ6M0hQa2MreHdDSFFRZEJoMElIUmNkR1IwYkhSMGRIeDBoSFNNZEpSMG5IU2tkS3gwdEhTOGRNUjB6SFRjZDlBTTVIUWNpT3gwQ0lqMGRSUjMwQTBjZEJ5SkpIUUlpU3gxVEhmUURWUjBISWxjZEFpSlpIV0VkOUFOakhRY2laUjBDSW1jZGJ4MzBBM0VkQnlKekhRSWlkUjEvSFlFZGd4MkZIWWNkaVIyUEhhd2RMUWEwSGNBZExBYlFIVUFlVEI1ZkhuRWVoQjZHSG9vZWtCNldIcGdlbkI2ZUhxWWVxUjZySHJFZXN4NjFNTGtlRVI4bkh5c2ZMUjh5SDM4ZmtCK1JJS0VncHlDaEliOGlBRUhRZ2dNTDBrY2dpQ0NFTWpNZ2dTQ25NVzh4MERReDBESXowRFJCZ0VHQlFZSkJnMEdJUVlvQUFFT25SWUJGZ1VXQ1JZaEpnRW1CU1lKSmlBQUFUb05QZ0UrQlQ0SlBnMCtJQUFBQUFGV0FWWUZWZ2xXSVdZRUFBQUFBWVlCaGdXR0NZWU5oaUdHS0FBQmpwMldBWllGbGdtV0lhWUJwZ1dtQ2FZZ0FBRzZEYjRCdmdXK0NiNE52aUFBQUFBQjFnSFdCZFlKMWlIbUJBQUI1aUVHRVFZWkJxRU9CUTRKRGgwT01SSXhGaEVXR1JZZEZxRVdNUjRKSGhrZUhSNmRJZ2ttRFNZUkpoa21vU1lkSlNtbHFTb0pMcDB5QlRLZE1qRXdBQUdzZ2EwNkJUcWRPakx3Q2JrK0VUNFpQaTFLQlVxZFNqRk9CVTRKVHAxT01WS2RVakZXRFZZUlZobFdLVll0VnFGZUNXWUpaaUZxQldvZGFqRStiVlp0RUFIMEJSQUIrQVdRQWZnRk1Ta3hxYkdwT1NrNXFibXBCQUl4SkFJeFBBSXhWQUl6Y0FJVGNBSUhjQUl6Y0FJREVBSVFtQW9UR0FJUkhqRXVNVDZqcUFZVHJBWVMzQVl5U0FveHFBSXhFV2tSNlpIcEhnVTRBZ01VQWdjWUFnZGdBZ1VHUFFaRkZqMFdSU1k5SmtVK1BUNUZTajFLUlZZOVZrVk9tVktaSWpFRUFoMFVBcDlZQWhOVUFoRThBaHk0Q2hGa0FoR2dBWmdKcUFISUFlUUo3QW9FQ2R3QjVBQ0NHSUljZ2lpQ29JSU1naTJNQ2JBQnpBSGdBbFFLQWdRQ1RpSUVneFNDQnFBQ0JrUU9CbFFPQmx3T0JtUU9CQUFBQW53T0JBQUFBcFFPQnFRT0J5Z09CQVFPWUI2UUhzQUMwQUxZQXVBREtBQUVEdUFmRUI3NEF4QURJQUtVRERSTUFBUVBSQU5FSHhnUEFBN29Ed1FQQ0F3QUFtQU8xQXhVRWdCVUVpQUFBQUJNRWdRWUVpQm9FZ1JnRWdDTUVoaGdFaGpnRWhqVUVnRFVFaUFBQUFETUVnVllFaURvRWdUZ0VnRU1FaG5RRWp4WUVoaEFFaGhBRWlCVUVodGdFaUJZRWlCY0VpQmdFaEJnRWlCNEVpT2dFaUMwRWlDTUVoQ01FaUNNRWl5Y0VpQ3NFaUdVRmdnVW5CZ0FzQUMwaExRQXVJeTBuQmdCTklVMmdUU05OMVFaVUJnQUFBQURCQmxRRzBnWlVCaWdKUEFrd0NUd0pNd2s4Q1JVSkFDY0JKd0luQnljTUp3MG5GaWNhSjc0SkNRQUpHYUVKdkFtdkNid0pNZ284Q2pnS1BBb1dDZ0FtQVNZR0ppc0tQQXBIQzFZTFBnc0pBQWtaSVFzOEM1SUwxd3UrQ3dnQUNRQUlHVVlNVmd5L0ROVU14Z3pWRE1JTUJBQUlFejROQ0FBSkFBZ1oyUTNLRGNvTkR3VVNBQThWVFE0eURzME9zZzZaRGhJQUVnaENEN2NQVEErM0QxRVB0dzlXRDdjUFd3KzNEMEFQdFE5eEQzSVBjUThBQTBFUHNnK0JEN01QZ0ErekQ0RVBjUStBRDVJUHR3K2NEN2NQb1ErM0Q2WVB0dytyRDdjUGtBKzFEeVVRTGhBRkd6VWJBQUFBQUFjYk5Sc0FBQUFBQ1JzMUd3QUFBQUFMR3pVYkFBQUFBQTBiTlJzUkd6VWJPaHMxR3dBQUFBQThHelViUGhzMUcwSWJOUnRCQU1ZQVFnQUFBRVFBUlFDT0FVY0FUd0FpQWxBQVVnQlVBRlVBVndCaEFGQUNVUUlDSFdJQVpBQmxBRmtDV3dKY0FtY0FBQUJyQUcwQVN3RnZBRlFDRmgwWEhYQUFkQUIxQUIwZGJ3SjJBQ1Vkc2dPekE3UUR4Z1BIQTJrQWNnQjFBSFlBc2dPekE4RUR4Z1BIQTFJQ1l3QlZBdkFBWEFKbUFGOENZUUpsQW1nQ2FRSnFBbnNkblFKdEFvVWRud0p4QW5BQ2NnSnpBblFDZFFKNEFvSUNnd0tyQVlrQ2lnSWNIWXNDakFKNkFKQUNrUUtTQXJnRFFRQ2xRZ0NIUWdDalFnQ3h4d0NCUkFDSFJBQ2pSQUN4UkFDblJBQ3RFZ0dBRWdHQlJRQ3RSUUN3S0FLR1JnQ0hSd0NFU0FDSFNBQ2pTQUNJU0FDblNBQ3VTUUN3endDQlN3Q0JTd0NqU3dDeFRBQ2pOaDZFVExGTXJVMkJUWWRObzA2SFRxTk9zVTZ0MVFDQjFRQ0lUQUdBVEFHQlVBQ0JVQUNIVWdDSFVnQ2pXaDZFVWdDeFV3Q0hVd0NqV2dHSFlBR0hZaDZIVkFDSFZBQ2pWQUN4VkFDdFZRQ2tWUUN3VlFDdGFBR0JhZ0dJVm9OV28xZUFWNEZYaUZlSFY2TlloMWlJV1lkYWdscWpXckZvc1hTSWQ0cDVpbUVBdmdKL0FZZEJBS05CQUluQ0FJSENBSURDQUluQ0FJT2dIb0lDQVlFQ0FZQUNBWWtDQVlPZ0hvWkZBS05GQUlsRkFJUEtBSUhLQUlES0FJbktBSU80SG9KSkFJbEpBS05QQUtOUEFJblVBSUhVQUlEVUFJblVBSVBNSG9LZ0FZR2dBWUNnQVltZ0FZT2dBYU5WQUtOVkFJbXZBWUd2QVlDdkFZbXZBWU92QWFOWkFJQlpBS05aQUlsWkFJT3hBeE1EQUIrQUFCK0JBQi9Da1FNVEF3Z2ZnQWdmZ1FnZndyVURFd01RSDRBUUg0R1ZBeE1ER0IrQUdCK0J0d09UdHdPVUlCK0FJUitBSUIrQklSK0JJQi9DSVIvQ2x3T1Rsd09VS0IrQUtSK0FLQitCS1IrQktCL0NLUi9DdVFPVHVRT1VNQitBTVIrQU1CK0JNUitCTUIvQ01SL0NtUU9UbVFPVU9CK0FPUitBT0IrQk9SK0JPQi9DT1IvQ3Z3T1R2d09VUUIrQVFCK0Jud01UQTBnZmdFZ2ZnY1VERXdOUUg0QlFINEZRSDhLbEE1UUFBQUJaSDRBQUFBQlpINEVBQUFCWkg4TEpBNVBKQTVSZ0g0QmhINEJnSDRGaEg0RmdIOEpoSDhLcEE1T3BBNVJvSDRCcEg0Qm9INEZwSDRGb0g4SnBIOEt4QTRDMUE0QzNBNEM1QTRDL0E0REZBNERKQTRBQUgwVURJQjlGQTJBZlJRT3hBNGF4QTRSd0g4V3hBOFdzQThVQUFBQ3hBOEsySDhXUkE0YVJBNFNSQTRDUkE4VWdreUNUSU1Lb0FNSjBIOFczQThXdUE4VUFBQUMzQThMR0g4V1ZBNENYQTRDWEE4Vy9INEMvSDRHL0g4SzVBNGE1QTRUS0E0QUFBN2xDeWtLWkJwa0VtUUQrSDREK0g0SCtIOExGQTRiRkE0VExBNEFBQThFVHdSVEZRc3RDcFFhbEJLVUFvUU9VcUFDQWhRTmdBSHdmeGNrRHhjNER4UUFBQU1rRHd2WWZ4WjhEZ0trRGdLa0R4U0NVQWlBZ0lDQWdJQ0FnSUNBZ3N5NHVMaTR1TWlBeUlESWdBQUFBTlNBMUlEVWdBQUFBSVNFQUFDQ0ZQejgvSVNFL01pQUFBQUFBTUdrQUFEUTFOamM0T1NzOUtDbHVNQUFyQUJJaVBRQW9BQ2tBQUFCaEFHVUFid0I0QUZrQ2FHdHNiVzV3YzNSU2MyRXZZMkV2YzdBQVEyTXZiMk12ZGJBQVJrZ0FId0FBQUNEZkFRRUVKRTV2VUZGU1VsSlRUVlJGVEZSTlN3REZBRUpEQUdWRlJnQk5iOUFGUmtGWXdBT3pBNU1Eb0FNUklrUmtaV2xxTWRBM01kQTVNZEF4TURIUU16TFFNekhRTlRMUU5UUFFOVFRRTlRIUU5qWFFOakhRT0RQUU9EWFFPRGZRT0RIUVNVbEpTVWxKVmxaSlZrbEpWa2xKU1VsWVdFbFlTVWxNUTBSTmFXbHBhV2xwYVhaMmFYWnBhWFpwYVdscGVIaHBlR2xwYkdOa2JURFFNNUFodUpJaHVKUWh1TkFodU5RaHVOSWh1QU1pdUFnaXVBc2l1Q01pdUFBQUFDVWl1Q3NpS3lJcklnQUFBQzRpTGlJdUlnQUFBRHdpdUVNaXVFVWl1QUFBQUVnaXVEMEF1QUFBQUdFaXVFMGl1RHdBdUQ0QXVHUWl1R1VpdUhJaXVIWWl1SG9pdUlJaXVJWWl1S0lpdUtnaXVLa2l1S3NpdUh3aXVKRWl1TElpT0FNSU1ERUFNUUF3QURJd0tBQXhBQ2tBS0FBeEFEQUFLUUFvTWpBcE1RQXVBREVBTUFBdUFESXdMaWdBWVFBcEFFRUFZUUFySWdBQUFBQTZPajA5UFQwOVBkMHF1R3BXQUU0QUtEWS9XWVdNb0xvL1VRQW1MRU5YYktHMndadFNBRjU2ZjUybXdjN250bFBJVStOVDExWWZWK3RZQWxrS1dSVlpKMWx6V1ZCYmdGdjRXdzljSWx3NFhHNWNjVnpiWGVWZDhWMytYWEplZWw1L1h2UmUvbDRMWHhOZlVGOWhYM05mdzE4SVlqWmlTMkl2WlRSbGgyV1haYVJsdVdYZ1plVmw4R1lJWnlobklHdGlhM2xyczJ2TGE5UnIyMnNQYkJSc05HeHJjQ3B5Tm5JN2NqOXlSM0paY2x0eXJIS0VjNGx6M0hUbWRCaDFIM1VvZFRCMWkzV1NkWFoyZlhhdWRyOTI3bmJiZCtKMzgzYzZlYmg1dm5sMGVzdDYrWHB6ZlBoOE5uOVJmNHAvdlg4QmdBeUFFb0F6Z0grQWlZRGpnUUFIRUJrcE9EeUxqNVZOaG11R1FJaE1pR09JZm9tTGlkS0pBSW8zakVhTVZZeDRqSjJNWkkxd2piT05xNDdLanB1UHNJKzFqNUdRU1pIR2tjeVIwWkYzbFlDVkhKYTJscm1XNkpaUmwxNlhZcGRwbDh1WDdaZnpsd0dZcUpqYm1OK1lscG1abWF5WnFKclltdCthSlpzdm16S2JQSnRhbStXY2RaNS9ucVdlQUJZZUtDeFVXR2x1ZTVhbHJlajMreEl3QUFCQlUwUlRSVk5MTUprd0FBQUFBRTB3bVRBQUFBQUFUekNaTUFBQUFBQlJNSmt3QUFBQUFGTXdtVEFBQUFBQVZUQ1pNQUFBQUFCWE1Ka3dBQUFBQUZrd21UQUFBQUFBV3pDWk1BQUFBQUJkTUprd0FBQUFBRjh3bVRBQUFBQUFZVENaTUdRd21UQUFBQUFBWmpDWk1BQUFBQUJvTUprd2J6Q1pNSEl3bVRCMU1Ka3dlRENaTUhzd21UQkdNSmt3SUFDWk1KMHdtVENJTUlvd3F6Q1pNQUFBQUFDdE1Ka3dBQUFBQUs4d21UQUFBQUFBc1RDWk1BQUFBQUN6TUprd0FBQUFBTFV3bVRBQUFBQUF0ekNaTUFBQUFBQzVNSmt3QUFBQUFMc3dtVEFBQUFBQXZUQ1pNQUFBQUFDL01Ka3dBQUFBQU1Fd21UREVNSmt3QUFBQUFNWXdtVEFBQUFBQXlEQ1pNTTh3bVREU01Ka3cxVENaTU5nd21URGJNSmt3cGpDWk1POHdtVEQ5TUprd3N6RElNQUFSQUFHcUFxeXRBd1FGc0xHeXM3UzFHZ1lIQ0NFSkVXRVJGQkZNQUFHenRMaTZ2OFBGQ01uTENRb01EZzhURlJjWUdSb2JIaUlzTXpqZDNrTkVSWEJ4ZEgxK2dJcU5BRTZNVGdsTzIxWUtUaTFPQzA0eWRWbE9HVTRCVGlsWk1GZTZUaWdBS1FBQUVRSVJBeEVGRVFZUkJ4RUpFUXNSREJFT0VROFJFQkVSRVJJUktBQUFFV0VSS1FBb0FBSVJZUkVwQUNnQUJSRmhFU2tBS0FBSkVXRVJLUUFvQUFzUllSRXBBQ2dBRGhGaEVTa0FLQUFNRVc0UktRQW9BQXNSYVJFTUVXVVJxeEVwQUNnQUN4RnBFUklSYmhFcEFDZ0FLUUFBVG94T0NVN2JWcFJPYlZFRFRtdFJYVTVCVXdobmEzQTBiQ2huMFpFZlYrVmxLbWdKWno1NURWUjVjcUdNWFhtMFV1Tk9mRlJtVytOMkFVL0hqRlJUYlhrUlQrcUI4NEZQVlh4ZWgyV1BlMUJVUlRJQU1RQXpBREFBQUJFQUFnTUZCZ2NKQ3d3T0R4QVJFZ0FSQUdFQ1lRTmhCV0VHWVFkaENXRUxZUXhoRGhGaEVRQVJEbUczQUdrTEVRRmpBR2tMRVc0UkFFNk1UZ2xPMjFhVVRtMVJBMDVyVVYxT1FWTUlaMnR3Tkd3b1o5R1JIMWZsWlNwb0NXYytlUTFVZVhLaGpGMTV0RkxZZVRkMWMxbHBrQ3BSY0ZQb2JBV1lFVStaVVdOckNrNHRUZ3RPNWwzelV6dFRsMXRtVytOMkFVL0hqRlJUSEZrekFEWUFOQUF3QURVd01RQUlaekVBTUFBSVowaG5aWEpuWlZaTVZFU2lNQUFDQkFZSUNRc05EeEVURlJjWkd4MGZJaVFtS0NrcUt5d3RNRE0yT1R3OVBqOUFRa1JHUjBoSlNrdE5UazlRNUU2TVZLRXdBVEJiSndGS05BQUJVamtCb2pBQVdrbWtNQUFuVHd5a01BQlBIUUlGVDZnd0FCRUhWQ0dvTUFCVUExU2tNQVpQRlFaWVBBY0FScXN3QUQ0WUhRQkNQMUdzTUFCQlJ3QkhNcTR3ckRDdU1BQWRUcTB3QURnOVR3RStFMCt0TU8wd3JUQUFRQU04TTYwd0FFQTBUeHMrclRBQVFFSVdHN0F3QURrd3BEQU1SVHdrVHd0SEdBQkpyekFBUGswZXNUQUFTd2dDT2hrQ1N5eWtNQkVBQzBlMU1BQStERWNyc0RBSE9rTUF1VEFDT2dnQ09nOEhRd0MzTUJBQUVqUVJQQk1YcERBcUh5UXJBQ0M3TUJaQkFEZ054REFOT0FEUU1BQXNIQnVpTURJQUZ5WkpyekFsQUR5ek1DRUFJRGloTURRQVNDSW9vekF5QUZrbHB6QXZIQkFBUk5Vd0FCUWVyekFwQUJCTlBOb3d2VEM0TUNJVEdpQXpEQ0k3QVNKRUFDRkVCNlF3T1FCUEpNZ3dGQ01BMnpEek1Na3dGQ29BRWpNaUVqTXFwREE2QUF0SnBEQTZBRWM2SHlzNlJ3dTNNQ2M4QURBOHJ6QXdBRDVFM3pEcU1OQXdEeG9BTEJ2aE1Ld3dyREExQUJ4SE5WQWNQNkl3UWxvblFscEpSQUJSd3pBbkFBVW82akRwTU5Rd0Z3QW8xakFWSmdBVjdERGdNTEl3T2tFV0FFSERNQ3dBQlRBQXVYQXhBREFBdVhBeUFEQUF1WEJvVUdGa1lVRlZZbUZ5YjFad1kyUnRaQUJ0QUxJQVNRQlZBSE5lRUdJdFpveFVKMWxqYXc1bXUyd3FhQTlmR2s4K2VYQUFRVzRBUWJ3RFFXMEFRV3NBUVVzQVFrMEFRa2NBUW1OaGJHdGpZV3h3QUVadUFFYThBMGE4QTJkdEFHZHJBR2RJQUhwclNIcE5TSHBIU0hwVVNIcThBeE1oYlFBVElXUUFFeUZyQUJNaFpnQnRiZ0J0dkFOdGJRQnRZd0J0YXdCdFl3QUtDazhBQ2s5dEFMSUFZd0FJQ2s4S0NsQUFDbEJ0QUxNQWF3QnRBTE1BYlFBVkluTUFiUUFWSW5NQXNnQlFZV3RRWVUxUVlVZFFZWEpoWkhKaFpORnpjZ0JoQUdRQUZTSnpBTElBY0FCemJnQnp2QU56YlFCemNBQldiZ0JXdkFOV2JRQldhd0JXVFFCV2NBQlhiZ0JYdkFOWGJRQlhhd0JYVFFCWGF3Q3BBMDBBcVFOaExtMHVRbkZqWTJOa1E5RnJaME52TG1SQ1IzbG9ZVWhRYVc1TFMwdE5hM1JzYld4dWJHOW5iSGh0WW0xcGJHMXZiRkJJY0M1dExsQlFUVkJTYzNKVGRsZGlWdEZ0UWRGdE1RRGxaVEVBTUFEbFpUSUFNQURsWlRNQU1BRGxaV2RoYkVvRVRBUW1BVk1CSjZjM3Eyc0NVcXRJalBSbXlvN0lqTkZ1TWs3bFU1eWZuSjlSV2RHUmgxVklXZlpoYVhhRmZ6K0d1b2Y0aUkrUUFtb2JiZGx3M25NOWhHcVI4Wm1DVG5WVEJHc2JjaTJHSHA1UVhldHZ6WVZraWNsaTJJRWZpTXBlRjJkcWJmeHl6cENHVDdkUjNsTEVaTk5xRUhMbmRnR0FCb1pjaHUrTk1wZHZtL3FkakhoL2VhQjl5WU1FazMrZTFvcmZXQVJmWUh4K2dHSnl5bmpDalBlVzJGaGlYQk5xMm0wUGJ5OTlOMzVMbHRKU2k0RGNVY3hSSEhxK2ZmR0RkWmFBaTg5aUFtcitpamxPNTFzU1lJZHpjSFVYVS90NHYwK3BYdzFPekd4NFpTSjl3MU5lV0FGM1NZU3FpcnByc0krSWJQNWk1WUtnWTJWMXJrNXBVY2xSZ1dqbmZHK0Mwb3JQa2ZWU1FsUnpXZXhleFdYK2J5cDVyWlZxbXBlZXpwNmJVc1ptZDJ0aWozUmVrR0VBWXBwa0kyOUpjWWwweW5uMGZXK0FKby91aENPUVNwTVhVcU5TdlZUSWNNS0lxb3JKWHZWZmUyT3VhejU4ZFhQa1R2bFc1MXU2WFJ4Z3NuTnBkSnAvUm9BMGt2YVdTSmNZbUl0UHJubTBrYmlXNFdDR1R0cFE3bHMvWEpsbEFtck9jVUoyL0lSOGtJMmZpR1l1bG9sU2UyZnpaMEZ0bkc0SmRGbDFhM2dRZlY2WWJWRXVZbmlXSzFBWlhlcHRLbytMWDBSaEYyaUhjNGFXS1ZJUFZHVmNFMlpPWjZobzVXd0dkT0oxZVgvUGlPR0l6SkhpbGo5VHVtNGRWTkJ4bUhUNmhhT1dWNXlmbnBkbnkyM29nY3Q2SUh1U2ZNQnltWEJZaThCT05vTTZVZ2RTcGw3VFl0WjhoVnNlYmJSbU80OU1pRTJXaTRuVFhrQlJ3RlVBQUFBQVdsZ0FBSFJtQUFBQUFONVJLblBLZGp4NVhubGxlWTk1VnBlK2ZMMS9BQUFTaGdBQStJb0FBQUFBT0pEOWtPK1kvSmdvbWJTZDNwQzNscTVQNTFCTlVjbFM1RkpSVTUxVkJsWm9Wa0JZcUZoa1hHNWNsR0JvWVk1aDhtRlBaZUpsa1dhRmFIZHRHbTRpYjI1eEszSWlkSkY0UG5sSmVVaDVVSGxXZVYxNWpYbU9lVUI2Z1hyQWUvUjlDWDVCZm5KL0JZRHRnWG1DZVlKWGhCQ0psb2tCaXptTDA0d0lqYmFQT0pEamx2K1hPNWgxWU81Q0dJSUNKazYxVVdoUmdFOUZVWUJSeDFMNlVwMVZWVldaVmVKVldsaXpXRVJaVkZsaVdpaGIwbDdaWG1sZnJWL1lZRTVoQ0dHT1lXQmg4bUUwWXNSakhHUlNaRlpsZEdZWFp4dG5WbWQ1YTdwclFXM2Jic3R1SW04ZWNHNXhwM2MxY3E5eUtuTnhkQVoxTzNVZGRoOTJ5bmJiZHZSMlNuZEFkOHg0c1hyQWUzdDhXMzMwZlQ1L0JZQlNnKytEZVlkQmlZYUpsb20vaXZpS3k0b0JpLzZLN1lvNWk0cUxDSTA0ajNLUW1aRjJrbnlXNDVaV2w5dVgvNWNMbUR1WUVwdWNuMG9vUkNqVk01MDdHRUE1UUVsUzBGelRma09manA4cW9BSm1abVpwWm14bVptbG1abXgvQVhSekFIUmxCUThSRHdBUEJoa1JEd2paQmJRRkFBQUFBUElGdHdYUUJSSUFBd1FMREEwWUd1a0Z3UVhwQmNJRlNmdkJCVW43d2dYUUJiY0YwQVc0QmRBRnZBWFlCYndGM2dXOEJlQUZ2QVhqQmJ3RnVRVXRBeTRETHdNd0F6RURIQUFZQmlJR0t3YlFCZHdGY1FZQUFBb0tDZ29ORFEwTkR3OFBEd2tKQ1FrT0RnNE9DQWdJQ0RNek16TTFOVFUxRXhNVEV4SVNFaElWRlJVVkZoWVdGaHdjR3hzZEhSY1hKeWNnSURnNE9EZytQajQrUWtKQ1FrQkFRRUJKU1VwS1NrcFBUMUJRVUZCTlRVMU5ZV0ZpWWtrR1pHUmtaSDUrZlgxL2Z5NkNnbng4Z0lDSGg0ZUhBQUFtQmdBQkFBRUFyd0N2QUNJQUlnQ2hBS0VBb0FDZ0FLSUFvZ0NxQUtvQXFnQWpBQ01BSTh3R0FBQUFBQ1lHQUFZQUJ3QWZBQ01BSkFJR0FnY0NDQUlmQWlNQ0pBUUdCQWNFQ0FRZkJDTUVKQVVHQlI4Rkl3VWtCZ2NHSHdjR0J4OElCZ2dIQ0I4TkJnMEhEUWdOSHc4SER4OFFCaEFIRUFnUUh4RUhFUjhTSHhNR0V4OFVCaFFmR3dZYkJ4c0lHeDhiSXhza0hBY2NIeHdqSENRZEFSMEdIUWNkQ0IwZUhSOGRJeDBrSGdZZUJ4NElIaDhlSXg0a0h3WWZCeDhJSHg4Zkl4OGtJQVlnQnlBSUlCOGdJeUFrSVFZaEh5RWpJU1FrQmlRSEpBZ2tIeVFqSkNRS1NndEtJMG9nQUV3R1VRWlJCdjhBSHlZR0FBc0FEQUFmQUNBQUl3QWtBZ3NDREFJZkFpQUNJd0lrQkFzRURBUWZKZ1lFSUFRakJDUUZDd1VNQlI4RklBVWpCU1FiSXhza0hDTWNKQjBCSFI0ZEh4MGpIU1FlSHg0akhpUWZBUjhmSUFzZ0RDQWZJQ0FnSXlBa0kwb2tDeVFNSkI4a0lDUWpKQ1FBQmdBSEFBZ0FId0FoQWdZQ0J3SUlBaDhDSVFRR0JBY0VDQVFmQkNFRkh3WUhCaDhIQmdjZkNBWUlIdzBHRFFjTkNBMGZEd2NQQ0E4ZkVBWVFCeEFJRUI4UkJ4SWZFd1lUSHhRR0ZCOGJCaHNIR3dnYkh4d0hIQjhkQmgwSEhRZ2RIaDBmSGdZZUJ4NElIaDhlSVI4R0h3Y2ZDQjhmSUFZZ0J5QUlJQjhnSVNFR0lSOGhTaVFHSkFja0NDUWZKQ0VBSHdBaEFoOENJUVFmQkNFRkh3VWhEUjhOSVE0ZkRpRWRIaDBmSGg4Z0h5QWhKQjhrSVVBR1RnWlJCaWNHRUNJUUl4SWlFaU1USWhNakRDSU1JdzBpRFNNR0lnWWpCU0lGSXdjaUJ5TU9JZzRqRHlJUEl3MEZEUVlOQncwZURRb01DZzRLRHdvUUloQWpFaUlTSXhNaUV5TU1JZ3dqRFNJTkl3WWlCaU1GSWdVakJ5SUhJdzRpRGlNUElnOGpEUVVOQmcwSERSNE5DZ3dLRGdvUENnMEZEUVlOQncwZURDQU5JQkFlREFVTUJnd0hEUVVOQmcwSEVCNFJIZ0FrQUNRcUJnQUNHd0FEQWdBREFnQURHd0FFR3dBYkFnQWJBd0FiQkFJYkF3SWJBd01iSUFNYkh3a0RBZ2tDQXdrQ0h3a2JBd2tiQXdrYkFna2JHd2tiR3dzREF3c0RBd3NiR3dvREd3b0RHd29DSUFvYkJBb2JCQW9iR3dvYkd3d0RId3dFR3d3RUd3MGJBdzBiQXcwYkd3MGJJQThDR3c4Ykd3OGJHdzhiSHhBYkd4QWJJQkFiSHhjRUd4Y0VHeGdiQXhnYkd4b0RHeG9ESUJvREh4b0NBaG9DQWhvRUd4b0VHeG9iQXhvYkF4c0RBaHNER3hzRElCc0NBeHNDR3hzRUFoc0VHeWdHSFFRR0h4MEVIeDBkSGdVZEhnVWhIZ1FkSGdRZEhnUWhIaDBpSGgwaEloMGRJaDBkQUFZaUFnUWlBZ1FoQWdZaUFnWWhBaDBpQWgwaEJCMGlCQVVoQkIwaEN3WWhEUVVpREFVaURnVWlIQVFpSEIwaUlnVWlJZ1FpSWgwaUhSMGlHaDBpSGdVaUdoMEZIQVVkRVIwaUd4MGlIZ1FGSFFZaUhBUWRHeDBkSEFRZEhnUUZCQVVpQlFRaUhRUWlHUjBpQUFVaUd4MGRFUVFkRFIwZEN3WWlIZ1FpTlFZQUQ1ME5ENTBuQmdBZEhTQUFIQUVLSGdZZUNBNGRFaDRLRENFZEVoMGpJQ0VNSFI0MUJnQVBGQ2NHRGgwaS93QWRIU0QvRWgwaklQOGhEQjBlSndZRkhmOEZIUUFkSUNjR0NxVUFIU3dBQVRBQ01Eb0FPd0FoQUQ4QUZqQVhNQ1lnRXlBU0FRQmZYeWdwZTMwSU1Bd05DQWtDQXdBQkJBVUdCMXNBWFFBK0lENGdQaUErSUY4QVh3QmZBQ3dBQVRBdUFBQUFPd0E2QUQ4QUlRQVVJQ2dBS1FCN0FIMEFGREFWTUNNbUtpc3RQRDQ5QUZ3a0pVQkFCdjhMQUF2L0RDQUFUUVpBQnY4T0FBNy9Ed0FQL3hBQUVQOFJBQkgvRWdBU0lRWUFBUUVDQWdNREJBUUZCUVVGQmdZSEJ3Y0hDQWdKQ1FrSkNnb0tDZ3NMQ3dzTURBd01EUTBORFE0T0R3OFFFQkVSRWhJU0VoTVRFeE1VRkJRVUZSVVZGUllXRmhZWEZ4Y1hHQmdZR0JrWkdSa2dJQ0FnSVNFaElTSWlJaUlqSXlNakpDUWtKQ1VsSlNVbUppWW1KeWNvS0NrcEtTa2lCaUlBSWdBaUFTSUJJZ01pQXlJRklnVWhBSVVwQVRBQkN3d0Erdkdnb3FTbXFPTGs1c0w3b2FPbHA2bXFySzZ3c3JTMnVMcTh2c0REeGNmSnlzdk16YzdSMU5mYTNkN2Y0T0hqNWVmbzZlcnI3Tzd5bUpreE1VOHhWVEZiTVdFeG9nQ2pBS3dBcndDbUFLVUFxU0FBQUFJbGtDR1JJWkloa3lHZ0pjc2xtUkM2RUFBQUFBQ2JFTG9RQlFXbEVMb1FCVEVSSnhFeUVTY1JWVWNUUGhOSEUxY1RWYmtVdWhTNUZMQVVBQUFBQUxrVXZSUlZVTGdWcnhXNUZhOFZWVFVaTUJrRlY5RmwwVmpSWmRGZjBXN1JYOUZ2MFYvUmNORmYwWEhSWDlGeTBWVlZWUVc1MFdYUnV0RmwwYnZSYnRHODBXN1J1OUZ2MGJ6UmI5RlZWVlZCQUdFQVFRQmhBR2tBUVFCaEFFRUFRMFFBQUVjQUFFcExBQUJPVDFCUkFGTlVWVlpYV0ZsYVlXSmpaQUJtYUFCd0FFRUFZUUJCUWdCRVJVWkhTZ0JUQUdFQVFVSUFSRVZHUndCSlNrdE1UUUJQVXdCaEFFRUFZUUJCQUdFQVFRQmhBRUVBWVFCQkFHRUFRUUJoQURFQk53S1JBNk1Ec1FQUkF5UUFId1FnQlpFRG93T3hBOUVESkFBZkJDQUZrUU9qQTdFRDBRTWtBQjhFSUFXUkE2TURzUVBSQXlRQUh3UWdCWkVEb3dPeEE5RURKQUFmQkNBRkN3d3dBREFBTUFBd0FEQUFKd1lBQVFVSUtnWWVDQU1OSUJrYUd4d0pEeGNMR0FjS0FBRUVCZ3dPRUVTUWQwVW9CaXdHQUFCSEJqTUdGeEFSRWhNQUJnNENEelFHS2dZckJpNEdBQUEyQmdBQU9nWXRCZ0FBU2dZQUFFUUdBQUJHQmpNR09RWUFBRFVHUWdZQUFEUUdBQUFBQUM0R0FBQTJCZ0FBT2dZQUFMb0dBQUJ2QmdBQUtBWXNCZ0FBUndZQUFBQUFMUVkzQmtvR1F3WUFBRVVHUmdZekJqa0dRUVkxQmtJR0FBQTBCaW9HS3dZdUJnQUFOZ1k0QmpvR2JnWUFBS0VHSndZQUFRVUlJQ0VMQmhBaktnWWFHeHdKRHhjTEdBY0tBQUVFQmd3T0VDZ0dMQVl2QmdBQVNBWXlCaTBHTndaS0Jpb0dHaHNjQ1E4WEN4Z0hDZ0FCQkFZTURoQXdMakFBTEFBb0FFRUFLUUFVTUZNQUZUQkRVa05FVjFwQkFFaFdUVlpUUkZOVFVGQldWME5OUTAxRVRWSkVTa3N3TUFCb2FFdGlWMXZNVThjd2pFNGFXZU9KS1Zta1RpQm1JWEdaWlUxU2pGK05VYkJsSFZKQ2ZSOTFxWXp3V0RsVUZHK1ZZbFZqQUU0SlRrcVE1bDB0VHZOVEIyTndqVk5pZ1hsNmVnaFVnRzRKWndobk0zVnlVclpWVFpFVU1CVXdMR2NKVG94T2lWdTVjRk5pMTNiZFVsZGxsMS92VXpBQU9FNEZBQWtpQVdCUHJrKzdUd0pRZWxDWlVPZFF6MUNlTkRvR1RWRlVVV1JSZDFFY0JiazBaMUdOVVVzRmwxR2tVY3hPckZHMVVkK1I5VkVEVXQ4ME8xSkdVbkpTZDFJVk5RSUFJSUNBQUFnQUFNZFNBQUlkTXo0L1VJS0trNnkydUxpNExBcHdjTXBUMzFOakMrdFQ4Vk1HVko1VU9GUklWR2hVb2xUMlZCQlZVMVZqVllSVmhGV1pWYXRWczFYQ1ZSWlhCbFlYVjFGV2RGWUhVdTVZemxmMFZ3MVlpMWN5V0RGWXJGamtGUEpZOTFnR1dScFpJbGxpV2FnVzZoYnNXUnRhSjFyWVdXWmE3amI4TmdoYlBscytXOGdadzF2WVcrZGI4MXNZRy85YkJseFRYeUpjZ1RkZ1hHNWN3RnlOWE9RZFExM21IVzVkYTExOFhlRmQ0bDB2T1AxZEtGNDlYbWxlWWppRElYdzRzRjZ6WHJaZXlsNlNvLzVlTVNNeEl3R0NJbDhpWDhjNHVETGFZV0pmYTEvak9KcGZ6Vi9YWC9sZmdXQTZPUnc1bEdEVUpzZGdBZ0lBQUFBQUFBQUFDQUFLQUFBQ0NBQ0FDQUFBQ0lBb2dBSUFBQUpJWVFBRUJnUXlSbXBjWjVhcXJzalRYV0lBVkhmekRDczlZL3hpYUdPRFkrUmo4U3NpWk1WanFXTXVPbWxrZm1TZFpIZGtiRHBQWld4bENqRGpaZmhtU1dZWk81Rm1DRHZrT3BKUmxWRUFaNXhtcllEWlF4ZG5HMmNoWjE1blUyZkRNMGs3K21lRloxSm9oV2h0Tkk1b0gyZ1VhWjA3UW1tamFlcHBxR3FqTnR0cUdEd2hhNmM0Vkd0T1BISnJuMnU2YTd0cmpUb0xIZm82VG15OFBMOXN6V3huYkJadFBtMTNiVUZ0YVcxNGJZVnRIajAwYlM5dWJtNHpQY3R1eDI3UlB2bHRibTllUDQ0L3htODVjQjV3RzNDV1BVcHdmWEIzY0sxd0pRVkZjV05DbkhHclF5aHlOWEpRY2doR2dIS1ZjalZIQWlBQUFDQUFBQUFBQ0lBQUFBSUNnSW9BQUNBQUNBb0FnSWlBSUJSSWVuT0xjNncrcFhPNFByZytSM1JjZEhGMGhYVEtkQnMvSkhVMlRENTFra3h3ZFo4aEVIYWhUN2hQUkZEOFB3aEE5SGJ6VVBKUUdWRXpVUjUzSDNjZmQwcDNPVUNMZDBaQWxrQWRWRTU0akhqTWVPTkFKbFpXZVpwV3hWYVBlZXQ1TDBGQWVrcDZUM3A4V2FkYXAxcnVlZ0pDcTF2R2U4bDdKMEtBWE5KOG9FTG9mT044QUgyR1gyTjlBVVBIZlFKK1JYNDBReWhpUjJKWlE5bGllbjgrWTVWLytuOEZnTnBrSTJWZ2dLaGxjSUJmTTlWRHNvQURnUXRFUG9HMVdxZG50V2VUTTV3ekFZSUVncDZQYTBTUmdvdUNuWUt6VXJHQ3M0SzlndWFDUEd2bGdoMkRZNE90Z3lPRHZZUG5nMWVFVTRQS2c4eUQzSU0yYkd0dEFnQUFJQ0lxb0FvQUlJQW9BS2dnSUFBQ2dDSUNpZ2dBcWdBQUFBSUFBQ2pWYkN0RjhZVHpoQmFGeW5Oa2hTeHZYVVZoUmJGdjBuQnJSVkNHWElabmhtbUdxWWFJaGc2SDRvWjVoeWlIYTRlR2g5ZEY0WWNCaVBsRllJaGppR2QyMTRqZWlEVkcrb2k3Tks1NFpubStSc2RHb0lydGlvcUxWWXlvZkt1TXdZd2JqWGVOTDM4RUNNdU52STN3amQ0STFJNDRqOUtGN1lXVWtQR1FFWkV1aHh1Uk9KTFhrdGlTZkpMNWt4V1Urb3VMbFpWSnQ1VjNqZVpKdzVheVhTT1hSWkVha201S2Rrcmdsd3FVc2txV2xBdVlDNWdwbUxhVjRwZ3pTeW1acDVuQ21mNlp6a3N3bXhLYlFKejluTTVNN1V4bm5jNmcrRXdGb1E2aWthSzdubFpOK1o3K25nV2ZENThXbnp1ZkFLWUNpS0FBQUFBQWdBQW9BQWlnZ0tDQUFJQ0FBQXFJZ0FDQUFDQXFBSUFBUkNBVklnQkJzTW9EQzFGTkF3Q1hCU0RHQlFEbkJnQkZCd0RpQ0FCVENRRE5DeUE0RGdCekR5QmRFeUJnR2lDcUd3RDBIQUQrSFNCL0xTRHdwZ0N5cWdEK0FRR3JEZ0Z6RVNGd0V3RzRGZ0dhR2dHZnZBRWk0QUZMNlFFQVFaRExBd3ZUQnJMUDFBRG9BOXdBNkFEWUJOd0J5Z1BjQWNvSzNBUUJBOXpIQVBEQUF0ekNBZHlBd2dQY3dBRG9BZHpBUWVrQTZrSHBBT29BNmN5dzRzU3cyQURjd3dEY3dnRGVBTnpGQmR6QkFOekJBTjRBNU1CSkNrTVRnQUFYZ0VFWWdNQUEzSUFBRXJBWHgwSWVyMGNid1FIY3hBRGN3UURjandBanNEVEdnY01BM01DQndZQUEzTUVBM0tJQUpKM0FBTnpCQU56QkF0ekFBZHpBQU56Q0FOekFBTnpBQU56QUFOekJzRy9HQU56QWlBRGNsOE9BeUlEQ2dNU3FBdHl3UmdEY3pZQUEzTUVBM01FQTNNSUMzRUlid2dEY3dRSGN4TEFMQUFlUEFBbUN3QURjd2JBMkFBZVBBQW12d0xBTUFBZVBBQW13UFFBSGp3QUpzRDBBQjQ4QUNiQk9BQW13VGdBSmhnQlVBRnV3TkFBSGp3QUpzRHdCQ1k4QUNiQkxBQW13UEFGbkFBbU1BMnV3T3dGMkFBbU1BM3F3R3dIY21nRGNnQURjZ0FEWXNBWkJnWUFBaElRRGdvRUFnb0RCQUFtQXdiQU5BTnl3UHdBSGdBRUpzQ0VBM0xLZXdyT0RBQW1lQUFtd2JBQUppY0N3bWdEa3NGNEEzc0FBM0xDcXdBRGNzQllBQ1pQSGdRRGNyOFFGM01FQTNJQUIzTEJDQUFlT0FBbWx3QURjeHJBRkFRbXdDUUFIaWdFSnNCSUFCN0Jud2tFQUJOekJBOXpBUVFBRkFZTUEzSVhBZ3NHd2xjRUEzTVlBM01FQTZnRFdBTndBeXVRQTZBSGtBTnlBd0FEcEFOekFBTnl5bjhFQkFjTUNBY0dEd0lJQkFjQUEzTUFCQVFQY3dMZ0R6Y0t3WEFBSnNDL2ZzZmtBMmdEa0FPZ0EzZ0hnc0RnQkNMaHRvOENEeVovQnNCL0JzT01BQ2FRQUNiQm1BQW1hMGJBSUF0eWtBQW13TGdBSGl3QUpzTDdBZ01FQTNJSEJoTUdBd0xBREFBbXd4UUFKdUViL0FCcXkwTVlHM01Hem5BRGNzTEVBM0xCa3hMWmhBTnlBd0tmQUFBRUEzSU1BQ2JCMHdBRGNzZ3pEc1ZMQnNHZ0IzTUlBM01BRDNMREVBQW13QndBSnNBZ0FDUUFIc0JUQ3J3RUpzQTBBQjdBYkFBbUlBQWV3T1FBSkFBZXdnUUFIQUFtd0h3RUhqd0FKbDhhQ3hMQ2NBQW1DQUFlV3dMQXlBQWtBQjdES0FBa0FCN0JOQUFtd1JRQUpBQWV3UWdBSnNOd0FDUUFIc05FQkNZTUFCN0JyQUFtd0lnQUprUUFKc0NBQUNiRjBBQW13MFFBSGdBRUpzQ0FBQ2JoRkp3UUJzQXJHdElnQkJyaEVld0FCdUF5VkFkZ0NBWUlBNGdUWWh3ZmNnY1FCM0ozRHNHUEN1QVdLeG9EUWdjYUF3WURFc05UR3NZVER0YThHM0xBOHhRQUhBRUh3MFFNTDRnNEJTc0JKQWtxQUFvRUNnZ0tEQXNBQ3dnSUFDb1FDUWlTRkFzQUhnQW1DQ1VBa2dDTEVBb0lpaENLR0lzWUN5QUxLQXN3Q2h3S0tJczRDakNLUUlwSWlqaUtJQW9rQ2lnS0NKQUFEQWdNRUE0c0NnQ1FJQTRRSmhnbFlKQUlLQmdPWUlwb2luaUlBQ1FvRG9DSU1BdzREUUFnUUF4SURvaUttSXNBSnBDS29JcW9pakFLTkFvNENRQU5DQTBRRGdBT1BBbzRrd2dlSUNZb0prQ1JHQTZ3aUFBU3dJa0lJc2lJQ0JMUWlRQVJFQkxZaVFnVENJc0FpeENMR0lzZ2lRQW5BQkpFQ3lpTEVCTXdpd2dUUUlzNGlrZ0tUQXBRQ2xRSkFCVUlGQ0FxV0FwUWtSQVhFQjR3SmpnbkFCcElrUkFnSUl3b2pnQVVNSTRRRmtBbVNDUTRqZ2dVU0k0WUZpQVVVSTR3RkZpT1lDWW9GSGlPUUJTQWptZ21PQlNRaklpT1pBcG9DbXdMQUJjSUZ4QVdjQXF3a3hnWElCY1lIbEFtV0NRQUhxaVFtSThvRktpTW9JMEFqUWlORUkwWWp6QVZLSTBnalRDTk9JMUFqdUNTZEFzNEZ2aVFNQ2xJakFBYThKTG9rUUFaVUkwSUdSQVpXSTFnam9BS2hBcUlDb3dMQkFzTUNBUXFrQWtNa3BRTEJCNEVKZ3dsQkpJRWl4UUtESW9VaWh5TEhBc2tDeXdMTkFxY0NpeUxQQW8waWtTS1RJbzhpcUFLcEFxb0NneVFCQXdNREJRT3JBb0VrQ1FPRkNZY0pXU1FEQ2djRG1TS2JJcDhpQVFrTEE2RWlEUU1QQTBFSUVRTVRBNk1pcHlMQkNhVWlxU0tySW9BanJBS3RBcTRDUVFOREEwVURyd0tQSk1NSGlRbUxDWkVrUndPdElnRUVoQWl4SWtNSXN5SURCTFVpUVFSRkJMY2lRd1RESXNFaXhTTEhJc2tpUVFuQkJMRUN5eUxGQk0waXd3VFJJczhpc2dLekFyUUN0UUpCQlVNRkNRcTJBcFVrUlFYRkI0MEpqd25CQnBNa1JRZ0pJd3NqZ1FVTkk0VUZrUW1UQ1E4amd3VVRJNGNGaVFVVkk0MEZGeU9aQ1lzRkh5T0JJNUVGSVNPYkNZOEZKU01qSTdrQ3VnSzdBc0VGd3dYRkJid0NyU1RIQmNrRnh3ZVZDWmNKQVFlckpDY2p5d1VySXlralFTTkRJMFVqUnlQTkJVc2pTU09DSTAwalR5TlJJN2trdlFMUEJiOGtEUXBUSTc4Q3ZTU0RJN3NrUVFaVkkwTUdSUVpYSTFrakFUR0FEQUF1UmlSRUpFb2tTQ1FBQ0VJSlJBa0VDSWdpaGlTRUpJb2tpQ1N1SXBna2xpU2NKSm9rQUNNR0NnSWpCQXBHQ2M0SHlnZklCOHdIUnlSRkpFc2tTU1FCQ0VNSlJRa0ZDSWtpaHlTRkpJc2tpU1N2SXBra2x5U2RKSnNrQVNNSENnTWpCUXBIQ2M4SHl3ZkpCODBIVUNST0pGUWtVaVJSSkU4a1ZTUlRKSlFpbGlLVklwY2lCQ01HSXdVakJ5TVlJeGtqR2lNYkl5d2pMU011SXk4akFDU2lKS0FrcGlTa0pLZ2tveVNoSktja3BTU3BKTEFrcmlTMEpMSWt0aVN4Sks4a3RTU3pKTGNrZ2dpQUNJRUlBZ2dEQ0p3aW5TSUtDZ3NLZ3doQUM0b3NnUXlKTElnc1FDVkJKUUF0Qnk0QURVQW1RU2FBTGdFTnlDYkpKZ0F2aEM4Q0RZTXZnaTlBRGRnbTJTYUdNUVFOUUNkQkp3QXhoakFHRFlVd2hEQkJEVUFvQURJSERVOG9VQ2lBTW9Rc0F5NVhLRUlOZ1N5QUxNQWt3U1NHTElNc3dDaEREY0Fsd1NWQUtVUU53Q2JCSmdVdUFpN0FLVVVOQlM4RUw0QU4wQ2JSSm9BdlFDcUNEZUFtNFNhQU1JRXd3Q3FERFFRd0F6Q0JEY0Fud1NlQ01FQXJoQTFIS0Vnb2hER0JNUVl2Q0EyQkx3VXdSZzJETUlJeEFBNEJEa0FQZ0JHQ0VRTVBBQS9BRVFFUFFCRUNFZ1FTZ1E5QUVzQVBRaEtBRDBRU2hCS0NENFlTaUJLS0VzQVNnaEtCRVlNUlF4QkFFTUVSUVJCQkVRTVNCUkxCRUVFU0FCQkRFc0FRUlJLRkVzSVFoeEtKRW9zU3dSS0RFb0FRQUJFQkVRQVNBUktBRW9FU1FCTkJFME1UUWhORUU4SVRBQlRBRTBBVWdCVEFGRUFWUVJWQUZ3QVhRUmZBRndBWUFoZ0JHRUFZZ0JnQUdjQVl3UmdCR1VBWlFobEJHWUFad0JuQ0djRVpnQnpBSE1BZGdCOEFJQUlnQkNBR0lBZ2dRQ0NBSUlJZ3dDREJJQUFodUNLNUloQWpFU01jSXgwalRDUldKRTBrVnlTTUpJMGtuaVNmSkFBbEFpVUVKY0FyQVNVREpRVWx3U3ZDSzhNcnhDdkZLOFlyeHl1QUpZSWxoQ1hJSzRFbGd5V0ZKY2tyeWl2TEs4d3J6U3ZPSzg4ckFDWUNKZ0VtQXlhQUpvSW1nU2FESnNJbXhDYkdKZ0Fzd3liRkpzY21BU3dDTEFNc0JDd0ZMQVlzQnl6S0pzd216aVlJTE1zbXpTYlBKZ2tzQ2l3TExBd3NEU3dPTEE4czBpYlVKdFltMHliVkp0Y20yaWJjSnQ0bTJ5YmRKdDhtQUNjQ0p3RW5BeWVBSjRJbmdTZURKd0FvQWlnRUtBRW9BeWdGS0VJb1JDaEdLRWtvU3loTktFQXNTaWhNS0U0b1FTeENMRU1zUkN4RkxFWXNSeXhSS0ZNb1ZTaElMRklvVkNoV0tFa3NTaXhMTEV3c1RTeE9MRThzZ2l3QkxvQXhoeXdCTHdJdkF5OEdMb1V4QURBQk1BSXdRRVpCUm9CR3dFYkNSc0ZHQUVkQVI0Qkh3RWZDUndCSlFFbUFTWUpKQUVyQ1NRTktCRXBBU2tGS2dFcUJTc0JLd1VyQVM4RkxBRXNCUzBCTFFVdkNTOE5MZ0V1QlM0SkxnMHNBVEFGTUFrd0RUQUJXUUZSQ1ZFUlVSbFJJVkVwVVRGUk9WRkJVVWxSVVZGWlVnRlNDVklSVXdGVEJWQUJWQVZWQVZVRlZnRldCVmNCVndWV0FWc0JZQUZjQ1Z3UlhCbGNJVndwWERGY09WeEJYRWxjVVZ4WlhRRmRDVjBSWGdGZUJWOEJYd1ZjQVdBRllRRmhCV0lCWWdWZ0FXUUZaQWxrRFdVQlpnSTZDanNDT0FJOEJqMENQUVkrQmo0Q1BnNC9BajhHUEFKQUFRZURnQXd1bUgvb1lGMVlOVmhJVEZnd1dFVGJwQWpaTU51RVNFaFlURGhBTzRoSVNEQk1NK2hrWEZtMFBGZzRQQlJRTUd3OE9Ed3dyRGdJMkRnc0ZGVXNXNFE4TXdlSVFET0lBL3pBQy93Z0MveWUvSWlFQ1gxOGhJbUVDSVFKQlFpRUNJUUtmZndKZlh5RUNYejhDQlQ4aVpRRURBZ0VEQWdFREF2OElBdjhLQWdFREFsOGhBdjh5b2lFQ0lTSmZRUUwvQU9JOEJlSVQ1QXB1NUFUdUJvVE9CQTRFN2dubWFIOEVEajhnQkVJV0FXQXVBUlpCQUFFQUlRTGhDUURoQWVJYlB3SkJRdjhRWWo4TVh6OEM0U3ZpS1A4YUQ0WW8veS8vQmdML1dBRGhIaUFFdHVJaEZoRWdMdzBBNWlVUkJoWW1GaVlXQnVBQTVSTmdaVGJnQTd0TU5nMDJMK1lERmhzQU51VVlCT1VDNWczcEFuWWxCdVZiRmdYR0d3K21KQ1lQWmlYcEFrVXZCZllHQUJzRkJ1VVc1aE1nNVZIbUF3WGdCdWtDNVJubUFTUVBWZ1FnQmkzbERtWUU1Z0VFUmdTR0lQWUhBT1VSUmlBV0FPVUQ0QzNsRFFEbEN1QUQ1Z2NiNWhnSDVTNEdCd1lGUitZQVp3WW5CY2JsQWlZMjZRSVdCT1VIQmljQTVRQWdKU0RsRGdERkFBVkFaU0FHQlVkbUlDY2dKd1lGNEFBSFlDVUFSU1lnNlFJbExhc1BEUVVXQmlBbUJ3Q2xZQ1VnNVE0QXhRQWxBQ1VBSlNBR0FFY21ZQ1lnUmtBR3dHVUFCY0RwQWlaRkJoYmdBaVlIQU9VQkFFVUE1UTRBeFFBbEFJVWdCZ1ZIaGdBbUJ3QW5CaUFGNEFjbEppRHBBaFlOd0FXbUFBWW5BT1VBSUNVZzVRNEF4UUFsQUlVZ0JnVUhCZ2RtSUNjZ0p3YkFKZ2RnSlFCRkppRHBBZzhGcStBQ0JnVUFwVUJGQUdWQUpRQUZBQ1ZBSlVCRlFPVUVZQ2NHSjBCSEFFY0dJQVdnQitBRzZRSkxydzBQZ0FaSEJ1VUFBRVVBNVE4QTVRaEFCVVpuQUVZQVpzQW1BRVdBSlNZZzZRTEFGc3NQQlFZbkZ1VUFBRVVBNVE4QTVRSUFoU0FHQlFjR2h3QUdKd0FuSnNBbndBVUFKU1lnNlFJQUplQUZKaWZsQVFCRkFPVWhKZ1ZIWmdCSEFFY0dCUTlnUlFmTFJTWWc2UUxyQVErbEFBWW5BT1VLUU9VUUFPVUJBQVVneFVBR1lFZEdBQVlBNXdDZzZRSWdKeGJnQk9Vb0JpWEdZQTJsQk9ZQUZ1a0NOdUFkSlFBRkFJVUE1UkFBQlFEbEFnWWw1Z0VGSUlVQUJBQ21JT2tDSUdYZ0dBVlA5Z2NQRms4bXIra0M2d0lQQmc4R0R3WVNFeElUSitVQUFPVWNZT1lHQjRZV0pvWG1Bd0RtSEFEdkFBYXZBQytXYnpiZ0hlVWpKMllIcGdjbUp5WUY2UUsycFNjbVpVWUZSeVhIUldibEJRWW5KcWNHQlFmcEFrY0dMK0VlQUFHQUFTRGlJeFlFUXVXQXdRQmxJTVVBQlFCbElPVWhBR1VnNVJrQVpTREZBQVVBWlNEbEJ3RGxNUUJsSU9VN0lFYjJBZXNNUU9VSTd3S2c0VTRnb2lBUjVZSGtEeGJsQ1JmbEVoSVRRT1ZEVmtybEFNRGxCUUJsUnVBRDVRcEdOdUFCNVFvbTRBVGxCUUJGQUNiZ0JPVXNKZ2ZHNXdBR0orWURWZ1JXRFFVR0lPa0NvT3NDb0xZUmRrWWJBT2tDb09VYkJPVXR3SVVtNVJvR0JZRGxQdUFDNVJjQVJtY21SMkFuQnFkR1lBOUFOdWtDNVJZZ2hlQUQ1U1JnNVJLZzZRSUxRTzhhNVE4bUp3WWdOdVV0QndZSHhnQUdCd1luNWdDbjVnSWdCdWtDb09rQ29OWUV0aURtQmdnbTREZG1CK1VuQmdlR0J3YUhCaWZGWU9rQzF1OEM1Z0h2QVVBbUIrVVdCMlluSmdkR0pla0M1U1FHQnlaSEJnZEdKK0FBZHVVYzV3RG1BQ2NtUUpicEFrQkY2UUxsRnFRMjRnSEE0U01nUWZZQTRBQkdGdVlGQjhabEJxVUdKUWNtQllEaUpPUTM0Z1VFNGhya0hlWXlBSWIvZ0E3aUFQOWE0Z0RoQUtJZ29TRGlBT0VBNGdEaEFLSWdvU0RpQUFBQkFBRUFBUUEvd3VFQTRnWWc0Z0RqQU9JQTR3RGlBT01BZ2dBaVlRTU9BazVDQUNKaEEwNWlJQ0poQUU3aUFJRk9JRUlBSW1FRExnRDNBNXV4TmhRVkVqUVZFaFQyQUJnWm14ZjJBUlFWZGpCV0RCSVQ5Z01NRmhEMkFoZWJBUHNDQ3dRZ3Ewd1NFd1RyQWt3U0V3RGtCVUR0R09BSTVnVm9Ca2ptQk9BSEx3RnZBUzhDUVNKQkFnOEJMd3lCcndFUEFROEJEMkVQQW1FQ1pRSXZJaUdNUDBJUERDOENEK3NJNmhzL2Fnc3ZZSXlQTEc4TUx3d3ZETThNN3hjc0x3d1BETzhYN0lDRTd3QVNFeElUN3d3c3p4SVQ3MGtNN3hic0VlOGdyTzg5NEJIdkErQU42elR2UnVzTzc0QXZETzhCRE84dTdBRHZad3p2Z0hBU0V4SVRFaE1TRXhJVEVoTVNFK3NXN3lTTUVoUHNGeElURWhNU0V4SVRFaFBzQ08rQWVPeDdFaE1TRXhJVEVoTVNFeElURWhNU0V4SVRFaE1TRSt3M0VoTVNFK3dZRWhQc2dIcnZLT3dOTDZ6dkh5RHZHQUR2WWVFbkFPSW5BRjhoSXQ5QkFqOENQNElrUVFML1dnS3ZmMFkvZ0hZTE51SWVBQUtBQWlEbE1NQUVGdUFHQnVVUDRBSEZBTVVBeFFERkFNVUF4UURGQU1VQTVoZzJGQlVVRlZZVUZSWVVGZllCRVRZUkZoUVZOaFFWRWhNU0V4SVRFaE9XQlBZQ01YWVJGaEwyQlM4VzRDWHZFZ0R2VWVBRTc0Qk80Qkx2QkdBWFZnOEVCUW9TRXhJVEVoTVNFeElUTHhJVEVoTVNFeElURVJJekQrb0JaaWNSaEM5S0JBVVdMd0RsVGlBbUxpUUZFZVZTRmtRRmdPVWpBT1ZXQUM5cjd3TGxHTzhjNEFUbENPOFhBT3NDN3hickFBL3JCKzhZNndMdkgrc0g3NEM0NVprNDd6amx3QkYxUU9VTkJPV0Q3MER2TCtBQjVTQ2tOdVdBaEFSVzVRanBBaVhnRFA4bUJRWklGdVlDRmdUL0ZDUW01VDdxQWlhMjRBRHVEK1FCTHY4R0l2ODJCT0lBbi84Q0JDNS9CWDhpL3cxaEFvRUMvd0lnWDBFQ1ArQWlQd1VrQXNVR1JRWmxCdVVQSnlZSGJ3WkFxeThORDZEbExIYmdBQ2ZsS3VjSUp1QUFOdWtDb09ZS3BWWUZGaVVHNlFMbEZPWUFOdVVQNWdNbjRBTVc1UlZBUmdmbEp3WW5aaWNtUi9ZRkFBVHBBbUEyaFFZRTVRSHBBb1VBNVNHbUp5WW5KdUFCUlFibEFBWUhJT2tDSUhibENBU2xUd1VIQmdmbEtnWUZSaVVtaFNZRkJnWGdFQ1VFTnVVREJ5WW5OZ1VrQndiZ0FxVWdwU0NsNEFIRkFNVUE0aU1PWk9JQkJDNWc0a2psR3ljR0p3WW5GZ2NHSU9rQ29PV3JIT0FFNVE5ZzVTbGcvSWQ0L1poNDVZRG1JT1ZpNEI3QzRBU0NnQVVHNVFJTTVRVUFoUUFGQUNVQUpRRGxaTzRJNEFubGdPTVRFdUFJNVRnZzVTN2dJT1VFRFE4ZzVnaldFaE1Xb09ZSUZqRXdFaE1TRXhJVEVoTVNFeElURWhNU0V6WVNFM1pRVmdCMkVSSVRFaE1TRTFZTUVVd0FGZzAyWUlVQTVYOGdHd0JXRFZZU0V4WU1GaEUyNlFJMlREYmhFaElXRXc0UUR1SVNFZ3dUREJJVEZoSVROdVVDQk9VbEpPVVhRS1VncFNDbElFVkFMUXdPRHkwQUQyd3Y0QUpiTHlEbEJBRGxFZ0RsQ3dBbEFPVUhJT1VHNEJybGM0QldZT3NsUU84QjZpMXI3d2tyVHdEdkJVQVA0Q2Z2SlFiZ2V1VVZRT1VwNEFjRzZ4Tmc1UmhyNEFIbERBcmxBQXFBNVI2R2dPVVdBQmJsSEdEbEFCYUs0Q0xoSU9JZzVVWWc2UUtnNFJ4ZzRoeGc1U0RnQU9VczRBTVc0SUFJNVlDdjRBSGxEdUFDNVFEZ2dCQ2xJQVVBNVNRQUpVQUZJT1VQQUJickFPVVBMOHZsRitBQTZ3SGdLT1VMQUNXQWkrVU9xMEFXNVJLQUZ1QTQ1VEJnS3lYckNDRHJKZ1ZHQUNhQVptVUFSUURsRlNCR1lBYnJBY0QyQWNEbEZTc1c1UlZMNEJqbEFBL2xGQ1pnaTliZ0FlVXVRTmJsRGlEckFPVUxnT3NBNVFyQWR1QUV5K0JJNVVIZ0wrRXI0QVhpSzhDcjVSeG00QURwQXVDQW51c1hBT1VpQUNZUklDWGdSdVVWNndJRjRBRGxEdVlEYTViZ1R1VU55K0FNNVEvZ0FRY0dCK1V0NWdmV1lPc002UUxnQjBZSDVTVkhaaWNtTmh0MjRBTWJJT1VSd09rQ29FYmxISVlINWdBQTZRSjJCU2NGNEFEbEd3WTJCZUFCSmdmbEtFZm1BU2RsZG1ZV0J3YnBBZ1VXQlZZQTZ3emdBK1VLQU9VUlIwWW5CZ2NtdGdiZ09jVUFCUUJsQU9VSEFPVUNGcURsSndaSDVnQ0E2UUtnSmljQTVRQWdKU0RsRGdERkFDVUFoUUFtQlNjR1p5QW5JRWNnQmFBSGdJVW5JTVpBaHVDQUErVXRSK1lBSjBZSEJtV1c2UUkyQUJZR1JlQVc1U2hIcGdjR1p5WUhKaVVXQmVBQTZRTGdnQjdsSjBkbUlHY21CeWIyRDJVbTRCcmxLRWZtQUNjR0J5WldCZUFENlFLZzlnWGdDK1VqQmdjR0o2WUhCZ1hBNlFMZ0x1VVRJRVluWmdlR1lPa0NLMVlQNElBNDVTUkg1Z0VISmhiZ1hPRVk0aGpwQXVzQjRBVGxBQ0FGSU9VQUFDVUE1UkNuQUNjZ0pnY0dCUWNGQndaVzRBSHBBdUErNVFBZzVSOUhaaUFtWndZRkZnVUg0Qk1GNWdMbElLWUhCV2IyQUFiZ0FBV21KMGJsSnVZRkJ5WldCWmJnRmVVeDRJQi81UUVBNVIwSHhnQ21Cd1lGbHVBQzZRTHJDMEEyNVJZZzVnNEFCOFlISmdjbTRFSEZBQ1VBNVI2bVFBWUFKZ0RHQlFiZ0FPa0NvS1VBSlFEbEdJY0FKZ0FuQmdjR0JjRHBBdUNBcnVVTEppYzI0SUF2QmVBSDZ3M3ZBRzN2Q2VBRkZ1V0RFdUJlNm1jQWx1QUQ1WUE4NElvMDVZT25BUHNCNEk4LzVZRy80S0V4NVlHeHdPVVhBT2tDWURiZ1dPVVdJSVlXNEFMbEtNYVdiMlFXRCtBQzZRSUF5d0RsRFlEbEMrQ0NLT0VZNGhqckQzYmdYZVZEWUFZRjV5L0FadVFGNERna0ZnUUc0QU1uNEFibGwzRGdBT1dFVHVBaTVRSGdvbS9sZ0pmZ0tVWGdDV1hnQU9XQkJPQ0lmT1ZqZ09VRlFPVUJ3T1VDSUE4bUZudmdrdFR2Z0c3Z0F1OGZJTzgwSjBaUHAvc0E1Z0F2eHU4V1p1OHo0QS92T2tZUDRJQVM2d3pnQk85UDRBSHJFZUIvNFJMaUV1RVN3Z0RpQ3VFUzRoSUJBQ0VnQVNBaElHRUE0UUJpQUFJQXdnRGlBK0VTNGhJaEFHRWc0UUFBd1FEaUVpRUFZUUNCQUFGQXdRRGlFdUVTNGhMaEV1SVM0UkxpRXVFUzRoTGhFdUlTNFJMaUZDRGhFUXppRVF5aTRSRU00aEVNb3VFUkRPSVJES0xoRVF6aUVReWk0UkVNNGhFTW9qOGc2U3J2Z1hqbUwyL21LdThBQnU4R0JpK1c0QWVHQU9ZSDRJVEl4Z0RtQ1NER0FDWUFodUNBVGVVbFFNYkVJT2tDWUFVUDRJRG81U1JtNlFLQURlQ0VlT1dBUFNEckFjYmdJZUVhNGhyR0JHRHBBbUEyNElLSjZ6TVBTdzFyNEVUckpRL3JCK0NBT21VQTVSTUFKUUFGSUFVQTVRSUFaUUFGQUFXZ0JXQUZBQVVBQlFCRkFDVUFCU0FGQUFVQUJRQUZBQVVBSlFBRklHVUF4UUJsQUdVQUJRRGxBZ0RsQ1lCRkFJVUE1UW5nTEN6Z2dJYnZKR0R2WE9BRTd3Y2c3d2NBN3djQTd4M2dBdXNGNzRBWjRERHZGZUFGN3lSZzd3SEFMK0FHcitDQUV1K0FjNDd2Z2xEZ0FPOEZRTzhGUU85czRBVHZVY0R2Qk9BTTd3Umc3ekRnQU84Q29POGc0QUR2RmlBdjRFYnZjUUR2U2dEdmYrQUU3d1lnajBCUGdNL2dBZThSd00vZ0FVL2dCYy9nSWUrQUN3RHZMK0FkNlFMZ2czN2x3R1pXNEJybGo2M2dBK1dBVmlEbGxmcmdCdVdjcWVDTGwrV0JsdUNGV3VXU3crREtyQzRiNEJiN1dPQjQ1b0JvNE1DOWlQM0F2M1lnL2NDL2RpQUFBUFVyQUFCNkZBQUEvQVVBQUFBQUFBQ0FBQUVBb0FBQkFIQUJBUUFRQXdFQVF3TUJBR0FEQVFDd0F3RUEwQU1CQU5zREFRRHdBd0VBSUpFQUFCQUVBUUF3QkFFQVVBUUJBSEFFQVFDZ0JBRUFXUVlCQUY0R0FRQndCZ0VBc0FZQkFOQUdBUUJBQ0FFQW1RZ0JBS1VJQVFDcUNBRUFzQWdCQVBJSUFRRDJDQUVBRUFrQkFHQUpBUUNhQ1FFQXNBa0JBTThKQVFEWUNRRUE0QWtCQUtBS0FRRHdDZ0VBOEFzQkFCb01BUUF3REFFQVVBd0JBQUFOQVFEd0RRRUFEQTRCQUJBT0FRQmdEZ0VBOEE0QkFKQVBBUUNRakFBQWdJa0FRWkNBQkF0a0hBRElBSnNCTXdBUEFFRUFJQUFMQUF3QUVRQnlBaDhBRndBV0FDRUF1UUVGQUFvQU5RQVhBR1lCV1FBTUFBVUFCQUJDQUFRQUR3QkhBRG9BQ3dBZkFBa0FCQUM4QUVjQThRQXFBQXdBRmdDckFPNEFIQUFFQUVJQWtBQ2NBRE1BRlFTMEFnQkJnSUVFQzlJRnJJRCtnRVRiZ0ZKNmdFZ0lnVTRFZ0VMaWdHRE5ab0JBcUlEV2dBQUFBQURkZ0VOd0VZQ1pDWUZjSDRDYWdvcUFuNE9YZ1kyQndJd1lFUnlSQXdHSkFCUW9FUWtDQlJNa3lpRVlDQWdBSVFzTGtRa0FCZ0FwUVNHRFFLY0lnSmVBa0lCQnZJR0xpQ1FoQ1JTTkFBR0ZsNEc0QUlDY2c0aUJRVldCbm9sQmtwVytnNStCWU5SaUFBT0FRTklBZ0dEVXdOU0F4Z0VJQ1F1QWl3QUdnTUFERHdhQW13TUVBQmFBUVZPQm1JQ1lnSjZBbUlDZWdKaUFub0NZZ0o2QW1BZUJzVlgvR0pvQkFBaUFpUU1BQUNnWUFBQUNBUUFJQUFBQUFBRUFDd1lEQXdDQWlZQ1FJZ1NBa0FBQUFBQUFBQUFBUTBTQVFtbU5BQUVCQU1lS3I0d0dqNERrTXhrTGdLS0FuWS9saXVRS2lBSURRS2FMRm9XVHRRbU9BU0tKZ1p5Q3VURUpnWW1BaVlHY2dya2pDUXVBblFxQWlvSzVPQkNCbElHVkU0SzVNUW1CaUlHSmdaMkF1aUlRZ29tQXA0TzVNQkFYZ1lxQm5JSzVNQkFYZ1lxQm00TzVNQkNDaVlDSmdaeUN5aWdBaDVHQnZBR0drWURpQVNpQmo0QkFvcENLaW9DajdZc0FDNVliRUJFeWc0eUxBSW1EUm5PQm5ZR2RnWjJCd1pKQXU0R2hnUFdMZzRoQTNZUzRpWUdUeVlHK2hLK091NEtkaUFtNGlyR1NRYStOUnNDelNQV2ZZSGh6aDZHQlFXRUhnSmFFMTRHeGp3QzRnS1dFbTR1c2c2K0xwSURDallzSGdheUNzUUFSRElDckpJQkE3SWRnVHpLQVNGYUVSb1VRRElOREU0TkJnb0ZCVW9LMGpidUFySWpHZ3FPTGtZRzRncStNallIYmlBZ29RSitKbG9PNU1RbUJpWUNKZ1VEUWpBTHBrVURzTVlhY2dkR09BT21LNW8xQkFJeEE5aWdKQ2dDQVFJMHhLNENiaWFrZ2c1R0tyWTFCbGppRzBwV0FqZmtxQUFnUUFvREJJQWlEUVZ1RFlGQlhBTFl6M0lGZ1RLdUFZQ05nTUpBT0FRUkpHNEJINTVtRm1ZV1pBQUFBQUFCQXFZQ09nRUgwaURHZGhOK0FzNEJac0w2TWdLR2tRckNBaklDUGpFRFNqME5QbVVlUmdXQjZIWUZBMFlCQWhvRkRZWU5nSVYrUFEwV1pZY3hmbVlXWmhaa0FRZUNHQkF0QlNiMkFsNEJCWllDWGdPV0FsNEJBNllDUmdlYUFsNEQyZ0k2QVRWU0FSTldBVUNDQllNOXRnVk9kZ0plQVFWZUFpNEJBOElCRGY0Qmd1RE1IaEd3dXJOOEFRYkNIQkFzM1EwNkFUZzZCUmxLQlNLNkFVUDJBWU00NmdNNkliUUFHQUozZi8wRHZUZzlZaElGSWtJQ1VnRTlyZ1VDMmdFTE9nRS9naUVabmdBQkI4SWNFQ3hGRi80VkExb0N3Z0VIUmdHRUgyWUNPZ0FCQmtJZ0VDemREZVlCS3Q0RCtnR0FoNW9GZ3k4Q0ZRWldCOHdBQUFBQUFBQUNBUVI2QkFFTjVnR0F0SDRGZ3k4Q0ZRWldCOHdBQUFBQUFBQUNBQUVIUWlBUUxGa0hEQ0FpQnBJRk8zS29LVG9jL1A0ZUxnSTZBcm9BQVFmQ0lCQXNoUU42QXo0Q1hnRVE4Z0ZrUmdFRGtQeitIaVJFRkFoR0FxUkdBWU5zSGhvdUVBRUdnaVFRTGhRUkFud1lBQVFBQkVoQ0NuNERQQVlDTEI0RDdBUUdBcFlCQXU0aWVLWVRhQ0lHSmdLTUVBZ1FJZ01tQ25JQkJrNEJBazREWGcwTGVoL3NJZ05JQmdLRVJnRUQ4Z1VMVWdQNkFwNEd0Z0xXQWlBTURBNENMZ0lnQUpvQ1FnSWdEQXdPQWk0QkJRWURoZ1VaU2dkU0RSUndRaW9DUmdKdU1nS0drUU5tQVFOVUFBQUFBQUFBQlB6K0hpUkVFQUNrRUVvQ0lFb0NJRVJFRUNJOEFJSXNTS2dnTEFBZUNqQWFTZ1pxQWpJcUExaGdRaWdFTUNnQVFFUUlHQlJ5Rmo0K1BpSUJBb1FpQlFQZUJRVFRWbVpwRklJRG1ndVNBUVo2QlFQQ0FRUzZBMG9DTFFOV3BnTFFBZ3Q4SmdONkFzTjJDamQrZWdLZUhyb0JCZjJCeW00RkEwWUJBaG9GRFlZT0lnR0JObFVFTkNBQ0JpUUFBQ1lMRGdlbWxob3NrQUpjRUFBRUJnT3VnUVdxUnY0RzFwNHlDbVpXVWdZdUFrZ01hQUlCQWhnaUFuNWxBZ3hVTkRRb1dCb0NJWUx5bWcxUzVobzJIdjRWQ1B0U0F4Z0VJQ1F1QWl3QUdnTUFERHdhQW13TUVBQmFBUVZPQlFTT0JzVlgvR0pvQkFBaUFpUU1BQUNnWUFBQUNBUUFJQUFBQUFBRUFDd1lEQXdDQWlZQ1FJZ1NBa0VKRGlvU2VnSitaZ3FLQTdvS01xNE9JTVVtZGlXRDhCVUlkYXdYaFQvK3ZpVFdaaFVZYmdGbndnWm1FdG9NQUFBQUFBQUFBQUt5QVJWdUFzb0JPUUlCRUJJQklDSVc4Z0thQWpvQkJoWUJNQXdHQW5ndUFRZHFBa29EdWdHRE5qNEdrZ0ltQVFLaUFUNTZBQUVHd2pRUUxGMEZJZ0VVb2dFa0NBSUJJS0lGSXhJVkN1SUZ0M05XQUFFSFFqUVFMNWdMZEFJREdCUU1CZ1VIMlFKNEhKWkFMZ0lpQlFQeUVRTkNBdHBDQW1nQUJBRUNGTzRGQWhRc0tnc0thMm9xNWlxR0JRTWlidklDUEFvT2JnTW1BajREdGdJK0E3WUNQZ0s2Q3U0Q1BCb0QyZ1A2QTdZQ1BnT3lCajREN2dQc29nT3FBaklUS2dab0FBQU9Cd1JDQnZZRHZBSUduQzRTWU1JQ0pnVUxBZ2tSb2lvaUFRVnFDUVRnNWdLK045WUNPZ0tXSXRZRkFpWUcvaGRHWUdDZ0tzYjdZaTZRaWdrRzhBSUtLZ295Q2pJS01nVXp2Z2tFOGdFSDVoZWlEM29CZ2RYR0Fpd2lBbTRIUmdZMmg1WUxzZ1VESmdKcVJ1SU9qZ042QWk0Q2pnRUNVZ3NDRHNvRGpoSWlDLzRGZ1R5K0FRd0NQUVEwQWdLNkFySUhDZ0VMN2dFZ0RnVUk2aFVJZGlrRm5nZmVCdllETGdJaUM1NEZBc1lIUWdJK0FsektFUU13Q2dQcUJRUHFCL1lEMWdmS0FRUXlCUVFFTGdFQ2JnTktBa1lEUWdFR2tnRUVCQUlIUWdHQk5WNFM2aGtSWGtNK0JZR0YwRWk4NWhwMkRUNEdHUWJTRFJkK0c3QkNDQUVIQWtBUUx4UUZBdG9CQ0Y0RkRiWUJCdUlCRFdZQkM3NEQrZ0VsQ2dMZUFRbUtBUVkyQXc0QlRpSUNxaE9hQjNJSmdieFdBUmZXQVE4R0FsWUJBaUlEcmdKU0JZRlI2Z0ZQcmdFSm5na1RPZ0dCUXFJRkVtd2lBWUhGWGdVZ0ZncStKTlptRllQNm9pVFdaaFdBdjd3bUhZQy94Z1FBQVlEQUZnWmlJallKRHhGbS92MkJSL0dCWkFrRnRnZWxnZFFtQW1sZjNoMFRWcVloZ0pHWkJpMkJOQTJDbTNhRlFOSXBBM1lGV2dZMWRNRXdlUWgxRjRWTktZQ0FMZ1U0L2hQcUVTdThSZ0dDUStRa0FnUUJCa0pJRUMwZGcvYytmUWcyQllQLzlnV0QvL1lGZy8vMkJZUC85Z1dELy9ZRmcvLzJCWVAvOWdXRC8vWUZnLy8yQllQLzlnV0QvL1lGZy8vMkJZUC85Z1dELy9ZRmcvLzJCWVAvOWdRQkI0SklFQzBXZ2pvbUdtUmlBbVlPaE1BQUlBQXNEQW9DV2dKNkFYeGVYaDQ2QmtvQ0pRVEJDejBDZlFuV2RSR3RCLy85QmdCT1lqb0JnelF5QlFRU0JpSVNSZ09PQVg0ZUJsNEVBUWJDVEJBdTNBcUVEZ0VDQ2dJNkFYMXVIbUlGT0JvQkJ5SU9NZ21ET0lJTkF2QU9BMllGZ0xuK1pnTmlMUU5WaDhlV1pBQUFBQUtDQWk0Q1BnRVZJZ0VDVGdVQ3pnS3FDUVBXQXZBQUNnVUVrZ1ViamdVTVZBNEZEQklCQXhZRkF5d1NBUVRtQlFXR0RRSzBKZ1VEYWdjQ0JRN3VCaUlKTjQ0Q01nRUhFZ0dCMCs0QkJEWUZBNGdLQVFYMkIxWUhlZ0VDWGdVQ1Nna0NQZ1VENGdHQlNaUUtCUUtpQWk0Q1BnTUNBU3ZPQlJQeUVRT3lCOUlQK2drQ0FEWUNQZ2RjSWdldUFRYUNCUVhRTWp1aUJRUGlDUWdRQWdFRDZnZGFCUWFPQlFyT0JZRXQwZ1VDRWdNQ0Jpb0JEVW9CZ1RnV0FYZWVBQUFBQUFPaUJRTU9BUVJpQW5ZQ3pnSk9BUVQrQTRRQ0FXUWlBc29DTUFvQkFnNEJBbklCQnBJQkExWUZMTVlCaHA2U0JzWUd4Z2JHQnNZR3hnYkdCc1lHeGdiR0JzWUd4Z2JHQkFFSHdsUVFMOFFHZ2dJa0FnSW9LZ0VNOUI0QkNBSUM0Z01lQWpRR0JRTE9BcW9vQVFPcUJ0WTZlZ0VFRWdVVHpnVUNyQTRWQk5vRkRGSWREQklEN2dzYUJRSndTZ0tZWmdVRTVnVUZoZzBDdENJSkEyb1M5Z1VPN2dZaUNUZU9BakFPQWlRQ0JRYkNCWUhUNmdVRU1na0RpaEVGOWdkV0Izb0JBbG9KQWtvTCtnSStCUVBpQVlGSmpFSU5BcUlDSkFJQ0tDb0RBQVlCRU9ZQ3ZnRVNGZ0VER2dFRTFnVUNYaGNPRjJJTkR0NFJBN0lidmcvNkNRSUFOZ0krQjE0VHJnRUdnZ291QlFXVWFqdWlCUVBpQ1FnUUFnRUQ2Z2RZTGdVR2RncXlBUW9TQlJYYUVZRVg0Z1VDRWdNQ0NpWUJEVVlGZ1RnV0FYZWFEQUVId2x3UUxObUF6LzFtL3YyQlIvR0JhRUFnQWdZa0FBQW1DWVFYVllLYmRvVkEwaWtEZGdWYUJqVjB3VkI1VFNsZ0tnbURsOFk5dEF1OUE3d0JCc0pnRUN4YUloSkdBNDRDWmdGWGVnRWwraXB3TWdLNkFUNStBQUVIUW1BUUxnZ1NuZ1pFQWdKc0FnSndBZ0t5QWpvQk9mWU5IWElGSm00R0pnYldCallGQXNJQkF2eG9xQWdvWUdBQURpQ0NBa1NPSUNBQTVuZ3NnaUFtU0lZZ2hDNWVCanp1VERvRkVQSTNKQVJnSUZCd1NqVUdTbFEyQWpUZzFFQndCREJnQ0NZa3BnWXVTQXdnQUNBTWhLcGVCaWdzWUNRdXFENENuSUFBVUloZ1VBRUQvZ0VJQ0dnaUJqUW1KUWQySkQyRE9QQ3lCUUtHQmtRQ0Ftd0NBbkFBQUNJRmcxM2FBdUlDNGdMaUF1SUFBQUFBQUFLSUZCSW51QTRCZmpJQ0xnRURYZ0pXQTJZV09nVUZ1Z1l1QVFLV0FtSW9hUU1hQVFPYUJpWUNJZ0xrWWhJZ0JBUWtEQVFBSkFnSVBGQUFFaTRvSkFBaUFrUUdCa1NnQUNnd0JDNEdLREFrRUNBQ0Jrd3dvR1FNQkFTZ0JBQUFGQWdXQWlZR09BUU1BQXhDQWlvR3Znb2lBallDTmdFRnpnVUhPZ3BLQnNnT0FSTm1BaTRCQ1dBQ0FZYjFwZ0VESmdFQ2ZnWXVCalFHSnlwa0Jsb0NUQVlpVWdVQ3RvWUh2Q1FLQjBncUFRUWFBdm9vb2x6RVBpd0VaQTRHTUNRZUJpQVNDaXhjUkFBTUZBZ1hWcjhVbkNqMFFBUkNCaVVEaWkwRWZyb0NKZ0xHQTBZQ3k3eUlVaG9pWU5vaUNqSVlBQUtJRkJJbGYwb0JBMUlCZzNTcUFZUFBWbVVINmhFV3ZnMndHYTk5aDgvcUVZQ1ljZ0VEYWdJK0RZY3gyZ0xzUkFZTDBDWXFVa2hBYUFqQUFsNEJBeUF1QWxBT0JRSzBTaE5LQWo0S0lnSXFBUWo0QkJ6MkFpSWtLdDRDOENBaUFrQkNNQUVIZ25BUUwrUVJnSXhtQlFNd2FBWUJDQ0lHVWdiR0xxb0NTZ0l3SGdaQU1Ed1NBbEFZSUF3RUdBNEdiZ0tJQUF4Q0F2SUtYZ0kyQVExcUJzZ09BWWNTdGdFREpnRUM5QVluS21RQ1hnSk1CSUlLVWdVQ3RvSXVJZ01XQWxZdXFISXVRRUlMR0FJQkF1b0crakJpWGtZQ1pnWXlBMWRTdnhTZ1NDcElPaUVEaWkwRWZyb0NKZ0xHQTBZQ3k3eUlVaG9pWU5vaUNqSVpBcUFPQVg0eUFpNEJBMTRDVmdObUZqb0ZCYm9HTGdONkF4WUNZaWhwQXhvQkE1b0dKZ0lpQXVSZ29pNER4aWZXQmlnQUFLQkFvaVlHT0FRTUFBeENBaW9Tc2dvaUFqWUNOZ0VGemdVSE9ncEtCc2dPQVJObUFpNEJDV0FDQVliMWxRUCtNZ3A2QXU0V0xnWTBCaVpHNG1vNkpnSk1CaUFPSVFiR0VRVDJIUVFtdi8vT0wxS3FMZzdlSGlZV25oNTNSaTY2QWlZQkJ1RUQvUS8wQUFBQUFRS3lBUXFDQVFzdUFTMEdCUmxLQjFJTkgrNFNaaExDUFVQT0FZTXlhajBEdWdFQ2ZnTTZJWUx5bWcxVE9oMnd1aEUvL0h3OEhBd0VBQUFBQUFBQUFBSUFBQUFBQUNBQUFBQUFCQUFBQUlBQUFBQUFFQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQ0FBQUFBZ0FBQUFJQUFBQUNBQUFBQWdBQUFBSUFBQUFDQUFBQUFnQUFBQUlBQUFBQ0FBQUFBZ0FBQUFJQUFBQUNBQUFBQWdBQUFBSUFBQUFDQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNQUFBQURBQUFBQXdBQUFBTUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCUUFBQUFVQVFlT2hCQXVWQW9BQUFBQUFZRTdDVUtmMDFOUUFBQUJBQUFBQUFOSm9JRGZLNVI0S2pXU0VNWG8rRmJoMU1wZ3R4R2xUbmFxcXFpcXJxcXFxTUNkaEtGUjZhbXFoSm9nbTV2M3pQb01UQUNWRXA4aTZCbWUwSXduSHdJTHhLWmNpN1QzSXN2MS9uaUVyVjYybGlEdkRJS3NwZk5vQUFBQWdBQUFBQUg2MVVCK3poRmlzeGl5eUhtL2lwb29ZNFNFZXNxcGREQ0hOblIza05KaERlRXdrSFdVTmVqYUpCYlFjREQ0WHJGdlpTeHdOSzllb2FOZnFHMHpPK0pocE5KQWI1WElQQlQ5RE94c1ZiN0F1ZFcvckdqajhScHpyT0tBYUYvMDdEbUl3V1JwV2pJMnp3L1FWR3VhaWxTdmNNTllaK2Q1OXpKbVptUm1hbVptWmdPeGZHVEdVWUlwNzdpZ1orU0pQQzg5cTlCZ1k0d2FNUmpMQ0dEMmZDdHdBUVlPa0JBdk9BU0JIQTdneUFBQUFRQ1k4VFVwSEE3aFMvZG5WV1FBQUFHQ09CbkJsSmp4TmF2Q3BzMjVIQTdoeWpnQnFkdjNaMVhsdFB3VjlBQUFBZ045K3pJS09CbkNGcmdYdmh5WThUWXBGM1kyTThLbXpqZ0VGd1pCSEE3aVNUSGlhbEk0QWFwYldDU2lZL2RuVm1ZK1VkSnR0UHdXZHM4YUluZ0FBQUtBM3JXdWgzMzdNb2lNV0k2U09CbkNsQUFBQUFBRUFBQUFLQUFBQVpBQUFBT2dEQUFBUUp3QUFvSVlCQUVCQ0R3Q0FscGdBQU9IMUJRREttanNBQUFBQUFBQUFBSlFBQUFCM0FBQUFXUUFBQURzQUFBQWRBRUhncFFRTG93T0FBSUFBZ1FDQ0FJTUFoQUNGQUlZQWh3Q0lBSWtBaWdDTEFJd0FqUUNPQUk4QWtBQ1FBSkVBa2dDVEFKUUFsUUNXQUpZQWx3Q1lBSmtBbWdDYkFKc0FuQUNkQUo0QW53Q2dBS0FBb1FDaUFLTUFvd0NrQUtVQXBnQ25BS2NBcUFDcEFLb0FxZ0NyQUt3QXJRQ3RBSzRBcndDd0FMQUFzUUN5QUxJQXN3QzBBTFVBdFFDMkFMY0F0d0M0QUxrQXVRQzZBTHNBdXdDOEFMMEF2UUMrQUw4QXdBREFBTUVBd1FEQ0FNTUF3d0RFQU1VQXhRREdBTWNBeHdESUFNa0F5UURLQU1zQXl3RE1BTXdBelFET0FNNEF6d0RRQU5BQTBRRFJBTklBMHdEVEFOUUExQURWQU5ZQTFnRFhBTmNBMkFEWkFOa0EyZ0RhQU5zQTJ3RGNBTjBBM1FEZUFONEEzd0RnQU9BQTRRRGhBT0lBNGdEakFPTUE1QURsQU9VQTVnRG1BT2NBNXdEb0FPZ0E2UURxQU9vQTZ3RHJBT3dBN0FEdEFPMEE3Z0R1QU84QThBRHdBUEVBOFFEeUFQSUE4d0R6QVBRQTlBRDFBUFVBOWdEMkFQY0E5d0Q0QVBnQStRRDVBUG9BK2dEN0FQc0EvQUQ4QVAwQS9RRCtBUDRBL3dBZ0ZCQU5EQXNLQ2drSkNBZ0lDQWdIQndjSEJ3Y0hCZ1lHQmdZR0JnWUdCZ1lHQmdCQmtLa0VDeFFCQUxBeUFRQndNd0VBMERZQkFEQTNBUUJRUGdCQnNLa0VDOEFCTVY5U01qYzc2d1dmMm00a0FWbnlOV2hYTHdJYXVoNEZEdUY3RU9CMDFSem1CamdGbUwvV0xBQUFBQUFBQUFBQW1sVkpCS2xzdWg1R2pzRXVDeFpnQ0FjVE1nMGdFZlVMT0NsbUR6NnJNZ240N2tBdkJRbDJMZ0FBQUFBQUFBQUFUN3RoQldlczNUOFlMVVJVK3lIcFA1djJnZElMYys4L0dDMUVWUHNoK1QvaVpTOGlmeXQ2UEFkY0ZETW1wb0U4dmN2d2VvZ0hjRHdIWEJRekpxYVJQQmd0UkZUN0llay9HQzFFVlBzaDZiL1NJVE4vZk5rQ1FOSWhNMzk4MlFMQUFFSC9xZ1FMNkJXQUdDMUVWUHNoQ1VBWUxVUlUreUVKd0FNQUFBQUVBQUFBQkFBQUFBWUFBQUNEK2FJQVJFNXVBUHdwRlFEUlZ5Y0EzVFQxQUdMYndBQThtWlVBUVpCREFHTlIvZ0M3M3FzQXQySEZBRHB1SkFEU1RVSUFTUWJnQUFucUxnQWNrdEVBNngzK0FDbXhIQURvUHFjQTlUV0NBRVM3TGdDYzZZUUF0Q1p3QUVGK1h3RFdrVGtBVTRNNUFKejBPUUNMWDRRQUtQbTlBUGdmT3dEZS81Y0FENWdGQUJFdjd3QUtXb3NBYlI5dEFNOStOZ0FKeXljQVJrKzNBSjVtUHdBdDZsOEF1aWQxQU9Ycnh3QTllL0VBOXprSEFKSlNpZ0Q3YStvQUg3RmZBQWhkalFBd0ExWUFlL3hHQVBDcmF3QWd2TThBTnZTYUFPT3BIUUJlWVpFQUNCdm1BSVdaWlFDZ0ZGOEFqVUJvQUlEWS93QW5jMDBBQmdZeEFNcFdGUURKcUhNQWUrSmdBR3VNd0FBWnhFY0F6V2ZEQUFubzNBQlpneW9BaTNiRUFLWWNsZ0JFcjkwQUdWZlJBS1UrQlFBRkIvOEFNMzQvQU1JeTZBQ1lUOTRBdTMweUFDWTl3d0FlYSs4QW4vaGVBRFVmT2dCLzhzb0E4WWNkQUh5UUlRQnFKSHdBMVc3NkFEQXRkd0FWTzBNQXRSVEdBTU1ablFDdHhNSUFMRTFCQUF3QVhRQ0dmVVlBNDNFdEFKdkdtZ0F6WWdBQXROSjhBTFNubHdBM1ZkVUExejcyQUtNUUdBQk5kdndBWkowcUFIRFhxd0JqZlBnQWVyQlhBQmNWNXdEQVNWWUFPOWJaQUtlRU9BQWtJOHNBMW9wM0FGcFVJd0FBSDdrQThRb2JBQm5PM3dDZk1mOEFaaDVxQUpsWFlRQ3MrMGNBZm4vWUFDSmx0d0F5NklrQTVyOWdBTy9FelFCc05na0FYVC9VQUJiZTF3QllPOTRBM3B1U0FOSWlLQUFvaHVnQTRsaE5BTWJLTWdBSTR4WUE0SDNMQUJmQVVBRHpIYWNBR09CYkFDNFROQUNERW1JQWcwZ0JBUFdPV3dDdHNIOEFIdW55QUVoS1F3QVFaOU1BcXQzWUFLNWZRZ0JxWWM0QUNpaWtBTk9adEFBR3B2SUFYSGQvQUtQQ2d3QmhQSWdBaW5ONEFLK01XZ0J2MTcwQUxhWmpBUFMveXdDTmdlOEFKc0ZuQUZYS1JRREsyVFlBS0tqU0FNSmhqUUFTeVhjQUJDWVVBQkpHbXdERVdjUUF5TVZFQUUyeWtRQUFGL01BMUVPdEFDbEo1UUQ5MVJBQUFMNzhBQjZVekFCd3p1NEFFejcxQU96eGdBQ3o1OE1BeC9nb0FKTUZsQURCY1Q0QUxnbXpBQXRGOHdDSUVwd0FxeUI3QUM2MW53Qkhrc0lBZXpJdkFBeFZiUUJ5cDVBQWErY2ZBREhMbGdCNUZrb0FRWG5pQVBUZmlRRG9sSmNBNHVhRUFKa3hsd0NJN1dzQVgxODJBTHY5RGdCSW1yUUFaNlJzQUhGeVFnQ05YVElBbnhXNEFMemxDUUNOTVNVQTkzUTVBREFGSEFBTkRBRUFTd2hvQUN6dVdBQkhxcEFBZE9jQ0FMM1dKQUQzZmFZQWJraHlBSjhXN3dDT2xLWUF0SkgyQU5GVFVRRFBDdklBSUpnekFQVkxmZ0N5WTJnQTNUNWZBRUJkQXdDRmlYOEFWVklwQURka3dBQnQyQkFBTWtneUFGdE1kUUJPY2RRQVJWUnVBQXNKd1FBcTlXa0FGR2JWQUNjSG5RQmRCRkFBdER2YkFPcDJ4UUNIK1JjQVNXdDlBQjBudWdDV2FTa0F4c3lzQUswVVZBQ1E0bW9BaU5tSkFDeHlVQUFFcEw0QWR3ZVVBUE13Y0FBQS9DY0E2bkdvQUdiQ1NRQms0RDBBbDkyREFLTS9sd0JEbFAwQURZYU1BREZCM2dDU09aMEEzWENNQUJlMzV3QUkzenNBRlRjckFGeUFvQUJhZ0pNQUVCR1NBQS9vMkFCc2dLOEEyLzlMQURpUUR3QlpHSFlBWXFVVkFHSEx1d0RIaWJrQUVFQzlBTkx5QkFCSmRTY0E2N2IyQU5zaXV3QUtGS29BaVNZdkFHU0RkZ0FKT3pNQURwUWFBRkU2cWdBZG84SUFyKzJ1QUZ3bUVnQnR3azBBTFhxY0FNQldsd0FEUDRNQUNmRDJBQ3RBakFCdE1aa0FPYlFIQUF3Z0ZRRFl3MXNBOVpMRUFNYXRTd0JPeXFVQXB6Zk5BT2FwTmdDcmtwUUEzVUpvQUJsajNnQjJqTzhBYUl0U0FQemJOd0N1b2FzQTN4VXhBQUN1b1FBTSs5b0FaRTFtQU8wRnR3QXBaVEFBVjFhL0FFZi9PZ0JxK2JrQWRiN3pBQ2lUM3dDcmdEQUFab3oyQUFUTEZRRDZJZ1lBMmVRZEFEMnpwQUJYRzQ4QU5zMEpBRTVDNlFBVHZxUUFNeU8xQVBDcUdnQlBaYWdBMHNHbEFBcy9Ed0JiZU0wQUkvbDJBSHVMQkFDSkYzSUF4cVpUQUc5dTRnRHY2d0FBbTBwWUFNVGF0d0NxWnJvQWRzL1BBTkVDSFFDeDhTMEFqSm5CQU1PdGR3Q0dTTm9BOTEyZ0FNYUE5QUNzOEM4QTNleWFBRDljdkFEUTNtMEFrTWNmQUNyYnRnQ2pKVG9BQUsrYUFLMVRrd0MyVndRQUtTMjBBRXVBZmdEYUI2Y0FkcW9PQUh0Wm9RQVdFaW9BM0xjdEFQcmwvUUNKMi80QWliNzlBT1IyYkFBR3Fmd0FQb0J3QUlWdUZRRDloLzhBS0Q0SEFHRm5Nd0FxR0lZQVRiM3FBTFBucndDUGJXNEFsV2M1QURHL1d3Q0UxMGdBTU44V0FNY3RRd0FsWVRVQXlYRE9BRERMdUFDL2JQMEFwQUNpQUFWczVBQmEzYUFBSVc5SEFHSVMwZ0M1WElRQWNHRkpBR3RXNEFDWlVnRUFVRlUzQUI3VnR3QXo4Y1FBRTI1ZkFGMHc1QUNGTHFrQUhiTERBS0V5TmdBSXQ2UUE2ckhVQUJiM0lRQ1BhZVFBSi85M0FBd0RnQUNOUUMwQVQ4MmdBQ0NsbVFDem90TUFMMTBLQUxUNVFnQVIyc3NBZmI3UUFKdmJ3UUNyRjcwQXlxS0JBQWhxWEFBdVZSY0FKd0JWQUg4VThBRGhCNFlBRkF0a0FKWkJqUUNIdnQ0QTJ2MHFBR3NsdGdCN2lUUUFCZlArQUxtL25nQm9hazhBU2lxb0FFL0VXZ0F0K0x3QTExcVlBUFRIbFFBTlRZMEFJRHFtQUtSWFh3QVVQN0VBZ0RpVkFNd2dBUUJ4M1lZQXlkNjJBTDlnOVFCTlpSRUFBUWRyQUl5d3JBQ3l3TkFBVVZWSUFCNzdEZ0NWY3NNQW93WTdBTUJBTlFBRzNIc0E0RVhNQUU0cCtnRFd5c2dBNlBOQkFIeGszZ0NiWk5nQTJiNHhBS1NYd3dCM1dOUUFhZVBGQVBEYUV3QzZPandBUmhoR0FGVjFYd0RTdmZVQWJwTEdBS3d1WFFBT1JPMEFIRDVDQUdIRWh3QXAvZWtBNTliekFDSjh5Z0J2a1RVQUNPREZBUC9YalFCdWF1SUFzUDNHQUpNSXdRQjhYWFFBYTYyeUFNMXVuUUErY25zQXhoRnFBUGZQcVFBcGM5OEF0Y202QUxjQVVRRGlzZzBBZExva0FPVjlZQUIwMklvQURSVXNBSUVZREFCK1pwUUFBU2tXQUo5NmRnRDkvYjRBVmtYdkFObCtOZ0RzMlJNQWk3cTVBTVNYL0FBeHFDY0E4VzdEQUpURk5nRFlxRllBdEtpMUFNL01EZ0FTaVMwQWIxYzBBQ3hXaVFDWnp1TUExaUM1QUd0ZXFnQStLcHdBRVYvTUFQMExTZ0RoOVBzQWpqdHRBT0tHTEFEcDFJUUEvTFNwQU8vdTBRQXVOY2tBTHpsaEFEZ2hSQUFiMmNnQWdmd0tBUHRLYWdBdkhOZ0FVN1NFQUU2WmpBQlVJc3dBS2xYY0FNREcxZ0FMR1pZQUduQzRBR21WWkFBbVdtQUFQMUx1QUg4UkR3RDB0UkVBL012MUFEUzhMUUEwdk80QTZGM01BTjFlWUFCbmpwc0FralB2QU1rWHVBQmhXSnNBNFZlOEFGR0R4Z0RZUGhBQTNYRklBQzBjM1FDdkdLRUFJU3hHQUZuejF3RFplcGdBbmxUQUFFK0crZ0JXQnZ3QTVYbXVBSWtpTmdBNHJTSUFaNVBjQUZYb3FnQ0NKamdBeXVlYkFGRU5wQUNaTTdFQXFkY09BR2tGU0FCbHN2QUFmNGluQUloTWx3RDUwVFlBSVpLekFIdUNTZ0NZenlFQVFKL2NBTnhIVlFEaGREb0FaK3RDQVA2ZDN3QmUxRjhBZTJla0FMcXNlZ0JWOXFJQUs0Z2pBRUc2VlFCWmJnZ0FJU3FHQURsSGd3Q0o0K1lBNVo3VUFFbjdRQUQvVnVrQUhBL0tBTVZaaWdDVStpc0EwOEhGQUEvRnp3RGJXcTRBUjhXR0FJVkRZZ0FoaGpzQUxIbVVBQkJoaHdBcVRIc0FnQ3dhQUVPL0VnQ0lKcEFBZUR5SkFLakU1QURsMjNzQXhEckNBQ2IwNmdEM1o0b0FEWksvQUdXakt3QTlrN0VBdlh3TEFLUlIzQUFuM1dNQWFlSGRBSnFVR1FDb0taVUFhTTRvQUFudHRBQkVueUFBVHBqS0FIQ0NZd0IrZkNNQUQ3a3lBS2YxamdBVVZ1Y0FJZkVJQUxXZEtnQnZmazBBcFJsUkFMWDVxd0NDMzlZQWx0MWhBQlkyQWdERU9wOEFnNktoQUhMdGJRQTVqWG9BZ3JpcEFHc3lYQUJHSjFzQUFEVHRBTklBZHdEODlGVUFBVmxOQU9CeGdBQkI4OEFFQzY0QlFQc2grVDhBQUFBQUxVUjBQZ0FBQUlDWVJ2ZzhBQUFBWUZITWVEc0FBQUNBZ3h2d09RQUFBRUFnSlhvNEFBQUFnQ0tDNHpZQUFBQUFIZk5wTmRGMG5nQlhuYjBxZ0hCU0QvLy9QaWNLQUFBQVpBQUFBT2dEQUFBUUp3QUFvSVlCQUVCQ0R3Q0FscGdBQU9IMUJSa0FDZ0FaR1JrQUFBQUFCUUFBQUFBQUFBa0FBQUFBQ3dBQUFBQUFBQUFBR1FBUkNoa1pHUU1LQndBQkFBa0xHQUFBQ1FZTEFBQUxBQVlaQUFBQUdSa1pBRUd4d2dRTElRNEFBQUFBQUFBQUFCa0FDZzBaR1JrQURRQUFBZ0FKRGdBQUFBa0FEZ0FBRGdCQjY4SUVDd0VNQUVIM3dnUUxGUk1BQUFBQUV3QUFBQUFKREFBQUFBQUFEQUFBREFCQnBjTUVDd0VRQUVHeHd3UUxGUThBQUFBRUR3QUFBQUFKRUFBQUFBQUFFQUFBRUFCQjM4TUVDd0VTQUVIcnd3UUxIaEVBQUFBQUVRQUFBQUFKRWdBQUFBQUFFZ0FBRWdBQUdnQUFBQm9hR2dCQm9zUUVDdzRhQUFBQUdob2FBQUFBQUFBQUNRQkIwOFFFQ3dFVUFFSGZ4QVFMRlJjQUFBQUFGd0FBQUFBSkZBQUFBQUFBRkFBQUZBQkJqY1VFQ3dFV0FFR1p4UVFMSnhVQUFBQUFGUUFBQUFBSkZnQUFBQUFBRmdBQUZnQUFNREV5TXpRMU5qYzRPVUZDUTBSRlJnQkI1TVVFQ3dFNkFFR014Z1FMQ1AvLy8vLy8vLy8vQUVIUXhnUUxBeEF2VVFCQjNNWUVDeDBEQUFBQUFBQUFBQUlBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBQlFCQmhNY0VDd0tXQVFCQm5NY0VDd3VYQVFBQW1BRUFBT3dxQVFCQnRNY0VDd0VDQUVIRXh3UUxDUC8vLy8vLy8vLy9BRUdJeUFRTENYZ2pBUUFBQUFBQUJRQkJuTWdFQ3dLWkFRQkJ0TWdFQ3c2WEFRQUFtZ0VBQVBncUFRQUFCQUJCek1nRUN3RUJBRUhjeUFRTEJmLy8vLzhLQUVHZ3lRUUxBeEFrQVE9PVwiO1xuICAgICAgICBpZiAoIVIuc3RhcnRzV2l0aChRKSkge1xuICAgICAgICAgICAgdmFyIGZhID0gUjtcbiAgICAgICAgICAgIFIgPSBhLmxvY2F0ZUZpbGUgPyBhLmxvY2F0ZUZpbGUoZmEsIHgpIDogeCArIGZhO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhKGIpIHsgdHJ5IHtcbiAgICAgICAgICAgIGlmIChiID09IFIgJiYgRSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoRSk7XG4gICAgICAgICAgICB2YXIgYyA9IEMoYik7XG4gICAgICAgICAgICBpZiAoYylcbiAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgIGlmIChBKVxuICAgICAgICAgICAgICAgIHJldHVybiBBKGIpO1xuICAgICAgICAgICAgdGhyb3cgXCJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZFwiO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChkKSB7XG4gICAgICAgICAgICBGKGQpO1xuICAgICAgICB9IH1cbiAgICAgICAgZnVuY3Rpb24gaWEoYikgeyBpZiAoIUUgJiYgKHUgfHwgdikpIHtcbiAgICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGZldGNoICYmICFiLnN0YXJ0c1dpdGgoXCJmaWxlOi8vXCIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaChiLCB7IGNyZWRlbnRpYWxzOiBcInNhbWUtb3JpZ2luXCIgfSkudGhlbihmdW5jdGlvbiAoYykgeyBpZiAoIWMub2spXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFwiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnXCIgKyBiICsgXCInXCI7IHJldHVybiBjLmFycmF5QnVmZmVyKCk7IH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGhhKGIpOyB9KTtcbiAgICAgICAgICAgIGlmICh6KVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYywgZCkgeyB6KGIsIGZ1bmN0aW9uIChlKSB7IGMobmV3IFVpbnQ4QXJyYXkoZSkpOyB9LCBkKTsgfSk7XG4gICAgICAgIH0gcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gaGEoYik7IH0pOyB9XG4gICAgICAgIGZ1bmN0aW9uIGphKGIsIGMsIGQpIHsgcmV0dXJuIGlhKGIpLnRoZW4oZnVuY3Rpb24gKGUpIHsgcmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGUsIGMpOyB9KS50aGVuKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlOyB9KS50aGVuKGQsIGZ1bmN0aW9uIChlKSB7IEQoXCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiBcIiArIGUpOyBGKGUpOyB9KTsgfVxuICAgICAgICBmdW5jdGlvbiBrYShiLCBjKSB7IHZhciBkID0gUjsgcmV0dXJuIEUgfHwgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyB8fCBkLnN0YXJ0c1dpdGgoUSkgfHwgZC5zdGFydHNXaXRoKFwiZmlsZTovL1wiKSB8fCB3IHx8IFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZmV0Y2ggPyBqYShkLCBiLCBjKSA6IGZldGNoKGQsIHsgY3JlZGVudGlhbHM6IFwic2FtZS1vcmlnaW5cIiB9KS50aGVuKGZ1bmN0aW9uIChlKSB7IHJldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhlLCBiKS50aGVuKGMsIGZ1bmN0aW9uIChmKSB7IEQoXCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogXCIgKyBmKTsgRChcImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uXCIpOyByZXR1cm4gamEoZCwgYiwgYyk7IH0pOyB9KTsgfVxuICAgICAgICBmdW5jdGlvbiBTKGIpIHsgZm9yICg7IDAgPCBiLmxlbmd0aDspXG4gICAgICAgICAgICBiLnNoaWZ0KCkoYSk7IH1cbiAgICAgICAgdmFyIGxhID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgVGV4dERlY29kZXIgPyBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpIDogdm9pZCAwO1xuICAgICAgICBmdW5jdGlvbiBuYShiLCBjLCBkKSB7IHZhciBlID0gYyArIGQ7IGZvciAoZCA9IGM7IGJbZF0gJiYgIShkID49IGUpOylcbiAgICAgICAgICAgICsrZDsgaWYgKDE2IDwgZCAtIGMgJiYgYi5idWZmZXIgJiYgbGEpXG4gICAgICAgICAgICByZXR1cm4gbGEuZGVjb2RlKGIuc3ViYXJyYXkoYywgZCkpOyBmb3IgKGUgPSBcIlwiOyBjIDwgZDspIHtcbiAgICAgICAgICAgIHZhciBmID0gYltjKytdO1xuICAgICAgICAgICAgaWYgKGYgJiAxMjgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZyA9IGJbYysrXSAmIDYzO1xuICAgICAgICAgICAgICAgIGlmICgxOTIgPT0gKGYgJiAyMjQpKVxuICAgICAgICAgICAgICAgICAgICBlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGYgJiAzMSkgPDwgNiB8IGcpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGJbYysrXSAmIDYzO1xuICAgICAgICAgICAgICAgICAgICBmID0gMjI0ID09IChmICYgMjQwKSA/IChmICYgMTUpIDw8IDEyIHwgZyA8PCA2IHwgaCA6IChmICYgNykgPDwgMTggfCBnIDw8IDEyIHwgaCA8PCA2IHwgYltjKytdICYgNjM7XG4gICAgICAgICAgICAgICAgICAgIDY1NTM2ID4gZiA/IGUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShmKSA6IChmIC09IDY1NTM2LCBlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTYgfCBmID4+IDEwLCA1NjMyMCB8IGYgJiAxMDIzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShmKTtcbiAgICAgICAgfSByZXR1cm4gZTsgfVxuICAgICAgICBmdW5jdGlvbiBUKGIsIGMpIHsgcmV0dXJuIGIgPyBuYShKLCBiLCBjKSA6IFwiXCI7IH1cbiAgICAgICAgdmFyIG9hID0gWzAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1XSwgcGEgPSBbMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzRdO1xuICAgICAgICBmdW5jdGlvbiBVKGIpIHsgZm9yICh2YXIgYyA9IDAsIGQgPSAwOyBkIDwgYi5sZW5ndGg7ICsrZCkge1xuICAgICAgICAgICAgdmFyIGUgPSBiLmNoYXJDb2RlQXQoZCk7XG4gICAgICAgICAgICAxMjcgPj0gZSA/IGMrKyA6IDIwNDcgPj0gZSA/IGMgKz0gMiA6IDU1Mjk2IDw9IGUgJiYgNTczNDMgPj0gZSA/IChjICs9IDQsICsrZCkgOiBjICs9IDM7XG4gICAgICAgIH0gcmV0dXJuIGM7IH1cbiAgICAgICAgZnVuY3Rpb24gVihiLCBjLCBkKSB7IHZhciBlID0gSjsgaWYgKCEoMCA8IGQpKVxuICAgICAgICAgICAgcmV0dXJuIDA7IHZhciBmID0gYzsgZCA9IGMgKyBkIC0gMTsgZm9yICh2YXIgZyA9IDA7IGcgPCBiLmxlbmd0aDsgKytnKSB7XG4gICAgICAgICAgICB2YXIgaCA9IGIuY2hhckNvZGVBdChnKTtcbiAgICAgICAgICAgIGlmICg1NTI5NiA8PSBoICYmIDU3MzQzID49IGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgayA9IGIuY2hhckNvZGVBdCgrK2cpO1xuICAgICAgICAgICAgICAgIGggPSA2NTUzNiArICgoaCAmIDEwMjMpIDw8IDEwKSB8IGsgJiAxMDIzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKDEyNyA+PSBoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPj0gZClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZVtjKytdID0gaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICgyMDQ3ID49IGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMgKyAxID49IGQpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZVtjKytdID0gMTkyIHwgaCA+PiA2O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKDY1NTM1ID49IGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICsgMiA+PSBkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZVtjKytdID0gMjI0IHwgaCA+PiAxMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICsgMyA+PSBkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZVtjKytdID0gMjQwIHwgaCA+PiAxODtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVbYysrXSA9IDEyOCB8IGggPj4gMTIgJiA2MztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlW2MrK10gPSAxMjggfCBoID4+IDYgJiA2MztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZVtjKytdID0gMTI4IHwgaCAmIDYzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVbY10gPSAwOyByZXR1cm4gYyAtIGY7IH1cbiAgICAgICAgZnVuY3Rpb24gcWEoYikgeyB2YXIgYyA9IFUoYikgKyAxLCBkID0gcmEoYyk7IGQgJiYgVihiLCBkLCBjKTsgcmV0dXJuIGQ7IH1cbiAgICAgICAgdmFyIFcgPSB7fTtcbiAgICAgICAgZnVuY3Rpb24gc2EoKSB7IGlmICghWCkge1xuICAgICAgICAgICAgdmFyIGIgPSB7IFVTRVI6IFwid2ViX3VzZXJcIiwgTE9HTkFNRTogXCJ3ZWJfdXNlclwiLCBQQVRIOiBcIi9cIiwgUFdEOiBcIi9cIiwgSE9NRTogXCIvaG9tZS93ZWJfdXNlclwiLCBMQU5HOiAoXCJvYmplY3RcIiA9PSB0eXBlb2YgbmF2aWdhdG9yICYmIG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlc1swXSB8fCBcIkNcIikucmVwbGFjZShcIi1cIiwgXCJfXCIpICsgXCIuVVRGLThcIiwgXzogdCB8fCBcIi4vdGhpcy5wcm9ncmFtXCIgfSwgYztcbiAgICAgICAgICAgIGZvciAoYyBpbiBXKVxuICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gV1tjXSA/IGRlbGV0ZSBiW2NdIDogYltjXSA9IFdbY107XG4gICAgICAgICAgICB2YXIgZCA9IFtdO1xuICAgICAgICAgICAgZm9yIChjIGluIGIpXG4gICAgICAgICAgICAgICAgZC5wdXNoKGMgKyBcIj1cIiArIGJbY10pO1xuICAgICAgICAgICAgWCA9IGQ7XG4gICAgICAgIH0gcmV0dXJuIFg7IH1cbiAgICAgICAgdmFyIFgsIHRhID0gW251bGwsIFtdLCBbXV07XG4gICAgICAgIGZ1bmN0aW9uIHVhKGIsIGMsIGQsIGUpIHsgdmFyIGYgPSB7IHN0cmluZzogbCA9PiB7IHZhciBxID0gMDsgaWYgKG51bGwgIT09IGwgJiYgdm9pZCAwICE9PSBsICYmIDAgIT09IGwpIHtcbiAgICAgICAgICAgICAgICBxID0gVShsKSArIDE7XG4gICAgICAgICAgICAgICAgdmFyIG1hID0gWShxKTtcbiAgICAgICAgICAgICAgICBWKGwsIG1hLCBxKTtcbiAgICAgICAgICAgICAgICBxID0gbWE7XG4gICAgICAgICAgICB9IHJldHVybiBxOyB9LCBhcnJheTogbCA9PiB7IHZhciBxID0gWShsLmxlbmd0aCk7IEkuc2V0KGwsIHEpOyByZXR1cm4gcTsgfSB9OyBiID0gYVtcIl9cIiArIGJdOyB2YXIgZyA9IFtdLCBoID0gMDsgaWYgKGUpXG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGUubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgciA9IGZbZFtrXV07XG4gICAgICAgICAgICAgICAgciA/ICgwID09PSBoICYmIChoID0gdmEoKSksIGdba10gPSByKGVba10pKSA6IGdba10gPSBlW2tdO1xuICAgICAgICAgICAgfSBkID0gYi5hcHBseShudWxsLCBnKTsgcmV0dXJuIGQgPSBmdW5jdGlvbiAobCkgeyAwICE9PSBoICYmIHdhKGgpOyByZXR1cm4gXCJzdHJpbmdcIiA9PT0gYyA/IFQobCkgOiBcImJvb2xlYW5cIiA9PT0gYyA/ICEhbCA6IGw7IH0oZCk7IH1cbiAgICAgICAgdmFyIHhhID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBhdG9iID8gYXRvYiA6IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgICAgICB2YXIgYyA9IFwiXCIsIGQgPSAwO1xuICAgICAgICAgICAgYiA9IGIucmVwbGFjZSgvW15BLVphLXowLTlcXCtcXC89XS9nLCBcIlwiKTtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2YXIgZSA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIi5pbmRleE9mKGIuY2hhckF0KGQrKykpO1xuICAgICAgICAgICAgICAgIHZhciBmID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiLmluZGV4T2YoYi5jaGFyQXQoZCsrKSk7XG4gICAgICAgICAgICAgICAgdmFyIGcgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCIuaW5kZXhPZihiLmNoYXJBdChkKyspKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIi5pbmRleE9mKGIuY2hhckF0KGQrKykpO1xuICAgICAgICAgICAgICAgIGUgPSBlIDw8IDIgfCBmID4+IDQ7XG4gICAgICAgICAgICAgICAgZiA9IChmICYgMTUpIDw8IDQgfCBnID4+IDI7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSAoZyAmIDMpIDw8IDYgfCBoO1xuICAgICAgICAgICAgICAgIGMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShlKTtcbiAgICAgICAgICAgICAgICA2NCAhPT0gZyAmJiAoYyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGYpKTtcbiAgICAgICAgICAgICAgICA2NCAhPT0gaCAmJiAoYyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGspKTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGQgPCBiLmxlbmd0aCk7XG4gICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgfTtcbiAgICAgICAgZnVuY3Rpb24gQyhiKSB7IGlmIChiLnN0YXJ0c1dpdGgoUSkpIHtcbiAgICAgICAgICAgIGIgPSBiLnNsaWNlKFEubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChcImJvb2xlYW5cIiA9PSB0eXBlb2YgdyAmJiB3KSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBCdWZmZXIuZnJvbShiLCBcImJhc2U2NFwiKTtcbiAgICAgICAgICAgICAgICBjID0gbmV3IFVpbnQ4QXJyYXkoYy5idWZmZXIsIGMuYnl0ZU9mZnNldCwgYy5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHhhKGIpLCBlID0gbmV3IFVpbnQ4QXJyYXkoZC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGIgPSAwOyBiIDwgZC5sZW5ndGg7ICsrYilcbiAgICAgICAgICAgICAgICAgICAgICAgIGVbYl0gPSBkLmNoYXJDb2RlQXQoYik7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkNvbnZlcnRpbmcgYmFzZTY0IHN0cmluZyB0byBieXRlcyBmYWlsZWQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICB9IH1cbiAgICAgICAgdmFyIHlhID0geyBhOiBmdW5jdGlvbiAoYiwgYywgZCwgZSkgeyBGKFwiQXNzZXJ0aW9uIGZhaWxlZDogXCIgKyBUKGIpICsgXCIsIGF0OiBcIiArIFtjID8gVChjKSA6IFwidW5rbm93biBmaWxlbmFtZVwiLCBkLCBlID8gVChlKSA6IFwidW5rbm93biBmdW5jdGlvblwiXSk7IH0sIGw6IGZ1bmN0aW9uIChiLCBjKSB7XG4gICAgICAgICAgICAgICAgYiA9IG5ldyBEYXRlKDFFMyAqIChMW2IgPj4gMl0gKyA0Mjk0OTY3Mjk2ICogS1tiICsgNCA+PiAyXSkpO1xuICAgICAgICAgICAgICAgIEtbYyA+PiAyXSA9IGIuZ2V0U2Vjb25kcygpO1xuICAgICAgICAgICAgICAgIEtbYyArIDQgPj4gMl0gPSBiLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICAgICAgICBLW2MgKyA4ID4+IDJdID0gYi5nZXRIb3VycygpO1xuICAgICAgICAgICAgICAgIEtbYyArIDEyID4+IDJdID0gYi5nZXREYXRlKCk7XG4gICAgICAgICAgICAgICAgS1tjICsgMTYgPj4gMl0gPSBiLmdldE1vbnRoKCk7XG4gICAgICAgICAgICAgICAgS1tjICsgMjAgPj4gMl0gPSBiLmdldEZ1bGxZZWFyKCkgLSAxOTAwO1xuICAgICAgICAgICAgICAgIEtbYyArIDI0ID4+IDJdID0gYi5nZXREYXkoKTtcbiAgICAgICAgICAgICAgICB2YXIgZCA9IGIuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICBLW2MgKyAyOCA+PiAyXSA9ICgwICE9PSBkICUgNCB8fCAwID09PSBkICUgMTAwICYmIDAgIT09IGQgJSA0MDAgPyBwYSA6IG9hKVtiLmdldE1vbnRoKCldICsgYi5nZXREYXRlKCkgLSAxIHwgMDtcbiAgICAgICAgICAgICAgICBLW2MgKyAzNiA+PiAyXSA9IC0oNjAgKiBiLmdldFRpbWV6b25lT2Zmc2V0KCkpO1xuICAgICAgICAgICAgICAgIGQgPSAobmV3IERhdGUoYi5nZXRGdWxsWWVhcigpLCA2LCAxKSkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgICAgICAgICB2YXIgZSA9IChuZXcgRGF0ZShiLmdldEZ1bGxZZWFyKCksIDAsIDEpKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgICAgICAgICAgICAgIEtbYyArIDMyID4+IDJdID0gKGQgIT0gZSAmJiBiLmdldFRpbWV6b25lT2Zmc2V0KCkgPT0gTWF0aC5taW4oZSwgZCkpIHwgMDtcbiAgICAgICAgICAgIH0sIGs6IGZ1bmN0aW9uIChiLCBjLCBkKSB7IGZ1bmN0aW9uIGUocikgeyByZXR1cm4gKHIgPSByLnRvVGltZVN0cmluZygpLm1hdGNoKC9cXCgoW0EtWmEteiBdKylcXCkkLykpID8gclsxXSA6IFwiR01UXCI7IH0gdmFyIGYgPSAobmV3IERhdGUpLmdldEZ1bGxZZWFyKCksIGcgPSBuZXcgRGF0ZShmLCAwLCAxKSwgaCA9IG5ldyBEYXRlKGYsIDYsIDEpOyBmID0gZy5nZXRUaW1lem9uZU9mZnNldCgpOyB2YXIgayA9IGguZ2V0VGltZXpvbmVPZmZzZXQoKTsgTFtiID4+IDJdID0gNjAgKiBNYXRoLm1heChmLCBrKTsgS1tjID4+IDJdID0gTnVtYmVyKGYgIT0gayk7IGIgPSBlKGcpOyBjID0gZShoKTsgYiA9IHFhKGIpOyBjID0gcWEoYyk7IGsgPCBmID8gKExbZCA+PiAyXSA9IGIsIExbZCArIDQgPj4gMl0gPSBjKSA6IChMW2QgPj4gMl0gPSBjLCBMW2QgKyA0ID4+IDJdID0gYik7IH0sIGI6IGZ1bmN0aW9uICgpIHsgRihcIlwiKTsgfSxcbiAgICAgICAgICAgIG06IGZ1bmN0aW9uICgpIHsgcmV0dXJuIERhdGUubm93KCk7IH0sIGo6IGZ1bmN0aW9uIChiKSB7IHZhciBjID0gSi5sZW5ndGg7IGIgPj4+PSAwOyBpZiAoMjE0NzQ4MzY0OCA8IGIpXG4gICAgICAgICAgICAgICAgcmV0dXJuICExOyBmb3IgKHZhciBkID0gMTsgNCA+PSBkOyBkICo9IDIpIHtcbiAgICAgICAgICAgICAgICB2YXIgZSA9IGMgKiAoMSArIC4yIC8gZCk7XG4gICAgICAgICAgICAgICAgZSA9IE1hdGgubWluKGUsIGIgKyAxMDA2NjMyOTYpO1xuICAgICAgICAgICAgICAgIHZhciBmID0gTWF0aCwgZyA9IGYubWluO1xuICAgICAgICAgICAgICAgIGUgPSBNYXRoLm1heChiLCBlKTtcbiAgICAgICAgICAgICAgICBlICs9ICg2NTUzNiAtIGUgJSA2NTUzNikgJSA2NTUzNjtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBoID0gRy5idWZmZXI7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBHLmdyb3coZy5jYWxsKGYsIDIxNDc0ODM2NDgsIGUpIC0gaC5ieXRlTGVuZ3RoICsgNjU1MzUgPj4+IDE2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIE0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKHIpIHsgfVxuICAgICAgICAgICAgICAgICAgICBrID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICAgICAgfSByZXR1cm4gITE7IH0sIGU6IGZ1bmN0aW9uIChiLCBjKSB7XG4gICAgICAgICAgICAgICAgdmFyIGQgPSAwO1xuICAgICAgICAgICAgICAgIHNhKCkuZm9yRWFjaChmdW5jdGlvbiAoZSwgZikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGMgKyBkO1xuICAgICAgICAgICAgICAgICAgICBmID0gTFtiICsgNCAqIGYgPj4gMl0gPSBnO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGcgPSAwOyBnIDwgZS5sZW5ndGg7ICsrZylcbiAgICAgICAgICAgICAgICAgICAgICAgIElbZisrID4+IDBdID0gZS5jaGFyQ29kZUF0KGcpO1xuICAgICAgICAgICAgICAgICAgICBJW2YgPj4gMF0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBkICs9IGUubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIDE7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9LCBmOiBmdW5jdGlvbiAoYiwgYykgeyB2YXIgZCA9IHNhKCk7IExbYiA+PiAyXSA9IGQubGVuZ3RoOyB2YXIgZSA9IDA7IGQuZm9yRWFjaChmdW5jdGlvbiAoZikgeyBlICs9IGYubGVuZ3RoICsgMTsgfSk7IExbYyA+PiAyXSA9IGU7IHJldHVybiAwOyB9LCBkOiBmdW5jdGlvbiAoKSB7IHJldHVybiA1MjsgfSwgaTogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzA7IH0sIGM6IGZ1bmN0aW9uIChiLCBjLCBkLCBlKSB7IGZvciAodmFyIGYgPSAwLCBnID0gMDsgZyA8IGQ7IGcrKykge1xuICAgICAgICAgICAgICAgIHZhciBoID0gTFtjID4+IDJdLCBrID0gTFtjICsgNCA+PiAyXTtcbiAgICAgICAgICAgICAgICBjICs9IDg7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBrOyByKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBKW2ggKyByXSwgcSA9IHRhW2JdO1xuICAgICAgICAgICAgICAgICAgICAwID09PSBsIHx8IDEwID09PSBsID8gKCgxID09PSBiID8gYWEgOiBEKShuYShxLCAwKSksIHEubGVuZ3RoID0gMCkgOiBxLnB1c2gobCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGYgKz0gaztcbiAgICAgICAgICAgIH0gTFtlID4+IDJdID0gZjsgcmV0dXJuIDA7IH0sIG86IGZ1bmN0aW9uIChiLCBjLCBkLCBlLCBmKSB7IHJldHVybiBhLmNhbGxiYWNrcy5jYWxsRnVuY3Rpb24odm9pZCAwLCBiLCBjLCBkLCBlLCBmKTsgfSwgbjogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5jYWxsYmFja3Muc2hvdWxkSW50ZXJydXB0KHZvaWQgMCwgYik7XG4gICAgICAgICAgICB9LCBoOiBmdW5jdGlvbiAoYiwgYywgZCkgeyBkID0gVChkKTsgcmV0dXJuIGEuY2FsbGJhY2tzLmxvYWRNb2R1bGVTb3VyY2Uodm9pZCAwLCBiLCBjLCBkKTsgfSwgZzogZnVuY3Rpb24gKGIsIGMsIGQsIGUpIHsgZCA9IFQoZCk7IGUgPSBUKGUpOyByZXR1cm4gYS5jYWxsYmFja3Mubm9ybWFsaXplTW9kdWxlKHZvaWQgMCwgYiwgYywgZCwgZSk7IH0gfTtcbiAgICAgICAgKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gYihkKSB7IGQgPSBkLmV4cG9ydHM7IGEuYXNtID0gZDsgRyA9IGEuYXNtLnA7IE0oKTsgY2EudW5zaGlmdChhLmFzbS5xKTsgTi0tOyBhLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMgJiYgYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKE4pOyBpZiAoMCA9PSBOICYmIChudWxsICE9PSBPICYmIChjbGVhckludGVydmFsKE8pLCBPID0gbnVsbCksIFApKSB7XG4gICAgICAgICAgICB2YXIgZSA9IFA7XG4gICAgICAgICAgICBQID0gbnVsbDtcbiAgICAgICAgICAgIGUoKTtcbiAgICAgICAgfSByZXR1cm4gZDsgfSB2YXIgYyA9IHsgYTogeWEgfTsgTisrOyBhLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMgJiYgYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKE4pOyBpZiAoYS5pbnN0YW50aWF0ZVdhc20pXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLmluc3RhbnRpYXRlV2FzbShjLCBiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChkKSB7XG4gICAgICAgICAgICAgICAgRChcIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6IFwiICsgZCksIG4oZCk7XG4gICAgICAgICAgICB9IGthKGMsIGZ1bmN0aW9uIChkKSB7IGIoZC5pbnN0YW5jZSk7IH0pLmNhdGNoKG4pOyByZXR1cm4ge307IH0pKCk7XG4gICAgICAgIHZhciByYSA9IGEuX21hbGxvYyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChyYSA9IGEuX21hbGxvYyA9IGEuYXNtLnIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19UaHJvdyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfVGhyb3cgPSBhLmFzbS5zKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3RXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld0Vycm9yID0gYS5hc20udCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVTZXRNZW1vcnlMaW1pdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUnVudGltZVNldE1lbW9yeUxpbWl0ID0gYS5hc20udSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVDb21wdXRlTWVtb3J5VXNhZ2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1J1bnRpbWVDb21wdXRlTWVtb3J5VXNhZ2UgPSBhLmFzbS52KS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfUnVudGltZUR1bXBNZW1vcnlVc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUnVudGltZUR1bXBNZW1vcnlVc2FnZSA9IGEuYXNtLncpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SZWNvdmVyYWJsZUxlYWtDaGVjayA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUmVjb3ZlcmFibGVMZWFrQ2hlY2sgPSBhLmFzbS54KS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfQnVpbGRJc1Nhbml0aXplTGVhayA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfQnVpbGRJc1Nhbml0aXplTGVhayA9IGEuYXNtLnkpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SdW50aW1lU2V0TWF4U3RhY2tTaXplID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19SdW50aW1lU2V0TWF4U3RhY2tTaXplID0gYS5hc20ueikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldFVuZGVmaW5lZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfR2V0VW5kZWZpbmVkID0gYS5hc20uQSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldE51bGwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldE51bGwgPSBhLmFzbS5CKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfR2V0RmFsc2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldEZhbHNlID0gYS5hc20uQykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldFRydWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldFRydWUgPSBhLmFzbS5EKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3UnVudGltZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3UnVudGltZSA9IGEuYXNtLkUpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19GcmVlUnVudGltZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRnJlZVJ1bnRpbWUgPSBhLmFzbS5GKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3Q29udGV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3Q29udGV4dCA9IGEuYXNtLkcpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19GcmVlQ29udGV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRnJlZUNvbnRleHQgPSBhLmFzbS5IKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRnJlZVZhbHVlUG9pbnRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRnJlZVZhbHVlUG9pbnRlciA9IGEuYXNtLkkpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX2ZyZWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fZnJlZSA9IGEuYXNtLkopLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19GcmVlVmFsdWVQb2ludGVyUnVudGltZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRnJlZVZhbHVlUG9pbnRlclJ1bnRpbWUgPSBhLmFzbS5LKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRnJlZVZvaWRQb2ludGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19GcmVlVm9pZFBvaW50ZXIgPSBhLmFzbS5MKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRnJlZUNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0ZyZWVDU3RyaW5nID0gYS5hc20uTSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0R1cFZhbHVlUG9pbnRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRHVwVmFsdWVQb2ludGVyID0gYS5hc20uTikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld09iamVjdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3T2JqZWN0ID0gYS5hc20uTykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld09iamVjdFByb3RvID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19OZXdPYmplY3RQcm90byA9IGEuYXNtLlApLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19OZXdBcnJheSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3QXJyYXkgPSBhLmFzbS5RKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3RmxvYXQ2NCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3RmxvYXQ2NCA9IGEuYXNtLlIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRGbG9hdDY0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19HZXRGbG9hdDY0ID0gYS5hc20uUykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3U3RyaW5nID0gYS5hc20uVCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldFN0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfR2V0U3RyaW5nID0gYS5hc20uVSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld1N5bWJvbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3U3ltYm9sID0gYS5hc20uVikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldFN5bWJvbERlc2NyaXB0aW9uT3JLZXkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldFN5bWJvbERlc2NyaXB0aW9uT3JLZXkgPSBhLmFzbS5XKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfSXNHbG9iYWxTeW1ib2wgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0lzR2xvYmFsU3ltYm9sID0gYS5hc20uWCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0lzSm9iUGVuZGluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfSXNKb2JQZW5kaW5nID0gYS5hc20uWSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0V4ZWN1dGVQZW5kaW5nSm9iID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19FeGVjdXRlUGVuZGluZ0pvYiA9IGEuYXNtLlopLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRQcm9wID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19HZXRQcm9wID0gYS5hc20uXykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1NldFByb3AgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1NldFByb3AgPSBhLmFzbS4kKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRGVmaW5lUHJvcCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRGVmaW5lUHJvcCA9IGEuYXNtLmFhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfQ2FsbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfQ2FsbCA9IGEuYXNtLmJhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfUmVzb2x2ZUV4Y2VwdGlvbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUmVzb2x2ZUV4Y2VwdGlvbiA9IGEuYXNtLmNhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRHVtcCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRHVtcCA9IGEuYXNtLmRhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRXZhbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRXZhbCA9IGEuYXNtLmVhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfVHlwZW9mID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19UeXBlb2YgPSBhLmFzbS5mYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldEdsb2JhbE9iamVjdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfR2V0R2xvYmFsT2JqZWN0ID0gYS5hc20uZ2EpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19OZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBhLmFzbS5oYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1Rlc3RTdHJpbmdBcmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1Rlc3RTdHJpbmdBcmcgPSBhLmFzbS5pYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0J1aWxkSXNEZWJ1ZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfQnVpbGRJc0RlYnVnID0gYS5hc20uamEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19CdWlsZElzQXN5bmNpZnkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0J1aWxkSXNBc3luY2lmeSA9IGEuYXNtLmthKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3RnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld0Z1bmN0aW9uID0gYS5hc20ubGEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19Bcmd2R2V0SlNWYWx1ZUNvbnN0UG9pbnRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfQXJndkdldEpTVmFsdWVDb25zdFBvaW50ZXIgPSBhLmFzbS5tYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVFbmFibGVJbnRlcnJ1cHRIYW5kbGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19SdW50aW1lRW5hYmxlSW50ZXJydXB0SGFuZGxlciA9IGEuYXNtLm5hKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfUnVudGltZURpc2FibGVJbnRlcnJ1cHRIYW5kbGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19SdW50aW1lRGlzYWJsZUludGVycnVwdEhhbmRsZXIgPSBhLmFzbS5vYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVFbmFibGVNb2R1bGVMb2FkZXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1J1bnRpbWVFbmFibGVNb2R1bGVMb2FkZXIgPSBhLmFzbS5wYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVEaXNhYmxlTW9kdWxlTG9hZGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19SdW50aW1lRGlzYWJsZU1vZHVsZUxvYWRlciA9IGEuYXNtLnFhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBmdW5jdGlvbiB2YSgpIHsgcmV0dXJuICh2YSA9IGEuYXNtLnNhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG4gICAgICAgIGZ1bmN0aW9uIHdhKCkgeyByZXR1cm4gKHdhID0gYS5hc20udGEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbiAgICAgICAgZnVuY3Rpb24gWSgpIHsgcmV0dXJuIChZID0gYS5hc20udWEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbiAgICAgICAgYS5fX19zdGFydF9lbV9qcyA9IDc0OTE2O1xuICAgICAgICBhLl9fX3N0b3BfZW1fanMgPSA3NTgxODtcbiAgICAgICAgYS5jd3JhcCA9IGZ1bmN0aW9uIChiLCBjLCBkLCBlKSB7IHZhciBmID0gIWQgfHwgZC5ldmVyeShnID0+IFwibnVtYmVyXCIgPT09IGcgfHwgXCJib29sZWFuXCIgPT09IGcpOyByZXR1cm4gXCJzdHJpbmdcIiAhPT0gYyAmJiBmICYmICFlID8gYVtcIl9cIiArIGJdIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdWEoYiwgYywgZCwgYXJndW1lbnRzKTsgfTsgfTtcbiAgICAgICAgYS5VVEY4VG9TdHJpbmcgPSBUO1xuICAgICAgICBhLnN0cmluZ1RvVVRGOCA9IGZ1bmN0aW9uIChiLCBjLCBkKSB7IHJldHVybiBWKGIsIGMsIGQpOyB9O1xuICAgICAgICBhLmxlbmd0aEJ5dGVzVVRGOCA9IFU7XG4gICAgICAgIHZhciBaO1xuICAgICAgICBQID0gZnVuY3Rpb24gemEoKSB7IFogfHwgQWEoKTsgWiB8fCAoUCA9IHphKTsgfTtcbiAgICAgICAgZnVuY3Rpb24gQWEoKSB7IGZ1bmN0aW9uIGIoKSB7IGlmICghWiAmJiAoWiA9ICEwLCBhLmNhbGxlZFJ1biA9ICEwLCAhSCkpIHtcbiAgICAgICAgICAgIFMoY2EpO1xuICAgICAgICAgICAgbShhKTtcbiAgICAgICAgICAgIGlmIChhLm9uUnVudGltZUluaXRpYWxpemVkKVxuICAgICAgICAgICAgICAgIGEub25SdW50aW1lSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgICAgIGlmIChhLnBvc3RSdW4pXG4gICAgICAgICAgICAgICAgZm9yIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGEucG9zdFJ1biAmJiAoYS5wb3N0UnVuID0gW2EucG9zdFJ1bl0pOyBhLnBvc3RSdW4ubGVuZ3RoOykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEucG9zdFJ1bi5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBkYS51bnNoaWZ0KGMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFMoZGEpO1xuICAgICAgICB9IH0gaWYgKCEoMCA8IE4pKSB7XG4gICAgICAgICAgICBpZiAoYS5wcmVSdW4pXG4gICAgICAgICAgICAgICAgZm9yIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGEucHJlUnVuICYmIChhLnByZVJ1biA9IFthLnByZVJ1bl0pOyBhLnByZVJ1bi5sZW5ndGg7KVxuICAgICAgICAgICAgICAgICAgICBlYSgpO1xuICAgICAgICAgICAgUyhiYSk7XG4gICAgICAgICAgICAwIDwgTiB8fCAoYS5zZXRTdGF0dXMgPyAoYS5zZXRTdGF0dXMoXCJSdW5uaW5nLi4uXCIpLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGEuc2V0U3RhdHVzKFwiXCIpOyB9LCAxKTsgYigpOyB9LCAxKSkgOiBiKCkpO1xuICAgICAgICB9IH1cbiAgICAgICAgaWYgKGEucHJlSW5pdClcbiAgICAgICAgICAgIGZvciAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBhLnByZUluaXQgJiYgKGEucHJlSW5pdCA9IFthLnByZUluaXRdKTsgMCA8IGEucHJlSW5pdC5sZW5ndGg7KVxuICAgICAgICAgICAgICAgIGEucHJlSW5pdC5wb3AoKSgpO1xuICAgICAgICBBYSgpO1xuICAgICAgICByZXR1cm4gUXVpY2tKU1Jhdy5yZWFkeTtcbiAgICB9KTtcbn0pKCk7XG5pZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuICAgIG1vZHVsZS5leHBvcnRzID0gUXVpY2tKU1JhdztcbmVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSlcbiAgICBkZWZpbmUoW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIFF1aWNrSlNSYXc7IH0pO1xuZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuICAgIGV4cG9ydHNbXCJRdWlja0pTUmF3XCJdID0gUXVpY2tKU1Jhdztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVtc2NyaXB0ZW4tbW9kdWxlLldBU01fUkVMRUFTRV9TWU5DLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWlja0pTRkZJID0gdm9pZCAwO1xuLyoqXG4gKiBMb3ctbGV2ZWwgRkZJIGJpbmRpbmdzIHRvIFF1aWNrSlMncyBFbXNjcmlwdGVuIG1vZHVsZS5cbiAqIFNlZSBpbnN0ZWFkIFtbUXVpY2tKU0NvbnRleHRdXSwgdGhlIHB1YmxpYyBKYXZhc2NyaXB0IGludGVyZmFjZSBleHBvc2VkIGJ5IHRoaXNcbiAqIGxpYnJhcnkuXG4gKlxuICogQHVuc3RhYmxlIFRoZSBGRkkgaW50ZXJmYWNlIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZSBhbmQgbWF5IGNoYW5nZS5cbiAqL1xuY2xhc3MgUXVpY2tKU0ZGSSB7XG4gICAgY29uc3RydWN0b3IobW9kdWxlKSB7XG4gICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlO1xuICAgICAgICAvKiogU2V0IGF0IGNvbXBpbGUgdGltZS4gKi9cbiAgICAgICAgdGhpcy5ERUJVRyA9IGZhbHNlO1xuICAgICAgICB0aGlzLlFUU19UaHJvdyA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX1Rocm93XCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld0Vycm9yID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3RXJyb3JcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfUnVudGltZVNldE1lbW9yeUxpbWl0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZVNldE1lbW9yeUxpbWl0XCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVDb21wdXRlTWVtb3J5VXNhZ2UgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lQ29tcHV0ZU1lbW9yeVVzYWdlXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVEdW1wTWVtb3J5VXNhZ2UgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lRHVtcE1lbW9yeVVzYWdlXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1JlY292ZXJhYmxlTGVha0NoZWNrID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUmVjb3ZlcmFibGVMZWFrQ2hlY2tcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19CdWlsZElzU2FuaXRpemVMZWFrID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfQnVpbGRJc1Nhbml0aXplTGVha1wiLCBcIm51bWJlclwiLCBbXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVTZXRNYXhTdGFja1NpemUgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lU2V0TWF4U3RhY2tTaXplXCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0dldFVuZGVmaW5lZCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0dldFVuZGVmaW5lZFwiLCBcIm51bWJlclwiLCBbXSk7XG4gICAgICAgIHRoaXMuUVRTX0dldE51bGwgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19HZXROdWxsXCIsIFwibnVtYmVyXCIsIFtdKTtcbiAgICAgICAgdGhpcy5RVFNfR2V0RmFsc2UgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19HZXRGYWxzZVwiLCBcIm51bWJlclwiLCBbXSk7XG4gICAgICAgIHRoaXMuUVRTX0dldFRydWUgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19HZXRUcnVlXCIsIFwibnVtYmVyXCIsIFtdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3UnVudGltZSA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld1J1bnRpbWVcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19GcmVlUnVudGltZSA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0ZyZWVSdW50aW1lXCIsIG51bGwsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld0NvbnRleHQgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdDb250ZXh0XCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0ZyZWVDb250ZXh0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRnJlZUNvbnRleHRcIiwgbnVsbCwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfRnJlZVZhbHVlUG9pbnRlciA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0ZyZWVWYWx1ZVBvaW50ZXJcIiwgbnVsbCwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfRnJlZVZhbHVlUG9pbnRlclJ1bnRpbWUgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19GcmVlVmFsdWVQb2ludGVyUnVudGltZVwiLCBudWxsLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19GcmVlVm9pZFBvaW50ZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19GcmVlVm9pZFBvaW50ZXJcIiwgbnVsbCwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfRnJlZUNTdHJpbmcgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19GcmVlQ1N0cmluZ1wiLCBudWxsLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19EdXBWYWx1ZVBvaW50ZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19EdXBWYWx1ZVBvaW50ZXJcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3T2JqZWN0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3T2JqZWN0XCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld09iamVjdFByb3RvID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3T2JqZWN0UHJvdG9cIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3QXJyYXkgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdBcnJheVwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19OZXdGbG9hdDY0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3RmxvYXQ2NFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19HZXRGbG9hdDY0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0RmxvYXQ2NFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19OZXdTdHJpbmcgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdTdHJpbmdcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfR2V0U3RyaW5nID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0U3RyaW5nXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld1N5bWJvbCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld1N5bWJvbFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19HZXRTeW1ib2xEZXNjcmlwdGlvbk9yS2V5ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0U3ltYm9sRGVzY3JpcHRpb25PcktleVwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19Jc0dsb2JhbFN5bWJvbCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0lzR2xvYmFsU3ltYm9sXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0lzSm9iUGVuZGluZyA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0lzSm9iUGVuZGluZ1wiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19FeGVjdXRlUGVuZGluZ0pvYiA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0V4ZWN1dGVQZW5kaW5nSm9iXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0dldFByb3AgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19HZXRQcm9wXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1NldFByb3AgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19TZXRQcm9wXCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0RlZmluZVByb3AgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19EZWZpbmVQcm9wXCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcImJvb2xlYW5cIiwgXCJib29sZWFuXCIsIFwiYm9vbGVhblwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0NhbGwgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19DYWxsXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1Jlc29sdmVFeGNlcHRpb24gPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SZXNvbHZlRXhjZXB0aW9uXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0R1bXAgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19EdW1wXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0V2YWwgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19FdmFsXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1R5cGVvZiA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX1R5cGVvZlwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19HZXRHbG9iYWxPYmplY3QgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19HZXRHbG9iYWxPYmplY3RcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3UHJvbWlzZUNhcGFiaWxpdHkgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdQcm9taXNlQ2FwYWJpbGl0eVwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19UZXN0U3RyaW5nQXJnID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfVGVzdFN0cmluZ0FyZ1wiLCBudWxsLCBbXCJzdHJpbmdcIl0pO1xuICAgICAgICB0aGlzLlFUU19CdWlsZElzRGVidWcgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19CdWlsZElzRGVidWdcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19CdWlsZElzQXN5bmNpZnkgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19CdWlsZElzQXN5bmNpZnlcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19OZXdGdW5jdGlvbiA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld0Z1bmN0aW9uXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcInN0cmluZ1wiXSk7XG4gICAgICAgIHRoaXMuUVRTX0FyZ3ZHZXRKU1ZhbHVlQ29uc3RQb2ludGVyID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfQXJndkdldEpTVmFsdWVDb25zdFBvaW50ZXJcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfUnVudGltZUVuYWJsZUludGVycnVwdEhhbmRsZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lRW5hYmxlSW50ZXJydXB0SGFuZGxlclwiLCBudWxsLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19SdW50aW1lRGlzYWJsZUludGVycnVwdEhhbmRsZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lRGlzYWJsZUludGVycnVwdEhhbmRsZXJcIiwgbnVsbCwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfUnVudGltZUVuYWJsZU1vZHVsZUxvYWRlciA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX1J1bnRpbWVFbmFibGVNb2R1bGVMb2FkZXJcIiwgbnVsbCwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfUnVudGltZURpc2FibGVNb2R1bGVMb2FkZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lRGlzYWJsZU1vZHVsZUxvYWRlclwiLCBudWxsLCBbXCJudW1iZXJcIl0pO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU0ZGSSA9IFF1aWNrSlNGRkk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mZmkuV0FTTV9SRUxFQVNFX1NZTkMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnNob3VsZEludGVycnVwdEFmdGVyRGVhZGxpbmUgPSBleHBvcnRzLm5ld0FzeW5jQ29udGV4dCA9IGV4cG9ydHMubmV3QXN5bmNSdW50aW1lID0gZXhwb3J0cy5nZXRRdWlja0pTU3luYyA9IGV4cG9ydHMuZ2V0UXVpY2tKUyA9IGV4cG9ydHMuZXJyb3JzID0gZXhwb3J0cy5SRUxFQVNFX1NZTkMgPSBleHBvcnRzLlJFTEVBU0VfQVNZTkMgPSBleHBvcnRzLkRFQlVHX1NZTkMgPSBleHBvcnRzLkRFQlVHX0FTWU5DID0gZXhwb3J0cy5uZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlID0gZXhwb3J0cy5uZXdRdWlja0pTV0FTTU1vZHVsZSA9IHZvaWQgMDtcbi8vIEJ1aWxkIHZhcmlhbnRzXG5jb25zdCB2YXJpYW50c18xID0gcmVxdWlyZShcIi4vdmFyaWFudHNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJuZXdRdWlja0pTV0FTTU1vZHVsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFyaWFudHNfMS5uZXdRdWlja0pTV0FTTU1vZHVsZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm5ld1F1aWNrSlNBc3luY1dBU01Nb2R1bGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhcmlhbnRzXzEubmV3UXVpY2tKU0FzeW5jV0FTTU1vZHVsZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRFQlVHX0FTWU5DXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2YXJpYW50c18xLkRFQlVHX0FTWU5DOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiREVCVUdfU1lOQ1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFyaWFudHNfMS5ERUJVR19TWU5DOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUkVMRUFTRV9BU1lOQ1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFyaWFudHNfMS5SRUxFQVNFX0FTWU5DOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUkVMRUFTRV9TWU5DXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2YXJpYW50c18xLlJFTEVBU0VfU1lOQzsgfSB9KTtcbi8vIEV4cG9ydCBoZWxwZXJzXG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vdm0taW50ZXJmYWNlXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9saWZldGltZVwiKSwgZXhwb3J0cyk7XG4vKiogQ29sbGVjdHMgdGhlIGluZm9ybWF0aXZlIGVycm9ycyB0aGlzIGxpYnJhcnkgbWF5IHRocm93LiAqL1xuZXhwb3J0cy5lcnJvcnMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vZXJyb3JzXCIpKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9kZWZlcnJlZC1wcm9taXNlXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9tb2R1bGUtdGVzdFwiKSwgZXhwb3J0cyk7XG5sZXQgc2luZ2xldG9uID0gdW5kZWZpbmVkO1xubGV0IHNpbmdsZXRvblByb21pc2UgPSB1bmRlZmluZWQ7XG4vKipcbiAqIEdldCBhIHNoYXJlZCBzaW5nbGV0b24ge0BsaW5rIFF1aWNrSlNXQVNNTW9kdWxlfS4gVXNlIHRoaXMgdG8gZXZhbHVhdGUgY29kZVxuICogb3IgY3JlYXRlIEphdmFzY3JpcHQgZW52aXJvbm1lbnRzLlxuICpcbiAqIFRoaXMgaXMgdGhlIHRvcC1sZXZlbCBlbnRyeXBvaW50IGZvciB0aGUgcXVpY2tqcy1lbXNjcmlwdGVuIGxpYnJhcnkuXG4gKlxuICogSWYgeW91IG5lZWQgc3RyaWN0ZXN0IHBvc3NpYmxlIGlzb2xhdGlvbiBndWFyYW50ZWVzLCB5b3UgbWF5IGNyZWF0ZSBhXG4gKiBzZXBhcmF0ZSB7QGxpbmsgUXVpY2tKU1dBU01Nb2R1bGV9IHZpYSB7QGxpbmsgbmV3UXVpY2tKU1dBU01Nb2R1bGV9LlxuICpcbiAqIFRvIHdvcmsgd2l0aCB0aGUgYXN5bmNpZmllZCB2ZXJzaW9uIG9mIHRoaXMgbGlicmFyeSwgc2VlIHRoZXNlIGZ1bmN0aW9uczpcbiAqXG4gKiAtIHtAbGluayBuZXdBc3luY1J1bnRpbWV9LlxuICogLSB7QGxpbmsgbmV3QXN5bmNDb250ZXh0fS5cbiAqIC0ge0BsaW5rIG5ld1F1aWNrSlNBc3luY1dBU01Nb2R1bGV9LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRRdWlja0pTKCkge1xuICAgIHNpbmdsZXRvblByb21pc2UgPz8gKHNpbmdsZXRvblByb21pc2UgPSAoMCwgdmFyaWFudHNfMS5uZXdRdWlja0pTV0FTTU1vZHVsZSkoKS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICBzaW5nbGV0b24gPSBpbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH0pKTtcbiAgICByZXR1cm4gYXdhaXQgc2luZ2xldG9uUHJvbWlzZTtcbn1cbmV4cG9ydHMuZ2V0UXVpY2tKUyA9IGdldFF1aWNrSlM7XG4vKipcbiAqIFByb3ZpZGVzIHN5bmNocm9ub3VzIGFjY2VzcyB0byB0aGUgc2hhcmVkIHtAbGluayBRdWlja0pTV0FTTU1vZHVsZX0gaW5zdGFuY2UgcmV0dXJuZWQgYnkge0BsaW5rIGdldFF1aWNrSlN9LCBhcyBsb25nIGFzXG4gKiBsZWFzdCBvbmNlLlxuICogQHRocm93cyBJZiBjYWxsZWQgYmVmb3JlIGBnZXRRdWlja0pTYCByZXNvbHZlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0UXVpY2tKU1N5bmMoKSB7XG4gICAgaWYgKCFzaW5nbGV0b24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUXVpY2tKUyBub3QgaW5pdGlhbGl6ZWQuIEF3YWl0IGdldFF1aWNrSlMoKSBhdCBsZWFzdCBvbmNlLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpbmdsZXRvbjtcbn1cbmV4cG9ydHMuZ2V0UXVpY2tKU1N5bmMgPSBnZXRRdWlja0pTU3luYztcbi8qKlxuICogQ3JlYXRlIGEgbmV3IFtbUXVpY2tKU0FzeW5jUnVudGltZV1dIGluIGEgc2VwYXJhdGUgV2ViQXNzZW1ibHkgbW9kdWxlLlxuICpcbiAqIEVhY2ggcnVudGltZSBpcyBpc29sYXRlZCBpbiBhIHNlcGFyYXRlIFdlYkFzc2VtYmx5IG1vZHVsZSwgc28gdGhhdCBlcnJvcnMgaW5cbiAqIG9uZSBydW50aW1lIGNhbm5vdCBjb250YW1pbmF0ZSBhbm90aGVyIHJ1bnRpbWUsIGFuZCBlYWNoIHJ1bnRpbWUgY2FuIGV4ZWN1dGVcbiAqIGFuIGFzeW5jaHJvbm91cyBhY3Rpb24gd2l0aG91dCBjb25mbGljdHMuXG4gKlxuICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgaGFyZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIFdlYkFzc2VtYmx5IG1vZHVsZXMgaW4gb2xkZXJcbiAqIHZlcnNpb25zIG9mIHY4OlxuICogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTIwNzZcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbmV3QXN5bmNSdW50aW1lKG9wdGlvbnMpIHtcbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCAoMCwgdmFyaWFudHNfMS5uZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlKSgpO1xuICAgIHJldHVybiBtb2R1bGUubmV3UnVudGltZShvcHRpb25zKTtcbn1cbmV4cG9ydHMubmV3QXN5bmNSdW50aW1lID0gbmV3QXN5bmNSdW50aW1lO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcgW1tRdWlja0pTQXN5bmNDb250ZXh0XV0gKHdpdGggYW4gYXNzb2NpYXRlZCBydW50aW1lKSBpbiBhblxuICogc2VwYXJhdGUgV2ViQXNzZW1ibHkgbW9kdWxlLlxuICpcbiAqIEVhY2ggY29udGV4dCBpcyBpc29sYXRlZCBpbiBhIHNlcGFyYXRlIFdlYkFzc2VtYmx5IG1vZHVsZSwgc28gdGhhdCBlcnJvcnMgaW5cbiAqIG9uZSBydW50aW1lIGNhbm5vdCBjb250YW1pbmF0ZSBhbm90aGVyIHJ1bnRpbWUsIGFuZCBlYWNoIHJ1bnRpbWUgY2FuIGV4ZWN1dGVcbiAqIGFuIGFzeW5jaHJvbm91cyBhY3Rpb24gd2l0aG91dCBjb25mbGljdHMuXG4gKlxuICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgaGFyZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIFdlYkFzc2VtYmx5IG1vZHVsZXMgaW4gb2xkZXJcbiAqIHZlcnNpb25zIG9mIHY4OlxuICogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTIwNzZcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbmV3QXN5bmNDb250ZXh0KG9wdGlvbnMpIHtcbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCAoMCwgdmFyaWFudHNfMS5uZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlKSgpO1xuICAgIHJldHVybiBtb2R1bGUubmV3Q29udGV4dChvcHRpb25zKTtcbn1cbmV4cG9ydHMubmV3QXN5bmNDb250ZXh0ID0gbmV3QXN5bmNDb250ZXh0O1xuLyoqXG4gKiBSZXR1cm5zIGFuIGludGVycnVwdCBoYW5kbGVyIHRoYXQgaW50ZXJydXB0cyBKYXZhc2NyaXB0IGV4ZWN1dGlvbiBhZnRlciBhIGRlYWRsaW5lIHRpbWUuXG4gKlxuICogQHBhcmFtIGRlYWRsaW5lIC0gSW50ZXJydXB0IGV4ZWN1dGlvbiBpZiBpdCdzIHN0aWxsIHJ1bm5pbmcgYWZ0ZXIgdGhpcyB0aW1lLlxuICogICBOdW1iZXIgdmFsdWVzIGFyZSBjb21wYXJlZCBhZ2FpbnN0IGBEYXRlLm5vdygpYFxuICovXG5mdW5jdGlvbiBzaG91bGRJbnRlcnJ1cHRBZnRlckRlYWRsaW5lKGRlYWRsaW5lKSB7XG4gICAgY29uc3QgZGVhZGxpbmVBc051bWJlciA9IHR5cGVvZiBkZWFkbGluZSA9PT0gXCJudW1iZXJcIiA/IGRlYWRsaW5lIDogZGVhZGxpbmUuZ2V0VGltZSgpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpID4gZGVhZGxpbmVBc051bWJlcjtcbiAgICB9O1xufVxuZXhwb3J0cy5zaG91bGRJbnRlcnJ1cHRBZnRlckRlYWRsaW5lID0gc2hvdWxkSW50ZXJydXB0QWZ0ZXJEZWFkbGluZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TY29wZSA9IGV4cG9ydHMuV2Vha0xpZmV0aW1lID0gZXhwb3J0cy5TdGF0aWNMaWZldGltZSA9IGV4cG9ydHMuTGlmZXRpbWUgPSB2b2lkIDA7XG5jb25zdCBhc3luY2lmeV9oZWxwZXJzXzEgPSByZXF1aXJlKFwiLi9hc3luY2lmeS1oZWxwZXJzXCIpO1xuY29uc3QgZGVidWdfMSA9IHJlcXVpcmUoXCIuL2RlYnVnXCIpO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi9lcnJvcnNcIik7XG4vKipcbiAqIEEgbGlmZXRpbWUgcHJldmVudHMgYWNjZXNzIHRvIGEgdmFsdWUgYWZ0ZXIgdGhlIGxpZmV0aW1lIGhhcyBiZWVuXG4gKiBbW2Rpc3Bvc2VdXWVkLlxuICpcbiAqIFR5cGljYWxseSwgcXVpY2tqcy1lbXNjcmlwdGVuIHVzZXMgTGlmZXRpbWVzIHRvIHByb3RlY3QgQyBtZW1vcnkgcG9pbnRlcnMuXG4gKi9cbmNsYXNzIExpZmV0aW1lIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBMaWZldGltZSBpcyBkaXNwb3NlZCwgaXQgd2lsbCBjYWxsIGBkaXNwb3NlcihfdmFsdWUpYC4gVXNlIHRoZVxuICAgICAqIGRpc3Bvc2VyIGZ1bmN0aW9uIHRvIGltcGxlbWVudCB3aGF0ZXZlciBjbGVhbnVwIG5lZWRzIHRvIGhhcHBlbiBhdCB0aGUgZW5kXG4gICAgICogb2YgYHZhbHVlYCdzIGxpZmV0aW1lLlxuICAgICAqXG4gICAgICogYF9vd25lcmAgaXMgbm90IHVzZWQgb3IgY29udHJvbGxlZCBieSB0aGUgbGlmZXRpbWUuIEl0J3MganVzdCBtZXRhZGF0YSBmb3JcbiAgICAgKiB0aGUgY3JlYXRvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihfdmFsdWUsIGNvcGllciwgZGlzcG9zZXIsIF9vd25lcikge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IF92YWx1ZTtcbiAgICAgICAgdGhpcy5jb3BpZXIgPSBjb3BpZXI7XG4gICAgICAgIHRoaXMuZGlzcG9zZXIgPSBkaXNwb3NlcjtcbiAgICAgICAgdGhpcy5fb3duZXIgPSBfb3duZXI7XG4gICAgICAgIHRoaXMuX2FsaXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY29uc3RydWN0b3JTdGFjayA9IGRlYnVnXzEuUVRTX0RFQlVHID8gbmV3IEVycm9yKFwiTGlmZXRpbWUgY29uc3RydWN0ZWRcIikuc3RhY2sgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCBhbGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsaXZlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgdGhpcyBMaWZldGltZSBwcm90ZWN0cy4gWW91IG11c3QgbmV2ZXIgcmV0YWluIHRoZSB2YWx1ZSAtIGl0XG4gICAgICogbWF5IGJlY29tZSBpbnZhbGlkLCBsZWFkaW5nIHRvIG1lbW9yeSBlcnJvcnMuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIElmIHRoZSBsaWZldGltZSBoYXMgYmVlbiBbW2Rpc3Bvc2VdXWQgYWxyZWFkeS5cbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0QWxpdmUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICBnZXQgb3duZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vd25lcjtcbiAgICB9XG4gICAgZ2V0IGR1cGFibGUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuY29waWVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgaGFuZGxlIHBvaW50aW5nIHRvIHRoZSBzYW1lIFtbdmFsdWVdXS5cbiAgICAgKi9cbiAgICBkdXAoKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0QWxpdmUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmNvcGllcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9uLWR1cGFibGUgbGlmZXRpbWVcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBMaWZldGltZSh0aGlzLmNvcGllcih0aGlzLl92YWx1ZSksIHRoaXMuY29waWVyLCB0aGlzLmRpc3Bvc2VyLCB0aGlzLl9vd25lcik7XG4gICAgfVxuICAgIGNvbnN1bWUobWFwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0QWxpdmUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbWFwKHRoaXMpO1xuICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZSBvZiBbW3ZhbHVlXV0gYW5kIHBlcmZvcm0gY2xlYW51cC5cbiAgICAgKi9cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmFzc2VydEFsaXZlKCk7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VyKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VyKHRoaXMuX3ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hbGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgICBhc3NlcnRBbGl2ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFsaXZlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY29uc3RydWN0b3JTdGFjaykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTVXNlQWZ0ZXJGcmVlKGBMaWZldGltZSBub3QgYWxpdmVcXG4ke3RoaXMuX2NvbnN0cnVjdG9yU3RhY2t9XFxuTGlmZXRpbWUgdXNlZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNVc2VBZnRlckZyZWUoXCJMaWZldGltZSBub3QgYWxpdmVcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkxpZmV0aW1lID0gTGlmZXRpbWU7XG4vKipcbiAqIEEgTGlmZXRpbWUgdGhhdCBsaXZlcyBmb3JldmVyLiBVc2VkIGZvciBjb25zdGFudHMuXG4gKi9cbmNsYXNzIFN0YXRpY0xpZmV0aW1lIGV4dGVuZHMgTGlmZXRpbWUge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlLCBvd25lcikge1xuICAgICAgICBzdXBlcih2YWx1ZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG93bmVyKTtcbiAgICB9XG4gICAgLy8gU3RhdGljIGxpZmV0aW1lIGRvZXNuJ3QgbmVlZCBhIGNvcGllciB0byBiZSBjb3BpYWJsZVxuICAgIGdldCBkdXBhYmxlKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQ29weSByZXR1cm5zIHRoZSBzYW1lIGluc3RhbmNlLlxuICAgIGR1cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8vIERpc3Bvc2UgZG9lcyBub3RoaW5nLlxuICAgIGRpc3Bvc2UoKSB7IH1cbn1cbmV4cG9ydHMuU3RhdGljTGlmZXRpbWUgPSBTdGF0aWNMaWZldGltZTtcbi8qKlxuICogQSBMaWZldGltZSB0aGF0IGRvZXMgbm90IG93biBpdHMgYHZhbHVlYC4gQSBXZWFrTGlmZXRpbWUgbmV2ZXIgY2FsbHMgaXRzXG4gKiBgZGlzcG9zZXJgIGZ1bmN0aW9uLCBidXQgY2FuIGJlIGBkdXBgZWQgdG8gcHJvZHVjZSByZWd1bGFyIGxpZmV0aW1lcyB0aGF0XG4gKiBkby5cbiAqXG4gKiBVc2VkIGZvciBmdW5jdGlvbiBhcmd1bWVudHMuXG4gKi9cbmNsYXNzIFdlYWtMaWZldGltZSBleHRlbmRzIExpZmV0aW1lIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSwgY29waWVyLCBkaXNwb3Nlciwgb3duZXIpIHtcbiAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZSBpZiB0aGUgZGlzcG9zZXIgZG9lc24ndCBzdXBwb3J0IGZyZWVpbmcgVFxuICAgICAgICBzdXBlcih2YWx1ZSwgY29waWVyLCBkaXNwb3Nlciwgb3duZXIpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLl9hbGl2ZSA9IGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydHMuV2Vha0xpZmV0aW1lID0gV2Vha0xpZmV0aW1lO1xuZnVuY3Rpb24gc2NvcGVGaW5hbGx5KHNjb3BlLCBibG9ja0Vycm9yKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ3Njb3BlRmluYWxseScsIHNjb3BlLCBibG9ja0Vycm9yKVxuICAgIGxldCBkaXNwb3NlRXJyb3I7XG4gICAgdHJ5IHtcbiAgICAgICAgc2NvcGUuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZGlzcG9zZUVycm9yID0gZXJyb3I7XG4gICAgfVxuICAgIGlmIChibG9ja0Vycm9yICYmIGRpc3Bvc2VFcnJvcikge1xuICAgICAgICBPYmplY3QuYXNzaWduKGJsb2NrRXJyb3IsIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke2Jsb2NrRXJyb3IubWVzc2FnZX1cXG4gVGhlbiwgZmFpbGVkIHRvIGRpc3Bvc2Ugc2NvcGU6ICR7ZGlzcG9zZUVycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgIGRpc3Bvc2VFcnJvcixcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IGJsb2NrRXJyb3I7XG4gICAgfVxuICAgIGlmIChibG9ja0Vycm9yIHx8IGRpc3Bvc2VFcnJvcikge1xuICAgICAgICB0aHJvdyBibG9ja0Vycm9yIHx8IGRpc3Bvc2VFcnJvcjtcbiAgICB9XG59XG4vKipcbiAqIFNjb3BlIGhlbHBzIHJlZHVjZSB0aGUgYnVyZGVuIG9mIG1hbnVhbGx5IHRyYWNraW5nIGFuZCBkaXNwb3Npbmcgb2ZcbiAqIExpZmV0aW1lcy4gU2VlIFtbd2l0aFNjb3BlXV0uIGFuZCBbW3dpdGhTY29wZUFzeW5jXV0uXG4gKi9cbmNsYXNzIFNjb3BlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fZGlzcG9zYWJsZXMgPSBuZXcgTGlmZXRpbWUobmV3IFNldCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVuIGBibG9ja2Agd2l0aCBhIG5ldyBTY29wZSBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgZGlzcG9zZWQgYWZ0ZXIgdGhlIGJsb2NrIHJldHVybnMuXG4gICAgICogSW5zaWRlIGBibG9ja2AsIGNhbGwgYHNjb3BlLm1hbmFnZWAgb24gZWFjaCBsaWZldGltZSB5b3UgY3JlYXRlIHRvIGhhdmUgdGhlIGxpZmV0aW1lXG4gICAgICogYXV0b21hdGljYWxseSBkaXNwb3NlZCBhZnRlciB0aGUgYmxvY2sgcmV0dXJucy5cbiAgICAgKlxuICAgICAqIEB3YXJuaW5nIERvIG5vdCB1c2Ugd2l0aCBhc3luYyBmdW5jdGlvbnMuIEluc3RlYWQsIHVzZSBbW3dpdGhTY29wZUFzeW5jXV0uXG4gICAgICovXG4gICAgc3RhdGljIHdpdGhTY29wZShibG9jaykge1xuICAgICAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZSgpO1xuICAgICAgICBsZXQgYmxvY2tFcnJvcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBibG9jayhzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBibG9ja0Vycm9yID0gZXJyb3I7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNjb3BlRmluYWxseShzY29wZSwgYmxvY2tFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHdpdGhTY29wZU1heWJlQXN5bmMoX3RoaXMsIGJsb2NrKSB7XG4gICAgICAgIHJldHVybiAoMCwgYXN5bmNpZnlfaGVscGVyc18xLm1heWJlQXN5bmMpKHVuZGVmaW5lZCwgZnVuY3Rpb24qIChhd2FpdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZSgpO1xuICAgICAgICAgICAgbGV0IGJsb2NrRXJyb3I7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogYXdhaXRlZC5vZihibG9jay5jYWxsKF90aGlzLCBhd2FpdGVkLCBzY29wZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgYmxvY2tFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2NvcGVGaW5hbGx5KHNjb3BlLCBibG9ja0Vycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJ1biBgYmxvY2tgIHdpdGggYSBuZXcgU2NvcGUgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIGRpc3Bvc2VkIGFmdGVyIHRoZVxuICAgICAqIGJsb2NrJ3MgcmV0dXJuZWQgcHJvbWlzZSBzZXR0bGVzLiBJbnNpZGUgYGJsb2NrYCwgY2FsbCBgc2NvcGUubWFuYWdlYCBvbiBlYWNoXG4gICAgICogbGlmZXRpbWUgeW91IGNyZWF0ZSB0byBoYXZlIHRoZSBsaWZldGltZSBhdXRvbWF0aWNhbGx5IGRpc3Bvc2VkIGFmdGVyIHRoZVxuICAgICAqIGJsb2NrIHJldHVybnMuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHdpdGhTY29wZUFzeW5jKGJsb2NrKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKCk7XG4gICAgICAgIGxldCBibG9ja0Vycm9yO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGJsb2NrKHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGJsb2NrRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc2NvcGVGaW5hbGx5KHNjb3BlLCBibG9ja0Vycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmFjayBgbGlmZXRpbWVgIHNvIHRoYXQgaXQgaXMgZGlzcG9zZWQgd2hlbiB0aGlzIHNjb3BlIGlzIGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIG1hbmFnZShsaWZldGltZSkge1xuICAgICAgICB0aGlzLl9kaXNwb3NhYmxlcy52YWx1ZS5hZGQobGlmZXRpbWUpO1xuICAgICAgICByZXR1cm4gbGlmZXRpbWU7XG4gICAgfVxuICAgIGdldCBhbGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3Bvc2FibGVzLmFsaXZlO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBjb25zdCBsaWZldGltZXMgPSBBcnJheS5mcm9tKHRoaXMuX2Rpc3Bvc2FibGVzLnZhbHVlLnZhbHVlcygpKS5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAoY29uc3QgbGlmZXRpbWUgb2YgbGlmZXRpbWVzKSB7XG4gICAgICAgICAgICBpZiAobGlmZXRpbWUuYWxpdmUpIHtcbiAgICAgICAgICAgICAgICBsaWZldGltZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlzcG9zYWJsZXMuZGlzcG9zZSgpO1xuICAgIH1cbn1cbmV4cG9ydHMuU2NvcGUgPSBTY29wZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxpZmV0aW1lLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Nb2R1bGVNZW1vcnkgPSB2b2lkIDA7XG5jb25zdCBsaWZldGltZV8xID0gcmVxdWlyZShcIi4vbGlmZXRpbWVcIik7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIE1vZHVsZU1lbW9yeSB7XG4gICAgY29uc3RydWN0b3IobW9kdWxlKSB7XG4gICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlO1xuICAgIH1cbiAgICB0b1BvaW50ZXJBcnJheShoYW5kbGVBcnJheSkge1xuICAgICAgICBjb25zdCB0eXBlZEFycmF5ID0gbmV3IEludDMyQXJyYXkoaGFuZGxlQXJyYXkubWFwKChoYW5kbGUpID0+IGhhbmRsZS52YWx1ZSkpO1xuICAgICAgICBjb25zdCBudW1CeXRlcyA9IHR5cGVkQXJyYXkubGVuZ3RoICogdHlwZWRBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5tb2R1bGUuX21hbGxvYyhudW1CeXRlcyk7XG4gICAgICAgIHZhciBoZWFwQnl0ZXMgPSBuZXcgVWludDhBcnJheSh0aGlzLm1vZHVsZS5IRUFQVTguYnVmZmVyLCBwdHIsIG51bUJ5dGVzKTtcbiAgICAgICAgaGVhcEJ5dGVzLnNldChuZXcgVWludDhBcnJheSh0eXBlZEFycmF5LmJ1ZmZlcikpO1xuICAgICAgICByZXR1cm4gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUocHRyLCB1bmRlZmluZWQsIChwdHIpID0+IHRoaXMubW9kdWxlLl9mcmVlKHB0cikpO1xuICAgIH1cbiAgICBuZXdNdXRhYmxlUG9pbnRlckFycmF5KGxlbmd0aCkge1xuICAgICAgICBjb25zdCB6ZXJvcyA9IG5ldyBJbnQzMkFycmF5KG5ldyBBcnJheShsZW5ndGgpLmZpbGwoMCkpO1xuICAgICAgICBjb25zdCBudW1CeXRlcyA9IHplcm9zLmxlbmd0aCAqIHplcm9zLkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLm1vZHVsZS5fbWFsbG9jKG51bUJ5dGVzKTtcbiAgICAgICAgY29uc3QgdHlwZWRBcnJheSA9IG5ldyBJbnQzMkFycmF5KHRoaXMubW9kdWxlLkhFQVBVOC5idWZmZXIsIHB0ciwgbGVuZ3RoKTtcbiAgICAgICAgdHlwZWRBcnJheS5zZXQoemVyb3MpO1xuICAgICAgICByZXR1cm4gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUoeyB0eXBlZEFycmF5LCBwdHIgfSwgdW5kZWZpbmVkLCAodmFsdWUpID0+IHRoaXMubW9kdWxlLl9mcmVlKHZhbHVlLnB0cikpO1xuICAgIH1cbiAgICBuZXdIZWFwQ2hhclBvaW50ZXIoc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG51bUJ5dGVzID0gdGhpcy5tb2R1bGUubGVuZ3RoQnl0ZXNVVEY4KHN0cmluZykgKyAxO1xuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLm1vZHVsZS5fbWFsbG9jKG51bUJ5dGVzKTtcbiAgICAgICAgdGhpcy5tb2R1bGUuc3RyaW5nVG9VVEY4KHN0cmluZywgcHRyLCBudW1CeXRlcyk7XG4gICAgICAgIHJldHVybiBuZXcgbGlmZXRpbWVfMS5MaWZldGltZShwdHIsIHVuZGVmaW5lZCwgKHZhbHVlKSA9PiB0aGlzLm1vZHVsZS5fZnJlZSh2YWx1ZSkpO1xuICAgIH1cbiAgICBjb25zdW1lSGVhcENoYXJQb2ludGVyKHB0cikge1xuICAgICAgICBjb25zdCBzdHIgPSB0aGlzLm1vZHVsZS5VVEY4VG9TdHJpbmcocHRyKTtcbiAgICAgICAgdGhpcy5tb2R1bGUuX2ZyZWUocHRyKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG59XG5leHBvcnRzLk1vZHVsZU1lbW9yeSA9IE1vZHVsZU1lbW9yeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9yeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU0FzeW5jV0FTTU1vZHVsZSA9IHZvaWQgMDtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuY29uc3QgbGlmZXRpbWVfMSA9IHJlcXVpcmUoXCIuL2xpZmV0aW1lXCIpO1xuY29uc3QgbW9kdWxlXzEgPSByZXF1aXJlKFwiLi9tb2R1bGVcIik7XG5jb25zdCBydW50aW1lX2FzeW5jaWZ5XzEgPSByZXF1aXJlKFwiLi9ydW50aW1lLWFzeW5jaWZ5XCIpO1xuLyoqXG4gKiBBc3luY2lmaWVkIHZlcnNpb24gb2YgW1tRdWlja0pTV0FTTU1vZHVsZV1dLlxuICpcbiAqIER1ZSB0byBsaW1pdGF0aW9ucyBvZiBFbXNjcmlwdGVuJ3MgQVNZTkNJRlkgcHJvY2Vzcywgb25seSBhIHNpbmdsZSBhc3luY1xuICogZnVuY3Rpb24gY2FsbCBjYW4gaGFwcGVuIGF0IGEgdGltZSBhY3Jvc3MgdGhlIGVudGlyZSBXZWJBc3NlbWJseSBtb2R1bGUuXG4gKlxuICogVGhhdCBtZWFucyB0aGF0IGFsbCBydW50aW1lcywgY29udGV4dHMsIGZ1bmN0aW9ucywgZXRjIGNyZWF0ZWQgaW5zaWRlIHRoaXNcbiAqIFdlYkFzc2VtYmx5IGFyZSBsaW1pdGVkIHRvIGEgc2luZ2xlIGNvbmN1cnJlbnQgYXN5bmMgYWN0aW9uLlxuICogKipNdWx0aXBsZSBjb25jdXJyZW50IGFzeW5jIGFjdGlvbnMgaXMgYW4gZXJyb3IuKipcbiAqXG4gKiBUbyBhbGxvdyBmb3IgbXVsdGlwbGUgY29uY3VycmVudCBhc3luYyBhY3Rpb25zLCB5b3UgbXVzdCBjcmVhdGUgbXVsdGlwbGUgV2ViQXNzZW1ibHlcbiAqIG1vZHVsZXMuXG4gKi9cbmNsYXNzIFF1aWNrSlNBc3luY1dBU01Nb2R1bGUgZXh0ZW5kcyBtb2R1bGVfMS5RdWlja0pTV0FTTU1vZHVsZSB7XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgY29uc3RydWN0b3IobW9kdWxlLCBmZmkpIHtcbiAgICAgICAgc3VwZXIobW9kdWxlLCBmZmkpO1xuICAgICAgICB0aGlzLmZmaSA9IGZmaTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBhc3luYyBydW50aW1lIGluc2lkZSB0aGlzIFdlYkFzc2VtYmx5IG1vZHVsZS4gQWxsIHJ1bnRpbWVzIGluc2lkZSBhXG4gICAgICogbW9kdWxlIGFyZSBsaW1pdGVkIHRvIGEgc2luZ2xlIGFzeW5jIGNhbGwgYXQgYSB0aW1lLiBGb3IgbXVsdGlwbGVcbiAgICAgKiBjb25jdXJyZW50IGFzeW5jIGFjdGlvbnMsIGNyZWF0ZSBtdWx0aXBsZSBXZWJBc3NlbWJseSBtb2R1bGVzLlxuICAgICAqL1xuICAgIG5ld1J1bnRpbWUob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHJ0ID0gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUodGhpcy5mZmkuUVRTX05ld1J1bnRpbWUoKSwgdW5kZWZpbmVkLCAocnRfcHRyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5kZWxldGVSdW50aW1lKHJ0X3B0cik7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZVJ1bnRpbWUocnRfcHRyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWUgPSBuZXcgcnVudGltZV9hc3luY2lmeV8xLlF1aWNrSlNBc3luY1J1bnRpbWUoe1xuICAgICAgICAgICAgbW9kdWxlOiB0aGlzLm1vZHVsZSxcbiAgICAgICAgICAgIGZmaTogdGhpcy5mZmksXG4gICAgICAgICAgICBydCxcbiAgICAgICAgICAgIGNhbGxiYWNrczogdGhpcy5jYWxsYmFja3MsXG4gICAgICAgIH0pO1xuICAgICAgICAoMCwgbW9kdWxlXzEuYXBwbHlCYXNlUnVudGltZU9wdGlvbnMpKHJ1bnRpbWUsIG9wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucy5tb2R1bGVMb2FkZXIpIHtcbiAgICAgICAgICAgIHJ1bnRpbWUuc2V0TW9kdWxlTG9hZGVyKG9wdGlvbnMubW9kdWxlTG9hZGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnVudGltZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzaW1wbGlmaWVkIEFQSSB0byBjcmVhdGUgYSBuZXcgW1tRdWlja0pTUnVudGltZV1dIGFuZCBhXG4gICAgICogW1tRdWlja0pTQ29udGV4dF1dIGluc2lkZSB0aGF0IHJ1bnRpbWUgYXQgdGhlIHNhbWUgdGltZS4gVGhlIHJ1bnRpbWUgd2lsbFxuICAgICAqIGJlIGRpc3Bvc2VkIHdoZW4gdGhlIGNvbnRleHQgaXMgZGlzcG9zZWQuXG4gICAgICovXG4gICAgbmV3Q29udGV4dChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgcnVudGltZSA9IHRoaXMubmV3UnVudGltZSgpO1xuICAgICAgICBjb25zdCBsaWZldGltZXMgPSBvcHRpb25zLm93bmVkTGlmZXRpbWVzID8gb3B0aW9ucy5vd25lZExpZmV0aW1lcy5jb25jYXQoW3J1bnRpbWVdKSA6IFtydW50aW1lXTtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHJ1bnRpbWUubmV3Q29udGV4dCh7IC4uLm9wdGlvbnMsIG93bmVkTGlmZXRpbWVzOiBsaWZldGltZXMgfSk7XG4gICAgICAgIHJ1bnRpbWUuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiAgICAvKiogU3luY2hyb25vdXMgZXZhbENvZGUgaXMgbm90IHN1cHBvcnRlZC4gKi9cbiAgICBldmFsQ29kZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNOb3RJbXBsZW1lbnRlZChcIlF1aWNrSlNXQVNNTW9kdWxlQXN5bmNpZnkuZXZhbENvZGU6IHVzZSBldmFsQ29kZUFzeW5jIGluc3RlYWRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9uZS1vZmYgZXZhbHVhdGUgY29kZSB3aXRob3V0IG5lZWRpbmcgdG8gY3JlYXRlIGEgW1tRdWlja0pTUnVudGltZUFzeW5jXV0gb3JcbiAgICAgKiBbW1F1aWNrSlNDb250ZXh0U3luY11dIGV4cGxpY2l0bHkuXG4gICAgICpcbiAgICAgKiBUaGlzIHZlcnNpb24gYWxsb3dzIGZvciBhc3luY2hyb25vdXMgRWNtYXNjcmlwdCBtb2R1bGUgbG9hZGluZy5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBvbmx5IGEgc2luZ2xlIGFzeW5jIGFjdGlvbiBjYW4gb2NjdXIgYXQgYSB0aW1lIGluc2lkZSB0aGUgZW50aXJlIFdlYkFzc2VtYmx5IG1vZHVsZS5cbiAgICAgKiAqKk11bHRpcGxlIGNvbmN1cnJlbnQgYXN5bmMgYWN0aW9ucyBpcyBhbiBlcnJvci4qKlxuICAgICAqXG4gICAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBbW1F1aWNrSlNXQVNNTW9kdWxlLmV2YWxDb2RlXV0gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKi9cbiAgICBldmFsQ29kZUFzeW5jKGNvZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIHJlYWxseSBmaWd1cmUgb3V0IGdlbmVyYXRvciBmb3IgdGhlIFByb21pc2UgbW9uYWQuLi5cbiAgICAgICAgcmV0dXJuIGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlQXN5bmMoYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2bSA9IHNjb3BlLm1hbmFnZSh0aGlzLm5ld0NvbnRleHQoKSk7XG4gICAgICAgICAgICAoMCwgbW9kdWxlXzEuYXBwbHlNb2R1bGVFdmFsUnVudGltZU9wdGlvbnMpKHZtLnJ1bnRpbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdm0uZXZhbENvZGVBc3luYyhjb2RlLCBcImV2YWwuanNcIik7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tZW1vcnlMaW1pdEJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbWVtb3J5IGxpbWl0IHNvIHdlIGNhbiBkdW1wIHRoZSByZXN1bHQgd2l0aG91dCBleGNlZWRpbmcgaXQuXG4gICAgICAgICAgICAgICAgdm0ucnVudGltZS5zZXRNZW1vcnlMaW1pdCgtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB2bS5kdW1wKHNjb3BlLm1hbmFnZShyZXN1bHQuZXJyb3IpKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdm0uZHVtcChzY29wZS5tYW5hZ2UocmVzdWx0LnZhbHVlKSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU0FzeW5jV0FTTU1vZHVsZSA9IFF1aWNrSlNBc3luY1dBU01Nb2R1bGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2R1bGUtYXN5bmNpZnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlRlc3RRdWlja0pTV0FTTU1vZHVsZSA9IHZvaWQgMDtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuY29uc3QgbGlmZXRpbWVfMSA9IHJlcXVpcmUoXCIuL2xpZmV0aW1lXCIpO1xuLyoqXG4gKiBBIHRlc3Qgd3JhcHBlciBvZiBbW1F1aWNrSlNXQVNNTW9kdWxlXV0gdGhhdCBrZWVwcyBhIHJlZmVyZW5jZSB0byBlYWNoXG4gKiBjb250ZXh0IG9yIHJ1bnRpbWUgY3JlYXRlZC5cbiAqXG4gKiBDYWxsIFtbZGlzcG9zZUFsbF1dIHRvIHJlc2V0IHRoZXNlIHNldHMgYW5kIGNhbGxzIGBkaXNwb3NlYCBvbiBhbnkgbGVmdCBhbGl2ZVxuICogKHdoaWNoIG1heSB0aHJvdyBhbiBlcnJvcikuXG4gKlxuICogQ2FsbCBbW2Fzc2VydE5vTWVtb3J5QWxsb2NhdGVkXV0gYXQgdGhlIGVuZCBvZiBhIHRlc3QsIHdoZW4geW91IGV4cGVjdCB0aGF0IHlvdSd2ZVxuICogZnJlZWQgYWxsIHRoZSBtZW1vcnkgeW91J3ZlIGV2ZXIgYWxsb2NhdGVkLlxuICovXG5jbGFzcyBUZXN0UXVpY2tKU1dBU01Nb2R1bGUge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5jb250ZXh0cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5ydW50aW1lcyA9IG5ldyBTZXQoKTtcbiAgICB9XG4gICAgbmV3UnVudGltZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnBhcmVudC5uZXdSdW50aW1lKHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBvd25lZExpZmV0aW1lczogW1xuICAgICAgICAgICAgICAgIG5ldyBsaWZldGltZV8xLkxpZmV0aW1lKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoKSA9PiB0aGlzLnJ1bnRpbWVzLmRlbGV0ZShydW50aW1lKSksXG4gICAgICAgICAgICAgICAgLi4uKG9wdGlvbnM/Lm93bmVkTGlmZXRpbWVzID8/IFtdKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJ1bnRpbWVzLmFkZChydW50aW1lKTtcbiAgICAgICAgcmV0dXJuIHJ1bnRpbWU7XG4gICAgfVxuICAgIG5ld0NvbnRleHQob3B0aW9ucykge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wYXJlbnQubmV3Q29udGV4dCh7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgb3duZWRMaWZldGltZXM6IFtcbiAgICAgICAgICAgICAgICBuZXcgbGlmZXRpbWVfMS5MaWZldGltZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgKCkgPT4gdGhpcy5jb250ZXh0cy5kZWxldGUoY29udGV4dCkpLFxuICAgICAgICAgICAgICAgIC4uLihvcHRpb25zPy5vd25lZExpZmV0aW1lcyA/PyBbXSksXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb250ZXh0cy5hZGQoY29udGV4dCk7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiAgICBldmFsQ29kZShjb2RlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5ldmFsQ29kZShjb2RlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgZGlzcG9zZUFsbCgpIHtcbiAgICAgICAgY29uc3QgYWxsRGlzcG9zYWJsZXMgPSBbLi4udGhpcy5jb250ZXh0cywgLi4udGhpcy5ydW50aW1lc107XG4gICAgICAgIHRoaXMucnVudGltZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0cy5jbGVhcigpO1xuICAgICAgICBhbGxEaXNwb3NhYmxlcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgICAgICBpZiAoZC5hbGl2ZSkge1xuICAgICAgICAgICAgICAgIGQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXNzZXJ0Tm9NZW1vcnlBbGxvY2F0ZWQoKSB7XG4gICAgICAgIGNvbnN0IGxlYWtzRGV0ZWN0ZWQgPSB0aGlzLmdldEZGSSgpLlFUU19SZWNvdmVyYWJsZUxlYWtDaGVjaygpO1xuICAgICAgICBpZiAobGVha3NEZXRlY3RlZCkge1xuICAgICAgICAgICAgLy8gTm90ZTogdGhpcyBpcyBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgd2hlbiBidWlsZGluZyBmcm9tIHNvdXJjZVxuICAgICAgICAgICAgLy8gd2l0aCBkZWJ1ZyBidWlsZHMuXG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuUXVpY2tKU01lbW9yeUxlYWtEZXRlY3RlZChcIkxlYWsgc2FuaXRpemVyIGRldGVjdGVkIHVuLWZyZWVkIG1lbW9yeVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb250ZXh0cy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQoYCR7dGhpcy5jb250ZXh0cy5zaXplfSBjb250ZXh0cyBsZWFrZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ydW50aW1lcy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQoYCR7dGhpcy5ydW50aW1lcy5zaXplfSBydW50aW1lcyBsZWFrZWRgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXRGRkkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5nZXRGRkkoKTtcbiAgICB9XG59XG5leHBvcnRzLlRlc3RRdWlja0pTV0FTTU1vZHVsZSA9IFRlc3RRdWlja0pTV0FTTU1vZHVsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZHVsZS10ZXN0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWlja0pTV0FTTU1vZHVsZSA9IGV4cG9ydHMuYXBwbHlNb2R1bGVFdmFsUnVudGltZU9wdGlvbnMgPSBleHBvcnRzLmFwcGx5QmFzZVJ1bnRpbWVPcHRpb25zID0gZXhwb3J0cy5RdWlja0pTTW9kdWxlQ2FsbGJhY2tzID0gdm9pZCAwO1xuY29uc3QgZGVidWdfMSA9IHJlcXVpcmUoXCIuL2RlYnVnXCIpO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi9lcnJvcnNcIik7XG5jb25zdCBsaWZldGltZV8xID0gcmVxdWlyZShcIi4vbGlmZXRpbWVcIik7XG5jb25zdCBydW50aW1lXzEgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuY29uc3QgdHlwZXNfMSA9IHJlcXVpcmUoXCIuL3R5cGVzXCIpO1xuY2xhc3MgUXVpY2tKU0Vtc2NyaXB0ZW5Nb2R1bGVDYWxsYmFja3Mge1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MpIHtcbiAgICAgICAgdGhpcy5jYWxsRnVuY3Rpb24gPSBhcmdzLmNhbGxGdW5jdGlvbjtcbiAgICAgICAgdGhpcy5zaG91bGRJbnRlcnJ1cHQgPSBhcmdzLnNob3VsZEludGVycnVwdDtcbiAgICAgICAgdGhpcy5sb2FkTW9kdWxlU291cmNlID0gYXJncy5sb2FkTW9kdWxlU291cmNlO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZU1vZHVsZSA9IGFyZ3Mubm9ybWFsaXplTW9kdWxlO1xuICAgIH1cbn1cbi8qKlxuICogV2UgdXNlIHN0YXRpYyBmdW5jdGlvbnMgcGVyIG1vZHVsZSB0byBkaXNwYXRjaCBydW50aW1lIG9yIGNvbnRleHQgY2FsbHMgZnJvbVxuICogQyB0byB0aGUgaG9zdC4gIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgaW5kaXJlY3Rpb24gZnJvbSBhIHNwZWNpZmljIHJ1bnRpbWUgb3JcbiAqIGNvbnRleHQgcG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2sgaGFuZGxlci5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBRdWlja0pTTW9kdWxlQ2FsbGJhY2tzIHtcbiAgICBjb25zdHJ1Y3Rvcihtb2R1bGUpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0Q2FsbGJhY2tzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnJ1bnRpbWVDYWxsYmFja3MgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuc3VzcGVuZGVkQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmNUb0hvc3RDYWxsYmFja3MgPSBuZXcgUXVpY2tKU0Vtc2NyaXB0ZW5Nb2R1bGVDYWxsYmFja3Moe1xuICAgICAgICAgICAgY2FsbEZ1bmN0aW9uOiAoYXN5bmNpZnksIGN0eCwgdGhpc19wdHIsIGFyZ2MsIGFyZ3YsIGZuX2lkKSA9PiB0aGlzLmhhbmRsZUFzeW5jaWZ5KGFzeW5jaWZ5LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm0gPSB0aGlzLmNvbnRleHRDYWxsYmFja3MuZ2V0KGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVpY2tKU0NvbnRleHQoY3R4ID0gJHtjdHh9KSBub3QgZm91bmQgZm9yIEMgZnVuY3Rpb24gY2FsbCBcIiR7Zm5faWR9XCJgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm0uY2FsbEZ1bmN0aW9uKGN0eCwgdGhpc19wdHIsIGFyZ2MsIGFyZ3YsIGZuX2lkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQyB0byBob3N0IGVycm9yOiByZXR1cm5pbmcgbnVsbF1cIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNob3VsZEludGVycnVwdDogKGFzeW5jaWZ5LCBydCkgPT4gdGhpcy5oYW5kbGVBc3luY2lmeShhc3luY2lmeSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZtID0gdGhpcy5ydW50aW1lQ2FsbGJhY2tzLmdldChydCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVpY2tKU1J1bnRpbWUocnQgPSAke3J0fSkgbm90IGZvdW5kIGZvciBDIGludGVycnVwdGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2bS5zaG91bGRJbnRlcnJ1cHQocnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltDIHRvIGhvc3QgaW50ZXJydXB0OiByZXR1cm5pbmcgZXJyb3JdXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBsb2FkTW9kdWxlU291cmNlOiAoYXN5bmNpZnksIHJ0LCBjdHgsIG1vZHVsZU5hbWUpID0+IHRoaXMuaGFuZGxlQXN5bmNpZnkoYXN5bmNpZnksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBydW50aW1lQ2FsbGJhY2tzID0gdGhpcy5ydW50aW1lQ2FsbGJhY2tzLmdldChydCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcnVudGltZUNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWlja0pTUnVudGltZShydCA9ICR7cnR9KSBub3QgZm91bmQgZm9yIEMgbW9kdWxlIGxvYWRlcmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRNb2R1bGUgPSBydW50aW1lQ2FsbGJhY2tzLmxvYWRNb2R1bGVTb3VyY2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbG9hZE1vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWlja0pTUnVudGltZShydCA9ICR7cnR9KSBkb2VzIG5vdCBzdXBwb3J0IG1vZHVsZSBsb2FkaW5nYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRNb2R1bGUocnQsIGN0eCwgbW9kdWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0MgdG8gaG9zdCBtb2R1bGUgbG9hZGVyIGVycm9yOiByZXR1cm5pbmcgbnVsbF1cIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZU1vZHVsZTogKGFzeW5jaWZ5LCBydCwgY3R4LCBtb2R1bGVCYXNlTmFtZSwgbW9kdWxlTmFtZSkgPT4gdGhpcy5oYW5kbGVBc3luY2lmeShhc3luY2lmeSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bnRpbWVDYWxsYmFja3MgPSB0aGlzLnJ1bnRpbWVDYWxsYmFja3MuZ2V0KHJ0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFydW50aW1lQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1aWNrSlNSdW50aW1lKHJ0ID0gJHtydH0pIG5vdCBmb3VuZCBmb3IgQyBtb2R1bGUgbG9hZGVyYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplTW9kdWxlID0gcnVudGltZUNhbGxiYWNrcy5ub3JtYWxpemVNb2R1bGU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9ybWFsaXplTW9kdWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1aWNrSlNSdW50aW1lKHJ0ID0gJHtydH0pIGRvZXMgbm90IHN1cHBvcnQgbW9kdWxlIGxvYWRpbmdgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplTW9kdWxlKHJ0LCBjdHgsIG1vZHVsZUJhc2VOYW1lLCBtb2R1bGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQyB0byBob3N0IG1vZHVsZSBsb2FkZXIgZXJyb3I6IHJldHVybmluZyBudWxsXVwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGU7XG4gICAgICAgIHRoaXMubW9kdWxlLmNhbGxiYWNrcyA9IHRoaXMuY1RvSG9zdENhbGxiYWNrcztcbiAgICB9XG4gICAgc2V0UnVudGltZUNhbGxiYWNrcyhydCwgY2FsbGJhY2tzKSB7XG4gICAgICAgIHRoaXMucnVudGltZUNhbGxiYWNrcy5zZXQocnQsIGNhbGxiYWNrcyk7XG4gICAgfVxuICAgIGRlbGV0ZVJ1bnRpbWUocnQpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lQ2FsbGJhY2tzLmRlbGV0ZShydCk7XG4gICAgfVxuICAgIHNldENvbnRleHRDYWxsYmFja3MoY3R4LCBjYWxsYmFja3MpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0Q2FsbGJhY2tzLnNldChjdHgsIGNhbGxiYWNrcyk7XG4gICAgfVxuICAgIGRlbGV0ZUNvbnRleHQoY3R4KSB7XG4gICAgICAgIHRoaXMuY29udGV4dENhbGxiYWNrcy5kZWxldGUoY3R4KTtcbiAgICB9XG4gICAgaGFuZGxlQXN5bmNpZnkoYXN5bmNpZnksIGZuKSB7XG4gICAgICAgIGlmIChhc3luY2lmeSkge1xuICAgICAgICAgICAgLy8gV2UgbXVzdCBhbHdheXMgY2FsbCBhc3luY2lmeS5oYW5kbGVTeW5jIGFyb3VuZCBvdXIgZnVuY3Rpb24uXG4gICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBhc3luY2lmeSB0byByZXN1bWUgc3VzcGVuZGVkIGV4ZWN1dGlvbiBvbiB0aGUgc2Vjb25kIGNhbGwuXG4gICAgICAgICAgICAvLyBBc3luY2lmeSBpbnRlcm5hbGx5IGNhbiBkZXRlY3Qgc3luYyBiZWhhdmlvciwgYW5kIGF2b2lkIHN1c3BlbmRpbmcuXG4gICAgICAgICAgICByZXR1cm4gYXN5bmNpZnkuaGFuZGxlU2xlZXAoKGRvbmUpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmbigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwiYXN5bmNpZnkuaGFuZGxlU2xlZXA6IG5vdCBzdXNwZW5kaW5nOlwiLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIElzIHByb21pc2UsIHdlIGludGVuZCB0byBzdXNwZW5kLlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdXNwZW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTQXN5bmNpZnlFcnJvcihgQWxyZWFkeSBzdXNwZW5kZWQgYXQ6ICR7dGhpcy5zdXNwZW5kZWQuc3RhY2t9XFxuQXR0ZW1wdGVkIHRvIHN1c3BlbmQgYXQ6YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1c3BlbmRlZCA9IG5ldyBlcnJvcnNfMS5RdWlja0pTQXN5bmNpZnlTdXNwZW5kZWQoYCgke3RoaXMuc3VzcGVuZGVkQ291bnQrK30pYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJhc3luY2lmeS5oYW5kbGVTbGVlcDogc3VzcGVuZGluZzpcIiwgdGhpcy5zdXNwZW5kZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKChyZXNvbHZlZFJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJhc3luY2lmeS5oYW5kbGVTbGVlcDogcmVzb2x2ZWQ6XCIsIHJlc29sdmVkUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUocmVzb2x2ZWRSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICgwLCBkZWJ1Z18xLmRlYnVnTG9nKShcImFzeW5jaWZ5LmhhbmRsZVNsZWVwOiByZWplY3RlZDpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlF1aWNrSlM6IGNhbm5vdCBoYW5kbGUgZXJyb3IgaW4gc3VzcGVuZGVkIGZ1bmN0aW9uXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VzcGVuZGVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICgwLCBkZWJ1Z18xLmRlYnVnTG9nKShcImFzeW5jaWZ5LmhhbmRsZVNsZWVwOiBlcnJvcjpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1c3BlbmRlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gYXN5bmNpZnkgLSB3ZSBzaG91bGQgbmV2ZXIgcmV0dXJuIGEgcHJvbWlzZS5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBmbigpO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9taXNlIHJldHVybiB2YWx1ZSBub3Qgc3VwcG9ydGVkIGluIG5vbi1hc3luY2lmeSBjb250ZXh0LlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTTW9kdWxlQ2FsbGJhY2tzID0gUXVpY2tKU01vZHVsZUNhbGxiYWNrcztcbi8qKlxuICogUHJvY2VzcyBSdW50aW1lT3B0aW9ucyBhbmQgYXBwbHkgdGhlbSB0byBhIFF1aWNrSlNSdW50aW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYXBwbHlCYXNlUnVudGltZU9wdGlvbnMocnVudGltZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmludGVycnVwdEhhbmRsZXIpIHtcbiAgICAgICAgcnVudGltZS5zZXRJbnRlcnJ1cHRIYW5kbGVyKG9wdGlvbnMuaW50ZXJydXB0SGFuZGxlcik7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm1heFN0YWNrU2l6ZUJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcnVudGltZS5zZXRNYXhTdGFja1NpemUob3B0aW9ucy5tYXhTdGFja1NpemVCeXRlcyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm1lbW9yeUxpbWl0Qnl0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBydW50aW1lLnNldE1lbW9yeUxpbWl0KG9wdGlvbnMubWVtb3J5TGltaXRCeXRlcyk7XG4gICAgfVxufVxuZXhwb3J0cy5hcHBseUJhc2VSdW50aW1lT3B0aW9ucyA9IGFwcGx5QmFzZVJ1bnRpbWVPcHRpb25zO1xuLyoqXG4gKiBQcm9jZXNzIE1vZHVsZUV2YWxPcHRpb25zIGFuZCBhcHBseSB0aGVtIHRvIGEgUXVpY2tKU1J1bnRpbWUuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhcHBseU1vZHVsZUV2YWxSdW50aW1lT3B0aW9ucyhydW50aW1lLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMubW9kdWxlTG9hZGVyKSB7XG4gICAgICAgIHJ1bnRpbWUuc2V0TW9kdWxlTG9hZGVyKG9wdGlvbnMubW9kdWxlTG9hZGVyKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2hvdWxkSW50ZXJydXB0KSB7XG4gICAgICAgIHJ1bnRpbWUuc2V0SW50ZXJydXB0SGFuZGxlcihvcHRpb25zLnNob3VsZEludGVycnVwdCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm1lbW9yeUxpbWl0Qnl0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBydW50aW1lLnNldE1lbW9yeUxpbWl0KG9wdGlvbnMubWVtb3J5TGltaXRCeXRlcyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm1heFN0YWNrU2l6ZUJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcnVudGltZS5zZXRNYXhTdGFja1NpemUob3B0aW9ucy5tYXhTdGFja1NpemVCeXRlcyk7XG4gICAgfVxufVxuZXhwb3J0cy5hcHBseU1vZHVsZUV2YWxSdW50aW1lT3B0aW9ucyA9IGFwcGx5TW9kdWxlRXZhbFJ1bnRpbWVPcHRpb25zO1xuLyoqXG4gKiBUaGlzIGNsYXNzIHByZXNlbnRzIGEgSmF2YXNjcmlwdCBpbnRlcmZhY2UgdG8gUXVpY2tKUywgYSBKYXZhc2NyaXB0IGludGVycHJldGVyXG4gKiB0aGF0IHN1cHBvcnRzIEVjbWFTY3JpcHQgMjAyMCAoRVMyMDIwKS5cbiAqXG4gKiBJdCB3cmFwcyBhIHNpbmdsZSBXZWJBc3NlbWJseSBtb2R1bGUgY29udGFpbmluZyB0aGUgUXVpY2tKUyBsaWJyYXJ5IGFuZFxuICogYXNzb2NpYXRlZCBoZWxwZXIgQyBjb2RlLiBXZWJBc3NlbWJseSBtb2R1bGVzIGFyZSBjb21wbGV0ZWx5IGlzb2xhdGVkIGZyb21cbiAqIGVhY2ggb3RoZXIgYnkgdGhlIGhvc3QncyBXZWJBc3NlbWJseSBydW50aW1lLiBTZXBhcmF0ZSBXZWJBc3NlbWJseSBtb2R1bGVzXG4gKiBoYXZlIHRoZSBtb3N0IGlzb2xhdGlvbiBndWFyYW50ZWVzIHBvc3NpYmxlIHdpdGggdGhpcyBsaWJyYXJ5LlxuICpcbiAqIFRoZSBzaW1wbGVzdCB3YXkgdG8gc3RhcnQgcnVubmluZyBjb2RlIGlzIHtAbGluayBldmFsQ29kZX0uIFRoaXMgc2hvcnRjdXRcbiAqIG1ldGhvZCB3aWxsIGV2YWx1YXRlIEphdmFzY3JpcHQgc2FmZWx5IGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhIG5hdGl2ZVxuICogSmF2YXNjcmlwdCB2YWx1ZS5cbiAqXG4gKiBGb3IgbW9yZSBjb250cm9sIG92ZXIgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCwgb3IgdG8gaW50ZXJhY3Qgd2l0aCB2YWx1ZXNcbiAqIGluc2lkZSBRdWlja0pTLCBjcmVhdGUgYSBjb250ZXh0IHdpdGgge0BsaW5rIG5ld0NvbnRleHR9IG9yIGEgcnVudGltZSB3aXRoXG4gKiB7QGxpbmsgbmV3UnVudGltZX0uXG4gKi9cbmNsYXNzIFF1aWNrSlNXQVNNTW9kdWxlIHtcbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBjb25zdHJ1Y3Rvcihtb2R1bGUsIGZmaSkge1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTtcbiAgICAgICAgdGhpcy5mZmkgPSBmZmk7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IFF1aWNrSlNNb2R1bGVDYWxsYmFja3MobW9kdWxlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcnVudGltZS5cbiAgICAgKiBVc2UgdGhlIHJ1bnRpbWUgdG8gc2V0IGxpbWl0cyBvbiBDUFUgYW5kIG1lbW9yeSB1c2FnZSBhbmQgY29uZmlndXJlIG1vZHVsZVxuICAgICAqIGxvYWRpbmcgZm9yIG9uZSBvciBtb3JlIFtbUXVpY2tKU0NvbnRleHRdXXMgaW5zaWRlIHRoZSBydW50aW1lLlxuICAgICAqL1xuICAgIG5ld1J1bnRpbWUob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHJ0ID0gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUodGhpcy5mZmkuUVRTX05ld1J1bnRpbWUoKSwgdW5kZWZpbmVkLCAocnRfcHRyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5kZWxldGVSdW50aW1lKHJ0X3B0cik7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZVJ1bnRpbWUocnRfcHRyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWUgPSBuZXcgcnVudGltZV8xLlF1aWNrSlNSdW50aW1lKHtcbiAgICAgICAgICAgIG1vZHVsZTogdGhpcy5tb2R1bGUsXG4gICAgICAgICAgICBjYWxsYmFja3M6IHRoaXMuY2FsbGJhY2tzLFxuICAgICAgICAgICAgZmZpOiB0aGlzLmZmaSxcbiAgICAgICAgICAgIHJ0LFxuICAgICAgICB9KTtcbiAgICAgICAgYXBwbHlCYXNlUnVudGltZU9wdGlvbnMocnVudGltZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChvcHRpb25zLm1vZHVsZUxvYWRlcikge1xuICAgICAgICAgICAgcnVudGltZS5zZXRNb2R1bGVMb2FkZXIob3B0aW9ucy5tb2R1bGVMb2FkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBydW50aW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNpbXBsaWZpZWQgQVBJIHRvIGNyZWF0ZSBhIG5ldyBbW1F1aWNrSlNSdW50aW1lXV0gYW5kIGFcbiAgICAgKiBbW1F1aWNrSlNDb250ZXh0XV0gaW5zaWRlIHRoYXQgcnVudGltZSBhdCB0aGUgc2FtZSB0aW1lLiBUaGUgcnVudGltZSB3aWxsXG4gICAgICogYmUgZGlzcG9zZWQgd2hlbiB0aGUgY29udGV4dCBpcyBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBuZXdDb250ZXh0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBydW50aW1lID0gdGhpcy5uZXdSdW50aW1lKCk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBydW50aW1lLm5ld0NvbnRleHQoe1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIG93bmVkTGlmZXRpbWVzOiAoMCwgdHlwZXNfMS5jb25jYXQpKHJ1bnRpbWUsIG9wdGlvbnMub3duZWRMaWZldGltZXMpLFxuICAgICAgICB9KTtcbiAgICAgICAgcnVudGltZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9uZS1vZmYgZXZhbHVhdGUgY29kZSB3aXRob3V0IG5lZWRpbmcgdG8gY3JlYXRlIGEgW1tRdWlja0pTUnVudGltZV1dIG9yXG4gICAgICogW1tRdWlja0pTQ29udGV4dF1dIGV4cGxpY2l0bHkuXG4gICAgICpcbiAgICAgKiBUbyBwcm90ZWN0IGFnYWluc3QgaW5maW5pdGUgbG9vcHMsIHVzZSB0aGUgYHNob3VsZEludGVycnVwdGAgb3B0aW9uLiBUaGVcbiAgICAgKiBbW3Nob3VsZEludGVycnVwdEFmdGVyRGVhZGxpbmVdXSBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBhIHRpbWUtYmFzZWQgZGVhZGxpbmUuXG4gICAgICpcbiAgICAgKiBJZiB5b3UgbmVlZCBtb3JlIGNvbnRyb2wgb3ZlciBob3cgdGhlIGNvZGUgZXhlY3V0ZXMsIGNyZWF0ZSBhXG4gICAgICogW1tRdWlja0pTUnVudGltZV1dICh3aXRoIFtbbmV3UnVudGltZV1dKSBvciBhIFtbUXVpY2tKU0NvbnRleHRdXSAod2l0aFxuICAgICAqIFtbbmV3Q29udGV4dF1dIG9yIFtbUXVpY2tKU1J1bnRpbWUubmV3Q29udGV4dF1dKSwgYW5kIHVzZSBpdHNcbiAgICAgKiBbW1F1aWNrSlNDb250ZXh0LmV2YWxDb2RlXV0gbWV0aG9kLlxuICAgICAqXG4gICAgICogQXN5bmNocm9ub3VzIGNhbGxiYWNrcyBtYXkgbm90IHJ1biBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgdG8gYGV2YWxDb2RlYC4gSWZcbiAgICAgKiB5b3UgbmVlZCB0byB3b3JrIHdpdGggYXN5bmMgY29kZSBpbnNpZGUgUXVpY2tKUywgY3JlYXRlIGEgcnVudGltZSBhbmQgdXNlXG4gICAgICogW1tRdWlja0pTUnVudGltZS5leGVjdXRlUGVuZGluZ0pvYnNdXS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgaXMgY29lcmNlZCB0byBhIG5hdGl2ZSBKYXZhc2NyaXB0IHZhbHVlIHVzaW5nIEpTT05cbiAgICAgKiBzZXJpYWxpemF0aW9uLCBzbyBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgdW5zdXBwb3J0ZWQgYnkgSlNPTiB3aWxsIGJlIGRyb3BwZWQuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIElmIGBjb2RlYCB0aHJvd3MgZHVyaW5nIGV2YWx1YXRpb24sIHRoZSBleGNlcHRpb24gd2lsbCBiZVxuICAgICAqIGNvbnZlcnRlZCBpbnRvIGEgbmF0aXZlIEphdmFzY3JpcHQgdmFsdWUgYW5kIHRocm93bi5cbiAgICAgKlxuICAgICAqIEB0aHJvd3MgaWYgYG9wdGlvbnMuc2hvdWxkSW50ZXJydXB0YCBpbnRlcnJ1cHRlZCBleGVjdXRpb24sIHdpbGwgdGhyb3cgYSBFcnJvclxuICAgICAqIHdpdGggbmFtZSBgXCJJbnRlcm5hbEVycm9yXCJgIGFuZCAgbWVzc2FnZSBgXCJpbnRlcnJ1cHRlZFwiYC5cbiAgICAgKi9cbiAgICBldmFsQ29kZShjb2RlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlKChzY29wZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgdm0gPSBzY29wZS5tYW5hZ2UodGhpcy5uZXdDb250ZXh0KCkpO1xuICAgICAgICAgICAgYXBwbHlNb2R1bGVFdmFsUnVudGltZU9wdGlvbnModm0ucnVudGltZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB2bS5ldmFsQ29kZShjb2RlLCBcImV2YWwuanNcIik7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tZW1vcnlMaW1pdEJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbWVtb3J5IGxpbWl0IHNvIHdlIGNhbiBkdW1wIHRoZSByZXN1bHQgd2l0aG91dCBleGNlZWRpbmcgaXQuXG4gICAgICAgICAgICAgICAgdm0ucnVudGltZS5zZXRNZW1vcnlMaW1pdCgtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB2bS5kdW1wKHNjb3BlLm1hbmFnZShyZXN1bHQuZXJyb3IpKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdm0uZHVtcChzY29wZS5tYW5hZ2UocmVzdWx0LnZhbHVlKSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsb3ctbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBRdWlja0pTIGZ1bmN0aW9ucyBpbiB0aGlzIFdlYkFzc2VtYmx5XG4gICAgICogbW9kdWxlLlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKiBAdW5zdGFibGUgTm8gd2FycmFudHkgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIEFQSS4gSXQgY291bGQgY2hhbmdlIGF0IGFueSB0aW1lLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0RkZJKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZmk7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTV0FTTU1vZHVsZSA9IFF1aWNrSlNXQVNNTW9kdWxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW9kdWxlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWlja0pTQXN5bmNSdW50aW1lID0gdm9pZCAwO1xuY29uc3QgXzEgPSByZXF1aXJlKFwiLlwiKTtcbmNvbnN0IGNvbnRleHRfYXN5bmNpZnlfMSA9IHJlcXVpcmUoXCIuL2NvbnRleHQtYXN5bmNpZnlcIik7XG5jb25zdCBydW50aW1lXzEgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuY29uc3QgdHlwZXNfMSA9IHJlcXVpcmUoXCIuL3R5cGVzXCIpO1xuY2xhc3MgUXVpY2tKU0FzeW5jUnVudGltZSBleHRlbmRzIHJ1bnRpbWVfMS5RdWlja0pTUnVudGltZSB7XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgY29uc3RydWN0b3IoYXJncykge1xuICAgICAgICBzdXBlcihhcmdzKTtcbiAgICB9XG4gICAgbmV3Q29udGV4dChvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaW50cmluc2ljcyAmJiBvcHRpb25zLmludHJpbnNpY3MgIT09IHR5cGVzXzEuRGVmYXVsdEludHJpbnNpY3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRPRE86IEN1c3RvbSBpbnRyaW5zaWNzIGFyZSBub3Qgc3VwcG9ydGVkIHlldFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdHggPSBuZXcgXzEuTGlmZXRpbWUodGhpcy5mZmkuUVRTX05ld0NvbnRleHQodGhpcy5ydC52YWx1ZSksIHVuZGVmaW5lZCwgKGN0eF9wdHIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dE1hcC5kZWxldGUoY3R4X3B0cik7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5kZWxldGVDb250ZXh0KGN0eF9wdHIpO1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX0ZyZWVDb250ZXh0KGN0eF9wdHIpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBjb250ZXh0X2FzeW5jaWZ5XzEuUXVpY2tKU0FzeW5jQ29udGV4dCh7XG4gICAgICAgICAgICBtb2R1bGU6IHRoaXMubW9kdWxlLFxuICAgICAgICAgICAgY3R4LFxuICAgICAgICAgICAgZmZpOiB0aGlzLmZmaSxcbiAgICAgICAgICAgIHJ0OiB0aGlzLnJ0LFxuICAgICAgICAgICAgb3duZWRMaWZldGltZXM6IFtdLFxuICAgICAgICAgICAgcnVudGltZTogdGhpcyxcbiAgICAgICAgICAgIGNhbGxiYWNrczogdGhpcy5jYWxsYmFja3MsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnRleHRNYXAuc2V0KGN0eC52YWx1ZSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiAgICBzZXRNb2R1bGVMb2FkZXIobW9kdWxlTG9hZGVyLCBtb2R1bGVOb3JtYWxpemVyKSB7XG4gICAgICAgIHN1cGVyLnNldE1vZHVsZUxvYWRlcihtb2R1bGVMb2FkZXIsIG1vZHVsZU5vcm1hbGl6ZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG1heCBzdGFjayBzaXplIGZvciB0aGlzIHJ1bnRpbWUgaW4gYnl0ZXMuXG4gICAgICogVG8gcmVtb3ZlIHRoZSBsaW1pdCwgc2V0IHRvIGAwYC5cbiAgICAgKlxuICAgICAqIFNldHRpbmcgdGhpcyBsaW1pdCBhbHNvIGFkanVzdHMgdGhlIGdsb2JhbCBgQVNZTkNJRllfU1RBQ0tfU0laRWAgZm9yIHRoZSBlbnRpcmUge0BsaW5rIFF1aWNrSlNBc3luY1dBU01Nb2R1bGV9LlxuICAgICAqIFNlZSB0aGUgW3B1bGwgcmVxdWVzdF0oaHR0cHM6Ly9naXRodWIuY29tL2p1c3RqYWtlL3F1aWNranMtZW1zY3JpcHRlbi9wdWxsLzExNCkgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKi9cbiAgICBzZXRNYXhTdGFja1NpemUoc3RhY2tTaXplKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5zZXRNYXhTdGFja1NpemUoc3RhY2tTaXplKTtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNBc3luY1J1bnRpbWUgPSBRdWlja0pTQXN5bmNSdW50aW1lO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnVudGltZS1hc3luY2lmeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU1J1bnRpbWUgPSB2b2lkIDA7XG5jb25zdCBhc3luY2lmeV9oZWxwZXJzXzEgPSByZXF1aXJlKFwiLi9hc3luY2lmeS1oZWxwZXJzXCIpO1xuY29uc3QgY29udGV4dF8xID0gcmVxdWlyZShcIi4vY29udGV4dFwiKTtcbmNvbnN0IGRlYnVnXzEgPSByZXF1aXJlKFwiLi9kZWJ1Z1wiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuY29uc3QgbGlmZXRpbWVfMSA9IHJlcXVpcmUoXCIuL2xpZmV0aW1lXCIpO1xuY29uc3QgbWVtb3J5XzEgPSByZXF1aXJlKFwiLi9tZW1vcnlcIik7XG5jb25zdCB0eXBlc18xID0gcmVxdWlyZShcIi4vdHlwZXNcIik7XG4vKipcbiAqIEEgcnVudGltZSByZXByZXNlbnRzIGEgSmF2YXNjcmlwdCBydW50aW1lIGNvcnJlc3BvbmRpbmcgdG8gYW4gb2JqZWN0IGhlYXAuXG4gKiBTZXZlcmFsIHJ1bnRpbWVzIGNhbiBleGlzdCBhdCB0aGUgc2FtZSB0aW1lIGJ1dCB0aGV5IGNhbm5vdCBleGNoYW5nZSBvYmplY3RzLlxuICogSW5zaWRlIGEgZ2l2ZW4gcnVudGltZSwgbm8gbXVsdGktdGhyZWFkaW5nIGlzIHN1cHBvcnRlZC5cbiAqXG4gKiBZb3UgY2FuIHRoaW5rIG9mIHNlcGFyYXRlIHJ1bnRpbWVzIGxpa2UgZGlmZmVyZW50IGRvbWFpbnMgaW4gYSBicm93c2VyLCBhbmRcbiAqIHRoZSBjb250ZXh0cyB3aXRoaW4gYSBydW50aW1lIGxpa2UgdGhlIGRpZmZlcmVudCB3aW5kb3dzIG9wZW4gdG8gdGhlIHNhbWVcbiAqIGRvbWFpbi5cbiAqXG4gKiBDcmVhdGUgYSBydW50aW1lIHZpYSB7QGxpbmsgUXVpY2tKU1dBU01Nb2R1bGUubmV3UnVudGltZX0uXG4gKlxuICogWW91IHNob3VsZCBjcmVhdGUgc2VwYXJhdGUgcnVudGltZSBpbnN0YW5jZXMgZm9yIHVudHJ1c3RlZCBjb2RlIGZyb21cbiAqIGRpZmZlcmVudCBzb3VyY2VzIGZvciBpc29sYXRpb24uIEhvd2V2ZXIsIHN0cm9uZ2VyIGlzb2xhdGlvbiBpcyBhbHNvXG4gKiBhdmFpbGFibGUgKGF0IHRoZSBjb3N0IG9mIG1lbW9yeSB1c2FnZSksIGJ5IGNyZWF0aW5nIHNlcGFyYXRlIFdlYkFzc2VtYmx5XG4gKiBtb2R1bGVzIHRvIGZ1cnRoZXIgaXNvbGF0ZSB1bnRydXN0ZWQgY29kZS5cbiAqIFNlZSB7QGxpbmsgbmV3UXVpY2tKU1dBU01Nb2R1bGV9LlxuICpcbiAqIEltcGxlbWVudCBtZW1vcnkgYW5kIENQVSBjb25zdHJhaW50cyB3aXRoIFtbc2V0SW50ZXJydXB0SGFuZGxlcl1dXG4gKiAoY2FsbGVkIHJlZ3VsYXJseSB3aGlsZSB0aGUgaW50ZXJwcmV0ZXIgcnVucyksIFtbc2V0TWVtb3J5TGltaXRdXSwgYW5kXG4gKiBbW3NldE1heFN0YWNrU2l6ZV1dLlxuICogVXNlIFtbY29tcHV0ZU1lbW9yeVVzYWdlXV0gb3IgW1tkdW1wTWVtb3J5VXNhZ2VdXSB0byBndWlkZSBtZW1vcnkgbGltaXRcbiAqIHR1bmluZy5cbiAqXG4gKiBDb25maWd1cmUgRVMgbW9kdWxlIGxvYWRpbmcgd2l0aCBbW3NldE1vZHVsZUxvYWRlcl1dLlxuICovXG5jbGFzcyBRdWlja0pTUnVudGltZSB7XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgY29uc3RydWN0b3IoYXJncykge1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5zY29wZSA9IG5ldyBsaWZldGltZV8xLlNjb3BlKCk7XG4gICAgICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmNvbnRleHRNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuY1RvSG9zdENhbGxiYWNrcyA9IHtcbiAgICAgICAgICAgIHNob3VsZEludGVycnVwdDogKHJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJ0ICE9PSB0aGlzLnJ0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlF1aWNrSlNDb250ZXh0IGluc3RhbmNlIHJlY2VpdmVkIEMgLT4gSlMgaW50ZXJydXB0IHdpdGggbWlzbWF0Y2hlZCBydFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZm4gPSB0aGlzLmludGVycnVwdEhhbmRsZXI7XG4gICAgICAgICAgICAgICAgaWYgKCFmbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJRdWlja0pTQ29udGV4dCBoYWQgbm8gaW50ZXJydXB0IGhhbmRsZXJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmbih0aGlzKSA/IDEgOiAwO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvYWRNb2R1bGVTb3VyY2U6ICgwLCBhc3luY2lmeV9oZWxwZXJzXzEubWF5YmVBc3luY0ZuKSh0aGlzLCBmdW5jdGlvbiogKGF3YWl0ZWQsIHJ0LCBjdHgsIG1vZHVsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVMb2FkZXIgPSB0aGlzLm1vZHVsZUxvYWRlcjtcbiAgICAgICAgICAgICAgICBpZiAoIW1vZHVsZUxvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdW50aW1lIGhhcyBubyBtb2R1bGUgbG9hZGVyXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocnQgIT09IHRoaXMucnQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVudGltZSBwb2ludGVyIG1pc21hdGNoXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0TWFwLmdldChjdHgpID8/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV3Q29udGV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0UG9pbnRlcjogY3R4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCogYXdhaXRlZChtb2R1bGVMb2FkZXIobW9kdWxlTmFtZSwgY29udGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiBcImVycm9yXCIgaW4gcmVzdWx0ICYmIHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwiY1RvSG9zdExvYWRNb2R1bGU6IGxvYWRlciByZXR1cm5lZCBlcnJvclwiLCByZXN1bHQuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZVNvdXJjZSA9IHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIgPyByZXN1bHQgOiBcInZhbHVlXCIgaW4gcmVzdWx0ID8gcmVzdWx0LnZhbHVlIDogcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkubmV3SGVhcENoYXJQb2ludGVyKG1vZHVsZVNvdXJjZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJjVG9Ib3N0TG9hZE1vZHVsZTogY2F1Z2h0IGVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC50aHJvdyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbm9ybWFsaXplTW9kdWxlOiAoMCwgYXN5bmNpZnlfaGVscGVyc18xLm1heWJlQXN5bmNGbikodGhpcywgZnVuY3Rpb24qIChhd2FpdGVkLCBydCwgY3R4LCBiYXNlTW9kdWxlTmFtZSwgbW9kdWxlTmFtZVJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVOb3JtYWxpemVyID0gdGhpcy5tb2R1bGVOb3JtYWxpemVyO1xuICAgICAgICAgICAgICAgIGlmICghbW9kdWxlTm9ybWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdW50aW1lIGhhcyBubyBtb2R1bGUgbm9ybWFsaXplclwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ0ICE9PSB0aGlzLnJ0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bnRpbWUgcG9pbnRlciBtaXNtYXRjaFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dE1hcC5nZXQoY3R4KSA/P1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0NvbnRleHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogRG9lcyB0aGlzIGhhcHBlbj8gQXJlIHdlIHJlc3BvbnNpYmxlIGZvciBkaXNwb3Npbmc/IEkgZG9uJ3QgdGhpbmsgc28gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRQb2ludGVyOiBjdHgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkKiBhd2FpdGVkKG1vZHVsZU5vcm1hbGl6ZXIoYmFzZU1vZHVsZU5hbWUsIG1vZHVsZU5hbWVSZXF1ZXN0LCBjb250ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmIFwiZXJyb3JcIiBpbiByZXN1bHQgJiYgcmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJjVG9Ib3N0Tm9ybWFsaXplTW9kdWxlOiBub3JtYWxpemVyIHJldHVybmVkIGVycm9yXCIsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIgPyByZXN1bHQgOiByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldE1lbW9yeSh0aGlzLnJ0LnZhbHVlKS5uZXdIZWFwQ2hhclBvaW50ZXIobmFtZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJub3JtYWxpemVNb2R1bGU6IGNhdWdodCBlcnJvclwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudGhyb3coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICAgICAgYXJncy5vd25lZExpZmV0aW1lcz8uZm9yRWFjaCgobGlmZXRpbWUpID0+IHRoaXMuc2NvcGUubWFuYWdlKGxpZmV0aW1lKSk7XG4gICAgICAgIHRoaXMubW9kdWxlID0gYXJncy5tb2R1bGU7XG4gICAgICAgIHRoaXMubWVtb3J5ID0gbmV3IG1lbW9yeV8xLk1vZHVsZU1lbW9yeSh0aGlzLm1vZHVsZSk7XG4gICAgICAgIHRoaXMuZmZpID0gYXJncy5mZmk7XG4gICAgICAgIHRoaXMucnQgPSBhcmdzLnJ0O1xuICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IGFyZ3MuY2FsbGJhY2tzO1xuICAgICAgICB0aGlzLnNjb3BlLm1hbmFnZSh0aGlzLnJ0KTtcbiAgICAgICAgdGhpcy5jYWxsYmFja3Muc2V0UnVudGltZUNhbGxiYWNrcyh0aGlzLnJ0LnZhbHVlLCB0aGlzLmNUb0hvc3RDYWxsYmFja3MpO1xuICAgICAgICB0aGlzLmV4ZWN1dGVQZW5kaW5nSm9icyA9IHRoaXMuZXhlY3V0ZVBlbmRpbmdKb2JzLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGdldCBhbGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGUuYWxpdmU7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgbmV3Q29udGV4dChvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaW50cmluc2ljcyAmJiBvcHRpb25zLmludHJpbnNpY3MgIT09IHR5cGVzXzEuRGVmYXVsdEludHJpbnNpY3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRPRE86IEN1c3RvbSBpbnRyaW5zaWNzIGFyZSBub3Qgc3VwcG9ydGVkIHlldFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdHggPSBuZXcgbGlmZXRpbWVfMS5MaWZldGltZShvcHRpb25zLmNvbnRleHRQb2ludGVyIHx8IHRoaXMuZmZpLlFUU19OZXdDb250ZXh0KHRoaXMucnQudmFsdWUpLCB1bmRlZmluZWQsIChjdHhfcHRyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNYXAuZGVsZXRlKGN0eF9wdHIpO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3MuZGVsZXRlQ29udGV4dChjdHhfcHRyKTtcbiAgICAgICAgICAgIHRoaXMuZmZpLlFUU19GcmVlQ29udGV4dChjdHhfcHRyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgY29udGV4dF8xLlF1aWNrSlNDb250ZXh0KHtcbiAgICAgICAgICAgIG1vZHVsZTogdGhpcy5tb2R1bGUsXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBmZmk6IHRoaXMuZmZpLFxuICAgICAgICAgICAgcnQ6IHRoaXMucnQsXG4gICAgICAgICAgICBvd25lZExpZmV0aW1lczogb3B0aW9ucy5vd25lZExpZmV0aW1lcyxcbiAgICAgICAgICAgIHJ1bnRpbWU6IHRoaXMsXG4gICAgICAgICAgICBjYWxsYmFja3M6IHRoaXMuY2FsbGJhY2tzLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb250ZXh0TWFwLnNldChjdHgudmFsdWUsIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsb2FkZXIgZm9yIEVjbWFTY3JpcHQgbW9kdWxlcyByZXF1ZXN0ZWQgYnkgYW55IGNvbnRleHQgaW4gdGhpc1xuICAgICAqIHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBUaGUgbG9hZGVyIGNhbiBiZSByZW1vdmVkIHdpdGggW1tyZW1vdmVNb2R1bGVMb2FkZXJdXS5cbiAgICAgKi9cbiAgICBzZXRNb2R1bGVMb2FkZXIobW9kdWxlTG9hZGVyLCBtb2R1bGVOb3JtYWxpemVyKSB7XG4gICAgICAgIHRoaXMubW9kdWxlTG9hZGVyID0gbW9kdWxlTG9hZGVyO1xuICAgICAgICB0aGlzLm1vZHVsZU5vcm1hbGl6ZXIgPSBtb2R1bGVOb3JtYWxpemVyO1xuICAgICAgICB0aGlzLmZmaS5RVFNfUnVudGltZUVuYWJsZU1vZHVsZUxvYWRlcih0aGlzLnJ0LnZhbHVlLCB0aGlzLm1vZHVsZU5vcm1hbGl6ZXIgPyAxIDogMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgdGhlIGxvYWRlciBzZXQgYnkgW1tzZXRNb2R1bGVMb2FkZXJdXS4gVGhpcyBkaXNhYmxlcyBtb2R1bGUgbG9hZGluZy5cbiAgICAgKi9cbiAgICByZW1vdmVNb2R1bGVMb2FkZXIoKSB7XG4gICAgICAgIHRoaXMubW9kdWxlTG9hZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmZmaS5RVFNfUnVudGltZURpc2FibGVNb2R1bGVMb2FkZXIodGhpcy5ydC52YWx1ZSk7XG4gICAgfVxuICAgIC8vIFJ1bnRpbWUgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogSW4gUXVpY2tKUywgcHJvbWlzZXMgYW5kIGFzeW5jIGZ1bmN0aW9ucyBjcmVhdGUgcGVuZGluZ0pvYnMuIFRoZXNlIGRvIG5vdCBleGVjdXRlXG4gICAgICogaW1tZWRpYXRlbHkgYW5kIG5lZWQgdG8gYmUgcnVuIGJ5IGNhbGxpbmcgW1tleGVjdXRlUGVuZGluZ0pvYnNdXS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcGVuZGluZ0pvYiBxdWV1ZWQgdXAuXG4gICAgICovXG4gICAgaGFzUGVuZGluZ0pvYigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5mZmkuUVRTX0lzSm9iUGVuZGluZyh0aGlzLnJ0LnZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBhIGNhbGxiYWNrIHdoaWNoIGlzIHJlZ3VsYXJseSBjYWxsZWQgYnkgdGhlIFF1aWNrSlMgZW5naW5lIHdoZW4gaXQgaXNcbiAgICAgKiBleGVjdXRpbmcgY29kZS4gVGhpcyBjYWxsYmFjayBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYW4gZXhlY3V0aW9uXG4gICAgICogdGltZW91dC5cbiAgICAgKlxuICAgICAqIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBjYW4gYmUgcmVtb3ZlZCB3aXRoIFtbcmVtb3ZlSW50ZXJydXB0SGFuZGxlcl1dLlxuICAgICAqL1xuICAgIHNldEludGVycnVwdEhhbmRsZXIoY2IpIHtcbiAgICAgICAgY29uc3QgcHJldkludGVycnVwdEhhbmRsZXIgPSB0aGlzLmludGVycnVwdEhhbmRsZXI7XG4gICAgICAgIHRoaXMuaW50ZXJydXB0SGFuZGxlciA9IGNiO1xuICAgICAgICBpZiAoIXByZXZJbnRlcnJ1cHRIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfUnVudGltZUVuYWJsZUludGVycnVwdEhhbmRsZXIodGhpcy5ydC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgaWYgYW55LlxuICAgICAqIFNlZSBbW3NldEludGVycnVwdEhhbmRsZXJdXS5cbiAgICAgKi9cbiAgICByZW1vdmVJbnRlcnJ1cHRIYW5kbGVyKCkge1xuICAgICAgICBpZiAodGhpcy5pbnRlcnJ1cHRIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfUnVudGltZURpc2FibGVJbnRlcnJ1cHRIYW5kbGVyKHRoaXMucnQudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5pbnRlcnJ1cHRIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgcGVuZGluZ0pvYnMgb24gdGhlIHJ1bnRpbWUgdW50aWwgYG1heEpvYnNUb0V4ZWN1dGVgIGpvYnMgYXJlXG4gICAgICogZXhlY3V0ZWQgKGRlZmF1bHQgYWxsIHBlbmRpbmdKb2JzKSwgdGhlIHF1ZXVlIGlzIGV4aGF1c3RlZCwgb3IgdGhlIHJ1bnRpbWVcbiAgICAgKiBlbmNvdW50ZXJzIGFuIGV4Y2VwdGlvbi5cbiAgICAgKlxuICAgICAqIEluIFF1aWNrSlMsIHByb21pc2VzIGFuZCBhc3luYyBmdW5jdGlvbnMgKmluc2lkZSB0aGUgcnVudGltZSogY3JlYXRlXG4gICAgICogcGVuZGluZ0pvYnMuIFRoZXNlIGRvIG5vdCBleGVjdXRlIGltbWVkaWF0ZWx5IGFuZCBuZWVkIHRvIHRyaWdnZXJlZCB0byBydW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWF4Sm9ic1RvRXhlY3V0ZSAtIFdoZW4gbmVnYXRpdmUsIHJ1biBhbGwgcGVuZGluZyBqb2JzLiBPdGhlcndpc2UgZXhlY3V0ZVxuICAgICAqIGF0IG1vc3QgYG1heEpvYnNUb0V4ZWN1dGVgIGJlZm9yZSByZXR1cm5pbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIE9uIHN1Y2Nlc3MsIHRoZSBudW1iZXIgb2YgZXhlY3V0ZWQgam9icy4gT24gZXJyb3IsIHRoZSBleGNlcHRpb25cbiAgICAgKiB0aGF0IHN0b3BwZWQgZXhlY3V0aW9uLCBhbmQgdGhlIGNvbnRleHQgaXQgb2NjdXJyZWQgaW4uIE5vdGUgdGhhdFxuICAgICAqIGV4ZWN1dGVQZW5kaW5nSm9icyB3aWxsIG5vdCBub3JtYWxseSByZXR1cm4gZXJyb3JzIHRocm93biBpbnNpZGUgYXN5bmNcbiAgICAgKiBmdW5jdGlvbnMgb3IgcmVqZWN0ZWQgcHJvbWlzZXMuIFRob3NlIGVycm9ycyBhcmUgYXZhaWxhYmxlIGJ5IGNhbGxpbmdcbiAgICAgKiBbW3Jlc29sdmVQcm9taXNlXV0gb24gdGhlIHByb21pc2UgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBhc3luYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBleGVjdXRlUGVuZGluZ0pvYnMobWF4Sm9ic1RvRXhlY3V0ZSA9IC0xKSB7XG4gICAgICAgIGNvbnN0IGN0eFB0ck91dCA9IHRoaXMubWVtb3J5Lm5ld011dGFibGVQb2ludGVyQXJyYXkoMSk7XG4gICAgICAgIGNvbnN0IHZhbHVlUHRyID0gdGhpcy5mZmkuUVRTX0V4ZWN1dGVQZW5kaW5nSm9iKHRoaXMucnQudmFsdWUsIG1heEpvYnNUb0V4ZWN1dGUgPz8gLTEsIGN0eFB0ck91dC52YWx1ZS5wdHIpO1xuICAgICAgICBjb25zdCBjdHhQdHIgPSBjdHhQdHJPdXQudmFsdWUudHlwZWRBcnJheVswXTtcbiAgICAgICAgY3R4UHRyT3V0LmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKGN0eFB0ciA9PT0gMCkge1xuICAgICAgICAgICAgLy8gTm8gam9icyBleGVjdXRlZC5cbiAgICAgICAgICAgIHRoaXMuZmZpLlFUU19GcmVlVmFsdWVQb2ludGVyUnVudGltZSh0aGlzLnJ0LnZhbHVlLCB2YWx1ZVB0cik7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogMCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHRNYXAuZ2V0KGN0eFB0cikgPz9cbiAgICAgICAgICAgIHRoaXMubmV3Q29udGV4dCh7XG4gICAgICAgICAgICAgICAgY29udGV4dFBvaW50ZXI6IGN0eFB0cixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHRWYWx1ZSA9IGNvbnRleHQuZ2V0TWVtb3J5KHRoaXMucnQudmFsdWUpLmhlYXBWYWx1ZUhhbmRsZSh2YWx1ZVB0cik7XG4gICAgICAgIGNvbnN0IHR5cGVPZlJldCA9IGNvbnRleHQudHlwZW9mKHJlc3VsdFZhbHVlKTtcbiAgICAgICAgaWYgKHR5cGVPZlJldCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWRKb2JzID0gY29udGV4dC5nZXROdW1iZXIocmVzdWx0VmFsdWUpO1xuICAgICAgICAgICAgcmVzdWx0VmFsdWUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGV4ZWN1dGVkSm9icyB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBPYmplY3QuYXNzaWduKHJlc3VsdFZhbHVlLCB7IGNvbnRleHQgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG1heCBtZW1vcnkgdGhpcyBydW50aW1lIGNhbiBhbGxvY2F0ZS5cbiAgICAgKiBUbyByZW1vdmUgdGhlIGxpbWl0LCBzZXQgdG8gYC0xYC5cbiAgICAgKi9cbiAgICBzZXRNZW1vcnlMaW1pdChsaW1pdEJ5dGVzKSB7XG4gICAgICAgIGlmIChsaW1pdEJ5dGVzIDwgMCAmJiBsaW1pdEJ5dGVzICE9PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBtZW1vcnkgbGltaXQgdG8gbmVnYXRpdmUgbnVtYmVyLiBUbyB1bnNldCwgcGFzcyAtMVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZmaS5RVFNfUnVudGltZVNldE1lbW9yeUxpbWl0KHRoaXMucnQudmFsdWUsIGxpbWl0Qnl0ZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIG1lbW9yeSB1c2FnZSBmb3IgdGhpcyBydW50aW1lLiBSZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBoYW5kbGUgdG8gYVxuICAgICAqIEpTVmFsdWUgb2JqZWN0LiBVc2UgW1tRdWlja0pTQ29udGV4dC5kdW1wXV0gdG8gY29udmVydCB0byBhIG5hdGl2ZSBvYmplY3QuXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGFsbG9jYXRlIG1vcmUgbWVtb3J5IGluc2lkZSB0aGUgcnVudGltZS4gVGhlIGluZm9ybWF0aW9uXG4gICAgICogaXMgYWNjdXJhdGUgYXMgb2YganVzdCBiZWZvcmUgdGhlIGNhbGwgdG8gYGNvbXB1dGVNZW1vcnlVc2FnZWAuXG4gICAgICogRm9yIGEgaHVtYW4tZGlnZXN0aWJsZSByZXByZXNlbnRhdGlvbiwgc2VlIFtbZHVtcE1lbW9yeVVzYWdlXV0uXG4gICAgICovXG4gICAgY29tcHV0ZU1lbW9yeVVzYWdlKCkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlQ29udGV4dE1lbW9yeSA9IHRoaXMuZ2V0U3lzdGVtQ29udGV4dCgpLmdldE1lbW9yeSh0aGlzLnJ0LnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHNlcnZpY2VDb250ZXh0TWVtb3J5LmhlYXBWYWx1ZUhhbmRsZSh0aGlzLmZmaS5RVFNfUnVudGltZUNvbXB1dGVNZW1vcnlVc2FnZSh0aGlzLnJ0LnZhbHVlLCBzZXJ2aWNlQ29udGV4dE1lbW9yeS5jdHgudmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiBtZW1vcnkgdXNhZ2UgaW4gdGhpcyBydW50aW1lLlxuICAgICAqIEZvciBwcm9ncmFtbWF0aWMgYWNjZXNzIHRvIHRoaXMgaW5mb3JtYXRpb24sIHNlZSBbW2NvbXB1dGVNZW1vcnlVc2FnZV1dLlxuICAgICAqL1xuICAgIGR1bXBNZW1vcnlVc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmNvbnN1bWVIZWFwQ2hhclBvaW50ZXIodGhpcy5mZmkuUVRTX1J1bnRpbWVEdW1wTWVtb3J5VXNhZ2UodGhpcy5ydC52YWx1ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG1heCBzdGFjayBzaXplIGZvciB0aGlzIHJ1bnRpbWUsIGluIGJ5dGVzLlxuICAgICAqIFRvIHJlbW92ZSB0aGUgbGltaXQsIHNldCB0byBgMGAuXG4gICAgICovXG4gICAgc2V0TWF4U3RhY2tTaXplKHN0YWNrU2l6ZSkge1xuICAgICAgICBpZiAoc3RhY2tTaXplIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBtZW1vcnkgbGltaXQgdG8gbmVnYXRpdmUgbnVtYmVyLiBUbyB1bnNldCwgcGFzcyAwLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZmaS5RVFNfUnVudGltZVNldE1heFN0YWNrU2l6ZSh0aGlzLnJ0LnZhbHVlLCBzdGFja1NpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3NlcnQgdGhhdCBgaGFuZGxlYCBpcyBvd25lZCBieSB0aGlzIHJ1bnRpbWUuXG4gICAgICogQHRocm93cyBRdWlja0pTV3JvbmdPd25lciBpZiBvd25lZCBieSBhIGRpZmZlcmVudCBydW50aW1lLlxuICAgICAqL1xuICAgIGFzc2VydE93bmVkKGhhbmRsZSkge1xuICAgICAgICBpZiAoaGFuZGxlLm93bmVyICYmIGhhbmRsZS5vd25lci5ydCAhPT0gdGhpcy5ydCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNXcm9uZ093bmVyKGBIYW5kbGUgaXMgbm90IG93bmVkIGJ5IHRoaXMgcnVudGltZTogJHtoYW5kbGUub3duZXIucnQudmFsdWV9ICE9ICR7dGhpcy5ydC52YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRTeXN0ZW1Db250ZXh0KCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dCkge1xuICAgICAgICAgICAgLy8gV2Ugb3duIHRoaXMgY29udGV4dCBhbmQgc2hvdWxkIGRpc3Bvc2Ugb2YgaXQuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQgPSB0aGlzLnNjb3BlLm1hbmFnZSh0aGlzLm5ld0NvbnRleHQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dDtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNSdW50aW1lID0gUXVpY2tKU1J1bnRpbWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ydW50aW1lLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5FdmFsRmxhZ3MgPSBleHBvcnRzLmFzc2VydFN5bmMgPSB2b2lkIDA7XG5mdW5jdGlvbiBhc3NlcnRTeW5jKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG11c3RCZVN5bmMoLi4uYXJncykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBmbiguLi5hcmdzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmIHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZ1bmN0aW9uIHVuZXhwZWN0ZWRseSByZXR1cm5lZCBhIFByb21pc2VcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufVxuZXhwb3J0cy5hc3NlcnRTeW5jID0gYXNzZXJ0U3luYztcbi8qKiBCaXRmaWVsZCBvcHRpb25zIGZvciBKU19FdmFsKCkgQyBmdW5jdGlvbi4gKi9cbmV4cG9ydHMuRXZhbEZsYWdzID0ge1xuICAgIC8qKiBnbG9iYWwgY29kZSAoZGVmYXVsdCkgKi9cbiAgICBKU19FVkFMX1RZUEVfR0xPQkFMOiAwIDw8IDAsXG4gICAgLyoqIG1vZHVsZSBjb2RlICovXG4gICAgSlNfRVZBTF9UWVBFX01PRFVMRTogMSA8PCAwLFxuICAgIC8qKiBkaXJlY3QgY2FsbCAoaW50ZXJuYWwgdXNlKSAqL1xuICAgIEpTX0VWQUxfVFlQRV9ESVJFQ1Q6IDIgPDwgMCxcbiAgICAvKiogaW5kaXJlY3QgY2FsbCAoaW50ZXJuYWwgdXNlKSAqL1xuICAgIEpTX0VWQUxfVFlQRV9JTkRJUkVDVDogMyA8PCAwLFxuICAgIEpTX0VWQUxfVFlQRV9NQVNLOiAzIDw8IDAsXG4gICAgLyoqIGZvcmNlICdzdHJpY3QnIG1vZGUgKi9cbiAgICBKU19FVkFMX0ZMQUdfU1RSSUNUOiAxIDw8IDMsXG4gICAgLyoqIGZvcmNlICdzdHJpcCcgbW9kZSAqL1xuICAgIEpTX0VWQUxfRkxBR19TVFJJUDogMSA8PCA0LFxuICAgIC8qKlxuICAgICAqIGNvbXBpbGUgYnV0IGRvIG5vdCBydW4uIFRoZSByZXN1bHQgaXMgYW4gb2JqZWN0IHdpdGggYVxuICAgICAqIEpTX1RBR19GVU5DVElPTl9CWVRFQ09ERSBvciBKU19UQUdfTU9EVUxFIHRhZy4gSXQgY2FuIGJlIGV4ZWN1dGVkXG4gICAgICogd2l0aCBKU19FdmFsRnVuY3Rpb24oKS5cbiAgICAgKi9cbiAgICBKU19FVkFMX0ZMQUdfQ09NUElMRV9PTkxZOiAxIDw8IDUsXG4gICAgLyoqIGRvbid0IGluY2x1ZGUgdGhlIHN0YWNrIGZyYW1lcyBiZWZvcmUgdGhpcyBldmFsIGluIHRoZSBFcnJvcigpIGJhY2t0cmFjZXMgKi9cbiAgICBKU19FVkFMX0ZMQUdfQkFDS1RSQUNFX0JBUlJJRVI6IDEgPDwgNixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy1mZmkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbmNhdCA9IGV4cG9ydHMuZXZhbE9wdGlvbnNUb0ZsYWdzID0gZXhwb3J0cy5EZWZhdWx0SW50cmluc2ljcyA9IHZvaWQgMDtcbmNvbnN0IHR5cGVzX2ZmaV8xID0gcmVxdWlyZShcIi4vdHlwZXMtZmZpXCIpO1xuY29uc3QgVW5zdGFibGVTeW1ib2wgPSBTeW1ib2woXCJVbnN0YWJsZVwiKTtcbi8vIEZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzXG5jb25zdCBEZWZhdWx0SW50cmluc2ljc0xpc3QgPSBbXG4gICAgXCJCYXNlT2JqZWN0c1wiLFxuICAgIFwiRGF0ZVwiLFxuICAgIFwiRXZhbFwiLFxuICAgIFwiU3RyaW5nTm9ybWFsaXplXCIsXG4gICAgXCJSZWdFeHBcIixcbiAgICBcIkpTT05cIixcbiAgICBcIlByb3h5XCIsXG4gICAgXCJNYXBTZXRcIixcbiAgICBcIlR5cGVkQXJyYXlzXCIsXG4gICAgXCJQcm9taXNlXCIsXG5dO1xuLyoqXG4gKiBXb3JrIGluIHByb2dyZXNzLlxuICovXG5leHBvcnRzLkRlZmF1bHRJbnRyaW5zaWNzID0gU3ltYm9sKFwiRGVmYXVsdEludHJpbnNpY3NcIik7XG4vKiogQ29udmVydCBbW0NvbnRleHRFdmFsT3B0aW9uc11dIHRvIGEgYml0ZmllbGQgZmxhZ3MgKi9cbmZ1bmN0aW9uIGV2YWxPcHRpb25zVG9GbGFncyhldmFsT3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgZXZhbE9wdGlvbnMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGV2YWxPcHRpb25zO1xuICAgIH1cbiAgICBpZiAoZXZhbE9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgeyB0eXBlLCBzdHJpY3QsIHN0cmlwLCBjb21waWxlT25seSwgYmFja3RyYWNlQmFycmllciB9ID0gZXZhbE9wdGlvbnM7XG4gICAgbGV0IGZsYWdzID0gMDtcbiAgICBpZiAodHlwZSA9PT0gXCJnbG9iYWxcIilcbiAgICAgICAgZmxhZ3MgfD0gdHlwZXNfZmZpXzEuRXZhbEZsYWdzLkpTX0VWQUxfVFlQRV9HTE9CQUw7XG4gICAgaWYgKHR5cGUgPT09IFwibW9kdWxlXCIpXG4gICAgICAgIGZsYWdzIHw9IHR5cGVzX2ZmaV8xLkV2YWxGbGFncy5KU19FVkFMX1RZUEVfTU9EVUxFO1xuICAgIGlmIChzdHJpY3QpXG4gICAgICAgIGZsYWdzIHw9IHR5cGVzX2ZmaV8xLkV2YWxGbGFncy5KU19FVkFMX0ZMQUdfU1RSSUNUO1xuICAgIGlmIChzdHJpcClcbiAgICAgICAgZmxhZ3MgfD0gdHlwZXNfZmZpXzEuRXZhbEZsYWdzLkpTX0VWQUxfRkxBR19TVFJJUDtcbiAgICBpZiAoY29tcGlsZU9ubHkpXG4gICAgICAgIGZsYWdzIHw9IHR5cGVzX2ZmaV8xLkV2YWxGbGFncy5KU19FVkFMX0ZMQUdfQ09NUElMRV9PTkxZO1xuICAgIGlmIChiYWNrdHJhY2VCYXJyaWVyKVxuICAgICAgICBmbGFncyB8PSB0eXBlc19mZmlfMS5FdmFsRmxhZ3MuSlNfRVZBTF9GTEFHX0JBQ0tUUkFDRV9CQVJSSUVSO1xuICAgIHJldHVybiBmbGFncztcbn1cbmV4cG9ydHMuZXZhbE9wdGlvbnNUb0ZsYWdzID0gZXZhbE9wdGlvbnNUb0ZsYWdzO1xuZnVuY3Rpb24gY29uY2F0KC4uLnZhbHVlcykge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydHMuY29uY2F0ID0gY29uY2F0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUkVMRUFTRV9BU1lOQyA9IGV4cG9ydHMuREVCVUdfQVNZTkMgPSBleHBvcnRzLlJFTEVBU0VfU1lOQyA9IGV4cG9ydHMuREVCVUdfU1lOQyA9IGV4cG9ydHMubWVtb2l6ZVByb21pc2VGYWN0b3J5ID0gZXhwb3J0cy5uZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlID0gZXhwb3J0cy5uZXdRdWlja0pTV0FTTU1vZHVsZSA9IHZvaWQgMDtcbmNvbnN0IGVzbUhlbHBlcnNfMSA9IHJlcXVpcmUoXCIuL2VzbUhlbHBlcnNcIik7XG4vKipcbiAqIENyZWF0ZSBhIG5ldywgY29tcGxldGVseSBpc29sYXRlZCBXZWJBc3NlbWJseSBtb2R1bGUgY29udGFpbmluZyB0aGUgUXVpY2tKUyBsaWJyYXJ5LlxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIFtbUXVpY2tKU1dBU01Nb2R1bGVdXS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlcmUgaXMgYSBoYXJkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgV2ViQXNzZW1ibHkgbW9kdWxlcyBpbiBvbGRlclxuICogdmVyc2lvbnMgb2Ygdjg6XG4gKiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMjA3NlxuICovXG5hc3luYyBmdW5jdGlvbiBuZXdRdWlja0pTV0FTTU1vZHVsZShcbi8qKlxuICogT3B0aW9uYWxseSwgcGFzcyBhIHtAbGluayBTeW5jQnVpbGRWYXJpYW50fSB0byBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgV2ViQXNzZW1ibHkgbW9kdWxlLlxuICovXG52YXJpYW50ID0gZXhwb3J0cy5SRUxFQVNFX1NZTkMpIHtcbiAgICBjb25zdCBbd2FzbU1vZHVsZUxvYWRlciwgUXVpY2tKU0ZGSSwgeyBRdWlja0pTV0FTTU1vZHVsZSB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdmFyaWFudC5pbXBvcnRNb2R1bGVMb2FkZXIoKSxcbiAgICAgICAgdmFyaWFudC5pbXBvcnRGRkkoKSxcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vbW9kdWxlLmpzXCIpKSkudGhlbihlc21IZWxwZXJzXzEudW53cmFwVHlwZXNjcmlwdCksXG4gICAgXSk7XG4gICAgY29uc3Qgd2FzbU1vZHVsZSA9IGF3YWl0IHdhc21Nb2R1bGVMb2FkZXIoKTtcbiAgICB3YXNtTW9kdWxlLnR5cGUgPSBcInN5bmNcIjtcbiAgICBjb25zdCBmZmkgPSBuZXcgUXVpY2tKU0ZGSSh3YXNtTW9kdWxlKTtcbiAgICByZXR1cm4gbmV3IFF1aWNrSlNXQVNNTW9kdWxlKHdhc21Nb2R1bGUsIGZmaSk7XG59XG5leHBvcnRzLm5ld1F1aWNrSlNXQVNNTW9kdWxlID0gbmV3UXVpY2tKU1dBU01Nb2R1bGU7XG4vKipcbiAqIENyZWF0ZSBhIG5ldywgY29tcGxldGVseSBpc29sYXRlZCBXZWJBc3NlbWJseSBtb2R1bGUgY29udGFpbmluZyBhIHZlcnNpb24gb2YgdGhlIFF1aWNrSlMgbGlicmFyeVxuICogY29tcGlsZWQgd2l0aCBFbXNjcmlwdGVuJ3MgW0FTWU5DSUZZXShodHRwczovL2Vtc2NyaXB0ZW4ub3JnL2RvY3MvcG9ydGluZy9hc3luY2lmeS5odG1sKSB0cmFuc2Zvcm0uXG4gKlxuICogVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG9mZmVycyBmZWF0dXJlcyB0aGF0IGVuYWJsZSBzeW5jaHJvbm91cyBjb2RlXG4gKiBpbnNpZGUgdGhlIFZNIHRvIGludGVyYWN0IHdpdGggYXN5bmNocm9ub3VzIGNvZGUgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQuXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gW1tRdWlja0pTQXN5bmNXQVNNTW9kdWxlXV0sIFtbUXVpY2tKU0FzeW5jUnVudGltZV1dLFxuICogYW5kIFtbUXVpY2tKU0FzeW5jQ29udGV4dF1dLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBhIGhhcmQgbGltaXQgb24gdGhlIG51bWJlciBvZiBXZWJBc3NlbWJseSBtb2R1bGVzIGluIG9sZGVyXG4gKiB2ZXJzaW9ucyBvZiB2ODpcbiAqIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTEyMDc2XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5ld1F1aWNrSlNBc3luY1dBU01Nb2R1bGUoXG4vKipcbiAqIE9wdGlvbmFsbHksIHBhc3MgYSB7QGxpbmsgQXN5bmNCdWlsZFZhcmlhbnR9IHRvIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBXZWJBc3NlbWJseSBtb2R1bGUuXG4gKi9cbnZhcmlhbnQgPSBleHBvcnRzLlJFTEVBU0VfQVNZTkMpIHtcbiAgICBjb25zdCBbd2FzbU1vZHVsZUxvYWRlciwgUXVpY2tKU0FzeW5jRkZJLCB7IFF1aWNrSlNBc3luY1dBU01Nb2R1bGUgfV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHZhcmlhbnQuaW1wb3J0TW9kdWxlTG9hZGVyKCksXG4gICAgICAgIHZhcmlhbnQuaW1wb3J0RkZJKCksXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL21vZHVsZS1hc3luY2lmeS5qc1wiKSkpLnRoZW4oZXNtSGVscGVyc18xLnVud3JhcFR5cGVzY3JpcHQpLFxuICAgIF0pO1xuICAgIGNvbnN0IHdhc21Nb2R1bGUgPSBhd2FpdCB3YXNtTW9kdWxlTG9hZGVyKCk7XG4gICAgd2FzbU1vZHVsZS50eXBlID0gXCJhc3luY1wiO1xuICAgIGNvbnN0IGZmaSA9IG5ldyBRdWlja0pTQXN5bmNGRkkod2FzbU1vZHVsZSk7XG4gICAgcmV0dXJuIG5ldyBRdWlja0pTQXN5bmNXQVNNTW9kdWxlKHdhc21Nb2R1bGUsIGZmaSk7XG59XG5leHBvcnRzLm5ld1F1aWNrSlNBc3luY1dBU01Nb2R1bGUgPSBuZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlO1xuLyoqXG4gKiBIZWxwZXIgaW50ZW5kZWQgdG8gbWVtb2l6ZSB0aGUgY3JlYXRpb24gb2YgYSBXZWJBc3NlbWJseSBtb2R1bGUuXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBnZXREZWJ1Z01vZHVsZSA9IG1lbW9pemVQcm9taXNlRmFjdG9yeSgoKSA9PiBuZXdRdWlja0pTV0FTTU1vZHVsZShERUJVR19TWU5DKSlcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBtZW1vaXplUHJvbWlzZUZhY3RvcnkoZm4pIHtcbiAgICBsZXQgcHJvbWlzZTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHByb21pc2UgPz8gKHByb21pc2UgPSBmbigpKSk7XG4gICAgfTtcbn1cbmV4cG9ydHMubWVtb2l6ZVByb21pc2VGYWN0b3J5ID0gbWVtb2l6ZVByb21pc2VGYWN0b3J5O1xuLyoqXG4gKiBUaGlzIGJ1aWxkIHZhcmlhbnQgaXMgY29tcGlsZWQgd2l0aCBgLWZzYW5pdGl6ZT1sZWFrYC4gSXQgaW5zdHJ1bWVudHMgYWxsXG4gKiBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIHdoZW4gY29tYmluZWQgd2l0aCBzb3VyY2VtYXBzLCBjYW4gcHJlc2VudCBzdGFjayB0cmFjZVxuICogbG9jYXRpb25zIHdoZXJlIG1lbW9yeSBsZWFrcyBvY2N1ci5cbiAqXG4gKiBTZWUgW1tUZXN0UXVpY2tKU1dBU01Nb2R1bGVdXSB3aGljaCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxlYWsgc2FuaXRpemVyIHZpYVxuICoge0BsaW5rIFRlc3RRdWlja0pTV0FTTU1vZHVsZS5hc3NlcnROb01lbW9yeUFsbG9jYXRlZH0uXG4gKlxuICogVGhlIGRvd25zaWRlIGlzIHRoYXQgaXQncyAxMDAtMTAwMHggc2xvd2VyIHRoYW4gdGhlIG90aGVyIHZhcmlhbnRzLlxuICogU3VnZ2VzdGVkIHVzZSBjYXNlOiBhdXRvbWF0ZWQgdGVzdGluZywgcmVncmVzc2lvbiB0ZXN0aW5nLCBhbmQgaW50ZXJhY3RpdmVcbiAqIGRlYnVnZ2luZy5cbiAqL1xuZXhwb3J0cy5ERUJVR19TWU5DID0ge1xuICAgIHR5cGU6IFwic3luY1wiLFxuICAgIGFzeW5jIGltcG9ydEZGSSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICAvLyBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoXCIuL2dlbmVyYXRlZC9mZmkuV0FTTV9ERUJVR19TWU5DLmpzXCIpXG4gICAgICAgIC8vIHJldHVybiB1bndyYXBUeXBlc2NyaXB0KG1vZCkuUXVpY2tKU0ZGSVxuICAgIH0sXG4gICAgYXN5bmMgaW1wb3J0TW9kdWxlTG9hZGVyKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgIC8vIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChcIi4vZ2VuZXJhdGVkL2Vtc2NyaXB0ZW4tbW9kdWxlLldBU01fREVCVUdfU1lOQy5qc1wiKVxuICAgICAgICAvLyByZXR1cm4gdW53cmFwSmF2YXNjcmlwdChtb2QpLmRlZmF1bHRcbiAgICB9LFxufTtcbi8qKlxuICogVGhpcyBpcyB0aGUgZGVmYXVsdCAoc3luY2hyb25vdXMpIGJ1aWxkIHZhcmlhbnQuXG4gKiB7QGxpbmsgZ2V0UXVpY2tKU30gcmV0dXJucyBhIG1lbW9pemVkIGluc3RhbmNlIG9mIHRoaXMgYnVpbGQgdmFyaWFudC5cbiAqL1xuZXhwb3J0cy5SRUxFQVNFX1NZTkMgPSB7XG4gICAgdHlwZTogXCJzeW5jXCIsXG4gICAgYXN5bmMgaW1wb3J0RkZJKCkge1xuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9nZW5lcmF0ZWQvZmZpLldBU01fUkVMRUFTRV9TWU5DLmpzXCIpKSk7XG4gICAgICAgIHJldHVybiAoMCwgZXNtSGVscGVyc18xLnVud3JhcFR5cGVzY3JpcHQpKG1vZCkuUXVpY2tKU0ZGSTtcbiAgICB9LFxuICAgIGFzeW5jIGltcG9ydE1vZHVsZUxvYWRlcigpIHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vZ2VuZXJhdGVkL2Vtc2NyaXB0ZW4tbW9kdWxlLldBU01fUkVMRUFTRV9TWU5DLmpzXCIpKSk7XG4gICAgICAgIHJldHVybiAoMCwgZXNtSGVscGVyc18xLnVud3JhcEphdmFzY3JpcHQpKG1vZCk7XG4gICAgfSxcbn07XG4vKipcbiAqIFRoZSBhc3luYyBkZWJ1ZyBidWlsZCB2YXJpYW50IG1heSBvciBtYXkgbm90IGhhdmUgdGhlIHNhbml0aXplciBlbmFibGVkLlxuICogSXQgZG9lcyBwcmludCBhIGxvdCBvZiBkZWJ1ZyBsb2dzLlxuICpcbiAqIFN1Z2dlc3RlZCB1c2UgY2FzZTogaW50ZXJhY3RpdmUgZGVidWdnaW5nIG9ubHkuXG4gKi9cbmV4cG9ydHMuREVCVUdfQVNZTkMgPSB7XG4gICAgdHlwZTogXCJhc3luY1wiLFxuICAgIGFzeW5jIGltcG9ydEZGSSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICAvLyBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoXCIuL2dlbmVyYXRlZC9mZmkuV0FTTV9ERUJVR19BU1lOQ0lGWS5qc1wiKVxuICAgICAgICAvLyByZXR1cm4gdW53cmFwVHlwZXNjcmlwdChtb2QpLlF1aWNrSlNBc3luY0ZGSVxuICAgIH0sXG4gICAgYXN5bmMgaW1wb3J0TW9kdWxlTG9hZGVyKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgIC8vIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChcIi4vZ2VuZXJhdGVkL2Vtc2NyaXB0ZW4tbW9kdWxlLldBU01fREVCVUdfQVNZTkNJRlkuanNcIilcbiAgICAgICAgLy8gcmV0dXJuIHVud3JhcEphdmFzY3JpcHQobW9kKS5kZWZhdWx0XG4gICAgfSxcbn07XG4vKipcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgYXN5bmNpZmllZCBidWlsZCB2YXJpYW50LlxuICovXG5leHBvcnRzLlJFTEVBU0VfQVNZTkMgPSB7XG4gICAgdHlwZTogXCJhc3luY1wiLFxuICAgIGFzeW5jIGltcG9ydEZGSSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICAvLyBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoXCIuL2dlbmVyYXRlZC9mZmkuV0FTTV9SRUxFQVNFX0FTWU5DSUZZLmpzXCIpXG4gICAgICAgIC8vIHJldHVybiB1bndyYXBUeXBlc2NyaXB0KG1vZCkuUXVpY2tKU0FzeW5jRkZJXG4gICAgfSxcbiAgICBhc3luYyBpbXBvcnRNb2R1bGVMb2FkZXIoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgLy8gY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KFwiLi9nZW5lcmF0ZWQvZW1zY3JpcHRlbi1tb2R1bGUuV0FTTV9SRUxFQVNFX0FTWU5DSUZZLmpzXCIpXG4gICAgICAgIC8vIHJldHVybiB1bndyYXBKYXZhc2NyaXB0KG1vZCkuZGVmYXVsdFxuICAgIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmFyaWFudHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzRmFpbCA9IGV4cG9ydHMuaXNTdWNjZXNzID0gdm9pZCAwO1xuZnVuY3Rpb24gaXNTdWNjZXNzKHN1Y2Nlc3NPckZhaWwpIHtcbiAgICByZXR1cm4gXCJlcnJvclwiIGluIHN1Y2Nlc3NPckZhaWwgPT09IGZhbHNlO1xufVxuZXhwb3J0cy5pc1N1Y2Nlc3MgPSBpc1N1Y2Nlc3M7XG5mdW5jdGlvbiBpc0ZhaWwoc3VjY2Vzc09yRmFpbCkge1xuICAgIHJldHVybiBcImVycm9yXCIgaW4gc3VjY2Vzc09yRmFpbCA9PT0gdHJ1ZTtcbn1cbmV4cG9ydHMuaXNGYWlsID0gaXNGYWlsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dm0taW50ZXJmYWNlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlcSA9IGV4cG9ydHMuanNvbiA9IGV4cG9ydHMudG9CdWZmZXIgPSB2b2lkIDA7XG5jb25zdCBodHRwID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwXCIpKTtcbmNvbnN0IGh0dHBzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwc1wiKSk7XG5hc3luYyBmdW5jdGlvbiB0b0J1ZmZlcihzdHJlYW0pIHtcbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHN0cmVhbSkge1xuICAgICAgICBsZW5ndGggKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcywgbGVuZ3RoKTtcbn1cbmV4cG9ydHMudG9CdWZmZXIgPSB0b0J1ZmZlcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5hc3luYyBmdW5jdGlvbiBqc29uKHN0cmVhbSkge1xuICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHRvQnVmZmVyKHN0cmVhbSk7XG4gICAgY29uc3Qgc3RyID0gYnVmLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbiAgICB9XG4gICAgY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgY29uc3QgZXJyID0gX2VycjtcbiAgICAgICAgZXJyLm1lc3NhZ2UgKz0gYCAoaW5wdXQ6ICR7c3RyfSlgO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufVxuZXhwb3J0cy5qc29uID0ganNvbjtcbmZ1bmN0aW9uIHJlcSh1cmwsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGhyZWYgPSB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyA/IHVybCA6IHVybC5ocmVmO1xuICAgIGNvbnN0IHJlcSA9IChocmVmLnN0YXJ0c1dpdGgoJ2h0dHBzOicpID8gaHR0cHMgOiBodHRwKS5yZXF1ZXN0KHVybCwgb3B0cyk7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcmVxXG4gICAgICAgICAgICAub25jZSgncmVzcG9uc2UnLCByZXNvbHZlKVxuICAgICAgICAgICAgLm9uY2UoJ2Vycm9yJywgcmVqZWN0KVxuICAgICAgICAgICAgLmVuZCgpO1xuICAgIH0pO1xuICAgIHJlcS50aGVuID0gcHJvbWlzZS50aGVuLmJpbmQocHJvbWlzZSk7XG4gICAgcmV0dXJuIHJlcTtcbn1cbmV4cG9ydHMucmVxID0gcmVxO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGVscGVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQWdlbnQgPSB2b2lkIDA7XG5jb25zdCBuZXQgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm5ldFwiKSk7XG5jb25zdCBodHRwID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwXCIpKTtcbmNvbnN0IGh0dHBzXzEgPSByZXF1aXJlKFwiaHR0cHNcIik7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vaGVscGVyc1wiKSwgZXhwb3J0cyk7XG5jb25zdCBJTlRFUk5BTCA9IFN5bWJvbCgnQWdlbnRCYXNlSW50ZXJuYWxTdGF0ZScpO1xuY2xhc3MgQWdlbnQgZXh0ZW5kcyBodHRwLkFnZW50IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzW0lOVEVSTkFMXSA9IHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGFuIGBodHRwYCBvciBgaHR0cHNgIHJlcXVlc3QuXG4gICAgICovXG4gICAgaXNTZWN1cmVFbmRwb2ludChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBjaGVjayB0aGUgYHNlY3VyZUVuZHBvaW50YCBwcm9wZXJ0eSBleHBsaWNpdGx5LCBzaW5jZSB0aGlzXG4gICAgICAgICAgICAvLyBtZWFucyB0aGF0IGEgcGFyZW50IGBBZ2VudGAgaXMgXCJwYXNzaW5nIHRocm91Z2hcIiB0byB0aGlzIGluc3RhbmNlLlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zZWN1cmVFbmRwb2ludCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc2VjdXJlRW5kcG9pbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBubyBleHBsaWNpdCBgc2VjdXJlYCBlbmRwb2ludCwgY2hlY2sgaWYgYHByb3RvY29sYCBwcm9wZXJ0eSBpc1xuICAgICAgICAgICAgLy8gc2V0LiBUaGlzIHdpbGwgdXN1YWxseSBiZSB0aGUgY2FzZSBzaW5jZSB1c2luZyBhIGZ1bGwgc3RyaW5nIFVSTFxuICAgICAgICAgICAgLy8gb3IgYFVSTGAgaW5zdGFuY2Ugc2hvdWxkIGJlIHRoZSBtb3N0IGNvbW1vbiB1c2FnZS5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5wcm90b2NvbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmluYWxseSwgaWYgbm8gYHByb3RvY29sYCBwcm9wZXJ0eSB3YXMgc2V0LCB0aGVuIGZhbGwgYmFjayB0b1xuICAgICAgICAvLyBjaGVja2luZyB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlIGN1cnJlbnQgY2FsbCBzdGFjaywgYW5kIHRyeSB0b1xuICAgICAgICAvLyBkZXRlY3QgdGhlIFwiaHR0cHNcIiBtb2R1bGUuXG4gICAgICAgIGNvbnN0IHsgc3RhY2sgfSA9IG5ldyBFcnJvcigpO1xuICAgICAgICBpZiAodHlwZW9mIHN0YWNrICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHN0YWNrXG4gICAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAuc29tZSgobCkgPT4gbC5pbmRleE9mKCcoaHR0cHMuanM6JykgIT09IC0xIHx8XG4gICAgICAgICAgICBsLmluZGV4T2YoJ25vZGU6aHR0cHM6JykgIT09IC0xKTtcbiAgICB9XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCBhc3luYyBzaWduYXR1cmVzIGluIGBjb25uZWN0KClgIGFuZCBOb2RlJ3MgbmF0aXZlXG4gICAgLy8gY29ubmVjdGlvbiBwb29saW5nIGluIGBodHRwLkFnZW50YCwgdGhlIGFycmF5IG9mIHNvY2tldHMgZm9yIGVhY2ggb3JpZ2luXG4gICAgLy8gaGFzIHRvIGJlIHVwZGF0ZWQgc3luY2hyb25vdXNseS4gVGhpcyBpcyBzbyB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBpc1xuICAgIC8vIGFjY3VyYXRlIHdoZW4gYGFkZFJlcXVlc3QoKWAgaXMgbmV4dCBjYWxsZWQuIFdlIGFjaGlldmUgdGhpcyBieSBjcmVhdGluZyBhXG4gICAgLy8gZmFrZSBzb2NrZXQgYW5kIGFkZGluZyBpdCB0byBgc29ja2V0c1tvcmlnaW5dYCBhbmQgaW5jcmVtZW50aW5nXG4gICAgLy8gYHRvdGFsU29ja2V0Q291bnRgLlxuICAgIGluY3JlbWVudFNvY2tldHMobmFtZSkge1xuICAgICAgICAvLyBJZiBgbWF4U29ja2V0c2AgYW5kIGBtYXhUb3RhbFNvY2tldHNgIGFyZSBib3RoIEluZmluaXR5IHRoZW4gdGhlcmUgaXMgbm9cbiAgICAgICAgLy8gbmVlZCB0byBjcmVhdGUgYSBmYWtlIHNvY2tldCBiZWNhdXNlIE5vZGUuanMgbmF0aXZlIGNvbm5lY3Rpb24gcG9vbGluZ1xuICAgICAgICAvLyB3aWxsIG5ldmVyIGJlIGludm9rZWQuXG4gICAgICAgIGlmICh0aGlzLm1heFNvY2tldHMgPT09IEluZmluaXR5ICYmIHRoaXMubWF4VG90YWxTb2NrZXRzID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxsIGluc3RhbmNlcyBvZiBgc29ja2V0c2AgYXJlIGV4cGVjdGVkIFR5cGVTY3JpcHQgZXJyb3JzLiBUaGVcbiAgICAgICAgLy8gYWx0ZXJuYXRpdmUgaXMgdG8gYWRkIGl0IGFzIGEgcHJpdmF0ZSBwcm9wZXJ0eSBvZiB0aGlzIGNsYXNzIGJ1dCB0aGF0XG4gICAgICAgIC8vIHdpbGwgYnJlYWsgVHlwZVNjcmlwdCBzdWJjbGFzc2luZy5cbiAgICAgICAgaWYgKCF0aGlzLnNvY2tldHNbbmFtZV0pIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYHNvY2tldHNgIGlzIHJlYWRvbmx5IGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgICAgIHRoaXMuc29ja2V0c1tuYW1lXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZha2VTb2NrZXQgPSBuZXcgbmV0LlNvY2tldCh7IHdyaXRhYmxlOiBmYWxzZSB9KTtcbiAgICAgICAgdGhpcy5zb2NrZXRzW25hbWVdLnB1c2goZmFrZVNvY2tldCk7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYHRvdGFsU29ja2V0Q291bnRgIGlzbid0IGRlZmluZWQgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICB0aGlzLnRvdGFsU29ja2V0Q291bnQrKztcbiAgICAgICAgcmV0dXJuIGZha2VTb2NrZXQ7XG4gICAgfVxuICAgIGRlY3JlbWVudFNvY2tldHMobmFtZSwgc29ja2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5zb2NrZXRzW25hbWVdIHx8IHNvY2tldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvY2tldHMgPSB0aGlzLnNvY2tldHNbbmFtZV07XG4gICAgICAgIGNvbnN0IGluZGV4ID0gc29ja2V0cy5pbmRleE9mKHNvY2tldCk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHNvY2tldHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgIGB0b3RhbFNvY2tldENvdW50YCBpc24ndCBkZWZpbmVkIGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgICAgIHRoaXMudG90YWxTb2NrZXRDb3VudC0tO1xuICAgICAgICAgICAgaWYgKHNvY2tldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgc29ja2V0c2AgaXMgcmVhZG9ubHkgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNvY2tldHNbbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gb3JkZXIgdG8gcHJvcGVybHkgdXBkYXRlIHRoZSBzb2NrZXQgcG9vbCwgd2UgbmVlZCB0byBjYWxsIGBnZXROYW1lKClgIG9uXG4gICAgLy8gdGhlIGNvcmUgYGh0dHBzLkFnZW50YCBpZiBpdCBpcyBhIHNlY3VyZUVuZHBvaW50LlxuICAgIGdldE5hbWUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBzZWN1cmVFbmRwb2ludCA9IHR5cGVvZiBvcHRpb25zLnNlY3VyZUVuZHBvaW50ID09PSAnYm9vbGVhbidcbiAgICAgICAgICAgID8gb3B0aW9ucy5zZWN1cmVFbmRwb2ludFxuICAgICAgICAgICAgOiB0aGlzLmlzU2VjdXJlRW5kcG9pbnQob3B0aW9ucyk7XG4gICAgICAgIGlmIChzZWN1cmVFbmRwb2ludCkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgZ2V0TmFtZSgpYCBpc24ndCBkZWZpbmVkIGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgICAgIHJldHVybiBodHRwc18xLkFnZW50LnByb3RvdHlwZS5nZXROYW1lLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgZ2V0TmFtZSgpYCBpc24ndCBkZWZpbmVkIGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5hbWUob3B0aW9ucyk7XG4gICAgfVxuICAgIGNyZWF0ZVNvY2tldChyZXEsIG9wdGlvbnMsIGNiKSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3RPcHRzID0ge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHNlY3VyZUVuZHBvaW50OiB0aGlzLmlzU2VjdXJlRW5kcG9pbnQob3B0aW9ucyksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldE5hbWUoY29ubmVjdE9wdHMpO1xuICAgICAgICBjb25zdCBmYWtlU29ja2V0ID0gdGhpcy5pbmNyZW1lbnRTb2NrZXRzKG5hbWUpO1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5jb25uZWN0KHJlcSwgY29ubmVjdE9wdHMpKVxuICAgICAgICAgICAgLnRoZW4oKHNvY2tldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRTb2NrZXRzKG5hbWUsIGZha2VTb2NrZXQpO1xuICAgICAgICAgICAgaWYgKHNvY2tldCBpbnN0YW5jZW9mIGh0dHAuQWdlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBhZGRSZXF1ZXN0KClgIGlzbid0IGRlZmluZWQgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICAgICAgICAgIHJldHVybiBzb2NrZXQuYWRkUmVxdWVzdChyZXEsIGNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXNbSU5URVJOQUxdLmN1cnJlbnRTb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBjcmVhdGVTb2NrZXQoKWAgaXNuJ3QgZGVmaW5lZCBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgICAgICBzdXBlci5jcmVhdGVTb2NrZXQocmVxLCBvcHRpb25zLCBjYik7XG4gICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50U29ja2V0cyhuYW1lLCBmYWtlU29ja2V0KTtcbiAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjcmVhdGVDb25uZWN0aW9uKCkge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSB0aGlzW0lOVEVSTkFMXS5jdXJyZW50U29ja2V0O1xuICAgICAgICB0aGlzW0lOVEVSTkFMXS5jdXJyZW50U29ja2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIXNvY2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzb2NrZXQgd2FzIHJldHVybmVkIGluIHRoZSBgY29ubmVjdCgpYCBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb2NrZXQ7XG4gICAgfVxuICAgIGdldCBkZWZhdWx0UG9ydCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzW0lOVEVSTkFMXS5kZWZhdWx0UG9ydCA/P1xuICAgICAgICAgICAgKHRoaXMucHJvdG9jb2wgPT09ICdodHRwczonID8gNDQzIDogODApKTtcbiAgICB9XG4gICAgc2V0IGRlZmF1bHRQb3J0KHYpIHtcbiAgICAgICAgaWYgKHRoaXNbSU5URVJOQUxdKSB7XG4gICAgICAgICAgICB0aGlzW0lOVEVSTkFMXS5kZWZhdWx0UG9ydCA9IHY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHByb3RvY29sKCkge1xuICAgICAgICByZXR1cm4gKHRoaXNbSU5URVJOQUxdLnByb3RvY29sID8/XG4gICAgICAgICAgICAodGhpcy5pc1NlY3VyZUVuZHBvaW50KCkgPyAnaHR0cHM6JyA6ICdodHRwOicpKTtcbiAgICB9XG4gICAgc2V0IHByb3RvY29sKHYpIHtcbiAgICAgICAgaWYgKHRoaXNbSU5URVJOQUxdKSB7XG4gICAgICAgICAgICB0aGlzW0lOVEVSTkFMXS5wcm90b2NvbCA9IHY7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFnZW50ID0gQWdlbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gKHtvbmx5Rmlyc3QgPSBmYWxzZX0gPSB7fSkgPT4ge1xuXHRjb25zdCBwYXR0ZXJuID0gW1xuXHRcdCdbXFxcXHUwMDFCXFxcXHUwMDlCXVtbXFxcXF0oKSM7P10qKD86KD86KD86KD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKykqfFthLXpBLVpcXFxcZF0rKD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKikqKT9cXFxcdTAwMDcpJyxcblx0XHQnKD86KD86XFxcXGR7MSw0fSg/OjtcXFxcZHswLDR9KSopP1tcXFxcZEEtUFItVFpjZi1udHFyeT0+PH5dKSknXG5cdF0uam9pbignfCcpO1xuXG5cdHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4sIG9ubHlGaXJzdCA/IHVuZGVmaW5lZCA6ICdnJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB3cmFwQW5zaTE2ID0gKGZuLCBvZmZzZXQpID0+ICguLi5hcmdzKSA9PiB7XG5cdGNvbnN0IGNvZGUgPSBmbiguLi5hcmdzKTtcblx0cmV0dXJuIGBcXHUwMDFCWyR7Y29kZSArIG9mZnNldH1tYDtcbn07XG5cbmNvbnN0IHdyYXBBbnNpMjU2ID0gKGZuLCBvZmZzZXQpID0+ICguLi5hcmdzKSA9PiB7XG5cdGNvbnN0IGNvZGUgPSBmbiguLi5hcmdzKTtcblx0cmV0dXJuIGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzU7JHtjb2RlfW1gO1xufTtcblxuY29uc3Qgd3JhcEFuc2kxNm0gPSAoZm4sIG9mZnNldCkgPT4gKC4uLmFyZ3MpID0+IHtcblx0Y29uc3QgcmdiID0gZm4oLi4uYXJncyk7XG5cdHJldHVybiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTsyOyR7cmdiWzBdfTske3JnYlsxXX07JHtyZ2JbMl19bWA7XG59O1xuXG5jb25zdCBhbnNpMmFuc2kgPSBuID0+IG47XG5jb25zdCByZ2IycmdiID0gKHIsIGcsIGIpID0+IFtyLCBnLCBiXTtcblxuY29uc3Qgc2V0TGF6eVByb3BlcnR5ID0gKG9iamVjdCwgcHJvcGVydHksIGdldCkgPT4ge1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwge1xuXHRcdGdldDogKCkgPT4ge1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBnZXQoKTtcblxuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHtcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9LFxuXHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdH0pO1xufTtcblxuLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCdjb2xvci1jb252ZXJ0Jyl9ICovXG5sZXQgY29sb3JDb252ZXJ0O1xuY29uc3QgbWFrZUR5bmFtaWNTdHlsZXMgPSAod3JhcCwgdGFyZ2V0U3BhY2UsIGlkZW50aXR5LCBpc0JhY2tncm91bmQpID0+IHtcblx0aWYgKGNvbG9yQ29udmVydCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Y29sb3JDb252ZXJ0ID0gcmVxdWlyZSgnY29sb3ItY29udmVydCcpO1xuXHR9XG5cblx0Y29uc3Qgb2Zmc2V0ID0gaXNCYWNrZ3JvdW5kID8gMTAgOiAwO1xuXHRjb25zdCBzdHlsZXMgPSB7fTtcblxuXHRmb3IgKGNvbnN0IFtzb3VyY2VTcGFjZSwgc3VpdGVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbG9yQ29udmVydCkpIHtcblx0XHRjb25zdCBuYW1lID0gc291cmNlU3BhY2UgPT09ICdhbnNpMTYnID8gJ2Fuc2knIDogc291cmNlU3BhY2U7XG5cdFx0aWYgKHNvdXJjZVNwYWNlID09PSB0YXJnZXRTcGFjZSkge1xuXHRcdFx0c3R5bGVzW25hbWVdID0gd3JhcChpZGVudGl0eSwgb2Zmc2V0KTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzdWl0ZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdHN0eWxlc1tuYW1lXSA9IHdyYXAoc3VpdGVbdGFyZ2V0U3BhY2VdLCBvZmZzZXQpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBzdHlsZXM7XG59O1xuXG5mdW5jdGlvbiBhc3NlbWJsZVN0eWxlcygpIHtcblx0Y29uc3QgY29kZXMgPSBuZXcgTWFwKCk7XG5cdGNvbnN0IHN0eWxlcyA9IHtcblx0XHRtb2RpZmllcjoge1xuXHRcdFx0cmVzZXQ6IFswLCAwXSxcblx0XHRcdC8vIDIxIGlzbid0IHdpZGVseSBzdXBwb3J0ZWQgYW5kIDIyIGRvZXMgdGhlIHNhbWUgdGhpbmdcblx0XHRcdGJvbGQ6IFsxLCAyMl0sXG5cdFx0XHRkaW06IFsyLCAyMl0sXG5cdFx0XHRpdGFsaWM6IFszLCAyM10sXG5cdFx0XHR1bmRlcmxpbmU6IFs0LCAyNF0sXG5cdFx0XHRpbnZlcnNlOiBbNywgMjddLFxuXHRcdFx0aGlkZGVuOiBbOCwgMjhdLFxuXHRcdFx0c3RyaWtldGhyb3VnaDogWzksIDI5XVxuXHRcdH0sXG5cdFx0Y29sb3I6IHtcblx0XHRcdGJsYWNrOiBbMzAsIDM5XSxcblx0XHRcdHJlZDogWzMxLCAzOV0sXG5cdFx0XHRncmVlbjogWzMyLCAzOV0sXG5cdFx0XHR5ZWxsb3c6IFszMywgMzldLFxuXHRcdFx0Ymx1ZTogWzM0LCAzOV0sXG5cdFx0XHRtYWdlbnRhOiBbMzUsIDM5XSxcblx0XHRcdGN5YW46IFszNiwgMzldLFxuXHRcdFx0d2hpdGU6IFszNywgMzldLFxuXG5cdFx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRcdGJsYWNrQnJpZ2h0OiBbOTAsIDM5XSxcblx0XHRcdHJlZEJyaWdodDogWzkxLCAzOV0sXG5cdFx0XHRncmVlbkJyaWdodDogWzkyLCAzOV0sXG5cdFx0XHR5ZWxsb3dCcmlnaHQ6IFs5MywgMzldLFxuXHRcdFx0Ymx1ZUJyaWdodDogWzk0LCAzOV0sXG5cdFx0XHRtYWdlbnRhQnJpZ2h0OiBbOTUsIDM5XSxcblx0XHRcdGN5YW5CcmlnaHQ6IFs5NiwgMzldLFxuXHRcdFx0d2hpdGVCcmlnaHQ6IFs5NywgMzldXG5cdFx0fSxcblx0XHRiZ0NvbG9yOiB7XG5cdFx0XHRiZ0JsYWNrOiBbNDAsIDQ5XSxcblx0XHRcdGJnUmVkOiBbNDEsIDQ5XSxcblx0XHRcdGJnR3JlZW46IFs0MiwgNDldLFxuXHRcdFx0YmdZZWxsb3c6IFs0MywgNDldLFxuXHRcdFx0YmdCbHVlOiBbNDQsIDQ5XSxcblx0XHRcdGJnTWFnZW50YTogWzQ1LCA0OV0sXG5cdFx0XHRiZ0N5YW46IFs0NiwgNDldLFxuXHRcdFx0YmdXaGl0ZTogWzQ3LCA0OV0sXG5cblx0XHRcdC8vIEJyaWdodCBjb2xvclxuXHRcdFx0YmdCbGFja0JyaWdodDogWzEwMCwgNDldLFxuXHRcdFx0YmdSZWRCcmlnaHQ6IFsxMDEsIDQ5XSxcblx0XHRcdGJnR3JlZW5CcmlnaHQ6IFsxMDIsIDQ5XSxcblx0XHRcdGJnWWVsbG93QnJpZ2h0OiBbMTAzLCA0OV0sXG5cdFx0XHRiZ0JsdWVCcmlnaHQ6IFsxMDQsIDQ5XSxcblx0XHRcdGJnTWFnZW50YUJyaWdodDogWzEwNSwgNDldLFxuXHRcdFx0YmdDeWFuQnJpZ2h0OiBbMTA2LCA0OV0sXG5cdFx0XHRiZ1doaXRlQnJpZ2h0OiBbMTA3LCA0OV1cblx0XHR9XG5cdH07XG5cblx0Ly8gQWxpYXMgYnJpZ2h0IGJsYWNrIGFzIGdyYXkgKGFuZCBncmV5KVxuXHRzdHlsZXMuY29sb3IuZ3JheSA9IHN0eWxlcy5jb2xvci5ibGFja0JyaWdodDtcblx0c3R5bGVzLmJnQ29sb3IuYmdHcmF5ID0gc3R5bGVzLmJnQ29sb3IuYmdCbGFja0JyaWdodDtcblx0c3R5bGVzLmNvbG9yLmdyZXkgPSBzdHlsZXMuY29sb3IuYmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5iZ0NvbG9yLmJnR3JleSA9IHN0eWxlcy5iZ0NvbG9yLmJnQmxhY2tCcmlnaHQ7XG5cblx0Zm9yIChjb25zdCBbZ3JvdXBOYW1lLCBncm91cF0gb2YgT2JqZWN0LmVudHJpZXMoc3R5bGVzKSkge1xuXHRcdGZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwKSkge1xuXHRcdFx0c3R5bGVzW3N0eWxlTmFtZV0gPSB7XG5cdFx0XHRcdG9wZW46IGBcXHUwMDFCWyR7c3R5bGVbMF19bWAsXG5cdFx0XHRcdGNsb3NlOiBgXFx1MDAxQlske3N0eWxlWzFdfW1gXG5cdFx0XHR9O1xuXG5cdFx0XHRncm91cFtzdHlsZU5hbWVdID0gc3R5bGVzW3N0eWxlTmFtZV07XG5cblx0XHRcdGNvZGVzLnNldChzdHlsZVswXSwgc3R5bGVbMV0pO1xuXHRcdH1cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsIGdyb3VwTmFtZSwge1xuXHRcdFx0dmFsdWU6IGdyb3VwLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2Vcblx0XHR9KTtcblx0fVxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsICdjb2RlcycsIHtcblx0XHR2YWx1ZTogY29kZXMsXG5cdFx0ZW51bWVyYWJsZTogZmFsc2Vcblx0fSk7XG5cblx0c3R5bGVzLmNvbG9yLmNsb3NlID0gJ1xcdTAwMUJbMzltJztcblx0c3R5bGVzLmJnQ29sb3IuY2xvc2UgPSAnXFx1MDAxQls0OW0nO1xuXG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuY29sb3IsICdhbnNpJywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kxNiwgJ2Fuc2kxNicsIGFuc2kyYW5zaSwgZmFsc2UpKTtcblx0c2V0TGF6eVByb3BlcnR5KHN0eWxlcy5jb2xvciwgJ2Fuc2kyNTYnLCAoKSA9PiBtYWtlRHluYW1pY1N0eWxlcyh3cmFwQW5zaTI1NiwgJ2Fuc2kyNTYnLCBhbnNpMmFuc2ksIGZhbHNlKSk7XG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuY29sb3IsICdhbnNpMTZtJywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kxNm0sICdyZ2InLCByZ2IycmdiLCBmYWxzZSkpO1xuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmJnQ29sb3IsICdhbnNpJywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kxNiwgJ2Fuc2kxNicsIGFuc2kyYW5zaSwgdHJ1ZSkpO1xuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmJnQ29sb3IsICdhbnNpMjU2JywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kyNTYsICdhbnNpMjU2JywgYW5zaTJhbnNpLCB0cnVlKSk7XG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuYmdDb2xvciwgJ2Fuc2kxNm0nLCAoKSA9PiBtYWtlRHluYW1pY1N0eWxlcyh3cmFwQW5zaTE2bSwgJ3JnYicsIHJnYjJyZ2IsIHRydWUpKTtcblxuXHRyZXR1cm4gc3R5bGVzO1xufVxuXG4vLyBNYWtlIHRoZSBleHBvcnQgaW1tdXRhYmxlXG5PYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAnZXhwb3J0cycsIHtcblx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0Z2V0OiBhc3NlbWJsZVN0eWxlc1xufSk7XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG52YXIgZXM3XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9lczdcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICBmb3JrLnVzZShlczdfMS5kZWZhdWx0KTtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBkZWZhdWx0cyA9IGZvcmsudXNlKHNoYXJlZF8xLmRlZmF1bHQpLmRlZmF1bHRzO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICB2YXIgb3IgPSB0eXBlcy5UeXBlLm9yO1xuICAgIGRlZihcIk5vb3BcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIkRvRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbZGVmKFwiU3RhdGVtZW50XCIpXSk7XG4gICAgZGVmKFwiU3VwZXJcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJCaW5kRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9iamVjdFwiLCBcImNhbGxlZVwiKVxuICAgICAgICAuZmllbGQoXCJvYmplY3RcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcImNhbGxlZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJEZWNvcmF0b3JcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25cIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiUHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwiZGVjb3JhdG9yc1wiLCBvcihbZGVmKFwiRGVjb3JhdG9yXCIpXSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiTWV0aG9kRGVmaW5pdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJkZWNvcmF0b3JzXCIsIG9yKFtkZWYoXCJEZWNvcmF0b3JcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJNZXRhUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJtZXRhXCIsIFwicHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwibWV0YVwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJwcm9wZXJ0eVwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKTtcbiAgICBkZWYoXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJJbXBvcnRTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTW9kdWxlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5idWlsZChcImltcG9ydGVkXCIsIFwibG9jYWxcIilcbiAgICAgICAgLmZpZWxkKFwiaW1wb3J0ZWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJNb2R1bGVTcGVjaWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwibG9jYWxcIik7XG4gICAgZGVmKFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJsb2NhbFwiKTtcbiAgICBkZWYoXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZGVjbGFyYXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyYXRpb25cIiwgb3IoZGVmKFwiRGVjbGFyYXRpb25cIiksIGRlZihcIkV4cHJlc3Npb25cIikpKTtcbiAgICBkZWYoXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImRlY2xhcmF0aW9uXCIsIFwic3BlY2lmaWVyc1wiLCBcInNvdXJjZVwiKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJhdGlvblwiLCBvcihkZWYoXCJEZWNsYXJhdGlvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInNwZWNpZmllcnNcIiwgW2RlZihcIkV4cG9ydFNwZWNpZmllclwiKV0sIGRlZmF1bHRzLmVtcHR5QXJyYXkpXG4gICAgICAgIC5maWVsZChcInNvdXJjZVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJFeHBvcnRTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTW9kdWxlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5idWlsZChcImxvY2FsXCIsIFwiZXhwb3J0ZWRcIilcbiAgICAgICAgLmZpZWxkKFwiZXhwb3J0ZWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIlNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJleHBvcnRlZFwiKVxuICAgICAgICAuZmllbGQoXCJleHBvcnRlZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKTtcbiAgICBkZWYoXCJFeHBvcnREZWZhdWx0U3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIlNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJleHBvcnRlZFwiKVxuICAgICAgICAuZmllbGQoXCJleHBvcnRlZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKTtcbiAgICBkZWYoXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJleHBvcnRlZFwiLCBcInNvdXJjZVwiKVxuICAgICAgICAuZmllbGQoXCJleHBvcnRlZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwic291cmNlXCIsIGRlZihcIkxpdGVyYWxcIikpO1xuICAgIGRlZihcIkNvbW1lbnRCbG9ja1wiKVxuICAgICAgICAuYmFzZXMoXCJDb21tZW50XCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIsIC8qb3B0aW9uYWw6Ki8gXCJsZWFkaW5nXCIsIFwidHJhaWxpbmdcIik7XG4gICAgZGVmKFwiQ29tbWVudExpbmVcIilcbiAgICAgICAgLmJhc2VzKFwiQ29tbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCAvKm9wdGlvbmFsOiovIFwibGVhZGluZ1wiLCBcInRyYWlsaW5nXCIpO1xuICAgIGRlZihcIkRpcmVjdGl2ZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIGRlZihcIkRpcmVjdGl2ZUxpdGVyYWxcIikpO1xuICAgIGRlZihcIkRpcmVjdGl2ZUxpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiLCBcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgU3RyaW5nLCBkZWZhdWx0c1tcInVzZSBzdHJpY3RcIl0pO1xuICAgIGRlZihcIkludGVycHJldGVyRGlyZWN0aXZlXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJCbG9ja1N0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIFtkZWYoXCJTdGF0ZW1lbnRcIildKVxuICAgICAgICAuZmllbGQoXCJkaXJlY3RpdmVzXCIsIFtkZWYoXCJEaXJlY3RpdmVcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KTtcbiAgICBkZWYoXCJQcm9ncmFtXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIFtkZWYoXCJTdGF0ZW1lbnRcIildKVxuICAgICAgICAuZmllbGQoXCJkaXJlY3RpdmVzXCIsIFtkZWYoXCJEaXJlY3RpdmVcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJpbnRlcnByZXRlclwiLCBvcihkZWYoXCJJbnRlcnByZXRlckRpcmVjdGl2ZVwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgLy8gU3BsaXQgTGl0ZXJhbFxuICAgIGRlZihcIlN0cmluZ0xpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiTGl0ZXJhbFwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBTdHJpbmcpO1xuICAgIGRlZihcIk51bWVyaWNMaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIkxpdGVyYWxcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgTnVtYmVyKVxuICAgICAgICAuZmllbGQoXCJyYXdcIiwgb3IoU3RyaW5nLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJleHRyYVwiLCB7XG4gICAgICAgIHJhd1ZhbHVlOiBOdW1iZXIsXG4gICAgICAgIHJhdzogU3RyaW5nXG4gICAgfSwgZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhd1ZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgICAgICAgcmF3OiB0aGlzLnZhbHVlICsgXCJcIlxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGRlZihcIkJpZ0ludExpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiTGl0ZXJhbFwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiKVxuICAgICAgICAvLyBPbmx5IFN0cmluZyByZWFsbHkgc2VlbXMgYXBwcm9wcmlhdGUgaGVyZSwgc2luY2UgQmlnSW50IHZhbHVlc1xuICAgICAgICAvLyBvZnRlbiBleGNlZWQgdGhlIGxpbWl0cyBvZiBKUyBudW1iZXJzLlxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBvcihTdHJpbmcsIE51bWJlcikpXG4gICAgICAgIC5maWVsZChcImV4dHJhXCIsIHtcbiAgICAgICAgcmF3VmFsdWU6IFN0cmluZyxcbiAgICAgICAgcmF3OiBTdHJpbmdcbiAgICB9LCBmdW5jdGlvbiBnZXREZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmF3VmFsdWU6IFN0cmluZyh0aGlzLnZhbHVlKSxcbiAgICAgICAgICAgIHJhdzogdGhpcy52YWx1ZSArIFwiblwiXG4gICAgICAgIH07XG4gICAgfSk7XG4gICAgZGVmKFwiTnVsbExpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiTGl0ZXJhbFwiKVxuICAgICAgICAuYnVpbGQoKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBudWxsLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkJvb2xlYW5MaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIkxpdGVyYWxcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgQm9vbGVhbik7XG4gICAgZGVmKFwiUmVnRXhwTGl0ZXJhbFwiKVxuICAgICAgICAuYmFzZXMoXCJMaXRlcmFsXCIpXG4gICAgICAgIC5idWlsZChcInBhdHRlcm5cIiwgXCJmbGFnc1wiKVxuICAgICAgICAuZmllbGQoXCJwYXR0ZXJuXCIsIFN0cmluZylcbiAgICAgICAgLmZpZWxkKFwiZmxhZ3NcIiwgU3RyaW5nKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBSZWdFeHAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodGhpcy5wYXR0ZXJuLCB0aGlzLmZsYWdzKTtcbiAgICB9KTtcbiAgICB2YXIgT2JqZWN0RXhwcmVzc2lvblByb3BlcnR5ID0gb3IoZGVmKFwiUHJvcGVydHlcIiksIGRlZihcIk9iamVjdE1ldGhvZFwiKSwgZGVmKFwiT2JqZWN0UHJvcGVydHlcIiksIGRlZihcIlNwcmVhZFByb3BlcnR5XCIpLCBkZWYoXCJTcHJlYWRFbGVtZW50XCIpKTtcbiAgICAvLyBTcGxpdCBQcm9wZXJ0eSAtPiBPYmplY3RQcm9wZXJ0eSBhbmQgT2JqZWN0TWV0aG9kXG4gICAgZGVmKFwiT2JqZWN0RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInByb3BlcnRpZXNcIilcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydGllc1wiLCBbT2JqZWN0RXhwcmVzc2lvblByb3BlcnR5XSk7XG4gICAgLy8gT2JqZWN0TWV0aG9kIGhvaXN0IC52YWx1ZSBwcm9wZXJ0aWVzIHRvIG93biBwcm9wZXJ0aWVzXG4gICAgZGVmKFwiT2JqZWN0TWV0aG9kXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIiwgXCJGdW5jdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJraW5kXCIsIFwia2V5XCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcImNvbXB1dGVkXCIpXG4gICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJtZXRob2RcIiwgXCJnZXRcIiwgXCJzZXRcIikpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJQYXR0ZXJuXCIpXSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJCbG9ja1N0YXRlbWVudFwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiZ2VuZXJhdG9yXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImFzeW5jXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImFjY2Vzc2liaWxpdHlcIiwgLy8gVHlwZVNjcmlwdFxuICAgIG9yKGRlZihcIkxpdGVyYWxcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcImRlY29yYXRvcnNcIiwgb3IoW2RlZihcIkRlY29yYXRvclwiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIk9iamVjdFByb3BlcnR5XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIsIFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIkV4cHJlc3Npb25cIikpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBkZWYoXCJQYXR0ZXJuXCIpKSlcbiAgICAgICAgLmZpZWxkKFwiYWNjZXNzaWJpbGl0eVwiLCAvLyBUeXBlU2NyaXB0XG4gICAgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgdmFyIENsYXNzQm9keUVsZW1lbnQgPSBvcihkZWYoXCJNZXRob2REZWZpbml0aW9uXCIpLCBkZWYoXCJWYXJpYWJsZURlY2xhcmF0b3JcIiksIGRlZihcIkNsYXNzUHJvcGVydHlEZWZpbml0aW9uXCIpLCBkZWYoXCJDbGFzc1Byb3BlcnR5XCIpLCBkZWYoXCJDbGFzc1ByaXZhdGVQcm9wZXJ0eVwiKSwgZGVmKFwiQ2xhc3NNZXRob2RcIiksIGRlZihcIkNsYXNzUHJpdmF0ZU1ldGhvZFwiKSk7XG4gICAgLy8gTWV0aG9kRGVmaW5pdGlvbiAtPiBDbGFzc01ldGhvZFxuICAgIGRlZihcIkNsYXNzQm9keVwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgW0NsYXNzQm9keUVsZW1lbnRdKTtcbiAgICBkZWYoXCJDbGFzc01ldGhvZFwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiLCBcIkZ1bmN0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImtpbmRcIiwgXCJrZXlcIiwgXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwiY29tcHV0ZWRcIiwgXCJzdGF0aWNcIilcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIkV4cHJlc3Npb25cIikpKTtcbiAgICBkZWYoXCJDbGFzc1ByaXZhdGVNZXRob2RcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJGdW5jdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJrZXlcIiwgXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwia2luZFwiLCBcImNvbXB1dGVkXCIsIFwic3RhdGljXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBkZWYoXCJQcml2YXRlTmFtZVwiKSk7XG4gICAgW1wiQ2xhc3NNZXRob2RcIixcbiAgICAgICAgXCJDbGFzc1ByaXZhdGVNZXRob2RcIixcbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKHR5cGVOYW1lKSB7XG4gICAgICAgIGRlZih0eXBlTmFtZSlcbiAgICAgICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJnZXRcIiwgXCJzZXRcIiwgXCJtZXRob2RcIiwgXCJjb25zdHJ1Y3RvclwiKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJtZXRob2RcIjsgfSlcbiAgICAgICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIikpXG4gICAgICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwic3RhdGljXCIsIG9yKEJvb2xlYW4sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgICAgICAuZmllbGQoXCJhYnN0cmFjdFwiLCBvcihCb29sZWFuLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwiYWNjZXNzXCIsIG9yKFwicHVibGljXCIsIFwicHJpdmF0ZVwiLCBcInByb3RlY3RlZFwiLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwiYWNjZXNzaWJpbGl0eVwiLCBvcihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgICAgIC5maWVsZChcImRlY29yYXRvcnNcIiwgb3IoW2RlZihcIkRlY29yYXRvclwiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBvcihCb29sZWFuLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICB9KTtcbiAgICBkZWYoXCJDbGFzc1ByaXZhdGVQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJDbGFzc1Byb3BlcnR5XCIpXG4gICAgICAgIC5idWlsZChcImtleVwiLCBcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBkZWYoXCJQcml2YXRlTmFtZVwiKSlcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiUHJpdmF0ZU5hbWVcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiLCBcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgdmFyIE9iamVjdFBhdHRlcm5Qcm9wZXJ0eSA9IG9yKGRlZihcIlByb3BlcnR5XCIpLCBkZWYoXCJQcm9wZXJ0eVBhdHRlcm5cIiksIGRlZihcIlNwcmVhZFByb3BlcnR5UGF0dGVyblwiKSwgZGVmKFwiU3ByZWFkUHJvcGVydHlcIiksIC8vIFVzZWQgYnkgRXNwcmltYVxuICAgIGRlZihcIk9iamVjdFByb3BlcnR5XCIpLCAvLyBCYWJlbCA2XG4gICAgZGVmKFwiUmVzdFByb3BlcnR5XCIpIC8vIEJhYmVsIDZcbiAgICApO1xuICAgIC8vIFNwbGl0IGludG8gUmVzdFByb3BlcnR5IGFuZCBTcHJlYWRQcm9wZXJ0eVxuICAgIGRlZihcIk9iamVjdFBhdHRlcm5cIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJwcm9wZXJ0aWVzXCIpXG4gICAgICAgIC5maWVsZChcInByb3BlcnRpZXNcIiwgW09iamVjdFBhdHRlcm5Qcm9wZXJ0eV0pXG4gICAgICAgIC5maWVsZChcImRlY29yYXRvcnNcIiwgb3IoW2RlZihcIkRlY29yYXRvclwiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlNwcmVhZFByb3BlcnR5XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYXJndW1lbnRcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiUmVzdFByb3BlcnR5XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYXJndW1lbnRcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiRm9yQXdhaXRTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImxlZnRcIiwgXCJyaWdodFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwibGVmdFwiLCBvcihkZWYoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIC8vIFRoZSBjYWxsZWUgbm9kZSBvZiBhIGR5bmFtaWMgaW1wb3J0KC4uLikgZXhwcmVzc2lvbi5cbiAgICBkZWYoXCJJbXBvcnRcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciBiYWJlbF9jb3JlXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9iYWJlbC1jb3JlXCIpKTtcbnZhciBmbG93XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9mbG93XCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoYmFiZWxfY29yZV8xLmRlZmF1bHQpO1xuICAgIGZvcmsudXNlKGZsb3dfMS5kZWZhdWx0KTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIFR5cGUgPSB0eXBlcy5UeXBlO1xuICAgIHZhciBkZWYgPSBUeXBlLmRlZjtcbiAgICB2YXIgb3IgPSBUeXBlLm9yO1xuICAgIHZhciBzaGFyZWQgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmYXVsdHMgPSBzaGFyZWQuZGVmYXVsdHM7XG4gICAgdmFyIGdlcSA9IHNoYXJlZC5nZXE7XG4gICAgLy8gQWJzdHJhY3Qgc3VwZXJ0eXBlIG9mIGFsbCBzeW50YWN0aWMgZW50aXRpZXMgdGhhdCBhcmUgYWxsb3dlZCB0byBoYXZlIGFcbiAgICAvLyAubG9jIGZpZWxkLlxuICAgIGRlZihcIlByaW50YWJsZVwiKVxuICAgICAgICAuZmllbGQoXCJsb2NcIiwgb3IoZGVmKFwiU291cmNlTG9jYXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0sIHRydWUpO1xuICAgIGRlZihcIk5vZGVcIilcbiAgICAgICAgLmJhc2VzKFwiUHJpbnRhYmxlXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVcIiwgU3RyaW5nKVxuICAgICAgICAuZmllbGQoXCJjb21tZW50c1wiLCBvcihbZGVmKFwiQ29tbWVudFwiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0sIHRydWUpO1xuICAgIGRlZihcIlNvdXJjZUxvY2F0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInN0YXJ0XCIsIGRlZihcIlBvc2l0aW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJlbmRcIiwgZGVmKFwiUG9zaXRpb25cIikpXG4gICAgICAgIC5maWVsZChcInNvdXJjZVwiLCBvcihTdHJpbmcsIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlBvc2l0aW9uXCIpXG4gICAgICAgIC5maWVsZChcImxpbmVcIiwgZ2VxKDEpKVxuICAgICAgICAuZmllbGQoXCJjb2x1bW5cIiwgZ2VxKDApKTtcbiAgICBkZWYoXCJGaWxlXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwicHJvZ3JhbVwiLCBcIm5hbWVcIilcbiAgICAgICAgLmZpZWxkKFwicHJvZ3JhbVwiLCBkZWYoXCJQcm9ncmFtXCIpKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIG9yKFN0cmluZywgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiUHJvZ3JhbVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbZGVmKFwiU3RhdGVtZW50XCIpXSk7XG4gICAgZGVmKFwiRnVuY3Rpb25cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIlBhdHRlcm5cIildKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkJsb2NrU3RhdGVtZW50XCIpKVxuICAgICAgICAuZmllbGQoXCJnZW5lcmF0b3JcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiYXN5bmNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiU3RhdGVtZW50XCIpLmJhc2VzKFwiTm9kZVwiKTtcbiAgICAvLyBUaGUgZW1wdHkgLmJ1aWxkKCkgaGVyZSBtZWFucyB0aGF0IGFuIEVtcHR5U3RhdGVtZW50IGNhbiBiZSBjb25zdHJ1Y3RlZFxuICAgIC8vIChpLmUuIGl0J3Mgbm90IGFic3RyYWN0KSBidXQgdGhhdCBpdCBuZWVkcyBubyBhcmd1bWVudHMuXG4gICAgZGVmKFwiRW1wdHlTdGF0ZW1lbnRcIikuYmFzZXMoXCJTdGF0ZW1lbnRcIikuYnVpbGQoKTtcbiAgICBkZWYoXCJCbG9ja1N0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIFtkZWYoXCJTdGF0ZW1lbnRcIildKTtcbiAgICAvLyBUT0RPIEZpZ3VyZSBvdXQgaG93IHRvIHNpbGVudGx5IGNvZXJjZSBFeHByZXNzaW9ucyB0b1xuICAgIC8vIEV4cHJlc3Npb25TdGF0ZW1lbnRzIHdoZXJlIGEgU3RhdGVtZW50IHdhcyBleHBlY3RlZC5cbiAgICBkZWYoXCJFeHByZXNzaW9uU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25cIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiSWZTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcInRlc3RcIiwgXCJjb25zZXF1ZW50XCIsIFwiYWx0ZXJuYXRlXCIpXG4gICAgICAgIC5maWVsZChcInRlc3RcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29uc2VxdWVudFwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpXG4gICAgICAgIC5maWVsZChcImFsdGVybmF0ZVwiLCBvcihkZWYoXCJTdGF0ZW1lbnRcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkxhYmVsZWRTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImxhYmVsXCIsIFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJsYWJlbFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIlN0YXRlbWVudFwiKSk7XG4gICAgZGVmKFwiQnJlYWtTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImxhYmVsXCIpXG4gICAgICAgIC5maWVsZChcImxhYmVsXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkNvbnRpbnVlU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJsYWJlbFwiKVxuICAgICAgICAuZmllbGQoXCJsYWJlbFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJXaXRoU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJvYmplY3RcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcIm9iamVjdFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIlN0YXRlbWVudFwiKSk7XG4gICAgZGVmKFwiU3dpdGNoU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJkaXNjcmltaW5hbnRcIiwgXCJjYXNlc1wiLCBcImxleGljYWxcIilcbiAgICAgICAgLmZpZWxkKFwiZGlzY3JpbWluYW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImNhc2VzXCIsIFtkZWYoXCJTd2l0Y2hDYXNlXCIpXSlcbiAgICAgICAgLmZpZWxkKFwibGV4aWNhbFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJSZXR1cm5TdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKTtcbiAgICBkZWYoXCJUaHJvd1N0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiYXJndW1lbnRcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiVHJ5U3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJibG9ja1wiLCBcImhhbmRsZXJcIiwgXCJmaW5hbGl6ZXJcIilcbiAgICAgICAgLmZpZWxkKFwiYmxvY2tcIiwgZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIikpXG4gICAgICAgIC5maWVsZChcImhhbmRsZXJcIiwgb3IoZGVmKFwiQ2F0Y2hDbGF1c2VcIiksIG51bGwpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzICYmIHRoaXMuaGFuZGxlcnNbMF0gfHwgbnVsbDtcbiAgICB9KVxuICAgICAgICAuZmllbGQoXCJoYW5kbGVyc1wiLCBbZGVmKFwiQ2F0Y2hDbGF1c2VcIildLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIgPyBbdGhpcy5oYW5kbGVyXSA6IFtdO1xuICAgIH0sIHRydWUpIC8vIEluZGljYXRlcyB0aGlzIGZpZWxkIGlzIGhpZGRlbiBmcm9tIGVhY2hGaWVsZCBpdGVyYXRpb24uXG4gICAgICAgIC5maWVsZChcImd1YXJkZWRIYW5kbGVyc1wiLCBbZGVmKFwiQ2F0Y2hDbGF1c2VcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJmaW5hbGl6ZXJcIiwgb3IoZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkNhdGNoQ2xhdXNlXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwicGFyYW1cIiwgXCJndWFyZFwiLCBcImJvZHlcIilcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb3B0aW9uYWwtY2F0Y2gtYmluZGluZ1xuICAgICAgICAuZmllbGQoXCJwYXJhbVwiLCBvcihkZWYoXCJQYXR0ZXJuXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJndWFyZFwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkJsb2NrU3RhdGVtZW50XCIpKTtcbiAgICBkZWYoXCJXaGlsZVN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwidGVzdFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwidGVzdFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIlN0YXRlbWVudFwiKSk7XG4gICAgZGVmKFwiRG9XaGlsZVN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiLCBcInRlc3RcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpXG4gICAgICAgIC5maWVsZChcInRlc3RcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiRm9yU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJpbml0XCIsIFwidGVzdFwiLCBcInVwZGF0ZVwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiaW5pdFwiLCBvcihkZWYoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwidGVzdFwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwidXBkYXRlXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIlN0YXRlbWVudFwiKSk7XG4gICAgZGVmKFwiRm9ySW5TdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImxlZnRcIiwgXCJyaWdodFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwibGVmdFwiLCBvcihkZWYoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIGRlZihcIkRlYnVnZ2VyU3RhdGVtZW50XCIpLmJhc2VzKFwiU3RhdGVtZW50XCIpLmJ1aWxkKCk7XG4gICAgZGVmKFwiRGVjbGFyYXRpb25cIikuYmFzZXMoXCJTdGF0ZW1lbnRcIik7XG4gICAgZGVmKFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGdW5jdGlvblwiLCBcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwicGFyYW1zXCIsIFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKTtcbiAgICBkZWYoXCJGdW5jdGlvbkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRnVuY3Rpb25cIiwgXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwicGFyYW1zXCIsIFwiYm9keVwiKTtcbiAgICBkZWYoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImtpbmRcIiwgXCJkZWNsYXJhdGlvbnNcIilcbiAgICAgICAgLmZpZWxkKFwia2luZFwiLCBvcihcInZhclwiLCBcImxldFwiLCBcImNvbnN0XCIpKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJhdGlvbnNcIiwgW2RlZihcIlZhcmlhYmxlRGVjbGFyYXRvclwiKV0pO1xuICAgIGRlZihcIlZhcmlhYmxlRGVjbGFyYXRvclwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwiaW5pdFwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJQYXR0ZXJuXCIpKVxuICAgICAgICAuZmllbGQoXCJpbml0XCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkV4cHJlc3Npb25cIikuYmFzZXMoXCJOb2RlXCIpO1xuICAgIGRlZihcIlRoaXNFeHByZXNzaW9uXCIpLmJhc2VzKFwiRXhwcmVzc2lvblwiKS5idWlsZCgpO1xuICAgIGRlZihcIkFycmF5RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImVsZW1lbnRzXCIpXG4gICAgICAgIC5maWVsZChcImVsZW1lbnRzXCIsIFtvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKV0pO1xuICAgIGRlZihcIk9iamVjdEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJwcm9wZXJ0aWVzXCIpXG4gICAgICAgIC5maWVsZChcInByb3BlcnRpZXNcIiwgW2RlZihcIlByb3BlcnR5XCIpXSk7XG4gICAgLy8gVE9ETyBOb3QgaW4gdGhlIE1vemlsbGEgUGFyc2VyIEFQSSwgYnV0IHVzZWQgYnkgRXNwcmltYS5cbiAgICBkZWYoXCJQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpIC8vIFdhbnQgdG8gYmUgYWJsZSB0byB2aXNpdCBQcm9wZXJ0eSBOb2Rlcy5cbiAgICAgICAgLmJ1aWxkKFwia2luZFwiLCBcImtleVwiLCBcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJpbml0XCIsIFwiZ2V0XCIsIFwic2V0XCIpKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgZGVmKFwiSWRlbnRpZmllclwiKSkpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIlNlcXVlbmNlRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25zXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25zXCIsIFtkZWYoXCJFeHByZXNzaW9uXCIpXSk7XG4gICAgdmFyIFVuYXJ5T3BlcmF0b3IgPSBvcihcIi1cIiwgXCIrXCIsIFwiIVwiLCBcIn5cIiwgXCJ0eXBlb2ZcIiwgXCJ2b2lkXCIsIFwiZGVsZXRlXCIpO1xuICAgIGRlZihcIlVuYXJ5RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9wZXJhdG9yXCIsIFwiYXJndW1lbnRcIiwgXCJwcmVmaXhcIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgVW5hcnlPcGVyYXRvcilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLy8gRXNwcmltYSBkb2Vzbid0IGJvdGhlciB3aXRoIHRoaXMgZmllbGQsIHByZXN1bWFibHkgYmVjYXVzZSBpdCdzXG4gICAgICAgIC8vIGFsd2F5cyB0cnVlIGZvciB1bmFyeSBvcGVyYXRvcnMuXG4gICAgICAgIC5maWVsZChcInByZWZpeFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcInRydWVcIl0pO1xuICAgIHZhciBCaW5hcnlPcGVyYXRvciA9IG9yKFwiPT1cIiwgXCIhPVwiLCBcIj09PVwiLCBcIiE9PVwiLCBcIjxcIiwgXCI8PVwiLCBcIj5cIiwgXCI+PVwiLCBcIjw8XCIsIFwiPj5cIiwgXCI+Pj5cIiwgXCIrXCIsIFwiLVwiLCBcIipcIiwgXCIvXCIsIFwiJVwiLCBcIioqXCIsIFwiJlwiLCAvLyBUT0RPIE1pc3NpbmcgZnJvbSB0aGUgUGFyc2VyIEFQSS5cbiAgICBcInxcIiwgXCJeXCIsIFwiaW5cIiwgXCJpbnN0YW5jZW9mXCIpO1xuICAgIGRlZihcIkJpbmFyeUV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvcGVyYXRvclwiLCBcImxlZnRcIiwgXCJyaWdodFwiKVxuICAgICAgICAuZmllbGQoXCJvcGVyYXRvclwiLCBCaW5hcnlPcGVyYXRvcilcbiAgICAgICAgLmZpZWxkKFwibGVmdFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJyaWdodFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICB2YXIgQXNzaWdubWVudE9wZXJhdG9yID0gb3IoXCI9XCIsIFwiKz1cIiwgXCItPVwiLCBcIio9XCIsIFwiLz1cIiwgXCIlPVwiLCBcIjw8PVwiLCBcIj4+PVwiLCBcIj4+Pj1cIiwgXCJ8PVwiLCBcIl49XCIsIFwiJj1cIik7XG4gICAgZGVmKFwiQXNzaWdubWVudEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvcGVyYXRvclwiLCBcImxlZnRcIiwgXCJyaWdodFwiKVxuICAgICAgICAuZmllbGQoXCJvcGVyYXRvclwiLCBBc3NpZ25tZW50T3BlcmF0b3IpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgb3IoZGVmKFwiUGF0dGVyblwiKSwgZGVmKFwiTWVtYmVyRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInJpZ2h0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIHZhciBVcGRhdGVPcGVyYXRvciA9IG9yKFwiKytcIiwgXCItLVwiKTtcbiAgICBkZWYoXCJVcGRhdGVFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwib3BlcmF0b3JcIiwgXCJhcmd1bWVudFwiLCBcInByZWZpeFwiKVxuICAgICAgICAuZmllbGQoXCJvcGVyYXRvclwiLCBVcGRhdGVPcGVyYXRvcilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwicHJlZml4XCIsIEJvb2xlYW4pO1xuICAgIHZhciBMb2dpY2FsT3BlcmF0b3IgPSBvcihcInx8XCIsIFwiJiZcIik7XG4gICAgZGVmKFwiTG9naWNhbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvcGVyYXRvclwiLCBcImxlZnRcIiwgXCJyaWdodFwiKVxuICAgICAgICAuZmllbGQoXCJvcGVyYXRvclwiLCBMb2dpY2FsT3BlcmF0b3IpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwidGVzdFwiLCBcImNvbnNlcXVlbnRcIiwgXCJhbHRlcm5hdGVcIilcbiAgICAgICAgLmZpZWxkKFwidGVzdFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJjb25zZXF1ZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImFsdGVybmF0ZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJOZXdFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiY2FsbGVlXCIsIFwiYXJndW1lbnRzXCIpXG4gICAgICAgIC5maWVsZChcImNhbGxlZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAvLyBUaGUgTW96aWxsYSBQYXJzZXIgQVBJIGdpdmVzIHRoaXMgdHlwZSBhcyBbb3IoZGVmKFwiRXhwcmVzc2lvblwiKSxcbiAgICAgICAgLy8gbnVsbCldLCBidXQgbnVsbCB2YWx1ZXMgZG9uJ3QgcmVhbGx5IG1ha2Ugc2Vuc2UgYXQgdGhlIGNhbGwgc2l0ZS5cbiAgICAgICAgLy8gVE9ETyBSZXBvcnQgdGhpcyBub25zZW5zZS5cbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRzXCIsIFtkZWYoXCJFeHByZXNzaW9uXCIpXSk7XG4gICAgZGVmKFwiQ2FsbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJjYWxsZWVcIiwgXCJhcmd1bWVudHNcIilcbiAgICAgICAgLmZpZWxkKFwiY2FsbGVlXCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC8vIFNlZSBjb21tZW50IGZvciBOZXdFeHByZXNzaW9uIGFib3ZlLlxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudHNcIiwgW2RlZihcIkV4cHJlc3Npb25cIildKTtcbiAgICBkZWYoXCJNZW1iZXJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwib2JqZWN0XCIsIFwicHJvcGVydHlcIiwgXCJjb21wdXRlZFwiKVxuICAgICAgICAuZmllbGQoXCJvYmplY3RcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydHlcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB0aGlzLnByb3BlcnR5LnR5cGU7XG4gICAgICAgIGlmICh0eXBlID09PSAnTGl0ZXJhbCcgfHxcbiAgICAgICAgICAgIHR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJyB8fFxuICAgICAgICAgICAgdHlwZSA9PT0gJ0JpbmFyeUV4cHJlc3Npb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgZGVmKFwiUGF0dGVyblwiKS5iYXNlcyhcIk5vZGVcIik7XG4gICAgZGVmKFwiU3dpdGNoQ2FzZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInRlc3RcIiwgXCJjb25zZXF1ZW50XCIpXG4gICAgICAgIC5maWVsZChcInRlc3RcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcImNvbnNlcXVlbnRcIiwgW2RlZihcIlN0YXRlbWVudFwiKV0pO1xuICAgIGRlZihcIklkZW50aWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiLCBcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwibmFtZVwiKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIFN0cmluZylcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiTGl0ZXJhbFwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIG9yKFN0cmluZywgQm9vbGVhbiwgbnVsbCwgTnVtYmVyLCBSZWdFeHApKVxuICAgICAgICAuZmllbGQoXCJyZWdleFwiLCBvcih7XG4gICAgICAgIHBhdHRlcm46IFN0cmluZyxcbiAgICAgICAgZmxhZ3M6IFN0cmluZ1xuICAgIH0sIG51bGwpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgICB2YXIgZmxhZ3MgPSBcIlwiO1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUuaWdub3JlQ2FzZSlcbiAgICAgICAgICAgICAgICBmbGFncyArPSBcImlcIjtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLm11bHRpbGluZSlcbiAgICAgICAgICAgICAgICBmbGFncyArPSBcIm1cIjtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLmdsb2JhbClcbiAgICAgICAgICAgICAgICBmbGFncyArPSBcImdcIjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGF0dGVybjogdGhpcy52YWx1ZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IGZsYWdzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICAgIC8vIEFic3RyYWN0IChub24tYnVpbGRhYmxlKSBjb21tZW50IHN1cGVydHlwZS4gTm90IGEgTm9kZS5cbiAgICBkZWYoXCJDb21tZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlByaW50YWJsZVwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBTdHJpbmcpXG4gICAgICAgIC8vIEEgLmxlYWRpbmcgY29tbWVudCBjb21lcyBiZWZvcmUgdGhlIG5vZGUsIHdoZXJlYXMgYSAudHJhaWxpbmdcbiAgICAgICAgLy8gY29tbWVudCBjb21lcyBhZnRlciBpdC4gVGhlc2UgdHdvIGZpZWxkcyBzaG91bGQgbm90IGJvdGggYmUgdHJ1ZSxcbiAgICAgICAgLy8gYnV0IHRoZXkgbWlnaHQgYm90aCBiZSBmYWxzZSB3aGVuIHRoZSBjb21tZW50IGZhbGxzIGluc2lkZSBhIG5vZGVcbiAgICAgICAgLy8gYW5kIHRoZSBub2RlIGhhcyBubyBjaGlsZHJlbiBmb3IgdGhlIGNvbW1lbnQgdG8gbGVhZCBvciB0cmFpbCxcbiAgICAgICAgLy8gZS5nLiB7IC8qZGFuZ2xpbmcqLyB9LlxuICAgICAgICAuZmllbGQoXCJsZWFkaW5nXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1widHJ1ZVwiXSlcbiAgICAgICAgLmZpZWxkKFwidHJhaWxpbmdcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xudmFyIHNoYXJlZF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi9zaGFyZWRcIikpO1xudmFyIGNvcmVfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICBmb3JrLnVzZShjb3JlXzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgVHlwZSA9IHR5cGVzLlR5cGU7XG4gICAgdmFyIGRlZiA9IHR5cGVzLlR5cGUuZGVmO1xuICAgIHZhciBvciA9IFR5cGUub3I7XG4gICAgdmFyIHNoYXJlZCA9IGZvcmsudXNlKHNoYXJlZF8xLmRlZmF1bHQpO1xuICAgIHZhciBkZWZhdWx0cyA9IHNoYXJlZC5kZWZhdWx0cztcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vcHRpb25hbC1jaGFpbmluZ1xuICAgIC8vIGBhPy5iYCBhcyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2VzdHJlZS9lc3RyZWUvaXNzdWVzLzE0NlxuICAgIGRlZihcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJNZW1iZXJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9iamVjdFwiLCBcInByb3BlcnR5XCIsIFwiY29tcHV0ZWRcIiwgXCJvcHRpb25hbFwiKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcInRydWVcIl0pO1xuICAgIC8vIGE/LmIoKVxuICAgIGRlZihcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiQ2FsbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiY2FsbGVlXCIsIFwiYXJndW1lbnRzXCIsIFwib3B0aW9uYWxcIilcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJ0cnVlXCJdKTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICAvLyBgYSA/PyBiYCBhcyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYnlsb24vcHVsbC83NjEvZmlsZXNcbiAgICB2YXIgTG9naWNhbE9wZXJhdG9yID0gb3IoXCJ8fFwiLCBcIiYmXCIsIFwiPz9cIik7XG4gICAgZGVmKFwiTG9naWNhbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgTG9naWNhbE9wZXJhdG9yKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciBlczdfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2VzN1wiKSk7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICBmb3JrLnVzZShlczdfMS5kZWZhdWx0KTtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICBkZWYoXCJJbXBvcnRFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwic291cmNlXCIpXG4gICAgICAgIC5maWVsZChcInNvdXJjZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciBjb3JlXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9jb3JlXCIpKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIGZvcmsudXNlKGNvcmVfMS5kZWZhdWx0KTtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICB2YXIgb3IgPSB0eXBlcy5UeXBlLm9yO1xuICAgIHZhciBkZWZhdWx0cyA9IGZvcmsudXNlKHNoYXJlZF8xLmRlZmF1bHQpLmRlZmF1bHRzO1xuICAgIGRlZihcIkZ1bmN0aW9uXCIpXG4gICAgICAgIC5maWVsZChcImdlbmVyYXRvclwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImRlZmF1bHRzXCIsIFtvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKV0sIGRlZmF1bHRzLmVtcHR5QXJyYXkpXG4gICAgICAgIC8vIFRPRE8gVGhpcyBjb3VsZCBiZSByZXByZXNlbnRlZCBhcyBhIFJlc3RFbGVtZW50IGluIC5wYXJhbXMuXG4gICAgICAgIC5maWVsZChcInJlc3RcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgLy8gVGhlIEVTVHJlZSB3YXkgb2YgcmVwcmVzZW50aW5nIGEgLi4ucmVzdCBwYXJhbWV0ZXIuXG4gICAgZGVmKFwiUmVzdEVsZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJQYXR0ZXJuXCIpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCAvLyBmb3IgQmFieWxvbi4gRmxvdyBwYXJzZXIgcHV0cyBpdCBvbiB0aGUgaWRlbnRpZmllclxuICAgIG9yKGRlZihcIlR5cGVBbm5vdGF0aW9uXCIpLCBkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJTcHJlYWRFbGVtZW50UGF0dGVyblwiKVxuICAgICAgICAuYmFzZXMoXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIlBhdHRlcm5cIikpO1xuICAgIGRlZihcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwiZ2VuZXJhdG9yXCIsIFwiZXhwcmVzc2lvblwiKTtcbiAgICBkZWYoXCJGdW5jdGlvbkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwiZ2VuZXJhdG9yXCIsIFwiZXhwcmVzc2lvblwiKTtcbiAgICAvLyBUaGUgUGFyc2VyIEFQSSBjYWxscyB0aGlzIEFycm93RXhwcmVzc2lvbiwgYnV0IEVzcHJpbWEgYW5kIGFsbCBvdGhlclxuICAgIC8vIGFjdHVhbCBwYXJzZXJzIHVzZSBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbi5cbiAgICBkZWYoXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJGdW5jdGlvblwiLCBcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwicGFyYW1zXCIsIFwiYm9keVwiLCBcImV4cHJlc3Npb25cIilcbiAgICAgICAgLy8gVGhlIGZvcmNlZCBudWxsIHZhbHVlIGhlcmUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvdmVycmlkZGVuXG4gICAgICAgIC8vIGRlZmluaXRpb24gb2YgdGhlIFwiaWRcIiBmaWVsZCBpbiB0aGUgRnVuY3Rpb24gaW50ZXJmYWNlLlxuICAgICAgICAuZmllbGQoXCJpZFwiLCBudWxsLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC8vIEFycm93IGZ1bmN0aW9uIGJvZGllcyBhcmUgYWxsb3dlZCB0byBiZSBleHByZXNzaW9ucy5cbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBvcihkZWYoXCJCbG9ja1N0YXRlbWVudFwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC8vIFRoZSBjdXJyZW50IHNwZWMgZm9yYmlkcyBhcnJvdyBnZW5lcmF0b3JzLCBzbyBJIGhhdmUgdGFrZW4gdGhlXG4gICAgICAgIC8vIGxpYmVydHkgb2YgZW5mb3JjaW5nIHRoYXQuIFRPRE8gUmVwb3J0IHRoaXMuXG4gICAgICAgIC5maWVsZChcImdlbmVyYXRvclwiLCBmYWxzZSwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiRm9yT2ZTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImxlZnRcIiwgXCJyaWdodFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwibGVmdFwiLCBvcihkZWYoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpLCBkZWYoXCJQYXR0ZXJuXCIpKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIGRlZihcIllpZWxkRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIsIFwiZGVsZWdhdGVcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcImRlbGVnYXRlXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIkdlbmVyYXRvckV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJib2R5XCIsIFwiYmxvY2tzXCIsIFwiZmlsdGVyXCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiYmxvY2tzXCIsIFtkZWYoXCJDb21wcmVoZW5zaW9uQmxvY2tcIildKVxuICAgICAgICAuZmllbGQoXCJmaWx0ZXJcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpO1xuICAgIGRlZihcIkNvbXByZWhlbnNpb25FeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiLCBcImJsb2Nrc1wiLCBcImZpbHRlclwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImJsb2Nrc1wiLCBbZGVmKFwiQ29tcHJlaGVuc2lvbkJsb2NrXCIpXSlcbiAgICAgICAgLmZpZWxkKFwiZmlsdGVyXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKTtcbiAgICBkZWYoXCJDb21wcmVoZW5zaW9uQmxvY2tcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJlYWNoXCIpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgZGVmKFwiUGF0dGVyblwiKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiZWFjaFwiLCBCb29sZWFuKTtcbiAgICBkZWYoXCJQcm9wZXJ0eVwiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIGRlZihcIlBhdHRlcm5cIikpKVxuICAgICAgICAuZmllbGQoXCJtZXRob2RcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwic2hvcnRoYW5kXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIk9iamVjdFByb3BlcnR5XCIpXG4gICAgICAgIC5maWVsZChcInNob3J0aGFuZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJQcm9wZXJ0eVBhdHRlcm5cIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJrZXlcIiwgXCJwYXR0ZXJuXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwicGF0dGVyblwiLCBkZWYoXCJQYXR0ZXJuXCIpKVxuICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJPYmplY3RQYXR0ZXJuXCIpXG4gICAgICAgIC5iYXNlcyhcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwicHJvcGVydGllc1wiKVxuICAgICAgICAuZmllbGQoXCJwcm9wZXJ0aWVzXCIsIFtvcihkZWYoXCJQcm9wZXJ0eVBhdHRlcm5cIiksIGRlZihcIlByb3BlcnR5XCIpKV0pO1xuICAgIGRlZihcIkFycmF5UGF0dGVyblwiKVxuICAgICAgICAuYmFzZXMoXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcImVsZW1lbnRzXCIpXG4gICAgICAgIC5maWVsZChcImVsZW1lbnRzXCIsIFtvcihkZWYoXCJQYXR0ZXJuXCIpLCBudWxsKV0pO1xuICAgIGRlZihcIk1ldGhvZERlZmluaXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwia2luZFwiLCBcImtleVwiLCBcInZhbHVlXCIsIFwic3RhdGljXCIpXG4gICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJjb25zdHJ1Y3RvclwiLCBcIm1ldGhvZFwiLCBcImdldFwiLCBcInNldFwiKSlcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIGRlZihcIkZ1bmN0aW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJzdGF0aWNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiU3ByZWFkRWxlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIkFycmF5RXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJlbGVtZW50c1wiLCBbb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgZGVmKFwiU3ByZWFkRWxlbWVudFwiKSwgZGVmKFwiUmVzdEVsZW1lbnRcIiksIG51bGwpXSk7XG4gICAgZGVmKFwiTmV3RXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudHNcIiwgW29yKGRlZihcIkV4cHJlc3Npb25cIiksIGRlZihcIlNwcmVhZEVsZW1lbnRcIikpXSk7XG4gICAgZGVmKFwiQ2FsbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRzXCIsIFtvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBkZWYoXCJTcHJlYWRFbGVtZW50XCIpKV0pO1xuICAgIC8vIE5vdGU6IHRoaXMgbm9kZSB0eXBlIGlzICpub3QqIGFuIEFzc2lnbm1lbnRFeHByZXNzaW9uIHdpdGggYSBQYXR0ZXJuIG9uXG4gICAgLy8gdGhlIGxlZnQtaGFuZCBzaWRlISBUaGUgZXhpc3RpbmcgQXNzaWdubWVudEV4cHJlc3Npb24gdHlwZSBhbHJlYWR5XG4gICAgLy8gc3VwcG9ydHMgZGVzdHJ1Y3R1cmluZyBhc3NpZ25tZW50cy4gQXNzaWdubWVudFBhdHRlcm4gbm9kZXMgbWF5IGFwcGVhclxuICAgIC8vIHdoZXJldmVyIGEgUGF0dGVybiBpcyBhbGxvd2VkLCBhbmQgdGhlIHJpZ2h0LWhhbmQgc2lkZSByZXByZXNlbnRzIGFcbiAgICAvLyBkZWZhdWx0IHZhbHVlIHRvIGJlIGRlc3RydWN0dXJlZCBhZ2FpbnN0IHRoZSBsZWZ0LWhhbmQgc2lkZSwgaWYgbm9cbiAgICAvLyB2YWx1ZSBpcyBvdGhlcndpc2UgcHJvdmlkZWQuIEZvciBleGFtcGxlOiBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMuXG4gICAgZGVmKFwiQXNzaWdubWVudFBhdHRlcm5cIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJsZWZ0XCIsIFwicmlnaHRcIilcbiAgICAgICAgLmZpZWxkKFwibGVmdFwiLCBkZWYoXCJQYXR0ZXJuXCIpKVxuICAgICAgICAuZmllbGQoXCJyaWdodFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICB2YXIgQ2xhc3NCb2R5RWxlbWVudCA9IG9yKGRlZihcIk1ldGhvZERlZmluaXRpb25cIiksIGRlZihcIlZhcmlhYmxlRGVjbGFyYXRvclwiKSwgZGVmKFwiQ2xhc3NQcm9wZXJ0eURlZmluaXRpb25cIiksIGRlZihcIkNsYXNzUHJvcGVydHlcIikpO1xuICAgIGRlZihcIkNsYXNzUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiQ2xhc3NQcm9wZXJ0eURlZmluaXRpb25cIikgLy8gc3RhdGljIHByb3BlcnR5XG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImRlZmluaXRpb25cIilcbiAgICAgICAgLy8gWWVzLCBWaXJnaW5pYSwgY2lyY3VsYXIgZGVmaW5pdGlvbnMgYXJlIHBlcm1pdHRlZC5cbiAgICAgICAgLmZpZWxkKFwiZGVmaW5pdGlvblwiLCBDbGFzc0JvZHlFbGVtZW50KTtcbiAgICBkZWYoXCJDbGFzc0JvZHlcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIFtDbGFzc0JvZHlFbGVtZW50XSk7XG4gICAgZGVmKFwiQ2xhc3NEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImJvZHlcIiwgXCJzdXBlckNsYXNzXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkNsYXNzQm9keVwiKSlcbiAgICAgICAgLmZpZWxkKFwic3VwZXJDbGFzc1wiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJDbGFzc0V4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImJvZHlcIiwgXCJzdXBlckNsYXNzXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiQ2xhc3NCb2R5XCIpKVxuICAgICAgICAuZmllbGQoXCJzdXBlckNsYXNzXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIC8vIFNwZWNpZmllciBhbmQgTW9kdWxlU3BlY2lmaWVyIGFyZSBhYnN0cmFjdCBub24tc3RhbmRhcmQgdHlwZXNcbiAgICAvLyBpbnRyb2R1Y2VkIGZvciBkZWZpbml0aW9uYWwgY29udmVuaWVuY2UuXG4gICAgZGVmKFwiU3BlY2lmaWVyXCIpLmJhc2VzKFwiTm9kZVwiKTtcbiAgICAvLyBUaGlzIHN1cGVydHlwZSBpcyBzaGFyZWQvYWJ1c2VkIGJ5IGJvdGggZGVmL2JhYmVsLmpzIGFuZFxuICAgIC8vIGRlZi9lc3ByaW1hLmpzLiBJbiB0aGUgZnV0dXJlLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIGxvYWQgb25seSBvbmUgc2V0XG4gICAgLy8gb2YgZGVmaW5pdGlvbnMgYXBwcm9wcmlhdGUgZm9yIGEgZ2l2ZW4gcGFyc2VyLCBidXQgdW50aWwgdGhlbiB3ZSBtdXN0XG4gICAgLy8gcmVseSBvbiBkZWZhdWx0IGZ1bmN0aW9ucyB0byByZWNvbmNpbGUgdGhlIGNvbmZsaWN0aW5nIEFTVCBmb3JtYXRzLlxuICAgIGRlZihcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJTcGVjaWZpZXJcIilcbiAgICAgICAgLy8gVGhpcyBsb2NhbCBmaWVsZCBpcyB1c2VkIGJ5IEJhYmVsL0Fjb3JuLiBJdCBzaG91bGQgbm90IHRlY2huaWNhbGx5XG4gICAgICAgIC8vIGJlIG9wdGlvbmFsIGluIHRoZSBCYWJlbC9BY29ybiBBU1QgZm9ybWF0LCBidXQgaXQgbXVzdCBiZSBvcHRpb25hbFxuICAgICAgICAvLyBpbiB0aGUgRXNwcmltYSBBU1QgZm9ybWF0LlxuICAgICAgICAuZmllbGQoXCJsb2NhbFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAvLyBUaGUgaWQgYW5kIG5hbWUgZmllbGRzIGFyZSB1c2VkIGJ5IEVzcHJpbWEuIFRoZSBpZCBmaWVsZCBzaG91bGQgbm90XG4gICAgICAgIC8vIHRlY2huaWNhbGx5IGJlIG9wdGlvbmFsIGluIHRoZSBFc3ByaW1hIEFTVCBmb3JtYXQsIGJ1dCBpdCBtdXN0IGJlXG4gICAgICAgIC8vIG9wdGlvbmFsIGluIHRoZSBCYWJlbC9BY29ybiBBU1QgZm9ybWF0LlxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIC8vIExpa2UgTW9kdWxlU3BlY2lmaWVyLCBleGNlcHQgdHlwZTpcIkltcG9ydFNwZWNpZmllclwiIGFuZCBidWlsZGFibGUuXG4gICAgLy8gaW1wb3J0IHs8aWQgW2FzIG5hbWVdPn0gZnJvbSAuLi47XG4gICAgZGVmKFwiSW1wb3J0U3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcIm5hbWVcIik7XG4gICAgLy8gaW1wb3J0IDwqIGFzIGlkPiBmcm9tIC4uLjtcbiAgICBkZWYoXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTW9kdWxlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpO1xuICAgIC8vIGltcG9ydCA8aWQ+IGZyb20gLi4uO1xuICAgIGRlZihcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTW9kdWxlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpO1xuICAgIGRlZihcIkltcG9ydERlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcInNwZWNpZmllcnNcIiwgXCJzb3VyY2VcIiwgXCJpbXBvcnRLaW5kXCIpXG4gICAgICAgIC5maWVsZChcInNwZWNpZmllcnNcIiwgW29yKGRlZihcIkltcG9ydFNwZWNpZmllclwiKSwgZGVmKFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpLCBkZWYoXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIpKV0sIGRlZmF1bHRzLmVtcHR5QXJyYXkpXG4gICAgICAgIC5maWVsZChcInNvdXJjZVwiLCBkZWYoXCJMaXRlcmFsXCIpKVxuICAgICAgICAuZmllbGQoXCJpbXBvcnRLaW5kXCIsIG9yKFwidmFsdWVcIiwgXCJ0eXBlXCIpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcInZhbHVlXCI7XG4gICAgfSk7XG4gICAgZGVmKFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwidGFnXCIsIFwicXVhc2lcIilcbiAgICAgICAgLmZpZWxkKFwidGFnXCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInF1YXNpXCIsIGRlZihcIlRlbXBsYXRlTGl0ZXJhbFwiKSk7XG4gICAgZGVmKFwiVGVtcGxhdGVMaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwicXVhc2lzXCIsIFwiZXhwcmVzc2lvbnNcIilcbiAgICAgICAgLmZpZWxkKFwicXVhc2lzXCIsIFtkZWYoXCJUZW1wbGF0ZUVsZW1lbnRcIildKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uc1wiLCBbZGVmKFwiRXhwcmVzc2lvblwiKV0pO1xuICAgIGRlZihcIlRlbXBsYXRlRWxlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIsIFwidGFpbFwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCB7IFwiY29va2VkXCI6IFN0cmluZywgXCJyYXdcIjogU3RyaW5nIH0pXG4gICAgICAgIC5maWVsZChcInRhaWxcIiwgQm9vbGVhbik7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgZXM2XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9lczZcIikpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3R5cGVzXCIpKTtcbnZhciBzaGFyZWRfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvc2hhcmVkXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoZXM2XzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICBkZWYoXCJGdW5jdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJhc3luY1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJTcHJlYWRQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIk9iamVjdEV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydGllc1wiLCBbb3IoZGVmKFwiUHJvcGVydHlcIiksIGRlZihcIlNwcmVhZFByb3BlcnR5XCIpLCBkZWYoXCJTcHJlYWRFbGVtZW50XCIpKV0pO1xuICAgIGRlZihcIlNwcmVhZFByb3BlcnR5UGF0dGVyblwiKVxuICAgICAgICAuYmFzZXMoXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIlBhdHRlcm5cIikpO1xuICAgIGRlZihcIk9iamVjdFBhdHRlcm5cIilcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydGllc1wiLCBbb3IoZGVmKFwiUHJvcGVydHlcIiksIGRlZihcIlByb3BlcnR5UGF0dGVyblwiKSwgZGVmKFwiU3ByZWFkUHJvcGVydHlQYXR0ZXJuXCIpKV0pO1xuICAgIGRlZihcIkF3YWl0RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIsIFwiYWxsXCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJhbGxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgZXM3XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9lczdcIikpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3R5cGVzXCIpKTtcbnZhciBzaGFyZWRfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvc2hhcmVkXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoZXM3XzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICBkZWYoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcImRlY2xhcmF0aW9uc1wiLCBbb3IoZGVmKFwiVmFyaWFibGVEZWNsYXJhdG9yXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpIC8vIEVzcHJpbWEgZGV2aWF0aW9uLlxuICAgICAgICApXSk7XG4gICAgZGVmKFwiUHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgZGVmKFwiUGF0dGVyblwiKSAvLyBFc3ByaW1hIGRldmlhdGlvbi5cbiAgICApKTtcbiAgICBkZWYoXCJBcnJheVBhdHRlcm5cIilcbiAgICAgICAgLmZpZWxkKFwiZWxlbWVudHNcIiwgW29yKGRlZihcIlBhdHRlcm5cIiksIGRlZihcIlNwcmVhZEVsZW1lbnRcIiksIG51bGwpXSk7XG4gICAgZGVmKFwiT2JqZWN0UGF0dGVyblwiKVxuICAgICAgICAuZmllbGQoXCJwcm9wZXJ0aWVzXCIsIFtvcihkZWYoXCJQcm9wZXJ0eVwiKSwgZGVmKFwiUHJvcGVydHlQYXR0ZXJuXCIpLCBkZWYoXCJTcHJlYWRQcm9wZXJ0eVBhdHRlcm5cIiksIGRlZihcIlNwcmVhZFByb3BlcnR5XCIpIC8vIFVzZWQgYnkgRXNwcmltYS5cbiAgICAgICAgKV0pO1xuICAgIC8vIExpa2UgTW9kdWxlU3BlY2lmaWVyLCBleGNlcHQgdHlwZTpcIkV4cG9ydFNwZWNpZmllclwiIGFuZCBidWlsZGFibGUuXG4gICAgLy8gZXhwb3J0IHs8aWQgW2FzIG5hbWVdPn0gW2Zyb20gLi4uXTtcbiAgICBkZWYoXCJFeHBvcnRTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTW9kdWxlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwibmFtZVwiKTtcbiAgICAvLyBleHBvcnQgPCo+IGZyb20gLi4uO1xuICAgIGRlZihcIkV4cG9ydEJhdGNoU3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIlNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJFeHBvcnREZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJkZWZhdWx0XCIsIFwiZGVjbGFyYXRpb25cIiwgXCJzcGVjaWZpZXJzXCIsIFwic291cmNlXCIpXG4gICAgICAgIC5maWVsZChcImRlZmF1bHRcIiwgQm9vbGVhbilcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyYXRpb25cIiwgb3IoZGVmKFwiRGVjbGFyYXRpb25cIiksIGRlZihcIkV4cHJlc3Npb25cIiksIC8vIEltcGxpZXMgZGVmYXVsdC5cbiAgICBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwic3BlY2lmaWVyc1wiLCBbb3IoZGVmKFwiRXhwb3J0U3BlY2lmaWVyXCIpLCBkZWYoXCJFeHBvcnRCYXRjaFNwZWNpZmllclwiKSldLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiQmxvY2tcIilcbiAgICAgICAgLmJhc2VzKFwiQ29tbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCAvKm9wdGlvbmFsOiovIFwibGVhZGluZ1wiLCBcInRyYWlsaW5nXCIpO1xuICAgIGRlZihcIkxpbmVcIilcbiAgICAgICAgLmJhc2VzKFwiQ29tbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCAvKm9wdGlvbmFsOiovIFwibGVhZGluZ1wiLCBcInRyYWlsaW5nXCIpO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIGVzN18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZXM3XCIpKTtcbnZhciB0eXBlX2Fubm90YXRpb25zXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90eXBlLWFubm90YXRpb25zXCIpKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIGZvcmsudXNlKGVzN18xLmRlZmF1bHQpO1xuICAgIGZvcmsudXNlKHR5cGVfYW5ub3RhdGlvbnNfMS5kZWZhdWx0KTtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICB2YXIgb3IgPSB0eXBlcy5UeXBlLm9yO1xuICAgIHZhciBkZWZhdWx0cyA9IGZvcmsudXNlKHNoYXJlZF8xLmRlZmF1bHQpLmRlZmF1bHRzO1xuICAgIC8vIEJhc2UgdHlwZXNcbiAgICBkZWYoXCJGbG93XCIpLmJhc2VzKFwiTm9kZVwiKTtcbiAgICBkZWYoXCJGbG93VHlwZVwiKS5iYXNlcyhcIkZsb3dcIik7XG4gICAgLy8gVHlwZSBhbm5vdGF0aW9uc1xuICAgIGRlZihcIkFueVR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIkVtcHR5VHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiTWl4ZWRUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJWb2lkVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiTnVtYmVyVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiTnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIsIFwicmF3XCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIE51bWJlcilcbiAgICAgICAgLmZpZWxkKFwicmF3XCIsIFN0cmluZyk7XG4gICAgLy8gQmFieWxvbiA2IGRpZmZlcnMgaW4gQVNUIGZyb20gRmxvd1xuICAgIC8vIHNhbWUgYXMgTnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXG4gICAgZGVmKFwiTnVtZXJpY0xpdGVyYWxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCBcInJhd1wiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBOdW1iZXIpXG4gICAgICAgIC5maWVsZChcInJhd1wiLCBTdHJpbmcpO1xuICAgIGRlZihcIlN0cmluZ1R5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIlN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCBcInJhd1wiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBTdHJpbmcpXG4gICAgICAgIC5maWVsZChcInJhd1wiLCBTdHJpbmcpO1xuICAgIGRlZihcIkJvb2xlYW5UeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIsIFwicmF3XCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIEJvb2xlYW4pXG4gICAgICAgIC5maWVsZChcInJhd1wiLCBTdHJpbmcpO1xuICAgIGRlZihcIlR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiRmxvd1R5cGVcIikpO1xuICAgIGRlZihcIk51bGxhYmxlVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiRmxvd1R5cGVcIikpO1xuICAgIGRlZihcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiTnVsbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIlRoaXNUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJFeGlzdHNUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJFeGlzdGVudGlhbFR5cGVQYXJhbVwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtc1wiLCBcInJldHVyblR5cGVcIiwgXCJyZXN0XCIsIFwidHlwZVBhcmFtZXRlcnNcIilcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJGdW5jdGlvblR5cGVQYXJhbVwiKV0pXG4gICAgICAgIC5maWVsZChcInJldHVyblR5cGVcIiwgZGVmKFwiRmxvd1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcInJlc3RcIiwgb3IoZGVmKFwiRnVuY3Rpb25UeXBlUGFyYW1cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiksIG51bGwpKTtcbiAgICBkZWYoXCJGdW5jdGlvblR5cGVQYXJhbVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcIm5hbWVcIiwgXCJ0eXBlQW5ub3RhdGlvblwiLCBcIm9wdGlvbmFsXCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiRmxvd1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIEJvb2xlYW4pO1xuICAgIGRlZihcIkFycmF5VHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiZWxlbWVudFR5cGVcIilcbiAgICAgICAgLmZpZWxkKFwiZWxlbWVudFR5cGVcIiwgZGVmKFwiRmxvd1R5cGVcIikpO1xuICAgIGRlZihcIk9iamVjdFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInByb3BlcnRpZXNcIiwgXCJpbmRleGVyc1wiLCBcImNhbGxQcm9wZXJ0aWVzXCIpXG4gICAgICAgIC5maWVsZChcInByb3BlcnRpZXNcIiwgW1xuICAgICAgICBvcihkZWYoXCJPYmplY3RUeXBlUHJvcGVydHlcIiksIGRlZihcIk9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eVwiKSlcbiAgICBdKVxuICAgICAgICAuZmllbGQoXCJpbmRleGVyc1wiLCBbZGVmKFwiT2JqZWN0VHlwZUluZGV4ZXJcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJjYWxsUHJvcGVydGllc1wiLCBbZGVmKFwiT2JqZWN0VHlwZUNhbGxQcm9wZXJ0eVwiKV0sIGRlZmF1bHRzLmVtcHR5QXJyYXkpXG4gICAgICAgIC5maWVsZChcImluZXhhY3RcIiwgb3IoQm9vbGVhbiwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pXG4gICAgICAgIC5maWVsZChcImV4YWN0XCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImludGVybmFsU2xvdHNcIiwgW2RlZihcIk9iamVjdFR5cGVJbnRlcm5hbFNsb3RcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KTtcbiAgICBkZWYoXCJWYXJpYW5jZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImtpbmRcIilcbiAgICAgICAgLmZpZWxkKFwia2luZFwiLCBvcihcInBsdXNcIiwgXCJtaW51c1wiKSk7XG4gICAgdmFyIExlZ2FjeVZhcmlhbmNlID0gb3IoZGVmKFwiVmFyaWFuY2VcIiksIFwicGx1c1wiLCBcIm1pbnVzXCIsIG51bGwpO1xuICAgIGRlZihcIk9iamVjdFR5cGVQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImtleVwiLCBcInZhbHVlXCIsIFwib3B0aW9uYWxcIilcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIGRlZihcIklkZW50aWZpZXJcIikpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJGbG93VHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbilcbiAgICAgICAgLmZpZWxkKFwidmFyaWFuY2VcIiwgTGVnYWN5VmFyaWFuY2UsIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiT2JqZWN0VHlwZUluZGV4ZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImtleVwiLCBcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBkZWYoXCJGbG93VHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgZGVmKFwiRmxvd1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcInZhcmlhbmNlXCIsIExlZ2FjeVZhcmlhbmNlLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIk9iamVjdFR5cGVDYWxsUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJzdGF0aWNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiUXVhbGlmaWVkVHlwZUlkZW50aWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJxdWFsaWZpY2F0aW9uXCIsIFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwicXVhbGlmaWNhdGlvblwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJRdWFsaWZpZWRUeXBlSWRlbnRpZmllclwiKSkpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpO1xuICAgIGRlZihcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCIpKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksIG51bGwpKTtcbiAgICBkZWYoXCJNZW1iZXJUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJvYmplY3RcIiwgXCJwcm9wZXJ0eVwiKVxuICAgICAgICAuZmllbGQoXCJvYmplY3RcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydHlcIiwgb3IoZGVmKFwiTWVtYmVyVHlwZUFubm90YXRpb25cIiksIGRlZihcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiKSkpO1xuICAgIGRlZihcIlVuaW9uVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZXNcIilcbiAgICAgICAgLmZpZWxkKFwidHlwZXNcIiwgW2RlZihcIkZsb3dUeXBlXCIpXSk7XG4gICAgZGVmKFwiSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZXNcIilcbiAgICAgICAgLmZpZWxkKFwidHlwZXNcIiwgW2RlZihcIkZsb3dUeXBlXCIpXSk7XG4gICAgZGVmKFwiVHlwZW9mVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYXJndW1lbnRcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRmxvd1R5cGVcIikpO1xuICAgIGRlZihcIk9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkZsb3dUeXBlXCIpKTtcbiAgICBkZWYoXCJPYmplY3RUeXBlSW50ZXJuYWxTbG90XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJ2YWx1ZVwiLCBcIm9wdGlvbmFsXCIsIFwic3RhdGljXCIsIFwibWV0aG9kXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIGRlZihcIkZsb3dUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBCb29sZWFuKVxuICAgICAgICAuZmllbGQoXCJzdGF0aWNcIiwgQm9vbGVhbilcbiAgICAgICAgLmZpZWxkKFwibWV0aG9kXCIsIEJvb2xlYW4pO1xuICAgIGRlZihcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtc1wiKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIlR5cGVQYXJhbWV0ZXJcIildKTtcbiAgICBkZWYoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtc1wiKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIkZsb3dUeXBlXCIpXSk7XG4gICAgZGVmKFwiVHlwZVBhcmFtZXRlclwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIsIFwidmFyaWFuY2VcIiwgXCJib3VuZFwiKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIFN0cmluZylcbiAgICAgICAgLmZpZWxkKFwidmFyaWFuY2VcIiwgTGVnYWN5VmFyaWFuY2UsIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiYm91bmRcIiwgb3IoZGVmKFwiVHlwZUFubm90YXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkNsYXNzUHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwidmFyaWFuY2VcIiwgTGVnYWN5VmFyaWFuY2UsIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiQ2xhc3NJbXBsZW1lbnRzXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwic3VwZXJDbGFzc1wiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiSW50ZXJmYWNlVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiLCBcImV4dGVuZHNcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJPYmplY3RUeXBlQW5ub3RhdGlvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiZXh0ZW5kc1wiLCBvcihbZGVmKFwiSW50ZXJmYWNlRXh0ZW5kc1wiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkludGVyZmFjZURlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwiYm9keVwiLCBcImV4dGVuZHNcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIk9iamVjdFR5cGVBbm5vdGF0aW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJleHRlbmRzXCIsIFtkZWYoXCJJbnRlcmZhY2VFeHRlbmRzXCIpXSk7XG4gICAgZGVmKFwiRGVjbGFyZUludGVyZmFjZVwiKVxuICAgICAgICAuYmFzZXMoXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImJvZHlcIiwgXCJleHRlbmRzXCIpO1xuICAgIGRlZihcIkludGVyZmFjZUV4dGVuZHNcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVHlwZUFsaWFzXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJyaWdodFwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJyaWdodFwiLCBkZWYoXCJGbG93VHlwZVwiKSk7XG4gICAgZGVmKFwiT3BhcXVlVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInR5cGVQYXJhbWV0ZXJzXCIsIFwiaW1wbHR5cGVcIiwgXCJzdXBlcnR5cGVcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwiaW1wbHR5cGVcIiwgZGVmKFwiRmxvd1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcInN1cGVydHlwZVwiLCBkZWYoXCJGbG93VHlwZVwiKSk7XG4gICAgZGVmKFwiRGVjbGFyZVR5cGVBbGlhc1wiKVxuICAgICAgICAuYmFzZXMoXCJUeXBlQWxpYXNcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInJpZ2h0XCIpO1xuICAgIGRlZihcIkRlY2xhcmVPcGFxdWVUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlR5cGVBbGlhc1wiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInR5cGVQYXJhbWV0ZXJzXCIsIFwic3VwZXJ0eXBlXCIpO1xuICAgIGRlZihcIlR5cGVDYXN0RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIiwgXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlR5cGVBbm5vdGF0aW9uXCIpKTtcbiAgICBkZWYoXCJUdXBsZVR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVzXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVzXCIsIFtkZWYoXCJGbG93VHlwZVwiKV0pO1xuICAgIGRlZihcIkRlY2xhcmVWYXJpYWJsZVwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiRGVjbGFyZUZ1bmN0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKTtcbiAgICBkZWYoXCJEZWNsYXJlQ2xhc3NcIilcbiAgICAgICAgLmJhc2VzKFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIik7XG4gICAgZGVmKFwiRGVjbGFyZU1vZHVsZVwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIkxpdGVyYWxcIikpKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkJsb2NrU3RhdGVtZW50XCIpKTtcbiAgICBkZWYoXCJEZWNsYXJlTW9kdWxlRXhwb3J0c1wiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiVHlwZUFubm90YXRpb25cIikpO1xuICAgIGRlZihcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJkZWZhdWx0XCIsIFwiZGVjbGFyYXRpb25cIiwgXCJzcGVjaWZpZXJzXCIsIFwic291cmNlXCIpXG4gICAgICAgIC5maWVsZChcImRlZmF1bHRcIiwgQm9vbGVhbilcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyYXRpb25cIiwgb3IoZGVmKFwiRGVjbGFyZVZhcmlhYmxlXCIpLCBkZWYoXCJEZWNsYXJlRnVuY3Rpb25cIiksIGRlZihcIkRlY2xhcmVDbGFzc1wiKSwgZGVmKFwiRmxvd1R5cGVcIiksIC8vIEltcGxpZXMgZGVmYXVsdC5cbiAgICBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwic3BlY2lmaWVyc1wiLCBbb3IoZGVmKFwiRXhwb3J0U3BlY2lmaWVyXCIpLCBkZWYoXCJFeHBvcnRCYXRjaFNwZWNpZmllclwiKSldLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiRGVjbGFyZUV4cG9ydEFsbERlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcInNvdXJjZVwiKVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiRmxvd1ByZWRpY2F0ZVwiKS5iYXNlcyhcIkZsb3dcIik7XG4gICAgZGVmKFwiSW5mZXJyZWRQcmVkaWNhdGVcIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1ByZWRpY2F0ZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJEZWNsYXJlZFByZWRpY2F0ZVwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93UHJlZGljYXRlXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIkNhbGxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBcmd1bWVudHNcIiwgb3IobnVsbCwgZGVmKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIikpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIk5ld0V4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFyZ3VtZW50c1wiLCBvcihudWxsLCBkZWYoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgZXM3XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9lczdcIikpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3R5cGVzXCIpKTtcbnZhciBzaGFyZWRfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvc2hhcmVkXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoZXM3XzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICBkZWYoXCJKU1hBdHRyaWJ1dGVcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIsIFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBvcihkZWYoXCJKU1hJZGVudGlmaWVyXCIpLCBkZWYoXCJKU1hOYW1lc3BhY2VkTmFtZVwiKSkpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIC8vIGF0dHI9XCJ2YWx1ZVwiXG4gICAgZGVmKFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiKSwgLy8gYXR0cj17dmFsdWV9XG4gICAgbnVsbCAvLyBhdHRyPSBvciBqdXN0IGF0dHJcbiAgICApLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkpTWElkZW50aWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiSWRlbnRpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJKU1hOYW1lc3BhY2VkTmFtZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcIm5hbWVzcGFjZVwiLCBcIm5hbWVcIilcbiAgICAgICAgLmZpZWxkKFwibmFtZXNwYWNlXCIsIGRlZihcIkpTWElkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgZGVmKFwiSlNYSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJNZW1iZXJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9iamVjdFwiLCBcInByb3BlcnR5XCIpXG4gICAgICAgIC5maWVsZChcIm9iamVjdFwiLCBvcihkZWYoXCJKU1hJZGVudGlmaWVyXCIpLCBkZWYoXCJKU1hNZW1iZXJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydHlcIiwgZGVmKFwiSlNYSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHMuZmFsc2UpO1xuICAgIHZhciBKU1hFbGVtZW50TmFtZSA9IG9yKGRlZihcIkpTWElkZW50aWZpZXJcIiksIGRlZihcIkpTWE5hbWVzcGFjZWROYW1lXCIpLCBkZWYoXCJKU1hNZW1iZXJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICB2YXIgSlNYQXR0cmlidXRlcyA9IFtvcihkZWYoXCJKU1hBdHRyaWJ1dGVcIiksIGRlZihcIkpTWFNwcmVhZEF0dHJpYnV0ZVwiKSldO1xuICAgIGRlZihcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25cIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiSlNYRWxlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9wZW5pbmdFbGVtZW50XCIsIFwiY2xvc2luZ0VsZW1lbnRcIiwgXCJjaGlsZHJlblwiKVxuICAgICAgICAuZmllbGQoXCJvcGVuaW5nRWxlbWVudFwiLCBkZWYoXCJKU1hPcGVuaW5nRWxlbWVudFwiKSlcbiAgICAgICAgLmZpZWxkKFwiY2xvc2luZ0VsZW1lbnRcIiwgb3IoZGVmKFwiSlNYQ2xvc2luZ0VsZW1lbnRcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcImNoaWxkcmVuXCIsIFtvcihkZWYoXCJKU1hFbGVtZW50XCIpLCBkZWYoXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCIpLCBkZWYoXCJKU1hGcmFnbWVudFwiKSwgZGVmKFwiSlNYVGV4dFwiKSwgZGVmKFwiTGl0ZXJhbFwiKSAvLyBUT0RPIEVzcHJpbWEgc2hvdWxkIHJldHVybiBKU1hUZXh0IGluc3RlYWQuXG4gICAgICAgICldLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIEpTWEVsZW1lbnROYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIExpdHRsZS1rbm93biBmYWN0OiB0aGUgYHRoaXNgIG9iamVjdCBpbnNpZGUgYSBkZWZhdWx0IGZ1bmN0aW9uXG4gICAgICAgIC8vIGlzIG5vbmUgb3RoZXIgdGhhbiB0aGUgcGFydGlhbGx5LWJ1aWx0IG9iamVjdCBpdHNlbGYsIGFuZCBhbnlcbiAgICAgICAgLy8gZmllbGRzIGluaXRpYWxpemVkIGRpcmVjdGx5IGZyb20gYnVpbGRlciBmdW5jdGlvbiBhcmd1bWVudHNcbiAgICAgICAgLy8gKGxpa2Ugb3BlbmluZ0VsZW1lbnQsIGNsb3NpbmdFbGVtZW50LCBhbmQgY2hpbGRyZW4pIGFyZVxuICAgICAgICAvLyBndWFyYW50ZWVkIHRvIGJlIGF2YWlsYWJsZS5cbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0VsZW1lbnQubmFtZTtcbiAgICB9LCB0cnVlKSAvLyBoaWRkZW4gZnJvbSB0cmF2ZXJzYWxcbiAgICAgICAgLmZpZWxkKFwic2VsZkNsb3NpbmdcIiwgQm9vbGVhbiwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nRWxlbWVudC5zZWxmQ2xvc2luZztcbiAgICB9LCB0cnVlKSAvLyBoaWRkZW4gZnJvbSB0cmF2ZXJzYWxcbiAgICAgICAgLmZpZWxkKFwiYXR0cmlidXRlc1wiLCBKU1hBdHRyaWJ1dGVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdFbGVtZW50LmF0dHJpYnV0ZXM7XG4gICAgfSwgdHJ1ZSk7IC8vIGhpZGRlbiBmcm9tIHRyYXZlcnNhbFxuICAgIGRlZihcIkpTWE9wZW5pbmdFbGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIikgLy8gVE9ETyBEb2VzIHRoaXMgbWFrZSBzZW5zZT8gQ2FuJ3QgcmVhbGx5IGJlIGFuIEpTWEVsZW1lbnQuXG4gICAgICAgIC5idWlsZChcIm5hbWVcIiwgXCJhdHRyaWJ1dGVzXCIsIFwic2VsZkNsb3NpbmdcIilcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBKU1hFbGVtZW50TmFtZSlcbiAgICAgICAgLmZpZWxkKFwiYXR0cmlidXRlc1wiLCBKU1hBdHRyaWJ1dGVzLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJzZWxmQ2xvc2luZ1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJKU1hDbG9zaW5nRWxlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpIC8vIFRPRE8gU2FtZSBjb25jZXJuLlxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgSlNYRWxlbWVudE5hbWUpO1xuICAgIGRlZihcIkpTWEZyYWdtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwib3BlbmluZ0VsZW1lbnRcIiwgXCJjbG9zaW5nRWxlbWVudFwiLCBcImNoaWxkcmVuXCIpXG4gICAgICAgIC5maWVsZChcIm9wZW5pbmdFbGVtZW50XCIsIGRlZihcIkpTWE9wZW5pbmdGcmFnbWVudFwiKSlcbiAgICAgICAgLmZpZWxkKFwiY2xvc2luZ0VsZW1lbnRcIiwgZGVmKFwiSlNYQ2xvc2luZ0ZyYWdtZW50XCIpKVxuICAgICAgICAuZmllbGQoXCJjaGlsZHJlblwiLCBbb3IoZGVmKFwiSlNYRWxlbWVudFwiKSwgZGVmKFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiKSwgZGVmKFwiSlNYRnJhZ21lbnRcIiksIGRlZihcIkpTWFRleHRcIiksIGRlZihcIkxpdGVyYWxcIikgLy8gVE9ETyBFc3ByaW1hIHNob3VsZCByZXR1cm4gSlNYVGV4dCBpbnN0ZWFkLlxuICAgICAgICApXSwgZGVmYXVsdHMuZW1wdHlBcnJheSk7XG4gICAgZGVmKFwiSlNYT3BlbmluZ0ZyYWdtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIikgLy8gVE9ETyBTYW1lIGNvbmNlcm4uXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIkpTWENsb3NpbmdGcmFnbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpIC8vIFRPRE8gU2FtZSBjb25jZXJuLlxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJKU1hUZXh0XCIpXG4gICAgICAgIC5iYXNlcyhcIkxpdGVyYWxcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJKU1hFbXB0eUV4cHJlc3Npb25cIikuYmFzZXMoXCJFeHByZXNzaW9uXCIpLmJ1aWxkKCk7XG4gICAgLy8gVGhpcyBQUiBoYXMgY2F1c2VkIG1hbnkgcGVvcGxlIGlzc3VlcywgYnV0IHN1cHBvcnRpbmcgaXQgc2VlbXMgbGlrZSBhXG4gICAgLy8gZ29vZCBpZGVhIGFueXdheTogaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYmVsL3B1bGwvNDk4OFxuICAgIGRlZihcIkpTWFNwcmVhZENoaWxkXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbi8qKlxuICogVHlwZSBhbm5vdGF0aW9uIGRlZnMgc2hhcmVkIGJldHdlZW4gRmxvdyBhbmQgVHlwZVNjcmlwdC5cbiAqIFRoZXNlIGRlZnMgY291bGQgbm90IGJlIGRlZmluZWQgaW4gLi9mbG93LnRzIG9yIC4vdHlwZXNjcmlwdC50cyBkaXJlY3RseVxuICogYmVjYXVzZSB0aGV5IHVzZSB0aGUgc2FtZSBuYW1lLlxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIGRlZiA9IHR5cGVzLlR5cGUuZGVmO1xuICAgIHZhciBvciA9IHR5cGVzLlR5cGUub3I7XG4gICAgdmFyIGRlZmF1bHRzID0gZm9yay51c2Uoc2hhcmVkXzEuZGVmYXVsdCkuZGVmYXVsdHM7XG4gICAgdmFyIFR5cGVBbm5vdGF0aW9uID0gb3IoZGVmKFwiVHlwZUFubm90YXRpb25cIiksIGRlZihcIlRTVHlwZUFubm90YXRpb25cIiksIG51bGwpO1xuICAgIHZhciBUeXBlUGFyYW1EZWNsID0gb3IoZGVmKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLCBkZWYoXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSwgbnVsbCk7XG4gICAgZGVmKFwiSWRlbnRpZmllclwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBUeXBlQW5ub3RhdGlvbiwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJPYmplY3RQYXR0ZXJuXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIFR5cGVBbm5vdGF0aW9uLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkZ1bmN0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInJldHVyblR5cGVcIiwgVHlwZUFubm90YXRpb24sIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgVHlwZVBhcmFtRGVjbCwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJDbGFzc1Byb3BlcnR5XCIpXG4gICAgICAgIC5idWlsZChcImtleVwiLCBcInZhbHVlXCIsIFwidHlwZUFubm90YXRpb25cIiwgXCJzdGF0aWNcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInN0YXRpY1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBUeXBlQW5ub3RhdGlvbiwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBbXCJDbGFzc0RlY2xhcmF0aW9uXCIsXG4gICAgICAgIFwiQ2xhc3NFeHByZXNzaW9uXCIsXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlTmFtZSkge1xuICAgICAgICBkZWYodHlwZU5hbWUpXG4gICAgICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBUeXBlUGFyYW1EZWNsLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgICAgICAuZmllbGQoXCJzdXBlclR5cGVQYXJhbWV0ZXJzXCIsIG9yKGRlZihcIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLCBkZWYoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwiaW1wbGVtZW50c1wiLCBvcihbZGVmKFwiQ2xhc3NJbXBsZW1lbnRzXCIpXSwgW2RlZihcIlRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXCIpXSksIGRlZmF1bHRzLmVtcHR5QXJyYXkpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIGJhYmVsX2NvcmVfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2JhYmVsLWNvcmVcIikpO1xudmFyIHR5cGVfYW5ub3RhdGlvbnNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3R5cGUtYW5ub3RhdGlvbnNcIikpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3R5cGVzXCIpKTtcbnZhciBzaGFyZWRfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvc2hhcmVkXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgLy8gU2luY2UgVHlwZVNjcmlwdCBpcyBwYXJzZWQgYnkgQmFieWxvbiwgaW5jbHVkZSB0aGUgY29yZSBCYWJ5bG9uIHR5cGVzXG4gICAgLy8gYnV0IG9taXQgdGhlIEZsb3ctcmVsYXRlZCB0eXBlcy5cbiAgICBmb3JrLnVzZShiYWJlbF9jb3JlXzEuZGVmYXVsdCk7XG4gICAgZm9yay51c2UodHlwZV9hbm5vdGF0aW9uc18xLmRlZmF1bHQpO1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIG4gPSB0eXBlcy5uYW1lZFR5cGVzO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICB2YXIgb3IgPSB0eXBlcy5UeXBlLm9yO1xuICAgIHZhciBkZWZhdWx0cyA9IGZvcmsudXNlKHNoYXJlZF8xLmRlZmF1bHQpLmRlZmF1bHRzO1xuICAgIHZhciBTdHJpbmdMaXRlcmFsID0gdHlwZXMuVHlwZS5mcm9tKGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkge1xuICAgICAgICBpZiAobi5TdHJpbmdMaXRlcmFsICYmXG4gICAgICAgICAgICBuLlN0cmluZ0xpdGVyYWwuY2hlY2sodmFsdWUsIGRlZXApKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobi5MaXRlcmFsICYmXG4gICAgICAgICAgICBuLkxpdGVyYWwuY2hlY2sodmFsdWUsIGRlZXApICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUudmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LCBcIlN0cmluZ0xpdGVyYWxcIik7XG4gICAgZGVmKFwiVFNUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIik7XG4gICAgdmFyIFRTRW50aXR5TmFtZSA9IG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIlRTUXVhbGlmaWVkTmFtZVwiKSk7XG4gICAgZGVmKFwiVFNUeXBlUmVmZXJlbmNlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJ0eXBlTmFtZVwiLCBcInR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVOYW1lXCIsIFRTRW50aXR5TmFtZSk7XG4gICAgLy8gQW4gYWJzdHJhY3QgKG5vbi1idWlsZGFibGUpIGJhc2UgdHlwZSB0aGF0IHByb3ZpZGUgYSBjb21tb25seS1uZWVkZWRcbiAgICAvLyBvcHRpb25hbCAudHlwZVBhcmFtZXRlcnMgZmllbGQuXG4gICAgZGVmKFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJzXCIsIG9yKGRlZihcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIC8vIEFuIGFic3RyYWN0IChub24tYnVpbGRhYmxlKSBiYXNlIHR5cGUgdGhhdCBwcm92aWRlIGEgY29tbW9ubHktbmVlZGVkXG4gICAgLy8gb3B0aW9uYWwgLnR5cGVQYXJhbWV0ZXJzIGZpZWxkLlxuICAgIGRlZihcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSwgbnVsbCwgdm9pZCAwKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICAvLyBBbiBhYnN0cmFjdCAobm9uLWJ1aWxkYWJsZSkgYmFzZSB0eXBlIHRoYXQgcHJvdmlkZSBhIGNvbW1vbmx5LW5lZWRlZFxuICAgIC8vIG9wdGlvbmFsIC50eXBlQW5ub3RhdGlvbiBmaWVsZC5cbiAgICBkZWYoXCJUU0hhc09wdGlvbmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgb3IoZGVmKFwiVFNUeXBlQW5ub3RhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNRdWFsaWZpZWROYW1lXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwibGVmdFwiLCBcInJpZ2h0XCIpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgVFNFbnRpdHlOYW1lKVxuICAgICAgICAuZmllbGQoXCJyaWdodFwiLCBUU0VudGl0eU5hbWUpO1xuICAgIGRlZihcIlRTQXNFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIiwgXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIiwgXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlRTVHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwiZXh0cmFcIiwgb3IoeyBwYXJlbnRoZXNpemVkOiBCb29sZWFuIH0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTTm9uTnVsbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiLCBcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIFtcbiAgICAgICAgXCJUU0FueUtleXdvcmRcIixcbiAgICAgICAgXCJUU0JpZ0ludEtleXdvcmRcIixcbiAgICAgICAgXCJUU0Jvb2xlYW5LZXl3b3JkXCIsXG4gICAgICAgIFwiVFNOZXZlcktleXdvcmRcIixcbiAgICAgICAgXCJUU051bGxLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNOdW1iZXJLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNPYmplY3RLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNTdHJpbmdLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNTeW1ib2xLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNVbmRlZmluZWRLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNVbmtub3duS2V5d29yZFwiLFxuICAgICAgICBcIlRTVm9pZEtleXdvcmRcIixcbiAgICAgICAgXCJUU1RoaXNUeXBlXCIsXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXl3b3JkVHlwZSkge1xuICAgICAgICBkZWYoa2V5d29yZFR5cGUpXG4gICAgICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgICAgIC5idWlsZCgpO1xuICAgIH0pO1xuICAgIGRlZihcIlRTQXJyYXlUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJlbGVtZW50VHlwZVwiKVxuICAgICAgICAuZmllbGQoXCJlbGVtZW50VHlwZVwiLCBkZWYoXCJUU1R5cGVcIikpO1xuICAgIGRlZihcIlRTTGl0ZXJhbFR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImxpdGVyYWxcIilcbiAgICAgICAgLmZpZWxkKFwibGl0ZXJhbFwiLCBvcihkZWYoXCJOdW1lcmljTGl0ZXJhbFwiKSwgZGVmKFwiU3RyaW5nTGl0ZXJhbFwiKSwgZGVmKFwiQm9vbGVhbkxpdGVyYWxcIiksIGRlZihcIlRlbXBsYXRlTGl0ZXJhbFwiKSwgZGVmKFwiVW5hcnlFeHByZXNzaW9uXCIpKSk7XG4gICAgW1wiVFNVbmlvblR5cGVcIixcbiAgICAgICAgXCJUU0ludGVyc2VjdGlvblR5cGVcIixcbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKHR5cGVOYW1lKSB7XG4gICAgICAgIGRlZih0eXBlTmFtZSlcbiAgICAgICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAgICAgLmJ1aWxkKFwidHlwZXNcIilcbiAgICAgICAgICAgIC5maWVsZChcInR5cGVzXCIsIFtkZWYoXCJUU1R5cGVcIildKTtcbiAgICB9KTtcbiAgICBkZWYoXCJUU0NvbmRpdGlvbmFsVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiY2hlY2tUeXBlXCIsIFwiZXh0ZW5kc1R5cGVcIiwgXCJ0cnVlVHlwZVwiLCBcImZhbHNlVHlwZVwiKVxuICAgICAgICAuZmllbGQoXCJjaGVja1R5cGVcIiwgZGVmKFwiVFNUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJleHRlbmRzVHlwZVwiLCBkZWYoXCJUU1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcInRydWVUeXBlXCIsIGRlZihcIlRTVHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwiZmFsc2VUeXBlXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgZGVmKFwiVFNJbmZlclR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVQYXJhbWV0ZXJcIilcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlclwiLCBkZWYoXCJUU1R5cGVQYXJhbWV0ZXJcIikpO1xuICAgIGRlZihcIlRTUGFyZW50aGVzaXplZFR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgdmFyIFBhcmFtZXRlcnNUeXBlID0gW29yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIlJlc3RFbGVtZW50XCIpLCBkZWYoXCJBcnJheVBhdHRlcm5cIiksIGRlZihcIk9iamVjdFBhdHRlcm5cIikpXTtcbiAgICBbXCJUU0Z1bmN0aW9uVHlwZVwiLFxuICAgICAgICBcIlRTQ29uc3RydWN0b3JUeXBlXCIsXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlTmFtZSkge1xuICAgICAgICBkZWYodHlwZU5hbWUpXG4gICAgICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlcnNcIiwgXCJUU0hhc09wdGlvbmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgICAgIC5idWlsZChcInBhcmFtZXRlcnNcIilcbiAgICAgICAgICAgIC5maWVsZChcInBhcmFtZXRlcnNcIiwgUGFyYW1ldGVyc1R5cGUpO1xuICAgIH0pO1xuICAgIGRlZihcIlRTRGVjbGFyZUZ1bmN0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwicGFyYW1zXCIsIFwicmV0dXJuVHlwZVwiKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJlXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImFzeW5jXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImdlbmVyYXRvclwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIlBhdHRlcm5cIildKVxuICAgICAgICAvLyB0U0Z1bmN0aW9uVHlwZUFubm90YXRpb25Db21tb25cbiAgICAgICAgLmZpZWxkKFwicmV0dXJuVHlwZVwiLCBvcihkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLCBkZWYoXCJOb29wXCIpLCAvLyBTdGlsbCB1c2VkP1xuICAgIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTRGVjbGFyZU1ldGhvZFwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuYnVpbGQoXCJrZXlcIiwgXCJwYXJhbXNcIiwgXCJyZXR1cm5UeXBlXCIpXG4gICAgICAgIC5maWVsZChcImFzeW5jXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImdlbmVyYXRvclwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIlBhdHRlcm5cIildKVxuICAgICAgICAvLyBjbGFzc01ldGhvZE9yUHJvcGVydHlDb21tb25cbiAgICAgICAgLmZpZWxkKFwiYWJzdHJhY3RcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiYWNjZXNzaWJpbGl0eVwiLCBvcihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pXG4gICAgICAgIC5maWVsZChcInN0YXRpY1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiU3RyaW5nTGl0ZXJhbFwiKSwgZGVmKFwiTnVtZXJpY0xpdGVyYWxcIiksIFxuICAgIC8vIE9ubHkgYWxsb3dlZCBpZiAuY29tcHV0ZWQgaXMgdHJ1ZS5cbiAgICBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLy8gY2xhc3NNZXRob2RPckRlY2xhcmVNZXRob2RDb21tb25cbiAgICAgICAgLmZpZWxkKFwia2luZFwiLCBvcihcImdldFwiLCBcInNldFwiLCBcIm1ldGhvZFwiLCBcImNvbnN0cnVjdG9yXCIpLCBmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gXCJtZXRob2RcIjsgfSlcbiAgICAgICAgLmZpZWxkKFwiYWNjZXNzXCIsIC8vIE5vdCBcImFjY2Vzc2liaWxpdHlcIj9cbiAgICBvcihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pXG4gICAgICAgIC5maWVsZChcImRlY29yYXRvcnNcIiwgb3IoW2RlZihcIkRlY29yYXRvclwiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC8vIHRTRnVuY3Rpb25UeXBlQW5ub3RhdGlvbkNvbW1vblxuICAgICAgICAuZmllbGQoXCJyZXR1cm5UeXBlXCIsIG9yKGRlZihcIlRTVHlwZUFubm90YXRpb25cIiksIGRlZihcIk5vb3BcIiksIC8vIFN0aWxsIHVzZWQ/XG4gICAgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNNYXBwZWRUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ0eXBlUGFyYW1ldGVyXCIsIFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwicmVhZG9ubHlcIiwgb3IoQm9vbGVhbiwgXCIrXCIsIFwiLVwiKSwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlclwiLCBkZWYoXCJUU1R5cGVQYXJhbWV0ZXJcIikpXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIG9yKEJvb2xlYW4sIFwiK1wiLCBcIi1cIiksIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIG9yKGRlZihcIlRTVHlwZVwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNUdXBsZVR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImVsZW1lbnRUeXBlc1wiKVxuICAgICAgICAuZmllbGQoXCJlbGVtZW50VHlwZXNcIiwgW29yKGRlZihcIlRTVHlwZVwiKSwgZGVmKFwiVFNOYW1lZFR1cGxlTWVtYmVyXCIpKV0pO1xuICAgIGRlZihcIlRTTmFtZWRUdXBsZU1lbWJlclwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwibGFiZWxcIiwgXCJlbGVtZW50VHlwZVwiLCBcIm9wdGlvbmFsXCIpXG4gICAgICAgIC5maWVsZChcImxhYmVsXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImVsZW1lbnRUeXBlXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgZGVmKFwiVFNSZXN0VHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiVFNUeXBlXCIpKTtcbiAgICBkZWYoXCJUU09wdGlvbmFsVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiVFNUeXBlXCIpKTtcbiAgICBkZWYoXCJUU0luZGV4ZWRBY2Nlc3NUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJvYmplY3RUeXBlXCIsIFwiaW5kZXhUeXBlXCIpXG4gICAgICAgIC5maWVsZChcIm9iamVjdFR5cGVcIiwgZGVmKFwiVFNUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJpbmRleFR5cGVcIiwgZGVmKFwiVFNUeXBlXCIpKTtcbiAgICBkZWYoXCJUU1R5cGVPcGVyYXRvclwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwib3BlcmF0b3JcIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgU3RyaW5nKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBkZWYoXCJUU1R5cGVcIikpO1xuICAgIGRlZihcIlRTVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBvcihkZWYoXCJUU1R5cGVcIiksIGRlZihcIlRTVHlwZUFubm90YXRpb25cIikpKTtcbiAgICBkZWYoXCJUU0luZGV4U2lnbmF0dXJlXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtZXRlcnNcIiwgXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJwYXJhbWV0ZXJzXCIsIFtkZWYoXCJJZGVudGlmaWVyXCIpXSkgLy8gTGVuZ3RoID09PSAxXG4gICAgICAgIC5maWVsZChcInJlYWRvbmx5XCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIlRTUHJvcGVydHlTaWduYXR1cmVcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJUU0hhc09wdGlvbmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIsIFwidHlwZUFubm90YXRpb25cIiwgXCJvcHRpb25hbFwiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwicmVhZG9ubHlcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiaW5pdGlhbGl6ZXJcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNNZXRob2RTaWduYXR1cmVcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlcnNcIiwgXCJUU0hhc09wdGlvbmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIsIFwicGFyYW1ldGVyc1wiLCBcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJwYXJhbWV0ZXJzXCIsIFBhcmFtZXRlcnNUeXBlKTtcbiAgICBkZWYoXCJUU1R5cGVQcmVkaWNhdGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlQW5ub3RhdGlvblwiLCBcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbWV0ZXJOYW1lXCIsIFwidHlwZUFubm90YXRpb25cIiwgXCJhc3NlcnRzXCIpXG4gICAgICAgIC5maWVsZChcInBhcmFtZXRlck5hbWVcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiVFNUaGlzVHlwZVwiKSkpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIG9yKGRlZihcIlRTVHlwZUFubm90YXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcImFzc2VydHNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgW1wiVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb25cIixcbiAgICAgICAgXCJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlTmFtZSkge1xuICAgICAgICBkZWYodHlwZU5hbWUpXG4gICAgICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVyc1wiLCBcIlRTSGFzT3B0aW9uYWxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAgICAgLmJ1aWxkKFwicGFyYW1ldGVyc1wiLCBcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgICAgICAuZmllbGQoXCJwYXJhbWV0ZXJzXCIsIFBhcmFtZXRlcnNUeXBlKTtcbiAgICB9KTtcbiAgICBkZWYoXCJUU0VudW1NZW1iZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImluaXRpYWxpemVyXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIFN0cmluZ0xpdGVyYWwpKVxuICAgICAgICAuZmllbGQoXCJpbml0aWFsaXplclwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJUU1R5cGVRdWVyeVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwck5hbWVcIilcbiAgICAgICAgLmZpZWxkKFwiZXhwck5hbWVcIiwgb3IoVFNFbnRpdHlOYW1lLCBkZWYoXCJUU0ltcG9ydFR5cGVcIikpKTtcbiAgICAvLyBJbmZlcnJlZCBmcm9tIEJhYnlsb24ncyB0c1BhcnNlVHlwZU1lbWJlciBtZXRob2QuXG4gICAgdmFyIFRTVHlwZU1lbWJlciA9IG9yKGRlZihcIlRTQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uXCIpLCBkZWYoXCJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXCIpLCBkZWYoXCJUU0luZGV4U2lnbmF0dXJlXCIpLCBkZWYoXCJUU01ldGhvZFNpZ25hdHVyZVwiKSwgZGVmKFwiVFNQcm9wZXJ0eVNpZ25hdHVyZVwiKSk7XG4gICAgZGVmKFwiVFNUeXBlTGl0ZXJhbFwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwibWVtYmVyc1wiKVxuICAgICAgICAuZmllbGQoXCJtZW1iZXJzXCIsIFtUU1R5cGVNZW1iZXJdKTtcbiAgICBkZWYoXCJUU1R5cGVQYXJhbWV0ZXJcIilcbiAgICAgICAgLmJhc2VzKFwiSWRlbnRpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIsIFwiY29uc3RyYWludFwiLCBcImRlZmF1bHRcIilcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBTdHJpbmcpXG4gICAgICAgIC5maWVsZChcImNvbnN0cmFpbnRcIiwgb3IoZGVmKFwiVFNUeXBlXCIpLCB2b2lkIDApLCBkZWZhdWx0c1tcInVuZGVmaW5lZFwiXSlcbiAgICAgICAgLmZpZWxkKFwiZGVmYXVsdFwiLCBvcihkZWYoXCJUU1R5cGVcIiksIHZvaWQgMCksIGRlZmF1bHRzW1widW5kZWZpbmVkXCJdKTtcbiAgICBkZWYoXCJUU1R5cGVBc3NlcnRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiLCBcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIiwgXCJleHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlRTVHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJleHRyYVwiLCBvcih7IHBhcmVudGhlc2l6ZWQ6IEJvb2xlYW4gfSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwicGFyYW1zXCIpXG4gICAgICAgIC5maWVsZChcInBhcmFtc1wiLCBbZGVmKFwiVFNUeXBlUGFyYW1ldGVyXCIpXSk7XG4gICAgZGVmKFwiVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtc1wiKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIlRTVHlwZVwiKV0pO1xuICAgIGRlZihcIlRTRW51bURlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwibWVtYmVyc1wiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJjb25zdFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJlXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcIm1lbWJlcnNcIiwgW2RlZihcIlRTRW51bU1lbWJlclwiKV0pXG4gICAgICAgIC5maWVsZChcImluaXRpYWxpemVyXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTVHlwZUFsaWFzRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlcnNcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJlXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgZGVmKFwiVFNNb2R1bGVCbG9ja1wiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbZGVmKFwiU3RhdGVtZW50XCIpXSk7XG4gICAgZGVmKFwiVFNNb2R1bGVEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgb3IoU3RyaW5nTGl0ZXJhbCwgVFNFbnRpdHlOYW1lKSlcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyZVwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJnbG9iYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBvcihkZWYoXCJUU01vZHVsZUJsb2NrXCIpLCBkZWYoXCJUU01vZHVsZURlY2xhcmF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJUU0ltcG9ydFR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIsIFwicXVhbGlmaWVyXCIsIFwidHlwZVBhcmFtZXRlcnNcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgU3RyaW5nTGl0ZXJhbClcbiAgICAgICAgLmZpZWxkKFwicXVhbGlmaWVyXCIsIG9yKFRTRW50aXR5TmFtZSwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pO1xuICAgIGRlZihcIlRTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJtb2R1bGVSZWZlcmVuY2VcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwiaXNFeHBvcnRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwibW9kdWxlUmVmZXJlbmNlXCIsIG9yKFRTRW50aXR5TmFtZSwgZGVmKFwiVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZVwiKSkpO1xuICAgIGRlZihcIlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2VcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIFN0cmluZ0xpdGVyYWwpO1xuICAgIGRlZihcIlRTRXhwb3J0QXNzaWdubWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiVFNJbnRlcmZhY2VCb2R5XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIFtUU1R5cGVNZW1iZXJdKTtcbiAgICBkZWYoXCJUU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50c1wiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiLCBcInR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25cIiwgVFNFbnRpdHlOYW1lKTtcbiAgICBkZWYoXCJUU0ludGVyZmFjZURlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBUU0VudGl0eU5hbWUpXG4gICAgICAgIC5maWVsZChcImRlY2xhcmVcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiZXh0ZW5kc1wiLCBvcihbZGVmKFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIlRTSW50ZXJmYWNlQm9keVwiKSk7XG4gICAgZGVmKFwiVFNQYXJhbWV0ZXJQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtZXRlclwiKVxuICAgICAgICAuZmllbGQoXCJhY2Nlc3NpYmlsaXR5XCIsIG9yKFwicHVibGljXCIsIFwicHJpdmF0ZVwiLCBcInByb3RlY3RlZFwiLCB2b2lkIDApLCBkZWZhdWx0c1tcInVuZGVmaW5lZFwiXSlcbiAgICAgICAgLmZpZWxkKFwicmVhZG9ubHlcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwicGFyYW1ldGVyXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpKSk7XG4gICAgZGVmKFwiQ2xhc3NQcm9wZXJ0eVwiKVxuICAgICAgICAuZmllbGQoXCJhY2Nlc3NcIiwgLy8gTm90IFwiYWNjZXNzaWJpbGl0eVwiP1xuICAgIG9yKFwicHVibGljXCIsIFwicHJpdmF0ZVwiLCBcInByb3RlY3RlZFwiLCB2b2lkIDApLCBkZWZhdWx0c1tcInVuZGVmaW5lZFwiXSk7XG4gICAgLy8gRGVmaW5lZCBhbHJlYWR5IGluIGVzNiBhbmQgYmFiZWwtY29yZS5cbiAgICBkZWYoXCJDbGFzc0JvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbb3IoZGVmKFwiTWV0aG9kRGVmaW5pdGlvblwiKSwgZGVmKFwiVmFyaWFibGVEZWNsYXJhdG9yXCIpLCBkZWYoXCJDbGFzc1Byb3BlcnR5RGVmaW5pdGlvblwiKSwgZGVmKFwiQ2xhc3NQcm9wZXJ0eVwiKSwgZGVmKFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIiksIGRlZihcIkNsYXNzTWV0aG9kXCIpLCBkZWYoXCJDbGFzc1ByaXZhdGVNZXRob2RcIiksIFxuICAgICAgICAvLyBKdXN0IG5lZWQgdG8gYWRkIHRoZXNlIHR5cGVzOlxuICAgICAgICBkZWYoXCJUU0RlY2xhcmVNZXRob2RcIiksIFRTVHlwZU1lbWJlcildKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbGliL3R5cGVzXCIpKTtcbnZhciBwYXRoX3Zpc2l0b3JfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2xpYi9wYXRoLXZpc2l0b3JcIikpO1xudmFyIGVxdWl2XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9saWIvZXF1aXZcIikpO1xudmFyIHBhdGhfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2xpYi9wYXRoXCIpKTtcbnZhciBub2RlX3BhdGhfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2xpYi9ub2RlLXBhdGhcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGRlZnMpIHtcbiAgICB2YXIgZm9yayA9IGNyZWF0ZUZvcmsoKTtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIGRlZnMuZm9yRWFjaChmb3JrLnVzZSk7XG4gICAgdHlwZXMuZmluYWxpemUoKTtcbiAgICB2YXIgUGF0aFZpc2l0b3IgPSBmb3JrLnVzZShwYXRoX3Zpc2l0b3JfMS5kZWZhdWx0KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBUeXBlOiB0eXBlcy5UeXBlLFxuICAgICAgICBidWlsdEluVHlwZXM6IHR5cGVzLmJ1aWx0SW5UeXBlcyxcbiAgICAgICAgbmFtZWRUeXBlczogdHlwZXMubmFtZWRUeXBlcyxcbiAgICAgICAgYnVpbGRlcnM6IHR5cGVzLmJ1aWxkZXJzLFxuICAgICAgICBkZWZpbmVNZXRob2Q6IHR5cGVzLmRlZmluZU1ldGhvZCxcbiAgICAgICAgZ2V0RmllbGROYW1lczogdHlwZXMuZ2V0RmllbGROYW1lcyxcbiAgICAgICAgZ2V0RmllbGRWYWx1ZTogdHlwZXMuZ2V0RmllbGRWYWx1ZSxcbiAgICAgICAgZWFjaEZpZWxkOiB0eXBlcy5lYWNoRmllbGQsXG4gICAgICAgIHNvbWVGaWVsZDogdHlwZXMuc29tZUZpZWxkLFxuICAgICAgICBnZXRTdXBlcnR5cGVOYW1lczogdHlwZXMuZ2V0U3VwZXJ0eXBlTmFtZXMsXG4gICAgICAgIGdldEJ1aWxkZXJOYW1lOiB0eXBlcy5nZXRCdWlsZGVyTmFtZSxcbiAgICAgICAgYXN0Tm9kZXNBcmVFcXVpdmFsZW50OiBmb3JrLnVzZShlcXVpdl8xLmRlZmF1bHQpLFxuICAgICAgICBmaW5hbGl6ZTogdHlwZXMuZmluYWxpemUsXG4gICAgICAgIFBhdGg6IGZvcmsudXNlKHBhdGhfMS5kZWZhdWx0KSxcbiAgICAgICAgTm9kZVBhdGg6IGZvcmsudXNlKG5vZGVfcGF0aF8xLmRlZmF1bHQpLFxuICAgICAgICBQYXRoVmlzaXRvcjogUGF0aFZpc2l0b3IsXG4gICAgICAgIHVzZTogZm9yay51c2UsXG4gICAgICAgIHZpc2l0OiBQYXRoVmlzaXRvci52aXNpdCxcbiAgICB9O1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xuZnVuY3Rpb24gY3JlYXRlRm9yaygpIHtcbiAgICB2YXIgdXNlZCA9IFtdO1xuICAgIHZhciB1c2VkUmVzdWx0ID0gW107XG4gICAgZnVuY3Rpb24gdXNlKHBsdWdpbikge1xuICAgICAgICB2YXIgaWR4ID0gdXNlZC5pbmRleE9mKHBsdWdpbik7XG4gICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICBpZHggPSB1c2VkLmxlbmd0aDtcbiAgICAgICAgICAgIHVzZWQucHVzaChwbHVnaW4pO1xuICAgICAgICAgICAgdXNlZFJlc3VsdFtpZHhdID0gcGx1Z2luKGZvcmspO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1c2VkUmVzdWx0W2lkeF07XG4gICAgfVxuICAgIHZhciBmb3JrID0geyB1c2U6IHVzZSB9O1xuICAgIHJldHVybiBmb3JrO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5uYW1lZFR5cGVzID0gdm9pZCAwO1xudmFyIG5hbWVkVHlwZXM7XG4oZnVuY3Rpb24gKG5hbWVkVHlwZXMpIHtcbn0pKG5hbWVkVHlwZXMgPSBleHBvcnRzLm5hbWVkVHlwZXMgfHwgKGV4cG9ydHMubmFtZWRUeXBlcyA9IHt9KSk7XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdHlwZXNcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBnZXRGaWVsZE5hbWVzID0gdHlwZXMuZ2V0RmllbGROYW1lcztcbiAgICB2YXIgZ2V0RmllbGRWYWx1ZSA9IHR5cGVzLmdldEZpZWxkVmFsdWU7XG4gICAgdmFyIGlzQXJyYXkgPSB0eXBlcy5idWlsdEluVHlwZXMuYXJyYXk7XG4gICAgdmFyIGlzT2JqZWN0ID0gdHlwZXMuYnVpbHRJblR5cGVzLm9iamVjdDtcbiAgICB2YXIgaXNEYXRlID0gdHlwZXMuYnVpbHRJblR5cGVzLkRhdGU7XG4gICAgdmFyIGlzUmVnRXhwID0gdHlwZXMuYnVpbHRJblR5cGVzLlJlZ0V4cDtcbiAgICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgICBmdW5jdGlvbiBhc3ROb2Rlc0FyZUVxdWl2YWxlbnQoYSwgYiwgcHJvYmxlbVBhdGgpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkuY2hlY2socHJvYmxlbVBhdGgpKSB7XG4gICAgICAgICAgICBwcm9ibGVtUGF0aC5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJvYmxlbVBhdGggPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmVFcXVpdmFsZW50KGEsIGIsIHByb2JsZW1QYXRoKTtcbiAgICB9XG4gICAgYXN0Tm9kZXNBcmVFcXVpdmFsZW50LmFzc2VydCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHZhciBwcm9ibGVtUGF0aCA9IFtdO1xuICAgICAgICBpZiAoIWFzdE5vZGVzQXJlRXF1aXZhbGVudChhLCBiLCBwcm9ibGVtUGF0aCkpIHtcbiAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoYSAhPT0gYikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVzIGRpZmZlciBpbiB0aGUgZm9sbG93aW5nIHBhdGg6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgcHJvYmxlbVBhdGgubWFwKHN1YnNjcmlwdEZvclByb3BlcnR5KS5qb2luKFwiXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgZnVuY3Rpb24gc3Vic2NyaXB0Rm9yUHJvcGVydHkocHJvcGVydHkpIHtcbiAgICAgICAgaWYgKC9bXyRhLXpdW18kYS16MC05XSovaS50ZXN0KHByb3BlcnR5KSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiLlwiICsgcHJvcGVydHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiW1wiICsgSlNPTi5zdHJpbmdpZnkocHJvcGVydHkpICsgXCJdXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFyZUVxdWl2YWxlbnQoYSwgYiwgcHJvYmxlbVBhdGgpIHtcbiAgICAgICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FycmF5LmNoZWNrKGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyYXlzQXJlRXF1aXZhbGVudChhLCBiLCBwcm9ibGVtUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT2JqZWN0LmNoZWNrKGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0c0FyZUVxdWl2YWxlbnQoYSwgYiwgcHJvYmxlbVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RhdGUuY2hlY2soYSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpc0RhdGUuY2hlY2soYikgJiYgKCthID09PSArYik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUmVnRXhwLmNoZWNrKGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNSZWdFeHAuY2hlY2soYikgJiYgKGEuc291cmNlID09PSBiLnNvdXJjZSAmJlxuICAgICAgICAgICAgICAgIGEuZ2xvYmFsID09PSBiLmdsb2JhbCAmJlxuICAgICAgICAgICAgICAgIGEubXVsdGlsaW5lID09PSBiLm11bHRpbGluZSAmJlxuICAgICAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYSA9PSBiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhcnJheXNBcmVFcXVpdmFsZW50KGEsIGIsIHByb2JsZW1QYXRoKSB7XG4gICAgICAgIGlzQXJyYXkuYXNzZXJ0KGEpO1xuICAgICAgICB2YXIgYUxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgICBpZiAoIWlzQXJyYXkuY2hlY2soYikgfHwgYi5sZW5ndGggIT09IGFMZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgICAgIHByb2JsZW1QYXRoLnB1c2goXCJsZW5ndGhcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhTGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgICAgIHByb2JsZW1QYXRoLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSBpbiBhICE9PSBpIGluIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFyZUVxdWl2YWxlbnQoYVtpXSwgYltpXSwgcHJvYmxlbVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb2JsZW1QYXRoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb2JsZW1QYXRoVGFpbCA9IHByb2JsZW1QYXRoLnBvcCgpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aFRhaWwgIT09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIgKyBwcm9ibGVtUGF0aFRhaWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb2JqZWN0c0FyZUVxdWl2YWxlbnQoYSwgYiwgcHJvYmxlbVBhdGgpIHtcbiAgICAgICAgaXNPYmplY3QuYXNzZXJ0KGEpO1xuICAgICAgICBpZiAoIWlzT2JqZWN0LmNoZWNrKGIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFzdCBwYXRoIGZvciBhIGNvbW1vbiBwcm9wZXJ0eSBvZiBBU1Qgbm9kZXMuXG4gICAgICAgIGlmIChhLnR5cGUgIT09IGIudHlwZSkge1xuICAgICAgICAgICAgaWYgKHByb2JsZW1QYXRoKSB7XG4gICAgICAgICAgICAgICAgcHJvYmxlbVBhdGgucHVzaChcInR5cGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFOYW1lcyA9IGdldEZpZWxkTmFtZXMoYSk7XG4gICAgICAgIHZhciBhTmFtZUNvdW50ID0gYU5hbWVzLmxlbmd0aDtcbiAgICAgICAgdmFyIGJOYW1lcyA9IGdldEZpZWxkTmFtZXMoYik7XG4gICAgICAgIHZhciBiTmFtZUNvdW50ID0gYk5hbWVzLmxlbmd0aDtcbiAgICAgICAgaWYgKGFOYW1lQ291bnQgPT09IGJOYW1lQ291bnQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYU5hbWVDb3VudDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBhTmFtZXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGFDaGlsZCA9IGdldEZpZWxkVmFsdWUoYSwgbmFtZSk7XG4gICAgICAgICAgICAgICAgdmFyIGJDaGlsZCA9IGdldEZpZWxkVmFsdWUoYiwgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHByb2JsZW1QYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2JsZW1QYXRoLnB1c2gobmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghYXJlRXF1aXZhbGVudChhQ2hpbGQsIGJDaGlsZCwgcHJvYmxlbVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb2JsZW1QYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9ibGVtUGF0aFRhaWwgPSBwcm9ibGVtUGF0aC5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2JsZW1QYXRoVGFpbCAhPT0gbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIgKyBwcm9ibGVtUGF0aFRhaWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmNlIGFOYW1lQ291bnQgIT09IGJOYW1lQ291bnQsIHdlIG5lZWQgdG8gZmluZCBzb21lIG5hbWUgdGhhdCdzXG4gICAgICAgIC8vIG1pc3NpbmcgaW4gYU5hbWVzIGJ1dCBwcmVzZW50IGluIGJOYW1lcywgb3IgdmljZS12ZXJzYS5cbiAgICAgICAgdmFyIHNlZW5OYW1lcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhTmFtZUNvdW50OyArK2kpIHtcbiAgICAgICAgICAgIHNlZW5OYW1lc1thTmFtZXNbaV1dID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYk5hbWVDb3VudDsgKytpKSB7XG4gICAgICAgICAgICBuYW1lID0gYk5hbWVzW2ldO1xuICAgICAgICAgICAgaWYgKCFoYXNPd24uY2FsbChzZWVuTmFtZXMsIG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcHJvYmxlbVBhdGgucHVzaChuYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgc2Vlbk5hbWVzW25hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobmFtZSBpbiBzZWVuTmFtZXMpIHtcbiAgICAgICAgICAgIHByb2JsZW1QYXRoLnB1c2gobmFtZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBhc3ROb2Rlc0FyZUVxdWl2YWxlbnQ7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3R5cGVzXCIpKTtcbnZhciBwYXRoXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXRoXCIpKTtcbnZhciBzY29wZV8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vc2NvcGVcIikpO1xuZnVuY3Rpb24gbm9kZVBhdGhQbHVnaW4oZm9yaykge1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIG4gPSB0eXBlcy5uYW1lZFR5cGVzO1xuICAgIHZhciBiID0gdHlwZXMuYnVpbGRlcnM7XG4gICAgdmFyIGlzTnVtYmVyID0gdHlwZXMuYnVpbHRJblR5cGVzLm51bWJlcjtcbiAgICB2YXIgaXNBcnJheSA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5hcnJheTtcbiAgICB2YXIgUGF0aCA9IGZvcmsudXNlKHBhdGhfMS5kZWZhdWx0KTtcbiAgICB2YXIgU2NvcGUgPSBmb3JrLnVzZShzY29wZV8xLmRlZmF1bHQpO1xuICAgIHZhciBOb2RlUGF0aCA9IGZ1bmN0aW9uIE5vZGVQYXRoKHZhbHVlLCBwYXJlbnRQYXRoLCBuYW1lKSB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVQYXRoIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBpbnZva2VkIHdpdGhvdXQgJ25ldydcIik7XG4gICAgICAgIH1cbiAgICAgICAgUGF0aC5jYWxsKHRoaXMsIHZhbHVlLCBwYXJlbnRQYXRoLCBuYW1lKTtcbiAgICB9O1xuICAgIHZhciBOUHAgPSBOb2RlUGF0aC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFBhdGgucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgICB2YWx1ZTogTm9kZVBhdGgsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhOUHAsIHtcbiAgICAgICAgbm9kZToge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibm9kZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2NvbXB1dGVOb2RlKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInBhcmVudFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2NvbXB1dGVQYXJlbnQoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNjb3BlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5fY29tcHV0ZVNjb3BlKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY29wZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIE5QcC5yZXBsYWNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBkZWxldGUgdGhpcy5ub2RlO1xuICAgICAgICBkZWxldGUgdGhpcy5wYXJlbnQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNjb3BlO1xuICAgICAgICByZXR1cm4gUGF0aC5wcm90b3R5cGUucmVwbGFjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgTlBwLnBydW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVtYWluaW5nTm9kZVBhdGggPSB0aGlzLnBhcmVudDtcbiAgICAgICAgdGhpcy5yZXBsYWNlKCk7XG4gICAgICAgIHJldHVybiBjbGVhblVwTm9kZXNBZnRlclBydW5lKHJlbWFpbmluZ05vZGVQYXRoKTtcbiAgICB9O1xuICAgIC8vIFRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgYW5jZXN0b3IgUGF0aCB3aG9zZSB2YWx1ZSBpcyBhIE5vZGUuXG4gICAgTlBwLl9jb21wdXRlTm9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKG4uTm9kZS5jaGVjayh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHAgPSB0aGlzLnBhcmVudFBhdGg7XG4gICAgICAgIHJldHVybiBwcCAmJiBwcC5ub2RlIHx8IG51bGw7XG4gICAgfTtcbiAgICAvLyBUaGUgZmlyc3QgYW5jZXN0b3IgUGF0aCB3aG9zZSB2YWx1ZSBpcyBhIE5vZGUgZGlzdGluY3QgZnJvbSB0aGlzLm5vZGUuXG4gICAgTlBwLl9jb21wdXRlUGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICB2YXIgcHAgPSB0aGlzLnBhcmVudFBhdGg7XG4gICAgICAgIGlmICghbi5Ob2RlLmNoZWNrKHZhbHVlKSkge1xuICAgICAgICAgICAgd2hpbGUgKHBwICYmICFuLk5vZGUuY2hlY2socHAudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcHAgPSBwcC5wYXJlbnRQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBwKSB7XG4gICAgICAgICAgICAgICAgcHAgPSBwcC5wYXJlbnRQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChwcCAmJiAhbi5Ob2RlLmNoZWNrKHBwLnZhbHVlKSkge1xuICAgICAgICAgICAgcHAgPSBwcC5wYXJlbnRQYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcCB8fCBudWxsO1xuICAgIH07XG4gICAgLy8gVGhlIGNsb3Nlc3QgZW5jbG9zaW5nIHNjb3BlIHRoYXQgZ292ZXJucyB0aGlzIG5vZGUuXG4gICAgTlBwLl9jb21wdXRlU2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIHZhciBwcCA9IHRoaXMucGFyZW50UGF0aDtcbiAgICAgICAgdmFyIHNjb3BlID0gcHAgJiYgcHAuc2NvcGU7XG4gICAgICAgIGlmIChuLk5vZGUuY2hlY2sodmFsdWUpICYmXG4gICAgICAgICAgICBTY29wZS5pc0VzdGFibGlzaGVkQnkodmFsdWUpKSB7XG4gICAgICAgICAgICBzY29wZSA9IG5ldyBTY29wZSh0aGlzLCBzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjb3BlIHx8IG51bGw7XG4gICAgfTtcbiAgICBOUHAuZ2V0VmFsdWVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0eXBlcy5nZXRGaWVsZFZhbHVlKHRoaXMudmFsdWUsIG5hbWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcy5ub2RlIG5lZWRzIHRvIGJlIHdyYXBwZWQgaW4gcGFyZW50aGVzZXMgaW4gb3JkZXJcbiAgICAgKiBmb3IgYSBwYXJzZXIgdG8gcmVwcm9kdWNlIHRoZSBzYW1lIGxvY2FsIEFTVCBzdHJ1Y3R1cmUuXG4gICAgICpcbiAgICAgKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBleHByZXNzaW9uIGAoMSArIDIpICogM2AsIHRoZSBCaW5hcnlFeHByZXNzaW9uXG4gICAgICogd2hvc2Ugb3BlcmF0b3IgaXMgXCIrXCIgbmVlZHMgcGFyZW50aGVzZXMsIGJlY2F1c2UgYDEgKyAyICogM2Agd291bGRcbiAgICAgKiBwYXJzZSBkaWZmZXJlbnRseS5cbiAgICAgKlxuICAgICAqIElmIGFzc3VtZUV4cHJlc3Npb25Db250ZXh0ID09PSB0cnVlLCB3ZSBkb24ndCB3b3JyeSBhYm91dCBlZGdlIGNhc2VzXG4gICAgICogbGlrZSBhbiBhbm9ueW1vdXMgRnVuY3Rpb25FeHByZXNzaW9uIGFwcGVhcmluZyBsZXhpY2FsbHkgZmlyc3QgaW4gaXRzXG4gICAgICogZW5jbG9zaW5nIHN0YXRlbWVudCBhbmQgdGh1cyBuZWVkaW5nIHBhcmVudGhlc2VzIHRvIGF2b2lkIGJlaW5nIHBhcnNlZFxuICAgICAqIGFzIGEgRnVuY3Rpb25EZWNsYXJhdGlvbiB3aXRoIGEgbWlzc2luZyBuYW1lLlxuICAgICAqL1xuICAgIE5QcC5uZWVkc1BhcmVucyA9IGZ1bmN0aW9uIChhc3N1bWVFeHByZXNzaW9uQ29udGV4dCkge1xuICAgICAgICB2YXIgcHAgPSB0aGlzLnBhcmVudFBhdGg7XG4gICAgICAgIGlmICghcHApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbm9kZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIC8vIE9ubHkgZXhwcmVzc2lvbnMgbmVlZCBwYXJlbnRoZXNlcy5cbiAgICAgICAgaWYgKCFuLkV4cHJlc3Npb24uY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZGVudGlmaWVycyBuZXZlciBuZWVkIHBhcmVudGhlc2VzLlxuICAgICAgICBpZiAobm9kZS50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICghbi5Ob2RlLmNoZWNrKHBwLnZhbHVlKSkge1xuICAgICAgICAgICAgcHAgPSBwcC5wYXJlbnRQYXRoO1xuICAgICAgICAgICAgaWYgKCFwcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50ID0gcHAudmFsdWU7XG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwiU3ByZWFkRWxlbWVudFwiOlxuICAgICAgICAgICAgY2FzZSBcIlNwcmVhZFByb3BlcnR5XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIlxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5hbWUgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgcGFyZW50Lm9iamVjdCA9PT0gbm9kZTtcbiAgICAgICAgICAgIGNhc2UgXCJCaW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwiTG9naWNhbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA9PT0gXCJjYWxsZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBhcmVudC5jYWxsZWUgPT09IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNwcmVhZFByb3BlcnR5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWUgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXJlbnQub2JqZWN0ID09PSBub2RlO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQmluYXJ5RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTG9naWNhbEV4cHJlc3Npb25cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5fMSA9IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG8gPSBwYXJlbnQub3BlcmF0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHBfMSA9IFBSRUNFREVOQ0VbcG9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vID0gbl8xLm9wZXJhdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5wID0gUFJFQ0VERU5DRVtub107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHBfMSA+IG5wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHBfMSA9PT0gbnAgJiYgdGhpcy5uYW1lID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnJpZ2h0ICE9PSBuXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZXMgbXVzdCBiZSBlcXVhbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiU2VxdWVuY2VFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRm9yU3RhdGVtZW50XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHRob3VnaCBwYXJlbnRoZXNlcyB3b3VsZG4ndCBodXJ0IGFyb3VuZCBzZXF1ZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwcmVzc2lvbnMgaW4gdGhlIGhlYWQgb2YgZm9yIGxvb3BzLCB0cmFkaXRpb25hbCBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGljdGF0ZXMgdGhhdCBlLmcuIGkrKywgaisrIHNob3VsZCBub3QgYmUgd3JhcHBlZCB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnRoZXNlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWUgIT09IFwiZXhwcmVzc2lvblwiO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGVyciBvbiB0aGUgc2lkZSBvZiBvdmVycGFyZW50aGVzaXphdGlvbiwgYWRkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBleGNlcHRpb25zIGFib3ZlIGlmIHRoaXMgcHJvdmVzIG92ZXJ6ZWFsb3VzLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcIllpZWxkRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkJpbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNwcmVhZFByb3BlcnR5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTmV3RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJZaWVsZEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJMaXRlcmFsXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIlxuICAgICAgICAgICAgICAgICAgICAmJiBpc051bWJlci5jaGVjayhub2RlLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5hbWUgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgcGFyZW50Lm9iamVjdCA9PT0gbm9kZTtcbiAgICAgICAgICAgIGNhc2UgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgY2FzZSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVuYXJ5RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiU3ByZWFkRWxlbWVudFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiU3ByZWFkUHJvcGVydHlcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkJpbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNhbGxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lID09PSBcImNhbGxlZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGFyZW50LmNhbGxlZSA9PT0gbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA9PT0gXCJ0ZXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXJlbnQudGVzdCA9PT0gbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWUgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXJlbnQub2JqZWN0ID09PSBub2RlO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSBcIk5ld0V4cHJlc3Npb25cIiAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPT09IFwiY2FsbGVlXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmNhbGxlZSA9PT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNDYWxsRXhwcmVzc2lvbihub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzc3VtZUV4cHJlc3Npb25Db250ZXh0ICE9PSB0cnVlICYmXG4gICAgICAgICAgICAhdGhpcy5jYW5CZUZpcnN0SW5TdGF0ZW1lbnQoKSAmJlxuICAgICAgICAgICAgdGhpcy5maXJzdEluU3RhdGVtZW50KCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgZnVuY3Rpb24gaXNCaW5hcnkobm9kZSkge1xuICAgICAgICByZXR1cm4gbi5CaW5hcnlFeHByZXNzaW9uLmNoZWNrKG5vZGUpXG4gICAgICAgICAgICB8fCBuLkxvZ2ljYWxFeHByZXNzaW9uLmNoZWNrKG5vZGUpO1xuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlICdpc1VuYXJ5TGlrZScgaXMgZGVjbGFyZWQgYnV0IGl0cyB2YWx1ZSBpcyBuZXZlciByZWFkLiBbNjEzM11cbiAgICBmdW5jdGlvbiBpc1VuYXJ5TGlrZShub2RlKSB7XG4gICAgICAgIHJldHVybiBuLlVuYXJ5RXhwcmVzc2lvbi5jaGVjayhub2RlKVxuICAgICAgICAgICAgLy8gSSBjb25zaWRlcmVkIG1ha2luZyBTcHJlYWRFbGVtZW50IGFuZCBTcHJlYWRQcm9wZXJ0eSBzdWJ0eXBlc1xuICAgICAgICAgICAgLy8gb2YgVW5hcnlFeHByZXNzaW9uLCBidXQgdGhleSdyZSBub3QgcmVhbGx5IEV4cHJlc3Npb24gbm9kZXMuXG4gICAgICAgICAgICB8fCAobi5TcHJlYWRFbGVtZW50ICYmIG4uU3ByZWFkRWxlbWVudC5jaGVjayhub2RlKSlcbiAgICAgICAgICAgIHx8IChuLlNwcmVhZFByb3BlcnR5ICYmIG4uU3ByZWFkUHJvcGVydHkuY2hlY2sobm9kZSkpO1xuICAgIH1cbiAgICB2YXIgUFJFQ0VERU5DRSA9IHt9O1xuICAgIFtbXCJ8fFwiXSxcbiAgICAgICAgW1wiJiZcIl0sXG4gICAgICAgIFtcInxcIl0sXG4gICAgICAgIFtcIl5cIl0sXG4gICAgICAgIFtcIiZcIl0sXG4gICAgICAgIFtcIj09XCIsIFwiPT09XCIsIFwiIT1cIiwgXCIhPT1cIl0sXG4gICAgICAgIFtcIjxcIiwgXCI+XCIsIFwiPD1cIiwgXCI+PVwiLCBcImluXCIsIFwiaW5zdGFuY2VvZlwiXSxcbiAgICAgICAgW1wiPj5cIiwgXCI8PFwiLCBcIj4+PlwiXSxcbiAgICAgICAgW1wiK1wiLCBcIi1cIl0sXG4gICAgICAgIFtcIipcIiwgXCIvXCIsIFwiJVwiXVxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAodGllciwgaSkge1xuICAgICAgICB0aWVyLmZvckVhY2goZnVuY3Rpb24gKG9wKSB7XG4gICAgICAgICAgICBQUkVDRURFTkNFW29wXSA9IGk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGNvbnRhaW5zQ2FsbEV4cHJlc3Npb24obm9kZSkge1xuICAgICAgICBpZiAobi5DYWxsRXhwcmVzc2lvbi5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQXJyYXkuY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLnNvbWUoY29udGFpbnNDYWxsRXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4uTm9kZS5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVzLnNvbWVGaWVsZChub2RlLCBmdW5jdGlvbiAoX25hbWUsIGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zQ2FsbEV4cHJlc3Npb24oY2hpbGQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBOUHAuY2FuQmVGaXJzdEluU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZTtcbiAgICAgICAgcmV0dXJuICFuLkZ1bmN0aW9uRXhwcmVzc2lvbi5jaGVjayhub2RlKVxuICAgICAgICAgICAgJiYgIW4uT2JqZWN0RXhwcmVzc2lvbi5jaGVjayhub2RlKTtcbiAgICB9O1xuICAgIE5QcC5maXJzdEluU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmlyc3RJblN0YXRlbWVudCh0aGlzKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGZpcnN0SW5TdGF0ZW1lbnQocGF0aCkge1xuICAgICAgICBmb3IgKHZhciBub2RlLCBwYXJlbnQ7IHBhdGgucGFyZW50OyBwYXRoID0gcGF0aC5wYXJlbnQpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXRoLm5vZGU7XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXRoLnBhcmVudC5ub2RlO1xuICAgICAgICAgICAgaWYgKG4uQmxvY2tTdGF0ZW1lbnQuY2hlY2socGFyZW50KSAmJlxuICAgICAgICAgICAgICAgIHBhdGgucGFyZW50Lm5hbWUgPT09IFwiYm9keVwiICYmXG4gICAgICAgICAgICAgICAgcGF0aC5uYW1lID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5ib2R5WzBdICE9PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVzIG11c3QgYmUgZXF1YWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG4uRXhwcmVzc2lvblN0YXRlbWVudC5jaGVjayhwYXJlbnQpICYmXG4gICAgICAgICAgICAgICAgcGF0aC5uYW1lID09PSBcImV4cHJlc3Npb25cIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuZXhwcmVzc2lvbiAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLlNlcXVlbmNlRXhwcmVzc2lvbi5jaGVjayhwYXJlbnQpICYmXG4gICAgICAgICAgICAgICAgcGF0aC5wYXJlbnQubmFtZSA9PT0gXCJleHByZXNzaW9uc1wiICYmXG4gICAgICAgICAgICAgICAgcGF0aC5uYW1lID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5leHByZXNzaW9uc1swXSAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLkNhbGxFeHByZXNzaW9uLmNoZWNrKHBhcmVudCkgJiZcbiAgICAgICAgICAgICAgICBwYXRoLm5hbWUgPT09IFwiY2FsbGVlXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNhbGxlZSAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLk1lbWJlckV4cHJlc3Npb24uY2hlY2socGFyZW50KSAmJlxuICAgICAgICAgICAgICAgIHBhdGgubmFtZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQub2JqZWN0ICE9PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVzIG11c3QgYmUgZXF1YWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG4uQ29uZGl0aW9uYWxFeHByZXNzaW9uLmNoZWNrKHBhcmVudCkgJiZcbiAgICAgICAgICAgICAgICBwYXRoLm5hbWUgPT09IFwidGVzdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC50ZXN0ICE9PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVzIG11c3QgYmUgZXF1YWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQmluYXJ5KHBhcmVudCkgJiZcbiAgICAgICAgICAgICAgICBwYXRoLm5hbWUgPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5sZWZ0ICE9PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVzIG11c3QgYmUgZXF1YWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG4uVW5hcnlFeHByZXNzaW9uLmNoZWNrKHBhcmVudCkgJiZcbiAgICAgICAgICAgICAgICAhcGFyZW50LnByZWZpeCAmJlxuICAgICAgICAgICAgICAgIHBhdGgubmFtZSA9PT0gXCJhcmd1bWVudFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5hcmd1bWVudCAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJ1bmluZyBjZXJ0YWluIG5vZGVzIHdpbGwgcmVzdWx0IGluIGVtcHR5IG9yIGluY29tcGxldGUgbm9kZXMsIGhlcmUgd2UgY2xlYW4gdGhvc2Ugbm9kZXMgdXAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xlYW5VcE5vZGVzQWZ0ZXJQcnVuZShyZW1haW5pbmdOb2RlUGF0aCkge1xuICAgICAgICBpZiAobi5WYXJpYWJsZURlY2xhcmF0aW9uLmNoZWNrKHJlbWFpbmluZ05vZGVQYXRoLm5vZGUpKSB7XG4gICAgICAgICAgICB2YXIgZGVjbGFyYXRpb25zID0gcmVtYWluaW5nTm9kZVBhdGguZ2V0KCdkZWNsYXJhdGlvbnMnKS52YWx1ZTtcbiAgICAgICAgICAgIGlmICghZGVjbGFyYXRpb25zIHx8IGRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVtYWluaW5nTm9kZVBhdGgucHJ1bmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuLkV4cHJlc3Npb25TdGF0ZW1lbnQuY2hlY2socmVtYWluaW5nTm9kZVBhdGgubm9kZSkpIHtcbiAgICAgICAgICAgIGlmICghcmVtYWluaW5nTm9kZVBhdGguZ2V0KCdleHByZXNzaW9uJykudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVtYWluaW5nTm9kZVBhdGgucHJ1bmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuLklmU3RhdGVtZW50LmNoZWNrKHJlbWFpbmluZ05vZGVQYXRoLm5vZGUpKSB7XG4gICAgICAgICAgICBjbGVhblVwSWZTdGF0ZW1lbnRBZnRlclBydW5lKHJlbWFpbmluZ05vZGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVtYWluaW5nTm9kZVBhdGg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsZWFuVXBJZlN0YXRlbWVudEFmdGVyUHJ1bmUoaWZTdGF0ZW1lbnQpIHtcbiAgICAgICAgdmFyIHRlc3RFeHByZXNzaW9uID0gaWZTdGF0ZW1lbnQuZ2V0KCd0ZXN0JykudmFsdWU7XG4gICAgICAgIHZhciBhbHRlcm5hdGUgPSBpZlN0YXRlbWVudC5nZXQoJ2FsdGVybmF0ZScpLnZhbHVlO1xuICAgICAgICB2YXIgY29uc2VxdWVudCA9IGlmU3RhdGVtZW50LmdldCgnY29uc2VxdWVudCcpLnZhbHVlO1xuICAgICAgICBpZiAoIWNvbnNlcXVlbnQgJiYgIWFsdGVybmF0ZSkge1xuICAgICAgICAgICAgdmFyIHRlc3RFeHByZXNzaW9uU3RhdGVtZW50ID0gYi5leHByZXNzaW9uU3RhdGVtZW50KHRlc3RFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIGlmU3RhdGVtZW50LnJlcGxhY2UodGVzdEV4cHJlc3Npb25TdGF0ZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFjb25zZXF1ZW50ICYmIGFsdGVybmF0ZSkge1xuICAgICAgICAgICAgdmFyIG5lZ2F0ZWRUZXN0RXhwcmVzc2lvbiA9IGIudW5hcnlFeHByZXNzaW9uKCchJywgdGVzdEV4cHJlc3Npb24sIHRydWUpO1xuICAgICAgICAgICAgaWYgKG4uVW5hcnlFeHByZXNzaW9uLmNoZWNrKHRlc3RFeHByZXNzaW9uKSAmJiB0ZXN0RXhwcmVzc2lvbi5vcGVyYXRvciA9PT0gJyEnKSB7XG4gICAgICAgICAgICAgICAgbmVnYXRlZFRlc3RFeHByZXNzaW9uID0gdGVzdEV4cHJlc3Npb24uYXJndW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZlN0YXRlbWVudC5nZXQoXCJ0ZXN0XCIpLnJlcGxhY2UobmVnYXRlZFRlc3RFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIGlmU3RhdGVtZW50LmdldChcImNvbnNlcXVlbnRcIikucmVwbGFjZShhbHRlcm5hdGUpO1xuICAgICAgICAgICAgaWZTdGF0ZW1lbnQuZ2V0KFwiYWx0ZXJuYXRlXCIpLnJlcGxhY2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTm9kZVBhdGg7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBub2RlUGF0aFBsdWdpbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdHlwZXNcIikpO1xudmFyIG5vZGVfcGF0aF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbm9kZS1wYXRoXCIpKTtcbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuZnVuY3Rpb24gcGF0aFZpc2l0b3JQbHVnaW4oZm9yaykge1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIE5vZGVQYXRoID0gZm9yay51c2Uobm9kZV9wYXRoXzEuZGVmYXVsdCk7XG4gICAgdmFyIGlzQXJyYXkgPSB0eXBlcy5idWlsdEluVHlwZXMuYXJyYXk7XG4gICAgdmFyIGlzT2JqZWN0ID0gdHlwZXMuYnVpbHRJblR5cGVzLm9iamVjdDtcbiAgICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5mdW5jdGlvbjtcbiAgICB2YXIgdW5kZWZpbmVkO1xuICAgIHZhciBQYXRoVmlzaXRvciA9IGZ1bmN0aW9uIFBhdGhWaXNpdG9yKCkge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGF0aFZpc2l0b3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoVmlzaXRvciBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgaW52b2tlZCB3aXRob3V0ICduZXcnXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBlcm1hbmVudCBzdGF0ZS5cbiAgICAgICAgdGhpcy5fcmV1c2FibGVDb250ZXh0U3RhY2sgPSBbXTtcbiAgICAgICAgdGhpcy5fbWV0aG9kTmFtZVRhYmxlID0gY29tcHV0ZU1ldGhvZE5hbWVUYWJsZSh0aGlzKTtcbiAgICAgICAgdGhpcy5fc2hvdWxkVmlzaXRDb21tZW50cyA9XG4gICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLl9tZXRob2ROYW1lVGFibGUsIFwiQmxvY2tcIikgfHxcbiAgICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLl9tZXRob2ROYW1lVGFibGUsIFwiTGluZVwiKTtcbiAgICAgICAgdGhpcy5Db250ZXh0ID0gbWFrZUNvbnRleHRDb25zdHJ1Y3Rvcih0aGlzKTtcbiAgICAgICAgLy8gU3RhdGUgcmVzZXQgZXZlcnkgdGltZSBQYXRoVmlzaXRvci5wcm90b3R5cGUudmlzaXQgaXMgY2FsbGVkLlxuICAgICAgICB0aGlzLl92aXNpdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jaGFuZ2VSZXBvcnRlZCA9IGZhbHNlO1xuICAgIH07XG4gICAgZnVuY3Rpb24gY29tcHV0ZU1ldGhvZE5hbWVUYWJsZSh2aXNpdG9yKSB7XG4gICAgICAgIHZhciB0eXBlTmFtZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKHZhciBtZXRob2ROYW1lIGluIHZpc2l0b3IpIHtcbiAgICAgICAgICAgIGlmICgvXnZpc2l0W0EtWl0vLnRlc3QobWV0aG9kTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0eXBlTmFtZXNbbWV0aG9kTmFtZS5zbGljZShcInZpc2l0XCIubGVuZ3RoKV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBzdXBlcnR5cGVUYWJsZSA9IHR5cGVzLmNvbXB1dGVTdXBlcnR5cGVMb29rdXBUYWJsZSh0eXBlTmFtZXMpO1xuICAgICAgICB2YXIgbWV0aG9kTmFtZVRhYmxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdmFyIHR5cGVOYW1lS2V5cyA9IE9iamVjdC5rZXlzKHN1cGVydHlwZVRhYmxlKTtcbiAgICAgICAgdmFyIHR5cGVOYW1lQ291bnQgPSB0eXBlTmFtZUtleXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVOYW1lQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgdmFyIHR5cGVOYW1lID0gdHlwZU5hbWVLZXlzW2ldO1xuICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFwidmlzaXRcIiArIHN1cGVydHlwZVRhYmxlW3R5cGVOYW1lXTtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uLmNoZWNrKHZpc2l0b3JbbWV0aG9kTmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kTmFtZVRhYmxlW3R5cGVOYW1lXSA9IG1ldGhvZE5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWVUYWJsZTtcbiAgICB9XG4gICAgUGF0aFZpc2l0b3IuZnJvbU1ldGhvZHNPYmplY3QgPSBmdW5jdGlvbiBmcm9tTWV0aG9kc09iamVjdChtZXRob2RzKSB7XG4gICAgICAgIGlmIChtZXRob2RzIGluc3RhbmNlb2YgUGF0aFZpc2l0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXRob2RzO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNPYmplY3QuY2hlY2sobWV0aG9kcykpIHtcbiAgICAgICAgICAgIC8vIEFuIGVtcHR5IHZpc2l0b3I/XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhdGhWaXNpdG9yO1xuICAgICAgICB9XG4gICAgICAgIHZhciBWaXNpdG9yID0gZnVuY3Rpb24gVmlzaXRvcigpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBWaXNpdG9yKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlZpc2l0b3IgY29uc3RydWN0b3IgY2Fubm90IGJlIGludm9rZWQgd2l0aG91dCAnbmV3J1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFBhdGhWaXNpdG9yLmNhbGwodGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBWcCA9IFZpc2l0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShQVnApO1xuICAgICAgICBWcC5jb25zdHJ1Y3RvciA9IFZpc2l0b3I7XG4gICAgICAgIGV4dGVuZChWcCwgbWV0aG9kcyk7XG4gICAgICAgIGV4dGVuZChWaXNpdG9yLCBQYXRoVmlzaXRvcik7XG4gICAgICAgIGlzRnVuY3Rpb24uYXNzZXJ0KFZpc2l0b3IuZnJvbU1ldGhvZHNPYmplY3QpO1xuICAgICAgICBpc0Z1bmN0aW9uLmFzc2VydChWaXNpdG9yLnZpc2l0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBWaXNpdG9yO1xuICAgIH07XG4gICAgZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG4gICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKHNvdXJjZSwgcHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5XSA9IHNvdXJjZVtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgUGF0aFZpc2l0b3IudmlzaXQgPSBmdW5jdGlvbiB2aXNpdChub2RlLCBtZXRob2RzKSB7XG4gICAgICAgIHJldHVybiBQYXRoVmlzaXRvci5mcm9tTWV0aG9kc09iamVjdChtZXRob2RzKS52aXNpdChub2RlKTtcbiAgICB9O1xuICAgIHZhciBQVnAgPSBQYXRoVmlzaXRvci5wcm90b3R5cGU7XG4gICAgUFZwLnZpc2l0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fdmlzaXRpbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlY3Vyc2l2ZWx5IGNhbGxpbmcgdmlzaXRvci52aXNpdChwYXRoKSByZXNldHMgdmlzaXRvciBzdGF0ZS4gXCIgK1xuICAgICAgICAgICAgICAgIFwiVHJ5IHRoaXMudmlzaXQocGF0aCkgb3IgdGhpcy50cmF2ZXJzZShwYXRoKSBpbnN0ZWFkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcml2YXRlIHN0YXRlIHRoYXQgbmVlZHMgdG8gYmUgcmVzZXQgYmVmb3JlIGV2ZXJ5IHRyYXZlcnNhbC5cbiAgICAgICAgdGhpcy5fdmlzaXRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jaGFuZ2VSZXBvcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9hYm9ydFJlcXVlc3RlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgYXJnYyA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ2MpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ2M7ICsraSkge1xuICAgICAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShhcmdzWzBdIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICBhcmdzWzBdID0gbmV3IE5vZGVQYXRoKHsgcm9vdDogYXJnc1swXSB9KS5nZXQoXCJyb290XCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENhbGxlZCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyAudmlzaXQuXG4gICAgICAgIHRoaXMucmVzZXQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIHZhciBkaWROb3RUaHJvdztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciByb290ID0gdGhpcy52aXNpdFdpdGhvdXRSZXNldChhcmdzWzBdKTtcbiAgICAgICAgICAgIGRpZE5vdFRocm93ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX3Zpc2l0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIWRpZE5vdFRocm93ICYmIHRoaXMuX2Fib3J0UmVxdWVzdGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcy52aXNpdFdpdGhvdXRSZXNldCB0aHJldyBhbiBleGNlcHRpb24gYW5kXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5fYWJvcnRSZXF1ZXN0ZWQgd2FzIHNldCB0byB0cnVlLCByZXR1cm4gdGhlIHJvb3Qgb2ZcbiAgICAgICAgICAgICAgICAvLyB0aGUgQVNUIGluc3RlYWQgb2YgbGV0dGluZyB0aGUgZXhjZXB0aW9uIHByb3BhZ2F0ZSwgc28gdGhhdFxuICAgICAgICAgICAgICAgIC8vIGNsaWVudCBjb2RlIGRvZXMgbm90IGhhdmUgdG8gcHJvdmlkZSBhIHRyeS1jYXRjaCBibG9jayB0b1xuICAgICAgICAgICAgICAgIC8vIGludGVyY2VwdCB0aGUgQWJvcnRSZXF1ZXN0IGV4Y2VwdGlvbi4gIE90aGVyIGtpbmRzIG9mXG4gICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9ucyB3aWxsIHByb3BhZ2F0ZSB3aXRob3V0IGJlaW5nIGludGVyY2VwdGVkIGFuZFxuICAgICAgICAgICAgICAgIC8vIHJldGhyb3duIGJ5IGEgY2F0Y2ggYmxvY2ssIHNvIHRoZWlyIHN0YWNrcyB3aWxsIGFjY3VyYXRlbHlcbiAgICAgICAgICAgICAgICAvLyByZWZsZWN0IHRoZSBvcmlnaW5hbCB0aHJvd2luZyBjb250ZXh0LlxuICAgICAgICAgICAgICAgIHJldHVybiBhcmdzWzBdLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH07XG4gICAgUFZwLkFib3J0UmVxdWVzdCA9IGZ1bmN0aW9uIEFib3J0UmVxdWVzdCgpIHsgfTtcbiAgICBQVnAuYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2aXNpdG9yID0gdGhpcztcbiAgICAgICAgdmlzaXRvci5fYWJvcnRSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyB2aXNpdG9yLkFib3J0UmVxdWVzdCgpO1xuICAgICAgICAvLyBJZiB5b3UgZGVjaWRlIHRvIGNhdGNoIHRoaXMgZXhjZXB0aW9uIGFuZCBzdG9wIGl0IGZyb20gcHJvcGFnYXRpbmcsXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0byBjYWxsIGl0cyBjYW5jZWwgbWV0aG9kIHRvIGF2b2lkIHNpbGVuY2luZyBvdGhlclxuICAgICAgICAvLyBleGNlcHRpb25zIHRoYXQgbWlnaHQgYmUgdGhyb3duIGxhdGVyIGluIHRoZSB0cmF2ZXJzYWwuXG4gICAgICAgIHJlcXVlc3QuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmlzaXRvci5fYWJvcnRSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhyb3cgcmVxdWVzdDtcbiAgICB9O1xuICAgIFBWcC5yZXNldCA9IGZ1bmN0aW9uIChfcGF0aCAvKiwgYWRkaXRpb25hbCBhcmd1bWVudHMgKi8pIHtcbiAgICAgICAgLy8gRW1wdHkgc3R1YjsgbWF5IGJlIHJlYXNzaWduZWQgb3Igb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLlxuICAgIH07XG4gICAgUFZwLnZpc2l0V2l0aG91dFJlc2V0ID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiB0aGlzLkNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMuQ29udGV4dC5wcm90b3R5cGUgPT09IHRoaXMsIHRoZXJlJ3MgYSBjaGFuY2Ugd2VcbiAgICAgICAgICAgIC8vIG1pZ2h0IGFjY2lkZW50YWxseSBjYWxsIGNvbnRleHQudmlzaXRXaXRob3V0UmVzZXQuIElmIHRoYXRcbiAgICAgICAgICAgIC8vIGhhcHBlbnMsIHJlLWludm9rZSB0aGUgbWV0aG9kIGFnYWluc3QgY29udGV4dC52aXNpdG9yLlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRvci52aXNpdFdpdGhvdXRSZXNldChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShwYXRoIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlID0gcGF0aC52YWx1ZTtcbiAgICAgICAgdmFyIG1ldGhvZE5hbWUgPSB2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUudHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgdGhpcy5fbWV0aG9kTmFtZVRhYmxlW3ZhbHVlLnR5cGVdO1xuICAgICAgICBpZiAobWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmFjcXVpcmVDb250ZXh0KHBhdGgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5pbnZva2VWaXNpdG9yTWV0aG9kKG1ldGhvZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxlYXNlQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBubyB2aXNpdG9yIG1ldGhvZCB0byBjYWxsLCB2aXNpdCB0aGUgY2hpbGRyZW4gb2ZcbiAgICAgICAgICAgIC8vIHRoaXMgbm9kZSBnZW5lcmljYWxseS5cbiAgICAgICAgICAgIHJldHVybiB2aXNpdENoaWxkcmVuKHBhdGgsIHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBmdW5jdGlvbiB2aXNpdENoaWxkcmVuKHBhdGgsIHZpc2l0b3IpIHtcbiAgICAgICAgaWYgKCEocGF0aCBpbnN0YW5jZW9mIE5vZGVQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHZpc2l0b3IgaW5zdGFuY2VvZiBQYXRoVmlzaXRvcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWUgPSBwYXRoLnZhbHVlO1xuICAgICAgICBpZiAoaXNBcnJheS5jaGVjayh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHBhdGguZWFjaCh2aXNpdG9yLnZpc2l0V2l0aG91dFJlc2V0LCB2aXNpdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaXNPYmplY3QuY2hlY2sodmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBObyBjaGlsZHJlbiB0byB2aXNpdC5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBjaGlsZE5hbWVzID0gdHlwZXMuZ2V0RmllbGROYW1lcyh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBUaGUgLmNvbW1lbnRzIGZpZWxkIG9mIHRoZSBOb2RlIHR5cGUgaXMgaGlkZGVuLCBzbyB3ZSBvbmx5XG4gICAgICAgICAgICAvLyB2aXNpdCBpdCBpZiB0aGUgdmlzaXRvciBkZWZpbmVzIHZpc2l0QmxvY2sgb3IgdmlzaXRMaW5lLCBhbmRcbiAgICAgICAgICAgIC8vIHZhbHVlLmNvbW1lbnRzIGlzIGRlZmluZWQuXG4gICAgICAgICAgICBpZiAodmlzaXRvci5fc2hvdWxkVmlzaXRDb21tZW50cyAmJlxuICAgICAgICAgICAgICAgIHZhbHVlLmNvbW1lbnRzICYmXG4gICAgICAgICAgICAgICAgY2hpbGROYW1lcy5pbmRleE9mKFwiY29tbWVudHNcIikgPCAwKSB7XG4gICAgICAgICAgICAgICAgY2hpbGROYW1lcy5wdXNoKFwiY29tbWVudHNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2hpbGRDb3VudCA9IGNoaWxkTmFtZXMubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGNoaWxkUGF0aHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkTmFtZSA9IGNoaWxkTmFtZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPd24uY2FsbCh2YWx1ZSwgY2hpbGROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdID0gdHlwZXMuZ2V0RmllbGRWYWx1ZSh2YWx1ZSwgY2hpbGROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hpbGRQYXRocy5wdXNoKHBhdGguZ2V0KGNoaWxkTmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyArK2kpIHtcbiAgICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0V2l0aG91dFJlc2V0KGNoaWxkUGF0aHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoLnZhbHVlO1xuICAgIH1cbiAgICBQVnAuYWNxdWlyZUNvbnRleHQgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICBpZiAodGhpcy5fcmV1c2FibGVDb250ZXh0U3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcmV1c2FibGVDb250ZXh0U3RhY2sucG9wKCkucmVzZXQocGF0aCk7XG4gICAgfTtcbiAgICBQVnAucmVsZWFzZUNvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICBpZiAoIShjb250ZXh0IGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JldXNhYmxlQ29udGV4dFN0YWNrLnB1c2goY29udGV4dCk7XG4gICAgICAgIGNvbnRleHQuY3VycmVudFBhdGggPSBudWxsO1xuICAgIH07XG4gICAgUFZwLnJlcG9ydENoYW5nZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NoYW5nZVJlcG9ydGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIFBWcC53YXNDaGFuZ2VSZXBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoYW5nZVJlcG9ydGVkO1xuICAgIH07XG4gICAgZnVuY3Rpb24gbWFrZUNvbnRleHRDb25zdHJ1Y3Rvcih2aXNpdG9yKSB7XG4gICAgICAgIGZ1bmN0aW9uIENvbnRleHQocGF0aCkge1xuICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhdGhWaXNpdG9yKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJ2aXNpdG9yXCIsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmlzaXRvcixcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhdGggPSBwYXRoO1xuICAgICAgICAgICAgdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgPSB0cnVlO1xuICAgICAgICAgICAgT2JqZWN0LnNlYWwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEodmlzaXRvciBpbnN0YW5jZW9mIFBhdGhWaXNpdG9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgdmlzaXRvciBvYmplY3QgaXMgdGhlIHByb3RvdHlwZSBvZiBDb250ZXh0LnByb3RvdHlwZSxcbiAgICAgICAgLy8gc28gYWxsIHZpc2l0b3IgbWV0aG9kcyBhcmUgaW5oZXJpdGVkIGJ5IGNvbnRleHQgb2JqZWN0cy5cbiAgICAgICAgdmFyIENwID0gQ29udGV4dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHZpc2l0b3IpO1xuICAgICAgICBDcC5jb25zdHJ1Y3RvciA9IENvbnRleHQ7XG4gICAgICAgIGV4dGVuZChDcCwgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcyk7XG4gICAgICAgIHJldHVybiBDb250ZXh0O1xuICAgIH1cbiAgICAvLyBFdmVyeSBQYXRoVmlzaXRvciBoYXMgYSBkaWZmZXJlbnQgdGhpcy5Db250ZXh0IGNvbnN0cnVjdG9yIGFuZFxuICAgIC8vIHRoaXMuQ29udGV4dC5wcm90b3R5cGUgb2JqZWN0LCBidXQgdGhvc2UgcHJvdG90eXBlcyBjYW4gYWxsIHVzZSB0aGVcbiAgICAvLyBzYW1lIHJlc2V0LCBpbnZva2VWaXNpdG9yTWV0aG9kLCBhbmQgdHJhdmVyc2UgZnVuY3Rpb24gb2JqZWN0cy5cbiAgICB2YXIgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcy5yZXNldCA9XG4gICAgICAgIGZ1bmN0aW9uIHJlc2V0KHBhdGgpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiB0aGlzLkNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEocGF0aCBpbnN0YW5jZW9mIE5vZGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhdGggPSBwYXRoO1xuICAgICAgICAgICAgdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcy5pbnZva2VWaXNpdG9yTWV0aG9kID1cbiAgICAgICAgZnVuY3Rpb24gaW52b2tlVmlzaXRvck1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHRoaXMuY3VycmVudFBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy52aXNpdG9yW21ldGhvZE5hbWVdLmNhbGwodGhpcywgdGhpcy5jdXJyZW50UGF0aCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIC8vIFZpc2l0b3IgbWV0aG9kcyByZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGV5IGhhdmUgaGFuZGxlZFxuICAgICAgICAgICAgICAgIC8vIHRoZWlyIG93biB0cmF2ZXJzYWwgbmVlZHMsIGFuZCB3ZSBzaG91bGQgbm90IGNvbXBsYWluIGlmXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgaXMgc3RpbGwgdHJ1ZS5cbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRUb0NhbGxUcmF2ZXJzZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBBbnkgb3RoZXIgbm9uLXVuZGVmaW5lZCB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSB2aXNpdG9yIG1ldGhvZFxuICAgICAgICAgICAgICAgIC8vIGlzIGludGVycHJldGVkIGFzIGEgcmVwbGFjZW1lbnQgdmFsdWUuXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGF0aCA9IHRoaXMuY3VycmVudFBhdGgucmVwbGFjZShyZXN1bHQpWzBdO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5lZWRUb0NhbGxUcmF2ZXJzZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzLnRyYXZlcnNlIHN0aWxsIGhhc24ndCBiZWVuIGNhbGxlZCwgdmlzaXQgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoaWxkcmVuIG9mIHRoZSByZXBsYWNlbWVudCBub2RlLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYXZlcnNlKHRoaXMuY3VycmVudFBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRUb0NhbGxUcmF2ZXJzZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IGVpdGhlciBjYWxsIHRoaXMudHJhdmVyc2Ugb3IgcmV0dXJuIGZhbHNlIGluIFwiICsgbWV0aG9kTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcGF0aCA9IHRoaXMuY3VycmVudFBhdGg7XG4gICAgICAgICAgICByZXR1cm4gcGF0aCAmJiBwYXRoLnZhbHVlO1xuICAgICAgICB9O1xuICAgIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMudHJhdmVyc2UgPVxuICAgICAgICBmdW5jdGlvbiB0cmF2ZXJzZShwYXRoLCBuZXdWaXNpdG9yKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISh0aGlzLmN1cnJlbnRQYXRoIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB2aXNpdENoaWxkcmVuKHBhdGgsIFBhdGhWaXNpdG9yLmZyb21NZXRob2RzT2JqZWN0KG5ld1Zpc2l0b3IgfHwgdGhpcy52aXNpdG9yKSk7XG4gICAgICAgIH07XG4gICAgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcy52aXNpdCA9XG4gICAgICAgIGZ1bmN0aW9uIHZpc2l0KHBhdGgsIG5ld1Zpc2l0b3IpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiB0aGlzLkNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEocGF0aCBpbnN0YW5jZW9mIE5vZGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHRoaXMuY3VycmVudFBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5lZWRUb0NhbGxUcmF2ZXJzZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhWaXNpdG9yLmZyb21NZXRob2RzT2JqZWN0KG5ld1Zpc2l0b3IgfHwgdGhpcy52aXNpdG9yKS52aXNpdFdpdGhvdXRSZXNldChwYXRoKTtcbiAgICAgICAgfTtcbiAgICBzaGFyZWRDb250ZXh0UHJvdG9NZXRob2RzLnJlcG9ydENoYW5nZWQgPSBmdW5jdGlvbiByZXBvcnRDaGFuZ2VkKCkge1xuICAgICAgICB0aGlzLnZpc2l0b3IucmVwb3J0Q2hhbmdlZCgpO1xuICAgIH07XG4gICAgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcy5hYm9ydCA9IGZ1bmN0aW9uIGFib3J0KCkge1xuICAgICAgICB0aGlzLm5lZWRUb0NhbGxUcmF2ZXJzZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZpc2l0b3IuYWJvcnQoKTtcbiAgICB9O1xuICAgIHJldHVybiBQYXRoVmlzaXRvcjtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IHBhdGhWaXNpdG9yUGx1Z2luO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90eXBlc1wiKSk7XG52YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xudmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuZnVuY3Rpb24gcGF0aFBsdWdpbihmb3JrKSB7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgaXNBcnJheSA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5hcnJheTtcbiAgICB2YXIgaXNOdW1iZXIgPSB0eXBlcy5idWlsdEluVHlwZXMubnVtYmVyO1xuICAgIHZhciBQYXRoID0gZnVuY3Rpb24gUGF0aCh2YWx1ZSwgcGFyZW50UGF0aCwgbmFtZSkge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGF0aCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggY29uc3RydWN0b3IgY2Fubm90IGJlIGludm9rZWQgd2l0aG91dCAnbmV3J1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50UGF0aCkge1xuICAgICAgICAgICAgaWYgKCEocGFyZW50UGF0aCBpbnN0YW5jZW9mIFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50UGF0aCA9IG51bGw7XG4gICAgICAgICAgICBuYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgdmFsdWUgZW5jYXBzdWxhdGVkIGJ5IHRoaXMgUGF0aCwgZ2VuZXJhbGx5IGVxdWFsIHRvXG4gICAgICAgIC8vIHBhcmVudFBhdGgudmFsdWVbbmFtZV0gaWYgd2UgaGF2ZSBhIHBhcmVudFBhdGguXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgLy8gVGhlIGltbWVkaWF0ZSBwYXJlbnQgUGF0aCBvZiB0aGlzIFBhdGguXG4gICAgICAgIHRoaXMucGFyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvZiBwYXJlbnRQYXRoLnZhbHVlIHRocm91Z2ggd2hpY2ggdGhpc1xuICAgICAgICAvLyBQYXRoJ3MgdmFsdWUgd2FzIHJlYWNoZWQuXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIC8vIENhbGxpbmcgcGF0aC5nZXQoXCJjaGlsZFwiKSBtdWx0aXBsZSB0aW1lcyBhbHdheXMgcmV0dXJucyB0aGUgc2FtZVxuICAgICAgICAvLyBjaGlsZCBQYXRoIG9iamVjdCwgZm9yIGJvdGggcGVyZm9ybWFuY2UgYW5kIGNvbnNpc3RlbmN5IHJlYXNvbnMuXG4gICAgICAgIHRoaXMuX19jaGlsZENhY2hlID0gbnVsbDtcbiAgICB9O1xuICAgIHZhciBQcCA9IFBhdGgucHJvdG90eXBlO1xuICAgIGZ1bmN0aW9uIGdldENoaWxkQ2FjaGUocGF0aCkge1xuICAgICAgICAvLyBMYXppbHkgY3JlYXRlIHRoZSBjaGlsZCBjYWNoZS4gVGhpcyBhbHNvIGNoZWFwZW5zIGNhY2hlXG4gICAgICAgIC8vIGludmFsaWRhdGlvbiwgc2luY2UgeW91IGNhbiBqdXN0IHJlc2V0IHBhdGguX19jaGlsZENhY2hlIHRvIG51bGwuXG4gICAgICAgIHJldHVybiBwYXRoLl9fY2hpbGRDYWNoZSB8fCAocGF0aC5fX2NoaWxkQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q2hpbGRQYXRoKHBhdGgsIG5hbWUpIHtcbiAgICAgICAgdmFyIGNhY2hlID0gZ2V0Q2hpbGRDYWNoZShwYXRoKTtcbiAgICAgICAgdmFyIGFjdHVhbENoaWxkVmFsdWUgPSBwYXRoLmdldFZhbHVlUHJvcGVydHkobmFtZSk7XG4gICAgICAgIHZhciBjaGlsZFBhdGggPSBjYWNoZVtuYW1lXTtcbiAgICAgICAgaWYgKCFoYXNPd24uY2FsbChjYWNoZSwgbmFtZSkgfHxcbiAgICAgICAgICAgIC8vIEVuc3VyZSBjb25zaXN0ZW5jeSBiZXR3ZWVuIGNhY2hlIGFuZCByZWFsaXR5LlxuICAgICAgICAgICAgY2hpbGRQYXRoLnZhbHVlICE9PSBhY3R1YWxDaGlsZFZhbHVlKSB7XG4gICAgICAgICAgICBjaGlsZFBhdGggPSBjYWNoZVtuYW1lXSA9IG5ldyBwYXRoLmNvbnN0cnVjdG9yKGFjdHVhbENoaWxkVmFsdWUsIHBhdGgsIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGlsZFBhdGg7XG4gICAgfVxuICAgIC8vIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0aGF0IG5lZWQgdG9cbiAgICAvLyBoYW5kbGUgbWlzc2luZyBwcm9wZXJ0aWVzLCBldGMuXG4gICAgUHAuZ2V0VmFsdWVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGdldFZhbHVlUHJvcGVydHkobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZVtuYW1lXTtcbiAgICB9O1xuICAgIFBwLmdldCA9IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgdmFyIG5hbWVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBuYW1lc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXRoID0gdGhpcztcbiAgICAgICAgdmFyIGNvdW50ID0gbmFtZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgICAgIHBhdGggPSBnZXRDaGlsZFBhdGgocGF0aCwgbmFtZXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH07XG4gICAgUHAuZWFjaCA9IGZ1bmN0aW9uIGVhY2goY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNoaWxkUGF0aHMgPSBbXTtcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMudmFsdWUubGVuZ3RoO1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIC8vIENvbGxlY3QgYWxsIHRoZSBvcmlnaW5hbCBjaGlsZCBwYXRocyBiZWZvcmUgaW52b2tpbmcgdGhlIGNhbGxiYWNrLlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwodGhpcy52YWx1ZSwgaSkpIHtcbiAgICAgICAgICAgICAgICBjaGlsZFBhdGhzW2ldID0gdGhpcy5nZXQoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFjayBvbiBqdXN0IHRoZSBvcmlnaW5hbCBjaGlsZCBwYXRocywgcmVnYXJkbGVzcyBvZlxuICAgICAgICAvLyBhbnkgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZSBhcnJheSBieSB0aGUgY2FsbGJhY2suIEkgY2hvc2UgdGhlc2VcbiAgICAgICAgLy8gc2VtYW50aWNzIG92ZXIgY2xldmVybHkgaW52b2tpbmcgdGhlIGNhbGxiYWNrIG9uIG5ldyBlbGVtZW50cyBiZWNhdXNlXG4gICAgICAgIC8vIHRoaXMgd2F5IGlzIG11Y2ggZWFzaWVyIHRvIHJlYXNvbiBhYm91dC5cbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgdGhpcztcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoY2hpbGRQYXRocywgaSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGNoaWxkUGF0aHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBQcC5tYXAgPSBmdW5jdGlvbiBtYXAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGNoaWxkUGF0aCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goY2FsbGJhY2suY2FsbCh0aGlzLCBjaGlsZFBhdGgpKTtcbiAgICAgICAgfSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBQcC5maWx0ZXIgPSBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGNoaWxkUGF0aCkge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGhpcywgY2hpbGRQYXRoKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgZnVuY3Rpb24gZW1wdHlNb3ZlcygpIHsgfVxuICAgIGZ1bmN0aW9uIGdldE1vdmVzKHBhdGgsIG9mZnNldCwgc3RhcnQsIGVuZCkge1xuICAgICAgICBpc0FycmF5LmFzc2VydChwYXRoLnZhbHVlKTtcbiAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtcHR5TW92ZXM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aCA9IHBhdGgudmFsdWUubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIGVtcHR5TW92ZXM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFyZ2MgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnYyA9PT0gMikge1xuICAgICAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFyZ2MgPT09IDMpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoc3RhcnQsIDApO1xuICAgICAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhcnQgPSBNYXRoLm1heChzdGFydCwgMCk7XG4gICAgICAgICAgICBlbmQgPSBNYXRoLm1pbihlbmQsIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNOdW1iZXIuYXNzZXJ0KHN0YXJ0KTtcbiAgICAgICAgaXNOdW1iZXIuYXNzZXJ0KGVuZCk7XG4gICAgICAgIHZhciBtb3ZlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHZhciBjYWNoZSA9IGdldENoaWxkQ2FjaGUocGF0aCk7XG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwocGF0aC52YWx1ZSwgaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRQYXRoID0gcGF0aC5nZXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkUGF0aC5uYW1lICE9PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG5ld0luZGV4ID0gaSArIG9mZnNldDtcbiAgICAgICAgICAgICAgICBjaGlsZFBhdGgubmFtZSA9IG5ld0luZGV4O1xuICAgICAgICAgICAgICAgIG1vdmVzW25ld0luZGV4XSA9IGNoaWxkUGF0aDtcbiAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIGNhY2hlLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZvciAodmFyIG5ld0luZGV4IGluIG1vdmVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkUGF0aCA9IG1vdmVzW25ld0luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRQYXRoLm5hbWUgIT09ICtuZXdJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhY2hlW25ld0luZGV4XSA9IGNoaWxkUGF0aDtcbiAgICAgICAgICAgICAgICBwYXRoLnZhbHVlW25ld0luZGV4XSA9IGNoaWxkUGF0aC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgUHAuc2hpZnQgPSBmdW5jdGlvbiBzaGlmdCgpIHtcbiAgICAgICAgdmFyIG1vdmUgPSBnZXRNb3Zlcyh0aGlzLCAtMSk7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnZhbHVlLnNoaWZ0KCk7XG4gICAgICAgIG1vdmUoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIFBwLnVuc2hpZnQgPSBmdW5jdGlvbiB1bnNoaWZ0KCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtb3ZlID0gZ2V0TW92ZXModGhpcywgYXJncy5sZW5ndGgpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy52YWx1ZS51bnNoaWZ0LmFwcGx5KHRoaXMudmFsdWUsIGFyZ3MpO1xuICAgICAgICBtb3ZlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBQcC5wdXNoID0gZnVuY3Rpb24gcHVzaCgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpc0FycmF5LmFzc2VydCh0aGlzLnZhbHVlKTtcbiAgICAgICAgZGVsZXRlIGdldENoaWxkQ2FjaGUodGhpcykubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5wdXNoLmFwcGx5KHRoaXMudmFsdWUsIGFyZ3MpO1xuICAgIH07XG4gICAgUHAucG9wID0gZnVuY3Rpb24gcG9wKCkge1xuICAgICAgICBpc0FycmF5LmFzc2VydCh0aGlzLnZhbHVlKTtcbiAgICAgICAgdmFyIGNhY2hlID0gZ2V0Q2hpbGRDYWNoZSh0aGlzKTtcbiAgICAgICAgZGVsZXRlIGNhY2hlW3RoaXMudmFsdWUubGVuZ3RoIC0gMV07XG4gICAgICAgIGRlbGV0ZSBjYWNoZS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLnBvcCgpO1xuICAgIH07XG4gICAgUHAuaW5zZXJ0QXQgPSBmdW5jdGlvbiBpbnNlcnRBdChpbmRleCkge1xuICAgICAgICB2YXIgYXJnYyA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIHZhciBtb3ZlID0gZ2V0TW92ZXModGhpcywgYXJnYyAtIDEsIGluZGV4KTtcbiAgICAgICAgaWYgKG1vdmUgPT09IGVtcHR5TW92ZXMgJiYgYXJnYyA8PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IE1hdGgubWF4KGluZGV4LCAwKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmdjOyArK2kpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVbaW5kZXggKyBpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgbW92ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFBwLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uIGluc2VydEJlZm9yZSgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHAgPSB0aGlzLnBhcmVudFBhdGg7XG4gICAgICAgIHZhciBhcmdjID0gYXJncy5sZW5ndGg7XG4gICAgICAgIHZhciBpbnNlcnRBdEFyZ3MgPSBbdGhpcy5uYW1lXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdjOyArK2kpIHtcbiAgICAgICAgICAgIGluc2VydEF0QXJncy5wdXNoKGFyZ3NbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcC5pbnNlcnRBdC5hcHBseShwcCwgaW5zZXJ0QXRBcmdzKTtcbiAgICB9O1xuICAgIFBwLmluc2VydEFmdGVyID0gZnVuY3Rpb24gaW5zZXJ0QWZ0ZXIoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBwID0gdGhpcy5wYXJlbnRQYXRoO1xuICAgICAgICB2YXIgYXJnYyA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICB2YXIgaW5zZXJ0QXRBcmdzID0gW3RoaXMubmFtZSArIDFdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ2M7ICsraSkge1xuICAgICAgICAgICAgaW5zZXJ0QXRBcmdzLnB1c2goYXJnc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBwLmluc2VydEF0LmFwcGx5KHBwLCBpbnNlcnRBdEFyZ3MpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gcmVwYWlyUmVsYXRpb25zaGlwV2l0aFBhcmVudChwYXRoKSB7XG4gICAgICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcCA9IHBhdGgucGFyZW50UGF0aDtcbiAgICAgICAgaWYgKCFwcCkge1xuICAgICAgICAgICAgLy8gT3JwaGFuIHBhdGhzIGhhdmUgbm8gcmVsYXRpb25zaGlwIHRvIHJlcGFpci5cbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRWYWx1ZSA9IHBwLnZhbHVlO1xuICAgICAgICB2YXIgcGFyZW50Q2FjaGUgPSBnZXRDaGlsZENhY2hlKHBwKTtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHBhcmVudENhY2hlW3BhdGgubmFtZV0gaXMgcG9wdWxhdGVkLlxuICAgICAgICBpZiAocGFyZW50VmFsdWVbcGF0aC5uYW1lXSA9PT0gcGF0aC52YWx1ZSkge1xuICAgICAgICAgICAgcGFyZW50Q2FjaGVbcGF0aC5uYW1lXSA9IHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNBcnJheS5jaGVjayhwYXJlbnRWYWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIFNvbWV0aGluZyBjYXVzZWQgcGF0aC5uYW1lIHRvIGJlY29tZSBvdXQgb2YgZGF0ZSwgc28gYXR0ZW1wdCB0b1xuICAgICAgICAgICAgLy8gcmVjb3ZlciBieSBzZWFyY2hpbmcgZm9yIHBhdGgudmFsdWUgaW4gcGFyZW50VmFsdWUuXG4gICAgICAgICAgICB2YXIgaSA9IHBhcmVudFZhbHVlLmluZGV4T2YocGF0aC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoaSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Q2FjaGVbcGF0aC5uYW1lID0gaV0gPSBwYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgcGF0aC52YWx1ZSBkaXNhZ3JlZXMgd2l0aCBwYXJlbnRWYWx1ZVtwYXRoLm5hbWVdLCBhbmRcbiAgICAgICAgICAgIC8vIHBhdGgubmFtZSBpcyBub3QgYW4gYXJyYXkgaW5kZXgsIGxldCBwYXRoLnZhbHVlIGJlY29tZSB0aGUgbmV3XG4gICAgICAgICAgICAvLyBwYXJlbnRWYWx1ZVtwYXRoLm5hbWVdIGFuZCB1cGRhdGUgcGFyZW50Q2FjaGUgYWNjb3JkaW5nbHkuXG4gICAgICAgICAgICBwYXJlbnRWYWx1ZVtwYXRoLm5hbWVdID0gcGF0aC52YWx1ZTtcbiAgICAgICAgICAgIHBhcmVudENhY2hlW3BhdGgubmFtZV0gPSBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJlbnRWYWx1ZVtwYXRoLm5hbWVdICE9PSBwYXRoLnZhbHVlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGgucGFyZW50UGF0aC5nZXQocGF0aC5uYW1lKSAhPT0gcGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbiAgICBQcC5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShyZXBsYWNlbWVudCkge1xuICAgICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgICB2YXIgcGFyZW50VmFsdWUgPSB0aGlzLnBhcmVudFBhdGgudmFsdWU7XG4gICAgICAgIHZhciBwYXJlbnRDYWNoZSA9IGdldENoaWxkQ2FjaGUodGhpcy5wYXJlbnRQYXRoKTtcbiAgICAgICAgdmFyIGNvdW50ID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgcmVwYWlyUmVsYXRpb25zaGlwV2l0aFBhcmVudCh0aGlzKTtcbiAgICAgICAgaWYgKGlzQXJyYXkuY2hlY2socGFyZW50VmFsdWUpKSB7XG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxMZW5ndGggPSBwYXJlbnRWYWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgbW92ZSA9IGdldE1vdmVzKHRoaXMucGFyZW50UGF0aCwgY291bnQgLSAxLCB0aGlzLm5hbWUgKyAxKTtcbiAgICAgICAgICAgIHZhciBzcGxpY2VBcmdzID0gW3RoaXMubmFtZSwgMV07XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgICAgICAgICBzcGxpY2VBcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzcGxpY2VkT3V0ID0gcGFyZW50VmFsdWUuc3BsaWNlLmFwcGx5KHBhcmVudFZhbHVlLCBzcGxpY2VBcmdzKTtcbiAgICAgICAgICAgIGlmIChzcGxpY2VkT3V0WzBdICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmVudFZhbHVlLmxlbmd0aCAhPT0gKG9yaWdpbmFsTGVuZ3RoIC0gMSArIGNvdW50KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vdmUoKTtcbiAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJlbnRDYWNoZVt0aGlzLm5hbWVdO1xuICAgICAgICAgICAgICAgIHRoaXMuX19jaGlsZENhY2hlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRWYWx1ZVt0aGlzLm5hbWVdICE9PSByZXBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICE9PSByZXBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gcmVwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19jaGlsZENhY2hlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMucGFyZW50UGF0aC5nZXQodGhpcy5uYW1lICsgaSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0c1swXSAhPT0gdGhpcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAhPT0gcmVwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9fY2hpbGRDYWNoZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gcGFyZW50VmFsdWVbdGhpcy5uYW1lXSA9IHJlcGxhY2VtZW50O1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgcGFyZW50VmFsdWVbdGhpcy5uYW1lXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fX2NoaWxkQ2FjaGUgPSBudWxsO1xuICAgICAgICAgICAgLy8gTGVhdmUgdGhpcyBwYXRoIGNhY2hlZCBhcyBwYXJlbnRDYWNoZVt0aGlzLm5hbWVdLCBldmVuIHRob3VnaFxuICAgICAgICAgICAgLy8gaXQgbm8gbG9uZ2VyIGhhcyBhIHZhbHVlIGRlZmluZWQuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgcmVwbGFjZSBwYXRoXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG4gICAgcmV0dXJuIFBhdGg7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBwYXRoUGx1Z2luO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90eXBlc1wiKSk7XG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIHNjb3BlUGx1Z2luKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBUeXBlID0gdHlwZXMuVHlwZTtcbiAgICB2YXIgbmFtZWRUeXBlcyA9IHR5cGVzLm5hbWVkVHlwZXM7XG4gICAgdmFyIE5vZGUgPSBuYW1lZFR5cGVzLk5vZGU7XG4gICAgdmFyIEV4cHJlc3Npb24gPSBuYW1lZFR5cGVzLkV4cHJlc3Npb247XG4gICAgdmFyIGlzQXJyYXkgPSB0eXBlcy5idWlsdEluVHlwZXMuYXJyYXk7XG4gICAgdmFyIGIgPSB0eXBlcy5idWlsZGVycztcbiAgICB2YXIgU2NvcGUgPSBmdW5jdGlvbiBTY29wZShwYXRoLCBwYXJlbnRTY29wZSkge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU2NvcGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTY29wZSBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgaW52b2tlZCB3aXRob3V0ICduZXcnXCIpO1xuICAgICAgICB9XG4gICAgICAgIFNjb3BlVHlwZS5hc3NlcnQocGF0aC52YWx1ZSk7XG4gICAgICAgIHZhciBkZXB0aDtcbiAgICAgICAgaWYgKHBhcmVudFNjb3BlKSB7XG4gICAgICAgICAgICBpZiAoIShwYXJlbnRTY29wZSBpbnN0YW5jZW9mIFNjb3BlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlcHRoID0gcGFyZW50U2NvcGUuZGVwdGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50U2NvcGUgPSBudWxsO1xuICAgICAgICAgICAgZGVwdGggPSAwO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgICAgIHBhdGg6IHsgdmFsdWU6IHBhdGggfSxcbiAgICAgICAgICAgIG5vZGU6IHsgdmFsdWU6IHBhdGgudmFsdWUgfSxcbiAgICAgICAgICAgIGlzR2xvYmFsOiB7IHZhbHVlOiAhcGFyZW50U2NvcGUsIGVudW1lcmFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIGRlcHRoOiB7IHZhbHVlOiBkZXB0aCB9LFxuICAgICAgICAgICAgcGFyZW50OiB7IHZhbHVlOiBwYXJlbnRTY29wZSB9LFxuICAgICAgICAgICAgYmluZGluZ3M6IHsgdmFsdWU6IHt9IH0sXG4gICAgICAgICAgICB0eXBlczogeyB2YWx1ZToge30gfSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB2YXIgc2NvcGVUeXBlcyA9IFtcbiAgICAgICAgLy8gUHJvZ3JhbSBub2RlcyBpbnRyb2R1Y2UgZ2xvYmFsIHNjb3Blcy5cbiAgICAgICAgbmFtZWRUeXBlcy5Qcm9ncmFtLFxuICAgICAgICAvLyBGdW5jdGlvbiBpcyB0aGUgc3VwZXJ0eXBlIG9mIEZ1bmN0aW9uRXhwcmVzc2lvbixcbiAgICAgICAgLy8gRnVuY3Rpb25EZWNsYXJhdGlvbiwgQXJyb3dFeHByZXNzaW9uLCBldGMuXG4gICAgICAgIG5hbWVkVHlwZXMuRnVuY3Rpb24sXG4gICAgICAgIC8vIEluIGNhc2UgeW91IGRpZG4ndCBrbm93LCB0aGUgY2F1Z2h0IHBhcmFtZXRlciBzaGFkb3dzIGFueSB2YXJpYWJsZVxuICAgICAgICAvLyBvZiB0aGUgc2FtZSBuYW1lIGluIGFuIG91dGVyIHNjb3BlLlxuICAgICAgICBuYW1lZFR5cGVzLkNhdGNoQ2xhdXNlXG4gICAgXTtcbiAgICB2YXIgU2NvcGVUeXBlID0gVHlwZS5vci5hcHBseShUeXBlLCBzY29wZVR5cGVzKTtcbiAgICBTY29wZS5pc0VzdGFibGlzaGVkQnkgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gU2NvcGVUeXBlLmNoZWNrKG5vZGUpO1xuICAgIH07XG4gICAgdmFyIFNwID0gU2NvcGUucHJvdG90eXBlO1xuICAgIC8vIFdpbGwgYmUgb3ZlcnJpZGRlbiBhZnRlciBhbiBpbnN0YW5jZSBsYXppbHkgY2FsbHMgc2NhblNjb3BlLlxuICAgIFNwLmRpZFNjYW4gPSBmYWxzZTtcbiAgICBTcC5kZWNsYXJlcyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHRoaXMuc2NhbigpO1xuICAgICAgICByZXR1cm4gaGFzT3duLmNhbGwodGhpcy5iaW5kaW5ncywgbmFtZSk7XG4gICAgfTtcbiAgICBTcC5kZWNsYXJlc1R5cGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB0aGlzLnNjYW4oKTtcbiAgICAgICAgcmV0dXJuIGhhc093bi5jYWxsKHRoaXMudHlwZXMsIG5hbWUpO1xuICAgIH07XG4gICAgU3AuZGVjbGFyZVRlbXBvcmFyeSA9IGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICAgICAgaWYgKCEvXlthLXokX10vaS50ZXN0KHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmVmaXggPSBcInQkXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5jbHVkZSB0aGlzLmRlcHRoIGluIHRoZSBuYW1lIHRvIG1ha2Ugc3VyZSB0aGUgbmFtZSBkb2VzIG5vdFxuICAgICAgICAvLyBjb2xsaWRlIHdpdGggYW55IHZhcmlhYmxlcyBpbiBuZXN0ZWQvZW5jbG9zaW5nIHNjb3Blcy5cbiAgICAgICAgcHJlZml4ICs9IHRoaXMuZGVwdGgudG9TdHJpbmcoMzYpICsgXCIkXCI7XG4gICAgICAgIHRoaXMuc2NhbigpO1xuICAgICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAodGhpcy5kZWNsYXJlcyhwcmVmaXggKyBpbmRleCkpIHtcbiAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWUgPSBwcmVmaXggKyBpbmRleDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluZGluZ3NbbmFtZV0gPSB0eXBlcy5idWlsZGVycy5pZGVudGlmaWVyKG5hbWUpO1xuICAgIH07XG4gICAgU3AuaW5qZWN0VGVtcG9yYXJ5ID0gZnVuY3Rpb24gKGlkZW50aWZpZXIsIGluaXQpIHtcbiAgICAgICAgaWRlbnRpZmllciB8fCAoaWRlbnRpZmllciA9IHRoaXMuZGVjbGFyZVRlbXBvcmFyeSgpKTtcbiAgICAgICAgdmFyIGJvZHlQYXRoID0gdGhpcy5wYXRoLmdldChcImJvZHlcIik7XG4gICAgICAgIGlmIChuYW1lZFR5cGVzLkJsb2NrU3RhdGVtZW50LmNoZWNrKGJvZHlQYXRoLnZhbHVlKSkge1xuICAgICAgICAgICAgYm9keVBhdGggPSBib2R5UGF0aC5nZXQoXCJib2R5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGJvZHlQYXRoLnVuc2hpZnQoYi52YXJpYWJsZURlY2xhcmF0aW9uKFwidmFyXCIsIFtiLnZhcmlhYmxlRGVjbGFyYXRvcihpZGVudGlmaWVyLCBpbml0IHx8IG51bGwpXSkpO1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgICB9O1xuICAgIFNwLnNjYW4gPSBmdW5jdGlvbiAoZm9yY2UpIHtcbiAgICAgICAgaWYgKGZvcmNlIHx8ICF0aGlzLmRpZFNjYW4pIHtcbiAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcy5iaW5kaW5ncykge1xuICAgICAgICAgICAgICAgIC8vIEVtcHR5IG91dCB0aGlzLmJpbmRpbmdzLCBqdXN0IGluIGNhc2VzLlxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJpbmRpbmdzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NhblNjb3BlKHRoaXMucGF0aCwgdGhpcy5iaW5kaW5ncywgdGhpcy50eXBlcyk7XG4gICAgICAgICAgICB0aGlzLmRpZFNjYW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTcC5nZXRCaW5kaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zY2FuKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzO1xuICAgIH07XG4gICAgU3AuZ2V0VHlwZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2NhbigpO1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlcztcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHNjYW5TY29wZShwYXRoLCBiaW5kaW5ncywgc2NvcGVUeXBlcykge1xuICAgICAgICB2YXIgbm9kZSA9IHBhdGgudmFsdWU7XG4gICAgICAgIFNjb3BlVHlwZS5hc3NlcnQobm9kZSk7XG4gICAgICAgIGlmIChuYW1lZFR5cGVzLkNhdGNoQ2xhdXNlLmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBBIGNhdGNoIGNsYXVzZSBlc3RhYmxpc2hlcyBhIG5ldyBzY29wZSBidXQgdGhlIG9ubHkgdmFyaWFibGVcbiAgICAgICAgICAgIC8vIGJvdW5kIGluIHRoYXQgc2NvcGUgaXMgdGhlIGNhdGNoIHBhcmFtZXRlci4gQW55IG90aGVyXG4gICAgICAgICAgICAvLyBkZWNsYXJhdGlvbnMgY3JlYXRlIGJpbmRpbmdzIGluIHRoZSBvdXRlciBzY29wZS5cbiAgICAgICAgICAgIHZhciBwYXJhbSA9IHBhdGguZ2V0KFwicGFyYW1cIik7XG4gICAgICAgICAgICBpZiAocGFyYW0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuKHBhcmFtLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZWN1cnNpdmVTY2FuU2NvcGUocGF0aCwgYmluZGluZ3MsIHNjb3BlVHlwZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZVNjYW5TY29wZShwYXRoLCBiaW5kaW5ncywgc2NvcGVUeXBlcykge1xuICAgICAgICB2YXIgbm9kZSA9IHBhdGgudmFsdWU7XG4gICAgICAgIGlmIChwYXRoLnBhcmVudCAmJlxuICAgICAgICAgICAgbmFtZWRUeXBlcy5GdW5jdGlvbkV4cHJlc3Npb24uY2hlY2socGF0aC5wYXJlbnQubm9kZSkgJiZcbiAgICAgICAgICAgIHBhdGgucGFyZW50Lm5vZGUuaWQpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocGF0aC5wYXJlbnQuZ2V0KFwiaWRcIiksIGJpbmRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgIC8vIE5vbmUgb2YgdGhlIHJlbWFpbmluZyBjYXNlcyBtYXR0ZXIgaWYgbm9kZSBpcyBmYWxzeS5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0FycmF5LmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoLmVhY2goZnVuY3Rpb24gKGNoaWxkUGF0aCkge1xuICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5DaGlsZChjaGlsZFBhdGgsIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuRnVuY3Rpb24uY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGguZ2V0KFwicGFyYW1zXCIpLmVhY2goZnVuY3Rpb24gKHBhcmFtUGF0aCkge1xuICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocGFyYW1QYXRoLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5DaGlsZChwYXRoLmdldChcImJvZHlcIiksIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgobmFtZWRUeXBlcy5UeXBlQWxpYXMgJiYgbmFtZWRUeXBlcy5UeXBlQWxpYXMuY2hlY2sobm9kZSkpIHx8XG4gICAgICAgICAgICAobmFtZWRUeXBlcy5JbnRlcmZhY2VEZWNsYXJhdGlvbiAmJiBuYW1lZFR5cGVzLkludGVyZmFjZURlY2xhcmF0aW9uLmNoZWNrKG5vZGUpKSB8fFxuICAgICAgICAgICAgKG5hbWVkVHlwZXMuVFNUeXBlQWxpYXNEZWNsYXJhdGlvbiAmJiBuYW1lZFR5cGVzLlRTVHlwZUFsaWFzRGVjbGFyYXRpb24uY2hlY2sobm9kZSkpIHx8XG4gICAgICAgICAgICAobmFtZWRUeXBlcy5UU0ludGVyZmFjZURlY2xhcmF0aW9uICYmIG5hbWVkVHlwZXMuVFNJbnRlcmZhY2VEZWNsYXJhdGlvbi5jaGVjayhub2RlKSkpIHtcbiAgICAgICAgICAgIGFkZFR5cGVQYXR0ZXJuKHBhdGguZ2V0KFwiaWRcIiksIHNjb3BlVHlwZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuVmFyaWFibGVEZWNsYXJhdG9yLmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICBhZGRQYXR0ZXJuKHBhdGguZ2V0KFwiaWRcIiksIGJpbmRpbmdzKTtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5DaGlsZChwYXRoLmdldChcImluaXRcIiksIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnR5cGUgPT09IFwiSW1wb3J0U3BlY2lmaWVyXCIgfHxcbiAgICAgICAgICAgIG5vZGUudHlwZSA9PT0gXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIiB8fFxuICAgICAgICAgICAgbm9kZS50eXBlID09PSBcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIikge1xuICAgICAgICAgICAgYWRkUGF0dGVybihcbiAgICAgICAgICAgIC8vIEVzcHJpbWEgdXNlZCB0byB1c2UgdGhlIC5uYW1lIGZpZWxkIHRvIHJlZmVyIHRvIHRoZSBsb2NhbFxuICAgICAgICAgICAgLy8gYmluZGluZyBpZGVudGlmaWVyIGZvciBJbXBvcnRTcGVjaWZpZXIgbm9kZXMsIGJ1dCAuaWQgZm9yXG4gICAgICAgICAgICAvLyBJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIgYW5kIEltcG9ydERlZmF1bHRTcGVjaWZpZXIgbm9kZXMuXG4gICAgICAgICAgICAvLyBFU1RyZWUvQWNvcm4vRVNwcmVlIHVzZSAubG9jYWwgZm9yIGFsbCB0aHJlZSBub2RlIHR5cGVzLlxuICAgICAgICAgICAgcGF0aC5nZXQobm9kZS5sb2NhbCA/IFwibG9jYWxcIiA6XG4gICAgICAgICAgICAgICAgbm9kZS5uYW1lID8gXCJuYW1lXCIgOiBcImlkXCIpLCBiaW5kaW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoTm9kZS5jaGVjayhub2RlKSAmJiAhRXhwcmVzc2lvbi5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgdHlwZXMuZWFjaEZpZWxkKG5vZGUsIGZ1bmN0aW9uIChuYW1lLCBjaGlsZCkge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZFBhdGggPSBwYXRoLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhdGhIYXNWYWx1ZShjaGlsZFBhdGgsIGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5DaGlsZChjaGlsZFBhdGgsIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBhdGhIYXNWYWx1ZShwYXRoLCB2YWx1ZSkge1xuICAgICAgICBpZiAocGF0aC52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVtcHR5IGFycmF5cyBhcmUgcHJvYmFibHkgcHJvZHVjZWQgYnkgZGVmYXVsdHMuZW1wdHlBcnJheSwgaW4gd2hpY2hcbiAgICAgICAgLy8gY2FzZSBpcyBtYWtlcyBzZW5zZSB0byByZWdhcmQgdGhlbSBhcyBlcXVpdmFsZW50LCBpZiBub3QgPT09LlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoLnZhbHVlKSAmJlxuICAgICAgICAgICAgcGF0aC52YWx1ZS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgICB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVjdXJzaXZlU2NhbkNoaWxkKHBhdGgsIGJpbmRpbmdzLCBzY29wZVR5cGVzKSB7XG4gICAgICAgIHZhciBub2RlID0gcGF0aC52YWx1ZTtcbiAgICAgICAgaWYgKCFub2RlIHx8IEV4cHJlc3Npb24uY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBmYWxzeSB2YWx1ZXMgYW5kIEV4cHJlc3Npb25zLlxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuRnVuY3Rpb25EZWNsYXJhdGlvbi5jaGVjayhub2RlKSAmJlxuICAgICAgICAgICAgbm9kZS5pZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgYWRkUGF0dGVybihwYXRoLmdldChcImlkXCIpLCBiaW5kaW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZWRUeXBlcy5DbGFzc0RlY2xhcmF0aW9uICYmXG4gICAgICAgICAgICBuYW1lZFR5cGVzLkNsYXNzRGVjbGFyYXRpb24uY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocGF0aC5nZXQoXCJpZFwiKSwgYmluZGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFNjb3BlVHlwZS5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgaWYgKG5hbWVkVHlwZXMuQ2F0Y2hDbGF1c2UuY2hlY2sobm9kZSkgJiZcbiAgICAgICAgICAgICAgICAvLyBUT0RPIEJyb2FkZW4gdGhpcyB0byBhY2NlcHQgYW55IHBhdHRlcm4uXG4gICAgICAgICAgICAgICAgbmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKG5vZGUucGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhdGNoUGFyYW1OYW1lID0gbm9kZS5wYXJhbS5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBoYWRCaW5kaW5nID0gaGFzT3duLmNhbGwoYmluZGluZ3MsIGNhdGNoUGFyYW1OYW1lKTtcbiAgICAgICAgICAgICAgICAvLyBBbnkgZGVjbGFyYXRpb25zIHRoYXQgb2NjdXIgaW5zaWRlIHRoZSBjYXRjaCBib2R5IHRoYXQgZG9cbiAgICAgICAgICAgICAgICAvLyBub3QgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjYXRjaCBwYXJhbWV0ZXIgc2hvdWxkIGNvdW50XG4gICAgICAgICAgICAgICAgLy8gYXMgYmluZGluZ3MgaW4gdGhlIG91dGVyIHNjb3BlLlxuICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5TY29wZShwYXRoLmdldChcImJvZHlcIiksIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgICAgICAgICAvLyBJZiBhIG5ldyBiaW5kaW5nIG1hdGNoaW5nIHRoZSBjYXRjaCBwYXJhbWV0ZXIgbmFtZSB3YXNcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGVkIHdoaWxlIHNjYW5uaW5nIHRoZSBjYXRjaCBib2R5LCBpZ25vcmUgaXQgYmVjYXVzZSBpdFxuICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IHJlZmVycyB0byB0aGUgY2F0Y2ggcGFyYW1ldGVyIGFuZCBub3QgdGhlIG91dGVyXG4gICAgICAgICAgICAgICAgLy8gc2NvcGUgdGhhdCB3ZSdyZSBjdXJyZW50bHkgc2Nhbm5pbmcuXG4gICAgICAgICAgICAgICAgaWYgKCFoYWRCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBiaW5kaW5nc1tjYXRjaFBhcmFtTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdXJzaXZlU2NhblNjb3BlKHBhdGgsIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRQYXR0ZXJuKHBhdHRlcm5QYXRoLCBiaW5kaW5ncykge1xuICAgICAgICB2YXIgcGF0dGVybiA9IHBhdHRlcm5QYXRoLnZhbHVlO1xuICAgICAgICBuYW1lZFR5cGVzLlBhdHRlcm4uYXNzZXJ0KHBhdHRlcm4pO1xuICAgICAgICBpZiAobmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoYmluZGluZ3MsIHBhdHRlcm4ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICBiaW5kaW5nc1twYXR0ZXJuLm5hbWVdLnB1c2gocGF0dGVyblBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYmluZGluZ3NbcGF0dGVybi5uYW1lXSA9IFtwYXR0ZXJuUGF0aF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZWRUeXBlcy5Bc3NpZ25tZW50UGF0dGVybiAmJlxuICAgICAgICAgICAgbmFtZWRUeXBlcy5Bc3NpZ25tZW50UGF0dGVybi5jaGVjayhwYXR0ZXJuKSkge1xuICAgICAgICAgICAgYWRkUGF0dGVybihwYXR0ZXJuUGF0aC5nZXQoJ2xlZnQnKSwgYmluZGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuT2JqZWN0UGF0dGVybiAmJlxuICAgICAgICAgICAgbmFtZWRUeXBlcy5PYmplY3RQYXR0ZXJuLmNoZWNrKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICBwYXR0ZXJuUGF0aC5nZXQoJ3Byb3BlcnRpZXMnKS5lYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0eVBhdGgudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWVkVHlwZXMuUGF0dGVybi5jaGVjayhwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihwcm9wZXJ0eVBhdGgsIGJpbmRpbmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZWRUeXBlcy5Qcm9wZXJ0eS5jaGVjayhwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihwcm9wZXJ0eVBhdGguZ2V0KCd2YWx1ZScpLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuU3ByZWFkUHJvcGVydHkgJiZcbiAgICAgICAgICAgICAgICAgICAgbmFtZWRUeXBlcy5TcHJlYWRQcm9wZXJ0eS5jaGVjayhwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihwcm9wZXJ0eVBhdGguZ2V0KCdhcmd1bWVudCcpLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZWRUeXBlcy5BcnJheVBhdHRlcm4gJiZcbiAgICAgICAgICAgIG5hbWVkVHlwZXMuQXJyYXlQYXR0ZXJuLmNoZWNrKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICBwYXR0ZXJuUGF0aC5nZXQoJ2VsZW1lbnRzJykuZWFjaChmdW5jdGlvbiAoZWxlbWVudFBhdGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGVsZW1lbnRQYXRoLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lZFR5cGVzLlBhdHRlcm4uY2hlY2soZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihlbGVtZW50UGF0aCwgYmluZGluZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLlNwcmVhZEVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgbmFtZWRUeXBlcy5TcHJlYWRFbGVtZW50LmNoZWNrKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4oZWxlbWVudFBhdGguZ2V0KFwiYXJndW1lbnRcIiksIGJpbmRpbmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLlByb3BlcnR5UGF0dGVybiAmJlxuICAgICAgICAgICAgbmFtZWRUeXBlcy5Qcm9wZXJ0eVBhdHRlcm4uY2hlY2socGF0dGVybikpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocGF0dGVyblBhdGguZ2V0KCdwYXR0ZXJuJyksIGJpbmRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgobmFtZWRUeXBlcy5TcHJlYWRFbGVtZW50UGF0dGVybiAmJlxuICAgICAgICAgICAgbmFtZWRUeXBlcy5TcHJlYWRFbGVtZW50UGF0dGVybi5jaGVjayhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICAgIChuYW1lZFR5cGVzLlNwcmVhZFByb3BlcnR5UGF0dGVybiAmJlxuICAgICAgICAgICAgICAgIG5hbWVkVHlwZXMuU3ByZWFkUHJvcGVydHlQYXR0ZXJuLmNoZWNrKHBhdHRlcm4pKSkge1xuICAgICAgICAgICAgYWRkUGF0dGVybihwYXR0ZXJuUGF0aC5nZXQoJ2FyZ3VtZW50JyksIGJpbmRpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRUeXBlUGF0dGVybihwYXR0ZXJuUGF0aCwgdHlwZXMpIHtcbiAgICAgICAgdmFyIHBhdHRlcm4gPSBwYXR0ZXJuUGF0aC52YWx1ZTtcbiAgICAgICAgbmFtZWRUeXBlcy5QYXR0ZXJuLmFzc2VydChwYXR0ZXJuKTtcbiAgICAgICAgaWYgKG5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhwYXR0ZXJuKSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKHR5cGVzLCBwYXR0ZXJuLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdHlwZXNbcGF0dGVybi5uYW1lXS5wdXNoKHBhdHRlcm5QYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHR5cGVzW3BhdHRlcm4ubmFtZV0gPSBbcGF0dGVyblBhdGhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIFNwLmxvb2t1cCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGZvciAodmFyIHNjb3BlID0gdGhpczsgc2NvcGU7IHNjb3BlID0gc2NvcGUucGFyZW50KVxuICAgICAgICAgICAgaWYgKHNjb3BlLmRlY2xhcmVzKG5hbWUpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfTtcbiAgICBTcC5sb29rdXBUeXBlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgZm9yICh2YXIgc2NvcGUgPSB0aGlzOyBzY29wZTsgc2NvcGUgPSBzY29wZS5wYXJlbnQpXG4gICAgICAgICAgICBpZiAoc2NvcGUuZGVjbGFyZXNUeXBlKG5hbWUpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfTtcbiAgICBTcC5nZXRHbG9iYWxTY29wZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcztcbiAgICAgICAgd2hpbGUgKCFzY29wZS5pc0dsb2JhbClcbiAgICAgICAgICAgIHNjb3BlID0gc2NvcGUucGFyZW50O1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfTtcbiAgICByZXR1cm4gU2NvcGU7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBzY29wZVBsdWdpbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdHlwZXNcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBUeXBlID0gdHlwZXMuVHlwZTtcbiAgICB2YXIgYnVpbHRpbiA9IHR5cGVzLmJ1aWx0SW5UeXBlcztcbiAgICB2YXIgaXNOdW1iZXIgPSBidWlsdGluLm51bWJlcjtcbiAgICAvLyBBbiBleGFtcGxlIG9mIGNvbnN0cnVjdGluZyBhIG5ldyB0eXBlIHdpdGggYXJiaXRyYXJ5IGNvbnN0cmFpbnRzIGZyb21cbiAgICAvLyBhbiBleGlzdGluZyB0eXBlLlxuICAgIGZ1bmN0aW9uIGdlcSh0aGFuKSB7XG4gICAgICAgIHJldHVybiBUeXBlLmZyb20oZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBpc051bWJlci5jaGVjayh2YWx1ZSkgJiYgdmFsdWUgPj0gdGhhbjsgfSwgaXNOdW1iZXIgKyBcIiA+PSBcIiArIHRoYW4pO1xuICAgIH1cbiAgICA7XG4gICAgLy8gRGVmYXVsdCB2YWx1ZS1yZXR1cm5pbmcgZnVuY3Rpb25zIHRoYXQgbWF5IG9wdGlvbmFsbHkgYmUgcGFzc2VkIGFzIGFcbiAgICAvLyB0aGlyZCBhcmd1bWVudCB0byBEZWYucHJvdG90eXBlLmZpZWxkLlxuICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgICAgLy8gRnVuY3Rpb25zIHdlcmUgdXNlZCBiZWNhdXNlIChhbW9uZyBvdGhlciByZWFzb25zKSB0aGF0J3MgdGhlIG1vc3RcbiAgICAgICAgLy8gZWxlZ2FudCB3YXkgdG8gYWxsb3cgZm9yIHRoZSBlbXB0eUFycmF5IG9uZSBhbHdheXMgdG8gZ2l2ZSBhIG5ld1xuICAgICAgICAvLyBhcnJheSBpbnN0YW5jZS5cbiAgICAgICAgXCJudWxsXCI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgIFwiZW1wdHlBcnJheVwiOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfSxcbiAgICAgICAgXCJmYWxzZVwiOiBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfSxcbiAgICAgICAgXCJ0cnVlXCI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0sXG4gICAgICAgIFwidW5kZWZpbmVkXCI6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgXCJ1c2Ugc3RyaWN0XCI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwidXNlIHN0cmljdFwiOyB9XG4gICAgfTtcbiAgICB2YXIgbmFpdmVJc1ByaW1pdGl2ZSA9IFR5cGUub3IoYnVpbHRpbi5zdHJpbmcsIGJ1aWx0aW4ubnVtYmVyLCBidWlsdGluLmJvb2xlYW4sIGJ1aWx0aW4ubnVsbCwgYnVpbHRpbi51bmRlZmluZWQpO1xuICAgIHZhciBpc1ByaW1pdGl2ZSA9IFR5cGUuZnJvbShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgICBpZiAodHlwZSA9PT0gXCJvYmplY3RcIiB8fFxuICAgICAgICAgICAgdHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSwgbmFpdmVJc1ByaW1pdGl2ZS50b1N0cmluZygpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXE6IGdlcSxcbiAgICAgICAgZGVmYXVsdHM6IGRlZmF1bHRzLFxuICAgICAgICBpc1ByaW1pdGl2ZTogaXNQcmltaXRpdmUsXG4gICAgfTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRGVmID0gdm9pZCAwO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xudmFyIG9ialRvU3RyID0gT3AudG9TdHJpbmc7XG52YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG52YXIgQmFzZVR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmFzZVR5cGUoKSB7XG4gICAgfVxuICAgIEJhc2VUeXBlLnByb3RvdHlwZS5hc3NlcnQgPSBmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrKHZhbHVlLCBkZWVwKSkge1xuICAgICAgICAgICAgdmFyIHN0ciA9IHNoYWxsb3dTdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0ciArIFwiIGRvZXMgbm90IG1hdGNoIHR5cGUgXCIgKyB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIEJhc2VUeXBlLnByb3RvdHlwZS5hcnJheU9mID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZWxlbVR5cGUgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IEFycmF5VHlwZShlbGVtVHlwZSk7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZVR5cGU7XG59KCkpO1xudmFyIEFycmF5VHlwZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhBcnJheVR5cGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQXJyYXlUeXBlKGVsZW1UeXBlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmVsZW1UeXBlID0gZWxlbVR5cGU7XG4gICAgICAgIF90aGlzLmtpbmQgPSBcIkFycmF5VHlwZVwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEFycmF5VHlwZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIltcIiArIHRoaXMuZWxlbVR5cGUgKyBcIl1cIjtcbiAgICB9O1xuICAgIEFycmF5VHlwZS5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KGZ1bmN0aW9uIChlbGVtKSB7IHJldHVybiBfdGhpcy5lbGVtVHlwZS5jaGVjayhlbGVtLCBkZWVwKTsgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQXJyYXlUeXBlO1xufShCYXNlVHlwZSkpO1xudmFyIElkZW50aXR5VHlwZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhJZGVudGl0eVR5cGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSWRlbnRpdHlUeXBlKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIF90aGlzLmtpbmQgPSBcIklkZW50aXR5VHlwZVwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIElkZW50aXR5VHlwZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodGhpcy52YWx1ZSk7XG4gICAgfTtcbiAgICBJZGVudGl0eVR5cGUucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24gKHZhbHVlLCBkZWVwKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZSA9PT0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKCFyZXN1bHQgJiYgdHlwZW9mIGRlZXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZGVlcCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHJldHVybiBJZGVudGl0eVR5cGU7XG59KEJhc2VUeXBlKSk7XG52YXIgT2JqZWN0VHlwZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhPYmplY3RUeXBlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE9iamVjdFR5cGUoZmllbGRzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICAgICAgX3RoaXMua2luZCA9IFwiT2JqZWN0VHlwZVwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE9iamVjdFR5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJ7IFwiICsgdGhpcy5maWVsZHMuam9pbihcIiwgXCIpICsgXCIgfVwiO1xuICAgIH07XG4gICAgT2JqZWN0VHlwZS5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgcmV0dXJuIChvYmpUb1N0ci5jYWxsKHZhbHVlKSA9PT0gb2JqVG9TdHIuY2FsbCh7fSkgJiZcbiAgICAgICAgICAgIHRoaXMuZmllbGRzLmV2ZXJ5KGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZC50eXBlLmNoZWNrKHZhbHVlW2ZpZWxkLm5hbWVdLCBkZWVwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBPYmplY3RUeXBlO1xufShCYXNlVHlwZSkpO1xudmFyIE9yVHlwZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhPclR5cGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gT3JUeXBlKHR5cGVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnR5cGVzID0gdHlwZXM7XG4gICAgICAgIF90aGlzLmtpbmQgPSBcIk9yVHlwZVwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE9yVHlwZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVzLmpvaW4oXCIgfCBcIik7XG4gICAgfTtcbiAgICBPclR5cGUucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24gKHZhbHVlLCBkZWVwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVzLnNvbWUoZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlLmNoZWNrKHZhbHVlLCBkZWVwKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gT3JUeXBlO1xufShCYXNlVHlwZSkpO1xudmFyIFByZWRpY2F0ZVR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoUHJlZGljYXRlVHlwZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQcmVkaWNhdGVUeXBlKG5hbWUsIHByZWRpY2F0ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgX3RoaXMucHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgICAgICBfdGhpcy5raW5kID0gXCJQcmVkaWNhdGVUeXBlXCI7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUHJlZGljYXRlVHlwZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfTtcbiAgICBQcmVkaWNhdGVUeXBlLnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5wcmVkaWNhdGUodmFsdWUsIGRlZXApO1xuICAgICAgICBpZiAoIXJlc3VsdCAmJiB0eXBlb2YgZGVlcCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkZWVwKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgcmV0dXJuIFByZWRpY2F0ZVR5cGU7XG59KEJhc2VUeXBlKSk7XG52YXIgRGVmID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZih0eXBlLCB0eXBlTmFtZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7XG4gICAgICAgIHRoaXMuYmFzZU5hbWVzID0gW107XG4gICAgICAgIHRoaXMub3duRmllbGRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgLy8gSW5jbHVkZXMgb3duIHR5cGVOYW1lLiBQb3B1bGF0ZWQgZHVyaW5nIGZpbmFsaXphdGlvbi5cbiAgICAgICAgdGhpcy5hbGxTdXBlcnR5cGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgLy8gTGluZWFyIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gUG9wdWxhdGVkIGR1cmluZyBmaW5hbGl6YXRpb24uXG4gICAgICAgIHRoaXMuc3VwZXJ0eXBlTGlzdCA9IFtdO1xuICAgICAgICAvLyBJbmNsdWRlcyBpbmhlcml0ZWQgZmllbGRzLlxuICAgICAgICB0aGlzLmFsbEZpZWxkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIE5vbi1oaWRkZW4ga2V5cyBvZiBhbGxGaWVsZHMuXG4gICAgICAgIHRoaXMuZmllbGROYW1lcyA9IFtdO1xuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IHdpbGwgYmUgb3ZlcnJpZGRlbiBhcyB0cnVlIGJ5IGluZGl2aWR1YWwgRGVmIGluc3RhbmNlc1xuICAgICAgICAvLyB3aGVuIHRoZXkgYXJlIGZpbmFsaXplZC5cbiAgICAgICAgdGhpcy5maW5hbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gRmFsc2UgYnkgZGVmYXVsdCB1bnRpbCAuYnVpbGQoLi4uKSBpcyBjYWxsZWQgb24gYW4gaW5zdGFuY2UuXG4gICAgICAgIHRoaXMuYnVpbGRhYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnVpbGRQYXJhbXMgPSBbXTtcbiAgICB9XG4gICAgRGVmLnByb3RvdHlwZS5pc1N1cGVydHlwZU9mID0gZnVuY3Rpb24gKHRoYXQpIHtcbiAgICAgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBEZWYpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmFsaXplZCAhPT0gdHJ1ZSB8fFxuICAgICAgICAgICAgICAgIHRoYXQuZmluYWxpemVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhc093bi5jYWxsKHRoYXQuYWxsU3VwZXJ0eXBlcywgdGhpcy50eXBlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhhdCArIFwiIGlzIG5vdCBhIERlZlwiKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVmLnByb3RvdHlwZS5jaGVja0FsbEZpZWxkcyA9IGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkge1xuICAgICAgICB2YXIgYWxsRmllbGRzID0gdGhpcy5hbGxGaWVsZHM7XG4gICAgICAgIGlmICh0aGlzLmZpbmFsaXplZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIgKyB0aGlzLnR5cGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBjaGVja0ZpZWxkQnlOYW1lKG5hbWUpIHtcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IGFsbEZpZWxkc1tuYW1lXTtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZmllbGQudHlwZTtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGZpZWxkLmdldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlLmNoZWNrKGNoaWxkLCBkZWVwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgT2JqZWN0LmtleXMoYWxsRmllbGRzKS5ldmVyeShjaGVja0ZpZWxkQnlOYW1lKTtcbiAgICB9O1xuICAgIERlZi5wcm90b3R5cGUuYmFzZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdXBlcnR5cGVOYW1lcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgc3VwZXJ0eXBlTmFtZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmFzZXMgPSB0aGlzLmJhc2VOYW1lcztcbiAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XG4gICAgICAgICAgICBpZiAoc3VwZXJ0eXBlTmFtZXMubGVuZ3RoICE9PSBiYXNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1cGVydHlwZU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1cGVydHlwZU5hbWVzW2ldICE9PSBiYXNlc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXJ0eXBlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoYmFzZU5hbWUpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaW5kZXhPZiBsb29rdXAgbWF5IGJlIE8obiksIGJ1dCB0aGUgdHlwaWNhbCBudW1iZXIgb2YgYmFzZVxuICAgICAgICAgICAgLy8gbmFtZXMgaXMgdmVyeSBzbWFsbCwgYW5kIGluZGV4T2YgaXMgYSBuYXRpdmUgQXJyYXkgbWV0aG9kLlxuICAgICAgICAgICAgaWYgKGJhc2VzLmluZGV4T2YoYmFzZU5hbWUpIDwgMCkge1xuICAgICAgICAgICAgICAgIGJhc2VzLnB1c2goYmFzZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7IC8vIEZvciBjaGFpbmluZy5cbiAgICB9O1xuICAgIHJldHVybiBEZWY7XG59KCkpO1xuZXhwb3J0cy5EZWYgPSBEZWY7XG52YXIgRmllbGQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRmllbGQobmFtZSwgdHlwZSwgZGVmYXVsdEZuLCBoaWRkZW4pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0Rm4gPSBkZWZhdWx0Rm47XG4gICAgICAgIHRoaXMuaGlkZGVuID0gISFoaWRkZW47XG4gICAgfVxuICAgIEZpZWxkLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMubmFtZSkgKyBcIjogXCIgKyB0aGlzLnR5cGU7XG4gICAgfTtcbiAgICBGaWVsZC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG9ialt0aGlzLm5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRlZmF1bHRGbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGVmYXVsdEZuLmNhbGwob2JqKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICByZXR1cm4gRmllbGQ7XG59KCkpO1xuZnVuY3Rpb24gc2hhbGxvd1N0cmluZ2lmeSh2YWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gXCJbXCIgKyB2YWx1ZS5tYXAoc2hhbGxvd1N0cmluZ2lmeSkuam9pbihcIiwgXCIpICsgXCJdXCI7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIFwieyBcIiArIE9iamVjdC5rZXlzKHZhbHVlKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGtleSArIFwiOiBcIiArIHZhbHVlW2tleV07XG4gICAgICAgIH0pLmpvaW4oXCIsIFwiKSArIFwiIH1cIjtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHR5cGVzUGx1Z2luKF9mb3JrKSB7XG4gICAgdmFyIFR5cGUgPSB7XG4gICAgICAgIG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdHlwZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgT3JUeXBlKHR5cGVzLm1hcChmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gVHlwZS5mcm9tKHR5cGUpOyB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZyb206IGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlUeXBlIHx8XG4gICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBJZGVudGl0eVR5cGUgfHxcbiAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdFR5cGUgfHxcbiAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE9yVHlwZSB8fFxuICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgUHJlZGljYXRlVHlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBEZWYgdHlwZSBpcyB1c2VkIGFzIGEgaGVscGVyIGZvciBjb25zdHJ1Y3RpbmcgY29tcG91bmRcbiAgICAgICAgICAgIC8vIGludGVyZmFjZSB0eXBlcyBmb3IgQVNUIG5vZGVzLlxuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGVmKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTdXBwb3J0IFtFbGVtVHlwZV0gc3ludGF4LlxuICAgICAgICAgICAgaWYgKGlzQXJyYXkuY2hlY2sodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvbmx5IG9uZSBlbGVtZW50IHR5cGUgaXMgcGVybWl0dGVkIGZvciB0eXBlZCBhcnJheXNcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlUeXBlKFR5cGUuZnJvbSh2YWx1ZVswXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3VwcG9ydCB7IHNvbWVGaWVsZDogRmllbGRUeXBlLCAuLi4gfSBzeW50YXguXG4gICAgICAgICAgICBpZiAoaXNPYmplY3QuY2hlY2sodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RUeXBlKE9iamVjdC5rZXlzKHZhbHVlKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZChuYW1lLCBUeXBlLmZyb20odmFsdWVbbmFtZV0sIG5hbWUpKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmljZkluZGV4ID0gYnVpbHRJbkN0b3JGbnMuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGJpY2ZJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsdEluQ3RvclR5cGVzW2JpY2ZJbmRleF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIG5hbWVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlVHlwZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBcyBhIGxhc3QgcmVzb3J0LCB0b1R5cGUgcmV0dXJucyBhIHR5cGUgdGhhdCBtYXRjaGVzIGFueSB2YWx1ZSB0aGF0XG4gICAgICAgICAgICAvLyBpcyA9PT0gZnJvbS4gVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBsaXRlcmFsIHZhbHVlcyBsaWtlXG4gICAgICAgICAgICAvLyB0b1R5cGUobnVsbCksIGJ1dCBpdCBoYXMgdGhlIGFkZGl0aW9uYWwgYWR2YW50YWdlIG9mIGFsbG93aW5nXG4gICAgICAgICAgICAvLyB0b1R5cGUgdG8gYmUgYSB0b3RhbCBmdW5jdGlvbi5cbiAgICAgICAgICAgIHJldHVybiBuZXcgSWRlbnRpdHlUeXBlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gRGVmaW5lIGEgdHlwZSB3aG9zZSBuYW1lIGlzIHJlZ2lzdGVyZWQgaW4gYSBuYW1lc3BhY2UgKHRoZSBkZWZDYWNoZSkgc29cbiAgICAgICAgLy8gdGhhdCBmdXR1cmUgZGVmaW5pdGlvbnMgd2lsbCByZXR1cm4gdGhlIHNhbWUgdHlwZSBnaXZlbiB0aGUgc2FtZSBuYW1lLlxuICAgICAgICAvLyBJbiBwYXJ0aWN1bGFyLCB0aGlzIHN5c3RlbSBhbGxvd3MgZm9yIGNpcmN1bGFyIGFuZCBmb3J3YXJkIGRlZmluaXRpb25zLlxuICAgICAgICAvLyBUaGUgRGVmIG9iamVjdCBkIHJldHVybmVkIGZyb20gVHlwZS5kZWYgbWF5IGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZVxuICAgICAgICAvLyB0eXBlIGQudHlwZSBieSBjYWxsaW5nIG1ldGhvZHMgc3VjaCBhcyBkLmJhc2VzLCBkLmJ1aWxkLCBhbmQgZC5maWVsZC5cbiAgICAgICAgZGVmOiBmdW5jdGlvbiAodHlwZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNPd24uY2FsbChkZWZDYWNoZSwgdHlwZU5hbWUpXG4gICAgICAgICAgICAgICAgPyBkZWZDYWNoZVt0eXBlTmFtZV1cbiAgICAgICAgICAgICAgICA6IGRlZkNhY2hlW3R5cGVOYW1lXSA9IG5ldyBEZWZJbXBsKHR5cGVOYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzRGVmOiBmdW5jdGlvbiAodHlwZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNPd24uY2FsbChkZWZDYWNoZSwgdHlwZU5hbWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgYnVpbHRJbkN0b3JGbnMgPSBbXTtcbiAgICB2YXIgYnVpbHRJbkN0b3JUeXBlcyA9IFtdO1xuICAgIGZ1bmN0aW9uIGRlZkJ1aWx0SW5UeXBlKG5hbWUsIGV4YW1wbGUpIHtcbiAgICAgICAgdmFyIG9ialN0ciA9IG9ialRvU3RyLmNhbGwoZXhhbXBsZSk7XG4gICAgICAgIHZhciB0eXBlID0gbmV3IFByZWRpY2F0ZVR5cGUobmFtZSwgZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBvYmpUb1N0ci5jYWxsKHZhbHVlKSA9PT0gb2JqU3RyOyB9KTtcbiAgICAgICAgaWYgKGV4YW1wbGUgJiYgdHlwZW9mIGV4YW1wbGUuY29uc3RydWN0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgYnVpbHRJbkN0b3JGbnMucHVzaChleGFtcGxlLmNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIGJ1aWx0SW5DdG9yVHlwZXMucHVzaCh0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gICAgLy8gVGhlc2UgdHlwZXMgY2hlY2sgdGhlIHVuZGVybHlpbmcgW1tDbGFzc11dIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW5cbiAgICAvLyB2YWx1ZSwgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIHByb2JsZW1hdGljIHR5cGVvZiBvcGVyYXRvci4gTm90ZSBob3dldmVyXG4gICAgLy8gdGhhdCBubyBzdWJ0eXBpbmcgaXMgY29uc2lkZXJlZDsgc28sIGZvciBpbnN0YW5jZSwgaXNPYmplY3QuY2hlY2tcbiAgICAvLyByZXR1cm5zIGZhbHNlIGZvciBbXSwgLy4vLCBuZXcgRGF0ZSwgYW5kIG51bGwuXG4gICAgdmFyIGlzU3RyaW5nID0gZGVmQnVpbHRJblR5cGUoXCJzdHJpbmdcIiwgXCJ0cnV0aHlcIik7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSBkZWZCdWlsdEluVHlwZShcImZ1bmN0aW9uXCIsIGZ1bmN0aW9uICgpIHsgfSk7XG4gICAgdmFyIGlzQXJyYXkgPSBkZWZCdWlsdEluVHlwZShcImFycmF5XCIsIFtdKTtcbiAgICB2YXIgaXNPYmplY3QgPSBkZWZCdWlsdEluVHlwZShcIm9iamVjdFwiLCB7fSk7XG4gICAgdmFyIGlzUmVnRXhwID0gZGVmQnVpbHRJblR5cGUoXCJSZWdFeHBcIiwgLy4vKTtcbiAgICB2YXIgaXNEYXRlID0gZGVmQnVpbHRJblR5cGUoXCJEYXRlXCIsIG5ldyBEYXRlKCkpO1xuICAgIHZhciBpc051bWJlciA9IGRlZkJ1aWx0SW5UeXBlKFwibnVtYmVyXCIsIDMpO1xuICAgIHZhciBpc0Jvb2xlYW4gPSBkZWZCdWlsdEluVHlwZShcImJvb2xlYW5cIiwgdHJ1ZSk7XG4gICAgdmFyIGlzTnVsbCA9IGRlZkJ1aWx0SW5UeXBlKFwibnVsbFwiLCBudWxsKTtcbiAgICB2YXIgaXNVbmRlZmluZWQgPSBkZWZCdWlsdEluVHlwZShcInVuZGVmaW5lZFwiLCB1bmRlZmluZWQpO1xuICAgIHZhciBidWlsdEluVHlwZXMgPSB7XG4gICAgICAgIHN0cmluZzogaXNTdHJpbmcsXG4gICAgICAgIGZ1bmN0aW9uOiBpc0Z1bmN0aW9uLFxuICAgICAgICBhcnJheTogaXNBcnJheSxcbiAgICAgICAgb2JqZWN0OiBpc09iamVjdCxcbiAgICAgICAgUmVnRXhwOiBpc1JlZ0V4cCxcbiAgICAgICAgRGF0ZTogaXNEYXRlLFxuICAgICAgICBudW1iZXI6IGlzTnVtYmVyLFxuICAgICAgICBib29sZWFuOiBpc0Jvb2xlYW4sXG4gICAgICAgIG51bGw6IGlzTnVsbCxcbiAgICAgICAgdW5kZWZpbmVkOiBpc1VuZGVmaW5lZCxcbiAgICB9O1xuICAgIC8vIEluIG9yZGVyIHRvIHJldHVybiB0aGUgc2FtZSBEZWYgaW5zdGFuY2UgZXZlcnkgdGltZSBUeXBlLmRlZiBpcyBjYWxsZWRcbiAgICAvLyB3aXRoIGEgcGFydGljdWxhciBuYW1lLCB0aG9zZSBpbnN0YW5jZXMgbmVlZCB0byBiZSBzdG9yZWQgaW4gYSBjYWNoZS5cbiAgICB2YXIgZGVmQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZ1bmN0aW9uIGRlZkZyb21WYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IHZhbHVlLnR5cGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBoYXNPd24uY2FsbChkZWZDYWNoZSwgdHlwZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZCA9IGRlZkNhY2hlW3R5cGVdO1xuICAgICAgICAgICAgICAgIGlmIChkLmZpbmFsaXplZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBEZWZJbXBsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICB0c2xpYl8xLl9fZXh0ZW5kcyhEZWZJbXBsLCBfc3VwZXIpO1xuICAgICAgICBmdW5jdGlvbiBEZWZJbXBsKHR5cGVOYW1lKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBuZXcgUHJlZGljYXRlVHlwZSh0eXBlTmFtZSwgZnVuY3Rpb24gKHZhbHVlLCBkZWVwKSB7IHJldHVybiBfdGhpcy5jaGVjayh2YWx1ZSwgZGVlcCk7IH0pLCB0eXBlTmFtZSkgfHwgdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfdGhpcztcbiAgICAgICAgfVxuICAgICAgICBEZWZJbXBsLnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicHJlbWF0dXJlbHkgY2hlY2tpbmcgdW5maW5hbGl6ZWQgdHlwZSBcIiArIHRoaXMudHlwZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQSBEZWYgdHlwZSBjYW4gb25seSBtYXRjaCBhbiBvYmplY3QgdmFsdWUuXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZEZWYgPSBkZWZGcm9tVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgaWYgKCF2RGVmKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgY291bGRuJ3QgaW5mZXIgdGhlIERlZiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHZhbHVlLFxuICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBleHBlY3RlZCBpdCB0byBiZSBhIFNvdXJjZUxvY2F0aW9uIG9yIGEgUG9zaXRpb24sIGl0IHdhc1xuICAgICAgICAgICAgICAgIC8vIHByb2JhYmx5IGp1c3QgbWlzc2luZyBhIFwidHlwZVwiIGZpZWxkIChiZWNhdXNlIEVzcHJpbWEgZG9lcyBub3RcbiAgICAgICAgICAgICAgICAvLyBhc3NpZ24gYSB0eXBlIHByb3BlcnR5IHRvIHN1Y2ggbm9kZXMpLiBCZSBvcHRpbWlzdGljIGFuZCBsZXRcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmNoZWNrQWxsRmllbGRzIG1ha2UgdGhlIGZpbmFsIGRlY2lzaW9uLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnR5cGVOYW1lID09PSBcIlNvdXJjZUxvY2F0aW9uXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlTmFtZSA9PT0gXCJQb3NpdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrQWxsRmllbGRzKHZhbHVlLCBkZWVwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ2FsbGluZyB0aGlzLmNoZWNrQWxsRmllbGRzIGZvciBhbnkgb3RoZXIgdHlwZSBvZiBub2RlIGlzIGJvdGhcbiAgICAgICAgICAgICAgICAvLyBiYWQgZm9yIHBlcmZvcm1hbmNlIGFuZCB3YXkgdG9vIGZvcmdpdmluZy5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBjaGVja2luZyBkZWVwbHkgYW5kIHZEZWYgPT09IHRoaXMsIHRoZW4gd2Ugb25seSBuZWVkIHRvIGNhbGxcbiAgICAgICAgICAgIC8vIGNoZWNrQWxsRmllbGRzIG9uY2UuIENhbGxpbmcgY2hlY2tBbGxGaWVsZHMgaXMgdG9vIHN0cmljdCB3aGVuIGRlZXBcbiAgICAgICAgICAgIC8vIGlzIGZhbHNlLCBiZWNhdXNlIHRoZW4gd2Ugb25seSBjYXJlIGFib3V0IHRoaXMuaXNTdXBlcnR5cGVPZih2RGVmKS5cbiAgICAgICAgICAgIGlmIChkZWVwICYmIHZEZWYgPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGVja0FsbEZpZWxkcyh2YWx1ZSwgZGVlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbiBtb3N0IGNhc2VzIHdlIHJlbHkgZXhjbHVzaXZlbHkgb24gaXNTdXBlcnR5cGVPZiB0byBtYWtlIE8oMSlcbiAgICAgICAgICAgIC8vIHN1YnR5cGluZyBkZXRlcm1pbmF0aW9ucy4gVGhpcyBzdWZmaWNlcyBpbiBtb3N0IHNpdHVhdGlvbnMgb3V0c2lkZVxuICAgICAgICAgICAgLy8gb2YgdW5pdCB0ZXN0cywgc2luY2UgaW50ZXJmYWNlIGNvbmZvcm1hbmNlIGlzIGNoZWNrZWQgd2hlbmV2ZXIgbmV3XG4gICAgICAgICAgICAvLyBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgdXNpbmcgYnVpbGRlciBmdW5jdGlvbnMuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTdXBlcnR5cGVPZih2RGVmKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBleGNlcHRpb24gaXMgd2hlbiBkZWVwIGlzIHRydWU7IHRoZW4sIHdlIHJlY3Vyc2l2ZWx5IGNoZWNrIGFsbFxuICAgICAgICAgICAgLy8gZmllbGRzLlxuICAgICAgICAgICAgaWYgKCFkZWVwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBVc2UgdGhlIG1vcmUgc3BlY2lmaWMgRGVmICh2RGVmKSB0byBwZXJmb3JtIHRoZSBkZWVwIGNoZWNrLCBidXRcbiAgICAgICAgICAgIC8vIHNoYWxsb3ctY2hlY2sgZmllbGRzIGRlZmluZWQgYnkgdGhlIGxlc3Mgc3BlY2lmaWMgRGVmICh0aGlzKS5cbiAgICAgICAgICAgIHJldHVybiB2RGVmLmNoZWNrQWxsRmllbGRzKHZhbHVlLCBkZWVwKVxuICAgICAgICAgICAgICAgICYmIHRoaXMuY2hlY2tBbGxGaWVsZHModmFsdWUsIGZhbHNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgRGVmSW1wbC5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGJ1aWxkUGFyYW1zID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGJ1aWxkUGFyYW1zW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDYWxsaW5nIERlZi5wcm90b3R5cGUuYnVpbGQgbXVsdGlwbGUgdGltZXMgaGFzIHRoZSBlZmZlY3Qgb2YgbWVyZWx5XG4gICAgICAgICAgICAvLyByZWRlZmluaW5nIHRoaXMgcHJvcGVydHkuXG4gICAgICAgICAgICB0aGlzLmJ1aWxkUGFyYW1zID0gYnVpbGRQYXJhbXM7XG4gICAgICAgICAgICBpZiAodGhpcy5idWlsZGFibGUpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIERlZiBpcyBhbHJlYWR5IGJ1aWxkYWJsZSwgdXBkYXRlIHNlbGYuYnVpbGRQYXJhbXMgYW5kXG4gICAgICAgICAgICAgICAgLy8gY29udGludWUgdXNpbmcgdGhlIG9sZCBidWlsZGVyIGZ1bmN0aW9uLlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRXZlcnkgYnVpbGRhYmxlIHR5cGUgd2lsbCBoYXZlIGl0cyBcInR5cGVcIiBmaWVsZCBmaWxsZWQgaW5cbiAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkuIFRoaXMgaW5jbHVkZXMgdHlwZXMgdGhhdCBhcmUgbm90IHN1YnR5cGVzIG9mIE5vZGUsXG4gICAgICAgICAgICAvLyBsaWtlIFNvdXJjZUxvY2F0aW9uLCBidXQgdGhhdCBzZWVtcyBoYXJtbGVzcyAoVE9ETz8pLlxuICAgICAgICAgICAgdGhpcy5maWVsZChcInR5cGVcIiwgU3RyaW5nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy50eXBlTmFtZTsgfSk7XG4gICAgICAgICAgICAvLyBPdmVycmlkZSBEcC5idWlsZGFibGUgZm9yIHRoaXMgRGVmIGluc3RhbmNlLlxuICAgICAgICAgICAgdGhpcy5idWlsZGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIGFkZFBhcmFtID0gZnVuY3Rpb24gKGJ1aWx0LCBwYXJhbSwgYXJnLCBpc0FyZ0F2YWlsYWJsZSkge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChidWlsdCwgcGFyYW0pKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgdmFyIGFsbCA9IF90aGlzLmFsbEZpZWxkcztcbiAgICAgICAgICAgICAgICBpZiAoIWhhc093bi5jYWxsKGFsbCwgcGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiICsgcGFyYW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBhbGxbcGFyYW1dO1xuICAgICAgICAgICAgICAgIHZhciB0eXBlID0gZmllbGQudHlwZTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJnQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5kZWZhdWx0Rm4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXhwb3NlIHRoZSBwYXJ0aWFsbHktYnVpbHQgb2JqZWN0IHRvIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGFzIGl0cyBgdGhpc2Agb2JqZWN0LlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRGbi5jYWxsKGJ1aWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gXCJubyB2YWx1ZSBvciBkZWZhdWx0IGZ1bmN0aW9uIGdpdmVuIGZvciBmaWVsZCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShwYXJhbSkgKyBcIiBvZiBcIiArIF90aGlzLnR5cGVOYW1lICsgXCIoXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuYnVpbGRQYXJhbXMubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbFtuYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oXCIsIFwiKSArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdHlwZS5jaGVjayh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYWxsb3dTdHJpbmdpZnkodmFsdWUpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGRvZXMgbm90IG1hdGNoIGZpZWxkIFwiICsgZmllbGQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIgb2YgdHlwZSBcIiArIF90aGlzLnR5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVpbHRbcGFyYW1dID0gdmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ2FsbGluZyB0aGUgYnVpbGRlciBmdW5jdGlvbiB3aWxsIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgRGVmLFxuICAgICAgICAgICAgLy8gd2l0aCBwb3NpdGlvbmFsIGFyZ3VtZW50cyBtYXBwZWQgdG8gdGhlIGZpZWxkcyBvcmlnaW5hbCBwYXNzZWQgdG8gLmJ1aWxkLlxuICAgICAgICAgICAgLy8gSWYgbm90IGVub3VnaCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHJlbWFpbmluZyBmaWVsZHNcbiAgICAgICAgICAgIC8vIHdpbGwgYmUgdXNlZC5cbiAgICAgICAgICAgIHZhciBidWlsZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYXJnYyA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmICghX3RoaXMuZmluYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImF0dGVtcHRpbmcgdG8gaW5zdGFudGlhdGUgdW5maW5hbGl6ZWQgdHlwZSBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy50eXBlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBidWlsdCA9IE9iamVjdC5jcmVhdGUobm9kZVByb3RvdHlwZSk7XG4gICAgICAgICAgICAgICAgX3RoaXMuYnVpbGRQYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0sIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBhcmdjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbShidWlsdCwgcGFyYW0sIGFyZ3NbaV0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW0oYnVpbHQsIHBhcmFtLCBudWxsLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhfdGhpcy5hbGxGaWVsZHMpLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW0oYnVpbHQsIHBhcmFtLCBudWxsLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIFwidHlwZVwiIGZpZWxkIHdhcyBmaWxsZWQgYXV0b21hdGljYWxseS5cbiAgICAgICAgICAgICAgICBpZiAoYnVpbHQudHlwZSAhPT0gX3RoaXMudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYnVpbHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ2FsbGluZyAuZnJvbSBvbiB0aGUgYnVpbGRlciBmdW5jdGlvbiB3aWxsIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgRGVmLFxuICAgICAgICAgICAgLy8gdXNpbmcgZmllbGQgdmFsdWVzIGZyb20gdGhlIHBhc3NlZCBvYmplY3QuIEZvciBmaWVsZHMgbWlzc2luZyBmcm9tIHRoZSBwYXNzZWQgb2JqZWN0LFxuICAgICAgICAgICAgLy8gdGhlaXIgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuXG4gICAgICAgICAgICBidWlsZGVyLmZyb20gPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfdGhpcy5maW5hbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXR0ZW1wdGluZyB0byBpbnN0YW50aWF0ZSB1bmZpbmFsaXplZCB0eXBlIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnR5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJ1aWx0ID0gT2JqZWN0LmNyZWF0ZShub2RlUHJvdG90eXBlKTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhfdGhpcy5hbGxGaWVsZHMpLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChvYmosIHBhcmFtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW0oYnVpbHQsIHBhcmFtLCBvYmpbcGFyYW1dLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtKGJ1aWx0LCBwYXJhbSwgbnVsbCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIFwidHlwZVwiIGZpZWxkIHdhcyBmaWxsZWQgYXV0b21hdGljYWxseS5cbiAgICAgICAgICAgICAgICBpZiAoYnVpbHQudHlwZSAhPT0gX3RoaXMudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYnVpbHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGJ1aWxkZXJzLCBnZXRCdWlsZGVyTmFtZSh0aGlzLnR5cGVOYW1lKSwge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGJ1aWxkZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFRoZSByZWFzb24gZmllbGRzIGFyZSBzcGVjaWZpZWQgdXNpbmcgLmZpZWxkKC4uLikgaW5zdGVhZCBvZiBhbiBvYmplY3RcbiAgICAgICAgLy8gbGl0ZXJhbCBzeW50YXggaXMgc29tZXdoYXQgc3VidGxlOiB0aGUgb2JqZWN0IGxpdGVyYWwgc3ludGF4IHdvdWxkXG4gICAgICAgIC8vIHN1cHBvcnQgb25seSBvbmUga2V5IGFuZCBvbmUgdmFsdWUsIGJ1dCB3aXRoIC5maWVsZCguLi4pIHdlIGNhbiBwYXNzXG4gICAgICAgIC8vIGFueSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGZpZWxkLlxuICAgICAgICBEZWZJbXBsLnByb3RvdHlwZS5maWVsZCA9IGZ1bmN0aW9uIChuYW1lLCB0eXBlLCBkZWZhdWx0Rm4sIGhpZGRlbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIklnbm9yaW5nIGF0dGVtcHQgdG8gcmVkZWZpbmUgZmllbGQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuYW1lKSArIFwiIG9mIGZpbmFsaXplZCB0eXBlIFwiICtcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy50eXBlTmFtZSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vd25GaWVsZHNbbmFtZV0gPSBuZXcgRmllbGQobmFtZSwgVHlwZS5mcm9tKHR5cGUpLCBkZWZhdWx0Rm4sIGhpZGRlbik7XG4gICAgICAgICAgICByZXR1cm4gdGhpczsgLy8gRm9yIGNoYWluaW5nLlxuICAgICAgICB9O1xuICAgICAgICBEZWZJbXBsLnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAvLyBJdCdzIG5vdCBhbiBlcnJvciB0byBmaW5hbGl6ZSBhIHR5cGUgbW9yZSB0aGFuIG9uY2UsIGJ1dCBvbmx5IHRoZVxuICAgICAgICAgICAgLy8gZmlyc3QgY2FsbCB0byAuZmluYWxpemUgZG9lcyBhbnl0aGluZy5cbiAgICAgICAgICAgIGlmICghdGhpcy5maW5hbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWxsRmllbGRzID0gdGhpcy5hbGxGaWVsZHM7XG4gICAgICAgICAgICAgICAgdmFyIGFsbFN1cGVydHlwZXMgPSB0aGlzLmFsbFN1cGVydHlwZXM7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gZGVmQ2FjaGVbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWYgaW5zdGFuY2VvZiBEZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZi5maW5hbGl6ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKGFsbEZpZWxkcywgZGVmLmFsbEZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQoYWxsU3VwZXJ0eXBlcywgZGVmLmFsbFN1cGVydHlwZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBcInVua25vd24gc3VwZXJ0eXBlIG5hbWUgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBmb3Igc3VidHlwZSBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoX3RoaXMudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyBXYXJuIGlmIGZpZWxkcyBhcmUgb3ZlcnJpZGRlbiB3aXRoIGluY29tcGF0aWJsZSB0eXBlcy5cbiAgICAgICAgICAgICAgICBleHRlbmQoYWxsRmllbGRzLCB0aGlzLm93bkZpZWxkcyk7XG4gICAgICAgICAgICAgICAgYWxsU3VwZXJ0eXBlc1t0aGlzLnR5cGVOYW1lXSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgdGhpcy5maWVsZE5hbWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgZmllbGROYW1lIGluIGFsbEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoYWxsRmllbGRzLCBmaWVsZE5hbWUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhYWxsRmllbGRzW2ZpZWxkTmFtZV0uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpZWxkTmFtZXMucHVzaChmaWVsZE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFR5cGVzIGFyZSBleHBvcnRlZCBvbmx5IG9uY2UgdGhleSBoYXZlIGJlZW4gZmluYWxpemVkLlxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuYW1lZFR5cGVzLCB0aGlzLnR5cGVOYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnR5cGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gQSBsaW5lYXJpemF0aW9uIG9mIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkuXG4gICAgICAgICAgICAgICAgcG9wdWxhdGVTdXBlcnR5cGVMaXN0KHRoaXMudHlwZU5hbWUsIHRoaXMuc3VwZXJ0eXBlTGlzdCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRhYmxlICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJ0eXBlTGlzdC5sYXN0SW5kZXhPZihcIkV4cHJlc3Npb25cIikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICB3cmFwRXhwcmVzc2lvbkJ1aWxkZXJXaXRoU3RhdGVtZW50KHRoaXMudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIERlZkltcGw7XG4gICAgfShEZWYpKTtcbiAgICAvLyBOb3RlIHRoYXQgdGhlIGxpc3QgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBhIGNvcHkgb2YgdGhlIGludGVybmFsXG4gICAgLy8gc3VwZXJ0eXBlTGlzdCwgKndpdGhvdXQqIHRoZSB0eXBlTmFtZSBpdHNlbGYgYXMgdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAgZnVuY3Rpb24gZ2V0U3VwZXJ0eXBlTmFtZXModHlwZU5hbWUpIHtcbiAgICAgICAgaWYgKCFoYXNPd24uY2FsbChkZWZDYWNoZSwgdHlwZU5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGQgPSBkZWZDYWNoZVt0eXBlTmFtZV07XG4gICAgICAgIGlmIChkLmZpbmFsaXplZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkLnN1cGVydHlwZUxpc3Quc2xpY2UoMSk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IG1hcHBpbmcgZnJvbSBldmVyeSBrbm93biB0eXBlIGluIHRoZSBkZWZDYWNoZSB0byB0aGVcbiAgICAvLyBtb3N0IHNwZWNpZmljIHN1cGVydHlwZSB3aG9zZSBuYW1lIGlzIGFuIG93biBwcm9wZXJ0eSBvZiB0aGUgY2FuZGlkYXRlc1xuICAgIC8vIG9iamVjdC5cbiAgICBmdW5jdGlvbiBjb21wdXRlU3VwZXJ0eXBlTG9va3VwVGFibGUoY2FuZGlkYXRlcykge1xuICAgICAgICB2YXIgdGFibGUgPSB7fTtcbiAgICAgICAgdmFyIHR5cGVOYW1lcyA9IE9iamVjdC5rZXlzKGRlZkNhY2hlKTtcbiAgICAgICAgdmFyIHR5cGVOYW1lQ291bnQgPSB0eXBlTmFtZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVOYW1lQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgdmFyIHR5cGVOYW1lID0gdHlwZU5hbWVzW2ldO1xuICAgICAgICAgICAgdmFyIGQgPSBkZWZDYWNoZVt0eXBlTmFtZV07XG4gICAgICAgICAgICBpZiAoZC5maW5hbGl6ZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIiArIHR5cGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZC5zdXBlcnR5cGVMaXN0Lmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1cGVyVHlwZU5hbWUgPSBkLnN1cGVydHlwZUxpc3Rbal07XG4gICAgICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGNhbmRpZGF0ZXMsIHN1cGVyVHlwZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlW3R5cGVOYW1lXSA9IHN1cGVyVHlwZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuICAgIHZhciBidWlsZGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgLy8gVGhpcyBvYmplY3QgaXMgdXNlZCBhcyBwcm90b3R5cGUgZm9yIGFueSBub2RlIGNyZWF0ZWQgYnkgYSBidWlsZGVyLlxuICAgIHZhciBub2RlUHJvdG90eXBlID0ge307XG4gICAgLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGRlZmluZSBhIG5ldyBtZXRob2QgdG8gYmUgc2hhcmVkIGJ5IGFsbCBBU1RcbiAgICAvLyBub2Rlcy4gVGhlIHJlcGxhY2VkIG1ldGhvZCAoaWYgYW55KSBpcyByZXR1cm5lZCBmb3IgZWFzeSB3cmFwcGluZy5cbiAgICBmdW5jdGlvbiBkZWZpbmVNZXRob2QobmFtZSwgZnVuYykge1xuICAgICAgICB2YXIgb2xkID0gbm9kZVByb3RvdHlwZVtuYW1lXTtcbiAgICAgICAgLy8gUGFzcyB1bmRlZmluZWQgYXMgZnVuYyB0byBkZWxldGUgbm9kZVByb3RvdHlwZVtuYW1lXS5cbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkLmNoZWNrKGZ1bmMpKSB7XG4gICAgICAgICAgICBkZWxldGUgbm9kZVByb3RvdHlwZVtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlzRnVuY3Rpb24uYXNzZXJ0KGZ1bmMpO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGVQcm90b3R5cGUsIG5hbWUsIHtcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9sZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0QnVpbGRlck5hbWUodHlwZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVOYW1lLnJlcGxhY2UoL15bQS1aXSsvLCBmdW5jdGlvbiAodXBwZXJDYXNlUHJlZml4KSB7XG4gICAgICAgICAgICB2YXIgbGVuID0gdXBwZXJDYXNlUHJlZml4Lmxlbmd0aDtcbiAgICAgICAgICAgIHN3aXRjaCAobGVuKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIGluaXRpYWwgY2FwaXRhbCBsZXR0ZXIsIGp1c3QgbG93ZXItY2FzZSBpdC5cbiAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiB1cHBlckNhc2VQcmVmaXgudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgaW5pdGlhbCBjYXBpdGFsIGxldHRlciwgbG93ZXItY2FzZVxuICAgICAgICAgICAgICAgICAgICAvLyBhbGwgYnV0IHRoZSBsYXN0IG9uZSwgc28gdGhhdCBYTUxEZWZhdWx0RGVjbGFyYXRpb24gKGZvclxuICAgICAgICAgICAgICAgICAgICAvLyBleGFtcGxlKSBiZWNvbWVzIHhtbERlZmF1bHREZWNsYXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVwcGVyQ2FzZVByZWZpeC5zbGljZSgwLCBsZW4gLSAxKS50b0xvd2VyQ2FzZSgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyQ2FzZVByZWZpeC5jaGFyQXQobGVuIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTdGF0ZW1lbnRCdWlsZGVyTmFtZSh0eXBlTmFtZSkge1xuICAgICAgICB0eXBlTmFtZSA9IGdldEJ1aWxkZXJOYW1lKHR5cGVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHR5cGVOYW1lLnJlcGxhY2UoLyhFeHByZXNzaW9uKT8kLywgXCJTdGF0ZW1lbnRcIik7XG4gICAgfVxuICAgIHZhciBuYW1lZFR5cGVzID0ge307XG4gICAgLy8gTGlrZSBPYmplY3Qua2V5cywgYnV0IGF3YXJlIG9mIHdoYXQgZmllbGRzIGVhY2ggQVNUIHR5cGUgc2hvdWxkIGhhdmUuXG4gICAgZnVuY3Rpb24gZ2V0RmllbGROYW1lcyhvYmplY3QpIHtcbiAgICAgICAgdmFyIGQgPSBkZWZGcm9tVmFsdWUob2JqZWN0KTtcbiAgICAgICAgaWYgKGQpIHtcbiAgICAgICAgICAgIHJldHVybiBkLmZpZWxkTmFtZXMuc2xpY2UoMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwidHlwZVwiIGluIG9iamVjdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGlkIG5vdCByZWNvZ25pemUgb2JqZWN0IG9mIHR5cGUgXCIgK1xuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9iamVjdC50eXBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCk7XG4gICAgfVxuICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IHByb3BlcnR5LCB0YWtpbmcgb2JqZWN0LnR5cGUgYW5kIGRlZmF1bHRcbiAgICAvLyBmdW5jdGlvbnMgaW50byBhY2NvdW50LlxuICAgIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUob2JqZWN0LCBmaWVsZE5hbWUpIHtcbiAgICAgICAgdmFyIGQgPSBkZWZGcm9tVmFsdWUob2JqZWN0KTtcbiAgICAgICAgaWYgKGQpIHtcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IGQuYWxsRmllbGRzW2ZpZWxkTmFtZV07XG4gICAgICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQuZ2V0VmFsdWUob2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdFtmaWVsZE5hbWVdO1xuICAgIH1cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGRlZmluZWQgZmllbGRzIG9mIGFuIG9iamVjdCwgaW5jbHVkaW5nIHRob3NlIG1pc3NpbmdcbiAgICAvLyBvciB1bmRlZmluZWQsIHBhc3NpbmcgZWFjaCBmaWVsZCBuYW1lIGFuZCBlZmZlY3RpdmUgdmFsdWUgKGFzIHJldHVybmVkXG4gICAgLy8gYnkgZ2V0RmllbGRWYWx1ZSkgdG8gdGhlIGNhbGxiYWNrLiBJZiB0aGUgb2JqZWN0IGhhcyBubyBjb3JyZXNwb25kaW5nXG4gICAgLy8gRGVmLCB0aGUgY2FsbGJhY2sgd2lsbCBuZXZlciBiZSBjYWxsZWQuXG4gICAgZnVuY3Rpb24gZWFjaEZpZWxkKG9iamVjdCwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgZ2V0RmllbGROYW1lcyhvYmplY3QpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbmFtZSwgZ2V0RmllbGRWYWx1ZShvYmplY3QsIG5hbWUpKTtcbiAgICAgICAgfSwgY29udGV4dCk7XG4gICAgfVxuICAgIC8vIFNpbWlsYXIgdG8gZWFjaEZpZWxkLCBleGNlcHQgdGhhdCBpdGVyYXRpb24gc3RvcHMgYXMgc29vbiBhcyB0aGVcbiAgICAvLyBjYWxsYmFjayByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLiBMaWtlIEFycmF5LnByb3RvdHlwZS5zb21lLCB0aGUgZmluYWxcbiAgICAvLyByZXN1bHQgaXMgZWl0aGVyIHRydWUgb3IgZmFsc2UgdG8gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhbGxiYWNrXG4gICAgLy8gcmV0dXJuZWQgdHJ1ZSBmb3IgYW55IGVsZW1lbnQgb3Igbm90LlxuICAgIGZ1bmN0aW9uIHNvbWVGaWVsZChvYmplY3QsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBnZXRGaWVsZE5hbWVzKG9iamVjdCkuc29tZShmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbmFtZSwgZ2V0RmllbGRWYWx1ZShvYmplY3QsIG5hbWUpKTtcbiAgICAgICAgfSwgY29udGV4dCk7XG4gICAgfVxuICAgIC8vIEFkZHMgYW4gYWRkaXRpb25hbCBidWlsZGVyIGZvciBFeHByZXNzaW9uIHN1YnR5cGVzXG4gICAgLy8gdGhhdCB3cmFwcyB0aGUgYnVpbHQgRXhwcmVzc2lvbiBpbiBhbiBFeHByZXNzaW9uU3RhdGVtZW50cy5cbiAgICBmdW5jdGlvbiB3cmFwRXhwcmVzc2lvbkJ1aWxkZXJXaXRoU3RhdGVtZW50KHR5cGVOYW1lKSB7XG4gICAgICAgIHZhciB3cmFwcGVyTmFtZSA9IGdldFN0YXRlbWVudEJ1aWxkZXJOYW1lKHR5cGVOYW1lKTtcbiAgICAgICAgLy8gc2tpcCBpZiB0aGUgYnVpbGRlciBhbHJlYWR5IGV4aXN0c1xuICAgICAgICBpZiAoYnVpbGRlcnNbd3JhcHBlck5hbWVdKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyB0aGUgYnVpbGRlciBmdW5jdGlvbiB0byB3cmFwIHdpdGggYnVpbGRlcnMuRXhwcmVzc2lvblN0YXRlbWVudFxuICAgICAgICB2YXIgd3JhcHBlZCA9IGJ1aWxkZXJzW2dldEJ1aWxkZXJOYW1lKHR5cGVOYW1lKV07XG4gICAgICAgIC8vIHNraXAgaWYgdGhlcmUgaXMgbm90aGluZyB0byB3cmFwXG4gICAgICAgIGlmICghd3JhcHBlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGJ1aWxkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlcnMuZXhwcmVzc2lvblN0YXRlbWVudCh3cmFwcGVkLmFwcGx5KGJ1aWxkZXJzLCBhcmdzKSk7XG4gICAgICAgIH07XG4gICAgICAgIGJ1aWxkZXIuZnJvbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBidWlsZGVycy5leHByZXNzaW9uU3RhdGVtZW50KHdyYXBwZWQuZnJvbS5hcHBseShidWlsZGVycywgYXJncykpO1xuICAgICAgICB9O1xuICAgICAgICBidWlsZGVyc1t3cmFwcGVyTmFtZV0gPSBidWlsZGVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3B1bGF0ZVN1cGVydHlwZUxpc3QodHlwZU5hbWUsIGxpc3QpIHtcbiAgICAgICAgbGlzdC5sZW5ndGggPSAwO1xuICAgICAgICBsaXN0LnB1c2godHlwZU5hbWUpO1xuICAgICAgICB2YXIgbGFzdFNlZW4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKHZhciBwb3MgPSAwOyBwb3MgPCBsaXN0Lmxlbmd0aDsgKytwb3MpIHtcbiAgICAgICAgICAgIHR5cGVOYW1lID0gbGlzdFtwb3NdO1xuICAgICAgICAgICAgdmFyIGQgPSBkZWZDYWNoZVt0eXBlTmFtZV07XG4gICAgICAgICAgICBpZiAoZC5maW5hbGl6ZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB3ZSBzYXcgdHlwZU5hbWUgZWFybGllciBpbiB0aGUgYnJlYWR0aC1maXJzdCB0cmF2ZXJzYWwsXG4gICAgICAgICAgICAvLyBkZWxldGUgdGhlIGxhc3Qtc2VlbiBvY2N1cnJlbmNlLlxuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGxhc3RTZWVuLCB0eXBlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbGlzdFtsYXN0U2Vlblt0eXBlTmFtZV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVjb3JkIHRoZSBuZXcgaW5kZXggb2YgdGhlIGxhc3Qtc2VlbiBvY2N1cnJlbmNlIG9mIHR5cGVOYW1lLlxuICAgICAgICAgICAgbGFzdFNlZW5bdHlwZU5hbWVdID0gcG9zO1xuICAgICAgICAgICAgLy8gRW5xdWV1ZSB0aGUgYmFzZSBuYW1lcyBvZiB0aGlzIHR5cGUuXG4gICAgICAgICAgICBsaXN0LnB1c2guYXBwbHkobGlzdCwgZC5iYXNlTmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvbXBhY3Rpb24gbG9vcCB0byByZW1vdmUgYXJyYXkgaG9sZXMuXG4gICAgICAgIGZvciAodmFyIHRvID0gMCwgZnJvbSA9IHRvLCBsZW4gPSBsaXN0Lmxlbmd0aDsgZnJvbSA8IGxlbjsgKytmcm9tKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwobGlzdCwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICBsaXN0W3RvKytdID0gbGlzdFtmcm9tXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsaXN0Lmxlbmd0aCA9IHRvO1xuICAgIH1cbiAgICBmdW5jdGlvbiBleHRlbmQoaW50bywgZnJvbSkge1xuICAgICAgICBPYmplY3Qua2V5cyhmcm9tKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICBpbnRvW25hbWVdID0gZnJvbVtuYW1lXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbnRvO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5hbGl6ZSgpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZGVmQ2FjaGUpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIGRlZkNhY2hlW25hbWVdLmZpbmFsaXplKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBUeXBlOiBUeXBlLFxuICAgICAgICBidWlsdEluVHlwZXM6IGJ1aWx0SW5UeXBlcyxcbiAgICAgICAgZ2V0U3VwZXJ0eXBlTmFtZXM6IGdldFN1cGVydHlwZU5hbWVzLFxuICAgICAgICBjb21wdXRlU3VwZXJ0eXBlTG9va3VwVGFibGU6IGNvbXB1dGVTdXBlcnR5cGVMb29rdXBUYWJsZSxcbiAgICAgICAgYnVpbGRlcnM6IGJ1aWxkZXJzLFxuICAgICAgICBkZWZpbmVNZXRob2Q6IGRlZmluZU1ldGhvZCxcbiAgICAgICAgZ2V0QnVpbGRlck5hbWU6IGdldEJ1aWxkZXJOYW1lLFxuICAgICAgICBnZXRTdGF0ZW1lbnRCdWlsZGVyTmFtZTogZ2V0U3RhdGVtZW50QnVpbGRlck5hbWUsXG4gICAgICAgIG5hbWVkVHlwZXM6IG5hbWVkVHlwZXMsXG4gICAgICAgIGdldEZpZWxkTmFtZXM6IGdldEZpZWxkTmFtZXMsXG4gICAgICAgIGdldEZpZWxkVmFsdWU6IGdldEZpZWxkVmFsdWUsXG4gICAgICAgIGVhY2hGaWVsZDogZWFjaEZpZWxkLFxuICAgICAgICBzb21lRmllbGQ6IHNvbWVGaWVsZCxcbiAgICAgICAgZmluYWxpemU6IGZpbmFsaXplLFxuICAgIH07XG59XG5leHBvcnRzLmRlZmF1bHQgPSB0eXBlc1BsdWdpbjtcbjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy52aXNpdCA9IGV4cG9ydHMudXNlID0gZXhwb3J0cy5UeXBlID0gZXhwb3J0cy5zb21lRmllbGQgPSBleHBvcnRzLlBhdGhWaXNpdG9yID0gZXhwb3J0cy5QYXRoID0gZXhwb3J0cy5Ob2RlUGF0aCA9IGV4cG9ydHMubmFtZWRUeXBlcyA9IGV4cG9ydHMuZ2V0U3VwZXJ0eXBlTmFtZXMgPSBleHBvcnRzLmdldEZpZWxkVmFsdWUgPSBleHBvcnRzLmdldEZpZWxkTmFtZXMgPSBleHBvcnRzLmdldEJ1aWxkZXJOYW1lID0gZXhwb3J0cy5maW5hbGl6ZSA9IGV4cG9ydHMuZWFjaEZpZWxkID0gZXhwb3J0cy5kZWZpbmVNZXRob2QgPSBleHBvcnRzLmJ1aWx0SW5UeXBlcyA9IGV4cG9ydHMuYnVpbGRlcnMgPSBleHBvcnRzLmFzdE5vZGVzQXJlRXF1aXZhbGVudCA9IHZvaWQgMDtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIGZvcmtfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2ZvcmtcIikpO1xudmFyIGNvcmVfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9jb3JlXCIpKTtcbnZhciBlczZfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9lczZcIikpO1xudmFyIGVzN18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZGVmL2VzN1wiKSk7XG52YXIgZXMyMDIwXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvZXMyMDIwXCIpKTtcbnZhciBqc3hfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9qc3hcIikpO1xudmFyIGZsb3dfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9mbG93XCIpKTtcbnZhciBlc3ByaW1hXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvZXNwcmltYVwiKSk7XG52YXIgYmFiZWxfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9iYWJlbFwiKSk7XG52YXIgdHlwZXNjcmlwdF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZGVmL3R5cGVzY3JpcHRcIikpO1xudmFyIGVzX3Byb3Bvc2Fsc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZGVmL2VzLXByb3Bvc2Fsc1wiKSk7XG52YXIgbmFtZWRUeXBlc18xID0gcmVxdWlyZShcIi4vZ2VuL25hbWVkVHlwZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJuYW1lZFR5cGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuYW1lZFR5cGVzXzEubmFtZWRUeXBlczsgfSB9KTtcbnZhciBfYSA9IGZvcmtfMS5kZWZhdWx0KFtcbiAgICAvLyBUaGlzIGNvcmUgbW9kdWxlIG9mIEFTVCB0eXBlcyBjYXB0dXJlcyBFUzUgYXMgaXQgaXMgcGFyc2VkIHRvZGF5IGJ5XG4gICAgLy8gZ2l0Oi8vZ2l0aHViLmNvbS9hcml5YS9lc3ByaW1hLmdpdCNtYXN0ZXIuXG4gICAgY29yZV8xLmRlZmF1bHQsXG4gICAgLy8gRmVlbCBmcmVlIHRvIGFkZCB0byBvciByZW1vdmUgZnJvbSB0aGlzIGxpc3Qgb2YgZXh0ZW5zaW9uIG1vZHVsZXMgdG9cbiAgICAvLyBjb25maWd1cmUgdGhlIHByZWNpc2UgdHlwZSBoaWVyYXJjaHkgdGhhdCB5b3UgbmVlZC5cbiAgICBlczZfMS5kZWZhdWx0LFxuICAgIGVzN18xLmRlZmF1bHQsXG4gICAgZXMyMDIwXzEuZGVmYXVsdCxcbiAgICBqc3hfMS5kZWZhdWx0LFxuICAgIGZsb3dfMS5kZWZhdWx0LFxuICAgIGVzcHJpbWFfMS5kZWZhdWx0LFxuICAgIGJhYmVsXzEuZGVmYXVsdCxcbiAgICB0eXBlc2NyaXB0XzEuZGVmYXVsdCxcbiAgICBlc19wcm9wb3NhbHNfMS5kZWZhdWx0LFxuXSksIGFzdE5vZGVzQXJlRXF1aXZhbGVudCA9IF9hLmFzdE5vZGVzQXJlRXF1aXZhbGVudCwgYnVpbGRlcnMgPSBfYS5idWlsZGVycywgYnVpbHRJblR5cGVzID0gX2EuYnVpbHRJblR5cGVzLCBkZWZpbmVNZXRob2QgPSBfYS5kZWZpbmVNZXRob2QsIGVhY2hGaWVsZCA9IF9hLmVhY2hGaWVsZCwgZmluYWxpemUgPSBfYS5maW5hbGl6ZSwgZ2V0QnVpbGRlck5hbWUgPSBfYS5nZXRCdWlsZGVyTmFtZSwgZ2V0RmllbGROYW1lcyA9IF9hLmdldEZpZWxkTmFtZXMsIGdldEZpZWxkVmFsdWUgPSBfYS5nZXRGaWVsZFZhbHVlLCBnZXRTdXBlcnR5cGVOYW1lcyA9IF9hLmdldFN1cGVydHlwZU5hbWVzLCBuID0gX2EubmFtZWRUeXBlcywgTm9kZVBhdGggPSBfYS5Ob2RlUGF0aCwgUGF0aCA9IF9hLlBhdGgsIFBhdGhWaXNpdG9yID0gX2EuUGF0aFZpc2l0b3IsIHNvbWVGaWVsZCA9IF9hLnNvbWVGaWVsZCwgVHlwZSA9IF9hLlR5cGUsIHVzZSA9IF9hLnVzZSwgdmlzaXQgPSBfYS52aXNpdDtcbmV4cG9ydHMuYXN0Tm9kZXNBcmVFcXVpdmFsZW50ID0gYXN0Tm9kZXNBcmVFcXVpdmFsZW50O1xuZXhwb3J0cy5idWlsZGVycyA9IGJ1aWxkZXJzO1xuZXhwb3J0cy5idWlsdEluVHlwZXMgPSBidWlsdEluVHlwZXM7XG5leHBvcnRzLmRlZmluZU1ldGhvZCA9IGRlZmluZU1ldGhvZDtcbmV4cG9ydHMuZWFjaEZpZWxkID0gZWFjaEZpZWxkO1xuZXhwb3J0cy5maW5hbGl6ZSA9IGZpbmFsaXplO1xuZXhwb3J0cy5nZXRCdWlsZGVyTmFtZSA9IGdldEJ1aWxkZXJOYW1lO1xuZXhwb3J0cy5nZXRGaWVsZE5hbWVzID0gZ2V0RmllbGROYW1lcztcbmV4cG9ydHMuZ2V0RmllbGRWYWx1ZSA9IGdldEZpZWxkVmFsdWU7XG5leHBvcnRzLmdldFN1cGVydHlwZU5hbWVzID0gZ2V0U3VwZXJ0eXBlTmFtZXM7XG5leHBvcnRzLk5vZGVQYXRoID0gTm9kZVBhdGg7XG5leHBvcnRzLlBhdGggPSBQYXRoO1xuZXhwb3J0cy5QYXRoVmlzaXRvciA9IFBhdGhWaXNpdG9yO1xuZXhwb3J0cy5zb21lRmllbGQgPSBzb21lRmllbGQ7XG5leHBvcnRzLlR5cGUgPSBUeXBlO1xuZXhwb3J0cy51c2UgPSB1c2U7XG5leHBvcnRzLnZpc2l0ID0gdmlzaXQ7XG4vLyBQb3B1bGF0ZSB0aGUgZXhwb3J0ZWQgZmllbGRzIG9mIHRoZSBuYW1lZFR5cGVzIG5hbWVzcGFjZSwgd2hpbGUgc3RpbGxcbi8vIHJldGFpbmluZyBpdHMgbWVtYmVyIHR5cGVzLlxuT2JqZWN0LmFzc2lnbihuYW1lZFR5cGVzXzEubmFtZWRUeXBlcywgbik7XG4iLCJmdW5jdGlvbiBpc0J1ZmZlciAodmFsdWUpIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5XG59XG5cbmZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHJldHVybiBCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2MgKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBCdWZmZXIuYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlIChzaXplKSB7XG4gIHJldHVybiBCdWZmZXIuYWxsb2NVbnNhZmUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmVTbG93IChzaXplKSB7XG4gIHJldHVybiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KHNpemUpXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKGEsIGIpXG59XG5cbmZ1bmN0aW9uIGNvbmNhdCAoYnVmZmVycywgdG90YWxMZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycywgdG90YWxMZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGNvcHkgKHNvdXJjZSwgdGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gdG9CdWZmZXIoc291cmNlKS5jb3B5KHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpXG59XG5cbmZ1bmN0aW9uIGVxdWFscyAoYSwgYikge1xuICByZXR1cm4gdG9CdWZmZXIoYSkuZXF1YWxzKGIpXG59XG5cbmZ1bmN0aW9uIGZpbGwgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgZW5kLCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5maWxsKHZhbHVlLCBvZmZzZXQsIGVuZCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGZyb20gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGluY2x1ZGVzIChidWZmZXIsIHZhbHVlLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5pbmNsdWRlcyh2YWx1ZSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGluZGV4T2YgKGJ1ZmZlciwgdmFsdWUsIGJ5ZmVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLmluZGV4T2YodmFsdWUsIGJ5ZmVPZmZzZXQsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBsYXN0SW5kZXhPZiAoYnVmZmVyLCB2YWx1ZSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikubGFzdEluZGV4T2YodmFsdWUsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBzd2FwMTYgKGJ1ZmZlcikge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5zd2FwMTYoKVxufVxuXG5mdW5jdGlvbiBzd2FwMzIgKGJ1ZmZlcikge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5zd2FwMzIoKVxufVxuXG5mdW5jdGlvbiBzd2FwNjQgKGJ1ZmZlcikge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5zd2FwNjQoKVxufVxuXG5mdW5jdGlvbiB0b0J1ZmZlciAoYnVmZmVyKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoYnVmZmVyKSkgcmV0dXJuIGJ1ZmZlclxuICByZXR1cm4gQnVmZmVyLmZyb20oYnVmZmVyLmJ1ZmZlciwgYnVmZmVyLmJ5dGVPZmZzZXQsIGJ1ZmZlci5ieXRlTGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB0b1N0cmluZyAoYnVmZmVyLCBlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS50b1N0cmluZyhlbmNvZGluZywgc3RhcnQsIGVuZClcbn1cblxuZnVuY3Rpb24gd3JpdGUgKGJ1ZmZlciwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGUoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZURvdWJsZUxFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlRmxvYXRMRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiB3cml0ZVVJbnQzMkxFIChidWZmZXIsIHZhbHVlLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGVVSW50MzJMRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiB3cml0ZUludDMyTEUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZUludDMyTEUodmFsdWUsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gcmVhZERvdWJsZUxFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkRG91YmxlTEUob2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkRmxvYXRMRSAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikucmVhZEZsb2F0TEUob2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkVUludDMyTEUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWRVSW50MzJMRShvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWRJbnQzMkxFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkSW50MzJMRShvZmZzZXQpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0J1ZmZlcixcbiAgaXNFbmNvZGluZyxcbiAgYWxsb2MsXG4gIGFsbG9jVW5zYWZlLFxuICBhbGxvY1Vuc2FmZVNsb3csXG4gIGJ5dGVMZW5ndGgsXG4gIGNvbXBhcmUsXG4gIGNvbmNhdCxcbiAgY29weSxcbiAgZXF1YWxzLFxuICBmaWxsLFxuICBmcm9tLFxuICBpbmNsdWRlcyxcbiAgaW5kZXhPZixcbiAgbGFzdEluZGV4T2YsXG4gIHN3YXAxNixcbiAgc3dhcDMyLFxuICBzd2FwNjQsXG4gIHRvQnVmZmVyLFxuICB0b1N0cmluZyxcbiAgd3JpdGUsXG4gIHdyaXRlRG91YmxlTEUsXG4gIHdyaXRlRmxvYXRMRSxcbiAgd3JpdGVVSW50MzJMRSxcbiAgd3JpdGVJbnQzMkxFLFxuICByZWFkRG91YmxlTEUsXG4gIHJlYWRGbG9hdExFLFxuICByZWFkVUludDMyTEUsXG4gIHJlYWRJbnQzMkxFXG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ2xpZW50ID0gdm9pZCAwO1xuY29uc3QgZnNfMSA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IHBhdGhfMSA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgdGxzXzEgPSByZXF1aXJlKFwidGxzXCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcInV0aWxcIik7XG5jb25zdCBGdHBDb250ZXh0XzEgPSByZXF1aXJlKFwiLi9GdHBDb250ZXh0XCIpO1xuY29uc3QgcGFyc2VMaXN0XzEgPSByZXF1aXJlKFwiLi9wYXJzZUxpc3RcIik7XG5jb25zdCBQcm9ncmVzc1RyYWNrZXJfMSA9IHJlcXVpcmUoXCIuL1Byb2dyZXNzVHJhY2tlclwiKTtcbmNvbnN0IFN0cmluZ1dyaXRlcl8xID0gcmVxdWlyZShcIi4vU3RyaW5nV3JpdGVyXCIpO1xuY29uc3QgcGFyc2VMaXN0TUxTRF8xID0gcmVxdWlyZShcIi4vcGFyc2VMaXN0TUxTRFwiKTtcbmNvbnN0IG5ldFV0aWxzXzEgPSByZXF1aXJlKFwiLi9uZXRVdGlsc1wiKTtcbmNvbnN0IHRyYW5zZmVyXzEgPSByZXF1aXJlKFwiLi90cmFuc2ZlclwiKTtcbmNvbnN0IHBhcnNlQ29udHJvbFJlc3BvbnNlXzEgPSByZXF1aXJlKFwiLi9wYXJzZUNvbnRyb2xSZXNwb25zZVwiKTtcbi8vIFVzZSBwcm9taXNpZnkgdG8ga2VlcCB0aGUgbGlicmFyeSBjb21wYXRpYmxlIHdpdGggTm9kZSA4LlxuY29uc3QgZnNSZWFkRGlyID0gKDAsIHV0aWxfMS5wcm9taXNpZnkpKGZzXzEucmVhZGRpcik7XG5jb25zdCBmc01rRGlyID0gKDAsIHV0aWxfMS5wcm9taXNpZnkpKGZzXzEubWtkaXIpO1xuY29uc3QgZnNTdGF0ID0gKDAsIHV0aWxfMS5wcm9taXNpZnkpKGZzXzEuc3RhdCk7XG5jb25zdCBmc09wZW4gPSAoMCwgdXRpbF8xLnByb21pc2lmeSkoZnNfMS5vcGVuKTtcbmNvbnN0IGZzQ2xvc2UgPSAoMCwgdXRpbF8xLnByb21pc2lmeSkoZnNfMS5jbG9zZSk7XG5jb25zdCBmc1VubGluayA9ICgwLCB1dGlsXzEucHJvbWlzaWZ5KShmc18xLnVubGluayk7XG5jb25zdCBMSVNUX0NPTU1BTkRTX0RFRkFVTFQgPSAoKSA9PiBbXCJMSVNUIC1hXCIsIFwiTElTVFwiXTtcbmNvbnN0IExJU1RfQ09NTUFORFNfTUxTRCA9ICgpID0+IFtcIk1MU0RcIiwgXCJMSVNUIC1hXCIsIFwiTElTVFwiXTtcbi8qKlxuICogSGlnaC1sZXZlbCBBUEkgdG8gaW50ZXJhY3Qgd2l0aCBhbiBGVFAgc2VydmVyLlxuICovXG5jbGFzcyBDbGllbnQge1xuICAgIC8qKlxuICAgICAqIEluc3RhbnRpYXRlIGFuIEZUUCBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGltZW91dCAgVGltZW91dCBpbiBtaWxsaXNlY29uZHMsIHVzZSAwIGZvciBubyB0aW1lb3V0LiBPcHRpb25hbCwgZGVmYXVsdCBpcyAzMCBzZWNvbmRzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHRpbWVvdXQgPSAzMDAwMCkge1xuICAgICAgICB0aGlzLmF2YWlsYWJsZUxpc3RDb21tYW5kcyA9IExJU1RfQ09NTUFORFNfREVGQVVMVCgpO1xuICAgICAgICB0aGlzLmZ0cCA9IG5ldyBGdHBDb250ZXh0XzEuRlRQQ29udGV4dCh0aW1lb3V0KTtcbiAgICAgICAgdGhpcy5wcmVwYXJlVHJhbnNmZXIgPSB0aGlzLl9lbnRlckZpcnN0Q29tcGF0aWJsZU1vZGUoW3RyYW5zZmVyXzEuZW50ZXJQYXNzaXZlTW9kZUlQdjYsIHRyYW5zZmVyXzEuZW50ZXJQYXNzaXZlTW9kZUlQdjRdKTtcbiAgICAgICAgdGhpcy5wYXJzZUxpc3QgPSBwYXJzZUxpc3RfMS5wYXJzZUxpc3Q7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzVHJhY2tlciA9IG5ldyBQcm9ncmVzc1RyYWNrZXJfMS5Qcm9ncmVzc1RyYWNrZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIGNsaWVudCBhbmQgYWxsIG9wZW4gc29ja2V0IGNvbm5lY3Rpb25zLlxuICAgICAqXG4gICAgICogQ2xvc2UgdGhlIGNsaWVudCBhbmQgYWxsIG9wZW4gc29ja2V0IGNvbm5lY3Rpb25zLiBUaGUgY2xpZW50IGNhbuKAmXQgYmUgdXNlZCBhbnltb3JlIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsXG4gICAgICogeW91IGhhdmUgdG8gZWl0aGVyIHJlY29ubmVjdCB3aXRoIGBhY2Nlc3NgIG9yIGBjb25uZWN0YCBvciBpbnN0YW50aWF0ZSBhIG5ldyBpbnN0YW5jZSB0byBjb250aW51ZSBhbnkgd29yay5cbiAgICAgKiBBIGNsaWVudCBpcyBhbHNvIGNsb3NlZCBhdXRvbWF0aWNhbGx5IGlmIGFueSB0aW1lb3V0IG9yIGNvbm5lY3Rpb24gZXJyb3Igb2NjdXJzLlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLmZ0cC5jbG9zZSgpO1xuICAgICAgICB0aGlzLl9wcm9ncmVzc1RyYWNrZXIuc3RvcCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaWVudCBpcyBjbG9zZWQgYW5kIGNhbid0IGJlIHVzZWQgYW55bW9yZS5cbiAgICAgKi9cbiAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mdHAuY2xvc2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IChvciByZWNvbm5lY3QpIHRvIGFuIEZUUCBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGFuIGluc3RhbmNlIG1ldGhvZCBhbmQgdGh1cyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyB0aGUgbGlmZWN5Y2xlIG9mIGEgYENsaWVudGBcbiAgICAgKiBpbnN0YW5jZS4gV2hlbmV2ZXIgeW91IGRvLCB0aGUgY2xpZW50IGlzIHJlc2V0IHdpdGggYSBuZXcgY29udHJvbCBjb25uZWN0aW9uLiBUaGlzIGFsc28gaW1wbGllcyB0aGF0XG4gICAgICogeW91IGNhbiByZW9wZW4gYSBgQ2xpZW50YCBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3Igd2hlbiByZWNvbm5lY3Rpbmcgd2l0aCB0aGlzXG4gICAgICogbWV0aG9kLiBJbiBmYWN0LCByZWNvbm5lY3RpbmcgaXMgdGhlIG9ubHkgd2F5IHRvIGNvbnRpbnVlIHVzaW5nIGEgY2xvc2VkIGBDbGllbnRgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGhvc3QgIEhvc3QgdGhlIGNsaWVudCBzaG91bGQgY29ubmVjdCB0by4gT3B0aW9uYWwsIGRlZmF1bHQgaXMgXCJsb2NhbGhvc3RcIi5cbiAgICAgKiBAcGFyYW0gcG9ydCAgUG9ydCB0aGUgY2xpZW50IHNob3VsZCBjb25uZWN0IHRvLiBPcHRpb25hbCwgZGVmYXVsdCBpcyAyMS5cbiAgICAgKi9cbiAgICBjb25uZWN0KGhvc3QgPSBcImxvY2FsaG9zdFwiLCBwb3J0ID0gMjEpIHtcbiAgICAgICAgdGhpcy5mdHAucmVzZXQoKTtcbiAgICAgICAgdGhpcy5mdHAuc29ja2V0LmNvbm5lY3Qoe1xuICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgICBmYW1pbHk6IHRoaXMuZnRwLmlwRmFtaWx5XG4gICAgICAgIH0sICgpID0+IHRoaXMuZnRwLmxvZyhgQ29ubmVjdGVkIHRvICR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVBZGRyZXNzKSh0aGlzLmZ0cC5zb2NrZXQpfSAoJHsoMCwgbmV0VXRpbHNfMS5kZXNjcmliZVRMUykodGhpcy5mdHAuc29ja2V0KX0pYCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlQ29ubmVjdFJlc3BvbnNlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzIGBjb25uZWN0YCBidXQgdXNpbmcgaW1wbGljaXQgVExTLiBJbXBsaWNpdCBUTFMgaXMgbm90IGFuIEZUUCBzdGFuZGFyZCBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgYnlcbiAgICAgKiBleHBsaWNpdCBUTFMuIFRoZXJlIGFyZSBzdGlsbCBGVFAgc2VydmVycyB0aGF0IHN1cHBvcnQgb25seSBpbXBsaWNpdCBUTFMsIHRob3VnaC5cbiAgICAgKi9cbiAgICBjb25uZWN0SW1wbGljaXRUTFMoaG9zdCA9IFwibG9jYWxob3N0XCIsIHBvcnQgPSAyMSwgdGxzT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZnRwLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZnRwLnNvY2tldCA9ICgwLCB0bHNfMS5jb25uZWN0KShwb3J0LCBob3N0LCB0bHNPcHRpb25zLCAoKSA9PiB0aGlzLmZ0cC5sb2coYENvbm5lY3RlZCB0byAkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlQWRkcmVzcykodGhpcy5mdHAuc29ja2V0KX0gKCR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVUTFMpKHRoaXMuZnRwLnNvY2tldCl9KWApKTtcbiAgICAgICAgdGhpcy5mdHAudGxzT3B0aW9ucyA9IHRsc09wdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVDb25uZWN0UmVzcG9uc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB0aGUgZmlyc3QgcmVwb25zZSBieSBhbiBGVFAgc2VydmVyIGFmdGVyIHRoZSBzb2NrZXQgY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZC5cbiAgICAgKi9cbiAgICBfaGFuZGxlQ29ubmVjdFJlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mdHAuaGFuZGxlKHVuZGVmaW5lZCwgKHJlcywgdGFzaykgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkIGJ5IHRoZSBGVFBDb250ZXh0IGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgdGFzay5yZWplY3QocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCgwLCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xLnBvc2l0aXZlQ29tcGxldGlvbikocmVzLmNvZGUpKSB7XG4gICAgICAgICAgICAgICAgdGFzay5yZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZWplY3QgYWxsIG90aGVyIGNvZGVzLCBpbmNsdWRpbmcgMTIwIFwiU2VydmljZSByZWFkeSBpbiBubm4gbWludXRlc1wiLlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc3RheSBjb25uZWN0ZWQgYnV0IGRvbid0IHJlcGxhY2UgdGhlIHNvY2tldCB5ZXQgYnkgdXNpbmcgcmVzZXQoKVxuICAgICAgICAgICAgICAgIC8vIHNvIHRoZSB1c2VyIGNhbiBpbnNwZWN0IHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZS5cbiAgICAgICAgICAgICAgICB0YXNrLnJlamVjdChuZXcgRnRwQ29udGV4dF8xLkZUUEVycm9yKHJlcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhbiBGVFAgY29tbWFuZCBhbmQgaGFuZGxlIHRoZSBmaXJzdCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBzZW5kKGNvbW1hbmQsIGlnbm9yZUVycm9yQ29kZXNERVBSRUNBVEVEID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGlnbm9yZUVycm9yQ29kZXNERVBSRUNBVEVEKSB7IC8vIERlcHJlY2F0ZWQgc3RhcnRpbmcgZnJvbSAzLjkuMFxuICAgICAgICAgICAgdGhpcy5mdHAubG9nKFwiRGVwcmVjYXRlZCBjYWxsIHVzaW5nIHNlbmQoY29tbWFuZCwgZmxhZykgd2l0aCBib29sZWFuIGZsYWcgdG8gaWdub3JlIGVycm9ycy4gVXNlIHNlbmRJZ25vcmluZ0Vycm9yKGNvbW1hbmQpLlwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKGNvbW1hbmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZ0cC5yZXF1ZXN0KGNvbW1hbmQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGFuIEZUUCBjb21tYW5kIGFuZCBpZ25vcmUgYW4gRlRQIGVycm9yIHJlc3BvbnNlLiBBbnkgb3RoZXIga2luZCBvZiBlcnJvciBvciB0aW1lb3V0IHdpbGwgc3RpbGwgcmVqZWN0IHRoZSBQcm9taXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbW1hbmRcbiAgICAgKi9cbiAgICBzZW5kSWdub3JpbmdFcnJvcihjb21tYW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ0cC5oYW5kbGUoY29tbWFuZCwgKHJlcywgdGFzaykgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEZ0cENvbnRleHRfMS5GVFBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRhc2sucmVzb2x2ZSh7IGNvZGU6IHJlcy5jb2RlLCBtZXNzYWdlOiByZXMubWVzc2FnZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGFzay5yZWplY3QocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhc2sucmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBncmFkZSB0aGUgY3VycmVudCBzb2NrZXQgY29ubmVjdGlvbiB0byBUTFMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAgVExTIG9wdGlvbnMgYXMgaW4gYHRscy5jb25uZWN0KG9wdGlvbnMpYCwgb3B0aW9uYWwuXG4gICAgICogQHBhcmFtIGNvbW1hbmQgIFNldCB0aGUgYXV0aGVudGljYXRpb24gY29tbWFuZC4gT3B0aW9uYWwsIGRlZmF1bHQgaXMgXCJBVVRIIFRMU1wiLlxuICAgICAqL1xuICAgIGFzeW5jIHVzZVRMUyhvcHRpb25zID0ge30sIGNvbW1hbmQgPSBcIkFVVEggVExTXCIpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgdGhpcy5zZW5kKGNvbW1hbmQpO1xuICAgICAgICB0aGlzLmZ0cC5zb2NrZXQgPSBhd2FpdCAoMCwgbmV0VXRpbHNfMS51cGdyYWRlU29ja2V0KSh0aGlzLmZ0cC5zb2NrZXQsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmZ0cC50bHNPcHRpb25zID0gb3B0aW9uczsgLy8gS2VlcCB0aGUgVExTIG9wdGlvbnMgZm9yIGxhdGVyIGRhdGEgY29ubmVjdGlvbnMgdGhhdCBzaG91bGQgdXNlIHRoZSBzYW1lIG9wdGlvbnMuXG4gICAgICAgIHRoaXMuZnRwLmxvZyhgQ29udHJvbCBzb2NrZXQgaXMgdXNpbmc6ICR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVUTFMpKHRoaXMuZnRwLnNvY2tldCl9YCk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZ2luIGEgdXNlciB3aXRoIGEgcGFzc3dvcmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXNlciAgVXNlcm5hbWUgdG8gdXNlIGZvciBsb2dpbi4gT3B0aW9uYWwsIGRlZmF1bHQgaXMgXCJhbm9ueW1vdXNcIi5cbiAgICAgKiBAcGFyYW0gcGFzc3dvcmQgIFBhc3N3b3JkIHRvIHVzZSBmb3IgbG9naW4uIE9wdGlvbmFsLCBkZWZhdWx0IGlzIFwiZ3Vlc3RcIi5cbiAgICAgKi9cbiAgICBsb2dpbih1c2VyID0gXCJhbm9ueW1vdXNcIiwgcGFzc3dvcmQgPSBcImd1ZXN0XCIpIHtcbiAgICAgICAgdGhpcy5mdHAubG9nKGBMb2dpbiBzZWN1cml0eTogJHsoMCwgbmV0VXRpbHNfMS5kZXNjcmliZVRMUykodGhpcy5mdHAuc29ja2V0KX1gKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnRwLmhhbmRsZShcIlVTRVIgXCIgKyB1c2VyLCAocmVzLCB0YXNrKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0YXNrLnJlamVjdChyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKDAsIHBhcnNlQ29udHJvbFJlc3BvbnNlXzEucG9zaXRpdmVDb21wbGV0aW9uKShyZXMuY29kZSkpIHsgLy8gVXNlciBsb2dnZWQgaW4gcHJvY2VlZCBPUiBDb21tYW5kIHN1cGVyZmx1b3VzXG4gICAgICAgICAgICAgICAgdGFzay5yZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXMuY29kZSA9PT0gMzMxKSB7IC8vIFVzZXIgbmFtZSBva2F5LCBuZWVkIHBhc3N3b3JkXG4gICAgICAgICAgICAgICAgdGhpcy5mdHAuc2VuZChcIlBBU1MgXCIgKyBwYXNzd29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gQWxzbyByZXBvcnQgZXJyb3Igb24gMzMyIChOZWVkIGFjY291bnQpXG4gICAgICAgICAgICAgICAgdGFzay5yZWplY3QobmV3IEZ0cENvbnRleHRfMS5GVFBFcnJvcihyZXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgdXN1YWwgZGVmYXVsdCBzZXR0aW5ncy5cbiAgICAgKlxuICAgICAqIFNldHRpbmdzIHVzZWQ6XG4gICAgICogKiBCaW5hcnkgbW9kZSAoVFlQRSBJKVxuICAgICAqICogRmlsZSBzdHJ1Y3R1cmUgKFNUUlUgRilcbiAgICAgKiAqIEFkZGl0aW9uYWwgc2V0dGluZ3MgZm9yIEZUUFMgKFBCU1ogMCwgUFJPVCBQKVxuICAgICAqL1xuICAgIGFzeW5jIHVzZURlZmF1bHRTZXR0aW5ncygpIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZXMgPSBhd2FpdCB0aGlzLmZlYXR1cmVzKCk7XG4gICAgICAgIC8vIFVzZSBNTFNEIGRpcmVjdG9yeSBsaXN0aW5nIGlmIHBvc3NpYmxlLiBTZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM2NTkjc2VjdGlvbi03Ljg6XG4gICAgICAgIC8vIFwiVGhlIHByZXNlbmNlIG9mIHRoZSBNTFNUIGZlYXR1cmUgaW5kaWNhdGVzIHRoYXQgYm90aCBNTFNUIGFuZCBNTFNEIGFyZSBzdXBwb3J0ZWQuXCJcbiAgICAgICAgY29uc3Qgc3VwcG9ydHNNTFNEID0gZmVhdHVyZXMuaGFzKFwiTUxTVFwiKTtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVMaXN0Q29tbWFuZHMgPSBzdXBwb3J0c01MU0QgPyBMSVNUX0NPTU1BTkRTX01MU0QoKSA6IExJU1RfQ09NTUFORFNfREVGQVVMVCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmQoXCJUWVBFIElcIik7IC8vIEJpbmFyeSBtb2RlXG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZElnbm9yaW5nRXJyb3IoXCJTVFJVIEZcIik7IC8vIFVzZSBmaWxlIHN0cnVjdHVyZVxuICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiT1BUUyBVVEY4IE9OXCIpOyAvLyBTb21lIHNlcnZlcnMgZXhwZWN0IFVURi04IHRvIGJlIGVuYWJsZWQgZXhwbGljaXRseSBhbmQgc2V0dGluZyBiZWZvcmUgbG9naW4gbWlnaHQgbm90IGhhdmUgd29ya2VkLlxuICAgICAgICBpZiAoc3VwcG9ydHNNTFNEKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiT1BUUyBNTFNUIHR5cGU7c2l6ZTttb2RpZnk7dW5pcXVlO3VuaXgubW9kZTt1bml4Lm93bmVyO3VuaXguZ3JvdXA7dW5peC5vd25lcm5hbWU7dW5peC5ncm91cG5hbWU7XCIpOyAvLyBNYWtlIHN1cmUgTUxTRCBsaXN0aW5ncyBpbmNsdWRlIGFsbCB3ZSBjYW4gcGFyc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mdHAuaGFzVExTKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiUEJTWiAwXCIpOyAvLyBTZXQgdG8gMCBmb3IgVExTXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiUFJPVCBQXCIpOyAvLyBQcm90ZWN0IGNoYW5uZWwgKGFsc28gZm9yIGRhdGEgY29ubmVjdGlvbnMpXG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY2FsbHMgYGNvbm5lY3RgLCBgdXNlVExTYCwgYGxvZ2luYCBhbmQgYHVzZURlZmF1bHRTZXR0aW5nc2AuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGFuIGluc3RhbmNlIG1ldGhvZCBhbmQgdGh1cyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyB0aGUgbGlmZWN5Y2xlIG9mIGEgYENsaWVudGBcbiAgICAgKiBpbnN0YW5jZS4gV2hlbmV2ZXIgeW91IGRvLCB0aGUgY2xpZW50IGlzIHJlc2V0IHdpdGggYSBuZXcgY29udHJvbCBjb25uZWN0aW9uLiBUaGlzIGFsc28gaW1wbGllcyB0aGF0XG4gICAgICogeW91IGNhbiByZW9wZW4gYSBgQ2xpZW50YCBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3Igd2hlbiByZWNvbm5lY3Rpbmcgd2l0aCB0aGlzXG4gICAgICogbWV0aG9kLiBJbiBmYWN0LCByZWNvbm5lY3RpbmcgaXMgdGhlIG9ubHkgd2F5IHRvIGNvbnRpbnVlIHVzaW5nIGEgY2xvc2VkIGBDbGllbnRgLlxuICAgICAqL1xuICAgIGFzeW5jIGFjY2VzcyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgdXNlRXhwbGljaXRUTFMgPSBvcHRpb25zLnNlY3VyZSA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3QgdXNlSW1wbGljaXRUTFMgPSBvcHRpb25zLnNlY3VyZSA9PT0gXCJpbXBsaWNpdFwiO1xuICAgICAgICBsZXQgd2VsY29tZTtcbiAgICAgICAgaWYgKHVzZUltcGxpY2l0VExTKSB7XG4gICAgICAgICAgICB3ZWxjb21lID0gYXdhaXQgdGhpcy5jb25uZWN0SW1wbGljaXRUTFMob3B0aW9ucy5ob3N0LCBvcHRpb25zLnBvcnQsIG9wdGlvbnMuc2VjdXJlT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3ZWxjb21lID0gYXdhaXQgdGhpcy5jb25uZWN0KG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlRXhwbGljaXRUTFMpIHtcbiAgICAgICAgICAgIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wYXRyaWNranVjaGxpL2Jhc2ljLWZ0cC9pc3N1ZXMvMTY2IGJ5IG1ha2luZyBzdXJlXG4gICAgICAgICAgICAvLyBob3N0IGlzIHNldCBmb3IgYW55IGZ1dHVyZSBkYXRhIGNvbm5lY3Rpb24gYXMgd2VsbC5cbiAgICAgICAgICAgIGNvbnN0IHNlY3VyZU9wdGlvbnMgPSAoX2EgPSBvcHRpb25zLnNlY3VyZU9wdGlvbnMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9O1xuICAgICAgICAgICAgc2VjdXJlT3B0aW9ucy5ob3N0ID0gKF9iID0gc2VjdXJlT3B0aW9ucy5ob3N0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBvcHRpb25zLmhvc3Q7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVzZVRMUyhzZWN1cmVPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgVVRGLTggb24gYmVmb3JlIGxvZ2luIGluIGNhc2UgdGhlcmUgYXJlIG5vbi1hc2NpaSBjaGFyYWN0ZXJzIGluIHVzZXIgb3IgcGFzc3dvcmQuXG4gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IG5vdCB3b3JrIGJlZm9yZSBsb2dpbiBkZXBlbmRpbmcgb24gc2VydmVyLlxuICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiT1BUUyBVVEY4IE9OXCIpO1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2luKG9wdGlvbnMudXNlciwgb3B0aW9ucy5wYXNzd29yZCk7XG4gICAgICAgIGF3YWl0IHRoaXMudXNlRGVmYXVsdFNldHRpbmdzKCk7XG4gICAgICAgIHJldHVybiB3ZWxjb21lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgYXN5bmMgcHdkKCkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlbmQoXCJQV0RcIik7XG4gICAgICAgIC8vIFRoZSBkaXJlY3RvcnkgaXMgcGFydCBvZiB0aGUgcmV0dXJuIG1lc3NhZ2UsIGZvciBleGFtcGxlOlxuICAgICAgICAvLyAyNTcgXCIvdGhpcy90aGF0XCIgaXMgY3VycmVudCBkaXJlY3RvcnkuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHJlcy5tZXNzYWdlLm1hdGNoKC9cIiguKylcIi8pO1xuICAgICAgICBpZiAocGFyc2VkID09PSBudWxsIHx8IHBhcnNlZFsxXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHBhcnNlIHJlc3BvbnNlIHRvIGNvbW1hbmQgJ1BXRCc6ICR7cmVzLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZFsxXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEgZGVzY3JpcHRpb24gb2Ygc3VwcG9ydGVkIGZlYXR1cmVzLlxuICAgICAqXG4gICAgICogVGhpcyBzZW5kcyB0aGUgRkVBVCBjb21tYW5kIGFuZCBwYXJzZXMgdGhlIHJlc3VsdCBpbnRvIGEgTWFwIHdoZXJlIGtleXMgY29ycmVzcG9uZCB0byBhdmFpbGFibGUgY29tbWFuZHNcbiAgICAgKiBhbmQgdmFsdWVzIGhvbGQgZnVydGhlciBpbmZvcm1hdGlvbi4gQmUgYXdhcmUgdGhhdCB5b3VyIEZUUCBzZXJ2ZXJzIG1pZ2h0IG5vdCBzdXBwb3J0IHRoaXNcbiAgICAgKiBjb21tYW5kIGluIHdoaWNoIGNhc2UgdGhpcyBtZXRob2Qgd2lsbCBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGJ1dCBqdXN0IHJldHVybiBhbiBlbXB0eSBNYXAuXG4gICAgICovXG4gICAgYXN5bmMgZmVhdHVyZXMoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VuZElnbm9yaW5nRXJyb3IoXCJGRUFUXCIpO1xuICAgICAgICBjb25zdCBmZWF0dXJlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgLy8gTm90IHN1cHBvcnRpbmcgYW55IHNwZWNpYWwgZmVhdHVyZXMgd2lsbCBiZSByZXBvcnRlZCB3aXRoIGEgc2luZ2xlIGxpbmUuXG4gICAgICAgIGlmIChyZXMuY29kZSA8IDQwMCAmJiAoMCwgcGFyc2VDb250cm9sUmVzcG9uc2VfMS5pc011bHRpbGluZSkocmVzLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAvLyBUaGUgZmlyc3QgYW5kIGxhc3QgbGluZSB3cmFwIHRoZSBtdWx0aWxpbmUgcmVzcG9uc2UsIGlnbm9yZSB0aGVtLlxuICAgICAgICAgICAgcmVzLm1lc3NhZ2Uuc3BsaXQoXCJcXG5cIikuc2xpY2UoMSwgLTEpLmZvckVhY2gobGluZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQSB0eXBpY2FsIGxpbmVzIGxvb2tzIGxpa2U6IFwiIFJFU1QgU1RSRUFNXCIgb3IgXCIgTURUTVwiLlxuICAgICAgICAgICAgICAgIC8vIFNlcnZlcnMgbWlnaHQgbm90IHVzZSBhbiBpbmRlbnRhdGlvbiB0aG91Z2guXG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBsaW5lLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSB8fCBcIlwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmZWF0dXJlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICBhc3luYyBjZChwYXRoKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkUGF0aCA9IGF3YWl0IHRoaXMucHJvdGVjdFdoaXRlc3BhY2UocGF0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoXCJDV0QgXCIgKyB2YWxpZFBhdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTd2l0Y2ggdG8gdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIGFzeW5jIGNkdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoXCJDRFVQXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiBhIGZpbGUuIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBldmVyeSBGVFAgc2VydmVyLCBpbiB3aGljaCBjYXNlXG4gICAgICogY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBsYXN0TW9kKHBhdGgpIHtcbiAgICAgICAgY29uc3QgdmFsaWRQYXRoID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShwYXRoKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZW5kKGBNRFRNICR7dmFsaWRQYXRofWApO1xuICAgICAgICBjb25zdCBkYXRlID0gcmVzLm1lc3NhZ2Uuc2xpY2UoNCk7XG4gICAgICAgIHJldHVybiAoMCwgcGFyc2VMaXN0TUxTRF8xLnBhcnNlTUxTeERhdGUpKGRhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNpemUgb2YgYSBmaWxlLlxuICAgICAqL1xuICAgIGFzeW5jIHNpemUocGF0aCkge1xuICAgICAgICBjb25zdCB2YWxpZFBhdGggPSBhd2FpdCB0aGlzLnByb3RlY3RXaGl0ZXNwYWNlKHBhdGgpO1xuICAgICAgICBjb25zdCBjb21tYW5kID0gYFNJWkUgJHt2YWxpZFBhdGh9YDtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZW5kKGNvbW1hbmQpO1xuICAgICAgICAvLyBUaGUgc2l6ZSBpcyBwYXJ0IG9mIHRoZSByZXNwb25zZSBtZXNzYWdlLCBmb3IgZXhhbXBsZTogXCIyMTMgNTU1NTU1XCIuIEl0J3NcbiAgICAgICAgLy8gcG9zc2libGUgdGhhdCB0aGVyZSBpcyBhIGNvbW1tZW50YXJ5IGFwcGVuZGVkIGxpa2UgXCIyMTMgNTU1NSwgc29tZSBjb21tZW50YXJ5XCIuXG4gICAgICAgIGNvbnN0IHNpemUgPSBwYXJzZUludChyZXMubWVzc2FnZS5zbGljZSg0KSwgMTApO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHBhcnNlIHJlc3BvbnNlIHRvIGNvbW1hbmQgJyR7Y29tbWFuZH0nIGFzIGEgbnVtZXJpY2FsIHZhbHVlOiAke3Jlcy5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW5hbWUgYSBmaWxlLlxuICAgICAqXG4gICAgICogRGVwZW5kaW5nIG9uIHRoZSBGVFAgc2VydmVyIHRoaXMgbWlnaHQgYWxzbyBiZSB1c2VkIHRvIG1vdmUgYSBmaWxlIGZyb20gb25lXG4gICAgICogZGlyZWN0b3J5IHRvIGFub3RoZXIgYnkgcHJvdmlkaW5nIGZ1bGwgcGF0aHMuXG4gICAgICovXG4gICAgYXN5bmMgcmVuYW1lKHNyY1BhdGgsIGRlc3RQYXRoKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkU3JjID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShzcmNQYXRoKTtcbiAgICAgICAgY29uc3QgdmFsaWREZXN0ID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShkZXN0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZChcIlJORlIgXCIgKyB2YWxpZFNyYyk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoXCJSTlRPIFwiICsgdmFsaWREZXN0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZmlsZSBmcm9tIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgICAqXG4gICAgICogWW91IGNhbiBpZ25vcmUgRlRQIGVycm9yIHJldHVybiBjb2RlcyB3aGljaCB3b24ndCB0aHJvdyBhbiBleGNlcHRpb24gaWYgZS5nLlxuICAgICAqIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG4gICAgYXN5bmMgcmVtb3ZlKHBhdGgsIGlnbm9yZUVycm9yQ29kZXMgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCB2YWxpZFBhdGggPSBhd2FpdCB0aGlzLnByb3RlY3RXaGl0ZXNwYWNlKHBhdGgpO1xuICAgICAgICBpZiAoaWdub3JlRXJyb3JDb2Rlcykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZElnbm9yaW5nRXJyb3IoYERFTEUgJHt2YWxpZFBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZChgREVMRSAke3ZhbGlkUGF0aH1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVwb3J0IHRyYW5zZmVyIHByb2dyZXNzIGZvciBhbnkgdXBsb2FkIG9yIGRvd25sb2FkIHRvIGEgZ2l2ZW4gaGFuZGxlci5cbiAgICAgKlxuICAgICAqIFRoaXMgd2lsbCBhbHNvIHJlc2V0IHRoZSBvdmVyYWxsIHRyYW5zZmVyIGNvdW50ZXIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbXVsdGlwbGUgdHJhbnNmZXJzLiBZb3UgY2FuXG4gICAgICogYWxzbyBjYWxsIHRoZSBmdW5jdGlvbiB3aXRob3V0IGEgaGFuZGxlciB0byBzdG9wIHJlcG9ydGluZyB0byBhbiBlYXJsaWVyIG9uZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBoYW5kbGVyICBIYW5kbGVyIGZ1bmN0aW9uIHRvIGNhbGwgb24gdHJhbnNmZXIgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgdHJhY2tQcm9ncmVzcyhoYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzVHJhY2tlci5ieXRlc092ZXJhbGwgPSAwO1xuICAgICAgICB0aGlzLl9wcm9ncmVzc1RyYWNrZXIucmVwb3J0VG8oaGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwbG9hZCBkYXRhIGZyb20gYSByZWFkYWJsZSBzdHJlYW0gb3IgYSBsb2NhbCBmaWxlIHRvIGEgcmVtb3RlIGZpbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc291cmNlICBSZWFkYWJsZSBzdHJlYW0gb3IgcGF0aCB0byBhIGxvY2FsIGZpbGUuXG4gICAgICogQHBhcmFtIHRvUmVtb3RlUGF0aCAgUGF0aCB0byBhIHJlbW90ZSBmaWxlIHRvIHdyaXRlIHRvLlxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZEZyb20oc291cmNlLCB0b1JlbW90ZVBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBsb2FkV2l0aENvbW1hbmQoc291cmNlLCB0b1JlbW90ZVBhdGgsIFwiU1RPUlwiLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBsb2FkIGRhdGEgZnJvbSBhIHJlYWRhYmxlIHN0cmVhbSBvciBhIGxvY2FsIGZpbGUgYnkgYXBwZW5kaW5nIGl0IHRvIGFuIGV4aXN0aW5nIGZpbGUuIElmIHRoZSBmaWxlIGRvZXNuJ3RcbiAgICAgKiBleGlzdCB0aGUgRlRQIHNlcnZlciBzaG91bGQgY3JlYXRlIGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZSAgUmVhZGFibGUgc3RyZWFtIG9yIHBhdGggdG8gYSBsb2NhbCBmaWxlLlxuICAgICAqIEBwYXJhbSB0b1JlbW90ZVBhdGggIFBhdGggdG8gYSByZW1vdGUgZmlsZSB0byB3cml0ZSB0by5cbiAgICAgKi9cbiAgICBhc3luYyBhcHBlbmRGcm9tKHNvdXJjZSwgdG9SZW1vdGVQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwbG9hZFdpdGhDb21tYW5kKHNvdXJjZSwgdG9SZW1vdGVQYXRoLCBcIkFQUEVcIiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBfdXBsb2FkV2l0aENvbW1hbmQoc291cmNlLCByZW1vdGVQYXRoLCBjb21tYW5kLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXBsb2FkTG9jYWxGaWxlKHNvdXJjZSwgcmVtb3RlUGF0aCwgY29tbWFuZCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwbG9hZEZyb21TdHJlYW0oc291cmNlLCByZW1vdGVQYXRoLCBjb21tYW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGFzeW5jIF91cGxvYWRMb2NhbEZpbGUobG9jYWxQYXRoLCByZW1vdGVQYXRoLCBjb21tYW5kLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGZkID0gYXdhaXQgZnNPcGVuKGxvY2FsUGF0aCwgXCJyXCIpO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSAoMCwgZnNfMS5jcmVhdGVSZWFkU3RyZWFtKShcIlwiLCB7XG4gICAgICAgICAgICBmZCxcbiAgICAgICAgICAgIHN0YXJ0OiBvcHRpb25zLmxvY2FsU3RhcnQsXG4gICAgICAgICAgICBlbmQ6IG9wdGlvbnMubG9jYWxFbmRJbmNsdXNpdmUsXG4gICAgICAgICAgICBhdXRvQ2xvc2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VwbG9hZEZyb21TdHJlYW0oc291cmNlLCByZW1vdGVQYXRoLCBjb21tYW5kKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGF3YWl0IGlnbm9yZUVycm9yKCgpID0+IGZzQ2xvc2UoZmQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX3VwbG9hZEZyb21TdHJlYW0oc291cmNlLCByZW1vdGVQYXRoLCBjb21tYW5kKSB7XG4gICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyKSA9PiB0aGlzLmZ0cC5jbG9zZVdpdGhFcnJvcihlcnIpO1xuICAgICAgICBzb3VyY2Uub25jZShcImVycm9yXCIsIG9uRXJyb3IpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRQYXRoID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShyZW1vdGVQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVRyYW5zZmVyKHRoaXMuZnRwKTtcbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIGtleXdvcmQgYGF3YWl0YCBvciB0aGUgYGZpbmFsbHlgIGNsYXVzZSBiZWxvdyBydW5zIHRvbyBlYXJseVxuICAgICAgICAgICAgLy8gYW5kIHJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgc291cmNlIHN0cmVhbSB0b28gZWFybHkuXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgKDAsIHRyYW5zZmVyXzEudXBsb2FkRnJvbSkoc291cmNlLCB7XG4gICAgICAgICAgICAgICAgZnRwOiB0aGlzLmZ0cCxcbiAgICAgICAgICAgICAgICB0cmFja2VyOiB0aGlzLl9wcm9ncmVzc1RyYWNrZXIsXG4gICAgICAgICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICAgICAgICByZW1vdGVQYXRoOiB2YWxpZFBhdGgsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJ1cGxvYWRcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEb3dubG9hZCBhIHJlbW90ZSBmaWxlIGFuZCBwaXBlIGl0cyBkYXRhIHRvIGEgd3JpdGFibGUgc3RyZWFtIG9yIHRvIGEgbG9jYWwgZmlsZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gb3B0aW9uYWxseSBkZWZpbmUgYXQgd2hpY2ggcG9zaXRpb24gb2YgdGhlIHJlbW90ZSBmaWxlIHlvdSdkIGxpa2UgdG8gc3RhcnRcbiAgICAgKiBkb3dubG9hZGluZy4gSWYgdGhlIGRlc3RpbmF0aW9uIHlvdSBwcm92aWRlIGlzIGEgZmlsZSwgdGhlIG9mZnNldCB3aWxsIGJlIGFwcGxpZWRcbiAgICAgKiB0byBpdCBhcyB3ZWxsLiBGb3IgZXhhbXBsZTogVG8gcmVzdW1lIGEgZmFpbGVkIGRvd25sb2FkLCB5b3UnZCByZXF1ZXN0IHRoZSBzaXplIG9mXG4gICAgICogdGhlIGxvY2FsLCBwYXJ0aWFsbHkgZG93bmxvYWRlZCBmaWxlIGFuZCB1c2UgdGhhdCBhcyB0aGUgb2Zmc2V0LiBBc3N1bWluZyB0aGUgc2l6ZVxuICAgICAqIGlzIDIzLCB5b3UnZCBkb3dubG9hZCB0aGUgcmVzdCB1c2luZyBgZG93bmxvYWRUbyhcImxvY2FsLnR4dFwiLCBcInJlbW90ZS50eHRcIiwgMjMpYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiAgU3RyZWFtIG9yIHBhdGggZm9yIGEgbG9jYWwgZmlsZSB0byB3cml0ZSB0by5cbiAgICAgKiBAcGFyYW0gZnJvbVJlbW90ZVBhdGggIFBhdGggb2YgdGhlIHJlbW90ZSBmaWxlIHRvIHJlYWQgZnJvbS5cbiAgICAgKiBAcGFyYW0gc3RhcnRBdCAgUG9zaXRpb24gd2l0aGluIHRoZSByZW1vdGUgZmlsZSB0byBzdGFydCBkb3dubG9hZGluZyBhdC4gSWYgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZmlsZSwgdGhpcyBvZmZzZXQgaXMgYWxzbyBhcHBsaWVkIHRvIGl0LlxuICAgICAqL1xuICAgIGFzeW5jIGRvd25sb2FkVG8oZGVzdGluYXRpb24sIGZyb21SZW1vdGVQYXRoLCBzdGFydEF0ID0gMCkge1xuICAgICAgICBpZiAodHlwZW9mIGRlc3RpbmF0aW9uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZG93bmxvYWRUb0ZpbGUoZGVzdGluYXRpb24sIGZyb21SZW1vdGVQYXRoLCBzdGFydEF0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZG93bmxvYWRUb1N0cmVhbShkZXN0aW5hdGlvbiwgZnJvbVJlbW90ZVBhdGgsIHN0YXJ0QXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX2Rvd25sb2FkVG9GaWxlKGxvY2FsUGF0aCwgcmVtb3RlUGF0aCwgc3RhcnRBdCkge1xuICAgICAgICBjb25zdCBhcHBlbmRpbmdUb0xvY2FsRmlsZSA9IHN0YXJ0QXQgPiAwO1xuICAgICAgICBjb25zdCBmaWxlU3lzdGVtRmxhZ3MgPSBhcHBlbmRpbmdUb0xvY2FsRmlsZSA/IFwicitcIiA6IFwid1wiO1xuICAgICAgICBjb25zdCBmZCA9IGF3YWl0IGZzT3Blbihsb2NhbFBhdGgsIGZpbGVTeXN0ZW1GbGFncyk7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gKDAsIGZzXzEuY3JlYXRlV3JpdGVTdHJlYW0pKFwiXCIsIHtcbiAgICAgICAgICAgIGZkLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0QXQsXG4gICAgICAgICAgICBhdXRvQ2xvc2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2Rvd25sb2FkVG9TdHJlYW0oZGVzdGluYXRpb24sIHJlbW90ZVBhdGgsIHN0YXJ0QXQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsRmlsZVN0YXRzID0gYXdhaXQgaWdub3JlRXJyb3IoKCkgPT4gZnNTdGF0KGxvY2FsUGF0aCkpO1xuICAgICAgICAgICAgY29uc3QgaGFzRG93bmxvYWRlZERhdGEgPSBsb2NhbEZpbGVTdGF0cyAmJiBsb2NhbEZpbGVTdGF0cy5zaXplID4gMDtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlbW92ZUxvY2FsRmlsZSA9ICFhcHBlbmRpbmdUb0xvY2FsRmlsZSAmJiAhaGFzRG93bmxvYWRlZERhdGE7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlTG9jYWxGaWxlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaWdub3JlRXJyb3IoKCkgPT4gZnNVbmxpbmsobG9jYWxQYXRoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBpZ25vcmVFcnJvcigoKSA9PiBmc0Nsb3NlKGZkKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGFzeW5jIF9kb3dubG9hZFRvU3RyZWFtKGRlc3RpbmF0aW9uLCByZW1vdGVQYXRoLCBzdGFydEF0KSB7XG4gICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyKSA9PiB0aGlzLmZ0cC5jbG9zZVdpdGhFcnJvcihlcnIpO1xuICAgICAgICBkZXN0aW5hdGlvbi5vbmNlKFwiZXJyb3JcIiwgb25FcnJvcik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZFBhdGggPSBhd2FpdCB0aGlzLnByb3RlY3RXaGl0ZXNwYWNlKHJlbW90ZVBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlVHJhbnNmZXIodGhpcy5mdHApO1xuICAgICAgICAgICAgLy8gS2VlcCB0aGUga2V5d29yZCBgYXdhaXRgIG9yIHRoZSBgZmluYWxseWAgY2xhdXNlIGJlbG93IHJ1bnMgdG9vIGVhcmx5XG4gICAgICAgICAgICAvLyBhbmQgcmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBzb3VyY2Ugc3RyZWFtIHRvbyBlYXJseS5cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCAoMCwgdHJhbnNmZXJfMS5kb3dubG9hZFRvKShkZXN0aW5hdGlvbiwge1xuICAgICAgICAgICAgICAgIGZ0cDogdGhpcy5mdHAsXG4gICAgICAgICAgICAgICAgdHJhY2tlcjogdGhpcy5fcHJvZ3Jlc3NUcmFja2VyLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IHN0YXJ0QXQgPiAwID8gYFJFU1QgJHtzdGFydEF0fWAgOiBgUkVUUiAke3ZhbGlkUGF0aH1gLFxuICAgICAgICAgICAgICAgIHJlbW90ZVBhdGg6IHZhbGlkUGF0aCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImRvd25sb2FkXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgZGVzdGluYXRpb24ucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3QgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBvciBmcm9tIGBwYXRoYCBpZiBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gW3BhdGhdICBQYXRoIHRvIHJlbW90ZSBmaWxlIG9yIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0KHBhdGggPSBcIlwiKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkUGF0aCA9IGF3YWl0IHRoaXMucHJvdGVjdFdoaXRlc3BhY2UocGF0aCk7XG4gICAgICAgIGxldCBsYXN0RXJyb3I7XG4gICAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIHRoaXMuYXZhaWxhYmxlTGlzdENvbW1hbmRzKSB7XG4gICAgICAgICAgICBjb25zdCBjb21tYW5kID0gdmFsaWRQYXRoID09PSBcIlwiID8gY2FuZGlkYXRlIDogYCR7Y2FuZGlkYXRlfSAke3ZhbGlkUGF0aH1gO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlVHJhbnNmZXIodGhpcy5mdHApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRMaXN0ID0gYXdhaXQgdGhpcy5fcmVxdWVzdExpc3RXaXRoQ29tbWFuZChjb21tYW5kKTtcbiAgICAgICAgICAgICAgICAvLyBVc2Ugc3VjY2Vzc2Z1bCBjYW5kaWRhdGUgZm9yIGFsbCBzdWJzZXF1ZW50IHJlcXVlc3RzLlxuICAgICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGlzdENvbW1hbmRzID0gW2NhbmRpZGF0ZV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZExpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkVHJ5TmV4dCA9IGVyciBpbnN0YW5jZW9mIEZ0cENvbnRleHRfMS5GVFBFcnJvcjtcbiAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFRyeU5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbGFzdEVycm9yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX3JlcXVlc3RMaXN0V2l0aENvbW1hbmQoY29tbWFuZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGVyXzEuU3RyaW5nV3JpdGVyKCk7XG4gICAgICAgIGF3YWl0ICgwLCB0cmFuc2Zlcl8xLmRvd25sb2FkVG8pKGJ1ZmZlciwge1xuICAgICAgICAgICAgZnRwOiB0aGlzLmZ0cCxcbiAgICAgICAgICAgIHRyYWNrZXI6IHRoaXMuX3Byb2dyZXNzVHJhY2tlcixcbiAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICByZW1vdGVQYXRoOiBcIlwiLFxuICAgICAgICAgICAgdHlwZTogXCJsaXN0XCJcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBidWZmZXIuZ2V0VGV4dCh0aGlzLmZ0cC5lbmNvZGluZyk7XG4gICAgICAgIHRoaXMuZnRwLmxvZyh0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VMaXN0KHRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBkaXJlY3RvcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZW1vdGVEaXJQYXRoICBUaGUgcGF0aCBvZiB0aGUgcmVtb3RlIGRpcmVjdG9yeSB0byBkZWxldGUuXG4gICAgICogQGV4YW1wbGUgY2xpZW50LnJlbW92ZURpcihcImZvb1wiKSAvLyBSZW1vdmUgZGlyZWN0b3J5ICdmb28nIHVzaW5nIGEgcmVsYXRpdmUgcGF0aC5cbiAgICAgKiBAZXhhbXBsZSBjbGllbnQucmVtb3ZlRGlyKFwiZm9vL2JhclwiKSAvLyBSZW1vdmUgZGlyZWN0b3J5ICdiYXInIHVzaW5nIGEgcmVsYXRpdmUgcGF0aC5cbiAgICAgKiBAZXhhbXBsZSBjbGllbnQucmVtb3ZlRGlyKFwiL2Zvby9iYXJcIikgLy8gUmVtb3ZlIGRpcmVjdG9yeSAnYmFyJyB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoLlxuICAgICAqIEBleGFtcGxlIGNsaWVudC5yZW1vdmVEaXIoXCIvXCIpIC8vIFJlbW92ZSBldmVyeXRoaW5nLlxuICAgICAqL1xuICAgIGFzeW5jIHJlbW92ZURpcihyZW1vdGVEaXJQYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGl0QXRDdXJyZW50RGlyZWN0b3J5KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2QocmVtb3RlRGlyUGF0aCk7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHRhcmdldCBiZWNhdXNlIHJlbW90ZURpclBhdGggbWlnaHQgYmUgYSByZWxhdGl2ZSBwYXRoLCBldmVuIGAuLi9gIGlzIHBvc3NpYmxlLlxuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVEaXJQYXRoID0gYXdhaXQgdGhpcy5wd2QoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYXJXb3JraW5nRGlyKCk7XG4gICAgICAgICAgICBjb25zdCBkaXJJc1Jvb3QgPSBhYnNvbHV0ZURpclBhdGggPT09IFwiL1wiO1xuICAgICAgICAgICAgaWYgKCFkaXJJc1Jvb3QpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNkdXAoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUVtcHR5RGlyKGFic29sdXRlRGlyUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBpbiB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2l0aG91dCByZW1vdmluZ1xuICAgICAqIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBpdHNlbGYuXG4gICAgICovXG4gICAgYXN5bmMgY2xlYXJXb3JraW5nRGlyKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgdGhpcy5saXN0KCkpIHtcbiAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZChmaWxlLm5hbWUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYXJXb3JraW5nRGlyKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZHVwKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVFbXB0eURpcihmaWxlLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmUoZmlsZS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGxvYWQgdGhlIGNvbnRlbnRzIG9mIGEgbG9jYWwgZGlyZWN0b3J5IHRvIHRoZSByZW1vdGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZXMgYW5kIHJldXNlIGV4aXN0aW5nIGRpcmVjdG9yaWVzLlxuICAgICAqIFVucmVsYXRlZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2lsbCByZW1haW4gdW50b3VjaGVkLiBZb3UgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhIGByZW1vdGVEaXJQYXRoYFxuICAgICAqIHRvIHB1dCB0aGUgY29udGVudHMgaW5zaWRlIGEgZGlyZWN0b3J5IHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBpZiBuZWNlc3NhcnkgaW5jbHVkaW5nIGFsbFxuICAgICAqIGludGVybWVkaWF0ZSBkaXJlY3Rvcmllcy4gSWYgeW91IGRpZCBwcm92aWRlIGEgcmVtb3RlRGlyUGF0aCB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2lsbCBzdGF5XG4gICAgICogdGhlIHNhbWUgYXMgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9jYWxEaXJQYXRoICBMb2NhbCBwYXRoLCBlLmcuIFwiZm9vL2JhclwiIG9yIFwiLi4vdGVzdFwiXG4gICAgICogQHBhcmFtIFtyZW1vdGVEaXJQYXRoXSAgUmVtb3RlIHBhdGggb2YgYSBkaXJlY3RvcnkgdG8gdXBsb2FkIHRvLiBXb3JraW5nIGRpcmVjdG9yeSBpZiB1bmRlZmluZWQuXG4gICAgICovXG4gICAgYXN5bmMgdXBsb2FkRnJvbURpcihsb2NhbERpclBhdGgsIHJlbW90ZURpclBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4aXRBdEN1cnJlbnREaXJlY3RvcnkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlbW90ZURpclBhdGgpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZURpcihyZW1vdGVEaXJQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91cGxvYWRUb1dvcmtpbmdEaXIobG9jYWxEaXJQYXRoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBfdXBsb2FkVG9Xb3JraW5nRGlyKGxvY2FsRGlyUGF0aCkge1xuICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzUmVhZERpcihsb2NhbERpclBhdGgpO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gKDAsIHBhdGhfMS5qb2luKShsb2NhbERpclBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmc1N0YXQoZnVsbFBhdGgpO1xuICAgICAgICAgICAgaWYgKHN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGxvYWRGcm9tKGZ1bGxQYXRoLCBmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9vcGVuRGlyKGZpbGUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3VwbG9hZFRvV29ya2luZ0RpcihmdWxsUGF0aCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZHVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRG93bmxvYWQgYWxsIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBvZiB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gYSBsb2NhbCBkaXJlY3RvcnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9jYWxEaXJQYXRoICBUaGUgbG9jYWwgZGlyZWN0b3J5IHRvIGRvd25sb2FkIHRvLlxuICAgICAqIEBwYXJhbSByZW1vdGVEaXJQYXRoICBSZW1vdGUgZGlyZWN0b3J5IHRvIGRvd25sb2FkLiBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlmIG5vdCBzcGVjaWZpZWQuXG4gICAgICovXG4gICAgYXN5bmMgZG93bmxvYWRUb0Rpcihsb2NhbERpclBhdGgsIHJlbW90ZURpclBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4aXRBdEN1cnJlbnREaXJlY3RvcnkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlbW90ZURpclBhdGgpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNkKHJlbW90ZURpclBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2Rvd25sb2FkRnJvbVdvcmtpbmdEaXIobG9jYWxEaXJQYXRoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBfZG93bmxvYWRGcm9tV29ya2luZ0Rpcihsb2NhbERpclBhdGgpIHtcbiAgICAgICAgYXdhaXQgZW5zdXJlTG9jYWxEaXJlY3RvcnkobG9jYWxEaXJQYXRoKTtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHRoaXMubGlzdCgpKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFBhdGggPSAoMCwgcGF0aF8xLmpvaW4pKGxvY2FsRGlyUGF0aCwgZmlsZS5uYW1lKTtcbiAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZChmaWxlLm5hbWUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Rvd25sb2FkRnJvbVdvcmtpbmdEaXIobG9jYWxQYXRoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNkdXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZpbGUuaXNGaWxlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kb3dubG9hZFRvKGxvY2FsUGF0aCwgZmlsZS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlIHN1cmUgYSBnaXZlbiByZW1vdGUgcGF0aCBleGlzdHMsIGNyZWF0aW5nIGFsbCBkaXJlY3RvcmllcyBhcyBuZWNlc3NhcnkuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoYW5nZXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIGdpdmVuIHBhdGguXG4gICAgICovXG4gICAgYXN5bmMgZW5zdXJlRGlyKHJlbW90ZURpclBhdGgpIHtcbiAgICAgICAgLy8gSWYgdGhlIHJlbW90ZURpclBhdGggd2FzIGFic29sdXRlIGdvIHRvIHJvb3QgZGlyZWN0b3J5LlxuICAgICAgICBpZiAocmVtb3RlRGlyUGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jZChcIi9cIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZXMgPSByZW1vdGVEaXJQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIobmFtZSA9PiBuYW1lICE9PSBcIlwiKTtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9vcGVuRGlyKG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRyeSB0byBjcmVhdGUgYSBkaXJlY3RvcnkgYW5kIGVudGVyIGl0LiBUaGlzIHdpbGwgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZGlyZWN0b3J5XG4gICAgICogY291bGRuJ3QgYmUgY3JlYXRlZCBpZiBmb3IgZXhhbXBsZSBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX29wZW5EaXIoZGlyTmFtZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiTUtEIFwiICsgZGlyTmFtZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2QoZGlyTmFtZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBlbXB0eSBkaXJlY3RvcnksIHdpbGwgZmFpbCBpZiBub3QgZW1wdHkuXG4gICAgICovXG4gICAgYXN5bmMgcmVtb3ZlRW1wdHlEaXIocGF0aCkge1xuICAgICAgICBjb25zdCB2YWxpZFBhdGggPSBhd2FpdCB0aGlzLnByb3RlY3RXaGl0ZXNwYWNlKHBhdGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKGBSTUQgJHt2YWxpZFBhdGh9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZUUCBzZXJ2ZXJzIGNhbid0IGhhbmRsZSBmaWxlbmFtZXMgdGhhdCBoYXZlIGxlYWRpbmcgd2hpdGVzcGFjZS4gVGhpcyBtZXRob2QgdHJhbnNmb3Jtc1xuICAgICAqIGEgZ2l2ZW4gcGF0aCB0byBmaXggdGhhdCBpc3N1ZSBmb3IgbW9zdCBjYXNlcy5cbiAgICAgKi9cbiAgICBhc3luYyBwcm90ZWN0V2hpdGVzcGFjZShwYXRoKSB7XG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKFwiIFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFuZGxlIGxlYWRpbmcgd2hpdGVzcGFjZSBieSBwcmVwZW5kaW5nIHRoZSBhYnNvbHV0ZSBwYXRoOlxuICAgICAgICAvLyBcIiB0ZXN0LnR4dFwiIHdoaWxlIGJlaW5nIGluIHRoZSByb290IGRpcmVjdG9yeSBiZWNvbWVzIFwiLyB0ZXN0LnR4dFwiLlxuICAgICAgICBjb25zdCBwd2QgPSBhd2FpdCB0aGlzLnB3ZCgpO1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGhQcmVmaXggPSBwd2QuZW5kc1dpdGgoXCIvXCIpID8gcHdkIDogcHdkICsgXCIvXCI7XG4gICAgICAgIHJldHVybiBhYnNvbHV0ZVBhdGhQcmVmaXggKyBwYXRoO1xuICAgIH1cbiAgICBhc3luYyBfZXhpdEF0Q3VycmVudERpcmVjdG9yeShmdW5jKSB7XG4gICAgICAgIGNvbnN0IHVzZXJEaXIgPSBhd2FpdCB0aGlzLnB3ZCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpZ25vcmVFcnJvcigoKSA9PiB0aGlzLmNkKHVzZXJEaXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcnkgYWxsIGF2YWlsYWJsZSB0cmFuc2ZlciBzdHJhdGVnaWVzIGFuZCBwaWNrIHRoZSBmaXJzdCBvbmUgdGhhdCB3b3Jrcy4gVXBkYXRlIGBjbGllbnRgIHRvXG4gICAgICogdXNlIHRoZSB3b3JraW5nIHN0cmF0ZWd5IGZvciBhbGwgc3VjY2Vzc2l2ZSB0cmFuc2ZlciByZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHRyeSB0aGUgcHJvdmlkZWQgc3RyYXRlZ2llcy5cbiAgICAgKi9cbiAgICBfZW50ZXJGaXJzdENvbXBhdGlibGVNb2RlKHN0cmF0ZWdpZXMpIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jIChmdHApID0+IHtcbiAgICAgICAgICAgIGZ0cC5sb2coXCJUcnlpbmcgdG8gZmluZCBvcHRpbWFsIHRyYW5zZmVyIHN0cmF0ZWd5Li4uXCIpO1xuICAgICAgICAgICAgbGV0IGxhc3RFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RyYXRlZ3kgb2Ygc3RyYXRlZ2llcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHN0cmF0ZWd5KGZ0cCk7XG4gICAgICAgICAgICAgICAgICAgIGZ0cC5sb2coXCJPcHRpbWFsIHRyYW5zZmVyIHN0cmF0ZWd5IGZvdW5kLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlVHJhbnNmZXIgPSBzdHJhdGVneTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRoZSBuZXh0IGNhbmRpZGF0ZSBubyBtYXR0ZXIgdGhlIGV4YWN0IGVycm9yLiBJdCdzIHBvc3NpYmxlIHRoYXQgYSBzZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5zd2VyZWQgaW5jb3JyZWN0bHkgdG8gYSBzdHJhdGVneSwgZm9yIGV4YW1wbGUgYSBQQVNWIGFuc3dlciB0byBhbiBFUFNWLlxuICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb25lIG9mIHRoZSBhdmFpbGFibGUgdHJhbnNmZXIgc3RyYXRlZ2llcyB3b3JrLiBMYXN0IGVycm9yIHJlc3BvbnNlIHdhcyAnJHtsYXN0RXJyb3J9Jy5gKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRCwgdXNlIGB1cGxvYWRGcm9tYC5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZChzb3VyY2UsIHRvUmVtb3RlUGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZnRwLmxvZyhcIldhcm5pbmc6IHVwbG9hZCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHVzZSB1cGxvYWRGcm9tKCkuXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRGcm9tKHNvdXJjZSwgdG9SZW1vdGVQYXRoLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRCwgdXNlIGBhcHBlbmRGcm9tYC5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFzeW5jIGFwcGVuZChzb3VyY2UsIHRvUmVtb3RlUGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZnRwLmxvZyhcIldhcm5pbmc6IGFwcGVuZCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHVzZSBhcHBlbmRGcm9tKCkuXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBlbmRGcm9tKHNvdXJjZSwgdG9SZW1vdGVQYXRoLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRCwgdXNlIGBkb3dubG9hZFRvYC5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFzeW5jIGRvd25sb2FkKGRlc3RpbmF0aW9uLCBmcm9tUmVtb3RlUGF0aCwgc3RhcnRBdCA9IDApIHtcbiAgICAgICAgdGhpcy5mdHAubG9nKFwiV2FybmluZzogZG93bmxvYWQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCB1c2UgZG93bmxvYWRUbygpLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRUbyhkZXN0aW5hdGlvbiwgZnJvbVJlbW90ZVBhdGgsIHN0YXJ0QXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBERVBSRUNBVEVELCB1c2UgYHVwbG9hZEZyb21EaXJgLlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYXN5bmMgdXBsb2FkRGlyKGxvY2FsRGlyUGF0aCwgcmVtb3RlRGlyUGF0aCkge1xuICAgICAgICB0aGlzLmZ0cC5sb2coXCJXYXJuaW5nOiB1cGxvYWREaXIoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCB1c2UgdXBsb2FkRnJvbURpcigpLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkRnJvbURpcihsb2NhbERpclBhdGgsIHJlbW90ZURpclBhdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBERVBSRUNBVEVELCB1c2UgYGRvd25sb2FkVG9EaXJgLlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYXN5bmMgZG93bmxvYWREaXIobG9jYWxEaXJQYXRoKSB7XG4gICAgICAgIHRoaXMuZnRwLmxvZyhcIldhcm5pbmc6IGRvd25sb2FkRGlyKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgdXNlIGRvd25sb2FkVG9EaXIoKS5cIik7XG4gICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkVG9EaXIobG9jYWxEaXJQYXRoKTtcbiAgICB9XG59XG5leHBvcnRzLkNsaWVudCA9IENsaWVudDtcbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZUxvY2FsRGlyZWN0b3J5KHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBmc1N0YXQocGF0aCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgYXdhaXQgZnNNa0RpcihwYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcihmdW5jKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBJZ25vcmVcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRmlsZUluZm8gPSBleHBvcnRzLkZpbGVUeXBlID0gdm9pZCAwO1xudmFyIEZpbGVUeXBlO1xuKGZ1bmN0aW9uIChGaWxlVHlwZSkge1xuICAgIEZpbGVUeXBlW0ZpbGVUeXBlW1wiVW5rbm93blwiXSA9IDBdID0gXCJVbmtub3duXCI7XG4gICAgRmlsZVR5cGVbRmlsZVR5cGVbXCJGaWxlXCJdID0gMV0gPSBcIkZpbGVcIjtcbiAgICBGaWxlVHlwZVtGaWxlVHlwZVtcIkRpcmVjdG9yeVwiXSA9IDJdID0gXCJEaXJlY3RvcnlcIjtcbiAgICBGaWxlVHlwZVtGaWxlVHlwZVtcIlN5bWJvbGljTGlua1wiXSA9IDNdID0gXCJTeW1ib2xpY0xpbmtcIjtcbn0pKEZpbGVUeXBlIHx8IChleHBvcnRzLkZpbGVUeXBlID0gRmlsZVR5cGUgPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgYSBmaWxlLCBkaXJlY3Rvcnkgb3Igc3ltYm9saWMgbGluay5cbiAqL1xuY2xhc3MgRmlsZUluZm8ge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy50eXBlID0gRmlsZVR5cGUuVW5rbm93bjtcbiAgICAgICAgdGhpcy5zaXplID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVucGFyc2VkLCByYXcgbW9kaWZpY2F0aW9uIGRhdGUgYXMgYSBzdHJpbmcuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIGBtb2RpZmllZEF0YCBpcyB1bmRlZmluZWQsIHRoZSBGVFAgc2VydmVyIHlvdSdyZSBjb25uZWN0ZWQgdG8gZG9lc24ndCBzdXBwb3J0IHRoZSBtb3JlIG1vZGVyblxuICAgICAgICAgKiBNTFNEIGNvbW1hbmQgZm9yIG1hY2hpbmUtcmVhZGFibGUgZGlyZWN0b3J5IGxpc3RpbmdzLiBUaGUgb2xkZXIgY29tbWFuZCBMSVNUIGlzIHRoZW4gdXNlZCByZXR1cm5pbmdcbiAgICAgICAgICogcmVzdWx0cyB0aGF0IHZhcnkgYSBsb3QgYmV0d2VlbiBzZXJ2ZXJzIGFzIHRoZSBmb3JtYXQgaGFzbid0IGJlZW4gc3RhbmRhcmRpemVkLiBIZXJlLCBkaXJlY3RvcnkgbGlzdGluZ3NcbiAgICAgICAgICogYW5kIGVzcGVjaWFsbHkgbW9kaWZpY2F0aW9uIGRhdGVzIHdlcmUgbWVhbnQgdG8gYmUgaHVtYW4tcmVhZGFibGUgZmlyc3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEJlIGNhcmVmdWwgd2hlbiBzdGlsbCB0cnlpbmcgdG8gcGFyc2UgdGhpcyBieSB5b3Vyc2VsZi4gUGFyc2luZyBkYXRlcyBmcm9tIGxpc3RpbmdzIHVzaW5nIExJU1QgaXNcbiAgICAgICAgICogdW5yZWxpYWJsZS4gVGhpcyBsaWJyYXJ5IGRlY2lkZXMgdG8gb2ZmZXIgcGFyc2VkIGRhdGVzIG9ubHkgd2hlbiB0aGV5J3JlIGFic29sdXRlbHkgcmVsaWFibGUgYW5kIHNhZmUgdG9cbiAgICAgICAgICogdXNlIGUuZy4gZm9yIGNvbXBhcmlzb25zLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yYXdNb2RpZmllZEF0ID0gXCJcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhcnNlZCBtb2RpZmljYXRpb24gZGF0ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQXZhaWxhYmxlIGlmIHRoZSBGVFAgc2VydmVyIHN1cHBvcnRzIHRoZSBNTFNEIGNvbW1hbmQuIE9ubHkgTUxTRCBndWFyYW50ZWVzIGRhdGVzIHRoYW4gY2FuIGJlIHJlbGlhYmx5XG4gICAgICAgICAqIHBhcnNlZCB3aXRoIHRoZSBjb3JyZWN0IHRpbWV6b25lIGFuZCBhIHJlc29sdXRpb24gZG93biB0byBzZWNvbmRzLiBTZWUgYHJhd01vZGlmaWVkQXRgIHByb3BlcnR5IGZvciB0aGUgdW5wYXJzZWRcbiAgICAgICAgICogZGF0ZSB0aGF0IGlzIGFsd2F5cyBhdmFpbGFibGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1vZGlmaWVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbml4IHBlcm1pc3Npb25zIGlmIHByZXNlbnQuIElmIHRoZSB1bmRlcmx5aW5nIEZUUCBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcgb24gVW5peCB0aGlzIHdpbGwgYmUgdW5kZWZpbmVkLlxuICAgICAgICAgKiBJZiBzZXQsIHlvdSBtaWdodCBiZSBhYmxlIHRvIGVkaXQgcGVybWlzc2lvbnMgd2l0aCB0aGUgRlRQIGNvbW1hbmQgYFNJVEUgQ0hNT0RgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhhcmQgbGluayBjb3VudCBpZiBhdmFpbGFibGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhhcmRMaW5rQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaW5rIG5hbWUgZm9yIHN5bWJvbGljIGxpbmtzIGlmIGF2YWlsYWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGluayA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVuaXggZ3JvdXAgaWYgYXZhaWxhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ncm91cCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVuaXggdXNlciBpZiBhdmFpbGFibGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVzZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmlxdWUgSUQgaWYgYXZhaWxhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51bmlxdWVJRCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB9XG4gICAgZ2V0IGlzRGlyZWN0b3J5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSBGaWxlVHlwZS5EaXJlY3Rvcnk7XG4gICAgfVxuICAgIGdldCBpc1N5bWJvbGljTGluaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gRmlsZVR5cGUuU3ltYm9saWNMaW5rO1xuICAgIH1cbiAgICBnZXQgaXNGaWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSBGaWxlVHlwZS5GaWxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLCBsZWdhY3kgQVBJLiBVc2UgYHJhd01vZGlmaWVkQXRgIGluc3RlYWQuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBnZXQgZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3TW9kaWZpZWRBdDtcbiAgICB9XG4gICAgc2V0IGRhdGUocmF3TW9kaWZpZWRBdCkge1xuICAgICAgICB0aGlzLnJhd01vZGlmaWVkQXQgPSByYXdNb2RpZmllZEF0O1xuICAgIH1cbn1cbmV4cG9ydHMuRmlsZUluZm8gPSBGaWxlSW5mbztcbkZpbGVJbmZvLlVuaXhQZXJtaXNzaW9uID0ge1xuICAgIFJlYWQ6IDQsXG4gICAgV3JpdGU6IDIsXG4gICAgRXhlY3V0ZTogMVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5GVFBDb250ZXh0ID0gZXhwb3J0cy5GVFBFcnJvciA9IHZvaWQgMDtcbmNvbnN0IG5ldF8xID0gcmVxdWlyZShcIm5ldFwiKTtcbmNvbnN0IHBhcnNlQ29udHJvbFJlc3BvbnNlXzEgPSByZXF1aXJlKFwiLi9wYXJzZUNvbnRyb2xSZXNwb25zZVwiKTtcbi8qKlxuICogRGVzY3JpYmVzIGFuIEZUUCBzZXJ2ZXIgZXJyb3IgcmVzcG9uc2UgaW5jbHVkaW5nIHRoZSBGVFAgcmVzcG9uc2UgY29kZS5cbiAqL1xuY2xhc3MgRlRQRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IocmVzKSB7XG4gICAgICAgIHN1cGVyKHJlcy5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICB0aGlzLmNvZGUgPSByZXMuY29kZTtcbiAgICB9XG59XG5leHBvcnRzLkZUUEVycm9yID0gRlRQRXJyb3I7XG5mdW5jdGlvbiBkb05vdGhpbmcoKSB7XG4gICAgLyoqIERvIG5vdGhpbmcgKi9cbn1cbi8qKlxuICogRlRQQ29udGV4dCBob2xkcyB0aGUgY29udHJvbCBhbmQgZGF0YSBzb2NrZXRzIG9mIGFuIEZUUCBjb25uZWN0aW9uIGFuZCBwcm92aWRlcyBhXG4gKiBzaW1wbGlmaWVkIHdheSB0byBpbnRlcmFjdCB3aXRoIGFuIEZUUCBzZXJ2ZXIsIGhhbmRsZSByZXNwb25zZXMsIGVycm9ycyBhbmQgdGltZW91dHMuXG4gKlxuICogSXQgZG9lc24ndCBpbXBsZW1lbnQgb3IgdXNlIGFueSBGVFAgY29tbWFuZHMuIEl0J3Mgb25seSBhIGZvdW5kYXRpb24gdG8gbWFrZSB3cml0aW5nIGFuIEZUUFxuICogY2xpZW50IGFzIGVhc3kgYXMgcG9zc2libGUuIFlvdSB3b24ndCB1c3VhbGx5IGluc3RhbnRpYXRlIHRoaXMsIGJ1dCB1c2UgYENsaWVudGAuXG4gKi9cbmNsYXNzIEZUUENvbnRleHQge1xuICAgIC8qKlxuICAgICAqIEluc3RhbnRpYXRlIGFuIEZUUCBjb250ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHRpbWVvdXQgLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhcHBseSB0byBjb250cm9sIGFuZCBkYXRhIGNvbm5lY3Rpb25zLiBVc2UgMCBmb3Igbm8gdGltZW91dC5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgLSBFbmNvZGluZyB0byB1c2UgZm9yIGNvbnRyb2wgY29ubmVjdGlvbi4gVVRGLTggYnkgZGVmYXVsdC4gVXNlIFwibGF0aW4xXCIgZm9yIG9sZGVyIHNlcnZlcnMuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodGltZW91dCA9IDAsIGVuY29kaW5nID0gXCJ1dGY4XCIpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgLyoqIERlYnVnLWxldmVsIGxvZ2dpbmcgb2YgYWxsIHNvY2tldCBjb21tdW5pY2F0aW9uLiAqL1xuICAgICAgICB0aGlzLnZlcmJvc2UgPSBmYWxzZTtcbiAgICAgICAgLyoqIElQIHZlcnNpb24gdG8gcHJlZmVyICg0OiBJUHY0LCA2OiBJUHY2LCB1bmRlZmluZWQ6IGF1dG9tYXRpYykuICovXG4gICAgICAgIHRoaXMuaXBGYW1pbHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKiBPcHRpb25zIGZvciBUTFMgY29ubmVjdGlvbnMuICovXG4gICAgICAgIHRoaXMudGxzT3B0aW9ucyA9IHt9O1xuICAgICAgICAvKiogQSBtdWx0aWxpbmUgcmVzcG9uc2UgbWlnaHQgYmUgcmVjZWl2ZWQgYXMgbXVsdGlwbGUgY2h1bmtzLiAqL1xuICAgICAgICB0aGlzLl9wYXJ0aWFsUmVzcG9uc2UgPSBcIlwiO1xuICAgICAgICB0aGlzLl9lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgICAgICAvLyBIZWxwIFR5cGVzY3JpcHQgdW5kZXJzdGFuZCB0aGF0IHdlIGRvIGluZGVlZCBzZXQgX3NvY2tldCBpbiB0aGUgY29uc3RydWN0b3IgYnV0IHVzZSB0aGUgc2V0dGVyIG1ldGhvZCB0byBkbyBzby5cbiAgICAgICAgdGhpcy5fc29ja2V0ID0gdGhpcy5zb2NrZXQgPSB0aGlzLl9uZXdTb2NrZXQoKTtcbiAgICAgICAgdGhpcy5fZGF0YVNvY2tldCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIGNvbnRleHQuXG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIC8vIEludGVybmFsbHksIGNsb3NpbmcgYSBjb250ZXh0IGlzIGFsd2F5cyBkZXNjcmliZWQgd2l0aCBhbiBlcnJvci4gSWYgdGhlcmUgaXMgc3RpbGwgYSB0YXNrIHJ1bm5pbmcsIGl0IHdpbGxcbiAgICAgICAgLy8gYWJvcnQgd2l0aCBhbiBleGNlcHRpb24gdGhhdCB0aGUgdXNlciBjbG9zZWQgdGhlIGNsaWVudCBkdXJpbmcgYSB0YXNrLiBJZiBubyB0YXNrIGlzIHJ1bm5pbmcsIG5vIGV4Y2VwdGlvbiBpc1xuICAgICAgICAvLyB0aHJvd24gYnV0IGFsbCBuZXdseSBzdWJtaXR0ZWQgdGFza3MgYWZ0ZXIgdGhhdCB3aWxsIGFib3J0IHRoZSBleGNlcHRpb24gdGhhdCB0aGUgY2xpZW50IGhhcyBiZWVuIGNsb3NlZC5cbiAgICAgICAgLy8gSW4gYWRkaXRpb24gdGhlIHVzZXIgd2lsbCBnZXQgYSBzdGFjayB0cmFjZSBwb2ludGluZyB0byB3aGVyZSBleGFjdGx5IHRoZSBjbGllbnQgaGFzIGJlZW4gY2xvc2VkLiBTbyBpbiBhbnlcbiAgICAgICAgLy8gY2FzZSB1c2UgX2Nsb3NpbmdFcnJvciB0byBkZXRlcm1pbmUgd2hldGhlciBhIGNvbnRleHQgaXMgY2xvc2VkLiBUaGlzIGFsc28gYWxsb3dzIHVzIHRvIGhhdmUgYSBzaW5nbGUgY29kZS1wYXRoXG4gICAgICAgIC8vIGZvciBjbG9zaW5nIGEgY29udGV4dCBtYWtpbmcgdGhlIGltcGxlbWVudGF0aW9uIGVhc2llci5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuX3Rhc2sgPyBcIlVzZXIgY2xvc2VkIGNsaWVudCBkdXJpbmcgdGFza1wiIDogXCJVc2VyIGNsb3NlZCBjbGllbnRcIjtcbiAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKGVycik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjb250ZXh0IHdpdGggYW4gZXJyb3IuXG4gICAgICovXG4gICAgY2xvc2VXaXRoRXJyb3IoZXJyKSB7XG4gICAgICAgIC8vIElmIHRoaXMgY29udGV4dCBhbHJlYWR5IGhhcyBiZWVuIGNsb3NlZCwgZG9uJ3Qgb3ZlcndyaXRlIHRoZSByZWFzb24uXG4gICAgICAgIGlmICh0aGlzLl9jbG9zaW5nRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jbG9zaW5nRXJyb3IgPSBlcnI7XG4gICAgICAgIC8vIENsb3NlIHRoZSBzb2NrZXRzIGJ1dCBkb24ndCBmdWxseSByZXNldCB0aGlzIGNvbnRleHQgdG8gcHJlc2VydmUgYHRoaXMuX2Nsb3NpbmdFcnJvcmAuXG4gICAgICAgIHRoaXMuX2Nsb3NlQ29udHJvbFNvY2tldCgpO1xuICAgICAgICB0aGlzLl9jbG9zZVNvY2tldCh0aGlzLl9kYXRhU29ja2V0KTtcbiAgICAgICAgLy8gR2l2ZSB0aGUgdXNlcidzIHRhc2sgYSBjaGFuY2UgdG8gcmVhY3QsIG1heWJlIGNsZWFudXAgcmVzb3VyY2VzLlxuICAgICAgICB0aGlzLl9wYXNzVG9IYW5kbGVyKGVycik7XG4gICAgICAgIC8vIFRoZSB0YXNrIG1pZ2h0IG5vdCBoYXZlIGJlZW4gcmVqZWN0ZWQgYnkgdGhlIHVzZXIgYWZ0ZXIgcmVjZWl2aW5nIHRoZSBlcnJvci5cbiAgICAgICAgdGhpcy5fc3RvcFRyYWNraW5nVGFzaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb250ZXh0IGhhcyBiZWVuIGNsb3NlZCBvciBoYXNuJ3QgYmVlbiBjb25uZWN0ZWQgeWV0LiBZb3UgY2FuIHJlb3BlbiBpdCB3aXRoIGBhY2Nlc3NgLlxuICAgICAqL1xuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5yZW1vdGVBZGRyZXNzID09PSB1bmRlZmluZWQgfHwgdGhpcy5fY2xvc2luZ0Vycm9yICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0IHRoaXMgY29udGV4IGFuZCBhbGwgb2YgaXRzIHN0YXRlLlxuICAgICAqL1xuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHRoaXMuX25ld1NvY2tldCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEZUUCBjb250cm9sIHNvY2tldC5cbiAgICAgKi9cbiAgICBnZXQgc29ja2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ja2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHNvY2tldCBmb3IgdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4gVGhpcyB3aWxsIG9ubHkgY2xvc2UgdGhlIGN1cnJlbnQgY29udHJvbCBzb2NrZXRcbiAgICAgKiBpZiB0aGUgbmV3IG9uZSBpcyBub3QgYW4gdXBncmFkZSB0byB0aGUgY3VycmVudCBvbmUuXG4gICAgICovXG4gICAgc2V0IHNvY2tldChzb2NrZXQpIHtcbiAgICAgICAgLy8gTm8gZGF0YSBzb2NrZXQgc2hvdWxkIGJlIG9wZW4gaW4gYW55IGNhc2Ugd2hlcmUgdGhlIGNvbnRyb2wgc29ja2V0IGlzIHNldCBvciB1cGdyYWRlZC5cbiAgICAgICAgdGhpcy5kYXRhU29ja2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBUaGlzIGJlaW5nIGEgcmVzZXQsIHJlc2V0IGFueSBvdGhlciBzdGF0ZSBhcGFydCBmcm9tIHRoZSBzb2NrZXQuXG4gICAgICAgIHRoaXMudGxzT3B0aW9ucyA9IHt9O1xuICAgICAgICB0aGlzLl9wYXJ0aWFsUmVzcG9uc2UgPSBcIlwiO1xuICAgICAgICBpZiAodGhpcy5fc29ja2V0KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdTb2NrZXRVcGdyYWRlc0V4aXN0aW5nID0gc29ja2V0LmxvY2FsUG9ydCA9PT0gdGhpcy5fc29ja2V0LmxvY2FsUG9ydDtcbiAgICAgICAgICAgIGlmIChuZXdTb2NrZXRVcGdyYWRlc0V4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlU29ja2V0TGlzdGVuZXJzKHRoaXMuc29ja2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlQ29udHJvbFNvY2tldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzb2NrZXQpIHtcbiAgICAgICAgICAgIC8vIFNldHRpbmcgYSBjb21wbGV0ZWx5IG5ldyBjb250cm9sIHNvY2tldCBpcyBpbiBlc3NlbmNlIHNvbWV0aGluZyBsaWtlIGEgcmVzZXQuIFRoYXQnc1xuICAgICAgICAgICAgLy8gd2h5IHdlIGFsc28gY2xvc2UgYW55IG9wZW4gZGF0YSBjb25uZWN0aW9uIGFib3ZlLiBXZSBjYW4gZ28gb25lIHN0ZXAgZnVydGhlciBhbmQgcmVzZXRcbiAgICAgICAgICAgIC8vIGEgcG9zc2libGUgY2xvc2luZyBlcnJvci4gVGhhdCBtZWFucyB0aGF0IGEgY2xvc2VkIEZUUENvbnRleHQgY2FuIGJlIFwicmVvcGVuZWRcIiBieVxuICAgICAgICAgICAgLy8gc2V0dGluZyBhIG5ldyBjb250cm9sIHNvY2tldC5cbiAgICAgICAgICAgIHRoaXMuX2Nsb3NpbmdFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vIERvbid0IHNldCBhIHRpbWVvdXQgeWV0LiBUaW1lb3V0IGZvciBjb250cm9sIHNvY2tldHMgaXMgb25seSBhY3RpdmUgZHVyaW5nIGEgdGFzaywgc2VlIGhhbmRsZSgpIGJlbG93LlxuICAgICAgICAgICAgc29ja2V0LnNldFRpbWVvdXQoMCk7XG4gICAgICAgICAgICBzb2NrZXQuc2V0RW5jb2RpbmcodGhpcy5fZW5jb2RpbmcpO1xuICAgICAgICAgICAgc29ja2V0LnNldEtlZXBBbGl2ZSh0cnVlKTtcbiAgICAgICAgICAgIHNvY2tldC5vbihcImRhdGFcIiwgZGF0YSA9PiB0aGlzLl9vbkNvbnRyb2xTb2NrZXREYXRhKGRhdGEpKTtcbiAgICAgICAgICAgIC8vIFNlcnZlciBzZW5kaW5nIGEgRklOIHBhY2tldCBpcyB0cmVhdGVkIGFzIGFuIGVycm9yLlxuICAgICAgICAgICAgc29ja2V0Lm9uKFwiZW5kXCIsICgpID0+IHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IEVycm9yKFwiU2VydmVyIHNlbnQgRklOIHBhY2tldCB1bmV4cGVjdGVkbHksIGNsb3NpbmcgY29ubmVjdGlvbi5cIikpKTtcbiAgICAgICAgICAgIC8vIENvbnRyb2wgYmVpbmcgY2xvc2VkIHdpdGhvdXQgZXJyb3IgYnkgc2VydmVyIGlzIHRyZWF0ZWQgYXMgYW4gZXJyb3IuXG4gICAgICAgICAgICBzb2NrZXQub24oXCJjbG9zZVwiLCBoYWRFcnJvciA9PiB7IGlmICghaGFkRXJyb3IpXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihuZXcgRXJyb3IoXCJTZXJ2ZXIgY2xvc2VkIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LlwiKSk7IH0pO1xuICAgICAgICAgICAgdGhpcy5fc2V0dXBEZWZhdWx0RXJyb3JIYW5kbGVycyhzb2NrZXQsIFwiY29udHJvbCBzb2NrZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc29ja2V0ID0gc29ja2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgRlRQIGRhdGEgY29ubmVjdGlvbiBpZiBwcmVzZW50LlxuICAgICAqL1xuICAgIGdldCBkYXRhU29ja2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVNvY2tldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzb2NrZXQgZm9yIHRoZSBkYXRhIGNvbm5lY3Rpb24uIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGNsb3NlIHRoZSBmb3JtZXIgZGF0YSBzb2NrZXQuXG4gICAgICovXG4gICAgc2V0IGRhdGFTb2NrZXQoc29ja2V0KSB7XG4gICAgICAgIHRoaXMuX2Nsb3NlU29ja2V0KHRoaXMuX2RhdGFTb2NrZXQpO1xuICAgICAgICBpZiAoc29ja2V0KSB7XG4gICAgICAgICAgICAvLyBEb24ndCBzZXQgYSB0aW1lb3V0IHlldC4gVGltZW91dCBkYXRhIHNvY2tldCBzaG91bGQgYmUgYWN0aXZhdGVkIHdoZW4gZGF0YSB0cmFuc21pc3Npb24gc3RhcnRzXG4gICAgICAgICAgICAvLyBhbmQgdGltZW91dCBvbiBjb250cm9sIHNvY2tldCBpcyBkZWFjdGl2YXRlZC5cbiAgICAgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgICAgICAgICAgdGhpcy5fc2V0dXBEZWZhdWx0RXJyb3JIYW5kbGVycyhzb2NrZXQsIFwiZGF0YSBzb2NrZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGF0YVNvY2tldCA9IHNvY2tldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50bHkgdXNlZCBlbmNvZGluZy5cbiAgICAgKi9cbiAgICBnZXQgZW5jb2RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBlbmNvZGluZyB1c2VkIGZvciB0aGUgY29udHJvbCBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBTZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9idWZmZXIuaHRtbCNidWZmZXJfYnVmZmVyc19hbmRfY2hhcmFjdGVyX2VuY29kaW5ncyBmb3Igd2hhdCBlbmNvZGluZ3NcbiAgICAgKiBhcmUgc3VwcG9ydGVkIGJ5IE5vZGUuXG4gICAgICovXG4gICAgc2V0IGVuY29kaW5nKGVuY29kaW5nKSB7XG4gICAgICAgIHRoaXMuX2VuY29kaW5nID0gZW5jb2Rpbmc7XG4gICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2V0RW5jb2RpbmcoZW5jb2RpbmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYW4gRlRQIGNvbW1hbmQgd2l0aG91dCB3YWl0aW5nIGZvciBvciBoYW5kbGluZyB0aGUgcmVzdWx0LlxuICAgICAqL1xuICAgIHNlbmQoY29tbWFuZCkge1xuICAgICAgICBjb25zdCBjb250YWluc1Bhc3N3b3JkID0gY29tbWFuZC5zdGFydHNXaXRoKFwiUEFTU1wiKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNvbnRhaW5zUGFzc3dvcmQgPyBcIj4gUEFTUyAjIyNcIiA6IGA+ICR7Y29tbWFuZH1gO1xuICAgICAgICB0aGlzLmxvZyhtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5fc29ja2V0LndyaXRlKGNvbW1hbmQgKyBcIlxcclxcblwiLCB0aGlzLmVuY29kaW5nKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhbiBGVFAgY29tbWFuZCBhbmQgaGFuZGxlIHRoZSBmaXJzdCByZXNwb25zZS4gVXNlIHRoaXMgaWYgeW91IGhhdmUgYSBzaW1wbGVcbiAgICAgKiByZXF1ZXN0LXJlc3BvbnNlIHNpdHVhdGlvbi5cbiAgICAgKi9cbiAgICByZXF1ZXN0KGNvbW1hbmQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlKGNvbW1hbmQsIChyZXMsIHRhc2spID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRhc2sucmVqZWN0KHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXNrLnJlc29sdmUocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYW4gRlRQIGNvbW1hbmQgYW5kIGhhbmRsZSBhbnkgcmVzcG9uc2UgdW50aWwgeW91IHJlc29sdmUvcmVqZWN0LiBVc2UgdGhpcyBpZiB5b3UgZXhwZWN0IG11bHRpcGxlIHJlc3BvbnNlc1xuICAgICAqIHRvIGEgcmVxdWVzdC4gVGhpcyByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHdpbGwgaG9sZCB3aGF0ZXZlciB0aGUgcmVzcG9uc2UgaGFuZGxlciBwYXNzZWQgb24gd2hlbiByZXNvbHZpbmcvcmVqZWN0aW5nIGl0cyB0YXNrLlxuICAgICAqL1xuICAgIGhhbmRsZShjb21tYW5kLCByZXNwb25zZUhhbmRsZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Rhc2spIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcIlVzZXIgbGF1bmNoZWQgYSB0YXNrIHdoaWxlIGFub3RoZXIgb25lIGlzIHN0aWxsIHJ1bm5pbmcuIEZvcmdvdCB0byB1c2UgJ2F3YWl0JyBvciAnLnRoZW4oKSc/XCIpO1xuICAgICAgICAgICAgZXJyLnN0YWNrICs9IGBcXG5SdW5uaW5nIHRhc2sgbGF1bmNoZWQgYXQ6ICR7dGhpcy5fdGFzay5zdGFja31gO1xuICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihlcnIpO1xuICAgICAgICAgICAgLy8gRG9uJ3QgcmV0dXJuIGhlcmUsIGNvbnRpbnVlIHdpdGggcmV0dXJuaW5nIHRoZSBQcm9taXNlIHRoYXQgd2lsbCB0aGVuIGJlIHJlamVjdGVkXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb250ZXh0IGNsb3NlZCBhbHJlYWR5LiBUaGF0IHdheSwgdXNlcnMgd2lsbCByZWNlaXZlIGFuIGV4Y2VwdGlvbiB3aGVyZVxuICAgICAgICAgICAgLy8gdGhleSBjYWxsZWQgdGhpcyBtZXRob2QgYnkgbWlzdGFrZS5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmVUYXNrLCByZWplY3RUYXNrKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90YXNrID0ge1xuICAgICAgICAgICAgICAgIHN0YWNrOiBuZXcgRXJyb3IoKS5zdGFjayB8fCBcIlVua25vd24gY2FsbCBzdGFja1wiLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlSGFuZGxlcixcbiAgICAgICAgICAgICAgICByZXNvbHZlcjoge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiBhcmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RvcFRyYWNraW5nVGFzaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVRhc2soYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0OiBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RvcFRyYWNraW5nVGFzaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0VGFzayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jbG9zaW5nRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGNsaWVudCBoYXMgYmVlbiBjbG9zZWQuIFByb3ZpZGUgYW4gZXJyb3IgdGhhdCBkZXNjcmliZXMgdGhpcyBvbmUgYXMgYmVpbmcgY2F1c2VkXG4gICAgICAgICAgICAgICAgLy8gYnkgYF9jbG9zaW5nRXJyb3JgLCBpbmNsdWRlIHN0YWNrIHRyYWNlcyBmb3IgYm90aC5cbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYENsaWVudCBpcyBjbG9zZWQgYmVjYXVzZSAke3RoaXMuX2Nsb3NpbmdFcnJvci5tZXNzYWdlfWApOyAvLyBUeXBlICdFcnJvcicgaXMgbm90IGNvcnJlY3RseSBkZWZpbmVkLCBkb2Vzbid0IGhhdmUgJ2NvZGUnLlxuICAgICAgICAgICAgICAgIGVyci5zdGFjayArPSBgXFxuQ2xvc2luZyByZWFzb246ICR7dGhpcy5fY2xvc2luZ0Vycm9yLnN0YWNrfWA7XG4gICAgICAgICAgICAgICAgZXJyLmNvZGUgPSB0aGlzLl9jbG9zaW5nRXJyb3IuY29kZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5fY2xvc2luZ0Vycm9yLmNvZGUgOiBcIjBcIjtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXNzVG9IYW5kbGVyKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT25seSB0cmFjayBjb250cm9sIHNvY2tldCB0aW1lb3V0IGR1cmluZyB0aGUgbGlmZWN5Y2xlIG9mIGEgdGFzay4gVGhpcyBhdm9pZHMgdGltZW91dHMgb24gaWRsZSBzb2NrZXRzLFxuICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgc29ja2V0IGJlaGF2aW91ciB3aGljaCBpcyBub3QgZXhwZWN0ZWQgYnkgbW9zdCB1c2Vycy5cbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNldFRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICAgICAgICAgIGlmIChjb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kKGNvbW1hbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIG1lc3NhZ2UgaWYgc2V0IHRvIGJlIHZlcmJvc2UuXG4gICAgICovXG4gICAgbG9nKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBjb250cm9sIHNvY2tldCBpcyB1c2luZyBUTFMuIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IGEgc2Vzc2lvblxuICAgICAqIGhhcyBhbHJlYWR5IGJlZW4gbmVnb3RpYXRlZC5cbiAgICAgKi9cbiAgICBnZXQgaGFzVExTKCkge1xuICAgICAgICByZXR1cm4gXCJlbmNyeXB0ZWRcIiBpbiB0aGlzLl9zb2NrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgcmVmZXJlbmNlIHRvIGN1cnJlbnQgdGFzayBhbmQgaGFuZGxlci4gVGhpcyB3b24ndCByZXNvbHZlIG9yIHJlamVjdCB0aGUgdGFzay5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgX3N0b3BUcmFja2luZ1Rhc2soKSB7XG4gICAgICAgIC8vIERpc2FibGUgdGltZW91dCBvbiBjb250cm9sIHNvY2tldCBpZiB0aGVyZSBpcyBubyB0YXNrIGFjdGl2ZS5cbiAgICAgICAgdGhpcy5zb2NrZXQuc2V0VGltZW91dCgwKTtcbiAgICAgICAgdGhpcy5fdGFzayA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlIGluY29taW5nIGRhdGEgb24gdGhlIGNvbnRyb2wgc29ja2V0LiBUaGUgY2h1bmsgaXMgZ29pbmcgdG8gYmUgb2YgdHlwZSBgc3RyaW5nYFxuICAgICAqIGJlY2F1c2Ugd2UgbGV0IGBzb2NrZXRgIGhhbmRsZSBlbmNvZGluZyB3aXRoIGBzZXRFbmNvZGluZ2AuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIF9vbkNvbnRyb2xTb2NrZXREYXRhKGNodW5rKSB7XG4gICAgICAgIHRoaXMubG9nKGA8ICR7Y2h1bmt9YCk7XG4gICAgICAgIC8vIFRoaXMgY2h1bmsgbWlnaHQgY29tcGxldGUgYW4gZWFybGllciBwYXJ0aWFsIHJlc3BvbnNlLlxuICAgICAgICBjb25zdCBjb21wbGV0ZVJlc3BvbnNlID0gdGhpcy5fcGFydGlhbFJlc3BvbnNlICsgY2h1bms7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9ICgwLCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xLnBhcnNlQ29udHJvbFJlc3BvbnNlKShjb21wbGV0ZVJlc3BvbnNlKTtcbiAgICAgICAgLy8gUmVtZW1iZXIgYW55IGluY29tcGxldGUgcmVtYWluZGVyLlxuICAgICAgICB0aGlzLl9wYXJ0aWFsUmVzcG9uc2UgPSBwYXJzZWQucmVzdDtcbiAgICAgICAgLy8gRWFjaCByZXNwb25zZSBncm91cCBpcyBwYXNzZWQgYWxvbmcgaW5kaXZpZHVhbGx5LlxuICAgICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgcGFyc2VkLm1lc3NhZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gcGFyc2VJbnQobWVzc2FnZS5zdWJzdHIoMCwgMyksIDEwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geyBjb2RlLCBtZXNzYWdlIH07XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBjb2RlID49IDQwMCA/IG5ldyBGVFBFcnJvcihyZXNwb25zZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl9wYXNzVG9IYW5kbGVyKGVyciA/IGVyciA6IHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBjdXJyZW50IGhhbmRsZXIgYSByZXNwb25zZS4gVGhpcyBpcyB1c3VhbGx5IGEgY29udHJvbCBzb2NrZXQgcmVzcG9uc2VcbiAgICAgKiBvciBhIHNvY2tldCBldmVudCwgbGlrZSBhbiBlcnJvciBvciB0aW1lb3V0LlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBfcGFzc1RvSGFuZGxlcihyZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy5fdGFzaykge1xuICAgICAgICAgICAgdGhpcy5fdGFzay5yZXNwb25zZUhhbmRsZXIocmVzcG9uc2UsIHRoaXMuX3Rhc2sucmVzb2x2ZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVycm9ycyBvdGhlciB0aGFuIEZUUEVycm9yIGFsd2F5cyBjbG9zZSB0aGUgY2xpZW50LiBJZiB0aGVyZSBpc24ndCBhbiBhY3RpdmUgdGFzayB0byBoYW5kbGUgdGhlIGVycm9yLFxuICAgICAgICAvLyB0aGUgbmV4dCBvbmUgc3VibWl0dGVkIHdpbGwgcmVjZWl2ZSBpdCB1c2luZyBgX2Nsb3NpbmdFcnJvcmAuXG4gICAgICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIGVkZ2UtY2FzZTogSWYgdGhlcmUgaXMgYW4gRlRQRXJyb3Igd2hpbGUgbm8gdGFzayBpcyBhY3RpdmUsIHRoZSBlcnJvciB3aWxsIGJlIGRyb3BwZWQuXG4gICAgICAgIC8vIEJ1dCB0aGF0IG1lYW5zIHRoYXQgdGhlIHVzZXIgc2VudCBhbiBGVFAgY29tbWFuZCB3aXRoIG5vIGludGVudGlvbiBvZiBoYW5kbGluZyB0aGUgcmVzdWx0LiBTbyB3aHkgc2hvdWxkIHRoZVxuICAgICAgICAvLyBlcnJvciBiZSBoYW5kbGVkPyBNYXliZSBsb2cgaXQgYXQgbGVhc3Q/IERlYnVnIGxvZ2dpbmcgd2lsbCBhbHJlYWR5IGRvIHRoYXQgYW5kIHRoZSBjbGllbnQgc3RheXMgdXNlYWJsZSBhZnRlclxuICAgICAgICAvLyBGVFBFcnJvci4gU28gbWF5YmUgbm8gbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLlxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXR1cCBhbGwgZXJyb3IgaGFuZGxlcnMgZm9yIGEgc29ja2V0LlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBfc2V0dXBEZWZhdWx0RXJyb3JIYW5kbGVycyhzb2NrZXQsIGlkZW50aWZpZXIpIHtcbiAgICAgICAgc29ja2V0Lm9uY2UoXCJlcnJvclwiLCBlcnJvciA9PiB7XG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlICs9IGAgKCR7aWRlbnRpZmllcn0pYDtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgc29ja2V0Lm9uY2UoXCJjbG9zZVwiLCBoYWRFcnJvciA9PiB7XG4gICAgICAgICAgICBpZiAoaGFkRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKG5ldyBFcnJvcihgU29ja2V0IGNsb3NlZCBkdWUgdG8gdHJhbnNtaXNzaW9uIGVycm9yICgke2lkZW50aWZpZXJ9KWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNvY2tldC5vbmNlKFwidGltZW91dFwiLCAoKSA9PiB7XG4gICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihuZXcgRXJyb3IoYFRpbWVvdXQgKCR7aWRlbnRpZmllcn0pYCkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIGNvbnRyb2wgc29ja2V0LiBTZW5kcyBRVUlULCB0aGVuIEZJTiwgYW5kIGlnbm9yZXMgYW55IHJlc3BvbnNlIG9yIGVycm9yLlxuICAgICAqL1xuICAgIF9jbG9zZUNvbnRyb2xTb2NrZXQoKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZVNvY2tldExpc3RlbmVycyh0aGlzLl9zb2NrZXQpO1xuICAgICAgICB0aGlzLl9zb2NrZXQub24oXCJlcnJvclwiLCBkb05vdGhpbmcpO1xuICAgICAgICB0aGlzLnNlbmQoXCJRVUlUXCIpO1xuICAgICAgICB0aGlzLl9jbG9zZVNvY2tldCh0aGlzLl9zb2NrZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZSBhIHNvY2tldCwgaWdub3JlcyBhbnkgZXJyb3IuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIF9jbG9zZVNvY2tldChzb2NrZXQpIHtcbiAgICAgICAgaWYgKHNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlU29ja2V0TGlzdGVuZXJzKHNvY2tldCk7XG4gICAgICAgICAgICBzb2NrZXQub24oXCJlcnJvclwiLCBkb05vdGhpbmcpO1xuICAgICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIGRlZmF1bHQgbGlzdGVuZXJzIGZvciBzb2NrZXQuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIF9yZW1vdmVTb2NrZXRMaXN0ZW5lcnMoc29ja2V0KSB7XG4gICAgICAgIHNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgLy8gQmVmb3JlIE5vZGUuanMgMTAuMy4wLCB1c2luZyBgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycygpYCB3aXRob3V0IGFueSBuYW1lIGRpZCBub3Qgd29yazogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8yMDkyMy5cbiAgICAgICAgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycyhcInRpbWVvdXRcIik7XG4gICAgICAgIHNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJkYXRhXCIpO1xuICAgICAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKFwiZW5kXCIpO1xuICAgICAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKFwiZXJyb3JcIik7XG4gICAgICAgIHNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJjbG9zZVwiKTtcbiAgICAgICAgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycyhcImNvbm5lY3RcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb3ZpZGUgYSBuZXcgc29ja2V0IGluc3RhbmNlLlxuICAgICAqXG4gICAgICogSW50ZXJuYWwgdXNlIG9ubHksIHJlcGxhY2VkIGZvciB1bml0IHRlc3RzLlxuICAgICAqL1xuICAgIF9uZXdTb2NrZXQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgbmV0XzEuU29ja2V0KCk7XG4gICAgfVxufVxuZXhwb3J0cy5GVFBDb250ZXh0ID0gRlRQQ29udGV4dDtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Qcm9ncmVzc1RyYWNrZXIgPSB2b2lkIDA7XG4vKipcbiAqIFRyYWNrcyBwcm9ncmVzcyBvZiBvbmUgc29ja2V0IGRhdGEgdHJhbnNmZXIgYXQgYSB0aW1lLlxuICovXG5jbGFzcyBQcm9ncmVzc1RyYWNrZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJ5dGVzT3ZlcmFsbCA9IDA7XG4gICAgICAgIHRoaXMuaW50ZXJ2YWxNcyA9IDUwMDtcbiAgICAgICAgdGhpcy5vblN0b3AgPSBub29wO1xuICAgICAgICB0aGlzLm9uSGFuZGxlID0gbm9vcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBuZXcgaGFuZGxlciBmb3IgcHJvZ3Jlc3MgaW5mby4gVXNlIGB1bmRlZmluZWRgIHRvIGRpc2FibGUgcmVwb3J0aW5nLlxuICAgICAqL1xuICAgIHJlcG9ydFRvKG9uSGFuZGxlID0gbm9vcCkge1xuICAgICAgICB0aGlzLm9uSGFuZGxlID0gb25IYW5kbGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0IHRyYWNraW5nIHRyYW5zZmVyIHByb2dyZXNzIG9mIGEgc29ja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvY2tldCAgVGhlIHNvY2tldCB0byBvYnNlcnZlLlxuICAgICAqIEBwYXJhbSBuYW1lICBBIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvZ3Jlc3MgdHJhY2tpbmcsIGUuZy4gYSBmaWxlbmFtZS5cbiAgICAgKiBAcGFyYW0gdHlwZSAgVGhlIHR5cGUgb2YgdGhlIHRyYW5zZmVyLCB0eXBpY2FsbHkgXCJ1cGxvYWRcIiBvciBcImRvd25sb2FkXCIuXG4gICAgICovXG4gICAgc3RhcnQoc29ja2V0LCBuYW1lLCB0eXBlKSB7XG4gICAgICAgIGxldCBsYXN0Qnl0ZXMgPSAwO1xuICAgICAgICB0aGlzLm9uU3RvcCA9IHBvbGwodGhpcy5pbnRlcnZhbE1zLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBieXRlcyA9IHNvY2tldC5ieXRlc1JlYWQgKyBzb2NrZXQuYnl0ZXNXcml0dGVuO1xuICAgICAgICAgICAgdGhpcy5ieXRlc092ZXJhbGwgKz0gYnl0ZXMgLSBsYXN0Qnl0ZXM7XG4gICAgICAgICAgICBsYXN0Qnl0ZXMgPSBieXRlcztcbiAgICAgICAgICAgIHRoaXMub25IYW5kbGUoe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBieXRlcyxcbiAgICAgICAgICAgICAgICBieXRlc092ZXJhbGw6IHRoaXMuYnl0ZXNPdmVyYWxsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3AgdHJhY2tpbmcgdHJhbnNmZXIgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgc3RvcCgpIHtcbiAgICAgICAgdGhpcy5vblN0b3AoZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBwcm9ncmVzcyBoYW5kbGVyIG9uZSBtb3JlIHRpbWUsIHRoZW4gc3RvcCB0cmFja2luZy5cbiAgICAgKi9cbiAgICB1cGRhdGVBbmRTdG9wKCkge1xuICAgICAgICB0aGlzLm9uU3RvcCh0cnVlKTtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHJhY2tlciA9IFByb2dyZXNzVHJhY2tlcjtcbi8qKlxuICogU3RhcnRzIGNhbGxpbmcgYSBjYWxsYmFjayBmdW5jdGlvbiBhdCBhIHJlZ3VsYXIgaW50ZXJ2YWwuIFRoZSBmaXJzdCBjYWxsIHdpbGwgZ28gb3V0XG4gKiBpbW1lZGlhdGVseS4gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBmdW5jdGlvbiB0byBzdG9wIHRoZSBwb2xsaW5nLlxuICovXG5mdW5jdGlvbiBwb2xsKGludGVydmFsTXMsIHVwZGF0ZUZ1bmMpIHtcbiAgICBjb25zdCBpZCA9IHNldEludGVydmFsKHVwZGF0ZUZ1bmMsIGludGVydmFsTXMpO1xuICAgIGNvbnN0IHN0b3BGdW5jID0gKHN0b3BXaXRoVXBkYXRlKSA9PiB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaWQpO1xuICAgICAgICBpZiAoc3RvcFdpdGhVcGRhdGUpIHtcbiAgICAgICAgICAgIHVwZGF0ZUZ1bmMoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50IHJlcGVhdGVkIGNhbGxzIHRvIHN0b3AgY2FsbGluZyBoYW5kbGVyLlxuICAgICAgICB1cGRhdGVGdW5jID0gbm9vcDtcbiAgICB9O1xuICAgIHVwZGF0ZUZ1bmMoKTtcbiAgICByZXR1cm4gc3RvcEZ1bmM7XG59XG5mdW5jdGlvbiBub29wKCkgeyB9XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TdHJpbmdXcml0ZXIgPSB2b2lkIDA7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jbGFzcyBTdHJpbmdXcml0ZXIgZXh0ZW5kcyBzdHJlYW1fMS5Xcml0YWJsZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuYnVmID0gQnVmZmVyLmFsbG9jKDApO1xuICAgIH1cbiAgICBfd3JpdGUoY2h1bmssIF8sIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5idWYgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmJ1ZiwgY2h1bmtdKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKFwiU3RyaW5nV3JpdGVyIGV4cGVjdHMgY2h1bmtzIG9mIHR5cGUgJ0J1ZmZlcicuXCIpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRUZXh0KGVuY29kaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1Zi50b1N0cmluZyhlbmNvZGluZyk7XG4gICAgfVxufVxuZXhwb3J0cy5TdHJpbmdXcml0ZXIgPSBTdHJpbmdXcml0ZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5lbnRlclBhc3NpdmVNb2RlSVB2NiA9IGV4cG9ydHMuZW50ZXJQYXNzaXZlTW9kZUlQdjQgPSB2b2lkIDA7XG4vKipcbiAqIFB1YmxpYyBBUElcbiAqL1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0NsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRnRwQ29udGV4dFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRmlsZUluZm9cIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3BhcnNlTGlzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vU3RyaW5nRW5jb2RpbmdcIiksIGV4cG9ydHMpO1xudmFyIHRyYW5zZmVyXzEgPSByZXF1aXJlKFwiLi90cmFuc2ZlclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImVudGVyUGFzc2l2ZU1vZGVJUHY0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cmFuc2Zlcl8xLmVudGVyUGFzc2l2ZU1vZGVJUHY0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZW50ZXJQYXNzaXZlTW9kZUlQdjZcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRyYW5zZmVyXzEuZW50ZXJQYXNzaXZlTW9kZUlQdjY7IH0gfSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXBJc1ByaXZhdGVWNEFkZHJlc3MgPSBleHBvcnRzLnVwZ3JhZGVTb2NrZXQgPSBleHBvcnRzLmRlc2NyaWJlQWRkcmVzcyA9IGV4cG9ydHMuZGVzY3JpYmVUTFMgPSB2b2lkIDA7XG5jb25zdCB0bHNfMSA9IHJlcXVpcmUoXCJ0bHNcIik7XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZW5jcnlwdGlvbiBvbiBhIGdpdmVuIHNvY2tldCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gZGVzY3JpYmVUTFMoc29ja2V0KSB7XG4gICAgaWYgKHNvY2tldCBpbnN0YW5jZW9mIHRsc18xLlRMU1NvY2tldCkge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNvY2tldC5nZXRQcm90b2NvbCgpO1xuICAgICAgICByZXR1cm4gcHJvdG9jb2wgPyBwcm90b2NvbCA6IFwiU2VydmVyIHNvY2tldCBvciBkaXNjb25uZWN0ZWQgY2xpZW50IHNvY2tldFwiO1xuICAgIH1cbiAgICByZXR1cm4gXCJObyBlbmNyeXB0aW9uXCI7XG59XG5leHBvcnRzLmRlc2NyaWJlVExTID0gZGVzY3JpYmVUTFM7XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcmVtb3RlIGFkZHJlc3Mgb2YgYSBzb2NrZXQuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQWRkcmVzcyhzb2NrZXQpIHtcbiAgICBpZiAoc29ja2V0LnJlbW90ZUZhbWlseSA9PT0gXCJJUHY2XCIpIHtcbiAgICAgICAgcmV0dXJuIGBbJHtzb2NrZXQucmVtb3RlQWRkcmVzc31dOiR7c29ja2V0LnJlbW90ZVBvcnR9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3NvY2tldC5yZW1vdGVBZGRyZXNzfToke3NvY2tldC5yZW1vdGVQb3J0fWA7XG59XG5leHBvcnRzLmRlc2NyaWJlQWRkcmVzcyA9IGRlc2NyaWJlQWRkcmVzcztcbi8qKlxuICogVXBncmFkZSBhIHNvY2tldCBjb25uZWN0aW9uIHdpdGggVExTLlxuICovXG5mdW5jdGlvbiB1cGdyYWRlU29ja2V0KHNvY2tldCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHRsc09wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICBzb2NrZXRcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHRsc1NvY2tldCA9ICgwLCB0bHNfMS5jb25uZWN0KSh0bHNPcHRpb25zLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RDZXJ0aWZpY2F0ZSA9IHRsc09wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkICE9PSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChleHBlY3RDZXJ0aWZpY2F0ZSAmJiAhdGxzU29ja2V0LmF1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgICAgICByZWplY3QodGxzU29ja2V0LmF1dGhvcml6YXRpb25FcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZXJyb3IgbGlzdGVuZXIgYWRkZWQgYmVsb3cuXG4gICAgICAgICAgICAgICAgdGxzU29ja2V0LnJlbW92ZUFsbExpc3RlbmVycyhcImVycm9yXCIpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGxzU29ja2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkub25jZShcImVycm9yXCIsIGVycm9yID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy51cGdyYWRlU29ja2V0ID0gdXBncmFkZVNvY2tldDtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFuIElQIGlzIGEgcHJpdmF0ZSBhZGRyZXNzIGFjY29yZGluZyB0byBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTkxOCNzZWN0aW9uLTMuXG4gKiBUaGlzIHdpbGwgaGFuZGxlIElQdjQtbWFwcGVkIElQdjYgYWRkcmVzc2VzIGNvcnJlY3RseSBidXQgcmV0dXJuIGZhbHNlIGZvciBhbGwgb3RoZXIgSVB2NiBhZGRyZXNzZXMuXG4gKlxuICogQHBhcmFtIGlwICBUaGUgSVAgYXMgYSBzdHJpbmcsIGUuZy4gXCIxOTIuMTY4LjAuMVwiXG4gKi9cbmZ1bmN0aW9uIGlwSXNQcml2YXRlVjRBZGRyZXNzKGlwID0gXCJcIikge1xuICAgIC8vIEhhbmRsZSBJUHY0LW1hcHBlZCBJUHY2IGFkZHJlc3NlcyBsaWtlIDo6ZmZmZjoxOTIuMTY4LjAuMVxuICAgIGlmIChpcC5zdGFydHNXaXRoKFwiOjpmZmZmOlwiKSkge1xuICAgICAgICBpcCA9IGlwLnN1YnN0cig3KTsgLy8gU3RyaXAgOjpmZmZmOiBwcmVmaXhcbiAgICB9XG4gICAgY29uc3Qgb2N0ZXRzID0gaXAuc3BsaXQoXCIuXCIpLm1hcChvID0+IHBhcnNlSW50KG8sIDEwKSk7XG4gICAgcmV0dXJuIG9jdGV0c1swXSA9PT0gMTAgLy8gMTAuMC4wLjAgLSAxMC4yNTUuMjU1LjI1NVxuICAgICAgICB8fCAob2N0ZXRzWzBdID09PSAxNzIgJiYgb2N0ZXRzWzFdID49IDE2ICYmIG9jdGV0c1sxXSA8PSAzMSkgLy8gMTcyLjE2LjAuMCAtIDE3Mi4zMS4yNTUuMjU1XG4gICAgICAgIHx8IChvY3RldHNbMF0gPT09IDE5MiAmJiBvY3RldHNbMV0gPT09IDE2OCkgLy8gMTkyLjE2OC4wLjAgLSAxOTIuMTY4LjI1NS4yNTVcbiAgICAgICAgfHwgaXAgPT09IFwiMTI3LjAuMC4xXCI7XG59XG5leHBvcnRzLmlwSXNQcml2YXRlVjRBZGRyZXNzID0gaXBJc1ByaXZhdGVWNEFkZHJlc3M7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucG9zaXRpdmVJbnRlcm1lZGlhdGUgPSBleHBvcnRzLnBvc2l0aXZlQ29tcGxldGlvbiA9IGV4cG9ydHMuaXNNdWx0aWxpbmUgPSBleHBvcnRzLmlzU2luZ2xlTGluZSA9IGV4cG9ydHMucGFyc2VDb250cm9sUmVzcG9uc2UgPSB2b2lkIDA7XG5jb25zdCBMRiA9IFwiXFxuXCI7XG4vKipcbiAqIFBhcnNlIGFuIEZUUCBjb250cm9sIHJlc3BvbnNlIGFzIGEgY29sbGVjdGlvbiBvZiBtZXNzYWdlcy4gQSBtZXNzYWdlIGlzIGEgY29tcGxldGVcbiAqIHNpbmdsZS0gb3IgbXVsdGlsaW5lIHJlc3BvbnNlLiBBIHJlc3BvbnNlIGNhbiBhbHNvIGNvbnRhaW4gbXVsdGlwbGUgbXVsdGlsaW5lIHJlc3BvbnNlc1xuICogdGhhdCB3aWxsIGVhY2ggYmUgcmVwcmVzZW50ZWQgYnkgYSBtZXNzYWdlLiBBIHJlc3BvbnNlIGNhbiBhbHNvIGJlIGluY29tcGxldGVcbiAqIGFuZCBiZSBjb21wbGV0ZWQgb24gdGhlIG5leHQgaW5jb21pbmcgZGF0YSBjaHVuayBmb3Igd2hpY2ggY2FzZSB0aGlzIGZ1bmN0aW9uIGFsc29cbiAqIGRlc2NyaWJlcyBhIGByZXN0YC4gVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbGwgQ1JMRiB0byBMRi5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb250cm9sUmVzcG9uc2UodGV4dCkge1xuICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgvXFxyP1xcbi8pLmZpbHRlcihpc05vdEJsYW5rKTtcbiAgICBjb25zdCBtZXNzYWdlcyA9IFtdO1xuICAgIGxldCBzdGFydEF0ID0gMDtcbiAgICBsZXQgdG9rZW5SZWdleDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgLy8gTm8gZ3JvdXAgaGFzIGJlZW4gb3BlbmVkLlxuICAgICAgICBpZiAoIXRva2VuUmVnZXgpIHtcbiAgICAgICAgICAgIGlmIChpc011bHRpbGluZShsaW5lKSkge1xuICAgICAgICAgICAgICAgIC8vIE9wZW4gYSBncm91cCBieSBzZXR0aW5nIGFuIGV4cGVjdGVkIHRva2VuLlxuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gbGluZS5zdWJzdHIoMCwgMyk7XG4gICAgICAgICAgICAgICAgdG9rZW5SZWdleCA9IG5ldyBSZWdFeHAoYF4ke3Rva2VufSg/OiR8IClgKTtcbiAgICAgICAgICAgICAgICBzdGFydEF0ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzU2luZ2xlTGluZShsaW5lKSkge1xuICAgICAgICAgICAgICAgIC8vIFNpbmdsZSBsaW5lcyBjYW4gYmUgZ3JvdXBlZCBpbW1lZGlhdGVseS5cbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEdyb3VwIGhhcyBiZWVuIG9wZW5lZCwgZXhwZWN0IGNsb3NpbmcgdG9rZW4uXG4gICAgICAgIGVsc2UgaWYgKHRva2VuUmVnZXgudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgdG9rZW5SZWdleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2gobGluZXMuc2xpY2Uoc3RhcnRBdCwgaSArIDEpLmpvaW4oTEYpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUaGUgbGFzdCBncm91cCBtaWdodCBub3QgaGF2ZSBiZWVuIGNsb3NlZCwgcmVwb3J0IGl0IGFzIGEgcmVzdC5cbiAgICBjb25zdCByZXN0ID0gdG9rZW5SZWdleCA/IGxpbmVzLnNsaWNlKHN0YXJ0QXQpLmpvaW4oTEYpICsgTEYgOiBcIlwiO1xuICAgIHJldHVybiB7IG1lc3NhZ2VzLCByZXN0IH07XG59XG5leHBvcnRzLnBhcnNlQ29udHJvbFJlc3BvbnNlID0gcGFyc2VDb250cm9sUmVzcG9uc2U7XG5mdW5jdGlvbiBpc1NpbmdsZUxpbmUobGluZSkge1xuICAgIHJldHVybiAvXlxcZFxcZFxcZCg/OiR8ICkvLnRlc3QobGluZSk7XG59XG5leHBvcnRzLmlzU2luZ2xlTGluZSA9IGlzU2luZ2xlTGluZTtcbmZ1bmN0aW9uIGlzTXVsdGlsaW5lKGxpbmUpIHtcbiAgICByZXR1cm4gL15cXGRcXGRcXGQtLy50ZXN0KGxpbmUpO1xufVxuZXhwb3J0cy5pc011bHRpbGluZSA9IGlzTXVsdGlsaW5lO1xuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiBhbiBGVFAgcmV0dXJuIGNvZGUgZGVzY3JpYmVzIGEgcG9zaXRpdmUgY29tcGxldGlvbi5cbiAqL1xuZnVuY3Rpb24gcG9zaXRpdmVDb21wbGV0aW9uKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA+PSAyMDAgJiYgY29kZSA8IDMwMDtcbn1cbmV4cG9ydHMucG9zaXRpdmVDb21wbGV0aW9uID0gcG9zaXRpdmVDb21wbGV0aW9uO1xuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiBhbiBGVFAgcmV0dXJuIGNvZGUgZGVzY3JpYmVzIGEgcG9zaXRpdmUgaW50ZXJtZWRpYXRlIHJlc3BvbnNlLlxuICovXG5mdW5jdGlvbiBwb3NpdGl2ZUludGVybWVkaWF0ZShjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPj0gMzAwICYmIGNvZGUgPCA0MDA7XG59XG5leHBvcnRzLnBvc2l0aXZlSW50ZXJtZWRpYXRlID0gcG9zaXRpdmVJbnRlcm1lZGlhdGU7XG5mdW5jdGlvbiBpc05vdEJsYW5rKHN0cikge1xuICAgIHJldHVybiBzdHIudHJpbSgpICE9PSBcIlwiO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGFyc2VMaXN0ID0gdm9pZCAwO1xuY29uc3QgZG9zUGFyc2VyID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3BhcnNlTGlzdERPU1wiKSk7XG5jb25zdCB1bml4UGFyc2VyID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3BhcnNlTGlzdFVuaXhcIikpO1xuY29uc3QgbWxzZFBhcnNlciA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wYXJzZUxpc3RNTFNEXCIpKTtcbi8qKlxuICogQXZhaWxhYmxlIGRpcmVjdG9yeSBsaXN0aW5nIHBhcnNlcnMuIFRoZXNlIGFyZSBjYW5kaWRhdGVzIHRoYXQgd2lsbCBiZSB0ZXN0ZWRcbiAqIGluIHRoZSBvcmRlciBwcmVzZW50ZWQuIFRoZSBmaXJzdCBjYW5kaWRhdGUgd2lsbCBiZSB1c2VkIHRvIHBhcnNlIHRoZSB3aG9sZSBsaXN0LlxuICovXG5jb25zdCBhdmFpbGFibGVQYXJzZXJzID0gW1xuICAgIGRvc1BhcnNlcixcbiAgICB1bml4UGFyc2VyLFxuICAgIG1sc2RQYXJzZXIgLy8gS2VlcCBNTFNEIGxhc3QsIG1heSBhY2NlcHQgZmlsZW5hbWUgb25seVxuXTtcbmZ1bmN0aW9uIGZpcnN0Q29tcGF0aWJsZVBhcnNlcihsaW5lLCBwYXJzZXJzKSB7XG4gICAgcmV0dXJuIHBhcnNlcnMuZmluZChwYXJzZXIgPT4gcGFyc2VyLnRlc3RMaW5lKGxpbmUpID09PSB0cnVlKTtcbn1cbmZ1bmN0aW9uIGlzTm90Qmxhbmsoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci50cmltKCkgIT09IFwiXCI7XG59XG5mdW5jdGlvbiBpc05vdE1ldGEoc3RyKSB7XG4gICAgcmV0dXJuICFzdHIuc3RhcnRzV2l0aChcInRvdGFsXCIpO1xufVxuY29uc3QgUkVHRVhfTkVXTElORSA9IC9cXHI/XFxuLztcbi8qKlxuICogUGFyc2UgcmF3IGRpcmVjdG9yeSBsaXN0aW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZUxpc3QocmF3TGlzdCkge1xuICAgIGNvbnN0IGxpbmVzID0gcmF3TGlzdFxuICAgICAgICAuc3BsaXQoUkVHRVhfTkVXTElORSlcbiAgICAgICAgLmZpbHRlcihpc05vdEJsYW5rKVxuICAgICAgICAuZmlsdGVyKGlzTm90TWV0YSk7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHRlc3RMaW5lID0gbGluZXNbbGluZXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgcGFyc2VyID0gZmlyc3RDb21wYXRpYmxlUGFyc2VyKHRlc3RMaW5lLCBhdmFpbGFibGVQYXJzZXJzKTtcbiAgICBpZiAoIXBhcnNlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGxpYnJhcnkgb25seSBzdXBwb3J0cyBNTFNELCBVbml4LSBvciBET1Mtc3R5bGUgZGlyZWN0b3J5IGxpc3RpbmcuIFlvdXIgRlRQIHNlcnZlciBzZWVtcyB0byBiZSB1c2luZyBhbm90aGVyIGZvcm1hdC4gWW91IGNhbiBzZWUgdGhlIHRyYW5zbWl0dGVkIGxpc3Rpbmcgd2hlbiBzZXR0aW5nIGBjbGllbnQuZnRwLnZlcmJvc2UgPSB0cnVlYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgYSBjdXN0b20gcGFyc2VyIHRvIGBjbGllbnQucGFyc2VMaXN0YCwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLlwiKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZXMgPSBsaW5lc1xuICAgICAgICAubWFwKHBhcnNlci5wYXJzZUxpbmUpXG4gICAgICAgIC5maWx0ZXIoKGluZm8pID0+IGluZm8gIT09IHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIHBhcnNlci50cmFuc2Zvcm1MaXN0KGZpbGVzKTtcbn1cbmV4cG9ydHMucGFyc2VMaXN0ID0gcGFyc2VMaXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnRyYW5zZm9ybUxpc3QgPSBleHBvcnRzLnBhcnNlTGluZSA9IGV4cG9ydHMudGVzdExpbmUgPSB2b2lkIDA7XG5jb25zdCBGaWxlSW5mb18xID0gcmVxdWlyZShcIi4vRmlsZUluZm9cIik7XG4vKipcbiAqIFRoaXMgcGFyc2VyIGlzIGJhc2VkIG9uIHRoZSBGVFAgY2xpZW50IGxpYnJhcnkgc291cmNlIGNvZGUgaW4gQXBhY2hlIENvbW1vbnMgTmV0IHByb3ZpZGVkXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlLiBJdCBoYXMgYmVlbiBzaW1wbGlmaWVkIGFuZCByZXdyaXR0ZW4gdG8gYmV0dGVyIGZpdCB0aGUgSmF2YXNjcmlwdCBsYW5ndWFnZS5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvbW1vbnMtbmV0L2Jsb2IvbWFzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL25ldC9mdHAvcGFyc2VyL05URlRQRW50cnlQYXJzZXIuamF2YVxuICovXG5jb25zdCBSRV9MSU5FID0gbmV3IFJlZ0V4cChcIihcXFxcUyspXFxcXHMrKFxcXFxTKylcXFxccytcIiAvLyBNTS1kZC15eSB3aGl0ZXNwYWNlIGhoOm1tYXxrazptbSBzd2FsbG93IHRyYWlsaW5nIHNwYWNlc1xuICAgICsgXCIoPzooPERJUj4pfChbMC05XSspKVxcXFxzK1wiIC8vIDxESVI+IG9yIGRkZGRkIHN3YWxsb3cgdHJhaWxpbmcgc3BhY2VzXG4gICAgKyBcIihcXFxcUy4qKVwiIC8vIEZpcnN0IG5vbi1zcGFjZSBmb2xsb3dlZCBieSByZXN0IG9mIGxpbmUgKG5hbWUpXG4pO1xuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBnaXZlbiBsaW5lIG1pZ2h0IGJlIGEgRE9TLXN0eWxlIGxpc3RpbmcuXG4gKlxuICogLSBFeGFtcGxlOiBgMTItMDUtOTYgIDA1OjAzUE0gICAgICAgPERJUj4gICAgICAgICAgbXlEaXJgXG4gKi9cbmZ1bmN0aW9uIHRlc3RMaW5lKGxpbmUpIHtcbiAgICByZXR1cm4gL15cXGR7Mn0vLnRlc3QobGluZSkgJiYgUkVfTElORS50ZXN0KGxpbmUpO1xufVxuZXhwb3J0cy50ZXN0TGluZSA9IHRlc3RMaW5lO1xuLyoqXG4gKiBQYXJzZSBhIHNpbmdsZSBsaW5lIG9mIGEgRE9TLXN0eWxlIGRpcmVjdG9yeSBsaXN0aW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZUxpbmUobGluZSkge1xuICAgIGNvbnN0IGdyb3VwcyA9IGxpbmUubWF0Y2goUkVfTElORSk7XG4gICAgaWYgKGdyb3VwcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gZ3JvdXBzWzVdO1xuICAgIGlmIChuYW1lID09PSBcIi5cIiB8fCBuYW1lID09PSBcIi4uXCIpIHsgLy8gSWdub3JlIHBhcmVudCBkaXJlY3RvcnkgbGlua3NcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlSW5mb18xLkZpbGVJbmZvKG5hbWUpO1xuICAgIGNvbnN0IGZpbGVUeXBlID0gZ3JvdXBzWzNdO1xuICAgIGlmIChmaWxlVHlwZSA9PT0gXCI8RElSPlwiKSB7XG4gICAgICAgIGZpbGUudHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuRGlyZWN0b3J5O1xuICAgICAgICBmaWxlLnNpemUgPSAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZmlsZS50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5GaWxlO1xuICAgICAgICBmaWxlLnNpemUgPSBwYXJzZUludChncm91cHNbNF0sIDEwKTtcbiAgICB9XG4gICAgZmlsZS5yYXdNb2RpZmllZEF0ID0gZ3JvdXBzWzFdICsgXCIgXCIgKyBncm91cHNbMl07XG4gICAgcmV0dXJuIGZpbGU7XG59XG5leHBvcnRzLnBhcnNlTGluZSA9IHBhcnNlTGluZTtcbmZ1bmN0aW9uIHRyYW5zZm9ybUxpc3QoZmlsZXMpIHtcbiAgICByZXR1cm4gZmlsZXM7XG59XG5leHBvcnRzLnRyYW5zZm9ybUxpc3QgPSB0cmFuc2Zvcm1MaXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlTUxTeERhdGUgPSBleHBvcnRzLnRyYW5zZm9ybUxpc3QgPSBleHBvcnRzLnBhcnNlTGluZSA9IGV4cG9ydHMudGVzdExpbmUgPSB2b2lkIDA7XG5jb25zdCBGaWxlSW5mb18xID0gcmVxdWlyZShcIi4vRmlsZUluZm9cIik7XG5mdW5jdGlvbiBwYXJzZVNpemUodmFsdWUsIGluZm8pIHtcbiAgICBpbmZvLnNpemUgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xufVxuLyoqXG4gKiBQYXJzZXJzIGZvciBNTFNEIGZhY3RzLlxuICovXG5jb25zdCBmYWN0SGFuZGxlcnNCeU5hbWUgPSB7XG4gICAgXCJzaXplXCI6IHBhcnNlU2l6ZSwgLy8gRmlsZSBzaXplXG4gICAgXCJzaXpkXCI6IHBhcnNlU2l6ZSwgLy8gRGlyZWN0b3J5IHNpemVcbiAgICBcInVuaXF1ZVwiOiAodmFsdWUsIGluZm8pID0+IHtcbiAgICAgICAgaW5mby51bmlxdWVJRCA9IHZhbHVlO1xuICAgIH0sXG4gICAgXCJtb2RpZnlcIjogKHZhbHVlLCBpbmZvKSA9PiB7XG4gICAgICAgIGluZm8ubW9kaWZpZWRBdCA9IHBhcnNlTUxTeERhdGUodmFsdWUpO1xuICAgICAgICBpbmZvLnJhd01vZGlmaWVkQXQgPSBpbmZvLm1vZGlmaWVkQXQudG9JU09TdHJpbmcoKTtcbiAgICB9LFxuICAgIFwidHlwZVwiOiAodmFsdWUsIGluZm8pID0+IHtcbiAgICAgICAgLy8gVGhlcmUgc2VlbXMgdG8gYmUgY29uZnVzaW9uIG9uIGhvdyB0byBoYW5kbGUgc3ltYm9saWMgbGlua3MgZm9yIFVuaXguIFJGQyAzNjU5IGRvZXNuJ3QgZGVzY3JpYmVcbiAgICAgICAgLy8gdGhpcyBidXQgbWVudGlvbnMgc29tZSBleGFtcGxlcyB1c2luZyB0aGUgc3ludGF4IGB0eXBlPU9TLnVuaXg9c2xpbms6PHRhcmdldD5gLiBCdXQgYWNjb3JkaW5nIHRvXG4gICAgICAgIC8vIGFuIGVudHJ5IGluIHRoZSBFcnJhdGEgKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL2VycmF0YS9laWQxNTAwKSB0aGlzIHN5bnRheCBjYW4ndCBiZSB2YWxpZC5cbiAgICAgICAgLy8gSW5zdGVhZCBpdCBwcm9wb3NlcyB0byB1c2UgYHR5cGU9T1MudW5peD1zeW1saW5rYCBhbmQgdG8gdGhlbiBsaXN0IHRoZSBhY3R1YWwgdGFyZ2V0IG9mIHRoZVxuICAgICAgICAvLyBzeW1ib2xpYyBsaW5rIGFzIGFub3RoZXIgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSBsaXN0aW5nLiBUaGUgdW5pcXVlIGlkZW50aWZpZXJzIGNhbiB0aGVuIGJlIHVzZWRcbiAgICAgICAgLy8gdG8gZGVyaXZlIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gbGluayhzKSBhbmQgdGFyZ2V0LiBXZSdsbCBoYXZlIHRvIGhhbmRsZSBib3RoIGNhc2VzIGFzIHRoZXJlXG4gICAgICAgIC8vIGFyZSBkaWZmZXJpbmcgb3BpbmlvbnMgb24gaG93IHRvIGRlYWwgd2l0aCB0aGlzLiBIZXJlIGFyZSBzb21lIGxpbmtzIG9uIHRoaXMgdG9waWM6XG4gICAgICAgIC8vIC0gUHJvRlRQRCBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9mdHBkL3Byb2Z0cGQvYmxvYi81NmU2ZGZhNTk4Y2JkNGVmNWM2Y2JhNDM5YmNiY2Q1M2E2M2UzYjIxL21vZHVsZXMvbW9kX2ZhY3RzLmMjTDUzMVxuICAgICAgICAvLyAtIFByb0ZUUEQgYnVnOiBodHRwOi8vYnVncy5wcm9mdHBkLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzMxOFxuICAgICAgICAvLyAtIFByb0ZUUEQgc3RhdGVtZW50OiBodHRwOi8vd3d3LnByb2Z0cGQub3JnL2RvY3MvbW9kdWxlcy9tb2RfZmFjdHMuaHRtbFxuICAgICAgICAvLyDigJMgRmlsZVppbGxhIGJ1ZzogaHR0cHM6Ly90cmFjLmZpbGV6aWxsYS1wcm9qZWN0Lm9yZy90aWNrZXQvOTMxMFxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcIk9TLnVuaXg9c2xpbmtcIikpIHtcbiAgICAgICAgICAgIGluZm8udHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuU3ltYm9saWNMaW5rO1xuICAgICAgICAgICAgaW5mby5saW5rID0gdmFsdWUuc3Vic3RyKHZhbHVlLmluZGV4T2YoXCI6XCIpICsgMSk7XG4gICAgICAgICAgICByZXR1cm4gMSAvKiBGYWN0SGFuZGxlclJlc3VsdC5Db250aW51ZSAqLztcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgICAgICAgICAgIGluZm8udHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuRmlsZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkaXJcIjpcbiAgICAgICAgICAgICAgICBpbmZvLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLkRpcmVjdG9yeTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJPUy51bml4PXN5bWxpbmtcIjpcbiAgICAgICAgICAgICAgICBpbmZvLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLlN5bWJvbGljTGluaztcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG9mIHRoZSBzeW1ib2xpYyBsaW5rIG1pZ2h0IGJlIGRlZmluZWQgaW4gYW5vdGhlciBsaW5lIGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZy5cbiAgICAgICAgICAgICAgICAvLyBXZSdsbCBoYW5kbGUgdGhpcyBpbiBgdHJhbnNmb3JtTGlzdCgpYCBiZWxvdy5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjZGlyXCI6IC8vIEN1cnJlbnQgZGlyZWN0b3J5IGJlaW5nIGxpc3RlZFxuICAgICAgICAgICAgY2FzZSBcInBkaXJcIjogLy8gUGFyZW50IGRpcmVjdG9yeVxuICAgICAgICAgICAgICAgIHJldHVybiAyIC8qIEZhY3RIYW5kbGVyUmVzdWx0Lklnbm9yZUZpbGUgKi87IC8vIERvbid0IGluY2x1ZGUgdGhlc2UgZW50cmllcyBpbiB0aGUgbGlzdGluZ1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpbmZvLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLlVua25vd247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDEgLyogRmFjdEhhbmRsZXJSZXN1bHQuQ29udGludWUgKi87XG4gICAgfSxcbiAgICBcInVuaXgubW9kZVwiOiAodmFsdWUsIGluZm8pID0+IHtcbiAgICAgICAgY29uc3QgZGlnaXRzID0gdmFsdWUuc3Vic3RyKC0zKTtcbiAgICAgICAgaW5mby5wZXJtaXNzaW9ucyA9IHtcbiAgICAgICAgICAgIHVzZXI6IHBhcnNlSW50KGRpZ2l0c1swXSwgMTApLFxuICAgICAgICAgICAgZ3JvdXA6IHBhcnNlSW50KGRpZ2l0c1sxXSwgMTApLFxuICAgICAgICAgICAgd29ybGQ6IHBhcnNlSW50KGRpZ2l0c1syXSwgMTApXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBcInVuaXgub3duZXJuYW1lXCI6ICh2YWx1ZSwgaW5mbykgPT4ge1xuICAgICAgICBpbmZvLnVzZXIgPSB2YWx1ZTtcbiAgICB9LFxuICAgIFwidW5peC5vd25lclwiOiAodmFsdWUsIGluZm8pID0+IHtcbiAgICAgICAgaWYgKGluZm8udXNlciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgaW5mby51c2VyID0gdmFsdWU7XG4gICAgfSxcbiAgICBnZXQgXCJ1bml4LnVpZFwiKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tcInVuaXgub3duZXJcIl07XG4gICAgfSxcbiAgICBcInVuaXguZ3JvdXBuYW1lXCI6ICh2YWx1ZSwgaW5mbykgPT4ge1xuICAgICAgICBpbmZvLmdyb3VwID0gdmFsdWU7XG4gICAgfSxcbiAgICBcInVuaXguZ3JvdXBcIjogKHZhbHVlLCBpbmZvKSA9PiB7XG4gICAgICAgIGlmIChpbmZvLmdyb3VwID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBpbmZvLmdyb3VwID0gdmFsdWU7XG4gICAgfSxcbiAgICBnZXQgXCJ1bml4LmdpZFwiKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tcInVuaXguZ3JvdXBcIl07XG4gICAgfVxuICAgIC8vIFJlZ2FyZGluZyB0aGUgZmFjdCBcInBlcm1cIjpcbiAgICAvLyBXZSBkb24ndCBoYW5kbGUgcGVybWlzc2lvbiBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gXCJwZXJtXCIgYmVjYXVzZSBpdHMgaW5mb3JtYXRpb24gaXMgY29uY2VwdHVhbGx5XG4gICAgLy8gZGlmZmVyZW50IGZyb20gd2hhdCB1c2VycyBvZiBGVFAgY2xpZW50cyB1c3VhbGx5IGFzc29jaWF0ZSB3aXRoIFwicGVybWlzc2lvbnNcIi4gVGhvc2UgdGhhdCBoYXZlXG4gICAgLy8gc29tZSBleHBlY3RhdGlvbnMgKGFuZCBwcm9iYWJseSB3YW50IHRvIGVkaXQgdGhlbSB3aXRoIGEgU0lURSBjb21tYW5kKSBvZnRlbiB1bmtub3dpbmdseSBleHBlY3RcbiAgICAvLyB0aGUgVW5peCBwZXJtaXNzaW9uIHN5c3RlbS4gVGhlIGluZm9ybWF0aW9uIHBhc3NlZCBieSBcInBlcm1cIiBkZXNjcmliZXMgd2hhdCBGVFAgY29tbWFuZHMgY2FuIGJlXG4gICAgLy8gZXhlY3V0ZWQgd2l0aCBhIGZpbGUvZGlyZWN0b3J5LiBCdXQgZXZlbiB0aGlzIGNhbiBiZSBlaXRoZXIgaW5jb21wbGV0ZSBvciBqdXN0IG1lYW50IGFzIGEgXCJndWlkZVwiXG4gICAgLy8gYXMgdGhlIHNwZWMgbWVudGlvbnMuIEZyb20gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM2NTkjc2VjdGlvbi03LjUuNTogXCJUaGUgcGVybWlzc2lvbnMgYXJlXG4gICAgLy8gZGVzY3JpYmVkIGhlcmUgYXMgdGhleSBhcHBseSB0byBGVFAgY29tbWFuZHMuIFRoZXkgbWF5IG5vdCBtYXAgZWFzaWx5IGludG8gcGFydGljdWxhciBwZXJtaXNzaW9uc1xuICAgIC8vIGF2YWlsYWJsZSBvbiB0aGUgc2VydmVyJ3Mgb3BlcmF0aW5nIHN5c3RlbS5cIiBUaGUgcGFyc2VyIGJ5IEFwYWNoZSBDb21tb25zIHRyaWVzIHRvIHRyYW5zbGF0ZSB0aGVzZVxuICAgIC8vIHRvIFVuaXggcGVybWlzc2lvbnMg4oCTIHRoaXMgaXMgbWlzbGVhZGluZyB1c2VycyBhbmQgbWlnaHQgbm90IGV2ZW4gYmUgY29ycmVjdC5cbn07XG4vKipcbiAqIFNwbGl0IGEgc3RyaW5nIG9uY2UgYXQgdGhlIGZpcnN0IHBvc2l0aW9uIG9mIGEgZGVsaW1pdGVyLiBGb3IgZXhhbXBsZVxuICogYHNwbGl0U3RyaW5nT25jZShcImEgYiBjIGRcIiwgXCIgXCIpYCByZXR1cm5zIGBbXCJhXCIsIFwiYiBjIGRcIl1gLlxuICovXG5mdW5jdGlvbiBzcGxpdFN0cmluZ09uY2Uoc3RyLCBkZWxpbWl0ZXIpIHtcbiAgICBjb25zdCBwb3MgPSBzdHIuaW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgIGNvbnN0IGEgPSBzdHIuc3Vic3RyKDAsIHBvcyk7XG4gICAgY29uc3QgYiA9IHN0ci5zdWJzdHIocG9zICsgZGVsaW1pdGVyLmxlbmd0aCk7XG4gICAgcmV0dXJuIFthLCBiXTtcbn1cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgZ2l2ZW4gbGluZSBtaWdodCBiZSBwYXJ0IG9mIGFuIE1MU0QgbGlzdGluZy5cbiAqXG4gKiAtIEV4YW1wbGUgMTogYHNpemU9MTUyMjc7dHlwZT1kaXI7cGVybT1lbDttb2RpZnk9MjAxOTA0MTkwNjU3MzA7IHRlc3Qgb25lYFxuICogLSBFeGFtcGxlIDI6IGAgZmlsZSBuYW1lYCAobGVhZGluZyBzcGFjZSlcbiAqL1xuZnVuY3Rpb24gdGVzdExpbmUobGluZSkge1xuICAgIHJldHVybiAvXlxcUys9XFxTKzsvLnRlc3QobGluZSkgfHwgbGluZS5zdGFydHNXaXRoKFwiIFwiKTtcbn1cbmV4cG9ydHMudGVzdExpbmUgPSB0ZXN0TGluZTtcbi8qKlxuICogUGFyc2Ugc2luZ2xlIGxpbmUgYXMgTUxTRCBsaXN0aW5nLCBzZWUgc3BlY2lmaWNhdGlvbiBhdCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzY1OSNzZWN0aW9uLTcuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTGluZShsaW5lKSB7XG4gICAgY29uc3QgW3BhY2tlZEZhY3RzLCBuYW1lXSA9IHNwbGl0U3RyaW5nT25jZShsaW5lLCBcIiBcIik7XG4gICAgaWYgKG5hbWUgPT09IFwiXCIgfHwgbmFtZSA9PT0gXCIuXCIgfHwgbmFtZSA9PT0gXCIuLlwiKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGluZm8gPSBuZXcgRmlsZUluZm9fMS5GaWxlSW5mbyhuYW1lKTtcbiAgICBjb25zdCBmYWN0cyA9IHBhY2tlZEZhY3RzLnNwbGl0KFwiO1wiKTtcbiAgICBmb3IgKGNvbnN0IGZhY3Qgb2YgZmFjdHMpIHtcbiAgICAgICAgY29uc3QgW2ZhY3ROYW1lLCBmYWN0VmFsdWVdID0gc3BsaXRTdHJpbmdPbmNlKGZhY3QsIFwiPVwiKTtcbiAgICAgICAgaWYgKCFmYWN0VmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZhY3RIYW5kbGVyID0gZmFjdEhhbmRsZXJzQnlOYW1lW2ZhY3ROYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBpZiAoIWZhY3RIYW5kbGVyKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBmYWN0SGFuZGxlcihmYWN0VmFsdWUsIGluZm8pO1xuICAgICAgICBpZiAocmVzdWx0ID09PSAyIC8qIEZhY3RIYW5kbGVyUmVzdWx0Lklnbm9yZUZpbGUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG59XG5leHBvcnRzLnBhcnNlTGluZSA9IHBhcnNlTGluZTtcbmZ1bmN0aW9uIHRyYW5zZm9ybUxpc3QoZmlsZXMpIHtcbiAgICAvLyBDcmVhdGUgYSBtYXAgb2YgYWxsIGZpbGVzIHRoYXQgYXJlIG5vdCBzeW1ib2xpYyBsaW5rcyBieSB0aGVpciB1bmlxdWUgSURcbiAgICBjb25zdCBub25MaW5rc0J5SUQgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmICghZmlsZS5pc1N5bWJvbGljTGluayAmJiBmaWxlLnVuaXF1ZUlEICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5vbkxpbmtzQnlJRC5zZXQoZmlsZS51bmlxdWVJRCwgZmlsZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWRGaWxlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAvLyBUcnkgdG8gYXNzb2NpYXRlIHVucmVzb2x2ZWQgc3ltYm9saWMgbGlua3Mgd2l0aCBhIHRhcmdldCBmaWxlL2RpcmVjdG9yeS5cbiAgICAgICAgaWYgKGZpbGUuaXNTeW1ib2xpY0xpbmsgJiYgZmlsZS51bmlxdWVJRCAhPT0gdW5kZWZpbmVkICYmIGZpbGUubGluayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBub25MaW5rc0J5SUQuZ2V0KGZpbGUudW5pcXVlSUQpO1xuICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZmlsZS5saW5rID0gdGFyZ2V0Lm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHRhcmdldCBvZiBhIHN5bWJvbGljIGxpbmsgaXMgbGlzdGVkIGFzIGFuIGVudHJ5IGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZyBidXQgbWlnaHRcbiAgICAgICAgLy8gaGF2ZSBhIHBhdGggcG9pbnRpbmcgb3V0c2lkZSBvZiB0aGlzIGRpcmVjdG9yeS4gSW4gdGhhdCBjYXNlIHdlIGRvbid0IHdhbnQgdGhpcyBlbnRyeVxuICAgICAgICAvLyB0byBiZSBwYXJ0IG9mIHRoZSBsaXN0aW5nLiBXZSBnZW5lcmFsbHkgZG9uJ3Qgd2FudCB0aGVzZSBraW5kIG9mIGVudHJpZXMgYXQgYWxsLlxuICAgICAgICBjb25zdCBpc1BhcnRPZkRpcmVjdG9yeSA9ICFmaWxlLm5hbWUuaW5jbHVkZXMoXCIvXCIpO1xuICAgICAgICBpZiAoaXNQYXJ0T2ZEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgIHJlc29sdmVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzb2x2ZWRGaWxlcztcbn1cbmV4cG9ydHMudHJhbnNmb3JtTGlzdCA9IHRyYW5zZm9ybUxpc3Q7XG4vKipcbiAqIFBhcnNlIGRhdGUgYXMgc3BlY2lmaWVkIGluIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNjU5I3NlY3Rpb24tMi4zLlxuICpcbiAqIE1lc3NhZ2UgY29udGFpbnMgcmVzcG9uc2UgY29kZSBhbmQgbW9kaWZpZWQgdGltZSBpbiB0aGUgZm9ybWF0OiBZWVlZTU1EREhITU1TU1suc3NzXVxuICogRm9yIGV4YW1wbGUgYDE5OTkxMDA1MjEzMTAyYCBvciBgMTk5ODA2MTUxMDAwNDUuMDE0YC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VNTFN4RGF0ZShmYWN0KSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKCtmYWN0LnNsaWNlKDAsIDQpLCAvLyBZZWFyXG4gICAgK2ZhY3Quc2xpY2UoNCwgNikgLSAxLCAvLyBNb250aFxuICAgICtmYWN0LnNsaWNlKDYsIDgpLCAvLyBEYXRlXG4gICAgK2ZhY3Quc2xpY2UoOCwgMTApLCAvLyBIb3Vyc1xuICAgICtmYWN0LnNsaWNlKDEwLCAxMiksIC8vIE1pbnV0ZXNcbiAgICArZmFjdC5zbGljZSgxMiwgMTQpLCAvLyBTZWNvbmRzXG4gICAgK2ZhY3Quc2xpY2UoMTUsIDE4KSAvLyBNaWxsaXNlY29uZHNcbiAgICApKTtcbn1cbmV4cG9ydHMucGFyc2VNTFN4RGF0ZSA9IHBhcnNlTUxTeERhdGU7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudHJhbnNmb3JtTGlzdCA9IGV4cG9ydHMucGFyc2VMaW5lID0gZXhwb3J0cy50ZXN0TGluZSA9IHZvaWQgMDtcbmNvbnN0IEZpbGVJbmZvXzEgPSByZXF1aXJlKFwiLi9GaWxlSW5mb1wiKTtcbmNvbnN0IEpBX01PTlRIID0gXCJcXHU2NzA4XCI7XG5jb25zdCBKQV9EQVkgPSBcIlxcdTY1ZTVcIjtcbmNvbnN0IEpBX1lFQVIgPSBcIlxcdTVlNzRcIjtcbi8qKlxuICogVGhpcyBwYXJzZXIgaXMgYmFzZWQgb24gdGhlIEZUUCBjbGllbnQgbGlicmFyeSBzb3VyY2UgY29kZSBpbiBBcGFjaGUgQ29tbW9ucyBOZXQgcHJvdmlkZWRcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UuIEl0IGhhcyBiZWVuIHNpbXBsaWZpZWQgYW5kIHJld3JpdHRlbiB0byBiZXR0ZXIgZml0IHRoZSBKYXZhc2NyaXB0IGxhbmd1YWdlLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY29tbW9ucy1uZXQvYmxvYi9tYXN0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvbmV0L2Z0cC9wYXJzZXIvVW5peEZUUEVudHJ5UGFyc2VyLmphdmFcbiAqXG4gKiBCZWxvdyBpcyB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgYnkgdGhpcyBwYXJzZXIuXG4gKlxuICogUGVybWlzc2lvbnM6XG4gKiAgICByICAgdGhlIGZpbGUgaXMgcmVhZGFibGVcbiAqICAgIHcgICB0aGUgZmlsZSBpcyB3cml0YWJsZVxuICogICAgeCAgIHRoZSBmaWxlIGlzIGV4ZWN1dGFibGVcbiAqICAgIC0gICB0aGUgaW5kaWNhdGVkIHBlcm1pc3Npb24gaXMgbm90IGdyYW50ZWRcbiAqICAgIEwgICBtYW5kYXRvcnkgbG9ja2luZyBvY2N1cnMgZHVyaW5nIGFjY2VzcyAodGhlIHNldC1ncm91cC1JRCBiaXQgaXNcbiAqICAgICAgICBvbiBhbmQgdGhlIGdyb3VwIGV4ZWN1dGlvbiBiaXQgaXMgb2ZmKVxuICogICAgcyAgIHRoZSBzZXQtdXNlci1JRCBvciBzZXQtZ3JvdXAtSUQgYml0IGlzIG9uLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgICB1c2VyIG9yIGdyb3VwIGV4ZWN1dGlvbiBiaXQgaXMgYWxzbyBvblxuICogICAgUyAgIHVuZGVmaW5lZCBiaXQtc3RhdGUgKHRoZSBzZXQtdXNlci1JRCBiaXQgaXMgb24gYW5kIHRoZSB1c2VyXG4gKiAgICAgICAgZXhlY3V0aW9uIGJpdCBpcyBvZmYpXG4gKiAgICB0ICAgdGhlIDEwMDAgKG9jdGFsKSBiaXQsIG9yIHN0aWNreSBiaXQsIGlzIG9uIFtzZWUgY2htb2QoMSldLCBhbmRcbiAqICAgICAgICBleGVjdXRpb24gaXMgb25cbiAqICAgIFQgICB0aGUgMTAwMCBiaXQgaXMgdHVybmVkIG9uLCBhbmQgZXhlY3V0aW9uIGlzIG9mZiAodW5kZWZpbmVkIGJpdC1cbiAqICAgICAgICBzdGF0ZSlcbiAqICAgIGUgICB6L09TIGV4dGVybmFsIGxpbmsgYml0XG4gKiAgICBGaW5hbCBsZXR0ZXIgbWF5IGJlIGFwcGVuZGVkOlxuICogICAgKyAgIGZpbGUgaGFzIGV4dGVuZGVkIHNlY3VyaXR5IGF0dHJpYnV0ZXMgKGUuZy4gQUNMKVxuICogICAgTm90ZTogbG9jYWwgbGlzdGluZ3Mgb24gTWFjT1NYIGFsc28gdXNlICdAJ1xuICogICAgdGhpcyBpcyBub3QgYWxsb3dlZCBmb3IgaGVyZSBhcyBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgc2hvd24gYnkgRlRQIHNlcnZlcnNcbiAqICAgIHtAY29kZSBAfSAgIGZpbGUgaGFzIGV4dGVuZGVkIGF0dHJpYnV0ZXNcbiAqL1xuY29uc3QgUkVfTElORSA9IG5ldyBSZWdFeHAoXCIoW2JjZGVsZm1wU3MtXSlcIiAvLyBmaWxlIHR5cGVcbiAgICArIFwiKCgocnwtKSh3fC0pKFt4c1N0VEwtXSkpKChyfC0pKHd8LSkoW3hzU3RUTC1dKSkoKHJ8LSkod3wtKShbeHNTdFRMLV0/KSkpXFxcXCs/XCIgLy8gcGVybWlzc2lvbnNcbiAgICArIFwiXFxcXHMqXCIgLy8gc2VwYXJhdG9yIFRPRE8gd2h5IGFsbG93IGl0IHRvIGJlIG9taXR0ZWQ/P1xuICAgICsgXCIoXFxcXGQrKVwiIC8vIGxpbmsgY291bnRcbiAgICArIFwiXFxcXHMrXCIgLy8gc2VwYXJhdG9yXG4gICAgKyBcIig/OihcXFxcUysoPzpcXFxcc1xcXFxTKykqPylcXFxccyspP1wiIC8vIG93bmVyIG5hbWUgKG9wdGlvbmFsIHNwYWNlcylcbiAgICArIFwiKD86KFxcXFxTKyg/OlxcXFxzXFxcXFMrKSopXFxcXHMrKT9cIiAvLyBncm91cCBuYW1lIChvcHRpb25hbCBzcGFjZXMpXG4gICAgKyBcIihcXFxcZCsoPzosXFxcXHMqXFxcXGQrKT8pXCIgLy8gc2l6ZSBvciBuLG1cbiAgICArIFwiXFxcXHMrXCIgLy8gc2VwYXJhdG9yXG4gICAgLyoqXG4gICAgICogbnVtZXJpYyBvciBzdGFuZGFyZCBmb3JtYXQgZGF0ZTpcbiAgICAgKiAgIHl5eXktbW0tZGQgKGV4cGVjdGluZyBoaDptbSB0byBmb2xsb3cpXG4gICAgICogICBNTU0gW2RdZFxuICAgICAqICAgW2RdZCBNTU1cbiAgICAgKiAgIE4uQi4gdXNlIG5vbi1zcGFjZSBmb3IgTU1NIHRvIGFsbG93IGZvciBsYW5ndWFnZXMgc3VjaCBhcyBHZXJtYW4gd2hpY2ggdXNlXG4gICAgICogICBkaWFjcml0aWNzIChlLmcuIHVtbGF1dCkgaW4gc29tZSBhYmJyZXZpYXRpb25zLlxuICAgICAqICAgSmFwYW5lc2UgdXNlcyBudW1lcmljIGRheSBhbmQgbW9udGggd2l0aCBzdWZmaXhlcyB0byBkaXN0aW5ndWlzaCB0aGVtXG4gICAgICogICBbZF1kWFggW2RdZFpaXG4gICAgICovXG4gICAgKyBcIihcIiArXG4gICAgXCIoPzpcXFxcZCtbLS9dXFxcXGQrWy0vXVxcXFxkKylcIiArIC8vIHl5eXktbW0tZGRcbiAgICBcInwoPzpcXFxcU3szfVxcXFxzK1xcXFxkezEsMn0pXCIgKyAvLyBNTU0gW2RdZFxuICAgIFwifCg/OlxcXFxkezEsMn1cXFxccytcXFxcU3szfSlcIiArIC8vIFtkXWQgTU1NXG4gICAgXCJ8KD86XFxcXGR7MSwyfVwiICsgSkFfTU9OVEggKyBcIlxcXFxzK1xcXFxkezEsMn1cIiArIEpBX0RBWSArIFwiKVwiICtcbiAgICBcIilcIlxuICAgICsgXCJcXFxccytcIiAvLyBzZXBhcmF0b3JcbiAgICAvKipcbiAgICAgKiB5ZWFyIChmb3Igbm9uLXJlY2VudCBzdGFuZGFyZCBmb3JtYXQpIC0geXl5eVxuICAgICAqIG9yIHRpbWUgKGZvciBudW1lcmljIG9yIHJlY2VudCBzdGFuZGFyZCBmb3JtYXQpIFtoXWg6bW1cbiAgICAgKiBvciBKYXBhbmVzZSB5ZWFyIC0geXl5eVhYXG4gICAgICovXG4gICAgKyBcIigoPzpcXFxcZCsoPzo6XFxcXGQrKT8pfCg/OlxcXFxkezR9XCIgKyBKQV9ZRUFSICsgXCIpKVwiIC8vICgyMClcbiAgICArIFwiXFxcXHNcIiAvLyBzZXBhcmF0b3JcbiAgICArIFwiKC4qKVwiKTsgLy8gdGhlIHJlc3QgKDIxKVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBnaXZlbiBsaW5lIG1pZ2h0IGJlIGEgVW5peC1zdHlsZSBsaXN0aW5nLlxuICpcbiAqIC0gRXhhbXBsZTogYC1ydy1yLS1yLS0rICAgMSBwYXRyaWNrICBzdGFmZiAgIDEwNTcgRGVjIDExIDE0OjM1IHRlc3QudHh0YFxuICovXG5mdW5jdGlvbiB0ZXN0TGluZShsaW5lKSB7XG4gICAgcmV0dXJuIFJFX0xJTkUudGVzdChsaW5lKTtcbn1cbmV4cG9ydHMudGVzdExpbmUgPSB0ZXN0TGluZTtcbi8qKlxuICogUGFyc2UgYSBzaW5nbGUgbGluZSBvZiBhIFVuaXgtc3R5bGUgZGlyZWN0b3J5IGxpc3RpbmcuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTGluZShsaW5lKSB7XG4gICAgY29uc3QgZ3JvdXBzID0gbGluZS5tYXRjaChSRV9MSU5FKTtcbiAgICBpZiAoZ3JvdXBzID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBncm91cHNbMjFdO1xuICAgIGlmIChuYW1lID09PSBcIi5cIiB8fCBuYW1lID09PSBcIi4uXCIpIHsgLy8gSWdub3JlIHBhcmVudCBkaXJlY3RvcnkgbGlua3NcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlSW5mb18xLkZpbGVJbmZvKG5hbWUpO1xuICAgIGZpbGUuc2l6ZSA9IHBhcnNlSW50KGdyb3Vwc1sxOF0sIDEwKTtcbiAgICBmaWxlLnVzZXIgPSBncm91cHNbMTZdO1xuICAgIGZpbGUuZ3JvdXAgPSBncm91cHNbMTddO1xuICAgIGZpbGUuaGFyZExpbmtDb3VudCA9IHBhcnNlSW50KGdyb3Vwc1sxNV0sIDEwKTtcbiAgICBmaWxlLnJhd01vZGlmaWVkQXQgPSBncm91cHNbMTldICsgXCIgXCIgKyBncm91cHNbMjBdO1xuICAgIGZpbGUucGVybWlzc2lvbnMgPSB7XG4gICAgICAgIHVzZXI6IHBhcnNlTW9kZShncm91cHNbNF0sIGdyb3Vwc1s1XSwgZ3JvdXBzWzZdKSxcbiAgICAgICAgZ3JvdXA6IHBhcnNlTW9kZShncm91cHNbOF0sIGdyb3Vwc1s5XSwgZ3JvdXBzWzEwXSksXG4gICAgICAgIHdvcmxkOiBwYXJzZU1vZGUoZ3JvdXBzWzEyXSwgZ3JvdXBzWzEzXSwgZ3JvdXBzWzE0XSksXG4gICAgfTtcbiAgICAvLyBTZXQgZmlsZSB0eXBlXG4gICAgc3dpdGNoIChncm91cHNbMV0uY2hhckF0KDApKSB7XG4gICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgICBmaWxlLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLkRpcmVjdG9yeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZVwiOiAvLyBORVQtMzkgPT4gei9PUyBleHRlcm5hbCBsaW5rXG4gICAgICAgICAgICBmaWxlLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLlN5bWJvbGljTGluaztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibFwiOlxuICAgICAgICAgICAgZmlsZS50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5TeW1ib2xpY0xpbms7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImJcIjpcbiAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICAgIGZpbGUudHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuRmlsZTsgLy8gVE9ETyBjaGFuZ2UgdGhpcyBpZiBERVZJQ0VfVFlQRSBpbXBsZW1lbnRlZFxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgIGNhc2UgXCItXCI6XG4gICAgICAgICAgICBmaWxlLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLkZpbGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIEEgJ3doaXRlb3V0JyBmaWxlIGlzIGFuIEFSVElGSUNJQUwgZW50cnkgaW4gYW55IG9mIHNldmVyYWwgdHlwZXMgb2ZcbiAgICAgICAgICAgIC8vICd0cmFuc2x1Y2VudCcgZmlsZXN5c3RlbXMsIG9mIHdoaWNoIGEgJ3VuaW9uJyBmaWxlc3lzdGVtIGlzIG9uZS5cbiAgICAgICAgICAgIGZpbGUudHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuVW5rbm93bjtcbiAgICB9XG4gICAgLy8gU2VwYXJhdGUgb3V0IHRoZSBsaW5rIG5hbWUgZm9yIHN5bWJvbGljIGxpbmtzXG4gICAgaWYgKGZpbGUuaXNTeW1ib2xpY0xpbmspIHtcbiAgICAgICAgY29uc3QgZW5kID0gbmFtZS5pbmRleE9mKFwiIC0+IFwiKTtcbiAgICAgICAgaWYgKGVuZCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGZpbGUubmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGVuZCk7XG4gICAgICAgICAgICBmaWxlLmxpbmsgPSBuYW1lLnN1YnN0cmluZyhlbmQgKyA0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmlsZTtcbn1cbmV4cG9ydHMucGFyc2VMaW5lID0gcGFyc2VMaW5lO1xuZnVuY3Rpb24gdHJhbnNmb3JtTGlzdChmaWxlcykge1xuICAgIHJldHVybiBmaWxlcztcbn1cbmV4cG9ydHMudHJhbnNmb3JtTGlzdCA9IHRyYW5zZm9ybUxpc3Q7XG5mdW5jdGlvbiBwYXJzZU1vZGUociwgdywgeCkge1xuICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgaWYgKHIgIT09IFwiLVwiKSB7XG4gICAgICAgIHZhbHVlICs9IEZpbGVJbmZvXzEuRmlsZUluZm8uVW5peFBlcm1pc3Npb24uUmVhZDtcbiAgICB9XG4gICAgaWYgKHcgIT09IFwiLVwiKSB7XG4gICAgICAgIHZhbHVlICs9IEZpbGVJbmZvXzEuRmlsZUluZm8uVW5peFBlcm1pc3Npb24uV3JpdGU7XG4gICAgfVxuICAgIGNvbnN0IGV4ZWNUb2tlbiA9IHguY2hhckF0KDApO1xuICAgIGlmIChleGVjVG9rZW4gIT09IFwiLVwiICYmIGV4ZWNUb2tlbi50b1VwcGVyQ2FzZSgpICE9PSBleGVjVG9rZW4pIHtcbiAgICAgICAgdmFsdWUgKz0gRmlsZUluZm9fMS5GaWxlSW5mby5Vbml4UGVybWlzc2lvbi5FeGVjdXRlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZG93bmxvYWRUbyA9IGV4cG9ydHMudXBsb2FkRnJvbSA9IGV4cG9ydHMuY29ubmVjdEZvclBhc3NpdmVUcmFuc2ZlciA9IGV4cG9ydHMucGFyc2VQYXN2UmVzcG9uc2UgPSBleHBvcnRzLmVudGVyUGFzc2l2ZU1vZGVJUHY0ID0gZXhwb3J0cy5wYXJzZUVwc3ZSZXNwb25zZSA9IGV4cG9ydHMuZW50ZXJQYXNzaXZlTW9kZUlQdjYgPSB2b2lkIDA7XG5jb25zdCBuZXRVdGlsc18xID0gcmVxdWlyZShcIi4vbmV0VXRpbHNcIik7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jb25zdCB0bHNfMSA9IHJlcXVpcmUoXCJ0bHNcIik7XG5jb25zdCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xID0gcmVxdWlyZShcIi4vcGFyc2VDb250cm9sUmVzcG9uc2VcIik7XG4vKipcbiAqIFByZXBhcmUgYSBkYXRhIHNvY2tldCB1c2luZyBwYXNzaXZlIG1vZGUgb3ZlciBJUHY2LlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnRlclBhc3NpdmVNb2RlSVB2NihmdHApIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmdHAucmVxdWVzdChcIkVQU1ZcIik7XG4gICAgY29uc3QgcG9ydCA9IHBhcnNlRXBzdlJlc3BvbnNlKHJlcy5tZXNzYWdlKTtcbiAgICBpZiAoIXBvcnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgcGFyc2UgRVBTViByZXNwb25zZTogXCIgKyByZXMubWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xIb3N0ID0gZnRwLnNvY2tldC5yZW1vdGVBZGRyZXNzO1xuICAgIGlmIChjb250cm9sSG9zdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRyb2wgc29ja2V0IGlzIGRpc2Nvbm5lY3RlZCwgY2FuJ3QgZ2V0IHJlbW90ZSBhZGRyZXNzLlwiKTtcbiAgICB9XG4gICAgYXdhaXQgY29ubmVjdEZvclBhc3NpdmVUcmFuc2Zlcihjb250cm9sSG9zdCwgcG9ydCwgZnRwKTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5lbnRlclBhc3NpdmVNb2RlSVB2NiA9IGVudGVyUGFzc2l2ZU1vZGVJUHY2O1xuLyoqXG4gKiBQYXJzZSBhbiBFUFNWIHJlc3BvbnNlLiBSZXR1cm5zIG9ubHkgdGhlIHBvcnQgYXMgaW4gRVBTViB0aGUgaG9zdCBvZiB0aGUgY29udHJvbCBjb25uZWN0aW9uIGlzIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRXBzdlJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgICAvLyBHZXQgcG9ydCBmcm9tIEVQU1YgcmVzcG9uc2UsIGUuZy4gXCIyMjkgRW50ZXJpbmcgRXh0ZW5kZWQgUGFzc2l2ZSBNb2RlICh8fHw2NDQ2fClcIlxuICAgIC8vIFNvbWUgRlRQIFNlcnZlcnMgc3VjaCBhcyB0aGUgb25lIG9uIElCTSBpIChPUy80MDApIHVzZSAhIGluc3RlYWQgb2YgfCBpbiB0aGVpciBFUFNWIHJlc3BvbnNlLlxuICAgIGNvbnN0IGdyb3VwcyA9IG1lc3NhZ2UubWF0Y2goL1t8IV17M30oLispW3whXS8pO1xuICAgIGlmIChncm91cHMgPT09IG51bGwgfHwgZ3JvdXBzWzFdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBwYXJzZSByZXNwb25zZSB0byAnRVBTVic6ICR7bWVzc2FnZX1gKTtcbiAgICB9XG4gICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KGdyb3Vwc1sxXSwgMTApO1xuICAgIGlmIChOdW1iZXIuaXNOYU4ocG9ydCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBwYXJzZSByZXNwb25zZSB0byAnRVBTVicsIHBvcnQgaXMgbm90IGEgbnVtYmVyOiAke21lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHJldHVybiBwb3J0O1xufVxuZXhwb3J0cy5wYXJzZUVwc3ZSZXNwb25zZSA9IHBhcnNlRXBzdlJlc3BvbnNlO1xuLyoqXG4gKiBQcmVwYXJlIGEgZGF0YSBzb2NrZXQgdXNpbmcgcGFzc2l2ZSBtb2RlIG92ZXIgSVB2NC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW50ZXJQYXNzaXZlTW9kZUlQdjQoZnRwKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZnRwLnJlcXVlc3QoXCJQQVNWXCIpO1xuICAgIGNvbnN0IHRhcmdldCA9IHBhcnNlUGFzdlJlc3BvbnNlKHJlcy5tZXNzYWdlKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBwYXJzZSBQQVNWIHJlc3BvbnNlOiBcIiArIHJlcy5tZXNzYWdlKTtcbiAgICB9XG4gICAgLy8gSWYgdGhlIGhvc3QgaW4gdGhlIFBBU1YgcmVzcG9uc2UgaGFzIGEgbG9jYWwgYWRkcmVzcyB3aGlsZSB0aGUgY29udHJvbCBjb25uZWN0aW9uIGhhc24ndCxcbiAgICAvLyB3ZSBhc3N1bWUgYSBOQVQgaXNzdWUgYW5kIHVzZSB0aGUgSVAgb2YgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBhcyB0aGUgdGFyZ2V0IGZvciB0aGUgZGF0YSBjb25uZWN0aW9uLlxuICAgIC8vIFdlIGNhbid0IGFsd2F5cyBwZXJmb3JtIHRoaXMgcmVwbGFjZW1lbnQgYmVjYXVzZSBpdCdzIHBvc3NpYmxlIChhbHRob3VnaCB1bmxpa2VseSkgdGhhdCB0aGUgRlRQIHNlcnZlclxuICAgIC8vIGluZGVlZCB1c2VzIGEgZGlmZmVyZW50IGhvc3QgZm9yIGRhdGEgY29ubmVjdGlvbnMuXG4gICAgY29uc3QgY29udHJvbEhvc3QgPSBmdHAuc29ja2V0LnJlbW90ZUFkZHJlc3M7XG4gICAgaWYgKCgwLCBuZXRVdGlsc18xLmlwSXNQcml2YXRlVjRBZGRyZXNzKSh0YXJnZXQuaG9zdCkgJiYgY29udHJvbEhvc3QgJiYgISgwLCBuZXRVdGlsc18xLmlwSXNQcml2YXRlVjRBZGRyZXNzKShjb250cm9sSG9zdCkpIHtcbiAgICAgICAgdGFyZ2V0Lmhvc3QgPSBjb250cm9sSG9zdDtcbiAgICB9XG4gICAgYXdhaXQgY29ubmVjdEZvclBhc3NpdmVUcmFuc2Zlcih0YXJnZXQuaG9zdCwgdGFyZ2V0LnBvcnQsIGZ0cCk7XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuZW50ZXJQYXNzaXZlTW9kZUlQdjQgPSBlbnRlclBhc3NpdmVNb2RlSVB2NDtcbi8qKlxuICogUGFyc2UgYSBQQVNWIHJlc3BvbnNlLlxuICovXG5mdW5jdGlvbiBwYXJzZVBhc3ZSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgLy8gR2V0IGhvc3QgYW5kIHBvcnQgZnJvbSBQQVNWIHJlc3BvbnNlLCBlLmcuIFwiMjI3IEVudGVyaW5nIFBhc3NpdmUgTW9kZSAoMTkyLDE2OCwxLDEwMCwxMCwyMjkpXCJcbiAgICBjb25zdCBncm91cHMgPSBtZXNzYWdlLm1hdGNoKC8oWy1cXGRdKyxbLVxcZF0rLFstXFxkXSssWy1cXGRdKyksKFstXFxkXSspLChbLVxcZF0rKS8pO1xuICAgIGlmIChncm91cHMgPT09IG51bGwgfHwgZ3JvdXBzLmxlbmd0aCAhPT0gNCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHBhcnNlIHJlc3BvbnNlIHRvICdQQVNWJzogJHttZXNzYWdlfWApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBob3N0OiBncm91cHNbMV0ucmVwbGFjZSgvLC9nLCBcIi5cIiksXG4gICAgICAgIHBvcnQ6IChwYXJzZUludChncm91cHNbMl0sIDEwKSAmIDI1NSkgKiAyNTYgKyAocGFyc2VJbnQoZ3JvdXBzWzNdLCAxMCkgJiAyNTUpXG4gICAgfTtcbn1cbmV4cG9ydHMucGFyc2VQYXN2UmVzcG9uc2UgPSBwYXJzZVBhc3ZSZXNwb25zZTtcbmZ1bmN0aW9uIGNvbm5lY3RGb3JQYXNzaXZlVHJhbnNmZXIoaG9zdCwgcG9ydCwgZnRwKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHNvY2tldCA9IGZ0cC5fbmV3U29ja2V0KCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZUNvbm5FcnIgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBlcnIubWVzc2FnZSA9IFwiQ2FuJ3Qgb3BlbiBkYXRhIGNvbm5lY3Rpb24gaW4gcGFzc2l2ZSBtb2RlOiBcIiArIGVyci5tZXNzYWdlO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhhbmRsZVRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVGltZW91dCB3aGVuIHRyeWluZyB0byBvcGVuIGRhdGEgY29ubmVjdGlvbiB0byAke2hvc3R9OiR7cG9ydH1gKSk7XG4gICAgICAgIH07XG4gICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KGZ0cC50aW1lb3V0KTtcbiAgICAgICAgc29ja2V0Lm9uKFwiZXJyb3JcIiwgaGFuZGxlQ29ubkVycik7XG4gICAgICAgIHNvY2tldC5vbihcInRpbWVvdXRcIiwgaGFuZGxlVGltZW91dCk7XG4gICAgICAgIHNvY2tldC5jb25uZWN0KHsgcG9ydCwgaG9zdCwgZmFtaWx5OiBmdHAuaXBGYW1pbHkgfSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZ0cC5zb2NrZXQgaW5zdGFuY2VvZiB0bHNfMS5UTFNTb2NrZXQpIHtcbiAgICAgICAgICAgICAgICBzb2NrZXQgPSAoMCwgdGxzXzEuY29ubmVjdCkoT2JqZWN0LmFzc2lnbih7fSwgZnRwLnRsc09wdGlvbnMsIHtcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0LFxuICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSB0aGUgVExTIHNlc3Npb24gbmVnb3RpYXRlZCBlYXJsaWVyIHdoZW4gdGhlIGNvbnRyb2wgY29ubmVjdGlvblxuICAgICAgICAgICAgICAgICAgICAvLyB3YXMgdXBncmFkZWQuIFNlcnZlcnMgZXhwZWN0IHRoaXMgYmVjYXVzZSBpdCBwcm92aWRlcyBhZGRpdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgIC8vIHNlY3VyaXR5OiBJZiBhIGNvbXBsZXRlbHkgbmV3IHNlc3Npb24gd291bGQgYmUgbmVnb3RpYXRlZCwgYSBoYWNrZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gY291bGQgZ3Vlc3MgdGhlIHBvcnQgYW5kIGNvbm5lY3QgdG8gdGhlIG5ldyBkYXRhIGNvbm5lY3Rpb24gYmVmb3JlIHdlIGRvXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ5IGp1c3Qgc3RhcnRpbmcgaGlzL2hlciBvd24gVExTIHNlc3Npb24uXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb246IGZ0cC5zb2NrZXQuZ2V0U2Vzc2lvbigpXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIC8vIEl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB0cmFuc2ZlciB0YXNrIHRvIHdhaXQgdW50aWwgdGhlXG4gICAgICAgICAgICAgICAgLy8gVExTIHNvY2tldCBpc3N1ZWQgdGhlIGV2ZW50ICdzZWN1cmVDb25uZWN0Jy4gV2UgY2FuJ3QgZG8gdGhpc1xuICAgICAgICAgICAgICAgIC8vIGhlcmUgYmVjYXVzZSBzb21lIHNlcnZlcnMgd2lsbCBzdGFydCB1cGdyYWRpbmcgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gc3BlY2lmaWMgdHJhbnNmZXIgcmVxdWVzdCBoYXMgYmVlbiBtYWRlLiBMaXN0IGFuZCBkb3dubG9hZCBkb24ndFxuICAgICAgICAgICAgICAgIC8vIGhhdmUgdG8gd2FpdCBmb3IgdGhpcyBldmVudCBiZWNhdXNlIHRoZSBzZXJ2ZXIgc2VuZHMgd2hlbmV2ZXIgaXRcbiAgICAgICAgICAgICAgICAvLyBpcyByZWFkeS4gQnV0IGZvciB1cGxvYWQgdGhpcyBoYXMgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50LFxuICAgICAgICAgICAgICAgIC8vIHNlZSB0aGUgZGV0YWlscyBpbiB0aGUgdXBsb2FkKCkgZnVuY3Rpb24gYmVsb3cuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMZXQgdGhlIEZUUENvbnRleHQgbGlzdGVuIHRvIGVycm9ycyBmcm9tIG5vdyBvbiwgcmVtb3ZlIGxvY2FsIGhhbmRsZXIuXG4gICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCBoYW5kbGVDb25uRXJyKTtcbiAgICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcihcInRpbWVvdXRcIiwgaGFuZGxlVGltZW91dCk7XG4gICAgICAgICAgICBmdHAuZGF0YVNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNvbm5lY3RGb3JQYXNzaXZlVHJhbnNmZXIgPSBjb25uZWN0Rm9yUGFzc2l2ZVRyYW5zZmVyO1xuLyoqXG4gKiBIZWxwcyByZXNvbHZpbmcvcmVqZWN0aW5nIHRyYW5zZmVycy5cbiAqXG4gKiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBmb3IgYWxsIEZUUCB0cmFuc2ZlcnMuIEZvciBleGFtcGxlIHdoZW4gZG93bmxvYWRpbmcsIHRoZSBzZXJ2ZXIgbWlnaHQgY29uZmlybVxuICogd2l0aCBcIjIyNiBUcmFuc2ZlciBjb21wbGV0ZVwiIHdoZW4gaW4gZmFjdCB0aGUgZG93bmxvYWQgb24gdGhlIGRhdGEgY29ubmVjdGlvbiBoYXMgbm90IGZpbmlzaGVkXG4gKiB5ZXQuIFdpdGggYWxsIHRyYW5zZmVycyB3ZSBtYWtlIHN1cmUgdGhhdCBhKSB0aGUgcmVzdWx0IGFycml2ZWQgYW5kIGIpIGhhcyBiZWVuIGNvbmZpcm1lZCBieVxuICogZS5nLiB0aGUgY29udHJvbCBjb25uZWN0aW9uLiBXZSBqdXN0IGRvbid0IGtub3cgaW4gd2hpY2ggb3JkZXIgdGhpcyB3aWxsIGhhcHBlbi5cbiAqL1xuY2xhc3MgVHJhbnNmZXJSZXNvbHZlciB7XG4gICAgLyoqXG4gICAgICogSW5zdGFudGlhdGUgYSBUcmFuc2ZlclJlc29sdmVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZnRwLCBwcm9ncmVzcykge1xuICAgICAgICB0aGlzLmZ0cCA9IGZ0cDtcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmRhdGFUcmFuc2ZlckRvbmUgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgdHJhbnNmZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhlIHRyYW5zZmVyLCB1c3VhbGx5IHRoZSBmaWxlbmFtZS5cbiAgICAgKiBAcGFyYW0gdHlwZSAtIFR5cGUgb2YgdHJhbnNmZXIsIHVzdWFsbHkgXCJ1cGxvYWRcIiBvciBcImRvd25sb2FkXCIuXG4gICAgICovXG4gICAgb25EYXRhU3RhcnQobmFtZSwgdHlwZSkge1xuICAgICAgICAvLyBMZXQgdGhlIGRhdGEgc29ja2V0IGJlIGluIGNoYXJnZSBvZiB0cmFja2luZyB0aW1lb3V0cyBkdXJpbmcgdHJhbnNmZXIuXG4gICAgICAgIC8vIFRoZSBjb250cm9sIHNvY2tldCBzaXRzIGlkbGUgZHVyaW5nIHRoaXMgdGltZSBhbnl3YXkgYW5kIG1pZ2h0IHByb3Zva2VcbiAgICAgICAgLy8gYSB0aW1lb3V0IHVubmVjZXNzYXJpbHkuIFRoZSBjb250cm9sIGNvbm5lY3Rpb24gd2lsbCB0YWtlIGNhcmVcbiAgICAgICAgLy8gb2YgdGltZW91dHMgYWdhaW4gb25jZSBkYXRhIHRyYW5zZmVyIGlzIGNvbXBsZXRlIG9yIGZhaWxlZC5cbiAgICAgICAgaWYgKHRoaXMuZnRwLmRhdGFTb2NrZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YSB0cmFuc2ZlciBzaG91bGQgc3RhcnQgYnV0IHRoZXJlIGlzIG5vIGRhdGEgY29ubmVjdGlvbi5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mdHAuc29ja2V0LnNldFRpbWVvdXQoMCk7XG4gICAgICAgIHRoaXMuZnRwLmRhdGFTb2NrZXQuc2V0VGltZW91dCh0aGlzLmZ0cC50aW1lb3V0KTtcbiAgICAgICAgdGhpcy5wcm9ncmVzcy5zdGFydCh0aGlzLmZ0cC5kYXRhU29ja2V0LCBuYW1lLCB0eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGEgY29ubmVjdGlvbiBoYXMgZmluaXNoZWQgdGhlIHRyYW5zZmVyLlxuICAgICAqL1xuICAgIG9uRGF0YURvbmUodGFzaykge1xuICAgICAgICB0aGlzLnByb2dyZXNzLnVwZGF0ZUFuZFN0b3AoKTtcbiAgICAgICAgLy8gSGFuZC1vdmVyIHRpbWVvdXQgdHJhY2tpbmcgYmFjayB0byB0aGUgY29udHJvbCBjb25uZWN0aW9uLiBJdCdzIHBvc3NpYmxlIHRoYXRcbiAgICAgICAgLy8gd2UgZG9uJ3QgcmVjZWl2ZSB0aGUgcmVzcG9uc2Ugb3ZlciB0aGUgY29udHJvbCBjb25uZWN0aW9uIHRoYXQgdGhlIHRyYW5zZmVyIGlzXG4gICAgICAgIC8vIGRvbmUuIEluIHRoaXMgY2FzZSwgd2Ugd2FudCB0byBjb3JyZWN0bHkgYXNzb2NpYXRlIHRoZSByZXN1bHRpbmcgdGltZW91dCB3aXRoXG4gICAgICAgIC8vIHRoZSBjb250cm9sIGNvbm5lY3Rpb24uXG4gICAgICAgIHRoaXMuZnRwLnNvY2tldC5zZXRUaW1lb3V0KHRoaXMuZnRwLnRpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5mdHAuZGF0YVNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5mdHAuZGF0YVNvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVRyYW5zZmVyRG9uZSA9IHRydWU7XG4gICAgICAgIHRoaXMudHJ5UmVzb2x2ZSh0YXNrKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRyb2wgY29ubmVjdGlvbiByZXBvcnRzIHRoZSB0cmFuc2ZlciBhcyBmaW5pc2hlZC5cbiAgICAgKi9cbiAgICBvbkNvbnRyb2xEb25lKHRhc2ssIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy50cnlSZXNvbHZlKHRhc2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBoYXMgYmVlbiByZXBvcnRlZCBhbmQgdGhlIHRhc2sgc2hvdWxkIGJlIHJlamVjdGVkLlxuICAgICAqL1xuICAgIG9uRXJyb3IodGFzaywgZXJyKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MudXBkYXRlQW5kU3RvcCgpO1xuICAgICAgICB0aGlzLmZ0cC5zb2NrZXQuc2V0VGltZW91dCh0aGlzLmZ0cC50aW1lb3V0KTtcbiAgICAgICAgdGhpcy5mdHAuZGF0YVNvY2tldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGFzay5yZWplY3QoZXJyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udHJvbCBjb25uZWN0aW9uIHNlbnQgYW4gdW5leHBlY3RlZCByZXF1ZXN0IHJlcXVpcmluZyBhIHJlc3BvbnNlIGZyb20gb3VyIHBhcnQuIFdlXG4gICAgICogY2FuJ3QgcHJvdmlkZSB0aGF0IChiZWNhdXNlIHVua25vd24pIGFuZCBoYXZlIHRvIGNsb3NlIHRoZSBjb250cmV4dCB3aXRoIGFuIGVycm9yIGJlY2F1c2VcbiAgICAgKiB0aGUgRlRQIHNlcnZlciBpcyBub3cgY2F1Z2h0IHVwIGluIGEgc3RhdGUgd2UgY2FuJ3QgcmVzb2x2ZS5cbiAgICAgKi9cbiAgICBvblVuZXhwZWN0ZWRSZXF1ZXN0KHJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBGVFAgcmVzcG9uc2UgaXMgcmVxdWVzdGluZyBhbiBhbnN3ZXI6ICR7cmVzcG9uc2UubWVzc2FnZX1gKTtcbiAgICAgICAgdGhpcy5mdHAuY2xvc2VXaXRoRXJyb3IoZXJyKTtcbiAgICB9XG4gICAgdHJ5UmVzb2x2ZSh0YXNrKSB7XG4gICAgICAgIC8vIFRvIHJlc29sdmUsIHdlIG5lZWQgYm90aCBjb250cm9sIGFuZCBkYXRhIGNvbm5lY3Rpb24gdG8gcmVwb3J0IHRoYXQgdGhlIHRyYW5zZmVyIGlzIGRvbmUuXG4gICAgICAgIGNvbnN0IGNhblJlc29sdmUgPSB0aGlzLmRhdGFUcmFuc2ZlckRvbmUgJiYgdGhpcy5yZXNwb25zZSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoY2FuUmVzb2x2ZSkge1xuICAgICAgICAgICAgdGhpcy5mdHAuZGF0YVNvY2tldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRhc2sucmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHVwbG9hZEZyb20oc291cmNlLCBjb25maWcpIHtcbiAgICBjb25zdCByZXNvbHZlciA9IG5ldyBUcmFuc2ZlclJlc29sdmVyKGNvbmZpZy5mdHAsIGNvbmZpZy50cmFja2VyKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IGAke2NvbmZpZy5jb21tYW5kfSAke2NvbmZpZy5yZW1vdGVQYXRofWA7XG4gICAgcmV0dXJuIGNvbmZpZy5mdHAuaGFuZGxlKGZ1bGxDb21tYW5kLCAocmVzLCB0YXNrKSA9PiB7XG4gICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmVzb2x2ZXIub25FcnJvcih0YXNrLCByZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJlcy5jb2RlID09PSAxNTAgfHwgcmVzLmNvZGUgPT09IDEyNSkgeyAvLyBSZWFkeSB0byB1cGxvYWRcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTb2NrZXQgPSBjb25maWcuZnRwLmRhdGFTb2NrZXQ7XG4gICAgICAgICAgICBpZiAoIWRhdGFTb2NrZXQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlci5vbkVycm9yKHRhc2ssIG5ldyBFcnJvcihcIlVwbG9hZCBzaG91bGQgYmVnaW4gYnV0IG5vIGRhdGEgY29ubmVjdGlvbiBpcyBhdmFpbGFibGUuXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgdXNpbmcgVExTLCB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgdGhlIGRhdGFTb2NrZXQgaXNzdWVkXG4gICAgICAgICAgICAvLyAnc2VjdXJlQ29ubmVjdCcuIElmIHRoaXMgaGFzbid0IGhhcHBlbmVkIHlldCwgZ2V0Q2lwaGVyKCkgcmV0dXJucyB1bmRlZmluZWQuXG4gICAgICAgICAgICBjb25zdCBjYW5VcGxvYWQgPSBcImdldENpcGhlclwiIGluIGRhdGFTb2NrZXQgPyBkYXRhU29ja2V0LmdldENpcGhlcigpICE9PSB1bmRlZmluZWQgOiB0cnVlO1xuICAgICAgICAgICAgb25Db25kaXRpb25PckV2ZW50KGNhblVwbG9hZCwgZGF0YVNvY2tldCwgXCJzZWN1cmVDb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25maWcuZnRwLmxvZyhgVXBsb2FkaW5nIHRvICR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVBZGRyZXNzKShkYXRhU29ja2V0KX0gKCR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVUTFMpKGRhdGFTb2NrZXQpfSlgKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlci5vbkRhdGFTdGFydChjb25maWcucmVtb3RlUGF0aCwgY29uZmlnLnR5cGUpO1xuICAgICAgICAgICAgICAgICgwLCBzdHJlYW1fMS5waXBlbGluZSkoc291cmNlLCBkYXRhU29ja2V0LCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5vbkVycm9yKHRhc2ssIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5vbkRhdGFEb25lKHRhc2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoMCwgcGFyc2VDb250cm9sUmVzcG9uc2VfMS5wb3NpdGl2ZUNvbXBsZXRpb24pKHJlcy5jb2RlKSkgeyAvLyBUcmFuc2ZlciBjb21wbGV0ZVxuICAgICAgICAgICAgcmVzb2x2ZXIub25Db250cm9sRG9uZSh0YXNrLCByZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCgwLCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xLnBvc2l0aXZlSW50ZXJtZWRpYXRlKShyZXMuY29kZSkpIHtcbiAgICAgICAgICAgIHJlc29sdmVyLm9uVW5leHBlY3RlZFJlcXVlc3QocmVzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZ25vcmUgYWxsIG90aGVyIHBvc2l0aXZlIHByZWxpbWluYXJ5IHJlc3BvbnNlIGNvZGVzICg8IDIwMClcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBsb2FkRnJvbSA9IHVwbG9hZEZyb207XG5mdW5jdGlvbiBkb3dubG9hZFRvKGRlc3RpbmF0aW9uLCBjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZy5mdHAuZGF0YVNvY2tldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEb3dubG9hZCB3aWxsIGJlIGluaXRpYXRlZCBidXQgbm8gZGF0YSBjb25uZWN0aW9uIGlzIGF2YWlsYWJsZS5cIik7XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVyID0gbmV3IFRyYW5zZmVyUmVzb2x2ZXIoY29uZmlnLmZ0cCwgY29uZmlnLnRyYWNrZXIpO1xuICAgIHJldHVybiBjb25maWcuZnRwLmhhbmRsZShjb25maWcuY29tbWFuZCwgKHJlcywgdGFzaykgPT4ge1xuICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJlc29sdmVyLm9uRXJyb3IodGFzaywgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZXMuY29kZSA9PT0gMTUwIHx8IHJlcy5jb2RlID09PSAxMjUpIHsgLy8gUmVhZHkgdG8gZG93bmxvYWRcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTb2NrZXQgPSBjb25maWcuZnRwLmRhdGFTb2NrZXQ7XG4gICAgICAgICAgICBpZiAoIWRhdGFTb2NrZXQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlci5vbkVycm9yKHRhc2ssIG5ldyBFcnJvcihcIkRvd25sb2FkIHNob3VsZCBiZWdpbiBidXQgbm8gZGF0YSBjb25uZWN0aW9uIGlzIGF2YWlsYWJsZS5cIikpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZy5mdHAubG9nKGBEb3dubG9hZGluZyBmcm9tICR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVBZGRyZXNzKShkYXRhU29ja2V0KX0gKCR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVUTFMpKGRhdGFTb2NrZXQpfSlgKTtcbiAgICAgICAgICAgIHJlc29sdmVyLm9uRGF0YVN0YXJ0KGNvbmZpZy5yZW1vdGVQYXRoLCBjb25maWcudHlwZSk7XG4gICAgICAgICAgICAoMCwgc3RyZWFtXzEucGlwZWxpbmUpKGRhdGFTb2NrZXQsIGRlc3RpbmF0aW9uLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIub25FcnJvcih0YXNrLCBlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIub25EYXRhRG9uZSh0YXNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZXMuY29kZSA9PT0gMzUwKSB7IC8vIFJlc3RhcnRpbmcgYXQgc3RhcnRBdC5cbiAgICAgICAgICAgIGNvbmZpZy5mdHAuc2VuZChcIlJFVFIgXCIgKyBjb25maWcucmVtb3RlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKDAsIHBhcnNlQ29udHJvbFJlc3BvbnNlXzEucG9zaXRpdmVDb21wbGV0aW9uKShyZXMuY29kZSkpIHsgLy8gVHJhbnNmZXIgY29tcGxldGVcbiAgICAgICAgICAgIHJlc29sdmVyLm9uQ29udHJvbERvbmUodGFzaywgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoMCwgcGFyc2VDb250cm9sUmVzcG9uc2VfMS5wb3NpdGl2ZUludGVybWVkaWF0ZSkocmVzLmNvZGUpKSB7XG4gICAgICAgICAgICByZXNvbHZlci5vblVuZXhwZWN0ZWRSZXF1ZXN0KHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWdub3JlIGFsbCBvdGhlciBwb3NpdGl2ZSBwcmVsaW1pbmFyeSByZXNwb25zZSBjb2RlcyAoPCAyMDApXG4gICAgfSk7XG59XG5leHBvcnRzLmRvd25sb2FkVG8gPSBkb3dubG9hZFRvO1xuLyoqXG4gKiBDYWxscyBhIGZ1bmN0aW9uIGltbWVkaWF0ZWx5IGlmIGEgY29uZGl0aW9uIGlzIG1ldCBvciBzdWJzY3JpYmVzIHRvIGFuIGV2ZW50IGFuZCBjYWxsc1xuICogaXQgb25jZSB0aGUgZXZlbnQgaXMgZW1pdHRlZC5cbiAqXG4gKiBAcGFyYW0gY29uZGl0aW9uICBUaGUgY29uZGl0aW9uIHRvIHRlc3QuXG4gKiBAcGFyYW0gZW1pdHRlciAgVGhlIGVtaXR0ZXIgdG8gdXNlIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIEBwYXJhbSBldmVudE5hbWUgIFRoZSBldmVudCB0byBzdWJzY3JpYmUgdG8gaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogQHBhcmFtIGFjdGlvbiAgVGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIG9uQ29uZGl0aW9uT3JFdmVudChjb25kaXRpb24sIGVtaXR0ZXIsIGV2ZW50TmFtZSwgYWN0aW9uKSB7XG4gICAgaWYgKGNvbmRpdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBhY3Rpb24oKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVtaXR0ZXIub25jZShldmVudE5hbWUsICgpID0+IGFjdGlvbigpKTtcbiAgICB9XG59XG4iLCJ2YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgQ1JDX1RBQkxFID0gW1xuICAweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweGVlMGU2MTJjLCAweDk5MDk1MWJhLCAweDA3NmRjNDE5LFxuICAweDcwNmFmNDhmLCAweGU5NjNhNTM1LCAweDllNjQ5NWEzLCAweDBlZGI4ODMyLCAweDc5ZGNiOGE0LFxuICAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LCAweDA5YjY0YzJiLCAweDdlYjE3Y2JkLCAweGU3YjgyZDA3LFxuICAweDkwYmYxZDkxLCAweDFkYjcxMDY0LCAweDZhYjAyMGYyLCAweGYzYjk3MTQ4LCAweDg0YmU0MWRlLFxuICAweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LCAweDEzNmM5ODU2LFxuICAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLCAweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LFxuICAweGZhMGYzZDYzLCAweDhkMDgwZGY1LCAweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LFxuICAweGEyNjc3MTcyLCAweDNjMDNlNGQxLCAweDRiMDRkNDQ3LCAweGQyMGQ4NWZkLCAweGE1MGFiNTZiLFxuICAweDM1YjVhOGZhLCAweDQyYjI5ODZjLCAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLCAweDMyZDg2Y2UzLFxuICAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LCAweDI2ZDkzMGFjLCAweDUxZGUwMDNhLFxuICAweGM4ZDc1MTgwLCAweGJmZDA2MTE2LCAweDIxYjRmNGI1LCAweDU2YjNjNDIzLCAweGNmYmE5NTk5LFxuICAweGI4YmRhNTBmLCAweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LFxuICAweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLCAweGI2NjYyZDNkLCAweDc2ZGM0MTkwLFxuICAweDAxZGI3MTA2LCAweDk4ZDIyMGJjLCAweGVmZDUxMDJhLCAweDcxYjE4NTg5LCAweDA2YjZiNTFmLFxuICAweDlmYmZlNGE1LCAweGU4YjhkNDMzLCAweDc4MDdjOWEyLCAweDBmMDBmOTM0LCAweDk2MDlhODhlLFxuICAweGUxMGU5ODE4LCAweDdmNmEwZGJiLCAweDA4NmQzZDJkLCAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxLFxuICAweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLCAweDZjMDY5NWVkLFxuICAweDFiMDFhNTdiLCAweDgyMDhmNGMxLCAweGY1MGZjNDU3LCAweDY1YjBkOWM2LCAweDEyYjdlOTUwLFxuICAweDhiYmViOGVhLCAweGZjYjk4ODdjLCAweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLFxuICAweGZiZDQ0YzY1LCAweDRkYjI2MTU4LCAweDNhYjU1MWNlLCAweGEzYmMwMDc0LCAweGQ0YmIzMGUyLFxuICAweDRhZGZhNTQxLCAweDNkZDg5NWQ3LCAweGE0ZDFjNDZkLCAweGQzZDZmNGZiLCAweDQzNjllOTZhLFxuICAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLCAweDQ0MDQyZDczLCAweDMzMDMxZGU1LFxuICAweGFhMGE0YzVmLCAweGRkMGQ3Y2M5LCAweDUwMDU3MTNjLCAweDI3MDI0MWFhLCAweGJlMGIxMDEwLFxuICAweGM5MGMyMDg2LCAweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLFxuICAweDVlZGVmOTBlLCAweDI5ZDljOTk4LCAweGIwZDA5ODIyLCAweGM3ZDdhOGI0LCAweDU5YjMzZDE3LFxuICAweDJlYjQwZDgxLCAweGI3YmQ1YzNiLCAweGMwYmE2Y2FkLCAweGVkYjg4MzIwLCAweDlhYmZiM2I2LFxuICAweDAzYjZlMjBjLCAweDc0YjFkMjlhLCAweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1LFxuICAweDczZGMxNjgzLCAweGUzNjMwYjEyLCAweDk0NjQzYjg0LCAweDBkNmQ2YTNlLCAweDdhNmE1YWE4LFxuICAweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLCAweGYwMGY5MzQ0LFxuICAweDg3MDhhM2QyLCAweDFlMDFmMjY4LCAweDY5MDZjMmZlLCAweGY3NjI1NzVkLCAweDgwNjU2N2NiLFxuICAweDE5NmMzNjcxLCAweDZlNmIwNmU3LCAweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLFxuICAweDY3ZGQ0YWNjLCAweGY5YjlkZjZmLCAweDhlYmVlZmY5LCAweDE3YjdiZTQzLCAweDYwYjA4ZWQ1LFxuICAweGQ2ZDZhM2U4LCAweGExZDE5MzdlLCAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLCAweGQxYmI2N2YxLFxuICAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLCAweGQ4MGQyYmRhLCAweGFmMGExYjRjLFxuICAweDM2MDM0YWY2LCAweDQxMDQ3YTYwLCAweGRmNjBlZmMzLCAweGE4NjdkZjU1LCAweDMxNmU4ZWVmLFxuICAweDQ2NjliZTc5LCAweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LFxuICAweGNjMGM3Nzk1LCAweGJiMGI0NzAzLCAweDIyMDIxNmI5LCAweDU1MDUyNjJmLCAweGM1YmEzYmJlLFxuICAweGIyYmQwYjI4LCAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LCAweGMyZDdmZmE3LCAweGI1ZDBjZjMxLFxuICAweDJjZDk5ZThiLCAweDViZGVhZTFkLCAweDliNjRjMmIwLCAweGVjNjNmMjI2LCAweDc1NmFhMzljLFxuICAweDAyNmQ5MzBhLCAweDljMDkwNmE5LCAweGViMGUzNjNmLCAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLFxuICAweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LCAweDkyZDI4ZTliLFxuICAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLCAweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLFxuICAweDY4ZGRiM2Y4LCAweDFmZGE4MzZlLCAweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLFxuICAweDE4Yjc0Nzc3LCAweDg4MDg1YWU2LCAweGZmMGY2YTcwLCAweDY2MDYzYmNhLCAweDExMDEwYjVjLFxuICAweDhmNjU5ZWZmLCAweGY4NjJhZTY5LCAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LCAweGEwMGFlMjc4LFxuICAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLCAweGE3NjcyNjYxLCAweGQwNjAxNmY3LFxuICAweDQ5Njk0NzRkLCAweDNlNmU3N2RiLCAweGFlZDE2YTRhLCAweGQ5ZDY1YWRjLCAweDQwZGYwYjY2LFxuICAweDM3ZDgzYmYwLCAweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LFxuICAweGJkYmRmMjFjLCAweGNhYmFjMjhhLCAweDUzYjM5MzMwLCAweDI0YjRhM2E2LCAweGJhZDAzNjA1LFxuICAweGNkZDcwNjkzLCAweDU0ZGU1NzI5LCAweDIzZDk2N2JmLCAweGIzNjY3YTJlLCAweGM0NjE0YWI4LFxuICAweDVkNjgxYjAyLCAweDJhNmYyYjk0LCAweGI0MGJiZTM3LCAweGMzMGM4ZWExLCAweDVhMDVkZjFiLFxuICAweDJkMDJlZjhkXG5dO1xuXG5pZiAodHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gIENSQ19UQUJMRSA9IG5ldyBJbnQzMkFycmF5KENSQ19UQUJMRSk7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZUJ1ZmZlcihpbnB1dCkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGlucHV0KSkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIHZhciBoYXNOZXdCdWZmZXJBUEkgPVxuICAgICAgdHlwZW9mIEJ1ZmZlci5hbGxvYyA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICB0eXBlb2YgQnVmZmVyLmZyb20gPT09IFwiZnVuY3Rpb25cIjtcblxuICBpZiAodHlwZW9mIGlucHV0ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIGhhc05ld0J1ZmZlckFQSSA/IEJ1ZmZlci5hbGxvYyhpbnB1dCkgOiBuZXcgQnVmZmVyKGlucHV0KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gaGFzTmV3QnVmZmVyQVBJID8gQnVmZmVyLmZyb20oaW5wdXQpIDogbmV3IEJ1ZmZlcihpbnB1dCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW5wdXQgbXVzdCBiZSBidWZmZXIsIG51bWJlciwgb3Igc3RyaW5nLCByZWNlaXZlZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBpbnB1dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVmZmVyaXplSW50KG51bSkge1xuICB2YXIgdG1wID0gZW5zdXJlQnVmZmVyKDQpO1xuICB0bXAud3JpdGVJbnQzMkJFKG51bSwgMCk7XG4gIHJldHVybiB0bXA7XG59XG5cbmZ1bmN0aW9uIF9jcmMzMihidWYsIHByZXZpb3VzKSB7XG4gIGJ1ZiA9IGVuc3VyZUJ1ZmZlcihidWYpO1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHByZXZpb3VzKSkge1xuICAgIHByZXZpb3VzID0gcHJldmlvdXMucmVhZFVJbnQzMkJFKDApO1xuICB9XG4gIHZhciBjcmMgPSB+fnByZXZpb3VzIF4gLTE7XG4gIGZvciAodmFyIG4gPSAwOyBuIDwgYnVmLmxlbmd0aDsgbisrKSB7XG4gICAgY3JjID0gQ1JDX1RBQkxFWyhjcmMgXiBidWZbbl0pICYgMHhmZl0gXiAoY3JjID4+PiA4KTtcbiAgfVxuICByZXR1cm4gKGNyYyBeIC0xKTtcbn1cblxuZnVuY3Rpb24gY3JjMzIoKSB7XG4gIHJldHVybiBidWZmZXJpemVJbnQoX2NyYzMyLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xufVxuY3JjMzIuc2lnbmVkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2NyYzMyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59O1xuY3JjMzIudW5zaWduZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfY3JjMzIuYXBwbHkobnVsbCwgYXJndW1lbnRzKSA+Pj4gMDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JjMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTWFza3MgYSBidWZmZXIgdXNpbmcgdGhlIGdpdmVuIG1hc2suXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IHNvdXJjZSBUaGUgYnVmZmVyIHRvIG1hc2tcbiAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIFRoZSBtYXNrIHRvIHVzZVxuICogQHBhcmFtIHtCdWZmZXJ9IG91dHB1dCBUaGUgYnVmZmVyIHdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0byBzdGFydCB3cml0aW5nXG4gKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbWFzay5cbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgbWFzayA9IChzb3VyY2UsIG1hc2ssIG91dHB1dCwgb2Zmc2V0LCBsZW5ndGgpID0+IHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFtvZmZzZXQgKyBpXSA9IHNvdXJjZVtpXSBeIG1hc2tbaSAmIDNdO1xuICB9XG59O1xuXG4vKipcbiAqIFVubWFza3MgYSBidWZmZXIgdXNpbmcgdGhlIGdpdmVuIG1hc2suXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIHVubWFza1xuICogQHBhcmFtIHtCdWZmZXJ9IG1hc2sgVGhlIG1hc2sgdG8gdXNlXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IHVubWFzayA9IChidWZmZXIsIG1hc2spID0+IHtcbiAgLy8gUmVxdWlyZWQgdW50aWwgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy85MDA2IGlzIHJlc29sdmVkLlxuICBjb25zdCBsZW5ndGggPSBidWZmZXIubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgYnVmZmVyW2ldIF49IG1hc2tbaSAmIDNdO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgbWFzaywgdW5tYXNrIH07XG4iLCIndXNlIHN0cmljdCc7XG5cbnRyeSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnbm9kZS1neXAtYnVpbGQnKShfX2Rpcm5hbWUpO1xufSBjYXRjaCAoZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFsbGJhY2snKTtcbn1cbiIsIi8qIE1JVCBsaWNlbnNlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1taXhlZC1vcGVyYXRvcnMgKi9cbmNvbnN0IGNzc0tleXdvcmRzID0gcmVxdWlyZSgnY29sb3ItbmFtZScpO1xuXG4vLyBOT1RFOiBjb252ZXJzaW9ucyBzaG91bGQgb25seSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlcyAoaS5lLiBhcnJheXMsIG9yXG4vLyAgICAgICB2YWx1ZXMgdGhhdCBnaXZlIGNvcnJlY3QgYHR5cGVvZmAgcmVzdWx0cykuXG4vLyAgICAgICBkbyBub3QgdXNlIGJveCB2YWx1ZXMgdHlwZXMgKGkuZS4gTnVtYmVyKCksIFN0cmluZygpLCBldGMuKVxuXG5jb25zdCByZXZlcnNlS2V5d29yZHMgPSB7fTtcbmZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNzc0tleXdvcmRzKSkge1xuXHRyZXZlcnNlS2V5d29yZHNbY3NzS2V5d29yZHNba2V5XV0gPSBrZXk7XG59XG5cbmNvbnN0IGNvbnZlcnQgPSB7XG5cdHJnYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdyZ2InfSxcblx0aHNsOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzbCd9LFxuXHRoc3Y6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHN2J30sXG5cdGh3Yjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdod2InfSxcblx0Y215azoge2NoYW5uZWxzOiA0LCBsYWJlbHM6ICdjbXlrJ30sXG5cdHh5ejoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICd4eXonfSxcblx0bGFiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xhYid9LFxuXHRsY2g6IHtjaGFubmVsczogMywgbGFiZWxzOiAnbGNoJ30sXG5cdGhleDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnaGV4J119LFxuXHRrZXl3b3JkOiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydrZXl3b3JkJ119LFxuXHRhbnNpMTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kxNiddfSxcblx0YW5zaTI1Njoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnYW5zaTI1NiddfSxcblx0aGNnOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydoJywgJ2MnLCAnZyddfSxcblx0YXBwbGU6IHtjaGFubmVsczogMywgbGFiZWxzOiBbJ3IxNicsICdnMTYnLCAnYjE2J119LFxuXHRncmF5OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydncmF5J119XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG5cbi8vIEhpZGUgLmNoYW5uZWxzIGFuZCAubGFiZWxzIHByb3BlcnRpZXNcbmZvciAoY29uc3QgbW9kZWwgb2YgT2JqZWN0LmtleXMoY29udmVydCkpIHtcblx0aWYgKCEoJ2NoYW5uZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHRpZiAoISgnbGFiZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbCBsYWJlbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHRpZiAoY29udmVydFttb2RlbF0ubGFiZWxzLmxlbmd0aCAhPT0gY29udmVydFttb2RlbF0uY2hhbm5lbHMpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ2NoYW5uZWwgYW5kIGxhYmVsIGNvdW50cyBtaXNtYXRjaDogJyArIG1vZGVsKTtcblx0fVxuXG5cdGNvbnN0IHtjaGFubmVscywgbGFiZWxzfSA9IGNvbnZlcnRbbW9kZWxdO1xuXHRkZWxldGUgY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cdGRlbGV0ZSBjb252ZXJ0W21vZGVsXS5sYWJlbHM7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W21vZGVsXSwgJ2NoYW5uZWxzJywge3ZhbHVlOiBjaGFubmVsc30pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGxhYmVsc30pO1xufVxuXG5jb252ZXJ0LnJnYi5oc2wgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cdGNvbnN0IG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuXHRjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcblx0Y29uc3QgZGVsdGEgPSBtYXggLSBtaW47XG5cdGxldCBoO1xuXHRsZXQgcztcblxuXHRpZiAobWF4ID09PSBtaW4pIHtcblx0XHRoID0gMDtcblx0fSBlbHNlIGlmIChyID09PSBtYXgpIHtcblx0XHRoID0gKGcgLSBiKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGcgPT09IG1heCkge1xuXHRcdGggPSAyICsgKGIgLSByKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGIgPT09IG1heCkge1xuXHRcdGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuXHR9XG5cblx0aCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGNvbnN0IGwgPSAobWluICsgbWF4KSAvIDI7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSBpZiAobCA8PSAwLjUpIHtcblx0XHRzID0gZGVsdGEgLyAobWF4ICsgbWluKTtcblx0fSBlbHNlIHtcblx0XHRzID0gZGVsdGEgLyAoMiAtIG1heCAtIG1pbik7XG5cdH1cblxuXHRyZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuaHN2ID0gZnVuY3Rpb24gKHJnYikge1xuXHRsZXQgcmRpZjtcblx0bGV0IGdkaWY7XG5cdGxldCBiZGlmO1xuXHRsZXQgaDtcblx0bGV0IHM7XG5cblx0Y29uc3QgciA9IHJnYlswXSAvIDI1NTtcblx0Y29uc3QgZyA9IHJnYlsxXSAvIDI1NTtcblx0Y29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcblx0Y29uc3QgdiA9IE1hdGgubWF4KHIsIGcsIGIpO1xuXHRjb25zdCBkaWZmID0gdiAtIE1hdGgubWluKHIsIGcsIGIpO1xuXHRjb25zdCBkaWZmYyA9IGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuICh2IC0gYykgLyA2IC8gZGlmZiArIDEgLyAyO1xuXHR9O1xuXG5cdGlmIChkaWZmID09PSAwKSB7XG5cdFx0aCA9IDA7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0cyA9IGRpZmYgLyB2O1xuXHRcdHJkaWYgPSBkaWZmYyhyKTtcblx0XHRnZGlmID0gZGlmZmMoZyk7XG5cdFx0YmRpZiA9IGRpZmZjKGIpO1xuXG5cdFx0aWYgKHIgPT09IHYpIHtcblx0XHRcdGggPSBiZGlmIC0gZ2RpZjtcblx0XHR9IGVsc2UgaWYgKGcgPT09IHYpIHtcblx0XHRcdGggPSAoMSAvIDMpICsgcmRpZiAtIGJkaWY7XG5cdFx0fSBlbHNlIGlmIChiID09PSB2KSB7XG5cdFx0XHRoID0gKDIgLyAzKSArIGdkaWYgLSByZGlmO1xuXHRcdH1cblxuXHRcdGlmIChoIDwgMCkge1xuXHRcdFx0aCArPSAxO1xuXHRcdH0gZWxzZSBpZiAoaCA+IDEpIHtcblx0XHRcdGggLT0gMTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gW1xuXHRcdGggKiAzNjAsXG5cdFx0cyAqIDEwMCxcblx0XHR2ICogMTAwXG5cdF07XG59O1xuXG5jb252ZXJ0LnJnYi5od2IgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF07XG5cdGNvbnN0IGcgPSByZ2JbMV07XG5cdGxldCBiID0gcmdiWzJdO1xuXHRjb25zdCBoID0gY29udmVydC5yZ2IuaHNsKHJnYilbMF07XG5cdGNvbnN0IHcgPSAxIC8gMjU1ICogTWF0aC5taW4ociwgTWF0aC5taW4oZywgYikpO1xuXG5cdGIgPSAxIC0gMSAvIDI1NSAqIE1hdGgubWF4KHIsIE1hdGgubWF4KGcsIGIpKTtcblxuXHRyZXR1cm4gW2gsIHcgKiAxMDAsIGIgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuY215ayA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgciA9IHJnYlswXSAvIDI1NTtcblx0Y29uc3QgZyA9IHJnYlsxXSAvIDI1NTtcblx0Y29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcblxuXHRjb25zdCBrID0gTWF0aC5taW4oMSAtIHIsIDEgLSBnLCAxIC0gYik7XG5cdGNvbnN0IGMgPSAoMSAtIHIgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0Y29uc3QgbSA9ICgxIC0gZyAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXHRjb25zdCB5ID0gKDEgLSBiIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cblx0cmV0dXJuIFtjICogMTAwLCBtICogMTAwLCB5ICogMTAwLCBrICogMTAwXTtcbn07XG5cbmZ1bmN0aW9uIGNvbXBhcmF0aXZlRGlzdGFuY2UoeCwgeSkge1xuXHQvKlxuXHRcdFNlZSBodHRwczovL2VuLm0ud2lraXBlZGlhLm9yZy93aWtpL0V1Y2xpZGVhbl9kaXN0YW5jZSNTcXVhcmVkX0V1Y2xpZGVhbl9kaXN0YW5jZVxuXHQqL1xuXHRyZXR1cm4gKFxuXHRcdCgoeFswXSAtIHlbMF0pICoqIDIpICtcblx0XHQoKHhbMV0gLSB5WzFdKSAqKiAyKSArXG5cdFx0KCh4WzJdIC0geVsyXSkgKiogMilcblx0KTtcbn1cblxuY29udmVydC5yZ2Iua2V5d29yZCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgcmV2ZXJzZWQgPSByZXZlcnNlS2V5d29yZHNbcmdiXTtcblx0aWYgKHJldmVyc2VkKSB7XG5cdFx0cmV0dXJuIHJldmVyc2VkO1xuXHR9XG5cblx0bGV0IGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcblx0bGV0IGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcblxuXHRmb3IgKGNvbnN0IGtleXdvcmQgb2YgT2JqZWN0LmtleXMoY3NzS2V5d29yZHMpKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcblxuXHRcdC8vIENvbXB1dGUgY29tcGFyYXRpdmUgZGlzdGFuY2Vcblx0XHRjb25zdCBkaXN0YW5jZSA9IGNvbXBhcmF0aXZlRGlzdGFuY2UocmdiLCB2YWx1ZSk7XG5cblx0XHQvLyBDaGVjayBpZiBpdHMgbGVzcywgaWYgc28gc2V0IGFzIGNsb3Nlc3Rcblx0XHRpZiAoZGlzdGFuY2UgPCBjdXJyZW50Q2xvc2VzdERpc3RhbmNlKSB7XG5cdFx0XHRjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7XG5cdFx0XHRjdXJyZW50Q2xvc2VzdEtleXdvcmQgPSBrZXl3b3JkO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG59O1xuXG5jb252ZXJ0LmtleXdvcmQucmdiID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcblx0cmV0dXJuIGNzc0tleXdvcmRzW2tleXdvcmRdO1xufTtcblxuY29udmVydC5yZ2IueHl6ID0gZnVuY3Rpb24gKHJnYikge1xuXHRsZXQgciA9IHJnYlswXSAvIDI1NTtcblx0bGV0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGxldCBiID0gcmdiWzJdIC8gMjU1O1xuXG5cdC8vIEFzc3VtZSBzUkdCXG5cdHIgPSByID4gMC4wNDA0NSA/ICgoKHIgKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40KSA6IChyIC8gMTIuOTIpO1xuXHRnID0gZyA+IDAuMDQwNDUgPyAoKChnICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNCkgOiAoZyAvIDEyLjkyKTtcblx0YiA9IGIgPiAwLjA0MDQ1ID8gKCgoYiArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQpIDogKGIgLyAxMi45Mik7XG5cblx0Y29uc3QgeCA9IChyICogMC40MTI0KSArIChnICogMC4zNTc2KSArIChiICogMC4xODA1KTtcblx0Y29uc3QgeSA9IChyICogMC4yMTI2KSArIChnICogMC43MTUyKSArIChiICogMC4wNzIyKTtcblx0Y29uc3QgeiA9IChyICogMC4wMTkzKSArIChnICogMC4xMTkyKSArIChiICogMC45NTA1KTtcblxuXHRyZXR1cm4gW3ggKiAxMDAsIHkgKiAxMDAsIHogKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IubGFiID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCB4eXogPSBjb252ZXJ0LnJnYi54eXoocmdiKTtcblx0bGV0IHggPSB4eXpbMF07XG5cdGxldCB5ID0geHl6WzFdO1xuXHRsZXQgeiA9IHh5elsyXTtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gKHggKiogKDEgLyAzKSkgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG5cdHkgPSB5ID4gMC4wMDg4NTYgPyAoeSAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/ICh6ICoqICgxIC8gMykpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGNvbnN0IGwgPSAoMTE2ICogeSkgLSAxNjtcblx0Y29uc3QgYSA9IDUwMCAqICh4IC0geSk7XG5cdGNvbnN0IGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmhzbC5yZ2IgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IGggPSBoc2xbMF0gLyAzNjA7XG5cdGNvbnN0IHMgPSBoc2xbMV0gLyAxMDA7XG5cdGNvbnN0IGwgPSBoc2xbMl0gLyAxMDA7XG5cdGxldCB0Mjtcblx0bGV0IHQzO1xuXHRsZXQgdmFsO1xuXG5cdGlmIChzID09PSAwKSB7XG5cdFx0dmFsID0gbCAqIDI1NTtcblx0XHRyZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xuXHR9XG5cblx0aWYgKGwgPCAwLjUpIHtcblx0XHR0MiA9IGwgKiAoMSArIHMpO1xuXHR9IGVsc2Uge1xuXHRcdHQyID0gbCArIHMgLSBsICogcztcblx0fVxuXG5cdGNvbnN0IHQxID0gMiAqIGwgLSB0MjtcblxuXHRjb25zdCByZ2IgPSBbMCwgMCwgMF07XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0dDMgPSBoICsgMSAvIDMgKiAtKGkgLSAxKTtcblx0XHRpZiAodDMgPCAwKSB7XG5cdFx0XHR0MysrO1xuXHRcdH1cblxuXHRcdGlmICh0MyA+IDEpIHtcblx0XHRcdHQzLS07XG5cdFx0fVxuXG5cdFx0aWYgKDYgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQxICsgKHQyIC0gdDEpICogNiAqIHQzO1xuXHRcdH0gZWxzZSBpZiAoMiAqIHQzIDwgMSkge1xuXHRcdFx0dmFsID0gdDI7XG5cdFx0fSBlbHNlIGlmICgzICogdDMgPCAyKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbCA9IHQxO1xuXHRcdH1cblxuXHRcdHJnYltpXSA9IHZhbCAqIDI1NTtcblx0fVxuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jb252ZXJ0LmhzbC5oc3YgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IGggPSBoc2xbMF07XG5cdGxldCBzID0gaHNsWzFdIC8gMTAwO1xuXHRsZXQgbCA9IGhzbFsyXSAvIDEwMDtcblx0bGV0IHNtaW4gPSBzO1xuXHRjb25zdCBsbWluID0gTWF0aC5tYXgobCwgMC4wMSk7XG5cblx0bCAqPSAyO1xuXHRzICo9IChsIDw9IDEpID8gbCA6IDIgLSBsO1xuXHRzbWluICo9IGxtaW4gPD0gMSA/IGxtaW4gOiAyIC0gbG1pbjtcblx0Y29uc3QgdiA9IChsICsgcykgLyAyO1xuXHRjb25zdCBzdiA9IGwgPT09IDAgPyAoMiAqIHNtaW4pIC8gKGxtaW4gKyBzbWluKSA6ICgyICogcykgLyAobCArIHMpO1xuXG5cdHJldHVybiBbaCwgc3YgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oc3YucmdiID0gZnVuY3Rpb24gKGhzdikge1xuXHRjb25zdCBoID0gaHN2WzBdIC8gNjA7XG5cdGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG5cdGxldCB2ID0gaHN2WzJdIC8gMTAwO1xuXHRjb25zdCBoaSA9IE1hdGguZmxvb3IoaCkgJSA2O1xuXG5cdGNvbnN0IGYgPSBoIC0gTWF0aC5mbG9vcihoKTtcblx0Y29uc3QgcCA9IDI1NSAqIHYgKiAoMSAtIHMpO1xuXHRjb25zdCBxID0gMjU1ICogdiAqICgxIC0gKHMgKiBmKSk7XG5cdGNvbnN0IHQgPSAyNTUgKiB2ICogKDEgLSAocyAqICgxIC0gZikpKTtcblx0diAqPSAyNTU7XG5cblx0c3dpdGNoIChoaSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHJldHVybiBbdiwgdCwgcF07XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cmV0dXJuIFtxLCB2LCBwXTtcblx0XHRjYXNlIDI6XG5cdFx0XHRyZXR1cm4gW3AsIHYsIHRdO1xuXHRcdGNhc2UgMzpcblx0XHRcdHJldHVybiBbcCwgcSwgdl07XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cmV0dXJuIFt0LCBwLCB2XTtcblx0XHRjYXNlIDU6XG5cdFx0XHRyZXR1cm4gW3YsIHAsIHFdO1xuXHR9XG59O1xuXG5jb252ZXJ0Lmhzdi5oc2wgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdGNvbnN0IGggPSBoc3ZbMF07XG5cdGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG5cdGNvbnN0IHYgPSBoc3ZbMl0gLyAxMDA7XG5cdGNvbnN0IHZtaW4gPSBNYXRoLm1heCh2LCAwLjAxKTtcblx0bGV0IHNsO1xuXHRsZXQgbDtcblxuXHRsID0gKDIgLSBzKSAqIHY7XG5cdGNvbnN0IGxtaW4gPSAoMiAtIHMpICogdm1pbjtcblx0c2wgPSBzICogdm1pbjtcblx0c2wgLz0gKGxtaW4gPD0gMSkgPyBsbWluIDogMiAtIGxtaW47XG5cdHNsID0gc2wgfHwgMDtcblx0bCAvPSAyO1xuXG5cdHJldHVybiBbaCwgc2wgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLWNvbG9yLyNod2ItdG8tcmdiXG5jb252ZXJ0Lmh3Yi5yZ2IgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdGNvbnN0IGggPSBod2JbMF0gLyAzNjA7XG5cdGxldCB3aCA9IGh3YlsxXSAvIDEwMDtcblx0bGV0IGJsID0gaHdiWzJdIC8gMTAwO1xuXHRjb25zdCByYXRpbyA9IHdoICsgYmw7XG5cdGxldCBmO1xuXG5cdC8vIFdoICsgYmwgY2FudCBiZSA+IDFcblx0aWYgKHJhdGlvID4gMSkge1xuXHRcdHdoIC89IHJhdGlvO1xuXHRcdGJsIC89IHJhdGlvO1xuXHR9XG5cblx0Y29uc3QgaSA9IE1hdGguZmxvb3IoNiAqIGgpO1xuXHRjb25zdCB2ID0gMSAtIGJsO1xuXHRmID0gNiAqIGggLSBpO1xuXG5cdGlmICgoaSAmIDB4MDEpICE9PSAwKSB7XG5cdFx0ZiA9IDEgLSBmO1xuXHR9XG5cblx0Y29uc3QgbiA9IHdoICsgZiAqICh2IC0gd2gpOyAvLyBMaW5lYXIgaW50ZXJwb2xhdGlvblxuXG5cdGxldCByO1xuXHRsZXQgZztcblx0bGV0IGI7XG5cdC8qIGVzbGludC1kaXNhYmxlIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lLG5vLW11bHRpLXNwYWNlcyAqL1xuXHRzd2l0Y2ggKGkpIHtcblx0XHRkZWZhdWx0OlxuXHRcdGNhc2UgNjpcblx0XHRjYXNlIDA6IHIgPSB2OyAgZyA9IG47ICBiID0gd2g7IGJyZWFrO1xuXHRcdGNhc2UgMTogciA9IG47ICBnID0gdjsgIGIgPSB3aDsgYnJlYWs7XG5cdFx0Y2FzZSAyOiByID0gd2g7IGcgPSB2OyAgYiA9IG47IGJyZWFrO1xuXHRcdGNhc2UgMzogciA9IHdoOyBnID0gbjsgIGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDQ6IHIgPSBuOyAgZyA9IHdoOyBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA1OiByID0gdjsgIGcgPSB3aDsgYiA9IG47IGJyZWFrO1xuXHR9XG5cdC8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUsbm8tbXVsdGktc3BhY2VzICovXG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQuY215ay5yZ2IgPSBmdW5jdGlvbiAoY215aykge1xuXHRjb25zdCBjID0gY215a1swXSAvIDEwMDtcblx0Y29uc3QgbSA9IGNteWtbMV0gLyAxMDA7XG5cdGNvbnN0IHkgPSBjbXlrWzJdIC8gMTAwO1xuXHRjb25zdCBrID0gY215a1szXSAvIDEwMDtcblxuXHRjb25zdCByID0gMSAtIE1hdGgubWluKDEsIGMgKiAoMSAtIGspICsgayk7XG5cdGNvbnN0IGcgPSAxIC0gTWF0aC5taW4oMSwgbSAqICgxIC0gaykgKyBrKTtcblx0Y29uc3QgYiA9IDEgLSBNYXRoLm1pbigxLCB5ICogKDEgLSBrKSArIGspO1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0Lnh5ei5yZ2IgPSBmdW5jdGlvbiAoeHl6KSB7XG5cdGNvbnN0IHggPSB4eXpbMF0gLyAxMDA7XG5cdGNvbnN0IHkgPSB4eXpbMV0gLyAxMDA7XG5cdGNvbnN0IHogPSB4eXpbMl0gLyAxMDA7XG5cdGxldCByO1xuXHRsZXQgZztcblx0bGV0IGI7XG5cblx0ciA9ICh4ICogMy4yNDA2KSArICh5ICogLTEuNTM3MikgKyAoeiAqIC0wLjQ5ODYpO1xuXHRnID0gKHggKiAtMC45Njg5KSArICh5ICogMS44NzU4KSArICh6ICogMC4wNDE1KTtcblx0YiA9ICh4ICogMC4wNTU3KSArICh5ICogLTAuMjA0MCkgKyAoeiAqIDEuMDU3MCk7XG5cblx0Ly8gQXNzdW1lIHNSR0Jcblx0ciA9IHIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAociAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiByICogMTIuOTI7XG5cblx0ZyA9IGcgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAoZyAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiBnICogMTIuOTI7XG5cblx0YiA9IGIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAoYiAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiBiICogMTIuOTI7XG5cblx0ciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcblx0ZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcblx0YiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC54eXoubGFiID0gZnVuY3Rpb24gKHh5eikge1xuXHRsZXQgeCA9IHh5elswXTtcblx0bGV0IHkgPSB4eXpbMV07XG5cdGxldCB6ID0geHl6WzJdO1xuXG5cdHggLz0gOTUuMDQ3O1xuXHR5IC89IDEwMDtcblx0eiAvPSAxMDguODgzO1xuXG5cdHggPSB4ID4gMC4wMDg4NTYgPyAoeCAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcblx0eSA9IHkgPiAwLjAwODg1NiA/ICh5ICoqICgxIC8gMykpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuXHR6ID0geiA+IDAuMDA4ODU2ID8gKHogKiogKDEgLyAzKSkgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cblx0Y29uc3QgbCA9ICgxMTYgKiB5KSAtIDE2O1xuXHRjb25zdCBhID0gNTAwICogKHggLSB5KTtcblx0Y29uc3QgYiA9IDIwMCAqICh5IC0geik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQubGFiLnh5eiA9IGZ1bmN0aW9uIChsYWIpIHtcblx0Y29uc3QgbCA9IGxhYlswXTtcblx0Y29uc3QgYSA9IGxhYlsxXTtcblx0Y29uc3QgYiA9IGxhYlsyXTtcblx0bGV0IHg7XG5cdGxldCB5O1xuXHRsZXQgejtcblxuXHR5ID0gKGwgKyAxNikgLyAxMTY7XG5cdHggPSBhIC8gNTAwICsgeTtcblx0eiA9IHkgLSBiIC8gMjAwO1xuXG5cdGNvbnN0IHkyID0geSAqKiAzO1xuXHRjb25zdCB4MiA9IHggKiogMztcblx0Y29uc3QgejIgPSB6ICoqIDM7XG5cdHkgPSB5MiA+IDAuMDA4ODU2ID8geTIgOiAoeSAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXHR4ID0geDIgPiAwLjAwODg1NiA/IHgyIDogKHggLSAxNiAvIDExNikgLyA3Ljc4Nztcblx0eiA9IHoyID4gMC4wMDg4NTYgPyB6MiA6ICh6IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cblx0eCAqPSA5NS4wNDc7XG5cdHkgKj0gMTAwO1xuXHR6ICo9IDEwOC44ODM7XG5cblx0cmV0dXJuIFt4LCB5LCB6XTtcbn07XG5cbmNvbnZlcnQubGFiLmxjaCA9IGZ1bmN0aW9uIChsYWIpIHtcblx0Y29uc3QgbCA9IGxhYlswXTtcblx0Y29uc3QgYSA9IGxhYlsxXTtcblx0Y29uc3QgYiA9IGxhYlsyXTtcblx0bGV0IGg7XG5cblx0Y29uc3QgaHIgPSBNYXRoLmF0YW4yKGIsIGEpO1xuXHRoID0gaHIgKiAzNjAgLyAyIC8gTWF0aC5QSTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGNvbnN0IGMgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG5cblx0cmV0dXJuIFtsLCBjLCBoXTtcbn07XG5cbmNvbnZlcnQubGNoLmxhYiA9IGZ1bmN0aW9uIChsY2gpIHtcblx0Y29uc3QgbCA9IGxjaFswXTtcblx0Y29uc3QgYyA9IGxjaFsxXTtcblx0Y29uc3QgaCA9IGxjaFsyXTtcblxuXHRjb25zdCBociA9IGggLyAzNjAgKiAyICogTWF0aC5QSTtcblx0Y29uc3QgYSA9IGMgKiBNYXRoLmNvcyhocik7XG5cdGNvbnN0IGIgPSBjICogTWF0aC5zaW4oaHIpO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncywgc2F0dXJhdGlvbiA9IG51bGwpIHtcblx0Y29uc3QgW3IsIGcsIGJdID0gYXJncztcblx0bGV0IHZhbHVlID0gc2F0dXJhdGlvbiA9PT0gbnVsbCA/IGNvbnZlcnQucmdiLmhzdihhcmdzKVsyXSA6IHNhdHVyYXRpb247IC8vIEhzdiAtPiBhbnNpMTYgb3B0aW1pemF0aW9uXG5cblx0dmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gNTApO1xuXG5cdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdHJldHVybiAzMDtcblx0fVxuXG5cdGxldCBhbnNpID0gMzBcblx0XHQrICgoTWF0aC5yb3VuZChiIC8gMjU1KSA8PCAyKVxuXHRcdHwgKE1hdGgucm91bmQoZyAvIDI1NSkgPDwgMSlcblx0XHR8IE1hdGgucm91bmQociAvIDI1NSkpO1xuXG5cdGlmICh2YWx1ZSA9PT0gMikge1xuXHRcdGFuc2kgKz0gNjA7XG5cdH1cblxuXHRyZXR1cm4gYW5zaTtcbn07XG5cbmNvbnZlcnQuaHN2LmFuc2kxNiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIE9wdGltaXphdGlvbiBoZXJlOyB3ZSBhbHJlYWR5IGtub3cgdGhlIHZhbHVlIGFuZCBkb24ndCBuZWVkIHRvIGdldFxuXHQvLyBpdCBjb252ZXJ0ZWQgZm9yIHVzLlxuXHRyZXR1cm4gY29udmVydC5yZ2IuYW5zaTE2KGNvbnZlcnQuaHN2LnJnYihhcmdzKSwgYXJnc1syXSk7XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMjU2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Y29uc3QgciA9IGFyZ3NbMF07XG5cdGNvbnN0IGcgPSBhcmdzWzFdO1xuXHRjb25zdCBiID0gYXJnc1syXTtcblxuXHQvLyBXZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0aWYgKHIgPT09IGcgJiYgZyA9PT0gYikge1xuXHRcdGlmIChyIDwgOCkge1xuXHRcdFx0cmV0dXJuIDE2O1xuXHRcdH1cblxuXHRcdGlmIChyID4gMjQ4KSB7XG5cdFx0XHRyZXR1cm4gMjMxO1xuXHRcdH1cblxuXHRcdHJldHVybiBNYXRoLnJvdW5kKCgociAtIDgpIC8gMjQ3KSAqIDI0KSArIDIzMjtcblx0fVxuXG5cdGNvbnN0IGFuc2kgPSAxNlxuXHRcdCsgKDM2ICogTWF0aC5yb3VuZChyIC8gMjU1ICogNSkpXG5cdFx0KyAoNiAqIE1hdGgucm91bmQoZyAvIDI1NSAqIDUpKVxuXHRcdCsgTWF0aC5yb3VuZChiIC8gMjU1ICogNSk7XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0LmFuc2kxNi5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHRsZXQgY29sb3IgPSBhcmdzICUgMTA7XG5cblx0Ly8gSGFuZGxlIGdyZXlzY2FsZVxuXHRpZiAoY29sb3IgPT09IDAgfHwgY29sb3IgPT09IDcpIHtcblx0XHRpZiAoYXJncyA+IDUwKSB7XG5cdFx0XHRjb2xvciArPSAzLjU7XG5cdFx0fVxuXG5cdFx0Y29sb3IgPSBjb2xvciAvIDEwLjUgKiAyNTU7XG5cblx0XHRyZXR1cm4gW2NvbG9yLCBjb2xvciwgY29sb3JdO1xuXHR9XG5cblx0Y29uc3QgbXVsdCA9ICh+fihhcmdzID4gNTApICsgMSkgKiAwLjU7XG5cdGNvbnN0IHIgPSAoKGNvbG9yICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0Y29uc3QgZyA9ICgoKGNvbG9yID4+IDEpICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0Y29uc3QgYiA9ICgoKGNvbG9yID4+IDIpICYgMSkgKiBtdWx0KSAqIDI1NTtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5hbnNpMjU2LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIEhhbmRsZSBncmV5c2NhbGVcblx0aWYgKGFyZ3MgPj0gMjMyKSB7XG5cdFx0Y29uc3QgYyA9IChhcmdzIC0gMjMyKSAqIDEwICsgODtcblx0XHRyZXR1cm4gW2MsIGMsIGNdO1xuXHR9XG5cblx0YXJncyAtPSAxNjtcblxuXHRsZXQgcmVtO1xuXHRjb25zdCByID0gTWF0aC5mbG9vcihhcmdzIC8gMzYpIC8gNSAqIDI1NTtcblx0Y29uc3QgZyA9IE1hdGguZmxvb3IoKHJlbSA9IGFyZ3MgJSAzNikgLyA2KSAvIDUgKiAyNTU7XG5cdGNvbnN0IGIgPSAocmVtICUgNikgLyA1ICogMjU1O1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oZXggPSBmdW5jdGlvbiAoYXJncykge1xuXHRjb25zdCBpbnRlZ2VyID0gKChNYXRoLnJvdW5kKGFyZ3NbMF0pICYgMHhGRikgPDwgMTYpXG5cdFx0KyAoKE1hdGgucm91bmQoYXJnc1sxXSkgJiAweEZGKSA8PCA4KVxuXHRcdCsgKE1hdGgucm91bmQoYXJnc1syXSkgJiAweEZGKTtcblxuXHRjb25zdCBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5oZXgucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Y29uc3QgbWF0Y2ggPSBhcmdzLnRvU3RyaW5nKDE2KS5tYXRjaCgvW2EtZjAtOV17Nn18W2EtZjAtOV17M30vaSk7XG5cdGlmICghbWF0Y2gpIHtcblx0XHRyZXR1cm4gWzAsIDAsIDBdO1xuXHR9XG5cblx0bGV0IGNvbG9yU3RyaW5nID0gbWF0Y2hbMF07XG5cblx0aWYgKG1hdGNoWzBdLmxlbmd0aCA9PT0gMykge1xuXHRcdGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcuc3BsaXQoJycpLm1hcChjaGFyID0+IHtcblx0XHRcdHJldHVybiBjaGFyICsgY2hhcjtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdGNvbnN0IGludGVnZXIgPSBwYXJzZUludChjb2xvclN0cmluZywgMTYpO1xuXHRjb25zdCByID0gKGludGVnZXIgPj4gMTYpICYgMHhGRjtcblx0Y29uc3QgZyA9IChpbnRlZ2VyID4+IDgpICYgMHhGRjtcblx0Y29uc3QgYiA9IGludGVnZXIgJiAweEZGO1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oY2cgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cdGNvbnN0IG1heCA9IE1hdGgubWF4KE1hdGgubWF4KHIsIGcpLCBiKTtcblx0Y29uc3QgbWluID0gTWF0aC5taW4oTWF0aC5taW4ociwgZyksIGIpO1xuXHRjb25zdCBjaHJvbWEgPSAobWF4IC0gbWluKTtcblx0bGV0IGdyYXlzY2FsZTtcblx0bGV0IGh1ZTtcblxuXHRpZiAoY2hyb21hIDwgMSkge1xuXHRcdGdyYXlzY2FsZSA9IG1pbiAvICgxIC0gY2hyb21hKTtcblx0fSBlbHNlIHtcblx0XHRncmF5c2NhbGUgPSAwO1xuXHR9XG5cblx0aWYgKGNocm9tYSA8PSAwKSB7XG5cdFx0aHVlID0gMDtcblx0fSBlbHNlXG5cdGlmIChtYXggPT09IHIpIHtcblx0XHRodWUgPSAoKGcgLSBiKSAvIGNocm9tYSkgJSA2O1xuXHR9IGVsc2Vcblx0aWYgKG1heCA9PT0gZykge1xuXHRcdGh1ZSA9IDIgKyAoYiAtIHIpIC8gY2hyb21hO1xuXHR9IGVsc2Uge1xuXHRcdGh1ZSA9IDQgKyAociAtIGcpIC8gY2hyb21hO1xuXHR9XG5cblx0aHVlIC89IDY7XG5cdGh1ZSAlPSAxO1xuXG5cdHJldHVybiBbaHVlICogMzYwLCBjaHJvbWEgKiAxMDAsIGdyYXlzY2FsZSAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhzbC5oY2cgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IHMgPSBoc2xbMV0gLyAxMDA7XG5cdGNvbnN0IGwgPSBoc2xbMl0gLyAxMDA7XG5cblx0Y29uc3QgYyA9IGwgPCAwLjUgPyAoMi4wICogcyAqIGwpIDogKDIuMCAqIHMgKiAoMS4wIC0gbCkpO1xuXG5cdGxldCBmID0gMDtcblx0aWYgKGMgPCAxLjApIHtcblx0XHRmID0gKGwgLSAwLjUgKiBjKSAvICgxLjAgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHNsWzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHN2LmhjZyA9IGZ1bmN0aW9uIChoc3YpIHtcblx0Y29uc3QgcyA9IGhzdlsxXSAvIDEwMDtcblx0Y29uc3QgdiA9IGhzdlsyXSAvIDEwMDtcblxuXHRjb25zdCBjID0gcyAqIHY7XG5cdGxldCBmID0gMDtcblxuXHRpZiAoYyA8IDEuMCkge1xuXHRcdGYgPSAodiAtIGMpIC8gKDEgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHN2WzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLnJnYiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0Y29uc3QgaCA9IGhjZ1swXSAvIDM2MDtcblx0Y29uc3QgYyA9IGhjZ1sxXSAvIDEwMDtcblx0Y29uc3QgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHRpZiAoYyA9PT0gMC4wKSB7XG5cdFx0cmV0dXJuIFtnICogMjU1LCBnICogMjU1LCBnICogMjU1XTtcblx0fVxuXG5cdGNvbnN0IHB1cmUgPSBbMCwgMCwgMF07XG5cdGNvbnN0IGhpID0gKGggJSAxKSAqIDY7XG5cdGNvbnN0IHYgPSBoaSAlIDE7XG5cdGNvbnN0IHcgPSAxIC0gdjtcblx0bGV0IG1nID0gMDtcblxuXHQvKiBlc2xpbnQtZGlzYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXHRzd2l0Y2ggKE1hdGguZmxvb3IoaGkpKSB7XG5cdFx0Y2FzZSAwOlxuXHRcdFx0cHVyZVswXSA9IDE7IHB1cmVbMV0gPSB2OyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cHVyZVswXSA9IHc7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSB3OyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cHVyZVswXSA9IHY7IHB1cmVbMV0gPSAwOyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IHc7XG5cdH1cblx0LyogZXNsaW50LWVuYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXG5cdG1nID0gKDEuMCAtIGMpICogZztcblxuXHRyZXR1cm4gW1xuXHRcdChjICogcHVyZVswXSArIG1nKSAqIDI1NSxcblx0XHQoYyAqIHB1cmVbMV0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzJdICsgbWcpICogMjU1XG5cdF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc3YgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0Y29uc3QgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHRsZXQgZiA9IDA7XG5cblx0aWYgKHYgPiAwLjApIHtcblx0XHRmID0gYyAvIHY7XG5cdH1cblxuXHRyZXR1cm4gW2hjZ1swXSwgZiAqIDEwMCwgdiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc2wgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0Y29uc3QgbCA9IGcgKiAoMS4wIC0gYykgKyAwLjUgKiBjO1xuXHRsZXQgcyA9IDA7XG5cblx0aWYgKGwgPiAwLjAgJiYgbCA8IDAuNSkge1xuXHRcdHMgPSBjIC8gKDIgKiBsKTtcblx0fSBlbHNlXG5cdGlmIChsID49IDAuNSAmJiBsIDwgMS4wKSB7XG5cdFx0cyA9IGMgLyAoMiAqICgxIC0gbCkpO1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHdiID0gZnVuY3Rpb24gKGhjZykge1xuXHRjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuXHRjb25zdCBnID0gaGNnWzJdIC8gMTAwO1xuXHRjb25zdCB2ID0gYyArIGcgKiAoMS4wIC0gYyk7XG5cdHJldHVybiBbaGNnWzBdLCAodiAtIGMpICogMTAwLCAoMSAtIHYpICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHdiLmhjZyA9IGZ1bmN0aW9uIChod2IpIHtcblx0Y29uc3QgdyA9IGh3YlsxXSAvIDEwMDtcblx0Y29uc3QgYiA9IGh3YlsyXSAvIDEwMDtcblx0Y29uc3QgdiA9IDEgLSBiO1xuXHRjb25zdCBjID0gdiAtIHc7XG5cdGxldCBnID0gMDtcblxuXHRpZiAoYyA8IDEpIHtcblx0XHRnID0gKHYgLSBjKSAvICgxIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2h3YlswXSwgYyAqIDEwMCwgZyAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmFwcGxlLnJnYiA9IGZ1bmN0aW9uIChhcHBsZSkge1xuXHRyZXR1cm4gWyhhcHBsZVswXSAvIDY1NTM1KSAqIDI1NSwgKGFwcGxlWzFdIC8gNjU1MzUpICogMjU1LCAoYXBwbGVbMl0gLyA2NTUzNSkgKiAyNTVdO1xufTtcblxuY29udmVydC5yZ2IuYXBwbGUgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHJldHVybiBbKHJnYlswXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsxXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsyXSAvIDI1NSkgKiA2NTUzNV07XG59O1xuXG5jb252ZXJ0LmdyYXkucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFthcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1XTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oc2wgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gWzAsIDAsIGFyZ3NbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmhzdiA9IGNvbnZlcnQuZ3JheS5oc2w7XG5cbmNvbnZlcnQuZ3JheS5od2IgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gWzAsIDEwMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkuY215ayA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbMCwgMCwgMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkubGFiID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFtncmF5WzBdLCAwLCAwXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oZXggPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRjb25zdCB2YWwgPSBNYXRoLnJvdW5kKGdyYXlbMF0gLyAxMDAgKiAyNTUpICYgMHhGRjtcblx0Y29uc3QgaW50ZWdlciA9ICh2YWwgPDwgMTYpICsgKHZhbCA8PCA4KSArIHZhbDtcblxuXHRjb25zdCBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5yZ2IuZ3JheSA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgdmFsID0gKHJnYlswXSArIHJnYlsxXSArIHJnYlsyXSkgLyAzO1xuXHRyZXR1cm4gW3ZhbCAvIDI1NSAqIDEwMF07XG59O1xuIiwiY29uc3QgY29udmVyc2lvbnMgPSByZXF1aXJlKCcuL2NvbnZlcnNpb25zJyk7XG5jb25zdCByb3V0ZSA9IHJlcXVpcmUoJy4vcm91dGUnKTtcblxuY29uc3QgY29udmVydCA9IHt9O1xuXG5jb25zdCBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cbmZ1bmN0aW9uIHdyYXBSYXcoZm4pIHtcblx0Y29uc3Qgd3JhcHBlZEZuID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcblx0XHRjb25zdCBhcmcwID0gYXJnc1swXTtcblx0XHRpZiAoYXJnMCA9PT0gdW5kZWZpbmVkIHx8IGFyZzAgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmcwO1xuXHRcdH1cblxuXHRcdGlmIChhcmcwLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBhcmcwO1xuXHRcdH1cblxuXHRcdHJldHVybiBmbihhcmdzKTtcblx0fTtcblxuXHQvLyBQcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblx0aWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuXHRcdHdyYXBwZWRGbi5jb252ZXJzaW9uID0gZm4uY29udmVyc2lvbjtcblx0fVxuXG5cdHJldHVybiB3cmFwcGVkRm47XG59XG5cbmZ1bmN0aW9uIHdyYXBSb3VuZGVkKGZuKSB7XG5cdGNvbnN0IHdyYXBwZWRGbiA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG5cdFx0Y29uc3QgYXJnMCA9IGFyZ3NbMF07XG5cblx0XHRpZiAoYXJnMCA9PT0gdW5kZWZpbmVkIHx8IGFyZzAgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmcwO1xuXHRcdH1cblxuXHRcdGlmIChhcmcwLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBhcmcwO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdCA9IGZuKGFyZ3MpO1xuXG5cdFx0Ly8gV2UncmUgYXNzdW1pbmcgdGhlIHJlc3VsdCBpcyBhbiBhcnJheSBoZXJlLlxuXHRcdC8vIHNlZSBub3RpY2UgaW4gY29udmVyc2lvbnMuanM7IGRvbid0IHVzZSBib3ggdHlwZXNcblx0XHQvLyBpbiBjb252ZXJzaW9uIGZ1bmN0aW9ucy5cblx0XHRpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAobGV0IGxlbiA9IHJlc3VsdC5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gTWF0aC5yb3VuZChyZXN1bHRbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Ly8gUHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5tb2RlbHMuZm9yRWFjaChmcm9tTW9kZWwgPT4ge1xuXHRjb252ZXJ0W2Zyb21Nb2RlbF0gPSB7fTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFtmcm9tTW9kZWxdLCAnY2hhbm5lbHMnLCB7dmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0uY2hhbm5lbHN9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbZnJvbU1vZGVsXSwgJ2xhYmVscycsIHt2YWx1ZTogY29udmVyc2lvbnNbZnJvbU1vZGVsXS5sYWJlbHN9KTtcblxuXHRjb25zdCByb3V0ZXMgPSByb3V0ZShmcm9tTW9kZWwpO1xuXHRjb25zdCByb3V0ZU1vZGVscyA9IE9iamVjdC5rZXlzKHJvdXRlcyk7XG5cblx0cm91dGVNb2RlbHMuZm9yRWFjaCh0b01vZGVsID0+IHtcblx0XHRjb25zdCBmbiA9IHJvdXRlc1t0b01vZGVsXTtcblxuXHRcdGNvbnZlcnRbZnJvbU1vZGVsXVt0b01vZGVsXSA9IHdyYXBSb3VuZGVkKGZuKTtcblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0ucmF3ID0gd3JhcFJhdyhmbik7XG5cdH0pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcbiIsImNvbnN0IGNvbnZlcnNpb25zID0gcmVxdWlyZSgnLi9jb252ZXJzaW9ucycpO1xuXG4vKlxuXHRUaGlzIGZ1bmN0aW9uIHJvdXRlcyBhIG1vZGVsIHRvIGFsbCBvdGhlciBtb2RlbHMuXG5cblx0YWxsIGZ1bmN0aW9ucyB0aGF0IGFyZSByb3V0ZWQgaGF2ZSBhIHByb3BlcnR5IGAuY29udmVyc2lvbmAgYXR0YWNoZWRcblx0dG8gdGhlIHJldHVybmVkIHN5bnRoZXRpYyBmdW5jdGlvbi4gVGhpcyBwcm9wZXJ0eSBpcyBhbiBhcnJheVxuXHRvZiBzdHJpbmdzLCBlYWNoIHdpdGggdGhlIHN0ZXBzIGluIGJldHdlZW4gdGhlICdmcm9tJyBhbmQgJ3RvJ1xuXHRjb2xvciBtb2RlbHMgKGluY2x1c2l2ZSkuXG5cblx0Y29udmVyc2lvbnMgdGhhdCBhcmUgbm90IHBvc3NpYmxlIHNpbXBseSBhcmUgbm90IGluY2x1ZGVkLlxuKi9cblxuZnVuY3Rpb24gYnVpbGRHcmFwaCgpIHtcblx0Y29uc3QgZ3JhcGggPSB7fTtcblx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL29iamVjdC1rZXlzLXZzLWZvci1pbi13aXRoLWNsb3N1cmUvM1xuXHRjb25zdCBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cblx0Zm9yIChsZXQgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdGdyYXBoW21vZGVsc1tpXV0gPSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS8xLXZzLWluZmluaXR5XG5cdFx0XHQvLyBtaWNyby1vcHQsIGJ1dCB0aGlzIGlzIHNpbXBsZS5cblx0XHRcdGRpc3RhbmNlOiAtMSxcblx0XHRcdHBhcmVudDogbnVsbFxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JyZWFkdGgtZmlyc3Rfc2VhcmNoXG5mdW5jdGlvbiBkZXJpdmVCRlMoZnJvbU1vZGVsKSB7XG5cdGNvbnN0IGdyYXBoID0gYnVpbGRHcmFwaCgpO1xuXHRjb25zdCBxdWV1ZSA9IFtmcm9tTW9kZWxdOyAvLyBVbnNoaWZ0IC0+IHF1ZXVlIC0+IHBvcFxuXG5cdGdyYXBoW2Zyb21Nb2RlbF0uZGlzdGFuY2UgPSAwO1xuXG5cdHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcblx0XHRjb25zdCBjdXJyZW50ID0gcXVldWUucG9wKCk7XG5cdFx0Y29uc3QgYWRqYWNlbnRzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnNbY3VycmVudF0pO1xuXG5cdFx0Zm9yIChsZXQgbGVuID0gYWRqYWNlbnRzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0Y29uc3QgYWRqYWNlbnQgPSBhZGphY2VudHNbaV07XG5cdFx0XHRjb25zdCBub2RlID0gZ3JhcGhbYWRqYWNlbnRdO1xuXG5cdFx0XHRpZiAobm9kZS5kaXN0YW5jZSA9PT0gLTEpIHtcblx0XHRcdFx0bm9kZS5kaXN0YW5jZSA9IGdyYXBoW2N1cnJlbnRdLmRpc3RhbmNlICsgMTtcblx0XHRcdFx0bm9kZS5wYXJlbnQgPSBjdXJyZW50O1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KGFkamFjZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbmZ1bmN0aW9uIGxpbmsoZnJvbSwgdG8pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChhcmdzKSB7XG5cdFx0cmV0dXJuIHRvKGZyb20oYXJncykpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCkge1xuXHRjb25zdCBwYXRoID0gW2dyYXBoW3RvTW9kZWxdLnBhcmVudCwgdG9Nb2RlbF07XG5cdGxldCBmbiA9IGNvbnZlcnNpb25zW2dyYXBoW3RvTW9kZWxdLnBhcmVudF1bdG9Nb2RlbF07XG5cblx0bGV0IGN1ciA9IGdyYXBoW3RvTW9kZWxdLnBhcmVudDtcblx0d2hpbGUgKGdyYXBoW2N1cl0ucGFyZW50KSB7XG5cdFx0cGF0aC51bnNoaWZ0KGdyYXBoW2N1cl0ucGFyZW50KTtcblx0XHRmbiA9IGxpbmsoY29udmVyc2lvbnNbZ3JhcGhbY3VyXS5wYXJlbnRdW2N1cl0sIGZuKTtcblx0XHRjdXIgPSBncmFwaFtjdXJdLnBhcmVudDtcblx0fVxuXG5cdGZuLmNvbnZlcnNpb24gPSBwYXRoO1xuXHRyZXR1cm4gZm47XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZyb21Nb2RlbCkge1xuXHRjb25zdCBncmFwaCA9IGRlcml2ZUJGUyhmcm9tTW9kZWwpO1xuXHRjb25zdCBjb252ZXJzaW9uID0ge307XG5cblx0Y29uc3QgbW9kZWxzID0gT2JqZWN0LmtleXMoZ3JhcGgpO1xuXHRmb3IgKGxldCBsZW4gPSBtb2RlbHMubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0Y29uc3QgdG9Nb2RlbCA9IG1vZGVsc1tpXTtcblx0XHRjb25zdCBub2RlID0gZ3JhcGhbdG9Nb2RlbF07XG5cblx0XHRpZiAobm9kZS5wYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdC8vIE5vIHBvc3NpYmxlIGNvbnZlcnNpb24sIG9yIHRoaXMgbm9kZSBpcyB0aGUgc291cmNlIG1vZGVsLlxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29udmVyc2lvblt0b01vZGVsXSA9IHdyYXBDb252ZXJzaW9uKHRvTW9kZWwsIGdyYXBoKTtcblx0fVxuXG5cdHJldHVybiBjb252ZXJzaW9uO1xufTtcblxuIiwiJ3VzZSBzdHJpY3QnXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHRcImFsaWNlYmx1ZVwiOiBbMjQwLCAyNDgsIDI1NV0sXHJcblx0XCJhbnRpcXVld2hpdGVcIjogWzI1MCwgMjM1LCAyMTVdLFxyXG5cdFwiYXF1YVwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiYXF1YW1hcmluZVwiOiBbMTI3LCAyNTUsIDIxMl0sXHJcblx0XCJhenVyZVwiOiBbMjQwLCAyNTUsIDI1NV0sXHJcblx0XCJiZWlnZVwiOiBbMjQ1LCAyNDUsIDIyMF0sXHJcblx0XCJiaXNxdWVcIjogWzI1NSwgMjI4LCAxOTZdLFxyXG5cdFwiYmxhY2tcIjogWzAsIDAsIDBdLFxyXG5cdFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwgMjM1LCAyMDVdLFxyXG5cdFwiYmx1ZVwiOiBbMCwgMCwgMjU1XSxcclxuXHRcImJsdWV2aW9sZXRcIjogWzEzOCwgNDMsIDIyNl0sXHJcblx0XCJicm93blwiOiBbMTY1LCA0MiwgNDJdLFxyXG5cdFwiYnVybHl3b29kXCI6IFsyMjIsIDE4NCwgMTM1XSxcclxuXHRcImNhZGV0Ymx1ZVwiOiBbOTUsIDE1OCwgMTYwXSxcclxuXHRcImNoYXJ0cmV1c2VcIjogWzEyNywgMjU1LCAwXSxcclxuXHRcImNob2NvbGF0ZVwiOiBbMjEwLCAxMDUsIDMwXSxcclxuXHRcImNvcmFsXCI6IFsyNTUsIDEyNywgODBdLFxyXG5cdFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwgMTQ5LCAyMzddLFxyXG5cdFwiY29ybnNpbGtcIjogWzI1NSwgMjQ4LCAyMjBdLFxyXG5cdFwiY3JpbXNvblwiOiBbMjIwLCAyMCwgNjBdLFxyXG5cdFwiY3lhblwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiZGFya2JsdWVcIjogWzAsIDAsIDEzOV0sXHJcblx0XCJkYXJrY3lhblwiOiBbMCwgMTM5LCAxMzldLFxyXG5cdFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LCAxMzQsIDExXSxcclxuXHRcImRhcmtncmF5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtncmVlblwiOiBbMCwgMTAwLCAwXSxcclxuXHRcImRhcmtncmV5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtraGFraVwiOiBbMTg5LCAxODMsIDEwN10sXHJcblx0XCJkYXJrbWFnZW50YVwiOiBbMTM5LCAwLCAxMzldLFxyXG5cdFwiZGFya29saXZlZ3JlZW5cIjogWzg1LCAxMDcsIDQ3XSxcclxuXHRcImRhcmtvcmFuZ2VcIjogWzI1NSwgMTQwLCAwXSxcclxuXHRcImRhcmtvcmNoaWRcIjogWzE1MywgNTAsIDIwNF0sXHJcblx0XCJkYXJrcmVkXCI6IFsxMzksIDAsIDBdLFxyXG5cdFwiZGFya3NhbG1vblwiOiBbMjMzLCAxNTAsIDEyMl0sXHJcblx0XCJkYXJrc2VhZ3JlZW5cIjogWzE0MywgMTg4LCAxNDNdLFxyXG5cdFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsIDYxLCAxMzldLFxyXG5cdFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrc2xhdGVncmV5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmt0dXJxdW9pc2VcIjogWzAsIDIwNiwgMjA5XSxcclxuXHRcImRhcmt2aW9sZXRcIjogWzE0OCwgMCwgMjExXSxcclxuXHRcImRlZXBwaW5rXCI6IFsyNTUsIDIwLCAxNDddLFxyXG5cdFwiZGVlcHNreWJsdWVcIjogWzAsIDE5MSwgMjU1XSxcclxuXHRcImRpbWdyYXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZGltZ3JleVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkb2RnZXJibHVlXCI6IFszMCwgMTQ0LCAyNTVdLFxyXG5cdFwiZmlyZWJyaWNrXCI6IFsxNzgsIDM0LCAzNF0sXHJcblx0XCJmbG9yYWx3aGl0ZVwiOiBbMjU1LCAyNTAsIDI0MF0sXHJcblx0XCJmb3Jlc3RncmVlblwiOiBbMzQsIDEzOSwgMzRdLFxyXG5cdFwiZnVjaHNpYVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwiZ2FpbnNib3JvXCI6IFsyMjAsIDIyMCwgMjIwXSxcclxuXHRcImdob3N0d2hpdGVcIjogWzI0OCwgMjQ4LCAyNTVdLFxyXG5cdFwiZ29sZFwiOiBbMjU1LCAyMTUsIDBdLFxyXG5cdFwiZ29sZGVucm9kXCI6IFsyMTgsIDE2NSwgMzJdLFxyXG5cdFwiZ3JheVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJncmVlblwiOiBbMCwgMTI4LCAwXSxcclxuXHRcImdyZWVueWVsbG93XCI6IFsxNzMsIDI1NSwgNDddLFxyXG5cdFwiZ3JleVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJob25leWRld1wiOiBbMjQwLCAyNTUsIDI0MF0sXHJcblx0XCJob3RwaW5rXCI6IFsyNTUsIDEwNSwgMTgwXSxcclxuXHRcImluZGlhbnJlZFwiOiBbMjA1LCA5MiwgOTJdLFxyXG5cdFwiaW5kaWdvXCI6IFs3NSwgMCwgMTMwXSxcclxuXHRcIml2b3J5XCI6IFsyNTUsIDI1NSwgMjQwXSxcclxuXHRcImtoYWtpXCI6IFsyNDAsIDIzMCwgMTQwXSxcclxuXHRcImxhdmVuZGVyXCI6IFsyMzAsIDIzMCwgMjUwXSxcclxuXHRcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwgMjQwLCAyNDVdLFxyXG5cdFwibGF3bmdyZWVuXCI6IFsxMjQsIDI1MiwgMF0sXHJcblx0XCJsZW1vbmNoaWZmb25cIjogWzI1NSwgMjUwLCAyMDVdLFxyXG5cdFwibGlnaHRibHVlXCI6IFsxNzMsIDIxNiwgMjMwXSxcclxuXHRcImxpZ2h0Y29yYWxcIjogWzI0MCwgMTI4LCAxMjhdLFxyXG5cdFwibGlnaHRjeWFuXCI6IFsyMjQsIDI1NSwgMjU1XSxcclxuXHRcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsIDI1MCwgMjEwXSxcclxuXHRcImxpZ2h0Z3JheVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodGdyZWVuXCI6IFsxNDQsIDIzOCwgMTQ0XSxcclxuXHRcImxpZ2h0Z3JleVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodHBpbmtcIjogWzI1NSwgMTgyLCAxOTNdLFxyXG5cdFwibGlnaHRzYWxtb25cIjogWzI1NSwgMTYwLCAxMjJdLFxyXG5cdFwibGlnaHRzZWFncmVlblwiOiBbMzIsIDE3OCwgMTcwXSxcclxuXHRcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDI1MF0sXHJcblx0XCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LCAxOTYsIDIyMl0sXHJcblx0XCJsaWdodHllbGxvd1wiOiBbMjU1LCAyNTUsIDIyNF0sXHJcblx0XCJsaW1lXCI6IFswLCAyNTUsIDBdLFxyXG5cdFwibGltZWdyZWVuXCI6IFs1MCwgMjA1LCA1MF0sXHJcblx0XCJsaW5lblwiOiBbMjUwLCAyNDAsIDIzMF0sXHJcblx0XCJtYWdlbnRhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJtYXJvb25cIjogWzEyOCwgMCwgMF0sXHJcblx0XCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsIDIwNSwgMTcwXSxcclxuXHRcIm1lZGl1bWJsdWVcIjogWzAsIDAsIDIwNV0sXHJcblx0XCJtZWRpdW1vcmNoaWRcIjogWzE4NiwgODUsIDIxMV0sXHJcblx0XCJtZWRpdW1wdXJwbGVcIjogWzE0NywgMTEyLCAyMTldLFxyXG5cdFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLCAxNzksIDExM10sXHJcblx0XCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywgMTA0LCAyMzhdLFxyXG5cdFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsIDI1MCwgMTU0XSxcclxuXHRcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsIDIwOSwgMjA0XSxcclxuXHRcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LCAyMSwgMTMzXSxcclxuXHRcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsIDI1LCAxMTJdLFxyXG5cdFwibWludGNyZWFtXCI6IFsyNDUsIDI1NSwgMjUwXSxcclxuXHRcIm1pc3R5cm9zZVwiOiBbMjU1LCAyMjgsIDIyNV0sXHJcblx0XCJtb2NjYXNpblwiOiBbMjU1LCAyMjgsIDE4MV0sXHJcblx0XCJuYXZham93aGl0ZVwiOiBbMjU1LCAyMjIsIDE3M10sXHJcblx0XCJuYXZ5XCI6IFswLCAwLCAxMjhdLFxyXG5cdFwib2xkbGFjZVwiOiBbMjUzLCAyNDUsIDIzMF0sXHJcblx0XCJvbGl2ZVwiOiBbMTI4LCAxMjgsIDBdLFxyXG5cdFwib2xpdmVkcmFiXCI6IFsxMDcsIDE0MiwgMzVdLFxyXG5cdFwib3JhbmdlXCI6IFsyNTUsIDE2NSwgMF0sXHJcblx0XCJvcmFuZ2VyZWRcIjogWzI1NSwgNjksIDBdLFxyXG5cdFwib3JjaGlkXCI6IFsyMTgsIDExMiwgMjE0XSxcclxuXHRcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwgMjMyLCAxNzBdLFxyXG5cdFwicGFsZWdyZWVuXCI6IFsxNTIsIDI1MSwgMTUyXSxcclxuXHRcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwgMjM4LCAyMzhdLFxyXG5cdFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LCAxMTIsIDE0N10sXHJcblx0XCJwYXBheWF3aGlwXCI6IFsyNTUsIDIzOSwgMjEzXSxcclxuXHRcInBlYWNocHVmZlwiOiBbMjU1LCAyMTgsIDE4NV0sXHJcblx0XCJwZXJ1XCI6IFsyMDUsIDEzMywgNjNdLFxyXG5cdFwicGlua1wiOiBbMjU1LCAxOTIsIDIwM10sXHJcblx0XCJwbHVtXCI6IFsyMjEsIDE2MCwgMjIxXSxcclxuXHRcInBvd2RlcmJsdWVcIjogWzE3NiwgMjI0LCAyMzBdLFxyXG5cdFwicHVycGxlXCI6IFsxMjgsIDAsIDEyOF0sXHJcblx0XCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsIDUxLCAxNTNdLFxyXG5cdFwicmVkXCI6IFsyNTUsIDAsIDBdLFxyXG5cdFwicm9zeWJyb3duXCI6IFsxODgsIDE0MywgMTQzXSxcclxuXHRcInJveWFsYmx1ZVwiOiBbNjUsIDEwNSwgMjI1XSxcclxuXHRcInNhZGRsZWJyb3duXCI6IFsxMzksIDY5LCAxOV0sXHJcblx0XCJzYWxtb25cIjogWzI1MCwgMTI4LCAxMTRdLFxyXG5cdFwic2FuZHlicm93blwiOiBbMjQ0LCAxNjQsIDk2XSxcclxuXHRcInNlYWdyZWVuXCI6IFs0NiwgMTM5LCA4N10sXHJcblx0XCJzZWFzaGVsbFwiOiBbMjU1LCAyNDUsIDIzOF0sXHJcblx0XCJzaWVubmFcIjogWzE2MCwgODIsIDQ1XSxcclxuXHRcInNpbHZlclwiOiBbMTkyLCAxOTIsIDE5Ml0sXHJcblx0XCJza3libHVlXCI6IFsxMzUsIDIwNiwgMjM1XSxcclxuXHRcInNsYXRlYmx1ZVwiOiBbMTA2LCA5MCwgMjA1XSxcclxuXHRcInNsYXRlZ3JheVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbGF0ZWdyZXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic25vd1wiOiBbMjU1LCAyNTAsIDI1MF0sXHJcblx0XCJzcHJpbmdncmVlblwiOiBbMCwgMjU1LCAxMjddLFxyXG5cdFwic3RlZWxibHVlXCI6IFs3MCwgMTMwLCAxODBdLFxyXG5cdFwidGFuXCI6IFsyMTAsIDE4MCwgMTQwXSxcclxuXHRcInRlYWxcIjogWzAsIDEyOCwgMTI4XSxcclxuXHRcInRoaXN0bGVcIjogWzIxNiwgMTkxLCAyMTZdLFxyXG5cdFwidG9tYXRvXCI6IFsyNTUsIDk5LCA3MV0sXHJcblx0XCJ0dXJxdW9pc2VcIjogWzY0LCAyMjQsIDIwOF0sXHJcblx0XCJ2aW9sZXRcIjogWzIzOCwgMTMwLCAyMzhdLFxyXG5cdFwid2hlYXRcIjogWzI0NSwgMjIyLCAxNzldLFxyXG5cdFwid2hpdGVcIjogWzI1NSwgMjU1LCAyNTVdLFxyXG5cdFwid2hpdGVzbW9rZVwiOiBbMjQ1LCAyNDUsIDI0NV0sXHJcblx0XCJ5ZWxsb3dcIjogWzI1NSwgMjU1LCAwXSxcclxuXHRcInllbGxvd2dyZWVuXCI6IFsxNTQsIDIwNSwgNTBdXHJcbn07XHJcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5tYWtlRGF0YVVyaVRvQnVmZmVyID0gdm9pZCAwO1xuLyoqXG4gKiBSZXR1cm5zIGEgYEJ1ZmZlcmAgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gZGF0YSBVUkkgYHVyaWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVyaSBEYXRhIFVSSSB0byB0dXJuIGludG8gYSBCdWZmZXIgaW5zdGFuY2VcbiAqL1xuY29uc3QgbWFrZURhdGFVcmlUb0J1ZmZlciA9IChjb252ZXJ0KSA9PiAodXJpKSA9PiB7XG4gICAgdXJpID0gU3RyaW5nKHVyaSk7XG4gICAgaWYgKCEvXmRhdGE6L2kudGVzdCh1cmkpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2B1cmlgIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIERhdGEgVVJJIChtdXN0IGJlZ2luIHdpdGggXCJkYXRhOlwiKScpO1xuICAgIH1cbiAgICAvLyBzdHJpcCBuZXdsaW5lc1xuICAgIHVyaSA9IHVyaS5yZXBsYWNlKC9cXHI/XFxuL2csICcnKTtcbiAgICAvLyBzcGxpdCB0aGUgVVJJIHVwIGludG8gdGhlIFwibWV0YWRhdGFcIiBhbmQgdGhlIFwiZGF0YVwiIHBvcnRpb25zXG4gICAgY29uc3QgZmlyc3RDb21tYSA9IHVyaS5pbmRleE9mKCcsJyk7XG4gICAgaWYgKGZpcnN0Q29tbWEgPT09IC0xIHx8IGZpcnN0Q29tbWEgPD0gNCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYWxmb3JtZWQgZGF0YTogVVJJJyk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSB0aGUgXCJkYXRhOlwiIHNjaGVtZSBhbmQgcGFyc2UgdGhlIG1ldGFkYXRhXG4gICAgY29uc3QgbWV0YSA9IHVyaS5zdWJzdHJpbmcoNSwgZmlyc3RDb21tYSkuc3BsaXQoJzsnKTtcbiAgICBsZXQgY2hhcnNldCA9ICcnO1xuICAgIGxldCBiYXNlNjQgPSBmYWxzZTtcbiAgICBjb25zdCB0eXBlID0gbWV0YVswXSB8fCAndGV4dC9wbGFpbic7XG4gICAgbGV0IHR5cGVGdWxsID0gdHlwZTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG1ldGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKG1ldGFbaV0gPT09ICdiYXNlNjQnKSB7XG4gICAgICAgICAgICBiYXNlNjQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1ldGFbaV0pIHtcbiAgICAgICAgICAgIHR5cGVGdWxsICs9IGA7JHttZXRhW2ldfWA7XG4gICAgICAgICAgICBpZiAobWV0YVtpXS5pbmRleE9mKCdjaGFyc2V0PScpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY2hhcnNldCA9IG1ldGFbaV0uc3Vic3RyaW5nKDgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGRlZmF1bHRzIHRvIFVTLUFTQ0lJIG9ubHkgaWYgdHlwZSBpcyBub3QgcHJvdmlkZWRcbiAgICBpZiAoIW1ldGFbMF0gJiYgIWNoYXJzZXQubGVuZ3RoKSB7XG4gICAgICAgIHR5cGVGdWxsICs9ICc7Y2hhcnNldD1VUy1BU0NJSSc7XG4gICAgICAgIGNoYXJzZXQgPSAnVVMtQVNDSUknO1xuICAgIH1cbiAgICAvLyBnZXQgdGhlIGVuY29kZWQgZGF0YSBwb3J0aW9uIGFuZCBkZWNvZGUgVVJJLWVuY29kZWQgY2hhcnNcbiAgICBjb25zdCBkYXRhID0gdW5lc2NhcGUodXJpLnN1YnN0cmluZyhmaXJzdENvbW1hICsgMSkpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IGJhc2U2NCA/IGNvbnZlcnQuYmFzZTY0VG9BcnJheUJ1ZmZlcihkYXRhKSA6IGNvbnZlcnQuc3RyaW5nVG9CdWZmZXIoZGF0YSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdHlwZUZ1bGwsXG4gICAgICAgIGNoYXJzZXQsXG4gICAgICAgIGJ1ZmZlcixcbiAgICB9O1xufTtcbmV4cG9ydHMubWFrZURhdGFVcmlUb0J1ZmZlciA9IG1ha2VEYXRhVXJpVG9CdWZmZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21tb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRhdGFVcmlUb0J1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IGNvbW1vbl8xID0gcmVxdWlyZShcIi4vY29tbW9uXCIpO1xuZnVuY3Rpb24gbm9kZUJ1ZmZlcnRvQXJyYXlCdWZmZXIobm9kZUJ1Zikge1xuICAgIGlmIChub2RlQnVmLmJ5dGVMZW5ndGggPT09IG5vZGVCdWYuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVCdWYuYnVmZmVyOyAvLyBsYXJnZSBzdHJpbmdzIG1heSBnZXQgdGhlaXIgb3duIG1lbW9yeSBhbGxvY2F0aW9uXG4gICAgfVxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihub2RlQnVmLmJ5dGVMZW5ndGgpO1xuICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIHZpZXcuc2V0KG5vZGVCdWYpO1xuICAgIHJldHVybiBidWZmZXI7XG59XG5mdW5jdGlvbiBiYXNlNjRUb0FycmF5QnVmZmVyKGJhc2U2NCkge1xuICAgIHJldHVybiBub2RlQnVmZmVydG9BcnJheUJ1ZmZlcihCdWZmZXIuZnJvbShiYXNlNjQsICdiYXNlNjQnKSk7XG59XG5mdW5jdGlvbiBzdHJpbmdUb0J1ZmZlcihzdHIpIHtcbiAgICByZXR1cm4gbm9kZUJ1ZmZlcnRvQXJyYXlCdWZmZXIoQnVmZmVyLmZyb20oc3RyLCAnYXNjaWknKSk7XG59XG4vKipcbiAqIFJldHVybnMgYSBgQnVmZmVyYCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBkYXRhIFVSSSBgdXJpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJpIERhdGEgVVJJIHRvIHR1cm4gaW50byBhIEJ1ZmZlciBpbnN0YW5jZVxuICovXG5leHBvcnRzLmRhdGFVcmlUb0J1ZmZlciA9ICgwLCBjb21tb25fMS5tYWtlRGF0YVVyaVRvQnVmZmVyKSh7IHN0cmluZ1RvQnVmZmVyLCBiYXNlNjRUb0FycmF5QnVmZmVyIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9kZS5qcy5tYXAiLCIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSBsb2NhbHN0b3JhZ2UoKTtcbmV4cG9ydHMuZGVzdHJveSA9ICgoKSA9PiB7XG5cdGxldCB3YXJuZWQgPSBmYWxzZTtcblxuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGlmICghd2FybmVkKSB7XG5cdFx0XHR3YXJuZWQgPSB0cnVlO1xuXHRcdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdFx0fVxuXHR9O1xufSkoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG5cdCcjMDAwMENDJyxcblx0JyMwMDAwRkYnLFxuXHQnIzAwMzNDQycsXG5cdCcjMDAzM0ZGJyxcblx0JyMwMDY2Q0MnLFxuXHQnIzAwNjZGRicsXG5cdCcjMDA5OUNDJyxcblx0JyMwMDk5RkYnLFxuXHQnIzAwQ0MwMCcsXG5cdCcjMDBDQzMzJyxcblx0JyMwMENDNjYnLFxuXHQnIzAwQ0M5OScsXG5cdCcjMDBDQ0NDJyxcblx0JyMwMENDRkYnLFxuXHQnIzMzMDBDQycsXG5cdCcjMzMwMEZGJyxcblx0JyMzMzMzQ0MnLFxuXHQnIzMzMzNGRicsXG5cdCcjMzM2NkNDJyxcblx0JyMzMzY2RkYnLFxuXHQnIzMzOTlDQycsXG5cdCcjMzM5OUZGJyxcblx0JyMzM0NDMDAnLFxuXHQnIzMzQ0MzMycsXG5cdCcjMzNDQzY2Jyxcblx0JyMzM0NDOTknLFxuXHQnIzMzQ0NDQycsXG5cdCcjMzNDQ0ZGJyxcblx0JyM2NjAwQ0MnLFxuXHQnIzY2MDBGRicsXG5cdCcjNjYzM0NDJyxcblx0JyM2NjMzRkYnLFxuXHQnIzY2Q0MwMCcsXG5cdCcjNjZDQzMzJyxcblx0JyM5OTAwQ0MnLFxuXHQnIzk5MDBGRicsXG5cdCcjOTkzM0NDJyxcblx0JyM5OTMzRkYnLFxuXHQnIzk5Q0MwMCcsXG5cdCcjOTlDQzMzJyxcblx0JyNDQzAwMDAnLFxuXHQnI0NDMDAzMycsXG5cdCcjQ0MwMDY2Jyxcblx0JyNDQzAwOTknLFxuXHQnI0NDMDBDQycsXG5cdCcjQ0MwMEZGJyxcblx0JyNDQzMzMDAnLFxuXHQnI0NDMzMzMycsXG5cdCcjQ0MzMzY2Jyxcblx0JyNDQzMzOTknLFxuXHQnI0NDMzNDQycsXG5cdCcjQ0MzM0ZGJyxcblx0JyNDQzY2MDAnLFxuXHQnI0NDNjYzMycsXG5cdCcjQ0M5OTAwJyxcblx0JyNDQzk5MzMnLFxuXHQnI0NDQ0MwMCcsXG5cdCcjQ0NDQzMzJyxcblx0JyNGRjAwMDAnLFxuXHQnI0ZGMDAzMycsXG5cdCcjRkYwMDY2Jyxcblx0JyNGRjAwOTknLFxuXHQnI0ZGMDBDQycsXG5cdCcjRkYwMEZGJyxcblx0JyNGRjMzMDAnLFxuXHQnI0ZGMzMzMycsXG5cdCcjRkYzMzY2Jyxcblx0JyNGRjMzOTknLFxuXHQnI0ZGMzNDQycsXG5cdCcjRkYzM0ZGJyxcblx0JyNGRjY2MDAnLFxuXHQnI0ZGNjYzMycsXG5cdCcjRkY5OTAwJyxcblx0JyNGRjk5MzMnLFxuXHQnI0ZGQ0MwMCcsXG5cdCcjRkZDQzMzJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHQvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG5cdC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG5cdC8vIGV4cGxpY2l0bHlcblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmICh3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHdpbmRvdy5wcm9jZXNzLl9fbndqcykpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0IGNvbG9ycy5cblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVxcLyhcXGQrKS8pKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0bGV0IG07XG5cblx0Ly8gSXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcblx0Ly8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcblx0cmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG5cdFx0Ly8gSXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuXHRcdCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG5cdFx0Ly8gSXMgZmlyZWZveCA+PSB2MzE/XG5cdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgKG0gPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSkgJiYgcGFyc2VJbnQobVsxXSwgMTApID49IDMxKSB8fFxuXHRcdC8vIERvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuXHRhcmdzWzBdID0gKHRoaXMudXNlQ29sb3JzID8gJyVjJyA6ICcnKSArXG5cdFx0dGhpcy5uYW1lc3BhY2UgK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKSArXG5cdFx0YXJnc1swXSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyVjICcgOiAnICcpICtcblx0XHQnKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG5cdGlmICghdGhpcy51c2VDb2xvcnMpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjID0gJ2NvbG9yOiAnICsgdGhpcy5jb2xvcjtcblx0YXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0Jyk7XG5cblx0Ly8gVGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcblx0Ly8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuXHQvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cblx0bGV0IGluZGV4ID0gMDtcblx0bGV0IGxhc3RDID0gMDtcblx0YXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIG1hdGNoID0+IHtcblx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aW5kZXgrKztcblx0XHRpZiAobWF0Y2ggPT09ICclYycpIHtcblx0XHRcdC8vIFdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuXHRcdFx0Ly8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcblx0XHRcdGxhc3RDID0gaW5kZXg7XG5cdFx0fVxuXHR9KTtcblxuXHRhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG59XG5cbi8qKlxuICogSW52b2tlcyBgY29uc29sZS5kZWJ1ZygpYCB3aGVuIGF2YWlsYWJsZS5cbiAqIE5vLW9wIHdoZW4gYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqIElmIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYXZhaWxhYmxlLCBmYWxscyBiYWNrXG4gKiB0byBgY29uc29sZS5sb2dgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbmV4cG9ydHMubG9nID0gY29uc29sZS5kZWJ1ZyB8fCBjb25zb2xlLmxvZyB8fCAoKCkgPT4ge30pO1xuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdHRyeSB7XG5cdFx0aWYgKG5hbWVzcGFjZXMpIHtcblx0XHRcdGV4cG9ydHMuc3RvcmFnZS5zZXRJdGVtKCdkZWJ1ZycsIG5hbWVzcGFjZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcblx0XHR9XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGxvYWQoKSB7XG5cdGxldCByO1xuXHR0cnkge1xuXHRcdHIgPSBleHBvcnRzLnN0b3JhZ2UuZ2V0SXRlbSgnZGVidWcnKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cblxuXHQvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG5cdGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuXHRcdHIgPSBwcm9jZXNzLmVudi5ERUJVRztcblx0fVxuXG5cdHJldHVybiByO1xufVxuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpIHtcblx0dHJ5IHtcblx0XHQvLyBUVk1MS2l0IChBcHBsZSBUViBKUyBSdW50aW1lKSBkb2VzIG5vdCBoYXZlIGEgd2luZG93IG9iamVjdCwganVzdCBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0XG5cdFx0Ly8gVGhlIEJyb3dzZXIgYWxzbyBoYXMgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dC5cblx0XHRyZXR1cm4gbG9jYWxTdG9yYWdlO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5mb3JtYXR0ZXJzLmogPSBmdW5jdGlvbiAodikge1xuXHR0cnkge1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRyZXR1cm4gJ1tVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAnICsgZXJyb3IubWVzc2FnZTtcblx0fVxufTtcbiIsIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICovXG5cbmZ1bmN0aW9uIHNldHVwKGVudikge1xuXHRjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5kZWZhdWx0ID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmNvZXJjZSA9IGNvZXJjZTtcblx0Y3JlYXRlRGVidWcuZGlzYWJsZSA9IGRpc2FibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZSA9IGVuYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdGNyZWF0ZURlYnVnLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblx0Y3JlYXRlRGVidWcuZGVzdHJveSA9IGRlc3Ryb3k7XG5cblx0T2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0Y3JlYXRlRGVidWdba2V5XSA9IGVudltrZXldO1xuXHR9KTtcblxuXHQvKipcblx0KiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cblx0Ki9cblxuXHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdC8qKlxuXHQqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cblx0KlxuXHQqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cblx0Ki9cblx0Y3JlYXRlRGVidWcuZm9ybWF0dGVycyA9IHt9O1xuXG5cdC8qKlxuXHQqIFNlbGVjdHMgYSBjb2xvciBmb3IgYSBkZWJ1ZyBuYW1lc3BhY2Vcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugc3RyaW5nIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXHRcdGxldCBuYW1lc3BhY2VzQ2FjaGU7XG5cdFx0bGV0IGVuYWJsZWRDYWNoZTtcblxuXHRcdGZ1bmN0aW9uIGRlYnVnKC4uLmFyZ3MpIHtcblx0XHRcdC8vIERpc2FibGVkP1xuXHRcdFx0aWYgKCFkZWJ1Zy5lbmFibGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2VsZiA9IGRlYnVnO1xuXG5cdFx0XHQvLyBTZXQgYGRpZmZgIHRpbWVzdGFtcFxuXHRcdFx0Y29uc3QgY3VyciA9IE51bWJlcihuZXcgRGF0ZSgpKTtcblx0XHRcdGNvbnN0IG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcblx0XHRcdHNlbGYuZGlmZiA9IG1zO1xuXHRcdFx0c2VsZi5wcmV2ID0gcHJldlRpbWU7XG5cdFx0XHRzZWxmLmN1cnIgPSBjdXJyO1xuXHRcdFx0cHJldlRpbWUgPSBjdXJyO1xuXG5cdFx0XHRhcmdzWzBdID0gY3JlYXRlRGVidWcuY29lcmNlKGFyZ3NbMF0pO1xuXG5cdFx0XHRpZiAodHlwZW9mIGFyZ3NbMF0gIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdC8vIEFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG5cdFx0XHRcdGFyZ3MudW5zaGlmdCgnJU8nKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgKG1hdGNoLCBmb3JtYXQpID0+IHtcblx0XHRcdFx0Ly8gSWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuXHRcdFx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdFx0XHRyZXR1cm4gJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlciA9IGNyZWF0ZURlYnVnLmZvcm1hdHRlcnNbZm9ybWF0XTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRjb25zdCB2YWwgPSBhcmdzW2luZGV4XTtcblx0XHRcdFx0XHRtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cblx0XHRcdFx0XHQvLyBOb3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG5cdFx0XHRcdFx0YXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHRcdGluZGV4LS07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG5cdFx0XHRjcmVhdGVEZWJ1Zy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cblx0XHRcdGNvbnN0IGxvZ0ZuID0gc2VsZi5sb2cgfHwgY3JlYXRlRGVidWcubG9nO1xuXHRcdFx0bG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cdFx0fVxuXG5cdFx0ZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXHRcdGRlYnVnLnVzZUNvbG9ycyA9IGNyZWF0ZURlYnVnLnVzZUNvbG9ycygpO1xuXHRcdGRlYnVnLmNvbG9yID0gY3JlYXRlRGVidWcuc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblx0XHRkZWJ1Zy5leHRlbmQgPSBleHRlbmQ7XG5cdFx0ZGVidWcuZGVzdHJveSA9IGNyZWF0ZURlYnVnLmRlc3Ryb3k7IC8vIFhYWCBUZW1wb3JhcnkuIFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGRlYnVnLCAnZW5hYmxlZCcsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdGlmIChlbmFibGVPdmVycmlkZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiBlbmFibGVPdmVycmlkZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobmFtZXNwYWNlc0NhY2hlICE9PSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzKSB7XG5cdFx0XHRcdFx0bmFtZXNwYWNlc0NhY2hlID0gY3JlYXRlRGVidWcubmFtZXNwYWNlcztcblx0XHRcdFx0XHRlbmFibGVkQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5lbmFibGVkKG5hbWVzcGFjZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZW5hYmxlZENhY2hlO1xuXHRcdFx0fSxcblx0XHRcdHNldDogdiA9PiB7XG5cdFx0XHRcdGVuYWJsZU92ZXJyaWRlID0gdjtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG5cdFx0aWYgKHR5cGVvZiBjcmVhdGVEZWJ1Zy5pbml0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjcmVhdGVEZWJ1Zy5pbml0KGRlYnVnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVidWc7XG5cdH1cblxuXHRmdW5jdGlvbiBleHRlbmQobmFtZXNwYWNlLCBkZWxpbWl0ZXIpIHtcblx0XHRjb25zdCBuZXdEZWJ1ZyA9IGNyZWF0ZURlYnVnKHRoaXMubmFtZXNwYWNlICsgKHR5cGVvZiBkZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gJzonIDogZGVsaW1pdGVyKSArIG5hbWVzcGFjZSk7XG5cdFx0bmV3RGVidWcubG9nID0gdGhpcy5sb2c7XG5cdFx0cmV0dXJuIG5ld0RlYnVnO1xuXHR9XG5cblx0LyoqXG5cdCogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuXHQqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG5cdFx0Y3JlYXRlRGVidWcuc2F2ZShuYW1lc3BhY2VzKTtcblx0XHRjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlcztcblxuXHRcdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdFx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHRcdGxldCBpO1xuXHRcdGNvbnN0IHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcblx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmICghc3BsaXRbaV0pIHtcblx0XHRcdFx0Ly8gaWdub3JlIGVtcHR5IHN0cmluZ3Ncblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuXG5cdFx0XHRpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnNsaWNlKDEpICsgJyQnKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcyArICckJykpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuXHQqXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZGlzYWJsZSgpIHtcblx0XHRjb25zdCBuYW1lc3BhY2VzID0gW1xuXHRcdFx0Li4uY3JlYXRlRGVidWcubmFtZXMubWFwKHRvTmFtZXNwYWNlKSxcblx0XHRcdC4uLmNyZWF0ZURlYnVnLnNraXBzLm1hcCh0b05hbWVzcGFjZSkubWFwKG5hbWVzcGFjZSA9PiAnLScgKyBuYW1lc3BhY2UpXG5cdFx0XS5qb2luKCcsJyk7XG5cdFx0Y3JlYXRlRGVidWcuZW5hYmxlKCcnKTtcblx0XHRyZXR1cm4gbmFtZXNwYWNlcztcblx0fVxuXG5cdC8qKlxuXHQqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdCogQHJldHVybiB7Qm9vbGVhbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcblx0XHRpZiAobmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnKicpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGxldCBpO1xuXHRcdGxldCBsZW47XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLm5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcubmFtZXNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0KiBDb252ZXJ0IHJlZ2V4cCB0byBuYW1lc3BhY2Vcblx0KlxuXHQqIEBwYXJhbSB7UmVnRXhwfSByZWd4ZXBcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiB0b05hbWVzcGFjZShyZWdleHApIHtcblx0XHRyZXR1cm4gcmVnZXhwLnRvU3RyaW5nKClcblx0XHRcdC5zdWJzdHJpbmcoMiwgcmVnZXhwLnRvU3RyaW5nKCkubGVuZ3RoIC0gMilcblx0XHRcdC5yZXBsYWNlKC9cXC5cXCpcXD8kLywgJyonKTtcblx0fVxuXG5cdC8qKlxuXHQqIENvZXJjZSBgdmFsYC5cblx0KlxuXHQqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuXHQqIEByZXR1cm4ge01peGVkfVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBjb2VyY2UodmFsKSB7XG5cdFx0aWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHRyZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCogWFhYIERPIE5PVCBVU0UuIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc3R1YiBmdW5jdGlvbi5cblx0KiBYWFggSXQgV0lMTCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cdCovXG5cdGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG5cdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdH1cblxuXHRjcmVhdGVEZWJ1Zy5lbmFibGUoY3JlYXRlRGVidWcubG9hZCgpKTtcblxuXHRyZXR1cm4gY3JlYXRlRGVidWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0dXA7XG4iLCIvKipcbiAqIERldGVjdCBFbGVjdHJvbiByZW5kZXJlciAvIG53anMgcHJvY2Vzcywgd2hpY2ggaXMgbm9kZSwgYnV0IHdlIHNob3VsZFxuICogdHJlYXQgYXMgYSBicm93c2VyLlxuICovXG5cbmlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHByb2Nlc3MuYnJvd3NlciA9PT0gdHJ1ZSB8fCBwcm9jZXNzLl9fbndqcykge1xuXHRtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYnJvd3Nlci5qcycpO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL25vZGUuanMnKTtcbn1cbiIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLmRlc3Ryb3kgPSB1dGlsLmRlcHJlY2F0ZShcblx0KCkgPT4ge30sXG5cdCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJ1xuKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbNiwgMiwgMywgNCwgNSwgMV07XG5cbnRyeSB7XG5cdC8vIE9wdGlvbmFsIGRlcGVuZGVuY3kgKGFzIGluLCBkb2Vzbid0IG5lZWQgdG8gYmUgaW5zdGFsbGVkLCBOT1QgbGlrZSBvcHRpb25hbERlcGVuZGVuY2llcyBpbiBwYWNrYWdlLmpzb24pXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcblx0Y29uc3Qgc3VwcG9ydHNDb2xvciA9IHJlcXVpcmUoJ3N1cHBvcnRzLWNvbG9yJyk7XG5cblx0aWYgKHN1cHBvcnRzQ29sb3IgJiYgKHN1cHBvcnRzQ29sb3Iuc3RkZXJyIHx8IHN1cHBvcnRzQ29sb3IpLmxldmVsID49IDIpIHtcblx0XHRleHBvcnRzLmNvbG9ycyA9IFtcblx0XHRcdDIwLFxuXHRcdFx0MjEsXG5cdFx0XHQyNixcblx0XHRcdDI3LFxuXHRcdFx0MzIsXG5cdFx0XHQzMyxcblx0XHRcdDM4LFxuXHRcdFx0MzksXG5cdFx0XHQ0MCxcblx0XHRcdDQxLFxuXHRcdFx0NDIsXG5cdFx0XHQ0Myxcblx0XHRcdDQ0LFxuXHRcdFx0NDUsXG5cdFx0XHQ1Nixcblx0XHRcdDU3LFxuXHRcdFx0NjIsXG5cdFx0XHQ2Myxcblx0XHRcdDY4LFxuXHRcdFx0NjksXG5cdFx0XHQ3NCxcblx0XHRcdDc1LFxuXHRcdFx0NzYsXG5cdFx0XHQ3Nyxcblx0XHRcdDc4LFxuXHRcdFx0NzksXG5cdFx0XHQ4MCxcblx0XHRcdDgxLFxuXHRcdFx0OTIsXG5cdFx0XHQ5Myxcblx0XHRcdDk4LFxuXHRcdFx0OTksXG5cdFx0XHQxMTIsXG5cdFx0XHQxMTMsXG5cdFx0XHQxMjgsXG5cdFx0XHQxMjksXG5cdFx0XHQxMzQsXG5cdFx0XHQxMzUsXG5cdFx0XHQxNDgsXG5cdFx0XHQxNDksXG5cdFx0XHQxNjAsXG5cdFx0XHQxNjEsXG5cdFx0XHQxNjIsXG5cdFx0XHQxNjMsXG5cdFx0XHQxNjQsXG5cdFx0XHQxNjUsXG5cdFx0XHQxNjYsXG5cdFx0XHQxNjcsXG5cdFx0XHQxNjgsXG5cdFx0XHQxNjksXG5cdFx0XHQxNzAsXG5cdFx0XHQxNzEsXG5cdFx0XHQxNzIsXG5cdFx0XHQxNzMsXG5cdFx0XHQxNzgsXG5cdFx0XHQxNzksXG5cdFx0XHQxODQsXG5cdFx0XHQxODUsXG5cdFx0XHQxOTYsXG5cdFx0XHQxOTcsXG5cdFx0XHQxOTgsXG5cdFx0XHQxOTksXG5cdFx0XHQyMDAsXG5cdFx0XHQyMDEsXG5cdFx0XHQyMDIsXG5cdFx0XHQyMDMsXG5cdFx0XHQyMDQsXG5cdFx0XHQyMDUsXG5cdFx0XHQyMDYsXG5cdFx0XHQyMDcsXG5cdFx0XHQyMDgsXG5cdFx0XHQyMDksXG5cdFx0XHQyMTQsXG5cdFx0XHQyMTUsXG5cdFx0XHQyMjAsXG5cdFx0XHQyMjFcblx0XHRdO1xuXHR9XG59IGNhdGNoIChlcnJvcikge1xuXHQvLyBTd2FsbG93IC0gd2Ugb25seSBjYXJlIGlmIGBzdXBwb3J0cy1jb2xvcmAgaXMgYXZhaWxhYmxlOyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUuXG59XG5cbi8qKlxuICogQnVpbGQgdXAgdGhlIGRlZmF1bHQgYGluc3BlY3RPcHRzYCBvYmplY3QgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqICAgJCBERUJVR19DT0xPUlM9bm8gREVCVUdfREVQVEg9MTAgREVCVUdfU0hPV19ISURERU49ZW5hYmxlZCBub2RlIHNjcmlwdC5qc1xuICovXG5cbmV4cG9ydHMuaW5zcGVjdE9wdHMgPSBPYmplY3Qua2V5cyhwcm9jZXNzLmVudikuZmlsdGVyKGtleSA9PiB7XG5cdHJldHVybiAvXmRlYnVnXy9pLnRlc3Qoa2V5KTtcbn0pLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcblx0Ly8gQ2FtZWwtY2FzZVxuXHRjb25zdCBwcm9wID0ga2V5XG5cdFx0LnN1YnN0cmluZyg2KVxuXHRcdC50b0xvd2VyQ2FzZSgpXG5cdFx0LnJlcGxhY2UoL18oW2Etel0pL2csIChfLCBrKSA9PiB7XG5cdFx0XHRyZXR1cm4gay50b1VwcGVyQ2FzZSgpO1xuXHRcdH0pO1xuXG5cdC8vIENvZXJjZSBzdHJpbmcgdmFsdWUgaW50byBKUyB2YWx1ZVxuXHRsZXQgdmFsID0gcHJvY2Vzcy5lbnZba2V5XTtcblx0aWYgKC9eKHllc3xvbnx0cnVlfGVuYWJsZWQpJC9pLnRlc3QodmFsKSkge1xuXHRcdHZhbCA9IHRydWU7XG5cdH0gZWxzZSBpZiAoL14obm98b2ZmfGZhbHNlfGRpc2FibGVkKSQvaS50ZXN0KHZhbCkpIHtcblx0XHR2YWwgPSBmYWxzZTtcblx0fSBlbHNlIGlmICh2YWwgPT09ICdudWxsJykge1xuXHRcdHZhbCA9IG51bGw7XG5cdH0gZWxzZSB7XG5cdFx0dmFsID0gTnVtYmVyKHZhbCk7XG5cdH1cblxuXHRvYmpbcHJvcF0gPSB2YWw7XG5cdHJldHVybiBvYmo7XG59LCB7fSk7XG5cbi8qKlxuICogSXMgc3Rkb3V0IGEgVFRZPyBDb2xvcmVkIG91dHB1dCBpcyBlbmFibGVkIHdoZW4gYHRydWVgLlxuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0cmV0dXJuICdjb2xvcnMnIGluIGV4cG9ydHMuaW5zcGVjdE9wdHMgP1xuXHRcdEJvb2xlYW4oZXhwb3J0cy5pbnNwZWN0T3B0cy5jb2xvcnMpIDpcblx0XHR0dHkuaXNhdHR5KHByb2Nlc3Muc3RkZXJyLmZkKTtcbn1cblxuLyoqXG4gKiBBZGRzIEFOU0kgY29sb3IgZXNjYXBlIGNvZGVzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0Y29uc3Qge25hbWVzcGFjZTogbmFtZSwgdXNlQ29sb3JzfSA9IHRoaXM7XG5cblx0aWYgKHVzZUNvbG9ycykge1xuXHRcdGNvbnN0IGMgPSB0aGlzLmNvbG9yO1xuXHRcdGNvbnN0IGNvbG9yQ29kZSA9ICdcXHUwMDFCWzMnICsgKGMgPCA4ID8gYyA6ICc4OzU7JyArIGMpO1xuXHRcdGNvbnN0IHByZWZpeCA9IGAgICR7Y29sb3JDb2RlfTsxbSR7bmFtZX0gXFx1MDAxQlswbWA7XG5cblx0XHRhcmdzWzBdID0gcHJlZml4ICsgYXJnc1swXS5zcGxpdCgnXFxuJykuam9pbignXFxuJyArIHByZWZpeCk7XG5cdFx0YXJncy5wdXNoKGNvbG9yQ29kZSArICdtKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpICsgJ1xcdTAwMUJbMG0nKTtcblx0fSBlbHNlIHtcblx0XHRhcmdzWzBdID0gZ2V0RGF0ZSgpICsgbmFtZSArICcgJyArIGFyZ3NbMF07XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZSgpIHtcblx0aWYgKGV4cG9ydHMuaW5zcGVjdE9wdHMuaGlkZURhdGUpIHtcblx0XHRyZXR1cm4gJyc7XG5cdH1cblx0cmV0dXJuIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSArICcgJztcbn1cblxuLyoqXG4gKiBJbnZva2VzIGB1dGlsLmZvcm1hdFdpdGhPcHRpb25zKClgIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIHdyaXRlcyB0byBzdGRlcnIuXG4gKi9cblxuZnVuY3Rpb24gbG9nKC4uLmFyZ3MpIHtcblx0cmV0dXJuIHByb2Nlc3Muc3RkZXJyLndyaXRlKHV0aWwuZm9ybWF0V2l0aE9wdGlvbnMoZXhwb3J0cy5pbnNwZWN0T3B0cywgLi4uYXJncykgKyAnXFxuJyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcblx0aWYgKG5hbWVzcGFjZXMpIHtcblx0XHRwcm9jZXNzLmVudi5ERUJVRyA9IG5hbWVzcGFjZXM7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSWYgeW91IHNldCBhIHByb2Nlc3MuZW52IGZpZWxkIHRvIG51bGwgb3IgdW5kZWZpbmVkLCBpdCBnZXRzIGNhc3QgdG8gdGhlXG5cdFx0Ly8gc3RyaW5nICdudWxsJyBvciAndW5kZWZpbmVkJy4gSnVzdCBkZWxldGUgaW5zdGVhZC5cblx0XHRkZWxldGUgcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRyZXR1cm4gcHJvY2Vzcy5lbnYuREVCVUc7XG59XG5cbi8qKlxuICogSW5pdCBsb2dpYyBmb3IgYGRlYnVnYCBpbnN0YW5jZXMuXG4gKlxuICogQ3JlYXRlIGEgbmV3IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGluIGNhc2UgYHVzZUNvbG9yc2AgaXMgc2V0XG4gKiBkaWZmZXJlbnRseSBmb3IgYSBwYXJ0aWN1bGFyIGBkZWJ1Z2AgaW5zdGFuY2UuXG4gKi9cblxuZnVuY3Rpb24gaW5pdChkZWJ1Zykge1xuXHRkZWJ1Zy5pbnNwZWN0T3B0cyA9IHt9O1xuXG5cdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhleHBvcnRzLmluc3BlY3RPcHRzKTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0ZGVidWcuaW5zcGVjdE9wdHNba2V5c1tpXV0gPSBleHBvcnRzLmluc3BlY3RPcHRzW2tleXNbaV1dO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9jb21tb24nKShleHBvcnRzKTtcblxuY29uc3Qge2Zvcm1hdHRlcnN9ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogTWFwICVvIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbCBvbiBhIHNpbmdsZSBsaW5lLlxuICovXG5cbmZvcm1hdHRlcnMubyA9IGZ1bmN0aW9uICh2KSB7XG5cdHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cdHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cylcblx0XHQuc3BsaXQoJ1xcbicpXG5cdFx0Lm1hcChzdHIgPT4gc3RyLnRyaW0oKSlcblx0XHQuam9pbignICcpO1xufTtcblxuLyoqXG4gKiBNYXAgJU8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsb3dpbmcgbXVsdGlwbGUgbGluZXMgaWYgbmVlZGVkLlxuICovXG5cbmZvcm1hdHRlcnMuTyA9IGZ1bmN0aW9uICh2KSB7XG5cdHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cdHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cyk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbXBpbGUgPSB2b2lkIDA7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwidXRpbFwiKTtcbmNvbnN0IGRlZ2VuZXJhdG9yXzEgPSByZXF1aXJlKFwiLi9kZWdlbmVyYXRvclwiKTtcbmZ1bmN0aW9uIGNvbXBpbGUocWpzLCBjb2RlLCByZXR1cm5OYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBjb21waWxlZCA9ICgwLCBkZWdlbmVyYXRvcl8xLmRlZ2VuZXJhdG9yKShjb2RlLCBvcHRpb25zLm5hbWVzID8/IFtdKTtcbiAgICBjb25zdCB2bSA9IHFqcy5uZXdDb250ZXh0KCk7XG4gICAgLy8gQWRkIGZ1bmN0aW9ucyB0byBnbG9iYWxcbiAgICBpZiAob3B0aW9ucy5zYW5kYm94KSB7XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvcHRpb25zLnNhbmRib3gpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIFwiZnVuY3Rpb25cIiBmb3Igc2FuZGJveCBwcm9wZXJ0eSBcXGAke25hbWV9XFxgLCBidXQgZ290IFwiJHt0eXBlb2YgdmFsdWV9XCJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZuSGFuZGxlID0gdm0ubmV3RnVuY3Rpb24obmFtZSwgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZSguLi5hcmdzLm1hcCgoYXJnKSA9PiBxdWlja0pTSGFuZGxlVG9Ib3N0KHZtLCBhcmcpKSk7XG4gICAgICAgICAgICAgICAgdm0ucnVudGltZS5leGVjdXRlUGVuZGluZ0pvYnMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG9zdFRvUXVpY2tKU0hhbmRsZSh2bSwgcmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm5IYW5kbGUuY29uc3VtZSgoaGFuZGxlKSA9PiB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgbmFtZSwgaGFuZGxlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZm5SZXN1bHQgPSB2bS5ldmFsQ29kZShgJHtjb21waWxlZH07JHtyZXR1cm5OYW1lfWAsIG9wdGlvbnMuZmlsZW5hbWUpO1xuICAgIGNvbnN0IGZuID0gdm0udW53cmFwUmVzdWx0KGZuUmVzdWx0KTtcbiAgICBjb25zdCB0ID0gdm0udHlwZW9mKGZuKTtcbiAgICBpZiAodCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgXCJmdW5jdGlvblwiIG5hbWVkIFxcYCR7cmV0dXJuTmFtZX1cXGAgdG8gYmUgZGVmaW5lZCwgYnV0IGdvdCBcIiR7dH1cImApO1xuICAgIH1cbiAgICBjb25zdCByID0gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IHByb21pc2VIYW5kbGU7XG4gICAgICAgIGxldCByZXNvbHZlZEhhbmRsZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHZtLmNhbGxGdW5jdGlvbihmbiwgdm0udW5kZWZpbmVkLCAuLi5hcmdzLm1hcCgoYXJnKSA9PiBob3N0VG9RdWlja0pTSGFuZGxlKHZtLCBhcmcpKSk7XG4gICAgICAgICAgICBwcm9taXNlSGFuZGxlID0gdm0udW53cmFwUmVzdWx0KHJlc3VsdCk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZFJlc3VsdFAgPSB2bS5yZXNvbHZlUHJvbWlzZShwcm9taXNlSGFuZGxlKTtcbiAgICAgICAgICAgIHZtLnJ1bnRpbWUuZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZFJlc3VsdCA9IGF3YWl0IHJlc29sdmVkUmVzdWx0UDtcbiAgICAgICAgICAgIHJlc29sdmVkSGFuZGxlID0gdm0udW53cmFwUmVzdWx0KHJlc29sdmVkUmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybiBxdWlja0pTSGFuZGxlVG9Ib3N0KHZtLCByZXNvbHZlZEhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciAmJiB0eXBlb2YgZXJyID09PSAnb2JqZWN0JyAmJiAnY2F1c2UnIGluIGVyciAmJiBlcnIuY2F1c2UpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVyci5jYXVzZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgJ3N0YWNrJyBpbiBlcnIuY2F1c2UgJiZcbiAgICAgICAgICAgICAgICAgICAgJ25hbWUnIGluIGVyci5jYXVzZSAmJlxuICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScgaW4gZXJyLmNhdXNlICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBlcnIuY2F1c2Uuc3RhY2sgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBlcnIuY2F1c2UubmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGVyci5jYXVzZS5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBRdWlja0pTIEVycm9yIGBzdGFja2AgZG9lcyBub3QgaW5jbHVkZSB0aGUgbmFtZSArXG4gICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UsIHNvIHBhdGNoIHRob3NlIGluIHRvIGJlaGF2ZSBtb3JlIGxpa2UgVjhcbiAgICAgICAgICAgICAgICAgICAgZXJyLmNhdXNlLnN0YWNrID0gYCR7ZXJyLmNhdXNlLm5hbWV9OiAke2Vyci5jYXVzZS5tZXNzYWdlfVxcbiR7ZXJyLmNhdXNlLnN0YWNrfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVyci5jYXVzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHByb21pc2VIYW5kbGU/LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJlc29sdmVkSGFuZGxlPy5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCAndG9TdHJpbmcnLCB7XG4gICAgICAgIHZhbHVlOiAoKSA9PiBjb21waWxlZCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHI7XG59XG5leHBvcnRzLmNvbXBpbGUgPSBjb21waWxlO1xuZnVuY3Rpb24gcXVpY2tKU0hhbmRsZVRvSG9zdCh2bSwgdmFsKSB7XG4gICAgcmV0dXJuIHZtLmR1bXAodmFsKTtcbn1cbmZ1bmN0aW9uIGhvc3RUb1F1aWNrSlNIYW5kbGUodm0sIHZhbCkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdm0udW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHZtLm51bGw7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2bS5uZXdTdHJpbmcodmFsKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZtLm5ld051bWJlcih2YWwpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnYmlnaW50Jykge1xuICAgICAgICByZXR1cm4gdm0ubmV3QmlnSW50KHZhbCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gdmFsID8gdm0udHJ1ZSA6IHZtLmZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmICh1dGlsXzEudHlwZXMuaXNQcm9taXNlKHZhbCkpIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHZtLm5ld1Byb21pc2UoKTtcbiAgICAgICAgcHJvbWlzZS5zZXR0bGVkLnRoZW4odm0ucnVudGltZS5leGVjdXRlUGVuZGluZ0pvYnMpO1xuICAgICAgICB2YWwudGhlbigocikgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKGhvc3RUb1F1aWNrSlNIYW5kbGUodm0sIHIpKTtcbiAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoaG9zdFRvUXVpY2tKU0hhbmRsZSh2bSwgZXJyKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS5oYW5kbGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHV0aWxfMS50eXBlcy5pc05hdGl2ZUVycm9yKHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIHZtLm5ld0Vycm9yKHZhbCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdmFsdWU6ICR7dmFsfWApO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcGlsZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVnZW5lcmF0b3IgPSB2b2lkIDA7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwidXRpbFwiKTtcbmNvbnN0IGVzY29kZWdlbl8xID0gcmVxdWlyZShcImVzY29kZWdlblwiKTtcbmNvbnN0IGVzcHJpbWFfMSA9IHJlcXVpcmUoXCJlc3ByaW1hXCIpO1xuY29uc3QgYXN0X3R5cGVzXzEgPSByZXF1aXJlKFwiYXN0LXR5cGVzXCIpO1xuLyoqXG4gKiBDb21waWxlcyBzeW5jIEphdmFTY3JpcHQgY29kZSBpbnRvIEphdmFTY3JpcHQgd2l0aCBhc3luYyBGdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGNvZGUgSmF2YVNjcmlwdCBzdHJpbmcgdG8gY29udmVydFxuICogQHBhcmFtIHtBcnJheX0gbmFtZXMgQXJyYXkgb2YgZnVuY3Rpb24gbmFtZXMgdG8gYWRkIGBhd2FpdGAgb3BlcmF0b3JzIHRvXG4gKiBAcmV0dXJuIHtTdHJpbmd9IENvbnZlcnRlZCBKYXZhU2NyaXB0IHN0cmluZyB3aXRoIGFzeW5jL2F3YWl0IGluamVjdGVkXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiBkZWdlbmVyYXRvcihjb2RlLCBfbmFtZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoX25hbWVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhbiBhcnJheSBvZiBhc3luYyBmdW5jdGlvbiBcIm5hbWVzXCIgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgLy8gRHVwbGljYXRlIHRoZSBgbmFtZXNgIGFycmF5IHNpbmNlIGl0J3MgcnVkZSB0byBhdWdtZW50IHRoZSB1c2VyIGFyZ3NcbiAgICBjb25zdCBuYW1lcyA9IF9uYW1lcy5zbGljZSgwKTtcbiAgICBjb25zdCBhc3QgPSAoMCwgZXNwcmltYV8xLnBhcnNlU2NyaXB0KShjb2RlKTtcbiAgICAvLyBGaXJzdCBwYXNzIGlzIHRvIGZpbmQgdGhlIGBmdW5jdGlvbmAgbm9kZXMgYW5kIHR1cm4gdGhlbSBpbnRvIGFzeW5jIG9yXG4gICAgLy8gZ2VuZXJhdG9yIGZ1bmN0aW9ucyBvbmx5IGlmIHRoZWlyIGJvZHkgaW5jbHVkZXMgYENhbGxFeHByZXNzaW9uc2AgdG9cbiAgICAvLyBmdW5jdGlvbiBpbiBgbmFtZXNgLiBXZSBhbHNvIGFkZCB0aGUgbmFtZXMgb2YgdGhlIGZ1bmN0aW9ucyB0byB0aGUgYG5hbWVzYFxuICAgIC8vIGFycmF5LiBXZSdsbCBpdGVyYXRlIHNldmVyYWwgdGltZSwgYXMgZXZlcnkgaXRlcmF0aW9uIG1pZ2h0IGFkZCBuZXcgaXRlbXNcbiAgICAvLyB0byB0aGUgYG5hbWVzYCBhcnJheSwgdW50aWwgbm8gbmV3IG5hbWVzIHdlcmUgYWRkZWQgaW4gdGhlIGl0ZXJhdGlvbi5cbiAgICBsZXQgbGFzdE5hbWVzTGVuZ3RoID0gMDtcbiAgICBkbyB7XG4gICAgICAgIGxhc3ROYW1lc0xlbmd0aCA9IG5hbWVzLmxlbmd0aDtcbiAgICAgICAgKDAsIGFzdF90eXBlc18xLnZpc2l0KShhc3QsIHtcbiAgICAgICAgICAgIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihwYXRoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGgubm9kZS5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLm5vZGUuZGVjbGFyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHBhdGgubm9kZS5kZWNsYXJhdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5WYXJpYWJsZURlY2xhcmF0b3IuY2hlY2soZGVjbGFyYXRpb24pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKGRlY2xhcmF0aW9uLmluaXQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKGRlY2xhcmF0aW9uLmlkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTmFtZShkZWNsYXJhdGlvbi5pbml0Lm5hbWUsIG5hbWVzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja05hbWUoZGVjbGFyYXRpb24uaWQubmFtZSwgbmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMucHVzaChkZWNsYXJhdGlvbi5pZC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmlzaXRBc3NpZ25tZW50RXhwcmVzc2lvbihwYXRoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFzdF90eXBlc18xLm5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhwYXRoLm5vZGUubGVmdCkgJiZcbiAgICAgICAgICAgICAgICAgICAgYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKHBhdGgubm9kZS5yaWdodCkgJiZcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tOYW1lKHBhdGgubm9kZS5yaWdodC5uYW1lLCBuYW1lcykgJiZcbiAgICAgICAgICAgICAgICAgICAgIWNoZWNrTmFtZShwYXRoLm5vZGUubGVmdC5uYW1lLCBuYW1lcykpIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZXMucHVzaChwYXRoLm5vZGUubGVmdC5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpc2l0RnVuY3Rpb24ocGF0aCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoLm5vZGUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNob3VsZERlZ2VuZXJhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIGFzdF90eXBlc18xLnZpc2l0KShwYXRoLm5vZGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0Q2FsbEV4cHJlc3Npb24ocGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja05hbWVzKHBhdGgubm9kZSwgbmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZERlZ2VuZXJhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGREZWdlbmVyYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gR290IGEgXCJmdW5jdGlvblwiIGV4cHJlc3Npb24vc3RhdGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IGl0IGludG8gYW4gYXN5bmMgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgcGF0aC5ub2RlLmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGZ1bmN0aW9uIG5hbWUgdG8gYG5hbWVzYCBhcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrTmFtZShwYXRoLm5vZGUuaWQubmFtZSwgbmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5wdXNoKHBhdGgubm9kZS5pZC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnRyYXZlcnNlKHBhdGgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSB3aGlsZSAobGFzdE5hbWVzTGVuZ3RoICE9PSBuYW1lcy5sZW5ndGgpO1xuICAgIC8vIFNlY29uZCBwYXNzIGlzIGZvciBhZGRpbmcgYGF3YWl0YCBzdGF0ZW1lbnRzIHRvIGFueSBmdW5jdGlvblxuICAgIC8vIGludm9jYXRpb25zIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIGBuYW1lc2AgYXJyYXkuXG4gICAgKDAsIGFzdF90eXBlc18xLnZpc2l0KShhc3QsIHtcbiAgICAgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihwYXRoKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tOYW1lcyhwYXRoLm5vZGUsIG5hbWVzKSkge1xuICAgICAgICAgICAgICAgIC8vIEEgXCJmdW5jdGlvbiBpbnZvY2F0aW9uXCIgZXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGluamVjdCBhbiBgQXdhaXRFeHByZXNzaW9uYFxuICAgICAgICAgICAgICAgIGNvbnN0IGRlbGVnYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBuYW1lLCBwYXJlbnQ6IHsgbm9kZTogcE5vZGUgfSwgfSA9IHBhdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwciA9IGFzdF90eXBlc18xLmJ1aWxkZXJzLmF3YWl0RXhwcmVzc2lvbihwYXRoLm5vZGUsIGRlbGVnYXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5DYWxsRXhwcmVzc2lvbi5jaGVjayhwTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXJndW1lbnRzW25hbWVdID0gZXhwcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBOb2RlW25hbWVdID0gZXhwcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRyYXZlcnNlKHBhdGgpO1xuICAgICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiAoMCwgZXNjb2RlZ2VuXzEuZ2VuZXJhdGUpKGFzdCk7XG59XG5leHBvcnRzLmRlZ2VuZXJhdG9yID0gZGVnZW5lcmF0b3I7XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIGBub2RlYCBoYXMgYSBtYXRjaGluZyBuYW1lIHRvIG9uZSBvZiB0aGUgZW50cmllcyBpbiB0aGVcbiAqIGBuYW1lc2AgYXJyYXkuXG4gKlxuICogQHBhcmFtIHt0eXBlcy5Ob2RlfSBub2RlXG4gKiBAcGFyYW0ge0FycmF5fSBuYW1lcyBBcnJheSBvZiBmdW5jdGlvbiBuYW1lcyB0byByZXR1cm4gdHJ1ZSBmb3JcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tOYW1lcyh7IGNhbGxlZSB9LCBuYW1lcykge1xuICAgIGxldCBuYW1lO1xuICAgIGlmIChhc3RfdHlwZXNfMS5uYW1lZFR5cGVzLklkZW50aWZpZXIuY2hlY2soY2FsbGVlKSkge1xuICAgICAgICBuYW1lID0gY2FsbGVlLm5hbWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzdF90eXBlc18xLm5hbWVkVHlwZXMuTWVtYmVyRXhwcmVzc2lvbi5jaGVjayhjYWxsZWUpKSB7XG4gICAgICAgIGlmIChhc3RfdHlwZXNfMS5uYW1lZFR5cGVzLklkZW50aWZpZXIuY2hlY2soY2FsbGVlLm9iamVjdCkgJiZcbiAgICAgICAgICAgIGFzdF90eXBlc18xLm5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhjYWxsZWUucHJvcGVydHkpKSB7XG4gICAgICAgICAgICBuYW1lID0gYCR7Y2FsbGVlLm9iamVjdC5uYW1lfS4ke2NhbGxlZS5wcm9wZXJ0eS5uYW1lfWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5GdW5jdGlvbkV4cHJlc3Npb24uY2hlY2soY2FsbGVlKSkge1xuICAgICAgICBpZiAoY2FsbGVlLmlkKSB7XG4gICAgICAgICAgICBuYW1lID0gY2FsbGVlLmlkLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gZ2V0IG5hbWUgZm9yOiAke2NhbGxlZS50eXBlfWApO1xuICAgIH1cbiAgICByZXR1cm4gY2hlY2tOYW1lKG5hbWUsIG5hbWVzKTtcbn1cbmZ1bmN0aW9uIGNoZWNrTmFtZShuYW1lLCBuYW1lcykge1xuICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGBuYW1lYCwgY2hlY2sgaWYgYW55IGVudHJpZXMgbWF0Y2ggaW4gdGhlIGBuYW1lc2AgYXJyYXlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuYW1lc1tpXTtcbiAgICAgICAgaWYgKHV0aWxfMS50eXBlcy5pc1JlZ0V4cChuKSkge1xuICAgICAgICAgICAgaWYgKG4udGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWUgPT09IG4pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlZ2VuZXJhdG9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZGVnZW5lcmF0b3JcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbXBpbGVcIiksIGV4cG9ydHMpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICAvLyBodHRwczovL210aHMuYmUvZW1vamlcbiAgcmV0dXJuIC9cXHVEODNDXFx1REZGNFxcdURCNDBcXHVEQzY3XFx1REI0MFxcdURDNjIoPzpcXHVEQjQwXFx1REM2NVxcdURCNDBcXHVEQzZFXFx1REI0MFxcdURDNjd8XFx1REI0MFxcdURDNzNcXHVEQjQwXFx1REM2M1xcdURCNDBcXHVEQzc0fFxcdURCNDBcXHVEQzc3XFx1REI0MFxcdURDNkNcXHVEQjQwXFx1REM3MylcXHVEQjQwXFx1REM3RnxcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NcXHVERkZDXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4XFx1RDgzQ1xcdURGRkJ8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZGXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkVdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkVcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRF0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRFxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQlxcdURGRkNdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1MjAwRCg/OlxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCk/XFx1RDgzRFxcdURDNjh8KD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzY2XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY3XFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKSl8XFx1RDgzRFxcdURDNjZcXHUyMDBEXFx1RDgzRFxcdURDNjZ8XFx1RDgzRFxcdURDNjdcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pfCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKVxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8W1xcdTI2OTVcXHUyNjk2XFx1MjcwOF1cXHVGRTBGfFxcdUQ4M0RbXFx1REM2NlxcdURDNjddfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXwoPzpcXHVEODNDXFx1REZGQlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRVxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQ1xcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XSlcXHVGRTBGfFxcdUQ4M0NcXHVERkZCXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkJcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGQ1xcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OSlcXHVEODNDXFx1REZGQnxcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NcXHVERkZGXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXxcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDEpfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkVcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGRlxcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSkpKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkVdKXwoPzpcXHVEODNFXFx1REREMVxcdUQ4M0NcXHVERkZDXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkRcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjkpKD86XFx1RDgzQ1tcXHVERkZCXFx1REZGQ10pfFxcdUQ4M0RcXHVEQzY5KD86XFx1RDgzQ1xcdURGRkVcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRFxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkNcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkJcXHVERkZELVxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkJcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkMtXFx1REZGRl0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRFxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQlxcdURGRkNcXHVERkZFXFx1REZGRl0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHUyMDBEKD86XFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pfFxcdUQ4M0RbXFx1REM2OFxcdURDNjldKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkZcXHUyMDBEKD86XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pKXxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2OVxcdTIwMEQoPzpcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSkpfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkRcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGRVxcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRF0pfFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY2XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY5XFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKXwoPzpcXHVEODNEXFx1REM0MVxcdUZFMEZcXHUyMDBEXFx1RDgzRFxcdURERTh8XFx1RDgzRFxcdURDNjkoPzpcXHVEODNDXFx1REZGRlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRVxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQ1xcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF0pfCg/Oig/OlxcdTI2Rjl8XFx1RDgzQ1tcXHVERkNCXFx1REZDQ118XFx1RDgzRFxcdURENzUpXFx1RkUwRnxcXHVEODNEXFx1REM2RnxcXHVEODNFW1xcdUREM0NcXHVERERFXFx1RERERl0pXFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml18KD86XFx1MjZGOXxcXHVEODNDW1xcdURGQ0JcXHVERkNDXXxcXHVEODNEXFx1REQ3NSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pXFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml18KD86XFx1RDgzQ1tcXHVERkMzXFx1REZDNFxcdURGQ0FdfFxcdUQ4M0RbXFx1REM2RVxcdURDNzFcXHVEQzczXFx1REM3N1xcdURDODFcXHVEQzgyXFx1REM4NlxcdURDODdcXHVERTQ1LVxcdURFNDdcXHVERTRCXFx1REU0RFxcdURFNEVcXHVERUEzXFx1REVCNC1cXHVERUI2XXxcXHVEODNFW1xcdUREMjZcXHVERDM3LVxcdUREMzlcXHVERDNEXFx1REQzRVxcdUREQjhcXHVEREI5XFx1RERDRC1cXHVERENGXFx1RERENi1cXHVEREREXSkoPzooPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pXFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml18XFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml0pfFxcdUQ4M0NcXHVERkY0XFx1MjAwRFxcdTI2MjApXFx1RkUwRnxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8XFx1RDgzQ1xcdURGRjNcXHVGRTBGXFx1MjAwRFxcdUQ4M0NcXHVERjA4fFxcdUQ4M0RcXHVEQzE1XFx1MjAwRFxcdUQ4M0VcXHVEREJBfFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY3fFxcdUQ4M0NcXHVEREZEXFx1RDgzQ1xcdURERjB8XFx1RDgzQ1xcdURERjRcXHVEODNDXFx1RERGMnxcXHVEODNDXFx1RERGNlxcdUQ4M0NcXHVEREU2fFsjXFwqMC05XVxcdUZFMEZcXHUyMEUzfFxcdUQ4M0NcXHVEREU3KD86XFx1RDgzQ1tcXHVEREU2XFx1RERFN1xcdURERTktXFx1RERFRlxcdURERjEtXFx1RERGNFxcdURERjYtXFx1RERGOVxcdURERkJcXHVEREZDXFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERGOSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREU5XFx1RERFQi1cXHVEREVEXFx1RERFRi1cXHVEREY0XFx1RERGN1xcdURERjlcXHVEREZCXFx1RERGQ1xcdURERkZdKXxcXHVEODNDXFx1RERFQSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREVBXFx1RERFQ1xcdURERURcXHVEREY3LVxcdURERkFdKXxcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8XFx1RDgzQ1xcdURERjcoPzpcXHVEODNDW1xcdURERUFcXHVEREY0XFx1RERGOFxcdURERkFcXHVEREZDXSl8XFx1RDgzRFxcdURDNjkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfFxcdUQ4M0NcXHVEREYyKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOC1cXHVEREVEXFx1RERGMC1cXHVEREZGXSl8XFx1RDgzQ1xcdURERTYoPzpcXHVEODNDW1xcdURERTgtXFx1RERFQ1xcdURERUVcXHVEREYxXFx1RERGMlxcdURERjRcXHVEREY2LVxcdURERkFcXHVEREZDXFx1RERGRFxcdURERkZdKXxcXHVEODNDXFx1RERGMCg/OlxcdUQ4M0NbXFx1RERFQVxcdURERUMtXFx1RERFRVxcdURERjJcXHVEREYzXFx1RERGNVxcdURERjdcXHVEREZDXFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERFRCg/OlxcdUQ4M0NbXFx1RERGMFxcdURERjJcXHVEREYzXFx1RERGN1xcdURERjlcXHVEREZBXSl8XFx1RDgzQ1xcdURERTkoPzpcXHVEODNDW1xcdURERUFcXHVEREVDXFx1RERFRlxcdURERjBcXHVEREYyXFx1RERGNFxcdURERkZdKXxcXHVEODNDXFx1RERGRSg/OlxcdUQ4M0NbXFx1RERFQVxcdURERjldKXxcXHVEODNDXFx1RERFQyg/OlxcdUQ4M0NbXFx1RERFNlxcdURERTdcXHVEREU5LVxcdURERUVcXHVEREYxLVxcdURERjNcXHVEREY1LVxcdURERkFcXHVEREZDXFx1RERGRV0pfFxcdUQ4M0NcXHVEREY4KD86XFx1RDgzQ1tcXHVEREU2LVxcdURERUFcXHVEREVDLVxcdURERjRcXHVEREY3LVxcdURERjlcXHVEREZCXFx1RERGRC1cXHVEREZGXSl8XFx1RDgzQ1xcdURERUIoPzpcXHVEODNDW1xcdURERUUtXFx1RERGMFxcdURERjJcXHVEREY0XFx1RERGN10pfFxcdUQ4M0NcXHVEREY1KD86XFx1RDgzQ1tcXHVEREU2XFx1RERFQS1cXHVEREVEXFx1RERGMC1cXHVEREYzXFx1RERGNy1cXHVEREY5XFx1RERGQ1xcdURERkVdKXxcXHVEODNDXFx1RERGQig/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREVBXFx1RERFQ1xcdURERUVcXHVEREYzXFx1RERGQV0pfFxcdUQ4M0NcXHVEREYzKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOFxcdURERUEtXFx1RERFQ1xcdURERUVcXHVEREYxXFx1RERGNFxcdURERjVcXHVEREY3XFx1RERGQVxcdURERkZdKXxcXHVEODNDXFx1RERFOCg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREU5XFx1RERFQi1cXHVEREVFXFx1RERGMC1cXHVEREY1XFx1RERGN1xcdURERkEtXFx1RERGRl0pfFxcdUQ4M0NcXHVEREYxKD86XFx1RDgzQ1tcXHVEREU2LVxcdURERThcXHVEREVFXFx1RERGMFxcdURERjctXFx1RERGQlxcdURERkVdKXxcXHVEODNDXFx1RERGRig/OlxcdUQ4M0NbXFx1RERFNlxcdURERjJcXHVEREZDXSl8XFx1RDgzQ1xcdURERkMoPzpcXHVEODNDW1xcdURERUJcXHVEREY4XSl8XFx1RDgzQ1xcdURERkEoPzpcXHVEODNDW1xcdURERTZcXHVEREVDXFx1RERGMlxcdURERjNcXHVEREY4XFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERFRSg/OlxcdUQ4M0NbXFx1RERFOC1cXHVEREVBXFx1RERGMS1cXHVEREY0XFx1RERGNi1cXHVEREY5XSl8XFx1RDgzQ1xcdURERUYoPzpcXHVEODNDW1xcdURERUFcXHVEREYyXFx1RERGNFxcdURERjVdKXwoPzpcXHVEODNDW1xcdURGQzNcXHVERkM0XFx1REZDQV18XFx1RDgzRFtcXHVEQzZFXFx1REM3MVxcdURDNzNcXHVEQzc3XFx1REM4MVxcdURDODJcXHVEQzg2XFx1REM4N1xcdURFNDUtXFx1REU0N1xcdURFNEJcXHVERTREXFx1REU0RVxcdURFQTNcXHVERUI0LVxcdURFQjZdfFxcdUQ4M0VbXFx1REQyNlxcdUREMzctXFx1REQzOVxcdUREM0RcXHVERDNFXFx1RERCOFxcdUREQjlcXHVERENELVxcdUREQ0ZcXHVEREQ2LVxcdURERERdKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8KD86XFx1MjZGOXxcXHVEODNDW1xcdURGQ0JcXHVERkNDXXxcXHVEODNEXFx1REQ3NSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OltcXHUyNjFEXFx1MjcwQS1cXHUyNzBEXXxcXHVEODNDW1xcdURGODVcXHVERkMyXFx1REZDN118XFx1RDgzRFtcXHVEQzQyXFx1REM0M1xcdURDNDYtXFx1REM1MFxcdURDNjZcXHVEQzY3XFx1REM2Qi1cXHVEQzZEXFx1REM3MFxcdURDNzJcXHVEQzc0LVxcdURDNzZcXHVEQzc4XFx1REM3Q1xcdURDODNcXHVEQzg1XFx1RENBQVxcdURENzRcXHVERDdBXFx1REQ5MFxcdUREOTVcXHVERDk2XFx1REU0Q1xcdURFNEZcXHVERUMwXFx1REVDQ118XFx1RDgzRVtcXHVERDBGXFx1REQxOC1cXHVERDFDXFx1REQxRVxcdUREMUZcXHVERDMwLVxcdUREMzZcXHVEREI1XFx1RERCNlxcdUREQkJcXHVEREQyLVxcdURERDVdKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8KD86W1xcdTIzMUFcXHUyMzFCXFx1MjNFOS1cXHUyM0VDXFx1MjNGMFxcdTIzRjNcXHUyNUZEXFx1MjVGRVxcdTI2MTRcXHUyNjE1XFx1MjY0OC1cXHUyNjUzXFx1MjY3RlxcdTI2OTNcXHUyNkExXFx1MjZBQVxcdTI2QUJcXHUyNkJEXFx1MjZCRVxcdTI2QzRcXHUyNkM1XFx1MjZDRVxcdTI2RDRcXHUyNkVBXFx1MjZGMlxcdTI2RjNcXHUyNkY1XFx1MjZGQVxcdTI2RkRcXHUyNzA1XFx1MjcwQVxcdTI3MEJcXHUyNzI4XFx1Mjc0Q1xcdTI3NEVcXHUyNzUzLVxcdTI3NTVcXHUyNzU3XFx1Mjc5NS1cXHUyNzk3XFx1MjdCMFxcdTI3QkZcXHUyQjFCXFx1MkIxQ1xcdTJCNTBcXHUyQjU1XXxcXHVEODNDW1xcdURDMDRcXHVEQ0NGXFx1REQ4RVxcdUREOTEtXFx1REQ5QVxcdURERTYtXFx1RERGRlxcdURFMDFcXHVERTFBXFx1REUyRlxcdURFMzItXFx1REUzNlxcdURFMzgtXFx1REUzQVxcdURFNTBcXHVERTUxXFx1REYwMC1cXHVERjIwXFx1REYyRC1cXHVERjM1XFx1REYzNy1cXHVERjdDXFx1REY3RS1cXHVERjkzXFx1REZBMC1cXHVERkNBXFx1REZDRi1cXHVERkQzXFx1REZFMC1cXHVERkYwXFx1REZGNFxcdURGRjgtXFx1REZGRl18XFx1RDgzRFtcXHVEQzAwLVxcdURDM0VcXHVEQzQwXFx1REM0Mi1cXHVEQ0ZDXFx1RENGRi1cXHVERDNEXFx1REQ0Qi1cXHVERDRFXFx1REQ1MC1cXHVERDY3XFx1REQ3QVxcdUREOTVcXHVERDk2XFx1RERBNFxcdURERkItXFx1REU0RlxcdURFODAtXFx1REVDNVxcdURFQ0NcXHVERUQwLVxcdURFRDJcXHVERUQ1XFx1REVFQlxcdURFRUNcXHVERUY0LVxcdURFRkFcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwRC1cXHVERDNBXFx1REQzQy1cXHVERDQ1XFx1REQ0Ny1cXHVERDcxXFx1REQ3My1cXHVERDc2XFx1REQ3QS1cXHVEREEyXFx1RERBNS1cXHVEREFBXFx1RERBRS1cXHVERENBXFx1RERDRC1cXHVEREZGXFx1REU3MC1cXHVERTczXFx1REU3OC1cXHVERTdBXFx1REU4MC1cXHVERTgyXFx1REU5MC1cXHVERTk1XSl8KD86WyNcXCowLTlcXHhBOVxceEFFXFx1MjAzQ1xcdTIwNDlcXHUyMTIyXFx1MjEzOVxcdTIxOTQtXFx1MjE5OVxcdTIxQTlcXHUyMUFBXFx1MjMxQVxcdTIzMUJcXHUyMzI4XFx1MjNDRlxcdTIzRTktXFx1MjNGM1xcdTIzRjgtXFx1MjNGQVxcdTI0QzJcXHUyNUFBXFx1MjVBQlxcdTI1QjZcXHUyNUMwXFx1MjVGQi1cXHUyNUZFXFx1MjYwMC1cXHUyNjA0XFx1MjYwRVxcdTI2MTFcXHUyNjE0XFx1MjYxNVxcdTI2MThcXHUyNjFEXFx1MjYyMFxcdTI2MjJcXHUyNjIzXFx1MjYyNlxcdTI2MkFcXHUyNjJFXFx1MjYyRlxcdTI2MzgtXFx1MjYzQVxcdTI2NDBcXHUyNjQyXFx1MjY0OC1cXHUyNjUzXFx1MjY1RlxcdTI2NjBcXHUyNjYzXFx1MjY2NVxcdTI2NjZcXHUyNjY4XFx1MjY3QlxcdTI2N0VcXHUyNjdGXFx1MjY5Mi1cXHUyNjk3XFx1MjY5OVxcdTI2OUJcXHUyNjlDXFx1MjZBMFxcdTI2QTFcXHUyNkFBXFx1MjZBQlxcdTI2QjBcXHUyNkIxXFx1MjZCRFxcdTI2QkVcXHUyNkM0XFx1MjZDNVxcdTI2QzhcXHUyNkNFXFx1MjZDRlxcdTI2RDFcXHUyNkQzXFx1MjZENFxcdTI2RTlcXHUyNkVBXFx1MjZGMC1cXHUyNkY1XFx1MjZGNy1cXHUyNkZBXFx1MjZGRFxcdTI3MDJcXHUyNzA1XFx1MjcwOC1cXHUyNzBEXFx1MjcwRlxcdTI3MTJcXHUyNzE0XFx1MjcxNlxcdTI3MURcXHUyNzIxXFx1MjcyOFxcdTI3MzNcXHUyNzM0XFx1Mjc0NFxcdTI3NDdcXHUyNzRDXFx1Mjc0RVxcdTI3NTMtXFx1Mjc1NVxcdTI3NTdcXHUyNzYzXFx1Mjc2NFxcdTI3OTUtXFx1Mjc5N1xcdTI3QTFcXHUyN0IwXFx1MjdCRlxcdTI5MzRcXHUyOTM1XFx1MkIwNS1cXHUyQjA3XFx1MkIxQlxcdTJCMUNcXHUyQjUwXFx1MkI1NVxcdTMwMzBcXHUzMDNEXFx1MzI5N1xcdTMyOTldfFxcdUQ4M0NbXFx1REMwNFxcdURDQ0ZcXHVERDcwXFx1REQ3MVxcdUREN0VcXHVERDdGXFx1REQ4RVxcdUREOTEtXFx1REQ5QVxcdURERTYtXFx1RERGRlxcdURFMDFcXHVERTAyXFx1REUxQVxcdURFMkZcXHVERTMyLVxcdURFM0FcXHVERTUwXFx1REU1MVxcdURGMDAtXFx1REYyMVxcdURGMjQtXFx1REY5M1xcdURGOTZcXHVERjk3XFx1REY5OS1cXHVERjlCXFx1REY5RS1cXHVERkYwXFx1REZGMy1cXHVERkY1XFx1REZGNy1cXHVERkZGXXxcXHVEODNEW1xcdURDMDAtXFx1RENGRFxcdURDRkYtXFx1REQzRFxcdURENDktXFx1REQ0RVxcdURENTAtXFx1REQ2N1xcdURENkZcXHVERDcwXFx1REQ3My1cXHVERDdBXFx1REQ4N1xcdUREOEEtXFx1REQ4RFxcdUREOTBcXHVERDk1XFx1REQ5NlxcdUREQTRcXHVEREE1XFx1RERBOFxcdUREQjFcXHVEREIyXFx1RERCQ1xcdUREQzItXFx1RERDNFxcdURERDEtXFx1REREM1xcdUREREMtXFx1RERERVxcdURERTFcXHVEREUzXFx1RERFOFxcdURERUZcXHVEREYzXFx1RERGQS1cXHVERTRGXFx1REU4MC1cXHVERUM1XFx1REVDQi1cXHVERUQyXFx1REVENVxcdURFRTAtXFx1REVFNVxcdURFRTlcXHVERUVCXFx1REVFQ1xcdURFRjBcXHVERUYzLVxcdURFRkFcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwRC1cXHVERDNBXFx1REQzQy1cXHVERDQ1XFx1REQ0Ny1cXHVERDcxXFx1REQ3My1cXHVERDc2XFx1REQ3QS1cXHVEREEyXFx1RERBNS1cXHVEREFBXFx1RERBRS1cXHVERENBXFx1RERDRC1cXHVEREZGXFx1REU3MC1cXHVERTczXFx1REU3OC1cXHVERTdBXFx1REU4MC1cXHVERTgyXFx1REU5MC1cXHVERTk1XSlcXHVGRTBGfCg/OltcXHUyNjFEXFx1MjZGOVxcdTI3MEEtXFx1MjcwRF18XFx1RDgzQ1tcXHVERjg1XFx1REZDMi1cXHVERkM0XFx1REZDN1xcdURGQ0EtXFx1REZDQ118XFx1RDgzRFtcXHVEQzQyXFx1REM0M1xcdURDNDYtXFx1REM1MFxcdURDNjYtXFx1REM3OFxcdURDN0NcXHVEQzgxLVxcdURDODNcXHVEQzg1LVxcdURDODdcXHVEQzhGXFx1REM5MVxcdURDQUFcXHVERDc0XFx1REQ3NVxcdUREN0FcXHVERDkwXFx1REQ5NVxcdUREOTZcXHVERTQ1LVxcdURFNDdcXHVERTRCLVxcdURFNEZcXHVERUEzXFx1REVCNC1cXHVERUI2XFx1REVDMFxcdURFQ0NdfFxcdUQ4M0VbXFx1REQwRlxcdUREMTgtXFx1REQxRlxcdUREMjZcXHVERDMwLVxcdUREMzlcXHVERDNDLVxcdUREM0VcXHVEREI1XFx1RERCNlxcdUREQjhcXHVEREI5XFx1RERCQlxcdUREQ0QtXFx1RERDRlxcdURERDEtXFx1RERERF0pL2c7XG59O1xuIiwidmFyIG9uY2UgPSByZXF1aXJlKCdvbmNlJyk7XG5cbnZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcblxudmFyIGlzUmVxdWVzdCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuXHRyZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nO1xufTtcblxudmFyIGlzQ2hpbGRQcm9jZXNzID0gZnVuY3Rpb24oc3RyZWFtKSB7XG5cdHJldHVybiBzdHJlYW0uc3RkaW8gJiYgQXJyYXkuaXNBcnJheShzdHJlYW0uc3RkaW8pICYmIHN0cmVhbS5zdGRpby5sZW5ndGggPT09IDNcbn07XG5cbnZhciBlb3MgPSBmdW5jdGlvbihzdHJlYW0sIG9wdHMsIGNhbGxiYWNrKSB7XG5cdGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVvcyhzdHJlYW0sIG51bGwsIG9wdHMpO1xuXHRpZiAoIW9wdHMpIG9wdHMgPSB7fTtcblxuXHRjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2sgfHwgbm9vcCk7XG5cblx0dmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuXHR2YXIgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cdHZhciByZWFkYWJsZSA9IG9wdHMucmVhZGFibGUgfHwgKG9wdHMucmVhZGFibGUgIT09IGZhbHNlICYmIHN0cmVhbS5yZWFkYWJsZSk7XG5cdHZhciB3cml0YWJsZSA9IG9wdHMud3JpdGFibGUgfHwgKG9wdHMud3JpdGFibGUgIT09IGZhbHNlICYmIHN0cmVhbS53cml0YWJsZSk7XG5cdHZhciBjYW5jZWxsZWQgPSBmYWxzZTtcblxuXHR2YXIgb25sZWdhY3lmaW5pc2ggPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXN0cmVhbS53cml0YWJsZSkgb25maW5pc2goKTtcblx0fTtcblxuXHR2YXIgb25maW5pc2ggPSBmdW5jdGlvbigpIHtcblx0XHR3cml0YWJsZSA9IGZhbHNlO1xuXHRcdGlmICghcmVhZGFibGUpIGNhbGxiYWNrLmNhbGwoc3RyZWFtKTtcblx0fTtcblxuXHR2YXIgb25lbmQgPSBmdW5jdGlvbigpIHtcblx0XHRyZWFkYWJsZSA9IGZhbHNlO1xuXHRcdGlmICghd3JpdGFibGUpIGNhbGxiYWNrLmNhbGwoc3RyZWFtKTtcblx0fTtcblxuXHR2YXIgb25leGl0ID0gZnVuY3Rpb24oZXhpdENvZGUpIHtcblx0XHRjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXhpdENvZGUgPyBuZXcgRXJyb3IoJ2V4aXRlZCB3aXRoIGVycm9yIGNvZGU6ICcgKyBleGl0Q29kZSkgOiBudWxsKTtcblx0fTtcblxuXHR2YXIgb25lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuXHRcdGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBlcnIpO1xuXHR9O1xuXG5cdHZhciBvbmNsb3NlID0gZnVuY3Rpb24oKSB7XG5cdFx0cHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlbmV4dHRpY2spO1xuXHR9O1xuXG5cdHZhciBvbmNsb3NlbmV4dHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoY2FuY2VsbGVkKSByZXR1cm47XG5cdFx0aWYgKHJlYWRhYmxlICYmICEocnMgJiYgKHJzLmVuZGVkICYmICFycy5kZXN0cm95ZWQpKSkgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBuZXcgRXJyb3IoJ3ByZW1hdHVyZSBjbG9zZScpKTtcblx0XHRpZiAod3JpdGFibGUgJiYgISh3cyAmJiAod3MuZW5kZWQgJiYgIXdzLmRlc3Ryb3llZCkpKSByZXR1cm4gY2FsbGJhY2suY2FsbChzdHJlYW0sIG5ldyBFcnJvcigncHJlbWF0dXJlIGNsb3NlJykpO1xuXHR9O1xuXG5cdHZhciBvbnJlcXVlc3QgPSBmdW5jdGlvbigpIHtcblx0XHRzdHJlYW0ucmVxLm9uKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cdH07XG5cblx0aWYgKGlzUmVxdWVzdChzdHJlYW0pKSB7XG5cdFx0c3RyZWFtLm9uKCdjb21wbGV0ZScsIG9uZmluaXNoKTtcblx0XHRzdHJlYW0ub24oJ2Fib3J0Jywgb25jbG9zZSk7XG5cdFx0aWYgKHN0cmVhbS5yZXEpIG9ucmVxdWVzdCgpO1xuXHRcdGVsc2Ugc3RyZWFtLm9uKCdyZXF1ZXN0Jywgb25yZXF1ZXN0KTtcblx0fSBlbHNlIGlmICh3cml0YWJsZSAmJiAhd3MpIHsgLy8gbGVnYWN5IHN0cmVhbXNcblx0XHRzdHJlYW0ub24oJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKTtcblx0XHRzdHJlYW0ub24oJ2Nsb3NlJywgb25sZWdhY3lmaW5pc2gpO1xuXHR9XG5cblx0aWYgKGlzQ2hpbGRQcm9jZXNzKHN0cmVhbSkpIHN0cmVhbS5vbignZXhpdCcsIG9uZXhpdCk7XG5cblx0c3RyZWFtLm9uKCdlbmQnLCBvbmVuZCk7XG5cdHN0cmVhbS5vbignZmluaXNoJywgb25maW5pc2gpO1xuXHRpZiAob3B0cy5lcnJvciAhPT0gZmFsc2UpIHN0cmVhbS5vbignZXJyb3InLCBvbmVycm9yKTtcblx0c3RyZWFtLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuXG5cdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRjYW5jZWxsZWQgPSB0cnVlO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY29tcGxldGUnLCBvbmZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdhYm9ydCcsIG9uY2xvc2UpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigncmVxdWVzdCcsIG9ucmVxdWVzdCk7XG5cdFx0aWYgKHN0cmVhbS5yZXEpIHN0cmVhbS5yZXEucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25sZWdhY3lmaW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXhpdCcsIG9uZXhpdCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcblx0fTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZW9zO1xuIiwiY29uc3QgeyBkaXJuYW1lLCByZXNvbHZlIH0gPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCB7IHJlYWRkaXJTeW5jLCBzdGF0U3luYyB9ID0gcmVxdWlyZSgnZnMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RhcnQsIGNhbGxiYWNrKSB7XG5cdGxldCBkaXIgPSByZXNvbHZlKCcuJywgc3RhcnQpO1xuXHRsZXQgdG1wLCBzdGF0cyA9IHN0YXRTeW5jKGRpcik7XG5cblx0aWYgKCFzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG5cdFx0ZGlyID0gZGlybmFtZShkaXIpO1xuXHR9XG5cblx0d2hpbGUgKHRydWUpIHtcblx0XHR0bXAgPSBjYWxsYmFjayhkaXIsIHJlYWRkaXJTeW5jKGRpcikpO1xuXHRcdGlmICh0bXApIHJldHVybiByZXNvbHZlKGRpciwgdG1wKTtcblx0XHRkaXIgPSBkaXJuYW1lKHRtcCA9IGRpcik7XG5cdFx0aWYgKHRtcCA9PT0gZGlyKSBicmVhaztcblx0fVxufVxuIiwiLypcbiAgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTQgWXVzdWtlIFN1enVraSA8dXRhdGFuZS50ZWFAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTUgSW5ndmFyIFN0ZXBhbnlhbiA8bWVAcnJldmVyc2VyLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDE0IEl2YW4gTmlrdWxpbiA8aWZhYWFuQGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgTWljaGFlbCBGaWNhcnJhIDxlc2NvZGVnZW4uY29weXJpZ2h0QG1pY2hhZWwuZmljYXJyYS5tZT5cbiAgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgTWF0aGlhcyBCeW5lbnMgPG1hdGhpYXNAcWl3aS5iZT5cbiAgQ29weXJpZ2h0IChDKSAyMDEzIElyYWtsaSBHb3phbGlzaHZpbGkgPHJmb2JpY0BnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMiBSb2JlcnQgR3VzdC1CYXJkb24gPGRvbmF0ZUByb2JlcnQuZ3VzdC1iYXJkb24ub3JnPlxuICBDb3B5cmlnaHQgKEMpIDIwMTIgSm9obiBGcmVlbWFuIDxqZnJlZW1hbjA4QGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgQXJpeWEgSGlkYXlhdCA8YXJpeWEuaGlkYXlhdEBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMiBKb29zdC1XaW0gQm9la2VzdGVpam4gPGpvb3N0LXdpbUBib2VrZXN0ZWlqbi5ubD5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIEtyaXMgS293YWwgPGtyaXMua293YWxAY2l4YXIuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTIgQXJwYWQgQm9yc29zIDxhcnBhZC5ib3Jzb3NAZ29vZ2xlbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuLypnbG9iYWwgZXhwb3J0czp0cnVlLCByZXF1aXJlOnRydWUsIGdsb2JhbDp0cnVlKi9cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIFN5bnRheCxcbiAgICAgICAgUHJlY2VkZW5jZSxcbiAgICAgICAgQmluYXJ5UHJlY2VkZW5jZSxcbiAgICAgICAgU291cmNlTm9kZSxcbiAgICAgICAgZXN0cmF2ZXJzZSxcbiAgICAgICAgZXN1dGlscyxcbiAgICAgICAgYmFzZSxcbiAgICAgICAgaW5kZW50LFxuICAgICAgICBqc29uLFxuICAgICAgICByZW51bWJlcixcbiAgICAgICAgaGV4YWRlY2ltYWwsXG4gICAgICAgIHF1b3RlcyxcbiAgICAgICAgZXNjYXBlbGVzcyxcbiAgICAgICAgbmV3bGluZSxcbiAgICAgICAgc3BhY2UsXG4gICAgICAgIHBhcmVudGhlc2VzLFxuICAgICAgICBzZW1pY29sb25zLFxuICAgICAgICBzYWZlQ29uY2F0ZW5hdGlvbixcbiAgICAgICAgZGlyZWN0aXZlLFxuICAgICAgICBleHRyYSxcbiAgICAgICAgcGFyc2UsXG4gICAgICAgIHNvdXJjZU1hcCxcbiAgICAgICAgc291cmNlQ29kZSxcbiAgICAgICAgcHJlc2VydmVCbGFua0xpbmVzLFxuICAgICAgICBGT1JNQVRfTUlOSUZZLFxuICAgICAgICBGT1JNQVRfREVGQVVMVFM7XG5cbiAgICBlc3RyYXZlcnNlID0gcmVxdWlyZSgnZXN0cmF2ZXJzZScpO1xuICAgIGVzdXRpbHMgPSByZXF1aXJlKCdlc3V0aWxzJyk7XG5cbiAgICBTeW50YXggPSBlc3RyYXZlcnNlLlN5bnRheDtcblxuICAgIC8vIEdlbmVyYXRpb24gaXMgZG9uZSBieSBnZW5lcmF0ZUV4cHJlc3Npb24uXG4gICAgZnVuY3Rpb24gaXNFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIENvZGVHZW5lcmF0b3IuRXhwcmVzc2lvbi5oYXNPd25Qcm9wZXJ0eShub2RlLnR5cGUpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRpb24gaXMgZG9uZSBieSBnZW5lcmF0ZVN0YXRlbWVudC5cbiAgICBmdW5jdGlvbiBpc1N0YXRlbWVudChub2RlKSB7XG4gICAgICAgIHJldHVybiBDb2RlR2VuZXJhdG9yLlN0YXRlbWVudC5oYXNPd25Qcm9wZXJ0eShub2RlLnR5cGUpO1xuICAgIH1cblxuICAgIFByZWNlZGVuY2UgPSB7XG4gICAgICAgIFNlcXVlbmNlOiAwLFxuICAgICAgICBZaWVsZDogMSxcbiAgICAgICAgQXNzaWdubWVudDogMSxcbiAgICAgICAgQ29uZGl0aW9uYWw6IDIsXG4gICAgICAgIEFycm93RnVuY3Rpb246IDIsXG4gICAgICAgIENvYWxlc2NlOiAzLFxuICAgICAgICBMb2dpY2FsT1I6IDQsXG4gICAgICAgIExvZ2ljYWxBTkQ6IDUsXG4gICAgICAgIEJpdHdpc2VPUjogNixcbiAgICAgICAgQml0d2lzZVhPUjogNyxcbiAgICAgICAgQml0d2lzZUFORDogOCxcbiAgICAgICAgRXF1YWxpdHk6IDksXG4gICAgICAgIFJlbGF0aW9uYWw6IDEwLFxuICAgICAgICBCaXR3aXNlU0hJRlQ6IDExLFxuICAgICAgICBBZGRpdGl2ZTogMTIsXG4gICAgICAgIE11bHRpcGxpY2F0aXZlOiAxMyxcbiAgICAgICAgRXhwb25lbnRpYXRpb246IDE0LFxuICAgICAgICBBd2FpdDogMTUsXG4gICAgICAgIFVuYXJ5OiAxNSxcbiAgICAgICAgUG9zdGZpeDogMTYsXG4gICAgICAgIE9wdGlvbmFsQ2hhaW5pbmc6IDE3LFxuICAgICAgICBDYWxsOiAxOCxcbiAgICAgICAgTmV3OiAxOSxcbiAgICAgICAgVGFnZ2VkVGVtcGxhdGU6IDIwLFxuICAgICAgICBNZW1iZXI6IDIxLFxuICAgICAgICBQcmltYXJ5OiAyMlxuICAgIH07XG5cbiAgICBCaW5hcnlQcmVjZWRlbmNlID0ge1xuICAgICAgICAnPz8nOiBQcmVjZWRlbmNlLkNvYWxlc2NlLFxuICAgICAgICAnfHwnOiBQcmVjZWRlbmNlLkxvZ2ljYWxPUixcbiAgICAgICAgJyYmJzogUHJlY2VkZW5jZS5Mb2dpY2FsQU5ELFxuICAgICAgICAnfCc6IFByZWNlZGVuY2UuQml0d2lzZU9SLFxuICAgICAgICAnXic6IFByZWNlZGVuY2UuQml0d2lzZVhPUixcbiAgICAgICAgJyYnOiBQcmVjZWRlbmNlLkJpdHdpc2VBTkQsXG4gICAgICAgICc9PSc6IFByZWNlZGVuY2UuRXF1YWxpdHksXG4gICAgICAgICchPSc6IFByZWNlZGVuY2UuRXF1YWxpdHksXG4gICAgICAgICc9PT0nOiBQcmVjZWRlbmNlLkVxdWFsaXR5LFxuICAgICAgICAnIT09JzogUHJlY2VkZW5jZS5FcXVhbGl0eSxcbiAgICAgICAgJ2lzJzogUHJlY2VkZW5jZS5FcXVhbGl0eSxcbiAgICAgICAgJ2lzbnQnOiBQcmVjZWRlbmNlLkVxdWFsaXR5LFxuICAgICAgICAnPCc6IFByZWNlZGVuY2UuUmVsYXRpb25hbCxcbiAgICAgICAgJz4nOiBQcmVjZWRlbmNlLlJlbGF0aW9uYWwsXG4gICAgICAgICc8PSc6IFByZWNlZGVuY2UuUmVsYXRpb25hbCxcbiAgICAgICAgJz49JzogUHJlY2VkZW5jZS5SZWxhdGlvbmFsLFxuICAgICAgICAnaW4nOiBQcmVjZWRlbmNlLlJlbGF0aW9uYWwsXG4gICAgICAgICdpbnN0YW5jZW9mJzogUHJlY2VkZW5jZS5SZWxhdGlvbmFsLFxuICAgICAgICAnPDwnOiBQcmVjZWRlbmNlLkJpdHdpc2VTSElGVCxcbiAgICAgICAgJz4+JzogUHJlY2VkZW5jZS5CaXR3aXNlU0hJRlQsXG4gICAgICAgICc+Pj4nOiBQcmVjZWRlbmNlLkJpdHdpc2VTSElGVCxcbiAgICAgICAgJysnOiBQcmVjZWRlbmNlLkFkZGl0aXZlLFxuICAgICAgICAnLSc6IFByZWNlZGVuY2UuQWRkaXRpdmUsXG4gICAgICAgICcqJzogUHJlY2VkZW5jZS5NdWx0aXBsaWNhdGl2ZSxcbiAgICAgICAgJyUnOiBQcmVjZWRlbmNlLk11bHRpcGxpY2F0aXZlLFxuICAgICAgICAnLyc6IFByZWNlZGVuY2UuTXVsdGlwbGljYXRpdmUsXG4gICAgICAgICcqKic6IFByZWNlZGVuY2UuRXhwb25lbnRpYXRpb25cbiAgICB9O1xuXG4gICAgLy9GbGFnc1xuICAgIHZhciBGX0FMTE9XX0lOID0gMSxcbiAgICAgICAgRl9BTExPV19DQUxMID0gMSA8PCAxLFxuICAgICAgICBGX0FMTE9XX1VOUEFSQVRIX05FVyA9IDEgPDwgMixcbiAgICAgICAgRl9GVU5DX0JPRFkgPSAxIDw8IDMsXG4gICAgICAgIEZfRElSRUNUSVZFX0NUWCA9IDEgPDwgNCxcbiAgICAgICAgRl9TRU1JQ09MT05fT1BUID0gMSA8PCA1LFxuICAgICAgICBGX0ZPVU5EX0NPQUxFU0NFID0gMSA8PCA2O1xuXG4gICAgLy9FeHByZXNzaW9uIGZsYWcgc2V0c1xuICAgIC8vTk9URTogRmxhZyBvcmRlcjpcbiAgICAvLyBGX0FMTE9XX0lOXG4gICAgLy8gRl9BTExPV19DQUxMXG4gICAgLy8gRl9BTExPV19VTlBBUkFUSF9ORVdcbiAgICB2YXIgRV9GVFQgPSBGX0FMTE9XX0NBTEwgfCBGX0FMTE9XX1VOUEFSQVRIX05FVyxcbiAgICAgICAgRV9UVEYgPSBGX0FMTE9XX0lOIHwgRl9BTExPV19DQUxMLFxuICAgICAgICBFX1RUVCA9IEZfQUxMT1dfSU4gfCBGX0FMTE9XX0NBTEwgfCBGX0FMTE9XX1VOUEFSQVRIX05FVyxcbiAgICAgICAgRV9URkYgPSBGX0FMTE9XX0lOLFxuICAgICAgICBFX0ZGVCA9IEZfQUxMT1dfVU5QQVJBVEhfTkVXLFxuICAgICAgICBFX1RGVCA9IEZfQUxMT1dfSU4gfCBGX0FMTE9XX1VOUEFSQVRIX05FVztcblxuICAgIC8vU3RhdGVtZW50IGZsYWcgc2V0c1xuICAgIC8vTk9URTogRmxhZyBvcmRlcjpcbiAgICAvLyBGX0FMTE9XX0lOXG4gICAgLy8gRl9GVU5DX0JPRFlcbiAgICAvLyBGX0RJUkVDVElWRV9DVFhcbiAgICAvLyBGX1NFTUlDT0xPTl9PUFRcbiAgICB2YXIgU19URkZGID0gRl9BTExPV19JTixcbiAgICAgICAgU19URkZUID0gRl9BTExPV19JTiB8IEZfU0VNSUNPTE9OX09QVCxcbiAgICAgICAgU19GRkZGID0gMHgwMCxcbiAgICAgICAgU19URlRGID0gRl9BTExPV19JTiB8IEZfRElSRUNUSVZFX0NUWCxcbiAgICAgICAgU19UVEZGID0gRl9BTExPV19JTiB8IEZfRlVOQ19CT0RZO1xuXG4gICAgZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMoKSB7XG4gICAgICAgIC8vIGRlZmF1bHQgb3B0aW9uc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5kZW50OiBudWxsLFxuICAgICAgICAgICAgYmFzZTogbnVsbCxcbiAgICAgICAgICAgIHBhcnNlOiBudWxsLFxuICAgICAgICAgICAgY29tbWVudDogZmFsc2UsXG4gICAgICAgICAgICBmb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICBpbmRlbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICcgICAgJyxcbiAgICAgICAgICAgICAgICAgICAgYmFzZTogMCxcbiAgICAgICAgICAgICAgICAgICAgYWRqdXN0TXVsdGlsaW5lQ29tbWVudDogZmFsc2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5ld2xpbmU6ICdcXG4nLFxuICAgICAgICAgICAgICAgIHNwYWNlOiAnICcsXG4gICAgICAgICAgICAgICAganNvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVudW1iZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGhleGFkZWNpbWFsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBxdW90ZXM6ICdzaW5nbGUnLFxuICAgICAgICAgICAgICAgIGVzY2FwZWxlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbXBhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHBhcmVudGhlc2VzOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNlbWljb2xvbnM6IHRydWUsXG4gICAgICAgICAgICAgICAgc2FmZUNvbmNhdGVuYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIHByZXNlcnZlQmxhbmtMaW5lczogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3o6IHtcbiAgICAgICAgICAgICAgICBjb21wcmVoZW5zaW9uRXhwcmVzc2lvblN0YXJ0c1dpdGhBc3NpZ25tZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdGFybGVzc0dlbmVyYXRvcjogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzb3VyY2VNYXA6IG51bGwsXG4gICAgICAgICAgICBzb3VyY2VNYXBSb290OiBudWxsLFxuICAgICAgICAgICAgc291cmNlTWFwV2l0aENvZGU6IGZhbHNlLFxuICAgICAgICAgICAgZGlyZWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgIHJhdzogdHJ1ZSxcbiAgICAgICAgICAgIHZlcmJhdGltOiBudWxsLFxuICAgICAgICAgICAgc291cmNlQ29kZTogbnVsbFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0cmluZ1JlcGVhdChzdHIsIG51bSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XG5cbiAgICAgICAgZm9yIChudW0gfD0gMDsgbnVtID4gMDsgbnVtID4+Pj0gMSwgc3RyICs9IHN0cikge1xuICAgICAgICAgICAgaWYgKG51bSAmIDEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gc3RyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNMaW5lVGVybWluYXRvcihzdHIpIHtcbiAgICAgICAgcmV0dXJuICgvW1xcclxcbl0vZykudGVzdChzdHIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZHNXaXRoTGluZVRlcm1pbmF0b3Ioc3RyKSB7XG4gICAgICAgIHZhciBsZW4gPSBzdHIubGVuZ3RoO1xuICAgICAgICByZXR1cm4gbGVuICYmIGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKHN0ci5jaGFyQ29kZUF0KGxlbiAtIDEpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZSh0YXJnZXQsIG92ZXJyaWRlKSB7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoa2V5IGluIG92ZXJyaWRlKSB7XG4gICAgICAgICAgICBpZiAob3ZlcnJpZGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gb3ZlcnJpZGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZURlZXBseSh0YXJnZXQsIG92ZXJyaWRlKSB7XG4gICAgICAgIHZhciBrZXksIHZhbDtcblxuICAgICAgICBmdW5jdGlvbiBpc0hhc2hPYmplY3QodGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcgJiYgdGFyZ2V0IGluc3RhbmNlb2YgT2JqZWN0ICYmICEodGFyZ2V0IGluc3RhbmNlb2YgUmVnRXhwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoa2V5IGluIG92ZXJyaWRlKSB7XG4gICAgICAgICAgICBpZiAob3ZlcnJpZGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHZhbCA9IG92ZXJyaWRlW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGlzSGFzaE9iamVjdCh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0hhc2hPYmplY3QodGFyZ2V0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVEZWVwbHkodGFyZ2V0W2tleV0sIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHVwZGF0ZURlZXBseSh7fSwgdmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlTnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQsIHBvaW50LCB0ZW1wLCBleHBvbmVudCwgcG9zO1xuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTnVtZXJpYyBsaXRlcmFsIHdob3NlIHZhbHVlIGlzIE5hTicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ051bWVyaWMgbGl0ZXJhbCB3aG9zZSB2YWx1ZSBpcyBuZWdhdGl2ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSAxIC8gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGpzb24gPyAnbnVsbCcgOiByZW51bWJlciA/ICcxZTQwMCcgOiAnMWUrNDAwJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9ICcnICsgdmFsdWU7XG4gICAgICAgIGlmICghcmVudW1iZXIgfHwgcmVzdWx0Lmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBwb2ludCA9IHJlc3VsdC5pbmRleE9mKCcuJyk7XG4gICAgICAgIGlmICghanNvbiAmJiByZXN1bHQuY2hhckNvZGVBdCgwKSA9PT0gMHgzMCAgLyogMCAqLyAmJiBwb2ludCA9PT0gMSkge1xuICAgICAgICAgICAgcG9pbnQgPSAwO1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXAgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKCdlKycsICdlJyk7XG4gICAgICAgIGV4cG9uZW50ID0gMDtcbiAgICAgICAgaWYgKChwb3MgPSB0ZW1wLmluZGV4T2YoJ2UnKSkgPiAwKSB7XG4gICAgICAgICAgICBleHBvbmVudCA9ICt0ZW1wLnNsaWNlKHBvcyArIDEpO1xuICAgICAgICAgICAgdGVtcCA9IHRlbXAuc2xpY2UoMCwgcG9zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9pbnQgPj0gMCkge1xuICAgICAgICAgICAgZXhwb25lbnQgLT0gdGVtcC5sZW5ndGggLSBwb2ludCAtIDE7XG4gICAgICAgICAgICB0ZW1wID0gKyh0ZW1wLnNsaWNlKDAsIHBvaW50KSArIHRlbXAuc2xpY2UocG9pbnQgKyAxKSkgKyAnJztcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSAwO1xuICAgICAgICB3aGlsZSAodGVtcC5jaGFyQ29kZUF0KHRlbXAubGVuZ3RoICsgcG9zIC0gMSkgPT09IDB4MzAgIC8qIDAgKi8pIHtcbiAgICAgICAgICAgIC0tcG9zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3MgIT09IDApIHtcbiAgICAgICAgICAgIGV4cG9uZW50IC09IHBvcztcbiAgICAgICAgICAgIHRlbXAgPSB0ZW1wLnNsaWNlKDAsIHBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cG9uZW50ICE9PSAwKSB7XG4gICAgICAgICAgICB0ZW1wICs9ICdlJyArIGV4cG9uZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICgodGVtcC5sZW5ndGggPCByZXN1bHQubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgIChoZXhhZGVjaW1hbCAmJiB2YWx1ZSA+IDFlMTIgJiYgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlICYmICh0ZW1wID0gJzB4JyArIHZhbHVlLnRvU3RyaW5nKDE2KSkubGVuZ3RoIDwgcmVzdWx0Lmxlbmd0aCkpICYmXG4gICAgICAgICAgICAgICAgK3RlbXAgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0ZW1wO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSB2YWxpZCBSZWdFeHAgZXhwcmVzc2lvbi5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9Db25zdGVsbGF0aW9uL2l2IEVuZ2luZVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwQ2hhcmFjdGVyKGNoLCBwcmV2aW91c0lzQmFja3NsYXNoKSB7XG4gICAgICAgIC8vIG5vdCBoYW5kbGluZyAnXFwnIGFuZCBoYW5kbGluZyBcXHUyMDI4IG9yIFxcdTIwMjkgdG8gdW5pY29kZSBlc2NhcGUgc2VxdWVuY2VcbiAgICAgICAgaWYgKChjaCAmIH4xKSA9PT0gMHgyMDI4KSB7XG4gICAgICAgICAgICByZXR1cm4gKHByZXZpb3VzSXNCYWNrc2xhc2ggPyAndScgOiAnXFxcXHUnKSArICgoY2ggPT09IDB4MjAyOCkgPyAnMjAyOCcgOiAnMjAyOScpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAxMCB8fCBjaCA9PT0gMTMpIHsgIC8vIFxcbiwgXFxyXG4gICAgICAgICAgICByZXR1cm4gKHByZXZpb3VzSXNCYWNrc2xhc2ggPyAnJyA6ICdcXFxcJykgKyAoKGNoID09PSAxMCkgPyAnbicgOiAncicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVJlZ0V4cChyZWcpIHtcbiAgICAgICAgdmFyIG1hdGNoLCByZXN1bHQsIGZsYWdzLCBpLCBpeiwgY2gsIGNoYXJhY3RlckluQnJhY2ssIHByZXZpb3VzSXNCYWNrc2xhc2g7XG5cbiAgICAgICAgcmVzdWx0ID0gcmVnLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgaWYgKHJlZy5zb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgZmxhZyBmcm9tIHRvU3RyaW5nIHJlc3VsdFxuICAgICAgICAgICAgbWF0Y2ggPSByZXN1bHQubWF0Y2goL1xcLyhbXi9dKikkLyk7XG4gICAgICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmxhZ3MgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIHJlc3VsdCA9ICcnO1xuXG4gICAgICAgICAgICBjaGFyYWN0ZXJJbkJyYWNrID0gZmFsc2U7XG4gICAgICAgICAgICBwcmV2aW91c0lzQmFja3NsYXNoID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHJlZy5zb3VyY2UubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIGNoID0gcmVnLnNvdXJjZS5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c0lzQmFja3NsYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJJbkJyYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09IDkzKSB7ICAvLyBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVySW5CcmFjayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSA0NykgeyAgLy8gL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSA5MSkgeyAgLy8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckluQnJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBlc2NhcGVSZWdFeHBDaGFyYWN0ZXIoY2gsIHByZXZpb3VzSXNCYWNrc2xhc2gpO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzQmFja3NsYXNoID0gY2ggPT09IDkyOyAgLy8gXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBuZXcgUmVnRXhwKFwiXFxcXFxcbicpIGlzIHByb3ZpZGVkLCBjcmVhdGUgL1xcbi9cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGVzY2FwZVJlZ0V4cENoYXJhY3RlcihjaCwgcHJldmlvdXNJc0JhY2tzbGFzaCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgbGlrZSAvXFxcXFsvXS9cbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNJc0JhY2tzbGFzaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICcvJyArIHJlc3VsdCArICcvJyArIGZsYWdzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlc2NhcGVBbGxvd2VkQ2hhcmFjdGVyKGNvZGUsIG5leHQpIHtcbiAgICAgICAgdmFyIGhleDtcblxuICAgICAgICBpZiAoY29kZSA9PT0gMHgwOCAgLyogXFxiICovKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxiJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDBDICAvKiBcXGYgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXGYnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MDkgIC8qIFxcdCAqLykge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcdCc7XG4gICAgICAgIH1cblxuICAgICAgICBoZXggPSBjb2RlLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAoanNvbiB8fCBjb2RlID4gMHhGRikge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcdScgKyAnMDAwMCcuc2xpY2UoaGV4Lmxlbmd0aCkgKyBoZXg7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgwMDAwICYmICFlc3V0aWxzLmNvZGUuaXNEZWNpbWFsRGlnaXQobmV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXDAnO1xuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MDAwQiAgLyogXFx2ICovKSB7IC8vICdcXHYnXG4gICAgICAgICAgICByZXR1cm4gJ1xcXFx4MEInO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxceCcgKyAnMDAnLnNsaWNlKGhleC5sZW5ndGgpICsgaGV4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlRGlzYWxsb3dlZENoYXJhY3Rlcihjb2RlKSB7XG4gICAgICAgIGlmIChjb2RlID09PSAweDVDICAvKiBcXCAqLykge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcXFxcXCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gMHgwQSAgLyogXFxuICovKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxuJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDBEICAvKiBcXHIgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHInO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MjAyOCkge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcdTIwMjgnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MjAyOSkge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcdTIwMjknO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3RseSBjbGFzc2lmaWVkIGNoYXJhY3RlcicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVzY2FwZURpcmVjdGl2ZShzdHIpIHtcbiAgICAgICAgdmFyIGksIGl6LCBjb2RlLCBxdW90ZTtcblxuICAgICAgICBxdW90ZSA9IHF1b3RlcyA9PT0gJ2RvdWJsZScgPyAnXCInIDogJ1xcJyc7XG4gICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RyLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSAweDI3ICAvKiAnICovKSB7XG4gICAgICAgICAgICAgICAgcXVvdGUgPSAnXCInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDIyICAvKiBcIiAqLykge1xuICAgICAgICAgICAgICAgIHF1b3RlID0gJ1xcJyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4NUMgIC8qIFxcICovKSB7XG4gICAgICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1b3RlICsgc3RyICsgcXVvdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHN0cikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gJycsIGksIGxlbiwgY29kZSwgc2luZ2xlUXVvdGVzID0gMCwgZG91YmxlUXVvdGVzID0gMCwgc2luZ2xlLCBxdW90ZTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSAweDI3ICAvKiAnICovKSB7XG4gICAgICAgICAgICAgICAgKytzaW5nbGVRdW90ZXM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MjIgIC8qIFwiICovKSB7XG4gICAgICAgICAgICAgICAgKytkb3VibGVRdW90ZXM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MkYgIC8qIC8gKi8gJiYganNvbikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGNvZGUpIHx8IGNvZGUgPT09IDB4NUMgIC8qIFxcICovKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGVzY2FwZURpc2FsbG93ZWRDaGFyYWN0ZXIoY29kZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFlc3V0aWxzLmNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShjb2RlKSAmJiAoanNvbiAmJiBjb2RlIDwgMHgyMCAgLyogU1AgKi8gfHwgIWpzb24gJiYgIWVzY2FwZWxlc3MgJiYgKGNvZGUgPCAweDIwICAvKiBTUCAqLyB8fCBjb2RlID4gMHg3RSAgLyogfiAqLykpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGVzY2FwZUFsbG93ZWRDaGFyYWN0ZXIoY29kZSwgc3RyLmNoYXJDb2RlQXQoaSArIDEpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2luZ2xlID0gIShxdW90ZXMgPT09ICdkb3VibGUnIHx8IChxdW90ZXMgPT09ICdhdXRvJyAmJiBkb3VibGVRdW90ZXMgPCBzaW5nbGVRdW90ZXMpKTtcbiAgICAgICAgcXVvdGUgPSBzaW5nbGUgPyAnXFwnJyA6ICdcIic7XG5cbiAgICAgICAgaWYgKCEoc2luZ2xlID8gc2luZ2xlUXVvdGVzIDogZG91YmxlUXVvdGVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHF1b3RlICsgcmVzdWx0ICsgcXVvdGU7XG4gICAgICAgIH1cblxuICAgICAgICBzdHIgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IHF1b3RlO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKChjb2RlID09PSAweDI3ICAvKiAnICovICYmIHNpbmdsZSkgfHwgKGNvZGUgPT09IDB4MjIgIC8qIFwiICovICYmICFzaW5nbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdcXFxcJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIHF1b3RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGZsYXR0ZW4gYW4gYXJyYXkgdG8gYSBzdHJpbmcsIHdoZXJlIHRoZSBhcnJheSBjYW4gY29udGFpblxuICAgICAqIGVpdGhlciBzdHJpbmdzIG9yIG5lc3RlZCBhcnJheXNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuVG9TdHJpbmcoYXJyKSB7XG4gICAgICAgIHZhciBpLCBpeiwgZWxlbSwgcmVzdWx0ID0gJyc7XG4gICAgICAgIGZvciAoaSA9IDAsIGl6ID0gYXJyLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIGVsZW0gPSBhcnJbaV07XG4gICAgICAgICAgICByZXN1bHQgKz0gQXJyYXkuaXNBcnJheShlbGVtKSA/IGZsYXR0ZW5Ub1N0cmluZyhlbGVtKSA6IGVsZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjb252ZXJ0IGdlbmVyYXRlZCB0byBhIFNvdXJjZU5vZGUgd2hlbiBzb3VyY2UgbWFwcyBhcmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGdlbmVyYXRlZCwgbm9kZSkge1xuICAgICAgICBpZiAoIXNvdXJjZU1hcCkge1xuICAgICAgICAgICAgLy8gd2l0aCBubyBzb3VyY2UgbWFwcywgZ2VuZXJhdGVkIGlzIGVpdGhlciBhblxuICAgICAgICAgICAgLy8gYXJyYXkgb3IgYSBzdHJpbmcuICBpZiBhbiBhcnJheSwgZmxhdHRlbiBpdC5cbiAgICAgICAgICAgIC8vIGlmIGEgc3RyaW5nLCBqdXN0IHJldHVybiBpdFxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZ2VuZXJhdGVkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVG9TdHJpbmcoZ2VuZXJhdGVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVkIGluc3RhbmNlb2YgU291cmNlTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5sb2MgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKG51bGwsIG51bGwsIHNvdXJjZU1hcCwgZ2VuZXJhdGVkLCBub2RlLm5hbWUgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKG5vZGUubG9jLnN0YXJ0LmxpbmUsIG5vZGUubG9jLnN0YXJ0LmNvbHVtbiwgKHNvdXJjZU1hcCA9PT0gdHJ1ZSA/IG5vZGUubG9jLnNvdXJjZSB8fCBudWxsIDogc291cmNlTWFwKSwgZ2VuZXJhdGVkLCBub2RlLm5hbWUgfHwgbnVsbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9FbXB0eVNwYWNlKCkge1xuICAgICAgICByZXR1cm4gKHNwYWNlKSA/IHNwYWNlIDogJyAnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGpvaW4obGVmdCwgcmlnaHQpIHtcbiAgICAgICAgdmFyIGxlZnRTb3VyY2UsXG4gICAgICAgICAgICByaWdodFNvdXJjZSxcbiAgICAgICAgICAgIGxlZnRDaGFyQ29kZSxcbiAgICAgICAgICAgIHJpZ2h0Q2hhckNvZGU7XG5cbiAgICAgICAgbGVmdFNvdXJjZSA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQobGVmdCkudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKGxlZnRTb3VyY2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW3JpZ2h0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJpZ2h0U291cmNlID0gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyaWdodCkudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHJpZ2h0U291cmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtsZWZ0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxlZnRDaGFyQ29kZSA9IGxlZnRTb3VyY2UuY2hhckNvZGVBdChsZWZ0U291cmNlLmxlbmd0aCAtIDEpO1xuICAgICAgICByaWdodENoYXJDb2RlID0gcmlnaHRTb3VyY2UuY2hhckNvZGVBdCgwKTtcblxuICAgICAgICBpZiAoKGxlZnRDaGFyQ29kZSA9PT0gMHgyQiAgLyogKyAqLyB8fCBsZWZ0Q2hhckNvZGUgPT09IDB4MkQgIC8qIC0gKi8pICYmIGxlZnRDaGFyQ29kZSA9PT0gcmlnaHRDaGFyQ29kZSB8fFxuICAgICAgICAgICAgZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUobGVmdENoYXJDb2RlKSAmJiBlc3V0aWxzLmNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShyaWdodENoYXJDb2RlKSB8fFxuICAgICAgICAgICAgbGVmdENoYXJDb2RlID09PSAweDJGICAvKiAvICovICYmIHJpZ2h0Q2hhckNvZGUgPT09IDB4NjkgIC8qIGkgKi8pIHsgLy8gaW5maXggd29yZCBvcGVyYXRvcnMgYWxsIHN0YXJ0IHdpdGggYGlgXG4gICAgICAgICAgICByZXR1cm4gW2xlZnQsIG5vRW1wdHlTcGFjZSgpLCByaWdodF07XG4gICAgICAgIH0gZWxzZSBpZiAoZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShsZWZ0Q2hhckNvZGUpIHx8IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGxlZnRDaGFyQ29kZSkgfHxcbiAgICAgICAgICAgICAgICBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKHJpZ2h0Q2hhckNvZGUpIHx8IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKHJpZ2h0Q2hhckNvZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gW2xlZnQsIHJpZ2h0XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2xlZnQsIHNwYWNlLCByaWdodF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkSW5kZW50KHN0bXQpIHtcbiAgICAgICAgcmV0dXJuIFtiYXNlLCBzdG10XTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3aXRoSW5kZW50KGZuKSB7XG4gICAgICAgIHZhciBwcmV2aW91c0Jhc2U7XG4gICAgICAgIHByZXZpb3VzQmFzZSA9IGJhc2U7XG4gICAgICAgIGJhc2UgKz0gaW5kZW50O1xuICAgICAgICBmbihiYXNlKTtcbiAgICAgICAgYmFzZSA9IHByZXZpb3VzQmFzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVTcGFjZXMoc3RyKSB7XG4gICAgICAgIHZhciBpO1xuICAgICAgICBmb3IgKGkgPSBzdHIubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGlmIChlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihzdHIuY2hhckNvZGVBdChpKSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHN0ci5sZW5ndGggLSAxKSAtIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRqdXN0TXVsdGlsaW5lQ29tbWVudCh2YWx1ZSwgc3BlY2lhbEJhc2UpIHtcbiAgICAgICAgdmFyIGFycmF5LCBpLCBsZW4sIGxpbmUsIGosIHNwYWNlcywgcHJldmlvdXNCYXNlLCBzbjtcblxuICAgICAgICBhcnJheSA9IHZhbHVlLnNwbGl0KC9cXHJcXG58W1xcclxcbl0vKTtcbiAgICAgICAgc3BhY2VzID0gTnVtYmVyLk1BWF9WQUxVRTtcblxuICAgICAgICAvLyBmaXJzdCBsaW5lIGRvZXNuJ3QgaGF2ZSBpbmRlbnRhdGlvblxuICAgICAgICBmb3IgKGkgPSAxLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgbGluZSA9IGFycmF5W2ldO1xuICAgICAgICAgICAgaiA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoaiA8IGxpbmUubGVuZ3RoICYmIGVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UobGluZS5jaGFyQ29kZUF0KGopKSkge1xuICAgICAgICAgICAgICAgICsrajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzcGFjZXMgPiBqKSB7XG4gICAgICAgICAgICAgICAgc3BhY2VzID0gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygc3BlY2lhbEJhc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBwYXR0ZXJuIGxpa2VcbiAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgIC8vICAgdmFyIHQgPSAyMDsgIC8qXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgKiB0aGlzIGlzIGNvbW1lbnRcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcHJldmlvdXNCYXNlID0gYmFzZTtcbiAgICAgICAgICAgIGlmIChhcnJheVsxXVtzcGFjZXNdID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICBzcGVjaWFsQmFzZSArPSAnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiYXNlID0gc3BlY2lhbEJhc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3BhY2VzICYgMSkge1xuICAgICAgICAgICAgICAgIC8vIC8qXG4gICAgICAgICAgICAgICAgLy8gICpcbiAgICAgICAgICAgICAgICAvLyAgKi9cbiAgICAgICAgICAgICAgICAvLyBJZiBzcGFjZXMgYXJlIG9kZCBudW1iZXIsIGFib3ZlIHBhdHRlcm4gaXMgY29uc2lkZXJlZC5cbiAgICAgICAgICAgICAgICAvLyBXZSB3YXN0ZSAxIHNwYWNlLlxuICAgICAgICAgICAgICAgIC0tc3BhY2VzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldmlvdXNCYXNlID0gYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDEsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBzbiA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQoYWRkSW5kZW50KGFycmF5W2ldLnNsaWNlKHNwYWNlcykpKTtcbiAgICAgICAgICAgIGFycmF5W2ldID0gc291cmNlTWFwID8gc24uam9pbignJykgOiBzbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJhc2UgPSBwcmV2aW91c0Jhc2U7XG5cbiAgICAgICAgcmV0dXJuIGFycmF5LmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlQ29tbWVudChjb21tZW50LCBzcGVjaWFsQmFzZSkge1xuICAgICAgICBpZiAoY29tbWVudC50eXBlID09PSAnTGluZScpIHtcbiAgICAgICAgICAgIGlmIChlbmRzV2l0aExpbmVUZXJtaW5hdG9yKGNvbW1lbnQudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcvLycgKyBjb21tZW50LnZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBbHdheXMgdXNlIExpbmVUZXJtaW5hdG9yXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICcvLycgKyBjb21tZW50LnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghcHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxuJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0cmEuZm9ybWF0LmluZGVudC5hZGp1c3RNdWx0aWxpbmVDb21tZW50ICYmIC9bXFxuXFxyXS8udGVzdChjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFkanVzdE11bHRpbGluZUNvbW1lbnQoJy8qJyArIGNvbW1lbnQudmFsdWUgKyAnKi8nLCBzcGVjaWFsQmFzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcvKicgKyBjb21tZW50LnZhbHVlICsgJyovJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRDb21tZW50cyhzdG10LCByZXN1bHQpIHtcbiAgICAgICAgdmFyIGksIGxlbiwgY29tbWVudCwgc2F2ZSwgdGFpbGluZ1RvU3RhdGVtZW50LCBzcGVjaWFsQmFzZSwgZnJhZ21lbnQsXG4gICAgICAgICAgICBleHRSYW5nZSwgcmFuZ2UsIHByZXZSYW5nZSwgcHJlZml4LCBpbmZpeCwgc3VmZml4LCBjb3VudDtcblxuICAgICAgICBpZiAoc3RtdC5sZWFkaW5nQ29tbWVudHMgJiYgc3RtdC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2F2ZSA9IHJlc3VsdDtcblxuICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdG10LmxlYWRpbmdDb21tZW50c1swXTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgICAgICAgICAgIGV4dFJhbmdlID0gY29tbWVudC5leHRlbmRlZFJhbmdlO1xuICAgICAgICAgICAgICAgIHJhbmdlID0gY29tbWVudC5yYW5nZTtcblxuICAgICAgICAgICAgICAgIHByZWZpeCA9IHNvdXJjZUNvZGUuc3Vic3RyaW5nKGV4dFJhbmdlWzBdLCByYW5nZVswXSk7XG4gICAgICAgICAgICAgICAgY291bnQgPSAocHJlZml4Lm1hdGNoKC9cXG4vZykgfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0cmluZ1JlcGVhdCgnXFxuJywgY291bnQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KGdlbmVyYXRlQ29tbWVudChjb21tZW50KSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHByZWZpeCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlQ29tbWVudChjb21tZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJldlJhbmdlID0gcmFuZ2U7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAxLCBsZW4gPSBzdG10LmxlYWRpbmdDb21tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC5sZWFkaW5nQ29tbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gY29tbWVudC5yYW5nZTtcblxuICAgICAgICAgICAgICAgICAgICBpbmZpeCA9IHNvdXJjZUNvZGUuc3Vic3RyaW5nKHByZXZSYW5nZVsxXSwgcmFuZ2VbMF0pO1xuICAgICAgICAgICAgICAgICAgICBjb3VudCA9IChpbmZpeC5tYXRjaCgvXFxuL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0cmluZ1JlcGVhdCgnXFxuJywgY291bnQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KGdlbmVyYXRlQ29tbWVudChjb21tZW50KSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHByZXZSYW5nZSA9IHJhbmdlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHNvdXJjZUNvZGUuc3Vic3RyaW5nKHJhbmdlWzFdLCBleHRSYW5nZVsxXSk7XG4gICAgICAgICAgICAgICAgY291bnQgPSAoc3VmZml4Lm1hdGNoKC9cXG4vZykgfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdHJpbmdSZXBlYXQoJ1xcbicsIGNvdW50KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdG10LmxlYWRpbmdDb21tZW50c1swXTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoc2FmZUNvbmNhdGVuYXRpb24gJiYgc3RtdC50eXBlID09PSBTeW50YXguUHJvZ3JhbSAmJiBzdG10LmJvZHkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCdcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVDb21tZW50KGNvbW1lbnQpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCdcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAxLCBsZW4gPSBzdG10LmxlYWRpbmdDb21tZW50cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC5sZWFkaW5nQ29tbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gW2dlbmVyYXRlQ29tbWVudChjb21tZW50KV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGZyYWdtZW50KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQucHVzaCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KGZyYWdtZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQucHVzaChhZGRJbmRlbnQoc2F2ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0bXQudHJhaWxpbmdDb21tZW50cykge1xuXG4gICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgY29tbWVudCA9IHN0bXQudHJhaWxpbmdDb21tZW50c1swXTtcbiAgICAgICAgICAgICAgICBleHRSYW5nZSA9IGNvbW1lbnQuZXh0ZW5kZWRSYW5nZTtcbiAgICAgICAgICAgICAgICByYW5nZSA9IGNvbW1lbnQucmFuZ2U7XG5cbiAgICAgICAgICAgICAgICBwcmVmaXggPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhleHRSYW5nZVswXSwgcmFuZ2VbMF0pO1xuICAgICAgICAgICAgICAgIGNvdW50ID0gKHByZWZpeC5tYXRjaCgvXFxuL2cpIHx8IFtdKS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0cmluZ1JlcGVhdCgnXFxuJywgY291bnQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KGdlbmVyYXRlQ29tbWVudChjb21tZW50KSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHByZWZpeCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlQ29tbWVudChjb21tZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWlsaW5nVG9TdGF0ZW1lbnQgPSAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgc3BlY2lhbEJhc2UgPSBzdHJpbmdSZXBlYXQoJyAnLCBjYWxjdWxhdGVTcGFjZXModG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChbYmFzZSwgcmVzdWx0LCBpbmRlbnRdKS50b1N0cmluZygpKSk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gc3RtdC50cmFpbGluZ0NvbW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdG10LnRyYWlsaW5nQ29tbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWlsaW5nVG9TdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0YXJnZXQgbGlrZSBmb2xsb3dpbmcgc2NyaXB0XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyIHQgPSAyMDsgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAqIFRoaXMgaXMgY29tbWVudCBvZiB0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbcmVzdWx0LCBpbmRlbnRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbcmVzdWx0LCBzcGVjaWFsQmFzZV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCwgc3BlY2lhbEJhc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtyZXN1bHQsIGFkZEluZGVudChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gbGVuIC0gMSAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtyZXN1bHQsICdcXG4nXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVCbGFua0xpbmVzKHN0YXJ0LCBlbmQsIHJlc3VsdCkge1xuICAgICAgICB2YXIgaiwgbmV3bGluZUNvdW50ID0gMDtcblxuICAgICAgICBmb3IgKGogPSBzdGFydDsgaiA8IGVuZDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlQ29kZVtqXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICBuZXdsaW5lQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaiA9IDE7IGogPCBuZXdsaW5lQ291bnQ7IGorKykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJlbnRoZXNpemUodGV4dCwgY3VycmVudCwgc2hvdWxkKSB7XG4gICAgICAgIGlmIChjdXJyZW50IDwgc2hvdWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gWycoJywgdGV4dCwgJyknXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVZlcmJhdGltU3RyaW5nKHN0cmluZykge1xuICAgICAgICB2YXIgaSwgaXosIHJlc3VsdDtcbiAgICAgICAgcmVzdWx0ID0gc3RyaW5nLnNwbGl0KC9cXHJcXG58XFxuLyk7XG4gICAgICAgIGZvciAoaSA9IDEsIGl6ID0gcmVzdWx0Lmxlbmd0aDsgaSA8IGl6OyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IG5ld2xpbmUgKyBiYXNlICsgcmVzdWx0W2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVWZXJiYXRpbShleHByLCBwcmVjZWRlbmNlKSB7XG4gICAgICAgIHZhciB2ZXJiYXRpbSwgcmVzdWx0LCBwcmVjO1xuICAgICAgICB2ZXJiYXRpbSA9IGV4cHJbZXh0cmEudmVyYmF0aW1dO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmVyYmF0aW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBwYXJlbnRoZXNpemUoZ2VuZXJhdGVWZXJiYXRpbVN0cmluZyh2ZXJiYXRpbSksIFByZWNlZGVuY2UuU2VxdWVuY2UsIHByZWNlZGVuY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdmVyYmF0aW0gaXMgb2JqZWN0XG4gICAgICAgICAgICByZXN1bHQgPSBnZW5lcmF0ZVZlcmJhdGltU3RyaW5nKHZlcmJhdGltLmNvbnRlbnQpO1xuICAgICAgICAgICAgcHJlYyA9ICh2ZXJiYXRpbS5wcmVjZWRlbmNlICE9IG51bGwpID8gdmVyYmF0aW0ucHJlY2VkZW5jZSA6IFByZWNlZGVuY2UuU2VxdWVuY2U7XG4gICAgICAgICAgICByZXN1bHQgPSBwYXJlbnRoZXNpemUocmVzdWx0LCBwcmVjLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCwgZXhwcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQ29kZUdlbmVyYXRvcigpIHtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXJzLlxuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUubWF5YmVCbG9jayA9IGZ1bmN0aW9uKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgIHZhciByZXN1bHQsIG5vTGVhZGluZ0NvbW1lbnQsIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgIG5vTGVhZGluZ0NvbW1lbnQgPSAhZXh0cmEuY29tbWVudCB8fCAhc3RtdC5sZWFkaW5nQ29tbWVudHM7XG5cbiAgICAgICAgaWYgKHN0bXQudHlwZSA9PT0gU3ludGF4LkJsb2NrU3RhdGVtZW50ICYmIG5vTGVhZGluZ0NvbW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbc3BhY2UsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdCwgZmxhZ3MpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdG10LnR5cGUgPT09IFN5bnRheC5FbXB0eVN0YXRlbWVudCAmJiBub0xlYWRpbmdDb21tZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gJzsnO1xuICAgICAgICB9XG5cbiAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgbmV3bGluZSxcbiAgICAgICAgICAgICAgICBhZGRJbmRlbnQodGhhdC5nZW5lcmF0ZVN0YXRlbWVudChzdG10LCBmbGFncykpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5tYXliZUJsb2NrU3VmZml4ID0gZnVuY3Rpb24gKHN0bXQsIHJlc3VsdCkge1xuICAgICAgICB2YXIgZW5kcyA9IGVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoc3RtdC50eXBlID09PSBTeW50YXguQmxvY2tTdGF0ZW1lbnQgJiYgKCFleHRyYS5jb21tZW50IHx8ICFzdG10LmxlYWRpbmdDb21tZW50cykgJiYgIWVuZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBbcmVzdWx0LCBzcGFjZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBbcmVzdWx0LCBiYXNlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3Jlc3VsdCwgbmV3bGluZSwgYmFzZV07XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlSWRlbnRpZmllcihub2RlKSB7XG4gICAgICAgIHJldHVybiB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKG5vZGUubmFtZSwgbm9kZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVBc3luY1ByZWZpeChub2RlLCBzcGFjZVJlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybiBub2RlLmFzeW5jID8gJ2FzeW5jJyArIChzcGFjZVJlcXVpcmVkID8gbm9FbXB0eVNwYWNlKCkgOiBzcGFjZSkgOiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVN0YXJTdWZmaXgobm9kZSkge1xuICAgICAgICB2YXIgaXNHZW5lcmF0b3IgPSBub2RlLmdlbmVyYXRvciAmJiAhZXh0cmEubW96LnN0YXJsZXNzR2VuZXJhdG9yO1xuICAgICAgICByZXR1cm4gaXNHZW5lcmF0b3IgPyAnKicgKyBzcGFjZSA6ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlTWV0aG9kUHJlZml4KHByb3ApIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBwcm9wLnZhbHVlLCBwcmVmaXggPSAnJztcbiAgICAgICAgaWYgKGZ1bmMuYXN5bmMpIHtcbiAgICAgICAgICAgIHByZWZpeCArPSBnZW5lcmF0ZUFzeW5jUHJlZml4KGZ1bmMsICFwcm9wLmNvbXB1dGVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZnVuYy5nZW5lcmF0b3IpIHtcbiAgICAgICAgICAgIC8vIGF2b2lkIHNwYWNlIGJlZm9yZSBtZXRob2QgbmFtZVxuICAgICAgICAgICAgcHJlZml4ICs9IGdlbmVyYXRlU3RhclN1ZmZpeChmdW5jKSA/ICcqJyA6ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmVmaXg7XG4gICAgfVxuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVQYXR0ZXJuID0gZnVuY3Rpb24gKG5vZGUsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IFN5bnRheC5JZGVudGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVJZGVudGlmaWVyKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihub2RlLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlRnVuY3Rpb25QYXJhbXMgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgaSwgaXosIHJlc3VsdCwgaGFzRGVmYXVsdDtcblxuICAgICAgICBoYXNEZWZhdWx0ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gU3ludGF4LkFycm93RnVuY3Rpb25FeHByZXNzaW9uICYmXG4gICAgICAgICAgICAgICAgIW5vZGUucmVzdCAmJiAoIW5vZGUuZGVmYXVsdHMgfHwgbm9kZS5kZWZhdWx0cy5sZW5ndGggPT09IDApICYmXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJhbXMubGVuZ3RoID09PSAxICYmIG5vZGUucGFyYW1zWzBdLnR5cGUgPT09IFN5bnRheC5JZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAvLyBhcmcgPT4geyB9IGNhc2VcbiAgICAgICAgICAgIHJlc3VsdCA9IFtnZW5lcmF0ZUFzeW5jUHJlZml4KG5vZGUsIHRydWUpLCBnZW5lcmF0ZUlkZW50aWZpZXIobm9kZS5wYXJhbXNbMF0pXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUudHlwZSA9PT0gU3ludGF4LkFycm93RnVuY3Rpb25FeHByZXNzaW9uID8gW2dlbmVyYXRlQXN5bmNQcmVmaXgobm9kZSwgZmFsc2UpXSA6IFtdO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJygnKTtcbiAgICAgICAgICAgIGlmIChub2RlLmRlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgaGFzRGVmYXVsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IG5vZGUucGFyYW1zLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzRGVmYXVsdCAmJiBub2RlLmRlZmF1bHRzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBkZWZhdWx0IHZhbHVlcy5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUFzc2lnbm1lbnQobm9kZS5wYXJhbXNbaV0sIG5vZGUuZGVmYXVsdHNbaV0sICc9JywgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVQYXR0ZXJuKG5vZGUucGFyYW1zW2ldLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlLnJlc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJy4uLicpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlSWRlbnRpZmllcihub2RlLnJlc3QpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goJyknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlRnVuY3Rpb25Cb2R5ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCwgZXhwcjtcblxuICAgICAgICByZXN1bHQgPSB0aGlzLmdlbmVyYXRlRnVuY3Rpb25QYXJhbXMobm9kZSk7XG5cbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gU3ludGF4LkFycm93RnVuY3Rpb25FeHByZXNzaW9uKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnPT4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgIGV4cHIgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihub2RlLmJvZHksIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpO1xuICAgICAgICAgICAgaWYgKGV4cHIudG9TdHJpbmcoKS5jaGFyQXQoMCkgPT09ICd7Jykge1xuICAgICAgICAgICAgICAgIGV4cHIgPSBbJygnLCBleHByLCAnKSddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZXhwcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2sobm9kZS5ib2R5LCBTX1RURkYpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlSXRlcmF0aW9uRm9yU3RhdGVtZW50ID0gZnVuY3Rpb24gKG9wZXJhdG9yLCBzdG10LCBmbGFncykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gWydmb3InICsgKHN0bXQuYXdhaXQgPyBub0VtcHR5U3BhY2UoKSArICdhd2FpdCcgOiAnJykgKyBzcGFjZSArICcoJ10sIHRoYXQgPSB0aGlzO1xuICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChzdG10LmxlZnQudHlwZSA9PT0gU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3RtdC5sZWZ0LmtpbmQgKyBub0VtcHR5U3BhY2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5sZWZ0LmRlY2xhcmF0aW9uc1swXSwgU19GRkZGKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQubGVmdCwgUHJlY2VkZW5jZS5DYWxsLCBFX1RUVCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgb3BlcmF0b3IpO1xuICAgICAgICAgICAgcmVzdWx0ID0gW2pvaW4oXG4gICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQucmlnaHQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpXG4gICAgICAgICAgICApLCAnKSddO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKHN0bXQuYm9keSwgZmxhZ3MpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVQcm9wZXJ0eUtleSA9IGZ1bmN0aW9uIChleHByLCBjb21wdXRlZCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgICAgaWYgKGNvbXB1dGVkKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnWycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwciwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuXG4gICAgICAgIGlmIChjb21wdXRlZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ10nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlQXNzaWdubWVudCA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCwgb3BlcmF0b3IsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgIGlmIChQcmVjZWRlbmNlLkFzc2lnbm1lbnQgPCBwcmVjZWRlbmNlKSB7XG4gICAgICAgICAgICBmbGFncyB8PSBGX0FMTE9XX0lOO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihsZWZ0LCBQcmVjZWRlbmNlLkNhbGwsIGZsYWdzKSxcbiAgICAgICAgICAgICAgICBzcGFjZSArIG9wZXJhdG9yICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24ocmlnaHQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgZmxhZ3MpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LFxuICAgICAgICAgICAgcHJlY2VkZW5jZVxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5zZW1pY29sb24gPSBmdW5jdGlvbiAoZmxhZ3MpIHtcbiAgICAgICAgaWYgKCFzZW1pY29sb25zICYmIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICc7JztcbiAgICB9O1xuXG4gICAgLy8gU3RhdGVtZW50cy5cblxuICAgIENvZGVHZW5lcmF0b3IuU3RhdGVtZW50ID0ge1xuXG4gICAgICAgIEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByYW5nZSwgY29udGVudCwgcmVzdWx0ID0gWyd7JywgbmV3bGluZV0sIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgZnVuY3Rpb25zIHdpdGhvdXQgYW55IGNvZGVcbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5ib2R5Lmxlbmd0aCA9PT0gMCAmJiBwcmVzZXJ2ZUJsYW5rTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBzdG10LnJhbmdlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VbMV0gLSByYW5nZVswXSA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhyYW5nZVswXSArIDEsIHJhbmdlWzFdIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFswXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ3snXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGksIGl6LCBmcmFnbWVudCwgYm9keUZsYWdzO1xuICAgICAgICAgICAgICAgIGJvZHlGbGFncyA9IFNfVEZGRjtcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGX0ZVTkNfQk9EWSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5RmxhZ3MgfD0gRl9ESVJFQ1RJVkVfQ1RYO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5ib2R5Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBiZWZvcmUgdGhlIGZpcnN0IGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuYm9keVswXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBzdG10LmJvZHlbMF0ubGVhZGluZ0NvbW1lbnRzWzBdLmV4dGVuZGVkUmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhyYW5nZVswXSwgcmFuZ2VbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFswXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsneyddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RtdC5ib2R5WzBdLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUJsYW5rTGluZXMoc3RtdC5yYW5nZVswXSwgc3RtdC5ib2R5WzBdLnJhbmdlWzBdLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBiZXR3ZWVuIGxpbmVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpIC0gMV0udHJhaWxpbmdDb21tZW50cyAgJiYgIXN0bXQuYm9keVtpXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQuYm9keVtpIC0gMV0ucmFuZ2VbMV0sIHN0bXQuYm9keVtpXS5yYW5nZVswXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5RmxhZ3MgfD0gRl9TRU1JQ09MT05fT1BUO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuYm9keVtpXS5sZWFkaW5nQ29tbWVudHMgJiYgcHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5ib2R5W2ldLCBib2R5RmxhZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBhZGRJbmRlbnQodGhhdC5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmJvZHlbaV0sIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJsYW5rTGluZXMgJiYgaSA8IGl6IC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGFkZCBhIG5ldyBsaW5lIGlmIHRoZXJlIGFyZSBsZWFkaW5nIGNvbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbmV4dCBzdGF0ZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpICsgMV0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgc3BhY2VzIGFmdGVyIHRoZSBsYXN0IGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBpeiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpXS50cmFpbGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlQmxhbmtMaW5lcyhzdG10LmJvZHlbaV0ucmFuZ2VbMV0sIHN0bXQucmFuZ2VbMV0sIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudCgnfScpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQnJlYWtTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgaWYgKHN0bXQubGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2JyZWFrICcgKyBzdG10LmxhYmVsLm5hbWUgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ2JyZWFrJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDb250aW51ZVN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoc3RtdC5sYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnY29udGludWUgJyArIHN0bXQubGFiZWwubmFtZSArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAnY29udGludWUnICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIENsYXNzQm9keTogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gWyAneycsIG5ld2xpbmVdLCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBzdG10LmJvZHkubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmJvZHlbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChiYXNlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCd9Jyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIENsYXNzRGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQ7XG4gICAgICAgICAgICByZXN1bHQgID0gWydjbGFzcyddO1xuICAgICAgICAgICAgaWYgKHN0bXQuaWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5pZCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdG10LnN1cGVyQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IGpvaW4oJ2V4dGVuZHMnLCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnN1cGVyQ2xhc3MsIFByZWNlZGVuY2UuVW5hcnksIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGZyYWdtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5ib2R5LCBTX1RGRlQpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRGlyZWN0aXZlU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChleHRyYS5yYXcgJiYgc3RtdC5yYXcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RtdC5yYXcgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXNjYXBlRGlyZWN0aXZlKHN0bXQuZGlyZWN0aXZlKSArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBEb1doaWxlU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIC8vIEJlY2F1c2UgYGRvIDQyIHdoaWxlIChjb25kKWAgaXMgU3ludGF4IEVycm9yLiBXZSBuZWVkIHNlbWljb2xvbi5cbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBqb2luKCdkbycsIHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIFNfVEZGRikpO1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KHN0bXQuYm9keSwgcmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybiBqb2luKHJlc3VsdCwgW1xuICAgICAgICAgICAgICAgICd3aGlsZScgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnRlc3QsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAnKScgKyB0aGlzLnNlbWljb2xvbihmbGFncylcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIENhdGNoQ2xhdXNlOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGd1YXJkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQucGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2NhdGNoJyArIHNwYWNlICsgJygnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5wYXJhbSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuZ3VhcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGd1YXJkID0gdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5ndWFyZCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNwbGljZSgyLCAwLCAnIGlmICcsIGd1YXJkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsnY2F0Y2gnXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIFNfVEZGRikpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBEZWJ1Z2dlclN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2RlYnVnZ2VyJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBFbXB0eVN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gJzsnO1xuICAgICAgICB9LFxuXG4gICAgICAgIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gWyAnZXhwb3J0JyBdLCBib2R5RmxhZ3M7XG5cbiAgICAgICAgICAgIGJvZHlGbGFncyA9IChmbGFncyAmIEZfU0VNSUNPTE9OX09QVCkgPyBTX1RGRlQgOiBTX1RGRkY7XG5cbiAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IEhvaXN0YWJsZURlY2xhcmF0aW9uW0RlZmF1bHRdXG4gICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBBc3NpZ25tZW50RXhwcmVzc2lvbltJbl0gO1xuICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsICdkZWZhdWx0Jyk7XG4gICAgICAgICAgICBpZiAoaXNTdGF0ZW1lbnQoc3RtdC5kZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmRlY2xhcmF0aW9uLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuZGVjbGFyYXRpb24sIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRXhwb3J0TmFtZWREZWNsYXJhdGlvbjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gWyAnZXhwb3J0JyBdLCBib2R5RmxhZ3MsIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgICAgICBib2R5RmxhZ3MgPSAoZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQpID8gU19URkZUIDogU19URkZGO1xuXG4gICAgICAgICAgICAvLyBleHBvcnQgVmFyaWFibGVTdGF0ZW1lbnRcbiAgICAgICAgICAgIC8vIGV4cG9ydCBEZWNsYXJhdGlvbltEZWZhdWx0XVxuICAgICAgICAgICAgaWYgKHN0bXQuZGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5kZWNsYXJhdGlvbiwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGV4cG9ydCBFeHBvcnRDbGF1c2VbTm9SZWZlcmVuY2VdIEZyb21DbGF1c2UgO1xuICAgICAgICAgICAgLy8gZXhwb3J0IEV4cG9ydENsYXVzZSA7XG4gICAgICAgICAgICBpZiAoc3RtdC5zcGVjaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuc3BlY2lmaWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsICd7JyArIHNwYWNlICsgJ30nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0bXQuc3BlY2lmaWVyc1swXS50eXBlID09PSBTeW50YXguRXhwb3J0QmF0Y2hTcGVjaWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc3BlY2lmaWVyc1swXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgJ3snKTtcbiAgICAgICAgICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgaXo7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5zcGVjaWZpZXJzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc3BlY2lmaWVyc1tpXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChiYXNlICsgJ30nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tJyArIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNvdXJjZSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW1pY29sb24oZmxhZ3MpXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuc2VtaWNvbG9uKGZsYWdzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBFeHBvcnRBbGxEZWNsYXJhdGlvbjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICAvLyBleHBvcnQgKiBGcm9tQ2xhdXNlIDtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgJ2V4cG9ydCcgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICAnKicgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICAnZnJvbScgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICAvLyBNb2R1bGVTcGVjaWZpZXJcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNvdXJjZSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VtaWNvbG9uKGZsYWdzKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSxcblxuICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50O1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBpc0NsYXNzUHJlZml4ZWQoZnJhZ21lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZTtcbiAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuc2xpY2UoMCwgNSkgIT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2RlID0gZnJhZ21lbnQuY2hhckNvZGVBdCg1KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZSA9PT0gMHg3QiAgLyogJ3snICovIHx8IGVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UoY29kZSkgfHwgZXN1dGlscy5jb2RlLmlzTGluZVRlcm1pbmF0b3IoY29kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb25QcmVmaXhlZChmcmFnbWVudCkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlO1xuICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudC5zbGljZSgwLCA4KSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvZGUgPSBmcmFnbWVudC5jaGFyQ29kZUF0KDgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlID09PSAweDI4IC8qICcoJyAqLyB8fCBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGNvZGUpIHx8IGNvZGUgPT09IDB4MkEgIC8qICcqJyAqLyB8fCBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihjb2RlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gaXNBc3luY1ByZWZpeGVkKGZyYWdtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZGUsIGksIGl6O1xuICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudC5zbGljZSgwLCA1KSAhPT0gJ2FzeW5jJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShmcmFnbWVudC5jaGFyQ29kZUF0KDUpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDYsIGl6ID0gZnJhZ21lbnQubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UoZnJhZ21lbnQuY2hhckNvZGVBdChpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpID09PSBpeikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudC5zbGljZShpLCBpICsgOCkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2RlID0gZnJhZ21lbnQuY2hhckNvZGVBdChpICsgOCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUgPT09IDB4MjggLyogJygnICovIHx8IGVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UoY29kZSkgfHwgY29kZSA9PT0gMHgyQSAgLyogJyonICovIHx8IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGNvZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQgPSBbdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5leHByZXNzaW9uLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCldO1xuICAgICAgICAgICAgLy8gMTIuNCAneycsICdmdW5jdGlvbicsICdjbGFzcycgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBwb3NpdGlvbi5cbiAgICAgICAgICAgIC8vIHdyYXAgZXhwcmVzc2lvbiB3aXRoIHBhcmVudGhlc2VzXG4gICAgICAgICAgICBmcmFnbWVudCA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKGZyYWdtZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4N0IgIC8qICd7JyAqLyB8fCAgLy8gT2JqZWN0RXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICBpc0NsYXNzUHJlZml4ZWQoZnJhZ21lbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgIGlzRnVuY3Rpb25QcmVmaXhlZChmcmFnbWVudCkgfHxcbiAgICAgICAgICAgICAgICAgICAgaXNBc3luY1ByZWZpeGVkKGZyYWdtZW50KSB8fFxuICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aXZlICYmIChmbGFncyAmIEZfRElSRUNUSVZFX0NUWCkgJiYgc3RtdC5leHByZXNzaW9uLnR5cGUgPT09IFN5bnRheC5MaXRlcmFsICYmIHR5cGVvZiBzdG10LmV4cHJlc3Npb24udmFsdWUgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsnKCcsIHJlc3VsdCwgJyknICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5zZW1pY29sb24oZmxhZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgSW1wb3J0RGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgLy8gRVM2OiAxNS4yLjEgdmFsaWQgaW1wb3J0IGRlY2xhcmF0aW9uczpcbiAgICAgICAgICAgIC8vICAgICAtIGltcG9ydCBJbXBvcnRDbGF1c2UgRnJvbUNsYXVzZSA7XG4gICAgICAgICAgICAvLyAgICAgLSBpbXBvcnQgTW9kdWxlU3BlY2lmaWVyIDtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGN1cnNvciwgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIElmIG5vIEltcG9ydENsYXVzZSBpcyBwcmVzZW50LFxuICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgYmUgYGltcG9ydCBNb2R1bGVTcGVjaWZpZXJgIHNvIHNraXAgYGZyb21gXG4gICAgICAgICAgICAvLyBNb2R1bGVTcGVjaWZpZXIgaXMgU3RyaW5nTGl0ZXJhbC5cbiAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gaW1wb3J0IE1vZHVsZVNwZWNpZmllciA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAvLyBNb2R1bGVTcGVjaWZpZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zb3VyY2UsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW1pY29sb24oZmxhZ3MpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW1wb3J0IEltcG9ydENsYXVzZSBGcm9tQ2xhdXNlIDtcbiAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAnaW1wb3J0J1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGN1cnNvciA9IDA7XG5cbiAgICAgICAgICAgIC8vIEltcG9ydGVkQmluZGluZ1xuICAgICAgICAgICAgaWYgKHN0bXQuc3BlY2lmaWVyc1tjdXJzb3JdLnR5cGUgPT09IFN5bnRheC5JbXBvcnREZWZhdWx0U3BlY2lmaWVyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc3BlY2lmaWVyc1tjdXJzb3JdLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVClcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICArK2N1cnNvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0bXQuc3BlY2lmaWVyc1tjdXJzb3JdKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnNbY3Vyc29yXS50eXBlID09PSBTeW50YXguSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5hbWVTcGFjZUltcG9ydFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc3BlY2lmaWVyc1tjdXJzb3JdLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVClcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTmFtZWRJbXBvcnRzXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlICsgJ3snKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKHN0bXQuc3BlY2lmaWVycy5sZW5ndGggLSBjdXJzb3IpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBvcnQgeyAuLi4gfSBmcm9tIFwiLi4uXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbY3Vyc29yXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlICsgJ30nICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIC4uLixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIC4uLixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0gZnJvbSBcIi4uLlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGN1cnNvciwgaXogPSBzdG10LnNwZWNpZmllcnMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYmFzZSArICd9JyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFtcbiAgICAgICAgICAgICAgICAnZnJvbScgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICAvLyBNb2R1bGVTcGVjaWZpZXJcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNvdXJjZSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VtaWNvbG9uKGZsYWdzKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvcjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgaXRlbUZsYWdzID0gKGZsYWdzICYgRl9BTExPV19JTikgPyBFX1RUVCA6IEVfRlRUO1xuICAgICAgICAgICAgaWYgKHN0bXQuaW5pdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuaWQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgaXRlbUZsYWdzKSxcbiAgICAgICAgICAgICAgICAgICAgc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgICc9JyxcbiAgICAgICAgICAgICAgICAgICAgc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuaW5pdCwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBpdGVtRmxhZ3MpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlUGF0dGVybihzdG10LmlkLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGl0ZW1GbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICAvLyBWYXJpYWJsZURlY2xhcmF0b3IgaXMgdHlwZWQgYXMgU3RhdGVtZW50LFxuICAgICAgICAgICAgLy8gYnV0IGpvaW5lZCB3aXRoIGNvbW1hIChub3QgTGluZVRlcm1pbmF0b3IpLlxuICAgICAgICAgICAgLy8gU28gaWYgY29tbWVudCBpcyBhdHRhY2hlZCB0byB0YXJnZXQgbm9kZSwgd2Ugc2hvdWxkIHNwZWNpYWxpemUuXG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpeiwgbm9kZSwgYm9keUZsYWdzLCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgcmVzdWx0ID0gWyBzdG10LmtpbmQgXTtcblxuICAgICAgICAgICAgYm9keUZsYWdzID0gKGZsYWdzICYgRl9BTExPV19JTikgPyBTX1RGRkYgOiBTX0ZGRkY7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGJsb2NrKCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBzdG10LmRlY2xhcmF0aW9uc1swXTtcbiAgICAgICAgICAgICAgICBpZiAoZXh0cmEuY29tbWVudCAmJiBub2RlLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KG5vZGUsIGJvZHlGbGFncykpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub0VtcHR5U3BhY2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQobm9kZSwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMSwgaXogPSBzdG10LmRlY2xhcmF0aW9ucy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzdG10LmRlY2xhcmF0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnQgJiYgbm9kZS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQobm9kZSwgYm9keUZsYWdzKSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZVN0YXRlbWVudChub2RlLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0bXQuZGVjbGFyYXRpb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB3aXRoSW5kZW50KGJsb2NrKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYmxvY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5zZW1pY29sb24oZmxhZ3MpKTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBUaHJvd1N0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gW2pvaW4oXG4gICAgICAgICAgICAgICAgJ3Rocm93JyxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmFyZ3VtZW50LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVClcbiAgICAgICAgICAgICksIHRoaXMuc2VtaWNvbG9uKGZsYWdzKV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgVHJ5U3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGksIGl6LCBndWFyZGVkSGFuZGxlcnM7XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IFsndHJ5JywgdGhpcy5tYXliZUJsb2NrKHN0bXQuYmxvY2ssIFNfVEZGRildO1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KHN0bXQuYmxvY2ssIHJlc3VsdCk7XG5cbiAgICAgICAgICAgIGlmIChzdG10LmhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgLy8gb2xkIGludGVyZmFjZVxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5oYW5kbGVycy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuaGFuZGxlcnNbaV0sIFNfVEZGRikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RtdC5maW5hbGl6ZXIgfHwgaSArIDEgIT09IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1heWJlQmxvY2tTdWZmaXgoc3RtdC5oYW5kbGVyc1tpXS5ib2R5LCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBndWFyZGVkSGFuZGxlcnMgPSBzdG10Lmd1YXJkZWRIYW5kbGVycyB8fCBbXTtcblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZ3VhcmRlZEhhbmRsZXJzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoZ3VhcmRlZEhhbmRsZXJzW2ldLCBTX1RGRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuZmluYWxpemVyIHx8IGkgKyAxICE9PSBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KGd1YXJkZWRIYW5kbGVyc1tpXS5ib2R5LCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gbmV3IGludGVyZmFjZVxuICAgICAgICAgICAgICAgIGlmIChzdG10LmhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3RtdC5oYW5kbGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBzdG10LmhhbmRsZXIubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuaGFuZGxlcltpXSwgU19URkZGKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuZmluYWxpemVyIHx8IGkgKyAxICE9PSBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1heWJlQmxvY2tTdWZmaXgoc3RtdC5oYW5kbGVyW2ldLmJvZHksIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5oYW5kbGVyLCBTX1RGRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmZpbmFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChzdG10LmhhbmRsZXIuYm9keSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdG10LmZpbmFsaXplcikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbJ2ZpbmFsbHknLCB0aGlzLm1heWJlQmxvY2soc3RtdC5maW5hbGl6ZXIsIFNfVEZGRildKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgU3dpdGNoU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50LCBpLCBpeiwgYm9keUZsYWdzLCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ3N3aXRjaCcgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5kaXNjcmltaW5hbnQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgJyknICsgc3BhY2UgKyAneycgKyBuZXdsaW5lXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHN0bXQuY2FzZXMpIHtcbiAgICAgICAgICAgICAgICBib2R5RmxhZ3MgPSBTX1RGRkY7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBzdG10LmNhc2VzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGl6IC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUZsYWdzIHw9IEZfU0VNSUNPTE9OX09QVDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IGFkZEluZGVudCh0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuY2FzZXNbaV0sIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGZyYWdtZW50KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChhZGRJbmRlbnQoJ30nKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFN3aXRjaENhc2U6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQsIGksIGl6LCBib2R5RmxhZ3MsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0bXQudGVzdCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICBqb2luKCdjYXNlJywgdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC50ZXN0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgJzonXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gWydkZWZhdWx0OiddO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgICAgIGl6ID0gc3RtdC5jb25zZXF1ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoaXogJiYgc3RtdC5jb25zZXF1ZW50WzBdLnR5cGUgPT09IFN5bnRheC5CbG9ja1N0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoYXQubWF5YmVCbG9jayhzdG10LmNvbnNlcXVlbnRbMF0sIFNfVEZGRik7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IGl6ICYmICFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBib2R5RmxhZ3MgPSBTX1RGRkY7XG4gICAgICAgICAgICAgICAgZm9yICg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBpeiAtIDEgJiYgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlGbGFncyB8PSBGX1NFTUlDT0xPTl9PUFQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBhZGRJbmRlbnQodGhhdC5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmNvbnNlcXVlbnRbaV0sIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSAhPT0gaXogJiYgIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIElmU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGJvZHlGbGFncywgc2VtaWNvbG9uT3B0aW9uYWwsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAnaWYnICsgc3BhY2UgKyAnKCcsXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQudGVzdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZW1pY29sb25PcHRpb25hbCA9IGZsYWdzICYgRl9TRU1JQ09MT05fT1BUO1xuICAgICAgICAgICAgYm9keUZsYWdzID0gU19URkZGO1xuICAgICAgICAgICAgaWYgKHNlbWljb2xvbk9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgYm9keUZsYWdzIHw9IEZfU0VNSUNPTE9OX09QVDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdG10LmFsdGVybmF0ZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmNvbnNlcXVlbnQsIFNfVEZGRikpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChzdG10LmNvbnNlcXVlbnQsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuYWx0ZXJuYXRlLnR5cGUgPT09IFN5bnRheC5JZlN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgWydlbHNlICcsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5hbHRlcm5hdGUsIGJvZHlGbGFncyldKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgam9pbignZWxzZScsIHRoaXMubWF5YmVCbG9jayhzdG10LmFsdGVybmF0ZSwgYm9keUZsYWdzKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKHN0bXQuY29uc2VxdWVudCwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEZvclN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsnZm9yJyArIHNwYWNlICsgJygnXTtcbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5pbml0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmluaXQudHlwZSA9PT0gU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5pbml0LCBTX0ZGRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZfQUxMT1dfSU4gYmVjb21lcyBmYWxzZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuaW5pdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9GVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc7Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnOycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzdG10LnRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnRlc3QsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc7Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzsnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RtdC51cGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnVwZGF0ZSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJyknKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnKScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCA/IFNfVEZGVCA6IFNfVEZGRikpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBGb3JJblN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUl0ZXJhdGlvbkZvclN0YXRlbWVudCgnaW4nLCBzdG10LCBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCA/IFNfVEZGVCA6IFNfVEZGRik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRm9yT2ZTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJdGVyYXRpb25Gb3JTdGF0ZW1lbnQoJ29mJywgc3RtdCwgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQgPyBTX1RGRlQgOiBTX1RGRkYpO1xuICAgICAgICB9LFxuXG4gICAgICAgIExhYmVsZWRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIFtzdG10LmxhYmVsLm5hbWUgKyAnOicsIHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUID8gU19URkZUIDogU19URkZGKV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgUHJvZ3JhbTogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBmcmFnbWVudCwgaSwgaXosIGJvZHlGbGFncztcbiAgICAgICAgICAgIGl6ID0gc3RtdC5ib2R5Lmxlbmd0aDtcbiAgICAgICAgICAgIHJlc3VsdCA9IFtzYWZlQ29uY2F0ZW5hdGlvbiAmJiBpeiA+IDAgPyAnXFxuJyA6ICcnXTtcbiAgICAgICAgICAgIGJvZHlGbGFncyA9IFNfVEZURjtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzYWZlQ29uY2F0ZW5hdGlvbiAmJiBpID09PSBpeiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keUZsYWdzIHw9IEZfU0VNSUNPTE9OX09QVDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYmVmb3JlIHRoZSBmaXJzdCBsaW5lXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVswXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUJsYW5rTGluZXMoc3RtdC5yYW5nZVswXSwgc3RtdC5ib2R5W2ldLnJhbmdlWzBdLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBiZXR3ZWVuIGxpbmVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaSAtIDFdLnRyYWlsaW5nQ29tbWVudHMgJiYgIXN0bXQuYm9keVtpXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUJsYW5rTGluZXMoc3RtdC5ib2R5W2kgLSAxXS5yYW5nZVsxXSwgc3RtdC5ib2R5W2ldLnJhbmdlWzBdLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBhZGRJbmRlbnQodGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmJvZHlbaV0sIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeiAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGZyYWdtZW50KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpICsgMV0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJsYW5rTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBhZnRlciB0aGUgbGFzdCBsaW5lXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBpeiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RtdC5ib2R5W2ldLnRyYWlsaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUJsYW5rTGluZXMoc3RtdC5ib2R5W2ldLnJhbmdlWzFdLCBzdG10LnJhbmdlWzFdLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVBc3luY1ByZWZpeChzdG10LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAnZnVuY3Rpb24nLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlU3RhclN1ZmZpeChzdG10KSB8fCBub0VtcHR5U3BhY2UoKSxcbiAgICAgICAgICAgICAgICBzdG10LmlkID8gZ2VuZXJhdGVJZGVudGlmaWVyKHN0bXQuaWQpIDogJycsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUZ1bmN0aW9uQm9keShzdG10KVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSxcblxuICAgICAgICBSZXR1cm5TdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgaWYgKHN0bXQuYXJndW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2pvaW4oXG4gICAgICAgICAgICAgICAgICAgICdyZXR1cm4nLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmFyZ3VtZW50LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVClcbiAgICAgICAgICAgICAgICApLCB0aGlzLnNlbWljb2xvbihmbGFncyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFsncmV0dXJuJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgV2hpbGVTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICd3aGlsZScgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC50ZXN0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgICcpJ1xuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUID8gU19URkZUIDogU19URkZGKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFdpdGhTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICd3aXRoJyArIHNwYWNlICsgJygnLFxuICAgICAgICAgICAgICAgICAgICB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10Lm9iamVjdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCA/IFNfVEZGVCA6IFNfVEZGRikpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIG1lcmdlKENvZGVHZW5lcmF0b3IucHJvdG90eXBlLCBDb2RlR2VuZXJhdG9yLlN0YXRlbWVudCk7XG5cbiAgICAvLyBFeHByZXNzaW9ucy5cblxuICAgIENvZGVHZW5lcmF0b3IuRXhwcmVzc2lvbiA9IHtcblxuICAgICAgICBTZXF1ZW5jZUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXo7XG4gICAgICAgICAgICBpZiAoUHJlY2VkZW5jZS5TZXF1ZW5jZSA8IHByZWNlZGVuY2UpIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSBGX0FMTE9XX0lOO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHIuZXhwcmVzc2lvbnMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuZXhwcmVzc2lvbnNbaV0sIFByZWNlZGVuY2UuQXNzaWdubWVudCwgZmxhZ3MpKTtcbiAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQXNzaWdubWVudChleHByLmxlZnQsIGV4cHIucmlnaHQsIGV4cHIub3BlcmF0b3IsIHByZWNlZGVuY2UsIGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwciksIFByZWNlZGVuY2UuQXJyb3dGdW5jdGlvbiwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChQcmVjZWRlbmNlLkNvbmRpdGlvbmFsIDwgcHJlY2VkZW5jZSkge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZfQUxMT1dfSU47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci50ZXN0LCBQcmVjZWRlbmNlLkNvYWxlc2NlLCBmbGFncyksXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlICsgJz8nICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuY29uc2VxdWVudCwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBmbGFncyksXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlICsgJzonICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYWx0ZXJuYXRlLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGZsYWdzKVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgUHJlY2VkZW5jZS5Db25kaXRpb25hbCxcbiAgICAgICAgICAgICAgICBwcmVjZWRlbmNlXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIExvZ2ljYWxFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChleHByLm9wZXJhdG9yID09PSAnPz8nKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRl9GT1VORF9DT0FMRVNDRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLkJpbmFyeUV4cHJlc3Npb24oZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEJpbmFyeUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgbGVmdFByZWNlZGVuY2UsIHJpZ2h0UHJlY2VkZW5jZSwgY3VycmVudFByZWNlZGVuY2UsIGZyYWdtZW50LCBsZWZ0U291cmNlO1xuICAgICAgICAgICAgY3VycmVudFByZWNlZGVuY2UgPSBCaW5hcnlQcmVjZWRlbmNlW2V4cHIub3BlcmF0b3JdO1xuICAgICAgICAgICAgbGVmdFByZWNlZGVuY2UgPSBleHByLm9wZXJhdG9yID09PSAnKionID8gUHJlY2VkZW5jZS5Qb3N0Zml4IDogY3VycmVudFByZWNlZGVuY2U7XG4gICAgICAgICAgICByaWdodFByZWNlZGVuY2UgPSBleHByLm9wZXJhdG9yID09PSAnKionID8gY3VycmVudFByZWNlZGVuY2UgOiBjdXJyZW50UHJlY2VkZW5jZSArIDE7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UHJlY2VkZW5jZSA8IHByZWNlZGVuY2UpIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSBGX0FMTE9XX0lOO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIubGVmdCwgbGVmdFByZWNlZGVuY2UsIGZsYWdzKTtcblxuICAgICAgICAgICAgbGVmdFNvdXJjZSA9IGZyYWdtZW50LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIGlmIChsZWZ0U291cmNlLmNoYXJDb2RlQXQobGVmdFNvdXJjZS5sZW5ndGggLSAxKSA9PT0gMHgyRiAvKiAvICovICYmIGVzdXRpbHMuY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1KGV4cHIub3BlcmF0b3IuY2hhckNvZGVBdCgwKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbZnJhZ21lbnQsIG5vRW1wdHlTcGFjZSgpLCBleHByLm9wZXJhdG9yXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihmcmFnbWVudCwgZXhwci5vcGVyYXRvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5yaWdodCwgcmlnaHRQcmVjZWRlbmNlLCBmbGFncyk7XG5cbiAgICAgICAgICAgIGlmIChleHByLm9wZXJhdG9yID09PSAnLycgJiYgZnJhZ21lbnQudG9TdHJpbmcoKS5jaGFyQXQoMCkgPT09ICcvJyB8fFxuICAgICAgICAgICAgZXhwci5vcGVyYXRvci5zbGljZSgtMSkgPT09ICc8JyAmJiBmcmFnbWVudC50b1N0cmluZygpLnNsaWNlKDAsIDMpID09PSAnIS0tJykge1xuICAgICAgICAgICAgICAgIC8vIElmICcvJyBjb25jYXRzIHdpdGggJy8nIG9yIGA8YCBjb25jYXRzIHdpdGggYCEtLWAsIGl0IGlzIGludGVycHJldGVkIGFzIGNvbW1lbnQgc3RhcnRcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub0VtcHR5U3BhY2UoKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci5vcGVyYXRvciA9PT0gJ2luJyAmJiAhKGZsYWdzICYgRl9BTExPV19JTikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWycoJywgcmVzdWx0LCAnKSddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChleHByLm9wZXJhdG9yID09PSAnfHwnIHx8IGV4cHIub3BlcmF0b3IgPT09ICcmJicpICYmIChmbGFncyAmIEZfRk9VTkRfQ09BTEVTQ0UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnKCcsIHJlc3VsdCwgJyknXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBjdXJyZW50UHJlY2VkZW5jZSwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ2FsbEV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXo7XG5cbiAgICAgICAgICAgIC8vIEZfQUxMT1dfVU5QQVJBVEhfTkVXIGJlY29tZXMgZmFsc2UuXG4gICAgICAgICAgICByZXN1bHQgPSBbdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5jYWxsZWUsIFByZWNlZGVuY2UuQ2FsbCwgRV9UVEYpXTtcblxuICAgICAgICAgICAgaWYgKGV4cHIub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPy4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goJygnKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZXhwclsnYXJndW1lbnRzJ10ubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHJbJ2FyZ3VtZW50cyddW2ldLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcpJyk7XG5cbiAgICAgICAgICAgIGlmICghKGZsYWdzICYgRl9BTExPV19DQUxMKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbJygnLCByZXN1bHQsICcpJ107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLkNhbGwsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIENoYWluRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoUHJlY2VkZW5jZS5PcHRpb25hbENoYWluaW5nIDwgcHJlY2VkZW5jZSkge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZfQUxMT1dfQ0FMTDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuZXhwcmVzc2lvbiwgUHJlY2VkZW5jZS5PcHRpb25hbENoYWluaW5nLCBmbGFncyk7XG5cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLk9wdGlvbmFsQ2hhaW5pbmcsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIE5ld0V4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgbGVuZ3RoLCBpLCBpeiwgaXRlbUZsYWdzO1xuICAgICAgICAgICAgbGVuZ3RoID0gZXhwclsnYXJndW1lbnRzJ10ubGVuZ3RoO1xuXG4gICAgICAgICAgICAvLyBGX0FMTE9XX0NBTEwgYmVjb21lcyBmYWxzZS5cbiAgICAgICAgICAgIC8vIEZfQUxMT1dfVU5QQVJBVEhfTkVXIG1heSBiZWNvbWUgZmFsc2UuXG4gICAgICAgICAgICBpdGVtRmxhZ3MgPSAoZmxhZ3MgJiBGX0FMTE9XX1VOUEFSQVRIX05FVyAmJiAhcGFyZW50aGVzZXMgJiYgbGVuZ3RoID09PSAwKSA/IEVfVEZUIDogRV9URkY7XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4oXG4gICAgICAgICAgICAgICAgJ25ldycsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5jYWxsZWUsIFByZWNlZGVuY2UuTmV3LCBpdGVtRmxhZ3MpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIShmbGFncyAmIEZfQUxMT1dfVU5QQVJBVEhfTkVXKSB8fCBwYXJlbnRoZXNlcyB8fCBsZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJygnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwclsnYXJndW1lbnRzJ11baV0sIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnKScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5OZXcsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIE1lbWJlckV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQ7XG5cbiAgICAgICAgICAgIC8vIEZfQUxMT1dfVU5QQVJBVEhfTkVXIGJlY29tZXMgZmFsc2UuXG4gICAgICAgICAgICByZXN1bHQgPSBbdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5vYmplY3QsIFByZWNlZGVuY2UuQ2FsbCwgKGZsYWdzICYgRl9BTExPV19DQUxMKSA/IEVfVFRGIDogRV9URkYpXTtcblxuICAgICAgICAgICAgaWYgKGV4cHIuY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwci5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPy4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnWycpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucHJvcGVydHksIFByZWNlZGVuY2UuU2VxdWVuY2UsIGZsYWdzICYgRl9BTExPV19DQUxMID8gRV9UVFQgOiBFX1RGVCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCddJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghZXhwci5vcHRpb25hbCAmJiBleHByLm9iamVjdC50eXBlID09PSBTeW50YXguTGl0ZXJhbCAmJiB0eXBlb2YgZXhwci5vYmplY3QudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhbGwgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAxLiBObyBmbG9hdGluZyBwb2ludFxuICAgICAgICAgICAgICAgICAgICAvLyAgIDIuIERvbid0IGhhdmUgZXhwb25lbnRzXG4gICAgICAgICAgICAgICAgICAgIC8vICAgMy4gVGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgZGVjaW1hbCBkaWdpdFxuICAgICAgICAgICAgICAgICAgICAvLyAgIDQuIE5vdCBoZXhhZGVjaW1hbCBPUiBvY3RhbCBudW1iZXIgbGl0ZXJhbFxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgYWRkIGEgZmxvYXRpbmcgcG9pbnQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC5pbmRleE9mKCcuJykgPCAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIS9bZUV4WF0vLnRlc3QoZnJhZ21lbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN1dGlscy5jb2RlLmlzRGVjaW1hbERpZ2l0KGZyYWdtZW50LmNoYXJDb2RlQXQoZnJhZ21lbnQubGVuZ3RoIC0gMSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShmcmFnbWVudC5sZW5ndGggPj0gMiAmJiBmcmFnbWVudC5jaGFyQ29kZUF0KDApID09PSA0OCkgIC8vICcwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChleHByLm9wdGlvbmFsID8gJz8uJyA6ICcuJyk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVJZGVudGlmaWVyKGV4cHIucHJvcGVydHkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuTWVtYmVyLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBNZXRhUHJvcGVydHk6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godHlwZW9mIGV4cHIubWV0YSA9PT0gXCJzdHJpbmdcIiA/IGV4cHIubWV0YSA6IGdlbmVyYXRlSWRlbnRpZmllcihleHByLm1ldGEpKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcuJyk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0eXBlb2YgZXhwci5wcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIiA/IGV4cHIucHJvcGVydHkgOiBnZW5lcmF0ZUlkZW50aWZpZXIoZXhwci5wcm9wZXJ0eSkpO1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuTWVtYmVyLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBVbmFyeUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQsIHJpZ2h0Q2hhckNvZGUsIGxlZnRTb3VyY2UsIGxlZnRDaGFyQ29kZTtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5hcmd1bWVudCwgUHJlY2VkZW5jZS5VbmFyeSwgRV9UVFQpO1xuXG4gICAgICAgICAgICBpZiAoc3BhY2UgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihleHByLm9wZXJhdG9yLCBmcmFnbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtleHByLm9wZXJhdG9yXTtcbiAgICAgICAgICAgICAgICBpZiAoZXhwci5vcGVyYXRvci5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSwgdm9pZCwgdHlwZW9mXG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBgdHlwZW9mIFtdYCwgbm90IGB0eXBlb2ZbXWBcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGluc2VydGluZyBzcGFjZXMgYmV0d2VlbiBvcGVyYXRvciBhbmQgYXJndW1lbnQgaWYgaXQgaXMgdW5uZWNlc3NhcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gbGlrZSwgYCFjb25kYFxuICAgICAgICAgICAgICAgICAgICBsZWZ0U291cmNlID0gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxlZnRDaGFyQ29kZSA9IGxlZnRTb3VyY2UuY2hhckNvZGVBdChsZWZ0U291cmNlLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICByaWdodENoYXJDb2RlID0gZnJhZ21lbnQudG9TdHJpbmcoKS5jaGFyQ29kZUF0KDApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgoKGxlZnRDaGFyQ29kZSA9PT0gMHgyQiAgLyogKyAqLyB8fCBsZWZ0Q2hhckNvZGUgPT09IDB4MkQgIC8qIC0gKi8pICYmIGxlZnRDaGFyQ29kZSA9PT0gcmlnaHRDaGFyQ29kZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUobGVmdENoYXJDb2RlKSAmJiBlc3V0aWxzLmNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShyaWdodENoYXJDb2RlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vRW1wdHlTcGFjZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLlVuYXJ5LCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBZaWVsZEV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgIGlmIChleHByLmRlbGVnYXRlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gJ3lpZWxkKic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICd5aWVsZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhwci5hcmd1bWVudCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4oXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5hcmd1bWVudCwgUHJlY2VkZW5jZS5ZaWVsZCwgRV9UVFQpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLllpZWxkLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBBd2FpdEV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGpvaW4oXG4gICAgICAgICAgICAgICAgZXhwci5hbGwgPyAnYXdhaXQqJyA6ICdhd2FpdCcsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5hcmd1bWVudCwgUHJlY2VkZW5jZS5Bd2FpdCwgRV9UVFQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuQXdhaXQsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFVwZGF0ZUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgaWYgKGV4cHIucHJlZml4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5vcGVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYXJndW1lbnQsIFByZWNlZGVuY2UuVW5hcnksIEVfVFRUKVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBQcmVjZWRlbmNlLlVuYXJ5LFxuICAgICAgICAgICAgICAgICAgICBwcmVjZWRlbmNlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmFyZ3VtZW50LCBQcmVjZWRlbmNlLlBvc3RmaXgsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgZXhwci5vcGVyYXRvclxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgUHJlY2VkZW5jZS5Qb3N0Zml4LFxuICAgICAgICAgICAgICAgIHByZWNlZGVuY2VcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRnVuY3Rpb25FeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVBc3luY1ByZWZpeChleHByLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAnZnVuY3Rpb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKGV4cHIuaWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZVN0YXJTdWZmaXgoZXhwcikgfHwgbm9FbXB0eVNwYWNlKCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlSWRlbnRpZmllcihleHByLmlkKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlU3RhclN1ZmZpeChleHByKSB8fCBzcGFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXJyYXlQYXR0ZXJuOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkFycmF5RXhwcmVzc2lvbihleHByLCBwcmVjZWRlbmNlLCBmbGFncywgdHJ1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXJyYXlFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MsIGlzUGF0dGVybikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgbXVsdGlsaW5lLCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIGlmICghZXhwci5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tdJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG11bHRpbGluZSA9IGlzUGF0dGVybiA/IGZhbHNlIDogZXhwci5lbGVtZW50cy5sZW5ndGggPiAxO1xuICAgICAgICAgICAgcmVzdWx0ID0gWydbJywgbXVsdGlsaW5lID8gbmV3bGluZSA6ICcnXTtcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKGluZGVudCkge1xuICAgICAgICAgICAgICAgIHZhciBpLCBpejtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHIuZWxlbWVudHMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cHIuZWxlbWVudHNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChtdWx0aWxpbmUgPyBpbmRlbnQgOiAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmVsZW1lbnRzW2ldLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIChtdWx0aWxpbmUgPyBuZXdsaW5lIDogc3BhY2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG11bHRpbGluZSAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG11bHRpbGluZSA/IGJhc2UgOiAnJyk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnXScpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBSZXN0RWxlbWVudDogZnVuY3Rpb24oZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiAnLi4uJyArIHRoaXMuZ2VuZXJhdGVQYXR0ZXJuKGV4cHIuYXJndW1lbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIENsYXNzRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBmcmFnbWVudDtcbiAgICAgICAgICAgIHJlc3VsdCA9IFsnY2xhc3MnXTtcbiAgICAgICAgICAgIGlmIChleHByLmlkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuaWQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhwci5zdXBlckNsYXNzKSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBqb2luKCdleHRlbmRzJywgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5zdXBlckNsYXNzLCBQcmVjZWRlbmNlLlVuYXJ5LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlU3RhdGVtZW50KGV4cHIuYm9keSwgU19URkZUKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIE1ldGhvZERlZmluaXRpb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQ7XG4gICAgICAgICAgICBpZiAoZXhwclsnc3RhdGljJ10pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ3N0YXRpYycgKyBzcGFjZV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHIua2luZCA9PT0gJ2dldCcgfHwgZXhwci5raW5kID09PSAnc2V0Jykge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gW1xuICAgICAgICAgICAgICAgICAgICBqb2luKGV4cHIua2luZCwgdGhpcy5nZW5lcmF0ZVByb3BlcnR5S2V5KGV4cHIua2V5LCBleHByLmNvbXB1dGVkKSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwci52YWx1ZSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IFtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVNZXRob2RQcmVmaXgoZXhwciksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwci52YWx1ZSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgUHJvcGVydHk6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgaWYgKGV4cHIua2luZCA9PT0gJ2dldCcgfHwgZXhwci5raW5kID09PSAnc2V0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIGV4cHIua2luZCwgbm9FbXB0eVNwYWNlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwci52YWx1ZSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci5zaG9ydGhhbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwci52YWx1ZS50eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQXNzaWdubWVudFBhdHRlcm4oZXhwci52YWx1ZSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVByb3BlcnR5S2V5KGV4cHIua2V5LCBleHByLmNvbXB1dGVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIubWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVNZXRob2RQcmVmaXgoZXhwciksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwci52YWx1ZSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCksXG4gICAgICAgICAgICAgICAgJzonICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci52YWx1ZSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVClcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgT2JqZWN0RXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgbXVsdGlsaW5lLCByZXN1bHQsIGZyYWdtZW50LCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgaWYgKCFleHByLnByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd7fSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtdWx0aWxpbmUgPSBleHByLnByb3BlcnRpZXMubGVuZ3RoID4gMTtcblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnByb3BlcnRpZXNbMF0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIW11bHRpbGluZSkge1xuICAgICAgICAgICAgICAgIC8vIGlzc3VlcyA0XG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHRyYW5zZm9ybSBmcm9tXG4gICAgICAgICAgICAgICAgLy8gICBkZWphdnUuQ2xhc3MuZGVjbGFyZSh7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgbWV0aG9kMjogZnVuY3Rpb24gKCkge31cbiAgICAgICAgICAgICAgICAvLyAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIHRvXG4gICAgICAgICAgICAgICAgLy8gICBkZWphdnUuQ2xhc3MuZGVjbGFyZSh7bWV0aG9kMjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIH19KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0xpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoZnJhZ21lbnQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbICd7Jywgc3BhY2UsIGZyYWdtZW50LCBzcGFjZSwgJ30nIF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uIChpbmRlbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSwgaXo7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gWyAneycsIG5ld2xpbmUsIGluZGVudCwgZnJhZ21lbnQgXTtcblxuICAgICAgICAgICAgICAgIGlmIChtdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgbmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDEsIGl6ID0gZXhwci5wcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGluZGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnByb3BlcnRpZXNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJhc2UpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ30nKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXNzaWdubWVudFBhdHRlcm46IGZ1bmN0aW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUFzc2lnbm1lbnQoZXhwci5sZWZ0LCBleHByLnJpZ2h0LCAnPScsIHByZWNlZGVuY2UsIGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBPYmplY3RQYXR0ZXJuOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGksIGl6LCBtdWx0aWxpbmUsIHByb3BlcnR5LCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIGlmICghZXhwci5wcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAne30nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtdWx0aWxpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChleHByLnByb3BlcnRpZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHkgPSBleHByLnByb3BlcnRpZXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS50eXBlID09PSBTeW50YXguUHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgJiYgcHJvcGVydHkudmFsdWUudHlwZSAhPT0gU3ludGF4LklkZW50aWZpZXJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZXhwci5wcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBleHByLnByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LnR5cGUgPT09IFN5bnRheC5Qcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXByb3BlcnR5LnNob3J0aGFuZFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpbGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IFsneycsIG11bHRpbGluZSA/IG5ld2xpbmUgOiAnJyBdO1xuXG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uIChpbmRlbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSwgaXo7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLnByb3BlcnRpZXMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChtdWx0aWxpbmUgPyBpbmRlbnQgOiAnJyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucHJvcGVydGllc1tpXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIChtdWx0aWxpbmUgPyBuZXdsaW5lIDogc3BhY2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAobXVsdGlsaW5lICYmICFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobXVsdGlsaW5lID8gYmFzZSA6ICcnKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCd9Jyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFRoaXNFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiAndGhpcyc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgU3VwZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuICdzdXBlcic7XG4gICAgICAgIH0sXG5cbiAgICAgICAgSWRlbnRpZmllcjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVJZGVudGlmaWVyKGV4cHIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEltcG9ydERlZmF1bHRTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlSWRlbnRpZmllcihleHByLmlkIHx8IGV4cHIubG9jYWwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gWycqJ107XG4gICAgICAgICAgICB2YXIgaWQgPSBleHByLmlkIHx8IGV4cHIubG9jYWw7XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSArICdhcycgKyBub0VtcHR5U3BhY2UoKSArIGdlbmVyYXRlSWRlbnRpZmllcihpZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBJbXBvcnRTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIGltcG9ydGVkID0gZXhwci5pbXBvcnRlZDtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbIGltcG9ydGVkLm5hbWUgXTtcbiAgICAgICAgICAgIHZhciBsb2NhbCA9IGV4cHIubG9jYWw7XG4gICAgICAgICAgICBpZiAobG9jYWwgJiYgbG9jYWwubmFtZSAhPT0gaW1wb3J0ZWQubmFtZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vRW1wdHlTcGFjZSgpICsgJ2FzJyArIG5vRW1wdHlTcGFjZSgpICsgZ2VuZXJhdGVJZGVudGlmaWVyKGxvY2FsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEV4cG9ydFNwZWNpZmllcjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWwgPSBleHByLmxvY2FsO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsgbG9jYWwubmFtZSBdO1xuICAgICAgICAgICAgdmFyIGV4cG9ydGVkID0gZXhwci5leHBvcnRlZDtcbiAgICAgICAgICAgIGlmIChleHBvcnRlZCAmJiBleHBvcnRlZC5uYW1lICE9PSBsb2NhbC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9FbXB0eVNwYWNlKCkgKyAnYXMnICsgbm9FbXB0eVNwYWNlKCkgKyBnZW5lcmF0ZUlkZW50aWZpZXIoZXhwb3J0ZWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgTGl0ZXJhbDogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmF3O1xuICAgICAgICAgICAgaWYgKGV4cHIuaGFzT3duUHJvcGVydHkoJ3JhdycpICYmIHBhcnNlICYmIGV4dHJhLnJhdykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJhdyA9IHBhcnNlKGV4cHIucmF3KS5ib2R5WzBdLmV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYXcudHlwZSA9PT0gU3ludGF4LkxpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXcudmFsdWUgPT09IGV4cHIudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwci5yYXc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdCB1c2UgcmF3IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci5yZWdleCkge1xuICAgICAgICAgICAgICByZXR1cm4gJy8nICsgZXhwci5yZWdleC5wYXR0ZXJuICsgJy8nICsgZXhwci5yZWdleC5mbGFncztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHByLnZhbHVlID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHByLnZhbHVlLnRvU3RyaW5nKCkgKyAnbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGBleHByLnZhbHVlYCBjYW4gYmUgbnVsbCBpZiBgZXhwci5iaWdpbnRgIGV4aXN0cy4gV2UgbmVlZCB0byBjaGVja1xuICAgICAgICAgICAgLy8gYGV4cHIuYmlnaW50YCBmaXJzdC5cbiAgICAgICAgICAgIGlmIChleHByLmJpZ2ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHByLmJpZ2ludCArICduJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4cHIudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZVN0cmluZyhleHByLnZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHByLnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZU51bWJlcihleHByLnZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHByLnZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwci52YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVJlZ0V4cChleHByLnZhbHVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBHZW5lcmF0b3JFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkNvbXByZWhlbnNpb25FeHByZXNzaW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDb21wcmVoZW5zaW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICAvLyBHZW5lcmF0b3JFeHByZXNzaW9uIHNob3VsZCBiZSBwYXJlbnRoZXNpemVkIHdpdGggKC4uLiksIENvbXByZWhlbnNpb25FeHByZXNzaW9uIHdpdGggWy4uLl1cbiAgICAgICAgICAgIC8vIER1ZSB0byBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODM0NjggcG9zaXRpb24gb2YgZXhwci5ib2R5IGNhbiBkaWZmZXIgaW4gU3BpZGVybW9ua2V5IGFuZCBFUzZcblxuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXosIGZyYWdtZW50LCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJlc3VsdCA9IChleHByLnR5cGUgPT09IFN5bnRheC5HZW5lcmF0b3JFeHByZXNzaW9uKSA/IFsnKCddIDogWydbJ107XG5cbiAgICAgICAgICAgIGlmIChleHRyYS5tb3ouY29tcHJlaGVuc2lvbkV4cHJlc3Npb25TdGFydHNXaXRoQXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5ib2R5LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleHByLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHIuYmxvY2tzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5ibG9ja3NbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCB8fCBleHRyYS5tb3ouY29tcHJlaGVuc2lvbkV4cHJlc3Npb25TdGFydHNXaXRoQXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci5maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgJ2lmJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuZmlsdGVyLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFsgJygnLCBmcmFnbWVudCwgJyknIF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWV4dHJhLm1vei5jb21wcmVoZW5zaW9uRXhwcmVzc2lvblN0YXJ0c1dpdGhBc3NpZ25tZW50KSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmJvZHksIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpO1xuXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGZyYWdtZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goKGV4cHIudHlwZSA9PT0gU3ludGF4LkdlbmVyYXRvckV4cHJlc3Npb24pID8gJyknIDogJ10nKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ29tcHJlaGVuc2lvbkJsb2NrOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciBmcmFnbWVudDtcbiAgICAgICAgICAgIGlmIChleHByLmxlZnQudHlwZSA9PT0gU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IFtcbiAgICAgICAgICAgICAgICAgICAgZXhwci5sZWZ0LmtpbmQsIG5vRW1wdHlTcGFjZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KGV4cHIubGVmdC5kZWNsYXJhdGlvbnNbMF0sIFNfRkZGRilcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIubGVmdCwgUHJlY2VkZW5jZS5DYWxsLCBFX1RUVCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZyYWdtZW50ID0gam9pbihmcmFnbWVudCwgZXhwci5vZiA/ICdvZicgOiAnaW4nKTtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gam9pbihmcmFnbWVudCwgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5yaWdodCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcblxuICAgICAgICAgICAgcmV0dXJuIFsgJ2ZvcicgKyBzcGFjZSArICcoJywgZnJhZ21lbnQsICcpJyBdO1xuICAgICAgICB9LFxuXG4gICAgICAgIFNwcmVhZEVsZW1lbnQ6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAnLi4uJyxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmFyZ3VtZW50LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSxcblxuICAgICAgICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIGl0ZW1GbGFncyA9IEVfVFRGO1xuICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBGX0FMTE9XX0NBTEwpKSB7XG4gICAgICAgICAgICAgICAgaXRlbUZsYWdzID0gRV9URkY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIudGFnLCBQcmVjZWRlbmNlLkNhbGwsIGl0ZW1GbGFncyksXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5xdWFzaSwgUHJlY2VkZW5jZS5QcmltYXJ5LCBFX0ZGVClcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5UYWdnZWRUZW1wbGF0ZSwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVGVtcGxhdGVFbGVtZW50OiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHVzZSBcImNvb2tlZFwiLiBTaW5jZSB0YWdnZWQgdGVtcGxhdGUgY2FuIHVzZSByYXcgdGVtcGxhdGVcbiAgICAgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uLiBTbyBpZiB3ZSBkbyBzbywgaXQgYnJlYWtzIHRoZSBzY3JpcHQgc2VtYW50aWNzLlxuICAgICAgICAgICAgcmV0dXJuIGV4cHIudmFsdWUucmF3O1xuICAgICAgICB9LFxuXG4gICAgICAgIFRlbXBsYXRlTGl0ZXJhbDogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpejtcbiAgICAgICAgICAgIHJlc3VsdCA9IFsgJ2AnIF07XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHIucXVhc2lzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnF1YXNpc1tpXSwgUHJlY2VkZW5jZS5QcmltYXJ5LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCckeycgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuZXhwcmVzc2lvbnNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlICsgJ30nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnYCcpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBNb2R1bGVTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuTGl0ZXJhbChleHByLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgSW1wb3J0RXhwcmVzc2lvbjogZnVuY3Rpb24oZXhwciwgcHJlY2VkZW5jZSwgZmxhZykge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShbXG4gICAgICAgICAgICAgICAgJ2ltcG9ydCgnLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuc291cmNlLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgIF0sIFByZWNlZGVuY2UuQ2FsbCwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbWVyZ2UoQ29kZUdlbmVyYXRvci5wcm90b3R5cGUsIENvZGVHZW5lcmF0b3IuRXhwcmVzc2lvbik7XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgdmFyIHJlc3VsdCwgdHlwZTtcblxuICAgICAgICB0eXBlID0gZXhwci50eXBlIHx8IFN5bnRheC5Qcm9wZXJ0eTtcblxuICAgICAgICBpZiAoZXh0cmEudmVyYmF0aW0gJiYgZXhwci5oYXNPd25Qcm9wZXJ0eShleHRyYS52ZXJiYXRpbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVZlcmJhdGltKGV4cHIsIHByZWNlZGVuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0gdGhpc1t0eXBlXShleHByLCBwcmVjZWRlbmNlLCBmbGFncyk7XG5cblxuICAgICAgICBpZiAoZXh0cmEuY29tbWVudCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYWRkQ29tbWVudHMoZXhwciwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQsIGV4cHIpO1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZVN0YXRlbWVudCA9IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICB2YXIgcmVzdWx0LFxuICAgICAgICAgICAgZnJhZ21lbnQ7XG5cbiAgICAgICAgcmVzdWx0ID0gdGhpc1tzdG10LnR5cGVdKHN0bXQsIGZsYWdzKTtcblxuICAgICAgICAvLyBBdHRhY2ggY29tbWVudHNcblxuICAgICAgICBpZiAoZXh0cmEuY29tbWVudCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYWRkQ29tbWVudHMoc3RtdCwgcmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZyYWdtZW50ID0gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChzdG10LnR5cGUgPT09IFN5bnRheC5Qcm9ncmFtICYmICFzYWZlQ29uY2F0ZW5hdGlvbiAmJiBuZXdsaW5lID09PSAnJyAmJiAgZnJhZ21lbnQuY2hhckF0KGZyYWdtZW50Lmxlbmd0aCAtIDEpID09PSAnXFxuJykge1xuICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlTWFwID8gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnJlcGxhY2VSaWdodCgvXFxzKyQvLCAnJykgOiBmcmFnbWVudC5yZXBsYWNlKC9cXHMrJC8sICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCwgc3RtdCk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlSW50ZXJuYWwobm9kZSkge1xuICAgICAgICB2YXIgY29kZWdlbjtcblxuICAgICAgICBjb2RlZ2VuID0gbmV3IENvZGVHZW5lcmF0b3IoKTtcbiAgICAgICAgaWYgKGlzU3RhdGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29kZWdlbi5nZW5lcmF0ZVN0YXRlbWVudChub2RlLCBTX1RGRkYpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRXhwcmVzc2lvbihub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVnZW4uZ2VuZXJhdGVFeHByZXNzaW9uKG5vZGUsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBub2RlIHR5cGU6ICcgKyBub2RlLnR5cGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlKG5vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKSwgcmVzdWx0LCBwYWlyO1xuXG4gICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIE9ic29sZXRlIG9wdGlvbnNcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgIGBvcHRpb25zLmluZGVudGBcbiAgICAgICAgICAgIC8vICAgYG9wdGlvbnMuYmFzZWBcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIHRoZW0sIHdlIGNhbiB1c2UgYG9wdGlvbi5mb3JtYXQuaW5kZW50YC5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5pbmRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMuZm9ybWF0LmluZGVudC5zdHlsZSA9IG9wdGlvbnMuaW5kZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJhc2UgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMuZm9ybWF0LmluZGVudC5iYXNlID0gb3B0aW9ucy5iYXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3B0aW9ucyA9IHVwZGF0ZURlZXBseShkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgICAgICBpbmRlbnQgPSBvcHRpb25zLmZvcm1hdC5pbmRlbnQuc3R5bGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYmFzZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBiYXNlID0gb3B0aW9ucy5iYXNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBiYXNlID0gc3RyaW5nUmVwZWF0KGluZGVudCwgb3B0aW9ucy5mb3JtYXQuaW5kZW50LmJhc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgICAgICAgICAgaW5kZW50ID0gb3B0aW9ucy5mb3JtYXQuaW5kZW50LnN0eWxlO1xuICAgICAgICAgICAgYmFzZSA9IHN0cmluZ1JlcGVhdChpbmRlbnQsIG9wdGlvbnMuZm9ybWF0LmluZGVudC5iYXNlKTtcbiAgICAgICAgfVxuICAgICAgICBqc29uID0gb3B0aW9ucy5mb3JtYXQuanNvbjtcbiAgICAgICAgcmVudW1iZXIgPSBvcHRpb25zLmZvcm1hdC5yZW51bWJlcjtcbiAgICAgICAgaGV4YWRlY2ltYWwgPSBqc29uID8gZmFsc2UgOiBvcHRpb25zLmZvcm1hdC5oZXhhZGVjaW1hbDtcbiAgICAgICAgcXVvdGVzID0ganNvbiA/ICdkb3VibGUnIDogb3B0aW9ucy5mb3JtYXQucXVvdGVzO1xuICAgICAgICBlc2NhcGVsZXNzID0gb3B0aW9ucy5mb3JtYXQuZXNjYXBlbGVzcztcbiAgICAgICAgbmV3bGluZSA9IG9wdGlvbnMuZm9ybWF0Lm5ld2xpbmU7XG4gICAgICAgIHNwYWNlID0gb3B0aW9ucy5mb3JtYXQuc3BhY2U7XG4gICAgICAgIGlmIChvcHRpb25zLmZvcm1hdC5jb21wYWN0KSB7XG4gICAgICAgICAgICBuZXdsaW5lID0gc3BhY2UgPSBpbmRlbnQgPSBiYXNlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50aGVzZXMgPSBvcHRpb25zLmZvcm1hdC5wYXJlbnRoZXNlcztcbiAgICAgICAgc2VtaWNvbG9ucyA9IG9wdGlvbnMuZm9ybWF0LnNlbWljb2xvbnM7XG4gICAgICAgIHNhZmVDb25jYXRlbmF0aW9uID0gb3B0aW9ucy5mb3JtYXQuc2FmZUNvbmNhdGVuYXRpb247XG4gICAgICAgIGRpcmVjdGl2ZSA9IG9wdGlvbnMuZGlyZWN0aXZlO1xuICAgICAgICBwYXJzZSA9IGpzb24gPyBudWxsIDogb3B0aW9ucy5wYXJzZTtcbiAgICAgICAgc291cmNlTWFwID0gb3B0aW9ucy5zb3VyY2VNYXA7XG4gICAgICAgIHNvdXJjZUNvZGUgPSBvcHRpb25zLnNvdXJjZUNvZGU7XG4gICAgICAgIHByZXNlcnZlQmxhbmtMaW5lcyA9IG9wdGlvbnMuZm9ybWF0LnByZXNlcnZlQmxhbmtMaW5lcyAmJiBzb3VyY2VDb2RlICE9PSBudWxsO1xuICAgICAgICBleHRyYSA9IG9wdGlvbnM7XG5cbiAgICAgICAgaWYgKHNvdXJjZU1hcCkge1xuICAgICAgICAgICAgaWYgKCFleHBvcnRzLmJyb3dzZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBhc3N1bWUgZW52aXJvbm1lbnQgaXMgbm9kZS5qc1xuICAgICAgICAgICAgICAgIC8vIEFuZCBwcmV2ZW50IGZyb20gaW5jbHVkaW5nIHNvdXJjZS1tYXAgYnkgYnJvd3NlcmlmeVxuICAgICAgICAgICAgICAgIFNvdXJjZU5vZGUgPSByZXF1aXJlKCdzb3VyY2UtbWFwJykuU291cmNlTm9kZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgU291cmNlTm9kZSA9IGdsb2JhbC5zb3VyY2VNYXAuU291cmNlTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IGdlbmVyYXRlSW50ZXJuYWwobm9kZSk7XG5cbiAgICAgICAgaWYgKCFzb3VyY2VNYXApIHtcbiAgICAgICAgICAgIHBhaXIgPSB7Y29kZTogcmVzdWx0LnRvU3RyaW5nKCksIG1hcDogbnVsbH07XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5zb3VyY2VNYXBXaXRoQ29kZSA/IHBhaXIgOiBwYWlyLmNvZGU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIHBhaXIgPSByZXN1bHQudG9TdHJpbmdXaXRoU291cmNlTWFwKHtcbiAgICAgICAgICAgIGZpbGU6IG9wdGlvbnMuZmlsZSxcbiAgICAgICAgICAgIHNvdXJjZVJvb3Q6IG9wdGlvbnMuc291cmNlTWFwUm9vdFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAob3B0aW9ucy5zb3VyY2VDb250ZW50KSB7XG4gICAgICAgICAgICBwYWlyLm1hcC5zZXRTb3VyY2VDb250ZW50KG9wdGlvbnMuc291cmNlTWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNvdXJjZUNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc291cmNlTWFwV2l0aENvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWlyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhaXIubWFwLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgRk9STUFUX01JTklGWSA9IHtcbiAgICAgICAgaW5kZW50OiB7XG4gICAgICAgICAgICBzdHlsZTogJycsXG4gICAgICAgICAgICBiYXNlOiAwXG4gICAgICAgIH0sXG4gICAgICAgIHJlbnVtYmVyOiB0cnVlLFxuICAgICAgICBoZXhhZGVjaW1hbDogdHJ1ZSxcbiAgICAgICAgcXVvdGVzOiAnYXV0bycsXG4gICAgICAgIGVzY2FwZWxlc3M6IHRydWUsXG4gICAgICAgIGNvbXBhY3Q6IHRydWUsXG4gICAgICAgIHBhcmVudGhlc2VzOiBmYWxzZSxcbiAgICAgICAgc2VtaWNvbG9uczogZmFsc2VcbiAgICB9O1xuXG4gICAgRk9STUFUX0RFRkFVTFRTID0gZ2V0RGVmYXVsdE9wdGlvbnMoKS5mb3JtYXQ7XG5cbiAgICBleHBvcnRzLnZlcnNpb24gPSByZXF1aXJlKCcuL3BhY2thZ2UuanNvbicpLnZlcnNpb247XG4gICAgZXhwb3J0cy5nZW5lcmF0ZSA9IGdlbmVyYXRlO1xuICAgIGV4cG9ydHMuYXR0YWNoQ29tbWVudHMgPSBlc3RyYXZlcnNlLmF0dGFjaENvbW1lbnRzO1xuICAgIGV4cG9ydHMuUHJlY2VkZW5jZSA9IHVwZGF0ZURlZXBseSh7fSwgUHJlY2VkZW5jZSk7XG4gICAgZXhwb3J0cy5icm93c2VyID0gZmFsc2U7XG4gICAgZXhwb3J0cy5GT1JNQVRfTUlOSUZZID0gRk9STUFUX01JTklGWTtcbiAgICBleHBvcnRzLkZPUk1BVF9ERUZBVUxUUyA9IEZPUk1BVF9ERUZBVUxUUztcbn0oKSk7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJlc3ByaW1hXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImVzcHJpbWFcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9LFxuLyoqKioqKi8gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bG9hZGVkOiBmYWxzZVxuLyoqKioqKi8gXHRcdH07XG5cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG5cblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0Lypcblx0ICBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzLCBodHRwczovL2pzLmZvdW5kYXRpb24vXG5cblx0ICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcblx0ICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuXHQgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuXHQgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG5cdCAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG5cdCAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcblx0ICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuXHQgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG5cdCAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuXHQgIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG5cdCAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuXHQgIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG5cdCAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuXHQgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuXHQgIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG5cdCAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG5cdCAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblx0Ki9cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHR2YXIgY29tbWVudF9oYW5kbGVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHR2YXIganN4X3BhcnNlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblx0dmFyIHBhcnNlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblx0dmFyIHRva2VuaXplcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSk7XG5cdGZ1bmN0aW9uIHBhcnNlKGNvZGUsIG9wdGlvbnMsIGRlbGVnYXRlKSB7XG5cdCAgICB2YXIgY29tbWVudEhhbmRsZXIgPSBudWxsO1xuXHQgICAgdmFyIHByb3h5RGVsZWdhdGUgPSBmdW5jdGlvbiAobm9kZSwgbWV0YWRhdGEpIHtcblx0ICAgICAgICBpZiAoZGVsZWdhdGUpIHtcblx0ICAgICAgICAgICAgZGVsZWdhdGUobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoY29tbWVudEhhbmRsZXIpIHtcblx0ICAgICAgICAgICAgY29tbWVudEhhbmRsZXIudmlzaXQobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICB2YXIgcGFyc2VyRGVsZWdhdGUgPSAodHlwZW9mIGRlbGVnYXRlID09PSAnZnVuY3Rpb24nKSA/IHByb3h5RGVsZWdhdGUgOiBudWxsO1xuXHQgICAgdmFyIGNvbGxlY3RDb21tZW50ID0gZmFsc2U7XG5cdCAgICBpZiAob3B0aW9ucykge1xuXHQgICAgICAgIGNvbGxlY3RDb21tZW50ID0gKHR5cGVvZiBvcHRpb25zLmNvbW1lbnQgPT09ICdib29sZWFuJyAmJiBvcHRpb25zLmNvbW1lbnQpO1xuXHQgICAgICAgIHZhciBhdHRhY2hDb21tZW50ID0gKHR5cGVvZiBvcHRpb25zLmF0dGFjaENvbW1lbnQgPT09ICdib29sZWFuJyAmJiBvcHRpb25zLmF0dGFjaENvbW1lbnQpO1xuXHQgICAgICAgIGlmIChjb2xsZWN0Q29tbWVudCB8fCBhdHRhY2hDb21tZW50KSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnRIYW5kbGVyID0gbmV3IGNvbW1lbnRfaGFuZGxlcl8xLkNvbW1lbnRIYW5kbGVyKCk7XG5cdCAgICAgICAgICAgIGNvbW1lbnRIYW5kbGVyLmF0dGFjaCA9IGF0dGFjaENvbW1lbnQ7XG5cdCAgICAgICAgICAgIG9wdGlvbnMuY29tbWVudCA9IHRydWU7XG5cdCAgICAgICAgICAgIHBhcnNlckRlbGVnYXRlID0gcHJveHlEZWxlZ2F0ZTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICB2YXIgaXNNb2R1bGUgPSBmYWxzZTtcblx0ICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnNvdXJjZVR5cGUgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgaXNNb2R1bGUgPSAob3B0aW9ucy5zb3VyY2VUeXBlID09PSAnbW9kdWxlJyk7XG5cdCAgICB9XG5cdCAgICB2YXIgcGFyc2VyO1xuXHQgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMuanN4ID09PSAnYm9vbGVhbicgJiYgb3B0aW9ucy5qc3gpIHtcblx0ICAgICAgICBwYXJzZXIgPSBuZXcganN4X3BhcnNlcl8xLkpTWFBhcnNlcihjb2RlLCBvcHRpb25zLCBwYXJzZXJEZWxlZ2F0ZSk7XG5cdCAgICB9XG5cdCAgICBlbHNlIHtcblx0ICAgICAgICBwYXJzZXIgPSBuZXcgcGFyc2VyXzEuUGFyc2VyKGNvZGUsIG9wdGlvbnMsIHBhcnNlckRlbGVnYXRlKTtcblx0ICAgIH1cblx0ICAgIHZhciBwcm9ncmFtID0gaXNNb2R1bGUgPyBwYXJzZXIucGFyc2VNb2R1bGUoKSA6IHBhcnNlci5wYXJzZVNjcmlwdCgpO1xuXHQgICAgdmFyIGFzdCA9IHByb2dyYW07XG5cdCAgICBpZiAoY29sbGVjdENvbW1lbnQgJiYgY29tbWVudEhhbmRsZXIpIHtcblx0ICAgICAgICBhc3QuY29tbWVudHMgPSBjb21tZW50SGFuZGxlci5jb21tZW50cztcblx0ICAgIH1cblx0ICAgIGlmIChwYXJzZXIuY29uZmlnLnRva2Vucykge1xuXHQgICAgICAgIGFzdC50b2tlbnMgPSBwYXJzZXIudG9rZW5zO1xuXHQgICAgfVxuXHQgICAgaWYgKHBhcnNlci5jb25maWcudG9sZXJhbnQpIHtcblx0ICAgICAgICBhc3QuZXJyb3JzID0gcGFyc2VyLmVycm9ySGFuZGxlci5lcnJvcnM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gYXN0O1xuXHR9XG5cdGV4cG9ydHMucGFyc2UgPSBwYXJzZTtcblx0ZnVuY3Rpb24gcGFyc2VNb2R1bGUoY29kZSwgb3B0aW9ucywgZGVsZWdhdGUpIHtcblx0ICAgIHZhciBwYXJzaW5nT3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdCAgICBwYXJzaW5nT3B0aW9ucy5zb3VyY2VUeXBlID0gJ21vZHVsZSc7XG5cdCAgICByZXR1cm4gcGFyc2UoY29kZSwgcGFyc2luZ09wdGlvbnMsIGRlbGVnYXRlKTtcblx0fVxuXHRleHBvcnRzLnBhcnNlTW9kdWxlID0gcGFyc2VNb2R1bGU7XG5cdGZ1bmN0aW9uIHBhcnNlU2NyaXB0KGNvZGUsIG9wdGlvbnMsIGRlbGVnYXRlKSB7XG5cdCAgICB2YXIgcGFyc2luZ09wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHQgICAgcGFyc2luZ09wdGlvbnMuc291cmNlVHlwZSA9ICdzY3JpcHQnO1xuXHQgICAgcmV0dXJuIHBhcnNlKGNvZGUsIHBhcnNpbmdPcHRpb25zLCBkZWxlZ2F0ZSk7XG5cdH1cblx0ZXhwb3J0cy5wYXJzZVNjcmlwdCA9IHBhcnNlU2NyaXB0O1xuXHRmdW5jdGlvbiB0b2tlbml6ZShjb2RlLCBvcHRpb25zLCBkZWxlZ2F0ZSkge1xuXHQgICAgdmFyIHRva2VuaXplciA9IG5ldyB0b2tlbml6ZXJfMS5Ub2tlbml6ZXIoY29kZSwgb3B0aW9ucyk7XG5cdCAgICB2YXIgdG9rZW5zO1xuXHQgICAgdG9rZW5zID0gW107XG5cdCAgICB0cnkge1xuXHQgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgaWYgKCF0b2tlbikge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IGRlbGVnYXRlKHRva2VuKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgY2F0Y2ggKGUpIHtcblx0ICAgICAgICB0b2tlbml6ZXIuZXJyb3JIYW5kbGVyLnRvbGVyYXRlKGUpO1xuXHQgICAgfVxuXHQgICAgaWYgKHRva2VuaXplci5lcnJvckhhbmRsZXIudG9sZXJhbnQpIHtcblx0ICAgICAgICB0b2tlbnMuZXJyb3JzID0gdG9rZW5pemVyLmVycm9ycygpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRva2Vucztcblx0fVxuXHRleHBvcnRzLnRva2VuaXplID0gdG9rZW5pemU7XG5cdHZhciBzeW50YXhfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdGV4cG9ydHMuU3ludGF4ID0gc3ludGF4XzEuU3ludGF4O1xuXHQvLyBTeW5jIHdpdGggKi5qc29uIG1hbmlmZXN0cy5cblx0ZXhwb3J0cy52ZXJzaW9uID0gJzQuMC4xJztcblxuXG4vKioqLyB9LFxuLyogMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIHN5bnRheF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0dmFyIENvbW1lbnRIYW5kbGVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENvbW1lbnRIYW5kbGVyKCkge1xuXHQgICAgICAgIHRoaXMuYXR0YWNoID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5jb21tZW50cyA9IFtdO1xuXHQgICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcblx0ICAgICAgICB0aGlzLmxlYWRpbmcgPSBbXTtcblx0ICAgICAgICB0aGlzLnRyYWlsaW5nID0gW107XG5cdCAgICB9XG5cdCAgICBDb21tZW50SGFuZGxlci5wcm90b3R5cGUuaW5zZXJ0SW5uZXJDb21tZW50cyA9IGZ1bmN0aW9uIChub2RlLCBtZXRhZGF0YSkge1xuXHQgICAgICAgIC8vICBpbm5uZXJDb21tZW50cyBmb3IgcHJvcGVydGllcyBlbXB0eSBibG9ja1xuXHQgICAgICAgIC8vICBgZnVuY3Rpb24gYSgpIHsvKiogY29tbWVudHMgKipcXC99YFxuXHQgICAgICAgIGlmIChub2RlLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5CbG9ja1N0YXRlbWVudCAmJiBub2RlLmJvZHkubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgIHZhciBpbm5lckNvbW1lbnRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmxlYWRpbmcubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMubGVhZGluZ1tpXTtcblx0ICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5lbmQub2Zmc2V0ID49IGVudHJ5LnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5uZXJDb21tZW50cy51bnNoaWZ0KGVudHJ5LmNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubGVhZGluZy5zcGxpY2UoaSwgMSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFpbGluZy5zcGxpY2UoaSwgMSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGlubmVyQ29tbWVudHMubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICBub2RlLmlubmVyQ29tbWVudHMgPSBpbm5lckNvbW1lbnRzO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIENvbW1lbnRIYW5kbGVyLnByb3RvdHlwZS5maW5kVHJhaWxpbmdDb21tZW50cyA9IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuXHQgICAgICAgIHZhciB0cmFpbGluZ0NvbW1lbnRzID0gW107XG5cdCAgICAgICAgaWYgKHRoaXMudHJhaWxpbmcubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cmFpbGluZy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGVudHJ5XzEgPSB0aGlzLnRyYWlsaW5nW2ldO1xuXHQgICAgICAgICAgICAgICAgaWYgKGVudHJ5XzEuc3RhcnQgPj0gbWV0YWRhdGEuZW5kLm9mZnNldCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nQ29tbWVudHMudW5zaGlmdChlbnRyeV8xLmNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMudHJhaWxpbmcubGVuZ3RoID0gMDtcblx0ICAgICAgICAgICAgcmV0dXJuIHRyYWlsaW5nQ29tbWVudHM7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBlbnRyeSA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTtcblx0ICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkubm9kZS50cmFpbGluZ0NvbW1lbnRzKSB7XG5cdCAgICAgICAgICAgIHZhciBmaXJzdENvbW1lbnQgPSBlbnRyeS5ub2RlLnRyYWlsaW5nQ29tbWVudHNbMF07XG5cdCAgICAgICAgICAgIGlmIChmaXJzdENvbW1lbnQgJiYgZmlyc3RDb21tZW50LnJhbmdlWzBdID49IG1ldGFkYXRhLmVuZC5vZmZzZXQpIHtcblx0ICAgICAgICAgICAgICAgIHRyYWlsaW5nQ29tbWVudHMgPSBlbnRyeS5ub2RlLnRyYWlsaW5nQ29tbWVudHM7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgZW50cnkubm9kZS50cmFpbGluZ0NvbW1lbnRzO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0cmFpbGluZ0NvbW1lbnRzO1xuXHQgICAgfTtcblx0ICAgIENvbW1lbnRIYW5kbGVyLnByb3RvdHlwZS5maW5kTGVhZGluZ0NvbW1lbnRzID0gZnVuY3Rpb24gKG1ldGFkYXRhKSB7XG5cdCAgICAgICAgdmFyIGxlYWRpbmdDb21tZW50cyA9IFtdO1xuXHQgICAgICAgIHZhciB0YXJnZXQ7XG5cdCAgICAgICAgd2hpbGUgKHRoaXMuc3RhY2subGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG5cdCAgICAgICAgICAgIGlmIChlbnRyeSAmJiBlbnRyeS5zdGFydCA+PSBtZXRhZGF0YS5zdGFydC5vZmZzZXQpIHtcblx0ICAgICAgICAgICAgICAgIHRhcmdldCA9IGVudHJ5Lm5vZGU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRhcmdldCkge1xuXHQgICAgICAgICAgICB2YXIgY291bnQgPSB0YXJnZXQubGVhZGluZ0NvbW1lbnRzID8gdGFyZ2V0LmxlYWRpbmdDb21tZW50cy5sZW5ndGggOiAwO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gY291bnQgLSAxOyBpID49IDA7IC0taSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSB0YXJnZXQubGVhZGluZ0NvbW1lbnRzW2ldO1xuXHQgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQucmFuZ2VbMV0gPD0gbWV0YWRhdGEuc3RhcnQub2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVhZGluZ0NvbW1lbnRzLnVuc2hpZnQoY29tbWVudCk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmxlYWRpbmdDb21tZW50cy5zcGxpY2UoaSwgMSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKHRhcmdldC5sZWFkaW5nQ29tbWVudHMgJiYgdGFyZ2V0LmxlYWRpbmdDb21tZW50cy5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXJnZXQubGVhZGluZ0NvbW1lbnRzO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBsZWFkaW5nQ29tbWVudHM7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmxlYWRpbmcubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcblx0ICAgICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5sZWFkaW5nW2ldO1xuXHQgICAgICAgICAgICBpZiAoZW50cnkuc3RhcnQgPD0gbWV0YWRhdGEuc3RhcnQub2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICBsZWFkaW5nQ29tbWVudHMudW5zaGlmdChlbnRyeS5jb21tZW50KTtcblx0ICAgICAgICAgICAgICAgIHRoaXMubGVhZGluZy5zcGxpY2UoaSwgMSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGxlYWRpbmdDb21tZW50cztcblx0ICAgIH07XG5cdCAgICBDb21tZW50SGFuZGxlci5wcm90b3R5cGUudmlzaXROb2RlID0gZnVuY3Rpb24gKG5vZGUsIG1ldGFkYXRhKSB7XG5cdCAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LlByb2dyYW0gJiYgbm9kZS5ib2R5Lmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmluc2VydElubmVyQ29tbWVudHMobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgIHZhciB0cmFpbGluZ0NvbW1lbnRzID0gdGhpcy5maW5kVHJhaWxpbmdDb21tZW50cyhtZXRhZGF0YSk7XG5cdCAgICAgICAgdmFyIGxlYWRpbmdDb21tZW50cyA9IHRoaXMuZmluZExlYWRpbmdDb21tZW50cyhtZXRhZGF0YSk7XG5cdCAgICAgICAgaWYgKGxlYWRpbmdDb21tZW50cy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIG5vZGUubGVhZGluZ0NvbW1lbnRzID0gbGVhZGluZ0NvbW1lbnRzO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodHJhaWxpbmdDb21tZW50cy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIG5vZGUudHJhaWxpbmdDb21tZW50cyA9IHRyYWlsaW5nQ29tbWVudHM7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG5cdCAgICAgICAgICAgIG5vZGU6IG5vZGUsXG5cdCAgICAgICAgICAgIHN0YXJ0OiBtZXRhZGF0YS5zdGFydC5vZmZzZXRcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICBDb21tZW50SGFuZGxlci5wcm90b3R5cGUudmlzaXRDb21tZW50ID0gZnVuY3Rpb24gKG5vZGUsIG1ldGFkYXRhKSB7XG5cdCAgICAgICAgdmFyIHR5cGUgPSAobm9kZS50eXBlWzBdID09PSAnTCcpID8gJ0xpbmUnIDogJ0Jsb2NrJztcblx0ICAgICAgICB2YXIgY29tbWVudCA9IHtcblx0ICAgICAgICAgICAgdHlwZTogdHlwZSxcblx0ICAgICAgICAgICAgdmFsdWU6IG5vZGUudmFsdWVcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGlmIChub2RlLnJhbmdlKSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnQucmFuZ2UgPSBub2RlLnJhbmdlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAobm9kZS5sb2MpIHtcblx0ICAgICAgICAgICAgY29tbWVudC5sb2MgPSBub2RlLmxvYztcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuXHQgICAgICAgIGlmICh0aGlzLmF0dGFjaCkge1xuXHQgICAgICAgICAgICB2YXIgZW50cnkgPSB7XG5cdCAgICAgICAgICAgICAgICBjb21tZW50OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbm9kZS52YWx1ZSxcblx0ICAgICAgICAgICAgICAgICAgICByYW5nZTogW21ldGFkYXRhLnN0YXJ0Lm9mZnNldCwgbWV0YWRhdGEuZW5kLm9mZnNldF1cblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBzdGFydDogbWV0YWRhdGEuc3RhcnQub2Zmc2V0XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIGlmIChub2RlLmxvYykge1xuXHQgICAgICAgICAgICAgICAgZW50cnkuY29tbWVudC5sb2MgPSBub2RlLmxvYztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBub2RlLnR5cGUgPSB0eXBlO1xuXHQgICAgICAgICAgICB0aGlzLmxlYWRpbmcucHVzaChlbnRyeSk7XG5cdCAgICAgICAgICAgIHRoaXMudHJhaWxpbmcucHVzaChlbnRyeSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIENvbW1lbnRIYW5kbGVyLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uIChub2RlLCBtZXRhZGF0YSkge1xuXHQgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdMaW5lQ29tbWVudCcpIHtcblx0ICAgICAgICAgICAgdGhpcy52aXNpdENvbW1lbnQobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdCbG9ja0NvbW1lbnQnKSB7XG5cdCAgICAgICAgICAgIHRoaXMudmlzaXRDb21tZW50KG5vZGUsIG1ldGFkYXRhKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodGhpcy5hdHRhY2gpIHtcblx0ICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICByZXR1cm4gQ29tbWVudEhhbmRsZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuQ29tbWVudEhhbmRsZXIgPSBDb21tZW50SGFuZGxlcjtcblxuXG4vKioqLyB9LFxuLyogMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0ZXhwb3J0cy5TeW50YXggPSB7XG5cdCAgICBBc3NpZ25tZW50RXhwcmVzc2lvbjogJ0Fzc2lnbm1lbnRFeHByZXNzaW9uJyxcblx0ICAgIEFzc2lnbm1lbnRQYXR0ZXJuOiAnQXNzaWdubWVudFBhdHRlcm4nLFxuXHQgICAgQXJyYXlFeHByZXNzaW9uOiAnQXJyYXlFeHByZXNzaW9uJyxcblx0ICAgIEFycmF5UGF0dGVybjogJ0FycmF5UGF0dGVybicsXG5cdCAgICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJyxcblx0ICAgIEF3YWl0RXhwcmVzc2lvbjogJ0F3YWl0RXhwcmVzc2lvbicsXG5cdCAgICBCbG9ja1N0YXRlbWVudDogJ0Jsb2NrU3RhdGVtZW50Jyxcblx0ICAgIEJpbmFyeUV4cHJlc3Npb246ICdCaW5hcnlFeHByZXNzaW9uJyxcblx0ICAgIEJyZWFrU3RhdGVtZW50OiAnQnJlYWtTdGF0ZW1lbnQnLFxuXHQgICAgQ2FsbEV4cHJlc3Npb246ICdDYWxsRXhwcmVzc2lvbicsXG5cdCAgICBDYXRjaENsYXVzZTogJ0NhdGNoQ2xhdXNlJyxcblx0ICAgIENsYXNzQm9keTogJ0NsYXNzQm9keScsXG5cdCAgICBDbGFzc0RlY2xhcmF0aW9uOiAnQ2xhc3NEZWNsYXJhdGlvbicsXG5cdCAgICBDbGFzc0V4cHJlc3Npb246ICdDbGFzc0V4cHJlc3Npb24nLFxuXHQgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uOiAnQ29uZGl0aW9uYWxFeHByZXNzaW9uJyxcblx0ICAgIENvbnRpbnVlU3RhdGVtZW50OiAnQ29udGludWVTdGF0ZW1lbnQnLFxuXHQgICAgRG9XaGlsZVN0YXRlbWVudDogJ0RvV2hpbGVTdGF0ZW1lbnQnLFxuXHQgICAgRGVidWdnZXJTdGF0ZW1lbnQ6ICdEZWJ1Z2dlclN0YXRlbWVudCcsXG5cdCAgICBFbXB0eVN0YXRlbWVudDogJ0VtcHR5U3RhdGVtZW50Jyxcblx0ICAgIEV4cG9ydEFsbERlY2xhcmF0aW9uOiAnRXhwb3J0QWxsRGVjbGFyYXRpb24nLFxuXHQgICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uOiAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJyxcblx0ICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb246ICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJyxcblx0ICAgIEV4cG9ydFNwZWNpZmllcjogJ0V4cG9ydFNwZWNpZmllcicsXG5cdCAgICBFeHByZXNzaW9uU3RhdGVtZW50OiAnRXhwcmVzc2lvblN0YXRlbWVudCcsXG5cdCAgICBGb3JTdGF0ZW1lbnQ6ICdGb3JTdGF0ZW1lbnQnLFxuXHQgICAgRm9yT2ZTdGF0ZW1lbnQ6ICdGb3JPZlN0YXRlbWVudCcsXG5cdCAgICBGb3JJblN0YXRlbWVudDogJ0ZvckluU3RhdGVtZW50Jyxcblx0ICAgIEZ1bmN0aW9uRGVjbGFyYXRpb246ICdGdW5jdGlvbkRlY2xhcmF0aW9uJyxcblx0ICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogJ0Z1bmN0aW9uRXhwcmVzc2lvbicsXG5cdCAgICBJZGVudGlmaWVyOiAnSWRlbnRpZmllcicsXG5cdCAgICBJZlN0YXRlbWVudDogJ0lmU3RhdGVtZW50Jyxcblx0ICAgIEltcG9ydERlY2xhcmF0aW9uOiAnSW1wb3J0RGVjbGFyYXRpb24nLFxuXHQgICAgSW1wb3J0RGVmYXVsdFNwZWNpZmllcjogJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInLFxuXHQgICAgSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyOiAnSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyJyxcblx0ICAgIEltcG9ydFNwZWNpZmllcjogJ0ltcG9ydFNwZWNpZmllcicsXG5cdCAgICBMaXRlcmFsOiAnTGl0ZXJhbCcsXG5cdCAgICBMYWJlbGVkU3RhdGVtZW50OiAnTGFiZWxlZFN0YXRlbWVudCcsXG5cdCAgICBMb2dpY2FsRXhwcmVzc2lvbjogJ0xvZ2ljYWxFeHByZXNzaW9uJyxcblx0ICAgIE1lbWJlckV4cHJlc3Npb246ICdNZW1iZXJFeHByZXNzaW9uJyxcblx0ICAgIE1ldGFQcm9wZXJ0eTogJ01ldGFQcm9wZXJ0eScsXG5cdCAgICBNZXRob2REZWZpbml0aW9uOiAnTWV0aG9kRGVmaW5pdGlvbicsXG5cdCAgICBOZXdFeHByZXNzaW9uOiAnTmV3RXhwcmVzc2lvbicsXG5cdCAgICBPYmplY3RFeHByZXNzaW9uOiAnT2JqZWN0RXhwcmVzc2lvbicsXG5cdCAgICBPYmplY3RQYXR0ZXJuOiAnT2JqZWN0UGF0dGVybicsXG5cdCAgICBQcm9ncmFtOiAnUHJvZ3JhbScsXG5cdCAgICBQcm9wZXJ0eTogJ1Byb3BlcnR5Jyxcblx0ICAgIFJlc3RFbGVtZW50OiAnUmVzdEVsZW1lbnQnLFxuXHQgICAgUmV0dXJuU3RhdGVtZW50OiAnUmV0dXJuU3RhdGVtZW50Jyxcblx0ICAgIFNlcXVlbmNlRXhwcmVzc2lvbjogJ1NlcXVlbmNlRXhwcmVzc2lvbicsXG5cdCAgICBTcHJlYWRFbGVtZW50OiAnU3ByZWFkRWxlbWVudCcsXG5cdCAgICBTdXBlcjogJ1N1cGVyJyxcblx0ICAgIFN3aXRjaENhc2U6ICdTd2l0Y2hDYXNlJyxcblx0ICAgIFN3aXRjaFN0YXRlbWVudDogJ1N3aXRjaFN0YXRlbWVudCcsXG5cdCAgICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246ICdUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24nLFxuXHQgICAgVGVtcGxhdGVFbGVtZW50OiAnVGVtcGxhdGVFbGVtZW50Jyxcblx0ICAgIFRlbXBsYXRlTGl0ZXJhbDogJ1RlbXBsYXRlTGl0ZXJhbCcsXG5cdCAgICBUaGlzRXhwcmVzc2lvbjogJ1RoaXNFeHByZXNzaW9uJyxcblx0ICAgIFRocm93U3RhdGVtZW50OiAnVGhyb3dTdGF0ZW1lbnQnLFxuXHQgICAgVHJ5U3RhdGVtZW50OiAnVHJ5U3RhdGVtZW50Jyxcblx0ICAgIFVuYXJ5RXhwcmVzc2lvbjogJ1VuYXJ5RXhwcmVzc2lvbicsXG5cdCAgICBVcGRhdGVFeHByZXNzaW9uOiAnVXBkYXRlRXhwcmVzc2lvbicsXG5cdCAgICBWYXJpYWJsZURlY2xhcmF0aW9uOiAnVmFyaWFibGVEZWNsYXJhdGlvbicsXG5cdCAgICBWYXJpYWJsZURlY2xhcmF0b3I6ICdWYXJpYWJsZURlY2xhcmF0b3InLFxuXHQgICAgV2hpbGVTdGF0ZW1lbnQ6ICdXaGlsZVN0YXRlbWVudCcsXG5cdCAgICBXaXRoU3RhdGVtZW50OiAnV2l0aFN0YXRlbWVudCcsXG5cdCAgICBZaWVsZEV4cHJlc3Npb246ICdZaWVsZEV4cHJlc3Npb24nXG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0dmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcblx0ICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG5cdCAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XG5cdCAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcblx0ICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuXHQgICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuXHQgICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcblx0ICAgIH07XG5cdH0pKCk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIGNoYXJhY3Rlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0dmFyIEpTWE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHR2YXIganN4X3N5bnRheF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblx0dmFyIE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXHR2YXIgcGFyc2VyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXHR2YXIgdG9rZW5fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHR2YXIgeGh0bWxfZW50aXRpZXNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXHR0b2tlbl8xLlRva2VuTmFtZVsxMDAgLyogSWRlbnRpZmllciAqL10gPSAnSlNYSWRlbnRpZmllcic7XG5cdHRva2VuXzEuVG9rZW5OYW1lWzEwMSAvKiBUZXh0ICovXSA9ICdKU1hUZXh0Jztcblx0Ly8gRnVsbHkgcXVhbGlmaWVkIGVsZW1lbnQgbmFtZSwgZS5nLiA8c3ZnOnBhdGg+IHJldHVybnMgXCJzdmc6cGF0aFwiXG5cdGZ1bmN0aW9uIGdldFF1YWxpZmllZEVsZW1lbnROYW1lKGVsZW1lbnROYW1lKSB7XG5cdCAgICB2YXIgcXVhbGlmaWVkTmFtZTtcblx0ICAgIHN3aXRjaCAoZWxlbWVudE5hbWUudHlwZSkge1xuXHQgICAgICAgIGNhc2UganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hJZGVudGlmaWVyOlxuXHQgICAgICAgICAgICB2YXIgaWQgPSBlbGVtZW50TmFtZTtcblx0ICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSA9IGlkLm5hbWU7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hOYW1lc3BhY2VkTmFtZTpcblx0ICAgICAgICAgICAgdmFyIG5zID0gZWxlbWVudE5hbWU7XG5cdCAgICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSBnZXRRdWFsaWZpZWRFbGVtZW50TmFtZShucy5uYW1lc3BhY2UpICsgJzonICtcblx0ICAgICAgICAgICAgICAgIGdldFF1YWxpZmllZEVsZW1lbnROYW1lKG5zLm5hbWUpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYTWVtYmVyRXhwcmVzc2lvbjpcblx0ICAgICAgICAgICAgdmFyIGV4cHIgPSBlbGVtZW50TmFtZTtcblx0ICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSA9IGdldFF1YWxpZmllZEVsZW1lbnROYW1lKGV4cHIub2JqZWN0KSArICcuJyArXG5cdCAgICAgICAgICAgICAgICBnZXRRdWFsaWZpZWRFbGVtZW50TmFtZShleHByLnByb3BlcnR5KTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0ICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgIH1cblx0ICAgIHJldHVybiBxdWFsaWZpZWROYW1lO1xuXHR9XG5cdHZhciBKU1hQYXJzZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuXHQgICAgX19leHRlbmRzKEpTWFBhcnNlciwgX3N1cGVyKTtcblx0ICAgIGZ1bmN0aW9uIEpTWFBhcnNlcihjb2RlLCBvcHRpb25zLCBkZWxlZ2F0ZSkge1xuXHQgICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBjb2RlLCBvcHRpb25zLCBkZWxlZ2F0ZSkgfHwgdGhpcztcblx0ICAgIH1cblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VQcmltYXJ5RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5tYXRjaCgnPCcpID8gdGhpcy5wYXJzZUpTWFJvb3QoKSA6IF9zdXBlci5wcm90b3R5cGUucGFyc2VQcmltYXJ5RXhwcmVzc2lvbi5jYWxsKHRoaXMpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUuc3RhcnRKU1ggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy8gVW53aW5kIHRoZSBzY2FubmVyIGJlZm9yZSB0aGUgbG9va2FoZWFkIHRva2VuLlxuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5pbmRleCA9IHRoaXMuc3RhcnRNYXJrZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIgPSB0aGlzLnN0YXJ0TWFya2VyLmxpbmU7XG5cdCAgICAgICAgdGhpcy5zY2FubmVyLmxpbmVTdGFydCA9IHRoaXMuc3RhcnRNYXJrZXIuaW5kZXggLSB0aGlzLnN0YXJ0TWFya2VyLmNvbHVtbjtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLmZpbmlzaEpTWCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAvLyBQcmltZSB0aGUgbmV4dCBsb29rYWhlYWQuXG5cdCAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnJlZW50ZXJKU1ggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5zdGFydEpTWCgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0SlNYKCd9Jyk7XG5cdCAgICAgICAgLy8gUG9wIHRoZSBjbG9zaW5nICd9JyBhZGRlZCBmcm9tIHRoZSBsb29rYWhlYWQuXG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLnRva2Vucykge1xuXHQgICAgICAgICAgICB0aGlzLnRva2Vucy5wb3AoKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVKU1hOb2RlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuY29sbGVjdENvbW1lbnRzKCk7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgaW5kZXg6IHRoaXMuc2Nhbm5lci5pbmRleCxcblx0ICAgICAgICAgICAgbGluZTogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVKU1hDaGlsZE5vZGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgaW5kZXg6IHRoaXMuc2Nhbm5lci5pbmRleCxcblx0ICAgICAgICAgICAgbGluZTogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5zY2FuWEhUTUxFbnRpdHkgPSBmdW5jdGlvbiAocXVvdGUpIHtcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gJyYnO1xuXHQgICAgICAgIHZhciB2YWxpZCA9IHRydWU7XG5cdCAgICAgICAgdmFyIHRlcm1pbmF0ZWQgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgbnVtZXJpYyA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBoZXggPSBmYWxzZTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuc2Nhbm5lci5lb2YoKSAmJiB2YWxpZCAmJiAhdGVybWluYXRlZCkge1xuXHQgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleF07XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gcXVvdGUpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRlcm1pbmF0ZWQgPSAoY2ggPT09ICc7Jyk7XG5cdCAgICAgICAgICAgIHJlc3VsdCArPSBjaDtcblx0ICAgICAgICAgICAgKyt0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIGlmICghdGVybWluYXRlZCkge1xuXHQgICAgICAgICAgICAgICAgc3dpdGNoIChyZXN1bHQubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuICcmIzEyMzsnXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWMgPSAoY2ggPT09ICcjJyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bWVyaWMpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gJyYjeDQxOydcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleCA9IChjaCA9PT0gJ3gnKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gaGV4IHx8IGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWMgPSBudW1lcmljICYmICFoZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiAhKG51bWVyaWMgJiYgIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgIShoZXggJiYgIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0hleERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHZhbGlkICYmIHRlcm1pbmF0ZWQgJiYgcmVzdWx0Lmxlbmd0aCA+IDIpIHtcblx0ICAgICAgICAgICAgLy8gZS5nLiAnJiN4NDE7JyBiZWNvbWVzIGp1c3QgJyN4NDEnXG5cdCAgICAgICAgICAgIHZhciBzdHIgPSByZXN1bHQuc3Vic3RyKDEsIHJlc3VsdC5sZW5ndGggLSAyKTtcblx0ICAgICAgICAgICAgaWYgKG51bWVyaWMgJiYgc3RyLmxlbmd0aCA+IDEpIHtcblx0ICAgICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTApKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChoZXggJiYgc3RyLmxlbmd0aCA+IDIpIHtcblx0ICAgICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoJzAnICsgc3RyLnN1YnN0cigxKSwgMTYpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICghbnVtZXJpYyAmJiAhaGV4ICYmIHhodG1sX2VudGl0aWVzXzEuWEhUTUxFbnRpdGllc1tzdHJdKSB7XG5cdCAgICAgICAgICAgICAgICByZXN1bHQgPSB4aHRtbF9lbnRpdGllc18xLlhIVE1MRW50aXRpZXNbc3RyXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmVzdWx0O1xuXHQgICAgfTtcblx0ICAgIC8vIFNjYW4gdGhlIG5leHQgSlNYIHRva2VuLiBUaGlzIHJlcGxhY2VzIFNjYW5uZXIjbGV4IHdoZW4gaW4gSlNYIG1vZGUuXG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLmxleEpTWCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgY3AgPSB0aGlzLnNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQodGhpcy5zY2FubmVyLmluZGV4KTtcblx0ICAgICAgICAvLyA8ID4gLyA6ID0geyB9XG5cdCAgICAgICAgaWYgKGNwID09PSA2MCB8fCBjcCA9PT0gNjIgfHwgY3AgPT09IDQ3IHx8IGNwID09PSA1OCB8fCBjcCA9PT0gNjEgfHwgY3AgPT09IDEyMyB8fCBjcCA9PT0gMTI1KSB7XG5cdCAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4KytdO1xuXHQgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogNyAvKiBQdW5jdHVhdG9yICovLFxuXHQgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuXHQgICAgICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMuc2Nhbm5lci5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5zY2FubmVyLmluZGV4IC0gMSxcblx0ICAgICAgICAgICAgICAgIGVuZDogdGhpcy5zY2FubmVyLmluZGV4XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFwiICdcblx0ICAgICAgICBpZiAoY3AgPT09IDM0IHx8IGNwID09PSAzOSkge1xuXHQgICAgICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIHZhciBxdW90ZSA9IHRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4KytdO1xuXHQgICAgICAgICAgICB2YXIgc3RyID0gJyc7XG5cdCAgICAgICAgICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZigpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleCsrXTtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gcXVvdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAnJicpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdHIgKz0gdGhpcy5zY2FuWEhUTUxFbnRpdHkocXVvdGUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RyICs9IGNoO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiA4IC8qIFN0cmluZ0xpdGVyYWwgKi8sXG5cdCAgICAgICAgICAgICAgICB2YWx1ZTogc3RyLFxuXHQgICAgICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMuc2Nhbm5lci5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuc2Nhbm5lci5pbmRleFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyAuLi4gb3IgLlxuXHQgICAgICAgIGlmIChjcCA9PT0gNDYpIHtcblx0ICAgICAgICAgICAgdmFyIG4xID0gdGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuc2Nhbm5lci5pbmRleCArIDEpO1xuXHQgICAgICAgICAgICB2YXIgbjIgPSB0aGlzLnNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQodGhpcy5zY2FubmVyLmluZGV4ICsgMik7XG5cdCAgICAgICAgICAgIHZhciB2YWx1ZSA9IChuMSA9PT0gNDYgJiYgbjIgPT09IDQ2KSA/ICcuLi4nIDogJy4nO1xuXHQgICAgICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5pbmRleCArPSB2YWx1ZS5sZW5ndGg7XG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiA3IC8qIFB1bmN0dWF0b3IgKi8sXG5cdCAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG5cdCAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5zY2FubmVyLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcblx0ICAgICAgICAgICAgICAgIGVuZDogdGhpcy5zY2FubmVyLmluZGV4XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIGBcblx0ICAgICAgICBpZiAoY3AgPT09IDk2KSB7XG5cdCAgICAgICAgICAgIC8vIE9ubHkgcGxhY2Vob2xkZXIsIHNpbmNlIGl0IHdpbGwgYmUgcmVzY2FubmVkIGFzIGEgcmVhbCBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiAxMCAvKiBUZW1wbGF0ZSAqLyxcblx0ICAgICAgICAgICAgICAgIHZhbHVlOiAnJyxcblx0ICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLnNjYW5uZXIubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuc2Nhbm5lci5pbmRleCxcblx0ICAgICAgICAgICAgICAgIGVuZDogdGhpcy5zY2FubmVyLmluZGV4XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIElkZW50aWZlciBjYW4gbm90IGNvbnRhaW4gYmFja3NsYXNoIChjaGFyIGNvZGUgOTIpLlxuXHQgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyU3RhcnQoY3ApICYmIChjcCAhPT0gOTIpKSB7XG5cdCAgICAgICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICAgICAgKyt0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZigpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQodGhpcy5zY2FubmVyLmluZGV4KTtcblx0ICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyUGFydChjaCkgJiYgKGNoICE9PSA5MikpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSA0NSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIEh5cGhlbiAoY2hhciBjb2RlIDQ1KSBjYW4gYmUgcGFydCBvZiBhbiBpZGVudGlmaWVyLlxuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5zY2FubmVyLnNvdXJjZS5zbGljZShzdGFydCwgdGhpcy5zY2FubmVyLmluZGV4KTtcblx0ICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgIHR5cGU6IDEwMCAvKiBJZGVudGlmaWVyICovLFxuXHQgICAgICAgICAgICAgICAgdmFsdWU6IGlkLFxuXHQgICAgICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMuc2Nhbm5lci5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuc2Nhbm5lci5pbmRleFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5zY2FubmVyLmxleCgpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUubmV4dEpTWFRva2VuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuY29sbGVjdENvbW1lbnRzKCk7XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlci5pbmRleCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICB0aGlzLnN0YXJ0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLnN0YXJ0TWFya2VyLmNvbHVtbiA9IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnQ7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sZXhKU1goKTtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuaW5kZXggPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuY29sdW1uID0gdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydDtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcudG9rZW5zKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy5jb252ZXJ0VG9rZW4odG9rZW4pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRva2VuO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUubmV4dEpTWFRleHQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlci5pbmRleCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICB0aGlzLnN0YXJ0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLnN0YXJ0TWFya2VyLmNvbHVtbiA9IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnQ7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgIHZhciB0ZXh0ID0gJyc7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKCkpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zY2FubmVyLnNvdXJjZVt0aGlzLnNjYW5uZXIuaW5kZXhdO1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09ICd7JyB8fCBjaCA9PT0gJzwnKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICArK3RoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICAgICAgdGV4dCArPSBjaDtcblx0ICAgICAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuc2Nhbm5lci5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiB0aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleF0gPT09ICdcXG4nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubGluZVN0YXJ0ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlci5pbmRleCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIubGluZSA9IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyO1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlci5jb2x1bW4gPSB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0O1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHtcblx0ICAgICAgICAgICAgdHlwZTogMTAxIC8qIFRleHQgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiB0ZXh0LFxuXHQgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLnNjYW5uZXIubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5zY2FubmVyLmluZGV4XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBpZiAoKHRleHQubGVuZ3RoID4gMCkgJiYgdGhpcy5jb25maWcudG9rZW5zKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy5jb252ZXJ0VG9rZW4odG9rZW4pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRva2VuO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGVla0pTWFRva2VuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuc2Nhbm5lci5zYXZlU3RhdGUoKTtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIuc2NhbkNvbW1lbnRzKCk7XG5cdCAgICAgICAgdmFyIG5leHQgPSB0aGlzLmxleEpTWCgpO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5yZXN0b3JlU3RhdGUoc3RhdGUpO1xuXHQgICAgICAgIHJldHVybiBuZXh0O1xuXHQgICAgfTtcblx0ICAgIC8vIEV4cGVjdCB0aGUgbmV4dCBKU1ggdG9rZW4gdG8gbWF0Y2ggdGhlIHNwZWNpZmllZCBwdW5jdHVhdG9yLlxuXHQgICAgLy8gSWYgbm90LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uXG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLmV4cGVjdEpTWCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dEpTWFRva2VuKCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09IDcgLyogUHVuY3R1YXRvciAqLyB8fCB0b2tlbi52YWx1ZSAhPT0gdmFsdWUpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBuZXh0IEpTWCB0b2tlbiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcHVuY3R1YXRvci5cblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUubWF0Y2hKU1ggPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICB2YXIgbmV4dCA9IHRoaXMucGVla0pTWFRva2VuKCk7XG5cdCAgICAgICAgcmV0dXJuIG5leHQudHlwZSA9PT0gNyAvKiBQdW5jdHVhdG9yICovICYmIG5leHQudmFsdWUgPT09IHZhbHVlO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hJZGVudGlmaWVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0SlNYVG9rZW4oKTtcblx0ICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gMTAwIC8qIElkZW50aWZpZXIgKi8pIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWElkZW50aWZpZXIodG9rZW4udmFsdWUpKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYRWxlbWVudE5hbWUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB2YXIgZWxlbWVudE5hbWUgPSB0aGlzLnBhcnNlSlNYSWRlbnRpZmllcigpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoSlNYKCc6JykpIHtcblx0ICAgICAgICAgICAgdmFyIG5hbWVzcGFjZSA9IGVsZW1lbnROYW1lO1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdEpTWCgnOicpO1xuXHQgICAgICAgICAgICB2YXIgbmFtZV8xID0gdGhpcy5wYXJzZUpTWElkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgZWxlbWVudE5hbWUgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWE5hbWVzcGFjZWROYW1lKG5hbWVzcGFjZSwgbmFtZV8xKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hKU1goJy4nKSkge1xuXHQgICAgICAgICAgICB3aGlsZSAodGhpcy5tYXRjaEpTWCgnLicpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgb2JqZWN0ID0gZWxlbWVudE5hbWU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdEpTWCgnLicpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5wYXJzZUpTWElkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hNZW1iZXJFeHByZXNzaW9uKG9iamVjdCwgcHJvcGVydHkpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZWxlbWVudE5hbWU7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEF0dHJpYnV0ZU5hbWUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB2YXIgYXR0cmlidXRlTmFtZTtcblx0ICAgICAgICB2YXIgaWRlbnRpZmllciA9IHRoaXMucGFyc2VKU1hJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2hKU1goJzonKSkge1xuXHQgICAgICAgICAgICB2YXIgbmFtZXNwYWNlID0gaWRlbnRpZmllcjtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJzonKTtcblx0ICAgICAgICAgICAgdmFyIG5hbWVfMiA9IHRoaXMucGFyc2VKU1hJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWE5hbWVzcGFjZWROYW1lKG5hbWVzcGFjZSwgbmFtZV8yKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0gaWRlbnRpZmllcjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWU7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWFN0cmluZ0xpdGVyYWxBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRKU1hUb2tlbigpO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlICE9PSA4IC8qIFN0cmluZ0xpdGVyYWwgKi8pIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciByYXcgPSB0aGlzLmdldFRva2VuUmF3KHRva2VuKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5MaXRlcmFsKHRva2VuLnZhbHVlLCByYXcpKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYRXhwcmVzc2lvbkF0dHJpYnV0ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0SlNYKCd7Jyk7XG5cdCAgICAgICAgdGhpcy5maW5pc2hKU1goKTtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcignSlNYIGF0dHJpYnV0ZXMgbXVzdCBvbmx5IGJlIGFzc2lnbmVkIGEgbm9uLWVtcHR5IGV4cHJlc3Npb24nKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGV4cHJlc3Npb24gPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICB0aGlzLnJlZW50ZXJKU1goKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hFeHByZXNzaW9uQ29udGFpbmVyKGV4cHJlc3Npb24pKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYQXR0cmlidXRlVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hKU1goJ3snKSA/IHRoaXMucGFyc2VKU1hFeHByZXNzaW9uQXR0cmlidXRlKCkgOlxuXHQgICAgICAgICAgICB0aGlzLm1hdGNoSlNYKCc8JykgPyB0aGlzLnBhcnNlSlNYRWxlbWVudCgpIDogdGhpcy5wYXJzZUpTWFN0cmluZ0xpdGVyYWxBdHRyaWJ1dGUoKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYTmFtZVZhbHVlQXR0cmlidXRlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdmFyIG5hbWUgPSB0aGlzLnBhcnNlSlNYQXR0cmlidXRlTmFtZSgpO1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IG51bGw7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2hKU1goJz0nKSkge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdEpTWCgnPScpO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VKU1hBdHRyaWJ1dGVWYWx1ZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hBdHRyaWJ1dGUobmFtZSwgdmFsdWUpKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYU3ByZWFkQXR0cmlidXRlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJ3snKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgnLi4uJyk7XG5cdCAgICAgICAgdGhpcy5maW5pc2hKU1goKTtcblx0ICAgICAgICB2YXIgYXJndW1lbnQgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICB0aGlzLnJlZW50ZXJKU1goKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hTcHJlYWRBdHRyaWJ1dGUoYXJndW1lbnQpKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYQXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgYXR0cmlidXRlcyA9IFtdO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5tYXRjaEpTWCgnLycpICYmICF0aGlzLm1hdGNoSlNYKCc+JykpIHtcblx0ICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IHRoaXMubWF0Y2hKU1goJ3snKSA/IHRoaXMucGFyc2VKU1hTcHJlYWRBdHRyaWJ1dGUoKSA6XG5cdCAgICAgICAgICAgICAgICB0aGlzLnBhcnNlSlNYTmFtZVZhbHVlQXR0cmlidXRlKCk7XG5cdCAgICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYT3BlbmluZ0VsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgnPCcpO1xuXHQgICAgICAgIHZhciBuYW1lID0gdGhpcy5wYXJzZUpTWEVsZW1lbnROYW1lKCk7XG5cdCAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLnBhcnNlSlNYQXR0cmlidXRlcygpO1xuXHQgICAgICAgIHZhciBzZWxmQ2xvc2luZyA9IHRoaXMubWF0Y2hKU1goJy8nKTtcblx0ICAgICAgICBpZiAoc2VsZkNsb3NpbmcpIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJy8nKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJz4nKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hPcGVuaW5nRWxlbWVudChuYW1lLCBzZWxmQ2xvc2luZywgYXR0cmlidXRlcykpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hCb3VuZGFyeUVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgnPCcpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoSlNYKCcvJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJy8nKTtcblx0ICAgICAgICAgICAgdmFyIG5hbWVfMyA9IHRoaXMucGFyc2VKU1hFbGVtZW50TmFtZSgpO1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdEpTWCgnPicpO1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hDbG9zaW5nRWxlbWVudChuYW1lXzMpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG5hbWUgPSB0aGlzLnBhcnNlSlNYRWxlbWVudE5hbWUoKTtcblx0ICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMucGFyc2VKU1hBdHRyaWJ1dGVzKCk7XG5cdCAgICAgICAgdmFyIHNlbGZDbG9zaW5nID0gdGhpcy5tYXRjaEpTWCgnLycpO1xuXHQgICAgICAgIGlmIChzZWxmQ2xvc2luZykge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdEpTWCgnLycpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgnPicpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWE9wZW5pbmdFbGVtZW50KG5hbWUsIHNlbGZDbG9zaW5nLCBhdHRyaWJ1dGVzKSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEVtcHR5RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYQ2hpbGROb2RlKCk7XG5cdCAgICAgICAgdGhpcy5jb2xsZWN0Q29tbWVudHMoKTtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuaW5kZXggPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuY29sdW1uID0gdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hFbXB0eUV4cHJlc3Npb24oKSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEV4cHJlc3Npb25Db250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgneycpO1xuXHQgICAgICAgIHZhciBleHByZXNzaW9uO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoSlNYKCd9JykpIHtcblx0ICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHRoaXMucGFyc2VKU1hFbXB0eUV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJ30nKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuZmluaXNoSlNYKCk7XG5cdCAgICAgICAgICAgIGV4cHJlc3Npb24gPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgdGhpcy5yZWVudGVySlNYKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWEV4cHJlc3Npb25Db250YWluZXIoZXhwcmVzc2lvbikpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hDaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgY2hpbGRyZW4gPSBbXTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuc2Nhbm5lci5lb2YoKSkge1xuXHQgICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYQ2hpbGROb2RlKCk7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dEpTWFRleHQoKTtcblx0ICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDwgdG9rZW4uZW5kKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcmF3ID0gdGhpcy5nZXRUb2tlblJhdyh0b2tlbik7XG5cdCAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWFRleHQodG9rZW4udmFsdWUsIHJhdykpO1xuXHQgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4XSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5wYXJzZUpTWEV4cHJlc3Npb25Db250YWluZXIoKTtcblx0ICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY29udGFpbmVyKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBjaGlsZHJlbjtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlQ29tcGxleEpTWEVsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICB2YXIgc3RhY2sgPSBbXTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuc2Nhbm5lci5lb2YoKSkge1xuXHQgICAgICAgICAgICBlbC5jaGlsZHJlbiA9IGVsLmNoaWxkcmVuLmNvbmNhdCh0aGlzLnBhcnNlSlNYQ2hpbGRyZW4oKSk7XG5cdCAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hDaGlsZE5vZGUoKTtcblx0ICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLnBhcnNlSlNYQm91bmRhcnlFbGVtZW50KCk7XG5cdCAgICAgICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYT3BlbmluZ0VsZW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBvcGVuaW5nID0gZWxlbWVudDtcblx0ICAgICAgICAgICAgICAgIGlmIChvcGVuaW5nLnNlbGZDbG9zaW5nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hFbGVtZW50KG9wZW5pbmcsIFtdLCBudWxsKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgZWwuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGVsKTtcblx0ICAgICAgICAgICAgICAgICAgICBlbCA9IHsgbm9kZTogbm9kZSwgb3BlbmluZzogb3BlbmluZywgY2xvc2luZzogbnVsbCwgY2hpbGRyZW46IFtdIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hDbG9zaW5nRWxlbWVudCkge1xuXHQgICAgICAgICAgICAgICAgZWwuY2xvc2luZyA9IGVsZW1lbnQ7XG5cdCAgICAgICAgICAgICAgICB2YXIgb3Blbl8xID0gZ2V0UXVhbGlmaWVkRWxlbWVudE5hbWUoZWwub3BlbmluZy5uYW1lKTtcblx0ICAgICAgICAgICAgICAgIHZhciBjbG9zZV8xID0gZ2V0UXVhbGlmaWVkRWxlbWVudE5hbWUoZWwuY2xvc2luZy5uYW1lKTtcblx0ICAgICAgICAgICAgICAgIGlmIChvcGVuXzEgIT09IGNsb3NlXzEpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IoJ0V4cGVjdGVkIGNvcnJlc3BvbmRpbmcgSlNYIGNsb3NpbmcgdGFnIGZvciAlMCcsIG9wZW5fMSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuZmluYWxpemUoZWwubm9kZSwgbmV3IEpTWE5vZGUuSlNYRWxlbWVudChlbC5vcGVuaW5nLCBlbC5jaGlsZHJlbiwgZWwuY2xvc2luZykpO1xuXHQgICAgICAgICAgICAgICAgICAgIGVsID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG5cdCAgICAgICAgICAgICAgICAgICAgZWwuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZWw7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB2YXIgb3BlbmluZyA9IHRoaXMucGFyc2VKU1hPcGVuaW5nRWxlbWVudCgpO1xuXHQgICAgICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuXHQgICAgICAgIHZhciBjbG9zaW5nID0gbnVsbDtcblx0ICAgICAgICBpZiAoIW9wZW5pbmcuc2VsZkNsb3NpbmcpIHtcblx0ICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5wYXJzZUNvbXBsZXhKU1hFbGVtZW50KHsgbm9kZTogbm9kZSwgb3BlbmluZzogb3BlbmluZywgY2xvc2luZzogY2xvc2luZywgY2hpbGRyZW46IGNoaWxkcmVuIH0pO1xuXHQgICAgICAgICAgICBjaGlsZHJlbiA9IGVsLmNoaWxkcmVuO1xuXHQgICAgICAgICAgICBjbG9zaW5nID0gZWwuY2xvc2luZztcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYRWxlbWVudChvcGVuaW5nLCBjaGlsZHJlbiwgY2xvc2luZykpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hSb290ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIC8vIFBvcCB0aGUgb3BlbmluZyAnPCcgYWRkZWQgZnJvbSB0aGUgbG9va2FoZWFkLlxuXHQgICAgICAgIGlmICh0aGlzLmNvbmZpZy50b2tlbnMpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2tlbnMucG9wKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuc3RhcnRKU1goKTtcblx0ICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMucGFyc2VKU1hFbGVtZW50KCk7XG5cdCAgICAgICAgdGhpcy5maW5pc2hKU1goKTtcblx0ICAgICAgICByZXR1cm4gZWxlbWVudDtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLmlzU3RhcnRPZkV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuaXNTdGFydE9mRXhwcmVzc2lvbi5jYWxsKHRoaXMpIHx8IHRoaXMubWF0Y2goJzwnKTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gSlNYUGFyc2VyO1xuXHR9KHBhcnNlcl8xLlBhcnNlcikpO1xuXHRleHBvcnRzLkpTWFBhcnNlciA9IEpTWFBhcnNlcjtcblxuXG4vKioqLyB9LFxuLyogNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0Ly8gU2VlIGFsc28gdG9vbHMvZ2VuZXJhdGUtdW5pY29kZS1yZWdleC5qcy5cblx0dmFyIFJlZ2V4ID0ge1xuXHQgICAgLy8gVW5pY29kZSB2OC4wLjAgTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQ6XG5cdCAgICBOb25Bc2NpaUlkZW50aWZpZXJTdGFydDogL1tcXHhBQVxceEI1XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYyMC1cXHUwNjRBXFx1MDY2RVxcdTA2NkZcXHUwNjcxLVxcdTA2RDNcXHUwNkQ1XFx1MDZFNVxcdTA2RTZcXHUwNkVFXFx1MDZFRlxcdTA2RkEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwXFx1MDcxMi1cXHUwNzJGXFx1MDc0RC1cXHUwN0E1XFx1MDdCMVxcdTA3Q0EtXFx1MDdFQVxcdTA3RjRcXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgxNVxcdTA4MUFcXHUwODI0XFx1MDgyOFxcdTA4NDAtXFx1MDg1OFxcdTA4QTAtXFx1MDhCNFxcdTA5MDQtXFx1MDkzOVxcdTA5M0RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTgwXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCRFxcdTA5Q0VcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFMVxcdTA5RjBcXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE3Mi1cXHUwQTc0XFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFEMFxcdTBBRTBcXHUwQUUxXFx1MEFGOVxcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNEXFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjFcXHUwQjcxXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkQwXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRFxcdTBDNTgtXFx1MEM1QVxcdTBDNjBcXHUwQzYxXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCRFxcdTBDREVcXHUwQ0UwXFx1MENFMVxcdTBDRjFcXHUwQ0YyXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRFxcdTBENEVcXHUwRDVGLVxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFFXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlCMC1cXHUxOUM5XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE4LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0VFXFx1MkNGMlxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDgwLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMjlcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM0NcXHUzMDQxLVxcdTMwOTZcXHUzMDlCLVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGRDVcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MUZcXHVBNjJBXFx1QTYyQlxcdUE2NDAtXFx1QTY2RVxcdUE2N0YtXFx1QTY5RFxcdUE2QTAtXFx1QTZFRlxcdUE3MTctXFx1QTcxRlxcdUE3MjItXFx1QTc4OFxcdUE3OEItXFx1QTdBRFxcdUE3QjAtXFx1QTdCN1xcdUE3RjctXFx1QTgwMVxcdUE4MDMtXFx1QTgwNVxcdUE4MDctXFx1QTgwQVxcdUE4MEMtXFx1QTgyMlxcdUE4NDAtXFx1QTg3M1xcdUE4ODItXFx1QThCM1xcdUE4RjItXFx1QThGN1xcdUE4RkJcXHVBOEZEXFx1QTkwQS1cXHVBOTI1XFx1QTkzMC1cXHVBOTQ2XFx1QTk2MC1cXHVBOTdDXFx1QTk4NC1cXHVBOUIyXFx1QTlDRlxcdUE5RTAtXFx1QTlFNFxcdUE5RTYtXFx1QTlFRlxcdUE5RkEtXFx1QTlGRVxcdUFBMDAtXFx1QUEyOFxcdUFBNDAtXFx1QUE0MlxcdUFBNDQtXFx1QUE0QlxcdUFBNjAtXFx1QUE3NlxcdUFBN0FcXHVBQTdFLVxcdUFBQUZcXHVBQUIxXFx1QUFCNVxcdUFBQjZcXHVBQUI5LVxcdUFBQkRcXHVBQUMwXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFQVxcdUFBRjItXFx1QUFGNFxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCMzAtXFx1QUI1QVxcdUFCNUMtXFx1QUI2NVxcdUFCNzAtXFx1QUJFMlxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMURcXHVGQjFGLVxcdUZCMjhcXHVGQjJBLVxcdUZCMzZcXHVGQjM4LVxcdUZCM0NcXHVGQjNFXFx1RkI0MFxcdUZCNDFcXHVGQjQzXFx1RkI0NFxcdUZCNDYtXFx1RkJCMVxcdUZCRDMtXFx1RkQzRFxcdUZENTAtXFx1RkQ4RlxcdUZEOTItXFx1RkRDN1xcdUZERjAtXFx1RkRGQlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMjEtXFx1RkYzQVxcdUZGNDEtXFx1RkY1QVxcdUZGNjYtXFx1RkZCRVxcdUZGQzItXFx1RkZDN1xcdUZGQ0EtXFx1RkZDRlxcdUZGRDItXFx1RkZEN1xcdUZGREEtXFx1RkZEQ118XFx1RDgwMFtcXHVEQzAwLVxcdURDMEJcXHVEQzBELVxcdURDMjZcXHVEQzI4LVxcdURDM0FcXHVEQzNDXFx1REMzRFxcdURDM0YtXFx1REM0RFxcdURDNTAtXFx1REM1RFxcdURDODAtXFx1RENGQVxcdURENDAtXFx1REQ3NFxcdURFODAtXFx1REU5Q1xcdURFQTAtXFx1REVEMFxcdURGMDAtXFx1REYxRlxcdURGMzAtXFx1REY0QVxcdURGNTAtXFx1REY3NVxcdURGODAtXFx1REY5RFxcdURGQTAtXFx1REZDM1xcdURGQzgtXFx1REZDRlxcdURGRDEtXFx1REZENV18XFx1RDgwMVtcXHVEQzAwLVxcdURDOURcXHVERDAwLVxcdUREMjdcXHVERDMwLVxcdURENjNcXHVERTAwLVxcdURGMzZcXHVERjQwLVxcdURGNTVcXHVERjYwLVxcdURGNjddfFxcdUQ4MDJbXFx1REMwMC1cXHVEQzA1XFx1REMwOFxcdURDMEEtXFx1REMzNVxcdURDMzdcXHVEQzM4XFx1REMzQ1xcdURDM0YtXFx1REM1NVxcdURDNjAtXFx1REM3NlxcdURDODAtXFx1REM5RVxcdURDRTAtXFx1RENGMlxcdURDRjRcXHVEQ0Y1XFx1REQwMC1cXHVERDE1XFx1REQyMC1cXHVERDM5XFx1REQ4MC1cXHVEREI3XFx1RERCRVxcdUREQkZcXHVERTAwXFx1REUxMC1cXHVERTEzXFx1REUxNS1cXHVERTE3XFx1REUxOS1cXHVERTMzXFx1REU2MC1cXHVERTdDXFx1REU4MC1cXHVERTlDXFx1REVDMC1cXHVERUM3XFx1REVDOS1cXHVERUU0XFx1REYwMC1cXHVERjM1XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjcyXFx1REY4MC1cXHVERjkxXXxcXHVEODAzW1xcdURDMDAtXFx1REM0OFxcdURDODAtXFx1RENCMlxcdURDQzAtXFx1RENGMl18XFx1RDgwNFtcXHVEQzAzLVxcdURDMzdcXHVEQzgzLVxcdURDQUZcXHVEQ0QwLVxcdURDRThcXHVERDAzLVxcdUREMjZcXHVERDUwLVxcdURENzJcXHVERDc2XFx1REQ4My1cXHVEREIyXFx1RERDMS1cXHVEREM0XFx1REREQVxcdURERENcXHVERTAwLVxcdURFMTFcXHVERTEzLVxcdURFMkJcXHVERTgwLVxcdURFODZcXHVERTg4XFx1REU4QS1cXHVERThEXFx1REU4Ri1cXHVERTlEXFx1REU5Ri1cXHVERUE4XFx1REVCMC1cXHVERURFXFx1REYwNS1cXHVERjBDXFx1REYwRlxcdURGMTBcXHVERjEzLVxcdURGMjhcXHVERjJBLVxcdURGMzBcXHVERjMyXFx1REYzM1xcdURGMzUtXFx1REYzOVxcdURGM0RcXHVERjUwXFx1REY1RC1cXHVERjYxXXxcXHVEODA1W1xcdURDODAtXFx1RENBRlxcdURDQzRcXHVEQ0M1XFx1RENDN1xcdUREODAtXFx1RERBRVxcdURERDgtXFx1REREQlxcdURFMDAtXFx1REUyRlxcdURFNDRcXHVERTgwLVxcdURFQUFcXHVERjAwLVxcdURGMTldfFxcdUQ4MDZbXFx1RENBMC1cXHVEQ0RGXFx1RENGRlxcdURFQzAtXFx1REVGOF18XFx1RDgwOFtcXHVEQzAwLVxcdURGOTldfFxcdUQ4MDlbXFx1REMwMC1cXHVEQzZFXFx1REM4MC1cXHVERDQzXXxbXFx1RDgwQ1xcdUQ4NDAtXFx1RDg2OFxcdUQ4NkEtXFx1RDg2Q1xcdUQ4NkYtXFx1RDg3Ml1bXFx1REMwMC1cXHVERkZGXXxcXHVEODBEW1xcdURDMDAtXFx1REMyRV18XFx1RDgxMVtcXHVEQzAwLVxcdURFNDZdfFxcdUQ4MUFbXFx1REMwMC1cXHVERTM4XFx1REU0MC1cXHVERTVFXFx1REVEMC1cXHVERUVEXFx1REYwMC1cXHVERjJGXFx1REY0MC1cXHVERjQzXFx1REY2My1cXHVERjc3XFx1REY3RC1cXHVERjhGXXxcXHVEODFCW1xcdURGMDAtXFx1REY0NFxcdURGNTBcXHVERjkzLVxcdURGOUZdfFxcdUQ4MkNbXFx1REMwMFxcdURDMDFdfFxcdUQ4MkZbXFx1REMwMC1cXHVEQzZBXFx1REM3MC1cXHVEQzdDXFx1REM4MC1cXHVEQzg4XFx1REM5MC1cXHVEQzk5XXxcXHVEODM1W1xcdURDMDAtXFx1REM1NFxcdURDNTYtXFx1REM5Q1xcdURDOUVcXHVEQzlGXFx1RENBMlxcdURDQTVcXHVEQ0E2XFx1RENBOS1cXHVEQ0FDXFx1RENBRS1cXHVEQ0I5XFx1RENCQlxcdURDQkQtXFx1RENDM1xcdURDQzUtXFx1REQwNVxcdUREMDctXFx1REQwQVxcdUREMEQtXFx1REQxNFxcdUREMTYtXFx1REQxQ1xcdUREMUUtXFx1REQzOVxcdUREM0ItXFx1REQzRVxcdURENDAtXFx1REQ0NFxcdURENDZcXHVERDRBLVxcdURENTBcXHVERDUyLVxcdURFQTVcXHVERUE4LVxcdURFQzBcXHVERUMyLVxcdURFREFcXHVERURDLVxcdURFRkFcXHVERUZDLVxcdURGMTRcXHVERjE2LVxcdURGMzRcXHVERjM2LVxcdURGNEVcXHVERjUwLVxcdURGNkVcXHVERjcwLVxcdURGODhcXHVERjhBLVxcdURGQThcXHVERkFBLVxcdURGQzJcXHVERkM0LVxcdURGQ0JdfFxcdUQ4M0FbXFx1REMwMC1cXHVEQ0M0XXxcXHVEODNCW1xcdURFMDAtXFx1REUwM1xcdURFMDUtXFx1REUxRlxcdURFMjFcXHVERTIyXFx1REUyNFxcdURFMjdcXHVERTI5LVxcdURFMzJcXHVERTM0LVxcdURFMzdcXHVERTM5XFx1REUzQlxcdURFNDJcXHVERTQ3XFx1REU0OVxcdURFNEJcXHVERTRELVxcdURFNEZcXHVERTUxXFx1REU1MlxcdURFNTRcXHVERTU3XFx1REU1OVxcdURFNUJcXHVERTVEXFx1REU1RlxcdURFNjFcXHVERTYyXFx1REU2NFxcdURFNjctXFx1REU2QVxcdURFNkMtXFx1REU3MlxcdURFNzQtXFx1REU3N1xcdURFNzktXFx1REU3Q1xcdURFN0VcXHVERTgwLVxcdURFODlcXHVERThCLVxcdURFOUJcXHVERUExLVxcdURFQTNcXHVERUE1LVxcdURFQTlcXHVERUFCLVxcdURFQkJdfFxcdUQ4NjlbXFx1REMwMC1cXHVERUQ2XFx1REYwMC1cXHVERkZGXXxcXHVEODZEW1xcdURDMDAtXFx1REYzNFxcdURGNDAtXFx1REZGRl18XFx1RDg2RVtcXHVEQzAwLVxcdURDMURcXHVEQzIwLVxcdURGRkZdfFxcdUQ4NzNbXFx1REMwMC1cXHVERUExXXxcXHVEODdFW1xcdURDMDAtXFx1REUxRF0vLFxuXHQgICAgLy8gVW5pY29kZSB2OC4wLjAgTm9uQXNjaWlJZGVudGlmaWVyUGFydDpcblx0ICAgIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6IC9bXFx4QUFcXHhCNVxceEI3XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDMwMC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4Ni1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNGNVxcdTAzRjctXFx1MDQ4MVxcdTA0ODMtXFx1MDQ4N1xcdTA0OEEtXFx1MDUyRlxcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNTkxLVxcdTA1QkRcXHUwNUJGXFx1MDVDMVxcdTA1QzJcXHUwNUM0XFx1MDVDNVxcdTA1QzdcXHUwNUQwLVxcdTA1RUFcXHUwNUYwLVxcdTA1RjJcXHUwNjEwLVxcdTA2MUFcXHUwNjIwLVxcdTA2NjlcXHUwNjZFLVxcdTA2RDNcXHUwNkQ1LVxcdTA2RENcXHUwNkRGLVxcdTA2RThcXHUwNkVBLVxcdTA2RkNcXHUwNkZGXFx1MDcxMC1cXHUwNzRBXFx1MDc0RC1cXHUwN0IxXFx1MDdDMC1cXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgyRFxcdTA4NDAtXFx1MDg1QlxcdTA4QTAtXFx1MDhCNFxcdTA4RTMtXFx1MDk2M1xcdTA5NjYtXFx1MDk2RlxcdTA5NzEtXFx1MDk4M1xcdTA5ODUtXFx1MDk4Q1xcdTA5OEZcXHUwOTkwXFx1MDk5My1cXHUwOUE4XFx1MDlBQS1cXHUwOUIwXFx1MDlCMlxcdTA5QjYtXFx1MDlCOVxcdTA5QkMtXFx1MDlDNFxcdTA5QzdcXHUwOUM4XFx1MDlDQi1cXHUwOUNFXFx1MDlEN1xcdTA5RENcXHUwOUREXFx1MDlERi1cXHUwOUUzXFx1MDlFNi1cXHUwOUYxXFx1MEEwMS1cXHUwQTAzXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTNDXFx1MEEzRS1cXHUwQTQyXFx1MEE0N1xcdTBBNDhcXHUwQTRCLVxcdTBBNERcXHUwQTUxXFx1MEE1OS1cXHUwQTVDXFx1MEE1RVxcdTBBNjYtXFx1MEE3NVxcdTBBODEtXFx1MEE4M1xcdTBBODUtXFx1MEE4RFxcdTBBOEYtXFx1MEE5MVxcdTBBOTMtXFx1MEFBOFxcdTBBQUEtXFx1MEFCMFxcdTBBQjJcXHUwQUIzXFx1MEFCNS1cXHUwQUI5XFx1MEFCQy1cXHUwQUM1XFx1MEFDNy1cXHUwQUM5XFx1MEFDQi1cXHUwQUNEXFx1MEFEMFxcdTBBRTAtXFx1MEFFM1xcdTBBRTYtXFx1MEFFRlxcdTBBRjlcXHUwQjAxLVxcdTBCMDNcXHUwQjA1LVxcdTBCMENcXHUwQjBGXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzJcXHUwQjMzXFx1MEIzNS1cXHUwQjM5XFx1MEIzQy1cXHUwQjQ0XFx1MEI0N1xcdTBCNDhcXHUwQjRCLVxcdTBCNERcXHUwQjU2XFx1MEI1N1xcdTBCNUNcXHUwQjVEXFx1MEI1Ri1cXHUwQjYzXFx1MEI2Ni1cXHUwQjZGXFx1MEI3MVxcdTBCODJcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCQkUtXFx1MEJDMlxcdTBCQzYtXFx1MEJDOFxcdTBCQ0EtXFx1MEJDRFxcdTBCRDBcXHUwQkQ3XFx1MEJFNi1cXHUwQkVGXFx1MEMwMC1cXHUwQzAzXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRC1cXHUwQzQ0XFx1MEM0Ni1cXHUwQzQ4XFx1MEM0QS1cXHUwQzREXFx1MEM1NVxcdTBDNTZcXHUwQzU4LVxcdTBDNUFcXHUwQzYwLVxcdTBDNjNcXHUwQzY2LVxcdTBDNkZcXHUwQzgxLVxcdTBDODNcXHUwQzg1LVxcdTBDOENcXHUwQzhFLVxcdTBDOTBcXHUwQzkyLVxcdTBDQThcXHUwQ0FBLVxcdTBDQjNcXHUwQ0I1LVxcdTBDQjlcXHUwQ0JDLVxcdTBDQzRcXHUwQ0M2LVxcdTBDQzhcXHUwQ0NBLVxcdTBDQ0RcXHUwQ0Q1XFx1MENENlxcdTBDREVcXHUwQ0UwLVxcdTBDRTNcXHUwQ0U2LVxcdTBDRUZcXHUwQ0YxXFx1MENGMlxcdTBEMDEtXFx1MEQwM1xcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0QtXFx1MEQ0NFxcdTBENDYtXFx1MEQ0OFxcdTBENEEtXFx1MEQ0RVxcdTBENTdcXHUwRDVGLVxcdTBENjNcXHUwRDY2LVxcdTBENkZcXHUwRDdBLVxcdTBEN0ZcXHUwRDgyXFx1MEQ4M1xcdTBEODUtXFx1MEQ5NlxcdTBEOUEtXFx1MERCMVxcdTBEQjMtXFx1MERCQlxcdTBEQkRcXHUwREMwLVxcdTBEQzZcXHUwRENBXFx1MERDRi1cXHUwREQ0XFx1MERENlxcdTBERDgtXFx1MERERlxcdTBERTYtXFx1MERFRlxcdTBERjJcXHUwREYzXFx1MEUwMS1cXHUwRTNBXFx1MEU0MC1cXHUwRTRFXFx1MEU1MC1cXHUwRTU5XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjlcXHUwRUJCLVxcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVDOC1cXHUwRUNEXFx1MEVEMC1cXHUwRUQ5XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGMThcXHUwRjE5XFx1MEYyMC1cXHUwRjI5XFx1MEYzNVxcdTBGMzdcXHUwRjM5XFx1MEYzRS1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY3MS1cXHUwRjg0XFx1MEY4Ni1cXHUwRjk3XFx1MEY5OS1cXHUwRkJDXFx1MEZDNlxcdTEwMDAtXFx1MTA0OVxcdTEwNTAtXFx1MTA5RFxcdTEwQTAtXFx1MTBDNVxcdTEwQzdcXHUxMENEXFx1MTBEMC1cXHUxMEZBXFx1MTBGQy1cXHUxMjQ4XFx1MTI0QS1cXHUxMjREXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNUEtXFx1MTI1RFxcdTEyNjAtXFx1MTI4OFxcdTEyOEEtXFx1MTI4RFxcdTEyOTAtXFx1MTJCMFxcdTEyQjItXFx1MTJCNVxcdTEyQjgtXFx1MTJCRVxcdTEyQzBcXHUxMkMyLVxcdTEyQzVcXHUxMkM4LVxcdTEyRDZcXHUxMkQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNUFcXHUxMzVELVxcdTEzNUZcXHUxMzY5LVxcdTEzNzFcXHUxMzgwLVxcdTEzOEZcXHUxM0EwLVxcdTEzRjVcXHUxM0Y4LVxcdTEzRkRcXHUxNDAxLVxcdTE2NkNcXHUxNjZGLVxcdTE2N0ZcXHUxNjgxLVxcdTE2OUFcXHUxNkEwLVxcdTE2RUFcXHUxNkVFLVxcdTE2RjhcXHUxNzAwLVxcdTE3MENcXHUxNzBFLVxcdTE3MTRcXHUxNzIwLVxcdTE3MzRcXHUxNzQwLVxcdTE3NTNcXHUxNzYwLVxcdTE3NkNcXHUxNzZFLVxcdTE3NzBcXHUxNzcyXFx1MTc3M1xcdTE3ODAtXFx1MTdEM1xcdTE3RDdcXHUxN0RDXFx1MTdERFxcdTE3RTAtXFx1MTdFOVxcdTE4MEItXFx1MTgwRFxcdTE4MTAtXFx1MTgxOVxcdTE4MjAtXFx1MTg3N1xcdTE4ODAtXFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5MjAtXFx1MTkyQlxcdTE5MzAtXFx1MTkzQlxcdTE5NDYtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QjAtXFx1MTlDOVxcdTE5RDAtXFx1MTlEQVxcdTFBMDAtXFx1MUExQlxcdTFBMjAtXFx1MUE1RVxcdTFBNjAtXFx1MUE3Q1xcdTFBN0YtXFx1MUE4OVxcdTFBOTAtXFx1MUE5OVxcdTFBQTdcXHUxQUIwLVxcdTFBQkRcXHUxQjAwLVxcdTFCNEJcXHUxQjUwLVxcdTFCNTlcXHUxQjZCLVxcdTFCNzNcXHUxQjgwLVxcdTFCRjNcXHUxQzAwLVxcdTFDMzdcXHUxQzQwLVxcdTFDNDlcXHUxQzRELVxcdTFDN0RcXHUxQ0QwLVxcdTFDRDJcXHUxQ0Q0LVxcdTFDRjZcXHUxQ0Y4XFx1MUNGOVxcdTFEMDAtXFx1MURGNVxcdTFERkMtXFx1MUYxNVxcdTFGMTgtXFx1MUYxRFxcdTFGMjAtXFx1MUY0NVxcdTFGNDgtXFx1MUY0RFxcdTFGNTAtXFx1MUY1N1xcdTFGNTlcXHUxRjVCXFx1MUY1RFxcdTFGNUYtXFx1MUY3RFxcdTFGODAtXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQwLVxcdTFGRDNcXHUxRkQ2LVxcdTFGREJcXHUxRkUwLVxcdTFGRUNcXHUxRkYyLVxcdTFGRjRcXHUxRkY2LVxcdTFGRkNcXHUyMDBDXFx1MjAwRFxcdTIwM0ZcXHUyMDQwXFx1MjA1NFxcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjBEMC1cXHUyMERDXFx1MjBFMVxcdTIwRTUtXFx1MjBGMFxcdTIxMDJcXHUyMTA3XFx1MjEwQS1cXHUyMTEzXFx1MjExNVxcdTIxMTgtXFx1MjExRFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMkEtXFx1MjEzOVxcdTIxM0MtXFx1MjEzRlxcdTIxNDUtXFx1MjE0OVxcdTIxNEVcXHUyMTYwLVxcdTIxODhcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDdGLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyREUwLVxcdTJERkZcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMkZcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM0NcXHUzMDQxLVxcdTMwOTZcXHUzMDk5LVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGRDVcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MkJcXHVBNjQwLVxcdUE2NkZcXHVBNjc0LVxcdUE2N0RcXHVBNjdGLVxcdUE2RjFcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QURcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MjdcXHVBODQwLVxcdUE4NzNcXHVBODgwLVxcdUE4QzRcXHVBOEQwLVxcdUE4RDlcXHVBOEUwLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MDAtXFx1QTkyRFxcdUE5MzAtXFx1QTk1M1xcdUE5NjAtXFx1QTk3Q1xcdUE5ODAtXFx1QTlDMFxcdUE5Q0YtXFx1QTlEOVxcdUE5RTAtXFx1QTlGRVxcdUFBMDAtXFx1QUEzNlxcdUFBNDAtXFx1QUE0RFxcdUFBNTAtXFx1QUE1OVxcdUFBNjAtXFx1QUE3NlxcdUFBN0EtXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFRlxcdUFBRjItXFx1QUFGNlxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCMzAtXFx1QUI1QVxcdUFCNUMtXFx1QUI2NVxcdUFCNzAtXFx1QUJFQVxcdUFCRUNcXHVBQkVEXFx1QUJGMC1cXHVBQkY5XFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRC1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTAwLVxcdUZFMEZcXHVGRTIwLVxcdUZFMkZcXHVGRTMzXFx1RkUzNFxcdUZFNEQtXFx1RkU0RlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMTAtXFx1RkYxOVxcdUZGMjEtXFx1RkYzQVxcdUZGM0ZcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdfFxcdUQ4MDBbXFx1REMwMC1cXHVEQzBCXFx1REMwRC1cXHVEQzI2XFx1REMyOC1cXHVEQzNBXFx1REMzQ1xcdURDM0RcXHVEQzNGLVxcdURDNERcXHVEQzUwLVxcdURDNURcXHVEQzgwLVxcdURDRkFcXHVERDQwLVxcdURENzRcXHVEREZEXFx1REU4MC1cXHVERTlDXFx1REVBMC1cXHVERUQwXFx1REVFMFxcdURGMDAtXFx1REYxRlxcdURGMzAtXFx1REY0QVxcdURGNTAtXFx1REY3QVxcdURGODAtXFx1REY5RFxcdURGQTAtXFx1REZDM1xcdURGQzgtXFx1REZDRlxcdURGRDEtXFx1REZENV18XFx1RDgwMVtcXHVEQzAwLVxcdURDOURcXHVEQ0EwLVxcdURDQTlcXHVERDAwLVxcdUREMjdcXHVERDMwLVxcdURENjNcXHVERTAwLVxcdURGMzZcXHVERjQwLVxcdURGNTVcXHVERjYwLVxcdURGNjddfFxcdUQ4MDJbXFx1REMwMC1cXHVEQzA1XFx1REMwOFxcdURDMEEtXFx1REMzNVxcdURDMzdcXHVEQzM4XFx1REMzQ1xcdURDM0YtXFx1REM1NVxcdURDNjAtXFx1REM3NlxcdURDODAtXFx1REM5RVxcdURDRTAtXFx1RENGMlxcdURDRjRcXHVEQ0Y1XFx1REQwMC1cXHVERDE1XFx1REQyMC1cXHVERDM5XFx1REQ4MC1cXHVEREI3XFx1RERCRVxcdUREQkZcXHVERTAwLVxcdURFMDNcXHVERTA1XFx1REUwNlxcdURFMEMtXFx1REUxM1xcdURFMTUtXFx1REUxN1xcdURFMTktXFx1REUzM1xcdURFMzgtXFx1REUzQVxcdURFM0ZcXHVERTYwLVxcdURFN0NcXHVERTgwLVxcdURFOUNcXHVERUMwLVxcdURFQzdcXHVERUM5LVxcdURFRTZcXHVERjAwLVxcdURGMzVcXHVERjQwLVxcdURGNTVcXHVERjYwLVxcdURGNzJcXHVERjgwLVxcdURGOTFdfFxcdUQ4MDNbXFx1REMwMC1cXHVEQzQ4XFx1REM4MC1cXHVEQ0IyXFx1RENDMC1cXHVEQ0YyXXxcXHVEODA0W1xcdURDMDAtXFx1REM0NlxcdURDNjYtXFx1REM2RlxcdURDN0YtXFx1RENCQVxcdURDRDAtXFx1RENFOFxcdURDRjAtXFx1RENGOVxcdUREMDAtXFx1REQzNFxcdUREMzYtXFx1REQzRlxcdURENTAtXFx1REQ3M1xcdURENzZcXHVERDgwLVxcdUREQzRcXHVERENBLVxcdUREQ0NcXHVEREQwLVxcdUREREFcXHVERERDXFx1REUwMC1cXHVERTExXFx1REUxMy1cXHVERTM3XFx1REU4MC1cXHVERTg2XFx1REU4OFxcdURFOEEtXFx1REU4RFxcdURFOEYtXFx1REU5RFxcdURFOUYtXFx1REVBOFxcdURFQjAtXFx1REVFQVxcdURFRjAtXFx1REVGOVxcdURGMDAtXFx1REYwM1xcdURGMDUtXFx1REYwQ1xcdURGMEZcXHVERjEwXFx1REYxMy1cXHVERjI4XFx1REYyQS1cXHVERjMwXFx1REYzMlxcdURGMzNcXHVERjM1LVxcdURGMzlcXHVERjNDLVxcdURGNDRcXHVERjQ3XFx1REY0OFxcdURGNEItXFx1REY0RFxcdURGNTBcXHVERjU3XFx1REY1RC1cXHVERjYzXFx1REY2Ni1cXHVERjZDXFx1REY3MC1cXHVERjc0XXxcXHVEODA1W1xcdURDODAtXFx1RENDNVxcdURDQzdcXHVEQ0QwLVxcdURDRDlcXHVERDgwLVxcdUREQjVcXHVEREI4LVxcdUREQzBcXHVEREQ4LVxcdURERERcXHVERTAwLVxcdURFNDBcXHVERTQ0XFx1REU1MC1cXHVERTU5XFx1REU4MC1cXHVERUI3XFx1REVDMC1cXHVERUM5XFx1REYwMC1cXHVERjE5XFx1REYxRC1cXHVERjJCXFx1REYzMC1cXHVERjM5XXxcXHVEODA2W1xcdURDQTAtXFx1RENFOVxcdURDRkZcXHVERUMwLVxcdURFRjhdfFxcdUQ4MDhbXFx1REMwMC1cXHVERjk5XXxcXHVEODA5W1xcdURDMDAtXFx1REM2RVxcdURDODAtXFx1REQ0M118W1xcdUQ4MENcXHVEODQwLVxcdUQ4NjhcXHVEODZBLVxcdUQ4NkNcXHVEODZGLVxcdUQ4NzJdW1xcdURDMDAtXFx1REZGRl18XFx1RDgwRFtcXHVEQzAwLVxcdURDMkVdfFxcdUQ4MTFbXFx1REMwMC1cXHVERTQ2XXxcXHVEODFBW1xcdURDMDAtXFx1REUzOFxcdURFNDAtXFx1REU1RVxcdURFNjAtXFx1REU2OVxcdURFRDAtXFx1REVFRFxcdURFRjAtXFx1REVGNFxcdURGMDAtXFx1REYzNlxcdURGNDAtXFx1REY0M1xcdURGNTAtXFx1REY1OVxcdURGNjMtXFx1REY3N1xcdURGN0QtXFx1REY4Rl18XFx1RDgxQltcXHVERjAwLVxcdURGNDRcXHVERjUwLVxcdURGN0VcXHVERjhGLVxcdURGOUZdfFxcdUQ4MkNbXFx1REMwMFxcdURDMDFdfFxcdUQ4MkZbXFx1REMwMC1cXHVEQzZBXFx1REM3MC1cXHVEQzdDXFx1REM4MC1cXHVEQzg4XFx1REM5MC1cXHVEQzk5XFx1REM5RFxcdURDOUVdfFxcdUQ4MzRbXFx1REQ2NS1cXHVERDY5XFx1REQ2RC1cXHVERDcyXFx1REQ3Qi1cXHVERDgyXFx1REQ4NS1cXHVERDhCXFx1RERBQS1cXHVEREFEXFx1REU0Mi1cXHVERTQ0XXxcXHVEODM1W1xcdURDMDAtXFx1REM1NFxcdURDNTYtXFx1REM5Q1xcdURDOUVcXHVEQzlGXFx1RENBMlxcdURDQTVcXHVEQ0E2XFx1RENBOS1cXHVEQ0FDXFx1RENBRS1cXHVEQ0I5XFx1RENCQlxcdURDQkQtXFx1RENDM1xcdURDQzUtXFx1REQwNVxcdUREMDctXFx1REQwQVxcdUREMEQtXFx1REQxNFxcdUREMTYtXFx1REQxQ1xcdUREMUUtXFx1REQzOVxcdUREM0ItXFx1REQzRVxcdURENDAtXFx1REQ0NFxcdURENDZcXHVERDRBLVxcdURENTBcXHVERDUyLVxcdURFQTVcXHVERUE4LVxcdURFQzBcXHVERUMyLVxcdURFREFcXHVERURDLVxcdURFRkFcXHVERUZDLVxcdURGMTRcXHVERjE2LVxcdURGMzRcXHVERjM2LVxcdURGNEVcXHVERjUwLVxcdURGNkVcXHVERjcwLVxcdURGODhcXHVERjhBLVxcdURGQThcXHVERkFBLVxcdURGQzJcXHVERkM0LVxcdURGQ0JcXHVERkNFLVxcdURGRkZdfFxcdUQ4MzZbXFx1REUwMC1cXHVERTM2XFx1REUzQi1cXHVERTZDXFx1REU3NVxcdURFODRcXHVERTlCLVxcdURFOUZcXHVERUExLVxcdURFQUZdfFxcdUQ4M0FbXFx1REMwMC1cXHVEQ0M0XFx1RENEMC1cXHVEQ0Q2XXxcXHVEODNCW1xcdURFMDAtXFx1REUwM1xcdURFMDUtXFx1REUxRlxcdURFMjFcXHVERTIyXFx1REUyNFxcdURFMjdcXHVERTI5LVxcdURFMzJcXHVERTM0LVxcdURFMzdcXHVERTM5XFx1REUzQlxcdURFNDJcXHVERTQ3XFx1REU0OVxcdURFNEJcXHVERTRELVxcdURFNEZcXHVERTUxXFx1REU1MlxcdURFNTRcXHVERTU3XFx1REU1OVxcdURFNUJcXHVERTVEXFx1REU1RlxcdURFNjFcXHVERTYyXFx1REU2NFxcdURFNjctXFx1REU2QVxcdURFNkMtXFx1REU3MlxcdURFNzQtXFx1REU3N1xcdURFNzktXFx1REU3Q1xcdURFN0VcXHVERTgwLVxcdURFODlcXHVERThCLVxcdURFOUJcXHVERUExLVxcdURFQTNcXHVERUE1LVxcdURFQTlcXHVERUFCLVxcdURFQkJdfFxcdUQ4NjlbXFx1REMwMC1cXHVERUQ2XFx1REYwMC1cXHVERkZGXXxcXHVEODZEW1xcdURDMDAtXFx1REYzNFxcdURGNDAtXFx1REZGRl18XFx1RDg2RVtcXHVEQzAwLVxcdURDMURcXHVEQzIwLVxcdURGRkZdfFxcdUQ4NzNbXFx1REMwMC1cXHVERUExXXxcXHVEODdFW1xcdURDMDAtXFx1REUxRF18XFx1REI0MFtcXHVERDAwLVxcdURERUZdL1xuXHR9O1xuXHRleHBvcnRzLkNoYXJhY3RlciA9IHtcblx0ICAgIC8qIHRzbGludDpkaXNhYmxlOm5vLWJpdHdpc2UgKi9cblx0ICAgIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIChjcCkge1xuXHQgICAgICAgIHJldHVybiAoY3AgPCAweDEwMDAwKSA/IFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApIDpcblx0ICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSgweEQ4MDAgKyAoKGNwIC0gMHgxMDAwMCkgPj4gMTApKSArXG5cdCAgICAgICAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4REMwMCArICgoY3AgLSAweDEwMDAwKSAmIDEwMjMpKTtcblx0ICAgIH0sXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy13aGl0ZS1zcGFjZVxuXHQgICAgaXNXaGl0ZVNwYWNlOiBmdW5jdGlvbiAoY3ApIHtcblx0ICAgICAgICByZXR1cm4gKGNwID09PSAweDIwKSB8fCAoY3AgPT09IDB4MDkpIHx8IChjcCA9PT0gMHgwQikgfHwgKGNwID09PSAweDBDKSB8fCAoY3AgPT09IDB4QTApIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDE2ODAgJiYgWzB4MTY4MCwgMHgyMDAwLCAweDIwMDEsIDB4MjAwMiwgMHgyMDAzLCAweDIwMDQsIDB4MjAwNSwgMHgyMDA2LCAweDIwMDcsIDB4MjAwOCwgMHgyMDA5LCAweDIwMEEsIDB4MjAyRiwgMHgyMDVGLCAweDMwMDAsIDB4RkVGRl0uaW5kZXhPZihjcCkgPj0gMCk7XG5cdCAgICB9LFxuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbGluZS10ZXJtaW5hdG9yc1xuXHQgICAgaXNMaW5lVGVybWluYXRvcjogZnVuY3Rpb24gKGNwKSB7XG5cdCAgICAgICAgcmV0dXJuIChjcCA9PT0gMHgwQSkgfHwgKGNwID09PSAweDBEKSB8fCAoY3AgPT09IDB4MjAyOCkgfHwgKGNwID09PSAweDIwMjkpO1xuXHQgICAgfSxcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW5hbWVzLWFuZC1rZXl3b3Jkc1xuXHQgICAgaXNJZGVudGlmaWVyU3RhcnQ6IGZ1bmN0aW9uIChjcCkge1xuXHQgICAgICAgIHJldHVybiAoY3AgPT09IDB4MjQpIHx8IChjcCA9PT0gMHg1RikgfHxcblx0ICAgICAgICAgICAgKGNwID49IDB4NDEgJiYgY3AgPD0gMHg1QSkgfHxcblx0ICAgICAgICAgICAgKGNwID49IDB4NjEgJiYgY3AgPD0gMHg3QSkgfHxcblx0ICAgICAgICAgICAgKGNwID09PSAweDVDKSB8fFxuXHQgICAgICAgICAgICAoKGNwID49IDB4ODApICYmIFJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclN0YXJ0LnRlc3QoZXhwb3J0cy5DaGFyYWN0ZXIuZnJvbUNvZGVQb2ludChjcCkpKTtcblx0ICAgIH0sXG5cdCAgICBpc0lkZW50aWZpZXJQYXJ0OiBmdW5jdGlvbiAoY3ApIHtcblx0ICAgICAgICByZXR1cm4gKGNwID09PSAweDI0KSB8fCAoY3AgPT09IDB4NUYpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDQxICYmIGNwIDw9IDB4NUEpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDYxICYmIGNwIDw9IDB4N0EpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDMwICYmIGNwIDw9IDB4MzkpIHx8XG5cdCAgICAgICAgICAgIChjcCA9PT0gMHg1QykgfHxcblx0ICAgICAgICAgICAgKChjcCA+PSAweDgwKSAmJiBSZWdleC5Ob25Bc2NpaUlkZW50aWZpZXJQYXJ0LnRlc3QoZXhwb3J0cy5DaGFyYWN0ZXIuZnJvbUNvZGVQb2ludChjcCkpKTtcblx0ICAgIH0sXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1saXRlcmFscy1udW1lcmljLWxpdGVyYWxzXG5cdCAgICBpc0RlY2ltYWxEaWdpdDogZnVuY3Rpb24gKGNwKSB7XG5cdCAgICAgICAgcmV0dXJuIChjcCA+PSAweDMwICYmIGNwIDw9IDB4MzkpOyAvLyAwLi45XG5cdCAgICB9LFxuXHQgICAgaXNIZXhEaWdpdDogZnVuY3Rpb24gKGNwKSB7XG5cdCAgICAgICAgcmV0dXJuIChjcCA+PSAweDMwICYmIGNwIDw9IDB4MzkpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDQxICYmIGNwIDw9IDB4NDYpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDYxICYmIGNwIDw9IDB4NjYpOyAvLyBhLi5mXG5cdCAgICB9LFxuXHQgICAgaXNPY3RhbERpZ2l0OiBmdW5jdGlvbiAoY3ApIHtcblx0ICAgICAgICByZXR1cm4gKGNwID49IDB4MzAgJiYgY3AgPD0gMHgzNyk7IC8vIDAuLjdcblx0ICAgIH1cblx0fTtcblxuXG4vKioqLyB9LFxuLyogNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIGpzeF9zeW50YXhfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cdC8qIHRzbGludDpkaXNhYmxlOm1heC1jbGFzc2VzLXBlci1maWxlICovXG5cdHZhciBKU1hDbG9zaW5nRWxlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hDbG9zaW5nRWxlbWVudChuYW1lKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hDbG9zaW5nRWxlbWVudDtcblx0ICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEpTWENsb3NpbmdFbGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWENsb3NpbmdFbGVtZW50ID0gSlNYQ2xvc2luZ0VsZW1lbnQ7XG5cdHZhciBKU1hFbGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEpTWEVsZW1lbnQob3BlbmluZ0VsZW1lbnQsIGNoaWxkcmVuLCBjbG9zaW5nRWxlbWVudCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYRWxlbWVudDtcblx0ICAgICAgICB0aGlzLm9wZW5pbmdFbGVtZW50ID0gb3BlbmluZ0VsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXHQgICAgICAgIHRoaXMuY2xvc2luZ0VsZW1lbnQgPSBjbG9zaW5nRWxlbWVudDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hFbGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWEVsZW1lbnQgPSBKU1hFbGVtZW50O1xuXHR2YXIgSlNYRW1wdHlFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEpTWEVtcHR5RXhwcmVzc2lvbigpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWEVtcHR5RXhwcmVzc2lvbjtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hFbXB0eUV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuSlNYRW1wdHlFeHByZXNzaW9uID0gSlNYRW1wdHlFeHByZXNzaW9uO1xuXHR2YXIgSlNYRXhwcmVzc2lvbkNvbnRhaW5lciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hFeHByZXNzaW9uQ29udGFpbmVyKGV4cHJlc3Npb24pIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWEV4cHJlc3Npb25Db250YWluZXI7XG5cdCAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hFeHByZXNzaW9uQ29udGFpbmVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWEV4cHJlc3Npb25Db250YWluZXIgPSBKU1hFeHByZXNzaW9uQ29udGFpbmVyO1xuXHR2YXIgSlNYSWRlbnRpZmllciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hJZGVudGlmaWVyKG5hbWUpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWElkZW50aWZpZXI7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hJZGVudGlmaWVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWElkZW50aWZpZXIgPSBKU1hJZGVudGlmaWVyO1xuXHR2YXIgSlNYTWVtYmVyRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hNZW1iZXJFeHByZXNzaW9uKG9iamVjdCwgcHJvcGVydHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWE1lbWJlckV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cdCAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEpTWE1lbWJlckV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuSlNYTWVtYmVyRXhwcmVzc2lvbiA9IEpTWE1lbWJlckV4cHJlc3Npb247XG5cdHZhciBKU1hBdHRyaWJ1dGUgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYQXR0cmlidXRlKG5hbWUsIHZhbHVlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hBdHRyaWJ1dGU7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYQXR0cmlidXRlO1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWEF0dHJpYnV0ZSA9IEpTWEF0dHJpYnV0ZTtcblx0dmFyIEpTWE5hbWVzcGFjZWROYW1lID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEpTWE5hbWVzcGFjZWROYW1lKG5hbWVzcGFjZSwgbmFtZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYTmFtZXNwYWNlZE5hbWU7XG5cdCAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hOYW1lc3BhY2VkTmFtZTtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hOYW1lc3BhY2VkTmFtZSA9IEpTWE5hbWVzcGFjZWROYW1lO1xuXHR2YXIgSlNYT3BlbmluZ0VsZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYT3BlbmluZ0VsZW1lbnQobmFtZSwgc2VsZkNsb3NpbmcsIGF0dHJpYnV0ZXMpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWE9wZW5pbmdFbGVtZW50O1xuXHQgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG5cdCAgICAgICAgdGhpcy5zZWxmQ2xvc2luZyA9IHNlbGZDbG9zaW5nO1xuXHQgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYT3BlbmluZ0VsZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuSlNYT3BlbmluZ0VsZW1lbnQgPSBKU1hPcGVuaW5nRWxlbWVudDtcblx0dmFyIEpTWFNwcmVhZEF0dHJpYnV0ZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hTcHJlYWRBdHRyaWJ1dGUoYXJndW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWFNwcmVhZEF0dHJpYnV0ZTtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYU3ByZWFkQXR0cmlidXRlO1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWFNwcmVhZEF0dHJpYnV0ZSA9IEpTWFNwcmVhZEF0dHJpYnV0ZTtcblx0dmFyIEpTWFRleHQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYVGV4dCh2YWx1ZSwgcmF3KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hUZXh0O1xuXHQgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICB0aGlzLnJhdyA9IHJhdztcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hUZXh0O1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWFRleHQgPSBKU1hUZXh0O1xuXG5cbi8qKiovIH0sXG4vKiA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHRleHBvcnRzLkpTWFN5bnRheCA9IHtcblx0ICAgIEpTWEF0dHJpYnV0ZTogJ0pTWEF0dHJpYnV0ZScsXG5cdCAgICBKU1hDbG9zaW5nRWxlbWVudDogJ0pTWENsb3NpbmdFbGVtZW50Jyxcblx0ICAgIEpTWEVsZW1lbnQ6ICdKU1hFbGVtZW50Jyxcblx0ICAgIEpTWEVtcHR5RXhwcmVzc2lvbjogJ0pTWEVtcHR5RXhwcmVzc2lvbicsXG5cdCAgICBKU1hFeHByZXNzaW9uQ29udGFpbmVyOiAnSlNYRXhwcmVzc2lvbkNvbnRhaW5lcicsXG5cdCAgICBKU1hJZGVudGlmaWVyOiAnSlNYSWRlbnRpZmllcicsXG5cdCAgICBKU1hNZW1iZXJFeHByZXNzaW9uOiAnSlNYTWVtYmVyRXhwcmVzc2lvbicsXG5cdCAgICBKU1hOYW1lc3BhY2VkTmFtZTogJ0pTWE5hbWVzcGFjZWROYW1lJyxcblx0ICAgIEpTWE9wZW5pbmdFbGVtZW50OiAnSlNYT3BlbmluZ0VsZW1lbnQnLFxuXHQgICAgSlNYU3ByZWFkQXR0cmlidXRlOiAnSlNYU3ByZWFkQXR0cmlidXRlJyxcblx0ICAgIEpTWFRleHQ6ICdKU1hUZXh0J1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiA3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHR2YXIgc3ludGF4XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHQvKiB0c2xpbnQ6ZGlzYWJsZTptYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuXHR2YXIgQXJyYXlFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFycmF5RXhwcmVzc2lvbihlbGVtZW50cykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5BcnJheUV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFycmF5RXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5BcnJheUV4cHJlc3Npb24gPSBBcnJheUV4cHJlc3Npb247XG5cdHZhciBBcnJheVBhdHRlcm4gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQXJyYXlQYXR0ZXJuKGVsZW1lbnRzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkFycmF5UGF0dGVybjtcblx0ICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQXJyYXlQYXR0ZXJuO1xuXHR9KCkpO1xuXHRleHBvcnRzLkFycmF5UGF0dGVybiA9IEFycmF5UGF0dGVybjtcblx0dmFyIEFycm93RnVuY3Rpb25FeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFycm93RnVuY3Rpb25FeHByZXNzaW9uKHBhcmFtcywgYm9keSwgZXhwcmVzc2lvbikge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmlkID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMuZ2VuZXJhdG9yID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmFzeW5jID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQXJyb3dGdW5jdGlvbkV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gPSBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjtcblx0dmFyIEFzc2lnbm1lbnRFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFzc2lnbm1lbnRFeHByZXNzaW9uKG9wZXJhdG9yLCBsZWZ0LCByaWdodCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Bc3NpZ25tZW50RXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG5cdCAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcblx0ICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQXNzaWdubWVudEV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQXNzaWdubWVudEV4cHJlc3Npb24gPSBBc3NpZ25tZW50RXhwcmVzc2lvbjtcblx0dmFyIEFzc2lnbm1lbnRQYXR0ZXJuID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFzc2lnbm1lbnRQYXR0ZXJuKGxlZnQsIHJpZ2h0KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRQYXR0ZXJuO1xuXHQgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7XG5cdCAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFzc2lnbm1lbnRQYXR0ZXJuO1xuXHR9KCkpO1xuXHRleHBvcnRzLkFzc2lnbm1lbnRQYXR0ZXJuID0gQXNzaWdubWVudFBhdHRlcm47XG5cdHZhciBBc3luY0Fycm93RnVuY3Rpb25FeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFzeW5jQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ocGFyYW1zLCBib2R5LCBleHByZXNzaW9uKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkFycm93RnVuY3Rpb25FeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuaWQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuYXN5bmMgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFzeW5jQXJyb3dGdW5jdGlvbkV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQXN5bmNBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiA9IEFzeW5jQXJyb3dGdW5jdGlvbkV4cHJlc3Npb247XG5cdHZhciBBc3luY0Z1bmN0aW9uRGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uKGlkLCBwYXJhbXMsIGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRnVuY3Rpb25EZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuYXN5bmMgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5Bc3luY0Z1bmN0aW9uRGVjbGFyYXRpb24gPSBBc3luY0Z1bmN0aW9uRGVjbGFyYXRpb247XG5cdHZhciBBc3luY0Z1bmN0aW9uRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBBc3luY0Z1bmN0aW9uRXhwcmVzc2lvbihpZCwgcGFyYW1zLCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkZ1bmN0aW9uRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuYXN5bmMgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFzeW5jRnVuY3Rpb25FeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkFzeW5jRnVuY3Rpb25FeHByZXNzaW9uID0gQXN5bmNGdW5jdGlvbkV4cHJlc3Npb247XG5cdHZhciBBd2FpdEV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQXdhaXRFeHByZXNzaW9uKGFyZ3VtZW50KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkF3YWl0RXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQXdhaXRFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkF3YWl0RXhwcmVzc2lvbiA9IEF3YWl0RXhwcmVzc2lvbjtcblx0dmFyIEJpbmFyeUV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQmluYXJ5RXhwcmVzc2lvbihvcGVyYXRvciwgbGVmdCwgcmlnaHQpIHtcblx0ICAgICAgICB2YXIgbG9naWNhbCA9IChvcGVyYXRvciA9PT0gJ3x8JyB8fCBvcGVyYXRvciA9PT0gJyYmJyk7XG5cdCAgICAgICAgdGhpcy50eXBlID0gbG9naWNhbCA/IHN5bnRheF8xLlN5bnRheC5Mb2dpY2FsRXhwcmVzc2lvbiA6IHN5bnRheF8xLlN5bnRheC5CaW5hcnlFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcblx0ICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuXHQgICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBCaW5hcnlFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkJpbmFyeUV4cHJlc3Npb24gPSBCaW5hcnlFeHByZXNzaW9uO1xuXHR2YXIgQmxvY2tTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5CbG9ja1N0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEJsb2NrU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkJsb2NrU3RhdGVtZW50ID0gQmxvY2tTdGF0ZW1lbnQ7XG5cdHZhciBCcmVha1N0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBCcmVha1N0YXRlbWVudChsYWJlbCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5CcmVha1N0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQnJlYWtTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuQnJlYWtTdGF0ZW1lbnQgPSBCcmVha1N0YXRlbWVudDtcblx0dmFyIENhbGxFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENhbGxFeHByZXNzaW9uKGNhbGxlZSwgYXJncykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5DYWxsRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmNhbGxlZSA9IGNhbGxlZTtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3M7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQ2FsbEV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQ2FsbEV4cHJlc3Npb24gPSBDYWxsRXhwcmVzc2lvbjtcblx0dmFyIENhdGNoQ2xhdXNlID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENhdGNoQ2xhdXNlKHBhcmFtLCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkNhdGNoQ2xhdXNlO1xuXHQgICAgICAgIHRoaXMucGFyYW0gPSBwYXJhbTtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIENhdGNoQ2xhdXNlO1xuXHR9KCkpO1xuXHRleHBvcnRzLkNhdGNoQ2xhdXNlID0gQ2F0Y2hDbGF1c2U7XG5cdHZhciBDbGFzc0JvZHkgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQ2xhc3NCb2R5KGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQ2xhc3NCb2R5O1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQ2xhc3NCb2R5O1xuXHR9KCkpO1xuXHRleHBvcnRzLkNsYXNzQm9keSA9IENsYXNzQm9keTtcblx0dmFyIENsYXNzRGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQ2xhc3NEZWNsYXJhdGlvbihpZCwgc3VwZXJDbGFzcywgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5DbGFzc0RlY2xhcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuaWQgPSBpZDtcblx0ICAgICAgICB0aGlzLnN1cGVyQ2xhc3MgPSBzdXBlckNsYXNzO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQ2xhc3NEZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5DbGFzc0RlY2xhcmF0aW9uID0gQ2xhc3NEZWNsYXJhdGlvbjtcblx0dmFyIENsYXNzRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDbGFzc0V4cHJlc3Npb24oaWQsIHN1cGVyQ2xhc3MsIGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQ2xhc3NFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuaWQgPSBpZDtcblx0ICAgICAgICB0aGlzLnN1cGVyQ2xhc3MgPSBzdXBlckNsYXNzO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQ2xhc3NFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkNsYXNzRXhwcmVzc2lvbiA9IENsYXNzRXhwcmVzc2lvbjtcblx0dmFyIENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDb21wdXRlZE1lbWJlckV4cHJlc3Npb24ob2JqZWN0LCBwcm9wZXJ0eSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5NZW1iZXJFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuY29tcHV0ZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXHQgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBDb21wdXRlZE1lbWJlckV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uID0gQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uO1xuXHR2YXIgQ29uZGl0aW9uYWxFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENvbmRpdGlvbmFsRXhwcmVzc2lvbih0ZXN0LCBjb25zZXF1ZW50LCBhbHRlcm5hdGUpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQ29uZGl0aW9uYWxFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7XG5cdCAgICAgICAgdGhpcy5jb25zZXF1ZW50ID0gY29uc2VxdWVudDtcblx0ICAgICAgICB0aGlzLmFsdGVybmF0ZSA9IGFsdGVybmF0ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBDb25kaXRpb25hbEV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQ29uZGl0aW9uYWxFeHByZXNzaW9uID0gQ29uZGl0aW9uYWxFeHByZXNzaW9uO1xuXHR2YXIgQ29udGludWVTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQ29udGludWVTdGF0ZW1lbnQobGFiZWwpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQ29udGludWVTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIENvbnRpbnVlU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkNvbnRpbnVlU3RhdGVtZW50ID0gQ29udGludWVTdGF0ZW1lbnQ7XG5cdHZhciBEZWJ1Z2dlclN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBEZWJ1Z2dlclN0YXRlbWVudCgpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRGVidWdnZXJTdGF0ZW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRGVidWdnZXJTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRGVidWdnZXJTdGF0ZW1lbnQgPSBEZWJ1Z2dlclN0YXRlbWVudDtcblx0dmFyIERpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBEaXJlY3RpdmUoZXhwcmVzc2lvbiwgZGlyZWN0aXZlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkV4cHJlc3Npb25TdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmRpcmVjdGl2ZSA9IGRpcmVjdGl2ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBEaXJlY3RpdmU7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRGlyZWN0aXZlID0gRGlyZWN0aXZlO1xuXHR2YXIgRG9XaGlsZVN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBEb1doaWxlU3RhdGVtZW50KGJvZHksIHRlc3QpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRG9XaGlsZVN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRG9XaGlsZVN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5Eb1doaWxlU3RhdGVtZW50ID0gRG9XaGlsZVN0YXRlbWVudDtcblx0dmFyIEVtcHR5U3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEVtcHR5U3RhdGVtZW50KCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FbXB0eVN0YXRlbWVudDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBFbXB0eVN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5FbXB0eVN0YXRlbWVudCA9IEVtcHR5U3RhdGVtZW50O1xuXHR2YXIgRXhwb3J0QWxsRGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRXhwb3J0QWxsRGVjbGFyYXRpb24oc291cmNlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkV4cG9ydEFsbERlY2xhcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEV4cG9ydEFsbERlY2xhcmF0aW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkV4cG9ydEFsbERlY2xhcmF0aW9uID0gRXhwb3J0QWxsRGVjbGFyYXRpb247XG5cdHZhciBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiA9IEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjtcblx0dmFyIEV4cG9ydE5hbWVkRGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRXhwb3J0TmFtZWREZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgc3BlY2lmaWVycywgc291cmNlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkV4cG9ydE5hbWVkRGVjbGFyYXRpb247XG5cdCAgICAgICAgdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuc3BlY2lmaWVycyA9IHNwZWNpZmllcnM7XG5cdCAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRXhwb3J0TmFtZWREZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5FeHBvcnROYW1lZERlY2xhcmF0aW9uID0gRXhwb3J0TmFtZWREZWNsYXJhdGlvbjtcblx0dmFyIEV4cG9ydFNwZWNpZmllciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBFeHBvcnRTcGVjaWZpZXIobG9jYWwsIGV4cG9ydGVkKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkV4cG9ydFNwZWNpZmllcjtcblx0ICAgICAgICB0aGlzLmV4cG9ydGVkID0gZXhwb3J0ZWQ7XG5cdCAgICAgICAgdGhpcy5sb2NhbCA9IGxvY2FsO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEV4cG9ydFNwZWNpZmllcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5FeHBvcnRTcGVjaWZpZXIgPSBFeHBvcnRTcGVjaWZpZXI7XG5cdHZhciBFeHByZXNzaW9uU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEV4cHJlc3Npb25TdGF0ZW1lbnQoZXhwcmVzc2lvbikge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FeHByZXNzaW9uU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRXhwcmVzc2lvblN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5FeHByZXNzaW9uU3RhdGVtZW50ID0gRXhwcmVzc2lvblN0YXRlbWVudDtcblx0dmFyIEZvckluU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEZvckluU3RhdGVtZW50KGxlZnQsIHJpZ2h0LCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkZvckluU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7XG5cdCAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICAgICAgdGhpcy5lYWNoID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRm9ySW5TdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRm9ySW5TdGF0ZW1lbnQgPSBGb3JJblN0YXRlbWVudDtcblx0dmFyIEZvck9mU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEZvck9mU3RhdGVtZW50KGxlZnQsIHJpZ2h0LCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkZvck9mU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7XG5cdCAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRm9yT2ZTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRm9yT2ZTdGF0ZW1lbnQgPSBGb3JPZlN0YXRlbWVudDtcblx0dmFyIEZvclN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBGb3JTdGF0ZW1lbnQoaW5pdCwgdGVzdCwgdXBkYXRlLCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkZvclN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmluaXQgPSBpbml0O1xuXHQgICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7XG5cdCAgICAgICAgdGhpcy51cGRhdGUgPSB1cGRhdGU7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBGb3JTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRm9yU3RhdGVtZW50ID0gRm9yU3RhdGVtZW50O1xuXHR2YXIgRnVuY3Rpb25EZWNsYXJhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBGdW5jdGlvbkRlY2xhcmF0aW9uKGlkLCBwYXJhbXMsIGJvZHksIGdlbmVyYXRvcikge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5GdW5jdGlvbkRlY2xhcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuaWQgPSBpZDtcblx0ICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuYXN5bmMgPSBmYWxzZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBGdW5jdGlvbkRlY2xhcmF0aW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkZ1bmN0aW9uRGVjbGFyYXRpb24gPSBGdW5jdGlvbkRlY2xhcmF0aW9uO1xuXHR2YXIgRnVuY3Rpb25FeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEZ1bmN0aW9uRXhwcmVzc2lvbihpZCwgcGFyYW1zLCBib2R5LCBnZW5lcmF0b3IpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRnVuY3Rpb25FeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuaWQgPSBpZDtcblx0ICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuYXN5bmMgPSBmYWxzZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBGdW5jdGlvbkV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuRnVuY3Rpb25FeHByZXNzaW9uID0gRnVuY3Rpb25FeHByZXNzaW9uO1xuXHR2YXIgSWRlbnRpZmllciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBJZGVudGlmaWVyKG5hbWUpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcjtcblx0ICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIElkZW50aWZpZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuSWRlbnRpZmllciA9IElkZW50aWZpZXI7XG5cdHZhciBJZlN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBJZlN0YXRlbWVudCh0ZXN0LCBjb25zZXF1ZW50LCBhbHRlcm5hdGUpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguSWZTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy50ZXN0ID0gdGVzdDtcblx0ICAgICAgICB0aGlzLmNvbnNlcXVlbnQgPSBjb25zZXF1ZW50O1xuXHQgICAgICAgIHRoaXMuYWx0ZXJuYXRlID0gYWx0ZXJuYXRlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIElmU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLklmU3RhdGVtZW50ID0gSWZTdGF0ZW1lbnQ7XG5cdHZhciBJbXBvcnREZWNsYXJhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBJbXBvcnREZWNsYXJhdGlvbihzcGVjaWZpZXJzLCBzb3VyY2UpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguSW1wb3J0RGVjbGFyYXRpb247XG5cdCAgICAgICAgdGhpcy5zcGVjaWZpZXJzID0gc3BlY2lmaWVycztcblx0ICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBJbXBvcnREZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5JbXBvcnREZWNsYXJhdGlvbiA9IEltcG9ydERlY2xhcmF0aW9uO1xuXHR2YXIgSW1wb3J0RGVmYXVsdFNwZWNpZmllciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBJbXBvcnREZWZhdWx0U3BlY2lmaWVyKGxvY2FsKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkltcG9ydERlZmF1bHRTcGVjaWZpZXI7XG5cdCAgICAgICAgdGhpcy5sb2NhbCA9IGxvY2FsO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEltcG9ydERlZmF1bHRTcGVjaWZpZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuSW1wb3J0RGVmYXVsdFNwZWNpZmllciA9IEltcG9ydERlZmF1bHRTcGVjaWZpZXI7XG5cdHZhciBJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKGxvY2FsKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjtcblx0ICAgICAgICB0aGlzLmxvY2FsID0gbG9jYWw7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLkltcG9ydE5hbWVzcGFjZVNwZWNpZmllciA9IEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjtcblx0dmFyIEltcG9ydFNwZWNpZmllciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBJbXBvcnRTcGVjaWZpZXIobG9jYWwsIGltcG9ydGVkKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkltcG9ydFNwZWNpZmllcjtcblx0ICAgICAgICB0aGlzLmxvY2FsID0gbG9jYWw7XG5cdCAgICAgICAgdGhpcy5pbXBvcnRlZCA9IGltcG9ydGVkO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEltcG9ydFNwZWNpZmllcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5JbXBvcnRTcGVjaWZpZXIgPSBJbXBvcnRTcGVjaWZpZXI7XG5cdHZhciBMYWJlbGVkU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIExhYmVsZWRTdGF0ZW1lbnQobGFiZWwsIGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguTGFiZWxlZFN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBMYWJlbGVkU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkxhYmVsZWRTdGF0ZW1lbnQgPSBMYWJlbGVkU3RhdGVtZW50O1xuXHR2YXIgTGl0ZXJhbCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBMaXRlcmFsKHZhbHVlLCByYXcpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguTGl0ZXJhbDtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgICAgdGhpcy5yYXcgPSByYXc7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gTGl0ZXJhbDtcblx0fSgpKTtcblx0ZXhwb3J0cy5MaXRlcmFsID0gTGl0ZXJhbDtcblx0dmFyIE1ldGFQcm9wZXJ0eSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBNZXRhUHJvcGVydHkobWV0YSwgcHJvcGVydHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguTWV0YVByb3BlcnR5O1xuXHQgICAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG5cdCAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIE1ldGFQcm9wZXJ0eTtcblx0fSgpKTtcblx0ZXhwb3J0cy5NZXRhUHJvcGVydHkgPSBNZXRhUHJvcGVydHk7XG5cdHZhciBNZXRob2REZWZpbml0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIE1ldGhvZERlZmluaXRpb24oa2V5LCBjb21wdXRlZCwgdmFsdWUsIGtpbmQsIGlzU3RhdGljKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4Lk1ldGhvZERlZmluaXRpb247XG5cdCAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG5cdCAgICAgICAgdGhpcy5jb21wdXRlZCA9IGNvbXB1dGVkO1xuXHQgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuXHQgICAgICAgIHRoaXMuc3RhdGljID0gaXNTdGF0aWM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gTWV0aG9kRGVmaW5pdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5NZXRob2REZWZpbml0aW9uID0gTWV0aG9kRGVmaW5pdGlvbjtcblx0dmFyIE1vZHVsZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBNb2R1bGUoYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Qcm9ncmFtO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICAgICAgdGhpcy5zb3VyY2VUeXBlID0gJ21vZHVsZSc7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gTW9kdWxlO1xuXHR9KCkpO1xuXHRleHBvcnRzLk1vZHVsZSA9IE1vZHVsZTtcblx0dmFyIE5ld0V4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gTmV3RXhwcmVzc2lvbihjYWxsZWUsIGFyZ3MpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguTmV3RXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmNhbGxlZSA9IGNhbGxlZTtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3M7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gTmV3RXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5OZXdFeHByZXNzaW9uID0gTmV3RXhwcmVzc2lvbjtcblx0dmFyIE9iamVjdEV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gT2JqZWN0RXhwcmVzc2lvbihwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4Lk9iamVjdEV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcblx0ICAgIH1cblx0ICAgIHJldHVybiBPYmplY3RFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLk9iamVjdEV4cHJlc3Npb24gPSBPYmplY3RFeHByZXNzaW9uO1xuXHR2YXIgT2JqZWN0UGF0dGVybiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBPYmplY3RQYXR0ZXJuKHByb3BlcnRpZXMpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguT2JqZWN0UGF0dGVybjtcblx0ICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIE9iamVjdFBhdHRlcm47XG5cdH0oKSk7XG5cdGV4cG9ydHMuT2JqZWN0UGF0dGVybiA9IE9iamVjdFBhdHRlcm47XG5cdHZhciBQcm9wZXJ0eSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBQcm9wZXJ0eShraW5kLCBrZXksIGNvbXB1dGVkLCB2YWx1ZSwgbWV0aG9kLCBzaG9ydGhhbmQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguUHJvcGVydHk7XG5cdCAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG5cdCAgICAgICAgdGhpcy5jb21wdXRlZCA9IGNvbXB1dGVkO1xuXHQgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuXHQgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuXHQgICAgICAgIHRoaXMuc2hvcnRoYW5kID0gc2hvcnRoYW5kO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFByb3BlcnR5O1xuXHR9KCkpO1xuXHRleHBvcnRzLlByb3BlcnR5ID0gUHJvcGVydHk7XG5cdHZhciBSZWdleExpdGVyYWwgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gUmVnZXhMaXRlcmFsKHZhbHVlLCByYXcsIHBhdHRlcm4sIGZsYWdzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkxpdGVyYWw7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgICAgICAgIHRoaXMucmF3ID0gcmF3O1xuXHQgICAgICAgIHRoaXMucmVnZXggPSB7IHBhdHRlcm46IHBhdHRlcm4sIGZsYWdzOiBmbGFncyB9O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFJlZ2V4TGl0ZXJhbDtcblx0fSgpKTtcblx0ZXhwb3J0cy5SZWdleExpdGVyYWwgPSBSZWdleExpdGVyYWw7XG5cdHZhciBSZXN0RWxlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBSZXN0RWxlbWVudChhcmd1bWVudCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5SZXN0RWxlbWVudDtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gUmVzdEVsZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuUmVzdEVsZW1lbnQgPSBSZXN0RWxlbWVudDtcblx0dmFyIFJldHVyblN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBSZXR1cm5TdGF0ZW1lbnQoYXJndW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguUmV0dXJuU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMuYXJndW1lbnQgPSBhcmd1bWVudDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBSZXR1cm5TdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuUmV0dXJuU3RhdGVtZW50ID0gUmV0dXJuU3RhdGVtZW50O1xuXHR2YXIgU2NyaXB0ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFNjcmlwdChib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlByb2dyYW07XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLnNvdXJjZVR5cGUgPSAnc2NyaXB0Jztcblx0ICAgIH1cblx0ICAgIHJldHVybiBTY3JpcHQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuU2NyaXB0ID0gU2NyaXB0O1xuXHR2YXIgU2VxdWVuY2VFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFNlcXVlbmNlRXhwcmVzc2lvbihleHByZXNzaW9ucykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5TZXF1ZW5jZUV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5leHByZXNzaW9ucyA9IGV4cHJlc3Npb25zO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFNlcXVlbmNlRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5TZXF1ZW5jZUV4cHJlc3Npb24gPSBTZXF1ZW5jZUV4cHJlc3Npb247XG5cdHZhciBTcHJlYWRFbGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFNwcmVhZEVsZW1lbnQoYXJndW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguU3ByZWFkRWxlbWVudDtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gU3ByZWFkRWxlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5TcHJlYWRFbGVtZW50ID0gU3ByZWFkRWxlbWVudDtcblx0dmFyIFN0YXRpY01lbWJlckV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gU3RhdGljTWVtYmVyRXhwcmVzc2lvbihvYmplY3QsIHByb3BlcnR5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4Lk1lbWJlckV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5jb21wdXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXHQgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBTdGF0aWNNZW1iZXJFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLlN0YXRpY01lbWJlckV4cHJlc3Npb24gPSBTdGF0aWNNZW1iZXJFeHByZXNzaW9uO1xuXHR2YXIgU3VwZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gU3VwZXIoKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlN1cGVyO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFN1cGVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLlN1cGVyID0gU3VwZXI7XG5cdHZhciBTd2l0Y2hDYXNlID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFN3aXRjaENhc2UodGVzdCwgY29uc2VxdWVudCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Td2l0Y2hDYXNlO1xuXHQgICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7XG5cdCAgICAgICAgdGhpcy5jb25zZXF1ZW50ID0gY29uc2VxdWVudDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBTd2l0Y2hDYXNlO1xuXHR9KCkpO1xuXHRleHBvcnRzLlN3aXRjaENhc2UgPSBTd2l0Y2hDYXNlO1xuXHR2YXIgU3dpdGNoU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFN3aXRjaFN0YXRlbWVudChkaXNjcmltaW5hbnQsIGNhc2VzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlN3aXRjaFN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmRpc2NyaW1pbmFudCA9IGRpc2NyaW1pbmFudDtcblx0ICAgICAgICB0aGlzLmNhc2VzID0gY2FzZXM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gU3dpdGNoU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLlN3aXRjaFN0YXRlbWVudCA9IFN3aXRjaFN0YXRlbWVudDtcblx0dmFyIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24odGFnLCBxdWFzaSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5UYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy50YWcgPSB0YWc7XG5cdCAgICAgICAgdGhpcy5xdWFzaSA9IHF1YXNpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5UYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24gPSBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb247XG5cdHZhciBUZW1wbGF0ZUVsZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVGVtcGxhdGVFbGVtZW50KHZhbHVlLCB0YWlsKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlRlbXBsYXRlRWxlbWVudDtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgICAgdGhpcy50YWlsID0gdGFpbDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBUZW1wbGF0ZUVsZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuVGVtcGxhdGVFbGVtZW50ID0gVGVtcGxhdGVFbGVtZW50O1xuXHR2YXIgVGVtcGxhdGVMaXRlcmFsID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRlbXBsYXRlTGl0ZXJhbChxdWFzaXMsIGV4cHJlc3Npb25zKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlRlbXBsYXRlTGl0ZXJhbDtcblx0ICAgICAgICB0aGlzLnF1YXNpcyA9IHF1YXNpcztcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gVGVtcGxhdGVMaXRlcmFsO1xuXHR9KCkpO1xuXHRleHBvcnRzLlRlbXBsYXRlTGl0ZXJhbCA9IFRlbXBsYXRlTGl0ZXJhbDtcblx0dmFyIFRoaXNFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRoaXNFeHByZXNzaW9uKCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5UaGlzRXhwcmVzc2lvbjtcblx0ICAgIH1cblx0ICAgIHJldHVybiBUaGlzRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5UaGlzRXhwcmVzc2lvbiA9IFRoaXNFeHByZXNzaW9uO1xuXHR2YXIgVGhyb3dTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVGhyb3dTdGF0ZW1lbnQoYXJndW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVGhyb3dTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFRocm93U3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLlRocm93U3RhdGVtZW50ID0gVGhyb3dTdGF0ZW1lbnQ7XG5cdHZhciBUcnlTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVHJ5U3RhdGVtZW50KGJsb2NrLCBoYW5kbGVyLCBmaW5hbGl6ZXIpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVHJ5U3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMuYmxvY2sgPSBibG9jaztcblx0ICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuXHQgICAgICAgIHRoaXMuZmluYWxpemVyID0gZmluYWxpemVyO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFRyeVN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5UcnlTdGF0ZW1lbnQgPSBUcnlTdGF0ZW1lbnQ7XG5cdHZhciBVbmFyeUV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVW5hcnlFeHByZXNzaW9uKG9wZXJhdG9yLCBhcmd1bWVudCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5VbmFyeUV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuXHQgICAgICAgIHRoaXMuYXJndW1lbnQgPSBhcmd1bWVudDtcblx0ICAgICAgICB0aGlzLnByZWZpeCA9IHRydWU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gVW5hcnlFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLlVuYXJ5RXhwcmVzc2lvbiA9IFVuYXJ5RXhwcmVzc2lvbjtcblx0dmFyIFVwZGF0ZUV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVXBkYXRlRXhwcmVzc2lvbihvcGVyYXRvciwgYXJndW1lbnQsIHByZWZpeCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5VcGRhdGVFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gVXBkYXRlRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5VcGRhdGVFeHByZXNzaW9uID0gVXBkYXRlRXhwcmVzc2lvbjtcblx0dmFyIFZhcmlhYmxlRGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsIGtpbmQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVmFyaWFibGVEZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmRlY2xhcmF0aW9ucyA9IGRlY2xhcmF0aW9ucztcblx0ICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFZhcmlhYmxlRGVjbGFyYXRpb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuVmFyaWFibGVEZWNsYXJhdGlvbiA9IFZhcmlhYmxlRGVjbGFyYXRpb247XG5cdHZhciBWYXJpYWJsZURlY2xhcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVmFyaWFibGVEZWNsYXJhdG9yKGlkLCBpbml0KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRvcjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5pbml0ID0gaW5pdDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBWYXJpYWJsZURlY2xhcmF0b3I7XG5cdH0oKSk7XG5cdGV4cG9ydHMuVmFyaWFibGVEZWNsYXJhdG9yID0gVmFyaWFibGVEZWNsYXJhdG9yO1xuXHR2YXIgV2hpbGVTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gV2hpbGVTdGF0ZW1lbnQodGVzdCwgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5XaGlsZVN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0O1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gV2hpbGVTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuV2hpbGVTdGF0ZW1lbnQgPSBXaGlsZVN0YXRlbWVudDtcblx0dmFyIFdpdGhTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gV2l0aFN0YXRlbWVudChvYmplY3QsIGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguV2l0aFN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFdpdGhTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuV2l0aFN0YXRlbWVudCA9IFdpdGhTdGF0ZW1lbnQ7XG5cdHZhciBZaWVsZEV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gWWllbGRFeHByZXNzaW9uKGFyZ3VtZW50LCBkZWxlZ2F0ZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5ZaWVsZEV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBZaWVsZEV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuWWllbGRFeHByZXNzaW9uID0gWWllbGRFeHByZXNzaW9uO1xuXG5cbi8qKiovIH0sXG4vKiA4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHR2YXIgYXNzZXJ0XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHR2YXIgZXJyb3JfaGFuZGxlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XG5cdHZhciBtZXNzYWdlc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cdHZhciBOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcblx0dmFyIHNjYW5uZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuXHR2YXIgc3ludGF4XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHR2YXIgdG9rZW5fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHR2YXIgQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlciA9ICdBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyJztcblx0dmFyIFBhcnNlciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBQYXJzZXIoY29kZSwgb3B0aW9ucywgZGVsZWdhdGUpIHtcblx0ICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuXHQgICAgICAgIHRoaXMuY29uZmlnID0ge1xuXHQgICAgICAgICAgICByYW5nZTogKHR5cGVvZiBvcHRpb25zLnJhbmdlID09PSAnYm9vbGVhbicpICYmIG9wdGlvbnMucmFuZ2UsXG5cdCAgICAgICAgICAgIGxvYzogKHR5cGVvZiBvcHRpb25zLmxvYyA9PT0gJ2Jvb2xlYW4nKSAmJiBvcHRpb25zLmxvYyxcblx0ICAgICAgICAgICAgc291cmNlOiBudWxsLFxuXHQgICAgICAgICAgICB0b2tlbnM6ICh0eXBlb2Ygb3B0aW9ucy50b2tlbnMgPT09ICdib29sZWFuJykgJiYgb3B0aW9ucy50b2tlbnMsXG5cdCAgICAgICAgICAgIGNvbW1lbnQ6ICh0eXBlb2Ygb3B0aW9ucy5jb21tZW50ID09PSAnYm9vbGVhbicpICYmIG9wdGlvbnMuY29tbWVudCxcblx0ICAgICAgICAgICAgdG9sZXJhbnQ6ICh0eXBlb2Ygb3B0aW9ucy50b2xlcmFudCA9PT0gJ2Jvb2xlYW4nKSAmJiBvcHRpb25zLnRvbGVyYW50XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcubG9jICYmIG9wdGlvbnMuc291cmNlICYmIG9wdGlvbnMuc291cmNlICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMuY29uZmlnLnNvdXJjZSA9IFN0cmluZyhvcHRpb25zLnNvdXJjZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcblx0ICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IG5ldyBlcnJvcl9oYW5kbGVyXzEuRXJyb3JIYW5kbGVyKCk7XG5cdCAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIudG9sZXJhbnQgPSB0aGlzLmNvbmZpZy50b2xlcmFudDtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIgPSBuZXcgc2Nhbm5lcl8xLlNjYW5uZXIoY29kZSwgdGhpcy5lcnJvckhhbmRsZXIpO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci50cmFja0NvbW1lbnQgPSB0aGlzLmNvbmZpZy5jb21tZW50O1xuXHQgICAgICAgIHRoaXMub3BlcmF0b3JQcmVjZWRlbmNlID0ge1xuXHQgICAgICAgICAgICAnKSc6IDAsXG5cdCAgICAgICAgICAgICc7JzogMCxcblx0ICAgICAgICAgICAgJywnOiAwLFxuXHQgICAgICAgICAgICAnPSc6IDAsXG5cdCAgICAgICAgICAgICddJzogMCxcblx0ICAgICAgICAgICAgJ3x8JzogMSxcblx0ICAgICAgICAgICAgJyYmJzogMixcblx0ICAgICAgICAgICAgJ3wnOiAzLFxuXHQgICAgICAgICAgICAnXic6IDQsXG5cdCAgICAgICAgICAgICcmJzogNSxcblx0ICAgICAgICAgICAgJz09JzogNixcblx0ICAgICAgICAgICAgJyE9JzogNixcblx0ICAgICAgICAgICAgJz09PSc6IDYsXG5cdCAgICAgICAgICAgICchPT0nOiA2LFxuXHQgICAgICAgICAgICAnPCc6IDcsXG5cdCAgICAgICAgICAgICc+JzogNyxcblx0ICAgICAgICAgICAgJzw9JzogNyxcblx0ICAgICAgICAgICAgJz49JzogNyxcblx0ICAgICAgICAgICAgJzw8JzogOCxcblx0ICAgICAgICAgICAgJz4+JzogOCxcblx0ICAgICAgICAgICAgJz4+Pic6IDgsXG5cdCAgICAgICAgICAgICcrJzogOSxcblx0ICAgICAgICAgICAgJy0nOiA5LFxuXHQgICAgICAgICAgICAnKic6IDExLFxuXHQgICAgICAgICAgICAnLyc6IDExLFxuXHQgICAgICAgICAgICAnJSc6IDExXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLmxvb2thaGVhZCA9IHtcblx0ICAgICAgICAgICAgdHlwZTogMiAvKiBFT0YgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiAnJyxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogMCxcblx0ICAgICAgICAgICAgc3RhcnQ6IDAsXG5cdCAgICAgICAgICAgIGVuZDogMFxuXHQgICAgICAgIH07XG5cdCAgICAgICAgdGhpcy5oYXNMaW5lVGVybWluYXRvciA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dCA9IHtcblx0ICAgICAgICAgICAgaXNNb2R1bGU6IGZhbHNlLFxuXHQgICAgICAgICAgICBhd2FpdDogZmFsc2UsXG5cdCAgICAgICAgICAgIGFsbG93SW46IHRydWUsXG5cdCAgICAgICAgICAgIGFsbG93U3RyaWN0RGlyZWN0aXZlOiB0cnVlLFxuXHQgICAgICAgICAgICBhbGxvd1lpZWxkOiB0cnVlLFxuXHQgICAgICAgICAgICBmaXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3I6IG51bGwsXG5cdCAgICAgICAgICAgIGlzQXNzaWdubWVudFRhcmdldDogZmFsc2UsXG5cdCAgICAgICAgICAgIGlzQmluZGluZ0VsZW1lbnQ6IGZhbHNlLFxuXHQgICAgICAgICAgICBpbkZ1bmN0aW9uQm9keTogZmFsc2UsXG5cdCAgICAgICAgICAgIGluSXRlcmF0aW9uOiBmYWxzZSxcblx0ICAgICAgICAgICAgaW5Td2l0Y2g6IGZhbHNlLFxuXHQgICAgICAgICAgICBsYWJlbFNldDoge30sXG5cdCAgICAgICAgICAgIHN0cmljdDogZmFsc2Vcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMudG9rZW5zID0gW107XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlciA9IHtcblx0ICAgICAgICAgICAgaW5kZXg6IDAsXG5cdCAgICAgICAgICAgIGxpbmU6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBjb2x1bW46IDBcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlciA9IHtcblx0ICAgICAgICAgICAgaW5kZXg6IDAsXG5cdCAgICAgICAgICAgIGxpbmU6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBjb2x1bW46IDBcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyID0ge1xuXHQgICAgICAgICAgICBpbmRleDogdGhpcy5zY2FubmVyLmluZGV4LFxuXHQgICAgICAgICAgICBsaW5lOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgY29sdW1uOiB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0XG5cdCAgICAgICAgfTtcblx0ICAgIH1cblx0ICAgIFBhcnNlci5wcm90b3R5cGUudGhyb3dFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlRm9ybWF0KSB7XG5cdCAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuXHQgICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG5cdCAgICAgICAgICAgIHZhbHVlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXHQgICAgICAgIHZhciBtc2cgPSBtZXNzYWdlRm9ybWF0LnJlcGxhY2UoLyUoXFxkKS9nLCBmdW5jdGlvbiAod2hvbGUsIGlkeCkge1xuXHQgICAgICAgICAgICBhc3NlcnRfMS5hc3NlcnQoaWR4IDwgYXJncy5sZW5ndGgsICdNZXNzYWdlIHJlZmVyZW5jZSBtdXN0IGJlIGluIHJhbmdlJyk7XG5cdCAgICAgICAgICAgIHJldHVybiBhcmdzW2lkeF07XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5sYXN0TWFya2VyLmluZGV4O1xuXHQgICAgICAgIHZhciBsaW5lID0gdGhpcy5sYXN0TWFya2VyLmxpbmU7XG5cdCAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMubGFzdE1hcmtlci5jb2x1bW4gKyAxO1xuXHQgICAgICAgIHRocm93IHRoaXMuZXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGluZGV4LCBsaW5lLCBjb2x1bW4sIG1zZyk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS50b2xlcmF0ZUVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2VGb3JtYXQpIHtcblx0ICAgICAgICB2YXIgdmFsdWVzID0gW107XG5cdCAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcblx0ICAgICAgICAgICAgdmFsdWVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cdCAgICAgICAgdmFyIG1zZyA9IG1lc3NhZ2VGb3JtYXQucmVwbGFjZSgvJShcXGQpL2csIGZ1bmN0aW9uICh3aG9sZSwgaWR4KSB7XG5cdCAgICAgICAgICAgIGFzc2VydF8xLmFzc2VydChpZHggPCBhcmdzLmxlbmd0aCwgJ01lc3NhZ2UgcmVmZXJlbmNlIG11c3QgYmUgaW4gcmFuZ2UnKTtcblx0ICAgICAgICAgICAgcmV0dXJuIGFyZ3NbaWR4XTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmxhc3RNYXJrZXIuaW5kZXg7XG5cdCAgICAgICAgdmFyIGxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5sYXN0TWFya2VyLmNvbHVtbiArIDE7XG5cdCAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIudG9sZXJhdGVFcnJvcihpbmRleCwgbGluZSwgY29sdW1uLCBtc2cpO1xuXHQgICAgfTtcblx0ICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbiBiZWNhdXNlIG9mIHRoZSB0b2tlbi5cblx0ICAgIFBhcnNlci5wcm90b3R5cGUudW5leHBlY3RlZFRva2VuRXJyb3IgPSBmdW5jdGlvbiAodG9rZW4sIG1lc3NhZ2UpIHtcblx0ICAgICAgICB2YXIgbXNnID0gbWVzc2FnZSB8fCBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbjtcblx0ICAgICAgICB2YXIgdmFsdWU7XG5cdCAgICAgICAgaWYgKHRva2VuKSB7XG5cdCAgICAgICAgICAgIGlmICghbWVzc2FnZSkge1xuXHQgICAgICAgICAgICAgICAgbXNnID0gKHRva2VuLnR5cGUgPT09IDIgLyogRU9GICovKSA/IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZEVPUyA6XG5cdCAgICAgICAgICAgICAgICAgICAgKHRva2VuLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLykgPyBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRJZGVudGlmaWVyIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgKHRva2VuLnR5cGUgPT09IDYgLyogTnVtZXJpY0xpdGVyYWwgKi8pID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkTnVtYmVyIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2tlbi50eXBlID09PSA4IC8qIFN0cmluZ0xpdGVyYWwgKi8pID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkU3RyaW5nIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9rZW4udHlwZSA9PT0gMTAgLyogVGVtcGxhdGUgKi8pID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVGVtcGxhdGUgOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbjtcblx0ICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA0IC8qIEtleXdvcmQgKi8pIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzRnV0dXJlUmVzZXJ2ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRSZXNlcnZlZDtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiB0aGlzLnNjYW5uZXIuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFJlc2VydmVkV29yZDtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdmFsdWUgPSB0b2tlbi52YWx1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhbHVlID0gJ0lMTEVHQUwnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBtc2cgPSBtc2cucmVwbGFjZSgnJTAnLCB2YWx1ZSk7XG5cdCAgICAgICAgaWYgKHRva2VuICYmIHR5cGVvZiB0b2tlbi5saW5lTnVtYmVyID09PSAnbnVtYmVyJykge1xuXHQgICAgICAgICAgICB2YXIgaW5kZXggPSB0b2tlbi5zdGFydDtcblx0ICAgICAgICAgICAgdmFyIGxpbmUgPSB0b2tlbi5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICB2YXIgbGFzdE1hcmtlckxpbmVTdGFydCA9IHRoaXMubGFzdE1hcmtlci5pbmRleCAtIHRoaXMubGFzdE1hcmtlci5jb2x1bW47XG5cdCAgICAgICAgICAgIHZhciBjb2x1bW4gPSB0b2tlbi5zdGFydCAtIGxhc3RNYXJrZXJMaW5lU3RhcnQgKyAxO1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoaW5kZXgsIGxpbmUsIGNvbHVtbiwgbXNnKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMubGFzdE1hcmtlci5pbmRleDtcblx0ICAgICAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmxhc3RNYXJrZXIubGluZTtcblx0ICAgICAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMubGFzdE1hcmtlci5jb2x1bW4gKyAxO1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoaW5kZXgsIGxpbmUsIGNvbHVtbiwgbXNnKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS50aHJvd1VuZXhwZWN0ZWRUb2tlbiA9IGZ1bmN0aW9uICh0b2tlbiwgbWVzc2FnZSkge1xuXHQgICAgICAgIHRocm93IHRoaXMudW5leHBlY3RlZFRva2VuRXJyb3IodG9rZW4sIG1lc3NhZ2UpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4gPSBmdW5jdGlvbiAodG9rZW4sIG1lc3NhZ2UpIHtcblx0ICAgICAgICB0aGlzLmVycm9ySGFuZGxlci50b2xlcmF0ZSh0aGlzLnVuZXhwZWN0ZWRUb2tlbkVycm9yKHRva2VuLCBtZXNzYWdlKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5jb2xsZWN0Q29tbWVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5jb21tZW50KSB7XG5cdCAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBjb21tZW50cyA9IHRoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTtcblx0ICAgICAgICAgICAgaWYgKGNvbW1lbnRzLmxlbmd0aCA+IDAgJiYgdGhpcy5kZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50cy5sZW5ndGg7ICsraSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBlID0gY29tbWVudHNbaV07XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB2b2lkIDA7XG5cdCAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZS5tdWx0aUxpbmUgPyAnQmxvY2tDb21tZW50JyA6ICdMaW5lQ29tbWVudCcsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNjYW5uZXIuc291cmNlLnNsaWNlKGUuc2xpY2VbMF0sIGUuc2xpY2VbMV0pXG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcucmFuZ2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yYW5nZSA9IGUucmFuZ2U7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb2MpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5sb2MgPSBlLmxvYztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDoge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogZS5sb2Muc3RhcnQubGluZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZS5sb2Muc3RhcnQuY29sdW1uLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBlLnJhbmdlWzBdXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVuZDoge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogZS5sb2MuZW5kLmxpbmUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGUubG9jLmVuZC5jb2x1bW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IGUucmFuZ2VbMV1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZShub2RlLCBtZXRhZGF0YSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLy8gRnJvbSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0byBhbiBleHRlcm5hbCBzdHJ1Y3R1cmVcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuZ2V0VG9rZW5SYXcgPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5zY2FubmVyLnNvdXJjZS5zbGljZSh0b2tlbi5zdGFydCwgdG9rZW4uZW5kKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmNvbnZlcnRUb2tlbiA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgIHZhciB0ID0ge1xuXHQgICAgICAgICAgICB0eXBlOiB0b2tlbl8xLlRva2VuTmFtZVt0b2tlbi50eXBlXSxcblx0ICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pXG5cdCAgICAgICAgfTtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcucmFuZ2UpIHtcblx0ICAgICAgICAgICAgdC5yYW5nZSA9IFt0b2tlbi5zdGFydCwgdG9rZW4uZW5kXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxvYykge1xuXHQgICAgICAgICAgICB0LmxvYyA9IHtcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5zdGFydE1hcmtlci5saW5lLFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zdGFydE1hcmtlci5jb2x1bW5cblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnRcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDkgLyogUmVndWxhckV4cHJlc3Npb24gKi8pIHtcblx0ICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSB0b2tlbi5wYXR0ZXJuO1xuXHQgICAgICAgICAgICB2YXIgZmxhZ3MgPSB0b2tlbi5mbGFncztcblx0ICAgICAgICAgICAgdC5yZWdleCA9IHsgcGF0dGVybjogcGF0dGVybiwgZmxhZ3M6IGZsYWdzIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0O1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUubmV4dFRva2VuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlci5pbmRleCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIubGluZSA9IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyO1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlci5jb2x1bW4gPSB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0O1xuXHQgICAgICAgIHRoaXMuY29sbGVjdENvbW1lbnRzKCk7XG5cdCAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pbmRleCAhPT0gdGhpcy5zdGFydE1hcmtlci5pbmRleCkge1xuXHQgICAgICAgICAgICB0aGlzLnN0YXJ0TWFya2VyLmluZGV4ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICB0aGlzLnN0YXJ0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgdGhpcy5zdGFydE1hcmtlci5jb2x1bW4gPSB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbmV4dCA9IHRoaXMuc2Nhbm5lci5sZXgoKTtcblx0ICAgICAgICB0aGlzLmhhc0xpbmVUZXJtaW5hdG9yID0gKHRva2VuLmxpbmVOdW1iZXIgIT09IG5leHQubGluZU51bWJlcik7XG5cdCAgICAgICAgaWYgKG5leHQgJiYgdGhpcy5jb250ZXh0LnN0cmljdCAmJiBuZXh0LnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLykge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZChuZXh0LnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgbmV4dC50eXBlID0gNCAvKiBLZXl3b3JkICovO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMubG9va2FoZWFkID0gbmV4dDtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcudG9rZW5zICYmIG5leHQudHlwZSAhPT0gMiAvKiBFT0YgKi8pIHtcblx0ICAgICAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLmNvbnZlcnRUb2tlbihuZXh0KSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLm5leHRSZWdleFRva2VuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuY29sbGVjdENvbW1lbnRzKCk7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5zY2FubmVyLnNjYW5SZWdFeHAoKTtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcudG9rZW5zKSB7XG5cdCAgICAgICAgICAgIC8vIFBvcCB0aGUgcHJldmlvdXMgdG9rZW4sICcvJyBvciAnLz0nXG5cdCAgICAgICAgICAgIC8vIFRoaXMgaXMgYWRkZWQgZnJvbSB0aGUgbG9va2FoZWFkIHRva2VuLlxuXHQgICAgICAgICAgICB0aGlzLnRva2Vucy5wb3AoKTtcblx0ICAgICAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLmNvbnZlcnRUb2tlbih0b2tlbikpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBQcmltZSB0aGUgbmV4dCBsb29rYWhlYWQuXG5cdCAgICAgICAgdGhpcy5sb29rYWhlYWQgPSB0b2tlbjtcblx0ICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmNyZWF0ZU5vZGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgaW5kZXg6IHRoaXMuc3RhcnRNYXJrZXIuaW5kZXgsXG5cdCAgICAgICAgICAgIGxpbmU6IHRoaXMuc3RhcnRNYXJrZXIubGluZSxcblx0ICAgICAgICAgICAgY29sdW1uOiB0aGlzLnN0YXJ0TWFya2VyLmNvbHVtblxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5zdGFydE5vZGUgPSBmdW5jdGlvbiAodG9rZW4sIGxhc3RMaW5lU3RhcnQpIHtcblx0ICAgICAgICBpZiAobGFzdExpbmVTdGFydCA9PT0gdm9pZCAwKSB7IGxhc3RMaW5lU3RhcnQgPSAwOyB9XG5cdCAgICAgICAgdmFyIGNvbHVtbiA9IHRva2VuLnN0YXJ0IC0gdG9rZW4ubGluZVN0YXJ0O1xuXHQgICAgICAgIHZhciBsaW5lID0gdG9rZW4ubGluZU51bWJlcjtcblx0ICAgICAgICBpZiAoY29sdW1uIDwgMCkge1xuXHQgICAgICAgICAgICBjb2x1bW4gKz0gbGFzdExpbmVTdGFydDtcblx0ICAgICAgICAgICAgbGluZS0tO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICBpbmRleDogdG9rZW4uc3RhcnQsXG5cdCAgICAgICAgICAgIGxpbmU6IGxpbmUsXG5cdCAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24gKG1hcmtlciwgbm9kZSkge1xuXHQgICAgICAgIGlmICh0aGlzLmNvbmZpZy5yYW5nZSkge1xuXHQgICAgICAgICAgICBub2RlLnJhbmdlID0gW21hcmtlci5pbmRleCwgdGhpcy5sYXN0TWFya2VyLmluZGV4XTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxvYykge1xuXHQgICAgICAgICAgICBub2RlLmxvYyA9IHtcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogbWFya2VyLmxpbmUsXG5cdCAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBtYXJrZXIuY29sdW1uLFxuXHQgICAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgICAgIGVuZDoge1xuXHQgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMubGFzdE1hcmtlci5saW5lLFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5sYXN0TWFya2VyLmNvbHVtblxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuc291cmNlKSB7XG5cdCAgICAgICAgICAgICAgICBub2RlLmxvYy5zb3VyY2UgPSB0aGlzLmNvbmZpZy5zb3VyY2U7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuZGVsZWdhdGUpIHtcblx0ICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0ge1xuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICBsaW5lOiBtYXJrZXIubGluZSxcblx0ICAgICAgICAgICAgICAgICAgICBjb2x1bW46IG1hcmtlci5jb2x1bW4sXG5cdCAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBtYXJrZXIuaW5kZXhcblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxhc3RNYXJrZXIubGluZSxcblx0ICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMubGFzdE1hcmtlci5jb2x1bW4sXG5cdCAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLmxhc3RNYXJrZXIuaW5kZXhcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZShub2RlLCBtZXRhZGF0YSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBub2RlO1xuXHQgICAgfTtcblx0ICAgIC8vIEV4cGVjdCB0aGUgbmV4dCB0b2tlbiB0byBtYXRjaCB0aGUgc3BlY2lmaWVkIHB1bmN0dWF0b3IuXG5cdCAgICAvLyBJZiBub3QsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi5cblx0ICAgIFBhcnNlci5wcm90b3R5cGUuZXhwZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gNyAvKiBQdW5jdHVhdG9yICovIHx8IHRva2VuLnZhbHVlICE9PSB2YWx1ZSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLy8gUXVpZXRseSBleHBlY3QgYSBjb21tYSB3aGVuIGluIHRvbGVyYW50IG1vZGUsIG90aGVyd2lzZSBkZWxlZ2F0ZXMgdG8gZXhwZWN0KCkuXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmV4cGVjdENvbW1hU2VwYXJhdG9yID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmNvbmZpZy50b2xlcmFudCkge1xuXHQgICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiB0b2tlbi52YWx1ZSA9PT0gJywnKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiB0b2tlbi52YWx1ZSA9PT0gJzsnKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLCBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcsJyk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8vIEV4cGVjdCB0aGUgbmV4dCB0b2tlbiB0byBtYXRjaCB0aGUgc3BlY2lmaWVkIGtleXdvcmQuXG5cdCAgICAvLyBJZiBub3QsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi5cblx0ICAgIFBhcnNlci5wcm90b3R5cGUuZXhwZWN0S2V5d29yZCA9IGZ1bmN0aW9uIChrZXl3b3JkKSB7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gNCAvKiBLZXl3b3JkICovIHx8IHRva2VuLnZhbHVlICE9PSBrZXl3b3JkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcHVuY3R1YXRvci5cblx0ICAgIFBhcnNlci5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5sb29rYWhlYWQudHlwZSA9PT0gNyAvKiBQdW5jdHVhdG9yICovICYmIHRoaXMubG9va2FoZWFkLnZhbHVlID09PSB2YWx1ZTtcblx0ICAgIH07XG5cdCAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQga2V5d29yZFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5tYXRjaEtleXdvcmQgPSBmdW5jdGlvbiAoa2V5d29yZCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmxvb2thaGVhZC50eXBlID09PSA0IC8qIEtleXdvcmQgKi8gJiYgdGhpcy5sb29rYWhlYWQudmFsdWUgPT09IGtleXdvcmQ7XG5cdCAgICB9O1xuXHQgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGNvbnRleHR1YWwga2V5d29yZFxuXHQgICAgLy8gKHdoZXJlIGFuIGlkZW50aWZpZXIgaXMgc29tZXRpbWVzIGEga2V5d29yZCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQpXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLm1hdGNoQ29udGV4dHVhbEtleXdvcmQgPSBmdW5jdGlvbiAoa2V5d29yZCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmxvb2thaGVhZC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgdGhpcy5sb29rYWhlYWQudmFsdWUgPT09IGtleXdvcmQ7XG5cdCAgICB9O1xuXHQgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIG5leHQgdG9rZW4gaXMgYW4gYXNzaWdubWVudCBvcGVyYXRvclxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5tYXRjaEFzc2lnbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gNyAvKiBQdW5jdHVhdG9yICovKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG9wID0gdGhpcy5sb29rYWhlYWQudmFsdWU7XG5cdCAgICAgICAgcmV0dXJuIG9wID09PSAnPScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICcqPScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICcqKj0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnLz0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnJT0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnKz0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnLT0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnPDw9JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJz4+PScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICc+Pj49JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJyY9JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJ149JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJ3w9Jztcblx0ICAgIH07XG5cdCAgICAvLyBDb3ZlciBncmFtbWFyIHN1cHBvcnQuXG5cdCAgICAvL1xuXHQgICAgLy8gV2hlbiBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gcG9zaXRpb24gc3RhcnRzIHdpdGggYW4gbGVmdCBwYXJlbnRoZXNpcywgdGhlIGRldGVybWluYXRpb24gb2YgdGhlIHR5cGVcblx0ICAgIC8vIG9mIHRoZSBzeW50YXggaXMgdG8gYmUgZGVmZXJyZWQgYXJiaXRyYXJpbHkgbG9uZyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBwYXJlbnRoZXNlcyBwYWlyIChwbHVzIGEgbG9va2FoZWFkKVxuXHQgICAgLy8gb3IgdGhlIGZpcnN0IGNvbW1hLiBUaGlzIHNpdHVhdGlvbiBhbHNvIGRlZmVycyB0aGUgZGV0ZXJtaW5hdGlvbiBvZiBhbGwgdGhlIGV4cHJlc3Npb25zIG5lc3RlZCBpbiB0aGUgcGFpci5cblx0ICAgIC8vXG5cdCAgICAvLyBUaGVyZSBhcmUgdGhyZWUgcHJvZHVjdGlvbnMgdGhhdCBjYW4gYmUgcGFyc2VkIGluIGEgcGFyZW50aGVzZXMgcGFpciB0aGF0IG5lZWRzIHRvIGJlIGRldGVybWluZWRcblx0ICAgIC8vIGFmdGVyIHRoZSBvdXRlcm1vc3QgcGFpciBpcyBjbG9zZWQuIFRoZXkgYXJlOlxuXHQgICAgLy9cblx0ICAgIC8vICAgMS4gQXNzaWdubWVudEV4cHJlc3Npb25cblx0ICAgIC8vICAgMi4gQmluZGluZ0VsZW1lbnRzXG5cdCAgICAvLyAgIDMuIEFzc2lnbm1lbnRUYXJnZXRzXG5cdCAgICAvL1xuXHQgICAgLy8gSW4gb3JkZXIgdG8gYXZvaWQgZXhwb25lbnRpYWwgYmFja3RyYWNraW5nLCB3ZSB1c2UgdHdvIGZsYWdzIHRvIGRlbm90ZSBpZiB0aGUgcHJvZHVjdGlvbiBjYW4gYmVcblx0ICAgIC8vIGJpbmRpbmcgZWxlbWVudCBvciBhc3NpZ25tZW50IHRhcmdldC5cblx0ICAgIC8vXG5cdCAgICAvLyBUaGUgdGhyZWUgcHJvZHVjdGlvbnMgaGF2ZSB0aGUgcmVsYXRpb25zaGlwOlxuXHQgICAgLy9cblx0ICAgIC8vICAgQmluZGluZ0VsZW1lbnRzIOKKhiBBc3NpZ25tZW50VGFyZ2V0cyDiioYgQXNzaWdubWVudEV4cHJlc3Npb25cblx0ICAgIC8vXG5cdCAgICAvLyB3aXRoIGEgc2luZ2xlIGV4Y2VwdGlvbiB0aGF0IENvdmVySW5pdGlhbGl6ZWROYW1lIHdoZW4gdXNlZCBkaXJlY3RseSBpbiBhbiBFeHByZXNzaW9uLCBnZW5lcmF0ZXNcblx0ICAgIC8vIGFuIGVhcmx5IGVycm9yLiBUaGVyZWZvcmUsIHdlIG5lZWQgdGhlIHRoaXJkIHN0YXRlLCBmaXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IsIHRvIHRyYWNrIHRoZVxuXHQgICAgLy8gZmlyc3QgdXNhZ2Ugb2YgQ292ZXJJbml0aWFsaXplZE5hbWUgYW5kIHJlcG9ydCBpdCB3aGVuIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgcGFyZW50aGVzZXMgcGFpci5cblx0ICAgIC8vXG5cdCAgICAvLyBpc29sYXRlQ292ZXJHcmFtbWFyIGZ1bmN0aW9uIHJ1bnMgdGhlIGdpdmVuIHBhcnNlciBmdW5jdGlvbiB3aXRoIGEgbmV3IGNvdmVyIGdyYW1tYXIgY29udGV4dCwgYW5kIGl0IGRvZXMgbm90XG5cdCAgICAvLyBlZmZlY3QgdGhlIGN1cnJlbnQgZmxhZ3MuIFRoaXMgbWVhbnMgdGhlIHByb2R1Y3Rpb24gdGhlIHBhcnNlciBwYXJzZXMgaXMgb25seSB1c2VkIGFzIGFuIGV4cHJlc3Npb24uIFRoZXJlZm9yZVxuXHQgICAgLy8gdGhlIENvdmVySW5pdGlhbGl6ZWROYW1lIGNoZWNrIGlzIGNvbmR1Y3RlZC5cblx0ICAgIC8vXG5cdCAgICAvLyBpbmhlcml0Q292ZXJHcmFtbWFyIGZ1bmN0aW9uIHJ1bnMgdGhlIGdpdmVuIHBhcnNlIGZ1bmN0aW9uIHdpdGggYSBuZXcgY292ZXIgZ3JhbW1hciBjb250ZXh0LCBhbmQgaXQgcHJvcGFnYXRlc1xuXHQgICAgLy8gdGhlIGZsYWdzIG91dHNpZGUgb2YgdGhlIHBhcnNlci4gVGhpcyBtZWFucyB0aGUgcHJvZHVjdGlvbiB0aGUgcGFyc2VyIHBhcnNlcyBpcyB1c2VkIGFzIGEgcGFydCBvZiBhIHBvdGVudGlhbFxuXHQgICAgLy8gcGF0dGVybi4gVGhlIENvdmVySW5pdGlhbGl6ZWROYW1lIGNoZWNrIGlzIGRlZmVycmVkLlxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5pc29sYXRlQ292ZXJHcmFtbWFyID0gZnVuY3Rpb24gKHBhcnNlRnVuY3Rpb24pIHtcblx0ICAgICAgICB2YXIgcHJldmlvdXNJc0JpbmRpbmdFbGVtZW50ID0gdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzSXNBc3NpZ25tZW50VGFyZ2V0ID0gdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNGaXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gbnVsbDtcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gcGFyc2VGdW5jdGlvbi5jYWxsKHRoaXMpO1xuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gcHJldmlvdXNJc0JpbmRpbmdFbGVtZW50O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBwcmV2aW91c0lzQXNzaWdubWVudFRhcmdldDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gcHJldmlvdXNGaXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3I7XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdDtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmluaGVyaXRDb3ZlckdyYW1tYXIgPSBmdW5jdGlvbiAocGFyc2VGdW5jdGlvbikge1xuXHQgICAgICAgIHZhciBwcmV2aW91c0lzQmluZGluZ0VsZW1lbnQgPSB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNJc0Fzc2lnbm1lbnRUYXJnZXQgPSB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0ZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciA9IHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3I7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSBudWxsO1xuXHQgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZUZ1bmN0aW9uLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCAmJiBwcmV2aW91c0lzQmluZGluZ0VsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgJiYgcHJldmlvdXNJc0Fzc2lnbm1lbnRUYXJnZXQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciA9IHByZXZpb3VzRmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yIHx8IHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3I7XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdDtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmNvbnN1bWVTZW1pY29sb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJzsnKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICghdGhpcy5oYXNMaW5lVGVybWluYXRvcikge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMiAvKiBFT0YgKi8gJiYgIXRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5sYXN0TWFya2VyLmluZGV4ID0gdGhpcy5zdGFydE1hcmtlci5pbmRleDtcblx0ICAgICAgICAgICAgdGhpcy5sYXN0TWFya2VyLmxpbmUgPSB0aGlzLnN0YXJ0TWFya2VyLmxpbmU7XG5cdCAgICAgICAgICAgIHRoaXMubGFzdE1hcmtlci5jb2x1bW4gPSB0aGlzLnN0YXJ0TWFya2VyLmNvbHVtbjtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJpbWFyeS1leHByZXNzaW9uXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlUHJpbWFyeUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgZXhwcjtcblx0ICAgICAgICB2YXIgdG9rZW4sIHJhdztcblx0ICAgICAgICBzd2l0Y2ggKHRoaXMubG9va2FoZWFkLnR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSAzIC8qIElkZW50aWZpZXIgKi86XG5cdCAgICAgICAgICAgICAgICBpZiAoKHRoaXMuY29udGV4dC5pc01vZHVsZSB8fCB0aGlzLmNvbnRleHQuYXdhaXQpICYmIHRoaXMubG9va2FoZWFkLnZhbHVlID09PSAnYXdhaXQnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5tYXRjaEFzeW5jRnVuY3Rpb24oKSA/IHRoaXMucGFyc2VGdW5jdGlvbkV4cHJlc3Npb24oKSA6IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWRlbnRpZmllcih0aGlzLm5leHRUb2tlbigpLnZhbHVlKSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSA2IC8qIE51bWVyaWNMaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDggLyogU3RyaW5nTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHRoaXMubG9va2FoZWFkLm9jdGFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RPY3RhbExpdGVyYWwpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuTGl0ZXJhbCh0b2tlbi52YWx1ZSwgcmF3KSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAxIC8qIEJvb2xlYW5MaXRlcmFsICovOlxuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuTGl0ZXJhbCh0b2tlbi52YWx1ZSA9PT0gJ3RydWUnLCByYXcpKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDUgLyogTnVsbExpdGVyYWwgKi86XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgcmF3ID0gdGhpcy5nZXRUb2tlblJhdyh0b2tlbik7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5MaXRlcmFsKG51bGwsIHJhdykpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgMTAgLyogVGVtcGxhdGUgKi86XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZVRlbXBsYXRlTGl0ZXJhbCgpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgNyAvKiBQdW5jdHVhdG9yICovOlxuXHQgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmxvb2thaGVhZC52YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJygnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VHcm91cEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdbJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXJyYXlJbml0aWFsaXplcik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VPYmplY3RJbml0aWFsaXplcik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOlxuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJy89Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuaW5kZXggPSB0aGlzLnN0YXJ0TWFya2VyLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubmV4dFJlZ2V4VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmF3ID0gdGhpcy5nZXRUb2tlblJhdyh0b2tlbik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlJlZ2V4TGl0ZXJhbCh0b2tlbi5yZWdleCwgcmF3LCB0b2tlbi5wYXR0ZXJuLCB0b2tlbi5mbGFncykpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDQgLyogS2V5d29yZCAqLzpcblx0ICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LnN0cmljdCAmJiB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCAmJiB0aGlzLm1hdGNoS2V5d29yZCgneWllbGQnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHRoaXMubWF0Y2hLZXl3b3JkKCdsZXQnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIodGhpcy5uZXh0VG9rZW4oKS52YWx1ZSkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdmdW5jdGlvbicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCd0aGlzJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVGhpc0V4cHJlc3Npb24oKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdjbGFzcycpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlQ2xhc3NFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZXhwcjtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS1pbml0aWFsaXplclxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVNwcmVhZEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnLi4uJyk7XG5cdCAgICAgICAgdmFyIGFyZyA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlNwcmVhZEVsZW1lbnQoYXJnKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUFycmF5SW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgZWxlbWVudHMgPSBbXTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnWycpO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5tYXRjaCgnXScpKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKG51bGwpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJy4uLicpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMucGFyc2VTcHJlYWRFbGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJ10nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcsJyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaCh0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKSk7XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJ10nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcsJyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ10nKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5BcnJheUV4cHJlc3Npb24oZWxlbWVudHMpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QtaW5pdGlhbGl6ZXJcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VQcm9wZXJ0eU1ldGhvZCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNTdHJpY3QgPSB0aGlzLmNvbnRleHQuc3RyaWN0O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlID0gdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZSA9IHBhcmFtcy5zaW1wbGU7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUZ1bmN0aW9uU291cmNlRWxlbWVudHMpO1xuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHBhcmFtcy5maXJzdFJlc3RyaWN0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbihwYXJhbXMuZmlyc3RSZXN0cmljdGVkLCBwYXJhbXMubWVzc2FnZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHBhcmFtcy5zdHJpY3RlZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHBhcmFtcy5zdHJpY3RlZCwgcGFyYW1zLm1lc3NhZ2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gcHJldmlvdXNTdHJpY3Q7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZTtcblx0ICAgICAgICByZXR1cm4gYm9keTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlUHJvcGVydHlNZXRob2RGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgaXNHZW5lcmF0b3IgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHRydWU7XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IHRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKCk7XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IHRoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZChwYXJhbXMpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkZ1bmN0aW9uRXhwcmVzc2lvbihudWxsLCBwYXJhbXMucGFyYW1zLCBtZXRob2QsIGlzR2VuZXJhdG9yKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVByb3BlcnR5TWV0aG9kQXN5bmNGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBd2FpdCA9IHRoaXMuY29udGV4dC5hd2FpdDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hd2FpdCA9IHRydWU7XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IHRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKCk7XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IHRoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZChwYXJhbXMpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hd2FpdCA9IHByZXZpb3VzQXdhaXQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXN5bmNGdW5jdGlvbkV4cHJlc3Npb24obnVsbCwgcGFyYW1zLnBhcmFtcywgbWV0aG9kKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU9iamVjdFByb3BlcnR5S2V5ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB2YXIga2V5O1xuXHQgICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuXHQgICAgICAgICAgICBjYXNlIDggLyogU3RyaW5nTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA2IC8qIE51bWVyaWNMaXRlcmFsICovOlxuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgdG9rZW4ub2N0YWwpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLCBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdE9jdGFsTGl0ZXJhbCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB2YXIgcmF3ID0gdGhpcy5nZXRUb2tlblJhdyh0b2tlbik7XG5cdCAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkxpdGVyYWwodG9rZW4udmFsdWUsIHJhdykpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgMyAvKiBJZGVudGlmaWVyICovOlxuXHQgICAgICAgICAgICBjYXNlIDEgLyogQm9vbGVhbkxpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgNSAvKiBOdWxsTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA0IC8qIEtleXdvcmQgKi86XG5cdCAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIodG9rZW4udmFsdWUpKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDcgLyogUHVuY3R1YXRvciAqLzpcblx0ICAgICAgICAgICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PT0gJ1snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJ10nKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGtleTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmlzUHJvcGVydHlLZXkgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHQgICAgICAgIHJldHVybiAoa2V5LnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyICYmIGtleS5uYW1lID09PSB2YWx1ZSkgfHxcblx0ICAgICAgICAgICAgKGtleS50eXBlID09PSBzeW50YXhfMS5TeW50YXguTGl0ZXJhbCAmJiBrZXkudmFsdWUgPT09IHZhbHVlKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlT2JqZWN0UHJvcGVydHkgPSBmdW5jdGlvbiAoaGFzUHJvdG8pIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHZhciBraW5kO1xuXHQgICAgICAgIHZhciBrZXkgPSBudWxsO1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IG51bGw7XG5cdCAgICAgICAgdmFyIGNvbXB1dGVkID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBzaG9ydGhhbmQgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgaXNBc3luYyA9IGZhbHNlO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pIHtcblx0ICAgICAgICAgICAgdmFyIGlkID0gdG9rZW4udmFsdWU7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBpc0FzeW5jID0gIXRoaXMuaGFzTGluZVRlcm1pbmF0b3IgJiYgKGlkID09PSAnYXN5bmMnKSAmJlxuXHQgICAgICAgICAgICAgICAgIXRoaXMubWF0Y2goJzonKSAmJiAhdGhpcy5tYXRjaCgnKCcpICYmICF0aGlzLm1hdGNoKCcqJykgJiYgIXRoaXMubWF0Y2goJywnKTtcblx0ICAgICAgICAgICAga2V5ID0gaXNBc3luYyA/IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpIDogdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5JZGVudGlmaWVyKGlkKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJyonKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbG9va2FoZWFkUHJvcGVydHlLZXkgPSB0aGlzLnF1YWxpZmllZFByb3BlcnR5TmFtZSh0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLyAmJiAhaXNBc3luYyAmJiB0b2tlbi52YWx1ZSA9PT0gJ2dldCcgJiYgbG9va2FoZWFkUHJvcGVydHlLZXkpIHtcblx0ICAgICAgICAgICAga2luZCA9ICdnZXQnO1xuXHQgICAgICAgICAgICBjb21wdXRlZCA9IHRoaXMubWF0Y2goJ1snKTtcblx0ICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wYXJzZUdldHRlck1ldGhvZCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgIWlzQXN5bmMgJiYgdG9rZW4udmFsdWUgPT09ICdzZXQnICYmIGxvb2thaGVhZFByb3BlcnR5S2V5KSB7XG5cdCAgICAgICAgICAgIGtpbmQgPSAnc2V0Jztcblx0ICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VTZXR0ZXJNZXRob2QoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gNyAvKiBQdW5jdHVhdG9yICovICYmIHRva2VuLnZhbHVlID09PSAnKicgJiYgbG9va2FoZWFkUHJvcGVydHlLZXkpIHtcblx0ICAgICAgICAgICAga2luZCA9ICdpbml0Jztcblx0ICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VHZW5lcmF0b3JNZXRob2QoKTtcblx0ICAgICAgICAgICAgbWV0aG9kID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGlmICgha2V5KSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBraW5kID0gJ2luaXQnO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnOicpICYmICFpc0FzeW5jKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoIWNvbXB1dGVkICYmIHRoaXMuaXNQcm9wZXJ0eUtleShrZXksICdfX3Byb3RvX18nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQcm90by52YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5EdXBsaWNhdGVQcm90b1Byb3BlcnR5KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaGFzUHJvdG8udmFsdWUgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaCgnKCcpKSB7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IGlzQXN5bmMgPyB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2RBc3luY0Z1bmN0aW9uKCkgOiB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2RGdW5jdGlvbigpO1xuXHQgICAgICAgICAgICAgICAgbWV0aG9kID0gdHJ1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pIHtcblx0ICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWRlbnRpZmllcih0b2tlbi52YWx1ZSkpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJz0nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIHNob3J0aGFuZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGluaXQgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXNzaWdubWVudFBhdHRlcm4oaWQsIGluaXQpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHNob3J0aGFuZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpZDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuUHJvcGVydHkoa2luZCwga2V5LCBjb21wdXRlZCwgdmFsdWUsIG1ldGhvZCwgc2hvcnRoYW5kKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU9iamVjdEluaXRpYWxpemVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ3snKTtcblx0ICAgICAgICB2YXIgcHJvcGVydGllcyA9IFtdO1xuXHQgICAgICAgIHZhciBoYXNQcm90byA9IHsgdmFsdWU6IGZhbHNlIH07XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eShoYXNQcm90bykpO1xuXHQgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5leHBlY3RDb21tYVNlcGFyYXRvcigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuT2JqZWN0RXhwcmVzc2lvbihwcm9wZXJ0aWVzKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdGVtcGxhdGUtbGl0ZXJhbHNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VUZW1wbGF0ZUhlYWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KHRoaXMubG9va2FoZWFkLmhlYWQsICdUZW1wbGF0ZSBsaXRlcmFsIG11c3Qgc3RhcnQgd2l0aCBhIHRlbXBsYXRlIGhlYWQnKTtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdmFyIHJhdyA9IHRva2VuLnZhbHVlO1xuXHQgICAgICAgIHZhciBjb29rZWQgPSB0b2tlbi5jb29rZWQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVGVtcGxhdGVFbGVtZW50KHsgcmF3OiByYXcsIGNvb2tlZDogY29va2VkIH0sIHRva2VuLnRhaWwpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVGVtcGxhdGVFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmxvb2thaGVhZC50eXBlICE9PSAxMCAvKiBUZW1wbGF0ZSAqLykge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB2YXIgcmF3ID0gdG9rZW4udmFsdWU7XG5cdCAgICAgICAgdmFyIGNvb2tlZCA9IHRva2VuLmNvb2tlZDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5UZW1wbGF0ZUVsZW1lbnQoeyByYXc6IHJhdywgY29va2VkOiBjb29rZWQgfSwgdG9rZW4udGFpbCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VUZW1wbGF0ZUxpdGVyYWwgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTtcblx0ICAgICAgICB2YXIgcXVhc2lzID0gW107XG5cdCAgICAgICAgdmFyIHF1YXNpID0gdGhpcy5wYXJzZVRlbXBsYXRlSGVhZCgpO1xuXHQgICAgICAgIHF1YXNpcy5wdXNoKHF1YXNpKTtcblx0ICAgICAgICB3aGlsZSAoIXF1YXNpLnRhaWwpIHtcblx0ICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaCh0aGlzLnBhcnNlRXhwcmVzc2lvbigpKTtcblx0ICAgICAgICAgICAgcXVhc2kgPSB0aGlzLnBhcnNlVGVtcGxhdGVFbGVtZW50KCk7XG5cdCAgICAgICAgICAgIHF1YXNpcy5wdXNoKHF1YXNpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVGVtcGxhdGVMaXRlcmFsKHF1YXNpcywgZXhwcmVzc2lvbnMpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1ncm91cGluZy1vcGVyYXRvclxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4gPSBmdW5jdGlvbiAoZXhwcikge1xuXHQgICAgICAgIHN3aXRjaCAoZXhwci50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXI6XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4Lk1lbWJlckV4cHJlc3Npb246XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LlJlc3RFbGVtZW50OlxuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5Bc3NpZ25tZW50UGF0dGVybjpcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5TcHJlYWRFbGVtZW50OlxuXHQgICAgICAgICAgICAgICAgZXhwci50eXBlID0gc3ludGF4XzEuU3ludGF4LlJlc3RFbGVtZW50O1xuXHQgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwci5hcmd1bWVudCk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguQXJyYXlFeHByZXNzaW9uOlxuXHQgICAgICAgICAgICAgICAgZXhwci50eXBlID0gc3ludGF4XzEuU3ludGF4LkFycmF5UGF0dGVybjtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwci5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChleHByLmVsZW1lbnRzW2ldICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHIuZWxlbWVudHNbaV0pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5PYmplY3RFeHByZXNzaW9uOlxuXHQgICAgICAgICAgICAgICAgZXhwci50eXBlID0gc3ludGF4XzEuU3ludGF4Lk9iamVjdFBhdHRlcm47XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHIucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHIucHJvcGVydGllc1tpXS52YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudEV4cHJlc3Npb246XG5cdCAgICAgICAgICAgICAgICBleHByLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudFBhdHRlcm47XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgZXhwci5vcGVyYXRvcjtcblx0ICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHIubGVmdCk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIC8vIEFsbG93IG90aGVyIG5vZGUgdHlwZSBmb3IgdG9sZXJhbnQgcGFyc2luZy5cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlR3JvdXBFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBleHByO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJz0+JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCc9PicpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiBBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyLFxuXHQgICAgICAgICAgICAgICAgcGFyYW1zOiBbXSxcblx0ICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgdmFyIHBhcmFtcyA9IFtdO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnLi4uJykpIHtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlUmVzdEVsZW1lbnQocGFyYW1zKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJz0+JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnPT4nKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IFtleHByXSxcblx0ICAgICAgICAgICAgICAgICAgICBhc3luYzogZmFsc2Vcblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYXJyb3cgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaChleHByKTtcblx0ICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMiAvKiBFT0YgKi8pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwcmVzc2lvbnNbaV0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3cgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogZXhwcmVzc2lvbnMsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJy4uLicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKHRoaXMucGFyc2VSZXN0RWxlbWVudChwYXJhbXMpKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJz0+JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnPT4nKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwcmVzc2lvbnNbaV0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3cgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogZXhwcmVzc2lvbnMsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaCh0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFycm93KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWFycm93KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5TZXF1ZW5jZUV4cHJlc3Npb24oZXhwcmVzc2lvbnMpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoIWFycm93KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJyknKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnPT4nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwci50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllciAmJiBleHByLm5hbWUgPT09ICd5aWVsZCcpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IFtleHByXSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogZmFsc2Vcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJvdykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHIudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LlNlcXVlbmNlRXhwcmVzc2lvbikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwci5leHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByLmV4cHJlc3Npb25zW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzID0gKGV4cHIudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LlNlcXVlbmNlRXhwcmVzc2lvbiA/IGV4cHIuZXhwcmVzc2lvbnMgOiBbZXhwcl0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldGVycyxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogZmFsc2Vcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZXhwcjtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1sZWZ0LWhhbmQtc2lkZS1leHByZXNzaW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUFyZ3VtZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKCcpO1xuXHQgICAgICAgIHZhciBhcmdzID0gW107XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBleHByID0gdGhpcy5tYXRjaCgnLi4uJykgPyB0aGlzLnBhcnNlU3ByZWFkRWxlbWVudCgpIDpcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgIGFyZ3MucHVzaChleHByKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0Q29tbWFTZXBhcmF0b3IoKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgIHJldHVybiBhcmdzO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuaXNJZGVudGlmaWVyTmFtZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgIHJldHVybiB0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gfHxcblx0ICAgICAgICAgICAgdG9rZW4udHlwZSA9PT0gNCAvKiBLZXl3b3JkICovIHx8XG5cdCAgICAgICAgICAgIHRva2VuLnR5cGUgPT09IDEgLyogQm9vbGVhbkxpdGVyYWwgKi8gfHxcblx0ICAgICAgICAgICAgdG9rZW4udHlwZSA9PT0gNSAvKiBOdWxsTGl0ZXJhbCAqLztcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlSWRlbnRpZmllck5hbWUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIGlmICghdGhpcy5pc0lkZW50aWZpZXJOYW1lKHRva2VuKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWRlbnRpZmllcih0b2tlbi52YWx1ZSkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VOZXdFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KGlkLm5hbWUgPT09ICduZXcnLCAnTmV3IGV4cHJlc3Npb24gbXVzdCBzdGFydCB3aXRoIGBuZXdgJyk7XG5cdCAgICAgICAgdmFyIGV4cHI7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJy4nKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovICYmIHRoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keSAmJiB0aGlzLmxvb2thaGVhZC52YWx1ZSA9PT0gJ3RhcmdldCcpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IHRoaXMucGFyc2VJZGVudGlmaWVyTmFtZSgpO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IG5ldyBOb2RlLk1ldGFQcm9wZXJ0eShpZCwgcHJvcGVydHkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBjYWxsZWUgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUxlZnRIYW5kU2lkZUV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICB2YXIgYXJncyA9IHRoaXMubWF0Y2goJygnKSA/IHRoaXMucGFyc2VBcmd1bWVudHMoKSA6IFtdO1xuXHQgICAgICAgICAgICBleHByID0gbmV3IE5vZGUuTmV3RXhwcmVzc2lvbihjYWxsZWUsIGFyZ3MpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIGV4cHIpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VBc3luY0FyZ3VtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBhcmcgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gYXJnO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VBc3luY0FyZ3VtZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKCcpO1xuXHQgICAgICAgIHZhciBhcmdzID0gW107XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBleHByID0gdGhpcy5tYXRjaCgnLi4uJykgPyB0aGlzLnBhcnNlU3ByZWFkRWxlbWVudCgpIDpcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzeW5jQXJndW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgYXJncy5wdXNoKGV4cHIpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5leHBlY3RDb21tYVNlcGFyYXRvcigpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgcmV0dXJuIGFyZ3M7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUxlZnRIYW5kU2lkZUV4cHJlc3Npb25BbGxvd0NhbGwgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIgbWF5YmVBc3luYyA9IHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnYXN5bmMnKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd0luID0gdGhpcy5jb250ZXh0LmFsbG93SW47XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSB0cnVlO1xuXHQgICAgICAgIHZhciBleHByO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnc3VwZXInKSAmJiB0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkpIHtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShleHByLCBuZXcgTm9kZS5TdXBlcigpKTtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcoJykgJiYgIXRoaXMubWF0Y2goJy4nKSAmJiAhdGhpcy5tYXRjaCgnWycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLm1hdGNoS2V5d29yZCgnbmV3JykgPyB0aGlzLnBhcnNlTmV3RXhwcmVzc2lvbiA6IHRoaXMucGFyc2VQcmltYXJ5RXhwcmVzc2lvbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcuJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcuJyk7XG5cdCAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5TdGF0aWNNZW1iZXJFeHByZXNzaW9uKGV4cHIsIHByb3BlcnR5KSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaCgnKCcpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYXN5bmNBcnJvdyA9IG1heWJlQXN5bmMgJiYgKHN0YXJ0VG9rZW4ubGluZU51bWJlciA9PT0gdGhpcy5sb29rYWhlYWQubGluZU51bWJlcik7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhc3luY0Fycm93ID8gdGhpcy5wYXJzZUFzeW5jQXJndW1lbnRzKCkgOiB0aGlzLnBhcnNlQXJndW1lbnRzKCk7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuQ2FsbEV4cHJlc3Npb24oZXhwciwgYXJncykpO1xuXHQgICAgICAgICAgICAgICAgaWYgKGFzeW5jQXJyb3cgJiYgdGhpcy5tYXRjaCgnPT4nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihhcmdzW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZXhwciA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBhcmdzLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogdHJ1ZVxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaCgnWycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnWycpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCddJyk7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uKGV4cHIsIHByb3BlcnR5KSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMTAgLyogVGVtcGxhdGUgKi8gJiYgdGhpcy5sb29rYWhlYWQuaGVhZCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIHF1YXNpID0gdGhpcy5wYXJzZVRlbXBsYXRlTGl0ZXJhbCgpO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbihleHByLCBxdWFzaSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSBwcmV2aW91c0FsbG93SW47XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVN1cGVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdzdXBlcicpO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnWycpICYmICF0aGlzLm1hdGNoKCcuJykpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlN1cGVyKCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VMZWZ0SGFuZFNpZGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGFzc2VydF8xLmFzc2VydCh0aGlzLmNvbnRleHQuYWxsb3dJbiwgJ2NhbGxlZSBvZiBuZXcgZXhwcmVzc2lvbiBhbHdheXMgYWxsb3cgaW4ga2V5d29yZC4nKTtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICB2YXIgZXhwciA9ICh0aGlzLm1hdGNoS2V5d29yZCgnc3VwZXInKSAmJiB0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkpID8gdGhpcy5wYXJzZVN1cGVyKCkgOlxuXHQgICAgICAgICAgICB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5tYXRjaEtleXdvcmQoJ25ldycpID8gdGhpcy5wYXJzZU5ld0V4cHJlc3Npb24gOiB0aGlzLnBhcnNlUHJpbWFyeUV4cHJlc3Npb24pO1xuXHQgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCdbJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCdbJyk7XG5cdCAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJ10nKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkNvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbihleHByLCBwcm9wZXJ0eSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJy4nKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJy4nKTtcblx0ICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IHRoaXMucGFyc2VJZGVudGlmaWVyTmFtZSgpO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuU3RhdGljTWVtYmVyRXhwcmVzc2lvbihleHByLCBwcm9wZXJ0eSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDEwIC8qIFRlbXBsYXRlICovICYmIHRoaXMubG9va2FoZWFkLmhlYWQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBxdWFzaSA9IHRoaXMucGFyc2VUZW1wbGF0ZUxpdGVyYWwoKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbihleHByLCBxdWFzaSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdXBkYXRlLWV4cHJlc3Npb25zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVXBkYXRlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgZXhwcjtcblx0ICAgICAgICB2YXIgc3RhcnRUb2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCcrKycpIHx8IHRoaXMubWF0Y2goJy0tJykpIHtcblx0ICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKTtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlVW5hcnlFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgZXhwci50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllciAmJiB0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZChleHByLm5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RMSFNQcmVmaXgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZExIU0luQXNzaWdubWVudCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdmFyIHByZWZpeCA9IHRydWU7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlVwZGF0ZUV4cHJlc3Npb24odG9rZW4udmFsdWUsIGV4cHIsIHByZWZpeCkpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VMZWZ0SGFuZFNpZGVFeHByZXNzaW9uQWxsb3dDYWxsKTtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yICYmIHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLykge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJysrJykgfHwgdGhpcy5tYXRjaCgnLS0nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGV4cHIudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIgJiYgdGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQoZXhwci5uYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RMSFNQb3N0Zml4KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRMSFNJbkFzc2lnbm1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgb3BlcmF0b3IgPSB0aGlzLm5leHRUb2tlbigpLnZhbHVlO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBwcmVmaXggPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuVXBkYXRlRXhwcmVzc2lvbihvcGVyYXRvciwgZXhwciwgcHJlZml4KSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdW5hcnktb3BlcmF0b3JzXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQXdhaXRFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB2YXIgYXJndW1lbnQgPSB0aGlzLnBhcnNlVW5hcnlFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXdhaXRFeHByZXNzaW9uKGFyZ3VtZW50KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVVuYXJ5RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgZXhwcjtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnKycpIHx8IHRoaXMubWF0Y2goJy0nKSB8fCB0aGlzLm1hdGNoKCd+JykgfHwgdGhpcy5tYXRjaCgnIScpIHx8XG5cdCAgICAgICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKCdkZWxldGUnKSB8fCB0aGlzLm1hdGNoS2V5d29yZCgndm9pZCcpIHx8IHRoaXMubWF0Y2hLZXl3b3JkKCd0eXBlb2YnKSkge1xuXHQgICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlVW5hcnlFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVW5hcnlFeHByZXNzaW9uKHRva2VuLnZhbHVlLCBleHByKSk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGV4cHIub3BlcmF0b3IgPT09ICdkZWxldGUnICYmIGV4cHIuYXJndW1lbnQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdERlbGV0ZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0aGlzLmNvbnRleHQuYXdhaXQgJiYgdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhd2FpdCcpKSB7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlQXdhaXRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZVVwZGF0ZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnRUb2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHZhciBleHByID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VVbmFyeUV4cHJlc3Npb24pO1xuXHQgICAgICAgIGlmIChleHByLnR5cGUgIT09IHN5bnRheF8xLlN5bnRheC5VbmFyeUV4cHJlc3Npb24gJiYgdGhpcy5tYXRjaCgnKionKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHZhciBsZWZ0ID0gZXhwcjtcblx0ICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuQmluYXJ5RXhwcmVzc2lvbignKionLCBsZWZ0LCByaWdodCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZXhwcjtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1leHAtb3BlcmF0b3Jcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW11bHRpcGxpY2F0aXZlLW9wZXJhdG9yc1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYWRkaXRpdmUtb3BlcmF0b3JzXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1iaXR3aXNlLXNoaWZ0LW9wZXJhdG9yc1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVsYXRpb25hbC1vcGVyYXRvcnNcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVxdWFsaXR5LW9wZXJhdG9yc1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYmluYXJ5LWJpdHdpc2Utb3BlcmF0b3JzXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1iaW5hcnktbG9naWNhbC1vcGVyYXRvcnNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuYmluYXJ5UHJlY2VkZW5jZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgIHZhciBvcCA9IHRva2VuLnZhbHVlO1xuXHQgICAgICAgIHZhciBwcmVjZWRlbmNlO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8pIHtcblx0ICAgICAgICAgICAgcHJlY2VkZW5jZSA9IHRoaXMub3BlcmF0b3JQcmVjZWRlbmNlW29wXSB8fCAwO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSA0IC8qIEtleXdvcmQgKi8pIHtcblx0ICAgICAgICAgICAgcHJlY2VkZW5jZSA9IChvcCA9PT0gJ2luc3RhbmNlb2YnIHx8ICh0aGlzLmNvbnRleHQuYWxsb3dJbiAmJiBvcCA9PT0gJ2luJykpID8gNyA6IDA7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBwcmVjZWRlbmNlID0gMDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHByZWNlZGVuY2U7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUJpbmFyeUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlRXhwb25lbnRpYXRpb25FeHByZXNzaW9uKTtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIgcHJlYyA9IHRoaXMuYmluYXJ5UHJlY2VkZW5jZSh0b2tlbik7XG5cdCAgICAgICAgaWYgKHByZWMgPiAwKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdmFyIG1hcmtlcnMgPSBbc3RhcnRUb2tlbiwgdGhpcy5sb29rYWhlYWRdO1xuXHQgICAgICAgICAgICB2YXIgbGVmdCA9IGV4cHI7XG5cdCAgICAgICAgICAgIHZhciByaWdodCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlRXhwb25lbnRpYXRpb25FeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgdmFyIHN0YWNrID0gW2xlZnQsIHRva2VuLnZhbHVlLCByaWdodF07XG5cdCAgICAgICAgICAgIHZhciBwcmVjZWRlbmNlcyA9IFtwcmVjXTtcblx0ICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgICAgIHByZWMgPSB0aGlzLmJpbmFyeVByZWNlZGVuY2UodGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHByZWMgPD0gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy8gUmVkdWNlOiBtYWtlIGEgYmluYXJ5IGV4cHJlc3Npb24gZnJvbSB0aGUgdGhyZWUgdG9wbW9zdCBlbnRyaWVzLlxuXHQgICAgICAgICAgICAgICAgd2hpbGUgKChzdGFjay5sZW5ndGggPiAyKSAmJiAocHJlYyA8PSBwcmVjZWRlbmNlc1twcmVjZWRlbmNlcy5sZW5ndGggLSAxXSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICByaWdodCA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBvcGVyYXRvciA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHByZWNlZGVuY2VzLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICBtYXJrZXJzLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUobWFya2Vyc1ttYXJrZXJzLmxlbmd0aCAtIDFdKTtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQmluYXJ5RXhwcmVzc2lvbihvcGVyYXRvciwgbGVmdCwgcmlnaHQpKSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyBTaGlmdC5cblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGhpcy5uZXh0VG9rZW4oKS52YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICBwcmVjZWRlbmNlcy5wdXNoKHByZWMpO1xuXHQgICAgICAgICAgICAgICAgbWFya2Vycy5wdXNoKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24pKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyBGaW5hbCByZWR1Y2UgdG8gY2xlYW4tdXAgdGhlIHN0YWNrLlxuXHQgICAgICAgICAgICB2YXIgaSA9IHN0YWNrLmxlbmd0aCAtIDE7XG5cdCAgICAgICAgICAgIGV4cHIgPSBzdGFja1tpXTtcblx0ICAgICAgICAgICAgdmFyIGxhc3RNYXJrZXIgPSBtYXJrZXJzLnBvcCgpO1xuXHQgICAgICAgICAgICB3aGlsZSAoaSA+IDEpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBtYXJrZXJzLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgdmFyIGxhc3RMaW5lU3RhcnQgPSBsYXN0TWFya2VyICYmIGxhc3RNYXJrZXIubGluZVN0YXJ0O1xuXHQgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZShtYXJrZXIsIGxhc3RMaW5lU3RhcnQpO1xuXHQgICAgICAgICAgICAgICAgdmFyIG9wZXJhdG9yID0gc3RhY2tbaSAtIDFdO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQmluYXJ5RXhwcmVzc2lvbihvcGVyYXRvciwgc3RhY2tbaSAtIDJdLCBleHByKSk7XG5cdCAgICAgICAgICAgICAgICBpIC09IDI7XG5cdCAgICAgICAgICAgICAgICBsYXN0TWFya2VyID0gbWFya2VyO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNvbmRpdGlvbmFsLW9wZXJhdG9yXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQ29uZGl0aW9uYWxFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGFydFRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUJpbmFyeUV4cHJlc3Npb24pO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCc/JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dJbiA9IHRoaXMuY29udGV4dC5hbGxvd0luO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IHRydWU7XG5cdCAgICAgICAgICAgIHZhciBjb25zZXF1ZW50ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gcHJldmlvdXNBbGxvd0luO1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnOicpO1xuXHQgICAgICAgICAgICB2YXIgYWx0ZXJuYXRlID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5Db25kaXRpb25hbEV4cHJlc3Npb24oZXhwciwgY29uc2VxdWVudCwgYWx0ZXJuYXRlKSk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXNzaWdubWVudC1vcGVyYXRvcnNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuY2hlY2tQYXR0ZXJuUGFyYW0gPSBmdW5jdGlvbiAob3B0aW9ucywgcGFyYW0pIHtcblx0ICAgICAgICBzd2l0Y2ggKHBhcmFtLnR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcjpcblx0ICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVQYXJhbShvcHRpb25zLCBwYXJhbSwgcGFyYW0ubmFtZSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguUmVzdEVsZW1lbnQ6XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUGF0dGVyblBhcmFtKG9wdGlvbnMsIHBhcmFtLmFyZ3VtZW50KTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5Bc3NpZ25tZW50UGF0dGVybjpcblx0ICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tQYXR0ZXJuUGFyYW0ob3B0aW9ucywgcGFyYW0ubGVmdCk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguQXJyYXlQYXR0ZXJuOlxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbS5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5lbGVtZW50c1tpXSAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUGF0dGVyblBhcmFtKG9wdGlvbnMsIHBhcmFtLmVsZW1lbnRzW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguT2JqZWN0UGF0dGVybjpcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW0ucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tQYXR0ZXJuUGFyYW0ob3B0aW9ucywgcGFyYW0ucHJvcGVydGllc1tpXS52YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBvcHRpb25zLnNpbXBsZSA9IG9wdGlvbnMuc2ltcGxlICYmIChwYXJhbSBpbnN0YW5jZW9mIE5vZGUuSWRlbnRpZmllcik7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5yZWludGVycHJldEFzQ292ZXJGb3JtYWxzTGlzdCA9IGZ1bmN0aW9uIChleHByKSB7XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IFtleHByXTtcblx0ICAgICAgICB2YXIgb3B0aW9ucztcblx0ICAgICAgICB2YXIgYXN5bmNBcnJvdyA9IGZhbHNlO1xuXHQgICAgICAgIHN3aXRjaCAoZXhwci50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXI6XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyOlxuXHQgICAgICAgICAgICAgICAgcGFyYW1zID0gZXhwci5wYXJhbXM7XG5cdCAgICAgICAgICAgICAgICBhc3luY0Fycm93ID0gZXhwci5hc3luYztcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIG9wdGlvbnMgPSB7XG5cdCAgICAgICAgICAgIHNpbXBsZTogdHJ1ZSxcblx0ICAgICAgICAgICAgcGFyYW1TZXQ6IHt9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7ICsraSkge1xuXHQgICAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbaV07XG5cdCAgICAgICAgICAgIGlmIChwYXJhbS50eXBlID09PSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudFBhdHRlcm4pIHtcblx0ICAgICAgICAgICAgICAgIGlmIChwYXJhbS5yaWdodC50eXBlID09PSBzeW50YXhfMS5TeW50YXguWWllbGRFeHByZXNzaW9uKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnJpZ2h0LmFyZ3VtZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBwYXJhbS5yaWdodC50eXBlID0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXI7XG5cdCAgICAgICAgICAgICAgICAgICAgcGFyYW0ucmlnaHQubmFtZSA9ICd5aWVsZCc7XG5cdCAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBhcmFtLnJpZ2h0LmFyZ3VtZW50O1xuXHQgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJhbS5yaWdodC5kZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChhc3luY0Fycm93ICYmIHBhcmFtLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyICYmIHBhcmFtLm5hbWUgPT09ICdhd2FpdCcpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuY2hlY2tQYXR0ZXJuUGFyYW0ob3B0aW9ucywgcGFyYW0pO1xuXHQgICAgICAgICAgICBwYXJhbXNbaV0gPSBwYXJhbTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgfHwgIXRoaXMuY29udGV4dC5hbGxvd1lpZWxkKSB7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgKytpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbaV07XG5cdCAgICAgICAgICAgICAgICBpZiAocGFyYW0udHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LllpZWxkRXhwcmVzc2lvbikge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChvcHRpb25zLm1lc3NhZ2UgPT09IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UGFyYW1EdXBlKSB7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMuY29udGV4dC5zdHJpY3QgPyBvcHRpb25zLnN0cmljdGVkIDogb3B0aW9ucy5maXJzdFJlc3RyaWN0ZWQ7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG9wdGlvbnMubWVzc2FnZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHNpbXBsZTogb3B0aW9ucy5zaW1wbGUsXG5cdCAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuXHQgICAgICAgICAgICBzdHJpY3RlZDogb3B0aW9ucy5zdHJpY3RlZCxcblx0ICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkOiBvcHRpb25zLmZpcnN0UmVzdHJpY3RlZCxcblx0ICAgICAgICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlXG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGV4cHI7XG5cdCAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCAmJiB0aGlzLm1hdGNoS2V5d29yZCgneWllbGQnKSkge1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZVlpZWxkRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gc3RhcnRUb2tlbjtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMucGFyc2VDb25kaXRpb25hbEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLyAmJiAodG9rZW4ubGluZU51bWJlciA9PT0gdGhpcy5sb29rYWhlYWQubGluZU51bWJlcikgJiYgdG9rZW4udmFsdWUgPT09ICdhc3luYycpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvb2thaGVhZC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gfHwgdGhpcy5tYXRjaEtleXdvcmQoJ3lpZWxkJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgYXJnID0gdGhpcy5wYXJzZVByaW1hcnlFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oYXJnKTtcblx0ICAgICAgICAgICAgICAgICAgICBleHByID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IFthcmddLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogdHJ1ZVxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGV4cHIudHlwZSA9PT0gQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlciB8fCB0aGlzLm1hdGNoKCc9PicpKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJvdy1mdW5jdGlvbi1kZWZpbml0aW9uc1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHZhciBpc0FzeW5jID0gZXhwci5hc3luYztcblx0ICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gdGhpcy5yZWludGVycHJldEFzQ292ZXJGb3JtYWxzTGlzdChleHByKTtcblx0ICAgICAgICAgICAgICAgIGlmIChsaXN0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzTGluZVRlcm1pbmF0b3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c1N0cmljdCA9IHRoaXMuY29udGV4dC5zdHJpY3Q7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dTdHJpY3REaXJlY3RpdmUgPSB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmU7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gbGlzdC5zaW1wbGU7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dZaWVsZCA9IHRoaXMuY29udGV4dC5hbGxvd1lpZWxkO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c0F3YWl0ID0gdGhpcy5jb250ZXh0LmF3YWl0O1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBpc0FzeW5jO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbik7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJz0+Jyk7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGJvZHkgPSB2b2lkIDA7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJ3snKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNBbGxvd0luID0gdGhpcy5jb250ZXh0LmFsbG93SW47XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IHRoaXMucGFyc2VGdW5jdGlvblNvdXJjZUVsZW1lbnRzKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gcHJldmlvdXNBbGxvd0luO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IGJvZHkudHlwZSAhPT0gc3ludGF4XzEuU3ludGF4LkJsb2NrU3RhdGVtZW50O1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGxpc3QuZmlyc3RSZXN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obGlzdC5maXJzdFJlc3RyaWN0ZWQsIGxpc3QubWVzc2FnZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGxpc3Quc3RyaWN0ZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbihsaXN0LnN0cmljdGVkLCBsaXN0Lm1lc3NhZ2UpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBleHByID0gaXNBc3luYyA/IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXN5bmNBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihsaXN0LnBhcmFtcywgYm9keSwgZXhwcmVzc2lvbikpIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihsaXN0LnBhcmFtcywgYm9keSwgZXhwcmVzc2lvbikpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJpY3QgPSBwcmV2aW91c1N0cmljdDtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmUgPSBwcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hd2FpdCA9IHByZXZpb3VzQXdhaXQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaEFzc2lnbigpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRMSFNJbkFzc2lnbm1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBleHByLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGV4cHI7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZChpZC5uYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RMSFNBc3NpZ25tZW50KTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZChpZC5uYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnPScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHIpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG9wZXJhdG9yID0gdG9rZW4udmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLkFzc2lnbm1lbnRFeHByZXNzaW9uKG9wZXJhdG9yLCBleHByLCByaWdodCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNvbW1hLW9wZXJhdG9yXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnRUb2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHZhciBleHByID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJywnKSkge1xuXHQgICAgICAgICAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTtcblx0ICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaChleHByKTtcblx0ICAgICAgICAgICAgd2hpbGUgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJywnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2godGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbikpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5TZXF1ZW5jZUV4cHJlc3Npb24oZXhwcmVzc2lvbnMpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYmxvY2tcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gdHJ1ZTtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gNCAvKiBLZXl3b3JkICovKSB7XG5cdCAgICAgICAgICAgIHN3aXRjaCAodGhpcy5sb29rYWhlYWQudmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2V4cG9ydCc6XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNNb2R1bGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCwgbWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsRXhwb3J0RGVjbGFyYXRpb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRXhwb3J0RGVjbGFyYXRpb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2ltcG9ydCc6XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNNb2R1bGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCwgbWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsSW1wb3J0RGVjbGFyYXRpb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlSW1wb3J0RGVjbGFyYXRpb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnN0Jzpcblx0ICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlTGV4aWNhbERlY2xhcmF0aW9uKHsgaW5Gb3I6IGZhbHNlIH0pO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdjbGFzcyc6XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUNsYXNzRGVjbGFyYXRpb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2xldCc6XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5pc0xleGljYWxEZWNsYXJhdGlvbigpID8gdGhpcy5wYXJzZUxleGljYWxEZWNsYXJhdGlvbih7IGluRm9yOiBmYWxzZSB9KSA6IHRoaXMucGFyc2VTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUJsb2NrID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ3snKTtcblx0ICAgICAgICB2YXIgYmxvY2sgPSBbXTtcblx0ICAgICAgICB3aGlsZSAodHJ1ZSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBibG9jay5wdXNoKHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ30nKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5CbG9ja1N0YXRlbWVudChibG9jaykpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxldC1hbmQtY29uc3QtZGVjbGFyYXRpb25zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlTGV4aWNhbEJpbmRpbmcgPSBmdW5jdGlvbiAoa2luZCwgb3B0aW9ucykge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IFtdO1xuXHQgICAgICAgIHZhciBpZCA9IHRoaXMucGFyc2VQYXR0ZXJuKHBhcmFtcywga2luZCk7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgaWQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKGlkLm5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RWYXJOYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgaWYgKGtpbmQgPT09ICdjb25zdCcpIHtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoS2V5d29yZCgnaW4nKSAmJiAhdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdvZicpKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnPScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICBpbml0ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5EZWNsYXJhdGlvbk1pc3NpbmdJbml0aWFsaXplciwgJ2NvbnN0Jyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAoKCFvcHRpb25zLmluRm9yICYmIGlkLnR5cGUgIT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyKSB8fCB0aGlzLm1hdGNoKCc9JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJz0nKTtcblx0ICAgICAgICAgICAgaW5pdCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5WYXJpYWJsZURlY2xhcmF0b3IoaWQsIGluaXQpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQmluZGluZ0xpc3QgPSBmdW5jdGlvbiAoa2luZCwgb3B0aW9ucykge1xuXHQgICAgICAgIHZhciBsaXN0ID0gW3RoaXMucGFyc2VMZXhpY2FsQmluZGluZyhraW5kLCBvcHRpb25zKV07XG5cdCAgICAgICAgd2hpbGUgKHRoaXMubWF0Y2goJywnKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBsaXN0LnB1c2godGhpcy5wYXJzZUxleGljYWxCaW5kaW5nKGtpbmQsIG9wdGlvbnMpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGxpc3Q7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5pc0xleGljYWxEZWNsYXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnNjYW5uZXIuc2F2ZVN0YXRlKCk7XG5cdCAgICAgICAgdGhpcy5zY2FubmVyLnNjYW5Db21tZW50cygpO1xuXHQgICAgICAgIHZhciBuZXh0ID0gdGhpcy5zY2FubmVyLmxleCgpO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5yZXN0b3JlU3RhdGUoc3RhdGUpO1xuXHQgICAgICAgIHJldHVybiAobmV4dC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pIHx8XG5cdCAgICAgICAgICAgIChuZXh0LnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiBuZXh0LnZhbHVlID09PSAnWycpIHx8XG5cdCAgICAgICAgICAgIChuZXh0LnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiBuZXh0LnZhbHVlID09PSAneycpIHx8XG5cdCAgICAgICAgICAgIChuZXh0LnR5cGUgPT09IDQgLyogS2V5d29yZCAqLyAmJiBuZXh0LnZhbHVlID09PSAnbGV0JykgfHxcblx0ICAgICAgICAgICAgKG5leHQudHlwZSA9PT0gNCAvKiBLZXl3b3JkICovICYmIG5leHQudmFsdWUgPT09ICd5aWVsZCcpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VMZXhpY2FsRGVjbGFyYXRpb24gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGtpbmQgPSB0aGlzLm5leHRUb2tlbigpLnZhbHVlO1xuXHQgICAgICAgIGFzc2VydF8xLmFzc2VydChraW5kID09PSAnbGV0JyB8fCBraW5kID09PSAnY29uc3QnLCAnTGV4aWNhbCBkZWNsYXJhdGlvbiBtdXN0IGJlIGVpdGhlciBsZXQgb3IgY29uc3QnKTtcblx0ICAgICAgICB2YXIgZGVjbGFyYXRpb25zID0gdGhpcy5wYXJzZUJpbmRpbmdMaXN0KGtpbmQsIG9wdGlvbnMpO1xuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCBraW5kKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGVzdHJ1Y3R1cmluZy1iaW5kaW5nLXBhdHRlcm5zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQmluZGluZ1Jlc3RFbGVtZW50ID0gZnVuY3Rpb24gKHBhcmFtcywga2luZCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJy4uLicpO1xuXHQgICAgICAgIHZhciBhcmcgPSB0aGlzLnBhcnNlUGF0dGVybihwYXJhbXMsIGtpbmQpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlJlc3RFbGVtZW50KGFyZykpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VBcnJheVBhdHRlcm4gPSBmdW5jdGlvbiAocGFyYW1zLCBraW5kKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnWycpO1xuXHQgICAgICAgIHZhciBlbGVtZW50cyA9IFtdO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5tYXRjaCgnXScpKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKG51bGwpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJy4uLicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaCh0aGlzLnBhcnNlQmluZGluZ1Jlc3RFbGVtZW50KHBhcmFtcywga2luZCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaCh0aGlzLnBhcnNlUGF0dGVybldpdGhEZWZhdWx0KHBhcmFtcywga2luZCkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCddJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCddJyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXJyYXlQYXR0ZXJuKGVsZW1lbnRzKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVByb3BlcnR5UGF0dGVybiA9IGZ1bmN0aW9uIChwYXJhbXMsIGtpbmQpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBjb21wdXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBzaG9ydGhhbmQgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgbWV0aG9kID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIGtleTtcblx0ICAgICAgICB2YXIgdmFsdWU7XG5cdCAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLykge1xuXHQgICAgICAgICAgICB2YXIga2V5VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICB2YXIgaW5pdCA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWRlbnRpZmllcihrZXlUb2tlbi52YWx1ZSkpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnPScpKSB7XG5cdCAgICAgICAgICAgICAgICBwYXJhbXMucHVzaChrZXlUb2tlbik7XG5cdCAgICAgICAgICAgICAgICBzaG9ydGhhbmQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHZhciBleHByID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoa2V5VG9rZW4pLCBuZXcgTm9kZS5Bc3NpZ25tZW50UGF0dGVybihpbml0LCBleHByKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMubWF0Y2goJzonKSkge1xuXHQgICAgICAgICAgICAgICAgcGFyYW1zLnB1c2goa2V5VG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgc2hvcnRoYW5kID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gaW5pdDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCc6Jyk7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VQYXR0ZXJuV2l0aERlZmF1bHQocGFyYW1zLCBraW5kKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnOicpO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VQYXR0ZXJuV2l0aERlZmF1bHQocGFyYW1zLCBraW5kKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuUHJvcGVydHkoJ2luaXQnLCBrZXksIGNvbXB1dGVkLCB2YWx1ZSwgbWV0aG9kLCBzaG9ydGhhbmQpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlT2JqZWN0UGF0dGVybiA9IGZ1bmN0aW9uIChwYXJhbXMsIGtpbmQpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gW107XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ3snKTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2godGhpcy5wYXJzZVByb3BlcnR5UGF0dGVybihwYXJhbXMsIGtpbmQpKTtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcsJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ30nKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5PYmplY3RQYXR0ZXJuKHByb3BlcnRpZXMpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlUGF0dGVybiA9IGZ1bmN0aW9uIChwYXJhbXMsIGtpbmQpIHtcblx0ICAgICAgICB2YXIgcGF0dGVybjtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnWycpKSB7XG5cdCAgICAgICAgICAgIHBhdHRlcm4gPSB0aGlzLnBhcnNlQXJyYXlQYXR0ZXJuKHBhcmFtcywga2luZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJ3snKSkge1xuXHQgICAgICAgICAgICBwYXR0ZXJuID0gdGhpcy5wYXJzZU9iamVjdFBhdHRlcm4ocGFyYW1zLCBraW5kKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnbGV0JykgJiYgKGtpbmQgPT09ICdjb25zdCcgfHwga2luZCA9PT0gJ2xldCcpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkLCBtZXNzYWdlc18xLk1lc3NhZ2VzLkxldEluTGV4aWNhbEJpbmRpbmcpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHBhcmFtcy5wdXNoKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgcGF0dGVybiA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoa2luZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBwYXR0ZXJuO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VQYXR0ZXJuV2l0aERlZmF1bHQgPSBmdW5jdGlvbiAocGFyYW1zLCBraW5kKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIgcGF0dGVybiA9IHRoaXMucGFyc2VQYXR0ZXJuKHBhcmFtcywga2luZCk7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJz0nKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1lpZWxkID0gdGhpcy5jb250ZXh0LmFsbG93WWllbGQ7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgICAgICBwYXR0ZXJuID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuQXNzaWdubWVudFBhdHRlcm4ocGF0dGVybiwgcmlnaHQpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHBhdHRlcm47XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdmFyaWFibGUtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyID0gZnVuY3Rpb24gKGtpbmQpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDQgLyogS2V5d29yZCAqLyAmJiB0b2tlbi52YWx1ZSA9PT0gJ3lpZWxkJykge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSAhPT0gMyAvKiBJZGVudGlmaWVyICovKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHRva2VuLnR5cGUgPT09IDQgLyogS2V5d29yZCAqLyAmJiB0aGlzLnNjYW5uZXIuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgfHwgdG9rZW4udmFsdWUgIT09ICdsZXQnIHx8IGtpbmQgIT09ICd2YXInKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAoKHRoaXMuY29udGV4dC5pc01vZHVsZSB8fCB0aGlzLmNvbnRleHQuYXdhaXQpICYmIHRva2VuLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLyAmJiB0b2tlbi52YWx1ZSA9PT0gJ2F3YWl0Jykge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWRlbnRpZmllcih0b2tlbi52YWx1ZSkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSBbXTtcblx0ICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcnNlUGF0dGVybihwYXJhbXMsICd2YXInKTtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBpZC50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcikge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQoaWQubmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFZhck5hbWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBpbml0ID0gbnVsbDtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnPScpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGluaXQgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAoaWQudHlwZSAhPT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIgJiYgIW9wdGlvbnMuaW5Gb3IpIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJz0nKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdG9yKGlkLCBpbml0KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgb3B0ID0geyBpbkZvcjogb3B0aW9ucy5pbkZvciB9O1xuXHQgICAgICAgIHZhciBsaXN0ID0gW107XG5cdCAgICAgICAgbGlzdC5wdXNoKHRoaXMucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uKG9wdCkpO1xuXHQgICAgICAgIHdoaWxlICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgbGlzdC5wdXNoKHRoaXMucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uKG9wdCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gbGlzdDtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVmFyaWFibGVTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3ZhcicpO1xuXHQgICAgICAgIHZhciBkZWNsYXJhdGlvbnMgPSB0aGlzLnBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoeyBpbkZvcjogZmFsc2UgfSk7XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsICd2YXInKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZW1wdHktc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRW1wdHlTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnOycpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkVtcHR5U3RhdGVtZW50KCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWV4cHJlc3Npb24tc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBleHByID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5FeHByZXNzaW9uU3RhdGVtZW50KGV4cHIpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pZi1zdGF0ZW1lbnRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VJZkNsYXVzZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiB0aGlzLm1hdGNoS2V5d29yZCgnZnVuY3Rpb24nKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RGdW5jdGlvbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUlmU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGNvbnNlcXVlbnQ7XG5cdCAgICAgICAgdmFyIGFsdGVybmF0ZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdpZicpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgdmFyIHRlc3QgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpICYmIHRoaXMuY29uZmlnLnRvbGVyYW50KSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgIGNvbnNlcXVlbnQgPSB0aGlzLmZpbmFsaXplKHRoaXMuY3JlYXRlTm9kZSgpLCBuZXcgTm9kZS5FbXB0eVN0YXRlbWVudCgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgIGNvbnNlcXVlbnQgPSB0aGlzLnBhcnNlSWZDbGF1c2UoKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdlbHNlJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICBhbHRlcm5hdGUgPSB0aGlzLnBhcnNlSWZDbGF1c2UoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5JZlN0YXRlbWVudCh0ZXN0LCBjb25zZXF1ZW50LCBhbHRlcm5hdGUpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1kby13aGlsZS1zdGF0ZW1lbnRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VEb1doaWxlU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdkbycpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0luSXRlcmF0aW9uID0gdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiA9IHRydWU7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uID0gcHJldmlvdXNJbkl0ZXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3doaWxlJyk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICB2YXIgdGVzdCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykgJiYgdGhpcy5jb25maWcudG9sZXJhbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCc7JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRG9XaGlsZVN0YXRlbWVudChib2R5LCB0ZXN0KSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtd2hpbGUtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlV2hpbGVTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgYm9keTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3doaWxlJyk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICB2YXIgdGVzdCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykgJiYgdGhpcy5jb25maWcudG9sZXJhbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICAgICAgYm9keSA9IHRoaXMuZmluYWxpemUodGhpcy5jcmVhdGVOb2RlKCksIG5ldyBOb2RlLkVtcHR5U3RhdGVtZW50KCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJyknKTtcblx0ICAgICAgICAgICAgdmFyIHByZXZpb3VzSW5JdGVyYXRpb24gPSB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb247XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiA9IHRydWU7XG5cdCAgICAgICAgICAgIGJvZHkgPSB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiA9IHByZXZpb3VzSW5JdGVyYXRpb247XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLldoaWxlU3RhdGVtZW50KHRlc3QsIGJvZHkpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1mb3Itc3RhdGVtZW50XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1mb3ItaW4tYW5kLWZvci1vZi1zdGF0ZW1lbnRzXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRm9yU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBpbml0ID0gbnVsbDtcblx0ICAgICAgICB2YXIgdGVzdCA9IG51bGw7XG5cdCAgICAgICAgdmFyIHVwZGF0ZSA9IG51bGw7XG5cdCAgICAgICAgdmFyIGZvckluID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgbGVmdCwgcmlnaHQ7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2ZvcicpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJzsnKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCd2YXInKSkge1xuXHQgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c0FsbG93SW4gPSB0aGlzLmNvbnRleHQuYWxsb3dJbjtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB2YXIgZGVjbGFyYXRpb25zID0gdGhpcy5wYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KHsgaW5Gb3I6IHRydWUgfSk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IHByZXZpb3VzQWxsb3dJbjtcblx0ICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxICYmIHRoaXMubWF0Y2hLZXl3b3JkKCdpbicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGRlY2wgPSBkZWNsYXJhdGlvbnNbMF07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2wuaW5pdCAmJiAoZGVjbC5pZC50eXBlID09PSBzeW50YXhfMS5TeW50YXguQXJyYXlQYXR0ZXJuIHx8IGRlY2wuaWQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4Lk9iamVjdFBhdHRlcm4gfHwgdGhpcy5jb250ZXh0LnN0cmljdCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuRm9ySW5PZkxvb3BJbml0aWFsaXplciwgJ2Zvci1pbicpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpbml0ID0gdGhpcy5maW5hbGl6ZShpbml0LCBuZXcgTm9kZS5WYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9ucywgJ3ZhcicpKTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBpbml0O1xuXHQgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICBpbml0ID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDEgJiYgZGVjbGFyYXRpb25zWzBdLmluaXQgPT09IG51bGwgJiYgdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdvZicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUoaW5pdCwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsICd2YXInKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gaW5pdDtcblx0ICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIGluaXQgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgIGZvckluID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBpbml0ID0gdGhpcy5maW5hbGl6ZShpbml0LCBuZXcgTm9kZS5WYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9ucywgJ3ZhcicpKTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnOycpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdjb25zdCcpIHx8IHRoaXMubWF0Y2hLZXl3b3JkKCdsZXQnKSkge1xuXHQgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgICAgICAgICAgdmFyIGtpbmQgPSB0aGlzLm5leHRUb2tlbigpLnZhbHVlO1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHRoaXMubG9va2FoZWFkLnZhbHVlID09PSAnaW4nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUoaW5pdCwgbmV3IE5vZGUuSWRlbnRpZmllcihraW5kKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gaW5pdDtcblx0ICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNBbGxvd0luID0gdGhpcy5jb250ZXh0LmFsbG93SW47XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZGVjbGFyYXRpb25zID0gdGhpcy5wYXJzZUJpbmRpbmdMaXN0KGtpbmQsIHsgaW5Gb3I6IHRydWUgfSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSBwcmV2aW91c0FsbG93SW47XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDEgJiYgZGVjbGFyYXRpb25zWzBdLmluaXQgPT09IG51bGwgJiYgdGhpcy5tYXRjaEtleXdvcmQoJ2luJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUoaW5pdCwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsIGtpbmQpKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGluaXQ7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDEgJiYgZGVjbGFyYXRpb25zWzBdLmluaXQgPT09IG51bGwgJiYgdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdvZicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmZpbmFsaXplKGluaXQsIG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCBraW5kKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBpbml0O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9ySW4gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gdGhpcy5maW5hbGl6ZShpbml0LCBuZXcgTm9kZS5WYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9ucywga2luZCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHZhciBpbml0U3RhcnRUb2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dJbiA9IHRoaXMuY29udGV4dC5hbGxvd0luO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gcHJldmlvdXNBbGxvd0luO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdpbicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0IHx8IGluaXQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRFeHByZXNzaW9uKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRMSFNJbkZvckluKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihpbml0KTtcblx0ICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gaW5pdDtcblx0ICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ29mJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgfHwgaW5pdC50eXBlID09PSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudEV4cHJlc3Npb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZExIU0luRm9yTG9vcCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oaW5pdCk7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGluaXQ7XG5cdCAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICBpbml0ID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgICAgICBmb3JJbiA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJywnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5pdFNlcSA9IFtpbml0XTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMubWF0Y2goJywnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTZXEucHVzaCh0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoaW5pdFN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5TZXF1ZW5jZUV4cHJlc3Npb24oaW5pdFNlcSkpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnOycpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0eXBlb2YgbGVmdCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCc7JykpIHtcblx0ICAgICAgICAgICAgICAgIHRlc3QgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCc7Jyk7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgICAgICB1cGRhdGUgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBib2R5O1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpICYmIHRoaXMuY29uZmlnLnRvbGVyYW50KSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgIGJvZHkgPSB0aGlzLmZpbmFsaXplKHRoaXMuY3JlYXRlTm9kZSgpLCBuZXcgTm9kZS5FbXB0eVN0YXRlbWVudCgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgIHZhciBwcmV2aW91c0luSXRlcmF0aW9uID0gdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gPSB0cnVlO1xuXHQgICAgICAgICAgICBib2R5ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VTdGF0ZW1lbnQpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gPSBwcmV2aW91c0luSXRlcmF0aW9uO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gKHR5cGVvZiBsZWZ0ID09PSAndW5kZWZpbmVkJykgP1xuXHQgICAgICAgICAgICB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkZvclN0YXRlbWVudChpbml0LCB0ZXN0LCB1cGRhdGUsIGJvZHkpKSA6XG5cdCAgICAgICAgICAgIGZvckluID8gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5Gb3JJblN0YXRlbWVudChsZWZ0LCByaWdodCwgYm9keSkpIDpcblx0ICAgICAgICAgICAgICAgIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRm9yT2ZTdGF0ZW1lbnQobGVmdCwgcmlnaHQsIGJvZHkpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jb250aW51ZS1zdGF0ZW1lbnRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VDb250aW51ZVN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnY29udGludWUnKTtcblx0ICAgICAgICB2YXIgbGFiZWwgPSBudWxsO1xuXHQgICAgICAgIGlmICh0aGlzLmxvb2thaGVhZC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgIXRoaXMuaGFzTGluZVRlcm1pbmF0b3IpIHtcblx0ICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICBsYWJlbCA9IGlkO1xuXHQgICAgICAgICAgICB2YXIga2V5ID0gJyQnICsgaWQubmFtZTtcblx0ICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb250ZXh0LmxhYmVsU2V0LCBrZXkpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5Vbmtub3duTGFiZWwsIGlkLm5hbWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIGlmIChsYWJlbCA9PT0gbnVsbCAmJiAhdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLklsbGVnYWxDb250aW51ZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkNvbnRpbnVlU3RhdGVtZW50KGxhYmVsKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYnJlYWstc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQnJlYWtTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2JyZWFrJyk7XG5cdCAgICAgICAgdmFyIGxhYmVsID0gbnVsbDtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovICYmICF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yKSB7XG5cdCAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgdmFyIGtleSA9ICckJyArIGlkLm5hbWU7XG5cdCAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29udGV4dC5sYWJlbFNldCwga2V5KSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5rbm93bkxhYmVsLCBpZC5uYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBsYWJlbCA9IGlkO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICBpZiAobGFiZWwgPT09IG51bGwgJiYgIXRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiAmJiAhdGhpcy5jb250ZXh0LmluU3dpdGNoKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLklsbGVnYWxCcmVhayk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkJyZWFrU3RhdGVtZW50KGxhYmVsKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmV0dXJuLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVJldHVyblN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keSkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsUmV0dXJuKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3JldHVybicpO1xuXHQgICAgICAgIHZhciBoYXNBcmd1bWVudCA9ICghdGhpcy5tYXRjaCgnOycpICYmICF0aGlzLm1hdGNoKCd9JykgJiZcblx0ICAgICAgICAgICAgIXRoaXMuaGFzTGluZVRlcm1pbmF0b3IgJiYgdGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMiAvKiBFT0YgKi8pIHx8XG5cdCAgICAgICAgICAgIHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDggLyogU3RyaW5nTGl0ZXJhbCAqLyB8fFxuXHQgICAgICAgICAgICB0aGlzLmxvb2thaGVhZC50eXBlID09PSAxMCAvKiBUZW1wbGF0ZSAqLztcblx0ICAgICAgICB2YXIgYXJndW1lbnQgPSBoYXNBcmd1bWVudCA/IHRoaXMucGFyc2VFeHByZXNzaW9uKCkgOiBudWxsO1xuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlJldHVyblN0YXRlbWVudChhcmd1bWVudCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXdpdGgtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlV2l0aFN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RNb2RlV2l0aCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGJvZHk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCd3aXRoJyk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2goJyknKSAmJiB0aGlzLmNvbmZpZy50b2xlcmFudCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgICAgICBib2R5ID0gdGhpcy5maW5hbGl6ZSh0aGlzLmNyZWF0ZU5vZGUoKSwgbmV3IE5vZGUuRW1wdHlTdGF0ZW1lbnQoKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgICAgICBib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5XaXRoU3RhdGVtZW50KG9iamVjdCwgYm9keSkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN3aXRjaC1zdGF0ZW1lbnRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTd2l0Y2hDYXNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIHRlc3Q7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdkZWZhdWx0JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgdGVzdCA9IG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2Nhc2UnKTtcblx0ICAgICAgICAgICAgdGVzdCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCc6Jyk7XG5cdCAgICAgICAgdmFyIGNvbnNlcXVlbnQgPSBbXTtcblx0ICAgICAgICB3aGlsZSAodHJ1ZSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnfScpIHx8IHRoaXMubWF0Y2hLZXl3b3JkKCdkZWZhdWx0JykgfHwgdGhpcy5tYXRjaEtleXdvcmQoJ2Nhc2UnKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY29uc2VxdWVudC5wdXNoKHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuU3dpdGNoQ2FzZSh0ZXN0LCBjb25zZXF1ZW50KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVN3aXRjaFN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnc3dpdGNoJyk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICB2YXIgZGlzY3JpbWluYW50ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0luU3dpdGNoID0gdGhpcy5jb250ZXh0LmluU3dpdGNoO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pblN3aXRjaCA9IHRydWU7XG5cdCAgICAgICAgdmFyIGNhc2VzID0gW107XG5cdCAgICAgICAgdmFyIGRlZmF1bHRGb3VuZCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG5cdCAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdmFyIGNsYXVzZSA9IHRoaXMucGFyc2VTd2l0Y2hDYXNlKCk7XG5cdCAgICAgICAgICAgIGlmIChjbGF1c2UudGVzdCA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRGb3VuZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLk11bHRpcGxlRGVmYXVsdHNJblN3aXRjaCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBkZWZhdWx0Rm91bmQgPSB0cnVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNhc2VzLnB1c2goY2xhdXNlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ30nKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaW5Td2l0Y2ggPSBwcmV2aW91c0luU3dpdGNoO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlN3aXRjaFN0YXRlbWVudChkaXNjcmltaW5hbnQsIGNhc2VzKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbGFiZWxsZWQtc3RhdGVtZW50c1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUxhYmVsbGVkU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGV4cHIgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIHZhciBzdGF0ZW1lbnQ7XG5cdCAgICAgICAgaWYgKChleHByLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyKSAmJiB0aGlzLm1hdGNoKCc6JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgdmFyIGlkID0gZXhwcjtcblx0ICAgICAgICAgICAgdmFyIGtleSA9ICckJyArIGlkLm5hbWU7XG5cdCAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb250ZXh0LmxhYmVsU2V0LCBrZXkpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5SZWRlY2xhcmF0aW9uLCAnTGFiZWwnLCBpZC5uYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQubGFiZWxTZXRba2V5XSA9IHRydWU7XG5cdCAgICAgICAgICAgIHZhciBib2R5ID0gdm9pZCAwO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ2NsYXNzJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgYm9keSA9IHRoaXMucGFyc2VDbGFzc0RlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ2Z1bmN0aW9uJykpIHtcblx0ICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24oKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RGdW5jdGlvbik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWNsYXJhdGlvbi5nZW5lcmF0b3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLCBtZXNzYWdlc18xLk1lc3NhZ2VzLkdlbmVyYXRvckluTGVnYWN5Q29udGV4dCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBib2R5ID0gZGVjbGFyYXRpb247XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbnRleHQubGFiZWxTZXRba2V5XTtcblx0ICAgICAgICAgICAgc3RhdGVtZW50ID0gbmV3IE5vZGUuTGFiZWxlZFN0YXRlbWVudChpZCwgYm9keSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICAgICAgc3RhdGVtZW50ID0gbmV3IE5vZGUuRXhwcmVzc2lvblN0YXRlbWVudChleHByKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgc3RhdGVtZW50KTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10aHJvdy1zdGF0ZW1lbnRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VUaHJvd1N0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgndGhyb3cnKTtcblx0ICAgICAgICBpZiAodGhpcy5oYXNMaW5lVGVybWluYXRvcikge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5OZXdsaW5lQWZ0ZXJUaHJvdyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBhcmd1bWVudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVGhyb3dTdGF0ZW1lbnQoYXJndW1lbnQpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10cnktc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQ2F0Y2hDbGF1c2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2NhdGNoJyk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcGFyYW1zID0gW107XG5cdCAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJzZVBhdHRlcm4ocGFyYW1zKTtcblx0ICAgICAgICB2YXIgcGFyYW1NYXAgPSB7fTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICB2YXIga2V5ID0gJyQnICsgcGFyYW1zW2ldLnZhbHVlO1xuXHQgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmFtTWFwLCBrZXkpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5EdXBsaWNhdGVCaW5kaW5nLCBwYXJhbXNbaV0udmFsdWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHBhcmFtTWFwW2tleV0gPSB0cnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBwYXJhbS50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcikge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQocGFyYW0ubmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdENhdGNoVmFyaWFibGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlQmxvY2soKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5DYXRjaENsYXVzZShwYXJhbSwgYm9keSkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VGaW5hbGx5Q2xhdXNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnZmluYWxseScpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLnBhcnNlQmxvY2soKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVHJ5U3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCd0cnknKTtcblx0ICAgICAgICB2YXIgYmxvY2sgPSB0aGlzLnBhcnNlQmxvY2soKTtcblx0ICAgICAgICB2YXIgaGFuZGxlciA9IHRoaXMubWF0Y2hLZXl3b3JkKCdjYXRjaCcpID8gdGhpcy5wYXJzZUNhdGNoQ2xhdXNlKCkgOiBudWxsO1xuXHQgICAgICAgIHZhciBmaW5hbGl6ZXIgPSB0aGlzLm1hdGNoS2V5d29yZCgnZmluYWxseScpID8gdGhpcy5wYXJzZUZpbmFsbHlDbGF1c2UoKSA6IG51bGw7XG5cdCAgICAgICAgaWYgKCFoYW5kbGVyICYmICFmaW5hbGl6ZXIpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuTm9DYXRjaE9yRmluYWxseSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlRyeVN0YXRlbWVudChibG9jaywgaGFuZGxlciwgZmluYWxpemVyKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGVidWdnZXItc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRGVidWdnZXJTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2RlYnVnZ2VyJyk7XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRGVidWdnZXJTdGF0ZW1lbnQoKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS1zdGF0ZW1lbnRzLWFuZC1kZWNsYXJhdGlvbnNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXRlbWVudDtcblx0ICAgICAgICBzd2l0Y2ggKHRoaXMubG9va2FoZWFkLnR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSAxIC8qIEJvb2xlYW5MaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDUgLyogTnVsbExpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgNiAvKiBOdW1lcmljTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA4IC8qIFN0cmluZ0xpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgMTAgLyogVGVtcGxhdGUgKi86XG5cdCAgICAgICAgICAgIGNhc2UgOSAvKiBSZWd1bGFyRXhwcmVzc2lvbiAqLzpcblx0ICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSA3IC8qIFB1bmN0dWF0b3IgKi86XG5cdCAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmxvb2thaGVhZC52YWx1ZTtcblx0ICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUJsb2NrKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gJygnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSAnOycpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRW1wdHlTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAzIC8qIElkZW50aWZpZXIgKi86XG5cdCAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLm1hdGNoQXN5bmNGdW5jdGlvbigpID8gdGhpcy5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24oKSA6IHRoaXMucGFyc2VMYWJlbGxlZFN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgNCAvKiBLZXl3b3JkICovOlxuXHQgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmxvb2thaGVhZC52YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JyZWFrJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUJyZWFrU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnRpbnVlJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUNvbnRpbnVlU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlYnVnZ2VyJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZURlYnVnZ2VyU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RvJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZURvV2hpbGVTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnZm9yJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUZvclN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2lmJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUlmU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JldHVybic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VSZXR1cm5TdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3dpdGNoJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZVN3aXRjaFN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICd0aHJvdyc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VUaHJvd1N0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICd0cnknOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlVHJ5U3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Zhcic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VWYXJpYWJsZVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICd3aGlsZSc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VXaGlsZVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICd3aXRoJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZVdpdGhTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gc3RhdGVtZW50O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLWRlZmluaXRpb25zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRnVuY3Rpb25Tb3VyY2VFbGVtZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlRGlyZWN0aXZlUHJvbG9ndWVzKCk7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzTGFiZWxTZXQgPSB0aGlzLmNvbnRleHQubGFiZWxTZXQ7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzSW5JdGVyYXRpb24gPSB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb247XG5cdCAgICAgICAgdmFyIHByZXZpb3VzSW5Td2l0Y2ggPSB0aGlzLmNvbnRleHQuaW5Td2l0Y2g7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzSW5GdW5jdGlvbkJvZHkgPSB0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmxhYmVsU2V0ID0ge307XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluU3dpdGNoID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluRnVuY3Rpb25Cb2R5ID0gdHJ1ZTtcblx0ICAgICAgICB3aGlsZSAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMiAvKiBFT0YgKi8pIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgYm9keS5wdXNoKHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ30nKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQubGFiZWxTZXQgPSBwcmV2aW91c0xhYmVsU2V0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiA9IHByZXZpb3VzSW5JdGVyYXRpb247XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluU3dpdGNoID0gcHJldmlvdXNJblN3aXRjaDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkgPSBwcmV2aW91c0luRnVuY3Rpb25Cb2R5O1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkJsb2NrU3RhdGVtZW50KGJvZHkpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnZhbGlkYXRlUGFyYW0gPSBmdW5jdGlvbiAob3B0aW9ucywgcGFyYW0sIG5hbWUpIHtcblx0ICAgICAgICB2YXIga2V5ID0gJyQnICsgbmFtZTtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQobmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RyaWN0ZWQgPSBwYXJhbTtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMubWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UGFyYW1OYW1lO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucy5wYXJhbVNldCwga2V5KSkge1xuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5zdHJpY3RlZCA9IHBhcmFtO1xuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5tZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RQYXJhbUR1cGU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAoIW9wdGlvbnMuZmlyc3RSZXN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZChuYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5maXJzdFJlc3RyaWN0ZWQgPSBwYXJhbTtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMubWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UGFyYW1OYW1lO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc2Nhbm5lci5pc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQobmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlyc3RSZXN0cmljdGVkID0gcGFyYW07XG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLm1lc3NhZ2UgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFJlc2VydmVkV29yZDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucy5wYXJhbVNldCwga2V5KSkge1xuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5zdHJpY3RlZCA9IHBhcmFtO1xuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5tZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RQYXJhbUR1cGU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0ICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0aW9ucy5wYXJhbVNldCwga2V5LCB7IHZhbHVlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgb3B0aW9ucy5wYXJhbVNldFtrZXldID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVJlc3RFbGVtZW50ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJy4uLicpO1xuXHQgICAgICAgIHZhciBhcmcgPSB0aGlzLnBhcnNlUGF0dGVybihwYXJhbXMpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCc9JykpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuRGVmYXVsdFJlc3RQYXJhbWV0ZXIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5QYXJhbWV0ZXJBZnRlclJlc3RQYXJhbWV0ZXIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5SZXN0RWxlbWVudChhcmcpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRm9ybWFsUGFyYW1ldGVyID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgcGFyYW1zID0gW107XG5cdCAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5tYXRjaCgnLi4uJykgPyB0aGlzLnBhcnNlUmVzdEVsZW1lbnQocGFyYW1zKSA6IHRoaXMucGFyc2VQYXR0ZXJuV2l0aERlZmF1bHQocGFyYW1zKTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGFyYW0ob3B0aW9ucywgcGFyYW1zW2ldLCBwYXJhbXNbaV0udmFsdWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBvcHRpb25zLnNpbXBsZSA9IG9wdGlvbnMuc2ltcGxlICYmIChwYXJhbSBpbnN0YW5jZW9mIE5vZGUuSWRlbnRpZmllcik7XG5cdCAgICAgICAgb3B0aW9ucy5wYXJhbXMucHVzaChwYXJhbSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZvcm1hbFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoZmlyc3RSZXN0cmljdGVkKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnM7XG5cdCAgICAgICAgb3B0aW9ucyA9IHtcblx0ICAgICAgICAgICAgc2ltcGxlOiB0cnVlLFxuXHQgICAgICAgICAgICBwYXJhbXM6IFtdLFxuXHQgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQ6IGZpcnN0UmVzdHJpY3RlZFxuXHQgICAgICAgIH07XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICBvcHRpb25zLnBhcmFtU2V0ID0ge307XG5cdCAgICAgICAgICAgIHdoaWxlICh0aGlzLmxvb2thaGVhZC50eXBlICE9PSAyIC8qIEVPRiAqLykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUZvcm1hbFBhcmFtZXRlcihvcHRpb25zKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcsJyk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJyknKTtcblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICBzaW1wbGU6IG9wdGlvbnMuc2ltcGxlLFxuXHQgICAgICAgICAgICBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLFxuXHQgICAgICAgICAgICBzdHJpY3RlZDogb3B0aW9ucy5zdHJpY3RlZCxcblx0ICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkOiBvcHRpb25zLmZpcnN0UmVzdHJpY3RlZCxcblx0ICAgICAgICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlXG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLm1hdGNoQXN5bmNGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzeW5jJyk7XG5cdCAgICAgICAgaWYgKG1hdGNoKSB7XG5cdCAgICAgICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuc2Nhbm5lci5zYXZlU3RhdGUoKTtcblx0ICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNjYW5Db21tZW50cygpO1xuXHQgICAgICAgICAgICB2YXIgbmV4dCA9IHRoaXMuc2Nhbm5lci5sZXgoKTtcblx0ICAgICAgICAgICAgdGhpcy5zY2FubmVyLnJlc3RvcmVTdGF0ZShzdGF0ZSk7XG5cdCAgICAgICAgICAgIG1hdGNoID0gKHN0YXRlLmxpbmVOdW1iZXIgPT09IG5leHQubGluZU51bWJlcikgJiYgKG5leHQudHlwZSA9PT0gNCAvKiBLZXl3b3JkICovKSAmJiAobmV4dC52YWx1ZSA9PT0gJ2Z1bmN0aW9uJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBtYXRjaDtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbiA9IGZ1bmN0aW9uIChpZGVudGlmaWVySXNPcHRpb25hbCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGlzQXN5bmMgPSB0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzeW5jJyk7XG5cdCAgICAgICAgaWYgKGlzQXN5bmMpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdmdW5jdGlvbicpO1xuXHQgICAgICAgIHZhciBpc0dlbmVyYXRvciA9IGlzQXN5bmMgPyBmYWxzZSA6IHRoaXMubWF0Y2goJyonKTtcblx0ICAgICAgICBpZiAoaXNHZW5lcmF0b3IpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG1lc3NhZ2U7XG5cdCAgICAgICAgdmFyIGlkID0gbnVsbDtcblx0ICAgICAgICB2YXIgZmlyc3RSZXN0cmljdGVkID0gbnVsbDtcblx0ICAgICAgICBpZiAoIWlkZW50aWZpZXJJc09wdGlvbmFsIHx8ICF0aGlzLm1hdGNoKCcoJykpIHtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIGlkID0gdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0RnVuY3Rpb25OYW1lKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSB0b2tlbjtcblx0ICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RGdW5jdGlvbk5hbWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNjYW5uZXIuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGZpcnN0UmVzdHJpY3RlZCA9IHRva2VuO1xuXHQgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFJlc2VydmVkV29yZDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd0F3YWl0ID0gdGhpcy5jb250ZXh0LmF3YWl0O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBpc0FzeW5jO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gIWlzR2VuZXJhdG9yO1xuXHQgICAgICAgIHZhciBmb3JtYWxQYXJhbWV0ZXJzID0gdGhpcy5wYXJzZUZvcm1hbFBhcmFtZXRlcnMoZmlyc3RSZXN0cmljdGVkKTtcblx0ICAgICAgICB2YXIgcGFyYW1zID0gZm9ybWFsUGFyYW1ldGVycy5wYXJhbXM7XG5cdCAgICAgICAgdmFyIHN0cmljdGVkID0gZm9ybWFsUGFyYW1ldGVycy5zdHJpY3RlZDtcblx0ICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSBmb3JtYWxQYXJhbWV0ZXJzLmZpcnN0UmVzdHJpY3RlZDtcblx0ICAgICAgICBpZiAoZm9ybWFsUGFyYW1ldGVycy5tZXNzYWdlKSB7XG5cdCAgICAgICAgICAgIG1lc3NhZ2UgPSBmb3JtYWxQYXJhbWV0ZXJzLm1lc3NhZ2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBwcmV2aW91c1N0cmljdCA9IHRoaXMuY29udGV4dC5zdHJpY3Q7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dTdHJpY3REaXJlY3RpdmUgPSB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmU7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gZm9ybWFsUGFyYW1ldGVycy5zaW1wbGU7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlRnVuY3Rpb25Tb3VyY2VFbGVtZW50cygpO1xuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGZpcnN0UmVzdHJpY3RlZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKGZpcnN0UmVzdHJpY3RlZCwgbWVzc2FnZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4oc3RyaWN0ZWQsIG1lc3NhZ2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gcHJldmlvdXNTdHJpY3Q7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBwcmV2aW91c0FsbG93QXdhaXQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBwcmV2aW91c0FsbG93WWllbGQ7XG5cdCAgICAgICAgcmV0dXJuIGlzQXN5bmMgPyB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvbihpZCwgcGFyYW1zLCBib2R5KSkgOlxuXHQgICAgICAgICAgICB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkZ1bmN0aW9uRGVjbGFyYXRpb24oaWQsIHBhcmFtcywgYm9keSwgaXNHZW5lcmF0b3IpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRnVuY3Rpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGlzQXN5bmMgPSB0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzeW5jJyk7XG5cdCAgICAgICAgaWYgKGlzQXN5bmMpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdmdW5jdGlvbicpO1xuXHQgICAgICAgIHZhciBpc0dlbmVyYXRvciA9IGlzQXN5bmMgPyBmYWxzZSA6IHRoaXMubWF0Y2goJyonKTtcblx0ICAgICAgICBpZiAoaXNHZW5lcmF0b3IpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG1lc3NhZ2U7XG5cdCAgICAgICAgdmFyIGlkID0gbnVsbDtcblx0ICAgICAgICB2YXIgZmlyc3RSZXN0cmljdGVkO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93QXdhaXQgPSB0aGlzLmNvbnRleHQuYXdhaXQ7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dZaWVsZCA9IHRoaXMuY29udGV4dC5hbGxvd1lpZWxkO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hd2FpdCA9IGlzQXN5bmM7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSAhaXNHZW5lcmF0b3I7XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcoJykpIHtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIGlkID0gKCF0aGlzLmNvbnRleHQuc3RyaWN0ICYmICFpc0dlbmVyYXRvciAmJiB0aGlzLm1hdGNoS2V5d29yZCgneWllbGQnKSkgPyB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKSA6IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLCBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdEZ1bmN0aW9uTmFtZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQodG9rZW4udmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkID0gdG9rZW47XG5cdCAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0RnVuY3Rpb25OYW1lO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSB0b2tlbjtcblx0ICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGZvcm1hbFBhcmFtZXRlcnMgPSB0aGlzLnBhcnNlRm9ybWFsUGFyYW1ldGVycyhmaXJzdFJlc3RyaWN0ZWQpO1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSBmb3JtYWxQYXJhbWV0ZXJzLnBhcmFtcztcblx0ICAgICAgICB2YXIgc3RyaWN0ZWQgPSBmb3JtYWxQYXJhbWV0ZXJzLnN0cmljdGVkO1xuXHQgICAgICAgIGZpcnN0UmVzdHJpY3RlZCA9IGZvcm1hbFBhcmFtZXRlcnMuZmlyc3RSZXN0cmljdGVkO1xuXHQgICAgICAgIGlmIChmb3JtYWxQYXJhbWV0ZXJzLm1lc3NhZ2UpIHtcblx0ICAgICAgICAgICAgbWVzc2FnZSA9IGZvcm1hbFBhcmFtZXRlcnMubWVzc2FnZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHByZXZpb3VzU3RyaWN0ID0gdGhpcy5jb250ZXh0LnN0cmljdDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZSA9IHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmUgPSBmb3JtYWxQYXJhbWV0ZXJzLnNpbXBsZTtcblx0ICAgICAgICB2YXIgYm9keSA9IHRoaXMucGFyc2VGdW5jdGlvblNvdXJjZUVsZW1lbnRzKCk7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgZmlyc3RSZXN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oZmlyc3RSZXN0cmljdGVkLCBtZXNzYWdlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgc3RyaWN0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbihzdHJpY3RlZCwgbWVzc2FnZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY29udGV4dC5zdHJpY3QgPSBwcmV2aW91c1N0cmljdDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmUgPSBwcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hd2FpdCA9IHByZXZpb3VzQWxsb3dBd2FpdDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICByZXR1cm4gaXNBc3luYyA/IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXN5bmNGdW5jdGlvbkV4cHJlc3Npb24oaWQsIHBhcmFtcywgYm9keSkpIDpcblx0ICAgICAgICAgICAgdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5GdW5jdGlvbkV4cHJlc3Npb24oaWQsIHBhcmFtcywgYm9keSwgaXNHZW5lcmF0b3IpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1kaXJlY3RpdmUtcHJvbG9ndWVzLWFuZC10aGUtdXNlLXN0cmljdC1kaXJlY3RpdmVcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VEaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IChleHByLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5MaXRlcmFsKSA/IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pLnNsaWNlKDEsIC0xKSA6IG51bGw7XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgZGlyZWN0aXZlID8gbmV3IE5vZGUuRGlyZWN0aXZlKGV4cHIsIGRpcmVjdGl2ZSkgOiBuZXcgTm9kZS5FeHByZXNzaW9uU3RhdGVtZW50KGV4cHIpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRGlyZWN0aXZlUHJvbG9ndWVzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBmaXJzdFJlc3RyaWN0ZWQgPSBudWxsO1xuXHQgICAgICAgIHZhciBib2R5ID0gW107XG5cdCAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIGlmICh0b2tlbi50eXBlICE9PSA4IC8qIFN0cmluZ0xpdGVyYWwgKi8pIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRGlyZWN0aXZlKCk7XG5cdCAgICAgICAgICAgIGJvZHkucHVzaChzdGF0ZW1lbnQpO1xuXHQgICAgICAgICAgICB2YXIgZGlyZWN0aXZlID0gc3RhdGVtZW50LmRpcmVjdGl2ZTtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBkaXJlY3RpdmUgIT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoZGlyZWN0aXZlID09PSAndXNlIHN0cmljdCcpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJpY3QgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgaWYgKGZpcnN0UmVzdHJpY3RlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4oZmlyc3RSZXN0cmljdGVkLCBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdE9jdGFsTGl0ZXJhbCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbExhbmd1YWdlTW9kZURpcmVjdGl2ZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoIWZpcnN0UmVzdHJpY3RlZCAmJiB0b2tlbi5vY3RhbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGZpcnN0UmVzdHJpY3RlZCA9IHRva2VuO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBib2R5O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1ldGhvZC1kZWZpbml0aW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5xdWFsaWZpZWRQcm9wZXJ0eU5hbWUgPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSAzIC8qIElkZW50aWZpZXIgKi86XG5cdCAgICAgICAgICAgIGNhc2UgOCAvKiBTdHJpbmdMaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDEgLyogQm9vbGVhbkxpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgNSAvKiBOdWxsTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA2IC8qIE51bWVyaWNMaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDQgLyogS2V5d29yZCAqLzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgICBjYXNlIDcgLyogUHVuY3R1YXRvciAqLzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbi52YWx1ZSA9PT0gJ1snO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlR2V0dGVyTWV0aG9kID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGlzR2VuZXJhdG9yID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dZaWVsZCA9IHRoaXMuY29udGV4dC5hbGxvd1lpZWxkO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gIWlzR2VuZXJhdG9yO1xuXHQgICAgICAgIHZhciBmb3JtYWxQYXJhbWV0ZXJzID0gdGhpcy5wYXJzZUZvcm1hbFBhcmFtZXRlcnMoKTtcblx0ICAgICAgICBpZiAoZm9ybWFsUGFyYW1ldGVycy5wYXJhbXMubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5CYWRHZXR0ZXJBcml0eSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBtZXRob2QgPSB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2QoZm9ybWFsUGFyYW1ldGVycyk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBwcmV2aW91c0FsbG93WWllbGQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRnVuY3Rpb25FeHByZXNzaW9uKG51bGwsIGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zLCBtZXRob2QsIGlzR2VuZXJhdG9yKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVNldHRlck1ldGhvZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpc0dlbmVyYXRvciA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9ICFpc0dlbmVyYXRvcjtcblx0ICAgICAgICB2YXIgZm9ybWFsUGFyYW1ldGVycyA9IHRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKCk7XG5cdCAgICAgICAgaWYgKGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zLmxlbmd0aCAhPT0gMSkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5CYWRTZXR0ZXJBcml0eSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zWzBdIGluc3RhbmNlb2YgTm9kZS5SZXN0RWxlbWVudCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5CYWRTZXR0ZXJSZXN0UGFyYW1ldGVyKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IHRoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZChmb3JtYWxQYXJhbWV0ZXJzKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5GdW5jdGlvbkV4cHJlc3Npb24obnVsbCwgZm9ybWFsUGFyYW1ldGVycy5wYXJhbXMsIG1ldGhvZCwgaXNHZW5lcmF0b3IpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlR2VuZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGlzR2VuZXJhdG9yID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1lpZWxkID0gdGhpcy5jb250ZXh0LmFsbG93WWllbGQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSB0cnVlO1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSB0aGlzLnBhcnNlRm9ybWFsUGFyYW1ldGVycygpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IHRoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZChwYXJhbXMpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkZ1bmN0aW9uRXhwcmVzc2lvbihudWxsLCBwYXJhbXMucGFyYW1zLCBtZXRob2QsIGlzR2VuZXJhdG9yKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2VuZXJhdG9yLWZ1bmN0aW9uLWRlZmluaXRpb25zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmlzU3RhcnRPZkV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmxvb2thaGVhZC52YWx1ZTtcblx0ICAgICAgICBzd2l0Y2ggKHRoaXMubG9va2FoZWFkLnR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSA3IC8qIFB1bmN0dWF0b3IgKi86XG5cdCAgICAgICAgICAgICAgICBzdGFydCA9ICh2YWx1ZSA9PT0gJ1snKSB8fCAodmFsdWUgPT09ICcoJykgfHwgKHZhbHVlID09PSAneycpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKHZhbHVlID09PSAnKycpIHx8ICh2YWx1ZSA9PT0gJy0nKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PT0gJyEnKSB8fCAodmFsdWUgPT09ICd+JykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT09ICcrKycpIHx8ICh2YWx1ZSA9PT0gJy0tJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT09ICcvJykgfHwgKHZhbHVlID09PSAnLz0nKTsgLy8gcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWxcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDQgLyogS2V5d29yZCAqLzpcblx0ICAgICAgICAgICAgICAgIHN0YXJ0ID0gKHZhbHVlID09PSAnY2xhc3MnKSB8fCAodmFsdWUgPT09ICdkZWxldGUnKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykgfHwgKHZhbHVlID09PSAnbGV0JykgfHwgKHZhbHVlID09PSAnbmV3JykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT09ICdzdXBlcicpIHx8ICh2YWx1ZSA9PT0gJ3RoaXMnKSB8fCAodmFsdWUgPT09ICd0eXBlb2YnKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PT0gJ3ZvaWQnKSB8fCAodmFsdWUgPT09ICd5aWVsZCcpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHN0YXJ0O1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VZaWVsZEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3lpZWxkJyk7XG5cdCAgICAgICAgdmFyIGFyZ3VtZW50ID0gbnVsbDtcblx0ICAgICAgICB2YXIgZGVsZWdhdGUgPSBmYWxzZTtcblx0ICAgICAgICBpZiAoIXRoaXMuaGFzTGluZVRlcm1pbmF0b3IpIHtcblx0ICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dZaWVsZCA9IHRoaXMuY29udGV4dC5hbGxvd1lpZWxkO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IGZhbHNlO1xuXHQgICAgICAgICAgICBkZWxlZ2F0ZSA9IHRoaXMubWF0Y2goJyonKTtcblx0ICAgICAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgYXJndW1lbnQgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzU3RhcnRPZkV4cHJlc3Npb24oKSkge1xuXHQgICAgICAgICAgICAgICAgYXJndW1lbnQgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuWWllbGRFeHByZXNzaW9uKGFyZ3VtZW50LCBkZWxlZ2F0ZSkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNsYXNzLWRlZmluaXRpb25zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQ2xhc3NFbGVtZW50ID0gZnVuY3Rpb24gKGhhc0NvbnN0cnVjdG9yKSB7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIga2luZCA9ICcnO1xuXHQgICAgICAgIHZhciBrZXkgPSBudWxsO1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IG51bGw7XG5cdCAgICAgICAgdmFyIGNvbXB1dGVkID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBpc1N0YXRpYyA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBpc0FzeW5jID0gZmFsc2U7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJyonKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICB2YXIgaWQgPSBrZXk7XG5cdCAgICAgICAgICAgIGlmIChpZC5uYW1lID09PSAnc3RhdGljJyAmJiAodGhpcy5xdWFsaWZpZWRQcm9wZXJ0eU5hbWUodGhpcy5sb29rYWhlYWQpIHx8IHRoaXMubWF0Y2goJyonKSkpIHtcblx0ICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgICAgICBpc1N0YXRpYyA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICBjb21wdXRlZCA9IHRoaXMubWF0Y2goJ1snKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcqJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKCh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pICYmICF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yICYmICh0b2tlbi52YWx1ZSA9PT0gJ2FzeW5jJykpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBwdW5jdHVhdG9yID0gdGhpcy5sb29rYWhlYWQudmFsdWU7XG5cdCAgICAgICAgICAgICAgICBpZiAocHVuY3R1YXRvciAhPT0gJzonICYmIHB1bmN0dWF0b3IgIT09ICcoJyAmJiBwdW5jdHVhdG9yICE9PSAnKicpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpc0FzeW5jID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgdG9rZW4udmFsdWUgPT09ICdjb25zdHJ1Y3RvcicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5Db25zdHJ1Y3RvcklzQXN5bmMpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbG9va2FoZWFkUHJvcGVydHlLZXkgPSB0aGlzLnF1YWxpZmllZFByb3BlcnR5TmFtZSh0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLykge1xuXHQgICAgICAgICAgICBpZiAodG9rZW4udmFsdWUgPT09ICdnZXQnICYmIGxvb2thaGVhZFByb3BlcnR5S2V5KSB7XG5cdCAgICAgICAgICAgICAgICBraW5kID0gJ2dldCc7XG5cdCAgICAgICAgICAgICAgICBjb21wdXRlZCA9IHRoaXMubWF0Y2goJ1snKTtcblx0ICAgICAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wYXJzZUdldHRlck1ldGhvZCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnc2V0JyAmJiBsb29rYWhlYWRQcm9wZXJ0eUtleSkge1xuXHQgICAgICAgICAgICAgICAga2luZCA9ICdzZXQnO1xuXHQgICAgICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wYXJzZVNldHRlck1ldGhvZCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiB0b2tlbi52YWx1ZSA9PT0gJyonICYmIGxvb2thaGVhZFByb3BlcnR5S2V5KSB7XG5cdCAgICAgICAgICAgIGtpbmQgPSAnaW5pdCc7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlR2VuZXJhdG9yTWV0aG9kKCk7XG5cdCAgICAgICAgICAgIG1ldGhvZCA9IHRydWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICgha2luZCAmJiBrZXkgJiYgdGhpcy5tYXRjaCgnKCcpKSB7XG5cdCAgICAgICAgICAgIGtpbmQgPSAnaW5pdCc7XG5cdCAgICAgICAgICAgIHZhbHVlID0gaXNBc3luYyA/IHRoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZEFzeW5jRnVuY3Rpb24oKSA6IHRoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZEZ1bmN0aW9uKCk7XG5cdCAgICAgICAgICAgIG1ldGhvZCA9IHRydWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICgha2luZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGtpbmQgPT09ICdpbml0Jykge1xuXHQgICAgICAgICAgICBraW5kID0gJ21ldGhvZCc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICghY29tcHV0ZWQpIHtcblx0ICAgICAgICAgICAgaWYgKGlzU3RhdGljICYmIHRoaXMuaXNQcm9wZXJ0eUtleShrZXksICdwcm90b3R5cGUnKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdGF0aWNQcm90b3R5cGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICghaXNTdGF0aWMgJiYgdGhpcy5pc1Byb3BlcnR5S2V5KGtleSwgJ2NvbnN0cnVjdG9yJykpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChraW5kICE9PSAnbWV0aG9kJyB8fCAhbWV0aG9kIHx8ICh2YWx1ZSAmJiB2YWx1ZS5nZW5lcmF0b3IpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5Db25zdHJ1Y3RvclNwZWNpYWxNZXRob2QpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGhhc0NvbnN0cnVjdG9yLnZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5EdXBsaWNhdGVDb25zdHJ1Y3Rvcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBoYXNDb25zdHJ1Y3Rvci52YWx1ZSA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBraW5kID0gJ2NvbnN0cnVjdG9yJztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5NZXRob2REZWZpbml0aW9uKGtleSwgY29tcHV0ZWQsIHZhbHVlLCBraW5kLCBpc1N0YXRpYykpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VDbGFzc0VsZW1lbnRMaXN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBib2R5ID0gW107XG5cdCAgICAgICAgdmFyIGhhc0NvbnN0cnVjdG9yID0geyB2YWx1ZTogZmFsc2UgfTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgneycpO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCc7JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBib2R5LnB1c2godGhpcy5wYXJzZUNsYXNzRWxlbWVudChoYXNDb25zdHJ1Y3RvcikpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgcmV0dXJuIGJvZHk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNsYXNzQm9keSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBlbGVtZW50TGlzdCA9IHRoaXMucGFyc2VDbGFzc0VsZW1lbnRMaXN0KCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQ2xhc3NCb2R5KGVsZW1lbnRMaXN0KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNsYXNzRGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoaWRlbnRpZmllcklzT3B0aW9uYWwpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c1N0cmljdCA9IHRoaXMuY29udGV4dC5zdHJpY3Q7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdjbGFzcycpO1xuXHQgICAgICAgIHZhciBpZCA9IChpZGVudGlmaWVySXNPcHRpb25hbCAmJiAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMyAvKiBJZGVudGlmaWVyICovKSkgPyBudWxsIDogdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuXHQgICAgICAgIHZhciBzdXBlckNsYXNzID0gbnVsbDtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ2V4dGVuZHMnKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBzdXBlckNsYXNzID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VMZWZ0SGFuZFNpZGVFeHByZXNzaW9uQWxsb3dDYWxsKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGNsYXNzQm9keSA9IHRoaXMucGFyc2VDbGFzc0JvZHkoKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gcHJldmlvdXNTdHJpY3Q7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQ2xhc3NEZWNsYXJhdGlvbihpZCwgc3VwZXJDbGFzcywgY2xhc3NCb2R5KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNsYXNzRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c1N0cmljdCA9IHRoaXMuY29udGV4dC5zdHJpY3Q7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdjbGFzcycpO1xuXHQgICAgICAgIHZhciBpZCA9ICh0aGlzLmxvb2thaGVhZC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pID8gdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpIDogbnVsbDtcblx0ICAgICAgICB2YXIgc3VwZXJDbGFzcyA9IG51bGw7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdleHRlbmRzJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgc3VwZXJDbGFzcyA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlTGVmdEhhbmRTaWRlRXhwcmVzc2lvbkFsbG93Q2FsbCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBjbGFzc0JvZHkgPSB0aGlzLnBhcnNlQ2xhc3NCb2R5KCk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHByZXZpb3VzU3RyaWN0O1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkNsYXNzRXhwcmVzc2lvbihpZCwgc3VwZXJDbGFzcywgY2xhc3NCb2R5KSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc2NyaXB0c1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbW9kdWxlc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU1vZHVsZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNNb2R1bGUgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5pc01vZHVsZSA9IHRydWU7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgYm9keSA9IHRoaXMucGFyc2VEaXJlY3RpdmVQcm9sb2d1ZXMoKTtcblx0ICAgICAgICB3aGlsZSAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMiAvKiBFT0YgKi8pIHtcblx0ICAgICAgICAgICAgYm9keS5wdXNoKHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuTW9kdWxlKGJvZHkpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlU2NyaXB0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlRGlyZWN0aXZlUHJvbG9ndWVzKCk7XG5cdCAgICAgICAgd2hpbGUgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovKSB7XG5cdCAgICAgICAgICAgIGJvZHkucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlNjcmlwdChib2R5KSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaW1wb3J0c1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU1vZHVsZVNwZWNpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIGlmICh0aGlzLmxvb2thaGVhZC50eXBlICE9PSA4IC8qIFN0cmluZ0xpdGVyYWwgKi8pIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZE1vZHVsZVNwZWNpZmllcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdmFyIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkxpdGVyYWwodG9rZW4udmFsdWUsIHJhdykpO1xuXHQgICAgfTtcblx0ICAgIC8vIGltcG9ydCB7PGZvbyBhcyBiYXI+fSAuLi47XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlSW1wb3J0U3BlY2lmaWVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGltcG9ydGVkO1xuXHQgICAgICAgIHZhciBsb2NhbDtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovKSB7XG5cdCAgICAgICAgICAgIGltcG9ydGVkID0gdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICBsb2NhbCA9IGltcG9ydGVkO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhcycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgbG9jYWwgPSB0aGlzLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGltcG9ydGVkID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgICAgIGxvY2FsID0gaW1wb3J0ZWQ7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICBsb2NhbCA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSW1wb3J0U3BlY2lmaWVyKGxvY2FsLCBpbXBvcnRlZCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIHtmb28sIGJhciBhcyBiYXN9XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlTmFtZWRJbXBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG5cdCAgICAgICAgdmFyIHNwZWNpZmllcnMgPSBbXTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICBzcGVjaWZpZXJzLnB1c2godGhpcy5wYXJzZUltcG9ydFNwZWNpZmllcigpKTtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcsJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ30nKTtcblx0ICAgICAgICByZXR1cm4gc3BlY2lmaWVycztcblx0ICAgIH07XG5cdCAgICAvLyBpbXBvcnQgPGZvbz4gLi4uO1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUltcG9ydERlZmF1bHRTcGVjaWZpZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgbG9jYWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5JbXBvcnREZWZhdWx0U3BlY2lmaWVyKGxvY2FsKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaW1wb3J0IDwqIGFzIGZvbz4gLi4uO1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUltcG9ydE5hbWVzcGFjZVNwZWNpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcqJyk7XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzJykpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuTm9Bc0FmdGVySW1wb3J0TmFtZXNwYWNlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB2YXIgbG9jYWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIobG9jYWwpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlSW1wb3J0RGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsSW1wb3J0RGVjbGFyYXRpb24pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnaW1wb3J0Jyk7XG5cdCAgICAgICAgdmFyIHNyYztcblx0ICAgICAgICB2YXIgc3BlY2lmaWVycyA9IFtdO1xuXHQgICAgICAgIGlmICh0aGlzLmxvb2thaGVhZC50eXBlID09PSA4IC8qIFN0cmluZ0xpdGVyYWwgKi8pIHtcblx0ICAgICAgICAgICAgLy8gaW1wb3J0ICdmb28nO1xuXHQgICAgICAgICAgICBzcmMgPSB0aGlzLnBhcnNlTW9kdWxlU3BlY2lmaWVyKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgneycpKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBpbXBvcnQge2Jhcn1cblx0ICAgICAgICAgICAgICAgIHNwZWNpZmllcnMgPSBzcGVjaWZpZXJzLmNvbmNhdCh0aGlzLnBhcnNlTmFtZWRJbXBvcnRzKCkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJyonKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gaW1wb3J0ICogYXMgZm9vXG5cdCAgICAgICAgICAgICAgICBzcGVjaWZpZXJzLnB1c2godGhpcy5wYXJzZUltcG9ydE5hbWVzcGFjZVNwZWNpZmllcigpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzSWRlbnRpZmllck5hbWUodGhpcy5sb29rYWhlYWQpICYmICF0aGlzLm1hdGNoS2V5d29yZCgnZGVmYXVsdCcpKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBpbXBvcnQgZm9vXG5cdCAgICAgICAgICAgICAgICBzcGVjaWZpZXJzLnB1c2godGhpcy5wYXJzZUltcG9ydERlZmF1bHRTcGVjaWZpZXIoKSk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnLCcpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcG9ydCBmb28sICogYXMgZm9vXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcnMucHVzaCh0aGlzLnBhcnNlSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCd7JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0IGZvbywge2Jhcn1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVycyA9IHNwZWNpZmllcnMuY29uY2F0KHRoaXMucGFyc2VOYW1lZEltcG9ydHMoKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdmcm9tJykpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5sb29rYWhlYWQudmFsdWUgPyBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiA6IG1lc3NhZ2VzXzEuTWVzc2FnZXMuTWlzc2luZ0Zyb21DbGF1c2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZSwgdGhpcy5sb29rYWhlYWQudmFsdWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHNyYyA9IHRoaXMucGFyc2VNb2R1bGVTcGVjaWZpZXIoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSW1wb3J0RGVjbGFyYXRpb24oc3BlY2lmaWVycywgc3JjKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZXhwb3J0c1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUV4cG9ydFNwZWNpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBsb2NhbCA9IHRoaXMucGFyc2VJZGVudGlmaWVyTmFtZSgpO1xuXHQgICAgICAgIHZhciBleHBvcnRlZCA9IGxvY2FsO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgZXhwb3J0ZWQgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0U3BlY2lmaWVyKGxvY2FsLCBleHBvcnRlZCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VFeHBvcnREZWNsYXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LmluRnVuY3Rpb25Cb2R5KSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLklsbGVnYWxFeHBvcnREZWNsYXJhdGlvbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdleHBvcnQnKTtcblx0ICAgICAgICB2YXIgZXhwb3J0RGVjbGFyYXRpb247XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdkZWZhdWx0JykpIHtcblx0ICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgLi4uXG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnZnVuY3Rpb24nKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9vICgpIHt9XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7fVxuXHQgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24odHJ1ZSk7XG5cdCAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ2NsYXNzJykpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IGNsYXNzIGZvbyB7fVxuXHQgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUNsYXNzRGVjbGFyYXRpb24odHJ1ZSk7XG5cdCAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhc3luYycpKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBmICgpIHt9XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiAoKSB7fVxuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgYXN5bmMgeCA9PiB4XG5cdCAgICAgICAgICAgICAgICB2YXIgZGVjbGFyYXRpb24gPSB0aGlzLm1hdGNoQXN5bmNGdW5jdGlvbigpID8gdGhpcy5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24odHJ1ZSkgOiB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgIGV4cG9ydERlY2xhcmF0aW9uID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb24oZGVjbGFyYXRpb24pKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2Zyb20nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiwgdGhpcy5sb29rYWhlYWQudmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQge307XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBbXTtcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0ICgxICsgMik7XG5cdCAgICAgICAgICAgICAgICB2YXIgZGVjbGFyYXRpb24gPSB0aGlzLm1hdGNoKCd7JykgPyB0aGlzLnBhcnNlT2JqZWN0SW5pdGlhbGl6ZXIoKSA6XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaCgnWycpID8gdGhpcy5wYXJzZUFycmF5SW5pdGlhbGl6ZXIoKSA6IHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaCgnKicpKSB7XG5cdCAgICAgICAgICAgIC8vIGV4cG9ydCAqIGZyb20gJ2Zvbyc7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdmcm9tJykpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5sb29rYWhlYWQudmFsdWUgPyBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiA6IG1lc3NhZ2VzXzEuTWVzc2FnZXMuTWlzc2luZ0Zyb21DbGF1c2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZSwgdGhpcy5sb29rYWhlYWQudmFsdWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHZhciBzcmMgPSB0aGlzLnBhcnNlTW9kdWxlU3BlY2lmaWVyKCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0QWxsRGVjbGFyYXRpb24oc3JjKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDQgLyogS2V5d29yZCAqLykge1xuXHQgICAgICAgICAgICAvLyBleHBvcnQgdmFyIGYgPSAxO1xuXHQgICAgICAgICAgICB2YXIgZGVjbGFyYXRpb24gPSB2b2lkIDA7XG5cdCAgICAgICAgICAgIHN3aXRjaCAodGhpcy5sb29rYWhlYWQudmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2xldCc6XG5cdCAgICAgICAgICAgICAgICBjYXNlICdjb25zdCc6XG5cdCAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24gPSB0aGlzLnBhcnNlTGV4aWNhbERlY2xhcmF0aW9uKHsgaW5Gb3I6IGZhbHNlIH0pO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgY2FzZSAndmFyJzpcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2NsYXNzJzpcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcblx0ICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbiA9IHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0TmFtZWREZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgW10sIG51bGwpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaEFzeW5jRnVuY3Rpb24oKSkge1xuXHQgICAgICAgICAgICB2YXIgZGVjbGFyYXRpb24gPSB0aGlzLnBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbigpO1xuXHQgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0TmFtZWREZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgW10sIG51bGwpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBzcGVjaWZpZXJzID0gW107XG5cdCAgICAgICAgICAgIHZhciBzb3VyY2UgPSBudWxsO1xuXHQgICAgICAgICAgICB2YXIgaXNFeHBvcnRGcm9tSWRlbnRpZmllciA9IGZhbHNlO1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgneycpO1xuXHQgICAgICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICAgICAgaXNFeHBvcnRGcm9tSWRlbnRpZmllciA9IGlzRXhwb3J0RnJvbUlkZW50aWZpZXIgfHwgdGhpcy5tYXRjaEtleXdvcmQoJ2RlZmF1bHQnKTtcblx0ICAgICAgICAgICAgICAgIHNwZWNpZmllcnMucHVzaCh0aGlzLnBhcnNlRXhwb3J0U3BlY2lmaWVyKCkpO1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2Zyb20nKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IHtkZWZhdWx0fSBmcm9tICdmb28nO1xuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IHtmb299IGZyb20gJ2Zvbyc7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgc291cmNlID0gdGhpcy5wYXJzZU1vZHVsZVNwZWNpZmllcigpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoaXNFeHBvcnRGcm9tSWRlbnRpZmllcikge1xuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IHtkZWZhdWx0fTsgLy8gbWlzc2luZyBmcm9tQ2xhdXNlXG5cdCAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IHRoaXMubG9va2FoZWFkLnZhbHVlID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW4gOiBtZXNzYWdlc18xLk1lc3NhZ2VzLk1pc3NpbmdGcm9tQ2xhdXNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2UsIHRoaXMubG9va2FoZWFkLnZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCB7Zm9vfTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGV4cG9ydERlY2xhcmF0aW9uID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5FeHBvcnROYW1lZERlY2xhcmF0aW9uKG51bGwsIHNwZWNpZmllcnMsIHNvdXJjZSkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZXhwb3J0RGVjbGFyYXRpb247XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFBhcnNlcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5QYXJzZXIgPSBQYXJzZXI7XG5cblxuLyoqKi8gfSxcbi8qIDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHQvLyBFbnN1cmUgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLCBvdGhlcndpc2UgdGhyb3cgYW4gZXJyb3IuXG5cdC8vIFRoaXMgaXMgb25seSB0byBoYXZlIGEgYmV0dGVyIGNvbnRyYWN0IHNlbWFudGljLCBpLmUuIGFub3RoZXIgc2FmZXR5IG5ldFxuXHQvLyB0byBjYXRjaCBhIGxvZ2ljIGVycm9yLiBUaGUgY29uZGl0aW9uIHNoYWxsIGJlIGZ1bGZpbGxlZCBpbiBub3JtYWwgY2FzZS5cblx0Ly8gRG8gTk9UIHVzZSB0aGlzIHRvIGVuZm9yY2UgYSBjZXJ0YWluIGNvbmRpdGlvbiBvbiBhbnkgdXNlciBpbnB1dC5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHRmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCBtZXNzYWdlKSB7XG5cdCAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cblx0ICAgIGlmICghY29uZGl0aW9uKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBU1NFUlQ6ICcgKyBtZXNzYWdlKTtcblx0ICAgIH1cblx0fVxuXHRleHBvcnRzLmFzc2VydCA9IGFzc2VydDtcblxuXG4vKioqLyB9LFxuLyogMTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHQvKiB0c2xpbnQ6ZGlzYWJsZTptYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdHZhciBFcnJvckhhbmRsZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRXJyb3JIYW5kbGVyKCkge1xuXHQgICAgICAgIHRoaXMuZXJyb3JzID0gW107XG5cdCAgICAgICAgdGhpcy50b2xlcmFudCA9IGZhbHNlO1xuXHQgICAgfVxuXHQgICAgRXJyb3JIYW5kbGVyLnByb3RvdHlwZS5yZWNvcmRFcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuXHQgICAgfTtcblx0ICAgIEVycm9ySGFuZGxlci5wcm90b3R5cGUudG9sZXJhdGUgPSBmdW5jdGlvbiAoZXJyb3IpIHtcblx0ICAgICAgICBpZiAodGhpcy50b2xlcmFudCkge1xuXHQgICAgICAgICAgICB0aGlzLnJlY29yZEVycm9yKGVycm9yKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRocm93IGVycm9yO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBFcnJvckhhbmRsZXIucHJvdG90eXBlLmNvbnN0cnVjdEVycm9yID0gZnVuY3Rpb24gKG1zZywgY29sdW1uKSB7XG5cdCAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1zZyk7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNhdGNoIChiYXNlKSB7XG5cdCAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdCAgICAgICAgICAgIGlmIChPYmplY3QuY3JlYXRlICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuXHQgICAgICAgICAgICAgICAgZXJyb3IgPSBPYmplY3QuY3JlYXRlKGJhc2UpO1xuXHQgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCAnY29sdW1uJywgeyB2YWx1ZTogY29sdW1uIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdCAgICAgICAgcmV0dXJuIGVycm9yO1xuXHQgICAgfTtcblx0ICAgIEVycm9ySGFuZGxlci5wcm90b3R5cGUuY3JlYXRlRXJyb3IgPSBmdW5jdGlvbiAoaW5kZXgsIGxpbmUsIGNvbCwgZGVzY3JpcHRpb24pIHtcblx0ICAgICAgICB2YXIgbXNnID0gJ0xpbmUgJyArIGxpbmUgKyAnOiAnICsgZGVzY3JpcHRpb247XG5cdCAgICAgICAgdmFyIGVycm9yID0gdGhpcy5jb25zdHJ1Y3RFcnJvcihtc2csIGNvbCk7XG5cdCAgICAgICAgZXJyb3IuaW5kZXggPSBpbmRleDtcblx0ICAgICAgICBlcnJvci5saW5lTnVtYmVyID0gbGluZTtcblx0ICAgICAgICBlcnJvci5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXHQgICAgICAgIHJldHVybiBlcnJvcjtcblx0ICAgIH07XG5cdCAgICBFcnJvckhhbmRsZXIucHJvdG90eXBlLnRocm93RXJyb3IgPSBmdW5jdGlvbiAoaW5kZXgsIGxpbmUsIGNvbCwgZGVzY3JpcHRpb24pIHtcblx0ICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGluZGV4LCBsaW5lLCBjb2wsIGRlc2NyaXB0aW9uKTtcblx0ICAgIH07XG5cdCAgICBFcnJvckhhbmRsZXIucHJvdG90eXBlLnRvbGVyYXRlRXJyb3IgPSBmdW5jdGlvbiAoaW5kZXgsIGxpbmUsIGNvbCwgZGVzY3JpcHRpb24pIHtcblx0ICAgICAgICB2YXIgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKGluZGV4LCBsaW5lLCBjb2wsIGRlc2NyaXB0aW9uKTtcblx0ICAgICAgICBpZiAodGhpcy50b2xlcmFudCkge1xuXHQgICAgICAgICAgICB0aGlzLnJlY29yZEVycm9yKGVycm9yKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRocm93IGVycm9yO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICByZXR1cm4gRXJyb3JIYW5kbGVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLkVycm9ySGFuZGxlciA9IEVycm9ySGFuZGxlcjtcblxuXG4vKioqLyB9LFxuLyogMTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdC8vIEVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gVjguXG5cdGV4cG9ydHMuTWVzc2FnZXMgPSB7XG5cdCAgICBCYWRHZXR0ZXJBcml0eTogJ0dldHRlciBtdXN0IG5vdCBoYXZlIGFueSBmb3JtYWwgcGFyYW1ldGVycycsXG5cdCAgICBCYWRTZXR0ZXJBcml0eTogJ1NldHRlciBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZm9ybWFsIHBhcmFtZXRlcicsXG5cdCAgICBCYWRTZXR0ZXJSZXN0UGFyYW1ldGVyOiAnU2V0dGVyIGZ1bmN0aW9uIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgcmVzdCBwYXJhbWV0ZXInLFxuXHQgICAgQ29uc3RydWN0b3JJc0FzeW5jOiAnQ2xhc3MgY29uc3RydWN0b3IgbWF5IG5vdCBiZSBhbiBhc3luYyBtZXRob2QnLFxuXHQgICAgQ29uc3RydWN0b3JTcGVjaWFsTWV0aG9kOiAnQ2xhc3MgY29uc3RydWN0b3IgbWF5IG5vdCBiZSBhbiBhY2Nlc3NvcicsXG5cdCAgICBEZWNsYXJhdGlvbk1pc3NpbmdJbml0aWFsaXplcjogJ01pc3NpbmcgaW5pdGlhbGl6ZXIgaW4gJTAgZGVjbGFyYXRpb24nLFxuXHQgICAgRGVmYXVsdFJlc3RQYXJhbWV0ZXI6ICdVbmV4cGVjdGVkIHRva2VuID0nLFxuXHQgICAgRHVwbGljYXRlQmluZGluZzogJ0R1cGxpY2F0ZSBiaW5kaW5nICUwJyxcblx0ICAgIER1cGxpY2F0ZUNvbnN0cnVjdG9yOiAnQSBjbGFzcyBtYXkgb25seSBoYXZlIG9uZSBjb25zdHJ1Y3RvcicsXG5cdCAgICBEdXBsaWNhdGVQcm90b1Byb3BlcnR5OiAnRHVwbGljYXRlIF9fcHJvdG9fXyBmaWVsZHMgYXJlIG5vdCBhbGxvd2VkIGluIG9iamVjdCBsaXRlcmFscycsXG5cdCAgICBGb3JJbk9mTG9vcEluaXRpYWxpemVyOiAnJTAgbG9vcCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBtYXkgbm90IGhhdmUgYW4gaW5pdGlhbGl6ZXInLFxuXHQgICAgR2VuZXJhdG9ySW5MZWdhY3lDb250ZXh0OiAnR2VuZXJhdG9yIGRlY2xhcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gbGVnYWN5IGNvbnRleHRzJyxcblx0ICAgIElsbGVnYWxCcmVhazogJ0lsbGVnYWwgYnJlYWsgc3RhdGVtZW50Jyxcblx0ICAgIElsbGVnYWxDb250aW51ZTogJ0lsbGVnYWwgY29udGludWUgc3RhdGVtZW50Jyxcblx0ICAgIElsbGVnYWxFeHBvcnREZWNsYXJhdGlvbjogJ1VuZXhwZWN0ZWQgdG9rZW4nLFxuXHQgICAgSWxsZWdhbEltcG9ydERlY2xhcmF0aW9uOiAnVW5leHBlY3RlZCB0b2tlbicsXG5cdCAgICBJbGxlZ2FsTGFuZ3VhZ2VNb2RlRGlyZWN0aXZlOiAnSWxsZWdhbCBcXCd1c2Ugc3RyaWN0XFwnIGRpcmVjdGl2ZSBpbiBmdW5jdGlvbiB3aXRoIG5vbi1zaW1wbGUgcGFyYW1ldGVyIGxpc3QnLFxuXHQgICAgSWxsZWdhbFJldHVybjogJ0lsbGVnYWwgcmV0dXJuIHN0YXRlbWVudCcsXG5cdCAgICBJbnZhbGlkRXNjYXBlZFJlc2VydmVkV29yZDogJ0tleXdvcmQgbXVzdCBub3QgY29udGFpbiBlc2NhcGVkIGNoYXJhY3RlcnMnLFxuXHQgICAgSW52YWxpZEhleEVzY2FwZVNlcXVlbmNlOiAnSW52YWxpZCBoZXhhZGVjaW1hbCBlc2NhcGUgc2VxdWVuY2UnLFxuXHQgICAgSW52YWxpZExIU0luQXNzaWdubWVudDogJ0ludmFsaWQgbGVmdC1oYW5kIHNpZGUgaW4gYXNzaWdubWVudCcsXG5cdCAgICBJbnZhbGlkTEhTSW5Gb3JJbjogJ0ludmFsaWQgbGVmdC1oYW5kIHNpZGUgaW4gZm9yLWluJyxcblx0ICAgIEludmFsaWRMSFNJbkZvckxvb3A6ICdJbnZhbGlkIGxlZnQtaGFuZCBzaWRlIGluIGZvci1sb29wJyxcblx0ICAgIEludmFsaWRNb2R1bGVTcGVjaWZpZXI6ICdVbmV4cGVjdGVkIHRva2VuJyxcblx0ICAgIEludmFsaWRSZWdFeHA6ICdJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbicsXG5cdCAgICBMZXRJbkxleGljYWxCaW5kaW5nOiAnbGV0IGlzIGRpc2FsbG93ZWQgYXMgYSBsZXhpY2FsbHkgYm91bmQgbmFtZScsXG5cdCAgICBNaXNzaW5nRnJvbUNsYXVzZTogJ1VuZXhwZWN0ZWQgdG9rZW4nLFxuXHQgICAgTXVsdGlwbGVEZWZhdWx0c0luU3dpdGNoOiAnTW9yZSB0aGFuIG9uZSBkZWZhdWx0IGNsYXVzZSBpbiBzd2l0Y2ggc3RhdGVtZW50Jyxcblx0ICAgIE5ld2xpbmVBZnRlclRocm93OiAnSWxsZWdhbCBuZXdsaW5lIGFmdGVyIHRocm93Jyxcblx0ICAgIE5vQXNBZnRlckltcG9ydE5hbWVzcGFjZTogJ1VuZXhwZWN0ZWQgdG9rZW4nLFxuXHQgICAgTm9DYXRjaE9yRmluYWxseTogJ01pc3NpbmcgY2F0Y2ggb3IgZmluYWxseSBhZnRlciB0cnknLFxuXHQgICAgUGFyYW1ldGVyQWZ0ZXJSZXN0UGFyYW1ldGVyOiAnUmVzdCBwYXJhbWV0ZXIgbXVzdCBiZSBsYXN0IGZvcm1hbCBwYXJhbWV0ZXInLFxuXHQgICAgUmVkZWNsYXJhdGlvbjogJyUwIFxcJyUxXFwnIGhhcyBhbHJlYWR5IGJlZW4gZGVjbGFyZWQnLFxuXHQgICAgU3RhdGljUHJvdG90eXBlOiAnQ2xhc3NlcyBtYXkgbm90IGhhdmUgc3RhdGljIHByb3BlcnR5IG5hbWVkIHByb3RvdHlwZScsXG5cdCAgICBTdHJpY3RDYXRjaFZhcmlhYmxlOiAnQ2F0Y2ggdmFyaWFibGUgbWF5IG5vdCBiZSBldmFsIG9yIGFyZ3VtZW50cyBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3REZWxldGU6ICdEZWxldGUgb2YgYW4gdW5xdWFsaWZpZWQgaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZS4nLFxuXHQgICAgU3RyaWN0RnVuY3Rpb246ICdJbiBzdHJpY3QgbW9kZSBjb2RlLCBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgZGVjbGFyZWQgYXQgdG9wIGxldmVsIG9yIGluc2lkZSBhIGJsb2NrJyxcblx0ICAgIFN0cmljdEZ1bmN0aW9uTmFtZTogJ0Z1bmN0aW9uIG5hbWUgbWF5IG5vdCBiZSBldmFsIG9yIGFyZ3VtZW50cyBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3RMSFNBc3NpZ25tZW50OiAnQXNzaWdubWVudCB0byBldmFsIG9yIGFyZ3VtZW50cyBpcyBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3RMSFNQb3N0Zml4OiAnUG9zdGZpeCBpbmNyZW1lbnQvZGVjcmVtZW50IG1heSBub3QgaGF2ZSBldmFsIG9yIGFyZ3VtZW50cyBvcGVyYW5kIGluIHN0cmljdCBtb2RlJyxcblx0ICAgIFN0cmljdExIU1ByZWZpeDogJ1ByZWZpeCBpbmNyZW1lbnQvZGVjcmVtZW50IG1heSBub3QgaGF2ZSBldmFsIG9yIGFyZ3VtZW50cyBvcGVyYW5kIGluIHN0cmljdCBtb2RlJyxcblx0ICAgIFN0cmljdE1vZGVXaXRoOiAnU3RyaWN0IG1vZGUgY29kZSBtYXkgbm90IGluY2x1ZGUgYSB3aXRoIHN0YXRlbWVudCcsXG5cdCAgICBTdHJpY3RPY3RhbExpdGVyYWw6ICdPY3RhbCBsaXRlcmFscyBhcmUgbm90IGFsbG93ZWQgaW4gc3RyaWN0IG1vZGUuJyxcblx0ICAgIFN0cmljdFBhcmFtRHVwZTogJ1N0cmljdCBtb2RlIGZ1bmN0aW9uIG1heSBub3QgaGF2ZSBkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzJyxcblx0ICAgIFN0cmljdFBhcmFtTmFtZTogJ1BhcmFtZXRlciBuYW1lIGV2YWwgb3IgYXJndW1lbnRzIGlzIG5vdCBhbGxvd2VkIGluIHN0cmljdCBtb2RlJyxcblx0ICAgIFN0cmljdFJlc2VydmVkV29yZDogJ1VzZSBvZiBmdXR1cmUgcmVzZXJ2ZWQgd29yZCBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3RWYXJOYW1lOiAnVmFyaWFibGUgbmFtZSBtYXkgbm90IGJlIGV2YWwgb3IgYXJndW1lbnRzIGluIHN0cmljdCBtb2RlJyxcblx0ICAgIFRlbXBsYXRlT2N0YWxMaXRlcmFsOiAnT2N0YWwgbGl0ZXJhbHMgYXJlIG5vdCBhbGxvd2VkIGluIHRlbXBsYXRlIHN0cmluZ3MuJyxcblx0ICAgIFVuZXhwZWN0ZWRFT1M6ICdVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCcsXG5cdCAgICBVbmV4cGVjdGVkSWRlbnRpZmllcjogJ1VuZXhwZWN0ZWQgaWRlbnRpZmllcicsXG5cdCAgICBVbmV4cGVjdGVkTnVtYmVyOiAnVW5leHBlY3RlZCBudW1iZXInLFxuXHQgICAgVW5leHBlY3RlZFJlc2VydmVkOiAnVW5leHBlY3RlZCByZXNlcnZlZCB3b3JkJyxcblx0ICAgIFVuZXhwZWN0ZWRTdHJpbmc6ICdVbmV4cGVjdGVkIHN0cmluZycsXG5cdCAgICBVbmV4cGVjdGVkVGVtcGxhdGU6ICdVbmV4cGVjdGVkIHF1YXNpICUwJyxcblx0ICAgIFVuZXhwZWN0ZWRUb2tlbjogJ1VuZXhwZWN0ZWQgdG9rZW4gJTAnLFxuXHQgICAgVW5leHBlY3RlZFRva2VuSWxsZWdhbDogJ1VuZXhwZWN0ZWQgdG9rZW4gSUxMRUdBTCcsXG5cdCAgICBVbmtub3duTGFiZWw6ICdVbmRlZmluZWQgbGFiZWwgXFwnJTBcXCcnLFxuXHQgICAgVW50ZXJtaW5hdGVkUmVnRXhwOiAnSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb246IG1pc3NpbmcgLydcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdHZhciBhc3NlcnRfMSA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdHZhciBjaGFyYWN0ZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cdHZhciBtZXNzYWdlc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cdGZ1bmN0aW9uIGhleFZhbHVlKGNoKSB7XG5cdCAgICByZXR1cm4gJzAxMjM0NTY3ODlhYmNkZWYnLmluZGV4T2YoY2gudG9Mb3dlckNhc2UoKSk7XG5cdH1cblx0ZnVuY3Rpb24gb2N0YWxWYWx1ZShjaCkge1xuXHQgICAgcmV0dXJuICcwMTIzNDU2NycuaW5kZXhPZihjaCk7XG5cdH1cblx0dmFyIFNjYW5uZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gU2Nhbm5lcihjb2RlLCBoYW5kbGVyKSB7XG5cdCAgICAgICAgdGhpcy5zb3VyY2UgPSBjb2RlO1xuXHQgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gaGFuZGxlcjtcblx0ICAgICAgICB0aGlzLnRyYWNrQ29tbWVudCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuaXNNb2R1bGUgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmxlbmd0aCA9IGNvZGUubGVuZ3RoO1xuXHQgICAgICAgIHRoaXMuaW5kZXggPSAwO1xuXHQgICAgICAgIHRoaXMubGluZU51bWJlciA9IChjb2RlLmxlbmd0aCA+IDApID8gMSA6IDA7XG5cdCAgICAgICAgdGhpcy5saW5lU3RhcnQgPSAwO1xuXHQgICAgICAgIHRoaXMuY3VybHlTdGFjayA9IFtdO1xuXHQgICAgfVxuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2F2ZVN0YXRlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIGluZGV4OiB0aGlzLmluZGV4LFxuXHQgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5saW5lU3RhcnRcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnJlc3RvcmVTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuXHQgICAgICAgIHRoaXMuaW5kZXggPSBzdGF0ZS5pbmRleDtcblx0ICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBzdGF0ZS5saW5lTnVtYmVyO1xuXHQgICAgICAgIHRoaXMubGluZVN0YXJ0ID0gc3RhdGUubGluZVN0YXJ0O1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLmVvZiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA+PSB0aGlzLmxlbmd0aDtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS50aHJvd1VuZXhwZWN0ZWRUb2tlbiA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG5cdCAgICAgICAgaWYgKG1lc3NhZ2UgPT09IHZvaWQgMCkgeyBtZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW5JbGxlZ2FsOyB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnRocm93RXJyb3IodGhpcy5pbmRleCwgdGhpcy5saW5lTnVtYmVyLCB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnQgKyAxLCBtZXNzYWdlKTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbiA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG5cdCAgICAgICAgaWYgKG1lc3NhZ2UgPT09IHZvaWQgMCkgeyBtZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW5JbGxlZ2FsOyB9XG5cdCAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIudG9sZXJhdGVFcnJvcih0aGlzLmluZGV4LCB0aGlzLmxpbmVOdW1iZXIsIHRoaXMuaW5kZXggLSB0aGlzLmxpbmVTdGFydCArIDEsIG1lc3NhZ2UpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNvbW1lbnRzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5za2lwU2luZ2xlTGluZUNvbW1lbnQgPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG5cdCAgICAgICAgdmFyIGNvbW1lbnRzID0gW107XG5cdCAgICAgICAgdmFyIHN0YXJ0LCBsb2M7XG5cdCAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnRzID0gW107XG5cdCAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5pbmRleCAtIG9mZnNldDtcblx0ICAgICAgICAgICAgbG9jID0ge1xuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnQgLSBvZmZzZXRcblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHt9XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuXHQgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaCkpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGxvYy5lbmQgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnQgLSAxXG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpTGluZTogZmFsc2UsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlOiBbc3RhcnQgKyBvZmZzZXQsIHRoaXMuaW5kZXggLSAxXSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IFtzdGFydCwgdGhpcy5pbmRleCAtIDFdLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IGxvY1xuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgY29tbWVudHMucHVzaChlbnRyeSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09IDEzICYmIHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkgPT09IDEwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gY29tbWVudHM7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgIGxvYy5lbmQgPSB7XG5cdCAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuaW5kZXggLSB0aGlzLmxpbmVTdGFydFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB2YXIgZW50cnkgPSB7XG5cdCAgICAgICAgICAgICAgICBtdWx0aUxpbmU6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgc2xpY2U6IFtzdGFydCArIG9mZnNldCwgdGhpcy5pbmRleF0sXG5cdCAgICAgICAgICAgICAgICByYW5nZTogW3N0YXJ0LCB0aGlzLmluZGV4XSxcblx0ICAgICAgICAgICAgICAgIGxvYzogbG9jXG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goZW50cnkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gY29tbWVudHM7XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2tpcE11bHRpTGluZUNvbW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNvbW1lbnRzID0gW107XG5cdCAgICAgICAgdmFyIHN0YXJ0LCBsb2M7XG5cdCAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnRzID0gW107XG5cdCAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5pbmRleCAtIDI7XG5cdCAgICAgICAgICAgIGxvYyA9IHtcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5pbmRleCAtIHRoaXMubGluZVN0YXJ0IC0gMlxuXHQgICAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgICAgIGVuZDoge31cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaCkpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gMHgwRCAmJiB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXggKyAxKSA9PT0gMHgwQSkge1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICsrdGhpcy5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAweDJBKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBCbG9jayBjb21tZW50IGVuZHMgd2l0aCAnKi8nLlxuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCArIDEpID09PSAweDJGKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCArPSAyO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBsb2MuZW5kID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlMaW5lOiB0cnVlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2U6IFtzdGFydCArIDIsIHRoaXMuaW5kZXggLSAyXSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlOiBbc3RhcnQsIHRoaXMuaW5kZXhdLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiBsb2Ncblx0ICAgICAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMucHVzaChlbnRyeSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21tZW50cztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBSYW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGZpbGUgLSB0aGUgd2hvbGUgdGhpbmcgaXMgYSBjb21tZW50XG5cdCAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgIGxvYy5lbmQgPSB7XG5cdCAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuaW5kZXggLSB0aGlzLmxpbmVTdGFydFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB2YXIgZW50cnkgPSB7XG5cdCAgICAgICAgICAgICAgICBtdWx0aUxpbmU6IHRydWUsXG5cdCAgICAgICAgICAgICAgICBzbGljZTogW3N0YXJ0ICsgMiwgdGhpcy5pbmRleF0sXG5cdCAgICAgICAgICAgICAgICByYW5nZTogW3N0YXJ0LCB0aGlzLmluZGV4XSxcblx0ICAgICAgICAgICAgICAgIGxvYzogbG9jXG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goZW50cnkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgcmV0dXJuIGNvbW1lbnRzO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5Db21tZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgY29tbWVudHM7XG5cdCAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnRzID0gW107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBzdGFydCA9ICh0aGlzLmluZGV4ID09PSAwKTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KTtcblx0ICAgICAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc1doaXRlU3BhY2UoY2gpKSB7XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2gpKSB7XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09IDB4MEQgJiYgdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSA9PT0gMHgwQSkge1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICsrdGhpcy5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgc3RhcnQgPSB0cnVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAweDJGKSB7XG5cdCAgICAgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCArIDEpO1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAweDJGKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCArPSAyO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0gdGhpcy5za2lwU2luZ2xlTGluZUNvbW1lbnQoMik7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzID0gY29tbWVudHMuY29uY2F0KGNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gMHgyQSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gMjtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY29tbWVudCA9IHRoaXMuc2tpcE11bHRpTGluZUNvbW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0NvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMgPSBjb21tZW50cy5jb25jYXQoY29tbWVudCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnQgJiYgY2ggPT09IDB4MkQpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFUrMDAzRSBpcyAnPidcblx0ICAgICAgICAgICAgICAgIGlmICgodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4ICsgMSkgPT09IDB4MkQpICYmICh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXggKyAyKSA9PT0gMHgzRSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyAnLS0+JyBpcyBhIHNpbmdsZS1saW5lIGNvbW1lbnRcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDM7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSB0aGlzLnNraXBTaW5nbGVMaW5lQ29tbWVudCgzKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0NvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMgPSBjb21tZW50cy5jb25jYXQoY29tbWVudCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT09IDB4M0MgJiYgIXRoaXMuaXNNb2R1bGUpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZS5zbGljZSh0aGlzLmluZGV4ICsgMSwgdGhpcy5pbmRleCArIDQpID09PSAnIS0tJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gNDsgLy8gYDwhLS1gXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSB0aGlzLnNraXBTaW5nbGVMaW5lQ29tbWVudCg0KTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0NvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMgPSBjb21tZW50cy5jb25jYXQoY29tbWVudCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gY29tbWVudHM7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZnV0dXJlLXJlc2VydmVkLXdvcmRzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5pc0Z1dHVyZVJlc2VydmVkV29yZCA9IGZ1bmN0aW9uIChpZCkge1xuXHQgICAgICAgIHN3aXRjaCAoaWQpIHtcblx0ICAgICAgICAgICAgY2FzZSAnZW51bSc6XG5cdCAgICAgICAgICAgIGNhc2UgJ2V4cG9ydCc6XG5cdCAgICAgICAgICAgIGNhc2UgJ2ltcG9ydCc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3N1cGVyJzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5pc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQgPSBmdW5jdGlvbiAoaWQpIHtcblx0ICAgICAgICBzd2l0Y2ggKGlkKSB7XG5cdCAgICAgICAgICAgIGNhc2UgJ2ltcGxlbWVudHMnOlxuXHQgICAgICAgICAgICBjYXNlICdpbnRlcmZhY2UnOlxuXHQgICAgICAgICAgICBjYXNlICdwYWNrYWdlJzpcblx0ICAgICAgICAgICAgY2FzZSAncHJpdmF0ZSc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3Byb3RlY3RlZCc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3B1YmxpYyc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3N0YXRpYyc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3lpZWxkJzpcblx0ICAgICAgICAgICAgY2FzZSAnbGV0Jzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5pc1Jlc3RyaWN0ZWRXb3JkID0gZnVuY3Rpb24gKGlkKSB7XG5cdCAgICAgICAgcmV0dXJuIGlkID09PSAnZXZhbCcgfHwgaWQgPT09ICdhcmd1bWVudHMnO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWtleXdvcmRzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5pc0tleXdvcmQgPSBmdW5jdGlvbiAoaWQpIHtcblx0ICAgICAgICBzd2l0Y2ggKGlkLmxlbmd0aCkge1xuXHQgICAgICAgICAgICBjYXNlIDI6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAnaWYnKSB8fCAoaWQgPT09ICdpbicpIHx8IChpZCA9PT0gJ2RvJyk7XG5cdCAgICAgICAgICAgIGNhc2UgMzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICd2YXInKSB8fCAoaWQgPT09ICdmb3InKSB8fCAoaWQgPT09ICduZXcnKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgIChpZCA9PT0gJ3RyeScpIHx8IChpZCA9PT0gJ2xldCcpO1xuXHQgICAgICAgICAgICBjYXNlIDQ6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAndGhpcycpIHx8IChpZCA9PT0gJ2Vsc2UnKSB8fCAoaWQgPT09ICdjYXNlJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAoaWQgPT09ICd2b2lkJykgfHwgKGlkID09PSAnd2l0aCcpIHx8IChpZCA9PT0gJ2VudW0nKTtcblx0ICAgICAgICAgICAgY2FzZSA1OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3doaWxlJykgfHwgKGlkID09PSAnYnJlYWsnKSB8fCAoaWQgPT09ICdjYXRjaCcpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKGlkID09PSAndGhyb3cnKSB8fCAoaWQgPT09ICdjb25zdCcpIHx8IChpZCA9PT0gJ3lpZWxkJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAoaWQgPT09ICdjbGFzcycpIHx8IChpZCA9PT0gJ3N1cGVyJyk7XG5cdCAgICAgICAgICAgIGNhc2UgNjpcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdyZXR1cm4nKSB8fCAoaWQgPT09ICd0eXBlb2YnKSB8fCAoaWQgPT09ICdkZWxldGUnKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgIChpZCA9PT0gJ3N3aXRjaCcpIHx8IChpZCA9PT0gJ2V4cG9ydCcpIHx8IChpZCA9PT0gJ2ltcG9ydCcpO1xuXHQgICAgICAgICAgICBjYXNlIDc6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAnZGVmYXVsdCcpIHx8IChpZCA9PT0gJ2ZpbmFsbHknKSB8fCAoaWQgPT09ICdleHRlbmRzJyk7XG5cdCAgICAgICAgICAgIGNhc2UgODpcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdmdW5jdGlvbicpIHx8IChpZCA9PT0gJ2NvbnRpbnVlJykgfHwgKGlkID09PSAnZGVidWdnZXInKTtcblx0ICAgICAgICAgICAgY2FzZSAxMDpcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdpbnN0YW5jZW9mJyk7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLmNvZGVQb2ludEF0ID0gZnVuY3Rpb24gKGkpIHtcblx0ICAgICAgICB2YXIgY3AgPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KGkpO1xuXHQgICAgICAgIGlmIChjcCA+PSAweEQ4MDAgJiYgY3AgPD0gMHhEQkZGKSB7XG5cdCAgICAgICAgICAgIHZhciBzZWNvbmQgPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KGkgKyAxKTtcblx0ICAgICAgICAgICAgaWYgKHNlY29uZCA+PSAweERDMDAgJiYgc2Vjb25kIDw9IDB4REZGRikge1xuXHQgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gY3A7XG5cdCAgICAgICAgICAgICAgICBjcCA9IChmaXJzdCAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDA7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGNwO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5IZXhFc2NhcGUgPSBmdW5jdGlvbiAocHJlZml4KSB7XG5cdCAgICAgICAgdmFyIGxlbiA9IChwcmVmaXggPT09ICd1JykgPyA0IDogMjtcblx0ICAgICAgICB2YXIgY29kZSA9IDA7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuXHQgICAgICAgICAgICBpZiAoIXRoaXMuZW9mKCkgJiYgY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSGV4RGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlICogMTYgKyBoZXhWYWx1ZSh0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5Vbmljb2RlQ29kZVBvaW50RXNjYXBlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgIHZhciBjb2RlID0gMDtcblx0ICAgICAgICAvLyBBdCBsZWFzdCwgb25lIGhleCBkaWdpdCBpcyByZXF1aXJlZC5cblx0ICAgICAgICBpZiAoY2ggPT09ICd9Jykge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgIGlmICghY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSGV4RGlnaXQoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNvZGUgPSBjb2RlICogMTYgKyBoZXhWYWx1ZShjaCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChjb2RlID4gMHgxMEZGRkYgfHwgY2ggIT09ICd9Jykge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuZnJvbUNvZGVQb2ludChjb2RlKTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5nZXRJZGVudGlmaWVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXgrKztcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KTtcblx0ICAgICAgICAgICAgaWYgKGNoID09PSAweDVDKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBCbGFja3NsYXNoIChVKzAwNUMpIG1hcmtzIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlLlxuXHQgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcGxleElkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjaCA+PSAweEQ4MDAgJiYgY2ggPCAweERGRkYpIHtcblx0ICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gaGFuZGxlIHN1cnJvZ2F0ZSBwYWlycy5cblx0ICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbXBsZXhJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJQYXJ0KGNoKSkge1xuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnNsaWNlKHN0YXJ0LCB0aGlzLmluZGV4KTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5nZXRDb21wbGV4SWRlbnRpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgY3AgPSB0aGlzLmNvZGVQb2ludEF0KHRoaXMuaW5kZXgpO1xuXHQgICAgICAgIHZhciBpZCA9IGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5mcm9tQ29kZVBvaW50KGNwKTtcblx0ICAgICAgICB0aGlzLmluZGV4ICs9IGlkLmxlbmd0aDtcblx0ICAgICAgICAvLyAnXFx1JyAoVSswMDVDLCBVKzAwNzUpIGRlbm90ZXMgYW4gZXNjYXBlZCBjaGFyYWN0ZXIuXG5cdCAgICAgICAgdmFyIGNoO1xuXHQgICAgICAgIGlmIChjcCA9PT0gMHg1Qykge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSAhPT0gMHg3NSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09PSAneycpIHtcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIGNoID0gdGhpcy5zY2FuVW5pY29kZUNvZGVQb2ludEVzY2FwZSgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnNjYW5IZXhFc2NhcGUoJ3UnKTtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gbnVsbCB8fCBjaCA9PT0gJ1xcXFwnIHx8ICFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyU3RhcnQoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWQgPSBjaDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIGNwID0gdGhpcy5jb2RlUG9pbnRBdCh0aGlzLmluZGV4KTtcblx0ICAgICAgICAgICAgaWYgKCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyUGFydChjcCkpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNoID0gY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmZyb21Db2RlUG9pbnQoY3ApO1xuXHQgICAgICAgICAgICBpZCArPSBjaDtcblx0ICAgICAgICAgICAgdGhpcy5pbmRleCArPSBjaC5sZW5ndGg7XG5cdCAgICAgICAgICAgIC8vICdcXHUnIChVKzAwNUMsIFUrMDA3NSkgZGVub3RlcyBhbiBlc2NhcGVkIGNoYXJhY3Rlci5cblx0ICAgICAgICAgICAgaWYgKGNwID09PSAweDVDKSB7XG5cdCAgICAgICAgICAgICAgICBpZCA9IGlkLnN1YnN0cigwLCBpZC5sZW5ndGggLSAxKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpICE9PSAweDc1KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09PSAneycpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnNjYW5Vbmljb2RlQ29kZVBvaW50RXNjYXBlKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBjaCA9IHRoaXMuc2NhbkhleEVzY2FwZSgndScpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gbnVsbCB8fCBjaCA9PT0gJ1xcXFwnIHx8ICFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyUGFydChjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWQgKz0gY2g7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGlkO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLm9jdGFsVG9EZWNpbWFsID0gZnVuY3Rpb24gKGNoKSB7XG5cdCAgICAgICAgLy8gXFwwIGlzIG5vdCBvY3RhbCBlc2NhcGUgc2VxdWVuY2Vcblx0ICAgICAgICB2YXIgb2N0YWwgPSAoY2ggIT09ICcwJyk7XG5cdCAgICAgICAgdmFyIGNvZGUgPSBvY3RhbFZhbHVlKGNoKTtcblx0ICAgICAgICBpZiAoIXRoaXMuZW9mKCkgJiYgY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzT2N0YWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICBvY3RhbCA9IHRydWU7XG5cdCAgICAgICAgICAgIGNvZGUgPSBjb2RlICogOCArIG9jdGFsVmFsdWUodGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXSk7XG5cdCAgICAgICAgICAgIC8vIDMgZGlnaXRzIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiBzdHJpbmcgc3RhcnRzXG5cdCAgICAgICAgICAgIC8vIHdpdGggMCwgMSwgMiwgM1xuXHQgICAgICAgICAgICBpZiAoJzAxMjMnLmluZGV4T2YoY2gpID49IDAgJiYgIXRoaXMuZW9mKCkgJiYgY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzT2N0YWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICAgICAgY29kZSA9IGNvZGUgKiA4ICsgb2N0YWxWYWx1ZSh0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICBjb2RlOiBjb2RlLFxuXHQgICAgICAgICAgICBvY3RhbDogb2N0YWxcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW5hbWVzLWFuZC1rZXl3b3Jkc1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2NhbklkZW50aWZpZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHR5cGU7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAvLyBCYWNrc2xhc2ggKFUrMDA1Qykgc3RhcnRzIGFuIGVzY2FwZWQgY2hhcmFjdGVyLlxuXHQgICAgICAgIHZhciBpZCA9ICh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHN0YXJ0KSA9PT0gMHg1QykgPyB0aGlzLmdldENvbXBsZXhJZGVudGlmaWVyKCkgOiB0aGlzLmdldElkZW50aWZpZXIoKTtcblx0ICAgICAgICAvLyBUaGVyZSBpcyBubyBrZXl3b3JkIG9yIGxpdGVyYWwgd2l0aCBvbmx5IG9uZSBjaGFyYWN0ZXIuXG5cdCAgICAgICAgLy8gVGh1cywgaXQgbXVzdCBiZSBhbiBpZGVudGlmaWVyLlxuXHQgICAgICAgIGlmIChpZC5sZW5ndGggPT09IDEpIHtcblx0ICAgICAgICAgICAgdHlwZSA9IDMgLyogSWRlbnRpZmllciAqLztcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodGhpcy5pc0tleXdvcmQoaWQpKSB7XG5cdCAgICAgICAgICAgIHR5cGUgPSA0IC8qIEtleXdvcmQgKi87XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKGlkID09PSAnbnVsbCcpIHtcblx0ICAgICAgICAgICAgdHlwZSA9IDUgLyogTnVsbExpdGVyYWwgKi87XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKGlkID09PSAndHJ1ZScgfHwgaWQgPT09ICdmYWxzZScpIHtcblx0ICAgICAgICAgICAgdHlwZSA9IDEgLyogQm9vbGVhbkxpdGVyYWwgKi87XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0eXBlID0gMyAvKiBJZGVudGlmaWVyICovO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodHlwZSAhPT0gMyAvKiBJZGVudGlmaWVyICovICYmIChzdGFydCArIGlkLmxlbmd0aCAhPT0gdGhpcy5pbmRleCkpIHtcblx0ICAgICAgICAgICAgdmFyIHJlc3RvcmUgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkRXNjYXBlZFJlc2VydmVkV29yZCk7XG5cdCAgICAgICAgICAgIHRoaXMuaW5kZXggPSByZXN0b3JlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICB2YWx1ZTogaWQsXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXB1bmN0dWF0b3JzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuUHVuY3R1YXRvciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgIC8vIENoZWNrIGZvciBtb3N0IGNvbW1vbiBzaW5nbGUtY2hhcmFjdGVyIHB1bmN0dWF0b3JzLlxuXHQgICAgICAgIHZhciBzdHIgPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICBzd2l0Y2ggKHN0cikge1xuXHQgICAgICAgICAgICBjYXNlICcoJzpcblx0ICAgICAgICAgICAgY2FzZSAneyc6XG5cdCAgICAgICAgICAgICAgICBpZiAoc3RyID09PSAneycpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cmx5U3RhY2sucHVzaCgneycpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgJy4nOlxuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09PSAnLicgJiYgdGhpcy5zb3VyY2VbdGhpcy5pbmRleCArIDFdID09PSAnLicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBTcHJlYWQgb3BlcmF0b3I6IC4uLlxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gMjtcblx0ICAgICAgICAgICAgICAgICAgICBzdHIgPSAnLi4uJztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlICd9Jzpcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY3VybHlTdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlICcpJzpcblx0ICAgICAgICAgICAgY2FzZSAnOyc6XG5cdCAgICAgICAgICAgIGNhc2UgJywnOlxuXHQgICAgICAgICAgICBjYXNlICdbJzpcblx0ICAgICAgICAgICAgY2FzZSAnXSc6XG5cdCAgICAgICAgICAgIGNhc2UgJzonOlxuXHQgICAgICAgICAgICBjYXNlICc/Jzpcblx0ICAgICAgICAgICAgY2FzZSAnfic6XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIC8vIDQtY2hhcmFjdGVyIHB1bmN0dWF0b3IuXG5cdCAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLnNvdXJjZS5zdWJzdHIodGhpcy5pbmRleCwgNCk7XG5cdCAgICAgICAgICAgICAgICBpZiAoc3RyID09PSAnPj4+PScpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyAzLWNoYXJhY3RlciBwdW5jdHVhdG9ycy5cblx0ICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDAsIDMpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChzdHIgPT09ICc9PT0nIHx8IHN0ciA9PT0gJyE9PScgfHwgc3RyID09PSAnPj4+JyB8fFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPT09ICc8PD0nIHx8IHN0ciA9PT0gJz4+PScgfHwgc3RyID09PSAnKio9Jykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDM7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLWNoYXJhY3RlciBwdW5jdHVhdG9ycy5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cigwLCAyKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ciA9PT0gJyYmJyB8fCBzdHIgPT09ICd8fCcgfHwgc3RyID09PSAnPT0nIHx8IHN0ciA9PT0gJyE9JyB8fFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSAnKz0nIHx8IHN0ciA9PT0gJy09JyB8fCBzdHIgPT09ICcqPScgfHwgc3RyID09PSAnLz0nIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPT09ICcrKycgfHwgc3RyID09PSAnLS0nIHx8IHN0ciA9PT0gJzw8JyB8fCBzdHIgPT09ICc+PicgfHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9PT0gJyY9JyB8fCBzdHIgPT09ICd8PScgfHwgc3RyID09PSAnXj0nIHx8IHN0ciA9PT0gJyU9JyB8fFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSAnPD0nIHx8IHN0ciA9PT0gJz49JyB8fCBzdHIgPT09ICc9PicgfHwgc3RyID09PSAnKionKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDI7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLWNoYXJhY3RlciBwdW5jdHVhdG9ycy5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCc8Pj0hKy0qJSZ8Xi8nLmluZGV4T2Yoc3RyKSA+PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gc3RhcnQpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICB0eXBlOiA3IC8qIFB1bmN0dWF0b3IgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiBzdHIsXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxpdGVyYWxzLW51bWVyaWMtbGl0ZXJhbHNcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5IZXhMaXRlcmFsID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG5cdCAgICAgICAgdmFyIG51bSA9ICcnO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBpZiAoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0hleERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBudW0gKz0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKG51bS5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogNiAvKiBOdW1lcmljTGl0ZXJhbCAqLyxcblx0ICAgICAgICAgICAgdmFsdWU6IHBhcnNlSW50KCcweCcgKyBudW0sIDE2KSxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2NhbkJpbmFyeUxpdGVyYWwgPSBmdW5jdGlvbiAoc3RhcnQpIHtcblx0ICAgICAgICB2YXIgbnVtID0gJyc7XG5cdCAgICAgICAgdmFyIGNoO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgICAgICBpZiAoY2ggIT09ICcwJyAmJiBjaCAhPT0gJzEnKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBudW0gKz0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKG51bS5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgLy8gb25seSAwYiBvciAwQlxuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG5cdCAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyU3RhcnQoY2gpIHx8IGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdChjaCkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICB0eXBlOiA2IC8qIE51bWVyaWNMaXRlcmFsICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogcGFyc2VJbnQobnVtLCAyKSxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2Nhbk9jdGFsTGl0ZXJhbCA9IGZ1bmN0aW9uIChwcmVmaXgsIHN0YXJ0KSB7XG5cdCAgICAgICAgdmFyIG51bSA9ICcnO1xuXHQgICAgICAgIHZhciBvY3RhbCA9IGZhbHNlO1xuXHQgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNPY3RhbERpZ2l0KHByZWZpeC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICBvY3RhbCA9IHRydWU7XG5cdCAgICAgICAgICAgIG51bSA9ICcwJyArIHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBpZiAoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIG51bSArPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIW9jdGFsICYmIG51bS5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgLy8gb25seSAwbyBvciAwT1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyU3RhcnQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkgfHwgY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogNiAvKiBOdW1lcmljTGl0ZXJhbCAqLyxcblx0ICAgICAgICAgICAgdmFsdWU6IHBhcnNlSW50KG51bSwgOCksXG5cdCAgICAgICAgICAgIG9jdGFsOiBvY3RhbCxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuaXNJbXBsaWNpdE9jdGFsTGl0ZXJhbCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAvLyBJbXBsaWNpdCBvY3RhbCwgdW5sZXNzIHRoZXJlIGlzIGEgbm9uLW9jdGFsIGRpZ2l0LlxuXHQgICAgICAgIC8vIChBbm5leCBCLjEuMSBvbiBOdW1lcmljIExpdGVyYWxzKVxuXHQgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmluZGV4ICsgMTsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zb3VyY2VbaV07XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gJzgnIHx8IGNoID09PSAnOScpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5OdW1lcmljTGl0ZXJhbCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlW3N0YXJ0XTtcblx0ICAgICAgICBhc3NlcnRfMS5hc3NlcnQoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpIHx8IChjaCA9PT0gJy4nKSwgJ051bWVyaWMgbGl0ZXJhbCBtdXN0IHN0YXJ0IHdpdGggYSBkZWNpbWFsIGRpZ2l0IG9yIGEgZGVjaW1hbCBwb2ludCcpO1xuXHQgICAgICAgIHZhciBudW0gPSAnJztcblx0ICAgICAgICBpZiAoY2ggIT09ICcuJykge1xuXHQgICAgICAgICAgICBudW0gPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgICAgICAvLyBIZXggbnVtYmVyIHN0YXJ0cyB3aXRoICcweCcuXG5cdCAgICAgICAgICAgIC8vIE9jdGFsIG51bWJlciBzdGFydHMgd2l0aCAnMCcuXG5cdCAgICAgICAgICAgIC8vIE9jdGFsIG51bWJlciBpbiBFUzYgc3RhcnRzIHdpdGggJzBvJy5cblx0ICAgICAgICAgICAgLy8gQmluYXJ5IG51bWJlciBpbiBFUzYgc3RhcnRzIHdpdGggJzBiJy5cblx0ICAgICAgICAgICAgaWYgKG51bSA9PT0gJzAnKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd4JyB8fCBjaCA9PT0gJ1gnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5IZXhMaXRlcmFsKHN0YXJ0KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ2InIHx8IGNoID09PSAnQicpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbkJpbmFyeUxpdGVyYWwoc3RhcnQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnbycgfHwgY2ggPT09ICdPJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5PY3RhbExpdGVyYWwoY2gsIHN0YXJ0KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChjaCAmJiBjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNPY3RhbERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbXBsaWNpdE9jdGFsTGl0ZXJhbCgpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5PY3RhbExpdGVyYWwoY2gsIHN0YXJ0KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgd2hpbGUgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICAgICAgbnVtICs9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGNoID09PSAnLicpIHtcblx0ICAgICAgICAgICAgbnVtICs9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgIHdoaWxlIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIG51bSArPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChjaCA9PT0gJ2UnIHx8IGNoID09PSAnRScpIHtcblx0ICAgICAgICAgICAgbnVtICs9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleF07XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gJysnIHx8IGNoID09PSAnLScpIHtcblx0ICAgICAgICAgICAgICAgIG51bSArPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIHdoaWxlIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBudW0gKz0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogNiAvKiBOdW1lcmljTGl0ZXJhbCAqLyxcblx0ICAgICAgICAgICAgdmFsdWU6IHBhcnNlRmxvYXQobnVtKSxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbGl0ZXJhbHMtc3RyaW5nLWxpdGVyYWxzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuU3RyaW5nTGl0ZXJhbCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgIHZhciBxdW90ZSA9IHRoaXMuc291cmNlW3N0YXJ0XTtcblx0ICAgICAgICBhc3NlcnRfMS5hc3NlcnQoKHF1b3RlID09PSAnXFwnJyB8fCBxdW90ZSA9PT0gJ1wiJyksICdTdHJpbmcgbGl0ZXJhbCBtdXN0IHN0YXJ0cyB3aXRoIGEgcXVvdGUnKTtcblx0ICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgdmFyIG9jdGFsID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIHN0ciA9ICcnO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09IHF1b3RlKSB7XG5cdCAgICAgICAgICAgICAgICBxdW90ZSA9ICcnO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT09ICdcXFxcJykge1xuXHQgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFjaCB8fCAhY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09PSAneycpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IHRoaXMuc2NhblVuaWNvZGVDb2RlUG9pbnRFc2NhcGUoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmVzY2FwZWRfMSA9IHRoaXMuc2NhbkhleEVzY2FwZShjaCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuZXNjYXBlZF8xID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IHVuZXNjYXBlZF8xO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVuZXNjYXBlZCA9IHRoaXMuc2NhbkhleEVzY2FwZShjaCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5lc2NhcGVkID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRIZXhFc2NhcGVTZXF1ZW5jZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gdW5lc2NhcGVkO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXG4nO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXHInO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXHQnO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXGInO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXGYnO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3YnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXHgwQic7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOCc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzknOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGNoO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggJiYgY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzT2N0YWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvY3RUb0RlYyA9IHRoaXMub2N0YWxUb0RlY2ltYWwoY2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jdGFsID0gb2N0VG9EZWMub2N0YWwgfHwgb2N0YWw7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUob2N0VG9EZWMuY29kZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gY2g7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09PSAnXFxuJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZVN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBzdHIgKz0gY2g7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHF1b3RlICE9PSAnJykge1xuXHQgICAgICAgICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogOCAvKiBTdHJpbmdMaXRlcmFsICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogc3RyLFxuXHQgICAgICAgICAgICBvY3RhbDogb2N0YWwsXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuVGVtcGxhdGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNvb2tlZCA9ICcnO1xuXHQgICAgICAgIHZhciB0ZXJtaW5hdGVkID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICB2YXIgaGVhZCA9ICh0aGlzLnNvdXJjZVtzdGFydF0gPT09ICdgJyk7XG5cdCAgICAgICAgdmFyIHRhaWwgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgcmF3T2Zmc2V0ID0gMjtcblx0ICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gJ2AnKSB7XG5cdCAgICAgICAgICAgICAgICByYXdPZmZzZXQgPSAxO1xuXHQgICAgICAgICAgICAgICAgdGFpbCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAnJCcpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJseVN0YWNrLnB1c2goJyR7Jyk7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29va2VkICs9IGNoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAnXFxcXCcpIHtcblx0ICAgICAgICAgICAgICAgIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgICAgIGlmICghY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9ICdcXG4nO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9ICdcXHInO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9ICdcXHQnO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09PSAneycpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9IHRoaXMuc2NhblVuaWNvZGVDb2RlUG9pbnRFc2NhcGUoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN0b3JlID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5lc2NhcGVkXzIgPSB0aGlzLnNjYW5IZXhFc2NhcGUoY2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmVzY2FwZWRfMiAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29rZWQgKz0gdW5lc2NhcGVkXzI7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gcmVzdG9yZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9IGNoO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmVzY2FwZWQgPSB0aGlzLnNjYW5IZXhFc2NhcGUoY2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuZXNjYXBlZCA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkSGV4RXNjYXBlU2VxdWVuY2UpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9IHVuZXNjYXBlZDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFxiJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFxmJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFx2Jztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnMCcpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElsbGVnYWw6IFxcMDEgXFwwMiBhbmQgc28gb25cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLlRlbXBsYXRlT2N0YWxMaXRlcmFsKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9ICdcXDAnO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzT2N0YWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElsbGVnYWw6IFxcMSBcXDJcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKG1lc3NhZ2VzXzEuTWVzc2FnZXMuVGVtcGxhdGVPY3RhbExpdGVyYWwpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9IGNoO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ1xcbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ1xcbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICBjb29rZWQgKz0gJ1xcbic7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBjb29rZWQgKz0gY2g7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCF0ZXJtaW5hdGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCFoZWFkKSB7XG5cdCAgICAgICAgICAgIHRoaXMuY3VybHlTdGFjay5wb3AoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogMTAgLyogVGVtcGxhdGUgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNvdXJjZS5zbGljZShzdGFydCArIDEsIHRoaXMuaW5kZXggLSByYXdPZmZzZXQpLFxuXHQgICAgICAgICAgICBjb29rZWQ6IGNvb2tlZCxcblx0ICAgICAgICAgICAgaGVhZDogaGVhZCxcblx0ICAgICAgICAgICAgdGFpbDogdGFpbCxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbGl0ZXJhbHMtcmVndWxhci1leHByZXNzaW9uLWxpdGVyYWxzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS50ZXN0UmVnRXhwID0gZnVuY3Rpb24gKHBhdHRlcm4sIGZsYWdzKSB7XG5cdCAgICAgICAgLy8gVGhlIEJNUCBjaGFyYWN0ZXIgdG8gdXNlIGFzIGEgcmVwbGFjZW1lbnQgZm9yIGFzdHJhbCBzeW1ib2xzIHdoZW5cblx0ICAgICAgICAvLyB0cmFuc2xhdGluZyBhbiBFUzYgXCJ1XCItZmxhZ2dlZCBwYXR0ZXJuIHRvIGFuIEVTNS1jb21wYXRpYmxlXG5cdCAgICAgICAgLy8gYXBwcm94aW1hdGlvbi5cblx0ICAgICAgICAvLyBOb3RlOiByZXBsYWNpbmcgd2l0aCAnXFx1RkZGRicgZW5hYmxlcyBmYWxzZSBwb3NpdGl2ZXMgaW4gdW5saWtlbHlcblx0ICAgICAgICAvLyBzY2VuYXJpb3MuIEZvciBleGFtcGxlLCBgW1xcdXsxMDQ0Zn0tXFx1ezEwNDQwfV1gIGlzIGFuIGludmFsaWRcblx0ICAgICAgICAvLyBwYXR0ZXJuIHRoYXQgd291bGQgbm90IGJlIGRldGVjdGVkIGJ5IHRoaXMgc3Vic3RpdHV0aW9uLlxuXHQgICAgICAgIHZhciBhc3RyYWxTdWJzdGl0dXRlID0gJ1xcdUZGRkYnO1xuXHQgICAgICAgIHZhciB0bXAgPSBwYXR0ZXJuO1xuXHQgICAgICAgIHZhciBzZWxmID0gdGhpcztcblx0ICAgICAgICBpZiAoZmxhZ3MuaW5kZXhPZigndScpID49IDApIHtcblx0ICAgICAgICAgICAgdG1wID0gdG1wXG5cdCAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXHVcXHsoWzAtOWEtZkEtRl0rKVxcfXxcXFxcdShbYS1mQS1GMC05XXs0fSkvZywgZnVuY3Rpb24gKCQwLCAkMSwgJDIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBwYXJzZUludCgkMSB8fCAkMiwgMTYpO1xuXHQgICAgICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4MTBGRkZGKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc2VsZi50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRSZWdFeHApO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8PSAweEZGRkYpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGFzdHJhbFN1YnN0aXR1dGU7XG5cdCAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAucmVwbGFjZSgvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXS9nLCBhc3RyYWxTdWJzdGl0dXRlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gRmlyc3QsIGRldGVjdCBpbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgUmVnRXhwKHRtcCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkUmVnRXhwKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gUmV0dXJuIGEgcmVndWxhciBleHByZXNzaW9uIG9iamVjdCBmb3IgdGhpcyBwYXR0ZXJuLWZsYWcgcGFpciwgb3Jcblx0ICAgICAgICAvLyBgbnVsbGAgaW4gY2FzZSB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2Vzbid0IHN1cHBvcnQgdGhlIGZsYWdzIGl0XG5cdCAgICAgICAgLy8gdXNlcy5cblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuLCBmbGFncyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcblx0ICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0ICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5SZWdFeHBCb2R5ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgIGFzc2VydF8xLmFzc2VydChjaCA9PT0gJy8nLCAnUmVndWxhciBleHByZXNzaW9uIGxpdGVyYWwgbXVzdCBzdGFydCB3aXRoIGEgc2xhc2gnKTtcblx0ICAgICAgICB2YXIgc3RyID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICB2YXIgY2xhc3NNYXJrZXIgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgdGVybWluYXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgIHN0ciArPSBjaDtcblx0ICAgICAgICAgICAgaWYgKGNoID09PSAnXFxcXCcpIHtcblx0ICAgICAgICAgICAgICAgIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxpdGVyYWxzLXJlZ3VsYXItZXhwcmVzc2lvbi1saXRlcmFsc1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLlVudGVybWluYXRlZFJlZ0V4cCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBzdHIgKz0gY2g7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5VbnRlcm1pbmF0ZWRSZWdFeHApO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNsYXNzTWFya2VyKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNsYXNzTWFya2VyID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcvJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT09ICdbJykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNsYXNzTWFya2VyID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXRlcm1pbmF0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLlVudGVybWluYXRlZFJlZ0V4cCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIEV4Y2x1ZGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2guXG5cdCAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoMSwgc3RyLmxlbmd0aCAtIDIpO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5SZWdFeHBGbGFncyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RyID0gJyc7XG5cdCAgICAgICAgdmFyIGZsYWdzID0gJyc7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgICAgICBpZiAoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJQYXJ0KGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcXFwnICYmICF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAndScpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3RvcmUgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjaGFyID0gdGhpcy5zY2FuSGV4RXNjYXBlKCd1Jyk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXIgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgKz0gY2hhcjtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzdHIgKz0gJ1xcXFx1JzsgcmVzdG9yZSA8IHRoaXMuaW5kZXg7ICsrcmVzdG9yZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IHRoaXMuc291cmNlW3Jlc3RvcmVdO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gcmVzdG9yZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgKz0gJ3UnO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFx1Jztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcJztcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBmbGFncyArPSBjaDtcblx0ICAgICAgICAgICAgICAgIHN0ciArPSBjaDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZmxhZ3M7XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2NhblJlZ0V4cCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgIHZhciBwYXR0ZXJuID0gdGhpcy5zY2FuUmVnRXhwQm9keSgpO1xuXHQgICAgICAgIHZhciBmbGFncyA9IHRoaXMuc2NhblJlZ0V4cEZsYWdzKCk7XG5cdCAgICAgICAgdmFyIHZhbHVlID0gdGhpcy50ZXN0UmVnRXhwKHBhdHRlcm4sIGZsYWdzKTtcblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICB0eXBlOiA5IC8qIFJlZ3VsYXJFeHByZXNzaW9uICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogJycsXG5cdCAgICAgICAgICAgIHBhdHRlcm46IHBhdHRlcm4sXG5cdCAgICAgICAgICAgIGZsYWdzOiBmbGFncyxcblx0ICAgICAgICAgICAgcmVnZXg6IHZhbHVlLFxuXHQgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcblx0ICAgICAgICAgICAgZW5kOiB0aGlzLmluZGV4XG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5sZXggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgIHR5cGU6IDIgLyogRU9GICovLFxuXHQgICAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuXHQgICAgICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmluZGV4LFxuXHQgICAgICAgICAgICAgICAgZW5kOiB0aGlzLmluZGV4XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBjcCA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG5cdCAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJTdGFydChjcCkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbklkZW50aWZpZXIoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gVmVyeSBjb21tb246ICggYW5kICkgYW5kIDtcblx0ICAgICAgICBpZiAoY3AgPT09IDB4MjggfHwgY3AgPT09IDB4MjkgfHwgY3AgPT09IDB4M0IpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhblB1bmN0dWF0b3IoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gU3RyaW5nIGxpdGVyYWwgc3RhcnRzIHdpdGggc2luZ2xlIHF1b3RlIChVKzAwMjcpIG9yIGRvdWJsZSBxdW90ZSAoVSswMDIyKS5cblx0ICAgICAgICBpZiAoY3AgPT09IDB4MjcgfHwgY3AgPT09IDB4MjIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhblN0cmluZ0xpdGVyYWwoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gRG90ICguKSBVKzAwMkUgY2FuIGFsc28gc3RhcnQgYSBmbG9hdGluZy1wb2ludCBudW1iZXIsIGhlbmNlIHRoZSBuZWVkXG5cdCAgICAgICAgLy8gdG8gY2hlY2sgdGhlIG5leHQgY2hhcmFjdGVyLlxuXHQgICAgICAgIGlmIChjcCA9PT0gMHgyRSkge1xuXHQgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCArIDEpKSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Nhbk51bWVyaWNMaXRlcmFsKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhblB1bmN0dWF0b3IoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdChjcCkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Nhbk51bWVyaWNMaXRlcmFsKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFRlbXBsYXRlIGxpdGVyYWxzIHN0YXJ0IHdpdGggYCAoVSswMDYwKSBmb3IgdGVtcGxhdGUgaGVhZFxuXHQgICAgICAgIC8vIG9yIH0gKFUrMDA3RCkgZm9yIHRlbXBsYXRlIG1pZGRsZSBvciB0ZW1wbGF0ZSB0YWlsLlxuXHQgICAgICAgIGlmIChjcCA9PT0gMHg2MCB8fCAoY3AgPT09IDB4N0QgJiYgdGhpcy5jdXJseVN0YWNrW3RoaXMuY3VybHlTdGFjay5sZW5ndGggLSAxXSA9PT0gJyR7JykpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhblRlbXBsYXRlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFBvc3NpYmxlIGlkZW50aWZpZXIgc3RhcnQgaW4gYSBzdXJyb2dhdGUgcGFpci5cblx0ICAgICAgICBpZiAoY3AgPj0gMHhEODAwICYmIGNwIDwgMHhERkZGKSB7XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyU3RhcnQodGhpcy5jb2RlUG9pbnRBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5JZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuc2NhblB1bmN0dWF0b3IoKTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gU2Nhbm5lcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5TY2FubmVyID0gU2Nhbm5lcjtcblxuXG4vKioqLyB9LFxuLyogMTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdGV4cG9ydHMuVG9rZW5OYW1lID0ge307XG5cdGV4cG9ydHMuVG9rZW5OYW1lWzEgLyogQm9vbGVhbkxpdGVyYWwgKi9dID0gJ0Jvb2xlYW4nO1xuXHRleHBvcnRzLlRva2VuTmFtZVsyIC8qIEVPRiAqL10gPSAnPGVuZD4nO1xuXHRleHBvcnRzLlRva2VuTmFtZVszIC8qIElkZW50aWZpZXIgKi9dID0gJ0lkZW50aWZpZXInO1xuXHRleHBvcnRzLlRva2VuTmFtZVs0IC8qIEtleXdvcmQgKi9dID0gJ0tleXdvcmQnO1xuXHRleHBvcnRzLlRva2VuTmFtZVs1IC8qIE51bGxMaXRlcmFsICovXSA9ICdOdWxsJztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbNiAvKiBOdW1lcmljTGl0ZXJhbCAqL10gPSAnTnVtZXJpYyc7XG5cdGV4cG9ydHMuVG9rZW5OYW1lWzcgLyogUHVuY3R1YXRvciAqL10gPSAnUHVuY3R1YXRvcic7XG5cdGV4cG9ydHMuVG9rZW5OYW1lWzggLyogU3RyaW5nTGl0ZXJhbCAqL10gPSAnU3RyaW5nJztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbOSAvKiBSZWd1bGFyRXhwcmVzc2lvbiAqL10gPSAnUmVndWxhckV4cHJlc3Npb24nO1xuXHRleHBvcnRzLlRva2VuTmFtZVsxMCAvKiBUZW1wbGF0ZSAqL10gPSAnVGVtcGxhdGUnO1xuXG5cbi8qKiovIH0sXG4vKiAxNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdC8vIEdlbmVyYXRlZCBieSBnZW5lcmF0ZS14aHRtbC1lbnRpdGllcy5qcy4gRE8gTk9UIE1PRElGWSFcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHRleHBvcnRzLlhIVE1MRW50aXRpZXMgPSB7XG5cdCAgICBxdW90OiAnXFx1MDAyMicsXG5cdCAgICBhbXA6ICdcXHUwMDI2Jyxcblx0ICAgIGFwb3M6ICdcXHUwMDI3Jyxcblx0ICAgIGd0OiAnXFx1MDAzRScsXG5cdCAgICBuYnNwOiAnXFx1MDBBMCcsXG5cdCAgICBpZXhjbDogJ1xcdTAwQTEnLFxuXHQgICAgY2VudDogJ1xcdTAwQTInLFxuXHQgICAgcG91bmQ6ICdcXHUwMEEzJyxcblx0ICAgIGN1cnJlbjogJ1xcdTAwQTQnLFxuXHQgICAgeWVuOiAnXFx1MDBBNScsXG5cdCAgICBicnZiYXI6ICdcXHUwMEE2Jyxcblx0ICAgIHNlY3Q6ICdcXHUwMEE3Jyxcblx0ICAgIHVtbDogJ1xcdTAwQTgnLFxuXHQgICAgY29weTogJ1xcdTAwQTknLFxuXHQgICAgb3JkZjogJ1xcdTAwQUEnLFxuXHQgICAgbGFxdW86ICdcXHUwMEFCJyxcblx0ICAgIG5vdDogJ1xcdTAwQUMnLFxuXHQgICAgc2h5OiAnXFx1MDBBRCcsXG5cdCAgICByZWc6ICdcXHUwMEFFJyxcblx0ICAgIG1hY3I6ICdcXHUwMEFGJyxcblx0ICAgIGRlZzogJ1xcdTAwQjAnLFxuXHQgICAgcGx1c21uOiAnXFx1MDBCMScsXG5cdCAgICBzdXAyOiAnXFx1MDBCMicsXG5cdCAgICBzdXAzOiAnXFx1MDBCMycsXG5cdCAgICBhY3V0ZTogJ1xcdTAwQjQnLFxuXHQgICAgbWljcm86ICdcXHUwMEI1Jyxcblx0ICAgIHBhcmE6ICdcXHUwMEI2Jyxcblx0ICAgIG1pZGRvdDogJ1xcdTAwQjcnLFxuXHQgICAgY2VkaWw6ICdcXHUwMEI4Jyxcblx0ICAgIHN1cDE6ICdcXHUwMEI5Jyxcblx0ICAgIG9yZG06ICdcXHUwMEJBJyxcblx0ICAgIHJhcXVvOiAnXFx1MDBCQicsXG5cdCAgICBmcmFjMTQ6ICdcXHUwMEJDJyxcblx0ICAgIGZyYWMxMjogJ1xcdTAwQkQnLFxuXHQgICAgZnJhYzM0OiAnXFx1MDBCRScsXG5cdCAgICBpcXVlc3Q6ICdcXHUwMEJGJyxcblx0ICAgIEFncmF2ZTogJ1xcdTAwQzAnLFxuXHQgICAgQWFjdXRlOiAnXFx1MDBDMScsXG5cdCAgICBBY2lyYzogJ1xcdTAwQzInLFxuXHQgICAgQXRpbGRlOiAnXFx1MDBDMycsXG5cdCAgICBBdW1sOiAnXFx1MDBDNCcsXG5cdCAgICBBcmluZzogJ1xcdTAwQzUnLFxuXHQgICAgQUVsaWc6ICdcXHUwMEM2Jyxcblx0ICAgIENjZWRpbDogJ1xcdTAwQzcnLFxuXHQgICAgRWdyYXZlOiAnXFx1MDBDOCcsXG5cdCAgICBFYWN1dGU6ICdcXHUwMEM5Jyxcblx0ICAgIEVjaXJjOiAnXFx1MDBDQScsXG5cdCAgICBFdW1sOiAnXFx1MDBDQicsXG5cdCAgICBJZ3JhdmU6ICdcXHUwMENDJyxcblx0ICAgIElhY3V0ZTogJ1xcdTAwQ0QnLFxuXHQgICAgSWNpcmM6ICdcXHUwMENFJyxcblx0ICAgIEl1bWw6ICdcXHUwMENGJyxcblx0ICAgIEVUSDogJ1xcdTAwRDAnLFxuXHQgICAgTnRpbGRlOiAnXFx1MDBEMScsXG5cdCAgICBPZ3JhdmU6ICdcXHUwMEQyJyxcblx0ICAgIE9hY3V0ZTogJ1xcdTAwRDMnLFxuXHQgICAgT2NpcmM6ICdcXHUwMEQ0Jyxcblx0ICAgIE90aWxkZTogJ1xcdTAwRDUnLFxuXHQgICAgT3VtbDogJ1xcdTAwRDYnLFxuXHQgICAgdGltZXM6ICdcXHUwMEQ3Jyxcblx0ICAgIE9zbGFzaDogJ1xcdTAwRDgnLFxuXHQgICAgVWdyYXZlOiAnXFx1MDBEOScsXG5cdCAgICBVYWN1dGU6ICdcXHUwMERBJyxcblx0ICAgIFVjaXJjOiAnXFx1MDBEQicsXG5cdCAgICBVdW1sOiAnXFx1MDBEQycsXG5cdCAgICBZYWN1dGU6ICdcXHUwMEREJyxcblx0ICAgIFRIT1JOOiAnXFx1MDBERScsXG5cdCAgICBzemxpZzogJ1xcdTAwREYnLFxuXHQgICAgYWdyYXZlOiAnXFx1MDBFMCcsXG5cdCAgICBhYWN1dGU6ICdcXHUwMEUxJyxcblx0ICAgIGFjaXJjOiAnXFx1MDBFMicsXG5cdCAgICBhdGlsZGU6ICdcXHUwMEUzJyxcblx0ICAgIGF1bWw6ICdcXHUwMEU0Jyxcblx0ICAgIGFyaW5nOiAnXFx1MDBFNScsXG5cdCAgICBhZWxpZzogJ1xcdTAwRTYnLFxuXHQgICAgY2NlZGlsOiAnXFx1MDBFNycsXG5cdCAgICBlZ3JhdmU6ICdcXHUwMEU4Jyxcblx0ICAgIGVhY3V0ZTogJ1xcdTAwRTknLFxuXHQgICAgZWNpcmM6ICdcXHUwMEVBJyxcblx0ICAgIGV1bWw6ICdcXHUwMEVCJyxcblx0ICAgIGlncmF2ZTogJ1xcdTAwRUMnLFxuXHQgICAgaWFjdXRlOiAnXFx1MDBFRCcsXG5cdCAgICBpY2lyYzogJ1xcdTAwRUUnLFxuXHQgICAgaXVtbDogJ1xcdTAwRUYnLFxuXHQgICAgZXRoOiAnXFx1MDBGMCcsXG5cdCAgICBudGlsZGU6ICdcXHUwMEYxJyxcblx0ICAgIG9ncmF2ZTogJ1xcdTAwRjInLFxuXHQgICAgb2FjdXRlOiAnXFx1MDBGMycsXG5cdCAgICBvY2lyYzogJ1xcdTAwRjQnLFxuXHQgICAgb3RpbGRlOiAnXFx1MDBGNScsXG5cdCAgICBvdW1sOiAnXFx1MDBGNicsXG5cdCAgICBkaXZpZGU6ICdcXHUwMEY3Jyxcblx0ICAgIG9zbGFzaDogJ1xcdTAwRjgnLFxuXHQgICAgdWdyYXZlOiAnXFx1MDBGOScsXG5cdCAgICB1YWN1dGU6ICdcXHUwMEZBJyxcblx0ICAgIHVjaXJjOiAnXFx1MDBGQicsXG5cdCAgICB1dW1sOiAnXFx1MDBGQycsXG5cdCAgICB5YWN1dGU6ICdcXHUwMEZEJyxcblx0ICAgIHRob3JuOiAnXFx1MDBGRScsXG5cdCAgICB5dW1sOiAnXFx1MDBGRicsXG5cdCAgICBPRWxpZzogJ1xcdTAxNTInLFxuXHQgICAgb2VsaWc6ICdcXHUwMTUzJyxcblx0ICAgIFNjYXJvbjogJ1xcdTAxNjAnLFxuXHQgICAgc2Nhcm9uOiAnXFx1MDE2MScsXG5cdCAgICBZdW1sOiAnXFx1MDE3OCcsXG5cdCAgICBmbm9mOiAnXFx1MDE5MicsXG5cdCAgICBjaXJjOiAnXFx1MDJDNicsXG5cdCAgICB0aWxkZTogJ1xcdTAyREMnLFxuXHQgICAgQWxwaGE6ICdcXHUwMzkxJyxcblx0ICAgIEJldGE6ICdcXHUwMzkyJyxcblx0ICAgIEdhbW1hOiAnXFx1MDM5MycsXG5cdCAgICBEZWx0YTogJ1xcdTAzOTQnLFxuXHQgICAgRXBzaWxvbjogJ1xcdTAzOTUnLFxuXHQgICAgWmV0YTogJ1xcdTAzOTYnLFxuXHQgICAgRXRhOiAnXFx1MDM5NycsXG5cdCAgICBUaGV0YTogJ1xcdTAzOTgnLFxuXHQgICAgSW90YTogJ1xcdTAzOTknLFxuXHQgICAgS2FwcGE6ICdcXHUwMzlBJyxcblx0ICAgIExhbWJkYTogJ1xcdTAzOUInLFxuXHQgICAgTXU6ICdcXHUwMzlDJyxcblx0ICAgIE51OiAnXFx1MDM5RCcsXG5cdCAgICBYaTogJ1xcdTAzOUUnLFxuXHQgICAgT21pY3JvbjogJ1xcdTAzOUYnLFxuXHQgICAgUGk6ICdcXHUwM0EwJyxcblx0ICAgIFJobzogJ1xcdTAzQTEnLFxuXHQgICAgU2lnbWE6ICdcXHUwM0EzJyxcblx0ICAgIFRhdTogJ1xcdTAzQTQnLFxuXHQgICAgVXBzaWxvbjogJ1xcdTAzQTUnLFxuXHQgICAgUGhpOiAnXFx1MDNBNicsXG5cdCAgICBDaGk6ICdcXHUwM0E3Jyxcblx0ICAgIFBzaTogJ1xcdTAzQTgnLFxuXHQgICAgT21lZ2E6ICdcXHUwM0E5Jyxcblx0ICAgIGFscGhhOiAnXFx1MDNCMScsXG5cdCAgICBiZXRhOiAnXFx1MDNCMicsXG5cdCAgICBnYW1tYTogJ1xcdTAzQjMnLFxuXHQgICAgZGVsdGE6ICdcXHUwM0I0Jyxcblx0ICAgIGVwc2lsb246ICdcXHUwM0I1Jyxcblx0ICAgIHpldGE6ICdcXHUwM0I2Jyxcblx0ICAgIGV0YTogJ1xcdTAzQjcnLFxuXHQgICAgdGhldGE6ICdcXHUwM0I4Jyxcblx0ICAgIGlvdGE6ICdcXHUwM0I5Jyxcblx0ICAgIGthcHBhOiAnXFx1MDNCQScsXG5cdCAgICBsYW1iZGE6ICdcXHUwM0JCJyxcblx0ICAgIG11OiAnXFx1MDNCQycsXG5cdCAgICBudTogJ1xcdTAzQkQnLFxuXHQgICAgeGk6ICdcXHUwM0JFJyxcblx0ICAgIG9taWNyb246ICdcXHUwM0JGJyxcblx0ICAgIHBpOiAnXFx1MDNDMCcsXG5cdCAgICByaG86ICdcXHUwM0MxJyxcblx0ICAgIHNpZ21hZjogJ1xcdTAzQzInLFxuXHQgICAgc2lnbWE6ICdcXHUwM0MzJyxcblx0ICAgIHRhdTogJ1xcdTAzQzQnLFxuXHQgICAgdXBzaWxvbjogJ1xcdTAzQzUnLFxuXHQgICAgcGhpOiAnXFx1MDNDNicsXG5cdCAgICBjaGk6ICdcXHUwM0M3Jyxcblx0ICAgIHBzaTogJ1xcdTAzQzgnLFxuXHQgICAgb21lZ2E6ICdcXHUwM0M5Jyxcblx0ICAgIHRoZXRhc3ltOiAnXFx1MDNEMScsXG5cdCAgICB1cHNpaDogJ1xcdTAzRDInLFxuXHQgICAgcGl2OiAnXFx1MDNENicsXG5cdCAgICBlbnNwOiAnXFx1MjAwMicsXG5cdCAgICBlbXNwOiAnXFx1MjAwMycsXG5cdCAgICB0aGluc3A6ICdcXHUyMDA5Jyxcblx0ICAgIHp3bmo6ICdcXHUyMDBDJyxcblx0ICAgIHp3ajogJ1xcdTIwMEQnLFxuXHQgICAgbHJtOiAnXFx1MjAwRScsXG5cdCAgICBybG06ICdcXHUyMDBGJyxcblx0ICAgIG5kYXNoOiAnXFx1MjAxMycsXG5cdCAgICBtZGFzaDogJ1xcdTIwMTQnLFxuXHQgICAgbHNxdW86ICdcXHUyMDE4Jyxcblx0ICAgIHJzcXVvOiAnXFx1MjAxOScsXG5cdCAgICBzYnF1bzogJ1xcdTIwMUEnLFxuXHQgICAgbGRxdW86ICdcXHUyMDFDJyxcblx0ICAgIHJkcXVvOiAnXFx1MjAxRCcsXG5cdCAgICBiZHF1bzogJ1xcdTIwMUUnLFxuXHQgICAgZGFnZ2VyOiAnXFx1MjAyMCcsXG5cdCAgICBEYWdnZXI6ICdcXHUyMDIxJyxcblx0ICAgIGJ1bGw6ICdcXHUyMDIyJyxcblx0ICAgIGhlbGxpcDogJ1xcdTIwMjYnLFxuXHQgICAgcGVybWlsOiAnXFx1MjAzMCcsXG5cdCAgICBwcmltZTogJ1xcdTIwMzInLFxuXHQgICAgUHJpbWU6ICdcXHUyMDMzJyxcblx0ICAgIGxzYXF1bzogJ1xcdTIwMzknLFxuXHQgICAgcnNhcXVvOiAnXFx1MjAzQScsXG5cdCAgICBvbGluZTogJ1xcdTIwM0UnLFxuXHQgICAgZnJhc2w6ICdcXHUyMDQ0Jyxcblx0ICAgIGV1cm86ICdcXHUyMEFDJyxcblx0ICAgIGltYWdlOiAnXFx1MjExMScsXG5cdCAgICB3ZWllcnA6ICdcXHUyMTE4Jyxcblx0ICAgIHJlYWw6ICdcXHUyMTFDJyxcblx0ICAgIHRyYWRlOiAnXFx1MjEyMicsXG5cdCAgICBhbGVmc3ltOiAnXFx1MjEzNScsXG5cdCAgICBsYXJyOiAnXFx1MjE5MCcsXG5cdCAgICB1YXJyOiAnXFx1MjE5MScsXG5cdCAgICByYXJyOiAnXFx1MjE5MicsXG5cdCAgICBkYXJyOiAnXFx1MjE5MycsXG5cdCAgICBoYXJyOiAnXFx1MjE5NCcsXG5cdCAgICBjcmFycjogJ1xcdTIxQjUnLFxuXHQgICAgbEFycjogJ1xcdTIxRDAnLFxuXHQgICAgdUFycjogJ1xcdTIxRDEnLFxuXHQgICAgckFycjogJ1xcdTIxRDInLFxuXHQgICAgZEFycjogJ1xcdTIxRDMnLFxuXHQgICAgaEFycjogJ1xcdTIxRDQnLFxuXHQgICAgZm9yYWxsOiAnXFx1MjIwMCcsXG5cdCAgICBwYXJ0OiAnXFx1MjIwMicsXG5cdCAgICBleGlzdDogJ1xcdTIyMDMnLFxuXHQgICAgZW1wdHk6ICdcXHUyMjA1Jyxcblx0ICAgIG5hYmxhOiAnXFx1MjIwNycsXG5cdCAgICBpc2luOiAnXFx1MjIwOCcsXG5cdCAgICBub3RpbjogJ1xcdTIyMDknLFxuXHQgICAgbmk6ICdcXHUyMjBCJyxcblx0ICAgIHByb2Q6ICdcXHUyMjBGJyxcblx0ICAgIHN1bTogJ1xcdTIyMTEnLFxuXHQgICAgbWludXM6ICdcXHUyMjEyJyxcblx0ICAgIGxvd2FzdDogJ1xcdTIyMTcnLFxuXHQgICAgcmFkaWM6ICdcXHUyMjFBJyxcblx0ICAgIHByb3A6ICdcXHUyMjFEJyxcblx0ICAgIGluZmluOiAnXFx1MjIxRScsXG5cdCAgICBhbmc6ICdcXHUyMjIwJyxcblx0ICAgIGFuZDogJ1xcdTIyMjcnLFxuXHQgICAgb3I6ICdcXHUyMjI4Jyxcblx0ICAgIGNhcDogJ1xcdTIyMjknLFxuXHQgICAgY3VwOiAnXFx1MjIyQScsXG5cdCAgICBpbnQ6ICdcXHUyMjJCJyxcblx0ICAgIHRoZXJlNDogJ1xcdTIyMzQnLFxuXHQgICAgc2ltOiAnXFx1MjIzQycsXG5cdCAgICBjb25nOiAnXFx1MjI0NScsXG5cdCAgICBhc3ltcDogJ1xcdTIyNDgnLFxuXHQgICAgbmU6ICdcXHUyMjYwJyxcblx0ICAgIGVxdWl2OiAnXFx1MjI2MScsXG5cdCAgICBsZTogJ1xcdTIyNjQnLFxuXHQgICAgZ2U6ICdcXHUyMjY1Jyxcblx0ICAgIHN1YjogJ1xcdTIyODInLFxuXHQgICAgc3VwOiAnXFx1MjI4MycsXG5cdCAgICBuc3ViOiAnXFx1MjI4NCcsXG5cdCAgICBzdWJlOiAnXFx1MjI4NicsXG5cdCAgICBzdXBlOiAnXFx1MjI4NycsXG5cdCAgICBvcGx1czogJ1xcdTIyOTUnLFxuXHQgICAgb3RpbWVzOiAnXFx1MjI5NycsXG5cdCAgICBwZXJwOiAnXFx1MjJBNScsXG5cdCAgICBzZG90OiAnXFx1MjJDNScsXG5cdCAgICBsY2VpbDogJ1xcdTIzMDgnLFxuXHQgICAgcmNlaWw6ICdcXHUyMzA5Jyxcblx0ICAgIGxmbG9vcjogJ1xcdTIzMEEnLFxuXHQgICAgcmZsb29yOiAnXFx1MjMwQicsXG5cdCAgICBsb3o6ICdcXHUyNUNBJyxcblx0ICAgIHNwYWRlczogJ1xcdTI2NjAnLFxuXHQgICAgY2x1YnM6ICdcXHUyNjYzJyxcblx0ICAgIGhlYXJ0czogJ1xcdTI2NjUnLFxuXHQgICAgZGlhbXM6ICdcXHUyNjY2Jyxcblx0ICAgIGxhbmc6ICdcXHUyN0U4Jyxcblx0ICAgIHJhbmc6ICdcXHUyN0U5J1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAxNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIGVycm9yX2hhbmRsZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXHR2YXIgc2Nhbm5lcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cdHZhciB0b2tlbl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5cdHZhciBSZWFkZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gUmVhZGVyKCkge1xuXHQgICAgICAgIHRoaXMudmFsdWVzID0gW107XG5cdCAgICAgICAgdGhpcy5jdXJseSA9IHRoaXMucGFyZW4gPSAtMTtcblx0ICAgIH1cblx0ICAgIC8vIEEgZnVuY3Rpb24gZm9sbG93aW5nIG9uZSBvZiB0aG9zZSB0b2tlbnMgaXMgYW4gZXhwcmVzc2lvbi5cblx0ICAgIFJlYWRlci5wcm90b3R5cGUuYmVmb3JlRnVuY3Rpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gKHQpIHtcblx0ICAgICAgICByZXR1cm4gWycoJywgJ3snLCAnWycsICdpbicsICd0eXBlb2YnLCAnaW5zdGFuY2VvZicsICduZXcnLFxuXHQgICAgICAgICAgICAncmV0dXJuJywgJ2Nhc2UnLCAnZGVsZXRlJywgJ3Rocm93JywgJ3ZvaWQnLFxuXHQgICAgICAgICAgICAvLyBhc3NpZ25tZW50IG9wZXJhdG9yc1xuXHQgICAgICAgICAgICAnPScsICcrPScsICctPScsICcqPScsICcqKj0nLCAnLz0nLCAnJT0nLCAnPDw9JywgJz4+PScsICc+Pj49Jyxcblx0ICAgICAgICAgICAgJyY9JywgJ3w9JywgJ149JywgJywnLFxuXHQgICAgICAgICAgICAvLyBiaW5hcnkvdW5hcnkgb3BlcmF0b3JzXG5cdCAgICAgICAgICAgICcrJywgJy0nLCAnKicsICcqKicsICcvJywgJyUnLCAnKysnLCAnLS0nLCAnPDwnLCAnPj4nLCAnPj4+JywgJyYnLFxuXHQgICAgICAgICAgICAnfCcsICdeJywgJyEnLCAnficsICcmJicsICd8fCcsICc/JywgJzonLCAnPT09JywgJz09JywgJz49Jyxcblx0ICAgICAgICAgICAgJzw9JywgJzwnLCAnPicsICchPScsICchPT0nXS5pbmRleE9mKHQpID49IDA7XG5cdCAgICB9O1xuXHQgICAgLy8gRGV0ZXJtaW5lIGlmIGZvcndhcmQgc2xhc2ggKC8pIGlzIGFuIG9wZXJhdG9yIG9yIHBhcnQgb2YgYSByZWd1bGFyIGV4cHJlc3Npb25cblx0ICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3N3ZWV0LmpzL3dpa2kvZGVzaWduXG5cdCAgICBSZWFkZXIucHJvdG90eXBlLmlzUmVnZXhTdGFydCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgcHJldmlvdXMgPSB0aGlzLnZhbHVlc1t0aGlzLnZhbHVlcy5sZW5ndGggLSAxXTtcblx0ICAgICAgICB2YXIgcmVnZXggPSAocHJldmlvdXMgIT09IG51bGwpO1xuXHQgICAgICAgIHN3aXRjaCAocHJldmlvdXMpIHtcblx0ICAgICAgICAgICAgY2FzZSAndGhpcyc6XG5cdCAgICAgICAgICAgIGNhc2UgJ10nOlxuXHQgICAgICAgICAgICAgICAgcmVnZXggPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlICcpJzpcblx0ICAgICAgICAgICAgICAgIHZhciBrZXl3b3JkID0gdGhpcy52YWx1ZXNbdGhpcy5wYXJlbiAtIDFdO1xuXHQgICAgICAgICAgICAgICAgcmVnZXggPSAoa2V5d29yZCA9PT0gJ2lmJyB8fCBrZXl3b3JkID09PSAnd2hpbGUnIHx8IGtleXdvcmQgPT09ICdmb3InIHx8IGtleXdvcmQgPT09ICd3aXRoJyk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAnfSc6XG5cdCAgICAgICAgICAgICAgICAvLyBEaXZpZGluZyBhIGZ1bmN0aW9uIGJ5IGFueXRoaW5nIG1ha2VzIGxpdHRsZSBzZW5zZSxcblx0ICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIHRvIGNoZWNrIGZvciB0aGF0LlxuXHQgICAgICAgICAgICAgICAgcmVnZXggPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlc1t0aGlzLmN1cmx5IC0gM10gPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBBbm9ueW1vdXMgZnVuY3Rpb24sIGUuZy4gZnVuY3Rpb24oKXt9IC80MlxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjaGVjayA9IHRoaXMudmFsdWVzW3RoaXMuY3VybHkgLSA0XTtcblx0ICAgICAgICAgICAgICAgICAgICByZWdleCA9IGNoZWNrID8gIXRoaXMuYmVmb3JlRnVuY3Rpb25FeHByZXNzaW9uKGNoZWNrKSA6IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52YWx1ZXNbdGhpcy5jdXJseSAtIDRdID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gTmFtZWQgZnVuY3Rpb24sIGUuZy4gZnVuY3Rpb24gZigpe30gLzQyL1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjaGVjayA9IHRoaXMudmFsdWVzW3RoaXMuY3VybHkgLSA1XTtcblx0ICAgICAgICAgICAgICAgICAgICByZWdleCA9IGNoZWNrID8gIXRoaXMuYmVmb3JlRnVuY3Rpb25FeHByZXNzaW9uKGNoZWNrKSA6IHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmVnZXg7XG5cdCAgICB9O1xuXHQgICAgUmVhZGVyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyB8fCB0b2tlbi50eXBlID09PSA0IC8qIEtleXdvcmQgKi8pIHtcblx0ICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlID09PSAneycpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY3VybHkgPSB0aGlzLnZhbHVlcy5sZW5ndGg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udmFsdWUgPT09ICcoJykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5wYXJlbiA9IHRoaXMudmFsdWVzLmxlbmd0aDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLnZhbHVlcy5wdXNoKHRva2VuLnZhbHVlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMudmFsdWVzLnB1c2gobnVsbCk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIHJldHVybiBSZWFkZXI7XG5cdH0oKSk7XG5cdHZhciBUb2tlbml6ZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVG9rZW5pemVyKGNvZGUsIGNvbmZpZykge1xuXHQgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gbmV3IGVycm9yX2hhbmRsZXJfMS5FcnJvckhhbmRsZXIoKTtcblx0ICAgICAgICB0aGlzLmVycm9ySGFuZGxlci50b2xlcmFudCA9IGNvbmZpZyA/ICh0eXBlb2YgY29uZmlnLnRvbGVyYW50ID09PSAnYm9vbGVhbicgJiYgY29uZmlnLnRvbGVyYW50KSA6IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lciA9IG5ldyBzY2FubmVyXzEuU2Nhbm5lcihjb2RlLCB0aGlzLmVycm9ySGFuZGxlcik7XG5cdCAgICAgICAgdGhpcy5zY2FubmVyLnRyYWNrQ29tbWVudCA9IGNvbmZpZyA/ICh0eXBlb2YgY29uZmlnLmNvbW1lbnQgPT09ICdib29sZWFuJyAmJiBjb25maWcuY29tbWVudCkgOiBmYWxzZTtcblx0ICAgICAgICB0aGlzLnRyYWNrUmFuZ2UgPSBjb25maWcgPyAodHlwZW9mIGNvbmZpZy5yYW5nZSA9PT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5yYW5nZSkgOiBmYWxzZTtcblx0ICAgICAgICB0aGlzLnRyYWNrTG9jID0gY29uZmlnID8gKHR5cGVvZiBjb25maWcubG9jID09PSAnYm9vbGVhbicgJiYgY29uZmlnLmxvYykgOiBmYWxzZTtcblx0ICAgICAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuXHQgICAgICAgIHRoaXMucmVhZGVyID0gbmV3IFJlYWRlcigpO1xuXHQgICAgfVxuXHQgICAgVG9rZW5pemVyLnByb3RvdHlwZS5lcnJvcnMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLmVycm9ycztcblx0ICAgIH07XG5cdCAgICBUb2tlbml6ZXIucHJvdG90eXBlLmdldE5leHRUb2tlbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgIHZhciBjb21tZW50cyA9IHRoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci50cmFja0NvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyArK2kpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGNvbW1lbnRzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuc2Nhbm5lci5zb3VyY2Uuc2xpY2UoZS5zbGljZVswXSwgZS5zbGljZVsxXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGUubXVsdGlMaW5lID8gJ0Jsb2NrQ29tbWVudCcgOiAnTGluZUNvbW1lbnQnLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrUmFuZ2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudC5yYW5nZSA9IGUucmFuZ2U7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrTG9jKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQubG9jID0gZS5sb2M7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2goY29tbWVudCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKCF0aGlzLnNjYW5uZXIuZW9mKCkpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBsb2MgPSB2b2lkIDA7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0xvYykge1xuXHQgICAgICAgICAgICAgICAgICAgIGxvYyA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVuZDoge31cblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdmFyIHN0YXJ0UmVnZXggPSAodGhpcy5zY2FubmVyLnNvdXJjZVt0aGlzLnNjYW5uZXIuaW5kZXhdID09PSAnLycpICYmIHRoaXMucmVhZGVyLmlzUmVnZXhTdGFydCgpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gc3RhcnRSZWdleCA/IHRoaXMuc2Nhbm5lci5zY2FuUmVnRXhwKCkgOiB0aGlzLnNjYW5uZXIubGV4KCk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnJlYWRlci5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHtcblx0ICAgICAgICAgICAgICAgICAgICB0eXBlOiB0b2tlbl8xLlRva2VuTmFtZVt0b2tlbi50eXBlXSxcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5zY2FubmVyLnNvdXJjZS5zbGljZSh0b2tlbi5zdGFydCwgdG9rZW4uZW5kKVxuXHQgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrUmFuZ2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICBlbnRyeS5yYW5nZSA9IFt0b2tlbi5zdGFydCwgdG9rZW4uZW5kXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrTG9jKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbG9jLmVuZCA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydFxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgZW50cnkubG9jID0gbG9jO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDkgLyogUmVndWxhckV4cHJlc3Npb24gKi8pIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcGF0dGVybiA9IHRva2VuLnBhdHRlcm47XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGZsYWdzID0gdG9rZW4uZmxhZ3M7XG5cdCAgICAgICAgICAgICAgICAgICAgZW50cnkucmVnZXggPSB7IHBhdHRlcm46IHBhdHRlcm4sIGZsYWdzOiBmbGFncyB9O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5idWZmZXIucHVzaChlbnRyeSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLnNoaWZ0KCk7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRva2VuaXplcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5Ub2tlbml6ZXIgPSBUb2tlbml6ZXI7XG5cblxuLyoqKi8gfVxuLyoqKioqKi8gXSlcbn0pO1xuOyIsIi8qXG4gIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIEFyaXlhIEhpZGF5YXQgPGFyaXlhLmhpZGF5YXRAZ21haWwuY29tPlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG4vKmpzbGludCB2YXJzOmZhbHNlLCBiaXR3aXNlOnRydWUqL1xuLypqc2hpbnQgaW5kZW50OjQqL1xuLypnbG9iYWwgZXhwb3J0czp0cnVlKi9cbihmdW5jdGlvbiBjbG9uZShleHBvcnRzKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIFN5bnRheCxcbiAgICAgICAgVmlzaXRvck9wdGlvbixcbiAgICAgICAgVmlzaXRvcktleXMsXG4gICAgICAgIEJSRUFLLFxuICAgICAgICBTS0lQLFxuICAgICAgICBSRU1PVkU7XG5cbiAgICBmdW5jdGlvbiBkZWVwQ29weShvYmopIHtcbiAgICAgICAgdmFyIHJldCA9IHt9LCBrZXksIHZhbDtcbiAgICAgICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBvYmpba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFtrZXldID0gZGVlcENvcHkodmFsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvLyBiYXNlZCBvbiBMTFZNIGxpYmMrKyB1cHBlcl9ib3VuZCAvIGxvd2VyX2JvdW5kXG4gICAgLy8gTUlUIExpY2Vuc2VcblxuICAgIGZ1bmN0aW9uIHVwcGVyQm91bmQoYXJyYXksIGZ1bmMpIHtcbiAgICAgICAgdmFyIGRpZmYsIGxlbiwgaSwgY3VycmVudDtcblxuICAgICAgICBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIGkgPSAwO1xuXG4gICAgICAgIHdoaWxlIChsZW4pIHtcbiAgICAgICAgICAgIGRpZmYgPSBsZW4gPj4+IDE7XG4gICAgICAgICAgICBjdXJyZW50ID0gaSArIGRpZmY7XG4gICAgICAgICAgICBpZiAoZnVuYyhhcnJheVtjdXJyZW50XSkpIHtcbiAgICAgICAgICAgICAgICBsZW4gPSBkaWZmO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpID0gY3VycmVudCArIDE7XG4gICAgICAgICAgICAgICAgbGVuIC09IGRpZmYgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIFN5bnRheCA9IHtcbiAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb246ICdBc3NpZ25tZW50RXhwcmVzc2lvbicsXG4gICAgICAgIEFzc2lnbm1lbnRQYXR0ZXJuOiAnQXNzaWdubWVudFBhdHRlcm4nLFxuICAgICAgICBBcnJheUV4cHJlc3Npb246ICdBcnJheUV4cHJlc3Npb24nLFxuICAgICAgICBBcnJheVBhdHRlcm46ICdBcnJheVBhdHRlcm4nLFxuICAgICAgICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJyxcbiAgICAgICAgQXdhaXRFeHByZXNzaW9uOiAnQXdhaXRFeHByZXNzaW9uJywgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIEJsb2NrU3RhdGVtZW50OiAnQmxvY2tTdGF0ZW1lbnQnLFxuICAgICAgICBCaW5hcnlFeHByZXNzaW9uOiAnQmluYXJ5RXhwcmVzc2lvbicsXG4gICAgICAgIEJyZWFrU3RhdGVtZW50OiAnQnJlYWtTdGF0ZW1lbnQnLFxuICAgICAgICBDYWxsRXhwcmVzc2lvbjogJ0NhbGxFeHByZXNzaW9uJyxcbiAgICAgICAgQ2F0Y2hDbGF1c2U6ICdDYXRjaENsYXVzZScsXG4gICAgICAgIENoYWluRXhwcmVzc2lvbjogJ0NoYWluRXhwcmVzc2lvbicsXG4gICAgICAgIENsYXNzQm9keTogJ0NsYXNzQm9keScsXG4gICAgICAgIENsYXNzRGVjbGFyYXRpb246ICdDbGFzc0RlY2xhcmF0aW9uJyxcbiAgICAgICAgQ2xhc3NFeHByZXNzaW9uOiAnQ2xhc3NFeHByZXNzaW9uJyxcbiAgICAgICAgQ29tcHJlaGVuc2lvbkJsb2NrOiAnQ29tcHJlaGVuc2lvbkJsb2NrJywgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBDb21wcmVoZW5zaW9uRXhwcmVzc2lvbjogJ0NvbXByZWhlbnNpb25FeHByZXNzaW9uJywgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb246ICdDb25kaXRpb25hbEV4cHJlc3Npb24nLFxuICAgICAgICBDb250aW51ZVN0YXRlbWVudDogJ0NvbnRpbnVlU3RhdGVtZW50JyxcbiAgICAgICAgRGVidWdnZXJTdGF0ZW1lbnQ6ICdEZWJ1Z2dlclN0YXRlbWVudCcsXG4gICAgICAgIERpcmVjdGl2ZVN0YXRlbWVudDogJ0RpcmVjdGl2ZVN0YXRlbWVudCcsXG4gICAgICAgIERvV2hpbGVTdGF0ZW1lbnQ6ICdEb1doaWxlU3RhdGVtZW50JyxcbiAgICAgICAgRW1wdHlTdGF0ZW1lbnQ6ICdFbXB0eVN0YXRlbWVudCcsXG4gICAgICAgIEV4cG9ydEFsbERlY2xhcmF0aW9uOiAnRXhwb3J0QWxsRGVjbGFyYXRpb24nLFxuICAgICAgICBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb246ICdFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24nLFxuICAgICAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uOiAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbicsXG4gICAgICAgIEV4cG9ydFNwZWNpZmllcjogJ0V4cG9ydFNwZWNpZmllcicsXG4gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQ6ICdFeHByZXNzaW9uU3RhdGVtZW50JyxcbiAgICAgICAgRm9yU3RhdGVtZW50OiAnRm9yU3RhdGVtZW50JyxcbiAgICAgICAgRm9ySW5TdGF0ZW1lbnQ6ICdGb3JJblN0YXRlbWVudCcsXG4gICAgICAgIEZvck9mU3RhdGVtZW50OiAnRm9yT2ZTdGF0ZW1lbnQnLFxuICAgICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiAnRnVuY3Rpb25EZWNsYXJhdGlvbicsXG4gICAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogJ0Z1bmN0aW9uRXhwcmVzc2lvbicsXG4gICAgICAgIEdlbmVyYXRvckV4cHJlc3Npb246ICdHZW5lcmF0b3JFeHByZXNzaW9uJywgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBJZGVudGlmaWVyOiAnSWRlbnRpZmllcicsXG4gICAgICAgIElmU3RhdGVtZW50OiAnSWZTdGF0ZW1lbnQnLFxuICAgICAgICBJbXBvcnRFeHByZXNzaW9uOiAnSW1wb3J0RXhwcmVzc2lvbicsXG4gICAgICAgIEltcG9ydERlY2xhcmF0aW9uOiAnSW1wb3J0RGVjbGFyYXRpb24nLFxuICAgICAgICBJbXBvcnREZWZhdWx0U3BlY2lmaWVyOiAnSW1wb3J0RGVmYXVsdFNwZWNpZmllcicsXG4gICAgICAgIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogJ0ltcG9ydE5hbWVzcGFjZVNwZWNpZmllcicsXG4gICAgICAgIEltcG9ydFNwZWNpZmllcjogJ0ltcG9ydFNwZWNpZmllcicsXG4gICAgICAgIExpdGVyYWw6ICdMaXRlcmFsJyxcbiAgICAgICAgTGFiZWxlZFN0YXRlbWVudDogJ0xhYmVsZWRTdGF0ZW1lbnQnLFxuICAgICAgICBMb2dpY2FsRXhwcmVzc2lvbjogJ0xvZ2ljYWxFeHByZXNzaW9uJyxcbiAgICAgICAgTWVtYmVyRXhwcmVzc2lvbjogJ01lbWJlckV4cHJlc3Npb24nLFxuICAgICAgICBNZXRhUHJvcGVydHk6ICdNZXRhUHJvcGVydHknLFxuICAgICAgICBNZXRob2REZWZpbml0aW9uOiAnTWV0aG9kRGVmaW5pdGlvbicsXG4gICAgICAgIE1vZHVsZVNwZWNpZmllcjogJ01vZHVsZVNwZWNpZmllcicsXG4gICAgICAgIE5ld0V4cHJlc3Npb246ICdOZXdFeHByZXNzaW9uJyxcbiAgICAgICAgT2JqZWN0RXhwcmVzc2lvbjogJ09iamVjdEV4cHJlc3Npb24nLFxuICAgICAgICBPYmplY3RQYXR0ZXJuOiAnT2JqZWN0UGF0dGVybicsXG4gICAgICAgIFByaXZhdGVJZGVudGlmaWVyOiAnUHJpdmF0ZUlkZW50aWZpZXInLFxuICAgICAgICBQcm9ncmFtOiAnUHJvZ3JhbScsXG4gICAgICAgIFByb3BlcnR5OiAnUHJvcGVydHknLFxuICAgICAgICBQcm9wZXJ0eURlZmluaXRpb246ICdQcm9wZXJ0eURlZmluaXRpb24nLFxuICAgICAgICBSZXN0RWxlbWVudDogJ1Jlc3RFbGVtZW50JyxcbiAgICAgICAgUmV0dXJuU3RhdGVtZW50OiAnUmV0dXJuU3RhdGVtZW50JyxcbiAgICAgICAgU2VxdWVuY2VFeHByZXNzaW9uOiAnU2VxdWVuY2VFeHByZXNzaW9uJyxcbiAgICAgICAgU3ByZWFkRWxlbWVudDogJ1NwcmVhZEVsZW1lbnQnLFxuICAgICAgICBTdXBlcjogJ1N1cGVyJyxcbiAgICAgICAgU3dpdGNoU3RhdGVtZW50OiAnU3dpdGNoU3RhdGVtZW50JyxcbiAgICAgICAgU3dpdGNoQ2FzZTogJ1N3aXRjaENhc2UnLFxuICAgICAgICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246ICdUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24nLFxuICAgICAgICBUZW1wbGF0ZUVsZW1lbnQ6ICdUZW1wbGF0ZUVsZW1lbnQnLFxuICAgICAgICBUZW1wbGF0ZUxpdGVyYWw6ICdUZW1wbGF0ZUxpdGVyYWwnLFxuICAgICAgICBUaGlzRXhwcmVzc2lvbjogJ1RoaXNFeHByZXNzaW9uJyxcbiAgICAgICAgVGhyb3dTdGF0ZW1lbnQ6ICdUaHJvd1N0YXRlbWVudCcsXG4gICAgICAgIFRyeVN0YXRlbWVudDogJ1RyeVN0YXRlbWVudCcsXG4gICAgICAgIFVuYXJ5RXhwcmVzc2lvbjogJ1VuYXJ5RXhwcmVzc2lvbicsXG4gICAgICAgIFVwZGF0ZUV4cHJlc3Npb246ICdVcGRhdGVFeHByZXNzaW9uJyxcbiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbjogJ1ZhcmlhYmxlRGVjbGFyYXRpb24nLFxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3I6ICdWYXJpYWJsZURlY2xhcmF0b3InLFxuICAgICAgICBXaGlsZVN0YXRlbWVudDogJ1doaWxlU3RhdGVtZW50JyxcbiAgICAgICAgV2l0aFN0YXRlbWVudDogJ1dpdGhTdGF0ZW1lbnQnLFxuICAgICAgICBZaWVsZEV4cHJlc3Npb246ICdZaWVsZEV4cHJlc3Npb24nXG4gICAgfTtcblxuICAgIFZpc2l0b3JLZXlzID0ge1xuICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbjogWydsZWZ0JywgJ3JpZ2h0J10sXG4gICAgICAgIEFzc2lnbm1lbnRQYXR0ZXJuOiBbJ2xlZnQnLCAncmlnaHQnXSxcbiAgICAgICAgQXJyYXlFeHByZXNzaW9uOiBbJ2VsZW1lbnRzJ10sXG4gICAgICAgIEFycmF5UGF0dGVybjogWydlbGVtZW50cyddLFxuICAgICAgICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogWydwYXJhbXMnLCAnYm9keSddLFxuICAgICAgICBBd2FpdEV4cHJlc3Npb246IFsnYXJndW1lbnQnXSwgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIEJsb2NrU3RhdGVtZW50OiBbJ2JvZHknXSxcbiAgICAgICAgQmluYXJ5RXhwcmVzc2lvbjogWydsZWZ0JywgJ3JpZ2h0J10sXG4gICAgICAgIEJyZWFrU3RhdGVtZW50OiBbJ2xhYmVsJ10sXG4gICAgICAgIENhbGxFeHByZXNzaW9uOiBbJ2NhbGxlZScsICdhcmd1bWVudHMnXSxcbiAgICAgICAgQ2F0Y2hDbGF1c2U6IFsncGFyYW0nLCAnYm9keSddLFxuICAgICAgICBDaGFpbkV4cHJlc3Npb246IFsnZXhwcmVzc2lvbiddLFxuICAgICAgICBDbGFzc0JvZHk6IFsnYm9keSddLFxuICAgICAgICBDbGFzc0RlY2xhcmF0aW9uOiBbJ2lkJywgJ3N1cGVyQ2xhc3MnLCAnYm9keSddLFxuICAgICAgICBDbGFzc0V4cHJlc3Npb246IFsnaWQnLCAnc3VwZXJDbGFzcycsICdib2R5J10sXG4gICAgICAgIENvbXByZWhlbnNpb25CbG9jazogWydsZWZ0JywgJ3JpZ2h0J10sICAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgQ29tcHJlaGVuc2lvbkV4cHJlc3Npb246IFsnYmxvY2tzJywgJ2ZpbHRlcicsICdib2R5J10sICAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uOiBbJ3Rlc3QnLCAnY29uc2VxdWVudCcsICdhbHRlcm5hdGUnXSxcbiAgICAgICAgQ29udGludWVTdGF0ZW1lbnQ6IFsnbGFiZWwnXSxcbiAgICAgICAgRGVidWdnZXJTdGF0ZW1lbnQ6IFtdLFxuICAgICAgICBEaXJlY3RpdmVTdGF0ZW1lbnQ6IFtdLFxuICAgICAgICBEb1doaWxlU3RhdGVtZW50OiBbJ2JvZHknLCAndGVzdCddLFxuICAgICAgICBFbXB0eVN0YXRlbWVudDogW10sXG4gICAgICAgIEV4cG9ydEFsbERlY2xhcmF0aW9uOiBbJ3NvdXJjZSddLFxuICAgICAgICBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb246IFsnZGVjbGFyYXRpb24nXSxcbiAgICAgICAgRXhwb3J0TmFtZWREZWNsYXJhdGlvbjogWydkZWNsYXJhdGlvbicsICdzcGVjaWZpZXJzJywgJ3NvdXJjZSddLFxuICAgICAgICBFeHBvcnRTcGVjaWZpZXI6IFsnZXhwb3J0ZWQnLCAnbG9jYWwnXSxcbiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudDogWydleHByZXNzaW9uJ10sXG4gICAgICAgIEZvclN0YXRlbWVudDogWydpbml0JywgJ3Rlc3QnLCAndXBkYXRlJywgJ2JvZHknXSxcbiAgICAgICAgRm9ySW5TdGF0ZW1lbnQ6IFsnbGVmdCcsICdyaWdodCcsICdib2R5J10sXG4gICAgICAgIEZvck9mU3RhdGVtZW50OiBbJ2xlZnQnLCAncmlnaHQnLCAnYm9keSddLFxuICAgICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiBbJ2lkJywgJ3BhcmFtcycsICdib2R5J10sXG4gICAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogWydpZCcsICdwYXJhbXMnLCAnYm9keSddLFxuICAgICAgICBHZW5lcmF0b3JFeHByZXNzaW9uOiBbJ2Jsb2NrcycsICdmaWx0ZXInLCAnYm9keSddLCAgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIElkZW50aWZpZXI6IFtdLFxuICAgICAgICBJZlN0YXRlbWVudDogWyd0ZXN0JywgJ2NvbnNlcXVlbnQnLCAnYWx0ZXJuYXRlJ10sXG4gICAgICAgIEltcG9ydEV4cHJlc3Npb246IFsnc291cmNlJ10sXG4gICAgICAgIEltcG9ydERlY2xhcmF0aW9uOiBbJ3NwZWNpZmllcnMnLCAnc291cmNlJ10sXG4gICAgICAgIEltcG9ydERlZmF1bHRTcGVjaWZpZXI6IFsnbG9jYWwnXSxcbiAgICAgICAgSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyOiBbJ2xvY2FsJ10sXG4gICAgICAgIEltcG9ydFNwZWNpZmllcjogWydpbXBvcnRlZCcsICdsb2NhbCddLFxuICAgICAgICBMaXRlcmFsOiBbXSxcbiAgICAgICAgTGFiZWxlZFN0YXRlbWVudDogWydsYWJlbCcsICdib2R5J10sXG4gICAgICAgIExvZ2ljYWxFeHByZXNzaW9uOiBbJ2xlZnQnLCAncmlnaHQnXSxcbiAgICAgICAgTWVtYmVyRXhwcmVzc2lvbjogWydvYmplY3QnLCAncHJvcGVydHknXSxcbiAgICAgICAgTWV0YVByb3BlcnR5OiBbJ21ldGEnLCAncHJvcGVydHknXSxcbiAgICAgICAgTWV0aG9kRGVmaW5pdGlvbjogWydrZXknLCAndmFsdWUnXSxcbiAgICAgICAgTW9kdWxlU3BlY2lmaWVyOiBbXSxcbiAgICAgICAgTmV3RXhwcmVzc2lvbjogWydjYWxsZWUnLCAnYXJndW1lbnRzJ10sXG4gICAgICAgIE9iamVjdEV4cHJlc3Npb246IFsncHJvcGVydGllcyddLFxuICAgICAgICBPYmplY3RQYXR0ZXJuOiBbJ3Byb3BlcnRpZXMnXSxcbiAgICAgICAgUHJpdmF0ZUlkZW50aWZpZXI6IFtdLFxuICAgICAgICBQcm9ncmFtOiBbJ2JvZHknXSxcbiAgICAgICAgUHJvcGVydHk6IFsna2V5JywgJ3ZhbHVlJ10sXG4gICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjogWydrZXknLCAndmFsdWUnXSxcbiAgICAgICAgUmVzdEVsZW1lbnQ6IFsgJ2FyZ3VtZW50JyBdLFxuICAgICAgICBSZXR1cm5TdGF0ZW1lbnQ6IFsnYXJndW1lbnQnXSxcbiAgICAgICAgU2VxdWVuY2VFeHByZXNzaW9uOiBbJ2V4cHJlc3Npb25zJ10sXG4gICAgICAgIFNwcmVhZEVsZW1lbnQ6IFsnYXJndW1lbnQnXSxcbiAgICAgICAgU3VwZXI6IFtdLFxuICAgICAgICBTd2l0Y2hTdGF0ZW1lbnQ6IFsnZGlzY3JpbWluYW50JywgJ2Nhc2VzJ10sXG4gICAgICAgIFN3aXRjaENhc2U6IFsndGVzdCcsICdjb25zZXF1ZW50J10sXG4gICAgICAgIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbjogWyd0YWcnLCAncXVhc2knXSxcbiAgICAgICAgVGVtcGxhdGVFbGVtZW50OiBbXSxcbiAgICAgICAgVGVtcGxhdGVMaXRlcmFsOiBbJ3F1YXNpcycsICdleHByZXNzaW9ucyddLFxuICAgICAgICBUaGlzRXhwcmVzc2lvbjogW10sXG4gICAgICAgIFRocm93U3RhdGVtZW50OiBbJ2FyZ3VtZW50J10sXG4gICAgICAgIFRyeVN0YXRlbWVudDogWydibG9jaycsICdoYW5kbGVyJywgJ2ZpbmFsaXplciddLFxuICAgICAgICBVbmFyeUV4cHJlc3Npb246IFsnYXJndW1lbnQnXSxcbiAgICAgICAgVXBkYXRlRXhwcmVzc2lvbjogWydhcmd1bWVudCddLFxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uOiBbJ2RlY2xhcmF0aW9ucyddLFxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3I6IFsnaWQnLCAnaW5pdCddLFxuICAgICAgICBXaGlsZVN0YXRlbWVudDogWyd0ZXN0JywgJ2JvZHknXSxcbiAgICAgICAgV2l0aFN0YXRlbWVudDogWydvYmplY3QnLCAnYm9keSddLFxuICAgICAgICBZaWVsZEV4cHJlc3Npb246IFsnYXJndW1lbnQnXVxuICAgIH07XG5cbiAgICAvLyB1bmlxdWUgaWRcbiAgICBCUkVBSyA9IHt9O1xuICAgIFNLSVAgPSB7fTtcbiAgICBSRU1PVkUgPSB7fTtcblxuICAgIFZpc2l0b3JPcHRpb24gPSB7XG4gICAgICAgIEJyZWFrOiBCUkVBSyxcbiAgICAgICAgU2tpcDogU0tJUCxcbiAgICAgICAgUmVtb3ZlOiBSRU1PVkVcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gUmVmZXJlbmNlKHBhcmVudCwga2V5KSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICB9XG5cbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbiByZXBsYWNlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRbdGhpcy5rZXldID0gbm9kZTtcbiAgICB9O1xuXG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucGFyZW50KSkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuc3BsaWNlKHRoaXMua2V5LCAxKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlKG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIEVsZW1lbnQobm9kZSwgcGF0aCwgd3JhcCwgcmVmKSB7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMud3JhcCA9IHdyYXA7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoKSB7IH1cblxuICAgIC8vIEFQSTpcbiAgICAvLyByZXR1cm4gcHJvcGVydHkgcGF0aCBhcnJheSBmcm9tIHJvb3QgdG8gY3VycmVudCBub2RlXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUucGF0aCA9IGZ1bmN0aW9uIHBhdGgoKSB7XG4gICAgICAgIHZhciBpLCBpeiwgaiwganosIHJlc3VsdCwgZWxlbWVudDtcblxuICAgICAgICBmdW5jdGlvbiBhZGRUb1BhdGgocmVzdWx0LCBwYXRoKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IDAsIGp6ID0gcGF0aC5sZW5ndGg7IGogPCBqejsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhdGhbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyByb290IG5vZGVcbiAgICAgICAgaWYgKCF0aGlzLl9fY3VycmVudC5wYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpcnN0IG5vZGUgaXMgc2VudGluZWwsIHNlY29uZCBub2RlIGlzIHJvb3QgZWxlbWVudFxuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMiwgaXogPSB0aGlzLl9fbGVhdmVsaXN0Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLl9fbGVhdmVsaXN0W2ldO1xuICAgICAgICAgICAgYWRkVG9QYXRoKHJlc3VsdCwgZWxlbWVudC5wYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRUb1BhdGgocmVzdWx0LCB0aGlzLl9fY3VycmVudC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHJldHVybiB0eXBlIG9mIGN1cnJlbnQgbm9kZVxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5jdXJyZW50KCk7XG4gICAgICAgIHJldHVybiBub2RlLnR5cGUgfHwgdGhpcy5fX2N1cnJlbnQud3JhcDtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHJldHVybiBhcnJheSBvZiBwYXJlbnQgZWxlbWVudHNcbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5wYXJlbnRzID0gZnVuY3Rpb24gcGFyZW50cygpIHtcbiAgICAgICAgdmFyIGksIGl6LCByZXN1bHQ7XG5cbiAgICAgICAgLy8gZmlyc3Qgbm9kZSBpcyBzZW50aW5lbFxuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMSwgaXogPSB0aGlzLl9fbGVhdmVsaXN0Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuX19sZWF2ZWxpc3RbaV0ubm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gcmV0dXJuIGN1cnJlbnQgbm9kZVxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLmN1cnJlbnQgPSBmdW5jdGlvbiBjdXJyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2N1cnJlbnQubm9kZTtcbiAgICB9O1xuXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUuX19leGVjdXRlID0gZnVuY3Rpb24gX19leGVjdXRlKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgICAgIHZhciBwcmV2aW91cywgcmVzdWx0O1xuXG4gICAgICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcblxuICAgICAgICBwcmV2aW91cyAgPSB0aGlzLl9fY3VycmVudDtcbiAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLl9fc3RhdGUgPSBudWxsO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNhbGxiYWNrLmNhbGwodGhpcywgZWxlbWVudC5ub2RlLCB0aGlzLl9fbGVhdmVsaXN0W3RoaXMuX19sZWF2ZWxpc3QubGVuZ3RoIC0gMV0ubm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSBwcmV2aW91cztcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gbm90aWZ5IGNvbnRyb2wgc2tpcCAvIGJyZWFrXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUubm90aWZ5ID0gZnVuY3Rpb24gbm90aWZ5KGZsYWcpIHtcbiAgICAgICAgdGhpcy5fX3N0YXRlID0gZmxhZztcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHNraXAgY2hpbGQgbm9kZXMgb2YgY3VycmVudCBub2RlXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ub3RpZnkoU0tJUCk7XG4gICAgfTtcblxuICAgIC8vIEFQSTpcbiAgICAvLyBicmVhayB0cmF2ZXJzYWxzXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGVbJ2JyZWFrJ10gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubm90aWZ5KEJSRUFLKTtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHJlbW92ZSBub2RlXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm5vdGlmeShSRU1PVkUpO1xuICAgIH07XG5cbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5fX2luaXRpYWxpemUgPSBmdW5jdGlvbihyb290LCB2aXNpdG9yKSB7XG4gICAgICAgIHRoaXMudmlzaXRvciA9IHZpc2l0b3I7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgICAgIHRoaXMuX193b3JrbGlzdCA9IFtdO1xuICAgICAgICB0aGlzLl9fbGVhdmVsaXN0ID0gW107XG4gICAgICAgIHRoaXMuX19jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fX3N0YXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fX2ZhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgaWYgKHZpc2l0b3IuZmFsbGJhY2sgPT09ICdpdGVyYXRpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9fZmFsbGJhY2sgPSBPYmplY3Qua2V5cztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmlzaXRvci5mYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fX2ZhbGxiYWNrID0gdmlzaXRvci5mYWxsYmFjaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX19rZXlzID0gVmlzaXRvcktleXM7XG4gICAgICAgIGlmICh2aXNpdG9yLmtleXMpIHtcbiAgICAgICAgICAgIHRoaXMuX19rZXlzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHRoaXMuX19rZXlzKSwgdmlzaXRvci5rZXlzKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBpc05vZGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygbm9kZS50eXBlID09PSAnc3RyaW5nJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Byb3BlcnR5KG5vZGVUeXBlLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIChub2RlVHlwZSA9PT0gU3ludGF4Lk9iamVjdEV4cHJlc3Npb24gfHwgbm9kZVR5cGUgPT09IFN5bnRheC5PYmplY3RQYXR0ZXJuKSAmJiAncHJvcGVydGllcycgPT09IGtleTtcbiAgICB9XG4gIFxuICAgIGZ1bmN0aW9uIGNhbmRpZGF0ZUV4aXN0c0luTGVhdmVMaXN0KGxlYXZlbGlzdCwgY2FuZGlkYXRlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBsZWF2ZWxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGlmIChsZWF2ZWxpc3RbaV0ubm9kZSA9PT0gY2FuZGlkYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnRyYXZlcnNlID0gZnVuY3Rpb24gdHJhdmVyc2Uocm9vdCwgdmlzaXRvcikge1xuICAgICAgICB2YXIgd29ya2xpc3QsXG4gICAgICAgICAgICBsZWF2ZWxpc3QsXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG5vZGVUeXBlLFxuICAgICAgICAgICAgcmV0LFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIGN1cnJlbnQyLFxuICAgICAgICAgICAgY2FuZGlkYXRlcyxcbiAgICAgICAgICAgIGNhbmRpZGF0ZSxcbiAgICAgICAgICAgIHNlbnRpbmVsO1xuXG4gICAgICAgIHRoaXMuX19pbml0aWFsaXplKHJvb3QsIHZpc2l0b3IpO1xuXG4gICAgICAgIHNlbnRpbmVsID0ge307XG5cbiAgICAgICAgLy8gcmVmZXJlbmNlXG4gICAgICAgIHdvcmtsaXN0ID0gdGhpcy5fX3dvcmtsaXN0O1xuICAgICAgICBsZWF2ZWxpc3QgPSB0aGlzLl9fbGVhdmVsaXN0O1xuXG4gICAgICAgIC8vIGluaXRpYWxpemVcbiAgICAgICAgd29ya2xpc3QucHVzaChuZXcgRWxlbWVudChyb290LCBudWxsLCBudWxsLCBudWxsKSk7XG4gICAgICAgIGxlYXZlbGlzdC5wdXNoKG5ldyBFbGVtZW50KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTtcblxuICAgICAgICB3aGlsZSAod29ya2xpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gd29ya2xpc3QucG9wKCk7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09PSBzZW50aW5lbCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBsZWF2ZWxpc3QucG9wKCk7XG5cbiAgICAgICAgICAgICAgICByZXQgPSB0aGlzLl9fZXhlY3V0ZSh2aXNpdG9yLmxlYXZlLCBlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IEJSRUFLIHx8IHJldCA9PT0gQlJFQUspIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZSkge1xuXG4gICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5fX2V4ZWN1dGUodmlzaXRvci5lbnRlciwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBCUkVBSyB8fCByZXQgPT09IEJSRUFLKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB3b3JrbGlzdC5wdXNoKHNlbnRpbmVsKTtcbiAgICAgICAgICAgICAgICBsZWF2ZWxpc3QucHVzaChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IFNLSVAgfHwgcmV0ID09PSBTS0lQKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG5vZGUgPSBlbGVtZW50Lm5vZGU7XG4gICAgICAgICAgICAgICAgbm9kZVR5cGUgPSBub2RlLnR5cGUgfHwgZWxlbWVudC53cmFwO1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSB0aGlzLl9fa2V5c1tub2RlVHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fZmFsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSB0aGlzLl9fZmFsbGJhY2sobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlICcgKyBub2RlVHlwZSArICcuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50IC09IDEpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gY2FuZGlkYXRlc1tjdXJyZW50XTtcbiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gbm9kZVtrZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50MiA9IGNhbmRpZGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnQyIC09IDEpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZVtjdXJyZW50Ml0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZUV4aXN0c0luTGVhdmVMaXN0KGxlYXZlbGlzdCwgY2FuZGlkYXRlW2N1cnJlbnQyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1Byb3BlcnR5KG5vZGVUeXBlLCBjYW5kaWRhdGVzW2N1cnJlbnRdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoY2FuZGlkYXRlW2N1cnJlbnQyXSwgW2tleSwgY3VycmVudDJdLCAnUHJvcGVydHknLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZShjYW5kaWRhdGVbY3VycmVudDJdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoY2FuZGlkYXRlW2N1cnJlbnQyXSwgW2tleSwgY3VycmVudDJdLCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc05vZGUoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZUV4aXN0c0luTGVhdmVMaXN0KGxlYXZlbGlzdCwgY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChuZXcgRWxlbWVudChjYW5kaWRhdGUsIGtleSwgbnVsbCwgbnVsbCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbiByZXBsYWNlKHJvb3QsIHZpc2l0b3IpIHtcbiAgICAgICAgdmFyIHdvcmtsaXN0LFxuICAgICAgICAgICAgbGVhdmVsaXN0LFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG5vZGVUeXBlLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICBjdXJyZW50MixcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMsXG4gICAgICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgICAgICBzZW50aW5lbCxcbiAgICAgICAgICAgIG91dGVyLFxuICAgICAgICAgICAga2V5O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlbW92ZUVsZW0oZWxlbWVudCkge1xuICAgICAgICAgICAgdmFyIGksXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIG5leHRFbGVtLFxuICAgICAgICAgICAgICAgIHBhcmVudDtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucmVmLnJlbW92ZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgcmVmZXJlbmNlIGlzIGFuIGVsZW1lbnQgb2YgYW4gYXJyYXkuXG4gICAgICAgICAgICAgICAga2V5ID0gZWxlbWVudC5yZWYua2V5O1xuICAgICAgICAgICAgICAgIHBhcmVudCA9IGVsZW1lbnQucmVmLnBhcmVudDtcblxuICAgICAgICAgICAgICAgIC8vIElmIHJlbW92ZWQgZnJvbSBhcnJheSwgdGhlbiBkZWNyZWFzZSBmb2xsb3dpbmcgaXRlbXMnIGtleXMuXG4gICAgICAgICAgICAgICAgaSA9IHdvcmtsaXN0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRFbGVtID0gd29ya2xpc3RbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0RWxlbS5yZWYgJiYgbmV4dEVsZW0ucmVmLnBhcmVudCA9PT0gcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAgKG5leHRFbGVtLnJlZi5rZXkgPCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC0tbmV4dEVsZW0ucmVmLmtleTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX19pbml0aWFsaXplKHJvb3QsIHZpc2l0b3IpO1xuXG4gICAgICAgIHNlbnRpbmVsID0ge307XG5cbiAgICAgICAgLy8gcmVmZXJlbmNlXG4gICAgICAgIHdvcmtsaXN0ID0gdGhpcy5fX3dvcmtsaXN0O1xuICAgICAgICBsZWF2ZWxpc3QgPSB0aGlzLl9fbGVhdmVsaXN0O1xuXG4gICAgICAgIC8vIGluaXRpYWxpemVcbiAgICAgICAgb3V0ZXIgPSB7XG4gICAgICAgICAgICByb290OiByb290XG4gICAgICAgIH07XG4gICAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudChyb290LCBudWxsLCBudWxsLCBuZXcgUmVmZXJlbmNlKG91dGVyLCAncm9vdCcpKTtcbiAgICAgICAgd29ya2xpc3QucHVzaChlbGVtZW50KTtcbiAgICAgICAgbGVhdmVsaXN0LnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgd2hpbGUgKHdvcmtsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHdvcmtsaXN0LnBvcCgpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gc2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gbGVhdmVsaXN0LnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy5fX2V4ZWN1dGUodmlzaXRvci5sZWF2ZSwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAvLyBub2RlIG1heSBiZSByZXBsYWNlZCB3aXRoIG51bGwsXG4gICAgICAgICAgICAgICAgLy8gc28gZGlzdGluZ3Vpc2ggYmV0d2VlbiB1bmRlZmluZWQgYW5kIG51bGwgaW4gdGhpcyBwbGFjZVxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQgIT09IEJSRUFLICYmIHRhcmdldCAhPT0gU0tJUCAmJiB0YXJnZXQgIT09IFJFTU9WRSkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVmLnJlcGxhY2UodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBSRU1PVkUgfHwgdGFyZ2V0ID09PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRWxlbShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBCUkVBSyB8fCB0YXJnZXQgPT09IEJSRUFLKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRlci5yb290O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy5fX2V4ZWN1dGUodmlzaXRvci5lbnRlciwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIG5vZGUgbWF5IGJlIHJlcGxhY2VkIHdpdGggbnVsbCxcbiAgICAgICAgICAgIC8vIHNvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdW5kZWZpbmVkIGFuZCBudWxsIGluIHRoaXMgcGxhY2VcbiAgICAgICAgICAgIGlmICh0YXJnZXQgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQgIT09IEJSRUFLICYmIHRhcmdldCAhPT0gU0tJUCAmJiB0YXJnZXQgIT09IFJFTU9WRSkge1xuICAgICAgICAgICAgICAgIC8vIHJlcGxhY2VcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlZi5yZXBsYWNlKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5ub2RlID0gdGFyZ2V0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBSRU1PVkUgfHwgdGFyZ2V0ID09PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVFbGVtKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQubm9kZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IEJSRUFLIHx8IHRhcmdldCA9PT0gQlJFQUspIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0ZXIucm9vdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbm9kZSBtYXkgYmUgbnVsbFxuICAgICAgICAgICAgbm9kZSA9IGVsZW1lbnQubm9kZTtcbiAgICAgICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3b3JrbGlzdC5wdXNoKHNlbnRpbmVsKTtcbiAgICAgICAgICAgIGxlYXZlbGlzdC5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBTS0lQIHx8IHRhcmdldCA9PT0gU0tJUCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBub2RlVHlwZSA9IG5vZGUudHlwZSB8fCBlbGVtZW50LndyYXA7XG4gICAgICAgICAgICBjYW5kaWRhdGVzID0gdGhpcy5fX2tleXNbbm9kZVR5cGVdO1xuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19mYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gdGhpcy5fX2ZhbGxiYWNrKG5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBub2RlIHR5cGUgJyArIG5vZGVUeXBlICsgJy4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjYW5kaWRhdGVzLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlICgoY3VycmVudCAtPSAxKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gY2FuZGlkYXRlc1tjdXJyZW50XTtcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBub2RlW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50MiA9IGNhbmRpZGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoY3VycmVudDIgLT0gMSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGVbY3VycmVudDJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcm9wZXJ0eShub2RlVHlwZSwgY2FuZGlkYXRlc1tjdXJyZW50XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoY2FuZGlkYXRlW2N1cnJlbnQyXSwgW2tleSwgY3VycmVudDJdLCAnUHJvcGVydHknLCBuZXcgUmVmZXJlbmNlKGNhbmRpZGF0ZSwgY3VycmVudDIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlKGNhbmRpZGF0ZVtjdXJyZW50Ml0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGNhbmRpZGF0ZVtjdXJyZW50Ml0sIFtrZXksIGN1cnJlbnQyXSwgbnVsbCwgbmV3IFJlZmVyZW5jZShjYW5kaWRhdGUsIGN1cnJlbnQyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChuZXcgRWxlbWVudChjYW5kaWRhdGUsIGtleSwgbnVsbCwgbmV3IFJlZmVyZW5jZShub2RlLCBrZXkpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dGVyLnJvb3Q7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHRyYXZlcnNlKHJvb3QsIHZpc2l0b3IpIHtcbiAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcigpO1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci50cmF2ZXJzZShyb290LCB2aXNpdG9yKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJvb3QsIHZpc2l0b3IpIHtcbiAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcigpO1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5yZXBsYWNlKHJvb3QsIHZpc2l0b3IpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dGVuZENvbW1lbnRSYW5nZShjb21tZW50LCB0b2tlbnMpIHtcbiAgICAgICAgdmFyIHRhcmdldDtcblxuICAgICAgICB0YXJnZXQgPSB1cHBlckJvdW5kKHRva2VucywgZnVuY3Rpb24gc2VhcmNoKHRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW4ucmFuZ2VbMF0gPiBjb21tZW50LnJhbmdlWzBdO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb21tZW50LmV4dGVuZGVkUmFuZ2UgPSBbY29tbWVudC5yYW5nZVswXSwgY29tbWVudC5yYW5nZVsxXV07XG5cbiAgICAgICAgaWYgKHRhcmdldCAhPT0gdG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgY29tbWVudC5leHRlbmRlZFJhbmdlWzFdID0gdG9rZW5zW3RhcmdldF0ucmFuZ2VbMF07XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXQgLT0gMTtcbiAgICAgICAgaWYgKHRhcmdldCA+PSAwKSB7XG4gICAgICAgICAgICBjb21tZW50LmV4dGVuZGVkUmFuZ2VbMF0gPSB0b2tlbnNbdGFyZ2V0XS5yYW5nZVsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21tZW50O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGF0dGFjaENvbW1lbnRzKHRyZWUsIHByb3ZpZGVkQ29tbWVudHMsIHRva2Vucykge1xuICAgICAgICAvLyBBdCBmaXJzdCwgd2Ugc2hvdWxkIGNhbGN1bGF0ZSBleHRlbmRlZCBjb21tZW50IHJhbmdlcy5cbiAgICAgICAgdmFyIGNvbW1lbnRzID0gW10sIGNvbW1lbnQsIGxlbiwgaSwgY3Vyc29yO1xuXG4gICAgICAgIGlmICghdHJlZS5yYW5nZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdHRhY2hDb21tZW50cyBuZWVkcyByYW5nZSBpbmZvcm1hdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG9rZW5zIGFycmF5IGlzIGVtcHR5LCB3ZSBhdHRhY2ggY29tbWVudHMgdG8gdHJlZSBhcyAnbGVhZGluZ0NvbW1lbnRzJ1xuICAgICAgICBpZiAoIXRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChwcm92aWRlZENvbW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHByb3ZpZGVkQ29tbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGRlZXBDb3B5KHByb3ZpZGVkQ29tbWVudHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50LmV4dGVuZGVkUmFuZ2UgPSBbMCwgdHJlZS5yYW5nZVswXV07XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyZWUubGVhZGluZ0NvbW1lbnRzID0gY29tbWVudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJlZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHByb3ZpZGVkQ29tbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goZXh0ZW5kQ29tbWVudFJhbmdlKGRlZXBDb3B5KHByb3ZpZGVkQ29tbWVudHNbaV0pLCB0b2tlbnMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgaXMgYmFzZWQgb24gSm9obiBGcmVlbWFuJ3MgaW1wbGVtZW50YXRpb24uXG4gICAgICAgIGN1cnNvciA9IDA7XG4gICAgICAgIHRyYXZlcnNlKHRyZWUsIHtcbiAgICAgICAgICAgIGVudGVyOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb21tZW50O1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvciA8IGNvbW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudHNbY3Vyc29yXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQuZXh0ZW5kZWRSYW5nZVsxXSA+IG5vZGUucmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQuZXh0ZW5kZWRSYW5nZVsxXSA9PT0gbm9kZS5yYW5nZVswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubGVhZGluZ0NvbW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlYWRpbmdDb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMuc3BsaWNlKGN1cnNvciwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgb3V0IG9mIG93bmVkIG5vZGVcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID09PSBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2l0b3JPcHRpb24uQnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzW2N1cnNvcl0uZXh0ZW5kZWRSYW5nZVswXSA+IG5vZGUucmFuZ2VbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2l0b3JPcHRpb24uU2tpcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGN1cnNvciA9IDA7XG4gICAgICAgIHRyYXZlcnNlKHRyZWUsIHtcbiAgICAgICAgICAgIGxlYXZlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb21tZW50O1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvciA8IGNvbW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudHNbY3Vyc29yXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUucmFuZ2VbMV0gPCBjb21tZW50LmV4dGVuZGVkUmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUucmFuZ2VbMV0gPT09IGNvbW1lbnQuZXh0ZW5kZWRSYW5nZVswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLnRyYWlsaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnRyYWlsaW5nQ29tbWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudHJhaWxpbmdDb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMuc3BsaWNlKGN1cnNvciwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgb3V0IG9mIG93bmVkIG5vZGVcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID09PSBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2l0b3JPcHRpb24uQnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzW2N1cnNvcl0uZXh0ZW5kZWRSYW5nZVswXSA+IG5vZGUucmFuZ2VbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2l0b3JPcHRpb24uU2tpcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgIH1cblxuICAgIGV4cG9ydHMuU3ludGF4ID0gU3ludGF4O1xuICAgIGV4cG9ydHMudHJhdmVyc2UgPSB0cmF2ZXJzZTtcbiAgICBleHBvcnRzLnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIGV4cG9ydHMuYXR0YWNoQ29tbWVudHMgPSBhdHRhY2hDb21tZW50cztcbiAgICBleHBvcnRzLlZpc2l0b3JLZXlzID0gVmlzaXRvcktleXM7XG4gICAgZXhwb3J0cy5WaXNpdG9yT3B0aW9uID0gVmlzaXRvck9wdGlvbjtcbiAgICBleHBvcnRzLkNvbnRyb2xsZXIgPSBDb250cm9sbGVyO1xuICAgIGV4cG9ydHMuY2xvbmVFbnZpcm9ubWVudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNsb25lKHt9KTsgfTtcblxuICAgIHJldHVybiBleHBvcnRzO1xufShleHBvcnRzKSk7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiLypcbiAgQ29weXJpZ2h0IChDKSAyMDEzIFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICdBUyBJUydcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBmdW5jdGlvbiBpc0V4cHJlc3Npb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyYXlFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ0Fzc2lnbm1lbnRFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ0JpbmFyeUV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnQ2FsbEV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnQ29uZGl0aW9uYWxFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ0Z1bmN0aW9uRXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdJZGVudGlmaWVyJzpcbiAgICAgICAgICAgIGNhc2UgJ0xpdGVyYWwnOlxuICAgICAgICAgICAgY2FzZSAnTG9naWNhbEV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnTWVtYmVyRXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdOZXdFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ09iamVjdEV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnU2VxdWVuY2VFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ1RoaXNFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ1VuYXJ5RXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdVcGRhdGVFeHByZXNzaW9uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJdGVyYXRpb25TdGF0ZW1lbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnRG9XaGlsZVN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdGb3JJblN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdGb3JTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnV2hpbGVTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1N0YXRlbWVudChub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdCbG9ja1N0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdCcmVha1N0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdDb250aW51ZVN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdEZWJ1Z2dlclN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdEb1doaWxlU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0VtcHR5U3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0V4cHJlc3Npb25TdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRm9ySW5TdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRm9yU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0lmU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0xhYmVsZWRTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnUmV0dXJuU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ1N3aXRjaFN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdUaHJvd1N0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdUcnlTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnVmFyaWFibGVEZWNsYXJhdGlvbic6XG4gICAgICAgICAgICBjYXNlICdXaGlsZVN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdXaXRoU3RhdGVtZW50JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTb3VyY2VFbGVtZW50KG5vZGUpIHtcbiAgICAgIHJldHVybiBpc1N0YXRlbWVudChub2RlKSB8fCBub2RlICE9IG51bGwgJiYgbm9kZS50eXBlID09PSAnRnVuY3Rpb25EZWNsYXJhdGlvbic7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhaWxpbmdTdGF0ZW1lbnQobm9kZSkge1xuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICBjYXNlICdJZlN0YXRlbWVudCc6XG4gICAgICAgICAgICBpZiAobm9kZS5hbHRlcm5hdGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmFsdGVybmF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlLmNvbnNlcXVlbnQ7XG5cbiAgICAgICAgY2FzZSAnTGFiZWxlZFN0YXRlbWVudCc6XG4gICAgICAgIGNhc2UgJ0ZvclN0YXRlbWVudCc6XG4gICAgICAgIGNhc2UgJ0ZvckluU3RhdGVtZW50JzpcbiAgICAgICAgY2FzZSAnV2hpbGVTdGF0ZW1lbnQnOlxuICAgICAgICBjYXNlICdXaXRoU3RhdGVtZW50JzpcbiAgICAgICAgICAgIHJldHVybiBub2RlLmJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNQcm9ibGVtYXRpY0lmU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKG5vZGUudHlwZSAhPT0gJ0lmU3RhdGVtZW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmFsdGVybmF0ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IG5vZGUuY29uc2VxdWVudDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQudHlwZSA9PT0gJ0lmU3RhdGVtZW50Jykge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmFsdGVybmF0ZSA9PSBudWxsKSAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50ID0gdHJhaWxpbmdTdGF0ZW1lbnQoY3VycmVudCk7XG4gICAgICAgIH0gd2hpbGUgKGN1cnJlbnQpO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAgICAgaXNFeHByZXNzaW9uOiBpc0V4cHJlc3Npb24sXG4gICAgICAgIGlzU3RhdGVtZW50OiBpc1N0YXRlbWVudCxcbiAgICAgICAgaXNJdGVyYXRpb25TdGF0ZW1lbnQ6IGlzSXRlcmF0aW9uU3RhdGVtZW50LFxuICAgICAgICBpc1NvdXJjZUVsZW1lbnQ6IGlzU291cmNlRWxlbWVudCxcbiAgICAgICAgaXNQcm9ibGVtYXRpY0lmU3RhdGVtZW50OiBpc1Byb2JsZW1hdGljSWZTdGF0ZW1lbnQsXG5cbiAgICAgICAgdHJhaWxpbmdTdGF0ZW1lbnQ6IHRyYWlsaW5nU3RhdGVtZW50XG4gICAgfTtcbn0oKSk7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiLypcbiAgQ29weXJpZ2h0IChDKSAyMDEzLTIwMTQgWXVzdWtlIFN1enVraSA8dXRhdGFuZS50ZWFAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTQgSXZhbiBOaWt1bGluIDxpZmFhYW5AZ21haWwuY29tPlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIEVTNlJlZ2V4LCBFUzVSZWdleCwgTk9OX0FTQ0lJX1dISVRFU1BBQ0VTLCBJREVOVElGSUVSX1NUQVJULCBJREVOVElGSUVSX1BBUlQsIGNoO1xuXG4gICAgLy8gU2VlIGB0b29scy9nZW5lcmF0ZS1pZGVudGlmaWVyLXJlZ2V4LmpzYC5cbiAgICBFUzVSZWdleCA9IHtcbiAgICAgICAgLy8gRUNNQVNjcmlwdCA1LjEvVW5pY29kZSB2OS4wLjAgTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQ6XG4gICAgICAgIE5vbkFzY2lpSWRlbnRpZmllclN0YXJ0OiAvW1xceEFBXFx4QjVcXHhCQVxceEMwLVxceEQ2XFx4RDgtXFx4RjZcXHhGOC1cXHUwMkMxXFx1MDJDNi1cXHUwMkQxXFx1MDJFMC1cXHUwMkU0XFx1MDJFQ1xcdTAyRUVcXHUwMzcwLVxcdTAzNzRcXHUwMzc2XFx1MDM3N1xcdTAzN0EtXFx1MDM3RFxcdTAzN0ZcXHUwMzg2XFx1MDM4OC1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNGNVxcdTAzRjctXFx1MDQ4MVxcdTA0OEEtXFx1MDUyRlxcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNUQwLVxcdTA1RUFcXHUwNUYwLVxcdTA1RjJcXHUwNjIwLVxcdTA2NEFcXHUwNjZFXFx1MDY2RlxcdTA2NzEtXFx1MDZEM1xcdTA2RDVcXHUwNkU1XFx1MDZFNlxcdTA2RUVcXHUwNkVGXFx1MDZGQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTBcXHUwNzEyLVxcdTA3MkZcXHUwNzRELVxcdTA3QTVcXHUwN0IxXFx1MDdDQS1cXHUwN0VBXFx1MDdGNFxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODE1XFx1MDgxQVxcdTA4MjRcXHUwODI4XFx1MDg0MC1cXHUwODU4XFx1MDhBMC1cXHUwOEI0XFx1MDhCNi1cXHUwOEJEXFx1MDkwNC1cXHUwOTM5XFx1MDkzRFxcdTA5NTBcXHUwOTU4LVxcdTA5NjFcXHUwOTcxLVxcdTA5ODBcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJEXFx1MDlDRVxcdTA5RENcXHUwOUREXFx1MDlERi1cXHUwOUUxXFx1MDlGMFxcdTA5RjFcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTcyLVxcdTBBNzRcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkRcXHUwQUQwXFx1MEFFMFxcdTBBRTFcXHUwQUY5XFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0RcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2MVxcdTBCNzFcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCRDBcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzlcXHUwQzNEXFx1MEM1OC1cXHUwQzVBXFx1MEM2MFxcdTBDNjFcXHUwQzgwXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCRFxcdTBDREVcXHUwQ0UwXFx1MENFMVxcdTBDRjFcXHUwQ0YyXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRFxcdTBENEVcXHUwRDU0LVxcdTBENTZcXHUwRDVGLVxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4ODRcXHUxODg3LVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFFXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlCMC1cXHUxOUM5XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUM4MC1cXHUxQzg4XFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMkRcXHUyMTJGLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0VFXFx1MkNGMlxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDgwLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyRTJGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDI5XFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5RC1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OURcXHVBNkEwLVxcdUE2RUZcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QUVcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MEEtXFx1QTkyNVxcdUE5MzAtXFx1QTk0NlxcdUE5NjAtXFx1QTk3Q1xcdUE5ODQtXFx1QTlCMlxcdUE5Q0ZcXHVBOUUwLVxcdUE5RTRcXHVBOUU2LVxcdUE5RUZcXHVBOUZBLVxcdUE5RkVcXHVBQTAwLVxcdUFBMjhcXHVBQTQwLVxcdUFBNDJcXHVBQTQ0LVxcdUFBNEJcXHVBQTYwLVxcdUFBNzZcXHVBQTdBXFx1QUE3RS1cXHVBQUFGXFx1QUFCMVxcdUFBQjVcXHVBQUI2XFx1QUFCOS1cXHVBQUJEXFx1QUFDMFxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUFcXHVBQUYyLVxcdUFBRjRcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRTJcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFEXFx1RkIxRi1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjIxLVxcdUZGM0FcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdLyxcbiAgICAgICAgLy8gRUNNQVNjcmlwdCA1LjEvVW5pY29kZSB2OS4wLjAgTm9uQXNjaWlJZGVudGlmaWVyUGFydDpcbiAgICAgICAgTm9uQXNjaWlJZGVudGlmaWVyUGFydDogL1tcXHhBQVxceEI1XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDMwMC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDgzLVxcdTA0ODdcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDU5MS1cXHUwNUJEXFx1MDVCRlxcdTA1QzFcXHUwNUMyXFx1MDVDNFxcdTA1QzVcXHUwNUM3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYxMC1cXHUwNjFBXFx1MDYyMC1cXHUwNjY5XFx1MDY2RS1cXHUwNkQzXFx1MDZENS1cXHUwNkRDXFx1MDZERi1cXHUwNkU4XFx1MDZFQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTAtXFx1MDc0QVxcdTA3NEQtXFx1MDdCMVxcdTA3QzAtXFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MkRcXHUwODQwLVxcdTA4NUJcXHUwOEEwLVxcdTA4QjRcXHUwOEI2LVxcdTA4QkRcXHUwOEQ0LVxcdTA4RTFcXHUwOEUzLVxcdTA5NjNcXHUwOTY2LVxcdTA5NkZcXHUwOTcxLVxcdTA5ODNcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJDLVxcdTA5QzRcXHUwOUM3XFx1MDlDOFxcdTA5Q0ItXFx1MDlDRVxcdTA5RDdcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFM1xcdTA5RTYtXFx1MDlGMVxcdTBBMDEtXFx1MEEwM1xcdTBBMDUtXFx1MEEwQVxcdTBBMEZcXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMlxcdTBBMzNcXHUwQTM1XFx1MEEzNlxcdTBBMzhcXHUwQTM5XFx1MEEzQ1xcdTBBM0UtXFx1MEE0MlxcdTBBNDdcXHUwQTQ4XFx1MEE0Qi1cXHUwQTREXFx1MEE1MVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTY2LVxcdTBBNzVcXHUwQTgxLVxcdTBBODNcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkMtXFx1MEFDNVxcdTBBQzctXFx1MEFDOVxcdTBBQ0ItXFx1MEFDRFxcdTBBRDBcXHUwQUUwLVxcdTBBRTNcXHUwQUU2LVxcdTBBRUZcXHUwQUY5XFx1MEIwMS1cXHUwQjAzXFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0MtXFx1MEI0NFxcdTBCNDdcXHUwQjQ4XFx1MEI0Qi1cXHUwQjREXFx1MEI1NlxcdTBCNTdcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2M1xcdTBCNjYtXFx1MEI2RlxcdTBCNzFcXHUwQjgyXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkJFLVxcdTBCQzJcXHUwQkM2LVxcdTBCQzhcXHUwQkNBLVxcdTBCQ0RcXHUwQkQwXFx1MEJEN1xcdTBCRTYtXFx1MEJFRlxcdTBDMDAtXFx1MEMwM1xcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzOVxcdTBDM0QtXFx1MEM0NFxcdTBDNDYtXFx1MEM0OFxcdTBDNEEtXFx1MEM0RFxcdTBDNTVcXHUwQzU2XFx1MEM1OC1cXHUwQzVBXFx1MEM2MC1cXHUwQzYzXFx1MEM2Ni1cXHUwQzZGXFx1MEM4MC1cXHUwQzgzXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCQy1cXHUwQ0M0XFx1MENDNi1cXHUwQ0M4XFx1MENDQS1cXHUwQ0NEXFx1MENENVxcdTBDRDZcXHUwQ0RFXFx1MENFMC1cXHUwQ0UzXFx1MENFNi1cXHUwQ0VGXFx1MENGMVxcdTBDRjJcXHUwRDAxLVxcdTBEMDNcXHUwRDA1LVxcdTBEMENcXHUwRDBFLVxcdTBEMTBcXHUwRDEyLVxcdTBEM0FcXHUwRDNELVxcdTBENDRcXHUwRDQ2LVxcdTBENDhcXHUwRDRBLVxcdTBENEVcXHUwRDU0LVxcdTBENTdcXHUwRDVGLVxcdTBENjNcXHUwRDY2LVxcdTBENkZcXHUwRDdBLVxcdTBEN0ZcXHUwRDgyXFx1MEQ4M1xcdTBEODUtXFx1MEQ5NlxcdTBEOUEtXFx1MERCMVxcdTBEQjMtXFx1MERCQlxcdTBEQkRcXHUwREMwLVxcdTBEQzZcXHUwRENBXFx1MERDRi1cXHUwREQ0XFx1MERENlxcdTBERDgtXFx1MERERlxcdTBERTYtXFx1MERFRlxcdTBERjJcXHUwREYzXFx1MEUwMS1cXHUwRTNBXFx1MEU0MC1cXHUwRTRFXFx1MEU1MC1cXHUwRTU5XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjlcXHUwRUJCLVxcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVDOC1cXHUwRUNEXFx1MEVEMC1cXHUwRUQ5XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGMThcXHUwRjE5XFx1MEYyMC1cXHUwRjI5XFx1MEYzNVxcdTBGMzdcXHUwRjM5XFx1MEYzRS1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY3MS1cXHUwRjg0XFx1MEY4Ni1cXHUwRjk3XFx1MEY5OS1cXHUwRkJDXFx1MEZDNlxcdTEwMDAtXFx1MTA0OVxcdTEwNTAtXFx1MTA5RFxcdTEwQTAtXFx1MTBDNVxcdTEwQzdcXHUxMENEXFx1MTBEMC1cXHUxMEZBXFx1MTBGQy1cXHUxMjQ4XFx1MTI0QS1cXHUxMjREXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNUEtXFx1MTI1RFxcdTEyNjAtXFx1MTI4OFxcdTEyOEEtXFx1MTI4RFxcdTEyOTAtXFx1MTJCMFxcdTEyQjItXFx1MTJCNVxcdTEyQjgtXFx1MTJCRVxcdTEyQzBcXHUxMkMyLVxcdTEyQzVcXHUxMkM4LVxcdTEyRDZcXHUxMkQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNUFcXHUxMzVELVxcdTEzNUZcXHUxMzgwLVxcdTEzOEZcXHUxM0EwLVxcdTEzRjVcXHUxM0Y4LVxcdTEzRkRcXHUxNDAxLVxcdTE2NkNcXHUxNjZGLVxcdTE2N0ZcXHUxNjgxLVxcdTE2OUFcXHUxNkEwLVxcdTE2RUFcXHUxNkVFLVxcdTE2RjhcXHUxNzAwLVxcdTE3MENcXHUxNzBFLVxcdTE3MTRcXHUxNzIwLVxcdTE3MzRcXHUxNzQwLVxcdTE3NTNcXHUxNzYwLVxcdTE3NkNcXHUxNzZFLVxcdTE3NzBcXHUxNzcyXFx1MTc3M1xcdTE3ODAtXFx1MTdEM1xcdTE3RDdcXHUxN0RDXFx1MTdERFxcdTE3RTAtXFx1MTdFOVxcdTE4MEItXFx1MTgwRFxcdTE4MTAtXFx1MTgxOVxcdTE4MjAtXFx1MTg3N1xcdTE4ODAtXFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5MjAtXFx1MTkyQlxcdTE5MzAtXFx1MTkzQlxcdTE5NDYtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QjAtXFx1MTlDOVxcdTE5RDAtXFx1MTlEOVxcdTFBMDAtXFx1MUExQlxcdTFBMjAtXFx1MUE1RVxcdTFBNjAtXFx1MUE3Q1xcdTFBN0YtXFx1MUE4OVxcdTFBOTAtXFx1MUE5OVxcdTFBQTdcXHUxQUIwLVxcdTFBQkRcXHUxQjAwLVxcdTFCNEJcXHUxQjUwLVxcdTFCNTlcXHUxQjZCLVxcdTFCNzNcXHUxQjgwLVxcdTFCRjNcXHUxQzAwLVxcdTFDMzdcXHUxQzQwLVxcdTFDNDlcXHUxQzRELVxcdTFDN0RcXHUxQzgwLVxcdTFDODhcXHUxQ0QwLVxcdTFDRDJcXHUxQ0Q0LVxcdTFDRjZcXHUxQ0Y4XFx1MUNGOVxcdTFEMDAtXFx1MURGNVxcdTFERkItXFx1MUYxNVxcdTFGMTgtXFx1MUYxRFxcdTFGMjAtXFx1MUY0NVxcdTFGNDgtXFx1MUY0RFxcdTFGNTAtXFx1MUY1N1xcdTFGNTlcXHUxRjVCXFx1MUY1RFxcdTFGNUYtXFx1MUY3RFxcdTFGODAtXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQwLVxcdTFGRDNcXHUxRkQ2LVxcdTFGREJcXHUxRkUwLVxcdTFGRUNcXHUxRkYyLVxcdTFGRjRcXHUxRkY2LVxcdTFGRkNcXHUyMDBDXFx1MjAwRFxcdTIwM0ZcXHUyMDQwXFx1MjA1NFxcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjBEMC1cXHUyMERDXFx1MjBFMVxcdTIwRTUtXFx1MjBGMFxcdTIxMDJcXHUyMTA3XFx1MjEwQS1cXHUyMTEzXFx1MjExNVxcdTIxMTktXFx1MjExRFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMkEtXFx1MjEyRFxcdTIxMkYtXFx1MjEzOVxcdTIxM0MtXFx1MjEzRlxcdTIxNDUtXFx1MjE0OVxcdTIxNEVcXHUyMTYwLVxcdTIxODhcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDdGLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyREUwLVxcdTJERkZcXHUyRTJGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDJGXFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5OVxcdTMwOUFcXHUzMDlELVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGRDVcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MkJcXHVBNjQwLVxcdUE2NkZcXHVBNjc0LVxcdUE2N0RcXHVBNjdGLVxcdUE2RjFcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QUVcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MjdcXHVBODQwLVxcdUE4NzNcXHVBODgwLVxcdUE4QzVcXHVBOEQwLVxcdUE4RDlcXHVBOEUwLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MDAtXFx1QTkyRFxcdUE5MzAtXFx1QTk1M1xcdUE5NjAtXFx1QTk3Q1xcdUE5ODAtXFx1QTlDMFxcdUE5Q0YtXFx1QTlEOVxcdUE5RTAtXFx1QTlGRVxcdUFBMDAtXFx1QUEzNlxcdUFBNDAtXFx1QUE0RFxcdUFBNTAtXFx1QUE1OVxcdUFBNjAtXFx1QUE3NlxcdUFBN0EtXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFRlxcdUFBRjItXFx1QUFGNlxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCMzAtXFx1QUI1QVxcdUFCNUMtXFx1QUI2NVxcdUFCNzAtXFx1QUJFQVxcdUFCRUNcXHVBQkVEXFx1QUJGMC1cXHVBQkY5XFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRC1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTAwLVxcdUZFMEZcXHVGRTIwLVxcdUZFMkZcXHVGRTMzXFx1RkUzNFxcdUZFNEQtXFx1RkU0RlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMTAtXFx1RkYxOVxcdUZGMjEtXFx1RkYzQVxcdUZGM0ZcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdL1xuICAgIH07XG5cbiAgICBFUzZSZWdleCA9IHtcbiAgICAgICAgLy8gRUNNQVNjcmlwdCA2L1VuaWNvZGUgdjkuMC4wIE5vbkFzY2lpSWRlbnRpZmllclN0YXJ0OlxuICAgICAgICBOb25Bc2NpaUlkZW50aWZpZXJTdGFydDogL1tcXHhBQVxceEI1XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYyMC1cXHUwNjRBXFx1MDY2RVxcdTA2NkZcXHUwNjcxLVxcdTA2RDNcXHUwNkQ1XFx1MDZFNVxcdTA2RTZcXHUwNkVFXFx1MDZFRlxcdTA2RkEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwXFx1MDcxMi1cXHUwNzJGXFx1MDc0RC1cXHUwN0E1XFx1MDdCMVxcdTA3Q0EtXFx1MDdFQVxcdTA3RjRcXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgxNVxcdTA4MUFcXHUwODI0XFx1MDgyOFxcdTA4NDAtXFx1MDg1OFxcdTA4QTAtXFx1MDhCNFxcdTA4QjYtXFx1MDhCRFxcdTA5MDQtXFx1MDkzOVxcdTA5M0RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTgwXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCRFxcdTA5Q0VcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFMVxcdTA5RjBcXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE3Mi1cXHUwQTc0XFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFEMFxcdTBBRTBcXHUwQUUxXFx1MEFGOVxcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNEXFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjFcXHUwQjcxXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkQwXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRFxcdTBDNTgtXFx1MEM1QVxcdTBDNjBcXHUwQzYxXFx1MEM4MFxcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkRcXHUwQ0RFXFx1MENFMFxcdTBDRTFcXHUwQ0YxXFx1MENGMlxcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0RcXHUwRDRFXFx1MEQ1NC1cXHUwRDU2XFx1MEQ1Ri1cXHUwRDYxXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4NS1cXHUwRDk2XFx1MEQ5QS1cXHUwREIxXFx1MERCMy1cXHUwREJCXFx1MERCRFxcdTBEQzAtXFx1MERDNlxcdTBFMDEtXFx1MEUzMFxcdTBFMzJcXHUwRTMzXFx1MEU0MC1cXHUwRTQ2XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjBcXHUwRUIyXFx1MEVCM1xcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGNDAtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGODgtXFx1MEY4Q1xcdTEwMDAtXFx1MTAyQVxcdTEwM0ZcXHUxMDUwLVxcdTEwNTVcXHUxMDVBLVxcdTEwNURcXHUxMDYxXFx1MTA2NVxcdTEwNjZcXHUxMDZFLVxcdTEwNzBcXHUxMDc1LVxcdTEwODFcXHUxMDhFXFx1MTBBMC1cXHUxMEM1XFx1MTBDN1xcdTEwQ0RcXHUxMEQwLVxcdTEwRkFcXHUxMEZDLVxcdTEyNDhcXHUxMjRBLVxcdTEyNERcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1QS1cXHUxMjVEXFx1MTI2MC1cXHUxMjg4XFx1MTI4QS1cXHUxMjhEXFx1MTI5MC1cXHUxMkIwXFx1MTJCMi1cXHUxMkI1XFx1MTJCOC1cXHUxMkJFXFx1MTJDMFxcdTEyQzItXFx1MTJDNVxcdTEyQzgtXFx1MTJENlxcdTEyRDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1QVxcdTEzODAtXFx1MTM4RlxcdTEzQTAtXFx1MTNGNVxcdTEzRjgtXFx1MTNGRFxcdTE0MDEtXFx1MTY2Q1xcdTE2NkYtXFx1MTY3RlxcdTE2ODEtXFx1MTY5QVxcdTE2QTAtXFx1MTZFQVxcdTE2RUUtXFx1MTZGOFxcdTE3MDAtXFx1MTcwQ1xcdTE3MEUtXFx1MTcxMVxcdTE3MjAtXFx1MTczMVxcdTE3NDAtXFx1MTc1MVxcdTE3NjAtXFx1MTc2Q1xcdTE3NkUtXFx1MTc3MFxcdTE3ODAtXFx1MTdCM1xcdTE3RDdcXHUxN0RDXFx1MTgyMC1cXHUxODc3XFx1MTg4MC1cXHUxOEE4XFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5NTAtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QjAtXFx1MTlDOVxcdTFBMDAtXFx1MUExNlxcdTFBMjAtXFx1MUE1NFxcdTFBQTdcXHUxQjA1LVxcdTFCMzNcXHUxQjQ1LVxcdTFCNEJcXHUxQjgzLVxcdTFCQTBcXHUxQkFFXFx1MUJBRlxcdTFCQkEtXFx1MUJFNVxcdTFDMDAtXFx1MUMyM1xcdTFDNEQtXFx1MUM0RlxcdTFDNUEtXFx1MUM3RFxcdTFDODAtXFx1MUM4OFxcdTFDRTktXFx1MUNFQ1xcdTFDRUUtXFx1MUNGMVxcdTFDRjVcXHUxQ0Y2XFx1MUQwMC1cXHUxREJGXFx1MUUwMC1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjEwMlxcdTIxMDdcXHUyMTBBLVxcdTIxMTNcXHUyMTE1XFx1MjExOC1cXHUyMTFEXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyQS1cXHUyMTM5XFx1MjEzQy1cXHUyMTNGXFx1MjE0NS1cXHUyMTQ5XFx1MjE0RVxcdTIxNjAtXFx1MjE4OFxcdTJDMDAtXFx1MkMyRVxcdTJDMzAtXFx1MkM1RVxcdTJDNjAtXFx1MkNFNFxcdTJDRUItXFx1MkNFRVxcdTJDRjJcXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ4MC1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDI5XFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5Qi1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OURcXHVBNkEwLVxcdUE2RUZcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QUVcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MEEtXFx1QTkyNVxcdUE5MzAtXFx1QTk0NlxcdUE5NjAtXFx1QTk3Q1xcdUE5ODQtXFx1QTlCMlxcdUE5Q0ZcXHVBOUUwLVxcdUE5RTRcXHVBOUU2LVxcdUE5RUZcXHVBOUZBLVxcdUE5RkVcXHVBQTAwLVxcdUFBMjhcXHVBQTQwLVxcdUFBNDJcXHVBQTQ0LVxcdUFBNEJcXHVBQTYwLVxcdUFBNzZcXHVBQTdBXFx1QUE3RS1cXHVBQUFGXFx1QUFCMVxcdUFBQjVcXHVBQUI2XFx1QUFCOS1cXHVBQUJEXFx1QUFDMFxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUFcXHVBQUYyLVxcdUFBRjRcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRTJcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFEXFx1RkIxRi1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjIxLVxcdUZGM0FcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdfFxcdUQ4MDBbXFx1REMwMC1cXHVEQzBCXFx1REMwRC1cXHVEQzI2XFx1REMyOC1cXHVEQzNBXFx1REMzQ1xcdURDM0RcXHVEQzNGLVxcdURDNERcXHVEQzUwLVxcdURDNURcXHVEQzgwLVxcdURDRkFcXHVERDQwLVxcdURENzRcXHVERTgwLVxcdURFOUNcXHVERUEwLVxcdURFRDBcXHVERjAwLVxcdURGMUZcXHVERjMwLVxcdURGNEFcXHVERjUwLVxcdURGNzVcXHVERjgwLVxcdURGOURcXHVERkEwLVxcdURGQzNcXHVERkM4LVxcdURGQ0ZcXHVERkQxLVxcdURGRDVdfFxcdUQ4MDFbXFx1REMwMC1cXHVEQzlEXFx1RENCMC1cXHVEQ0QzXFx1RENEOC1cXHVEQ0ZCXFx1REQwMC1cXHVERDI3XFx1REQzMC1cXHVERDYzXFx1REUwMC1cXHVERjM2XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjY3XXxcXHVEODAyW1xcdURDMDAtXFx1REMwNVxcdURDMDhcXHVEQzBBLVxcdURDMzVcXHVEQzM3XFx1REMzOFxcdURDM0NcXHVEQzNGLVxcdURDNTVcXHVEQzYwLVxcdURDNzZcXHVEQzgwLVxcdURDOUVcXHVEQ0UwLVxcdURDRjJcXHVEQ0Y0XFx1RENGNVxcdUREMDAtXFx1REQxNVxcdUREMjAtXFx1REQzOVxcdUREODAtXFx1RERCN1xcdUREQkVcXHVEREJGXFx1REUwMFxcdURFMTAtXFx1REUxM1xcdURFMTUtXFx1REUxN1xcdURFMTktXFx1REUzM1xcdURFNjAtXFx1REU3Q1xcdURFODAtXFx1REU5Q1xcdURFQzAtXFx1REVDN1xcdURFQzktXFx1REVFNFxcdURGMDAtXFx1REYzNVxcdURGNDAtXFx1REY1NVxcdURGNjAtXFx1REY3MlxcdURGODAtXFx1REY5MV18XFx1RDgwM1tcXHVEQzAwLVxcdURDNDhcXHVEQzgwLVxcdURDQjJcXHVEQ0MwLVxcdURDRjJdfFxcdUQ4MDRbXFx1REMwMy1cXHVEQzM3XFx1REM4My1cXHVEQ0FGXFx1RENEMC1cXHVEQ0U4XFx1REQwMy1cXHVERDI2XFx1REQ1MC1cXHVERDcyXFx1REQ3NlxcdUREODMtXFx1RERCMlxcdUREQzEtXFx1RERDNFxcdUREREFcXHVERERDXFx1REUwMC1cXHVERTExXFx1REUxMy1cXHVERTJCXFx1REU4MC1cXHVERTg2XFx1REU4OFxcdURFOEEtXFx1REU4RFxcdURFOEYtXFx1REU5RFxcdURFOUYtXFx1REVBOFxcdURFQjAtXFx1REVERVxcdURGMDUtXFx1REYwQ1xcdURGMEZcXHVERjEwXFx1REYxMy1cXHVERjI4XFx1REYyQS1cXHVERjMwXFx1REYzMlxcdURGMzNcXHVERjM1LVxcdURGMzlcXHVERjNEXFx1REY1MFxcdURGNUQtXFx1REY2MV18XFx1RDgwNVtcXHVEQzAwLVxcdURDMzRcXHVEQzQ3LVxcdURDNEFcXHVEQzgwLVxcdURDQUZcXHVEQ0M0XFx1RENDNVxcdURDQzdcXHVERDgwLVxcdUREQUVcXHVEREQ4LVxcdUREREJcXHVERTAwLVxcdURFMkZcXHVERTQ0XFx1REU4MC1cXHVERUFBXFx1REYwMC1cXHVERjE5XXxcXHVEODA2W1xcdURDQTAtXFx1RENERlxcdURDRkZcXHVERUMwLVxcdURFRjhdfFxcdUQ4MDdbXFx1REMwMC1cXHVEQzA4XFx1REMwQS1cXHVEQzJFXFx1REM0MFxcdURDNzItXFx1REM4Rl18XFx1RDgwOFtcXHVEQzAwLVxcdURGOTldfFxcdUQ4MDlbXFx1REMwMC1cXHVEQzZFXFx1REM4MC1cXHVERDQzXXxbXFx1RDgwQ1xcdUQ4MUMtXFx1RDgyMFxcdUQ4NDAtXFx1RDg2OFxcdUQ4NkEtXFx1RDg2Q1xcdUQ4NkYtXFx1RDg3Ml1bXFx1REMwMC1cXHVERkZGXXxcXHVEODBEW1xcdURDMDAtXFx1REMyRV18XFx1RDgxMVtcXHVEQzAwLVxcdURFNDZdfFxcdUQ4MUFbXFx1REMwMC1cXHVERTM4XFx1REU0MC1cXHVERTVFXFx1REVEMC1cXHVERUVEXFx1REYwMC1cXHVERjJGXFx1REY0MC1cXHVERjQzXFx1REY2My1cXHVERjc3XFx1REY3RC1cXHVERjhGXXxcXHVEODFCW1xcdURGMDAtXFx1REY0NFxcdURGNTBcXHVERjkzLVxcdURGOUZcXHVERkUwXXxcXHVEODIxW1xcdURDMDAtXFx1REZFQ118XFx1RDgyMltcXHVEQzAwLVxcdURFRjJdfFxcdUQ4MkNbXFx1REMwMFxcdURDMDFdfFxcdUQ4MkZbXFx1REMwMC1cXHVEQzZBXFx1REM3MC1cXHVEQzdDXFx1REM4MC1cXHVEQzg4XFx1REM5MC1cXHVEQzk5XXxcXHVEODM1W1xcdURDMDAtXFx1REM1NFxcdURDNTYtXFx1REM5Q1xcdURDOUVcXHVEQzlGXFx1RENBMlxcdURDQTVcXHVEQ0E2XFx1RENBOS1cXHVEQ0FDXFx1RENBRS1cXHVEQ0I5XFx1RENCQlxcdURDQkQtXFx1RENDM1xcdURDQzUtXFx1REQwNVxcdUREMDctXFx1REQwQVxcdUREMEQtXFx1REQxNFxcdUREMTYtXFx1REQxQ1xcdUREMUUtXFx1REQzOVxcdUREM0ItXFx1REQzRVxcdURENDAtXFx1REQ0NFxcdURENDZcXHVERDRBLVxcdURENTBcXHVERDUyLVxcdURFQTVcXHVERUE4LVxcdURFQzBcXHVERUMyLVxcdURFREFcXHVERURDLVxcdURFRkFcXHVERUZDLVxcdURGMTRcXHVERjE2LVxcdURGMzRcXHVERjM2LVxcdURGNEVcXHVERjUwLVxcdURGNkVcXHVERjcwLVxcdURGODhcXHVERjhBLVxcdURGQThcXHVERkFBLVxcdURGQzJcXHVERkM0LVxcdURGQ0JdfFxcdUQ4M0FbXFx1REMwMC1cXHVEQ0M0XFx1REQwMC1cXHVERDQzXXxcXHVEODNCW1xcdURFMDAtXFx1REUwM1xcdURFMDUtXFx1REUxRlxcdURFMjFcXHVERTIyXFx1REUyNFxcdURFMjdcXHVERTI5LVxcdURFMzJcXHVERTM0LVxcdURFMzdcXHVERTM5XFx1REUzQlxcdURFNDJcXHVERTQ3XFx1REU0OVxcdURFNEJcXHVERTRELVxcdURFNEZcXHVERTUxXFx1REU1MlxcdURFNTRcXHVERTU3XFx1REU1OVxcdURFNUJcXHVERTVEXFx1REU1RlxcdURFNjFcXHVERTYyXFx1REU2NFxcdURFNjctXFx1REU2QVxcdURFNkMtXFx1REU3MlxcdURFNzQtXFx1REU3N1xcdURFNzktXFx1REU3Q1xcdURFN0VcXHVERTgwLVxcdURFODlcXHVERThCLVxcdURFOUJcXHVERUExLVxcdURFQTNcXHVERUE1LVxcdURFQTlcXHVERUFCLVxcdURFQkJdfFxcdUQ4NjlbXFx1REMwMC1cXHVERUQ2XFx1REYwMC1cXHVERkZGXXxcXHVEODZEW1xcdURDMDAtXFx1REYzNFxcdURGNDAtXFx1REZGRl18XFx1RDg2RVtcXHVEQzAwLVxcdURDMURcXHVEQzIwLVxcdURGRkZdfFxcdUQ4NzNbXFx1REMwMC1cXHVERUExXXxcXHVEODdFW1xcdURDMDAtXFx1REUxRF0vLFxuICAgICAgICAvLyBFQ01BU2NyaXB0IDYvVW5pY29kZSB2OS4wLjAgTm9uQXNjaWlJZGVudGlmaWVyUGFydDpcbiAgICAgICAgTm9uQXNjaWlJZGVudGlmaWVyUGFydDogL1tcXHhBQVxceEI1XFx4QjdcXHhCQVxceEMwLVxceEQ2XFx4RDgtXFx4RjZcXHhGOC1cXHUwMkMxXFx1MDJDNi1cXHUwMkQxXFx1MDJFMC1cXHUwMkU0XFx1MDJFQ1xcdTAyRUVcXHUwMzAwLVxcdTAzNzRcXHUwMzc2XFx1MDM3N1xcdTAzN0EtXFx1MDM3RFxcdTAzN0ZcXHUwMzg2LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4My1cXHUwNDg3XFx1MDQ4QS1cXHUwNTJGXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1OTEtXFx1MDVCRFxcdTA1QkZcXHUwNUMxXFx1MDVDMlxcdTA1QzRcXHUwNUM1XFx1MDVDN1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MTAtXFx1MDYxQVxcdTA2MjAtXFx1MDY2OVxcdTA2NkUtXFx1MDZEM1xcdTA2RDUtXFx1MDZEQ1xcdTA2REYtXFx1MDZFOFxcdTA2RUEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwLVxcdTA3NEFcXHUwNzRELVxcdTA3QjFcXHUwN0MwLVxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODJEXFx1MDg0MC1cXHUwODVCXFx1MDhBMC1cXHUwOEI0XFx1MDhCNi1cXHUwOEJEXFx1MDhENC1cXHUwOEUxXFx1MDhFMy1cXHUwOTYzXFx1MDk2Ni1cXHUwOTZGXFx1MDk3MS1cXHUwOTgzXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCQy1cXHUwOUM0XFx1MDlDN1xcdTA5QzhcXHUwOUNCLVxcdTA5Q0VcXHUwOUQ3XFx1MDlEQ1xcdTA5RERcXHUwOURGLVxcdTA5RTNcXHUwOUU2LVxcdTA5RjFcXHUwQTAxLVxcdTBBMDNcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBM0NcXHUwQTNFLVxcdTBBNDJcXHUwQTQ3XFx1MEE0OFxcdTBBNEItXFx1MEE0RFxcdTBBNTFcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE2Ni1cXHUwQTc1XFx1MEE4MS1cXHUwQTgzXFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJDLVxcdTBBQzVcXHUwQUM3LVxcdTBBQzlcXHUwQUNCLVxcdTBBQ0RcXHUwQUQwXFx1MEFFMC1cXHUwQUUzXFx1MEFFNi1cXHUwQUVGXFx1MEFGOVxcdTBCMDEtXFx1MEIwM1xcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNDLVxcdTBCNDRcXHUwQjQ3XFx1MEI0OFxcdTBCNEItXFx1MEI0RFxcdTBCNTZcXHUwQjU3XFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjNcXHUwQjY2LVxcdTBCNkZcXHUwQjcxXFx1MEI4MlxcdTBCODNcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5XFx1MEI5QVxcdTBCOUNcXHUwQjlFXFx1MEI5RlxcdTBCQTNcXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI5XFx1MEJCRS1cXHUwQkMyXFx1MEJDNi1cXHUwQkM4XFx1MEJDQS1cXHUwQkNEXFx1MEJEMFxcdTBCRDdcXHUwQkU2LVxcdTBCRUZcXHUwQzAwLVxcdTBDMDNcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzlcXHUwQzNELVxcdTBDNDRcXHUwQzQ2LVxcdTBDNDhcXHUwQzRBLVxcdTBDNERcXHUwQzU1XFx1MEM1NlxcdTBDNTgtXFx1MEM1QVxcdTBDNjAtXFx1MEM2M1xcdTBDNjYtXFx1MEM2RlxcdTBDODAtXFx1MEM4M1xcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkMtXFx1MENDNFxcdTBDQzYtXFx1MENDOFxcdTBDQ0EtXFx1MENDRFxcdTBDRDVcXHUwQ0Q2XFx1MENERVxcdTBDRTAtXFx1MENFM1xcdTBDRTYtXFx1MENFRlxcdTBDRjFcXHUwQ0YyXFx1MEQwMS1cXHUwRDAzXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRC1cXHUwRDQ0XFx1MEQ0Ni1cXHUwRDQ4XFx1MEQ0QS1cXHUwRDRFXFx1MEQ1NC1cXHUwRDU3XFx1MEQ1Ri1cXHUwRDYzXFx1MEQ2Ni1cXHUwRDZGXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4MlxcdTBEODNcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MERDQVxcdTBEQ0YtXFx1MERENFxcdTBERDZcXHUwREQ4LVxcdTBEREZcXHUwREU2LVxcdTBERUZcXHUwREYyXFx1MERGM1xcdTBFMDEtXFx1MEUzQVxcdTBFNDAtXFx1MEU0RVxcdTBFNTAtXFx1MEU1OVxcdTBFODFcXHUwRTgyXFx1MEU4NFxcdTBFODdcXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUFcXHUwRUFCXFx1MEVBRC1cXHUwRUI5XFx1MEVCQi1cXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEVDNlxcdTBFQzgtXFx1MEVDRFxcdTBFRDAtXFx1MEVEOVxcdTBFREMtXFx1MEVERlxcdTBGMDBcXHUwRjE4XFx1MEYxOVxcdTBGMjAtXFx1MEYyOVxcdTBGMzVcXHUwRjM3XFx1MEYzOVxcdTBGM0UtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGNzEtXFx1MEY4NFxcdTBGODYtXFx1MEY5N1xcdTBGOTktXFx1MEZCQ1xcdTBGQzZcXHUxMDAwLVxcdTEwNDlcXHUxMDUwLVxcdTEwOURcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM1RC1cXHUxMzVGXFx1MTM2OS1cXHUxMzcxXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzE0XFx1MTcyMC1cXHUxNzM0XFx1MTc0MC1cXHUxNzUzXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc3MlxcdTE3NzNcXHUxNzgwLVxcdTE3RDNcXHUxN0Q3XFx1MTdEQ1xcdTE3RERcXHUxN0UwLVxcdTE3RTlcXHUxODBCLVxcdTE4MERcXHUxODEwLVxcdTE4MTlcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QUFcXHUxOEIwLVxcdTE4RjVcXHUxOTAwLVxcdTE5MUVcXHUxOTIwLVxcdTE5MkJcXHUxOTMwLVxcdTE5M0JcXHUxOTQ2LVxcdTE5NkRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5QUJcXHUxOUIwLVxcdTE5QzlcXHUxOUQwLVxcdTE5REFcXHUxQTAwLVxcdTFBMUJcXHUxQTIwLVxcdTFBNUVcXHUxQTYwLVxcdTFBN0NcXHUxQTdGLVxcdTFBODlcXHUxQTkwLVxcdTFBOTlcXHUxQUE3XFx1MUFCMC1cXHUxQUJEXFx1MUIwMC1cXHUxQjRCXFx1MUI1MC1cXHUxQjU5XFx1MUI2Qi1cXHUxQjczXFx1MUI4MC1cXHUxQkYzXFx1MUMwMC1cXHUxQzM3XFx1MUM0MC1cXHUxQzQ5XFx1MUM0RC1cXHUxQzdEXFx1MUM4MC1cXHUxQzg4XFx1MUNEMC1cXHUxQ0QyXFx1MUNENC1cXHUxQ0Y2XFx1MUNGOFxcdTFDRjlcXHUxRDAwLVxcdTFERjVcXHUxREZCLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjAwQ1xcdTIwMERcXHUyMDNGXFx1MjA0MFxcdTIwNTRcXHUyMDcxXFx1MjA3RlxcdTIwOTAtXFx1MjA5Q1xcdTIwRDAtXFx1MjBEQ1xcdTIwRTFcXHUyMEU1LVxcdTIwRjBcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE4LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ3Ri1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MkRFMC1cXHUyREZGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDJGXFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5OS1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjJCXFx1QTY0MC1cXHVBNjZGXFx1QTY3NC1cXHVBNjdEXFx1QTY3Ri1cXHVBNkYxXFx1QTcxNy1cXHVBNzFGXFx1QTcyMi1cXHVBNzg4XFx1QTc4Qi1cXHVBN0FFXFx1QTdCMC1cXHVBN0I3XFx1QTdGNy1cXHVBODI3XFx1QTg0MC1cXHVBODczXFx1QTg4MC1cXHVBOEM1XFx1QThEMC1cXHVBOEQ5XFx1QThFMC1cXHVBOEY3XFx1QThGQlxcdUE4RkRcXHVBOTAwLVxcdUE5MkRcXHVBOTMwLVxcdUE5NTNcXHVBOTYwLVxcdUE5N0NcXHVBOTgwLVxcdUE5QzBcXHVBOUNGLVxcdUE5RDlcXHVBOUUwLVxcdUE5RkVcXHVBQTAwLVxcdUFBMzZcXHVBQTQwLVxcdUFBNERcXHVBQTUwLVxcdUFBNTlcXHVBQTYwLVxcdUFBNzZcXHVBQTdBLVxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUZcXHVBQUYyLVxcdUFBRjZcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRUFcXHVBQkVDXFx1QUJFRFxcdUFCRjAtXFx1QUJGOVxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMUQtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkUwMC1cXHVGRTBGXFx1RkUyMC1cXHVGRTJGXFx1RkUzM1xcdUZFMzRcXHVGRTRELVxcdUZFNEZcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjEwLVxcdUZGMTlcXHVGRjIxLVxcdUZGM0FcXHVGRjNGXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXXxcXHVEODAwW1xcdURDMDAtXFx1REMwQlxcdURDMEQtXFx1REMyNlxcdURDMjgtXFx1REMzQVxcdURDM0NcXHVEQzNEXFx1REMzRi1cXHVEQzREXFx1REM1MC1cXHVEQzVEXFx1REM4MC1cXHVEQ0ZBXFx1REQ0MC1cXHVERDc0XFx1RERGRFxcdURFODAtXFx1REU5Q1xcdURFQTAtXFx1REVEMFxcdURFRTBcXHVERjAwLVxcdURGMUZcXHVERjMwLVxcdURGNEFcXHVERjUwLVxcdURGN0FcXHVERjgwLVxcdURGOURcXHVERkEwLVxcdURGQzNcXHVERkM4LVxcdURGQ0ZcXHVERkQxLVxcdURGRDVdfFxcdUQ4MDFbXFx1REMwMC1cXHVEQzlEXFx1RENBMC1cXHVEQ0E5XFx1RENCMC1cXHVEQ0QzXFx1RENEOC1cXHVEQ0ZCXFx1REQwMC1cXHVERDI3XFx1REQzMC1cXHVERDYzXFx1REUwMC1cXHVERjM2XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjY3XXxcXHVEODAyW1xcdURDMDAtXFx1REMwNVxcdURDMDhcXHVEQzBBLVxcdURDMzVcXHVEQzM3XFx1REMzOFxcdURDM0NcXHVEQzNGLVxcdURDNTVcXHVEQzYwLVxcdURDNzZcXHVEQzgwLVxcdURDOUVcXHVEQ0UwLVxcdURDRjJcXHVEQ0Y0XFx1RENGNVxcdUREMDAtXFx1REQxNVxcdUREMjAtXFx1REQzOVxcdUREODAtXFx1RERCN1xcdUREQkVcXHVEREJGXFx1REUwMC1cXHVERTAzXFx1REUwNVxcdURFMDZcXHVERTBDLVxcdURFMTNcXHVERTE1LVxcdURFMTdcXHVERTE5LVxcdURFMzNcXHVERTM4LVxcdURFM0FcXHVERTNGXFx1REU2MC1cXHVERTdDXFx1REU4MC1cXHVERTlDXFx1REVDMC1cXHVERUM3XFx1REVDOS1cXHVERUU2XFx1REYwMC1cXHVERjM1XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjcyXFx1REY4MC1cXHVERjkxXXxcXHVEODAzW1xcdURDMDAtXFx1REM0OFxcdURDODAtXFx1RENCMlxcdURDQzAtXFx1RENGMl18XFx1RDgwNFtcXHVEQzAwLVxcdURDNDZcXHVEQzY2LVxcdURDNkZcXHVEQzdGLVxcdURDQkFcXHVEQ0QwLVxcdURDRThcXHVEQ0YwLVxcdURDRjlcXHVERDAwLVxcdUREMzRcXHVERDM2LVxcdUREM0ZcXHVERDUwLVxcdURENzNcXHVERDc2XFx1REQ4MC1cXHVEREM0XFx1RERDQS1cXHVERENDXFx1REREMC1cXHVERERBXFx1REREQ1xcdURFMDAtXFx1REUxMVxcdURFMTMtXFx1REUzN1xcdURFM0VcXHVERTgwLVxcdURFODZcXHVERTg4XFx1REU4QS1cXHVERThEXFx1REU4Ri1cXHVERTlEXFx1REU5Ri1cXHVERUE4XFx1REVCMC1cXHVERUVBXFx1REVGMC1cXHVERUY5XFx1REYwMC1cXHVERjAzXFx1REYwNS1cXHVERjBDXFx1REYwRlxcdURGMTBcXHVERjEzLVxcdURGMjhcXHVERjJBLVxcdURGMzBcXHVERjMyXFx1REYzM1xcdURGMzUtXFx1REYzOVxcdURGM0MtXFx1REY0NFxcdURGNDdcXHVERjQ4XFx1REY0Qi1cXHVERjREXFx1REY1MFxcdURGNTdcXHVERjVELVxcdURGNjNcXHVERjY2LVxcdURGNkNcXHVERjcwLVxcdURGNzRdfFxcdUQ4MDVbXFx1REMwMC1cXHVEQzRBXFx1REM1MC1cXHVEQzU5XFx1REM4MC1cXHVEQ0M1XFx1RENDN1xcdURDRDAtXFx1RENEOVxcdUREODAtXFx1RERCNVxcdUREQjgtXFx1RERDMFxcdURERDgtXFx1RERERFxcdURFMDAtXFx1REU0MFxcdURFNDRcXHVERTUwLVxcdURFNTlcXHVERTgwLVxcdURFQjdcXHVERUMwLVxcdURFQzlcXHVERjAwLVxcdURGMTlcXHVERjFELVxcdURGMkJcXHVERjMwLVxcdURGMzldfFxcdUQ4MDZbXFx1RENBMC1cXHVEQ0U5XFx1RENGRlxcdURFQzAtXFx1REVGOF18XFx1RDgwN1tcXHVEQzAwLVxcdURDMDhcXHVEQzBBLVxcdURDMzZcXHVEQzM4LVxcdURDNDBcXHVEQzUwLVxcdURDNTlcXHVEQzcyLVxcdURDOEZcXHVEQzkyLVxcdURDQTdcXHVEQ0E5LVxcdURDQjZdfFxcdUQ4MDhbXFx1REMwMC1cXHVERjk5XXxcXHVEODA5W1xcdURDMDAtXFx1REM2RVxcdURDODAtXFx1REQ0M118W1xcdUQ4MENcXHVEODFDLVxcdUQ4MjBcXHVEODQwLVxcdUQ4NjhcXHVEODZBLVxcdUQ4NkNcXHVEODZGLVxcdUQ4NzJdW1xcdURDMDAtXFx1REZGRl18XFx1RDgwRFtcXHVEQzAwLVxcdURDMkVdfFxcdUQ4MTFbXFx1REMwMC1cXHVERTQ2XXxcXHVEODFBW1xcdURDMDAtXFx1REUzOFxcdURFNDAtXFx1REU1RVxcdURFNjAtXFx1REU2OVxcdURFRDAtXFx1REVFRFxcdURFRjAtXFx1REVGNFxcdURGMDAtXFx1REYzNlxcdURGNDAtXFx1REY0M1xcdURGNTAtXFx1REY1OVxcdURGNjMtXFx1REY3N1xcdURGN0QtXFx1REY4Rl18XFx1RDgxQltcXHVERjAwLVxcdURGNDRcXHVERjUwLVxcdURGN0VcXHVERjhGLVxcdURGOUZcXHVERkUwXXxcXHVEODIxW1xcdURDMDAtXFx1REZFQ118XFx1RDgyMltcXHVEQzAwLVxcdURFRjJdfFxcdUQ4MkNbXFx1REMwMFxcdURDMDFdfFxcdUQ4MkZbXFx1REMwMC1cXHVEQzZBXFx1REM3MC1cXHVEQzdDXFx1REM4MC1cXHVEQzg4XFx1REM5MC1cXHVEQzk5XFx1REM5RFxcdURDOUVdfFxcdUQ4MzRbXFx1REQ2NS1cXHVERDY5XFx1REQ2RC1cXHVERDcyXFx1REQ3Qi1cXHVERDgyXFx1REQ4NS1cXHVERDhCXFx1RERBQS1cXHVEREFEXFx1REU0Mi1cXHVERTQ0XXxcXHVEODM1W1xcdURDMDAtXFx1REM1NFxcdURDNTYtXFx1REM5Q1xcdURDOUVcXHVEQzlGXFx1RENBMlxcdURDQTVcXHVEQ0E2XFx1RENBOS1cXHVEQ0FDXFx1RENBRS1cXHVEQ0I5XFx1RENCQlxcdURDQkQtXFx1RENDM1xcdURDQzUtXFx1REQwNVxcdUREMDctXFx1REQwQVxcdUREMEQtXFx1REQxNFxcdUREMTYtXFx1REQxQ1xcdUREMUUtXFx1REQzOVxcdUREM0ItXFx1REQzRVxcdURENDAtXFx1REQ0NFxcdURENDZcXHVERDRBLVxcdURENTBcXHVERDUyLVxcdURFQTVcXHVERUE4LVxcdURFQzBcXHVERUMyLVxcdURFREFcXHVERURDLVxcdURFRkFcXHVERUZDLVxcdURGMTRcXHVERjE2LVxcdURGMzRcXHVERjM2LVxcdURGNEVcXHVERjUwLVxcdURGNkVcXHVERjcwLVxcdURGODhcXHVERjhBLVxcdURGQThcXHVERkFBLVxcdURGQzJcXHVERkM0LVxcdURGQ0JcXHVERkNFLVxcdURGRkZdfFxcdUQ4MzZbXFx1REUwMC1cXHVERTM2XFx1REUzQi1cXHVERTZDXFx1REU3NVxcdURFODRcXHVERTlCLVxcdURFOUZcXHVERUExLVxcdURFQUZdfFxcdUQ4MzhbXFx1REMwMC1cXHVEQzA2XFx1REMwOC1cXHVEQzE4XFx1REMxQi1cXHVEQzIxXFx1REMyM1xcdURDMjRcXHVEQzI2LVxcdURDMkFdfFxcdUQ4M0FbXFx1REMwMC1cXHVEQ0M0XFx1RENEMC1cXHVEQ0Q2XFx1REQwMC1cXHVERDRBXFx1REQ1MC1cXHVERDU5XXxcXHVEODNCW1xcdURFMDAtXFx1REUwM1xcdURFMDUtXFx1REUxRlxcdURFMjFcXHVERTIyXFx1REUyNFxcdURFMjdcXHVERTI5LVxcdURFMzJcXHVERTM0LVxcdURFMzdcXHVERTM5XFx1REUzQlxcdURFNDJcXHVERTQ3XFx1REU0OVxcdURFNEJcXHVERTRELVxcdURFNEZcXHVERTUxXFx1REU1MlxcdURFNTRcXHVERTU3XFx1REU1OVxcdURFNUJcXHVERTVEXFx1REU1RlxcdURFNjFcXHVERTYyXFx1REU2NFxcdURFNjctXFx1REU2QVxcdURFNkMtXFx1REU3MlxcdURFNzQtXFx1REU3N1xcdURFNzktXFx1REU3Q1xcdURFN0VcXHVERTgwLVxcdURFODlcXHVERThCLVxcdURFOUJcXHVERUExLVxcdURFQTNcXHVERUE1LVxcdURFQTlcXHVERUFCLVxcdURFQkJdfFxcdUQ4NjlbXFx1REMwMC1cXHVERUQ2XFx1REYwMC1cXHVERkZGXXxcXHVEODZEW1xcdURDMDAtXFx1REYzNFxcdURGNDAtXFx1REZGRl18XFx1RDg2RVtcXHVEQzAwLVxcdURDMURcXHVEQzIwLVxcdURGRkZdfFxcdUQ4NzNbXFx1REMwMC1cXHVERUExXXxcXHVEODdFW1xcdURDMDAtXFx1REUxRF18XFx1REI0MFtcXHVERDAwLVxcdURERUZdL1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBpc0RlY2ltYWxEaWdpdChjaCkge1xuICAgICAgICByZXR1cm4gMHgzMCA8PSBjaCAmJiBjaCA8PSAweDM5OyAgLy8gMC4uOVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSGV4RGlnaXQoY2gpIHtcbiAgICAgICAgcmV0dXJuIDB4MzAgPD0gY2ggJiYgY2ggPD0gMHgzOSB8fCAgLy8gMC4uOVxuICAgICAgICAgICAgMHg2MSA8PSBjaCAmJiBjaCA8PSAweDY2IHx8ICAgICAvLyBhLi5mXG4gICAgICAgICAgICAweDQxIDw9IGNoICYmIGNoIDw9IDB4NDY7ICAgICAgIC8vIEEuLkZcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09jdGFsRGlnaXQoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoID49IDB4MzAgJiYgY2ggPD0gMHgzNzsgIC8vIDAuLjdcbiAgICB9XG5cbiAgICAvLyA3LjIgV2hpdGUgU3BhY2VcblxuICAgIE5PTl9BU0NJSV9XSElURVNQQUNFUyA9IFtcbiAgICAgICAgMHgxNjgwLFxuICAgICAgICAweDIwMDAsIDB4MjAwMSwgMHgyMDAyLCAweDIwMDMsIDB4MjAwNCwgMHgyMDA1LCAweDIwMDYsIDB4MjAwNywgMHgyMDA4LCAweDIwMDksIDB4MjAwQSxcbiAgICAgICAgMHgyMDJGLCAweDIwNUYsXG4gICAgICAgIDB4MzAwMCxcbiAgICAgICAgMHhGRUZGXG4gICAgXTtcblxuICAgIGZ1bmN0aW9uIGlzV2hpdGVTcGFjZShjaCkge1xuICAgICAgICByZXR1cm4gY2ggPT09IDB4MjAgfHwgY2ggPT09IDB4MDkgfHwgY2ggPT09IDB4MEIgfHwgY2ggPT09IDB4MEMgfHwgY2ggPT09IDB4QTAgfHxcbiAgICAgICAgICAgIGNoID49IDB4MTY4MCAmJiBOT05fQVNDSUlfV0hJVEVTUEFDRVMuaW5kZXhPZihjaCkgPj0gMDtcbiAgICB9XG5cbiAgICAvLyA3LjMgTGluZSBUZXJtaW5hdG9yc1xuXG4gICAgZnVuY3Rpb24gaXNMaW5lVGVybWluYXRvcihjaCkge1xuICAgICAgICByZXR1cm4gY2ggPT09IDB4MEEgfHwgY2ggPT09IDB4MEQgfHwgY2ggPT09IDB4MjAyOCB8fCBjaCA9PT0gMHgyMDI5O1xuICAgIH1cblxuICAgIC8vIDcuNiBJZGVudGlmaWVyIE5hbWVzIGFuZCBJZGVudGlmaWVyc1xuXG4gICAgZnVuY3Rpb24gZnJvbUNvZGVQb2ludChjcCkge1xuICAgICAgICBpZiAoY3AgPD0gMHhGRkZGKSB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKTsgfVxuICAgICAgICB2YXIgY3UxID0gU3RyaW5nLmZyb21DaGFyQ29kZShNYXRoLmZsb29yKChjcCAtIDB4MTAwMDApIC8gMHg0MDApICsgMHhEODAwKTtcbiAgICAgICAgdmFyIGN1MiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjcCAtIDB4MTAwMDApICUgMHg0MDApICsgMHhEQzAwKTtcbiAgICAgICAgcmV0dXJuIGN1MSArIGN1MjtcbiAgICB9XG5cbiAgICBJREVOVElGSUVSX1NUQVJUID0gbmV3IEFycmF5KDB4ODApO1xuICAgIGZvcihjaCA9IDA7IGNoIDwgMHg4MDsgKytjaCkge1xuICAgICAgICBJREVOVElGSUVSX1NUQVJUW2NoXSA9XG4gICAgICAgICAgICBjaCA+PSAweDYxICYmIGNoIDw9IDB4N0EgfHwgIC8vIGEuLnpcbiAgICAgICAgICAgIGNoID49IDB4NDEgJiYgY2ggPD0gMHg1QSB8fCAgLy8gQS4uWlxuICAgICAgICAgICAgY2ggPT09IDB4MjQgfHwgY2ggPT09IDB4NUY7ICAvLyAkIChkb2xsYXIpIGFuZCBfICh1bmRlcnNjb3JlKVxuICAgIH1cblxuICAgIElERU5USUZJRVJfUEFSVCA9IG5ldyBBcnJheSgweDgwKTtcbiAgICBmb3IoY2ggPSAwOyBjaCA8IDB4ODA7ICsrY2gpIHtcbiAgICAgICAgSURFTlRJRklFUl9QQVJUW2NoXSA9XG4gICAgICAgICAgICBjaCA+PSAweDYxICYmIGNoIDw9IDB4N0EgfHwgIC8vIGEuLnpcbiAgICAgICAgICAgIGNoID49IDB4NDEgJiYgY2ggPD0gMHg1QSB8fCAgLy8gQS4uWlxuICAgICAgICAgICAgY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5IHx8ICAvLyAwLi45XG4gICAgICAgICAgICBjaCA9PT0gMHgyNCB8fCBjaCA9PT0gMHg1RjsgIC8vICQgKGRvbGxhcikgYW5kIF8gKHVuZGVyc2NvcmUpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnRFUzUoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoIDwgMHg4MCA/IElERU5USUZJRVJfU1RBUlRbY2hdIDogRVM1UmVnZXguTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyUGFydEVTNShjaCkge1xuICAgICAgICByZXR1cm4gY2ggPCAweDgwID8gSURFTlRJRklFUl9QQVJUW2NoXSA6IEVTNVJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclBhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnRFUzYoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoIDwgMHg4MCA/IElERU5USUZJRVJfU1RBUlRbY2hdIDogRVM2UmVnZXguTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyUGFydEVTNihjaCkge1xuICAgICAgICByZXR1cm4gY2ggPCAweDgwID8gSURFTlRJRklFUl9QQVJUW2NoXSA6IEVTNlJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclBhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgfVxuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgICAgIGlzRGVjaW1hbERpZ2l0OiBpc0RlY2ltYWxEaWdpdCxcbiAgICAgICAgaXNIZXhEaWdpdDogaXNIZXhEaWdpdCxcbiAgICAgICAgaXNPY3RhbERpZ2l0OiBpc09jdGFsRGlnaXQsXG4gICAgICAgIGlzV2hpdGVTcGFjZTogaXNXaGl0ZVNwYWNlLFxuICAgICAgICBpc0xpbmVUZXJtaW5hdG9yOiBpc0xpbmVUZXJtaW5hdG9yLFxuICAgICAgICBpc0lkZW50aWZpZXJTdGFydEVTNTogaXNJZGVudGlmaWVyU3RhcnRFUzUsXG4gICAgICAgIGlzSWRlbnRpZmllclBhcnRFUzU6IGlzSWRlbnRpZmllclBhcnRFUzUsXG4gICAgICAgIGlzSWRlbnRpZmllclN0YXJ0RVM2OiBpc0lkZW50aWZpZXJTdGFydEVTNixcbiAgICAgICAgaXNJZGVudGlmaWVyUGFydEVTNjogaXNJZGVudGlmaWVyUGFydEVTNlxuICAgIH07XG59KCkpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbiIsIi8qXG4gIENvcHlyaWdodCAoQykgMjAxMyBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgY29kZSA9IHJlcXVpcmUoJy4vY29kZScpO1xuXG4gICAgZnVuY3Rpb24gaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkRVM2KGlkKSB7XG4gICAgICAgIHN3aXRjaCAoaWQpIHtcbiAgICAgICAgY2FzZSAnaW1wbGVtZW50cyc6XG4gICAgICAgIGNhc2UgJ2ludGVyZmFjZSc6XG4gICAgICAgIGNhc2UgJ3BhY2thZ2UnOlxuICAgICAgICBjYXNlICdwcml2YXRlJzpcbiAgICAgICAgY2FzZSAncHJvdGVjdGVkJzpcbiAgICAgICAgY2FzZSAncHVibGljJzpcbiAgICAgICAgY2FzZSAnc3RhdGljJzpcbiAgICAgICAgY2FzZSAnbGV0JzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNLZXl3b3JkRVM1KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgLy8geWllbGQgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIGFzIGtleXdvcmQgdW5kZXIgbm9uLXN0cmljdCBtb2RlLlxuICAgICAgICBpZiAoIXN0cmljdCAmJiBpZCA9PT0gJ3lpZWxkJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0tleXdvcmRFUzYoaWQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNLZXl3b3JkRVM2KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgaWYgKHN0cmljdCAmJiBpc1N0cmljdE1vZGVSZXNlcnZlZFdvcmRFUzYoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoaWQubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdpZicpIHx8IChpZCA9PT0gJ2luJykgfHwgKGlkID09PSAnZG8nKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3ZhcicpIHx8IChpZCA9PT0gJ2ZvcicpIHx8IChpZCA9PT0gJ25ldycpIHx8IChpZCA9PT0gJ3RyeScpO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAndGhpcycpIHx8IChpZCA9PT0gJ2Vsc2UnKSB8fCAoaWQgPT09ICdjYXNlJykgfHxcbiAgICAgICAgICAgICAgICAoaWQgPT09ICd2b2lkJykgfHwgKGlkID09PSAnd2l0aCcpIHx8IChpZCA9PT0gJ2VudW0nKTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3doaWxlJykgfHwgKGlkID09PSAnYnJlYWsnKSB8fCAoaWQgPT09ICdjYXRjaCcpIHx8XG4gICAgICAgICAgICAgICAgKGlkID09PSAndGhyb3cnKSB8fCAoaWQgPT09ICdjb25zdCcpIHx8IChpZCA9PT0gJ3lpZWxkJykgfHxcbiAgICAgICAgICAgICAgICAoaWQgPT09ICdjbGFzcycpIHx8IChpZCA9PT0gJ3N1cGVyJyk7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdyZXR1cm4nKSB8fCAoaWQgPT09ICd0eXBlb2YnKSB8fCAoaWQgPT09ICdkZWxldGUnKSB8fFxuICAgICAgICAgICAgICAgIChpZCA9PT0gJ3N3aXRjaCcpIHx8IChpZCA9PT0gJ2V4cG9ydCcpIHx8IChpZCA9PT0gJ2ltcG9ydCcpO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAnZGVmYXVsdCcpIHx8IChpZCA9PT0gJ2ZpbmFsbHknKSB8fCAoaWQgPT09ICdleHRlbmRzJyk7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdmdW5jdGlvbicpIHx8IChpZCA9PT0gJ2NvbnRpbnVlJykgfHwgKGlkID09PSAnZGVidWdnZXInKTtcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdpbnN0YW5jZW9mJyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Jlc2VydmVkV29yZEVTNShpZCwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBpZCA9PT0gJ251bGwnIHx8IGlkID09PSAndHJ1ZScgfHwgaWQgPT09ICdmYWxzZScgfHwgaXNLZXl3b3JkRVM1KGlkLCBzdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUmVzZXJ2ZWRXb3JkRVM2KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGlkID09PSAnbnVsbCcgfHwgaWQgPT09ICd0cnVlJyB8fCBpZCA9PT0gJ2ZhbHNlJyB8fCBpc0tleXdvcmRFUzYoaWQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNSZXN0cmljdGVkV29yZChpZCkge1xuICAgICAgICByZXR1cm4gaWQgPT09ICdldmFsJyB8fCBpZCA9PT0gJ2FyZ3VtZW50cyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyTmFtZUVTNShpZCkge1xuICAgICAgICB2YXIgaSwgaXosIGNoO1xuXG4gICAgICAgIGlmIChpZC5sZW5ndGggPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgY2ggPSBpZC5jaGFyQ29kZUF0KDApO1xuICAgICAgICBpZiAoIWNvZGUuaXNJZGVudGlmaWVyU3RhcnRFUzUoY2gpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAxLCBpeiA9IGlkLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIGNoID0gaWQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmICghY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1KGNoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWNvZGVVdGYxNihsZWFkLCB0cmFpbCkge1xuICAgICAgICByZXR1cm4gKGxlYWQgLSAweEQ4MDApICogMHg0MDAgKyAodHJhaWwgLSAweERDMDApICsgMHgxMDAwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0lkZW50aWZpZXJOYW1lRVM2KGlkKSB7XG4gICAgICAgIHZhciBpLCBpeiwgY2gsIGxvd0NoLCBjaGVjaztcblxuICAgICAgICBpZiAoaWQubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgIGNoZWNrID0gY29kZS5pc0lkZW50aWZpZXJTdGFydEVTNjtcbiAgICAgICAgZm9yIChpID0gMCwgaXogPSBpZC5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICBjaCA9IGlkLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoMHhEODAwIDw9IGNoICYmIGNoIDw9IDB4REJGRikge1xuICAgICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgICAgICBpZiAoaSA+PSBpeikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgICAgICBsb3dDaCA9IGlkLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKCEoMHhEQzAwIDw9IGxvd0NoICYmIGxvd0NoIDw9IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaCA9IGRlY29kZVV0ZjE2KGNoLCBsb3dDaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNoZWNrKGNoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoZWNrID0gY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM2O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllckVTNShpZCwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBpc0lkZW50aWZpZXJOYW1lRVM1KGlkKSAmJiAhaXNSZXNlcnZlZFdvcmRFUzUoaWQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyRVM2KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGlzSWRlbnRpZmllck5hbWVFUzYoaWQpICYmICFpc1Jlc2VydmVkV29yZEVTNihpZCwgc3RyaWN0KTtcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAgICAgaXNLZXl3b3JkRVM1OiBpc0tleXdvcmRFUzUsXG4gICAgICAgIGlzS2V5d29yZEVTNjogaXNLZXl3b3JkRVM2LFxuICAgICAgICBpc1Jlc2VydmVkV29yZEVTNTogaXNSZXNlcnZlZFdvcmRFUzUsXG4gICAgICAgIGlzUmVzZXJ2ZWRXb3JkRVM2OiBpc1Jlc2VydmVkV29yZEVTNixcbiAgICAgICAgaXNSZXN0cmljdGVkV29yZDogaXNSZXN0cmljdGVkV29yZCxcbiAgICAgICAgaXNJZGVudGlmaWVyTmFtZUVTNTogaXNJZGVudGlmaWVyTmFtZUVTNSxcbiAgICAgICAgaXNJZGVudGlmaWVyTmFtZUVTNjogaXNJZGVudGlmaWVyTmFtZUVTNixcbiAgICAgICAgaXNJZGVudGlmaWVyRVM1OiBpc0lkZW50aWZpZXJFUzUsXG4gICAgICAgIGlzSWRlbnRpZmllckVTNjogaXNJZGVudGlmaWVyRVM2XG4gICAgfTtcbn0oKSk7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiLypcbiAgQ29weXJpZ2h0IChDKSAyMDEzIFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgZXhwb3J0cy5hc3QgPSByZXF1aXJlKCcuL2FzdCcpO1xuICAgIGV4cG9ydHMuY29kZSA9IHJlcXVpcmUoJy4vY29kZScpO1xuICAgIGV4cG9ydHMua2V5d29yZCA9IHJlcXVpcmUoJy4va2V5d29yZCcpO1xufSgpKTtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG4iLCJjb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2V4dHJhY3QtemlwJylcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBub2RlL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnNcbmNvbnN0IHsgY3JlYXRlV3JpdGVTdHJlYW0sIHByb21pc2VzOiBmcyB9ID0gcmVxdWlyZSgnZnMnKVxuY29uc3QgZ2V0U3RyZWFtID0gcmVxdWlyZSgnZ2V0LXN0cmVhbScpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCB7IHByb21pc2lmeSB9ID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgeWF1emwgPSByZXF1aXJlKCd5YXV6bCcpXG5cbmNvbnN0IG9wZW5aaXAgPSBwcm9taXNpZnkoeWF1emwub3BlbilcbmNvbnN0IHBpcGVsaW5lID0gcHJvbWlzaWZ5KHN0cmVhbS5waXBlbGluZSlcblxuY2xhc3MgRXh0cmFjdG9yIHtcbiAgY29uc3RydWN0b3IgKHppcFBhdGgsIG9wdHMpIHtcbiAgICB0aGlzLnppcFBhdGggPSB6aXBQYXRoXG4gICAgdGhpcy5vcHRzID0gb3B0c1xuICB9XG5cbiAgYXN5bmMgZXh0cmFjdCAoKSB7XG4gICAgZGVidWcoJ29wZW5pbmcnLCB0aGlzLnppcFBhdGgsICd3aXRoIG9wdHMnLCB0aGlzLm9wdHMpXG5cbiAgICB0aGlzLnppcGZpbGUgPSBhd2FpdCBvcGVuWmlwKHRoaXMuemlwUGF0aCwgeyBsYXp5RW50cmllczogdHJ1ZSB9KVxuICAgIHRoaXMuY2FuY2VsZWQgPSBmYWxzZVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuemlwZmlsZS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZVxuICAgICAgICByZWplY3QoZXJyKVxuICAgICAgfSlcbiAgICAgIHRoaXMuemlwZmlsZS5yZWFkRW50cnkoKVxuXG4gICAgICB0aGlzLnppcGZpbGUub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2FuY2VsZWQpIHtcbiAgICAgICAgICBkZWJ1ZygnemlwIGV4dHJhY3Rpb24gY29tcGxldGUnKVxuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICB0aGlzLnppcGZpbGUub24oJ2VudHJ5JywgYXN5bmMgZW50cnkgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsZWQpIHtcbiAgICAgICAgICBkZWJ1Zygnc2tpcHBpbmcgZW50cnknLCBlbnRyeS5maWxlTmFtZSwgeyBjYW5jZWxsZWQ6IHRoaXMuY2FuY2VsZWQgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGRlYnVnKCd6aXBmaWxlIGVudHJ5JywgZW50cnkuZmlsZU5hbWUpXG5cbiAgICAgICAgaWYgKGVudHJ5LmZpbGVOYW1lLnN0YXJ0c1dpdGgoJ19fTUFDT1NYLycpKSB7XG4gICAgICAgICAgdGhpcy56aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXN0RGlyID0gcGF0aC5kaXJuYW1lKHBhdGguam9pbih0aGlzLm9wdHMuZGlyLCBlbnRyeS5maWxlTmFtZSkpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihkZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgICAgICAgY29uc3QgY2Fub25pY2FsRGVzdERpciA9IGF3YWl0IGZzLnJlYWxwYXRoKGRlc3REaXIpXG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVEZXN0RGlyID0gcGF0aC5yZWxhdGl2ZSh0aGlzLm9wdHMuZGlyLCBjYW5vbmljYWxEZXN0RGlyKVxuXG4gICAgICAgICAgaWYgKHJlbGF0aXZlRGVzdERpci5zcGxpdChwYXRoLnNlcCkuaW5jbHVkZXMoJy4uJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3V0IG9mIGJvdW5kIHBhdGggXCIke2Nhbm9uaWNhbERlc3REaXJ9XCIgZm91bmQgd2hpbGUgcHJvY2Vzc2luZyBmaWxlICR7ZW50cnkuZmlsZU5hbWV9YClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLmV4dHJhY3RFbnRyeShlbnRyeSlcbiAgICAgICAgICBkZWJ1ZygnZmluaXNoZWQgcHJvY2Vzc2luZycsIGVudHJ5LmZpbGVOYW1lKVxuICAgICAgICAgIHRoaXMuemlwZmlsZS5yZWFkRW50cnkoKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuemlwZmlsZS5jbG9zZSgpXG4gICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgZXh0cmFjdEVudHJ5IChlbnRyeSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh0aGlzLmNhbmNlbGVkKSB7XG4gICAgICBkZWJ1Zygnc2tpcHBpbmcgZW50cnkgZXh0cmFjdGlvbicsIGVudHJ5LmZpbGVOYW1lLCB7IGNhbmNlbGxlZDogdGhpcy5jYW5jZWxlZCB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0cy5vbkVudHJ5KSB7XG4gICAgICB0aGlzLm9wdHMub25FbnRyeShlbnRyeSwgdGhpcy56aXBmaWxlKVxuICAgIH1cblxuICAgIGNvbnN0IGRlc3QgPSBwYXRoLmpvaW4odGhpcy5vcHRzLmRpciwgZW50cnkuZmlsZU5hbWUpXG5cbiAgICAvLyBjb252ZXJ0IGV4dGVybmFsIGZpbGUgYXR0ciBpbnQgaW50byBhIGZzIHN0YXQgbW9kZSBpbnRcbiAgICBjb25zdCBtb2RlID0gKGVudHJ5LmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPj4gMTYpICYgMHhGRkZGXG4gICAgLy8gY2hlY2sgaWYgaXQncyBhIHN5bWxpbmsgb3IgZGlyICh1c2luZyBzdGF0IG1vZGUgY29uc3RhbnRzKVxuICAgIGNvbnN0IElGTVQgPSA2MTQ0MFxuICAgIGNvbnN0IElGRElSID0gMTYzODRcbiAgICBjb25zdCBJRkxOSyA9IDQwOTYwXG4gICAgY29uc3Qgc3ltbGluayA9IChtb2RlICYgSUZNVCkgPT09IElGTE5LXG4gICAgbGV0IGlzRGlyID0gKG1vZGUgJiBJRk1UKSA9PT0gSUZESVJcblxuICAgIC8vIEZhaWxzYWZlLCBib3Jyb3dlZCBmcm9tIGpzWmlwXG4gICAgaWYgKCFpc0RpciAmJiBlbnRyeS5maWxlTmFtZS5lbmRzV2l0aCgnLycpKSB7XG4gICAgICBpc0RpciA9IHRydWVcbiAgICB9XG5cbiAgICAvLyBjaGVjayBmb3Igd2luZG93cyB3ZWlyZCB3YXkgb2Ygc3BlY2lmeWluZyBhIGRpcmVjdG9yeVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXhvZ2Rlbi9leHRyYWN0LXppcC9pc3N1ZXMvMTMjaXNzdWVjb21tZW50LTE1NDQ5NDU2NlxuICAgIGNvbnN0IG1hZGVCeSA9IGVudHJ5LnZlcnNpb25NYWRlQnkgPj4gOFxuICAgIGlmICghaXNEaXIpIGlzRGlyID0gKG1hZGVCeSA9PT0gMCAmJiBlbnRyeS5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID09PSAxNilcblxuICAgIGRlYnVnKCdleHRyYWN0aW5nIGVudHJ5JywgeyBmaWxlbmFtZTogZW50cnkuZmlsZU5hbWUsIGlzRGlyOiBpc0RpciwgaXNTeW1saW5rOiBzeW1saW5rIH0pXG5cbiAgICBjb25zdCBwcm9jTW9kZSA9IHRoaXMuZ2V0RXh0cmFjdGVkTW9kZShtb2RlLCBpc0RpcikgJiAwbzc3N1xuXG4gICAgLy8gYWx3YXlzIGVuc3VyZSBmb2xkZXJzIGFyZSBjcmVhdGVkXG4gICAgY29uc3QgZGVzdERpciA9IGlzRGlyID8gZGVzdCA6IHBhdGguZGlybmFtZShkZXN0KVxuXG4gICAgY29uc3QgbWtkaXJPcHRpb25zID0geyByZWN1cnNpdmU6IHRydWUgfVxuICAgIGlmIChpc0Rpcikge1xuICAgICAgbWtkaXJPcHRpb25zLm1vZGUgPSBwcm9jTW9kZVxuICAgIH1cbiAgICBkZWJ1ZygnbWtkaXInLCB7IGRpcjogZGVzdERpciwgLi4ubWtkaXJPcHRpb25zIH0pXG4gICAgYXdhaXQgZnMubWtkaXIoZGVzdERpciwgbWtkaXJPcHRpb25zKVxuICAgIGlmIChpc0RpcikgcmV0dXJuXG5cbiAgICBkZWJ1Zygnb3BlbmluZyByZWFkIHN0cmVhbScsIGRlc3QpXG4gICAgY29uc3QgcmVhZFN0cmVhbSA9IGF3YWl0IHByb21pc2lmeSh0aGlzLnppcGZpbGUub3BlblJlYWRTdHJlYW0uYmluZCh0aGlzLnppcGZpbGUpKShlbnRyeSlcblxuICAgIGlmIChzeW1saW5rKSB7XG4gICAgICBjb25zdCBsaW5rID0gYXdhaXQgZ2V0U3RyZWFtKHJlYWRTdHJlYW0pXG4gICAgICBkZWJ1ZygnY3JlYXRpbmcgc3ltbGluaycsIGxpbmssIGRlc3QpXG4gICAgICBhd2FpdCBmcy5zeW1saW5rKGxpbmssIGRlc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHBpcGVsaW5lKHJlYWRTdHJlYW0sIGNyZWF0ZVdyaXRlU3RyZWFtKGRlc3QsIHsgbW9kZTogcHJvY01vZGUgfSkpXG4gICAgfVxuICB9XG5cbiAgZ2V0RXh0cmFjdGVkTW9kZSAoZW50cnlNb2RlLCBpc0Rpcikge1xuICAgIGxldCBtb2RlID0gZW50cnlNb2RlXG4gICAgLy8gU2V0IGRlZmF1bHRzLCBpZiBuZWNlc3NhcnlcbiAgICBpZiAobW9kZSA9PT0gMCkge1xuICAgICAgaWYgKGlzRGlyKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZGVmYXVsdERpck1vZGUpIHtcbiAgICAgICAgICBtb2RlID0gcGFyc2VJbnQodGhpcy5vcHRzLmRlZmF1bHREaXJNb2RlLCAxMClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbW9kZSkge1xuICAgICAgICAgIG1vZGUgPSAwbzc1NVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5vcHRzLmRlZmF1bHRGaWxlTW9kZSkge1xuICAgICAgICAgIG1vZGUgPSBwYXJzZUludCh0aGlzLm9wdHMuZGVmYXVsdEZpbGVNb2RlLCAxMClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbW9kZSkge1xuICAgICAgICAgIG1vZGUgPSAwbzY0NFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIGZ1bmN0aW9uICh6aXBQYXRoLCBvcHRzKSB7XG4gIGRlYnVnKCdjcmVhdGluZyB0YXJnZXQgZGlyZWN0b3J5Jywgb3B0cy5kaXIpXG5cbiAgaWYgKCFwYXRoLmlzQWJzb2x1dGUob3B0cy5kaXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgZGlyZWN0b3J5IGlzIGV4cGVjdGVkIHRvIGJlIGFic29sdXRlJylcbiAgfVxuXG4gIGF3YWl0IGZzLm1rZGlyKG9wdHMuZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICBvcHRzLmRpciA9IGF3YWl0IGZzLnJlYWxwYXRoKG9wdHMuZGlyKVxuICByZXR1cm4gbmV3IEV4dHJhY3Rvcih6aXBQYXRoLCBvcHRzKS5leHRyYWN0KClcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRml4ZWRGSUZPIHtcbiAgY29uc3RydWN0b3IgKGh3bSkge1xuICAgIGlmICghKGh3bSA+IDApIHx8ICgoaHdtIC0gMSkgJiBod20pICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ01heCBzaXplIGZvciBhIEZpeGVkRklGTyBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28nKVxuICAgIHRoaXMuYnVmZmVyID0gbmV3IEFycmF5KGh3bSlcbiAgICB0aGlzLm1hc2sgPSBod20gLSAxXG4gICAgdGhpcy50b3AgPSAwXG4gICAgdGhpcy5idG0gPSAwXG4gICAgdGhpcy5uZXh0ID0gbnVsbFxuICB9XG5cbiAgY2xlYXIgKCkge1xuICAgIHRoaXMudG9wID0gdGhpcy5idG0gPSAwXG4gICAgdGhpcy5uZXh0ID0gbnVsbFxuICAgIHRoaXMuYnVmZmVyLmZpbGwodW5kZWZpbmVkKVxuICB9XG5cbiAgcHVzaCAoZGF0YSkge1xuICAgIGlmICh0aGlzLmJ1ZmZlclt0aGlzLnRvcF0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlXG4gICAgdGhpcy5idWZmZXJbdGhpcy50b3BdID0gZGF0YVxuICAgIHRoaXMudG9wID0gKHRoaXMudG9wICsgMSkgJiB0aGlzLm1hc2tcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgc2hpZnQgKCkge1xuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmJ1ZmZlclt0aGlzLmJ0bV1cbiAgICBpZiAobGFzdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgdGhpcy5idWZmZXJbdGhpcy5idG1dID0gdW5kZWZpbmVkXG4gICAgdGhpcy5idG0gPSAodGhpcy5idG0gKyAxKSAmIHRoaXMubWFza1xuICAgIHJldHVybiBsYXN0XG4gIH1cblxuICBwZWVrICgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5idG1dXG4gIH1cblxuICBpc0VtcHR5ICgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5idG1dID09PSB1bmRlZmluZWRcbiAgfVxufVxuIiwiY29uc3QgRml4ZWRGSUZPID0gcmVxdWlyZSgnLi9maXhlZC1zaXplJylcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBGYXN0RklGTyB7XG4gIGNvbnN0cnVjdG9yIChod20pIHtcbiAgICB0aGlzLmh3bSA9IGh3bSB8fCAxNlxuICAgIHRoaXMuaGVhZCA9IG5ldyBGaXhlZEZJRk8odGhpcy5od20pXG4gICAgdGhpcy50YWlsID0gdGhpcy5oZWFkXG4gICAgdGhpcy5sZW5ndGggPSAwXG4gIH1cblxuICBjbGVhciAoKSB7XG4gICAgdGhpcy5oZWFkID0gdGhpcy50YWlsXG4gICAgdGhpcy5oZWFkLmNsZWFyKClcbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgfVxuXG4gIHB1c2ggKHZhbCkge1xuICAgIHRoaXMubGVuZ3RoKytcbiAgICBpZiAoIXRoaXMuaGVhZC5wdXNoKHZhbCkpIHtcbiAgICAgIGNvbnN0IHByZXYgPSB0aGlzLmhlYWRcbiAgICAgIHRoaXMuaGVhZCA9IHByZXYubmV4dCA9IG5ldyBGaXhlZEZJRk8oMiAqIHRoaXMuaGVhZC5idWZmZXIubGVuZ3RoKVxuICAgICAgdGhpcy5oZWFkLnB1c2godmFsKVxuICAgIH1cbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggIT09IDApIHRoaXMubGVuZ3RoLS1cbiAgICBjb25zdCB2YWwgPSB0aGlzLnRhaWwuc2hpZnQoKVxuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnRhaWwubmV4dCkge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMudGFpbC5uZXh0XG4gICAgICB0aGlzLnRhaWwubmV4dCA9IG51bGxcbiAgICAgIHRoaXMudGFpbCA9IG5leHRcbiAgICAgIHJldHVybiB0aGlzLnRhaWwuc2hpZnQoKVxuICAgIH1cblxuICAgIHJldHVybiB2YWxcbiAgfVxuXG4gIHBlZWsgKCkge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMudGFpbC5wZWVrKClcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgJiYgdGhpcy50YWlsLm5leHQpIHJldHVybiB0aGlzLnRhaWwubmV4dC5wZWVrKClcbiAgICByZXR1cm4gdmFsXG4gIH1cblxuICBpc0VtcHR5ICgpIHtcbiAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDBcbiAgfVxufVxuIiwidmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xudmFyIFJlYWRhYmxlID0gc3RyZWFtLlJlYWRhYmxlO1xudmFyIFdyaXRhYmxlID0gc3RyZWFtLldyaXRhYmxlO1xudmFyIFBhc3NUaHJvdWdoID0gc3RyZWFtLlBhc3NUaHJvdWdoO1xudmFyIFBlbmQgPSByZXF1aXJlKCdwZW5kJyk7XG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG5leHBvcnRzLmNyZWF0ZUZyb21CdWZmZXIgPSBjcmVhdGVGcm9tQnVmZmVyO1xuZXhwb3J0cy5jcmVhdGVGcm9tRmQgPSBjcmVhdGVGcm9tRmQ7XG5leHBvcnRzLkJ1ZmZlclNsaWNlciA9IEJ1ZmZlclNsaWNlcjtcbmV4cG9ydHMuRmRTbGljZXIgPSBGZFNsaWNlcjtcblxudXRpbC5pbmhlcml0cyhGZFNsaWNlciwgRXZlbnRFbWl0dGVyKTtcbmZ1bmN0aW9uIEZkU2xpY2VyKGZkLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcblxuICB0aGlzLmZkID0gZmQ7XG4gIHRoaXMucGVuZCA9IG5ldyBQZW5kKCk7XG4gIHRoaXMucGVuZC5tYXggPSAxO1xuICB0aGlzLnJlZkNvdW50ID0gMDtcbiAgdGhpcy5hdXRvQ2xvc2UgPSAhIW9wdGlvbnMuYXV0b0Nsb3NlO1xufVxuXG5GZFNsaWNlci5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYucGVuZC5nbyhmdW5jdGlvbihjYikge1xuICAgIGZzLnJlYWQoc2VsZi5mZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGZ1bmN0aW9uKGVyciwgYnl0ZXNSZWFkLCBidWZmZXIpIHtcbiAgICAgIGNiKCk7XG4gICAgICBjYWxsYmFjayhlcnIsIGJ5dGVzUmVhZCwgYnVmZmVyKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5GZFNsaWNlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLnBlbmQuZ28oZnVuY3Rpb24oY2IpIHtcbiAgICBmcy53cml0ZShzZWxmLmZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgZnVuY3Rpb24oZXJyLCB3cml0dGVuLCBidWZmZXIpIHtcbiAgICAgIGNiKCk7XG4gICAgICBjYWxsYmFjayhlcnIsIHdyaXR0ZW4sIGJ1ZmZlcik7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuRmRTbGljZXIucHJvdG90eXBlLmNyZWF0ZVJlYWRTdHJlYW0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUmVhZFN0cmVhbSh0aGlzLCBvcHRpb25zKTtcbn07XG5cbkZkU2xpY2VyLnByb3RvdHlwZS5jcmVhdGVXcml0ZVN0cmVhbSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBXcml0ZVN0cmVhbSh0aGlzLCBvcHRpb25zKTtcbn07XG5cbkZkU2xpY2VyLnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZWZDb3VudCArPSAxO1xufTtcblxuRmRTbGljZXIucHJvdG90eXBlLnVucmVmID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5yZWZDb3VudCAtPSAxO1xuXG4gIGlmIChzZWxmLnJlZkNvdW50ID4gMCkgcmV0dXJuO1xuICBpZiAoc2VsZi5yZWZDb3VudCA8IDApIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgdW5yZWZcIik7XG5cbiAgaWYgKHNlbGYuYXV0b0Nsb3NlKSB7XG4gICAgZnMuY2xvc2Uoc2VsZi5mZCwgb25DbG9zZURvbmUpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25DbG9zZURvbmUoZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuZW1pdCgnY2xvc2UnKTtcbiAgICB9XG4gIH1cbn07XG5cbnV0aWwuaW5oZXJpdHMoUmVhZFN0cmVhbSwgUmVhZGFibGUpO1xuZnVuY3Rpb24gUmVhZFN0cmVhbShjb250ZXh0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuY29udGV4dC5yZWYoKTtcblxuICB0aGlzLnN0YXJ0ID0gb3B0aW9ucy5zdGFydCB8fCAwO1xuICB0aGlzLmVuZE9mZnNldCA9IG9wdGlvbnMuZW5kO1xuICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG59XG5cblJlYWRTdHJlYW0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24obikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gIHZhciB0b1JlYWQgPSBNYXRoLm1pbihzZWxmLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmssIG4pO1xuICBpZiAoc2VsZi5lbmRPZmZzZXQgIT0gbnVsbCkge1xuICAgIHRvUmVhZCA9IE1hdGgubWluKHRvUmVhZCwgc2VsZi5lbmRPZmZzZXQgLSBzZWxmLnBvcyk7XG4gIH1cbiAgaWYgKHRvUmVhZCA8PSAwKSB7XG4gICAgc2VsZi5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHNlbGYucHVzaChudWxsKTtcbiAgICBzZWxmLmNvbnRleHQudW5yZWYoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgc2VsZi5jb250ZXh0LnBlbmQuZ28oZnVuY3Rpb24oY2IpIHtcbiAgICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVybiBjYigpO1xuICAgIHZhciBidWZmZXIgPSBuZXcgQnVmZmVyKHRvUmVhZCk7XG4gICAgZnMucmVhZChzZWxmLmNvbnRleHQuZmQsIGJ1ZmZlciwgMCwgdG9SZWFkLCBzZWxmLnBvcywgZnVuY3Rpb24oZXJyLCBieXRlc1JlYWQpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgc2VsZi5kZXN0cm95KGVycik7XG4gICAgICB9IGVsc2UgaWYgKGJ5dGVzUmVhZCA9PT0gMCkge1xuICAgICAgICBzZWxmLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgIHNlbGYucHVzaChudWxsKTtcbiAgICAgICAgc2VsZi5jb250ZXh0LnVucmVmKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLnBvcyArPSBieXRlc1JlYWQ7XG4gICAgICAgIHNlbGYucHVzaChidWZmZXIuc2xpY2UoMCwgYnl0ZXNSZWFkKSk7XG4gICAgICB9XG4gICAgICBjYigpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cblJlYWRTdHJlYW0ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbihlcnIpIHtcbiAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gIGVyciA9IGVyciB8fCBuZXcgRXJyb3IoXCJzdHJlYW0gZGVzdHJveWVkXCIpO1xuICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICB0aGlzLmNvbnRleHQudW5yZWYoKTtcbn07XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGVTdHJlYW0sIFdyaXRhYmxlKTtcbmZ1bmN0aW9uIFdyaXRlU3RyZWFtKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5jb250ZXh0LnJlZigpO1xuXG4gIHRoaXMuc3RhcnQgPSBvcHRpb25zLnN0YXJ0IHx8IDA7XG4gIHRoaXMuZW5kT2Zmc2V0ID0gKG9wdGlvbnMuZW5kID09IG51bGwpID8gSW5maW5pdHkgOiArb3B0aW9ucy5lbmQ7XG4gIHRoaXMuYnl0ZXNXcml0dGVuID0gMDtcbiAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIHRoaXMub24oJ2ZpbmlzaCcsIHRoaXMuZGVzdHJveS5iaW5kKHRoaXMpKTtcbn1cblxuV3JpdGVTdHJlYW0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlciwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm47XG5cbiAgaWYgKHNlbGYucG9zICsgYnVmZmVyLmxlbmd0aCA+IHNlbGYuZW5kT2Zmc2V0KSB7XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIm1heGltdW0gZmlsZSBsZW5ndGggZXhjZWVkZWRcIik7XG4gICAgZXJyLmNvZGUgPSAnRVRPT0JJRyc7XG4gICAgc2VsZi5kZXN0cm95KCk7XG4gICAgY2FsbGJhY2soZXJyKTtcbiAgICByZXR1cm47XG4gIH1cbiAgc2VsZi5jb250ZXh0LnBlbmQuZ28oZnVuY3Rpb24oY2IpIHtcbiAgICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVybiBjYigpO1xuICAgIGZzLndyaXRlKHNlbGYuY29udGV4dC5mZCwgYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBzZWxmLnBvcywgZnVuY3Rpb24oZXJyLCBieXRlcykge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBzZWxmLmRlc3Ryb3koKTtcbiAgICAgICAgY2IoKTtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuYnl0ZXNXcml0dGVuICs9IGJ5dGVzO1xuICAgICAgICBzZWxmLnBvcyArPSBieXRlcztcbiAgICAgICAgc2VsZi5lbWl0KCdwcm9ncmVzcycpO1xuICAgICAgICBjYigpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbldyaXRlU3RyZWFtLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gIHRoaXMuY29udGV4dC51bnJlZigpO1xufTtcblxudXRpbC5pbmhlcml0cyhCdWZmZXJTbGljZXIsIEV2ZW50RW1pdHRlcik7XG5mdW5jdGlvbiBCdWZmZXJTbGljZXIoYnVmZmVyLCBvcHRpb25zKSB7XG4gIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB0aGlzLnJlZkNvdW50ID0gMDtcbiAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gIHRoaXMubWF4Q2h1bmtTaXplID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbkJ1ZmZlclNsaWNlci5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaykge1xuICB2YXIgZW5kID0gcG9zaXRpb24gKyBsZW5ndGg7XG4gIHZhciBkZWx0YSA9IGVuZCAtIHRoaXMuYnVmZmVyLmxlbmd0aDtcbiAgdmFyIHdyaXR0ZW4gPSAoZGVsdGEgPiAwKSA/IGRlbHRhIDogbGVuZ3RoO1xuICB0aGlzLmJ1ZmZlci5jb3B5KGJ1ZmZlciwgb2Zmc2V0LCBwb3NpdGlvbiwgZW5kKTtcbiAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgIGNhbGxiYWNrKG51bGwsIHdyaXR0ZW4pO1xuICB9KTtcbn07XG5cbkJ1ZmZlclNsaWNlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spIHtcbiAgYnVmZmVyLmNvcHkodGhpcy5idWZmZXIsIHBvc2l0aW9uLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7XG4gIHNldEltbWVkaWF0ZShmdW5jdGlvbigpIHtcbiAgICBjYWxsYmFjayhudWxsLCBsZW5ndGgsIGJ1ZmZlcik7XG4gIH0pO1xufTtcblxuQnVmZmVyU2xpY2VyLnByb3RvdHlwZS5jcmVhdGVSZWFkU3RyZWFtID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJlYWRTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG4gIHJlYWRTdHJlYW0uZGVzdHJveWVkID0gZmFsc2U7XG4gIHJlYWRTdHJlYW0uc3RhcnQgPSBvcHRpb25zLnN0YXJ0IHx8IDA7XG4gIHJlYWRTdHJlYW0uZW5kT2Zmc2V0ID0gb3B0aW9ucy5lbmQ7XG4gIC8vIGJ5IHRoZSB0aW1lIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgd2UnbGwgYmUgZG9uZS5cbiAgcmVhZFN0cmVhbS5wb3MgPSByZWFkU3RyZWFtLmVuZE9mZnNldCB8fCB0aGlzLmJ1ZmZlci5sZW5ndGg7XG5cbiAgLy8gcmVzcGVjdCB0aGUgbWF4Q2h1bmtTaXplIG9wdGlvbiB0byBzbGljZSB1cCB0aGUgY2h1bmsgaW50byBzbWFsbGVyIHBpZWNlcy5cbiAgdmFyIGVudGlyZVNsaWNlID0gdGhpcy5idWZmZXIuc2xpY2UocmVhZFN0cmVhbS5zdGFydCwgcmVhZFN0cmVhbS5wb3MpO1xuICB2YXIgb2Zmc2V0ID0gMDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgbmV4dE9mZnNldCA9IG9mZnNldCArIHRoaXMubWF4Q2h1bmtTaXplO1xuICAgIGlmIChuZXh0T2Zmc2V0ID49IGVudGlyZVNsaWNlLmxlbmd0aCkge1xuICAgICAgLy8gbGFzdCBjaHVua1xuICAgICAgaWYgKG9mZnNldCA8IGVudGlyZVNsaWNlLmxlbmd0aCkge1xuICAgICAgICByZWFkU3RyZWFtLndyaXRlKGVudGlyZVNsaWNlLnNsaWNlKG9mZnNldCwgZW50aXJlU2xpY2UubGVuZ3RoKSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcmVhZFN0cmVhbS53cml0ZShlbnRpcmVTbGljZS5zbGljZShvZmZzZXQsIG5leHRPZmZzZXQpKTtcbiAgICBvZmZzZXQgPSBuZXh0T2Zmc2V0O1xuICB9XG5cbiAgcmVhZFN0cmVhbS5lbmQoKTtcbiAgcmVhZFN0cmVhbS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgcmVhZFN0cmVhbS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9O1xuICByZXR1cm4gcmVhZFN0cmVhbTtcbn07XG5cbkJ1ZmZlclNsaWNlci5wcm90b3R5cGUuY3JlYXRlV3JpdGVTdHJlYW0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHZhciBidWZmZXJTbGljZXIgPSB0aGlzO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHdyaXRlU3RyZWFtID0gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuICB3cml0ZVN0cmVhbS5zdGFydCA9IG9wdGlvbnMuc3RhcnQgfHwgMDtcbiAgd3JpdGVTdHJlYW0uZW5kT2Zmc2V0ID0gKG9wdGlvbnMuZW5kID09IG51bGwpID8gdGhpcy5idWZmZXIubGVuZ3RoIDogK29wdGlvbnMuZW5kO1xuICB3cml0ZVN0cmVhbS5ieXRlc1dyaXR0ZW4gPSAwO1xuICB3cml0ZVN0cmVhbS5wb3MgPSB3cml0ZVN0cmVhbS5zdGFydDtcbiAgd3JpdGVTdHJlYW0uZGVzdHJveWVkID0gZmFsc2U7XG4gIHdyaXRlU3RyZWFtLl93cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlciwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHdyaXRlU3RyZWFtLmRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGVuZCA9IHdyaXRlU3RyZWFtLnBvcyArIGJ1ZmZlci5sZW5ndGg7XG4gICAgaWYgKGVuZCA+IHdyaXRlU3RyZWFtLmVuZE9mZnNldCkge1xuICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIm1heGltdW0gZmlsZSBsZW5ndGggZXhjZWVkZWRcIik7XG4gICAgICBlcnIuY29kZSA9ICdFVE9PQklHJztcbiAgICAgIHdyaXRlU3RyZWFtLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBidWZmZXIuY29weShidWZmZXJTbGljZXIuYnVmZmVyLCB3cml0ZVN0cmVhbS5wb3MsIDAsIGJ1ZmZlci5sZW5ndGgpO1xuXG4gICAgd3JpdGVTdHJlYW0uYnl0ZXNXcml0dGVuICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgd3JpdGVTdHJlYW0ucG9zID0gZW5kO1xuICAgIHdyaXRlU3RyZWFtLmVtaXQoJ3Byb2dyZXNzJyk7XG4gICAgY2FsbGJhY2soKTtcbiAgfTtcbiAgd3JpdGVTdHJlYW0uZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIHdyaXRlU3RyZWFtLmRlc3Ryb3llZCA9IHRydWU7XG4gIH07XG4gIHJldHVybiB3cml0ZVN0cmVhbTtcbn07XG5cbkJ1ZmZlclNsaWNlci5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVmQ291bnQgKz0gMTtcbn07XG5cbkJ1ZmZlclNsaWNlci5wcm90b3R5cGUudW5yZWYgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZWZDb3VudCAtPSAxO1xuXG4gIGlmICh0aGlzLnJlZkNvdW50IDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgdW5yZWZcIik7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyb21CdWZmZXIoYnVmZmVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgQnVmZmVyU2xpY2VyKGJ1ZmZlciwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyb21GZChmZCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEZkU2xpY2VyKGZkLCBvcHRpb25zKTtcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2dyYWNlZnVsLWZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IG1rZGlyc1N5bmMgPSByZXF1aXJlKCcuLi9ta2RpcnMnKS5ta2RpcnNTeW5jXG5jb25zdCB1dGltZXNNaWxsaXNTeW5jID0gcmVxdWlyZSgnLi4vdXRpbC91dGltZXMnKS51dGltZXNNaWxsaXNTeW5jXG5jb25zdCBzdGF0ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuZnVuY3Rpb24gY29weVN5bmMgKHNyYywgZGVzdCwgb3B0cykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRzID0geyBmaWx0ZXI6IG9wdHMgfVxuICB9XG5cbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgb3B0cy5jbG9iYmVyID0gJ2Nsb2JiZXInIGluIG9wdHMgPyAhIW9wdHMuY2xvYmJlciA6IHRydWUgLy8gZGVmYXVsdCB0byB0cnVlIGZvciBub3dcbiAgb3B0cy5vdmVyd3JpdGUgPSAnb3ZlcndyaXRlJyBpbiBvcHRzID8gISFvcHRzLm92ZXJ3cml0ZSA6IG9wdHMuY2xvYmJlciAvLyBvdmVyd3JpdGUgZmFsbHMgYmFjayB0byBjbG9iYmVyXG5cbiAgLy8gV2FybiBhYm91dCB1c2luZyBwcmVzZXJ2ZVRpbWVzdGFtcHMgb24gMzItYml0IG5vZGVcbiAgaWYgKG9wdHMucHJlc2VydmVUaW1lc3RhbXBzICYmIHByb2Nlc3MuYXJjaCA9PT0gJ2lhMzInKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhcbiAgICAgICdVc2luZyB0aGUgcHJlc2VydmVUaW1lc3RhbXBzIG9wdGlvbiBpbiAzMi1iaXQgbm9kZSBpcyBub3QgcmVjb21tZW5kZWQ7XFxuXFxuJyArXG4gICAgICAnXFx0c2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcHJpY2hhcmRzb24vbm9kZS1mcy1leHRyYS9pc3N1ZXMvMjY5JyxcbiAgICAgICdXYXJuaW5nJywgJ2ZzLWV4dHJhLVdBUk4wMDAyJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IHsgc3JjU3RhdCwgZGVzdFN0YXQgfSA9IHN0YXQuY2hlY2tQYXRoc1N5bmMoc3JjLCBkZXN0LCAnY29weScsIG9wdHMpXG4gIHN0YXQuY2hlY2tQYXJlbnRQYXRoc1N5bmMoc3JjLCBzcmNTdGF0LCBkZXN0LCAnY29weScpXG4gIGlmIChvcHRzLmZpbHRlciAmJiAhb3B0cy5maWx0ZXIoc3JjLCBkZXN0KSkgcmV0dXJuXG4gIGNvbnN0IGRlc3RQYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGVzdClcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGRlc3RQYXJlbnQpKSBta2RpcnNTeW5jKGRlc3RQYXJlbnQpXG4gIHJldHVybiBnZXRTdGF0cyhkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxufVxuXG5mdW5jdGlvbiBnZXRTdGF0cyAoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBjb25zdCBzdGF0U3luYyA9IG9wdHMuZGVyZWZlcmVuY2UgPyBmcy5zdGF0U3luYyA6IGZzLmxzdGF0U3luY1xuICBjb25zdCBzcmNTdGF0ID0gc3RhdFN5bmMoc3JjKVxuXG4gIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkpIHJldHVybiBvbkRpcihzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuICBlbHNlIGlmIChzcmNTdGF0LmlzRmlsZSgpIHx8XG4gICAgICAgICAgIHNyY1N0YXQuaXNDaGFyYWN0ZXJEZXZpY2UoKSB8fFxuICAgICAgICAgICBzcmNTdGF0LmlzQmxvY2tEZXZpY2UoKSkgcmV0dXJuIG9uRmlsZShzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuICBlbHNlIGlmIChzcmNTdGF0LmlzU3ltYm9saWNMaW5rKCkpIHJldHVybiBvbkxpbmsoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgZWxzZSBpZiAoc3JjU3RhdC5pc1NvY2tldCgpKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb3B5IGEgc29ja2V0IGZpbGU6ICR7c3JjfWApXG4gIGVsc2UgaWYgKHNyY1N0YXQuaXNGSUZPKCkpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgYSBGSUZPIHBpcGU6ICR7c3JjfWApXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWxlOiAke3NyY31gKVxufVxuXG5mdW5jdGlvbiBvbkZpbGUgKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKCFkZXN0U3RhdCkgcmV0dXJuIGNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgcmV0dXJuIG1heUNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbn1cblxuZnVuY3Rpb24gbWF5Q29weUZpbGUgKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBpZiAob3B0cy5vdmVyd3JpdGUpIHtcbiAgICBmcy51bmxpbmtTeW5jKGRlc3QpXG4gICAgcmV0dXJuIGNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgfSBlbHNlIGlmIChvcHRzLmVycm9yT25FeGlzdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7ZGVzdH0nIGFscmVhZHkgZXhpc3RzYClcbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5RmlsZSAoc3JjU3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGZzLmNvcHlGaWxlU3luYyhzcmMsIGRlc3QpXG4gIGlmIChvcHRzLnByZXNlcnZlVGltZXN0YW1wcykgaGFuZGxlVGltZXN0YW1wcyhzcmNTdGF0Lm1vZGUsIHNyYywgZGVzdClcbiAgcmV0dXJuIHNldERlc3RNb2RlKGRlc3QsIHNyY1N0YXQubW9kZSlcbn1cblxuZnVuY3Rpb24gaGFuZGxlVGltZXN0YW1wcyAoc3JjTW9kZSwgc3JjLCBkZXN0KSB7XG4gIC8vIE1ha2Ugc3VyZSB0aGUgZmlsZSBpcyB3cml0YWJsZSBiZWZvcmUgc2V0dGluZyB0aGUgdGltZXN0YW1wXG4gIC8vIG90aGVyd2lzZSBvcGVuIGZhaWxzIHdpdGggRVBFUk0gd2hlbiBpbnZva2VkIHdpdGggJ3IrJ1xuICAvLyAodGhyb3VnaCB1dGltZXMgY2FsbClcbiAgaWYgKGZpbGVJc05vdFdyaXRhYmxlKHNyY01vZGUpKSBtYWtlRmlsZVdyaXRhYmxlKGRlc3QsIHNyY01vZGUpXG4gIHJldHVybiBzZXREZXN0VGltZXN0YW1wcyhzcmMsIGRlc3QpXG59XG5cbmZ1bmN0aW9uIGZpbGVJc05vdFdyaXRhYmxlIChzcmNNb2RlKSB7XG4gIHJldHVybiAoc3JjTW9kZSAmIDBvMjAwKSA9PT0gMFxufVxuXG5mdW5jdGlvbiBtYWtlRmlsZVdyaXRhYmxlIChkZXN0LCBzcmNNb2RlKSB7XG4gIHJldHVybiBzZXREZXN0TW9kZShkZXN0LCBzcmNNb2RlIHwgMG8yMDApXG59XG5cbmZ1bmN0aW9uIHNldERlc3RNb2RlIChkZXN0LCBzcmNNb2RlKSB7XG4gIHJldHVybiBmcy5jaG1vZFN5bmMoZGVzdCwgc3JjTW9kZSlcbn1cblxuZnVuY3Rpb24gc2V0RGVzdFRpbWVzdGFtcHMgKHNyYywgZGVzdCkge1xuICAvLyBUaGUgaW5pdGlhbCBzcmNTdGF0LmF0aW1lIGNhbm5vdCBiZSB0cnVzdGVkXG4gIC8vIGJlY2F1c2UgaXQgaXMgbW9kaWZpZWQgYnkgdGhlIHJlYWQoMikgc3lzdGVtIGNhbGxcbiAgLy8gKFNlZSBodHRwczovL25vZGVqcy5vcmcvYXBpL2ZzLmh0bWwjZnNfc3RhdF90aW1lX3ZhbHVlcylcbiAgY29uc3QgdXBkYXRlZFNyY1N0YXQgPSBmcy5zdGF0U3luYyhzcmMpXG4gIHJldHVybiB1dGltZXNNaWxsaXNTeW5jKGRlc3QsIHVwZGF0ZWRTcmNTdGF0LmF0aW1lLCB1cGRhdGVkU3JjU3RhdC5tdGltZSlcbn1cblxuZnVuY3Rpb24gb25EaXIgKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKCFkZXN0U3RhdCkgcmV0dXJuIG1rRGlyQW5kQ29weShzcmNTdGF0Lm1vZGUsIHNyYywgZGVzdCwgb3B0cylcbiAgcmV0dXJuIGNvcHlEaXIoc3JjLCBkZXN0LCBvcHRzKVxufVxuXG5mdW5jdGlvbiBta0RpckFuZENvcHkgKHNyY01vZGUsIHNyYywgZGVzdCwgb3B0cykge1xuICBmcy5ta2RpclN5bmMoZGVzdClcbiAgY29weURpcihzcmMsIGRlc3QsIG9wdHMpXG4gIHJldHVybiBzZXREZXN0TW9kZShkZXN0LCBzcmNNb2RlKVxufVxuXG5mdW5jdGlvbiBjb3B5RGlyIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgZnMucmVhZGRpclN5bmMoc3JjKS5mb3JFYWNoKGl0ZW0gPT4gY29weURpckl0ZW0oaXRlbSwgc3JjLCBkZXN0LCBvcHRzKSlcbn1cblxuZnVuY3Rpb24gY29weURpckl0ZW0gKGl0ZW0sIHNyYywgZGVzdCwgb3B0cykge1xuICBjb25zdCBzcmNJdGVtID0gcGF0aC5qb2luKHNyYywgaXRlbSlcbiAgY29uc3QgZGVzdEl0ZW0gPSBwYXRoLmpvaW4oZGVzdCwgaXRlbSlcbiAgaWYgKG9wdHMuZmlsdGVyICYmICFvcHRzLmZpbHRlcihzcmNJdGVtLCBkZXN0SXRlbSkpIHJldHVyblxuICBjb25zdCB7IGRlc3RTdGF0IH0gPSBzdGF0LmNoZWNrUGF0aHNTeW5jKHNyY0l0ZW0sIGRlc3RJdGVtLCAnY29weScsIG9wdHMpXG4gIHJldHVybiBnZXRTdGF0cyhkZXN0U3RhdCwgc3JjSXRlbSwgZGVzdEl0ZW0sIG9wdHMpXG59XG5cbmZ1bmN0aW9uIG9uTGluayAoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBsZXQgcmVzb2x2ZWRTcmMgPSBmcy5yZWFkbGlua1N5bmMoc3JjKVxuICBpZiAob3B0cy5kZXJlZmVyZW5jZSkge1xuICAgIHJlc29sdmVkU3JjID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkU3JjKVxuICB9XG5cbiAgaWYgKCFkZXN0U3RhdCkge1xuICAgIHJldHVybiBmcy5zeW1saW5rU3luYyhyZXNvbHZlZFNyYywgZGVzdClcbiAgfSBlbHNlIHtcbiAgICBsZXQgcmVzb2x2ZWREZXN0XG4gICAgdHJ5IHtcbiAgICAgIHJlc29sdmVkRGVzdCA9IGZzLnJlYWRsaW5rU3luYyhkZXN0KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gZGVzdCBleGlzdHMgYW5kIGlzIGEgcmVndWxhciBmaWxlIG9yIGRpcmVjdG9yeSxcbiAgICAgIC8vIFdpbmRvd3MgbWF5IHRocm93IFVOS05PV04gZXJyb3IuIElmIGRlc3QgYWxyZWFkeSBleGlzdHMsXG4gICAgICAvLyBmcyB0aHJvd3MgZXJyb3IgYW55d2F5LCBzbyBubyBuZWVkIHRvIGd1YXJkIGFnYWluc3QgaXQgaGVyZS5cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VJTlZBTCcgfHwgZXJyLmNvZGUgPT09ICdVTktOT1dOJykgcmV0dXJuIGZzLnN5bWxpbmtTeW5jKHJlc29sdmVkU3JjLCBkZXN0KVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICAgIGlmIChvcHRzLmRlcmVmZXJlbmNlKSB7XG4gICAgICByZXNvbHZlZERlc3QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZWREZXN0KVxuICAgIH1cbiAgICBpZiAoc3RhdC5pc1NyY1N1YmRpcihyZXNvbHZlZFNyYywgcmVzb2x2ZWREZXN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29weSAnJHtyZXNvbHZlZFNyY30nIHRvIGEgc3ViZGlyZWN0b3J5IG9mIGl0c2VsZiwgJyR7cmVzb2x2ZWREZXN0fScuYClcbiAgICB9XG5cbiAgICAvLyBwcmV2ZW50IGNvcHkgaWYgc3JjIGlzIGEgc3ViZGlyIG9mIGRlc3Qgc2luY2UgdW5saW5raW5nXG4gICAgLy8gZGVzdCBpbiB0aGlzIGNhc2Ugd291bGQgcmVzdWx0IGluIHJlbW92aW5nIHNyYyBjb250ZW50c1xuICAgIC8vIGFuZCB0aGVyZWZvcmUgYSBicm9rZW4gc3ltbGluayB3b3VsZCBiZSBjcmVhdGVkLlxuICAgIGlmIChzdGF0LmlzU3JjU3ViZGlyKHJlc29sdmVkRGVzdCwgcmVzb2x2ZWRTcmMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgJyR7cmVzb2x2ZWREZXN0fScgd2l0aCAnJHtyZXNvbHZlZFNyY30nLmApXG4gICAgfVxuICAgIHJldHVybiBjb3B5TGluayhyZXNvbHZlZFNyYywgZGVzdClcbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5TGluayAocmVzb2x2ZWRTcmMsIGRlc3QpIHtcbiAgZnMudW5saW5rU3luYyhkZXN0KVxuICByZXR1cm4gZnMuc3ltbGlua1N5bmMocmVzb2x2ZWRTcmMsIGRlc3QpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bmNcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IHsgbWtkaXJzIH0gPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuY29uc3QgeyBwYXRoRXhpc3RzIH0gPSByZXF1aXJlKCcuLi9wYXRoLWV4aXN0cycpXG5jb25zdCB7IHV0aW1lc01pbGxpcyB9ID0gcmVxdWlyZSgnLi4vdXRpbC91dGltZXMnKVxuY29uc3Qgc3RhdCA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmFzeW5jIGZ1bmN0aW9uIGNvcHkgKHNyYywgZGVzdCwgb3B0cyA9IHt9KSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9wdHMgPSB7IGZpbHRlcjogb3B0cyB9XG4gIH1cblxuICBvcHRzLmNsb2JiZXIgPSAnY2xvYmJlcicgaW4gb3B0cyA/ICEhb3B0cy5jbG9iYmVyIDogdHJ1ZSAvLyBkZWZhdWx0IHRvIHRydWUgZm9yIG5vd1xuICBvcHRzLm92ZXJ3cml0ZSA9ICdvdmVyd3JpdGUnIGluIG9wdHMgPyAhIW9wdHMub3ZlcndyaXRlIDogb3B0cy5jbG9iYmVyIC8vIG92ZXJ3cml0ZSBmYWxscyBiYWNrIHRvIGNsb2JiZXJcblxuICAvLyBXYXJuIGFib3V0IHVzaW5nIHByZXNlcnZlVGltZXN0YW1wcyBvbiAzMi1iaXQgbm9kZVxuICBpZiAob3B0cy5wcmVzZXJ2ZVRpbWVzdGFtcHMgJiYgcHJvY2Vzcy5hcmNoID09PSAnaWEzMicpIHtcbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKFxuICAgICAgJ1VzaW5nIHRoZSBwcmVzZXJ2ZVRpbWVzdGFtcHMgb3B0aW9uIGluIDMyLWJpdCBub2RlIGlzIG5vdCByZWNvbW1lbmRlZDtcXG5cXG4nICtcbiAgICAgICdcXHRzZWUgaHR0cHM6Ly9naXRodWIuY29tL2pwcmljaGFyZHNvbi9ub2RlLWZzLWV4dHJhL2lzc3Vlcy8yNjknLFxuICAgICAgJ1dhcm5pbmcnLCAnZnMtZXh0cmEtV0FSTjAwMDEnXG4gICAgKVxuICB9XG5cbiAgY29uc3QgeyBzcmNTdGF0LCBkZXN0U3RhdCB9ID0gYXdhaXQgc3RhdC5jaGVja1BhdGhzKHNyYywgZGVzdCwgJ2NvcHknLCBvcHRzKVxuXG4gIGF3YWl0IHN0YXQuY2hlY2tQYXJlbnRQYXRocyhzcmMsIHNyY1N0YXQsIGRlc3QsICdjb3B5JylcblxuICBjb25zdCBpbmNsdWRlID0gYXdhaXQgcnVuRmlsdGVyKHNyYywgZGVzdCwgb3B0cylcblxuICBpZiAoIWluY2x1ZGUpIHJldHVyblxuXG4gIC8vIGNoZWNrIGlmIHRoZSBwYXJlbnQgb2YgZGVzdCBleGlzdHMsIGFuZCBjcmVhdGUgaXQgaWYgaXQgZG9lc24ndCBleGlzdFxuICBjb25zdCBkZXN0UGFyZW50ID0gcGF0aC5kaXJuYW1lKGRlc3QpXG4gIGNvbnN0IGRpckV4aXN0cyA9IGF3YWl0IHBhdGhFeGlzdHMoZGVzdFBhcmVudClcbiAgaWYgKCFkaXJFeGlzdHMpIHtcbiAgICBhd2FpdCBta2RpcnMoZGVzdFBhcmVudClcbiAgfVxuXG4gIGF3YWl0IGdldFN0YXRzQW5kUGVyZm9ybUNvcHkoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuRmlsdGVyIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKCFvcHRzLmZpbHRlcikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIG9wdHMuZmlsdGVyKHNyYywgZGVzdClcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0U3RhdHNBbmRQZXJmb3JtQ29weSAoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBjb25zdCBzdGF0Rm4gPSBvcHRzLmRlcmVmZXJlbmNlID8gZnMuc3RhdCA6IGZzLmxzdGF0XG4gIGNvbnN0IHNyY1N0YXQgPSBhd2FpdCBzdGF0Rm4oc3JjKVxuXG4gIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkpIHJldHVybiBvbkRpcihzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuXG4gIGlmIChcbiAgICBzcmNTdGF0LmlzRmlsZSgpIHx8XG4gICAgc3JjU3RhdC5pc0NoYXJhY3RlckRldmljZSgpIHx8XG4gICAgc3JjU3RhdC5pc0Jsb2NrRGV2aWNlKClcbiAgKSByZXR1cm4gb25GaWxlKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG5cbiAgaWYgKHNyY1N0YXQuaXNTeW1ib2xpY0xpbmsoKSkgcmV0dXJuIG9uTGluayhkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuICBpZiAoc3JjU3RhdC5pc1NvY2tldCgpKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb3B5IGEgc29ja2V0IGZpbGU6ICR7c3JjfWApXG4gIGlmIChzcmNTdGF0LmlzRklGTygpKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb3B5IGEgRklGTyBwaXBlOiAke3NyY31gKVxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZmlsZTogJHtzcmN9YClcbn1cblxuYXN5bmMgZnVuY3Rpb24gb25GaWxlIChzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGlmICghZGVzdFN0YXQpIHJldHVybiBjb3B5RmlsZShzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG5cbiAgaWYgKG9wdHMub3ZlcndyaXRlKSB7XG4gICAgYXdhaXQgZnMudW5saW5rKGRlc3QpXG4gICAgcmV0dXJuIGNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgfVxuICBpZiAob3B0cy5lcnJvck9uRXhpc3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2Rlc3R9JyBhbHJlYWR5IGV4aXN0c2ApXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weUZpbGUgKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBhd2FpdCBmcy5jb3B5RmlsZShzcmMsIGRlc3QpXG4gIGlmIChvcHRzLnByZXNlcnZlVGltZXN0YW1wcykge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgZmlsZSBpcyB3cml0YWJsZSBiZWZvcmUgc2V0dGluZyB0aGUgdGltZXN0YW1wXG4gICAgLy8gb3RoZXJ3aXNlIG9wZW4gZmFpbHMgd2l0aCBFUEVSTSB3aGVuIGludm9rZWQgd2l0aCAncisnXG4gICAgLy8gKHRocm91Z2ggdXRpbWVzIGNhbGwpXG4gICAgaWYgKGZpbGVJc05vdFdyaXRhYmxlKHNyY1N0YXQubW9kZSkpIHtcbiAgICAgIGF3YWl0IG1ha2VGaWxlV3JpdGFibGUoZGVzdCwgc3JjU3RhdC5tb2RlKVxuICAgIH1cblxuICAgIC8vIFNldCB0aW1lc3RhbXBzIGFuZCBtb2RlIGNvcnJlc3BvbmRpbmdseVxuXG4gICAgLy8gTm90ZSB0aGF0IFRoZSBpbml0aWFsIHNyY1N0YXQuYXRpbWUgY2Fubm90IGJlIHRydXN0ZWRcbiAgICAvLyBiZWNhdXNlIGl0IGlzIG1vZGlmaWVkIGJ5IHRoZSByZWFkKDIpIHN5c3RlbSBjYWxsXG4gICAgLy8gKFNlZSBodHRwczovL25vZGVqcy5vcmcvYXBpL2ZzLmh0bWwjZnNfc3RhdF90aW1lX3ZhbHVlcylcbiAgICBjb25zdCB1cGRhdGVkU3JjU3RhdCA9IGF3YWl0IGZzLnN0YXQoc3JjKVxuICAgIGF3YWl0IHV0aW1lc01pbGxpcyhkZXN0LCB1cGRhdGVkU3JjU3RhdC5hdGltZSwgdXBkYXRlZFNyY1N0YXQubXRpbWUpXG4gIH1cblxuICByZXR1cm4gZnMuY2htb2QoZGVzdCwgc3JjU3RhdC5tb2RlKVxufVxuXG5mdW5jdGlvbiBmaWxlSXNOb3RXcml0YWJsZSAoc3JjTW9kZSkge1xuICByZXR1cm4gKHNyY01vZGUgJiAwbzIwMCkgPT09IDBcbn1cblxuZnVuY3Rpb24gbWFrZUZpbGVXcml0YWJsZSAoZGVzdCwgc3JjTW9kZSkge1xuICByZXR1cm4gZnMuY2htb2QoZGVzdCwgc3JjTW9kZSB8IDBvMjAwKVxufVxuXG5hc3luYyBmdW5jdGlvbiBvbkRpciAoc3JjU3RhdCwgZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICAvLyB0aGUgZGVzdCBkaXJlY3RvcnkgbWlnaHQgbm90IGV4aXN0LCBjcmVhdGUgaXRcbiAgaWYgKCFkZXN0U3RhdCkge1xuICAgIGF3YWl0IGZzLm1rZGlyKGRlc3QpXG4gIH1cblxuICBjb25zdCBpdGVtcyA9IGF3YWl0IGZzLnJlYWRkaXIoc3JjKVxuXG4gIC8vIGxvb3AgdGhyb3VnaCB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRvIGNvcHkgZXZlcnl0aGluZ1xuICBhd2FpdCBQcm9taXNlLmFsbChpdGVtcy5tYXAoYXN5bmMgaXRlbSA9PiB7XG4gICAgY29uc3Qgc3JjSXRlbSA9IHBhdGguam9pbihzcmMsIGl0ZW0pXG4gICAgY29uc3QgZGVzdEl0ZW0gPSBwYXRoLmpvaW4oZGVzdCwgaXRlbSlcblxuICAgIC8vIHNraXAgdGhlIGl0ZW0gaWYgaXQgaXMgbWF0Y2hlcyBieSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG4gICAgY29uc3QgaW5jbHVkZSA9IGF3YWl0IHJ1bkZpbHRlcihzcmNJdGVtLCBkZXN0SXRlbSwgb3B0cylcbiAgICBpZiAoIWluY2x1ZGUpIHJldHVyblxuXG4gICAgY29uc3QgeyBkZXN0U3RhdCB9ID0gYXdhaXQgc3RhdC5jaGVja1BhdGhzKHNyY0l0ZW0sIGRlc3RJdGVtLCAnY29weScsIG9wdHMpXG5cbiAgICAvLyBJZiB0aGUgaXRlbSBpcyBhIGNvcHlhYmxlIGZpbGUsIGBnZXRTdGF0c0FuZFBlcmZvcm1Db3B5YCB3aWxsIGNvcHkgaXRcbiAgICAvLyBJZiB0aGUgaXRlbSBpcyBhIGRpcmVjdG9yeSwgYGdldFN0YXRzQW5kUGVyZm9ybUNvcHlgIHdpbGwgY2FsbCBgb25EaXJgIHJlY3Vyc2l2ZWx5XG4gICAgcmV0dXJuIGdldFN0YXRzQW5kUGVyZm9ybUNvcHkoZGVzdFN0YXQsIHNyY0l0ZW0sIGRlc3RJdGVtLCBvcHRzKVxuICB9KSlcblxuICBpZiAoIWRlc3RTdGF0KSB7XG4gICAgYXdhaXQgZnMuY2htb2QoZGVzdCwgc3JjU3RhdC5tb2RlKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9uTGluayAoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBsZXQgcmVzb2x2ZWRTcmMgPSBhd2FpdCBmcy5yZWFkbGluayhzcmMpXG4gIGlmIChvcHRzLmRlcmVmZXJlbmNlKSB7XG4gICAgcmVzb2x2ZWRTcmMgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZWRTcmMpXG4gIH1cbiAgaWYgKCFkZXN0U3RhdCkge1xuICAgIHJldHVybiBmcy5zeW1saW5rKHJlc29sdmVkU3JjLCBkZXN0KVxuICB9XG5cbiAgbGV0IHJlc29sdmVkRGVzdCA9IG51bGxcbiAgdHJ5IHtcbiAgICByZXNvbHZlZERlc3QgPSBhd2FpdCBmcy5yZWFkbGluayhkZXN0KVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gZGVzdCBleGlzdHMgYW5kIGlzIGEgcmVndWxhciBmaWxlIG9yIGRpcmVjdG9yeSxcbiAgICAvLyBXaW5kb3dzIG1heSB0aHJvdyBVTktOT1dOIGVycm9yLiBJZiBkZXN0IGFscmVhZHkgZXhpc3RzLFxuICAgIC8vIGZzIHRocm93cyBlcnJvciBhbnl3YXksIHNvIG5vIG5lZWQgdG8gZ3VhcmQgYWdhaW5zdCBpdCBoZXJlLlxuICAgIGlmIChlLmNvZGUgPT09ICdFSU5WQUwnIHx8IGUuY29kZSA9PT0gJ1VOS05PV04nKSByZXR1cm4gZnMuc3ltbGluayhyZXNvbHZlZFNyYywgZGVzdClcbiAgICB0aHJvdyBlXG4gIH1cbiAgaWYgKG9wdHMuZGVyZWZlcmVuY2UpIHtcbiAgICByZXNvbHZlZERlc3QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZWREZXN0KVxuICB9XG4gIGlmIChzdGF0LmlzU3JjU3ViZGlyKHJlc29sdmVkU3JjLCByZXNvbHZlZERlc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29weSAnJHtyZXNvbHZlZFNyY30nIHRvIGEgc3ViZGlyZWN0b3J5IG9mIGl0c2VsZiwgJyR7cmVzb2x2ZWREZXN0fScuYClcbiAgfVxuXG4gIC8vIGRvIG5vdCBjb3B5IGlmIHNyYyBpcyBhIHN1YmRpciBvZiBkZXN0IHNpbmNlIHVubGlua2luZ1xuICAvLyBkZXN0IGluIHRoaXMgY2FzZSB3b3VsZCByZXN1bHQgaW4gcmVtb3Zpbmcgc3JjIGNvbnRlbnRzXG4gIC8vIGFuZCB0aGVyZWZvcmUgYSBicm9rZW4gc3ltbGluayB3b3VsZCBiZSBjcmVhdGVkLlxuICBpZiAoc3RhdC5pc1NyY1N1YmRpcihyZXNvbHZlZERlc3QsIHJlc29sdmVkU3JjKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG92ZXJ3cml0ZSAnJHtyZXNvbHZlZERlc3R9JyB3aXRoICcke3Jlc29sdmVkU3JjfScuYClcbiAgfVxuXG4gIC8vIGNvcHkgdGhlIGxpbmtcbiAgYXdhaXQgZnMudW5saW5rKGRlc3QpXG4gIHJldHVybiBmcy5zeW1saW5rKHJlc29sdmVkU3JjLCBkZXN0KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2Vcbm1vZHVsZS5leHBvcnRzID0ge1xuICBjb3B5OiB1KHJlcXVpcmUoJy4vY29weScpKSxcbiAgY29weVN5bmM6IHJlcXVpcmUoJy4vY29weS1zeW5jJylcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgbWtkaXIgPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuY29uc3QgcmVtb3ZlID0gcmVxdWlyZSgnLi4vcmVtb3ZlJylcblxuY29uc3QgZW1wdHlEaXIgPSB1KGFzeW5jIGZ1bmN0aW9uIGVtcHR5RGlyIChkaXIpIHtcbiAgbGV0IGl0ZW1zXG4gIHRyeSB7XG4gICAgaXRlbXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG1rZGlyLm1rZGlycyhkaXIpXG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoaXRlbXMubWFwKGl0ZW0gPT4gcmVtb3ZlLnJlbW92ZShwYXRoLmpvaW4oZGlyLCBpdGVtKSkpKVxufSlcblxuZnVuY3Rpb24gZW1wdHlEaXJTeW5jIChkaXIpIHtcbiAgbGV0IGl0ZW1zXG4gIHRyeSB7XG4gICAgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBta2Rpci5ta2RpcnNTeW5jKGRpcilcbiAgfVxuXG4gIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgaXRlbSA9IHBhdGguam9pbihkaXIsIGl0ZW0pXG4gICAgcmVtb3ZlLnJlbW92ZVN5bmMoaXRlbSlcbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGVtcHR5RGlyU3luYyxcbiAgZW1wdHlkaXJTeW5jOiBlbXB0eURpclN5bmMsXG4gIGVtcHR5RGlyLFxuICBlbXB0eWRpcjogZW1wdHlEaXJcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgbWtkaXIgPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVGaWxlIChmaWxlKSB7XG4gIGxldCBzdGF0c1xuICB0cnkge1xuICAgIHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlKVxuICB9IGNhdGNoIHsgfVxuICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNGaWxlKCkpIHJldHVyblxuXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShmaWxlKVxuXG4gIGxldCBkaXJTdGF0cyA9IG51bGxcbiAgdHJ5IHtcbiAgICBkaXJTdGF0cyA9IGF3YWl0IGZzLnN0YXQoZGlyKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpZiB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIG1ha2UgaXRcbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICBhd2FpdCBta2Rpci5ta2RpcnMoZGlyKVxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGUsICcnKVxuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJTdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGUsICcnKVxuICB9IGVsc2Uge1xuICAgIC8vIHBhcmVudCBpcyBub3QgYSBkaXJlY3RvcnlcbiAgICAvLyBUaGlzIGlzIGp1c3QgdG8gY2F1c2UgYW4gaW50ZXJuYWwgRU5PVERJUiBlcnJvciB0byBiZSB0aHJvd25cbiAgICBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWxlU3luYyAoZmlsZSkge1xuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGUpXG4gIH0gY2F0Y2ggeyB9XG4gIGlmIChzdGF0cyAmJiBzdGF0cy5pc0ZpbGUoKSkgcmV0dXJuXG5cbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGZpbGUpXG4gIHRyeSB7XG4gICAgaWYgKCFmcy5zdGF0U3luYyhkaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIC8vIHBhcmVudCBpcyBub3QgYSBkaXJlY3RvcnlcbiAgICAgIC8vIFRoaXMgaXMganVzdCB0byBjYXVzZSBhbiBpbnRlcm5hbCBFTk9URElSIGVycm9yIHRvIGJlIHRocm93blxuICAgICAgZnMucmVhZGRpclN5bmMoZGlyKVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gSWYgdGhlIHN0YXQgY2FsbCBhYm92ZSBmYWlsZWQgYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBpdFxuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdFTk9FTlQnKSBta2Rpci5ta2RpcnNTeW5jKGRpcilcbiAgICBlbHNlIHRocm93IGVyclxuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCAnJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZUZpbGU6IHUoY3JlYXRlRmlsZSksXG4gIGNyZWF0ZUZpbGVTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBjcmVhdGVGaWxlLCBjcmVhdGVGaWxlU3luYyB9ID0gcmVxdWlyZSgnLi9maWxlJylcbmNvbnN0IHsgY3JlYXRlTGluaywgY3JlYXRlTGlua1N5bmMgfSA9IHJlcXVpcmUoJy4vbGluaycpXG5jb25zdCB7IGNyZWF0ZVN5bWxpbmssIGNyZWF0ZVN5bWxpbmtTeW5jIH0gPSByZXF1aXJlKCcuL3N5bWxpbmsnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gZmlsZVxuICBjcmVhdGVGaWxlLFxuICBjcmVhdGVGaWxlU3luYyxcbiAgZW5zdXJlRmlsZTogY3JlYXRlRmlsZSxcbiAgZW5zdXJlRmlsZVN5bmM6IGNyZWF0ZUZpbGVTeW5jLFxuICAvLyBsaW5rXG4gIGNyZWF0ZUxpbmssXG4gIGNyZWF0ZUxpbmtTeW5jLFxuICBlbnN1cmVMaW5rOiBjcmVhdGVMaW5rLFxuICBlbnN1cmVMaW5rU3luYzogY3JlYXRlTGlua1N5bmMsXG4gIC8vIHN5bWxpbmtcbiAgY3JlYXRlU3ltbGluayxcbiAgY3JlYXRlU3ltbGlua1N5bmMsXG4gIGVuc3VyZVN5bWxpbms6IGNyZWF0ZVN5bWxpbmssXG4gIGVuc3VyZVN5bWxpbmtTeW5jOiBjcmVhdGVTeW1saW5rU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCBta2RpciA9IHJlcXVpcmUoJy4uL21rZGlycycpXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcbmNvbnN0IHsgYXJlSWRlbnRpY2FsIH0gPSByZXF1aXJlKCcuLi91dGlsL3N0YXQnKVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVMaW5rIChzcmNwYXRoLCBkc3RwYXRoKSB7XG4gIGxldCBkc3RTdGF0XG4gIHRyeSB7XG4gICAgZHN0U3RhdCA9IGF3YWl0IGZzLmxzdGF0KGRzdHBhdGgpXG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZSBlcnJvclxuICB9XG5cbiAgbGV0IHNyY1N0YXRcbiAgdHJ5IHtcbiAgICBzcmNTdGF0ID0gYXdhaXQgZnMubHN0YXQoc3JjcGF0aClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLm1lc3NhZ2UgPSBlcnIubWVzc2FnZS5yZXBsYWNlKCdsc3RhdCcsICdlbnN1cmVMaW5rJylcbiAgICB0aHJvdyBlcnJcbiAgfVxuXG4gIGlmIChkc3RTdGF0ICYmIGFyZUlkZW50aWNhbChzcmNTdGF0LCBkc3RTdGF0KSkgcmV0dXJuXG5cbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGRzdHBhdGgpXG5cbiAgY29uc3QgZGlyRXhpc3RzID0gYXdhaXQgcGF0aEV4aXN0cyhkaXIpXG5cbiAgaWYgKCFkaXJFeGlzdHMpIHtcbiAgICBhd2FpdCBta2Rpci5ta2RpcnMoZGlyKVxuICB9XG5cbiAgYXdhaXQgZnMubGluayhzcmNwYXRoLCBkc3RwYXRoKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVMaW5rU3luYyAoc3JjcGF0aCwgZHN0cGF0aCkge1xuICBsZXQgZHN0U3RhdFxuICB0cnkge1xuICAgIGRzdFN0YXQgPSBmcy5sc3RhdFN5bmMoZHN0cGF0aClcbiAgfSBjYXRjaCB7fVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3JjU3RhdCA9IGZzLmxzdGF0U3luYyhzcmNwYXRoKVxuICAgIGlmIChkc3RTdGF0ICYmIGFyZUlkZW50aWNhbChzcmNTdGF0LCBkc3RTdGF0KSkgcmV0dXJuXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UucmVwbGFjZSgnbHN0YXQnLCAnZW5zdXJlTGluaycpXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgZGlyRXhpc3RzID0gZnMuZXhpc3RzU3luYyhkaXIpXG4gIGlmIChkaXJFeGlzdHMpIHJldHVybiBmcy5saW5rU3luYyhzcmNwYXRoLCBkc3RwYXRoKVxuICBta2Rpci5ta2RpcnNTeW5jKGRpcilcblxuICByZXR1cm4gZnMubGlua1N5bmMoc3JjcGF0aCwgZHN0cGF0aClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZUxpbms6IHUoY3JlYXRlTGluayksXG4gIGNyZWF0ZUxpbmtTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5cbi8qKlxuICogRnVuY3Rpb24gdGhhdCByZXR1cm5zIHR3byB0eXBlcyBvZiBwYXRocywgb25lIHJlbGF0aXZlIHRvIHN5bWxpbmssIGFuZCBvbmVcbiAqIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBDaGVja3MgaWYgcGF0aCBpcyBhYnNvbHV0ZSBvclxuICogcmVsYXRpdmUuIElmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLCB0aGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgcGF0aCBpc1xuICogcmVsYXRpdmUgdG8gc3ltbGluayBvciByZWxhdGl2ZSB0byBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBUaGlzIGlzIGFuXG4gKiBpbml0aWF0aXZlIHRvIGZpbmQgYSBzbWFydGVyIGBzcmNwYXRoYCB0byBzdXBwbHkgd2hlbiBidWlsZGluZyBzeW1saW5rcy5cbiAqIFRoaXMgYWxsb3dzIHlvdSB0byBkZXRlcm1pbmUgd2hpY2ggcGF0aCB0byB1c2Ugb3V0IG9mIG9uZSBvZiB0aHJlZSBwb3NzaWJsZVxuICogdHlwZXMgb2Ygc291cmNlIHBhdGhzLiBUaGUgZmlyc3QgaXMgYW4gYWJzb2x1dGUgcGF0aC4gVGhpcyBpcyBkZXRlY3RlZCBieVxuICogYHBhdGguaXNBYnNvbHV0ZSgpYC4gV2hlbiBhbiBhYnNvbHV0ZSBwYXRoIGlzIHByb3ZpZGVkLCBpdCBpcyBjaGVja2VkIHRvXG4gKiBzZWUgaWYgaXQgZXhpc3RzLiBJZiBpdCBkb2VzIGl0J3MgdXNlZCwgaWYgbm90IGFuIGVycm9yIGlzIHJldHVybmVkXG4gKiAoY2FsbGJhY2spLyB0aHJvd24gKHN5bmMpLiBUaGUgb3RoZXIgdHdvIG9wdGlvbnMgZm9yIGBzcmNwYXRoYCBhcmUgYVxuICogcmVsYXRpdmUgdXJsLiBCeSBkZWZhdWx0IE5vZGUncyBgZnMuc3ltbGlua2Agd29ya3MgYnkgY3JlYXRpbmcgYSBzeW1saW5rXG4gKiB1c2luZyBgZHN0cGF0aGAgYW5kIGV4cGVjdHMgdGhlIGBzcmNwYXRoYCB0byBiZSByZWxhdGl2ZSB0byB0aGUgbmV3bHlcbiAqIGNyZWF0ZWQgc3ltbGluay4gSWYgeW91IHByb3ZpZGUgYSBgc3JjcGF0aGAgdGhhdCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgZmlsZVxuICogc3lzdGVtIGl0IHJlc3VsdHMgaW4gYSBicm9rZW4gc3ltbGluay4gVG8gbWluaW1pemUgdGhpcywgdGhlIGZ1bmN0aW9uXG4gKiBjaGVja3MgdG8gc2VlIGlmIHRoZSAncmVsYXRpdmUgdG8gc3ltbGluaycgc291cmNlIGZpbGUgZXhpc3RzLCBhbmQgaWYgaXRcbiAqIGRvZXMgaXQgd2lsbCB1c2UgaXQuIElmIGl0IGRvZXMgbm90LCBpdCBjaGVja3MgaWYgdGhlcmUncyBhIGZpbGUgdGhhdFxuICogZXhpc3RzIHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGlmIGRvZXMgaXRzIHVzZWQuXG4gKiBUaGlzIHByZXNlcnZlcyB0aGUgZXhwZWN0YXRpb25zIG9mIHRoZSBvcmlnaW5hbCBmcy5zeW1saW5rIHNwZWMgYW5kIGFkZHNcbiAqIHRoZSBhYmlsaXR5IHRvIHBhc3MgaW4gYHJlbGF0aXZlIHRvIGN1cnJlbnQgd29ya2luZyBkaXJlY290cnlgIHBhdGhzLlxuICovXG5cbmFzeW5jIGZ1bmN0aW9uIHN5bWxpbmtQYXRocyAoc3JjcGF0aCwgZHN0cGF0aCkge1xuICBpZiAocGF0aC5pc0Fic29sdXRlKHNyY3BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlLnJlcGxhY2UoJ2xzdGF0JywgJ2Vuc3VyZVN5bWxpbmsnKVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvQ3dkOiBzcmNwYXRoLFxuICAgICAgdG9Ec3Q6IHNyY3BhdGhcbiAgICB9XG4gIH1cblxuICBjb25zdCBkc3RkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgcmVsYXRpdmVUb0RzdCA9IHBhdGguam9pbihkc3RkaXIsIHNyY3BhdGgpXG5cbiAgY29uc3QgZXhpc3RzID0gYXdhaXQgcGF0aEV4aXN0cyhyZWxhdGl2ZVRvRHN0KVxuICBpZiAoZXhpc3RzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvQ3dkOiByZWxhdGl2ZVRvRHN0LFxuICAgICAgdG9Ec3Q6IHNyY3BhdGhcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UucmVwbGFjZSgnbHN0YXQnLCAnZW5zdXJlU3ltbGluaycpXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvQ3dkOiBzcmNwYXRoLFxuICAgIHRvRHN0OiBwYXRoLnJlbGF0aXZlKGRzdGRpciwgc3JjcGF0aClcbiAgfVxufVxuXG5mdW5jdGlvbiBzeW1saW5rUGF0aHNTeW5jIChzcmNwYXRoLCBkc3RwYXRoKSB7XG4gIGlmIChwYXRoLmlzQWJzb2x1dGUoc3JjcGF0aCkpIHtcbiAgICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKHNyY3BhdGgpXG4gICAgaWYgKCFleGlzdHMpIHRocm93IG5ldyBFcnJvcignYWJzb2x1dGUgc3JjcGF0aCBkb2VzIG5vdCBleGlzdCcpXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvQ3dkOiBzcmNwYXRoLFxuICAgICAgdG9Ec3Q6IHNyY3BhdGhcbiAgICB9XG4gIH1cblxuICBjb25zdCBkc3RkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgcmVsYXRpdmVUb0RzdCA9IHBhdGguam9pbihkc3RkaXIsIHNyY3BhdGgpXG4gIGNvbnN0IGV4aXN0cyA9IGZzLmV4aXN0c1N5bmMocmVsYXRpdmVUb0RzdClcbiAgaWYgKGV4aXN0cykge1xuICAgIHJldHVybiB7XG4gICAgICB0b0N3ZDogcmVsYXRpdmVUb0RzdCxcbiAgICAgIHRvRHN0OiBzcmNwYXRoXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3JjRXhpc3RzID0gZnMuZXhpc3RzU3luYyhzcmNwYXRoKVxuICBpZiAoIXNyY0V4aXN0cykgdGhyb3cgbmV3IEVycm9yKCdyZWxhdGl2ZSBzcmNwYXRoIGRvZXMgbm90IGV4aXN0JylcbiAgcmV0dXJuIHtcbiAgICB0b0N3ZDogc3JjcGF0aCxcbiAgICB0b0RzdDogcGF0aC5yZWxhdGl2ZShkc3RkaXIsIHNyY3BhdGgpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHN5bWxpbmtQYXRoczogdShzeW1saW5rUGF0aHMpLFxuICBzeW1saW5rUGF0aHNTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcblxuYXN5bmMgZnVuY3Rpb24gc3ltbGlua1R5cGUgKHNyY3BhdGgsIHR5cGUpIHtcbiAgaWYgKHR5cGUpIHJldHVybiB0eXBlXG5cbiAgbGV0IHN0YXRzXG4gIHRyeSB7XG4gICAgc3RhdHMgPSBhd2FpdCBmcy5sc3RhdChzcmNwYXRoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ2ZpbGUnXG4gIH1cblxuICByZXR1cm4gKHN0YXRzICYmIHN0YXRzLmlzRGlyZWN0b3J5KCkpID8gJ2RpcicgOiAnZmlsZSdcbn1cblxuZnVuY3Rpb24gc3ltbGlua1R5cGVTeW5jIChzcmNwYXRoLCB0eXBlKSB7XG4gIGlmICh0eXBlKSByZXR1cm4gdHlwZVxuXG4gIGxldCBzdGF0c1xuICB0cnkge1xuICAgIHN0YXRzID0gZnMubHN0YXRTeW5jKHNyY3BhdGgpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnZmlsZSdcbiAgfVxuICByZXR1cm4gKHN0YXRzICYmIHN0YXRzLmlzRGlyZWN0b3J5KCkpID8gJ2RpcicgOiAnZmlsZSdcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHN5bWxpbmtUeXBlOiB1KHN5bWxpbmtUeXBlKSxcbiAgc3ltbGlua1R5cGVTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcblxuY29uc3QgeyBta2RpcnMsIG1rZGlyc1N5bmMgfSA9IHJlcXVpcmUoJy4uL21rZGlycycpXG5cbmNvbnN0IHsgc3ltbGlua1BhdGhzLCBzeW1saW5rUGF0aHNTeW5jIH0gPSByZXF1aXJlKCcuL3N5bWxpbmstcGF0aHMnKVxuY29uc3QgeyBzeW1saW5rVHlwZSwgc3ltbGlua1R5cGVTeW5jIH0gPSByZXF1aXJlKCcuL3N5bWxpbmstdHlwZScpXG5cbmNvbnN0IHsgcGF0aEV4aXN0cyB9ID0gcmVxdWlyZSgnLi4vcGF0aC1leGlzdHMnKVxuXG5jb25zdCB7IGFyZUlkZW50aWNhbCB9ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlU3ltbGluayAoc3JjcGF0aCwgZHN0cGF0aCwgdHlwZSkge1xuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGF3YWl0IGZzLmxzdGF0KGRzdHBhdGgpXG4gIH0gY2F0Y2ggeyB9XG5cbiAgaWYgKHN0YXRzICYmIHN0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICBjb25zdCBbc3JjU3RhdCwgZHN0U3RhdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5zdGF0KHNyY3BhdGgpLFxuICAgICAgZnMuc3RhdChkc3RwYXRoKVxuICAgIF0pXG5cbiAgICBpZiAoYXJlSWRlbnRpY2FsKHNyY1N0YXQsIGRzdFN0YXQpKSByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHJlbGF0aXZlID0gYXdhaXQgc3ltbGlua1BhdGhzKHNyY3BhdGgsIGRzdHBhdGgpXG4gIHNyY3BhdGggPSByZWxhdGl2ZS50b0RzdFxuICBjb25zdCB0b1R5cGUgPSBhd2FpdCBzeW1saW5rVHlwZShyZWxhdGl2ZS50b0N3ZCwgdHlwZSlcbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGRzdHBhdGgpXG5cbiAgaWYgKCEoYXdhaXQgcGF0aEV4aXN0cyhkaXIpKSkge1xuICAgIGF3YWl0IG1rZGlycyhkaXIpXG4gIH1cblxuICByZXR1cm4gZnMuc3ltbGluayhzcmNwYXRoLCBkc3RwYXRoLCB0b1R5cGUpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN5bWxpbmtTeW5jIChzcmNwYXRoLCBkc3RwYXRoLCB0eXBlKSB7XG4gIGxldCBzdGF0c1xuICB0cnkge1xuICAgIHN0YXRzID0gZnMubHN0YXRTeW5jKGRzdHBhdGgpXG4gIH0gY2F0Y2ggeyB9XG4gIGlmIChzdGF0cyAmJiBzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgY29uc3Qgc3JjU3RhdCA9IGZzLnN0YXRTeW5jKHNyY3BhdGgpXG4gICAgY29uc3QgZHN0U3RhdCA9IGZzLnN0YXRTeW5jKGRzdHBhdGgpXG4gICAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkc3RTdGF0KSkgcmV0dXJuXG4gIH1cblxuICBjb25zdCByZWxhdGl2ZSA9IHN5bWxpbmtQYXRoc1N5bmMoc3JjcGF0aCwgZHN0cGF0aClcbiAgc3JjcGF0aCA9IHJlbGF0aXZlLnRvRHN0XG4gIHR5cGUgPSBzeW1saW5rVHlwZVN5bmMocmVsYXRpdmUudG9Dd2QsIHR5cGUpXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShkc3RwYXRoKVxuICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKGRpcilcbiAgaWYgKGV4aXN0cykgcmV0dXJuIGZzLnN5bWxpbmtTeW5jKHNyY3BhdGgsIGRzdHBhdGgsIHR5cGUpXG4gIG1rZGlyc1N5bmMoZGlyKVxuICByZXR1cm4gZnMuc3ltbGlua1N5bmMoc3JjcGF0aCwgZHN0cGF0aCwgdHlwZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZVN5bWxpbms6IHUoY3JlYXRlU3ltbGluayksXG4gIGNyZWF0ZVN5bWxpbmtTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcbi8vIFRoaXMgaXMgYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ub3JtYWxpemUvbXpcbi8vIENvcHlyaWdodCAoYykgMjAxNC0yMDE2IEpvbmF0aGFuIE9uZyBtZUBqb25nbGViZXJyeS5jb20gYW5kIENvbnRyaWJ1dG9yc1xuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21DYWxsYmFja1xuY29uc3QgZnMgPSByZXF1aXJlKCdncmFjZWZ1bC1mcycpXG5cbmNvbnN0IGFwaSA9IFtcbiAgJ2FjY2VzcycsXG4gICdhcHBlbmRGaWxlJyxcbiAgJ2NobW9kJyxcbiAgJ2Nob3duJyxcbiAgJ2Nsb3NlJyxcbiAgJ2NvcHlGaWxlJyxcbiAgJ2ZjaG1vZCcsXG4gICdmY2hvd24nLFxuICAnZmRhdGFzeW5jJyxcbiAgJ2ZzdGF0JyxcbiAgJ2ZzeW5jJyxcbiAgJ2Z0cnVuY2F0ZScsXG4gICdmdXRpbWVzJyxcbiAgJ2xjaG1vZCcsXG4gICdsY2hvd24nLFxuICAnbGluaycsXG4gICdsc3RhdCcsXG4gICdta2RpcicsXG4gICdta2R0ZW1wJyxcbiAgJ29wZW4nLFxuICAnb3BlbmRpcicsXG4gICdyZWFkZGlyJyxcbiAgJ3JlYWRGaWxlJyxcbiAgJ3JlYWRsaW5rJyxcbiAgJ3JlYWxwYXRoJyxcbiAgJ3JlbmFtZScsXG4gICdybScsXG4gICdybWRpcicsXG4gICdzdGF0JyxcbiAgJ3N5bWxpbmsnLFxuICAndHJ1bmNhdGUnLFxuICAndW5saW5rJyxcbiAgJ3V0aW1lcycsXG4gICd3cml0ZUZpbGUnXG5dLmZpbHRlcihrZXkgPT4ge1xuICAvLyBTb21lIGNvbW1hbmRzIGFyZSBub3QgYXZhaWxhYmxlIG9uIHNvbWUgc3lzdGVtcy4gRXg6XG4gIC8vIGZzLmNwIHdhcyBhZGRlZCBpbiBOb2RlLmpzIHYxNi43LjBcbiAgLy8gZnMubGNob3duIGlzIG5vdCBhdmFpbGFibGUgb24gYXQgbGVhc3Qgc29tZSBMaW51eFxuICByZXR1cm4gdHlwZW9mIGZzW2tleV0gPT09ICdmdW5jdGlvbidcbn0pXG5cbi8vIEV4cG9ydCBjbG9uZWQgZnM6XG5PYmplY3QuYXNzaWduKGV4cG9ydHMsIGZzKVxuXG4vLyBVbml2ZXJzYWxpZnkgYXN5bmMgbWV0aG9kczpcbmFwaS5mb3JFYWNoKG1ldGhvZCA9PiB7XG4gIGV4cG9ydHNbbWV0aG9kXSA9IHUoZnNbbWV0aG9kXSlcbn0pXG5cbi8vIFdlIGRpZmZlciBmcm9tIG16L2ZzIGluIHRoYXQgd2Ugc3RpbGwgc2hpcCB0aGUgb2xkLCBicm9rZW4sIGZzLmV4aXN0cygpXG4vLyBzaW5jZSB3ZSBhcmUgYSBkcm9wLWluIHJlcGxhY2VtZW50IGZvciB0aGUgbmF0aXZlIG1vZHVsZVxuZXhwb3J0cy5leGlzdHMgPSBmdW5jdGlvbiAoZmlsZW5hbWUsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzKGZpbGVuYW1lLCBjYWxsYmFjaylcbiAgfVxuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0cyhmaWxlbmFtZSwgcmVzb2x2ZSlcbiAgfSlcbn1cblxuLy8gZnMucmVhZCgpLCBmcy53cml0ZSgpLCBmcy5yZWFkdigpLCAmIGZzLndyaXRldigpIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQgZHVlIHRvIG11bHRpcGxlIGNhbGxiYWNrIGFyZ3NcblxuZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmcy5yZWFkKGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spXG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBmcy5yZWFkKGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgKGVyciwgYnl0ZXNSZWFkLCBidWZmZXIpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgcmVzb2x2ZSh7IGJ5dGVzUmVhZCwgYnVmZmVyIH0pXG4gICAgfSlcbiAgfSlcbn1cblxuLy8gRnVuY3Rpb24gc2lnbmF0dXJlIGNhbiBiZVxuLy8gZnMud3JpdGUoZmQsIGJ1ZmZlclssIG9mZnNldFssIGxlbmd0aFssIHBvc2l0aW9uXV1dLCBjYWxsYmFjaylcbi8vIE9SXG4vLyBmcy53cml0ZShmZCwgc3RyaW5nWywgcG9zaXRpb25bLCBlbmNvZGluZ11dLCBjYWxsYmFjaylcbi8vIFdlIG5lZWQgdG8gaGFuZGxlIGJvdGggY2FzZXMsIHNvIHdlIHVzZSAuLi5hcmdzXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGZkLCBidWZmZXIsIC4uLmFyZ3MpIHtcbiAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZnMud3JpdGUoZmQsIGJ1ZmZlciwgLi4uYXJncylcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZnMud3JpdGUoZmQsIGJ1ZmZlciwgLi4uYXJncywgKGVyciwgYnl0ZXNXcml0dGVuLCBidWZmZXIpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgcmVzb2x2ZSh7IGJ5dGVzV3JpdHRlbiwgYnVmZmVyIH0pXG4gICAgfSlcbiAgfSlcbn1cblxuLy8gRnVuY3Rpb24gc2lnbmF0dXJlIGlzXG4vLyBzLnJlYWR2KGZkLCBidWZmZXJzWywgcG9zaXRpb25dLCBjYWxsYmFjaylcbi8vIFdlIG5lZWQgdG8gaGFuZGxlIHRoZSBvcHRpb25hbCBhcmcsIHNvIHdlIHVzZSAuLi5hcmdzXG5leHBvcnRzLnJlYWR2ID0gZnVuY3Rpb24gKGZkLCBidWZmZXJzLCAuLi5hcmdzKSB7XG4gIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZzLnJlYWR2KGZkLCBidWZmZXJzLCAuLi5hcmdzKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBmcy5yZWFkdihmZCwgYnVmZmVycywgLi4uYXJncywgKGVyciwgYnl0ZXNSZWFkLCBidWZmZXJzKSA9PiB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgIHJlc29sdmUoeyBieXRlc1JlYWQsIGJ1ZmZlcnMgfSlcbiAgICB9KVxuICB9KVxufVxuXG4vLyBGdW5jdGlvbiBzaWduYXR1cmUgaXNcbi8vIHMud3JpdGV2KGZkLCBidWZmZXJzWywgcG9zaXRpb25dLCBjYWxsYmFjaylcbi8vIFdlIG5lZWQgdG8gaGFuZGxlIHRoZSBvcHRpb25hbCBhcmcsIHNvIHdlIHVzZSAuLi5hcmdzXG5leHBvcnRzLndyaXRldiA9IGZ1bmN0aW9uIChmZCwgYnVmZmVycywgLi4uYXJncykge1xuICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmcy53cml0ZXYoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MpXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGZzLndyaXRldihmZCwgYnVmZmVycywgLi4uYXJncywgKGVyciwgYnl0ZXNXcml0dGVuLCBidWZmZXJzKSA9PiB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgIHJlc29sdmUoeyBieXRlc1dyaXR0ZW4sIGJ1ZmZlcnMgfSlcbiAgICB9KVxuICB9KVxufVxuXG4vLyBmcy5yZWFscGF0aC5uYXRpdmUgc29tZXRpbWVzIG5vdCBhdmFpbGFibGUgaWYgZnMgaXMgbW9ua2V5LXBhdGNoZWRcbmlmICh0eXBlb2YgZnMucmVhbHBhdGgubmF0aXZlID09PSAnZnVuY3Rpb24nKSB7XG4gIGV4cG9ydHMucmVhbHBhdGgubmF0aXZlID0gdShmcy5yZWFscGF0aC5uYXRpdmUpXG59IGVsc2Uge1xuICBwcm9jZXNzLmVtaXRXYXJuaW5nKFxuICAgICdmcy5yZWFscGF0aC5uYXRpdmUgaXMgbm90IGEgZnVuY3Rpb24uIElzIGZzIGJlaW5nIG1vbmtleS1wYXRjaGVkPycsXG4gICAgJ1dhcm5pbmcnLCAnZnMtZXh0cmEtV0FSTjAwMDMnXG4gIClcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gRXhwb3J0IHByb21pc2VpZmllZCBncmFjZWZ1bC1mczpcbiAgLi4ucmVxdWlyZSgnLi9mcycpLFxuICAvLyBFeHBvcnQgZXh0cmEgbWV0aG9kczpcbiAgLi4ucmVxdWlyZSgnLi9jb3B5JyksXG4gIC4uLnJlcXVpcmUoJy4vZW1wdHknKSxcbiAgLi4ucmVxdWlyZSgnLi9lbnN1cmUnKSxcbiAgLi4ucmVxdWlyZSgnLi9qc29uJyksXG4gIC4uLnJlcXVpcmUoJy4vbWtkaXJzJyksXG4gIC4uLnJlcXVpcmUoJy4vbW92ZScpLFxuICAuLi5yZXF1aXJlKCcuL291dHB1dC1maWxlJyksXG4gIC4uLnJlcXVpcmUoJy4vcGF0aC1leGlzdHMnKSxcbiAgLi4ucmVxdWlyZSgnLi9yZW1vdmUnKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QganNvbkZpbGUgPSByZXF1aXJlKCcuL2pzb25maWxlJylcblxuanNvbkZpbGUub3V0cHV0SnNvbiA9IHUocmVxdWlyZSgnLi9vdXRwdXQtanNvbicpKVxuanNvbkZpbGUub3V0cHV0SnNvblN5bmMgPSByZXF1aXJlKCcuL291dHB1dC1qc29uLXN5bmMnKVxuLy8gYWxpYXNlc1xuanNvbkZpbGUub3V0cHV0SlNPTiA9IGpzb25GaWxlLm91dHB1dEpzb25cbmpzb25GaWxlLm91dHB1dEpTT05TeW5jID0ganNvbkZpbGUub3V0cHV0SnNvblN5bmNcbmpzb25GaWxlLndyaXRlSlNPTiA9IGpzb25GaWxlLndyaXRlSnNvblxuanNvbkZpbGUud3JpdGVKU09OU3luYyA9IGpzb25GaWxlLndyaXRlSnNvblN5bmNcbmpzb25GaWxlLnJlYWRKU09OID0ganNvbkZpbGUucmVhZEpzb25cbmpzb25GaWxlLnJlYWRKU09OU3luYyA9IGpzb25GaWxlLnJlYWRKc29uU3luY1xuXG5tb2R1bGUuZXhwb3J0cyA9IGpzb25GaWxlXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QganNvbkZpbGUgPSByZXF1aXJlKCdqc29uZmlsZScpXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBqc29uZmlsZSBleHBvcnRzXG4gIHJlYWRKc29uOiBqc29uRmlsZS5yZWFkRmlsZSxcbiAgcmVhZEpzb25TeW5jOiBqc29uRmlsZS5yZWFkRmlsZVN5bmMsXG4gIHdyaXRlSnNvbjoganNvbkZpbGUud3JpdGVGaWxlLFxuICB3cml0ZUpzb25TeW5jOiBqc29uRmlsZS53cml0ZUZpbGVTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBzdHJpbmdpZnkgfSA9IHJlcXVpcmUoJ2pzb25maWxlL3V0aWxzJylcbmNvbnN0IHsgb3V0cHV0RmlsZVN5bmMgfSA9IHJlcXVpcmUoJy4uL291dHB1dC1maWxlJylcblxuZnVuY3Rpb24gb3V0cHV0SnNvblN5bmMgKGZpbGUsIGRhdGEsIG9wdGlvbnMpIHtcbiAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KGRhdGEsIG9wdGlvbnMpXG5cbiAgb3V0cHV0RmlsZVN5bmMoZmlsZSwgc3RyLCBvcHRpb25zKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG91dHB1dEpzb25TeW5jXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBzdHJpbmdpZnkgfSA9IHJlcXVpcmUoJ2pzb25maWxlL3V0aWxzJylcbmNvbnN0IHsgb3V0cHV0RmlsZSB9ID0gcmVxdWlyZSgnLi4vb3V0cHV0LWZpbGUnKVxuXG5hc3luYyBmdW5jdGlvbiBvdXRwdXRKc29uIChmaWxlLCBkYXRhLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KGRhdGEsIG9wdGlvbnMpXG5cbiAgYXdhaXQgb3V0cHV0RmlsZShmaWxlLCBzdHIsIG9wdGlvbnMpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3V0cHV0SnNvblxuIiwiJ3VzZSBzdHJpY3QnXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IHsgbWFrZURpcjogX21ha2VEaXIsIG1ha2VEaXJTeW5jIH0gPSByZXF1aXJlKCcuL21ha2UtZGlyJylcbmNvbnN0IG1ha2VEaXIgPSB1KF9tYWtlRGlyKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWtkaXJzOiBtYWtlRGlyLFxuICBta2RpcnNTeW5jOiBtYWtlRGlyU3luYyxcbiAgLy8gYWxpYXNcbiAgbWtkaXJwOiBtYWtlRGlyLFxuICBta2RpcnBTeW5jOiBtYWtlRGlyU3luYyxcbiAgZW5zdXJlRGlyOiBtYWtlRGlyLFxuICBlbnN1cmVEaXJTeW5jOiBtYWtlRGlyU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHsgY2hlY2tQYXRoIH0gPSByZXF1aXJlKCcuL3V0aWxzJylcblxuY29uc3QgZ2V0TW9kZSA9IG9wdGlvbnMgPT4ge1xuICBjb25zdCBkZWZhdWx0cyA9IHsgbW9kZTogMG83NzcgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdudW1iZXInKSByZXR1cm4gb3B0aW9uc1xuICByZXR1cm4gKHsgLi4uZGVmYXVsdHMsIC4uLm9wdGlvbnMgfSkubW9kZVxufVxuXG5tb2R1bGUuZXhwb3J0cy5tYWtlRGlyID0gYXN5bmMgKGRpciwgb3B0aW9ucykgPT4ge1xuICBjaGVja1BhdGgoZGlyKVxuXG4gIHJldHVybiBmcy5ta2RpcihkaXIsIHtcbiAgICBtb2RlOiBnZXRNb2RlKG9wdGlvbnMpLFxuICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cy5tYWtlRGlyU3luYyA9IChkaXIsIG9wdGlvbnMpID0+IHtcbiAgY2hlY2tQYXRoKGRpcilcblxuICByZXR1cm4gZnMubWtkaXJTeW5jKGRpciwge1xuICAgIG1vZGU6IGdldE1vZGUob3B0aW9ucyksXG4gICAgcmVjdXJzaXZlOiB0cnVlXG4gIH0pXG59XG4iLCIvLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9tYWtlLWRpclxuLy8gQ29weXJpZ2h0IChjKSBTaW5kcmUgU29yaHVzIDxzaW5kcmVzb3JodXNAZ21haWwuY29tPiAoc2luZHJlc29yaHVzLmNvbSlcbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuJ3VzZSBzdHJpY3QnXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvODk4N1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpYnV2L2xpYnV2L3B1bGwvMTA4OFxubW9kdWxlLmV4cG9ydHMuY2hlY2tQYXRoID0gZnVuY3Rpb24gY2hlY2tQYXRoIChwdGgpIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBjb25zdCBwYXRoSGFzSW52YWxpZFdpbkNoYXJhY3RlcnMgPSAvWzw+OlwifD8qXS8udGVzdChwdGgucmVwbGFjZShwYXRoLnBhcnNlKHB0aCkucm9vdCwgJycpKVxuXG4gICAgaWYgKHBhdGhIYXNJbnZhbGlkV2luQ2hhcmFjdGVycykge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYFBhdGggY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzOiAke3B0aH1gKVxuICAgICAgZXJyb3IuY29kZSA9ICdFSU5WQUwnXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1vdmU6IHUocmVxdWlyZSgnLi9tb3ZlJykpLFxuICBtb3ZlU3luYzogcmVxdWlyZSgnLi9tb3ZlLXN5bmMnKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgY29weVN5bmMgPSByZXF1aXJlKCcuLi9jb3B5JykuY29weVN5bmNcbmNvbnN0IHJlbW92ZVN5bmMgPSByZXF1aXJlKCcuLi9yZW1vdmUnKS5yZW1vdmVTeW5jXG5jb25zdCBta2RpcnBTeW5jID0gcmVxdWlyZSgnLi4vbWtkaXJzJykubWtkaXJwU3luY1xuY29uc3Qgc3RhdCA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmZ1bmN0aW9uIG1vdmVTeW5jIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgY29uc3Qgb3ZlcndyaXRlID0gb3B0cy5vdmVyd3JpdGUgfHwgb3B0cy5jbG9iYmVyIHx8IGZhbHNlXG5cbiAgY29uc3QgeyBzcmNTdGF0LCBpc0NoYW5naW5nQ2FzZSA9IGZhbHNlIH0gPSBzdGF0LmNoZWNrUGF0aHNTeW5jKHNyYywgZGVzdCwgJ21vdmUnLCBvcHRzKVxuICBzdGF0LmNoZWNrUGFyZW50UGF0aHNTeW5jKHNyYywgc3JjU3RhdCwgZGVzdCwgJ21vdmUnKVxuICBpZiAoIWlzUGFyZW50Um9vdChkZXN0KSkgbWtkaXJwU3luYyhwYXRoLmRpcm5hbWUoZGVzdCkpXG4gIHJldHVybiBkb1JlbmFtZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSwgaXNDaGFuZ2luZ0Nhc2UpXG59XG5cbmZ1bmN0aW9uIGlzUGFyZW50Um9vdCAoZGVzdCkge1xuICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGVzdClcbiAgY29uc3QgcGFyc2VkUGF0aCA9IHBhdGgucGFyc2UocGFyZW50KVxuICByZXR1cm4gcGFyc2VkUGF0aC5yb290ID09PSBwYXJlbnRcbn1cblxuZnVuY3Rpb24gZG9SZW5hbWUgKHNyYywgZGVzdCwgb3ZlcndyaXRlLCBpc0NoYW5naW5nQ2FzZSkge1xuICBpZiAoaXNDaGFuZ2luZ0Nhc2UpIHJldHVybiByZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG4gIGlmIChvdmVyd3JpdGUpIHtcbiAgICByZW1vdmVTeW5jKGRlc3QpXG4gICAgcmV0dXJuIHJlbmFtZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSlcbiAgfVxuICBpZiAoZnMuZXhpc3RzU3luYyhkZXN0KSkgdGhyb3cgbmV3IEVycm9yKCdkZXN0IGFscmVhZHkgZXhpc3RzLicpXG4gIHJldHVybiByZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG59XG5cbmZ1bmN0aW9uIHJlbmFtZSAoc3JjLCBkZXN0LCBvdmVyd3JpdGUpIHtcbiAgdHJ5IHtcbiAgICBmcy5yZW5hbWVTeW5jKHNyYywgZGVzdClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlICE9PSAnRVhERVYnKSB0aHJvdyBlcnJcbiAgICByZXR1cm4gbW92ZUFjcm9zc0RldmljZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlQWNyb3NzRGV2aWNlIChzcmMsIGRlc3QsIG92ZXJ3cml0ZSkge1xuICBjb25zdCBvcHRzID0ge1xuICAgIG92ZXJ3cml0ZSxcbiAgICBlcnJvck9uRXhpc3Q6IHRydWUsXG4gICAgcHJlc2VydmVUaW1lc3RhbXBzOiB0cnVlXG4gIH1cbiAgY29weVN5bmMoc3JjLCBkZXN0LCBvcHRzKVxuICByZXR1cm4gcmVtb3ZlU3luYyhzcmMpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbW92ZVN5bmNcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IHsgY29weSB9ID0gcmVxdWlyZSgnLi4vY29weScpXG5jb25zdCB7IHJlbW92ZSB9ID0gcmVxdWlyZSgnLi4vcmVtb3ZlJylcbmNvbnN0IHsgbWtkaXJwIH0gPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuY29uc3QgeyBwYXRoRXhpc3RzIH0gPSByZXF1aXJlKCcuLi9wYXRoLWV4aXN0cycpXG5jb25zdCBzdGF0ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuYXN5bmMgZnVuY3Rpb24gbW92ZSAoc3JjLCBkZXN0LCBvcHRzID0ge30pIHtcbiAgY29uc3Qgb3ZlcndyaXRlID0gb3B0cy5vdmVyd3JpdGUgfHwgb3B0cy5jbG9iYmVyIHx8IGZhbHNlXG5cbiAgY29uc3QgeyBzcmNTdGF0LCBpc0NoYW5naW5nQ2FzZSA9IGZhbHNlIH0gPSBhd2FpdCBzdGF0LmNoZWNrUGF0aHMoc3JjLCBkZXN0LCAnbW92ZScsIG9wdHMpXG5cbiAgYXdhaXQgc3RhdC5jaGVja1BhcmVudFBhdGhzKHNyYywgc3JjU3RhdCwgZGVzdCwgJ21vdmUnKVxuXG4gIC8vIElmIHRoZSBwYXJlbnQgb2YgZGVzdCBpcyBub3Qgcm9vdCwgbWFrZSBzdXJlIGl0IGV4aXN0cyBiZWZvcmUgcHJvY2VlZGluZ1xuICBjb25zdCBkZXN0UGFyZW50ID0gcGF0aC5kaXJuYW1lKGRlc3QpXG4gIGNvbnN0IHBhcnNlZFBhcmVudFBhdGggPSBwYXRoLnBhcnNlKGRlc3RQYXJlbnQpXG4gIGlmIChwYXJzZWRQYXJlbnRQYXRoLnJvb3QgIT09IGRlc3RQYXJlbnQpIHtcbiAgICBhd2FpdCBta2RpcnAoZGVzdFBhcmVudClcbiAgfVxuXG4gIHJldHVybiBkb1JlbmFtZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSwgaXNDaGFuZ2luZ0Nhc2UpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvUmVuYW1lIChzcmMsIGRlc3QsIG92ZXJ3cml0ZSwgaXNDaGFuZ2luZ0Nhc2UpIHtcbiAgaWYgKCFpc0NoYW5naW5nQ2FzZSkge1xuICAgIGlmIChvdmVyd3JpdGUpIHtcbiAgICAgIGF3YWl0IHJlbW92ZShkZXN0KVxuICAgIH0gZWxzZSBpZiAoYXdhaXQgcGF0aEV4aXN0cyhkZXN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXN0IGFscmVhZHkgZXhpc3RzLicpXG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUcnkgdy8gcmVuYW1lIGZpcnN0LCBhbmQgdHJ5IGNvcHkgKyByZW1vdmUgaWYgRVhERVZcbiAgICBhd2FpdCBmcy5yZW5hbWUoc3JjLCBkZXN0KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLmNvZGUgIT09ICdFWERFVicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBhd2FpdCBtb3ZlQWNyb3NzRGV2aWNlKHNyYywgZGVzdCwgb3ZlcndyaXRlKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1vdmVBY3Jvc3NEZXZpY2UgKHNyYywgZGVzdCwgb3ZlcndyaXRlKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgb3ZlcndyaXRlLFxuICAgIGVycm9yT25FeGlzdDogdHJ1ZSxcbiAgICBwcmVzZXJ2ZVRpbWVzdGFtcHM6IHRydWVcbiAgfVxuXG4gIGF3YWl0IGNvcHkoc3JjLCBkZXN0LCBvcHRzKVxuICByZXR1cm4gcmVtb3ZlKHNyYylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtb3ZlXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IG1rZGlyID0gcmVxdWlyZSgnLi4vbWtkaXJzJylcbmNvbnN0IHBhdGhFeGlzdHMgPSByZXF1aXJlKCcuLi9wYXRoLWV4aXN0cycpLnBhdGhFeGlzdHNcblxuYXN5bmMgZnVuY3Rpb24gb3V0cHV0RmlsZSAoZmlsZSwgZGF0YSwgZW5jb2RpbmcgPSAndXRmLTgnKSB7XG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShmaWxlKVxuXG4gIGlmICghKGF3YWl0IHBhdGhFeGlzdHMoZGlyKSkpIHtcbiAgICBhd2FpdCBta2Rpci5ta2RpcnMoZGlyKVxuICB9XG5cbiAgcmV0dXJuIGZzLndyaXRlRmlsZShmaWxlLCBkYXRhLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gb3V0cHV0RmlsZVN5bmMgKGZpbGUsIC4uLmFyZ3MpIHtcbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGZpbGUpXG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSB7XG4gICAgbWtkaXIubWtkaXJzU3luYyhkaXIpXG4gIH1cblxuICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIC4uLmFyZ3MpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBvdXRwdXRGaWxlOiB1KG91dHB1dEZpbGUpLFxuICBvdXRwdXRGaWxlU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuXG5mdW5jdGlvbiBwYXRoRXhpc3RzIChwYXRoKSB7XG4gIHJldHVybiBmcy5hY2Nlc3MocGF0aCkudGhlbigoKSA9PiB0cnVlKS5jYXRjaCgoKSA9PiBmYWxzZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBhdGhFeGlzdHM6IHUocGF0aEV4aXN0cyksXG4gIHBhdGhFeGlzdHNTeW5jOiBmcy5leGlzdHNTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCdncmFjZWZ1bC1mcycpXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbUNhbGxiYWNrXG5cbmZ1bmN0aW9uIHJlbW92ZSAocGF0aCwgY2FsbGJhY2spIHtcbiAgZnMucm0ocGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0sIGNhbGxiYWNrKVxufVxuXG5mdW5jdGlvbiByZW1vdmVTeW5jIChwYXRoKSB7XG4gIGZzLnJtU3luYyhwYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJlbW92ZTogdShyZW1vdmUpLFxuICByZW1vdmVTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcblxuZnVuY3Rpb24gZ2V0U3RhdHMgKHNyYywgZGVzdCwgb3B0cykge1xuICBjb25zdCBzdGF0RnVuYyA9IG9wdHMuZGVyZWZlcmVuY2VcbiAgICA/IChmaWxlKSA9PiBmcy5zdGF0KGZpbGUsIHsgYmlnaW50OiB0cnVlIH0pXG4gICAgOiAoZmlsZSkgPT4gZnMubHN0YXQoZmlsZSwgeyBiaWdpbnQ6IHRydWUgfSlcbiAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICBzdGF0RnVuYyhzcmMpLFxuICAgIHN0YXRGdW5jKGRlc3QpLmNhdGNoKGVyciA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gbnVsbFxuICAgICAgdGhyb3cgZXJyXG4gICAgfSlcbiAgXSkudGhlbigoW3NyY1N0YXQsIGRlc3RTdGF0XSkgPT4gKHsgc3JjU3RhdCwgZGVzdFN0YXQgfSkpXG59XG5cbmZ1bmN0aW9uIGdldFN0YXRzU3luYyAoc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGxldCBkZXN0U3RhdFxuICBjb25zdCBzdGF0RnVuYyA9IG9wdHMuZGVyZWZlcmVuY2VcbiAgICA/IChmaWxlKSA9PiBmcy5zdGF0U3luYyhmaWxlLCB7IGJpZ2ludDogdHJ1ZSB9KVxuICAgIDogKGZpbGUpID0+IGZzLmxzdGF0U3luYyhmaWxlLCB7IGJpZ2ludDogdHJ1ZSB9KVxuICBjb25zdCBzcmNTdGF0ID0gc3RhdEZ1bmMoc3JjKVxuICB0cnkge1xuICAgIGRlc3RTdGF0ID0gc3RhdEZ1bmMoZGVzdClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIHsgc3JjU3RhdCwgZGVzdFN0YXQ6IG51bGwgfVxuICAgIHRocm93IGVyclxuICB9XG4gIHJldHVybiB7IHNyY1N0YXQsIGRlc3RTdGF0IH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tQYXRocyAoc3JjLCBkZXN0LCBmdW5jTmFtZSwgb3B0cykge1xuICBjb25zdCB7IHNyY1N0YXQsIGRlc3RTdGF0IH0gPSBhd2FpdCBnZXRTdGF0cyhzcmMsIGRlc3QsIG9wdHMpXG4gIGlmIChkZXN0U3RhdCkge1xuICAgIGlmIChhcmVJZGVudGljYWwoc3JjU3RhdCwgZGVzdFN0YXQpKSB7XG4gICAgICBjb25zdCBzcmNCYXNlTmFtZSA9IHBhdGguYmFzZW5hbWUoc3JjKVxuICAgICAgY29uc3QgZGVzdEJhc2VOYW1lID0gcGF0aC5iYXNlbmFtZShkZXN0KVxuICAgICAgaWYgKGZ1bmNOYW1lID09PSAnbW92ZScgJiZcbiAgICAgICAgc3JjQmFzZU5hbWUgIT09IGRlc3RCYXNlTmFtZSAmJlxuICAgICAgICBzcmNCYXNlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBkZXN0QmFzZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICByZXR1cm4geyBzcmNTdGF0LCBkZXN0U3RhdCwgaXNDaGFuZ2luZ0Nhc2U6IHRydWUgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG11c3Qgbm90IGJlIHRoZSBzYW1lLicpXG4gICAgfVxuICAgIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkgJiYgIWRlc3RTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG92ZXJ3cml0ZSBub24tZGlyZWN0b3J5ICcke2Rlc3R9JyB3aXRoIGRpcmVjdG9yeSAnJHtzcmN9Jy5gKVxuICAgIH1cbiAgICBpZiAoIXNyY1N0YXQuaXNEaXJlY3RvcnkoKSAmJiBkZXN0U3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgZGlyZWN0b3J5ICcke2Rlc3R9JyB3aXRoIG5vbi1kaXJlY3RvcnkgJyR7c3JjfScuYClcbiAgICB9XG4gIH1cblxuICBpZiAoc3JjU3RhdC5pc0RpcmVjdG9yeSgpICYmIGlzU3JjU3ViZGlyKHNyYywgZGVzdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKHNyYywgZGVzdCwgZnVuY05hbWUpKVxuICB9XG5cbiAgcmV0dXJuIHsgc3JjU3RhdCwgZGVzdFN0YXQgfVxufVxuXG5mdW5jdGlvbiBjaGVja1BhdGhzU3luYyAoc3JjLCBkZXN0LCBmdW5jTmFtZSwgb3B0cykge1xuICBjb25zdCB7IHNyY1N0YXQsIGRlc3RTdGF0IH0gPSBnZXRTdGF0c1N5bmMoc3JjLCBkZXN0LCBvcHRzKVxuXG4gIGlmIChkZXN0U3RhdCkge1xuICAgIGlmIChhcmVJZGVudGljYWwoc3JjU3RhdCwgZGVzdFN0YXQpKSB7XG4gICAgICBjb25zdCBzcmNCYXNlTmFtZSA9IHBhdGguYmFzZW5hbWUoc3JjKVxuICAgICAgY29uc3QgZGVzdEJhc2VOYW1lID0gcGF0aC5iYXNlbmFtZShkZXN0KVxuICAgICAgaWYgKGZ1bmNOYW1lID09PSAnbW92ZScgJiZcbiAgICAgICAgc3JjQmFzZU5hbWUgIT09IGRlc3RCYXNlTmFtZSAmJlxuICAgICAgICBzcmNCYXNlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBkZXN0QmFzZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICByZXR1cm4geyBzcmNTdGF0LCBkZXN0U3RhdCwgaXNDaGFuZ2luZ0Nhc2U6IHRydWUgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG11c3Qgbm90IGJlIHRoZSBzYW1lLicpXG4gICAgfVxuICAgIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkgJiYgIWRlc3RTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG92ZXJ3cml0ZSBub24tZGlyZWN0b3J5ICcke2Rlc3R9JyB3aXRoIGRpcmVjdG9yeSAnJHtzcmN9Jy5gKVxuICAgIH1cbiAgICBpZiAoIXNyY1N0YXQuaXNEaXJlY3RvcnkoKSAmJiBkZXN0U3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgZGlyZWN0b3J5ICcke2Rlc3R9JyB3aXRoIG5vbi1kaXJlY3RvcnkgJyR7c3JjfScuYClcbiAgICB9XG4gIH1cblxuICBpZiAoc3JjU3RhdC5pc0RpcmVjdG9yeSgpICYmIGlzU3JjU3ViZGlyKHNyYywgZGVzdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKHNyYywgZGVzdCwgZnVuY05hbWUpKVxuICB9XG4gIHJldHVybiB7IHNyY1N0YXQsIGRlc3RTdGF0IH1cbn1cblxuLy8gcmVjdXJzaXZlbHkgY2hlY2sgaWYgZGVzdCBwYXJlbnQgaXMgYSBzdWJkaXJlY3Rvcnkgb2Ygc3JjLlxuLy8gSXQgd29ya3MgZm9yIGFsbCBmaWxlIHR5cGVzIGluY2x1ZGluZyBzeW1saW5rcyBzaW5jZSBpdFxuLy8gY2hlY2tzIHRoZSBzcmMgYW5kIGRlc3QgaW5vZGVzLiBJdCBzdGFydHMgZnJvbSB0aGUgZGVlcGVzdFxuLy8gcGFyZW50IGFuZCBzdG9wcyBvbmNlIGl0IHJlYWNoZXMgdGhlIHNyYyBwYXJlbnQgb3IgdGhlIHJvb3QgcGF0aC5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUGFyZW50UGF0aHMgKHNyYywgc3JjU3RhdCwgZGVzdCwgZnVuY05hbWUpIHtcbiAgY29uc3Qgc3JjUGFyZW50ID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShzcmMpKVxuICBjb25zdCBkZXN0UGFyZW50ID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShkZXN0KSlcbiAgaWYgKGRlc3RQYXJlbnQgPT09IHNyY1BhcmVudCB8fCBkZXN0UGFyZW50ID09PSBwYXRoLnBhcnNlKGRlc3RQYXJlbnQpLnJvb3QpIHJldHVyblxuXG4gIGxldCBkZXN0U3RhdFxuICB0cnkge1xuICAgIGRlc3RTdGF0ID0gYXdhaXQgZnMuc3RhdChkZXN0UGFyZW50LCB7IGJpZ2ludDogdHJ1ZSB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm5cbiAgICB0aHJvdyBlcnJcbiAgfVxuXG4gIGlmIChhcmVJZGVudGljYWwoc3JjU3RhdCwgZGVzdFN0YXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyhzcmMsIGRlc3QsIGZ1bmNOYW1lKSlcbiAgfVxuXG4gIHJldHVybiBjaGVja1BhcmVudFBhdGhzKHNyYywgc3JjU3RhdCwgZGVzdFBhcmVudCwgZnVuY05hbWUpXG59XG5cbmZ1bmN0aW9uIGNoZWNrUGFyZW50UGF0aHNTeW5jIChzcmMsIHNyY1N0YXQsIGRlc3QsIGZ1bmNOYW1lKSB7XG4gIGNvbnN0IHNyY1BhcmVudCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUoc3JjKSlcbiAgY29uc3QgZGVzdFBhcmVudCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUoZGVzdCkpXG4gIGlmIChkZXN0UGFyZW50ID09PSBzcmNQYXJlbnQgfHwgZGVzdFBhcmVudCA9PT0gcGF0aC5wYXJzZShkZXN0UGFyZW50KS5yb290KSByZXR1cm5cbiAgbGV0IGRlc3RTdGF0XG4gIHRyeSB7XG4gICAgZGVzdFN0YXQgPSBmcy5zdGF0U3luYyhkZXN0UGFyZW50LCB7IGJpZ2ludDogdHJ1ZSB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm5cbiAgICB0aHJvdyBlcnJcbiAgfVxuICBpZiAoYXJlSWRlbnRpY2FsKHNyY1N0YXQsIGRlc3RTdGF0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2coc3JjLCBkZXN0LCBmdW5jTmFtZSkpXG4gIH1cbiAgcmV0dXJuIGNoZWNrUGFyZW50UGF0aHNTeW5jKHNyYywgc3JjU3RhdCwgZGVzdFBhcmVudCwgZnVuY05hbWUpXG59XG5cbmZ1bmN0aW9uIGFyZUlkZW50aWNhbCAoc3JjU3RhdCwgZGVzdFN0YXQpIHtcbiAgcmV0dXJuIGRlc3RTdGF0LmlubyAmJiBkZXN0U3RhdC5kZXYgJiYgZGVzdFN0YXQuaW5vID09PSBzcmNTdGF0LmlubyAmJiBkZXN0U3RhdC5kZXYgPT09IHNyY1N0YXQuZGV2XG59XG5cbi8vIHJldHVybiB0cnVlIGlmIGRlc3QgaXMgYSBzdWJkaXIgb2Ygc3JjLCBvdGhlcndpc2UgZmFsc2UuXG4vLyBJdCBvbmx5IGNoZWNrcyB0aGUgcGF0aCBzdHJpbmdzLlxuZnVuY3Rpb24gaXNTcmNTdWJkaXIgKHNyYywgZGVzdCkge1xuICBjb25zdCBzcmNBcnIgPSBwYXRoLnJlc29sdmUoc3JjKS5zcGxpdChwYXRoLnNlcCkuZmlsdGVyKGkgPT4gaSlcbiAgY29uc3QgZGVzdEFyciA9IHBhdGgucmVzb2x2ZShkZXN0KS5zcGxpdChwYXRoLnNlcCkuZmlsdGVyKGkgPT4gaSlcbiAgcmV0dXJuIHNyY0Fyci5ldmVyeSgoY3VyLCBpKSA9PiBkZXN0QXJyW2ldID09PSBjdXIpXG59XG5cbmZ1bmN0aW9uIGVyck1zZyAoc3JjLCBkZXN0LCBmdW5jTmFtZSkge1xuICByZXR1cm4gYENhbm5vdCAke2Z1bmNOYW1lfSAnJHtzcmN9JyB0byBhIHN1YmRpcmVjdG9yeSBvZiBpdHNlbGYsICcke2Rlc3R9Jy5gXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBjaGVja1BhdGhzXG4gIGNoZWNrUGF0aHM6IHUoY2hlY2tQYXRocyksXG4gIGNoZWNrUGF0aHNTeW5jLFxuICAvLyBjaGVja1BhcmVudFxuICBjaGVja1BhcmVudFBhdGhzOiB1KGNoZWNrUGFyZW50UGF0aHMpLFxuICBjaGVja1BhcmVudFBhdGhzU3luYyxcbiAgLy8gTWlzY1xuICBpc1NyY1N1YmRpcixcbiAgYXJlSWRlbnRpY2FsXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcblxuYXN5bmMgZnVuY3Rpb24gdXRpbWVzTWlsbGlzIChwYXRoLCBhdGltZSwgbXRpbWUpIHtcbiAgLy8gaWYgKCFIQVNfTUlMTElTX1JFUykgcmV0dXJuIGZzLnV0aW1lcyhwYXRoLCBhdGltZSwgbXRpbWUsIGNhbGxiYWNrKVxuICBjb25zdCBmZCA9IGF3YWl0IGZzLm9wZW4ocGF0aCwgJ3IrJylcblxuICBsZXQgY2xvc2VFcnIgPSBudWxsXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5mdXRpbWVzKGZkLCBhdGltZSwgbXRpbWUpXG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmNsb3NlKGZkKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNsb3NlRXJyID0gZVxuICAgIH1cbiAgfVxuXG4gIGlmIChjbG9zZUVycikge1xuICAgIHRocm93IGNsb3NlRXJyXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRpbWVzTWlsbGlzU3luYyAocGF0aCwgYXRpbWUsIG10aW1lKSB7XG4gIGNvbnN0IGZkID0gZnMub3BlblN5bmMocGF0aCwgJ3IrJylcbiAgZnMuZnV0aW1lc1N5bmMoZmQsIGF0aW1lLCBtdGltZSlcbiAgcmV0dXJuIGZzLmNsb3NlU3luYyhmZClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHV0aW1lc01pbGxpczogdSh1dGltZXNNaWxsaXMpLFxuICB1dGltZXNNaWxsaXNTeW5jXG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIENhbGwgdGhpcyBmdW5jdGlvbiBpbiBhIGFub3RoZXIgZnVuY3Rpb24gdG8gZmluZCBvdXQgdGhlIGZpbGUgZnJvbVxuLy8gd2hpY2ggdGhhdCBmdW5jdGlvbiB3YXMgY2FsbGVkIGZyb20uIChJbnNwZWN0cyB0aGUgdjggc3RhY2sgdHJhY2UpXG4vL1xuLy8gSW5zcGlyZWQgYnkgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMzIyNzQ4OVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRDYWxsZXJGaWxlKHBvc2l0aW9uKSB7XG4gICAgaWYgKHBvc2l0aW9uID09PSB2b2lkIDApIHsgcG9zaXRpb24gPSAyOyB9XG4gICAgaWYgKHBvc2l0aW9uID49IEVycm9yLnN0YWNrVHJhY2VMaW1pdCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdnZXRDYWxsZXJGaWxlKHBvc2l0aW9uKSByZXF1aXJlcyBwb3NpdGlvbiBiZSBsZXNzIHRoZW4gRXJyb3Iuc3RhY2tUcmFjZUxpbWl0IGJ1dCBwb3NpdGlvbiB3YXM6IGAnICsgcG9zaXRpb24gKyAnYCBhbmQgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0IHdhczogYCcgKyBFcnJvci5zdGFja1RyYWNlTGltaXQgKyAnYCcpO1xuICAgIH1cbiAgICB2YXIgb2xkUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtcbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IGZ1bmN0aW9uIChfLCBzdGFjaykgeyByZXR1cm4gc3RhY2s7IH07XG4gICAgdmFyIHN0YWNrID0gbmV3IEVycm9yKCkuc3RhY2s7XG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBvbGRQcmVwYXJlU3RhY2tUcmFjZTtcbiAgICBpZiAoc3RhY2sgIT09IG51bGwgJiYgdHlwZW9mIHN0YWNrID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBzdGFja1swXSBob2xkcyB0aGlzIGZpbGVcbiAgICAgICAgLy8gc3RhY2tbMV0gaG9sZHMgd2hlcmUgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkXG4gICAgICAgIC8vIHN0YWNrWzJdIGhvbGRzIHRoZSBmaWxlIHdlJ3JlIGludGVyZXN0ZWQgaW5cbiAgICAgICAgcmV0dXJuIHN0YWNrW3Bvc2l0aW9uXSA/IHN0YWNrW3Bvc2l0aW9uXS5nZXRGaWxlTmFtZSgpIDogdW5kZWZpbmVkO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5jb25zdCB7UGFzc1Rocm91Z2g6IFBhc3NUaHJvdWdoU3RyZWFtfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG9wdGlvbnMgPT4ge1xuXHRvcHRpb25zID0gey4uLm9wdGlvbnN9O1xuXG5cdGNvbnN0IHthcnJheX0gPSBvcHRpb25zO1xuXHRsZXQge2VuY29kaW5nfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzQnVmZmVyID0gZW5jb2RpbmcgPT09ICdidWZmZXInO1xuXHRsZXQgb2JqZWN0TW9kZSA9IGZhbHNlO1xuXG5cdGlmIChhcnJheSkge1xuXHRcdG9iamVjdE1vZGUgPSAhKGVuY29kaW5nIHx8IGlzQnVmZmVyKTtcblx0fSBlbHNlIHtcblx0XHRlbmNvZGluZyA9IGVuY29kaW5nIHx8ICd1dGY4Jztcblx0fVxuXG5cdGlmIChpc0J1ZmZlcikge1xuXHRcdGVuY29kaW5nID0gbnVsbDtcblx0fVxuXG5cdGNvbnN0IHN0cmVhbSA9IG5ldyBQYXNzVGhyb3VnaFN0cmVhbSh7b2JqZWN0TW9kZX0pO1xuXG5cdGlmIChlbmNvZGluZykge1xuXHRcdHN0cmVhbS5zZXRFbmNvZGluZyhlbmNvZGluZyk7XG5cdH1cblxuXHRsZXQgbGVuZ3RoID0gMDtcblx0Y29uc3QgY2h1bmtzID0gW107XG5cblx0c3RyZWFtLm9uKCdkYXRhJywgY2h1bmsgPT4ge1xuXHRcdGNodW5rcy5wdXNoKGNodW5rKTtcblxuXHRcdGlmIChvYmplY3RNb2RlKSB7XG5cdFx0XHRsZW5ndGggPSBjaHVua3MubGVuZ3RoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZW5ndGggKz0gY2h1bmsubGVuZ3RoO1xuXHRcdH1cblx0fSk7XG5cblx0c3RyZWFtLmdldEJ1ZmZlcmVkVmFsdWUgPSAoKSA9PiB7XG5cdFx0aWYgKGFycmF5KSB7XG5cdFx0XHRyZXR1cm4gY2h1bmtzO1xuXHRcdH1cblxuXHRcdHJldHVybiBpc0J1ZmZlciA/IEJ1ZmZlci5jb25jYXQoY2h1bmtzLCBsZW5ndGgpIDogY2h1bmtzLmpvaW4oJycpO1xuXHR9O1xuXG5cdHN0cmVhbS5nZXRCdWZmZXJlZExlbmd0aCA9ICgpID0+IGxlbmd0aDtcblxuXHRyZXR1cm4gc3RyZWFtO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IHtjb25zdGFudHM6IEJ1ZmZlckNvbnN0YW50c30gPSByZXF1aXJlKCdidWZmZXInKTtcbmNvbnN0IHB1bXAgPSByZXF1aXJlKCdwdW1wJyk7XG5jb25zdCBidWZmZXJTdHJlYW0gPSByZXF1aXJlKCcuL2J1ZmZlci1zdHJlYW0nKTtcblxuY2xhc3MgTWF4QnVmZmVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCdtYXhCdWZmZXIgZXhjZWVkZWQnKTtcblx0XHR0aGlzLm5hbWUgPSAnTWF4QnVmZmVyRXJyb3InO1xuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFN0cmVhbShpbnB1dFN0cmVhbSwgb3B0aW9ucykge1xuXHRpZiAoIWlucHV0U3RyZWFtKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignRXhwZWN0ZWQgYSBzdHJlYW0nKSk7XG5cdH1cblxuXHRvcHRpb25zID0ge1xuXHRcdG1heEJ1ZmZlcjogSW5maW5pdHksXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXG5cdGNvbnN0IHttYXhCdWZmZXJ9ID0gb3B0aW9ucztcblxuXHRsZXQgc3RyZWFtO1xuXHRhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0Y29uc3QgcmVqZWN0UHJvbWlzZSA9IGVycm9yID0+IHtcblx0XHRcdC8vIERvbid0IHJldHJpZXZlIGFuIG92ZXJzaXplZCBidWZmZXIuXG5cdFx0XHRpZiAoZXJyb3IgJiYgc3RyZWFtLmdldEJ1ZmZlcmVkTGVuZ3RoKCkgPD0gQnVmZmVyQ29uc3RhbnRzLk1BWF9MRU5HVEgpIHtcblx0XHRcdFx0ZXJyb3IuYnVmZmVyZWREYXRhID0gc3RyZWFtLmdldEJ1ZmZlcmVkVmFsdWUoKTtcblx0XHRcdH1cblxuXHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHR9O1xuXG5cdFx0c3RyZWFtID0gcHVtcChpbnB1dFN0cmVhbSwgYnVmZmVyU3RyZWFtKG9wdGlvbnMpLCBlcnJvciA9PiB7XG5cdFx0XHRpZiAoZXJyb3IpIHtcblx0XHRcdFx0cmVqZWN0UHJvbWlzZShlcnJvcik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0cmVzb2x2ZSgpO1xuXHRcdH0pO1xuXG5cdFx0c3RyZWFtLm9uKCdkYXRhJywgKCkgPT4ge1xuXHRcdFx0aWYgKHN0cmVhbS5nZXRCdWZmZXJlZExlbmd0aCgpID4gbWF4QnVmZmVyKSB7XG5cdFx0XHRcdHJlamVjdFByb21pc2UobmV3IE1heEJ1ZmZlckVycm9yKCkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblxuXHRyZXR1cm4gc3RyZWFtLmdldEJ1ZmZlcmVkVmFsdWUoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRTdHJlYW07XG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBmb3IgdGhlIG5leHQgbWFqb3IgcmVsZWFzZVxubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IGdldFN0cmVhbTtcbm1vZHVsZS5leHBvcnRzLmJ1ZmZlciA9IChzdHJlYW0sIG9wdGlvbnMpID0+IGdldFN0cmVhbShzdHJlYW0sIHsuLi5vcHRpb25zLCBlbmNvZGluZzogJ2J1ZmZlcid9KTtcbm1vZHVsZS5leHBvcnRzLmFycmF5ID0gKHN0cmVhbSwgb3B0aW9ucykgPT4gZ2V0U3RyZWFtKHN0cmVhbSwgey4uLm9wdGlvbnMsIGFycmF5OiB0cnVlfSk7XG5tb2R1bGUuZXhwb3J0cy5NYXhCdWZmZXJFcnJvciA9IE1heEJ1ZmZlckVycm9yO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRhdGEgPSB2b2lkIDA7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jb25zdCBjcnlwdG9fMSA9IHJlcXVpcmUoXCJjcnlwdG9cIik7XG5jb25zdCBkYXRhX3VyaV90b19idWZmZXJfMSA9IHJlcXVpcmUoXCJkYXRhLXVyaS10by1idWZmZXJcIik7XG5jb25zdCBub3Rtb2RpZmllZF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL25vdG1vZGlmaWVkXCIpKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2dldC11cmk6ZGF0YScpO1xuY2xhc3MgRGF0YVJlYWRhYmxlIGV4dGVuZHMgc3RyZWFtXzEuUmVhZGFibGUge1xuICAgIGNvbnN0cnVjdG9yKGhhc2gsIGJ1Zikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnB1c2goYnVmKTtcbiAgICAgICAgdGhpcy5wdXNoKG51bGwpO1xuICAgICAgICB0aGlzLmhhc2ggPSBoYXNoO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyBhIFJlYWRhYmxlIHN0cmVhbSBmcm9tIGEgXCJkYXRhOlwiIFVSSS5cbiAqL1xuY29uc3QgZGF0YSA9IGFzeW5jICh7IGhyZWY6IHVyaSB9LCB7IGNhY2hlIH0gPSB7fSkgPT4ge1xuICAgIC8vIG5lZWQgdG8gY3JlYXRlIGEgU0hBMSBoYXNoIG9mIHRoZSBVUkkgc3RyaW5nLCBmb3IgY2FjaGVhYmlsaXR5IGNoZWNrc1xuICAgIC8vIGluIGZ1dHVyZSBgZ2V0VXJpKClgIGNhbGxzIHdpdGggdGhlIHNhbWUgZGF0YSBVUkkgcGFzc2VkIGluLlxuICAgIGNvbnN0IHNoYXN1bSA9ICgwLCBjcnlwdG9fMS5jcmVhdGVIYXNoKSgnc2hhMScpO1xuICAgIHNoYXN1bS51cGRhdGUodXJpKTtcbiAgICBjb25zdCBoYXNoID0gc2hhc3VtLmRpZ2VzdCgnaGV4Jyk7XG4gICAgZGVidWcoJ2dlbmVyYXRlZCBTSEExIGhhc2ggZm9yIFwiZGF0YTpcIiBVUkk6ICVvJywgaGFzaCk7XG4gICAgLy8gY2hlY2sgaWYgdGhlIGNhY2hlIGlzIHRoZSBzYW1lIFwiZGF0YTpcIiBVUkkgdGhhdCB3YXMgcHJldmlvdXNseSBwYXNzZWQgaW4uXG4gICAgaWYgKGNhY2hlPy5oYXNoID09PSBoYXNoKSB7XG4gICAgICAgIGRlYnVnKCdnb3QgbWF0Y2hpbmcgY2FjaGUgU0hBMSBoYXNoOiAlbycsIGhhc2gpO1xuICAgICAgICB0aHJvdyBuZXcgbm90bW9kaWZpZWRfMS5kZWZhdWx0KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkZWJ1ZygnY3JlYXRpbmcgUmVhZGFibGUgc3RyZWFtIGZyb20gXCJkYXRhOlwiIFVSSSBidWZmZXInKTtcbiAgICAgICAgY29uc3QgeyBidWZmZXIgfSA9ICgwLCBkYXRhX3VyaV90b19idWZmZXJfMS5kYXRhVXJpVG9CdWZmZXIpKHVyaSk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YVJlYWRhYmxlKGhhc2gsIEJ1ZmZlci5mcm9tKGJ1ZmZlcikpO1xuICAgIH1cbn07XG5leHBvcnRzLmRhdGEgPSBkYXRhO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZmlsZSA9IHZvaWQgMDtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IGZzXzEgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCBmc19leHRyYV8xID0gcmVxdWlyZShcImZzLWV4dHJhXCIpO1xuY29uc3Qgbm90Zm91bmRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9ub3Rmb3VuZFwiKSk7XG5jb25zdCBub3Rtb2RpZmllZF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL25vdG1vZGlmaWVkXCIpKTtcbmNvbnN0IHVybF8xID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2dldC11cmk6ZmlsZScpO1xuLyoqXG4gKiBSZXR1cm5zIGEgYGZzLlJlYWRTdHJlYW1gIGluc3RhbmNlIGZyb20gYSBcImZpbGU6XCIgVVJJLlxuICovXG5jb25zdCBmaWxlID0gYXN5bmMgKHsgaHJlZjogdXJpIH0sIG9wdHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgY2FjaGUsIGZsYWdzID0gJ3InLCBtb2RlID0gNDM4LCAvLyA9MDY2NlxuICAgICB9ID0gb3B0cztcbiAgICB0cnkge1xuICAgICAgICAvLyBDb252ZXJ0IFVSSSDihpIgUGF0aFxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9ICgwLCB1cmxfMS5maWxlVVJMVG9QYXRoKSh1cmkpO1xuICAgICAgICBkZWJ1ZygnTm9ybWFsaXplZCBwYXRobmFtZTogJW8nLCBmaWxlcGF0aCk7XG4gICAgICAgIC8vIGBvcGVuKClgIGZpcnN0IHRvIGdldCBhIGZpbGUgZGVzY3JpcHRvciBhbmQgZW5zdXJlIHRoYXQgdGhlIGZpbGVcbiAgICAgICAgLy8gZXhpc3RzLlxuICAgICAgICBjb25zdCBmZCA9IGF3YWl0ICgwLCBmc19leHRyYV8xLm9wZW4pKGZpbGVwYXRoLCBmbGFncywgbW9kZSk7XG4gICAgICAgIC8vIE5vdyBgZnN0YXQoKWAgdG8gY2hlY2sgdGhlIGBtdGltZWAgYW5kIHN0b3JlIHRoZSBzdGF0IG9iamVjdCBmb3JcbiAgICAgICAgLy8gdGhlIGNhY2hlLlxuICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgKDAsIGZzX2V4dHJhXzEuZnN0YXQpKGZkKTtcbiAgICAgICAgLy8gaWYgYSBgY2FjaGVgIHdhcyBwcm92aWRlZCwgY2hlY2sgaWYgdGhlIGZpbGUgaGFzIG5vdCBiZWVuIG1vZGlmaWVkXG4gICAgICAgIGlmIChjYWNoZSAmJiBjYWNoZS5zdGF0ICYmIHN0YXQgJiYgaXNOb3RNb2RpZmllZChjYWNoZS5zdGF0LCBzdGF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IG5vdG1vZGlmaWVkXzEuZGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGBmcy5SZWFkU3RyZWFtYCB0YWtlcyBjYXJlIG9mIGNhbGxpbmcgYGZzLmNsb3NlKClgIG9uIHRoZVxuICAgICAgICAvLyBmZCBhZnRlciBpdCdzIGRvbmUgcmVhZGluZ1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBAdHlwZXMvbm9kZWAgZG9lc24ndCBhbGxvdyBgbnVsbGAgYXMgZmlsZSBwYXRoIDovXG4gICAgICAgIGNvbnN0IHJzID0gKDAsIGZzXzEuY3JlYXRlUmVhZFN0cmVhbSkobnVsbCwge1xuICAgICAgICAgICAgYXV0b0Nsb3NlOiB0cnVlLFxuICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICAgIGZkLFxuICAgICAgICB9KTtcbiAgICAgICAgcnMuc3RhdCA9IHN0YXQ7XG4gICAgICAgIHJldHVybiBycztcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgbm90Zm91bmRfMS5kZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn07XG5leHBvcnRzLmZpbGUgPSBmaWxlO1xuLy8gcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGBtdGltZWAgb2YgdGhlIDIgc3RhdCBvYmplY3RzIGFyZSBlcXVhbFxuZnVuY3Rpb24gaXNOb3RNb2RpZmllZChwcmV2LCBjdXJyKSB7XG4gICAgcmV0dXJuICtwcmV2Lm10aW1lID09PSArY3Vyci5tdGltZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmZ0cCA9IHZvaWQgMDtcbmNvbnN0IGJhc2ljX2Z0cF8xID0gcmVxdWlyZShcImJhc2ljLWZ0cFwiKTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcInN0cmVhbVwiKTtcbmNvbnN0IHBhdGhfMSA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpO1xuY29uc3Qgbm90Zm91bmRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9ub3Rmb3VuZFwiKSk7XG5jb25zdCBub3Rtb2RpZmllZF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL25vdG1vZGlmaWVkXCIpKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2dldC11cmk6ZnRwJyk7XG4vKipcbiAqIFJldHVybnMgYSBSZWFkYWJsZSBzdHJlYW0gZnJvbSBhbiBcImZ0cDpcIiBVUkkuXG4gKi9cbmNvbnN0IGZ0cCA9IGFzeW5jICh1cmwsIG9wdHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgY2FjaGUgfSA9IG9wdHM7XG4gICAgY29uc3QgZmlsZXBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodXJsLnBhdGhuYW1lKTtcbiAgICBsZXQgbGFzdE1vZGlmaWVkO1xuICAgIGlmICghZmlsZXBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gXCJwYXRobmFtZVwiIScpO1xuICAgIH1cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgYmFzaWNfZnRwXzEuQ2xpZW50KCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaG9zdCA9IHVybC5ob3N0bmFtZSB8fCB1cmwuaG9zdCB8fCAnbG9jYWxob3N0JztcbiAgICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHVybC5wb3J0IHx8ICcwJywgMTApIHx8IDIxO1xuICAgICAgICBjb25zdCB1c2VyID0gdXJsLnVzZXJuYW1lXG4gICAgICAgICAgICA/IGRlY29kZVVSSUNvbXBvbmVudCh1cmwudXNlcm5hbWUpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcGFzc3dvcmQgPSB1cmwucGFzc3dvcmRcbiAgICAgICAgICAgID8gZGVjb2RlVVJJQ29tcG9uZW50KHVybC5wYXNzd29yZClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBhd2FpdCBjbGllbnQuYWNjZXNzKHtcbiAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICBwb3J0LFxuICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGZpcnN0IHdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUgTGFzdCBNb2RpZmllZCBkYXRlLlxuICAgICAgICAvLyB0cnkgdGhlIE1EVE0gY29tbWFuZCBmaXJzdCwgd2hpY2ggaXMgYW4gb3B0aW9uYWwgZXh0ZW5zaW9uIGNvbW1hbmQuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSBhd2FpdCBjbGllbnQubGFzdE1vZChmaWxlcGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBcImZpbGUgbm90IGZvdW5kXCIgZXJyb3IgY29kZVxuICAgICAgICAgICAgaWYgKGVyci5jb2RlID09PSA1NTApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgbm90Zm91bmRfMS5kZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSB2aWEgdGhlIExJU1QgY29tbWFuZCAodXNlc1xuICAgICAgICAgICAgLy8gbW9yZSBiYW5kd2lkdGgsIGJ1dCBpcyBtb3JlIGNvbXBhdGlibGUgd2l0aCBvbGRlciBGVFAgc2VydmVyc1xuICAgICAgICAgICAgY29uc3QgbGlzdCA9IGF3YWl0IGNsaWVudC5saXN0KCgwLCBwYXRoXzEuZGlybmFtZSkoZmlsZXBhdGgpKTtcbiAgICAgICAgICAgIC8vIGF0dGVtcHQgdG8gZmluZCB0aGUgXCJlbnRyeVwiIHdpdGggYSBtYXRjaGluZyBcIm5hbWVcIlxuICAgICAgICAgICAgY29uc3QgbmFtZSA9ICgwLCBwYXRoXzEuYmFzZW5hbWUpKGZpbGVwYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gbGlzdC5maW5kKChlKSA9PiBlLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkID0gZW50cnkubW9kaWZpZWRBdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICBpZiAoaXNOb3RNb2RpZmllZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IG5vdG1vZGlmaWVkXzEuZGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IG5vdGZvdW5kXzEuZGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBzdHJlYW1fMS5QYXNzVGhyb3VnaCgpO1xuICAgICAgICBjb25zdCBycyA9IHN0cmVhbTtcbiAgICAgICAgY2xpZW50LmRvd25sb2FkVG8oc3RyZWFtLCBmaWxlcGF0aCkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBkZWJ1ZyhyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICBjbGllbnQuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJzLmxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDtcbiAgICAgICAgcmV0dXJuIHJzO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNsaWVudC5jbG9zZSgpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIC8vIGNhbGxlZCB3aGVuIGBsYXN0TW9kaWZpZWRgIGlzIHNldCwgYW5kIGEgXCJjYWNoZVwiIHN0cmVhbSB3YXMgcHJvdmlkZWRcbiAgICBmdW5jdGlvbiBpc05vdE1vZGlmaWVkKCkge1xuICAgICAgICBpZiAoY2FjaGU/Lmxhc3RNb2RpZmllZCAmJiBsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIHJldHVybiArY2FjaGUubGFzdE1vZGlmaWVkID09PSArbGFzdE1vZGlmaWVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuZXhwb3J0cy5mdHAgPSBmdHA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mdHAuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBodHRwXzEgPSByZXF1aXJlKFwiaHR0cFwiKTtcbi8qKlxuICogRXJyb3Igc3ViY2xhc3MgdG8gdXNlIHdoZW4gYW4gSFRUUCBhcHBsaWNhdGlvbiBlcnJvciBoYXMgb2NjdXJyZWQuXG4gKi9cbmNsYXNzIEhUVFBFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihzdGF0dXNDb2RlLCBtZXNzYWdlID0gaHR0cF8xLlNUQVRVU19DT0RFU1tzdGF0dXNDb2RlXSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgICAgICAgdGhpcy5jb2RlID0gYEUke1N0cmluZyhtZXNzYWdlKS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJycpfWA7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gSFRUUEVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cC1lcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaHR0cCA9IHZvaWQgMDtcbmNvbnN0IGh0dHBfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiaHR0cFwiKSk7XG5jb25zdCBodHRwc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJodHRwc1wiKSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBodHRwX2Vycm9yXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vaHR0cC1lcnJvclwiKSk7XG5jb25zdCBub3Rmb3VuZF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL25vdGZvdW5kXCIpKTtcbmNvbnN0IG5vdG1vZGlmaWVkXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbm90bW9kaWZpZWRcIikpO1xuY29uc3QgZGVidWcgPSAoMCwgZGVidWdfMS5kZWZhdWx0KSgnZ2V0LXVyaTpodHRwJyk7XG4vKipcbiAqIFJldHVybnMgYSBSZWFkYWJsZSBzdHJlYW0gZnJvbSBhbiBcImh0dHA6XCIgVVJJLlxuICovXG5jb25zdCBodHRwID0gYXN5bmMgKHVybCwgb3B0cyA9IHt9KSA9PiB7XG4gICAgZGVidWcoJ0dFVCAlbycsIHVybC5ocmVmKTtcbiAgICBjb25zdCBjYWNoZSA9IGdldENhY2hlKHVybCwgb3B0cy5jYWNoZSk7XG4gICAgLy8gZmlyc3QgY2hlY2sgdGhlIHByZXZpb3VzIEV4cGlyZXMgYW5kL29yIENhY2hlLUNvbnRyb2wgaGVhZGVyc1xuICAgIC8vIG9mIGEgcHJldmlvdXMgcmVzcG9uc2UgaWYgYSBgY2FjaGVgIHdhcyBwcm92aWRlZFxuICAgIGlmIChjYWNoZSAmJiBpc0ZyZXNoKGNhY2hlKSAmJiB0eXBlb2YgY2FjaGUuc3RhdHVzQ29kZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gY2hlY2sgZm9yIGEgM3h4IFwicmVkaXJlY3RcIiBzdGF0dXMgY29kZSBvbiB0aGUgcHJldmlvdXMgY2FjaGVcbiAgICAgICAgY29uc3QgdHlwZSA9IChjYWNoZS5zdGF0dXNDb2RlIC8gMTAwKSB8IDA7XG4gICAgICAgIGlmICh0eXBlID09PSAzICYmIGNhY2hlLmhlYWRlcnMubG9jYXRpb24pIHtcbiAgICAgICAgICAgIGRlYnVnKCdjYWNoZWQgcmVkaXJlY3QnKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVE9ETzogaW1wbGVtZW50IGNhY2hlZCByZWRpcmVjdHMhJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGRlc3RpbmF0aW9uIGVuZHBvaW50LFxuICAgICAgICAvLyBzaW5jZSB0aGVyZSdzIG5vd2hlcmUgZWxzZSB0byByZWRpcmVjdCB0b1xuICAgICAgICB0aHJvdyBuZXcgbm90bW9kaWZpZWRfMS5kZWZhdWx0KCk7XG4gICAgfVxuICAgIC8vIDUgcmVkaXJlY3RzIGFsbG93ZWQgYnkgZGVmYXVsdFxuICAgIGNvbnN0IG1heFJlZGlyZWN0cyA9IHR5cGVvZiBvcHRzLm1heFJlZGlyZWN0cyA9PT0gJ251bWJlcicgPyBvcHRzLm1heFJlZGlyZWN0cyA6IDU7XG4gICAgZGVidWcoJ2FsbG93aW5nICVvIG1heCByZWRpcmVjdHMnLCBtYXhSZWRpcmVjdHMpO1xuICAgIGxldCBtb2Q7XG4gICAgaWYgKG9wdHMuaHR0cCkge1xuICAgICAgICAvLyB0aGUgYGh0dHBzYCBtb2R1bGUgcGFzc2VkIGluIGZyb20gdGhlIFwiaHR0cC5qc1wiIGZpbGVcbiAgICAgICAgbW9kID0gb3B0cy5odHRwO1xuICAgICAgICBkZWJ1ZygndXNpbmcgc2VjdXJlIGBodHRwc2AgY29yZSBtb2R1bGUnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG1vZCA9IGh0dHBfMS5kZWZhdWx0O1xuICAgICAgICBkZWJ1ZygndXNpbmcgYGh0dHBgIGNvcmUgbW9kdWxlJyk7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLm9wdHMgfTtcbiAgICAvLyBhZGQgXCJjYWNoZSB2YWxpZGF0aW9uXCIgaGVhZGVycyBpZiBhIGBjYWNoZWAgd2FzIHByb3ZpZGVkXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXN0TW9kaWZpZWQgPSBjYWNoZS5oZWFkZXJzWydsYXN0LW1vZGlmaWVkJ107XG4gICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1snSWYtTW9kaWZpZWQtU2luY2UnXSA9IGxhc3RNb2RpZmllZDtcbiAgICAgICAgICAgIGRlYnVnKCdhZGRlZCBcIklmLU1vZGlmaWVkLVNpbmNlXCIgcmVxdWVzdCBoZWFkZXI6ICVvJywgbGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldGFnID0gY2FjaGUuaGVhZGVycy5ldGFnO1xuICAgICAgICBpZiAoZXRhZykge1xuICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydJZi1Ob25lLU1hdGNoJ10gPSBldGFnO1xuICAgICAgICAgICAgZGVidWcoJ2FkZGVkIFwiSWYtTm9uZS1NYXRjaFwiIHJlcXVlc3QgaGVhZGVyOiAlbycsIGV0YWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcSA9IG1vZC5nZXQodXJsLCBvcHRpb25zKTtcbiAgICBjb25zdCBbcmVzXSA9IGF3YWl0ICgwLCBldmVudHNfMS5vbmNlKShyZXEsICdyZXNwb25zZScpO1xuICAgIGNvbnN0IGNvZGUgPSByZXMuc3RhdHVzQ29kZSB8fCAwO1xuICAgIC8vIGFzc2lnbiBhIERhdGUgdG8gdGhpcyByZXNwb25zZSBmb3IgdGhlIFwiQ2FjaGUtQ29udHJvbFwiIGRlbHRhIGNhbGN1bGF0aW9uXG4gICAgcmVzLmRhdGUgPSBEYXRlLm5vdygpO1xuICAgIHJlcy5wYXJzZWQgPSB1cmw7XG4gICAgZGVidWcoJ2dvdCAlbyByZXNwb25zZSBzdGF0dXMgY29kZScsIGNvZGUpO1xuICAgIC8vIGFueSAyeHggcmVzcG9uc2UgaXMgYSBcInN1Y2Nlc3NcIiBjb2RlXG4gICAgY29uc3QgdHlwZSA9IChjb2RlIC8gMTAwKSB8IDA7XG4gICAgLy8gY2hlY2sgZm9yIGEgM3h4IFwicmVkaXJlY3RcIiBzdGF0dXMgY29kZVxuICAgIGNvbnN0IGxvY2F0aW9uID0gcmVzLmhlYWRlcnMubG9jYXRpb247XG4gICAgaWYgKHR5cGUgPT09IDMgJiYgbG9jYXRpb24pIHtcbiAgICAgICAgaWYgKCFvcHRzLnJlZGlyZWN0cylcbiAgICAgICAgICAgIG9wdHMucmVkaXJlY3RzID0gW107XG4gICAgICAgIGNvbnN0IHJlZGlyZWN0cyA9IG9wdHMucmVkaXJlY3RzO1xuICAgICAgICBpZiAocmVkaXJlY3RzLmxlbmd0aCA8IG1heFJlZGlyZWN0cykge1xuICAgICAgICAgICAgZGVidWcoJ2dvdCBhIFwicmVkaXJlY3RcIiBzdGF0dXMgY29kZSB3aXRoIExvY2F0aW9uOiAlbycsIGxvY2F0aW9uKTtcbiAgICAgICAgICAgIC8vIGZsdXNoIHRoaXMgcmVzcG9uc2UgLSB3ZSdyZSBub3QgZ29pbmcgdG8gdXNlIGl0XG4gICAgICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgICAgICAvLyBoYW5nIG9uIHRvIHRoaXMgUmVzcG9uc2Ugb2JqZWN0IGZvciB0aGUgXCJyZWRpcmVjdHNcIiBBcnJheVxuICAgICAgICAgICAgcmVkaXJlY3RzLnB1c2gocmVzKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1VyaSA9IG5ldyBVUkwobG9jYXRpb24sIHVybC5ocmVmKTtcbiAgICAgICAgICAgIGRlYnVnKCdyZXNvbHZlZCByZWRpcmVjdCBVUkw6ICVvJywgbmV3VXJpLmhyZWYpO1xuICAgICAgICAgICAgY29uc3QgbGVmdCA9IG1heFJlZGlyZWN0cyAtIHJlZGlyZWN0cy5sZW5ndGg7XG4gICAgICAgICAgICBkZWJ1ZygnJW8gbW9yZSByZWRpcmVjdHMgYWxsb3dlZCBhZnRlciB0aGlzIG9uZScsIGxlZnQpO1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgcmVkaXJlY3RpbmcgdG8gYSBkaWZmZXJlbnQgcHJvdG9jb2xcbiAgICAgICAgICAgIGlmIChuZXdVcmkucHJvdG9jb2wgIT09IHVybC5wcm90b2NvbCkge1xuICAgICAgICAgICAgICAgIG9wdHMuaHR0cCA9IG5ld1VyaS5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyBodHRwc18xLmRlZmF1bHQgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKDAsIGV4cG9ydHMuaHR0cCkobmV3VXJpLCBvcHRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBpZiB3ZSBkaWRuJ3QgZ2V0IGEgMnh4IFwic3VjY2Vzc1wiIHN0YXR1cyBjb2RlLCB0aGVuIGNyZWF0ZSBhbiBFcnJvciBvYmplY3RcbiAgICBpZiAodHlwZSAhPT0gMikge1xuICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgIGlmIChjb2RlID09PSAzMDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBub3Rtb2RpZmllZF8xLmRlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2RlID09PSA0MDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBub3Rmb3VuZF8xLmRlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlciBIVFRQLWxldmVsIGVycm9yXG4gICAgICAgIHRocm93IG5ldyBodHRwX2Vycm9yXzEuZGVmYXVsdChjb2RlKTtcbiAgICB9XG4gICAgaWYgKG9wdHMucmVkaXJlY3RzKSB7XG4gICAgICAgIC8vIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSBcInJlZGlyZWN0c1wiIEFycmF5IG9uIHRoZSBSZXNwb25zZSBvYmplY3Qgc28gdGhhdFxuICAgICAgICAvLyB0aGV5IGNhbiBiZSBpbnNwZWN0ZWQgZHVyaW5nIGEgc3Vic2VxdWVudCBjYWxsIHRvIEdFVCB0aGUgc2FtZSBVUklcbiAgICAgICAgcmVzLnJlZGlyZWN0cyA9IG9wdHMucmVkaXJlY3RzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufTtcbmV4cG9ydHMuaHR0cCA9IGh0dHA7XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm92aWRlZCBjYWNoZSdzIFwiZnJlc2huZXNzXCIgaXMgdmFsaWQuIFRoYXQgaXMsIGVpdGhlclxuICogdGhlIENhY2hlLUNvbnRyb2wgaGVhZGVyIG9yIEV4cGlyZXMgaGVhZGVyIHZhbHVlcyBhcmUgc3RpbGwgd2l0aGluIHRoZSBhbGxvd2VkXG4gKiB0aW1lIHBlcmlvZC5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzRnJlc2goY2FjaGUpIHtcbiAgICBsZXQgZnJlc2ggPSBmYWxzZTtcbiAgICBsZXQgZXhwaXJlcyA9IHBhcnNlSW50KGNhY2hlLmhlYWRlcnMuZXhwaXJlcyB8fCAnJywgMTApO1xuICAgIGNvbnN0IGNhY2hlQ29udHJvbCA9IGNhY2hlLmhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXTtcbiAgICBpZiAoY2FjaGVDb250cm9sKSB7XG4gICAgICAgIC8vIGZvciBDYWNoZS1Db250cm9sIHJ1bGVzLCBzZWU6IGh0dHA6Ly93d3cubW5vdC5uZXQvY2FjaGVfZG9jcy8jQ0FDSEUtQ09OVFJPTFxuICAgICAgICBkZWJ1ZygnQ2FjaGUtQ29udHJvbDogJW8nLCBjYWNoZUNvbnRyb2wpO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IGNhY2hlQ29udHJvbC5zcGxpdCgvLFxccyo/XFxiLyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHN1YnBhcnRzID0gcGFydC5zcGxpdCgnPScpO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHN1YnBhcnRzWzBdO1xuICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWF4LWFnZSc6XG4gICAgICAgICAgICAgICAgICAgIGV4cGlyZXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgKGNhY2hlLmRhdGUgfHwgMCkgKyBwYXJzZUludChzdWJwYXJ0c1sxXSwgMTApICogMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgZnJlc2ggPSBEYXRlLm5vdygpIDwgZXhwaXJlcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZygnY2FjaGUgaXMgXCJmcmVzaFwiIGR1ZSB0byBwcmV2aW91cyAlbyBDYWNoZS1Db250cm9sIHBhcmFtJywgcGFydCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyZXNoO1xuICAgICAgICAgICAgICAgIGNhc2UgJ211c3QtcmV2YWxpZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIC8vIFhYWDogd2hhdCB3ZSBzdXBwb3NlZCB0byBkbyBoZXJlP1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICduby1jYWNoZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnbm8tc3RvcmUnOlxuICAgICAgICAgICAgICAgICAgICBkZWJ1ZygnY2FjaGUgaXMgXCJzdGFsZVwiIGR1ZSB0byBleHBsaWNpdCAlbyBDYWNoZS1Db250cm9sIHBhcmFtJywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdW5rbm93biBjYWNoZSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChleHBpcmVzKSB7XG4gICAgICAgIC8vIGZvciBFeHBpcmVzIHJ1bGVzLCBzZWU6IGh0dHA6Ly93d3cubW5vdC5uZXQvY2FjaGVfZG9jcy8jRVhQSVJFU1xuICAgICAgICBkZWJ1ZygnRXhwaXJlczogJW8nLCBleHBpcmVzKTtcbiAgICAgICAgZnJlc2ggPSBEYXRlLm5vdygpIDwgZXhwaXJlcztcbiAgICAgICAgaWYgKGZyZXNoKSB7XG4gICAgICAgICAgICBkZWJ1ZygnY2FjaGUgaXMgXCJmcmVzaFwiIGR1ZSB0byBwcmV2aW91cyBFeHBpcmVzIHJlc3BvbnNlIGhlYWRlcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcmVzaDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBBdHRlbXB0cyB0byByZXR1cm4gYSBwcmV2aW91cyBSZXNwb25zZSBvYmplY3QgZnJvbSBhIHByZXZpb3VzIEdFVCBjYWxsIHRvIHRoZVxuICogc2FtZSBVUkkuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldENhY2hlKHVybCwgY2FjaGUpIHtcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgaWYgKGNhY2hlLnBhcnNlZCAmJiBjYWNoZS5wYXJzZWQuaHJlZiA9PT0gdXJsLmhyZWYpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FjaGUucmVkaXJlY3RzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlLnJlZGlyZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBnZXRDYWNoZSh1cmwsIGNhY2hlLnJlZGlyZWN0c1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaHR0cHMgPSB2b2lkIDA7XG5jb25zdCBodHRwc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJodHRwc1wiKSk7XG5jb25zdCBodHRwXzEgPSByZXF1aXJlKFwiLi9odHRwXCIpO1xuLyoqXG4gKiBSZXR1cm5zIGEgUmVhZGFibGUgc3RyZWFtIGZyb20gYW4gXCJodHRwczpcIiBVUkkuXG4gKi9cbmNvbnN0IGh0dHBzID0gKHVybCwgb3B0cykgPT4ge1xuICAgIHJldHVybiAoMCwgaHR0cF8xLmh0dHApKHVybCwgeyAuLi5vcHRzLCBodHRwOiBodHRwc18xLmRlZmF1bHQgfSk7XG59O1xuZXhwb3J0cy5odHRwcyA9IGh0dHBzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldFVyaSA9IGV4cG9ydHMuaXNWYWxpZFByb3RvY29sID0gZXhwb3J0cy5wcm90b2NvbHMgPSB2b2lkIDA7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG4vLyBCdWlsdC1pbiBwcm90b2NvbHNcbmNvbnN0IGRhdGFfMSA9IHJlcXVpcmUoXCIuL2RhdGFcIik7XG5jb25zdCBmaWxlXzEgPSByZXF1aXJlKFwiLi9maWxlXCIpO1xuY29uc3QgZnRwXzEgPSByZXF1aXJlKFwiLi9mdHBcIik7XG5jb25zdCBodHRwXzEgPSByZXF1aXJlKFwiLi9odHRwXCIpO1xuY29uc3QgaHR0cHNfMSA9IHJlcXVpcmUoXCIuL2h0dHBzXCIpO1xuY29uc3QgZGVidWcgPSAoMCwgZGVidWdfMS5kZWZhdWx0KSgnZ2V0LXVyaScpO1xuZXhwb3J0cy5wcm90b2NvbHMgPSB7XG4gICAgZGF0YTogZGF0YV8xLmRhdGEsXG4gICAgZmlsZTogZmlsZV8xLmZpbGUsXG4gICAgZnRwOiBmdHBfMS5mdHAsXG4gICAgaHR0cDogaHR0cF8xLmh0dHAsXG4gICAgaHR0cHM6IGh0dHBzXzEuaHR0cHMsXG59O1xuY29uc3QgVkFMSURfUFJPVE9DT0xTID0gbmV3IFNldChPYmplY3Qua2V5cyhleHBvcnRzLnByb3RvY29scykpO1xuZnVuY3Rpb24gaXNWYWxpZFByb3RvY29sKHApIHtcbiAgICByZXR1cm4gVkFMSURfUFJPVE9DT0xTLmhhcyhwKTtcbn1cbmV4cG9ydHMuaXNWYWxpZFByb3RvY29sID0gaXNWYWxpZFByb3RvY29sO1xuLyoqXG4gKiBBc3luYyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBgc3RyZWFtLlJlYWRhYmxlYCBpbnN0YW5jZSB0aGF0IHdpbGwgb3V0cHV0XG4gKiB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIFVSSS5cbiAqXG4gKiBGb3IgY2FjaGluZyBwdXJwb3NlcywgeW91IGNhbiBwYXNzIGluIGEgYHN0cmVhbWAgaW5zdGFuY2UgZnJvbSBhIHByZXZpb3VzXG4gKiBgZ2V0VXJpKClgIGNhbGwgYXMgYSBgY2FjaGU6IHN0cmVhbWAgb3B0aW9uLCBhbmQgaWYgdGhlIGRlc3RpbmF0aW9uIGhhc1xuICogbm90IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZW5kcG9pbnQgd2FzIHJldHJlaXZlZCB0aGVuIHRoZSBjYWxsYmFja1xuICogd2lsbCBiZSBpbnZva2VkIHdpdGggYW4gRXJyb3Igb2JqZWN0IHdpdGggYGNvZGVgIHNldCB0byBcIkVOT1RNT0RJRklFRFwiIGFuZFxuICogYG51bGxgIGZvciB0aGUgXCJzdHJlYW1cIiBpbnN0YW5jZSBhcmd1bWVudC4gSW4gdGhpcyBjYXNlLCB5b3UgY2FuIHNraXBcbiAqIHJldHJlaXZpbmcgdGhlIGZpbGUgYWdhaW4gYW5kIGNvbnRpbnVlIHRvIHVzZSB0aGUgcHJldmlvdXMgcGF5bG9hZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJpIFVSSSB0byByZXRyaWV2ZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgb3B0aW9uYWwgXCJvcHRpb25zXCIgb2JqZWN0XG4gKiBAYXBpIHB1YmxpY1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXRVcmkodXJpLCBvcHRzKSB7XG4gICAgZGVidWcoJ2dldFVyaSglbyknLCB1cmkpO1xuICAgIGlmICghdXJpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ011c3QgcGFzcyBpbiBhIFVSSSB0byBcImdldFVyaSgpXCInKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdHlwZW9mIHVyaSA9PT0gJ3N0cmluZycgPyBuZXcgVVJMKHVyaSkgOiB1cmk7XG4gICAgLy8gU3RyaXAgdHJhaWxpbmcgYDpgXG4gICAgY29uc3QgcHJvdG9jb2wgPSB1cmwucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJyk7XG4gICAgaWYgKCFpc1ZhbGlkUHJvdG9jb2wocHJvdG9jb2wpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHByb3RvY29sIFwiJHtwcm90b2NvbH1cIiBzcGVjaWZpZWQgaW4gVVJJOiBcIiR7dXJpfVwiYCk7XG4gICAgfVxuICAgIGNvbnN0IGdldHRlciA9IGV4cG9ydHMucHJvdG9jb2xzW3Byb3RvY29sXTtcbiAgICByZXR1cm4gZ2V0dGVyKHVybCwgb3B0cyk7XG59XG5leHBvcnRzLmdldFVyaSA9IGdldFVyaTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBFcnJvciBzdWJjbGFzcyB0byB1c2Ugd2hlbiB0aGUgc291cmNlIGRvZXMgbm90IGV4aXN0IGF0IHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2Ugb3B0aW9uYWwgXCJtZXNzYWdlXCIgcHJvcGVydHkgdG8gc2V0XG4gKiBAYXBpIHByb3RlY3RlZFxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jbGFzcyBOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSB8fCAnRmlsZSBkb2VzIG5vdCBleGlzdCBhdCB0aGUgc3BlY2lmaWVkIGVuZHBvaW50Jyk7XG4gICAgICAgIHRoaXMuY29kZSA9ICdFTk9URk9VTkQnO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IE5vdEZvdW5kRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub3Rmb3VuZC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICogRXJyb3Igc3ViY2xhc3MgdG8gdXNlIHdoZW4gdGhlIHNvdXJjZSBoYXMgbm90IGJlZW4gbW9kaWZpZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2Ugb3B0aW9uYWwgXCJtZXNzYWdlXCIgcHJvcGVydHkgdG8gc2V0XG4gKiBAYXBpIHByb3RlY3RlZFxuICovXG5jbGFzcyBOb3RNb2RpZmllZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSB8fFxuICAgICAgICAgICAgJ1NvdXJjZSBoYXMgbm90IGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIHByb3ZpZWQgXCJjYWNoZVwiLCByZS11c2UgcHJldmlvdXMgcmVzdWx0cycpO1xuICAgICAgICB0aGlzLmNvZGUgPSAnRU5PVE1PRElGSUVEJztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOb3RNb2RpZmllZEVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm90bW9kaWZpZWQuanMubWFwIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVcblxudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iai5fX3Byb3RvX19cbn1cblxuZnVuY3Rpb24gY2xvbmUgKG9iaikge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKVxuICAgIHJldHVybiBvYmpcblxuICBpZiAob2JqIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgIHZhciBjb3B5ID0geyBfX3Byb3RvX186IGdldFByb3RvdHlwZU9mKG9iaikgfVxuICBlbHNlXG4gICAgdmFyIGNvcHkgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29weSwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSlcbiAgfSlcblxuICByZXR1cm4gY29weVxufVxuIiwidmFyIGZzID0gcmVxdWlyZSgnZnMnKVxudmFyIHBvbHlmaWxscyA9IHJlcXVpcmUoJy4vcG9seWZpbGxzLmpzJylcbnZhciBsZWdhY3kgPSByZXF1aXJlKCcuL2xlZ2FjeS1zdHJlYW1zLmpzJylcbnZhciBjbG9uZSA9IHJlcXVpcmUoJy4vY2xvbmUuanMnKVxuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIG5vZGUgMC54IHBvbHlmaWxsICovXG52YXIgZ3JhY2VmdWxRdWV1ZVxudmFyIHByZXZpb3VzU3ltYm9sXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlIC0gbm9kZSAwLnggcG9seWZpbGwgKi9cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuZm9yID09PSAnZnVuY3Rpb24nKSB7XG4gIGdyYWNlZnVsUXVldWUgPSBTeW1ib2wuZm9yKCdncmFjZWZ1bC1mcy5xdWV1ZScpXG4gIC8vIFRoaXMgaXMgdXNlZCBpbiB0ZXN0aW5nIGJ5IGZ1dHVyZSB2ZXJzaW9uc1xuICBwcmV2aW91c1N5bWJvbCA9IFN5bWJvbC5mb3IoJ2dyYWNlZnVsLWZzLnByZXZpb3VzJylcbn0gZWxzZSB7XG4gIGdyYWNlZnVsUXVldWUgPSAnX19fZ3JhY2VmdWwtZnMucXVldWUnXG4gIHByZXZpb3VzU3ltYm9sID0gJ19fX2dyYWNlZnVsLWZzLnByZXZpb3VzJ1xufVxuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIHB1Ymxpc2hRdWV1ZShjb250ZXh0LCBxdWV1ZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGV4dCwgZ3JhY2VmdWxRdWV1ZSwge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcXVldWVcbiAgICB9XG4gIH0pXG59XG5cbnZhciBkZWJ1ZyA9IG5vb3BcbmlmICh1dGlsLmRlYnVnbG9nKVxuICBkZWJ1ZyA9IHV0aWwuZGVidWdsb2coJ2dmczQnKVxuZWxzZSBpZiAoL1xcYmdmczRcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJycpKVxuICBkZWJ1ZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBtID0gdXRpbC5mb3JtYXQuYXBwbHkodXRpbCwgYXJndW1lbnRzKVxuICAgIG0gPSAnR0ZTNDogJyArIG0uc3BsaXQoL1xcbi8pLmpvaW4oJ1xcbkdGUzQ6ICcpXG4gICAgY29uc29sZS5lcnJvcihtKVxuICB9XG5cbi8vIE9uY2UgdGltZSBpbml0aWFsaXphdGlvblxuaWYgKCFmc1tncmFjZWZ1bFF1ZXVlXSkge1xuICAvLyBUaGlzIHF1ZXVlIGNhbiBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgbG9hZGVkIGluc3RhbmNlc1xuICB2YXIgcXVldWUgPSBnbG9iYWxbZ3JhY2VmdWxRdWV1ZV0gfHwgW11cbiAgcHVibGlzaFF1ZXVlKGZzLCBxdWV1ZSlcblxuICAvLyBQYXRjaCBmcy5jbG9zZS9jbG9zZVN5bmMgdG8gc2hhcmVkIHF1ZXVlIHZlcnNpb24sIGJlY2F1c2Ugd2UgbmVlZFxuICAvLyB0byByZXRyeSgpIHdoZW5ldmVyIGEgY2xvc2UgaGFwcGVucyAqYW55d2hlcmUqIGluIHRoZSBwcm9ncmFtLlxuICAvLyBUaGlzIGlzIGVzc2VudGlhbCB3aGVuIG11bHRpcGxlIGdyYWNlZnVsLWZzIGluc3RhbmNlcyBhcmVcbiAgLy8gaW4gcGxheSBhdCB0aGUgc2FtZSB0aW1lLlxuICBmcy5jbG9zZSA9IChmdW5jdGlvbiAoZnMkY2xvc2UpIHtcbiAgICBmdW5jdGlvbiBjbG9zZSAoZmQsIGNiKSB7XG4gICAgICByZXR1cm4gZnMkY2xvc2UuY2FsbChmcywgZmQsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBncmFjZWZ1bC1mcyBzaGFyZWQgcXVldWVcbiAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICByZXNldFF1ZXVlKClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xvc2UsIHByZXZpb3VzU3ltYm9sLCB7XG4gICAgICB2YWx1ZTogZnMkY2xvc2VcbiAgICB9KVxuICAgIHJldHVybiBjbG9zZVxuICB9KShmcy5jbG9zZSlcblxuICBmcy5jbG9zZVN5bmMgPSAoZnVuY3Rpb24gKGZzJGNsb3NlU3luYykge1xuICAgIGZ1bmN0aW9uIGNsb3NlU3luYyAoZmQpIHtcbiAgICAgIC8vIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZ3JhY2VmdWwtZnMgc2hhcmVkIHF1ZXVlXG4gICAgICBmcyRjbG9zZVN5bmMuYXBwbHkoZnMsIGFyZ3VtZW50cylcbiAgICAgIHJlc2V0UXVldWUoKVxuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbG9zZVN5bmMsIHByZXZpb3VzU3ltYm9sLCB7XG4gICAgICB2YWx1ZTogZnMkY2xvc2VTeW5jXG4gICAgfSlcbiAgICByZXR1cm4gY2xvc2VTeW5jXG4gIH0pKGZzLmNsb3NlU3luYylcblxuICBpZiAoL1xcYmdmczRcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJycpKSB7XG4gICAgcHJvY2Vzcy5vbignZXhpdCcsIGZ1bmN0aW9uKCkge1xuICAgICAgZGVidWcoZnNbZ3JhY2VmdWxRdWV1ZV0pXG4gICAgICByZXF1aXJlKCdhc3NlcnQnKS5lcXVhbChmc1tncmFjZWZ1bFF1ZXVlXS5sZW5ndGgsIDApXG4gICAgfSlcbiAgfVxufVxuXG5pZiAoIWdsb2JhbFtncmFjZWZ1bFF1ZXVlXSkge1xuICBwdWJsaXNoUXVldWUoZ2xvYmFsLCBmc1tncmFjZWZ1bFF1ZXVlXSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2goY2xvbmUoZnMpKVxuaWYgKHByb2Nlc3MuZW52LlRFU1RfR1JBQ0VGVUxfRlNfR0xPQkFMX1BBVENIICYmICFmcy5fX3BhdGNoZWQpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHBhdGNoKGZzKVxuICAgIGZzLl9fcGF0Y2hlZCA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHBhdGNoIChmcykge1xuICAvLyBFdmVyeXRoaW5nIHRoYXQgcmVmZXJlbmNlcyB0aGUgb3BlbigpIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGluIGhlcmVcbiAgcG9seWZpbGxzKGZzKVxuICBmcy5ncmFjZWZ1bGlmeSA9IHBhdGNoXG5cbiAgZnMuY3JlYXRlUmVhZFN0cmVhbSA9IGNyZWF0ZVJlYWRTdHJlYW1cbiAgZnMuY3JlYXRlV3JpdGVTdHJlYW0gPSBjcmVhdGVXcml0ZVN0cmVhbVxuICB2YXIgZnMkcmVhZEZpbGUgPSBmcy5yZWFkRmlsZVxuICBmcy5yZWFkRmlsZSA9IHJlYWRGaWxlXG4gIGZ1bmN0aW9uIHJlYWRGaWxlIChwYXRoLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IG51bGxcblxuICAgIHJldHVybiBnbyRyZWFkRmlsZShwYXRoLCBvcHRpb25zLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJHJlYWRGaWxlIChwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkcmVhZEZpbGUocGF0aCwgb3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyRyZWFkRmlsZSwgW3BhdGgsIG9wdGlvbnMsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmFyIGZzJHdyaXRlRmlsZSA9IGZzLndyaXRlRmlsZVxuICBmcy53cml0ZUZpbGUgPSB3cml0ZUZpbGVcbiAgZnVuY3Rpb24gd3JpdGVGaWxlIChwYXRoLCBkYXRhLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IG51bGxcblxuICAgIHJldHVybiBnbyR3cml0ZUZpbGUocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyR3cml0ZUZpbGUgKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyR3cml0ZUZpbGUocGF0aCwgZGF0YSwgb3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyR3cml0ZUZpbGUsIFtwYXRoLCBkYXRhLCBvcHRpb25zLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHZhciBmcyRhcHBlbmRGaWxlID0gZnMuYXBwZW5kRmlsZVxuICBpZiAoZnMkYXBwZW5kRmlsZSlcbiAgICBmcy5hcHBlbmRGaWxlID0gYXBwZW5kRmlsZVxuICBmdW5jdGlvbiBhcHBlbmRGaWxlIChwYXRoLCBkYXRhLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IG51bGxcblxuICAgIHJldHVybiBnbyRhcHBlbmRGaWxlKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kYXBwZW5kRmlsZSAocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJGFwcGVuZEZpbGUocGF0aCwgZGF0YSwgb3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyRhcHBlbmRGaWxlLCBbcGF0aCwgZGF0YSwgb3B0aW9ucywgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgZnMkY29weUZpbGUgPSBmcy5jb3B5RmlsZVxuICBpZiAoZnMkY29weUZpbGUpXG4gICAgZnMuY29weUZpbGUgPSBjb3B5RmlsZVxuICBmdW5jdGlvbiBjb3B5RmlsZSAoc3JjLCBkZXN0LCBmbGFncywgY2IpIHtcbiAgICBpZiAodHlwZW9mIGZsYWdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IGZsYWdzXG4gICAgICBmbGFncyA9IDBcbiAgICB9XG4gICAgcmV0dXJuIGdvJGNvcHlGaWxlKHNyYywgZGVzdCwgZmxhZ3MsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kY29weUZpbGUgKHNyYywgZGVzdCwgZmxhZ3MsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyRjb3B5RmlsZShzcmMsIGRlc3QsIGZsYWdzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJGNvcHlGaWxlLCBbc3JjLCBkZXN0LCBmbGFncywgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgZnMkcmVhZGRpciA9IGZzLnJlYWRkaXJcbiAgZnMucmVhZGRpciA9IHJlYWRkaXJcbiAgdmFyIG5vUmVhZGRpck9wdGlvblZlcnNpb25zID0gL152WzAtNV1cXC4vXG4gIGZ1bmN0aW9uIHJlYWRkaXIgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBvcHRpb25zLCBvcHRpb25zID0gbnVsbFxuXG4gICAgdmFyIGdvJHJlYWRkaXIgPSBub1JlYWRkaXJPcHRpb25WZXJzaW9ucy50ZXN0KHByb2Nlc3MudmVyc2lvbilcbiAgICAgID8gZnVuY3Rpb24gZ28kcmVhZGRpciAocGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgICByZXR1cm4gZnMkcmVhZGRpcihwYXRoLCBmcyRyZWFkZGlyQ2FsbGJhY2soXG4gICAgICAgICAgcGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZVxuICAgICAgICApKVxuICAgICAgfVxuICAgICAgOiBmdW5jdGlvbiBnbyRyZWFkZGlyIChwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICAgIHJldHVybiBmcyRyZWFkZGlyKHBhdGgsIG9wdGlvbnMsIGZzJHJlYWRkaXJDYWxsYmFjayhcbiAgICAgICAgICBwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lXG4gICAgICAgICkpXG4gICAgICB9XG5cbiAgICByZXR1cm4gZ28kcmVhZGRpcihwYXRoLCBvcHRpb25zLCBjYilcblxuICAgIGZ1bmN0aW9uIGZzJHJlYWRkaXJDYWxsYmFjayAocGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlcnIsIGZpbGVzKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW1xuICAgICAgICAgICAgZ28kcmVhZGRpcixcbiAgICAgICAgICAgIFtwYXRoLCBvcHRpb25zLCBjYl0sXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIERhdGUubm93KClcbiAgICAgICAgICBdKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoZmlsZXMgJiYgZmlsZXMuc29ydClcbiAgICAgICAgICAgIGZpbGVzLnNvcnQoKVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmNhbGwodGhpcywgZXJyLCBmaWxlcylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLnZlcnNpb24uc3Vic3RyKDAsIDQpID09PSAndjAuOCcpIHtcbiAgICB2YXIgbGVnU3RyZWFtcyA9IGxlZ2FjeShmcylcbiAgICBSZWFkU3RyZWFtID0gbGVnU3RyZWFtcy5SZWFkU3RyZWFtXG4gICAgV3JpdGVTdHJlYW0gPSBsZWdTdHJlYW1zLldyaXRlU3RyZWFtXG4gIH1cblxuICB2YXIgZnMkUmVhZFN0cmVhbSA9IGZzLlJlYWRTdHJlYW1cbiAgaWYgKGZzJFJlYWRTdHJlYW0pIHtcbiAgICBSZWFkU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZnMkUmVhZFN0cmVhbS5wcm90b3R5cGUpXG4gICAgUmVhZFN0cmVhbS5wcm90b3R5cGUub3BlbiA9IFJlYWRTdHJlYW0kb3BlblxuICB9XG5cbiAgdmFyIGZzJFdyaXRlU3RyZWFtID0gZnMuV3JpdGVTdHJlYW1cbiAgaWYgKGZzJFdyaXRlU3RyZWFtKSB7XG4gICAgV3JpdGVTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShmcyRXcml0ZVN0cmVhbS5wcm90b3R5cGUpXG4gICAgV3JpdGVTdHJlYW0ucHJvdG90eXBlLm9wZW4gPSBXcml0ZVN0cmVhbSRvcGVuXG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnMsICdSZWFkU3RyZWFtJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFJlYWRTdHJlYW1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgUmVhZFN0cmVhbSA9IHZhbFxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCAnV3JpdGVTdHJlYW0nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gV3JpdGVTdHJlYW1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgV3JpdGVTdHJlYW0gPSB2YWxcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG5cbiAgLy8gbGVnYWN5IG5hbWVzXG4gIHZhciBGaWxlUmVhZFN0cmVhbSA9IFJlYWRTdHJlYW1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCAnRmlsZVJlYWRTdHJlYW0nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gRmlsZVJlYWRTdHJlYW1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgRmlsZVJlYWRTdHJlYW0gPSB2YWxcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG4gIHZhciBGaWxlV3JpdGVTdHJlYW0gPSBXcml0ZVN0cmVhbVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnMsICdGaWxlV3JpdGVTdHJlYW0nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gRmlsZVdyaXRlU3RyZWFtXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIEZpbGVXcml0ZVN0cmVhbSA9IHZhbFxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcblxuICBmdW5jdGlvbiBSZWFkU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBSZWFkU3RyZWFtKVxuICAgICAgcmV0dXJuIGZzJFJlYWRTdHJlYW0uYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdGhpc1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBSZWFkU3RyZWFtLmFwcGx5KE9iamVjdC5jcmVhdGUoUmVhZFN0cmVhbS5wcm90b3R5cGUpLCBhcmd1bWVudHMpXG4gIH1cblxuICBmdW5jdGlvbiBSZWFkU3RyZWFtJG9wZW4gKCkge1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgIG9wZW4odGhhdC5wYXRoLCB0aGF0LmZsYWdzLCB0aGF0Lm1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGlmICh0aGF0LmF1dG9DbG9zZSlcbiAgICAgICAgICB0aGF0LmRlc3Ryb3koKVxuXG4gICAgICAgIHRoYXQuZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGF0LmZkID0gZmRcbiAgICAgICAgdGhhdC5lbWl0KCdvcGVuJywgZmQpXG4gICAgICAgIHRoYXQucmVhZCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIFdyaXRlU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBXcml0ZVN0cmVhbSlcbiAgICAgIHJldHVybiBmcyRXcml0ZVN0cmVhbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0aGlzXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIFdyaXRlU3RyZWFtLmFwcGx5KE9iamVjdC5jcmVhdGUoV3JpdGVTdHJlYW0ucHJvdG90eXBlKSwgYXJndW1lbnRzKVxuICB9XG5cbiAgZnVuY3Rpb24gV3JpdGVTdHJlYW0kb3BlbiAoKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgb3Blbih0aGF0LnBhdGgsIHRoYXQuZmxhZ3MsIHRoYXQubW9kZSwgZnVuY3Rpb24gKGVyciwgZmQpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgdGhhdC5kZXN0cm95KClcbiAgICAgICAgdGhhdC5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoYXQuZmQgPSBmZFxuICAgICAgICB0aGF0LmVtaXQoJ29wZW4nLCBmZClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVhZFN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgZnMuUmVhZFN0cmVhbShwYXRoLCBvcHRpb25zKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlV3JpdGVTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IGZzLldyaXRlU3RyZWFtKHBhdGgsIG9wdGlvbnMpXG4gIH1cblxuICB2YXIgZnMkb3BlbiA9IGZzLm9wZW5cbiAgZnMub3BlbiA9IG9wZW5cbiAgZnVuY3Rpb24gb3BlbiAocGF0aCwgZmxhZ3MsIG1vZGUsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBtb2RlID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBtb2RlLCBtb2RlID0gbnVsbFxuXG4gICAgcmV0dXJuIGdvJG9wZW4ocGF0aCwgZmxhZ3MsIG1vZGUsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kb3BlbiAocGF0aCwgZmxhZ3MsIG1vZGUsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyRvcGVuKHBhdGgsIGZsYWdzLCBtb2RlLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyRvcGVuLCBbcGF0aCwgZmxhZ3MsIG1vZGUsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZzXG59XG5cbmZ1bmN0aW9uIGVucXVldWUgKGVsZW0pIHtcbiAgZGVidWcoJ0VOUVVFVUUnLCBlbGVtWzBdLm5hbWUsIGVsZW1bMV0pXG4gIGZzW2dyYWNlZnVsUXVldWVdLnB1c2goZWxlbSlcbiAgcmV0cnkoKVxufVxuXG4vLyBrZWVwIHRyYWNrIG9mIHRoZSB0aW1lb3V0IGJldHdlZW4gcmV0cnkoKSBjYWxsc1xudmFyIHJldHJ5VGltZXJcblxuLy8gcmVzZXQgdGhlIHN0YXJ0VGltZSBhbmQgbGFzdFRpbWUgdG8gbm93XG4vLyB0aGlzIHJlc2V0cyB0aGUgc3RhcnQgb2YgdGhlIDYwIHNlY29uZCBvdmVyYWxsIHRpbWVvdXQgYXMgd2VsbCBhcyB0aGVcbi8vIGRlbGF5IGJldHdlZW4gYXR0ZW1wdHMgc28gdGhhdCB3ZSdsbCByZXRyeSB0aGVzZSBqb2JzIHNvb25lclxuZnVuY3Rpb24gcmVzZXRRdWV1ZSAoKSB7XG4gIHZhciBub3cgPSBEYXRlLm5vdygpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZnNbZ3JhY2VmdWxRdWV1ZV0ubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBlbnRyaWVzIHRoYXQgYXJlIG9ubHkgYSBsZW5ndGggb2YgMiBhcmUgZnJvbSBhbiBvbGRlciB2ZXJzaW9uLCBkb24ndFxuICAgIC8vIGJvdGhlciBtb2RpZnlpbmcgdGhvc2Ugc2luY2UgdGhleSdsbCBiZSByZXRyaWVkIGFueXdheS5cbiAgICBpZiAoZnNbZ3JhY2VmdWxRdWV1ZV1baV0ubGVuZ3RoID4gMikge1xuICAgICAgZnNbZ3JhY2VmdWxRdWV1ZV1baV1bM10gPSBub3cgLy8gc3RhcnRUaW1lXG4gICAgICBmc1tncmFjZWZ1bFF1ZXVlXVtpXVs0XSA9IG5vdyAvLyBsYXN0VGltZVxuICAgIH1cbiAgfVxuICAvLyBjYWxsIHJldHJ5IHRvIG1ha2Ugc3VyZSB3ZSdyZSBhY3RpdmVseSBwcm9jZXNzaW5nIHRoZSBxdWV1ZVxuICByZXRyeSgpXG59XG5cbmZ1bmN0aW9uIHJldHJ5ICgpIHtcbiAgLy8gY2xlYXIgdGhlIHRpbWVyIGFuZCByZW1vdmUgaXQgdG8gaGVscCBwcmV2ZW50IHVuaW50ZW5kZWQgY29uY3VycmVuY3lcbiAgY2xlYXJUaW1lb3V0KHJldHJ5VGltZXIpXG4gIHJldHJ5VGltZXIgPSB1bmRlZmluZWRcblxuICBpZiAoZnNbZ3JhY2VmdWxRdWV1ZV0ubGVuZ3RoID09PSAwKVxuICAgIHJldHVyblxuXG4gIHZhciBlbGVtID0gZnNbZ3JhY2VmdWxRdWV1ZV0uc2hpZnQoKVxuICB2YXIgZm4gPSBlbGVtWzBdXG4gIHZhciBhcmdzID0gZWxlbVsxXVxuICAvLyB0aGVzZSBpdGVtcyBtYXkgYmUgdW5zZXQgaWYgdGhleSB3ZXJlIGFkZGVkIGJ5IGFuIG9sZGVyIGdyYWNlZnVsLWZzXG4gIHZhciBlcnIgPSBlbGVtWzJdXG4gIHZhciBzdGFydFRpbWUgPSBlbGVtWzNdXG4gIHZhciBsYXN0VGltZSA9IGVsZW1bNF1cblxuICAvLyBpZiB3ZSBkb24ndCBoYXZlIGEgc3RhcnRUaW1lIHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgaWYgd2UndmUgd2FpdGVkXG4gIC8vIGxvbmcgZW5vdWdoLCBzbyBnbyBhaGVhZCBhbmQgcmV0cnkgdGhpcyBpdGVtIG5vd1xuICBpZiAoc3RhcnRUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBkZWJ1ZygnUkVUUlknLCBmbi5uYW1lLCBhcmdzKVxuICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpXG4gIH0gZWxzZSBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSA2MDAwMCkge1xuICAgIC8vIGl0J3MgYmVlbiBtb3JlIHRoYW4gNjAgc2Vjb25kcyB0b3RhbCwgYmFpbCBub3dcbiAgICBkZWJ1ZygnVElNRU9VVCcsIGZuLm5hbWUsIGFyZ3MpXG4gICAgdmFyIGNiID0gYXJncy5wb3AoKVxuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYi5jYWxsKG51bGwsIGVycilcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBhdHRlbXB0IGFuZCByaWdodCBub3dcbiAgICB2YXIgc2luY2VBdHRlbXB0ID0gRGF0ZS5ub3coKSAtIGxhc3RUaW1lXG4gICAgLy8gdGhlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gd2hlbiB3ZSBmaXJzdCB0cmllZCwgYW5kIHdoZW4gd2UgbGFzdCB0cmllZFxuICAgIC8vIHJvdW5kZWQgdXAgdG8gYXQgbGVhc3QgMVxuICAgIHZhciBzaW5jZVN0YXJ0ID0gTWF0aC5tYXgobGFzdFRpbWUgLSBzdGFydFRpbWUsIDEpXG4gICAgLy8gYmFja29mZi4gd2FpdCBsb25nZXIgdGhhbiB0aGUgdG90YWwgdGltZSB3ZSd2ZSBiZWVuIHJldHJ5aW5nLCBidXQgb25seVxuICAgIC8vIHVwIHRvIGEgbWF4aW11bSBvZiAxMDBtc1xuICAgIHZhciBkZXNpcmVkRGVsYXkgPSBNYXRoLm1pbihzaW5jZVN0YXJ0ICogMS4yLCAxMDApXG4gICAgLy8gaXQncyBiZWVuIGxvbmcgZW5vdWdoIHNpbmNlIHRoZSBsYXN0IHJldHJ5LCBkbyBpdCBhZ2FpblxuICAgIGlmIChzaW5jZUF0dGVtcHQgPj0gZGVzaXJlZERlbGF5KSB7XG4gICAgICBkZWJ1ZygnUkVUUlknLCBmbi5uYW1lLCBhcmdzKVxuICAgICAgZm4uYXBwbHkobnVsbCwgYXJncy5jb25jYXQoW3N0YXJ0VGltZV0pKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiB3ZSBjYW4ndCBkbyB0aGlzIGpvYiB5ZXQsIHB1c2ggaXQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcbiAgICAgIC8vIGFuZCBsZXQgdGhlIG5leHQgaXRlcmF0aW9uIGNoZWNrIGFnYWluXG4gICAgICBmc1tncmFjZWZ1bFF1ZXVlXS5wdXNoKGVsZW0pXG4gICAgfVxuICB9XG5cbiAgLy8gc2NoZWR1bGUgb3VyIG5leHQgcnVuIGlmIG9uZSBpc24ndCBhbHJlYWR5IHNjaGVkdWxlZFxuICBpZiAocmV0cnlUaW1lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0cnlUaW1lciA9IHNldFRpbWVvdXQocmV0cnksIDApXG4gIH1cbn1cbiIsInZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKS5TdHJlYW1cblxubW9kdWxlLmV4cG9ydHMgPSBsZWdhY3lcblxuZnVuY3Rpb24gbGVnYWN5IChmcykge1xuICByZXR1cm4ge1xuICAgIFJlYWRTdHJlYW06IFJlYWRTdHJlYW0sXG4gICAgV3JpdGVTdHJlYW06IFdyaXRlU3RyZWFtXG4gIH1cblxuICBmdW5jdGlvbiBSZWFkU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRTdHJlYW0pKSByZXR1cm4gbmV3IFJlYWRTdHJlYW0ocGF0aCwgb3B0aW9ucyk7XG5cbiAgICBTdHJlYW0uY2FsbCh0aGlzKTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5mZCA9IG51bGw7XG4gICAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG4gICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuZmxhZ3MgPSAncic7XG4gICAgdGhpcy5tb2RlID0gNDM4OyAvKj0wNjY2Ki9cbiAgICB0aGlzLmJ1ZmZlclNpemUgPSA2NCAqIDEwMjQ7XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIE1peGluIG9wdGlvbnMgaW50byB0aGlzXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgICBmb3IgKHZhciBpbmRleCA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaW5kZXhdO1xuICAgICAgdGhpc1trZXldID0gb3B0aW9uc1trZXldO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVuY29kaW5nKSB0aGlzLnNldEVuY29kaW5nKHRoaXMuZW5jb2RpbmcpO1xuXG4gICAgaWYgKHRoaXMuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCdudW1iZXInICE9PSB0eXBlb2YgdGhpcy5zdGFydCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ3N0YXJ0IG11c3QgYmUgYSBOdW1iZXInKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZW5kID0gSW5maW5pdHk7XG4gICAgICB9IGVsc2UgaWYgKCdudW1iZXInICE9PSB0eXBlb2YgdGhpcy5lbmQpIHtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdlbmQgbXVzdCBiZSBhIE51bWJlcicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGFydCA+IHRoaXMuZW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc3RhcnQgbXVzdCBiZSA8PSBlbmQnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZkICE9PSBudWxsKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLl9yZWFkKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmcy5vcGVuKHRoaXMucGF0aCwgdGhpcy5mbGFncywgdGhpcy5tb2RlLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgc2VsZi5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYuZmQgPSBmZDtcbiAgICAgIHNlbGYuZW1pdCgnb3BlbicsIGZkKTtcbiAgICAgIHNlbGYuX3JlYWQoKTtcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gV3JpdGVTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV3JpdGVTdHJlYW0pKSByZXR1cm4gbmV3IFdyaXRlU3RyZWFtKHBhdGgsIG9wdGlvbnMpO1xuXG4gICAgU3RyZWFtLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMuZmQgPSBudWxsO1xuICAgIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuXG4gICAgdGhpcy5mbGFncyA9ICd3JztcbiAgICB0aGlzLmVuY29kaW5nID0gJ2JpbmFyeSc7XG4gICAgdGhpcy5tb2RlID0gNDM4OyAvKj0wNjY2Ki9cbiAgICB0aGlzLmJ5dGVzV3JpdHRlbiA9IDA7XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIE1peGluIG9wdGlvbnMgaW50byB0aGlzXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgICBmb3IgKHZhciBpbmRleCA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaW5kZXhdO1xuICAgICAgdGhpc1trZXldID0gb3B0aW9uc1trZXldO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICgnbnVtYmVyJyAhPT0gdHlwZW9mIHRoaXMuc3RhcnQpIHtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdzdGFydCBtdXN0IGJlIGEgTnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdGFydCA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdGFydCBtdXN0IGJlID49IHplcm8nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICAgIH1cblxuICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xuICAgIHRoaXMuX3F1ZXVlID0gW107XG5cbiAgICBpZiAodGhpcy5mZCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fb3BlbiA9IGZzLm9wZW47XG4gICAgICB0aGlzLl9xdWV1ZS5wdXNoKFt0aGlzLl9vcGVuLCB0aGlzLnBhdGgsIHRoaXMuZmxhZ3MsIHRoaXMubW9kZSwgdW5kZWZpbmVkXSk7XG4gICAgICB0aGlzLmZsdXNoKCk7XG4gICAgfVxuICB9XG59XG4iLCJ2YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnY29uc3RhbnRzJylcblxudmFyIG9yaWdDd2QgPSBwcm9jZXNzLmN3ZFxudmFyIGN3ZCA9IG51bGxcblxudmFyIHBsYXRmb3JtID0gcHJvY2Vzcy5lbnYuR1JBQ0VGVUxfRlNfUExBVEZPUk0gfHwgcHJvY2Vzcy5wbGF0Zm9ybVxuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIWN3ZClcbiAgICBjd2QgPSBvcmlnQ3dkLmNhbGwocHJvY2VzcylcbiAgcmV0dXJuIGN3ZFxufVxudHJ5IHtcbiAgcHJvY2Vzcy5jd2QoKVxufSBjYXRjaCAoZXIpIHt9XG5cbi8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHVudGlsIG5vZGUuanMgMTIgaXMgcmVxdWlyZWRcbmlmICh0eXBlb2YgcHJvY2Vzcy5jaGRpciA9PT0gJ2Z1bmN0aW9uJykge1xuICB2YXIgY2hkaXIgPSBwcm9jZXNzLmNoZGlyXG4gIHByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZCkge1xuICAgIGN3ZCA9IG51bGxcbiAgICBjaGRpci5jYWxsKHByb2Nlc3MsIGQpXG4gIH1cbiAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikgT2JqZWN0LnNldFByb3RvdHlwZU9mKHByb2Nlc3MuY2hkaXIsIGNoZGlyKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoXG5cbmZ1bmN0aW9uIHBhdGNoIChmcykge1xuICAvLyAocmUtKWltcGxlbWVudCBzb21lIHRoaW5ncyB0aGF0IGFyZSBrbm93biBidXN0ZWQgb3IgbWlzc2luZy5cblxuICAvLyBsY2htb2QsIGJyb2tlbiBwcmlvciB0byAwLjYuMlxuICAvLyBiYWNrLXBvcnQgdGhlIGZpeCBoZXJlLlxuICBpZiAoY29uc3RhbnRzLmhhc093blByb3BlcnR5KCdPX1NZTUxJTksnKSAmJlxuICAgICAgcHJvY2Vzcy52ZXJzaW9uLm1hdGNoKC9edjBcXC42XFwuWzAtMl18XnYwXFwuNVxcLi8pKSB7XG4gICAgcGF0Y2hMY2htb2QoZnMpXG4gIH1cblxuICAvLyBsdXRpbWVzIGltcGxlbWVudGF0aW9uLCBvciBuby1vcFxuICBpZiAoIWZzLmx1dGltZXMpIHtcbiAgICBwYXRjaEx1dGltZXMoZnMpXG4gIH1cblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL25vZGUtZ3JhY2VmdWwtZnMvaXNzdWVzLzRcbiAgLy8gQ2hvd24gc2hvdWxkIG5vdCBmYWlsIG9uIGVpbnZhbCBvciBlcGVybSBpZiBub24tcm9vdC5cbiAgLy8gSXQgc2hvdWxkIG5vdCBmYWlsIG9uIGVub3N5cyBldmVyLCBhcyB0aGlzIGp1c3QgaW5kaWNhdGVzXG4gIC8vIHRoYXQgYSBmcyBkb2Vzbid0IHN1cHBvcnQgdGhlIGludGVuZGVkIG9wZXJhdGlvbi5cblxuICBmcy5jaG93biA9IGNob3duRml4KGZzLmNob3duKVxuICBmcy5mY2hvd24gPSBjaG93bkZpeChmcy5mY2hvd24pXG4gIGZzLmxjaG93biA9IGNob3duRml4KGZzLmxjaG93bilcblxuICBmcy5jaG1vZCA9IGNobW9kRml4KGZzLmNobW9kKVxuICBmcy5mY2htb2QgPSBjaG1vZEZpeChmcy5mY2htb2QpXG4gIGZzLmxjaG1vZCA9IGNobW9kRml4KGZzLmxjaG1vZClcblxuICBmcy5jaG93blN5bmMgPSBjaG93bkZpeFN5bmMoZnMuY2hvd25TeW5jKVxuICBmcy5mY2hvd25TeW5jID0gY2hvd25GaXhTeW5jKGZzLmZjaG93blN5bmMpXG4gIGZzLmxjaG93blN5bmMgPSBjaG93bkZpeFN5bmMoZnMubGNob3duU3luYylcblxuICBmcy5jaG1vZFN5bmMgPSBjaG1vZEZpeFN5bmMoZnMuY2htb2RTeW5jKVxuICBmcy5mY2htb2RTeW5jID0gY2htb2RGaXhTeW5jKGZzLmZjaG1vZFN5bmMpXG4gIGZzLmxjaG1vZFN5bmMgPSBjaG1vZEZpeFN5bmMoZnMubGNobW9kU3luYylcblxuICBmcy5zdGF0ID0gc3RhdEZpeChmcy5zdGF0KVxuICBmcy5mc3RhdCA9IHN0YXRGaXgoZnMuZnN0YXQpXG4gIGZzLmxzdGF0ID0gc3RhdEZpeChmcy5sc3RhdClcblxuICBmcy5zdGF0U3luYyA9IHN0YXRGaXhTeW5jKGZzLnN0YXRTeW5jKVxuICBmcy5mc3RhdFN5bmMgPSBzdGF0Rml4U3luYyhmcy5mc3RhdFN5bmMpXG4gIGZzLmxzdGF0U3luYyA9IHN0YXRGaXhTeW5jKGZzLmxzdGF0U3luYylcblxuICAvLyBpZiBsY2htb2QvbGNob3duIGRvIG5vdCBleGlzdCwgdGhlbiBtYWtlIHRoZW0gbm8tb3BzXG4gIGlmIChmcy5jaG1vZCAmJiAhZnMubGNobW9kKSB7XG4gICAgZnMubGNobW9kID0gZnVuY3Rpb24gKHBhdGgsIG1vZGUsIGNiKSB7XG4gICAgICBpZiAoY2IpIHByb2Nlc3MubmV4dFRpY2soY2IpXG4gICAgfVxuICAgIGZzLmxjaG1vZFN5bmMgPSBmdW5jdGlvbiAoKSB7fVxuICB9XG4gIGlmIChmcy5jaG93biAmJiAhZnMubGNob3duKSB7XG4gICAgZnMubGNob3duID0gZnVuY3Rpb24gKHBhdGgsIHVpZCwgZ2lkLCBjYikge1xuICAgICAgaWYgKGNiKSBwcm9jZXNzLm5leHRUaWNrKGNiKVxuICAgIH1cbiAgICBmcy5sY2hvd25TeW5jID0gZnVuY3Rpb24gKCkge31cbiAgfVxuXG4gIC8vIG9uIFdpbmRvd3MsIEEvViBzb2Z0d2FyZSBjYW4gbG9jayB0aGUgZGlyZWN0b3J5LCBjYXVzaW5nIHRoaXNcbiAgLy8gdG8gZmFpbCB3aXRoIGFuIEVBQ0NFUyBvciBFUEVSTSBpZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5zIG5ld2x5XG4gIC8vIGNyZWF0ZWQgZmlsZXMuICBUcnkgYWdhaW4gb24gZmFpbHVyZSwgZm9yIHVwIHRvIDYwIHNlY29uZHMuXG5cbiAgLy8gU2V0IHRoZSB0aW1lb3V0IHRoaXMgbG9uZyBiZWNhdXNlIHNvbWUgV2luZG93cyBBbnRpLVZpcnVzLCBzdWNoIGFzIFBhcml0eVxuICAvLyBiaXQ5LCBtYXkgbG9jayBmaWxlcyBmb3IgdXAgdG8gYSBtaW51dGUsIGNhdXNpbmcgbnBtIHBhY2thZ2UgaW5zdGFsbFxuICAvLyBmYWlsdXJlcy4gQWxzbywgdGFrZSBjYXJlIHRvIHlpZWxkIHRoZSBzY2hlZHVsZXIuIFdpbmRvd3Mgc2NoZWR1bGluZyBnaXZlc1xuICAvLyBDUFUgdG8gYSBidXN5IGxvb3BpbmcgcHJvY2Vzcywgd2hpY2ggY2FuIGNhdXNlIHRoZSBwcm9ncmFtIGNhdXNpbmcgdGhlIGxvY2tcbiAgLy8gY29udGVudGlvbiB0byBiZSBzdGFydmVkIG9mIENQVSBieSBub2RlLCBzbyB0aGUgY29udGVudGlvbiBkb2Vzbid0IHJlc29sdmUuXG4gIGlmIChwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSB7XG4gICAgZnMucmVuYW1lID0gdHlwZW9mIGZzLnJlbmFtZSAhPT0gJ2Z1bmN0aW9uJyA/IGZzLnJlbmFtZVxuICAgIDogKGZ1bmN0aW9uIChmcyRyZW5hbWUpIHtcbiAgICAgIGZ1bmN0aW9uIHJlbmFtZSAoZnJvbSwgdG8sIGNiKSB7XG4gICAgICAgIHZhciBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgdmFyIGJhY2tvZmYgPSAwO1xuICAgICAgICBmcyRyZW5hbWUoZnJvbSwgdG8sIGZ1bmN0aW9uIENCIChlcikge1xuICAgICAgICAgIGlmIChlclxuICAgICAgICAgICAgICAmJiAoZXIuY29kZSA9PT0gXCJFQUNDRVNcIiB8fCBlci5jb2RlID09PSBcIkVQRVJNXCIgfHwgZXIuY29kZSA9PT0gXCJFQlVTWVwiKVxuICAgICAgICAgICAgICAmJiBEYXRlLm5vdygpIC0gc3RhcnQgPCA2MDAwMCkge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgZnMuc3RhdCh0bywgZnVuY3Rpb24gKHN0YXRlciwgc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGVyICYmIHN0YXRlci5jb2RlID09PSBcIkVOT0VOVFwiKVxuICAgICAgICAgICAgICAgICAgZnMkcmVuYW1lKGZyb20sIHRvLCBDQik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgY2IoZXIpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBiYWNrb2ZmKVxuICAgICAgICAgICAgaWYgKGJhY2tvZmYgPCAxMDApXG4gICAgICAgICAgICAgIGJhY2tvZmYgKz0gMTA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjYikgY2IoZXIpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSBPYmplY3Quc2V0UHJvdG90eXBlT2YocmVuYW1lLCBmcyRyZW5hbWUpXG4gICAgICByZXR1cm4gcmVuYW1lXG4gICAgfSkoZnMucmVuYW1lKVxuICB9XG5cbiAgLy8gaWYgcmVhZCgpIHJldHVybnMgRUFHQUlOLCB0aGVuIGp1c3QgdHJ5IGl0IGFnYWluLlxuICBmcy5yZWFkID0gdHlwZW9mIGZzLnJlYWQgIT09ICdmdW5jdGlvbicgPyBmcy5yZWFkXG4gIDogKGZ1bmN0aW9uIChmcyRyZWFkKSB7XG4gICAgZnVuY3Rpb24gcmVhZCAoZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFja18pIHtcbiAgICAgIHZhciBjYWxsYmFja1xuICAgICAgaWYgKGNhbGxiYWNrXyAmJiB0eXBlb2YgY2FsbGJhY2tfID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBlYWdDb3VudGVyID0gMFxuICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uIChlciwgXywgX18pIHtcbiAgICAgICAgICBpZiAoZXIgJiYgZXIuY29kZSA9PT0gJ0VBR0FJTicgJiYgZWFnQ291bnRlciA8IDEwKSB7XG4gICAgICAgICAgICBlYWdDb3VudGVyICsrXG4gICAgICAgICAgICByZXR1cm4gZnMkcmVhZC5jYWxsKGZzLCBmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYWxsYmFja18uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZnMkcmVhZC5jYWxsKGZzLCBmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIC8vIFRoaXMgZW5zdXJlcyBgdXRpbC5wcm9taXNpZnlgIHdvcmtzIGFzIGl0IGRvZXMgZm9yIG5hdGl2ZSBgZnMucmVhZGAuXG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlYWQsIGZzJHJlYWQpXG4gICAgcmV0dXJuIHJlYWRcbiAgfSkoZnMucmVhZClcblxuICBmcy5yZWFkU3luYyA9IHR5cGVvZiBmcy5yZWFkU3luYyAhPT0gJ2Z1bmN0aW9uJyA/IGZzLnJlYWRTeW5jXG4gIDogKGZ1bmN0aW9uIChmcyRyZWFkU3luYykgeyByZXR1cm4gZnVuY3Rpb24gKGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbikge1xuICAgIHZhciBlYWdDb3VudGVyID0gMFxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZnMkcmVhZFN5bmMuY2FsbChmcywgZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgaWYgKGVyLmNvZGUgPT09ICdFQUdBSU4nICYmIGVhZ0NvdW50ZXIgPCAxMCkge1xuICAgICAgICAgIGVhZ0NvdW50ZXIgKytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIHRocm93IGVyXG4gICAgICB9XG4gICAgfVxuICB9fSkoZnMucmVhZFN5bmMpXG5cbiAgZnVuY3Rpb24gcGF0Y2hMY2htb2QgKGZzKSB7XG4gICAgZnMubGNobW9kID0gZnVuY3Rpb24gKHBhdGgsIG1vZGUsIGNhbGxiYWNrKSB7XG4gICAgICBmcy5vcGVuKCBwYXRoXG4gICAgICAgICAgICAgLCBjb25zdGFudHMuT19XUk9OTFkgfCBjb25zdGFudHMuT19TWU1MSU5LXG4gICAgICAgICAgICAgLCBtb2RlXG4gICAgICAgICAgICAgLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8gcHJlZmVyIHRvIHJldHVybiB0aGUgY2htb2QgZXJyb3IsIGlmIG9uZSBvY2N1cnMsXG4gICAgICAgIC8vIGJ1dCBzdGlsbCB0cnkgdG8gY2xvc2UsIGFuZCByZXBvcnQgY2xvc2luZyBlcnJvcnMgaWYgdGhleSBvY2N1ci5cbiAgICAgICAgZnMuZmNobW9kKGZkLCBtb2RlLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgZnMuY2xvc2UoZmQsIGZ1bmN0aW9uKGVycjIpIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZXJyIHx8IGVycjIpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZnMubGNobW9kU3luYyA9IGZ1bmN0aW9uIChwYXRoLCBtb2RlKSB7XG4gICAgICB2YXIgZmQgPSBmcy5vcGVuU3luYyhwYXRoLCBjb25zdGFudHMuT19XUk9OTFkgfCBjb25zdGFudHMuT19TWU1MSU5LLCBtb2RlKVxuXG4gICAgICAvLyBwcmVmZXIgdG8gcmV0dXJuIHRoZSBjaG1vZCBlcnJvciwgaWYgb25lIG9jY3VycyxcbiAgICAgIC8vIGJ1dCBzdGlsbCB0cnkgdG8gY2xvc2UsIGFuZCByZXBvcnQgY2xvc2luZyBlcnJvcnMgaWYgdGhleSBvY2N1ci5cbiAgICAgIHZhciB0aHJldyA9IHRydWVcbiAgICAgIHZhciByZXRcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldCA9IGZzLmZjaG1vZFN5bmMoZmQsIG1vZGUpXG4gICAgICAgIHRocmV3ID0gZmFsc2VcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmICh0aHJldykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgICAgfSBjYXRjaCAoZXIpIHt9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGF0Y2hMdXRpbWVzIChmcykge1xuICAgIGlmIChjb25zdGFudHMuaGFzT3duUHJvcGVydHkoXCJPX1NZTUxJTktcIikgJiYgZnMuZnV0aW1lcykge1xuICAgICAgZnMubHV0aW1lcyA9IGZ1bmN0aW9uIChwYXRoLCBhdCwgbXQsIGNiKSB7XG4gICAgICAgIGZzLm9wZW4ocGF0aCwgY29uc3RhbnRzLk9fU1lNTElOSywgZnVuY3Rpb24gKGVyLCBmZCkge1xuICAgICAgICAgIGlmIChlcikge1xuICAgICAgICAgICAgaWYgKGNiKSBjYihlcilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBmcy5mdXRpbWVzKGZkLCBhdCwgbXQsIGZ1bmN0aW9uIChlcikge1xuICAgICAgICAgICAgZnMuY2xvc2UoZmQsIGZ1bmN0aW9uIChlcjIpIHtcbiAgICAgICAgICAgICAgaWYgKGNiKSBjYihlciB8fCBlcjIpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGZzLmx1dGltZXNTeW5jID0gZnVuY3Rpb24gKHBhdGgsIGF0LCBtdCkge1xuICAgICAgICB2YXIgZmQgPSBmcy5vcGVuU3luYyhwYXRoLCBjb25zdGFudHMuT19TWU1MSU5LKVxuICAgICAgICB2YXIgcmV0XG4gICAgICAgIHZhciB0aHJldyA9IHRydWVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXQgPSBmcy5mdXRpbWVzU3luYyhmZCwgYXQsIG10KVxuICAgICAgICAgIHRocmV3ID0gZmFsc2VcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAodGhyZXcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVyKSB7fVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoZnMuZnV0aW1lcykge1xuICAgICAgZnMubHV0aW1lcyA9IGZ1bmN0aW9uIChfYSwgX2IsIF9jLCBjYikgeyBpZiAoY2IpIHByb2Nlc3MubmV4dFRpY2soY2IpIH1cbiAgICAgIGZzLmx1dGltZXNTeW5jID0gZnVuY3Rpb24gKCkge31cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaG1vZEZpeCAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgbW9kZSwgY2IpIHtcbiAgICAgIHJldHVybiBvcmlnLmNhbGwoZnMsIHRhcmdldCwgbW9kZSwgZnVuY3Rpb24gKGVyKSB7XG4gICAgICAgIGlmIChjaG93bkVyT2soZXIpKSBlciA9IG51bGxcbiAgICAgICAgaWYgKGNiKSBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNobW9kRml4U3luYyAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgbW9kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCBtb2RlKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgaWYgKCFjaG93bkVyT2soZXIpKSB0aHJvdyBlclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgZnVuY3Rpb24gY2hvd25GaXggKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHVpZCwgZ2lkLCBjYikge1xuICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCB1aWQsIGdpZCwgZnVuY3Rpb24gKGVyKSB7XG4gICAgICAgIGlmIChjaG93bkVyT2soZXIpKSBlciA9IG51bGxcbiAgICAgICAgaWYgKGNiKSBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNob3duRml4U3luYyAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgdWlkLCBnaWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBvcmlnLmNhbGwoZnMsIHRhcmdldCwgdWlkLCBnaWQpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICBpZiAoIWNob3duRXJPayhlcikpIHRocm93IGVyXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RhdEZpeCAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBvZiBOb2RlIGVycm9uZW91c2x5IHJldHVybmVkIHNpZ25lZCBpbnRlZ2VycyBmb3JcbiAgICAvLyB1aWQgKyBnaWQuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIG9wdGlvbnMsIGNiKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2IgPSBvcHRpb25zXG4gICAgICAgIG9wdGlvbnMgPSBudWxsXG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjYWxsYmFjayAoZXIsIHN0YXRzKSB7XG4gICAgICAgIGlmIChzdGF0cykge1xuICAgICAgICAgIGlmIChzdGF0cy51aWQgPCAwKSBzdGF0cy51aWQgKz0gMHgxMDAwMDAwMDBcbiAgICAgICAgICBpZiAoc3RhdHMuZ2lkIDwgMCkgc3RhdHMuZ2lkICs9IDB4MTAwMDAwMDAwXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNiKSBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucyA/IG9yaWcuY2FsbChmcywgdGFyZ2V0LCBvcHRpb25zLCBjYWxsYmFjaylcbiAgICAgICAgOiBvcmlnLmNhbGwoZnMsIHRhcmdldCwgY2FsbGJhY2spXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RhdEZpeFN5bmMgKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgLy8gT2xkZXIgdmVyc2lvbnMgb2YgTm9kZSBlcnJvbmVvdXNseSByZXR1cm5lZCBzaWduZWQgaW50ZWdlcnMgZm9yXG4gICAgLy8gdWlkICsgZ2lkLlxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgICB2YXIgc3RhdHMgPSBvcHRpb25zID8gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIG9wdGlvbnMpXG4gICAgICAgIDogb3JpZy5jYWxsKGZzLCB0YXJnZXQpXG4gICAgICBpZiAoc3RhdHMpIHtcbiAgICAgICAgaWYgKHN0YXRzLnVpZCA8IDApIHN0YXRzLnVpZCArPSAweDEwMDAwMDAwMFxuICAgICAgICBpZiAoc3RhdHMuZ2lkIDwgMCkgc3RhdHMuZ2lkICs9IDB4MTAwMDAwMDAwXG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdHM7XG4gICAgfVxuICB9XG5cbiAgLy8gRU5PU1lTIG1lYW5zIHRoYXQgdGhlIGZzIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgb3AuIEp1c3QgaWdub3JlXG4gIC8vIHRoYXQsIGJlY2F1c2UgaXQgZG9lc24ndCBtYXR0ZXIuXG4gIC8vXG4gIC8vIGlmIHRoZXJlJ3Mgbm8gZ2V0dWlkLCBvciBpZiBnZXR1aWQoKSBpcyBzb21ldGhpbmcgb3RoZXJcbiAgLy8gdGhhbiAwLCBhbmQgdGhlIGVycm9yIGlzIEVJTlZBTCBvciBFUEVSTSwgdGhlbiBqdXN0IGlnbm9yZVxuICAvLyBpdC5cbiAgLy9cbiAgLy8gVGhpcyBzcGVjaWZpYyBjYXNlIGlzIGEgc2lsZW50IGZhaWx1cmUgaW4gY3AsIGluc3RhbGwsIHRhcixcbiAgLy8gYW5kIG1vc3Qgb3RoZXIgdW5peCB0b29scyB0aGF0IG1hbmFnZSBwZXJtaXNzaW9ucy5cbiAgLy9cbiAgLy8gV2hlbiBydW5uaW5nIGFzIHJvb3QsIG9yIGlmIG90aGVyIHR5cGVzIG9mIGVycm9ycyBhcmVcbiAgLy8gZW5jb3VudGVyZWQsIHRoZW4gaXQncyBzdHJpY3QuXG4gIGZ1bmN0aW9uIGNob3duRXJPayAoZXIpIHtcbiAgICBpZiAoIWVyKVxuICAgICAgcmV0dXJuIHRydWVcblxuICAgIGlmIChlci5jb2RlID09PSBcIkVOT1NZU1wiKVxuICAgICAgcmV0dXJuIHRydWVcblxuICAgIHZhciBub25yb290ID0gIXByb2Nlc3MuZ2V0dWlkIHx8IHByb2Nlc3MuZ2V0dWlkKCkgIT09IDBcbiAgICBpZiAobm9ucm9vdCkge1xuICAgICAgaWYgKGVyLmNvZGUgPT09IFwiRUlOVkFMXCIgfHwgZXIuY29kZSA9PT0gXCJFUEVSTVwiKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gKGZsYWcsIGFyZ3YgPSBwcm9jZXNzLmFyZ3YpID0+IHtcblx0Y29uc3QgcHJlZml4ID0gZmxhZy5zdGFydHNXaXRoKCctJykgPyAnJyA6IChmbGFnLmxlbmd0aCA9PT0gMSA/ICctJyA6ICctLScpO1xuXHRjb25zdCBwb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZihwcmVmaXggKyBmbGFnKTtcblx0Y29uc3QgdGVybWluYXRvclBvc2l0aW9uID0gYXJndi5pbmRleE9mKCctLScpO1xuXHRyZXR1cm4gcG9zaXRpb24gIT09IC0xICYmICh0ZXJtaW5hdG9yUG9zaXRpb24gPT09IC0xIHx8IHBvc2l0aW9uIDwgdGVybWluYXRvclBvc2l0aW9uKTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IdHRwUHJveHlBZ2VudCA9IHZvaWQgMDtcbmNvbnN0IG5ldCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwibmV0XCIpKTtcbmNvbnN0IHRscyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidGxzXCIpKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcImV2ZW50c1wiKTtcbmNvbnN0IGFnZW50X2Jhc2VfMSA9IHJlcXVpcmUoXCJhZ2VudC1iYXNlXCIpO1xuY29uc3QgdXJsXzEgPSByZXF1aXJlKFwidXJsXCIpO1xuY29uc3QgZGVidWcgPSAoMCwgZGVidWdfMS5kZWZhdWx0KSgnaHR0cC1wcm94eS1hZ2VudCcpO1xuLyoqXG4gKiBUaGUgYEh0dHBQcm94eUFnZW50YCBpbXBsZW1lbnRzIGFuIEhUVFAgQWdlbnQgc3ViY2xhc3MgdGhhdCBjb25uZWN0c1xuICogdG8gdGhlIHNwZWNpZmllZCBcIkhUVFAgcHJveHkgc2VydmVyXCIgaW4gb3JkZXIgdG8gcHJveHkgSFRUUCByZXF1ZXN0cy5cbiAqL1xuY2xhc3MgSHR0cFByb3h5QWdlbnQgZXh0ZW5kcyBhZ2VudF9iYXNlXzEuQWdlbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3h5LCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLnByb3h5ID0gdHlwZW9mIHByb3h5ID09PSAnc3RyaW5nJyA/IG5ldyB1cmxfMS5VUkwocHJveHkpIDogcHJveHk7XG4gICAgICAgIHRoaXMucHJveHlIZWFkZXJzID0gb3B0cz8uaGVhZGVycyA/PyB7fTtcbiAgICAgICAgZGVidWcoJ0NyZWF0aW5nIG5ldyBIdHRwUHJveHlBZ2VudCBpbnN0YW5jZTogJW8nLCB0aGlzLnByb3h5LmhyZWYpO1xuICAgICAgICAvLyBUcmltIG9mZiB0aGUgYnJhY2tldHMgZnJvbSBJUHY2IGFkZHJlc3Nlc1xuICAgICAgICBjb25zdCBob3N0ID0gKHRoaXMucHJveHkuaG9zdG5hbWUgfHwgdGhpcy5wcm94eS5ob3N0KS5yZXBsYWNlKC9eXFxbfFxcXSQvZywgJycpO1xuICAgICAgICBjb25zdCBwb3J0ID0gdGhpcy5wcm94eS5wb3J0XG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMucHJveHkucG9ydCwgMTApXG4gICAgICAgICAgICA6IHRoaXMucHJveHkucHJvdG9jb2wgPT09ICdodHRwczonXG4gICAgICAgICAgICAgICAgPyA0NDNcbiAgICAgICAgICAgICAgICA6IDgwO1xuICAgICAgICB0aGlzLmNvbm5lY3RPcHRzID0ge1xuICAgICAgICAgICAgLi4uKG9wdHMgPyBvbWl0KG9wdHMsICdoZWFkZXJzJykgOiBudWxsKSxcbiAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICBwb3J0LFxuICAgICAgICB9O1xuICAgIH1cbiAgICBhZGRSZXF1ZXN0KHJlcSwgb3B0cykge1xuICAgICAgICByZXEuX2hlYWRlciA9IG51bGw7XG4gICAgICAgIHRoaXMuc2V0UmVxdWVzdFByb3BzKHJlcSwgb3B0cyk7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYGFkZFJlcXVlc3QoKWAgaXNuJ3QgZGVmaW5lZCBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgIHN1cGVyLmFkZFJlcXVlc3QocmVxLCBvcHRzKTtcbiAgICB9XG4gICAgc2V0UmVxdWVzdFByb3BzKHJlcSwgb3B0cykge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IG9wdHMuc2VjdXJlRW5kcG9pbnQgPyAnaHR0cHM6JyA6ICdodHRwOic7XG4gICAgICAgIGNvbnN0IGhvc3RuYW1lID0gcmVxLmdldEhlYWRlcignaG9zdCcpIHx8ICdsb2NhbGhvc3QnO1xuICAgICAgICBjb25zdCBiYXNlID0gYCR7cHJvdG9jb2x9Ly8ke2hvc3RuYW1lfWA7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyB1cmxfMS5VUkwocmVxLnBhdGgsIGJhc2UpO1xuICAgICAgICBpZiAob3B0cy5wb3J0ICE9PSA4MCkge1xuICAgICAgICAgICAgdXJsLnBvcnQgPSBTdHJpbmcob3B0cy5wb3J0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGFuZ2UgdGhlIGBodHRwLkNsaWVudFJlcXVlc3RgIGluc3RhbmNlJ3MgXCJwYXRoXCIgZmllbGRcbiAgICAgICAgLy8gdG8gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIFVSTCB0aGF0IHdpbGwgYmUgcmVxdWVzdGVkLlxuICAgICAgICByZXEucGF0aCA9IFN0cmluZyh1cmwpO1xuICAgICAgICAvLyBJbmplY3QgdGhlIGBQcm94eS1BdXRob3JpemF0aW9uYCBoZWFkZXIgaWYgbmVjZXNzYXJ5LlxuICAgICAgICBjb25zdCBoZWFkZXJzID0gdHlwZW9mIHRoaXMucHJveHlIZWFkZXJzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHRoaXMucHJveHlIZWFkZXJzKClcbiAgICAgICAgICAgIDogeyAuLi50aGlzLnByb3h5SGVhZGVycyB9O1xuICAgICAgICBpZiAocHJveHkudXNlcm5hbWUgfHwgcHJveHkucGFzc3dvcmQpIHtcbiAgICAgICAgICAgIGNvbnN0IGF1dGggPSBgJHtkZWNvZGVVUklDb21wb25lbnQocHJveHkudXNlcm5hbWUpfToke2RlY29kZVVSSUNvbXBvbmVudChwcm94eS5wYXNzd29yZCl9YDtcbiAgICAgICAgICAgIGhlYWRlcnNbJ1Byb3h5LUF1dGhvcml6YXRpb24nXSA9IGBCYXNpYyAke0J1ZmZlci5mcm9tKGF1dGgpLnRvU3RyaW5nKCdiYXNlNjQnKX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGVhZGVyc1snUHJveHktQ29ubmVjdGlvbiddKSB7XG4gICAgICAgICAgICBoZWFkZXJzWydQcm94eS1Db25uZWN0aW9uJ10gPSB0aGlzLmtlZXBBbGl2ZVxuICAgICAgICAgICAgICAgID8gJ0tlZXAtQWxpdmUnXG4gICAgICAgICAgICAgICAgOiAnY2xvc2UnO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhoZWFkZXJzKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXJzW25hbWVdO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmVxLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgY29ubmVjdChyZXEsIG9wdHMpIHtcbiAgICAgICAgcmVxLl9oZWFkZXIgPSBudWxsO1xuICAgICAgICBpZiAoIXJlcS5wYXRoLmluY2x1ZGVzKCc6Ly8nKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRSZXF1ZXN0UHJvcHMocmVxLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgaHR0cCBDbGllbnRSZXF1ZXN0J3MgaW50ZXJuYWwgYF9oZWFkZXJgIGZpZWxkXG4gICAgICAgIC8vIG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIHNldC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHdlJ2xsIG5lZWRcbiAgICAgICAgLy8gdG8gcmUtZ2VuZXJhdGUgdGhlIHN0cmluZyBzaW5jZSB3ZSBqdXN0IGNoYW5nZWQgdGhlIGByZXEucGF0aGAuXG4gICAgICAgIGxldCBmaXJzdDtcbiAgICAgICAgbGV0IGVuZE9mSGVhZGVycztcbiAgICAgICAgZGVidWcoJ1JlZ2VuZXJhdGluZyBzdG9yZWQgSFRUUCBoZWFkZXIgc3RyaW5nIGZvciByZXF1ZXN0Jyk7XG4gICAgICAgIHJlcS5faW1wbGljaXRIZWFkZXIoKTtcbiAgICAgICAgaWYgKHJlcS5vdXRwdXREYXRhICYmIHJlcS5vdXRwdXREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRlYnVnKCdQYXRjaGluZyBjb25uZWN0aW9uIHdyaXRlKCkgb3V0cHV0IGJ1ZmZlciB3aXRoIHVwZGF0ZWQgaGVhZGVyJyk7XG4gICAgICAgICAgICBmaXJzdCA9IHJlcS5vdXRwdXREYXRhWzBdLmRhdGE7XG4gICAgICAgICAgICBlbmRPZkhlYWRlcnMgPSBmaXJzdC5pbmRleE9mKCdcXHJcXG5cXHJcXG4nKSArIDQ7XG4gICAgICAgICAgICByZXEub3V0cHV0RGF0YVswXS5kYXRhID1cbiAgICAgICAgICAgICAgICByZXEuX2hlYWRlciArIGZpcnN0LnN1YnN0cmluZyhlbmRPZkhlYWRlcnMpO1xuICAgICAgICAgICAgZGVidWcoJ091dHB1dCBidWZmZXI6ICVvJywgcmVxLm91dHB1dERhdGFbMF0uZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ3JlYXRlIGEgc29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIHByb3h5IHNlcnZlci5cbiAgICAgICAgbGV0IHNvY2tldDtcbiAgICAgICAgaWYgKHRoaXMucHJveHkucHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgICAgICAgICBkZWJ1ZygnQ3JlYXRpbmcgYHRscy5Tb2NrZXRgOiAlbycsIHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICAgICAgc29ja2V0ID0gdGxzLmNvbm5lY3QodGhpcy5jb25uZWN0T3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWJ1ZygnQ3JlYXRpbmcgYG5ldC5Tb2NrZXRgOiAlbycsIHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICAgICAgc29ja2V0ID0gbmV0LmNvbm5lY3QodGhpcy5jb25uZWN0T3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHNvY2tldCdzIGBjb25uZWN0YCBldmVudCwgc28gdGhhdCB0aGlzIGBjYWxsYmFjaygpYFxuICAgICAgICAvLyBmdW5jdGlvbiB0aHJvd3MgaW5zdGVhZCBvZiB0aGUgYGh0dHBgIHJlcXVlc3QgbWFjaGluZXJ5LiBUaGlzIGlzXG4gICAgICAgIC8vIGltcG9ydGFudCBmb3IgaS5lLiBgUGFjUHJveHlBZ2VudGAgd2hpY2ggZGV0ZXJtaW5lcyBhIGZhaWxlZCBwcm94eVxuICAgICAgICAvLyBjb25uZWN0aW9uIHZpYSB0aGUgYGNhbGxiYWNrKClgIGZ1bmN0aW9uIHRocm93aW5nLlxuICAgICAgICBhd2FpdCAoMCwgZXZlbnRzXzEub25jZSkoc29ja2V0LCAnY29ubmVjdCcpO1xuICAgICAgICByZXR1cm4gc29ja2V0O1xuICAgIH1cbn1cbkh0dHBQcm94eUFnZW50LnByb3RvY29scyA9IFsnaHR0cCcsICdodHRwcyddO1xuZXhwb3J0cy5IdHRwUHJveHlBZ2VudCA9IEh0dHBQcm94eUFnZW50O1xuZnVuY3Rpb24gb21pdChvYmosIC4uLmtleXMpIHtcbiAgICBjb25zdCByZXQgPSB7fTtcbiAgICBsZXQga2V5O1xuICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0W2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSHR0cHNQcm94eUFnZW50ID0gdm9pZCAwO1xuY29uc3QgbmV0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJuZXRcIikpO1xuY29uc3QgdGxzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJ0bHNcIikpO1xuY29uc3QgYXNzZXJ0XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImFzc2VydFwiKSk7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBhZ2VudF9iYXNlXzEgPSByZXF1aXJlKFwiYWdlbnQtYmFzZVwiKTtcbmNvbnN0IHVybF8xID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IHBhcnNlX3Byb3h5X3Jlc3BvbnNlXzEgPSByZXF1aXJlKFwiLi9wYXJzZS1wcm94eS1yZXNwb25zZVwiKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2h0dHBzLXByb3h5LWFnZW50Jyk7XG4vKipcbiAqIFRoZSBgSHR0cHNQcm94eUFnZW50YCBpbXBsZW1lbnRzIGFuIEhUVFAgQWdlbnQgc3ViY2xhc3MgdGhhdCBjb25uZWN0cyB0b1xuICogdGhlIHNwZWNpZmllZCBcIkhUVFAocykgcHJveHkgc2VydmVyXCIgaW4gb3JkZXIgdG8gcHJveHkgSFRUUFMgcmVxdWVzdHMuXG4gKlxuICogT3V0Z29pbmcgSFRUUCByZXF1ZXN0cyBhcmUgZmlyc3QgdHVubmVsZWQgdGhyb3VnaCB0aGUgcHJveHkgc2VydmVyIHVzaW5nIHRoZVxuICogYENPTk5FQ1RgIEhUVFAgcmVxdWVzdCBtZXRob2QgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUgcHJveHkgc2VydmVyLFxuICogYW5kIHRoZW4gdGhlIHByb3h5IHNlcnZlciBjb25uZWN0cyB0byB0aGUgZGVzdGluYXRpb24gdGFyZ2V0IGFuZCBpc3N1ZXMgdGhlXG4gKiBIVFRQIHJlcXVlc3QgZnJvbSB0aGUgcHJveHkgc2VydmVyLlxuICpcbiAqIGBodHRwczpgIHJlcXVlc3RzIGhhdmUgdGhlaXIgc29ja2V0IGNvbm5lY3Rpb24gdXBncmFkZWQgdG8gVExTIG9uY2VcbiAqIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBwcm94eSBzZXJ2ZXIgaGFzIGJlZW4gZXN0YWJsaXNoZWQuXG4gKi9cbmNsYXNzIEh0dHBzUHJveHlBZ2VudCBleHRlbmRzIGFnZW50X2Jhc2VfMS5BZ2VudCB7XG4gICAgY29uc3RydWN0b3IocHJveHksIG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHsgcGF0aDogdW5kZWZpbmVkIH07XG4gICAgICAgIHRoaXMucHJveHkgPSB0eXBlb2YgcHJveHkgPT09ICdzdHJpbmcnID8gbmV3IHVybF8xLlVSTChwcm94eSkgOiBwcm94eTtcbiAgICAgICAgdGhpcy5wcm94eUhlYWRlcnMgPSBvcHRzPy5oZWFkZXJzID8/IHt9O1xuICAgICAgICBkZWJ1ZygnQ3JlYXRpbmcgbmV3IEh0dHBzUHJveHlBZ2VudCBpbnN0YW5jZTogJW8nLCB0aGlzLnByb3h5LmhyZWYpO1xuICAgICAgICAvLyBUcmltIG9mZiB0aGUgYnJhY2tldHMgZnJvbSBJUHY2IGFkZHJlc3Nlc1xuICAgICAgICBjb25zdCBob3N0ID0gKHRoaXMucHJveHkuaG9zdG5hbWUgfHwgdGhpcy5wcm94eS5ob3N0KS5yZXBsYWNlKC9eXFxbfFxcXSQvZywgJycpO1xuICAgICAgICBjb25zdCBwb3J0ID0gdGhpcy5wcm94eS5wb3J0XG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMucHJveHkucG9ydCwgMTApXG4gICAgICAgICAgICA6IHRoaXMucHJveHkucHJvdG9jb2wgPT09ICdodHRwczonXG4gICAgICAgICAgICAgICAgPyA0NDNcbiAgICAgICAgICAgICAgICA6IDgwO1xuICAgICAgICB0aGlzLmNvbm5lY3RPcHRzID0ge1xuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBuZWdvdGlhdGUgaHR0cC8xLjEgZm9yIHByb3h5IHNlcnZlcnMgdGhhdCBzdXBwb3J0IGh0dHAvMlxuICAgICAgICAgICAgQUxQTlByb3RvY29sczogWydodHRwLzEuMSddLFxuICAgICAgICAgICAgLi4uKG9wdHMgPyBvbWl0KG9wdHMsICdoZWFkZXJzJykgOiBudWxsKSxcbiAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICBwb3J0LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbm9kZS1jb3JlIEhUVFAgY2xpZW50IGxpYnJhcnkgaXMgY3JlYXRpbmcgYVxuICAgICAqIG5ldyBIVFRQIHJlcXVlc3QuXG4gICAgICovXG4gICAgYXN5bmMgY29ubmVjdChyZXEsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFvcHRzLmhvc3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ05vIFwiaG9zdFwiIHByb3ZpZGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ3JlYXRlIGEgc29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIHByb3h5IHNlcnZlci5cbiAgICAgICAgbGV0IHNvY2tldDtcbiAgICAgICAgaWYgKHByb3h5LnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgICAgICAgZGVidWcoJ0NyZWF0aW5nIGB0bHMuU29ja2V0YDogJW8nLCB0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZlcm5hbWUgPSB0aGlzLmNvbm5lY3RPcHRzLnNlcnZlcm5hbWUgfHwgdGhpcy5jb25uZWN0T3B0cy5ob3N0O1xuICAgICAgICAgICAgc29ja2V0ID0gdGxzLmNvbm5lY3Qoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29ubmVjdE9wdHMsXG4gICAgICAgICAgICAgICAgc2VydmVybmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVidWcoJ0NyZWF0aW5nIGBuZXQuU29ja2V0YDogJW8nLCB0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIHNvY2tldCA9IG5ldC5jb25uZWN0KHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0eXBlb2YgdGhpcy5wcm94eUhlYWRlcnMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gdGhpcy5wcm94eUhlYWRlcnMoKVxuICAgICAgICAgICAgOiB7IC4uLnRoaXMucHJveHlIZWFkZXJzIH07XG4gICAgICAgIGNvbnN0IGhvc3QgPSBuZXQuaXNJUHY2KG9wdHMuaG9zdCkgPyBgWyR7b3B0cy5ob3N0fV1gIDogb3B0cy5ob3N0O1xuICAgICAgICBsZXQgcGF5bG9hZCA9IGBDT05ORUNUICR7aG9zdH06JHtvcHRzLnBvcnR9IEhUVFAvMS4xXFxyXFxuYDtcbiAgICAgICAgLy8gSW5qZWN0IHRoZSBgUHJveHktQXV0aG9yaXphdGlvbmAgaGVhZGVyIGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgaWYgKHByb3h5LnVzZXJuYW1lIHx8IHByb3h5LnBhc3N3b3JkKSB7XG4gICAgICAgICAgICBjb25zdCBhdXRoID0gYCR7ZGVjb2RlVVJJQ29tcG9uZW50KHByb3h5LnVzZXJuYW1lKX06JHtkZWNvZGVVUklDb21wb25lbnQocHJveHkucGFzc3dvcmQpfWA7XG4gICAgICAgICAgICBoZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtCdWZmZXIuZnJvbShhdXRoKS50b1N0cmluZygnYmFzZTY0Jyl9YDtcbiAgICAgICAgfVxuICAgICAgICBoZWFkZXJzLkhvc3QgPSBgJHtob3N0fToke29wdHMucG9ydH1gO1xuICAgICAgICBpZiAoIWhlYWRlcnNbJ1Byb3h5LUNvbm5lY3Rpb24nXSkge1xuICAgICAgICAgICAgaGVhZGVyc1snUHJveHktQ29ubmVjdGlvbiddID0gdGhpcy5rZWVwQWxpdmVcbiAgICAgICAgICAgICAgICA/ICdLZWVwLUFsaXZlJ1xuICAgICAgICAgICAgICAgIDogJ2Nsb3NlJztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoaGVhZGVycykpIHtcbiAgICAgICAgICAgIHBheWxvYWQgKz0gYCR7bmFtZX06ICR7aGVhZGVyc1tuYW1lXX1cXHJcXG5gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3h5UmVzcG9uc2VQcm9taXNlID0gKDAsIHBhcnNlX3Byb3h5X3Jlc3BvbnNlXzEucGFyc2VQcm94eVJlc3BvbnNlKShzb2NrZXQpO1xuICAgICAgICBzb2NrZXQud3JpdGUoYCR7cGF5bG9hZH1cXHJcXG5gKTtcbiAgICAgICAgY29uc3QgeyBjb25uZWN0LCBidWZmZXJlZCB9ID0gYXdhaXQgcHJveHlSZXNwb25zZVByb21pc2U7XG4gICAgICAgIHJlcS5lbWl0KCdwcm94eUNvbm5lY3QnLCBjb25uZWN0KTtcbiAgICAgICAgdGhpcy5lbWl0KCdwcm94eUNvbm5lY3QnLCBjb25uZWN0LCByZXEpO1xuICAgICAgICBpZiAoY29ubmVjdC5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgICAgICAgIHJlcS5vbmNlKCdzb2NrZXQnLCByZXN1bWUpO1xuICAgICAgICAgICAgaWYgKG9wdHMuc2VjdXJlRW5kcG9pbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcHJveHkgaXMgY29ubmVjdGluZyB0byBhIFRMUyBzZXJ2ZXIsIHNvIHVwZ3JhZGVcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHNvY2tldCBjb25uZWN0aW9uIHRvIGEgVExTIGNvbm5lY3Rpb24uXG4gICAgICAgICAgICAgICAgZGVidWcoJ1VwZ3JhZGluZyBzb2NrZXQgY29ubmVjdGlvbiB0byBUTFMnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJ2ZXJuYW1lID0gb3B0cy5zZXJ2ZXJuYW1lIHx8IG9wdHMuaG9zdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGxzLmNvbm5lY3Qoe1xuICAgICAgICAgICAgICAgICAgICAuLi5vbWl0KG9wdHMsICdob3N0JywgJ3BhdGgnLCAncG9ydCcpLFxuICAgICAgICAgICAgICAgICAgICBzb2NrZXQsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlcm5hbWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc29ja2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvbWUgb3RoZXIgc3RhdHVzIGNvZGUgdGhhdCdzIG5vdCAyMDAuLi4gbmVlZCB0byByZS1wbGF5IHRoZSBIVFRQXG4gICAgICAgIC8vIGhlYWRlciBcImRhdGFcIiBldmVudHMgb250byB0aGUgc29ja2V0IG9uY2UgdGhlIEhUVFAgbWFjaGluZXJ5IGlzXG4gICAgICAgIC8vIGF0dGFjaGVkIHNvIHRoYXQgdGhlIG5vZGUgY29yZSBgaHR0cGAgY2FuIHBhcnNlIGFuZCBoYW5kbGUgdGhlXG4gICAgICAgIC8vIGVycm9yIHN0YXR1cyBjb2RlLlxuICAgICAgICAvLyBDbG9zZSB0aGUgb3JpZ2luYWwgc29ja2V0LCBhbmQgYSBuZXcgXCJmYWtlXCIgc29ja2V0IGlzIHJldHVybmVkXG4gICAgICAgIC8vIGluc3RlYWQsIHNvIHRoYXQgdGhlIHByb3h5IGRvZXNuJ3QgZ2V0IHRoZSBIVFRQIHJlcXVlc3RcbiAgICAgICAgLy8gd3JpdHRlbiB0byBpdCAod2hpY2ggbWF5IGNvbnRhaW4gYEF1dGhvcml6YXRpb25gIGhlYWRlcnMgb3Igb3RoZXJcbiAgICAgICAgLy8gc2Vuc2l0aXZlIGRhdGEpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTZWU6IGh0dHBzOi8vaGFja2Vyb25lLmNvbS9yZXBvcnRzLzU0MTUwMlxuICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICBjb25zdCBmYWtlU29ja2V0ID0gbmV3IG5ldC5Tb2NrZXQoeyB3cml0YWJsZTogZmFsc2UgfSk7XG4gICAgICAgIGZha2VTb2NrZXQucmVhZGFibGUgPSB0cnVlO1xuICAgICAgICAvLyBOZWVkIHRvIHdhaXQgZm9yIHRoZSBcInNvY2tldFwiIGV2ZW50IHRvIHJlLXBsYXkgdGhlIFwiZGF0YVwiIGV2ZW50cy5cbiAgICAgICAgcmVxLm9uY2UoJ3NvY2tldCcsIChzKSA9PiB7XG4gICAgICAgICAgICBkZWJ1ZygnUmVwbGF5aW5nIHByb3h5IGJ1ZmZlciBmb3IgZmFpbGVkIHJlcXVlc3QnKTtcbiAgICAgICAgICAgICgwLCBhc3NlcnRfMS5kZWZhdWx0KShzLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA+IDApO1xuICAgICAgICAgICAgLy8gUmVwbGF5IHRoZSBcImJ1ZmZlcmVkXCIgQnVmZmVyIG9udG8gdGhlIGZha2UgYHNvY2tldGAsIHNpbmNlIGF0XG4gICAgICAgICAgICAvLyB0aGlzIHBvaW50IHRoZSBIVFRQIG1vZHVsZSBtYWNoaW5lcnkgaGFzIGJlZW4gaG9va2VkIHVwIGZvclxuICAgICAgICAgICAgLy8gdGhlIHVzZXIuXG4gICAgICAgICAgICBzLnB1c2goYnVmZmVyZWQpO1xuICAgICAgICAgICAgcy5wdXNoKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZha2VTb2NrZXQ7XG4gICAgfVxufVxuSHR0cHNQcm94eUFnZW50LnByb3RvY29scyA9IFsnaHR0cCcsICdodHRwcyddO1xuZXhwb3J0cy5IdHRwc1Byb3h5QWdlbnQgPSBIdHRwc1Byb3h5QWdlbnQ7XG5mdW5jdGlvbiByZXN1bWUoc29ja2V0KSB7XG4gICAgc29ja2V0LnJlc3VtZSgpO1xufVxuZnVuY3Rpb24gb21pdChvYmosIC4uLmtleXMpIHtcbiAgICBjb25zdCByZXQgPSB7fTtcbiAgICBsZXQga2V5O1xuICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0W2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlUHJveHlSZXNwb25zZSA9IHZvaWQgMDtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2h0dHBzLXByb3h5LWFnZW50OnBhcnNlLXByb3h5LXJlc3BvbnNlJyk7XG5mdW5jdGlvbiBwYXJzZVByb3h5UmVzcG9uc2Uoc29ja2V0KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gd2UgbmVlZCB0byBidWZmZXIgYW55IEhUVFAgdHJhZmZpYyB0aGF0IGhhcHBlbnMgd2l0aCB0aGUgcHJveHkgYmVmb3JlIHdlIGdldFxuICAgICAgICAvLyB0aGUgQ09OTkVDVCByZXNwb25zZSwgc28gdGhhdCBpZiB0aGUgcmVzcG9uc2UgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBhbiBcIjIwMFwiXG4gICAgICAgIC8vIHJlc3BvbnNlIGNvZGUsIHRoZW4gd2UgY2FuIHJlLXBsYXkgdGhlIFwiZGF0YVwiIGV2ZW50cyBvbiB0aGUgc29ja2V0IG9uY2UgdGhlXG4gICAgICAgIC8vIEhUVFAgcGFyc2VyIGlzIGhvb2tlZCB1cC4uLlxuICAgICAgICBsZXQgYnVmZmVyc0xlbmd0aCA9IDA7XG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gcmVhZCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGIgPSBzb2NrZXQucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGIpXG4gICAgICAgICAgICAgICAgb25kYXRhKGIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNvY2tldC5vbmNlKCdyZWFkYWJsZScsIHJlYWQpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcigncmVhZGFibGUnLCByZWFkKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJveHkgY29ubmVjdGlvbiBlbmRlZCBiZWZvcmUgcmVjZWl2aW5nIENPTk5FQ1QgcmVzcG9uc2UnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb25lcnJvcihlcnIpIHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIGRlYnVnKCdvbmVycm9yICVvJywgZXJyKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG9uZGF0YShiKSB7XG4gICAgICAgICAgICBidWZmZXJzLnB1c2goYik7XG4gICAgICAgICAgICBidWZmZXJzTGVuZ3RoICs9IGIubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyZWQgPSBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMsIGJ1ZmZlcnNMZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgZW5kT2ZIZWFkZXJzID0gYnVmZmVyZWQuaW5kZXhPZignXFxyXFxuXFxyXFxuJyk7XG4gICAgICAgICAgICBpZiAoZW5kT2ZIZWFkZXJzID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgYnVmZmVyaW5nXG4gICAgICAgICAgICAgICAgZGVidWcoJ2hhdmUgbm90IHJlY2VpdmVkIGVuZCBvZiBIVFRQIGhlYWRlcnMgeWV0Li4uJyk7XG4gICAgICAgICAgICAgICAgcmVhZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclBhcnRzID0gYnVmZmVyZWRcbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgZW5kT2ZIZWFkZXJzKVxuICAgICAgICAgICAgICAgIC50b1N0cmluZygnYXNjaWknKVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnXFxyXFxuJyk7XG4gICAgICAgICAgICBjb25zdCBmaXJzdExpbmUgPSBoZWFkZXJQYXJ0cy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKCFmaXJzdExpbmUpIHtcbiAgICAgICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdObyBoZWFkZXIgcmVjZWl2ZWQgZnJvbSBwcm94eSBDT05ORUNUIHJlc3BvbnNlJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmlyc3RMaW5lUGFydHMgPSBmaXJzdExpbmUuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSArZmlyc3RMaW5lUGFydHNbMV07XG4gICAgICAgICAgICBjb25zdCBzdGF0dXNUZXh0ID0gZmlyc3RMaW5lUGFydHMuc2xpY2UoMikuam9pbignICcpO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgb2YgaGVhZGVyUGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcilcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDb2xvbiA9IGhlYWRlci5pbmRleE9mKCc6Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29sb24gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBJbnZhbGlkIGhlYWRlciBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2U6IFwiJHtoZWFkZXJ9XCJgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zbGljZSgwLCBmaXJzdENvbG9uKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZGVyLnNsaWNlKGZpcnN0Q29sb24gKyAxKS50cmltU3RhcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gaGVhZGVyc1trZXldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gW2N1cnJlbnQsIHZhbHVlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVidWcoJ2dvdCBwcm94eSBzZXJ2ZXIgcmVzcG9uc2U6ICVvICVvJywgZmlyc3RMaW5lLCBoZWFkZXJzKTtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgIGNvbm5lY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJ1ZmZlcmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ja2V0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgICAgICBzb2NrZXQub24oJ2VuZCcsIG9uZW5kKTtcbiAgICAgICAgcmVhZCgpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5wYXJzZVByb3h5UmVzcG9uc2UgPSBwYXJzZVByb3h5UmVzcG9uc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1wcm94eS1yZXNwb25zZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQWRkcmVzc0Vycm9yID0gdm9pZCAwO1xuY2xhc3MgQWRkcmVzc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHBhcnNlTWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0FkZHJlc3NFcnJvcic7XG4gICAgICAgIGlmIChwYXJzZU1lc3NhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VNZXNzYWdlID0gcGFyc2VNZXNzYWdlO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BZGRyZXNzRXJyb3IgPSBBZGRyZXNzRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGRyZXNzLWVycm9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0NvcnJlY3QgPSBleHBvcnRzLmlzSW5TdWJuZXQgPSB2b2lkIDA7XG5mdW5jdGlvbiBpc0luU3VibmV0KGFkZHJlc3MpIHtcbiAgICBpZiAodGhpcy5zdWJuZXRNYXNrIDwgYWRkcmVzcy5zdWJuZXRNYXNrKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWFzayhhZGRyZXNzLnN1Ym5ldE1hc2spID09PSBhZGRyZXNzLm1hc2soKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0cy5pc0luU3VibmV0ID0gaXNJblN1Ym5ldDtcbmZ1bmN0aW9uIGlzQ29ycmVjdChkZWZhdWx0Qml0cykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmFkZHJlc3NNaW51c1N1ZmZpeCAhPT0gdGhpcy5jb3JyZWN0Rm9ybSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3VibmV0TWFzayA9PT0gZGVmYXVsdEJpdHMgJiYgIXRoaXMucGFyc2VkU3VibmV0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZWRTdWJuZXQgPT09IFN0cmluZyh0aGlzLnN1Ym5ldE1hc2spO1xuICAgIH07XG59XG5leHBvcnRzLmlzQ29ycmVjdCA9IGlzQ29ycmVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbW1vbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy52NiA9IGV4cG9ydHMuQWRkcmVzc0Vycm9yID0gZXhwb3J0cy5BZGRyZXNzNiA9IGV4cG9ydHMuQWRkcmVzczQgPSB2b2lkIDA7XG5jb25zdCBpcHY0XzEgPSByZXF1aXJlKFwiLi9pcHY0XCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQWRkcmVzczRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGlwdjRfMS5BZGRyZXNzNDsgfSB9KTtcbmNvbnN0IGlwdjZfMSA9IHJlcXVpcmUoXCIuL2lwdjZcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBZGRyZXNzNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gaXB2Nl8xLkFkZHJlc3M2OyB9IH0pO1xuY29uc3QgYWRkcmVzc19lcnJvcl8xID0gcmVxdWlyZShcIi4vYWRkcmVzcy1lcnJvclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkFkZHJlc3NFcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcjsgfSB9KTtcbmNvbnN0IGhlbHBlcnMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vdjYvaGVscGVyc1wiKSk7XG5leHBvcnRzLnY2ID0geyBoZWxwZXJzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcC1hZGRyZXNzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BZGRyZXNzNCA9IHZvaWQgMDtcbmNvbnN0IGNvbW1vbiA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb21tb25cIikpO1xuY29uc3QgY29uc3RhbnRzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Y0L2NvbnN0YW50c1wiKSk7XG5jb25zdCBhZGRyZXNzX2Vycm9yXzEgPSByZXF1aXJlKFwiLi9hZGRyZXNzLWVycm9yXCIpO1xuY29uc3QganNibl8xID0gcmVxdWlyZShcImpzYm5cIik7XG5jb25zdCBzcHJpbnRmX2pzXzEgPSByZXF1aXJlKFwic3ByaW50Zi1qc1wiKTtcbi8qKlxuICogUmVwcmVzZW50cyBhbiBJUHY0IGFkZHJlc3NcbiAqIEBjbGFzcyBBZGRyZXNzNFxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSBBbiBJUHY0IGFkZHJlc3Mgc3RyaW5nXG4gKi9cbmNsYXNzIEFkZHJlc3M0IHtcbiAgICBjb25zdHJ1Y3RvcihhZGRyZXNzKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gY29uc3RhbnRzLkdST1VQUztcbiAgICAgICAgdGhpcy5wYXJzZWRBZGRyZXNzID0gW107XG4gICAgICAgIHRoaXMucGFyc2VkU3VibmV0ID0gJyc7XG4gICAgICAgIHRoaXMuc3VibmV0ID0gJy8zMic7XG4gICAgICAgIHRoaXMuc3VibmV0TWFzayA9IDMyO1xuICAgICAgICB0aGlzLnY0ID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBjb3JyZWN0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNDb3JyZWN0ID0gY29tbW9uLmlzQ29ycmVjdChjb25zdGFudHMuQklUUyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGFkZHJlc3MgaXMgaW4gdGhlIHN1Ym5ldCBvZiB0aGUgY3VycmVudCBhZGRyZXNzXG4gICAgICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzSW5TdWJuZXQgPSBjb21tb24uaXNJblN1Ym5ldDtcbiAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgICAgICAgY29uc3Qgc3VibmV0ID0gY29uc3RhbnRzLlJFX1NVQk5FVF9TVFJJTkcuZXhlYyhhZGRyZXNzKTtcbiAgICAgICAgaWYgKHN1Ym5ldCkge1xuICAgICAgICAgICAgdGhpcy5wYXJzZWRTdWJuZXQgPSBzdWJuZXRbMF0ucmVwbGFjZSgnLycsICcnKTtcbiAgICAgICAgICAgIHRoaXMuc3VibmV0TWFzayA9IHBhcnNlSW50KHRoaXMucGFyc2VkU3VibmV0LCAxMCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym5ldCA9IGAvJHt0aGlzLnN1Ym5ldE1hc2t9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLnN1Ym5ldE1hc2sgPCAwIHx8IHRoaXMuc3VibmV0TWFzayA+IGNvbnN0YW50cy5CSVRTKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoJ0ludmFsaWQgc3VibmV0IG1hc2suJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5yZXBsYWNlKGNvbnN0YW50cy5SRV9TVUJORVRfU1RSSU5HLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRyZXNzTWludXNTdWZmaXggPSBhZGRyZXNzO1xuICAgICAgICB0aGlzLnBhcnNlZEFkZHJlc3MgPSB0aGlzLnBhcnNlKGFkZHJlc3MpO1xuICAgIH1cbiAgICBzdGF0aWMgaXNWYWxpZChhZGRyZXNzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgICAgICAgICBuZXcgQWRkcmVzczQoYWRkcmVzcyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qXG4gICAgICogUGFyc2VzIGEgdjQgYWRkcmVzc1xuICAgICAqL1xuICAgIHBhcnNlKGFkZHJlc3MpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gYWRkcmVzcy5zcGxpdCgnLicpO1xuICAgICAgICBpZiAoIWFkZHJlc3MubWF0Y2goY29uc3RhbnRzLlJFX0FERFJFU1MpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcignSW52YWxpZCBJUHY0IGFkZHJlc3MuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdyb3VwcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29ycmVjdCBmb3JtIG9mIGFuIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGNvcnJlY3RGb3JtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZWRBZGRyZXNzLm1hcCgocGFydCkgPT4gcGFyc2VJbnQocGFydCwgMTApKS5qb2luKCcuJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgaGV4IHN0cmluZyB0byBhbiBJUHY0IGFkZHJlc3Mgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBoZXggLSBhIGhleCBzdHJpbmcgdG8gY29udmVydFxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUhleChoZXgpIHtcbiAgICAgICAgY29uc3QgcGFkZGVkID0gaGV4LnJlcGxhY2UoLzovZywgJycpLnBhZFN0YXJ0KDgsICcwJyk7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IFtdO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgaCA9IHBhZGRlZC5zbGljZShpLCBpICsgMik7XG4gICAgICAgICAgICBncm91cHMucHVzaChwYXJzZUludChoLCAxNikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQWRkcmVzczQoZ3JvdXBzLmpvaW4oJy4nKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIGludGVnZXIgaW50byBhIElQdjQgYWRkcmVzcyBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBpbnRlZ2VyIC0gYSBudW1iZXIgdG8gY29udmVydFxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUludGVnZXIoaW50ZWdlcikge1xuICAgICAgICByZXR1cm4gQWRkcmVzczQuZnJvbUhleChpbnRlZ2VyLnRvU3RyaW5nKDE2KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBhZGRyZXNzIGZyb20gaW4tYWRkci5hcnBhIGZvcm1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFycGFGb3JtQWRkcmVzcyAtIGFuICdpbi1hZGRyLmFycGEnIGZvcm0gaXB2NCBhZGRyZXNzXG4gICAgICogQHJldHVybnMge0FkcmVzczR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgYWRkcmVzcyA9IEFkZHJlc3M0LmZyb21BcnBhKDQyLjIuMC4xOTIuaW4tYWRkci5hcnBhLilcbiAgICAgKiBhZGRyZXNzLmNvcnJlY3RGb3JtKCk7IC8vICcxOTIuMC4yLjQyJ1xuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tQXJwYShhcnBhRm9ybUFkZHJlc3MpIHtcbiAgICAgICAgLy8gcmVtb3ZlIGVuZGluZyBcIi5pbi1hZGRyLmFycGEuXCIgb3IganVzdCBcIi5cIlxuICAgICAgICBjb25zdCBsZWFkZXIgPSBhcnBhRm9ybUFkZHJlc3MucmVwbGFjZSgvKFxcLmluLWFkZHJcXC5hcnBhKT9cXC4kLywgJycpO1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gbGVhZGVyLnNwbGl0KCcuJykucmV2ZXJzZSgpLmpvaW4oJy4nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRyZXNzNChhZGRyZXNzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gSVB2NCBhZGRyZXNzIG9iamVjdCB0byBhIGhleCBzdHJpbmdcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRvSGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZWRBZGRyZXNzLm1hcCgocGFydCkgPT4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJTAyeCcsIHBhcnNlSW50KHBhcnQsIDEwKSkpLmpvaW4oJzonKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gSVB2NCBhZGRyZXNzIG9iamVjdCB0byBhbiBhcnJheSBvZiBieXRlc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZWRBZGRyZXNzLm1hcCgocGFydCkgPT4gcGFyc2VJbnQocGFydCwgMTApKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gSVB2NCBhZGRyZXNzIG9iamVjdCB0byBhbiBJUHY2IGFkZHJlc3MgZ3JvdXBcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRvR3JvdXA2KCkge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBbXTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25zdGFudHMuR1JPVVBTOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGhleCA9ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyUwMnglMDJ4JywgcGFyc2VJbnQodGhpcy5wYXJzZWRBZGRyZXNzW2ldLCAxMCksIHBhcnNlSW50KHRoaXMucGFyc2VkQWRkcmVzc1tpICsgMV0sIDEwKSk7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCgoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCcleCcsIHBhcnNlSW50KGhleCwgMTYpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dC5qb2luKCc6Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFkZHJlc3MgYXMgYSBCaWdJbnRlZ2VyXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0JpZ0ludGVnZXJ9XG4gICAgICovXG4gICAgYmlnSW50ZWdlcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBqc2JuXzEuQmlnSW50ZWdlcih0aGlzLnBhcnNlZEFkZHJlc3MubWFwKChuKSA9PiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclMDJ4JywgcGFyc2VJbnQobiwgMTApKSkuam9pbignJyksIDE2KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIGdldHRpbmcgc3RhcnQgYWRkcmVzcy5cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QmlnSW50ZWdlcn1cbiAgICAgKi9cbiAgICBfc3RhcnRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKHRoaXMubWFzaygpICsgJzAnLnJlcGVhdChjb25zdGFudHMuQklUUyAtIHRoaXMuc3VibmV0TWFzayksIDIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZmlyc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJyBzdWJuZXQuXG4gICAgICogT2Z0ZW4gcmVmZXJyZWQgdG8gYXMgdGhlIE5ldHdvcmsgQWRkcmVzcy5cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczR9XG4gICAgICovXG4gICAgc3RhcnRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gQWRkcmVzczQuZnJvbUJpZ0ludGVnZXIodGhpcy5fc3RhcnRBZGRyZXNzKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZmlyc3QgaG9zdCBhZGRyZXNzIGluIHRoZSByYW5nZSBnaXZlbiBieSB0aGlzIGFkZHJlc3MncyBzdWJuZXQgaWVcbiAgICAgKiB0aGUgZmlyc3QgYWRkcmVzcyBhZnRlciB0aGUgTmV0d29yayBBZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M0fVxuICAgICAqL1xuICAgIHN0YXJ0QWRkcmVzc0V4Y2x1c2l2ZSgpIHtcbiAgICAgICAgY29uc3QgYWRqdXN0ID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcxJyk7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNC5mcm9tQmlnSW50ZWdlcih0aGlzLl9zdGFydEFkZHJlc3MoKS5hZGQoYWRqdXN0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiBnZXR0aW5nIGVuZCBhZGRyZXNzLlxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtCaWdJbnRlZ2VyfVxuICAgICAqL1xuICAgIF9lbmRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKHRoaXMubWFzaygpICsgJzEnLnJlcGVhdChjb25zdGFudHMuQklUUyAtIHRoaXMuc3VibmV0TWFzayksIDIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBhZGRyZXNzIGluIHRoZSByYW5nZSBnaXZlbiBieSB0aGlzIGFkZHJlc3MnIHN1Ym5ldFxuICAgICAqIE9mdGVuIHJlZmVycmVkIHRvIGFzIHRoZSBCcm9hZGNhc3RcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczR9XG4gICAgICovXG4gICAgZW5kQWRkcmVzcygpIHtcbiAgICAgICAgcmV0dXJuIEFkZHJlc3M0LmZyb21CaWdJbnRlZ2VyKHRoaXMuX2VuZEFkZHJlc3MoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IGhvc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJ3Mgc3VibmV0IGllXG4gICAgICogdGhlIGxhc3QgYWRkcmVzcyBwcmlvciB0byB0aGUgQnJvYWRjYXN0IEFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczR9XG4gICAgICovXG4gICAgZW5kQWRkcmVzc0V4Y2x1c2l2ZSgpIHtcbiAgICAgICAgY29uc3QgYWRqdXN0ID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcxJyk7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNC5mcm9tQmlnSW50ZWdlcih0aGlzLl9lbmRBZGRyZXNzKCkuc3VidHJhY3QoYWRqdXN0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgQmlnSW50ZWdlciB0byBhIHY0IGFkZHJlc3Mgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7QmlnSW50ZWdlcn0gYmlnSW50ZWdlciAtIGEgQmlnSW50ZWdlciB0byBjb252ZXJ0XG4gICAgICogQHJldHVybnMge0FkZHJlc3M0fVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tQmlnSW50ZWdlcihiaWdJbnRlZ2VyKSB7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNC5mcm9tSW50ZWdlcihwYXJzZUludChiaWdJbnRlZ2VyLnRvU3RyaW5nKCksIDEwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IG4gYml0cyBvZiB0aGUgYWRkcmVzcywgZGVmYXVsdGluZyB0byB0aGVcbiAgICAgKiBzdWJuZXQgbWFza1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgbWFzayhtYXNrKSB7XG4gICAgICAgIGlmIChtYXNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1hc2sgPSB0aGlzLnN1Ym5ldE1hc2s7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qml0c0Jhc2UyKDAsIG1hc2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiaXRzIGluIHRoZSBnaXZlbiByYW5nZSBhcyBhIGJhc2UtMiBzdHJpbmdcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldEJpdHNCYXNlMihzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmFyeVplcm9QYWQoKS5zbGljZShzdGFydCwgZW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSByZXZlcnNlZCBpcDYuYXJwYSBmb3JtIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMub21pdFN1ZmZpeCAtIG9taXQgdGhlIFwiaW4tYWRkci5hcnBhXCIgc3VmZml4XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICByZXZlcnNlRm9ybShvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldmVyc2VkID0gdGhpcy5jb3JyZWN0Rm9ybSgpLnNwbGl0KCcuJykucmV2ZXJzZSgpLmpvaW4oJy4nKTtcbiAgICAgICAgaWYgKG9wdGlvbnMub21pdFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldmVyc2VkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclcy5pbi1hZGRyLmFycGEuJywgcmV2ZXJzZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGFkZHJlc3MgaXMgYSBtdWx0aWNhc3QgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzTXVsdGljYXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0luU3VibmV0KG5ldyBBZGRyZXNzNCgnMjI0LjAuMC4wLzQnKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB6ZXJvLXBhZGRlZCBiYXNlLTIgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBiaW5hcnlaZXJvUGFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWdJbnRlZ2VyKCkudG9TdHJpbmcoMikucGFkU3RhcnQoY29uc3RhbnRzLkJJVFMsICcwJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdyb3VwcyBhbiBJUHY0IGFkZHJlc3MgZm9yIGluY2x1c2lvbiBhdCB0aGUgZW5kIG9mIGFuIElQdjYgYWRkcmVzc1xuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ3JvdXBGb3JWNigpIHtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnBhcnNlZEFkZHJlc3M7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3MucmVwbGFjZShjb25zdGFudHMuUkVfQUREUkVTUywgKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnPHNwYW4gY2xhc3M9XCJob3Zlci1ncm91cCBncm91cC12NCBncm91cC02XCI+JXM8L3NwYW4+LjxzcGFuIGNsYXNzPVwiaG92ZXItZ3JvdXAgZ3JvdXAtdjQgZ3JvdXAtN1wiPiVzPC9zcGFuPicsIHNlZ21lbnRzLnNsaWNlKDAsIDIpLmpvaW4oJy4nKSwgc2VnbWVudHMuc2xpY2UoMiwgNCkuam9pbignLicpKSk7XG4gICAgfVxufVxuZXhwb3J0cy5BZGRyZXNzNCA9IEFkZHJlc3M0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXB2NC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qIGVzbGludC1kaXNhYmxlIHByZWZlci1kZXN0cnVjdHVyaW5nICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFkZHJlc3M2ID0gdm9pZCAwO1xuY29uc3QgY29tbW9uID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbW1vblwiKSk7XG5jb25zdCBjb25zdGFudHM0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Y0L2NvbnN0YW50c1wiKSk7XG5jb25zdCBjb25zdGFudHM2ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Y2L2NvbnN0YW50c1wiKSk7XG5jb25zdCBoZWxwZXJzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Y2L2hlbHBlcnNcIikpO1xuY29uc3QgaXB2NF8xID0gcmVxdWlyZShcIi4vaXB2NFwiKTtcbmNvbnN0IHJlZ3VsYXJfZXhwcmVzc2lvbnNfMSA9IHJlcXVpcmUoXCIuL3Y2L3JlZ3VsYXItZXhwcmVzc2lvbnNcIik7XG5jb25zdCBhZGRyZXNzX2Vycm9yXzEgPSByZXF1aXJlKFwiLi9hZGRyZXNzLWVycm9yXCIpO1xuY29uc3QganNibl8xID0gcmVxdWlyZShcImpzYm5cIik7XG5jb25zdCBzcHJpbnRmX2pzXzEgPSByZXF1aXJlKFwic3ByaW50Zi1qc1wiKTtcbmZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24pIHtcbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQuJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkQ29tbWFzKG51bWJlcikge1xuICAgIGNvbnN0IHIgPSAvKFxcZCspKFxcZHszfSkvO1xuICAgIHdoaWxlIChyLnRlc3QobnVtYmVyKSkge1xuICAgICAgICBudW1iZXIgPSBudW1iZXIucmVwbGFjZShyLCAnJDEsJDInKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bWJlcjtcbn1cbmZ1bmN0aW9uIHNwYW5MZWFkaW5nWmVyb2VzNChuKSB7XG4gICAgbiA9IG4ucmVwbGFjZSgvXigwezEsfSkoWzEtOV0rKSQvLCAnPHNwYW4gY2xhc3M9XCJwYXJzZS1lcnJvclwiPiQxPC9zcGFuPiQyJyk7XG4gICAgbiA9IG4ucmVwbGFjZSgvXigwezEsfSkoMCkkLywgJzxzcGFuIGNsYXNzPVwicGFyc2UtZXJyb3JcIj4kMTwvc3Bhbj4kMicpO1xuICAgIHJldHVybiBuO1xufVxuLypcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNvbXBhY3QgYW4gYXJyYXlcbiAqL1xuZnVuY3Rpb24gY29tcGFjdChhZGRyZXNzLCBzbGljZSkge1xuICAgIGNvbnN0IHMxID0gW107XG4gICAgY29uc3QgczIgPSBbXTtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYWRkcmVzcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSA8IHNsaWNlWzBdKSB7XG4gICAgICAgICAgICBzMS5wdXNoKGFkZHJlc3NbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGkgPiBzbGljZVsxXSkge1xuICAgICAgICAgICAgczIucHVzaChhZGRyZXNzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gczEuY29uY2F0KFsnY29tcGFjdCddKS5jb25jYXQoczIpO1xufVxuZnVuY3Rpb24gcGFkZGVkSGV4KG9jdGV0KSB7XG4gICAgcmV0dXJuICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyUwNHgnLCBwYXJzZUludChvY3RldCwgMTYpKTtcbn1cbmZ1bmN0aW9uIHVuc2lnbkJ5dGUoYikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgcmV0dXJuIGIgJiAweGZmO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIElQdjYgYWRkcmVzc1xuICogQGNsYXNzIEFkZHJlc3M2XG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIEFuIElQdjYgYWRkcmVzcyBzdHJpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZ3JvdXBzPThdIC0gSG93IG1hbnkgb2N0ZXRzIHRvIHBhcnNlXG4gKiBAZXhhbXBsZVxuICogdmFyIGFkZHJlc3MgPSBuZXcgQWRkcmVzczYoJzIwMDE6Oi8zMicpO1xuICovXG5jbGFzcyBBZGRyZXNzNiB7XG4gICAgY29uc3RydWN0b3IoYWRkcmVzcywgb3B0aW9uYWxHcm91cHMpIHtcbiAgICAgICAgdGhpcy5hZGRyZXNzTWludXNTdWZmaXggPSAnJztcbiAgICAgICAgdGhpcy5wYXJzZWRTdWJuZXQgPSAnJztcbiAgICAgICAgdGhpcy5zdWJuZXQgPSAnLzEyOCc7XG4gICAgICAgIHRoaXMuc3VibmV0TWFzayA9IDEyODtcbiAgICAgICAgdGhpcy52NCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnpvbmUgPSAnJztcbiAgICAgICAgLy8gI3JlZ2lvbiBBdHRyaWJ1dGVzXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGFkZHJlc3MgaXMgaW4gdGhlIHN1Ym5ldCBvZiB0aGUgY3VycmVudCBhZGRyZXNzXG4gICAgICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzSW5TdWJuZXQgPSBjb21tb24uaXNJblN1Ym5ldDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBjb3JyZWN0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNDb3JyZWN0ID0gY29tbW9uLmlzQ29ycmVjdChjb25zdGFudHM2LkJJVFMpO1xuICAgICAgICBpZiAob3B0aW9uYWxHcm91cHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5ncm91cHMgPSBjb25zdGFudHM2LkdST1VQUztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzID0gb3B0aW9uYWxHcm91cHM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgICAgICAgY29uc3Qgc3VibmV0ID0gY29uc3RhbnRzNi5SRV9TVUJORVRfU1RSSU5HLmV4ZWMoYWRkcmVzcyk7XG4gICAgICAgIGlmIChzdWJuZXQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkU3VibmV0ID0gc3VibmV0WzBdLnJlcGxhY2UoJy8nLCAnJyk7XG4gICAgICAgICAgICB0aGlzLnN1Ym5ldE1hc2sgPSBwYXJzZUludCh0aGlzLnBhcnNlZFN1Ym5ldCwgMTApO1xuICAgICAgICAgICAgdGhpcy5zdWJuZXQgPSBgLyR7dGhpcy5zdWJuZXRNYXNrfWA7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHRoaXMuc3VibmV0TWFzaykgfHxcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym5ldE1hc2sgPCAwIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJuZXRNYXNrID4gY29uc3RhbnRzNi5CSVRTKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoJ0ludmFsaWQgc3VibmV0IG1hc2suJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5yZXBsYWNlKGNvbnN0YW50czYuUkVfU1VCTkVUX1NUUklORywgJycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKC9cXC8vLnRlc3QoYWRkcmVzcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKCdJbnZhbGlkIHN1Ym5ldCBtYXNrLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHpvbmUgPSBjb25zdGFudHM2LlJFX1pPTkVfU1RSSU5HLmV4ZWMoYWRkcmVzcyk7XG4gICAgICAgIGlmICh6b25lKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUgPSB6b25lWzBdO1xuICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MucmVwbGFjZShjb25zdGFudHM2LlJFX1pPTkVfU1RSSU5HLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRyZXNzTWludXNTdWZmaXggPSBhZGRyZXNzO1xuICAgICAgICB0aGlzLnBhcnNlZEFkZHJlc3MgPSB0aGlzLnBhcnNlKHRoaXMuYWRkcmVzc01pbnVzU3VmZml4KTtcbiAgICB9XG4gICAgc3RhdGljIGlzVmFsaWQoYWRkcmVzcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgICAgICAgICAgbmV3IEFkZHJlc3M2KGFkZHJlc3MpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGEgQmlnSW50ZWdlciB0byBhIHY2IGFkZHJlc3Mgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7QmlnSW50ZWdlcn0gYmlnSW50ZWdlciAtIGEgQmlnSW50ZWdlciB0byBjb252ZXJ0XG4gICAgICogQHJldHVybnMge0FkZHJlc3M2fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGJpZ0ludGVnZXIgPSBuZXcgQmlnSW50ZWdlcignMTAwMDAwMDAwMDAwMCcpO1xuICAgICAqIHZhciBhZGRyZXNzID0gQWRkcmVzczYuZnJvbUJpZ0ludGVnZXIoYmlnSW50ZWdlcik7XG4gICAgICogYWRkcmVzcy5jb3JyZWN0Rm9ybSgpOyAvLyAnOjplODpkNGE1OjEwMDAnXG4gICAgICovXG4gICAgc3RhdGljIGZyb21CaWdJbnRlZ2VyKGJpZ0ludGVnZXIpIHtcbiAgICAgICAgY29uc3QgaGV4ID0gYmlnSW50ZWdlci50b1N0cmluZygxNikucGFkU3RhcnQoMzIsICcwJyk7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IFtdO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnN0YW50czYuR1JPVVBTOyBpKyspIHtcbiAgICAgICAgICAgIGdyb3Vwcy5wdXNoKGhleC5zbGljZShpICogNCwgKGkgKyAxKSAqIDQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFkZHJlc3M2KGdyb3Vwcy5qb2luKCc6JykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGEgVVJMICh3aXRoIG9wdGlvbmFsIHBvcnQgbnVtYmVyKSB0byBhbiBhZGRyZXNzIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gYSBVUkwgd2l0aCBvcHRpb25hbCBwb3J0IG51bWJlclxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFkZHJlc3NBbmRQb3J0ID0gQWRkcmVzczYuZnJvbVVSTCgnaHR0cDovL1tmZmZmOjpdOjgwODAvZm9vLycpO1xuICAgICAqIGFkZHJlc3NBbmRQb3J0LmFkZHJlc3MuY29ycmVjdEZvcm0oKTsgLy8gJ2ZmZmY6OidcbiAgICAgKiBhZGRyZXNzQW5kUG9ydC5wb3J0OyAvLyA4MDgwXG4gICAgICovXG4gICAgc3RhdGljIGZyb21VUkwodXJsKSB7XG4gICAgICAgIGxldCBob3N0O1xuICAgICAgICBsZXQgcG9ydCA9IG51bGw7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYnJhY2tldHMgcGFyc2UgdGhlbSBhbmQgZmluZCBhIHBvcnRcbiAgICAgICAgaWYgKHVybC5pbmRleE9mKCdbJykgIT09IC0xICYmIHVybC5pbmRleE9mKCddOicpICE9PSAtMSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gY29uc3RhbnRzNi5SRV9VUkxfV0lUSF9QT1JULmV4ZWModXJsKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcjogJ2ZhaWxlZCB0byBwYXJzZSBhZGRyZXNzIHdpdGggcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhvc3QgPSByZXN1bHRbMV07XG4gICAgICAgICAgICBwb3J0ID0gcmVzdWx0WzJdO1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIFVSTCBleHRyYWN0IHRoZSBhZGRyZXNzXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodXJsLmluZGV4T2YoJy8nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcHJvdG9jb2wgcHJlZml4XG4gICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgvXlthLXowLTldKzpcXC9cXC8vLCAnJyk7XG4gICAgICAgICAgICAvLyBQYXJzZSB0aGUgYWRkcmVzc1xuICAgICAgICAgICAgcmVzdWx0ID0gY29uc3RhbnRzNi5SRV9VUkwuZXhlYyh1cmwpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAnZmFpbGVkIHRvIHBhcnNlIGFkZHJlc3MgZnJvbSBVUkwnLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBob3N0ID0gcmVzdWx0WzFdO1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGp1c3QgYXNzaWduIHRoZSBVUkwgdG8gdGhlIGhvc3QgYW5kIGxldCB0aGUgbGlicmFyeSBwYXJzZSBpdFxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaG9zdCA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGVyZSdzIGEgcG9ydCBjb252ZXJ0IGl0IHRvIGFuIGludGVnZXJcbiAgICAgICAgaWYgKHBvcnQpIHtcbiAgICAgICAgICAgIHBvcnQgPSBwYXJzZUludChwb3J0LCAxMCk7XG4gICAgICAgICAgICAvLyBzcXVlbGNoIG91dCBvZiByYW5nZSBwb3J0c1xuICAgICAgICAgICAgaWYgKHBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNikge1xuICAgICAgICAgICAgICAgIHBvcnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gU3RhbmRhcmRpemUgYHVuZGVmaW5lZGAgdG8gYG51bGxgXG4gICAgICAgICAgICBwb3J0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWRkcmVzczogbmV3IEFkZHJlc3M2KGhvc3QpLFxuICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIElQdjYtbWFwcGVkIGFkZHJlc3MgZ2l2ZW4gYW4gSVB2NCBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gQW4gSVB2NCBhZGRyZXNzIHN0cmluZ1xuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNn1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBhZGRyZXNzID0gQWRkcmVzczYuZnJvbUFkZHJlc3M0KCcxOTIuMTY4LjAuMScpO1xuICAgICAqIGFkZHJlc3MuY29ycmVjdEZvcm0oKTsgLy8gJzo6ZmZmZjpjMGE4OjEnXG4gICAgICogYWRkcmVzcy50bzRpbjYoKTsgLy8gJzo6ZmZmZjoxOTIuMTY4LjAuMSdcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUFkZHJlc3M0KGFkZHJlc3MpIHtcbiAgICAgICAgY29uc3QgYWRkcmVzczQgPSBuZXcgaXB2NF8xLkFkZHJlc3M0KGFkZHJlc3MpO1xuICAgICAgICBjb25zdCBtYXNrNiA9IGNvbnN0YW50czYuQklUUyAtIChjb25zdGFudHM0LkJJVFMgLSBhZGRyZXNzNC5zdWJuZXRNYXNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRyZXNzNihgOjpmZmZmOiR7YWRkcmVzczQuY29ycmVjdEZvcm0oKX0vJHttYXNrNn1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuIGFkZHJlc3MgZnJvbSBpcDYuYXJwYSBmb3JtXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcnBhRm9ybUFkZHJlc3MgLSBhbiAnaXA2LmFycGEnIGZvcm0gYWRkcmVzc1xuICAgICAqIEByZXR1cm5zIHtBZHJlc3M2fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFkZHJlc3MgPSBBZGRyZXNzNi5mcm9tQXJwYShlLmYuZi5mLjMuYy4yLjYuZi5mLmYuZS42LjYuOC5lLjEuMC42LjcuOS40LmUuYy4wLjAuMC4wLjEuMC4wLjIuaXA2LmFycGEuKVxuICAgICAqIGFkZHJlc3MuY29ycmVjdEZvcm0oKTsgLy8gJzIwMDE6MDpjZTQ5Ojc2MDE6ZTg2NjplZmZmOjYyYzM6ZmZmZSdcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUFycGEoYXJwYUZvcm1BZGRyZXNzKSB7XG4gICAgICAgIC8vIHJlbW92ZSBlbmRpbmcgXCIuaXA2LmFycGEuXCIgb3IganVzdCBcIi5cIlxuICAgICAgICBsZXQgYWRkcmVzcyA9IGFycGFGb3JtQWRkcmVzcy5yZXBsYWNlKC8oXFwuaXA2XFwuYXJwYSk/XFwuJC8sICcnKTtcbiAgICAgICAgY29uc3Qgc2VtaWNvbG9uQW1vdW50ID0gNztcbiAgICAgICAgLy8gY29ycmVjdCBpcDYuYXJwYSBmb3JtIHdpdGggZW5kaW5nIHJlbW92ZWQgd2lsbCBiZSA2MyBjaGFyYWN0ZXJzXG4gICAgICAgIGlmIChhZGRyZXNzLmxlbmd0aCAhPT0gNjMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKFwiSW52YWxpZCAnaXA2LmFycGEnIGZvcm0uXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnRzID0gYWRkcmVzcy5zcGxpdCgnLicpLnJldmVyc2UoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNlbWljb2xvbkFtb3VudDsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBpICogNDtcbiAgICAgICAgICAgIHBhcnRzLnNwbGljZShpbnNlcnRJbmRleCwgMCwgJzonKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRyZXNzID0gcGFydHMuam9pbignJyk7XG4gICAgICAgIHJldHVybiBuZXcgQWRkcmVzczYoYWRkcmVzcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgTWljcm9zb2Z0IFVOQyB0cmFuc2NyaXB0aW9uIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIE1pY3Jvc29mdCBVTkMgdHJhbnNjcmlwdGlvbiBvZiB0aGUgYWRkcmVzc1xuICAgICAqL1xuICAgIG1pY3Jvc29mdFRyYW5zY3JpcHRpb24oKSB7XG4gICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclcy5pcHY2LWxpdGVyYWwubmV0JywgdGhpcy5jb3JyZWN0Rm9ybSgpLnJlcGxhY2UoLzovZywgJy0nKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgZmlyc3QgbiBiaXRzIG9mIHRoZSBhZGRyZXNzLCBkZWZhdWx0aW5nIHRvIHRoZSBzdWJuZXQgbWFza1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbWFzaz1zdWJuZXRdIC0gdGhlIG51bWJlciBvZiBiaXRzIHRvIG1hc2tcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgZmlyc3QgbiBiaXRzIG9mIHRoZSBhZGRyZXNzIGFzIGEgc3RyaW5nXG4gICAgICovXG4gICAgbWFzayhtYXNrID0gdGhpcy5zdWJuZXRNYXNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJpdHNCYXNlMigwLCBtYXNrKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcG9zc2libGUgc3VibmV0cyBvZiBhIGdpdmVuIHNpemUgaW4gdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MTI4XSAtIHRoZSBzdWJuZXQgc2l6ZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgLy8gVE9ETzogcHJvYmFibHkgdXNlZnVsIHRvIGhhdmUgYSBudW1lcmljIHZlcnNpb24gb2YgdGhpcyB0b29cbiAgICBwb3NzaWJsZVN1Ym5ldHMoc3VibmV0U2l6ZSA9IDEyOCkge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVCaXRzID0gY29uc3RhbnRzNi5CSVRTIC0gdGhpcy5zdWJuZXRNYXNrO1xuICAgICAgICBjb25zdCBzdWJuZXRCaXRzID0gTWF0aC5hYnMoc3VibmV0U2l6ZSAtIGNvbnN0YW50czYuQklUUyk7XG4gICAgICAgIGNvbnN0IHN1Ym5ldFBvd2VycyA9IGF2YWlsYWJsZUJpdHMgLSBzdWJuZXRCaXRzO1xuICAgICAgICBpZiAoc3VibmV0UG93ZXJzIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuICcwJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkQ29tbWFzKG5ldyBqc2JuXzEuQmlnSW50ZWdlcignMicsIDEwKS5wb3coc3VibmV0UG93ZXJzKS50b1N0cmluZygxMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZ2V0dGluZyBzdGFydCBhZGRyZXNzLlxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtCaWdJbnRlZ2VyfVxuICAgICAqL1xuICAgIF9zdGFydEFkZHJlc3MoKSB7XG4gICAgICAgIHJldHVybiBuZXcganNibl8xLkJpZ0ludGVnZXIodGhpcy5tYXNrKCkgKyAnMCcucmVwZWF0KGNvbnN0YW50czYuQklUUyAtIHRoaXMuc3VibmV0TWFzayksIDIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZmlyc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJyBzdWJuZXRcbiAgICAgKiBPZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgTmV0d29yayBBZGRyZXNzLlxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNn1cbiAgICAgKi9cbiAgICBzdGFydEFkZHJlc3MoKSB7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNi5mcm9tQmlnSW50ZWdlcih0aGlzLl9zdGFydEFkZHJlc3MoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBob3N0IGFkZHJlc3MgaW4gdGhlIHJhbmdlIGdpdmVuIGJ5IHRoaXMgYWRkcmVzcydzIHN1Ym5ldCBpZVxuICAgICAqIHRoZSBmaXJzdCBhZGRyZXNzIGFmdGVyIHRoZSBOZXR3b3JrIEFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICovXG4gICAgc3RhcnRBZGRyZXNzRXhjbHVzaXZlKCkge1xuICAgICAgICBjb25zdCBhZGp1c3QgPSBuZXcganNibl8xLkJpZ0ludGVnZXIoJzEnKTtcbiAgICAgICAgcmV0dXJuIEFkZHJlc3M2LmZyb21CaWdJbnRlZ2VyKHRoaXMuX3N0YXJ0QWRkcmVzcygpLmFkZChhZGp1c3QpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIGdldHRpbmcgZW5kIGFkZHJlc3MuXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0JpZ0ludGVnZXJ9XG4gICAgICovXG4gICAgX2VuZEFkZHJlc3MoKSB7XG4gICAgICAgIHJldHVybiBuZXcganNibl8xLkJpZ0ludGVnZXIodGhpcy5tYXNrKCkgKyAnMScucmVwZWF0KGNvbnN0YW50czYuQklUUyAtIHRoaXMuc3VibmV0TWFzayksIDIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBhZGRyZXNzIGluIHRoZSByYW5nZSBnaXZlbiBieSB0aGlzIGFkZHJlc3MnIHN1Ym5ldFxuICAgICAqIE9mdGVuIHJlZmVycmVkIHRvIGFzIHRoZSBCcm9hZGNhc3RcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICovXG4gICAgZW5kQWRkcmVzcygpIHtcbiAgICAgICAgcmV0dXJuIEFkZHJlc3M2LmZyb21CaWdJbnRlZ2VyKHRoaXMuX2VuZEFkZHJlc3MoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IGhvc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJ3Mgc3VibmV0IGllXG4gICAgICogdGhlIGxhc3QgYWRkcmVzcyBwcmlvciB0byB0aGUgQnJvYWRjYXN0IEFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICovXG4gICAgZW5kQWRkcmVzc0V4Y2x1c2l2ZSgpIHtcbiAgICAgICAgY29uc3QgYWRqdXN0ID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcxJyk7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNi5mcm9tQmlnSW50ZWdlcih0aGlzLl9lbmRBZGRyZXNzKCkuc3VidHJhY3QoYWRqdXN0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgc2NvcGUgb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFNjb3BlKCkge1xuICAgICAgICBsZXQgc2NvcGUgPSBjb25zdGFudHM2LlNDT1BFU1t0aGlzLmdldEJpdHMoMTIsIDE2KS5pbnRWYWx1ZSgpXTtcbiAgICAgICAgaWYgKHRoaXMuZ2V0VHlwZSgpID09PSAnR2xvYmFsIHVuaWNhc3QnICYmIHNjb3BlICE9PSAnTGluayBsb2NhbCcpIHtcbiAgICAgICAgICAgIHNjb3BlID0gJ0dsb2JhbCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjb3BlIHx8ICdVbmtub3duJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRUeXBlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHN1Ym5ldCBvZiBPYmplY3Qua2V5cyhjb25zdGFudHM2LlRZUEVTKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNJblN1Ym5ldChuZXcgQWRkcmVzczYoc3VibmV0KSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RhbnRzNi5UWVBFU1tzdWJuZXRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnR2xvYmFsIHVuaWNhc3QnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGJpdHMgaW4gdGhlIGdpdmVuIHJhbmdlIGFzIGEgQmlnSW50ZWdlclxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtCaWdJbnRlZ2VyfVxuICAgICAqL1xuICAgIGdldEJpdHMoc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKHRoaXMuZ2V0Qml0c0Jhc2UyKHN0YXJ0LCBlbmQpLCAyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBiaXRzIGluIHRoZSBnaXZlbiByYW5nZSBhcyBhIGJhc2UtMiBzdHJpbmdcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldEJpdHNCYXNlMihzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmFyeVplcm9QYWQoKS5zbGljZShzdGFydCwgZW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBiaXRzIGluIHRoZSBnaXZlbiByYW5nZSBhcyBhIGJhc2UtMTYgc3RyaW5nXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRCaXRzQmFzZTE2KHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7XG4gICAgICAgIGlmIChsZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xlbmd0aCBvZiBiaXRzIHRvIHJldHJpZXZlIG11c3QgYmUgZGl2aXNpYmxlIGJ5IGZvdXInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRCaXRzKHN0YXJ0LCBlbmQpXG4gICAgICAgICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAgICAgICAucGFkU3RhcnQobGVuZ3RoIC8gNCwgJzAnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBiaXRzIHRoYXQgYXJlIHNldCBwYXN0IHRoZSBzdWJuZXQgbWFzayBsZW5ndGhcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldEJpdHNQYXN0U3VibmV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCaXRzQmFzZTIodGhpcy5zdWJuZXRNYXNrLCBjb25zdGFudHM2LkJJVFMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHJldmVyc2VkIGlwNi5hcnBhIGZvcm0gb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5vbWl0U3VmZml4IC0gb21pdCB0aGUgXCJpcDYuYXJwYVwiIHN1ZmZpeFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgcmV2ZXJzZUZvcm0ob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGFyYWN0ZXJzID0gTWF0aC5mbG9vcih0aGlzLnN1Ym5ldE1hc2sgLyA0KTtcbiAgICAgICAgY29uc3QgcmV2ZXJzZWQgPSB0aGlzLmNhbm9uaWNhbEZvcm0oKVxuICAgICAgICAgICAgLnJlcGxhY2UoLzovZywgJycpXG4gICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAuc2xpY2UoMCwgY2hhcmFjdGVycylcbiAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgIC5qb2luKCcuJyk7XG4gICAgICAgIGlmIChjaGFyYWN0ZXJzID4gMCkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMub21pdFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXZlcnNlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclcy5pcDYuYXJwYS4nLCByZXZlcnNlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMub21pdFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnaXA2LmFycGEuJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBjb3JyZWN0IGZvcm0gb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGNvcnJlY3RGb3JtKCkge1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgbGV0IGdyb3VwcyA9IFtdO1xuICAgICAgICBsZXQgemVyb0NvdW50ZXIgPSAwO1xuICAgICAgICBjb25zdCB6ZXJvZXMgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMucGFyc2VkQWRkcmVzcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUludCh0aGlzLnBhcnNlZEFkZHJlc3NbaV0sIDE2KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHplcm9Db3VudGVyKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IDAgJiYgemVyb0NvdW50ZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHplcm9Db3VudGVyID4gMSkge1xuICAgICAgICAgICAgICAgICAgICB6ZXJvZXMucHVzaChbaSAtIHplcm9Db3VudGVyLCBpIC0gMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB6ZXJvQ291bnRlciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG8gd2UgZW5kIHdpdGggYSBzdHJpbmcgb2YgemVyb2VzP1xuICAgICAgICBpZiAoemVyb0NvdW50ZXIgPiAxKSB7XG4gICAgICAgICAgICB6ZXJvZXMucHVzaChbdGhpcy5wYXJzZWRBZGRyZXNzLmxlbmd0aCAtIHplcm9Db3VudGVyLCB0aGlzLnBhcnNlZEFkZHJlc3MubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHplcm9MZW5ndGhzID0gemVyb2VzLm1hcCgobikgPT4gblsxXSAtIG5bMF0gKyAxKTtcbiAgICAgICAgaWYgKHplcm9lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHplcm9MZW5ndGhzLmluZGV4T2YoTWF0aC5tYXgoLi4uemVyb0xlbmd0aHMpKTtcbiAgICAgICAgICAgIGdyb3VwcyA9IGNvbXBhY3QodGhpcy5wYXJzZWRBZGRyZXNzLCB6ZXJvZXNbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGdyb3VwcyA9IHRoaXMucGFyc2VkQWRkcmVzcztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZ3JvdXBzW2ldICE9PSAnY29tcGFjdCcpIHtcbiAgICAgICAgICAgICAgICBncm91cHNbaV0gPSBwYXJzZUludChncm91cHNbaV0sIDE2KS50b1N0cmluZygxNik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvcnJlY3QgPSBncm91cHMuam9pbignOicpO1xuICAgICAgICBjb3JyZWN0ID0gY29ycmVjdC5yZXBsYWNlKC9eY29tcGFjdCQvLCAnOjonKTtcbiAgICAgICAgY29ycmVjdCA9IGNvcnJlY3QucmVwbGFjZSgvXmNvbXBhY3R8Y29tcGFjdCQvLCAnOicpO1xuICAgICAgICBjb3JyZWN0ID0gY29ycmVjdC5yZXBsYWNlKC9jb21wYWN0LywgJycpO1xuICAgICAgICByZXR1cm4gY29ycmVjdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgemVyby1wYWRkZWQgYmFzZS0yIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgYWRkcmVzcyA9IG5ldyBBZGRyZXNzNignMjAwMTo0ODYwOjQwMDE6ODAzOjoxMDExJyk7XG4gICAgICogYWRkcmVzcy5iaW5hcnlaZXJvUGFkKCk7XG4gICAgICogLy8gJzAwMTAwMDAwMDAwMDAwMDEwMTAwMTAwMDAxMTAwMDAwMDEwMDAwMDAwMDAwMDAwMTAwMDAxMDAwMDAwMDAwMTFcbiAgICAgKiAvLyAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAxMDAwMSdcbiAgICAgKi9cbiAgICBiaW5hcnlaZXJvUGFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWdJbnRlZ2VyKCkudG9TdHJpbmcoMikucGFkU3RhcnQoY29uc3RhbnRzNi5CSVRTLCAnMCcpO1xuICAgIH1cbiAgICAvLyBUT0RPOiBJbXByb3ZlIHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyBoZWxwZXIgZnVuY3Rpb25cbiAgICBwYXJzZTRpbjYoYWRkcmVzcykge1xuICAgICAgICBjb25zdCBncm91cHMgPSBhZGRyZXNzLnNwbGl0KCc6Jyk7XG4gICAgICAgIGNvbnN0IGxhc3RHcm91cCA9IGdyb3Vwcy5zbGljZSgtMSlbMF07XG4gICAgICAgIGNvbnN0IGFkZHJlc3M0ID0gbGFzdEdyb3VwLm1hdGNoKGNvbnN0YW50czQuUkVfQUREUkVTUyk7XG4gICAgICAgIGlmIChhZGRyZXNzNCkge1xuICAgICAgICAgICAgdGhpcy5wYXJzZWRBZGRyZXNzNCA9IGFkZHJlc3M0WzBdO1xuICAgICAgICAgICAgdGhpcy5hZGRyZXNzNCA9IG5ldyBpcHY0XzEuQWRkcmVzczQodGhpcy5wYXJzZWRBZGRyZXNzNCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYWRkcmVzczQuZ3JvdXBzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoL14wWzAtOV0rLy50ZXN0KHRoaXMuYWRkcmVzczQucGFyc2VkQWRkcmVzc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoXCJJUHY0IGFkZHJlc3NlcyBjYW4ndCBoYXZlIGxlYWRpbmcgemVyb2VzLlwiLCBhZGRyZXNzLnJlcGxhY2UoY29uc3RhbnRzNC5SRV9BRERSRVNTLCB0aGlzLmFkZHJlc3M0LnBhcnNlZEFkZHJlc3MubWFwKHNwYW5MZWFkaW5nWmVyb2VzNCkuam9pbignLicpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52NCA9IHRydWU7XG4gICAgICAgICAgICBncm91cHNbZ3JvdXBzLmxlbmd0aCAtIDFdID0gdGhpcy5hZGRyZXNzNC50b0dyb3VwNigpO1xuICAgICAgICAgICAgYWRkcmVzcyA9IGdyb3Vwcy5qb2luKCc6Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZHJlc3M7XG4gICAgfVxuICAgIC8vIFRPRE86IE1ha2UgcHJpdmF0ZT9cbiAgICBwYXJzZShhZGRyZXNzKSB7XG4gICAgICAgIGFkZHJlc3MgPSB0aGlzLnBhcnNlNGluNihhZGRyZXNzKTtcbiAgICAgICAgY29uc3QgYmFkQ2hhcmFjdGVycyA9IGFkZHJlc3MubWF0Y2goY29uc3RhbnRzNi5SRV9CQURfQ0hBUkFDVEVSUyk7XG4gICAgICAgIGlmIChiYWRDaGFyYWN0ZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcigoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCdCYWQgY2hhcmFjdGVyJXMgZGV0ZWN0ZWQgaW4gYWRkcmVzczogJXMnLCBiYWRDaGFyYWN0ZXJzLmxlbmd0aCA+IDEgPyAncycgOiAnJywgYmFkQ2hhcmFjdGVycy5qb2luKCcnKSksIGFkZHJlc3MucmVwbGFjZShjb25zdGFudHM2LlJFX0JBRF9DSEFSQUNURVJTLCAnPHNwYW4gY2xhc3M9XCJwYXJzZS1lcnJvclwiPiQxPC9zcGFuPicpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYWRBZGRyZXNzID0gYWRkcmVzcy5tYXRjaChjb25zdGFudHM2LlJFX0JBRF9BRERSRVNTKTtcbiAgICAgICAgaWYgKGJhZEFkZHJlc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKCgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJ0FkZHJlc3MgZmFpbGVkIHJlZ2V4OiAlcycsIGJhZEFkZHJlc3Muam9pbignJykpLCBhZGRyZXNzLnJlcGxhY2UoY29uc3RhbnRzNi5SRV9CQURfQUREUkVTUywgJzxzcGFuIGNsYXNzPVwicGFyc2UtZXJyb3JcIj4kMTwvc3Bhbj4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGdyb3VwcyA9IFtdO1xuICAgICAgICBjb25zdCBoYWx2ZXMgPSBhZGRyZXNzLnNwbGl0KCc6OicpO1xuICAgICAgICBpZiAoaGFsdmVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gaGFsdmVzWzBdLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IGhhbHZlc1sxXS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgaWYgKGZpcnN0Lmxlbmd0aCA9PT0gMSAmJiBmaXJzdFswXSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBmaXJzdCA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhc3QubGVuZ3RoID09PSAxICYmIGxhc3RbMF0gPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgbGFzdCA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nID0gdGhpcy5ncm91cHMgLSAoZmlyc3QubGVuZ3RoICsgbGFzdC5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKCFyZW1haW5pbmcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcignRXJyb3IgcGFyc2luZyBncm91cHMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZWxpZGVkR3JvdXBzID0gcmVtYWluaW5nO1xuICAgICAgICAgICAgdGhpcy5lbGlzaW9uQmVnaW4gPSBmaXJzdC5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmVsaXNpb25FbmQgPSBmaXJzdC5sZW5ndGggKyB0aGlzLmVsaWRlZEdyb3VwcztcbiAgICAgICAgICAgIGdyb3VwcyA9IGdyb3Vwcy5jb25jYXQoZmlyc3QpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1haW5pbmc7IGkrKykge1xuICAgICAgICAgICAgICAgIGdyb3Vwcy5wdXNoKCcwJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cHMgPSBncm91cHMuY29uY2F0KGxhc3QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGhhbHZlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGdyb3VwcyA9IGFkZHJlc3Muc3BsaXQoJzonKTtcbiAgICAgICAgICAgIHRoaXMuZWxpZGVkR3JvdXBzID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKCdUb28gbWFueSA6OiBncm91cHMgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBncm91cHMgPSBncm91cHMubWFwKChncm91cCkgPT4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXgnLCBwYXJzZUludChncm91cCwgMTYpKSk7XG4gICAgICAgIGlmIChncm91cHMubGVuZ3RoICE9PSB0aGlzLmdyb3Vwcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoJ0luY29ycmVjdCBudW1iZXIgb2YgZ3JvdXBzIGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdyb3VwcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBjYW5vbmljYWwgZm9ybSBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgY2Fub25pY2FsRm9ybSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkQWRkcmVzcy5tYXAocGFkZGVkSGV4KS5qb2luKCc6Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgZGVjaW1hbCBmb3JtIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBkZWNpbWFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZWRBZGRyZXNzLm1hcCgobikgPT4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJTA1ZCcsIHBhcnNlSW50KG4sIDE2KSkpLmpvaW4oJzonKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBhZGRyZXNzIGFzIGEgQmlnSW50ZWdlclxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtCaWdJbnRlZ2VyfVxuICAgICAqL1xuICAgIGJpZ0ludGVnZXIoKSB7XG4gICAgICAgIHJldHVybiBuZXcganNibl8xLkJpZ0ludGVnZXIodGhpcy5wYXJzZWRBZGRyZXNzLm1hcChwYWRkZWRIZXgpLmpvaW4oJycpLCAxNik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgbGFzdCB0d28gZ3JvdXBzIG9mIHRoaXMgYWRkcmVzcyBhcyBhbiBJUHY0IGFkZHJlc3Mgc3RyaW5nXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M0fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFkZHJlc3MgPSBuZXcgQWRkcmVzczYoJzIwMDE6NDg2MDo0MDAxOjoxODI1OmJmMTEnKTtcbiAgICAgKiBhZGRyZXNzLnRvNCgpLmNvcnJlY3RGb3JtKCk7IC8vICcyNC4zNy4xOTEuMTcnXG4gICAgICovXG4gICAgdG80KCkge1xuICAgICAgICBjb25zdCBiaW5hcnkgPSB0aGlzLmJpbmFyeVplcm9QYWQoKS5zcGxpdCgnJyk7XG4gICAgICAgIHJldHVybiBpcHY0XzEuQWRkcmVzczQuZnJvbUhleChuZXcganNibl8xLkJpZ0ludGVnZXIoYmluYXJ5LnNsaWNlKDk2LCAxMjgpLmpvaW4oJycpLCAyKS50b1N0cmluZygxNikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHY0LWluLXY2IGZvcm0gb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRvNGluNigpIHtcbiAgICAgICAgY29uc3QgYWRkcmVzczQgPSB0aGlzLnRvNCgpO1xuICAgICAgICBjb25zdCBhZGRyZXNzNiA9IG5ldyBBZGRyZXNzNih0aGlzLnBhcnNlZEFkZHJlc3Muc2xpY2UoMCwgNikuam9pbignOicpLCA2KTtcbiAgICAgICAgY29uc3QgY29ycmVjdCA9IGFkZHJlc3M2LmNvcnJlY3RGb3JtKCk7XG4gICAgICAgIGxldCBpbmZpeCA9ICcnO1xuICAgICAgICBpZiAoIS86JC8udGVzdChjb3JyZWN0KSkge1xuICAgICAgICAgICAgaW5maXggPSAnOic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvcnJlY3QgKyBpbmZpeCArIGFkZHJlc3M0LmFkZHJlc3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgVGVyZWRvIHByb3BlcnRpZXMgb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGluc3BlY3RUZXJlZG8oKSB7XG4gICAgICAgIC8qXG4gICAgICAgIC0gQml0cyAwIHRvIDMxIGFyZSBzZXQgdG8gdGhlIFRlcmVkbyBwcmVmaXggKG5vcm1hbGx5IDIwMDE6MDAwMDo6LzMyKS5cbiAgICAgICAgLSBCaXRzIDMyIHRvIDYzIGVtYmVkIHRoZSBwcmltYXJ5IElQdjQgYWRkcmVzcyBvZiB0aGUgVGVyZWRvIHNlcnZlciB0aGF0XG4gICAgICAgICAgaXMgdXNlZC5cbiAgICAgICAgLSBCaXRzIDY0IHRvIDc5IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBzb21lIGZsYWdzLiBDdXJyZW50bHkgb25seSB0aGVcbiAgICAgICAgICBoaWdoZXIgb3JkZXIgYml0IGlzIHVzZWQ7IGl0IGlzIHNldCB0byAxIGlmIHRoZSBUZXJlZG8gY2xpZW50IGlzXG4gICAgICAgICAgbG9jYXRlZCBiZWhpbmQgYSBjb25lIE5BVCwgMCBvdGhlcndpc2UuIEZvciBNaWNyb3NvZnQncyBXaW5kb3dzIFZpc3RhXG4gICAgICAgICAgYW5kIFdpbmRvd3MgU2VydmVyIDIwMDggaW1wbGVtZW50YXRpb25zLCBtb3JlIGJpdHMgYXJlIHVzZWQuIEluIHRob3NlXG4gICAgICAgICAgaW1wbGVtZW50YXRpb25zLCB0aGUgZm9ybWF0IGZvciB0aGVzZSAxNiBiaXRzIGlzIFwiQ1JBQUFBVUcgQUFBQUFBQUFcIixcbiAgICAgICAgICB3aGVyZSBcIkNcIiByZW1haW5zIHRoZSBcIkNvbmVcIiBmbGFnLiBUaGUgXCJSXCIgYml0IGlzIHJlc2VydmVkIGZvciBmdXR1cmVcbiAgICAgICAgICB1c2UuIFRoZSBcIlVcIiBiaXQgaXMgZm9yIHRoZSBVbml2ZXJzYWwvTG9jYWwgZmxhZyAoc2V0IHRvIDApLiBUaGUgXCJHXCIgYml0XG4gICAgICAgICAgaXMgSW5kaXZpZHVhbC9Hcm91cCBmbGFnIChzZXQgdG8gMCkuIFRoZSBBIGJpdHMgYXJlIHNldCB0byBhIDEyLWJpdFxuICAgICAgICAgIHJhbmRvbWx5IGdlbmVyYXRlZCBudW1iZXIgY2hvc2VuIGJ5IHRoZSBUZXJlZG8gY2xpZW50IHRvIGludHJvZHVjZVxuICAgICAgICAgIGFkZGl0aW9uYWwgcHJvdGVjdGlvbiBmb3IgdGhlIFRlcmVkbyBub2RlIGFnYWluc3QgSVB2Ni1iYXNlZCBzY2FubmluZ1xuICAgICAgICAgIGF0dGFja3MuXG4gICAgICAgIC0gQml0cyA4MCB0byA5NSBjb250YWlucyB0aGUgb2JmdXNjYXRlZCBVRFAgcG9ydCBudW1iZXIuIFRoaXMgaXMgdGhlXG4gICAgICAgICAgcG9ydCBudW1iZXIgdGhhdCBpcyBtYXBwZWQgYnkgdGhlIE5BVCB0byB0aGUgVGVyZWRvIGNsaWVudCB3aXRoIGFsbFxuICAgICAgICAgIGJpdHMgaW52ZXJ0ZWQuXG4gICAgICAgIC0gQml0cyA5NiB0byAxMjcgY29udGFpbnMgdGhlIG9iZnVzY2F0ZWQgSVB2NCBhZGRyZXNzLiBUaGlzIGlzIHRoZVxuICAgICAgICAgIHB1YmxpYyBJUHY0IGFkZHJlc3Mgb2YgdGhlIE5BVCB3aXRoIGFsbCBiaXRzIGludmVydGVkLlxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLmdldEJpdHNCYXNlMTYoMCwgMzIpO1xuICAgICAgICBjb25zdCB1ZHBQb3J0ID0gdGhpcy5nZXRCaXRzKDgwLCA5NikueG9yKG5ldyBqc2JuXzEuQmlnSW50ZWdlcignZmZmZicsIDE2KSkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3Qgc2VydmVyNCA9IGlwdjRfMS5BZGRyZXNzNC5mcm9tSGV4KHRoaXMuZ2V0Qml0c0Jhc2UxNigzMiwgNjQpKTtcbiAgICAgICAgY29uc3QgY2xpZW50NCA9IGlwdjRfMS5BZGRyZXNzNC5mcm9tSGV4KHRoaXMuZ2V0Qml0cyg5NiwgMTI4KS54b3IobmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCdmZmZmZmZmZicsIDE2KSkudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgY29uc3QgZmxhZ3MgPSB0aGlzLmdldEJpdHMoNjQsIDgwKTtcbiAgICAgICAgY29uc3QgZmxhZ3NCYXNlMiA9IHRoaXMuZ2V0Qml0c0Jhc2UyKDY0LCA4MCk7XG4gICAgICAgIGNvbnN0IGNvbmVOYXQgPSBmbGFncy50ZXN0Qml0KDE1KTtcbiAgICAgICAgY29uc3QgcmVzZXJ2ZWQgPSBmbGFncy50ZXN0Qml0KDE0KTtcbiAgICAgICAgY29uc3QgZ3JvdXBJbmRpdmlkdWFsID0gZmxhZ3MudGVzdEJpdCg4KTtcbiAgICAgICAgY29uc3QgdW5pdmVyc2FsTG9jYWwgPSBmbGFncy50ZXN0Qml0KDkpO1xuICAgICAgICBjb25zdCBub25jZSA9IG5ldyBqc2JuXzEuQmlnSW50ZWdlcihmbGFnc0Jhc2UyLnNsaWNlKDIsIDYpICsgZmxhZ3NCYXNlMi5zbGljZSg4LCAxNiksIDIpLnRvU3RyaW5nKDEwKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByZWZpeDogKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXM6JXMnLCBwcmVmaXguc2xpY2UoMCwgNCksIHByZWZpeC5zbGljZSg0LCA4KSksXG4gICAgICAgICAgICBzZXJ2ZXI0OiBzZXJ2ZXI0LmFkZHJlc3MsXG4gICAgICAgICAgICBjbGllbnQ0OiBjbGllbnQ0LmFkZHJlc3MsXG4gICAgICAgICAgICBmbGFnczogZmxhZ3NCYXNlMixcbiAgICAgICAgICAgIGNvbmVOYXQsXG4gICAgICAgICAgICBtaWNyb3NvZnQ6IHtcbiAgICAgICAgICAgICAgICByZXNlcnZlZCxcbiAgICAgICAgICAgICAgICB1bml2ZXJzYWxMb2NhbCxcbiAgICAgICAgICAgICAgICBncm91cEluZGl2aWR1YWwsXG4gICAgICAgICAgICAgICAgbm9uY2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdWRwUG9ydCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSA2dG80IHByb3BlcnRpZXMgb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGluc3BlY3Q2dG80KCkge1xuICAgICAgICAvKlxuICAgICAgICAtIEJpdHMgMCB0byAxNSBhcmUgc2V0IHRvIHRoZSA2dG80IHByZWZpeCAoMjAwMjo6LzE2KS5cbiAgICAgICAgLSBCaXRzIDE2IHRvIDQ4IGVtYmVkIHRoZSBJUHY0IGFkZHJlc3Mgb2YgdGhlIDZ0bzQgZ2F0ZXdheSB0aGF0IGlzIHVzZWQuXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuZ2V0Qml0c0Jhc2UxNigwLCAxNik7XG4gICAgICAgIGNvbnN0IGdhdGV3YXkgPSBpcHY0XzEuQWRkcmVzczQuZnJvbUhleCh0aGlzLmdldEJpdHNCYXNlMTYoMTYsIDQ4KSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcmVmaXg6ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyVzJywgcHJlZml4LnNsaWNlKDAsIDQpKSxcbiAgICAgICAgICAgIGdhdGV3YXk6IGdhdGV3YXkuYWRkcmVzcyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgdjYgNnRvNCBhZGRyZXNzIGZyb20gYSB2NiB2NGludjYgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNn1cbiAgICAgKi9cbiAgICB0bzZ0bzQoKSB7XG4gICAgICAgIGlmICghdGhpcy5pczQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRkcjZ0bzQgPSBbXG4gICAgICAgICAgICAnMjAwMicsXG4gICAgICAgICAgICB0aGlzLmdldEJpdHNCYXNlMTYoOTYsIDExMiksXG4gICAgICAgICAgICB0aGlzLmdldEJpdHNCYXNlMTYoMTEyLCAxMjgpLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAnLzE2JyxcbiAgICAgICAgXS5qb2luKCc6Jyk7XG4gICAgICAgIHJldHVybiBuZXcgQWRkcmVzczYoYWRkcjZ0bzQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBieXRlIGFycmF5XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIHRvQnl0ZUFycmF5KCkge1xuICAgICAgICBjb25zdCBieXRlQXJyYXkgPSB0aGlzLmJpZ0ludGVnZXIoKS50b0J5dGVBcnJheSgpO1xuICAgICAgICAvLyB3b3JrIGFyb3VuZCBpc3N1ZSB3aGVyZSBgdG9CeXRlQXJyYXlgIHJldHVybnMgYSBsZWFkaW5nIDAgZWxlbWVudFxuICAgICAgICBpZiAoYnl0ZUFycmF5Lmxlbmd0aCA9PT0gMTcgJiYgYnl0ZUFycmF5WzBdID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYnl0ZUFycmF5LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBieXRlQXJyYXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiB1bnNpZ25lZCBieXRlIGFycmF5XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIHRvVW5zaWduZWRCeXRlQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvQnl0ZUFycmF5KCkubWFwKHVuc2lnbkJ5dGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGEgYnl0ZSBhcnJheSB0byBhbiBBZGRyZXNzNiBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHJldHVybnMge0FkZHJlc3M2fVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tQnl0ZUFycmF5KGJ5dGVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb21VbnNpZ25lZEJ5dGVBcnJheShieXRlcy5tYXAodW5zaWduQnl0ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGFuIHVuc2lnbmVkIGJ5dGUgYXJyYXkgdG8gYW4gQWRkcmVzczYgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQHN0YXRpY1xuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVVuc2lnbmVkQnl0ZUFycmF5KGJ5dGVzKSB7XG4gICAgICAgIGNvbnN0IEJZVEVfTUFYID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcyNTYnLCAxMCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcganNibl8xLkJpZ0ludGVnZXIoJzAnLCAxMCk7XG4gICAgICAgIGxldCBtdWx0aXBsaWVyID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcxJywgMTApO1xuICAgICAgICBmb3IgKGxldCBpID0gYnl0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQobXVsdGlwbGllci5tdWx0aXBseShuZXcganNibl8xLkJpZ0ludGVnZXIoYnl0ZXNbaV0udG9TdHJpbmcoMTApLCAxMCkpKTtcbiAgICAgICAgICAgIG11bHRpcGxpZXIgPSBtdWx0aXBsaWVyLm11bHRpcGx5KEJZVEVfTUFYKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQWRkcmVzczYuZnJvbUJpZ0ludGVnZXIocmVzdWx0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGluIHRoZSBjYW5vbmljYWwgZm9ybSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNDYW5vbmljYWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NNaW51c1N1ZmZpeCA9PT0gdGhpcy5jYW5vbmljYWxGb3JtKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIGxpbmsgbG9jYWwgYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNMaW5rTG9jYWwoKSB7XG4gICAgICAgIC8vIFplcm9lcyBhcmUgcmVxdWlyZWQsIGkuZS4gd2UgY2FuJ3QgY2hlY2sgaXNJblN1Ym5ldCB3aXRoICdmZTgwOjovMTAnXG4gICAgICAgIGlmICh0aGlzLmdldEJpdHNCYXNlMigwLCA2NCkgPT09XG4gICAgICAgICAgICAnMTExMTExMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbXVsdGljYXN0IGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzTXVsdGljYXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUeXBlKCkgPT09ICdNdWx0aWNhc3QnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSB2NC1pbi12NiBhZGRyZXNzLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpczQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnY0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBUZXJlZG8gYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNUZXJlZG8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5TdWJuZXQobmV3IEFkZHJlc3M2KCcyMDAxOjovMzInKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIDZ0bzQgYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXM2dG80KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0luU3VibmV0KG5ldyBBZGRyZXNzNignMjAwMjo6LzE2JykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBsb29wYmFjayBhZGRyZXNzLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0xvb3BiYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUeXBlKCkgPT09ICdMb29wYmFjayc7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb25cbiAgICAvLyAjcmVnaW9uIEhUTUxcbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgYWRkcmVzcyBpbiBsaW5rIGZvcm0gd2l0aCBhIGRlZmF1bHQgcG9ydCBvZiA4MFxuICAgICAqL1xuICAgIGhyZWYob3B0aW9uYWxQb3J0KSB7XG4gICAgICAgIGlmIChvcHRpb25hbFBvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9uYWxQb3J0ID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25hbFBvcnQgPSAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCc6JXMnLCBvcHRpb25hbFBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCdodHRwOi8vWyVzXSVzLycsIHRoaXMuY29ycmVjdEZvcm0oKSwgb3B0aW9uYWxQb3J0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gYSBsaW5rIHN1aXRhYmxlIGZvciBjb252ZXlpbmcgdGhlIGFkZHJlc3MgdmlhIGEgVVJMIGhhc2hcbiAgICAgKi9cbiAgICBsaW5rKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY2xhc3NOYW1lID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMucHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHJlZml4ID0gJy8jYWRkcmVzcz0nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnY0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMudjQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm9ybUZ1bmN0aW9uID0gdGhpcy5jb3JyZWN0Rm9ybTtcbiAgICAgICAgaWYgKG9wdGlvbnMudjQpIHtcbiAgICAgICAgICAgIGZvcm1GdW5jdGlvbiA9IHRoaXMudG80aW42O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJzxhIGhyZWY9XCIlMSRzJTIkc1wiIGNsYXNzPVwiJTMkc1wiPiUyJHM8L2E+Jywgb3B0aW9ucy5wcmVmaXgsIGZvcm1GdW5jdGlvbi5jYWxsKHRoaXMpLCBvcHRpb25zLmNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJzxhIGhyZWY9XCIlMSRzJTIkc1wiPiUyJHM8L2E+Jywgb3B0aW9ucy5wcmVmaXgsIGZvcm1GdW5jdGlvbi5jYWxsKHRoaXMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR3JvdXBzIGFuIGFkZHJlc3NcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdyb3VwKCkge1xuICAgICAgICBpZiAodGhpcy5lbGlkZWRHcm91cHMgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoZSBzaW1wbGUgY2FzZVxuICAgICAgICAgICAgcmV0dXJuIGhlbHBlcnMuc2ltcGxlR3JvdXAodGhpcy5hZGRyZXNzKS5qb2luKCc6Jyk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHR5cGVvZiB0aGlzLmVsaWRlZEdyb3VwcyA9PT0gJ251bWJlcicpO1xuICAgICAgICBhc3NlcnQodHlwZW9mIHRoaXMuZWxpc2lvbkJlZ2luID09PSAnbnVtYmVyJyk7XG4gICAgICAgIC8vIFRoZSBlbGlkZWQgY2FzZVxuICAgICAgICBjb25zdCBvdXRwdXQgPSBbXTtcbiAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IHRoaXMuYWRkcmVzcy5zcGxpdCgnOjonKTtcbiAgICAgICAgaWYgKGxlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCguLi5oZWxwZXJzLnNpbXBsZUdyb3VwKGxlZnQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbGFzc2VzID0gWydob3Zlci1ncm91cCddO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5lbGlzaW9uQmVnaW47IGkgPCB0aGlzLmVsaXNpb25CZWdpbiArIHRoaXMuZWxpZGVkR3JvdXBzOyBpKyspIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCdncm91cC0lZCcsIGkpKTtcbiAgICAgICAgfVxuICAgICAgICBvdXRwdXQucHVzaCgoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCc8c3BhbiBjbGFzcz1cIiVzXCI+PC9zcGFuPicsIGNsYXNzZXMuam9pbignICcpKSk7XG4gICAgICAgIGlmIChyaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKC4uLmhlbHBlcnMuc2ltcGxlR3JvdXAocmlnaHQsIHRoaXMuZWxpc2lvbkVuZCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzNCgpKSB7XG4gICAgICAgICAgICBhc3NlcnQodGhpcy5hZGRyZXNzNCBpbnN0YW5jZW9mIGlwdjRfMS5BZGRyZXNzNCk7XG4gICAgICAgICAgICBvdXRwdXQucG9wKCk7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCh0aGlzLmFkZHJlc3M0Lmdyb3VwRm9yVjYoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dC5qb2luKCc6Jyk7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb25cbiAgICAvLyAjcmVnaW9uIFJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byBmaW5kIG9yIHZhbGlkYXRlXG4gICAgICogYWxsIHZhcmlhdGlvbnMgb2YgdGhpcyBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzdWJzdHJpbmdTZWFyY2hcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHJlZ3VsYXJFeHByZXNzaW9uU3RyaW5nKHN1YnN0cmluZ1NlYXJjaCA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBvdXRwdXQgPSBbXTtcbiAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB3aHkgdGhpcyBpcyBuZWNlc3NhcnlcbiAgICAgICAgY29uc3QgYWRkcmVzczYgPSBuZXcgQWRkcmVzczYodGhpcy5jb3JyZWN0Rm9ybSgpKTtcbiAgICAgICAgaWYgKGFkZHJlc3M2LmVsaWRlZEdyb3VwcyA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhlIHNpbXBsZSBjYXNlXG4gICAgICAgICAgICBvdXRwdXQucHVzaCgoMCwgcmVndWxhcl9leHByZXNzaW9uc18xLnNpbXBsZVJlZ3VsYXJFeHByZXNzaW9uKShhZGRyZXNzNi5wYXJzZWRBZGRyZXNzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWRkcmVzczYuZWxpZGVkR3JvdXBzID09PSBjb25zdGFudHM2LkdST1VQUykge1xuICAgICAgICAgICAgLy8gQSBjb21wbGV0ZWx5IGVsaWRlZCBhZGRyZXNzXG4gICAgICAgICAgICBvdXRwdXQucHVzaCgoMCwgcmVndWxhcl9leHByZXNzaW9uc18xLnBvc3NpYmxlRWxpc2lvbnMpKGNvbnN0YW50czYuR1JPVVBTKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBBIHBhcnRpYWxseSBlbGlkZWQgYWRkcmVzc1xuICAgICAgICAgICAgY29uc3QgaGFsdmVzID0gYWRkcmVzczYuYWRkcmVzcy5zcGxpdCgnOjonKTtcbiAgICAgICAgICAgIGlmIChoYWx2ZXNbMF0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goKDAsIHJlZ3VsYXJfZXhwcmVzc2lvbnNfMS5zaW1wbGVSZWd1bGFyRXhwcmVzc2lvbikoaGFsdmVzWzBdLnNwbGl0KCc6JykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgYWRkcmVzczYuZWxpZGVkR3JvdXBzID09PSAnbnVtYmVyJyk7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCgoMCwgcmVndWxhcl9leHByZXNzaW9uc18xLnBvc3NpYmxlRWxpc2lvbnMpKGFkZHJlc3M2LmVsaWRlZEdyb3VwcywgaGFsdmVzWzBdLmxlbmd0aCAhPT0gMCwgaGFsdmVzWzFdLmxlbmd0aCAhPT0gMCkpO1xuICAgICAgICAgICAgaWYgKGhhbHZlc1sxXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgoMCwgcmVndWxhcl9leHByZXNzaW9uc18xLnNpbXBsZVJlZ3VsYXJFeHByZXNzaW9uKShoYWx2ZXNbMV0uc3BsaXQoJzonKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0cHV0ID0gW291dHB1dC5qb2luKCc6JyldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3Vic3RyaW5nU2VhcmNoKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBbXG4gICAgICAgICAgICAgICAgJyg/PV58JyxcbiAgICAgICAgICAgICAgICByZWd1bGFyX2V4cHJlc3Npb25zXzEuQUREUkVTU19CT1VOREFSWSxcbiAgICAgICAgICAgICAgICAnfFteXFxcXHdcXFxcOl0pKCcsXG4gICAgICAgICAgICAgICAgLi4ub3V0cHV0LFxuICAgICAgICAgICAgICAgICcpKD89W15cXFxcd1xcXFw6XXwnLFxuICAgICAgICAgICAgICAgIHJlZ3VsYXJfZXhwcmVzc2lvbnNfMS5BRERSRVNTX0JPVU5EQVJZLFxuICAgICAgICAgICAgICAgICd8JCknLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbmQgb3IgdmFsaWRhdGUgYWxsXG4gICAgICogdmFyaWF0aW9ucyBvZiB0aGlzIGFkZHJlc3MuXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzdWJzdHJpbmdTZWFyY2hcbiAgICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgICAqL1xuICAgIHJlZ3VsYXJFeHByZXNzaW9uKHN1YnN0cmluZ1NlYXJjaCA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHRoaXMucmVndWxhckV4cHJlc3Npb25TdHJpbmcoc3Vic3RyaW5nU2VhcmNoKSwgJ2knKTtcbiAgICB9XG59XG5leHBvcnRzLkFkZHJlc3M2ID0gQWRkcmVzczY7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcHY2LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SRV9TVUJORVRfU1RSSU5HID0gZXhwb3J0cy5SRV9BRERSRVNTID0gZXhwb3J0cy5HUk9VUFMgPSBleHBvcnRzLkJJVFMgPSB2b2lkIDA7XG5leHBvcnRzLkJJVFMgPSAzMjtcbmV4cG9ydHMuR1JPVVBTID0gNDtcbmV4cG9ydHMuUkVfQUREUkVTUyA9IC9eKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPykkL2c7XG5leHBvcnRzLlJFX1NVQk5FVF9TVFJJTkcgPSAvXFwvXFxkezEsMn0kLztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0YW50cy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUkVfVVJMX1dJVEhfUE9SVCA9IGV4cG9ydHMuUkVfVVJMID0gZXhwb3J0cy5SRV9aT05FX1NUUklORyA9IGV4cG9ydHMuUkVfU1VCTkVUX1NUUklORyA9IGV4cG9ydHMuUkVfQkFEX0FERFJFU1MgPSBleHBvcnRzLlJFX0JBRF9DSEFSQUNURVJTID0gZXhwb3J0cy5UWVBFUyA9IGV4cG9ydHMuU0NPUEVTID0gZXhwb3J0cy5HUk9VUFMgPSBleHBvcnRzLkJJVFMgPSB2b2lkIDA7XG5leHBvcnRzLkJJVFMgPSAxMjg7XG5leHBvcnRzLkdST1VQUyA9IDg7XG4vKipcbiAqIFJlcHJlc2VudHMgSVB2NiBhZGRyZXNzIHNjb3Blc1xuICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gKiBAc3RhdGljXG4gKi9cbmV4cG9ydHMuU0NPUEVTID0ge1xuICAgIDA6ICdSZXNlcnZlZCcsXG4gICAgMTogJ0ludGVyZmFjZSBsb2NhbCcsXG4gICAgMjogJ0xpbmsgbG9jYWwnLFxuICAgIDQ6ICdBZG1pbiBsb2NhbCcsXG4gICAgNTogJ1NpdGUgbG9jYWwnLFxuICAgIDg6ICdPcmdhbml6YXRpb24gbG9jYWwnLFxuICAgIDE0OiAnR2xvYmFsJyxcbiAgICAxNTogJ1Jlc2VydmVkJyxcbn07XG4vKipcbiAqIFJlcHJlc2VudHMgSVB2NiBhZGRyZXNzIHR5cGVzXG4gKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0cy5UWVBFUyA9IHtcbiAgICAnZmYwMTo6MS8xMjgnOiAnTXVsdGljYXN0IChBbGwgbm9kZXMgb24gdGhpcyBpbnRlcmZhY2UpJyxcbiAgICAnZmYwMTo6Mi8xMjgnOiAnTXVsdGljYXN0IChBbGwgcm91dGVycyBvbiB0aGlzIGludGVyZmFjZSknLFxuICAgICdmZjAyOjoxLzEyOCc6ICdNdWx0aWNhc3QgKEFsbCBub2RlcyBvbiB0aGlzIGxpbmspJyxcbiAgICAnZmYwMjo6Mi8xMjgnOiAnTXVsdGljYXN0IChBbGwgcm91dGVycyBvbiB0aGlzIGxpbmspJyxcbiAgICAnZmYwNTo6Mi8xMjgnOiAnTXVsdGljYXN0IChBbGwgcm91dGVycyBpbiB0aGlzIHNpdGUpJyxcbiAgICAnZmYwMjo6NS8xMjgnOiAnTXVsdGljYXN0IChPU1BGdjMgQWxsU1BGIHJvdXRlcnMpJyxcbiAgICAnZmYwMjo6Ni8xMjgnOiAnTXVsdGljYXN0IChPU1BGdjMgQWxsRFIgcm91dGVycyknLFxuICAgICdmZjAyOjo5LzEyOCc6ICdNdWx0aWNhc3QgKFJJUCByb3V0ZXJzKScsXG4gICAgJ2ZmMDI6OmEvMTI4JzogJ011bHRpY2FzdCAoRUlHUlAgcm91dGVycyknLFxuICAgICdmZjAyOjpkLzEyOCc6ICdNdWx0aWNhc3QgKFBJTSByb3V0ZXJzKScsXG4gICAgJ2ZmMDI6OjE2LzEyOCc6ICdNdWx0aWNhc3QgKE1MRHYyIHJlcG9ydHMpJyxcbiAgICAnZmYwMTo6ZmIvMTI4JzogJ011bHRpY2FzdCAobUROU3Y2KScsXG4gICAgJ2ZmMDI6OmZiLzEyOCc6ICdNdWx0aWNhc3QgKG1ETlN2NiknLFxuICAgICdmZjA1OjpmYi8xMjgnOiAnTXVsdGljYXN0IChtRE5TdjYpJyxcbiAgICAnZmYwMjo6MToyLzEyOCc6ICdNdWx0aWNhc3QgKEFsbCBESENQIHNlcnZlcnMgYW5kIHJlbGF5IGFnZW50cyBvbiB0aGlzIGxpbmspJyxcbiAgICAnZmYwNTo6MToyLzEyOCc6ICdNdWx0aWNhc3QgKEFsbCBESENQIHNlcnZlcnMgYW5kIHJlbGF5IGFnZW50cyBpbiB0aGlzIHNpdGUpJyxcbiAgICAnZmYwMjo6MTozLzEyOCc6ICdNdWx0aWNhc3QgKEFsbCBESENQIHNlcnZlcnMgb24gdGhpcyBsaW5rKScsXG4gICAgJ2ZmMDU6OjE6My8xMjgnOiAnTXVsdGljYXN0IChBbGwgREhDUCBzZXJ2ZXJzIGluIHRoaXMgc2l0ZSknLFxuICAgICc6Oi8xMjgnOiAnVW5zcGVjaWZpZWQnLFxuICAgICc6OjEvMTI4JzogJ0xvb3BiYWNrJyxcbiAgICAnZmYwMDo6LzgnOiAnTXVsdGljYXN0JyxcbiAgICAnZmU4MDo6LzEwJzogJ0xpbmstbG9jYWwgdW5pY2FzdCcsXG59O1xuLyoqXG4gKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgYmFkIGNoYXJhY3RlcnMgaW4gYW4gSVB2NiBhZGRyZXNzXG4gKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0cy5SRV9CQURfQ0hBUkFDVEVSUyA9IC8oW14wLTlhLWY6LyVdKS9naTtcbi8qKlxuICogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIGFuIGluY29ycmVjdCBJUHY2IGFkZHJlc3NcbiAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICogQHN0YXRpY1xuICovXG5leHBvcnRzLlJFX0JBRF9BRERSRVNTID0gLyhbMC05YS1mXXs1LH18OnszLH18W146XTokfF46W146XXxcXC8kKS9naTtcbi8qKlxuICogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIGFuIElQdjYgc3VibmV0XG4gKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0cy5SRV9TVUJORVRfU1RSSU5HID0gL1xcL1xcZHsxLDN9KD89JXwkKS87XG4vKipcbiAqIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBhbiBJUHY2IHpvbmVcbiAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICogQHN0YXRpY1xuICovXG5leHBvcnRzLlJFX1pPTkVfU1RSSU5HID0gLyUuKiQvO1xuZXhwb3J0cy5SRV9VUkwgPSBuZXcgUmVnRXhwKC9eXFxbezAsMX0oWzAtOWEtZjpdKylcXF17MCwxfS8pO1xuZXhwb3J0cy5SRV9VUkxfV0lUSF9QT1JUID0gbmV3IFJlZ0V4cCgvXFxbKFswLTlhLWY6XSspXFxdOihbMC05XXsxLDV9KS8pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zaW1wbGVHcm91cCA9IGV4cG9ydHMuc3BhbkxlYWRpbmdaZXJvZXMgPSBleHBvcnRzLnNwYW5BbGwgPSBleHBvcnRzLnNwYW5BbGxaZXJvZXMgPSB2b2lkIDA7XG5jb25zdCBzcHJpbnRmX2pzXzEgPSByZXF1aXJlKFwic3ByaW50Zi1qc1wiKTtcbi8qKlxuICogQHJldHVybnMge1N0cmluZ30gdGhlIHN0cmluZyB3aXRoIGFsbCB6ZXJvZXMgY29udGFpbmVkIGluIGEgPHNwYW4+XG4gKi9cbmZ1bmN0aW9uIHNwYW5BbGxaZXJvZXMocykge1xuICAgIHJldHVybiBzLnJlcGxhY2UoLygwKykvZywgJzxzcGFuIGNsYXNzPVwiemVyb1wiPiQxPC9zcGFuPicpO1xufVxuZXhwb3J0cy5zcGFuQWxsWmVyb2VzID0gc3BhbkFsbFplcm9lcztcbi8qKlxuICogQHJldHVybnMge1N0cmluZ30gdGhlIHN0cmluZyB3aXRoIGVhY2ggY2hhcmFjdGVyIGNvbnRhaW5lZCBpbiBhIDxzcGFuPlxuICovXG5mdW5jdGlvbiBzcGFuQWxsKHMsIG9mZnNldCA9IDApIHtcbiAgICBjb25zdCBsZXR0ZXJzID0gcy5zcGxpdCgnJyk7XG4gICAgcmV0dXJuIGxldHRlcnNcbiAgICAgICAgLm1hcCgobiwgaSkgPT4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnPHNwYW4gY2xhc3M9XCJkaWdpdCB2YWx1ZS0lcyBwb3NpdGlvbi0lZFwiPiVzPC9zcGFuPicsIG4sIGkgKyBvZmZzZXQsIHNwYW5BbGxaZXJvZXMobikpIC8vIFhYWCBVc2UgI2Jhc2UtMiAudmFsdWUtMCBpbnN0ZWFkP1xuICAgIClcbiAgICAgICAgLmpvaW4oJycpO1xufVxuZXhwb3J0cy5zcGFuQWxsID0gc3BhbkFsbDtcbmZ1bmN0aW9uIHNwYW5MZWFkaW5nWmVyb2VzU2ltcGxlKGdyb3VwKSB7XG4gICAgcmV0dXJuIGdyb3VwLnJlcGxhY2UoL14oMCspLywgJzxzcGFuIGNsYXNzPVwiemVyb1wiPiQxPC9zcGFuPicpO1xufVxuLyoqXG4gKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyB6ZXJvZXMgY29udGFpbmVkIGluIGEgPHNwYW4+XG4gKi9cbmZ1bmN0aW9uIHNwYW5MZWFkaW5nWmVyb2VzKGFkZHJlc3MpIHtcbiAgICBjb25zdCBncm91cHMgPSBhZGRyZXNzLnNwbGl0KCc6Jyk7XG4gICAgcmV0dXJuIGdyb3Vwcy5tYXAoKGcpID0+IHNwYW5MZWFkaW5nWmVyb2VzU2ltcGxlKGcpKS5qb2luKCc6Jyk7XG59XG5leHBvcnRzLnNwYW5MZWFkaW5nWmVyb2VzID0gc3BhbkxlYWRpbmdaZXJvZXM7XG4vKipcbiAqIEdyb3VwcyBhbiBhZGRyZXNzXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBhIGdyb3VwZWQgYWRkcmVzc1xuICovXG5mdW5jdGlvbiBzaW1wbGVHcm91cChhZGRyZXNzU3RyaW5nLCBvZmZzZXQgPSAwKSB7XG4gICAgY29uc3QgZ3JvdXBzID0gYWRkcmVzc1N0cmluZy5zcGxpdCgnOicpO1xuICAgIHJldHVybiBncm91cHMubWFwKChnLCBpKSA9PiB7XG4gICAgICAgIGlmICgvZ3JvdXAtdjQvLnRlc3QoZykpIHtcbiAgICAgICAgICAgIHJldHVybiBnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCc8c3BhbiBjbGFzcz1cImhvdmVyLWdyb3VwIGdyb3VwLSVkXCI+JXM8L3NwYW4+JywgaSArIG9mZnNldCwgc3BhbkxlYWRpbmdaZXJvZXNTaW1wbGUoZykpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5zaW1wbGVHcm91cCA9IHNpbXBsZUdyb3VwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGVscGVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wb3NzaWJsZUVsaXNpb25zID0gZXhwb3J0cy5zaW1wbGVSZWd1bGFyRXhwcmVzc2lvbiA9IGV4cG9ydHMuQUREUkVTU19CT1VOREFSWSA9IGV4cG9ydHMucGFkR3JvdXAgPSBleHBvcnRzLmdyb3VwUG9zc2liaWxpdGllcyA9IHZvaWQgMDtcbmNvbnN0IHY2ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbnN0YW50c1wiKSk7XG5jb25zdCBzcHJpbnRmX2pzXzEgPSByZXF1aXJlKFwic3ByaW50Zi1qc1wiKTtcbmZ1bmN0aW9uIGdyb3VwUG9zc2liaWxpdGllcyhwb3NzaWJpbGl0aWVzKSB7XG4gICAgcmV0dXJuICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyglcyknLCBwb3NzaWJpbGl0aWVzLmpvaW4oJ3wnKSk7XG59XG5leHBvcnRzLmdyb3VwUG9zc2liaWxpdGllcyA9IGdyb3VwUG9zc2liaWxpdGllcztcbmZ1bmN0aW9uIHBhZEdyb3VwKGdyb3VwKSB7XG4gICAgaWYgKGdyb3VwLmxlbmd0aCA8IDQpIHtcbiAgICAgICAgcmV0dXJuICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJzB7MCwlZH0lcycsIDQgLSBncm91cC5sZW5ndGgsIGdyb3VwKTtcbiAgICB9XG4gICAgcmV0dXJuIGdyb3VwO1xufVxuZXhwb3J0cy5wYWRHcm91cCA9IHBhZEdyb3VwO1xuZXhwb3J0cy5BRERSRVNTX0JPVU5EQVJZID0gJ1teQS1GYS1mMC05Ol0nO1xuZnVuY3Rpb24gc2ltcGxlUmVndWxhckV4cHJlc3Npb24oZ3JvdXBzKSB7XG4gICAgY29uc3QgemVyb0luZGV4ZXMgPSBbXTtcbiAgICBncm91cHMuZm9yRWFjaCgoZ3JvdXAsIGkpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBJbnRlZ2VyID0gcGFyc2VJbnQoZ3JvdXAsIDE2KTtcbiAgICAgICAgaWYgKGdyb3VwSW50ZWdlciA9PT0gMCkge1xuICAgICAgICAgICAgemVyb0luZGV4ZXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFlvdSBjYW4gdGVjaG5pY2FsbHkgZWxpZGUgYSBzaW5nbGUgMCwgdGhpcyBjcmVhdGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zXG4gICAgLy8gdG8gbWF0Y2ggdGhhdCBldmVudHVhbGl0eVxuICAgIGNvbnN0IHBvc3NpYmlsaXRpZXMgPSB6ZXJvSW5kZXhlcy5tYXAoKHplcm9JbmRleCkgPT4gZ3JvdXBzXG4gICAgICAgIC5tYXAoKGdyb3VwLCBpKSA9PiB7XG4gICAgICAgIGlmIChpID09PSB6ZXJvSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsaXNpb24gPSBpID09PSAwIHx8IGkgPT09IHY2LkdST1VQUyAtIDEgPyAnOicgOiAnJztcbiAgICAgICAgICAgIHJldHVybiBncm91cFBvc3NpYmlsaXRpZXMoW3BhZEdyb3VwKGdyb3VwKSwgZWxpc2lvbl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWRHcm91cChncm91cCk7XG4gICAgfSlcbiAgICAgICAgLmpvaW4oJzonKSk7XG4gICAgLy8gVGhlIHNpbXBsZXN0IGNhc2VcbiAgICBwb3NzaWJpbGl0aWVzLnB1c2goZ3JvdXBzLm1hcChwYWRHcm91cCkuam9pbignOicpKTtcbiAgICByZXR1cm4gZ3JvdXBQb3NzaWJpbGl0aWVzKHBvc3NpYmlsaXRpZXMpO1xufVxuZXhwb3J0cy5zaW1wbGVSZWd1bGFyRXhwcmVzc2lvbiA9IHNpbXBsZVJlZ3VsYXJFeHByZXNzaW9uO1xuZnVuY3Rpb24gcG9zc2libGVFbGlzaW9ucyhlbGlkZWRHcm91cHMsIG1vcmVMZWZ0LCBtb3JlUmlnaHQpIHtcbiAgICBjb25zdCBsZWZ0ID0gbW9yZUxlZnQgPyAnJyA6ICc6JztcbiAgICBjb25zdCByaWdodCA9IG1vcmVSaWdodCA/ICcnIDogJzonO1xuICAgIGNvbnN0IHBvc3NpYmlsaXRpZXMgPSBbXTtcbiAgICAvLyAxLiBlbGlzaW9uIG9mIGV2ZXJ5dGhpbmcgKDo6KVxuICAgIGlmICghbW9yZUxlZnQgJiYgIW1vcmVSaWdodCkge1xuICAgICAgICBwb3NzaWJpbGl0aWVzLnB1c2goJzo6Jyk7XG4gICAgfVxuICAgIC8vIDIuIGNvbXBsZXRlIGVsaXNpb24gb2YgdGhlIG1pZGRsZVxuICAgIGlmIChtb3JlTGVmdCAmJiBtb3JlUmlnaHQpIHtcbiAgICAgICAgcG9zc2liaWxpdGllcy5wdXNoKCcnKTtcbiAgICB9XG4gICAgaWYgKChtb3JlUmlnaHQgJiYgIW1vcmVMZWZ0KSB8fCAoIW1vcmVSaWdodCAmJiBtb3JlTGVmdCkpIHtcbiAgICAgICAgLy8gMy4gY29tcGxldGUgZWxpc2lvbiBvZiBvbmUgc2lkZVxuICAgICAgICBwb3NzaWJpbGl0aWVzLnB1c2goJzonKTtcbiAgICB9XG4gICAgLy8gNC4gZWxpc2lvbiBmcm9tIHRoZSBsZWZ0IHNpZGVcbiAgICBwb3NzaWJpbGl0aWVzLnB1c2goKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXMoOjB7MSw0fSl7MSwlZH0nLCBsZWZ0LCBlbGlkZWRHcm91cHMgLSAxKSk7XG4gICAgLy8gNS4gZWxpc2lvbiBmcm9tIHRoZSByaWdodCBzaWRlXG4gICAgcG9zc2liaWxpdGllcy5wdXNoKCgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJygwezEsNH06KXsxLCVkfSVzJywgZWxpZGVkR3JvdXBzIC0gMSwgcmlnaHQpKTtcbiAgICAvLyA2LiBubyBlbGlzaW9uXG4gICAgcG9zc2liaWxpdGllcy5wdXNoKCgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJygwezEsNH06KXslZH0wezEsNH0nLCBlbGlkZWRHcm91cHMgLSAxKSk7XG4gICAgLy8gNy4gZWxpc2lvbiAoaW5jbHVkaW5nIHNsb3BweSBlbGlzaW9uKSBmcm9tIHRoZSBtaWRkbGVcbiAgICBmb3IgKGxldCBncm91cHMgPSAxOyBncm91cHMgPCBlbGlkZWRHcm91cHMgLSAxOyBncm91cHMrKykge1xuICAgICAgICBmb3IgKGxldCBwb3NpdGlvbiA9IDE7IHBvc2l0aW9uIDwgZWxpZGVkR3JvdXBzIC0gZ3JvdXBzOyBwb3NpdGlvbisrKSB7XG4gICAgICAgICAgICBwb3NzaWJpbGl0aWVzLnB1c2goKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnKDB7MSw0fTopeyVkfTooMHsxLDR9Oil7JWR9MHsxLDR9JywgcG9zaXRpb24sIGVsaWRlZEdyb3VwcyAtIHBvc2l0aW9uIC0gZ3JvdXBzIC0gMSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBncm91cFBvc3NpYmlsaXRpZXMocG9zc2liaWxpdGllcyk7XG59XG5leHBvcnRzLnBvc3NpYmxlRWxpc2lvbnMgPSBwb3NzaWJsZUVsaXNpb25zO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVndWxhci1leHByZXNzaW9ucy5qcy5tYXAiLCIvKiBlc2xpbnQtZGlzYWJsZSB5b2RhICovXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzRnVsbHdpZHRoQ29kZVBvaW50ID0gY29kZVBvaW50ID0+IHtcblx0aWYgKE51bWJlci5pc05hTihjb2RlUG9pbnQpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gQ29kZSBwb2ludHMgYXJlIGRlcml2ZWQgZnJvbTpcblx0Ly8gaHR0cDovL3d3dy51bml4Lm9yZy9QdWJsaWMvVU5JREFUQS9FYXN0QXNpYW5XaWR0aC50eHRcblx0aWYgKFxuXHRcdGNvZGVQb2ludCA+PSAweDExMDAgJiYgKFxuXHRcdFx0Y29kZVBvaW50IDw9IDB4MTE1RiB8fCAvLyBIYW5ndWwgSmFtb1xuXHRcdFx0Y29kZVBvaW50ID09PSAweDIzMjkgfHwgLy8gTEVGVC1QT0lOVElORyBBTkdMRSBCUkFDS0VUXG5cdFx0XHRjb2RlUG9pbnQgPT09IDB4MjMyQSB8fCAvLyBSSUdIVC1QT0lOVElORyBBTkdMRSBCUkFDS0VUXG5cdFx0XHQvLyBDSksgUmFkaWNhbHMgU3VwcGxlbWVudCAuLiBFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzXG5cdFx0XHQoMHgyRTgwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgzMjQ3ICYmIGNvZGVQb2ludCAhPT0gMHgzMDNGKSB8fFxuXHRcdFx0Ly8gRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocyAuLiBDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBBXG5cdFx0XHQoMHgzMjUwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHg0REJGKSB8fFxuXHRcdFx0Ly8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyAuLiBZaSBSYWRpY2Fsc1xuXHRcdFx0KDB4NEUwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4QTRDNikgfHxcblx0XHRcdC8vIEhhbmd1bCBKYW1vIEV4dGVuZGVkLUFcblx0XHRcdCgweEE5NjAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEE5N0MpIHx8XG5cdFx0XHQvLyBIYW5ndWwgU3lsbGFibGVzXG5cdFx0XHQoMHhBQzAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhEN0EzKSB8fFxuXHRcdFx0Ly8gQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBoc1xuXHRcdFx0KDB4RjkwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkFGRikgfHxcblx0XHRcdC8vIFZlcnRpY2FsIEZvcm1zXG5cdFx0XHQoMHhGRTEwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhGRTE5KSB8fFxuXHRcdFx0Ly8gQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMgLi4gU21hbGwgRm9ybSBWYXJpYW50c1xuXHRcdFx0KDB4RkUzMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkU2QikgfHxcblx0XHRcdC8vIEhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zXG5cdFx0XHQoMHhGRjAxIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhGRjYwKSB8fFxuXHRcdFx0KDB4RkZFMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkZFNikgfHxcblx0XHRcdC8vIEthbmEgU3VwcGxlbWVudFxuXHRcdFx0KDB4MUIwMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDFCMDAxKSB8fFxuXHRcdFx0Ly8gRW5jbG9zZWQgSWRlb2dyYXBoaWMgU3VwcGxlbWVudFxuXHRcdFx0KDB4MUYyMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDFGMjUxKSB8fFxuXHRcdFx0Ly8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQiAuLiBUZXJ0aWFyeSBJZGVvZ3JhcGhpYyBQbGFuZVxuXHRcdFx0KDB4MjAwMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDNGRkZEKVxuXHRcdClcblx0KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRnVsbHdpZHRoQ29kZVBvaW50O1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IGlzRnVsbHdpZHRoQ29kZVBvaW50O1xuIiwiKGZ1bmN0aW9uKCl7XG5cbiAgICAvLyBDb3B5cmlnaHQgKGMpIDIwMDUgIFRvbSBXdVxuICAgIC8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgLy8gU2VlIFwiTElDRU5TRVwiIGZvciBkZXRhaWxzLlxuXG4gICAgLy8gQmFzaWMgSmF2YVNjcmlwdCBCTiBsaWJyYXJ5IC0gc3Vic2V0IHVzZWZ1bCBmb3IgUlNBIGVuY3J5cHRpb24uXG5cbiAgICAvLyBCaXRzIHBlciBkaWdpdFxuICAgIHZhciBkYml0cztcblxuICAgIC8vIEphdmFTY3JpcHQgZW5naW5lIGFuYWx5c2lzXG4gICAgdmFyIGNhbmFyeSA9IDB4ZGVhZGJlZWZjYWZlO1xuICAgIHZhciBqX2xtID0gKChjYW5hcnkmMHhmZmZmZmYpPT0weGVmY2FmZSk7XG5cbiAgICAvLyAocHVibGljKSBDb25zdHJ1Y3RvclxuICAgIGZ1bmN0aW9uIEJpZ0ludGVnZXIoYSxiLGMpIHtcbiAgICAgIGlmKGEgIT0gbnVsbClcbiAgICAgICAgaWYoXCJudW1iZXJcIiA9PSB0eXBlb2YgYSkgdGhpcy5mcm9tTnVtYmVyKGEsYixjKTtcbiAgICAgICAgZWxzZSBpZihiID09IG51bGwgJiYgXCJzdHJpbmdcIiAhPSB0eXBlb2YgYSkgdGhpcy5mcm9tU3RyaW5nKGEsMjU2KTtcbiAgICAgICAgZWxzZSB0aGlzLmZyb21TdHJpbmcoYSxiKTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gbmV3LCB1bnNldCBCaWdJbnRlZ2VyXG4gICAgZnVuY3Rpb24gbmJpKCkgeyByZXR1cm4gbmV3IEJpZ0ludGVnZXIobnVsbCk7IH1cblxuICAgIC8vIGFtOiBDb21wdXRlIHdfaiArPSAoeCp0aGlzX2kpLCBwcm9wYWdhdGUgY2FycmllcyxcbiAgICAvLyBjIGlzIGluaXRpYWwgY2FycnksIHJldHVybnMgZmluYWwgY2FycnkuXG4gICAgLy8gYyA8IDMqZHZhbHVlLCB4IDwgMipkdmFsdWUsIHRoaXNfaSA8IGR2YWx1ZVxuICAgIC8vIFdlIG5lZWQgdG8gc2VsZWN0IHRoZSBmYXN0ZXN0IG9uZSB0aGF0IHdvcmtzIGluIHRoaXMgZW52aXJvbm1lbnQuXG5cbiAgICAvLyBhbTE6IHVzZSBhIHNpbmdsZSBtdWx0IGFuZCBkaXZpZGUgdG8gZ2V0IHRoZSBoaWdoIGJpdHMsXG4gICAgLy8gbWF4IGRpZ2l0IGJpdHMgc2hvdWxkIGJlIDI2IGJlY2F1c2VcbiAgICAvLyBtYXggaW50ZXJuYWwgdmFsdWUgPSAyKmR2YWx1ZV4yLTIqZHZhbHVlICg8IDJeNTMpXG4gICAgZnVuY3Rpb24gYW0xKGkseCx3LGosYyxuKSB7XG4gICAgICB3aGlsZSgtLW4gPj0gMCkge1xuICAgICAgICB2YXIgdiA9IHgqdGhpc1tpKytdK3dbal0rYztcbiAgICAgICAgYyA9IE1hdGguZmxvb3Iodi8weDQwMDAwMDApO1xuICAgICAgICB3W2orK10gPSB2JjB4M2ZmZmZmZjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH1cbiAgICAvLyBhbTIgYXZvaWRzIGEgYmlnIG11bHQtYW5kLWV4dHJhY3QgY29tcGxldGVseS5cbiAgICAvLyBNYXggZGlnaXQgYml0cyBzaG91bGQgYmUgPD0gMzAgYmVjYXVzZSB3ZSBkbyBiaXR3aXNlIG9wc1xuICAgIC8vIG9uIHZhbHVlcyB1cCB0byAyKmhkdmFsdWVeMi1oZHZhbHVlLTEgKDwgMl4zMSlcbiAgICBmdW5jdGlvbiBhbTIoaSx4LHcsaixjLG4pIHtcbiAgICAgIHZhciB4bCA9IHgmMHg3ZmZmLCB4aCA9IHg+PjE1O1xuICAgICAgd2hpbGUoLS1uID49IDApIHtcbiAgICAgICAgdmFyIGwgPSB0aGlzW2ldJjB4N2ZmZjtcbiAgICAgICAgdmFyIGggPSB0aGlzW2krK10+PjE1O1xuICAgICAgICB2YXIgbSA9IHhoKmwraCp4bDtcbiAgICAgICAgbCA9IHhsKmwrKChtJjB4N2ZmZik8PDE1KSt3W2pdKyhjJjB4M2ZmZmZmZmYpO1xuICAgICAgICBjID0gKGw+Pj4zMCkrKG0+Pj4xNSkreGgqaCsoYz4+PjMwKTtcbiAgICAgICAgd1tqKytdID0gbCYweDNmZmZmZmZmO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfVxuICAgIC8vIEFsdGVybmF0ZWx5LCBzZXQgbWF4IGRpZ2l0IGJpdHMgdG8gMjggc2luY2Ugc29tZVxuICAgIC8vIGJyb3dzZXJzIHNsb3cgZG93biB3aGVuIGRlYWxpbmcgd2l0aCAzMi1iaXQgbnVtYmVycy5cbiAgICBmdW5jdGlvbiBhbTMoaSx4LHcsaixjLG4pIHtcbiAgICAgIHZhciB4bCA9IHgmMHgzZmZmLCB4aCA9IHg+PjE0O1xuICAgICAgd2hpbGUoLS1uID49IDApIHtcbiAgICAgICAgdmFyIGwgPSB0aGlzW2ldJjB4M2ZmZjtcbiAgICAgICAgdmFyIGggPSB0aGlzW2krK10+PjE0O1xuICAgICAgICB2YXIgbSA9IHhoKmwraCp4bDtcbiAgICAgICAgbCA9IHhsKmwrKChtJjB4M2ZmZik8PDE0KSt3W2pdK2M7XG4gICAgICAgIGMgPSAobD4+MjgpKyhtPj4xNCkreGgqaDtcbiAgICAgICAgd1tqKytdID0gbCYweGZmZmZmZmY7XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9XG4gICAgdmFyIGluQnJvd3NlciA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCI7XG4gICAgaWYoaW5Ccm93c2VyICYmIGpfbG0gJiYgKG5hdmlnYXRvci5hcHBOYW1lID09IFwiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyXCIpKSB7XG4gICAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbSA9IGFtMjtcbiAgICAgIGRiaXRzID0gMzA7XG4gICAgfVxuICAgIGVsc2UgaWYoaW5Ccm93c2VyICYmIGpfbG0gJiYgKG5hdmlnYXRvci5hcHBOYW1lICE9IFwiTmV0c2NhcGVcIikpIHtcbiAgICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFtID0gYW0xO1xuICAgICAgZGJpdHMgPSAyNjtcbiAgICB9XG4gICAgZWxzZSB7IC8vIE1vemlsbGEvTmV0c2NhcGUgc2VlbXMgdG8gcHJlZmVyIGFtM1xuICAgICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYW0gPSBhbTM7XG4gICAgICBkYml0cyA9IDI4O1xuICAgIH1cblxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkRCID0gZGJpdHM7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuRE0gPSAoKDE8PGRiaXRzKS0xKTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5EViA9ICgxPDxkYml0cyk7XG5cbiAgICB2YXIgQklfRlAgPSA1MjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5GViA9IE1hdGgucG93KDIsQklfRlApO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkYxID0gQklfRlAtZGJpdHM7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuRjIgPSAyKmRiaXRzLUJJX0ZQO1xuXG4gICAgLy8gRGlnaXQgY29udmVyc2lvbnNcbiAgICB2YXIgQklfUk0gPSBcIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO1xuICAgIHZhciBCSV9SQyA9IG5ldyBBcnJheSgpO1xuICAgIHZhciBycix2djtcbiAgICByciA9IFwiMFwiLmNoYXJDb2RlQXQoMCk7XG4gICAgZm9yKHZ2ID0gMDsgdnYgPD0gOTsgKyt2dikgQklfUkNbcnIrK10gPSB2djtcbiAgICByciA9IFwiYVwiLmNoYXJDb2RlQXQoMCk7XG4gICAgZm9yKHZ2ID0gMTA7IHZ2IDwgMzY7ICsrdnYpIEJJX1JDW3JyKytdID0gdnY7XG4gICAgcnIgPSBcIkFcIi5jaGFyQ29kZUF0KDApO1xuICAgIGZvcih2diA9IDEwOyB2diA8IDM2OyArK3Z2KSBCSV9SQ1tycisrXSA9IHZ2O1xuXG4gICAgZnVuY3Rpb24gaW50MmNoYXIobikgeyByZXR1cm4gQklfUk0uY2hhckF0KG4pOyB9XG4gICAgZnVuY3Rpb24gaW50QXQocyxpKSB7XG4gICAgICB2YXIgYyA9IEJJX1JDW3MuY2hhckNvZGVBdChpKV07XG4gICAgICByZXR1cm4gKGM9PW51bGwpPy0xOmM7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgY29weSB0aGlzIHRvIHJcbiAgICBmdW5jdGlvbiBibnBDb3B5VG8ocikge1xuICAgICAgZm9yKHZhciBpID0gdGhpcy50LTE7IGkgPj0gMDsgLS1pKSByW2ldID0gdGhpc1tpXTtcbiAgICAgIHIudCA9IHRoaXMudDtcbiAgICAgIHIucyA9IHRoaXMucztcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBzZXQgZnJvbSBpbnRlZ2VyIHZhbHVlIHgsIC1EViA8PSB4IDwgRFZcbiAgICBmdW5jdGlvbiBibnBGcm9tSW50KHgpIHtcbiAgICAgIHRoaXMudCA9IDE7XG4gICAgICB0aGlzLnMgPSAoeDwwKT8tMTowO1xuICAgICAgaWYoeCA+IDApIHRoaXNbMF0gPSB4O1xuICAgICAgZWxzZSBpZih4IDwgLTEpIHRoaXNbMF0gPSB4K3RoaXMuRFY7XG4gICAgICBlbHNlIHRoaXMudCA9IDA7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGJpZ2ludCBpbml0aWFsaXplZCB0byB2YWx1ZVxuICAgIGZ1bmN0aW9uIG5idihpKSB7IHZhciByID0gbmJpKCk7IHIuZnJvbUludChpKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHNldCBmcm9tIHN0cmluZyBhbmQgcmFkaXhcbiAgICBmdW5jdGlvbiBibnBGcm9tU3RyaW5nKHMsYikge1xuICAgICAgdmFyIGs7XG4gICAgICBpZihiID09IDE2KSBrID0gNDtcbiAgICAgIGVsc2UgaWYoYiA9PSA4KSBrID0gMztcbiAgICAgIGVsc2UgaWYoYiA9PSAyNTYpIGsgPSA4OyAvLyBieXRlIGFycmF5XG4gICAgICBlbHNlIGlmKGIgPT0gMikgayA9IDE7XG4gICAgICBlbHNlIGlmKGIgPT0gMzIpIGsgPSA1O1xuICAgICAgZWxzZSBpZihiID09IDQpIGsgPSAyO1xuICAgICAgZWxzZSB7IHRoaXMuZnJvbVJhZGl4KHMsYik7IHJldHVybjsgfVxuICAgICAgdGhpcy50ID0gMDtcbiAgICAgIHRoaXMucyA9IDA7XG4gICAgICB2YXIgaSA9IHMubGVuZ3RoLCBtaSA9IGZhbHNlLCBzaCA9IDA7XG4gICAgICB3aGlsZSgtLWkgPj0gMCkge1xuICAgICAgICB2YXIgeCA9IChrPT04KT9zW2ldJjB4ZmY6aW50QXQocyxpKTtcbiAgICAgICAgaWYoeCA8IDApIHtcbiAgICAgICAgICBpZihzLmNoYXJBdChpKSA9PSBcIi1cIikgbWkgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1pID0gZmFsc2U7XG4gICAgICAgIGlmKHNoID09IDApXG4gICAgICAgICAgdGhpc1t0aGlzLnQrK10gPSB4O1xuICAgICAgICBlbHNlIGlmKHNoK2sgPiB0aGlzLkRCKSB7XG4gICAgICAgICAgdGhpc1t0aGlzLnQtMV0gfD0gKHgmKCgxPDwodGhpcy5EQi1zaCkpLTEpKTw8c2g7XG4gICAgICAgICAgdGhpc1t0aGlzLnQrK10gPSAoeD4+KHRoaXMuREItc2gpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpc1t0aGlzLnQtMV0gfD0geDw8c2g7XG4gICAgICAgIHNoICs9IGs7XG4gICAgICAgIGlmKHNoID49IHRoaXMuREIpIHNoIC09IHRoaXMuREI7XG4gICAgICB9XG4gICAgICBpZihrID09IDggJiYgKHNbMF0mMHg4MCkgIT0gMCkge1xuICAgICAgICB0aGlzLnMgPSAtMTtcbiAgICAgICAgaWYoc2ggPiAwKSB0aGlzW3RoaXMudC0xXSB8PSAoKDE8PCh0aGlzLkRCLXNoKSktMSk8PHNoO1xuICAgICAgfVxuICAgICAgdGhpcy5jbGFtcCgpO1xuICAgICAgaWYobWkpIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHRoaXMpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIGNsYW1wIG9mZiBleGNlc3MgaGlnaCB3b3Jkc1xuICAgIGZ1bmN0aW9uIGJucENsYW1wKCkge1xuICAgICAgdmFyIGMgPSB0aGlzLnMmdGhpcy5ETTtcbiAgICAgIHdoaWxlKHRoaXMudCA+IDAgJiYgdGhpc1t0aGlzLnQtMV0gPT0gYykgLS10aGlzLnQ7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBpbiBnaXZlbiByYWRpeFxuICAgIGZ1bmN0aW9uIGJuVG9TdHJpbmcoYikge1xuICAgICAgaWYodGhpcy5zIDwgMCkgcmV0dXJuIFwiLVwiK3RoaXMubmVnYXRlKCkudG9TdHJpbmcoYik7XG4gICAgICB2YXIgaztcbiAgICAgIGlmKGIgPT0gMTYpIGsgPSA0O1xuICAgICAgZWxzZSBpZihiID09IDgpIGsgPSAzO1xuICAgICAgZWxzZSBpZihiID09IDIpIGsgPSAxO1xuICAgICAgZWxzZSBpZihiID09IDMyKSBrID0gNTtcbiAgICAgIGVsc2UgaWYoYiA9PSA0KSBrID0gMjtcbiAgICAgIGVsc2UgcmV0dXJuIHRoaXMudG9SYWRpeChiKTtcbiAgICAgIHZhciBrbSA9ICgxPDxrKS0xLCBkLCBtID0gZmFsc2UsIHIgPSBcIlwiLCBpID0gdGhpcy50O1xuICAgICAgdmFyIHAgPSB0aGlzLkRCLShpKnRoaXMuREIpJWs7XG4gICAgICBpZihpLS0gPiAwKSB7XG4gICAgICAgIGlmKHAgPCB0aGlzLkRCICYmIChkID0gdGhpc1tpXT4+cCkgPiAwKSB7IG0gPSB0cnVlOyByID0gaW50MmNoYXIoZCk7IH1cbiAgICAgICAgd2hpbGUoaSA+PSAwKSB7XG4gICAgICAgICAgaWYocCA8IGspIHtcbiAgICAgICAgICAgIGQgPSAodGhpc1tpXSYoKDE8PHApLTEpKTw8KGstcCk7XG4gICAgICAgICAgICBkIHw9IHRoaXNbLS1pXT4+KHArPXRoaXMuREItayk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZCA9ICh0aGlzW2ldPj4ocC09aykpJmttO1xuICAgICAgICAgICAgaWYocCA8PSAwKSB7IHAgKz0gdGhpcy5EQjsgLS1pOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGQgPiAwKSBtID0gdHJ1ZTtcbiAgICAgICAgICBpZihtKSByICs9IGludDJjaGFyKGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbT9yOlwiMFwiO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIC10aGlzXG4gICAgZnVuY3Rpb24gYm5OZWdhdGUoKSB7IHZhciByID0gbmJpKCk7IEJpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgfHRoaXN8XG4gICAgZnVuY3Rpb24gYm5BYnMoKSB7IHJldHVybiAodGhpcy5zPDApP3RoaXMubmVnYXRlKCk6dGhpczsgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuICsgaWYgdGhpcyA+IGEsIC0gaWYgdGhpcyA8IGEsIDAgaWYgZXF1YWxcbiAgICBmdW5jdGlvbiBibkNvbXBhcmVUbyhhKSB7XG4gICAgICB2YXIgciA9IHRoaXMucy1hLnM7XG4gICAgICBpZihyICE9IDApIHJldHVybiByO1xuICAgICAgdmFyIGkgPSB0aGlzLnQ7XG4gICAgICByID0gaS1hLnQ7XG4gICAgICBpZihyICE9IDApIHJldHVybiAodGhpcy5zPDApPy1yOnI7XG4gICAgICB3aGlsZSgtLWkgPj0gMCkgaWYoKHI9dGhpc1tpXS1hW2ldKSAhPSAwKSByZXR1cm4gcjtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIHJldHVybnMgYml0IGxlbmd0aCBvZiB0aGUgaW50ZWdlciB4XG4gICAgZnVuY3Rpb24gbmJpdHMoeCkge1xuICAgICAgdmFyIHIgPSAxLCB0O1xuICAgICAgaWYoKHQ9eD4+PjE2KSAhPSAwKSB7IHggPSB0OyByICs9IDE2OyB9XG4gICAgICBpZigodD14Pj44KSAhPSAwKSB7IHggPSB0OyByICs9IDg7IH1cbiAgICAgIGlmKCh0PXg+PjQpICE9IDApIHsgeCA9IHQ7IHIgKz0gNDsgfVxuICAgICAgaWYoKHQ9eD4+MikgIT0gMCkgeyB4ID0gdDsgciArPSAyOyB9XG4gICAgICBpZigodD14Pj4xKSAhPSAwKSB7IHggPSB0OyByICs9IDE7IH1cbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gXCJ0aGlzXCJcbiAgICBmdW5jdGlvbiBibkJpdExlbmd0aCgpIHtcbiAgICAgIGlmKHRoaXMudCA8PSAwKSByZXR1cm4gMDtcbiAgICAgIHJldHVybiB0aGlzLkRCKih0aGlzLnQtMSkrbmJpdHModGhpc1t0aGlzLnQtMV1eKHRoaXMucyZ0aGlzLkRNKSk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgPDwgbipEQlxuICAgIGZ1bmN0aW9uIGJucERMU2hpZnRUbyhuLHIpIHtcbiAgICAgIHZhciBpO1xuICAgICAgZm9yKGkgPSB0aGlzLnQtMTsgaSA+PSAwOyAtLWkpIHJbaStuXSA9IHRoaXNbaV07XG4gICAgICBmb3IoaSA9IG4tMTsgaSA+PSAwOyAtLWkpIHJbaV0gPSAwO1xuICAgICAgci50ID0gdGhpcy50K247XG4gICAgICByLnMgPSB0aGlzLnM7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgPj4gbipEQlxuICAgIGZ1bmN0aW9uIGJucERSU2hpZnRUbyhuLHIpIHtcbiAgICAgIGZvcih2YXIgaSA9IG47IGkgPCB0aGlzLnQ7ICsraSkgcltpLW5dID0gdGhpc1tpXTtcbiAgICAgIHIudCA9IE1hdGgubWF4KHRoaXMudC1uLDApO1xuICAgICAgci5zID0gdGhpcy5zO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIDw8IG5cbiAgICBmdW5jdGlvbiBibnBMU2hpZnRUbyhuLHIpIHtcbiAgICAgIHZhciBicyA9IG4ldGhpcy5EQjtcbiAgICAgIHZhciBjYnMgPSB0aGlzLkRCLWJzO1xuICAgICAgdmFyIGJtID0gKDE8PGNicyktMTtcbiAgICAgIHZhciBkcyA9IE1hdGguZmxvb3Iobi90aGlzLkRCKSwgYyA9ICh0aGlzLnM8PGJzKSZ0aGlzLkRNLCBpO1xuICAgICAgZm9yKGkgPSB0aGlzLnQtMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgcltpK2RzKzFdID0gKHRoaXNbaV0+PmNicyl8YztcbiAgICAgICAgYyA9ICh0aGlzW2ldJmJtKTw8YnM7XG4gICAgICB9XG4gICAgICBmb3IoaSA9IGRzLTE7IGkgPj0gMDsgLS1pKSByW2ldID0gMDtcbiAgICAgIHJbZHNdID0gYztcbiAgICAgIHIudCA9IHRoaXMudCtkcysxO1xuICAgICAgci5zID0gdGhpcy5zO1xuICAgICAgci5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzID4+IG5cbiAgICBmdW5jdGlvbiBibnBSU2hpZnRUbyhuLHIpIHtcbiAgICAgIHIucyA9IHRoaXMucztcbiAgICAgIHZhciBkcyA9IE1hdGguZmxvb3Iobi90aGlzLkRCKTtcbiAgICAgIGlmKGRzID49IHRoaXMudCkgeyByLnQgPSAwOyByZXR1cm47IH1cbiAgICAgIHZhciBicyA9IG4ldGhpcy5EQjtcbiAgICAgIHZhciBjYnMgPSB0aGlzLkRCLWJzO1xuICAgICAgdmFyIGJtID0gKDE8PGJzKS0xO1xuICAgICAgclswXSA9IHRoaXNbZHNdPj5icztcbiAgICAgIGZvcih2YXIgaSA9IGRzKzE7IGkgPCB0aGlzLnQ7ICsraSkge1xuICAgICAgICByW2ktZHMtMV0gfD0gKHRoaXNbaV0mYm0pPDxjYnM7XG4gICAgICAgIHJbaS1kc10gPSB0aGlzW2ldPj5icztcbiAgICAgIH1cbiAgICAgIGlmKGJzID4gMCkgclt0aGlzLnQtZHMtMV0gfD0gKHRoaXMucyZibSk8PGNicztcbiAgICAgIHIudCA9IHRoaXMudC1kcztcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyAtIGFcbiAgICBmdW5jdGlvbiBibnBTdWJUbyhhLHIpIHtcbiAgICAgIHZhciBpID0gMCwgYyA9IDAsIG0gPSBNYXRoLm1pbihhLnQsdGhpcy50KTtcbiAgICAgIHdoaWxlKGkgPCBtKSB7XG4gICAgICAgIGMgKz0gdGhpc1tpXS1hW2ldO1xuICAgICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICB9XG4gICAgICBpZihhLnQgPCB0aGlzLnQpIHtcbiAgICAgICAgYyAtPSBhLnM7XG4gICAgICAgIHdoaWxlKGkgPCB0aGlzLnQpIHtcbiAgICAgICAgICBjICs9IHRoaXNbaV07XG4gICAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICAgIH1cbiAgICAgICAgYyArPSB0aGlzLnM7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgYyArPSB0aGlzLnM7XG4gICAgICAgIHdoaWxlKGkgPCBhLnQpIHtcbiAgICAgICAgICBjIC09IGFbaV07XG4gICAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICAgIH1cbiAgICAgICAgYyAtPSBhLnM7XG4gICAgICB9XG4gICAgICByLnMgPSAoYzwwKT8tMTowO1xuICAgICAgaWYoYyA8IC0xKSByW2krK10gPSB0aGlzLkRWK2M7XG4gICAgICBlbHNlIGlmKGMgPiAwKSByW2krK10gPSBjO1xuICAgICAgci50ID0gaTtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyAqIGEsIHIgIT0gdGhpcyxhIChIQUMgMTQuMTIpXG4gICAgLy8gXCJ0aGlzXCIgc2hvdWxkIGJlIHRoZSBsYXJnZXIgb25lIGlmIGFwcHJvcHJpYXRlLlxuICAgIGZ1bmN0aW9uIGJucE11bHRpcGx5VG8oYSxyKSB7XG4gICAgICB2YXIgeCA9IHRoaXMuYWJzKCksIHkgPSBhLmFicygpO1xuICAgICAgdmFyIGkgPSB4LnQ7XG4gICAgICByLnQgPSBpK3kudDtcbiAgICAgIHdoaWxlKC0taSA+PSAwKSByW2ldID0gMDtcbiAgICAgIGZvcihpID0gMDsgaSA8IHkudDsgKytpKSByW2kreC50XSA9IHguYW0oMCx5W2ldLHIsaSwwLHgudCk7XG4gICAgICByLnMgPSAwO1xuICAgICAgci5jbGFtcCgpO1xuICAgICAgaWYodGhpcy5zICE9IGEucykgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHIscik7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXNeMiwgciAhPSB0aGlzIChIQUMgMTQuMTYpXG4gICAgZnVuY3Rpb24gYm5wU3F1YXJlVG8ocikge1xuICAgICAgdmFyIHggPSB0aGlzLmFicygpO1xuICAgICAgdmFyIGkgPSByLnQgPSAyKngudDtcbiAgICAgIHdoaWxlKC0taSA+PSAwKSByW2ldID0gMDtcbiAgICAgIGZvcihpID0gMDsgaSA8IHgudC0xOyArK2kpIHtcbiAgICAgICAgdmFyIGMgPSB4LmFtKGkseFtpXSxyLDIqaSwwLDEpO1xuICAgICAgICBpZigocltpK3gudF0rPXguYW0oaSsxLDIqeFtpXSxyLDIqaSsxLGMseC50LWktMSkpID49IHguRFYpIHtcbiAgICAgICAgICByW2kreC50XSAtPSB4LkRWO1xuICAgICAgICAgIHJbaSt4LnQrMV0gPSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZihyLnQgPiAwKSByW3IudC0xXSArPSB4LmFtKGkseFtpXSxyLDIqaSwwLDEpO1xuICAgICAgci5zID0gMDtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBkaXZpZGUgdGhpcyBieSBtLCBxdW90aWVudCBhbmQgcmVtYWluZGVyIHRvIHEsIHIgKEhBQyAxNC4yMClcbiAgICAvLyByICE9IHEsIHRoaXMgIT0gbS4gIHEgb3IgciBtYXkgYmUgbnVsbC5cbiAgICBmdW5jdGlvbiBibnBEaXZSZW1UbyhtLHEscikge1xuICAgICAgdmFyIHBtID0gbS5hYnMoKTtcbiAgICAgIGlmKHBtLnQgPD0gMCkgcmV0dXJuO1xuICAgICAgdmFyIHB0ID0gdGhpcy5hYnMoKTtcbiAgICAgIGlmKHB0LnQgPCBwbS50KSB7XG4gICAgICAgIGlmKHEgIT0gbnVsbCkgcS5mcm9tSW50KDApO1xuICAgICAgICBpZihyICE9IG51bGwpIHRoaXMuY29weVRvKHIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZihyID09IG51bGwpIHIgPSBuYmkoKTtcbiAgICAgIHZhciB5ID0gbmJpKCksIHRzID0gdGhpcy5zLCBtcyA9IG0ucztcbiAgICAgIHZhciBuc2ggPSB0aGlzLkRCLW5iaXRzKHBtW3BtLnQtMV0pOyAgIC8vIG5vcm1hbGl6ZSBtb2R1bHVzXG4gICAgICBpZihuc2ggPiAwKSB7IHBtLmxTaGlmdFRvKG5zaCx5KTsgcHQubFNoaWZ0VG8obnNoLHIpOyB9XG4gICAgICBlbHNlIHsgcG0uY29weVRvKHkpOyBwdC5jb3B5VG8ocik7IH1cbiAgICAgIHZhciB5cyA9IHkudDtcbiAgICAgIHZhciB5MCA9IHlbeXMtMV07XG4gICAgICBpZih5MCA9PSAwKSByZXR1cm47XG4gICAgICB2YXIgeXQgPSB5MCooMTw8dGhpcy5GMSkrKCh5cz4xKT95W3lzLTJdPj50aGlzLkYyOjApO1xuICAgICAgdmFyIGQxID0gdGhpcy5GVi95dCwgZDIgPSAoMTw8dGhpcy5GMSkveXQsIGUgPSAxPDx0aGlzLkYyO1xuICAgICAgdmFyIGkgPSByLnQsIGogPSBpLXlzLCB0ID0gKHE9PW51bGwpP25iaSgpOnE7XG4gICAgICB5LmRsU2hpZnRUbyhqLHQpO1xuICAgICAgaWYoci5jb21wYXJlVG8odCkgPj0gMCkge1xuICAgICAgICByW3IudCsrXSA9IDE7XG4gICAgICAgIHIuc3ViVG8odCxyKTtcbiAgICAgIH1cbiAgICAgIEJpZ0ludGVnZXIuT05FLmRsU2hpZnRUbyh5cyx0KTtcbiAgICAgIHQuc3ViVG8oeSx5KTsgIC8vIFwibmVnYXRpdmVcIiB5IHNvIHdlIGNhbiByZXBsYWNlIHN1YiB3aXRoIGFtIGxhdGVyXG4gICAgICB3aGlsZSh5LnQgPCB5cykgeVt5LnQrK10gPSAwO1xuICAgICAgd2hpbGUoLS1qID49IDApIHtcbiAgICAgICAgLy8gRXN0aW1hdGUgcXVvdGllbnQgZGlnaXRcbiAgICAgICAgdmFyIHFkID0gKHJbLS1pXT09eTApP3RoaXMuRE06TWF0aC5mbG9vcihyW2ldKmQxKyhyW2ktMV0rZSkqZDIpO1xuICAgICAgICBpZigocltpXSs9eS5hbSgwLHFkLHIsaiwwLHlzKSkgPCBxZCkgeyAgIC8vIFRyeSBpdCBvdXRcbiAgICAgICAgICB5LmRsU2hpZnRUbyhqLHQpO1xuICAgICAgICAgIHIuc3ViVG8odCxyKTtcbiAgICAgICAgICB3aGlsZShyW2ldIDwgLS1xZCkgci5zdWJUbyh0LHIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZihxICE9IG51bGwpIHtcbiAgICAgICAgci5kclNoaWZ0VG8oeXMscSk7XG4gICAgICAgIGlmKHRzICE9IG1zKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8ocSxxKTtcbiAgICAgIH1cbiAgICAgIHIudCA9IHlzO1xuICAgICAgci5jbGFtcCgpO1xuICAgICAgaWYobnNoID4gMCkgci5yU2hpZnRUbyhuc2gscik7IC8vIERlbm9ybWFsaXplIHJlbWFpbmRlclxuICAgICAgaWYodHMgPCAwKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8ocixyKTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzIG1vZCBhXG4gICAgZnVuY3Rpb24gYm5Nb2QoYSkge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIHRoaXMuYWJzKCkuZGl2UmVtVG8oYSxudWxsLHIpO1xuICAgICAgaWYodGhpcy5zIDwgMCAmJiByLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pID4gMCkgYS5zdWJUbyhyLHIpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gTW9kdWxhciByZWR1Y3Rpb24gdXNpbmcgXCJjbGFzc2ljXCIgYWxnb3JpdGhtXG4gICAgZnVuY3Rpb24gQ2xhc3NpYyhtKSB7IHRoaXMubSA9IG07IH1cbiAgICBmdW5jdGlvbiBjQ29udmVydCh4KSB7XG4gICAgICBpZih4LnMgPCAwIHx8IHguY29tcGFyZVRvKHRoaXMubSkgPj0gMCkgcmV0dXJuIHgubW9kKHRoaXMubSk7XG4gICAgICBlbHNlIHJldHVybiB4O1xuICAgIH1cbiAgICBmdW5jdGlvbiBjUmV2ZXJ0KHgpIHsgcmV0dXJuIHg7IH1cbiAgICBmdW5jdGlvbiBjUmVkdWNlKHgpIHsgeC5kaXZSZW1Ubyh0aGlzLm0sbnVsbCx4KTsgfVxuICAgIGZ1bmN0aW9uIGNNdWxUbyh4LHkscikgeyB4Lm11bHRpcGx5VG8oeSxyKTsgdGhpcy5yZWR1Y2Uocik7IH1cbiAgICBmdW5jdGlvbiBjU3FyVG8oeCxyKSB7IHguc3F1YXJlVG8ocik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbiAgICBDbGFzc2ljLnByb3RvdHlwZS5jb252ZXJ0ID0gY0NvbnZlcnQ7XG4gICAgQ2xhc3NpYy5wcm90b3R5cGUucmV2ZXJ0ID0gY1JldmVydDtcbiAgICBDbGFzc2ljLnByb3RvdHlwZS5yZWR1Y2UgPSBjUmVkdWNlO1xuICAgIENsYXNzaWMucHJvdG90eXBlLm11bFRvID0gY011bFRvO1xuICAgIENsYXNzaWMucHJvdG90eXBlLnNxclRvID0gY1NxclRvO1xuXG4gICAgLy8gKHByb3RlY3RlZCkgcmV0dXJuIFwiLTEvdGhpcyAlIDJeREJcIjsgdXNlZnVsIGZvciBNb250LiByZWR1Y3Rpb25cbiAgICAvLyBqdXN0aWZpY2F0aW9uOlxuICAgIC8vICAgICAgICAgeHkgPT0gMSAobW9kIG0pXG4gICAgLy8gICAgICAgICB4eSA9ICAxK2ttXG4gICAgLy8gICB4eSgyLXh5KSA9ICgxK2ttKSgxLWttKVxuICAgIC8vIHhbeSgyLXh5KV0gPSAxLWteMm1eMlxuICAgIC8vIHhbeSgyLXh5KV0gPT0gMSAobW9kIG1eMilcbiAgICAvLyBpZiB5IGlzIDEveCBtb2QgbSwgdGhlbiB5KDIteHkpIGlzIDEveCBtb2QgbV4yXG4gICAgLy8gc2hvdWxkIHJlZHVjZSB4IGFuZCB5KDIteHkpIGJ5IG1eMiBhdCBlYWNoIHN0ZXAgdG8ga2VlcCBzaXplIGJvdW5kZWQuXG4gICAgLy8gSlMgbXVsdGlwbHkgXCJvdmVyZmxvd3NcIiBkaWZmZXJlbnRseSBmcm9tIEMvQysrLCBzbyBjYXJlIGlzIG5lZWRlZCBoZXJlLlxuICAgIGZ1bmN0aW9uIGJucEludkRpZ2l0KCkge1xuICAgICAgaWYodGhpcy50IDwgMSkgcmV0dXJuIDA7XG4gICAgICB2YXIgeCA9IHRoaXNbMF07XG4gICAgICBpZigoeCYxKSA9PSAwKSByZXR1cm4gMDtcbiAgICAgIHZhciB5ID0geCYzOyAgICAgICAvLyB5ID09IDEveCBtb2QgMl4yXG4gICAgICB5ID0gKHkqKDItKHgmMHhmKSp5KSkmMHhmOyAvLyB5ID09IDEveCBtb2QgMl40XG4gICAgICB5ID0gKHkqKDItKHgmMHhmZikqeSkpJjB4ZmY7ICAgLy8geSA9PSAxL3ggbW9kIDJeOFxuICAgICAgeSA9ICh5KigyLSgoKHgmMHhmZmZmKSp5KSYweGZmZmYpKSkmMHhmZmZmOyAgICAvLyB5ID09IDEveCBtb2QgMl4xNlxuICAgICAgLy8gbGFzdCBzdGVwIC0gY2FsY3VsYXRlIGludmVyc2UgbW9kIERWIGRpcmVjdGx5O1xuICAgICAgLy8gYXNzdW1lcyAxNiA8IERCIDw9IDMyIGFuZCBhc3N1bWVzIGFiaWxpdHkgdG8gaGFuZGxlIDQ4LWJpdCBpbnRzXG4gICAgICB5ID0gKHkqKDIteCp5JXRoaXMuRFYpKSV0aGlzLkRWOyAgICAgICAvLyB5ID09IDEveCBtb2QgMl5kYml0c1xuICAgICAgLy8gd2UgcmVhbGx5IHdhbnQgdGhlIG5lZ2F0aXZlIGludmVyc2UsIGFuZCAtRFYgPCB5IDwgRFZcbiAgICAgIHJldHVybiAoeT4wKT90aGlzLkRWLXk6LXk7XG4gICAgfVxuXG4gICAgLy8gTW9udGdvbWVyeSByZWR1Y3Rpb25cbiAgICBmdW5jdGlvbiBNb250Z29tZXJ5KG0pIHtcbiAgICAgIHRoaXMubSA9IG07XG4gICAgICB0aGlzLm1wID0gbS5pbnZEaWdpdCgpO1xuICAgICAgdGhpcy5tcGwgPSB0aGlzLm1wJjB4N2ZmZjtcbiAgICAgIHRoaXMubXBoID0gdGhpcy5tcD4+MTU7XG4gICAgICB0aGlzLnVtID0gKDE8PChtLkRCLTE1KSktMTtcbiAgICAgIHRoaXMubXQyID0gMiptLnQ7XG4gICAgfVxuXG4gICAgLy8geFIgbW9kIG1cbiAgICBmdW5jdGlvbiBtb250Q29udmVydCh4KSB7XG4gICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgeC5hYnMoKS5kbFNoaWZ0VG8odGhpcy5tLnQscik7XG4gICAgICByLmRpdlJlbVRvKHRoaXMubSxudWxsLHIpO1xuICAgICAgaWYoeC5zIDwgMCAmJiByLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pID4gMCkgdGhpcy5tLnN1YlRvKHIscik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyB4L1IgbW9kIG1cbiAgICBmdW5jdGlvbiBtb250UmV2ZXJ0KHgpIHtcbiAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICB4LmNvcHlUbyhyKTtcbiAgICAgIHRoaXMucmVkdWNlKHIpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8geCA9IHgvUiBtb2QgbSAoSEFDIDE0LjMyKVxuICAgIGZ1bmN0aW9uIG1vbnRSZWR1Y2UoeCkge1xuICAgICAgd2hpbGUoeC50IDw9IHRoaXMubXQyKSAvLyBwYWQgeCBzbyBhbSBoYXMgZW5vdWdoIHJvb20gbGF0ZXJcbiAgICAgICAgeFt4LnQrK10gPSAwO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMubS50OyArK2kpIHtcbiAgICAgICAgLy8gZmFzdGVyIHdheSBvZiBjYWxjdWxhdGluZyB1MCA9IHhbaV0qbXAgbW9kIERWXG4gICAgICAgIHZhciBqID0geFtpXSYweDdmZmY7XG4gICAgICAgIHZhciB1MCA9IChqKnRoaXMubXBsKygoKGoqdGhpcy5tcGgrKHhbaV0+PjE1KSp0aGlzLm1wbCkmdGhpcy51bSk8PDE1KSkmeC5ETTtcbiAgICAgICAgLy8gdXNlIGFtIHRvIGNvbWJpbmUgdGhlIG11bHRpcGx5LXNoaWZ0LWFkZCBpbnRvIG9uZSBjYWxsXG4gICAgICAgIGogPSBpK3RoaXMubS50O1xuICAgICAgICB4W2pdICs9IHRoaXMubS5hbSgwLHUwLHgsaSwwLHRoaXMubS50KTtcbiAgICAgICAgLy8gcHJvcGFnYXRlIGNhcnJ5XG4gICAgICAgIHdoaWxlKHhbal0gPj0geC5EVikgeyB4W2pdIC09IHguRFY7IHhbKytqXSsrOyB9XG4gICAgICB9XG4gICAgICB4LmNsYW1wKCk7XG4gICAgICB4LmRyU2hpZnRUbyh0aGlzLm0udCx4KTtcbiAgICAgIGlmKHguY29tcGFyZVRvKHRoaXMubSkgPj0gMCkgeC5zdWJUbyh0aGlzLm0seCk7XG4gICAgfVxuXG4gICAgLy8gciA9IFwieF4yL1IgbW9kIG1cIjsgeCAhPSByXG4gICAgZnVuY3Rpb24gbW9udFNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG4gICAgLy8gciA9IFwieHkvUiBtb2QgbVwiOyB4LHkgIT0gclxuICAgIGZ1bmN0aW9uIG1vbnRNdWxUbyh4LHkscikgeyB4Lm11bHRpcGx5VG8oeSxyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuICAgIE1vbnRnb21lcnkucHJvdG90eXBlLmNvbnZlcnQgPSBtb250Q29udmVydDtcbiAgICBNb250Z29tZXJ5LnByb3RvdHlwZS5yZXZlcnQgPSBtb250UmV2ZXJ0O1xuICAgIE1vbnRnb21lcnkucHJvdG90eXBlLnJlZHVjZSA9IG1vbnRSZWR1Y2U7XG4gICAgTW9udGdvbWVyeS5wcm90b3R5cGUubXVsVG8gPSBtb250TXVsVG87XG4gICAgTW9udGdvbWVyeS5wcm90b3R5cGUuc3FyVG8gPSBtb250U3FyVG87XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0cnVlIGlmZiB0aGlzIGlzIGV2ZW5cbiAgICBmdW5jdGlvbiBibnBJc0V2ZW4oKSB7IHJldHVybiAoKHRoaXMudD4wKT8odGhpc1swXSYxKTp0aGlzLnMpID09IDA7IH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXNeZSwgZSA8IDJeMzIsIGRvaW5nIHNxciBhbmQgbXVsIHdpdGggXCJyXCIgKEhBQyAxNC43OSlcbiAgICBmdW5jdGlvbiBibnBFeHAoZSx6KSB7XG4gICAgICBpZihlID4gMHhmZmZmZmZmZiB8fCBlIDwgMSkgcmV0dXJuIEJpZ0ludGVnZXIuT05FO1xuICAgICAgdmFyIHIgPSBuYmkoKSwgcjIgPSBuYmkoKSwgZyA9IHouY29udmVydCh0aGlzKSwgaSA9IG5iaXRzKGUpLTE7XG4gICAgICBnLmNvcHlUbyhyKTtcbiAgICAgIHdoaWxlKC0taSA+PSAwKSB7XG4gICAgICAgIHouc3FyVG8ocixyMik7XG4gICAgICAgIGlmKChlJigxPDxpKSkgPiAwKSB6Lm11bFRvKHIyLGcscik7XG4gICAgICAgIGVsc2UgeyB2YXIgdCA9IHI7IHIgPSByMjsgcjIgPSB0OyB9XG4gICAgICB9XG4gICAgICByZXR1cm4gei5yZXZlcnQocik7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpc15lICUgbSwgMCA8PSBlIDwgMl4zMlxuICAgIGZ1bmN0aW9uIGJuTW9kUG93SW50KGUsbSkge1xuICAgICAgdmFyIHo7XG4gICAgICBpZihlIDwgMjU2IHx8IG0uaXNFdmVuKCkpIHogPSBuZXcgQ2xhc3NpYyhtKTsgZWxzZSB6ID0gbmV3IE1vbnRnb21lcnkobSk7XG4gICAgICByZXR1cm4gdGhpcy5leHAoZSx6KTtcbiAgICB9XG5cbiAgICAvLyBwcm90ZWN0ZWRcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb3B5VG8gPSBibnBDb3B5VG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbUludCA9IGJucEZyb21JbnQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVN0cmluZyA9IGJucEZyb21TdHJpbmc7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2xhbXAgPSBibnBDbGFtcDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kbFNoaWZ0VG8gPSBibnBETFNoaWZ0VG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvID0gYm5wRFJTaGlmdFRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmxTaGlmdFRvID0gYm5wTFNoaWZ0VG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuclNoaWZ0VG8gPSBibnBSU2hpZnRUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbyA9IGJucFN1YlRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5VG8gPSBibnBNdWx0aXBseVRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNxdWFyZVRvID0gYm5wU3F1YXJlVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2UmVtVG8gPSBibnBEaXZSZW1UbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pbnZEaWdpdCA9IGJucEludkRpZ2l0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmlzRXZlbiA9IGJucElzRXZlbjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5leHAgPSBibnBFeHA7XG5cbiAgICAvLyBwdWJsaWNcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS50b1N0cmluZyA9IGJuVG9TdHJpbmc7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlID0gYm5OZWdhdGU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYWJzID0gYm5BYnM7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY29tcGFyZVRvID0gYm5Db21wYXJlVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYml0TGVuZ3RoID0gYm5CaXRMZW5ndGg7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kID0gYm5Nb2Q7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93SW50ID0gYm5Nb2RQb3dJbnQ7XG5cbiAgICAvLyBcImNvbnN0YW50c1wiXG4gICAgQmlnSW50ZWdlci5aRVJPID0gbmJ2KDApO1xuICAgIEJpZ0ludGVnZXIuT05FID0gbmJ2KDEpO1xuXG4gICAgLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgIFRvbSBXdVxuICAgIC8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgLy8gU2VlIFwiTElDRU5TRVwiIGZvciBkZXRhaWxzLlxuXG4gICAgLy8gRXh0ZW5kZWQgSmF2YVNjcmlwdCBCTiBmdW5jdGlvbnMsIHJlcXVpcmVkIGZvciBSU0EgcHJpdmF0ZSBvcHMuXG5cbiAgICAvLyBWZXJzaW9uIDEuMTogbmV3IEJpZ0ludGVnZXIoXCIwXCIsIDEwKSByZXR1cm5zIFwicHJvcGVyXCIgemVyb1xuICAgIC8vIFZlcnNpb24gMS4yOiBzcXVhcmUoKSBBUEksIGlzUHJvYmFibGVQcmltZSBmaXhcblxuICAgIC8vIChwdWJsaWMpXG4gICAgZnVuY3Rpb24gYm5DbG9uZSgpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5jb3B5VG8ocik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gdmFsdWUgYXMgaW50ZWdlclxuICAgIGZ1bmN0aW9uIGJuSW50VmFsdWUoKSB7XG4gICAgICBpZih0aGlzLnMgPCAwKSB7XG4gICAgICAgIGlmKHRoaXMudCA9PSAxKSByZXR1cm4gdGhpc1swXS10aGlzLkRWO1xuICAgICAgICBlbHNlIGlmKHRoaXMudCA9PSAwKSByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBlbHNlIGlmKHRoaXMudCA9PSAxKSByZXR1cm4gdGhpc1swXTtcbiAgICAgIGVsc2UgaWYodGhpcy50ID09IDApIHJldHVybiAwO1xuICAgICAgLy8gYXNzdW1lcyAxNiA8IERCIDwgMzJcbiAgICAgIHJldHVybiAoKHRoaXNbMV0mKCgxPDwoMzItdGhpcy5EQikpLTEpKTw8dGhpcy5EQil8dGhpc1swXTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gdmFsdWUgYXMgYnl0ZVxuICAgIGZ1bmN0aW9uIGJuQnl0ZVZhbHVlKCkgeyByZXR1cm4gKHRoaXMudD09MCk/dGhpcy5zOih0aGlzWzBdPDwyNCk+PjI0OyB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gdmFsdWUgYXMgc2hvcnQgKGFzc3VtZXMgREI+PTE2KVxuICAgIGZ1bmN0aW9uIGJuU2hvcnRWYWx1ZSgpIHsgcmV0dXJuICh0aGlzLnQ9PTApP3RoaXMuczoodGhpc1swXTw8MTYpPj4xNjsgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgcmV0dXJuIHggcy50LiByXnggPCBEVlxuICAgIGZ1bmN0aW9uIGJucENodW5rU2l6ZShyKSB7IHJldHVybiBNYXRoLmZsb29yKE1hdGguTE4yKnRoaXMuREIvTWF0aC5sb2cocikpOyB9XG5cbiAgICAvLyAocHVibGljKSAwIGlmIHRoaXMgPT0gMCwgMSBpZiB0aGlzID4gMFxuICAgIGZ1bmN0aW9uIGJuU2lnTnVtKCkge1xuICAgICAgaWYodGhpcy5zIDwgMCkgcmV0dXJuIC0xO1xuICAgICAgZWxzZSBpZih0aGlzLnQgPD0gMCB8fCAodGhpcy50ID09IDEgJiYgdGhpc1swXSA8PSAwKSkgcmV0dXJuIDA7XG4gICAgICBlbHNlIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIGNvbnZlcnQgdG8gcmFkaXggc3RyaW5nXG4gICAgZnVuY3Rpb24gYm5wVG9SYWRpeChiKSB7XG4gICAgICBpZihiID09IG51bGwpIGIgPSAxMDtcbiAgICAgIGlmKHRoaXMuc2lnbnVtKCkgPT0gMCB8fCBiIDwgMiB8fCBiID4gMzYpIHJldHVybiBcIjBcIjtcbiAgICAgIHZhciBjcyA9IHRoaXMuY2h1bmtTaXplKGIpO1xuICAgICAgdmFyIGEgPSBNYXRoLnBvdyhiLGNzKTtcbiAgICAgIHZhciBkID0gbmJ2KGEpLCB5ID0gbmJpKCksIHogPSBuYmkoKSwgciA9IFwiXCI7XG4gICAgICB0aGlzLmRpdlJlbVRvKGQseSx6KTtcbiAgICAgIHdoaWxlKHkuc2lnbnVtKCkgPiAwKSB7XG4gICAgICAgIHIgPSAoYSt6LmludFZhbHVlKCkpLnRvU3RyaW5nKGIpLnN1YnN0cigxKSArIHI7XG4gICAgICAgIHkuZGl2UmVtVG8oZCx5LHopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHouaW50VmFsdWUoKS50b1N0cmluZyhiKSArIHI7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgY29udmVydCBmcm9tIHJhZGl4IHN0cmluZ1xuICAgIGZ1bmN0aW9uIGJucEZyb21SYWRpeChzLGIpIHtcbiAgICAgIHRoaXMuZnJvbUludCgwKTtcbiAgICAgIGlmKGIgPT0gbnVsbCkgYiA9IDEwO1xuICAgICAgdmFyIGNzID0gdGhpcy5jaHVua1NpemUoYik7XG4gICAgICB2YXIgZCA9IE1hdGgucG93KGIsY3MpLCBtaSA9IGZhbHNlLCBqID0gMCwgdyA9IDA7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgeCA9IGludEF0KHMsaSk7XG4gICAgICAgIGlmKHggPCAwKSB7XG4gICAgICAgICAgaWYocy5jaGFyQXQoaSkgPT0gXCItXCIgJiYgdGhpcy5zaWdudW0oKSA9PSAwKSBtaSA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdyA9IGIqdyt4O1xuICAgICAgICBpZigrK2ogPj0gY3MpIHtcbiAgICAgICAgICB0aGlzLmRNdWx0aXBseShkKTtcbiAgICAgICAgICB0aGlzLmRBZGRPZmZzZXQodywwKTtcbiAgICAgICAgICBqID0gMDtcbiAgICAgICAgICB3ID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYoaiA+IDApIHtcbiAgICAgICAgdGhpcy5kTXVsdGlwbHkoTWF0aC5wb3coYixqKSk7XG4gICAgICAgIHRoaXMuZEFkZE9mZnNldCh3LDApO1xuICAgICAgfVxuICAgICAgaWYobWkpIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHRoaXMpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIGFsdGVybmF0ZSBjb25zdHJ1Y3RvclxuICAgIGZ1bmN0aW9uIGJucEZyb21OdW1iZXIoYSxiLGMpIHtcbiAgICAgIGlmKFwibnVtYmVyXCIgPT0gdHlwZW9mIGIpIHtcbiAgICAgICAgLy8gbmV3IEJpZ0ludGVnZXIoaW50LGludCxSTkcpXG4gICAgICAgIGlmKGEgPCAyKSB0aGlzLmZyb21JbnQoMSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuZnJvbU51bWJlcihhLGMpO1xuICAgICAgICAgIGlmKCF0aGlzLnRlc3RCaXQoYS0xKSkgICAgLy8gZm9yY2UgTVNCIHNldFxuICAgICAgICAgICAgdGhpcy5iaXR3aXNlVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGEtMSksb3Bfb3IsdGhpcyk7XG4gICAgICAgICAgaWYodGhpcy5pc0V2ZW4oKSkgdGhpcy5kQWRkT2Zmc2V0KDEsMCk7IC8vIGZvcmNlIG9kZFxuICAgICAgICAgIHdoaWxlKCF0aGlzLmlzUHJvYmFibGVQcmltZShiKSkge1xuICAgICAgICAgICAgdGhpcy5kQWRkT2Zmc2V0KDIsMCk7XG4gICAgICAgICAgICBpZih0aGlzLmJpdExlbmd0aCgpID4gYSkgdGhpcy5zdWJUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoYS0xKSx0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBuZXcgQmlnSW50ZWdlcihpbnQsUk5HKVxuICAgICAgICB2YXIgeCA9IG5ldyBBcnJheSgpLCB0ID0gYSY3O1xuICAgICAgICB4Lmxlbmd0aCA9IChhPj4zKSsxO1xuICAgICAgICBiLm5leHRCeXRlcyh4KTtcbiAgICAgICAgaWYodCA+IDApIHhbMF0gJj0gKCgxPDx0KS0xKTsgZWxzZSB4WzBdID0gMDtcbiAgICAgICAgdGhpcy5mcm9tU3RyaW5nKHgsMjU2KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAocHVibGljKSBjb252ZXJ0IHRvIGJpZ2VuZGlhbiBieXRlIGFycmF5XG4gICAgZnVuY3Rpb24gYm5Ub0J5dGVBcnJheSgpIHtcbiAgICAgIHZhciBpID0gdGhpcy50LCByID0gbmV3IEFycmF5KCk7XG4gICAgICByWzBdID0gdGhpcy5zO1xuICAgICAgdmFyIHAgPSB0aGlzLkRCLShpKnRoaXMuREIpJTgsIGQsIGsgPSAwO1xuICAgICAgaWYoaS0tID4gMCkge1xuICAgICAgICBpZihwIDwgdGhpcy5EQiAmJiAoZCA9IHRoaXNbaV0+PnApICE9ICh0aGlzLnMmdGhpcy5ETSk+PnApXG4gICAgICAgICAgcltrKytdID0gZHwodGhpcy5zPDwodGhpcy5EQi1wKSk7XG4gICAgICAgIHdoaWxlKGkgPj0gMCkge1xuICAgICAgICAgIGlmKHAgPCA4KSB7XG4gICAgICAgICAgICBkID0gKHRoaXNbaV0mKCgxPDxwKS0xKSk8PCg4LXApO1xuICAgICAgICAgICAgZCB8PSB0aGlzWy0taV0+PihwKz10aGlzLkRCLTgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGQgPSAodGhpc1tpXT4+KHAtPTgpKSYweGZmO1xuICAgICAgICAgICAgaWYocCA8PSAwKSB7IHAgKz0gdGhpcy5EQjsgLS1pOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKChkJjB4ODApICE9IDApIGQgfD0gLTI1NjtcbiAgICAgICAgICBpZihrID09IDAgJiYgKHRoaXMucyYweDgwKSAhPSAoZCYweDgwKSkgKytrO1xuICAgICAgICAgIGlmKGsgPiAwIHx8IGQgIT0gdGhpcy5zKSByW2srK10gPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBibkVxdWFscyhhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKT09MCk7IH1cbiAgICBmdW5jdGlvbiBibk1pbihhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKTwwKT90aGlzOmE7IH1cbiAgICBmdW5jdGlvbiBibk1heChhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKT4wKT90aGlzOmE7IH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIG9wIGEgKGJpdHdpc2UpXG4gICAgZnVuY3Rpb24gYm5wQml0d2lzZVRvKGEsb3Ascikge1xuICAgICAgdmFyIGksIGYsIG0gPSBNYXRoLm1pbihhLnQsdGhpcy50KTtcbiAgICAgIGZvcihpID0gMDsgaSA8IG07ICsraSkgcltpXSA9IG9wKHRoaXNbaV0sYVtpXSk7XG4gICAgICBpZihhLnQgPCB0aGlzLnQpIHtcbiAgICAgICAgZiA9IGEucyZ0aGlzLkRNO1xuICAgICAgICBmb3IoaSA9IG07IGkgPCB0aGlzLnQ7ICsraSkgcltpXSA9IG9wKHRoaXNbaV0sZik7XG4gICAgICAgIHIudCA9IHRoaXMudDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBmID0gdGhpcy5zJnRoaXMuRE07XG4gICAgICAgIGZvcihpID0gbTsgaSA8IGEudDsgKytpKSByW2ldID0gb3AoZixhW2ldKTtcbiAgICAgICAgci50ID0gYS50O1xuICAgICAgfVxuICAgICAgci5zID0gb3AodGhpcy5zLGEucyk7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAmIGFcbiAgICBmdW5jdGlvbiBvcF9hbmQoeCx5KSB7IHJldHVybiB4Jnk7IH1cbiAgICBmdW5jdGlvbiBibkFuZChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfYW5kLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyB8IGFcbiAgICBmdW5jdGlvbiBvcF9vcih4LHkpIHsgcmV0dXJuIHh8eTsgfVxuICAgIGZ1bmN0aW9uIGJuT3IoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmJpdHdpc2VUbyhhLG9wX29yLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyBeIGFcbiAgICBmdW5jdGlvbiBvcF94b3IoeCx5KSB7IHJldHVybiB4Xnk7IH1cbiAgICBmdW5jdGlvbiBiblhvcihhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfeG9yLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAmIH5hXG4gICAgZnVuY3Rpb24gb3BfYW5kbm90KHgseSkgeyByZXR1cm4geCZ+eTsgfVxuICAgIGZ1bmN0aW9uIGJuQW5kTm90KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5iaXR3aXNlVG8oYSxvcF9hbmRub3Qscik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB+dGhpc1xuICAgIGZ1bmN0aW9uIGJuTm90KCkge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnQ7ICsraSkgcltpXSA9IHRoaXMuRE0mfnRoaXNbaV07XG4gICAgICByLnQgPSB0aGlzLnQ7XG4gICAgICByLnMgPSB+dGhpcy5zO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyA8PCBuXG4gICAgZnVuY3Rpb24gYm5TaGlmdExlZnQobikge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIGlmKG4gPCAwKSB0aGlzLnJTaGlmdFRvKC1uLHIpOyBlbHNlIHRoaXMubFNoaWZ0VG8obixyKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgPj4gblxuICAgIGZ1bmN0aW9uIGJuU2hpZnRSaWdodChuKSB7XG4gICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgaWYobiA8IDApIHRoaXMubFNoaWZ0VG8oLW4scik7IGVsc2UgdGhpcy5yU2hpZnRUbyhuLHIpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGluZGV4IG9mIGxvd2VzdCAxLWJpdCBpbiB4LCB4IDwgMl4zMVxuICAgIGZ1bmN0aW9uIGxiaXQoeCkge1xuICAgICAgaWYoeCA9PSAwKSByZXR1cm4gLTE7XG4gICAgICB2YXIgciA9IDA7XG4gICAgICBpZigoeCYweGZmZmYpID09IDApIHsgeCA+Pj0gMTY7IHIgKz0gMTY7IH1cbiAgICAgIGlmKCh4JjB4ZmYpID09IDApIHsgeCA+Pj0gODsgciArPSA4OyB9XG4gICAgICBpZigoeCYweGYpID09IDApIHsgeCA+Pj0gNDsgciArPSA0OyB9XG4gICAgICBpZigoeCYzKSA9PSAwKSB7IHggPj49IDI7IHIgKz0gMjsgfVxuICAgICAgaWYoKHgmMSkgPT0gMCkgKytyO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJucyBpbmRleCBvZiBsb3dlc3QgMS1iaXQgKG9yIC0xIGlmIG5vbmUpXG4gICAgZnVuY3Rpb24gYm5HZXRMb3dlc3RTZXRCaXQoKSB7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy50OyArK2kpXG4gICAgICAgIGlmKHRoaXNbaV0gIT0gMCkgcmV0dXJuIGkqdGhpcy5EQitsYml0KHRoaXNbaV0pO1xuICAgICAgaWYodGhpcy5zIDwgMCkgcmV0dXJuIHRoaXMudCp0aGlzLkRCO1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8vIHJldHVybiBudW1iZXIgb2YgMSBiaXRzIGluIHhcbiAgICBmdW5jdGlvbiBjYml0KHgpIHtcbiAgICAgIHZhciByID0gMDtcbiAgICAgIHdoaWxlKHggIT0gMCkgeyB4ICY9IHgtMTsgKytyOyB9XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gbnVtYmVyIG9mIHNldCBiaXRzXG4gICAgZnVuY3Rpb24gYm5CaXRDb3VudCgpIHtcbiAgICAgIHZhciByID0gMCwgeCA9IHRoaXMucyZ0aGlzLkRNO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMudDsgKytpKSByICs9IGNiaXQodGhpc1tpXV54KTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRydWUgaWZmIG50aCBiaXQgaXMgc2V0XG4gICAgZnVuY3Rpb24gYm5UZXN0Qml0KG4pIHtcbiAgICAgIHZhciBqID0gTWF0aC5mbG9vcihuL3RoaXMuREIpO1xuICAgICAgaWYoaiA+PSB0aGlzLnQpIHJldHVybih0aGlzLnMhPTApO1xuICAgICAgcmV0dXJuKCh0aGlzW2pdJigxPDwobiV0aGlzLkRCKSkpIT0wKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0aGlzIG9wICgxPDxuKVxuICAgIGZ1bmN0aW9uIGJucENoYW5nZUJpdChuLG9wKSB7XG4gICAgICB2YXIgciA9IEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChuKTtcbiAgICAgIHRoaXMuYml0d2lzZVRvKHIsb3Ascik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzIHwgKDE8PG4pXG4gICAgZnVuY3Rpb24gYm5TZXRCaXQobikgeyByZXR1cm4gdGhpcy5jaGFuZ2VCaXQobixvcF9vcik7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgJiB+KDE8PG4pXG4gICAgZnVuY3Rpb24gYm5DbGVhckJpdChuKSB7IHJldHVybiB0aGlzLmNoYW5nZUJpdChuLG9wX2FuZG5vdCk7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgXiAoMTw8bilcbiAgICBmdW5jdGlvbiBibkZsaXBCaXQobikgeyByZXR1cm4gdGhpcy5jaGFuZ2VCaXQobixvcF94b3IpOyB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyArIGFcbiAgICBmdW5jdGlvbiBibnBBZGRUbyhhLHIpIHtcbiAgICAgIHZhciBpID0gMCwgYyA9IDAsIG0gPSBNYXRoLm1pbihhLnQsdGhpcy50KTtcbiAgICAgIHdoaWxlKGkgPCBtKSB7XG4gICAgICAgIGMgKz0gdGhpc1tpXSthW2ldO1xuICAgICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICB9XG4gICAgICBpZihhLnQgPCB0aGlzLnQpIHtcbiAgICAgICAgYyArPSBhLnM7XG4gICAgICAgIHdoaWxlKGkgPCB0aGlzLnQpIHtcbiAgICAgICAgICBjICs9IHRoaXNbaV07XG4gICAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICAgIH1cbiAgICAgICAgYyArPSB0aGlzLnM7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgYyArPSB0aGlzLnM7XG4gICAgICAgIHdoaWxlKGkgPCBhLnQpIHtcbiAgICAgICAgICBjICs9IGFbaV07XG4gICAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICAgIH1cbiAgICAgICAgYyArPSBhLnM7XG4gICAgICB9XG4gICAgICByLnMgPSAoYzwwKT8tMTowO1xuICAgICAgaWYoYyA+IDApIHJbaSsrXSA9IGM7XG4gICAgICBlbHNlIGlmKGMgPCAtMSkgcltpKytdID0gdGhpcy5EVitjO1xuICAgICAgci50ID0gaTtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzICsgYVxuICAgIGZ1bmN0aW9uIGJuQWRkKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5hZGRUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAtIGFcbiAgICBmdW5jdGlvbiBiblN1YnRyYWN0KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5zdWJUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAqIGFcbiAgICBmdW5jdGlvbiBibk11bHRpcGx5KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5tdWx0aXBseVRvKGEscik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzXjJcbiAgICBmdW5jdGlvbiBiblNxdWFyZSgpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5zcXVhcmVUbyhyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgLyBhXG4gICAgZnVuY3Rpb24gYm5EaXZpZGUoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmRpdlJlbVRvKGEscixudWxsKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgJSBhXG4gICAgZnVuY3Rpb24gYm5SZW1haW5kZXIoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmRpdlJlbVRvKGEsbnVsbCxyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIFt0aGlzL2EsdGhpcyVhXVxuICAgIGZ1bmN0aW9uIGJuRGl2aWRlQW5kUmVtYWluZGVyKGEpIHtcbiAgICAgIHZhciBxID0gbmJpKCksIHIgPSBuYmkoKTtcbiAgICAgIHRoaXMuZGl2UmVtVG8oYSxxLHIpO1xuICAgICAgcmV0dXJuIG5ldyBBcnJheShxLHIpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXMgKj0gbiwgdGhpcyA+PSAwLCAxIDwgbiA8IERWXG4gICAgZnVuY3Rpb24gYm5wRE11bHRpcGx5KG4pIHtcbiAgICAgIHRoaXNbdGhpcy50XSA9IHRoaXMuYW0oMCxuLTEsdGhpcywwLDAsdGhpcy50KTtcbiAgICAgICsrdGhpcy50O1xuICAgICAgdGhpcy5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXMgKz0gbiA8PCB3IHdvcmRzLCB0aGlzID49IDBcbiAgICBmdW5jdGlvbiBibnBEQWRkT2Zmc2V0KG4sdykge1xuICAgICAgaWYobiA9PSAwKSByZXR1cm47XG4gICAgICB3aGlsZSh0aGlzLnQgPD0gdykgdGhpc1t0aGlzLnQrK10gPSAwO1xuICAgICAgdGhpc1t3XSArPSBuO1xuICAgICAgd2hpbGUodGhpc1t3XSA+PSB0aGlzLkRWKSB7XG4gICAgICAgIHRoaXNbd10gLT0gdGhpcy5EVjtcbiAgICAgICAgaWYoKyt3ID49IHRoaXMudCkgdGhpc1t0aGlzLnQrK10gPSAwO1xuICAgICAgICArK3RoaXNbd107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQSBcIm51bGxcIiByZWR1Y2VyXG4gICAgZnVuY3Rpb24gTnVsbEV4cCgpIHt9XG4gICAgZnVuY3Rpb24gbk5vcCh4KSB7IHJldHVybiB4OyB9XG4gICAgZnVuY3Rpb24gbk11bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB9XG4gICAgZnVuY3Rpb24gblNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB9XG5cbiAgICBOdWxsRXhwLnByb3RvdHlwZS5jb252ZXJ0ID0gbk5vcDtcbiAgICBOdWxsRXhwLnByb3RvdHlwZS5yZXZlcnQgPSBuTm9wO1xuICAgIE51bGxFeHAucHJvdG90eXBlLm11bFRvID0gbk11bFRvO1xuICAgIE51bGxFeHAucHJvdG90eXBlLnNxclRvID0gblNxclRvO1xuXG4gICAgLy8gKHB1YmxpYykgdGhpc15lXG4gICAgZnVuY3Rpb24gYm5Qb3coZSkgeyByZXR1cm4gdGhpcy5leHAoZSxuZXcgTnVsbEV4cCgpKTsgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IGxvd2VyIG4gd29yZHMgb2YgXCJ0aGlzICogYVwiLCBhLnQgPD0gblxuICAgIC8vIFwidGhpc1wiIHNob3VsZCBiZSB0aGUgbGFyZ2VyIG9uZSBpZiBhcHByb3ByaWF0ZS5cbiAgICBmdW5jdGlvbiBibnBNdWx0aXBseUxvd2VyVG8oYSxuLHIpIHtcbiAgICAgIHZhciBpID0gTWF0aC5taW4odGhpcy50K2EudCxuKTtcbiAgICAgIHIucyA9IDA7IC8vIGFzc3VtZXMgYSx0aGlzID49IDBcbiAgICAgIHIudCA9IGk7XG4gICAgICB3aGlsZShpID4gMCkgclstLWldID0gMDtcbiAgICAgIHZhciBqO1xuICAgICAgZm9yKGogPSByLnQtdGhpcy50OyBpIDwgajsgKytpKSByW2krdGhpcy50XSA9IHRoaXMuYW0oMCxhW2ldLHIsaSwwLHRoaXMudCk7XG4gICAgICBmb3IoaiA9IE1hdGgubWluKGEudCxuKTsgaSA8IGo7ICsraSkgdGhpcy5hbSgwLGFbaV0scixpLDAsbi1pKTtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gXCJ0aGlzICogYVwiIHdpdGhvdXQgbG93ZXIgbiB3b3JkcywgbiA+IDBcbiAgICAvLyBcInRoaXNcIiBzaG91bGQgYmUgdGhlIGxhcmdlciBvbmUgaWYgYXBwcm9wcmlhdGUuXG4gICAgZnVuY3Rpb24gYm5wTXVsdGlwbHlVcHBlclRvKGEsbixyKSB7XG4gICAgICAtLW47XG4gICAgICB2YXIgaSA9IHIudCA9IHRoaXMudCthLnQtbjtcbiAgICAgIHIucyA9IDA7IC8vIGFzc3VtZXMgYSx0aGlzID49IDBcbiAgICAgIHdoaWxlKC0taSA+PSAwKSByW2ldID0gMDtcbiAgICAgIGZvcihpID0gTWF0aC5tYXgobi10aGlzLnQsMCk7IGkgPCBhLnQ7ICsraSlcbiAgICAgICAgclt0aGlzLnQraS1uXSA9IHRoaXMuYW0obi1pLGFbaV0sciwwLDAsdGhpcy50K2ktbik7XG4gICAgICByLmNsYW1wKCk7XG4gICAgICByLmRyU2hpZnRUbygxLHIpO1xuICAgIH1cblxuICAgIC8vIEJhcnJldHQgbW9kdWxhciByZWR1Y3Rpb25cbiAgICBmdW5jdGlvbiBCYXJyZXR0KG0pIHtcbiAgICAgIC8vIHNldHVwIEJhcnJldHRcbiAgICAgIHRoaXMucjIgPSBuYmkoKTtcbiAgICAgIHRoaXMucTMgPSBuYmkoKTtcbiAgICAgIEJpZ0ludGVnZXIuT05FLmRsU2hpZnRUbygyKm0udCx0aGlzLnIyKTtcbiAgICAgIHRoaXMubXUgPSB0aGlzLnIyLmRpdmlkZShtKTtcbiAgICAgIHRoaXMubSA9IG07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYmFycmV0dENvbnZlcnQoeCkge1xuICAgICAgaWYoeC5zIDwgMCB8fCB4LnQgPiAyKnRoaXMubS50KSByZXR1cm4geC5tb2QodGhpcy5tKTtcbiAgICAgIGVsc2UgaWYoeC5jb21wYXJlVG8odGhpcy5tKSA8IDApIHJldHVybiB4O1xuICAgICAgZWxzZSB7IHZhciByID0gbmJpKCk7IHguY29weVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgcmV0dXJuIHI7IH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBiYXJyZXR0UmV2ZXJ0KHgpIHsgcmV0dXJuIHg7IH1cblxuICAgIC8vIHggPSB4IG1vZCBtIChIQUMgMTQuNDIpXG4gICAgZnVuY3Rpb24gYmFycmV0dFJlZHVjZSh4KSB7XG4gICAgICB4LmRyU2hpZnRUbyh0aGlzLm0udC0xLHRoaXMucjIpO1xuICAgICAgaWYoeC50ID4gdGhpcy5tLnQrMSkgeyB4LnQgPSB0aGlzLm0udCsxOyB4LmNsYW1wKCk7IH1cbiAgICAgIHRoaXMubXUubXVsdGlwbHlVcHBlclRvKHRoaXMucjIsdGhpcy5tLnQrMSx0aGlzLnEzKTtcbiAgICAgIHRoaXMubS5tdWx0aXBseUxvd2VyVG8odGhpcy5xMyx0aGlzLm0udCsxLHRoaXMucjIpO1xuICAgICAgd2hpbGUoeC5jb21wYXJlVG8odGhpcy5yMikgPCAwKSB4LmRBZGRPZmZzZXQoMSx0aGlzLm0udCsxKTtcbiAgICAgIHguc3ViVG8odGhpcy5yMix4KTtcbiAgICAgIHdoaWxlKHguY29tcGFyZVRvKHRoaXMubSkgPj0gMCkgeC5zdWJUbyh0aGlzLm0seCk7XG4gICAgfVxuXG4gICAgLy8gciA9IHheMiBtb2QgbTsgeCAhPSByXG4gICAgZnVuY3Rpb24gYmFycmV0dFNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG4gICAgLy8gciA9IHgqeSBtb2QgbTsgeCx5ICE9IHJcbiAgICBmdW5jdGlvbiBiYXJyZXR0TXVsVG8oeCx5LHIpIHsgeC5tdWx0aXBseVRvKHkscik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbiAgICBCYXJyZXR0LnByb3RvdHlwZS5jb252ZXJ0ID0gYmFycmV0dENvbnZlcnQ7XG4gICAgQmFycmV0dC5wcm90b3R5cGUucmV2ZXJ0ID0gYmFycmV0dFJldmVydDtcbiAgICBCYXJyZXR0LnByb3RvdHlwZS5yZWR1Y2UgPSBiYXJyZXR0UmVkdWNlO1xuICAgIEJhcnJldHQucHJvdG90eXBlLm11bFRvID0gYmFycmV0dE11bFRvO1xuICAgIEJhcnJldHQucHJvdG90eXBlLnNxclRvID0gYmFycmV0dFNxclRvO1xuXG4gICAgLy8gKHB1YmxpYykgdGhpc15lICUgbSAoSEFDIDE0Ljg1KVxuICAgIGZ1bmN0aW9uIGJuTW9kUG93KGUsbSkge1xuICAgICAgdmFyIGkgPSBlLmJpdExlbmd0aCgpLCBrLCByID0gbmJ2KDEpLCB6O1xuICAgICAgaWYoaSA8PSAwKSByZXR1cm4gcjtcbiAgICAgIGVsc2UgaWYoaSA8IDE4KSBrID0gMTtcbiAgICAgIGVsc2UgaWYoaSA8IDQ4KSBrID0gMztcbiAgICAgIGVsc2UgaWYoaSA8IDE0NCkgayA9IDQ7XG4gICAgICBlbHNlIGlmKGkgPCA3NjgpIGsgPSA1O1xuICAgICAgZWxzZSBrID0gNjtcbiAgICAgIGlmKGkgPCA4KVxuICAgICAgICB6ID0gbmV3IENsYXNzaWMobSk7XG4gICAgICBlbHNlIGlmKG0uaXNFdmVuKCkpXG4gICAgICAgIHogPSBuZXcgQmFycmV0dChtKTtcbiAgICAgIGVsc2VcbiAgICAgICAgeiA9IG5ldyBNb250Z29tZXJ5KG0pO1xuXG4gICAgICAvLyBwcmVjb21wdXRhdGlvblxuICAgICAgdmFyIGcgPSBuZXcgQXJyYXkoKSwgbiA9IDMsIGsxID0gay0xLCBrbSA9ICgxPDxrKS0xO1xuICAgICAgZ1sxXSA9IHouY29udmVydCh0aGlzKTtcbiAgICAgIGlmKGsgPiAxKSB7XG4gICAgICAgIHZhciBnMiA9IG5iaSgpO1xuICAgICAgICB6LnNxclRvKGdbMV0sZzIpO1xuICAgICAgICB3aGlsZShuIDw9IGttKSB7XG4gICAgICAgICAgZ1tuXSA9IG5iaSgpO1xuICAgICAgICAgIHoubXVsVG8oZzIsZ1tuLTJdLGdbbl0pO1xuICAgICAgICAgIG4gKz0gMjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaiA9IGUudC0xLCB3LCBpczEgPSB0cnVlLCByMiA9IG5iaSgpLCB0O1xuICAgICAgaSA9IG5iaXRzKGVbal0pLTE7XG4gICAgICB3aGlsZShqID49IDApIHtcbiAgICAgICAgaWYoaSA+PSBrMSkgdyA9IChlW2pdPj4oaS1rMSkpJmttO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB3ID0gKGVbal0mKCgxPDwoaSsxKSktMSkpPDwoazEtaSk7XG4gICAgICAgICAgaWYoaiA+IDApIHcgfD0gZVtqLTFdPj4odGhpcy5EQitpLWsxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG4gPSBrO1xuICAgICAgICB3aGlsZSgodyYxKSA9PSAwKSB7IHcgPj49IDE7IC0tbjsgfVxuICAgICAgICBpZigoaSAtPSBuKSA8IDApIHsgaSArPSB0aGlzLkRCOyAtLWo7IH1cbiAgICAgICAgaWYoaXMxKSB7ICAgIC8vIHJldCA9PSAxLCBkb24ndCBib3RoZXIgc3F1YXJpbmcgb3IgbXVsdGlwbHlpbmcgaXRcbiAgICAgICAgICBnW3ddLmNvcHlUbyhyKTtcbiAgICAgICAgICBpczEgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB3aGlsZShuID4gMSkgeyB6LnNxclRvKHIscjIpOyB6LnNxclRvKHIyLHIpOyBuIC09IDI7IH1cbiAgICAgICAgICBpZihuID4gMCkgei5zcXJUbyhyLHIyKTsgZWxzZSB7IHQgPSByOyByID0gcjI7IHIyID0gdDsgfVxuICAgICAgICAgIHoubXVsVG8ocjIsZ1t3XSxyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlKGogPj0gMCAmJiAoZVtqXSYoMTw8aSkpID09IDApIHtcbiAgICAgICAgICB6LnNxclRvKHIscjIpOyB0ID0gcjsgciA9IHIyOyByMiA9IHQ7XG4gICAgICAgICAgaWYoLS1pIDwgMCkgeyBpID0gdGhpcy5EQi0xOyAtLWo7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHoucmV2ZXJ0KHIpO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIGdjZCh0aGlzLGEpIChIQUMgMTQuNTQpXG4gICAgZnVuY3Rpb24gYm5HQ0QoYSkge1xuICAgICAgdmFyIHggPSAodGhpcy5zPDApP3RoaXMubmVnYXRlKCk6dGhpcy5jbG9uZSgpO1xuICAgICAgdmFyIHkgPSAoYS5zPDApP2EubmVnYXRlKCk6YS5jbG9uZSgpO1xuICAgICAgaWYoeC5jb21wYXJlVG8oeSkgPCAwKSB7IHZhciB0ID0geDsgeCA9IHk7IHkgPSB0OyB9XG4gICAgICB2YXIgaSA9IHguZ2V0TG93ZXN0U2V0Qml0KCksIGcgPSB5LmdldExvd2VzdFNldEJpdCgpO1xuICAgICAgaWYoZyA8IDApIHJldHVybiB4O1xuICAgICAgaWYoaSA8IGcpIGcgPSBpO1xuICAgICAgaWYoZyA+IDApIHtcbiAgICAgICAgeC5yU2hpZnRUbyhnLHgpO1xuICAgICAgICB5LnJTaGlmdFRvKGcseSk7XG4gICAgICB9XG4gICAgICB3aGlsZSh4LnNpZ251bSgpID4gMCkge1xuICAgICAgICBpZigoaSA9IHguZ2V0TG93ZXN0U2V0Qml0KCkpID4gMCkgeC5yU2hpZnRUbyhpLHgpO1xuICAgICAgICBpZigoaSA9IHkuZ2V0TG93ZXN0U2V0Qml0KCkpID4gMCkgeS5yU2hpZnRUbyhpLHkpO1xuICAgICAgICBpZih4LmNvbXBhcmVUbyh5KSA+PSAwKSB7XG4gICAgICAgICAgeC5zdWJUbyh5LHgpO1xuICAgICAgICAgIHguclNoaWZ0VG8oMSx4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB5LnN1YlRvKHgseSk7XG4gICAgICAgICAgeS5yU2hpZnRUbygxLHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZihnID4gMCkgeS5sU2hpZnRUbyhnLHkpO1xuICAgICAgcmV0dXJuIHk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgdGhpcyAlIG4sIG4gPCAyXjI2XG4gICAgZnVuY3Rpb24gYm5wTW9kSW50KG4pIHtcbiAgICAgIGlmKG4gPD0gMCkgcmV0dXJuIDA7XG4gICAgICB2YXIgZCA9IHRoaXMuRFYlbiwgciA9ICh0aGlzLnM8MCk/bi0xOjA7XG4gICAgICBpZih0aGlzLnQgPiAwKVxuICAgICAgICBpZihkID09IDApIHIgPSB0aGlzWzBdJW47XG4gICAgICAgIGVsc2UgZm9yKHZhciBpID0gdGhpcy50LTE7IGkgPj0gMDsgLS1pKSByID0gKGQqcit0aGlzW2ldKSVuO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgMS90aGlzICUgbSAoSEFDIDE0LjYxKVxuICAgIGZ1bmN0aW9uIGJuTW9kSW52ZXJzZShtKSB7XG4gICAgICB2YXIgYWMgPSBtLmlzRXZlbigpO1xuICAgICAgaWYoKHRoaXMuaXNFdmVuKCkgJiYgYWMpIHx8IG0uc2lnbnVtKCkgPT0gMCkgcmV0dXJuIEJpZ0ludGVnZXIuWkVSTztcbiAgICAgIHZhciB1ID0gbS5jbG9uZSgpLCB2ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgdmFyIGEgPSBuYnYoMSksIGIgPSBuYnYoMCksIGMgPSBuYnYoMCksIGQgPSBuYnYoMSk7XG4gICAgICB3aGlsZSh1LnNpZ251bSgpICE9IDApIHtcbiAgICAgICAgd2hpbGUodS5pc0V2ZW4oKSkge1xuICAgICAgICAgIHUuclNoaWZ0VG8oMSx1KTtcbiAgICAgICAgICBpZihhYykge1xuICAgICAgICAgICAgaWYoIWEuaXNFdmVuKCkgfHwgIWIuaXNFdmVuKCkpIHsgYS5hZGRUbyh0aGlzLGEpOyBiLnN1YlRvKG0sYik7IH1cbiAgICAgICAgICAgIGEuclNoaWZ0VG8oMSxhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZighYi5pc0V2ZW4oKSkgYi5zdWJUbyhtLGIpO1xuICAgICAgICAgIGIuclNoaWZ0VG8oMSxiKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSh2LmlzRXZlbigpKSB7XG4gICAgICAgICAgdi5yU2hpZnRUbygxLHYpO1xuICAgICAgICAgIGlmKGFjKSB7XG4gICAgICAgICAgICBpZighYy5pc0V2ZW4oKSB8fCAhZC5pc0V2ZW4oKSkgeyBjLmFkZFRvKHRoaXMsYyk7IGQuc3ViVG8obSxkKTsgfVxuICAgICAgICAgICAgYy5yU2hpZnRUbygxLGMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmKCFkLmlzRXZlbigpKSBkLnN1YlRvKG0sZCk7XG4gICAgICAgICAgZC5yU2hpZnRUbygxLGQpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHUuY29tcGFyZVRvKHYpID49IDApIHtcbiAgICAgICAgICB1LnN1YlRvKHYsdSk7XG4gICAgICAgICAgaWYoYWMpIGEuc3ViVG8oYyxhKTtcbiAgICAgICAgICBiLnN1YlRvKGQsYik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdi5zdWJUbyh1LHYpO1xuICAgICAgICAgIGlmKGFjKSBjLnN1YlRvKGEsYyk7XG4gICAgICAgICAgZC5zdWJUbyhiLGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZih2LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgIT0gMCkgcmV0dXJuIEJpZ0ludGVnZXIuWkVSTztcbiAgICAgIGlmKGQuY29tcGFyZVRvKG0pID49IDApIHJldHVybiBkLnN1YnRyYWN0KG0pO1xuICAgICAgaWYoZC5zaWdudW0oKSA8IDApIGQuYWRkVG8obSxkKTsgZWxzZSByZXR1cm4gZDtcbiAgICAgIGlmKGQuc2lnbnVtKCkgPCAwKSByZXR1cm4gZC5hZGQobSk7IGVsc2UgcmV0dXJuIGQ7XG4gICAgfVxuXG4gICAgdmFyIGxvd3ByaW1lcyA9IFsyLDMsNSw3LDExLDEzLDE3LDE5LDIzLDI5LDMxLDM3LDQxLDQzLDQ3LDUzLDU5LDYxLDY3LDcxLDczLDc5LDgzLDg5LDk3LDEwMSwxMDMsMTA3LDEwOSwxMTMsMTI3LDEzMSwxMzcsMTM5LDE0OSwxNTEsMTU3LDE2MywxNjcsMTczLDE3OSwxODEsMTkxLDE5MywxOTcsMTk5LDIxMSwyMjMsMjI3LDIyOSwyMzMsMjM5LDI0MSwyNTEsMjU3LDI2MywyNjksMjcxLDI3NywyODEsMjgzLDI5MywzMDcsMzExLDMxMywzMTcsMzMxLDMzNywzNDcsMzQ5LDM1MywzNTksMzY3LDM3MywzNzksMzgzLDM4OSwzOTcsNDAxLDQwOSw0MTksNDIxLDQzMSw0MzMsNDM5LDQ0Myw0NDksNDU3LDQ2MSw0NjMsNDY3LDQ3OSw0ODcsNDkxLDQ5OSw1MDMsNTA5LDUyMSw1MjMsNTQxLDU0Nyw1NTcsNTYzLDU2OSw1NzEsNTc3LDU4Nyw1OTMsNTk5LDYwMSw2MDcsNjEzLDYxNyw2MTksNjMxLDY0MSw2NDMsNjQ3LDY1Myw2NTksNjYxLDY3Myw2NzcsNjgzLDY5MSw3MDEsNzA5LDcxOSw3MjcsNzMzLDczOSw3NDMsNzUxLDc1Nyw3NjEsNzY5LDc3Myw3ODcsNzk3LDgwOSw4MTEsODIxLDgyMyw4MjcsODI5LDgzOSw4NTMsODU3LDg1OSw4NjMsODc3LDg4MSw4ODMsODg3LDkwNyw5MTEsOTE5LDkyOSw5MzcsOTQxLDk0Nyw5NTMsOTY3LDk3MSw5NzcsOTgzLDk5MSw5OTddO1xuICAgIHZhciBscGxpbSA9ICgxPDwyNikvbG93cHJpbWVzW2xvd3ByaW1lcy5sZW5ndGgtMV07XG5cbiAgICAvLyAocHVibGljKSB0ZXN0IHByaW1hbGl0eSB3aXRoIGNlcnRhaW50eSA+PSAxLS41XnRcbiAgICBmdW5jdGlvbiBibklzUHJvYmFibGVQcmltZSh0KSB7XG4gICAgICB2YXIgaSwgeCA9IHRoaXMuYWJzKCk7XG4gICAgICBpZih4LnQgPT0gMSAmJiB4WzBdIDw9IGxvd3ByaW1lc1tsb3dwcmltZXMubGVuZ3RoLTFdKSB7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGxvd3ByaW1lcy5sZW5ndGg7ICsraSlcbiAgICAgICAgICBpZih4WzBdID09IGxvd3ByaW1lc1tpXSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmKHguaXNFdmVuKCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGkgPSAxO1xuICAgICAgd2hpbGUoaSA8IGxvd3ByaW1lcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG0gPSBsb3dwcmltZXNbaV0sIGogPSBpKzE7XG4gICAgICAgIHdoaWxlKGogPCBsb3dwcmltZXMubGVuZ3RoICYmIG0gPCBscGxpbSkgbSAqPSBsb3dwcmltZXNbaisrXTtcbiAgICAgICAgbSA9IHgubW9kSW50KG0pO1xuICAgICAgICB3aGlsZShpIDwgaikgaWYobSVsb3dwcmltZXNbaSsrXSA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4geC5taWxsZXJSYWJpbih0KTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0cnVlIGlmIHByb2JhYmx5IHByaW1lIChIQUMgNC4yNCwgTWlsbGVyLVJhYmluKVxuICAgIGZ1bmN0aW9uIGJucE1pbGxlclJhYmluKHQpIHtcbiAgICAgIHZhciBuMSA9IHRoaXMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO1xuICAgICAgdmFyIGsgPSBuMS5nZXRMb3dlc3RTZXRCaXQoKTtcbiAgICAgIGlmKGsgPD0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIHIgPSBuMS5zaGlmdFJpZ2h0KGspO1xuICAgICAgdCA9ICh0KzEpPj4xO1xuICAgICAgaWYodCA+IGxvd3ByaW1lcy5sZW5ndGgpIHQgPSBsb3dwcmltZXMubGVuZ3RoO1xuICAgICAgdmFyIGEgPSBuYmkoKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0OyArK2kpIHtcbiAgICAgICAgLy9QaWNrIGJhc2VzIGF0IHJhbmRvbSwgaW5zdGVhZCBvZiBzdGFydGluZyBhdCAyXG4gICAgICAgIGEuZnJvbUludChsb3dwcmltZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxvd3ByaW1lcy5sZW5ndGgpXSk7XG4gICAgICAgIHZhciB5ID0gYS5tb2RQb3cocix0aGlzKTtcbiAgICAgICAgaWYoeS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpICE9IDAgJiYgeS5jb21wYXJlVG8objEpICE9IDApIHtcbiAgICAgICAgICB2YXIgaiA9IDE7XG4gICAgICAgICAgd2hpbGUoaisrIDwgayAmJiB5LmNvbXBhcmVUbyhuMSkgIT0gMCkge1xuICAgICAgICAgICAgeSA9IHkubW9kUG93SW50KDIsdGhpcyk7XG4gICAgICAgICAgICBpZih5LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih5LmNvbXBhcmVUbyhuMSkgIT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBwcm90ZWN0ZWRcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jaHVua1NpemUgPSBibnBDaHVua1NpemU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUudG9SYWRpeCA9IGJucFRvUmFkaXg7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVJhZGl4ID0gYm5wRnJvbVJhZGl4O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21OdW1iZXIgPSBibnBGcm9tTnVtYmVyO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJpdHdpc2VUbyA9IGJucEJpdHdpc2VUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jaGFuZ2VCaXQgPSBibnBDaGFuZ2VCaXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYWRkVG8gPSBibnBBZGRUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kTXVsdGlwbHkgPSBibnBETXVsdGlwbHk7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZEFkZE9mZnNldCA9IGJucERBZGRPZmZzZXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlMb3dlclRvID0gYm5wTXVsdGlwbHlMb3dlclRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5VXBwZXJUbyA9IGJucE11bHRpcGx5VXBwZXJUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnQgPSBibnBNb2RJbnQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubWlsbGVyUmFiaW4gPSBibnBNaWxsZXJSYWJpbjtcblxuICAgIC8vIHB1YmxpY1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNsb25lID0gYm5DbG9uZTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pbnRWYWx1ZSA9IGJuSW50VmFsdWU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYnl0ZVZhbHVlID0gYm5CeXRlVmFsdWU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc2hvcnRWYWx1ZSA9IGJuU2hvcnRWYWx1ZTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaWdudW0gPSBiblNpZ051bTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS50b0J5dGVBcnJheSA9IGJuVG9CeXRlQXJyYXk7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZXF1YWxzID0gYm5FcXVhbHM7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubWluID0gYm5NaW47XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubWF4ID0gYm5NYXg7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYW5kID0gYm5BbmQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUub3IgPSBibk9yO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnhvciA9IGJuWG9yO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFuZE5vdCA9IGJuQW5kTm90O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm5vdCA9IGJuTm90O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0TGVmdCA9IGJuU2hpZnRMZWZ0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0UmlnaHQgPSBiblNoaWZ0UmlnaHQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZ2V0TG93ZXN0U2V0Qml0ID0gYm5HZXRMb3dlc3RTZXRCaXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYml0Q291bnQgPSBibkJpdENvdW50O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnRlc3RCaXQgPSBiblRlc3RCaXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc2V0Qml0ID0gYm5TZXRCaXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2xlYXJCaXQgPSBibkNsZWFyQml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmZsaXBCaXQgPSBibkZsaXBCaXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYWRkID0gYm5BZGQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc3VidHJhY3QgPSBiblN1YnRyYWN0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5ID0gYm5NdWx0aXBseTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGUgPSBibkRpdmlkZTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5yZW1haW5kZXIgPSBiblJlbWFpbmRlcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGVBbmRSZW1haW5kZXIgPSBibkRpdmlkZUFuZFJlbWFpbmRlcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3cgPSBibk1vZFBvdztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnZlcnNlID0gYm5Nb2RJbnZlcnNlO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnBvdyA9IGJuUG93O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmdjZCA9IGJuR0NEO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmlzUHJvYmFibGVQcmltZSA9IGJuSXNQcm9iYWJsZVByaW1lO1xuXG4gICAgLy8gSlNCTi1zcGVjaWZpYyBleHRlbnNpb25cbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmUgPSBiblNxdWFyZTtcblxuICAgIC8vIEV4cG9zZSB0aGUgQmFycmV0dCBmdW5jdGlvblxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkJhcnJldHQgPSBCYXJyZXR0XG5cbiAgICAvLyBCaWdJbnRlZ2VyIGludGVyZmFjZXMgbm90IGltcGxlbWVudGVkIGluIGpzYm46XG5cbiAgICAvLyBCaWdJbnRlZ2VyKGludCBzaWdudW0sIGJ5dGVbXSBtYWduaXR1ZGUpXG4gICAgLy8gZG91YmxlIGRvdWJsZVZhbHVlKClcbiAgICAvLyBmbG9hdCBmbG9hdFZhbHVlKClcbiAgICAvLyBpbnQgaGFzaENvZGUoKVxuICAgIC8vIGxvbmcgbG9uZ1ZhbHVlKClcbiAgICAvLyBzdGF0aWMgQmlnSW50ZWdlciB2YWx1ZU9mKGxvbmcgdmFsKVxuXG4gICAgLy8gUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgLSByZXF1aXJlcyBhIFBSTkcgYmFja2VuZCwgZS5nLiBwcm5nNC5qc1xuXG4gICAgLy8gRm9yIGJlc3QgcmVzdWx0cywgcHV0IGNvZGUgbGlrZVxuICAgIC8vIDxib2R5IG9uQ2xpY2s9J3JuZ19zZWVkX3RpbWUoKTsnIG9uS2V5UHJlc3M9J3JuZ19zZWVkX3RpbWUoKTsnPlxuICAgIC8vIGluIHlvdXIgbWFpbiBIVE1MIGRvY3VtZW50LlxuXG4gICAgdmFyIHJuZ19zdGF0ZTtcbiAgICB2YXIgcm5nX3Bvb2w7XG4gICAgdmFyIHJuZ19wcHRyO1xuXG4gICAgLy8gTWl4IGluIGEgMzItYml0IGludGVnZXIgaW50byB0aGUgcG9vbFxuICAgIGZ1bmN0aW9uIHJuZ19zZWVkX2ludCh4KSB7XG4gICAgICBybmdfcG9vbFtybmdfcHB0cisrXSBePSB4ICYgMjU1O1xuICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gXj0gKHggPj4gOCkgJiAyNTU7XG4gICAgICBybmdfcG9vbFtybmdfcHB0cisrXSBePSAoeCA+PiAxNikgJiAyNTU7XG4gICAgICBybmdfcG9vbFtybmdfcHB0cisrXSBePSAoeCA+PiAyNCkgJiAyNTU7XG4gICAgICBpZihybmdfcHB0ciA+PSBybmdfcHNpemUpIHJuZ19wcHRyIC09IHJuZ19wc2l6ZTtcbiAgICB9XG5cbiAgICAvLyBNaXggaW4gdGhlIGN1cnJlbnQgdGltZSAody9taWxsaXNlY29uZHMpIGludG8gdGhlIHBvb2xcbiAgICBmdW5jdGlvbiBybmdfc2VlZF90aW1lKCkge1xuICAgICAgcm5nX3NlZWRfaW50KG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBwb29sIHdpdGgganVuayBpZiBuZWVkZWQuXG4gICAgaWYocm5nX3Bvb2wgPT0gbnVsbCkge1xuICAgICAgcm5nX3Bvb2wgPSBuZXcgQXJyYXkoKTtcbiAgICAgIHJuZ19wcHRyID0gMDtcbiAgICAgIHZhciB0O1xuICAgICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuY3J5cHRvKSB7XG4gICAgICAgIGlmICh3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgICAgICAgIC8vIFVzZSB3ZWJjcnlwdG8gaWYgYXZhaWxhYmxlXG4gICAgICAgICAgdmFyIHVhID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICAgICAgICAgIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHVhKTtcbiAgICAgICAgICBmb3IodCA9IDA7IHQgPCAzMjsgKyt0KVxuICAgICAgICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gPSB1YVt0XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKG5hdmlnYXRvci5hcHBOYW1lID09IFwiTmV0c2NhcGVcIiAmJiBuYXZpZ2F0b3IuYXBwVmVyc2lvbiA8IFwiNVwiKSB7XG4gICAgICAgICAgLy8gRXh0cmFjdCBlbnRyb3B5ICgyNTYgYml0cykgZnJvbSBOUzQgUk5HIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHZhciB6ID0gd2luZG93LmNyeXB0by5yYW5kb20oMzIpO1xuICAgICAgICAgIGZvcih0ID0gMDsgdCA8IHoubGVuZ3RoOyArK3QpXG4gICAgICAgICAgICBybmdfcG9vbFtybmdfcHB0cisrXSA9IHouY2hhckNvZGVBdCh0KSAmIDI1NTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUocm5nX3BwdHIgPCBybmdfcHNpemUpIHsgIC8vIGV4dHJhY3Qgc29tZSByYW5kb21uZXNzIGZyb20gTWF0aC5yYW5kb20oKVxuICAgICAgICB0ID0gTWF0aC5mbG9vcig2NTUzNiAqIE1hdGgucmFuZG9tKCkpO1xuICAgICAgICBybmdfcG9vbFtybmdfcHB0cisrXSA9IHQgPj4+IDg7XG4gICAgICAgIHJuZ19wb29sW3JuZ19wcHRyKytdID0gdCAmIDI1NTtcbiAgICAgIH1cbiAgICAgIHJuZ19wcHRyID0gMDtcbiAgICAgIHJuZ19zZWVkX3RpbWUoKTtcbiAgICAgIC8vcm5nX3NlZWRfaW50KHdpbmRvdy5zY3JlZW5YKTtcbiAgICAgIC8vcm5nX3NlZWRfaW50KHdpbmRvdy5zY3JlZW5ZKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBybmdfZ2V0X2J5dGUoKSB7XG4gICAgICBpZihybmdfc3RhdGUgPT0gbnVsbCkge1xuICAgICAgICBybmdfc2VlZF90aW1lKCk7XG4gICAgICAgIHJuZ19zdGF0ZSA9IHBybmdfbmV3c3RhdGUoKTtcbiAgICAgICAgcm5nX3N0YXRlLmluaXQocm5nX3Bvb2wpO1xuICAgICAgICBmb3Iocm5nX3BwdHIgPSAwOyBybmdfcHB0ciA8IHJuZ19wb29sLmxlbmd0aDsgKytybmdfcHB0cilcbiAgICAgICAgICBybmdfcG9vbFtybmdfcHB0cl0gPSAwO1xuICAgICAgICBybmdfcHB0ciA9IDA7XG4gICAgICAgIC8vcm5nX3Bvb2wgPSBudWxsO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogYWxsb3cgcmVzZWVkaW5nIGFmdGVyIGZpcnN0IHJlcXVlc3RcbiAgICAgIHJldHVybiBybmdfc3RhdGUubmV4dCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJuZ19nZXRfYnl0ZXMoYmEpIHtcbiAgICAgIHZhciBpO1xuICAgICAgZm9yKGkgPSAwOyBpIDwgYmEubGVuZ3RoOyArK2kpIGJhW2ldID0gcm5nX2dldF9ieXRlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gU2VjdXJlUmFuZG9tKCkge31cblxuICAgIFNlY3VyZVJhbmRvbS5wcm90b3R5cGUubmV4dEJ5dGVzID0gcm5nX2dldF9ieXRlcztcblxuICAgIC8vIHBybmc0LmpzIC0gdXNlcyBBcmNmb3VyIGFzIGEgUFJOR1xuXG4gICAgZnVuY3Rpb24gQXJjZm91cigpIHtcbiAgICAgIHRoaXMuaSA9IDA7XG4gICAgICB0aGlzLmogPSAwO1xuICAgICAgdGhpcy5TID0gbmV3IEFycmF5KCk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhcmNmb3VyIGNvbnRleHQgZnJvbSBrZXksIGFuIGFycmF5IG9mIGludHMsIGVhY2ggZnJvbSBbMC4uMjU1XVxuICAgIGZ1bmN0aW9uIEFSQzRpbml0KGtleSkge1xuICAgICAgdmFyIGksIGosIHQ7XG4gICAgICBmb3IoaSA9IDA7IGkgPCAyNTY7ICsraSlcbiAgICAgICAgdGhpcy5TW2ldID0gaTtcbiAgICAgIGogPSAwO1xuICAgICAgZm9yKGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgaiA9IChqICsgdGhpcy5TW2ldICsga2V5W2kgJSBrZXkubGVuZ3RoXSkgJiAyNTU7XG4gICAgICAgIHQgPSB0aGlzLlNbaV07XG4gICAgICAgIHRoaXMuU1tpXSA9IHRoaXMuU1tqXTtcbiAgICAgICAgdGhpcy5TW2pdID0gdDtcbiAgICAgIH1cbiAgICAgIHRoaXMuaSA9IDA7XG4gICAgICB0aGlzLmogPSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEFSQzRuZXh0KCkge1xuICAgICAgdmFyIHQ7XG4gICAgICB0aGlzLmkgPSAodGhpcy5pICsgMSkgJiAyNTU7XG4gICAgICB0aGlzLmogPSAodGhpcy5qICsgdGhpcy5TW3RoaXMuaV0pICYgMjU1O1xuICAgICAgdCA9IHRoaXMuU1t0aGlzLmldO1xuICAgICAgdGhpcy5TW3RoaXMuaV0gPSB0aGlzLlNbdGhpcy5qXTtcbiAgICAgIHRoaXMuU1t0aGlzLmpdID0gdDtcbiAgICAgIHJldHVybiB0aGlzLlNbKHQgKyB0aGlzLlNbdGhpcy5pXSkgJiAyNTVdO1xuICAgIH1cblxuICAgIEFyY2ZvdXIucHJvdG90eXBlLmluaXQgPSBBUkM0aW5pdDtcbiAgICBBcmNmb3VyLnByb3RvdHlwZS5uZXh0ID0gQVJDNG5leHQ7XG5cbiAgICAvLyBQbHVnIGluIHlvdXIgUk5HIGNvbnN0cnVjdG9yIGhlcmVcbiAgICBmdW5jdGlvbiBwcm5nX25ld3N0YXRlKCkge1xuICAgICAgcmV0dXJuIG5ldyBBcmNmb3VyKCk7XG4gICAgfVxuXG4gICAgLy8gUG9vbCBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IGFuZCBncmVhdGVyIHRoYW4gMzIuXG4gICAgLy8gQW4gYXJyYXkgb2YgYnl0ZXMgdGhlIHNpemUgb2YgdGhlIHBvb2wgd2lsbCBiZSBwYXNzZWQgdG8gaW5pdCgpXG4gICAgdmFyIHJuZ19wc2l6ZSA9IDI1NjtcblxuICAgIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgICAgICAgICAgZGVmYXVsdDogQmlnSW50ZWdlcixcbiAgICAgICAgICAgIEJpZ0ludGVnZXI6IEJpZ0ludGVnZXIsXG4gICAgICAgICAgICBTZWN1cmVSYW5kb206IFNlY3VyZVJhbmRvbSxcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmpzYm4gPSB7XG4gICAgICAgICAgQmlnSW50ZWdlcjogQmlnSW50ZWdlcixcbiAgICAgICAgICBTZWN1cmVSYW5kb206IFNlY3VyZVJhbmRvbVxuICAgICAgICB9O1xuICAgIH1cblxufSkuY2FsbCh0aGlzKTtcbiIsImxldCBfZnNcbnRyeSB7XG4gIF9mcyA9IHJlcXVpcmUoJ2dyYWNlZnVsLWZzJylcbn0gY2F0Y2ggKF8pIHtcbiAgX2ZzID0gcmVxdWlyZSgnZnMnKVxufVxuY29uc3QgdW5pdmVyc2FsaWZ5ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JylcbmNvbnN0IHsgc3RyaW5naWZ5LCBzdHJpcEJvbSB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5cbmFzeW5jIGZ1bmN0aW9uIF9yZWFkRmlsZSAoZmlsZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zID0geyBlbmNvZGluZzogb3B0aW9ucyB9XG4gIH1cblxuICBjb25zdCBmcyA9IG9wdGlvbnMuZnMgfHwgX2ZzXG5cbiAgY29uc3Qgc2hvdWxkVGhyb3cgPSAndGhyb3dzJyBpbiBvcHRpb25zID8gb3B0aW9ucy50aHJvd3MgOiB0cnVlXG5cbiAgbGV0IGRhdGEgPSBhd2FpdCB1bml2ZXJzYWxpZnkuZnJvbUNhbGxiYWNrKGZzLnJlYWRGaWxlKShmaWxlLCBvcHRpb25zKVxuXG4gIGRhdGEgPSBzdHJpcEJvbShkYXRhKVxuXG4gIGxldCBvYmpcbiAgdHJ5IHtcbiAgICBvYmogPSBKU09OLnBhcnNlKGRhdGEsIG9wdGlvbnMgPyBvcHRpb25zLnJldml2ZXIgOiBudWxsKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoc2hvdWxkVGhyb3cpIHtcbiAgICAgIGVyci5tZXNzYWdlID0gYCR7ZmlsZX06ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgdGhyb3cgZXJyXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG5jb25zdCByZWFkRmlsZSA9IHVuaXZlcnNhbGlmeS5mcm9tUHJvbWlzZShfcmVhZEZpbGUpXG5cbmZ1bmN0aW9uIHJlYWRGaWxlU3luYyAoZmlsZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zID0geyBlbmNvZGluZzogb3B0aW9ucyB9XG4gIH1cblxuICBjb25zdCBmcyA9IG9wdGlvbnMuZnMgfHwgX2ZzXG5cbiAgY29uc3Qgc2hvdWxkVGhyb3cgPSAndGhyb3dzJyBpbiBvcHRpb25zID8gb3B0aW9ucy50aHJvd3MgOiB0cnVlXG5cbiAgdHJ5IHtcbiAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCBvcHRpb25zKVxuICAgIGNvbnRlbnQgPSBzdHJpcEJvbShjb250ZW50KVxuICAgIHJldHVybiBKU09OLnBhcnNlKGNvbnRlbnQsIG9wdGlvbnMucmV2aXZlcilcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGAke2ZpbGV9OiAke2Vyci5tZXNzYWdlfWBcbiAgICAgIHRocm93IGVyclxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfd3JpdGVGaWxlIChmaWxlLCBvYmosIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBmcyA9IG9wdGlvbnMuZnMgfHwgX2ZzXG5cbiAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KG9iaiwgb3B0aW9ucylcblxuICBhd2FpdCB1bml2ZXJzYWxpZnkuZnJvbUNhbGxiYWNrKGZzLndyaXRlRmlsZSkoZmlsZSwgc3RyLCBvcHRpb25zKVxufVxuXG5jb25zdCB3cml0ZUZpbGUgPSB1bml2ZXJzYWxpZnkuZnJvbVByb21pc2UoX3dyaXRlRmlsZSlcblxuZnVuY3Rpb24gd3JpdGVGaWxlU3luYyAoZmlsZSwgb2JqLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgZnMgPSBvcHRpb25zLmZzIHx8IF9mc1xuXG4gIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShvYmosIG9wdGlvbnMpXG4gIC8vIG5vdCBzdXJlIGlmIGZzLndyaXRlRmlsZVN5bmMgcmV0dXJucyBhbnl0aGluZywgYnV0IGp1c3QgaW4gY2FzZVxuICByZXR1cm4gZnMud3JpdGVGaWxlU3luYyhmaWxlLCBzdHIsIG9wdGlvbnMpXG59XG5cbmNvbnN0IGpzb25maWxlID0ge1xuICByZWFkRmlsZSxcbiAgcmVhZEZpbGVTeW5jLFxuICB3cml0ZUZpbGUsXG4gIHdyaXRlRmlsZVN5bmNcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBqc29uZmlsZVxuIiwiZnVuY3Rpb24gc3RyaW5naWZ5IChvYmosIHsgRU9MID0gJ1xcbicsIGZpbmFsRU9MID0gdHJ1ZSwgcmVwbGFjZXIgPSBudWxsLCBzcGFjZXMgfSA9IHt9KSB7XG4gIGNvbnN0IEVPRiA9IGZpbmFsRU9MID8gRU9MIDogJydcbiAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkob2JqLCByZXBsYWNlciwgc3BhY2VzKVxuXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxuL2csIEVPTCkgKyBFT0Zcbn1cblxuZnVuY3Rpb24gc3RyaXBCb20gKGNvbnRlbnQpIHtcbiAgLy8gd2UgZG8gdGhpcyBiZWNhdXNlIEpTT04ucGFyc2Ugd291bGQgY29udmVydCBpdCB0byBhIHV0Zjggc3RyaW5nIGlmIGVuY29kaW5nIHdhc24ndCBzcGVjaWZpZWRcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250ZW50KSkgY29udGVudCA9IGNvbnRlbnQudG9TdHJpbmcoJ3V0ZjgnKVxuICByZXR1cm4gY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgc3RyaW5naWZ5LCBzdHJpcEJvbSB9XG4iLCIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICd3ZWVrcyc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndyc6XG4gICAgICByZXR1cm4gbiAqIHc7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gIH1cbiAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBOZXRtYXNrLCBhdG9iLCBjaHIsIGNocjAsIGNockEsIGNocmEsIGlwMmxvbmcsIGxvbmcyaXA7XG5cbiAgbG9uZzJpcCA9IGZ1bmN0aW9uKGxvbmcpIHtcbiAgICB2YXIgYSwgYiwgYywgZDtcbiAgICBhID0gKGxvbmcgJiAoMHhmZiA8PCAyNCkpID4+PiAyNDtcbiAgICBiID0gKGxvbmcgJiAoMHhmZiA8PCAxNikpID4+PiAxNjtcbiAgICBjID0gKGxvbmcgJiAoMHhmZiA8PCA4KSkgPj4+IDg7XG4gICAgZCA9IGxvbmcgJiAweGZmO1xuICAgIHJldHVybiBbYSwgYiwgYywgZF0uam9pbignLicpO1xuICB9O1xuXG4gIGlwMmxvbmcgPSBmdW5jdGlvbihpcCkge1xuICAgIHZhciBiLCBjLCBpLCBqLCBuLCByZWY7XG4gICAgYiA9IFtdO1xuICAgIGZvciAoaSA9IGogPSAwOyBqIDw9IDM7IGkgPSArK2opIHtcbiAgICAgIGlmIChpcC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgaWYgKGlwWzBdICE9PSAnLicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVAnKTtcbiAgICAgICAgfVxuICAgICAgICBpcCA9IGlwLnN1YnN0cmluZygxKTtcbiAgICAgIH1cbiAgICAgIHJlZiA9IGF0b2IoaXApLCBuID0gcmVmWzBdLCBjID0gcmVmWzFdO1xuICAgICAgaXAgPSBpcC5zdWJzdHJpbmcoYyk7XG4gICAgICBiLnB1c2gobik7XG4gICAgfVxuICAgIGlmIChpcC5sZW5ndGggIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBJUCcpO1xuICAgIH1cbiAgICBzd2l0Y2ggKGIubGVuZ3RoKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGlmIChiWzBdID4gMHhGRkZGRkZGRikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBJUCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiWzBdID4+PiAwO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBpZiAoYlswXSA+IDB4RkYgfHwgYlsxXSA+IDB4RkZGRkZGKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElQJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChiWzBdIDw8IDI0IHwgYlsxXSkgPj4+IDA7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGlmIChiWzBdID4gMHhGRiB8fCBiWzFdID4gMHhGRiB8fCBiWzJdID4gMHhGRkZGKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElQJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChiWzBdIDw8IDI0IHwgYlsxXSA8PCAxNiB8IGJbMl0pID4+PiAwO1xuICAgICAgY2FzZSA0OlxuICAgICAgICBpZiAoYlswXSA+IDB4RkYgfHwgYlsxXSA+IDB4RkYgfHwgYlsyXSA+IDB4RkYgfHwgYlszXSA+IDB4RkYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGJbMF0gPDwgMjQgfCBiWzFdIDw8IDE2IHwgYlsyXSA8PCA4IHwgYlszXSkgPj4+IDA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVAnKTtcbiAgICB9XG4gIH07XG5cbiAgY2hyID0gZnVuY3Rpb24oYikge1xuICAgIHJldHVybiBiLmNoYXJDb2RlQXQoMCk7XG4gIH07XG5cbiAgY2hyMCA9IGNocignMCcpO1xuXG4gIGNocmEgPSBjaHIoJ2EnKTtcblxuICBjaHJBID0gY2hyKCdBJyk7XG5cbiAgYXRvYiA9IGZ1bmN0aW9uKHMpIHtcbiAgICB2YXIgYmFzZSwgZG1heCwgaSwgbiwgc3RhcnQ7XG4gICAgbiA9IDA7XG4gICAgYmFzZSA9IDEwO1xuICAgIGRtYXggPSAnOSc7XG4gICAgaSA9IDA7XG4gICAgaWYgKHMubGVuZ3RoID4gMSAmJiBzW2ldID09PSAnMCcpIHtcbiAgICAgIGlmIChzW2kgKyAxXSA9PT0gJ3gnIHx8IHNbaSArIDFdID09PSAnWCcpIHtcbiAgICAgICAgaSArPSAyO1xuICAgICAgICBiYXNlID0gMTY7XG4gICAgICB9IGVsc2UgaWYgKCcwJyA8PSBzW2kgKyAxXSAmJiBzW2kgKyAxXSA8PSAnOScpIHtcbiAgICAgICAgaSsrO1xuICAgICAgICBiYXNlID0gODtcbiAgICAgICAgZG1heCA9ICc3JztcbiAgICAgIH1cbiAgICB9XG4gICAgc3RhcnQgPSBpO1xuICAgIHdoaWxlIChpIDwgcy5sZW5ndGgpIHtcbiAgICAgIGlmICgnMCcgPD0gc1tpXSAmJiBzW2ldIDw9IGRtYXgpIHtcbiAgICAgICAgbiA9IChuICogYmFzZSArIChjaHIoc1tpXSkgLSBjaHIwKSkgPj4+IDA7XG4gICAgICB9IGVsc2UgaWYgKGJhc2UgPT09IDE2KSB7XG4gICAgICAgIGlmICgnYScgPD0gc1tpXSAmJiBzW2ldIDw9ICdmJykge1xuICAgICAgICAgIG4gPSAobiAqIGJhc2UgKyAoMTAgKyBjaHIoc1tpXSkgLSBjaHJhKSkgPj4+IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoJ0EnIDw9IHNbaV0gJiYgc1tpXSA8PSAnRicpIHtcbiAgICAgICAgICBuID0gKG4gKiBiYXNlICsgKDEwICsgY2hyKHNbaV0pIC0gY2hyQSkpID4+PiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChuID4gMHhGRkZGRkZGRikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RvbyBsYXJnZScpO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgICBpZiAoaSA9PT0gc3RhcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgb2N0ZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIFtuLCBpXTtcbiAgfTtcblxuICBOZXRtYXNrID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIE5ldG1hc2sobmV0LCBtYXNrKSB7XG4gICAgICB2YXIgZXJyb3IsIGksIGosIHJlZjtcbiAgICAgIGlmICh0eXBlb2YgbmV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGBuZXQnIHBhcmFtZXRlclwiKTtcbiAgICAgIH1cbiAgICAgIGlmICghbWFzaykge1xuICAgICAgICByZWYgPSBuZXQuc3BsaXQoJy8nLCAyKSwgbmV0ID0gcmVmWzBdLCBtYXNrID0gcmVmWzFdO1xuICAgICAgfVxuICAgICAgaWYgKCFtYXNrKSB7XG4gICAgICAgIG1hc2sgPSAzMjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbWFzayA9PT0gJ3N0cmluZycgJiYgbWFzay5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMubWFza0xvbmcgPSBpcDJsb25nKG1hc2spO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG1hc2s6IFwiICsgbWFzayk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gaiA9IDMyOyBqID49IDA7IGkgPSAtLWopIHtcbiAgICAgICAgICBpZiAodGhpcy5tYXNrTG9uZyA9PT0gKDB4ZmZmZmZmZmYgPDwgKDMyIC0gaSkpID4+PiAwKSB7XG4gICAgICAgICAgICB0aGlzLmJpdG1hc2sgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1hc2sgfHwgbWFzayA9PT0gMCkge1xuICAgICAgICB0aGlzLmJpdG1hc2sgPSBwYXJzZUludChtYXNrLCAxMCk7XG4gICAgICAgIHRoaXMubWFza0xvbmcgPSAwO1xuICAgICAgICBpZiAodGhpcy5iaXRtYXNrID4gMCkge1xuICAgICAgICAgIHRoaXMubWFza0xvbmcgPSAoMHhmZmZmZmZmZiA8PCAoMzIgLSB0aGlzLmJpdG1hc2spKSA+Pj4gMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBtYXNrOiBlbXB0eVwiKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMubmV0TG9uZyA9IChpcDJsb25nKG5ldCkgJiB0aGlzLm1hc2tMb25nKSA+Pj4gMDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBuZXQgYWRkcmVzczogXCIgKyBuZXQpO1xuICAgICAgfVxuICAgICAgaWYgKCEodGhpcy5iaXRtYXNrIDw9IDMyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG1hc2sgZm9yIGlwNDogXCIgKyBtYXNrKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2l6ZSA9IE1hdGgucG93KDIsIDMyIC0gdGhpcy5iaXRtYXNrKTtcbiAgICAgIHRoaXMuYmFzZSA9IGxvbmcyaXAodGhpcy5uZXRMb25nKTtcbiAgICAgIHRoaXMubWFzayA9IGxvbmcyaXAodGhpcy5tYXNrTG9uZyk7XG4gICAgICB0aGlzLmhvc3RtYXNrID0gbG9uZzJpcCh+dGhpcy5tYXNrTG9uZyk7XG4gICAgICB0aGlzLmZpcnN0ID0gdGhpcy5iaXRtYXNrIDw9IDMwID8gbG9uZzJpcCh0aGlzLm5ldExvbmcgKyAxKSA6IHRoaXMuYmFzZTtcbiAgICAgIHRoaXMubGFzdCA9IHRoaXMuYml0bWFzayA8PSAzMCA/IGxvbmcyaXAodGhpcy5uZXRMb25nICsgdGhpcy5zaXplIC0gMikgOiBsb25nMmlwKHRoaXMubmV0TG9uZyArIHRoaXMuc2l6ZSAtIDEpO1xuICAgICAgdGhpcy5icm9hZGNhc3QgPSB0aGlzLmJpdG1hc2sgPD0gMzAgPyBsb25nMmlwKHRoaXMubmV0TG9uZyArIHRoaXMuc2l6ZSAtIDEpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIE5ldG1hc2sucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24oaXApIHtcbiAgICAgIGlmICh0eXBlb2YgaXAgPT09ICdzdHJpbmcnICYmIChpcC5pbmRleE9mKCcvJykgPiAwIHx8IGlwLnNwbGl0KCcuJykubGVuZ3RoICE9PSA0KSkge1xuICAgICAgICBpcCA9IG5ldyBOZXRtYXNrKGlwKTtcbiAgICAgIH1cbiAgICAgIGlmIChpcCBpbnN0YW5jZW9mIE5ldG1hc2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbnMoaXAuYmFzZSkgJiYgdGhpcy5jb250YWlucyhpcC5icm9hZGNhc3QgfHwgaXAubGFzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKGlwMmxvbmcoaXApICYgdGhpcy5tYXNrTG9uZykgPj4+IDAgPT09ICh0aGlzLm5ldExvbmcgJiB0aGlzLm1hc2tMb25nKSA+Pj4gMDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgTmV0bWFzay5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgICBpZiAoY291bnQgPT0gbnVsbCkge1xuICAgICAgICBjb3VudCA9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IE5ldG1hc2sobG9uZzJpcCh0aGlzLm5ldExvbmcgKyAodGhpcy5zaXplICogY291bnQpKSwgdGhpcy5tYXNrKTtcbiAgICB9O1xuXG4gICAgTmV0bWFzay5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICB2YXIgaW5kZXgsIGxhc3RMb25nLCBsb25nO1xuICAgICAgbG9uZyA9IGlwMmxvbmcodGhpcy5maXJzdCk7XG4gICAgICBsYXN0TG9uZyA9IGlwMmxvbmcodGhpcy5sYXN0KTtcbiAgICAgIGluZGV4ID0gMDtcbiAgICAgIHdoaWxlIChsb25nIDw9IGxhc3RMb25nKSB7XG4gICAgICAgIGZuKGxvbmcyaXAobG9uZyksIGxvbmcsIGluZGV4KTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgbG9uZysrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBOZXRtYXNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYmFzZSArIFwiL1wiICsgdGhpcy5iaXRtYXNrO1xuICAgIH07XG5cbiAgICByZXR1cm4gTmV0bWFzaztcblxuICB9KSgpO1xuXG4gIGV4cG9ydHMuaXAybG9uZyA9IGlwMmxvbmc7XG5cbiAgZXhwb3J0cy5sb25nMmlwID0gbG9uZzJpcDtcblxuICBleHBvcnRzLk5ldG1hc2sgPSBOZXRtYXNrO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiY29uc3QgcnVudGltZVJlcXVpcmUgPSB0eXBlb2YgX193ZWJwYWNrX3JlcXVpcmVfXyA9PT0gJ2Z1bmN0aW9uJyA/IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fIDogcmVxdWlyZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5pZiAodHlwZW9mIHJ1bnRpbWVSZXF1aXJlLmFkZG9uID09PSAnZnVuY3Rpb24nKSB7IC8vIGlmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyBuYXRpdmUgcmVzb2x2aW5nIHByZWZlciB0aGF0XG4gIG1vZHVsZS5leHBvcnRzID0gcnVudGltZVJlcXVpcmUuYWRkb24uYmluZChydW50aW1lUmVxdWlyZSlcbn0gZWxzZSB7IC8vIGVsc2UgdXNlIHRoZSBydW50aW1lIHZlcnNpb24gaGVyZVxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbm9kZS1neXAtYnVpbGQuanMnKVxufVxuIiwidmFyIGZzID0gcmVxdWlyZSgnZnMnKVxudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJylcbnZhciBvcyA9IHJlcXVpcmUoJ29zJylcblxuLy8gV29ya2Fyb3VuZCB0byBmaXggd2VicGFjaydzIGJ1aWxkIHdhcm5pbmdzOiAndGhlIHJlcXVlc3Qgb2YgYSBkZXBlbmRlbmN5IGlzIGFuIGV4cHJlc3Npb24nXG52YXIgcnVudGltZVJlcXVpcmUgPSB0eXBlb2YgX193ZWJwYWNrX3JlcXVpcmVfXyA9PT0gJ2Z1bmN0aW9uJyA/IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fIDogcmVxdWlyZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbnZhciB2YXJzID0gKHByb2Nlc3MuY29uZmlnICYmIHByb2Nlc3MuY29uZmlnLnZhcmlhYmxlcykgfHwge31cbnZhciBwcmVidWlsZHNPbmx5ID0gISFwcm9jZXNzLmVudi5QUkVCVUlMRFNfT05MWVxudmFyIGFiaSA9IHByb2Nlc3MudmVyc2lvbnMubW9kdWxlcyAvLyBUT0RPOiBzdXBwb3J0IG9sZCBub2RlIHdoZXJlIHRoaXMgaXMgdW5kZWZcbnZhciBydW50aW1lID0gaXNFbGVjdHJvbigpID8gJ2VsZWN0cm9uJyA6IChpc053anMoKSA/ICdub2RlLXdlYmtpdCcgOiAnbm9kZScpXG5cbnZhciBhcmNoID0gcHJvY2Vzcy5lbnYubnBtX2NvbmZpZ19hcmNoIHx8IG9zLmFyY2goKVxudmFyIHBsYXRmb3JtID0gcHJvY2Vzcy5lbnYubnBtX2NvbmZpZ19wbGF0Zm9ybSB8fCBvcy5wbGF0Zm9ybSgpXG52YXIgbGliYyA9IHByb2Nlc3MuZW52LkxJQkMgfHwgKGlzQWxwaW5lKHBsYXRmb3JtKSA/ICdtdXNsJyA6ICdnbGliYycpXG52YXIgYXJtdiA9IHByb2Nlc3MuZW52LkFSTV9WRVJTSU9OIHx8IChhcmNoID09PSAnYXJtNjQnID8gJzgnIDogdmFycy5hcm1fdmVyc2lvbikgfHwgJydcbnZhciB1diA9IChwcm9jZXNzLnZlcnNpb25zLnV2IHx8ICcnKS5zcGxpdCgnLicpWzBdXG5cbm1vZHVsZS5leHBvcnRzID0gbG9hZFxuXG5mdW5jdGlvbiBsb2FkIChkaXIpIHtcbiAgcmV0dXJuIHJ1bnRpbWVSZXF1aXJlKGxvYWQucmVzb2x2ZShkaXIpKVxufVxuXG5sb2FkLnJlc29sdmUgPSBsb2FkLnBhdGggPSBmdW5jdGlvbiAoZGlyKSB7XG4gIGRpciA9IHBhdGgucmVzb2x2ZShkaXIgfHwgJy4nKVxuXG4gIHRyeSB7XG4gICAgdmFyIG5hbWUgPSBydW50aW1lUmVxdWlyZShwYXRoLmpvaW4oZGlyLCAncGFja2FnZS5qc29uJykpLm5hbWUudG9VcHBlckNhc2UoKS5yZXBsYWNlKC8tL2csICdfJylcbiAgICBpZiAocHJvY2Vzcy5lbnZbbmFtZSArICdfUFJFQlVJTEQnXSkgZGlyID0gcHJvY2Vzcy5lbnZbbmFtZSArICdfUFJFQlVJTEQnXVxuICB9IGNhdGNoIChlcnIpIHt9XG5cbiAgaWYgKCFwcmVidWlsZHNPbmx5KSB7XG4gICAgdmFyIHJlbGVhc2UgPSBnZXRGaXJzdChwYXRoLmpvaW4oZGlyLCAnYnVpbGQvUmVsZWFzZScpLCBtYXRjaEJ1aWxkKVxuICAgIGlmIChyZWxlYXNlKSByZXR1cm4gcmVsZWFzZVxuXG4gICAgdmFyIGRlYnVnID0gZ2V0Rmlyc3QocGF0aC5qb2luKGRpciwgJ2J1aWxkL0RlYnVnJyksIG1hdGNoQnVpbGQpXG4gICAgaWYgKGRlYnVnKSByZXR1cm4gZGVidWdcbiAgfVxuXG4gIHZhciBwcmVidWlsZCA9IHJlc29sdmUoZGlyKVxuICBpZiAocHJlYnVpbGQpIHJldHVybiBwcmVidWlsZFxuXG4gIHZhciBuZWFyYnkgPSByZXNvbHZlKHBhdGguZGlybmFtZShwcm9jZXNzLmV4ZWNQYXRoKSlcbiAgaWYgKG5lYXJieSkgcmV0dXJuIG5lYXJieVxuXG4gIHZhciB0YXJnZXQgPSBbXG4gICAgJ3BsYXRmb3JtPScgKyBwbGF0Zm9ybSxcbiAgICAnYXJjaD0nICsgYXJjaCxcbiAgICAncnVudGltZT0nICsgcnVudGltZSxcbiAgICAnYWJpPScgKyBhYmksXG4gICAgJ3V2PScgKyB1dixcbiAgICBhcm12ID8gJ2FybXY9JyArIGFybXYgOiAnJyxcbiAgICAnbGliYz0nICsgbGliYyxcbiAgICAnbm9kZT0nICsgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLFxuICAgIHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24gPyAnZWxlY3Ryb249JyArIHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24gOiAnJyxcbiAgICB0eXBlb2YgX193ZWJwYWNrX3JlcXVpcmVfXyA9PT0gJ2Z1bmN0aW9uJyA/ICd3ZWJwYWNrPXRydWUnIDogJycgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJylcblxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIG5hdGl2ZSBidWlsZCB3YXMgZm91bmQgZm9yICcgKyB0YXJnZXQgKyAnXFxuICAgIGxvYWRlZCBmcm9tOiAnICsgZGlyICsgJ1xcbicpXG5cbiAgZnVuY3Rpb24gcmVzb2x2ZSAoZGlyKSB7XG4gICAgLy8gRmluZCBtYXRjaGluZyBcInByZWJ1aWxkcy88cGxhdGZvcm0+LTxhcmNoPlwiIGRpcmVjdG9yeVxuICAgIHZhciB0dXBsZXMgPSByZWFkZGlyU3luYyhwYXRoLmpvaW4oZGlyLCAncHJlYnVpbGRzJykpLm1hcChwYXJzZVR1cGxlKVxuICAgIHZhciB0dXBsZSA9IHR1cGxlcy5maWx0ZXIobWF0Y2hUdXBsZShwbGF0Zm9ybSwgYXJjaCkpLnNvcnQoY29tcGFyZVR1cGxlcylbMF1cbiAgICBpZiAoIXR1cGxlKSByZXR1cm5cblxuICAgIC8vIEZpbmQgbW9zdCBzcGVjaWZpYyBmbGF2b3IgZmlyc3RcbiAgICB2YXIgcHJlYnVpbGRzID0gcGF0aC5qb2luKGRpciwgJ3ByZWJ1aWxkcycsIHR1cGxlLm5hbWUpXG4gICAgdmFyIHBhcnNlZCA9IHJlYWRkaXJTeW5jKHByZWJ1aWxkcykubWFwKHBhcnNlVGFncylcbiAgICB2YXIgY2FuZGlkYXRlcyA9IHBhcnNlZC5maWx0ZXIobWF0Y2hUYWdzKHJ1bnRpbWUsIGFiaSkpXG4gICAgdmFyIHdpbm5lciA9IGNhbmRpZGF0ZXMuc29ydChjb21wYXJlVGFncyhydW50aW1lKSlbMF1cbiAgICBpZiAod2lubmVyKSByZXR1cm4gcGF0aC5qb2luKHByZWJ1aWxkcywgd2lubmVyLmZpbGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZGRpclN5bmMgKGRpcikge1xuICB0cnkge1xuICAgIHJldHVybiBmcy5yZWFkZGlyU3luYyhkaXIpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBbXVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEZpcnN0IChkaXIsIGZpbHRlcikge1xuICB2YXIgZmlsZXMgPSByZWFkZGlyU3luYyhkaXIpLmZpbHRlcihmaWx0ZXIpXG4gIHJldHVybiBmaWxlc1swXSAmJiBwYXRoLmpvaW4oZGlyLCBmaWxlc1swXSlcbn1cblxuZnVuY3Rpb24gbWF0Y2hCdWlsZCAobmFtZSkge1xuICByZXR1cm4gL1xcLm5vZGUkLy50ZXN0KG5hbWUpXG59XG5cbmZ1bmN0aW9uIHBhcnNlVHVwbGUgKG5hbWUpIHtcbiAgLy8gRXhhbXBsZTogZGFyd2luLXg2NCthcm02NFxuICB2YXIgYXJyID0gbmFtZS5zcGxpdCgnLScpXG4gIGlmIChhcnIubGVuZ3RoICE9PSAyKSByZXR1cm5cblxuICB2YXIgcGxhdGZvcm0gPSBhcnJbMF1cbiAgdmFyIGFyY2hpdGVjdHVyZXMgPSBhcnJbMV0uc3BsaXQoJysnKVxuXG4gIGlmICghcGxhdGZvcm0pIHJldHVyblxuICBpZiAoIWFyY2hpdGVjdHVyZXMubGVuZ3RoKSByZXR1cm5cbiAgaWYgKCFhcmNoaXRlY3R1cmVzLmV2ZXJ5KEJvb2xlYW4pKSByZXR1cm5cblxuICByZXR1cm4geyBuYW1lLCBwbGF0Zm9ybSwgYXJjaGl0ZWN0dXJlcyB9XG59XG5cbmZ1bmN0aW9uIG1hdGNoVHVwbGUgKHBsYXRmb3JtLCBhcmNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodHVwbGUpIHtcbiAgICBpZiAodHVwbGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHR1cGxlLnBsYXRmb3JtICE9PSBwbGF0Zm9ybSkgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIHR1cGxlLmFyY2hpdGVjdHVyZXMuaW5jbHVkZXMoYXJjaClcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlVHVwbGVzIChhLCBiKSB7XG4gIC8vIFByZWZlciBzaW5nbGUtYXJjaCBwcmVidWlsZHMgb3ZlciBtdWx0aS1hcmNoXG4gIHJldHVybiBhLmFyY2hpdGVjdHVyZXMubGVuZ3RoIC0gYi5hcmNoaXRlY3R1cmVzLmxlbmd0aFxufVxuXG5mdW5jdGlvbiBwYXJzZVRhZ3MgKGZpbGUpIHtcbiAgdmFyIGFyciA9IGZpbGUuc3BsaXQoJy4nKVxuICB2YXIgZXh0ZW5zaW9uID0gYXJyLnBvcCgpXG4gIHZhciB0YWdzID0geyBmaWxlOiBmaWxlLCBzcGVjaWZpY2l0eTogMCB9XG5cbiAgaWYgKGV4dGVuc2lvbiAhPT0gJ25vZGUnKSByZXR1cm5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0YWcgPSBhcnJbaV1cblxuICAgIGlmICh0YWcgPT09ICdub2RlJyB8fCB0YWcgPT09ICdlbGVjdHJvbicgfHwgdGFnID09PSAnbm9kZS13ZWJraXQnKSB7XG4gICAgICB0YWdzLnJ1bnRpbWUgPSB0YWdcbiAgICB9IGVsc2UgaWYgKHRhZyA9PT0gJ25hcGknKSB7XG4gICAgICB0YWdzLm5hcGkgPSB0cnVlXG4gICAgfSBlbHNlIGlmICh0YWcuc2xpY2UoMCwgMykgPT09ICdhYmknKSB7XG4gICAgICB0YWdzLmFiaSA9IHRhZy5zbGljZSgzKVxuICAgIH0gZWxzZSBpZiAodGFnLnNsaWNlKDAsIDIpID09PSAndXYnKSB7XG4gICAgICB0YWdzLnV2ID0gdGFnLnNsaWNlKDIpXG4gICAgfSBlbHNlIGlmICh0YWcuc2xpY2UoMCwgNCkgPT09ICdhcm12Jykge1xuICAgICAgdGFncy5hcm12ID0gdGFnLnNsaWNlKDQpXG4gICAgfSBlbHNlIGlmICh0YWcgPT09ICdnbGliYycgfHwgdGFnID09PSAnbXVzbCcpIHtcbiAgICAgIHRhZ3MubGliYyA9IHRhZ1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHRhZ3Muc3BlY2lmaWNpdHkrK1xuICB9XG5cbiAgcmV0dXJuIHRhZ3Ncbn1cblxuZnVuY3Rpb24gbWF0Y2hUYWdzIChydW50aW1lLCBhYmkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YWdzKSB7XG4gICAgaWYgKHRhZ3MgPT0gbnVsbCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHRhZ3MucnVudGltZSAmJiB0YWdzLnJ1bnRpbWUgIT09IHJ1bnRpbWUgJiYgIXJ1bnRpbWVBZ25vc3RpYyh0YWdzKSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHRhZ3MuYWJpICYmIHRhZ3MuYWJpICE9PSBhYmkgJiYgIXRhZ3MubmFwaSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHRhZ3MudXYgJiYgdGFncy51diAhPT0gdXYpIHJldHVybiBmYWxzZVxuICAgIGlmICh0YWdzLmFybXYgJiYgdGFncy5hcm12ICE9PSBhcm12KSByZXR1cm4gZmFsc2VcbiAgICBpZiAodGFncy5saWJjICYmIHRhZ3MubGliYyAhPT0gbGliYykgcmV0dXJuIGZhbHNlXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIHJ1bnRpbWVBZ25vc3RpYyAodGFncykge1xuICByZXR1cm4gdGFncy5ydW50aW1lID09PSAnbm9kZScgJiYgdGFncy5uYXBpXG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVUYWdzIChydW50aW1lKSB7XG4gIC8vIFByZWNlZGVuY2U6IG5vbi1hZ25vc3RpYyBydW50aW1lLCBhYmkgb3ZlciBuYXBpLCB0aGVuIGJ5IHNwZWNpZmljaXR5LlxuICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICBpZiAoYS5ydW50aW1lICE9PSBiLnJ1bnRpbWUpIHtcbiAgICAgIHJldHVybiBhLnJ1bnRpbWUgPT09IHJ1bnRpbWUgPyAtMSA6IDFcbiAgICB9IGVsc2UgaWYgKGEuYWJpICE9PSBiLmFiaSkge1xuICAgICAgcmV0dXJuIGEuYWJpID8gLTEgOiAxXG4gICAgfSBlbHNlIGlmIChhLnNwZWNpZmljaXR5ICE9PSBiLnNwZWNpZmljaXR5KSB7XG4gICAgICByZXR1cm4gYS5zcGVjaWZpY2l0eSA+IGIuc3BlY2lmaWNpdHkgPyAtMSA6IDFcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOd2pzICgpIHtcbiAgcmV0dXJuICEhKHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5udylcbn1cblxuZnVuY3Rpb24gaXNFbGVjdHJvbiAoKSB7XG4gIGlmIChwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24pIHJldHVybiB0cnVlXG4gIGlmIChwcm9jZXNzLmVudi5FTEVDVFJPTl9SVU5fQVNfTk9ERSkgcmV0dXJuIHRydWVcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmIHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcidcbn1cblxuZnVuY3Rpb24gaXNBbHBpbmUgKHBsYXRmb3JtKSB7XG4gIHJldHVybiBwbGF0Zm9ybSA9PT0gJ2xpbnV4JyAmJiBmcy5leGlzdHNTeW5jKCcvZXRjL2FscGluZS1yZWxlYXNlJylcbn1cblxuLy8gRXhwb3NlZCBmb3IgdW5pdCB0ZXN0c1xuLy8gVE9ETzogbW92ZSB0byBsaWJcbmxvYWQucGFyc2VUYWdzID0gcGFyc2VUYWdzXG5sb2FkLm1hdGNoVGFncyA9IG1hdGNoVGFnc1xubG9hZC5jb21wYXJlVGFncyA9IGNvbXBhcmVUYWdzXG5sb2FkLnBhcnNlVHVwbGUgPSBwYXJzZVR1cGxlXG5sb2FkLm1hdGNoVHVwbGUgPSBtYXRjaFR1cGxlXG5sb2FkLmNvbXBhcmVUdXBsZXMgPSBjb21wYXJlVHVwbGVzXG4iLCJ2YXIgd3JhcHB5ID0gcmVxdWlyZSgnd3JhcHB5Jylcbm1vZHVsZS5leHBvcnRzID0gd3JhcHB5KG9uY2UpXG5tb2R1bGUuZXhwb3J0cy5zdHJpY3QgPSB3cmFwcHkob25jZVN0cmljdClcblxub25jZS5wcm90byA9IG9uY2UoZnVuY3Rpb24gKCkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCAnb25jZScsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG9uY2UodGhpcylcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsICdvbmNlU3RyaWN0Jywge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25jZVN0cmljdCh0aGlzKVxuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG59KVxuXG5mdW5jdGlvbiBvbmNlIChmbikge1xuICB2YXIgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZi5jYWxsZWQpIHJldHVybiBmLnZhbHVlXG4gICAgZi5jYWxsZWQgPSB0cnVlXG4gICAgcmV0dXJuIGYudmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH1cbiAgZi5jYWxsZWQgPSBmYWxzZVxuICByZXR1cm4gZlxufVxuXG5mdW5jdGlvbiBvbmNlU3RyaWN0IChmbikge1xuICB2YXIgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZi5jYWxsZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZi5vbmNlRXJyb3IpXG4gICAgZi5jYWxsZWQgPSB0cnVlXG4gICAgcmV0dXJuIGYudmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH1cbiAgdmFyIG5hbWUgPSBmbi5uYW1lIHx8ICdGdW5jdGlvbiB3cmFwcGVkIHdpdGggYG9uY2VgJ1xuICBmLm9uY2VFcnJvciA9IG5hbWUgKyBcIiBzaG91bGRuJ3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlXCJcbiAgZi5jYWxsZWQgPSBmYWxzZVxuICByZXR1cm4gZlxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUGFjUHJveHlBZ2VudCA9IHZvaWQgMDtcbmNvbnN0IG5ldCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwibmV0XCIpKTtcbmNvbnN0IHRscyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidGxzXCIpKTtcbmNvbnN0IGNyeXB0byA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiY3J5cHRvXCIpKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcImV2ZW50c1wiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IHVybF8xID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IGFnZW50X2Jhc2VfMSA9IHJlcXVpcmUoXCJhZ2VudC1iYXNlXCIpO1xuY29uc3QgaHR0cF9wcm94eV9hZ2VudF8xID0gcmVxdWlyZShcImh0dHAtcHJveHktYWdlbnRcIik7XG5jb25zdCBodHRwc19wcm94eV9hZ2VudF8xID0gcmVxdWlyZShcImh0dHBzLXByb3h5LWFnZW50XCIpO1xuY29uc3Qgc29ja3NfcHJveHlfYWdlbnRfMSA9IHJlcXVpcmUoXCJzb2Nrcy1wcm94eS1hZ2VudFwiKTtcbmNvbnN0IGdldF91cmlfMSA9IHJlcXVpcmUoXCJnZXQtdXJpXCIpO1xuY29uc3QgcGFjX3Jlc29sdmVyXzEgPSByZXF1aXJlKFwicGFjLXJlc29sdmVyXCIpO1xuY29uc3QgcXVpY2tqc19lbXNjcmlwdGVuXzEgPSByZXF1aXJlKFwiQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlblwiKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ3BhYy1wcm94eS1hZ2VudCcpO1xuLyoqXG4gKiBUaGUgYFBhY1Byb3h5QWdlbnRgIGNsYXNzLlxuICpcbiAqIEEgZmV3IGRpZmZlcmVudCBcInByb3RvY29sXCIgbW9kZXMgYXJlIHN1cHBvcnRlZCAoc3VwcG9ydGVkIHByb3RvY29scyBhcmVcbiAqIGJhY2tlZCBieSB0aGUgYGdldC11cmlgIG1vZHVsZSk6XG4gKlxuICogICAtIFwicGFjK2RhdGFcIiwgXCJkYXRhXCIgLSByZWZlcnMgdG8gYW4gZW1iZWRkZWQgXCJkYXRhOlwiIFVSSVxuICogICAtIFwicGFjK2ZpbGVcIiwgXCJmaWxlXCIgLSByZWZlcnMgdG8gYSBsb2NhbCBmaWxlXG4gKiAgIC0gXCJwYWMrZnRwXCIsIFwiZnRwXCIgLSByZWZlcnMgdG8gYSBmaWxlIGxvY2F0ZWQgb24gYW4gRlRQIHNlcnZlclxuICogICAtIFwicGFjK2h0dHBcIiwgXCJodHRwXCIgLSByZWZlcnMgdG8gYW4gSFRUUCBlbmRwb2ludFxuICogICAtIFwicGFjK2h0dHBzXCIsIFwiaHR0cHNcIiAtIHJlZmVycyB0byBhbiBIVFRQUyBlbmRwb2ludFxuICovXG5jbGFzcyBQYWNQcm94eUFnZW50IGV4dGVuZHMgYWdlbnRfYmFzZV8xLkFnZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmksIG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuY2xlYXJSZXNvbHZlclByb21pc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVyUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gU3RyaXAgdGhlIFwicGFjK1wiIHByZWZpeFxuICAgICAgICBjb25zdCB1cmlTdHIgPSB0eXBlb2YgdXJpID09PSAnc3RyaW5nJyA/IHVyaSA6IHVyaS5ocmVmO1xuICAgICAgICB0aGlzLnVyaSA9IG5ldyB1cmxfMS5VUkwodXJpU3RyLnJlcGxhY2UoL15wYWNcXCsvaSwgJycpKTtcbiAgICAgICAgZGVidWcoJ0NyZWF0aW5nIFBhY1Byb3h5QWdlbnQgd2l0aCBVUkkgJW8nLCB0aGlzLnVyaS5ocmVmKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb3Qgc3VyZSB3aHkgVFMgaXMgY29tcGxhaW5pbmcgaGVyZeKAplxuICAgICAgICB0aGlzLm9wdHMgPSB7IC4uLm9wdHMgfTtcbiAgICAgICAgdGhpcy5jYWNoZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yZXNvbHZlckhhc2ggPSAnJztcbiAgICAgICAgdGhpcy5yZXNvbHZlclByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIEZvciBgUGFjUmVzb2x2ZXJgXG4gICAgICAgIGlmICghdGhpcy5vcHRzLmZpbGVuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLm9wdHMuZmlsZW5hbWUgPSB0aGlzLnVyaS5ocmVmO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBQQUMgcHJveHkgZmlsZSBmcm9tIHRoZSBzb3VyY2UgaWYgbmVjZXNzYXJ5LCBhbmQgcmV0dXJuc1xuICAgICAqIGEgZ2VuZXJhdGVkIGBGaW5kUHJveHlGb3JVUkwoKWAgcmVzb2x2ZXIgZnVuY3Rpb24gdG8gdXNlLlxuICAgICAqXG4gICAgICogQGFwaSBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0UmVzb2x2ZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXNvbHZlclByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZXJQcm9taXNlID0gdGhpcy5sb2FkUmVzb2x2ZXIoKTtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZXJQcm9taXNlLnRoZW4odGhpcy5jbGVhclJlc29sdmVyUHJvbWlzZSwgdGhpcy5jbGVhclJlc29sdmVyUHJvbWlzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZXJQcm9taXNlO1xuICAgIH1cbiAgICBhc3luYyBsb2FkUmVzb2x2ZXIoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyAoUmUpbG9hZCB0aGUgY29udGVudHMgb2YgdGhlIFBBQyBmaWxlIFVSSVxuICAgICAgICAgICAgY29uc3QgW3FqcywgY29kZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgKDAsIHF1aWNranNfZW1zY3JpcHRlbl8xLmdldFF1aWNrSlMpKCksXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUGFjRmlsZSgpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBzaGExIGhhc2ggb2YgdGhlIEpTIGNvZGVcbiAgICAgICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpLnVwZGF0ZShjb2RlKS5kaWdlc3QoJ2hleCcpO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzb2x2ZXIgJiYgdGhpcy5yZXNvbHZlckhhc2ggPT09IGhhc2gpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnU2FtZSBzaGExIGhhc2ggZm9yIGNvZGUgLSBjb250ZW50cyBoYXZlIG5vdCBjaGFuZ2VkLCByZXVzaW5nIHByZXZpb3VzIHByb3h5IHJlc29sdmVyJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDYWNoZSB0aGUgcmVzb2x2ZXJcbiAgICAgICAgICAgIGRlYnVnKCdDcmVhdGluZyBuZXcgcHJveHkgcmVzb2x2ZXIgaW5zdGFuY2UnKTtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZXIgPSAoMCwgcGFjX3Jlc29sdmVyXzEuY3JlYXRlUGFjUmVzb2x2ZXIpKHFqcywgY29kZSwgdGhpcy5vcHRzKTtcbiAgICAgICAgICAgIC8vIFN0b3JlIHRoYXQgc2hhMSBoYXNoIGZvciBmdXR1cmUgY29tcGFyaXNvbiBwdXJwb3Nlc1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlckhhc2ggPSBoYXNoO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZXI7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzb2x2ZXIgJiZcbiAgICAgICAgICAgICAgICBlcnIuY29kZSA9PT0gJ0VOT1RNT0RJRklFRCcpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnR290IEVOT1RNT0RJRklFRCByZXNwb25zZSwgcmV1c2luZyBwcmV2aW91cyBwcm94eSByZXNvbHZlcicpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBjb250ZW50cyBvZiB0aGUgUEFDIHByb3h5IGZpbGUuXG4gICAgICpcbiAgICAgKiBAYXBpIHByaXZhdGVcbiAgICAgKi9cbiAgICBhc3luYyBsb2FkUGFjRmlsZSgpIHtcbiAgICAgICAgZGVidWcoJ0xvYWRpbmcgUEFDIGZpbGU6ICVvJywgdGhpcy51cmkpO1xuICAgICAgICBjb25zdCBycyA9IGF3YWl0ICgwLCBnZXRfdXJpXzEuZ2V0VXJpKSh0aGlzLnVyaSwgeyAuLi50aGlzLm9wdHMsIGNhY2hlOiB0aGlzLmNhY2hlIH0pO1xuICAgICAgICBkZWJ1ZygnR290IGBSZWFkYWJsZWAgaW5zdGFuY2UgZm9yIFVSSScpO1xuICAgICAgICB0aGlzLmNhY2hlID0gcnM7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0ICgwLCBhZ2VudF9iYXNlXzEudG9CdWZmZXIpKHJzKTtcbiAgICAgICAgZGVidWcoJ1JlYWQgJW8gYnl0ZSBQQUMgZmlsZSBmcm9tIFVSSScsIGJ1Zi5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBub2RlLWNvcmUgSFRUUCBjbGllbnQgbGlicmFyeSBpcyBjcmVhdGluZyBhIG5ldyBIVFRQIHJlcXVlc3QuXG4gICAgICovXG4gICAgYXN5bmMgY29ubmVjdChyZXEsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgeyBzZWN1cmVFbmRwb2ludCB9ID0gb3B0cztcbiAgICAgICAgLy8gRmlyc3QsIGdldCBhIGdlbmVyYXRlZCBgRmluZFByb3h5Rm9yVVJMKClgIGZ1bmN0aW9uLFxuICAgICAgICAvLyBlaXRoZXIgY2FjaGVkIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzb3VyY2VcbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSBhd2FpdCB0aGlzLmdldFJlc29sdmVyKCk7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYHVybGAgcGFyYW1ldGVyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gc2VjdXJlRW5kcG9pbnQgPyA0NDMgOiA4MDtcbiAgICAgICAgbGV0IHBhdGggPSByZXEucGF0aDtcbiAgICAgICAgbGV0IHNlYXJjaCA9IG51bGw7XG4gICAgICAgIGNvbnN0IGZpcnN0UXVlc3Rpb24gPSBwYXRoLmluZGV4T2YoJz8nKTtcbiAgICAgICAgaWYgKGZpcnN0UXVlc3Rpb24gIT09IC0xKSB7XG4gICAgICAgICAgICBzZWFyY2ggPSBwYXRoLnN1YnN0cmluZyhmaXJzdFF1ZXN0aW9uKTtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBmaXJzdFF1ZXN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmxPcHRzID0ge1xuICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICAgIHByb3RvY29sOiBzZWN1cmVFbmRwb2ludCA/ICdodHRwczonIDogJ2h0dHA6JyxcbiAgICAgICAgICAgIHBhdGhuYW1lOiBwYXRoLFxuICAgICAgICAgICAgc2VhcmNoLFxuICAgICAgICAgICAgLy8gbmVlZCB0byB1c2UgYGhvc3RuYW1lYCBpbnN0ZWFkIG9mIGBob3N0YCBvdGhlcndpc2UgYHBvcnRgIGlzIGlnbm9yZWRcbiAgICAgICAgICAgIGhvc3RuYW1lOiBvcHRzLmhvc3QsXG4gICAgICAgICAgICBob3N0OiBudWxsLFxuICAgICAgICAgICAgaHJlZjogbnVsbCxcbiAgICAgICAgICAgIC8vIHNldCBgcG9ydGAgdG8gbnVsbCB3aGVuIGl0IGlzIHRoZSBwcm90b2NvbCBkZWZhdWx0IHBvcnQgKDgwIC8gNDQzKVxuICAgICAgICAgICAgcG9ydDogZGVmYXVsdFBvcnQgPT09IG9wdHMucG9ydCA/IG51bGwgOiBvcHRzLnBvcnQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHVybCA9ICgwLCB1cmxfMS5mb3JtYXQpKHVybE9wdHMpO1xuICAgICAgICBkZWJ1ZygndXJsOiAlbycsIHVybCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCByZXNvbHZlcih1cmwpO1xuICAgICAgICAvLyBEZWZhdWx0IHRvIFwiRElSRUNUXCIgaWYgYSBmYWxzZXkgdmFsdWUgd2FzIHJldHVybmVkIChvciBub3RoaW5nKVxuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gJ0RJUkVDVCc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJveGllcyA9IFN0cmluZyhyZXN1bHQpXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAuc3BsaXQoL1xccyo7XFxzKi9nKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5mYWxsYmFja1RvRGlyZWN0ICYmICFwcm94aWVzLmluY2x1ZGVzKCdESVJFQ1QnKSkge1xuICAgICAgICAgICAgcHJveGllcy5wdXNoKCdESVJFQ1QnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHByb3h5IG9mIHByb3hpZXMpIHtcbiAgICAgICAgICAgIGxldCBhZ2VudCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgc29ja2V0ID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IFt0eXBlLCB0YXJnZXRdID0gcHJveHkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgIGRlYnVnKCdBdHRlbXB0aW5nIHRvIHVzZSBwcm94eTogJW8nLCBwcm94eSk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ0RJUkVDVCcpIHtcbiAgICAgICAgICAgICAgICAvLyBEaXJlY3QgY29ubmVjdGlvbiB0byB0aGUgZGVzdGluYXRpb24gZW5kcG9pbnRcbiAgICAgICAgICAgICAgICBpZiAoc2VjdXJlRW5kcG9pbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmVybmFtZSA9IG9wdHMuc2VydmVybmFtZSB8fCBvcHRzLmhvc3Q7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldCA9IHRscy5jb25uZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJuYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldCA9IG5ldC5jb25uZWN0KG9wdHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdTT0NLUycgfHwgdHlwZSA9PT0gJ1NPQ0tTNScpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgYSBTT0NLU3Y1aCBwcm94eVxuICAgICAgICAgICAgICAgIGFnZW50ID0gbmV3IHNvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50KGBzb2NrczovLyR7dGFyZ2V0fWAsIHRoaXMub3B0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnU09DS1M0Jykge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBhIFNPQ0tTdjRhIHByb3h5XG4gICAgICAgICAgICAgICAgYWdlbnQgPSBuZXcgc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnQoYHNvY2tzNGE6Ly8ke3RhcmdldH1gLCB0aGlzLm9wdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ1BST1hZJyB8fFxuICAgICAgICAgICAgICAgIHR5cGUgPT09ICdIVFRQJyB8fFxuICAgICAgICAgICAgICAgIHR5cGUgPT09ICdIVFRQUycpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgYW4gSFRUUCBvciBIVFRQUyBwcm94eVxuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9kZXYuY2hyb21pdW0ub3JnL2RldmVsb3BlcnMvZGVzaWduLWRvY3VtZW50cy9zZWN1cmUtd2ViLXByb3h5XG4gICAgICAgICAgICAgICAgY29uc3QgcHJveHlVUkwgPSBgJHt0eXBlID09PSAnSFRUUFMnID8gJ2h0dHBzJyA6ICdodHRwJ306Ly8ke3RhcmdldH1gO1xuICAgICAgICAgICAgICAgIGlmIChzZWN1cmVFbmRwb2ludCkge1xuICAgICAgICAgICAgICAgICAgICBhZ2VudCA9IG5ldyBodHRwc19wcm94eV9hZ2VudF8xLkh0dHBzUHJveHlBZ2VudChwcm94eVVSTCwgdGhpcy5vcHRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFnZW50ID0gbmV3IGh0dHBfcHJveHlfYWdlbnRfMS5IdHRwUHJveHlBZ2VudChwcm94eVVSTCwgdGhpcy5vcHRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzb2NrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gXCJESVJFQ1RcIiBjb25uZWN0aW9uLCB3YWl0IGZvciBjb25uZWN0aW9uIGNvbmZpcm1hdGlvblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCAoMCwgZXZlbnRzXzEub25jZSkoc29ja2V0LCAnY29ubmVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXEuZW1pdCgncHJveHknLCB7IHByb3h5LCBzb2NrZXQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb2NrZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhZ2VudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gYXdhaXQgYWdlbnQuY29ubmVjdChyZXEsIG9wdHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShzIGluc3RhbmNlb2YgbmV0LlNvY2tldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSBgbmV0LlNvY2tldGAgdG8gYmUgcmV0dXJuZWQgZnJvbSBhZ2VudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlcS5lbWl0KCdwcm94eScsIHsgcHJveHksIHNvY2tldDogcyB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSBwcm94eSB0eXBlIGZvcjogJHtwcm94eX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnR290IGVycm9yIGZvciBwcm94eSAlbzogJW8nLCBwcm94eSwgZXJyKTtcbiAgICAgICAgICAgICAgICByZXEuZW1pdCgncHJveHknLCB7IHByb3h5LCBlcnJvcjogZXJyIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGVzdGFibGlzaCBhIHNvY2tldCBjb25uZWN0aW9uIHRvIHByb3hpZXM6ICR7SlNPTi5zdHJpbmdpZnkocHJveGllcyl9YCk7XG4gICAgfVxufVxuUGFjUHJveHlBZ2VudC5wcm90b2NvbHMgPSBbXG4gICAgJ3BhYytkYXRhJyxcbiAgICAncGFjK2ZpbGUnLFxuICAgICdwYWMrZnRwJyxcbiAgICAncGFjK2h0dHAnLFxuICAgICdwYWMraHR0cHMnLFxuXTtcbmV4cG9ydHMuUGFjUHJveHlBZ2VudCA9IFBhY1Byb3h5QWdlbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogSWYgb25seSBhIHNpbmdsZSB2YWx1ZSBpcyBzcGVjaWZpZWQgKGZyb20gZWFjaCBjYXRlZ29yeTogZGF5LCBtb250aCwgeWVhciksIHRoZVxuICogZnVuY3Rpb24gcmV0dXJucyBhIHRydWUgdmFsdWUgb25seSBvbiBkYXlzIHRoYXQgbWF0Y2ggdGhhdCBzcGVjaWZpY2F0aW9uLiBJZlxuICogYm90aCB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIHJlc3VsdCBpcyB0cnVlIGJldHdlZW4gdGhvc2UgdGltZXMsIGluY2x1ZGluZ1xuICogYm91bmRzLlxuICpcbiAqIEV2ZW4gdGhvdWdoIHRoZSBleGFtcGxlcyBkb24ndCBzaG93LCB0aGUgXCJHTVRcIiBwYXJhbWV0ZXIgY2FuIGJlIHNwZWNpZmllZFxuICogaW4gYW55IG9mIHRoZSA5IGRpZmZlcmVudCBjYWxsIHByb2ZpbGVzLCBhbHdheXMgYXMgdGhlIGxhc3QgcGFyYW1ldGVyLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYCBqc1xuICogZGF0ZVJhbmdlKDEpXG4gKiB0cnVlIG9uIHRoZSBmaXJzdCBkYXkgb2YgZWFjaCBtb250aCwgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogZGF0ZVJhbmdlKDEsIFwiR01UXCIpXG4gKiB0cnVlIG9uIHRoZSBmaXJzdCBkYXkgb2YgZWFjaCBtb250aCwgR01UIHRpbWV6b25lLlxuICpcbiAqIGRhdGVSYW5nZSgxLCAxNSlcbiAqIHRydWUgb24gdGhlIGZpcnN0IGhhbGYgb2YgZWFjaCBtb250aC5cbiAqXG4gKiBkYXRlUmFuZ2UoMjQsIFwiREVDXCIpXG4gKiB0cnVlIG9uIDI0dGggb2YgRGVjZW1iZXIgZWFjaCB5ZWFyLlxuICpcbiAqIGRhdGVSYW5nZSgyNCwgXCJERUNcIiwgMTk5NSlcbiAqIHRydWUgb24gMjR0aCBvZiBEZWNlbWJlciwgMTk5NS5cbiAqXG4gKiBkYXRlUmFuZ2UoXCJKQU5cIiwgXCJNQVJcIilcbiAqIHRydWUgb24gdGhlIGZpcnN0IHF1YXJ0ZXIgb2YgdGhlIHllYXIuXG4gKlxuICogZGF0ZVJhbmdlKDEsIFwiSlVOXCIsIDE1LCBcIkFVR1wiKVxuICogdHJ1ZSBmcm9tIEp1bmUgMXN0IHVudGlsIEF1Z3VzdCAxNXRoLCBlYWNoIHllYXIgKGluY2x1ZGluZyBKdW5lIDFzdCBhbmQgQXVndXN0XG4gKiAxNXRoKS5cbiAqXG4gKiBkYXRlUmFuZ2UoMSwgXCJKVU5cIiwgMTUsIDE5OTUsIFwiQVVHXCIsIDE5OTUpXG4gKiB0cnVlIGZyb20gSnVuZSAxc3QsIDE5OTUsIHVudGlsIEF1Z3VzdCAxNXRoLCBzYW1lIHllYXIuXG4gKlxuICogZGF0ZVJhbmdlKFwiT0NUXCIsIDE5OTUsIFwiTUFSXCIsIDE5OTYpXG4gKiB0cnVlIGZyb20gT2N0b2JlciAxOTk1IHVudGlsIE1hcmNoIDE5OTYgKGluY2x1ZGluZyB0aGUgZW50aXJlIG1vbnRoIG9mIE9jdG9iZXJcbiAqIDE5OTUgYW5kIE1hcmNoIDE5OTYpLlxuICpcbiAqIGRhdGVSYW5nZSgxOTk1KVxuICogdHJ1ZSBkdXJpbmcgdGhlIGVudGlyZSB5ZWFyIDE5OTUuXG4gKlxuICogZGF0ZVJhbmdlKDE5OTUsIDE5OTcpXG4gKiB0cnVlIGZyb20gYmVnaW5uaW5nIG9mIHllYXIgMTk5NSB1bnRpbCB0aGUgZW5kIG9mIHllYXIgMTk5Ny5cbiAqIGBgYFxuICpcbiAqIGRhdGVSYW5nZShkYXkpXG4gKiBkYXRlUmFuZ2UoZGF5MSwgZGF5MilcbiAqIGRhdGVSYW5nZShtb24pXG4gKiBkYXRlUmFuZ2UobW9udGgxLCBtb250aDIpXG4gKiBkYXRlUmFuZ2UoeWVhcilcbiAqIGRhdGVSYW5nZSh5ZWFyMSwgeWVhcjIpXG4gKiBkYXRlUmFuZ2UoZGF5MSwgbW9udGgxLCBkYXkyLCBtb250aDIpXG4gKiBkYXRlUmFuZ2UobW9udGgxLCB5ZWFyMSwgbW9udGgyLCB5ZWFyMilcbiAqIGRhdGVSYW5nZShkYXkxLCBtb250aDEsIHllYXIxLCBkYXkyLCBtb250aDIsIHllYXIyKVxuICogZGF0ZVJhbmdlKGRheTEsIG1vbnRoMSwgeWVhcjEsIGRheTIsIG1vbnRoMiwgeWVhcjIsIGdtdClcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF5IGlzIHRoZSBkYXkgb2YgbW9udGggYmV0d2VlbiAxIGFuZCAzMSAoYXMgYW4gaW50ZWdlcikuXG4gKiBAcGFyYW0ge1N0cmluZ30gbW9udGggaXMgb25lIG9mIHRoZSBtb250aCBzdHJpbmdzOiBKQU4gRkVCIE1BUiBBUFIgTUFZIEpVTiBKVUwgQVVHIFNFUCBPQ1QgTk9WIERFQ1xuICogQHBhcmFtIHtTdHJpbmd9IHllYXIgaXMgdGhlIGZ1bGwgeWVhciBudW1iZXIsIGZvciBleGFtcGxlIDE5OTUgKGJ1dCBub3QgOTUpLiBJbnRlZ2VyLlxuICogQHBhcmFtIHtTdHJpbmd9IGdtdCBpcyBlaXRoZXIgdGhlIHN0cmluZyBcIkdNVFwiLCB3aGljaCBtYWtlcyB0aW1lIGNvbXBhcmlzb24gb2NjdXIgaW4gR01UIHRpbWV6b25lOyBpZiBsZWZ0IHVuc3BlY2lmaWVkLCB0aW1lcyBhcmUgdGFrZW4gdG8gYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZnVuY3Rpb24gZGF0ZVJhbmdlKCkge1xuICAgIC8vIFRPRE86IGltcGxlbWVudCBtZSFcbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkYXRlUmFuZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRlUmFuZ2UuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGRvbWFpbiBvZiBob3N0bmFtZSBtYXRjaGVzLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYCBqc1xuICogZG5zRG9tYWluSXMoXCJ3d3cubmV0c2NhcGUuY29tXCIsIFwiLm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyBpcyB0cnVlLlxuICpcbiAqIGRuc0RvbWFpbklzKFwid3d3XCIsIFwiLm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyBpcyBmYWxzZS5cbiAqXG4gKiBkbnNEb21haW5JcyhcInd3dy5tY29tLmNvbVwiLCBcIi5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgZmFsc2UuXG4gKiBgYGBcbiAqXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhvc3QgaXMgdGhlIGhvc3RuYW1lIGZyb20gdGhlIFVSTC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gaXMgdGhlIGRvbWFpbiBuYW1lIHRvIHRlc3QgdGhlIGhvc3RuYW1lIGFnYWluc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmZiB0aGUgZG9tYWluIG9mIHRoZSBob3N0bmFtZSBtYXRjaGVzLlxuICovXG5mdW5jdGlvbiBkbnNEb21haW5Jcyhob3N0LCBkb21haW4pIHtcbiAgICBob3N0ID0gU3RyaW5nKGhvc3QpO1xuICAgIGRvbWFpbiA9IFN0cmluZyhkb21haW4pO1xuICAgIHJldHVybiBob3N0LnN1YnN0cihkb21haW4ubGVuZ3RoICogLTEpID09PSBkb21haW47XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkbnNEb21haW5Jcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRuc0RvbWFpbklzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgKGludGVnZXIpIG9mIEROUyBkb21haW4gbGV2ZWxzIChudW1iZXIgb2YgZG90cykgaW4gdGhlXG4gKiBob3N0bmFtZS5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIGRuc0RvbWFpbkxldmVscyhcInd3d1wiKVxuICogICAvLyByZXR1cm5zIDAuXG4gKiBkbnNEb21haW5MZXZlbHMoXCJ3d3cubmV0c2NhcGUuY29tXCIpXG4gKiAgIC8vIHJldHVybnMgMi5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3N0IGlzIHRoZSBob3N0bmFtZSBmcm9tIHRoZSBVUkwuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IG51bWJlciBvZiBkb21haW4gbGV2ZWxzXG4gKi9cbmZ1bmN0aW9uIGRuc0RvbWFpbkxldmVscyhob3N0KSB7XG4gICAgY29uc3QgbWF0Y2ggPSBTdHJpbmcoaG9zdCkubWF0Y2goL1xcLi9nKTtcbiAgICBsZXQgbGV2ZWxzID0gMDtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgbGV2ZWxzID0gbWF0Y2gubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gbGV2ZWxzO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZG5zRG9tYWluTGV2ZWxzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG5zRG9tYWluTGV2ZWxzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbi8qKlxuICogUmVzb2x2ZXMgdGhlIGdpdmVuIEROUyBob3N0bmFtZSBpbnRvIGFuIElQIGFkZHJlc3MsIGFuZCByZXR1cm5zIGl0IGluIHRoZSBkb3RcbiAqIHNlcGFyYXRlZCBmb3JtYXQgYXMgYSBzdHJpbmcuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGAganNcbiAqIGRuc1Jlc29sdmUoXCJob21lLm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyByZXR1cm5zIHRoZSBzdHJpbmcgXCIxOTguOTUuMjQ5Ljc5XCIuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdCBob3N0bmFtZSB0byByZXNvbHZlXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJlc29sdmVkIElQIGFkZHJlc3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZG5zUmVzb2x2ZShob3N0KSB7XG4gICAgY29uc3QgZmFtaWx5ID0gNDtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgKDAsIHV0aWxfMS5kbnNMb29rdXApKGhvc3QsIHsgZmFtaWx5IH0pO1xuICAgICAgICBpZiAodHlwZW9mIHIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIEBpZ25vcmVcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkbnNSZXNvbHZlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG5zUmVzb2x2ZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc2FuZGJveCA9IGV4cG9ydHMuY3JlYXRlUGFjUmVzb2x2ZXIgPSB2b2lkIDA7XG5jb25zdCBkZWdlbmVyYXRvcl8xID0gcmVxdWlyZShcImRlZ2VuZXJhdG9yXCIpO1xuLyoqXG4gKiBCdWlsdC1pbiBQQUMgZnVuY3Rpb25zLlxuICovXG5jb25zdCBkYXRlUmFuZ2VfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kYXRlUmFuZ2VcIikpO1xuY29uc3QgZG5zRG9tYWluSXNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kbnNEb21haW5Jc1wiKSk7XG5jb25zdCBkbnNEb21haW5MZXZlbHNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kbnNEb21haW5MZXZlbHNcIikpO1xuY29uc3QgZG5zUmVzb2x2ZV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2Ruc1Jlc29sdmVcIikpO1xuY29uc3QgaXNJbk5ldF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2lzSW5OZXRcIikpO1xuY29uc3QgaXNQbGFpbkhvc3ROYW1lXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vaXNQbGFpbkhvc3ROYW1lXCIpKTtcbmNvbnN0IGlzUmVzb2x2YWJsZV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2lzUmVzb2x2YWJsZVwiKSk7XG5jb25zdCBsb2NhbEhvc3RPckRvbWFpbklzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbG9jYWxIb3N0T3JEb21haW5Jc1wiKSk7XG5jb25zdCBteUlwQWRkcmVzc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL215SXBBZGRyZXNzXCIpKTtcbmNvbnN0IHNoRXhwTWF0Y2hfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9zaEV4cE1hdGNoXCIpKTtcbmNvbnN0IHRpbWVSYW5nZV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3RpbWVSYW5nZVwiKSk7XG5jb25zdCB3ZWVrZGF5UmFuZ2VfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi93ZWVrZGF5UmFuZ2VcIikpO1xuLyoqXG4gKiBSZXR1cm5zIGFuIGFzeW5jaHJvbm91cyBgRmluZFByb3h5Rm9yVVJMKClgIGZ1bmN0aW9uXG4gKiBmcm9tIHRoZSBnaXZlbiBKUyBzdHJpbmcgKGZyb20gYSBQQUMgZmlsZSkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBhY1Jlc29sdmVyKHFqcywgX3N0ciwgX29wdHMgPSB7fSkge1xuICAgIGNvbnN0IHN0ciA9IEJ1ZmZlci5pc0J1ZmZlcihfc3RyKSA/IF9zdHIudG9TdHJpbmcoJ3V0ZjgnKSA6IF9zdHI7XG4gICAgLy8gVGhlIHNhbmRib3ggdG8gdXNlIGZvciB0aGUgYHZtYCBjb250ZXh0LlxuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgIC4uLmV4cG9ydHMuc2FuZGJveCxcbiAgICAgICAgLi4uX29wdHMuc2FuZGJveCxcbiAgICB9O1xuICAgIC8vIENvbnN0cnVjdCB0aGUgYXJyYXkgb2YgYXN5bmMgZnVuY3Rpb24gbmFtZXMgdG8gYWRkIGBhd2FpdGAgY2FsbHMgdG8uXG4gICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhjb250ZXh0KS5maWx0ZXIoKGspID0+IGlzQXN5bmNGdW5jdGlvbihjb250ZXh0W2tdKSk7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgZmlsZW5hbWU6ICdwcm94eS5wYWMnLFxuICAgICAgICBuYW1lcyxcbiAgICAgICAgLi4uX29wdHMsXG4gICAgICAgIHNhbmRib3g6IGNvbnRleHQsXG4gICAgfTtcbiAgICAvLyBDb21waWxlIHRoZSBKUyBgRmluZFByb3h5Rm9yVVJMKClgIGZ1bmN0aW9uIGludG8gYW4gYXN5bmMgZnVuY3Rpb24uXG4gICAgY29uc3QgcmVzb2x2ZXIgPSAoMCwgZGVnZW5lcmF0b3JfMS5jb21waWxlKShxanMsIHN0ciwgJ0ZpbmRQcm94eUZvclVSTCcsIG9wdHMpO1xuICAgIGZ1bmN0aW9uIEZpbmRQcm94eUZvclVSTCh1cmwsIF9ob3N0KSB7XG4gICAgICAgIGNvbnN0IHVybE9iaiA9IHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnID8gbmV3IFVSTCh1cmwpIDogdXJsO1xuICAgICAgICBjb25zdCBob3N0ID0gX2hvc3QgfHwgdXJsT2JqLmhvc3RuYW1lO1xuICAgICAgICBpZiAoIWhvc3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBkZXRlcm1pbmUgYGhvc3RgJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKHVybE9iai5ocmVmLCBob3N0KTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZpbmRQcm94eUZvclVSTCwgJ3RvU3RyaW5nJywge1xuICAgICAgICB2YWx1ZTogKCkgPT4gcmVzb2x2ZXIudG9TdHJpbmcoKSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIEZpbmRQcm94eUZvclVSTDtcbn1cbmV4cG9ydHMuY3JlYXRlUGFjUmVzb2x2ZXIgPSBjcmVhdGVQYWNSZXNvbHZlcjtcbmV4cG9ydHMuc2FuZGJveCA9IE9iamVjdC5mcmVlemUoe1xuICAgIGFsZXJ0OiAobWVzc2FnZSA9ICcnKSA9PiBjb25zb2xlLmxvZygnJXMnLCBtZXNzYWdlKSxcbiAgICBkYXRlUmFuZ2U6IGRhdGVSYW5nZV8xLmRlZmF1bHQsXG4gICAgZG5zRG9tYWluSXM6IGRuc0RvbWFpbklzXzEuZGVmYXVsdCxcbiAgICBkbnNEb21haW5MZXZlbHM6IGRuc0RvbWFpbkxldmVsc18xLmRlZmF1bHQsXG4gICAgZG5zUmVzb2x2ZTogZG5zUmVzb2x2ZV8xLmRlZmF1bHQsXG4gICAgaXNJbk5ldDogaXNJbk5ldF8xLmRlZmF1bHQsXG4gICAgaXNQbGFpbkhvc3ROYW1lOiBpc1BsYWluSG9zdE5hbWVfMS5kZWZhdWx0LFxuICAgIGlzUmVzb2x2YWJsZTogaXNSZXNvbHZhYmxlXzEuZGVmYXVsdCxcbiAgICBsb2NhbEhvc3RPckRvbWFpbklzOiBsb2NhbEhvc3RPckRvbWFpbklzXzEuZGVmYXVsdCxcbiAgICBteUlwQWRkcmVzczogbXlJcEFkZHJlc3NfMS5kZWZhdWx0LFxuICAgIHNoRXhwTWF0Y2g6IHNoRXhwTWF0Y2hfMS5kZWZhdWx0LFxuICAgIHRpbWVSYW5nZTogdGltZVJhbmdlXzEuZGVmYXVsdCxcbiAgICB3ZWVrZGF5UmFuZ2U6IHdlZWtkYXlSYW5nZV8xLmRlZmF1bHQsXG59KTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiBpc0FzeW5jRnVuY3Rpb24odikge1xuICAgIGlmICh0eXBlb2YgdiAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIE5hdGl2ZSBgQXN5bmNGdW5jdGlvbmBcbiAgICBpZiAodi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQXN5bmNGdW5jdGlvbicpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIFR5cGVTY3JpcHQgY29tcGlsZWRcbiAgICBpZiAoU3RyaW5nKHYpLmluZGV4T2YoJ19fYXdhaXRlcignKSAhPT0gLTEpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIExlZ2FjeSBiZWhhdmlvciAtIHNldCBgYXN5bmNgIHByb3BlcnR5IG9uIHRoZSBmdW5jdGlvblxuICAgIHJldHVybiBCb29sZWFuKHYuYXN5bmMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlwID0gdm9pZCAwO1xuY29uc3Qgb3NfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwib3NcIikpO1xuZXhwb3J0cy5pcCA9IHtcbiAgICBhZGRyZXNzKCkge1xuICAgICAgICBjb25zdCBpbnRlcmZhY2VzID0gb3NfMS5kZWZhdWx0Lm5ldHdvcmtJbnRlcmZhY2VzKCk7XG4gICAgICAgIC8vIERlZmF1bHQgdG8gYGlwdjRgXG4gICAgICAgIGNvbnN0IGZhbWlseSA9IG5vcm1hbGl6ZUZhbWlseSgpO1xuICAgICAgICBjb25zdCBhbGwgPSBPYmplY3QudmFsdWVzKGludGVyZmFjZXMpLm1hcCgoYWRkcnMgPSBbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzc2VzID0gYWRkcnMuZmlsdGVyKChkZXRhaWxzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGV0YWlsc0ZhbWlseSA9IG5vcm1hbGl6ZUZhbWlseShkZXRhaWxzLmZhbWlseSk7XG4gICAgICAgICAgICAgICAgaWYgKGRldGFpbHNGYW1pbHkgIT09IGZhbWlseSB8fCBleHBvcnRzLmlwLmlzTG9vcGJhY2soZGV0YWlscy5hZGRyZXNzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gYWRkcmVzc2VzLmxlbmd0aCA/IGFkZHJlc3Nlc1swXS5hZGRyZXNzIDogdW5kZWZpbmVkO1xuICAgICAgICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIHJldHVybiAhYWxsLmxlbmd0aCA/IGV4cG9ydHMuaXAubG9vcGJhY2soZmFtaWx5KSA6IGFsbFswXTtcbiAgICB9LFxuICAgIGlzTG9vcGJhY2soYWRkcikge1xuICAgICAgICByZXR1cm4gL14oOjpmezR9Oik/MTI3XFwuKFswLTldezEsM30pXFwuKFswLTldezEsM30pXFwuKFswLTldezEsM30pL1xuICAgICAgICAgICAgLnRlc3QoYWRkcilcbiAgICAgICAgICAgIHx8IC9eZmU4MDo6MSQvLnRlc3QoYWRkcilcbiAgICAgICAgICAgIHx8IC9eOjoxJC8udGVzdChhZGRyKVxuICAgICAgICAgICAgfHwgL146OiQvLnRlc3QoYWRkcik7XG4gICAgfSxcbiAgICBsb29wYmFjayhmYW1pbHkpIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0byBgaXB2NGBcbiAgICAgICAgZmFtaWx5ID0gbm9ybWFsaXplRmFtaWx5KGZhbWlseSk7XG4gICAgICAgIGlmIChmYW1pbHkgIT09ICdpcHY0JyAmJiBmYW1pbHkgIT09ICdpcHY2Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYW1pbHkgbXVzdCBiZSBpcHY0IG9yIGlwdjYnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFtaWx5ID09PSAnaXB2NCcgPyAnMTI3LjAuMC4xJyA6ICdmZTgwOjoxJztcbiAgICB9XG59O1xuZnVuY3Rpb24gbm9ybWFsaXplRmFtaWx5KGZhbWlseSkge1xuICAgIGlmIChmYW1pbHkgPT09IDQpIHtcbiAgICAgICAgcmV0dXJuICdpcHY0JztcbiAgICB9XG4gICAgaWYgKGZhbWlseSA9PT0gNikge1xuICAgICAgICByZXR1cm4gJ2lwdjYnO1xuICAgIH1cbiAgICByZXR1cm4gZmFtaWx5ID8gZmFtaWx5LnRvTG93ZXJDYXNlKCkgOiAnaXB2NCc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IG5ldG1hc2tfMSA9IHJlcXVpcmUoXCJuZXRtYXNrXCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbi8qKlxuICogVHJ1ZSBpZmYgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIElQIGFkZHJlc3MgcGF0dGVybi5cbiAqXG4gKiBQYXR0ZXJuIGFuZCBtYXNrIHNwZWNpZmljYXRpb24gaXMgZG9uZSB0aGUgc2FtZSB3YXkgYXMgZm9yIFNPQ0tTIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBgIGpzXG4gKiBpc0luTmV0KGhvc3QsIFwiMTk4Ljk1LjI0OS43OVwiLCBcIjI1NS4yNTUuMjU1LjI1NVwiKVxuICogICAvLyBpcyB0cnVlIGlmZiB0aGUgSVAgYWRkcmVzcyBvZiBob3N0IG1hdGNoZXMgZXhhY3RseSAxOTguOTUuMjQ5Ljc5LlxuICpcbiAqIGlzSW5OZXQoaG9zdCwgXCIxOTguOTUuMC4wXCIsIFwiMjU1LjI1NS4wLjBcIilcbiAqICAgLy8gaXMgdHJ1ZSBpZmYgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgbWF0Y2hlcyAxOTguOTUuKi4qLlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhvc3QgYSBETlMgaG9zdG5hbWUsIG9yIElQIGFkZHJlc3MuIElmIGEgaG9zdG5hbWUgaXMgcGFzc2VkLFxuICogICBpdCB3aWxsIGJlIHJlc292ZWQgaW50byBhbiBJUCBhZGRyZXNzIGJ5IHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0dGVybiBhbiBJUCBhZGRyZXNzIHBhdHRlcm4gaW4gdGhlIGRvdC1zZXBhcmF0ZWQgZm9ybWF0IG1hc2suXG4gKiBAcGFyYW0ge1N0cmluZ30gbWFzayBmb3IgdGhlIElQIGFkZHJlc3MgcGF0dGVybiBpbmZvcm1pbmcgd2hpY2ggcGFydHMgb2YgdGhlXG4gKiAgIElQIGFkZHJlc3Mgc2hvdWxkIGJlIG1hdGNoZWQgYWdhaW5zdC4gMCBtZWFucyBpZ25vcmUsIDI1NSBtZWFucyBtYXRjaC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzSW5OZXQoaG9zdCwgcGF0dGVybiwgbWFzaykge1xuICAgIGNvbnN0IGZhbWlseSA9IDQ7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaXAgPSBhd2FpdCAoMCwgdXRpbF8xLmRuc0xvb2t1cCkoaG9zdCwgeyBmYW1pbHkgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgaXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXRtYXNrID0gbmV3IG5ldG1hc2tfMS5OZXRtYXNrKHBhdHRlcm4sIG1hc2spO1xuICAgICAgICAgICAgcmV0dXJuIG5ldG1hc2suY29udGFpbnMoaXApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGlzSW5OZXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc0luTmV0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBUcnVlIGlmZiB0aGVyZSBpcyBubyBkb21haW4gbmFtZSBpbiB0aGUgaG9zdG5hbWUgKG5vIGRvdHMpLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYCBqc1xuICogaXNQbGFpbkhvc3ROYW1lKFwid3d3XCIpXG4gKiAgIC8vIGlzIHRydWUuXG4gKlxuICogaXNQbGFpbkhvc3ROYW1lKFwid3d3Lm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyBpcyBmYWxzZS5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3N0IFRoZSBob3N0bmFtZSBmcm9tIHRoZSBVUkwgKGV4Y2x1ZGluZyBwb3J0IG51bWJlcikuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiBpc1BsYWluSG9zdE5hbWUoaG9zdCkge1xuICAgIHJldHVybiAhL1xcLi8udGVzdChob3N0KTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGlzUGxhaW5Ib3N0TmFtZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzUGxhaW5Ib3N0TmFtZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG4vKipcbiAqIFRyaWVzIHRvIHJlc29sdmUgdGhlIGhvc3RuYW1lLiBSZXR1cm5zIHRydWUgaWYgc3VjY2VlZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhvc3QgaXMgdGhlIGhvc3RuYW1lIGZyb20gdGhlIFVSTC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzUmVzb2x2YWJsZShob3N0KSB7XG4gICAgY29uc3QgZmFtaWx5ID0gNDtcbiAgICB0cnkge1xuICAgICAgICBpZiAoYXdhaXQgKDAsIHV0aWxfMS5kbnNMb29rdXApKGhvc3QsIHsgZmFtaWx5IH0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBpc1Jlc29sdmFibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc1Jlc29sdmFibGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIElzIHRydWUgaWYgdGhlIGhvc3RuYW1lIG1hdGNoZXMgZXhhY3RseSB0aGUgc3BlY2lmaWVkIGhvc3RuYW1lLCBvciBpZiB0aGVyZSBpc1xuICogbm8gZG9tYWluIG5hbWUgcGFydCBpbiB0aGUgaG9zdG5hbWUsIGJ1dCB0aGUgdW5xdWFsaWZpZWQgaG9zdG5hbWUgbWF0Y2hlcy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIGxvY2FsSG9zdE9yRG9tYWluSXMoXCJ3d3cubmV0c2NhcGUuY29tXCIsIFwid3d3Lm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyBpcyB0cnVlIChleGFjdCBtYXRjaCkuXG4gKlxuICogbG9jYWxIb3N0T3JEb21haW5JcyhcInd3d1wiLCBcInd3dy5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgdHJ1ZSAoaG9zdG5hbWUgbWF0Y2gsIGRvbWFpbiBub3Qgc3BlY2lmaWVkKS5cbiAqXG4gKiBsb2NhbEhvc3RPckRvbWFpbklzKFwid3d3Lm1jb20uY29tXCIsIFwid3d3Lm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyBpcyBmYWxzZSAoZG9tYWluIG5hbWUgbWlzbWF0Y2gpLlxuICpcbiAqIGxvY2FsSG9zdE9yRG9tYWluSXMoXCJob21lLm5ldHNjYXBlLmNvbVwiLCBcInd3dy5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgZmFsc2UgKGhvc3RuYW1lIG1pc21hdGNoKS5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3N0IHRoZSBob3N0bmFtZSBmcm9tIHRoZSBVUkwuXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdGRvbSBmdWxseSBxdWFsaWZpZWQgaG9zdG5hbWUgdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGxvY2FsSG9zdE9yRG9tYWluSXMoaG9zdCwgaG9zdGRvbSkge1xuICAgIGNvbnN0IHBhcnRzID0gaG9zdC5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGRvbXBhcnRzID0gaG9zdGRvbS5zcGxpdCgnLicpO1xuICAgIGxldCBtYXRjaGVzID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXJ0c1tpXSAhPT0gZG9tcGFydHNbaV0pIHtcbiAgICAgICAgICAgIG1hdGNoZXMgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gbG9jYWxIb3N0T3JEb21haW5Jcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvY2FsSG9zdE9yRG9tYWluSXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBpcF8xID0gcmVxdWlyZShcIi4vaXBcIik7XG5jb25zdCBuZXRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwibmV0XCIpKTtcbi8qKlxuICogUmV0dXJucyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0aGF0IHRoZSBOYXZpZ2F0b3IgaXMgcnVubmluZyBvbiwgYXNcbiAqIGEgc3RyaW5nIGluIHRoZSBkb3Qtc2VwYXJhdGVkIGludGVnZXIgZm9ybWF0LlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgIGpzXG4gKiBteUlwQWRkcmVzcygpXG4gKiAgIC8vIHdvdWxkIHJldHVybiB0aGUgc3RyaW5nIFwiMTk4Ljk1LjI0OS43OVwiIGlmIHlvdSB3ZXJlIHJ1bm5pbmcgdGhlXG4gKiAgIC8vIE5hdmlnYXRvciBvbiB0aGF0IGhvc3QuXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IGV4dGVybmFsIElQIGFkZHJlc3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbXlJcEFkZHJlc3MoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gOC44LjguODo1MyBpcyBcIkdvb2dsZSBQdWJsaWMgRE5TXCI6XG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3B1YmxpYy1kbnMvXG4gICAgICAgIGNvbnN0IHNvY2tldCA9IG5ldF8xLmRlZmF1bHQuY29ubmVjdCh7IGhvc3Q6ICc4LjguOC44JywgcG9ydDogNTMgfSk7XG4gICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBpZiB3ZSBmYWlsIHRvIGFjY2VzcyBHb29nbGUgRE5TIChhcyBpbiBmaXJld2FsbCBibG9ja3MgYWNjZXNzKSxcbiAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIHF1ZXJ5aW5nIElQIGxvY2FsbHlcbiAgICAgICAgICAgIHJlc29sdmUoaXBfMS5pcC5hZGRyZXNzKCkpO1xuICAgICAgICB9O1xuICAgICAgICBzb2NrZXQub25jZSgnZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgc29ja2V0Lm9uY2UoJ2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgICBjb25zdCBhZGRyID0gc29ja2V0LmFkZHJlc3MoKTtcbiAgICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFkZHIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShhZGRyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFkZHIuYWRkcmVzcykge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoYWRkci5hZGRyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgYHN0cmluZ2AnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gbXlJcEFkZHJlc3M7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1teUlwQWRkcmVzcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHNoZWxsXG4gKiBleHByZXNzaW9uLlxuICpcbiAqIEFjdHVhbGx5LCBjdXJyZW50bHkgdGhlIHBhdHRlcm5zIGFyZSBzaGVsbCBleHByZXNzaW9ucyxcbiAqIG5vdCByZWd1bGFyIGV4cHJlc3Npb25zLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYCBqc1xuICogc2hFeHBNYXRjaChcImh0dHA6Ly9ob21lLm5ldHNjYXBlLmNvbS9wZW9wbGUvYXJpL2luZGV4Lmh0bWxcIiwgXCIqXFwvYXJpLypcIilcbiAqICAgLy8gaXMgdHJ1ZS5cbiAqXG4gKiBzaEV4cE1hdGNoKFwiaHR0cDovL2hvbWUubmV0c2NhcGUuY29tL3Blb3BsZS9tb250dWxsaS9pbmRleC5odG1sXCIsIFwiKlxcL2FyaS8qXCIpXG4gKiAgIC8vIGlzIGZhbHNlLlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBpcyBhbnkgc3RyaW5nIHRvIGNvbXBhcmUgKGUuZy4gdGhlIFVSTCwgb3IgdGhlIGhvc3RuYW1lKS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzaGV4cCBpcyBhIHNoZWxsIGV4cHJlc3Npb24gdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgdGhlIHNoZWxsIGV4cHJlc3Npb24uXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIHNoRXhwTWF0Y2goc3RyLCBzaGV4cCkge1xuICAgIGNvbnN0IHJlID0gdG9SZWdFeHAoc2hleHApO1xuICAgIHJldHVybiByZS50ZXN0KHN0cik7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBzaEV4cE1hdGNoO1xuLyoqXG4gKiBDb252ZXJ0cyBhIFwic2hlbGwgZXhwcmVzc2lvblwiIHRvIGEgSmF2YVNjcmlwdCBSZWdFeHAuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHRvUmVnRXhwKHN0cikge1xuICAgIHN0ciA9IFN0cmluZyhzdHIpXG4gICAgICAgIC5yZXBsYWNlKC9cXC4vZywgJ1xcXFwuJylcbiAgICAgICAgLnJlcGxhY2UoL1xcPy9nLCAnLicpXG4gICAgICAgIC5yZXBsYWNlKC9cXCovZywgJy4qJyk7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3N0cn0kYCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaEV4cE1hdGNoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBUcnVlIGR1cmluZyAob3IgYmV0d2VlbikgdGhlIHNwZWNpZmllZCB0aW1lKHMpLlxuICpcbiAqIEV2ZW4gdGhvdWdoIHRoZSBleGFtcGxlcyBkb24ndCBzaG93IGl0LCB0aGlzIHBhcmFtZXRlciBtYXkgYmUgcHJlc2VudCBpblxuICogZWFjaCBvZiB0aGUgZGlmZmVyZW50IHBhcmFtZXRlciBwcm9maWxlcywgYWx3YXlzIGFzIHRoZSBsYXN0IHBhcmFtZXRlci5cbiAqXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBgIGpzXG4gKiB0aW1lcmFuZ2UoMTIpXG4gKiB0cnVlIGZyb20gbm9vbiB0byAxcG0uXG4gKlxuICogdGltZXJhbmdlKDEyLCAxMylcbiAqIHNhbWUgYXMgYWJvdmUuXG4gKlxuICogdGltZXJhbmdlKDEyLCBcIkdNVFwiKVxuICogdHJ1ZSBmcm9tIG5vb24gdG8gMXBtLCBpbiBHTVQgdGltZXpvbmUuXG4gKlxuICogdGltZXJhbmdlKDksIDE3KVxuICogdHJ1ZSBmcm9tIDlhbSB0byA1cG0uXG4gKlxuICogdGltZXJhbmdlKDgsIDMwLCAxNywgMDApXG4gKiB0cnVlIGZyb20gODozMGFtIHRvIDU6MDBwbS5cbiAqXG4gKiB0aW1lcmFuZ2UoMCwgMCwgMCwgMCwgMCwgMzApXG4gKiB0cnVlIGJldHdlZW4gbWlkbmlnaHQgYW5kIDMwIHNlY29uZHMgcGFzdCBtaWRuaWdodC5cbiAqIGBgYFxuICpcbiAqIHRpbWVSYW5nZShob3VyKVxuICogdGltZVJhbmdlKGhvdXIxLCBob3VyMilcbiAqIHRpbWVSYW5nZShob3VyMSwgbWluMSwgaG91cjIsIG1pbjIpXG4gKiB0aW1lUmFuZ2UoaG91cjEsIG1pbjEsIHNlYzEsIGhvdXIyLCBtaW4yLCBzZWMyKVxuICogdGltZVJhbmdlKGhvdXIxLCBtaW4xLCBzZWMxLCBob3VyMiwgbWluMiwgc2VjMiwgZ210KVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3VyIGlzIHRoZSBob3VyIGZyb20gMCB0byAyMy4gKDAgaXMgbWlkbmlnaHQsIDIzIGlzIDExIHBtLilcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW4gbWludXRlcyBmcm9tIDAgdG8gNTkuXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VjIHNlY29uZHMgZnJvbSAwIHRvIDU5LlxuICogQHBhcmFtIHtTdHJpbmd9IGdtdCBlaXRoZXIgdGhlIHN0cmluZyBcIkdNVFwiIGZvciBHTVQgdGltZXpvbmUsIG9yIG5vdCBzcGVjaWZpZWQsIGZvciBsb2NhbCB0aW1lem9uZS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIHRpbWVSYW5nZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgY29uc3QgbGFzdEFyZyA9IGFyZ3MucG9wKCk7XG4gICAgY29uc3QgdXNlR01Uem9uZSA9IGxhc3RBcmcgPT09ICdHTVQnO1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcbiAgICBpZiAoIXVzZUdNVHpvbmUpIHtcbiAgICAgICAgYXJncy5wdXNoKGxhc3RBcmcpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgY29uc3Qgbm9PZkFyZ3MgPSBhcmdzLmxlbmd0aDtcbiAgICBjb25zdCBudW1lcmljQXJncyA9IGFyZ3MubWFwKChuKSA9PiBwYXJzZUludChuLCAxMCkpO1xuICAgIC8vIHRpbWVSYW5nZShob3VyKVxuICAgIGlmIChub09mQXJncyA9PT0gMSkge1xuICAgICAgICByZXN1bHQgPSBnZXRDdXJyZW50SG91cih1c2VHTVR6b25lLCBjdXJyZW50RGF0ZSkgPT09IG51bWVyaWNBcmdzWzBdO1xuICAgICAgICAvLyB0aW1lUmFuZ2UoaG91cjEsIGhvdXIyKVxuICAgIH1cbiAgICBlbHNlIGlmIChub09mQXJncyA9PT0gMikge1xuICAgICAgICBjb25zdCBjdXJyZW50SG91ciA9IGdldEN1cnJlbnRIb3VyKHVzZUdNVHpvbmUsIGN1cnJlbnREYXRlKTtcbiAgICAgICAgcmVzdWx0ID0gbnVtZXJpY0FyZ3NbMF0gPD0gY3VycmVudEhvdXIgJiYgY3VycmVudEhvdXIgPCBudW1lcmljQXJnc1sxXTtcbiAgICAgICAgLy8gdGltZVJhbmdlKGhvdXIxLCBtaW4xLCBob3VyMiwgbWluMilcbiAgICB9XG4gICAgZWxzZSBpZiAobm9PZkFyZ3MgPT09IDQpIHtcbiAgICAgICAgcmVzdWx0ID0gdmFsdWVJblJhbmdlKHNlY29uZHNFbGFwc2VkVG9kYXkobnVtZXJpY0FyZ3NbMF0sIG51bWVyaWNBcmdzWzFdLCAwKSwgc2Vjb25kc0VsYXBzZWRUb2RheShnZXRDdXJyZW50SG91cih1c2VHTVR6b25lLCBjdXJyZW50RGF0ZSksIGdldEN1cnJlbnRNaW51dGUodXNlR01Uem9uZSwgY3VycmVudERhdGUpLCAwKSwgc2Vjb25kc0VsYXBzZWRUb2RheShudW1lcmljQXJnc1syXSwgbnVtZXJpY0FyZ3NbM10sIDU5KSk7XG4gICAgICAgIC8vIHRpbWVSYW5nZShob3VyMSwgbWluMSwgc2VjMSwgaG91cjIsIG1pbjIsIHNlYzIpXG4gICAgfVxuICAgIGVsc2UgaWYgKG5vT2ZBcmdzID09PSA2KSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlSW5SYW5nZShzZWNvbmRzRWxhcHNlZFRvZGF5KG51bWVyaWNBcmdzWzBdLCBudW1lcmljQXJnc1sxXSwgbnVtZXJpY0FyZ3NbMl0pLCBzZWNvbmRzRWxhcHNlZFRvZGF5KGdldEN1cnJlbnRIb3VyKHVzZUdNVHpvbmUsIGN1cnJlbnREYXRlKSwgZ2V0Q3VycmVudE1pbnV0ZSh1c2VHTVR6b25lLCBjdXJyZW50RGF0ZSksIGdldEN1cnJlbnRTZWNvbmQodXNlR01Uem9uZSwgY3VycmVudERhdGUpKSwgc2Vjb25kc0VsYXBzZWRUb2RheShudW1lcmljQXJnc1szXSwgbnVtZXJpY0FyZ3NbNF0sIG51bWVyaWNBcmdzWzVdKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnRzLmRlZmF1bHQgPSB0aW1lUmFuZ2U7XG5mdW5jdGlvbiBzZWNvbmRzRWxhcHNlZFRvZGF5KGhoLCBtbSwgc3MpIHtcbiAgICByZXR1cm4gaGggKiAzNjAwICsgbW0gKiA2MCArIHNzO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudEhvdXIoZ210LCBjdXJyZW50RGF0ZSkge1xuICAgIHJldHVybiBnbXQgPyBjdXJyZW50RGF0ZS5nZXRVVENIb3VycygpIDogY3VycmVudERhdGUuZ2V0SG91cnMoKTtcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRNaW51dGUoZ210LCBjdXJyZW50RGF0ZSkge1xuICAgIHJldHVybiBnbXQgPyBjdXJyZW50RGF0ZS5nZXRVVENNaW51dGVzKCkgOiBjdXJyZW50RGF0ZS5nZXRNaW51dGVzKCk7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50U2Vjb25kKGdtdCwgY3VycmVudERhdGUpIHtcbiAgICByZXR1cm4gZ210ID8gY3VycmVudERhdGUuZ2V0VVRDU2Vjb25kcygpIDogY3VycmVudERhdGUuZ2V0U2Vjb25kcygpO1xufVxuLy8gc3RhcnQgPD0gdmFsdWUgPD0gZmluaXNoXG5mdW5jdGlvbiB2YWx1ZUluUmFuZ2Uoc3RhcnQsIHZhbHVlLCBmaW5pc2gpIHtcbiAgICByZXR1cm4gc3RhcnQgPD0gdmFsdWUgJiYgdmFsdWUgPD0gZmluaXNoO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltZVJhbmdlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0dNVCA9IGV4cG9ydHMuZG5zTG9va3VwID0gdm9pZCAwO1xuY29uc3QgZG5zXzEgPSByZXF1aXJlKFwiZG5zXCIpO1xuZnVuY3Rpb24gZG5zTG9va3VwKGhvc3QsIG9wdHMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAoMCwgZG5zXzEubG9va3VwKShob3N0LCBvcHRzLCAoZXJyLCByZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRuc0xvb2t1cCA9IGRuc0xvb2t1cDtcbmZ1bmN0aW9uIGlzR01UKHYpIHtcbiAgICByZXR1cm4gdiA9PT0gJ0dNVCc7XG59XG5leHBvcnRzLmlzR01UID0gaXNHTVQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbmNvbnN0IHdlZWtkYXlzID0gWydTVU4nLCAnTU9OJywgJ1RVRScsICdXRUQnLCAnVEhVJywgJ0ZSSScsICdTQVQnXTtcbi8qKlxuICogT25seSB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG1hbmRhdG9yeS4gRWl0aGVyIHRoZSBzZWNvbmQsIHRoZSB0aGlyZCwgb3IgYm90aFxuICogbWF5IGJlIGxlZnQgb3V0LlxuICpcbiAqIElmIG9ubHkgb25lIHBhcmFtZXRlciBpcyBwcmVzZW50LCB0aGUgZnVuY3Rpb24geWVpbGRzIGEgdHJ1ZSB2YWx1ZSBvbiB0aGVcbiAqIHdlZWtkYXkgdGhhdCB0aGUgcGFyYW1ldGVyIHJlcHJlc2VudHMuIElmIHRoZSBzdHJpbmcgXCJHTVRcIiBpcyBzcGVjaWZpZWQgYXNcbiAqIGEgc2Vjb25kIHBhcmFtZXRlciwgdGltZXMgYXJlIHRha2VuIHRvIGJlIGluIEdNVCwgb3RoZXJ3aXNlIGluIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIElmIGJvdGggd2QxIGFuZCB3ZDEgYXJlIGRlZmluZWQsIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBpZiB0aGUgY3VycmVudCB3ZWVrZGF5XG4gKiBpcyBpbiBiZXR3ZWVuIHRob3NlIHR3byB3ZWVrZGF5cy4gQm91bmRzIGFyZSBpbmNsdXNpdmUuIElmIHRoZSBcIkdNVFwiIHBhcmFtZXRlclxuICogaXMgc3BlY2lmaWVkLCB0aW1lcyBhcmUgdGFrZW4gdG8gYmUgaW4gR01ULCBvdGhlcndpc2UgdGhlIGxvY2FsIHRpbWV6b25lIGlzXG4gKiB1c2VkLlxuICpcbiAqIFZhbGlkIFwid2Vla2RheSBzdHJpbmdzXCIgYXJlOlxuICpcbiAqICAgICBTVU4gTU9OIFRVRSBXRUQgVEhVIEZSSSBTQVRcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIHdlZWtkYXlSYW5nZShcIk1PTlwiLCBcIkZSSVwiKVxuICogdHJ1ZSBNb25kYXkgdHJob3VnaCBGcmlkYXkgKGxvY2FsIHRpbWV6b25lKS5cbiAqXG4gKiB3ZWVrZGF5UmFuZ2UoXCJNT05cIiwgXCJGUklcIiwgXCJHTVRcIilcbiAqIHNhbWUgYXMgYWJvdmUsIGJ1dCBHTVQgdGltZXpvbmUuXG4gKlxuICogd2Vla2RheVJhbmdlKFwiU0FUXCIpXG4gKiB0cnVlIG9uIFNhdHVyZGF5cyBsb2NhbCB0aW1lLlxuICpcbiAqIHdlZWtkYXlSYW5nZShcIlNBVFwiLCBcIkdNVFwiKVxuICogdHJ1ZSBvbiBTYXR1cmRheXMgR01UIHRpbWUuXG4gKlxuICogd2Vla2RheVJhbmdlKFwiRlJJXCIsIFwiTU9OXCIpXG4gKiB0cnVlIEZyaWRheSB0aHJvdWdoIE1vbmRheSAobm90ZSwgb3JkZXIgZG9lcyBtYXR0ZXIhKS5cbiAqIGBgYFxuICpcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gd2QxIG9uZSBvZiB0aGUgd2Vla2RheSBzdHJpbmdzLlxuICogQHBhcmFtIHtTdHJpbmd9IHdkMiBvbmUgb2YgdGhlIHdlZWtkYXkgc3RyaW5ncy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBnbXQgaXMgZWl0aGVyIHRoZSBzdHJpbmc6IEdNVCBvciBpcyBsZWZ0IG91dC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHdlZWtkYXlSYW5nZSh3ZDEsIHdkMiwgZ210KSB7XG4gICAgbGV0IHVzZUdNVHpvbmUgPSBmYWxzZTtcbiAgICBsZXQgd2QxSW5kZXggPSAtMTtcbiAgICBsZXQgd2QySW5kZXggPSAtMTtcbiAgICBsZXQgd2QySXNHbXQgPSBmYWxzZTtcbiAgICBpZiAoKDAsIHV0aWxfMS5pc0dNVCkoZ210KSkge1xuICAgICAgICB1c2VHTVR6b25lID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKDAsIHV0aWxfMS5pc0dNVCkod2QyKSkge1xuICAgICAgICB1c2VHTVR6b25lID0gdHJ1ZTtcbiAgICAgICAgd2QySXNHbXQgPSB0cnVlO1xuICAgIH1cbiAgICB3ZDFJbmRleCA9IHdlZWtkYXlzLmluZGV4T2Yod2QxKTtcbiAgICBpZiAoIXdkMklzR210ICYmIGlzV2Vla2RheSh3ZDIpKSB7XG4gICAgICAgIHdkMkluZGV4ID0gd2Vla2RheXMuaW5kZXhPZih3ZDIpO1xuICAgIH1cbiAgICBjb25zdCB0b2RheXNEYXkgPSBnZXRUb2RheXNEYXkodXNlR01Uem9uZSk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAod2QySW5kZXggPCAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHRvZGF5c0RheSA9PT0gd2QxSW5kZXg7XG4gICAgfVxuICAgIGVsc2UgaWYgKHdkMUluZGV4IDw9IHdkMkluZGV4KSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlSW5SYW5nZSh3ZDFJbmRleCwgdG9kYXlzRGF5LCB3ZDJJbmRleCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPVxuICAgICAgICAgICAgdmFsdWVJblJhbmdlKHdkMUluZGV4LCB0b2RheXNEYXksIDYpIHx8XG4gICAgICAgICAgICAgICAgdmFsdWVJblJhbmdlKDAsIHRvZGF5c0RheSwgd2QySW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gd2Vla2RheVJhbmdlO1xuZnVuY3Rpb24gZ2V0VG9kYXlzRGF5KGdtdCkge1xuICAgIHJldHVybiBnbXQgPyBuZXcgRGF0ZSgpLmdldFVUQ0RheSgpIDogbmV3IERhdGUoKS5nZXREYXkoKTtcbn1cbi8vIHN0YXJ0IDw9IHZhbHVlIDw9IGZpbmlzaFxuZnVuY3Rpb24gdmFsdWVJblJhbmdlKHN0YXJ0LCB2YWx1ZSwgZmluaXNoKSB7XG4gICAgcmV0dXJuIHN0YXJ0IDw9IHZhbHVlICYmIHZhbHVlIDw9IGZpbmlzaDtcbn1cbmZ1bmN0aW9uIGlzV2Vla2RheSh2KSB7XG4gICAgaWYgKCF2KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHdlZWtkYXlzLmluY2x1ZGVzKHYpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2Vla2RheVJhbmdlLmpzLm1hcCIsIm1vZHVsZS5leHBvcnRzID0gUGVuZDtcblxuZnVuY3Rpb24gUGVuZCgpIHtcbiAgdGhpcy5wZW5kaW5nID0gMDtcbiAgdGhpcy5tYXggPSBJbmZpbml0eTtcbiAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgdGhpcy53YWl0aW5nID0gW107XG4gIHRoaXMuZXJyb3IgPSBudWxsO1xufVxuXG5QZW5kLnByb3RvdHlwZS5nbyA9IGZ1bmN0aW9uKGZuKSB7XG4gIGlmICh0aGlzLnBlbmRpbmcgPCB0aGlzLm1heCkge1xuICAgIHBlbmRHbyh0aGlzLCBmbik7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy53YWl0aW5nLnB1c2goZm4pO1xuICB9XG59O1xuXG5QZW5kLnByb3RvdHlwZS53YWl0ID0gZnVuY3Rpb24oY2IpIHtcbiAgaWYgKHRoaXMucGVuZGluZyA9PT0gMCkge1xuICAgIGNiKHRoaXMuZXJyb3IpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2goY2IpO1xuICB9XG59O1xuXG5QZW5kLnByb3RvdHlwZS5ob2xkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBwZW5kSG9sZCh0aGlzKTtcbn07XG5cbmZ1bmN0aW9uIHBlbmRIb2xkKHNlbGYpIHtcbiAgc2VsZi5wZW5kaW5nICs9IDE7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIG9uQ2I7XG4gIGZ1bmN0aW9uIG9uQ2IoZXJyKSB7XG4gICAgaWYgKGNhbGxlZCkgdGhyb3cgbmV3IEVycm9yKFwiY2FsbGJhY2sgY2FsbGVkIHR3aWNlXCIpO1xuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgc2VsZi5lcnJvciA9IHNlbGYuZXJyb3IgfHwgZXJyO1xuICAgIHNlbGYucGVuZGluZyAtPSAxO1xuICAgIGlmIChzZWxmLndhaXRpbmcubGVuZ3RoID4gMCAmJiBzZWxmLnBlbmRpbmcgPCBzZWxmLm1heCkge1xuICAgICAgcGVuZEdvKHNlbGYsIHNlbGYud2FpdGluZy5zaGlmdCgpKTtcbiAgICB9IGVsc2UgaWYgKHNlbGYucGVuZGluZyA9PT0gMCkge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IHNlbGYubGlzdGVuZXJzO1xuICAgICAgc2VsZi5saXN0ZW5lcnMgPSBbXTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGNiTGlzdGVuZXIpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBjYkxpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgbGlzdGVuZXIoc2VsZi5lcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGVuZEdvKHNlbGYsIGZuKSB7XG4gIGZuKHBlbmRIb2xkKHNlbGYpKTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvbm9kZS1wcm9ncmVzcycpO1xuIiwiLyohXG4gKiBub2RlLXByb2dyZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAxMSBUSiBIb2xvd2F5Y2h1ayA8dGpAdmlzaW9uLW1lZGlhLmNhPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiBFeHBvc2UgYFByb2dyZXNzQmFyYC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBQcm9ncmVzc0JhcjtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgYFByb2dyZXNzQmFyYCB3aXRoIHRoZSBnaXZlbiBgZm10YCBzdHJpbmcgYW5kIGBvcHRpb25zYCBvclxuICogYHRvdGFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAgLSBgY3VycmAgY3VycmVudCBjb21wbGV0ZWQgaW5kZXhcbiAqICAgLSBgdG90YWxgIHRvdGFsIG51bWJlciBvZiB0aWNrcyB0byBjb21wbGV0ZVxuICogICAtIGB3aWR0aGAgdGhlIGRpc3BsYXllZCB3aWR0aCBvZiB0aGUgcHJvZ3Jlc3MgYmFyIGRlZmF1bHRpbmcgdG8gdG90YWxcbiAqICAgLSBgc3RyZWFtYCB0aGUgb3V0cHV0IHN0cmVhbSBkZWZhdWx0aW5nIHRvIHN0ZGVyclxuICogICAtIGBoZWFkYCBoZWFkIGNoYXJhY3RlciBkZWZhdWx0aW5nIHRvIGNvbXBsZXRlIGNoYXJhY3RlclxuICogICAtIGBjb21wbGV0ZWAgY29tcGxldGlvbiBjaGFyYWN0ZXIgZGVmYXVsdGluZyB0byBcIj1cIlxuICogICAtIGBpbmNvbXBsZXRlYCBpbmNvbXBsZXRlIGNoYXJhY3RlciBkZWZhdWx0aW5nIHRvIFwiLVwiXG4gKiAgIC0gYHJlbmRlclRocm90dGxlYCBtaW5pbXVtIHRpbWUgYmV0d2VlbiB1cGRhdGVzIGluIG1pbGxpc2Vjb25kcyBkZWZhdWx0aW5nIHRvIDE2XG4gKiAgIC0gYGNhbGxiYWNrYCBvcHRpb25hbCBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHByb2dyZXNzIGJhciBjb21wbGV0ZXNcbiAqICAgLSBgY2xlYXJgIHdpbGwgY2xlYXIgdGhlIHByb2dyZXNzIGJhciB1cG9uIHRlcm1pbmF0aW9uXG4gKlxuICogVG9rZW5zOlxuICpcbiAqICAgLSBgOmJhcmAgdGhlIHByb2dyZXNzIGJhciBpdHNlbGZcbiAqICAgLSBgOmN1cnJlbnRgIGN1cnJlbnQgdGljayBudW1iZXJcbiAqICAgLSBgOnRvdGFsYCB0b3RhbCB0aWNrc1xuICogICAtIGA6ZWxhcHNlZGAgdGltZSBlbGFwc2VkIGluIHNlY29uZHNcbiAqICAgLSBgOnBlcmNlbnRgIGNvbXBsZXRpb24gcGVyY2VudGFnZVxuICogICAtIGA6ZXRhYCBldGEgaW4gc2Vjb25kc1xuICogICAtIGA6cmF0ZWAgcmF0ZSBvZiB0aWNrcyBwZXIgc2Vjb25kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZtdFxuICogQHBhcmFtIHtvYmplY3R8bnVtYmVyfSBvcHRpb25zIG9yIHRvdGFsXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFByb2dyZXNzQmFyKGZtdCwgb3B0aW9ucykge1xuICB0aGlzLnN0cmVhbSA9IG9wdGlvbnMuc3RyZWFtIHx8IHByb2Nlc3Muc3RkZXJyO1xuXG4gIGlmICh0eXBlb2Yob3B0aW9ucykgPT0gJ251bWJlcicpIHtcbiAgICB2YXIgdG90YWwgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgICBvcHRpb25zLnRvdGFsID0gdG90YWw7XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKCdzdHJpbmcnICE9IHR5cGVvZiBmbXQpIHRocm93IG5ldyBFcnJvcignZm9ybWF0IHJlcXVpcmVkJyk7XG4gICAgaWYgKCdudW1iZXInICE9IHR5cGVvZiBvcHRpb25zLnRvdGFsKSB0aHJvdyBuZXcgRXJyb3IoJ3RvdGFsIHJlcXVpcmVkJyk7XG4gIH1cblxuICB0aGlzLmZtdCA9IGZtdDtcbiAgdGhpcy5jdXJyID0gb3B0aW9ucy5jdXJyIHx8IDA7XG4gIHRoaXMudG90YWwgPSBvcHRpb25zLnRvdGFsO1xuICB0aGlzLndpZHRoID0gb3B0aW9ucy53aWR0aCB8fCB0aGlzLnRvdGFsO1xuICB0aGlzLmNsZWFyID0gb3B0aW9ucy5jbGVhclxuICB0aGlzLmNoYXJzID0ge1xuICAgIGNvbXBsZXRlICAgOiBvcHRpb25zLmNvbXBsZXRlIHx8ICc9JyxcbiAgICBpbmNvbXBsZXRlIDogb3B0aW9ucy5pbmNvbXBsZXRlIHx8ICctJyxcbiAgICBoZWFkICAgICAgIDogb3B0aW9ucy5oZWFkIHx8IChvcHRpb25zLmNvbXBsZXRlIHx8ICc9JylcbiAgfTtcbiAgdGhpcy5yZW5kZXJUaHJvdHRsZSA9IG9wdGlvbnMucmVuZGVyVGhyb3R0bGUgIT09IDAgPyAob3B0aW9ucy5yZW5kZXJUaHJvdHRsZSB8fCAxNikgOiAwO1xuICB0aGlzLmxhc3RSZW5kZXIgPSAtSW5maW5pdHk7XG4gIHRoaXMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9O1xuICB0aGlzLnRva2VucyA9IHt9O1xuICB0aGlzLmxhc3REcmF3ID0gJyc7XG59XG5cbi8qKlxuICogXCJ0aWNrXCIgdGhlIHByb2dyZXNzIGJhciB3aXRoIG9wdGlvbmFsIGBsZW5gIGFuZCBvcHRpb25hbCBgdG9rZW5zYC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcnxvYmplY3R9IGxlbiBvciB0b2tlbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSB0b2tlbnNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUHJvZ3Jlc3NCYXIucHJvdG90eXBlLnRpY2sgPSBmdW5jdGlvbihsZW4sIHRva2Vucyl7XG4gIGlmIChsZW4gIT09IDApXG4gICAgbGVuID0gbGVuIHx8IDE7XG5cbiAgLy8gc3dhcCB0b2tlbnNcbiAgaWYgKCdvYmplY3QnID09IHR5cGVvZiBsZW4pIHRva2VucyA9IGxlbiwgbGVuID0gMTtcbiAgaWYgKHRva2VucykgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG5cbiAgLy8gc3RhcnQgdGltZSBmb3IgZXRhXG4gIGlmICgwID09IHRoaXMuY3VycikgdGhpcy5zdGFydCA9IG5ldyBEYXRlO1xuXG4gIHRoaXMuY3VyciArPSBsZW5cblxuICAvLyB0cnkgdG8gcmVuZGVyXG4gIHRoaXMucmVuZGVyKCk7XG5cbiAgLy8gcHJvZ3Jlc3MgY29tcGxldGVcbiAgaWYgKHRoaXMuY3VyciA+PSB0aGlzLnRvdGFsKSB7XG4gICAgdGhpcy5yZW5kZXIodW5kZWZpbmVkLCB0cnVlKTtcbiAgICB0aGlzLmNvbXBsZXRlID0gdHJ1ZTtcbiAgICB0aGlzLnRlcm1pbmF0ZSgpO1xuICAgIHRoaXMuY2FsbGJhY2sodGhpcyk7XG4gICAgcmV0dXJuO1xuICB9XG59O1xuXG4vKipcbiAqIE1ldGhvZCB0byByZW5kZXIgdGhlIHByb2dyZXNzIGJhciB3aXRoIG9wdGlvbmFsIGB0b2tlbnNgIHRvIHBsYWNlIGluIHRoZVxuICogcHJvZ3Jlc3MgYmFyJ3MgYGZtdGAgZmllbGQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRva2Vuc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Qcm9ncmVzc0Jhci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKHRva2VucywgZm9yY2UpIHtcbiAgZm9yY2UgPSBmb3JjZSAhPT0gdW5kZWZpbmVkID8gZm9yY2UgOiBmYWxzZTtcbiAgaWYgKHRva2VucykgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG5cbiAgaWYgKCF0aGlzLnN0cmVhbS5pc1RUWSkgcmV0dXJuO1xuXG4gIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICB2YXIgZGVsdGEgPSBub3cgLSB0aGlzLmxhc3RSZW5kZXI7XG4gIGlmICghZm9yY2UgJiYgKGRlbHRhIDwgdGhpcy5yZW5kZXJUaHJvdHRsZSkpIHtcbiAgICByZXR1cm47XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sYXN0UmVuZGVyID0gbm93O1xuICB9XG5cbiAgdmFyIHJhdGlvID0gdGhpcy5jdXJyIC8gdGhpcy50b3RhbDtcbiAgcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heChyYXRpbywgMCksIDEpO1xuXG4gIHZhciBwZXJjZW50ID0gTWF0aC5mbG9vcihyYXRpbyAqIDEwMCk7XG4gIHZhciBpbmNvbXBsZXRlLCBjb21wbGV0ZSwgY29tcGxldGVMZW5ndGg7XG4gIHZhciBlbGFwc2VkID0gbmV3IERhdGUgLSB0aGlzLnN0YXJ0O1xuICB2YXIgZXRhID0gKHBlcmNlbnQgPT0gMTAwKSA/IDAgOiBlbGFwc2VkICogKHRoaXMudG90YWwgLyB0aGlzLmN1cnIgLSAxKTtcbiAgdmFyIHJhdGUgPSB0aGlzLmN1cnIgLyAoZWxhcHNlZCAvIDEwMDApO1xuXG4gIC8qIHBvcHVsYXRlIHRoZSBiYXIgdGVtcGxhdGUgd2l0aCBwZXJjZW50YWdlcyBhbmQgdGltZXN0YW1wcyAqL1xuICB2YXIgc3RyID0gdGhpcy5mbXRcbiAgICAucmVwbGFjZSgnOmN1cnJlbnQnLCB0aGlzLmN1cnIpXG4gICAgLnJlcGxhY2UoJzp0b3RhbCcsIHRoaXMudG90YWwpXG4gICAgLnJlcGxhY2UoJzplbGFwc2VkJywgaXNOYU4oZWxhcHNlZCkgPyAnMC4wJyA6IChlbGFwc2VkIC8gMTAwMCkudG9GaXhlZCgxKSlcbiAgICAucmVwbGFjZSgnOmV0YScsIChpc05hTihldGEpIHx8ICFpc0Zpbml0ZShldGEpKSA/ICcwLjAnIDogKGV0YSAvIDEwMDApXG4gICAgICAudG9GaXhlZCgxKSlcbiAgICAucmVwbGFjZSgnOnBlcmNlbnQnLCBwZXJjZW50LnRvRml4ZWQoMCkgKyAnJScpXG4gICAgLnJlcGxhY2UoJzpyYXRlJywgTWF0aC5yb3VuZChyYXRlKSk7XG5cbiAgLyogY29tcHV0ZSB0aGUgYXZhaWxhYmxlIHNwYWNlIChub24temVybykgZm9yIHRoZSBiYXIgKi9cbiAgdmFyIGF2YWlsYWJsZVNwYWNlID0gTWF0aC5tYXgoMCwgdGhpcy5zdHJlYW0uY29sdW1ucyAtIHN0ci5yZXBsYWNlKCc6YmFyJywgJycpLmxlbmd0aCk7XG4gIGlmKGF2YWlsYWJsZVNwYWNlICYmIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpe1xuICAgIGF2YWlsYWJsZVNwYWNlID0gYXZhaWxhYmxlU3BhY2UgLSAxO1xuICB9XG5cbiAgdmFyIHdpZHRoID0gTWF0aC5taW4odGhpcy53aWR0aCwgYXZhaWxhYmxlU3BhY2UpO1xuXG4gIC8qIFRPRE86IHRoZSBmb2xsb3dpbmcgYXNzdW1lcyB0aGUgdXNlciBoYXMgb25lICc6YmFyJyB0b2tlbiAqL1xuICBjb21wbGV0ZUxlbmd0aCA9IE1hdGgucm91bmQod2lkdGggKiByYXRpbyk7XG4gIGNvbXBsZXRlID0gQXJyYXkoTWF0aC5tYXgoMCwgY29tcGxldGVMZW5ndGggKyAxKSkuam9pbih0aGlzLmNoYXJzLmNvbXBsZXRlKTtcbiAgaW5jb21wbGV0ZSA9IEFycmF5KE1hdGgubWF4KDAsIHdpZHRoIC0gY29tcGxldGVMZW5ndGggKyAxKSkuam9pbih0aGlzLmNoYXJzLmluY29tcGxldGUpO1xuXG4gIC8qIGFkZCBoZWFkIHRvIHRoZSBjb21wbGV0ZSBzdHJpbmcgKi9cbiAgaWYoY29tcGxldGVMZW5ndGggPiAwKVxuICAgIGNvbXBsZXRlID0gY29tcGxldGUuc2xpY2UoMCwgLTEpICsgdGhpcy5jaGFycy5oZWFkO1xuXG4gIC8qIGZpbGwgaW4gdGhlIGFjdHVhbCBwcm9ncmVzcyBiYXIgKi9cbiAgc3RyID0gc3RyLnJlcGxhY2UoJzpiYXInLCBjb21wbGV0ZSArIGluY29tcGxldGUpO1xuXG4gIC8qIHJlcGxhY2UgdGhlIGV4dHJhIHRva2VucyAqL1xuICBpZiAodGhpcy50b2tlbnMpIGZvciAodmFyIGtleSBpbiB0aGlzLnRva2Vucykgc3RyID0gc3RyLnJlcGxhY2UoJzonICsga2V5LCB0aGlzLnRva2Vuc1trZXldKTtcblxuICBpZiAodGhpcy5sYXN0RHJhdyAhPT0gc3RyKSB7XG4gICAgdGhpcy5zdHJlYW0uY3Vyc29yVG8oMCk7XG4gICAgdGhpcy5zdHJlYW0ud3JpdGUoc3RyKTtcbiAgICB0aGlzLnN0cmVhbS5jbGVhckxpbmUoMSk7XG4gICAgdGhpcy5sYXN0RHJhdyA9IHN0cjtcbiAgfVxufTtcblxuLyoqXG4gKiBcInVwZGF0ZVwiIHRoZSBwcm9ncmVzcyBiYXIgdG8gcmVwcmVzZW50IGFuIGV4YWN0IHBlcmNlbnRhZ2UuXG4gKiBUaGUgcmF0aW8gKGJldHdlZW4gMCBhbmQgMSkgc3BlY2lmaWVkIHdpbGwgYmUgbXVsdGlwbGllZCBieSBgdG90YWxgIGFuZFxuICogZmxvb3JlZCwgcmVwcmVzZW50aW5nIHRoZSBjbG9zZXN0IGF2YWlsYWJsZSBcInRpY2suXCIgRm9yIGV4YW1wbGUsIGlmIGFcbiAqIHByb2dyZXNzIGJhciBoYXMgYSBsZW5ndGggb2YgMyBhbmQgYHVwZGF0ZSgwLjUpYCBpcyBjYWxsZWQsIHRoZSBwcm9ncmVzc1xuICogd2lsbCBiZSBzZXQgdG8gMS5cbiAqXG4gKiBBIHJhdGlvIG9mIDAuNSB3aWxsIGF0dGVtcHQgdG8gc2V0IHRoZSBwcm9ncmVzcyB0byBoYWxmd2F5LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSByYXRpbyBUaGUgcmF0aW8gKGJldHdlZW4gMCBhbmQgMSBpbmNsdXNpdmUpIHRvIHNldCB0aGVcbiAqICAgb3ZlcmFsbCBjb21wbGV0aW9uIHRvLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Qcm9ncmVzc0Jhci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHJhdGlvLCB0b2tlbnMpIHtcbiAgdmFyIGdvYWwgPSBNYXRoLmZsb29yKHJhdGlvICogdGhpcy50b3RhbCk7XG4gIHZhciBkZWx0YSA9IGdvYWwgLSB0aGlzLmN1cnI7XG5cbiAgdGhpcy50aWNrKGRlbHRhLCB0b2tlbnMpO1xufTtcblxuLyoqXG4gKiBcImludGVycnVwdFwiIHRoZSBwcm9ncmVzcyBiYXIgYW5kIHdyaXRlIGEgbWVzc2FnZSBhYm92ZSBpdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHdyaXRlLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Qcm9ncmVzc0Jhci5wcm90b3R5cGUuaW50ZXJydXB0ID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgLy8gY2xlYXIgdGhlIGN1cnJlbnQgbGluZVxuICB0aGlzLnN0cmVhbS5jbGVhckxpbmUoKTtcbiAgLy8gbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZVxuICB0aGlzLnN0cmVhbS5jdXJzb3JUbygwKTtcbiAgLy8gd3JpdGUgdGhlIG1lc3NhZ2UgdGV4dFxuICB0aGlzLnN0cmVhbS53cml0ZShtZXNzYWdlKTtcbiAgLy8gdGVybWluYXRlIHRoZSBsaW5lIGFmdGVyIHdyaXRpbmcgdGhlIG1lc3NhZ2VcbiAgdGhpcy5zdHJlYW0ud3JpdGUoJ1xcbicpO1xuICAvLyByZS1kaXNwbGF5IHRoZSBwcm9ncmVzcyBiYXIgd2l0aCBpdHMgbGFzdERyYXdcbiAgdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5sYXN0RHJhdyk7XG59O1xuXG4vKipcbiAqIFRlcm1pbmF0ZXMgYSBwcm9ncmVzcyBiYXIuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Qcm9ncmVzc0Jhci5wcm90b3R5cGUudGVybWluYXRlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGVhcikge1xuICAgIGlmICh0aGlzLnN0cmVhbS5jbGVhckxpbmUpIHtcbiAgICAgIHRoaXMuc3RyZWFtLmNsZWFyTGluZSgpO1xuICAgICAgdGhpcy5zdHJlYW0uY3Vyc29yVG8oMCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RyZWFtLndyaXRlKCdcXG4nKTtcbiAgfVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlByb3h5QWdlbnQgPSBleHBvcnRzLnByb3hpZXMgPSB2b2lkIDA7XG5jb25zdCBodHRwID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwXCIpKTtcbmNvbnN0IGh0dHBzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwc1wiKSk7XG5jb25zdCB1cmxfMSA9IHJlcXVpcmUoXCJ1cmxcIik7XG5jb25zdCBscnVfY2FjaGVfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwibHJ1LWNhY2hlXCIpKTtcbmNvbnN0IGFnZW50X2Jhc2VfMSA9IHJlcXVpcmUoXCJhZ2VudC1iYXNlXCIpO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpO1xuY29uc3QgcHJveHlfZnJvbV9lbnZfMSA9IHJlcXVpcmUoXCJwcm94eS1mcm9tLWVudlwiKTtcbmNvbnN0IHBhY19wcm94eV9hZ2VudF8xID0gcmVxdWlyZShcInBhYy1wcm94eS1hZ2VudFwiKTtcbmNvbnN0IGh0dHBfcHJveHlfYWdlbnRfMSA9IHJlcXVpcmUoXCJodHRwLXByb3h5LWFnZW50XCIpO1xuY29uc3QgaHR0cHNfcHJveHlfYWdlbnRfMSA9IHJlcXVpcmUoXCJodHRwcy1wcm94eS1hZ2VudFwiKTtcbmNvbnN0IHNvY2tzX3Byb3h5X2FnZW50XzEgPSByZXF1aXJlKFwic29ja3MtcHJveHktYWdlbnRcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdwcm94eS1hZ2VudCcpO1xuY29uc3QgUFJPVE9DT0xTID0gW1xuICAgIC4uLmh0dHBfcHJveHlfYWdlbnRfMS5IdHRwUHJveHlBZ2VudC5wcm90b2NvbHMsXG4gICAgLi4uc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnQucHJvdG9jb2xzLFxuICAgIC4uLnBhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnQucHJvdG9jb2xzLFxuXTtcbi8qKlxuICogU3VwcG9ydGVkIHByb3h5IHR5cGVzLlxuICovXG5leHBvcnRzLnByb3hpZXMgPSB7XG4gICAgaHR0cDogW2h0dHBfcHJveHlfYWdlbnRfMS5IdHRwUHJveHlBZ2VudCwgaHR0cHNfcHJveHlfYWdlbnRfMS5IdHRwc1Byb3h5QWdlbnRdLFxuICAgIGh0dHBzOiBbaHR0cF9wcm94eV9hZ2VudF8xLkh0dHBQcm94eUFnZW50LCBodHRwc19wcm94eV9hZ2VudF8xLkh0dHBzUHJveHlBZ2VudF0sXG4gICAgc29ja3M6IFtzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudCwgc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnRdLFxuICAgIHNvY2tzNDogW3NvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50LCBzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudF0sXG4gICAgc29ja3M0YTogW3NvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50LCBzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudF0sXG4gICAgc29ja3M1OiBbc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnQsIHNvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50XSxcbiAgICBzb2NrczVoOiBbc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnQsIHNvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50XSxcbiAgICAncGFjK2RhdGEnOiBbcGFjX3Byb3h5X2FnZW50XzEuUGFjUHJveHlBZ2VudCwgcGFjX3Byb3h5X2FnZW50XzEuUGFjUHJveHlBZ2VudF0sXG4gICAgJ3BhYytmaWxlJzogW3BhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnQsIHBhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnRdLFxuICAgICdwYWMrZnRwJzogW3BhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnQsIHBhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnRdLFxuICAgICdwYWMraHR0cCc6IFtwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50LCBwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50XSxcbiAgICAncGFjK2h0dHBzJzogW3BhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnQsIHBhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnRdLFxufTtcbmZ1bmN0aW9uIGlzVmFsaWRQcm90b2NvbCh2KSB7XG4gICAgcmV0dXJuIFBST1RPQ09MUy5pbmNsdWRlcyh2KTtcbn1cbi8qKlxuICogVXNlcyB0aGUgYXBwcm9wcmlhdGUgYEFnZW50YCBzdWJjbGFzcyBiYXNlZCBvZmYgb2YgdGhlIFwicHJveHlcIlxuICogZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgYXJlIGN1cnJlbnRseSBzZXQuXG4gKlxuICogQW4gTFJVIGNhY2hlIGlzIHVzZWQsIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgY3JlYXRpb24gb2YgcHJveHlcbiAqIGBodHRwLkFnZW50YCBpbnN0YW5jZXMuXG4gKi9cbmNsYXNzIFByb3h5QWdlbnQgZXh0ZW5kcyBhZ2VudF9iYXNlXzEuQWdlbnQge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWNoZSBmb3IgYEFnZW50YCBpbnN0YW5jZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IGxydV9jYWNoZV8xLmRlZmF1bHQoeyBtYXg6IDIwIH0pO1xuICAgICAgICBkZWJ1ZygnQ3JlYXRpbmcgbmV3IFByb3h5QWdlbnQgaW5zdGFuY2U6ICVvJywgb3B0cyk7XG4gICAgICAgIHRoaXMuY29ubmVjdE9wdHMgPSBvcHRzO1xuICAgICAgICB0aGlzLmh0dHBBZ2VudCA9IG9wdHM/Lmh0dHBBZ2VudCB8fCBuZXcgaHR0cC5BZ2VudChvcHRzKTtcbiAgICAgICAgdGhpcy5odHRwc0FnZW50ID1cbiAgICAgICAgICAgIG9wdHM/Lmh0dHBzQWdlbnQgfHwgbmV3IGh0dHBzLkFnZW50KG9wdHMpO1xuICAgICAgICB0aGlzLmdldFByb3h5Rm9yVXJsID0gb3B0cz8uZ2V0UHJveHlGb3JVcmwgfHwgcHJveHlfZnJvbV9lbnZfMS5nZXRQcm94eUZvclVybDtcbiAgICB9XG4gICAgYXN5bmMgY29ubmVjdChyZXEsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgeyBzZWN1cmVFbmRwb2ludCB9ID0gb3B0cztcbiAgICAgICAgY29uc3QgaXNXZWJTb2NrZXQgPSByZXEuZ2V0SGVhZGVyKCd1cGdyYWRlJykgPT09ICd3ZWJzb2NrZXQnO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNlY3VyZUVuZHBvaW50XG4gICAgICAgICAgICA/IGlzV2ViU29ja2V0XG4gICAgICAgICAgICAgICAgPyAnd3NzOidcbiAgICAgICAgICAgICAgICA6ICdodHRwczonXG4gICAgICAgICAgICA6IGlzV2ViU29ja2V0XG4gICAgICAgICAgICAgICAgPyAnd3M6J1xuICAgICAgICAgICAgICAgIDogJ2h0dHA6JztcbiAgICAgICAgY29uc3QgaG9zdCA9IHJlcS5nZXRIZWFkZXIoJ2hvc3QnKTtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IHVybF8xLlVSTChyZXEucGF0aCwgYCR7cHJvdG9jb2x9Ly8ke2hvc3R9YCkuaHJlZjtcbiAgICAgICAgY29uc3QgcHJveHkgPSBhd2FpdCB0aGlzLmdldFByb3h5Rm9yVXJsKHVybCk7XG4gICAgICAgIGlmICghcHJveHkpIHtcbiAgICAgICAgICAgIGRlYnVnKCdQcm94eSBub3QgZW5hYmxlZCBmb3IgVVJMOiAlbycsIHVybCk7XG4gICAgICAgICAgICByZXR1cm4gc2VjdXJlRW5kcG9pbnQgPyB0aGlzLmh0dHBzQWdlbnQgOiB0aGlzLmh0dHBBZ2VudDtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1ZygnUmVxdWVzdCBVUkw6ICVvJywgdXJsKTtcbiAgICAgICAgZGVidWcoJ1Byb3h5IFVSTDogJW8nLCBwcm94eSk7XG4gICAgICAgIC8vIGF0dGVtcHQgdG8gZ2V0IGEgY2FjaGVkIGBodHRwLkFnZW50YCBpbnN0YW5jZSBmaXJzdFxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke3Byb3RvY29sfSske3Byb3h5fWA7XG4gICAgICAgIGxldCBhZ2VudCA9IHRoaXMuY2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAgICAgY29uc3QgcHJveHlVcmwgPSBuZXcgdXJsXzEuVVJMKHByb3h5KTtcbiAgICAgICAgICAgIGNvbnN0IHByb3h5UHJvdG8gPSBwcm94eVVybC5wcm90b2NvbC5yZXBsYWNlKCc6JywgJycpO1xuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkUHJvdG9jb2wocHJveHlQcm90bykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHByb3RvY29sIGZvciBwcm94eSBVUkw6ICR7cHJveHl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjdG9yID0gZXhwb3J0cy5wcm94aWVzW3Byb3h5UHJvdG9dW3NlY3VyZUVuZHBvaW50IHx8IGlzV2ViU29ja2V0ID8gMSA6IDBdO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtZWjigKZcbiAgICAgICAgICAgIGFnZW50ID0gbmV3IGN0b3IocHJveHksIHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZS5zZXQoY2FjaGVLZXksIGFnZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnKCdDYWNoZSBoaXQgZm9yIHByb3h5IFVSTDogJW8nLCBwcm94eSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IGFnZW50IG9mIHRoaXMuY2FjaGUudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGFnZW50LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxufVxuZXhwb3J0cy5Qcm94eUFnZW50ID0gUHJveHlBZ2VudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxudmFyIHBhcnNlVXJsID0gcmVxdWlyZSgndXJsJykucGFyc2U7XG5cbnZhciBERUZBVUxUX1BPUlRTID0ge1xuICBmdHA6IDIxLFxuICBnb3BoZXI6IDcwLFxuICBodHRwOiA4MCxcbiAgaHR0cHM6IDQ0MyxcbiAgd3M6IDgwLFxuICB3c3M6IDQ0Myxcbn07XG5cbnZhciBzdHJpbmdFbmRzV2l0aCA9IFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGggfHwgZnVuY3Rpb24ocykge1xuICByZXR1cm4gcy5sZW5ndGggPD0gdGhpcy5sZW5ndGggJiZcbiAgICB0aGlzLmluZGV4T2YocywgdGhpcy5sZW5ndGggLSBzLmxlbmd0aCkgIT09IC0xO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHVybCAtIFRoZSBVUkwsIG9yIHRoZSByZXN1bHQgZnJvbSB1cmwucGFyc2UuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBVUkwgb2YgdGhlIHByb3h5IHRoYXQgc2hvdWxkIGhhbmRsZSB0aGUgcmVxdWVzdCB0byB0aGVcbiAqICBnaXZlbiBVUkwuIElmIG5vIHByb3h5IGlzIHNldCwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJveHlGb3JVcmwodXJsKSB7XG4gIHZhciBwYXJzZWRVcmwgPSB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyA/IHBhcnNlVXJsKHVybCkgOiB1cmwgfHwge307XG4gIHZhciBwcm90byA9IHBhcnNlZFVybC5wcm90b2NvbDtcbiAgdmFyIGhvc3RuYW1lID0gcGFyc2VkVXJsLmhvc3Q7XG4gIHZhciBwb3J0ID0gcGFyc2VkVXJsLnBvcnQ7XG4gIGlmICh0eXBlb2YgaG9zdG5hbWUgIT09ICdzdHJpbmcnIHx8ICFob3N0bmFtZSB8fCB0eXBlb2YgcHJvdG8gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuICcnOyAgLy8gRG9uJ3QgcHJveHkgVVJMcyB3aXRob3V0IGEgdmFsaWQgc2NoZW1lIG9yIGhvc3QuXG4gIH1cblxuICBwcm90byA9IHByb3RvLnNwbGl0KCc6JywgMSlbMF07XG4gIC8vIFN0cmlwcGluZyBwb3J0cyBpbiB0aGlzIHdheSBpbnN0ZWFkIG9mIHVzaW5nIHBhcnNlZFVybC5ob3N0bmFtZSB0byBtYWtlXG4gIC8vIHN1cmUgdGhhdCB0aGUgYnJhY2tldHMgYXJvdW5kIElQdjYgYWRkcmVzc2VzIGFyZSBrZXB0LlxuICBob3N0bmFtZSA9IGhvc3RuYW1lLnJlcGxhY2UoLzpcXGQqJC8sICcnKTtcbiAgcG9ydCA9IHBhcnNlSW50KHBvcnQpIHx8IERFRkFVTFRfUE9SVFNbcHJvdG9dIHx8IDA7XG4gIGlmICghc2hvdWxkUHJveHkoaG9zdG5hbWUsIHBvcnQpKSB7XG4gICAgcmV0dXJuICcnOyAgLy8gRG9uJ3QgcHJveHkgVVJMcyB0aGF0IG1hdGNoIE5PX1BST1hZLlxuICB9XG5cbiAgdmFyIHByb3h5ID1cbiAgICBnZXRFbnYoJ25wbV9jb25maWdfJyArIHByb3RvICsgJ19wcm94eScpIHx8XG4gICAgZ2V0RW52KHByb3RvICsgJ19wcm94eScpIHx8XG4gICAgZ2V0RW52KCducG1fY29uZmlnX3Byb3h5JykgfHxcbiAgICBnZXRFbnYoJ2FsbF9wcm94eScpO1xuICBpZiAocHJveHkgJiYgcHJveHkuaW5kZXhPZignOi8vJykgPT09IC0xKSB7XG4gICAgLy8gTWlzc2luZyBzY2hlbWUgaW4gcHJveHksIGRlZmF1bHQgdG8gdGhlIHJlcXVlc3RlZCBVUkwncyBzY2hlbWUuXG4gICAgcHJveHkgPSBwcm90byArICc6Ly8nICsgcHJveHk7XG4gIH1cbiAgcmV0dXJuIHByb3h5O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIGdpdmVuIFVSTCBzaG91bGQgYmUgcHJveGllZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaG9zdG5hbWUgLSBUaGUgaG9zdCBuYW1lIG9mIHRoZSBVUkwuXG4gKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFRoZSBlZmZlY3RpdmUgcG9ydCBvZiB0aGUgVVJMLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIFVSTCBzaG91bGQgYmUgcHJveGllZC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFByb3h5KGhvc3RuYW1lLCBwb3J0KSB7XG4gIHZhciBOT19QUk9YWSA9XG4gICAgKGdldEVudignbnBtX2NvbmZpZ19ub19wcm94eScpIHx8IGdldEVudignbm9fcHJveHknKSkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCFOT19QUk9YWSkge1xuICAgIHJldHVybiB0cnVlOyAgLy8gQWx3YXlzIHByb3h5IGlmIE5PX1BST1hZIGlzIG5vdCBzZXQuXG4gIH1cbiAgaWYgKE5PX1BST1hZID09PSAnKicpIHtcbiAgICByZXR1cm4gZmFsc2U7ICAvLyBOZXZlciBwcm94eSBpZiB3aWxkY2FyZCBpcyBzZXQuXG4gIH1cblxuICByZXR1cm4gTk9fUFJPWFkuc3BsaXQoL1ssXFxzXS8pLmV2ZXJ5KGZ1bmN0aW9uKHByb3h5KSB7XG4gICAgaWYgKCFwcm94eSkge1xuICAgICAgcmV0dXJuIHRydWU7ICAvLyBTa2lwIHplcm8tbGVuZ3RoIGhvc3RzLlxuICAgIH1cbiAgICB2YXIgcGFyc2VkUHJveHkgPSBwcm94eS5tYXRjaCgvXiguKyk6KFxcZCspJC8pO1xuICAgIHZhciBwYXJzZWRQcm94eUhvc3RuYW1lID0gcGFyc2VkUHJveHkgPyBwYXJzZWRQcm94eVsxXSA6IHByb3h5O1xuICAgIHZhciBwYXJzZWRQcm94eVBvcnQgPSBwYXJzZWRQcm94eSA/IHBhcnNlSW50KHBhcnNlZFByb3h5WzJdKSA6IDA7XG4gICAgaWYgKHBhcnNlZFByb3h5UG9ydCAmJiBwYXJzZWRQcm94eVBvcnQgIT09IHBvcnQpIHtcbiAgICAgIHJldHVybiB0cnVlOyAgLy8gU2tpcCBpZiBwb3J0cyBkb24ndCBtYXRjaC5cbiAgICB9XG5cbiAgICBpZiAoIS9eWy4qXS8udGVzdChwYXJzZWRQcm94eUhvc3RuYW1lKSkge1xuICAgICAgLy8gTm8gd2lsZGNhcmRzLCBzbyBzdG9wIHByb3h5aW5nIGlmIHRoZXJlIGlzIGFuIGV4YWN0IG1hdGNoLlxuICAgICAgcmV0dXJuIGhvc3RuYW1lICE9PSBwYXJzZWRQcm94eUhvc3RuYW1lO1xuICAgIH1cblxuICAgIGlmIChwYXJzZWRQcm94eUhvc3RuYW1lLmNoYXJBdCgwKSA9PT0gJyonKSB7XG4gICAgICAvLyBSZW1vdmUgbGVhZGluZyB3aWxkY2FyZC5cbiAgICAgIHBhcnNlZFByb3h5SG9zdG5hbWUgPSBwYXJzZWRQcm94eUhvc3RuYW1lLnNsaWNlKDEpO1xuICAgIH1cbiAgICAvLyBTdG9wIHByb3h5aW5nIGlmIHRoZSBob3N0bmFtZSBlbmRzIHdpdGggdGhlIG5vX3Byb3h5IGhvc3QuXG4gICAgcmV0dXJuICFzdHJpbmdFbmRzV2l0aC5jYWxsKGhvc3RuYW1lLCBwYXJzZWRQcm94eUhvc3RuYW1lKTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBmb3IgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldEVudihrZXkpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52W2tleS50b0xvd2VyQ2FzZSgpXSB8fCBwcm9jZXNzLmVudltrZXkudG9VcHBlckNhc2UoKV0gfHwgJyc7XG59XG5cbmV4cG9ydHMuZ2V0UHJveHlGb3JVcmwgPSBnZXRQcm94eUZvclVybDtcbiIsInZhciBvbmNlID0gcmVxdWlyZSgnb25jZScpXG52YXIgZW9zID0gcmVxdWlyZSgnZW5kLW9mLXN0cmVhbScpXG52YXIgZnMgPSByZXF1aXJlKCdmcycpIC8vIHdlIG9ubHkgbmVlZCBmcyB0byBnZXQgdGhlIFJlYWRTdHJlYW0gYW5kIFdyaXRlU3RyZWFtIHByb3RvdHlwZXNcblxudmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7fVxudmFyIGFuY2llbnQgPSAvXnY/XFwuMC8udGVzdChwcm9jZXNzLnZlcnNpb24pXG5cbnZhciBpc0ZuID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbidcbn1cblxudmFyIGlzRlMgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIGlmICghYW5jaWVudCkgcmV0dXJuIGZhbHNlIC8vIG5ld2VyIG5vZGUgdmVyc2lvbiBkbyBub3QgbmVlZCB0byBjYXJlIGFib3V0IGZzIGlzIGEgc3BlY2lhbCB3YXlcbiAgaWYgKCFmcykgcmV0dXJuIGZhbHNlIC8vIGJyb3dzZXJcbiAgcmV0dXJuIChzdHJlYW0gaW5zdGFuY2VvZiAoZnMuUmVhZFN0cmVhbSB8fCBub29wKSB8fCBzdHJlYW0gaW5zdGFuY2VvZiAoZnMuV3JpdGVTdHJlYW0gfHwgbm9vcCkpICYmIGlzRm4oc3RyZWFtLmNsb3NlKVxufVxuXG52YXIgaXNSZXF1ZXN0ID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICByZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiBpc0ZuKHN0cmVhbS5hYm9ydClcbn1cblxudmFyIGRlc3Ryb3llciA9IGZ1bmN0aW9uIChzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcsIGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrID0gb25jZShjYWxsYmFjaylcblxuICB2YXIgY2xvc2VkID0gZmFsc2VcbiAgc3RyZWFtLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjbG9zZWQgPSB0cnVlXG4gIH0pXG5cbiAgZW9zKHN0cmVhbSwge3JlYWRhYmxlOiByZWFkaW5nLCB3cml0YWJsZTogd3JpdGluZ30sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKVxuICAgIGNsb3NlZCA9IHRydWVcbiAgICBjYWxsYmFjaygpXG4gIH0pXG5cbiAgdmFyIGRlc3Ryb3llZCA9IGZhbHNlXG4gIHJldHVybiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGNsb3NlZCkgcmV0dXJuXG4gICAgaWYgKGRlc3Ryb3llZCkgcmV0dXJuXG4gICAgZGVzdHJveWVkID0gdHJ1ZVxuXG4gICAgaWYgKGlzRlMoc3RyZWFtKSkgcmV0dXJuIHN0cmVhbS5jbG9zZShub29wKSAvLyB1c2UgY2xvc2UgZm9yIGZzIHN0cmVhbXMgdG8gYXZvaWQgZmQgbGVha3NcbiAgICBpZiAoaXNSZXF1ZXN0KHN0cmVhbSkpIHJldHVybiBzdHJlYW0uYWJvcnQoKSAvLyByZXF1ZXN0LmRlc3Ryb3kganVzdCBkbyAuZW5kIC0gLmFib3J0IGlzIHdoYXQgd2Ugd2FudFxuXG4gICAgaWYgKGlzRm4oc3RyZWFtLmRlc3Ryb3kpKSByZXR1cm4gc3RyZWFtLmRlc3Ryb3koKVxuXG4gICAgY2FsbGJhY2soZXJyIHx8IG5ldyBFcnJvcignc3RyZWFtIHdhcyBkZXN0cm95ZWQnKSlcbiAgfVxufVxuXG52YXIgY2FsbCA9IGZ1bmN0aW9uIChmbikge1xuICBmbigpXG59XG5cbnZhciBwaXBlID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gIHJldHVybiBmcm9tLnBpcGUodG8pXG59XG5cbnZhciBwdW1wID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RyZWFtcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgdmFyIGNhbGxiYWNrID0gaXNGbihzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV0gfHwgbm9vcCkgJiYgc3RyZWFtcy5wb3AoKSB8fCBub29wXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RyZWFtc1swXSkpIHN0cmVhbXMgPSBzdHJlYW1zWzBdXG4gIGlmIChzdHJlYW1zLmxlbmd0aCA8IDIpIHRocm93IG5ldyBFcnJvcigncHVtcCByZXF1aXJlcyB0d28gc3RyZWFtcyBwZXIgbWluaW11bScpXG5cbiAgdmFyIGVycm9yXG4gIHZhciBkZXN0cm95cyA9IHN0cmVhbXMubWFwKGZ1bmN0aW9uIChzdHJlYW0sIGkpIHtcbiAgICB2YXIgcmVhZGluZyA9IGkgPCBzdHJlYW1zLmxlbmd0aCAtIDFcbiAgICB2YXIgd3JpdGluZyA9IGkgPiAwXG4gICAgcmV0dXJuIGRlc3Ryb3llcihzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmICghZXJyb3IpIGVycm9yID0gZXJyXG4gICAgICBpZiAoZXJyKSBkZXN0cm95cy5mb3JFYWNoKGNhbGwpXG4gICAgICBpZiAocmVhZGluZykgcmV0dXJuXG4gICAgICBkZXN0cm95cy5mb3JFYWNoKGNhbGwpXG4gICAgICBjYWxsYmFjayhlcnJvcilcbiAgICB9KVxuICB9KVxuXG4gIHJldHVybiBzdHJlYW1zLnJlZHVjZShwaXBlKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHB1bXBcbiIsIm1vZHVsZS5leHBvcnRzID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcHJvY2Vzcy5uZXh0VGljayA9PT0gJ2Z1bmN0aW9uJylcbiAgPyBwcm9jZXNzLm5leHRUaWNrLmJpbmQocHJvY2VzcylcbiAgOiByZXF1aXJlKCcuL3F1ZXVlLW1pY3JvdGFzaycpXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayA9PT0gJ2Z1bmN0aW9uJyA/IHF1ZXVlTWljcm90YXNrIDogKGZuKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZuKVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZnMgPSByZXF1aXJlKCdmcycpLFxuICBqb2luID0gcmVxdWlyZSgncGF0aCcpLmpvaW4sXG4gIHJlc29sdmUgPSByZXF1aXJlKCdwYXRoJykucmVzb2x2ZSxcbiAgZGlybmFtZSA9IHJlcXVpcmUoJ3BhdGgnKS5kaXJuYW1lLFxuICBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBleHRlbnNpb25zOiBbJ2pzJywgJ2pzb24nLCAnY29mZmVlJ10sXG4gICAgcmVjdXJzZTogdHJ1ZSxcbiAgICByZW5hbWU6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIHZpc2l0OiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgfTtcblxuZnVuY3Rpb24gY2hlY2tGaWxlSW5jbHVzaW9uKHBhdGgsIGZpbGVuYW1lLCBvcHRpb25zKSB7XG4gIHJldHVybiAoXG4gICAgLy8gdmVyaWZ5IGZpbGUgaGFzIHZhbGlkIGV4dGVuc2lvblxuICAgIChuZXcgUmVnRXhwKCdcXFxcLignICsgb3B0aW9ucy5leHRlbnNpb25zLmpvaW4oJ3wnKSArICcpJCcsICdpJykudGVzdChmaWxlbmFtZSkpICYmXG5cbiAgICAvLyBpZiBvcHRpb25zLmluY2x1ZGUgaXMgYSBSZWdFeHAsIGV2YWx1YXRlIGl0IGFuZCBtYWtlIHN1cmUgdGhlIHBhdGggcGFzc2VzXG4gICAgIShvcHRpb25zLmluY2x1ZGUgJiYgb3B0aW9ucy5pbmNsdWRlIGluc3RhbmNlb2YgUmVnRXhwICYmICFvcHRpb25zLmluY2x1ZGUudGVzdChwYXRoKSkgJiZcblxuICAgIC8vIGlmIG9wdGlvbnMuaW5jbHVkZSBpcyBhIGZ1bmN0aW9uLCBldmFsdWF0ZSBpdCBhbmQgbWFrZSBzdXJlIHRoZSBwYXRoIHBhc3Nlc1xuICAgICEob3B0aW9ucy5pbmNsdWRlICYmIHR5cGVvZiBvcHRpb25zLmluY2x1ZGUgPT09ICdmdW5jdGlvbicgJiYgIW9wdGlvbnMuaW5jbHVkZShwYXRoLCBmaWxlbmFtZSkpICYmXG5cbiAgICAvLyBpZiBvcHRpb25zLmV4Y2x1ZGUgaXMgYSBSZWdFeHAsIGV2YWx1YXRlIGl0IGFuZCBtYWtlIHN1cmUgdGhlIHBhdGggZG9lc24ndCBwYXNzXG4gICAgIShvcHRpb25zLmV4Y2x1ZGUgJiYgb3B0aW9ucy5leGNsdWRlIGluc3RhbmNlb2YgUmVnRXhwICYmIG9wdGlvbnMuZXhjbHVkZS50ZXN0KHBhdGgpKSAmJlxuXG4gICAgLy8gaWYgb3B0aW9ucy5leGNsdWRlIGlzIGEgZnVuY3Rpb24sIGV2YWx1YXRlIGl0IGFuZCBtYWtlIHN1cmUgdGhlIHBhdGggZG9lc24ndCBwYXNzXG4gICAgIShvcHRpb25zLmV4Y2x1ZGUgJiYgdHlwZW9mIG9wdGlvbnMuZXhjbHVkZSA9PT0gJ2Z1bmN0aW9uJyAmJiBvcHRpb25zLmV4Y2x1ZGUocGF0aCwgZmlsZW5hbWUpKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXF1aXJlRGlyZWN0b3J5KG0sIHBhdGgsIG9wdGlvbnMpIHtcbiAgdmFyIHJldHZhbCA9IHt9O1xuXG4gIC8vIHBhdGggaXMgb3B0aW9uYWxcbiAgaWYgKHBhdGggJiYgIW9wdGlvbnMgJiYgdHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucyA9IHBhdGg7XG4gICAgcGF0aCA9IG51bGw7XG4gIH1cblxuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGZvciAodmFyIHByb3AgaW4gZGVmYXVsdE9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNbcHJvcF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvcHRpb25zW3Byb3BdID0gZGVmYXVsdE9wdGlvbnNbcHJvcF07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgbm8gcGF0aCB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhlIGVxdWl2ZWxhbnQgb2YgX19kaXJuYW1lIGZyb20gY2FsbGVyXG4gIC8vIG90aGVyd2lzZSwgcmVzb2x2ZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBlcXVpdmFsZW50IG9mIF9fZGlybmFtZVxuICBwYXRoID0gIXBhdGggPyBkaXJuYW1lKG0uZmlsZW5hbWUpIDogcmVzb2x2ZShkaXJuYW1lKG0uZmlsZW5hbWUpLCBwYXRoKTtcblxuICAvLyBnZXQgdGhlIHBhdGggb2YgZWFjaCBmaWxlIGluIHNwZWNpZmllZCBkaXJlY3RvcnksIGFwcGVuZCB0byBjdXJyZW50IHRyZWUgbm9kZSwgcmVjdXJzZVxuICBmcy5yZWFkZGlyU3luYyhwYXRoKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlbmFtZSkge1xuICAgIHZhciBqb2luZWQgPSBqb2luKHBhdGgsIGZpbGVuYW1lKSxcbiAgICAgIGZpbGVzLFxuICAgICAga2V5LFxuICAgICAgb2JqO1xuXG4gICAgaWYgKGZzLnN0YXRTeW5jKGpvaW5lZCkuaXNEaXJlY3RvcnkoKSAmJiBvcHRpb25zLnJlY3Vyc2UpIHtcbiAgICAgIC8vIHRoaXMgbm9kZSBpcyBhIGRpcmVjdG9yeTsgcmVjdXJzZVxuICAgICAgZmlsZXMgPSByZXF1aXJlRGlyZWN0b3J5KG0sIGpvaW5lZCwgb3B0aW9ucyk7XG4gICAgICAvLyBleGNsdWRlIGVtcHR5IGRpcmVjdG9yaWVzXG4gICAgICBpZiAoT2JqZWN0LmtleXMoZmlsZXMpLmxlbmd0aCkge1xuICAgICAgICByZXR2YWxbb3B0aW9ucy5yZW5hbWUoZmlsZW5hbWUsIGpvaW5lZCwgZmlsZW5hbWUpXSA9IGZpbGVzO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoam9pbmVkICE9PSBtLmZpbGVuYW1lICYmIGNoZWNrRmlsZUluY2x1c2lvbihqb2luZWQsIGZpbGVuYW1lLCBvcHRpb25zKSkge1xuICAgICAgICAvLyBoYXNoIG5vZGUga2V5IHNob3VsZG4ndCBpbmNsdWRlIGZpbGUgZXh0ZW5zaW9uXG4gICAgICAgIGtleSA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgICAgb2JqID0gbS5yZXF1aXJlKGpvaW5lZCk7XG4gICAgICAgIHJldHZhbFtvcHRpb25zLnJlbmFtZShrZXksIGpvaW5lZCwgZmlsZW5hbWUpXSA9IG9wdGlvbnMudmlzaXQob2JqLCBqb2luZWQsIGZpbGVuYW1lKSB8fCBvYmo7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmV0dmFsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmVEaXJlY3Rvcnk7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0cyA9IGRlZmF1bHRPcHRpb25zO1xuIiwiY29uc3QgQU5ZID0gU3ltYm9sKCdTZW1WZXIgQU5ZJylcbi8vIGhvaXN0ZWQgY2xhc3MgZm9yIGN5Y2xpYyBkZXBlbmRlbmN5XG5jbGFzcyBDb21wYXJhdG9yIHtcbiAgc3RhdGljIGdldCBBTlkgKCkge1xuICAgIHJldHVybiBBTllcbiAgfVxuXG4gIGNvbnN0cnVjdG9yIChjb21wLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgICBpZiAoY29tcC5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlKSB7XG4gICAgICAgIHJldHVybiBjb21wXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wID0gY29tcC52YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXAgPSBjb21wLnRyaW0oKS5zcGxpdCgvXFxzKy8pLmpvaW4oJyAnKVxuICAgIGRlYnVnKCdjb21wYXJhdG9yJywgY29tcCwgb3B0aW9ucylcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIHRoaXMucGFyc2UoY29tcClcblxuICAgIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICB0aGlzLnZhbHVlID0gJydcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMub3BlcmF0b3IgKyB0aGlzLnNlbXZlci52ZXJzaW9uXG4gICAgfVxuXG4gICAgZGVidWcoJ2NvbXAnLCB0aGlzKVxuICB9XG5cbiAgcGFyc2UgKGNvbXApIHtcbiAgICBjb25zdCByID0gdGhpcy5vcHRpb25zLmxvb3NlID8gcmVbdC5DT01QQVJBVE9STE9PU0VdIDogcmVbdC5DT01QQVJBVE9SXVxuICAgIGNvbnN0IG0gPSBjb21wLm1hdGNoKHIpXG5cbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgY29tcGFyYXRvcjogJHtjb21wfWApXG4gICAgfVxuXG4gICAgdGhpcy5vcGVyYXRvciA9IG1bMV0gIT09IHVuZGVmaW5lZCA/IG1bMV0gOiAnJ1xuICAgIGlmICh0aGlzLm9wZXJhdG9yID09PSAnPScpIHtcbiAgICAgIHRoaXMub3BlcmF0b3IgPSAnJ1xuICAgIH1cblxuICAgIC8vIGlmIGl0IGxpdGVyYWxseSBpcyBqdXN0ICc+JyBvciAnJyB0aGVuIGFsbG93IGFueXRoaW5nLlxuICAgIGlmICghbVsyXSkge1xuICAgICAgdGhpcy5zZW12ZXIgPSBBTllcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW12ZXIgPSBuZXcgU2VtVmVyKG1bMl0sIHRoaXMub3B0aW9ucy5sb29zZSlcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVcbiAgfVxuXG4gIHRlc3QgKHZlcnNpb24pIHtcbiAgICBkZWJ1ZygnQ29tcGFyYXRvci50ZXN0JywgdmVyc2lvbiwgdGhpcy5vcHRpb25zLmxvb3NlKVxuXG4gICAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkgfHwgdmVyc2lvbiA9PT0gQU5ZKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIHRoaXMub3B0aW9ucylcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbXAodmVyc2lvbiwgdGhpcy5vcGVyYXRvciwgdGhpcy5zZW12ZXIsIHRoaXMub3B0aW9ucylcbiAgfVxuXG4gIGludGVyc2VjdHMgKGNvbXAsIG9wdGlvbnMpIHtcbiAgICBpZiAoIShjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgQ29tcGFyYXRvciBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmFuZ2UoY29tcC52YWx1ZSwgb3B0aW9ucykudGVzdCh0aGlzLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAoY29tcC5vcGVyYXRvciA9PT0gJycpIHtcbiAgICAgIGlmIChjb21wLnZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnZhbHVlLCBvcHRpb25zKS50ZXN0KGNvbXAuc2VtdmVyKVxuICAgIH1cblxuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIFNwZWNpYWwgY2FzZXMgd2hlcmUgbm90aGluZyBjYW4gcG9zc2libHkgYmUgbG93ZXJcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgICAgKHRoaXMudmFsdWUgPT09ICc8MC4wLjAtMCcgfHwgY29tcC52YWx1ZSA9PT0gJzwwLjAuMC0wJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICAgICh0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoJzwwLjAuMCcpIHx8IGNvbXAudmFsdWUuc3RhcnRzV2l0aCgnPDAuMC4wJykpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBTYW1lIGRpcmVjdGlvbiBpbmNyZWFzaW5nICg+IG9yID49KVxuICAgIGlmICh0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gU2FtZSBkaXJlY3Rpb24gZGVjcmVhc2luZyAoPCBvciA8PSlcbiAgICBpZiAodGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIHNhbWUgU2VtVmVyIGFuZCBib3RoIHNpZGVzIGFyZSBpbmNsdXNpdmUgKDw9IG9yID49KVxuICAgIGlmIChcbiAgICAgICh0aGlzLnNlbXZlci52ZXJzaW9uID09PSBjb21wLnNlbXZlci52ZXJzaW9uKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5pbmNsdWRlcygnPScpICYmIGNvbXAub3BlcmF0b3IuaW5jbHVkZXMoJz0nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gb3Bwb3NpdGUgZGlyZWN0aW9ucyBsZXNzIHRoYW5cbiAgICBpZiAoY21wKHRoaXMuc2VtdmVyLCAnPCcsIGNvbXAuc2VtdmVyLCBvcHRpb25zKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIG9wcG9zaXRlIGRpcmVjdGlvbnMgZ3JlYXRlciB0aGFuXG4gICAgaWYgKGNtcCh0aGlzLnNlbXZlciwgJz4nLCBjb21wLnNlbXZlciwgb3B0aW9ucykgJiZcbiAgICAgIHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBhcmF0b3JcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jbXAnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2UnKVxuIiwiLy8gaG9pc3RlZCBjbGFzcyBmb3IgY3ljbGljIGRlcGVuZGVuY3lcbmNsYXNzIFJhbmdlIHtcbiAgY29uc3RydWN0b3IgKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcmFuZ2UubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSAmJlxuICAgICAgICByYW5nZS5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLnJhdywgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgICAvLyBqdXN0IHB1dCBpdCBpbiB0aGUgc2V0IGFuZCByZXR1cm5cbiAgICAgIHRoaXMucmF3ID0gcmFuZ2UudmFsdWVcbiAgICAgIHRoaXMuc2V0ID0gW1tyYW5nZV1dXG4gICAgICB0aGlzLmZvcm1hdCgpXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgdGhpcy5pbmNsdWRlUHJlcmVsZWFzZSA9ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuXG4gICAgLy8gRmlyc3QgcmVkdWNlIGFsbCB3aGl0ZXNwYWNlIGFzIG11Y2ggYXMgcG9zc2libGUgc28gd2UgZG8gbm90IGhhdmUgdG8gcmVseVxuICAgIC8vIG9uIHBvdGVudGlhbGx5IHNsb3cgcmVnZXhlcyBsaWtlIFxccyouIFRoaXMgaXMgdGhlbiBzdG9yZWQgYW5kIHVzZWQgZm9yXG4gICAgLy8gZnV0dXJlIGVycm9yIG1lc3NhZ2VzIGFzIHdlbGwuXG4gICAgdGhpcy5yYXcgPSByYW5nZVxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC5qb2luKCcgJylcblxuICAgIC8vIEZpcnN0LCBzcGxpdCBvbiB8fFxuICAgIHRoaXMuc2V0ID0gdGhpcy5yYXdcbiAgICAgIC5zcGxpdCgnfHwnKVxuICAgICAgLy8gbWFwIHRoZSByYW5nZSB0byBhIDJkIGFycmF5IG9mIGNvbXBhcmF0b3JzXG4gICAgICAubWFwKHIgPT4gdGhpcy5wYXJzZVJhbmdlKHIudHJpbSgpKSlcbiAgICAgIC8vIHRocm93IG91dCBhbnkgY29tcGFyYXRvciBsaXN0cyB0aGF0IGFyZSBlbXB0eVxuICAgICAgLy8gdGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCBpdCB3YXMgbm90IGEgdmFsaWQgcmFuZ2UsIHdoaWNoIGlzIGFsbG93ZWRcbiAgICAgIC8vIGluIGxvb3NlIG1vZGUsIGJ1dCB3aWxsIHN0aWxsIHRocm93IGlmIHRoZSBXSE9MRSByYW5nZSBpcyBpbnZhbGlkLlxuICAgICAgLmZpbHRlcihjID0+IGMubGVuZ3RoKVxuXG4gICAgaWYgKCF0aGlzLnNldC5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgU2VtVmVyIFJhbmdlOiAke3RoaXMucmF3fWApXG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGF2ZSBhbnkgdGhhdCBhcmUgbm90IHRoZSBudWxsIHNldCwgdGhyb3cgb3V0IG51bGwgc2V0cy5cbiAgICBpZiAodGhpcy5zZXQubGVuZ3RoID4gMSkge1xuICAgICAgLy8ga2VlcCB0aGUgZmlyc3Qgb25lLCBpbiBjYXNlIHRoZXkncmUgYWxsIG51bGwgc2V0c1xuICAgICAgY29uc3QgZmlyc3QgPSB0aGlzLnNldFswXVxuICAgICAgdGhpcy5zZXQgPSB0aGlzLnNldC5maWx0ZXIoYyA9PiAhaXNOdWxsU2V0KGNbMF0pKVxuICAgICAgaWYgKHRoaXMuc2V0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnNldCA9IFtmaXJzdF1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXQubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSB0aGF0IGFyZSAqLCB0aGVuIHRoZSByYW5nZSBpcyBqdXN0ICpcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuc2V0KSB7XG4gICAgICAgICAgaWYgKGMubGVuZ3RoID09PSAxICYmIGlzQW55KGNbMF0pKSB7XG4gICAgICAgICAgICB0aGlzLnNldCA9IFtjXVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZvcm1hdCgpXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHRoaXMucmFuZ2UgPSB0aGlzLnNldFxuICAgICAgLm1hcCgoY29tcHMpID0+IGNvbXBzLmpvaW4oJyAnKS50cmltKCkpXG4gICAgICAuam9pbignfHwnKVxuICAgICAgLnRyaW0oKVxuICAgIHJldHVybiB0aGlzLnJhbmdlXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VcbiAgfVxuXG4gIHBhcnNlUmFuZ2UgKHJhbmdlKSB7XG4gICAgLy8gbWVtb2l6ZSByYW5nZSBwYXJzaW5nIGZvciBwZXJmb3JtYW5jZS5cbiAgICAvLyB0aGlzIGlzIGEgdmVyeSBob3QgcGF0aCwgYW5kIGZ1bGx5IGRldGVybWluaXN0aWMuXG4gICAgY29uc3QgbWVtb09wdHMgPVxuICAgICAgKHRoaXMub3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRSkgfFxuICAgICAgKHRoaXMub3B0aW9ucy5sb29zZSAmJiBGTEFHX0xPT1NFKVxuICAgIGNvbnN0IG1lbW9LZXkgPSBtZW1vT3B0cyArICc6JyArIHJhbmdlXG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KG1lbW9LZXkpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFxuICAgIH1cblxuICAgIGNvbnN0IGxvb3NlID0gdGhpcy5vcHRpb25zLmxvb3NlXG4gICAgLy8gYDEuMi4zIC0gMS4yLjRgID0+IGA+PTEuMi4zIDw9MS4yLjRgXG4gICAgY29uc3QgaHIgPSBsb29zZSA/IHJlW3QuSFlQSEVOUkFOR0VMT09TRV0gOiByZVt0LkhZUEhFTlJBTkdFXVxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShociwgaHlwaGVuUmVwbGFjZSh0aGlzLm9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpKVxuICAgIGRlYnVnKCdoeXBoZW4gcmVwbGFjZScsIHJhbmdlKVxuXG4gICAgLy8gYD4gMS4yLjMgPCAxLjIuNWAgPT4gYD4xLjIuMyA8MS4yLjVgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ09NUEFSQVRPUlRSSU1dLCBjb21wYXJhdG9yVHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ2NvbXBhcmF0b3IgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYH4gMS4yLjNgID0+IGB+MS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuVElMREVUUklNXSwgdGlsZGVUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygndGlsZGUgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYF4gMS4yLjNgID0+IGBeMS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ0FSRVRUUklNXSwgY2FyZXRUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygnY2FyZXQgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJhbmdlIGlzIGNvbXBsZXRlbHkgdHJpbW1lZCBhbmRcbiAgICAvLyByZWFkeSB0byBiZSBzcGxpdCBpbnRvIGNvbXBhcmF0b3JzLlxuXG4gICAgbGV0IHJhbmdlTGlzdCA9IHJhbmdlXG4gICAgICAuc3BsaXQoJyAnKVxuICAgICAgLm1hcChjb21wID0+IHBhcnNlQ29tcGFyYXRvcihjb21wLCB0aGlzLm9wdGlvbnMpKVxuICAgICAgLmpvaW4oJyAnKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC8vID49MC4wLjAgaXMgZXF1aXZhbGVudCB0byAqXG4gICAgICAubWFwKGNvbXAgPT4gcmVwbGFjZUdURTAoY29tcCwgdGhpcy5vcHRpb25zKSlcblxuICAgIGlmIChsb29zZSkge1xuICAgICAgLy8gaW4gbG9vc2UgbW9kZSwgdGhyb3cgb3V0IGFueSB0aGF0IGFyZSBub3QgdmFsaWQgY29tcGFyYXRvcnNcbiAgICAgIHJhbmdlTGlzdCA9IHJhbmdlTGlzdC5maWx0ZXIoY29tcCA9PiB7XG4gICAgICAgIGRlYnVnKCdsb29zZSBpbnZhbGlkIGZpbHRlcicsIGNvbXAsIHRoaXMub3B0aW9ucylcbiAgICAgICAgcmV0dXJuICEhY29tcC5tYXRjaChyZVt0LkNPTVBBUkFUT1JMT09TRV0pXG4gICAgICB9KVxuICAgIH1cbiAgICBkZWJ1ZygncmFuZ2UgbGlzdCcsIHJhbmdlTGlzdClcblxuICAgIC8vIGlmIGFueSBjb21wYXJhdG9ycyBhcmUgdGhlIG51bGwgc2V0LCB0aGVuIHJlcGxhY2Ugd2l0aCBKVVNUIG51bGwgc2V0XG4gICAgLy8gaWYgbW9yZSB0aGFuIG9uZSBjb21wYXJhdG9yLCByZW1vdmUgYW55ICogY29tcGFyYXRvcnNcbiAgICAvLyBhbHNvLCBkb24ndCBpbmNsdWRlIHRoZSBzYW1lIGNvbXBhcmF0b3IgbW9yZSB0aGFuIG9uY2VcbiAgICBjb25zdCByYW5nZU1hcCA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gcmFuZ2VMaXN0Lm1hcChjb21wID0+IG5ldyBDb21wYXJhdG9yKGNvbXAsIHRoaXMub3B0aW9ucykpXG4gICAgZm9yIChjb25zdCBjb21wIG9mIGNvbXBhcmF0b3JzKSB7XG4gICAgICBpZiAoaXNOdWxsU2V0KGNvbXApKSB7XG4gICAgICAgIHJldHVybiBbY29tcF1cbiAgICAgIH1cbiAgICAgIHJhbmdlTWFwLnNldChjb21wLnZhbHVlLCBjb21wKVxuICAgIH1cbiAgICBpZiAocmFuZ2VNYXAuc2l6ZSA+IDEgJiYgcmFuZ2VNYXAuaGFzKCcnKSkge1xuICAgICAgcmFuZ2VNYXAuZGVsZXRlKCcnKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5yYW5nZU1hcC52YWx1ZXMoKV1cbiAgICBjYWNoZS5zZXQobWVtb0tleSwgcmVzdWx0KVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGludGVyc2VjdHMgKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgaWYgKCEocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgUmFuZ2UgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldC5zb21lKCh0aGlzQ29tcGFyYXRvcnMpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGlzU2F0aXNmaWFibGUodGhpc0NvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgICByYW5nZS5zZXQuc29tZSgocmFuZ2VDb21wYXJhdG9ycykgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc1NhdGlzZmlhYmxlKHJhbmdlQ29tcGFyYXRvcnMsIG9wdGlvbnMpICYmXG4gICAgICAgICAgICB0aGlzQ29tcGFyYXRvcnMuZXZlcnkoKHRoaXNDb21wYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByYW5nZUNvbXBhcmF0b3JzLmV2ZXJ5KChyYW5nZUNvbXBhcmF0b3IpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc0NvbXBhcmF0b3IuaW50ZXJzZWN0cyhyYW5nZUNvbXBhcmF0b3IsIG9wdGlvbnMpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KVxuICB9XG5cbiAgLy8gaWYgQU5ZIG9mIHRoZSBzZXRzIG1hdGNoIEFMTCBvZiBpdHMgY29tcGFyYXRvcnMsIHRoZW4gcGFzc1xuICB0ZXN0ICh2ZXJzaW9uKSB7XG4gICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGVzdFNldCh0aGlzLnNldFtpXSwgdmVyc2lvbiwgdGhpcy5vcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlXG5cbmNvbnN0IExSVSA9IHJlcXVpcmUoJ2xydS1jYWNoZScpXG5jb25zdCBjYWNoZSA9IG5ldyBMUlUoeyBtYXg6IDEwMDAgfSlcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi9jb21wYXJhdG9yJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZGVidWcnKVxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi9zZW12ZXInKVxuY29uc3Qge1xuICBzYWZlUmU6IHJlLFxuICB0LFxuICBjb21wYXJhdG9yVHJpbVJlcGxhY2UsXG4gIHRpbGRlVHJpbVJlcGxhY2UsXG4gIGNhcmV0VHJpbVJlcGxhY2UsXG59ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuY29uc3QgeyBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRSwgRkxBR19MT09TRSB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY29uc3RhbnRzJylcblxuY29uc3QgaXNOdWxsU2V0ID0gYyA9PiBjLnZhbHVlID09PSAnPDAuMC4wLTAnXG5jb25zdCBpc0FueSA9IGMgPT4gYy52YWx1ZSA9PT0gJydcblxuLy8gdGFrZSBhIHNldCBvZiBjb21wYXJhdG9ycyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmVcbi8vIGV4aXN0cyBhIHZlcnNpb24gd2hpY2ggY2FuIHNhdGlzZnkgaXRcbmNvbnN0IGlzU2F0aXNmaWFibGUgPSAoY29tcGFyYXRvcnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHJlc3VsdCA9IHRydWVcbiAgY29uc3QgcmVtYWluaW5nQ29tcGFyYXRvcnMgPSBjb21wYXJhdG9ycy5zbGljZSgpXG4gIGxldCB0ZXN0Q29tcGFyYXRvciA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLnBvcCgpXG5cbiAgd2hpbGUgKHJlc3VsdCAmJiByZW1haW5pbmdDb21wYXJhdG9ycy5sZW5ndGgpIHtcbiAgICByZXN1bHQgPSByZW1haW5pbmdDb21wYXJhdG9ycy5ldmVyeSgob3RoZXJDb21wYXJhdG9yKSA9PiB7XG4gICAgICByZXR1cm4gdGVzdENvbXBhcmF0b3IuaW50ZXJzZWN0cyhvdGhlckNvbXBhcmF0b3IsIG9wdGlvbnMpXG4gICAgfSlcblxuICAgIHRlc3RDb21wYXJhdG9yID0gcmVtYWluaW5nQ29tcGFyYXRvcnMucG9wKClcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLy8gY29tcHJpc2VkIG9mIHhyYW5nZXMsIHRpbGRlcywgc3RhcnMsIGFuZCBndGx0J3MgYXQgdGhpcyBwb2ludC5cbi8vIGFscmVhZHkgcmVwbGFjZWQgdGhlIGh5cGhlbiByYW5nZXNcbi8vIHR1cm4gaW50byBhIHNldCBvZiBKVVNUIGNvbXBhcmF0b3JzLlxuY29uc3QgcGFyc2VDb21wYXJhdG9yID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ2NvbXAnLCBjb21wLCBvcHRpb25zKVxuICBjb21wID0gcmVwbGFjZUNhcmV0cyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygnY2FyZXQnLCBjb21wKVxuICBjb21wID0gcmVwbGFjZVRpbGRlcyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygndGlsZGVzJywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VYUmFuZ2VzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCd4cmFuZ2UnLCBjb21wKVxuICBjb21wID0gcmVwbGFjZVN0YXJzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCdzdGFycycsIGNvbXApXG4gIHJldHVybiBjb21wXG59XG5cbmNvbnN0IGlzWCA9IGlkID0+ICFpZCB8fCBpZC50b0xvd2VyQ2FzZSgpID09PSAneCcgfHwgaWQgPT09ICcqJ1xuXG4vLyB+LCB+PiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIH4yLCB+Mi54LCB+Mi54LngsIH4+Miwgfj4yLnggfj4yLngueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gfjIuMCwgfjIuMC54LCB+PjIuMCwgfj4yLjAueCAtLT4gPj0yLjAuMCA8Mi4xLjAtMFxuLy8gfjEuMiwgfjEuMi54LCB+PjEuMiwgfj4xLjIueCAtLT4gPj0xLjIuMCA8MS4zLjAtMFxuLy8gfjEuMi4zLCB+PjEuMi4zIC0tPiA+PTEuMi4zIDwxLjMuMC0wXG4vLyB+MS4yLjAsIH4+MS4yLjAgLS0+ID49MS4yLjAgPDEuMy4wLTBcbi8vIH4wLjAuMSAtLT4gPj0wLjAuMSA8MC4xLjAtMFxuY29uc3QgcmVwbGFjZVRpbGRlcyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoYykgPT4gcmVwbGFjZVRpbGRlKGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZVRpbGRlID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgciA9IG9wdGlvbnMubG9vc2UgPyByZVt0LlRJTERFTE9PU0VdIDogcmVbdC5USUxERV1cbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCAoXywgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygndGlsZGUnLCBjb21wLCBfLCBNLCBtLCBwLCBwcilcbiAgICBsZXQgcmV0XG5cbiAgICBpZiAoaXNYKE0pKSB7XG4gICAgICByZXQgPSAnJ1xuICAgIH0gZWxzZSBpZiAoaXNYKG0pKSB7XG4gICAgICByZXQgPSBgPj0ke019LjAuMCA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoaXNYKHApKSB7XG4gICAgICAvLyB+MS4yID09ID49MS4yLjAgPDEuMy4wLTBcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wIDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfSBlbHNlIGlmIChwcikge1xuICAgICAgZGVidWcoJ3JlcGxhY2VUaWxkZSBwcicsIHByKVxuICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB+MS4yLjMgPT0gPj0xLjIuMyA8MS4zLjAtMFxuICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH1cblxuICAgIGRlYnVnKCd0aWxkZSByZXR1cm4nLCByZXQpXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG4vLyBeIC0tPiAqIChhbnksIGtpbmRhIHNpbGx5KVxuLy8gXjIsIF4yLngsIF4yLngueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gXjIuMCwgXjIuMC54IC0tPiA+PTIuMC4wIDwzLjAuMC0wXG4vLyBeMS4yLCBeMS4yLnggLS0+ID49MS4yLjAgPDIuMC4wLTBcbi8vIF4xLjIuMyAtLT4gPj0xLjIuMyA8Mi4wLjAtMFxuLy8gXjEuMi4wIC0tPiA+PTEuMi4wIDwyLjAuMC0wXG4vLyBeMC4wLjEgLS0+ID49MC4wLjEgPDAuMC4yLTBcbi8vIF4wLjEuMCAtLT4gPj0wLjEuMCA8MC4yLjAtMFxuY29uc3QgcmVwbGFjZUNhcmV0cyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoYykgPT4gcmVwbGFjZUNhcmV0KGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZUNhcmV0ID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ2NhcmV0JywgY29tcCwgb3B0aW9ucylcbiAgY29uc3QgciA9IG9wdGlvbnMubG9vc2UgPyByZVt0LkNBUkVUTE9PU0VdIDogcmVbdC5DQVJFVF1cbiAgY29uc3QgeiA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyAnLTAnIDogJydcbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCAoXywgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygnY2FyZXQnLCBjb21wLCBfLCBNLCBtLCBwLCBwcilcbiAgICBsZXQgcmV0XG5cbiAgICBpZiAoaXNYKE0pKSB7XG4gICAgICByZXQgPSAnJ1xuICAgIH0gZWxzZSBpZiAoaXNYKG0pKSB7XG4gICAgICByZXQgPSBgPj0ke019LjAuMCR7en0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7en0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHt6fSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlQ2FyZXQgcHInLCBwcilcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgaWYgKG0gPT09ICcwJykge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgICB9IDwke019LiR7bX0uJHsrcCArIDF9LTBgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgICB9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCdubyBwcicpXG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICAgICAgfSR7en0gPCR7TX0uJHttfS4keytwICsgMX0tMGBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICAgICAgfSR7en0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICB9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVidWcoJ2NhcmV0IHJldHVybicsIHJldClcbiAgICByZXR1cm4gcmV0XG4gIH0pXG59XG5cbmNvbnN0IHJlcGxhY2VYUmFuZ2VzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VYUmFuZ2VzJywgY29tcCwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXBcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VYUmFuZ2UoYywgb3B0aW9ucykpXG4gICAgLmpvaW4oJyAnKVxufVxuXG5jb25zdCByZXBsYWNlWFJhbmdlID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgY29tcCA9IGNvbXAudHJpbSgpXG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5YUkFOR0VMT09TRV0gOiByZVt0LlhSQU5HRV1cbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCAocmV0LCBndGx0LCBNLCBtLCBwLCBwcikgPT4ge1xuICAgIGRlYnVnKCd4UmFuZ2UnLCBjb21wLCByZXQsIGd0bHQsIE0sIG0sIHAsIHByKVxuICAgIGNvbnN0IHhNID0gaXNYKE0pXG4gICAgY29uc3QgeG0gPSB4TSB8fCBpc1gobSlcbiAgICBjb25zdCB4cCA9IHhtIHx8IGlzWChwKVxuICAgIGNvbnN0IGFueVggPSB4cFxuXG4gICAgaWYgKGd0bHQgPT09ICc9JyAmJiBhbnlYKSB7XG4gICAgICBndGx0ID0gJydcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSdyZSBpbmNsdWRpbmcgcHJlcmVsZWFzZXMgaW4gdGhlIG1hdGNoLCB0aGVuIHdlIG5lZWRcbiAgICAvLyB0byBmaXggdGhpcyB0byAtMCwgdGhlIGxvd2VzdCBwb3NzaWJsZSBwcmVyZWxlYXNlIHZhbHVlXG4gICAgcHIgPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gJy0wJyA6ICcnXG5cbiAgICBpZiAoeE0pIHtcbiAgICAgIGlmIChndGx0ID09PSAnPicgfHwgZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgaXMgYWxsb3dlZFxuICAgICAgICByZXQgPSAnPDAuMC4wLTAnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGZvcmJpZGRlblxuICAgICAgICByZXQgPSAnKidcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGd0bHQgJiYgYW55WCkge1xuICAgICAgLy8gd2Uga25vdyBwYXRjaCBpcyBhbiB4LCBiZWNhdXNlIHdlIGhhdmUgYW55IHggYXQgYWxsLlxuICAgICAgLy8gcmVwbGFjZSBYIHdpdGggMFxuICAgICAgaWYgKHhtKSB7XG4gICAgICAgIG0gPSAwXG4gICAgICB9XG4gICAgICBwID0gMFxuXG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nKSB7XG4gICAgICAgIC8vID4xID0+ID49Mi4wLjBcbiAgICAgICAgLy8gPjEuMiA9PiA+PTEuMy4wXG4gICAgICAgIGd0bHQgPSAnPj0nXG4gICAgICAgIGlmICh4bSkge1xuICAgICAgICAgIE0gPSArTSArIDFcbiAgICAgICAgICBtID0gMFxuICAgICAgICAgIHAgPSAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbSA9ICttICsgMVxuICAgICAgICAgIHAgPSAwXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZ3RsdCA9PT0gJzw9Jykge1xuICAgICAgICAvLyA8PTAuNy54IGlzIGFjdHVhbGx5IDwwLjguMCwgc2luY2UgYW55IDAuNy54IHNob3VsZFxuICAgICAgICAvLyBwYXNzLiAgU2ltaWxhcmx5LCA8PTcueCBpcyBhY3R1YWxseSA8OC4wLjAsIGV0Yy5cbiAgICAgICAgZ3RsdCA9ICc8J1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbSA9ICttICsgMVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChndGx0ID09PSAnPCcpIHtcbiAgICAgICAgcHIgPSAnLTAnXG4gICAgICB9XG5cbiAgICAgIHJldCA9IGAke2d0bHQgKyBNfS4ke219LiR7cH0ke3ByfWBcbiAgICB9IGVsc2UgaWYgKHhtKSB7XG4gICAgICByZXQgPSBgPj0ke019LjAuMCR7cHJ9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmICh4cCkge1xuICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3ByXG4gICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfVxuXG4gICAgZGVidWcoJ3hSYW5nZSByZXR1cm4nLCByZXQpXG5cbiAgICByZXR1cm4gcmV0XG4gIH0pXG59XG5cbi8vIEJlY2F1c2UgKiBpcyBBTkQtZWQgd2l0aCBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIGNvbXBhcmF0b3IsXG4vLyBhbmQgJycgbWVhbnMgXCJhbnkgdmVyc2lvblwiLCBqdXN0IHJlbW92ZSB0aGUgKnMgZW50aXJlbHkuXG5jb25zdCByZXBsYWNlU3RhcnMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZVN0YXJzJywgY29tcCwgb3B0aW9ucylcbiAgLy8gTG9vc2VuZXNzIGlzIGlnbm9yZWQgaGVyZS4gIHN0YXIgaXMgYWx3YXlzIGFzIGxvb3NlIGFzIGl0IGdldHMhXG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKHJlW3QuU1RBUl0sICcnKVxufVxuXG5jb25zdCByZXBsYWNlR1RFMCA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlR1RFMCcsIGNvbXAsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKHJlW29wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyB0LkdURTBQUkUgOiB0LkdURTBdLCAnJylcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gc3RyaW5nLnJlcGxhY2UocmVbdC5IWVBIRU5SQU5HRV0pXG4vLyBNLCBtLCBwYXRjaCwgcHJlcmVsZWFzZSwgYnVpbGRcbi8vIDEuMiAtIDMuNC41ID0+ID49MS4yLjAgPD0zLjQuNVxuLy8gMS4yLjMgLSAzLjQgPT4gPj0xLjIuMCA8My41LjAtMCBBbnkgMy40Lnggd2lsbCBkb1xuLy8gMS4yIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wLTBcbmNvbnN0IGh5cGhlblJlcGxhY2UgPSBpbmNQciA9PiAoJDAsXG4gIGZyb20sIGZNLCBmbSwgZnAsIGZwciwgZmIsXG4gIHRvLCB0TSwgdG0sIHRwLCB0cHIsIHRiKSA9PiB7XG4gIGlmIChpc1goZk0pKSB7XG4gICAgZnJvbSA9ICcnXG4gIH0gZWxzZSBpZiAoaXNYKGZtKSkge1xuICAgIGZyb20gPSBgPj0ke2ZNfS4wLjAke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfSBlbHNlIGlmIChpc1goZnApKSB7XG4gICAgZnJvbSA9IGA+PSR7Zk19LiR7Zm19LjAke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfSBlbHNlIGlmIChmcHIpIHtcbiAgICBmcm9tID0gYD49JHtmcm9tfWBcbiAgfSBlbHNlIHtcbiAgICBmcm9tID0gYD49JHtmcm9tfSR7aW5jUHIgPyAnLTAnIDogJyd9YFxuICB9XG5cbiAgaWYgKGlzWCh0TSkpIHtcbiAgICB0byA9ICcnXG4gIH0gZWxzZSBpZiAoaXNYKHRtKSkge1xuICAgIHRvID0gYDwkeyt0TSArIDF9LjAuMC0wYFxuICB9IGVsc2UgaWYgKGlzWCh0cCkpIHtcbiAgICB0byA9IGA8JHt0TX0uJHsrdG0gKyAxfS4wLTBgXG4gIH0gZWxzZSBpZiAodHByKSB7XG4gICAgdG8gPSBgPD0ke3RNfS4ke3RtfS4ke3RwfS0ke3Rwcn1gXG4gIH0gZWxzZSBpZiAoaW5jUHIpIHtcbiAgICB0byA9IGA8JHt0TX0uJHt0bX0uJHsrdHAgKyAxfS0wYFxuICB9IGVsc2Uge1xuICAgIHRvID0gYDw9JHt0b31gXG4gIH1cblxuICByZXR1cm4gYCR7ZnJvbX0gJHt0b31gLnRyaW0oKVxufVxuXG5jb25zdCB0ZXN0U2V0ID0gKHNldCwgdmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgIGlmICghc2V0W2ldLnRlc3QodmVyc2lvbikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGlmICh2ZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoICYmICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgLy8gRmluZCB0aGUgc2V0IG9mIHZlcnNpb25zIHRoYXQgYXJlIGFsbG93ZWQgdG8gaGF2ZSBwcmVyZWxlYXNlc1xuICAgIC8vIEZvciBleGFtcGxlLCBeMS4yLjMtcHIuMSBkZXN1Z2FycyB0byA+PTEuMi4zLXByLjEgPDIuMC4wXG4gICAgLy8gVGhhdCBzaG91bGQgYWxsb3cgYDEuMi4zLXByLjJgIHRvIHBhc3MuXG4gICAgLy8gSG93ZXZlciwgYDEuMi40LWFscGhhLm5vdHJlYWR5YCBzaG91bGQgTk9UIGJlIGFsbG93ZWQsXG4gICAgLy8gZXZlbiB0aG91Z2ggaXQncyB3aXRoaW4gdGhlIHJhbmdlIHNldCBieSB0aGUgY29tcGFyYXRvcnMuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlYnVnKHNldFtpXS5zZW12ZXIpXG4gICAgICBpZiAoc2V0W2ldLnNlbXZlciA9PT0gQ29tcGFyYXRvci5BTlkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWQgPSBzZXRbaV0uc2VtdmVyXG4gICAgICAgIGlmIChhbGxvd2VkLm1ham9yID09PSB2ZXJzaW9uLm1ham9yICYmXG4gICAgICAgICAgICBhbGxvd2VkLm1pbm9yID09PSB2ZXJzaW9uLm1pbm9yICYmXG4gICAgICAgICAgICBhbGxvd2VkLnBhdGNoID09PSB2ZXJzaW9uLnBhdGNoKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZlcnNpb24gaGFzIGEgLXByZSwgYnV0IGl0J3Mgbm90IG9uZSBvZiB0aGUgb25lcyB3ZSBsaWtlLlxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsImNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZGVidWcnKVxuY29uc3QgeyBNQVhfTEVOR1RILCBNQVhfU0FGRV9JTlRFR0VSIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9jb25zdGFudHMnKVxuY29uc3QgeyBzYWZlUmU6IHJlLCB0IH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgeyBjb21wYXJlSWRlbnRpZmllcnMgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lkZW50aWZpZXJzJylcbmNsYXNzIFNlbVZlciB7XG4gIGNvbnN0cnVjdG9yICh2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICAgIGlmICh2ZXJzaW9uLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UgJiZcbiAgICAgICAgICB2ZXJzaW9uLmluY2x1ZGVQcmVyZWxlYXNlID09PSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnZlcnNpb25cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB2ZXJzaW9uLiBNdXN0IGJlIGEgc3RyaW5nLiBHb3QgdHlwZSBcIiR7dHlwZW9mIHZlcnNpb259XCIuYClcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbi5sZW5ndGggPiBNQVhfTEVOR1RIKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgdmVyc2lvbiBpcyBsb25nZXIgdGhhbiAke01BWF9MRU5HVEh9IGNoYXJhY3RlcnNgXG4gICAgICApXG4gICAgfVxuXG4gICAgZGVidWcoJ1NlbVZlcicsIHZlcnNpb24sIG9wdGlvbnMpXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2VcbiAgICAvLyB0aGlzIGlzbid0IGFjdHVhbGx5IHJlbGV2YW50IGZvciB2ZXJzaW9ucywgYnV0IGtlZXAgaXQgc28gdGhhdCB3ZVxuICAgIC8vIGRvbid0IHJ1biBpbnRvIHRyb3VibGUgcGFzc2luZyB0aGlzLm9wdGlvbnMgYXJvdW5kLlxuICAgIHRoaXMuaW5jbHVkZVByZXJlbGVhc2UgPSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcblxuICAgIGNvbnN0IG0gPSB2ZXJzaW9uLnRyaW0oKS5tYXRjaChvcHRpb25zLmxvb3NlID8gcmVbdC5MT09TRV0gOiByZVt0LkZVTExdKVxuXG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFZlcnNpb246ICR7dmVyc2lvbn1gKVxuICAgIH1cblxuICAgIHRoaXMucmF3ID0gdmVyc2lvblxuXG4gICAgLy8gdGhlc2UgYXJlIGFjdHVhbGx5IG51bWJlcnNcbiAgICB0aGlzLm1ham9yID0gK21bMV1cbiAgICB0aGlzLm1pbm9yID0gK21bMl1cbiAgICB0aGlzLnBhdGNoID0gK21bM11cblxuICAgIGlmICh0aGlzLm1ham9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1ham9yIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtYWpvciB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5taW5vciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5taW5vciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWlub3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGF0Y2ggPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMucGF0Y2ggPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHBhdGNoIHZlcnNpb24nKVxuICAgIH1cblxuICAgIC8vIG51bWJlcmlmeSBhbnkgcHJlcmVsZWFzZSBudW1lcmljIGlkc1xuICAgIGlmICghbVs0XSkge1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gbVs0XS5zcGxpdCgnLicpLm1hcCgoaWQpID0+IHtcbiAgICAgICAgaWYgKC9eWzAtOV0rJC8udGVzdChpZCkpIHtcbiAgICAgICAgICBjb25zdCBudW0gPSAraWRcbiAgICAgICAgICBpZiAobnVtID49IDAgJiYgbnVtIDwgTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgcmV0dXJuIG51bVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5idWlsZCA9IG1bNV0gPyBtWzVdLnNwbGl0KCcuJykgOiBbXVxuICAgIHRoaXMuZm9ybWF0KClcbiAgfVxuXG4gIGZvcm1hdCAoKSB7XG4gICAgdGhpcy52ZXJzaW9uID0gYCR7dGhpcy5tYWpvcn0uJHt0aGlzLm1pbm9yfS4ke3RoaXMucGF0Y2h9YFxuICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICB0aGlzLnZlcnNpb24gKz0gYC0ke3RoaXMucHJlcmVsZWFzZS5qb2luKCcuJyl9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52ZXJzaW9uXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgY29tcGFyZSAob3RoZXIpIHtcbiAgICBkZWJ1ZygnU2VtVmVyLmNvbXBhcmUnLCB0aGlzLnZlcnNpb24sIHRoaXMub3B0aW9ucywgb3RoZXIpXG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBpZiAodHlwZW9mIG90aGVyID09PSAnc3RyaW5nJyAmJiBvdGhlciA9PT0gdGhpcy52ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICBpZiAob3RoZXIudmVyc2lvbiA9PT0gdGhpcy52ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbXBhcmVNYWluKG90aGVyKSB8fCB0aGlzLmNvbXBhcmVQcmUob3RoZXIpXG4gIH1cblxuICBjb21wYXJlTWFpbiAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5tYWpvciwgb3RoZXIubWFqb3IpIHx8XG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5taW5vciwgb3RoZXIubWlub3IpIHx8XG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5wYXRjaCwgb3RoZXIucGF0Y2gpXG4gICAgKVxuICB9XG5cbiAgY29tcGFyZVByZSAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIC8vIE5PVCBoYXZpbmcgYSBwcmVyZWxlYXNlIGlzID4gaGF2aW5nIG9uZVxuICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiBvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDFcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICBsZXQgaSA9IDBcbiAgICBkbyB7XG4gICAgICBjb25zdCBhID0gdGhpcy5wcmVyZWxlYXNlW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIucHJlcmVsZWFzZVtpXVxuICAgICAgZGVidWcoJ3ByZXJlbGVhc2UgY29tcGFyZScsIGksIGEsIGIpXG4gICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSBlbHNlIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpXG4gICAgICB9XG4gICAgfSB3aGlsZSAoKytpKVxuICB9XG5cbiAgY29tcGFyZUJ1aWxkIChvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMuYnVpbGRbaV1cbiAgICAgIGNvbnN0IGIgPSBvdGhlci5idWlsZFtpXVxuICAgICAgZGVidWcoJ3ByZXJlbGVhc2UgY29tcGFyZScsIGksIGEsIGIpXG4gICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSBlbHNlIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpXG4gICAgICB9XG4gICAgfSB3aGlsZSAoKytpKVxuICB9XG5cbiAgLy8gcHJlbWlub3Igd2lsbCBidW1wIHRoZSB2ZXJzaW9uIHVwIHRvIHRoZSBuZXh0IG1pbm9yIHJlbGVhc2UsIGFuZCBpbW1lZGlhdGVseVxuICAvLyBkb3duIHRvIHByZS1yZWxlYXNlLiBwcmVtYWpvciBhbmQgcHJlcGF0Y2ggd29yayB0aGUgc2FtZSB3YXkuXG4gIGluYyAocmVsZWFzZSwgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpIHtcbiAgICBzd2l0Y2ggKHJlbGVhc2UpIHtcbiAgICAgIGNhc2UgJ3ByZW1ham9yJzpcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5taW5vciA9IDBcbiAgICAgICAgdGhpcy5tYWpvcisrXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3ByZW1pbm9yJzpcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5taW5vcisrXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3ByZXBhdGNoJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbHJlYWR5IGEgcHJlcmVsZWFzZSwgaXQgd2lsbCBidW1wIHRvIHRoZSBuZXh0IHZlcnNpb25cbiAgICAgICAgLy8gZHJvcCBhbnkgcHJlcmVsZWFzZXMgdGhhdCBtaWdodCBhbHJlYWR5IGV4aXN0LCBzaW5jZSB0aGV5IGFyZSBub3RcbiAgICAgICAgLy8gcmVsZXZhbnQgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIG5vbi1wcmVyZWxlYXNlIHZlcnNpb24sIHRoaXMgYWN0cyB0aGUgc2FtZSBhc1xuICAgICAgLy8gcHJlcGF0Y2guXG4gICAgICBjYXNlICdwcmVyZWxlYXNlJzpcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgJ21ham9yJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1tYWpvciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1ham9yIHZlcnNpb24uXG4gICAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgbWFqb3IuXG4gICAgICAgIC8vIDEuMC4wLTUgYnVtcHMgdG8gMS4wLjBcbiAgICAgICAgLy8gMS4xLjAgYnVtcHMgdG8gMi4wLjBcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMubWlub3IgIT09IDAgfHxcbiAgICAgICAgICB0aGlzLnBhdGNoICE9PSAwIHx8XG4gICAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm1ham9yKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1pbm9yID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnbWlub3InOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1pbm9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWlub3IgdmVyc2lvbi5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtaW5vci5cbiAgICAgICAgLy8gMS4yLjAtNSBidW1wcyB0byAxLjIuMFxuICAgICAgICAvLyAxLjIuMSBidW1wcyB0byAxLjMuMFxuICAgICAgICBpZiAodGhpcy5wYXRjaCAhPT0gMCB8fCB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5taW5vcisrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3BhdGNoJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCBpdCB3aWxsIGluY3JlbWVudCB0aGUgcGF0Y2guXG4gICAgICAgIC8vIElmIGl0IGlzIGEgcHJlLXJlbGVhc2UgaXQgd2lsbCBidW1wIHVwIHRvIHRoZSBzYW1lIHBhdGNoIHZlcnNpb24uXG4gICAgICAgIC8vIDEuMi4wLTUgcGF0Y2hlcyB0byAxLjIuMFxuICAgICAgICAvLyAxLjIuMCBwYXRjaGVzIHRvIDEuMi4xXG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5wYXRjaCsrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIC8vIFRoaXMgcHJvYmFibHkgc2hvdWxkbid0IGJlIHVzZWQgcHVibGljbHkuXG4gICAgICAvLyAxLjAuMCAncHJlJyB3b3VsZCBiZWNvbWUgMS4wLjAtMCB3aGljaCBpcyB0aGUgd3JvbmcgZGlyZWN0aW9uLlxuICAgICAgY2FzZSAncHJlJzoge1xuICAgICAgICBjb25zdCBiYXNlID0gTnVtYmVyKGlkZW50aWZpZXJCYXNlKSA/IDEgOiAwXG5cbiAgICAgICAgaWYgKCFpZGVudGlmaWVyICYmIGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6IGlkZW50aWZpZXIgaXMgZW1wdHknKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbYmFzZV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgaSA9IHRoaXMucHJlcmVsZWFzZS5sZW5ndGhcbiAgICAgICAgICB3aGlsZSAoLS1pID49IDApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmVyZWxlYXNlW2ldID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICB0aGlzLnByZXJlbGVhc2VbaV0rK1xuICAgICAgICAgICAgICBpID0gLTJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBkaWRuJ3QgaW5jcmVtZW50IGFueXRoaW5nXG4gICAgICAgICAgICBpZiAoaWRlbnRpZmllciA9PT0gdGhpcy5wcmVyZWxlYXNlLmpvaW4oJy4nKSAmJiBpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogaWRlbnRpZmllciBhbHJlYWR5IGV4aXN0cycpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UucHVzaChiYXNlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICAgIC8vIDEuMi4wLWJldGEuMSBidW1wcyB0byAxLjIuMC1iZXRhLjIsXG4gICAgICAgICAgLy8gMS4yLjAtYmV0YS5mb29ibHogb3IgMS4yLjAtYmV0YSBidW1wcyB0byAxLjIuMC1iZXRhLjBcbiAgICAgICAgICBsZXQgcHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyLCBiYXNlXVxuICAgICAgICAgIGlmIChpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHByZXJlbGVhc2UgPSBbaWRlbnRpZmllcl1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLnByZXJlbGVhc2VbMF0sIGlkZW50aWZpZXIpID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoaXNOYU4odGhpcy5wcmVyZWxlYXNlWzFdKSkge1xuICAgICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IHByZXJlbGVhc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6ICR7cmVsZWFzZX1gKVxuICAgIH1cbiAgICB0aGlzLnJhdyA9IHRoaXMuZm9ybWF0KClcbiAgICBpZiAodGhpcy5idWlsZC5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmF3ICs9IGArJHt0aGlzLmJ1aWxkLmpvaW4oJy4nKX1gXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTZW1WZXJcbiIsImNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCBjbGVhbiA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHMgPSBwYXJzZSh2ZXJzaW9uLnRyaW0oKS5yZXBsYWNlKC9eWz12XSsvLCAnJyksIG9wdGlvbnMpXG4gIHJldHVybiBzID8gcy52ZXJzaW9uIDogbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSBjbGVhblxuIiwiY29uc3QgZXEgPSByZXF1aXJlKCcuL2VxJylcbmNvbnN0IG5lcSA9IHJlcXVpcmUoJy4vbmVxJylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi9ndCcpXG5jb25zdCBndGUgPSByZXF1aXJlKCcuL2d0ZScpXG5jb25zdCBsdCA9IHJlcXVpcmUoJy4vbHQnKVxuY29uc3QgbHRlID0gcmVxdWlyZSgnLi9sdGUnKVxuXG5jb25zdCBjbXAgPSAoYSwgb3AsIGIsIGxvb3NlKSA9PiB7XG4gIHN3aXRjaCAob3ApIHtcbiAgICBjYXNlICc9PT0nOlxuICAgICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0Jykge1xuICAgICAgICBhID0gYS52ZXJzaW9uXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGIgPSBiLnZlcnNpb25cbiAgICAgIH1cbiAgICAgIHJldHVybiBhID09PSBiXG5cbiAgICBjYXNlICchPT0nOlxuICAgICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0Jykge1xuICAgICAgICBhID0gYS52ZXJzaW9uXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGIgPSBiLnZlcnNpb25cbiAgICAgIH1cbiAgICAgIHJldHVybiBhICE9PSBiXG5cbiAgICBjYXNlICcnOlxuICAgIGNhc2UgJz0nOlxuICAgIGNhc2UgJz09JzpcbiAgICAgIHJldHVybiBlcShhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJyE9JzpcbiAgICAgIHJldHVybiBuZXEoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc+JzpcbiAgICAgIHJldHVybiBndChhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJz49JzpcbiAgICAgIHJldHVybiBndGUoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc8JzpcbiAgICAgIHJldHVybiBsdChhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJzw9JzpcbiAgICAgIHJldHVybiBsdGUoYSwgYiwgbG9vc2UpXG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBvcGVyYXRvcjogJHtvcH1gKVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IGNtcFxuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuXG5jb25zdCBjb2VyY2UgPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgIHJldHVybiB2ZXJzaW9uXG4gIH1cblxuICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdudW1iZXInKSB7XG4gICAgdmVyc2lvbiA9IFN0cmluZyh2ZXJzaW9uKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIGxldCBtYXRjaCA9IG51bGxcbiAgaWYgKCFvcHRpb25zLnJ0bCkge1xuICAgIG1hdGNoID0gdmVyc2lvbi5tYXRjaChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gcmVbdC5DT0VSQ0VGVUxMXSA6IHJlW3QuQ09FUkNFXSlcbiAgfSBlbHNlIHtcbiAgICAvLyBGaW5kIHRoZSByaWdodC1tb3N0IGNvZXJjaWJsZSBzdHJpbmcgdGhhdCBkb2VzIG5vdCBzaGFyZVxuICAgIC8vIGEgdGVybWludXMgd2l0aCBhIG1vcmUgbGVmdC13YXJkIGNvZXJjaWJsZSBzdHJpbmcuXG4gICAgLy8gRWcsICcxLjIuMy40JyB3YW50cyB0byBjb2VyY2UgJzIuMy40Jywgbm90ICczLjQnIG9yICc0J1xuICAgIC8vIFdpdGggaW5jbHVkZVByZXJlbGVhc2Ugb3B0aW9uIHNldCwgJzEuMi4zLjQtcmMnIHdhbnRzIHRvIGNvZXJjZSAnMi4zLjQtcmMnLCBub3QgJzIuMy40J1xuICAgIC8vXG4gICAgLy8gV2FsayB0aHJvdWdoIHRoZSBzdHJpbmcgY2hlY2tpbmcgd2l0aCBhIC9nIHJlZ2V4cFxuICAgIC8vIE1hbnVhbGx5IHNldCB0aGUgaW5kZXggc28gYXMgdG8gcGljayB1cCBvdmVybGFwcGluZyBtYXRjaGVzLlxuICAgIC8vIFN0b3Agd2hlbiB3ZSBnZXQgYSBtYXRjaCB0aGF0IGVuZHMgYXQgdGhlIHN0cmluZyBlbmQsIHNpbmNlIG5vXG4gICAgLy8gY29lcmNpYmxlIHN0cmluZyBjYW4gYmUgbW9yZSByaWdodC13YXJkIHdpdGhvdXQgdGhlIHNhbWUgdGVybWludXMuXG4gICAgY29uc3QgY29lcmNlUnRsUmVnZXggPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gcmVbdC5DT0VSQ0VSVExGVUxMXSA6IHJlW3QuQ09FUkNFUlRMXVxuICAgIGxldCBuZXh0XG4gICAgd2hpbGUgKChuZXh0ID0gY29lcmNlUnRsUmVnZXguZXhlYyh2ZXJzaW9uKSkgJiZcbiAgICAgICAgKCFtYXRjaCB8fCBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCAhPT0gdmVyc2lvbi5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBpZiAoIW1hdGNoIHx8XG4gICAgICAgICAgICBuZXh0LmluZGV4ICsgbmV4dFswXS5sZW5ndGggIT09IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKSB7XG4gICAgICAgIG1hdGNoID0gbmV4dFxuICAgICAgfVxuICAgICAgY29lcmNlUnRsUmVnZXgubGFzdEluZGV4ID0gbmV4dC5pbmRleCArIG5leHRbMV0ubGVuZ3RoICsgbmV4dFsyXS5sZW5ndGhcbiAgICB9XG4gICAgLy8gbGVhdmUgaXQgaW4gYSBjbGVhbiBzdGF0ZVxuICAgIGNvZXJjZVJ0bFJlZ2V4Lmxhc3RJbmRleCA9IC0xXG4gIH1cblxuICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgbWFqb3IgPSBtYXRjaFsyXVxuICBjb25zdCBtaW5vciA9IG1hdGNoWzNdIHx8ICcwJ1xuICBjb25zdCBwYXRjaCA9IG1hdGNoWzRdIHx8ICcwJ1xuICBjb25zdCBwcmVyZWxlYXNlID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBtYXRjaFs1XSA/IGAtJHttYXRjaFs1XX1gIDogJydcbiAgY29uc3QgYnVpbGQgPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmIG1hdGNoWzZdID8gYCske21hdGNoWzZdfWAgOiAnJ1xuXG4gIHJldHVybiBwYXJzZShgJHttYWpvcn0uJHttaW5vcn0uJHtwYXRjaH0ke3ByZXJlbGVhc2V9JHtidWlsZH1gLCBvcHRpb25zKVxufVxubW9kdWxlLmV4cG9ydHMgPSBjb2VyY2VcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGNvbXBhcmVCdWlsZCA9IChhLCBiLCBsb29zZSkgPT4ge1xuICBjb25zdCB2ZXJzaW9uQSA9IG5ldyBTZW1WZXIoYSwgbG9vc2UpXG4gIGNvbnN0IHZlcnNpb25CID0gbmV3IFNlbVZlcihiLCBsb29zZSlcbiAgcmV0dXJuIHZlcnNpb25BLmNvbXBhcmUodmVyc2lvbkIpIHx8IHZlcnNpb25BLmNvbXBhcmVCdWlsZCh2ZXJzaW9uQilcbn1cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUJ1aWxkXG4iLCJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGNvbXBhcmVMb29zZSA9IChhLCBiKSA9PiBjb21wYXJlKGEsIGIsIHRydWUpXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVMb29zZVxuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgY29tcGFyZSA9IChhLCBiLCBsb29zZSkgPT5cbiAgbmV3IFNlbVZlcihhLCBsb29zZSkuY29tcGFyZShuZXcgU2VtVmVyKGIsIGxvb3NlKSlcblxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlXG4iLCJjb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UuanMnKVxuXG5jb25zdCBkaWZmID0gKHZlcnNpb24xLCB2ZXJzaW9uMikgPT4ge1xuICBjb25zdCB2MSA9IHBhcnNlKHZlcnNpb24xLCBudWxsLCB0cnVlKVxuICBjb25zdCB2MiA9IHBhcnNlKHZlcnNpb24yLCBudWxsLCB0cnVlKVxuICBjb25zdCBjb21wYXJpc29uID0gdjEuY29tcGFyZSh2MilcblxuICBpZiAoY29tcGFyaXNvbiA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCB2MUhpZ2hlciA9IGNvbXBhcmlzb24gPiAwXG4gIGNvbnN0IGhpZ2hWZXJzaW9uID0gdjFIaWdoZXIgPyB2MSA6IHYyXG4gIGNvbnN0IGxvd1ZlcnNpb24gPSB2MUhpZ2hlciA/IHYyIDogdjFcbiAgY29uc3QgaGlnaEhhc1ByZSA9ICEhaGlnaFZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGhcbiAgY29uc3QgbG93SGFzUHJlID0gISFsb3dWZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoXG5cbiAgaWYgKGxvd0hhc1ByZSAmJiAhaGlnaEhhc1ByZSkge1xuICAgIC8vIEdvaW5nIGZyb20gcHJlcmVsZWFzZSAtPiBubyBwcmVyZWxlYXNlIHJlcXVpcmVzIHNvbWUgc3BlY2lhbCBjYXNpbmdcblxuICAgIC8vIElmIHRoZSBsb3cgdmVyc2lvbiBoYXMgb25seSBhIG1ham9yLCB0aGVuIGl0IHdpbGwgYWx3YXlzIGJlIGEgbWFqb3JcbiAgICAvLyBTb21lIGV4YW1wbGVzOlxuICAgIC8vIDEuMC4wLTEgLT4gMS4wLjBcbiAgICAvLyAxLjAuMC0xIC0+IDEuMS4xXG4gICAgLy8gMS4wLjAtMSAtPiAyLjAuMFxuICAgIGlmICghbG93VmVyc2lvbi5wYXRjaCAmJiAhbG93VmVyc2lvbi5taW5vcikge1xuICAgICAgcmV0dXJuICdtYWpvcidcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgaXQgY2FuIGJlIGRldGVybWluZWQgYnkgY2hlY2tpbmcgdGhlIGhpZ2ggdmVyc2lvblxuXG4gICAgaWYgKGhpZ2hWZXJzaW9uLnBhdGNoKSB7XG4gICAgICAvLyBhbnl0aGluZyBoaWdoZXIgdGhhbiBhIHBhdGNoIGJ1bXAgd291bGQgcmVzdWx0IGluIHRoZSB3cm9uZyB2ZXJzaW9uXG4gICAgICByZXR1cm4gJ3BhdGNoJ1xuICAgIH1cblxuICAgIGlmIChoaWdoVmVyc2lvbi5taW5vcikge1xuICAgICAgLy8gYW55dGhpbmcgaGlnaGVyIHRoYW4gYSBtaW5vciBidW1wIHdvdWxkIHJlc3VsdCBpbiB0aGUgd3JvbmcgdmVyc2lvblxuICAgICAgcmV0dXJuICdtaW5vcidcbiAgICB9XG5cbiAgICAvLyBidW1waW5nIG1ham9yL21pbm9yL3BhdGNoIGFsbCBoYXZlIHNhbWUgcmVzdWx0XG4gICAgcmV0dXJuICdtYWpvcidcbiAgfVxuXG4gIC8vIGFkZCB0aGUgYHByZWAgcHJlZml4IGlmIHdlIGFyZSBnb2luZyB0byBhIHByZXJlbGVhc2UgdmVyc2lvblxuICBjb25zdCBwcmVmaXggPSBoaWdoSGFzUHJlID8gJ3ByZScgOiAnJ1xuXG4gIGlmICh2MS5tYWpvciAhPT0gdjIubWFqb3IpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJ21ham9yJ1xuICB9XG5cbiAgaWYgKHYxLm1pbm9yICE9PSB2Mi5taW5vcikge1xuICAgIHJldHVybiBwcmVmaXggKyAnbWlub3InXG4gIH1cblxuICBpZiAodjEucGF0Y2ggIT09IHYyLnBhdGNoKSB7XG4gICAgcmV0dXJuIHByZWZpeCArICdwYXRjaCdcbiAgfVxuXG4gIC8vIGhpZ2ggYW5kIGxvdyBhcmUgcHJlbGVhc2VzXG4gIHJldHVybiAncHJlcmVsZWFzZSdcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkaWZmXG4iLCJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA9PT0gMFxubW9kdWxlLmV4cG9ydHMgPSBlcVxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBndCA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPiAwXG5tb2R1bGUuZXhwb3J0cyA9IGd0XG4iLCJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGd0ZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPj0gMFxubW9kdWxlLmV4cG9ydHMgPSBndGVcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcblxuY29uc3QgaW5jID0gKHZlcnNpb24sIHJlbGVhc2UsIG9wdGlvbnMsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKSA9PiB7XG4gIGlmICh0eXBlb2YgKG9wdGlvbnMpID09PSAnc3RyaW5nJykge1xuICAgIGlkZW50aWZpZXJCYXNlID0gaWRlbnRpZmllclxuICAgIGlkZW50aWZpZXIgPSBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZFxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcihcbiAgICAgIHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIgPyB2ZXJzaW9uLnZlcnNpb24gOiB2ZXJzaW9uLFxuICAgICAgb3B0aW9uc1xuICAgICkuaW5jKHJlbGVhc2UsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKS52ZXJzaW9uXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBpbmNcbiIsImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbHQgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpIDwgMFxubW9kdWxlLmV4cG9ydHMgPSBsdFxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBsdGUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpIDw9IDBcbm1vZHVsZS5leHBvcnRzID0gbHRlXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBtYWpvciA9IChhLCBsb29zZSkgPT4gbmV3IFNlbVZlcihhLCBsb29zZSkubWFqb3Jcbm1vZHVsZS5leHBvcnRzID0gbWFqb3JcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IG1pbm9yID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5taW5vclxubW9kdWxlLmV4cG9ydHMgPSBtaW5vclxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBuZXEgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpICE9PSAwXG5tb2R1bGUuZXhwb3J0cyA9IG5lcVxuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGFyc2UgPSAodmVyc2lvbiwgb3B0aW9ucywgdGhyb3dFcnJvcnMgPSBmYWxzZSkgPT4ge1xuICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgIHJldHVybiB2ZXJzaW9uXG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcih2ZXJzaW9uLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIGlmICghdGhyb3dFcnJvcnMpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHRocm93IGVyXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVxuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGF0Y2ggPSAoYSwgbG9vc2UpID0+IG5ldyBTZW1WZXIoYSwgbG9vc2UpLnBhdGNoXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoXG4iLCJjb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgcHJlcmVsZWFzZSA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJldHVybiAocGFyc2VkICYmIHBhcnNlZC5wcmVyZWxlYXNlLmxlbmd0aCkgPyBwYXJzZWQucHJlcmVsZWFzZSA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gcHJlcmVsZWFzZVxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCByY29tcGFyZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShiLCBhLCBsb29zZSlcbm1vZHVsZS5leHBvcnRzID0gcmNvbXBhcmVcbiIsImNvbnN0IGNvbXBhcmVCdWlsZCA9IHJlcXVpcmUoJy4vY29tcGFyZS1idWlsZCcpXG5jb25zdCByc29ydCA9IChsaXN0LCBsb29zZSkgPT4gbGlzdC5zb3J0KChhLCBiKSA9PiBjb21wYXJlQnVpbGQoYiwgYSwgbG9vc2UpKVxubW9kdWxlLmV4cG9ydHMgPSByc29ydFxuIiwiY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHNhdGlzZmllcyA9ICh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiByYW5nZS50ZXN0KHZlcnNpb24pXG59XG5tb2R1bGUuZXhwb3J0cyA9IHNhdGlzZmllc1xuIiwiY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9jb21wYXJlLWJ1aWxkJylcbmNvbnN0IHNvcnQgPSAobGlzdCwgbG9vc2UpID0+IGxpc3Quc29ydCgoYSwgYikgPT4gY29tcGFyZUJ1aWxkKGEsIGIsIGxvb3NlKSlcbm1vZHVsZS5leHBvcnRzID0gc29ydFxuIiwiY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHZhbGlkID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgdiA9IHBhcnNlKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJldHVybiB2ID8gdi52ZXJzaW9uIDogbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSB2YWxpZFxuIiwiLy8ganVzdCBwcmUtbG9hZCBhbGwgdGhlIHN0dWZmIHRoYXQgaW5kZXguanMgbGF6aWx5IGV4cG9ydHNcbmNvbnN0IGludGVybmFsUmUgPSByZXF1aXJlKCcuL2ludGVybmFsL3JlJylcbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgaWRlbnRpZmllcnMgPSByZXF1aXJlKCcuL2ludGVybmFsL2lkZW50aWZpZXJzJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcGFyc2UnKVxuY29uc3QgdmFsaWQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy92YWxpZCcpXG5jb25zdCBjbGVhbiA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NsZWFuJylcbmNvbnN0IGluYyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2luYycpXG5jb25zdCBkaWZmID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZGlmZicpXG5jb25zdCBtYWpvciA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL21ham9yJylcbmNvbnN0IG1pbm9yID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbWlub3InKVxuY29uc3QgcGF0Y2ggPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9wYXRjaCcpXG5jb25zdCBwcmVyZWxlYXNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcHJlcmVsZWFzZScpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZScpXG5jb25zdCByY29tcGFyZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jjb21wYXJlJylcbmNvbnN0IGNvbXBhcmVMb29zZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUtbG9vc2UnKVxuY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZS1idWlsZCcpXG5jb25zdCBzb3J0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvc29ydCcpXG5jb25zdCByc29ydCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jzb3J0JylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZ3QnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9sdCcpXG5jb25zdCBlcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2VxJylcbmNvbnN0IG5lcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL25lcScpXG5jb25zdCBndGUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9ndGUnKVxuY29uc3QgbHRlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbHRlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NtcCcpXG5jb25zdCBjb2VyY2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb2VyY2UnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9jb21wYXJhdG9yJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3NhdGlzZmllcycpXG5jb25zdCB0b0NvbXBhcmF0b3JzID0gcmVxdWlyZSgnLi9yYW5nZXMvdG8tY29tcGFyYXRvcnMnKVxuY29uc3QgbWF4U2F0aXNmeWluZyA9IHJlcXVpcmUoJy4vcmFuZ2VzL21heC1zYXRpc2Z5aW5nJylcbmNvbnN0IG1pblNhdGlzZnlpbmcgPSByZXF1aXJlKCcuL3Jhbmdlcy9taW4tc2F0aXNmeWluZycpXG5jb25zdCBtaW5WZXJzaW9uID0gcmVxdWlyZSgnLi9yYW5nZXMvbWluLXZlcnNpb24nKVxuY29uc3QgdmFsaWRSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3ZhbGlkJylcbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL3Jhbmdlcy9vdXRzaWRlJylcbmNvbnN0IGd0ciA9IHJlcXVpcmUoJy4vcmFuZ2VzL2d0cicpXG5jb25zdCBsdHIgPSByZXF1aXJlKCcuL3Jhbmdlcy9sdHInKVxuY29uc3QgaW50ZXJzZWN0cyA9IHJlcXVpcmUoJy4vcmFuZ2VzL2ludGVyc2VjdHMnKVxuY29uc3Qgc2ltcGxpZnlSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3NpbXBsaWZ5JylcbmNvbnN0IHN1YnNldCA9IHJlcXVpcmUoJy4vcmFuZ2VzL3N1YnNldCcpXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGFyc2UsXG4gIHZhbGlkLFxuICBjbGVhbixcbiAgaW5jLFxuICBkaWZmLFxuICBtYWpvcixcbiAgbWlub3IsXG4gIHBhdGNoLFxuICBwcmVyZWxlYXNlLFxuICBjb21wYXJlLFxuICByY29tcGFyZSxcbiAgY29tcGFyZUxvb3NlLFxuICBjb21wYXJlQnVpbGQsXG4gIHNvcnQsXG4gIHJzb3J0LFxuICBndCxcbiAgbHQsXG4gIGVxLFxuICBuZXEsXG4gIGd0ZSxcbiAgbHRlLFxuICBjbXAsXG4gIGNvZXJjZSxcbiAgQ29tcGFyYXRvcixcbiAgUmFuZ2UsXG4gIHNhdGlzZmllcyxcbiAgdG9Db21wYXJhdG9ycyxcbiAgbWF4U2F0aXNmeWluZyxcbiAgbWluU2F0aXNmeWluZyxcbiAgbWluVmVyc2lvbixcbiAgdmFsaWRSYW5nZSxcbiAgb3V0c2lkZSxcbiAgZ3RyLFxuICBsdHIsXG4gIGludGVyc2VjdHMsXG4gIHNpbXBsaWZ5UmFuZ2UsXG4gIHN1YnNldCxcbiAgU2VtVmVyLFxuICByZTogaW50ZXJuYWxSZS5yZSxcbiAgc3JjOiBpbnRlcm5hbFJlLnNyYyxcbiAgdG9rZW5zOiBpbnRlcm5hbFJlLnQsXG4gIFNFTVZFUl9TUEVDX1ZFUlNJT046IGNvbnN0YW50cy5TRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBSRUxFQVNFX1RZUEVTOiBjb25zdGFudHMuUkVMRUFTRV9UWVBFUyxcbiAgY29tcGFyZUlkZW50aWZpZXJzOiBpZGVudGlmaWVycy5jb21wYXJlSWRlbnRpZmllcnMsXG4gIHJjb21wYXJlSWRlbnRpZmllcnM6IGlkZW50aWZpZXJzLnJjb21wYXJlSWRlbnRpZmllcnMsXG59XG4iLCIvLyBOb3RlOiB0aGlzIGlzIHRoZSBzZW12ZXIub3JnIHZlcnNpb24gb2YgdGhlIHNwZWMgdGhhdCBpdCBpbXBsZW1lbnRzXG4vLyBOb3QgbmVjZXNzYXJpbHkgdGhlIHBhY2thZ2UgdmVyc2lvbiBvZiB0aGlzIGNvZGUuXG5jb25zdCBTRU1WRVJfU1BFQ19WRVJTSU9OID0gJzIuMC4wJ1xuXG5jb25zdCBNQVhfTEVOR1RIID0gMjU2XG5jb25zdCBNQVhfU0FGRV9JTlRFR0VSID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHxcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIDkwMDcxOTkyNTQ3NDA5OTFcblxuLy8gTWF4IHNhZmUgc2VnbWVudCBsZW5ndGggZm9yIGNvZXJjaW9uLlxuY29uc3QgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCA9IDE2XG5cbi8vIE1heCBzYWZlIGxlbmd0aCBmb3IgYSBidWlsZCBpZGVudGlmaWVyLiBUaGUgbWF4IGxlbmd0aCBtaW51cyA2IGNoYXJhY3RlcnMgZm9yXG4vLyB0aGUgc2hvcnRlc3QgdmVyc2lvbiB3aXRoIGEgYnVpbGQgMC4wLjArQlVJTEQuXG5jb25zdCBNQVhfU0FGRV9CVUlMRF9MRU5HVEggPSBNQVhfTEVOR1RIIC0gNlxuXG5jb25zdCBSRUxFQVNFX1RZUEVTID0gW1xuICAnbWFqb3InLFxuICAncHJlbWFqb3InLFxuICAnbWlub3InLFxuICAncHJlbWlub3InLFxuICAncGF0Y2gnLFxuICAncHJlcGF0Y2gnLFxuICAncHJlcmVsZWFzZScsXG5dXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNQVhfTEVOR1RILFxuICBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RILFxuICBNQVhfU0FGRV9CVUlMRF9MRU5HVEgsXG4gIE1BWF9TQUZFX0lOVEVHRVIsXG4gIFJFTEVBU0VfVFlQRVMsXG4gIFNFTVZFUl9TUEVDX1ZFUlNJT04sXG4gIEZMQUdfSU5DTFVERV9QUkVSRUxFQVNFOiAwYjAwMSxcbiAgRkxBR19MT09TRTogMGIwMTAsXG59XG4iLCJjb25zdCBkZWJ1ZyA9IChcbiAgdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmXG4gIHByb2Nlc3MuZW52ICYmXG4gIHByb2Nlc3MuZW52Lk5PREVfREVCVUcgJiZcbiAgL1xcYnNlbXZlclxcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRylcbikgPyAoLi4uYXJncykgPT4gY29uc29sZS5lcnJvcignU0VNVkVSJywgLi4uYXJncylcbiAgOiAoKSA9PiB7fVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYnVnXG4iLCJjb25zdCBudW1lcmljID0gL15bMC05XSskL1xuY29uc3QgY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IHtcbiAgY29uc3QgYW51bSA9IG51bWVyaWMudGVzdChhKVxuICBjb25zdCBibnVtID0gbnVtZXJpYy50ZXN0KGIpXG5cbiAgaWYgKGFudW0gJiYgYm51bSkge1xuICAgIGEgPSArYVxuICAgIGIgPSArYlxuICB9XG5cbiAgcmV0dXJuIGEgPT09IGIgPyAwXG4gICAgOiAoYW51bSAmJiAhYm51bSkgPyAtMVxuICAgIDogKGJudW0gJiYgIWFudW0pID8gMVxuICAgIDogYSA8IGIgPyAtMVxuICAgIDogMVxufVxuXG5jb25zdCByY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IGNvbXBhcmVJZGVudGlmaWVycyhiLCBhKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIiwiLy8gcGFyc2Ugb3V0IGp1c3QgdGhlIG9wdGlvbnMgd2UgY2FyZSBhYm91dFxuY29uc3QgbG9vc2VPcHRpb24gPSBPYmplY3QuZnJlZXplKHsgbG9vc2U6IHRydWUgfSlcbmNvbnN0IGVtcHR5T3B0cyA9IE9iamVjdC5mcmVlemUoeyB9KVxuY29uc3QgcGFyc2VPcHRpb25zID0gb3B0aW9ucyA9PiB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIHJldHVybiBlbXB0eU9wdHNcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbG9vc2VPcHRpb25cbiAgfVxuXG4gIHJldHVybiBvcHRpb25zXG59XG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlT3B0aW9uc1xuIiwiY29uc3Qge1xuICBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RILFxuICBNQVhfU0FGRV9CVUlMRF9MRU5HVEgsXG4gIE1BWF9MRU5HVEgsXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuL2RlYnVnJylcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9XG5cbi8vIFRoZSBhY3R1YWwgcmVnZXhwcyBnbyBvbiBleHBvcnRzLnJlXG5jb25zdCByZSA9IGV4cG9ydHMucmUgPSBbXVxuY29uc3Qgc2FmZVJlID0gZXhwb3J0cy5zYWZlUmUgPSBbXVxuY29uc3Qgc3JjID0gZXhwb3J0cy5zcmMgPSBbXVxuY29uc3QgdCA9IGV4cG9ydHMudCA9IHt9XG5sZXQgUiA9IDBcblxuY29uc3QgTEVUVEVSREFTSE5VTUJFUiA9ICdbYS16QS1aMC05LV0nXG5cbi8vIFJlcGxhY2Ugc29tZSBncmVlZHkgcmVnZXggdG9rZW5zIHRvIHByZXZlbnQgcmVnZXggZG9zIGlzc3Vlcy4gVGhlc2UgcmVnZXggYXJlXG4vLyB1c2VkIGludGVybmFsbHkgdmlhIHRoZSBzYWZlUmUgb2JqZWN0IHNpbmNlIGFsbCBpbnB1dHMgaW4gdGhpcyBsaWJyYXJ5IGdldFxuLy8gbm9ybWFsaXplZCBmaXJzdCB0byB0cmltIGFuZCBjb2xsYXBzZSBhbGwgZXh0cmEgd2hpdGVzcGFjZS4gVGhlIG9yaWdpbmFsXG4vLyByZWdleGVzIGFyZSBleHBvcnRlZCBmb3IgdXNlcmxhbmQgY29uc3VtcHRpb24gYW5kIGxvd2VyIGxldmVsIHVzYWdlLiBBXG4vLyBmdXR1cmUgYnJlYWtpbmcgY2hhbmdlIGNvdWxkIGV4cG9ydCB0aGUgc2FmZXIgcmVnZXggb25seSB3aXRoIGEgbm90ZSB0aGF0XG4vLyBhbGwgaW5wdXQgc2hvdWxkIGhhdmUgZXh0cmEgd2hpdGVzcGFjZSByZW1vdmVkLlxuY29uc3Qgc2FmZVJlZ2V4UmVwbGFjZW1lbnRzID0gW1xuICBbJ1xcXFxzJywgMV0sXG4gIFsnXFxcXGQnLCBNQVhfTEVOR1RIXSxcbiAgW0xFVFRFUkRBU0hOVU1CRVIsIE1BWF9TQUZFX0JVSUxEX0xFTkdUSF0sXG5dXG5cbmNvbnN0IG1ha2VTYWZlUmVnZXggPSAodmFsdWUpID0+IHtcbiAgZm9yIChjb25zdCBbdG9rZW4sIG1heF0gb2Ygc2FmZVJlZ2V4UmVwbGFjZW1lbnRzKSB7XG4gICAgdmFsdWUgPSB2YWx1ZVxuICAgICAgLnNwbGl0KGAke3Rva2VufSpgKS5qb2luKGAke3Rva2VufXswLCR7bWF4fX1gKVxuICAgICAgLnNwbGl0KGAke3Rva2VufStgKS5qb2luKGAke3Rva2VufXsxLCR7bWF4fX1gKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG5jb25zdCBjcmVhdGVUb2tlbiA9IChuYW1lLCB2YWx1ZSwgaXNHbG9iYWwpID0+IHtcbiAgY29uc3Qgc2FmZSA9IG1ha2VTYWZlUmVnZXgodmFsdWUpXG4gIGNvbnN0IGluZGV4ID0gUisrXG4gIGRlYnVnKG5hbWUsIGluZGV4LCB2YWx1ZSlcbiAgdFtuYW1lXSA9IGluZGV4XG4gIHNyY1tpbmRleF0gPSB2YWx1ZVxuICByZVtpbmRleF0gPSBuZXcgUmVnRXhwKHZhbHVlLCBpc0dsb2JhbCA/ICdnJyA6IHVuZGVmaW5lZClcbiAgc2FmZVJlW2luZGV4XSA9IG5ldyBSZWdFeHAoc2FmZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpXG59XG5cbi8vIFRoZSBmb2xsb3dpbmcgUmVndWxhciBFeHByZXNzaW9ucyBjYW4gYmUgdXNlZCBmb3IgdG9rZW5pemluZyxcbi8vIHZhbGlkYXRpbmcsIGFuZCBwYXJzaW5nIFNlbVZlciB2ZXJzaW9uIHN0cmluZ3MuXG5cbi8vICMjIE51bWVyaWMgSWRlbnRpZmllclxuLy8gQSBzaW5nbGUgYDBgLCBvciBhIG5vbi16ZXJvIGRpZ2l0IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBkaWdpdHMuXG5cbmNyZWF0ZVRva2VuKCdOVU1FUklDSURFTlRJRklFUicsICcwfFsxLTldXFxcXGQqJylcbmNyZWF0ZVRva2VuKCdOVU1FUklDSURFTlRJRklFUkxPT1NFJywgJ1xcXFxkKycpXG5cbi8vICMjIE5vbi1udW1lcmljIElkZW50aWZpZXJcbi8vIFplcm8gb3IgbW9yZSBkaWdpdHMsIGZvbGxvd2VkIGJ5IGEgbGV0dGVyIG9yIGh5cGhlbiwgYW5kIHRoZW4gemVybyBvclxuLy8gbW9yZSBsZXR0ZXJzLCBkaWdpdHMsIG9yIGh5cGhlbnMuXG5cbmNyZWF0ZVRva2VuKCdOT05OVU1FUklDSURFTlRJRklFUicsIGBcXFxcZCpbYS16QS1aLV0ke0xFVFRFUkRBU0hOVU1CRVJ9KmApXG5cbi8vICMjIE1haW4gVmVyc2lvblxuLy8gVGhyZWUgZG90LXNlcGFyYXRlZCBudW1lcmljIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignTUFJTlZFUlNJT04nLCBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuY3JlYXRlVG9rZW4oJ01BSU5WRVJTSU9OTE9PU0UnLCBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KWApXG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb24gSWRlbnRpZmllclxuLy8gQSBudW1lcmljIGlkZW50aWZpZXIsIG9yIGEgbm9uLW51bWVyaWMgaWRlbnRpZmllci5cblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VJREVOVElGSUVSJywgYCg/OiR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdXG59fCR7c3JjW3QuTk9OTlVNRVJJQ0lERU5USUZJRVJdfSlgKVxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRScsIGAoPzoke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdXG59fCR7c3JjW3QuTk9OTlVNRVJJQ0lERU5USUZJRVJdfSlgKVxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uXG4vLyBIeXBoZW4sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGRvdC1zZXBhcmF0ZWQgcHJlLXJlbGVhc2UgdmVyc2lvblxuLy8gaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFJywgYCg/Oi0oJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUl1cbn0oPzpcXFxcLiR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdfSkqKSlgKVxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUxPT1NFJywgYCg/Oi0/KCR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV1cbn0oPzpcXFxcLiR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV19KSopKWApXG5cbi8vICMjIEJ1aWxkIE1ldGFkYXRhIElkZW50aWZpZXJcbi8vIEFueSBjb21iaW5hdGlvbiBvZiBkaWdpdHMsIGxldHRlcnMsIG9yIGh5cGhlbnMuXG5cbmNyZWF0ZVRva2VuKCdCVUlMRElERU5USUZJRVInLCBgJHtMRVRURVJEQVNITlVNQkVSfStgKVxuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YVxuLy8gUGx1cyBzaWduLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwZXJpb2Qtc2VwYXJhdGVkIGJ1aWxkIG1ldGFkYXRhXG4vLyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ0JVSUxEJywgYCg/OlxcXFwrKCR7c3JjW3QuQlVJTERJREVOVElGSUVSXVxufSg/OlxcXFwuJHtzcmNbdC5CVUlMRElERU5USUZJRVJdfSkqKSlgKVxuXG4vLyAjIyBGdWxsIFZlcnNpb24gU3RyaW5nXG4vLyBBIG1haW4gdmVyc2lvbiwgZm9sbG93ZWQgb3B0aW9uYWxseSBieSBhIHByZS1yZWxlYXNlIHZlcnNpb24gYW5kXG4vLyBidWlsZCBtZXRhZGF0YS5cblxuLy8gTm90ZSB0aGF0IHRoZSBvbmx5IG1ham9yLCBtaW5vciwgcGF0Y2gsIGFuZCBwcmUtcmVsZWFzZSBzZWN0aW9ucyBvZlxuLy8gdGhlIHZlcnNpb24gc3RyaW5nIGFyZSBjYXB0dXJpbmcgZ3JvdXBzLiAgVGhlIGJ1aWxkIG1ldGFkYXRhIGlzIG5vdCBhXG4vLyBjYXB0dXJpbmcgZ3JvdXAsIGJlY2F1c2UgaXQgc2hvdWxkIG5vdCBldmVyIGJlIHVzZWQgaW4gdmVyc2lvblxuLy8gY29tcGFyaXNvbi5cblxuY3JlYXRlVG9rZW4oJ0ZVTExQTEFJTicsIGB2PyR7c3JjW3QuTUFJTlZFUlNJT05dXG59JHtzcmNbdC5QUkVSRUxFQVNFXX0/JHtcbiAgc3JjW3QuQlVJTERdfT9gKVxuXG5jcmVhdGVUb2tlbignRlVMTCcsIGBeJHtzcmNbdC5GVUxMUExBSU5dfSRgKVxuXG4vLyBsaWtlIGZ1bGwsIGJ1dCBhbGxvd3MgdjEuMi4zIGFuZCA9MS4yLjMsIHdoaWNoIHBlb3BsZSBkbyBzb21ldGltZXMuXG4vLyBhbHNvLCAxLjAuMGFscGhhMSAocHJlcmVsZWFzZSB3aXRob3V0IHRoZSBoeXBoZW4pIHdoaWNoIGlzIHByZXR0eVxuLy8gY29tbW9uIGluIHRoZSBucG0gcmVnaXN0cnkuXG5jcmVhdGVUb2tlbignTE9PU0VQTEFJTicsIGBbdj1cXFxcc10qJHtzcmNbdC5NQUlOVkVSU0lPTkxPT1NFXVxufSR7c3JjW3QuUFJFUkVMRUFTRUxPT1NFXX0/JHtcbiAgc3JjW3QuQlVJTERdfT9gKVxuXG5jcmVhdGVUb2tlbignTE9PU0UnLCBgXiR7c3JjW3QuTE9PU0VQTEFJTl19JGApXG5cbmNyZWF0ZVRva2VuKCdHVExUJywgJygoPzo8fD4pPz0/KScpXG5cbi8vIFNvbWV0aGluZyBsaWtlIFwiMi4qXCIgb3IgXCIxLjIueFwiLlxuLy8gTm90ZSB0aGF0IFwieC54XCIgaXMgYSB2YWxpZCB4UmFuZ2UgaWRlbnRpZmVyLCBtZWFuaW5nIFwiYW55IHZlcnNpb25cIlxuLy8gT25seSB0aGUgZmlyc3QgaXRlbSBpcyBzdHJpY3RseSByZXF1aXJlZC5cbmNyZWF0ZVRva2VuKCdYUkFOR0VJREVOVElGSUVSTE9PU0UnLCBgJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX18eHxYfFxcXFwqYClcbmNyZWF0ZVRva2VuKCdYUkFOR0VJREVOVElGSUVSJywgYCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfXx4fFh8XFxcXCpgKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFUExBSU4nLCBgW3Y9XFxcXHNdKigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VdfSk/JHtcbiAgICAgICAgICAgICAgICAgICAgIHNyY1t0LkJVSUxEXX0/YCArXG4gICAgICAgICAgICAgICAgICAgYCk/KT9gKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFUExBSU5MT09TRScsIGBbdj1cXFxcc10qKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRUxPT1NFXX0pPyR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1t0LkJVSUxEXX0/YCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKT8pP2ApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqJHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignWFJBTkdFTE9PU0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQ29lcmNpb24uXG4vLyBFeHRyYWN0IGFueXRoaW5nIHRoYXQgY291bGQgY29uY2VpdmFibHkgYmUgYSBwYXJ0IG9mIGEgdmFsaWQgc2VtdmVyXG5jcmVhdGVUb2tlbignQ09FUkNFUExBSU4nLCBgJHsnKF58W15cXFxcZF0pJyArXG4gICAgICAgICAgICAgICcoXFxcXGR7MSwnfSR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KWAgK1xuICAgICAgICAgICAgICBgKD86XFxcXC4oXFxcXGR7MSwke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSkpP2AgK1xuICAgICAgICAgICAgICBgKD86XFxcXC4oXFxcXGR7MSwke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSkpP2ApXG5jcmVhdGVUb2tlbignQ09FUkNFJywgYCR7c3JjW3QuQ09FUkNFUExBSU5dfSg/OiR8W15cXFxcZF0pYClcbmNyZWF0ZVRva2VuKCdDT0VSQ0VGVUxMJywgc3JjW3QuQ09FUkNFUExBSU5dICtcbiAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRV19KT9gICtcbiAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuQlVJTERdfSk/YCArXG4gICAgICAgICAgICAgIGAoPzokfFteXFxcXGRdKWApXG5jcmVhdGVUb2tlbignQ09FUkNFUlRMJywgc3JjW3QuQ09FUkNFXSwgdHJ1ZSlcbmNyZWF0ZVRva2VuKCdDT0VSQ0VSVExGVUxMJywgc3JjW3QuQ09FUkNFRlVMTF0sIHRydWUpXG5cbi8vIFRpbGRlIHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJyZWFzb25hYmx5IGF0IG9yIGdyZWF0ZXIgdGhhblwiXG5jcmVhdGVUb2tlbignTE9ORVRJTERFJywgJyg/On4+PyknKVxuXG5jcmVhdGVUb2tlbignVElMREVUUklNJywgYChcXFxccyopJHtzcmNbdC5MT05FVElMREVdfVxcXFxzK2AsIHRydWUpXG5leHBvcnRzLnRpbGRlVHJpbVJlcGxhY2UgPSAnJDF+J1xuXG5jcmVhdGVUb2tlbignVElMREUnLCBgXiR7c3JjW3QuTE9ORVRJTERFXX0ke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdUSUxERUxPT1NFJywgYF4ke3NyY1t0LkxPTkVUSUxERV19JHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQ2FyZXQgcmFuZ2VzLlxuLy8gTWVhbmluZyBpcyBcImF0IGxlYXN0IGFuZCBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoXCJcbmNyZWF0ZVRva2VuKCdMT05FQ0FSRVQnLCAnKD86XFxcXF4pJylcblxuY3JlYXRlVG9rZW4oJ0NBUkVUVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuTE9ORUNBUkVUXX1cXFxccytgLCB0cnVlKVxuZXhwb3J0cy5jYXJldFRyaW1SZXBsYWNlID0gJyQxXidcblxuY3JlYXRlVG9rZW4oJ0NBUkVUJywgYF4ke3NyY1t0LkxPTkVDQVJFVF19JHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignQ0FSRVRMT09TRScsIGBeJHtzcmNbdC5MT05FQ0FSRVRdfSR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIEEgc2ltcGxlIGd0L2x0L2VxIHRoaW5nLCBvciBqdXN0IFwiXCIgdG8gaW5kaWNhdGUgXCJhbnkgdmVyc2lvblwiXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUkxPT1NFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKigke3NyY1t0LkxPT1NFUExBSU5dfSkkfF4kYClcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9SJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKigke3NyY1t0LkZVTExQTEFJTl19KSR8XiRgKVxuXG4vLyBBbiBleHByZXNzaW9uIHRvIHN0cmlwIGFueSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIGd0bHQgYW5kIHRoZSB0aGluZ1xuLy8gaXQgbW9kaWZpZXMsIHNvIHRoYXQgYD4gMS4yLjNgID09PiBgPjEuMi4zYFxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JUUklNJywgYChcXFxccyopJHtzcmNbdC5HVExUXVxufVxcXFxzKigke3NyY1t0LkxPT1NFUExBSU5dfXwke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCwgdHJ1ZSlcbmV4cG9ydHMuY29tcGFyYXRvclRyaW1SZXBsYWNlID0gJyQxJDIkMydcblxuLy8gU29tZXRoaW5nIGxpa2UgYDEuMi4zIC0gMS4yLjRgXG4vLyBOb3RlIHRoYXQgdGhlc2UgYWxsIHVzZSB0aGUgbG9vc2UgZm9ybSwgYmVjYXVzZSB0aGV5J2xsIGJlXG4vLyBjaGVja2VkIGFnYWluc3QgZWl0aGVyIHRoZSBzdHJpY3Qgb3IgbG9vc2UgY29tcGFyYXRvciBmb3JtXG4vLyBsYXRlci5cbmNyZWF0ZVRva2VuKCdIWVBIRU5SQU5HRScsIGBeXFxcXHMqKCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgICtcbiAgICAgICAgICAgICAgICAgICBgXFxcXHMrLVxcXFxzK2AgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5YUkFOR0VQTEFJTl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGBcXFxccyokYClcblxuY3JlYXRlVG9rZW4oJ0hZUEhFTlJBTkdFTE9PU0UnLCBgXlxcXFxzKigke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBcXFxccystXFxcXHMrYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYFxcXFxzKiRgKVxuXG4vLyBTdGFyIHJhbmdlcyBiYXNpY2FsbHkganVzdCBhbGxvdyBhbnl0aGluZyBhdCBhbGwuXG5jcmVhdGVUb2tlbignU1RBUicsICcoPHw+KT89P1xcXFxzKlxcXFwqJylcbi8vID49MC4wLjAgaXMgbGlrZSBhIHN0YXJcbmNyZWF0ZVRva2VuKCdHVEUwJywgJ15cXFxccyo+PVxcXFxzKjBcXFxcLjBcXFxcLjBcXFxccyokJylcbmNyZWF0ZVRva2VuKCdHVEUwUFJFJywgJ15cXFxccyo+PVxcXFxzKjBcXFxcLjBcXFxcLjAtMFxcXFxzKiQnKVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8vIEEgbGlua2VkIGxpc3QgdG8ga2VlcCB0cmFjayBvZiByZWNlbnRseS11c2VkLW5lc3NcbmNvbnN0IFlhbGxpc3QgPSByZXF1aXJlKCd5YWxsaXN0JylcblxuY29uc3QgTUFYID0gU3ltYm9sKCdtYXgnKVxuY29uc3QgTEVOR1RIID0gU3ltYm9sKCdsZW5ndGgnKVxuY29uc3QgTEVOR1RIX0NBTENVTEFUT1IgPSBTeW1ib2woJ2xlbmd0aENhbGN1bGF0b3InKVxuY29uc3QgQUxMT1dfU1RBTEUgPSBTeW1ib2woJ2FsbG93U3RhbGUnKVxuY29uc3QgTUFYX0FHRSA9IFN5bWJvbCgnbWF4QWdlJylcbmNvbnN0IERJU1BPU0UgPSBTeW1ib2woJ2Rpc3Bvc2UnKVxuY29uc3QgTk9fRElTUE9TRV9PTl9TRVQgPSBTeW1ib2woJ25vRGlzcG9zZU9uU2V0JylcbmNvbnN0IExSVV9MSVNUID0gU3ltYm9sKCdscnVMaXN0JylcbmNvbnN0IENBQ0hFID0gU3ltYm9sKCdjYWNoZScpXG5jb25zdCBVUERBVEVfQUdFX09OX0dFVCA9IFN5bWJvbCgndXBkYXRlQWdlT25HZXQnKVxuXG5jb25zdCBuYWl2ZUxlbmd0aCA9ICgpID0+IDFcblxuLy8gbHJ1TGlzdCBpcyBhIHlhbGxpc3Qgd2hlcmUgdGhlIGhlYWQgaXMgdGhlIHlvdW5nZXN0XG4vLyBpdGVtLCBhbmQgdGhlIHRhaWwgaXMgdGhlIG9sZGVzdC4gIHRoZSBsaXN0IGNvbnRhaW5zIHRoZSBIaXRcbi8vIG9iamVjdHMgYXMgdGhlIGVudHJpZXMuXG4vLyBFYWNoIEhpdCBvYmplY3QgaGFzIGEgcmVmZXJlbmNlIHRvIGl0cyBZYWxsaXN0Lk5vZGUuICBUaGlzXG4vLyBuZXZlciBjaGFuZ2VzLlxuLy9cbi8vIGNhY2hlIGlzIGEgTWFwIChvciBQc2V1ZG9NYXApIHRoYXQgbWF0Y2hlcyB0aGUga2V5cyB0b1xuLy8gdGhlIFlhbGxpc3QuTm9kZSBvYmplY3QuXG5jbGFzcyBMUlVDYWNoZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJylcbiAgICAgIG9wdGlvbnMgPSB7IG1heDogb3B0aW9ucyB9XG5cbiAgICBpZiAoIW9wdGlvbnMpXG4gICAgICBvcHRpb25zID0ge31cblxuICAgIGlmIChvcHRpb25zLm1heCAmJiAodHlwZW9mIG9wdGlvbnMubWF4ICE9PSAnbnVtYmVyJyB8fCBvcHRpb25zLm1heCA8IDApKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJylcbiAgICAvLyBLaW5kIG9mIHdlaXJkIHRvIGhhdmUgYSBkZWZhdWx0IG1heCBvZiBJbmZpbml0eSwgYnV0IG9oIHdlbGwuXG4gICAgY29uc3QgbWF4ID0gdGhpc1tNQVhdID0gb3B0aW9ucy5tYXggfHwgSW5maW5pdHlcblxuICAgIGNvbnN0IGxjID0gb3B0aW9ucy5sZW5ndGggfHwgbmFpdmVMZW5ndGhcbiAgICB0aGlzW0xFTkdUSF9DQUxDVUxBVE9SXSA9ICh0eXBlb2YgbGMgIT09ICdmdW5jdGlvbicpID8gbmFpdmVMZW5ndGggOiBsY1xuICAgIHRoaXNbQUxMT1dfU1RBTEVdID0gb3B0aW9ucy5zdGFsZSB8fCBmYWxzZVxuICAgIGlmIChvcHRpb25zLm1heEFnZSAmJiB0eXBlb2Ygb3B0aW9ucy5tYXhBZ2UgIT09ICdudW1iZXInKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4QWdlIG11c3QgYmUgYSBudW1iZXInKVxuICAgIHRoaXNbTUFYX0FHRV0gPSBvcHRpb25zLm1heEFnZSB8fCAwXG4gICAgdGhpc1tESVNQT1NFXSA9IG9wdGlvbnMuZGlzcG9zZVxuICAgIHRoaXNbTk9fRElTUE9TRV9PTl9TRVRdID0gb3B0aW9ucy5ub0Rpc3Bvc2VPblNldCB8fCBmYWxzZVxuICAgIHRoaXNbVVBEQVRFX0FHRV9PTl9HRVRdID0gb3B0aW9ucy51cGRhdGVBZ2VPbkdldCB8fCBmYWxzZVxuICAgIHRoaXMucmVzZXQoKVxuICB9XG5cbiAgLy8gcmVzaXplIHRoZSBjYWNoZSB3aGVuIHRoZSBtYXggY2hhbmdlcy5cbiAgc2V0IG1heCAobUwpIHtcbiAgICBpZiAodHlwZW9mIG1MICE9PSAnbnVtYmVyJyB8fCBtTCA8IDApXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXggbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKVxuXG4gICAgdGhpc1tNQVhdID0gbUwgfHwgSW5maW5pdHlcbiAgICB0cmltKHRoaXMpXG4gIH1cbiAgZ2V0IG1heCAoKSB7XG4gICAgcmV0dXJuIHRoaXNbTUFYXVxuICB9XG5cbiAgc2V0IGFsbG93U3RhbGUgKGFsbG93U3RhbGUpIHtcbiAgICB0aGlzW0FMTE9XX1NUQUxFXSA9ICEhYWxsb3dTdGFsZVxuICB9XG4gIGdldCBhbGxvd1N0YWxlICgpIHtcbiAgICByZXR1cm4gdGhpc1tBTExPV19TVEFMRV1cbiAgfVxuXG4gIHNldCBtYXhBZ2UgKG1BKSB7XG4gICAgaWYgKHR5cGVvZiBtQSAhPT0gJ251bWJlcicpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXhBZ2UgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKVxuXG4gICAgdGhpc1tNQVhfQUdFXSA9IG1BXG4gICAgdHJpbSh0aGlzKVxuICB9XG4gIGdldCBtYXhBZ2UgKCkge1xuICAgIHJldHVybiB0aGlzW01BWF9BR0VdXG4gIH1cblxuICAvLyByZXNpemUgdGhlIGNhY2hlIHdoZW4gdGhlIGxlbmd0aENhbGN1bGF0b3IgY2hhbmdlcy5cbiAgc2V0IGxlbmd0aENhbGN1bGF0b3IgKGxDKSB7XG4gICAgaWYgKHR5cGVvZiBsQyAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIGxDID0gbmFpdmVMZW5ndGhcblxuICAgIGlmIChsQyAhPT0gdGhpc1tMRU5HVEhfQ0FMQ1VMQVRPUl0pIHtcbiAgICAgIHRoaXNbTEVOR1RIX0NBTENVTEFUT1JdID0gbENcbiAgICAgIHRoaXNbTEVOR1RIXSA9IDBcbiAgICAgIHRoaXNbTFJVX0xJU1RdLmZvckVhY2goaGl0ID0+IHtcbiAgICAgICAgaGl0Lmxlbmd0aCA9IHRoaXNbTEVOR1RIX0NBTENVTEFUT1JdKGhpdC52YWx1ZSwgaGl0LmtleSlcbiAgICAgICAgdGhpc1tMRU5HVEhdICs9IGhpdC5sZW5ndGhcbiAgICAgIH0pXG4gICAgfVxuICAgIHRyaW0odGhpcylcbiAgfVxuICBnZXQgbGVuZ3RoQ2FsY3VsYXRvciAoKSB7IHJldHVybiB0aGlzW0xFTkdUSF9DQUxDVUxBVE9SXSB9XG5cbiAgZ2V0IGxlbmd0aCAoKSB7IHJldHVybiB0aGlzW0xFTkdUSF0gfVxuICBnZXQgaXRlbUNvdW50ICgpIHsgcmV0dXJuIHRoaXNbTFJVX0xJU1RdLmxlbmd0aCB9XG5cbiAgcmZvckVhY2ggKGZuLCB0aGlzcCkge1xuICAgIHRoaXNwID0gdGhpc3AgfHwgdGhpc1xuICAgIGZvciAobGV0IHdhbGtlciA9IHRoaXNbTFJVX0xJU1RdLnRhaWw7IHdhbGtlciAhPT0gbnVsbDspIHtcbiAgICAgIGNvbnN0IHByZXYgPSB3YWxrZXIucHJldlxuICAgICAgZm9yRWFjaFN0ZXAodGhpcywgZm4sIHdhbGtlciwgdGhpc3ApXG4gICAgICB3YWxrZXIgPSBwcmV2XG4gICAgfVxuICB9XG5cbiAgZm9yRWFjaCAoZm4sIHRoaXNwKSB7XG4gICAgdGhpc3AgPSB0aGlzcCB8fCB0aGlzXG4gICAgZm9yIChsZXQgd2Fsa2VyID0gdGhpc1tMUlVfTElTVF0uaGVhZDsgd2Fsa2VyICE9PSBudWxsOykge1xuICAgICAgY29uc3QgbmV4dCA9IHdhbGtlci5uZXh0XG4gICAgICBmb3JFYWNoU3RlcCh0aGlzLCBmbiwgd2Fsa2VyLCB0aGlzcClcbiAgICAgIHdhbGtlciA9IG5leHRcbiAgICB9XG4gIH1cblxuICBrZXlzICgpIHtcbiAgICByZXR1cm4gdGhpc1tMUlVfTElTVF0udG9BcnJheSgpLm1hcChrID0+IGsua2V5KVxuICB9XG5cbiAgdmFsdWVzICgpIHtcbiAgICByZXR1cm4gdGhpc1tMUlVfTElTVF0udG9BcnJheSgpLm1hcChrID0+IGsudmFsdWUpXG4gIH1cblxuICByZXNldCAoKSB7XG4gICAgaWYgKHRoaXNbRElTUE9TRV0gJiZcbiAgICAgICAgdGhpc1tMUlVfTElTVF0gJiZcbiAgICAgICAgdGhpc1tMUlVfTElTVF0ubGVuZ3RoKSB7XG4gICAgICB0aGlzW0xSVV9MSVNUXS5mb3JFYWNoKGhpdCA9PiB0aGlzW0RJU1BPU0VdKGhpdC5rZXksIGhpdC52YWx1ZSkpXG4gICAgfVxuXG4gICAgdGhpc1tDQUNIRV0gPSBuZXcgTWFwKCkgLy8gaGFzaCBvZiBpdGVtcyBieSBrZXlcbiAgICB0aGlzW0xSVV9MSVNUXSA9IG5ldyBZYWxsaXN0KCkgLy8gbGlzdCBvZiBpdGVtcyBpbiBvcmRlciBvZiB1c2UgcmVjZW5jeVxuICAgIHRoaXNbTEVOR1RIXSA9IDAgLy8gbGVuZ3RoIG9mIGl0ZW1zIGluIHRoZSBsaXN0XG4gIH1cblxuICBkdW1wICgpIHtcbiAgICByZXR1cm4gdGhpc1tMUlVfTElTVF0ubWFwKGhpdCA9PlxuICAgICAgaXNTdGFsZSh0aGlzLCBoaXQpID8gZmFsc2UgOiB7XG4gICAgICAgIGs6IGhpdC5rZXksXG4gICAgICAgIHY6IGhpdC52YWx1ZSxcbiAgICAgICAgZTogaGl0Lm5vdyArIChoaXQubWF4QWdlIHx8IDApXG4gICAgICB9KS50b0FycmF5KCkuZmlsdGVyKGggPT4gaClcbiAgfVxuXG4gIGR1bXBMcnUgKCkge1xuICAgIHJldHVybiB0aGlzW0xSVV9MSVNUXVxuICB9XG5cbiAgc2V0IChrZXksIHZhbHVlLCBtYXhBZ2UpIHtcbiAgICBtYXhBZ2UgPSBtYXhBZ2UgfHwgdGhpc1tNQVhfQUdFXVxuXG4gICAgaWYgKG1heEFnZSAmJiB0eXBlb2YgbWF4QWdlICE9PSAnbnVtYmVyJylcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heEFnZSBtdXN0IGJlIGEgbnVtYmVyJylcblxuICAgIGNvbnN0IG5vdyA9IG1heEFnZSA/IERhdGUubm93KCkgOiAwXG4gICAgY29uc3QgbGVuID0gdGhpc1tMRU5HVEhfQ0FMQ1VMQVRPUl0odmFsdWUsIGtleSlcblxuICAgIGlmICh0aGlzW0NBQ0hFXS5oYXMoa2V5KSkge1xuICAgICAgaWYgKGxlbiA+IHRoaXNbTUFYXSkge1xuICAgICAgICBkZWwodGhpcywgdGhpc1tDQUNIRV0uZ2V0KGtleSkpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBub2RlID0gdGhpc1tDQUNIRV0uZ2V0KGtleSlcbiAgICAgIGNvbnN0IGl0ZW0gPSBub2RlLnZhbHVlXG5cbiAgICAgIC8vIGRpc3Bvc2Ugb2YgdGhlIG9sZCBvbmUgYmVmb3JlIG92ZXJ3cml0aW5nXG4gICAgICAvLyBzcGxpdCBvdXQgaW50byAyIGlmcyBmb3IgYmV0dGVyIGNvdmVyYWdlIHRyYWNraW5nXG4gICAgICBpZiAodGhpc1tESVNQT1NFXSkge1xuICAgICAgICBpZiAoIXRoaXNbTk9fRElTUE9TRV9PTl9TRVRdKVxuICAgICAgICAgIHRoaXNbRElTUE9TRV0oa2V5LCBpdGVtLnZhbHVlKVxuICAgICAgfVxuXG4gICAgICBpdGVtLm5vdyA9IG5vd1xuICAgICAgaXRlbS5tYXhBZ2UgPSBtYXhBZ2VcbiAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZVxuICAgICAgdGhpc1tMRU5HVEhdICs9IGxlbiAtIGl0ZW0ubGVuZ3RoXG4gICAgICBpdGVtLmxlbmd0aCA9IGxlblxuICAgICAgdGhpcy5nZXQoa2V5KVxuICAgICAgdHJpbSh0aGlzKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBoaXQgPSBuZXcgRW50cnkoa2V5LCB2YWx1ZSwgbGVuLCBub3csIG1heEFnZSlcblxuICAgIC8vIG92ZXJzaXplZCBvYmplY3RzIGZhbGwgb3V0IG9mIGNhY2hlIGF1dG9tYXRpY2FsbHkuXG4gICAgaWYgKGhpdC5sZW5ndGggPiB0aGlzW01BWF0pIHtcbiAgICAgIGlmICh0aGlzW0RJU1BPU0VdKVxuICAgICAgICB0aGlzW0RJU1BPU0VdKGtleSwgdmFsdWUpXG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHRoaXNbTEVOR1RIXSArPSBoaXQubGVuZ3RoXG4gICAgdGhpc1tMUlVfTElTVF0udW5zaGlmdChoaXQpXG4gICAgdGhpc1tDQUNIRV0uc2V0KGtleSwgdGhpc1tMUlVfTElTVF0uaGVhZClcbiAgICB0cmltKHRoaXMpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGhhcyAoa2V5KSB7XG4gICAgaWYgKCF0aGlzW0NBQ0hFXS5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlXG4gICAgY29uc3QgaGl0ID0gdGhpc1tDQUNIRV0uZ2V0KGtleSkudmFsdWVcbiAgICByZXR1cm4gIWlzU3RhbGUodGhpcywgaGl0KVxuICB9XG5cbiAgZ2V0IChrZXkpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSwgdHJ1ZSlcbiAgfVxuXG4gIHBlZWsgKGtleSkge1xuICAgIHJldHVybiBnZXQodGhpcywga2V5LCBmYWxzZSlcbiAgfVxuXG4gIHBvcCAoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXNbTFJVX0xJU1RdLnRhaWxcbiAgICBpZiAoIW5vZGUpXG4gICAgICByZXR1cm4gbnVsbFxuXG4gICAgZGVsKHRoaXMsIG5vZGUpXG4gICAgcmV0dXJuIG5vZGUudmFsdWVcbiAgfVxuXG4gIGRlbCAoa2V5KSB7XG4gICAgZGVsKHRoaXMsIHRoaXNbQ0FDSEVdLmdldChrZXkpKVxuICB9XG5cbiAgbG9hZCAoYXJyKSB7XG4gICAgLy8gcmVzZXQgdGhlIGNhY2hlXG4gICAgdGhpcy5yZXNldCgpXG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgLy8gQSBwcmV2aW91cyBzZXJpYWxpemVkIGNhY2hlIGhhcyB0aGUgbW9zdCByZWNlbnQgaXRlbXMgZmlyc3RcbiAgICBmb3IgKGxldCBsID0gYXJyLmxlbmd0aCAtIDE7IGwgPj0gMDsgbC0tKSB7XG4gICAgICBjb25zdCBoaXQgPSBhcnJbbF1cbiAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IGhpdC5lIHx8IDBcbiAgICAgIGlmIChleHBpcmVzQXQgPT09IDApXG4gICAgICAgIC8vIHRoZSBpdGVtIHdhcyBjcmVhdGVkIHdpdGhvdXQgZXhwaXJhdGlvbiBpbiBhIG5vbiBhZ2VkIGNhY2hlXG4gICAgICAgIHRoaXMuc2V0KGhpdC5rLCBoaXQudilcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBtYXhBZ2UgPSBleHBpcmVzQXQgLSBub3dcbiAgICAgICAgLy8gZG9udCBhZGQgYWxyZWFkeSBleHBpcmVkIGl0ZW1zXG4gICAgICAgIGlmIChtYXhBZ2UgPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXQoaGl0LmssIGhpdC52LCBtYXhBZ2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcnVuZSAoKSB7XG4gICAgdGhpc1tDQUNIRV0uZm9yRWFjaCgodmFsdWUsIGtleSkgPT4gZ2V0KHRoaXMsIGtleSwgZmFsc2UpKVxuICB9XG59XG5cbmNvbnN0IGdldCA9IChzZWxmLCBrZXksIGRvVXNlKSA9PiB7XG4gIGNvbnN0IG5vZGUgPSBzZWxmW0NBQ0hFXS5nZXQoa2V5KVxuICBpZiAobm9kZSkge1xuICAgIGNvbnN0IGhpdCA9IG5vZGUudmFsdWVcbiAgICBpZiAoaXNTdGFsZShzZWxmLCBoaXQpKSB7XG4gICAgICBkZWwoc2VsZiwgbm9kZSlcbiAgICAgIGlmICghc2VsZltBTExPV19TVEFMRV0pXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRvVXNlKSB7XG4gICAgICAgIGlmIChzZWxmW1VQREFURV9BR0VfT05fR0VUXSlcbiAgICAgICAgICBub2RlLnZhbHVlLm5vdyA9IERhdGUubm93KClcbiAgICAgICAgc2VsZltMUlVfTElTVF0udW5zaGlmdE5vZGUobm9kZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhpdC52YWx1ZVxuICB9XG59XG5cbmNvbnN0IGlzU3RhbGUgPSAoc2VsZiwgaGl0KSA9PiB7XG4gIGlmICghaGl0IHx8ICghaGl0Lm1heEFnZSAmJiAhc2VsZltNQVhfQUdFXSkpXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgZGlmZiA9IERhdGUubm93KCkgLSBoaXQubm93XG4gIHJldHVybiBoaXQubWF4QWdlID8gZGlmZiA+IGhpdC5tYXhBZ2VcbiAgICA6IHNlbGZbTUFYX0FHRV0gJiYgKGRpZmYgPiBzZWxmW01BWF9BR0VdKVxufVxuXG5jb25zdCB0cmltID0gc2VsZiA9PiB7XG4gIGlmIChzZWxmW0xFTkdUSF0gPiBzZWxmW01BWF0pIHtcbiAgICBmb3IgKGxldCB3YWxrZXIgPSBzZWxmW0xSVV9MSVNUXS50YWlsO1xuICAgICAgc2VsZltMRU5HVEhdID4gc2VsZltNQVhdICYmIHdhbGtlciAhPT0gbnVsbDspIHtcbiAgICAgIC8vIFdlIGtub3cgdGhhdCB3ZSdyZSBhYm91dCB0byBkZWxldGUgdGhpcyBvbmUsIGFuZCBhbHNvXG4gICAgICAvLyB3aGF0IHRoZSBuZXh0IGxlYXN0IHJlY2VudGx5IHVzZWQga2V5IHdpbGwgYmUsIHNvIGp1c3RcbiAgICAgIC8vIGdvIGFoZWFkIGFuZCBzZXQgaXQgbm93LlxuICAgICAgY29uc3QgcHJldiA9IHdhbGtlci5wcmV2XG4gICAgICBkZWwoc2VsZiwgd2Fsa2VyKVxuICAgICAgd2Fsa2VyID0gcHJldlxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBkZWwgPSAoc2VsZiwgbm9kZSkgPT4ge1xuICBpZiAobm9kZSkge1xuICAgIGNvbnN0IGhpdCA9IG5vZGUudmFsdWVcbiAgICBpZiAoc2VsZltESVNQT1NFXSlcbiAgICAgIHNlbGZbRElTUE9TRV0oaGl0LmtleSwgaGl0LnZhbHVlKVxuXG4gICAgc2VsZltMRU5HVEhdIC09IGhpdC5sZW5ndGhcbiAgICBzZWxmW0NBQ0hFXS5kZWxldGUoaGl0LmtleSlcbiAgICBzZWxmW0xSVV9MSVNUXS5yZW1vdmVOb2RlKG5vZGUpXG4gIH1cbn1cblxuY2xhc3MgRW50cnkge1xuICBjb25zdHJ1Y3RvciAoa2V5LCB2YWx1ZSwgbGVuZ3RoLCBub3csIG1heEFnZSkge1xuICAgIHRoaXMua2V5ID0ga2V5XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgdGhpcy5sZW5ndGggPSBsZW5ndGhcbiAgICB0aGlzLm5vdyA9IG5vd1xuICAgIHRoaXMubWF4QWdlID0gbWF4QWdlIHx8IDBcbiAgfVxufVxuXG5jb25zdCBmb3JFYWNoU3RlcCA9IChzZWxmLCBmbiwgbm9kZSwgdGhpc3ApID0+IHtcbiAgbGV0IGhpdCA9IG5vZGUudmFsdWVcbiAgaWYgKGlzU3RhbGUoc2VsZiwgaGl0KSkge1xuICAgIGRlbChzZWxmLCBub2RlKVxuICAgIGlmICghc2VsZltBTExPV19TVEFMRV0pXG4gICAgICBoaXQgPSB1bmRlZmluZWRcbiAgfVxuICBpZiAoaGl0KVxuICAgIGZuLmNhbGwodGhpc3AsIGhpdC52YWx1ZSwgaGl0LmtleSwgc2VsZilcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMUlVDYWNoZVxuIiwiLy8gRGV0ZXJtaW5lIGlmIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIGFsbCB0aGUgdmVyc2lvbnMgcG9zc2libGUgaW4gdGhlIHJhbmdlLlxuY29uc3Qgb3V0c2lkZSA9IHJlcXVpcmUoJy4vb3V0c2lkZScpXG5jb25zdCBndHIgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsICc+Jywgb3B0aW9ucylcbm1vZHVsZS5leHBvcnRzID0gZ3RyXG4iLCJjb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgaW50ZXJzZWN0cyA9IChyMSwgcjIsIG9wdGlvbnMpID0+IHtcbiAgcjEgPSBuZXcgUmFuZ2UocjEsIG9wdGlvbnMpXG4gIHIyID0gbmV3IFJhbmdlKHIyLCBvcHRpb25zKVxuICByZXR1cm4gcjEuaW50ZXJzZWN0cyhyMiwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gaW50ZXJzZWN0c1xuIiwiY29uc3Qgb3V0c2lkZSA9IHJlcXVpcmUoJy4vb3V0c2lkZScpXG4vLyBEZXRlcm1pbmUgaWYgdmVyc2lvbiBpcyBsZXNzIHRoYW4gYWxsIHRoZSB2ZXJzaW9ucyBwb3NzaWJsZSBpbiB0aGUgcmFuZ2VcbmNvbnN0IGx0ciA9ICh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykgPT4gb3V0c2lkZSh2ZXJzaW9uLCByYW5nZSwgJzwnLCBvcHRpb25zKVxubW9kdWxlLmV4cG9ydHMgPSBsdHJcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5cbmNvbnN0IG1heFNhdGlzZnlpbmcgPSAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIGxldCBtYXggPSBudWxsXG4gIGxldCBtYXhTViA9IG51bGxcbiAgbGV0IHJhbmdlT2JqID0gbnVsbFxuICB0cnkge1xuICAgIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaCgodikgPT4ge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7XG4gICAgICAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgICBpZiAoIW1heCB8fCBtYXhTVi5jb21wYXJlKHYpID09PSAtMSkge1xuICAgICAgICAvLyBjb21wYXJlKG1heCwgdiwgdHJ1ZSlcbiAgICAgICAgbWF4ID0gdlxuICAgICAgICBtYXhTViA9IG5ldyBTZW1WZXIobWF4LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1heFxufVxubW9kdWxlLmV4cG9ydHMgPSBtYXhTYXRpc2Z5aW5nXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgbWluU2F0aXNmeWluZyA9ICh2ZXJzaW9ucywgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgbGV0IG1pbiA9IG51bGxcbiAgbGV0IG1pblNWID0gbnVsbFxuICBsZXQgcmFuZ2VPYmogPSBudWxsXG4gIHRyeSB7XG4gICAgcmFuZ2VPYmogPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICB2ZXJzaW9ucy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgaWYgKHJhbmdlT2JqLnRlc3QodikpIHtcbiAgICAgIC8vIHNhdGlzZmllcyh2LCByYW5nZSwgb3B0aW9ucylcbiAgICAgIGlmICghbWluIHx8IG1pblNWLmNvbXBhcmUodikgPT09IDEpIHtcbiAgICAgICAgLy8gY29tcGFyZShtaW4sIHYsIHRydWUpXG4gICAgICAgIG1pbiA9IHZcbiAgICAgICAgbWluU1YgPSBuZXcgU2VtVmVyKG1pbiwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBtaW5cbn1cbm1vZHVsZS5leHBvcnRzID0gbWluU2F0aXNmeWluZ1xuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0JylcblxuY29uc3QgbWluVmVyc2lvbiA9IChyYW5nZSwgbG9vc2UpID0+IHtcbiAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIGxvb3NlKVxuXG4gIGxldCBtaW52ZXIgPSBuZXcgU2VtVmVyKCcwLjAuMCcpXG4gIGlmIChyYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICBtaW52ZXIgPSBuZXcgU2VtVmVyKCcwLjAuMC0wJylcbiAgaWYgKHJhbmdlLnRlc3QobWludmVyKSkge1xuICAgIHJldHVybiBtaW52ZXJcbiAgfVxuXG4gIG1pbnZlciA9IG51bGxcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZS5zZXQubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlLnNldFtpXVxuXG4gICAgbGV0IHNldE1pbiA9IG51bGxcbiAgICBjb21wYXJhdG9ycy5mb3JFYWNoKChjb21wYXJhdG9yKSA9PiB7XG4gICAgICAvLyBDbG9uZSB0byBhdm9pZCBtYW5pcHVsYXRpbmcgdGhlIGNvbXBhcmF0b3IncyBzZW12ZXIgb2JqZWN0LlxuICAgICAgY29uc3QgY29tcHZlciA9IG5ldyBTZW1WZXIoY29tcGFyYXRvci5zZW12ZXIudmVyc2lvbilcbiAgICAgIHN3aXRjaCAoY29tcGFyYXRvci5vcGVyYXRvcikge1xuICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICBpZiAoY29tcHZlci5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29tcHZlci5wYXRjaCsrXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXB2ZXIucHJlcmVsZWFzZS5wdXNoKDApXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbXB2ZXIucmF3ID0gY29tcHZlci5mb3JtYXQoKVxuICAgICAgICAgIC8qIGZhbGx0aHJvdWdoICovXG4gICAgICAgIGNhc2UgJyc6XG4gICAgICAgIGNhc2UgJz49JzpcbiAgICAgICAgICBpZiAoIXNldE1pbiB8fCBndChjb21wdmVyLCBzZXRNaW4pKSB7XG4gICAgICAgICAgICBzZXRNaW4gPSBjb21wdmVyXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJzwnOlxuICAgICAgICBjYXNlICc8PSc6XG4gICAgICAgICAgLyogSWdub3JlIG1heGltdW0gdmVyc2lvbnMgKi9cbiAgICAgICAgICBicmVha1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcGVyYXRpb246ICR7Y29tcGFyYXRvci5vcGVyYXRvcn1gKVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKHNldE1pbiAmJiAoIW1pbnZlciB8fCBndChtaW52ZXIsIHNldE1pbikpKSB7XG4gICAgICBtaW52ZXIgPSBzZXRNaW5cbiAgICB9XG4gIH1cblxuICBpZiAobWludmVyICYmIHJhbmdlLnRlc3QobWludmVyKSkge1xuICAgIHJldHVybiBtaW52ZXJcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IG1pblZlcnNpb25cbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuLi9jbGFzc2VzL2NvbXBhcmF0b3InKVxuY29uc3QgeyBBTlkgfSA9IENvbXBhcmF0b3JcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzJylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0JylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9sdGUnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0ZScpXG5cbmNvbnN0IG91dHNpZGUgPSAodmVyc2lvbiwgcmFuZ2UsIGhpbG8sIG9wdGlvbnMpID0+IHtcbiAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgb3B0aW9ucylcbiAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG5cbiAgbGV0IGd0Zm4sIGx0ZWZuLCBsdGZuLCBjb21wLCBlY29tcFxuICBzd2l0Y2ggKGhpbG8pIHtcbiAgICBjYXNlICc+JzpcbiAgICAgIGd0Zm4gPSBndFxuICAgICAgbHRlZm4gPSBsdGVcbiAgICAgIGx0Zm4gPSBsdFxuICAgICAgY29tcCA9ICc+J1xuICAgICAgZWNvbXAgPSAnPj0nXG4gICAgICBicmVha1xuICAgIGNhc2UgJzwnOlxuICAgICAgZ3RmbiA9IGx0XG4gICAgICBsdGVmbiA9IGd0ZVxuICAgICAgbHRmbiA9IGd0XG4gICAgICBjb21wID0gJzwnXG4gICAgICBlY29tcCA9ICc8PSdcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ011c3QgcHJvdmlkZSBhIGhpbG8gdmFsIG9mIFwiPFwiIG9yIFwiPlwiJylcbiAgfVxuXG4gIC8vIElmIGl0IHNhdGlzZmllcyB0aGUgcmFuZ2UgaXQgaXMgbm90IG91dHNpZGVcbiAgaWYgKHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIEZyb20gbm93IG9uLCB2YXJpYWJsZSB0ZXJtcyBhcmUgYXMgaWYgd2UncmUgaW4gXCJndHJcIiBtb2RlLlxuICAvLyBidXQgbm90ZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgZmxpcHBlZCBmb3IgdGhlIFwibHRyXCIgZnVuY3Rpb24uXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZS5zZXQubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlLnNldFtpXVxuXG4gICAgbGV0IGhpZ2ggPSBudWxsXG4gICAgbGV0IGxvdyA9IG51bGxcblxuICAgIGNvbXBhcmF0b3JzLmZvckVhY2goKGNvbXBhcmF0b3IpID0+IHtcbiAgICAgIGlmIChjb21wYXJhdG9yLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcignPj0wLjAuMCcpXG4gICAgICB9XG4gICAgICBoaWdoID0gaGlnaCB8fCBjb21wYXJhdG9yXG4gICAgICBsb3cgPSBsb3cgfHwgY29tcGFyYXRvclxuICAgICAgaWYgKGd0Zm4oY29tcGFyYXRvci5zZW12ZXIsIGhpZ2guc2VtdmVyLCBvcHRpb25zKSkge1xuICAgICAgICBoaWdoID0gY29tcGFyYXRvclxuICAgICAgfSBlbHNlIGlmIChsdGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBsb3cuc2VtdmVyLCBvcHRpb25zKSkge1xuICAgICAgICBsb3cgPSBjb21wYXJhdG9yXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIElmIHRoZSBlZGdlIHZlcnNpb24gY29tcGFyYXRvciBoYXMgYSBvcGVyYXRvciB0aGVuIG91ciB2ZXJzaW9uXG4gICAgLy8gaXNuJ3Qgb3V0c2lkZSBpdFxuICAgIGlmIChoaWdoLm9wZXJhdG9yID09PSBjb21wIHx8IGhpZ2gub3BlcmF0b3IgPT09IGVjb21wKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbG93ZXN0IHZlcnNpb24gY29tcGFyYXRvciBoYXMgYW4gb3BlcmF0b3IgYW5kIG91ciB2ZXJzaW9uXG4gICAgLy8gaXMgbGVzcyB0aGFuIGl0IHRoZW4gaXQgaXNuJ3QgaGlnaGVyIHRoYW4gdGhlIHJhbmdlXG4gICAgaWYgKCghbG93Lm9wZXJhdG9yIHx8IGxvdy5vcGVyYXRvciA9PT0gY29tcCkgJiZcbiAgICAgICAgbHRlZm4odmVyc2lvbiwgbG93LnNlbXZlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSBpZiAobG93Lm9wZXJhdG9yID09PSBlY29tcCAmJiBsdGZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdXRzaWRlXG4iLCIvLyBnaXZlbiBhIHNldCBvZiB2ZXJzaW9ucyBhbmQgYSByYW5nZSwgY3JlYXRlIGEgXCJzaW1wbGlmaWVkXCIgcmFuZ2Vcbi8vIHRoYXQgaW5jbHVkZXMgdGhlIHNhbWUgdmVyc2lvbnMgdGhhdCB0aGUgb3JpZ2luYWwgcmFuZ2UgZG9lc1xuLy8gSWYgdGhlIG9yaWdpbmFsIHJhbmdlIGlzIHNob3J0ZXIgdGhhbiB0aGUgc2ltcGxpZmllZCBvbmUsIHJldHVybiB0aGF0LlxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL3NhdGlzZmllcy5qcycpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2NvbXBhcmUuanMnKVxubW9kdWxlLmV4cG9ydHMgPSAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHNldCA9IFtdXG4gIGxldCBmaXJzdCA9IG51bGxcbiAgbGV0IHByZXYgPSBudWxsXG4gIGNvbnN0IHYgPSB2ZXJzaW9ucy5zb3J0KChhLCBiKSA9PiBjb21wYXJlKGEsIGIsIG9wdGlvbnMpKVxuICBmb3IgKGNvbnN0IHZlcnNpb24gb2Ygdikge1xuICAgIGNvbnN0IGluY2x1ZGVkID0gc2F0aXNmaWVzKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKVxuICAgIGlmIChpbmNsdWRlZCkge1xuICAgICAgcHJldiA9IHZlcnNpb25cbiAgICAgIGlmICghZmlyc3QpIHtcbiAgICAgICAgZmlyc3QgPSB2ZXJzaW9uXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHNldC5wdXNoKFtmaXJzdCwgcHJldl0pXG4gICAgICB9XG4gICAgICBwcmV2ID0gbnVsbFxuICAgICAgZmlyc3QgPSBudWxsXG4gICAgfVxuICB9XG4gIGlmIChmaXJzdCkge1xuICAgIHNldC5wdXNoKFtmaXJzdCwgbnVsbF0pXG4gIH1cblxuICBjb25zdCByYW5nZXMgPSBbXVxuICBmb3IgKGNvbnN0IFttaW4sIG1heF0gb2Ygc2V0KSB7XG4gICAgaWYgKG1pbiA9PT0gbWF4KSB7XG4gICAgICByYW5nZXMucHVzaChtaW4pXG4gICAgfSBlbHNlIGlmICghbWF4ICYmIG1pbiA9PT0gdlswXSkge1xuICAgICAgcmFuZ2VzLnB1c2goJyonKVxuICAgIH0gZWxzZSBpZiAoIW1heCkge1xuICAgICAgcmFuZ2VzLnB1c2goYD49JHttaW59YClcbiAgICB9IGVsc2UgaWYgKG1pbiA9PT0gdlswXSkge1xuICAgICAgcmFuZ2VzLnB1c2goYDw9JHttYXh9YClcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2VzLnB1c2goYCR7bWlufSAtICR7bWF4fWApXG4gICAgfVxuICB9XG4gIGNvbnN0IHNpbXBsaWZpZWQgPSByYW5nZXMuam9pbignIHx8ICcpXG4gIGNvbnN0IG9yaWdpbmFsID0gdHlwZW9mIHJhbmdlLnJhdyA9PT0gJ3N0cmluZycgPyByYW5nZS5yYXcgOiBTdHJpbmcocmFuZ2UpXG4gIHJldHVybiBzaW1wbGlmaWVkLmxlbmd0aCA8IG9yaWdpbmFsLmxlbmd0aCA/IHNpbXBsaWZpZWQgOiByYW5nZVxufVxuIiwiY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlLmpzJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuLi9jbGFzc2VzL2NvbXBhcmF0b3IuanMnKVxuY29uc3QgeyBBTlkgfSA9IENvbXBhcmF0b3JcbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9zYXRpc2ZpZXMuanMnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jb21wYXJlLmpzJylcblxuLy8gQ29tcGxleCByYW5nZSBgcjEgfHwgcjIgfHwgLi4uYCBpcyBhIHN1YnNldCBvZiBgUjEgfHwgUjIgfHwgLi4uYCBpZmY6XG4vLyAtIEV2ZXJ5IHNpbXBsZSByYW5nZSBgcjEsIHIyLCAuLi5gIGlzIGEgbnVsbCBzZXQsIE9SXG4vLyAtIEV2ZXJ5IHNpbXBsZSByYW5nZSBgcjEsIHIyLCAuLi5gIHdoaWNoIGlzIG5vdCBhIG51bGwgc2V0IGlzIGEgc3Vic2V0IG9mXG4vLyAgIHNvbWUgYFIxLCBSMiwgLi4uYFxuLy9cbi8vIFNpbXBsZSByYW5nZSBgYzEgYzIgLi4uYCBpcyBhIHN1YnNldCBvZiBzaW1wbGUgcmFuZ2UgYEMxIEMyIC4uLmAgaWZmOlxuLy8gLSBJZiBjIGlzIG9ubHkgdGhlIEFOWSBjb21wYXJhdG9yXG4vLyAgIC0gSWYgQyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvciwgcmV0dXJuIHRydWVcbi8vICAgLSBFbHNlIGlmIGluIHByZXJlbGVhc2UgbW9kZSwgcmV0dXJuIGZhbHNlXG4vLyAgIC0gZWxzZSByZXBsYWNlIGMgd2l0aCBgWz49MC4wLjBdYFxuLy8gLSBJZiBDIGlzIG9ubHkgdGhlIEFOWSBjb21wYXJhdG9yXG4vLyAgIC0gaWYgaW4gcHJlcmVsZWFzZSBtb2RlLCByZXR1cm4gdHJ1ZVxuLy8gICAtIGVsc2UgcmVwbGFjZSBDIHdpdGggYFs+PTAuMC4wXWBcbi8vIC0gTGV0IEVRIGJlIHRoZSBzZXQgb2YgPSBjb21wYXJhdG9ycyBpbiBjXG4vLyAtIElmIEVRIGlzIG1vcmUgdGhhbiBvbmUsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vIC0gTGV0IEdUIGJlIHRoZSBoaWdoZXN0ID4gb3IgPj0gY29tcGFyYXRvciBpbiBjXG4vLyAtIExldCBMVCBiZSB0aGUgbG93ZXN0IDwgb3IgPD0gY29tcGFyYXRvciBpbiBjXG4vLyAtIElmIEdUIGFuZCBMVCwgYW5kIEdULnNlbXZlciA+IExULnNlbXZlciwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gLSBJZiBhbnkgQyBpcyBhID0gcmFuZ2UsIGFuZCBHVCBvciBMVCBhcmUgc2V0LCByZXR1cm4gZmFsc2Vcbi8vIC0gSWYgRVFcbi8vICAgLSBJZiBHVCwgYW5kIEVRIGRvZXMgbm90IHNhdGlzZnkgR1QsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vICAgLSBJZiBMVCwgYW5kIEVRIGRvZXMgbm90IHNhdGlzZnkgTFQsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vICAgLSBJZiBFUSBzYXRpc2ZpZXMgZXZlcnkgQywgcmV0dXJuIHRydWVcbi8vICAgLSBFbHNlIHJldHVybiBmYWxzZVxuLy8gLSBJZiBHVFxuLy8gICAtIElmIEdULnNlbXZlciBpcyBsb3dlciB0aGFuIGFueSA+IG9yID49IGNvbXAgaW4gQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgR1QgaXMgPj0sIGFuZCBHVC5zZW12ZXIgZG9lcyBub3Qgc2F0aXNmeSBldmVyeSBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBHVC5zZW12ZXIgaGFzIGEgcHJlcmVsZWFzZSwgYW5kIG5vdCBpbiBwcmVyZWxlYXNlIG1vZGVcbi8vICAgICAtIElmIG5vIEMgaGFzIGEgcHJlcmVsZWFzZSBhbmQgdGhlIEdULnNlbXZlciB0dXBsZSwgcmV0dXJuIGZhbHNlXG4vLyAtIElmIExUXG4vLyAgIC0gSWYgTFQuc2VtdmVyIGlzIGdyZWF0ZXIgdGhhbiBhbnkgPCBvciA8PSBjb21wIGluIEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIExUIGlzIDw9LCBhbmQgTFQuc2VtdmVyIGRvZXMgbm90IHNhdGlzZnkgZXZlcnkgQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgR1Quc2VtdmVyIGhhcyBhIHByZXJlbGVhc2UsIGFuZCBub3QgaW4gcHJlcmVsZWFzZSBtb2RlXG4vLyAgICAgLSBJZiBubyBDIGhhcyBhIHByZXJlbGVhc2UgYW5kIHRoZSBMVC5zZW12ZXIgdHVwbGUsIHJldHVybiBmYWxzZVxuLy8gLSBFbHNlIHJldHVybiB0cnVlXG5cbmNvbnN0IHN1YnNldCA9IChzdWIsIGRvbSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmIChzdWIgPT09IGRvbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBzdWIgPSBuZXcgUmFuZ2Uoc3ViLCBvcHRpb25zKVxuICBkb20gPSBuZXcgUmFuZ2UoZG9tLCBvcHRpb25zKVxuICBsZXQgc2F3Tm9uTnVsbCA9IGZhbHNlXG5cbiAgT1VURVI6IGZvciAoY29uc3Qgc2ltcGxlU3ViIG9mIHN1Yi5zZXQpIHtcbiAgICBmb3IgKGNvbnN0IHNpbXBsZURvbSBvZiBkb20uc2V0KSB7XG4gICAgICBjb25zdCBpc1N1YiA9IHNpbXBsZVN1YnNldChzaW1wbGVTdWIsIHNpbXBsZURvbSwgb3B0aW9ucylcbiAgICAgIHNhd05vbk51bGwgPSBzYXdOb25OdWxsIHx8IGlzU3ViICE9PSBudWxsXG4gICAgICBpZiAoaXNTdWIpIHtcbiAgICAgICAgY29udGludWUgT1VURVJcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdGhlIG51bGwgc2V0IGlzIGEgc3Vic2V0IG9mIGV2ZXJ5dGhpbmcsIGJ1dCBudWxsIHNpbXBsZSByYW5nZXMgaW5cbiAgICAvLyBhIGNvbXBsZXggcmFuZ2Ugc2hvdWxkIGJlIGlnbm9yZWQuICBzbyBpZiB3ZSBzYXcgYSBub24tbnVsbCByYW5nZSxcbiAgICAvLyB0aGVuIHdlIGtub3cgdGhpcyBpc24ndCBhIHN1YnNldCwgYnV0IGlmIEVWRVJZIHNpbXBsZSByYW5nZSB3YXMgbnVsbCxcbiAgICAvLyB0aGVuIGl0IGlzIGEgc3Vic2V0LlxuICAgIGlmIChzYXdOb25OdWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgbWluaW11bVZlcnNpb25XaXRoUHJlUmVsZWFzZSA9IFtuZXcgQ29tcGFyYXRvcignPj0wLjAuMC0wJyldXG5jb25zdCBtaW5pbXVtVmVyc2lvbiA9IFtuZXcgQ29tcGFyYXRvcignPj0wLjAuMCcpXVxuXG5jb25zdCBzaW1wbGVTdWJzZXQgPSAoc3ViLCBkb20sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHN1YiA9PT0gZG9tKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChzdWIubGVuZ3RoID09PSAxICYmIHN1YlswXS5zZW12ZXIgPT09IEFOWSkge1xuICAgIGlmIChkb20ubGVuZ3RoID09PSAxICYmIGRvbVswXS5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgIHN1YiA9IG1pbmltdW1WZXJzaW9uV2l0aFByZVJlbGVhc2VcbiAgICB9IGVsc2Uge1xuICAgICAgc3ViID0gbWluaW11bVZlcnNpb25cbiAgICB9XG4gIH1cblxuICBpZiAoZG9tLmxlbmd0aCA9PT0gMSAmJiBkb21bMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgZG9tID0gbWluaW11bVZlcnNpb25cbiAgICB9XG4gIH1cblxuICBjb25zdCBlcVNldCA9IG5ldyBTZXQoKVxuICBsZXQgZ3QsIGx0XG4gIGZvciAoY29uc3QgYyBvZiBzdWIpIHtcbiAgICBpZiAoYy5vcGVyYXRvciA9PT0gJz4nIHx8IGMub3BlcmF0b3IgPT09ICc+PScpIHtcbiAgICAgIGd0ID0gaGlnaGVyR1QoZ3QsIGMsIG9wdGlvbnMpXG4gICAgfSBlbHNlIGlmIChjLm9wZXJhdG9yID09PSAnPCcgfHwgYy5vcGVyYXRvciA9PT0gJzw9Jykge1xuICAgICAgbHQgPSBsb3dlckxUKGx0LCBjLCBvcHRpb25zKVxuICAgIH0gZWxzZSB7XG4gICAgICBlcVNldC5hZGQoYy5zZW12ZXIpXG4gICAgfVxuICB9XG5cbiAgaWYgKGVxU2V0LnNpemUgPiAxKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGxldCBndGx0Q29tcFxuICBpZiAoZ3QgJiYgbHQpIHtcbiAgICBndGx0Q29tcCA9IGNvbXBhcmUoZ3Quc2VtdmVyLCBsdC5zZW12ZXIsIG9wdGlvbnMpXG4gICAgaWYgKGd0bHRDb21wID4gMCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9IGVsc2UgaWYgKGd0bHRDb21wID09PSAwICYmIChndC5vcGVyYXRvciAhPT0gJz49JyB8fCBsdC5vcGVyYXRvciAhPT0gJzw9JykpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gd2lsbCBpdGVyYXRlIG9uZSBvciB6ZXJvIHRpbWVzXG4gIGZvciAoY29uc3QgZXEgb2YgZXFTZXQpIHtcbiAgICBpZiAoZ3QgJiYgIXNhdGlzZmllcyhlcSwgU3RyaW5nKGd0KSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKGx0ICYmICFzYXRpc2ZpZXMoZXEsIFN0cmluZyhsdCksIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGZvciAoY29uc3QgYyBvZiBkb20pIHtcbiAgICAgIGlmICghc2F0aXNmaWVzKGVxLCBTdHJpbmcoYyksIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBsZXQgaGlnaGVyLCBsb3dlclxuICBsZXQgaGFzRG9tTFQsIGhhc0RvbUdUXG4gIC8vIGlmIHRoZSBzdWJzZXQgaGFzIGEgcHJlcmVsZWFzZSwgd2UgbmVlZCBhIGNvbXBhcmF0b3IgaW4gdGhlIHN1cGVyc2V0XG4gIC8vIHdpdGggdGhlIHNhbWUgdHVwbGUgYW5kIGEgcHJlcmVsZWFzZSwgb3IgaXQncyBub3QgYSBzdWJzZXRcbiAgbGV0IG5lZWREb21MVFByZSA9IGx0ICYmXG4gICAgIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICBsdC5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPyBsdC5zZW12ZXIgOiBmYWxzZVxuICBsZXQgbmVlZERvbUdUUHJlID0gZ3QgJiZcbiAgICAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgIGd0LnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCA/IGd0LnNlbXZlciA6IGZhbHNlXG4gIC8vIGV4Y2VwdGlvbjogPDEuMi4zLTAgaXMgdGhlIHNhbWUgYXMgPDEuMi4zXG4gIGlmIChuZWVkRG9tTFRQcmUgJiYgbmVlZERvbUxUUHJlLnByZXJlbGVhc2UubGVuZ3RoID09PSAxICYmXG4gICAgICBsdC5vcGVyYXRvciA9PT0gJzwnICYmIG5lZWREb21MVFByZS5wcmVyZWxlYXNlWzBdID09PSAwKSB7XG4gICAgbmVlZERvbUxUUHJlID0gZmFsc2VcbiAgfVxuXG4gIGZvciAoY29uc3QgYyBvZiBkb20pIHtcbiAgICBoYXNEb21HVCA9IGhhc0RvbUdUIHx8IGMub3BlcmF0b3IgPT09ICc+JyB8fCBjLm9wZXJhdG9yID09PSAnPj0nXG4gICAgaGFzRG9tTFQgPSBoYXNEb21MVCB8fCBjLm9wZXJhdG9yID09PSAnPCcgfHwgYy5vcGVyYXRvciA9PT0gJzw9J1xuICAgIGlmIChndCkge1xuICAgICAgaWYgKG5lZWREb21HVFByZSkge1xuICAgICAgICBpZiAoYy5zZW12ZXIucHJlcmVsZWFzZSAmJiBjLnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCAmJlxuICAgICAgICAgICAgYy5zZW12ZXIubWFqb3IgPT09IG5lZWREb21HVFByZS5tYWpvciAmJlxuICAgICAgICAgICAgYy5zZW12ZXIubWlub3IgPT09IG5lZWREb21HVFByZS5taW5vciAmJlxuICAgICAgICAgICAgYy5zZW12ZXIucGF0Y2ggPT09IG5lZWREb21HVFByZS5wYXRjaCkge1xuICAgICAgICAgIG5lZWREb21HVFByZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjLm9wZXJhdG9yID09PSAnPicgfHwgYy5vcGVyYXRvciA9PT0gJz49Jykge1xuICAgICAgICBoaWdoZXIgPSBoaWdoZXJHVChndCwgYywgb3B0aW9ucylcbiAgICAgICAgaWYgKGhpZ2hlciA9PT0gYyAmJiBoaWdoZXIgIT09IGd0KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZ3Qub3BlcmF0b3IgPT09ICc+PScgJiYgIXNhdGlzZmllcyhndC5zZW12ZXIsIFN0cmluZyhjKSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsdCkge1xuICAgICAgaWYgKG5lZWREb21MVFByZSkge1xuICAgICAgICBpZiAoYy5zZW12ZXIucHJlcmVsZWFzZSAmJiBjLnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCAmJlxuICAgICAgICAgICAgYy5zZW12ZXIubWFqb3IgPT09IG5lZWREb21MVFByZS5tYWpvciAmJlxuICAgICAgICAgICAgYy5zZW12ZXIubWlub3IgPT09IG5lZWREb21MVFByZS5taW5vciAmJlxuICAgICAgICAgICAgYy5zZW12ZXIucGF0Y2ggPT09IG5lZWREb21MVFByZS5wYXRjaCkge1xuICAgICAgICAgIG5lZWREb21MVFByZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjLm9wZXJhdG9yID09PSAnPCcgfHwgYy5vcGVyYXRvciA9PT0gJzw9Jykge1xuICAgICAgICBsb3dlciA9IGxvd2VyTFQobHQsIGMsIG9wdGlvbnMpXG4gICAgICAgIGlmIChsb3dlciA9PT0gYyAmJiBsb3dlciAhPT0gbHQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsdC5vcGVyYXRvciA9PT0gJzw9JyAmJiAhc2F0aXNmaWVzKGx0LnNlbXZlciwgU3RyaW5nKGMpLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjLm9wZXJhdG9yICYmIChsdCB8fCBndCkgJiYgZ3RsdENvbXAgIT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZXJlIHdhcyBhIDwgb3IgPiwgYW5kIG5vdGhpbmcgaW4gdGhlIGRvbSwgdGhlbiBtdXN0IGJlIGZhbHNlXG4gIC8vIFVOTEVTUyBpdCB3YXMgbGltaXRlZCBieSBhbm90aGVyIHJhbmdlIGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gIC8vIEVnLCA+MS4wLjAgPDEuMC4xIGlzIHN0aWxsIGEgc3Vic2V0IG9mIDwyLjAuMFxuICBpZiAoZ3QgJiYgaGFzRG9tTFQgJiYgIWx0ICYmIGd0bHRDb21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAobHQgJiYgaGFzRG9tR1QgJiYgIWd0ICYmIGd0bHRDb21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyB3ZSBuZWVkZWQgYSBwcmVyZWxlYXNlIHJhbmdlIGluIGEgc3BlY2lmaWMgdHVwbGUsIGJ1dCBkaWRuJ3QgZ2V0IG9uZVxuICAvLyB0aGVuIHRoaXMgaXNuJ3QgYSBzdWJzZXQuICBlZyA+PTEuMi4zLXByZSBpcyBub3QgYSBzdWJzZXQgb2YgPj0xLjAuMCxcbiAgLy8gYmVjYXVzZSBpdCBpbmNsdWRlcyBwcmVyZWxlYXNlcyBpbiB0aGUgMS4yLjMgdHVwbGVcbiAgaWYgKG5lZWREb21HVFByZSB8fCBuZWVkRG9tTFRQcmUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vID49MS4yLjMgaXMgbG93ZXIgdGhhbiA+MS4yLjNcbmNvbnN0IGhpZ2hlckdUID0gKGEsIGIsIG9wdGlvbnMpID0+IHtcbiAgaWYgKCFhKSB7XG4gICAgcmV0dXJuIGJcbiAgfVxuICBjb25zdCBjb21wID0gY29tcGFyZShhLnNlbXZlciwgYi5zZW12ZXIsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wID4gMCA/IGFcbiAgICA6IGNvbXAgPCAwID8gYlxuICAgIDogYi5vcGVyYXRvciA9PT0gJz4nICYmIGEub3BlcmF0b3IgPT09ICc+PScgPyBiXG4gICAgOiBhXG59XG5cbi8vIDw9MS4yLjMgaXMgaGlnaGVyIHRoYW4gPDEuMi4zXG5jb25zdCBsb3dlckxUID0gKGEsIGIsIG9wdGlvbnMpID0+IHtcbiAgaWYgKCFhKSB7XG4gICAgcmV0dXJuIGJcbiAgfVxuICBjb25zdCBjb21wID0gY29tcGFyZShhLnNlbXZlciwgYi5zZW12ZXIsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wIDwgMCA/IGFcbiAgICA6IGNvbXAgPiAwID8gYlxuICAgIDogYi5vcGVyYXRvciA9PT0gJzwnICYmIGEub3BlcmF0b3IgPT09ICc8PScgPyBiXG4gICAgOiBhXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3Vic2V0XG4iLCJjb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuXG4vLyBNb3N0bHkganVzdCBmb3IgdGVzdGluZyBhbmQgbGVnYWN5IEFQSSByZWFzb25zXG5jb25zdCB0b0NvbXBhcmF0b3JzID0gKHJhbmdlLCBvcHRpb25zKSA9PlxuICBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpLnNldFxuICAgIC5tYXAoY29tcCA9PiBjb21wLm1hcChjID0+IGMudmFsdWUpLmpvaW4oJyAnKS50cmltKCkuc3BsaXQoJyAnKSlcblxubW9kdWxlLmV4cG9ydHMgPSB0b0NvbXBhcmF0b3JzXG4iLCJjb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgdmFsaWRSYW5nZSA9IChyYW5nZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIC8vIFJldHVybiAnKicgaW5zdGVhZCBvZiAnJyBzbyB0aGF0IHRydXRoaW5lc3Mgd29ya3MuXG4gICAgLy8gVGhpcyB3aWxsIHRocm93IGlmIGl0J3MgaW52YWxpZCBhbnl3YXlcbiAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKS5yYW5nZSB8fCAnKidcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHZhbGlkUmFuZ2VcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuLy8gVGhlIGRlZmF1bHQgQnVmZmVyIHNpemUgaWYgb25lIGlzIG5vdCBwcm92aWRlZC5cbmNvbnN0IERFRkFVTFRfU01BUlRCVUZGRVJfU0laRSA9IDQwOTY7XG4vLyBUaGUgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcgdG8gdXNlIGZvciByZWFkaW5nL3dyaXRpbmcgc3RyaW5ncy5cbmNvbnN0IERFRkFVTFRfU01BUlRCVUZGRVJfRU5DT0RJTkcgPSAndXRmOCc7XG5jbGFzcyBTbWFydEJ1ZmZlciB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIHsgU21hcnRCdWZmZXJPcHRpb25zIH0gVGhlIFNtYXJ0QnVmZmVyT3B0aW9ucyB0byBhcHBseSB0byB0aGlzIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9lbmNvZGluZyA9IERFRkFVTFRfU01BUlRCVUZGRVJfRU5DT0RJTkc7XG4gICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5fcmVhZE9mZnNldCA9IDA7XG4gICAgICAgIGlmIChTbWFydEJ1ZmZlci5pc1NtYXJ0QnVmZmVyT3B0aW9ucyhvcHRpb25zKSkge1xuICAgICAgICAgICAgLy8gQ2hlY2tzIGZvciBlbmNvZGluZ1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICAgICAgICAgICAgICB1dGlsc18xLmNoZWNrRW5jb2Rpbmcob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2tzIGZvciBpbml0aWFsIHNpemUgbGVuZ3RoXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7XG4gICAgICAgICAgICAgICAgaWYgKHV0aWxzXzEuaXNGaW5pdGVJbnRlZ2VyKG9wdGlvbnMuc2l6ZSkgJiYgb3B0aW9ucy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9idWZmID0gQnVmZmVyLmFsbG9jVW5zYWZlKG9wdGlvbnMuc2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodXRpbHNfMS5FUlJPUlMuSU5WQUxJRF9TTUFSVEJVRkZFUl9TSVpFKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGluaXRpYWwgQnVmZmVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmJ1ZmYpIHtcbiAgICAgICAgICAgICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9wdGlvbnMuYnVmZikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnVmZiA9IG9wdGlvbnMuYnVmZjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRpb25zLmJ1ZmYubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHV0aWxzXzEuRVJST1JTLklOVkFMSURfU01BUlRCVUZGRVJfQlVGRkVSKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9idWZmID0gQnVmZmVyLmFsbG9jVW5zYWZlKERFRkFVTFRfU01BUlRCVUZGRVJfU0laRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2FzIHBhc3NlZCBidXQgaXQncyBub3QgYSBTbWFydEJ1ZmZlck9wdGlvbnMgb2JqZWN0XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHV0aWxzXzEuRVJST1JTLklOVkFMSURfU01BUlRCVUZGRVJfT0JKRUNUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBkZWZhdWx0IHRvIHNhbmUgb3B0aW9uc1xuICAgICAgICAgICAgdGhpcy5fYnVmZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShERUZBVUxUX1NNQVJUQlVGRkVSX1NJWkUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU21hcnRCdWZmZXIgaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgaW50ZXJuYWwgQnVmZmVyIHNpemUgYW5kIG9wdGlvbmFsIGVuY29kaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNpemUgeyBOdW1iZXIgfSBUaGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgQnVmZmVyLlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgU21hcnRCdWZmZXIgfVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tU2l6ZShzaXplLCBlbmNvZGluZykge1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMoe1xuICAgICAgICAgICAgc2l6ZTogc2l6ZSxcbiAgICAgICAgICAgIGVuY29kaW5nOiBlbmNvZGluZ1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTbWFydEJ1ZmZlciBpbnN0YW5jZSB3aXRoIHRoZSBwcm92aWRlZCBCdWZmZXIgYW5kIG9wdGlvbmFsIGVuY29kaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJ1ZmZlciB7IEJ1ZmZlciB9IFRoZSBCdWZmZXIgdG8gdXNlIGFzIHRoZSBpbnRlcm5hbCBCdWZmZXIgdmFsdWUuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIHsgU3RyaW5nIH0gVGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZSBmb3Igc3RyaW5ncy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBTbWFydEJ1ZmZlciB9XG4gICAgICovXG4gICAgc3RhdGljIGZyb21CdWZmZXIoYnVmZiwgZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKHtcbiAgICAgICAgICAgIGJ1ZmY6IGJ1ZmYsXG4gICAgICAgICAgICBlbmNvZGluZzogZW5jb2RpbmdcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU21hcnRCdWZmZXIgaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgU21hcnRCdWZmZXJPcHRpb25zIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyB7IFNtYXJ0QnVmZmVyT3B0aW9ucyB9IFRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFR5cGUgY2hlY2tpbmcgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBpcyBhIFNtYXJ0QnVmZmVyT3B0aW9ucyBvYmplY3QuXG4gICAgICovXG4gICAgc3RhdGljIGlzU21hcnRCdWZmZXJPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY2FzdE9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICByZXR1cm4gKGNhc3RPcHRpb25zICYmXG4gICAgICAgICAgICAoY2FzdE9wdGlvbnMuZW5jb2RpbmcgIT09IHVuZGVmaW5lZCB8fCBjYXN0T3B0aW9ucy5zaXplICE9PSB1bmRlZmluZWQgfHwgY2FzdE9wdGlvbnMuYnVmZiAhPT0gdW5kZWZpbmVkKSk7XG4gICAgfVxuICAgIC8vIFNpZ25lZCBpbnRlZ2Vyc1xuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIEludDggdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRJbnQ4KG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDgsIDEsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIEludDE2QkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRJbnQxNkJFKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUsIDIsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIEludDE2TEUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRJbnQxNkxFKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUsIDIsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIEludDMyQkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRJbnQzMkJFKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUsIDQsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIEludDMyTEUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRJbnQzMkxFKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUsIDQsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgQmlnSW50NjRCRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IEJpZ0ludCB9XG4gICAgICovXG4gICAgcmVhZEJpZ0ludDY0QkUob2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygncmVhZEJpZ0ludDY0QkUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRCaWdJbnQ2NEJFLCA4LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIEJpZ0ludDY0TEUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBCaWdJbnQgfVxuICAgICAqL1xuICAgIHJlYWRCaWdJbnQ2NExFKG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3JlYWRCaWdJbnQ2NExFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnSW50NjRMRSwgOCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIEludDggdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVJbnQ4KHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCwgMSwgdmFsdWUsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIEludDggdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEludDgodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDgsIDEsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYW4gSW50MTZCRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUludDE2QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSwgMiwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gSW50MTZCRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0SW50MTZCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSwgMiwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBJbnQxNkxFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlSW50MTZMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFLCAyLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBJbnQxNkxFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRJbnQxNkxFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFLCAyLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIEludDMyQkUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVJbnQzMkJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIEludDMyQkUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEludDMyQkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYW4gSW50MzJMRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUludDMyTEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSwgNCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gSW50MzJMRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0SW50MzJMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSwgNCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIEJpZ0ludDY0QkUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCaWdJbnQgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVCaWdJbnQ2NEJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCd3cml0ZUJpZ0ludDY0QkUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgQmlnSW50NjRCRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgQmlnSW50IH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0QmlnSW50NjRCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygnd3JpdGVCaWdJbnQ2NEJFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlQmlnSW50NjRCRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIEJpZ0ludDY0TEUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCaWdJbnQgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVCaWdJbnQ2NExFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCd3cml0ZUJpZ0ludDY0TEUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0TEUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgSW50NjRMRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgQmlnSW50IH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0QmlnSW50NjRMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygnd3JpdGVCaWdJbnQ2NExFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlQmlnSW50NjRMRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8vIFVuc2lnbmVkIEludGVnZXJzXG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gVUludDggdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRVSW50OChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCwgMSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gVUludDE2QkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRVSW50MTZCRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSwgMiwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gVUludDE2TEUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRVSW50MTZMRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSwgMiwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gVUludDMyQkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRVSW50MzJCRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSwgNCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gVUludDMyTEUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRVSW50MzJMRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSwgNCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBCaWdVSW50NjRCRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IEJpZ0ludCB9XG4gICAgICovXG4gICAgcmVhZEJpZ1VJbnQ2NEJFKG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3JlYWRCaWdVSW50NjRCRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NEJFLCA4LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIEJpZ1VJbnQ2NExFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgQmlnSW50IH1cbiAgICAgKi9cbiAgICByZWFkQmlnVUludDY0TEUob2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygncmVhZEJpZ1VJbnQ2NExFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnVUludDY0TEUsIDgsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBVSW50OCB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZVVJbnQ4KHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4LCAxLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBVSW50OCB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0VUludDgodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4LCAxLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIFVJbnQxNkJFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlVUludDE2QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUsIDIsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIFVJbnQxNkJFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRVSW50MTZCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUsIDIsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYW4gVUludDE2TEUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVVSW50MTZMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSwgMiwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gVUludDE2TEUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydFVJbnQxNkxFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSwgMiwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBVSW50MzJCRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZVVJbnQzMkJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBVSW50MzJCRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0VUludDMyQkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIFVJbnQzMkxFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlVUludDMyTEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIFVJbnQzMkxFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRVSW50MzJMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBCaWdVSW50NjRCRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUJpZ1VJbnQ2NEJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCd3cml0ZUJpZ1VJbnQ2NEJFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRCRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBCaWdVSW50NjRCRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0QmlnVUludDY0QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3dyaXRlQmlnVUludDY0QkUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRCRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIEJpZ1VJbnQ2NExFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlQmlnVUludDY0TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3dyaXRlQmlnVUludDY0TEUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIEJpZ1VJbnQ2NExFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRCaWdVSW50NjRMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygnd3JpdGVCaWdVSW50NjRMRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gRmxvYXRpbmcgUG9pbnRcbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBGbG9hdEJFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkRmxvYXRCRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFLCA0LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBGbG9hdExFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkRmxvYXRMRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFLCA0LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBGbG9hdEJFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlRmxvYXRCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIEZsb2F0QkUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEZsb2F0QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBGbG9hdExFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlRmxvYXRMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIEZsb2F0TEUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEZsb2F0TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvLyBEb3VibGUgRmxvYXRpbmcgUG9pbnRcbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBEb3VibEVCRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IE51bWJlciB9XG4gICAgICovXG4gICAgcmVhZERvdWJsZUJFKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFLCA4LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBEb3VibGVMRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IE51bWJlciB9XG4gICAgICovXG4gICAgcmVhZERvdWJsZUxFKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFLCA4LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBEb3VibGVCRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZURvdWJsZUJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIERvdWJsZUJFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnREb3VibGVCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBEb3VibGVMRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZURvdWJsZUxFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIERvdWJsZUxFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnREb3VibGVMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvLyBTdHJpbmdzXG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBTdHJpbmcgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFyZzEgeyBOdW1iZXIgfCBTdHJpbmcgfSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgYXMgYSBTdHJpbmcsIG9yIHRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yXG4gICAgICogICAgICAgICAgICAgdGhlIHN0cmluZyAoRGVmYXVsdHMgdG8gaW5zdGFuY2UgbGV2ZWwgZW5jb2RpbmcpLlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHRoZSBzdHJpbmcgKERlZmF1bHRzIHRvIGluc3RhbmNlIGxldmVsIGVuY29kaW5nKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBTdHJpbmcgfVxuICAgICAqL1xuICAgIHJlYWRTdHJpbmcoYXJnMSwgZW5jb2RpbmcpIHtcbiAgICAgICAgbGV0IGxlbmd0aFZhbDtcbiAgICAgICAgLy8gTGVuZ3RoIHByb3ZpZGVkXG4gICAgICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tMZW5ndGhWYWx1ZShhcmcxKTtcbiAgICAgICAgICAgIGxlbmd0aFZhbCA9IE1hdGgubWluKGFyZzEsIHRoaXMubGVuZ3RoIC0gdGhpcy5fcmVhZE9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbmNvZGluZyA9IGFyZzE7XG4gICAgICAgICAgICBsZW5ndGhWYWwgPSB0aGlzLmxlbmd0aCAtIHRoaXMuX3JlYWRPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgZW5jb2RpbmdcbiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tFbmNvZGluZyhlbmNvZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9idWZmLnNsaWNlKHRoaXMuX3JlYWRPZmZzZXQsIHRoaXMuX3JlYWRPZmZzZXQgKyBsZW5ndGhWYWwpLnRvU3RyaW5nKGVuY29kaW5nIHx8IHRoaXMuX2VuY29kaW5nKTtcbiAgICAgICAgdGhpcy5fcmVhZE9mZnNldCArPSBsZW5ndGhWYWw7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIFN0cmluZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgU3RyaW5nIH0gVGhlIFN0cmluZyB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSBzdHJpbmcgYXQuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIHsgU3RyaW5nIH0gVGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZSBmb3Igd3JpdGluZyBzdHJpbmdzIChkZWZhdWx0cyB0byBpbnN0YW5jZSBlbmNvZGluZykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRTdHJpbmcodmFsdWUsIG9mZnNldCwgZW5jb2RpbmcpIHtcbiAgICAgICAgdXRpbHNfMS5jaGVja09mZnNldFZhbHVlKG9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVTdHJpbmcodmFsdWUsIHRydWUsIG9mZnNldCwgZW5jb2RpbmcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBTdHJpbmdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IFN0cmluZyB9IFRoZSBTdHJpbmcgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIGFyZzIgeyBOdW1iZXIgfCBTdHJpbmcgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBzdHJpbmcgYXQsIG9yIHRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIHsgU3RyaW5nIH0gVGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZSBmb3Igd3JpdGluZyBzdHJpbmdzIChkZWZhdWx0cyB0byBpbnN0YW5jZSBlbmNvZGluZykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZVN0cmluZyh2YWx1ZSwgYXJnMiwgZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZVN0cmluZyh2YWx1ZSwgZmFsc2UsIGFyZzIsIGVuY29kaW5nKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBudWxsLXRlcm1pbmF0ZWQgU3RyaW5nIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHRoZSBzdHJpbmcgKERlZmF1bHRzIHRvIGluc3RhbmNlIGxldmVsIGVuY29kaW5nKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBTdHJpbmcgfVxuICAgICAqL1xuICAgIHJlYWRTdHJpbmdOVChlbmNvZGluZykge1xuICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdXRpbHNfMS5jaGVja0VuY29kaW5nKGVuY29kaW5nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgbnVsbCBjaGFyYWN0ZXIgcG9zaXRpb24gdG8gdGhlIGVuZCBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgICAgbGV0IG51bGxQb3MgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgLy8gRmluZCBuZXh0IG51bGwgY2hhcmFjdGVyIChpZiBvbmUgaXMgbm90IGZvdW5kLCBkZWZhdWx0IGZyb20gYWJvdmUgaXMgdXNlZClcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3JlYWRPZmZzZXQ7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYnVmZltpXSA9PT0gMHgwMCkge1xuICAgICAgICAgICAgICAgIG51bGxQb3MgPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlYWQgc3RyaW5nIHZhbHVlXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fYnVmZi5zbGljZSh0aGlzLl9yZWFkT2Zmc2V0LCBudWxsUG9zKTtcbiAgICAgICAgLy8gSW5jcmVtZW50IGludGVybmFsIEJ1ZmZlciByZWFkIG9mZnNldFxuICAgICAgICB0aGlzLl9yZWFkT2Zmc2V0ID0gbnVsbFBvcyArIDE7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZyhlbmNvZGluZyB8fCB0aGlzLl9lbmNvZGluZyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBudWxsLXRlcm1pbmF0ZWQgU3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgU3RyaW5nIH0gVGhlIFN0cmluZyB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gYXJnMiB7IE51bWJlciB8IFN0cmluZyB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHN0cmluZyB0bywgb3IgdGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvciB3cml0aW5nIHN0cmluZ3MgKGRlZmF1bHRzIHRvIGluc3RhbmNlIGVuY29kaW5nKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydFN0cmluZ05UKHZhbHVlLCBvZmZzZXQsIGVuY29kaW5nKSB7XG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICAvLyBXcml0ZSBWYWx1ZXNcbiAgICAgICAgdGhpcy5pbnNlcnRTdHJpbmcodmFsdWUsIG9mZnNldCwgZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmluc2VydFVJbnQ4KDB4MDAsIG9mZnNldCArIHZhbHVlLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBudWxsLXRlcm1pbmF0ZWQgU3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgU3RyaW5nIH0gVGhlIFN0cmluZyB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gYXJnMiB7IE51bWJlciB8IFN0cmluZyB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHN0cmluZyB0bywgb3IgdGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvciB3cml0aW5nIHN0cmluZ3MgKGRlZmF1bHRzIHRvIGluc3RhbmNlIGVuY29kaW5nKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlU3RyaW5nTlQodmFsdWUsIGFyZzIsIGVuY29kaW5nKSB7XG4gICAgICAgIC8vIFdyaXRlIFZhbHVlc1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKHZhbHVlLCBhcmcyLCBlbmNvZGluZyk7XG4gICAgICAgIHRoaXMud3JpdGVVSW50OCgweDAwLCB0eXBlb2YgYXJnMiA9PT0gJ251bWJlcicgPyBhcmcyICsgdmFsdWUubGVuZ3RoIDogdGhpcy53cml0ZU9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBCdWZmZXJzXG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBCdWZmZXIgZnJvbSB0aGUgaW50ZXJuYWwgcmVhZCBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZW5ndGggeyBOdW1iZXIgfSBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gcmVhZCBhcyBhIEJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBCdWZmZXIgfVxuICAgICAqL1xuICAgIHJlYWRCdWZmZXIobGVuZ3RoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbGVuZ3RoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdXRpbHNfMS5jaGVja0xlbmd0aFZhbHVlKGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVuZ3RoVmFsID0gdHlwZW9mIGxlbmd0aCA9PT0gJ251bWJlcicgPyBsZW5ndGggOiB0aGlzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSBNYXRoLm1pbih0aGlzLmxlbmd0aCwgdGhpcy5fcmVhZE9mZnNldCArIGxlbmd0aFZhbCk7XG4gICAgICAgIC8vIFJlYWQgYnVmZmVyIHZhbHVlXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fYnVmZi5zbGljZSh0aGlzLl9yZWFkT2Zmc2V0LCBlbmRQb2ludCk7XG4gICAgICAgIC8vIEluY3JlbWVudCBpbnRlcm5hbCBCdWZmZXIgcmVhZCBvZmZzZXRcbiAgICAgICAgdGhpcy5fcmVhZE9mZnNldCA9IGVuZFBvaW50O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIEJ1ZmZlciB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IEJ1ZmZlciB9IFRoZSBCdWZmZXIgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIEJ1ZmZlciB0by5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEJ1ZmZlcih2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlQnVmZmVyKHZhbHVlLCB0cnVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBCdWZmZXIgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCdWZmZXIgfSBUaGUgQnVmZmVyIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBCdWZmZXIgdG8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUJ1ZmZlcih2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVCdWZmZXIodmFsdWUsIGZhbHNlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIG51bGwtdGVybWluYXRlZCBCdWZmZXIgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvaXNpdG9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7IEJ1ZmZlciB9XG4gICAgICovXG4gICAgcmVhZEJ1ZmZlck5UKCkge1xuICAgICAgICAvLyBTZXQgbnVsbCBjaGFyYWN0ZXIgcG9zaXRpb24gdG8gdGhlIGVuZCBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgICAgbGV0IG51bGxQb3MgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgLy8gRmluZCBuZXh0IG51bGwgY2hhcmFjdGVyIChpZiBvbmUgaXMgbm90IGZvdW5kLCBkZWZhdWx0IGZyb20gYWJvdmUgaXMgdXNlZClcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3JlYWRPZmZzZXQ7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYnVmZltpXSA9PT0gMHgwMCkge1xuICAgICAgICAgICAgICAgIG51bGxQb3MgPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlYWQgdmFsdWVcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9idWZmLnNsaWNlKHRoaXMuX3JlYWRPZmZzZXQsIG51bGxQb3MpO1xuICAgICAgICAvLyBJbmNyZW1lbnQgaW50ZXJuYWwgQnVmZmVyIHJlYWQgb2Zmc2V0XG4gICAgICAgIHRoaXMuX3JlYWRPZmZzZXQgPSBudWxsUG9zICsgMTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgbnVsbC10ZXJtaW5hdGVkIEJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IEJ1ZmZlciB9IFRoZSBCdWZmZXIgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIEJ1ZmZlciB0by5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEJ1ZmZlck5UKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5jaGVja09mZnNldFZhbHVlKG9mZnNldCk7XG4gICAgICAgIC8vIFdyaXRlIFZhbHVlc1xuICAgICAgICB0aGlzLmluc2VydEJ1ZmZlcih2YWx1ZSwgb2Zmc2V0KTtcbiAgICAgICAgdGhpcy5pbnNlcnRVSW50OCgweDAwLCBvZmZzZXQgKyB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgbnVsbC10ZXJtaW5hdGVkIEJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IEJ1ZmZlciB9IFRoZSBCdWZmZXIgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIEJ1ZmZlciB0by5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlQnVmZmVyTlQodmFsdWUsIG9mZnNldCkge1xuICAgICAgICAvLyBDaGVja3MgZm9yIHZhbGlkIG51bWJlcmljIHZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdyaXRlIFZhbHVlc1xuICAgICAgICB0aGlzLndyaXRlQnVmZmVyKHZhbHVlLCBvZmZzZXQpO1xuICAgICAgICB0aGlzLndyaXRlVUludDgoMHgwMCwgdHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicgPyBvZmZzZXQgKyB2YWx1ZS5sZW5ndGggOiB0aGlzLl93cml0ZU9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIFNtYXJ0QnVmZmVyIGluc3RhbmNlIHRvIGl0cyBvcmlnaW5hbCBlbXB0eSBzdGF0ZS5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLl9yZWFkT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcmVtYWluaW5nIGRhdGEgbGVmdCB0byBiZSByZWFkIGZyb20gdGhlIFNtYXJ0QnVmZmVyIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7IE51bWJlciB9XG4gICAgICovXG4gICAgcmVtYWluaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggLSB0aGlzLl9yZWFkT2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHJlYWQgb2Zmc2V0IHZhbHVlIG9mIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIGdldCByZWFkT2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE9mZnNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVhZCBvZmZzZXQgdmFsdWUgb2YgdGhlIFNtYXJ0QnVmZmVyIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IC0gVGhlIG9mZnNldCB2YWx1ZSB0byBzZXQuXG4gICAgICovXG4gICAgc2V0IHJlYWRPZmZzZXQob2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICAvLyBDaGVjayBmb3IgYm91bmRzLlxuICAgICAgICB1dGlsc18xLmNoZWNrVGFyZ2V0T2Zmc2V0KG9mZnNldCwgdGhpcyk7XG4gICAgICAgIHRoaXMuX3JlYWRPZmZzZXQgPSBvZmZzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgd3JpdGUgb2Zmc2V0IHZhbHVlIG9mIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIGdldCB3cml0ZU9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlT2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB3cml0ZSBvZmZzZXQgdmFsdWUgb2YgdGhlIFNtYXJ0QnVmZmVyIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IC0gVGhlIG9mZnNldCB2YWx1ZSB0byBzZXQuXG4gICAgICovXG4gICAgc2V0IHdyaXRlT2Zmc2V0KG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGJvdW5kcy5cbiAgICAgICAgdXRpbHNfMS5jaGVja1RhcmdldE9mZnNldChvZmZzZXQsIHRoaXMpO1xuICAgICAgICB0aGlzLl93cml0ZU9mZnNldCA9IG9mZnNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudGx5IHNldCBzdHJpbmcgZW5jb2Rpbmcgb2YgdGhlIFNtYXJ0QnVmZmVyIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7IEJ1ZmZlckVuY29kaW5nIH0gVGhlIHN0cmluZyBCdWZmZXIgZW5jb2RpbmcgY3VycmVudGx5IHNldC5cbiAgICAgKi9cbiAgICBnZXQgZW5jb2RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RyaW5nIGVuY29kaW5nIG9mIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IEJ1ZmZlckVuY29kaW5nIH0gVGhlIHN0cmluZyBCdWZmZXIgZW5jb2RpbmcgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldCBlbmNvZGluZyhlbmNvZGluZykge1xuICAgICAgICB1dGlsc18xLmNoZWNrRW5jb2RpbmcoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLl9lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIGludGVybmFsIEJ1ZmZlci4gKFRoaXMgaW5jbHVkZXMgdW5tYW5hZ2VkIGRhdGEgaW4gdGhlIEJ1ZmZlcilcbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBCdWZmZXIgfSBUaGUgQnVmZmVyIHZhbHVlLlxuICAgICAqL1xuICAgIGdldCBpbnRlcm5hbEJ1ZmZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmY7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbnRlcm5hbCBtYW5hZ2VkIEJ1ZmZlciAoSW5jbHVkZXMgbWFuYWdlZCBkYXRhIG9ubHkpXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyBCdWZmZXIgfVxuICAgICAqL1xuICAgIHRvQnVmZmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVmZi5zbGljZSgwLCB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgaW50ZXJuYWwgbWFuYWdlZCBCdWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byBkaXNwbGF5IHRoZSBCdWZmZXIgYXMgKGRlZmF1bHRzIHRvIGluc3RhbmNlIGxldmVsIGVuY29kaW5nKS5cbiAgICAgKi9cbiAgICB0b1N0cmluZyhlbmNvZGluZykge1xuICAgICAgICBjb25zdCBlbmNvZGluZ1ZhbCA9IHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgPyBlbmNvZGluZyA6IHRoaXMuX2VuY29kaW5nO1xuICAgICAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBlbmNvZGluZy5cbiAgICAgICAgdXRpbHNfMS5jaGVja0VuY29kaW5nKGVuY29kaW5nVmFsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmYudG9TdHJpbmcoZW5jb2RpbmdWYWwsIDAsIHRoaXMubGVuZ3RoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhlIFNtYXJ0QnVmZmVyIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaW5zZXJ0aW5nIGFuZCB3cml0aW5nIHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBTdHJpbmcgfSBUaGUgU3RyaW5nIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gaXNJbnNlcnQgeyBCb29sZWFuIH0gVHJ1ZSBpZiBpbnNlcnRpbmcgYSBzdHJpbmcsIGZhbHNlIGlmIHdyaXRpbmcuXG4gICAgICogQHBhcmFtIGFyZzIgeyBOdW1iZXIgfCBTdHJpbmcgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgc3RyaW5nIGF0LCBvciB0aGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlLlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHdyaXRpbmcgc3RyaW5ncyAoZGVmYXVsdHMgdG8gaW5zdGFuY2UgZW5jb2RpbmcpLlxuICAgICAqL1xuICAgIF9oYW5kbGVTdHJpbmcodmFsdWUsIGlzSW5zZXJ0LCBhcmczLCBlbmNvZGluZykge1xuICAgICAgICBsZXQgb2Zmc2V0VmFsID0gdGhpcy5fd3JpdGVPZmZzZXQ7XG4gICAgICAgIGxldCBlbmNvZGluZ1ZhbCA9IHRoaXMuX2VuY29kaW5nO1xuICAgICAgICAvLyBDaGVjayBmb3Igb2Zmc2V0XG4gICAgICAgIGlmICh0eXBlb2YgYXJnMyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIG9mZnNldFZhbCA9IGFyZzM7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgZW5jb2RpbmdcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgYXJnMyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tFbmNvZGluZyhhcmczKTtcbiAgICAgICAgICAgIGVuY29kaW5nVmFsID0gYXJnMztcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBmb3IgZW5jb2RpbmcgKHRoaXJkIHBhcmFtKVxuICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdXRpbHNfMS5jaGVja0VuY29kaW5nKGVuY29kaW5nKTtcbiAgICAgICAgICAgIGVuY29kaW5nVmFsID0gZW5jb2Rpbmc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGJ5dGVsZW5ndGggb2Ygc3RyaW5nLlxuICAgICAgICBjb25zdCBieXRlTGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUsIGVuY29kaW5nVmFsKTtcbiAgICAgICAgLy8gRW5zdXJlIHRoZXJlIGlzIGVub3VnaCBpbnRlcm5hbCBCdWZmZXIgY2FwYWNpdHkuXG4gICAgICAgIGlmIChpc0luc2VydCkge1xuICAgICAgICAgICAgdGhpcy5lbnN1cmVJbnNlcnRhYmxlKGJ5dGVMZW5ndGgsIG9mZnNldFZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbnN1cmVXcml0ZWFibGUoYnl0ZUxlbmd0aCwgb2Zmc2V0VmFsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXcml0ZSB2YWx1ZVxuICAgICAgICB0aGlzLl9idWZmLndyaXRlKHZhbHVlLCBvZmZzZXRWYWwsIGJ5dGVMZW5ndGgsIGVuY29kaW5nVmFsKTtcbiAgICAgICAgLy8gSW5jcmVtZW50IGludGVybmFsIEJ1ZmZlciB3cml0ZSBvZmZzZXQ7XG4gICAgICAgIGlmIChpc0luc2VydCkge1xuICAgICAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgKz0gYnl0ZUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIGFuIG9mZnNldCB3YXMgZ2l2ZW4sIGNoZWNrIHRvIHNlZSBpZiB3ZSB3cm90ZSBiZXlvbmQgdGhlIGN1cnJlbnQgd3JpdGVPZmZzZXQuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZzMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgPSBNYXRoLm1heCh0aGlzLl93cml0ZU9mZnNldCwgb2Zmc2V0VmFsICsgYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBubyBvZmZzZXQgd2FzIGdpdmVuLCB3ZSB3cm90ZSB0byB0aGUgZW5kIG9mIHRoZSBTbWFydEJ1ZmZlciBzbyBpbmNyZW1lbnQgd3JpdGVPZmZzZXQuXG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgKz0gYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3cml0aW5nIG9yIGluc2VydCBvZiBhIEJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IEJ1ZmZlciB9IFRoZSBCdWZmZXIgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIEJ1ZmZlciB0by5cbiAgICAgKi9cbiAgICBfaGFuZGxlQnVmZmVyKHZhbHVlLCBpc0luc2VydCwgb2Zmc2V0KSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFZhbCA9IHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInID8gb2Zmc2V0IDogdGhpcy5fd3JpdGVPZmZzZXQ7XG4gICAgICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggaW50ZXJuYWwgQnVmZmVyIGNhcGFjaXR5LlxuICAgICAgICBpZiAoaXNJbnNlcnQpIHtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlSW5zZXJ0YWJsZSh2YWx1ZS5sZW5ndGgsIG9mZnNldFZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbnN1cmVXcml0ZWFibGUodmFsdWUubGVuZ3RoLCBvZmZzZXRWYWwpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdyaXRlIGJ1ZmZlciB2YWx1ZVxuICAgICAgICB2YWx1ZS5jb3B5KHRoaXMuX2J1ZmYsIG9mZnNldFZhbCk7XG4gICAgICAgIC8vIEluY3JlbWVudCBpbnRlcm5hbCBCdWZmZXIgd3JpdGUgb2Zmc2V0O1xuICAgICAgICBpZiAoaXNJbnNlcnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIGFuIG9mZnNldCB3YXMgZ2l2ZW4sIGNoZWNrIHRvIHNlZSBpZiB3ZSB3cm90ZSBiZXlvbmQgdGhlIGN1cnJlbnQgd3JpdGVPZmZzZXQuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93cml0ZU9mZnNldCA9IE1hdGgubWF4KHRoaXMuX3dyaXRlT2Zmc2V0LCBvZmZzZXRWYWwgKyB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbm8gb2Zmc2V0IHdhcyBnaXZlbiwgd2Ugd3JvdGUgdG8gdGhlIGVuZCBvZiB0aGUgU21hcnRCdWZmZXIgc28gaW5jcmVtZW50IHdyaXRlT2Zmc2V0LlxuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5zdXJlcyB0aGF0IHRoZSBpbnRlcm5hbCBCdWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIHJlYWQgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZW5ndGggeyBOdW1iZXIgfSBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgcmVhZC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHJlYWQuXG4gICAgICovXG4gICAgZW5zdXJlUmVhZGFibGUobGVuZ3RoLCBvZmZzZXQpIHtcbiAgICAgICAgLy8gT2Zmc2V0IHZhbHVlIGRlZmF1bHRzIHRvIG1hbmFnZWQgcmVhZCBvZmZzZXQuXG4gICAgICAgIGxldCBvZmZzZXRWYWwgPSB0aGlzLl9yZWFkT2Zmc2V0O1xuICAgICAgICAvLyBJZiBhbiBvZmZzZXQgd2FzIHByb3ZpZGVkLCB1c2UgaXQuXG4gICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gQ2hlY2tzIGZvciB2YWxpZCBudW1iZXJpYyB2YWx1ZTtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICAgICAgLy8gT3ZlcmlkZSB3aXRoIGN1c3RvbSBvZmZzZXQuXG4gICAgICAgICAgICBvZmZzZXRWYWwgPSBvZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2tzIGlmIG9mZnNldCBpcyBiZWxvdyB6ZXJvLCBvciB0aGUgb2Zmc2V0K2xlbmd0aCBvZmZzZXQgaXMgYmV5b25kIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIG1hbmFnZWQgZGF0YS5cbiAgICAgICAgaWYgKG9mZnNldFZhbCA8IDAgfHwgb2Zmc2V0VmFsICsgbGVuZ3RoID4gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih1dGlsc18xLkVSUk9SUy5JTlZBTElEX1JFQURfQkVZT05EX0JPVU5EUyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5zdXJlcyB0aGF0IHRoZSBpbnRlcm5hbCBCdWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGluc2VydCBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFMZW5ndGggeyBOdW1iZXIgfSBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgd3JpdHRlbi5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byBiZSB3cml0dGVuLlxuICAgICAqL1xuICAgIGVuc3VyZUluc2VydGFibGUoZGF0YUxlbmd0aCwgb2Zmc2V0KSB7XG4gICAgICAgIC8vIENoZWNrcyBmb3IgdmFsaWQgbnVtYmVyaWMgdmFsdWU7XG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICAvLyBFbnN1cmUgdGhlcmUgaXMgZW5vdWdoIGludGVybmFsIEJ1ZmZlciBjYXBhY2l0eS5cbiAgICAgICAgdGhpcy5fZW5zdXJlQ2FwYWNpdHkodGhpcy5sZW5ndGggKyBkYXRhTGVuZ3RoKTtcbiAgICAgICAgLy8gSWYgYW4gb2Zmc2V0IHdhcyBwcm92aWRlZCBhbmQgaXRzIG5vdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGJ1ZmZlciwgY29weSBkYXRhIGludG8gYXBwcm9wcmlhdGUgbG9jYXRpb24gaW4gcmVnYXJkcyB0byB0aGUgb2Zmc2V0LlxuICAgICAgICBpZiAob2Zmc2V0IDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZmYuY29weSh0aGlzLl9idWZmLCBvZmZzZXQgKyBkYXRhTGVuZ3RoLCBvZmZzZXQsIHRoaXMuX2J1ZmYubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGp1c3QgdHJhY2tlZCBzbWFydCBidWZmZXIgbGVuZ3RoXG4gICAgICAgIGlmIChvZmZzZXQgKyBkYXRhTGVuZ3RoID4gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gb2Zmc2V0ICsgZGF0YUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoICs9IGRhdGFMZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5zdXJlcyB0aGF0IHRoZSBpbnRlcm5hbCBCdWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIHdyaXRlIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YUxlbmd0aCB7IE51bWJlciB9IFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdGhhdCBuZWVkcyB0byBiZSB3cml0dGVuLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gKGRlZmF1bHRzIHRvIHdyaXRlT2Zmc2V0KS5cbiAgICAgKi9cbiAgICBfZW5zdXJlV3JpdGVhYmxlKGRhdGFMZW5ndGgsIG9mZnNldCkge1xuICAgICAgICBjb25zdCBvZmZzZXRWYWwgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJyA/IG9mZnNldCA6IHRoaXMuX3dyaXRlT2Zmc2V0O1xuICAgICAgICAvLyBFbnN1cmUgZW5vdWdoIGNhcGFjaXR5IHRvIHdyaXRlIGRhdGEuXG4gICAgICAgIHRoaXMuX2Vuc3VyZUNhcGFjaXR5KG9mZnNldFZhbCArIGRhdGFMZW5ndGgpO1xuICAgICAgICAvLyBBZGp1c3QgU21hcnRCdWZmZXIgbGVuZ3RoIChpZiBvZmZzZXQgKyBsZW5ndGggaXMgbGFyZ2VyIHRoYW4gbWFuYWdlZCBsZW5ndGgsIGFkanVzdCBsZW5ndGgpXG4gICAgICAgIGlmIChvZmZzZXRWYWwgKyBkYXRhTGVuZ3RoID4gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gb2Zmc2V0VmFsICsgZGF0YUxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIGludGVybmFsIEJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gd3JpdGUgYXQgbGVhc3QgdGhlIGdpdmVuIGFtb3VudCBvZiBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1pbkxlbmd0aCB7IE51bWJlciB9IFRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgZGF0YSBuZWVkcyB0byBiZSB3cml0dGVuLlxuICAgICAqL1xuICAgIF9lbnN1cmVDYXBhY2l0eShtaW5MZW5ndGgpIHtcbiAgICAgICAgY29uc3Qgb2xkTGVuZ3RoID0gdGhpcy5fYnVmZi5sZW5ndGg7XG4gICAgICAgIGlmIChtaW5MZW5ndGggPiBvbGRMZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5fYnVmZjtcbiAgICAgICAgICAgIGxldCBuZXdMZW5ndGggPSAob2xkTGVuZ3RoICogMykgLyAyICsgMTtcbiAgICAgICAgICAgIGlmIChuZXdMZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBuZXdMZW5ndGggPSBtaW5MZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9idWZmID0gQnVmZmVyLmFsbG9jVW5zYWZlKG5ld0xlbmd0aCk7XG4gICAgICAgICAgICBkYXRhLmNvcHkodGhpcy5fYnVmZiwgMCwgMCwgb2xkTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIG51bWVyaWMgbnVtYmVyIHZhbHVlIHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEB0eXBlcGFyYW0gVCB7IG51bWJlciB8IGJpZ2ludCB9IFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSB0byBiZSByZWFkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZnVuYyB7IEZ1bmN0aW9uKG9mZnNldDogbnVtYmVyKSA9PiBudW1iZXIgfSBUaGUgZnVuY3Rpb24gdG8gcmVhZCBkYXRhIG9uIHRoZSBpbnRlcm5hbCBCdWZmZXIgd2l0aC5cbiAgICAgKiBAcGFyYW0gYnl0ZVNpemUgeyBOdW1iZXIgfSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBmcm9tIChvcHRpb25hbCkuIFdoZW4gdGhpcyBpcyBub3QgcHJvdmlkZWQsIHRoZSBtYW5hZ2VkIHJlYWRPZmZzZXQgaXMgdXNlZCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgeyBUIH0gdGhlIG51bWJlciB2YWx1ZVxuICAgICAqL1xuICAgIF9yZWFkTnVtYmVyVmFsdWUoZnVuYywgYnl0ZVNpemUsIG9mZnNldCkge1xuICAgICAgICB0aGlzLmVuc3VyZVJlYWRhYmxlKGJ5dGVTaXplLCBvZmZzZXQpO1xuICAgICAgICAvLyBDYWxsIEJ1ZmZlci5yZWFkWFhYWCgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGZ1bmMuY2FsbCh0aGlzLl9idWZmLCB0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJyA/IG9mZnNldCA6IHRoaXMuX3JlYWRPZmZzZXQpO1xuICAgICAgICAvLyBBZGp1c3QgaW50ZXJuYWwgcmVhZCBvZmZzZXQgaWYgYW4gb3B0aW9uYWwgcmVhZCBvZmZzZXQgd2FzIG5vdCBwcm92aWRlZC5cbiAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkT2Zmc2V0ICs9IGJ5dGVTaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIG51bWVyaWMgbnVtYmVyIHZhbHVlIGJhc2VkIG9uIHRoZSBnaXZlbiBvZmZzZXQgYW5kIHZhbHVlLlxuICAgICAqXG4gICAgICogQHR5cGVwYXJhbSBUIHsgbnVtYmVyIHwgYmlnaW50IH0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmdW5jIHsgRnVuY3Rpb24ob2Zmc2V0OiBULCBvZmZzZXQ/KSA9PiBudW1iZXJ9IFRoZSBmdW5jdGlvbiB0byB3cml0ZSBkYXRhIG9uIHRoZSBpbnRlcm5hbCBCdWZmZXIgd2l0aC5cbiAgICAgKiBAcGFyYW0gYnl0ZVNpemUgeyBOdW1iZXIgfSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uXG4gICAgICogQHBhcmFtIHZhbHVlIHsgVCB9IFRoZSBudW1iZXIgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IHRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIG51bWJlciBhdCAoUkVRVUlSRUQpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgU21hcnRCdWZmZXIgdGhpcyBidWZmZXJcbiAgICAgKi9cbiAgICBfaW5zZXJ0TnVtYmVyVmFsdWUoZnVuYywgYnl0ZVNpemUsIHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgb2Zmc2V0IHZhbHVlcy5cbiAgICAgICAgdXRpbHNfMS5jaGVja09mZnNldFZhbHVlKG9mZnNldCk7XG4gICAgICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggaW50ZXJuYWwgQnVmZmVyIGNhcGFjaXR5LiAocmF3IG9mZnNldCBpcyBwYXNzZWQpXG4gICAgICAgIHRoaXMuZW5zdXJlSW5zZXJ0YWJsZShieXRlU2l6ZSwgb2Zmc2V0KTtcbiAgICAgICAgLy8gQ2FsbCBidWZmZXIud3JpdGVYWFhYKCk7XG4gICAgICAgIGZ1bmMuY2FsbCh0aGlzLl9idWZmLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICAgICAgLy8gQWRqdXN0cyBpbnRlcm5hbGx5IG1hbmFnZWQgd3JpdGUgb2Zmc2V0LlxuICAgICAgICB0aGlzLl93cml0ZU9mZnNldCArPSBieXRlU2l6ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIG51bWVyaWMgbnVtYmVyIHZhbHVlIGJhc2VkIG9uIHRoZSBnaXZlbiBvZmZzZXQgYW5kIHZhbHVlLlxuICAgICAqXG4gICAgICogQHR5cGVwYXJhbSBUIHsgbnVtYmVyIHwgYmlnaW50IH0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmdW5jIHsgRnVuY3Rpb24ob2Zmc2V0OiBULCBvZmZzZXQ/KSA9PiBudW1iZXJ9IFRoZSBmdW5jdGlvbiB0byB3cml0ZSBkYXRhIG9uIHRoZSBpbnRlcm5hbCBCdWZmZXIgd2l0aC5cbiAgICAgKiBAcGFyYW0gYnl0ZVNpemUgeyBOdW1iZXIgfSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uXG4gICAgICogQHBhcmFtIHZhbHVlIHsgVCB9IFRoZSBudW1iZXIgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IHRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIG51bWJlciBhdCAoUkVRVUlSRUQpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgU21hcnRCdWZmZXIgdGhpcyBidWZmZXJcbiAgICAgKi9cbiAgICBfd3JpdGVOdW1iZXJWYWx1ZShmdW5jLCBieXRlU2l6ZSwgdmFsdWUsIG9mZnNldCkge1xuICAgICAgICAvLyBJZiBhbiBvZmZzZXQgd2FzIHByb3ZpZGVkLCB2YWxpZGF0ZSBpdC5cbiAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSB3cml0aW5nIGJleW9uZCB0aGUgYm91bmRzIG9mIHRoZSBtYW5hZ2VkIGRhdGEuXG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih1dGlsc18xLkVSUk9SUy5JTlZBTElEX1dSSVRFX0JFWU9ORF9CT1VORFMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXRpbHNfMS5jaGVja09mZnNldFZhbHVlKG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVmYXVsdCB0byB3cml0ZU9mZnNldCBpZiBubyBvZmZzZXQgdmFsdWUgd2FzIGdpdmVuLlxuICAgICAgICBjb25zdCBvZmZzZXRWYWwgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJyA/IG9mZnNldCA6IHRoaXMuX3dyaXRlT2Zmc2V0O1xuICAgICAgICAvLyBFbnN1cmUgdGhlcmUgaXMgZW5vdWdoIGludGVybmFsIEJ1ZmZlciBjYXBhY2l0eS4gKHJhdyBvZmZzZXQgaXMgcGFzc2VkKVxuICAgICAgICB0aGlzLl9lbnN1cmVXcml0ZWFibGUoYnl0ZVNpemUsIG9mZnNldFZhbCk7XG4gICAgICAgIGZ1bmMuY2FsbCh0aGlzLl9idWZmLCB2YWx1ZSwgb2Zmc2V0VmFsKTtcbiAgICAgICAgLy8gSWYgYW4gb2Zmc2V0IHdhcyBnaXZlbiwgY2hlY2sgdG8gc2VlIGlmIHdlIHdyb3RlIGJleW9uZCB0aGUgY3VycmVudCB3cml0ZU9mZnNldC5cbiAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLl93cml0ZU9mZnNldCA9IE1hdGgubWF4KHRoaXMuX3dyaXRlT2Zmc2V0LCBvZmZzZXRWYWwgKyBieXRlU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBubyBudW1lcmljIG9mZnNldCB3YXMgZ2l2ZW4sIHdlIHdyb3RlIHRvIHRoZSBlbmQgb2YgdGhlIFNtYXJ0QnVmZmVyIHNvIGluY3JlbWVudCB3cml0ZU9mZnNldC5cbiAgICAgICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ICs9IGJ5dGVTaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbmV4cG9ydHMuU21hcnRCdWZmZXIgPSBTbWFydEJ1ZmZlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNtYXJ0YnVmZmVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgYnVmZmVyXzEgPSByZXF1aXJlKFwiYnVmZmVyXCIpO1xuLyoqXG4gKiBFcnJvciBzdHJpbmdzXG4gKi9cbmNvbnN0IEVSUk9SUyA9IHtcbiAgICBJTlZBTElEX0VOQ09ESU5HOiAnSW52YWxpZCBlbmNvZGluZyBwcm92aWRlZC4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBlbmNvZGluZyB0aGUgaW50ZXJuYWwgTm9kZS5qcyBCdWZmZXIgc3VwcG9ydHMuJyxcbiAgICBJTlZBTElEX1NNQVJUQlVGRkVSX1NJWkU6ICdJbnZhbGlkIHNpemUgcHJvdmlkZWQuIFNpemUgbXVzdCBiZSBhIHZhbGlkIGludGVnZXIgZ3JlYXRlciB0aGFuIHplcm8uJyxcbiAgICBJTlZBTElEX1NNQVJUQlVGRkVSX0JVRkZFUjogJ0ludmFsaWQgQnVmZmVyIHByb3ZpZGVkIGluIFNtYXJ0QnVmZmVyT3B0aW9ucy4nLFxuICAgIElOVkFMSURfU01BUlRCVUZGRVJfT0JKRUNUOiAnSW52YWxpZCBTbWFydEJ1ZmZlck9wdGlvbnMgb2JqZWN0IHN1cHBsaWVkIHRvIFNtYXJ0QnVmZmVyIGNvbnN0cnVjdG9yIG9yIGZhY3RvcnkgbWV0aG9kcy4nLFxuICAgIElOVkFMSURfT0ZGU0VUOiAnQW4gaW52YWxpZCBvZmZzZXQgdmFsdWUgd2FzIHByb3ZpZGVkLicsXG4gICAgSU5WQUxJRF9PRkZTRVRfTk9OX05VTUJFUjogJ0FuIGludmFsaWQgb2Zmc2V0IHZhbHVlIHdhcyBwcm92aWRlZC4gQSBudW1lcmljIHZhbHVlIGlzIHJlcXVpcmVkLicsXG4gICAgSU5WQUxJRF9MRU5HVEg6ICdBbiBpbnZhbGlkIGxlbmd0aCB2YWx1ZSB3YXMgcHJvdmlkZWQuJyxcbiAgICBJTlZBTElEX0xFTkdUSF9OT05fTlVNQkVSOiAnQW4gaW52YWxpZCBsZW5ndGggdmFsdWUgd2FzIHByb3ZpdmVkLiBBIG51bWVyaWMgdmFsdWUgaXMgcmVxdWlyZWQuJyxcbiAgICBJTlZBTElEX1RBUkdFVF9PRkZTRVQ6ICdUYXJnZXQgb2Zmc2V0IGlzIGJleW9uZCB0aGUgYm91bmRzIG9mIHRoZSBpbnRlcm5hbCBTbWFydEJ1ZmZlciBkYXRhLicsXG4gICAgSU5WQUxJRF9UQVJHRVRfTEVOR1RIOiAnU3BlY2lmaWVkIGxlbmd0aCB2YWx1ZSBtb3ZlcyBjdXJzb3IgYmV5b25nIHRoZSBib3VuZHMgb2YgdGhlIGludGVybmFsIFNtYXJ0QnVmZmVyIGRhdGEuJyxcbiAgICBJTlZBTElEX1JFQURfQkVZT05EX0JPVU5EUzogJ0F0dGVtcHRlZCB0byByZWFkIGJleW9uZCB0aGUgYm91bmRzIG9mIHRoZSBtYW5hZ2VkIGRhdGEuJyxcbiAgICBJTlZBTElEX1dSSVRFX0JFWU9ORF9CT1VORFM6ICdBdHRlbXB0ZWQgdG8gd3JpdGUgYmV5b25kIHRoZSBib3VuZHMgb2YgdGhlIG1hbmFnZWQgZGF0YS4nXG59O1xuZXhwb3J0cy5FUlJPUlMgPSBFUlJPUlM7XG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIGVuY29kaW5nIGlzIGEgdmFsaWQgQnVmZmVyIGVuY29kaW5nLiAoVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBjaGVjayBmYWlscylcbiAqXG4gKiBAcGFyYW0geyBTdHJpbmcgfSBlbmNvZGluZyBUaGUgZW5jb2Rpbmcgc3RyaW5nIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjaGVja0VuY29kaW5nKGVuY29kaW5nKSB7XG4gICAgaWYgKCFidWZmZXJfMS5CdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SUy5JTlZBTElEX0VOQ09ESU5HKTtcbiAgICB9XG59XG5leHBvcnRzLmNoZWNrRW5jb2RpbmcgPSBjaGVja0VuY29kaW5nO1xuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBudW1iZXIgaXMgYSBmaW5pdGUgaW50ZWdlci4gKFRocm93cyBhbiBleGNlcHRpb24gaWYgY2hlY2sgZmFpbHMpXG4gKlxuICogQHBhcmFtIHsgTnVtYmVyIH0gdmFsdWUgVGhlIG51bWJlciB2YWx1ZSB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gaXNGaW5pdGVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsdWUpICYmIGlzSW50ZWdlcih2YWx1ZSk7XG59XG5leHBvcnRzLmlzRmluaXRlSW50ZWdlciA9IGlzRmluaXRlSW50ZWdlcjtcbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9mZnNldC9sZW5ndGggdmFsdWUgaXMgdmFsaWQuIChUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGNoZWNrIGZhaWxzKVxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0gb2Zmc2V0IFRydWUgaWYgY2hlY2tpbmcgYW4gb2Zmc2V0LCBmYWxzZSBpZiBjaGVja2luZyBhIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXRPckxlbmd0aFZhbHVlKHZhbHVlLCBvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBDaGVjayBmb3Igbm9uIGZpbml0ZS9ub24gaW50ZWdlcnNcbiAgICAgICAgaWYgKCFpc0Zpbml0ZUludGVnZXIodmFsdWUpIHx8IHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG9mZnNldCA/IEVSUk9SUy5JTlZBTElEX09GRlNFVCA6IEVSUk9SUy5JTlZBTElEX0xFTkdUSCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihvZmZzZXQgPyBFUlJPUlMuSU5WQUxJRF9PRkZTRVRfTk9OX05VTUJFUiA6IEVSUk9SUy5JTlZBTElEX0xFTkdUSF9OT05fTlVNQkVSKTtcbiAgICB9XG59XG4vKipcbiAqIENoZWNrcyBpZiBhIGxlbmd0aCB2YWx1ZSBpcyB2YWxpZC4gKFRocm93cyBhbiBleGNlcHRpb24gaWYgY2hlY2sgZmFpbHMpXG4gKlxuICogQHBhcmFtIHsgTnVtYmVyIH0gbGVuZ3RoIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gY2hlY2tMZW5ndGhWYWx1ZShsZW5ndGgpIHtcbiAgICBjaGVja09mZnNldE9yTGVuZ3RoVmFsdWUobGVuZ3RoLCBmYWxzZSk7XG59XG5leHBvcnRzLmNoZWNrTGVuZ3RoVmFsdWUgPSBjaGVja0xlbmd0aFZhbHVlO1xuLyoqXG4gKiBDaGVja3MgaWYgYSBvZmZzZXQgdmFsdWUgaXMgdmFsaWQuIChUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGNoZWNrIGZhaWxzKVxuICpcbiAqIEBwYXJhbSB7IE51bWJlciB9IG9mZnNldCBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KSB7XG4gICAgY2hlY2tPZmZzZXRPckxlbmd0aFZhbHVlKG9mZnNldCwgdHJ1ZSk7XG59XG5leHBvcnRzLmNoZWNrT2Zmc2V0VmFsdWUgPSBjaGVja09mZnNldFZhbHVlO1xuLyoqXG4gKiBDaGVja3MgaWYgYSB0YXJnZXQgb2Zmc2V0IHZhbHVlIGlzIG91dCBvZiBib3VuZHMuIChUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGNoZWNrIGZhaWxzKVxuICpcbiAqIEBwYXJhbSB7IE51bWJlciB9IG9mZnNldCBUaGUgb2Zmc2V0IHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHsgU21hcnRCdWZmZXIgfSBidWZmIFRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZSB0byBjaGVjayBhZ2FpbnN0LlxuICovXG5mdW5jdGlvbiBjaGVja1RhcmdldE9mZnNldChvZmZzZXQsIGJ1ZmYpIHtcbiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JTLklOVkFMSURfVEFSR0VUX09GRlNFVCk7XG4gICAgfVxufVxuZXhwb3J0cy5jaGVja1RhcmdldE9mZnNldCA9IGNoZWNrVGFyZ2V0T2Zmc2V0O1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBudW1iZXIgaXMgYSBpbnRlZ2VyLlxuICogQHBhcmFtIHZhbHVlIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbHVlKSAmJiBNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWU7XG59XG4vKipcbiAqIFRocm93cyBpZiBOb2RlLmpzIHZlcnNpb24gaXMgdG9vIGxvdyB0byBzdXBwb3J0IGJpZ2ludFxuICovXG5mdW5jdGlvbiBiaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKGJ1ZmZlck1ldGhvZCkge1xuICAgIGlmICh0eXBlb2YgQmlnSW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgSlMgQmlnSW50IHR5cGUuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYnVmZmVyXzEuQnVmZmVyLnByb3RvdHlwZVtidWZmZXJNZXRob2RdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgQnVmZmVyLnByb3RvdHlwZS4ke2J1ZmZlck1ldGhvZH0uYCk7XG4gICAgfVxufVxuZXhwb3J0cy5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrID0gYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNvY2tzUHJveHlBZ2VudCA9IHZvaWQgMDtcbmNvbnN0IHNvY2tzXzEgPSByZXF1aXJlKFwic29ja3NcIik7XG5jb25zdCBhZ2VudF9iYXNlXzEgPSByZXF1aXJlKFwiYWdlbnQtYmFzZVwiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IGRucyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiZG5zXCIpKTtcbmNvbnN0IHRscyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidGxzXCIpKTtcbmNvbnN0IHVybF8xID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ3NvY2tzLXByb3h5LWFnZW50Jyk7XG5mdW5jdGlvbiBwYXJzZVNvY2tzVVJMKHVybCkge1xuICAgIGxldCBsb29rdXAgPSBmYWxzZTtcbiAgICBsZXQgdHlwZSA9IDU7XG4gICAgY29uc3QgaG9zdCA9IHVybC5ob3N0bmFtZTtcbiAgICAvLyBGcm9tIFJGQyAxOTI4LCBTZWN0aW9uIDM6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxOTI4I3NlY3Rpb24tM1xuICAgIC8vIFwiVGhlIFNPQ0tTIHNlcnZpY2UgaXMgY29udmVudGlvbmFsbHkgbG9jYXRlZCBvbiBUQ1AgcG9ydCAxMDgwXCJcbiAgICBjb25zdCBwb3J0ID0gcGFyc2VJbnQodXJsLnBvcnQsIDEwKSB8fCAxMDgwO1xuICAgIC8vIGZpZ3VyZSBvdXQgaWYgd2Ugd2FudCBzb2NrcyB2NCBvciB2NSwgYmFzZWQgb24gdGhlIFwicHJvdG9jb2xcIiB1c2VkLlxuICAgIC8vIERlZmF1bHRzIHRvIDUuXG4gICAgc3dpdGNoICh1cmwucHJvdG9jb2wucmVwbGFjZSgnOicsICcnKSkge1xuICAgICAgICBjYXNlICdzb2NrczQnOlxuICAgICAgICAgICAgbG9va3VwID0gdHJ1ZTtcbiAgICAgICAgICAgIHR5cGUgPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIHBhc3MgdGhyb3VnaFxuICAgICAgICBjYXNlICdzb2NrczRhJzpcbiAgICAgICAgICAgIHR5cGUgPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NvY2tzNSc6XG4gICAgICAgICAgICBsb29rdXAgPSB0cnVlO1xuICAgICAgICAgICAgdHlwZSA9IDU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gcGFzcyB0aHJvdWdoXG4gICAgICAgIGNhc2UgJ3NvY2tzJzogLy8gbm8gdmVyc2lvbiBzcGVjaWZpZWQsIGRlZmF1bHQgdG8gNWhcbiAgICAgICAgICAgIHR5cGUgPSA1O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NvY2tzNWgnOlxuICAgICAgICAgICAgdHlwZSA9IDU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEEgXCJzb2Nrc1wiIHByb3RvY29sIG11c3QgYmUgc3BlY2lmaWVkISBHb3Q6ICR7U3RyaW5nKHVybC5wcm90b2NvbCl9YCk7XG4gICAgfVxuICAgIGNvbnN0IHByb3h5ID0ge1xuICAgICAgICBob3N0LFxuICAgICAgICBwb3J0LFxuICAgICAgICB0eXBlLFxuICAgIH07XG4gICAgaWYgKHVybC51c2VybmFtZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJveHksICd1c2VySWQnLCB7XG4gICAgICAgICAgICB2YWx1ZTogZGVjb2RlVVJJQ29tcG9uZW50KHVybC51c2VybmFtZSksXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh1cmwucGFzc3dvcmQgIT0gbnVsbCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJveHksICdwYXNzd29yZCcsIHtcbiAgICAgICAgICAgIHZhbHVlOiBkZWNvZGVVUklDb21wb25lbnQodXJsLnBhc3N3b3JkKSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbG9va3VwLCBwcm94eSB9O1xufVxuY2xhc3MgU29ja3NQcm94eUFnZW50IGV4dGVuZHMgYWdlbnRfYmFzZV8xLkFnZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmksIG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIGNvbnN0IHVybCA9IHR5cGVvZiB1cmkgPT09ICdzdHJpbmcnID8gbmV3IHVybF8xLlVSTCh1cmkpIDogdXJpO1xuICAgICAgICBjb25zdCB7IHByb3h5LCBsb29rdXAgfSA9IHBhcnNlU29ja3NVUkwodXJsKTtcbiAgICAgICAgdGhpcy5zaG91bGRMb29rdXAgPSBsb29rdXA7XG4gICAgICAgIHRoaXMucHJveHkgPSBwcm94eTtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gb3B0cz8udGltZW91dCA/PyBudWxsO1xuICAgICAgICB0aGlzLnNvY2tldE9wdGlvbnMgPSBvcHRzPy5zb2NrZXRPcHRpb25zID8/IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYXRlcyBhIFNPQ0tTIGNvbm5lY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBTT0NLUyBwcm94eSBzZXJ2ZXIsXG4gICAgICogd2hpY2ggaW4gdHVybiBjb25uZWN0cyB0byB0aGUgc3BlY2lmaWVkIHJlbW90ZSBob3N0IGFuZCBwb3J0LlxuICAgICAqL1xuICAgIGFzeW5jIGNvbm5lY3QocmVxLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IHsgc2hvdWxkTG9va3VwLCBwcm94eSwgdGltZW91dCB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFvcHRzLmhvc3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gYGhvc3RgIGRlZmluZWQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgaG9zdCB9ID0gb3B0cztcbiAgICAgICAgY29uc3QgeyBwb3J0LCBsb29rdXA6IGxvb2t1cEZuID0gZG5zLmxvb2t1cCB9ID0gb3B0cztcbiAgICAgICAgaWYgKHNob3VsZExvb2t1cCkge1xuICAgICAgICAgICAgLy8gQ2xpZW50LXNpZGUgRE5TIHJlc29sdXRpb24gZm9yIFwiNFwiIGFuZCBcIjVcIiBzb2NrcyBwcm94eSB2ZXJzaW9ucy5cbiAgICAgICAgICAgIGhvc3QgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSByZXF1ZXN0J3MgY3VzdG9tIGxvb2t1cCwgaWYgb25lIHdhcyBjb25maWd1cmVkOlxuICAgICAgICAgICAgICAgIGxvb2t1cEZuKGhvc3QsIHt9LCAoZXJyLCByZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvY2tzT3B0cyA9IHtcbiAgICAgICAgICAgIHByb3h5LFxuICAgICAgICAgICAgZGVzdGluYXRpb246IHtcbiAgICAgICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgICAgIHBvcnQ6IHR5cGVvZiBwb3J0ID09PSAnbnVtYmVyJyA/IHBvcnQgOiBwYXJzZUludChwb3J0LCAxMCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tbWFuZDogJ2Nvbm5lY3QnLFxuICAgICAgICAgICAgdGltZW91dDogdGltZW91dCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSB0eXBlIHN1cHBsaWVkIGJ5IHNvY2tzIGZvciBzb2NrZXRfb3B0aW9ucyBpcyB3aWRlclxuICAgICAgICAgICAgLy8gdGhhbiBuZWNlc3Nhcnkgc2luY2Ugc29ja3Mgd2lsbCBhbHdheXMgb3ZlcnJpZGUgdGhlIGhvc3QgYW5kIHBvcnRcbiAgICAgICAgICAgIHNvY2tldF9vcHRpb25zOiB0aGlzLnNvY2tldE9wdGlvbnMgPz8gdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjbGVhbnVwID0gKHRsc1NvY2tldCkgPT4ge1xuICAgICAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICBpZiAodGxzU29ja2V0KVxuICAgICAgICAgICAgICAgIHRsc1NvY2tldC5kZXN0cm95KCk7XG4gICAgICAgIH07XG4gICAgICAgIGRlYnVnKCdDcmVhdGluZyBzb2NrcyBwcm94eSBjb25uZWN0aW9uOiAlbycsIHNvY2tzT3B0cyk7XG4gICAgICAgIGNvbnN0IHsgc29ja2V0IH0gPSBhd2FpdCBzb2Nrc18xLlNvY2tzQ2xpZW50LmNyZWF0ZUNvbm5lY3Rpb24oc29ja3NPcHRzKTtcbiAgICAgICAgZGVidWcoJ1N1Y2Nlc3NmdWxseSBjcmVhdGVkIHNvY2tzIHByb3h5IGNvbm5lY3Rpb24nKTtcbiAgICAgICAgaWYgKHRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgc29ja2V0Lm9uKCd0aW1lb3V0JywgKCkgPT4gY2xlYW51cCgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5zZWN1cmVFbmRwb2ludCkge1xuICAgICAgICAgICAgLy8gVGhlIHByb3h5IGlzIGNvbm5lY3RpbmcgdG8gYSBUTFMgc2VydmVyLCBzbyB1cGdyYWRlXG4gICAgICAgICAgICAvLyB0aGlzIHNvY2tldCBjb25uZWN0aW9uIHRvIGEgVExTIGNvbm5lY3Rpb24uXG4gICAgICAgICAgICBkZWJ1ZygnVXBncmFkaW5nIHNvY2tldCBjb25uZWN0aW9uIHRvIFRMUycpO1xuICAgICAgICAgICAgY29uc3Qgc2VydmVybmFtZSA9IG9wdHMuc2VydmVybmFtZSB8fCBvcHRzLmhvc3Q7XG4gICAgICAgICAgICBjb25zdCB0bHNTb2NrZXQgPSB0bHMuY29ubmVjdCh7XG4gICAgICAgICAgICAgICAgLi4ub21pdChvcHRzLCAnaG9zdCcsICdwYXRoJywgJ3BvcnQnKSxcbiAgICAgICAgICAgICAgICBzb2NrZXQsXG4gICAgICAgICAgICAgICAgc2VydmVybmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGxzU29ja2V0Lm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ1NvY2tldCBUTFMgZXJyb3InLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKHRsc1NvY2tldCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0bHNTb2NrZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvY2tldDtcbiAgICB9XG59XG5Tb2Nrc1Byb3h5QWdlbnQucHJvdG9jb2xzID0gW1xuICAgICdzb2NrcycsXG4gICAgJ3NvY2tzNCcsXG4gICAgJ3NvY2tzNGEnLFxuICAgICdzb2NrczUnLFxuICAgICdzb2NrczVoJyxcbl07XG5leHBvcnRzLlNvY2tzUHJveHlBZ2VudCA9IFNvY2tzUHJveHlBZ2VudDtcbmZ1bmN0aW9uIG9taXQob2JqLCAuLi5rZXlzKSB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGtleTtcbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNvY2tzQ2xpZW50RXJyb3IgPSBleHBvcnRzLlNvY2tzQ2xpZW50ID0gdm9pZCAwO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xuY29uc3QgbmV0ID0gcmVxdWlyZShcIm5ldFwiKTtcbmNvbnN0IHNtYXJ0X2J1ZmZlcl8xID0gcmVxdWlyZShcInNtYXJ0LWJ1ZmZlclwiKTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9jb25zdGFudHNcIik7XG5jb25zdCBoZWxwZXJzXzEgPSByZXF1aXJlKFwiLi4vY29tbW9uL2hlbHBlcnNcIik7XG5jb25zdCByZWNlaXZlYnVmZmVyXzEgPSByZXF1aXJlKFwiLi4vY29tbW9uL3JlY2VpdmVidWZmZXJcIik7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwiLi4vY29tbW9uL3V0aWxcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTb2Nrc0NsaWVudEVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsXzEuU29ja3NDbGllbnRFcnJvcjsgfSB9KTtcbmNvbnN0IGlwX2FkZHJlc3NfMSA9IHJlcXVpcmUoXCJpcC1hZGRyZXNzXCIpO1xuY2xhc3MgU29ja3NDbGllbnQgZXh0ZW5kcyBldmVudHNfMS5FdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICAgIC8vIFZhbGlkYXRlIFNvY2tzQ2xpZW50T3B0aW9uc1xuICAgICAgICAoMCwgaGVscGVyc18xLnZhbGlkYXRlU29ja3NDbGllbnRPcHRpb25zKShvcHRpb25zKTtcbiAgICAgICAgLy8gRGVmYXVsdCBzdGF0ZVxuICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuQ3JlYXRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU09DS1MgY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqIE5vdGU6IFN1cHBvcnRzIGNhbGxiYWNrcyBhbmQgcHJvbWlzZXMuIE9ubHkgc3VwcG9ydHMgdGhlIGNvbm5lY3QgY29tbWFuZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyB7IFNvY2tzQ2xpZW50T3B0aW9ucyB9IE9wdGlvbnMuXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIHsgRnVuY3Rpb24gfSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7IFByb21pc2UgfVxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVDb25uZWN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBWYWxpZGF0ZSBTb2Nrc0NsaWVudE9wdGlvbnNcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgKDAsIGhlbHBlcnNfMS52YWxpZGF0ZVNvY2tzQ2xpZW50T3B0aW9ucykob3B0aW9ucywgWydjb25uZWN0J10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZXJyKTsgLy8gUmVzb2x2ZXMgcGVuZGluZyBwcm9taXNlIChwcmV2ZW50cyBtZW1vcnkgbGVha3MpLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBTb2Nrc0NsaWVudChvcHRpb25zKTtcbiAgICAgICAgICAgIGNsaWVudC5jb25uZWN0KG9wdGlvbnMuZXhpc3Rpbmdfc29ja2V0KTtcbiAgICAgICAgICAgIGNsaWVudC5vbmNlKCdlc3RhYmxpc2hlZCcsIChpbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgaW5mbyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaW5mbyk7IC8vIFJlc29sdmVzIHBlbmRpbmcgcHJvbWlzZSAocHJldmVudHMgbWVtb3J5IGxlYWtzKS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBFcnJvciBvY2N1cnJlZCwgZmFpbGVkIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uLlxuICAgICAgICAgICAgY2xpZW50Lm9uY2UoJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXJyKTsgLy8gUmVzb2x2ZXMgcGVuZGluZyBwcm9taXNlIChwcmV2ZW50cyBtZW1vcnkgbGVha3MpLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNPQ0tTIGNvbm5lY3Rpb24gY2hhaW4gdG8gYSBkZXN0aW5hdGlvbiBob3N0IHRocm91Z2ggMiBvciBtb3JlIFNPQ0tTIHByb3hpZXMuXG4gICAgICpcbiAgICAgKiBOb3RlOiBTdXBwb3J0cyBjYWxsYmFja3MgYW5kIHByb21pc2VzLiBPbmx5IHN1cHBvcnRzIHRoZSBjb25uZWN0IG1ldGhvZC5cbiAgICAgKiBOb3RlOiBJbXBsZW1lbnRlZCB2aWEgY3JlYXRlQ29ubmVjdGlvbigpIGZhY3RvcnkgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgeyBTb2Nrc0NsaWVudENoYWluT3B0aW9ucyB9IE9wdGlvbnNcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgeyBGdW5jdGlvbiB9IEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHsgUHJvbWlzZSB9XG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZUNvbm5lY3Rpb25DaGFpbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgLy8gVmFsaWRhdGUgU29ja3NDbGllbnRDaGFpbk9wdGlvbnNcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgKDAsIGhlbHBlcnNfMS52YWxpZGF0ZVNvY2tzQ2xpZW50Q2hhaW5PcHRpb25zKShvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGVycik7IC8vIFJlc29sdmVzIHBlbmRpbmcgcHJvbWlzZSAocHJldmVudHMgbWVtb3J5IGxlYWtzKS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTaHVmZmxlIHByb3hpZXNcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJhbmRvbWl6ZUNoYWluKSB7XG4gICAgICAgICAgICAgICAgKDAsIHV0aWxfMS5zaHVmZmxlQXJyYXkpKG9wdGlvbnMucHJveGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBzb2NrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5wcm94aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRQcm94eSA9IG9wdGlvbnMucHJveGllc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UndmUgcmVhY2hlZCB0aGUgbGFzdCBwcm94eSBpbiB0aGUgY2hhaW4sIHRoZSBkZXN0aW5hdGlvbiBpcyB0aGUgYWN0dWFsIGRlc3RpbmF0aW9uLCBvdGhlcndpc2UgaXQncyB0aGUgbmV4dCBwcm94eS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dERlc3RpbmF0aW9uID0gaSA9PT0gb3B0aW9ucy5wcm94aWVzLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gb3B0aW9ucy5kZXN0aW5hdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdDogb3B0aW9ucy5wcm94aWVzW2kgKyAxXS5ob3N0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHJveGllc1tpICsgMV0uaXBhZGRyZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IG9wdGlvbnMucHJveGllc1tpICsgMV0ucG9ydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZXMgdGhlIG5leHQgY29ubmVjdGlvbiBpbiB0aGUgY2hhaW4uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIFNvY2tzQ2xpZW50LmNyZWF0ZUNvbm5lY3Rpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogJ2Nvbm5lY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJveHk6IG5leHRQcm94eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBuZXh0RGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19zb2NrZXQ6IHNvY2ssXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBzb2NrIGlzIHVuZGVmaW5lZCwgYXNzaWduIGl0IGhlcmUuXG4gICAgICAgICAgICAgICAgICAgIHNvY2sgPSBzb2NrIHx8IHJlc3VsdC5zb2NrZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgeyBzb2NrZXQ6IHNvY2sgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBzb2NrZXQ6IHNvY2sgfSk7IC8vIFJlc29sdmVzIHBlbmRpbmcgcHJvbWlzZSAocHJldmVudHMgbWVtb3J5IGxlYWtzKS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBzb2NrZXQ6IHNvY2sgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShlcnIpOyAvLyBSZXNvbHZlcyBwZW5kaW5nIHByb21pc2UgKHByZXZlbnRzIG1lbW9yeSBsZWFrcykuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFNPQ0tTIFVEUCBGcmFtZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVVRFBGcmFtZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmYgPSBuZXcgc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIoKTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQxNkJFKDApO1xuICAgICAgICBidWZmLndyaXRlVUludDgob3B0aW9ucy5mcmFtZU51bWJlciB8fCAwKTtcbiAgICAgICAgLy8gSVB2NC9JUHY2L0hvc3RuYW1lXG4gICAgICAgIGlmIChuZXQuaXNJUHY0KG9wdGlvbnMucmVtb3RlSG9zdC5ob3N0KSkge1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLklQdjQpO1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQzMkJFKCgwLCBoZWxwZXJzXzEuaXB2NFRvSW50MzIpKG9wdGlvbnMucmVtb3RlSG9zdC5ob3N0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmV0LmlzSVB2NihvcHRpb25zLnJlbW90ZUhvc3QuaG9zdCkpIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY2KTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVCdWZmZXIoKDAsIGhlbHBlcnNfMS5pcFRvQnVmZmVyKShvcHRpb25zLnJlbW90ZUhvc3QuaG9zdCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLkhvc3RuYW1lKTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChCdWZmZXIuYnl0ZUxlbmd0aChvcHRpb25zLnJlbW90ZUhvc3QuaG9zdCkpO1xuICAgICAgICAgICAgYnVmZi53cml0ZVN0cmluZyhvcHRpb25zLnJlbW90ZUhvc3QuaG9zdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUG9ydFxuICAgICAgICBidWZmLndyaXRlVUludDE2QkUob3B0aW9ucy5yZW1vdGVIb3N0LnBvcnQpO1xuICAgICAgICAvLyBEYXRhXG4gICAgICAgIGJ1ZmYud3JpdGVCdWZmZXIob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgcmV0dXJuIGJ1ZmYudG9CdWZmZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgU09DS1MgVURQIGZyYW1lLlxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlVURQRnJhbWUoZGF0YSkge1xuICAgICAgICBjb25zdCBidWZmID0gc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIuZnJvbUJ1ZmZlcihkYXRhKTtcbiAgICAgICAgYnVmZi5yZWFkT2Zmc2V0ID0gMjtcbiAgICAgICAgY29uc3QgZnJhbWVOdW1iZXIgPSBidWZmLnJlYWRVSW50OCgpO1xuICAgICAgICBjb25zdCBob3N0VHlwZSA9IGJ1ZmYucmVhZFVJbnQ4KCk7XG4gICAgICAgIGxldCByZW1vdGVIb3N0O1xuICAgICAgICBpZiAoaG9zdFR5cGUgPT09IGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLklQdjQpIHtcbiAgICAgICAgICAgIHJlbW90ZUhvc3QgPSAoMCwgaGVscGVyc18xLmludDMyVG9JcHY0KShidWZmLnJlYWRVSW50MzJCRSgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChob3N0VHlwZSA9PT0gY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2Nikge1xuICAgICAgICAgICAgcmVtb3RlSG9zdCA9IGlwX2FkZHJlc3NfMS5BZGRyZXNzNi5mcm9tQnl0ZUFycmF5KEFycmF5LmZyb20oYnVmZi5yZWFkQnVmZmVyKDE2KSkpLmNhbm9uaWNhbEZvcm0oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlbW90ZUhvc3QgPSBidWZmLnJlYWRTdHJpbmcoYnVmZi5yZWFkVUludDgoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtb3RlUG9ydCA9IGJ1ZmYucmVhZFVJbnQxNkJFKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmcmFtZU51bWJlcixcbiAgICAgICAgICAgIHJlbW90ZUhvc3Q6IHtcbiAgICAgICAgICAgICAgICBob3N0OiByZW1vdGVIb3N0LFxuICAgICAgICAgICAgICAgIHBvcnQ6IHJlbW90ZVBvcnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0YTogYnVmZi5yZWFkQnVmZmVyKCksXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIHN0YXRlIHNldHRlci4gSWYgdGhlIFNvY2tzQ2xpZW50IGlzIGluIGFuIGVycm9yIHN0YXRlLCBpdCBjYW5ub3QgYmUgY2hhbmdlZCB0byBhIG5vbiBlcnJvciBzdGF0ZS5cbiAgICAgKi9cbiAgICBzZXRTdGF0ZShuZXdTdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0aGUgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50IHRvIHRoZSBwcm94eSBhbmQgZGVzdGluYXRpb24uXG4gICAgICogQHBhcmFtIGV4aXN0aW5nU29ja2V0IENvbm5lY3RlZCBzb2NrZXQgdG8gdXNlIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lIChpbnRlcm5hbCB1c2UpLlxuICAgICAqL1xuICAgIGNvbm5lY3QoZXhpc3RpbmdTb2NrZXQpIHtcbiAgICAgICAgdGhpcy5vbkRhdGFSZWNlaXZlZCA9IChkYXRhKSA9PiB0aGlzLm9uRGF0YVJlY2VpdmVkSGFuZGxlcihkYXRhKTtcbiAgICAgICAgdGhpcy5vbkNsb3NlID0gKCkgPT4gdGhpcy5vbkNsb3NlSGFuZGxlcigpO1xuICAgICAgICB0aGlzLm9uRXJyb3IgPSAoZXJyKSA9PiB0aGlzLm9uRXJyb3JIYW5kbGVyKGVycik7XG4gICAgICAgIHRoaXMub25Db25uZWN0ID0gKCkgPT4gdGhpcy5vbkNvbm5lY3RIYW5kbGVyKCk7XG4gICAgICAgIC8vIFN0YXJ0IHRpbWVvdXQgdGltZXIgKGRlZmF1bHRzIHRvIDMwIHNlY29uZHMpXG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLm9uRXN0YWJsaXNoZWRUaW1lb3V0KCksIHRoaXMub3B0aW9ucy50aW1lb3V0IHx8IGNvbnN0YW50c18xLkRFRkFVTFRfVElNRU9VVCk7XG4gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdW5yZWYgaXMgYXZhaWxhYmxlIGFzIGl0IGRpZmZlcnMgZnJvbSBicm93c2VyIHRvIE5vZGVKUyAoIzMzKVxuICAgICAgICBpZiAodGltZXIudW5yZWYgJiYgdHlwZW9mIHRpbWVyLnVucmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aW1lci51bnJlZigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGFuIGV4aXN0aW5nIHNvY2tldCBpcyBwcm92aWRlZCwgdXNlIGl0IHRvIG5lZ290aWF0ZSBTT0NLUyBoYW5kc2hha2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgU29ja2V0LlxuICAgICAgICBpZiAoZXhpc3RpbmdTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gZXhpc3RpbmdTb2NrZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldCA9IG5ldyBuZXQuU29ja2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXR0YWNoIFNvY2tldCBlcnJvciBoYW5kbGVycy5cbiAgICAgICAgdGhpcy5zb2NrZXQub25jZSgnY2xvc2UnLCB0aGlzLm9uQ2xvc2UpO1xuICAgICAgICB0aGlzLnNvY2tldC5vbmNlKCdlcnJvcicsIHRoaXMub25FcnJvcik7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uY2UoJ2Nvbm5lY3QnLCB0aGlzLm9uQ29ubmVjdCk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uKCdkYXRhJywgdGhpcy5vbkRhdGFSZWNlaXZlZCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Db25uZWN0aW5nKTtcbiAgICAgICAgdGhpcy5yZWNlaXZlQnVmZmVyID0gbmV3IHJlY2VpdmVidWZmZXJfMS5SZWNlaXZlQnVmZmVyKCk7XG4gICAgICAgIGlmIChleGlzdGluZ1NvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnY29ubmVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdCh0aGlzLmdldFNvY2tldE9wdGlvbnMoKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNldF90Y3Bfbm9kZWxheSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNldF90Y3Bfbm9kZWxheSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNldE5vRGVsYXkoISF0aGlzLm9wdGlvbnMuc2V0X3RjcF9ub2RlbGF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBMaXN0ZW4gZm9yIGVzdGFibGlzaGVkIGV2ZW50IHNvIHdlIGNhbiByZS1lbWl0IGFueSBleGNlc3MgZGF0YSByZWNlaXZlZCBkdXJpbmcgaGFuZHNoYWtlcy5cbiAgICAgICAgdGhpcy5wcmVwZW5kT25jZUxpc3RlbmVyKCdlc3RhYmxpc2hlZCcsIChpbmZvKSA9PiB7XG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlY2VpdmVCdWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGNlc3NEYXRhID0gdGhpcy5yZWNlaXZlQnVmZmVyLmdldCh0aGlzLnJlY2VpdmVCdWZmZXIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaW5mby5zb2NrZXQuZW1pdCgnZGF0YScsIGV4Y2Vzc0RhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbmZvLnNvY2tldC5yZXN1bWUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gU29ja2V0IG9wdGlvbnMgKGRlZmF1bHRzIGhvc3QvcG9ydCB0byBvcHRpb25zLnByb3h5Lmhvc3Qvb3B0aW9ucy5wcm94eS5wb3J0KVxuICAgIGdldFNvY2tldE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucy5zb2NrZXRfb3B0aW9ucyksIHsgaG9zdDogdGhpcy5vcHRpb25zLnByb3h5Lmhvc3QgfHwgdGhpcy5vcHRpb25zLnByb3h5LmlwYWRkcmVzcywgcG9ydDogdGhpcy5vcHRpb25zLnByb3h5LnBvcnQgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaW50ZXJuYWwgU29ja3MgdGltZW91dCBjYWxsYmFjay5cbiAgICAgKiBOb3RlOiBJZiB0aGUgU29ja3MgY2xpZW50IGlzIG5vdCBCb3VuZFdhaXRpbmdGb3JDb25uZWN0aW9uIG9yIEVzdGFibGlzaGVkLCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZC5cbiAgICAgKi9cbiAgICBvbkVzdGFibGlzaGVkVGltZW91dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXN0YWJsaXNoZWQgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgIT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuQm91bmRXYWl0aW5nRm9yQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVNvY2tldChjb25zdGFudHNfMS5FUlJPUlMuUHJveHlDb25uZWN0aW9uVGltZWRPdXQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja2V0IGNvbm5lY3QgZXZlbnQuXG4gICAgICovXG4gICAgb25Db25uZWN0SGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkNvbm5lY3RlZCk7XG4gICAgICAgIC8vIFNlbmQgaW5pdGlhbCBoYW5kc2hha2UuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkudHlwZSA9PT0gNCkge1xuICAgICAgICAgICAgdGhpcy5zZW5kU29ja3M0SW5pdGlhbEhhbmRzaGFrZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZW5kU29ja3M1SW5pdGlhbEhhbmRzaGFrZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5TZW50SW5pdGlhbEhhbmRzaGFrZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja2V0IGRhdGEgZXZlbnQuXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBvbkRhdGFSZWNlaXZlZEhhbmRsZXIoZGF0YSkge1xuICAgICAgICAvKlxuICAgICAgICAgIEFsbCByZWNlaXZlZCBkYXRhIGlzIGFwcGVuZGVkIHRvIGEgUmVjZWl2ZUJ1ZmZlci5cbiAgICAgICAgICBUaGlzIG1ha2VzIHN1cmUgdGhhdCBhbGwgdGhlIGRhdGEgd2UgbmVlZCBpcyByZWNlaXZlZCBiZWZvcmUgd2UgYXR0ZW1wdCB0byBwcm9jZXNzIGl0LlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlY2VpdmVCdWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAvLyBQcm9jZXNzIGRhdGEgdGhhdCB3ZSBoYXZlLlxuICAgICAgICB0aGlzLnByb2Nlc3NEYXRhKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgcHJvY2Vzc2luZyBvZiB0aGUgZGF0YSB3ZSBoYXZlIHJlY2VpdmVkLlxuICAgICAqL1xuICAgIHByb2Nlc3NEYXRhKCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIHByb2Nlc3MgdGhlIG5leHQgc3RlcCBpbiB0aGUgU09DS1MgaGFuZHNoYWtlLCBwcm9jZWVkLlxuICAgICAgICB3aGlsZSAodGhpcy5zdGF0ZSAhPT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Fc3RhYmxpc2hlZCAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZSAhPT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5FcnJvciAmJlxuICAgICAgICAgICAgdGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aCA+PSB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUpIHtcbiAgICAgICAgICAgIC8vIFNlbnQgaW5pdGlhbCBoYW5kc2hha2UsIHdhaXRpbmcgZm9yIHJlc3BvbnNlLlxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEluaXRpYWxIYW5kc2hha2UpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5LnR5cGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU29ja3MgdjQgb25seSBoYXMgb25lIGhhbmRzaGFrZSByZXNwb25zZS5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTb2NrczRGaW5hbEhhbmRzaGFrZVJlc3BvbnNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBTb2NrcyB2NSBoYXMgdHdvIGhhbmRzaGFrZXMsIGhhbmRsZSBpbml0aWFsIG9uZSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluaXRpYWxTb2NrczVIYW5kc2hha2VSZXNwb25zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTZW50IGF1dGggcmVxdWVzdCBmb3IgU29ja3MgdjUsIHdhaXRpbmcgZm9yIHJlc3BvbnNlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5TZW50QXV0aGVudGljYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluaXRpYWxTb2NrczVBdXRoZW50aWNhdGlvbkhhbmRzaGFrZVJlc3BvbnNlKCk7XG4gICAgICAgICAgICAgICAgLy8gU2VudCBmaW5hbCBTb2NrcyB2NSBoYW5kc2hha2UsIHdhaXRpbmcgZm9yIGZpbmFsIHJlc3BvbnNlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5TZW50RmluYWxIYW5kc2hha2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNvY2tzNUZpbmFsSGFuZHNoYWtlUmVzcG9uc2UoKTtcbiAgICAgICAgICAgICAgICAvLyBTb2NrcyBCSU5EIGVzdGFibGlzaGVkLiBXYWl0aW5nIGZvciByZW1vdGUgY29ubmVjdGlvbiB2aWEgcHJveHkuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXRlID09PSBjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkJvdW5kV2FpdGluZ0ZvckNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5LnR5cGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTb2NrczRJbmNvbWluZ0Nvbm5lY3Rpb25SZXNwb25zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTb2NrczVJbmNvbWluZ0Nvbm5lY3Rpb25SZXNwb25zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoY29uc3RhbnRzXzEuRVJST1JTLkludGVybmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja2V0IGNsb3NlIGV2ZW50LlxuICAgICAqIEBwYXJhbSBoYWRfZXJyb3JcbiAgICAgKi9cbiAgICBvbkNsb3NlSGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5jbG9zZVNvY2tldChjb25zdGFudHNfMS5FUlJPUlMuU29ja2V0Q2xvc2VkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBTb2NrZXQgZXJyb3IgZXZlbnQuXG4gICAgICogQHBhcmFtIGVyclxuICAgICAqL1xuICAgIG9uRXJyb3JIYW5kbGVyKGVycikge1xuICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGVyci5tZXNzYWdlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBpbnRlcm5hbCBldmVudCBsaXN0ZW5lcnMgb24gdGhlIHVuZGVybHlpbmcgU29ja2V0LlxuICAgICAqL1xuICAgIHJlbW92ZUludGVybmFsU29ja2V0SGFuZGxlcnMoKSB7XG4gICAgICAgIC8vIFBhdXNlcyBkYXRhIGZsb3cgb2YgdGhlIHNvY2tldCAodGhpcyBpcyBpbnRlcm5hbGx5IHJlc3VtZWQgYWZ0ZXIgJ2VzdGFibGlzaGVkJyBpcyBlbWl0dGVkKVxuICAgICAgICB0aGlzLnNvY2tldC5wYXVzZSgpO1xuICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHRoaXMub25EYXRhUmVjZWl2ZWQpO1xuICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCB0aGlzLm9uQ2xvc2UpO1xuICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCB0aGlzLm9uRXJyb3IpO1xuICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIHRoaXMub25Db25uZWN0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIGFuZCBkZXN0cm95cyB0aGUgdW5kZXJseWluZyBTb2NrZXQuIEVtaXRzIGFuIGVycm9yIGV2ZW50LlxuICAgICAqIEBwYXJhbSBlcnIgeyBTdHJpbmcgfSBBbiBlcnJvciBzdHJpbmcgdG8gaW5jbHVkZSBpbiBlcnJvciBldmVudC5cbiAgICAgKi9cbiAgICBjbG9zZVNvY2tldChlcnIpIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIG9ubHkgb25lICdlcnJvcicgZXZlbnQgaXMgZmlyZWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGlzIFNvY2tzQ2xpZW50IGluc3RhbmNlLlxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5FcnJvcikge1xuICAgICAgICAgICAgLy8gU2V0IGludGVybmFsIHN0YXRlIHRvIEVycm9yLlxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkVycm9yKTtcbiAgICAgICAgICAgIC8vIERlc3Ryb3kgU29ja2V0XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICAvLyBSZW1vdmUgaW50ZXJuYWwgbGlzdGVuZXJzXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUludGVybmFsU29ja2V0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIC8vIEZpcmUgJ2Vycm9yJyBldmVudC5cbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoZXJyLCB0aGlzLm9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBpbml0aWFsIFNvY2tzIHY0IGhhbmRzaGFrZSByZXF1ZXN0LlxuICAgICAqL1xuICAgIHNlbmRTb2NrczRJbml0aWFsSGFuZHNoYWtlKCkge1xuICAgICAgICBjb25zdCB1c2VySWQgPSB0aGlzLm9wdGlvbnMucHJveHkudXNlcklkIHx8ICcnO1xuICAgICAgICBjb25zdCBidWZmID0gbmV3IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyKCk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OCgweDA0KTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KGNvbnN0YW50c18xLlNvY2tzQ29tbWFuZFt0aGlzLm9wdGlvbnMuY29tbWFuZF0pO1xuICAgICAgICBidWZmLndyaXRlVUludDE2QkUodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLnBvcnQpO1xuICAgICAgICAvLyBTb2NrcyA0IChJUHY0KVxuICAgICAgICBpZiAobmV0LmlzSVB2NCh0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24uaG9zdCkpIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVCdWZmZXIoKDAsIGhlbHBlcnNfMS5pcFRvQnVmZmVyKSh0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24uaG9zdCkpO1xuICAgICAgICAgICAgYnVmZi53cml0ZVN0cmluZ05UKHVzZXJJZCk7XG4gICAgICAgICAgICAvLyBTb2NrcyA0YSAoaG9zdG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoMHgwMCk7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoMHgwMCk7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoMHgwMCk7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoMHgwMSk7XG4gICAgICAgICAgICBidWZmLndyaXRlU3RyaW5nTlQodXNlcklkKTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVTdHJpbmdOVCh0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24uaG9zdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplID1cbiAgICAgICAgICAgIGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczRSZXNwb25zZTtcbiAgICAgICAgdGhpcy5zb2NrZXQud3JpdGUoYnVmZi50b0J1ZmZlcigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBTb2NrcyB2NCBoYW5kc2hha2UgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVTb2NrczRGaW5hbEhhbmRzaGFrZVJlc3BvbnNlKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5yZWNlaXZlQnVmZmVyLmdldCg4KTtcbiAgICAgICAgaWYgKGRhdGFbMV0gIT09IGNvbnN0YW50c18xLlNvY2tzNFJlc3BvbnNlLkdyYW50ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoYCR7Y29uc3RhbnRzXzEuRVJST1JTLlNvY2tzNFByb3h5UmVqZWN0ZWRDb25uZWN0aW9ufSAtICgke2NvbnN0YW50c18xLlNvY2tzNFJlc3BvbnNlW2RhdGFbMV1dfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEJpbmQgcmVzcG9uc2VcbiAgICAgICAgICAgIGlmIChjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmRbdGhpcy5vcHRpb25zLmNvbW1hbmRdID09PSBjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmQuYmluZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmYgPSBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlci5mcm9tQnVmZmVyKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJ1ZmYucmVhZE9mZnNldCA9IDI7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcG9ydDogYnVmZi5yZWFkVUludDE2QkUoKSxcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogKDAsIGhlbHBlcnNfMS5pbnQzMlRvSXB2NCkoYnVmZi5yZWFkVUludDMyQkUoKSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyBJZiBob3N0IGlzIDAuMC4wLjAsIHNldCB0byBwcm94eSBob3N0LlxuICAgICAgICAgICAgICAgIGlmIChyZW1vdGVIb3N0Lmhvc3QgPT09ICcwLjAuMC4wJykge1xuICAgICAgICAgICAgICAgICAgICByZW1vdGVIb3N0Lmhvc3QgPSB0aGlzLm9wdGlvbnMucHJveHkuaXBhZGRyZXNzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuQm91bmRXYWl0aW5nRm9yQ29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdib3VuZCcsIHsgcmVtb3RlSG9zdCwgc29ja2V0OiB0aGlzLnNvY2tldCB9KTtcbiAgICAgICAgICAgICAgICAvLyBDb25uZWN0IHJlc3BvbnNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXN0YWJsaXNoZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW50ZXJuYWxTb2NrZXRIYW5kbGVycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXN0YWJsaXNoZWQnLCB7IHNvY2tldDogdGhpcy5zb2NrZXQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBTb2NrcyB2NCBpbmNvbWluZyBjb25uZWN0aW9uIHJlcXVlc3QgKEJJTkQpXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVTb2NrczRJbmNvbWluZ0Nvbm5lY3Rpb25SZXNwb25zZSgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoOCk7XG4gICAgICAgIGlmIChkYXRhWzFdICE9PSBjb25zdGFudHNfMS5Tb2NrczRSZXNwb25zZS5HcmFudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGAke2NvbnN0YW50c18xLkVSUk9SUy5Tb2NrczRQcm94eVJlamVjdGVkSW5jb21pbmdCb3VuZENvbm5lY3Rpb259IC0gKCR7Y29uc3RhbnRzXzEuU29ja3M0UmVzcG9uc2VbZGF0YVsxXV19KWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIoZGF0YSk7XG4gICAgICAgICAgICBidWZmLnJlYWRPZmZzZXQgPSAyO1xuICAgICAgICAgICAgY29uc3QgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICBwb3J0OiBidWZmLnJlYWRVSW50MTZCRSgpLFxuICAgICAgICAgICAgICAgIGhvc3Q6ICgwLCBoZWxwZXJzXzEuaW50MzJUb0lwdjQpKGJ1ZmYucmVhZFVJbnQzMkJFKCkpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Fc3RhYmxpc2hlZCk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUludGVybmFsU29ja2V0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXN0YWJsaXNoZWQnLCB7IHJlbW90ZUhvc3QsIHNvY2tldDogdGhpcy5zb2NrZXQgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgaW5pdGlhbCBTb2NrcyB2NSBoYW5kc2hha2UgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBzZW5kU29ja3M1SW5pdGlhbEhhbmRzaGFrZSgpIHtcbiAgICAgICAgY29uc3QgYnVmZiA9IG5ldyBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlcigpO1xuICAgICAgICAvLyBCeSBkZWZhdWx0IHdlIGFsd2F5cyBzdXBwb3J0IG5vIGF1dGguXG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZEF1dGhNZXRob2RzID0gW2NvbnN0YW50c18xLlNvY2tzNUF1dGguTm9BdXRoXTtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIG9ubHkgdGVsbCB0aGUgcHJveHkgd2Ugc3VwcG9ydCB1c2VyL3Bhc3MgYXV0aCBpZiBhdXRoIGluZm8gaXMgYWN0dWFsbHkgcHJvdmlkZWQuXG4gICAgICAgIC8vIE5vdGU6IEFzIG9mIFRvciB2MC4zLjUuNyssIGlmIHVzZXIvcGFzcyBhdXRoIGlzIGFuIG9wdGlvbiBmcm9tIHRoZSBjbGllbnQsIGJ5IGRlZmF1bHQgaXQgd2lsbCBhbHdheXMgdGFrZSBwcmlvcml0eS5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wcm94eS51c2VySWQgfHwgdGhpcy5vcHRpb25zLnByb3h5LnBhc3N3b3JkKSB7XG4gICAgICAgICAgICBzdXBwb3J0ZWRBdXRoTWV0aG9kcy5wdXNoKGNvbnN0YW50c18xLlNvY2tzNUF1dGguVXNlclBhc3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEN1c3RvbSBhdXRoIG1ldGhvZD9cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wcm94eS5jdXN0b21fYXV0aF9tZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3VwcG9ydGVkQXV0aE1ldGhvZHMucHVzaCh0aGlzLm9wdGlvbnMucHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCdWlsZCBoYW5kc2hha2UgcGFja2V0XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OCgweDA1KTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KHN1cHBvcnRlZEF1dGhNZXRob2RzLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgYXV0aE1ldGhvZCBvZiBzdXBwb3J0ZWRBdXRoTWV0aG9kcykge1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KGF1dGhNZXRob2QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9XG4gICAgICAgICAgICBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1SW5pdGlhbEhhbmRzaGFrZVJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNvY2tldC53cml0ZShidWZmLnRvQnVmZmVyKCkpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEluaXRpYWxIYW5kc2hha2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGluaXRpYWwgU29ja3MgdjUgaGFuZHNoYWtlIHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgaGFuZGxlSW5pdGlhbFNvY2tzNUhhbmRzaGFrZVJlc3BvbnNlKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5yZWNlaXZlQnVmZmVyLmdldCgyKTtcbiAgICAgICAgaWYgKGRhdGFbMF0gIT09IDB4MDUpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2NrczVJbnRpYWlsSGFuZHNoYWtlU29ja3NWZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkYXRhWzFdID09PSBjb25zdGFudHNfMS5TT0NLUzVfTk9fQUNDRVBUQUJMRV9BVVRIKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3M1SW5pdGlhbEhhbmRzaGFrZU5vQWNjZXB0ZWRBdXRoVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBzZWxlY3RlZCBTb2NrcyB2NSBhdXRoIG1ldGhvZCBpcyBubyBhdXRoLCBzZW5kIGZpbmFsIGhhbmRzaGFrZSByZXF1ZXN0LlxuICAgICAgICAgICAgaWYgKGRhdGFbMV0gPT09IGNvbnN0YW50c18xLlNvY2tzNUF1dGguTm9BdXRoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrczVDaG9zZW5BdXRoVHlwZSA9IGNvbnN0YW50c18xLlNvY2tzNUF1dGguTm9BdXRoO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZFNvY2tzNUNvbW1hbmRSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgLy8gSWYgc2VsZWN0ZWQgU29ja3MgdjUgYXV0aCBtZXRob2QgaXMgdXNlci9wYXNzd29yZCwgc2VuZCBhdXRoIGhhbmRzaGFrZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRhdGFbMV0gPT09IGNvbnN0YW50c18xLlNvY2tzNUF1dGguVXNlclBhc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tzNUNob3NlbkF1dGhUeXBlID0gY29uc3RhbnRzXzEuU29ja3M1QXV0aC5Vc2VyUGFzcztcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRTb2NrczVVc2VyUGFzc0F1dGhlbnRpY2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgLy8gSWYgc2VsZWN0ZWQgU29ja3MgdjUgYXV0aCBtZXRob2QgaXMgdGhlIGN1c3RvbV9hdXRoX21ldGhvZCwgc2VuZCBjdXN0b20gaGFuZHNoYWtlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZGF0YVsxXSA9PT0gdGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX21ldGhvZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja3M1Q2hvc2VuQXV0aFR5cGUgPSB0aGlzLm9wdGlvbnMucHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZFNvY2tzNUN1c3RvbUF1dGhlbnRpY2F0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3M1SW5pdGlhbEhhbmRzaGFrZVVua25vd25BdXRoVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgU29ja3MgdjUgdXNlciAmIHBhc3N3b3JkIGF1dGggaGFuZHNoYWtlLlxuICAgICAqXG4gICAgICogTm90ZTogTm8gYXV0aCBhbmQgdXNlci9wYXNzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICAgICAqL1xuICAgIHNlbmRTb2NrczVVc2VyUGFzc0F1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICBjb25zdCB1c2VySWQgPSB0aGlzLm9wdGlvbnMucHJveHkudXNlcklkIHx8ICcnO1xuICAgICAgICBjb25zdCBwYXNzd29yZCA9IHRoaXMub3B0aW9ucy5wcm94eS5wYXNzd29yZCB8fCAnJztcbiAgICAgICAgY29uc3QgYnVmZiA9IG5ldyBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlcigpO1xuICAgICAgICBidWZmLndyaXRlVUludDgoMHgwMSk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OChCdWZmZXIuYnl0ZUxlbmd0aCh1c2VySWQpKTtcbiAgICAgICAgYnVmZi53cml0ZVN0cmluZyh1c2VySWQpO1xuICAgICAgICBidWZmLndyaXRlVUludDgoQnVmZmVyLmJ5dGVMZW5ndGgocGFzc3dvcmQpKTtcbiAgICAgICAgYnVmZi53cml0ZVN0cmluZyhwYXNzd29yZCk7XG4gICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9XG4gICAgICAgICAgICBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1VXNlclBhc3NBdXRoZW50aWNhdGlvblJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNvY2tldC53cml0ZShidWZmLnRvQnVmZmVyKCkpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEF1dGhlbnRpY2F0aW9uKTtcbiAgICB9XG4gICAgc2VuZFNvY2tzNUN1c3RvbUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplID1cbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucHJveHkuY3VzdG9tX2F1dGhfcmVzcG9uc2Vfc2l6ZTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LndyaXRlKHlpZWxkIHRoaXMub3B0aW9ucy5wcm94eS5jdXN0b21fYXV0aF9yZXF1ZXN0X2hhbmRsZXIoKSk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEF1dGhlbnRpY2F0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhbmRsZVNvY2tzNUN1c3RvbUF1dGhIYW5kc2hha2VSZXNwb25zZShkYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4geWllbGQgdGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX3Jlc3BvbnNlX2hhbmRsZXIoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoYW5kbGVTb2NrczVBdXRoZW50aWNhdGlvbk5vQXV0aEhhbmRzaGFrZVJlc3BvbnNlKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhWzFdID09PSAweDAwO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGFuZGxlU29ja3M1QXV0aGVudGljYXRpb25Vc2VyUGFzc0hhbmRzaGFrZVJlc3BvbnNlKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhWzFdID09PSAweDAwO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBTb2NrcyB2NSBhdXRoIGhhbmRzaGFrZSByZXNwb25zZS5cbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqL1xuICAgIGhhbmRsZUluaXRpYWxTb2NrczVBdXRoZW50aWNhdGlvbkhhbmRzaGFrZVJlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLlJlY2VpdmVkQXV0aGVudGljYXRpb25SZXNwb25zZSk7XG4gICAgICAgICAgICBsZXQgYXV0aFJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ja3M1Q2hvc2VuQXV0aFR5cGUgPT09IGNvbnN0YW50c18xLlNvY2tzNUF1dGguTm9BdXRoKSB7XG4gICAgICAgICAgICAgICAgYXV0aFJlc3VsdCA9IHlpZWxkIHRoaXMuaGFuZGxlU29ja3M1QXV0aGVudGljYXRpb25Ob0F1dGhIYW5kc2hha2VSZXNwb25zZSh0aGlzLnJlY2VpdmVCdWZmZXIuZ2V0KDIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc29ja3M1Q2hvc2VuQXV0aFR5cGUgPT09IGNvbnN0YW50c18xLlNvY2tzNUF1dGguVXNlclBhc3MpIHtcbiAgICAgICAgICAgICAgICBhdXRoUmVzdWx0ID1cbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdGhpcy5oYW5kbGVTb2NrczVBdXRoZW50aWNhdGlvblVzZXJQYXNzSGFuZHNoYWtlUmVzcG9uc2UodGhpcy5yZWNlaXZlQnVmZmVyLmdldCgyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNvY2tzNUNob3NlbkF1dGhUeXBlID09PSB0aGlzLm9wdGlvbnMucHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgYXV0aFJlc3VsdCA9IHlpZWxkIHRoaXMuaGFuZGxlU29ja3M1Q3VzdG9tQXV0aEhhbmRzaGFrZVJlc3BvbnNlKHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQodGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX3Jlc3BvbnNlX3NpemUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYXV0aFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoY29uc3RhbnRzXzEuRVJST1JTLlNvY2tzNUF1dGhlbnRpY2F0aW9uRmFpbGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZFNvY2tzNUNvbW1hbmRSZXF1ZXN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBTb2NrcyB2NSBmaW5hbCBoYW5kc2hha2UgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBzZW5kU29ja3M1Q29tbWFuZFJlcXVlc3QoKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmYgPSBuZXcgc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIoKTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KDB4MDUpO1xuICAgICAgICBidWZmLndyaXRlVUludDgoY29uc3RhbnRzXzEuU29ja3NDb21tYW5kW3RoaXMub3B0aW9ucy5jb21tYW5kXSk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OCgweDAwKTtcbiAgICAgICAgLy8gaXB2NCwgaXB2NiwgZG9tYWluP1xuICAgICAgICBpZiAobmV0LmlzSVB2NCh0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24uaG9zdCkpIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY0KTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVCdWZmZXIoKDAsIGhlbHBlcnNfMS5pcFRvQnVmZmVyKSh0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24uaG9zdCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5ldC5pc0lQdjYodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpKSB7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2Nik7XG4gICAgICAgICAgICBidWZmLndyaXRlQnVmZmVyKCgwLCBoZWxwZXJzXzEuaXBUb0J1ZmZlcikodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5Ib3N0bmFtZSk7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QubGVuZ3RoKTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVTdHJpbmcodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50MTZCRSh0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24ucG9ydCk7XG4gICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9XG4gICAgICAgICAgICBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1UmVzcG9uc2VIZWFkZXI7XG4gICAgICAgIHRoaXMuc29ja2V0LndyaXRlKGJ1ZmYudG9CdWZmZXIoKSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5TZW50RmluYWxIYW5kc2hha2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIFNvY2tzIHY1IGZpbmFsIGhhbmRzaGFrZSByZXNwb25zZS5cbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqL1xuICAgIGhhbmRsZVNvY2tzNUZpbmFsSGFuZHNoYWtlUmVzcG9uc2UoKSB7XG4gICAgICAgIC8vIFBlZWsgYXQgYXZhaWxhYmxlIGRhdGEgKHdlIG5lZWQgYXQgbGVhc3QgNSBieXRlcyB0byBnZXQgdGhlIGhvc3RuYW1lIGxlbmd0aClcbiAgICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5yZWNlaXZlQnVmZmVyLnBlZWsoNSk7XG4gICAgICAgIGlmIChoZWFkZXJbMF0gIT09IDB4MDUgfHwgaGVhZGVyWzFdICE9PSBjb25zdGFudHNfMS5Tb2NrczVSZXNwb25zZS5HcmFudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGAke2NvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3M1RmluYWxIYW5kc2hha2VSZWplY3RlZH0gLSAke2NvbnN0YW50c18xLlNvY2tzNVJlc3BvbnNlW2hlYWRlclsxXV19YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBSZWFkIGFkZHJlc3MgdHlwZVxuICAgICAgICAgICAgY29uc3QgYWRkcmVzc1R5cGUgPSBoZWFkZXJbM107XG4gICAgICAgICAgICBsZXQgcmVtb3RlSG9zdDtcbiAgICAgICAgICAgIGxldCBidWZmO1xuICAgICAgICAgICAgLy8gSVB2NFxuICAgICAgICAgICAgaWYgKGFkZHJlc3NUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YU5lZWRlZCA9IGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczVSZXNwb25zZUlQdjQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjZWl2ZUJ1ZmZlci5sZW5ndGggPCBkYXRhTmVlZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9IGRhdGFOZWVkZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIodGhpcy5yZWNlaXZlQnVmZmVyLmdldChkYXRhTmVlZGVkKS5zbGljZSg0KSk7XG4gICAgICAgICAgICAgICAgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogKDAsIGhlbHBlcnNfMS5pbnQzMlRvSXB2NCkoYnVmZi5yZWFkVUludDMyQkUoKSksXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJ1ZmYucmVhZFVJbnQxNkJFKCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyBJZiBnaXZlbiBob3N0IGlzIDAuMC4wLjAsIGFzc3VtZSByZW1vdGUgcHJveHkgaXAgaW5zdGVhZC5cbiAgICAgICAgICAgICAgICBpZiAocmVtb3RlSG9zdC5ob3N0ID09PSAnMC4wLjAuMCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlSG9zdC5ob3N0ID0gdGhpcy5vcHRpb25zLnByb3h5LmlwYWRkcmVzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSG9zdG5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJlc3NUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5Ib3N0bmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RMZW5ndGggPSBoZWFkZXJbNF07XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YU5lZWRlZCA9IGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczVSZXNwb25zZUhvc3RuYW1lKGhvc3RMZW5ndGgpOyAvLyBoZWFkZXIgKyBob3N0IGxlbmd0aCArIGhvc3QgKyBwb3J0XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjZWl2ZUJ1ZmZlci5sZW5ndGggPCBkYXRhTmVlZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9IGRhdGFOZWVkZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIodGhpcy5yZWNlaXZlQnVmZmVyLmdldChkYXRhTmVlZGVkKS5zbGljZSg1KSk7XG4gICAgICAgICAgICAgICAgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogYnVmZi5yZWFkU3RyaW5nKGhvc3RMZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBidWZmLnJlYWRVSW50MTZCRSgpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gSVB2NlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWRkcmVzc1R5cGUgPT09IGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLklQdjYpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhTmVlZGVkID0gY29uc3RhbnRzXzEuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTLlNvY2tzNVJlc3BvbnNlSVB2NjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aCA8IGRhdGFOZWVkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplID0gZGF0YU5lZWRlZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmID0gc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIuZnJvbUJ1ZmZlcih0aGlzLnJlY2VpdmVCdWZmZXIuZ2V0KGRhdGFOZWVkZWQpLnNsaWNlKDQpKTtcbiAgICAgICAgICAgICAgICByZW1vdGVIb3N0ID0ge1xuICAgICAgICAgICAgICAgICAgICBob3N0OiBpcF9hZGRyZXNzXzEuQWRkcmVzczYuZnJvbUJ5dGVBcnJheShBcnJheS5mcm9tKGJ1ZmYucmVhZEJ1ZmZlcigxNikpKS5jYW5vbmljYWxGb3JtKCksXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJ1ZmYucmVhZFVJbnQxNkJFKCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGhhdmUgZXZlcnl0aGluZyB3ZSBuZWVkXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuUmVjZWl2ZWRGaW5hbFJlc3BvbnNlKTtcbiAgICAgICAgICAgIC8vIElmIHVzaW5nIENPTk5FQ1QsIHRoZSBjbGllbnQgaXMgbm93IGluIHRoZSBlc3RhYmxpc2hlZCBzdGF0ZS5cbiAgICAgICAgICAgIGlmIChjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmRbdGhpcy5vcHRpb25zLmNvbW1hbmRdID09PSBjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmQuY29ubmVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Fc3RhYmxpc2hlZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJbnRlcm5hbFNvY2tldEhhbmRsZXJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlc3RhYmxpc2hlZCcsIHsgcmVtb3RlSG9zdCwgc29ja2V0OiB0aGlzLnNvY2tldCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbnN0YW50c18xLlNvY2tzQ29tbWFuZFt0aGlzLm9wdGlvbnMuY29tbWFuZF0gPT09IGNvbnN0YW50c18xLlNvY2tzQ29tbWFuZC5iaW5kKSB7XG4gICAgICAgICAgICAgICAgLyogSWYgdXNpbmcgQklORCwgdGhlIFNvY2tzIGNsaWVudCBpcyBub3cgaW4gQm91bmRXYWl0aW5nRm9yQ29ubmVjdGlvbiBzdGF0ZS5cbiAgICAgICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlIHJlbW90ZSBwcm94eSBzZXJ2ZXIgaXMgd2FpdGluZyBmb3IgYSByZW1vdGUgY29ubmVjdGlvbiB0byB0aGUgYm91bmQgcG9ydC4gKi9cbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuQm91bmRXYWl0aW5nRm9yQ29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplID1cbiAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzXzEuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTLlNvY2tzNVJlc3BvbnNlSGVhZGVyO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYm91bmQnLCB7IHJlbW90ZUhvc3QsIHNvY2tldDogdGhpcy5zb2NrZXQgfSk7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgIElmIHVzaW5nIEFzc29jaWF0ZSwgdGhlIFNvY2tzIGNsaWVudCBpcyBub3cgRXN0YWJsaXNoZWQuIEFuZCB0aGUgcHJveHkgc2VydmVyIGlzIG5vdyBhY2NlcHRpbmcgVURQIHBhY2tldHMgYXQgdGhlXG4gICAgICAgICAgICAgICAgICBnaXZlbiBib3VuZCBwb3J0LiBUaGlzIGluaXRpYWwgU29ja3MgVENQIGNvbm5lY3Rpb24gbXVzdCByZW1haW4gb3BlbiBmb3IgdGhlIFVEUCByZWxheSB0byBjb250aW51ZSB0byB3b3JrLlxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmRbdGhpcy5vcHRpb25zLmNvbW1hbmRdID09PSBjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmQuYXNzb2NpYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkVzdGFibGlzaGVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUludGVybmFsU29ja2V0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2VzdGFibGlzaGVkJywge1xuICAgICAgICAgICAgICAgICAgICByZW1vdGVIb3N0LFxuICAgICAgICAgICAgICAgICAgICBzb2NrZXQ6IHRoaXMuc29ja2V0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja3MgdjUgaW5jb21pbmcgY29ubmVjdGlvbiByZXF1ZXN0IChCSU5EKS5cbiAgICAgKi9cbiAgICBoYW5kbGVTb2NrczVJbmNvbWluZ0Nvbm5lY3Rpb25SZXNwb25zZSgpIHtcbiAgICAgICAgLy8gUGVlayBhdCBhdmFpbGFibGUgZGF0YSAod2UgbmVlZCBhdCBsZWFzdCA1IGJ5dGVzIHRvIGdldCB0aGUgaG9zdG5hbWUgbGVuZ3RoKVxuICAgICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLnJlY2VpdmVCdWZmZXIucGVlayg1KTtcbiAgICAgICAgaWYgKGhlYWRlclswXSAhPT0gMHgwNSB8fCBoZWFkZXJbMV0gIT09IGNvbnN0YW50c18xLlNvY2tzNVJlc3BvbnNlLkdyYW50ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoYCR7Y29uc3RhbnRzXzEuRVJST1JTLlNvY2tzNVByb3h5UmVqZWN0ZWRJbmNvbWluZ0JvdW5kQ29ubmVjdGlvbn0gLSAke2NvbnN0YW50c18xLlNvY2tzNVJlc3BvbnNlW2hlYWRlclsxXV19YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBSZWFkIGFkZHJlc3MgdHlwZVxuICAgICAgICAgICAgY29uc3QgYWRkcmVzc1R5cGUgPSBoZWFkZXJbM107XG4gICAgICAgICAgICBsZXQgcmVtb3RlSG9zdDtcbiAgICAgICAgICAgIGxldCBidWZmO1xuICAgICAgICAgICAgLy8gSVB2NFxuICAgICAgICAgICAgaWYgKGFkZHJlc3NUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YU5lZWRlZCA9IGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczVSZXNwb25zZUlQdjQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjZWl2ZUJ1ZmZlci5sZW5ndGggPCBkYXRhTmVlZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9IGRhdGFOZWVkZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIodGhpcy5yZWNlaXZlQnVmZmVyLmdldChkYXRhTmVlZGVkKS5zbGljZSg0KSk7XG4gICAgICAgICAgICAgICAgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogKDAsIGhlbHBlcnNfMS5pbnQzMlRvSXB2NCkoYnVmZi5yZWFkVUludDMyQkUoKSksXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJ1ZmYucmVhZFVJbnQxNkJFKCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyBJZiBnaXZlbiBob3N0IGlzIDAuMC4wLjAsIGFzc3VtZSByZW1vdGUgcHJveHkgaXAgaW5zdGVhZC5cbiAgICAgICAgICAgICAgICBpZiAocmVtb3RlSG9zdC5ob3N0ID09PSAnMC4wLjAuMCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlSG9zdC5ob3N0ID0gdGhpcy5vcHRpb25zLnByb3h5LmlwYWRkcmVzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSG9zdG5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJlc3NUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5Ib3N0bmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RMZW5ndGggPSBoZWFkZXJbNF07XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YU5lZWRlZCA9IGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczVSZXNwb25zZUhvc3RuYW1lKGhvc3RMZW5ndGgpOyAvLyBoZWFkZXIgKyBob3N0IGxlbmd0aCArIHBvcnRcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aCA8IGRhdGFOZWVkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplID0gZGF0YU5lZWRlZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmID0gc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIuZnJvbUJ1ZmZlcih0aGlzLnJlY2VpdmVCdWZmZXIuZ2V0KGRhdGFOZWVkZWQpLnNsaWNlKDUpKTtcbiAgICAgICAgICAgICAgICByZW1vdGVIb3N0ID0ge1xuICAgICAgICAgICAgICAgICAgICBob3N0OiBidWZmLnJlYWRTdHJpbmcoaG9zdExlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJ1ZmYucmVhZFVJbnQxNkJFKCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyBJUHY2XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzVHlwZSA9PT0gY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2Nikge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFOZWVkZWQgPSBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1UmVzcG9uc2VJUHY2O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlY2VpdmVCdWZmZXIubGVuZ3RoIDwgZGF0YU5lZWRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPSBkYXRhTmVlZGVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmYgPSBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlci5mcm9tQnVmZmVyKHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoZGF0YU5lZWRlZCkuc2xpY2UoNCkpO1xuICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6IGlwX2FkZHJlc3NfMS5BZGRyZXNzNi5mcm9tQnl0ZUFycmF5KEFycmF5LmZyb20oYnVmZi5yZWFkQnVmZmVyKDE2KSkpLmNhbm9uaWNhbEZvcm0oKSxcbiAgICAgICAgICAgICAgICAgICAgcG9ydDogYnVmZi5yZWFkVUludDE2QkUoKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkVzdGFibGlzaGVkKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSW50ZXJuYWxTb2NrZXRIYW5kbGVycygpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlc3RhYmxpc2hlZCcsIHsgcmVtb3RlSG9zdCwgc29ja2V0OiB0aGlzLnNvY2tldCB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc29ja3NDbGllbnRPcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG59XG5leHBvcnRzLlNvY2tzQ2xpZW50ID0gU29ja3NDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zb2Nrc2NsaWVudC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU09DS1M1X05PX0FDQ0VQVEFCTEVfQVVUSCA9IGV4cG9ydHMuU09DS1M1X0NVU1RPTV9BVVRIX0VORCA9IGV4cG9ydHMuU09DS1M1X0NVU1RPTV9BVVRIX1NUQVJUID0gZXhwb3J0cy5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMgPSBleHBvcnRzLlNvY2tzQ2xpZW50U3RhdGUgPSBleHBvcnRzLlNvY2tzNVJlc3BvbnNlID0gZXhwb3J0cy5Tb2NrczVIb3N0VHlwZSA9IGV4cG9ydHMuU29ja3M1QXV0aCA9IGV4cG9ydHMuU29ja3M0UmVzcG9uc2UgPSBleHBvcnRzLlNvY2tzQ29tbWFuZCA9IGV4cG9ydHMuRVJST1JTID0gZXhwb3J0cy5ERUZBVUxUX1RJTUVPVVQgPSB2b2lkIDA7XG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSAzMDAwMDtcbmV4cG9ydHMuREVGQVVMVF9USU1FT1VUID0gREVGQVVMVF9USU1FT1VUO1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBFUlJPUlMgPSB7XG4gICAgSW52YWxpZFNvY2tzQ29tbWFuZDogJ0FuIGludmFsaWQgU09DS1MgY29tbWFuZCB3YXMgcHJvdmlkZWQuIFZhbGlkIG9wdGlvbnMgYXJlIGNvbm5lY3QsIGJpbmQsIGFuZCBhc3NvY2lhdGUuJyxcbiAgICBJbnZhbGlkU29ja3NDb21tYW5kRm9yT3BlcmF0aW9uOiAnQW4gaW52YWxpZCBTT0NLUyBjb21tYW5kIHdhcyBwcm92aWRlZC4gT25seSBhIHN1YnNldCBvZiBjb21tYW5kcyBhcmUgc3VwcG9ydGVkIGZvciB0aGlzIG9wZXJhdGlvbi4nLFxuICAgIEludmFsaWRTb2Nrc0NvbW1hbmRDaGFpbjogJ0FuIGludmFsaWQgU09DS1MgY29tbWFuZCB3YXMgcHJvdmlkZWQuIENoYWluaW5nIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHRoZSBjb25uZWN0IGNvbW1hbmQuJyxcbiAgICBJbnZhbGlkU29ja3NDbGllbnRPcHRpb25zRGVzdGluYXRpb246ICdBbiBpbnZhbGlkIGRlc3RpbmF0aW9uIGhvc3Qgd2FzIHByb3ZpZGVkLicsXG4gICAgSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0V4aXN0aW5nU29ja2V0OiAnQW4gaW52YWxpZCBleGlzdGluZyBzb2NrZXQgd2FzIHByb3ZpZGVkLiBUaGlzIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBzdHJlYW0uRHVwbGV4LicsXG4gICAgSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc1Byb3h5OiAnSW52YWxpZCBTT0NLUyBwcm94eSBkZXRhaWxzIHdlcmUgcHJvdmlkZWQuJyxcbiAgICBJbnZhbGlkU29ja3NDbGllbnRPcHRpb25zVGltZW91dDogJ0FuIGludmFsaWQgdGltZW91dCB2YWx1ZSB3YXMgcHJvdmlkZWQuIFBsZWFzZSBlbnRlciBhIHZhbHVlIGFib3ZlIDAgKGluIG1zKS4nLFxuICAgIEludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNQcm94aWVzTGVuZ3RoOiAnQXQgbGVhc3QgdHdvIHNvY2tzIHByb3hpZXMgbXVzdCBiZSBwcm92aWRlZCBmb3IgY2hhaW5pbmcuJyxcbiAgICBJbnZhbGlkU29ja3NDbGllbnRPcHRpb25zQ3VzdG9tQXV0aFJhbmdlOiAnQ3VzdG9tIGF1dGggbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHg4MCBhbmQgMHhGRS4nLFxuICAgIEludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNDdXN0b21BdXRoT3B0aW9uczogJ1doZW4gYSBjdXN0b21fYXV0aF9tZXRob2QgaXMgcHJvdmlkZWQsIGN1c3RvbV9hdXRoX3JlcXVlc3RfaGFuZGxlciwgY3VzdG9tX2F1dGhfcmVzcG9uc2Vfc2l6ZSwgYW5kIGN1c3RvbV9hdXRoX3Jlc3BvbnNlX2hhbmRsZXIgbXVzdCBhbHNvIGJlIHByb3ZpZGVkIGFuZCB2YWxpZC4nLFxuICAgIE5lZ290aWF0aW9uRXJyb3I6ICdOZWdvdGlhdGlvbiBlcnJvcicsXG4gICAgU29ja2V0Q2xvc2VkOiAnU29ja2V0IGNsb3NlZCcsXG4gICAgUHJveHlDb25uZWN0aW9uVGltZWRPdXQ6ICdQcm94eSBjb25uZWN0aW9uIHRpbWVkIG91dCcsXG4gICAgSW50ZXJuYWxFcnJvcjogJ1NvY2tzQ2xpZW50IGludGVybmFsIGVycm9yICh0aGlzIHNob3VsZCBub3QgaGFwcGVuKScsXG4gICAgSW52YWxpZFNvY2tzNEhhbmRzaGFrZVJlc3BvbnNlOiAnUmVjZWl2ZWQgaW52YWxpZCBTb2NrczQgaGFuZHNoYWtlIHJlc3BvbnNlJyxcbiAgICBTb2NrczRQcm94eVJlamVjdGVkQ29ubmVjdGlvbjogJ1NvY2tzNCBQcm94eSByZWplY3RlZCBjb25uZWN0aW9uJyxcbiAgICBJbnZhbGlkU29ja3M0SW5jb21pbmdDb25uZWN0aW9uUmVzcG9uc2U6ICdTb2NrczQgaW52YWxpZCBpbmNvbWluZyBjb25uZWN0aW9uIHJlc3BvbnNlJyxcbiAgICBTb2NrczRQcm94eVJlamVjdGVkSW5jb21pbmdCb3VuZENvbm5lY3Rpb246ICdTb2NrczQgUHJveHkgcmVqZWN0ZWQgaW5jb21pbmcgYm91bmQgY29ubmVjdGlvbicsXG4gICAgSW52YWxpZFNvY2tzNUluaXRpYWxIYW5kc2hha2VSZXNwb25zZTogJ1JlY2VpdmVkIGludmFsaWQgU29ja3M1IGluaXRpYWwgaGFuZHNoYWtlIHJlc3BvbnNlJyxcbiAgICBJbnZhbGlkU29ja3M1SW50aWFpbEhhbmRzaGFrZVNvY2tzVmVyc2lvbjogJ1JlY2VpdmVkIGludmFsaWQgU29ja3M1IGluaXRpYWwgaGFuZHNoYWtlIChpbnZhbGlkIHNvY2tzIHZlcnNpb24pJyxcbiAgICBJbnZhbGlkU29ja3M1SW5pdGlhbEhhbmRzaGFrZU5vQWNjZXB0ZWRBdXRoVHlwZTogJ1JlY2VpdmVkIGludmFsaWQgU29ja3M1IGluaXRpYWwgaGFuZHNoYWtlIChubyBhY2NlcHRlZCBhdXRoZW50aWNhdGlvbiB0eXBlKScsXG4gICAgSW52YWxpZFNvY2tzNUluaXRpYWxIYW5kc2hha2VVbmtub3duQXV0aFR5cGU6ICdSZWNlaXZlZCBpbnZhbGlkIFNvY2tzNSBpbml0aWFsIGhhbmRzaGFrZSAodW5rbm93biBhdXRoZW50aWNhdGlvbiB0eXBlKScsXG4gICAgU29ja3M1QXV0aGVudGljYXRpb25GYWlsZWQ6ICdTb2NrczUgQXV0aGVudGljYXRpb24gZmFpbGVkJyxcbiAgICBJbnZhbGlkU29ja3M1RmluYWxIYW5kc2hha2U6ICdSZWNlaXZlZCBpbnZhbGlkIFNvY2tzNSBmaW5hbCBoYW5kc2hha2UgcmVzcG9uc2UnLFxuICAgIEludmFsaWRTb2NrczVGaW5hbEhhbmRzaGFrZVJlamVjdGVkOiAnU29ja3M1IHByb3h5IHJlamVjdGVkIGNvbm5lY3Rpb24nLFxuICAgIEludmFsaWRTb2NrczVJbmNvbWluZ0Nvbm5lY3Rpb25SZXNwb25zZTogJ1JlY2VpdmVkIGludmFsaWQgU29ja3M1IGluY29taW5nIGNvbm5lY3Rpb24gcmVzcG9uc2UnLFxuICAgIFNvY2tzNVByb3h5UmVqZWN0ZWRJbmNvbWluZ0JvdW5kQ29ubmVjdGlvbjogJ1NvY2tzNSBQcm94eSByZWplY3RlZCBpbmNvbWluZyBib3VuZCBjb25uZWN0aW9uJyxcbn07XG5leHBvcnRzLkVSUk9SUyA9IEVSUk9SUztcbmNvbnN0IFNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUyA9IHtcbiAgICBTb2NrczVJbml0aWFsSGFuZHNoYWtlUmVzcG9uc2U6IDIsXG4gICAgU29ja3M1VXNlclBhc3NBdXRoZW50aWNhdGlvblJlc3BvbnNlOiAyLFxuICAgIC8vIENvbW1hbmQgcmVzcG9uc2UgKyBpbmNvbWluZyBjb25uZWN0aW9uIChiaW5kKVxuICAgIFNvY2tzNVJlc3BvbnNlSGVhZGVyOiA1LCAvLyBXZSBuZWVkIGF0IGxlYXN0IDUgdG8gcmVhZCB0aGUgaG9zdG5hbWUgbGVuZ3RoLCB0aGVuIHdlIHdhaXQgZm9yIHRoZSBhZGRyZXNzK3BvcnQgaW5mb3JtYXRpb24uXG4gICAgU29ja3M1UmVzcG9uc2VJUHY0OiAxMCwgLy8gNCBoZWFkZXIgKyA0IGlwICsgMiBwb3J0XG4gICAgU29ja3M1UmVzcG9uc2VJUHY2OiAyMiwgLy8gNCBoZWFkZXIgKyAxNiBpcCArIDIgcG9ydFxuICAgIFNvY2tzNVJlc3BvbnNlSG9zdG5hbWU6IChob3N0TmFtZUxlbmd0aCkgPT4gaG9zdE5hbWVMZW5ndGggKyA3LCAvLyA0IGhlYWRlciArIDEgaG9zdCBsZW5ndGggKyBob3N0ICsgMiBwb3J0XG4gICAgLy8gQ29tbWFuZCByZXNwb25zZSArIGluY29taW5nIGNvbm5lY3Rpb24gKGJpbmQpXG4gICAgU29ja3M0UmVzcG9uc2U6IDgsIC8vIDIgaGVhZGVyICsgMiBwb3J0ICsgNCBpcFxufTtcbmV4cG9ydHMuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTID0gU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTO1xudmFyIFNvY2tzQ29tbWFuZDtcbihmdW5jdGlvbiAoU29ja3NDb21tYW5kKSB7XG4gICAgU29ja3NDb21tYW5kW1NvY2tzQ29tbWFuZFtcImNvbm5lY3RcIl0gPSAxXSA9IFwiY29ubmVjdFwiO1xuICAgIFNvY2tzQ29tbWFuZFtTb2Nrc0NvbW1hbmRbXCJiaW5kXCJdID0gMl0gPSBcImJpbmRcIjtcbiAgICBTb2Nrc0NvbW1hbmRbU29ja3NDb21tYW5kW1wiYXNzb2NpYXRlXCJdID0gM10gPSBcImFzc29jaWF0ZVwiO1xufSkoU29ja3NDb21tYW5kIHx8IChleHBvcnRzLlNvY2tzQ29tbWFuZCA9IFNvY2tzQ29tbWFuZCA9IHt9KSk7XG52YXIgU29ja3M0UmVzcG9uc2U7XG4oZnVuY3Rpb24gKFNvY2tzNFJlc3BvbnNlKSB7XG4gICAgU29ja3M0UmVzcG9uc2VbU29ja3M0UmVzcG9uc2VbXCJHcmFudGVkXCJdID0gOTBdID0gXCJHcmFudGVkXCI7XG4gICAgU29ja3M0UmVzcG9uc2VbU29ja3M0UmVzcG9uc2VbXCJGYWlsZWRcIl0gPSA5MV0gPSBcIkZhaWxlZFwiO1xuICAgIFNvY2tzNFJlc3BvbnNlW1NvY2tzNFJlc3BvbnNlW1wiUmVqZWN0ZWRcIl0gPSA5Ml0gPSBcIlJlamVjdGVkXCI7XG4gICAgU29ja3M0UmVzcG9uc2VbU29ja3M0UmVzcG9uc2VbXCJSZWplY3RlZElkZW50XCJdID0gOTNdID0gXCJSZWplY3RlZElkZW50XCI7XG59KShTb2NrczRSZXNwb25zZSB8fCAoZXhwb3J0cy5Tb2NrczRSZXNwb25zZSA9IFNvY2tzNFJlc3BvbnNlID0ge30pKTtcbnZhciBTb2NrczVBdXRoO1xuKGZ1bmN0aW9uIChTb2NrczVBdXRoKSB7XG4gICAgU29ja3M1QXV0aFtTb2NrczVBdXRoW1wiTm9BdXRoXCJdID0gMF0gPSBcIk5vQXV0aFwiO1xuICAgIFNvY2tzNUF1dGhbU29ja3M1QXV0aFtcIkdTU0FwaVwiXSA9IDFdID0gXCJHU1NBcGlcIjtcbiAgICBTb2NrczVBdXRoW1NvY2tzNUF1dGhbXCJVc2VyUGFzc1wiXSA9IDJdID0gXCJVc2VyUGFzc1wiO1xufSkoU29ja3M1QXV0aCB8fCAoZXhwb3J0cy5Tb2NrczVBdXRoID0gU29ja3M1QXV0aCA9IHt9KSk7XG5jb25zdCBTT0NLUzVfQ1VTVE9NX0FVVEhfU1RBUlQgPSAweDgwO1xuZXhwb3J0cy5TT0NLUzVfQ1VTVE9NX0FVVEhfU1RBUlQgPSBTT0NLUzVfQ1VTVE9NX0FVVEhfU1RBUlQ7XG5jb25zdCBTT0NLUzVfQ1VTVE9NX0FVVEhfRU5EID0gMHhmZTtcbmV4cG9ydHMuU09DS1M1X0NVU1RPTV9BVVRIX0VORCA9IFNPQ0tTNV9DVVNUT01fQVVUSF9FTkQ7XG5jb25zdCBTT0NLUzVfTk9fQUNDRVBUQUJMRV9BVVRIID0gMHhmZjtcbmV4cG9ydHMuU09DS1M1X05PX0FDQ0VQVEFCTEVfQVVUSCA9IFNPQ0tTNV9OT19BQ0NFUFRBQkxFX0FVVEg7XG52YXIgU29ja3M1UmVzcG9uc2U7XG4oZnVuY3Rpb24gKFNvY2tzNVJlc3BvbnNlKSB7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJHcmFudGVkXCJdID0gMF0gPSBcIkdyYW50ZWRcIjtcbiAgICBTb2NrczVSZXNwb25zZVtTb2NrczVSZXNwb25zZVtcIkZhaWx1cmVcIl0gPSAxXSA9IFwiRmFpbHVyZVwiO1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiTm90QWxsb3dlZFwiXSA9IDJdID0gXCJOb3RBbGxvd2VkXCI7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJOZXR3b3JrVW5yZWFjaGFibGVcIl0gPSAzXSA9IFwiTmV0d29ya1VucmVhY2hhYmxlXCI7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJIb3N0VW5yZWFjaGFibGVcIl0gPSA0XSA9IFwiSG9zdFVucmVhY2hhYmxlXCI7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJDb25uZWN0aW9uUmVmdXNlZFwiXSA9IDVdID0gXCJDb25uZWN0aW9uUmVmdXNlZFwiO1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiVFRMRXhwaXJlZFwiXSA9IDZdID0gXCJUVExFeHBpcmVkXCI7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJDb21tYW5kTm90U3VwcG9ydGVkXCJdID0gN10gPSBcIkNvbW1hbmROb3RTdXBwb3J0ZWRcIjtcbiAgICBTb2NrczVSZXNwb25zZVtTb2NrczVSZXNwb25zZVtcIkFkZHJlc3NOb3RTdXBwb3J0ZWRcIl0gPSA4XSA9IFwiQWRkcmVzc05vdFN1cHBvcnRlZFwiO1xufSkoU29ja3M1UmVzcG9uc2UgfHwgKGV4cG9ydHMuU29ja3M1UmVzcG9uc2UgPSBTb2NrczVSZXNwb25zZSA9IHt9KSk7XG52YXIgU29ja3M1SG9zdFR5cGU7XG4oZnVuY3Rpb24gKFNvY2tzNUhvc3RUeXBlKSB7XG4gICAgU29ja3M1SG9zdFR5cGVbU29ja3M1SG9zdFR5cGVbXCJJUHY0XCJdID0gMV0gPSBcIklQdjRcIjtcbiAgICBTb2NrczVIb3N0VHlwZVtTb2NrczVIb3N0VHlwZVtcIkhvc3RuYW1lXCJdID0gM10gPSBcIkhvc3RuYW1lXCI7XG4gICAgU29ja3M1SG9zdFR5cGVbU29ja3M1SG9zdFR5cGVbXCJJUHY2XCJdID0gNF0gPSBcIklQdjZcIjtcbn0pKFNvY2tzNUhvc3RUeXBlIHx8IChleHBvcnRzLlNvY2tzNUhvc3RUeXBlID0gU29ja3M1SG9zdFR5cGUgPSB7fSkpO1xudmFyIFNvY2tzQ2xpZW50U3RhdGU7XG4oZnVuY3Rpb24gKFNvY2tzQ2xpZW50U3RhdGUpIHtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJDcmVhdGVkXCJdID0gMF0gPSBcIkNyZWF0ZWRcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJDb25uZWN0aW5nXCJdID0gMV0gPSBcIkNvbm5lY3RpbmdcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJDb25uZWN0ZWRcIl0gPSAyXSA9IFwiQ29ubmVjdGVkXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiU2VudEluaXRpYWxIYW5kc2hha2VcIl0gPSAzXSA9IFwiU2VudEluaXRpYWxIYW5kc2hha2VcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJSZWNlaXZlZEluaXRpYWxIYW5kc2hha2VSZXNwb25zZVwiXSA9IDRdID0gXCJSZWNlaXZlZEluaXRpYWxIYW5kc2hha2VSZXNwb25zZVwiO1xuICAgIFNvY2tzQ2xpZW50U3RhdGVbU29ja3NDbGllbnRTdGF0ZVtcIlNlbnRBdXRoZW50aWNhdGlvblwiXSA9IDVdID0gXCJTZW50QXV0aGVudGljYXRpb25cIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJSZWNlaXZlZEF1dGhlbnRpY2F0aW9uUmVzcG9uc2VcIl0gPSA2XSA9IFwiUmVjZWl2ZWRBdXRoZW50aWNhdGlvblJlc3BvbnNlXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiU2VudEZpbmFsSGFuZHNoYWtlXCJdID0gN10gPSBcIlNlbnRGaW5hbEhhbmRzaGFrZVwiO1xuICAgIFNvY2tzQ2xpZW50U3RhdGVbU29ja3NDbGllbnRTdGF0ZVtcIlJlY2VpdmVkRmluYWxSZXNwb25zZVwiXSA9IDhdID0gXCJSZWNlaXZlZEZpbmFsUmVzcG9uc2VcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJCb3VuZFdhaXRpbmdGb3JDb25uZWN0aW9uXCJdID0gOV0gPSBcIkJvdW5kV2FpdGluZ0ZvckNvbm5lY3Rpb25cIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJFc3RhYmxpc2hlZFwiXSA9IDEwXSA9IFwiRXN0YWJsaXNoZWRcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJEaXNjb25uZWN0ZWRcIl0gPSAxMV0gPSBcIkRpc2Nvbm5lY3RlZFwiO1xuICAgIFNvY2tzQ2xpZW50U3RhdGVbU29ja3NDbGllbnRTdGF0ZVtcIkVycm9yXCJdID0gOTldID0gXCJFcnJvclwiO1xufSkoU29ja3NDbGllbnRTdGF0ZSB8fCAoZXhwb3J0cy5Tb2Nrc0NsaWVudFN0YXRlID0gU29ja3NDbGllbnRTdGF0ZSA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdGFudHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlwVG9CdWZmZXIgPSBleHBvcnRzLmludDMyVG9JcHY0ID0gZXhwb3J0cy5pcHY0VG9JbnQzMiA9IGV4cG9ydHMudmFsaWRhdGVTb2Nrc0NsaWVudENoYWluT3B0aW9ucyA9IGV4cG9ydHMudmFsaWRhdGVTb2Nrc0NsaWVudE9wdGlvbnMgPSB2b2lkIDA7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi9jb25zdGFudHNcIik7XG5jb25zdCBzdHJlYW0gPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY29uc3QgaXBfYWRkcmVzc18xID0gcmVxdWlyZShcImlwLWFkZHJlc3NcIik7XG5jb25zdCBuZXQgPSByZXF1aXJlKFwibmV0XCIpO1xuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIHByb3ZpZGVkIFNvY2tzQ2xpZW50T3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnMgeyBTb2Nrc0NsaWVudE9wdGlvbnMgfVxuICogQHBhcmFtIGFjY2VwdGVkQ29tbWFuZHMgeyBzdHJpbmdbXSB9IEEgbGlzdCBvZiBhY2NlcHRlZCBTb2Nrc1Byb3h5IGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVNvY2tzQ2xpZW50T3B0aW9ucyhvcHRpb25zLCBhY2NlcHRlZENvbW1hbmRzID0gWydjb25uZWN0JywgJ2JpbmQnLCAnYXNzb2NpYXRlJ10pIHtcbiAgICAvLyBDaGVjayBTT0NLcyBjb21tYW5kIG9wdGlvbi5cbiAgICBpZiAoIWNvbnN0YW50c18xLlNvY2tzQ29tbWFuZFtvcHRpb25zLmNvbW1hbmRdKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIENoZWNrIFNvY2tzQ29tbWFuZCBmb3IgYWNjZXB0YWJsZSBjb21tYW5kLlxuICAgIGlmIChhY2NlcHRlZENvbW1hbmRzLmluZGV4T2Yob3B0aW9ucy5jb21tYW5kKSA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDb21tYW5kRm9yT3BlcmF0aW9uLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgZGVzdGluYXRpb25cbiAgICBpZiAoIWlzVmFsaWRTb2Nrc1JlbW90ZUhvc3Qob3B0aW9ucy5kZXN0aW5hdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zRGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBDaGVjayBTT0NLUyBwcm94eSB0byB1c2VcbiAgICBpZiAoIWlzVmFsaWRTb2Nrc1Byb3h5KG9wdGlvbnMucHJveHkpKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc1Byb3h5LCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgY3VzdG9tIGF1dGggKGlmIHNldClcbiAgICB2YWxpZGF0ZUN1c3RvbVByb3h5QXV0aChvcHRpb25zLnByb3h5LCBvcHRpb25zKTtcbiAgICAvLyBDaGVjayB0aW1lb3V0XG4gICAgaWYgKG9wdGlvbnMudGltZW91dCAmJiAhaXNWYWxpZFRpbWVvdXRWYWx1ZShvcHRpb25zLnRpbWVvdXQpKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc1RpbWVvdXQsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBDaGVjayBleGlzdGluZ19zb2NrZXQgKGlmIHByb3ZpZGVkKVxuICAgIGlmIChvcHRpb25zLmV4aXN0aW5nX3NvY2tldCAmJlxuICAgICAgICAhKG9wdGlvbnMuZXhpc3Rpbmdfc29ja2V0IGluc3RhbmNlb2Ygc3RyZWFtLkR1cGxleCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zRXhpc3RpbmdTb2NrZXQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbmV4cG9ydHMudmFsaWRhdGVTb2Nrc0NsaWVudE9wdGlvbnMgPSB2YWxpZGF0ZVNvY2tzQ2xpZW50T3B0aW9ucztcbi8qKlxuICogVmFsaWRhdGVzIHRoZSBTb2Nrc0NsaWVudENoYWluT3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnMgeyBTb2Nrc0NsaWVudENoYWluT3B0aW9ucyB9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU29ja3NDbGllbnRDaGFpbk9wdGlvbnMob3B0aW9ucykge1xuICAgIC8vIE9ubHkgY29ubmVjdCBpcyBzdXBwb3J0ZWQgd2hlbiBjaGFpbmluZy5cbiAgICBpZiAob3B0aW9ucy5jb21tYW5kICE9PSAnY29ubmVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDb21tYW5kQ2hhaW4sIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBDaGVjayBkZXN0aW5hdGlvblxuICAgIGlmICghaXNWYWxpZFNvY2tzUmVtb3RlSG9zdChvcHRpb25zLmRlc3RpbmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNEZXN0aW5hdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIHByb3hpZXMgKGxlbmd0aClcbiAgICBpZiAoIShvcHRpb25zLnByb3hpZXMgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShvcHRpb25zLnByb3hpZXMpICYmXG4gICAgICAgIG9wdGlvbnMucHJveGllcy5sZW5ndGggPj0gMikpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zUHJveGllc0xlbmd0aCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIHByb3hpZXNcbiAgICBvcHRpb25zLnByb3hpZXMuZm9yRWFjaCgocHJveHkpID0+IHtcbiAgICAgICAgaWYgKCFpc1ZhbGlkU29ja3NQcm94eShwcm94eSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc1Byb3h5LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSBjdXN0b20gYXV0aCAoaWYgc2V0KVxuICAgICAgICB2YWxpZGF0ZUN1c3RvbVByb3h5QXV0aChwcm94eSwgb3B0aW9ucyk7XG4gICAgfSk7XG4gICAgLy8gQ2hlY2sgdGltZW91dFxuICAgIGlmIChvcHRpb25zLnRpbWVvdXQgJiYgIWlzVmFsaWRUaW1lb3V0VmFsdWUob3B0aW9ucy50aW1lb3V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNUaW1lb3V0LCBvcHRpb25zKTtcbiAgICB9XG59XG5leHBvcnRzLnZhbGlkYXRlU29ja3NDbGllbnRDaGFpbk9wdGlvbnMgPSB2YWxpZGF0ZVNvY2tzQ2xpZW50Q2hhaW5PcHRpb25zO1xuZnVuY3Rpb24gdmFsaWRhdGVDdXN0b21Qcm94eUF1dGgocHJveHksIG9wdGlvbnMpIHtcbiAgICBpZiAocHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gSW52YWxpZCBhdXRoIG1ldGhvZCByYW5nZVxuICAgICAgICBpZiAocHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kIDwgY29uc3RhbnRzXzEuU09DS1M1X0NVU1RPTV9BVVRIX1NUQVJUIHx8XG4gICAgICAgICAgICBwcm94eS5jdXN0b21fYXV0aF9tZXRob2QgPiBjb25zdGFudHNfMS5TT0NLUzVfQ1VTVE9NX0FVVEhfRU5EKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNDdXN0b21BdXRoUmFuZ2UsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1pc3NpbmcgY3VzdG9tX2F1dGhfcmVxdWVzdF9oYW5kbGVyXG4gICAgICAgIGlmIChwcm94eS5jdXN0b21fYXV0aF9yZXF1ZXN0X2hhbmRsZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgdHlwZW9mIHByb3h5LmN1c3RvbV9hdXRoX3JlcXVlc3RfaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zQ3VzdG9tQXV0aE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1pc3NpbmcgY3VzdG9tX2F1dGhfcmVzcG9uc2Vfc2l6ZVxuICAgICAgICBpZiAocHJveHkuY3VzdG9tX2F1dGhfcmVzcG9uc2Vfc2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNDdXN0b21BdXRoT3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWlzc2luZy9pbnZhbGlkIGN1c3RvbV9hdXRoX3Jlc3BvbnNlX2hhbmRsZXJcbiAgICAgICAgaWYgKHByb3h5LmN1c3RvbV9hdXRoX3Jlc3BvbnNlX2hhbmRsZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgdHlwZW9mIHByb3h5LmN1c3RvbV9hdXRoX3Jlc3BvbnNlX2hhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0N1c3RvbUF1dGhPcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogVmFsaWRhdGVzIGEgU29ja3NSZW1vdGVIb3N0XG4gKiBAcGFyYW0gcmVtb3RlSG9zdCB7IFNvY2tzUmVtb3RlSG9zdCB9XG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTb2Nrc1JlbW90ZUhvc3QocmVtb3RlSG9zdCkge1xuICAgIHJldHVybiAocmVtb3RlSG9zdCAmJlxuICAgICAgICB0eXBlb2YgcmVtb3RlSG9zdC5ob3N0ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB0eXBlb2YgcmVtb3RlSG9zdC5wb3J0ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICByZW1vdGVIb3N0LnBvcnQgPj0gMCAmJlxuICAgICAgICByZW1vdGVIb3N0LnBvcnQgPD0gNjU1MzUpO1xufVxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBTb2Nrc1Byb3h5XG4gKiBAcGFyYW0gcHJveHkgeyBTb2Nrc1Byb3h5IH1cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFNvY2tzUHJveHkocHJveHkpIHtcbiAgICByZXR1cm4gKHByb3h5ICYmXG4gICAgICAgICh0eXBlb2YgcHJveHkuaG9zdCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3h5LmlwYWRkcmVzcyA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgIHR5cGVvZiBwcm94eS5wb3J0ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICBwcm94eS5wb3J0ID49IDAgJiZcbiAgICAgICAgcHJveHkucG9ydCA8PSA2NTUzNSAmJlxuICAgICAgICAocHJveHkudHlwZSA9PT0gNCB8fCBwcm94eS50eXBlID09PSA1KSk7XG59XG4vKipcbiAqIFZhbGlkYXRlcyBhIHRpbWVvdXQgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfVxuICovXG5mdW5jdGlvbiBpc1ZhbGlkVGltZW91dFZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgPiAwO1xufVxuZnVuY3Rpb24gaXB2NFRvSW50MzIoaXApIHtcbiAgICBjb25zdCBhZGRyZXNzID0gbmV3IGlwX2FkZHJlc3NfMS5BZGRyZXNzNChpcCk7XG4gICAgLy8gQ29udmVydCB0aGUgSVB2NCBhZGRyZXNzIHBhcnRzIHRvIGFuIGludGVnZXJcbiAgICByZXR1cm4gYWRkcmVzcy50b0FycmF5KCkucmVkdWNlKChhY2MsIHBhcnQpID0+IChhY2MgPDwgOCkgKyBwYXJ0LCAwKTtcbn1cbmV4cG9ydHMuaXB2NFRvSW50MzIgPSBpcHY0VG9JbnQzMjtcbmZ1bmN0aW9uIGludDMyVG9JcHY0KGludDMyKSB7XG4gICAgLy8gRXh0cmFjdCBlYWNoIGJ5dGUgKG9jdGV0KSBmcm9tIHRoZSAzMi1iaXQgaW50ZWdlclxuICAgIGNvbnN0IG9jdGV0MSA9IChpbnQzMiA+Pj4gMjQpICYgMHhmZjtcbiAgICBjb25zdCBvY3RldDIgPSAoaW50MzIgPj4+IDE2KSAmIDB4ZmY7XG4gICAgY29uc3Qgb2N0ZXQzID0gKGludDMyID4+PiA4KSAmIDB4ZmY7XG4gICAgY29uc3Qgb2N0ZXQ0ID0gaW50MzIgJiAweGZmO1xuICAgIC8vIENvbWJpbmUgdGhlIG9jdGV0cyBpbnRvIGEgc3RyaW5nIGluIElQdjQgZm9ybWF0XG4gICAgcmV0dXJuIFtvY3RldDEsIG9jdGV0Miwgb2N0ZXQzLCBvY3RldDRdLmpvaW4oJy4nKTtcbn1cbmV4cG9ydHMuaW50MzJUb0lwdjQgPSBpbnQzMlRvSXB2NDtcbmZ1bmN0aW9uIGlwVG9CdWZmZXIoaXApIHtcbiAgICBpZiAobmV0LmlzSVB2NChpcCkpIHtcbiAgICAgICAgLy8gSGFuZGxlIElQdjQgYWRkcmVzc2VzXG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSBuZXcgaXBfYWRkcmVzc18xLkFkZHJlc3M0KGlwKTtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFkZHJlc3MudG9BcnJheSgpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAobmV0LmlzSVB2NihpcCkpIHtcbiAgICAgICAgLy8gSGFuZGxlIElQdjYgYWRkcmVzc2VzXG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSBuZXcgaXBfYWRkcmVzc18xLkFkZHJlc3M2KGlwKTtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFkZHJlc3NcbiAgICAgICAgICAgIC5jYW5vbmljYWxGb3JtKClcbiAgICAgICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgICAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnBhZFN0YXJ0KDQsICcwJykpXG4gICAgICAgICAgICAuam9pbignJyksICdoZXgnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBJUCBhZGRyZXNzIGZvcm1hdCcpO1xuICAgIH1cbn1cbmV4cG9ydHMuaXBUb0J1ZmZlciA9IGlwVG9CdWZmZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oZWxwZXJzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWNlaXZlQnVmZmVyID0gdm9pZCAwO1xuY2xhc3MgUmVjZWl2ZUJ1ZmZlciB7XG4gICAgY29uc3RydWN0b3Ioc2l6ZSA9IDQwOTYpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUoc2l6ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5vcmlnaW5hbFNpemUgPSBzaXplO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXQ7XG4gICAgfVxuICAgIGFwcGVuZChkYXRhKSB7XG4gICAgICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byBhcHBlbmQgYSBub24tYnVmZmVyIGluc3RhbmNlIHRvIFJlY2VpdmVCdWZmZXIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0ICsgZGF0YS5sZW5ndGggPj0gdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB0bXAgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKE1hdGgubWF4KHRoaXMuYnVmZmVyLmxlbmd0aCArIHRoaXMub3JpZ2luYWxTaXplLCB0aGlzLmJ1ZmZlci5sZW5ndGggKyBkYXRhLmxlbmd0aCkpO1xuICAgICAgICAgICAgdG1wLmNvcHkodGhpcy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEuY29weSh0aGlzLmJ1ZmZlciwgdGhpcy5vZmZzZXQpO1xuICAgICAgICByZXR1cm4gKHRoaXMub2Zmc2V0ICs9IGRhdGEubGVuZ3RoKTtcbiAgICB9XG4gICAgcGVlayhsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA+IHRoaXMub2Zmc2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byByZWFkIGJleW9uZCB0aGUgYm91bmRzIG9mIHRoZSBtYW5hZ2VkIGludGVybmFsIGRhdGEuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuICAgIGdldChsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA+IHRoaXMub2Zmc2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byByZWFkIGJleW9uZCB0aGUgYm91bmRzIG9mIHRoZSBtYW5hZ2VkIGludGVybmFsIGRhdGEuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKTtcbiAgICAgICAgdGhpcy5idWZmZXIuc2xpY2UoMCwgbGVuZ3RoKS5jb3B5KHZhbHVlKTtcbiAgICAgICAgdGhpcy5idWZmZXIuY29weVdpdGhpbigwLCBsZW5ndGgsIGxlbmd0aCArIHRoaXMub2Zmc2V0IC0gbGVuZ3RoKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuZ3RoO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuZXhwb3J0cy5SZWNlaXZlQnVmZmVyID0gUmVjZWl2ZUJ1ZmZlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlY2VpdmVidWZmZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnNodWZmbGVBcnJheSA9IGV4cG9ydHMuU29ja3NDbGllbnRFcnJvciA9IHZvaWQgMDtcbi8qKlxuICogRXJyb3Igd3JhcHBlciBmb3IgU29ja3NDbGllbnRcbiAqL1xuY2xhc3MgU29ja3NDbGllbnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbn1cbmV4cG9ydHMuU29ja3NDbGllbnRFcnJvciA9IFNvY2tzQ2xpZW50RXJyb3I7XG4vKipcbiAqIFNodWZmbGVzIGEgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gKi9cbmZ1bmN0aW9uIHNodWZmbGVBcnJheShhcnJheSkge1xuICAgIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcbiAgICAgICAgW2FycmF5W2ldLCBhcnJheVtqXV0gPSBbYXJyYXlbal0sIGFycmF5W2ldXTtcbiAgICB9XG59XG5leHBvcnRzLnNodWZmbGVBcnJheSA9IHNodWZmbGVBcnJheTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWwuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9jbGllbnQvc29ja3NjbGllbnRcIiksIGV4cG9ydHMpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKlxuICogQmFzZWQgb24gdGhlIEJhc2UgNjQgVkxRIGltcGxlbWVudGF0aW9uIGluIENsb3N1cmUgQ29tcGlsZXI6XG4gKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nsb3N1cmUtY29tcGlsZXIvc291cmNlL2Jyb3dzZS90cnVuay9zcmMvY29tL2dvb2dsZS9kZWJ1Z2dpbmcvc291cmNlbWFwL0Jhc2U2NFZMUS5qYXZhXG4gKlxuICogQ29weXJpZ2h0IDIwMTEgVGhlIENsb3N1cmUgQ29tcGlsZXIgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkXG4gKiAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4vYmFzZTY0Jyk7XG5cbi8vIEEgc2luZ2xlIGJhc2UgNjQgZGlnaXQgY2FuIGNvbnRhaW4gNiBiaXRzIG9mIGRhdGEuIEZvciB0aGUgYmFzZSA2NCB2YXJpYWJsZVxuLy8gbGVuZ3RoIHF1YW50aXRpZXMgd2UgdXNlIGluIHRoZSBzb3VyY2UgbWFwIHNwZWMsIHRoZSBmaXJzdCBiaXQgaXMgdGhlIHNpZ24sXG4vLyB0aGUgbmV4dCBmb3VyIGJpdHMgYXJlIHRoZSBhY3R1YWwgdmFsdWUsIGFuZCB0aGUgNnRoIGJpdCBpcyB0aGVcbi8vIGNvbnRpbnVhdGlvbiBiaXQuIFRoZSBjb250aW51YXRpb24gYml0IHRlbGxzIHVzIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmVcbi8vIGRpZ2l0cyBpbiB0aGlzIHZhbHVlIGZvbGxvd2luZyB0aGlzIGRpZ2l0LlxuLy9cbi8vICAgQ29udGludWF0aW9uXG4vLyAgIHwgICAgU2lnblxuLy8gICB8ICAgIHxcbi8vICAgViAgICBWXG4vLyAgIDEwMTAxMVxuXG52YXIgVkxRX0JBU0VfU0hJRlQgPSA1O1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9CQVNFID0gMSA8PCBWTFFfQkFTRV9TSElGVDtcblxuLy8gYmluYXJ5OiAwMTExMTFcbnZhciBWTFFfQkFTRV9NQVNLID0gVkxRX0JBU0UgLSAxO1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9DT05USU5VQVRJT05fQklUID0gVkxRX0JBU0U7XG5cbi8qKlxuICogQ29udmVydHMgZnJvbSBhIHR3by1jb21wbGVtZW50IHZhbHVlIHRvIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMSBiZWNvbWVzIDIgKDEwIGJpbmFyeSksIC0xIGJlY29tZXMgMyAoMTEgYmluYXJ5KVxuICogICAyIGJlY29tZXMgNCAoMTAwIGJpbmFyeSksIC0yIGJlY29tZXMgNSAoMTAxIGJpbmFyeSlcbiAqL1xuZnVuY3Rpb24gdG9WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHJldHVybiBhVmFsdWUgPCAwXG4gICAgPyAoKC1hVmFsdWUpIDw8IDEpICsgMVxuICAgIDogKGFWYWx1ZSA8PCAxKSArIDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgdG8gYSB0d28tY29tcGxlbWVudCB2YWx1ZSBmcm9tIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMiAoMTAgYmluYXJ5KSBiZWNvbWVzIDEsIDMgKDExIGJpbmFyeSkgYmVjb21lcyAtMVxuICogICA0ICgxMDAgYmluYXJ5KSBiZWNvbWVzIDIsIDUgKDEwMSBiaW5hcnkpIGJlY29tZXMgLTJcbiAqL1xuZnVuY3Rpb24gZnJvbVZMUVNpZ25lZChhVmFsdWUpIHtcbiAgdmFyIGlzTmVnYXRpdmUgPSAoYVZhbHVlICYgMSkgPT09IDE7XG4gIHZhciBzaGlmdGVkID0gYVZhbHVlID4+IDE7XG4gIHJldHVybiBpc05lZ2F0aXZlXG4gICAgPyAtc2hpZnRlZFxuICAgIDogc2hpZnRlZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiYXNlIDY0IFZMUSBlbmNvZGVkIHZhbHVlLlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGJhc2U2NFZMUV9lbmNvZGUoYVZhbHVlKSB7XG4gIHZhciBlbmNvZGVkID0gXCJcIjtcbiAgdmFyIGRpZ2l0O1xuXG4gIHZhciB2bHEgPSB0b1ZMUVNpZ25lZChhVmFsdWUpO1xuXG4gIGRvIHtcbiAgICBkaWdpdCA9IHZscSAmIFZMUV9CQVNFX01BU0s7XG4gICAgdmxxID4+Pj0gVkxRX0JBU0VfU0hJRlQ7XG4gICAgaWYgKHZscSA+IDApIHtcbiAgICAgIC8vIFRoZXJlIGFyZSBzdGlsbCBtb3JlIGRpZ2l0cyBpbiB0aGlzIHZhbHVlLCBzbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGVcbiAgICAgIC8vIGNvbnRpbnVhdGlvbiBiaXQgaXMgbWFya2VkLlxuICAgICAgZGlnaXQgfD0gVkxRX0NPTlRJTlVBVElPTl9CSVQ7XG4gICAgfVxuICAgIGVuY29kZWQgKz0gYmFzZTY0LmVuY29kZShkaWdpdCk7XG4gIH0gd2hpbGUgKHZscSA+IDApO1xuXG4gIHJldHVybiBlbmNvZGVkO1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIHRoZSBuZXh0IGJhc2UgNjQgVkxRIHZhbHVlIGZyb20gdGhlIGdpdmVuIHN0cmluZyBhbmQgcmV0dXJucyB0aGVcbiAqIHZhbHVlIGFuZCB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIHZpYSB0aGUgb3V0IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZGVjb2RlKGFTdHIsIGFJbmRleCwgYU91dFBhcmFtKSB7XG4gIHZhciBzdHJMZW4gPSBhU3RyLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IDA7XG4gIHZhciBzaGlmdCA9IDA7XG4gIHZhciBjb250aW51YXRpb24sIGRpZ2l0O1xuXG4gIGRvIHtcbiAgICBpZiAoYUluZGV4ID49IHN0ckxlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbW9yZSBkaWdpdHMgaW4gYmFzZSA2NCBWTFEgdmFsdWUuXCIpO1xuICAgIH1cblxuICAgIGRpZ2l0ID0gYmFzZTY0LmRlY29kZShhU3RyLmNoYXJDb2RlQXQoYUluZGV4KyspKTtcbiAgICBpZiAoZGlnaXQgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJhc2U2NCBkaWdpdDogXCIgKyBhU3RyLmNoYXJBdChhSW5kZXggLSAxKSk7XG4gICAgfVxuXG4gICAgY29udGludWF0aW9uID0gISEoZGlnaXQgJiBWTFFfQ09OVElOVUFUSU9OX0JJVCk7XG4gICAgZGlnaXQgJj0gVkxRX0JBU0VfTUFTSztcbiAgICByZXN1bHQgPSByZXN1bHQgKyAoZGlnaXQgPDwgc2hpZnQpO1xuICAgIHNoaWZ0ICs9IFZMUV9CQVNFX1NISUZUO1xuICB9IHdoaWxlIChjb250aW51YXRpb24pO1xuXG4gIGFPdXRQYXJhbS52YWx1ZSA9IGZyb21WTFFTaWduZWQocmVzdWx0KTtcbiAgYU91dFBhcmFtLnJlc3QgPSBhSW5kZXg7XG59O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgaW50VG9DaGFyTWFwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLnNwbGl0KCcnKTtcblxuLyoqXG4gKiBFbmNvZGUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2Ugb2YgMCB0byA2MyB0byBhIHNpbmdsZSBiYXNlIDY0IGRpZ2l0LlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgaWYgKDAgPD0gbnVtYmVyICYmIG51bWJlciA8IGludFRvQ2hhck1hcC5sZW5ndGgpIHtcbiAgICByZXR1cm4gaW50VG9DaGFyTWFwW251bWJlcl07XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk11c3QgYmUgYmV0d2VlbiAwIGFuZCA2MzogXCIgKyBudW1iZXIpO1xufTtcblxuLyoqXG4gKiBEZWNvZGUgYSBzaW5nbGUgYmFzZSA2NCBjaGFyYWN0ZXIgY29kZSBkaWdpdCB0byBhbiBpbnRlZ2VyLiBSZXR1cm5zIC0xIG9uXG4gKiBmYWlsdXJlLlxuICovXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICB2YXIgYmlnQSA9IDY1OyAgICAgLy8gJ0EnXG4gIHZhciBiaWdaID0gOTA7ICAgICAvLyAnWidcblxuICB2YXIgbGl0dGxlQSA9IDk3OyAgLy8gJ2EnXG4gIHZhciBsaXR0bGVaID0gMTIyOyAvLyAneidcblxuICB2YXIgemVybyA9IDQ4OyAgICAgLy8gJzAnXG4gIHZhciBuaW5lID0gNTc7ICAgICAvLyAnOSdcblxuICB2YXIgcGx1cyA9IDQzOyAgICAgLy8gJysnXG4gIHZhciBzbGFzaCA9IDQ3OyAgICAvLyAnLydcblxuICB2YXIgbGl0dGxlT2Zmc2V0ID0gMjY7XG4gIHZhciBudW1iZXJPZmZzZXQgPSA1MjtcblxuICAvLyAwIC0gMjU6IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXG4gIGlmIChiaWdBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGJpZ1opIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gYmlnQSk7XG4gIH1cblxuICAvLyAyNiAtIDUxOiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxuICBpZiAobGl0dGxlQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBsaXR0bGVaKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIGxpdHRsZUEgKyBsaXR0bGVPZmZzZXQpO1xuICB9XG5cbiAgLy8gNTIgLSA2MTogMDEyMzQ1Njc4OVxuICBpZiAoemVybyA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBuaW5lKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIHplcm8gKyBudW1iZXJPZmZzZXQpO1xuICB9XG5cbiAgLy8gNjI6ICtcbiAgaWYgKGNoYXJDb2RlID09IHBsdXMpIHtcbiAgICByZXR1cm4gNjI7XG4gIH1cblxuICAvLyA2MzogL1xuICBpZiAoY2hhckNvZGUgPT0gc2xhc2gpIHtcbiAgICByZXR1cm4gNjM7XG4gIH1cblxuICAvLyBJbnZhbGlkIGJhc2U2NCBkaWdpdC5cbiAgcmV0dXJuIC0xO1xufTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxuZXhwb3J0cy5HUkVBVEVTVF9MT1dFUl9CT1VORCA9IDE7XG5leHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EID0gMjtcblxuLyoqXG4gKiBSZWN1cnNpdmUgaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaC5cbiAqXG4gKiBAcGFyYW0gYUxvdyBJbmRpY2VzIGhlcmUgYW5kIGxvd2VyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYUhpZ2ggSW5kaWNlcyBoZXJlIGFuZCBoaWdoZXIgZG8gbm90IGNvbnRhaW4gdGhlIG5lZWRsZS5cbiAqIEBwYXJhbSBhTmVlZGxlIFRoZSBlbGVtZW50IGJlaW5nIHNlYXJjaGVkIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIG5vbi1lbXB0eSBhcnJheSBiZWluZyBzZWFyY2hlZC5cbiAqIEBwYXJhbSBhQ29tcGFyZSBGdW5jdGlvbiB3aGljaCB0YWtlcyB0d28gZWxlbWVudHMgYW5kIHJldHVybnMgLTEsIDAsIG9yIDEuXG4gKiBAcGFyYW0gYUJpYXMgRWl0aGVyICdiaW5hcnlTZWFyY2guR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ2JpbmFyeVNlYXJjaC5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlXG4gKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIHJlY3Vyc2l2ZVNlYXJjaChhTG93LCBhSGlnaCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiB0ZXJtaW5hdGVzIHdoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTpcbiAgLy9cbiAgLy8gICAxLiBXZSBmaW5kIHRoZSBleGFjdCBlbGVtZW50IHdlIGFyZSBsb29raW5nIGZvci5cbiAgLy9cbiAgLy8gICAyLiBXZSBkaWQgbm90IGZpbmQgdGhlIGV4YWN0IGVsZW1lbnQsIGJ1dCB3ZSBjYW4gcmV0dXJuIHRoZSBpbmRleCBvZlxuICAvLyAgICAgIHRoZSBuZXh0LWNsb3Nlc3QgZWxlbWVudC5cbiAgLy9cbiAgLy8gICAzLiBXZSBkaWQgbm90IGZpbmQgdGhlIGV4YWN0IGVsZW1lbnQsIGFuZCB0aGVyZSBpcyBubyBuZXh0LWNsb3Nlc3RcbiAgLy8gICAgICBlbGVtZW50IHRoYW4gdGhlIG9uZSB3ZSBhcmUgc2VhcmNoaW5nIGZvciwgc28gd2UgcmV0dXJuIC0xLlxuICB2YXIgbWlkID0gTWF0aC5mbG9vcigoYUhpZ2ggLSBhTG93KSAvIDIpICsgYUxvdztcbiAgdmFyIGNtcCA9IGFDb21wYXJlKGFOZWVkbGUsIGFIYXlzdGFja1ttaWRdLCB0cnVlKTtcbiAgaWYgKGNtcCA9PT0gMCkge1xuICAgIC8vIEZvdW5kIHRoZSBlbGVtZW50IHdlIGFyZSBsb29raW5nIGZvci5cbiAgICByZXR1cm4gbWlkO1xuICB9XG4gIGVsc2UgaWYgKGNtcCA+IDApIHtcbiAgICAvLyBPdXIgbmVlZGxlIGlzIGdyZWF0ZXIgdGhhbiBhSGF5c3RhY2tbbWlkXS5cbiAgICBpZiAoYUhpZ2ggLSBtaWQgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2gobWlkLCBhSGlnaCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpO1xuICAgIH1cblxuICAgIC8vIFRoZSBleGFjdCBuZWVkbGUgZWxlbWVudCB3YXMgbm90IGZvdW5kIGluIHRoaXMgaGF5c3RhY2suIERldGVybWluZSBpZlxuICAgIC8vIHdlIGFyZSBpbiB0ZXJtaW5hdGlvbiBjYXNlICgzKSBvciAoMikgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdGhpbmcuXG4gICAgaWYgKGFCaWFzID09IGV4cG9ydHMuTEVBU1RfVVBQRVJfQk9VTkQpIHtcbiAgICAgIHJldHVybiBhSGlnaCA8IGFIYXlzdGFjay5sZW5ndGggPyBhSGlnaCA6IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWlkO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICAvLyBPdXIgbmVlZGxlIGlzIGxlc3MgdGhhbiBhSGF5c3RhY2tbbWlkXS5cbiAgICBpZiAobWlkIC0gYUxvdyA+IDEpIHtcbiAgICAgIC8vIFRoZSBlbGVtZW50IGlzIGluIHRoZSBsb3dlciBoYWxmLlxuICAgICAgcmV0dXJuIHJlY3Vyc2l2ZVNlYXJjaChhTG93LCBtaWQsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gbWlkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYUxvdyA8IDAgPyAtMSA6IGFMb3c7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBiaW5hcnkgc2VhcmNoIHdoaWNoIHdpbGwgYWx3YXlzIHRyeSBhbmQgcmV0dXJuXG4gKiB0aGUgaW5kZXggb2YgdGhlIGNsb3Nlc3QgZWxlbWVudCBpZiB0aGVyZSBpcyBubyBleGFjdCBoaXQuIFRoaXMgaXMgYmVjYXVzZVxuICogbWFwcGluZ3MgYmV0d2VlbiBvcmlnaW5hbCBhbmQgZ2VuZXJhdGVkIGxpbmUvY29sIHBhaXJzIGFyZSBzaW5nbGUgcG9pbnRzLFxuICogYW5kIHRoZXJlIGlzIGFuIGltcGxpY2l0IHJlZ2lvbiBiZXR3ZWVuIGVhY2ggb2YgdGhlbSwgc28gYSBtaXNzIGp1c3QgbWVhbnNcbiAqIHRoYXQgeW91IGFyZW4ndCBvbiB0aGUgdmVyeSBzdGFydCBvZiBhIHJlZ2lvbi5cbiAqXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCB5b3UgYXJlIGxvb2tpbmcgZm9yLlxuICogQHBhcmFtIGFIYXlzdGFjayBUaGUgYXJyYXkgdGhhdCBpcyBiZWluZyBzZWFyY2hlZC5cbiAqIEBwYXJhbSBhQ29tcGFyZSBBIGZ1bmN0aW9uIHdoaWNoIHRha2VzIHRoZSBuZWVkbGUgYW5kIGFuIGVsZW1lbnQgaW4gdGhlXG4gKiAgICAgYXJyYXkgYW5kIHJldHVybnMgLTEsIDAsIG9yIDEgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5lZWRsZSBpcyBsZXNzXG4gKiAgICAgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgZWxlbWVudCwgcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICogICAgIERlZmF1bHRzIHRvICdiaW5hcnlTZWFyY2guR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICovXG5leHBvcnRzLnNlYXJjaCA9IGZ1bmN0aW9uIHNlYXJjaChhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcykge1xuICBpZiAoYUhheXN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHZhciBpbmRleCA9IHJlY3Vyc2l2ZVNlYXJjaCgtMSwgYUhheXN0YWNrLmxlbmd0aCwgYU5lZWRsZSwgYUhheXN0YWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbXBhcmUsIGFCaWFzIHx8IGV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQpO1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLy8gV2UgaGF2ZSBmb3VuZCBlaXRoZXIgdGhlIGV4YWN0IGVsZW1lbnQsIG9yIHRoZSBuZXh0LWNsb3Nlc3QgZWxlbWVudCB0aGFuXG4gIC8vIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IuIEhvd2V2ZXIsIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIHN1Y2hcbiAgLy8gZWxlbWVudC4gTWFrZSBzdXJlIHdlIGFsd2F5cyByZXR1cm4gdGhlIHNtYWxsZXN0IG9mIHRoZXNlLlxuICB3aGlsZSAoaW5kZXggLSAxID49IDApIHtcbiAgICBpZiAoYUNvbXBhcmUoYUhheXN0YWNrW2luZGV4XSwgYUhheXN0YWNrW2luZGV4IC0gMV0sIHRydWUpICE9PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLS1pbmRleDtcbiAgfVxuXG4gIHJldHVybiBpbmRleDtcbn07XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICogcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG59XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG59XG5cbi8qKlxuICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAqXG4gKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgfTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICogY29weS5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCk7XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyYXk7XG59O1xuXG5leHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICByZXR1cm4gc291cmNlTWFwLnNlY3Rpb25zICE9IG51bGxcbiAgICA/IG5ldyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKVxuICAgIDogbmV3IEJhc2ljU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcCA9IGZ1bmN0aW9uKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgcmV0dXJuIEJhc2ljU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8vIGBfX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmQgYF9fb3JpZ2luYWxNYXBwaW5nc2AgYXJlIGFycmF5cyB0aGF0IGhvbGQgdGhlXG4vLyBwYXJzZWQgbWFwcGluZyBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgbWFwJ3MgXCJtYXBwaW5nc1wiIGF0dHJpYnV0ZS4gVGhleVxuLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGdldHRlcnMgcmVzcGVjdGl2ZWx5LCBhbmQgd2Ugb25seSBwYXJzZSB0aGUgbWFwcGluZ3Ncbi8vIGFuZCBjcmVhdGUgdGhlc2UgYXJyYXlzIG9uY2UgcXVlcmllZCBmb3IgYSBzb3VyY2UgbG9jYXRpb24uIFdlIGp1bXAgdGhyb3VnaFxuLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nXG4vLyB0aGVtIGlzIGV4cGVuc2l2ZSwgc28gd2Ugb25seSB3YW50IHRvIGRvIGl0IGlmIHdlIG11c3QuXG4vL1xuLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybTpcbi8vXG4vLyAgICAge1xuLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIGdlbmVyYXRlZENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgc291cmNlOiBUaGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhpc1xuLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxMaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhpcyBjaHVuayBvZiBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBzeW1ib2wgd2hpY2ggZ2VuZXJhdGVkIHRoaXMgY2h1bmsgb2Zcbi8vICAgICAgICAgICAgIGNvZGUuXG4vLyAgICAgfVxuLy9cbi8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmVcbi8vIGBudWxsYC5cbi8vXG4vLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLlxuLy9cbi8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zLlxuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX2dlbmVyYXRlZE1hcHBpbmdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19vcmlnaW5hbE1hcHBpbmdzID0gbnVsbDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfb3JpZ2luYWxNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZSwgdGhpcy5fc291cmNlTWFwVVJMKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IE9wdGlvbmFsLiB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yKGFBcmdzKSB7XG4gICAgdmFyIGxpbmUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKTtcblxuICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gZXhhY3QgbWF0Y2gsIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kTWFwcGluZ1xuICAgIC8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hcHBpbmcgbGVzcyB0aGFuIHRoZSBuZWVkbGUuIEJ5XG4gICAgLy8gc2V0dGluZyBuZWVkbGUub3JpZ2luYWxDb2x1bW4gdG8gMCwgd2UgdGh1cyBmaW5kIHRoZSBsYXN0IG1hcHBpbmcgZm9yXG4gICAgLy8gdGhlIGdpdmVuIGxpbmUsIHByb3ZpZGVkIHN1Y2ggYSBtYXBwaW5nIGV4aXN0cy5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpLFxuICAgICAgb3JpZ2luYWxMaW5lOiBsaW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJywgMClcbiAgICB9O1xuXG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChuZWVkbGUuc291cmNlKTtcbiAgICBpZiAobmVlZGxlLnNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgbWFwcGluZ3MgPSBbXTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKGFBcmdzLmNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZTtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIGZvdW5kLiBTaW5jZVxuICAgICAgICAvLyBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGZvdW5kLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gb3JpZ2luYWxMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIHdlcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgLy8gU2luY2UgbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBsaW5lICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID09IG9yaWdpbmFsQ29sdW1uKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXBwaW5ncztcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2ggd2UgY2FuXG4gKiBxdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGZpbGUgcG9zaXRpb25zIGJ5IGdpdmluZyBpdCBhIGZpbGVcbiAqIHBvc2l0aW9uIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3JcbiAqIGFscmVhZHkgcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYywgc291cmNlIG1hcHMgaGF2ZSB0aGVcbiAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIHNvdXJjZXM6IEFuIGFycmF5IG9mIFVSTHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAqICAgLSBuYW1lczogQW4gYXJyYXkgb2YgaWRlbnRpZmllcnMgd2hpY2ggY2FuIGJlIHJlZmVycmVuY2VkIGJ5IGluZGl2aWR1YWwgbWFwcGluZ3MuXG4gKiAgIC0gc291cmNlUm9vdDogT3B0aW9uYWwuIFRoZSBVUkwgcm9vdCBmcm9tIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSByZWxhdGl2ZS5cbiAqICAgLSBzb3VyY2VzQ29udGVudDogT3B0aW9uYWwuIEFuIGFycmF5IG9mIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbWFwcGluZ3M6IEEgc3RyaW5nIG9mIGJhc2U2NCBWTFFzIHdoaWNoIGNvbnRhaW4gdGhlIGFjdHVhbCBtYXBwaW5ncy5cbiAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKlxuICogSGVyZSBpcyBhbiBleGFtcGxlIHNvdXJjZSBtYXAsIHRha2VuIGZyb20gdGhlIHNvdXJjZSBtYXAgc3BlY1swXTpcbiAqXG4gKiAgICAge1xuICogICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICBmaWxlOiBcIm91dC5qc1wiLFxuICogICAgICAgc291cmNlUm9vdCA6IFwiXCIsXG4gKiAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAqICAgICAgIG1hcHBpbmdzOiBcIkFBLEFCOztBQkNERTtcIlxuICogICAgIH1cbiAqXG4gKiBUaGUgc2Vjb25kIHBhcmFtZXRlciwgaWYgZ2l2ZW4sIGlzIGEgc3RyaW5nIHdob3NlIHZhbHVlIGlzIHRoZSBVUkxcbiAqIGF0IHdoaWNoIHRoZSBzb3VyY2UgbWFwIHdhcyBmb3VuZC4gIFRoaXMgVVJMIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGVcbiAqIHNvdXJjZXMgYXJyYXkuXG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IHV0aWwucGFyc2VTb3VyY2VNYXBJbnB1dChhU291cmNlTWFwKTtcbiAgfVxuXG4gIHZhciB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAndmVyc2lvbicpO1xuICB2YXIgc291cmNlcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXMnKTtcbiAgLy8gU2FzcyAzLjMgbGVhdmVzIG91dCB0aGUgJ25hbWVzJyBhcnJheSwgc28gd2UgZGV2aWF0ZSBmcm9tIHRoZSBzcGVjICh3aGljaFxuICAvLyByZXF1aXJlcyB0aGUgYXJyYXkpIHRvIHBsYXkgbmljZSBoZXJlLlxuICB2YXIgbmFtZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICduYW1lcycsIFtdKTtcbiAgdmFyIHNvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VSb290JywgbnVsbCk7XG4gIHZhciBzb3VyY2VzQ29udGVudCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXNDb250ZW50JywgbnVsbCk7XG4gIHZhciBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ21hcHBpbmdzJyk7XG4gIHZhciBmaWxlID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnZmlsZScsIG51bGwpO1xuXG4gIC8vIE9uY2UgYWdhaW4sIFNhc3MgZGV2aWF0ZXMgZnJvbSB0aGUgc3BlYyBhbmQgc3VwcGxpZXMgdGhlIHZlcnNpb24gYXMgYVxuICAvLyBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIsIHNvIHdlIHVzZSBsb29zZSBlcXVhbGl0eSBjaGVja2luZyBoZXJlLlxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIHNvdXJjZVJvb3QgPSB1dGlsLm5vcm1hbGl6ZShzb3VyY2VSb290KTtcbiAgfVxuXG4gIHNvdXJjZXMgPSBzb3VyY2VzXG4gICAgLm1hcChTdHJpbmcpXG4gICAgLy8gU29tZSBzb3VyY2UgbWFwcyBwcm9kdWNlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBsaWtlIFwiLi9mb28uanNcIiBpbnN0ZWFkIG9mXG4gICAgLy8gXCJmb28uanNcIi4gIE5vcm1hbGl6ZSB0aGVzZSBmaXJzdCBzbyB0aGF0IGZ1dHVyZSBjb21wYXJpc29ucyB3aWxsIHN1Y2NlZWQuXG4gICAgLy8gU2VlIGJ1Z3ppbC5sYS8xMDkwNzY4LlxuICAgIC5tYXAodXRpbC5ub3JtYWxpemUpXG4gICAgLy8gQWx3YXlzIGVuc3VyZSB0aGF0IGFic29sdXRlIHNvdXJjZXMgYXJlIGludGVybmFsbHkgc3RvcmVkIHJlbGF0aXZlIHRvXG4gICAgLy8gdGhlIHNvdXJjZSByb290LCBpZiB0aGUgc291cmNlIHJvb3QgaXMgYWJzb2x1dGUuIE5vdCBkb2luZyB0aGlzIHdvdWxkXG4gICAgLy8gYmUgcGFydGljdWxhcmx5IHByb2JsZW1hdGljIHdoZW4gdGhlIHNvdXJjZSByb290IGlzIGEgcHJlZml4IG9mIHRoZVxuICAgIC8vIHNvdXJjZSAodmFsaWQsIGJ1dCB3aHk/PykuIFNlZSBnaXRodWIgaXNzdWUgIzE5OSBhbmQgYnVnemlsLmxhLzExODg5ODIuXG4gICAgLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlUm9vdCAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlUm9vdCkgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZSlcbiAgICAgICAgPyB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZSlcbiAgICAgICAgOiBzb3VyY2U7XG4gICAgfSk7XG5cbiAgLy8gUGFzcyBgdHJ1ZWAgYmVsb3cgdG8gYWxsb3cgZHVwbGljYXRlIG5hbWVzIGFuZCBzb3VyY2VzLiBXaGlsZSBzb3VyY2UgbWFwc1xuICAvLyBhcmUgaW50ZW5kZWQgdG8gYmUgY29tcHJlc3NlZCBhbmQgZGVkdXBsaWNhdGVkLCB0aGUgVHlwZVNjcmlwdCBjb21waWxlclxuICAvLyBzb21ldGltZXMgZ2VuZXJhdGVzIHNvdXJjZSBtYXBzIHdpdGggZHVwbGljYXRlcyBpbiB0aGVtLiBTZWUgR2l0aHViIGlzc3VlXG4gIC8vICM3MiBhbmQgYnVnemlsLmxhLzg4OTQ5Mi5cbiAgdGhpcy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkobmFtZXMubWFwKFN0cmluZyksIHRydWUpO1xuICB0aGlzLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KHNvdXJjZXMsIHRydWUpO1xuXG4gIHRoaXMuX2Fic29sdXRlU291cmNlcyA9IHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gIH0pO1xuXG4gIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7XG4gIHRoaXMuc291cmNlc0NvbnRlbnQgPSBzb3VyY2VzQ29udGVudDtcbiAgdGhpcy5fbWFwcGluZ3MgPSBtYXBwaW5ncztcbiAgdGhpcy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgdGhpcy5maWxlID0gZmlsZTtcbn1cblxuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB0aGUgaW5kZXggb2YgYSBzb3VyY2UuICBSZXR1cm5zIC0xIGlmIG5vdFxuICogZm91bmQuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kU291cmNlSW5kZXggPSBmdW5jdGlvbihhU291cmNlKSB7XG4gIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgIHJlbGF0aXZlU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhyZWxhdGl2ZVNvdXJjZSkpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlcy5pbmRleE9mKHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIC8vIE1heWJlIGFTb3VyY2UgaXMgYW4gYWJzb2x1dGUgVVJMIGFzIHJldHVybmVkIGJ5IHxzb3VyY2VzfC4gIEluXG4gIC8vIHRoaXMgY2FzZSB3ZSBjYW4ndCBzaW1wbHkgdW5kbyB0aGUgdHJhbnNmb3JtLlxuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2Fic29sdXRlU291cmNlcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0aGlzLl9hYnNvbHV0ZVNvdXJjZXNbaV0gPT0gYVNvdXJjZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGZyb20gYSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKlxuICogQHBhcmFtIFNvdXJjZU1hcEdlbmVyYXRvciBhU291cmNlTWFwXG4gKiAgICAgICAgVGhlIHNvdXJjZSBtYXAgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLlxuICogQHBhcmFtIFN0cmluZyBhU291cmNlTWFwVVJMXG4gKiAgICAgICAgVGhlIFVSTCBhdCB3aGljaCB0aGUgc291cmNlIG1hcCBjYW4gYmUgZm91bmQgKG9wdGlvbmFsKVxuICogQHJldHVybnMgQmFzaWNTb3VyY2VNYXBDb25zdW1lclxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgICB2YXIgc21jID0gT2JqZWN0LmNyZWF0ZShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5cbiAgICB2YXIgbmFtZXMgPSBzbWMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX25hbWVzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgdmFyIHNvdXJjZXMgPSBzbWMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fc291cmNlcy50b0FycmF5KCksIHRydWUpO1xuICAgIHNtYy5zb3VyY2VSb290ID0gYVNvdXJjZU1hcC5fc291cmNlUm9vdDtcbiAgICBzbWMuc291cmNlc0NvbnRlbnQgPSBhU291cmNlTWFwLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KHNtYy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWMuc291cmNlUm9vdCk7XG4gICAgc21jLmZpbGUgPSBhU291cmNlTWFwLl9maWxlO1xuICAgIHNtYy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgICBzbWMuX2Fic29sdXRlU291cmNlcyA9IHNtYy5fc291cmNlcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNtYy5zb3VyY2VSb290LCBzLCBhU291cmNlTWFwVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fic29sdXRlU291cmNlcy5zbGljZSgpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyXG4gKiAgICAgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9vcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIGdlbmVyYXRlZExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgZ2VuZXJhdGVkQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MsXG4gICAgICBcImdlbmVyYXRlZExpbmVcIixcbiAgICAgIFwiZ2VuZXJhdGVkQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdzb3VyY2UnLCBudWxsKTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuYXQoc291cmNlKTtcbiAgICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwodGhpcy5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbmFtZScsIG51bGwpO1xuICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5hdChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbExpbmUnLCBudWxsKSxcbiAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIG5hbWU6IG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlOiBudWxsLFxuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIG5hbWU6IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgdGhlIHNvdXJjZSBjb250ZW50IGZvciBldmVyeSBzb3VyY2UgaW4gdGhlIHNvdXJjZVxuICogbWFwLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnQubGVuZ3RoID49IHRoaXMuX3NvdXJjZXMuc2l6ZSgpICYmXG4gICAgICAhdGhpcy5zb3VyY2VzQ29udGVudC5zb21lKGZ1bmN0aW9uIChzYykgeyByZXR1cm4gc2MgPT0gbnVsbDsgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChhU291cmNlKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbaW5kZXhdO1xuICAgIH1cblxuICAgIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIHVybDtcbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGxcbiAgICAgICAgJiYgKHVybCA9IHV0aWwudXJsUGFyc2UodGhpcy5zb3VyY2VSb290KSkpIHtcbiAgICAgIC8vIFhYWDogZmlsZTovLyBVUklzIGFuZCBhYnNvbHV0ZSBwYXRocyBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZm9yXG4gICAgICAvLyBtYW55IHVzZXJzLiBXZSBjYW4gaGVscCB0aGVtIG91dCB3aGVuIHRoZXkgZXhwZWN0IGZpbGU6Ly8gVVJJcyB0b1xuICAgICAgLy8gYmVoYXZlIGxpa2UgaXQgd291bGQgaWYgdGhleSB3ZXJlIHJ1bm5pbmcgYSBsb2NhbCBIVFRQIHNlcnZlci4gU2VlXG4gICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODU1OTcuXG4gICAgICB2YXIgZmlsZVVyaUFic1BhdGggPSByZWxhdGl2ZVNvdXJjZS5yZXBsYWNlKC9eZmlsZTpcXC9cXC8vLCBcIlwiKTtcbiAgICAgIGlmICh1cmwuc2NoZW1lID09IFwiZmlsZVwiXG4gICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoZmlsZVVyaUFic1BhdGgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihmaWxlVXJpQWJzUGF0aCldXG4gICAgICB9XG5cbiAgICAgIGlmICgoIXVybC5wYXRoIHx8IHVybC5wYXRoID09IFwiL1wiKVxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKFwiL1wiICsgcmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIHJlbGF0aXZlU291cmNlKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHJlY3Vyc2l2ZWx5IGZyb21cbiAgICAvLyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IuIEluIHRoYXQgY2FzZSwgd2VcbiAgICAvLyBkb24ndCB3YW50IHRvIHRocm93IGlmIHdlIGNhbid0IGZpbmQgdGhlIHNvdXJjZSAtIHdlIGp1c3Qgd2FudCB0b1xuICAgIC8vIHJldHVybiBudWxsLCBzbyB3ZSBwcm92aWRlIGEgZmxhZyB0byBleGl0IGdyYWNlZnVsbHkuXG4gICAgaWYgKG51bGxPbk1pc3NpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgcmVsYXRpdmVTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgc291cmNlID0gdGhpcy5fZmluZFNvdXJjZUluZGV4KHNvdXJjZSk7XG4gICAgaWYgKHNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoXG4gICAgICBuZWVkbGUsXG4gICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICB1dGlsLmdldEFyZyhhQXJncywgJ2JpYXMnLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORClcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gbmVlZGxlLnNvdXJjZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgIH07XG4gIH07XG5cbmV4cG9ydHMuQmFzaWNTb3VyY2VNYXBDb25zdW1lciA9IEJhc2ljU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQW4gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaFxuICogd2UgY2FuIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbi4gSXQgZGlmZmVycyBmcm9tIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5cbiAqIHRoYXQgaXQgdGFrZXMgXCJpbmRleGVkXCIgc291cmNlIG1hcHMgKGkuZS4gb25lcyB3aXRoIGEgXCJzZWN0aW9uc1wiIGZpZWxkKSBhc1xuICogaW5wdXQuXG4gKlxuICogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0I2hlYWRpbmc9aC41MzVlczN4ZXByZ3RcbiAqL1xuZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSwgYVNvdXJjZU1hcFVSTClcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICAvLyBGaW5kIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbiB3ZSdyZSB0cnlpbmcgdG8gbWFwXG4gICAgLy8gdG8gYW4gb3JpZ2luYWwgcG9zaXRpb24uXG4gICAgdmFyIHNlY3Rpb25JbmRleCA9IGJpbmFyeVNlYXJjaC5zZWFyY2gobmVlZGxlLCB0aGlzLl9zZWN0aW9ucyxcbiAgICAgIGZ1bmN0aW9uKG5lZWRsZSwgc2VjdGlvbikge1xuICAgICAgICB2YXIgY21wID0gbmVlZGxlLmdlbmVyYXRlZExpbmUgLSBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lO1xuICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgcmV0dXJuIGNtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAobmVlZGxlLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgIH0pO1xuICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcblxuICAgIGlmICghc2VjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIG5hbWU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlY3Rpb24uY29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICBsaW5lOiBuZWVkbGUuZ2VuZXJhdGVkTGluZSAtXG4gICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICBjb2x1bW46IG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmVcbiAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgOiAwKSxcbiAgICAgIGJpYXM6IGFBcmdzLmJpYXNcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWN0aW9ucy5ldmVyeShmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHMuY29uc3VtZXIuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKTtcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIHZhciBjb250ZW50ID0gc2VjdGlvbi5jb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIHRydWUpO1xuICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuIFxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIC8vIE9ubHkgY29uc2lkZXIgdGhpcyBzZWN0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgc291cmNlIGlzIGluIHRoZSBsaXN0IG9mXG4gICAgICAvLyBzb3VyY2VzIG9mIHRoZSBjb25zdW1lci5cbiAgICAgIGlmIChzZWN0aW9uLmNvbnN1bWVyLl9maW5kU291cmNlSW5kZXgodXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSkgPT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGdlbmVyYXRlZFBvc2l0aW9uID0gc2VjdGlvbi5jb25zdW1lci5nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncyk7XG4gICAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb24pIHtcbiAgICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWRQb3NpdGlvbi5jb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IGdlbmVyYXRlZFBvc2l0aW9uLmxpbmVcbiAgICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgICA6IDApXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fcGFyc2VNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuICAgICAgdmFyIHNlY3Rpb25NYXBwaW5ncyA9IHNlY3Rpb24uY29uc3VtZXIuX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWN0aW9uTWFwcGluZ3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSBzZWN0aW9uTWFwcGluZ3Nbal07XG5cbiAgICAgICAgdmFyIHNvdXJjZSA9IHNlY3Rpb24uY29uc3VtZXIuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc2VjdGlvbi5jb25zdW1lci5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgICAgIHZhciBuYW1lID0gbnVsbDtcbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBNYXBwaW5nTGlzdCA9IHJlcXVpcmUoJy4vbWFwcGluZy1saXN0JykuTWFwcGluZ0xpc3Q7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhlIFNvdXJjZU1hcEdlbmVyYXRvciByZXByZXNlbnRzIGEgc291cmNlIG1hcCB3aGljaCBpc1xuICogYmVpbmcgYnVpbHQgaW5jcmVtZW50YWxseS4gWW91IG1heSBwYXNzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqICAgLSBzb3VyY2VSb290OiBBIHJvb3QgZm9yIGFsbCByZWxhdGl2ZSBVUkxzIGluIHRoaXMgc291cmNlIG1hcC5cbiAqL1xuZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKSB7XG4gIGlmICghYUFyZ3MpIHtcbiAgICBhQXJncyA9IHt9O1xuICB9XG4gIHRoaXMuX2ZpbGUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2ZpbGUnLCBudWxsKTtcbiAgdGhpcy5fc291cmNlUm9vdCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB0aGlzLl9za2lwVmFsaWRhdGlvbiA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc2tpcFZhbGlkYXRpb24nLCBmYWxzZSk7XG4gIHRoaXMuX3NvdXJjZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgdGhpcy5fbmFtZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgdGhpcy5fbWFwcGluZ3MgPSBuZXcgTWFwcGluZ0xpc3QoKTtcbiAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gbnVsbDtcbn1cblxuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IgYmFzZWQgb24gYSBTb3VyY2VNYXBDb25zdW1lclxuICpcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIpIHtcbiAgICB2YXIgc291cmNlUm9vdCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VSb290O1xuICAgIHZhciBnZW5lcmF0b3IgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKHtcbiAgICAgIGZpbGU6IGFTb3VyY2VNYXBDb25zdW1lci5maWxlLFxuICAgICAgc291cmNlUm9vdDogc291cmNlUm9vdFxuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5lYWNoTWFwcGluZyhmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIG5ld01hcHBpbmcgPSB7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSxcbiAgICAgICAgICBjb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgIG5ld01hcHBpbmcuc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbmV3TWFwcGluZy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3TWFwcGluZy5vcmlnaW5hbCA9IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW5cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLm5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZ2VuZXJhdG9yLmFkZE1hcHBpbmcobmV3TWFwcGluZyk7XG4gICAgfSk7XG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgdmFyIHNvdXJjZVJlbGF0aXZlID0gc291cmNlRmlsZTtcbiAgICAgIGlmIChzb3VyY2VSb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNvdXJjZVJlbGF0aXZlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZW5lcmF0b3IuX3NvdXJjZXMuaGFzKHNvdXJjZVJlbGF0aXZlKSkge1xuICAgICAgICBnZW5lcmF0b3IuX3NvdXJjZXMuYWRkKHNvdXJjZVJlbGF0aXZlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgZ2VuZXJhdG9yLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfTtcblxuLyoqXG4gKiBBZGQgYSBzaW5nbGUgbWFwcGluZyBmcm9tIG9yaWdpbmFsIHNvdXJjZSBsaW5lIGFuZCBjb2x1bW4gdG8gdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIGZvciB0aGlzIHNvdXJjZSBtYXAgYmVpbmcgY3JlYXRlZC4gVGhlIG1hcHBpbmdcbiAqIG9iamVjdCBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGdlbmVyYXRlZDogQW4gb2JqZWN0IHdpdGggdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zLlxuICogICAtIG9yaWdpbmFsOiBBbiBvYmplY3Qgd2l0aCB0aGUgb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSAocmVsYXRpdmUgdG8gdGhlIHNvdXJjZVJvb3QpLlxuICogICAtIG5hbWU6IEFuIG9wdGlvbmFsIG9yaWdpbmFsIHRva2VuIG5hbWUgZm9yIHRoaXMgbWFwcGluZy5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hZGRNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2FkZE1hcHBpbmcoYUFyZ3MpIHtcbiAgICB2YXIgZ2VuZXJhdGVkID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdnZW5lcmF0ZWQnKTtcbiAgICB2YXIgb3JpZ2luYWwgPSB1dGlsLmdldEFyZyhhQXJncywgJ29yaWdpbmFsJywgbnVsbCk7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJywgbnVsbCk7XG4gICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhhQXJncywgJ25hbWUnLCBudWxsKTtcblxuICAgIGlmICghdGhpcy5fc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRlTWFwcGluZyhnZW5lcmF0ZWQsIG9yaWdpbmFsLCBzb3VyY2UsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgc291cmNlID0gU3RyaW5nKHNvdXJjZSk7XG4gICAgICBpZiAoIXRoaXMuX3NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICBuYW1lID0gU3RyaW5nKG5hbWUpO1xuICAgICAgaWYgKCF0aGlzLl9uYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgdGhpcy5fbmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX21hcHBpbmdzLmFkZCh7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogZ2VuZXJhdGVkLmNvbHVtbixcbiAgICAgIG9yaWdpbmFsTGluZTogb3JpZ2luYWwgIT0gbnVsbCAmJiBvcmlnaW5hbC5saW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwuY29sdW1uLFxuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBuYW1lOiBuYW1lXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3NldFNvdXJjZUNvbnRlbnQoYVNvdXJjZUZpbGUsIGFTb3VyY2VDb250ZW50KSB7XG4gICAgdmFyIHNvdXJjZSA9IGFTb3VyY2VGaWxlO1xuICAgIGlmICh0aGlzLl9zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5fc291cmNlUm9vdCwgc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoYVNvdXJjZUNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgLy8gQWRkIHRoZSBzb3VyY2UgY29udGVudCB0byB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgX3NvdXJjZXNDb250ZW50cyBtYXAgaWYgdGhlIHByb3BlcnR5IGlzIG51bGwuXG4gICAgICBpZiAoIXRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoc291cmNlKV0gPSBhU291cmNlQ29udGVudDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBzb3VyY2UgZmlsZSBmcm9tIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcC5cbiAgICAgIC8vIElmIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcCBpcyBlbXB0eSwgc2V0IHRoZSBwcm9wZXJ0eSB0byBudWxsLlxuICAgICAgZGVsZXRlIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3NvdXJjZXNDb250ZW50cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIG1hcHBpbmdzIG9mIGEgc3ViLXNvdXJjZS1tYXAgZm9yIGEgc3BlY2lmaWMgc291cmNlIGZpbGUgdG8gdGhlXG4gKiBzb3VyY2UgbWFwIGJlaW5nIGdlbmVyYXRlZC4gRWFjaCBtYXBwaW5nIHRvIHRoZSBzdXBwbGllZCBzb3VyY2UgZmlsZSBpc1xuICogcmV3cml0dGVuIHVzaW5nIHRoZSBzdXBwbGllZCBzb3VyY2UgbWFwLiBOb3RlOiBUaGUgcmVzb2x1dGlvbiBmb3IgdGhlXG4gKiByZXN1bHRpbmcgbWFwcGluZ3MgaXMgdGhlIG1pbmltaXVtIG9mIHRoaXMgbWFwIGFuZCB0aGUgc3VwcGxpZWQgbWFwLlxuICpcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBhU291cmNlRmlsZSBPcHRpb25hbC4gVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZS5cbiAqICAgICAgICBJZiBvbWl0dGVkLCBTb3VyY2VNYXBDb25zdW1lcidzIGZpbGUgcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICogQHBhcmFtIGFTb3VyY2VNYXBQYXRoIE9wdGlvbmFsLiBUaGUgZGlybmFtZSBvZiB0aGUgcGF0aCB0byB0aGUgc291cmNlIG1hcFxuICogICAgICAgIHRvIGJlIGFwcGxpZWQuIElmIHJlbGF0aXZlLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgU291cmNlTWFwQ29uc3VtZXIuXG4gKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgbmVlZGVkIHdoZW4gdGhlIHR3byBzb3VyY2UgbWFwcyBhcmVuJ3QgaW4gdGhlIHNhbWVcbiAqICAgICAgICBkaXJlY3RvcnksIGFuZCB0aGUgc291cmNlIG1hcCB0byBiZSBhcHBsaWVkIGNvbnRhaW5zIHJlbGF0aXZlIHNvdXJjZVxuICogICAgICAgIHBhdGhzLiBJZiBzbywgdGhvc2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIG5lZWQgdG8gYmUgcmV3cml0dGVuXG4gKiAgICAgICAgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvci5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hcHBseVNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hcHBseVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIsIGFTb3VyY2VGaWxlLCBhU291cmNlTWFwUGF0aCkge1xuICAgIHZhciBzb3VyY2VGaWxlID0gYVNvdXJjZUZpbGU7XG4gICAgLy8gSWYgYVNvdXJjZUZpbGUgaXMgb21pdHRlZCwgd2Ugd2lsbCB1c2UgdGhlIGZpbGUgcHJvcGVydHkgb2YgdGhlIFNvdXJjZU1hcFxuICAgIGlmIChhU291cmNlRmlsZSA9PSBudWxsKSB7XG4gICAgICBpZiAoYVNvdXJjZU1hcENvbnN1bWVyLmZpbGUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1NvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgcmVxdWlyZXMgZWl0aGVyIGFuIGV4cGxpY2l0IHNvdXJjZSBmaWxlLCAnICtcbiAgICAgICAgICAnb3IgdGhlIHNvdXJjZSBtYXBcXCdzIFwiZmlsZVwiIHByb3BlcnR5LiBCb3RoIHdlcmUgb21pdHRlZC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzb3VyY2VGaWxlID0gYVNvdXJjZU1hcENvbnN1bWVyLmZpbGU7XG4gICAgfVxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5fc291cmNlUm9vdDtcbiAgICAvLyBNYWtlIFwic291cmNlRmlsZVwiIHJlbGF0aXZlIGlmIGFuIGFic29sdXRlIFVybCBpcyBwYXNzZWQuXG4gICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgc291cmNlRmlsZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgfVxuICAgIC8vIEFwcGx5aW5nIHRoZSBTb3VyY2VNYXAgY2FuIGFkZCBhbmQgcmVtb3ZlIGl0ZW1zIGZyb20gdGhlIHNvdXJjZXMgYW5kXG4gICAgLy8gdGhlIG5hbWVzIGFycmF5LlxuICAgIHZhciBuZXdTb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gICAgdmFyIG5ld05hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgICAvLyBGaW5kIG1hcHBpbmdzIGZvciB0aGUgXCJzb3VyY2VGaWxlXCJcbiAgICB0aGlzLl9tYXBwaW5ncy51bnNvcnRlZEZvckVhY2goZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gc291cmNlRmlsZSAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGl0IGNhbiBiZSBtYXBwZWQgYnkgdGhlIHNvdXJjZSBtYXAsIHRoZW4gdXBkYXRlIHRoZSBtYXBwaW5nLlxuICAgICAgICB2YXIgb3JpZ2luYWwgPSBhU291cmNlTWFwQ29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3JpZ2luYWwuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBDb3B5IG1hcHBpbmdcbiAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IG9yaWdpbmFsLnNvdXJjZTtcbiAgICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbWFwcGluZy5zb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmxpbmU7XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgICAgICBpZiAob3JpZ2luYWwubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXBwaW5nLm5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgIW5ld1NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgbmV3U291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICBpZiAobmFtZSAhPSBudWxsICYmICFuZXdOYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgbmV3TmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuXG4gICAgfSwgdGhpcyk7XG4gICAgdGhpcy5fc291cmNlcyA9IG5ld1NvdXJjZXM7XG4gICAgdGhpcy5fbmFtZXMgPSBuZXdOYW1lcztcblxuICAgIC8vIENvcHkgc291cmNlc0NvbnRlbnRzIG9mIGFwcGxpZWQgbWFwLlxuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChhU291cmNlTWFwUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhU291cmNlTWFwUGF0aCwgc291cmNlRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBBIG1hcHBpbmcgY2FuIGhhdmUgb25lIG9mIHRoZSB0aHJlZSBsZXZlbHMgb2YgZGF0YTpcbiAqXG4gKiAgIDEuIEp1c3QgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi5cbiAqICAgMi4gVGhlIEdlbmVyYXRlZCBwb3NpdGlvbiwgb3JpZ2luYWwgcG9zaXRpb24sIGFuZCBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIDMuIEdlbmVyYXRlZCBhbmQgb3JpZ2luYWwgcG9zaXRpb24sIG9yaWdpbmFsIHNvdXJjZSwgYXMgd2VsbCBhcyBhIG5hbWVcbiAqICAgICAgdG9rZW4uXG4gKlxuICogVG8gbWFpbnRhaW4gY29uc2lzdGVuY3ksIHdlIHZhbGlkYXRlIHRoYXQgYW55IG5ldyBtYXBwaW5nIGJlaW5nIGFkZGVkIGZhbGxzXG4gKiBpbiB0byBvbmUgb2YgdGhlc2UgY2F0ZWdvcmllcy5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGVNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3ZhbGlkYXRlTWFwcGluZyhhR2VuZXJhdGVkLCBhT3JpZ2luYWwsIGFTb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYU5hbWUpIHtcbiAgICAvLyBXaGVuIGFPcmlnaW5hbCBpcyB0cnV0aHkgYnV0IGhhcyBlbXB0eSB2YWx1ZXMgZm9yIC5saW5lIGFuZCAuY29sdW1uLFxuICAgIC8vIGl0IGlzIG1vc3QgbGlrZWx5IGEgcHJvZ3JhbW1lciBlcnJvci4gSW4gdGhpcyBjYXNlIHdlIHRocm93IGEgdmVyeVxuICAgIC8vIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UgdG8gdHJ5IHRvIGd1aWRlIHRoZW0gdGhlIHJpZ2h0IHdheS5cbiAgICAvLyBGb3IgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXIvcG9seW1lci1idW5kbGVyL3B1bGwvNTE5XG4gICAgaWYgKGFPcmlnaW5hbCAmJiB0eXBlb2YgYU9yaWdpbmFsLmxpbmUgIT09ICdudW1iZXInICYmIHR5cGVvZiBhT3JpZ2luYWwuY29sdW1uICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnb3JpZ2luYWwubGluZSBhbmQgb3JpZ2luYWwuY29sdW1uIGFyZSBub3QgbnVtYmVycyAtLSB5b3UgcHJvYmFibHkgbWVhbnQgdG8gb21pdCAnICtcbiAgICAgICAgICAgICd0aGUgb3JpZ2luYWwgbWFwcGluZyBlbnRpcmVseSBhbmQgb25seSBtYXAgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi4gSWYgc28sIHBhc3MgJyArXG4gICAgICAgICAgICAnbnVsbCBmb3IgdGhlIG9yaWdpbmFsIG1hcHBpbmcgaW5zdGVhZCBvZiBhbiBvYmplY3Qgd2l0aCBlbXB0eSBvciBudWxsIHZhbHVlcy4nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAmJiBhR2VuZXJhdGVkLmxpbmUgPiAwICYmIGFHZW5lcmF0ZWQuY29sdW1uID49IDBcbiAgICAgICAgJiYgIWFPcmlnaW5hbCAmJiAhYVNvdXJjZSAmJiAhYU5hbWUpIHtcbiAgICAgIC8vIENhc2UgMS5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxzZSBpZiAoYUdlbmVyYXRlZCAmJiAnbGluZScgaW4gYUdlbmVyYXRlZCAmJiAnY29sdW1uJyBpbiBhR2VuZXJhdGVkXG4gICAgICAgICAgICAgJiYgYU9yaWdpbmFsICYmICdsaW5lJyBpbiBhT3JpZ2luYWwgJiYgJ2NvbHVtbicgaW4gYU9yaWdpbmFsXG4gICAgICAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICAgICAgJiYgYU9yaWdpbmFsLmxpbmUgPiAwICYmIGFPcmlnaW5hbC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFTb3VyY2UpIHtcbiAgICAgIC8vIENhc2VzIDIgYW5kIDMuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1hcHBpbmc6ICcgKyBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGdlbmVyYXRlZDogYUdlbmVyYXRlZCxcbiAgICAgICAgc291cmNlOiBhU291cmNlLFxuICAgICAgICBvcmlnaW5hbDogYU9yaWdpbmFsLFxuICAgICAgICBuYW1lOiBhTmFtZVxuICAgICAgfSkpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBTZXJpYWxpemUgdGhlIGFjY3VtdWxhdGVkIG1hcHBpbmdzIGluIHRvIHRoZSBzdHJlYW0gb2YgYmFzZSA2NCBWTFFzXG4gKiBzcGVjaWZpZWQgYnkgdGhlIHNvdXJjZSBtYXAgZm9ybWF0LlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl9zZXJpYWxpemVNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXJpYWxpemVNYXBwaW5ncygpIHtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbExpbmUgPSAwO1xuICAgIHZhciBwcmV2aW91c05hbWUgPSAwO1xuICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgIHZhciBuZXh0O1xuICAgIHZhciBtYXBwaW5nO1xuICAgIHZhciBuYW1lSWR4O1xuICAgIHZhciBzb3VyY2VJZHg7XG5cbiAgICB2YXIgbWFwcGluZ3MgPSB0aGlzLl9tYXBwaW5ncy50b0FycmF5KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG1hcHBpbmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBtYXBwaW5nID0gbWFwcGluZ3NbaV07XG4gICAgICBuZXh0ID0gJydcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgICAgd2hpbGUgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbmV4dCArPSAnOyc7XG4gICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICBpZiAoIXV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZywgbWFwcGluZ3NbaSAtIDFdKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHQgKz0gJywnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c0dlbmVyYXRlZENvbHVtbik7XG4gICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VJZHggPSB0aGlzLl9zb3VyY2VzLmluZGV4T2YobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUoc291cmNlSWR4IC0gcHJldmlvdXNTb3VyY2UpO1xuICAgICAgICBwcmV2aW91c1NvdXJjZSA9IHNvdXJjZUlkeDtcblxuICAgICAgICAvLyBsaW5lcyBhcmUgc3RvcmVkIDAtYmFzZWQgaW4gU291cmNlTWFwIHNwZWMgdmVyc2lvbiAzXG4gICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsTGluZSAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c09yaWdpbmFsTGluZSk7XG4gICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmUgLSAxO1xuXG4gICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbENvbHVtbik7XG4gICAgICAgIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIGlmIChtYXBwaW5nLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5hbWVJZHggPSB0aGlzLl9uYW1lcy5pbmRleE9mKG1hcHBpbmcubmFtZSk7XG4gICAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKG5hbWVJZHggLSBwcmV2aW91c05hbWUpO1xuICAgICAgICAgIHByZXZpb3VzTmFtZSA9IG5hbWVJZHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0ICs9IG5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KGFTb3VyY2VzLCBhU291cmNlUm9vdCkge1xuICAgIHJldHVybiBhU291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoYVNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKGFTb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgfVxuICAgICAgdmFyIGtleSA9IHV0aWwudG9TZXRTdHJpbmcoc291cmNlKTtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fc291cmNlc0NvbnRlbnRzLCBrZXkpXG4gICAgICAgID8gdGhpcy5fc291cmNlc0NvbnRlbnRzW2tleV1cbiAgICAgICAgOiBudWxsO1xuICAgIH0sIHRoaXMpO1xuICB9O1xuXG4vKipcbiAqIEV4dGVybmFsaXplIHRoZSBzb3VyY2UgbWFwLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvSlNPTiA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl90b0pTT04oKSB7XG4gICAgdmFyIG1hcCA9IHtcbiAgICAgIHZlcnNpb246IHRoaXMuX3ZlcnNpb24sXG4gICAgICBzb3VyY2VzOiB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKSxcbiAgICAgIG5hbWVzOiB0aGlzLl9uYW1lcy50b0FycmF5KCksXG4gICAgICBtYXBwaW5nczogdGhpcy5fc2VyaWFsaXplTWFwcGluZ3MoKVxuICAgIH07XG4gICAgaWYgKHRoaXMuX2ZpbGUgIT0gbnVsbCkge1xuICAgICAgbWFwLmZpbGUgPSB0aGlzLl9maWxlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBtYXAuc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIG1hcC5zb3VyY2VzQ29udGVudCA9IHRoaXMuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQobWFwLnNvdXJjZXMsIG1hcC5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xuICB9O1xuXG4vKipcbiAqIFJlbmRlciB0aGUgc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQgdG8gYSBzdHJpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUudG9TdHJpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudG9KU09OKCkpO1xuICB9O1xuXG5leHBvcnRzLlNvdXJjZU1hcEdlbmVyYXRvciA9IFNvdXJjZU1hcEdlbmVyYXRvcjtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIFNvdXJjZU1hcEdlbmVyYXRvciA9IHJlcXVpcmUoJy4vc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4vLyBNYXRjaGVzIGEgV2luZG93cy1zdHlsZSBgXFxyXFxuYCBuZXdsaW5lIG9yIGEgYFxcbmAgbmV3bGluZSB1c2VkIGJ5IGFsbCBvdGhlclxuLy8gb3BlcmF0aW5nIHN5c3RlbXMgdGhlc2UgZGF5cyAoY2FwdHVyaW5nIHRoZSByZXN1bHQpLlxudmFyIFJFR0VYX05FV0xJTkUgPSAvKFxccj9cXG4pLztcblxuLy8gTmV3bGluZSBjaGFyYWN0ZXIgY29kZSBmb3IgY2hhckNvZGVBdCgpIGNvbXBhcmlzb25zXG52YXIgTkVXTElORV9DT0RFID0gMTA7XG5cbi8vIFByaXZhdGUgc3ltYm9sIGZvciBpZGVudGlmeWluZyBgU291cmNlTm9kZWBzIHdoZW4gbXVsdGlwbGUgdmVyc2lvbnMgb2Zcbi8vIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkgYXJlIGxvYWRlZC4gVGhpcyBNVVNUIE5PVCBDSEFOR0UgYWNyb3NzXG4vLyB2ZXJzaW9ucyFcbnZhciBpc1NvdXJjZU5vZGUgPSBcIiQkJGlzU291cmNlTm9kZSQkJFwiO1xuXG4vKipcbiAqIFNvdXJjZU5vZGVzIHByb3ZpZGUgYSB3YXkgdG8gYWJzdHJhY3Qgb3ZlciBpbnRlcnBvbGF0aW5nL2NvbmNhdGVuYXRpbmdcbiAqIHNuaXBwZXRzIG9mIGdlbmVyYXRlZCBKYXZhU2NyaXB0IHNvdXJjZSBjb2RlIHdoaWxlIG1haW50YWluaW5nIHRoZSBsaW5lIGFuZFxuICogY29sdW1uIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUuXG4gKlxuICogQHBhcmFtIGFMaW5lIFRoZSBvcmlnaW5hbCBsaW5lIG51bWJlci5cbiAqIEBwYXJhbSBhQ29sdW1uIFRoZSBvcmlnaW5hbCBjb2x1bW4gbnVtYmVyLlxuICogQHBhcmFtIGFTb3VyY2UgVGhlIG9yaWdpbmFsIHNvdXJjZSdzIGZpbGVuYW1lLlxuICogQHBhcmFtIGFDaHVua3MgT3B0aW9uYWwuIEFuIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggYXJlIHNuaXBwZXRzIG9mXG4gKiAgICAgICAgZ2VuZXJhdGVkIEpTLCBvciBvdGhlciBTb3VyY2VOb2Rlcy5cbiAqIEBwYXJhbSBhTmFtZSBUaGUgb3JpZ2luYWwgaWRlbnRpZmllci5cbiAqL1xuZnVuY3Rpb24gU291cmNlTm9kZShhTGluZSwgYUNvbHVtbiwgYVNvdXJjZSwgYUNodW5rcywgYU5hbWUpIHtcbiAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICB0aGlzLnNvdXJjZUNvbnRlbnRzID0ge307XG4gIHRoaXMubGluZSA9IGFMaW5lID09IG51bGwgPyBudWxsIDogYUxpbmU7XG4gIHRoaXMuY29sdW1uID0gYUNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGFDb2x1bW47XG4gIHRoaXMuc291cmNlID0gYVNvdXJjZSA9PSBudWxsID8gbnVsbCA6IGFTb3VyY2U7XG4gIHRoaXMubmFtZSA9IGFOYW1lID09IG51bGwgPyBudWxsIDogYU5hbWU7XG4gIHRoaXNbaXNTb3VyY2VOb2RlXSA9IHRydWU7XG4gIGlmIChhQ2h1bmtzICE9IG51bGwpIHRoaXMuYWRkKGFDaHVua3MpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBTb3VyY2VOb2RlIGZyb20gZ2VuZXJhdGVkIGNvZGUgYW5kIGEgU291cmNlTWFwQ29uc3VtZXIuXG4gKlxuICogQHBhcmFtIGFHZW5lcmF0ZWRDb2RlIFRoZSBnZW5lcmF0ZWQgY29kZVxuICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgU291cmNlTWFwIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhUmVsYXRpdmVQYXRoIE9wdGlvbmFsLiBUaGUgcGF0aCB0aGF0IHJlbGF0aXZlIHNvdXJjZXMgaW4gdGhlXG4gKiAgICAgICAgU291cmNlTWFwQ29uc3VtZXIgc2hvdWxkIGJlIHJlbGF0aXZlIHRvLlxuICovXG5Tb3VyY2VOb2RlLmZyb21TdHJpbmdXaXRoU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcChhR2VuZXJhdGVkQ29kZSwgYVNvdXJjZU1hcENvbnN1bWVyLCBhUmVsYXRpdmVQYXRoKSB7XG4gICAgLy8gVGhlIFNvdXJjZU5vZGUgd2Ugd2FudCB0byBmaWxsIHdpdGggdGhlIGdlbmVyYXRlZCBjb2RlXG4gICAgLy8gYW5kIHRoZSBTb3VyY2VNYXBcbiAgICB2YXIgbm9kZSA9IG5ldyBTb3VyY2VOb2RlKCk7XG5cbiAgICAvLyBBbGwgZXZlbiBpbmRpY2VzIG9mIHRoaXMgYXJyYXkgYXJlIG9uZSBsaW5lIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSxcbiAgICAvLyB3aGlsZSBhbGwgb2RkIGluZGljZXMgYXJlIHRoZSBuZXdsaW5lcyBiZXR3ZWVuIHR3byBhZGphY2VudCBsaW5lc1xuICAgIC8vIChzaW5jZSBgUkVHRVhfTkVXTElORWAgY2FwdHVyZXMgaXRzIG1hdGNoKS5cbiAgICAvLyBQcm9jZXNzZWQgZnJhZ21lbnRzIGFyZSBhY2Nlc3NlZCBieSBjYWxsaW5nIGBzaGlmdE5leHRMaW5lYC5cbiAgICB2YXIgcmVtYWluaW5nTGluZXMgPSBhR2VuZXJhdGVkQ29kZS5zcGxpdChSRUdFWF9ORVdMSU5FKTtcbiAgICB2YXIgcmVtYWluaW5nTGluZXNJbmRleCA9IDA7XG4gICAgdmFyIHNoaWZ0TmV4dExpbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBsaW5lQ29udGVudHMgPSBnZXROZXh0TGluZSgpO1xuICAgICAgLy8gVGhlIGxhc3QgbGluZSBvZiBhIGZpbGUgbWlnaHQgbm90IGhhdmUgYSBuZXdsaW5lLlxuICAgICAgdmFyIG5ld0xpbmUgPSBnZXROZXh0TGluZSgpIHx8IFwiXCI7XG4gICAgICByZXR1cm4gbGluZUNvbnRlbnRzICsgbmV3TGluZTtcblxuICAgICAgZnVuY3Rpb24gZ2V0TmV4dExpbmUoKSB7XG4gICAgICAgIHJldHVybiByZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoID9cbiAgICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXgrK10gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIHBvc2l0aW9uIG9mIFwicmVtYWluaW5nTGluZXNcIlxuICAgIHZhciBsYXN0R2VuZXJhdGVkTGluZSA9IDEsIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuXG4gICAgLy8gVGhlIGdlbmVyYXRlIFNvdXJjZU5vZGVzIHdlIG5lZWQgYSBjb2RlIHJhbmdlLlxuICAgIC8vIFRvIGV4dHJhY3QgaXQgY3VycmVudCBhbmQgbGFzdCBtYXBwaW5nIGlzIHVzZWQuXG4gICAgLy8gSGVyZSB3ZSBzdG9yZSB0aGUgbGFzdCBtYXBwaW5nLlxuICAgIHZhciBsYXN0TWFwcGluZyA9IG51bGw7XG5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIGlmIChsYXN0TWFwcGluZyAhPT0gbnVsbCkge1xuICAgICAgICAvLyBXZSBhZGQgdGhlIGNvZGUgZnJvbSBcImxhc3RNYXBwaW5nXCIgdG8gXCJtYXBwaW5nXCI6XG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZXJlIGlzIGEgbmV3IGxpbmUgaW4gYmV0d2Vlbi5cbiAgICAgICAgaWYgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgLy8gQXNzb2NpYXRlIGZpcnN0IGxpbmUgd2l0aCBcImxhc3RNYXBwaW5nXCJcbiAgICAgICAgICBhZGRNYXBwaW5nV2l0aENvZGUobGFzdE1hcHBpbmcsIHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIGNvZGUgaXMgYWRkZWQgd2l0aG91dCBtYXBwaW5nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmV3IGxpbmUgaW4gYmV0d2Vlbi5cbiAgICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIGNvZGUgYmV0d2VlbiBcImxhc3RHZW5lcmF0ZWRDb2x1bW5cIiBhbmRcbiAgICAgICAgICAvLyBcIm1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXCIgd2l0aCBcImxhc3RNYXBwaW5nXCJcbiAgICAgICAgICB2YXIgbmV4dExpbmUgPSByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4XSB8fCAnJztcbiAgICAgICAgICB2YXIgY29kZSA9IG5leHRMaW5lLnN1YnN0cigwLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcbiAgICAgICAgICBhZGRNYXBwaW5nV2l0aENvZGUobGFzdE1hcHBpbmcsIGNvZGUpO1xuICAgICAgICAgIC8vIE5vIG1vcmUgcmVtYWluaW5nIGNvZGUsIGNvbnRpbnVlXG4gICAgICAgICAgbGFzdE1hcHBpbmcgPSBtYXBwaW5nO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gV2UgYWRkIHRoZSBnZW5lcmF0ZWQgY29kZSB1bnRpbCB0aGUgZmlyc3QgbWFwcGluZ1xuICAgICAgLy8gdG8gdGhlIFNvdXJjZU5vZGUgd2l0aG91dCBhbnkgbWFwcGluZy5cbiAgICAgIC8vIEVhY2ggbGluZSBpcyBhZGRlZCBhcyBzZXBhcmF0ZSBzdHJpbmcuXG4gICAgICB3aGlsZSAobGFzdEdlbmVyYXRlZExpbmUgPCBtYXBwaW5nLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgbm9kZS5hZGQoc2hpZnROZXh0TGluZSgpKTtcbiAgICAgICAgbGFzdEdlbmVyYXRlZExpbmUrKztcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0R2VuZXJhdGVkQ29sdW1uIDwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pIHtcbiAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgIG5vZGUuYWRkKG5leHRMaW5lLnN1YnN0cigwLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbikpO1xuICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4XSA9IG5leHRMaW5lLnN1YnN0cihtYXBwaW5nLmdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcbiAgICAgIH1cbiAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICB9LCB0aGlzKTtcbiAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgbWFwcGluZ3MuXG4gICAgaWYgKHJlbWFpbmluZ0xpbmVzSW5kZXggPCByZW1haW5pbmdMaW5lcy5sZW5ndGgpIHtcbiAgICAgIGlmIChsYXN0TWFwcGluZykge1xuICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIHJlbWFpbmluZyBjb2RlIGluIHRoZSBjdXJyZW50IGxpbmUgd2l0aCBcImxhc3RNYXBwaW5nXCJcbiAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgfVxuICAgICAgLy8gYW5kIGFkZCB0aGUgcmVtYWluaW5nIGxpbmVzIHdpdGhvdXQgYW55IG1hcHBpbmdcbiAgICAgIG5vZGUuYWRkKHJlbWFpbmluZ0xpbmVzLnNwbGljZShyZW1haW5pbmdMaW5lc0luZGV4KS5qb2luKFwiXCIpKTtcbiAgICB9XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50IGludG8gU291cmNlTm9kZVxuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChhUmVsYXRpdmVQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5qb2luKGFSZWxhdGl2ZVBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBub2RlO1xuXG4gICAgZnVuY3Rpb24gYWRkTWFwcGluZ1dpdGhDb2RlKG1hcHBpbmcsIGNvZGUpIHtcbiAgICAgIGlmIChtYXBwaW5nID09PSBudWxsIHx8IG1hcHBpbmcuc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm9kZS5hZGQoY29kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc291cmNlID0gYVJlbGF0aXZlUGF0aFxuICAgICAgICAgID8gdXRpbC5qb2luKGFSZWxhdGl2ZVBhdGgsIG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgIDogbWFwcGluZy5zb3VyY2U7XG4gICAgICAgIG5vZGUuYWRkKG5ldyBTb3VyY2VOb2RlKG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcubmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBZGQgYSBjaHVuayBvZiBnZW5lcmF0ZWQgSlMgdG8gdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2FkZChhQ2h1bmspIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYUNodW5rKSkge1xuICAgIGFDaHVuay5mb3JFYWNoKGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgdGhpcy5hZGQoY2h1bmspO1xuICAgIH0sIHRoaXMpO1xuICB9XG4gIGVsc2UgaWYgKGFDaHVua1tpc1NvdXJjZU5vZGVdIHx8IHR5cGVvZiBhQ2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAoYUNodW5rKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goYUNodW5rKTtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBZGQgYSBjaHVuayBvZiBnZW5lcmF0ZWQgSlMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIHNvdXJjZSBub2RlLlxuICpcbiAqIEBwYXJhbSBhQ2h1bmsgQSBzdHJpbmcgc25pcHBldCBvZiBnZW5lcmF0ZWQgSlMgY29kZSwgYW5vdGhlciBpbnN0YW5jZSBvZlxuICogICAgICAgIFNvdXJjZU5vZGUsIG9yIGFuIGFycmF5IHdoZXJlIGVhY2ggbWVtYmVyIGlzIG9uZSBvZiB0aG9zZSB0aGluZ3MuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnByZXBlbmQgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3ByZXBlbmQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBmb3IgKHZhciBpID0gYUNodW5rLmxlbmd0aC0xOyBpID49IDA7IGktLSkge1xuICAgICAgdGhpcy5wcmVwZW5kKGFDaHVua1tpXSk7XG4gICAgfVxuICB9XG4gIGVsc2UgaWYgKGFDaHVua1tpc1NvdXJjZU5vZGVdIHx8IHR5cGVvZiBhQ2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICB0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYUNodW5rKTtcbiAgfVxuICBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgXCJFeHBlY3RlZCBhIFNvdXJjZU5vZGUsIHN0cmluZywgb3IgYW4gYXJyYXkgb2YgU291cmNlTm9kZXMgYW5kIHN0cmluZ3MuIEdvdCBcIiArIGFDaHVua1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFdhbGsgb3ZlciB0aGUgdHJlZSBvZiBKUyBzbmlwcGV0cyBpbiB0aGlzIG5vZGUgYW5kIGl0cyBjaGlsZHJlbi4gVGhlXG4gKiB3YWxraW5nIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHNuaXBwZXQgb2YgSlMgYW5kIGlzIHBhc3NlZCB0aGF0XG4gKiBzbmlwcGV0IGFuZCB0aGUgaXRzIG9yaWdpbmFsIGFzc29jaWF0ZWQgc291cmNlJ3MgbGluZS9jb2x1bW4gbG9jYXRpb24uXG4gKlxuICogQHBhcmFtIGFGbiBUaGUgdHJhdmVyc2FsIGZ1bmN0aW9uLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS53YWxrID0gZnVuY3Rpb24gU291cmNlTm9kZV93YWxrKGFGbikge1xuICB2YXIgY2h1bms7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY2h1bmsgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgIGlmIChjaHVua1tpc1NvdXJjZU5vZGVdKSB7XG4gICAgICBjaHVuay53YWxrKGFGbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKGNodW5rICE9PSAnJykge1xuICAgICAgICBhRm4oY2h1bmssIHsgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZSxcbiAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIExpa2UgYFN0cmluZy5wcm90b3R5cGUuam9pbmAgZXhjZXB0IGZvciBTb3VyY2VOb2Rlcy4gSW5zZXJ0cyBgYVN0cmAgYmV0d2VlblxuICogZWFjaCBvZiBgdGhpcy5jaGlsZHJlbmAuXG4gKlxuICogQHBhcmFtIGFTZXAgVGhlIHNlcGFyYXRvci5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfam9pbihhU2VwKSB7XG4gIHZhciBuZXdDaGlsZHJlbjtcbiAgdmFyIGk7XG4gIHZhciBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDtcbiAgaWYgKGxlbiA+IDApIHtcbiAgICBuZXdDaGlsZHJlbiA9IFtdO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW4tMTsgaSsrKSB7XG4gICAgICBuZXdDaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaChhU2VwKTtcbiAgICB9XG4gICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICB0aGlzLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENhbGwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlIG9uIHRoZSB2ZXJ5IHJpZ2h0LW1vc3Qgc291cmNlIHNuaXBwZXQuIFVzZWZ1bFxuICogZm9yIHRyaW1taW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZW5kIG9mIGEgc291cmNlIG5vZGUsIGV0Yy5cbiAqXG4gKiBAcGFyYW0gYVBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVwbGFjZS5cbiAqIEBwYXJhbSBhUmVwbGFjZW1lbnQgVGhlIHRoaW5nIHRvIHJlcGxhY2UgdGhlIHBhdHRlcm4gd2l0aC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUucmVwbGFjZVJpZ2h0ID0gZnVuY3Rpb24gU291cmNlTm9kZV9yZXBsYWNlUmlnaHQoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCkge1xuICB2YXIgbGFzdENoaWxkID0gdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdO1xuICBpZiAobGFzdENoaWxkW2lzU291cmNlTm9kZV0pIHtcbiAgICBsYXN0Q2hpbGQucmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiBsYXN0Q2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdID0gbGFzdENoaWxkLnJlcGxhY2UoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKCcnLnJlcGxhY2UoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCkpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIHNvdXJjZSBjb250ZW50IGZvciBhIHNvdXJjZSBmaWxlLiBUaGlzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvclxuICogaW4gdGhlIHNvdXJjZXNDb250ZW50IGZpZWxkLlxuICpcbiAqIEBwYXJhbSBhU291cmNlRmlsZSBUaGUgZmlsZW5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlXG4gKiBAcGFyYW0gYVNvdXJjZUNvbnRlbnQgVGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnNldFNvdXJjZUNvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VOb2RlX3NldFNvdXJjZUNvbnRlbnQoYVNvdXJjZUZpbGUsIGFTb3VyY2VDb250ZW50KSB7XG4gICAgdGhpcy5zb3VyY2VDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKGFTb3VyY2VGaWxlKV0gPSBhU291cmNlQ29udGVudDtcbiAgfTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgU291cmNlTm9kZXMuIFRoZSB3YWxraW5nIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaFxuICogc291cmNlIGZpbGUgY29udGVudCBhbmQgaXMgcGFzc2VkIHRoZSBmaWxlbmFtZSBhbmQgc291cmNlIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIGFGbiBUaGUgdHJhdmVyc2FsIGZ1bmN0aW9uLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS53YWxrU291cmNlQ29udGVudHMgPVxuICBmdW5jdGlvbiBTb3VyY2VOb2RlX3dhbGtTb3VyY2VDb250ZW50cyhhRm4pIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV1baXNTb3VyY2VOb2RlXSkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLndhbGtTb3VyY2VDb250ZW50cyhhRm4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzb3VyY2VzID0gT2JqZWN0LmtleXModGhpcy5zb3VyY2VDb250ZW50cyk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNvdXJjZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGFGbih1dGlsLmZyb21TZXRTdHJpbmcoc291cmNlc1tpXSksIHRoaXMuc291cmNlQ29udGVudHNbc291cmNlc1tpXV0pO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlLiBXYWxrcyBvdmVyIHRoZSB0cmVlXG4gKiBhbmQgY29uY2F0ZW5hdGVzIGFsbCB0aGUgdmFyaW91cyBzbmlwcGV0cyB0b2dldGhlciB0byBvbmUgc3RyaW5nLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfdG9TdHJpbmcoKSB7XG4gIHZhciBzdHIgPSBcIlwiO1xuICB0aGlzLndhbGsoZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgc3RyICs9IGNodW5rO1xuICB9KTtcbiAgcmV0dXJuIHN0cjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc291cmNlIG5vZGUgYWxvbmcgd2l0aCBhIHNvdXJjZVxuICogbWFwLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS50b1N0cmluZ1dpdGhTb3VyY2VNYXAgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nV2l0aFNvdXJjZU1hcChhQXJncykge1xuICB2YXIgZ2VuZXJhdGVkID0ge1xuICAgIGNvZGU6IFwiXCIsXG4gICAgbGluZTogMSxcbiAgICBjb2x1bW46IDBcbiAgfTtcbiAgdmFyIG1hcCA9IG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IoYUFyZ3MpO1xuICB2YXIgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICB2YXIgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbExpbmUgPSBudWxsO1xuICB2YXIgbGFzdE9yaWdpbmFsQ29sdW1uID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbE5hbWUgPSBudWxsO1xuICB0aGlzLndhbGsoZnVuY3Rpb24gKGNodW5rLCBvcmlnaW5hbCkge1xuICAgIGdlbmVyYXRlZC5jb2RlICs9IGNodW5rO1xuICAgIGlmIChvcmlnaW5hbC5zb3VyY2UgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwubGluZSAhPT0gbnVsbFxuICAgICAgICAmJiBvcmlnaW5hbC5jb2x1bW4gIT09IG51bGwpIHtcbiAgICAgIGlmKGxhc3RPcmlnaW5hbFNvdXJjZSAhPT0gb3JpZ2luYWwuc291cmNlXG4gICAgICAgICB8fCBsYXN0T3JpZ2luYWxMaW5lICE9PSBvcmlnaW5hbC5saW5lXG4gICAgICAgICB8fCBsYXN0T3JpZ2luYWxDb2x1bW4gIT09IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTmFtZSAhPT0gb3JpZ2luYWwubmFtZSkge1xuICAgICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICAgIGxpbmU6IG9yaWdpbmFsLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG9yaWdpbmFsLnNvdXJjZTtcbiAgICAgIGxhc3RPcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgbGFzdE9yaWdpbmFsQ29sdW1uID0gb3JpZ2luYWwuY29sdW1uO1xuICAgICAgbGFzdE9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsLm5hbWU7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZU1hcHBpbmdBY3RpdmUpIHtcbiAgICAgIG1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDtcbiAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuZ3RoID0gY2h1bmsubGVuZ3RoOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICBpZiAoY2h1bmsuY2hhckNvZGVBdChpZHgpID09PSBORVdMSU5FX0NPREUpIHtcbiAgICAgICAgZ2VuZXJhdGVkLmxpbmUrKztcbiAgICAgICAgZ2VuZXJhdGVkLmNvbHVtbiA9IDA7XG4gICAgICAgIC8vIE1hcHBpbmdzIGVuZCBhdCBlb2xcbiAgICAgICAgaWYgKGlkeCArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZU1hcHBpbmdBY3RpdmUpIHtcbiAgICAgICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgICBzb3VyY2U6IG9yaWdpbmFsLnNvdXJjZSxcbiAgICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICAgIGxpbmU6IG9yaWdpbmFsLmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogb3JpZ2luYWwuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lOiBvcmlnaW5hbC5uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4rKztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB0aGlzLndhbGtTb3VyY2VDb250ZW50cyhmdW5jdGlvbiAoc291cmNlRmlsZSwgc291cmNlQ29udGVudCkge1xuICAgIG1hcC5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpO1xuICB9KTtcblxuICByZXR1cm4geyBjb2RlOiBnZW5lcmF0ZWQuY29kZSwgbWFwOiBtYXAgfTtcbn07XG5cbmV4cG9ydHMuU291cmNlTm9kZSA9IFNvdXJjZU5vZGU7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXIvb3B0aW9uc1xuICogb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gYXJncyBUaGUgb2JqZWN0IHdlIGFyZSBleHRyYWN0aW5nIHZhbHVlcyBmcm9tXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2UgYXJlIGdldHRpbmcuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIEFuIG9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZ1xuICogZnJvbSB0aGUgb2JqZWN0LiBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nLCBhblxuICogZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIGdldEFyZyhhQXJncywgYU5hbWUsIGFEZWZhdWx0VmFsdWUpIHtcbiAgaWYgKGFOYW1lIGluIGFBcmdzKSB7XG4gICAgcmV0dXJuIGFBcmdzW2FOYW1lXTtcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgcmV0dXJuIGFEZWZhdWx0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhTmFtZSArICdcIiBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LicpO1xuICB9XG59XG5leHBvcnRzLmdldEFyZyA9IGdldEFyZztcblxudmFyIHVybFJlZ2V4cCA9IC9eKD86KFtcXHcrXFwtLl0rKTopP1xcL1xcLyg/OihcXHcrOlxcdyspQCk/KFtcXHcuLV0qKSg/OjooXFxkKykpPyguKikkLztcbnZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXFwsLiskLztcblxuZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICB2YXIgbWF0Y2ggPSBhVXJsLm1hdGNoKHVybFJlZ2V4cCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgYXV0aDogbWF0Y2hbMl0sXG4gICAgaG9zdDogbWF0Y2hbM10sXG4gICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV1cbiAgfTtcbn1cbmV4cG9ydHMudXJsUGFyc2UgPSB1cmxQYXJzZTtcblxuZnVuY3Rpb24gdXJsR2VuZXJhdGUoYVBhcnNlZFVybCkge1xuICB2YXIgdXJsID0gJyc7XG4gIGlmIChhUGFyc2VkVXJsLnNjaGVtZSkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnNjaGVtZSArICc6JztcbiAgfVxuICB1cmwgKz0gJy8vJztcbiAgaWYgKGFQYXJzZWRVcmwuYXV0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwuaG9zdCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucG9ydCkge1xuICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBhdGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5leHBvcnRzLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gKlxuICogLSBSZXBsYWNlcyBjb25zZWN1dGl2ZSBzbGFzaGVzIHdpdGggb25lIHNsYXNoLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnPGRpcj4vLi4nIHBhcnRzLlxuICpcbiAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciB1cmwgdG8gbm9ybWFsaXplLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemUoYVBhdGgpIHtcbiAgdmFyIHBhdGggPSBhUGF0aDtcbiAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgaWYgKHVybCkge1xuICAgIGlmICghdXJsLnBhdGgpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG4gICAgcGF0aCA9IHVybC5wYXRoO1xuICB9XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpO1xuXG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoL1xcLysvKTtcbiAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgaWYgKHBhcnQgPT09ICcnKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJsYW5rIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLiBUcnlpbmcgdG8gZ29cbiAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHJvb3QuXG4gICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApO1xuICAgICAgICB1cCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7XG4gICAgICAgIHVwLS07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gIH1cblxuICBpZiAodXJsKSB7XG4gICAgdXJsLnBhdGggPSBwYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZSh1cmwpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbi8qKlxuICogSm9pbnMgdHdvIHBhdGhzL1VSTHMuXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBqb2luZWQgd2l0aCB0aGUgcm9vdC5cbiAqXG4gKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICogICBzY2hlbWUtcmVsYXRpdmUgVVJMOiBUaGVuIHRoZSBzY2hlbWUgb2YgYVJvb3QsIGlmIGFueSwgaXMgcHJlcGVuZGVkXG4gKiAgIGZpcnN0LlxuICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gKiAgIGlzIHVwZGF0ZWQgd2l0aCB0aGUgcmVzdWx0IGFuZCBhUm9vdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXN1bHRcbiAqICAgaXMgcmV0dXJuZWQuXG4gKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gKiAgIC0gT3RoZXJ3aXNlIHRoZSB0d28gcGF0aHMgYXJlIGpvaW5lZCB3aXRoIGEgc2xhc2guXG4gKiAtIEpvaW5pbmcgZm9yIGV4YW1wbGUgJ2h0dHA6Ly8nIGFuZCAnd3d3LmV4YW1wbGUuY29tJyBpcyBhbHNvIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gam9pbihhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuICBpZiAoYVBhdGggPT09IFwiXCIpIHtcbiAgICBhUGF0aCA9IFwiLlwiO1xuICB9XG4gIHZhciBhUGF0aFVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdCA9IGFSb290VXJsLnBhdGggfHwgJy8nO1xuICB9XG5cbiAgLy8gYGpvaW4oZm9vLCAnLy93d3cuZXhhbXBsZS5vcmcnKWBcbiAgaWYgKGFQYXRoVXJsICYmICFhUGF0aFVybC5zY2hlbWUpIHtcbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFQYXRoVXJsLnNjaGVtZSA9IGFSb290VXJsLnNjaGVtZTtcbiAgICB9XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgfVxuXG4gIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkge1xuICAgIHJldHVybiBhUGF0aDtcbiAgfVxuXG4gIC8vIGBqb2luKCdodHRwOi8vJywgJ3d3dy5leGFtcGxlLmNvbScpYFxuICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuXG4gIHZhciBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgID8gYVBhdGhcbiAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdFVybC5wYXRoID0gam9pbmVkO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uIChhUGF0aCkge1xuICByZXR1cm4gYVBhdGguY2hhckF0KDApID09PSAnLycgfHwgdXJsUmVnZXhwLnRlc3QoYVBhdGgpO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICovXG5mdW5jdGlvbiByZWxhdGl2ZShhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuXG4gIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHBhdGggdG8gYmUgYWJvdmUgdGhlIHJvb3QuIEluIHRoaXMgY2FzZSwgc2ltcGx5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgdGhlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlIHBhdGggd29uJ3Qgd29yay4gSW5zdGVhZCwgd2VcbiAgLy8gbmVlZCB0byByZW1vdmUgY29tcG9uZW50cyBmcm9tIHRoZSByb290IG9uZSBieSBvbmUsIHVudGlsIGVpdGhlciB3ZSBmaW5kXG4gIC8vIGEgcHJlZml4IHRoYXQgZml0cywgb3Igd2UgcnVuIG91dCBvZiBjb21wb25lbnRzIHRvIHJlbW92ZS5cbiAgdmFyIGxldmVsID0gMDtcbiAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpICE9PSAwKSB7XG4gICAgdmFyIGluZGV4ID0gYVJvb3QubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb25seSBwYXJ0IG9mIHRoZSByb290IHRoYXQgaXMgbGVmdCBpcyB0aGUgc2NoZW1lIChpLmUuIGh0dHA6Ly8sXG4gICAgLy8gZmlsZTovLy8sIGV0Yy4pLCBvbmUgb3IgbW9yZSBzbGFzaGVzICgvKSwgb3Igc2ltcGx5IG5vdGhpbmcgYXQgYWxsLCB3ZVxuICAgIC8vIGhhdmUgZXhoYXVzdGVkIGFsbCBjb21wb25lbnRzLCBzbyB0aGUgcGF0aCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHJvb3QuXG4gICAgYVJvb3QgPSBhUm9vdC5zbGljZSgwLCBpbmRleCk7XG4gICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXFwvXSs6XFwvKT9cXC8qJC8pKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgKytsZXZlbDtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBhZGQgYSBcIi4uL1wiIGZvciBlYWNoIGNvbXBvbmVudCB3ZSByZW1vdmVkIGZyb20gdGhlIHJvb3QuXG4gIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4oXCIuLi9cIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7XG59XG5leHBvcnRzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG5cbnZhciBzdXBwb3J0c051bGxQcm90byA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gISgnX19wcm90b19fJyBpbiBvYmopO1xufSgpKTtcblxuZnVuY3Rpb24gaWRlbnRpdHkgKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogQmVjYXVzZSBiZWhhdmlvciBnb2VzIHdhY2t5IHdoZW4geW91IHNldCBgX19wcm90b19fYCBvbiBvYmplY3RzLCB3ZVxuICogaGF2ZSB0byBwcmVmaXggYWxsIHRoZSBzdHJpbmdzIGluIG91ciBzZXQgd2l0aCBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL3B1bGwvMzEgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8zMFxuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5mdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMudG9TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogdG9TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiBhU3RyLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLmZyb21TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogZnJvbVNldFN0cmluZztcblxuZnVuY3Rpb24gaXNQcm90b1N0cmluZyhzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBzLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOSAvKiBcIl9fcHJvdG9fX1wiLmxlbmd0aCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMSkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAyKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDMpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNCkgIT09IDExNiAvKiAndCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA1KSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDYpICE9PSAxMTQgLyogJ3InICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNykgIT09IDExMiAvKiAncCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA4KSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDkpICE9PSA5NSAgLyogJ18nICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IGxlbmd0aCAtIDEwOyBpID49IDA7IGktLSkge1xuICAgIGlmIChzLmNoYXJDb2RlQXQoaSkgIT09IDM2IC8qICckJyAqLykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4sIGJ1dCBkaWZmZXJlbnQgZ2VuZXJhdGVkXG4gKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICogc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gIHZhciBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zID0gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnM7XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGRlZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBpbmRpY2VzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uLCBidXQgZGlmZmVyZW50XG4gKiBzb3VyY2UvbmFtZS9vcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYVxuICogbWFwcGluZyB3aXRoIGEgc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZDtcblxuZnVuY3Rpb24gc3RyY21wKGFTdHIxLCBhU3RyMikge1xuICBpZiAoYVN0cjEgPT09IGFTdHIyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAoYVN0cjEgPT09IG51bGwpIHtcbiAgICByZXR1cm4gMTsgLy8gYVN0cjIgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMiA9PT0gbnVsbCkge1xuICAgIHJldHVybiAtMTsgLy8gYVN0cjEgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMSA+IGFTdHIyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGluZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBzdHJpbmdzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZDtcblxuLyoqXG4gKiBTdHJpcCBhbnkgSlNPTiBYU1NJIGF2b2lkYW5jZSBwcmVmaXggZnJvbSB0aGUgc3RyaW5nIChhcyBkb2N1bWVudGVkXG4gKiBpbiB0aGUgc291cmNlIG1hcHMgc3BlY2lmaWNhdGlvbiksIGFuZCB0aGVuIHBhcnNlIHRoZSBzdHJpbmcgYXNcbiAqIEpTT04uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU291cmNlTWFwSW5wdXQoc3RyKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKHN0ci5yZXBsYWNlKC9eXFwpXX0nW15cXG5dKlxcbi8sICcnKSk7XG59XG5leHBvcnRzLnBhcnNlU291cmNlTWFwSW5wdXQgPSBwYXJzZVNvdXJjZU1hcElucHV0O1xuXG4vKipcbiAqIENvbXB1dGUgdGhlIFVSTCBvZiBhIHNvdXJjZSBnaXZlbiB0aGUgdGhlIHNvdXJjZSByb290LCB0aGUgc291cmNlJ3NcbiAqIFVSTCwgYW5kIHRoZSBzb3VyY2UgbWFwJ3MgVVJMLlxuICovXG5mdW5jdGlvbiBjb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKSB7XG4gIHNvdXJjZVVSTCA9IHNvdXJjZVVSTCB8fCAnJztcblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIC8vIFRoaXMgZm9sbG93cyB3aGF0IENocm9tZSBkb2VzLlxuICAgIGlmIChzb3VyY2VSb290W3NvdXJjZVJvb3QubGVuZ3RoIC0gMV0gIT09ICcvJyAmJiBzb3VyY2VVUkxbMF0gIT09ICcvJykge1xuICAgICAgc291cmNlUm9vdCArPSAnLyc7XG4gICAgfVxuICAgIC8vIFRoZSBzcGVjIHNheXM6XG4gICAgLy8gICBMaW5lIDQ6IEFuIG9wdGlvbmFsIHNvdXJjZSByb290LCB1c2VmdWwgZm9yIHJlbG9jYXRpbmcgc291cmNlXG4gICAgLy8gICBmaWxlcyBvbiBhIHNlcnZlciBvciByZW1vdmluZyByZXBlYXRlZCB2YWx1ZXMgaW4gdGhlXG4gICAgLy8gICDigJxzb3VyY2Vz4oCdIGVudHJ5LiAgVGhpcyB2YWx1ZSBpcyBwcmVwZW5kZWQgdG8gdGhlIGluZGl2aWR1YWxcbiAgICAvLyAgIGVudHJpZXMgaW4gdGhlIOKAnHNvdXJjZeKAnSBmaWVsZC5cbiAgICBzb3VyY2VVUkwgPSBzb3VyY2VSb290ICsgc291cmNlVVJMO1xuICB9XG5cbiAgLy8gSGlzdG9yaWNhbGx5LCBTb3VyY2VNYXBDb25zdW1lciBkaWQgbm90IHRha2UgdGhlIHNvdXJjZU1hcFVSTCBhc1xuICAvLyBhIHBhcmFtZXRlci4gIFRoaXMgbW9kZSBpcyBzdGlsbCBzb21ld2hhdCBzdXBwb3J0ZWQsIHdoaWNoIGlzIHdoeVxuICAvLyB0aGlzIGNvZGUgYmxvY2sgaXMgY29uZGl0aW9uYWwuICBIb3dldmVyLCBpdCdzIHByZWZlcmFibGUgdG8gcGFzc1xuICAvLyB0aGUgc291cmNlIG1hcCBVUkwgdG8gU291cmNlTWFwQ29uc3VtZXIsIHNvIHRoYXQgdGhpcyBmdW5jdGlvblxuICAvLyBjYW4gaW1wbGVtZW50IHRoZSBzb3VyY2UgVVJMIHJlc29sdXRpb24gYWxnb3JpdGhtIGFzIG91dGxpbmVkIGluXG4gIC8vIHRoZSBzcGVjLiAgVGhpcyBibG9jayBpcyBiYXNpY2FsbHkgdGhlIGVxdWl2YWxlbnQgb2Y6XG4gIC8vICAgIG5ldyBVUkwoc291cmNlVVJMLCBzb3VyY2VNYXBVUkwpLnRvU3RyaW5nKClcbiAgLy8gLi4uIGV4Y2VwdCBpdCBhdm9pZHMgdXNpbmcgVVJMLCB3aGljaCB3YXNuJ3QgYXZhaWxhYmxlIGluIHRoZVxuICAvLyBvbGRlciByZWxlYXNlcyBvZiBub2RlIHN0aWxsIHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnkuXG4gIC8vXG4gIC8vIFRoZSBzcGVjIHNheXM6XG4gIC8vICAgSWYgdGhlIHNvdXJjZXMgYXJlIG5vdCBhYnNvbHV0ZSBVUkxzIGFmdGVyIHByZXBlbmRpbmcgb2YgdGhlXG4gIC8vICAg4oCcc291cmNlUm9vdOKAnSwgdGhlIHNvdXJjZXMgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZVxuICAvLyAgIFNvdXJjZU1hcCAobGlrZSByZXNvbHZpbmcgc2NyaXB0IHNyYyBpbiBhIGh0bWwgZG9jdW1lbnQpLlxuICBpZiAoc291cmNlTWFwVVJMKSB7XG4gICAgdmFyIHBhcnNlZCA9IHVybFBhcnNlKHNvdXJjZU1hcFVSTCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNvdXJjZU1hcFVSTCBjb3VsZCBub3QgYmUgcGFyc2VkXCIpO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLnBhdGgpIHtcbiAgICAgIC8vIFN0cmlwIHRoZSBsYXN0IHBhdGggY29tcG9uZW50LCBidXQga2VlcCB0aGUgXCIvXCIuXG4gICAgICB2YXIgaW5kZXggPSBwYXJzZWQucGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgcGFyc2VkLnBhdGggPSBwYXJzZWQucGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlVVJMID0gam9pbih1cmxHZW5lcmF0ZShwYXJzZWQpLCBzb3VyY2VVUkwpO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZShzb3VyY2VVUkwpO1xufVxuZXhwb3J0cy5jb21wdXRlU291cmNlVVJMID0gY29tcHV0ZVNvdXJjZVVSTDtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1jb25zdW1lcicpLlNvdXJjZU1hcENvbnN1bWVyO1xuZXhwb3J0cy5Tb3VyY2VOb2RlID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW5vZGUnKS5Tb3VyY2VOb2RlO1xuIiwiLyogZ2xvYmFsIHdpbmRvdywgZXhwb3J0cywgZGVmaW5lICovXG5cbiFmdW5jdGlvbigpIHtcbiAgICAndXNlIHN0cmljdCdcblxuICAgIHZhciByZSA9IHtcbiAgICAgICAgbm90X3N0cmluZzogL1tec10vLFxuICAgICAgICBub3RfYm9vbDogL1tedF0vLFxuICAgICAgICBub3RfdHlwZTogL1teVF0vLFxuICAgICAgICBub3RfcHJpbWl0aXZlOiAvW152XS8sXG4gICAgICAgIG51bWJlcjogL1tkaWVmZ10vLFxuICAgICAgICBudW1lcmljX2FyZzogL1tiY2RpZWZndXhYXS8sXG4gICAgICAgIGpzb246IC9bal0vLFxuICAgICAgICBub3RfanNvbjogL1teal0vLFxuICAgICAgICB0ZXh0OiAvXlteXFx4MjVdKy8sXG4gICAgICAgIG1vZHVsbzogL15cXHgyNXsyfS8sXG4gICAgICAgIHBsYWNlaG9sZGVyOiAvXlxceDI1KD86KFsxLTldXFxkKilcXCR8XFwoKFteKV0rKVxcKSk/KFxcKyk/KDB8J1teJF0pPygtKT8oXFxkKyk/KD86XFwuKFxcZCspKT8oW2ItZ2lqb3N0VHV2eFhdKS8sXG4gICAgICAgIGtleTogL14oW2Etel9dW2Etel9cXGRdKikvaSxcbiAgICAgICAga2V5X2FjY2VzczogL15cXC4oW2Etel9dW2Etel9cXGRdKikvaSxcbiAgICAgICAgaW5kZXhfYWNjZXNzOiAvXlxcWyhcXGQrKVxcXS8sXG4gICAgICAgIHNpZ246IC9eWystXS9cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzcHJpbnRmKGtleSkge1xuICAgICAgICAvLyBgYXJndW1lbnRzYCBpcyBub3QgYW4gYXJyYXksIGJ1dCBzaG91bGQgYmUgZmluZSBmb3IgdGhpcyBjYWxsXG4gICAgICAgIHJldHVybiBzcHJpbnRmX2Zvcm1hdChzcHJpbnRmX3BhcnNlKGtleSksIGFyZ3VtZW50cylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2c3ByaW50ZihmbXQsIGFyZ3YpIHtcbiAgICAgICAgcmV0dXJuIHNwcmludGYuYXBwbHkobnVsbCwgW2ZtdF0uY29uY2F0KGFyZ3YgfHwgW10pKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNwcmludGZfZm9ybWF0KHBhcnNlX3RyZWUsIGFyZ3YpIHtcbiAgICAgICAgdmFyIGN1cnNvciA9IDEsIHRyZWVfbGVuZ3RoID0gcGFyc2VfdHJlZS5sZW5ndGgsIGFyZywgb3V0cHV0ID0gJycsIGksIGssIHBoLCBwYWQsIHBhZF9jaGFyYWN0ZXIsIHBhZF9sZW5ndGgsIGlzX3Bvc2l0aXZlLCBzaWduXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0cmVlX2xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcnNlX3RyZWVbaV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IHBhcnNlX3RyZWVbaV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwYXJzZV90cmVlW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHBoID0gcGFyc2VfdHJlZVtpXSAvLyBjb252ZW5pZW5jZSBwdXJwb3NlcyBvbmx5XG4gICAgICAgICAgICAgICAgaWYgKHBoLmtleXMpIHsgLy8ga2V5d29yZCBhcmd1bWVudFxuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd2W2N1cnNvcl1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHBoLmtleXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNwcmludGYoJ1tzcHJpbnRmXSBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IFwiJXNcIiBvZiB1bmRlZmluZWQgdmFsdWUgXCIlc1wiJywgcGgua2V5c1trXSwgcGgua2V5c1trLTFdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ1twaC5rZXlzW2tdXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBoLnBhcmFtX25vKSB7IC8vIHBvc2l0aW9uYWwgYXJndW1lbnQgKGV4cGxpY2l0KVxuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd2W3BoLnBhcmFtX25vXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgLy8gcG9zaXRpb25hbCBhcmd1bWVudCAoaW1wbGljaXQpXG4gICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3ZbY3Vyc29yKytdXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlLm5vdF90eXBlLnRlc3QocGgudHlwZSkgJiYgcmUubm90X3ByaW1pdGl2ZS50ZXN0KHBoLnR5cGUpICYmIGFyZyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZygpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlLm51bWVyaWNfYXJnLnRlc3QocGgudHlwZSkgJiYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInICYmIGlzTmFOKGFyZykpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc3ByaW50ZignW3NwcmludGZdIGV4cGVjdGluZyBudW1iZXIgYnV0IGZvdW5kICVUJywgYXJnKSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmUubnVtYmVyLnRlc3QocGgudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNfcG9zaXRpdmUgPSBhcmcgPj0gMFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGgudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBhcnNlSW50KGFyZywgMTApLnRvU3RyaW5nKDIpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoYXJnLCAxMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBKU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIHBoLndpZHRoID8gcGFyc2VJbnQocGgud2lkdGgpIDogMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2UnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGgucHJlY2lzaW9uID8gcGFyc2VGbG9hdChhcmcpLnRvRXhwb25lbnRpYWwocGgucHJlY2lzaW9uKSA6IHBhcnNlRmxvYXQoYXJnKS50b0V4cG9uZW50aWFsKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGgucHJlY2lzaW9uID8gcGFyc2VGbG9hdChhcmcpLnRvRml4ZWQocGgucHJlY2lzaW9uKSA6IHBhcnNlRmxvYXQoYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwaC5wcmVjaXNpb24gPyBTdHJpbmcoTnVtYmVyKGFyZy50b1ByZWNpc2lvbihwaC5wcmVjaXNpb24pKSkgOiBwYXJzZUZsb2F0KGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ28nOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBhcnNlSW50KGFyZywgMTApID4+PiAwKS50b1N0cmluZyg4KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBTdHJpbmcoYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBoLnByZWNpc2lvbiA/IGFyZy5zdWJzdHJpbmcoMCwgcGgucHJlY2lzaW9uKSA6IGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gU3RyaW5nKCEhYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBoLnByZWNpc2lvbiA/IGFyZy5zdWJzdHJpbmcoMCwgcGgucHJlY2lzaW9uKSA6IGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBhcnNlSW50KGFyZywgMTApID4+PiAwXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd2JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy52YWx1ZU9mKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwYXJzZUludChhcmcsIDEwKSA+Pj4gMCkudG9TdHJpbmcoMTYpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdYJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwYXJzZUludChhcmcsIDEwKSA+Pj4gMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZS5qc29uLnRlc3QocGgudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IGFyZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlLm51bWJlci50ZXN0KHBoLnR5cGUpICYmICghaXNfcG9zaXRpdmUgfHwgcGguc2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSBpc19wb3NpdGl2ZSA/ICcrJyA6ICctJ1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLnRvU3RyaW5nKCkucmVwbGFjZShyZS5zaWduLCAnJylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAnJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBhZF9jaGFyYWN0ZXIgPSBwaC5wYWRfY2hhciA/IHBoLnBhZF9jaGFyID09PSAnMCcgPyAnMCcgOiBwaC5wYWRfY2hhci5jaGFyQXQoMSkgOiAnICdcbiAgICAgICAgICAgICAgICAgICAgcGFkX2xlbmd0aCA9IHBoLndpZHRoIC0gKHNpZ24gKyBhcmcpLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICBwYWQgPSBwaC53aWR0aCA/IChwYWRfbGVuZ3RoID4gMCA/IHBhZF9jaGFyYWN0ZXIucmVwZWF0KHBhZF9sZW5ndGgpIDogJycpIDogJydcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IHBoLmFsaWduID8gc2lnbiArIGFyZyArIHBhZCA6IChwYWRfY2hhcmFjdGVyID09PSAnMCcgPyBzaWduICsgcGFkICsgYXJnIDogcGFkICsgc2lnbiArIGFyZylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dFxuICAgIH1cblxuICAgIHZhciBzcHJpbnRmX2NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gICAgZnVuY3Rpb24gc3ByaW50Zl9wYXJzZShmbXQpIHtcbiAgICAgICAgaWYgKHNwcmludGZfY2FjaGVbZm10XSkge1xuICAgICAgICAgICAgcmV0dXJuIHNwcmludGZfY2FjaGVbZm10XVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9mbXQgPSBmbXQsIG1hdGNoLCBwYXJzZV90cmVlID0gW10sIGFyZ19uYW1lcyA9IDBcbiAgICAgICAgd2hpbGUgKF9mbXQpIHtcbiAgICAgICAgICAgIGlmICgobWF0Y2ggPSByZS50ZXh0LmV4ZWMoX2ZtdCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZS5wdXNoKG1hdGNoWzBdKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKG1hdGNoID0gcmUubW9kdWxvLmV4ZWMoX2ZtdCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZS5wdXNoKCclJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChtYXRjaCA9IHJlLnBsYWNlaG9sZGVyLmV4ZWMoX2ZtdCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ19uYW1lcyB8PSAxXG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZF9saXN0ID0gW10sIHJlcGxhY2VtZW50X2ZpZWxkID0gbWF0Y2hbMl0sIGZpZWxkX21hdGNoID0gW11cbiAgICAgICAgICAgICAgICAgICAgaWYgKChmaWVsZF9tYXRjaCA9IHJlLmtleS5leGVjKHJlcGxhY2VtZW50X2ZpZWxkKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2xpc3QucHVzaChmaWVsZF9tYXRjaFsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocmVwbGFjZW1lbnRfZmllbGQgPSByZXBsYWNlbWVudF9maWVsZC5zdWJzdHJpbmcoZmllbGRfbWF0Y2hbMF0ubGVuZ3RoKSkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaWVsZF9tYXRjaCA9IHJlLmtleV9hY2Nlc3MuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2xpc3QucHVzaChmaWVsZF9tYXRjaFsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGZpZWxkX21hdGNoID0gcmUuaW5kZXhfYWNjZXNzLmV4ZWMocmVwbGFjZW1lbnRfZmllbGQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1tzcHJpbnRmXSBmYWlsZWQgdG8gcGFyc2UgbmFtZWQgYXJndW1lbnQga2V5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1tzcHJpbnRmXSBmYWlsZWQgdG8gcGFyc2UgbmFtZWQgYXJndW1lbnQga2V5JylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSA9IGZpZWxkX2xpc3RcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ19uYW1lcyB8PSAyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhcmdfbmFtZXMgPT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbc3ByaW50Zl0gbWl4aW5nIHBvc2l0aW9uYWwgYW5kIG5hbWVkIHBsYWNlaG9sZGVycyBpcyBub3QgKHlldCkgc3VwcG9ydGVkJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXJzZV90cmVlLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBtYXRjaFswXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX25vOiAgICBtYXRjaFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXM6ICAgICAgICBtYXRjaFsyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ246ICAgICAgICBtYXRjaFszXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZF9jaGFyOiAgICBtYXRjaFs0XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAgICAgICBtYXRjaFs1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAgICAgICBtYXRjaFs2XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbjogICBtYXRjaFs3XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgICAgICBtYXRjaFs4XVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gdW5leHBlY3RlZCBwbGFjZWhvbGRlcicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZm10ID0gX2ZtdC5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcHJpbnRmX2NhY2hlW2ZtdF0gPSBwYXJzZV90cmVlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZXhwb3J0IHRvIGVpdGhlciBicm93c2VyIG9yIG5vZGUuanNcbiAgICAgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBxdW90ZS1wcm9wcyAqL1xuICAgIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZXhwb3J0c1snc3ByaW50ZiddID0gc3ByaW50ZlxuICAgICAgICBleHBvcnRzWyd2c3ByaW50ZiddID0gdnNwcmludGZcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdpbmRvd1snc3ByaW50ZiddID0gc3ByaW50ZlxuICAgICAgICB3aW5kb3dbJ3ZzcHJpbnRmJ10gPSB2c3ByaW50ZlxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pIHtcbiAgICAgICAgICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAnc3ByaW50Zic6IHNwcmludGYsXG4gICAgICAgICAgICAgICAgICAgICd2c3ByaW50Zic6IHZzcHJpbnRmXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlIHF1b3RlLXByb3BzICovXG59KCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiIsImNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSByZXF1aXJlKCdldmVudHMnKVxuY29uc3QgU1RSRUFNX0RFU1RST1lFRCA9IG5ldyBFcnJvcignU3RyZWFtIHdhcyBkZXN0cm95ZWQnKVxuY29uc3QgUFJFTUFUVVJFX0NMT1NFID0gbmV3IEVycm9yKCdQcmVtYXR1cmUgY2xvc2UnKVxuXG5jb25zdCBxdWV1ZVRpY2sgPSByZXF1aXJlKCdxdWV1ZS10aWNrJylcbmNvbnN0IEZJRk8gPSByZXF1aXJlKCdmYXN0LWZpZm8nKVxuY29uc3QgVGV4dERlY29kZXIgPSByZXF1aXJlKCd0ZXh0LWRlY29kZXInKVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1tdWx0aS1zcGFjZXMgKi9cblxuLy8gMjkgYml0cyB1c2VkIHRvdGFsICg0IGZyb20gc2hhcmVkLCAxNCBmcm9tIHJlYWQsIGFuZCAxMSBmcm9tIHdyaXRlKVxuY29uc3QgTUFYID0gKCgxIDw8IDI5KSAtIDEpXG5cbi8vIFNoYXJlZCBzdGF0ZVxuY29uc3QgT1BFTklORyAgICAgICA9IDBiMDAwMVxuY29uc3QgUFJFREVTVFJPWUlORyA9IDBiMDAxMFxuY29uc3QgREVTVFJPWUlORyAgICA9IDBiMDEwMFxuY29uc3QgREVTVFJPWUVEICAgICA9IDBiMTAwMFxuXG5jb25zdCBOT1RfT1BFTklORyA9IE1BWCBeIE9QRU5JTkdcbmNvbnN0IE5PVF9QUkVERVNUUk9ZSU5HID0gTUFYIF4gUFJFREVTVFJPWUlOR1xuXG4vLyBSZWFkIHN0YXRlICg0IGJpdCBvZmZzZXQgZnJvbSBzaGFyZWQgc3RhdGUpXG5jb25zdCBSRUFEX0FDVElWRSAgICAgICAgICAgPSAwYjAwMDAwMDAwMDAwMDAxIDw8IDRcbmNvbnN0IFJFQURfVVBEQVRJTkcgICAgICAgICA9IDBiMDAwMDAwMDAwMDAwMTAgPDwgNFxuY29uc3QgUkVBRF9QUklNQVJZICAgICAgICAgID0gMGIwMDAwMDAwMDAwMDEwMCA8PCA0XG5jb25zdCBSRUFEX1FVRVVFRCAgICAgICAgICAgPSAwYjAwMDAwMDAwMDAxMDAwIDw8IDRcbmNvbnN0IFJFQURfUkVTVU1FRCAgICAgICAgICA9IDBiMDAwMDAwMDAwMTAwMDAgPDwgNFxuY29uc3QgUkVBRF9QSVBFX0RSQUlORUQgICAgID0gMGIwMDAwMDAwMDEwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0VORElORyAgICAgICAgICAgPSAwYjAwMDAwMDAxMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRU1JVF9EQVRBICAgICAgICA9IDBiMDAwMDAwMTAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9FTUlUX1JFQURBQkxFICAgID0gMGIwMDAwMDEwMDAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0VNSVRURURfUkVBREFCTEUgPSAwYjAwMDAxMDAwMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRE9ORSAgICAgICAgICAgICA9IDBiMDAwMTAwMDAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9ORVhUX1RJQ0sgICAgICAgID0gMGIwMDEwMDAwMDAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX05FRURTX1BVU0ggICAgICAgPSAwYjAxMDAwMDAwMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfUkVBRF9BSEVBRCAgICAgICA9IDBiMTAwMDAwMDAwMDAwMDAgPDwgNFxuXG4vLyBDb21iaW5lZCByZWFkIHN0YXRlXG5jb25zdCBSRUFEX0ZMT1dJTkcgPSBSRUFEX1JFU1VNRUQgfCBSRUFEX1BJUEVfRFJBSU5FRFxuY29uc3QgUkVBRF9BQ1RJVkVfQU5EX05FRURTX1BVU0ggPSBSRUFEX0FDVElWRSB8IFJFQURfTkVFRFNfUFVTSFxuY29uc3QgUkVBRF9QUklNQVJZX0FORF9BQ1RJVkUgPSBSRUFEX1BSSU1BUlkgfCBSRUFEX0FDVElWRVxuY29uc3QgUkVBRF9FTUlUX1JFQURBQkxFX0FORF9RVUVVRUQgPSBSRUFEX0VNSVRfUkVBREFCTEUgfCBSRUFEX1FVRVVFRFxuY29uc3QgUkVBRF9SRVNVTUVEX1JFQURfQUhFQUQgPSBSRUFEX1JFU1VNRUQgfCBSRUFEX1JFQURfQUhFQURcblxuY29uc3QgUkVBRF9OT1RfQUNUSVZFICAgICAgICAgICAgID0gTUFYIF4gUkVBRF9BQ1RJVkVcbmNvbnN0IFJFQURfTk9OX1BSSU1BUlkgICAgICAgICAgICA9IE1BWCBeIFJFQURfUFJJTUFSWVxuY29uc3QgUkVBRF9OT05fUFJJTUFSWV9BTkRfUFVTSEVEID0gTUFYIF4gKFJFQURfUFJJTUFSWSB8IFJFQURfTkVFRFNfUFVTSClcbmNvbnN0IFJFQURfUFVTSEVEICAgICAgICAgICAgICAgICA9IE1BWCBeIFJFQURfTkVFRFNfUFVTSFxuY29uc3QgUkVBRF9QQVVTRUQgICAgICAgICAgICAgICAgID0gTUFYIF4gUkVBRF9SRVNVTUVEXG5jb25zdCBSRUFEX05PVF9RVUVVRUQgICAgICAgICAgICAgPSBNQVggXiAoUkVBRF9RVUVVRUQgfCBSRUFEX0VNSVRURURfUkVBREFCTEUpXG5jb25zdCBSRUFEX05PVF9FTkRJTkcgICAgICAgICAgICAgPSBNQVggXiBSRUFEX0VORElOR1xuY29uc3QgUkVBRF9QSVBFX05PVF9EUkFJTkVEICAgICAgID0gTUFYIF4gUkVBRF9GTE9XSU5HXG5jb25zdCBSRUFEX05PVF9ORVhUX1RJQ0sgICAgICAgICAgPSBNQVggXiBSRUFEX05FWFRfVElDS1xuY29uc3QgUkVBRF9OT1RfVVBEQVRJTkcgICAgICAgICAgID0gTUFYIF4gUkVBRF9VUERBVElOR1xuY29uc3QgUkVBRF9OT19SRUFEX0FIRUFEICAgICAgICAgID0gTUFYIF4gUkVBRF9SRUFEX0FIRUFEXG5jb25zdCBSRUFEX1BBVVNFRF9OT19SRUFEX0FIRUFEICAgPSBNQVggXiBSRUFEX1JFU1VNRURfUkVBRF9BSEVBRFxuXG4vLyBXcml0ZSBzdGF0ZSAoMTggYml0IG9mZnNldCwgNCBiaXQgb2Zmc2V0IGZyb20gc2hhcmVkIHN0YXRlIGFuZCAxNCBmcm9tIHJlYWQgc3RhdGUpXG5jb25zdCBXUklURV9BQ1RJVkUgICAgID0gMGIwMDAwMDAwMDAwMSA8PCAxOFxuY29uc3QgV1JJVEVfVVBEQVRJTkcgICA9IDBiMDAwMDAwMDAwMTAgPDwgMThcbmNvbnN0IFdSSVRFX1BSSU1BUlkgICAgPSAwYjAwMDAwMDAwMTAwIDw8IDE4XG5jb25zdCBXUklURV9RVUVVRUQgICAgID0gMGIwMDAwMDAwMTAwMCA8PCAxOFxuY29uc3QgV1JJVEVfVU5EUkFJTkVEICA9IDBiMDAwMDAwMTAwMDAgPDwgMThcbmNvbnN0IFdSSVRFX0RPTkUgICAgICAgPSAwYjAwMDAwMTAwMDAwIDw8IDE4XG5jb25zdCBXUklURV9FTUlUX0RSQUlOID0gMGIwMDAwMTAwMDAwMCA8PCAxOFxuY29uc3QgV1JJVEVfTkVYVF9USUNLICA9IDBiMDAwMTAwMDAwMDAgPDwgMThcbmNvbnN0IFdSSVRFX1dSSVRJTkcgICAgPSAwYjAwMTAwMDAwMDAwIDw8IDE4XG5jb25zdCBXUklURV9GSU5JU0hJTkcgID0gMGIwMTAwMDAwMDAwMCA8PCAxOFxuY29uc3QgV1JJVEVfQ09SS0VEICAgICA9IDBiMTAwMDAwMDAwMDAgPDwgMThcblxuY29uc3QgV1JJVEVfTk9UX0FDVElWRSAgICA9IE1BWCBeIChXUklURV9BQ1RJVkUgfCBXUklURV9XUklUSU5HKVxuY29uc3QgV1JJVEVfTk9OX1BSSU1BUlkgICA9IE1BWCBeIFdSSVRFX1BSSU1BUllcbmNvbnN0IFdSSVRFX05PVF9GSU5JU0hJTkcgPSBNQVggXiBXUklURV9GSU5JU0hJTkdcbmNvbnN0IFdSSVRFX0RSQUlORUQgICAgICAgPSBNQVggXiBXUklURV9VTkRSQUlORURcbmNvbnN0IFdSSVRFX05PVF9RVUVVRUQgICAgPSBNQVggXiBXUklURV9RVUVVRURcbmNvbnN0IFdSSVRFX05PVF9ORVhUX1RJQ0sgPSBNQVggXiBXUklURV9ORVhUX1RJQ0tcbmNvbnN0IFdSSVRFX05PVF9VUERBVElORyAgPSBNQVggXiBXUklURV9VUERBVElOR1xuY29uc3QgV1JJVEVfTk9UX0NPUktFRCAgICA9IE1BWCBeIFdSSVRFX0NPUktFRFxuXG4vLyBDb21iaW5lZCBzaGFyZWQgc3RhdGVcbmNvbnN0IEFDVElWRSA9IFJFQURfQUNUSVZFIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBOT1RfQUNUSVZFID0gTUFYIF4gQUNUSVZFXG5jb25zdCBET05FID0gUkVBRF9ET05FIHwgV1JJVEVfRE9ORVxuY29uc3QgREVTVFJPWV9TVEFUVVMgPSBERVNUUk9ZSU5HIHwgREVTVFJPWUVEIHwgUFJFREVTVFJPWUlOR1xuY29uc3QgT1BFTl9TVEFUVVMgPSBERVNUUk9ZX1NUQVRVUyB8IE9QRU5JTkdcbmNvbnN0IEFVVE9fREVTVFJPWSA9IERFU1RST1lfU1RBVFVTIHwgRE9ORVxuY29uc3QgTk9OX1BSSU1BUlkgPSBXUklURV9OT05fUFJJTUFSWSAmIFJFQURfTk9OX1BSSU1BUllcbmNvbnN0IEFDVElWRV9PUl9USUNLSU5HID0gV1JJVEVfTkVYVF9USUNLIHwgUkVBRF9ORVhUX1RJQ0tcbmNvbnN0IFRJQ0tJTkcgPSBBQ1RJVkVfT1JfVElDS0lORyAmIE5PVF9BQ1RJVkVcbmNvbnN0IElTX09QRU5JTkcgPSBPUEVOX1NUQVRVUyB8IFRJQ0tJTkdcblxuLy8gQ29tYmluZWQgc2hhcmVkIHN0YXRlIGFuZCByZWFkIHN0YXRlXG5jb25zdCBSRUFEX1BSSU1BUllfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VORElORyB8IFJFQURfRE9ORVxuY29uc3QgUkVBRF9TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFJFQURfRE9ORSB8IFJFQURfUVVFVUVEXG5jb25zdCBSRUFEX0VORElOR19TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFJFQURfRU5ESU5HIHwgUkVBRF9RVUVVRURcbmNvbnN0IFJFQURfUkVBREFCTEVfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VNSVRfUkVBREFCTEUgfCBSRUFEX1FVRVVFRCB8IFJFQURfRU1JVFRFRF9SRUFEQUJMRVxuY29uc3QgU0hPVUxEX05PVF9SRUFEID0gT1BFTl9TVEFUVVMgfCBSRUFEX0FDVElWRSB8IFJFQURfRU5ESU5HIHwgUkVBRF9ET05FIHwgUkVBRF9ORUVEU19QVVNIIHwgUkVBRF9SRUFEX0FIRUFEXG5jb25zdCBSRUFEX0JBQ0tQUkVTU1VSRV9TVEFUVVMgPSBERVNUUk9ZX1NUQVRVUyB8IFJFQURfRU5ESU5HIHwgUkVBRF9ET05FXG5jb25zdCBSRUFEX1VQREFURV9TWU5DX1NUQVRVUyA9IFJFQURfVVBEQVRJTkcgfCBPUEVOX1NUQVRVUyB8IFJFQURfTkVYVF9USUNLIHwgUkVBRF9QUklNQVJZXG5cbi8vIENvbWJpbmVkIHdyaXRlIHN0YXRlXG5jb25zdCBXUklURV9QUklNQVJZX1NUQVRVUyA9IE9QRU5fU1RBVFVTIHwgV1JJVEVfRklOSVNISU5HIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfUVVFVUVEX0FORF9VTkRSQUlORUQgPSBXUklURV9RVUVVRUQgfCBXUklURV9VTkRSQUlORURcbmNvbnN0IFdSSVRFX1FVRVVFRF9BTkRfQUNUSVZFID0gV1JJVEVfUVVFVUVEIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBXUklURV9EUkFJTl9TVEFUVVMgPSBXUklURV9RVUVVRUQgfCBXUklURV9VTkRSQUlORUQgfCBPUEVOX1NUQVRVUyB8IFdSSVRFX0FDVElWRVxuY29uc3QgV1JJVEVfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBXUklURV9BQ1RJVkUgfCBXUklURV9RVUVVRUQgfCBXUklURV9DT1JLRURcbmNvbnN0IFdSSVRFX1BSSU1BUllfQU5EX0FDVElWRSA9IFdSSVRFX1BSSU1BUlkgfCBXUklURV9BQ1RJVkVcbmNvbnN0IFdSSVRFX0FDVElWRV9BTkRfV1JJVElORyA9IFdSSVRFX0FDVElWRSB8IFdSSVRFX1dSSVRJTkdcbmNvbnN0IFdSSVRFX0ZJTklTSElOR19TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFdSSVRFX0ZJTklTSElORyB8IFdSSVRFX1FVRVVFRF9BTkRfQUNUSVZFIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfQkFDS1BSRVNTVVJFX1NUQVRVUyA9IFdSSVRFX1VORFJBSU5FRCB8IERFU1RST1lfU1RBVFVTIHwgV1JJVEVfRklOSVNISU5HIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfVVBEQVRFX1NZTkNfU1RBVFVTID0gV1JJVEVfVVBEQVRJTkcgfCBPUEVOX1NUQVRVUyB8IFdSSVRFX05FWFRfVElDSyB8IFdSSVRFX1BSSU1BUllcblxuY29uc3QgYXN5bmNJdGVyYXRvciA9IFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFN5bWJvbCgnYXN5bmNJdGVyYXRvcicpXG5cbmNsYXNzIFdyaXRhYmxlU3RhdGUge1xuICBjb25zdHJ1Y3RvciAoc3RyZWFtLCB7IGhpZ2hXYXRlck1hcmsgPSAxNjM4NCwgbWFwID0gbnVsbCwgbWFwV3JpdGFibGUsIGJ5dGVMZW5ndGgsIGJ5dGVMZW5ndGhXcml0YWJsZSB9ID0ge30pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbVxuICAgIHRoaXMucXVldWUgPSBuZXcgRklGTygpXG4gICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFya1xuICAgIHRoaXMuYnVmZmVyZWQgPSAwXG4gICAgdGhpcy5lcnJvciA9IG51bGxcbiAgICB0aGlzLnBpcGVsaW5lID0gbnVsbFxuICAgIHRoaXMuZHJhaW5zID0gbnVsbCAvLyBpZiB3ZSBhZGQgbW9yZSBzZWxkb21seSB1c2VkIGhlbHBlcnMgd2UgbWlnaHQgdGhlbSBpbnRvIGEgc3Vib2JqZWN0IHNvIGl0cyBhIHNpbmdsZSBwdHJcbiAgICB0aGlzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoV3JpdGFibGUgfHwgYnl0ZUxlbmd0aCB8fCBkZWZhdWx0Qnl0ZUxlbmd0aFxuICAgIHRoaXMubWFwID0gbWFwV3JpdGFibGUgfHwgbWFwXG4gICAgdGhpcy5hZnRlcldyaXRlID0gYWZ0ZXJXcml0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrID0gdXBkYXRlV3JpdGVOVC5iaW5kKHRoaXMpXG4gIH1cblxuICBnZXQgZW5kZWQgKCkge1xuICAgIHJldHVybiAodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRE9ORSkgIT09IDBcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBpZiAodGhpcy5tYXAgIT09IG51bGwpIGRhdGEgPSB0aGlzLm1hcChkYXRhKVxuXG4gICAgdGhpcy5idWZmZXJlZCArPSB0aGlzLmJ5dGVMZW5ndGgoZGF0YSlcbiAgICB0aGlzLnF1ZXVlLnB1c2goZGF0YSlcblxuICAgIGlmICh0aGlzLmJ1ZmZlcmVkIDwgdGhpcy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfUVVFVUVEXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9RVUVVRURfQU5EX1VORFJBSU5FRFxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgc2hpZnQgKCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnF1ZXVlLnNoaWZ0KClcblxuICAgIHRoaXMuYnVmZmVyZWQgLT0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgaWYgKHRoaXMuYnVmZmVyZWQgPT09IDApIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfUVVFVUVEXG5cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgZW5kIChkYXRhKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB0aGlzLnN0cmVhbS5vbmNlKCdmaW5pc2gnLCBkYXRhKVxuICAgIGVsc2UgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhICE9PSBudWxsKSB0aGlzLnB1c2goZGF0YSlcbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgPSAodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHwgV1JJVEVfRklOSVNISU5HKSAmIFdSSVRFX05PTl9QUklNQVJZXG4gIH1cblxuICBhdXRvQmF0Y2ggKGRhdGEsIGNiKSB7XG4gICAgY29uc3QgYnVmZmVyID0gW11cbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgYnVmZmVyLnB1c2goZGF0YSlcbiAgICB3aGlsZSAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9TVEFUVVMpID09PSBXUklURV9RVUVVRURfQU5EX0FDVElWRSkge1xuICAgICAgYnVmZmVyLnB1c2goc3RyZWFtLl93cml0YWJsZVN0YXRlLnNoaWZ0KCkpXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgT1BFTl9TVEFUVVMpICE9PSAwKSByZXR1cm4gY2IobnVsbClcbiAgICBzdHJlYW0uX3dyaXRldihidWZmZXIsIGNiKVxuICB9XG5cbiAgdXBkYXRlICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9VUERBVElOR1xuXG4gICAgZG8ge1xuICAgICAgd2hpbGUgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfU1RBVFVTKSA9PT0gV1JJVEVfUVVFVUVEKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNoaWZ0KClcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9BQ1RJVkVfQU5EX1dSSVRJTkdcbiAgICAgICAgc3RyZWFtLl93cml0ZShkYXRhLCB0aGlzLmFmdGVyV3JpdGUpXG4gICAgICB9XG5cbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1BSSU1BUllfQU5EX0FDVElWRSkgPT09IDApIHRoaXMudXBkYXRlTm9uUHJpbWFyeSgpXG4gICAgfSB3aGlsZSAodGhpcy5jb250aW51ZVVwZGF0ZSgpID09PSB0cnVlKVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfVVBEQVRJTkdcbiAgfVxuXG4gIHVwZGF0ZU5vblByaW1hcnkgKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9GSU5JU0hJTkdfU1RBVFVTKSA9PT0gV1JJVEVfRklOSVNISU5HKSB7XG4gICAgICBzdHJlYW0uX2R1cGxleFN0YXRlID0gKHN0cmVhbS5fZHVwbGV4U3RhdGUgfCBXUklURV9BQ1RJVkUpICYgV1JJVEVfTk9UX0ZJTklTSElOR1xuICAgICAgc3RyZWFtLl9maW5hbChhZnRlckZpbmFsLmJpbmQodGhpcykpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBERVNUUk9ZX1NUQVRVUykgPT09IERFU1RST1lJTkcpIHtcbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIEFDVElWRV9PUl9USUNLSU5HKSA9PT0gMCkge1xuICAgICAgICBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IEFDVElWRVxuICAgICAgICBzdHJlYW0uX2Rlc3Ryb3koYWZ0ZXJEZXN0cm95LmJpbmQodGhpcykpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBJU19PUEVOSU5HKSA9PT0gT1BFTklORykge1xuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgQUNUSVZFKSAmIE5PVF9PUEVOSU5HXG4gICAgICBzdHJlYW0uX29wZW4oYWZ0ZXJPcGVuLmJpbmQodGhpcykpXG4gICAgfVxuICB9XG5cbiAgY29udGludWVVcGRhdGUgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfTkVYVF9USUNLKSA9PT0gMCkgcmV0dXJuIGZhbHNlXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICY9IFdSSVRFX05PVF9ORVhUX1RJQ0tcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdXBkYXRlQ2FsbGJhY2sgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfVVBEQVRFX1NZTkNfU1RBVFVTKSA9PT0gV1JJVEVfUFJJTUFSWSkgdGhpcy51cGRhdGUoKVxuICAgIGVsc2UgdGhpcy51cGRhdGVOZXh0VGljaygpXG4gIH1cblxuICB1cGRhdGVOZXh0VGljayAoKSB7XG4gICAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9ORVhUX1RJQ0spICE9PSAwKSByZXR1cm5cbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfTkVYVF9USUNLXG4gICAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9VUERBVElORykgPT09IDApIHF1ZXVlVGljayh0aGlzLmFmdGVyVXBkYXRlTmV4dFRpY2spXG4gIH1cbn1cblxuY2xhc3MgUmVhZGFibGVTdGF0ZSB7XG4gIGNvbnN0cnVjdG9yIChzdHJlYW0sIHsgaGlnaFdhdGVyTWFyayA9IDE2Mzg0LCBtYXAgPSBudWxsLCBtYXBSZWFkYWJsZSwgYnl0ZUxlbmd0aCwgYnl0ZUxlbmd0aFJlYWRhYmxlIH0gPSB7fSkge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtXG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBGSUZPKClcbiAgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrID09PSAwID8gMSA6IGhpZ2hXYXRlck1hcmtcbiAgICB0aGlzLmJ1ZmZlcmVkID0gMFxuICAgIHRoaXMucmVhZEFoZWFkID0gaGlnaFdhdGVyTWFyayA+IDBcbiAgICB0aGlzLmVycm9yID0gbnVsbFxuICAgIHRoaXMucGlwZWxpbmUgPSBudWxsXG4gICAgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFJlYWRhYmxlIHx8IGJ5dGVMZW5ndGggfHwgZGVmYXVsdEJ5dGVMZW5ndGhcbiAgICB0aGlzLm1hcCA9IG1hcFJlYWRhYmxlIHx8IG1hcFxuICAgIHRoaXMucGlwZVRvID0gbnVsbFxuICAgIHRoaXMuYWZ0ZXJSZWFkID0gYWZ0ZXJSZWFkLmJpbmQodGhpcylcbiAgICB0aGlzLmFmdGVyVXBkYXRlTmV4dFRpY2sgPSB1cGRhdGVSZWFkTlQuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0IGVuZGVkICgpIHtcbiAgICByZXR1cm4gKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfRE9ORSkgIT09IDBcbiAgfVxuXG4gIHBpcGUgKHBpcGVUbywgY2IpIHtcbiAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwpIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgcGlwZSB0byBvbmUgZGVzdGluYXRpb24nKVxuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbnVsbFxuXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfUElQRV9EUkFJTkVEXG4gICAgdGhpcy5waXBlVG8gPSBwaXBlVG9cbiAgICB0aGlzLnBpcGVsaW5lID0gbmV3IFBpcGVsaW5lKHRoaXMuc3RyZWFtLCBwaXBlVG8sIGNiKVxuXG4gICAgaWYgKGNiKSB0aGlzLnN0cmVhbS5vbignZXJyb3InLCBub29wKSAvLyBXZSBhbHJlYWR5IGVycm9yIGhhbmRsZSB0aGlzIHNvIHN1cHJlc3MgY3Jhc2hlc1xuXG4gICAgaWYgKGlzU3RyZWFteChwaXBlVG8pKSB7XG4gICAgICBwaXBlVG8uX3dyaXRhYmxlU3RhdGUucGlwZWxpbmUgPSB0aGlzLnBpcGVsaW5lXG4gICAgICBpZiAoY2IpIHBpcGVUby5vbignZXJyb3InLCBub29wKSAvLyBXZSBhbHJlYWR5IGVycm9yIGhhbmRsZSB0aGlzIHNvIHN1cHJlc3MgY3Jhc2hlc1xuICAgICAgcGlwZVRvLm9uKCdmaW5pc2gnLCB0aGlzLnBpcGVsaW5lLmZpbmlzaGVkLmJpbmQodGhpcy5waXBlbGluZSkpIC8vIFRPRE86IGp1c3QgY2FsbCBmaW5pc2hlZCBmcm9tIHBpcGVUbyBpdHNlbGZcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb25lcnJvciA9IHRoaXMucGlwZWxpbmUuZG9uZS5iaW5kKHRoaXMucGlwZWxpbmUsIHBpcGVUbylcbiAgICAgIGNvbnN0IG9uY2xvc2UgPSB0aGlzLnBpcGVsaW5lLmRvbmUuYmluZCh0aGlzLnBpcGVsaW5lLCBwaXBlVG8sIG51bGwpIC8vIG9uY2xvc2UgaGFzIGEgd2VpcmQgYm9vbCBhcmdcbiAgICAgIHBpcGVUby5vbignZXJyb3InLCBvbmVycm9yKVxuICAgICAgcGlwZVRvLm9uKCdjbG9zZScsIG9uY2xvc2UpXG4gICAgICBwaXBlVG8ub24oJ2ZpbmlzaCcsIHRoaXMucGlwZWxpbmUuZmluaXNoZWQuYmluZCh0aGlzLnBpcGVsaW5lKSlcbiAgICB9XG5cbiAgICBwaXBlVG8ub24oJ2RyYWluJywgYWZ0ZXJEcmFpbi5iaW5kKHRoaXMpKVxuICAgIHRoaXMuc3RyZWFtLmVtaXQoJ3BpcGluZycsIHBpcGVUbylcbiAgICBwaXBlVG8uZW1pdCgncGlwZScsIHRoaXMuc3RyZWFtKVxuICB9XG5cbiAgcHVzaCAoZGF0YSkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gMFxuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgUkVBRF9FTkRJTkcpICYgUkVBRF9OT05fUFJJTUFSWV9BTkRfUFVTSEVEXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXAgIT09IG51bGwpIHtcbiAgICAgIGRhdGEgPSB0aGlzLm1hcChkYXRhKVxuICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0aGlzLmJ1ZmZlcmVkIDwgdGhpcy5oaWdoV2F0ZXJNYXJrXG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXJlZCArPSB0aGlzLmJ5dGVMZW5ndGgoZGF0YSlcbiAgICB0aGlzLnF1ZXVlLnB1c2goZGF0YSlcblxuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFJFQURfUVVFVUVEKSAmIFJFQURfUFVTSEVEXG5cbiAgICByZXR1cm4gdGhpcy5idWZmZXJlZCA8IHRoaXMuaGlnaFdhdGVyTWFya1xuICB9XG5cbiAgc2hpZnQgKCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnF1ZXVlLnNoaWZ0KClcblxuICAgIHRoaXMuYnVmZmVyZWQgLT0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgaWYgKHRoaXMuYnVmZmVyZWQgPT09IDApIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PVF9RVUVVRURcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgdW5zaGlmdCAoZGF0YSkge1xuICAgIGNvbnN0IHBlbmRpbmcgPSBbdGhpcy5tYXAgIT09IG51bGwgPyB0aGlzLm1hcChkYXRhKSA6IGRhdGFdXG4gICAgd2hpbGUgKHRoaXMuYnVmZmVyZWQgPiAwKSBwZW5kaW5nLnB1c2godGhpcy5zaGlmdCgpKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwZW5kaW5nLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3QgZGF0YSA9IHBlbmRpbmdbaV1cbiAgICAgIHRoaXMuYnVmZmVyZWQgKz0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgICB0aGlzLnF1ZXVlLnB1c2goZGF0YSlcbiAgICB9XG5cbiAgICB0aGlzLnB1c2gocGVuZGluZ1twZW5kaW5nLmxlbmd0aCAtIDFdKVxuICB9XG5cbiAgcmVhZCAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfU1RBVFVTKSA9PT0gUkVBRF9RVUVVRUQpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNoaWZ0KClcbiAgICAgIGlmICh0aGlzLnBpcGVUbyAhPT0gbnVsbCAmJiB0aGlzLnBpcGVUby53cml0ZShkYXRhKSA9PT0gZmFsc2UpIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9QSVBFX05PVF9EUkFJTkVEXG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0VNSVRfREFUQSkgIT09IDApIHN0cmVhbS5lbWl0KCdkYXRhJywgZGF0YSlcbiAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZEFoZWFkID09PSBmYWxzZSkge1xuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1JFQURfQUhFQURcbiAgICAgIHRoaXMudXBkYXRlTmV4dFRpY2soKVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBkcmFpbiAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHdoaWxlICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfU1RBVFVTKSA9PT0gUkVBRF9RVUVVRUQgJiYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0ZMT1dJTkcpICE9PSAwKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5zaGlmdCgpXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwgJiYgdGhpcy5waXBlVG8ud3JpdGUoZGF0YSkgPT09IGZhbHNlKSBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfUElQRV9OT1RfRFJBSU5FRFxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTUlUX0RBVEEpICE9PSAwKSBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1VQREFUSU5HXG5cbiAgICBkbyB7XG4gICAgICB0aGlzLmRyYWluKClcblxuICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyZWQgPCB0aGlzLmhpZ2hXYXRlck1hcmsgJiYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBTSE9VTERfTk9UX1JFQUQpID09PSBSRUFEX1JFQURfQUhFQUQpIHtcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX0FDVElWRV9BTkRfTkVFRFNfUFVTSFxuICAgICAgICBzdHJlYW0uX3JlYWQodGhpcy5hZnRlclJlYWQpXG4gICAgICAgIHRoaXMuZHJhaW4oKVxuICAgICAgfVxuXG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1JFQURBQkxFX1NUQVRVUykgPT09IFJFQURfRU1JVF9SRUFEQUJMRV9BTkRfUVVFVUVEKSB7XG4gICAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9FTUlUVEVEX1JFQURBQkxFXG4gICAgICAgIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpXG4gICAgICB9XG5cbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfUFJJTUFSWV9BTkRfQUNUSVZFKSA9PT0gMCkgdGhpcy51cGRhdGVOb25QcmltYXJ5KClcbiAgICB9IHdoaWxlICh0aGlzLmNvbnRpbnVlVXBkYXRlKCkgPT09IHRydWUpXG5cbiAgICBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfTk9UX1VQREFUSU5HXG4gIH1cblxuICB1cGRhdGVOb25QcmltYXJ5ICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTkRJTkdfU1RBVFVTKSA9PT0gUkVBRF9FTkRJTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFJFQURfRE9ORSkgJiBSRUFEX05PVF9FTkRJTkdcbiAgICAgIHN0cmVhbS5lbWl0KCdlbmQnKVxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgQVVUT19ERVNUUk9ZKSA9PT0gRE9ORSkgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBERVNUUk9ZSU5HXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwpIHRoaXMucGlwZVRvLmVuZCgpXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSBERVNUUk9ZSU5HKSB7XG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBBQ1RJVkVfT1JfVElDS0lORykgPT09IDApIHtcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBBQ1RJVkVcbiAgICAgICAgc3RyZWFtLl9kZXN0cm95KGFmdGVyRGVzdHJveS5iaW5kKHRoaXMpKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgSVNfT1BFTklORykgPT09IE9QRU5JTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IEFDVElWRSkgJiBOT1RfT1BFTklOR1xuICAgICAgc3RyZWFtLl9vcGVuKGFmdGVyT3Blbi5iaW5kKHRoaXMpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnRpbnVlVXBkYXRlICgpIHtcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfTkVYVF9USUNLKSA9PT0gMCkgcmV0dXJuIGZhbHNlXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfTk9UX05FWFRfVElDS1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICB1cGRhdGVDYWxsYmFjayAoKSB7XG4gICAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1VQREFURV9TWU5DX1NUQVRVUykgPT09IFJFQURfUFJJTUFSWSkgdGhpcy51cGRhdGUoKVxuICAgIGVsc2UgdGhpcy51cGRhdGVOZXh0VGljaygpXG4gIH1cblxuICB1cGRhdGVOZXh0VGljayAoKSB7XG4gICAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX05FWFRfVElDSykgIT09IDApIHJldHVyblxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX05FWFRfVElDS1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9VUERBVElORykgPT09IDApIHF1ZXVlVGljayh0aGlzLmFmdGVyVXBkYXRlTmV4dFRpY2spXG4gIH1cbn1cblxuY2xhc3MgVHJhbnNmb3JtU3RhdGUge1xuICBjb25zdHJ1Y3RvciAoc3RyZWFtKSB7XG4gICAgdGhpcy5kYXRhID0gbnVsbFxuICAgIHRoaXMuYWZ0ZXJUcmFuc2Zvcm0gPSBhZnRlclRyYW5zZm9ybS5iaW5kKHN0cmVhbSlcbiAgICB0aGlzLmFmdGVyRmluYWwgPSBudWxsXG4gIH1cbn1cblxuY2xhc3MgUGlwZWxpbmUge1xuICBjb25zdHJ1Y3RvciAoc3JjLCBkc3QsIGNiKSB7XG4gICAgdGhpcy5mcm9tID0gc3JjXG4gICAgdGhpcy50byA9IGRzdFxuICAgIHRoaXMuYWZ0ZXJQaXBlID0gY2JcbiAgICB0aGlzLmVycm9yID0gbnVsbFxuICAgIHRoaXMucGlwZVRvRmluaXNoZWQgPSBmYWxzZVxuICB9XG5cbiAgZmluaXNoZWQgKCkge1xuICAgIHRoaXMucGlwZVRvRmluaXNoZWQgPSB0cnVlXG4gIH1cblxuICBkb25lIChzdHJlYW0sIGVycikge1xuICAgIGlmIChlcnIpIHRoaXMuZXJyb3IgPSBlcnJcblxuICAgIGlmIChzdHJlYW0gPT09IHRoaXMudG8pIHtcbiAgICAgIHRoaXMudG8gPSBudWxsXG5cbiAgICAgIGlmICh0aGlzLmZyb20gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCh0aGlzLmZyb20uX2R1cGxleFN0YXRlICYgUkVBRF9ET05FKSA9PT0gMCB8fCAhdGhpcy5waXBlVG9GaW5pc2hlZCkge1xuICAgICAgICAgIHRoaXMuZnJvbS5kZXN0cm95KHRoaXMuZXJyb3IgfHwgbmV3IEVycm9yKCdXcml0YWJsZSBzdHJlYW0gY2xvc2VkIHByZW1hdHVyZWx5JykpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0cmVhbSA9PT0gdGhpcy5mcm9tKSB7XG4gICAgICB0aGlzLmZyb20gPSBudWxsXG5cbiAgICAgIGlmICh0aGlzLnRvICE9PSBudWxsKSB7XG4gICAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfRE9ORSkgPT09IDApIHtcbiAgICAgICAgICB0aGlzLnRvLmRlc3Ryb3kodGhpcy5lcnJvciB8fCBuZXcgRXJyb3IoJ1JlYWRhYmxlIHN0cmVhbSBjbG9zZWQgYmVmb3JlIGVuZGluZycpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFmdGVyUGlwZSAhPT0gbnVsbCkgdGhpcy5hZnRlclBpcGUodGhpcy5lcnJvcilcbiAgICB0aGlzLnRvID0gdGhpcy5mcm9tID0gdGhpcy5hZnRlclBpcGUgPSBudWxsXG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJEcmFpbiAoKSB7XG4gIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1BJUEVfRFJBSU5FRFxuICB0aGlzLnVwZGF0ZUNhbGxiYWNrKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJGaW5hbCAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG4gIGlmIChlcnIpIHN0cmVhbS5kZXN0cm95KGVycilcbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSAwKSB7XG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9ET05FXG4gICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpXG4gIH1cbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgQVVUT19ERVNUUk9ZKSA9PT0gRE9ORSkge1xuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gREVTVFJPWUlOR1xuICB9XG5cbiAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfQUNUSVZFXG5cbiAgLy8gbm8gbmVlZCB0byB3YWl0IHRoZSBleHRyYSB0aWNrIGhlcmUsIHNvIHdlIHNob3J0IGNpcmN1aXQgdGhhdFxuICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9VUERBVElORykgPT09IDApIHRoaXMudXBkYXRlKClcbiAgZWxzZSB0aGlzLnVwZGF0ZU5leHRUaWNrKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJEZXN0cm95IChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoIWVyciAmJiB0aGlzLmVycm9yICE9PSBTVFJFQU1fREVTVFJPWUVEKSBlcnIgPSB0aGlzLmVycm9yXG4gIGlmIChlcnIpIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycilcbiAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBERVNUUk9ZRURcbiAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcblxuICBjb25zdCBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuXG4gIGlmIChycyAhPT0gbnVsbCAmJiBycy5waXBlbGluZSAhPT0gbnVsbCkgcnMucGlwZWxpbmUuZG9uZShzdHJlYW0sIGVycilcblxuICBpZiAod3MgIT09IG51bGwpIHtcbiAgICB3aGlsZSAod3MuZHJhaW5zICE9PSBudWxsICYmIHdzLmRyYWlucy5sZW5ndGggPiAwKSB3cy5kcmFpbnMuc2hpZnQoKS5yZXNvbHZlKGZhbHNlKVxuICAgIGlmICh3cy5waXBlbGluZSAhPT0gbnVsbCkgd3MucGlwZWxpbmUuZG9uZShzdHJlYW0sIGVycilcbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlIChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoZXJyKSBzdHJlYW0uZGVzdHJveShlcnIpXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX0FDVElWRVxuXG4gIGlmICh0aGlzLmRyYWlucyAhPT0gbnVsbCkgdGlja0RyYWlucyh0aGlzLmRyYWlucylcblxuICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9EUkFJTl9TVEFUVVMpID09PSBXUklURV9VTkRSQUlORUQpIHtcbiAgICBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFdSSVRFX0RSQUlORURcbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9FTUlUX0RSQUlOKSA9PT0gV1JJVEVfRU1JVF9EUkFJTikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2RyYWluJylcbiAgICB9XG4gIH1cblxuICB0aGlzLnVwZGF0ZUNhbGxiYWNrKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJSZWFkIChlcnIpIHtcbiAgaWYgKGVycikgdGhpcy5zdHJlYW0uZGVzdHJveShlcnIpXG4gIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PVF9BQ1RJVkVcbiAgaWYgKHRoaXMucmVhZEFoZWFkID09PSBmYWxzZSAmJiAodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9SRVNVTUVEKSA9PT0gMCkgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfTk9fUkVBRF9BSEVBRFxuICB0aGlzLnVwZGF0ZUNhbGxiYWNrKClcbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVhZE5UICgpIHtcbiAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1VQREFUSU5HKSA9PT0gMCkge1xuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PVF9ORVhUX1RJQ0tcbiAgICB0aGlzLnVwZGF0ZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlV3JpdGVOVCAoKSB7XG4gIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfVVBEQVRJTkcpID09PSAwKSB7XG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICY9IFdSSVRFX05PVF9ORVhUX1RJQ0tcbiAgICB0aGlzLnVwZGF0ZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gdGlja0RyYWlucyAoZHJhaW5zKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZHJhaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gZHJhaW5zLndyaXRlcyBhcmUgbW9ub3RvbmljLCBzbyBpZiBvbmUgaXMgMCBpdHMgYWx3YXlzIHRoZSBmaXJzdCBvbmVcbiAgICBpZiAoLS1kcmFpbnNbaV0ud3JpdGVzID09PSAwKSB7XG4gICAgICBkcmFpbnMuc2hpZnQoKS5yZXNvbHZlKHRydWUpXG4gICAgICBpLS1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJPcGVuIChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoZXJyKSBzdHJlYW0uZGVzdHJveShlcnIpXG5cbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWUlORykgPT09IDApIHtcbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1BSSU1BUllfU1RBVFVTKSA9PT0gMCkgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1BSSU1BUllcbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9QUklNQVJZX1NUQVRVUykgPT09IDApIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfUFJJTUFSWVxuICAgIHN0cmVhbS5lbWl0KCdvcGVuJylcbiAgfVxuXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gTk9UX0FDVElWRVxuXG4gIGlmIChzdHJlYW0uX3dyaXRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUudXBkYXRlQ2FsbGJhY2soKVxuICB9XG5cbiAgaWYgKHN0cmVhbS5fcmVhZGFibGVTdGF0ZSAhPT0gbnVsbCkge1xuICAgIHN0cmVhbS5fcmVhZGFibGVTdGF0ZS51cGRhdGVDYWxsYmFjaygpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0gKGVyciwgZGF0YSkge1xuICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEgIT09IG51bGwpIHRoaXMucHVzaChkYXRhKVxuICB0aGlzLl93cml0YWJsZVN0YXRlLmFmdGVyV3JpdGUoZXJyKVxufVxuXG5mdW5jdGlvbiBuZXdMaXN0ZW5lciAobmFtZSkge1xuICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuYW1lID09PSAnZGF0YScpIHtcbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IChSRUFEX0VNSVRfREFUQSB8IFJFQURfUkVTVU1FRF9SRUFEX0FIRUFEKVxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgfVxuICAgIGlmIChuYW1lID09PSAncmVhZGFibGUnKSB7XG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX0VNSVRfUkVBREFCTEVcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkcmFpbicpIHtcbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IFdSSVRFX0VNSVRfRFJBSU5cbiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBTdHJlYW0gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKClcblxuICAgIHRoaXMuX2R1cGxleFN0YXRlID0gMFxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBudWxsXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG51bGxcblxuICAgIGlmIChvcHRzKSB7XG4gICAgICBpZiAob3B0cy5vcGVuKSB0aGlzLl9vcGVuID0gb3B0cy5vcGVuXG4gICAgICBpZiAob3B0cy5kZXN0cm95KSB0aGlzLl9kZXN0cm95ID0gb3B0cy5kZXN0cm95XG4gICAgICBpZiAob3B0cy5wcmVkZXN0cm95KSB0aGlzLl9wcmVkZXN0cm95ID0gb3B0cy5wcmVkZXN0cm95XG4gICAgICBpZiAob3B0cy5zaWduYWwpIHtcbiAgICAgICAgb3B0cy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydC5iaW5kKHRoaXMpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub24oJ25ld0xpc3RlbmVyJywgbmV3TGlzdGVuZXIpXG4gIH1cblxuICBfb3BlbiAoY2IpIHtcbiAgICBjYihudWxsKVxuICB9XG5cbiAgX2Rlc3Ryb3kgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9wcmVkZXN0cm95ICgpIHtcbiAgICAvLyBkb2VzIG5vdGhpbmdcbiAgfVxuXG4gIGdldCByZWFkYWJsZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgIT09IG51bGwgPyB0cnVlIDogdW5kZWZpbmVkXG4gIH1cblxuICBnZXQgd3JpdGFibGUgKCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICE9PSBudWxsID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0IGRlc3Ryb3llZCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lFRCkgIT09IDBcbiAgfVxuXG4gIGdldCBkZXN0cm95aW5nICgpIHtcbiAgICByZXR1cm4gKHRoaXMuX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpICE9PSAwXG4gIH1cblxuICBkZXN0cm95IChlcnIpIHtcbiAgICBpZiAoKHRoaXMuX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSAwKSB7XG4gICAgICBpZiAoIWVycikgZXJyID0gU1RSRUFNX0RFU1RST1lFRFxuICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgPSAodGhpcy5fZHVwbGV4U3RhdGUgfCBERVNUUk9ZSU5HKSAmIE5PTl9QUklNQVJZXG5cbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyayA9IDBcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lcnJvciA9IGVyclxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrID0gMFxuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yID0gZXJyXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IFBSRURFU1RST1lJTkdcbiAgICAgIHRoaXMuX3ByZWRlc3Ryb3koKVxuICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgJj0gTk9UX1BSRURFU1RST1lJTkdcblxuICAgICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUgIT09IG51bGwpIHRoaXMuX3dyaXRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBSZWFkYWJsZSBleHRlbmRzIFN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcblxuICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IE9QRU5JTkcgfCBXUklURV9ET05FIHwgUkVBRF9SRUFEX0FIRUFEXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKHRoaXMsIG9wdHMpXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZEFoZWFkID09PSBmYWxzZSkgdGhpcy5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT19SRUFEX0FIRUFEXG4gICAgICBpZiAob3B0cy5yZWFkKSB0aGlzLl9yZWFkID0gb3B0cy5yZWFkXG4gICAgICBpZiAob3B0cy5lYWdlck9wZW4pIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgICAgaWYgKG9wdHMuZW5jb2RpbmcpIHRoaXMuc2V0RW5jb2Rpbmcob3B0cy5lbmNvZGluZylcbiAgICB9XG4gIH1cblxuICBzZXRFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgICBjb25zdCBkZWMgPSBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcpXG4gICAgY29uc3QgbWFwID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5tYXAgfHwgZWNob1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUubWFwID0gbWFwT3JTa2lwXG4gICAgcmV0dXJuIHRoaXNcblxuICAgIGZ1bmN0aW9uIG1hcE9yU2tpcCAoZGF0YSkge1xuICAgICAgY29uc3QgbmV4dCA9IGRlYy5wdXNoKGRhdGEpXG4gICAgICByZXR1cm4gbmV4dCA9PT0gJycgPyBudWxsIDogbWFwKG5leHQpXG4gICAgfVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHBpcGUgKGRlc3QsIGNiKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5waXBlKGRlc3QsIGNiKVxuICAgIHJldHVybiBkZXN0XG4gIH1cblxuICByZWFkICgpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkKClcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5wdXNoKGRhdGEpXG4gIH1cblxuICB1bnNoaWZ0IChkYXRhKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUudW5zaGlmdChkYXRhKVxuICB9XG5cbiAgcmVzdW1lICgpIHtcbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1JFU1VNRURfUkVBRF9BSEVBRFxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwYXVzZSAoKSB7XG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgJj0gKHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZEFoZWFkID09PSBmYWxzZSA/IFJFQURfUEFVU0VEX05PX1JFQURfQUhFQUQgOiBSRUFEX1BBVVNFRClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhdGljIF9mcm9tQXN5bmNJdGVyYXRvciAoaXRlLCBvcHRzKSB7XG4gICAgbGV0IGRlc3Ryb3lcblxuICAgIGNvbnN0IHJzID0gbmV3IFJlYWRhYmxlKHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICByZWFkIChjYikge1xuICAgICAgICBpdGUubmV4dCgpLnRoZW4ocHVzaCkudGhlbihjYi5iaW5kKG51bGwsIG51bGwpKS5jYXRjaChjYilcbiAgICAgIH0sXG4gICAgICBwcmVkZXN0cm95ICgpIHtcbiAgICAgICAgZGVzdHJveSA9IGl0ZS5yZXR1cm4oKVxuICAgICAgfSxcbiAgICAgIGRlc3Ryb3kgKGNiKSB7XG4gICAgICAgIGlmICghZGVzdHJveSkgcmV0dXJuIGNiKG51bGwpXG4gICAgICAgIGRlc3Ryb3kudGhlbihjYi5iaW5kKG51bGwsIG51bGwpKS5jYXRjaChjYilcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHJzXG5cbiAgICBmdW5jdGlvbiBwdXNoIChkYXRhKSB7XG4gICAgICBpZiAoZGF0YS5kb25lKSBycy5wdXNoKG51bGwpXG4gICAgICBlbHNlIHJzLnB1c2goZGF0YS52YWx1ZSlcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZnJvbSAoZGF0YSwgb3B0cykge1xuICAgIGlmIChpc1JlYWRTdHJlYW14KGRhdGEpKSByZXR1cm4gZGF0YVxuICAgIGlmIChkYXRhW2FzeW5jSXRlcmF0b3JdKSByZXR1cm4gdGhpcy5fZnJvbUFzeW5jSXRlcmF0b3IoZGF0YVthc3luY0l0ZXJhdG9yXSgpLCBvcHRzKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkgZGF0YSA9IGRhdGEgPT09IHVuZGVmaW5lZCA/IFtdIDogW2RhdGFdXG5cbiAgICBsZXQgaSA9IDBcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlKHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICByZWFkIChjYikge1xuICAgICAgICB0aGlzLnB1c2goaSA9PT0gZGF0YS5sZW5ndGggPyBudWxsIDogZGF0YVtpKytdKVxuICAgICAgICBjYihudWxsKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgaXNCYWNrcHJlc3N1cmVkIChycykge1xuICAgIHJldHVybiAocnMuX2R1cGxleFN0YXRlICYgUkVBRF9CQUNLUFJFU1NVUkVfU1RBVFVTKSAhPT0gMCB8fCBycy5fcmVhZGFibGVTdGF0ZS5idWZmZXJlZCA+PSBycy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrXG4gIH1cblxuICBzdGF0aWMgaXNQYXVzZWQgKHJzKSB7XG4gICAgcmV0dXJuIChycy5fZHVwbGV4U3RhdGUgJiBSRUFEX1JFU1VNRUQpID09PSAwXG4gIH1cblxuICBbYXN5bmNJdGVyYXRvcl0gKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXNcblxuICAgIGxldCBlcnJvciA9IG51bGxcbiAgICBsZXQgcHJvbWlzZVJlc29sdmUgPSBudWxsXG4gICAgbGV0IHByb21pc2VSZWplY3QgPSBudWxsXG5cbiAgICB0aGlzLm9uKCdlcnJvcicsIChlcnIpID0+IHsgZXJyb3IgPSBlcnIgfSlcbiAgICB0aGlzLm9uKCdyZWFkYWJsZScsIG9ucmVhZGFibGUpXG4gICAgdGhpcy5vbignY2xvc2UnLCBvbmNsb3NlKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIFthc3luY0l0ZXJhdG9yXSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgICB9LFxuICAgICAgbmV4dCAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgcHJvbWlzZVJlc29sdmUgPSByZXNvbHZlXG4gICAgICAgICAgcHJvbWlzZVJlamVjdCA9IHJlamVjdFxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBzdHJlYW0ucmVhZCgpXG4gICAgICAgICAgaWYgKGRhdGEgIT09IG51bGwpIG9uZGF0YShkYXRhKVxuICAgICAgICAgIGVsc2UgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWUVEKSAhPT0gMCkgb25kYXRhKG51bGwpXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgcmV0dXJuICgpIHtcbiAgICAgICAgcmV0dXJuIGRlc3Ryb3kobnVsbClcbiAgICAgIH0sXG4gICAgICB0aHJvdyAoZXJyKSB7XG4gICAgICAgIHJldHVybiBkZXN0cm95KGVycilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbnJlYWRhYmxlICgpIHtcbiAgICAgIGlmIChwcm9taXNlUmVzb2x2ZSAhPT0gbnVsbCkgb25kYXRhKHN0cmVhbS5yZWFkKCkpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25jbG9zZSAoKSB7XG4gICAgICBpZiAocHJvbWlzZVJlc29sdmUgIT09IG51bGwpIG9uZGF0YShudWxsKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uZGF0YSAoZGF0YSkge1xuICAgICAgaWYgKHByb21pc2VSZWplY3QgPT09IG51bGwpIHJldHVyblxuICAgICAgaWYgKGVycm9yKSBwcm9taXNlUmVqZWN0KGVycm9yKVxuICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gbnVsbCAmJiAoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfRE9ORSkgPT09IDApIHByb21pc2VSZWplY3QoU1RSRUFNX0RFU1RST1lFRClcbiAgICAgIGVsc2UgcHJvbWlzZVJlc29sdmUoeyB2YWx1ZTogZGF0YSwgZG9uZTogZGF0YSA9PT0gbnVsbCB9KVxuICAgICAgcHJvbWlzZVJlamVjdCA9IHByb21pc2VSZXNvbHZlID0gbnVsbFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc3Ryb3kgKGVycikge1xuICAgICAgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBERVNUUk9ZRUQpIHJldHVybiByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICBzdHJlYW0ub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGVycikgcmVqZWN0KGVycilcbiAgICAgICAgICBlbHNlIHJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBXcml0YWJsZSBleHRlbmRzIFN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcblxuICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IE9QRU5JTkcgfCBSRUFEX0RPTkVcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUodGhpcywgb3B0cylcblxuICAgIGlmIChvcHRzKSB7XG4gICAgICBpZiAob3B0cy53cml0ZXYpIHRoaXMuX3dyaXRldiA9IG9wdHMud3JpdGV2XG4gICAgICBpZiAob3B0cy53cml0ZSkgdGhpcy5fd3JpdGUgPSBvcHRzLndyaXRlXG4gICAgICBpZiAob3B0cy5maW5hbCkgdGhpcy5fZmluYWwgPSBvcHRzLmZpbmFsXG4gICAgICBpZiAob3B0cy5lYWdlck9wZW4pIHRoaXMuX3dyaXRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIH1cbiAgfVxuXG4gIGNvcmsgKCkge1xuICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IFdSSVRFX0NPUktFRFxuICB9XG5cbiAgdW5jb3JrICgpIHtcbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfQ09SS0VEXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gIH1cblxuICBfd3JpdGV2IChiYXRjaCwgY2IpIHtcbiAgICBjYihudWxsKVxuICB9XG5cbiAgX3dyaXRlIChkYXRhLCBjYikge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuYXV0b0JhdGNoKGRhdGEsIGNiKVxuICB9XG5cbiAgX2ZpbmFsIChjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBzdGF0aWMgaXNCYWNrcHJlc3N1cmVkICh3cykge1xuICAgIHJldHVybiAod3MuX2R1cGxleFN0YXRlICYgV1JJVEVfQkFDS1BSRVNTVVJFX1NUQVRVUykgIT09IDBcbiAgfVxuXG4gIHN0YXRpYyBkcmFpbmVkICh3cykge1xuICAgIGlmICh3cy5kZXN0cm95ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpXG4gICAgY29uc3Qgc3RhdGUgPSB3cy5fd3JpdGFibGVTdGF0ZVxuICAgIGNvbnN0IHBlbmRpbmcgPSAoaXNXcml0ZXYod3MpID8gTWF0aC5taW4oMSwgc3RhdGUucXVldWUubGVuZ3RoKSA6IHN0YXRlLnF1ZXVlLmxlbmd0aClcbiAgICBjb25zdCB3cml0ZXMgPSBwZW5kaW5nICsgKCh3cy5fZHVwbGV4U3RhdGUgJiBXUklURV9XUklUSU5HKSA/IDEgOiAwKVxuICAgIGlmICh3cml0ZXMgPT09IDApIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSlcbiAgICBpZiAoc3RhdGUuZHJhaW5zID09PSBudWxsKSBzdGF0ZS5kcmFpbnMgPSBbXVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc3RhdGUuZHJhaW5zLnB1c2goeyB3cml0ZXMsIHJlc29sdmUgfSlcbiAgICB9KVxuICB9XG5cbiAgd3JpdGUgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5wdXNoKGRhdGEpXG4gIH1cblxuICBlbmQgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZChkYXRhKVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxuY2xhc3MgRHVwbGV4IGV4dGVuZHMgUmVhZGFibGUgeyAvLyBhbmQgV3JpdGFibGVcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuXG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgPSBPUEVOSU5HIHwgKHRoaXMuX2R1cGxleFN0YXRlICYgUkVBRF9SRUFEX0FIRUFEKVxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZSh0aGlzLCBvcHRzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLndyaXRldikgdGhpcy5fd3JpdGV2ID0gb3B0cy53cml0ZXZcbiAgICAgIGlmIChvcHRzLndyaXRlKSB0aGlzLl93cml0ZSA9IG9wdHMud3JpdGVcbiAgICAgIGlmIChvcHRzLmZpbmFsKSB0aGlzLl9maW5hbCA9IG9wdHMuZmluYWxcbiAgICB9XG4gIH1cblxuICBjb3JrICgpIHtcbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9DT1JLRURcbiAgfVxuXG4gIHVuY29yayAoKSB7XG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX0NPUktFRFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICB9XG5cbiAgX3dyaXRldiAoYmF0Y2gsIGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmF1dG9CYXRjaChkYXRhLCBjYilcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICBjYihudWxsKVxuICB9XG5cbiAgd3JpdGUgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5wdXNoKGRhdGEpXG4gIH1cblxuICBlbmQgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZChkYXRhKVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxuY2xhc3MgVHJhbnNmb3JtIGV4dGVuZHMgRHVwbGV4IHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMudHJhbnNmb3JtKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRzLnRyYW5zZm9ybVxuICAgICAgaWYgKG9wdHMuZmx1c2gpIHRoaXMuX2ZsdXNoID0gb3B0cy5mbHVzaFxuICAgIH1cbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXJlZCA+PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICAgIHRoaXMuX3RyYW5zZm9ybVN0YXRlLmRhdGEgPSBkYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3RyYW5zZm9ybShkYXRhLCB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlclRyYW5zZm9ybSlcbiAgICB9XG4gIH1cblxuICBfcmVhZCAoY2IpIHtcbiAgICBpZiAodGhpcy5fdHJhbnNmb3JtU3RhdGUuZGF0YSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlLmRhdGFcbiAgICAgIHRoaXMuX3RyYW5zZm9ybVN0YXRlLmRhdGEgPSBudWxsXG4gICAgICBjYihudWxsKVxuICAgICAgdGhpcy5fdHJhbnNmb3JtKGRhdGEsIHRoaXMuX3RyYW5zZm9ybVN0YXRlLmFmdGVyVHJhbnNmb3JtKVxuICAgIH0gZWxzZSB7XG4gICAgICBjYihudWxsKVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3kgKGVycikge1xuICAgIHN1cGVyLmRlc3Ryb3koZXJyKVxuICAgIGlmICh0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gbnVsbFxuICAgICAgdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJUcmFuc2Zvcm0oKVxuICAgIH1cbiAgfVxuXG4gIF90cmFuc2Zvcm0gKGRhdGEsIGNiKSB7XG4gICAgY2IobnVsbCwgZGF0YSlcbiAgfVxuXG4gIF9mbHVzaCAoY2IpIHtcbiAgICBjYihudWxsKVxuICB9XG5cbiAgX2ZpbmFsIChjYikge1xuICAgIHRoaXMuX3RyYW5zZm9ybVN0YXRlLmFmdGVyRmluYWwgPSBjYlxuICAgIHRoaXMuX2ZsdXNoKHRyYW5zZm9ybUFmdGVyRmx1c2guYmluZCh0aGlzKSlcbiAgfVxufVxuXG5jbGFzcyBQYXNzVGhyb3VnaCBleHRlbmRzIFRyYW5zZm9ybSB7fVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1BZnRlckZsdXNoIChlcnIsIGRhdGEpIHtcbiAgY29uc3QgY2IgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlckZpbmFsXG4gIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgdGhpcy5wdXNoKGRhdGEpXG4gIHRoaXMucHVzaChudWxsKVxuICBjYihudWxsKVxufVxuXG5mdW5jdGlvbiBwaXBlbGluZVByb21pc2UgKC4uLnN0cmVhbXMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXR1cm4gcGlwZWxpbmUoLi4uc3RyZWFtcywgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpXG4gICAgICByZXNvbHZlKClcbiAgICB9KVxuICB9KVxufVxuXG5mdW5jdGlvbiBwaXBlbGluZSAoc3RyZWFtLCAuLi5zdHJlYW1zKSB7XG4gIGNvbnN0IGFsbCA9IEFycmF5LmlzQXJyYXkoc3RyZWFtKSA/IFsuLi5zdHJlYW0sIC4uLnN0cmVhbXNdIDogW3N0cmVhbSwgLi4uc3RyZWFtc11cbiAgY29uc3QgZG9uZSA9IChhbGwubGVuZ3RoICYmIHR5cGVvZiBhbGxbYWxsLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSA/IGFsbC5wb3AoKSA6IG51bGxcblxuICBpZiAoYWxsLmxlbmd0aCA8IDIpIHRocm93IG5ldyBFcnJvcignUGlwZWxpbmUgcmVxdWlyZXMgYXQgbGVhc3QgMiBzdHJlYW1zJylcblxuICBsZXQgc3JjID0gYWxsWzBdXG4gIGxldCBkZXN0ID0gbnVsbFxuICBsZXQgZXJyb3IgPSBudWxsXG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICBkZXN0ID0gYWxsW2ldXG5cbiAgICBpZiAoaXNTdHJlYW14KHNyYykpIHtcbiAgICAgIHNyYy5waXBlKGRlc3QsIG9uZXJyb3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9ySGFuZGxlKHNyYywgdHJ1ZSwgaSA+IDEsIG9uZXJyb3IpXG4gICAgICBzcmMucGlwZShkZXN0KVxuICAgIH1cblxuICAgIHNyYyA9IGRlc3RcbiAgfVxuXG4gIGlmIChkb25lKSB7XG4gICAgbGV0IGZpbiA9IGZhbHNlXG5cbiAgICBjb25zdCBhdXRvRGVzdHJveSA9IGlzU3RyZWFteChkZXN0KSB8fCAhIShkZXN0Ll93cml0YWJsZVN0YXRlICYmIGRlc3QuX3dyaXRhYmxlU3RhdGUuYXV0b0Rlc3Ryb3kpXG5cbiAgICBkZXN0Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnJvciA9PT0gbnVsbCkgZXJyb3IgPSBlcnJcbiAgICB9KVxuXG4gICAgZGVzdC5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgZmluID0gdHJ1ZVxuICAgICAgaWYgKCFhdXRvRGVzdHJveSkgZG9uZShlcnJvcilcbiAgICB9KVxuXG4gICAgaWYgKGF1dG9EZXN0cm95KSB7XG4gICAgICBkZXN0Lm9uKCdjbG9zZScsICgpID0+IGRvbmUoZXJyb3IgfHwgKGZpbiA/IG51bGwgOiBQUkVNQVRVUkVfQ0xPU0UpKSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVzdFxuXG4gIGZ1bmN0aW9uIGVycm9ySGFuZGxlIChzLCByZCwgd3IsIG9uZXJyb3IpIHtcbiAgICBzLm9uKCdlcnJvcicsIG9uZXJyb3IpXG4gICAgcy5vbignY2xvc2UnLCBvbmNsb3NlKVxuXG4gICAgZnVuY3Rpb24gb25jbG9zZSAoKSB7XG4gICAgICBpZiAocmQgJiYgcy5fcmVhZGFibGVTdGF0ZSAmJiAhcy5fcmVhZGFibGVTdGF0ZS5lbmRlZCkgcmV0dXJuIG9uZXJyb3IoUFJFTUFUVVJFX0NMT1NFKVxuICAgICAgaWYgKHdyICYmIHMuX3dyaXRhYmxlU3RhdGUgJiYgIXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybiBvbmVycm9yKFBSRU1BVFVSRV9DTE9TRSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVycm9yIChlcnIpIHtcbiAgICBpZiAoIWVyciB8fCBlcnJvcikgcmV0dXJuXG4gICAgZXJyb3IgPSBlcnJcblxuICAgIGZvciAoY29uc3QgcyBvZiBhbGwpIHtcbiAgICAgIHMuZGVzdHJveShlcnIpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGVjaG8gKHMpIHtcbiAgcmV0dXJuIHNcbn1cblxuZnVuY3Rpb24gaXNTdHJlYW0gKHN0cmVhbSkge1xuICByZXR1cm4gISFzdHJlYW0uX3JlYWRhYmxlU3RhdGUgfHwgISFzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbn1cblxuZnVuY3Rpb24gaXNTdHJlYW14IChzdHJlYW0pIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHJlYW0uX2R1cGxleFN0YXRlID09PSAnbnVtYmVyJyAmJiBpc1N0cmVhbShzdHJlYW0pXG59XG5cbmZ1bmN0aW9uIGdldFN0cmVhbUVycm9yIChzdHJlYW0sIG9wdHMgPSB7fSkge1xuICBjb25zdCBlcnIgPSAoc3RyZWFtLl9yZWFkYWJsZVN0YXRlICYmIHN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lcnJvcikgfHwgKHN0cmVhbS5fd3JpdGFibGVTdGF0ZSAmJiBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3IpXG5cbiAgLy8gYXZvaWQgaW1wbGljaXQgZXJyb3JzIGJ5IGRlZmF1bHRcbiAgcmV0dXJuICghb3B0cy5hbGwgJiYgZXJyID09PSBTVFJFQU1fREVTVFJPWUVEKSA/IG51bGwgOiBlcnJcbn1cblxuZnVuY3Rpb24gaXNSZWFkU3RyZWFteCAoc3RyZWFtKSB7XG4gIHJldHVybiBpc1N0cmVhbXgoc3RyZWFtKSAmJiBzdHJlYW0ucmVhZGFibGVcbn1cblxuZnVuY3Rpb24gaXNUeXBlZEFycmF5IChkYXRhKSB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgZGF0YS5ieXRlTGVuZ3RoID09PSAnbnVtYmVyJ1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Qnl0ZUxlbmd0aCAoZGF0YSkge1xuICByZXR1cm4gaXNUeXBlZEFycmF5KGRhdGEpID8gZGF0YS5ieXRlTGVuZ3RoIDogMTAyNFxufVxuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIGFib3J0ICgpIHtcbiAgdGhpcy5kZXN0cm95KG5ldyBFcnJvcignU3RyZWFtIGFib3J0ZWQuJykpXG59XG5cbmZ1bmN0aW9uIGlzV3JpdGV2IChzKSB7XG4gIHJldHVybiBzLl93cml0ZXYgIT09IFdyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ICYmIHMuX3dyaXRldiAhPT0gRHVwbGV4LnByb3RvdHlwZS5fd3JpdGV2XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwaXBlbGluZSxcbiAgcGlwZWxpbmVQcm9taXNlLFxuICBpc1N0cmVhbSxcbiAgaXNTdHJlYW14LFxuICBnZXRTdHJlYW1FcnJvcixcbiAgU3RyZWFtLFxuICBXcml0YWJsZSxcbiAgUmVhZGFibGUsXG4gIER1cGxleCxcbiAgVHJhbnNmb3JtLFxuICAvLyBFeHBvcnQgUGFzc1Rocm91Z2ggZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBOb2RlLmpzIGNvcmUncyBzdHJlYW0gbW9kdWxlXG4gIFBhc3NUaHJvdWdoXG59XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBzdHJpcEFuc2kgPSByZXF1aXJlKCdzdHJpcC1hbnNpJyk7XG5jb25zdCBpc0Z1bGx3aWR0aENvZGVQb2ludCA9IHJlcXVpcmUoJ2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50Jyk7XG5jb25zdCBlbW9qaVJlZ2V4ID0gcmVxdWlyZSgnZW1vamktcmVnZXgnKTtcblxuY29uc3Qgc3RyaW5nV2lkdGggPSBzdHJpbmcgPT4ge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycgfHwgc3RyaW5nLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0c3RyaW5nID0gc3RyaXBBbnNpKHN0cmluZyk7XG5cblx0aWYgKHN0cmluZy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGVtb2ppUmVnZXgoKSwgJyAgJyk7XG5cblx0bGV0IHdpZHRoID0gMDtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IGNvZGUgPSBzdHJpbmcuY29kZVBvaW50QXQoaSk7XG5cblx0XHQvLyBJZ25vcmUgY29udHJvbCBjaGFyYWN0ZXJzXG5cdFx0aWYgKGNvZGUgPD0gMHgxRiB8fCAoY29kZSA+PSAweDdGICYmIGNvZGUgPD0gMHg5RikpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdC8vIElnbm9yZSBjb21iaW5pbmcgY2hhcmFjdGVyc1xuXHRcdGlmIChjb2RlID49IDB4MzAwICYmIGNvZGUgPD0gMHgzNkYpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdC8vIFN1cnJvZ2F0ZXNcblx0XHRpZiAoY29kZSA+IDB4RkZGRikge1xuXHRcdFx0aSsrO1xuXHRcdH1cblxuXHRcdHdpZHRoICs9IGlzRnVsbHdpZHRoQ29kZVBvaW50KGNvZGUpID8gMiA6IDE7XG5cdH1cblxuXHRyZXR1cm4gd2lkdGg7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1dpZHRoO1xuLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvblxubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IHN0cmluZ1dpZHRoO1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYW5zaVJlZ2V4ID0gcmVxdWlyZSgnYW5zaS1yZWdleCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZyA9PiB0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJyA/IHN0cmluZy5yZXBsYWNlKGFuc2lSZWdleCgpLCAnJykgOiBzdHJpbmc7XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBvcyA9IHJlcXVpcmUoJ29zJyk7XG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IGhhc0ZsYWcgPSByZXF1aXJlKCdoYXMtZmxhZycpO1xuXG5jb25zdCB7ZW52fSA9IHByb2Nlc3M7XG5cbmxldCBmbGFnRm9yY2VDb2xvcjtcbmlmIChoYXNGbGFnKCduby1jb2xvcicpIHx8XG5cdGhhc0ZsYWcoJ25vLWNvbG9ycycpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPWZhbHNlJykgfHxcblx0aGFzRmxhZygnY29sb3I9bmV2ZXInKSkge1xuXHRmbGFnRm9yY2VDb2xvciA9IDA7XG59IGVsc2UgaWYgKGhhc0ZsYWcoJ2NvbG9yJykgfHxcblx0aGFzRmxhZygnY29sb3JzJykgfHxcblx0aGFzRmxhZygnY29sb3I9dHJ1ZScpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPWFsd2F5cycpKSB7XG5cdGZsYWdGb3JjZUNvbG9yID0gMTtcbn1cblxuZnVuY3Rpb24gZW52Rm9yY2VDb2xvcigpIHtcblx0aWYgKCdGT1JDRV9DT0xPUicgaW4gZW52KSB7XG5cdFx0aWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ3RydWUnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRpZiAoZW52LkZPUkNFX0NPTE9SID09PSAnZmFsc2UnKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW52LkZPUkNFX0NPTE9SLmxlbmd0aCA9PT0gMCA/IDEgOiBNYXRoLm1pbihOdW1iZXIucGFyc2VJbnQoZW52LkZPUkNFX0NPTE9SLCAxMCksIDMpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZUxldmVsKGxldmVsKSB7XG5cdGlmIChsZXZlbCA9PT0gMCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bGV2ZWwsXG5cdFx0aGFzQmFzaWM6IHRydWUsXG5cdFx0aGFzMjU2OiBsZXZlbCA+PSAyLFxuXHRcdGhhczE2bTogbGV2ZWwgPj0gM1xuXHR9O1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0NvbG9yKGhhdmVTdHJlYW0sIHtzdHJlYW1Jc1RUWSwgc25pZmZGbGFncyA9IHRydWV9ID0ge30pIHtcblx0Y29uc3Qgbm9GbGFnRm9yY2VDb2xvciA9IGVudkZvcmNlQ29sb3IoKTtcblx0aWYgKG5vRmxhZ0ZvcmNlQ29sb3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdGZsYWdGb3JjZUNvbG9yID0gbm9GbGFnRm9yY2VDb2xvcjtcblx0fVxuXG5cdGNvbnN0IGZvcmNlQ29sb3IgPSBzbmlmZkZsYWdzID8gZmxhZ0ZvcmNlQ29sb3IgOiBub0ZsYWdGb3JjZUNvbG9yO1xuXG5cdGlmIChmb3JjZUNvbG9yID09PSAwKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRpZiAoc25pZmZGbGFncykge1xuXHRcdGlmIChoYXNGbGFnKCdjb2xvcj0xNm0nKSB8fFxuXHRcdFx0aGFzRmxhZygnY29sb3I9ZnVsbCcpIHx8XG5cdFx0XHRoYXNGbGFnKCdjb2xvcj10cnVlY29sb3InKSkge1xuXHRcdFx0cmV0dXJuIDM7XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTI1NicpKSB7XG5cdFx0XHRyZXR1cm4gMjtcblx0XHR9XG5cdH1cblxuXHRpZiAoaGF2ZVN0cmVhbSAmJiAhc3RyZWFtSXNUVFkgJiYgZm9yY2VDb2xvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRjb25zdCBtaW4gPSBmb3JjZUNvbG9yIHx8IDA7XG5cblx0aWYgKGVudi5URVJNID09PSAnZHVtYicpIHtcblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDEwNTg2IGlzIHRoZSBmaXJzdCBXaW5kb3dzIHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAyNTYgY29sb3JzLlxuXHRcdC8vIFdpbmRvd3MgMTAgYnVpbGQgMTQ5MzEgaXMgdGhlIGZpcnN0IHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAxNm0vVHJ1ZUNvbG9yLlxuXHRcdGNvbnN0IG9zUmVsZWFzZSA9IG9zLnJlbGVhc2UoKS5zcGxpdCgnLicpO1xuXHRcdGlmIChcblx0XHRcdE51bWJlcihvc1JlbGVhc2VbMF0pID49IDEwICYmXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxMDU4NlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIE51bWJlcihvc1JlbGVhc2VbMl0pID49IDE0OTMxID8gMyA6IDI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoJ0NJJyBpbiBlbnYpIHtcblx0XHRpZiAoWydUUkFWSVMnLCAnQ0lSQ0xFQ0knLCAnQVBQVkVZT1InLCAnR0lUTEFCX0NJJywgJ0dJVEhVQl9BQ1RJT05TJywgJ0JVSUxES0lURScsICdEUk9ORSddLnNvbWUoc2lnbiA9PiBzaWduIGluIGVudikgfHwgZW52LkNJX05BTUUgPT09ICdjb2Rlc2hpcCcpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblxuXHRcdHJldHVybiBtaW47XG5cdH1cblxuXHRpZiAoJ1RFQU1DSVRZX1ZFUlNJT04nIGluIGVudikge1xuXHRcdHJldHVybiAvXig5XFwuKDAqWzEtOV1cXGQqKVxcLnxcXGR7Mix9XFwuKS8udGVzdChlbnYuVEVBTUNJVFlfVkVSU0lPTikgPyAxIDogMDtcblx0fVxuXG5cdGlmIChlbnYuQ09MT1JURVJNID09PSAndHJ1ZWNvbG9yJykge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKCdURVJNX1BST0dSQU0nIGluIGVudikge1xuXHRcdGNvbnN0IHZlcnNpb24gPSBOdW1iZXIucGFyc2VJbnQoKGVudi5URVJNX1BST0dSQU1fVkVSU0lPTiB8fCAnJykuc3BsaXQoJy4nKVswXSwgMTApO1xuXG5cdFx0c3dpdGNoIChlbnYuVEVSTV9QUk9HUkFNKSB7XG5cdFx0XHRjYXNlICdpVGVybS5hcHAnOlxuXHRcdFx0XHRyZXR1cm4gdmVyc2lvbiA+PSAzID8gMyA6IDI7XG5cdFx0XHRjYXNlICdBcHBsZV9UZXJtaW5hbCc6XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0Ly8gTm8gZGVmYXVsdFxuXHRcdH1cblx0fVxuXG5cdGlmICgvLTI1Nihjb2xvcik/JC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRpZiAoL15zY3JlZW58Xnh0ZXJtfF52dDEwMHxednQyMjB8XnJ4dnR8Y29sb3J8YW5zaXxjeWd3aW58bGludXgvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDT0xPUlRFUk0nIGluIGVudikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0cmV0dXJuIG1pbjtcbn1cblxuZnVuY3Rpb24gZ2V0U3VwcG9ydExldmVsKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGxldmVsID0gc3VwcG9ydHNDb2xvcihzdHJlYW0sIHtcblx0XHRzdHJlYW1Jc1RUWTogc3RyZWFtICYmIHN0cmVhbS5pc1RUWSxcblx0XHQuLi5vcHRpb25zXG5cdH0pO1xuXG5cdHJldHVybiB0cmFuc2xhdGVMZXZlbChsZXZlbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRzdXBwb3J0c0NvbG9yOiBnZXRTdXBwb3J0TGV2ZWwsXG5cdHN0ZG91dDogZ2V0U3VwcG9ydExldmVsKHtpc1RUWTogdHR5LmlzYXR0eSgxKX0pLFxuXHRzdGRlcnI6IGdldFN1cHBvcnRMZXZlbCh7aXNUVFk6IHR0eS5pc2F0dHkoMil9KVxufTtcbiIsImNvbnN0IHRhciA9IHJlcXVpcmUoJ3Rhci1zdHJlYW0nKVxuY29uc3QgcHVtcCA9IHJlcXVpcmUoJ3B1bXAnKVxuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5cbmNvbnN0IHdpbjMyID0gKGdsb2JhbC5CYXJlPy5wbGF0Zm9ybSB8fCBwcm9jZXNzLnBsYXRmb3JtKSA9PT0gJ3dpbjMyJ1xuXG5leHBvcnRzLnBhY2sgPSBmdW5jdGlvbiBwYWNrIChjd2QsIG9wdHMpIHtcbiAgaWYgKCFjd2QpIGN3ZCA9ICcuJ1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuXG4gIGNvbnN0IHhmcyA9IG9wdHMuZnMgfHwgZnNcbiAgY29uc3QgaWdub3JlID0gb3B0cy5pZ25vcmUgfHwgb3B0cy5maWx0ZXIgfHwgbm9vcFxuICBjb25zdCBtYXBTdHJlYW0gPSBvcHRzLm1hcFN0cmVhbSB8fCBlY2hvXG4gIGNvbnN0IHN0YXROZXh0ID0gc3RhdEFsbCh4ZnMsIG9wdHMuZGVyZWZlcmVuY2UgPyB4ZnMuc3RhdCA6IHhmcy5sc3RhdCwgY3dkLCBpZ25vcmUsIG9wdHMuZW50cmllcywgb3B0cy5zb3J0KVxuICBjb25zdCBzdHJpY3QgPSBvcHRzLnN0cmljdCAhPT0gZmFsc2VcbiAgY29uc3QgdW1hc2sgPSB0eXBlb2Ygb3B0cy51bWFzayA9PT0gJ251bWJlcicgPyB+b3B0cy51bWFzayA6IH5wcm9jZXNzVW1hc2soKVxuICBjb25zdCBwYWNrID0gb3B0cy5wYWNrIHx8IHRhci5wYWNrKClcbiAgY29uc3QgZmluaXNoID0gb3B0cy5maW5pc2ggfHwgbm9vcFxuXG4gIGxldCBtYXAgPSBvcHRzLm1hcCB8fCBub29wXG4gIGxldCBkbW9kZSA9IHR5cGVvZiBvcHRzLmRtb2RlID09PSAnbnVtYmVyJyA/IG9wdHMuZG1vZGUgOiAwXG4gIGxldCBmbW9kZSA9IHR5cGVvZiBvcHRzLmZtb2RlID09PSAnbnVtYmVyJyA/IG9wdHMuZm1vZGUgOiAwXG5cbiAgaWYgKG9wdHMuc3RyaXApIG1hcCA9IHN0cmlwKG1hcCwgb3B0cy5zdHJpcClcblxuICBpZiAob3B0cy5yZWFkYWJsZSkge1xuICAgIGRtb2RlIHw9IHBhcnNlSW50KDU1NSwgOClcbiAgICBmbW9kZSB8PSBwYXJzZUludCg0NDQsIDgpXG4gIH1cbiAgaWYgKG9wdHMud3JpdGFibGUpIHtcbiAgICBkbW9kZSB8PSBwYXJzZUludCgzMzMsIDgpXG4gICAgZm1vZGUgfD0gcGFyc2VJbnQoMjIyLCA4KVxuICB9XG5cbiAgb25uZXh0ZW50cnkoKVxuXG4gIGZ1bmN0aW9uIG9uc3ltbGluayAoZmlsZW5hbWUsIGhlYWRlcikge1xuICAgIHhmcy5yZWFkbGluayhwYXRoLmpvaW4oY3dkLCBmaWxlbmFtZSksIGZ1bmN0aW9uIChlcnIsIGxpbmtuYW1lKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcGFjay5kZXN0cm95KGVycilcbiAgICAgIGhlYWRlci5saW5rbmFtZSA9IG5vcm1hbGl6ZShsaW5rbmFtZSlcbiAgICAgIHBhY2suZW50cnkoaGVhZGVyLCBvbm5leHRlbnRyeSlcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gb25zdGF0IChlcnIsIGZpbGVuYW1lLCBzdGF0KSB7XG4gICAgaWYgKGVycikgcmV0dXJuIHBhY2suZGVzdHJveShlcnIpXG4gICAgaWYgKCFmaWxlbmFtZSkge1xuICAgICAgaWYgKG9wdHMuZmluYWxpemUgIT09IGZhbHNlKSBwYWNrLmZpbmFsaXplKClcbiAgICAgIHJldHVybiBmaW5pc2gocGFjaylcbiAgICB9XG5cbiAgICBpZiAoc3RhdC5pc1NvY2tldCgpKSByZXR1cm4gb25uZXh0ZW50cnkoKSAvLyB0YXIgZG9lcyBub3Qgc3VwcG9ydCBzb2NrZXRzLi4uXG5cbiAgICBsZXQgaGVhZGVyID0ge1xuICAgICAgbmFtZTogbm9ybWFsaXplKGZpbGVuYW1lKSxcbiAgICAgIG1vZGU6IChzdGF0Lm1vZGUgfCAoc3RhdC5pc0RpcmVjdG9yeSgpID8gZG1vZGUgOiBmbW9kZSkpICYgdW1hc2ssXG4gICAgICBtdGltZTogc3RhdC5tdGltZSxcbiAgICAgIHNpemU6IHN0YXQuc2l6ZSxcbiAgICAgIHR5cGU6ICdmaWxlJyxcbiAgICAgIHVpZDogc3RhdC51aWQsXG4gICAgICBnaWQ6IHN0YXQuZ2lkXG4gICAgfVxuXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaGVhZGVyLnNpemUgPSAwXG4gICAgICBoZWFkZXIudHlwZSA9ICdkaXJlY3RvcnknXG4gICAgICBoZWFkZXIgPSBtYXAoaGVhZGVyKSB8fCBoZWFkZXJcbiAgICAgIHJldHVybiBwYWNrLmVudHJ5KGhlYWRlciwgb25uZXh0ZW50cnkpXG4gICAgfVxuXG4gICAgaWYgKHN0YXQuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgaGVhZGVyLnNpemUgPSAwXG4gICAgICBoZWFkZXIudHlwZSA9ICdzeW1saW5rJ1xuICAgICAgaGVhZGVyID0gbWFwKGhlYWRlcikgfHwgaGVhZGVyXG4gICAgICByZXR1cm4gb25zeW1saW5rKGZpbGVuYW1lLCBoZWFkZXIpXG4gICAgfVxuXG4gICAgLy8gVE9ETzogYWRkIGZpZm8gZXRjLi4uXG5cbiAgICBoZWFkZXIgPSBtYXAoaGVhZGVyKSB8fCBoZWFkZXJcblxuICAgIGlmICghc3RhdC5pc0ZpbGUoKSkge1xuICAgICAgaWYgKHN0cmljdCkgcmV0dXJuIHBhY2suZGVzdHJveShuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIHR5cGUgZm9yICcgKyBmaWxlbmFtZSkpXG4gICAgICByZXR1cm4gb25uZXh0ZW50cnkoKVxuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5ID0gcGFjay5lbnRyeShoZWFkZXIsIG9ubmV4dGVudHJ5KVxuICAgIGNvbnN0IHJzID0gbWFwU3RyZWFtKHhmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGguam9pbihjd2QsIGZpbGVuYW1lKSwgeyBzdGFydDogMCwgZW5kOiBoZWFkZXIuc2l6ZSA+IDAgPyBoZWFkZXIuc2l6ZSAtIDEgOiBoZWFkZXIuc2l6ZSB9KSwgaGVhZGVyKVxuXG4gICAgcnMub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikgeyAvLyBhbHdheXMgZm9yd2FyZCBlcnJvcnMgb24gZGVzdHJveVxuICAgICAgZW50cnkuZGVzdHJveShlcnIpXG4gICAgfSlcblxuICAgIHB1bXAocnMsIGVudHJ5KVxuICB9XG5cbiAgZnVuY3Rpb24gb25uZXh0ZW50cnkgKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBwYWNrLmRlc3Ryb3koZXJyKVxuICAgIHN0YXROZXh0KG9uc3RhdClcbiAgfVxuXG4gIHJldHVybiBwYWNrXG59XG5cbmZ1bmN0aW9uIGhlYWQgKGxpc3QpIHtcbiAgcmV0dXJuIGxpc3QubGVuZ3RoID8gbGlzdFtsaXN0Lmxlbmd0aCAtIDFdIDogbnVsbFxufVxuXG5mdW5jdGlvbiBwcm9jZXNzR2V0dWlkICgpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZ2V0dWlkID8gcHJvY2Vzcy5nZXR1aWQoKSA6IC0xXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NVbWFzayAoKSB7XG4gIHJldHVybiBwcm9jZXNzLnVtYXNrID8gcHJvY2Vzcy51bWFzaygpIDogMFxufVxuXG5leHBvcnRzLmV4dHJhY3QgPSBmdW5jdGlvbiBleHRyYWN0IChjd2QsIG9wdHMpIHtcbiAgaWYgKCFjd2QpIGN3ZCA9ICcuJ1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuXG4gIGNvbnN0IHhmcyA9IG9wdHMuZnMgfHwgZnNcbiAgY29uc3QgaWdub3JlID0gb3B0cy5pZ25vcmUgfHwgb3B0cy5maWx0ZXIgfHwgbm9vcFxuICBjb25zdCBtYXBTdHJlYW0gPSBvcHRzLm1hcFN0cmVhbSB8fCBlY2hvXG4gIGNvbnN0IG93biA9IG9wdHMuY2hvd24gIT09IGZhbHNlICYmICF3aW4zMiAmJiBwcm9jZXNzR2V0dWlkKCkgPT09IDBcbiAgY29uc3QgZXh0cmFjdCA9IG9wdHMuZXh0cmFjdCB8fCB0YXIuZXh0cmFjdCgpXG4gIGNvbnN0IHN0YWNrID0gW11cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICBjb25zdCB1bWFzayA9IHR5cGVvZiBvcHRzLnVtYXNrID09PSAnbnVtYmVyJyA/IH5vcHRzLnVtYXNrIDogfnByb2Nlc3NVbWFzaygpXG4gIGNvbnN0IHN0cmljdCA9IG9wdHMuc3RyaWN0ICE9PSBmYWxzZVxuXG4gIGxldCBtYXAgPSBvcHRzLm1hcCB8fCBub29wXG4gIGxldCBkbW9kZSA9IHR5cGVvZiBvcHRzLmRtb2RlID09PSAnbnVtYmVyJyA/IG9wdHMuZG1vZGUgOiAwXG4gIGxldCBmbW9kZSA9IHR5cGVvZiBvcHRzLmZtb2RlID09PSAnbnVtYmVyJyA/IG9wdHMuZm1vZGUgOiAwXG5cbiAgaWYgKG9wdHMuc3RyaXApIG1hcCA9IHN0cmlwKG1hcCwgb3B0cy5zdHJpcClcblxuICBpZiAob3B0cy5yZWFkYWJsZSkge1xuICAgIGRtb2RlIHw9IHBhcnNlSW50KDU1NSwgOClcbiAgICBmbW9kZSB8PSBwYXJzZUludCg0NDQsIDgpXG4gIH1cbiAgaWYgKG9wdHMud3JpdGFibGUpIHtcbiAgICBkbW9kZSB8PSBwYXJzZUludCgzMzMsIDgpXG4gICAgZm1vZGUgfD0gcGFyc2VJbnQoMjIyLCA4KVxuICB9XG5cbiAgZXh0cmFjdC5vbignZW50cnknLCBvbmVudHJ5KVxuXG4gIGlmIChvcHRzLmZpbmlzaCkgZXh0cmFjdC5vbignZmluaXNoJywgb3B0cy5maW5pc2gpXG5cbiAgcmV0dXJuIGV4dHJhY3RcblxuICBmdW5jdGlvbiBvbmVudHJ5IChoZWFkZXIsIHN0cmVhbSwgbmV4dCkge1xuICAgIGhlYWRlciA9IG1hcChoZWFkZXIpIHx8IGhlYWRlclxuICAgIGhlYWRlci5uYW1lID0gbm9ybWFsaXplKGhlYWRlci5uYW1lKVxuXG4gICAgY29uc3QgbmFtZSA9IHBhdGguam9pbihjd2QsIHBhdGguam9pbignLycsIGhlYWRlci5uYW1lKSlcblxuICAgIGlmIChpZ25vcmUobmFtZSwgaGVhZGVyKSkge1xuICAgICAgc3RyZWFtLnJlc3VtZSgpXG4gICAgICByZXR1cm4gbmV4dCgpXG4gICAgfVxuXG4gICAgaWYgKGhlYWRlci50eXBlID09PSAnZGlyZWN0b3J5Jykge1xuICAgICAgc3RhY2sucHVzaChbbmFtZSwgaGVhZGVyLm10aW1lXSlcbiAgICAgIHJldHVybiBta2RpcmZpeChuYW1lLCB7XG4gICAgICAgIGZzOiB4ZnMsXG4gICAgICAgIG93bixcbiAgICAgICAgdWlkOiBoZWFkZXIudWlkLFxuICAgICAgICBnaWQ6IGhlYWRlci5naWQsXG4gICAgICAgIG1vZGU6IGhlYWRlci5tb2RlXG4gICAgICB9LCBzdGF0KVxuICAgIH1cblxuICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShuYW1lKVxuXG4gICAgdmFsaWRhdGUoeGZzLCBkaXIsIHBhdGguam9pbihjd2QsICcuJyksIGZ1bmN0aW9uIChlcnIsIHZhbGlkKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG4gICAgICBpZiAoIXZhbGlkKSByZXR1cm4gbmV4dChuZXcgRXJyb3IoZGlyICsgJyBpcyBub3QgYSB2YWxpZCBwYXRoJykpXG5cbiAgICAgIG1rZGlyZml4KGRpciwge1xuICAgICAgICBmczogeGZzLFxuICAgICAgICBvd24sXG4gICAgICAgIHVpZDogaGVhZGVyLnVpZCxcbiAgICAgICAgZ2lkOiBoZWFkZXIuZ2lkLFxuICAgICAgICAvLyBub3JtYWxseSwgdGhlIGZvbGRlcnMgd2l0aCByaWdodHMgYW5kIG93bmVyIHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBUQVIgZmlsZVxuICAgICAgICAvLyBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgY3JlYXRlIGZvbGRlciBmb3Igc2FtZSB1c2VyIGFzIGZpbGUgYW5kIHdpdGhcbiAgICAgICAgLy8gc3RhbmRhcmQgcGVybWlzc2lvbnMgb2YgMG83NTUgKHJ3eHIteHIteClcbiAgICAgICAgbW9kZTogMG83NTVcbiAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIG5leHQoZXJyKVxuXG4gICAgICAgIHN3aXRjaCAoaGVhZGVyLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdmaWxlJzogcmV0dXJuIG9uZmlsZSgpXG4gICAgICAgICAgY2FzZSAnbGluayc6IHJldHVybiBvbmxpbmsoKVxuICAgICAgICAgIGNhc2UgJ3N5bWxpbmsnOiByZXR1cm4gb25zeW1saW5rKClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdHJpY3QpIHJldHVybiBuZXh0KG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgdHlwZSBmb3IgJyArIG5hbWUgKyAnICgnICsgaGVhZGVyLnR5cGUgKyAnKScpKVxuXG4gICAgICAgIHN0cmVhbS5yZXN1bWUoKVxuICAgICAgICBuZXh0KClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIHN0YXQgKGVycikge1xuICAgICAgaWYgKGVycikgcmV0dXJuIG5leHQoZXJyKVxuICAgICAgdXRpbWVzKG5hbWUsIGhlYWRlciwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG4gICAgICAgIGlmICh3aW4zMikgcmV0dXJuIG5leHQoKVxuICAgICAgICBjaHBlcm0obmFtZSwgaGVhZGVyLCBuZXh0KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbnN5bWxpbmsgKCkge1xuICAgICAgaWYgKHdpbjMyKSByZXR1cm4gbmV4dCgpIC8vIHNraXAgc3ltbGlua3Mgb24gd2luIGZvciBub3cgYmVmb3JlIGl0IGNhbiBiZSB0ZXN0ZWRcbiAgICAgIHhmcy51bmxpbmsobmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICB4ZnMuc3ltbGluayhoZWFkZXIubGlua25hbWUsIG5hbWUsIHN0YXQpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9ubGluayAoKSB7XG4gICAgICBpZiAod2luMzIpIHJldHVybiBuZXh0KCkgLy8gc2tpcCBsaW5rcyBvbiB3aW4gZm9yIG5vdyBiZWZvcmUgaXQgY2FuIGJlIHRlc3RlZFxuICAgICAgeGZzLnVubGluayhuYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNyY3BhdGggPSBwYXRoLmpvaW4oY3dkLCBwYXRoLmpvaW4oJy8nLCBoZWFkZXIubGlua25hbWUpKVxuXG4gICAgICAgIHhmcy5saW5rKHNyY3BhdGgsIG5hbWUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRVBFUk0nICYmIG9wdHMuaGFyZGxpbmtBc0ZpbGVzRmFsbGJhY2spIHtcbiAgICAgICAgICAgIHN0cmVhbSA9IHhmcy5jcmVhdGVSZWFkU3RyZWFtKHNyY3BhdGgpXG4gICAgICAgICAgICByZXR1cm4gb25maWxlKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdGF0KGVycilcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25maWxlICgpIHtcbiAgICAgIGNvbnN0IHdzID0geGZzLmNyZWF0ZVdyaXRlU3RyZWFtKG5hbWUpXG4gICAgICBjb25zdCBycyA9IG1hcFN0cmVhbShzdHJlYW0sIGhlYWRlcilcblxuICAgICAgd3Mub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikgeyAvLyBhbHdheXMgZm9yd2FyZCBlcnJvcnMgb24gZGVzdHJveVxuICAgICAgICBycy5kZXN0cm95KGVycilcbiAgICAgIH0pXG5cbiAgICAgIHB1bXAocnMsIHdzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIpIHJldHVybiBuZXh0KGVycilcbiAgICAgICAgd3Mub24oJ2Nsb3NlJywgc3RhdClcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXRpbWVzUGFyZW50IChuYW1lLCBjYikgeyAvLyB3ZSBqdXN0IHNldCB0aGUgbXRpbWUgb24gdGhlIHBhcmVudCBkaXIgYWdhaW4gZXZlcnl0aW1lIHdlIHdyaXRlIGFuIGVudHJ5XG4gICAgbGV0IHRvcFxuICAgIHdoaWxlICgodG9wID0gaGVhZChzdGFjaykpICYmIG5hbWUuc2xpY2UoMCwgdG9wWzBdLmxlbmd0aCkgIT09IHRvcFswXSkgc3RhY2sucG9wKClcbiAgICBpZiAoIXRvcCkgcmV0dXJuIGNiKClcbiAgICB4ZnMudXRpbWVzKHRvcFswXSwgbm93LCB0b3BbMV0sIGNiKVxuICB9XG5cbiAgZnVuY3Rpb24gdXRpbWVzIChuYW1lLCBoZWFkZXIsIGNiKSB7XG4gICAgaWYgKG9wdHMudXRpbWVzID09PSBmYWxzZSkgcmV0dXJuIGNiKClcblxuICAgIGlmIChoZWFkZXIudHlwZSA9PT0gJ2RpcmVjdG9yeScpIHJldHVybiB4ZnMudXRpbWVzKG5hbWUsIG5vdywgaGVhZGVyLm10aW1lLCBjYilcbiAgICBpZiAoaGVhZGVyLnR5cGUgPT09ICdzeW1saW5rJykgcmV0dXJuIHV0aW1lc1BhcmVudChuYW1lLCBjYikgLy8gVE9ETzogaG93IHRvIHNldCBtdGltZSBvbiBsaW5rP1xuXG4gICAgeGZzLnV0aW1lcyhuYW1lLCBub3csIGhlYWRlci5tdGltZSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgIHV0aW1lc1BhcmVudChuYW1lLCBjYilcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gY2hwZXJtIChuYW1lLCBoZWFkZXIsIGNiKSB7XG4gICAgY29uc3QgbGluayA9IGhlYWRlci50eXBlID09PSAnc3ltbGluaydcblxuICAgIC8qIGVzbGludC1kaXNhYmxlIG4vbm8tZGVwcmVjYXRlZC1hcGkgKi9cbiAgICBjb25zdCBjaG1vZCA9IGxpbmsgPyB4ZnMubGNobW9kIDogeGZzLmNobW9kXG4gICAgY29uc3QgY2hvd24gPSBsaW5rID8geGZzLmxjaG93biA6IHhmcy5jaG93blxuICAgIC8qIGVzbGludC1lbmFibGUgbi9uby1kZXByZWNhdGVkLWFwaSAqL1xuXG4gICAgaWYgKCFjaG1vZCkgcmV0dXJuIGNiKClcblxuICAgIGNvbnN0IG1vZGUgPSAoaGVhZGVyLm1vZGUgfCAoaGVhZGVyLnR5cGUgPT09ICdkaXJlY3RvcnknID8gZG1vZGUgOiBmbW9kZSkpICYgdW1hc2tcblxuICAgIGlmIChjaG93biAmJiBvd24pIGNob3duLmNhbGwoeGZzLCBuYW1lLCBoZWFkZXIudWlkLCBoZWFkZXIuZ2lkLCBvbmNob3duKVxuICAgIGVsc2Ugb25jaG93bihudWxsKVxuXG4gICAgZnVuY3Rpb24gb25jaG93biAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgICAgaWYgKCFjaG1vZCkgcmV0dXJuIGNiKClcbiAgICAgIGNobW9kLmNhbGwoeGZzLCBuYW1lLCBtb2RlLCBjYilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBta2RpcmZpeCAobmFtZSwgb3B0cywgY2IpIHtcbiAgICAvLyB3aGVuIG1rZGlyIGlzIGNhbGxlZCBvbiBhbiBleGlzdGluZyBkaXJlY3RvcnksIHRoZSBwZXJtaXNzaW9uc1xuICAgIC8vIHdpbGwgYmUgb3ZlcndyaXR0ZW4gKD8pLCB0byBhdm9pZCB0aGlzIHdlIGNoZWNrIGZvciBpdHMgZXhpc3RhbmNlIGZpcnN0XG4gICAgeGZzLnN0YXQobmFtZSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKCFlcnIpIHJldHVybiBjYihudWxsKVxuICAgICAgaWYgKGVyci5jb2RlICE9PSAnRU5PRU5UJykgcmV0dXJuIGNiKGVycilcbiAgICAgIHhmcy5ta2RpcihuYW1lLCB7IG1vZGU6IG9wdHMubW9kZSwgcmVjdXJzaXZlOiB0cnVlIH0sIGZ1bmN0aW9uIChlcnIsIG1hZGUpIHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgICAgY2hwZXJtKG5hbWUsIG9wdHMsIGNiKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlIChmcywgbmFtZSwgcm9vdCwgY2IpIHtcbiAgaWYgKG5hbWUgPT09IHJvb3QpIHJldHVybiBjYihudWxsLCB0cnVlKVxuICBmcy5sc3RhdChuYW1lLCBmdW5jdGlvbiAoZXJyLCBzdCkge1xuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gdmFsaWRhdGUoZnMsIHBhdGguam9pbihuYW1lLCAnLi4nKSwgcm9vdCwgY2IpXG4gICAgZWxzZSBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgIGNiKG51bGwsIHN0LmlzRGlyZWN0b3J5KCkpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIG5vb3AgKCkge31cblxuZnVuY3Rpb24gZWNobyAobmFtZSkge1xuICByZXR1cm4gbmFtZVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemUgKG5hbWUpIHtcbiAgcmV0dXJuIHdpbjMyID8gbmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJykucmVwbGFjZSgvWzo/PD58XS9nLCAnXycpIDogbmFtZVxufVxuXG5mdW5jdGlvbiBzdGF0QWxsIChmcywgc3RhdCwgY3dkLCBpZ25vcmUsIGVudHJpZXMsIHNvcnQpIHtcbiAgaWYgKCFlbnRyaWVzKSBlbnRyaWVzID0gWycuJ11cbiAgY29uc3QgcXVldWUgPSBlbnRyaWVzLnNsaWNlKDApXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGxvb3AgKGNhbGxiYWNrKSB7XG4gICAgaWYgKCFxdWV1ZS5sZW5ndGgpIHJldHVybiBjYWxsYmFjayhudWxsKVxuXG4gICAgY29uc3QgbmV4dCA9IHF1ZXVlLnNoaWZ0KClcbiAgICBjb25zdCBuZXh0QWJzID0gcGF0aC5qb2luKGN3ZCwgbmV4dClcblxuICAgIHN0YXQuY2FsbChmcywgbmV4dEFicywgZnVuY3Rpb24gKGVyciwgc3RhdCkge1xuICAgICAgLy8gaWdub3JlIGVycm9ycyBpZiB0aGUgZmlsZXMgd2VyZSBkZWxldGVkIHdoaWxlIGJ1ZmZlcmluZ1xuICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVudHJpZXMuaW5kZXhPZihuZXh0KSA9PT0gLTEgJiYgZXJyLmNvZGUgPT09ICdFTk9FTlQnID8gbnVsbCA6IGVycilcblxuICAgICAgaWYgKCFzdGF0LmlzRGlyZWN0b3J5KCkpIHJldHVybiBjYWxsYmFjayhudWxsLCBuZXh0LCBzdGF0KVxuXG4gICAgICBmcy5yZWFkZGlyKG5leHRBYnMsIGZ1bmN0aW9uIChlcnIsIGZpbGVzKSB7XG4gICAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpXG5cbiAgICAgICAgaWYgKHNvcnQpIGZpbGVzLnNvcnQoKVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIWlnbm9yZShwYXRoLmpvaW4oY3dkLCBuZXh0LCBmaWxlc1tpXSkpKSBxdWV1ZS5wdXNoKHBhdGguam9pbihuZXh0LCBmaWxlc1tpXSkpXG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhudWxsLCBuZXh0LCBzdGF0KVxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmlwIChtYXAsIGxldmVsKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaGVhZGVyKSB7XG4gICAgaGVhZGVyLm5hbWUgPSBoZWFkZXIubmFtZS5zcGxpdCgnLycpLnNsaWNlKGxldmVsKS5qb2luKCcvJylcblxuICAgIGNvbnN0IGxpbmtuYW1lID0gaGVhZGVyLmxpbmtuYW1lXG4gICAgaWYgKGxpbmtuYW1lICYmIChoZWFkZXIudHlwZSA9PT0gJ2xpbmsnIHx8IHBhdGguaXNBYnNvbHV0ZShsaW5rbmFtZSkpKSB7XG4gICAgICBoZWFkZXIubGlua25hbWUgPSBsaW5rbmFtZS5zcGxpdCgnLycpLnNsaWNlKGxldmVsKS5qb2luKCcvJylcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwKGhlYWRlcilcbiAgfVxufVxuIiwiY29uc3QgY29uc3RhbnRzID0geyAvLyBqdXN0IGZvciBlbnZzIHdpdGhvdXQgZnNcbiAgU19JRk1UOiA2MTQ0MCxcbiAgU19JRkRJUjogMTYzODQsXG4gIFNfSUZDSFI6IDgxOTIsXG4gIFNfSUZCTEs6IDI0NTc2LFxuICBTX0lGSUZPOiA0MDk2LFxuICBTX0lGTE5LOiA0MDk2MFxufVxuXG50cnkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2ZzJykuY29uc3RhbnRzIHx8IGNvbnN0YW50c1xufSBjYXRjaCB7XG4gIG1vZHVsZS5leHBvcnRzID0gY29uc3RhbnRzXG59XG4iLCJjb25zdCB7IFdyaXRhYmxlLCBSZWFkYWJsZSwgZ2V0U3RyZWFtRXJyb3IgfSA9IHJlcXVpcmUoJ3N0cmVhbXgnKVxuY29uc3QgRklGTyA9IHJlcXVpcmUoJ2Zhc3QtZmlmbycpXG5jb25zdCBiNGEgPSByZXF1aXJlKCdiNGEnKVxuY29uc3QgaGVhZGVycyA9IHJlcXVpcmUoJy4vaGVhZGVycycpXG5cbmNvbnN0IEVNUFRZID0gYjRhLmFsbG9jKDApXG5cbmNsYXNzIEJ1ZmZlckxpc3Qge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5idWZmZXJlZCA9IDBcbiAgICB0aGlzLnNoaWZ0ZWQgPSAwXG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBGSUZPKClcblxuICAgIHRoaXMuX29mZnNldCA9IDBcbiAgfVxuXG4gIHB1c2ggKGJ1ZmZlcikge1xuICAgIHRoaXMuYnVmZmVyZWQgKz0gYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICB0aGlzLnF1ZXVlLnB1c2goYnVmZmVyKVxuICB9XG5cbiAgc2hpZnRGaXJzdCAoc2l6ZSkge1xuICAgIHJldHVybiB0aGlzLl9idWZmZXJlZCA9PT0gMCA/IG51bGwgOiB0aGlzLl9uZXh0KHNpemUpXG4gIH1cblxuICBzaGlmdCAoc2l6ZSkge1xuICAgIGlmIChzaXplID4gdGhpcy5idWZmZXJlZCkgcmV0dXJuIG51bGxcbiAgICBpZiAoc2l6ZSA9PT0gMCkgcmV0dXJuIEVNUFRZXG5cbiAgICBsZXQgY2h1bmsgPSB0aGlzLl9uZXh0KHNpemUpXG5cbiAgICBpZiAoc2l6ZSA9PT0gY2h1bmsuYnl0ZUxlbmd0aCkgcmV0dXJuIGNodW5rIC8vIGxpa2VseSBjYXNlXG5cbiAgICBjb25zdCBjaHVua3MgPSBbY2h1bmtdXG5cbiAgICB3aGlsZSAoKHNpemUgLT0gY2h1bmsuYnl0ZUxlbmd0aCkgPiAwKSB7XG4gICAgICBjaHVuayA9IHRoaXMuX25leHQoc2l6ZSlcbiAgICAgIGNodW5rcy5wdXNoKGNodW5rKVxuICAgIH1cblxuICAgIHJldHVybiBiNGEuY29uY2F0KGNodW5rcylcbiAgfVxuXG4gIF9uZXh0IChzaXplKSB7XG4gICAgY29uc3QgYnVmID0gdGhpcy5xdWV1ZS5wZWVrKClcbiAgICBjb25zdCByZW0gPSBidWYuYnl0ZUxlbmd0aCAtIHRoaXMuX29mZnNldFxuXG4gICAgaWYgKHNpemUgPj0gcmVtKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9vZmZzZXQgPyBidWYuc3ViYXJyYXkodGhpcy5fb2Zmc2V0LCBidWYuYnl0ZUxlbmd0aCkgOiBidWZcbiAgICAgIHRoaXMucXVldWUuc2hpZnQoKVxuICAgICAgdGhpcy5fb2Zmc2V0ID0gMFxuICAgICAgdGhpcy5idWZmZXJlZCAtPSByZW1cbiAgICAgIHRoaXMuc2hpZnRlZCArPSByZW1cbiAgICAgIHJldHVybiBzdWJcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlcmVkIC09IHNpemVcbiAgICB0aGlzLnNoaWZ0ZWQgKz0gc2l6ZVxuXG4gICAgcmV0dXJuIGJ1Zi5zdWJhcnJheSh0aGlzLl9vZmZzZXQsICh0aGlzLl9vZmZzZXQgKz0gc2l6ZSkpXG4gIH1cbn1cblxuY2xhc3MgU291cmNlIGV4dGVuZHMgUmVhZGFibGUge1xuICBjb25zdHJ1Y3RvciAoc2VsZiwgaGVhZGVyLCBvZmZzZXQpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzLmhlYWRlciA9IGhlYWRlclxuICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0XG5cbiAgICB0aGlzLl9wYXJlbnQgPSBzZWxmXG4gIH1cblxuICBfcmVhZCAoY2IpIHtcbiAgICBpZiAodGhpcy5oZWFkZXIuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5wdXNoKG51bGwpXG4gICAgfVxuICAgIGlmICh0aGlzLl9wYXJlbnQuX3N0cmVhbSA9PT0gdGhpcykge1xuICAgICAgdGhpcy5fcGFyZW50Ll91cGRhdGUoKVxuICAgIH1cbiAgICBjYihudWxsKVxuICB9XG5cbiAgX3ByZWRlc3Ryb3kgKCkge1xuICAgIHRoaXMuX3BhcmVudC5kZXN0cm95KGdldFN0cmVhbUVycm9yKHRoaXMpKVxuICB9XG5cbiAgX2RldGFjaCAoKSB7XG4gICAgaWYgKHRoaXMuX3BhcmVudC5fc3RyZWFtID09PSB0aGlzKSB7XG4gICAgICB0aGlzLl9wYXJlbnQuX3N0cmVhbSA9IG51bGxcbiAgICAgIHRoaXMuX3BhcmVudC5fbWlzc2luZyA9IG92ZXJmbG93KHRoaXMuaGVhZGVyLnNpemUpXG4gICAgICB0aGlzLl9wYXJlbnQuX3VwZGF0ZSgpXG4gICAgfVxuICB9XG5cbiAgX2Rlc3Ryb3kgKGNiKSB7XG4gICAgdGhpcy5fZGV0YWNoKClcbiAgICBjYihudWxsKVxuICB9XG59XG5cbmNsYXNzIEV4dHJhY3QgZXh0ZW5kcyBXcml0YWJsZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcblxuICAgIGlmICghb3B0cykgb3B0cyA9IHt9XG5cbiAgICB0aGlzLl9idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpXG4gICAgdGhpcy5fb2Zmc2V0ID0gMFxuICAgIHRoaXMuX2hlYWRlciA9IG51bGxcbiAgICB0aGlzLl9zdHJlYW0gPSBudWxsXG4gICAgdGhpcy5fbWlzc2luZyA9IDBcbiAgICB0aGlzLl9sb25nSGVhZGVyID0gZmFsc2VcbiAgICB0aGlzLl9jYWxsYmFjayA9IG5vb3BcbiAgICB0aGlzLl9sb2NrZWQgPSBmYWxzZVxuICAgIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2VcbiAgICB0aGlzLl9wYXggPSBudWxsXG4gICAgdGhpcy5fcGF4R2xvYmFsID0gbnVsbFxuICAgIHRoaXMuX2dudUxvbmdQYXRoID0gbnVsbFxuICAgIHRoaXMuX2dudUxvbmdMaW5rUGF0aCA9IG51bGxcbiAgICB0aGlzLl9maWxlbmFtZUVuY29kaW5nID0gb3B0cy5maWxlbmFtZUVuY29kaW5nIHx8ICd1dGYtOCdcbiAgICB0aGlzLl9hbGxvd1Vua25vd25Gb3JtYXQgPSAhIW9wdHMuYWxsb3dVbmtub3duRm9ybWF0XG4gICAgdGhpcy5fdW5sb2NrQm91bmQgPSB0aGlzLl91bmxvY2suYmluZCh0aGlzKVxuICB9XG5cbiAgX3VubG9jayAoZXJyKSB7XG4gICAgdGhpcy5fbG9ja2VkID0gZmFsc2VcblxuICAgIGlmIChlcnIpIHtcbiAgICAgIHRoaXMuZGVzdHJveShlcnIpXG4gICAgICB0aGlzLl9jb250aW51ZVdyaXRlKGVycilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZSgpXG4gIH1cblxuICBfY29uc3VtZUhlYWRlciAoKSB7XG4gICAgaWYgKHRoaXMuX2xvY2tlZCkgcmV0dXJuIGZhbHNlXG5cbiAgICB0aGlzLl9vZmZzZXQgPSB0aGlzLl9idWZmZXIuc2hpZnRlZFxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2hlYWRlciA9IGhlYWRlcnMuZGVjb2RlKHRoaXMuX2J1ZmZlci5zaGlmdCg1MTIpLCB0aGlzLl9maWxlbmFtZUVuY29kaW5nLCB0aGlzLl9hbGxvd1Vua25vd25Gb3JtYXQpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9jb250aW51ZVdyaXRlKGVycilcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICghdGhpcy5faGVhZGVyKSByZXR1cm4gdHJ1ZVxuXG4gICAgc3dpdGNoICh0aGlzLl9oZWFkZXIudHlwZSkge1xuICAgICAgY2FzZSAnZ251LWxvbmctcGF0aCc6XG4gICAgICBjYXNlICdnbnUtbG9uZy1saW5rLXBhdGgnOlxuICAgICAgY2FzZSAncGF4LWdsb2JhbC1oZWFkZXInOlxuICAgICAgY2FzZSAncGF4LWhlYWRlcic6XG4gICAgICAgIHRoaXMuX2xvbmdIZWFkZXIgPSB0cnVlXG4gICAgICAgIHRoaXMuX21pc3NpbmcgPSB0aGlzLl9oZWFkZXIuc2l6ZVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHRoaXMuX2xvY2tlZCA9IHRydWVcbiAgICB0aGlzLl9hcHBseUxvbmdIZWFkZXJzKClcblxuICAgIGlmICh0aGlzLl9oZWFkZXIuc2l6ZSA9PT0gMCB8fCB0aGlzLl9oZWFkZXIudHlwZSA9PT0gJ2RpcmVjdG9yeScpIHtcbiAgICAgIHRoaXMuZW1pdCgnZW50cnknLCB0aGlzLl9oZWFkZXIsIHRoaXMuX2NyZWF0ZVN0cmVhbSgpLCB0aGlzLl91bmxvY2tCb3VuZClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgdGhpcy5fc3RyZWFtID0gdGhpcy5fY3JlYXRlU3RyZWFtKClcbiAgICB0aGlzLl9taXNzaW5nID0gdGhpcy5faGVhZGVyLnNpemVcblxuICAgIHRoaXMuZW1pdCgnZW50cnknLCB0aGlzLl9oZWFkZXIsIHRoaXMuX3N0cmVhbSwgdGhpcy5fdW5sb2NrQm91bmQpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIF9hcHBseUxvbmdIZWFkZXJzICgpIHtcbiAgICBpZiAodGhpcy5fZ251TG9uZ1BhdGgpIHtcbiAgICAgIHRoaXMuX2hlYWRlci5uYW1lID0gdGhpcy5fZ251TG9uZ1BhdGhcbiAgICAgIHRoaXMuX2dudUxvbmdQYXRoID0gbnVsbFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9nbnVMb25nTGlua1BhdGgpIHtcbiAgICAgIHRoaXMuX2hlYWRlci5saW5rbmFtZSA9IHRoaXMuX2dudUxvbmdMaW5rUGF0aFxuICAgICAgdGhpcy5fZ251TG9uZ0xpbmtQYXRoID0gbnVsbFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9wYXgpIHtcbiAgICAgIGlmICh0aGlzLl9wYXgucGF0aCkgdGhpcy5faGVhZGVyLm5hbWUgPSB0aGlzLl9wYXgucGF0aFxuICAgICAgaWYgKHRoaXMuX3BheC5saW5rcGF0aCkgdGhpcy5faGVhZGVyLmxpbmtuYW1lID0gdGhpcy5fcGF4LmxpbmtwYXRoXG4gICAgICBpZiAodGhpcy5fcGF4LnNpemUpIHRoaXMuX2hlYWRlci5zaXplID0gcGFyc2VJbnQodGhpcy5fcGF4LnNpemUsIDEwKVxuICAgICAgdGhpcy5faGVhZGVyLnBheCA9IHRoaXMuX3BheFxuICAgICAgdGhpcy5fcGF4ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIF9kZWNvZGVMb25nSGVhZGVyIChidWYpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX2hlYWRlci50eXBlKSB7XG4gICAgICBjYXNlICdnbnUtbG9uZy1wYXRoJzpcbiAgICAgICAgdGhpcy5fZ251TG9uZ1BhdGggPSBoZWFkZXJzLmRlY29kZUxvbmdQYXRoKGJ1ZiwgdGhpcy5fZmlsZW5hbWVFbmNvZGluZylcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ2dudS1sb25nLWxpbmstcGF0aCc6XG4gICAgICAgIHRoaXMuX2dudUxvbmdMaW5rUGF0aCA9IGhlYWRlcnMuZGVjb2RlTG9uZ1BhdGgoYnVmLCB0aGlzLl9maWxlbmFtZUVuY29kaW5nKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncGF4LWdsb2JhbC1oZWFkZXInOlxuICAgICAgICB0aGlzLl9wYXhHbG9iYWwgPSBoZWFkZXJzLmRlY29kZVBheChidWYpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwYXgtaGVhZGVyJzpcbiAgICAgICAgdGhpcy5fcGF4ID0gdGhpcy5fcGF4R2xvYmFsID09PSBudWxsXG4gICAgICAgICAgPyBoZWFkZXJzLmRlY29kZVBheChidWYpXG4gICAgICAgICAgOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9wYXhHbG9iYWwsIGhlYWRlcnMuZGVjb2RlUGF4KGJ1ZikpXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgX2NvbnN1bWVMb25nSGVhZGVyICgpIHtcbiAgICB0aGlzLl9sb25nSGVhZGVyID0gZmFsc2VcbiAgICB0aGlzLl9taXNzaW5nID0gb3ZlcmZsb3codGhpcy5faGVhZGVyLnNpemUpXG5cbiAgICBjb25zdCBidWYgPSB0aGlzLl9idWZmZXIuc2hpZnQodGhpcy5faGVhZGVyLnNpemUpXG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fZGVjb2RlTG9uZ0hlYWRlcihidWYpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9jb250aW51ZVdyaXRlKGVycilcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBfY29uc3VtZVN0cmVhbSAoKSB7XG4gICAgY29uc3QgYnVmID0gdGhpcy5fYnVmZmVyLnNoaWZ0Rmlyc3QodGhpcy5fbWlzc2luZylcbiAgICBpZiAoYnVmID09PSBudWxsKSByZXR1cm4gZmFsc2VcblxuICAgIHRoaXMuX21pc3NpbmcgLT0gYnVmLmJ5dGVMZW5ndGhcbiAgICBjb25zdCBkcmFpbmVkID0gdGhpcy5fc3RyZWFtLnB1c2goYnVmKVxuXG4gICAgaWYgKHRoaXMuX21pc3NpbmcgPT09IDApIHtcbiAgICAgIHRoaXMuX3N0cmVhbS5wdXNoKG51bGwpXG4gICAgICBpZiAoZHJhaW5lZCkgdGhpcy5fc3RyZWFtLl9kZXRhY2goKVxuICAgICAgcmV0dXJuIGRyYWluZWQgJiYgdGhpcy5fbG9ja2VkID09PSBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiBkcmFpbmVkXG4gIH1cblxuICBfY3JlYXRlU3RyZWFtICgpIHtcbiAgICByZXR1cm4gbmV3IFNvdXJjZSh0aGlzLCB0aGlzLl9oZWFkZXIsIHRoaXMuX29mZnNldClcbiAgfVxuXG4gIF91cGRhdGUgKCkge1xuICAgIHdoaWxlICh0aGlzLl9idWZmZXIuYnVmZmVyZWQgPiAwICYmICF0aGlzLmRlc3Ryb3lpbmcpIHtcbiAgICAgIGlmICh0aGlzLl9taXNzaW5nID4gMCkge1xuICAgICAgICBpZiAodGhpcy5fc3RyZWFtICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2NvbnN1bWVTdHJlYW0oKSA9PT0gZmFsc2UpIHJldHVyblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbG9uZ0hlYWRlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGlmICh0aGlzLl9taXNzaW5nID4gdGhpcy5fYnVmZmVyLmJ1ZmZlcmVkKSBicmVha1xuICAgICAgICAgIGlmICh0aGlzLl9jb25zdW1lTG9uZ0hlYWRlcigpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlnbm9yZSA9IHRoaXMuX2J1ZmZlci5zaGlmdEZpcnN0KHRoaXMuX21pc3NpbmcpXG4gICAgICAgIGlmIChpZ25vcmUgIT09IG51bGwpIHRoaXMuX21pc3NpbmcgLT0gaWdub3JlLmJ5dGVMZW5ndGhcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2J1ZmZlci5idWZmZXJlZCA8IDUxMikgYnJlYWtcbiAgICAgIGlmICh0aGlzLl9zdHJlYW0gIT09IG51bGwgfHwgdGhpcy5fY29uc3VtZUhlYWRlcigpID09PSBmYWxzZSkgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fY29udGludWVXcml0ZShudWxsKVxuICB9XG5cbiAgX2NvbnRpbnVlV3JpdGUgKGVycikge1xuICAgIGNvbnN0IGNiID0gdGhpcy5fY2FsbGJhY2tcbiAgICB0aGlzLl9jYWxsYmFjayA9IG5vb3BcbiAgICBjYihlcnIpXG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgdGhpcy5fY2FsbGJhY2sgPSBjYlxuICAgIHRoaXMuX2J1ZmZlci5wdXNoKGRhdGEpXG4gICAgdGhpcy5fdXBkYXRlKClcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICB0aGlzLl9maW5pc2hlZCA9IHRoaXMuX21pc3NpbmcgPT09IDAgJiYgdGhpcy5fYnVmZmVyLmJ1ZmZlcmVkID09PSAwXG4gICAgY2IodGhpcy5fZmluaXNoZWQgPyBudWxsIDogbmV3IEVycm9yKCdVbmV4cGVjdGVkIGVuZCBvZiBkYXRhJykpXG4gIH1cblxuICBfcHJlZGVzdHJveSAoKSB7XG4gICAgdGhpcy5fY29udGludWVXcml0ZShudWxsKVxuICB9XG5cbiAgX2Rlc3Ryb3kgKGNiKSB7XG4gICAgaWYgKHRoaXMuX3N0cmVhbSkgdGhpcy5fc3RyZWFtLmRlc3Ryb3koZ2V0U3RyZWFtRXJyb3IodGhpcykpXG4gICAgY2IobnVsbClcbiAgfVxuXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gKCkge1xuICAgIGxldCBlcnJvciA9IG51bGxcblxuICAgIGxldCBwcm9taXNlUmVzb2x2ZSA9IG51bGxcbiAgICBsZXQgcHJvbWlzZVJlamVjdCA9IG51bGxcblxuICAgIGxldCBlbnRyeVN0cmVhbSA9IG51bGxcbiAgICBsZXQgZW50cnlDYWxsYmFjayA9IG51bGxcblxuICAgIGNvbnN0IGV4dHJhY3QgPSB0aGlzXG5cbiAgICB0aGlzLm9uKCdlbnRyeScsIG9uZW50cnkpXG4gICAgdGhpcy5vbignZXJyb3InLCAoZXJyKSA9PiB7IGVycm9yID0gZXJyIH0pXG4gICAgdGhpcy5vbignY2xvc2UnLCBvbmNsb3NlKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gKCkge1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfSxcbiAgICAgIG5leHQgKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2Uob25uZXh0KVxuICAgICAgfSxcbiAgICAgIHJldHVybiAoKSB7XG4gICAgICAgIHJldHVybiBkZXN0cm95KG51bGwpXG4gICAgICB9LFxuICAgICAgdGhyb3cgKGVycikge1xuICAgICAgICByZXR1cm4gZGVzdHJveShlcnIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uc3VtZUNhbGxiYWNrIChlcnIpIHtcbiAgICAgIGlmICghZW50cnlDYWxsYmFjaykgcmV0dXJuXG4gICAgICBjb25zdCBjYiA9IGVudHJ5Q2FsbGJhY2tcbiAgICAgIGVudHJ5Q2FsbGJhY2sgPSBudWxsXG4gICAgICBjYihlcnIpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25uZXh0IChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKVxuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnlTdHJlYW0pIHtcbiAgICAgICAgcmVzb2x2ZSh7IHZhbHVlOiBlbnRyeVN0cmVhbSwgZG9uZTogZmFsc2UgfSlcbiAgICAgICAgZW50cnlTdHJlYW0gPSBudWxsXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBwcm9taXNlUmVzb2x2ZSA9IHJlc29sdmVcbiAgICAgIHByb21pc2VSZWplY3QgPSByZWplY3RcblxuICAgICAgY29uc3VtZUNhbGxiYWNrKG51bGwpXG5cbiAgICAgIGlmIChleHRyYWN0Ll9maW5pc2hlZCAmJiBwcm9taXNlUmVzb2x2ZSkge1xuICAgICAgICBwcm9taXNlUmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgcHJvbWlzZVJlc29sdmUgPSBwcm9taXNlUmVqZWN0ID0gbnVsbFxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uZW50cnkgKGhlYWRlciwgc3RyZWFtLCBjYWxsYmFjaykge1xuICAgICAgZW50cnlDYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgbm9vcCkgLy8gbm8gd2F5IGFyb3VuZCB0aGlzIGR1ZSB0byB0aWNrIHNpbGx5bmVzc1xuXG4gICAgICBpZiAocHJvbWlzZVJlc29sdmUpIHtcbiAgICAgICAgcHJvbWlzZVJlc29sdmUoeyB2YWx1ZTogc3RyZWFtLCBkb25lOiBmYWxzZSB9KVxuICAgICAgICBwcm9taXNlUmVzb2x2ZSA9IHByb21pc2VSZWplY3QgPSBudWxsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyeVN0cmVhbSA9IHN0cmVhbVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgY29uc3VtZUNhbGxiYWNrKGVycm9yKVxuICAgICAgaWYgKCFwcm9taXNlUmVzb2x2ZSkgcmV0dXJuXG4gICAgICBpZiAoZXJyb3IpIHByb21pc2VSZWplY3QoZXJyb3IpXG4gICAgICBlbHNlIHByb21pc2VSZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgcHJvbWlzZVJlc29sdmUgPSBwcm9taXNlUmVqZWN0ID0gbnVsbFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc3Ryb3kgKGVycikge1xuICAgICAgZXh0cmFjdC5kZXN0cm95KGVycilcbiAgICAgIGNvbnN1bWVDYWxsYmFjayhlcnIpXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAoZXh0cmFjdC5kZXN0cm95ZWQpIHJldHVybiByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICBleHRyYWN0Lm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpXG4gICAgICAgICAgZWxzZSByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBleHRyYWN0IChvcHRzKSB7XG4gIHJldHVybiBuZXcgRXh0cmFjdChvcHRzKVxufVxuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIG92ZXJmbG93IChzaXplKSB7XG4gIHNpemUgJj0gNTExXG4gIHJldHVybiBzaXplICYmIDUxMiAtIHNpemVcbn1cbiIsImNvbnN0IGI0YSA9IHJlcXVpcmUoJ2I0YScpXG5cbmNvbnN0IFpFUk9TID0gJzAwMDAwMDAwMDAwMDAwMDAwMDAnXG5jb25zdCBTRVZFTlMgPSAnNzc3Nzc3Nzc3Nzc3Nzc3Nzc3NydcbmNvbnN0IFpFUk9fT0ZGU0VUID0gJzAnLmNoYXJDb2RlQXQoMClcbmNvbnN0IFVTVEFSX01BR0lDID0gYjRhLmZyb20oWzB4NzUsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzIsIDB4MDBdKSAvLyB1c3RhclxceDAwXG5jb25zdCBVU1RBUl9WRVIgPSBiNGEuZnJvbShbWkVST19PRkZTRVQsIFpFUk9fT0ZGU0VUXSlcbmNvbnN0IEdOVV9NQUdJQyA9IGI0YS5mcm9tKFsweDc1LCAweDczLCAweDc0LCAweDYxLCAweDcyLCAweDIwXSkgLy8gdXN0YXJcXHgyMFxuY29uc3QgR05VX1ZFUiA9IGI0YS5mcm9tKFsweDIwLCAweDAwXSlcbmNvbnN0IE1BU0sgPSAwbzc3NzdcbmNvbnN0IE1BR0lDX09GRlNFVCA9IDI1N1xuY29uc3QgVkVSU0lPTl9PRkZTRVQgPSAyNjNcblxuZXhwb3J0cy5kZWNvZGVMb25nUGF0aCA9IGZ1bmN0aW9uIGRlY29kZUxvbmdQYXRoIChidWYsIGVuY29kaW5nKSB7XG4gIHJldHVybiBkZWNvZGVTdHIoYnVmLCAwLCBidWYubGVuZ3RoLCBlbmNvZGluZylcbn1cblxuZXhwb3J0cy5lbmNvZGVQYXggPSBmdW5jdGlvbiBlbmNvZGVQYXggKG9wdHMpIHsgLy8gVE9ETzogZW5jb2RlIG1vcmUgc3R1ZmYgaW4gcGF4XG4gIGxldCByZXN1bHQgPSAnJ1xuICBpZiAob3B0cy5uYW1lKSByZXN1bHQgKz0gYWRkTGVuZ3RoKCcgcGF0aD0nICsgb3B0cy5uYW1lICsgJ1xcbicpXG4gIGlmIChvcHRzLmxpbmtuYW1lKSByZXN1bHQgKz0gYWRkTGVuZ3RoKCcgbGlua3BhdGg9JyArIG9wdHMubGlua25hbWUgKyAnXFxuJylcbiAgY29uc3QgcGF4ID0gb3B0cy5wYXhcbiAgaWYgKHBheCkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHBheCkge1xuICAgICAgcmVzdWx0ICs9IGFkZExlbmd0aCgnICcgKyBrZXkgKyAnPScgKyBwYXhba2V5XSArICdcXG4nKVxuICAgIH1cbiAgfVxuICByZXR1cm4gYjRhLmZyb20ocmVzdWx0KVxufVxuXG5leHBvcnRzLmRlY29kZVBheCA9IGZ1bmN0aW9uIGRlY29kZVBheCAoYnVmKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgd2hpbGUgKGJ1Zi5sZW5ndGgpIHtcbiAgICBsZXQgaSA9IDBcbiAgICB3aGlsZSAoaSA8IGJ1Zi5sZW5ndGggJiYgYnVmW2ldICE9PSAzMikgaSsrXG4gICAgY29uc3QgbGVuID0gcGFyc2VJbnQoYjRhLnRvU3RyaW5nKGJ1Zi5zdWJhcnJheSgwLCBpKSksIDEwKVxuICAgIGlmICghbGVuKSByZXR1cm4gcmVzdWx0XG5cbiAgICBjb25zdCBiID0gYjRhLnRvU3RyaW5nKGJ1Zi5zdWJhcnJheShpICsgMSwgbGVuIC0gMSkpXG4gICAgY29uc3Qga2V5SW5kZXggPSBiLmluZGV4T2YoJz0nKVxuICAgIGlmIChrZXlJbmRleCA9PT0gLTEpIHJldHVybiByZXN1bHRcbiAgICByZXN1bHRbYi5zbGljZSgwLCBrZXlJbmRleCldID0gYi5zbGljZShrZXlJbmRleCArIDEpXG5cbiAgICBidWYgPSBidWYuc3ViYXJyYXkobGVuKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZSAob3B0cykge1xuICBjb25zdCBidWYgPSBiNGEuYWxsb2MoNTEyKVxuICBsZXQgbmFtZSA9IG9wdHMubmFtZVxuICBsZXQgcHJlZml4ID0gJydcblxuICBpZiAob3B0cy50eXBlZmxhZyA9PT0gNSAmJiBuYW1lW25hbWUubGVuZ3RoIC0gMV0gIT09ICcvJykgbmFtZSArPSAnLydcbiAgaWYgKGI0YS5ieXRlTGVuZ3RoKG5hbWUpICE9PSBuYW1lLmxlbmd0aCkgcmV0dXJuIG51bGwgLy8gdXRmLThcblxuICB3aGlsZSAoYjRhLmJ5dGVMZW5ndGgobmFtZSkgPiAxMDApIHtcbiAgICBjb25zdCBpID0gbmFtZS5pbmRleE9mKCcvJylcbiAgICBpZiAoaSA9PT0gLTEpIHJldHVybiBudWxsXG4gICAgcHJlZml4ICs9IHByZWZpeCA/ICcvJyArIG5hbWUuc2xpY2UoMCwgaSkgOiBuYW1lLnNsaWNlKDAsIGkpXG4gICAgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpXG4gIH1cblxuICBpZiAoYjRhLmJ5dGVMZW5ndGgobmFtZSkgPiAxMDAgfHwgYjRhLmJ5dGVMZW5ndGgocHJlZml4KSA+IDE1NSkgcmV0dXJuIG51bGxcbiAgaWYgKG9wdHMubGlua25hbWUgJiYgYjRhLmJ5dGVMZW5ndGgob3B0cy5saW5rbmFtZSkgPiAxMDApIHJldHVybiBudWxsXG5cbiAgYjRhLndyaXRlKGJ1ZiwgbmFtZSlcbiAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG9wdHMubW9kZSAmIE1BU0ssIDYpLCAxMDApXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChvcHRzLnVpZCwgNiksIDEwOClcbiAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG9wdHMuZ2lkLCA2KSwgMTE2KVxuICBlbmNvZGVTaXplKG9wdHMuc2l6ZSwgYnVmLCAxMjQpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdCgob3B0cy5tdGltZS5nZXRUaW1lKCkgLyAxMDAwKSB8IDAsIDExKSwgMTM2KVxuXG4gIGJ1ZlsxNTZdID0gWkVST19PRkZTRVQgKyB0b1R5cGVmbGFnKG9wdHMudHlwZSlcblxuICBpZiAob3B0cy5saW5rbmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy5saW5rbmFtZSwgMTU3KVxuXG4gIGI0YS5jb3B5KFVTVEFSX01BR0lDLCBidWYsIE1BR0lDX09GRlNFVClcbiAgYjRhLmNvcHkoVVNUQVJfVkVSLCBidWYsIFZFUlNJT05fT0ZGU0VUKVxuICBpZiAob3B0cy51bmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy51bmFtZSwgMjY1KVxuICBpZiAob3B0cy5nbmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy5nbmFtZSwgMjk3KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy5kZXZtYWpvciB8fCAwLCA2KSwgMzI5KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy5kZXZtaW5vciB8fCAwLCA2KSwgMzM3KVxuXG4gIGlmIChwcmVmaXgpIGI0YS53cml0ZShidWYsIHByZWZpeCwgMzQ1KVxuXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChja3N1bShidWYpLCA2KSwgMTQ4KVxuXG4gIHJldHVybiBidWZcbn1cblxuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUgKGJ1ZiwgZmlsZW5hbWVFbmNvZGluZywgYWxsb3dVbmtub3duRm9ybWF0KSB7XG4gIGxldCB0eXBlZmxhZyA9IGJ1ZlsxNTZdID09PSAwID8gMCA6IGJ1ZlsxNTZdIC0gWkVST19PRkZTRVRcblxuICBsZXQgbmFtZSA9IGRlY29kZVN0cihidWYsIDAsIDEwMCwgZmlsZW5hbWVFbmNvZGluZylcbiAgY29uc3QgbW9kZSA9IGRlY29kZU9jdChidWYsIDEwMCwgOClcbiAgY29uc3QgdWlkID0gZGVjb2RlT2N0KGJ1ZiwgMTA4LCA4KVxuICBjb25zdCBnaWQgPSBkZWNvZGVPY3QoYnVmLCAxMTYsIDgpXG4gIGNvbnN0IHNpemUgPSBkZWNvZGVPY3QoYnVmLCAxMjQsIDEyKVxuICBjb25zdCBtdGltZSA9IGRlY29kZU9jdChidWYsIDEzNiwgMTIpXG4gIGNvbnN0IHR5cGUgPSB0b1R5cGUodHlwZWZsYWcpXG4gIGNvbnN0IGxpbmtuYW1lID0gYnVmWzE1N10gPT09IDAgPyBudWxsIDogZGVjb2RlU3RyKGJ1ZiwgMTU3LCAxMDAsIGZpbGVuYW1lRW5jb2RpbmcpXG4gIGNvbnN0IHVuYW1lID0gZGVjb2RlU3RyKGJ1ZiwgMjY1LCAzMilcbiAgY29uc3QgZ25hbWUgPSBkZWNvZGVTdHIoYnVmLCAyOTcsIDMyKVxuICBjb25zdCBkZXZtYWpvciA9IGRlY29kZU9jdChidWYsIDMyOSwgOClcbiAgY29uc3QgZGV2bWlub3IgPSBkZWNvZGVPY3QoYnVmLCAzMzcsIDgpXG5cbiAgY29uc3QgYyA9IGNrc3VtKGJ1ZilcblxuICAvLyBjaGVja3N1bSBpcyBzdGlsbCBpbml0aWFsIHZhbHVlIGlmIGhlYWRlciB3YXMgbnVsbC5cbiAgaWYgKGMgPT09IDggKiAzMikgcmV0dXJuIG51bGxcblxuICAvLyB2YWxpZCBjaGVja3N1bVxuICBpZiAoYyAhPT0gZGVjb2RlT2N0KGJ1ZiwgMTQ4LCA4KSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRhciBoZWFkZXIuIE1heWJlIHRoZSB0YXIgaXMgY29ycnVwdGVkIG9yIGl0IG5lZWRzIHRvIGJlIGd1bnppcHBlZD8nKVxuXG4gIGlmIChpc1VTVEFSKGJ1ZikpIHtcbiAgICAvLyB1c3RhciAocG9zaXgpIGZvcm1hdC5cbiAgICAvLyBwcmVwZW5kIHByZWZpeCwgaWYgcHJlc2VudC5cbiAgICBpZiAoYnVmWzM0NV0pIG5hbWUgPSBkZWNvZGVTdHIoYnVmLCAzNDUsIDE1NSwgZmlsZW5hbWVFbmNvZGluZykgKyAnLycgKyBuYW1lXG4gIH0gZWxzZSBpZiAoaXNHTlUoYnVmKSkge1xuICAgIC8vICdnbnUnLydvbGRnbnUnIGZvcm1hdC4gU2ltaWxhciB0byB1c3RhciwgYnV0IGhhcyBzdXBwb3J0IGZvciBpbmNyZW1lbnRhbCBhbmRcbiAgICAvLyBtdWx0aS12b2x1bWUgdGFyYmFsbHMuXG4gIH0gZWxzZSB7XG4gICAgaWYgKCFhbGxvd1Vua25vd25Gb3JtYXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0YXIgaGVhZGVyOiB1bmtub3duIGZvcm1hdC4nKVxuICAgIH1cbiAgfVxuXG4gIC8vIHRvIHN1cHBvcnQgb2xkIHRhciB2ZXJzaW9ucyB0aGF0IHVzZSB0cmFpbGluZyAvIHRvIGluZGljYXRlIGRpcnNcbiAgaWYgKHR5cGVmbGFnID09PSAwICYmIG5hbWUgJiYgbmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnLycpIHR5cGVmbGFnID0gNVxuXG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBtb2RlLFxuICAgIHVpZCxcbiAgICBnaWQsXG4gICAgc2l6ZSxcbiAgICBtdGltZTogbmV3IERhdGUoMTAwMCAqIG10aW1lKSxcbiAgICB0eXBlLFxuICAgIGxpbmtuYW1lLFxuICAgIHVuYW1lLFxuICAgIGduYW1lLFxuICAgIGRldm1ham9yLFxuICAgIGRldm1pbm9yLFxuICAgIHBheDogbnVsbFxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVVNUQVIgKGJ1Zikge1xuICByZXR1cm4gYjRhLmVxdWFscyhVU1RBUl9NQUdJQywgYnVmLnN1YmFycmF5KE1BR0lDX09GRlNFVCwgTUFHSUNfT0ZGU0VUICsgNikpXG59XG5cbmZ1bmN0aW9uIGlzR05VIChidWYpIHtcbiAgcmV0dXJuIGI0YS5lcXVhbHMoR05VX01BR0lDLCBidWYuc3ViYXJyYXkoTUFHSUNfT0ZGU0VULCBNQUdJQ19PRkZTRVQgKyA2KSkgJiZcbiAgICBiNGEuZXF1YWxzKEdOVV9WRVIsIGJ1Zi5zdWJhcnJheShWRVJTSU9OX09GRlNFVCwgVkVSU0lPTl9PRkZTRVQgKyAyKSlcbn1cblxuZnVuY3Rpb24gY2xhbXAgKGluZGV4LCBsZW4sIGRlZmF1bHRWYWx1ZSkge1xuICBpZiAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJykgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICBpbmRleCA9IH5+aW5kZXggLy8gQ29lcmNlIHRvIGludGVnZXIuXG4gIGlmIChpbmRleCA+PSBsZW4pIHJldHVybiBsZW5cbiAgaWYgKGluZGV4ID49IDApIHJldHVybiBpbmRleFxuICBpbmRleCArPSBsZW5cbiAgaWYgKGluZGV4ID49IDApIHJldHVybiBpbmRleFxuICByZXR1cm4gMFxufVxuXG5mdW5jdGlvbiB0b1R5cGUgKGZsYWcpIHtcbiAgc3dpdGNoIChmbGFnKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICdmaWxlJ1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiAnbGluaydcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gJ3N5bWxpbmsnXG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuICdjaGFyYWN0ZXItZGV2aWNlJ1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiAnYmxvY2stZGV2aWNlJ1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiAnZGlyZWN0b3J5J1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiAnZmlmbydcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gJ2NvbnRpZ3VvdXMtZmlsZSdcbiAgICBjYXNlIDcyOlxuICAgICAgcmV0dXJuICdwYXgtaGVhZGVyJ1xuICAgIGNhc2UgNTU6XG4gICAgICByZXR1cm4gJ3BheC1nbG9iYWwtaGVhZGVyJ1xuICAgIGNhc2UgMjc6XG4gICAgICByZXR1cm4gJ2dudS1sb25nLWxpbmstcGF0aCdcbiAgICBjYXNlIDI4OlxuICAgIGNhc2UgMzA6XG4gICAgICByZXR1cm4gJ2dudS1sb25nLXBhdGgnXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiB0b1R5cGVmbGFnIChmbGFnKSB7XG4gIHN3aXRjaCAoZmxhZykge1xuICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgcmV0dXJuIDBcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIHJldHVybiAxXG4gICAgY2FzZSAnc3ltbGluayc6XG4gICAgICByZXR1cm4gMlxuICAgIGNhc2UgJ2NoYXJhY3Rlci1kZXZpY2UnOlxuICAgICAgcmV0dXJuIDNcbiAgICBjYXNlICdibG9jay1kZXZpY2UnOlxuICAgICAgcmV0dXJuIDRcbiAgICBjYXNlICdkaXJlY3RvcnknOlxuICAgICAgcmV0dXJuIDVcbiAgICBjYXNlICdmaWZvJzpcbiAgICAgIHJldHVybiA2XG4gICAgY2FzZSAnY29udGlndW91cy1maWxlJzpcbiAgICAgIHJldHVybiA3XG4gICAgY2FzZSAncGF4LWhlYWRlcic6XG4gICAgICByZXR1cm4gNzJcbiAgfVxuXG4gIHJldHVybiAwXG59XG5cbmZ1bmN0aW9uIGluZGV4T2YgKGJsb2NrLCBudW0sIG9mZnNldCwgZW5kKSB7XG4gIGZvciAoOyBvZmZzZXQgPCBlbmQ7IG9mZnNldCsrKSB7XG4gICAgaWYgKGJsb2NrW29mZnNldF0gPT09IG51bSkgcmV0dXJuIG9mZnNldFxuICB9XG4gIHJldHVybiBlbmRcbn1cblxuZnVuY3Rpb24gY2tzdW0gKGJsb2NrKSB7XG4gIGxldCBzdW0gPSA4ICogMzJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNDg7IGkrKykgc3VtICs9IGJsb2NrW2ldXG4gIGZvciAobGV0IGogPSAxNTY7IGogPCA1MTI7IGorKykgc3VtICs9IGJsb2NrW2pdXG4gIHJldHVybiBzdW1cbn1cblxuZnVuY3Rpb24gZW5jb2RlT2N0ICh2YWwsIG4pIHtcbiAgdmFsID0gdmFsLnRvU3RyaW5nKDgpXG4gIGlmICh2YWwubGVuZ3RoID4gbikgcmV0dXJuIFNFVkVOUy5zbGljZSgwLCBuKSArICcgJ1xuICByZXR1cm4gWkVST1Muc2xpY2UoMCwgbiAtIHZhbC5sZW5ndGgpICsgdmFsICsgJyAnXG59XG5cbmZ1bmN0aW9uIGVuY29kZVNpemVCaW4gKG51bSwgYnVmLCBvZmYpIHtcbiAgYnVmW29mZl0gPSAweDgwXG4gIGZvciAobGV0IGkgPSAxMTsgaSA+IDA7IGktLSkge1xuICAgIGJ1ZltvZmYgKyBpXSA9IG51bSAmIDB4ZmZcbiAgICBudW0gPSBNYXRoLmZsb29yKG51bSAvIDB4MTAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGVuY29kZVNpemUgKG51bSwgYnVmLCBvZmYpIHtcbiAgaWYgKG51bS50b1N0cmluZyg4KS5sZW5ndGggPiAxMSkge1xuICAgIGVuY29kZVNpemVCaW4obnVtLCBidWYsIG9mZilcbiAgfSBlbHNlIHtcbiAgICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3QobnVtLCAxMSksIG9mZilcbiAgfVxufVxuXG4vKiBDb3BpZWQgZnJvbSB0aGUgbm9kZS10YXIgcmVwbyBhbmQgbW9kaWZpZWQgdG8gbWVldFxuICogdGFyLXN0cmVhbSBjb2Rpbmcgc3RhbmRhcmQuXG4gKlxuICogU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vbnBtL25vZGUtdGFyL2Jsb2IvNTFiNjYyN2ExZjM1N2QyZWI0MzNlNzM3OGU1ZjA1ZTgzYjdhYTZjZC9saWIvaGVhZGVyLmpzI0wzNDlcbiAqL1xuZnVuY3Rpb24gcGFyc2UyNTYgKGJ1Zikge1xuICAvLyBmaXJzdCBieXRlIE1VU1QgYmUgZWl0aGVyIDgwIG9yIEZGXG4gIC8vIDgwIGZvciBwb3NpdGl2ZSwgRkYgZm9yIDIncyBjb21wXG4gIGxldCBwb3NpdGl2ZVxuICBpZiAoYnVmWzBdID09PSAweDgwKSBwb3NpdGl2ZSA9IHRydWVcbiAgZWxzZSBpZiAoYnVmWzBdID09PSAweEZGKSBwb3NpdGl2ZSA9IGZhbHNlXG4gIGVsc2UgcmV0dXJuIG51bGxcblxuICAvLyBidWlsZCB1cCBhIGJhc2UtMjU2IHR1cGxlIGZyb20gdGhlIGxlYXN0IHNpZyB0byB0aGUgaGlnaGVzdFxuICBjb25zdCB0dXBsZSA9IFtdXG4gIGxldCBpXG4gIGZvciAoaSA9IGJ1Zi5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3QgYnl0ZSA9IGJ1ZltpXVxuICAgIGlmIChwb3NpdGl2ZSkgdHVwbGUucHVzaChieXRlKVxuICAgIGVsc2UgdHVwbGUucHVzaCgweEZGIC0gYnl0ZSlcbiAgfVxuXG4gIGxldCBzdW0gPSAwXG4gIGNvbnN0IGwgPSB0dXBsZS5sZW5ndGhcbiAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHN1bSArPSB0dXBsZVtpXSAqIE1hdGgucG93KDI1NiwgaSlcbiAgfVxuXG4gIHJldHVybiBwb3NpdGl2ZSA/IHN1bSA6IC0xICogc3VtXG59XG5cbmZ1bmN0aW9uIGRlY29kZU9jdCAodmFsLCBvZmZzZXQsIGxlbmd0aCkge1xuICB2YWwgPSB2YWwuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpXG4gIG9mZnNldCA9IDBcblxuICAvLyBJZiBwcmVmaXhlZCB3aXRoIDB4ODAgdGhlbiBwYXJzZSBhcyBhIGJhc2UtMjU2IGludGVnZXJcbiAgaWYgKHZhbFtvZmZzZXRdICYgMHg4MCkge1xuICAgIHJldHVybiBwYXJzZTI1Nih2YWwpXG4gIH0gZWxzZSB7XG4gICAgLy8gT2xkZXIgdmVyc2lvbnMgb2YgdGFyIGNhbiBwcmVmaXggd2l0aCBzcGFjZXNcbiAgICB3aGlsZSAob2Zmc2V0IDwgdmFsLmxlbmd0aCAmJiB2YWxbb2Zmc2V0XSA9PT0gMzIpIG9mZnNldCsrXG4gICAgY29uc3QgZW5kID0gY2xhbXAoaW5kZXhPZih2YWwsIDMyLCBvZmZzZXQsIHZhbC5sZW5ndGgpLCB2YWwubGVuZ3RoLCB2YWwubGVuZ3RoKVxuICAgIHdoaWxlIChvZmZzZXQgPCBlbmQgJiYgdmFsW29mZnNldF0gPT09IDApIG9mZnNldCsrXG4gICAgaWYgKGVuZCA9PT0gb2Zmc2V0KSByZXR1cm4gMFxuICAgIHJldHVybiBwYXJzZUludChiNGEudG9TdHJpbmcodmFsLnN1YmFycmF5KG9mZnNldCwgZW5kKSksIDgpXG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlU3RyICh2YWwsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICByZXR1cm4gYjRhLnRvU3RyaW5nKHZhbC5zdWJhcnJheShvZmZzZXQsIGluZGV4T2YodmFsLCAwLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWRkTGVuZ3RoIChzdHIpIHtcbiAgY29uc3QgbGVuID0gYjRhLmJ5dGVMZW5ndGgoc3RyKVxuICBsZXQgZGlnaXRzID0gTWF0aC5mbG9vcihNYXRoLmxvZyhsZW4pIC8gTWF0aC5sb2coMTApKSArIDFcbiAgaWYgKGxlbiArIGRpZ2l0cyA+PSBNYXRoLnBvdygxMCwgZGlnaXRzKSkgZGlnaXRzKytcblxuICByZXR1cm4gKGxlbiArIGRpZ2l0cykgKyBzdHJcbn1cbiIsImV4cG9ydHMuZXh0cmFjdCA9IHJlcXVpcmUoJy4vZXh0cmFjdCcpXG5leHBvcnRzLnBhY2sgPSByZXF1aXJlKCcuL3BhY2snKVxuIiwiY29uc3QgeyBSZWFkYWJsZSwgV3JpdGFibGUsIGdldFN0cmVhbUVycm9yIH0gPSByZXF1aXJlKCdzdHJlYW14JylcbmNvbnN0IGI0YSA9IHJlcXVpcmUoJ2I0YScpXG5cbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IGhlYWRlcnMgPSByZXF1aXJlKCcuL2hlYWRlcnMnKVxuXG5jb25zdCBETU9ERSA9IDBvNzU1XG5jb25zdCBGTU9ERSA9IDBvNjQ0XG5cbmNvbnN0IEVORF9PRl9UQVIgPSBiNGEuYWxsb2MoMTAyNClcblxuY2xhc3MgU2luayBleHRlbmRzIFdyaXRhYmxlIHtcbiAgY29uc3RydWN0b3IgKHBhY2ssIGhlYWRlciwgY2FsbGJhY2spIHtcbiAgICBzdXBlcih7IG1hcFdyaXRhYmxlLCBlYWdlck9wZW46IHRydWUgfSlcblxuICAgIHRoaXMud3JpdHRlbiA9IDBcbiAgICB0aGlzLmhlYWRlciA9IGhlYWRlclxuXG4gICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuX2xpbmtuYW1lID0gbnVsbFxuICAgIHRoaXMuX2lzTGlua25hbWUgPSBoZWFkZXIudHlwZSA9PT0gJ3N5bWxpbmsnICYmICFoZWFkZXIubGlua25hbWVcbiAgICB0aGlzLl9pc1ZvaWQgPSBoZWFkZXIudHlwZSAhPT0gJ2ZpbGUnICYmIGhlYWRlci50eXBlICE9PSAnY29udGlndW91cy1maWxlJ1xuICAgIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2VcbiAgICB0aGlzLl9wYWNrID0gcGFja1xuICAgIHRoaXMuX29wZW5DYWxsYmFjayA9IG51bGxcblxuICAgIGlmICh0aGlzLl9wYWNrLl9zdHJlYW0gPT09IG51bGwpIHRoaXMuX3BhY2suX3N0cmVhbSA9IHRoaXNcbiAgICBlbHNlIHRoaXMuX3BhY2suX3BlbmRpbmcucHVzaCh0aGlzKVxuICB9XG5cbiAgX29wZW4gKGNiKSB7XG4gICAgdGhpcy5fb3BlbkNhbGxiYWNrID0gY2JcbiAgICBpZiAodGhpcy5fcGFjay5fc3RyZWFtID09PSB0aGlzKSB0aGlzLl9jb250aW51ZU9wZW4oKVxuICB9XG5cbiAgX2NvbnRpbnVlUGFjayAoZXJyKSB7XG4gICAgaWYgKHRoaXMuX2NhbGxiYWNrID09PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5fY2FsbGJhY2tcbiAgICB0aGlzLl9jYWxsYmFjayA9IG51bGxcblxuICAgIGNhbGxiYWNrKGVycilcbiAgfVxuXG4gIF9jb250aW51ZU9wZW4gKCkge1xuICAgIGlmICh0aGlzLl9wYWNrLl9zdHJlYW0gPT09IG51bGwpIHRoaXMuX3BhY2suX3N0cmVhbSA9IHRoaXNcblxuICAgIGNvbnN0IGNiID0gdGhpcy5fb3BlbkNhbGxiYWNrXG4gICAgdGhpcy5fb3BlbkNhbGxiYWNrID0gbnVsbFxuICAgIGlmIChjYiA9PT0gbnVsbCkgcmV0dXJuXG5cbiAgICBpZiAodGhpcy5fcGFjay5kZXN0cm95aW5nKSByZXR1cm4gY2IobmV3IEVycm9yKCdwYWNrIHN0cmVhbSBkZXN0cm95ZWQnKSlcbiAgICBpZiAodGhpcy5fcGFjay5fZmluYWxpemVkKSByZXR1cm4gY2IobmV3IEVycm9yKCdwYWNrIHN0cmVhbSBpcyBhbHJlYWR5IGZpbmFsaXplZCcpKVxuXG4gICAgdGhpcy5fcGFjay5fc3RyZWFtID0gdGhpc1xuXG4gICAgaWYgKCF0aGlzLl9pc0xpbmtuYW1lKSB7XG4gICAgICB0aGlzLl9wYWNrLl9lbmNvZGUodGhpcy5oZWFkZXIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzVm9pZCkge1xuICAgICAgdGhpcy5fZmluaXNoKClcbiAgICAgIHRoaXMuX2NvbnRpbnVlUGFjayhudWxsKVxuICAgIH1cblxuICAgIGNiKG51bGwpXG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgaWYgKHRoaXMuX2lzTGlua25hbWUpIHtcbiAgICAgIHRoaXMuX2xpbmtuYW1lID0gdGhpcy5fbGlua25hbWUgPyBiNGEuY29uY2F0KFt0aGlzLl9saW5rbmFtZSwgZGF0YV0pIDogZGF0YVxuICAgICAgcmV0dXJuIGNiKG51bGwpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzVm9pZCkge1xuICAgICAgaWYgKGRhdGEuYnl0ZUxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGNiKG5ldyBFcnJvcignTm8gYm9keSBhbGxvd2VkIGZvciB0aGlzIGVudHJ5JykpXG4gICAgICB9XG4gICAgICByZXR1cm4gY2IoKVxuICAgIH1cblxuICAgIHRoaXMud3JpdHRlbiArPSBkYXRhLmJ5dGVMZW5ndGhcbiAgICBpZiAodGhpcy5fcGFjay5wdXNoKGRhdGEpKSByZXR1cm4gY2IoKVxuICAgIHRoaXMuX3BhY2suX2RyYWluID0gY2JcbiAgfVxuXG4gIF9maW5pc2ggKCkge1xuICAgIGlmICh0aGlzLl9maW5pc2hlZCkgcmV0dXJuXG4gICAgdGhpcy5fZmluaXNoZWQgPSB0cnVlXG5cbiAgICBpZiAodGhpcy5faXNMaW5rbmFtZSkge1xuICAgICAgdGhpcy5oZWFkZXIubGlua25hbWUgPSB0aGlzLl9saW5rbmFtZSA/IGI0YS50b1N0cmluZyh0aGlzLl9saW5rbmFtZSwgJ3V0Zi04JykgOiAnJ1xuICAgICAgdGhpcy5fcGFjay5fZW5jb2RlKHRoaXMuaGVhZGVyKVxuICAgIH1cblxuICAgIG92ZXJmbG93KHRoaXMuX3BhY2ssIHRoaXMuaGVhZGVyLnNpemUpXG5cbiAgICB0aGlzLl9wYWNrLl9kb25lKHRoaXMpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgaWYgKHRoaXMud3JpdHRlbiAhPT0gdGhpcy5oZWFkZXIuc2l6ZSkgeyAvLyBjb3JydXB0aW5nIHRhclxuICAgICAgcmV0dXJuIGNiKG5ldyBFcnJvcignU2l6ZSBtaXNtYXRjaCcpKVxuICAgIH1cblxuICAgIHRoaXMuX2ZpbmlzaCgpXG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9nZXRFcnJvciAoKSB7XG4gICAgcmV0dXJuIGdldFN0cmVhbUVycm9yKHRoaXMpIHx8IG5ldyBFcnJvcigndGFyIGVudHJ5IGRlc3Ryb3llZCcpXG4gIH1cblxuICBfcHJlZGVzdHJveSAoKSB7XG4gICAgdGhpcy5fcGFjay5kZXN0cm95KHRoaXMuX2dldEVycm9yKCkpXG4gIH1cblxuICBfZGVzdHJveSAoY2IpIHtcbiAgICB0aGlzLl9wYWNrLl9kb25lKHRoaXMpXG5cbiAgICB0aGlzLl9jb250aW51ZVBhY2sodGhpcy5fZmluaXNoZWQgPyBudWxsIDogdGhpcy5fZ2V0RXJyb3IoKSlcblxuICAgIGNiKClcbiAgfVxufVxuXG5jbGFzcyBQYWNrIGV4dGVuZHMgUmVhZGFibGUge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG4gICAgdGhpcy5fZHJhaW4gPSBub29wXG4gICAgdGhpcy5fZmluYWxpemVkID0gZmFsc2VcbiAgICB0aGlzLl9maW5hbGl6aW5nID0gZmFsc2VcbiAgICB0aGlzLl9wZW5kaW5nID0gW11cbiAgICB0aGlzLl9zdHJlYW0gPSBudWxsXG4gIH1cblxuICBlbnRyeSAoaGVhZGVyLCBidWZmZXIsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuX2ZpbmFsaXplZCB8fCB0aGlzLmRlc3Ryb3lpbmcpIHRocm93IG5ldyBFcnJvcignYWxyZWFkeSBmaW5hbGl6ZWQgb3IgZGVzdHJveWVkJylcblxuICAgIGlmICh0eXBlb2YgYnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IGJ1ZmZlclxuICAgICAgYnVmZmVyID0gbnVsbFxuICAgIH1cblxuICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gbm9vcFxuXG4gICAgaWYgKCFoZWFkZXIuc2l6ZSB8fCBoZWFkZXIudHlwZSA9PT0gJ3N5bWxpbmsnKSBoZWFkZXIuc2l6ZSA9IDBcbiAgICBpZiAoIWhlYWRlci50eXBlKSBoZWFkZXIudHlwZSA9IG1vZGVUb1R5cGUoaGVhZGVyLm1vZGUpXG4gICAgaWYgKCFoZWFkZXIubW9kZSkgaGVhZGVyLm1vZGUgPSBoZWFkZXIudHlwZSA9PT0gJ2RpcmVjdG9yeScgPyBETU9ERSA6IEZNT0RFXG4gICAgaWYgKCFoZWFkZXIudWlkKSBoZWFkZXIudWlkID0gMFxuICAgIGlmICghaGVhZGVyLmdpZCkgaGVhZGVyLmdpZCA9IDBcbiAgICBpZiAoIWhlYWRlci5tdGltZSkgaGVhZGVyLm10aW1lID0gbmV3IERhdGUoKVxuXG4gICAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdzdHJpbmcnKSBidWZmZXIgPSBiNGEuZnJvbShidWZmZXIpXG5cbiAgICBjb25zdCBzaW5rID0gbmV3IFNpbmsodGhpcywgaGVhZGVyLCBjYWxsYmFjaylcblxuICAgIGlmIChiNGEuaXNCdWZmZXIoYnVmZmVyKSkge1xuICAgICAgaGVhZGVyLnNpemUgPSBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgc2luay53cml0ZShidWZmZXIpXG4gICAgICBzaW5rLmVuZCgpXG4gICAgICByZXR1cm4gc2lua1xuICAgIH1cblxuICAgIGlmIChzaW5rLl9pc1ZvaWQpIHtcbiAgICAgIHJldHVybiBzaW5rXG4gICAgfVxuXG4gICAgcmV0dXJuIHNpbmtcbiAgfVxuXG4gIGZpbmFsaXplICgpIHtcbiAgICBpZiAodGhpcy5fc3RyZWFtIHx8IHRoaXMuX3BlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fZmluYWxpemluZyA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9maW5hbGl6ZWQpIHJldHVyblxuICAgIHRoaXMuX2ZpbmFsaXplZCA9IHRydWVcblxuICAgIHRoaXMucHVzaChFTkRfT0ZfVEFSKVxuICAgIHRoaXMucHVzaChudWxsKVxuICB9XG5cbiAgX2RvbmUgKHN0cmVhbSkge1xuICAgIGlmIChzdHJlYW0gIT09IHRoaXMuX3N0cmVhbSkgcmV0dXJuXG5cbiAgICB0aGlzLl9zdHJlYW0gPSBudWxsXG5cbiAgICBpZiAodGhpcy5fZmluYWxpemluZykgdGhpcy5maW5hbGl6ZSgpXG4gICAgaWYgKHRoaXMuX3BlbmRpbmcubGVuZ3RoKSB0aGlzLl9wZW5kaW5nLnNoaWZ0KCkuX2NvbnRpbnVlT3BlbigpXG4gIH1cblxuICBfZW5jb2RlIChoZWFkZXIpIHtcbiAgICBpZiAoIWhlYWRlci5wYXgpIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IGhlYWRlcnMuZW5jb2RlKGhlYWRlcilcbiAgICAgIGlmIChidWYpIHtcbiAgICAgICAgdGhpcy5wdXNoKGJ1ZilcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2VuY29kZVBheChoZWFkZXIpXG4gIH1cblxuICBfZW5jb2RlUGF4IChoZWFkZXIpIHtcbiAgICBjb25zdCBwYXhIZWFkZXIgPSBoZWFkZXJzLmVuY29kZVBheCh7XG4gICAgICBuYW1lOiBoZWFkZXIubmFtZSxcbiAgICAgIGxpbmtuYW1lOiBoZWFkZXIubGlua25hbWUsXG4gICAgICBwYXg6IGhlYWRlci5wYXhcbiAgICB9KVxuXG4gICAgY29uc3QgbmV3SGVhZGVyID0ge1xuICAgICAgbmFtZTogJ1BheEhlYWRlcicsXG4gICAgICBtb2RlOiBoZWFkZXIubW9kZSxcbiAgICAgIHVpZDogaGVhZGVyLnVpZCxcbiAgICAgIGdpZDogaGVhZGVyLmdpZCxcbiAgICAgIHNpemU6IHBheEhlYWRlci5ieXRlTGVuZ3RoLFxuICAgICAgbXRpbWU6IGhlYWRlci5tdGltZSxcbiAgICAgIHR5cGU6ICdwYXgtaGVhZGVyJyxcbiAgICAgIGxpbmtuYW1lOiBoZWFkZXIubGlua25hbWUgJiYgJ1BheEhlYWRlcicsXG4gICAgICB1bmFtZTogaGVhZGVyLnVuYW1lLFxuICAgICAgZ25hbWU6IGhlYWRlci5nbmFtZSxcbiAgICAgIGRldm1ham9yOiBoZWFkZXIuZGV2bWFqb3IsXG4gICAgICBkZXZtaW5vcjogaGVhZGVyLmRldm1pbm9yXG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKGhlYWRlcnMuZW5jb2RlKG5ld0hlYWRlcikpXG4gICAgdGhpcy5wdXNoKHBheEhlYWRlcilcbiAgICBvdmVyZmxvdyh0aGlzLCBwYXhIZWFkZXIuYnl0ZUxlbmd0aClcblxuICAgIG5ld0hlYWRlci5zaXplID0gaGVhZGVyLnNpemVcbiAgICBuZXdIZWFkZXIudHlwZSA9IGhlYWRlci50eXBlXG4gICAgdGhpcy5wdXNoKGhlYWRlcnMuZW5jb2RlKG5ld0hlYWRlcikpXG4gIH1cblxuICBfZG9EcmFpbiAoKSB7XG4gICAgY29uc3QgZHJhaW4gPSB0aGlzLl9kcmFpblxuICAgIHRoaXMuX2RyYWluID0gbm9vcFxuICAgIGRyYWluKClcbiAgfVxuXG4gIF9wcmVkZXN0cm95ICgpIHtcbiAgICBjb25zdCBlcnIgPSBnZXRTdHJlYW1FcnJvcih0aGlzKVxuXG4gICAgaWYgKHRoaXMuX3N0cmVhbSkgdGhpcy5fc3RyZWFtLmRlc3Ryb3koZXJyKVxuXG4gICAgd2hpbGUgKHRoaXMuX3BlbmRpbmcubGVuZ3RoKSB7XG4gICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9wZW5kaW5nLnNoaWZ0KClcbiAgICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgICAgIHN0cmVhbS5fY29udGludWVPcGVuKClcbiAgICB9XG5cbiAgICB0aGlzLl9kb0RyYWluKClcbiAgfVxuXG4gIF9yZWFkIChjYikge1xuICAgIHRoaXMuX2RvRHJhaW4oKVxuICAgIGNiKClcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhY2sgKG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBQYWNrKG9wdHMpXG59XG5cbmZ1bmN0aW9uIG1vZGVUb1R5cGUgKG1vZGUpIHtcbiAgc3dpdGNoIChtb2RlICYgY29uc3RhbnRzLlNfSUZNVCkge1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZCTEs6IHJldHVybiAnYmxvY2stZGV2aWNlJ1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZDSFI6IHJldHVybiAnY2hhcmFjdGVyLWRldmljZSdcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGRElSOiByZXR1cm4gJ2RpcmVjdG9yeSdcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGSUZPOiByZXR1cm4gJ2ZpZm8nXG4gICAgY2FzZSBjb25zdGFudHMuU19JRkxOSzogcmV0dXJuICdzeW1saW5rJ1xuICB9XG5cbiAgcmV0dXJuICdmaWxlJ1xufVxuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIG92ZXJmbG93IChzZWxmLCBzaXplKSB7XG4gIHNpemUgJj0gNTExXG4gIGlmIChzaXplKSBzZWxmLnB1c2goRU5EX09GX1RBUi5zdWJhcnJheSgwLCA1MTIgLSBzaXplKSlcbn1cblxuZnVuY3Rpb24gbWFwV3JpdGFibGUgKGJ1Zikge1xuICByZXR1cm4gYjRhLmlzQnVmZmVyKGJ1ZikgPyBidWYgOiBiNGEuZnJvbShidWYpXG59XG4iLCJjb25zdCBQYXNzVGhyb3VnaERlY29kZXIgPSByZXF1aXJlKCcuL2xpYi9wYXNzLXRocm91Z2gtZGVjb2RlcicpXG5jb25zdCBVVEY4RGVjb2RlciA9IHJlcXVpcmUoJy4vbGliL3V0ZjgtZGVjb2RlcicpXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgVGV4dERlY29kZXIge1xuICBjb25zdHJ1Y3RvciAoZW5jb2RpbmcgPSAndXRmOCcpIHtcbiAgICB0aGlzLmVuY29kaW5nID0gbm9ybWFsaXplRW5jb2RpbmcoZW5jb2RpbmcpXG5cbiAgICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgICB0aGlzLmRlY29kZXIgPSBuZXcgVVRGOERlY29kZXIoKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGVuY29kaW5nOiAnICsgdGhpcy5lbmNvZGluZylcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuZGVjb2RlciA9IG5ldyBQYXNzVGhyb3VnaERlY29kZXIodGhpcy5lbmNvZGluZylcbiAgICB9XG4gIH1cblxuICBwdXNoIChkYXRhKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgcmV0dXJuIGRhdGFcbiAgICByZXR1cm4gdGhpcy5kZWNvZGVyLmRlY29kZShkYXRhKVxuICB9XG5cbiAgLy8gRm9yIE5vZGUuanMgY29tcGF0aWJpbGl0eVxuICB3cml0ZSAoZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnB1c2goZGF0YSlcbiAgfVxuXG4gIGVuZCAoZGF0YSkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIGlmIChkYXRhKSByZXN1bHQgPSB0aGlzLnB1c2goZGF0YSlcbiAgICByZXN1bHQgKz0gdGhpcy5kZWNvZGVyLmZsdXNoKClcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKVxuXG4gIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgICByZXR1cm4gJ3V0ZjgnXG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiAndXRmMTZsZSdcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICByZXR1cm4gJ2xhdGluMSdcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdoZXgnOlxuICAgICAgcmV0dXJuIGVuY29kaW5nXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICB9XG59O1xuIiwiY29uc3QgYjRhID0gcmVxdWlyZSgnYjRhJylcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBQYXNzVGhyb3VnaERlY29kZXIge1xuICBjb25zdHJ1Y3RvciAoZW5jb2RpbmcpIHtcbiAgICB0aGlzLmVuY29kaW5nID0gZW5jb2RpbmdcbiAgfVxuXG4gIGRlY29kZSAodGFpbCkge1xuICAgIHJldHVybiBiNGEudG9TdHJpbmcodGFpbCwgdGhpcy5lbmNvZGluZylcbiAgfVxuXG4gIGZsdXNoICgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxufVxuIiwiY29uc3QgYjRhID0gcmVxdWlyZSgnYjRhJylcblxuLyoqXG4gKiBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jdXRmLTgtZGVjb2RlclxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFVURjhEZWNvZGVyIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMuY29kZVBvaW50ID0gMFxuICAgIHRoaXMuYnl0ZXNTZWVuID0gMFxuICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSAwXG4gICAgdGhpcy5sb3dlckJvdW5kYXJ5ID0gMHg4MFxuICAgIHRoaXMudXBwZXJCb3VuZGFyeSA9IDB4YmZcbiAgfVxuXG4gIGRlY29kZSAoZGF0YSkge1xuICAgIC8vIElmIHdlIGhhdmUgYSBmYXN0IHBhdGgsIGp1c3Qgc25pZmYgaWYgdGhlIGxhc3QgcGFydCBpcyBhIGJvdW5kYXJ5XG4gICAgaWYgKHRoaXMuYnl0ZXNOZWVkZWQgPT09IDApIHtcbiAgICAgIGxldCBpc0JvdW5kYXJ5ID0gdHJ1ZVxuXG4gICAgICBmb3IgKGxldCBpID0gTWF0aC5tYXgoMCwgZGF0YS5ieXRlTGVuZ3RoIC0gNCksIG4gPSBkYXRhLmJ5dGVMZW5ndGg7IGkgPCBuICYmIGlzQm91bmRhcnk7IGkrKykge1xuICAgICAgICBpc0JvdW5kYXJ5ID0gZGF0YVtpXSA8PSAweDdmXG4gICAgICB9XG5cbiAgICAgIGlmIChpc0JvdW5kYXJ5KSByZXR1cm4gYjRhLnRvU3RyaW5nKGRhdGEsICd1dGY4JylcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gJydcblxuICAgIGZvciAobGV0IGkgPSAwLCBuID0gZGF0YS5ieXRlTGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBjb25zdCBieXRlID0gZGF0YVtpXVxuXG4gICAgICBpZiAodGhpcy5ieXRlc05lZWRlZCA9PT0gMCkge1xuICAgICAgICBpZiAoYnl0ZSA8PSAweDdmKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSlcbiAgICAgICAgfSBlbHNlIGlmIChieXRlID49IDB4YzIgJiYgYnl0ZSA8PSAweGRmKSB7XG4gICAgICAgICAgdGhpcy5ieXRlc05lZWRlZCA9IDFcbiAgICAgICAgICB0aGlzLmNvZGVQb2ludCA9IGJ5dGUgJiAweDFmXG4gICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSAweGUwICYmIGJ5dGUgPD0gMHhlZikge1xuICAgICAgICAgIGlmIChieXRlID09PSAweGUwKSB0aGlzLmxvd2VyQm91bmRhcnkgPSAweGEwXG4gICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gMHhlZCkgdGhpcy51cHBlckJvdW5kYXJ5ID0gMHg5ZlxuICAgICAgICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSAyXG4gICAgICAgICAgdGhpcy5jb2RlUG9pbnQgPSBieXRlICYgMHhmXG4gICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSAweGYwICYmIGJ5dGUgPD0gMHhmNCkge1xuICAgICAgICAgIGlmIChieXRlID09PSAweGYwKSB0aGlzLmxvd2VyQm91bmRhcnkgPSAweDkwXG4gICAgICAgICAgaWYgKGJ5dGUgPT09IDB4ZjQpIHRoaXMudXBwZXJCb3VuZGFyeSA9IDB4OGZcbiAgICAgICAgICB0aGlzLmJ5dGVzTmVlZGVkID0gM1xuICAgICAgICAgIHRoaXMuY29kZVBvaW50ID0gYnl0ZSAmIDB4N1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCArPSAnXFx1ZmZmZCdcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChieXRlIDwgdGhpcy5sb3dlckJvdW5kYXJ5IHx8IGJ5dGUgPiB0aGlzLnVwcGVyQm91bmRhcnkpIHtcbiAgICAgICAgdGhpcy5jb2RlUG9pbnQgPSAwXG4gICAgICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSAwXG4gICAgICAgIHRoaXMuYnl0ZXNTZWVuID0gMFxuICAgICAgICB0aGlzLmxvd2VyQm91bmRhcnkgPSAweDgwXG4gICAgICAgIHRoaXMudXBwZXJCb3VuZGFyeSA9IDB4YmZcblxuICAgICAgICByZXN1bHQgKz0gJ1xcdWZmZmQnXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb3dlckJvdW5kYXJ5ID0gMHg4MFxuICAgICAgdGhpcy51cHBlckJvdW5kYXJ5ID0gMHhiZlxuXG4gICAgICB0aGlzLmNvZGVQb2ludCA9ICh0aGlzLmNvZGVQb2ludCA8PCA2KSB8IChieXRlICYgMHgzZilcbiAgICAgIHRoaXMuYnl0ZXNTZWVuKytcblxuICAgICAgaWYgKHRoaXMuYnl0ZXNTZWVuICE9PSB0aGlzLmJ5dGVzTmVlZGVkKSBjb250aW51ZVxuXG4gICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQodGhpcy5jb2RlUG9pbnQpXG5cbiAgICAgIHRoaXMuY29kZVBvaW50ID0gMFxuICAgICAgdGhpcy5ieXRlc05lZWRlZCA9IDBcbiAgICAgIHRoaXMuYnl0ZXNTZWVuID0gMFxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZsdXNoICgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJ5dGVzTmVlZGVkID4gMCA/ICdcXHVmZmZkJyA6ICcnXG5cbiAgICB0aGlzLmNvZGVQb2ludCA9IDBcbiAgICB0aGlzLmJ5dGVzTmVlZGVkID0gMFxuICAgIHRoaXMuYnl0ZXNTZWVuID0gMFxuICAgIHRoaXMubG93ZXJCb3VuZGFyeSA9IDB4ODBcbiAgICB0aGlzLnVwcGVyQm91bmRhcnkgPSAweGJmXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cbiIsInZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuXG4vLyB0aHJvdWdoXG4vL1xuLy8gYSBzdHJlYW0gdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHJlLWVtaXQgdGhlIGlucHV0LlxuLy8gdXNlZnVsIGZvciBhZ2dyZWdhdGluZyBhIHNlcmllcyBvZiBjaGFuZ2luZyBidXQgbm90IGVuZGluZyBzdHJlYW1zIGludG8gb25lIHN0cmVhbSlcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gdGhyb3VnaFxudGhyb3VnaC50aHJvdWdoID0gdGhyb3VnaFxuXG4vL2NyZWF0ZSBhIHJlYWRhYmxlIHdyaXRhYmxlIHN0cmVhbS5cblxuZnVuY3Rpb24gdGhyb3VnaCAod3JpdGUsIGVuZCwgb3B0cykge1xuICB3cml0ZSA9IHdyaXRlIHx8IGZ1bmN0aW9uIChkYXRhKSB7IHRoaXMucXVldWUoZGF0YSkgfVxuICBlbmQgPSBlbmQgfHwgZnVuY3Rpb24gKCkgeyB0aGlzLnF1ZXVlKG51bGwpIH1cblxuICB2YXIgZW5kZWQgPSBmYWxzZSwgZGVzdHJveWVkID0gZmFsc2UsIGJ1ZmZlciA9IFtdLCBfZW5kZWQgPSBmYWxzZVxuICB2YXIgc3RyZWFtID0gbmV3IFN0cmVhbSgpXG4gIHN0cmVhbS5yZWFkYWJsZSA9IHN0cmVhbS53cml0YWJsZSA9IHRydWVcbiAgc3RyZWFtLnBhdXNlZCA9IGZhbHNlXG5cbi8vICBzdHJlYW0uYXV0b1BhdXNlICAgPSAhKG9wdHMgJiYgb3B0cy5hdXRvUGF1c2UgICA9PT0gZmFsc2UpXG4gIHN0cmVhbS5hdXRvRGVzdHJveSA9ICEob3B0cyAmJiBvcHRzLmF1dG9EZXN0cm95ID09PSBmYWxzZSlcblxuICBzdHJlYW0ud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHdyaXRlLmNhbGwodGhpcywgZGF0YSlcbiAgICByZXR1cm4gIXN0cmVhbS5wYXVzZWRcbiAgfVxuXG4gIGZ1bmN0aW9uIGRyYWluKCkge1xuICAgIHdoaWxlKGJ1ZmZlci5sZW5ndGggJiYgIXN0cmVhbS5wYXVzZWQpIHtcbiAgICAgIHZhciBkYXRhID0gYnVmZmVyLnNoaWZ0KClcbiAgICAgIGlmKG51bGwgPT09IGRhdGEpXG4gICAgICAgIHJldHVybiBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICAgIGVsc2VcbiAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBkYXRhKVxuICAgIH1cbiAgfVxuXG4gIHN0cmVhbS5xdWV1ZSA9IHN0cmVhbS5wdXNoID0gZnVuY3Rpb24gKGRhdGEpIHtcbi8vICAgIGNvbnNvbGUuZXJyb3IoZW5kZWQpXG4gICAgaWYoX2VuZGVkKSByZXR1cm4gc3RyZWFtXG4gICAgaWYoZGF0YSA9PT0gbnVsbCkgX2VuZGVkID0gdHJ1ZVxuICAgIGJ1ZmZlci5wdXNoKGRhdGEpXG4gICAgZHJhaW4oKVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIC8vdGhpcyB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgdGhlIGZpcnN0ICdlbmQnIGxpc3RlbmVyXG4gIC8vbXVzdCBjYWxsIGRlc3Ryb3kgbmV4dCB0aWNrLCB0byBtYWtlIHN1cmUgd2UncmUgYWZ0ZXIgYW55XG4gIC8vc3RyZWFtIHBpcGVkIGZyb20gaGVyZS5cbiAgLy90aGlzIGlzIG9ubHkgYSBwcm9ibGVtIGlmIGVuZCBpcyBub3QgZW1pdHRlZCBzeW5jaHJvbm91c2x5LlxuICAvL2EgbmljZXIgd2F5IHRvIGRvIHRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoaXMgaXMgdGhlIGxhc3QgbGlzdGVuZXIgZm9yICdlbmQnXG5cbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2VcbiAgICBpZighc3RyZWFtLndyaXRhYmxlICYmIHN0cmVhbS5hdXRvRGVzdHJveSlcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBzdHJlYW0uZGVzdHJveSgpXG4gICAgICB9KVxuICB9KVxuXG4gIGZ1bmN0aW9uIF9lbmQgKCkge1xuICAgIHN0cmVhbS53cml0YWJsZSA9IGZhbHNlXG4gICAgZW5kLmNhbGwoc3RyZWFtKVxuICAgIGlmKCFzdHJlYW0ucmVhZGFibGUgJiYgc3RyZWFtLmF1dG9EZXN0cm95KVxuICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICB9XG5cbiAgc3RyZWFtLmVuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgaWYoZW5kZWQpIHJldHVyblxuICAgIGVuZGVkID0gdHJ1ZVxuICAgIGlmKGFyZ3VtZW50cy5sZW5ndGgpIHN0cmVhbS53cml0ZShkYXRhKVxuICAgIF9lbmQoKSAvLyB3aWxsIGVtaXQgb3IgcXVldWVcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cblxuICBzdHJlYW0uZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZihkZXN0cm95ZWQpIHJldHVyblxuICAgIGRlc3Ryb3llZCA9IHRydWVcbiAgICBlbmRlZCA9IHRydWVcbiAgICBidWZmZXIubGVuZ3RoID0gMFxuICAgIHN0cmVhbS53cml0YWJsZSA9IHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlXG4gICAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cblxuICBzdHJlYW0ucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoc3RyZWFtLnBhdXNlZCkgcmV0dXJuXG4gICAgc3RyZWFtLnBhdXNlZCA9IHRydWVcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cblxuICBzdHJlYW0ucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKHN0cmVhbS5wYXVzZWQpIHtcbiAgICAgIHN0cmVhbS5wYXVzZWQgPSBmYWxzZVxuICAgICAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpXG4gICAgfVxuICAgIGRyYWluKClcbiAgICAvL21heSBoYXZlIGJlY29tZSBwYXVzZWQgYWdhaW4sXG4gICAgLy9hcyBkcmFpbiBlbWl0cyAnZGF0YScuXG4gICAgaWYoIXN0cmVhbS5wYXVzZWQpXG4gICAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuICByZXR1cm4gc3RyZWFtXG59XG5cbiIsImltcG9ydCB7IHR5cGUgUHJvZHVjdCwgdHlwZSBQcm90b2NvbFR5cGUgfSBmcm9tIFwicHVwcGV0ZWVyLWNvcmVcIjtcblxuaW1wb3J0IHsgcHJvZ3JhbSwgT3B0aW9uIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0ICogYXMgY29tbWFuZGVyIGZyb20gXCJjb21tYW5kZXJcIjtcblxuLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIFN0cmluZyB0byBCb29sZWFuXG5mdW5jdGlvbiBib29sZWFuRW52KG5hbWU6IHN0cmluZywgZGVmYXVsdF92YWx1ZTogYm9vbGVhbikge1xuICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudltuYW1lXTtcbiAgaWYgKGVudiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7XG4gIH1cbiAgc3dpdGNoIChlbnYudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgXCIwXCI6XG4gICAgY2FzZSBcImZhbHNlXCI6XG4gICAgY2FzZSBcIm9mZlwiOlxuICAgIGNhc2UgXCJkaXNhYmxlZFwiOlxuICAgIGNhc2UgXCJub1wiOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNhc2UgXCIxXCI6XG4gICAgY2FzZSBcInRydWVcIjpcbiAgICBjYXNlIFwib25cIjpcbiAgICBjYXNlIFwiZW5hYmxlZFwiOlxuICAgIGNhc2UgXCJ5ZXNcIjpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQnJvd3NlclNldHRpbmdzIHtcbiAgcHJvZHVjdDogUHJvZHVjdDtcbiAgZXhlY3V0YWJsZVBhdGg6IHN0cmluZztcbn1cblxuLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBjb25maWd1cmluZyB0aGUgYnJvd3NlclxuZnVuY3Rpb24gYnJvd3NlclNldHRpbmdzKG5hbWU6IHN0cmluZyk6IEJyb3dzZXJTZXR0aW5ncyB7XG4gIHN3aXRjaCAobmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSBcImZpcmVmb3hcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb2R1Y3Q6IFwiZmlyZWZveFwiLFxuICAgICAgICBleGVjdXRhYmxlUGF0aDogXCIvdXNyL2Jpbi9maXJlZm94XCIsXG4gICAgICB9O1xuICAgIGNhc2UgXCJjaHJvbWVcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb2R1Y3Q6IFwiY2hyb21lXCIsXG4gICAgICAgIGV4ZWN1dGFibGVQYXRoOiBcIi91c3IvYmluL2dvb2dsZS1jaHJvbWUtc3RhYmxlXCIsXG4gICAgICB9O1xuICAgIGNhc2UgXCJjaHJvbWl1bVwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvZHVjdDogXCJjaHJvbWVcIixcbiAgICAgICAgZXhlY3V0YWJsZVBhdGg6IFwiL3Vzci9iaW4vY2hyb21pdW1cIixcbiAgICAgIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgYnJvd3NlciB0eXBlOiAke25hbWV9YCk7XG4gIH1cbn1cblxuLy8gcGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGFzIGFuIGludGVnZXJcbmZ1bmN0aW9uIGdldEludCh2YWx1ZTogc3RyaW5nKSB7XG4gIC8vIHBhcnNlIHRoZSB2YWx1ZSBhcyBhIGRlY2ltYWwgbnVtYmVyIChiYXNlIDEwKVxuICBjb25zdCBwYXJzZWQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICBpZiAoaXNOYU4ocGFyc2VkKSkge1xuICAgIHRocm93IG5ldyBjb21tYW5kZXIuSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJFbnRlciBhIHZhbGlkIG51bWJlci5cIik7XG4gIH1cblxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vLyBkZWZpbmUgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHBhcnNlIHRoZW1cbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGovY29tbWFuZGVyLmpzXG5wcm9ncmFtXG4gIC5kZXNjcmlwdGlvbihcIlJ1biBhIHNpbXBsZSBBZ2FtYSBpbnRlZ3JhdGlvbiB0ZXN0XCIpXG4gIC5vcHRpb24oXCItdSwgLS11cmwgPHVybD5cIiwgXCJBZ2FtYSBzZXJ2ZXIgVVJMXCIsIFwiaHR0cDovL2xvY2FsaG9zdFwiKVxuICAub3B0aW9uKFwiLXAsIC0tcGFzc3dvcmQgPHBhc3N3b3JkPlwiLCBcIkFnYW1hIGxvZ2luIHBhc3N3b3JkXCIsIFwibm90czNjcjN0XCIpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbihcIi1iLCAtLWJyb3dzZXIgPGJyb3dzZXI+XCIsIFwiQnJvd3NlciB1c2VkIGZvciBydW5uaW5nIHRoZSB0ZXN0XCIpXG4gICAgLmNob2ljZXMoW1wiZmlyZWZveFwiLCBcImNocm9tZVwiLCBcImNocm9taXVtXCJdKVxuICAgIC5kZWZhdWx0KFwiZmlyZWZveFwiKVxuICApXG4gIC5vcHRpb24oXCItaCwgLS1oZWFkZWRcIiwgXCJSdW4gdGhlIGJyb3dzZXIgaW4gaGVhZGVkIG1vZGUgd2l0aCBVSSAodGhlIGRlZmF1bHQgaXMgaGVhZGxlc3MgbW9kZSlcIilcbiAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKFwiLWQsIC0tZGVsYXkgPG1pbGlzZWNvbmRzPlwiLCBcIkRlbGF5IGJldHdlZW4gdGhlIGJyb3dzZXIgYWN0aW9ucywgdXNlZnVsIGluIGhlYWRlZCBtb2RlXCIpXG4gICAgLmFyZ1BhcnNlcihnZXRJbnQpXG4gICAgLmRlZmF1bHQoMClcbiAgKVxuICAub3B0aW9uKFwiLWMsIC0tY29udGludWVcIiwgXCJDb250aW51ZSB0aGUgdGVzdCBhZnRlciBhIGZhaWx1cmUgKHRoZSBkZWZhdWx0IGlzIGFib3J0IG9uIGVycm9yKVwiKVxuICAucGFyc2UocHJvY2Vzcy5hcmd2KTtcblxuLy8gcGFyc2Ugb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmVcbmNvbnN0IG9wdGlvbnMgPSBwcm9ncmFtLm9wdHMoKTtcblxuY29uc3QgcHVwcGV0ZWVyTGF1bmNoT3B0aW9ucyA9IHtcbiAgLy8gXCJ3ZWJEcml2ZXJCaURpXCIgZG9lcyBub3Qgd29yayB3aXRoIG9sZCBGaXJlRm94LCBjb21tZW50IGl0IG91dCBpZiBuZWVkZWRcbiAgcHJvdG9jb2w6IFwid2ViRHJpdmVyQmlEaVwiIGFzIFByb3RvY29sVHlwZSxcbiAgaGVhZGxlc3M6ICFvcHRpb25zLmhlYWRlZCxcbiAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsXG4gIHRpbWVvdXQ6IDMwMDAwLFxuICBzbG93TW86IG9wdGlvbnMuZGVsYXksXG4gIGRlZmF1bHRWaWV3cG9ydDoge1xuICAgIHdpZHRoOiAxMjgwLFxuICAgIGhlaWdodDogNzY4XG4gIH0sXG4gIC4uLmJyb3dzZXJTZXR0aW5ncyhvcHRpb25zLmJyb3dzZXIpXG59XG5cbmV4cG9ydCB7IGJvb2xlYW5FbnYsIG9wdGlvbnMsIHB1cHBldGVlckxhdW5jaE9wdGlvbnMgfTtcbiIsImltcG9ydCBwdXBwZXRlZXIsIHsgdHlwZSBMb2NhdG9yLCB0eXBlIFBhZ2UgfSBmcm9tIFwicHVwcGV0ZWVyLWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZUZpcnN0VXNlclBhZ2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFnZTogUGFnZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZ1bGxOYW1lSW5wdXQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImlucHV0I3VzZXJGdWxsTmFtZVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVzZXJuYW1lSW5wdXQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImlucHV0I3VzZXJOYW1lXCIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFzc3dvcmRJbnB1dCA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiaW5wdXQjcGFzc3dvcmRcIik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXNzd29yZENvbmZpcm1hdGlvbklucHV0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJpbnB1dCNwYXNzd29yZENvbmZpcm1hdGlvblwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjY2VwdEJ1dHRvbiA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYnV0dG9uW2Zvcm09J2ZpcnN0VXNlckZvcm0nXVwiKTtcblxuICAgIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UpIHtcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICB9XG5cbiAgICBhc3luYyBmaWxsRnVsbE5hbWUoZnVsbE5hbWU6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLmZ1bGxOYW1lSW5wdXQoKS5maWxsKGZ1bGxOYW1lKTtcbiAgICB9XG5cbiAgICBhc3luYyBmaWxsVXNlck5hbWUodXNlck5hbWU6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLnVzZXJuYW1lSW5wdXQoKS5maWxsKHVzZXJOYW1lKTtcbiAgICB9XG5cbiAgICBhc3luYyBmaWxsUGFzc3dvcmQocGFzc3dvcmQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLnBhc3N3b3JkSW5wdXQoKS5maWxsKHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICBhc3luYyBmaWxsUGFzc3dvcmRDb25maXJtYXRpb24ocGFzc3dvcmQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLnBhc3N3b3JkQ29uZmlybWF0aW9uSW5wdXQoKS5maWxsKHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICBhc3luYyBhY2NlcHQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWNjZXB0QnV0dG9uKCkuY2xpY2soKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgcHVwcGV0ZWVyLCB7IHR5cGUgUGFnZSB9IGZyb20gXCJwdXBwZXRlZXItY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgTG9naW5Bc1Jvb3RQYWdlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXNzd29yZElucHV0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJpbnB1dCNwYXNzd29yZFwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ0luQnV0dG9uID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJidXR0b25bdHlwZT0nc3VibWl0J11cIik7XG5cbiAgICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9nSW4ocGFzc3dvcmQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLnBhc3N3b3JkSW5wdXQoKS5maWxsKHBhc3N3b3JkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dJbkJ1dHRvbigpLmNsaWNrKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHB1cHBldGVlciwgeyB0eXBlIExvY2F0b3IsIHR5cGUgUGFnZSB9IGZyb20gXCJwdXBwZXRlZXItY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgUHJvZHVjdFNlbGVjdGlvblBhZ2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFnZTogUGFnZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxlYXBUZXh0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCI6Oi1wLXRleHQoJ0xlYXAgMTYuMCBBbHBoYScpXCIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWljcm9Pc1RleHQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcIjo6LXAtdGV4dCgnb3BlblNVU0UgTWljcm9PUycpXCIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHVtYmxld2VlZFRleHQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcIjo6LXAtdGV4dCgnb3BlblNVU0UgVHVtYmxld2VlZCcpXCIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0QnV0dG9uID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJidXR0b25bZm9ybT0ncHJvZHVjdFNlbGVjdGlvbkZvcm0nXVwiKTtcblxuICAgIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UpIHtcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICB9XG5cbiAgICBhc3luYyBzZWxlY3RMZWFwKCkge1xuICAgICAgICBhd2FpdCB0aGlzLmxlYXBUZXh0KCkuY2xpY2soKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZWxlY3RCdXR0b24oKS5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIHNlbGVjdE1pY3JvT3MoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWljcm9Pc1RleHQoKS5jbGljaygpO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbGVjdEJ1dHRvbigpLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VsZWN0VHVtYmxld2VlZCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50dW1ibGV3ZWVkVGV4dCgpLmNsaWNrKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VsZWN0QnV0dG9uKCkuY2xpY2soKTtcbiAgICB9XG59XG5cbiIsImltcG9ydCBwdXBwZXRlZXIsIHsgdHlwZSBMb2NhdG9yLCB0eXBlIFBhZ2UgfSBmcm9tIFwicHVwcGV0ZWVyLWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFNldEFSb290UGFzc3dvcmRQYWdlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXNzd29yZElucHV0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJpbnB1dCNwYXNzd29yZFwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhc3N3b3JkQ29uZmlybWF0aW9uSW5wdXQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImlucHV0I3Bhc3N3b3JkQ29uZmlybWF0aW9uXCIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlybVRleHQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImJ1dHRvbjo6LXAtdGV4dChDb25maXJtKVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbmNlbFRleHQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImJ1dHRvbjo6LXAtdGV4dChDYW5jZWwpXCIpO1xuXG4gICAgY29uc3RydWN0b3IocGFnZTogUGFnZSkge1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIH1cblxuICAgIGFzeW5jIGZpbGxQYXNzd29yZChwYXNzd29yZDogc3RyaW5nKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucGFzc3dvcmRJbnB1dCgpLmZpbGwocGFzc3dvcmQpO1xuICAgIH1cblxuICAgIGFzeW5jIGZpbGxQYXNzd29yZENvbmZpcm1hdGlvbihwYXNzd29yZDogc3RyaW5nKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucGFzc3dvcmRDb25maXJtYXRpb25JbnB1dCgpLmZpbGwocGFzc3dvcmQpO1xuICAgIH1cblxuICAgIGFzeW5jIGNvbmZpcm0oKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlybVRleHQoKS5jbGljaygpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gXCJwdXBwZXRlZXItY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgU2lkZWJhclBhZ2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFnZTogUGFnZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG92ZXJ2aWV3TGluayA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYVtocmVmPScjL292ZXJ2aWV3J11cIik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2NhbGl6YXRpb25MaW5rID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJhW2hyZWY9JyMvbDEwbiddXCIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya0xpbmsgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImFbaHJlZj0nIy9uZXR3b3JrJ11cIik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlTGluayA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYVtocmVmPScjL3N0b3JhZ2UnXVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNvZnR3YXJlTGluayA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYVtocmVmPScjL3NvZnR3YXJlJ11cIik7XG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2Vyc0xpbmsgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImFbaHJlZj0nIy91c2VycyddXCIpO1xuICAgIFxuICAgIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UpIHtcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICB9XG5cbiAgICBhc3luYyBnb1RvT3ZlcnZpZXcoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMub3ZlcnZpZXdMaW5rKCkuY2xpY2soKTtcbiAgICB9XG5cbiAgICBhc3luYyBnb1RvTG9jYWxpemF0aW9uKCkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvY2FsaXphdGlvbkxpbmsoKS5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIGdvVG9OZXR3b3JrKCkge1xuICAgICAgICBhd2FpdCB0aGlzLm5ldHdvcmtMaW5rKCkuY2xpY2soKTtcbiAgICB9XG5cbiAgICBhc3luYyBnb1RvU3RvcmFnZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlTGluaygpLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ29Ub1NvZnR3YXJlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnNvZnR3YXJlTGluaygpLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ29Ub1VzZXJzKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnVzZXJzTGluaygpLmNsaWNrKCk7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgcHVwcGV0ZWVyLCB7IHR5cGUgTG9jYXRvciwgdHlwZSBQYWdlIH0gZnJvbSBcInB1cHBldGVlci1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBVc2Vyc1BhZ2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFnZTogUGFnZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZpcnN0VXNlckxpbmsgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImFbaHJlZj0nIy91c2Vycy9maXJzdCddXCIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2V0QVBhc3N3b3JkVGV4dCA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYnV0dG9uOjotcC10ZXh0KFNldCBhIHBhc3N3b3JkKVwiKTtcblxuICAgIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UpIHtcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICB9XG5cbiAgICBhc3luYyBkZWZpbmVBVXNlck5vdygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maXJzdFVzZXJMaW5rKCkuY2xpY2soKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRBUGFzc3dvcmQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0QVBhc3N3b3JkVGV4dCgpLmNsaWNrKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHB1cHBldGVlciwgeyB0eXBlIEJyb3dzZXIsIHR5cGUgUGFnZSB9IGZyb20gXCJwdXBwZXRlZXItY29yZVwiO1xuXG5pbXBvcnQgeyBpdCBhcyB0ZXN0SXQsIGRlc2NyaWJlLCBiZWZvcmUsIGFmdGVyLCBza2lwIH0gZnJvbSBcIm5vZGU6dGVzdFwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwibm9kZTphc3NlcnQvc3RyaWN0XCI7XG5cbmltcG9ydCB7IGJvb2xlYW5FbnYsIG9wdGlvbnMsIHB1cHBldGVlckxhdW5jaE9wdGlvbnMgfSBmcm9tIFwiLi4vY29uZmlndXJhdGlvblwiO1xuXG5cbmltcG9ydCB7IExvZ2luQXNSb290UGFnZSB9IGZyb20gXCIuLi9wYWdlcy9sb2dpbi1hcy1yb290LXBhZ2VcIjtcbmltcG9ydCB7IFByb2R1Y3RTZWxlY3Rpb25QYWdlIH0gZnJvbSBcIi4uL3BhZ2VzL3Byb2R1Y3Qtc2VsZWN0aW9uLXBhZ2VcIjtcbmltcG9ydCB7IFNpZGViYXJQYWdlIH0gZnJvbSBcIi4uL3BhZ2VzL3NpZGViYXItcGFnZVwiO1xuaW1wb3J0IHsgVXNlcnNQYWdlIH0gZnJvbSBcIi4uL3BhZ2VzL3VzZXJzLXBhZ2VcIjtcbmltcG9ydCB7IFNldEFSb290UGFzc3dvcmRQYWdlIH0gZnJvbSBcIi4uL3BhZ2VzL3Jvb3QtcGFzc3dvcmQtcGFnZVwiO1xuaW1wb3J0IHsgQ3JlYXRlRmlyc3RVc2VyUGFnZSB9IGZyb20gXCIuLi9wYWdlcy9jcmVhdGUtdXNlci1wYWdlXCJcblxubGV0IHBhZ2U6IFBhZ2U7XG5sZXQgYnJvd3NlcjogQnJvd3NlcjtcbmxldCBmYWlsZWQgPSBmYWxzZTtcblxuLy8gZGVmaW5lIGl0KCkgYXMgYSB3cmFwcGVyIHdoaWNoIGR1bXBzIHRoZSBwYWdlIG9uIGEgZmFpbHVyZVxuYXN5bmMgZnVuY3Rpb24gaXQobGFiZWw6IHN0cmluZywgdGVzdDogKCkgPT4gUHJvbWlzZTx2b2lkPiwgdGltZW91dD86IG51bWJlcikge1xuICB0ZXN0SXQobGFiZWwsXG4gICAgLy8gYWJvcnQgd2hlbiB0aGUgdGVzdCB0YWtlcyBtb3JlIHRoYW4gb25lIG1pbnV0ZVxuICAgIHsgdGltZW91dDogdGltZW91dCB8fCA2MDAwMCB9LFxuICAgIGFzeW5jICh0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZmFpbGVkKVxuICAgICAgICAgIHQuc2tpcCgpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBhd2FpdCB0ZXN0KCk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmNvbnRpbnVlKSBmYWlsZWQgPSB0cnVlO1xuICAgICAgICBpZiAocGFnZSkge1xuICAgICAgICAgIC8vIGRpcmVjdG9yeSBmb3Igc3RvcmluZyB0aGUgZGF0YVxuICAgICAgICAgIGNvbnN0IGRpciA9IFwibG9nXCI7XG4gICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGRpcikpIGZzLm1rZGlyU3luYyhkaXIpO1xuXG4gICAgICAgICAgLy8gYmFzZSBmaWxlIG5hbWUgZm9yIHRoZSBkdW1wc1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBwYXRoLmpvaW4oZGlyLCBsYWJlbC5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJfXCIpKTtcbiAgICAgICAgICBhd2FpdCBwYWdlLnNjcmVlbnNob3QoeyBwYXRoOiBuYW1lICsgXCIucG5nXCIgfSk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHBhZ2UuY29udGVudCgpO1xuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMobmFtZSArIFwiLmh0bWxcIiwgaHRtbCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUZXN0IGZhaWxlZCFcIiwgeyBjYXVzZTogZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfSk7XG59O1xuXG5jb25zdCBhZ2FtYUluc3RhbGwgPSBib29sZWFuRW52KFwiQUdBTUFfSU5TVEFMTFwiLCB0cnVlKTtcbmNvbnN0IGFnYW1hRGFzZCA9IGJvb2xlYW5FbnYoXCJBR0FNQV9EQVNEXCIsIGZhbHNlKTtcbmNvbnN0IGFnYW1hUHJvZHVjdCA9IHByb2Nlc3MuZW52LkFHQU1BX1BST0RVQ1QgfHwgXCJ0dW1ibGV3ZWVkXCI7XG5cbmNvbnN0IGFnYW1hVXNlciA9IFwiYmVybmhhcmRcIjtcbmNvbnN0IGFnYW1hVXNlckZ1bGxOYW1lID0gXCJCZXJuaGFyZCBNLiBXaWVkZW1hbm5cIjtcblxuZGVzY3JpYmUoXCJBZ2FtYSB0ZXN0XCIsIGZ1bmN0aW9uICgpIHtcbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaChwdXBwZXRlZXJMYXVuY2hPcHRpb25zKTtcbiAgICBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgcGFnZS5zZXREZWZhdWx0VGltZW91dCgyMDAwMCk7XG4gICAgYXdhaXQgcGFnZS5nb3RvKG9wdGlvbnMudXJsLCB7IHRpbWVvdXQ6IDYwMDAwLCB3YWl0VW50aWw6IFwiZG9tY29udGVudGxvYWRlZFwiIH0pO1xuICAgIGF3YWl0IHBhZ2Uud2FpdEZvck5ldHdvcmtJZGxlKHsgaWRsZVRpbWU6IDEwMDAgfSk7XG4gIH0pO1xuXG4gIGFmdGVyKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBwYWdlLmNsb3NlKCk7XG4gICAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhdmUgQWdhbWEgcGFnZSB0aXRsZVwiLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChhd2FpdCBwYWdlLnRpdGxlKCksIFwiQWdhbWFcIik7XG4gIH0pO1xuXG4gIGl0KFwiYWxsb3dzIGxvZ2dpbmcgaW5cIiwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGxvZ2luQXNSb290ID0gbmV3IExvZ2luQXNSb290UGFnZShwYWdlKTtcbiAgICBhd2FpdCBsb2dpbkFzUm9vdC5sb2dJbihvcHRpb25zLnBhc3N3b3JkKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgZGlzcGxheSB0aGUgcHJvZHVjdCBzZWxlY3Rpb24gZGlhbG9nXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwcm9kdWN0c2VsZWN0aW9uID0gbmV3IFByb2R1Y3RTZWxlY3Rpb25QYWdlKHBhZ2UpO1xuXG4gICAgbGV0IHRpbWVvdXQgPSAyICogNjAgKiAxMDAwO1xuXG4gICAgaWYgKGFnYW1hUHJvZHVjdCA9PT0gXCJsZWFwXCIpIHtcbiAgICAgIGF3YWl0IHByb2R1Y3RzZWxlY3Rpb24uc2VsZWN0TGVhcCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGF3YWl0IHByb2R1Y3RzZWxlY3Rpb24uc2VsZWN0VHVtYmxld2VlZCgpO1xuICAgIH1cbiAgICAvLyBDaGVjayBpZiBjb25maWd1cmF0aW9uIHByb2NlZHVyZSBpcyBwcm9ncmVzc2luZ1xuICAgIGF3YWl0IHBhZ2UubG9jYXRvcihcIjo6LXAtdGV4dChDb25maWd1cmluZyB0aGUgcHJvZHVjdClcIikud2FpdCgpO1xuXG4gICAgLy8gcmVmcmVzaGluZyB0aGUgcmVwb3NpdG9yaWVzIG1pZ2h0IHRha2UgbG9uZyB0aW1lXG4gICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiaDM6Oi1wLXRleHQoJ092ZXJ2aWV3JylcIikuc2V0VGltZW91dCh0aW1lb3V0KS53YWl0KCk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGRpc3BsYXkgb3ZlcnZpZXcgc2VjdGlvblwiLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiaDM6Oi1wLXRleHQoJ092ZXJ2aWV3JylcIikud2FpdCgpO1xuICB9KTtcblxuICBpdChcInNob3VsZCBhbGxvdyBzZXR0aW5nIHRoZSByb290IHBhc3N3b3JkXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzaWRlYmFyID0gbmV3IFNpZGViYXJQYWdlKHBhZ2UpO1xuICAgIGNvbnN0IHVzZXJzID0gbmV3IFVzZXJzUGFnZShwYWdlKTtcbiAgICBjb25zdCBzZXRBUm9vdFBhc3N3b3JkID0gbmV3IFNldEFSb290UGFzc3dvcmRQYWdlKHBhZ2UpO1xuXG4gICAgYXdhaXQgc2lkZWJhci5nb1RvVXNlcnMoKTtcbiAgICBhd2FpdCB1c2Vycy5zZXRBUGFzc3dvcmQoKTtcbiAgICBhd2FpdCBzZXRBUm9vdFBhc3N3b3JkLmZpbGxQYXNzd29yZChvcHRpb25zLnBhc3N3b3JkKTtcbiAgICBhd2FpdCBzZXRBUm9vdFBhc3N3b3JkLmZpbGxQYXNzd29yZENvbmZpcm1hdGlvbihvcHRpb25zLnBhc3N3b3JkKTtcbiAgICBhd2FpdCBzZXRBUm9vdFBhc3N3b3JkLmNvbmZpcm0oKTtcblxuICAgIC8vIGEgcG9wdXAgdG8gZGlzYXBwZWFyIHdoaWNoIGNoYW5nZXMgdGhlIHBvc2l0aW9ucyBvZiBvdGhlciBlbGVtZW50c1xuICAgIC8vIHBhZ2Uud2FpdEZvck5ldHdvcmtJZGxlIHNvbHZlcyB0aGlzIGlzc3VlXG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGNyZWF0ZSBmaXJzdCB1c2VyXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB1c2VycyA9IG5ldyBVc2Vyc1BhZ2UocGFnZSk7XG4gICAgY29uc3QgY3JlYXRlRmlyc3RVc2VyID0gbmV3IENyZWF0ZUZpcnN0VXNlclBhZ2UocGFnZSk7XG4gICAgYXdhaXQgdXNlcnMuZGVmaW5lQVVzZXJOb3coKTtcbiAgICBhd2FpdCBjcmVhdGVGaXJzdFVzZXIuZmlsbEZ1bGxOYW1lKGFnYW1hVXNlckZ1bGxOYW1lKTtcbiAgICBhd2FpdCBjcmVhdGVGaXJzdFVzZXIuZmlsbFVzZXJOYW1lKGFnYW1hVXNlcik7XG4gICAgYXdhaXQgY3JlYXRlRmlyc3RVc2VyLmZpbGxQYXNzd29yZChvcHRpb25zLnBhc3N3b3JkKTtcbiAgICBhd2FpdCBjcmVhdGVGaXJzdFVzZXIuZmlsbFBhc3N3b3JkQ29uZmlybWF0aW9uKG9wdGlvbnMucGFzc3dvcmQpO1xuICAgIGF3YWl0IGNyZWF0ZUZpcnN0VXNlci5hY2NlcHQoKTtcbiAgfSk7XG5cbiAgaWYgKGFnYW1hRGFzZCkge1xuICAgIGl0KFwic2hvdWxkIHByZXBhcmUgc3RvcmFnZVwiLCBhc3luYyBmdW5jdGlvbiAoKSB7XG5cbiAgICAgIC8vIFdvcmthcm91bmQsIHNvbWV0aW1lcyB0aGUgVUkgc2VlbXMgbm90IHJlc3BvbnNpdmVcbiAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcihcImFbaHJlZj0nIy9zdG9yYWdlJ11cIikuY2xpY2soeyBkZWxheTogMTAwMCB9KTtcbiAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcihcImFbaHJlZj0nIy9zdG9yYWdlJ11cIikuY2xpY2soeyBkZWxheTogMTAwMCB9KTtcbiAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcihcImFbaHJlZj0nIy9zdG9yYWdlL3RhcmdldC1kZXZpY2UnXVwiKS5jbGljaygpO1xuICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwic3Bhbjo6LXAtdGV4dCgnc3RvcmFnZSB0ZWNocycpXCIpLmNsaWNrKCk7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJzcGFuOjotcC10ZXh0KCdEQVNEJylcIikuY2xpY2soeyBkZWxheTogMTAwMCB9KTtcblxuICAgICAgLy8gRW5hYmxpbmcgREFTRCBkZXZpY2UsIGJ5IGRlZmF1bHQgaXQgaXMgYWx3YXlzIGRpc2FibGVkXG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJpbnB1dFtuYW1lPSdjaGVja3JvdzAnXVwiKS5jbGljayh7IGRlbGF5OiAxMDAwIH0pO1xuICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwic3Bhbjo6LXAtdGV4dCgnUGVyZm9ybSBhbiBhY3Rpb24nKVwiKS5jbGljayh7IGRlbGF5OiAxMDAwIH0pO1xuICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwic3Bhbjo6LXAtdGV4dCgnQWN0aXZhdGUnKVwiKS5jbGljaygpO1xuXG4gICAgICAvLyBTZWxlY3RpbmcgaW5zdGFsbGF0aW9uIGRldmljZVxuICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiYVtocmVmPScjL3N0b3JhZ2UnXVwiKS5jbGljaygpO1xuICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiYVtocmVmPScjL3N0b3JhZ2UvdGFyZ2V0LWRldmljZSddXCIpLmNsaWNrKHsgZGVsYXk6IDEwMDAgfSk7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJpbnB1dFthcmlhLWxhYmVsPSdTZWxlY3Qgcm93IDAnXVwiKS5jbGljaygpO1xuICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiYnV0dG9uW2Zvcm09J3RhcmdldFNlbGVjdGlvbiddXCIpLmNsaWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBpdChcInNob3VsZCBiZSByZWFkeSBmb3IgaW5zdGFsbGF0aW9uXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJhW2hyZWY9JyMvb3ZlcnZpZXcnXVwiKS5jbGljaygpO1xuICAgIC8vIEluIE92ZXJ2aWV3LCBTdG9yYWdlIHNlY3Rpb24gdGFrZXMgbW9yZSB0aW1lIHRvIHJlZnJlc2ggY2hhbmdpbmcgXG4gICAgLy8gdGhlIHBvc2l0aW9uIGluIHRoZSBzY3JlZW4gb2YgdGV4dCAnUmVhZHkgZm9yIGluc3RhbGxhdGlvbiBhbmQgYnV0dG9uICdJbnN0YWxsJ1xuICAgIC8vIHBhZ2Uud2FpdEZvck5ldHdvcmtJZGxlIHNvbHZlcyB0aGlzIGlzc3VlXG4gICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiaDQ6Oi1wLXRleHQoJ1JlYWR5IGZvciBpbnN0YWxsYXRpb24nKVwiKS53YWl0KCk7XG4gIH0pO1xuXG4gIC8vIEZvciBkZXZlbG9wbWVudCB3aWxsIGJlIHVzZWZ1bCB0byBzdG9wIGJlZm9yZSBzdGFydGluZyBpbnN0YWxsYXRpb25cbiAgaWYgKGFnYW1hSW5zdGFsbCA9PT0gdHJ1ZSkge1xuICAgIGl0KFwic2hvdWxkIHN0YXJ0IGluc3RhbGxhdGlvblwiLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJidXR0b246Oi1wLXRleHQoJ0luc3RhbGwnKVwiKS5jbGljaygpO1xuICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiYnV0dG9uOjotcC10ZXh0KCdDb250aW51ZScpXCIpLmNsaWNrKCk7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCI6Oi1wLXRleHQoSW5zdGFsbGluZyB0aGUpXCIpLndhaXQoKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGZpbmlzaCBpbnN0YWxsYXRpb25cIiwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgcGFnZVxuICAgICAgICAubG9jYXRvcihcImgyOjotcC10ZXh0KCdDb25ncmF0dWxhdGlvbnMhJylcIilcbiAgICAgICAgLnNldFRpbWVvdXQoMTUgKiA2MCAqIDEwMDApXG4gICAgICAgIC53YWl0KCk7XG4gICAgfSwgMTUgKiA2MCAqIDEwMDApO1xuICB9XG59KTtcbiIsInZhciB0aHJvdWdoID0gcmVxdWlyZSgndGhyb3VnaCcpO1xudmFyIGJ6MiA9IHJlcXVpcmUoJy4vbGliL2J6aXAyJyk7XG52YXIgYml0SXRlcmF0b3IgPSByZXF1aXJlKCcuL2xpYi9iaXRfaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmJ6aXAyU3RyZWFtO1xuXG5mdW5jdGlvbiB1bmJ6aXAyU3RyZWFtKCkge1xuICAgIHZhciBidWZmZXJRdWV1ZSA9IFtdO1xuICAgIHZhciBoYXNCeXRlcyA9IDA7XG4gICAgdmFyIGJsb2NrU2l6ZSA9IDA7XG4gICAgdmFyIGJyb2tlbiA9IGZhbHNlO1xuICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgdmFyIGJpdFJlYWRlciA9IG51bGw7XG4gICAgdmFyIHN0cmVhbUNSQyA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBkZWNvbXByZXNzQmxvY2socHVzaCl7XG4gICAgICAgIGlmKCFibG9ja1NpemUpe1xuICAgICAgICAgICAgYmxvY2tTaXplID0gYnoyLmhlYWRlcihiaXRSZWFkZXIpO1xuICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKFwiZ290IGhlYWRlciBvZlwiLCBibG9ja1NpemUpO1xuICAgICAgICAgICAgc3RyZWFtQ1JDID0gMDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHZhciBidWZzaXplID0gMTAwMDAwICogYmxvY2tTaXplO1xuICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBJbnQzMkFycmF5KGJ1ZnNpemUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgY2h1bmsgPSBbXTtcbiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oYikge1xuICAgICAgICAgICAgICAgIGNodW5rLnB1c2goYik7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzdHJlYW1DUkMgPSBiejIuZGVjb21wcmVzcyhiaXRSZWFkZXIsIGYsIGJ1ZiwgYnVmc2l6ZSwgc3RyZWFtQ1JDKTtcbiAgICAgICAgICAgIGlmIChzdHJlYW1DUkMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyByZXNldCBmb3IgbmV4dCBiemlwMiBoZWFkZXJcbiAgICAgICAgICAgICAgICBibG9ja1NpemUgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcignZGVjb21wcmVzc2VkJywgY2h1bmsubGVuZ3RoLCdieXRlcycpO1xuICAgICAgICAgICAgICAgIHB1c2goQnVmZmVyLmZyb20oY2h1bmspKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBvdXRsZW5ndGggPSAwO1xuICAgIGZ1bmN0aW9uIGRlY29tcHJlc3NBbmRRdWV1ZShzdHJlYW0pIHtcbiAgICAgICAgaWYgKGJyb2tlbikgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGRlY29tcHJlc3NCbG9jayhmdW5jdGlvbihkKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnF1ZXVlKGQpO1xuICAgICAgICAgICAgICAgIGlmIChkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcignd3JpdGUgYXQnLCBvdXRsZW5ndGgudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGVuZ3RoICs9IGQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcignd3JpdHRlbiBFT1MnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICAgICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhyb3VnaChcbiAgICAgICAgZnVuY3Rpb24gd3JpdGUoZGF0YSkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKCdyZWNlaXZlZCcsIGRhdGEubGVuZ3RoLCdieXRlcyBpbicsIHR5cGVvZiBkYXRhKTtcbiAgICAgICAgICAgIGJ1ZmZlclF1ZXVlLnB1c2goZGF0YSk7XG4gICAgICAgICAgICBoYXNCeXRlcyArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChiaXRSZWFkZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBiaXRSZWFkZXIgPSBiaXRJdGVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoIWJyb2tlbiAmJiBoYXNCeXRlcyAtIGJpdFJlYWRlci5ieXRlc1JlYWQgKyAxID49ICgoMjUwMDAgKyAxMDAwMDAgKiBibG9ja1NpemUpIHx8IDQpKXtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoJ2RlY29tcHJlc3Npbmcgd2l0aCcsIGhhc0J5dGVzIC0gYml0UmVhZGVyLmJ5dGVzUmVhZCArIDEsICdieXRlcyBpbiBidWZmZXInKTtcbiAgICAgICAgICAgICAgICBkZWNvbXByZXNzQW5kUXVldWUodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uIGVuZCh4KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoeCwnbGFzdCBjb21wcmVzc2luZyB3aXRoJywgaGFzQnl0ZXMsICdieXRlcyBpbiBidWZmZXInKTtcbiAgICAgICAgICAgIHdoaWxlICghYnJva2VuICYmIGJpdFJlYWRlciAmJiBoYXNCeXRlcyA+IGJpdFJlYWRlci5ieXRlc1JlYWQpe1xuICAgICAgICAgICAgICAgIGRlY29tcHJlc3NBbmRRdWV1ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYnJva2VuKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbUNSQyAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihcImlucHV0IHN0cmVhbSBlbmRlZCBwcmVtYXR1cmVseVwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG59XG5cbiIsInZhciBCSVRNQVNLID0gWzAsIDB4MDEsIDB4MDMsIDB4MDcsIDB4MEYsIDB4MUYsIDB4M0YsIDB4N0YsIDB4RkZdO1xuXG4vLyByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZWFkcyBiaXRzLlxuLy8gdGFrZXMgYSBidWZmZXIgaXRlcmF0b3IgYXMgaW5wdXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYml0SXRlcmF0b3IobmV4dEJ1ZmZlcikge1xuICAgIHZhciBiaXQgPSAwLCBieXRlID0gMDtcbiAgICB2YXIgYnl0ZXMgPSBuZXh0QnVmZmVyKCk7XG4gICAgdmFyIGYgPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmIChuID09PSBudWxsICYmIGJpdCAhPSAwKSB7ICAvLyBhbGlnbiB0byBieXRlIGJvdW5kYXJ5XG4gICAgICAgICAgICBiaXQgPSAwXG4gICAgICAgICAgICBieXRlKys7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICAgIHdoaWxlKG4gPiAwKSB7XG4gICAgICAgICAgICBpZiAoYnl0ZSA+PSBieXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBieXRlID0gMDtcbiAgICAgICAgICAgICAgICBieXRlcyA9IG5leHRCdWZmZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBsZWZ0ID0gOCAtIGJpdDtcbiAgICAgICAgICAgIGlmIChiaXQgPT09IDAgJiYgbiA+IDApXG4gICAgICAgICAgICAgICAgZi5ieXRlc1JlYWQrKztcbiAgICAgICAgICAgIGlmIChuID49IGxlZnQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPDw9IGxlZnQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0IHw9IChCSVRNQVNLW2xlZnRdICYgYnl0ZXNbYnl0ZSsrXSk7XG4gICAgICAgICAgICAgICAgYml0ID0gMDtcbiAgICAgICAgICAgICAgICBuIC09IGxlZnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA8PD0gbjtcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gKChieXRlc1tieXRlXSAmIChCSVRNQVNLW25dIDw8ICg4IC0gbiAtIGJpdCkpKSA+PiAoOCAtIG4gLSBiaXQpKTtcbiAgICAgICAgICAgICAgICBiaXQgKz0gbjtcbiAgICAgICAgICAgICAgICBuID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgZi5ieXRlc1JlYWQgPSAwO1xuICAgIHJldHVybiBmO1xufTtcbiIsIi8qIFxuICBiemlwMi5qcyAtIGEgc21hbGwgYnppcDIgZGVjb21wcmVzc2lvbiBpbXBsZW1lbnRhdGlvblxuICBcbiAgQ29weXJpZ2h0IDIwMTEgYnkgYW50aW1hdHRlcjE1IChhbnRpbWF0dGVyMTVAZ21haWwuY29tKVxuICBcbiAgQmFzZWQgb24gbWljcm8tYnVuemlwIGJ5IFJvYiBMYW5kbGV5IChyb2JAbGFuZGxleS5uZXQpLlxuXG4gIENvcHlyaWdodCAoYykgMjAxMSBieSBhbnRpbWF0dGVyMTUgKGFudGltYXR0ZXIxNUBnbWFpbC5jb20pLlxuXG4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4gIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSxcbiAgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSxcbiAgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlXG4gIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gIFxuICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgXG4gIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsXG4gIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEhcbiAgVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuKi9cbmZ1bmN0aW9uIEJ6aXAyRXJyb3IobWVzc2FnZSkge1xuICAgIHRoaXMubmFtZSA9ICdCemlwMkVycm9yJztcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xufVxuQnppcDJFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3I7XG4gXG52YXIgbWVzc2FnZSA9IHtcbiAgICBFcnJvcjogZnVuY3Rpb24obWVzc2FnZSkge3Rocm93IG5ldyBCemlwMkVycm9yKG1lc3NhZ2UpO31cbn07XG5cbnZhciBiemlwMiA9IHt9O1xuYnppcDIuQnppcDJFcnJvciA9IEJ6aXAyRXJyb3I7XG5cbmJ6aXAyLmNyY1RhYmxlID1cbltcbiAgIDB4MDAwMDAwMDAsIDB4MDRjMTFkYjcsIDB4MDk4MjNiNmUsIDB4MGQ0MzI2ZDksXG4gICAweDEzMDQ3NmRjLCAweDE3YzU2YjZiLCAweDFhODY0ZGIyLCAweDFlNDc1MDA1LFxuICAgMHgyNjA4ZWRiOCwgMHgyMmM5ZjAwZiwgMHgyZjhhZDZkNiwgMHgyYjRiY2I2MSxcbiAgIDB4MzUwYzliNjQsIDB4MzFjZDg2ZDMsIDB4M2M4ZWEwMGEsIDB4Mzg0ZmJkYmQsXG4gICAweDRjMTFkYjcwLCAweDQ4ZDBjNmM3LCAweDQ1OTNlMDFlLCAweDQxNTJmZGE5LFxuICAgMHg1ZjE1YWRhYywgMHg1YmQ0YjAxYiwgMHg1Njk3OTZjMiwgMHg1MjU2OGI3NSxcbiAgIDB4NmExOTM2YzgsIDB4NmVkODJiN2YsIDB4NjM5YjBkYTYsIDB4Njc1YTEwMTEsXG4gICAweDc5MWQ0MDE0LCAweDdkZGM1ZGEzLCAweDcwOWY3YjdhLCAweDc0NWU2NmNkLFxuICAgMHg5ODIzYjZlMCwgMHg5Y2UyYWI1NywgMHg5MWExOGQ4ZSwgMHg5NTYwOTAzOSxcbiAgIDB4OGIyN2MwM2MsIDB4OGZlNmRkOGIsIDB4ODJhNWZiNTIsIDB4ODY2NGU2ZTUsXG4gICAweGJlMmI1YjU4LCAweGJhZWE0NmVmLCAweGI3YTk2MDM2LCAweGIzNjg3ZDgxLFxuICAgMHhhZDJmMmQ4NCwgMHhhOWVlMzAzMywgMHhhNGFkMTZlYSwgMHhhMDZjMGI1ZCxcbiAgIDB4ZDQzMjZkOTAsIDB4ZDBmMzcwMjcsIDB4ZGRiMDU2ZmUsIDB4ZDk3MTRiNDksXG4gICAweGM3MzYxYjRjLCAweGMzZjcwNmZiLCAweGNlYjQyMDIyLCAweGNhNzUzZDk1LFxuICAgMHhmMjNhODAyOCwgMHhmNmZiOWQ5ZiwgMHhmYmI4YmI0NiwgMHhmZjc5YTZmMSxcbiAgIDB4ZTEzZWY2ZjQsIDB4ZTVmZmViNDMsIDB4ZThiY2NkOWEsIDB4ZWM3ZGQwMmQsXG4gICAweDM0ODY3MDc3LCAweDMwNDc2ZGMwLCAweDNkMDQ0YjE5LCAweDM5YzU1NmFlLFxuICAgMHgyNzgyMDZhYiwgMHgyMzQzMWIxYywgMHgyZTAwM2RjNSwgMHgyYWMxMjA3MixcbiAgIDB4MTI4ZTlkY2YsIDB4MTY0ZjgwNzgsIDB4MWIwY2E2YTEsIDB4MWZjZGJiMTYsXG4gICAweDAxOGFlYjEzLCAweDA1NGJmNmE0LCAweDA4MDhkMDdkLCAweDBjYzljZGNhLFxuICAgMHg3ODk3YWIwNywgMHg3YzU2YjZiMCwgMHg3MTE1OTA2OSwgMHg3NWQ0OGRkZSxcbiAgIDB4NmI5M2RkZGIsIDB4NmY1MmMwNmMsIDB4NjIxMWU2YjUsIDB4NjZkMGZiMDIsXG4gICAweDVlOWY0NmJmLCAweDVhNWU1YjA4LCAweDU3MWQ3ZGQxLCAweDUzZGM2MDY2LFxuICAgMHg0ZDliMzA2MywgMHg0OTVhMmRkNCwgMHg0NDE5MGIwZCwgMHg0MGQ4MTZiYSxcbiAgIDB4YWNhNWM2OTcsIDB4YTg2NGRiMjAsIDB4YTUyN2ZkZjksIDB4YTFlNmUwNGUsXG4gICAweGJmYTFiMDRiLCAweGJiNjBhZGZjLCAweGI2MjM4YjI1LCAweGIyZTI5NjkyLFxuICAgMHg4YWFkMmIyZiwgMHg4ZTZjMzY5OCwgMHg4MzJmMTA0MSwgMHg4N2VlMGRmNixcbiAgIDB4OTlhOTVkZjMsIDB4OWQ2ODQwNDQsIDB4OTAyYjY2OWQsIDB4OTRlYTdiMmEsXG4gICAweGUwYjQxZGU3LCAweGU0NzUwMDUwLCAweGU5MzYyNjg5LCAweGVkZjczYjNlLFxuICAgMHhmM2IwNmIzYiwgMHhmNzcxNzY4YywgMHhmYTMyNTA1NSwgMHhmZWYzNGRlMixcbiAgIDB4YzZiY2YwNWYsIDB4YzI3ZGVkZTgsIDB4Y2YzZWNiMzEsIDB4Y2JmZmQ2ODYsXG4gICAweGQ1Yjg4NjgzLCAweGQxNzk5YjM0LCAweGRjM2FiZGVkLCAweGQ4ZmJhMDVhLFxuICAgMHg2OTBjZTBlZSwgMHg2ZGNkZmQ1OSwgMHg2MDhlZGI4MCwgMHg2NDRmYzYzNyxcbiAgIDB4N2EwODk2MzIsIDB4N2VjOThiODUsIDB4NzM4YWFkNWMsIDB4Nzc0YmIwZWIsXG4gICAweDRmMDQwZDU2LCAweDRiYzUxMGUxLCAweDQ2ODYzNjM4LCAweDQyNDcyYjhmLFxuICAgMHg1YzAwN2I4YSwgMHg1OGMxNjYzZCwgMHg1NTgyNDBlNCwgMHg1MTQzNWQ1MyxcbiAgIDB4MjUxZDNiOWUsIDB4MjFkYzI2MjksIDB4MmM5ZjAwZjAsIDB4Mjg1ZTFkNDcsXG4gICAweDM2MTk0ZDQyLCAweDMyZDg1MGY1LCAweDNmOWI3NjJjLCAweDNiNWE2YjliLFxuICAgMHgwMzE1ZDYyNiwgMHgwN2Q0Y2I5MSwgMHgwYTk3ZWQ0OCwgMHgwZTU2ZjBmZixcbiAgIDB4MTAxMWEwZmEsIDB4MTRkMGJkNGQsIDB4MTk5MzliOTQsIDB4MWQ1Mjg2MjMsXG4gICAweGYxMmY1NjBlLCAweGY1ZWU0YmI5LCAweGY4YWQ2ZDYwLCAweGZjNmM3MGQ3LFxuICAgMHhlMjJiMjBkMiwgMHhlNmVhM2Q2NSwgMHhlYmE5MWJiYywgMHhlZjY4MDYwYixcbiAgIDB4ZDcyN2JiYjYsIDB4ZDNlNmE2MDEsIDB4ZGVhNTgwZDgsIDB4ZGE2NDlkNmYsXG4gICAweGM0MjNjZDZhLCAweGMwZTJkMGRkLCAweGNkYTFmNjA0LCAweGM5NjBlYmIzLFxuICAgMHhiZDNlOGQ3ZSwgMHhiOWZmOTBjOSwgMHhiNGJjYjYxMCwgMHhiMDdkYWJhNyxcbiAgIDB4YWUzYWZiYTIsIDB4YWFmYmU2MTUsIDB4YTdiOGMwY2MsIDB4YTM3OWRkN2IsXG4gICAweDliMzY2MGM2LCAweDlmZjc3ZDcxLCAweDkyYjQ1YmE4LCAweDk2NzU0NjFmLFxuICAgMHg4ODMyMTYxYSwgMHg4Y2YzMGJhZCwgMHg4MWIwMmQ3NCwgMHg4NTcxMzBjMyxcbiAgIDB4NWQ4YTkwOTksIDB4NTk0YjhkMmUsIDB4NTQwOGFiZjcsIDB4NTBjOWI2NDAsXG4gICAweDRlOGVlNjQ1LCAweDRhNGZmYmYyLCAweDQ3MGNkZDJiLCAweDQzY2RjMDljLFxuICAgMHg3YjgyN2QyMSwgMHg3ZjQzNjA5NiwgMHg3MjAwNDY0ZiwgMHg3NmMxNWJmOCxcbiAgIDB4Njg4NjBiZmQsIDB4NmM0NzE2NGEsIDB4NjEwNDMwOTMsIDB4NjVjNTJkMjQsXG4gICAweDExOWI0YmU5LCAweDE1NWE1NjVlLCAweDE4MTk3MDg3LCAweDFjZDg2ZDMwLFxuICAgMHgwMjlmM2QzNSwgMHgwNjVlMjA4MiwgMHgwYjFkMDY1YiwgMHgwZmRjMWJlYyxcbiAgIDB4Mzc5M2E2NTEsIDB4MzM1MmJiZTYsIDB4M2UxMTlkM2YsIDB4M2FkMDgwODgsXG4gICAweDI0OTdkMDhkLCAweDIwNTZjZDNhLCAweDJkMTVlYmUzLCAweDI5ZDRmNjU0LFxuICAgMHhjNWE5MjY3OSwgMHhjMTY4M2JjZSwgMHhjYzJiMWQxNywgMHhjOGVhMDBhMCxcbiAgIDB4ZDZhZDUwYTUsIDB4ZDI2YzRkMTIsIDB4ZGYyZjZiY2IsIDB4ZGJlZTc2N2MsXG4gICAweGUzYTFjYmMxLCAweGU3NjBkNjc2LCAweGVhMjNmMGFmLCAweGVlZTJlZDE4LFxuICAgMHhmMGE1YmQxZCwgMHhmNDY0YTBhYSwgMHhmOTI3ODY3MywgMHhmZGU2OWJjNCxcbiAgIDB4ODliOGZkMDksIDB4OGQ3OWUwYmUsIDB4ODAzYWM2NjcsIDB4ODRmYmRiZDAsXG4gICAweDlhYmM4YmQ1LCAweDllN2Q5NjYyLCAweDkzM2ViMGJiLCAweDk3ZmZhZDBjLFxuICAgMHhhZmIwMTBiMSwgMHhhYjcxMGQwNiwgMHhhNjMyMmJkZiwgMHhhMmYzMzY2OCxcbiAgIDB4YmNiNDY2NmQsIDB4Yjg3NTdiZGEsIDB4YjUzNjVkMDMsIDB4YjFmNzQwYjRcbl07XG5cbmJ6aXAyLmFycmF5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICB2YXIgYml0ID0gMCwgYnl0ZSA9IDA7XG4gICAgdmFyIEJJVE1BU0sgPSBbMCwgMHgwMSwgMHgwMywgMHgwNywgMHgwRiwgMHgxRiwgMHgzRiwgMHg3RiwgMHhGRiBdO1xuICAgIHJldHVybiBmdW5jdGlvbihuKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgICB3aGlsZShuID4gMCkge1xuICAgICAgICAgICAgdmFyIGxlZnQgPSA4IC0gYml0O1xuICAgICAgICAgICAgaWYgKG4gPj0gbGVmdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA8PD0gbGVmdDtcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gKEJJVE1BU0tbbGVmdF0gJiBieXRlc1tieXRlKytdKTtcbiAgICAgICAgICAgICAgICBiaXQgPSAwO1xuICAgICAgICAgICAgICAgIG4gLT0gbGVmdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0IDw8PSBuO1xuICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAoKGJ5dGVzW2J5dGVdICYgKEJJVE1BU0tbbl0gPDwgKDggLSBuIC0gYml0KSkpID4+ICg4IC0gbiAtIGJpdCkpO1xuICAgICAgICAgICAgICAgIGJpdCArPSBuO1xuICAgICAgICAgICAgICAgIG4gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG4gICAgXG5iemlwMi5zaW1wbGUgPSBmdW5jdGlvbihzcmNidWZmZXIsIHN0cmVhbSkge1xuICAgIHZhciBiaXRzID0gYnppcDIuYXJyYXkoc3JjYnVmZmVyKTtcbiAgICB2YXIgc2l6ZSA9IGJ6aXAyLmhlYWRlcihiaXRzKTtcbiAgICB2YXIgcmV0ID0gZmFsc2U7XG4gICAgdmFyIGJ1ZnNpemUgPSAxMDAwMDAgKiBzaXplO1xuICAgIHZhciBidWYgPSBuZXcgSW50MzJBcnJheShidWZzaXplKTtcbiAgICBcbiAgICBkbyB7XG4gICAgICAgIHJldCA9IGJ6aXAyLmRlY29tcHJlc3MoYml0cywgc3RyZWFtLCBidWYsIGJ1ZnNpemUpOyAgICAgICAgXG4gICAgfSB3aGlsZSghcmV0KTtcbn1cblxuYnppcDIuaGVhZGVyID0gZnVuY3Rpb24oYml0cykge1xuICAgIHRoaXMuYnl0ZUNvdW50ID0gbmV3IEludDMyQXJyYXkoMjU2KTtcbiAgICB0aGlzLnN5bVRvQnl0ZSA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG4gICAgdGhpcy5tdGZTeW1ib2wgPSBuZXcgSW50MzJBcnJheSgyNTYpO1xuICAgIHRoaXMuc2VsZWN0b3JzID0gbmV3IFVpbnQ4QXJyYXkoMHg4MDAwKTtcblxuICAgIGlmIChiaXRzKDgqMykgIT0gNDM0ODUyMCkgbWVzc2FnZS5FcnJvcihcIk5vIG1hZ2ljIG51bWJlciBmb3VuZFwiKTtcblxuICAgIHZhciBpID0gYml0cyg4KSAtIDQ4O1xuICAgIGlmIChpIDwgMSB8fCBpID4gOSkgbWVzc2FnZS5FcnJvcihcIk5vdCBhIEJaSVAgYXJjaGl2ZVwiKTtcbiAgICByZXR1cm4gaTtcbn07XG5cblxuLy90YWtlcyBhIGZ1bmN0aW9uIGZvciByZWFkaW5nIHRoZSBibG9jayBkYXRhIChzdGFydGluZyB3aXRoIDB4MzE0MTU5MjY1MzU5KVxuLy9hIGJsb2NrIHNpemUgKDAtOSkgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byA5KVxuLy9hIGxlbmd0aCBhdCB3aGljaCB0byBzdG9wIGRlY29tcHJlc3NpbmcgYW5kIHJldHVybiB0aGUgb3V0cHV0XG5iemlwMi5kZWNvbXByZXNzID0gZnVuY3Rpb24oYml0cywgc3RyZWFtLCBidWYsIGJ1ZnNpemUsIHN0cmVhbUNSQykge1xuICAgIHZhciBNQVhfSFVGQ09ERV9CSVRTID0gMjA7XG4gICAgdmFyIE1BWF9TWU1CT0xTID0gMjU4O1xuICAgIHZhciBTWU1CT0xfUlVOQSA9IDA7XG4gICAgdmFyIFNZTUJPTF9SVU5CID0gMTtcbiAgICB2YXIgR1JPVVBfU0laRSA9IDUwO1xuICAgIHZhciBjcmMgPSAwIF4gKC0xKTtcbiAgICBcbiAgICBmb3IodmFyIGggPSAnJywgaSA9IDA7IGkgPCA2OyBpKyspIGggKz0gYml0cyg4KS50b1N0cmluZygxNik7XG4gICAgaWYgKGggPT0gXCIxNzcyNDUzODUwOTBcIikge1xuICAgICAgdmFyIGZpbmFsQ1JDID0gYml0cygzMil8MDtcbiAgICAgIGlmIChmaW5hbENSQyAhPT0gc3RyZWFtQ1JDKSBtZXNzYWdlLkVycm9yKFwiRXJyb3IgaW4gYnppcDI6IGNyYzMyIGRvIG5vdCBtYXRjaFwiKTtcbiAgICAgIC8vIGFsaWduIHN0cmVhbSB0byBieXRlXG4gICAgICBiaXRzKG51bGwpO1xuICAgICAgcmV0dXJuIG51bGw7IC8vIHJlc2V0IHN0cmVhbUNSQyBmb3IgbmV4dCBjYWxsXG4gICAgfVxuICAgIGlmIChoICE9IFwiMzE0MTU5MjY1MzU5XCIpIG1lc3NhZ2UuRXJyb3IoXCJlZWsgbm90IHZhbGlkIGJ6aXAgZGF0YVwiKTtcbiAgICB2YXIgY3JjYmxvY2sgPSBiaXRzKDMyKXwwOyAvLyBDUkMgY29kZVxuICAgIGlmIChiaXRzKDEpKSBtZXNzYWdlLkVycm9yKFwidW5zdXBwb3J0ZWQgb2Jzb2xldGUgdmVyc2lvblwiKTtcbiAgICB2YXIgb3JpZ1B0ciA9IGJpdHMoMjQpO1xuICAgIGlmIChvcmlnUHRyID4gYnVmc2l6ZSkgbWVzc2FnZS5FcnJvcihcIkluaXRpYWwgcG9zaXRpb24gbGFyZ2VyIHRoYW4gYnVmZmVyIHNpemVcIik7XG4gICAgdmFyIHQgPSBiaXRzKDE2KTtcbiAgICB2YXIgc3ltVG90YWwgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgIGlmICh0ICYgKDEgPDwgKDE1IC0gaSkpKSB7XG4gICAgICAgICAgICB2YXIgayA9IGJpdHMoMTYpO1xuICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgMTY7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChrICYgKDEgPDwgKDE1IC0gaikpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ltVG9CeXRlW3N5bVRvdGFsKytdID0gKDE2ICogaSkgKyBqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBncm91cENvdW50ID0gYml0cygzKTtcbiAgICBpZiAoZ3JvdXBDb3VudCA8IDIgfHwgZ3JvdXBDb3VudCA+IDYpIG1lc3NhZ2UuRXJyb3IoXCJhbm90aGVyIGVycm9yXCIpO1xuICAgIHZhciBuU2VsZWN0b3JzID0gYml0cygxNSk7XG4gICAgaWYgKG5TZWxlY3RvcnMgPT0gMCkgbWVzc2FnZS5FcnJvcihcIm1laFwiKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgZ3JvdXBDb3VudDsgaSsrKSB0aGlzLm10ZlN5bWJvbFtpXSA9IGk7XG5cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgblNlbGVjdG9yczsgaSsrKSB7XG4gICAgICAgIGZvcih2YXIgaiA9IDA7IGJpdHMoMSk7IGorKykgaWYgKGogPj0gZ3JvdXBDb3VudCkgbWVzc2FnZS5FcnJvcihcIndob29wcyBhbm90aGVyIGVycm9yXCIpO1xuICAgICAgICB2YXIgdWMgPSB0aGlzLm10ZlN5bWJvbFtqXTtcbiAgICAgICAgZm9yKHZhciBrID0gai0xOyBrPj0wOyBrLS0pIHtcbiAgICAgICAgICAgIHRoaXMubXRmU3ltYm9sW2srMV0gPSB0aGlzLm10ZlN5bWJvbFtrXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm10ZlN5bWJvbFswXSA9IHVjO1xuICAgICAgICB0aGlzLnNlbGVjdG9yc1tpXSA9IHVjO1xuICAgIH1cblxuICAgIHZhciBzeW1Db3VudCA9IHN5bVRvdGFsICsgMjtcbiAgICB2YXIgZ3JvdXBzID0gW107XG4gICAgdmFyIGxlbmd0aCA9IG5ldyBVaW50OEFycmF5KE1BWF9TWU1CT0xTKSxcbiAgICB0ZW1wID0gbmV3IFVpbnQxNkFycmF5KE1BWF9IVUZDT0RFX0JJVFMrMSk7XG5cbiAgICB2YXIgaHVmR3JvdXA7XG5cbiAgICBmb3IodmFyIGogPSAwOyBqIDwgZ3JvdXBDb3VudDsgaisrKSB7XG4gICAgICAgIHQgPSBiaXRzKDUpOyAvL2xlbmd0aHNcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHN5bUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHdoaWxlKHRydWUpe1xuICAgICAgICAgICAgICAgIGlmICh0IDwgMSB8fCB0ID4gTUFYX0hVRkNPREVfQklUUykgbWVzc2FnZS5FcnJvcihcIkkgZ2F2ZSB1cCBhIHdoaWxlIGFnbyBvbiB3cml0aW5nIGVycm9yIG1lc3NhZ2VzXCIpO1xuICAgICAgICAgICAgICAgIGlmICghYml0cygxKSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKCFiaXRzKDEpKSB0Kys7XG4gICAgICAgICAgICAgICAgZWxzZSB0LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZW5ndGhbaV0gPSB0O1xuICAgICAgICB9XG4gICAgICAgIHZhciAgbWluTGVuLCAgbWF4TGVuO1xuICAgICAgICBtaW5MZW4gPSBtYXhMZW4gPSBsZW5ndGhbMF07XG4gICAgICAgIGZvcih2YXIgaSA9IDE7IGkgPCBzeW1Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobGVuZ3RoW2ldID4gbWF4TGVuKSBtYXhMZW4gPSBsZW5ndGhbaV07XG4gICAgICAgICAgICBlbHNlIGlmIChsZW5ndGhbaV0gPCBtaW5MZW4pIG1pbkxlbiA9IGxlbmd0aFtpXTtcbiAgICAgICAgfVxuICAgICAgICBodWZHcm91cCA9IGdyb3Vwc1tqXSA9IHt9O1xuICAgICAgICBodWZHcm91cC5wZXJtdXRlID0gbmV3IEludDMyQXJyYXkoTUFYX1NZTUJPTFMpO1xuICAgICAgICBodWZHcm91cC5saW1pdCA9IG5ldyBJbnQzMkFycmF5KE1BWF9IVUZDT0RFX0JJVFMgKyAxKTtcbiAgICAgICAgaHVmR3JvdXAuYmFzZSA9IG5ldyBJbnQzMkFycmF5KE1BWF9IVUZDT0RFX0JJVFMgKyAxKTtcblxuICAgICAgICBodWZHcm91cC5taW5MZW4gPSBtaW5MZW47XG4gICAgICAgIGh1Zkdyb3VwLm1heExlbiA9IG1heExlbjtcbiAgICAgICAgdmFyIGJhc2UgPSBodWZHcm91cC5iYXNlO1xuICAgICAgICB2YXIgbGltaXQgPSBodWZHcm91cC5saW1pdDtcbiAgICAgICAgdmFyIHBwID0gMDtcbiAgICAgICAgZm9yKHZhciBpID0gbWluTGVuOyBpIDw9IG1heExlbjsgaSsrKVxuICAgICAgICBmb3IodmFyIHQgPSAwOyB0IDwgc3ltQ291bnQ7IHQrKylcbiAgICAgICAgaWYgKGxlbmd0aFt0XSA9PSBpKSBodWZHcm91cC5wZXJtdXRlW3BwKytdID0gdDtcbiAgICAgICAgZm9yKGkgPSBtaW5MZW47IGkgPD0gbWF4TGVuOyBpKyspIHRlbXBbaV0gPSBsaW1pdFtpXSA9IDA7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IHN5bUNvdW50OyBpKyspIHRlbXBbbGVuZ3RoW2ldXSsrO1xuICAgICAgICBwcCA9IHQgPSAwO1xuICAgICAgICBmb3IoaSA9IG1pbkxlbjsgaSA8IG1heExlbjsgaSsrKSB7XG4gICAgICAgICAgICBwcCArPSB0ZW1wW2ldO1xuICAgICAgICAgICAgbGltaXRbaV0gPSBwcCAtIDE7XG4gICAgICAgICAgICBwcCA8PD0gMTtcbiAgICAgICAgICAgIGJhc2VbaSsxXSA9IHBwIC0gKHQgKz0gdGVtcFtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbGltaXRbbWF4TGVuXSA9IHBwICsgdGVtcFttYXhMZW5dIC0gMTtcbiAgICAgICAgYmFzZVttaW5MZW5dID0gMDtcbiAgICB9XG5cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHsgXG4gICAgICAgIHRoaXMubXRmU3ltYm9sW2ldID0gaTtcbiAgICAgICAgdGhpcy5ieXRlQ291bnRbaV0gPSAwO1xuICAgIH1cbiAgICB2YXIgcnVuUG9zLCBjb3VudCwgc3ltQ291bnQsIHNlbGVjdG9yO1xuICAgIHJ1blBvcyA9IGNvdW50ID0gc3ltQ291bnQgPSBzZWxlY3RvciA9IDA7ICAgIFxuICAgIHdoaWxlKHRydWUpIHtcbiAgICAgICAgaWYgKCEoc3ltQ291bnQtLSkpIHtcbiAgICAgICAgICAgIHN5bUNvdW50ID0gR1JPVVBfU0laRSAtIDE7XG4gICAgICAgICAgICBpZiAoc2VsZWN0b3IgPj0gblNlbGVjdG9ycykgbWVzc2FnZS5FcnJvcihcIm1lb3cgaSdtIGEga2l0dHksIHRoYXQncyBhbiBlcnJvclwiKTtcbiAgICAgICAgICAgIGh1Zkdyb3VwID0gZ3JvdXBzW3RoaXMuc2VsZWN0b3JzW3NlbGVjdG9yKytdXTtcbiAgICAgICAgICAgIGJhc2UgPSBodWZHcm91cC5iYXNlO1xuICAgICAgICAgICAgbGltaXQgPSBodWZHcm91cC5saW1pdDtcbiAgICAgICAgfVxuICAgICAgICBpID0gaHVmR3JvdXAubWluTGVuO1xuICAgICAgICBqID0gYml0cyhpKTtcbiAgICAgICAgd2hpbGUodHJ1ZSkge1xuICAgICAgICAgICAgaWYgKGkgPiBodWZHcm91cC5tYXhMZW4pIG1lc3NhZ2UuRXJyb3IoXCJyYXdyIGknbSBhIGRpbm9zYXVyXCIpO1xuICAgICAgICAgICAgaWYgKGogPD0gbGltaXRbaV0pIGJyZWFrO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgaiA9IChqIDw8IDEpIHwgYml0cygxKTtcbiAgICAgICAgfVxuICAgICAgICBqIC09IGJhc2VbaV07XG4gICAgICAgIGlmIChqIDwgMCB8fCBqID49IE1BWF9TWU1CT0xTKSBtZXNzYWdlLkVycm9yKFwibW9vIGknbSBhIGNvd1wiKTtcbiAgICAgICAgdmFyIG5leHRTeW0gPSBodWZHcm91cC5wZXJtdXRlW2pdO1xuICAgICAgICBpZiAobmV4dFN5bSA9PSBTWU1CT0xfUlVOQSB8fCBuZXh0U3ltID09IFNZTUJPTF9SVU5CKSB7XG4gICAgICAgICAgICBpZiAoIXJ1blBvcyl7XG4gICAgICAgICAgICAgICAgcnVuUG9zID0gMTtcbiAgICAgICAgICAgICAgICB0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0U3ltID09IFNZTUJPTF9SVU5BKSB0ICs9IHJ1blBvcztcbiAgICAgICAgICAgIGVsc2UgdCArPSAyICogcnVuUG9zO1xuICAgICAgICAgICAgcnVuUG9zIDw8PSAxO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1blBvcykge1xuICAgICAgICAgICAgcnVuUG9zID0gMDtcbiAgICAgICAgICAgIGlmIChjb3VudCArIHQgPiBidWZzaXplKSBtZXNzYWdlLkVycm9yKFwiQm9vbS5cIik7XG4gICAgICAgICAgICB1YyA9IHRoaXMuc3ltVG9CeXRlW3RoaXMubXRmU3ltYm9sWzBdXTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZUNvdW50W3VjXSArPSB0O1xuICAgICAgICAgICAgd2hpbGUodC0tKSBidWZbY291bnQrK10gPSB1YztcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dFN5bSA+IHN5bVRvdGFsKSBicmVhaztcbiAgICAgICAgaWYgKGNvdW50ID49IGJ1ZnNpemUpIG1lc3NhZ2UuRXJyb3IoXCJJIGNhbid0IHRoaW5rIG9mIGFueXRoaW5nLiBFcnJvclwiKTtcbiAgICAgICAgaSA9IG5leHRTeW0gLSAxO1xuICAgICAgICB1YyA9IHRoaXMubXRmU3ltYm9sW2ldO1xuICAgICAgICBmb3IodmFyIGsgPSBpLTE7IGs+PTA7IGstLSkge1xuICAgICAgICAgICAgdGhpcy5tdGZTeW1ib2xbaysxXSA9IHRoaXMubXRmU3ltYm9sW2tdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubXRmU3ltYm9sWzBdID0gdWNcbiAgICAgICAgdWMgPSB0aGlzLnN5bVRvQnl0ZVt1Y107XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50W3VjXSsrO1xuICAgICAgICBidWZbY291bnQrK10gPSB1YztcbiAgICB9XG4gICAgaWYgKG9yaWdQdHIgPCAwIHx8IG9yaWdQdHIgPj0gY291bnQpIG1lc3NhZ2UuRXJyb3IoXCJJJ20gYSBtb25rZXkgYW5kIEknbSB0aHJvd2luZyBzb21ldGhpbmcgYXQgc29tZW9uZSwgbmFtZWx5IHlvdVwiKTtcbiAgICB2YXIgaiA9IDA7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICAgIGsgPSBqICsgdGhpcy5ieXRlQ291bnRbaV07XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50W2ldID0gajtcbiAgICAgICAgaiA9IGs7XG4gICAgfVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIHVjID0gYnVmW2ldICYgMHhmZjtcbiAgICAgICAgYnVmW3RoaXMuYnl0ZUNvdW50W3VjXV0gfD0gKGkgPDwgOCk7XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50W3VjXSsrO1xuICAgIH1cbiAgICB2YXIgcG9zID0gMCwgY3VycmVudCA9IDAsIHJ1biA9IDA7XG4gICAgaWYgKGNvdW50KSB7XG4gICAgICAgIHBvcyA9IGJ1ZltvcmlnUHRyXTtcbiAgICAgICAgY3VycmVudCA9IChwb3MgJiAweGZmKTtcbiAgICAgICAgcG9zID4+PSA4O1xuICAgICAgICBydW4gPSAtMTtcbiAgICB9XG4gICAgY291bnQgPSBjb3VudDtcbiAgICB2YXIgY29waWVzLCBwcmV2aW91cywgb3V0Ynl0ZTtcbiAgICB3aGlsZShjb3VudCkge1xuICAgICAgICBjb3VudC0tO1xuICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7XG4gICAgICAgIHBvcyA9IGJ1Zltwb3NdO1xuICAgICAgICBjdXJyZW50ID0gcG9zICYgMHhmZjtcbiAgICAgICAgcG9zID4+PSA4O1xuICAgICAgICBpZiAocnVuKysgPT0gMykge1xuICAgICAgICAgICAgY29waWVzID0gY3VycmVudDtcbiAgICAgICAgICAgIG91dGJ5dGUgPSBwcmV2aW91cztcbiAgICAgICAgICAgIGN1cnJlbnQgPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvcGllcyA9IDE7XG4gICAgICAgICAgICBvdXRieXRlID0gY3VycmVudDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZShjb3BpZXMtLSkge1xuICAgICAgICAgICAgY3JjID0gKChjcmMgPDwgOCkgXiB0aGlzLmNyY1RhYmxlWygoY3JjPj4yNCkgXiBvdXRieXRlKSAmIDB4RkZdKSYweEZGRkZGRkZGOyAvLyBjcmMzMlxuICAgICAgICAgICAgc3RyZWFtKG91dGJ5dGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50ICE9IHByZXZpb3VzKSBydW4gPSAwO1xuICAgIH1cblxuICAgIGNyYyA9IChjcmMgXiAoLTEpKSA+Pj4gMDtcbiAgICBpZiAoKGNyY3wwKSAhPSAoY3JjYmxvY2t8MCkpIG1lc3NhZ2UuRXJyb3IoXCJFcnJvciBpbiBiemlwMjogY3JjMzIgZG8gbm90IG1hdGNoXCIpO1xuICAgIHN0cmVhbUNSQyA9IChjcmMgXiAoKHN0cmVhbUNSQyA8PCAxKSB8IChzdHJlYW1DUkMgPj4+IDMxKSkpICYgMHhGRkZGRkZGRjtcbiAgICByZXR1cm4gc3RyZWFtQ1JDO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ6aXAyO1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuZnJvbUNhbGxiYWNrID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykgZm4uYXBwbHkodGhpcywgYXJncylcbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGFyZ3MucHVzaCgoZXJyLCByZXMpID0+IChlcnIgIT0gbnVsbCkgPyByZWplY3QoZXJyKSA6IHJlc29sdmUocmVzKSlcbiAgICAgICAgZm4uYXBwbHkodGhpcywgYXJncylcbiAgICAgIH0pXG4gICAgfVxuICB9LCAnbmFtZScsIHsgdmFsdWU6IGZuLm5hbWUgfSlcbn1cblxuZXhwb3J0cy5mcm9tUHJvbWlzZSA9IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgY29uc3QgY2IgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV1cbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncylcbiAgICBlbHNlIHtcbiAgICAgIGFyZ3MucG9wKClcbiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3MpLnRoZW4ociA9PiBjYihudWxsLCByKSwgY2IpXG4gICAgfVxuICB9LCAnbmFtZScsIHsgdmFsdWU6IGZuLm5hbWUgfSlcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBidWZmZXIgY29udGFpbnMgb25seSBjb3JyZWN0IFVURi04LlxuICogUG9ydGVkIGZyb20gaHR0cHM6Ly93d3cuY2wuY2FtLmFjLnVrLyU3RW1nazI1L3Vjcy91dGY4X2NoZWNrLmMgYnlcbiAqIE1hcmt1cyBLdWhuLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWYgVGhlIGJ1ZmZlciB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGBidWZgIGNvbnRhaW5zIG9ubHkgY29ycmVjdCBVVEYtOCwgZWxzZSBgZmFsc2VgXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRVVEY4KGJ1Zikge1xuICBjb25zdCBsZW4gPSBidWYubGVuZ3RoO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBpZiAoKGJ1ZltpXSAmIDB4ODApID09PSAweDAwKSB7ICAvLyAweHh4eHh4eFxuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZTApID09PSAweGMwKSB7ICAvLyAxMTB4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMSA9PT0gbGVuIHx8XG4gICAgICAgIChidWZbaSArIDFdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSAmIDB4ZmUpID09PSAweGMwICAvLyBvdmVybG9uZ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSArPSAyO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZjApID09PSAweGUwKSB7ICAvLyAxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMiA+PSBsZW4gfHxcbiAgICAgICAgKGJ1ZltpICsgMV0gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICAoYnVmW2kgKyAyXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIGJ1ZltpXSA9PT0gMHhlMCAmJiAoYnVmW2kgKyAxXSAmIDB4ZTApID09PSAweDgwIHx8ICAvLyBvdmVybG9uZ1xuICAgICAgICBidWZbaV0gPT09IDB4ZWQgJiYgKGJ1ZltpICsgMV0gJiAweGUwKSA9PT0gMHhhMCAgLy8gc3Vycm9nYXRlIChVK0Q4MDAgLSBVK0RGRkYpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpICs9IDM7XG4gICAgfSBlbHNlIGlmICgoYnVmW2ldICYgMHhmOCkgPT09IDB4ZjApIHsgIC8vIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4XG4gICAgICBpZiAoXG4gICAgICAgIGkgKyAzID49IGxlbiB8fFxuICAgICAgICAoYnVmW2kgKyAxXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaSArIDJdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpICsgM10gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICBidWZbaV0gPT09IDB4ZjAgJiYgKGJ1ZltpICsgMV0gJiAweGYwKSA9PT0gMHg4MCB8fCAgLy8gb3ZlcmxvbmdcbiAgICAgICAgYnVmW2ldID09PSAweGY0ICYmIGJ1ZltpICsgMV0gPiAweDhmIHx8IGJ1ZltpXSA+IDB4ZjQgIC8vID4gVSsxMEZGRkZcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGkgKz0gNDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVmFsaWRVVEY4O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG50cnkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ25vZGUtZ3lwLWJ1aWxkJykoX19kaXJuYW1lKTtcbn0gY2F0Y2ggKGUpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhbGxiYWNrJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBzdHJpbmdXaWR0aCA9IHJlcXVpcmUoJ3N0cmluZy13aWR0aCcpO1xuY29uc3Qgc3RyaXBBbnNpID0gcmVxdWlyZSgnc3RyaXAtYW5zaScpO1xuY29uc3QgYW5zaVN0eWxlcyA9IHJlcXVpcmUoJ2Fuc2ktc3R5bGVzJyk7XG5cbmNvbnN0IEVTQ0FQRVMgPSBuZXcgU2V0KFtcblx0J1xcdTAwMUInLFxuXHQnXFx1MDA5Qidcbl0pO1xuXG5jb25zdCBFTkRfQ09ERSA9IDM5O1xuXG5jb25zdCBBTlNJX0VTQ0FQRV9CRUxMID0gJ1xcdTAwMDcnO1xuY29uc3QgQU5TSV9DU0kgPSAnWyc7XG5jb25zdCBBTlNJX09TQyA9ICddJztcbmNvbnN0IEFOU0lfU0dSX1RFUk1JTkFUT1IgPSAnbSc7XG5jb25zdCBBTlNJX0VTQ0FQRV9MSU5LID0gYCR7QU5TSV9PU0N9ODs7YDtcblxuY29uc3Qgd3JhcEFuc2kgPSBjb2RlID0+IGAke0VTQ0FQRVMudmFsdWVzKCkubmV4dCgpLnZhbHVlfSR7QU5TSV9DU0l9JHtjb2RlfSR7QU5TSV9TR1JfVEVSTUlOQVRPUn1gO1xuY29uc3Qgd3JhcEFuc2lIeXBlcmxpbmsgPSB1cmkgPT4gYCR7RVNDQVBFUy52YWx1ZXMoKS5uZXh0KCkudmFsdWV9JHtBTlNJX0VTQ0FQRV9MSU5LfSR7dXJpfSR7QU5TSV9FU0NBUEVfQkVMTH1gO1xuXG4vLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB3b3JkcyBzcGxpdCBvbiAnICcsIGlnbm9yaW5nXG4vLyB0aGUgZXh0cmEgY2hhcmFjdGVycyBhZGRlZCBieSBhbnNpIGVzY2FwZSBjb2Rlc1xuY29uc3Qgd29yZExlbmd0aHMgPSBzdHJpbmcgPT4gc3RyaW5nLnNwbGl0KCcgJykubWFwKGNoYXJhY3RlciA9PiBzdHJpbmdXaWR0aChjaGFyYWN0ZXIpKTtcblxuLy8gV3JhcCBhIGxvbmcgd29yZCBhY3Jvc3MgbXVsdGlwbGUgcm93c1xuLy8gQW5zaSBlc2NhcGUgY29kZXMgZG8gbm90IGNvdW50IHRvd2FyZHMgbGVuZ3RoXG5jb25zdCB3cmFwV29yZCA9IChyb3dzLCB3b3JkLCBjb2x1bW5zKSA9PiB7XG5cdGNvbnN0IGNoYXJhY3RlcnMgPSBbLi4ud29yZF07XG5cblx0bGV0IGlzSW5zaWRlRXNjYXBlID0gZmFsc2U7XG5cdGxldCBpc0luc2lkZUxpbmtFc2NhcGUgPSBmYWxzZTtcblx0bGV0IHZpc2libGUgPSBzdHJpbmdXaWR0aChzdHJpcEFuc2kocm93c1tyb3dzLmxlbmd0aCAtIDFdKSk7XG5cblx0Zm9yIChjb25zdCBbaW5kZXgsIGNoYXJhY3Rlcl0gb2YgY2hhcmFjdGVycy5lbnRyaWVzKCkpIHtcblx0XHRjb25zdCBjaGFyYWN0ZXJMZW5ndGggPSBzdHJpbmdXaWR0aChjaGFyYWN0ZXIpO1xuXG5cdFx0aWYgKHZpc2libGUgKyBjaGFyYWN0ZXJMZW5ndGggPD0gY29sdW1ucykge1xuXHRcdFx0cm93c1tyb3dzLmxlbmd0aCAtIDFdICs9IGNoYXJhY3Rlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cm93cy5wdXNoKGNoYXJhY3Rlcik7XG5cdFx0XHR2aXNpYmxlID0gMDtcblx0XHR9XG5cblx0XHRpZiAoRVNDQVBFUy5oYXMoY2hhcmFjdGVyKSkge1xuXHRcdFx0aXNJbnNpZGVFc2NhcGUgPSB0cnVlO1xuXHRcdFx0aXNJbnNpZGVMaW5rRXNjYXBlID0gY2hhcmFjdGVycy5zbGljZShpbmRleCArIDEpLmpvaW4oJycpLnN0YXJ0c1dpdGgoQU5TSV9FU0NBUEVfTElOSyk7XG5cdFx0fVxuXG5cdFx0aWYgKGlzSW5zaWRlRXNjYXBlKSB7XG5cdFx0XHRpZiAoaXNJbnNpZGVMaW5rRXNjYXBlKSB7XG5cdFx0XHRcdGlmIChjaGFyYWN0ZXIgPT09IEFOU0lfRVNDQVBFX0JFTEwpIHtcblx0XHRcdFx0XHRpc0luc2lkZUVzY2FwZSA9IGZhbHNlO1xuXHRcdFx0XHRcdGlzSW5zaWRlTGlua0VzY2FwZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQU5TSV9TR1JfVEVSTUlOQVRPUikge1xuXHRcdFx0XHRpc0luc2lkZUVzY2FwZSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHR2aXNpYmxlICs9IGNoYXJhY3Rlckxlbmd0aDtcblxuXHRcdGlmICh2aXNpYmxlID09PSBjb2x1bW5zICYmIGluZGV4IDwgY2hhcmFjdGVycy5sZW5ndGggLSAxKSB7XG5cdFx0XHRyb3dzLnB1c2goJycpO1xuXHRcdFx0dmlzaWJsZSA9IDA7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBsYXN0IHJvdyB3ZSBjb3B5IG92ZXIgaXMgb25seVxuXHQvLyBhbnNpIGVzY2FwZSBjaGFyYWN0ZXJzLCBoYW5kbGUgdGhpcyBlZGdlLWNhc2Vcblx0aWYgKCF2aXNpYmxlICYmIHJvd3Nbcm93cy5sZW5ndGggLSAxXS5sZW5ndGggPiAwICYmIHJvd3MubGVuZ3RoID4gMSkge1xuXHRcdHJvd3Nbcm93cy5sZW5ndGggLSAyXSArPSByb3dzLnBvcCgpO1xuXHR9XG59O1xuXG4vLyBUcmltcyBzcGFjZXMgZnJvbSBhIHN0cmluZyBpZ25vcmluZyBpbnZpc2libGUgc2VxdWVuY2VzXG5jb25zdCBzdHJpbmdWaXNpYmxlVHJpbVNwYWNlc1JpZ2h0ID0gc3RyaW5nID0+IHtcblx0Y29uc3Qgd29yZHMgPSBzdHJpbmcuc3BsaXQoJyAnKTtcblx0bGV0IGxhc3QgPSB3b3Jkcy5sZW5ndGg7XG5cblx0d2hpbGUgKGxhc3QgPiAwKSB7XG5cdFx0aWYgKHN0cmluZ1dpZHRoKHdvcmRzW2xhc3QgLSAxXSkgPiAwKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRsYXN0LS07XG5cdH1cblxuXHRpZiAobGFzdCA9PT0gd29yZHMubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdHJldHVybiB3b3Jkcy5zbGljZSgwLCBsYXN0KS5qb2luKCcgJykgKyB3b3Jkcy5zbGljZShsYXN0KS5qb2luKCcnKTtcbn07XG5cbi8vIFRoZSB3cmFwLWFuc2kgbW9kdWxlIGNhbiBiZSBpbnZva2VkIGluIGVpdGhlciAnaGFyZCcgb3IgJ3NvZnQnIHdyYXAgbW9kZVxuLy9cbi8vICdoYXJkJyB3aWxsIG5ldmVyIGFsbG93IGEgc3RyaW5nIHRvIHRha2UgdXAgbW9yZSB0aGFuIGNvbHVtbnMgY2hhcmFjdGVyc1xuLy9cbi8vICdzb2Z0JyBhbGxvd3MgbG9uZyB3b3JkcyB0byBleHBhbmQgcGFzdCB0aGUgY29sdW1uIGxlbmd0aFxuY29uc3QgZXhlYyA9IChzdHJpbmcsIGNvbHVtbnMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuXHRpZiAob3B0aW9ucy50cmltICE9PSBmYWxzZSAmJiBzdHJpbmcudHJpbSgpID09PSAnJykge1xuXHRcdHJldHVybiAnJztcblx0fVxuXG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRsZXQgZXNjYXBlQ29kZTtcblx0bGV0IGVzY2FwZVVybDtcblxuXHRjb25zdCBsZW5ndGhzID0gd29yZExlbmd0aHMoc3RyaW5nKTtcblx0bGV0IHJvd3MgPSBbJyddO1xuXG5cdGZvciAoY29uc3QgW2luZGV4LCB3b3JkXSBvZiBzdHJpbmcuc3BsaXQoJyAnKS5lbnRyaWVzKCkpIHtcblx0XHRpZiAob3B0aW9ucy50cmltICE9PSBmYWxzZSkge1xuXHRcdFx0cm93c1tyb3dzLmxlbmd0aCAtIDFdID0gcm93c1tyb3dzLmxlbmd0aCAtIDFdLnRyaW1TdGFydCgpO1xuXHRcdH1cblxuXHRcdGxldCByb3dMZW5ndGggPSBzdHJpbmdXaWR0aChyb3dzW3Jvd3MubGVuZ3RoIC0gMV0pO1xuXG5cdFx0aWYgKGluZGV4ICE9PSAwKSB7XG5cdFx0XHRpZiAocm93TGVuZ3RoID49IGNvbHVtbnMgJiYgKG9wdGlvbnMud29yZFdyYXAgPT09IGZhbHNlIHx8IG9wdGlvbnMudHJpbSA9PT0gZmFsc2UpKSB7XG5cdFx0XHRcdC8vIElmIHdlIHN0YXJ0IHdpdGggYSBuZXcgd29yZCBidXQgdGhlIGN1cnJlbnQgcm93IGxlbmd0aCBlcXVhbHMgdGhlIGxlbmd0aCBvZiB0aGUgY29sdW1ucywgYWRkIGEgbmV3IHJvd1xuXHRcdFx0XHRyb3dzLnB1c2goJycpO1xuXHRcdFx0XHRyb3dMZW5ndGggPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm93TGVuZ3RoID4gMCB8fCBvcHRpb25zLnRyaW0gPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJvd3Nbcm93cy5sZW5ndGggLSAxXSArPSAnICc7XG5cdFx0XHRcdHJvd0xlbmd0aCsrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEluICdoYXJkJyB3cmFwIG1vZGUsIHRoZSBsZW5ndGggb2YgYSBsaW5lIGlzIG5ldmVyIGFsbG93ZWQgdG8gZXh0ZW5kIHBhc3QgJ2NvbHVtbnMnXG5cdFx0aWYgKG9wdGlvbnMuaGFyZCAmJiBsZW5ndGhzW2luZGV4XSA+IGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IHJlbWFpbmluZ0NvbHVtbnMgPSAoY29sdW1ucyAtIHJvd0xlbmd0aCk7XG5cdFx0XHRjb25zdCBicmVha3NTdGFydGluZ1RoaXNMaW5lID0gMSArIE1hdGguZmxvb3IoKGxlbmd0aHNbaW5kZXhdIC0gcmVtYWluaW5nQ29sdW1ucyAtIDEpIC8gY29sdW1ucyk7XG5cdFx0XHRjb25zdCBicmVha3NTdGFydGluZ05leHRMaW5lID0gTWF0aC5mbG9vcigobGVuZ3Roc1tpbmRleF0gLSAxKSAvIGNvbHVtbnMpO1xuXHRcdFx0aWYgKGJyZWFrc1N0YXJ0aW5nTmV4dExpbmUgPCBicmVha3NTdGFydGluZ1RoaXNMaW5lKSB7XG5cdFx0XHRcdHJvd3MucHVzaCgnJyk7XG5cdFx0XHR9XG5cblx0XHRcdHdyYXBXb3JkKHJvd3MsIHdvcmQsIGNvbHVtbnMpO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0aWYgKHJvd0xlbmd0aCArIGxlbmd0aHNbaW5kZXhdID4gY29sdW1ucyAmJiByb3dMZW5ndGggPiAwICYmIGxlbmd0aHNbaW5kZXhdID4gMCkge1xuXHRcdFx0aWYgKG9wdGlvbnMud29yZFdyYXAgPT09IGZhbHNlICYmIHJvd0xlbmd0aCA8IGNvbHVtbnMpIHtcblx0XHRcdFx0d3JhcFdvcmQocm93cywgd29yZCwgY29sdW1ucyk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyb3dzLnB1c2goJycpO1xuXHRcdH1cblxuXHRcdGlmIChyb3dMZW5ndGggKyBsZW5ndGhzW2luZGV4XSA+IGNvbHVtbnMgJiYgb3B0aW9ucy53b3JkV3JhcCA9PT0gZmFsc2UpIHtcblx0XHRcdHdyYXBXb3JkKHJvd3MsIHdvcmQsIGNvbHVtbnMpO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0cm93c1tyb3dzLmxlbmd0aCAtIDFdICs9IHdvcmQ7XG5cdH1cblxuXHRpZiAob3B0aW9ucy50cmltICE9PSBmYWxzZSkge1xuXHRcdHJvd3MgPSByb3dzLm1hcChzdHJpbmdWaXNpYmxlVHJpbVNwYWNlc1JpZ2h0KTtcblx0fVxuXG5cdGNvbnN0IHByZSA9IFsuLi5yb3dzLmpvaW4oJ1xcbicpXTtcblxuXHRmb3IgKGNvbnN0IFtpbmRleCwgY2hhcmFjdGVyXSBvZiBwcmUuZW50cmllcygpKSB7XG5cdFx0cmV0dXJuVmFsdWUgKz0gY2hhcmFjdGVyO1xuXG5cdFx0aWYgKEVTQ0FQRVMuaGFzKGNoYXJhY3RlcikpIHtcblx0XHRcdGNvbnN0IHtncm91cHN9ID0gbmV3IFJlZ0V4cChgKD86XFxcXCR7QU5TSV9DU0l9KD88Y29kZT5cXFxcZCspbXxcXFxcJHtBTlNJX0VTQ0FQRV9MSU5LfSg/PHVyaT4uKikke0FOU0lfRVNDQVBFX0JFTEx9KWApLmV4ZWMocHJlLnNsaWNlKGluZGV4KS5qb2luKCcnKSkgfHwge2dyb3Vwczoge319O1xuXHRcdFx0aWYgKGdyb3Vwcy5jb2RlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc3QgY29kZSA9IE51bWJlci5wYXJzZUZsb2F0KGdyb3Vwcy5jb2RlKTtcblx0XHRcdFx0ZXNjYXBlQ29kZSA9IGNvZGUgPT09IEVORF9DT0RFID8gdW5kZWZpbmVkIDogY29kZTtcblx0XHRcdH0gZWxzZSBpZiAoZ3JvdXBzLnVyaSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGVzY2FwZVVybCA9IGdyb3Vwcy51cmkubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogZ3JvdXBzLnVyaTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjb2RlID0gYW5zaVN0eWxlcy5jb2Rlcy5nZXQoTnVtYmVyKGVzY2FwZUNvZGUpKTtcblxuXHRcdGlmIChwcmVbaW5kZXggKyAxXSA9PT0gJ1xcbicpIHtcblx0XHRcdGlmIChlc2NhcGVVcmwpIHtcblx0XHRcdFx0cmV0dXJuVmFsdWUgKz0gd3JhcEFuc2lIeXBlcmxpbmsoJycpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZXNjYXBlQ29kZSAmJiBjb2RlKSB7XG5cdFx0XHRcdHJldHVyblZhbHVlICs9IHdyYXBBbnNpKGNvZGUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnXFxuJykge1xuXHRcdFx0aWYgKGVzY2FwZUNvZGUgJiYgY29kZSkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSArPSB3cmFwQW5zaShlc2NhcGVDb2RlKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGVzY2FwZVVybCkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSArPSB3cmFwQW5zaUh5cGVybGluayhlc2NhcGVVcmwpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn07XG5cbi8vIEZvciBlYWNoIG5ld2xpbmUsIGludm9rZSB0aGUgbWV0aG9kIHNlcGFyYXRlbHlcbm1vZHVsZS5leHBvcnRzID0gKHN0cmluZywgY29sdW1ucywgb3B0aW9ucykgPT4ge1xuXHRyZXR1cm4gU3RyaW5nKHN0cmluZylcblx0XHQubm9ybWFsaXplKClcblx0XHQucmVwbGFjZSgvXFxyXFxuL2csICdcXG4nKVxuXHRcdC5zcGxpdCgnXFxuJylcblx0XHQubWFwKGxpbmUgPT4gZXhlYyhsaW5lLCBjb2x1bW5zLCBvcHRpb25zKSlcblx0XHQuam9pbignXFxuJyk7XG59O1xuIiwiLy8gUmV0dXJucyBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgd3JhcHBlZCBjYWxsYmFja1xuLy8gVGhlIHdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGRvIHNvbWUgc3R1ZmYsIGFuZCByZXR1cm4gYVxuLy8gcHJlc3VtYWJseSBkaWZmZXJlbnQgY2FsbGJhY2sgZnVuY3Rpb24uXG4vLyBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvd24gcHJvcGVydGllcyBhcmUgcmV0YWluZWQsIHNvIHRoYXRcbi8vIGRlY29yYXRpb25zIGFuZCBzdWNoIGFyZSBub3QgbG9zdCBhbG9uZyB0aGUgd2F5LlxubW9kdWxlLmV4cG9ydHMgPSB3cmFwcHlcbmZ1bmN0aW9uIHdyYXBweSAoZm4sIGNiKSB7XG4gIGlmIChmbiAmJiBjYikgcmV0dXJuIHdyYXBweShmbikoY2IpXG5cbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCduZWVkIHdyYXBwZXIgZnVuY3Rpb24nKVxuXG4gIE9iamVjdC5rZXlzKGZuKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgd3JhcHBlcltrXSA9IGZuW2tdXG4gIH0pXG5cbiAgcmV0dXJuIHdyYXBwZXJcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuICAgIHZhciByZXQgPSBmbi5hcHBseSh0aGlzLCBhcmdzKVxuICAgIHZhciBjYiA9IGFyZ3NbYXJncy5sZW5ndGgtMV1cbiAgICBpZiAodHlwZW9mIHJldCA9PT0gJ2Z1bmN0aW9uJyAmJiByZXQgIT09IGNiKSB7XG4gICAgICBPYmplY3Qua2V5cyhjYikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXRba10gPSBjYltrXVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgRU1QVFlfQlVGRkVSIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG5jb25zdCBGYXN0QnVmZmVyID0gQnVmZmVyW1N5bWJvbC5zcGVjaWVzXTtcblxuLyoqXG4gKiBNZXJnZXMgYW4gYXJyYXkgb2YgYnVmZmVycyBpbnRvIGEgbmV3IGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcltdfSBsaXN0IFRoZSBhcnJheSBvZiBidWZmZXJzIHRvIGNvbmNhdFxuICogQHBhcmFtIHtOdW1iZXJ9IHRvdGFsTGVuZ3RoIFRoZSB0b3RhbCBsZW5ndGggb2YgYnVmZmVycyBpbiB0aGUgbGlzdFxuICogQHJldHVybiB7QnVmZmVyfSBUaGUgcmVzdWx0aW5nIGJ1ZmZlclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBjb25jYXQobGlzdCwgdG90YWxMZW5ndGgpIHtcbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSByZXR1cm4gRU1QVFlfQlVGRkVSO1xuICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHJldHVybiBsaXN0WzBdO1xuXG4gIGNvbnN0IHRhcmdldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSh0b3RhbExlbmd0aCk7XG4gIGxldCBvZmZzZXQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGJ1ZiA9IGxpc3RbaV07XG4gICAgdGFyZ2V0LnNldChidWYsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGJ1Zi5sZW5ndGg7XG4gIH1cblxuICBpZiAob2Zmc2V0IDwgdG90YWxMZW5ndGgpIHtcbiAgICByZXR1cm4gbmV3IEZhc3RCdWZmZXIodGFyZ2V0LmJ1ZmZlciwgdGFyZ2V0LmJ5dGVPZmZzZXQsIG9mZnNldCk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIE1hc2tzIGEgYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBtYXNrLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBzb3VyY2UgVGhlIGJ1ZmZlciB0byBtYXNrXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayBUaGUgbWFzayB0byB1c2VcbiAqIEBwYXJhbSB7QnVmZmVyfSBvdXRwdXQgVGhlIGJ1ZmZlciB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdG8gc3RhcnQgd3JpdGluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIG1hc2suXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIF9tYXNrKHNvdXJjZSwgbWFzaywgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0W29mZnNldCArIGldID0gc291cmNlW2ldIF4gbWFza1tpICYgM107XG4gIH1cbn1cblxuLyoqXG4gKiBVbm1hc2tzIGEgYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBtYXNrLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byB1bm1hc2tcbiAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIFRoZSBtYXNrIHRvIHVzZVxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBfdW5tYXNrKGJ1ZmZlciwgbWFzaykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgIGJ1ZmZlcltpXSBePSBtYXNrW2kgJiAzXTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgYnVmZmVyIHRvIGFuIGBBcnJheUJ1ZmZlcmAuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZiBUaGUgYnVmZmVyIHRvIGNvbnZlcnRcbiAqIEByZXR1cm4ge0FycmF5QnVmZmVyfSBDb252ZXJ0ZWQgYnVmZmVyXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXlCdWZmZXIoYnVmKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBidWYuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICByZXR1cm4gYnVmLmJ1ZmZlcjtcbiAgfVxuXG4gIHJldHVybiBidWYuYnVmZmVyLnNsaWNlKGJ1Zi5ieXRlT2Zmc2V0LCBidWYuYnl0ZU9mZnNldCArIGJ1Zi5sZW5ndGgpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGBkYXRhYCB0byBhIGBCdWZmZXJgLlxuICpcbiAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgZGF0YSB0byBjb252ZXJ0XG4gKiBAcmV0dXJuIHtCdWZmZXJ9IFRoZSBidWZmZXJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn1cbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gdG9CdWZmZXIoZGF0YSkge1xuICB0b0J1ZmZlci5yZWFkT25seSA9IHRydWU7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkgcmV0dXJuIGRhdGE7XG5cbiAgbGV0IGJ1ZjtcblxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgYnVmID0gbmV3IEZhc3RCdWZmZXIoZGF0YSk7XG4gIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpKSB7XG4gICAgYnVmID0gbmV3IEZhc3RCdWZmZXIoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBCdWZmZXIuZnJvbShkYXRhKTtcbiAgICB0b0J1ZmZlci5yZWFkT25seSA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbmNhdCxcbiAgbWFzazogX21hc2ssXG4gIHRvQXJyYXlCdWZmZXIsXG4gIHRvQnVmZmVyLFxuICB1bm1hc2s6IF91bm1hc2tcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICAqL1xuaWYgKCFwcm9jZXNzLmVudi5XU19OT19CVUZGRVJfVVRJTCkge1xuICB0cnkge1xuICAgIGNvbnN0IGJ1ZmZlclV0aWwgPSByZXF1aXJlKCdidWZmZXJ1dGlsJyk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cy5tYXNrID0gZnVuY3Rpb24gKHNvdXJjZSwgbWFzaywgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCkge1xuICAgICAgaWYgKGxlbmd0aCA8IDQ4KSBfbWFzayhzb3VyY2UsIG1hc2ssIG91dHB1dCwgb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgZWxzZSBidWZmZXJVdGlsLm1hc2soc291cmNlLCBtYXNrLCBvdXRwdXQsIG9mZnNldCwgbGVuZ3RoKTtcbiAgICB9O1xuXG4gICAgbW9kdWxlLmV4cG9ydHMudW5tYXNrID0gZnVuY3Rpb24gKGJ1ZmZlciwgbWFzaykge1xuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCAzMikgX3VubWFzayhidWZmZXIsIG1hc2spO1xuICAgICAgZWxzZSBidWZmZXJVdGlsLnVubWFzayhidWZmZXIsIG1hc2spO1xuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBDb250aW51ZSByZWdhcmRsZXNzIG9mIHRoZSBlcnJvci5cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBCSU5BUllfVFlQRVMgPSBbJ25vZGVidWZmZXInLCAnYXJyYXlidWZmZXInLCAnZnJhZ21lbnRzJ107XG5jb25zdCBoYXNCbG9iID0gdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnO1xuXG5pZiAoaGFzQmxvYikgQklOQVJZX1RZUEVTLnB1c2goJ2Jsb2InKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEJJTkFSWV9UWVBFUyxcbiAgRU1QVFlfQlVGRkVSOiBCdWZmZXIuYWxsb2MoMCksXG4gIEdVSUQ6ICcyNThFQUZBNS1FOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTEnLFxuICBoYXNCbG9iLFxuICBrRm9yT25FdmVudEF0dHJpYnV0ZTogU3ltYm9sKCdrSXNGb3JPbkV2ZW50QXR0cmlidXRlJyksXG4gIGtMaXN0ZW5lcjogU3ltYm9sKCdrTGlzdGVuZXInKSxcbiAga1N0YXR1c0NvZGU6IFN5bWJvbCgnc3RhdHVzLWNvZGUnKSxcbiAga1dlYlNvY2tldDogU3ltYm9sKCd3ZWJzb2NrZXQnKSxcbiAgTk9PUDogKCkgPT4ge31cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsga0Zvck9uRXZlbnRBdHRyaWJ1dGUsIGtMaXN0ZW5lciB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcblxuY29uc3Qga0NvZGUgPSBTeW1ib2woJ2tDb2RlJyk7XG5jb25zdCBrRGF0YSA9IFN5bWJvbCgna0RhdGEnKTtcbmNvbnN0IGtFcnJvciA9IFN5bWJvbCgna0Vycm9yJyk7XG5jb25zdCBrTWVzc2FnZSA9IFN5bWJvbCgna01lc3NhZ2UnKTtcbmNvbnN0IGtSZWFzb24gPSBTeW1ib2woJ2tSZWFzb24nKTtcbmNvbnN0IGtUYXJnZXQgPSBTeW1ib2woJ2tUYXJnZXQnKTtcbmNvbnN0IGtUeXBlID0gU3ltYm9sKCdrVHlwZScpO1xuY29uc3Qga1dhc0NsZWFuID0gU3ltYm9sKCdrV2FzQ2xlYW4nKTtcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gZXZlbnQuXG4gKi9cbmNsYXNzIEV2ZW50IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiB0aGUgYHR5cGVgIGFyZ3VtZW50IGlzIG5vdCBzcGVjaWZpZWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHR5cGUpIHtcbiAgICB0aGlzW2tUYXJnZXRdID0gbnVsbDtcbiAgICB0aGlzW2tUeXBlXSA9IHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUgeyp9XG4gICAqL1xuICBnZXQgdGFyZ2V0KCkge1xuICAgIHJldHVybiB0aGlzW2tUYXJnZXRdO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpc1trVHlwZV07XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50LnByb3RvdHlwZSwgJ3RhcmdldCcsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudC5wcm90b3R5cGUsICd0eXBlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIGNsb3NlIGV2ZW50LlxuICpcbiAqIEBleHRlbmRzIEV2ZW50XG4gKi9cbmNsYXNzIENsb3NlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYENsb3NlRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXG4gICAqICAgICBhdHRyaWJ1dGVzIHZpYSBvYmplY3QgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jb2RlPTBdIFRoZSBzdGF0dXMgY29kZSBleHBsYWluaW5nIHdoeSB0aGVcbiAgICogICAgIGNvbm5lY3Rpb24gd2FzIGNsb3NlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucmVhc29uPScnXSBBIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBleHBsYWluaW5nIHdoeVxuICAgKiAgICAgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLndhc0NsZWFuPWZhbHNlXSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlXG4gICAqICAgICBjb25uZWN0aW9uIHdhcyBjbGVhbmx5IGNsb3NlZFxuICAgKi9cbiAgY29uc3RydWN0b3IodHlwZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIodHlwZSk7XG5cbiAgICB0aGlzW2tDb2RlXSA9IG9wdGlvbnMuY29kZSA9PT0gdW5kZWZpbmVkID8gMCA6IG9wdGlvbnMuY29kZTtcbiAgICB0aGlzW2tSZWFzb25dID0gb3B0aW9ucy5yZWFzb24gPT09IHVuZGVmaW5lZCA/ICcnIDogb3B0aW9ucy5yZWFzb247XG4gICAgdGhpc1trV2FzQ2xlYW5dID0gb3B0aW9ucy53YXNDbGVhbiA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBvcHRpb25zLndhc0NsZWFuO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgY29kZSgpIHtcbiAgICByZXR1cm4gdGhpc1trQ29kZV07XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIGdldCByZWFzb24oKSB7XG4gICAgcmV0dXJuIHRoaXNba1JlYXNvbl07XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqL1xuICBnZXQgd2FzQ2xlYW4oKSB7XG4gICAgcmV0dXJuIHRoaXNba1dhc0NsZWFuXTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ2xvc2VFdmVudC5wcm90b3R5cGUsICdjb2RlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KENsb3NlRXZlbnQucHJvdG90eXBlLCAncmVhc29uJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KENsb3NlRXZlbnQucHJvdG90eXBlLCAnd2FzQ2xlYW4nLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGFuIGVycm9yIGV2ZW50LlxuICpcbiAqIEBleHRlbmRzIEV2ZW50XG4gKi9cbmNsYXNzIEVycm9yRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYEVycm9yRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXG4gICAqICAgICBhdHRyaWJ1dGVzIHZpYSBvYmplY3QgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gW29wdGlvbnMuZXJyb3I9bnVsbF0gVGhlIGVycm9yIHRoYXQgZ2VuZXJhdGVkIHRoaXMgZXZlbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2U9JyddIFRoZSBlcnJvciBtZXNzYWdlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcih0eXBlKTtcblxuICAgIHRoaXNba0Vycm9yXSA9IG9wdGlvbnMuZXJyb3IgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBvcHRpb25zLmVycm9yO1xuICAgIHRoaXNba01lc3NhZ2VdID0gb3B0aW9ucy5tZXNzYWdlID09PSB1bmRlZmluZWQgPyAnJyA6IG9wdGlvbnMubWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7Kn1cbiAgICovXG4gIGdldCBlcnJvcigpIHtcbiAgICByZXR1cm4gdGhpc1trRXJyb3JdO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgbWVzc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpc1trTWVzc2FnZV07XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEVycm9yRXZlbnQucHJvdG90eXBlLCAnZXJyb3InLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXJyb3JFdmVudC5wcm90b3R5cGUsICdtZXNzYWdlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgZXZlbnQuXG4gKlxuICogQGV4dGVuZHMgRXZlbnRcbiAqL1xuY2xhc3MgTWVzc2FnZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBNZXNzYWdlRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXG4gICAqICAgICBhdHRyaWJ1dGVzIHZpYSBvYmplY3QgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gW29wdGlvbnMuZGF0YT1udWxsXSBUaGUgbWVzc2FnZSBjb250ZW50XG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcih0eXBlKTtcblxuICAgIHRoaXNba0RhdGFdID0gb3B0aW9ucy5kYXRhID09PSB1bmRlZmluZWQgPyBudWxsIDogb3B0aW9ucy5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHsqfVxuICAgKi9cbiAgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXNba0RhdGFdO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNZXNzYWdlRXZlbnQucHJvdG90eXBlLCAnZGF0YScsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuLyoqXG4gKiBUaGlzIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGVtdWxhdGluZyB0aGUgYEV2ZW50VGFyZ2V0YCBpbnRlcmZhY2UuIEl0J3Mgbm90XG4gKiBtZWFudCB0byBiZSB1c2VkIGRpcmVjdGx5LlxuICpcbiAqIEBtaXhpblxuICovXG5jb25zdCBFdmVudFRhcmdldCA9IHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGV2ZW50IHR5cGUgdG8gbGlzdGVuIGZvclxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnxPYmplY3QpfSBoYW5kbGVyIFRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBbiBvcHRpb25zIG9iamVjdCBzcGVjaWZpZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0XG4gICAqICAgICB0aGUgZXZlbnQgbGlzdGVuZXJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5vbmNlPWZhbHNlXSBBIGBCb29sZWFuYCBpbmRpY2F0aW5nIHRoYXQgdGhlXG4gICAqICAgICBsaXN0ZW5lciBzaG91bGQgYmUgaW52b2tlZCBhdCBtb3N0IG9uY2UgYWZ0ZXIgYmVpbmcgYWRkZWQuIElmIGB0cnVlYCxcbiAgICogICAgIHRoZSBsaXN0ZW5lciB3b3VsZCBiZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiBpbnZva2VkLlxuICAgKiBAcHVibGljXG4gICAqL1xuICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnModHlwZSkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIW9wdGlvbnNba0Zvck9uRXZlbnRBdHRyaWJ1dGVdICYmXG4gICAgICAgIGxpc3RlbmVyW2tMaXN0ZW5lcl0gPT09IGhhbmRsZXIgJiZcbiAgICAgICAgIWxpc3RlbmVyW2tGb3JPbkV2ZW50QXR0cmlidXRlXVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgd3JhcHBlcjtcblxuICAgIGlmICh0eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgIHdyYXBwZXIgPSBmdW5jdGlvbiBvbk1lc3NhZ2UoZGF0YSwgaXNCaW5hcnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50KCdtZXNzYWdlJywge1xuICAgICAgICAgIGRhdGE6IGlzQmluYXJ5ID8gZGF0YSA6IGRhdGEudG9TdHJpbmcoKVxuICAgICAgICB9KTtcblxuICAgICAgICBldmVudFtrVGFyZ2V0XSA9IHRoaXM7XG4gICAgICAgIGNhbGxMaXN0ZW5lcihoYW5kbGVyLCB0aGlzLCBldmVudCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgd3JhcHBlciA9IGZ1bmN0aW9uIG9uQ2xvc2UoY29kZSwgbWVzc2FnZSkge1xuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDbG9zZUV2ZW50KCdjbG9zZScsIHtcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHJlYXNvbjogbWVzc2FnZS50b1N0cmluZygpLFxuICAgICAgICAgIHdhc0NsZWFuOiB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgJiYgdGhpcy5fY2xvc2VGcmFtZVNlbnRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXZlbnRba1RhcmdldF0gPSB0aGlzO1xuICAgICAgICBjYWxsTGlzdGVuZXIoaGFuZGxlciwgdGhpcywgZXZlbnQpO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgIHdyYXBwZXIgPSBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEVycm9yRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXZlbnRba1RhcmdldF0gPSB0aGlzO1xuICAgICAgICBjYWxsTGlzdGVuZXIoaGFuZGxlciwgdGhpcywgZXZlbnQpO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvcGVuJykge1xuICAgICAgd3JhcHBlciA9IGZ1bmN0aW9uIG9uT3BlbigpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ29wZW4nKTtcblxuICAgICAgICBldmVudFtrVGFyZ2V0XSA9IHRoaXM7XG4gICAgICAgIGNhbGxMaXN0ZW5lcihoYW5kbGVyLCB0aGlzLCBldmVudCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd3JhcHBlcltrRm9yT25FdmVudEF0dHJpYnV0ZV0gPSAhIW9wdGlvbnNba0Zvck9uRXZlbnRBdHRyaWJ1dGVdO1xuICAgIHdyYXBwZXJba0xpc3RlbmVyXSA9IGhhbmRsZXI7XG5cbiAgICBpZiAob3B0aW9ucy5vbmNlKSB7XG4gICAgICB0aGlzLm9uY2UodHlwZSwgd3JhcHBlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub24odHlwZSwgd3JhcHBlcik7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXZlbnQgdHlwZSB0byByZW1vdmVcbiAgICogQHBhcmFtIHsoRnVuY3Rpb258T2JqZWN0KX0gaGFuZGxlciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlcikge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnModHlwZSkpIHtcbiAgICAgIGlmIChsaXN0ZW5lcltrTGlzdGVuZXJdID09PSBoYW5kbGVyICYmICFsaXN0ZW5lcltrRm9yT25FdmVudEF0dHJpYnV0ZV0pIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENsb3NlRXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIEV2ZW50LFxuICBFdmVudFRhcmdldCxcbiAgTWVzc2FnZUV2ZW50XG59O1xuXG4vKipcbiAqIENhbGwgYW4gZXZlbnQgbGlzdGVuZXJcbiAqXG4gKiBAcGFyYW0geyhGdW5jdGlvbnxPYmplY3QpfSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gY2FsbFxuICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSB2YWx1ZSB0byB1c2UgYXMgYHRoaXNgYCB3aGVuIGNhbGxpbmcgdGhlIGxpc3RlbmVyXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gcGFzcyB0byB0aGUgbGlzdGVuZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGxMaXN0ZW5lcihsaXN0ZW5lciwgdGhpc0FyZywgZXZlbnQpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciA9PT0gJ29iamVjdCcgJiYgbGlzdGVuZXIuaGFuZGxlRXZlbnQpIHtcbiAgICBsaXN0ZW5lci5oYW5kbGVFdmVudC5jYWxsKGxpc3RlbmVyLCBldmVudCk7XG4gIH0gZWxzZSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzQXJnLCBldmVudCk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyB0b2tlbkNoYXJzIH0gPSByZXF1aXJlKCcuL3ZhbGlkYXRpb24nKTtcblxuLyoqXG4gKiBBZGRzIGFuIG9mZmVyIHRvIHRoZSBtYXAgb2YgZXh0ZW5zaW9uIG9mZmVycyBvciBhIHBhcmFtZXRlciB0byB0aGUgbWFwIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0IFRoZSBtYXAgb2YgZXh0ZW5zaW9uIG9mZmVycyBvciBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgZXh0ZW5zaW9uIG9yIHBhcmFtZXRlciBuYW1lXG4gKiBAcGFyYW0geyhPYmplY3R8Qm9vbGVhbnxTdHJpbmcpfSBlbGVtIFRoZSBleHRlbnNpb24gcGFyYW1ldGVycyBvciB0aGVcbiAqICAgICBwYXJhbWV0ZXIgdmFsdWVcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHB1c2goZGVzdCwgbmFtZSwgZWxlbSkge1xuICBpZiAoZGVzdFtuYW1lXSA9PT0gdW5kZWZpbmVkKSBkZXN0W25hbWVdID0gW2VsZW1dO1xuICBlbHNlIGRlc3RbbmFtZV0ucHVzaChlbGVtKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnNgIGhlYWRlciBpbnRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyIFRoZSBmaWVsZCB2YWx1ZSBvZiB0aGUgaGVhZGVyXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBwYXJzZWQgb2JqZWN0XG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKGhlYWRlcikge1xuICBjb25zdCBvZmZlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBsZXQgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgbGV0IG11c3RVbmVzY2FwZSA9IGZhbHNlO1xuICBsZXQgaXNFc2NhcGluZyA9IGZhbHNlO1xuICBsZXQgaW5RdW90ZXMgPSBmYWxzZTtcbiAgbGV0IGV4dGVuc2lvbk5hbWU7XG4gIGxldCBwYXJhbU5hbWU7XG4gIGxldCBzdGFydCA9IC0xO1xuICBsZXQgY29kZSA9IC0xO1xuICBsZXQgZW5kID0gLTE7XG4gIGxldCBpID0gMDtcblxuICBmb3IgKDsgaSA8IGhlYWRlci5sZW5ndGg7IGkrKykge1xuICAgIGNvZGUgPSBoZWFkZXIuY2hhckNvZGVBdChpKTtcblxuICAgIGlmIChleHRlbnNpb25OYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChlbmQgPT09IC0xICYmIHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSAtMSkgc3RhcnQgPSBpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaSAhPT0gMCAmJlxuICAgICAgICAoY29kZSA9PT0gMHgyMCAvKiAnICcgKi8gfHwgY29kZSA9PT0gMHgwOSkgLyogJ1xcdCcgKi9cbiAgICAgICkge1xuICAgICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4M2IgLyogJzsnICovIHx8IGNvZGUgPT09IDB4MmMgLyogJywnICovKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICAgICAgICBjb25zdCBuYW1lID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgICBpZiAoY29kZSA9PT0gMHgyYykge1xuICAgICAgICAgIHB1c2gob2ZmZXJzLCBuYW1lLCBwYXJhbXMpO1xuICAgICAgICAgIHBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IG5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydCA9IGVuZCA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwYXJhbU5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVuZCA9PT0gLTEgJiYgdG9rZW5DaGFyc1tjb2RlXSA9PT0gMSkge1xuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MjAgfHwgY29kZSA9PT0gMHgwOSkge1xuICAgICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4M2IgfHwgY29kZSA9PT0gMHgyYykge1xuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kID09PSAtMSkgZW5kID0gaTtcbiAgICAgICAgcHVzaChwYXJhbXMsIGhlYWRlci5zbGljZShzdGFydCwgZW5kKSwgdHJ1ZSk7XG4gICAgICAgIGlmIChjb2RlID09PSAweDJjKSB7XG4gICAgICAgICAgcHVzaChvZmZlcnMsIGV4dGVuc2lvbk5hbWUsIHBhcmFtcyk7XG4gICAgICAgICAgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBleHRlbnNpb25OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBlbmQgPSAtMTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgzZCAvKiAnPScgKi8gJiYgc3RhcnQgIT09IC0xICYmIGVuZCA9PT0gLTEpIHtcbiAgICAgICAgcGFyYW1OYW1lID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBpKTtcbiAgICAgICAgc3RhcnQgPSBlbmQgPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHtpfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgLy8gVGhlIHZhbHVlIG9mIGEgcXVvdGVkLXN0cmluZyBhZnRlciB1bmVzY2FwaW5nIG11c3QgY29uZm9ybSB0byB0aGVcbiAgICAgIC8vIHRva2VuIEFCTkYsIHNvIG9ubHkgdG9rZW4gY2hhcmFjdGVycyBhcmUgdmFsaWQuXG4gICAgICAvLyBSZWY6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NDU1I3NlY3Rpb24tOS4xXG4gICAgICAvL1xuICAgICAgaWYgKGlzRXNjYXBpbmcpIHtcbiAgICAgICAgaWYgKHRva2VuQ2hhcnNbY29kZV0gIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICAgIGVsc2UgaWYgKCFtdXN0VW5lc2NhcGUpIG11c3RVbmVzY2FwZSA9IHRydWU7XG4gICAgICAgIGlzRXNjYXBpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoaW5RdW90ZXMpIHtcbiAgICAgICAgaWYgKHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcbiAgICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyMiAvKiAnXCInICovICYmIHN0YXJ0ICE9PSAtMSkge1xuICAgICAgICAgIGluUXVvdGVzID0gZmFsc2U7XG4gICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDVjIC8qICdcXCcgKi8pIHtcbiAgICAgICAgICBpc0VzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDIyICYmIGhlYWRlci5jaGFyQ29kZUF0KGkgLSAxKSA9PT0gMHgzZCkge1xuICAgICAgICBpblF1b3RlcyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGVuZCA9PT0gLTEgJiYgdG9rZW5DaGFyc1tjb2RlXSA9PT0gMSkge1xuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0ICE9PSAtMSAmJiAoY29kZSA9PT0gMHgyMCB8fCBjb2RlID09PSAweDA5KSkge1xuICAgICAgICBpZiAoZW5kID09PSAtMSkgZW5kID0gaTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgzYiB8fCBjb2RlID09PSAweDJjKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICAgICAgICBsZXQgdmFsdWUgPSBoZWFkZXIuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgIGlmIChtdXN0VW5lc2NhcGUpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcXFwvZywgJycpO1xuICAgICAgICAgIG11c3RVbmVzY2FwZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHB1c2gocGFyYW1zLCBwYXJhbU5hbWUsIHZhbHVlKTtcbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MmMpIHtcbiAgICAgICAgICBwdXNoKG9mZmVycywgZXh0ZW5zaW9uTmFtZSwgcGFyYW1zKTtcbiAgICAgICAgICBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGV4dGVuc2lvbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJhbU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHN0YXJ0ID0gZW5kID0gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGluUXVvdGVzIHx8IGNvZGUgPT09IDB4MjAgfHwgY29kZSA9PT0gMHgwOSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQnKTtcbiAgfVxuXG4gIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICBjb25zdCB0b2tlbiA9IGhlYWRlci5zbGljZShzdGFydCwgZW5kKTtcbiAgaWYgKGV4dGVuc2lvbk5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHB1c2gob2ZmZXJzLCB0b2tlbiwgcGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocGFyYW1OYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHB1c2gocGFyYW1zLCB0b2tlbiwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChtdXN0VW5lc2NhcGUpIHtcbiAgICAgIHB1c2gocGFyYW1zLCBwYXJhbU5hbWUsIHRva2VuLnJlcGxhY2UoL1xcXFwvZywgJycpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaChwYXJhbXMsIHBhcmFtTmFtZSwgdG9rZW4pO1xuICAgIH1cbiAgICBwdXNoKG9mZmVycywgZXh0ZW5zaW9uTmFtZSwgcGFyYW1zKTtcbiAgfVxuXG4gIHJldHVybiBvZmZlcnM7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zYCBoZWFkZXIgZmllbGQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGV4dGVuc2lvbnMgVGhlIG1hcCBvZiBleHRlbnNpb25zIGFuZCBwYXJhbWV0ZXJzIHRvIGZvcm1hdFxuICogQHJldHVybiB7U3RyaW5nfSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIG9iamVjdFxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBmb3JtYXQoZXh0ZW5zaW9ucykge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZXh0ZW5zaW9ucylcbiAgICAubWFwKChleHRlbnNpb24pID0+IHtcbiAgICAgIGxldCBjb25maWd1cmF0aW9ucyA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWd1cmF0aW9ucykpIGNvbmZpZ3VyYXRpb25zID0gW2NvbmZpZ3VyYXRpb25zXTtcbiAgICAgIHJldHVybiBjb25maWd1cmF0aW9uc1xuICAgICAgICAubWFwKChwYXJhbXMpID0+IHtcbiAgICAgICAgICByZXR1cm4gW2V4dGVuc2lvbl1cbiAgICAgICAgICAgIC5jb25jYXQoXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IHBhcmFtc1trXTtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkgdmFsdWVzID0gW3ZhbHVlc107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgLm1hcCgodikgPT4gKHYgPT09IHRydWUgPyBrIDogYCR7a309JHt2fWApKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oJzsgJyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbignOyAnKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgfSlcbiAgICAuam9pbignLCAnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7IGZvcm1hdCwgcGFyc2UgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3Qga0RvbmUgPSBTeW1ib2woJ2tEb25lJyk7XG5jb25zdCBrUnVuID0gU3ltYm9sKCdrUnVuJyk7XG5cbi8qKlxuICogQSB2ZXJ5IHNpbXBsZSBqb2IgcXVldWUgd2l0aCBhZGp1c3RhYmxlIGNvbmN1cnJlbmN5LiBBZGFwdGVkIGZyb21cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9TVFJNTC9hc3luYy1saW1pdGVyXG4gKi9cbmNsYXNzIExpbWl0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBgTGltaXRlcmAuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbY29uY3VycmVuY3k9SW5maW5pdHldIFRoZSBtYXhpbXVtIG51bWJlciBvZiBqb2JzIGFsbG93ZWRcbiAgICogICAgIHRvIHJ1biBjb25jdXJyZW50bHlcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmN1cnJlbmN5KSB7XG4gICAgdGhpc1trRG9uZV0gPSAoKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmctLTtcbiAgICAgIHRoaXNba1J1bl0oKTtcbiAgICB9O1xuICAgIHRoaXMuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeSB8fCBJbmZpbml0eTtcbiAgICB0aGlzLmpvYnMgPSBbXTtcbiAgICB0aGlzLnBlbmRpbmcgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBqb2IgdG8gdGhlIHF1ZXVlLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBqb2IgVGhlIGpvYiB0byBydW5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgYWRkKGpvYikge1xuICAgIHRoaXMuam9icy5wdXNoKGpvYik7XG4gICAgdGhpc1trUnVuXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBqb2IgZnJvbSB0aGUgcXVldWUgYW5kIHJ1bnMgaXQgaWYgcG9zc2libGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBba1J1bl0oKSB7XG4gICAgaWYgKHRoaXMucGVuZGluZyA9PT0gdGhpcy5jb25jdXJyZW5jeSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuam9icy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGpvYiA9IHRoaXMuam9icy5zaGlmdCgpO1xuXG4gICAgICB0aGlzLnBlbmRpbmcrKztcbiAgICAgIGpvYih0aGlzW2tEb25lXSk7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTGltaXRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcblxuY29uc3QgYnVmZmVyVXRpbCA9IHJlcXVpcmUoJy4vYnVmZmVyLXV0aWwnKTtcbmNvbnN0IExpbWl0ZXIgPSByZXF1aXJlKCcuL2xpbWl0ZXInKTtcbmNvbnN0IHsga1N0YXR1c0NvZGUgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbmNvbnN0IEZhc3RCdWZmZXIgPSBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdO1xuY29uc3QgVFJBSUxFUiA9IEJ1ZmZlci5mcm9tKFsweDAwLCAweDAwLCAweGZmLCAweGZmXSk7XG5jb25zdCBrUGVyTWVzc2FnZURlZmxhdGUgPSBTeW1ib2woJ3Blcm1lc3NhZ2UtZGVmbGF0ZScpO1xuY29uc3Qga1RvdGFsTGVuZ3RoID0gU3ltYm9sKCd0b3RhbC1sZW5ndGgnKTtcbmNvbnN0IGtDYWxsYmFjayA9IFN5bWJvbCgnY2FsbGJhY2snKTtcbmNvbnN0IGtCdWZmZXJzID0gU3ltYm9sKCdidWZmZXJzJyk7XG5jb25zdCBrRXJyb3IgPSBTeW1ib2woJ2Vycm9yJyk7XG5cbi8vXG4vLyBXZSBsaW1pdCB6bGliIGNvbmN1cnJlbmN5LCB3aGljaCBwcmV2ZW50cyBzZXZlcmUgbWVtb3J5IGZyYWdtZW50YXRpb25cbi8vIGFzIGRvY3VtZW50ZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy84ODcxI2lzc3VlY29tbWVudC0yNTA5MTU5MTNcbi8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vd2Vic29ja2V0cy93cy9pc3N1ZXMvMTIwMlxuLy9cbi8vIEludGVudGlvbmFsbHkgZ2xvYmFsOyBpdCdzIHRoZSBnbG9iYWwgdGhyZWFkIHBvb2wgdGhhdCdzIGFuIGlzc3VlLlxuLy9cbmxldCB6bGliTGltaXRlcjtcblxuLyoqXG4gKiBwZXJtZXNzYWdlLWRlZmxhdGUgaW1wbGVtZW50YXRpb24uXG4gKi9cbmNsYXNzIFBlck1lc3NhZ2VEZWZsYXRlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBQZXJNZXNzYWdlRGVmbGF0ZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBDb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHsoQm9vbGVhbnxOdW1iZXIpfSBbb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzXSBBZHZlcnRpc2Ugc3VwcG9ydFxuICAgKiAgICAgZm9yLCBvciByZXF1ZXN0LCBhIGN1c3RvbSBjbGllbnQgd2luZG93IHNpemVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGllbnROb0NvbnRleHRUYWtlb3Zlcj1mYWxzZV0gQWR2ZXJ0aXNlL1xuICAgKiAgICAgYWNrbm93bGVkZ2UgZGlzYWJsaW5nIG9mIGNsaWVudCBjb250ZXh0IHRha2VvdmVyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jb25jdXJyZW5jeUxpbWl0PTEwXSBUaGUgbnVtYmVyIG9mIGNvbmN1cnJlbnRcbiAgICogICAgIGNhbGxzIHRvIHpsaWJcbiAgICogQHBhcmFtIHsoQm9vbGVhbnxOdW1iZXIpfSBbb3B0aW9ucy5zZXJ2ZXJNYXhXaW5kb3dCaXRzXSBSZXF1ZXN0L2NvbmZpcm0gdGhlXG4gICAqICAgICB1c2Ugb2YgYSBjdXN0b20gc2VydmVyIHdpbmRvdyBzaXplXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2VydmVyTm9Db250ZXh0VGFrZW92ZXI9ZmFsc2VdIFJlcXVlc3QvYWNjZXB0XG4gICAqICAgICBkaXNhYmxpbmcgb2Ygc2VydmVyIGNvbnRleHQgdGFrZW92ZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnRocmVzaG9sZD0xMDI0XSBTaXplIChpbiBieXRlcykgYmVsb3cgd2hpY2hcbiAgICogICAgIG1lc3NhZ2VzIHNob3VsZCBub3QgYmUgY29tcHJlc3NlZCBpZiBjb250ZXh0IHRha2VvdmVyIGlzIGRpc2FibGVkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy56bGliRGVmbGF0ZU9wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB6bGliIG9uXG4gICAqICAgICBkZWZsYXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy56bGliSW5mbGF0ZU9wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB6bGliIG9uXG4gICAqICAgICBpbmZsYXRlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzU2VydmVyPWZhbHNlXSBDcmVhdGUgdGhlIGluc3RhbmNlIGluIGVpdGhlciBzZXJ2ZXIgb3JcbiAgICogICAgIGNsaWVudCBtb2RlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbWF4UGF5bG9hZD0wXSBUaGUgbWF4aW11bSBhbGxvd2VkIG1lc3NhZ2UgbGVuZ3RoXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zLCBpc1NlcnZlciwgbWF4UGF5bG9hZCkge1xuICAgIHRoaXMuX21heFBheWxvYWQgPSBtYXhQYXlsb2FkIHwgMDtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLl90aHJlc2hvbGQgPVxuICAgICAgdGhpcy5fb3B0aW9ucy50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHRoaXMuX29wdGlvbnMudGhyZXNob2xkIDogMTAyNDtcbiAgICB0aGlzLl9pc1NlcnZlciA9ICEhaXNTZXJ2ZXI7XG4gICAgdGhpcy5fZGVmbGF0ZSA9IG51bGw7XG4gICAgdGhpcy5faW5mbGF0ZSA9IG51bGw7XG5cbiAgICB0aGlzLnBhcmFtcyA9IG51bGw7XG5cbiAgICBpZiAoIXpsaWJMaW1pdGVyKSB7XG4gICAgICBjb25zdCBjb25jdXJyZW5jeSA9XG4gICAgICAgIHRoaXMuX29wdGlvbnMuY29uY3VycmVuY3lMaW1pdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB0aGlzLl9vcHRpb25zLmNvbmN1cnJlbmN5TGltaXRcbiAgICAgICAgICA6IDEwO1xuICAgICAgemxpYkxpbWl0ZXIgPSBuZXcgTGltaXRlcihjb25jdXJyZW5jeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGV4dGVuc2lvbk5hbWUoKSB7XG4gICAgcmV0dXJuICdwZXJtZXNzYWdlLWRlZmxhdGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBleHRlbnNpb24gbmVnb3RpYXRpb24gb2ZmZXIuXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gRXh0ZW5zaW9uIHBhcmFtZXRlcnNcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgb2ZmZXIoKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5zZXJ2ZXJOb0NvbnRleHRUYWtlb3Zlcikge1xuICAgICAgcGFyYW1zLnNlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wdGlvbnMuY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIpIHtcbiAgICAgIHBhcmFtcy5jbGllbnRfbm9fY29udGV4dF90YWtlb3ZlciA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcHRpb25zLnNlcnZlck1heFdpbmRvd0JpdHMpIHtcbiAgICAgIHBhcmFtcy5zZXJ2ZXJfbWF4X3dpbmRvd19iaXRzID0gdGhpcy5fb3B0aW9ucy5zZXJ2ZXJNYXhXaW5kb3dCaXRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzKSB7XG4gICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA9IHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cztcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cyA9PSBudWxsKSB7XG4gICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQgYW4gZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVyL3Jlc3BvbnNlLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBjb25maWd1cmF0aW9ucyBUaGUgZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVycy9yZXBvbnNlXG4gICAqIEByZXR1cm4ge09iamVjdH0gQWNjZXB0ZWQgY29uZmlndXJhdGlvblxuICAgKiBAcHVibGljXG4gICAqL1xuICBhY2NlcHQoY29uZmlndXJhdGlvbnMpIHtcbiAgICBjb25maWd1cmF0aW9ucyA9IHRoaXMubm9ybWFsaXplUGFyYW1zKGNvbmZpZ3VyYXRpb25zKTtcblxuICAgIHRoaXMucGFyYW1zID0gdGhpcy5faXNTZXJ2ZXJcbiAgICAgID8gdGhpcy5hY2NlcHRBc1NlcnZlcihjb25maWd1cmF0aW9ucylcbiAgICAgIDogdGhpcy5hY2NlcHRBc0NsaWVudChjb25maWd1cmF0aW9ucyk7XG5cbiAgICByZXR1cm4gdGhpcy5wYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBleHRlbnNpb24uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMuX2luZmxhdGUpIHtcbiAgICAgIHRoaXMuX2luZmxhdGUuY2xvc2UoKTtcbiAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kZWZsYXRlKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuX2RlZmxhdGVba0NhbGxiYWNrXTtcblxuICAgICAgdGhpcy5fZGVmbGF0ZS5jbG9zZSgpO1xuICAgICAgdGhpcy5fZGVmbGF0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayhcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVGhlIGRlZmxhdGUgc3RyZWFtIHdhcyBjbG9zZWQgd2hpbGUgZGF0YSB3YXMgYmVpbmcgcHJvY2Vzc2VkJ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogIEFjY2VwdCBhbiBleHRlbnNpb24gbmVnb3RpYXRpb24gb2ZmZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IG9mZmVycyBUaGUgZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVyc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IEFjY2VwdGVkIGNvbmZpZ3VyYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFjY2VwdEFzU2VydmVyKG9mZmVycykge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9vcHRpb25zO1xuICAgIGNvbnN0IGFjY2VwdGVkID0gb2ZmZXJzLmZpbmQoKHBhcmFtcykgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAob3B0cy5zZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlciA9PT0gZmFsc2UgJiZcbiAgICAgICAgICBwYXJhbXMuc2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXIpIHx8XG4gICAgICAgIChwYXJhbXMuc2VydmVyX21heF93aW5kb3dfYml0cyAmJlxuICAgICAgICAgIChvcHRzLnNlcnZlck1heFdpbmRvd0JpdHMgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICAodHlwZW9mIG9wdHMuc2VydmVyTWF4V2luZG93Qml0cyA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgb3B0cy5zZXJ2ZXJNYXhXaW5kb3dCaXRzID4gcGFyYW1zLnNlcnZlcl9tYXhfd2luZG93X2JpdHMpKSkgfHxcbiAgICAgICAgKHR5cGVvZiBvcHRzLmNsaWVudE1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgIXBhcmFtcy5jbGllbnRfbWF4X3dpbmRvd19iaXRzKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBpZiAoIWFjY2VwdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vbmUgb2YgdGhlIGV4dGVuc2lvbiBvZmZlcnMgY2FuIGJlIGFjY2VwdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuc2VydmVyTm9Db250ZXh0VGFrZW92ZXIpIHtcbiAgICAgIGFjY2VwdGVkLnNlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9wdHMuY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIpIHtcbiAgICAgIGFjY2VwdGVkLmNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRzLnNlcnZlck1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInKSB7XG4gICAgICBhY2NlcHRlZC5zZXJ2ZXJfbWF4X3dpbmRvd19iaXRzID0gb3B0cy5zZXJ2ZXJNYXhXaW5kb3dCaXRzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMuY2xpZW50TWF4V2luZG93Qml0cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFjY2VwdGVkLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPSBvcHRzLmNsaWVudE1heFdpbmRvd0JpdHM7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGFjY2VwdGVkLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPT09IHRydWUgfHxcbiAgICAgIG9wdHMuY2xpZW50TWF4V2luZG93Qml0cyA9PT0gZmFsc2VcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBhY2NlcHRlZC5jbGllbnRfbWF4X3dpbmRvd19iaXRzO1xuICAgIH1cblxuICAgIHJldHVybiBhY2NlcHRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQgdGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gcmVzcG9uc2UgVGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiByZXNwb25zZVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IEFjY2VwdGVkIGNvbmZpZ3VyYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFjY2VwdEFzQ2xpZW50KHJlc3BvbnNlKSB7XG4gICAgY29uc3QgcGFyYW1zID0gcmVzcG9uc2VbMF07XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9vcHRpb25zLmNsaWVudE5vQ29udGV4dFRha2VvdmVyID09PSBmYWxzZSAmJlxuICAgICAgcGFyYW1zLmNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgcGFyYW1ldGVyIFwiY2xpZW50X25vX2NvbnRleHRfdGFrZW92ZXJcIicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmNsaWVudF9tYXhfd2luZG93X2JpdHMpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzID09PSAnbnVtYmVyJykge1xuICAgICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA9IHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzID09PSBmYWxzZSB8fFxuICAgICAgKHR5cGVvZiB0aGlzLl9vcHRpb25zLmNsaWVudE1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInICYmXG4gICAgICAgIHBhcmFtcy5jbGllbnRfbWF4X3dpbmRvd19iaXRzID4gdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVW5leHBlY3RlZCBvciBpbnZhbGlkIHBhcmFtZXRlciBcImNsaWVudF9tYXhfd2luZG93X2JpdHNcIidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gY29uZmlndXJhdGlvbnMgVGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiBvZmZlcnMvcmVwb25zZVxuICAgKiBAcmV0dXJuIHtBcnJheX0gVGhlIG9mZmVycy9yZXNwb25zZSB3aXRoIG5vcm1hbGl6ZWQgcGFyYW1ldGVyc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbm9ybWFsaXplUGFyYW1zKGNvbmZpZ3VyYXRpb25zKSB7XG4gICAgY29uZmlndXJhdGlvbnMuZm9yRWFjaCgocGFyYW1zKSA9PiB7XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJhbXNba2V5XTtcblxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyIFwiJHtrZXl9XCIgbXVzdCBoYXZlIG9ubHkgYSBzaW5nbGUgdmFsdWVgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gdmFsdWVbMF07XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ2NsaWVudF9tYXhfd2luZG93X2JpdHMnKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBudW0gPSArdmFsdWU7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtKSB8fCBudW0gPCA4IHx8IG51bSA+IDE1KSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYEludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciBcIiR7a2V5fVwiOiAke3ZhbHVlfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gbnVtO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzU2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyIFwiJHtrZXl9XCI6ICR7dmFsdWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnc2VydmVyX21heF93aW5kb3dfYml0cycpIHtcbiAgICAgICAgICBjb25zdCBudW0gPSArdmFsdWU7XG4gICAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtIDwgOCB8fCBudW0gPiAxNSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgYEludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciBcIiR7a2V5fVwiOiAke3ZhbHVlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbHVlID0gbnVtO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGtleSA9PT0gJ2NsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyJyB8fFxuICAgICAgICAgIGtleSA9PT0gJ3NlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyJ1xuICAgICAgICApIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgXCIke2tleX1cIjogJHt2YWx1ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcGFyYW1ldGVyIFwiJHtrZXl9XCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmFtc1trZXldID0gdmFsdWU7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjb25maWd1cmF0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvbXByZXNzIGRhdGEuIENvbmN1cnJlbmN5IGxpbWl0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIENvbXByZXNzZWQgZGF0YVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBkZWNvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICB6bGliTGltaXRlci5hZGQoKGRvbmUpID0+IHtcbiAgICAgIHRoaXMuX2RlY29tcHJlc3MoZGF0YSwgZmluLCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wcmVzcyBkYXRhLiBDb25jdXJyZW5jeSBsaW1pdGVkLlxuICAgKlxuICAgKiBAcGFyYW0geyhCdWZmZXJ8U3RyaW5nKX0gZGF0YSBEYXRhIHRvIGNvbXByZXNzXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZmluIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIHRoZSBsYXN0IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICB6bGliTGltaXRlci5hZGQoKGRvbmUpID0+IHtcbiAgICAgIHRoaXMuX2NvbXByZXNzKGRhdGEsIGZpbiwgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb21wcmVzcyBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBDb21wcmVzc2VkIGRhdGFcbiAgICogQHBhcmFtIHtCb29sZWFufSBmaW4gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgdGhlIGxhc3QgZnJhZ21lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kZWNvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuX2lzU2VydmVyID8gJ2NsaWVudCcgOiAnc2VydmVyJztcblxuICAgIGlmICghdGhpcy5faW5mbGF0ZSkge1xuICAgICAgY29uc3Qga2V5ID0gYCR7ZW5kcG9pbnR9X21heF93aW5kb3dfYml0c2A7XG4gICAgICBjb25zdCB3aW5kb3dCaXRzID1cbiAgICAgICAgdHlwZW9mIHRoaXMucGFyYW1zW2tleV0gIT09ICdudW1iZXInXG4gICAgICAgICAgPyB6bGliLlpfREVGQVVMVF9XSU5ET1dCSVRTXG4gICAgICAgICAgOiB0aGlzLnBhcmFtc1trZXldO1xuXG4gICAgICB0aGlzLl9pbmZsYXRlID0gemxpYi5jcmVhdGVJbmZsYXRlUmF3KHtcbiAgICAgICAgLi4udGhpcy5fb3B0aW9ucy56bGliSW5mbGF0ZU9wdGlvbnMsXG4gICAgICAgIHdpbmRvd0JpdHNcbiAgICAgIH0pO1xuICAgICAgdGhpcy5faW5mbGF0ZVtrUGVyTWVzc2FnZURlZmxhdGVdID0gdGhpcztcbiAgICAgIHRoaXMuX2luZmxhdGVba1RvdGFsTGVuZ3RoXSA9IDA7XG4gICAgICB0aGlzLl9pbmZsYXRlW2tCdWZmZXJzXSA9IFtdO1xuICAgICAgdGhpcy5faW5mbGF0ZS5vbignZXJyb3InLCBpbmZsYXRlT25FcnJvcik7XG4gICAgICB0aGlzLl9pbmZsYXRlLm9uKCdkYXRhJywgaW5mbGF0ZU9uRGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5faW5mbGF0ZVtrQ2FsbGJhY2tdID0gY2FsbGJhY2s7XG5cbiAgICB0aGlzLl9pbmZsYXRlLndyaXRlKGRhdGEpO1xuICAgIGlmIChmaW4pIHRoaXMuX2luZmxhdGUud3JpdGUoVFJBSUxFUik7XG5cbiAgICB0aGlzLl9pbmZsYXRlLmZsdXNoKCgpID0+IHtcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuX2luZmxhdGVba0Vycm9yXTtcblxuICAgICAgaWYgKGVycikge1xuICAgICAgICB0aGlzLl9pbmZsYXRlLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBidWZmZXJVdGlsLmNvbmNhdChcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrQnVmZmVyc10sXG4gICAgICAgIHRoaXMuX2luZmxhdGVba1RvdGFsTGVuZ3RoXVxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuX2luZmxhdGUuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCkge1xuICAgICAgICB0aGlzLl9pbmZsYXRlLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrVG90YWxMZW5ndGhdID0gMDtcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgICBpZiAoZmluICYmIHRoaXMucGFyYW1zW2Ake2VuZHBvaW50fV9ub19jb250ZXh0X3Rha2VvdmVyYF0pIHtcbiAgICAgICAgICB0aGlzLl9pbmZsYXRlLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHJlc3MgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHsoQnVmZmVyfFN0cmluZyl9IGRhdGEgRGF0YSB0byBjb21wcmVzc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuX2lzU2VydmVyID8gJ3NlcnZlcicgOiAnY2xpZW50JztcblxuICAgIGlmICghdGhpcy5fZGVmbGF0ZSkge1xuICAgICAgY29uc3Qga2V5ID0gYCR7ZW5kcG9pbnR9X21heF93aW5kb3dfYml0c2A7XG4gICAgICBjb25zdCB3aW5kb3dCaXRzID1cbiAgICAgICAgdHlwZW9mIHRoaXMucGFyYW1zW2tleV0gIT09ICdudW1iZXInXG4gICAgICAgICAgPyB6bGliLlpfREVGQVVMVF9XSU5ET1dCSVRTXG4gICAgICAgICAgOiB0aGlzLnBhcmFtc1trZXldO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlID0gemxpYi5jcmVhdGVEZWZsYXRlUmF3KHtcbiAgICAgICAgLi4udGhpcy5fb3B0aW9ucy56bGliRGVmbGF0ZU9wdGlvbnMsXG4gICAgICAgIHdpbmRvd0JpdHNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF0gPSAwO1xuICAgICAgdGhpcy5fZGVmbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgdGhpcy5fZGVmbGF0ZS5vbignZGF0YScsIGRlZmxhdGVPbkRhdGEpO1xuICAgIH1cblxuICAgIHRoaXMuX2RlZmxhdGVba0NhbGxiYWNrXSA9IGNhbGxiYWNrO1xuXG4gICAgdGhpcy5fZGVmbGF0ZS53cml0ZShkYXRhKTtcbiAgICB0aGlzLl9kZWZsYXRlLmZsdXNoKHpsaWIuWl9TWU5DX0ZMVVNILCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2RlZmxhdGUpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGRlZmxhdGUgc3RyZWFtIHdhcyBjbG9zZWQgd2hpbGUgZGF0YSB3YXMgYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAgICAvL1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhID0gYnVmZmVyVXRpbC5jb25jYXQoXG4gICAgICAgIHRoaXMuX2RlZmxhdGVba0J1ZmZlcnNdLFxuICAgICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF1cbiAgICAgICk7XG5cbiAgICAgIGlmIChmaW4pIHtcbiAgICAgICAgZGF0YSA9IG5ldyBGYXN0QnVmZmVyKGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEubGVuZ3RoIC0gNCk7XG4gICAgICB9XG5cbiAgICAgIC8vXG4gICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkIGFnYWluIGluXG4gICAgICAvLyBgUGVyTWVzc2FnZURlZmxhdGUjY2xlYW51cCgpYC5cbiAgICAgIC8vXG4gICAgICB0aGlzLl9kZWZsYXRlW2tDYWxsYmFja10gPSBudWxsO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF0gPSAwO1xuICAgICAgdGhpcy5fZGVmbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgaWYgKGZpbiAmJiB0aGlzLnBhcmFtc1tgJHtlbmRwb2ludH1fbm9fY29udGV4dF90YWtlb3ZlcmBdKSB7XG4gICAgICAgIHRoaXMuX2RlZmxhdGUucmVzZXQoKTtcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgfSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBQZXJNZXNzYWdlRGVmbGF0ZTtcblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGB6bGliLkRlZmxhdGVSYXdgIHN0cmVhbSBgJ2RhdGEnYCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgQSBjaHVuayBvZiBkYXRhXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZsYXRlT25EYXRhKGNodW5rKSB7XG4gIHRoaXNba0J1ZmZlcnNdLnB1c2goY2h1bmspO1xuICB0aGlzW2tUb3RhbExlbmd0aF0gKz0gY2h1bmsubGVuZ3RoO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYHpsaWIuSW5mbGF0ZVJhd2Agc3RyZWFtIGAnZGF0YSdgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBjaHVuayBBIGNodW5rIG9mIGRhdGFcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluZmxhdGVPbkRhdGEoY2h1bmspIHtcbiAgdGhpc1trVG90YWxMZW5ndGhdICs9IGNodW5rLmxlbmd0aDtcblxuICBpZiAoXG4gICAgdGhpc1trUGVyTWVzc2FnZURlZmxhdGVdLl9tYXhQYXlsb2FkIDwgMSB8fFxuICAgIHRoaXNba1RvdGFsTGVuZ3RoXSA8PSB0aGlzW2tQZXJNZXNzYWdlRGVmbGF0ZV0uX21heFBheWxvYWRcbiAgKSB7XG4gICAgdGhpc1trQnVmZmVyc10ucHVzaChjaHVuayk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpc1trRXJyb3JdID0gbmV3IFJhbmdlRXJyb3IoJ01heCBwYXlsb2FkIHNpemUgZXhjZWVkZWQnKTtcbiAgdGhpc1trRXJyb3JdLmNvZGUgPSAnV1NfRVJSX1VOU1VQUE9SVEVEX01FU1NBR0VfTEVOR1RIJztcbiAgdGhpc1trRXJyb3JdW2tTdGF0dXNDb2RlXSA9IDEwMDk7XG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBpbmZsYXRlT25EYXRhKTtcbiAgdGhpcy5yZXNldCgpO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYHpsaWIuSW5mbGF0ZVJhd2Agc3RyZWFtIGAnZXJyb3InYCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnIgVGhlIGVtaXR0ZWQgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluZmxhdGVPbkVycm9yKGVycikge1xuICAvL1xuICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgYFpsaWIjY2xvc2UoKWAgYXMgdGhlIGhhbmRsZSBpcyBhdXRvbWF0aWNhbGx5XG4gIC8vIGNsb3NlZCB3aGVuIGFuIGVycm9yIGlzIGVtaXR0ZWQuXG4gIC8vXG4gIHRoaXNba1Blck1lc3NhZ2VEZWZsYXRlXS5faW5mbGF0ZSA9IG51bGw7XG4gIGVycltrU3RhdHVzQ29kZV0gPSAxMDA3O1xuICB0aGlzW2tDYWxsYmFja10oZXJyKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBXcml0YWJsZSB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlID0gcmVxdWlyZSgnLi9wZXJtZXNzYWdlLWRlZmxhdGUnKTtcbmNvbnN0IHtcbiAgQklOQVJZX1RZUEVTLFxuICBFTVBUWV9CVUZGRVIsXG4gIGtTdGF0dXNDb2RlLFxuICBrV2ViU29ja2V0XG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IHsgY29uY2F0LCB0b0FycmF5QnVmZmVyLCB1bm1hc2sgfSA9IHJlcXVpcmUoJy4vYnVmZmVyLXV0aWwnKTtcbmNvbnN0IHsgaXNWYWxpZFN0YXR1c0NvZGUsIGlzVmFsaWRVVEY4IH0gPSByZXF1aXJlKCcuL3ZhbGlkYXRpb24nKTtcblxuY29uc3QgRmFzdEJ1ZmZlciA9IEJ1ZmZlcltTeW1ib2wuc3BlY2llc107XG5cbmNvbnN0IEdFVF9JTkZPID0gMDtcbmNvbnN0IEdFVF9QQVlMT0FEX0xFTkdUSF8xNiA9IDE7XG5jb25zdCBHRVRfUEFZTE9BRF9MRU5HVEhfNjQgPSAyO1xuY29uc3QgR0VUX01BU0sgPSAzO1xuY29uc3QgR0VUX0RBVEEgPSA0O1xuY29uc3QgSU5GTEFUSU5HID0gNTtcbmNvbnN0IERFRkVSX0VWRU5UID0gNjtcblxuLyoqXG4gKiBIeUJpIFJlY2VpdmVyIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBleHRlbmRzIFdyaXRhYmxlXG4gKi9cbmNsYXNzIFJlY2VpdmVyIGV4dGVuZHMgV3JpdGFibGUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIFJlY2VpdmVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cz10cnVlXSBTcGVjaWZpZXMgd2hldGhlclxuICAgKiAgICAgYW55IG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWRcbiAgICogICAgIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHRpY2tcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmJpbmFyeVR5cGU9bm9kZWJ1ZmZlcl0gVGhlIHR5cGUgZm9yIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5leHRlbnNpb25zXSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbmVnb3RpYXRlZFxuICAgKiAgICAgZXh0ZW5zaW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmlzU2VydmVyPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciB0byBvcGVyYXRlIGluXG4gICAqICAgICBjbGllbnQgb3Igc2VydmVyIG1vZGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heFBheWxvYWQ9MF0gVGhlIG1heGltdW0gYWxsb3dlZCBtZXNzYWdlIGxlbmd0aFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAgICogICAgIG5vdCB0byBza2lwIFVURi04IHZhbGlkYXRpb24gZm9yIHRleHQgYW5kIGNsb3NlIG1lc3NhZ2VzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYWxsb3dTeW5jaHJvbm91c0V2ZW50cyA9XG4gICAgICBvcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG9wdGlvbnMuYWxsb3dTeW5jaHJvbm91c0V2ZW50c1xuICAgICAgICA6IHRydWU7XG4gICAgdGhpcy5fYmluYXJ5VHlwZSA9IG9wdGlvbnMuYmluYXJ5VHlwZSB8fCBCSU5BUllfVFlQRVNbMF07XG4gICAgdGhpcy5fZXh0ZW5zaW9ucyA9IG9wdGlvbnMuZXh0ZW5zaW9ucyB8fCB7fTtcbiAgICB0aGlzLl9pc1NlcnZlciA9ICEhb3B0aW9ucy5pc1NlcnZlcjtcbiAgICB0aGlzLl9tYXhQYXlsb2FkID0gb3B0aW9ucy5tYXhQYXlsb2FkIHwgMDtcbiAgICB0aGlzLl9za2lwVVRGOFZhbGlkYXRpb24gPSAhIW9wdGlvbnMuc2tpcFVURjhWYWxpZGF0aW9uO1xuICAgIHRoaXNba1dlYlNvY2tldF0gPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzID0gMDtcbiAgICB0aGlzLl9idWZmZXJzID0gW107XG5cbiAgICB0aGlzLl9jb21wcmVzc2VkID0gZmFsc2U7XG4gICAgdGhpcy5fcGF5bG9hZExlbmd0aCA9IDA7XG4gICAgdGhpcy5fbWFzayA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9mcmFnbWVudGVkID0gMDtcbiAgICB0aGlzLl9tYXNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9maW4gPSBmYWxzZTtcbiAgICB0aGlzLl9vcGNvZGUgPSAwO1xuXG4gICAgdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9mcmFnbWVudHMgPSBbXTtcblxuICAgIHRoaXMuX2Vycm9yZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGBXcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlKClgLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgVGhlIGNodW5rIG9mIGRhdGEgdG8gd3JpdGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGVuY29kaW5nIFRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgYGNodW5rYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICBpZiAodGhpcy5fb3Bjb2RlID09PSAweDA4ICYmIHRoaXMuX3N0YXRlID09IEdFVF9JTkZPKSByZXR1cm4gY2IoKTtcblxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuICAgIHRoaXMuX2J1ZmZlcnMucHVzaChjaHVuayk7XG4gICAgdGhpcy5zdGFydExvb3AoY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVzIGBuYCBieXRlcyBmcm9tIHRoZSBidWZmZXJlZCBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnN1bWVcbiAgICogQHJldHVybiB7QnVmZmVyfSBUaGUgY29uc3VtZWQgYnl0ZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN1bWUobikge1xuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgLT0gbjtcblxuICAgIGlmIChuID09PSB0aGlzLl9idWZmZXJzWzBdLmxlbmd0aCkgcmV0dXJuIHRoaXMuX2J1ZmZlcnMuc2hpZnQoKTtcblxuICAgIGlmIChuIDwgdGhpcy5fYnVmZmVyc1swXS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IHRoaXMuX2J1ZmZlcnNbMF07XG4gICAgICB0aGlzLl9idWZmZXJzWzBdID0gbmV3IEZhc3RCdWZmZXIoXG4gICAgICAgIGJ1Zi5idWZmZXIsXG4gICAgICAgIGJ1Zi5ieXRlT2Zmc2V0ICsgbixcbiAgICAgICAgYnVmLmxlbmd0aCAtIG5cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBuZXcgRmFzdEJ1ZmZlcihidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgbik7XG4gICAgfVxuXG4gICAgY29uc3QgZHN0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4pO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgYnVmID0gdGhpcy5fYnVmZmVyc1swXTtcbiAgICAgIGNvbnN0IG9mZnNldCA9IGRzdC5sZW5ndGggLSBuO1xuXG4gICAgICBpZiAobiA+PSBidWYubGVuZ3RoKSB7XG4gICAgICAgIGRzdC5zZXQodGhpcy5fYnVmZmVycy5zaGlmdCgpLCBvZmZzZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHN0LnNldChuZXcgVWludDhBcnJheShidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgbiksIG9mZnNldCk7XG4gICAgICAgIHRoaXMuX2J1ZmZlcnNbMF0gPSBuZXcgRmFzdEJ1ZmZlcihcbiAgICAgICAgICBidWYuYnVmZmVyLFxuICAgICAgICAgIGJ1Zi5ieXRlT2Zmc2V0ICsgbixcbiAgICAgICAgICBidWYubGVuZ3RoIC0gblxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBuIC09IGJ1Zi5sZW5ndGg7XG4gICAgfSB3aGlsZSAobiA+IDApO1xuXG4gICAgcmV0dXJuIGRzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBhcnNpbmcgbG9vcC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0TG9vcChjYikge1xuICAgIHRoaXMuX2xvb3AgPSB0cnVlO1xuXG4gICAgZG8ge1xuICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xuICAgICAgICBjYXNlIEdFVF9JTkZPOlxuICAgICAgICAgIHRoaXMuZ2V0SW5mbyhjYik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgR0VUX1BBWUxPQURfTEVOR1RIXzE2OlxuICAgICAgICAgIHRoaXMuZ2V0UGF5bG9hZExlbmd0aDE2KGNiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBHRVRfUEFZTE9BRF9MRU5HVEhfNjQ6XG4gICAgICAgICAgdGhpcy5nZXRQYXlsb2FkTGVuZ3RoNjQoY2IpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEdFVF9NQVNLOlxuICAgICAgICAgIHRoaXMuZ2V0TWFzaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEdFVF9EQVRBOlxuICAgICAgICAgIHRoaXMuZ2V0RGF0YShjYik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSU5GTEFUSU5HOlxuICAgICAgICBjYXNlIERFRkVSX0VWRU5UOlxuICAgICAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSB3aGlsZSAodGhpcy5fbG9vcCk7XG5cbiAgICBpZiAoIXRoaXMuX2Vycm9yZWQpIGNiKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGZpcnN0IHR3byBieXRlcyBvZiBhIGZyYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0SW5mbyhjYikge1xuICAgIGlmICh0aGlzLl9idWZmZXJlZEJ5dGVzIDwgMikge1xuICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuY29uc3VtZSgyKTtcblxuICAgIGlmICgoYnVmWzBdICYgMHgzMCkgIT09IDB4MDApIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgJ1JTVjIgYW5kIFJTVjMgbXVzdCBiZSBjbGVhcicsXG4gICAgICAgIHRydWUsXG4gICAgICAgIDEwMDIsXG4gICAgICAgICdXU19FUlJfVU5FWFBFQ1RFRF9SU1ZfMl8zJ1xuICAgICAgKTtcblxuICAgICAgY2IoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXByZXNzZWQgPSAoYnVmWzBdICYgMHg0MCkgPT09IDB4NDA7XG5cbiAgICBpZiAoY29tcHJlc3NlZCAmJiAhdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAnUlNWMSBtdXN0IGJlIGNsZWFyJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgMTAwMixcbiAgICAgICAgJ1dTX0VSUl9VTkVYUEVDVEVEX1JTVl8xJ1xuICAgICAgKTtcblxuICAgICAgY2IoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpbiA9IChidWZbMF0gJiAweDgwKSA9PT0gMHg4MDtcbiAgICB0aGlzLl9vcGNvZGUgPSBidWZbMF0gJiAweDBmO1xuICAgIHRoaXMuX3BheWxvYWRMZW5ndGggPSBidWZbMV0gJiAweDdmO1xuXG4gICAgaWYgKHRoaXMuX29wY29kZSA9PT0gMHgwMCkge1xuICAgICAgaWYgKGNvbXByZXNzZWQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ1JTVjEgbXVzdCBiZSBjbGVhcicsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfVU5FWFBFQ1RFRF9SU1ZfMSdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9mcmFnbWVudGVkKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgICdpbnZhbGlkIG9wY29kZSAwJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIDEwMDIsXG4gICAgICAgICAgJ1dTX0VSUl9JTlZBTElEX09QQ09ERSdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb3Bjb2RlID0gdGhpcy5fZnJhZ21lbnRlZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wY29kZSA9PT0gMHgwMSB8fCB0aGlzLl9vcGNvZGUgPT09IDB4MDIpIHtcbiAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgIGBpbnZhbGlkIG9wY29kZSAke3RoaXMuX29wY29kZX1gLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgMTAwMixcbiAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfT1BDT0RFJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wcmVzc2VkID0gY29tcHJlc3NlZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wY29kZSA+IDB4MDcgJiYgdGhpcy5fb3Bjb2RlIDwgMHgwYikge1xuICAgICAgaWYgKCF0aGlzLl9maW4pIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ0ZJTiBtdXN0IGJlIHNldCcsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfRVhQRUNURURfRklOJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29tcHJlc3NlZCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICAnUlNWMSBtdXN0IGJlIGNsZWFyJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIDEwMDIsXG4gICAgICAgICAgJ1dTX0VSUl9VTkVYUEVDVEVEX1JTVl8xJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX3BheWxvYWRMZW5ndGggPiAweDdkIHx8XG4gICAgICAgICh0aGlzLl9vcGNvZGUgPT09IDB4MDggJiYgdGhpcy5fcGF5bG9hZExlbmd0aCA9PT0gMSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICBgaW52YWxpZCBwYXlsb2FkIGxlbmd0aCAke3RoaXMuX3BheWxvYWRMZW5ndGh9YCxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIDEwMDIsXG4gICAgICAgICAgJ1dTX0VSUl9JTlZBTElEX0NPTlRST0xfUEFZTE9BRF9MRU5HVEgnXG4gICAgICAgICk7XG5cbiAgICAgICAgY2IoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgYGludmFsaWQgb3Bjb2RlICR7dGhpcy5fb3Bjb2RlfWAsXG4gICAgICAgIHRydWUsXG4gICAgICAgIDEwMDIsXG4gICAgICAgICdXU19FUlJfSU5WQUxJRF9PUENPREUnXG4gICAgICApO1xuXG4gICAgICBjYihlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9maW4gJiYgIXRoaXMuX2ZyYWdtZW50ZWQpIHRoaXMuX2ZyYWdtZW50ZWQgPSB0aGlzLl9vcGNvZGU7XG4gICAgdGhpcy5fbWFza2VkID0gKGJ1ZlsxXSAmIDB4ODApID09PSAweDgwO1xuXG4gICAgaWYgKHRoaXMuX2lzU2VydmVyKSB7XG4gICAgICBpZiAoIXRoaXMuX21hc2tlZCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICAnTUFTSyBtdXN0IGJlIHNldCcsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfRVhQRUNURURfTUFTSydcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX21hc2tlZCkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAnTUFTSyBtdXN0IGJlIGNsZWFyJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgMTAwMixcbiAgICAgICAgJ1dTX0VSUl9VTkVYUEVDVEVEX01BU0snXG4gICAgICApO1xuXG4gICAgICBjYihlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BheWxvYWRMZW5ndGggPT09IDEyNikgdGhpcy5fc3RhdGUgPSBHRVRfUEFZTE9BRF9MRU5HVEhfMTY7XG4gICAgZWxzZSBpZiAodGhpcy5fcGF5bG9hZExlbmd0aCA9PT0gMTI3KSB0aGlzLl9zdGF0ZSA9IEdFVF9QQVlMT0FEX0xFTkdUSF82NDtcbiAgICBlbHNlIHRoaXMuaGF2ZUxlbmd0aChjYik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBleHRlbmRlZCBwYXlsb2FkIGxlbmd0aCAoNysxNikuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRQYXlsb2FkTGVuZ3RoMTYoY2IpIHtcbiAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IDIpIHtcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXlsb2FkTGVuZ3RoID0gdGhpcy5jb25zdW1lKDIpLnJlYWRVSW50MTZCRSgwKTtcbiAgICB0aGlzLmhhdmVMZW5ndGgoY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGggKDcrNjQpLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0UGF5bG9hZExlbmd0aDY0KGNiKSB7XG4gICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCA4KSB7XG4gICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVmID0gdGhpcy5jb25zdW1lKDgpO1xuICAgIGNvbnN0IG51bSA9IGJ1Zi5yZWFkVUludDMyQkUoMCk7XG5cbiAgICAvL1xuICAgIC8vIFRoZSBtYXhpbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0IGlzIDJeNTMgLSAxLiBBbiBlcnJvciBpcyByZXR1cm5lZFxuICAgIC8vIGlmIHBheWxvYWQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIG51bWJlci5cbiAgICAvL1xuICAgIGlmIChudW0gPiBNYXRoLnBvdygyLCA1MyAtIDMyKSAtIDEpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgJ1Vuc3VwcG9ydGVkIFdlYlNvY2tldCBmcmFtZTogcGF5bG9hZCBsZW5ndGggPiAyXjUzIC0gMScsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAxMDA5LFxuICAgICAgICAnV1NfRVJSX1VOU1VQUE9SVEVEX0RBVEFfUEFZTE9BRF9MRU5HVEgnXG4gICAgICApO1xuXG4gICAgICBjYihlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcGF5bG9hZExlbmd0aCA9IG51bSAqIE1hdGgucG93KDIsIDMyKSArIGJ1Zi5yZWFkVUludDMyQkUoNCk7XG4gICAgdGhpcy5oYXZlTGVuZ3RoKGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXlsb2FkIGxlbmd0aCBoYXMgYmVlbiByZWFkLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGF2ZUxlbmd0aChjYikge1xuICAgIGlmICh0aGlzLl9wYXlsb2FkTGVuZ3RoICYmIHRoaXMuX29wY29kZSA8IDB4MDgpIHtcbiAgICAgIHRoaXMuX3RvdGFsUGF5bG9hZExlbmd0aCArPSB0aGlzLl9wYXlsb2FkTGVuZ3RoO1xuICAgICAgaWYgKHRoaXMuX3RvdGFsUGF5bG9hZExlbmd0aCA+IHRoaXMuX21heFBheWxvYWQgJiYgdGhpcy5fbWF4UGF5bG9hZCA+IDApIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ01heCBwYXlsb2FkIHNpemUgZXhjZWVkZWQnLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIDEwMDksXG4gICAgICAgICAgJ1dTX0VSUl9VTlNVUFBPUlRFRF9NRVNTQUdFX0xFTkdUSCdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWFza2VkKSB0aGlzLl9zdGF0ZSA9IEdFVF9NQVNLO1xuICAgIGVsc2UgdGhpcy5fc3RhdGUgPSBHRVRfREFUQTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBtYXNrIGJ5dGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0TWFzaygpIHtcbiAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IDQpIHtcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXNrID0gdGhpcy5jb25zdW1lKDQpO1xuICAgIHRoaXMuX3N0YXRlID0gR0VUX0RBVEE7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgZGF0YSBieXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldERhdGEoY2IpIHtcbiAgICBsZXQgZGF0YSA9IEVNUFRZX0JVRkZFUjtcblxuICAgIGlmICh0aGlzLl9wYXlsb2FkTGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IHRoaXMuX3BheWxvYWRMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRhdGEgPSB0aGlzLmNvbnN1bWUodGhpcy5fcGF5bG9hZExlbmd0aCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fbWFza2VkICYmXG4gICAgICAgICh0aGlzLl9tYXNrWzBdIHwgdGhpcy5fbWFza1sxXSB8IHRoaXMuX21hc2tbMl0gfCB0aGlzLl9tYXNrWzNdKSAhPT0gMFxuICAgICAgKSB7XG4gICAgICAgIHVubWFzayhkYXRhLCB0aGlzLl9tYXNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb3Bjb2RlID4gMHgwNykge1xuICAgICAgdGhpcy5jb250cm9sTWVzc2FnZShkYXRhLCBjYik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbXByZXNzZWQpIHtcbiAgICAgIHRoaXMuX3N0YXRlID0gSU5GTEFUSU5HO1xuICAgICAgdGhpcy5kZWNvbXByZXNzKGRhdGEsIGNiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5sZW5ndGgpIHtcbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIG1lc3NhZ2UgaXMgbm90IGNvbXByZXNzZWQgc28gaXRzIGxlbmd0aCBpcyB0aGUgc3VtIG9mIHRoZSBwYXlsb2FkXG4gICAgICAvLyBsZW5ndGggb2YgYWxsIGZyYWdtZW50cy5cbiAgICAgIC8vXG4gICAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoO1xuICAgICAgdGhpcy5fZnJhZ21lbnRzLnB1c2goZGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhTWVzc2FnZShjYik7XG4gIH1cblxuICAvKipcbiAgICogRGVjb21wcmVzc2VzIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIENvbXByZXNzZWQgZGF0YVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjb21wcmVzcyhkYXRhLCBjYikge1xuICAgIGNvbnN0IHBlck1lc3NhZ2VEZWZsYXRlID0gdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXTtcblxuICAgIHBlck1lc3NhZ2VEZWZsYXRlLmRlY29tcHJlc3MoZGF0YSwgdGhpcy5fZmluLCAoZXJyLCBidWYpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuXG4gICAgICBpZiAoYnVmLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoICs9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLl9tZXNzYWdlTGVuZ3RoID4gdGhpcy5fbWF4UGF5bG9hZCAmJiB0aGlzLl9tYXhQYXlsb2FkID4gMCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgICAnTWF4IHBheWxvYWQgc2l6ZSBleGNlZWRlZCcsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIDEwMDksXG4gICAgICAgICAgICAnV1NfRVJSX1VOU1VQUE9SVEVEX01FU1NBR0VfTEVOR1RIJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjYihlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZnJhZ21lbnRzLnB1c2goYnVmKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXRhTWVzc2FnZShjYik7XG4gICAgICBpZiAodGhpcy5fc3RhdGUgPT09IEdFVF9JTkZPKSB0aGlzLnN0YXJ0TG9vcChjYik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGRhdGEgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRhdGFNZXNzYWdlKGNiKSB7XG4gICAgaWYgKCF0aGlzLl9maW4pIHtcbiAgICAgIHRoaXMuX3N0YXRlID0gR0VUX0lORk87XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZUxlbmd0aCA9IHRoaXMuX21lc3NhZ2VMZW5ndGg7XG4gICAgY29uc3QgZnJhZ21lbnRzID0gdGhpcy5fZnJhZ21lbnRzO1xuXG4gICAgdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9mcmFnbWVudGVkID0gMDtcbiAgICB0aGlzLl9mcmFnbWVudHMgPSBbXTtcblxuICAgIGlmICh0aGlzLl9vcGNvZGUgPT09IDIpIHtcbiAgICAgIGxldCBkYXRhO1xuXG4gICAgICBpZiAodGhpcy5fYmluYXJ5VHlwZSA9PT0gJ25vZGVidWZmZXInKSB7XG4gICAgICAgIGRhdGEgPSBjb25jYXQoZnJhZ21lbnRzLCBtZXNzYWdlTGVuZ3RoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYmluYXJ5VHlwZSA9PT0gJ2FycmF5YnVmZmVyJykge1xuICAgICAgICBkYXRhID0gdG9BcnJheUJ1ZmZlcihjb25jYXQoZnJhZ21lbnRzLCBtZXNzYWdlTGVuZ3RoKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JpbmFyeVR5cGUgPT09ICdibG9iJykge1xuICAgICAgICBkYXRhID0gbmV3IEJsb2IoZnJhZ21lbnRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEgPSBmcmFnbWVudHM7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9hbGxvd1N5bmNocm9ub3VzRXZlbnRzKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIGRhdGEsIHRydWUpO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBERUZFUl9FVkVOVDtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBkYXRhLCB0cnVlKTtcbiAgICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xuICAgICAgICAgIHRoaXMuc3RhcnRMb29wKGNiKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IGNvbmNhdChmcmFnbWVudHMsIG1lc3NhZ2VMZW5ndGgpO1xuXG4gICAgICBpZiAoIXRoaXMuX3NraXBVVEY4VmFsaWRhdGlvbiAmJiAhaXNWYWxpZFVURjgoYnVmKSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgRXJyb3IsXG4gICAgICAgICAgJ2ludmFsaWQgVVRGLTggc2VxdWVuY2UnLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgMTAwNyxcbiAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfVVRGOCdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBJTkZMQVRJTkcgfHwgdGhpcy5fYWxsb3dTeW5jaHJvbm91c0V2ZW50cykge1xuICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBidWYsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gREVGRVJfRVZFTlQ7XG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdtZXNzYWdlJywgYnVmLCBmYWxzZSk7XG4gICAgICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgICAgICAgICB0aGlzLnN0YXJ0TG9vcChjYik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgY29udHJvbCBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBEYXRhIHRvIGhhbmRsZVxuICAgKiBAcmV0dXJuIHsoRXJyb3J8UmFuZ2VFcnJvcnx1bmRlZmluZWQpfSBBIHBvc3NpYmxlIGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb250cm9sTWVzc2FnZShkYXRhLCBjYikge1xuICAgIGlmICh0aGlzLl9vcGNvZGUgPT09IDB4MDgpIHtcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdCgnY29uY2x1ZGUnLCAxMDA1LCBFTVBUWV9CVUZGRVIpO1xuICAgICAgICB0aGlzLmVuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGRhdGEucmVhZFVJbnQxNkJFKDApO1xuXG4gICAgICAgIGlmICghaXNWYWxpZFN0YXR1c0NvZGUoY29kZSkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgICAgYGludmFsaWQgc3RhdHVzIGNvZGUgJHtjb2RlfWAsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgMTAwMixcbiAgICAgICAgICAgICdXU19FUlJfSU5WQUxJRF9DTE9TRV9DT0RFJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjYihlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVmID0gbmV3IEZhc3RCdWZmZXIoXG4gICAgICAgICAgZGF0YS5idWZmZXIsXG4gICAgICAgICAgZGF0YS5ieXRlT2Zmc2V0ICsgMixcbiAgICAgICAgICBkYXRhLmxlbmd0aCAtIDJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXRoaXMuX3NraXBVVEY4VmFsaWRhdGlvbiAmJiAhaXNWYWxpZFVURjgoYnVmKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICAgIEVycm9yLFxuICAgICAgICAgICAgJ2ludmFsaWQgVVRGLTggc2VxdWVuY2UnLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIDEwMDcsXG4gICAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfVVRGOCdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY2IoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbWl0KCdjb25jbHVkZScsIGNvZGUsIGJ1Zik7XG4gICAgICAgIHRoaXMuZW5kKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3N0YXRlID0gR0VUX0lORk87XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FsbG93U3luY2hyb25vdXNFdmVudHMpIHtcbiAgICAgIHRoaXMuZW1pdCh0aGlzLl9vcGNvZGUgPT09IDB4MDkgPyAncGluZycgOiAncG9uZycsIGRhdGEpO1xuICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3RhdGUgPSBERUZFUl9FVkVOVDtcbiAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLl9vcGNvZGUgPT09IDB4MDkgPyAncGluZycgOiAncG9uZycsIGRhdGEpO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xuICAgICAgICB0aGlzLnN0YXJ0TG9vcChjYik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuIGVycm9yIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6RXJyb3J8UmFuZ2VFcnJvcil9IEVycm9yQ3RvciBUaGUgZXJyb3IgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtCb29sZWFufSBwcmVmaXggU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGFkZCBhIGRlZmF1bHQgcHJlZml4IHRvXG4gICAqICAgICBgbWVzc2FnZWBcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgVGhlIHN0YXR1cyBjb2RlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBlcnJvckNvZGUgVGhlIGV4cG9zZWQgZXJyb3IgY29kZVxuICAgKiBAcmV0dXJuIHsoRXJyb3J8UmFuZ2VFcnJvcil9IFRoZSBlcnJvclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlRXJyb3IoRXJyb3JDdG9yLCBtZXNzYWdlLCBwcmVmaXgsIHN0YXR1c0NvZGUsIGVycm9yQ29kZSkge1xuICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICB0aGlzLl9lcnJvcmVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvckN0b3IoXG4gICAgICBwcmVmaXggPyBgSW52YWxpZCBXZWJTb2NrZXQgZnJhbWU6ICR7bWVzc2FnZX1gIDogbWVzc2FnZVxuICAgICk7XG5cbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIHRoaXMuY3JlYXRlRXJyb3IpO1xuICAgIGVyci5jb2RlID0gZXJyb3JDb2RlO1xuICAgIGVycltrU3RhdHVzQ29kZV0gPSBzdGF0dXNDb2RlO1xuICAgIHJldHVybiBlcnI7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWNlaXZlcjtcbiIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXkR1cGxleFwiIH1dICovXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBEdXBsZXggfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuY29uc3QgeyByYW5kb21GaWxsU3luYyB9ID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlID0gcmVxdWlyZSgnLi9wZXJtZXNzYWdlLWRlZmxhdGUnKTtcbmNvbnN0IHsgRU1QVFlfQlVGRkVSLCBrV2ViU29ja2V0LCBOT09QIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuY29uc3QgeyBpc0Jsb2IsIGlzVmFsaWRTdGF0dXNDb2RlIH0gPSByZXF1aXJlKCcuL3ZhbGlkYXRpb24nKTtcbmNvbnN0IHsgbWFzazogYXBwbHlNYXNrLCB0b0J1ZmZlciB9ID0gcmVxdWlyZSgnLi9idWZmZXItdXRpbCcpO1xuXG5jb25zdCBrQnl0ZUxlbmd0aCA9IFN5bWJvbCgna0J5dGVMZW5ndGgnKTtcbmNvbnN0IG1hc2tCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNCk7XG5jb25zdCBSQU5ET01fUE9PTF9TSVpFID0gOCAqIDEwMjQ7XG5sZXQgcmFuZG9tUG9vbDtcbmxldCByYW5kb21Qb29sUG9pbnRlciA9IFJBTkRPTV9QT09MX1NJWkU7XG5cbmNvbnN0IERFRkFVTFQgPSAwO1xuY29uc3QgREVGTEFUSU5HID0gMTtcbmNvbnN0IEdFVF9CTE9CX0RBVEEgPSAyO1xuXG4vKipcbiAqIEh5QmkgU2VuZGVyIGltcGxlbWVudGF0aW9uLlxuICovXG5jbGFzcyBTZW5kZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIFNlbmRlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgY29ubmVjdGlvbiBzb2NrZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtleHRlbnNpb25zXSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbmVnb3RpYXRlZCBleHRlbnNpb25zXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtnZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBtYXNraW5nXG4gICAqICAgICBrZXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNvY2tldCwgZXh0ZW5zaW9ucywgZ2VuZXJhdGVNYXNrKSB7XG4gICAgdGhpcy5fZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgfHwge307XG5cbiAgICBpZiAoZ2VuZXJhdGVNYXNrKSB7XG4gICAgICB0aGlzLl9nZW5lcmF0ZU1hc2sgPSBnZW5lcmF0ZU1hc2s7XG4gICAgICB0aGlzLl9tYXNrQnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIH1cblxuICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcblxuICAgIHRoaXMuX2ZpcnN0RnJhZ21lbnQgPSB0cnVlO1xuICAgIHRoaXMuX2NvbXByZXNzID0gZmFsc2U7XG5cbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzID0gMDtcbiAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIHRoaXMuX3N0YXRlID0gREVGQVVMVDtcbiAgICB0aGlzLm9uZXJyb3IgPSBOT09QO1xuICAgIHRoaXNba1dlYlNvY2tldF0gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRnJhbWVzIGEgcGllY2Ugb2YgZGF0YSBhY2NvcmRpbmcgdG8gdGhlIEh5QmkgV2ViU29ja2V0IHByb3RvY29sLlxuICAgKlxuICAgKiBAcGFyYW0geyhCdWZmZXJ8U3RyaW5nKX0gZGF0YSBUaGUgZGF0YSB0byBmcmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZpbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNldCB0aGVcbiAgICogICAgIEZJTiBiaXRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZ2VuZXJhdGVNYXNrXSBUaGUgZnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSB0aGVcbiAgICogICAgIG1hc2tpbmcga2V5XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWFzaz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2tcbiAgICogICAgIGBkYXRhYFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gW29wdGlvbnMubWFza0J1ZmZlcl0gVGhlIGJ1ZmZlciB1c2VkIHRvIHN0b3JlIHRoZSBtYXNraW5nXG4gICAqICAgICBrZXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMub3Bjb2RlIFRoZSBvcGNvZGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZWFkT25seT1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgYGRhdGFgIGNhbiBiZVxuICAgKiAgICAgbW9kaWZpZWRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yc3YxPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gc2V0IHRoZVxuICAgKiAgICAgUlNWMSBiaXRcbiAgICogQHJldHVybiB7KEJ1ZmZlcnxTdHJpbmcpW119IFRoZSBmcmFtZWQgZGF0YVxuICAgKiBAcHVibGljXG4gICAqL1xuICBzdGF0aWMgZnJhbWUoZGF0YSwgb3B0aW9ucykge1xuICAgIGxldCBtYXNrO1xuICAgIGxldCBtZXJnZSA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSAyO1xuICAgIGxldCBza2lwTWFza2luZyA9IGZhbHNlO1xuXG4gICAgaWYgKG9wdGlvbnMubWFzaykge1xuICAgICAgbWFzayA9IG9wdGlvbnMubWFza0J1ZmZlciB8fCBtYXNrQnVmZmVyO1xuXG4gICAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZU1hc2spIHtcbiAgICAgICAgb3B0aW9ucy5nZW5lcmF0ZU1hc2sobWFzayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmFuZG9tUG9vbFBvaW50ZXIgPT09IFJBTkRPTV9QT09MX1NJWkUpIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAgKi9cbiAgICAgICAgICBpZiAocmFuZG9tUG9vbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgYmVjYXVzZSBzZXJ2ZXItc2VudCBmcmFtZXMgbXVzdCBub3RcbiAgICAgICAgICAgIC8vIGJlIG1hc2tlZCBzbyBpdCBtYXkgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByYW5kb21Qb29sID0gQnVmZmVyLmFsbG9jKFJBTkRPTV9QT09MX1NJWkUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJhbmRvbUZpbGxTeW5jKHJhbmRvbVBvb2wsIDAsIFJBTkRPTV9QT09MX1NJWkUpO1xuICAgICAgICAgIHJhbmRvbVBvb2xQb2ludGVyID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hc2tbMF0gPSByYW5kb21Qb29sW3JhbmRvbVBvb2xQb2ludGVyKytdO1xuICAgICAgICBtYXNrWzFdID0gcmFuZG9tUG9vbFtyYW5kb21Qb29sUG9pbnRlcisrXTtcbiAgICAgICAgbWFza1syXSA9IHJhbmRvbVBvb2xbcmFuZG9tUG9vbFBvaW50ZXIrK107XG4gICAgICAgIG1hc2tbM10gPSByYW5kb21Qb29sW3JhbmRvbVBvb2xQb2ludGVyKytdO1xuICAgICAgfVxuXG4gICAgICBza2lwTWFza2luZyA9IChtYXNrWzBdIHwgbWFza1sxXSB8IG1hc2tbMl0gfCBtYXNrWzNdKSA9PT0gMDtcbiAgICAgIG9mZnNldCA9IDY7XG4gICAgfVxuXG4gICAgbGV0IGRhdGFMZW5ndGg7XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoXG4gICAgICAgICghb3B0aW9ucy5tYXNrIHx8IHNraXBNYXNraW5nKSAmJlxuICAgICAgICBvcHRpb25zW2tCeXRlTGVuZ3RoXSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgZGF0YUxlbmd0aCA9IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEpO1xuICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgIG1lcmdlID0gb3B0aW9ucy5tYXNrICYmIG9wdGlvbnMucmVhZE9ubHkgJiYgIXNraXBNYXNraW5nO1xuICAgIH1cblxuICAgIGxldCBwYXlsb2FkTGVuZ3RoID0gZGF0YUxlbmd0aDtcblxuICAgIGlmIChkYXRhTGVuZ3RoID49IDY1NTM2KSB7XG4gICAgICBvZmZzZXQgKz0gODtcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjc7XG4gICAgfSBlbHNlIGlmIChkYXRhTGVuZ3RoID4gMTI1KSB7XG4gICAgICBvZmZzZXQgKz0gMjtcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjY7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG1lcmdlID8gZGF0YUxlbmd0aCArIG9mZnNldCA6IG9mZnNldCk7XG5cbiAgICB0YXJnZXRbMF0gPSBvcHRpb25zLmZpbiA/IG9wdGlvbnMub3Bjb2RlIHwgMHg4MCA6IG9wdGlvbnMub3Bjb2RlO1xuICAgIGlmIChvcHRpb25zLnJzdjEpIHRhcmdldFswXSB8PSAweDQwO1xuXG4gICAgdGFyZ2V0WzFdID0gcGF5bG9hZExlbmd0aDtcblxuICAgIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjYpIHtcbiAgICAgIHRhcmdldC53cml0ZVVJbnQxNkJFKGRhdGFMZW5ndGgsIDIpO1xuICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI3KSB7XG4gICAgICB0YXJnZXRbMl0gPSB0YXJnZXRbM10gPSAwO1xuICAgICAgdGFyZ2V0LndyaXRlVUludEJFKGRhdGFMZW5ndGgsIDQsIDYpO1xuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5tYXNrKSByZXR1cm4gW3RhcmdldCwgZGF0YV07XG5cbiAgICB0YXJnZXRbMV0gfD0gMHg4MDtcbiAgICB0YXJnZXRbb2Zmc2V0IC0gNF0gPSBtYXNrWzBdO1xuICAgIHRhcmdldFtvZmZzZXQgLSAzXSA9IG1hc2tbMV07XG4gICAgdGFyZ2V0W29mZnNldCAtIDJdID0gbWFza1syXTtcbiAgICB0YXJnZXRbb2Zmc2V0IC0gMV0gPSBtYXNrWzNdO1xuXG4gICAgaWYgKHNraXBNYXNraW5nKSByZXR1cm4gW3RhcmdldCwgZGF0YV07XG5cbiAgICBpZiAobWVyZ2UpIHtcbiAgICAgIGFwcGx5TWFzayhkYXRhLCBtYXNrLCB0YXJnZXQsIG9mZnNldCwgZGF0YUxlbmd0aCk7XG4gICAgICByZXR1cm4gW3RhcmdldF07XG4gICAgfVxuXG4gICAgYXBwbHlNYXNrKGRhdGEsIG1hc2ssIGRhdGEsIDAsIGRhdGFMZW5ndGgpO1xuICAgIHJldHVybiBbdGFyZ2V0LCBkYXRhXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNsb3NlIG1lc3NhZ2UgdG8gdGhlIG90aGVyIHBlZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbY29kZV0gVGhlIHN0YXR1cyBjb2RlIGNvbXBvbmVudCBvZiB0aGUgYm9keVxuICAgKiBAcGFyYW0geyhTdHJpbmd8QnVmZmVyKX0gW2RhdGFdIFRoZSBtZXNzYWdlIGNvbXBvbmVudCBvZiB0aGUgYm9keVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayB0aGUgbWVzc2FnZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNsb3NlKGNvZGUsIGRhdGEsIG1hc2ssIGNiKSB7XG4gICAgbGV0IGJ1ZjtcblxuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJ1ZiA9IEVNUFRZX0JVRkZFUjtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2RlICE9PSAnbnVtYmVyJyB8fCAhaXNWYWxpZFN0YXR1c0NvZGUoY29kZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSB2YWxpZCBlcnJvciBjb2RlIG51bWJlcicpO1xuICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkIHx8ICFkYXRhLmxlbmd0aCkge1xuICAgICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIpO1xuICAgICAgYnVmLndyaXRlVUludDE2QkUoY29kZSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpO1xuXG4gICAgICBpZiAobGVuZ3RoID4gMTIzKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgbWVzc2FnZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gMTIzIGJ5dGVzJyk7XG4gICAgICB9XG5cbiAgICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyICsgbGVuZ3RoKTtcbiAgICAgIGJ1Zi53cml0ZVVJbnQxNkJFKGNvZGUsIDApO1xuXG4gICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGJ1Zi53cml0ZShkYXRhLCAyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1Zi5zZXQoZGF0YSwgMik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIFtrQnl0ZUxlbmd0aF06IGJ1Zi5sZW5ndGgsXG4gICAgICBmaW46IHRydWUsXG4gICAgICBnZW5lcmF0ZU1hc2s6IHRoaXMuX2dlbmVyYXRlTWFzayxcbiAgICAgIG1hc2ssXG4gICAgICBtYXNrQnVmZmVyOiB0aGlzLl9tYXNrQnVmZmVyLFxuICAgICAgb3Bjb2RlOiAweDA4LFxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgcnN2MTogZmFsc2VcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XG4gICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGJ1ZiwgZmFsc2UsIG9wdGlvbnMsIGNiXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShidWYsIG9wdGlvbnMpLCBjYik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgcGluZyBtZXNzYWdlIHRvIHRoZSBvdGhlciBwZWVyLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1lc3NhZ2UgdG8gc2VuZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBwaW5nKGRhdGEsIG1hc2ssIGNiKSB7XG4gICAgbGV0IGJ5dGVMZW5ndGg7XG4gICAgbGV0IHJlYWRPbmx5O1xuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgYnl0ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpO1xuICAgICAgcmVhZE9ubHkgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGlzQmxvYihkYXRhKSkge1xuICAgICAgYnl0ZUxlbmd0aCA9IGRhdGEuc2l6ZTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSB0b0J1ZmZlcihkYXRhKTtcbiAgICAgIGJ5dGVMZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgIHJlYWRPbmx5ID0gdG9CdWZmZXIucmVhZE9ubHk7XG4gICAgfVxuXG4gICAgaWYgKGJ5dGVMZW5ndGggPiAxMjUpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgZGF0YSBzaXplIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiAxMjUgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgW2tCeXRlTGVuZ3RoXTogYnl0ZUxlbmd0aCxcbiAgICAgIGZpbjogdHJ1ZSxcbiAgICAgIGdlbmVyYXRlTWFzazogdGhpcy5fZ2VuZXJhdGVNYXNrLFxuICAgICAgbWFzayxcbiAgICAgIG1hc2tCdWZmZXI6IHRoaXMuX21hc2tCdWZmZXIsXG4gICAgICBvcGNvZGU6IDB4MDksXG4gICAgICByZWFkT25seSxcbiAgICAgIHJzdjE6IGZhbHNlXG4gICAgfTtcblxuICAgIGlmIChpc0Jsb2IoZGF0YSkpIHtcbiAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gREVGQVVMVCkge1xuICAgICAgICB0aGlzLmVucXVldWUoW3RoaXMuZ2V0QmxvYkRhdGEsIGRhdGEsIGZhbHNlLCBvcHRpb25zLCBjYl0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZXRCbG9iRGF0YShkYXRhLCBmYWxzZSwgb3B0aW9ucywgY2IpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5fc3RhdGUgIT09IERFRkFVTFQpIHtcbiAgICAgIHRoaXMuZW5xdWV1ZShbdGhpcy5kaXNwYXRjaCwgZGF0YSwgZmFsc2UsIG9wdGlvbnMsIGNiXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShkYXRhLCBvcHRpb25zKSwgY2IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIHBvbmcgbWVzc2FnZSB0byB0aGUgb3RoZXIgcGVlci5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXNzYWdlIHRvIHNlbmRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbbWFzaz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2sgYGRhdGFgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcG9uZyhkYXRhLCBtYXNrLCBjYikge1xuICAgIGxldCBieXRlTGVuZ3RoO1xuICAgIGxldCByZWFkT25seTtcblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc0Jsb2IoZGF0YSkpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBkYXRhLnNpemU7XG4gICAgICByZWFkT25seSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gdG9CdWZmZXIoZGF0YSk7XG4gICAgICBieXRlTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICByZWFkT25seSA9IHRvQnVmZmVyLnJlYWRPbmx5O1xuICAgIH1cblxuICAgIGlmIChieXRlTGVuZ3RoID4gMTI1KSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIGRhdGEgc2l6ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gMTI1IGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIFtrQnl0ZUxlbmd0aF06IGJ5dGVMZW5ndGgsXG4gICAgICBmaW46IHRydWUsXG4gICAgICBnZW5lcmF0ZU1hc2s6IHRoaXMuX2dlbmVyYXRlTWFzayxcbiAgICAgIG1hc2ssXG4gICAgICBtYXNrQnVmZmVyOiB0aGlzLl9tYXNrQnVmZmVyLFxuICAgICAgb3Bjb2RlOiAweDBhLFxuICAgICAgcmVhZE9ubHksXG4gICAgICByc3YxOiBmYWxzZVxuICAgIH07XG5cbiAgICBpZiAoaXNCbG9iKGRhdGEpKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUgIT09IERFRkFVTFQpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlKFt0aGlzLmdldEJsb2JEYXRhLCBkYXRhLCBmYWxzZSwgb3B0aW9ucywgY2JdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0QmxvYkRhdGEoZGF0YSwgZmFsc2UsIG9wdGlvbnMsIGNiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XG4gICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGRhdGEsIGZhbHNlLCBvcHRpb25zLCBjYl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbmRGcmFtZShTZW5kZXIuZnJhbWUoZGF0YSwgb3B0aW9ucyksIGNiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBkYXRhIG1lc3NhZ2UgdG8gdGhlIG90aGVyIHBlZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWVzc2FnZSB0byBzZW5kXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYmluYXJ5PWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBgZGF0YWAgaXMgYmluYXJ5XG4gICAqICAgICBvciB0ZXh0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY29tcHJlc3M9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0b1xuICAgKiAgICAgY29tcHJlc3MgYGRhdGFgXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZmluPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciB0aGUgZnJhZ21lbnQgaXMgdGhlXG4gICAqICAgICBsYXN0IG9uZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1hc2s9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBzZW5kKGRhdGEsIG9wdGlvbnMsIGNiKSB7XG4gICAgY29uc3QgcGVyTWVzc2FnZURlZmxhdGUgPSB0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdO1xuICAgIGxldCBvcGNvZGUgPSBvcHRpb25zLmJpbmFyeSA/IDIgOiAxO1xuICAgIGxldCByc3YxID0gb3B0aW9ucy5jb21wcmVzcztcblxuICAgIGxldCBieXRlTGVuZ3RoO1xuICAgIGxldCByZWFkT25seTtcblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc0Jsb2IoZGF0YSkpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBkYXRhLnNpemU7XG4gICAgICByZWFkT25seSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gdG9CdWZmZXIoZGF0YSk7XG4gICAgICBieXRlTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICByZWFkT25seSA9IHRvQnVmZmVyLnJlYWRPbmx5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9maXJzdEZyYWdtZW50KSB7XG4gICAgICB0aGlzLl9maXJzdEZyYWdtZW50ID0gZmFsc2U7XG4gICAgICBpZiAoXG4gICAgICAgIHJzdjEgJiZcbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUgJiZcbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUucGFyYW1zW1xuICAgICAgICAgIHBlck1lc3NhZ2VEZWZsYXRlLl9pc1NlcnZlclxuICAgICAgICAgICAgPyAnc2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXInXG4gICAgICAgICAgICA6ICdjbGllbnRfbm9fY29udGV4dF90YWtlb3ZlcidcbiAgICAgICAgXVxuICAgICAgKSB7XG4gICAgICAgIHJzdjEgPSBieXRlTGVuZ3RoID49IHBlck1lc3NhZ2VEZWZsYXRlLl90aHJlc2hvbGQ7XG4gICAgICB9XG4gICAgICB0aGlzLl9jb21wcmVzcyA9IHJzdjE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJzdjEgPSBmYWxzZTtcbiAgICAgIG9wY29kZSA9IDA7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZmluKSB0aGlzLl9maXJzdEZyYWdtZW50ID0gdHJ1ZTtcblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBba0J5dGVMZW5ndGhdOiBieXRlTGVuZ3RoLFxuICAgICAgZmluOiBvcHRpb25zLmZpbixcbiAgICAgIGdlbmVyYXRlTWFzazogdGhpcy5fZ2VuZXJhdGVNYXNrLFxuICAgICAgbWFzazogb3B0aW9ucy5tYXNrLFxuICAgICAgbWFza0J1ZmZlcjogdGhpcy5fbWFza0J1ZmZlcixcbiAgICAgIG9wY29kZSxcbiAgICAgIHJlYWRPbmx5LFxuICAgICAgcnN2MVxuICAgIH07XG5cbiAgICBpZiAoaXNCbG9iKGRhdGEpKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUgIT09IERFRkFVTFQpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlKFt0aGlzLmdldEJsb2JEYXRhLCBkYXRhLCB0aGlzLl9jb21wcmVzcywgb3B0cywgY2JdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0QmxvYkRhdGEoZGF0YSwgdGhpcy5fY29tcHJlc3MsIG9wdHMsIGNiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XG4gICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGRhdGEsIHRoaXMuX2NvbXByZXNzLCBvcHRzLCBjYl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BhdGNoKGRhdGEsIHRoaXMuX2NvbXByZXNzLCBvcHRzLCBjYik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbnRlbnRzIG9mIGEgYmxvYiBhcyBiaW5hcnkgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtCbG9ifSBibG9iIFRoZSBibG9iXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2NvbXByZXNzPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gY29tcHJlc3NcbiAgICogICAgIHRoZSBkYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZmluPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gc2V0IHRoZVxuICAgKiAgICAgRklOIGJpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5nZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZVxuICAgKiAgICAgbWFza2luZyBrZXlcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFza1xuICAgKiAgICAgYGRhdGFgXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBbb3B0aW9ucy5tYXNrQnVmZmVyXSBUaGUgYnVmZmVyIHVzZWQgdG8gc3RvcmUgdGhlIG1hc2tpbmdcbiAgICogICAgIGtleVxuICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5vcGNvZGUgVGhlIG9wY29kZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJlYWRPbmx5PWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBgZGF0YWAgY2FuIGJlXG4gICAqICAgICBtb2RpZmllZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJzdjE9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBzZXQgdGhlXG4gICAqICAgICBSU1YxIGJpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRCbG9iRGF0YShibG9iLCBjb21wcmVzcywgb3B0aW9ucywgY2IpIHtcbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzICs9IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgIHRoaXMuX3N0YXRlID0gR0VUX0JMT0JfREFUQTtcblxuICAgIGJsb2JcbiAgICAgIC5hcnJheUJ1ZmZlcigpXG4gICAgICAudGhlbigoYXJyYXlCdWZmZXIpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVGhlIHNvY2tldCB3YXMgY2xvc2VkIHdoaWxlIHRoZSBibG9iIHdhcyBiZWluZyByZWFkJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIGBjYWxsQ2FsbGJhY2tzYCBpcyBjYWxsZWQgaW4gdGhlIG5leHQgdGljayB0byBlbnN1cmUgdGhhdCBlcnJvcnNcbiAgICAgICAgICAvLyB0aGF0IG1pZ2h0IGJlIHRocm93biBpbiB0aGUgY2FsbGJhY2tzIGJlaGF2ZSBsaWtlIGVycm9ycyB0aHJvd25cbiAgICAgICAgICAvLyBvdXRzaWRlIHRoZSBwcm9taXNlIGNoYWluLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsQ2FsbGJhY2tzLCB0aGlzLCBlcnIsIGNiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgICAgICBjb25zdCBkYXRhID0gdG9CdWZmZXIoYXJyYXlCdWZmZXIpO1xuXG4gICAgICAgIGlmICghY29tcHJlc3MpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0ZSA9IERFRkFVTFQ7XG4gICAgICAgICAgdGhpcy5zZW5kRnJhbWUoU2VuZGVyLmZyYW1lKGRhdGEsIG9wdGlvbnMpLCBjYik7XG4gICAgICAgICAgdGhpcy5kZXF1ZXVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaChkYXRhLCBjb21wcmVzcywgb3B0aW9ucywgY2IpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gYG9uRXJyb3JgIGlzIGNhbGxlZCBpbiB0aGUgbmV4dCB0aWNrIGZvciB0aGUgc2FtZSByZWFzb24gdGhhdFxuICAgICAgICAvLyBgY2FsbENhbGxiYWNrc2AgYWJvdmUgaXMuXG4gICAgICAgIC8vXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2sob25FcnJvciwgdGhpcywgZXJyLCBjYik7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGEgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHsoQnVmZmVyfFN0cmluZyl9IGRhdGEgVGhlIG1lc3NhZ2UgdG8gc2VuZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtjb21wcmVzcz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGNvbXByZXNzXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5maW49ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBzZXQgdGhlXG4gICAqICAgICBGSU4gYml0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmdlbmVyYXRlTWFza10gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgdGhlXG4gICAqICAgICBtYXNraW5nIGtleVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1hc2s9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtCdWZmZXJ9IFtvcHRpb25zLm1hc2tCdWZmZXJdIFRoZSBidWZmZXIgdXNlZCB0byBzdG9yZSB0aGUgbWFza2luZ1xuICAgKiAgICAga2V5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLm9wY29kZSBUaGUgb3Bjb2RlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmVhZE9ubHk9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIGBkYXRhYCBjYW4gYmVcbiAgICogICAgIG1vZGlmaWVkXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucnN2MT1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNldCB0aGVcbiAgICogICAgIFJTVjEgYml0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRpc3BhdGNoKGRhdGEsIGNvbXByZXNzLCBvcHRpb25zLCBjYikge1xuICAgIGlmICghY29tcHJlc3MpIHtcbiAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShkYXRhLCBvcHRpb25zKSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBlck1lc3NhZ2VEZWZsYXRlID0gdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXTtcblxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gb3B0aW9uc1trQnl0ZUxlbmd0aF07XG4gICAgdGhpcy5fc3RhdGUgPSBERUZMQVRJTkc7XG4gICAgcGVyTWVzc2FnZURlZmxhdGUuY29tcHJlc3MoZGF0YSwgb3B0aW9ucy5maW4sIChfLCBidWYpID0+IHtcbiAgICAgIGlmICh0aGlzLl9zb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAnVGhlIHNvY2tldCB3YXMgY2xvc2VkIHdoaWxlIGRhdGEgd2FzIGJlaW5nIGNvbXByZXNzZWQnXG4gICAgICAgICk7XG5cbiAgICAgICAgY2FsbENhbGxiYWNrcyh0aGlzLCBlcnIsIGNiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgICAgdGhpcy5fc3RhdGUgPSBERUZBVUxUO1xuICAgICAgb3B0aW9ucy5yZWFkT25seSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZW5kRnJhbWUoU2VuZGVyLmZyYW1lKGJ1Ziwgb3B0aW9ucyksIGNiKTtcbiAgICAgIHRoaXMuZGVxdWV1ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHF1ZXVlZCBzZW5kIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZXF1ZXVlKCkge1xuICAgIHdoaWxlICh0aGlzLl9zdGF0ZSA9PT0gREVGQVVMVCAmJiB0aGlzLl9xdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgLT0gcGFyYW1zWzNdW2tCeXRlTGVuZ3RoXTtcbiAgICAgIFJlZmxlY3QuYXBwbHkocGFyYW1zWzBdLCB0aGlzLCBwYXJhbXMuc2xpY2UoMSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIHNlbmQgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMgU2VuZCBvcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVucXVldWUocGFyYW1zKSB7XG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyArPSBwYXJhbXNbM11ba0J5dGVMZW5ndGhdO1xuICAgIHRoaXMuX3F1ZXVlLnB1c2gocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGZyYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcltdfSBsaXN0IFRoZSBmcmFtZSB0byBzZW5kXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbmRGcmFtZShsaXN0LCBjYikge1xuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMikge1xuICAgICAgdGhpcy5fc29ja2V0LmNvcmsoKTtcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzBdKTtcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzFdLCBjYik7XG4gICAgICB0aGlzLl9zb2NrZXQudW5jb3JrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzBdLCBjYik7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2VuZGVyO1xuXG4vKipcbiAqIENhbGxzIHF1ZXVlZCBjYWxsYmFja3Mgd2l0aCBhbiBlcnJvci5cbiAqXG4gKiBAcGFyYW0ge1NlbmRlcn0gc2VuZGVyIFRoZSBgU2VuZGVyYCBpbnN0YW5jZVxuICogQHBhcmFtIHtFcnJvcn0gZXJyIFRoZSBlcnJvciB0byBjYWxsIHRoZSBjYWxsYmFja3Mgd2l0aFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBUaGUgZmlyc3QgY2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGxDYWxsYmFja3Moc2VuZGVyLCBlcnIsIGNiKSB7XG4gIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIGNiKGVycik7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZW5kZXIuX3F1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcGFyYW1zID0gc2VuZGVyLl9xdWV1ZVtpXTtcbiAgICBjb25zdCBjYWxsYmFjayA9IHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjayhlcnIpO1xuICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyBhIGBTZW5kZXJgIGVycm9yLlxuICpcbiAqIEBwYXJhbSB7U2VuZGVyfSBzZW5kZXIgVGhlIGBTZW5kZXJgIGluc3RhbmNlXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnIgVGhlIGVycm9yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIFRoZSBmaXJzdCBwZW5kaW5nIGNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBvbkVycm9yKHNlbmRlciwgZXJyLCBjYikge1xuICBjYWxsQ2FsbGJhY2tzKHNlbmRlciwgZXJyLCBjYik7XG4gIHNlbmRlci5vbmVycm9yKGVycik7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgRHVwbGV4IH0gPSByZXF1aXJlKCdzdHJlYW0nKTtcblxuLyoqXG4gKiBFbWl0cyB0aGUgYCdjbG9zZSdgIGV2ZW50IG9uIGEgc3RyZWFtLlxuICpcbiAqIEBwYXJhbSB7RHVwbGV4fSBzdHJlYW0gVGhlIHN0cmVhbS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGVtaXRDbG9zZShzdHJlYW0pIHtcbiAgc3RyZWFtLmVtaXQoJ2Nsb3NlJyk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgJ2VuZCdgIGV2ZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGR1cGxleE9uRW5kKCkge1xuICBpZiAoIXRoaXMuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQpIHtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyciBUaGUgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGR1cGxleE9uRXJyb3IoZXJyKSB7XG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZHVwbGV4T25FcnJvcik7XG4gIHRoaXMuZGVzdHJveSgpO1xuICBpZiAodGhpcy5saXN0ZW5lckNvdW50KCdlcnJvcicpID09PSAwKSB7XG4gICAgLy8gRG8gbm90IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvci5cbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXBzIGEgYFdlYlNvY2tldGAgaW4gYSBkdXBsZXggc3RyZWFtLlxuICpcbiAqIEBwYXJhbSB7V2ViU29ja2V0fSB3cyBUaGUgYFdlYlNvY2tldGAgdG8gd3JhcFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBmb3IgdGhlIGBEdXBsZXhgIGNvbnN0cnVjdG9yXG4gKiBAcmV0dXJuIHtEdXBsZXh9IFRoZSBkdXBsZXggc3RyZWFtXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFN0cmVhbSh3cywgb3B0aW9ucykge1xuICBsZXQgdGVybWluYXRlT25EZXN0cm95ID0gdHJ1ZTtcblxuICBjb25zdCBkdXBsZXggPSBuZXcgRHVwbGV4KHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGF1dG9EZXN0cm95OiBmYWxzZSxcbiAgICBlbWl0Q2xvc2U6IGZhbHNlLFxuICAgIG9iamVjdE1vZGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlT2JqZWN0TW9kZTogZmFsc2VcbiAgfSk7XG5cbiAgd3Mub24oJ21lc3NhZ2UnLCBmdW5jdGlvbiBtZXNzYWdlKG1zZywgaXNCaW5hcnkpIHtcbiAgICBjb25zdCBkYXRhID1cbiAgICAgICFpc0JpbmFyeSAmJiBkdXBsZXguX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZSA/IG1zZy50b1N0cmluZygpIDogbXNnO1xuXG4gICAgaWYgKCFkdXBsZXgucHVzaChkYXRhKSkgd3MucGF1c2UoKTtcbiAgfSk7XG5cbiAgd3Mub25jZSgnZXJyb3InLCBmdW5jdGlvbiBlcnJvcihlcnIpIHtcbiAgICBpZiAoZHVwbGV4LmRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgLy8gUHJldmVudCBgd3MudGVybWluYXRlKClgIGZyb20gYmVpbmcgY2FsbGVkIGJ5IGBkdXBsZXguX2Rlc3Ryb3koKWAuXG4gICAgLy9cbiAgICAvLyAtIElmIHRoZSBgJ2Vycm9yJ2AgZXZlbnQgaXMgZW1pdHRlZCBiZWZvcmUgdGhlIGAnb3BlbidgIGV2ZW50LCB0aGVuXG4gICAgLy8gICBgd3MudGVybWluYXRlKClgIGlzIGEgbm9vcCBhcyBubyBzb2NrZXQgaXMgYXNzaWduZWQuXG4gICAgLy8gLSBPdGhlcndpc2UsIHRoZSBlcnJvciBpcyByZS1lbWl0dGVkIGJ5IHRoZSBsaXN0ZW5lciBvZiB0aGUgYCdlcnJvcidgXG4gICAgLy8gICBldmVudCBvZiB0aGUgYFJlY2VpdmVyYCBvYmplY3QuIFRoZSBsaXN0ZW5lciBhbHJlYWR5IGNsb3NlcyB0aGVcbiAgICAvLyAgIGNvbm5lY3Rpb24gYnkgY2FsbGluZyBgd3MuY2xvc2UoKWAuIFRoaXMgYWxsb3dzIGEgY2xvc2UgZnJhbWUgdG8gYmVcbiAgICAvLyAgIHNlbnQgdG8gdGhlIG90aGVyIHBlZXIuIElmIGB3cy50ZXJtaW5hdGUoKWAgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHRoaXMsXG4gICAgLy8gICB0aGVuIHRoZSBjbG9zZSBmcmFtZSBtaWdodCBub3QgYmUgc2VudC5cbiAgICB0ZXJtaW5hdGVPbkRlc3Ryb3kgPSBmYWxzZTtcbiAgICBkdXBsZXguZGVzdHJveShlcnIpO1xuICB9KTtcblxuICB3cy5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIGlmIChkdXBsZXguZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBkdXBsZXgucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgZHVwbGV4Ll9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAod3MucmVhZHlTdGF0ZSA9PT0gd3MuQ0xPU0VEKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIGR1cGxleCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuXG4gICAgd3Mub25jZSgnZXJyb3InLCBmdW5jdGlvbiBlcnJvcihlcnIpIHtcbiAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH0pO1xuXG4gICAgd3Mub25jZSgnY2xvc2UnLCBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIGlmICghY2FsbGVkKSBjYWxsYmFjayhlcnIpO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIGR1cGxleCk7XG4gICAgfSk7XG5cbiAgICBpZiAodGVybWluYXRlT25EZXN0cm95KSB3cy50ZXJtaW5hdGUoKTtcbiAgfTtcblxuICBkdXBsZXguX2ZpbmFsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgaWYgKHdzLnJlYWR5U3RhdGUgPT09IHdzLkNPTk5FQ1RJTkcpIHtcbiAgICAgIHdzLm9uY2UoJ29wZW4nLCBmdW5jdGlvbiBvcGVuKCkge1xuICAgICAgICBkdXBsZXguX2ZpbmFsKGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB2YWx1ZSBvZiB0aGUgYF9zb2NrZXRgIHByb3BlcnR5IGlzIGBudWxsYCBpdCBtZWFucyB0aGF0IGB3c2AgaXMgYVxuICAgIC8vIGNsaWVudCB3ZWJzb2NrZXQgYW5kIHRoZSBoYW5kc2hha2UgZmFpbGVkLiBJbiBmYWN0LCB3aGVuIHRoaXMgaGFwcGVucywgYVxuICAgIC8vIHNvY2tldCBpcyBuZXZlciBhc3NpZ25lZCB0byB0aGUgd2Vic29ja2V0LiBXYWl0IGZvciB0aGUgYCdlcnJvcidgIGV2ZW50XG4gICAgLy8gdGhhdCB3aWxsIGJlIGVtaXR0ZWQgYnkgdGhlIHdlYnNvY2tldC5cbiAgICBpZiAod3MuX3NvY2tldCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgaWYgKHdzLl9zb2NrZXQuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQpIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgICBpZiAoZHVwbGV4Ll9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIGR1cGxleC5kZXN0cm95KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdzLl9zb2NrZXQub25jZSgnZmluaXNoJywgZnVuY3Rpb24gZmluaXNoKCkge1xuICAgICAgICAvLyBgZHVwbGV4YCBpcyBub3QgZGVzdHJveWVkIGhlcmUgYmVjYXVzZSB0aGUgYCdlbmQnYCBldmVudCB3aWxsIGJlXG4gICAgICAgIC8vIGVtaXR0ZWQgb24gYGR1cGxleGAgYWZ0ZXIgdGhpcyBgJ2ZpbmlzaCdgIGV2ZW50LiBUaGUgRU9GIHNpZ25hbGluZ1xuICAgICAgICAvLyBgbnVsbGAgY2h1bmsgaXMsIGluIGZhY3QsIHB1c2hlZCB3aGVuIHRoZSB3ZWJzb2NrZXQgZW1pdHMgYCdjbG9zZSdgLlxuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgICB3cy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICBkdXBsZXguX3JlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHdzLmlzUGF1c2VkKSB3cy5yZXN1bWUoKTtcbiAgfTtcblxuICBkdXBsZXguX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAod3MucmVhZHlTdGF0ZSA9PT0gd3MuQ09OTkVDVElORykge1xuICAgICAgd3Mub25jZSgnb3BlbicsIGZ1bmN0aW9uIG9wZW4oKSB7XG4gICAgICAgIGR1cGxleC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3cy5zZW5kKGNodW5rLCBjYWxsYmFjayk7XG4gIH07XG5cbiAgZHVwbGV4Lm9uKCdlbmQnLCBkdXBsZXhPbkVuZCk7XG4gIGR1cGxleC5vbignZXJyb3InLCBkdXBsZXhPbkVycm9yKTtcbiAgcmV0dXJuIGR1cGxleDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVXZWJTb2NrZXRTdHJlYW07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgdG9rZW5DaGFycyB9ID0gcmVxdWlyZSgnLi92YWxpZGF0aW9uJyk7XG5cbi8qKlxuICogUGFyc2VzIHRoZSBgU2VjLVdlYlNvY2tldC1Qcm90b2NvbGAgaGVhZGVyIGludG8gYSBzZXQgb2Ygc3VicHJvdG9jb2wgbmFtZXMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlciBUaGUgZmllbGQgdmFsdWUgb2YgdGhlIGhlYWRlclxuICogQHJldHVybiB7U2V0fSBUaGUgc3VicHJvdG9jb2wgbmFtZXNcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gcGFyc2UoaGVhZGVyKSB7XG4gIGNvbnN0IHByb3RvY29scyA9IG5ldyBTZXQoKTtcbiAgbGV0IHN0YXJ0ID0gLTE7XG4gIGxldCBlbmQgPSAtMTtcbiAgbGV0IGkgPSAwO1xuXG4gIGZvciAoaTsgaSA8IGhlYWRlci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBoZWFkZXIuY2hhckNvZGVBdChpKTtcblxuICAgIGlmIChlbmQgPT09IC0xICYmIHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcbiAgICAgIGlmIChzdGFydCA9PT0gLTEpIHN0YXJ0ID0gaTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgaSAhPT0gMCAmJlxuICAgICAgKGNvZGUgPT09IDB4MjAgLyogJyAnICovIHx8IGNvZGUgPT09IDB4MDkpIC8qICdcXHQnICovXG4gICAgKSB7XG4gICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XG4gICAgfSBlbHNlIGlmIChjb2RlID09PSAweDJjIC8qICcsJyAqLykge1xuICAgICAgaWYgKHN0YXJ0ID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuZCA9PT0gLTEpIGVuZCA9IGk7XG5cbiAgICAgIGNvbnN0IHByb3RvY29sID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gICAgICBpZiAocHJvdG9jb2xzLmhhcyhwcm90b2NvbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBUaGUgXCIke3Byb3RvY29sfVwiIHN1YnByb3RvY29sIGlzIGR1cGxpY2F0ZWRgKTtcbiAgICAgIH1cblxuICAgICAgcHJvdG9jb2xzLmFkZChwcm90b2NvbCk7XG4gICAgICBzdGFydCA9IGVuZCA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGVuZCAhPT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Jyk7XG4gIH1cblxuICBjb25zdCBwcm90b2NvbCA9IGhlYWRlci5zbGljZShzdGFydCwgaSk7XG5cbiAgaWYgKHByb3RvY29scy5oYXMocHJvdG9jb2wpKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBUaGUgXCIke3Byb3RvY29sfVwiIHN1YnByb3RvY29sIGlzIGR1cGxpY2F0ZWRgKTtcbiAgfVxuXG4gIHByb3RvY29scy5hZGQocHJvdG9jb2wpO1xuICByZXR1cm4gcHJvdG9jb2xzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgcGFyc2UgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBpc1V0ZjggfSA9IHJlcXVpcmUoJ2J1ZmZlcicpO1xuXG5jb25zdCB7IGhhc0Jsb2IgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbi8vXG4vLyBBbGxvd2VkIHRva2VuIGNoYXJhY3RlcnM6XG4vL1xuLy8gJyEnLCAnIycsICckJywgJyUnLCAnJicsICcnJywgJyonLCAnKycsICctJyxcbi8vICcuJywgMC05LCBBLVosICdeJywgJ18nLCAnYCcsIGEteiwgJ3wnLCAnfidcbi8vXG4vLyB0b2tlbkNoYXJzWzMyXSA9PT0gMCAvLyAnICdcbi8vIHRva2VuQ2hhcnNbMzNdID09PSAxIC8vICchJ1xuLy8gdG9rZW5DaGFyc1szNF0gPT09IDAgLy8gJ1wiJ1xuLy8gLi4uXG4vL1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCB0b2tlbkNoYXJzID0gW1xuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAwIC0gMTVcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gMTYgLSAzMVxuICAwLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAvLyAzMiAtIDQ3XG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDQ4IC0gNjNcbiAgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gNjQgLSA3OVxuICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAxLCAvLyA4MCAtIDk1XG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vIDk2IC0gMTExXG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIDAgLy8gMTEyIC0gMTI3XG5dO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHN0YXR1cyBjb2RlIGlzIGFsbG93ZWQgaW4gYSBjbG9zZSBmcmFtZS5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gY29kZSBUaGUgc3RhdHVzIGNvZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgc3RhdHVzIGNvZGUgaXMgdmFsaWQsIGVsc2UgYGZhbHNlYFxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBpc1ZhbGlkU3RhdHVzQ29kZShjb2RlKSB7XG4gIHJldHVybiAoXG4gICAgKGNvZGUgPj0gMTAwMCAmJlxuICAgICAgY29kZSA8PSAxMDE0ICYmXG4gICAgICBjb2RlICE9PSAxMDA0ICYmXG4gICAgICBjb2RlICE9PSAxMDA1ICYmXG4gICAgICBjb2RlICE9PSAxMDA2KSB8fFxuICAgIChjb2RlID49IDMwMDAgJiYgY29kZSA8PSA0OTk5KVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIGJ1ZmZlciBjb250YWlucyBvbmx5IGNvcnJlY3QgVVRGLTguXG4gKiBQb3J0ZWQgZnJvbSBodHRwczovL3d3dy5jbC5jYW0uYWMudWsvJTdFbWdrMjUvdWNzL3V0ZjhfY2hlY2suYyBieVxuICogTWFya3VzIEt1aG4uXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZiBUaGUgYnVmZmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYGJ1ZmAgY29udGFpbnMgb25seSBjb3JyZWN0IFVURi04LCBlbHNlIGBmYWxzZWBcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gX2lzVmFsaWRVVEY4KGJ1Zikge1xuICBjb25zdCBsZW4gPSBidWYubGVuZ3RoO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBpZiAoKGJ1ZltpXSAmIDB4ODApID09PSAwKSB7XG4gICAgICAvLyAweHh4eHh4eFxuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZTApID09PSAweGMwKSB7XG4gICAgICAvLyAxMTB4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMSA9PT0gbGVuIHx8XG4gICAgICAgIChidWZbaSArIDFdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSAmIDB4ZmUpID09PSAweGMwIC8vIE92ZXJsb25nXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpICs9IDI7XG4gICAgfSBlbHNlIGlmICgoYnVmW2ldICYgMHhmMCkgPT09IDB4ZTApIHtcbiAgICAgIC8vIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4XG4gICAgICBpZiAoXG4gICAgICAgIGkgKyAyID49IGxlbiB8fFxuICAgICAgICAoYnVmW2kgKyAxXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaSArIDJdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSA9PT0gMHhlMCAmJiAoYnVmW2kgKyAxXSAmIDB4ZTApID09PSAweDgwKSB8fCAvLyBPdmVybG9uZ1xuICAgICAgICAoYnVmW2ldID09PSAweGVkICYmIChidWZbaSArIDFdICYgMHhlMCkgPT09IDB4YTApIC8vIFN1cnJvZ2F0ZSAoVStEODAwIC0gVStERkZGKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSArPSAzO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZjgpID09PSAweGYwKSB7XG4gICAgICAvLyAxMTExMHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMyA+PSBsZW4gfHxcbiAgICAgICAgKGJ1ZltpICsgMV0gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICAoYnVmW2kgKyAyXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaSArIDNdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSA9PT0gMHhmMCAmJiAoYnVmW2kgKyAxXSAmIDB4ZjApID09PSAweDgwKSB8fCAvLyBPdmVybG9uZ1xuICAgICAgICAoYnVmW2ldID09PSAweGY0ICYmIGJ1ZltpICsgMV0gPiAweDhmKSB8fFxuICAgICAgICBidWZbaV0gPiAweGY0IC8vID4gVSsxMEZGRkZcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGkgKz0gNDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHZhbHVlIGlzIGEgYEJsb2JgLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHRlc3RlZFxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBgQmxvYmAsIGVsc2UgYGZhbHNlYFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNCbG9iKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgaGFzQmxvYiAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgdmFsdWUuYXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUudHlwZSA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2YgdmFsdWUuc3RyZWFtID09PSAnZnVuY3Rpb24nICYmXG4gICAgKHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdCbG9iJyB8fFxuICAgICAgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0ZpbGUnKVxuICApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNCbG9iLFxuICBpc1ZhbGlkU3RhdHVzQ29kZSxcbiAgaXNWYWxpZFVURjg6IF9pc1ZhbGlkVVRGOCxcbiAgdG9rZW5DaGFyc1xufTtcblxuaWYgKGlzVXRmOCkge1xuICBtb2R1bGUuZXhwb3J0cy5pc1ZhbGlkVVRGOCA9IGZ1bmN0aW9uIChidWYpIHtcbiAgICByZXR1cm4gYnVmLmxlbmd0aCA8IDI0ID8gX2lzVmFsaWRVVEY4KGJ1ZikgOiBpc1V0ZjgoYnVmKTtcbiAgfTtcbn0gLyogaXN0YW5idWwgaWdub3JlIGVsc2UgICovIGVsc2UgaWYgKCFwcm9jZXNzLmVudi5XU19OT19VVEZfOF9WQUxJREFURSkge1xuICB0cnkge1xuICAgIGNvbnN0IGlzVmFsaWRVVEY4ID0gcmVxdWlyZSgndXRmLTgtdmFsaWRhdGUnKTtcblxuICAgIG1vZHVsZS5leHBvcnRzLmlzVmFsaWRVVEY4ID0gZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgcmV0dXJuIGJ1Zi5sZW5ndGggPCAzMiA/IF9pc1ZhbGlkVVRGOChidWYpIDogaXNWYWxpZFVURjgoYnVmKTtcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gQ29udGludWUgcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3IuXG4gIH1cbn1cbiIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXkR1cGxleCRcIiwgXCJjYXVnaHRFcnJvcnNcIjogXCJub25lXCIgfV0gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCB7IER1cGxleCB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5jb25zdCB7IGNyZWF0ZUhhc2ggfSA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG5jb25zdCBleHRlbnNpb24gPSByZXF1aXJlKCcuL2V4dGVuc2lvbicpO1xuY29uc3QgUGVyTWVzc2FnZURlZmxhdGUgPSByZXF1aXJlKCcuL3Blcm1lc3NhZ2UtZGVmbGF0ZScpO1xuY29uc3Qgc3VicHJvdG9jb2wgPSByZXF1aXJlKCcuL3N1YnByb3RvY29sJyk7XG5jb25zdCBXZWJTb2NrZXQgPSByZXF1aXJlKCcuL3dlYnNvY2tldCcpO1xuY29uc3QgeyBHVUlELCBrV2ViU29ja2V0IH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG5jb25zdCBrZXlSZWdleCA9IC9eWysvMC05QS1aYS16XXsyMn09PSQvO1xuXG5jb25zdCBSVU5OSU5HID0gMDtcbmNvbnN0IENMT1NJTkcgPSAxO1xuY29uc3QgQ0xPU0VEID0gMjtcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBXZWJTb2NrZXQgc2VydmVyLlxuICpcbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICovXG5jbGFzcyBXZWJTb2NrZXRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgYFdlYlNvY2tldFNlcnZlcmAgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHM9dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXJcbiAgICogICAgIGFueSBvZiB0aGUgYCdtZXNzYWdlJ2AsIGAncGluZydgLCBhbmQgYCdwb25nJ2AgZXZlbnRzIGNhbiBiZSBlbWl0dGVkXG4gICAqICAgICBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSB0aWNrXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYXV0b1Bvbmc9dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvXG4gICAqICAgICBhdXRvbWF0aWNhbGx5IHNlbmQgYSBwb25nIGluIHJlc3BvbnNlIHRvIGEgcGluZ1xuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYmFja2xvZz01MTFdIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcXVldWUgb2ZcbiAgICogICAgIHBlbmRpbmcgY29ubmVjdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGllbnRUcmFja2luZz10cnVlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG9cbiAgICogICAgIHRyYWNrIGNsaWVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuaGFuZGxlUHJvdG9jb2xzXSBBIGhvb2sgdG8gaGFuZGxlIHByb3RvY29sc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaG9zdF0gVGhlIGhvc3RuYW1lIHdoZXJlIHRvIGJpbmQgdGhlIHNlcnZlclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UGF5bG9hZD0xMDQ4NTc2MDBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZVxuICAgKiAgICAgc2l6ZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm5vU2VydmVyPWZhbHNlXSBFbmFibGUgbm8gc2VydmVyIG1vZGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnBhdGhdIEFjY2VwdCBvbmx5IGNvbm5lY3Rpb25zIG1hdGNoaW5nIHRoaXMgcGF0aFxuICAgKiBAcGFyYW0geyhCb29sZWFufE9iamVjdCl9IFtvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlPWZhbHNlXSBFbmFibGUvZGlzYWJsZVxuICAgKiAgICAgcGVybWVzc2FnZS1kZWZsYXRlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wb3J0XSBUaGUgcG9ydCB3aGVyZSB0byBiaW5kIHRoZSBzZXJ2ZXJcbiAgICogQHBhcmFtIHsoaHR0cC5TZXJ2ZXJ8aHR0cHMuU2VydmVyKX0gW29wdGlvbnMuc2VydmVyXSBBIHByZS1jcmVhdGVkIEhUVFAvU1xuICAgKiAgICAgc2VydmVyIHRvIHVzZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAgICogICAgIG5vdCB0byBza2lwIFVURi04IHZhbGlkYXRpb24gZm9yIHRleHQgYW5kIGNsb3NlIG1lc3NhZ2VzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnZlcmlmeUNsaWVudF0gQSBob29rIHRvIHJlamVjdCBjb25uZWN0aW9uc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5XZWJTb2NrZXQ9V2ViU29ja2V0XSBTcGVjaWZpZXMgdGhlIGBXZWJTb2NrZXRgXG4gICAqICAgICBjbGFzcyB0byB1c2UuIEl0IG11c3QgYmUgdGhlIGBXZWJTb2NrZXRgIGNsYXNzIG9yIGNsYXNzIHRoYXQgZXh0ZW5kcyBpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIEEgbGlzdGVuZXIgZm9yIHRoZSBgbGlzdGVuaW5nYCBldmVudFxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBzdXBlcigpO1xuXG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IHRydWUsXG4gICAgICBhdXRvUG9uZzogdHJ1ZSxcbiAgICAgIG1heFBheWxvYWQ6IDEwMCAqIDEwMjQgKiAxMDI0LFxuICAgICAgc2tpcFVURjhWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgIHBlck1lc3NhZ2VEZWZsYXRlOiBmYWxzZSxcbiAgICAgIGhhbmRsZVByb3RvY29sczogbnVsbCxcbiAgICAgIGNsaWVudFRyYWNraW5nOiB0cnVlLFxuICAgICAgdmVyaWZ5Q2xpZW50OiBudWxsLFxuICAgICAgbm9TZXJ2ZXI6IGZhbHNlLFxuICAgICAgYmFja2xvZzogbnVsbCwgLy8gdXNlIGRlZmF1bHQgKDUxMSBhcyBpbXBsZW1lbnRlZCBpbiBuZXQuanMpXG4gICAgICBzZXJ2ZXI6IG51bGwsXG4gICAgICBob3N0OiBudWxsLFxuICAgICAgcGF0aDogbnVsbCxcbiAgICAgIHBvcnQ6IG51bGwsXG4gICAgICBXZWJTb2NrZXQsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIGlmIChcbiAgICAgIChvcHRpb25zLnBvcnQgPT0gbnVsbCAmJiAhb3B0aW9ucy5zZXJ2ZXIgJiYgIW9wdGlvbnMubm9TZXJ2ZXIpIHx8XG4gICAgICAob3B0aW9ucy5wb3J0ICE9IG51bGwgJiYgKG9wdGlvbnMuc2VydmVyIHx8IG9wdGlvbnMubm9TZXJ2ZXIpKSB8fFxuICAgICAgKG9wdGlvbnMuc2VydmVyICYmIG9wdGlvbnMubm9TZXJ2ZXIpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgXCJwb3J0XCIsIFwic2VydmVyXCIsIG9yIFwibm9TZXJ2ZXJcIiBvcHRpb25zICcgK1xuICAgICAgICAgICdtdXN0IGJlIHNwZWNpZmllZCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucG9ydCAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9zZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcigocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgYm9keSA9IGh0dHAuU1RBVFVTX0NPREVTWzQyNl07XG5cbiAgICAgICAgcmVzLndyaXRlSGVhZCg0MjYsIHtcbiAgICAgICAgICAnQ29udGVudC1MZW5ndGgnOiBib2R5Lmxlbmd0aCxcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nXG4gICAgICAgIH0pO1xuICAgICAgICByZXMuZW5kKGJvZHkpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9zZXJ2ZXIubGlzdGVuKFxuICAgICAgICBvcHRpb25zLnBvcnQsXG4gICAgICAgIG9wdGlvbnMuaG9zdCxcbiAgICAgICAgb3B0aW9ucy5iYWNrbG9nLFxuICAgICAgICBjYWxsYmFja1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc2VydmVyKSB7XG4gICAgICB0aGlzLl9zZXJ2ZXIgPSBvcHRpb25zLnNlcnZlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2VydmVyKSB7XG4gICAgICBjb25zdCBlbWl0Q29ubmVjdGlvbiA9IHRoaXMuZW1pdC5iaW5kKHRoaXMsICdjb25uZWN0aW9uJyk7XG5cbiAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycyA9IGFkZExpc3RlbmVycyh0aGlzLl9zZXJ2ZXIsIHtcbiAgICAgICAgbGlzdGVuaW5nOiB0aGlzLmVtaXQuYmluZCh0aGlzLCAnbGlzdGVuaW5nJyksXG4gICAgICAgIGVycm9yOiB0aGlzLmVtaXQuYmluZCh0aGlzLCAnZXJyb3InKSxcbiAgICAgICAgdXBncmFkZTogKHJlcSwgc29ja2V0LCBoZWFkKSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVVcGdyYWRlKHJlcSwgc29ja2V0LCBoZWFkLCBlbWl0Q29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlID09PSB0cnVlKSBvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlID0ge307XG4gICAgaWYgKG9wdGlvbnMuY2xpZW50VHJhY2tpbmcpIHtcbiAgICAgIHRoaXMuY2xpZW50cyA9IG5ldyBTZXQoKTtcbiAgICAgIHRoaXMuX3Nob3VsZEVtaXRDbG9zZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5fc3RhdGUgPSBSVU5OSU5HO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGJvdW5kIGFkZHJlc3MsIHRoZSBhZGRyZXNzIGZhbWlseSBuYW1lLCBhbmQgcG9ydCBvZiB0aGUgc2VydmVyXG4gICAqIGFzIHJlcG9ydGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlmIGxpc3RlbmluZyBvbiBhbiBJUCBzb2NrZXQuXG4gICAqIElmIHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uIGEgcGlwZSBvciBVTklYIGRvbWFpbiBzb2NrZXQsIHRoZSBuYW1lIGlzXG4gICAqIHJldHVybmVkIGFzIGEgc3RyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJuIHsoT2JqZWN0fFN0cmluZ3xudWxsKX0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlcnZlclxuICAgKiBAcHVibGljXG4gICAqL1xuICBhZGRyZXNzKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMubm9TZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHNlcnZlciBpcyBvcGVyYXRpbmcgaW4gXCJub1NlcnZlclwiIG1vZGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3NlcnZlcikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlci5hZGRyZXNzKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB0aGUgc2VydmVyIGZyb20gYWNjZXB0aW5nIG5ldyBjb25uZWN0aW9ucyBhbmQgZW1pdCB0aGUgYCdjbG9zZSdgIGV2ZW50XG4gICAqIHdoZW4gYWxsIGV4aXN0aW5nIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgdGhlIGAnY2xvc2UnYCBldmVudFxuICAgKiBAcHVibGljXG4gICAqL1xuICBjbG9zZShjYikge1xuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gQ0xPU0VEKSB7XG4gICAgICBpZiAoY2IpIHtcbiAgICAgICAgdGhpcy5vbmNlKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICBjYihuZXcgRXJyb3IoJ1RoZSBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZSwgdGhpcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNiKSB0aGlzLm9uY2UoJ2Nsb3NlJywgY2IpO1xuXG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBDTE9TSU5HKSByZXR1cm47XG4gICAgdGhpcy5fc3RhdGUgPSBDTE9TSU5HO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub1NlcnZlciB8fCB0aGlzLm9wdGlvbnMuc2VydmVyKSB7XG4gICAgICBpZiAodGhpcy5fc2VydmVyKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMgPSB0aGlzLl9zZXJ2ZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jbGllbnRzKSB7XG4gICAgICAgIGlmICghdGhpcy5jbGllbnRzLnNpemUpIHtcbiAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZSwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fc2hvdWxkRW1pdENsb3NlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLl9zZXJ2ZXI7XG5cbiAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xuICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzID0gdGhpcy5fc2VydmVyID0gbnVsbDtcblxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBIVFRQL1Mgc2VydmVyIHdhcyBjcmVhdGVkIGludGVybmFsbHkuIENsb3NlIGl0LCBhbmQgcmVseSBvbiBpdHNcbiAgICAgIC8vIGAnY2xvc2UnYCBldmVudC5cbiAgICAgIC8vXG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICBlbWl0Q2xvc2UodGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VlIGlmIGEgZ2l2ZW4gcmVxdWVzdCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGlzIHNlcnZlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtodHRwLkluY29taW5nTWVzc2FnZX0gcmVxIFJlcXVlc3Qgb2JqZWN0IHRvIGluc3BlY3RcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSByZXF1ZXN0IGlzIHZhbGlkLCBlbHNlIGBmYWxzZWBcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2hvdWxkSGFuZGxlKHJlcSkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMucGF0aCkge1xuICAgICAgY29uc3QgaW5kZXggPSByZXEudXJsLmluZGV4T2YoJz8nKTtcbiAgICAgIGNvbnN0IHBhdGhuYW1lID0gaW5kZXggIT09IC0xID8gcmVxLnVybC5zbGljZSgwLCBpbmRleCkgOiByZXEudXJsO1xuXG4gICAgICBpZiAocGF0aG5hbWUgIT09IHRoaXMub3B0aW9ucy5wYXRoKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGEgSFRUUCBVcGdyYWRlIHJlcXVlc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7aHR0cC5JbmNvbWluZ01lc3NhZ2V9IHJlcSBUaGUgcmVxdWVzdCBvYmplY3RcbiAgICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgbmV0d29yayBzb2NrZXQgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWQgVGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgdXBncmFkZWQgc3RyZWFtXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGhhbmRsZVVwZ3JhZGUocmVxLCBzb2NrZXQsIGhlYWQsIGNiKSB7XG4gICAgc29ja2V0Lm9uKCdlcnJvcicsIHNvY2tldE9uRXJyb3IpO1xuXG4gICAgY29uc3Qga2V5ID0gcmVxLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQta2V5J107XG4gICAgY29uc3QgdXBncmFkZSA9IHJlcS5oZWFkZXJzLnVwZ3JhZGU7XG4gICAgY29uc3QgdmVyc2lvbiA9ICtyZXEuaGVhZGVyc1snc2VjLXdlYnNvY2tldC12ZXJzaW9uJ107XG5cbiAgICBpZiAocmVxLm1ldGhvZCAhPT0gJ0dFVCcpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnSW52YWxpZCBIVFRQIG1ldGhvZCc7XG4gICAgICBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3IodGhpcywgcmVxLCBzb2NrZXQsIDQwNSwgbWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHVwZ3JhZGUgPT09IHVuZGVmaW5lZCB8fCB1cGdyYWRlLnRvTG93ZXJDYXNlKCkgIT09ICd3ZWJzb2NrZXQnKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgVXBncmFkZSBoZWFkZXInO1xuICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCAha2V5UmVnZXgudGVzdChrZXkpKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ01pc3Npbmcgb3IgaW52YWxpZCBTZWMtV2ViU29ja2V0LUtleSBoZWFkZXInO1xuICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uICE9PSA4ICYmIHZlcnNpb24gIT09IDEzKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ01pc3Npbmcgb3IgaW52YWxpZCBTZWMtV2ViU29ja2V0LVZlcnNpb24gaGVhZGVyJztcbiAgICAgIGFib3J0SGFuZHNoYWtlT3JFbWl0d3NDbGllbnRFcnJvcih0aGlzLCByZXEsIHNvY2tldCwgNDAwLCBtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2hvdWxkSGFuZGxlKHJlcSkpIHtcbiAgICAgIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgNDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWNXZWJTb2NrZXRQcm90b2NvbCA9IHJlcS5oZWFkZXJzWydzZWMtd2Vic29ja2V0LXByb3RvY29sJ107XG4gICAgbGV0IHByb3RvY29scyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChzZWNXZWJTb2NrZXRQcm90b2NvbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwcm90b2NvbHMgPSBzdWJwcm90b2NvbC5wYXJzZShzZWNXZWJTb2NrZXRQcm90b2NvbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgaGVhZGVyJztcbiAgICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjV2ViU29ja2V0RXh0ZW5zaW9ucyA9IHJlcS5oZWFkZXJzWydzZWMtd2Vic29ja2V0LWV4dGVuc2lvbnMnXTtcbiAgICBjb25zdCBleHRlbnNpb25zID0ge307XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLm9wdGlvbnMucGVyTWVzc2FnZURlZmxhdGUgJiZcbiAgICAgIHNlY1dlYlNvY2tldEV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc3QgcGVyTWVzc2FnZURlZmxhdGUgPSBuZXcgUGVyTWVzc2FnZURlZmxhdGUoXG4gICAgICAgIHRoaXMub3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5vcHRpb25zLm1heFBheWxvYWRcbiAgICAgICk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9mZmVycyA9IGV4dGVuc2lvbi5wYXJzZShzZWNXZWJTb2NrZXRFeHRlbnNpb25zKTtcblxuICAgICAgICBpZiAob2ZmZXJzW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdKSB7XG4gICAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUuYWNjZXB0KG9mZmVyc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSk7XG4gICAgICAgICAgZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSA9IHBlck1lc3NhZ2VEZWZsYXRlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgJ0ludmFsaWQgb3IgdW5hY2NlcHRhYmxlIFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyBoZWFkZXInO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3IodGhpcywgcmVxLCBzb2NrZXQsIDQwMCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIE9wdGlvbmFsbHkgY2FsbCBleHRlcm5hbCBjbGllbnQgdmVyaWZpY2F0aW9uIGhhbmRsZXIuXG4gICAgLy9cbiAgICBpZiAodGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudCkge1xuICAgICAgY29uc3QgaW5mbyA9IHtcbiAgICAgICAgb3JpZ2luOlxuICAgICAgICAgIHJlcS5oZWFkZXJzW2Ake3ZlcnNpb24gPT09IDggPyAnc2VjLXdlYnNvY2tldC1vcmlnaW4nIDogJ29yaWdpbid9YF0sXG4gICAgICAgIHNlY3VyZTogISEocmVxLnNvY2tldC5hdXRob3JpemVkIHx8IHJlcS5zb2NrZXQuZW5jcnlwdGVkKSxcbiAgICAgICAgcmVxXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudChpbmZvLCAodmVyaWZpZWQsIGNvZGUsIG1lc3NhZ2UsIGhlYWRlcnMpID0+IHtcbiAgICAgICAgICBpZiAoIXZlcmlmaWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYWJvcnRIYW5kc2hha2Uoc29ja2V0LCBjb2RlIHx8IDQwMSwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb21wbGV0ZVVwZ3JhZGUoXG4gICAgICAgICAgICBleHRlbnNpb25zLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcHJvdG9jb2xzLFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgc29ja2V0LFxuICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgIGNiXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudmVyaWZ5Q2xpZW50KGluZm8pKSByZXR1cm4gYWJvcnRIYW5kc2hha2Uoc29ja2V0LCA0MDEpO1xuICAgIH1cblxuICAgIHRoaXMuY29tcGxldGVVcGdyYWRlKGV4dGVuc2lvbnMsIGtleSwgcHJvdG9jb2xzLCByZXEsIHNvY2tldCwgaGVhZCwgY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZ3JhZGUgdGhlIGNvbm5lY3Rpb24gdG8gV2ViU29ja2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXh0ZW5zaW9ucyBUaGUgYWNjZXB0ZWQgZXh0ZW5zaW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSB2YWx1ZSBvZiB0aGUgYFNlYy1XZWJTb2NrZXQtS2V5YCBoZWFkZXJcbiAgICogQHBhcmFtIHtTZXR9IHByb3RvY29scyBUaGUgc3VicHJvdG9jb2xzXG4gICAqIEBwYXJhbSB7aHR0cC5JbmNvbWluZ01lc3NhZ2V9IHJlcSBUaGUgcmVxdWVzdCBvYmplY3RcbiAgICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgbmV0d29yayBzb2NrZXQgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWQgVGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgdXBncmFkZWQgc3RyZWFtXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugd2l0aCB0aGUgc2FtZSBzb2NrZXRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbXBsZXRlVXBncmFkZShleHRlbnNpb25zLCBrZXksIHByb3RvY29scywgcmVxLCBzb2NrZXQsIGhlYWQsIGNiKSB7XG4gICAgLy9cbiAgICAvLyBEZXN0cm95IHRoZSBzb2NrZXQgaWYgdGhlIGNsaWVudCBoYXMgYWxyZWFkeSBzZW50IGEgRklOIHBhY2tldC5cbiAgICAvL1xuICAgIGlmICghc29ja2V0LnJlYWRhYmxlIHx8ICFzb2NrZXQud3JpdGFibGUpIHJldHVybiBzb2NrZXQuZGVzdHJveSgpO1xuXG4gICAgaWYgKHNvY2tldFtrV2ViU29ja2V0XSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnc2VydmVyLmhhbmRsZVVwZ3JhZGUoKSB3YXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHdpdGggdGhlIHNhbWUgJyArXG4gICAgICAgICAgJ3NvY2tldCwgcG9zc2libHkgZHVlIHRvIGEgbWlzY29uZmlndXJhdGlvbidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3N0YXRlID4gUlVOTklORykgcmV0dXJuIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgNTAzKTtcblxuICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goJ3NoYTEnKVxuICAgICAgLnVwZGF0ZShrZXkgKyBHVUlEKVxuICAgICAgLmRpZ2VzdCgnYmFzZTY0Jyk7XG5cbiAgICBjb25zdCBoZWFkZXJzID0gW1xuICAgICAgJ0hUVFAvMS4xIDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzJyxcbiAgICAgICdVcGdyYWRlOiB3ZWJzb2NrZXQnLFxuICAgICAgJ0Nvbm5lY3Rpb246IFVwZ3JhZGUnLFxuICAgICAgYFNlYy1XZWJTb2NrZXQtQWNjZXB0OiAke2RpZ2VzdH1gXG4gICAgXTtcblxuICAgIGNvbnN0IHdzID0gbmV3IHRoaXMub3B0aW9ucy5XZWJTb2NrZXQobnVsbCwgdW5kZWZpbmVkLCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgaWYgKHByb3RvY29scy5zaXplKSB7XG4gICAgICAvL1xuICAgICAgLy8gT3B0aW9uYWxseSBjYWxsIGV4dGVybmFsIHByb3RvY29sIHNlbGVjdGlvbiBoYW5kbGVyLlxuICAgICAgLy9cbiAgICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5vcHRpb25zLmhhbmRsZVByb3RvY29sc1xuICAgICAgICA/IHRoaXMub3B0aW9ucy5oYW5kbGVQcm90b2NvbHMocHJvdG9jb2xzLCByZXEpXG4gICAgICAgIDogcHJvdG9jb2xzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgICAgaWYgKHByb3RvY29sKSB7XG4gICAgICAgIGhlYWRlcnMucHVzaChgU2VjLVdlYlNvY2tldC1Qcm90b2NvbDogJHtwcm90b2NvbH1gKTtcbiAgICAgICAgd3MuX3Byb3RvY29sID0gcHJvdG9jb2w7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0pIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IGV4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0ucGFyYW1zO1xuICAgICAgY29uc3QgdmFsdWUgPSBleHRlbnNpb24uZm9ybWF0KHtcbiAgICAgICAgW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdOiBbcGFyYW1zXVxuICAgICAgfSk7XG4gICAgICBoZWFkZXJzLnB1c2goYFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9uczogJHt2YWx1ZX1gKTtcbiAgICAgIHdzLl9leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIEFsbG93IGV4dGVybmFsIG1vZGlmaWNhdGlvbi9pbnNwZWN0aW9uIG9mIGhhbmRzaGFrZSBoZWFkZXJzLlxuICAgIC8vXG4gICAgdGhpcy5lbWl0KCdoZWFkZXJzJywgaGVhZGVycywgcmVxKTtcblxuICAgIHNvY2tldC53cml0ZShoZWFkZXJzLmNvbmNhdCgnXFxyXFxuJykuam9pbignXFxyXFxuJykpO1xuICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBzb2NrZXRPbkVycm9yKTtcblxuICAgIHdzLnNldFNvY2tldChzb2NrZXQsIGhlYWQsIHtcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IHRoaXMub3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzLFxuICAgICAgbWF4UGF5bG9hZDogdGhpcy5vcHRpb25zLm1heFBheWxvYWQsXG4gICAgICBza2lwVVRGOFZhbGlkYXRpb246IHRoaXMub3B0aW9ucy5za2lwVVRGOFZhbGlkYXRpb25cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNsaWVudHMpIHtcbiAgICAgIHRoaXMuY2xpZW50cy5hZGQod3MpO1xuICAgICAgd3Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmNsaWVudHMuZGVsZXRlKHdzKTtcblxuICAgICAgICBpZiAodGhpcy5fc2hvdWxkRW1pdENsb3NlICYmICF0aGlzLmNsaWVudHMuc2l6ZSkge1xuICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2Iod3MsIHJlcSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBXZWJTb2NrZXRTZXJ2ZXI7XG5cbi8qKlxuICogQWRkIGV2ZW50IGxpc3RlbmVycyBvbiBhbiBgRXZlbnRFbWl0dGVyYCB1c2luZyBhIG1hcCBvZiA8ZXZlbnQsIGxpc3RlbmVyPlxuICogcGFpcnMuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IHNlcnZlciBUaGUgZXZlbnQgZW1pdHRlclxuICogQHBhcmFtIHtPYmplY3QuPFN0cmluZywgRnVuY3Rpb24+fSBtYXAgVGhlIGxpc3RlbmVycyB0byBhZGRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCByZW1vdmUgdGhlIGFkZGVkIGxpc3RlbmVycyB3aGVuXG4gKiAgICAgY2FsbGVkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRMaXN0ZW5lcnMoc2VydmVyLCBtYXApIHtcbiAgZm9yIChjb25zdCBldmVudCBvZiBPYmplY3Qua2V5cyhtYXApKSBzZXJ2ZXIub24oZXZlbnQsIG1hcFtldmVudF0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcnMoKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBPYmplY3Qua2V5cyhtYXApKSB7XG4gICAgICBzZXJ2ZXIucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIG1hcFtldmVudF0pO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBFbWl0IGEgYCdjbG9zZSdgIGV2ZW50IG9uIGFuIGBFdmVudEVtaXR0ZXJgLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBzZXJ2ZXIgVGhlIGV2ZW50IGVtaXR0ZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGVtaXRDbG9zZShzZXJ2ZXIpIHtcbiAgc2VydmVyLl9zdGF0ZSA9IENMT1NFRDtcbiAgc2VydmVyLmVtaXQoJ2Nsb3NlJyk7XG59XG5cbi8qKlxuICogSGFuZGxlIHNvY2tldCBlcnJvcnMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc29ja2V0T25FcnJvcigpIHtcbiAgdGhpcy5kZXN0cm95KCk7XG59XG5cbi8qKlxuICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24gd2hlbiBwcmVjb25kaXRpb25zIGFyZSBub3QgZnVsZmlsbGVkLlxuICpcbiAqIEBwYXJhbSB7RHVwbGV4fSBzb2NrZXQgVGhlIHNvY2tldCBvZiB0aGUgdXBncmFkZSByZXF1ZXN0XG4gKiBAcGFyYW0ge051bWJlcn0gY29kZSBUaGUgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZVxuICogQHBhcmFtIHtTdHJpbmd9IFttZXNzYWdlXSBUaGUgSFRUUCByZXNwb25zZSBib2R5XG4gKiBAcGFyYW0ge09iamVjdH0gW2hlYWRlcnNdIEFkZGl0aW9uYWwgSFRUUCByZXNwb25zZSBoZWFkZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZShzb2NrZXQsIGNvZGUsIG1lc3NhZ2UsIGhlYWRlcnMpIHtcbiAgLy9cbiAgLy8gVGhlIHNvY2tldCBpcyB3cml0YWJsZSB1bmxlc3MgdGhlIHVzZXIgZGVzdHJveWVkIG9yIGVuZGVkIGl0IGJlZm9yZSBjYWxsaW5nXG4gIC8vIGBzZXJ2ZXIuaGFuZGxlVXBncmFkZSgpYCBvciBpbiB0aGUgYHZlcmlmeUNsaWVudGAgZnVuY3Rpb24sIHdoaWNoIGlzIGEgdXNlclxuICAvLyBlcnJvci4gSGFuZGxpbmcgdGhpcyBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgYXMgdGhlIHdvcnN0IHRoYXQgY2FuIGhhcHBlblxuICAvLyBpcyB0aGF0IHNvbWUgb2YgdGhlIGRhdGEgd3JpdHRlbiBieSB0aGUgdXNlciBtaWdodCBiZSBkaXNjYXJkZWQgZHVlIHRvIHRoZVxuICAvLyBjYWxsIHRvIGBzb2NrZXQuZW5kKClgIGJlbG93LCB3aGljaCB0cmlnZ2VycyBhbiBgJ2Vycm9yJ2AgZXZlbnQgdGhhdCBpblxuICAvLyB0dXJuIGNhdXNlcyB0aGUgc29ja2V0IHRvIGJlIGRlc3Ryb3llZC5cbiAgLy9cbiAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgaHR0cC5TVEFUVVNfQ09ERVNbY29kZV07XG4gIGhlYWRlcnMgPSB7XG4gICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcbiAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbCcsXG4gICAgJ0NvbnRlbnQtTGVuZ3RoJzogQnVmZmVyLmJ5dGVMZW5ndGgobWVzc2FnZSksXG4gICAgLi4uaGVhZGVyc1xuICB9O1xuXG4gIHNvY2tldC5vbmNlKCdmaW5pc2gnLCBzb2NrZXQuZGVzdHJveSk7XG5cbiAgc29ja2V0LmVuZChcbiAgICBgSFRUUC8xLjEgJHtjb2RlfSAke2h0dHAuU1RBVFVTX0NPREVTW2NvZGVdfVxcclxcbmAgK1xuICAgICAgT2JqZWN0LmtleXMoaGVhZGVycylcbiAgICAgICAgLm1hcCgoaCkgPT4gYCR7aH06ICR7aGVhZGVyc1toXX1gKVxuICAgICAgICAuam9pbignXFxyXFxuJykgK1xuICAgICAgJ1xcclxcblxcclxcbicgK1xuICAgICAgbWVzc2FnZVxuICApO1xufVxuXG4vKipcbiAqIEVtaXQgYSBgJ3dzQ2xpZW50RXJyb3InYCBldmVudCBvbiBhIGBXZWJTb2NrZXRTZXJ2ZXJgIGlmIHRoZXJlIGlzIGF0IGxlYXN0XG4gKiBvbmUgbGlzdGVuZXIgZm9yIGl0LCBvdGhlcndpc2UgY2FsbCBgYWJvcnRIYW5kc2hha2UoKWAuXG4gKlxuICogQHBhcmFtIHtXZWJTb2NrZXRTZXJ2ZXJ9IHNlcnZlciBUaGUgV2ViU29ja2V0IHNlcnZlclxuICogQHBhcmFtIHtodHRwLkluY29taW5nTWVzc2FnZX0gcmVxIFRoZSByZXF1ZXN0IG9iamVjdFxuICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgc29ja2V0IG9mIHRoZSB1cGdyYWRlIHJlcXVlc3RcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlIFRoZSBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgSFRUUCByZXNwb25zZSBib2R5XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3Ioc2VydmVyLCByZXEsIHNvY2tldCwgY29kZSwgbWVzc2FnZSkge1xuICBpZiAoc2VydmVyLmxpc3RlbmVyQ291bnQoJ3dzQ2xpZW50RXJyb3InKSkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIGFib3J0SGFuZHNoYWtlT3JFbWl0d3NDbGllbnRFcnJvcik7XG5cbiAgICBzZXJ2ZXIuZW1pdCgnd3NDbGllbnRFcnJvcicsIGVyciwgc29ja2V0LCByZXEpO1xuICB9IGVsc2Uge1xuICAgIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgY29kZSwgbWVzc2FnZSk7XG4gIH1cbn1cbiIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXkR1cGxleHxSZWFkYWJsZSRcIiwgXCJjYXVnaHRFcnJvcnNcIjogXCJub25lXCIgfV0gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCBuZXQgPSByZXF1aXJlKCduZXQnKTtcbmNvbnN0IHRscyA9IHJlcXVpcmUoJ3RscycpO1xuY29uc3QgeyByYW5kb21CeXRlcywgY3JlYXRlSGFzaCB9ID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCB7IER1cGxleCwgUmVhZGFibGUgfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuY29uc3QgeyBVUkwgfSA9IHJlcXVpcmUoJ3VybCcpO1xuXG5jb25zdCBQZXJNZXNzYWdlRGVmbGF0ZSA9IHJlcXVpcmUoJy4vcGVybWVzc2FnZS1kZWZsYXRlJyk7XG5jb25zdCBSZWNlaXZlciA9IHJlcXVpcmUoJy4vcmVjZWl2ZXInKTtcbmNvbnN0IFNlbmRlciA9IHJlcXVpcmUoJy4vc2VuZGVyJyk7XG5jb25zdCB7IGlzQmxvYiB9ID0gcmVxdWlyZSgnLi92YWxpZGF0aW9uJyk7XG5cbmNvbnN0IHtcbiAgQklOQVJZX1RZUEVTLFxuICBFTVBUWV9CVUZGRVIsXG4gIEdVSUQsXG4gIGtGb3JPbkV2ZW50QXR0cmlidXRlLFxuICBrTGlzdGVuZXIsXG4gIGtTdGF0dXNDb2RlLFxuICBrV2ViU29ja2V0LFxuICBOT09QXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IHtcbiAgRXZlbnRUYXJnZXQ6IHsgYWRkRXZlbnRMaXN0ZW5lciwgcmVtb3ZlRXZlbnRMaXN0ZW5lciB9XG59ID0gcmVxdWlyZSgnLi9ldmVudC10YXJnZXQnKTtcbmNvbnN0IHsgZm9ybWF0LCBwYXJzZSB9ID0gcmVxdWlyZSgnLi9leHRlbnNpb24nKTtcbmNvbnN0IHsgdG9CdWZmZXIgfSA9IHJlcXVpcmUoJy4vYnVmZmVyLXV0aWwnKTtcblxuY29uc3QgY2xvc2VUaW1lb3V0ID0gMzAgKiAxMDAwO1xuY29uc3Qga0Fib3J0ZWQgPSBTeW1ib2woJ2tBYm9ydGVkJyk7XG5jb25zdCBwcm90b2NvbFZlcnNpb25zID0gWzgsIDEzXTtcbmNvbnN0IHJlYWR5U3RhdGVzID0gWydDT05ORUNUSU5HJywgJ09QRU4nLCAnQ0xPU0lORycsICdDTE9TRUQnXTtcbmNvbnN0IHN1YnByb3RvY29sUmVnZXggPSAvXlshIyQlJicqK1xcLS4wLTlBLVpeX2B8YS16fl0rJC87XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgV2ViU29ja2V0LlxuICpcbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICovXG5jbGFzcyBXZWJTb2NrZXQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBXZWJTb2NrZXRgLlxuICAgKlxuICAgKiBAcGFyYW0geyhTdHJpbmd8VVJMKX0gYWRkcmVzcyBUaGUgVVJMIHRvIHdoaWNoIHRvIGNvbm5lY3RcbiAgICogQHBhcmFtIHsoU3RyaW5nfFN0cmluZ1tdKX0gW3Byb3RvY29sc10gVGhlIHN1YnByb3RvY29sc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIENvbm5lY3Rpb24gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IoYWRkcmVzcywgcHJvdG9jb2xzLCBvcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2JpbmFyeVR5cGUgPSBCSU5BUllfVFlQRVNbMF07XG4gICAgdGhpcy5fY2xvc2VDb2RlID0gMTAwNjtcbiAgICB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jbG9zZUZyYW1lU2VudCA9IGZhbHNlO1xuICAgIHRoaXMuX2Nsb3NlTWVzc2FnZSA9IEVNUFRZX0JVRkZFUjtcbiAgICB0aGlzLl9jbG9zZVRpbWVyID0gbnVsbDtcbiAgICB0aGlzLl9lcnJvckVtaXR0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9leHRlbnNpb25zID0ge307XG4gICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5fcHJvdG9jb2wgPSAnJztcbiAgICB0aGlzLl9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNPTk5FQ1RJTkc7XG4gICAgdGhpcy5fcmVjZWl2ZXIgPSBudWxsO1xuICAgIHRoaXMuX3NlbmRlciA9IG51bGw7XG4gICAgdGhpcy5fc29ja2V0ID0gbnVsbDtcblxuICAgIGlmIChhZGRyZXNzICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9idWZmZXJlZEFtb3VudCA9IDA7XG4gICAgICB0aGlzLl9pc1NlcnZlciA9IGZhbHNlO1xuICAgICAgdGhpcy5fcmVkaXJlY3RzID0gMDtcblxuICAgICAgaWYgKHByb3RvY29scyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3RvY29scyA9IFtdO1xuICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShwcm90b2NvbHMpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdG9jb2xzID09PSAnb2JqZWN0JyAmJiBwcm90b2NvbHMgIT09IG51bGwpIHtcbiAgICAgICAgICBvcHRpb25zID0gcHJvdG9jb2xzO1xuICAgICAgICAgIHByb3RvY29scyA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3RvY29scyA9IFtwcm90b2NvbHNdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGluaXRBc0NsaWVudCh0aGlzLCBhZGRyZXNzLCBwcm90b2NvbHMsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hdXRvUG9uZyA9IG9wdGlvbnMuYXV0b1Bvbmc7XG4gICAgICB0aGlzLl9pc1NlcnZlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoZSBjdXN0b20gXCJub2RlYnVmZmVyXCIgdHlwZSBpcyB1c2VkIGJ5IHRoZSBkZWZhdWx0XG4gICAqIGluc3RlYWQgb2YgXCJibG9iXCIuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgYmluYXJ5VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYmluYXJ5VHlwZTtcbiAgfVxuXG4gIHNldCBiaW5hcnlUeXBlKHR5cGUpIHtcbiAgICBpZiAoIUJJTkFSWV9UWVBFUy5pbmNsdWRlcyh0eXBlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fYmluYXJ5VHlwZSA9IHR5cGU7XG5cbiAgICAvL1xuICAgIC8vIEFsbG93IHRvIGNoYW5nZSBgYmluYXJ5VHlwZWAgb24gdGhlIGZseS5cbiAgICAvL1xuICAgIGlmICh0aGlzLl9yZWNlaXZlcikgdGhpcy5fcmVjZWl2ZXIuX2JpbmFyeVR5cGUgPSB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgYnVmZmVyZWRBbW91bnQoKSB7XG4gICAgaWYgKCF0aGlzLl9zb2NrZXQpIHJldHVybiB0aGlzLl9idWZmZXJlZEFtb3VudDtcblxuICAgIHJldHVybiB0aGlzLl9zb2NrZXQuX3dyaXRhYmxlU3RhdGUubGVuZ3RoICsgdGhpcy5fc2VuZGVyLl9idWZmZXJlZEJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgZXh0ZW5zaW9ucygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fZXh0ZW5zaW9ucykuam9pbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgZ2V0IGlzUGF1c2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXVzZWQ7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0IG9uY2xvc2UoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0IG9uZXJyb3IoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0IG9ub3BlbigpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBnZXQgb25tZXNzYWdlKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgcHJvdG9jb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgcmVhZHlTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZHlTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgZ2V0IHVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCB0aGUgc29ja2V0IGFuZCB0aGUgaW50ZXJuYWwgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge0R1cGxleH0gc29ja2V0IFRoZSBuZXR3b3JrIHNvY2tldCBiZXR3ZWVuIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gaGVhZCBUaGUgZmlyc3QgcGFja2V0IG9mIHRoZSB1cGdyYWRlZCBzdHJlYW1cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlclxuICAgKiAgICAgYW55IG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWRcbiAgICogICAgIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHRpY2tcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZ2VuZXJhdGVNYXNrXSBUaGUgZnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSB0aGVcbiAgICogICAgIG1hc2tpbmcga2V5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhQYXlsb2FkPTBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZSBzaXplXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2tpcFVURjhWYWxpZGF0aW9uPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvclxuICAgKiAgICAgbm90IHRvIHNraXAgVVRGLTggdmFsaWRhdGlvbiBmb3IgdGV4dCBhbmQgY2xvc2UgbWVzc2FnZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldFNvY2tldChzb2NrZXQsIGhlYWQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCByZWNlaXZlciA9IG5ldyBSZWNlaXZlcih7XG4gICAgICBhbGxvd1N5bmNocm9ub3VzRXZlbnRzOiBvcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHMsXG4gICAgICBiaW5hcnlUeXBlOiB0aGlzLmJpbmFyeVR5cGUsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLl9leHRlbnNpb25zLFxuICAgICAgaXNTZXJ2ZXI6IHRoaXMuX2lzU2VydmVyLFxuICAgICAgbWF4UGF5bG9hZDogb3B0aW9ucy5tYXhQYXlsb2FkLFxuICAgICAgc2tpcFVURjhWYWxpZGF0aW9uOiBvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvblxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2VuZGVyID0gbmV3IFNlbmRlcihzb2NrZXQsIHRoaXMuX2V4dGVuc2lvbnMsIG9wdGlvbnMuZ2VuZXJhdGVNYXNrKTtcblxuICAgIHRoaXMuX3JlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgdGhpcy5fc2VuZGVyID0gc2VuZGVyO1xuICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcblxuICAgIHJlY2VpdmVyW2tXZWJTb2NrZXRdID0gdGhpcztcbiAgICBzZW5kZXJba1dlYlNvY2tldF0gPSB0aGlzO1xuICAgIHNvY2tldFtrV2ViU29ja2V0XSA9IHRoaXM7XG5cbiAgICByZWNlaXZlci5vbignY29uY2x1ZGUnLCByZWNlaXZlck9uQ29uY2x1ZGUpO1xuICAgIHJlY2VpdmVyLm9uKCdkcmFpbicsIHJlY2VpdmVyT25EcmFpbik7XG4gICAgcmVjZWl2ZXIub24oJ2Vycm9yJywgcmVjZWl2ZXJPbkVycm9yKTtcbiAgICByZWNlaXZlci5vbignbWVzc2FnZScsIHJlY2VpdmVyT25NZXNzYWdlKTtcbiAgICByZWNlaXZlci5vbigncGluZycsIHJlY2VpdmVyT25QaW5nKTtcbiAgICByZWNlaXZlci5vbigncG9uZycsIHJlY2VpdmVyT25Qb25nKTtcblxuICAgIHNlbmRlci5vbmVycm9yID0gc2VuZGVyT25FcnJvcjtcblxuICAgIC8vXG4gICAgLy8gVGhlc2UgbWV0aG9kcyBtYXkgbm90IGJlIGF2YWlsYWJsZSBpZiBgc29ja2V0YCBpcyBqdXN0IGEgYER1cGxleGAuXG4gICAgLy9cbiAgICBpZiAoc29ja2V0LnNldFRpbWVvdXQpIHNvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgIGlmIChzb2NrZXQuc2V0Tm9EZWxheSkgc29ja2V0LnNldE5vRGVsYXkoKTtcblxuICAgIGlmIChoZWFkLmxlbmd0aCA+IDApIHNvY2tldC51bnNoaWZ0KGhlYWQpO1xuXG4gICAgc29ja2V0Lm9uKCdjbG9zZScsIHNvY2tldE9uQ2xvc2UpO1xuICAgIHNvY2tldC5vbignZGF0YScsIHNvY2tldE9uRGF0YSk7XG4gICAgc29ja2V0Lm9uKCdlbmQnLCBzb2NrZXRPbkVuZCk7XG4gICAgc29ja2V0Lm9uKCdlcnJvcicsIHNvY2tldE9uRXJyb3IpO1xuXG4gICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5PUEVOO1xuICAgIHRoaXMuZW1pdCgnb3BlbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGAnY2xvc2UnYCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXRDbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX3NvY2tldCkge1xuICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TRUQ7XG4gICAgICB0aGlzLmVtaXQoJ2Nsb3NlJywgdGhpcy5fY2xvc2VDb2RlLCB0aGlzLl9jbG9zZU1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdKSB7XG4gICAgICB0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdLmNsZWFudXAoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWNlaXZlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NFRDtcbiAgICB0aGlzLmVtaXQoJ2Nsb3NlJywgdGhpcy5fY2xvc2VDb2RlLCB0aGlzLl9jbG9zZU1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgY2xvc2luZyBoYW5kc2hha2UuXG4gICAqXG4gICAqICAgICAgICAgICstLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLStcbiAgICogICAgIC0gLSAtfHdzLmNsb3NlKCl8LS0+fGNsb3NlIGZyYW1lfC0tPnx3cy5jbG9zZSgpfC0gLSAtXG4gICAqICAgIHwgICAgICstLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLSsgICAgIHxcbiAgICogICAgICAgICAgKy0tLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0tKyAgICAgICAgIHxcbiAgICogQ0xPU0lORyAgfHdzLmNsb3NlKCl8PC0tfGNsb3NlIGZyYW1lfDwtLSstLS0tLSsgICAgICAgQ0xPU0lOR1xuICAgKiAgICAgICAgICArLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0rICAgfFxuICAgKiAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICstLS0rICAgICAgICB8XG4gICAqICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0+fGZpbnwgLSAtIC0gLVxuICAgKiAgICB8ICAgICAgICAgKy0tLSsgICAgICAgICAgICAgICAgICAgICAgfCAgICstLS0rXG4gICAqICAgICAtIC0gLSAtIC18ZmlufDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICAqICAgICAgICAgICAgICArLS0tK1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2NvZGVdIFN0YXR1cyBjb2RlIGV4cGxhaW5pbmcgd2h5IHRoZSBjb25uZWN0aW9uIGlzIGNsb3NpbmdcbiAgICogQHBhcmFtIHsoU3RyaW5nfEJ1ZmZlcil9IFtkYXRhXSBUaGUgcmVhc29uIHdoeSB0aGUgY29ubmVjdGlvbiBpc1xuICAgKiAgICAgY2xvc2luZ1xuICAgKiBAcHVibGljXG4gICAqL1xuICBjbG9zZShjb2RlLCBkYXRhKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NFRCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICBjb25zdCBtc2cgPSAnV2ViU29ja2V0IHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCc7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh0aGlzLCB0aGlzLl9yZXEsIG1zZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NJTkcpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fY2xvc2VGcmFtZVNlbnQgJiZcbiAgICAgICAgKHRoaXMuX2Nsb3NlRnJhbWVSZWNlaXZlZCB8fCB0aGlzLl9yZWNlaXZlci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fc29ja2V0LmVuZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgIHRoaXMuX3NlbmRlci5jbG9zZShjb2RlLCBkYXRhLCAhdGhpcy5faXNTZXJ2ZXIsIChlcnIpID0+IHtcbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGVycm9yIGlzIGhhbmRsZWQgYnkgdGhlIGAnZXJyb3InYCBsaXN0ZW5lciBvbiB0aGUgc29ja2V0LiBXZSBvbmx5XG4gICAgICAvLyB3YW50IHRvIGtub3cgaWYgdGhlIGNsb3NlIGZyYW1lIGhhcyBiZWVuIHNlbnQgaGVyZS5cbiAgICAgIC8vXG4gICAgICBpZiAoZXJyKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX2Nsb3NlRnJhbWVTZW50ID0gdHJ1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgfHxcbiAgICAgICAgdGhpcy5fcmVjZWl2ZXIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fc29ja2V0LmVuZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0Q2xvc2VUaW1lcih0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB0aGUgc29ja2V0LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICBwYXVzZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HIHx8XG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRURcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xuICAgIHRoaXMuX3NvY2tldC5wYXVzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBwaW5nLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IFtkYXRhXSBUaGUgZGF0YSB0byBzZW5kXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW21hc2tdIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrIGBkYXRhYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrIHdoaWNoIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIHBpbmcgaXMgc2VudFxuICAgKiBAcHVibGljXG4gICAqL1xuICBwaW5nKGRhdGEsIG1hc2ssIGNiKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2ViU29ja2V0IGlzIG5vdCBvcGVuOiByZWFkeVN0YXRlIDAgKENPTk5FQ1RJTkcpJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IGRhdGE7XG4gICAgICBkYXRhID0gbWFzayA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtYXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IG1hc2s7XG4gICAgICBtYXNrID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgc2VuZEFmdGVyQ2xvc2UodGhpcywgZGF0YSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYXNrID09PSB1bmRlZmluZWQpIG1hc2sgPSAhdGhpcy5faXNTZXJ2ZXI7XG4gICAgdGhpcy5fc2VuZGVyLnBpbmcoZGF0YSB8fCBFTVBUWV9CVUZGRVIsIG1hc2ssIGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgcG9uZy5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBbZGF0YV0gVGhlIGRhdGEgdG8gc2VuZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrXSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFjayB3aGljaCBpcyBleGVjdXRlZCB3aGVuIHRoZSBwb25nIGlzIHNlbnRcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcG9uZyhkYXRhLCBtYXNrLCBjYikge1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAwIChDT05ORUNUSU5HKScpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBkYXRhO1xuICAgICAgZGF0YSA9IG1hc2sgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWFzayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBtYXNrO1xuICAgICAgbWFzayA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdudW1iZXInKSBkYXRhID0gZGF0YS50b1N0cmluZygpO1xuXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHNlbmRBZnRlckNsb3NlKHRoaXMsIGRhdGEsIGNiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobWFzayA9PT0gdW5kZWZpbmVkKSBtYXNrID0gIXRoaXMuX2lzU2VydmVyO1xuICAgIHRoaXMuX3NlbmRlci5wb25nKGRhdGEgfHwgRU1QVFlfQlVGRkVSLCBtYXNrLCBjYik7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIHRoZSBzb2NrZXQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHJlc3VtZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HIHx8XG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRURcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLm5lZWREcmFpbikgdGhpcy5fc29ja2V0LnJlc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBkYXRhIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWVzc2FnZSB0byBzZW5kXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5iaW5hcnldIFNwZWNpZmllcyB3aGV0aGVyIGBkYXRhYCBpcyBiaW5hcnkgb3JcbiAgICogICAgIHRleHRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jb21wcmVzc10gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGNvbXByZXNzXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5maW49dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZyYWdtZW50IGlzIHRoZVxuICAgKiAgICAgbGFzdCBvbmVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tYXNrXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFjayB3aGljaCBpcyBleGVjdXRlZCB3aGVuIGRhdGEgaXMgd3JpdHRlbiBvdXRcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2VuZChkYXRhLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAwIChDT05ORUNUSU5HKScpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgc2VuZEFmdGVyQ2xvc2UodGhpcywgZGF0YSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBiaW5hcnk6IHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJyxcbiAgICAgIG1hc2s6ICF0aGlzLl9pc1NlcnZlcixcbiAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgZmluOiB0cnVlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG5cbiAgICBpZiAoIXRoaXMuX2V4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0pIHtcbiAgICAgIG9wdHMuY29tcHJlc3MgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZW5kZXIuc2VuZChkYXRhIHx8IEVNUFRZX0JVRkZFUiwgb3B0cywgY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNpYmx5IGNsb3NlIHRoZSBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICB0ZXJtaW5hdGUoKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NFRCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICBjb25zdCBtc2cgPSAnV2ViU29ja2V0IHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCc7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh0aGlzLCB0aGlzLl9yZXEsIG1zZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3NvY2tldCkge1xuICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgICAgdGhpcy5fc29ja2V0LmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gQ09OTkVDVElOR1xuICogQG1lbWJlcm9mIFdlYlNvY2tldFxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0LCAnQ09OTkVDVElORycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ0NPTk5FQ1RJTkcnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENPTk5FQ1RJTkdcbiAqIEBtZW1iZXJvZiBXZWJTb2NrZXQucHJvdG90eXBlXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQucHJvdG90eXBlLCAnQ09OTkVDVElORycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ0NPTk5FQ1RJTkcnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IE9QRU5cbiAqIEBtZW1iZXJvZiBXZWJTb2NrZXRcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldCwgJ09QRU4nLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdPUEVOJylcbn0pO1xuXG4vKipcbiAqIEBjb25zdGFudCB7TnVtYmVyfSBPUEVOXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0LnByb3RvdHlwZVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0LnByb3RvdHlwZSwgJ09QRU4nLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdPUEVOJylcbn0pO1xuXG4vKipcbiAqIEBjb25zdGFudCB7TnVtYmVyfSBDTE9TSU5HXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQsICdDTE9TSU5HJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB2YWx1ZTogcmVhZHlTdGF0ZXMuaW5kZXhPZignQ0xPU0lORycpXG59KTtcblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gQ0xPU0lOR1xuICogQG1lbWJlcm9mIFdlYlNvY2tldC5wcm90b3R5cGVcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsICdDTE9TSU5HJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB2YWx1ZTogcmVhZHlTdGF0ZXMuaW5kZXhPZignQ0xPU0lORycpXG59KTtcblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gQ0xPU0VEXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQsICdDTE9TRUQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdDTE9TRUQnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENMT1NFRFxuICogQG1lbWJlcm9mIFdlYlNvY2tldC5wcm90b3R5cGVcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsICdDTE9TRUQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdDTE9TRUQnKVxufSk7XG5cbltcbiAgJ2JpbmFyeVR5cGUnLFxuICAnYnVmZmVyZWRBbW91bnQnLFxuICAnZXh0ZW5zaW9ucycsXG4gICdpc1BhdXNlZCcsXG4gICdwcm90b2NvbCcsXG4gICdyZWFkeVN0YXRlJyxcbiAgJ3VybCdcbl0uZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsIHByb3BlcnR5LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG59KTtcblxuLy9cbi8vIEFkZCB0aGUgYG9ub3BlbmAsIGBvbmVycm9yYCwgYG9uY2xvc2VgLCBhbmQgYG9ubWVzc2FnZWAgYXR0cmlidXRlcy5cbi8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jb21tcy5odG1sI3RoZS13ZWJzb2NrZXQtaW50ZXJmYWNlXG4vL1xuWydvcGVuJywgJ2Vycm9yJywgJ2Nsb3NlJywgJ21lc3NhZ2UnXS5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsIGBvbiR7bWV0aG9kfWAsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldCgpIHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMobWV0aG9kKSkge1xuICAgICAgICBpZiAobGlzdGVuZXJba0Zvck9uRXZlbnRBdHRyaWJ1dGVdKSByZXR1cm4gbGlzdGVuZXJba0xpc3RlbmVyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBzZXQoaGFuZGxlcikge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycyhtZXRob2QpKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lcltrRm9yT25FdmVudEF0dHJpYnV0ZV0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKG1ldGhvZCwgbGlzdGVuZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIobWV0aG9kLCBoYW5kbGVyLCB7XG4gICAgICAgIFtrRm9yT25FdmVudEF0dHJpYnV0ZV06IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59KTtcblxuV2ViU29ja2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcjtcbldlYlNvY2tldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IHJlbW92ZUV2ZW50TGlzdGVuZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gV2ViU29ja2V0O1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBXZWJTb2NrZXQgY2xpZW50LlxuICpcbiAqIEBwYXJhbSB7V2ViU29ja2V0fSB3ZWJzb2NrZXQgVGhlIGNsaWVudCB0byBpbml0aWFsaXplXG4gKiBAcGFyYW0geyhTdHJpbmd8VVJMKX0gYWRkcmVzcyBUaGUgVVJMIHRvIHdoaWNoIHRvIGNvbm5lY3RcbiAqIEBwYXJhbSB7QXJyYXl9IHByb3RvY29scyBUaGUgc3VicHJvdG9jb2xzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIENvbm5lY3Rpb24gb3B0aW9uc1xuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzPXRydWVdIFNwZWNpZmllcyB3aGV0aGVyIGFueVxuICogICAgIG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWQgbXVsdGlwbGVcbiAqICAgICB0aW1lcyBpbiB0aGUgc2FtZSB0aWNrXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmF1dG9Qb25nPXRydWVdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0b1xuICogICAgIGF1dG9tYXRpY2FsbHkgc2VuZCBhIHBvbmcgaW4gcmVzcG9uc2UgdG8gYSBwaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5maW5pc2hSZXF1ZXN0XSBBIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvXG4gKiAgICAgY3VzdG9taXplIHRoZSBoZWFkZXJzIG9mIGVhY2ggaHR0cCByZXF1ZXN0IGJlZm9yZSBpdCBpcyBzZW50XG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZvbGxvd1JlZGlyZWN0cz1mYWxzZV0gV2hldGhlciBvciBub3QgdG8gZm9sbG93XG4gKiAgICAgcmVkaXJlY3RzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5nZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZVxuICogICAgIG1hc2tpbmcga2V5XG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaGFuZHNoYWtlVGltZW91dF0gVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZVxuICogICAgIGhhbmRzaGFrZSByZXF1ZXN0XG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UGF5bG9hZD0xMDQ4NTc2MDBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZVxuICogICAgIHNpemVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhSZWRpcmVjdHM9MTBdIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZWRpcmVjdHNcbiAqICAgICBhbGxvd2VkXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMub3JpZ2luXSBWYWx1ZSBvZiB0aGUgYE9yaWdpbmAgb3JcbiAqICAgICBgU2VjLVdlYlNvY2tldC1PcmlnaW5gIGhlYWRlclxuICogQHBhcmFtIHsoQm9vbGVhbnxPYmplY3QpfSBbb3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZT10cnVlXSBFbmFibGUvZGlzYWJsZVxuICogICAgIHBlcm1lc3NhZ2UtZGVmbGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnByb3RvY29sVmVyc2lvbj0xM10gVmFsdWUgb2YgdGhlXG4gKiAgICAgYFNlYy1XZWJTb2NrZXQtVmVyc2lvbmAgaGVhZGVyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAqICAgICBub3QgdG8gc2tpcCBVVEYtOCB2YWxpZGF0aW9uIGZvciB0ZXh0IGFuZCBjbG9zZSBtZXNzYWdlc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaW5pdEFzQ2xpZW50KHdlYnNvY2tldCwgYWRkcmVzcywgcHJvdG9jb2xzLCBvcHRpb25zKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgYWxsb3dTeW5jaHJvbm91c0V2ZW50czogdHJ1ZSxcbiAgICBhdXRvUG9uZzogdHJ1ZSxcbiAgICBwcm90b2NvbFZlcnNpb246IHByb3RvY29sVmVyc2lvbnNbMV0sXG4gICAgbWF4UGF5bG9hZDogMTAwICogMTAyNCAqIDEwMjQsXG4gICAgc2tpcFVURjhWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICBwZXJNZXNzYWdlRGVmbGF0ZTogdHJ1ZSxcbiAgICBmb2xsb3dSZWRpcmVjdHM6IGZhbHNlLFxuICAgIG1heFJlZGlyZWN0czogMTAsXG4gICAgLi4ub3B0aW9ucyxcbiAgICBzb2NrZXRQYXRoOiB1bmRlZmluZWQsXG4gICAgaG9zdG5hbWU6IHVuZGVmaW5lZCxcbiAgICBwcm90b2NvbDogdW5kZWZpbmVkLFxuICAgIHRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIGhvc3Q6IHVuZGVmaW5lZCxcbiAgICBwYXRoOiB1bmRlZmluZWQsXG4gICAgcG9ydDogdW5kZWZpbmVkXG4gIH07XG5cbiAgd2Vic29ja2V0Ll9hdXRvUG9uZyA9IG9wdHMuYXV0b1Bvbmc7XG5cbiAgaWYgKCFwcm90b2NvbFZlcnNpb25zLmluY2x1ZGVzKG9wdHMucHJvdG9jb2xWZXJzaW9uKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIHByb3RvY29sIHZlcnNpb246ICR7b3B0cy5wcm90b2NvbFZlcnNpb259IGAgK1xuICAgICAgICBgKHN1cHBvcnRlZCB2ZXJzaW9uczogJHtwcm90b2NvbFZlcnNpb25zLmpvaW4oJywgJyl9KWBcbiAgICApO1xuICB9XG5cbiAgbGV0IHBhcnNlZFVybDtcblxuICBpZiAoYWRkcmVzcyBpbnN0YW5jZW9mIFVSTCkge1xuICAgIHBhcnNlZFVybCA9IGFkZHJlc3M7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZFVybCA9IG5ldyBVUkwoYWRkcmVzcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIFVSTDogJHthZGRyZXNzfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwOicpIHtcbiAgICBwYXJzZWRVcmwucHJvdG9jb2wgPSAnd3M6JztcbiAgfSBlbHNlIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgcGFyc2VkVXJsLnByb3RvY29sID0gJ3dzczonO1xuICB9XG5cbiAgd2Vic29ja2V0Ll91cmwgPSBwYXJzZWRVcmwuaHJlZjtcblxuICBjb25zdCBpc1NlY3VyZSA9IHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ3dzczonO1xuICBjb25zdCBpc0lwY1VybCA9IHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ3dzK3VuaXg6JztcbiAgbGV0IGludmFsaWRVcmxNZXNzYWdlO1xuXG4gIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgIT09ICd3czonICYmICFpc1NlY3VyZSAmJiAhaXNJcGNVcmwpIHtcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9XG4gICAgICAnVGhlIFVSTFxcJ3MgcHJvdG9jb2wgbXVzdCBiZSBvbmUgb2YgXCJ3czpcIiwgXCJ3c3M6XCIsICcgK1xuICAgICAgJ1wiaHR0cDpcIiwgXCJodHRwc1wiLCBvciBcIndzK3VuaXg6XCInO1xuICB9IGVsc2UgaWYgKGlzSXBjVXJsICYmICFwYXJzZWRVcmwucGF0aG5hbWUpIHtcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9IFwiVGhlIFVSTCdzIHBhdGhuYW1lIGlzIGVtcHR5XCI7XG4gIH0gZWxzZSBpZiAocGFyc2VkVXJsLmhhc2gpIHtcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9ICdUaGUgVVJMIGNvbnRhaW5zIGEgZnJhZ21lbnQgaWRlbnRpZmllcic7XG4gIH1cblxuICBpZiAoaW52YWxpZFVybE1lc3NhZ2UpIHtcbiAgICBjb25zdCBlcnIgPSBuZXcgU3ludGF4RXJyb3IoaW52YWxpZFVybE1lc3NhZ2UpO1xuXG4gICAgaWYgKHdlYnNvY2tldC5fcmVkaXJlY3RzID09PSAwKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXRFcnJvckFuZENsb3NlKHdlYnNvY2tldCwgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWZhdWx0UG9ydCA9IGlzU2VjdXJlID8gNDQzIDogODA7XG4gIGNvbnN0IGtleSA9IHJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIGNvbnN0IHJlcXVlc3QgPSBpc1NlY3VyZSA/IGh0dHBzLnJlcXVlc3QgOiBodHRwLnJlcXVlc3Q7XG4gIGNvbnN0IHByb3RvY29sU2V0ID0gbmV3IFNldCgpO1xuICBsZXQgcGVyTWVzc2FnZURlZmxhdGU7XG5cbiAgb3B0cy5jcmVhdGVDb25uZWN0aW9uID1cbiAgICBvcHRzLmNyZWF0ZUNvbm5lY3Rpb24gfHwgKGlzU2VjdXJlID8gdGxzQ29ubmVjdCA6IG5ldENvbm5lY3QpO1xuICBvcHRzLmRlZmF1bHRQb3J0ID0gb3B0cy5kZWZhdWx0UG9ydCB8fCBkZWZhdWx0UG9ydDtcbiAgb3B0cy5wb3J0ID0gcGFyc2VkVXJsLnBvcnQgfHwgZGVmYXVsdFBvcnQ7XG4gIG9wdHMuaG9zdCA9IHBhcnNlZFVybC5ob3N0bmFtZS5zdGFydHNXaXRoKCdbJylcbiAgICA/IHBhcnNlZFVybC5ob3N0bmFtZS5zbGljZSgxLCAtMSlcbiAgICA6IHBhcnNlZFVybC5ob3N0bmFtZTtcbiAgb3B0cy5oZWFkZXJzID0ge1xuICAgIC4uLm9wdHMuaGVhZGVycyxcbiAgICAnU2VjLVdlYlNvY2tldC1WZXJzaW9uJzogb3B0cy5wcm90b2NvbFZlcnNpb24sXG4gICAgJ1NlYy1XZWJTb2NrZXQtS2V5Jzoga2V5LFxuICAgIENvbm5lY3Rpb246ICdVcGdyYWRlJyxcbiAgICBVcGdyYWRlOiAnd2Vic29ja2V0J1xuICB9O1xuICBvcHRzLnBhdGggPSBwYXJzZWRVcmwucGF0aG5hbWUgKyBwYXJzZWRVcmwuc2VhcmNoO1xuICBvcHRzLnRpbWVvdXQgPSBvcHRzLmhhbmRzaGFrZVRpbWVvdXQ7XG5cbiAgaWYgKG9wdHMucGVyTWVzc2FnZURlZmxhdGUpIHtcbiAgICBwZXJNZXNzYWdlRGVmbGF0ZSA9IG5ldyBQZXJNZXNzYWdlRGVmbGF0ZShcbiAgICAgIG9wdHMucGVyTWVzc2FnZURlZmxhdGUgIT09IHRydWUgPyBvcHRzLnBlck1lc3NhZ2VEZWZsYXRlIDoge30sXG4gICAgICBmYWxzZSxcbiAgICAgIG9wdHMubWF4UGF5bG9hZFxuICAgICk7XG4gICAgb3B0cy5oZWFkZXJzWydTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMnXSA9IGZvcm1hdCh7XG4gICAgICBbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV06IHBlck1lc3NhZ2VEZWZsYXRlLm9mZmVyKClcbiAgICB9KTtcbiAgfVxuICBpZiAocHJvdG9jb2xzLmxlbmd0aCkge1xuICAgIGZvciAoY29uc3QgcHJvdG9jb2wgb2YgcHJvdG9jb2xzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBwcm90b2NvbCAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgIXN1YnByb3RvY29sUmVnZXgudGVzdChwcm90b2NvbCkgfHxcbiAgICAgICAgcHJvdG9jb2xTZXQuaGFzKHByb3RvY29sKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICAnQW4gaW52YWxpZCBvciBkdXBsaWNhdGVkIHN1YnByb3RvY29sIHdhcyBzcGVjaWZpZWQnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHByb3RvY29sU2V0LmFkZChwcm90b2NvbCk7XG4gICAgfVxuXG4gICAgb3B0cy5oZWFkZXJzWydTZWMtV2ViU29ja2V0LVByb3RvY29sJ10gPSBwcm90b2NvbHMuam9pbignLCcpO1xuICB9XG4gIGlmIChvcHRzLm9yaWdpbikge1xuICAgIGlmIChvcHRzLnByb3RvY29sVmVyc2lvbiA8IDEzKSB7XG4gICAgICBvcHRzLmhlYWRlcnNbJ1NlYy1XZWJTb2NrZXQtT3JpZ2luJ10gPSBvcHRzLm9yaWdpbjtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0cy5oZWFkZXJzLk9yaWdpbiA9IG9wdHMub3JpZ2luO1xuICAgIH1cbiAgfVxuICBpZiAocGFyc2VkVXJsLnVzZXJuYW1lIHx8IHBhcnNlZFVybC5wYXNzd29yZCkge1xuICAgIG9wdHMuYXV0aCA9IGAke3BhcnNlZFVybC51c2VybmFtZX06JHtwYXJzZWRVcmwucGFzc3dvcmR9YDtcbiAgfVxuXG4gIGlmIChpc0lwY1VybCkge1xuICAgIGNvbnN0IHBhcnRzID0gb3B0cy5wYXRoLnNwbGl0KCc6Jyk7XG5cbiAgICBvcHRzLnNvY2tldFBhdGggPSBwYXJ0c1swXTtcbiAgICBvcHRzLnBhdGggPSBwYXJ0c1sxXTtcbiAgfVxuXG4gIGxldCByZXE7XG5cbiAgaWYgKG9wdHMuZm9sbG93UmVkaXJlY3RzKSB7XG4gICAgaWYgKHdlYnNvY2tldC5fcmVkaXJlY3RzID09PSAwKSB7XG4gICAgICB3ZWJzb2NrZXQuX29yaWdpbmFsSXBjID0gaXNJcGNVcmw7XG4gICAgICB3ZWJzb2NrZXQuX29yaWdpbmFsU2VjdXJlID0gaXNTZWN1cmU7XG4gICAgICB3ZWJzb2NrZXQuX29yaWdpbmFsSG9zdE9yU29ja2V0UGF0aCA9IGlzSXBjVXJsXG4gICAgICAgID8gb3B0cy5zb2NrZXRQYXRoXG4gICAgICAgIDogcGFyc2VkVXJsLmhvc3Q7XG5cbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBvcHRpb25zICYmIG9wdGlvbnMuaGVhZGVycztcblxuICAgICAgLy9cbiAgICAgIC8vIFNoYWxsb3cgY29weSB0aGUgdXNlciBwcm92aWRlZCBvcHRpb25zIHNvIHRoYXQgaGVhZGVycyBjYW4gYmUgY2hhbmdlZFxuICAgICAgLy8gd2l0aG91dCBtdXRhdGluZyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgICAgLy9cbiAgICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIGhlYWRlcnM6IHt9IH07XG5cbiAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh3ZWJzb2NrZXQubGlzdGVuZXJDb3VudCgncmVkaXJlY3QnKSA9PT0gMCkge1xuICAgICAgY29uc3QgaXNTYW1lSG9zdCA9IGlzSXBjVXJsXG4gICAgICAgID8gd2Vic29ja2V0Ll9vcmlnaW5hbElwY1xuICAgICAgICAgID8gb3B0cy5zb2NrZXRQYXRoID09PSB3ZWJzb2NrZXQuX29yaWdpbmFsSG9zdE9yU29ja2V0UGF0aFxuICAgICAgICAgIDogZmFsc2VcbiAgICAgICAgOiB3ZWJzb2NrZXQuX29yaWdpbmFsSXBjXG4gICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgIDogcGFyc2VkVXJsLmhvc3QgPT09IHdlYnNvY2tldC5fb3JpZ2luYWxIb3N0T3JTb2NrZXRQYXRoO1xuXG4gICAgICBpZiAoIWlzU2FtZUhvc3QgfHwgKHdlYnNvY2tldC5fb3JpZ2luYWxTZWN1cmUgJiYgIWlzU2VjdXJlKSkge1xuICAgICAgICAvL1xuICAgICAgICAvLyBNYXRjaCBjdXJsIDcuNzcuMCBiZWhhdmlvciBhbmQgZHJvcCB0aGUgZm9sbG93aW5nIGhlYWRlcnMuIFRoZXNlXG4gICAgICAgIC8vIGhlYWRlcnMgYXJlIGFsc28gZHJvcHBlZCB3aGVuIGZvbGxvd2luZyBhIHJlZGlyZWN0IHRvIGEgc3ViZG9tYWluLlxuICAgICAgICAvL1xuICAgICAgICBkZWxldGUgb3B0cy5oZWFkZXJzLmF1dGhvcml6YXRpb247XG4gICAgICAgIGRlbGV0ZSBvcHRzLmhlYWRlcnMuY29va2llO1xuXG4gICAgICAgIGlmICghaXNTYW1lSG9zdCkgZGVsZXRlIG9wdHMuaGVhZGVycy5ob3N0O1xuXG4gICAgICAgIG9wdHMuYXV0aCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIE1hdGNoIGN1cmwgNy43Ny4wIGJlaGF2aW9yIGFuZCBtYWtlIHRoZSBmaXJzdCBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIHdpbi5cbiAgICAvLyBJZiB0aGUgYEF1dGhvcml6YXRpb25gIGhlYWRlciBpcyBzZXQsIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkbyBhcyBpdFxuICAgIC8vIHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICAgIC8vXG4gICAgaWYgKG9wdHMuYXV0aCAmJiAhb3B0aW9ucy5oZWFkZXJzLmF1dGhvcml6YXRpb24pIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5hdXRob3JpemF0aW9uID1cbiAgICAgICAgJ0Jhc2ljICcgKyBCdWZmZXIuZnJvbShvcHRzLmF1dGgpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICByZXEgPSB3ZWJzb2NrZXQuX3JlcSA9IHJlcXVlc3Qob3B0cyk7XG5cbiAgICBpZiAod2Vic29ja2V0Ll9yZWRpcmVjdHMpIHtcbiAgICAgIC8vXG4gICAgICAvLyBVbmxpa2Ugd2hhdCBpcyBkb25lIGZvciB0aGUgYCd1cGdyYWRlJ2AgZXZlbnQsIG5vIGVhcmx5IGV4aXQgaXNcbiAgICAgIC8vIHRyaWdnZXJlZCBoZXJlIGlmIHRoZSB1c2VyIGNhbGxzIGB3ZWJzb2NrZXQuY2xvc2UoKWAgb3JcbiAgICAgIC8vIGB3ZWJzb2NrZXQudGVybWluYXRlKClgIGZyb20gYSBsaXN0ZW5lciBvZiB0aGUgYCdyZWRpcmVjdCdgIGV2ZW50LiBUaGlzXG4gICAgICAvLyBpcyBiZWNhdXNlIHRoZSB1c2VyIGNhbiBhbHNvIGNhbGwgYHJlcXVlc3QuZGVzdHJveSgpYCB3aXRoIGFuIGVycm9yXG4gICAgICAvLyBiZWZvcmUgY2FsbGluZyBgd2Vic29ja2V0LmNsb3NlKClgIG9yIGB3ZWJzb2NrZXQudGVybWluYXRlKClgIGFuZCB0aGlzXG4gICAgICAvLyB3b3VsZCByZXN1bHQgaW4gYW4gZXJyb3IgYmVpbmcgZW1pdHRlZCBvbiB0aGUgYHJlcXVlc3RgIG9iamVjdCB3aXRoIG5vXG4gICAgICAvLyBgJ2Vycm9yJ2AgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkLlxuICAgICAgLy9cbiAgICAgIHdlYnNvY2tldC5lbWl0KCdyZWRpcmVjdCcsIHdlYnNvY2tldC51cmwsIHJlcSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlcSA9IHdlYnNvY2tldC5fcmVxID0gcmVxdWVzdChvcHRzKTtcbiAgfVxuXG4gIGlmIChvcHRzLnRpbWVvdXQpIHtcbiAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHJlcSwgJ09wZW5pbmcgaGFuZHNoYWtlIGhhcyB0aW1lZCBvdXQnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgaWYgKHJlcSA9PT0gbnVsbCB8fCByZXFba0Fib3J0ZWRdKSByZXR1cm47XG5cbiAgICByZXEgPSB3ZWJzb2NrZXQuX3JlcSA9IG51bGw7XG4gICAgZW1pdEVycm9yQW5kQ2xvc2Uod2Vic29ja2V0LCBlcnIpO1xuICB9KTtcblxuICByZXEub24oJ3Jlc3BvbnNlJywgKHJlcykgPT4ge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gcmVzLmhlYWRlcnMubG9jYXRpb247XG4gICAgY29uc3Qgc3RhdHVzQ29kZSA9IHJlcy5zdGF0dXNDb2RlO1xuXG4gICAgaWYgKFxuICAgICAgbG9jYXRpb24gJiZcbiAgICAgIG9wdHMuZm9sbG93UmVkaXJlY3RzICYmXG4gICAgICBzdGF0dXNDb2RlID49IDMwMCAmJlxuICAgICAgc3RhdHVzQ29kZSA8IDQwMFxuICAgICkge1xuICAgICAgaWYgKCsrd2Vic29ja2V0Ll9yZWRpcmVjdHMgPiBvcHRzLm1heFJlZGlyZWN0cykge1xuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHJlcSwgJ01heGltdW0gcmVkaXJlY3RzIGV4Y2VlZGVkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVxLmFib3J0KCk7XG5cbiAgICAgIGxldCBhZGRyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhZGRyID0gbmV3IFVSTChsb2NhdGlvbiwgYWRkcmVzcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBVUkw6ICR7bG9jYXRpb259YCk7XG4gICAgICAgIGVtaXRFcnJvckFuZENsb3NlKHdlYnNvY2tldCwgZXJyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpbml0QXNDbGllbnQod2Vic29ja2V0LCBhZGRyLCBwcm90b2NvbHMsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXdlYnNvY2tldC5lbWl0KCd1bmV4cGVjdGVkLXJlc3BvbnNlJywgcmVxLCByZXMpKSB7XG4gICAgICBhYm9ydEhhbmRzaGFrZShcbiAgICAgICAgd2Vic29ja2V0LFxuICAgICAgICByZXEsXG4gICAgICAgIGBVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZTogJHtyZXMuc3RhdHVzQ29kZX1gXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmVxLm9uKCd1cGdyYWRlJywgKHJlcywgc29ja2V0LCBoZWFkKSA9PiB7XG4gICAgd2Vic29ja2V0LmVtaXQoJ3VwZ3JhZGUnLCByZXMpO1xuXG4gICAgLy9cbiAgICAvLyBUaGUgdXNlciBtYXkgaGF2ZSBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gZnJvbSBhIGxpc3RlbmVyIG9mIHRoZVxuICAgIC8vIGAndXBncmFkZSdgIGV2ZW50LlxuICAgIC8vXG4gICAgaWYgKHdlYnNvY2tldC5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuQ09OTkVDVElORykgcmV0dXJuO1xuXG4gICAgcmVxID0gd2Vic29ja2V0Ll9yZXEgPSBudWxsO1xuXG4gICAgY29uc3QgdXBncmFkZSA9IHJlcy5oZWFkZXJzLnVwZ3JhZGU7XG5cbiAgICBpZiAodXBncmFkZSA9PT0gdW5kZWZpbmVkIHx8IHVwZ3JhZGUudG9Mb3dlckNhc2UoKSAhPT0gJ3dlYnNvY2tldCcpIHtcbiAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCAnSW52YWxpZCBVcGdyYWRlIGhlYWRlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goJ3NoYTEnKVxuICAgICAgLnVwZGF0ZShrZXkgKyBHVUlEKVxuICAgICAgLmRpZ2VzdCgnYmFzZTY0Jyk7XG5cbiAgICBpZiAocmVzLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQtYWNjZXB0J10gIT09IGRpZ2VzdCkge1xuICAgICAgYWJvcnRIYW5kc2hha2Uod2Vic29ja2V0LCBzb2NrZXQsICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtQWNjZXB0IGhlYWRlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZlclByb3QgPSByZXMuaGVhZGVyc1snc2VjLXdlYnNvY2tldC1wcm90b2NvbCddO1xuICAgIGxldCBwcm90RXJyb3I7XG5cbiAgICBpZiAoc2VydmVyUHJvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIXByb3RvY29sU2V0LnNpemUpIHtcbiAgICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IGEgc3VicHJvdG9jb2wgYnV0IG5vbmUgd2FzIHJlcXVlc3RlZCc7XG4gICAgICB9IGVsc2UgaWYgKCFwcm90b2NvbFNldC5oYXMoc2VydmVyUHJvdCkpIHtcbiAgICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IGFuIGludmFsaWQgc3VicHJvdG9jb2wnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvdG9jb2xTZXQuc2l6ZSkge1xuICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IG5vIHN1YnByb3RvY29sJztcbiAgICB9XG5cbiAgICBpZiAocHJvdEVycm9yKSB7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgcHJvdEVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VydmVyUHJvdCkgd2Vic29ja2V0Ll9wcm90b2NvbCA9IHNlcnZlclByb3Q7XG5cbiAgICBjb25zdCBzZWNXZWJTb2NrZXRFeHRlbnNpb25zID0gcmVzLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQtZXh0ZW5zaW9ucyddO1xuXG4gICAgaWYgKHNlY1dlYlNvY2tldEV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFwZXJNZXNzYWdlRGVmbGF0ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgICAnU2VydmVyIHNlbnQgYSBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMgaGVhZGVyIGJ1dCBubyBleHRlbnNpb24gJyArXG4gICAgICAgICAgJ3dhcyByZXF1ZXN0ZWQnO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGV4dGVuc2lvbnM7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGV4dGVuc2lvbnMgPSBwYXJzZShzZWNXZWJTb2NrZXRFeHRlbnNpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIGhlYWRlcic7XG4gICAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCBtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRlbnNpb25OYW1lcyA9IE9iamVjdC5rZXlzKGV4dGVuc2lvbnMpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGV4dGVuc2lvbk5hbWVzLmxlbmd0aCAhPT0gMSB8fFxuICAgICAgICBleHRlbnNpb25OYW1lc1swXSAhPT0gUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnU2VydmVyIGluZGljYXRlZCBhbiBleHRlbnNpb24gdGhhdCB3YXMgbm90IHJlcXVlc3RlZCc7XG4gICAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCBtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBwZXJNZXNzYWdlRGVmbGF0ZS5hY2NlcHQoZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyBoZWFkZXInO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2Vic29ja2V0Ll9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdID1cbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGU7XG4gICAgfVxuXG4gICAgd2Vic29ja2V0LnNldFNvY2tldChzb2NrZXQsIGhlYWQsIHtcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IG9wdHMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cyxcbiAgICAgIGdlbmVyYXRlTWFzazogb3B0cy5nZW5lcmF0ZU1hc2ssXG4gICAgICBtYXhQYXlsb2FkOiBvcHRzLm1heFBheWxvYWQsXG4gICAgICBza2lwVVRGOFZhbGlkYXRpb246IG9wdHMuc2tpcFVURjhWYWxpZGF0aW9uXG4gICAgfSk7XG4gIH0pO1xuXG4gIGlmIChvcHRzLmZpbmlzaFJlcXVlc3QpIHtcbiAgICBvcHRzLmZpbmlzaFJlcXVlc3QocmVxLCB3ZWJzb2NrZXQpO1xuICB9IGVsc2Uge1xuICAgIHJlcS5lbmQoKTtcbiAgfVxufVxuXG4vKipcbiAqIEVtaXQgdGhlIGAnZXJyb3InYCBhbmQgYCdjbG9zZSdgIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7RXJyb3J9IFRoZSBlcnJvciB0byBlbWl0XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBlbWl0RXJyb3JBbmRDbG9zZSh3ZWJzb2NrZXQsIGVycikge1xuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcbiAgLy9cbiAgLy8gVGhlIGZvbGxvd2luZyBhc3NpZ25tZW50IGlzIHByYWN0aWNhbGx5IHVzZWxlc3MgYW5kIGlzIGRvbmUgb25seSBmb3JcbiAgLy8gY29uc2lzdGVuY3kuXG4gIC8vXG4gIHdlYnNvY2tldC5fZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgd2Vic29ja2V0LmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgd2Vic29ja2V0LmVtaXRDbG9zZSgpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGBuZXQuU29ja2V0YCBhbmQgaW5pdGlhdGUgYSBjb25uZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIENvbm5lY3Rpb24gb3B0aW9uc1xuICogQHJldHVybiB7bmV0LlNvY2tldH0gVGhlIG5ld2x5IGNyZWF0ZWQgc29ja2V0IHVzZWQgdG8gc3RhcnQgdGhlIGNvbm5lY3Rpb25cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG5ldENvbm5lY3Qob3B0aW9ucykge1xuICBvcHRpb25zLnBhdGggPSBvcHRpb25zLnNvY2tldFBhdGg7XG4gIHJldHVybiBuZXQuY29ubmVjdChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgdGxzLlRMU1NvY2tldGAgYW5kIGluaXRpYXRlIGEgY29ubmVjdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBDb25uZWN0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm4ge3Rscy5UTFNTb2NrZXR9IFRoZSBuZXdseSBjcmVhdGVkIHNvY2tldCB1c2VkIHRvIHN0YXJ0IHRoZSBjb25uZWN0aW9uXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0bHNDb25uZWN0KG9wdGlvbnMpIHtcbiAgb3B0aW9ucy5wYXRoID0gdW5kZWZpbmVkO1xuXG4gIGlmICghb3B0aW9ucy5zZXJ2ZXJuYW1lICYmIG9wdGlvbnMuc2VydmVybmFtZSAhPT0gJycpIHtcbiAgICBvcHRpb25zLnNlcnZlcm5hbWUgPSBuZXQuaXNJUChvcHRpb25zLmhvc3QpID8gJycgOiBvcHRpb25zLmhvc3Q7XG4gIH1cblxuICByZXR1cm4gdGxzLmNvbm5lY3Qob3B0aW9ucyk7XG59XG5cbi8qKlxuICogQWJvcnQgdGhlIGhhbmRzaGFrZSBhbmQgZW1pdCBhbiBlcnJvci5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7KGh0dHAuQ2xpZW50UmVxdWVzdHxuZXQuU29ja2V0fHRscy5Tb2NrZXQpfSBzdHJlYW0gVGhlIHJlcXVlc3QgdG9cbiAqICAgICBhYm9ydCBvciB0aGUgc29ja2V0IHRvIGRlc3Ryb3lcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHN0cmVhbSwgbWVzc2FnZSkge1xuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcblxuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgYWJvcnRIYW5kc2hha2UpO1xuXG4gIGlmIChzdHJlYW0uc2V0SGVhZGVyKSB7XG4gICAgc3RyZWFtW2tBYm9ydGVkXSA9IHRydWU7XG4gICAgc3RyZWFtLmFib3J0KCk7XG5cbiAgICBpZiAoc3RyZWFtLnNvY2tldCAmJiAhc3RyZWFtLnNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIC8vXG4gICAgICAvLyBPbiBOb2RlLmpzID49IDE0LjMuMCBgcmVxdWVzdC5hYm9ydCgpYCBkb2VzIG5vdCBkZXN0cm95IHRoZSBzb2NrZXQgaWZcbiAgICAgIC8vIGNhbGxlZCBhZnRlciB0aGUgcmVxdWVzdCBjb21wbGV0ZWQuIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvaXNzdWVzLzE4NjkuXG4gICAgICAvL1xuICAgICAgc3RyZWFtLnNvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JBbmRDbG9zZSwgd2Vic29ja2V0LCBlcnIpO1xuICB9IGVsc2Uge1xuICAgIHN0cmVhbS5kZXN0cm95KGVycik7XG4gICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgd2Vic29ja2V0LmVtaXQuYmluZCh3ZWJzb2NrZXQsICdlcnJvcicpKTtcbiAgICBzdHJlYW0ub25jZSgnY2xvc2UnLCB3ZWJzb2NrZXQuZW1pdENsb3NlLmJpbmQod2Vic29ja2V0KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgY2FzZXMgd2hlcmUgdGhlIGBwaW5nKClgLCBgcG9uZygpYCwgb3IgYHNlbmQoKWAgbWV0aG9kcyBhcmUgY2FsbGVkXG4gKiB3aGVuIHRoZSBgcmVhZHlTdGF0ZWAgYXR0cmlidXRlIGlzIGBDTE9TSU5HYCBvciBgQ0xPU0VEYC5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Kn0gW2RhdGFdIFRoZSBkYXRhIHRvIHNlbmRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNlbmRBZnRlckNsb3NlKHdlYnNvY2tldCwgZGF0YSwgY2IpIHtcbiAgaWYgKGRhdGEpIHtcbiAgICBjb25zdCBsZW5ndGggPSBpc0Jsb2IoZGF0YSkgPyBkYXRhLnNpemUgOiB0b0J1ZmZlcihkYXRhKS5sZW5ndGg7XG5cbiAgICAvL1xuICAgIC8vIFRoZSBgX2J1ZmZlcmVkQW1vdW50YCBwcm9wZXJ0eSBpcyB1c2VkIG9ubHkgd2hlbiB0aGUgcGVlciBpcyBhIGNsaWVudCBhbmRcbiAgICAvLyB0aGUgb3BlbmluZyBoYW5kc2hha2UgZmFpbHMuIFVuZGVyIHRoZXNlIGNpcmN1bXN0YW5jZXMsIGluIGZhY3QsIHRoZVxuICAgIC8vIGBzZXRTb2NrZXQoKWAgbWV0aG9kIGlzIG5vdCBjYWxsZWQsIHNvIHRoZSBgX3NvY2tldGAgYW5kIGBfc2VuZGVyYFxuICAgIC8vIHByb3BlcnRpZXMgYXJlIHNldCB0byBgbnVsbGAuXG4gICAgLy9cbiAgICBpZiAod2Vic29ja2V0Ll9zb2NrZXQpIHdlYnNvY2tldC5fc2VuZGVyLl9idWZmZXJlZEJ5dGVzICs9IGxlbmd0aDtcbiAgICBlbHNlIHdlYnNvY2tldC5fYnVmZmVyZWRBbW91bnQgKz0gbGVuZ3RoO1xuICB9XG5cbiAgaWYgKGNiKSB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgYFdlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAke3dlYnNvY2tldC5yZWFkeVN0YXRlfSBgICtcbiAgICAgICAgYCgke3JlYWR5U3RhdGVzW3dlYnNvY2tldC5yZWFkeVN0YXRlXX0pYFxuICAgICk7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXJyKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYFJlY2VpdmVyYCBgJ2NvbmNsdWRlJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGUgVGhlIHN0YXR1cyBjb2RlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gcmVhc29uIFRoZSByZWFzb24gZm9yIGNsb3NpbmdcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25Db25jbHVkZShjb2RlLCByZWFzb24pIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICB3ZWJzb2NrZXQuX2Nsb3NlRnJhbWVSZWNlaXZlZCA9IHRydWU7XG4gIHdlYnNvY2tldC5fY2xvc2VNZXNzYWdlID0gcmVhc29uO1xuICB3ZWJzb2NrZXQuX2Nsb3NlQ29kZSA9IGNvZGU7XG5cbiAgaWYgKHdlYnNvY2tldC5fc29ja2V0W2tXZWJTb2NrZXRdID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICB3ZWJzb2NrZXQuX3NvY2tldC5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHNvY2tldE9uRGF0YSk7XG4gIHByb2Nlc3MubmV4dFRpY2socmVzdW1lLCB3ZWJzb2NrZXQuX3NvY2tldCk7XG5cbiAgaWYgKGNvZGUgPT09IDEwMDUpIHdlYnNvY2tldC5jbG9zZSgpO1xuICBlbHNlIHdlYnNvY2tldC5jbG9zZShjb2RlLCByZWFzb24pO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYFJlY2VpdmVyYCBgJ2RyYWluJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZXJPbkRyYWluKCkge1xuICBjb25zdCB3ZWJzb2NrZXQgPSB0aGlzW2tXZWJTb2NrZXRdO1xuXG4gIGlmICghd2Vic29ja2V0LmlzUGF1c2VkKSB3ZWJzb2NrZXQuX3NvY2tldC5yZXN1bWUoKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFJhbmdlRXJyb3J8RXJyb3IpfSBlcnIgVGhlIGVtaXR0ZWQgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25FcnJvcihlcnIpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICBpZiAod2Vic29ja2V0Ll9zb2NrZXRba1dlYlNvY2tldF0gIT09IHVuZGVmaW5lZCkge1xuICAgIHdlYnNvY2tldC5fc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgc29ja2V0T25EYXRhKTtcblxuICAgIC8vXG4gICAgLy8gT24gTm9kZS5qcyA8IDE0LjAuMCB0aGUgYCdlcnJvcidgIGV2ZW50IGlzIGVtaXR0ZWQgc3luY2hyb25vdXNseS4gU2VlXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvaXNzdWVzLzE5NDAuXG4gICAgLy9cbiAgICBwcm9jZXNzLm5leHRUaWNrKHJlc3VtZSwgd2Vic29ja2V0Ll9zb2NrZXQpO1xuXG4gICAgd2Vic29ja2V0LmNsb3NlKGVycltrU3RhdHVzQ29kZV0pO1xuICB9XG5cbiAgaWYgKCF3ZWJzb2NrZXQuX2Vycm9yRW1pdHRlZCkge1xuICAgIHdlYnNvY2tldC5fZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICB3ZWJzb2NrZXQuZW1pdCgnZXJyb3InLCBlcnIpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgUmVjZWl2ZXJgIGAnZmluaXNoJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZXJPbkZpbmlzaCgpIHtcbiAgdGhpc1trV2ViU29ja2V0XS5lbWl0Q2xvc2UoKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdtZXNzYWdlJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ8QXJyYXlCdWZmZXJ8QnVmZmVyW10pfSBkYXRhIFRoZSBtZXNzYWdlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzQmluYXJ5IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGJpbmFyeSBvciBub3RcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25NZXNzYWdlKGRhdGEsIGlzQmluYXJ5KSB7XG4gIHRoaXNba1dlYlNvY2tldF0uZW1pdCgnbWVzc2FnZScsIGRhdGEsIGlzQmluYXJ5KTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdwaW5nJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgVGhlIGRhdGEgaW5jbHVkZWQgaW4gdGhlIHBpbmcgZnJhbWVcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25QaW5nKGRhdGEpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICBpZiAod2Vic29ja2V0Ll9hdXRvUG9uZykgd2Vic29ja2V0LnBvbmcoZGF0YSwgIXRoaXMuX2lzU2VydmVyLCBOT09QKTtcbiAgd2Vic29ja2V0LmVtaXQoJ3BpbmcnLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdwb25nJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgVGhlIGRhdGEgaW5jbHVkZWQgaW4gdGhlIHBvbmcgZnJhbWVcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25Qb25nKGRhdGEpIHtcbiAgdGhpc1trV2ViU29ja2V0XS5lbWl0KCdwb25nJywgZGF0YSk7XG59XG5cbi8qKlxuICogUmVzdW1lIGEgcmVhZGFibGUgc3RyZWFtXG4gKlxuICogQHBhcmFtIHtSZWFkYWJsZX0gc3RyZWFtIFRoZSByZWFkYWJsZSBzdHJlYW1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0pIHtcbiAgc3RyZWFtLnJlc3VtZSgpO1xufVxuXG4vKipcbiAqIFRoZSBgU2VuZGVyYCBlcnJvciBldmVudCBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IFRoZSBlcnJvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2VuZGVyT25FcnJvcihlcnIpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICBpZiAod2Vic29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRUQpIHJldHVybjtcbiAgaWYgKHdlYnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgIHdlYnNvY2tldC5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgIHNldENsb3NlVGltZXIod2Vic29ja2V0KTtcbiAgfVxuXG4gIC8vXG4gIC8vIGBzb2NrZXQuZW5kKClgIGlzIHVzZWQgaW5zdGVhZCBvZiBgc29ja2V0LmRlc3Ryb3koKWAgdG8gYWxsb3cgdGhlIG90aGVyXG4gIC8vIHBlZXIgdG8gZmluaXNoIHNlbmRpbmcgcXVldWVkIGRhdGEuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IGEgdGltZXIgaGVyZVxuICAvLyBiZWNhdXNlIGBDTE9TSU5HYCBtZWFucyB0aGF0IGl0IGlzIGFscmVhZHkgc2V0IG9yIG5vdCBuZWVkZWQuXG4gIC8vXG4gIHRoaXMuX3NvY2tldC5lbmQoKTtcblxuICBpZiAoIXdlYnNvY2tldC5fZXJyb3JFbWl0dGVkKSB7XG4gICAgd2Vic29ja2V0Ll9lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHdlYnNvY2tldC5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYSB0aW1lciB0byBkZXN0cm95IHRoZSB1bmRlcmx5aW5nIHJhdyBzb2NrZXQgb2YgYSBXZWJTb2NrZXQuXG4gKlxuICogQHBhcmFtIHtXZWJTb2NrZXR9IHdlYnNvY2tldCBUaGUgV2ViU29ja2V0IGluc3RhbmNlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXRDbG9zZVRpbWVyKHdlYnNvY2tldCkge1xuICB3ZWJzb2NrZXQuX2Nsb3NlVGltZXIgPSBzZXRUaW1lb3V0KFxuICAgIHdlYnNvY2tldC5fc29ja2V0LmRlc3Ryb3kuYmluZCh3ZWJzb2NrZXQuX3NvY2tldCksXG4gICAgY2xvc2VUaW1lb3V0XG4gICk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBzb2NrZXQgYCdjbG9zZSdgIGV2ZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNvY2tldE9uQ2xvc2UoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XG5cbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBzb2NrZXRPbkNsb3NlKTtcbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHNvY2tldE9uRGF0YSk7XG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHNvY2tldE9uRW5kKTtcblxuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcblxuICBsZXQgY2h1bms7XG5cbiAgLy9cbiAgLy8gVGhlIGNsb3NlIGZyYW1lIG1pZ2h0IG5vdCBoYXZlIGJlZW4gcmVjZWl2ZWQgb3IgdGhlIGAnZW5kJ2AgZXZlbnQgZW1pdHRlZCxcbiAgLy8gZm9yIGV4YW1wbGUsIGlmIHRoZSBzb2NrZXQgd2FzIGRlc3Ryb3llZCBkdWUgdG8gYW4gZXJyb3IuIEVuc3VyZSB0aGF0IHRoZVxuICAvLyBgcmVjZWl2ZXJgIHN0cmVhbSBpcyBjbG9zZWQgYWZ0ZXIgd3JpdGluZyBhbnkgcmVtYWluaW5nIGJ1ZmZlcmVkIGRhdGEgdG9cbiAgLy8gaXQuIElmIHRoZSByZWFkYWJsZSBzaWRlIG9mIHRoZSBzb2NrZXQgaXMgaW4gZmxvd2luZyBtb2RlIHRoZW4gdGhlcmUgaXMgbm9cbiAgLy8gYnVmZmVyZWQgZGF0YSBhcyBldmVyeXRoaW5nIGhhcyBiZWVuIGFscmVhZHkgd3JpdHRlbiBhbmQgYHJlYWRhYmxlLnJlYWQoKWBcbiAgLy8gd2lsbCByZXR1cm4gYG51bGxgLiBJZiBpbnN0ZWFkLCB0aGUgc29ja2V0IGlzIHBhdXNlZCwgYW55IHBvc3NpYmxlIGJ1ZmZlcmVkXG4gIC8vIGRhdGEgd2lsbCBiZSByZWFkIGFzIGEgc2luZ2xlIGNodW5rLlxuICAvL1xuICBpZiAoXG4gICAgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCAmJlxuICAgICF3ZWJzb2NrZXQuX2Nsb3NlRnJhbWVSZWNlaXZlZCAmJlxuICAgICF3ZWJzb2NrZXQuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCAmJlxuICAgIChjaHVuayA9IHdlYnNvY2tldC5fc29ja2V0LnJlYWQoKSkgIT09IG51bGxcbiAgKSB7XG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci53cml0ZShjaHVuayk7XG4gIH1cblxuICB3ZWJzb2NrZXQuX3JlY2VpdmVyLmVuZCgpO1xuXG4gIHRoaXNba1dlYlNvY2tldF0gPSB1bmRlZmluZWQ7XG5cbiAgY2xlYXJUaW1lb3V0KHdlYnNvY2tldC5fY2xvc2VUaW1lcik7XG5cbiAgaWYgKFxuICAgIHdlYnNvY2tldC5fcmVjZWl2ZXIuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgfHxcbiAgICB3ZWJzb2NrZXQuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZFxuICApIHtcbiAgICB3ZWJzb2NrZXQuZW1pdENsb3NlKCk7XG4gIH0gZWxzZSB7XG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci5vbignZXJyb3InLCByZWNlaXZlck9uRmluaXNoKTtcbiAgICB3ZWJzb2NrZXQuX3JlY2VpdmVyLm9uKCdmaW5pc2gnLCByZWNlaXZlck9uRmluaXNoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgc29ja2V0IGAnZGF0YSdgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBjaHVuayBBIGNodW5rIG9mIGRhdGFcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNvY2tldE9uRGF0YShjaHVuaykge1xuICBpZiAoIXRoaXNba1dlYlNvY2tldF0uX3JlY2VpdmVyLndyaXRlKGNodW5rKSkge1xuICAgIHRoaXMucGF1c2UoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgc29ja2V0IGAnZW5kJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc29ja2V0T25FbmQoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XG5cbiAgd2Vic29ja2V0Ll9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NJTkc7XG4gIHdlYnNvY2tldC5fcmVjZWl2ZXIuZW5kKCk7XG4gIHRoaXMuZW5kKCk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBzb2NrZXQgYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNvY2tldE9uRXJyb3IoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XG5cbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBzb2NrZXRPbkVycm9yKTtcbiAgdGhpcy5vbignZXJyb3InLCBOT09QKTtcblxuICBpZiAod2Vic29ja2V0KSB7XG4gICAgd2Vic29ja2V0Ll9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NJTkc7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0J1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoWWFsbGlzdCkge1xuICBZYWxsaXN0LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24qICgpIHtcbiAgICBmb3IgKGxldCB3YWxrZXIgPSB0aGlzLmhlYWQ7IHdhbGtlcjsgd2Fsa2VyID0gd2Fsa2VyLm5leHQpIHtcbiAgICAgIHlpZWxkIHdhbGtlci52YWx1ZVxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5tb2R1bGUuZXhwb3J0cyA9IFlhbGxpc3RcblxuWWFsbGlzdC5Ob2RlID0gTm9kZVxuWWFsbGlzdC5jcmVhdGUgPSBZYWxsaXN0XG5cbmZ1bmN0aW9uIFlhbGxpc3QgKGxpc3QpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmICghKHNlbGYgaW5zdGFuY2VvZiBZYWxsaXN0KSkge1xuICAgIHNlbGYgPSBuZXcgWWFsbGlzdCgpXG4gIH1cblxuICBzZWxmLnRhaWwgPSBudWxsXG4gIHNlbGYuaGVhZCA9IG51bGxcbiAgc2VsZi5sZW5ndGggPSAwXG5cbiAgaWYgKGxpc3QgJiYgdHlwZW9mIGxpc3QuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgc2VsZi5wdXNoKGl0ZW0pXG4gICAgfSlcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgc2VsZi5wdXNoKGFyZ3VtZW50c1tpXSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VsZlxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5yZW1vdmVOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgaWYgKG5vZGUubGlzdCAhPT0gdGhpcykge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVtb3Zpbmcgbm9kZSB3aGljaCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBsaXN0JylcbiAgfVxuXG4gIHZhciBuZXh0ID0gbm9kZS5uZXh0XG4gIHZhciBwcmV2ID0gbm9kZS5wcmV2XG5cbiAgaWYgKG5leHQpIHtcbiAgICBuZXh0LnByZXYgPSBwcmV2XG4gIH1cblxuICBpZiAocHJldikge1xuICAgIHByZXYubmV4dCA9IG5leHRcbiAgfVxuXG4gIGlmIChub2RlID09PSB0aGlzLmhlYWQpIHtcbiAgICB0aGlzLmhlYWQgPSBuZXh0XG4gIH1cbiAgaWYgKG5vZGUgPT09IHRoaXMudGFpbCkge1xuICAgIHRoaXMudGFpbCA9IHByZXZcbiAgfVxuXG4gIG5vZGUubGlzdC5sZW5ndGgtLVxuICBub2RlLm5leHQgPSBudWxsXG4gIG5vZGUucHJldiA9IG51bGxcbiAgbm9kZS5saXN0ID0gbnVsbFxuXG4gIHJldHVybiBuZXh0XG59XG5cbllhbGxpc3QucHJvdG90eXBlLnVuc2hpZnROb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IHRoaXMuaGVhZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKG5vZGUubGlzdCkge1xuICAgIG5vZGUubGlzdC5yZW1vdmVOb2RlKG5vZGUpXG4gIH1cblxuICB2YXIgaGVhZCA9IHRoaXMuaGVhZFxuICBub2RlLmxpc3QgPSB0aGlzXG4gIG5vZGUubmV4dCA9IGhlYWRcbiAgaWYgKGhlYWQpIHtcbiAgICBoZWFkLnByZXYgPSBub2RlXG4gIH1cblxuICB0aGlzLmhlYWQgPSBub2RlXG4gIGlmICghdGhpcy50YWlsKSB7XG4gICAgdGhpcy50YWlsID0gbm9kZVxuICB9XG4gIHRoaXMubGVuZ3RoKytcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucHVzaE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICBpZiAobm9kZSA9PT0gdGhpcy50YWlsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAobm9kZS5saXN0KSB7XG4gICAgbm9kZS5saXN0LnJlbW92ZU5vZGUobm9kZSlcbiAgfVxuXG4gIHZhciB0YWlsID0gdGhpcy50YWlsXG4gIG5vZGUubGlzdCA9IHRoaXNcbiAgbm9kZS5wcmV2ID0gdGFpbFxuICBpZiAodGFpbCkge1xuICAgIHRhaWwubmV4dCA9IG5vZGVcbiAgfVxuXG4gIHRoaXMudGFpbCA9IG5vZGVcbiAgaWYgKCF0aGlzLmhlYWQpIHtcbiAgICB0aGlzLmhlYWQgPSBub2RlXG4gIH1cbiAgdGhpcy5sZW5ndGgrK1xufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBwdXNoKHRoaXMsIGFyZ3VtZW50c1tpXSlcbiAgfVxuICByZXR1cm4gdGhpcy5sZW5ndGhcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdW5zaGlmdCh0aGlzLCBhcmd1bWVudHNbaV0pXG4gIH1cbiAgcmV0dXJuIHRoaXMubGVuZ3RoXG59XG5cbllhbGxpc3QucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLnRhaWwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICB2YXIgcmVzID0gdGhpcy50YWlsLnZhbHVlXG4gIHRoaXMudGFpbCA9IHRoaXMudGFpbC5wcmV2XG4gIGlmICh0aGlzLnRhaWwpIHtcbiAgICB0aGlzLnRhaWwubmV4dCA9IG51bGxcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmhlYWQgPSBudWxsXG4gIH1cbiAgdGhpcy5sZW5ndGgtLVxuICByZXR1cm4gcmVzXG59XG5cbllhbGxpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuaGVhZCkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHZhciByZXMgPSB0aGlzLmhlYWQudmFsdWVcbiAgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHRcbiAgaWYgKHRoaXMuaGVhZCkge1xuICAgIHRoaXMuaGVhZC5wcmV2ID0gbnVsbFxuICB9IGVsc2Uge1xuICAgIHRoaXMudGFpbCA9IG51bGxcbiAgfVxuICB0aGlzLmxlbmd0aC0tXG4gIHJldHVybiByZXNcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChmbiwgdGhpc3ApIHtcbiAgdGhpc3AgPSB0aGlzcCB8fCB0aGlzXG4gIGZvciAodmFyIHdhbGtlciA9IHRoaXMuaGVhZCwgaSA9IDA7IHdhbGtlciAhPT0gbnVsbDsgaSsrKSB7XG4gICAgZm4uY2FsbCh0aGlzcCwgd2Fsa2VyLnZhbHVlLCBpLCB0aGlzKVxuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cbn1cblxuWWFsbGlzdC5wcm90b3R5cGUuZm9yRWFjaFJldmVyc2UgPSBmdW5jdGlvbiAoZm4sIHRoaXNwKSB7XG4gIHRoaXNwID0gdGhpc3AgfHwgdGhpc1xuICBmb3IgKHZhciB3YWxrZXIgPSB0aGlzLnRhaWwsIGkgPSB0aGlzLmxlbmd0aCAtIDE7IHdhbGtlciAhPT0gbnVsbDsgaS0tKSB7XG4gICAgZm4uY2FsbCh0aGlzcCwgd2Fsa2VyLnZhbHVlLCBpLCB0aGlzKVxuICAgIHdhbGtlciA9IHdhbGtlci5wcmV2XG4gIH1cbn1cblxuWWFsbGlzdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG4pIHtcbiAgZm9yICh2YXIgaSA9IDAsIHdhbGtlciA9IHRoaXMuaGVhZDsgd2Fsa2VyICE9PSBudWxsICYmIGkgPCBuOyBpKyspIHtcbiAgICAvLyBhYm9ydCBvdXQgb2YgdGhlIGxpc3QgZWFybHkgaWYgd2UgaGl0IGEgY3ljbGVcbiAgICB3YWxrZXIgPSB3YWxrZXIubmV4dFxuICB9XG4gIGlmIChpID09PSBuICYmIHdhbGtlciAhPT0gbnVsbCkge1xuICAgIHJldHVybiB3YWxrZXIudmFsdWVcbiAgfVxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5nZXRSZXZlcnNlID0gZnVuY3Rpb24gKG4pIHtcbiAgZm9yICh2YXIgaSA9IDAsIHdhbGtlciA9IHRoaXMudGFpbDsgd2Fsa2VyICE9PSBudWxsICYmIGkgPCBuOyBpKyspIHtcbiAgICAvLyBhYm9ydCBvdXQgb2YgdGhlIGxpc3QgZWFybHkgaWYgd2UgaGl0IGEgY3ljbGVcbiAgICB3YWxrZXIgPSB3YWxrZXIucHJldlxuICB9XG4gIGlmIChpID09PSBuICYmIHdhbGtlciAhPT0gbnVsbCkge1xuICAgIHJldHVybiB3YWxrZXIudmFsdWVcbiAgfVxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAoZm4sIHRoaXNwKSB7XG4gIHRoaXNwID0gdGhpc3AgfHwgdGhpc1xuICB2YXIgcmVzID0gbmV3IFlhbGxpc3QoKVxuICBmb3IgKHZhciB3YWxrZXIgPSB0aGlzLmhlYWQ7IHdhbGtlciAhPT0gbnVsbDspIHtcbiAgICByZXMucHVzaChmbi5jYWxsKHRoaXNwLCB3YWxrZXIudmFsdWUsIHRoaXMpKVxuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5tYXBSZXZlcnNlID0gZnVuY3Rpb24gKGZuLCB0aGlzcCkge1xuICB0aGlzcCA9IHRoaXNwIHx8IHRoaXNcbiAgdmFyIHJlcyA9IG5ldyBZYWxsaXN0KClcbiAgZm9yICh2YXIgd2Fsa2VyID0gdGhpcy50YWlsOyB3YWxrZXIgIT09IG51bGw7KSB7XG4gICAgcmVzLnB1c2goZm4uY2FsbCh0aGlzcCwgd2Fsa2VyLnZhbHVlLCB0aGlzKSlcbiAgICB3YWxrZXIgPSB3YWxrZXIucHJldlxuICB9XG4gIHJldHVybiByZXNcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucmVkdWNlID0gZnVuY3Rpb24gKGZuLCBpbml0aWFsKSB7XG4gIHZhciBhY2NcbiAgdmFyIHdhbGtlciA9IHRoaXMuaGVhZFxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICBhY2MgPSBpbml0aWFsXG4gIH0gZWxzZSBpZiAodGhpcy5oZWFkKSB7XG4gICAgd2Fsa2VyID0gdGhpcy5oZWFkLm5leHRcbiAgICBhY2MgPSB0aGlzLmhlYWQudmFsdWVcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgbGlzdCB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IHdhbGtlciAhPT0gbnVsbDsgaSsrKSB7XG4gICAgYWNjID0gZm4oYWNjLCB3YWxrZXIudmFsdWUsIGkpXG4gICAgd2Fsa2VyID0gd2Fsa2VyLm5leHRcbiAgfVxuXG4gIHJldHVybiBhY2Ncbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucmVkdWNlUmV2ZXJzZSA9IGZ1bmN0aW9uIChmbiwgaW5pdGlhbCkge1xuICB2YXIgYWNjXG4gIHZhciB3YWxrZXIgPSB0aGlzLnRhaWxcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgYWNjID0gaW5pdGlhbFxuICB9IGVsc2UgaWYgKHRoaXMudGFpbCkge1xuICAgIHdhbGtlciA9IHRoaXMudGFpbC5wcmV2XG4gICAgYWNjID0gdGhpcy50YWlsLnZhbHVlXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVkdWNlIG9mIGVtcHR5IGxpc3Qgd2l0aCBubyBpbml0aWFsIHZhbHVlJylcbiAgfVxuXG4gIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IHdhbGtlciAhPT0gbnVsbDsgaS0tKSB7XG4gICAgYWNjID0gZm4oYWNjLCB3YWxrZXIudmFsdWUsIGkpXG4gICAgd2Fsa2VyID0gd2Fsa2VyLnByZXZcbiAgfVxuXG4gIHJldHVybiBhY2Ncbn1cblxuWWFsbGlzdC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFyciA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDAsIHdhbGtlciA9IHRoaXMuaGVhZDsgd2Fsa2VyICE9PSBudWxsOyBpKyspIHtcbiAgICBhcnJbaV0gPSB3YWxrZXIudmFsdWVcbiAgICB3YWxrZXIgPSB3YWxrZXIubmV4dFxuICB9XG4gIHJldHVybiBhcnJcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUudG9BcnJheVJldmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhcnIgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwLCB3YWxrZXIgPSB0aGlzLnRhaWw7IHdhbGtlciAhPT0gbnVsbDsgaSsrKSB7XG4gICAgYXJyW2ldID0gd2Fsa2VyLnZhbHVlXG4gICAgd2Fsa2VyID0gd2Fsa2VyLnByZXZcbiAgfVxuICByZXR1cm4gYXJyXG59XG5cbllhbGxpc3QucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gIHRvID0gdG8gfHwgdGhpcy5sZW5ndGhcbiAgaWYgKHRvIDwgMCkge1xuICAgIHRvICs9IHRoaXMubGVuZ3RoXG4gIH1cbiAgZnJvbSA9IGZyb20gfHwgMFxuICBpZiAoZnJvbSA8IDApIHtcbiAgICBmcm9tICs9IHRoaXMubGVuZ3RoXG4gIH1cbiAgdmFyIHJldCA9IG5ldyBZYWxsaXN0KClcbiAgaWYgKHRvIDwgZnJvbSB8fCB0byA8IDApIHtcbiAgICByZXR1cm4gcmV0XG4gIH1cbiAgaWYgKGZyb20gPCAwKSB7XG4gICAgZnJvbSA9IDBcbiAgfVxuICBpZiAodG8gPiB0aGlzLmxlbmd0aCkge1xuICAgIHRvID0gdGhpcy5sZW5ndGhcbiAgfVxuICBmb3IgKHZhciBpID0gMCwgd2Fsa2VyID0gdGhpcy5oZWFkOyB3YWxrZXIgIT09IG51bGwgJiYgaSA8IGZyb207IGkrKykge1xuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cbiAgZm9yICg7IHdhbGtlciAhPT0gbnVsbCAmJiBpIDwgdG87IGkrKywgd2Fsa2VyID0gd2Fsa2VyLm5leHQpIHtcbiAgICByZXQucHVzaCh3YWxrZXIudmFsdWUpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5zbGljZVJldmVyc2UgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgdG8gPSB0byB8fCB0aGlzLmxlbmd0aFxuICBpZiAodG8gPCAwKSB7XG4gICAgdG8gKz0gdGhpcy5sZW5ndGhcbiAgfVxuICBmcm9tID0gZnJvbSB8fCAwXG4gIGlmIChmcm9tIDwgMCkge1xuICAgIGZyb20gKz0gdGhpcy5sZW5ndGhcbiAgfVxuICB2YXIgcmV0ID0gbmV3IFlhbGxpc3QoKVxuICBpZiAodG8gPCBmcm9tIHx8IHRvIDwgMCkge1xuICAgIHJldHVybiByZXRcbiAgfVxuICBpZiAoZnJvbSA8IDApIHtcbiAgICBmcm9tID0gMFxuICB9XG4gIGlmICh0byA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdG8gPSB0aGlzLmxlbmd0aFxuICB9XG4gIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCwgd2Fsa2VyID0gdGhpcy50YWlsOyB3YWxrZXIgIT09IG51bGwgJiYgaSA+IHRvOyBpLS0pIHtcbiAgICB3YWxrZXIgPSB3YWxrZXIucHJldlxuICB9XG4gIGZvciAoOyB3YWxrZXIgIT09IG51bGwgJiYgaSA+IGZyb207IGktLSwgd2Fsa2VyID0gd2Fsa2VyLnByZXYpIHtcbiAgICByZXQucHVzaCh3YWxrZXIudmFsdWUpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5zcGxpY2UgPSBmdW5jdGlvbiAoc3RhcnQsIGRlbGV0ZUNvdW50LCAuLi5ub2Rlcykge1xuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggKyBzdGFydDtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCB3YWxrZXIgPSB0aGlzLmhlYWQ7IHdhbGtlciAhPT0gbnVsbCAmJiBpIDwgc3RhcnQ7IGkrKykge1xuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cblxuICB2YXIgcmV0ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IHdhbGtlciAmJiBpIDwgZGVsZXRlQ291bnQ7IGkrKykge1xuICAgIHJldC5wdXNoKHdhbGtlci52YWx1ZSlcbiAgICB3YWxrZXIgPSB0aGlzLnJlbW92ZU5vZGUod2Fsa2VyKVxuICB9XG4gIGlmICh3YWxrZXIgPT09IG51bGwpIHtcbiAgICB3YWxrZXIgPSB0aGlzLnRhaWxcbiAgfVxuXG4gIGlmICh3YWxrZXIgIT09IHRoaXMuaGVhZCAmJiB3YWxrZXIgIT09IHRoaXMudGFpbCkge1xuICAgIHdhbGtlciA9IHdhbGtlci5wcmV2XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgd2Fsa2VyID0gaW5zZXJ0KHRoaXMsIHdhbGtlciwgbm9kZXNbaV0pXG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucmV2ZXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhlYWQgPSB0aGlzLmhlYWRcbiAgdmFyIHRhaWwgPSB0aGlzLnRhaWxcbiAgZm9yICh2YXIgd2Fsa2VyID0gaGVhZDsgd2Fsa2VyICE9PSBudWxsOyB3YWxrZXIgPSB3YWxrZXIucHJldikge1xuICAgIHZhciBwID0gd2Fsa2VyLnByZXZcbiAgICB3YWxrZXIucHJldiA9IHdhbGtlci5uZXh0XG4gICAgd2Fsa2VyLm5leHQgPSBwXG4gIH1cbiAgdGhpcy5oZWFkID0gdGFpbFxuICB0aGlzLnRhaWwgPSBoZWFkXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIGluc2VydCAoc2VsZiwgbm9kZSwgdmFsdWUpIHtcbiAgdmFyIGluc2VydGVkID0gbm9kZSA9PT0gc2VsZi5oZWFkID9cbiAgICBuZXcgTm9kZSh2YWx1ZSwgbnVsbCwgbm9kZSwgc2VsZikgOlxuICAgIG5ldyBOb2RlKHZhbHVlLCBub2RlLCBub2RlLm5leHQsIHNlbGYpXG5cbiAgaWYgKGluc2VydGVkLm5leHQgPT09IG51bGwpIHtcbiAgICBzZWxmLnRhaWwgPSBpbnNlcnRlZFxuICB9XG4gIGlmIChpbnNlcnRlZC5wcmV2ID09PSBudWxsKSB7XG4gICAgc2VsZi5oZWFkID0gaW5zZXJ0ZWRcbiAgfVxuXG4gIHNlbGYubGVuZ3RoKytcblxuICByZXR1cm4gaW5zZXJ0ZWRcbn1cblxuZnVuY3Rpb24gcHVzaCAoc2VsZiwgaXRlbSkge1xuICBzZWxmLnRhaWwgPSBuZXcgTm9kZShpdGVtLCBzZWxmLnRhaWwsIG51bGwsIHNlbGYpXG4gIGlmICghc2VsZi5oZWFkKSB7XG4gICAgc2VsZi5oZWFkID0gc2VsZi50YWlsXG4gIH1cbiAgc2VsZi5sZW5ndGgrK1xufVxuXG5mdW5jdGlvbiB1bnNoaWZ0IChzZWxmLCBpdGVtKSB7XG4gIHNlbGYuaGVhZCA9IG5ldyBOb2RlKGl0ZW0sIG51bGwsIHNlbGYuaGVhZCwgc2VsZilcbiAgaWYgKCFzZWxmLnRhaWwpIHtcbiAgICBzZWxmLnRhaWwgPSBzZWxmLmhlYWRcbiAgfVxuICBzZWxmLmxlbmd0aCsrXG59XG5cbmZ1bmN0aW9uIE5vZGUgKHZhbHVlLCBwcmV2LCBuZXh0LCBsaXN0KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBOb2RlKSkge1xuICAgIHJldHVybiBuZXcgTm9kZSh2YWx1ZSwgcHJldiwgbmV4dCwgbGlzdClcbiAgfVxuXG4gIHRoaXMubGlzdCA9IGxpc3RcbiAgdGhpcy52YWx1ZSA9IHZhbHVlXG5cbiAgaWYgKHByZXYpIHtcbiAgICBwcmV2Lm5leHQgPSB0aGlzXG4gICAgdGhpcy5wcmV2ID0gcHJldlxuICB9IGVsc2Uge1xuICAgIHRoaXMucHJldiA9IG51bGxcbiAgfVxuXG4gIGlmIChuZXh0KSB7XG4gICAgbmV4dC5wcmV2ID0gdGhpc1xuICAgIHRoaXMubmV4dCA9IG5leHRcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm5leHQgPSBudWxsXG4gIH1cbn1cblxudHJ5IHtcbiAgLy8gYWRkIGlmIHN1cHBvcnQgZm9yIFN5bWJvbC5pdGVyYXRvciBpcyBwcmVzZW50XG4gIHJlcXVpcmUoJy4vaXRlcmF0b3IuanMnKShZYWxsaXN0KVxufSBjYXRjaCAoZXIpIHt9XG4iLCJmdW5jdGlvbiB3ZWJwYWNrRW1wdHlDb250ZXh0KHJlcSkge1xuXHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0dGhyb3cgZTtcbn1cbndlYnBhY2tFbXB0eUNvbnRleHQua2V5cyA9ICgpID0+IChbXSk7XG53ZWJwYWNrRW1wdHlDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrRW1wdHlDb250ZXh0O1xud2VicGFja0VtcHR5Q29udGV4dC5pZCA9IFwiLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkIHN5bmMgcmVjdXJzaXZlXCI7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tFbXB0eUNvbnRleHQ7IiwiZnVuY3Rpb24gd2VicGFja0VtcHR5Q29udGV4dChyZXEpIHtcblx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdHRocm93IGU7XG59XG53ZWJwYWNrRW1wdHlDb250ZXh0LmtleXMgPSAoKSA9PiAoW10pO1xud2VicGFja0VtcHR5Q29udGV4dC5yZXNvbHZlID0gd2VicGFja0VtcHR5Q29udGV4dDtcbndlYnBhY2tFbXB0eUNvbnRleHQuaWQgPSBcIi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkIHN5bmMgcmVjdXJzaXZlXCI7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tFbXB0eUNvbnRleHQ7IiwidmFyIGZzID0gcmVxdWlyZShcImZzXCIpO1xudmFyIHpsaWIgPSByZXF1aXJlKFwiemxpYlwiKTtcbnZhciBmZF9zbGljZXIgPSByZXF1aXJlKFwiZmQtc2xpY2VyXCIpO1xudmFyIGNyYzMyID0gcmVxdWlyZShcImJ1ZmZlci1jcmMzMlwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcInV0aWxcIik7XG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZShcImV2ZW50c1wiKS5FdmVudEVtaXR0ZXI7XG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZShcInN0cmVhbVwiKS5UcmFuc2Zvcm07XG52YXIgUGFzc1Rocm91Z2ggPSByZXF1aXJlKFwic3RyZWFtXCIpLlBhc3NUaHJvdWdoO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZShcInN0cmVhbVwiKS5Xcml0YWJsZTtcblxuZXhwb3J0cy5vcGVuID0gb3BlbjtcbmV4cG9ydHMuZnJvbUZkID0gZnJvbUZkO1xuZXhwb3J0cy5mcm9tQnVmZmVyID0gZnJvbUJ1ZmZlcjtcbmV4cG9ydHMuZnJvbVJhbmRvbUFjY2Vzc1JlYWRlciA9IGZyb21SYW5kb21BY2Nlc3NSZWFkZXI7XG5leHBvcnRzLmRvc0RhdGVUaW1lVG9EYXRlID0gZG9zRGF0ZVRpbWVUb0RhdGU7XG5leHBvcnRzLnZhbGlkYXRlRmlsZU5hbWUgPSB2YWxpZGF0ZUZpbGVOYW1lO1xuZXhwb3J0cy5aaXBGaWxlID0gWmlwRmlsZTtcbmV4cG9ydHMuRW50cnkgPSBFbnRyeTtcbmV4cG9ydHMuUmFuZG9tQWNjZXNzUmVhZGVyID0gUmFuZG9tQWNjZXNzUmVhZGVyO1xuXG5mdW5jdGlvbiBvcGVuKHBhdGgsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSBudWxsO1xuICB9XG4gIGlmIChvcHRpb25zID09IG51bGwpIG9wdGlvbnMgPSB7fTtcbiAgaWYgKG9wdGlvbnMuYXV0b0Nsb3NlID09IG51bGwpIG9wdGlvbnMuYXV0b0Nsb3NlID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMubGF6eUVudHJpZXMgPT0gbnVsbCkgb3B0aW9ucy5sYXp5RW50cmllcyA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5kZWNvZGVTdHJpbmdzID09IG51bGwpIG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9IHRydWU7XG4gIGlmIChvcHRpb25zLnZhbGlkYXRlRW50cnlTaXplcyA9PSBudWxsKSBvcHRpb25zLnZhbGlkYXRlRW50cnlTaXplcyA9IHRydWU7XG4gIGlmIChvcHRpb25zLnN0cmljdEZpbGVOYW1lcyA9PSBudWxsKSBvcHRpb25zLnN0cmljdEZpbGVOYW1lcyA9IGZhbHNlO1xuICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgY2FsbGJhY2sgPSBkZWZhdWx0Q2FsbGJhY2s7XG4gIGZzLm9wZW4ocGF0aCwgXCJyXCIsIGZ1bmN0aW9uKGVyciwgZmQpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBmcm9tRmQoZmQsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgemlwZmlsZSkge1xuICAgICAgaWYgKGVycikgZnMuY2xvc2UoZmQsIGRlZmF1bHRDYWxsYmFjayk7XG4gICAgICBjYWxsYmFjayhlcnIsIHppcGZpbGUpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZnJvbUZkKGZkLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0gbnVsbDtcbiAgfVxuICBpZiAob3B0aW9ucyA9PSBudWxsKSBvcHRpb25zID0ge307XG4gIGlmIChvcHRpb25zLmF1dG9DbG9zZSA9PSBudWxsKSBvcHRpb25zLmF1dG9DbG9zZSA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5sYXp5RW50cmllcyA9PSBudWxsKSBvcHRpb25zLmxhenlFbnRyaWVzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmRlY29kZVN0cmluZ3MgPT0gbnVsbCkgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID09IG51bGwpIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID09IG51bGwpIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID0gZmFsc2U7XG4gIGlmIChjYWxsYmFjayA9PSBudWxsKSBjYWxsYmFjayA9IGRlZmF1bHRDYWxsYmFjaztcbiAgZnMuZnN0YXQoZmQsIGZ1bmN0aW9uKGVyciwgc3RhdHMpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB2YXIgcmVhZGVyID0gZmRfc2xpY2VyLmNyZWF0ZUZyb21GZChmZCwge2F1dG9DbG9zZTogdHJ1ZX0pO1xuICAgIGZyb21SYW5kb21BY2Nlc3NSZWFkZXIocmVhZGVyLCBzdGF0cy5zaXplLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmcm9tQnVmZmVyKGJ1ZmZlciwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgb3B0aW9ucyA9IHt9O1xuICBvcHRpb25zLmF1dG9DbG9zZSA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5sYXp5RW50cmllcyA9PSBudWxsKSBvcHRpb25zLmxhenlFbnRyaWVzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmRlY29kZVN0cmluZ3MgPT0gbnVsbCkgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID09IG51bGwpIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID09IG51bGwpIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID0gZmFsc2U7XG4gIC8vIGxpbWl0IHRoZSBtYXggY2h1bmsgc2l6ZS4gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVqb3Nod29sZmUveWF1emwvaXNzdWVzLzg3XG4gIHZhciByZWFkZXIgPSBmZF9zbGljZXIuY3JlYXRlRnJvbUJ1ZmZlcihidWZmZXIsIHttYXhDaHVua1NpemU6IDB4MTAwMDB9KTtcbiAgZnJvbVJhbmRvbUFjY2Vzc1JlYWRlcihyZWFkZXIsIGJ1ZmZlci5sZW5ndGgsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZnJvbVJhbmRvbUFjY2Vzc1JlYWRlcihyZWFkZXIsIHRvdGFsU2l6ZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgb3B0aW9ucyA9IHt9O1xuICBpZiAob3B0aW9ucy5hdXRvQ2xvc2UgPT0gbnVsbCkgb3B0aW9ucy5hdXRvQ2xvc2UgPSB0cnVlO1xuICBpZiAob3B0aW9ucy5sYXp5RW50cmllcyA9PSBudWxsKSBvcHRpb25zLmxhenlFbnRyaWVzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmRlY29kZVN0cmluZ3MgPT0gbnVsbCkgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gdHJ1ZTtcbiAgdmFyIGRlY29kZVN0cmluZ3MgPSAhIW9wdGlvbnMuZGVjb2RlU3RyaW5ncztcbiAgaWYgKG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID09IG51bGwpIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID09IG51bGwpIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID0gZmFsc2U7XG4gIGlmIChjYWxsYmFjayA9PSBudWxsKSBjYWxsYmFjayA9IGRlZmF1bHRDYWxsYmFjaztcbiAgaWYgKHR5cGVvZiB0b3RhbFNpemUgIT09IFwibnVtYmVyXCIpIHRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIHRvdGFsU2l6ZSBwYXJhbWV0ZXIgdG8gYmUgYSBudW1iZXJcIik7XG4gIGlmICh0b3RhbFNpemUgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgIHRocm93IG5ldyBFcnJvcihcInppcCBmaWxlIHRvbyBsYXJnZS4gb25seSBmaWxlIHNpemVzIHVwIHRvIDJeNTIgYXJlIHN1cHBvcnRlZCBkdWUgdG8gSmF2YVNjcmlwdCdzIE51bWJlciB0eXBlIGJlaW5nIGFuIElFRUUgNzU0IGRvdWJsZS5cIik7XG4gIH1cblxuICAvLyB0aGUgbWF0Y2hpbmcgdW5yZWYoKSBjYWxsIGlzIGluIHppcGZpbGUuY2xvc2UoKVxuICByZWFkZXIucmVmKCk7XG5cbiAgLy8gZW9jZHIgbWVhbnMgRW5kIG9mIENlbnRyYWwgRGlyZWN0b3J5IFJlY29yZC5cbiAgLy8gc2VhcmNoIGJhY2t3YXJkcyBmb3IgdGhlIGVvY2RyIHNpZ25hdHVyZS5cbiAgLy8gdGhlIGxhc3QgZmllbGQgb2YgdGhlIGVvY2RyIGlzIGEgdmFyaWFibGUtbGVuZ3RoIGNvbW1lbnQuXG4gIC8vIHRoZSBjb21tZW50IHNpemUgaXMgZW5jb2RlZCBpbiBhIDItYnl0ZSBmaWVsZCBpbiB0aGUgZW9jZHIsIHdoaWNoIHdlIGNhbid0IGZpbmQgd2l0aG91dCB0cnVkZ2luZyBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgY29tbWVudCB0byBmaW5kIGl0LlxuICAvLyBhcyBhIGNvbnNlcXVlbmNlIG9mIHRoaXMgZGVzaWduIGRlY2lzaW9uLCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgYW1iaWd1b3VzIHppcCBmaWxlIG1ldGFkYXRhIGlmIGEgY29oZXJlbnQgZW9jZHIgd2FzIGluIHRoZSBjb21tZW50LlxuICAvLyB3ZSBzZWFyY2ggYmFja3dhcmRzIGZvciBhIGVvY2RyIHNpZ25hdHVyZSwgYW5kIGhvcGUgdGhhdCB3aG9ldmVyIG1hZGUgdGhlIHppcCBmaWxlIHdhcyBzbWFydCBlbm91Z2ggdG8gZm9yYmlkIHRoZSBlb2NkciBzaWduYXR1cmUgaW4gdGhlIGNvbW1lbnQuXG4gIHZhciBlb2NkcldpdGhvdXRDb21tZW50U2l6ZSA9IDIyO1xuICB2YXIgbWF4Q29tbWVudFNpemUgPSAweGZmZmY7IC8vIDItYnl0ZSBzaXplXG4gIHZhciBidWZmZXJTaXplID0gTWF0aC5taW4oZW9jZHJXaXRob3V0Q29tbWVudFNpemUgKyBtYXhDb21tZW50U2l6ZSwgdG90YWxTaXplKTtcbiAgdmFyIGJ1ZmZlciA9IG5ld0J1ZmZlcihidWZmZXJTaXplKTtcbiAgdmFyIGJ1ZmZlclJlYWRTdGFydCA9IHRvdGFsU2l6ZSAtIGJ1ZmZlci5sZW5ndGg7XG4gIHJlYWRBbmRBc3NlcnROb0VvZihyZWFkZXIsIGJ1ZmZlciwgMCwgYnVmZmVyU2l6ZSwgYnVmZmVyUmVhZFN0YXJ0LCBmdW5jdGlvbihlcnIpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBmb3IgKHZhciBpID0gYnVmZmVyU2l6ZSAtIGVvY2RyV2l0aG91dENvbW1lbnRTaXplOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgaWYgKGJ1ZmZlci5yZWFkVUludDMyTEUoaSkgIT09IDB4MDYwNTRiNTApIGNvbnRpbnVlO1xuICAgICAgLy8gZm91bmQgZW9jZHJcbiAgICAgIHZhciBlb2NkckJ1ZmZlciA9IGJ1ZmZlci5zbGljZShpKTtcblxuICAgICAgLy8gMCAtIEVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBzaWduYXR1cmUgPSAweDA2MDU0YjUwXG4gICAgICAvLyA0IC0gTnVtYmVyIG9mIHRoaXMgZGlza1xuICAgICAgdmFyIGRpc2tOdW1iZXIgPSBlb2NkckJ1ZmZlci5yZWFkVUludDE2TEUoNCk7XG4gICAgICBpZiAoZGlza051bWJlciAhPT0gMCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwibXVsdGktZGlzayB6aXAgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQ6IGZvdW5kIGRpc2sgbnVtYmVyOiBcIiArIGRpc2tOdW1iZXIpKTtcbiAgICAgIH1cbiAgICAgIC8vIDYgLSBEaXNrIHdoZXJlIGNlbnRyYWwgZGlyZWN0b3J5IHN0YXJ0c1xuICAgICAgLy8gOCAtIE51bWJlciBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmRzIG9uIHRoaXMgZGlza1xuICAgICAgLy8gMTAgLSBUb3RhbCBudW1iZXIgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3Jkc1xuICAgICAgdmFyIGVudHJ5Q291bnQgPSBlb2NkckJ1ZmZlci5yZWFkVUludDE2TEUoMTApO1xuICAgICAgLy8gMTIgLSBTaXplIG9mIGNlbnRyYWwgZGlyZWN0b3J5IChieXRlcylcbiAgICAgIC8vIDE2IC0gT2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5LCByZWxhdGl2ZSB0byBzdGFydCBvZiBhcmNoaXZlXG4gICAgICB2YXIgY2VudHJhbERpcmVjdG9yeU9mZnNldCA9IGVvY2RyQnVmZmVyLnJlYWRVSW50MzJMRSgxNik7XG4gICAgICAvLyAyMCAtIENvbW1lbnQgbGVuZ3RoXG4gICAgICB2YXIgY29tbWVudExlbmd0aCA9IGVvY2RyQnVmZmVyLnJlYWRVSW50MTZMRSgyMCk7XG4gICAgICB2YXIgZXhwZWN0ZWRDb21tZW50TGVuZ3RoID0gZW9jZHJCdWZmZXIubGVuZ3RoIC0gZW9jZHJXaXRob3V0Q29tbWVudFNpemU7XG4gICAgICBpZiAoY29tbWVudExlbmd0aCAhPT0gZXhwZWN0ZWRDb21tZW50TGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJpbnZhbGlkIGNvbW1lbnQgbGVuZ3RoLiBleHBlY3RlZDogXCIgKyBleHBlY3RlZENvbW1lbnRMZW5ndGggKyBcIi4gZm91bmQ6IFwiICsgY29tbWVudExlbmd0aCkpO1xuICAgICAgfVxuICAgICAgLy8gMjIgLSBDb21tZW50XG4gICAgICAvLyB0aGUgZW5jb2RpbmcgaXMgYWx3YXlzIGNwNDM3LlxuICAgICAgdmFyIGNvbW1lbnQgPSBkZWNvZGVTdHJpbmdzID8gZGVjb2RlQnVmZmVyKGVvY2RyQnVmZmVyLCAyMiwgZW9jZHJCdWZmZXIubGVuZ3RoLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVvY2RyQnVmZmVyLnNsaWNlKDIyKTtcblxuICAgICAgaWYgKCEoZW50cnlDb3VudCA9PT0gMHhmZmZmIHx8IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgPT09IDB4ZmZmZmZmZmYpKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBuZXcgWmlwRmlsZShyZWFkZXIsIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsIHRvdGFsU2l6ZSwgZW50cnlDb3VudCwgY29tbWVudCwgb3B0aW9ucy5hdXRvQ2xvc2UsIG9wdGlvbnMubGF6eUVudHJpZXMsIGRlY29kZVN0cmluZ3MsIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzLCBvcHRpb25zLnN0cmljdEZpbGVOYW1lcykpO1xuICAgICAgfVxuXG4gICAgICAvLyBaSVA2NCBmb3JtYXRcblxuICAgICAgLy8gWklQNjQgWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3JcbiAgICAgIHZhciB6aXA2NEVvY2RsQnVmZmVyID0gbmV3QnVmZmVyKDIwKTtcbiAgICAgIHZhciB6aXA2NEVvY2RsT2Zmc2V0ID0gYnVmZmVyUmVhZFN0YXJ0ICsgaSAtIHppcDY0RW9jZGxCdWZmZXIubGVuZ3RoO1xuICAgICAgcmVhZEFuZEFzc2VydE5vRW9mKHJlYWRlciwgemlwNjRFb2NkbEJ1ZmZlciwgMCwgemlwNjRFb2NkbEJ1ZmZlci5sZW5ndGgsIHppcDY0RW9jZGxPZmZzZXQsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgICAgICAvLyAwIC0gemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyIGxvY2F0b3Igc2lnbmF0dXJlID0gMHgwNzA2NGI1MFxuICAgICAgICBpZiAoemlwNjRFb2NkbEJ1ZmZlci5yZWFkVUludDMyTEUoMCkgIT09IDB4MDcwNjRiNTApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiaW52YWxpZCB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciBzaWduYXR1cmVcIikpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDQgLSBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIHppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeVxuICAgICAgICAvLyA4IC0gcmVsYXRpdmUgb2Zmc2V0IG9mIHRoZSB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkXG4gICAgICAgIHZhciB6aXA2NEVvY2RyT2Zmc2V0ID0gcmVhZFVJbnQ2NExFKHppcDY0RW9jZGxCdWZmZXIsIDgpO1xuICAgICAgICAvLyAxNiAtIHRvdGFsIG51bWJlciBvZiBkaXNrc1xuXG4gICAgICAgIC8vIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmRcbiAgICAgICAgdmFyIHppcDY0RW9jZHJCdWZmZXIgPSBuZXdCdWZmZXIoNTYpO1xuICAgICAgICByZWFkQW5kQXNzZXJ0Tm9Fb2YocmVhZGVyLCB6aXA2NEVvY2RyQnVmZmVyLCAwLCB6aXA2NEVvY2RyQnVmZmVyLmxlbmd0aCwgemlwNjRFb2Nkck9mZnNldCwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG5cbiAgICAgICAgICAvLyAwIC0gemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyIHNpZ25hdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXMgICgweDA2MDY0YjUwKVxuICAgICAgICAgIGlmICh6aXA2NEVvY2RyQnVmZmVyLnJlYWRVSW50MzJMRSgwKSAhPT0gMHgwNjA2NGI1MCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcImludmFsaWQgemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCBzaWduYXR1cmVcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyA0IC0gc2l6ZSBvZiB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICAgICAgICAgICAgICAgIDggYnl0ZXNcbiAgICAgICAgICAvLyAxMiAtIHZlcnNpb24gbWFkZSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgYnl0ZXNcbiAgICAgICAgICAvLyAxNCAtIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgYnl0ZXNcbiAgICAgICAgICAvLyAxNiAtIG51bWJlciBvZiB0aGlzIGRpc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXNcbiAgICAgICAgICAvLyAyMCAtIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgIDQgYnl0ZXNcbiAgICAgICAgICAvLyAyNCAtIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBvbiB0aGlzIGRpc2sgICAgICAgICA4IGJ5dGVzXG4gICAgICAgICAgLy8gMzIgLSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgICAgICAgICAgICA4IGJ5dGVzXG4gICAgICAgICAgZW50cnlDb3VudCA9IHJlYWRVSW50NjRMRSh6aXA2NEVvY2RyQnVmZmVyLCAzMik7XG4gICAgICAgICAgLy8gNDAgLSBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IGJ5dGVzXG4gICAgICAgICAgLy8gNDggLSBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZSBzdGFydGluZyBkaXNrIG51bWJlciAgICAgOCBieXRlc1xuICAgICAgICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgPSByZWFkVUludDY0TEUoemlwNjRFb2NkckJ1ZmZlciwgNDgpO1xuICAgICAgICAgIC8vIDU2IC0gemlwNjQgZXh0ZW5zaWJsZSBkYXRhIHNlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhcmlhYmxlIHNpemUpXG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG5ldyBaaXBGaWxlKHJlYWRlciwgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgdG90YWxTaXplLCBlbnRyeUNvdW50LCBjb21tZW50LCBvcHRpb25zLmF1dG9DbG9zZSwgb3B0aW9ucy5sYXp5RW50cmllcywgZGVjb2RlU3RyaW5ncywgb3B0aW9ucy52YWxpZGF0ZUVudHJ5U2l6ZXMsIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxiYWNrKG5ldyBFcnJvcihcImVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgc2lnbmF0dXJlIG5vdCBmb3VuZFwiKSk7XG4gIH0pO1xufVxuXG51dGlsLmluaGVyaXRzKFppcEZpbGUsIEV2ZW50RW1pdHRlcik7XG5mdW5jdGlvbiBaaXBGaWxlKHJlYWRlciwgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgZmlsZVNpemUsIGVudHJ5Q291bnQsIGNvbW1lbnQsIGF1dG9DbG9zZSwgbGF6eUVudHJpZXMsIGRlY29kZVN0cmluZ3MsIHZhbGlkYXRlRW50cnlTaXplcywgc3RyaWN0RmlsZU5hbWVzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgRXZlbnRFbWl0dGVyLmNhbGwoc2VsZik7XG4gIHNlbGYucmVhZGVyID0gcmVhZGVyO1xuICAvLyBmb3J3YXJkIGNsb3NlIGV2ZW50c1xuICBzZWxmLnJlYWRlci5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgIC8vIGVycm9yIGNsb3NpbmcgdGhlIGZkXG4gICAgZW1pdEVycm9yKHNlbGYsIGVycik7XG4gIH0pO1xuICBzZWxmLnJlYWRlci5vbmNlKFwiY2xvc2VcIiwgZnVuY3Rpb24oKSB7XG4gICAgc2VsZi5lbWl0KFwiY2xvc2VcIik7XG4gIH0pO1xuICBzZWxmLnJlYWRFbnRyeUN1cnNvciA9IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQ7XG4gIHNlbGYuZmlsZVNpemUgPSBmaWxlU2l6ZTtcbiAgc2VsZi5lbnRyeUNvdW50ID0gZW50cnlDb3VudDtcbiAgc2VsZi5jb21tZW50ID0gY29tbWVudDtcbiAgc2VsZi5lbnRyaWVzUmVhZCA9IDA7XG4gIHNlbGYuYXV0b0Nsb3NlID0gISFhdXRvQ2xvc2U7XG4gIHNlbGYubGF6eUVudHJpZXMgPSAhIWxhenlFbnRyaWVzO1xuICBzZWxmLmRlY29kZVN0cmluZ3MgPSAhIWRlY29kZVN0cmluZ3M7XG4gIHNlbGYudmFsaWRhdGVFbnRyeVNpemVzID0gISF2YWxpZGF0ZUVudHJ5U2l6ZXM7XG4gIHNlbGYuc3RyaWN0RmlsZU5hbWVzID0gISFzdHJpY3RGaWxlTmFtZXM7XG4gIHNlbGYuaXNPcGVuID0gdHJ1ZTtcbiAgc2VsZi5lbWl0dGVkRXJyb3IgPSBmYWxzZTtcblxuICBpZiAoIXNlbGYubGF6eUVudHJpZXMpIHNlbGYuX3JlYWRFbnRyeSgpO1xufVxuWmlwRmlsZS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICB0aGlzLnJlYWRlci51bnJlZigpO1xufTtcblxuZnVuY3Rpb24gZW1pdEVycm9yQW5kQXV0b0Nsb3NlKHNlbGYsIGVycikge1xuICBpZiAoc2VsZi5hdXRvQ2xvc2UpIHNlbGYuY2xvc2UoKTtcbiAgZW1pdEVycm9yKHNlbGYsIGVycik7XG59XG5mdW5jdGlvbiBlbWl0RXJyb3Ioc2VsZiwgZXJyKSB7XG4gIGlmIChzZWxmLmVtaXR0ZWRFcnJvcikgcmV0dXJuO1xuICBzZWxmLmVtaXR0ZWRFcnJvciA9IHRydWU7XG4gIHNlbGYuZW1pdChcImVycm9yXCIsIGVycik7XG59XG5cblppcEZpbGUucHJvdG90eXBlLnJlYWRFbnRyeSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMubGF6eUVudHJpZXMpIHRocm93IG5ldyBFcnJvcihcInJlYWRFbnRyeSgpIGNhbGxlZCB3aXRob3V0IGxhenlFbnRyaWVzOnRydWVcIik7XG4gIHRoaXMuX3JlYWRFbnRyeSgpO1xufTtcblppcEZpbGUucHJvdG90eXBlLl9yZWFkRW50cnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoc2VsZi5lbnRyeUNvdW50ID09PSBzZWxmLmVudHJpZXNSZWFkKSB7XG4gICAgLy8gZG9uZSB3aXRoIG1ldGFkYXRhXG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuYXV0b0Nsb3NlKSBzZWxmLmNsb3NlKCk7XG4gICAgICBpZiAoc2VsZi5lbWl0dGVkRXJyb3IpIHJldHVybjtcbiAgICAgIHNlbGYuZW1pdChcImVuZFwiKTtcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHNlbGYuZW1pdHRlZEVycm9yKSByZXR1cm47XG4gIHZhciBidWZmZXIgPSBuZXdCdWZmZXIoNDYpO1xuICByZWFkQW5kQXNzZXJ0Tm9Fb2Yoc2VsZi5yZWFkZXIsIGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgc2VsZi5yZWFkRW50cnlDdXJzb3IsIGZ1bmN0aW9uKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgZXJyKTtcbiAgICBpZiAoc2VsZi5lbWl0dGVkRXJyb3IpIHJldHVybjtcbiAgICB2YXIgZW50cnkgPSBuZXcgRW50cnkoKTtcbiAgICAvLyAwIC0gQ2VudHJhbCBkaXJlY3RvcnkgZmlsZSBoZWFkZXIgc2lnbmF0dXJlXG4gICAgdmFyIHNpZ25hdHVyZSA9IGJ1ZmZlci5yZWFkVUludDMyTEUoMCk7XG4gICAgaWYgKHNpZ25hdHVyZSAhPT0gMHgwMjAxNGI1MCkgcmV0dXJuIGVtaXRFcnJvckFuZEF1dG9DbG9zZShzZWxmLCBuZXcgRXJyb3IoXCJpbnZhbGlkIGNlbnRyYWwgZGlyZWN0b3J5IGZpbGUgaGVhZGVyIHNpZ25hdHVyZTogMHhcIiArIHNpZ25hdHVyZS50b1N0cmluZygxNikpKTtcbiAgICAvLyA0IC0gVmVyc2lvbiBtYWRlIGJ5XG4gICAgZW50cnkudmVyc2lvbk1hZGVCeSA9IGJ1ZmZlci5yZWFkVUludDE2TEUoNCk7XG4gICAgLy8gNiAtIFZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgKG1pbmltdW0pXG4gICAgZW50cnkudmVyc2lvbk5lZWRlZFRvRXh0cmFjdCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoNik7XG4gICAgLy8gOCAtIEdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZ1xuICAgIGVudHJ5LmdlbmVyYWxQdXJwb3NlQml0RmxhZyA9IGJ1ZmZlci5yZWFkVUludDE2TEUoOCk7XG4gICAgLy8gMTAgLSBDb21wcmVzc2lvbiBtZXRob2RcbiAgICBlbnRyeS5jb21wcmVzc2lvbk1ldGhvZCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoMTApO1xuICAgIC8vIDEyIC0gRmlsZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lXG4gICAgZW50cnkubGFzdE1vZEZpbGVUaW1lID0gYnVmZmVyLnJlYWRVSW50MTZMRSgxMik7XG4gICAgLy8gMTQgLSBGaWxlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGVcbiAgICBlbnRyeS5sYXN0TW9kRmlsZURhdGUgPSBidWZmZXIucmVhZFVJbnQxNkxFKDE0KTtcbiAgICAvLyAxNiAtIENSQy0zMlxuICAgIGVudHJ5LmNyYzMyID0gYnVmZmVyLnJlYWRVSW50MzJMRSgxNik7XG4gICAgLy8gMjAgLSBDb21wcmVzc2VkIHNpemVcbiAgICBlbnRyeS5jb21wcmVzc2VkU2l6ZSA9IGJ1ZmZlci5yZWFkVUludDMyTEUoMjApO1xuICAgIC8vIDI0IC0gVW5jb21wcmVzc2VkIHNpemVcbiAgICBlbnRyeS51bmNvbXByZXNzZWRTaXplID0gYnVmZmVyLnJlYWRVSW50MzJMRSgyNCk7XG4gICAgLy8gMjggLSBGaWxlIG5hbWUgbGVuZ3RoIChuKVxuICAgIGVudHJ5LmZpbGVOYW1lTGVuZ3RoID0gYnVmZmVyLnJlYWRVSW50MTZMRSgyOCk7XG4gICAgLy8gMzAgLSBFeHRyYSBmaWVsZCBsZW5ndGggKG0pXG4gICAgZW50cnkuZXh0cmFGaWVsZExlbmd0aCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoMzApO1xuICAgIC8vIDMyIC0gRmlsZSBjb21tZW50IGxlbmd0aCAoaylcbiAgICBlbnRyeS5maWxlQ29tbWVudExlbmd0aCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoMzIpO1xuICAgIC8vIDM0IC0gRGlzayBudW1iZXIgd2hlcmUgZmlsZSBzdGFydHNcbiAgICAvLyAzNiAtIEludGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgIGVudHJ5LmludGVybmFsRmlsZUF0dHJpYnV0ZXMgPSBidWZmZXIucmVhZFVJbnQxNkxFKDM2KTtcbiAgICAvLyAzOCAtIEV4dGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgIGVudHJ5LmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSBidWZmZXIucmVhZFVJbnQzMkxFKDM4KTtcbiAgICAvLyA0MiAtIFJlbGF0aXZlIG9mZnNldCBvZiBsb2NhbCBmaWxlIGhlYWRlclxuICAgIGVudHJ5LnJlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciA9IGJ1ZmZlci5yZWFkVUludDMyTEUoNDIpO1xuXG4gICAgaWYgKGVudHJ5LmdlbmVyYWxQdXJwb3NlQml0RmxhZyAmIDB4NDApIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwic3Ryb25nIGVuY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZFwiKSk7XG5cbiAgICBzZWxmLnJlYWRFbnRyeUN1cnNvciArPSA0NjtcblxuICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcihlbnRyeS5maWxlTmFtZUxlbmd0aCArIGVudHJ5LmV4dHJhRmllbGRMZW5ndGggKyBlbnRyeS5maWxlQ29tbWVudExlbmd0aCk7XG4gICAgcmVhZEFuZEFzc2VydE5vRW9mKHNlbGYucmVhZGVyLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIHNlbGYucmVhZEVudHJ5Q3Vyc29yLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgZXJyKTtcbiAgICAgIGlmIChzZWxmLmVtaXR0ZWRFcnJvcikgcmV0dXJuO1xuICAgICAgLy8gNDYgLSBGaWxlIG5hbWVcbiAgICAgIHZhciBpc1V0ZjggPSAoZW50cnkuZ2VuZXJhbFB1cnBvc2VCaXRGbGFnICYgMHg4MDApICE9PSAwO1xuICAgICAgZW50cnkuZmlsZU5hbWUgPSBzZWxmLmRlY29kZVN0cmluZ3MgPyBkZWNvZGVCdWZmZXIoYnVmZmVyLCAwLCBlbnRyeS5maWxlTmFtZUxlbmd0aCwgaXNVdGY4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBidWZmZXIuc2xpY2UoMCwgZW50cnkuZmlsZU5hbWVMZW5ndGgpO1xuXG4gICAgICAvLyA0NituIC0gRXh0cmEgZmllbGRcbiAgICAgIHZhciBmaWxlQ29tbWVudFN0YXJ0ID0gZW50cnkuZmlsZU5hbWVMZW5ndGggKyBlbnRyeS5leHRyYUZpZWxkTGVuZ3RoO1xuICAgICAgdmFyIGV4dHJhRmllbGRCdWZmZXIgPSBidWZmZXIuc2xpY2UoZW50cnkuZmlsZU5hbWVMZW5ndGgsIGZpbGVDb21tZW50U3RhcnQpO1xuICAgICAgZW50cnkuZXh0cmFGaWVsZHMgPSBbXTtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChpIDwgZXh0cmFGaWVsZEJ1ZmZlci5sZW5ndGggLSAzKSB7XG4gICAgICAgIHZhciBoZWFkZXJJZCA9IGV4dHJhRmllbGRCdWZmZXIucmVhZFVJbnQxNkxFKGkgKyAwKTtcbiAgICAgICAgdmFyIGRhdGFTaXplID0gZXh0cmFGaWVsZEJ1ZmZlci5yZWFkVUludDE2TEUoaSArIDIpO1xuICAgICAgICB2YXIgZGF0YVN0YXJ0ID0gaSArIDQ7XG4gICAgICAgIHZhciBkYXRhRW5kID0gZGF0YVN0YXJ0ICsgZGF0YVNpemU7XG4gICAgICAgIGlmIChkYXRhRW5kID4gZXh0cmFGaWVsZEJ1ZmZlci5sZW5ndGgpIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwiZXh0cmEgZmllbGQgbGVuZ3RoIGV4Y2VlZHMgZXh0cmEgZmllbGQgYnVmZmVyIHNpemVcIikpO1xuICAgICAgICB2YXIgZGF0YUJ1ZmZlciA9IG5ld0J1ZmZlcihkYXRhU2l6ZSk7XG4gICAgICAgIGV4dHJhRmllbGRCdWZmZXIuY29weShkYXRhQnVmZmVyLCAwLCBkYXRhU3RhcnQsIGRhdGFFbmQpO1xuICAgICAgICBlbnRyeS5leHRyYUZpZWxkcy5wdXNoKHtcbiAgICAgICAgICBpZDogaGVhZGVySWQsXG4gICAgICAgICAgZGF0YTogZGF0YUJ1ZmZlcixcbiAgICAgICAgfSk7XG4gICAgICAgIGkgPSBkYXRhRW5kO1xuICAgICAgfVxuXG4gICAgICAvLyA0NituK20gLSBGaWxlIGNvbW1lbnRcbiAgICAgIGVudHJ5LmZpbGVDb21tZW50ID0gc2VsZi5kZWNvZGVTdHJpbmdzID8gZGVjb2RlQnVmZmVyKGJ1ZmZlciwgZmlsZUNvbW1lbnRTdGFydCwgZmlsZUNvbW1lbnRTdGFydCArIGVudHJ5LmZpbGVDb21tZW50TGVuZ3RoLCBpc1V0ZjgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJ1ZmZlci5zbGljZShmaWxlQ29tbWVudFN0YXJ0LCBmaWxlQ29tbWVudFN0YXJ0ICsgZW50cnkuZmlsZUNvbW1lbnRMZW5ndGgpO1xuICAgICAgLy8gY29tcGF0aWJpbGl0eSBoYWNrIGZvciBodHRwczovL2dpdGh1Yi5jb20vdGhlam9zaHdvbGZlL3lhdXpsL2lzc3Vlcy80N1xuICAgICAgZW50cnkuY29tbWVudCA9IGVudHJ5LmZpbGVDb21tZW50O1xuXG4gICAgICBzZWxmLnJlYWRFbnRyeUN1cnNvciArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgc2VsZi5lbnRyaWVzUmVhZCArPSAxO1xuXG4gICAgICBpZiAoZW50cnkudW5jb21wcmVzc2VkU2l6ZSAgICAgICAgICAgID09PSAweGZmZmZmZmZmIHx8XG4gICAgICAgICAgZW50cnkuY29tcHJlc3NlZFNpemUgICAgICAgICAgICAgID09PSAweGZmZmZmZmZmIHx8XG4gICAgICAgICAgZW50cnkucmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyID09PSAweGZmZmZmZmZmKSB7XG4gICAgICAgIC8vIFpJUDY0IGZvcm1hdFxuICAgICAgICAvLyBmaW5kIHRoZSBaaXA2NCBFeHRlbmRlZCBJbmZvcm1hdGlvbiBFeHRyYSBGaWVsZFxuICAgICAgICB2YXIgemlwNjRFaWVmQnVmZmVyID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyeS5leHRyYUZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBleHRyYUZpZWxkID0gZW50cnkuZXh0cmFGaWVsZHNbaV07XG4gICAgICAgICAgaWYgKGV4dHJhRmllbGQuaWQgPT09IDB4MDAwMSkge1xuICAgICAgICAgICAgemlwNjRFaWVmQnVmZmVyID0gZXh0cmFGaWVsZC5kYXRhO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh6aXA2NEVpZWZCdWZmZXIgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwiZXhwZWN0ZWQgemlwNjQgZXh0ZW5kZWQgaW5mb3JtYXRpb24gZXh0cmEgZmllbGRcIikpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIC8vIDAgLSBPcmlnaW5hbCBTaXplICAgICAgICAgIDggYnl0ZXNcbiAgICAgICAgaWYgKGVudHJ5LnVuY29tcHJlc3NlZFNpemUgPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgICBpZiAoaW5kZXggKyA4ID4gemlwNjRFaWVmQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRFcnJvckFuZEF1dG9DbG9zZShzZWxmLCBuZXcgRXJyb3IoXCJ6aXA2NCBleHRlbmRlZCBpbmZvcm1hdGlvbiBleHRyYSBmaWVsZCBkb2VzIG5vdCBpbmNsdWRlIHVuY29tcHJlc3NlZCBzaXplXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkU2l6ZSA9IHJlYWRVSW50NjRMRSh6aXA2NEVpZWZCdWZmZXIsIGluZGV4KTtcbiAgICAgICAgICBpbmRleCArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vIDggLSBDb21wcmVzc2VkIFNpemUgICAgICAgIDggYnl0ZXNcbiAgICAgICAgaWYgKGVudHJ5LmNvbXByZXNzZWRTaXplID09PSAweGZmZmZmZmZmKSB7XG4gICAgICAgICAgaWYgKGluZGV4ICsgOCA+IHppcDY0RWllZkJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwiemlwNjQgZXh0ZW5kZWQgaW5mb3JtYXRpb24gZXh0cmEgZmllbGQgZG9lcyBub3QgaW5jbHVkZSBjb21wcmVzc2VkIHNpemVcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbnRyeS5jb21wcmVzc2VkU2l6ZSA9IHJlYWRVSW50NjRMRSh6aXA2NEVpZWZCdWZmZXIsIGluZGV4KTtcbiAgICAgICAgICBpbmRleCArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vIDE2IC0gUmVsYXRpdmUgSGVhZGVyIE9mZnNldCA4IGJ5dGVzXG4gICAgICAgIGlmIChlbnRyeS5yZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgICBpZiAoaW5kZXggKyA4ID4gemlwNjRFaWVmQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRFcnJvckFuZEF1dG9DbG9zZShzZWxmLCBuZXcgRXJyb3IoXCJ6aXA2NCBleHRlbmRlZCBpbmZvcm1hdGlvbiBleHRyYSBmaWVsZCBkb2VzIG5vdCBpbmNsdWRlIHJlbGF0aXZlIGhlYWRlciBvZmZzZXRcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbnRyeS5yZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgPSByZWFkVUludDY0TEUoemlwNjRFaWVmQnVmZmVyLCBpbmRleCk7XG4gICAgICAgICAgaW5kZXggKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLyAyNCAtIERpc2sgU3RhcnQgTnVtYmVyICAgICAgNCBieXRlc1xuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBmb3IgSW5mby1aSVAgVW5pY29kZSBQYXRoIEV4dHJhIEZpZWxkICgweDcwNzUpXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWpvc2h3b2xmZS95YXV6bC9pc3N1ZXMvMzNcbiAgICAgIGlmIChzZWxmLmRlY29kZVN0cmluZ3MpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyeS5leHRyYUZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBleHRyYUZpZWxkID0gZW50cnkuZXh0cmFGaWVsZHNbaV07XG4gICAgICAgICAgaWYgKGV4dHJhRmllbGQuaWQgPT09IDB4NzA3NSkge1xuICAgICAgICAgICAgaWYgKGV4dHJhRmllbGQuZGF0YS5sZW5ndGggPCA2KSB7XG4gICAgICAgICAgICAgIC8vIHRvbyBzaG9ydCB0byBiZSBtZWFuaW5nZnVsXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVmVyc2lvbiAgICAgICAxIGJ5dGUgICAgICB2ZXJzaW9uIG9mIHRoaXMgZXh0cmEgZmllbGQsIGN1cnJlbnRseSAxXG4gICAgICAgICAgICBpZiAoZXh0cmFGaWVsZC5kYXRhLnJlYWRVSW50OCgwKSAhPT0gMSkge1xuICAgICAgICAgICAgICAvLyA+IENoYW5nZXMgbWF5IG5vdCBiZSBiYWNrd2FyZCBjb21wYXRpYmxlIHNvIHRoaXMgZXh0cmFcbiAgICAgICAgICAgICAgLy8gPiBmaWVsZCBzaG91bGQgbm90IGJlIHVzZWQgaWYgdGhlIHZlcnNpb24gaXMgbm90IHJlY29nbml6ZWQuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTmFtZUNSQzMyICAgICA0IGJ5dGVzICAgICBGaWxlIE5hbWUgRmllbGQgQ1JDMzIgQ2hlY2tzdW1cbiAgICAgICAgICAgIHZhciBvbGROYW1lQ3JjMzIgPSBleHRyYUZpZWxkLmRhdGEucmVhZFVJbnQzMkxFKDEpO1xuICAgICAgICAgICAgaWYgKGNyYzMyLnVuc2lnbmVkKGJ1ZmZlci5zbGljZSgwLCBlbnRyeS5maWxlTmFtZUxlbmd0aCkpICE9PSBvbGROYW1lQ3JjMzIpIHtcbiAgICAgICAgICAgICAgLy8gPiBJZiB0aGUgQ1JDIGNoZWNrIGZhaWxzLCB0aGlzIFVURi04IFBhdGggRXh0cmEgRmllbGQgc2hvdWxkIGJlXG4gICAgICAgICAgICAgIC8vID4gaWdub3JlZCBhbmQgdGhlIEZpbGUgTmFtZSBmaWVsZCBpbiB0aGUgaGVhZGVyIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVW5pY29kZU5hbWUgICBWYXJpYWJsZSAgICBVVEYtOCB2ZXJzaW9uIG9mIHRoZSBlbnRyeSBGaWxlIE5hbWVcbiAgICAgICAgICAgIGVudHJ5LmZpbGVOYW1lID0gZGVjb2RlQnVmZmVyKGV4dHJhRmllbGQuZGF0YSwgNSwgZXh0cmFGaWVsZC5kYXRhLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWRhdGUgZmlsZSBzaXplXG4gICAgICBpZiAoc2VsZi52YWxpZGF0ZUVudHJ5U2l6ZXMgJiYgZW50cnkuY29tcHJlc3Npb25NZXRob2QgPT09IDApIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ29tcHJlc3NlZFNpemUgPSBlbnRyeS51bmNvbXByZXNzZWRTaXplO1xuICAgICAgICBpZiAoZW50cnkuaXNFbmNyeXB0ZWQoKSkge1xuICAgICAgICAgIC8vIHRyYWRpdGlvbmFsIGVuY3J5cHRpb24gcHJlZml4ZXMgdGhlIGZpbGUgZGF0YSB3aXRoIGEgaGVhZGVyXG4gICAgICAgICAgZXhwZWN0ZWRDb21wcmVzc2VkU2l6ZSArPSAxMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuY29tcHJlc3NlZFNpemUgIT09IGV4cGVjdGVkQ29tcHJlc3NlZFNpemUpIHtcbiAgICAgICAgICB2YXIgbXNnID0gXCJjb21wcmVzc2VkL3VuY29tcHJlc3NlZCBzaXplIG1pc21hdGNoIGZvciBzdG9yZWQgZmlsZTogXCIgKyBlbnRyeS5jb21wcmVzc2VkU2l6ZSArIFwiICE9IFwiICsgZW50cnkudW5jb21wcmVzc2VkU2l6ZTtcbiAgICAgICAgICByZXR1cm4gZW1pdEVycm9yQW5kQXV0b0Nsb3NlKHNlbGYsIG5ldyBFcnJvcihtc2cpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZi5kZWNvZGVTdHJpbmdzKSB7XG4gICAgICAgIGlmICghc2VsZi5zdHJpY3RGaWxlTmFtZXMpIHtcbiAgICAgICAgICAvLyBhbGxvdyBiYWNrc2xhc2hcbiAgICAgICAgICBlbnRyeS5maWxlTmFtZSA9IGVudHJ5LmZpbGVOYW1lLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSB2YWxpZGF0ZUZpbGVOYW1lKGVudHJ5LmZpbGVOYW1lLCBzZWxmLnZhbGlkYXRlRmlsZU5hbWVPcHRpb25zKTtcbiAgICAgICAgaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSByZXR1cm4gZW1pdEVycm9yQW5kQXV0b0Nsb3NlKHNlbGYsIG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZW1pdChcImVudHJ5XCIsIGVudHJ5KTtcblxuICAgICAgaWYgKCFzZWxmLmxhenlFbnRyaWVzKSBzZWxmLl9yZWFkRW50cnkoKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5aaXBGaWxlLnByb3RvdHlwZS5vcGVuUmVhZFN0cmVhbSA9IGZ1bmN0aW9uKGVudHJ5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIC8vIHBhcmFtZXRlciB2YWxpZGF0aW9uXG4gIHZhciByZWxhdGl2ZVN0YXJ0ID0gMDtcbiAgdmFyIHJlbGF0aXZlRW5kID0gZW50cnkuY29tcHJlc3NlZFNpemU7XG4gIGlmIChjYWxsYmFjayA9PSBudWxsKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICAvLyB2YWxpZGF0ZSBvcHRpb25zIHRoYXQgdGhlIGNhbGxlciBoYXMgbm8gZXhjdXNlIHRvIGdldCB3cm9uZ1xuICAgIGlmIChvcHRpb25zLmRlY3J5cHQgIT0gbnVsbCkge1xuICAgICAgaWYgKCFlbnRyeS5pc0VuY3J5cHRlZCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMuZGVjcnlwdCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGVuY3J5cHRlZCBlbnRyaWVzXCIpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZGVjcnlwdCAhPT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgb3B0aW9ucy5kZWNyeXB0IHZhbHVlOiBcIiArIG9wdGlvbnMuZGVjcnlwdCk7XG4gICAgICBpZiAoZW50cnkuaXNDb21wcmVzc2VkKCkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGVjb21wcmVzcyAhPT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcihcImVudHJ5IGlzIGVuY3J5cHRlZCBhbmQgY29tcHJlc3NlZCwgYW5kIG9wdGlvbnMuZGVjb21wcmVzcyAhPT0gZmFsc2VcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmRlY29tcHJlc3MgIT0gbnVsbCkge1xuICAgICAgaWYgKCFlbnRyeS5pc0NvbXByZXNzZWQoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLmRlY29tcHJlc3MgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBjb21wcmVzc2VkIGVudHJpZXNcIik7XG4gICAgICB9XG4gICAgICBpZiAoIShvcHRpb25zLmRlY29tcHJlc3MgPT09IGZhbHNlIHx8IG9wdGlvbnMuZGVjb21wcmVzcyA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvcHRpb25zLmRlY29tcHJlc3MgdmFsdWU6IFwiICsgb3B0aW9ucy5kZWNvbXByZXNzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc3RhcnQgIT0gbnVsbCB8fCBvcHRpb25zLmVuZCAhPSBudWxsKSB7XG4gICAgICBpZiAoZW50cnkuaXNDb21wcmVzc2VkKCkgJiYgb3B0aW9ucy5kZWNvbXByZXNzICE9PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydC9lbmQgcmFuZ2Ugbm90IGFsbG93ZWQgZm9yIGNvbXByZXNzZWQgZW50cnkgd2l0aG91dCBvcHRpb25zLmRlY29tcHJlc3MgPT09IGZhbHNlXCIpO1xuICAgICAgfVxuICAgICAgaWYgKGVudHJ5LmlzRW5jcnlwdGVkKCkgJiYgb3B0aW9ucy5kZWNyeXB0ICE9PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydC9lbmQgcmFuZ2Ugbm90IGFsbG93ZWQgZm9yIGVuY3J5cHRlZCBlbnRyeSB3aXRob3V0IG9wdGlvbnMuZGVjcnlwdCA9PT0gZmFsc2VcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnN0YXJ0ICE9IG51bGwpIHtcbiAgICAgIHJlbGF0aXZlU3RhcnQgPSBvcHRpb25zLnN0YXJ0O1xuICAgICAgaWYgKHJlbGF0aXZlU3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLnN0YXJ0IDwgMFwiKTtcbiAgICAgIGlmIChyZWxhdGl2ZVN0YXJ0ID4gZW50cnkuY29tcHJlc3NlZFNpemUpIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMuc3RhcnQgPiBlbnRyeS5jb21wcmVzc2VkU2l6ZVwiKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZW5kICE9IG51bGwpIHtcbiAgICAgIHJlbGF0aXZlRW5kID0gb3B0aW9ucy5lbmQ7XG4gICAgICBpZiAocmVsYXRpdmVFbmQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLmVuZCA8IDBcIik7XG4gICAgICBpZiAocmVsYXRpdmVFbmQgPiBlbnRyeS5jb21wcmVzc2VkU2l6ZSkgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucy5lbmQgPiBlbnRyeS5jb21wcmVzc2VkU2l6ZVwiKTtcbiAgICAgIGlmIChyZWxhdGl2ZUVuZCA8IHJlbGF0aXZlU3RhcnQpIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMuZW5kIDwgb3B0aW9ucy5zdGFydFwiKTtcbiAgICB9XG4gIH1cbiAgLy8gYW55IGZ1cnRoZXIgZXJyb3JzIGNhbiBlaXRoZXIgYmUgY2F1c2VkIGJ5IHRoZSB6aXBmaWxlLFxuICAvLyBvciB3ZXJlIGludHJvZHVjZWQgaW4gYSBtaW5vciB2ZXJzaW9uIG9mIHlhdXpsLFxuICAvLyBzbyBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBjbGllbnQgcmF0aGVyIHRoYW4gdGhyb3duLlxuICBpZiAoIXNlbGYuaXNPcGVuKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiY2xvc2VkXCIpKTtcbiAgaWYgKGVudHJ5LmlzRW5jcnlwdGVkKCkpIHtcbiAgICBpZiAob3B0aW9ucy5kZWNyeXB0ICE9PSBmYWxzZSkgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcImVudHJ5IGlzIGVuY3J5cHRlZCwgYW5kIG9wdGlvbnMuZGVjcnlwdCAhPT0gZmFsc2VcIikpO1xuICB9XG4gIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBsb3NlIHRoZSBmZCBiZWZvcmUgd2Ugb3BlbiB0aGUgYWN0dWFsIHJlYWQgc3RyZWFtXG4gIHNlbGYucmVhZGVyLnJlZigpO1xuICB2YXIgYnVmZmVyID0gbmV3QnVmZmVyKDMwKTtcbiAgcmVhZEFuZEFzc2VydE5vRW9mKHNlbGYucmVhZGVyLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIGVudHJ5LnJlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciwgZnVuY3Rpb24oZXJyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgLy8gMCAtIExvY2FsIGZpbGUgaGVhZGVyIHNpZ25hdHVyZSA9IDB4MDQwMzRiNTBcbiAgICAgIHZhciBzaWduYXR1cmUgPSBidWZmZXIucmVhZFVJbnQzMkxFKDApO1xuICAgICAgaWYgKHNpZ25hdHVyZSAhPT0gMHgwNDAzNGI1MCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiaW52YWxpZCBsb2NhbCBmaWxlIGhlYWRlciBzaWduYXR1cmU6IDB4XCIgKyBzaWduYXR1cmUudG9TdHJpbmcoMTYpKSk7XG4gICAgICB9XG4gICAgICAvLyBhbGwgdGhpcyBzaG91bGQgYmUgcmVkdW5kYW50XG4gICAgICAvLyA0IC0gVmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAobWluaW11bSlcbiAgICAgIC8vIDYgLSBHZW5lcmFsIHB1cnBvc2UgYml0IGZsYWdcbiAgICAgIC8vIDggLSBDb21wcmVzc2lvbiBtZXRob2RcbiAgICAgIC8vIDEwIC0gRmlsZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lXG4gICAgICAvLyAxMiAtIEZpbGUgbGFzdCBtb2RpZmljYXRpb24gZGF0ZVxuICAgICAgLy8gMTQgLSBDUkMtMzJcbiAgICAgIC8vIDE4IC0gQ29tcHJlc3NlZCBzaXplXG4gICAgICAvLyAyMiAtIFVuY29tcHJlc3NlZCBzaXplXG4gICAgICAvLyAyNiAtIEZpbGUgbmFtZSBsZW5ndGggKG4pXG4gICAgICB2YXIgZmlsZU5hbWVMZW5ndGggPSBidWZmZXIucmVhZFVJbnQxNkxFKDI2KTtcbiAgICAgIC8vIDI4IC0gRXh0cmEgZmllbGQgbGVuZ3RoIChtKVxuICAgICAgdmFyIGV4dHJhRmllbGRMZW5ndGggPSBidWZmZXIucmVhZFVJbnQxNkxFKDI4KTtcbiAgICAgIC8vIDMwIC0gRmlsZSBuYW1lXG4gICAgICAvLyAzMCtuIC0gRXh0cmEgZmllbGRcbiAgICAgIHZhciBsb2NhbEZpbGVIZWFkZXJFbmQgPSBlbnRyeS5yZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgKyBidWZmZXIubGVuZ3RoICsgZmlsZU5hbWVMZW5ndGggKyBleHRyYUZpZWxkTGVuZ3RoO1xuICAgICAgdmFyIGRlY29tcHJlc3M7XG4gICAgICBpZiAoZW50cnkuY29tcHJlc3Npb25NZXRob2QgPT09IDApIHtcbiAgICAgICAgLy8gMCAtIFRoZSBmaWxlIGlzIHN0b3JlZCAobm8gY29tcHJlc3Npb24pXG4gICAgICAgIGRlY29tcHJlc3MgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkuY29tcHJlc3Npb25NZXRob2QgPT09IDgpIHtcbiAgICAgICAgLy8gOCAtIFRoZSBmaWxlIGlzIERlZmxhdGVkXG4gICAgICAgIGRlY29tcHJlc3MgPSBvcHRpb25zLmRlY29tcHJlc3MgIT0gbnVsbCA/IG9wdGlvbnMuZGVjb21wcmVzcyA6IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kOiBcIiArIGVudHJ5LmNvbXByZXNzaW9uTWV0aG9kKSk7XG4gICAgICB9XG4gICAgICB2YXIgZmlsZURhdGFTdGFydCA9IGxvY2FsRmlsZUhlYWRlckVuZDtcbiAgICAgIHZhciBmaWxlRGF0YUVuZCA9IGZpbGVEYXRhU3RhcnQgKyBlbnRyeS5jb21wcmVzc2VkU2l6ZTtcbiAgICAgIGlmIChlbnRyeS5jb21wcmVzc2VkU2l6ZSAhPT0gMCkge1xuICAgICAgICAvLyBib3VuZHMgY2hlY2sgbm93LCBiZWNhdXNlIHRoZSByZWFkIHN0cmVhbXMgd2lsbCBwcm9iYWJseSBub3QgY29tcGxhaW4gbG91ZCBlbm91Z2guXG4gICAgICAgIC8vIHNpbmNlIHdlJ3JlIGRlYWxpbmcgd2l0aCBhbiB1bnNpZ25lZCBvZmZzZXQgcGx1cyBhbiB1bnNpZ25lZCBzaXplLFxuICAgICAgICAvLyB3ZSBvbmx5IGhhdmUgMSB0aGluZyB0byBjaGVjayBmb3IuXG4gICAgICAgIGlmIChmaWxlRGF0YUVuZCA+IHNlbGYuZmlsZVNpemUpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiZmlsZSBkYXRhIG92ZXJmbG93cyBmaWxlIGJvdW5kczogXCIgK1xuICAgICAgICAgICAgICBmaWxlRGF0YVN0YXJ0ICsgXCIgKyBcIiArIGVudHJ5LmNvbXByZXNzZWRTaXplICsgXCIgPiBcIiArIHNlbGYuZmlsZVNpemUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHJlYWRTdHJlYW0gPSBzZWxmLnJlYWRlci5jcmVhdGVSZWFkU3RyZWFtKHtcbiAgICAgICAgc3RhcnQ6IGZpbGVEYXRhU3RhcnQgKyByZWxhdGl2ZVN0YXJ0LFxuICAgICAgICBlbmQ6IGZpbGVEYXRhU3RhcnQgKyByZWxhdGl2ZUVuZCxcbiAgICAgIH0pO1xuICAgICAgdmFyIGVuZHBvaW50U3RyZWFtID0gcmVhZFN0cmVhbTtcbiAgICAgIGlmIChkZWNvbXByZXNzKSB7XG4gICAgICAgIHZhciBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGluZmxhdGVGaWx0ZXIgPSB6bGliLmNyZWF0ZUluZmxhdGVSYXcoKTtcbiAgICAgICAgcmVhZFN0cmVhbS5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIC8vIHNldEltbWVkaWF0ZSBoZXJlIGJlY2F1c2UgZXJyb3JzIGNhbiBiZSBlbWl0dGVkIGR1cmluZyB0aGUgZmlyc3QgY2FsbCB0byBwaXBlKClcbiAgICAgICAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoIWRlc3Ryb3llZCkgaW5mbGF0ZUZpbHRlci5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRTdHJlYW0ucGlwZShpbmZsYXRlRmlsdGVyKTtcblxuICAgICAgICBpZiAoc2VsZi52YWxpZGF0ZUVudHJ5U2l6ZXMpIHtcbiAgICAgICAgICBlbmRwb2ludFN0cmVhbSA9IG5ldyBBc3NlcnRCeXRlQ291bnRTdHJlYW0oZW50cnkudW5jb21wcmVzc2VkU2l6ZSk7XG4gICAgICAgICAgaW5mbGF0ZUZpbHRlci5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgLy8gZm9yd2FyZCB6bGliIGVycm9ycyB0byB0aGUgY2xpZW50LXZpc2libGUgc3RyZWFtXG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmICghZGVzdHJveWVkKSBlbmRwb2ludFN0cmVhbS5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGluZmxhdGVGaWx0ZXIucGlwZShlbmRwb2ludFN0cmVhbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhlIHpsaWIgZmlsdGVyIGlzIHRoZSBjbGllbnQtdmlzaWJsZSBzdHJlYW1cbiAgICAgICAgICBlbmRwb2ludFN0cmVhbSA9IGluZmxhdGVGaWx0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcyBpcyBwYXJ0IG9mIHlhdXpsJ3MgQVBJLCBzbyBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBvbiB0aGUgY2xpZW50LXZpc2libGUgc3RyZWFtXG4gICAgICAgIGVuZHBvaW50U3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBkZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChpbmZsYXRlRmlsdGVyICE9PSBlbmRwb2ludFN0cmVhbSkgaW5mbGF0ZUZpbHRlci51bnBpcGUoZW5kcG9pbnRTdHJlYW0pO1xuICAgICAgICAgIHJlYWRTdHJlYW0udW5waXBlKGluZmxhdGVGaWx0ZXIpO1xuICAgICAgICAgIC8vIFRPRE86IHRoZSBpbmZsYXRlRmlsdGVyIG1heSBjYXVzZSBhIG1lbW9yeSBsZWFrLiBzZWUgSXNzdWUgIzI3LlxuICAgICAgICAgIHJlYWRTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgZW5kcG9pbnRTdHJlYW0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZWxmLnJlYWRlci51bnJlZigpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBFbnRyeSgpIHtcbn1cbkVudHJ5LnByb3RvdHlwZS5nZXRMYXN0TW9kRGF0ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZG9zRGF0ZVRpbWVUb0RhdGUodGhpcy5sYXN0TW9kRmlsZURhdGUsIHRoaXMubGFzdE1vZEZpbGVUaW1lKTtcbn07XG5FbnRyeS5wcm90b3R5cGUuaXNFbmNyeXB0ZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICh0aGlzLmdlbmVyYWxQdXJwb3NlQml0RmxhZyAmIDB4MSkgIT09IDA7XG59O1xuRW50cnkucHJvdG90eXBlLmlzQ29tcHJlc3NlZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jb21wcmVzc2lvbk1ldGhvZCA9PT0gODtcbn07XG5cbmZ1bmN0aW9uIGRvc0RhdGVUaW1lVG9EYXRlKGRhdGUsIHRpbWUpIHtcbiAgdmFyIGRheSA9IGRhdGUgJiAweDFmOyAvLyAxLTMxXG4gIHZhciBtb250aCA9IChkYXRlID4+IDUgJiAweGYpIC0gMTsgLy8gMS0xMiwgMC0xMVxuICB2YXIgeWVhciA9IChkYXRlID4+IDkgJiAweDdmKSArIDE5ODA7IC8vIDAtMTI4LCAxOTgwLTIxMDhcblxuICB2YXIgbWlsbGlzZWNvbmQgPSAwO1xuICB2YXIgc2Vjb25kID0gKHRpbWUgJiAweDFmKSAqIDI7IC8vIDAtMjksIDAtNTggKGV2ZW4gbnVtYmVycylcbiAgdmFyIG1pbnV0ZSA9IHRpbWUgPj4gNSAmIDB4M2Y7IC8vIDAtNTlcbiAgdmFyIGhvdXIgPSB0aW1lID4+IDExICYgMHgxZjsgLy8gMC0yM1xuXG4gIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZpbGVOYW1lKGZpbGVOYW1lKSB7XG4gIGlmIChmaWxlTmFtZS5pbmRleE9mKFwiXFxcXFwiKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gXCJpbnZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZU5hbWU6IFwiICsgZmlsZU5hbWU7XG4gIH1cbiAgaWYgKC9eW2EtekEtWl06Ly50ZXN0KGZpbGVOYW1lKSB8fCAvXlxcLy8udGVzdChmaWxlTmFtZSkpIHtcbiAgICByZXR1cm4gXCJhYnNvbHV0ZSBwYXRoOiBcIiArIGZpbGVOYW1lO1xuICB9XG4gIGlmIChmaWxlTmFtZS5zcGxpdChcIi9cIikuaW5kZXhPZihcIi4uXCIpICE9PSAtMSkge1xuICAgIHJldHVybiBcImludmFsaWQgcmVsYXRpdmUgcGF0aDogXCIgKyBmaWxlTmFtZTtcbiAgfVxuICAvLyBhbGwgZ29vZFxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVhZEFuZEFzc2VydE5vRW9mKHJlYWRlciwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAvLyBmcy5yZWFkIHdpbGwgdGhyb3cgYW4gb3V0LW9mLWJvdW5kcyBlcnJvciBpZiB5b3UgdHJ5IHRvIHJlYWQgMCBieXRlcyBmcm9tIGEgMCBieXRlIGZpbGVcbiAgICByZXR1cm4gc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkgeyBjYWxsYmFjayhudWxsLCBuZXdCdWZmZXIoMCkpOyB9KTtcbiAgfVxuICByZWFkZXIucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgZnVuY3Rpb24oZXJyLCBieXRlc1JlYWQpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBpZiAoYnl0ZXNSZWFkIDwgbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwidW5leHBlY3RlZCBFT0ZcIikpO1xuICAgIH1cbiAgICBjYWxsYmFjaygpO1xuICB9KTtcbn1cblxudXRpbC5pbmhlcml0cyhBc3NlcnRCeXRlQ291bnRTdHJlYW0sIFRyYW5zZm9ybSk7XG5mdW5jdGlvbiBBc3NlcnRCeXRlQ291bnRTdHJlYW0oYnl0ZUNvdW50KSB7XG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMpO1xuICB0aGlzLmFjdHVhbEJ5dGVDb3VudCA9IDA7XG4gIHRoaXMuZXhwZWN0ZWRCeXRlQ291bnQgPSBieXRlQ291bnQ7XG59XG5Bc3NlcnRCeXRlQ291bnRTdHJlYW0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuYWN0dWFsQnl0ZUNvdW50ICs9IGNodW5rLmxlbmd0aDtcbiAgaWYgKHRoaXMuYWN0dWFsQnl0ZUNvdW50ID4gdGhpcy5leHBlY3RlZEJ5dGVDb3VudCkge1xuICAgIHZhciBtc2cgPSBcInRvbyBtYW55IGJ5dGVzIGluIHRoZSBzdHJlYW0uIGV4cGVjdGVkIFwiICsgdGhpcy5leHBlY3RlZEJ5dGVDb3VudCArIFwiLiBnb3QgYXQgbGVhc3QgXCIgKyB0aGlzLmFjdHVhbEJ5dGVDb3VudDtcbiAgICByZXR1cm4gY2IobmV3IEVycm9yKG1zZykpO1xuICB9XG4gIGNiKG51bGwsIGNodW5rKTtcbn07XG5Bc3NlcnRCeXRlQ291bnRTdHJlYW0ucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uKGNiKSB7XG4gIGlmICh0aGlzLmFjdHVhbEJ5dGVDb3VudCA8IHRoaXMuZXhwZWN0ZWRCeXRlQ291bnQpIHtcbiAgICB2YXIgbXNnID0gXCJub3QgZW5vdWdoIGJ5dGVzIGluIHRoZSBzdHJlYW0uIGV4cGVjdGVkIFwiICsgdGhpcy5leHBlY3RlZEJ5dGVDb3VudCArIFwiLiBnb3Qgb25seSBcIiArIHRoaXMuYWN0dWFsQnl0ZUNvdW50O1xuICAgIHJldHVybiBjYihuZXcgRXJyb3IobXNnKSk7XG4gIH1cbiAgY2IoKTtcbn07XG5cbnV0aWwuaW5oZXJpdHMoUmFuZG9tQWNjZXNzUmVhZGVyLCBFdmVudEVtaXR0ZXIpO1xuZnVuY3Rpb24gUmFuZG9tQWNjZXNzUmVhZGVyKCkge1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcbiAgdGhpcy5yZWZDb3VudCA9IDA7XG59XG5SYW5kb21BY2Nlc3NSZWFkZXIucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJlZkNvdW50ICs9IDE7XG59O1xuUmFuZG9tQWNjZXNzUmVhZGVyLnByb3RvdHlwZS51bnJlZiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYucmVmQ291bnQgLT0gMTtcblxuICBpZiAoc2VsZi5yZWZDb3VudCA+IDApIHJldHVybjtcbiAgaWYgKHNlbGYucmVmQ291bnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHVucmVmXCIpO1xuXG4gIHNlbGYuY2xvc2Uob25DbG9zZURvbmUpO1xuXG4gIGZ1bmN0aW9uIG9uQ2xvc2VEb25lKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICBzZWxmLmVtaXQoJ2Nsb3NlJyk7XG4gIH1cbn07XG5SYW5kb21BY2Nlc3NSZWFkZXIucHJvdG90eXBlLmNyZWF0ZVJlYWRTdHJlYW0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHZhciBzdGFydCA9IG9wdGlvbnMuc3RhcnQ7XG4gIHZhciBlbmQgPSBvcHRpb25zLmVuZDtcbiAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICB2YXIgZW1wdHlTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICBlbXB0eVN0cmVhbS5lbmQoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZW1wdHlTdHJlYW07XG4gIH1cbiAgdmFyIHN0cmVhbSA9IHRoaXMuX3JlYWRTdHJlYW1Gb3JSYW5nZShzdGFydCwgZW5kKTtcblxuICB2YXIgZGVzdHJveWVkID0gZmFsc2U7XG4gIHZhciByZWZVbnJlZkZpbHRlciA9IG5ldyBSZWZVbnJlZkZpbHRlcih0aGlzKTtcbiAgc3RyZWFtLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24oZXJyKSB7XG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFkZXN0cm95ZWQpIHJlZlVucmVmRmlsdGVyLmVtaXQoXCJlcnJvclwiLCBlcnIpO1xuICAgIH0pO1xuICB9KTtcbiAgcmVmVW5yZWZGaWx0ZXIuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIHN0cmVhbS51bnBpcGUocmVmVW5yZWZGaWx0ZXIpO1xuICAgIHJlZlVucmVmRmlsdGVyLnVucmVmKCk7XG4gICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgfTtcblxuICB2YXIgYnl0ZUNvdW50ZXIgPSBuZXcgQXNzZXJ0Qnl0ZUNvdW50U3RyZWFtKGVuZCAtIHN0YXJ0KTtcbiAgcmVmVW5yZWZGaWx0ZXIub24oXCJlcnJvclwiLCBmdW5jdGlvbihlcnIpIHtcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIWRlc3Ryb3llZCkgYnl0ZUNvdW50ZXIuZW1pdChcImVycm9yXCIsIGVycik7XG4gICAgfSk7XG4gIH0pO1xuICBieXRlQ291bnRlci5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgZGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZWZVbnJlZkZpbHRlci51bnBpcGUoYnl0ZUNvdW50ZXIpO1xuICAgIHJlZlVucmVmRmlsdGVyLmRlc3Ryb3koKTtcbiAgfTtcblxuICByZXR1cm4gc3RyZWFtLnBpcGUocmVmVW5yZWZGaWx0ZXIpLnBpcGUoYnl0ZUNvdW50ZXIpO1xufTtcblJhbmRvbUFjY2Vzc1JlYWRlci5wcm90b3R5cGUuX3JlYWRTdHJlYW1Gb3JSYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xufTtcblJhbmRvbUFjY2Vzc1JlYWRlci5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaykge1xuICB2YXIgcmVhZFN0cmVhbSA9IHRoaXMuY3JlYXRlUmVhZFN0cmVhbSh7c3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uICsgbGVuZ3RofSk7XG4gIHZhciB3cml0ZVN0cmVhbSA9IG5ldyBXcml0YWJsZSgpO1xuICB2YXIgd3JpdHRlbiA9IDA7XG4gIHdyaXRlU3RyZWFtLl93cml0ZSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICBjaHVuay5jb3B5KGJ1ZmZlciwgb2Zmc2V0ICsgd3JpdHRlbiwgMCwgY2h1bmsubGVuZ3RoKTtcbiAgICB3cml0dGVuICs9IGNodW5rLmxlbmd0aDtcbiAgICBjYigpO1xuICB9O1xuICB3cml0ZVN0cmVhbS5vbihcImZpbmlzaFwiLCBjYWxsYmFjayk7XG4gIHJlYWRTdHJlYW0ub24oXCJlcnJvclwiLCBmdW5jdGlvbihlcnJvcikge1xuICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgfSk7XG4gIHJlYWRTdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSk7XG59O1xuUmFuZG9tQWNjZXNzUmVhZGVyLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG59O1xuXG51dGlsLmluaGVyaXRzKFJlZlVucmVmRmlsdGVyLCBQYXNzVGhyb3VnaCk7XG5mdW5jdGlvbiBSZWZVbnJlZkZpbHRlcihjb250ZXh0KSB7XG4gIFBhc3NUaHJvdWdoLmNhbGwodGhpcyk7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuY29udGV4dC5yZWYoKTtcbiAgdGhpcy51bnJlZmZlZFlldCA9IGZhbHNlO1xufVxuUmVmVW5yZWZGaWx0ZXIucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uKGNiKSB7XG4gIHRoaXMudW5yZWYoKTtcbiAgY2IoKTtcbn07XG5SZWZVbnJlZkZpbHRlci5wcm90b3R5cGUudW5yZWYgPSBmdW5jdGlvbihjYikge1xuICBpZiAodGhpcy51bnJlZmZlZFlldCkgcmV0dXJuO1xuICB0aGlzLnVucmVmZmVkWWV0ID0gdHJ1ZTtcbiAgdGhpcy5jb250ZXh0LnVucmVmKCk7XG59O1xuXG52YXIgY3A0MzcgPSAnXFx1MDAwMOKYuuKYu+KZpeKZpuKZo+KZoOKAouKXmOKXi+KXmeKZguKZgOKZquKZq+KYvOKWuuKXhOKGleKAvMK2wqfilqzihqjihpHihpPihpLihpDiiJ/ihpTilrLilrwgIVwiIyQlJlxcJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fuKMgsOHw7zDqcOiw6TDoMOlw6fDqsOrw6jDr8Ouw6zDhMOFw4nDpsOGw7TDtsOyw7vDucO/w5bDnMKiwqPCpeKCp8aSw6HDrcOzw7rDscORwqrCusK/4oyQwqzCvcK8wqHCq8K74paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAzrHDn86Tz4DOo8+DwrXPhM6mzpjOqc604oiez4bOteKIqeKJocKx4oml4omk4oyg4oyhw7fiiYjCsOKImcK34oia4oG/wrLilqDCoCc7XG5mdW5jdGlvbiBkZWNvZGVCdWZmZXIoYnVmZmVyLCBzdGFydCwgZW5kLCBpc1V0ZjgpIHtcbiAgaWYgKGlzVXRmOCkge1xuICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoXCJ1dGY4XCIsIHN0YXJ0LCBlbmQpO1xuICB9IGVsc2Uge1xuICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICByZXN1bHQgKz0gY3A0MzdbYnVmZmVyW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkVUludDY0TEUoYnVmZmVyLCBvZmZzZXQpIHtcbiAgLy8gdGhlcmUgaXMgbm8gbmF0aXZlIGZ1bmN0aW9uIGZvciB0aGlzLCBiZWNhdXNlIHdlIGNhbid0IGFjdHVhbGx5IHN0b3JlIDY0LWJpdCBpbnRlZ2VycyBwcmVjaXNlbHkuXG4gIC8vIGFmdGVyIDUzIGJpdHMsIEphdmFTY3JpcHQncyBOdW1iZXIgdHlwZSAoSUVFRSA3NTQgZG91YmxlKSBjYW4ndCBzdG9yZSBpbmRpdmlkdWFsIGludGVnZXJzIGFueW1vcmUuXG4gIC8vIGJ1dCBzaW5jZSA1MyBiaXRzIGlzIGEgd2hvbGUgbG90IG1vcmUgdGhhbiAzMiBiaXRzLCB3ZSBkbyBvdXIgYmVzdCBhbnl3YXkuXG4gIHZhciBsb3dlcjMyID0gYnVmZmVyLnJlYWRVSW50MzJMRShvZmZzZXQpO1xuICB2YXIgdXBwZXIzMiA9IGJ1ZmZlci5yZWFkVUludDMyTEUob2Zmc2V0ICsgNCk7XG4gIC8vIHdlIGNhbid0IHVzZSBiaXRzaGlmdGluZyBoZXJlLCBiZWNhdXNlIEphdmFTY3JpcHQgYml0c2hpZnRpbmcgb25seSB3b3JrcyBvbiAzMi1iaXQgaW50ZWdlcnMuXG4gIHJldHVybiB1cHBlcjMyICogMHgxMDAwMDAwMDAgKyBsb3dlcjMyO1xuICAvLyBhcyBsb25nIGFzIHdlJ3JlIGJvdW5kcyBjaGVja2luZyB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gYWdhaW5zdCB0aGUgdG90YWwgZmlsZSBzaXplLFxuICAvLyB3ZSdsbCBjYXRjaCBhbnkgb3ZlcmZsb3cgZXJyb3JzLCBiZWNhdXNlIHdlIGFscmVhZHkgbWFkZSBzdXJlIHRoZSB0b3RhbCBmaWxlIHNpemUgd2FzIHdpdGhpbiByZWFzb24uXG59XG5cbi8vIE5vZGUgMTAgZGVwcmVjYXRlZCBuZXcgQnVmZmVyKCkuXG52YXIgbmV3QnVmZmVyO1xuaWYgKHR5cGVvZiBCdWZmZXIuYWxsb2NVbnNhZmUgPT09IFwiZnVuY3Rpb25cIikge1xuICBuZXdCdWZmZXIgPSBmdW5jdGlvbihsZW4pIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbik7XG4gIH07XG59IGVsc2Uge1xuICBuZXdCdWZmZXIgPSBmdW5jdGlvbihsZW4pIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihsZW4pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q2FsbGJhY2soZXJyKSB7XG4gIGlmIChlcnIpIHRocm93IGVycjtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImFzc2VydFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJidWZmZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb25zdGFudHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImRuc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJldmVudHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnMvcHJvbWlzZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiaHR0cFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJodHRwc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJuZXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZTphc3NlcnQvc3RyaWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlOmV2ZW50c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlOmZzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGU6cGF0aFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlOnByb2Nlc3NcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZTp0ZXN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm9zXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicHJvY2Vzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFkbGluZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzdHJlYW1cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidGxzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInR0eVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1cmxcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidXRpbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ6bGliXCIpOyIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYWxpZ24gPSB7XG4gICAgcmlnaHQ6IGFsaWduUmlnaHQsXG4gICAgY2VudGVyOiBhbGlnbkNlbnRlclxufTtcbmNvbnN0IHRvcCA9IDA7XG5jb25zdCByaWdodCA9IDE7XG5jb25zdCBib3R0b20gPSAyO1xuY29uc3QgbGVmdCA9IDM7XG5jbGFzcyBVSSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoO1xuICAgICAgICB0aGlzLndyYXAgPSAoX2EgPSBvcHRzLndyYXApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRydWU7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgIH1cbiAgICBzcGFuKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuZGl2KC4uLmFyZ3MpO1xuICAgICAgICBjb2xzLnNwYW4gPSB0cnVlO1xuICAgIH1cbiAgICByZXNldE91dHB1dCgpIHtcbiAgICAgICAgdGhpcy5yb3dzID0gW107XG4gICAgfVxuICAgIGRpdiguLi5hcmdzKSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXYoJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndyYXAgJiYgdGhpcy5zaG91bGRBcHBseUxheW91dERTTCguLi5hcmdzKSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5TGF5b3V0RFNMKGFyZ3NbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbHMgPSBhcmdzLm1hcChhcmcgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sRnJvbVN0cmluZyhhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucm93cy5wdXNoKGNvbHMpO1xuICAgICAgICByZXR1cm4gY29scztcbiAgICB9XG4gICAgc2hvdWxkQXBwbHlMYXlvdXREU0woLi4uYXJncykge1xuICAgICAgICByZXR1cm4gYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAvW1xcdFxcbl0vLnRlc3QoYXJnc1swXSk7XG4gICAgfVxuICAgIGFwcGx5TGF5b3V0RFNMKHN0cikge1xuICAgICAgICBjb25zdCByb3dzID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAocm93ID0+IHJvdy5zcGxpdCgnXFx0JykpO1xuICAgICAgICBsZXQgbGVmdENvbHVtbldpZHRoID0gMDtcbiAgICAgICAgLy8gc2ltcGxlIGhldXJpc3RpYyBmb3IgbGF5b3V0LCBtYWtlIHN1cmUgdGhlXG4gICAgICAgIC8vIHNlY29uZCBjb2x1bW4gbGluZXMgdXAgYWxvbmcgdGhlIGxlZnQtaGFuZC5cbiAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZpcnN0IGNvbHVtbiB0byB0YWtlIHVwIG1vcmVcbiAgICAgICAgLy8gdGhhbiA1MCUgb2YgdGhlIHNjcmVlbi5cbiAgICAgICAgcm93cy5mb3JFYWNoKGNvbHVtbnMgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID4gMSAmJiBtaXhpbi5zdHJpbmdXaWR0aChjb2x1bW5zWzBdKSA+IGxlZnRDb2x1bW5XaWR0aCkge1xuICAgICAgICAgICAgICAgIGxlZnRDb2x1bW5XaWR0aCA9IE1hdGgubWluKE1hdGguZmxvb3IodGhpcy53aWR0aCAqIDAuNSksIG1peGluLnN0cmluZ1dpZHRoKGNvbHVtbnNbMF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGdlbmVyYXRlIGEgdGFibGU6XG4gICAgICAgIC8vICByZXBsYWNpbmcgJyAnIHdpdGggcGFkZGluZyBjYWxjdWxhdGlvbnMuXG4gICAgICAgIC8vICB1c2luZyB0aGUgYWxnb3JpdGhtaWNhbGx5IGdlbmVyYXRlZCB3aWR0aC5cbiAgICAgICAgcm93cy5mb3JFYWNoKGNvbHVtbnMgPT4ge1xuICAgICAgICAgICAgdGhpcy5kaXYoLi4uY29sdW1ucy5tYXAoKHIsIGkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiByLnRyaW0oKSxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogdGhpcy5tZWFzdXJlUGFkZGluZyhyKSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IChpID09PSAwICYmIGNvbHVtbnMubGVuZ3RoID4gMSkgPyBsZWZ0Q29sdW1uV2lkdGggOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93c1t0aGlzLnJvd3MubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIGNvbEZyb21TdHJpbmcodGV4dCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHBhZGRpbmc6IHRoaXMubWVhc3VyZVBhZGRpbmcodGV4dClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgbWVhc3VyZVBhZGRpbmcoc3RyKSB7XG4gICAgICAgIC8vIG1lYXN1cmUgcGFkZGluZyB3aXRob3V0IGFuc2kgZXNjYXBlIGNvZGVzXG4gICAgICAgIGNvbnN0IG5vQW5zaSA9IG1peGluLnN0cmlwQW5zaShzdHIpO1xuICAgICAgICByZXR1cm4gWzAsIG5vQW5zaS5tYXRjaCgvXFxzKiQvKVswXS5sZW5ndGgsIDAsIG5vQW5zaS5tYXRjaCgvXlxccyovKVswXS5sZW5ndGhdO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICAgICAgdGhpcy5yb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICAgIHRoaXMucm93VG9TdHJpbmcocm93LCBsaW5lcyk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBkb24ndCBkaXNwbGF5IGFueSBsaW5lcyB3aXRoIHRoZVxuICAgICAgICAvLyBoaWRkZW4gZmxhZyBzZXQuXG4gICAgICAgIHJldHVybiBsaW5lc1xuICAgICAgICAgICAgLmZpbHRlcihsaW5lID0+ICFsaW5lLmhpZGRlbilcbiAgICAgICAgICAgIC5tYXAobGluZSA9PiBsaW5lLnRleHQpXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuICAgIHJvd1RvU3RyaW5nKHJvdywgbGluZXMpIHtcbiAgICAgICAgdGhpcy5yYXN0ZXJpemUocm93KS5mb3JFYWNoKChycm93LCByKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RyID0gJyc7XG4gICAgICAgICAgICBycm93LmZvckVhY2goKGNvbCwgYykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGggfSA9IHJvd1tjXTsgLy8gdGhlIHdpZHRoIHdpdGggcGFkZGluZy5cbiAgICAgICAgICAgICAgICBjb25zdCB3cmFwV2lkdGggPSB0aGlzLm5lZ2F0ZVBhZGRpbmcocm93W2NdKTsgLy8gdGhlIHdpZHRoIHdpdGhvdXQgcGFkZGluZy5cbiAgICAgICAgICAgICAgICBsZXQgdHMgPSBjb2w7IC8vIHRlbXBvcmFyeSBzdHJpbmcgdXNlZCBkdXJpbmcgYWxpZ25tZW50L3BhZGRpbmcuXG4gICAgICAgICAgICAgICAgaWYgKHdyYXBXaWR0aCA+IG1peGluLnN0cmluZ1dpZHRoKGNvbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHMgKz0gJyAnLnJlcGVhdCh3cmFwV2lkdGggLSBtaXhpbi5zdHJpbmdXaWR0aChjb2wpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYWxpZ24gdGhlIHN0cmluZyB3aXRoaW4gaXRzIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBpZiAocm93W2NdLmFsaWduICYmIHJvd1tjXS5hbGlnbiAhPT0gJ2xlZnQnICYmIHRoaXMud3JhcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbiA9IGFsaWduW3Jvd1tjXS5hbGlnbl07XG4gICAgICAgICAgICAgICAgICAgIHRzID0gZm4odHMsIHdyYXBXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaXhpbi5zdHJpbmdXaWR0aCh0cykgPCB3cmFwV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRzICs9ICcgJy5yZXBlYXQoKHdpZHRoIHx8IDApIC0gbWl4aW4uc3RyaW5nV2lkdGgodHMpIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYXBwbHkgYm9yZGVyIGFuZCBwYWRkaW5nIHRvIHN0cmluZy5cbiAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gcm93W2NdLnBhZGRpbmcgfHwgWzAsIDAsIDAsIDBdO1xuICAgICAgICAgICAgICAgIGlmIChwYWRkaW5nW2xlZnRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSAnICcucmVwZWF0KHBhZGRpbmdbbGVmdF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHIgKz0gYWRkQm9yZGVyKHJvd1tjXSwgdHMsICd8ICcpO1xuICAgICAgICAgICAgICAgIHN0ciArPSB0cztcbiAgICAgICAgICAgICAgICBzdHIgKz0gYWRkQm9yZGVyKHJvd1tjXSwgdHMsICcgfCcpO1xuICAgICAgICAgICAgICAgIGlmIChwYWRkaW5nW3JpZ2h0XSkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnLnJlcGVhdChwYWRkaW5nW3JpZ2h0XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIHByaW9yIHJvdyBpcyBzcGFuLCB0cnkgdG8gcmVuZGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcm93IG9uIHRoZSBwcmlvciBsaW5lLlxuICAgICAgICAgICAgICAgIGlmIChyID09PSAwICYmIGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gdGhpcy5yZW5kZXJJbmxpbmUoc3RyLCBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAgICAgICAgICAgIGxpbmVzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRleHQ6IHN0ci5yZXBsYWNlKC8gKyQvLCAnJyksXG4gICAgICAgICAgICAgICAgc3Bhbjogcm93LnNwYW5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH1cbiAgICAvLyBpZiB0aGUgZnVsbCAnc291cmNlJyBjYW4gcmVuZGVyIGluXG4gICAgLy8gdGhlIHRhcmdldCBsaW5lLCBkbyBzby5cbiAgICByZW5kZXJJbmxpbmUoc291cmNlLCBwcmV2aW91c0xpbmUpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBzb3VyY2UubWF0Y2goL14gKi8pO1xuICAgICAgICBjb25zdCBsZWFkaW5nV2hpdGVzcGFjZSA9IG1hdGNoID8gbWF0Y2hbMF0ubGVuZ3RoIDogMDtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcHJldmlvdXNMaW5lLnRleHQ7XG4gICAgICAgIGNvbnN0IHRhcmdldFRleHRXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHRhcmdldC50cmltUmlnaHQoKSk7XG4gICAgICAgIGlmICghcHJldmlvdXNMaW5lLnNwYW4pIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgd2UncmUgbm90IGFwcGx5aW5nIHdyYXBwaW5nIGxvZ2ljLFxuICAgICAgICAvLyBqdXN0IGFsd2F5cyBhcHBlbmQgdG8gdGhlIHNwYW4uXG4gICAgICAgIGlmICghdGhpcy53cmFwKSB7XG4gICAgICAgICAgICBwcmV2aW91c0xpbmUuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQgKyBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlIDwgdGFyZ2V0VGV4dFdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzTGluZS5oaWRkZW4gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGFyZ2V0LnRyaW1SaWdodCgpICsgJyAnLnJlcGVhdChsZWFkaW5nV2hpdGVzcGFjZSAtIHRhcmdldFRleHRXaWR0aCkgKyBzb3VyY2UudHJpbUxlZnQoKTtcbiAgICB9XG4gICAgcmFzdGVyaXplKHJvdykge1xuICAgICAgICBjb25zdCBycm93cyA9IFtdO1xuICAgICAgICBjb25zdCB3aWR0aHMgPSB0aGlzLmNvbHVtbldpZHRocyhyb3cpO1xuICAgICAgICBsZXQgd3JhcHBlZDtcbiAgICAgICAgLy8gd29yZCB3cmFwIGFsbCBjb2x1bW5zLCBhbmQgY3JlYXRlXG4gICAgICAgIC8vIGEgZGF0YS1zdHJ1Y3R1cmUgdGhhdCBpcyBlYXN5IHRvIHJhc3Rlcml6ZS5cbiAgICAgICAgcm93LmZvckVhY2goKGNvbCwgYykgPT4ge1xuICAgICAgICAgICAgLy8gbGVhdmUgcm9vbSBmb3IgbGVmdCBhbmQgcmlnaHQgcGFkZGluZy5cbiAgICAgICAgICAgIGNvbC53aWR0aCA9IHdpZHRoc1tjXTtcbiAgICAgICAgICAgIGlmICh0aGlzLndyYXApIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkID0gbWl4aW4ud3JhcChjb2wudGV4dCwgdGhpcy5uZWdhdGVQYWRkaW5nKGNvbCksIHsgaGFyZDogdHJ1ZSB9KS5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkID0gY29sLnRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnVuc2hpZnQoJy4nICsgJy0nLnJlcGVhdCh0aGlzLm5lZ2F0ZVBhZGRpbmcoY29sKSArIDIpICsgJy4nKTtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnB1c2goXCInXCIgKyAnLScucmVwZWF0KHRoaXMubmVnYXRlUGFkZGluZyhjb2wpICsgMikgKyBcIidcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdG9wIGFuZCBib3R0b20gcGFkZGluZy5cbiAgICAgICAgICAgIGlmIChjb2wucGFkZGluZykge1xuICAgICAgICAgICAgICAgIHdyYXBwZWQudW5zaGlmdCguLi5uZXcgQXJyYXkoY29sLnBhZGRpbmdbdG9wXSB8fCAwKS5maWxsKCcnKSk7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC5wdXNoKC4uLm5ldyBBcnJheShjb2wucGFkZGluZ1tib3R0b21dIHx8IDApLmZpbGwoJycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdyYXBwZWQuZm9yRWFjaCgoc3RyLCByKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFycm93c1tyXSkge1xuICAgICAgICAgICAgICAgICAgICBycm93cy5wdXNoKFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcnJvdyA9IHJyb3dzW3JdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChycm93W2ldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJyb3cucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcnJvdy5wdXNoKHN0cik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBycm93cztcbiAgICB9XG4gICAgbmVnYXRlUGFkZGluZyhjb2wpIHtcbiAgICAgICAgbGV0IHdyYXBXaWR0aCA9IGNvbC53aWR0aCB8fCAwO1xuICAgICAgICBpZiAoY29sLnBhZGRpbmcpIHtcbiAgICAgICAgICAgIHdyYXBXaWR0aCAtPSAoY29sLnBhZGRpbmdbbGVmdF0gfHwgMCkgKyAoY29sLnBhZGRpbmdbcmlnaHRdIHx8IDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgICAgICB3cmFwV2lkdGggLT0gNDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JhcFdpZHRoO1xuICAgIH1cbiAgICBjb2x1bW5XaWR0aHMocm93KSB7XG4gICAgICAgIGlmICghdGhpcy53cmFwKSB7XG4gICAgICAgICAgICByZXR1cm4gcm93Lm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2wud2lkdGggfHwgbWl4aW4uc3RyaW5nV2lkdGgoY29sLnRleHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVuc2V0ID0gcm93Lmxlbmd0aDtcbiAgICAgICAgbGV0IHJlbWFpbmluZ1dpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgLy8gY29sdW1uIHdpZHRocyBjYW4gYmUgc2V0IGluIGNvbmZpZy5cbiAgICAgICAgY29uc3Qgd2lkdGhzID0gcm93Lm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC53aWR0aCkge1xuICAgICAgICAgICAgICAgIHVuc2V0LS07XG4gICAgICAgICAgICAgICAgcmVtYWluaW5nV2lkdGggLT0gY29sLndpZHRoO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2wud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gYW55IHVuc2V0IHdpZHRocyBzaG91bGQgYmUgY2FsY3VsYXRlZC5cbiAgICAgICAgY29uc3QgdW5zZXRXaWR0aCA9IHVuc2V0ID8gTWF0aC5mbG9vcihyZW1haW5pbmdXaWR0aCAvIHVuc2V0KSA6IDA7XG4gICAgICAgIHJldHVybiB3aWR0aHMubWFwKCh3LCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAodyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHVuc2V0V2lkdGgsIF9taW5XaWR0aChyb3dbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3O1xuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRCb3JkZXIoY29sLCB0cywgc3R5bGUpIHtcbiAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICBpZiAoL1suJ10tK1suJ10vLnRlc3QodHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRzLnRyaW0oKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyAgJztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuLy8gY2FsY3VsYXRlcyB0aGUgbWluaW11bSB3aWR0aCBvZlxuLy8gYSBjb2x1bW4sIGJhc2VkIG9uIHBhZGRpbmcgcHJlZmVyZW5jZXMuXG5mdW5jdGlvbiBfbWluV2lkdGgoY29sKSB7XG4gICAgY29uc3QgcGFkZGluZyA9IGNvbC5wYWRkaW5nIHx8IFtdO1xuICAgIGNvbnN0IG1pbldpZHRoID0gMSArIChwYWRkaW5nW2xlZnRdIHx8IDApICsgKHBhZGRpbmdbcmlnaHRdIHx8IDApO1xuICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgIHJldHVybiBtaW5XaWR0aCArIDQ7XG4gICAgfVxuICAgIHJldHVybiBtaW5XaWR0aDtcbn1cbmZ1bmN0aW9uIGdldFdpbmRvd1dpZHRoKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkZXBlbmRzIG9uIHRlcm1pbmFsICovXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnN0ZG91dCAmJiBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zO1xuICAgIH1cbiAgICByZXR1cm4gODA7XG59XG5mdW5jdGlvbiBhbGlnblJpZ2h0KHN0ciwgd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgIGNvbnN0IHN0cldpZHRoID0gbWl4aW4uc3RyaW5nV2lkdGgoc3RyKTtcbiAgICBpZiAoc3RyV2lkdGggPCB3aWR0aCkge1xuICAgICAgICByZXR1cm4gJyAnLnJlcGVhdCh3aWR0aCAtIHN0cldpZHRoKSArIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cbmZ1bmN0aW9uIGFsaWduQ2VudGVyKHN0ciwgd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgIGNvbnN0IHN0cldpZHRoID0gbWl4aW4uc3RyaW5nV2lkdGgoc3RyKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChzdHJXaWR0aCA+PSB3aWR0aCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICByZXR1cm4gJyAnLnJlcGVhdCgod2lkdGggLSBzdHJXaWR0aCkgPj4gMSkgKyBzdHI7XG59XG5sZXQgbWl4aW47XG5mdW5jdGlvbiBjbGl1aShvcHRzLCBfbWl4aW4pIHtcbiAgICBtaXhpbiA9IF9taXhpbjtcbiAgICByZXR1cm4gbmV3IFVJKHtcbiAgICAgICAgd2lkdGg6IChvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMud2lkdGgpIHx8IGdldFdpbmRvd1dpZHRoKCksXG4gICAgICAgIHdyYXA6IG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy53cmFwXG4gICAgfSk7XG59XG5cbi8vIEJvb3RzdHJhcCBjbGl1aSB3aXRoIENvbW1vbkpTIGRlcGVuZGVuY2llczpcbmNvbnN0IHN0cmluZ1dpZHRoID0gcmVxdWlyZSgnc3RyaW5nLXdpZHRoJyk7XG5jb25zdCBzdHJpcEFuc2kgPSByZXF1aXJlKCdzdHJpcC1hbnNpJyk7XG5jb25zdCB3cmFwID0gcmVxdWlyZSgnd3JhcC1hbnNpJyk7XG5mdW5jdGlvbiB1aShvcHRzKSB7XG4gICAgcmV0dXJuIGNsaXVpKG9wdHMsIHtcbiAgICAgICAgc3RyaW5nV2lkdGgsXG4gICAgICAgIHN0cmlwQW5zaSxcbiAgICAgICAgd3JhcFxuICAgIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVpO1xuIiwiY29uc3QgeyBBcmd1bWVudCB9ID0gcmVxdWlyZSgnLi9saWIvYXJndW1lbnQuanMnKTtcbmNvbnN0IHsgQ29tbWFuZCB9ID0gcmVxdWlyZSgnLi9saWIvY29tbWFuZC5qcycpO1xuY29uc3QgeyBDb21tYW5kZXJFcnJvciwgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vbGliL2Vycm9yLmpzJyk7XG5jb25zdCB7IEhlbHAgfSA9IHJlcXVpcmUoJy4vbGliL2hlbHAuanMnKTtcbmNvbnN0IHsgT3B0aW9uIH0gPSByZXF1aXJlKCcuL2xpYi9vcHRpb24uanMnKTtcblxuZXhwb3J0cy5wcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxuZXhwb3J0cy5jcmVhdGVDb21tYW5kID0gKG5hbWUpID0+IG5ldyBDb21tYW5kKG5hbWUpO1xuZXhwb3J0cy5jcmVhdGVPcHRpb24gPSAoZmxhZ3MsIGRlc2NyaXB0aW9uKSA9PiBuZXcgT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG5leHBvcnRzLmNyZWF0ZUFyZ3VtZW50ID0gKG5hbWUsIGRlc2NyaXB0aW9uKSA9PiBuZXcgQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pO1xuXG4vKipcbiAqIEV4cG9zZSBjbGFzc2VzXG4gKi9cblxuZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDtcbmV4cG9ydHMuT3B0aW9uID0gT3B0aW9uO1xuZXhwb3J0cy5Bcmd1bWVudCA9IEFyZ3VtZW50O1xuZXhwb3J0cy5IZWxwID0gSGVscDtcblxuZXhwb3J0cy5Db21tYW5kZXJFcnJvciA9IENvbW1hbmRlckVycm9yO1xuZXhwb3J0cy5JbnZhbGlkQXJndW1lbnRFcnJvciA9IEludmFsaWRBcmd1bWVudEVycm9yO1xuZXhwb3J0cy5JbnZhbGlkT3B0aW9uQXJndW1lbnRFcnJvciA9IEludmFsaWRBcmd1bWVudEVycm9yOyAvLyBEZXByZWNhdGVkXG4iLCJjb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9yLmpzJyk7XG5cbmNsYXNzIEFyZ3VtZW50IHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgY29tbWFuZCBhcmd1bWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBkZXNjcmlwdGlvbi5cbiAgICogVGhlIGRlZmF1bHQgaXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgcmVxdWlyZWQsIGFuZCB5b3UgY2FuIGV4cGxpY2l0bHlcbiAgICogaW5kaWNhdGUgdGhpcyB3aXRoIDw+IGFyb3VuZCB0aGUgbmFtZS4gUHV0IFtdIGFyb3VuZCB0aGUgbmFtZSBmb3IgYW4gb3B0aW9uYWwgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uIHx8ICcnO1xuICAgIHRoaXMudmFyaWFkaWMgPSBmYWxzZTtcbiAgICB0aGlzLnBhcnNlQXJnID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdW5kZWZpbmVkO1xuXG4gICAgc3dpdGNoIChuYW1lWzBdKSB7XG4gICAgICBjYXNlICc8JzogLy8gZS5nLiA8cmVxdWlyZWQ+XG4gICAgICAgIHRoaXMucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZS5zbGljZSgxLCAtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnWyc6IC8vIGUuZy4gW29wdGlvbmFsXVxuICAgICAgICB0aGlzLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9uYW1lLmxlbmd0aCA+IDMgJiYgdGhpcy5fbmFtZS5zbGljZSgtMykgPT09ICcuLi4nKSB7XG4gICAgICB0aGlzLnZhcmlhZGljID0gdHJ1ZTtcbiAgICAgIHRoaXMuX25hbWUgPSB0aGlzLl9uYW1lLnNsaWNlKDAsIC0zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFyZ3VtZW50IG5hbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFja2FnZVxuICAgKi9cblxuICBfY29uY2F0VmFsdWUodmFsdWUsIHByZXZpb3VzKSB7XG4gICAgaWYgKHByZXZpb3VzID09PSB0aGlzLmRlZmF1bHRWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShwcmV2aW91cykpIHtcbiAgICAgIHJldHVybiBbdmFsdWVdO1xuICAgIH1cblxuICAgIHJldHVybiBwcmV2aW91cy5jb25jYXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSwgYW5kIG9wdGlvbmFsbHkgc3VwcGx5IHRoZSBkZXNjcmlwdGlvbiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGRlZmF1bHQodmFsdWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjdXN0b20gaGFuZGxlciBmb3IgcHJvY2Vzc2luZyBDTEkgY29tbWFuZCBhcmd1bWVudHMgaW50byBhcmd1bWVudCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGFyZ1BhcnNlcihmbikge1xuICAgIHRoaXMucGFyc2VBcmcgPSBmbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IGFsbG93IGFyZ3VtZW50IHZhbHVlIHRvIGJlIG9uZSBvZiBjaG9pY2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB2YWx1ZXNcbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGNob2ljZXModmFsdWVzKSB7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdmFsdWVzLnNsaWNlKCk7XG4gICAgdGhpcy5wYXJzZUFyZyA9IChhcmcsIHByZXZpb3VzKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYXJnQ2hvaWNlcy5pbmNsdWRlcyhhcmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgICBgQWxsb3dlZCBjaG9pY2VzIGFyZSAke3RoaXMuYXJnQ2hvaWNlcy5qb2luKCcsICcpfS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmFyaWFkaWMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmNhdFZhbHVlKGFyZywgcHJldmlvdXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYXJndW1lbnQgcmVxdWlyZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBcmd1bWVudH1cbiAgICovXG4gIGFyZ1JlcXVpcmVkKCkge1xuICAgIHRoaXMucmVxdWlyZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYXJndW1lbnQgb3B0aW9uYWwuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBcmd1bWVudH1cbiAgICovXG4gIGFyZ09wdGlvbmFsKCkge1xuICAgIHRoaXMucmVxdWlyZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKipcbiAqIFRha2VzIGFuIGFyZ3VtZW50IGFuZCByZXR1cm5zIGl0cyBodW1hbiByZWFkYWJsZSBlcXVpdmFsZW50IGZvciBoZWxwIHVzYWdlLlxuICpcbiAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBodW1hblJlYWRhYmxlQXJnTmFtZShhcmcpIHtcbiAgY29uc3QgbmFtZU91dHB1dCA9IGFyZy5uYW1lKCkgKyAoYXJnLnZhcmlhZGljID09PSB0cnVlID8gJy4uLicgOiAnJyk7XG5cbiAgcmV0dXJuIGFyZy5yZXF1aXJlZCA/ICc8JyArIG5hbWVPdXRwdXQgKyAnPicgOiAnWycgKyBuYW1lT3V0cHV0ICsgJ10nO1xufVxuXG5leHBvcnRzLkFyZ3VtZW50ID0gQXJndW1lbnQ7XG5leHBvcnRzLmh1bWFuUmVhZGFibGVBcmdOYW1lID0gaHVtYW5SZWFkYWJsZUFyZ05hbWU7XG4iLCJjb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdub2RlOmV2ZW50cycpLkV2ZW50RW1pdHRlcjtcbmNvbnN0IGNoaWxkUHJvY2VzcyA9IHJlcXVpcmUoJ25vZGU6Y2hpbGRfcHJvY2VzcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ25vZGU6cGF0aCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdub2RlOmZzJyk7XG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgnbm9kZTpwcm9jZXNzJyk7XG5cbmNvbnN0IHsgQXJndW1lbnQsIGh1bWFuUmVhZGFibGVBcmdOYW1lIH0gPSByZXF1aXJlKCcuL2FyZ3VtZW50LmpzJyk7XG5jb25zdCB7IENvbW1hbmRlckVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9yLmpzJyk7XG5jb25zdCB7IEhlbHAgfSA9IHJlcXVpcmUoJy4vaGVscC5qcycpO1xuY29uc3QgeyBPcHRpb24sIER1YWxPcHRpb25zIH0gPSByZXF1aXJlKCcuL29wdGlvbi5qcycpO1xuY29uc3QgeyBzdWdnZXN0U2ltaWxhciB9ID0gcmVxdWlyZSgnLi9zdWdnZXN0U2ltaWxhcicpO1xuXG5jbGFzcyBDb21tYW5kIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgYENvbW1hbmRgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcigpO1xuICAgIC8qKiBAdHlwZSB7Q29tbWFuZFtdfSAqL1xuICAgIHRoaXMuY29tbWFuZHMgPSBbXTtcbiAgICAvKiogQHR5cGUge09wdGlvbltdfSAqL1xuICAgIHRoaXMub3B0aW9ucyA9IFtdO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9hbGxvd1Vua25vd25PcHRpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cyA9IHRydWU7XG4gICAgLyoqIEB0eXBlIHtBcmd1bWVudFtdfSAqL1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cyA9IFtdO1xuICAgIHRoaXMuX2FyZ3MgPSB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHM7IC8vIGRlcHJlY2F0ZWQgb2xkIG5hbWVcbiAgICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIHRoaXMuYXJncyA9IFtdOyAvLyBjbGkgYXJncyB3aXRoIG9wdGlvbnMgcmVtb3ZlZFxuICAgIHRoaXMucmF3QXJncyA9IFtdO1xuICAgIHRoaXMucHJvY2Vzc2VkQXJncyA9IFtdOyAvLyBsaWtlIC5hcmdzIGJ1dCBhZnRlciBjdXN0b20gcHJvY2Vzc2luZyBhbmQgY29sbGVjdGluZyB2YXJpYWRpY1xuICAgIHRoaXMuX3NjcmlwdFBhdGggPSBudWxsO1xuICAgIHRoaXMuX25hbWUgPSBuYW1lIHx8ICcnO1xuICAgIHRoaXMuX29wdGlvblZhbHVlcyA9IHt9O1xuICAgIHRoaXMuX29wdGlvblZhbHVlU291cmNlcyA9IHt9OyAvLyBkZWZhdWx0LCBlbnYsIGNsaSBldGNcbiAgICB0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMgPSBmYWxzZTtcbiAgICB0aGlzLl9hY3Rpb25IYW5kbGVyID0gbnVsbDtcbiAgICB0aGlzLl9leGVjdXRhYmxlSGFuZGxlciA9IGZhbHNlO1xuICAgIHRoaXMuX2V4ZWN1dGFibGVGaWxlID0gbnVsbDsgLy8gY3VzdG9tIG5hbWUgZm9yIGV4ZWN1dGFibGVcbiAgICB0aGlzLl9leGVjdXRhYmxlRGlyID0gbnVsbDsgLy8gY3VzdG9tIHNlYXJjaCBkaXJlY3RvcnkgZm9yIHN1YmNvbW1hbmRzXG4gICAgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gbnVsbDtcbiAgICB0aGlzLl9leGl0Q2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX2FsaWFzZXMgPSBbXTtcbiAgICB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gJyc7XG4gICAgdGhpcy5fc3VtbWFyeSA9ICcnO1xuICAgIHRoaXMuX2FyZ3NEZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDsgLy8gbGVnYWN5XG4gICAgdGhpcy5fZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgPSBmYWxzZTtcbiAgICB0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMgPSBmYWxzZTtcbiAgICB0aGlzLl9saWZlQ3ljbGVIb29rcyA9IHt9OyAvLyBhIGhhc2ggb2YgYXJyYXlzXG4gICAgLyoqIEB0eXBlIHsoYm9vbGVhbiB8IHN0cmluZyl9ICovXG4gICAgdGhpcy5fc2hvd0hlbHBBZnRlckVycm9yID0gZmFsc2U7XG4gICAgdGhpcy5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yID0gdHJ1ZTtcblxuICAgIC8vIHNlZSAuY29uZmlndXJlT3V0cHV0KCkgZm9yIGRvY3NcbiAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uID0ge1xuICAgICAgd3JpdGVPdXQ6IChzdHIpID0+IHByb2Nlc3Muc3Rkb3V0LndyaXRlKHN0ciksXG4gICAgICB3cml0ZUVycjogKHN0cikgPT4gcHJvY2Vzcy5zdGRlcnIud3JpdGUoc3RyKSxcbiAgICAgIGdldE91dEhlbHBXaWR0aDogKCkgPT5cbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQuaXNUVFkgPyBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zIDogdW5kZWZpbmVkLFxuICAgICAgZ2V0RXJySGVscFdpZHRoOiAoKSA9PlxuICAgICAgICBwcm9jZXNzLnN0ZGVyci5pc1RUWSA/IHByb2Nlc3Muc3RkZXJyLmNvbHVtbnMgOiB1bmRlZmluZWQsXG4gICAgICBvdXRwdXRFcnJvcjogKHN0ciwgd3JpdGUpID0+IHdyaXRlKHN0ciksXG4gICAgfTtcblxuICAgIHRoaXMuX2hpZGRlbiA9IGZhbHNlO1xuICAgIC8qKiBAdHlwZSB7KE9wdGlvbiB8IG51bGwgfCB1bmRlZmluZWQpfSAqL1xuICAgIHRoaXMuX2hlbHBPcHRpb24gPSB1bmRlZmluZWQ7IC8vIExhenkgY3JlYXRlZCBvbiBkZW1hbmQuIE1heSBiZSBudWxsIGlmIGhlbHAgb3B0aW9uIGlzIGRpc2FibGVkLlxuICAgIHRoaXMuX2FkZEltcGxpY2l0SGVscENvbW1hbmQgPSB1bmRlZmluZWQ7IC8vIHVuZGVjaWRlZCB3aGV0aGVyIHRydWUgb3IgZmFsc2UgeWV0LCBub3QgaW5oZXJpdGVkXG4gICAgLyoqIEB0eXBlIHtDb21tYW5kfSAqL1xuICAgIHRoaXMuX2hlbHBDb21tYW5kID0gdW5kZWZpbmVkOyAvLyBsYXp5IGluaXRpYWxpc2VkLCBpbmhlcml0ZWRcbiAgICB0aGlzLl9oZWxwQ29uZmlndXJhdGlvbiA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgc2V0dGluZ3MgdGhhdCBhcmUgdXNlZnVsIHRvIGhhdmUgaW4gY29tbW9uIGFjcm9zcyByb290IGNvbW1hbmQgYW5kIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiAoVXNlZCBpbnRlcm5hbGx5IHdoZW4gYWRkaW5nIGEgY29tbWFuZCB1c2luZyBgLmNvbW1hbmQoKWAgc28gc3ViY29tbWFuZHMgaW5oZXJpdCBwYXJlbnQgc2V0dGluZ3MuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IHNvdXJjZUNvbW1hbmRcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBjb3B5SW5oZXJpdGVkU2V0dGluZ3Moc291cmNlQ29tbWFuZCkge1xuICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24gPSBzb3VyY2VDb21tYW5kLl9vdXRwdXRDb25maWd1cmF0aW9uO1xuICAgIHRoaXMuX2hlbHBPcHRpb24gPSBzb3VyY2VDb21tYW5kLl9oZWxwT3B0aW9uO1xuICAgIHRoaXMuX2hlbHBDb21tYW5kID0gc291cmNlQ29tbWFuZC5faGVscENvbW1hbmQ7XG4gICAgdGhpcy5faGVscENvbmZpZ3VyYXRpb24gPSBzb3VyY2VDb21tYW5kLl9oZWxwQ29uZmlndXJhdGlvbjtcbiAgICB0aGlzLl9leGl0Q2FsbGJhY2sgPSBzb3VyY2VDb21tYW5kLl9leGl0Q2FsbGJhY2s7XG4gICAgdGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzID0gc291cmNlQ29tbWFuZC5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzO1xuICAgIHRoaXMuX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZSA9XG4gICAgICBzb3VyY2VDb21tYW5kLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWU7XG4gICAgdGhpcy5fYWxsb3dFeGNlc3NBcmd1bWVudHMgPSBzb3VyY2VDb21tYW5kLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cztcbiAgICB0aGlzLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucyA9IHNvdXJjZUNvbW1hbmQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zO1xuICAgIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9IHNvdXJjZUNvbW1hbmQuX3Nob3dIZWxwQWZ0ZXJFcnJvcjtcbiAgICB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IgPSBzb3VyY2VDb21tYW5kLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3I7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Q29tbWFuZFtdfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBmb3IgKGxldCBjb21tYW5kID0gdGhpczsgY29tbWFuZDsgY29tbWFuZCA9IGNvbW1hbmQucGFyZW50KSB7XG4gICAgICByZXN1bHQucHVzaChjb21tYW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgYSBjb21tYW5kLlxuICAgKlxuICAgKiBUaGVyZSBhcmUgdHdvIHN0eWxlcyBvZiBjb21tYW5kOiBwYXkgYXR0ZW50aW9uIHRvIHdoZXJlIHRvIHB1dCB0aGUgZGVzY3JpcHRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENvbW1hbmQgaW1wbGVtZW50ZWQgdXNpbmcgYWN0aW9uIGhhbmRsZXIgKGRlc2NyaXB0aW9uIGlzIHN1cHBsaWVkIHNlcGFyYXRlbHkgdG8gYC5jb21tYW5kYClcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5jb21tYW5kKCdjbG9uZSA8c291cmNlPiBbZGVzdGluYXRpb25dJylcbiAgICogICAuZGVzY3JpcHRpb24oJ2Nsb25lIGEgcmVwb3NpdG9yeSBpbnRvIGEgbmV3bHkgY3JlYXRlZCBkaXJlY3RvcnknKVxuICAgKiAgIC5hY3Rpb24oKHNvdXJjZSwgZGVzdGluYXRpb24pID0+IHtcbiAgICogICAgIGNvbnNvbGUubG9nKCdjbG9uZSBjb21tYW5kIGNhbGxlZCcpO1xuICAgKiAgIH0pO1xuICAgKlxuICAgKiAvLyBDb21tYW5kIGltcGxlbWVudGVkIHVzaW5nIHNlcGFyYXRlIGV4ZWN1dGFibGUgZmlsZSAoZGVzY3JpcHRpb24gaXMgc2Vjb25kIHBhcmFtZXRlciB0byBgLmNvbW1hbmRgKVxuICAgKiBwcm9ncmFtXG4gICAqICAgLmNvbW1hbmQoJ3N0YXJ0IDxzZXJ2aWNlPicsICdzdGFydCBuYW1lZCBzZXJ2aWNlJylcbiAgICogICAuY29tbWFuZCgnc3RvcCBbc2VydmljZV0nLCAnc3RvcCBuYW1lZCBzZXJ2aWNlLCBvciBhbGwgaWYgbm8gbmFtZSBzdXBwbGllZCcpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZUFuZEFyZ3MgLSBjb21tYW5kIG5hbWUgYW5kIGFyZ3VtZW50cywgYXJncyBhcmUgYDxyZXF1aXJlZD5gIG9yIGBbb3B0aW9uYWxdYCBhbmQgbGFzdCBtYXkgYWxzbyBiZSBgdmFyaWFkaWMuLi5gXG4gICAqIEBwYXJhbSB7KG9iamVjdCB8IHN0cmluZyl9IFthY3Rpb25PcHRzT3JFeGVjRGVzY10gLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKGZvciBhY3Rpb24pLCBvciBkZXNjcmlwdGlvbiAoZm9yIGV4ZWN1dGFibGUpXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbZXhlY09wdHNdIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIChmb3IgZXhlY3V0YWJsZSlcbiAgICogQHJldHVybiB7Q29tbWFuZH0gcmV0dXJucyBuZXcgY29tbWFuZCBmb3IgYWN0aW9uIGhhbmRsZXIsIG9yIGB0aGlzYCBmb3IgZXhlY3V0YWJsZSBjb21tYW5kXG4gICAqL1xuXG4gIGNvbW1hbmQobmFtZUFuZEFyZ3MsIGFjdGlvbk9wdHNPckV4ZWNEZXNjLCBleGVjT3B0cykge1xuICAgIGxldCBkZXNjID0gYWN0aW9uT3B0c09yRXhlY0Rlc2M7XG4gICAgbGV0IG9wdHMgPSBleGVjT3B0cztcbiAgICBpZiAodHlwZW9mIGRlc2MgPT09ICdvYmplY3QnICYmIGRlc2MgIT09IG51bGwpIHtcbiAgICAgIG9wdHMgPSBkZXNjO1xuICAgICAgZGVzYyA9IG51bGw7XG4gICAgfVxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIGNvbnN0IFssIG5hbWUsIGFyZ3NdID0gbmFtZUFuZEFyZ3MubWF0Y2goLyhbXiBdKykgKiguKikvKTtcblxuICAgIGNvbnN0IGNtZCA9IHRoaXMuY3JlYXRlQ29tbWFuZChuYW1lKTtcbiAgICBpZiAoZGVzYykge1xuICAgICAgY21kLmRlc2NyaXB0aW9uKGRlc2MpO1xuICAgICAgY21kLl9leGVjdXRhYmxlSGFuZGxlciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChvcHRzLmlzRGVmYXVsdCkgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gY21kLl9uYW1lO1xuICAgIGNtZC5faGlkZGVuID0gISEob3B0cy5ub0hlbHAgfHwgb3B0cy5oaWRkZW4pOyAvLyBub0hlbHAgaXMgZGVwcmVjYXRlZCBvbGQgbmFtZSBmb3IgaGlkZGVuXG4gICAgY21kLl9leGVjdXRhYmxlRmlsZSA9IG9wdHMuZXhlY3V0YWJsZUZpbGUgfHwgbnVsbDsgLy8gQ3VzdG9tIG5hbWUgZm9yIGV4ZWN1dGFibGUgZmlsZSwgc2V0IG1pc3NpbmcgdG8gbnVsbCB0byBtYXRjaCBjb25zdHJ1Y3RvclxuICAgIGlmIChhcmdzKSBjbWQuYXJndW1lbnRzKGFyZ3MpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29tbWFuZChjbWQpO1xuICAgIGNtZC5wYXJlbnQgPSB0aGlzO1xuICAgIGNtZC5jb3B5SW5oZXJpdGVkU2V0dGluZ3ModGhpcyk7XG5cbiAgICBpZiAoZGVzYykgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIGNtZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IHJvdXRpbmUgdG8gY3JlYXRlIGEgbmV3IHVuYXR0YWNoZWQgY29tbWFuZC5cbiAgICpcbiAgICogU2VlIC5jb21tYW5kKCkgZm9yIGNyZWF0aW5nIGFuIGF0dGFjaGVkIHN1YmNvbW1hbmQsIHdoaWNoIHVzZXMgdGhpcyByb3V0aW5lIHRvXG4gICAqIGNyZWF0ZSB0aGUgY29tbWFuZC4gWW91IGNhbiBvdmVycmlkZSBjcmVhdGVDb21tYW5kIHRvIGN1c3RvbWlzZSBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBuZXcgY29tbWFuZFxuICAgKi9cblxuICBjcmVhdGVDb21tYW5kKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IENvbW1hbmQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogWW91IGNhbiBjdXN0b21pc2UgdGhlIGhlbHAgd2l0aCBhIHN1YmNsYXNzIG9mIEhlbHAgYnkgb3ZlcnJpZGluZyBjcmVhdGVIZWxwLFxuICAgKiBvciBieSBvdmVycmlkaW5nIEhlbHAgcHJvcGVydGllcyB1c2luZyBjb25maWd1cmVIZWxwKCkuXG4gICAqXG4gICAqIEByZXR1cm4ge0hlbHB9XG4gICAqL1xuXG4gIGNyZWF0ZUhlbHAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEhlbHAoKSwgdGhpcy5jb25maWd1cmVIZWxwKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gY3VzdG9taXNlIHRoZSBoZWxwIGJ5IG92ZXJyaWRpbmcgSGVscCBwcm9wZXJ0aWVzIHVzaW5nIGNvbmZpZ3VyZUhlbHAoKSxcbiAgICogb3Igd2l0aCBhIHN1YmNsYXNzIG9mIEhlbHAgYnkgb3ZlcnJpZGluZyBjcmVhdGVIZWxwKCkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbY29uZmlndXJhdGlvbl0gLSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybiB7KENvbW1hbmQgfCBvYmplY3QpfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmcsIG9yIHN0b3JlZCBjb25maWd1cmF0aW9uXG4gICAqL1xuXG4gIGNvbmZpZ3VyZUhlbHAoY29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9oZWxwQ29uZmlndXJhdGlvbjtcblxuICAgIHRoaXMuX2hlbHBDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBvdXRwdXQgZ29lcyB0byBzdGRvdXQgYW5kIHN0ZGVyci4gWW91IGNhbiBjdXN0b21pc2UgdGhpcyBmb3Igc3BlY2lhbFxuICAgKiBhcHBsaWNhdGlvbnMuIFlvdSBjYW4gYWxzbyBjdXN0b21pc2UgdGhlIGRpc3BsYXkgb2YgZXJyb3JzIGJ5IG92ZXJyaWRpbmcgb3V0cHV0RXJyb3IuXG4gICAqXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgYXJlIGFsbCBmdW5jdGlvbnM6XG4gICAqXG4gICAqICAgICAvLyBmdW5jdGlvbnMgdG8gY2hhbmdlIHdoZXJlIGJlaW5nIHdyaXR0ZW4sIHN0ZG91dCBhbmQgc3RkZXJyXG4gICAqICAgICB3cml0ZU91dChzdHIpXG4gICAqICAgICB3cml0ZUVycihzdHIpXG4gICAqICAgICAvLyBtYXRjaGluZyBmdW5jdGlvbnMgdG8gc3BlY2lmeSB3aWR0aCBmb3Igd3JhcHBpbmcgaGVscFxuICAgKiAgICAgZ2V0T3V0SGVscFdpZHRoKClcbiAgICogICAgIGdldEVyckhlbHBXaWR0aCgpXG4gICAqICAgICAvLyBmdW5jdGlvbnMgYmFzZWQgb24gd2hhdCBpcyBiZWluZyB3cml0dGVuIG91dFxuICAgKiAgICAgb3V0cHV0RXJyb3Ioc3RyLCB3cml0ZSkgLy8gdXNlZCBmb3IgZGlzcGxheWluZyBlcnJvcnMsIGFuZCBub3QgdXNlZCBmb3IgZGlzcGxheWluZyBoZWxwXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbY29uZmlndXJhdGlvbl0gLSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybiB7KENvbW1hbmQgfCBvYmplY3QpfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmcsIG9yIHN0b3JlZCBjb25maWd1cmF0aW9uXG4gICAqL1xuXG4gIGNvbmZpZ3VyZU91dHB1dChjb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb247XG5cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgdGhlIGhlbHAgb3IgYSBjdXN0b20gbWVzc2FnZSBhZnRlciBhbiBlcnJvciBvY2N1cnMuXG4gICAqXG4gICAqIEBwYXJhbSB7KGJvb2xlYW58c3RyaW5nKX0gW2Rpc3BsYXlIZWxwXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHNob3dIZWxwQWZ0ZXJFcnJvcihkaXNwbGF5SGVscCA9IHRydWUpIHtcbiAgICBpZiAodHlwZW9mIGRpc3BsYXlIZWxwICE9PSAnc3RyaW5nJykgZGlzcGxheUhlbHAgPSAhIWRpc3BsYXlIZWxwO1xuICAgIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9IGRpc3BsYXlIZWxwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgc3VnZ2VzdGlvbiBvZiBzaW1pbGFyIGNvbW1hbmRzIGZvciB1bmtub3duIGNvbW1hbmRzLCBvciBvcHRpb25zIGZvciB1bmtub3duIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Rpc3BsYXlTdWdnZXN0aW9uXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHNob3dTdWdnZXN0aW9uQWZ0ZXJFcnJvcihkaXNwbGF5U3VnZ2VzdGlvbiA9IHRydWUpIHtcbiAgICB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IgPSAhIWRpc3BsYXlTdWdnZXN0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHByZXBhcmVkIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIFNlZSAuY29tbWFuZCgpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBzdWJjb21tYW5kIHdoaWNoIGluaGVyaXRzIHNldHRpbmdzIGZyb20gaXRzIHBhcmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWQgLSBuZXcgc3ViY29tbWFuZFxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdHNdIC0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBhZGRDb21tYW5kKGNtZCwgb3B0cykge1xuICAgIGlmICghY21kLl9uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbW1hbmQgcGFzc2VkIHRvIC5hZGRDb21tYW5kKCkgbXVzdCBoYXZlIGEgbmFtZVxuLSBzcGVjaWZ5IHRoZSBuYW1lIGluIENvbW1hbmQgY29uc3RydWN0b3Igb3IgdXNpbmcgLm5hbWUoKWApO1xuICAgIH1cblxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIGlmIChvcHRzLmlzRGVmYXVsdCkgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gY21kLl9uYW1lO1xuICAgIGlmIChvcHRzLm5vSGVscCB8fCBvcHRzLmhpZGRlbikgY21kLl9oaWRkZW4gPSB0cnVlOyAvLyBtb2RpZnlpbmcgcGFzc2VkIGNvbW1hbmQgZHVlIHRvIGV4aXN0aW5nIGltcGxlbWVudGF0aW9uXG5cbiAgICB0aGlzLl9yZWdpc3RlckNvbW1hbmQoY21kKTtcbiAgICBjbWQucGFyZW50ID0gdGhpcztcbiAgICBjbWQuX2NoZWNrRm9yQnJva2VuUGFzc1Rocm91Z2goKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3Rvcnkgcm91dGluZSB0byBjcmVhdGUgYSBuZXcgdW5hdHRhY2hlZCBhcmd1bWVudC5cbiAgICpcbiAgICogU2VlIC5hcmd1bWVudCgpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBhcmd1bWVudCwgd2hpY2ggdXNlcyB0aGlzIHJvdXRpbmUgdG9cbiAgICogY3JlYXRlIHRoZSBhcmd1bWVudC4gWW91IGNhbiBvdmVycmlkZSBjcmVhdGVBcmd1bWVudCB0byByZXR1cm4gYSBjdXN0b20gYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge0FyZ3VtZW50fSBuZXcgYXJndW1lbnRcbiAgICovXG5cbiAgY3JlYXRlQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pIHtcbiAgICByZXR1cm4gbmV3IEFyZ3VtZW50KG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgYXJndW1lbnQgc3ludGF4IGZvciBjb21tYW5kLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBpcyB0aGF0IHRoZSBhcmd1bWVudCBpcyByZXF1aXJlZCwgYW5kIHlvdSBjYW4gZXhwbGljaXRseVxuICAgKiBpbmRpY2F0ZSB0aGlzIHdpdGggPD4gYXJvdW5kIHRoZSBuYW1lLiBQdXQgW10gYXJvdW5kIHRoZSBuYW1lIGZvciBhbiBvcHRpb25hbCBhcmd1bWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5hcmd1bWVudCgnPGlucHV0LWZpbGU+Jyk7XG4gICAqIHByb2dyYW0uYXJndW1lbnQoJ1tvdXRwdXQtZmlsZV0nKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtIHsoRnVuY3Rpb258Kil9IFtmbl0gLSBjdXN0b20gYXJndW1lbnQgcHJvY2Vzc2luZyBmdW5jdGlvblxuICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24sIGZuLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCBhcmd1bWVudCA9IHRoaXMuY3JlYXRlQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFyZ3VtZW50LmRlZmF1bHQoZGVmYXVsdFZhbHVlKS5hcmdQYXJzZXIoZm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcmd1bWVudC5kZWZhdWx0KGZuKTtcbiAgICB9XG4gICAgdGhpcy5hZGRBcmd1bWVudChhcmd1bWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGFyZ3VtZW50IHN5bnRheCBmb3IgY29tbWFuZCwgYWRkaW5nIG11bHRpcGxlIGF0IG9uY2UgKHdpdGhvdXQgZGVzY3JpcHRpb25zKS5cbiAgICpcbiAgICogU2VlIGFsc28gLmFyZ3VtZW50KCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uYXJndW1lbnRzKCc8Y21kPiBbZW52XScpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGFyZ3VtZW50cyhuYW1lcykge1xuICAgIG5hbWVzXG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoLyArLylcbiAgICAgIC5mb3JFYWNoKChkZXRhaWwpID0+IHtcbiAgICAgICAgdGhpcy5hcmd1bWVudChkZXRhaWwpO1xuICAgICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGFyZ3VtZW50IHN5bnRheCBmb3IgY29tbWFuZCwgYWRkaW5nIGEgcHJlcGFyZWQgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkQXJndW1lbnQoYXJndW1lbnQpIHtcbiAgICBjb25zdCBwcmV2aW91c0FyZ3VtZW50ID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLnNsaWNlKC0xKVswXTtcbiAgICBpZiAocHJldmlvdXNBcmd1bWVudCAmJiBwcmV2aW91c0FyZ3VtZW50LnZhcmlhZGljKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBvbmx5IHRoZSBsYXN0IGFyZ3VtZW50IGNhbiBiZSB2YXJpYWRpYyAnJHtwcmV2aW91c0FyZ3VtZW50Lm5hbWUoKX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGFyZ3VtZW50LnJlcXVpcmVkICYmXG4gICAgICBhcmd1bWVudC5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgYXJndW1lbnQucGFyc2VBcmcgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYSBkZWZhdWx0IHZhbHVlIGZvciBhIHJlcXVpcmVkIGFyZ3VtZW50IGlzIG5ldmVyIHVzZWQ6ICcke2FyZ3VtZW50Lm5hbWUoKX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5wdXNoKGFyZ3VtZW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b21pc2Ugb3Igb3ZlcnJpZGUgZGVmYXVsdCBoZWxwIGNvbW1hbmQuIEJ5IGRlZmF1bHQgYSBoZWxwIGNvbW1hbmQgaXMgYXV0b21hdGljYWxseSBhZGRlZCBpZiB5b3VyIGNvbW1hbmQgaGFzIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKCdoZWxwIFtjbWRdJyk7XG4gICAqICAgIHByb2dyYW0uaGVscENvbW1hbmQoJ2hlbHAgW2NtZF0nLCAnc2hvdyBoZWxwJyk7XG4gICAqICAgIHByb2dyYW0uaGVscENvbW1hbmQoZmFsc2UpOyAvLyBzdXBwcmVzcyBkZWZhdWx0IGhlbHAgY29tbWFuZFxuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKHRydWUpOyAvLyBhZGQgaGVscCBjb21tYW5kIGV2ZW4gaWYgbm8gc3ViY29tbWFuZHNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8Ym9vbGVhbn0gZW5hYmxlT3JOYW1lQW5kQXJncyAtIGVuYWJsZSB3aXRoIGN1c3RvbSBuYW1lIGFuZC9vciBhcmd1bWVudHMsIG9yIGJvb2xlYW4gdG8gb3ZlcnJpZGUgd2hldGhlciBhZGRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXSAtIGN1c3RvbSBkZXNjcmlwdGlvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaGVscENvbW1hbmQoZW5hYmxlT3JOYW1lQW5kQXJncywgZGVzY3JpcHRpb24pIHtcbiAgICBpZiAodHlwZW9mIGVuYWJsZU9yTmFtZUFuZEFyZ3MgPT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IGVuYWJsZU9yTmFtZUFuZEFyZ3M7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBlbmFibGVPck5hbWVBbmRBcmdzID0gZW5hYmxlT3JOYW1lQW5kQXJncyA/PyAnaGVscCBbY29tbWFuZF0nO1xuICAgIGNvbnN0IFssIGhlbHBOYW1lLCBoZWxwQXJnc10gPSBlbmFibGVPck5hbWVBbmRBcmdzLm1hdGNoKC8oW14gXSspICooLiopLyk7XG4gICAgY29uc3QgaGVscERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPz8gJ2Rpc3BsYXkgaGVscCBmb3IgY29tbWFuZCc7XG5cbiAgICBjb25zdCBoZWxwQ29tbWFuZCA9IHRoaXMuY3JlYXRlQ29tbWFuZChoZWxwTmFtZSk7XG4gICAgaGVscENvbW1hbmQuaGVscE9wdGlvbihmYWxzZSk7XG4gICAgaWYgKGhlbHBBcmdzKSBoZWxwQ29tbWFuZC5hcmd1bWVudHMoaGVscEFyZ3MpO1xuICAgIGlmIChoZWxwRGVzY3JpcHRpb24pIGhlbHBDb21tYW5kLmRlc2NyaXB0aW9uKGhlbHBEZXNjcmlwdGlvbik7XG5cbiAgICB0aGlzLl9hZGRJbXBsaWNpdEhlbHBDb21tYW5kID0gdHJ1ZTtcbiAgICB0aGlzLl9oZWxwQ29tbWFuZCA9IGhlbHBDb21tYW5kO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHByZXBhcmVkIGN1c3RvbSBoZWxwIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7KENvbW1hbmR8c3RyaW5nfGJvb2xlYW4pfSBoZWxwQ29tbWFuZCAtIGN1c3RvbSBoZWxwIGNvbW1hbmQsIG9yIGRlcHJlY2F0ZWQgZW5hYmxlT3JOYW1lQW5kQXJncyBhcyBmb3IgYC5oZWxwQ29tbWFuZCgpYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RlcHJlY2F0ZWREZXNjcmlwdGlvbl0gLSBkZXByZWNhdGVkIGN1c3RvbSBkZXNjcmlwdGlvbiB1c2VkIHdpdGggY3VzdG9tIG5hbWUgb25seVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEhlbHBDb21tYW5kKGhlbHBDb21tYW5kLCBkZXByZWNhdGVkRGVzY3JpcHRpb24pIHtcbiAgICAvLyBJZiBub3QgcGFzc2VkIGFuIG9iamVjdCwgY2FsbCB0aHJvdWdoIHRvIGhlbHBDb21tYW5kIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSxcbiAgICAvLyBhcyBhZGRIZWxwQ29tbWFuZCB3YXMgb3JpZ2luYWxseSB1c2VkIGxpa2UgaGVscENvbW1hbmQgaXMgbm93LlxuICAgIGlmICh0eXBlb2YgaGVscENvbW1hbmQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmhlbHBDb21tYW5kKGhlbHBDb21tYW5kLCBkZXByZWNhdGVkRGVzY3JpcHRpb24pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IHRydWU7XG4gICAgdGhpcy5faGVscENvbW1hbmQgPSBoZWxwQ29tbWFuZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXp5IGNyZWF0ZSBoZWxwIGNvbW1hbmQuXG4gICAqXG4gICAqIEByZXR1cm4geyhDb21tYW5kfG51bGwpfVxuICAgKiBAcGFja2FnZVxuICAgKi9cbiAgX2dldEhlbHBDb21tYW5kKCkge1xuICAgIGNvbnN0IGhhc0ltcGxpY2l0SGVscENvbW1hbmQgPVxuICAgICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA/P1xuICAgICAgKHRoaXMuY29tbWFuZHMubGVuZ3RoICYmXG4gICAgICAgICF0aGlzLl9hY3Rpb25IYW5kbGVyICYmXG4gICAgICAgICF0aGlzLl9maW5kQ29tbWFuZCgnaGVscCcpKTtcblxuICAgIGlmIChoYXNJbXBsaWNpdEhlbHBDb21tYW5kKSB7XG4gICAgICBpZiAodGhpcy5faGVscENvbW1hbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmhlbHBDb21tYW5kKHVuZGVmaW5lZCwgdW5kZWZpbmVkKTsgLy8gdXNlIGRlZmF1bHQgbmFtZSBhbmQgZGVzY3JpcHRpb25cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9oZWxwQ29tbWFuZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGhvb2sgZm9yIGxpZmUgY3ljbGUgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaG9vayhldmVudCwgbGlzdGVuZXIpIHtcbiAgICBjb25zdCBhbGxvd2VkVmFsdWVzID0gWydwcmVTdWJjb21tYW5kJywgJ3ByZUFjdGlvbicsICdwb3N0QWN0aW9uJ107XG4gICAgaWYgKCFhbGxvd2VkVmFsdWVzLmluY2x1ZGVzKGV2ZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciBldmVudCBwYXNzZWQgdG8gaG9vayA6ICcke2V2ZW50fScuXG5FeHBlY3Rpbmcgb25lIG9mICcke2FsbG93ZWRWYWx1ZXMuam9pbihcIicsICdcIil9J2ApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdKSB7XG4gICAgICB0aGlzLl9saWZlQ3ljbGVIb29rc1tldmVudF0ucHVzaChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XSA9IFtsaXN0ZW5lcl07XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGNhbGxiYWNrIHRvIHVzZSBhcyByZXBsYWNlbWVudCBmb3IgY2FsbGluZyBwcm9jZXNzLmV4aXQuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl0gb3B0aW9uYWwgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBwYXNzZWQgYSBDb21tYW5kZXJFcnJvciwgZGVmYXVsdHMgdG8gdGhyb3dpbmdcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGV4aXRPdmVycmlkZShmbikge1xuICAgIGlmIChmbikge1xuICAgICAgdGhpcy5fZXhpdENhbGxiYWNrID0gZm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2V4aXRDYWxsYmFjayA9IChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnKSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFzeW5jIGNhbGxiYWNrIGZyb20gc3Bhd24gZXZlbnRzLCBub3QgdXNlZnVsIHRvIHRocm93LlxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHByb2Nlc3MuZXhpdCwgYW5kIF9leGl0Q2FsbGJhY2sgaWYgZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGV4aXRDb2RlIGV4aXQgY29kZSBmb3IgdXNpbmcgd2l0aCBwcm9jZXNzLmV4aXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgYW4gaWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yXG4gICAqIEByZXR1cm4gbmV2ZXJcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2V4aXQoZXhpdENvZGUsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5fZXhpdENhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9leGl0Q2FsbGJhY2sobmV3IENvbW1hbmRlckVycm9yKGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKSk7XG4gICAgICAvLyBFeHBlY3RpbmcgdGhpcyBsaW5lIGlzIG5vdCByZWFjaGVkLlxuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGNhbGxiYWNrIGBmbmAgZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtXG4gICAqICAgLmNvbW1hbmQoJ3NlcnZlJylcbiAgICogICAuZGVzY3JpcHRpb24oJ3N0YXJ0IHNlcnZpY2UnKVxuICAgKiAgIC5hY3Rpb24oZnVuY3Rpb24oKSB7XG4gICAqICAgICAgLy8gZG8gd29yayBoZXJlXG4gICAqICAgfSk7XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBhY3Rpb24oZm4pIHtcbiAgICBjb25zdCBsaXN0ZW5lciA9IChhcmdzKSA9PiB7XG4gICAgICAvLyBUaGUgLmFjdGlvbiBjYWxsYmFjayB0YWtlcyBhbiBleHRyYSBwYXJhbWV0ZXIgd2hpY2ggaXMgdGhlIGNvbW1hbmQgb3Igb3B0aW9ucy5cbiAgICAgIGNvbnN0IGV4cGVjdGVkQXJnc0NvdW50ID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGNvbnN0IGFjdGlvbkFyZ3MgPSBhcmdzLnNsaWNlKDAsIGV4cGVjdGVkQXJnc0NvdW50KTtcbiAgICAgIGlmICh0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgYWN0aW9uQXJnc1tleHBlY3RlZEFyZ3NDb3VudF0gPSB0aGlzOyAvLyBiYWNrd2FyZHMgY29tcGF0aWJsZSBcIm9wdGlvbnNcIlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aW9uQXJnc1tleHBlY3RlZEFyZ3NDb3VudF0gPSB0aGlzLm9wdHMoKTtcbiAgICAgIH1cbiAgICAgIGFjdGlvbkFyZ3MucHVzaCh0aGlzKTtcblxuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFjdGlvbkFyZ3MpO1xuICAgIH07XG4gICAgdGhpcy5fYWN0aW9uSGFuZGxlciA9IGxpc3RlbmVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3Rvcnkgcm91dGluZSB0byBjcmVhdGUgYSBuZXcgdW5hdHRhY2hlZCBvcHRpb24uXG4gICAqXG4gICAqIFNlZSAub3B0aW9uKCkgZm9yIGNyZWF0aW5nIGFuIGF0dGFjaGVkIG9wdGlvbiwgd2hpY2ggdXNlcyB0aGlzIHJvdXRpbmUgdG9cbiAgICogY3JlYXRlIHRoZSBvcHRpb24uIFlvdSBjYW4gb3ZlcnJpZGUgY3JlYXRlT3B0aW9uIHRvIHJldHVybiBhIGN1c3RvbSBvcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtPcHRpb259IG5ldyBvcHRpb25cbiAgICovXG5cbiAgY3JlYXRlT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiBuZXcgT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCBwYXJzZUFyZ3MgdG8gY2F0Y2ggJ2NvbW1hbmRlci5pbnZhbGlkQXJndW1lbnQnLlxuICAgKlxuICAgKiBAcGFyYW0geyhPcHRpb24gfCBBcmd1bWVudCl9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHsqfSBwcmV2aW91c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gaW52YWxpZEFyZ3VtZW50TWVzc2FnZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2FsbFBhcnNlQXJnKHRhcmdldCwgdmFsdWUsIHByZXZpb3VzLCBpbnZhbGlkQXJndW1lbnRNZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0YXJnZXQucGFyc2VBcmcodmFsdWUsIHByZXZpb3VzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ2NvbW1hbmRlci5pbnZhbGlkQXJndW1lbnQnKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgJHtpbnZhbGlkQXJndW1lbnRNZXNzYWdlfSAke2Vyci5tZXNzYWdlfWA7XG4gICAgICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBleGl0Q29kZTogZXJyLmV4aXRDb2RlLCBjb2RlOiBlcnIuY29kZSB9KTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIG9wdGlvbiBmbGFnIGNvbmZsaWN0cy5cbiAgICogUmVnaXN0ZXIgb3B0aW9uIGlmIG5vIGNvbmZsaWN0cyBmb3VuZCwgb3IgdGhyb3cgb24gY29uZmxpY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX3JlZ2lzdGVyT3B0aW9uKG9wdGlvbikge1xuICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID1cbiAgICAgIChvcHRpb24uc2hvcnQgJiYgdGhpcy5fZmluZE9wdGlvbihvcHRpb24uc2hvcnQpKSB8fFxuICAgICAgKG9wdGlvbi5sb25nICYmIHRoaXMuX2ZpbmRPcHRpb24ob3B0aW9uLmxvbmcpKTtcbiAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRmxhZyA9XG4gICAgICAgIG9wdGlvbi5sb25nICYmIHRoaXMuX2ZpbmRPcHRpb24ob3B0aW9uLmxvbmcpXG4gICAgICAgICAgPyBvcHRpb24ubG9uZ1xuICAgICAgICAgIDogb3B0aW9uLnNob3J0O1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYWRkIG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyR7dGhpcy5fbmFtZSAmJiBgIHRvIGNvbW1hbmQgJyR7dGhpcy5fbmFtZX0nYH0gZHVlIHRvIGNvbmZsaWN0aW5nIGZsYWcgJyR7bWF0Y2hpbmdGbGFnfSdcbi0gIGFscmVhZHkgdXNlZCBieSBvcHRpb24gJyR7bWF0Y2hpbmdPcHRpb24uZmxhZ3N9J2ApO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIGNvbW1hbmQgbmFtZSBhbmQgYWxpYXMgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgY29tbWFuZHMuXG4gICAqIFJlZ2lzdGVyIGNvbW1hbmQgaWYgbm8gY29uZmxpY3RzIGZvdW5kLCBvciB0aHJvdyBvbiBjb25mbGljdC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjb21tYW5kXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9yZWdpc3RlckNvbW1hbmQoY29tbWFuZCkge1xuICAgIGNvbnN0IGtub3duQnkgPSAoY21kKSA9PiB7XG4gICAgICByZXR1cm4gW2NtZC5uYW1lKCldLmNvbmNhdChjbWQuYWxpYXNlcygpKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYWxyZWFkeVVzZWQgPSBrbm93bkJ5KGNvbW1hbmQpLmZpbmQoKG5hbWUpID0+XG4gICAgICB0aGlzLl9maW5kQ29tbWFuZChuYW1lKSxcbiAgICApO1xuICAgIGlmIChhbHJlYWR5VXNlZCkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDbWQgPSBrbm93bkJ5KHRoaXMuX2ZpbmRDb21tYW5kKGFscmVhZHlVc2VkKSkuam9pbignfCcpO1xuICAgICAgY29uc3QgbmV3Q21kID0ga25vd25CeShjb21tYW5kKS5qb2luKCd8Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYW5ub3QgYWRkIGNvbW1hbmQgJyR7bmV3Q21kfScgYXMgYWxyZWFkeSBoYXZlIGNvbW1hbmQgJyR7ZXhpc3RpbmdDbWR9J2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY29tbWFuZHMucHVzaChjb21tYW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkT3B0aW9uKG9wdGlvbikge1xuICAgIHRoaXMuX3JlZ2lzdGVyT3B0aW9uKG9wdGlvbik7XG5cbiAgICBjb25zdCBvbmFtZSA9IG9wdGlvbi5uYW1lKCk7XG4gICAgY29uc3QgbmFtZSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG5cbiAgICAvLyBzdG9yZSBkZWZhdWx0IHZhbHVlXG4gICAgaWYgKG9wdGlvbi5uZWdhdGUpIHtcbiAgICAgIC8vIC0tbm8tZm9vIGlzIHNwZWNpYWwgYW5kIGRlZmF1bHRzIGZvbyB0byB0cnVlLCB1bmxlc3MgYSAtLWZvbyBvcHRpb24gaXMgYWxyZWFkeSBkZWZpbmVkXG4gICAgICBjb25zdCBwb3NpdGl2ZUxvbmdGbGFnID0gb3B0aW9uLmxvbmcucmVwbGFjZSgvXi0tbm8tLywgJy0tJyk7XG4gICAgICBpZiAoIXRoaXMuX2ZpbmRPcHRpb24ocG9zaXRpdmVMb25nRmxhZykpIHtcbiAgICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBvcHRpb24uZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQgPyB0cnVlIDogb3B0aW9uLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAnZGVmYXVsdCcsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb24uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKG5hbWUsIG9wdGlvbi5kZWZhdWx0VmFsdWUsICdkZWZhdWx0Jyk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlciBmb3IgY2xpIGFuZCBlbnYgc3VwcGxpZWQgdmFsdWVzXG4gICAgY29uc3QgaGFuZGxlT3B0aW9uVmFsdWUgPSAodmFsLCBpbnZhbGlkVmFsdWVNZXNzYWdlLCB2YWx1ZVNvdXJjZSkgPT4ge1xuICAgICAgLy8gdmFsIGlzIG51bGwgZm9yIG9wdGlvbmFsIG9wdGlvbiB1c2VkIHdpdGhvdXQgYW4gb3B0aW9uYWwtYXJndW1lbnQuXG4gICAgICAvLyB2YWwgaXMgdW5kZWZpbmVkIGZvciBib29sZWFuIGFuZCBuZWdhdGVkIG9wdGlvbi5cbiAgICAgIGlmICh2YWwgPT0gbnVsbCAmJiBvcHRpb24ucHJlc2V0QXJnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsID0gb3B0aW9uLnByZXNldEFyZztcbiAgICAgIH1cblxuICAgICAgLy8gY3VzdG9tIHByb2Nlc3NpbmdcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5nZXRPcHRpb25WYWx1ZShuYW1lKTtcbiAgICAgIGlmICh2YWwgIT09IG51bGwgJiYgb3B0aW9uLnBhcnNlQXJnKSB7XG4gICAgICAgIHZhbCA9IHRoaXMuX2NhbGxQYXJzZUFyZyhvcHRpb24sIHZhbCwgb2xkVmFsdWUsIGludmFsaWRWYWx1ZU1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmICh2YWwgIT09IG51bGwgJiYgb3B0aW9uLnZhcmlhZGljKSB7XG4gICAgICAgIHZhbCA9IG9wdGlvbi5fY29uY2F0VmFsdWUodmFsLCBvbGRWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbGwtaW4gYXBwcm9wcmlhdGUgbWlzc2luZyB2YWx1ZXMuIExvbmcgd2luZGVkIGJ1dCBlYXN5IHRvIGZvbGxvdy5cbiAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICBpZiAob3B0aW9uLm5lZ2F0ZSkge1xuICAgICAgICAgIHZhbCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5pc0Jvb2xlYW4oKSB8fCBvcHRpb24ub3B0aW9uYWwpIHtcbiAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9ICcnOyAvLyBub3Qgbm9ybWFsLCBwYXJzZUFyZyBtaWdodCBoYXZlIGZhaWxlZCBvciBiZSBhIG1vY2sgZnVuY3Rpb24gZm9yIHRlc3RpbmdcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UobmFtZSwgdmFsLCB2YWx1ZVNvdXJjZSk7XG4gICAgfTtcblxuICAgIHRoaXMub24oJ29wdGlvbjonICsgb25hbWUsICh2YWwpID0+IHtcbiAgICAgIGNvbnN0IGludmFsaWRWYWx1ZU1lc3NhZ2UgPSBgZXJyb3I6IG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyBhcmd1bWVudCAnJHt2YWx9JyBpcyBpbnZhbGlkLmA7XG4gICAgICBoYW5kbGVPcHRpb25WYWx1ZSh2YWwsIGludmFsaWRWYWx1ZU1lc3NhZ2UsICdjbGknKTtcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb24uZW52VmFyKSB7XG4gICAgICB0aGlzLm9uKCdvcHRpb25FbnY6JyArIG9uYW1lLCAodmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGludmFsaWRWYWx1ZU1lc3NhZ2UgPSBgZXJyb3I6IG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyB2YWx1ZSAnJHt2YWx9JyBmcm9tIGVudiAnJHtvcHRpb24uZW52VmFyfScgaXMgaW52YWxpZC5gO1xuICAgICAgICBoYW5kbGVPcHRpb25WYWx1ZSh2YWwsIGludmFsaWRWYWx1ZU1lc3NhZ2UsICdlbnYnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIHNoYXJlZCBieSAub3B0aW9uKCkgYW5kIC5yZXF1aXJlZE9wdGlvbigpXG4gICAqXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29wdGlvbkV4KGNvbmZpZywgZmxhZ3MsIGRlc2NyaXB0aW9uLCBmbiwgZGVmYXVsdFZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBmbGFncyA9PT0gJ29iamVjdCcgJiYgZmxhZ3MgaW5zdGFuY2VvZiBPcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RvIGFkZCBhbiBPcHRpb24gb2JqZWN0IHVzZSBhZGRPcHRpb24oKSBpbnN0ZWFkIG9mIG9wdGlvbigpIG9yIHJlcXVpcmVkT3B0aW9uKCknLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcbiAgICBvcHRpb24ubWFrZU9wdGlvbk1hbmRhdG9yeSghIWNvbmZpZy5tYW5kYXRvcnkpO1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdGlvbi5kZWZhdWx0KGRlZmF1bHRWYWx1ZSkuYXJnUGFyc2VyKGZuKTtcbiAgICB9IGVsc2UgaWYgKGZuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBkZXByZWNhdGVkXG4gICAgICBjb25zdCByZWdleCA9IGZuO1xuICAgICAgZm4gPSAodmFsLCBkZWYpID0+IHtcbiAgICAgICAgY29uc3QgbSA9IHJlZ2V4LmV4ZWModmFsKTtcbiAgICAgICAgcmV0dXJuIG0gPyBtWzBdIDogZGVmO1xuICAgICAgfTtcbiAgICAgIG9wdGlvbi5kZWZhdWx0KGRlZmF1bHRWYWx1ZSkuYXJnUGFyc2VyKGZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9uLmRlZmF1bHQoZm4pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkZE9wdGlvbihvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBvcHRpb24gd2l0aCBgZmxhZ3NgLCBgZGVzY3JpcHRpb25gLCBhbmQgb3B0aW9uYWwgYXJndW1lbnQgcGFyc2luZyBmdW5jdGlvbiBvciBgZGVmYXVsdFZhbHVlYCBvciBib3RoLlxuICAgKlxuICAgKiBUaGUgYGZsYWdzYCBzdHJpbmcgY29udGFpbnMgdGhlIHNob3J0IGFuZC9vciBsb25nIGZsYWdzLCBzZXBhcmF0ZWQgYnkgY29tbWEsIGEgcGlwZSBvciBzcGFjZS4gQSByZXF1aXJlZFxuICAgKiBvcHRpb24tYXJndW1lbnQgaXMgaW5kaWNhdGVkIGJ5IGA8PmAgYW5kIGFuIG9wdGlvbmFsIG9wdGlvbi1hcmd1bWVudCBieSBgW11gLlxuICAgKlxuICAgKiBTZWUgdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLCBhbmQgc2VlIGFsc28gYWRkT3B0aW9uKCkgYW5kIHJlcXVpcmVkT3B0aW9uKCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW1cbiAgICogICAgIC5vcHRpb24oJy1wLCAtLXBlcHBlcicsICdhZGQgcGVwcGVyJylcbiAgICogICAgIC5vcHRpb24oJy1wLCAtLXBpenphLXR5cGUgPFRZUEU+JywgJ3R5cGUgb2YgcGl6emEnKSAvLyByZXF1aXJlZCBvcHRpb24tYXJndW1lbnRcbiAgICogICAgIC5vcHRpb24oJy1jLCAtLWNoZWVzZSBbQ0hFRVNFXScsICdhZGQgZXh0cmEgY2hlZXNlJywgJ21venphcmVsbGEnKSAvLyBvcHRpb25hbCBvcHRpb24tYXJndW1lbnQgd2l0aCBkZWZhdWx0XG4gICAqICAgICAub3B0aW9uKCctdCwgLS10aXAgPFZBTFVFPicsICdhZGQgdGlwIHRvIHB1cmNoYXNlIGNvc3QnLCBwYXJzZUZsb2F0KSAvLyBjdXN0b20gcGFyc2UgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufCopfSBbcGFyc2VBcmddIC0gY3VzdG9tIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIG9yIGRlZmF1bHQgdmFsdWVcbiAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgb3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbiwgcGFyc2VBcmcsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25FeCh7fSwgZmxhZ3MsIGRlc2NyaXB0aW9uLCBwYXJzZUFyZywgZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSByZXF1aXJlZCBvcHRpb24gd2hpY2ggbXVzdCBoYXZlIGEgdmFsdWUgYWZ0ZXIgcGFyc2luZy4gVGhpcyB1c3VhbGx5IG1lYW5zXG4gICAqIHRoZSBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gKE90aGVyd2lzZSB0aGUgc2FtZSBhcyAub3B0aW9uKCkuKVxuICAgKlxuICAgKiBUaGUgYGZsYWdzYCBzdHJpbmcgY29udGFpbnMgdGhlIHNob3J0IGFuZC9vciBsb25nIGZsYWdzLCBzZXBhcmF0ZWQgYnkgY29tbWEsIGEgcGlwZSBvciBzcGFjZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufCopfSBbcGFyc2VBcmddIC0gY3VzdG9tIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIG9yIGRlZmF1bHQgdmFsdWVcbiAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgcmVxdWlyZWRPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uLCBwYXJzZUFyZywgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbkV4KFxuICAgICAgeyBtYW5kYXRvcnk6IHRydWUgfSxcbiAgICAgIGZsYWdzLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBwYXJzZUFyZyxcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsdGVyIHBhcnNpbmcgb2Ygc2hvcnQgZmxhZ3Mgd2l0aCBvcHRpb25hbCB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIGZvciBgLm9wdGlvbignLWYsLS1mbGFnIFt2YWx1ZV0nKTpcbiAgICogcHJvZ3JhbS5jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUodHJ1ZSk7ICAvLyBgLWY4MGAgaXMgdHJlYXRlZCBsaWtlIGAtLWZsYWc9ODBgLCB0aGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW91clxuICAgKiBwcm9ncmFtLmNvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZShmYWxzZSkgLy8gYC1mYmAgaXMgdHJlYXRlZCBsaWtlIGAtZiAtYmBcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbY29tYmluZV0gLSBpZiBgdHJ1ZWAgb3Igb21pdHRlZCwgYW4gb3B0aW9uYWwgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBkaXJlY3RseSBhZnRlciB0aGUgZmxhZy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBjb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUoY29tYmluZSA9IHRydWUpIHtcbiAgICB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUgPSAhIWNvbWJpbmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdW5rbm93biBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93VW5rbm93bl0gLSBpZiBgdHJ1ZWAgb3Igb21pdHRlZCwgbm8gZXJyb3Igd2lsbCBiZSB0aHJvd24gZm9yIHVua25vd24gb3B0aW9ucy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhbGxvd1Vua25vd25PcHRpb24oYWxsb3dVbmtub3duID0gdHJ1ZSkge1xuICAgIHRoaXMuX2FsbG93VW5rbm93bk9wdGlvbiA9ICEhYWxsb3dVbmtub3duO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IGV4Y2VzcyBjb21tYW5kLWFyZ3VtZW50cyBvbiB0aGUgY29tbWFuZCBsaW5lLiBQYXNzIGZhbHNlIHRvIG1ha2UgZXhjZXNzIGFyZ3VtZW50cyBhbiBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dFeGNlc3NdIC0gaWYgYHRydWVgIG9yIG9taXR0ZWQsIG5vIGVycm9yIHdpbGwgYmUgdGhyb3duIGZvciBleGNlc3MgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFsbG93RXhjZXNzQXJndW1lbnRzKGFsbG93RXhjZXNzID0gdHJ1ZSkge1xuICAgIHRoaXMuX2FsbG93RXhjZXNzQXJndW1lbnRzID0gISFhbGxvd0V4Y2VzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgcG9zaXRpb25hbCBvcHRpb25zLiBQb3NpdGlvbmFsIG1lYW5zIGdsb2JhbCBvcHRpb25zIGFyZSBzcGVjaWZpZWQgYmVmb3JlIHN1YmNvbW1hbmRzIHdoaWNoIGxldHNcbiAgICogc3ViY29tbWFuZHMgcmV1c2UgdGhlIHNhbWUgb3B0aW9uIG5hbWVzLCBhbmQgYWxzbyBlbmFibGVzIHN1YmNvbW1hbmRzIHRvIHR1cm4gb24gcGFzc1Rocm91Z2hPcHRpb25zLlxuICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbm9uLXBvc2l0aW9uYWwgYW5kIGdsb2JhbCBvcHRpb25zIG1heSBhcHBlYXIgYW55d2hlcmUgb24gdGhlIGNvbW1hbmQgbGluZS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbcG9zaXRpb25hbF1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVQb3NpdGlvbmFsT3B0aW9ucyhwb3NpdGlvbmFsID0gdHJ1ZSkge1xuICAgIHRoaXMuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zID0gISFwb3NpdGlvbmFsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhc3MgdGhyb3VnaCBvcHRpb25zIHRoYXQgY29tZSBhZnRlciBjb21tYW5kLWFyZ3VtZW50cyByYXRoZXIgdGhhbiB0cmVhdCB0aGVtIGFzIGNvbW1hbmQtb3B0aW9ucyxcbiAgICogc28gYWN0dWFsIGNvbW1hbmQtb3B0aW9ucyBjb21lIGJlZm9yZSBjb21tYW5kLWFyZ3VtZW50cy4gVHVybmluZyB0aGlzIG9uIGZvciBhIHN1YmNvbW1hbmQgcmVxdWlyZXNcbiAgICogcG9zaXRpb25hbCBvcHRpb25zIHRvIGhhdmUgYmVlbiBlbmFibGVkIG9uIHRoZSBwcm9ncmFtIChwYXJlbnQgY29tbWFuZHMpLlxuICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbm9uLXBvc2l0aW9uYWwgYW5kIG9wdGlvbnMgbWF5IGFwcGVhciBiZWZvcmUgb3IgYWZ0ZXIgY29tbWFuZC1hcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Bhc3NUaHJvdWdoXSBmb3IgdW5rbm93biBvcHRpb25zLlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHBhc3NUaHJvdWdoT3B0aW9ucyhwYXNzVGhyb3VnaCA9IHRydWUpIHtcbiAgICB0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMgPSAhIXBhc3NUaHJvdWdoO1xuICAgIHRoaXMuX2NoZWNrRm9yQnJva2VuUGFzc1Rocm91Z2goKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hlY2tGb3JCcm9rZW5QYXNzVGhyb3VnaCgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnBhcmVudCAmJlxuICAgICAgdGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zICYmXG4gICAgICAhdGhpcy5wYXJlbnQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwYXNzVGhyb3VnaE9wdGlvbnMgY2Fubm90IGJlIHVzZWQgZm9yICcke3RoaXMuX25hbWV9JyB3aXRob3V0IHR1cm5pbmcgb24gZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgZm9yIHBhcmVudCBjb21tYW5kKHMpYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RvcmUgb3B0aW9uIHZhbHVlcyBhcyBwcm9wZXJ0aWVzIG9uIGNvbW1hbmQgb2JqZWN0LFxuICAgKiBvciBzdG9yZSBzZXBhcmF0ZWx5IChzcGVjaWZ5IGZhbHNlKS4gSW4gYm90aCBjYXNlcyB0aGUgb3B0aW9uIHZhbHVlcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgLm9wdHMoKS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbc3RvcmVBc1Byb3BlcnRpZXM9dHJ1ZV1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHN0b3JlT3B0aW9uc0FzUHJvcGVydGllcyhzdG9yZUFzUHJvcGVydGllcyA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsIC5zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMoKSBiZWZvcmUgYWRkaW5nIG9wdGlvbnMnKTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX29wdGlvblZhbHVlcykubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdjYWxsIC5zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMoKSBiZWZvcmUgc2V0dGluZyBvcHRpb24gdmFsdWVzJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcyA9ICEhc3RvcmVBc1Byb3BlcnRpZXM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgb3B0aW9uIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge29iamVjdH0gdmFsdWVcbiAgICovXG5cbiAgZ2V0T3B0aW9uVmFsdWUoa2V5KSB7XG4gICAgaWYgKHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcykge1xuICAgICAgcmV0dXJuIHRoaXNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvblZhbHVlc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIG9wdGlvbiB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHNldE9wdGlvblZhbHVlKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2Uoa2V5LCB2YWx1ZSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBvcHRpb24gdmFsdWUgYW5kIHdoZXJlIHRoZSB2YWx1ZSBjYW1lIGZyb20uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtvYmplY3R9IHZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBleHBlY3RlZCB2YWx1ZXMgYXJlIGRlZmF1bHQvY29uZmlnL2Vudi9jbGkvaW1wbGllZFxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKGtleSwgdmFsdWUsIHNvdXJjZSkge1xuICAgIGlmICh0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMpIHtcbiAgICAgIHRoaXNba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vcHRpb25WYWx1ZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl9vcHRpb25WYWx1ZVNvdXJjZXNba2V5XSA9IHNvdXJjZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc291cmNlIG9mIG9wdGlvbiB2YWx1ZS5cbiAgICogRXhwZWN0ZWQgdmFsdWVzIGFyZSBkZWZhdWx0IHwgY29uZmlnIHwgZW52IHwgY2xpIHwgaW1wbGllZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgZ2V0T3B0aW9uVmFsdWVTb3VyY2Uoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvblZhbHVlU291cmNlc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2Ugb2Ygb3B0aW9uIHZhbHVlLiBTZWUgYWxzbyAub3B0c1dpdGhHbG9iYWxzKCkuXG4gICAqIEV4cGVjdGVkIHZhbHVlcyBhcmUgZGVmYXVsdCB8IGNvbmZpZyB8IGVudiB8IGNsaSB8IGltcGxpZWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIGdldE9wdGlvblZhbHVlU291cmNlV2l0aEdsb2JhbHMoa2V5KSB7XG4gICAgLy8gZ2xvYmFsIG92ZXJ3cml0ZXMgbG9jYWwsIGxpa2Ugb3B0c1dpdGhHbG9iYWxzXG4gICAgbGV0IHNvdXJjZTtcbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBpZiAoY21kLmdldE9wdGlvblZhbHVlU291cmNlKGtleSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzb3VyY2UgPSBjbWQuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uoa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyIGFyZ3VtZW50cyBmcm9tIGltcGxpZWQgb3IgZXhwbGljaXQgYXJndW1lbnRzLlxuICAgKiBTaWRlLWVmZmVjdHM6IHNldCBfc2NyaXB0UGF0aCBpZiBhcmdzIGluY2x1ZGVkIHNjcmlwdC4gVXNlZCBmb3IgZGVmYXVsdCBwcm9ncmFtIG5hbWUsIGFuZCBzdWJjb21tYW5kIHNlYXJjaGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcHJlcGFyZVVzZXJBcmdzKGFyZ3YsIHBhcnNlT3B0aW9ucykge1xuICAgIGlmIChhcmd2ICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkoYXJndikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmlyc3QgcGFyYW1ldGVyIHRvIHBhcnNlIG11c3QgYmUgYXJyYXkgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHBhcnNlT3B0aW9ucyA9IHBhcnNlT3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIGF1dG8tZGV0ZWN0IGFyZ3VtZW50IGNvbnZlbnRpb25zIGlmIG5vdGhpbmcgc3VwcGxpZWRcbiAgICBpZiAoYXJndiA9PT0gdW5kZWZpbmVkICYmIHBhcnNlT3B0aW9ucy5mcm9tID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnZlcnNpb25zPy5lbGVjdHJvbikge1xuICAgICAgICBwYXJzZU9wdGlvbnMuZnJvbSA9ICdlbGVjdHJvbic7XG4gICAgICB9XG4gICAgICAvLyBjaGVjayBub2RlIHNwZWNpZmljIG9wdGlvbnMgZm9yIHNjZW5hcmlvcyB3aGVyZSB1c2VyIENMSSBhcmdzIGZvbGxvdyBleGVjdXRhYmxlIHdpdGhvdXQgc2NyaXB0bmFtZVxuICAgICAgY29uc3QgZXhlY0FyZ3YgPSBwcm9jZXNzLmV4ZWNBcmd2ID8/IFtdO1xuICAgICAgaWYgKFxuICAgICAgICBleGVjQXJndi5pbmNsdWRlcygnLWUnKSB8fFxuICAgICAgICBleGVjQXJndi5pbmNsdWRlcygnLS1ldmFsJykgfHxcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy1wJykgfHxcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy0tcHJpbnQnKVxuICAgICAgKSB7XG4gICAgICAgIHBhcnNlT3B0aW9ucy5mcm9tID0gJ2V2YWwnOyAvLyBpbnRlcm5hbCB1c2FnZSwgbm90IGRvY3VtZW50ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkZWZhdWx0IHRvIHVzaW5nIHByb2Nlc3MuYXJndlxuICAgIGlmIChhcmd2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyZ3YgPSBwcm9jZXNzLmFyZ3Y7XG4gICAgfVxuICAgIHRoaXMucmF3QXJncyA9IGFyZ3Yuc2xpY2UoKTtcblxuICAgIC8vIGV4dHJhY3QgdGhlIHVzZXIgYXJncyBhbmQgc2NyaXB0UGF0aFxuICAgIGxldCB1c2VyQXJncztcbiAgICBzd2l0Y2ggKHBhcnNlT3B0aW9ucy5mcm9tKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICB0aGlzLl9zY3JpcHRQYXRoID0gYXJndlsxXTtcbiAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VsZWN0cm9uJzpcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBkZWZhdWx0QXBwIGlzIGFuIHVua25vd24gcHJvcGVydHlcbiAgICAgICAgaWYgKHByb2Nlc3MuZGVmYXVsdEFwcCkge1xuICAgICAgICAgIHRoaXMuX3NjcmlwdFBhdGggPSBhcmd2WzFdO1xuICAgICAgICAgIHVzZXJBcmdzID0gYXJndi5zbGljZSgyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1c2VyJzpcbiAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2V2YWwnOlxuICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB1bmV4cGVjdGVkIHBhcnNlIG9wdGlvbiB7IGZyb206ICcke3BhcnNlT3B0aW9ucy5mcm9tfScgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmluZCBkZWZhdWx0IG5hbWUgZm9yIHByb2dyYW0gZnJvbSBhcmd1bWVudHMuXG4gICAgaWYgKCF0aGlzLl9uYW1lICYmIHRoaXMuX3NjcmlwdFBhdGgpXG4gICAgICB0aGlzLm5hbWVGcm9tRmlsZW5hbWUodGhpcy5fc2NyaXB0UGF0aCk7XG4gICAgdGhpcy5fbmFtZSA9IHRoaXMuX25hbWUgfHwgJ3Byb2dyYW0nO1xuXG4gICAgcmV0dXJuIHVzZXJBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGBhcmd2YCwgc2V0dGluZyBvcHRpb25zIGFuZCBpbnZva2luZyBjb21tYW5kcyB3aGVuIGRlZmluZWQuXG4gICAqXG4gICAqIFVzZSBwYXJzZUFzeW5jIGluc3RlYWQgb2YgcGFyc2UgaWYgYW55IG9mIHlvdXIgYWN0aW9uIGhhbmRsZXJzIGFyZSBhc3luYy5cbiAgICpcbiAgICogQ2FsbCB3aXRoIG5vIHBhcmFtZXRlcnMgdG8gcGFyc2UgYHByb2Nlc3MuYXJndmAuIERldGVjdHMgRWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBvcHRpb25zIGxpa2UgYG5vZGUgLS1ldmFsYC4gRWFzeSBtb2RlIVxuICAgKlxuICAgKiBPciBjYWxsIHdpdGggYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBwYXJzZSwgYW5kIG9wdGlvbmFsbHkgd2hlcmUgdGhlIHVzZXIgYXJndW1lbnRzIHN0YXJ0IGJ5IHNwZWNpZnlpbmcgd2hlcmUgdGhlIGFyZ3VtZW50cyBhcmUgYGZyb21gOlxuICAgKiAtIGAnbm9kZSdgOiBkZWZhdWx0LCBgYXJndlswXWAgaXMgdGhlIGFwcGxpY2F0aW9uIGFuZCBgYXJndlsxXWAgaXMgdGhlIHNjcmlwdCBiZWluZyBydW4sIHdpdGggdXNlciBhcmd1bWVudHMgYWZ0ZXIgdGhhdFxuICAgKiAtIGAnZWxlY3Ryb24nYDogYGFyZ3ZbMF1gIGlzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYGFyZ3ZbMV1gIHZhcmllcyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZWxlY3Ryb24gYXBwbGljYXRpb24gaXMgcGFja2FnZWRcbiAgICogLSBgJ3VzZXInYDoganVzdCB1c2VyIGFyZ3VtZW50c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLnBhcnNlKCk7IC8vIHBhcnNlIHByb2Nlc3MuYXJndiBhbmQgYXV0by1kZXRlY3QgZWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBmbGFnc1xuICAgKiBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7IC8vIGFzc3VtZSBhcmd2WzBdIGlzIGFwcCBhbmQgYXJndlsxXSBpcyBzY3JpcHRcbiAgICogcHJvZ3JhbS5wYXJzZShteS1hcmdzLCB7IGZyb206ICd1c2VyJyB9KTsgLy8ganVzdCB1c2VyIHN1cHBsaWVkIGFyZ3VtZW50cywgbm90aGluZyBzcGVjaWFsIGFib3V0IGFyZ3ZbMF1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3ZdIC0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHByb2Nlc3MuYXJndlxuICAgKiBAcGFyYW0ge29iamVjdH0gW3BhcnNlT3B0aW9uc10gLSBvcHRpb25hbGx5IHNwZWNpZnkgc3R5bGUgb2Ygb3B0aW9ucyB3aXRoIGZyb206IG5vZGUvdXNlci9lbGVjdHJvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcnNlT3B0aW9ucy5mcm9tXSAtIHdoZXJlIHRoZSBhcmdzIGFyZSBmcm9tOiAnbm9kZScsICd1c2VyJywgJ2VsZWN0cm9uJ1xuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgcGFyc2UoYXJndiwgcGFyc2VPcHRpb25zKSB7XG4gICAgY29uc3QgdXNlckFyZ3MgPSB0aGlzLl9wcmVwYXJlVXNlckFyZ3MoYXJndiwgcGFyc2VPcHRpb25zKTtcbiAgICB0aGlzLl9wYXJzZUNvbW1hbmQoW10sIHVzZXJBcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGBhcmd2YCwgc2V0dGluZyBvcHRpb25zIGFuZCBpbnZva2luZyBjb21tYW5kcyB3aGVuIGRlZmluZWQuXG4gICAqXG4gICAqIENhbGwgd2l0aCBubyBwYXJhbWV0ZXJzIHRvIHBhcnNlIGBwcm9jZXNzLmFyZ3ZgLiBEZXRlY3RzIEVsZWN0cm9uIGFuZCBzcGVjaWFsIG5vZGUgb3B0aW9ucyBsaWtlIGBub2RlIC0tZXZhbGAuIEVhc3kgbW9kZSFcbiAgICpcbiAgICogT3IgY2FsbCB3aXRoIGFuIGFycmF5IG9mIHN0cmluZ3MgdG8gcGFyc2UsIGFuZCBvcHRpb25hbGx5IHdoZXJlIHRoZSB1c2VyIGFyZ3VtZW50cyBzdGFydCBieSBzcGVjaWZ5aW5nIHdoZXJlIHRoZSBhcmd1bWVudHMgYXJlIGBmcm9tYDpcbiAgICogLSBgJ25vZGUnYDogZGVmYXVsdCwgYGFyZ3ZbMF1gIGlzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYGFyZ3ZbMV1gIGlzIHRoZSBzY3JpcHQgYmVpbmcgcnVuLCB3aXRoIHVzZXIgYXJndW1lbnRzIGFmdGVyIHRoYXRcbiAgICogLSBgJ2VsZWN0cm9uJ2A6IGBhcmd2WzBdYCBpcyB0aGUgYXBwbGljYXRpb24gYW5kIGBhcmd2WzFdYCB2YXJpZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGVsZWN0cm9uIGFwcGxpY2F0aW9uIGlzIHBhY2thZ2VkXG4gICAqIC0gYCd1c2VyJ2A6IGp1c3QgdXNlciBhcmd1bWVudHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgcHJvZ3JhbS5wYXJzZUFzeW5jKCk7IC8vIHBhcnNlIHByb2Nlc3MuYXJndiBhbmQgYXV0by1kZXRlY3QgZWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBmbGFnc1xuICAgKiBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMocHJvY2Vzcy5hcmd2KTsgLy8gYXNzdW1lIGFyZ3ZbMF0gaXMgYXBwIGFuZCBhcmd2WzFdIGlzIHNjcmlwdFxuICAgKiBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMobXktYXJncywgeyBmcm9tOiAndXNlcicgfSk7IC8vIGp1c3QgdXNlciBzdXBwbGllZCBhcmd1bWVudHMsIG5vdGhpbmcgc3BlY2lhbCBhYm91dCBhcmd2WzBdXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmd2XVxuICAgKiBAcGFyYW0ge29iamVjdH0gW3BhcnNlT3B0aW9uc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcnNlT3B0aW9ucy5mcm9tIC0gd2hlcmUgdGhlIGFyZ3MgYXJlIGZyb206ICdub2RlJywgJ3VzZXInLCAnZWxlY3Ryb24nXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuXG4gIGFzeW5jIHBhcnNlQXN5bmMoYXJndiwgcGFyc2VPcHRpb25zKSB7XG4gICAgY29uc3QgdXNlckFyZ3MgPSB0aGlzLl9wcmVwYXJlVXNlckFyZ3MoYXJndiwgcGFyc2VPcHRpb25zKTtcbiAgICBhd2FpdCB0aGlzLl9wYXJzZUNvbW1hbmQoW10sIHVzZXJBcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWItY29tbWFuZCBleGVjdXRhYmxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZXhlY3V0ZVN1YkNvbW1hbmQoc3ViY29tbWFuZCwgYXJncykge1xuICAgIGFyZ3MgPSBhcmdzLnNsaWNlKCk7XG4gICAgbGV0IGxhdW5jaFdpdGhOb2RlID0gZmFsc2U7IC8vIFVzZSBub2RlIGZvciBzb3VyY2UgdGFyZ2V0cyBzbyBkbyBub3QgbmVlZCB0byBnZXQgcGVybWlzc2lvbnMgY29ycmVjdCwgYW5kIG9uIFdpbmRvd3MuXG4gICAgY29uc3Qgc291cmNlRXh0ID0gWycuanMnLCAnLnRzJywgJy50c3gnLCAnLm1qcycsICcuY2pzJ107XG5cbiAgICBmdW5jdGlvbiBmaW5kRmlsZShiYXNlRGlyLCBiYXNlTmFtZSkge1xuICAgICAgLy8gTG9vayBmb3Igc3BlY2lmaWVkIGZpbGVcbiAgICAgIGNvbnN0IGxvY2FsQmluID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIGJhc2VOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsQmluKSkgcmV0dXJuIGxvY2FsQmluO1xuXG4gICAgICAvLyBTdG9wIGxvb2tpbmcgaWYgY2FuZGlkYXRlIGFscmVhZHkgaGFzIGFuIGV4cGVjdGVkIGV4dGVuc2lvbi5cbiAgICAgIGlmIChzb3VyY2VFeHQuaW5jbHVkZXMocGF0aC5leHRuYW1lKGJhc2VOYW1lKSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIFRyeSBhbGwgdGhlIGV4dGVuc2lvbnMuXG4gICAgICBjb25zdCBmb3VuZEV4dCA9IHNvdXJjZUV4dC5maW5kKChleHQpID0+XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoYCR7bG9jYWxCaW59JHtleHR9YCksXG4gICAgICApO1xuICAgICAgaWYgKGZvdW5kRXh0KSByZXR1cm4gYCR7bG9jYWxCaW59JHtmb3VuZEV4dH1gO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIE5vdCBjaGVja2luZyBmb3IgaGVscCBmaXJzdC4gVW5saWtlbHkgdG8gaGF2ZSBtYW5kYXRvcnkgYW5kIGV4ZWN1dGFibGUsIGFuZCBjYW4ndCByb2J1c3RseSB0ZXN0IGZvciBoZWxwIGZsYWdzIGluIGV4dGVybmFsIGNvbW1hbmQuXG4gICAgdGhpcy5fY2hlY2tGb3JNaXNzaW5nTWFuZGF0b3J5T3B0aW9ucygpO1xuICAgIHRoaXMuX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCk7XG5cbiAgICAvLyBleGVjdXRhYmxlRmlsZSBhbmQgZXhlY3V0YWJsZURpciBtaWdodCBiZSBmdWxsIHBhdGgsIG9yIGp1c3QgYSBuYW1lXG4gICAgbGV0IGV4ZWN1dGFibGVGaWxlID1cbiAgICAgIHN1YmNvbW1hbmQuX2V4ZWN1dGFibGVGaWxlIHx8IGAke3RoaXMuX25hbWV9LSR7c3ViY29tbWFuZC5fbmFtZX1gO1xuICAgIGxldCBleGVjdXRhYmxlRGlyID0gdGhpcy5fZXhlY3V0YWJsZURpciB8fCAnJztcbiAgICBpZiAodGhpcy5fc2NyaXB0UGF0aCkge1xuICAgICAgbGV0IHJlc29sdmVkU2NyaXB0UGF0aDsgLy8gcmVzb2x2ZSBwb3NzaWJsZSBzeW1saW5rIGZvciBpbnN0YWxsZWQgbnBtIGJpbmFyeVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZWRTY3JpcHRQYXRoID0gZnMucmVhbHBhdGhTeW5jKHRoaXMuX3NjcmlwdFBhdGgpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlc29sdmVkU2NyaXB0UGF0aCA9IHRoaXMuX3NjcmlwdFBhdGg7XG4gICAgICB9XG4gICAgICBleGVjdXRhYmxlRGlyID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICBwYXRoLmRpcm5hbWUocmVzb2x2ZWRTY3JpcHRQYXRoKSxcbiAgICAgICAgZXhlY3V0YWJsZURpcixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTG9vayBmb3IgYSBsb2NhbCBmaWxlIGluIHByZWZlcmVuY2UgdG8gYSBjb21tYW5kIGluIFBBVEguXG4gICAgaWYgKGV4ZWN1dGFibGVEaXIpIHtcbiAgICAgIGxldCBsb2NhbEZpbGUgPSBmaW5kRmlsZShleGVjdXRhYmxlRGlyLCBleGVjdXRhYmxlRmlsZSk7XG5cbiAgICAgIC8vIExlZ2FjeSBzZWFyY2ggdXNpbmcgcHJlZml4IG9mIHNjcmlwdCBuYW1lIGluc3RlYWQgb2YgY29tbWFuZCBuYW1lXG4gICAgICBpZiAoIWxvY2FsRmlsZSAmJiAhc3ViY29tbWFuZC5fZXhlY3V0YWJsZUZpbGUgJiYgdGhpcy5fc2NyaXB0UGF0aCkge1xuICAgICAgICBjb25zdCBsZWdhY3lOYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgICB0aGlzLl9zY3JpcHRQYXRoLFxuICAgICAgICAgIHBhdGguZXh0bmFtZSh0aGlzLl9zY3JpcHRQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxlZ2FjeU5hbWUgIT09IHRoaXMuX25hbWUpIHtcbiAgICAgICAgICBsb2NhbEZpbGUgPSBmaW5kRmlsZShcbiAgICAgICAgICAgIGV4ZWN1dGFibGVEaXIsXG4gICAgICAgICAgICBgJHtsZWdhY3lOYW1lfS0ke3N1YmNvbW1hbmQuX25hbWV9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBleGVjdXRhYmxlRmlsZSA9IGxvY2FsRmlsZSB8fCBleGVjdXRhYmxlRmlsZTtcbiAgICB9XG5cbiAgICBsYXVuY2hXaXRoTm9kZSA9IHNvdXJjZUV4dC5pbmNsdWRlcyhwYXRoLmV4dG5hbWUoZXhlY3V0YWJsZUZpbGUpKTtcblxuICAgIGxldCBwcm9jO1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSAnd2luMzInKSB7XG4gICAgICBpZiAobGF1bmNoV2l0aE5vZGUpIHtcbiAgICAgICAgYXJncy51bnNoaWZ0KGV4ZWN1dGFibGVGaWxlKTtcbiAgICAgICAgLy8gYWRkIGV4ZWN1dGFibGUgYXJndW1lbnRzIHRvIHNwYXduXG4gICAgICAgIGFyZ3MgPSBpbmNyZW1lbnROb2RlSW5zcGVjdG9yUG9ydChwcm9jZXNzLmV4ZWNBcmd2KS5jb25jYXQoYXJncyk7XG5cbiAgICAgICAgcHJvYyA9IGNoaWxkUHJvY2Vzcy5zcGF3bihwcm9jZXNzLmFyZ3ZbMF0sIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2MgPSBjaGlsZFByb2Nlc3Muc3Bhd24oZXhlY3V0YWJsZUZpbGUsIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXJncy51bnNoaWZ0KGV4ZWN1dGFibGVGaWxlKTtcbiAgICAgIC8vIGFkZCBleGVjdXRhYmxlIGFyZ3VtZW50cyB0byBzcGF3blxuICAgICAgYXJncyA9IGluY3JlbWVudE5vZGVJbnNwZWN0b3JQb3J0KHByb2Nlc3MuZXhlY0FyZ3YpLmNvbmNhdChhcmdzKTtcbiAgICAgIHByb2MgPSBjaGlsZFByb2Nlc3Muc3Bhd24ocHJvY2Vzcy5leGVjUGF0aCwgYXJncywgeyBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIH1cblxuICAgIGlmICghcHJvYy5raWxsZWQpIHtcbiAgICAgIC8vIHRlc3RpbmcgbWFpbmx5IHRvIGF2b2lkIGxlYWsgd2FybmluZ3MgZHVyaW5nIHVuaXQgdGVzdHMgd2l0aCBtb2NrZWQgc3Bhd25cbiAgICAgIGNvbnN0IHNpZ25hbHMgPSBbJ1NJR1VTUjEnLCAnU0lHVVNSMicsICdTSUdURVJNJywgJ1NJR0lOVCcsICdTSUdIVVAnXTtcbiAgICAgIHNpZ25hbHMuZm9yRWFjaCgoc2lnbmFsKSA9PiB7XG4gICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHByb2Mua2lsbGVkID09PSBmYWxzZSAmJiBwcm9jLmV4aXRDb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIGJlY2F1c2Ugc2lnbmFscyBub3QgdHlwZWQgdG8ga25vd24gc3RyaW5nc1xuICAgICAgICAgICAgcHJvYy5raWxsKHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQgdGVybWluYXRlIHByb2Nlc3Mgd2hlbiBzcGF3bmVkIHByb2Nlc3MgdGVybWluYXRlcy5cbiAgICBjb25zdCBleGl0Q2FsbGJhY2sgPSB0aGlzLl9leGl0Q2FsbGJhY2s7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoY29kZSkgPT4ge1xuICAgICAgY29kZSA9IGNvZGUgPz8gMTsgLy8gY29kZSBpcyBudWxsIGlmIHNwYXduZWQgcHJvY2VzcyB0ZXJtaW5hdGVkIGR1ZSB0byBhIHNpZ25hbFxuICAgICAgaWYgKCFleGl0Q2FsbGJhY2spIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpdENhbGxiYWNrKFxuICAgICAgICAgIG5ldyBDb21tYW5kZXJFcnJvcihcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnLFxuICAgICAgICAgICAgJyhjbG9zZSknLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlOiBiZWNhdXNlIGVyci5jb2RlIGlzIGFuIHVua25vd24gcHJvcGVydHlcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgY29uc3QgZXhlY3V0YWJsZURpck1lc3NhZ2UgPSBleGVjdXRhYmxlRGlyXG4gICAgICAgICAgPyBgc2VhcmNoZWQgZm9yIGxvY2FsIHN1YmNvbW1hbmQgcmVsYXRpdmUgdG8gZGlyZWN0b3J5ICcke2V4ZWN1dGFibGVEaXJ9J2BcbiAgICAgICAgICA6ICdubyBkaXJlY3RvcnkgZm9yIHNlYXJjaCBmb3IgbG9jYWwgc3ViY29tbWFuZCwgdXNlIC5leGVjdXRhYmxlRGlyKCkgdG8gc3VwcGx5IGEgY3VzdG9tIGRpcmVjdG9yeSc7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGFibGVNaXNzaW5nID0gYCcke2V4ZWN1dGFibGVGaWxlfScgZG9lcyBub3QgZXhpc3RcbiAtIGlmICcke3N1YmNvbW1hbmQuX25hbWV9JyBpcyBub3QgbWVhbnQgdG8gYmUgYW4gZXhlY3V0YWJsZSBjb21tYW5kLCByZW1vdmUgZGVzY3JpcHRpb24gcGFyYW1ldGVyIGZyb20gJy5jb21tYW5kKCknIGFuZCB1c2UgJy5kZXNjcmlwdGlvbigpJyBpbnN0ZWFkXG4gLSBpZiB0aGUgZGVmYXVsdCBleGVjdXRhYmxlIG5hbWUgaXMgbm90IHN1aXRhYmxlLCB1c2UgdGhlIGV4ZWN1dGFibGVGaWxlIG9wdGlvbiB0byBzdXBwbHkgYSBjdXN0b20gbmFtZSBvciBwYXRoXG4gLSAke2V4ZWN1dGFibGVEaXJNZXNzYWdlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihleGVjdXRhYmxlTWlzc2luZyk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2UgZXJyLmNvZGUgaXMgYW4gdW5rbm93biBwcm9wZXJ0eVxuICAgICAgfSBlbHNlIGlmIChlcnIuY29kZSA9PT0gJ0VBQ0NFUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtleGVjdXRhYmxlRmlsZX0nIG5vdCBleGVjdXRhYmxlYCk7XG4gICAgICB9XG4gICAgICBpZiAoIWV4aXRDYWxsYmFjaykge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgQ29tbWFuZGVyRXJyb3IoXG4gICAgICAgICAgMSxcbiAgICAgICAgICAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnLFxuICAgICAgICAgICcoZXJyb3IpJyxcbiAgICAgICAgKTtcbiAgICAgICAgd3JhcHBlZEVycm9yLm5lc3RlZEVycm9yID0gZXJyO1xuICAgICAgICBleGl0Q2FsbGJhY2sod3JhcHBlZEVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNoaWxkIHByb2Nlc3NcbiAgICB0aGlzLnJ1bm5pbmdDb21tYW5kID0gcHJvYztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZGlzcGF0Y2hTdWJjb21tYW5kKGNvbW1hbmROYW1lLCBvcGVyYW5kcywgdW5rbm93bikge1xuICAgIGNvbnN0IHN1YkNvbW1hbmQgPSB0aGlzLl9maW5kQ29tbWFuZChjb21tYW5kTmFtZSk7XG4gICAgaWYgKCFzdWJDb21tYW5kKSB0aGlzLmhlbHAoeyBlcnJvcjogdHJ1ZSB9KTtcblxuICAgIGxldCBwcm9taXNlQ2hhaW47XG4gICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGxTdWJDb21tYW5kSG9vayhcbiAgICAgIHByb21pc2VDaGFpbixcbiAgICAgIHN1YkNvbW1hbmQsXG4gICAgICAncHJlU3ViY29tbWFuZCcsXG4gICAgKTtcbiAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbChwcm9taXNlQ2hhaW4sICgpID0+IHtcbiAgICAgIGlmIChzdWJDb21tYW5kLl9leGVjdXRhYmxlSGFuZGxlcikge1xuICAgICAgICB0aGlzLl9leGVjdXRlU3ViQ29tbWFuZChzdWJDb21tYW5kLCBvcGVyYW5kcy5jb25jYXQodW5rbm93bikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN1YkNvbW1hbmQuX3BhcnNlQ29tbWFuZChvcGVyYW5kcywgdW5rbm93bik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb21pc2VDaGFpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgaGVscCBkaXJlY3RseSBpZiBwb3NzaWJsZSwgb3IgZGlzcGF0Y2ggaWYgbmVjZXNzYXJ5LlxuICAgKiBlLmcuIGhlbHAgZm9vXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9kaXNwYXRjaEhlbHBDb21tYW5kKHN1YmNvbW1hbmROYW1lKSB7XG4gICAgaWYgKCFzdWJjb21tYW5kTmFtZSkge1xuICAgICAgdGhpcy5oZWxwKCk7XG4gICAgfVxuICAgIGNvbnN0IHN1YkNvbW1hbmQgPSB0aGlzLl9maW5kQ29tbWFuZChzdWJjb21tYW5kTmFtZSk7XG4gICAgaWYgKHN1YkNvbW1hbmQgJiYgIXN1YkNvbW1hbmQuX2V4ZWN1dGFibGVIYW5kbGVyKSB7XG4gICAgICBzdWJDb21tYW5kLmhlbHAoKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBwYXJzaW5nIHRoZSBoZWxwIGZsYWcgdG8gaW52b2tlIHRoZSBoZWxwLlxuICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoXG4gICAgICBzdWJjb21tYW5kTmFtZSxcbiAgICAgIFtdLFxuICAgICAgW3RoaXMuX2dldEhlbHBPcHRpb24oKT8ubG9uZyA/PyB0aGlzLl9nZXRIZWxwT3B0aW9uKCk/LnNob3J0ID8/ICctLWhlbHAnXSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoaXMuYXJncyBhZ2FpbnN0IGV4cGVjdGVkIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoZWNrTnVtYmVyT2ZBcmd1bWVudHMoKSB7XG4gICAgLy8gdG9vIGZld1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChhcmcsIGkpID0+IHtcbiAgICAgIGlmIChhcmcucmVxdWlyZWQgJiYgdGhpcy5hcmdzW2ldID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5taXNzaW5nQXJndW1lbnQoYXJnLm5hbWUoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gdG9vIG1hbnlcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzW3RoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGggLSAxXS52YXJpYWRpY1xuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5hcmdzLmxlbmd0aCA+IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2V4Y2Vzc0FyZ3VtZW50cyh0aGlzLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHRoaXMuYXJncyB1c2luZyB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMgYW5kIHNhdmUgYXMgdGhpcy5wcm9jZXNzZWRBcmdzIVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcHJvY2Vzc0FyZ3VtZW50cygpIHtcbiAgICBjb25zdCBteVBhcnNlQXJnID0gKGFyZ3VtZW50LCB2YWx1ZSwgcHJldmlvdXMpID0+IHtcbiAgICAgIC8vIEV4dHJhIHByb2Nlc3NpbmcgZm9yIG5pY2UgZXJyb3IgbWVzc2FnZSBvbiBwYXJzaW5nIGZhaWx1cmUuXG4gICAgICBsZXQgcGFyc2VkVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiBhcmd1bWVudC5wYXJzZUFyZykge1xuICAgICAgICBjb25zdCBpbnZhbGlkVmFsdWVNZXNzYWdlID0gYGVycm9yOiBjb21tYW5kLWFyZ3VtZW50IHZhbHVlICcke3ZhbHVlfScgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgJyR7YXJndW1lbnQubmFtZSgpfScuYDtcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB0aGlzLl9jYWxsUGFyc2VBcmcoXG4gICAgICAgICAgYXJndW1lbnQsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgcHJldmlvdXMsXG4gICAgICAgICAgaW52YWxpZFZhbHVlTWVzc2FnZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgICB9O1xuXG4gICAgdGhpcy5fY2hlY2tOdW1iZXJPZkFyZ3VtZW50cygpO1xuXG4gICAgY29uc3QgcHJvY2Vzc2VkQXJncyA9IFtdO1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChkZWNsYXJlZEFyZywgaW5kZXgpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IGRlY2xhcmVkQXJnLmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChkZWNsYXJlZEFyZy52YXJpYWRpYykge1xuICAgICAgICAvLyBDb2xsZWN0IHRvZ2V0aGVyIHJlbWFpbmluZyBhcmd1bWVudHMgZm9yIHBhc3NpbmcgdG9nZXRoZXIgYXMgYW4gYXJyYXkuXG4gICAgICAgIGlmIChpbmRleCA8IHRoaXMuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuYXJncy5zbGljZShpbmRleCk7XG4gICAgICAgICAgaWYgKGRlY2xhcmVkQXJnLnBhcnNlQXJnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlZHVjZSgocHJvY2Vzc2VkLCB2KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBteVBhcnNlQXJnKGRlY2xhcmVkQXJnLCB2LCBwcm9jZXNzZWQpO1xuICAgICAgICAgICAgfSwgZGVjbGFyZWRBcmcuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhbHVlID0gW107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaW5kZXggPCB0aGlzLmFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5hcmdzW2luZGV4XTtcbiAgICAgICAgaWYgKGRlY2xhcmVkQXJnLnBhcnNlQXJnKSB7XG4gICAgICAgICAgdmFsdWUgPSBteVBhcnNlQXJnKGRlY2xhcmVkQXJnLCB2YWx1ZSwgZGVjbGFyZWRBcmcuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJvY2Vzc2VkQXJnc1tpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnByb2Nlc3NlZEFyZ3MgPSBwcm9jZXNzZWRBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uY2Ugd2UgaGF2ZSBhIHByb21pc2Ugd2UgY2hhaW4sIGJ1dCBjYWxsIHN5bmNocm9ub3VzbHkgdW50aWwgdGhlbi5cbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm4geyhQcm9taXNlfHVuZGVmaW5lZCl9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGFpbk9yQ2FsbChwcm9taXNlLCBmbikge1xuICAgIC8vIHRoZW5hYmxlXG4gICAgaWYgKHByb21pc2UgJiYgcHJvbWlzZS50aGVuICYmIHR5cGVvZiBwcm9taXNlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIGFscmVhZHkgaGF2ZSBhIHByb21pc2UsIGNoYWluIGNhbGxiYWNrXG4gICAgICByZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IGZuKCkpO1xuICAgIH1cbiAgICAvLyBjYWxsYmFjayBtaWdodCByZXR1cm4gYSBwcm9taXNlXG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcmV0dXJuIHsoUHJvbWlzZXx1bmRlZmluZWQpfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hhaW5PckNhbGxIb29rcyhwcm9taXNlLCBldmVudCkge1xuICAgIGxldCByZXN1bHQgPSBwcm9taXNlO1xuICAgIGNvbnN0IGhvb2tzID0gW107XG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmlsdGVyKChjbWQpID0+IGNtZC5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdICE9PSB1bmRlZmluZWQpXG4gICAgICAuZm9yRWFjaCgoaG9va2VkQ29tbWFuZCkgPT4ge1xuICAgICAgICBob29rZWRDb21tYW5kLl9saWZlQ3ljbGVIb29rc1tldmVudF0uZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICBob29rcy5wdXNoKHsgaG9va2VkQ29tbWFuZCwgY2FsbGJhY2sgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgaWYgKGV2ZW50ID09PSAncG9zdEFjdGlvbicpIHtcbiAgICAgIGhvb2tzLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICBob29rcy5mb3JFYWNoKChob29rRGV0YWlsKSA9PiB7XG4gICAgICByZXN1bHQgPSB0aGlzLl9jaGFpbk9yQ2FsbChyZXN1bHQsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGhvb2tEZXRhaWwuY2FsbGJhY2soaG9va0RldGFpbC5ob29rZWRDb21tYW5kLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gc3ViQ29tbWFuZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHJldHVybiB7KFByb21pc2V8dW5kZWZpbmVkKX1cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoYWluT3JDYWxsU3ViQ29tbWFuZEhvb2socHJvbWlzZSwgc3ViQ29tbWFuZCwgZXZlbnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gcHJvbWlzZTtcbiAgICBpZiAodGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XS5mb3JFYWNoKChob29rKSA9PiB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2NoYWluT3JDYWxsKHJlc3VsdCwgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBob29rKHRoaXMsIHN1YkNvbW1hbmQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYXJndW1lbnRzIGluIGNvbnRleHQgb2YgdGhpcyBjb21tYW5kLlxuICAgKiBSZXR1cm5zIGFjdGlvbiByZXN1bHQsIGluIGNhc2UgaXQgaXMgYSBwcm9taXNlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcGFyc2VDb21tYW5kKG9wZXJhbmRzLCB1bmtub3duKSB7XG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZU9wdGlvbnModW5rbm93bik7XG4gICAgdGhpcy5fcGFyc2VPcHRpb25zRW52KCk7IC8vIGFmdGVyIGNsaSwgc28gcGFyc2VBcmcgbm90IGNhbGxlZCBvbiBib3RoIGNsaSBhbmQgZW52XG4gICAgdGhpcy5fcGFyc2VPcHRpb25zSW1wbGllZCgpO1xuICAgIG9wZXJhbmRzID0gb3BlcmFuZHMuY29uY2F0KHBhcnNlZC5vcGVyYW5kcyk7XG4gICAgdW5rbm93biA9IHBhcnNlZC51bmtub3duO1xuICAgIHRoaXMuYXJncyA9IG9wZXJhbmRzLmNvbmNhdCh1bmtub3duKTtcblxuICAgIGlmIChvcGVyYW5kcyAmJiB0aGlzLl9maW5kQ29tbWFuZChvcGVyYW5kc1swXSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQob3BlcmFuZHNbMF0sIG9wZXJhbmRzLnNsaWNlKDEpLCB1bmtub3duKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5fZ2V0SGVscENvbW1hbmQoKSAmJlxuICAgICAgb3BlcmFuZHNbMF0gPT09IHRoaXMuX2dldEhlbHBDb21tYW5kKCkubmFtZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hIZWxwQ29tbWFuZChvcGVyYW5kc1sxXSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWUpIHtcbiAgICAgIHRoaXMuX291dHB1dEhlbHBJZlJlcXVlc3RlZCh1bmtub3duKTsgLy8gUnVuIHRoZSBoZWxwIGZvciBkZWZhdWx0IGNvbW1hbmQgZnJvbSBwYXJlbnQgcmF0aGVyIHRoYW4gcGFzc2luZyB0byBkZWZhdWx0IGNvbW1hbmRcbiAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoXG4gICAgICAgIHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSxcbiAgICAgICAgb3BlcmFuZHMsXG4gICAgICAgIHVua25vd24sXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbW1hbmRzLmxlbmd0aCAmJlxuICAgICAgdGhpcy5hcmdzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgIXRoaXMuX2FjdGlvbkhhbmRsZXIgJiZcbiAgICAgICF0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWVcbiAgICApIHtcbiAgICAgIC8vIHByb2JhYmx5IG1pc3Npbmcgc3ViY29tbWFuZCBhbmQgbm8gaGFuZGxlciwgdXNlciBuZWVkcyBoZWxwIChhbmQgZXhpdClcbiAgICAgIHRoaXMuaGVscCh7IGVycm9yOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX291dHB1dEhlbHBJZlJlcXVlc3RlZChwYXJzZWQudW5rbm93bik7XG4gICAgdGhpcy5fY2hlY2tGb3JNaXNzaW5nTWFuZGF0b3J5T3B0aW9ucygpO1xuICAgIHRoaXMuX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCk7XG5cbiAgICAvLyBXZSBkbyBub3QgYWx3YXlzIGNhbGwgdGhpcyBjaGVjayB0byBhdm9pZCBtYXNraW5nIGEgXCJiZXR0ZXJcIiBlcnJvciwgbGlrZSB1bmtub3duIGNvbW1hbmQuXG4gICAgY29uc3QgY2hlY2tGb3JVbmtub3duT3B0aW9ucyA9ICgpID0+IHtcbiAgICAgIGlmIChwYXJzZWQudW5rbm93bi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudW5rbm93bk9wdGlvbihwYXJzZWQudW5rbm93blswXSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbW1hbmRFdmVudCA9IGBjb21tYW5kOiR7dGhpcy5uYW1lKCl9YDtcbiAgICBpZiAodGhpcy5fYWN0aW9uSGFuZGxlcikge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgdGhpcy5fcHJvY2Vzc0FyZ3VtZW50cygpO1xuXG4gICAgICBsZXQgcHJvbWlzZUNoYWluO1xuICAgICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGxIb29rcyhwcm9taXNlQ2hhaW4sICdwcmVBY3Rpb24nKTtcbiAgICAgIHByb21pc2VDaGFpbiA9IHRoaXMuX2NoYWluT3JDYWxsKHByb21pc2VDaGFpbiwgKCkgPT5cbiAgICAgICAgdGhpcy5fYWN0aW9uSGFuZGxlcih0aGlzLnByb2Nlc3NlZEFyZ3MpLFxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbChwcm9taXNlQ2hhaW4sICgpID0+IHtcbiAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KGNvbW1hbmRFdmVudCwgb3BlcmFuZHMsIHVua25vd24pOyAvLyBsZWdhY3lcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbEhvb2tzKHByb21pc2VDaGFpbiwgJ3Bvc3RBY3Rpb24nKTtcbiAgICAgIHJldHVybiBwcm9taXNlQ2hhaW47XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5saXN0ZW5lckNvdW50KGNvbW1hbmRFdmVudCkpIHtcbiAgICAgIGNoZWNrRm9yVW5rbm93bk9wdGlvbnMoKTtcbiAgICAgIHRoaXMuX3Byb2Nlc3NBcmd1bWVudHMoKTtcbiAgICAgIHRoaXMucGFyZW50LmVtaXQoY29tbWFuZEV2ZW50LCBvcGVyYW5kcywgdW5rbm93bik7IC8vIGxlZ2FjeVxuICAgIH0gZWxzZSBpZiAob3BlcmFuZHMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5fZmluZENvbW1hbmQoJyonKSkge1xuICAgICAgICAvLyBsZWdhY3kgZGVmYXVsdCBjb21tYW5kXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoJyonLCBvcGVyYW5kcywgdW5rbm93bik7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50KCdjb21tYW5kOionKSkge1xuICAgICAgICAvLyBza2lwIG9wdGlvbiBjaGVjaywgZW1pdCBldmVudCBmb3IgcG9zc2libGUgbWlzc3BlbGxpbmcgc3VnZ2VzdGlvblxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6KicsIG9wZXJhbmRzLCB1bmtub3duKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51bmtub3duQ29tbWFuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgICB0aGlzLl9wcm9jZXNzQXJndW1lbnRzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbW1hbmRzLmxlbmd0aCkge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgLy8gVGhpcyBjb21tYW5kIGhhcyBzdWJjb21tYW5kcyBhbmQgbm90aGluZyBob29rZWQgdXAgYXQgdGhpcyBsZXZlbCwgc28gZGlzcGxheSBoZWxwIChhbmQgZXhpdCkuXG4gICAgICB0aGlzLmhlbHAoeyBlcnJvcjogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgdGhpcy5fcHJvY2Vzc0FyZ3VtZW50cygpO1xuICAgICAgLy8gZmFsbCB0aHJvdWdoIGZvciBjYWxsZXIgdG8gaGFuZGxlIGFmdGVyIGNhbGxpbmcgLnBhcnNlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtYXRjaGluZyBjb21tYW5kLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJuIHtDb21tYW5kIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgX2ZpbmRDb21tYW5kKG5hbWUpIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZHMuZmluZChcbiAgICAgIChjbWQpID0+IGNtZC5fbmFtZSA9PT0gbmFtZSB8fCBjbWQuX2FsaWFzZXMuaW5jbHVkZXMobmFtZSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gb3B0aW9uIG1hdGNoaW5nIGBhcmdgIGlmIGFueS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIF9maW5kT3B0aW9uKGFyZykge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24uaXMoYXJnKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGlmIGEgbWFuZGF0b3J5IG9wdGlvbiBkb2VzIG5vdCBoYXZlIGEgdmFsdWUuXG4gICAqIENhbGxlZCBhZnRlciBjaGVja2luZyBmb3IgaGVscCBmbGFncyBpbiBsZWFmIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGVja0Zvck1pc3NpbmdNYW5kYXRvcnlPcHRpb25zKCkge1xuICAgIC8vIFdhbGsgdXAgaGllcmFyY2h5IHNvIGNhbiBjYWxsIGluIHN1YmNvbW1hbmQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGRpc3BsYXlpbmcgaGVscC5cbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBjbWQub3B0aW9ucy5mb3JFYWNoKChhbk9wdGlvbikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYW5PcHRpb24ubWFuZGF0b3J5ICYmXG4gICAgICAgICAgY21kLmdldE9wdGlvblZhbHVlKGFuT3B0aW9uLmF0dHJpYnV0ZU5hbWUoKSkgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICBjbWQubWlzc2luZ01hbmRhdG9yeU9wdGlvblZhbHVlKGFuT3B0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGlmIGNvbmZsaWN0aW5nIG9wdGlvbnMgYXJlIHVzZWQgdG9nZXRoZXIgaW4gdGhpcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGVja0ZvckNvbmZsaWN0aW5nTG9jYWxPcHRpb25zKCkge1xuICAgIGNvbnN0IGRlZmluZWROb25EZWZhdWx0T3B0aW9ucyA9IHRoaXMub3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5ID0gb3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIGlmICh0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbktleSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5nZXRPcHRpb25WYWx1ZVNvdXJjZShvcHRpb25LZXkpICE9PSAnZGVmYXVsdCc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvcHRpb25zV2l0aENvbmZsaWN0aW5nID0gZGVmaW5lZE5vbkRlZmF1bHRPcHRpb25zLmZpbHRlcihcbiAgICAgIChvcHRpb24pID0+IG9wdGlvbi5jb25mbGljdHNXaXRoLmxlbmd0aCA+IDAsXG4gICAgKTtcblxuICAgIG9wdGlvbnNXaXRoQ29uZmxpY3RpbmcuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBjb25zdCBjb25mbGljdGluZ0FuZERlZmluZWQgPSBkZWZpbmVkTm9uRGVmYXVsdE9wdGlvbnMuZmluZCgoZGVmaW5lZCkgPT5cbiAgICAgICAgb3B0aW9uLmNvbmZsaWN0c1dpdGguaW5jbHVkZXMoZGVmaW5lZC5hdHRyaWJ1dGVOYW1lKCkpLFxuICAgICAgKTtcbiAgICAgIGlmIChjb25mbGljdGluZ0FuZERlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fY29uZmxpY3RpbmdPcHRpb24ob3B0aW9uLCBjb25mbGljdGluZ0FuZERlZmluZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBpZiBjb25mbGljdGluZyBvcHRpb25zIGFyZSB1c2VkIHRvZ2V0aGVyLlxuICAgKiBDYWxsZWQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGhlbHAgZmxhZ3MgaW4gbGVhZiBzdWJjb21tYW5kLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCkge1xuICAgIC8vIFdhbGsgdXAgaGllcmFyY2h5IHNvIGNhbiBjYWxsIGluIHN1YmNvbW1hbmQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGRpc3BsYXlpbmcgaGVscC5cbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBjbWQuX2NoZWNrRm9yQ29uZmxpY3RpbmdMb2NhbE9wdGlvbnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBvcHRpb25zIGZyb20gYGFyZ3ZgIHJlbW92aW5nIGtub3duIG9wdGlvbnMsXG4gICAqIGFuZCByZXR1cm4gYXJndiBzcGxpdCBpbnRvIG9wZXJhbmRzIGFuZCB1bmtub3duIGFyZ3VtZW50cy5cbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqXG4gICAqICAgICBhcmd2ID0+IG9wZXJhbmRzLCB1bmtub3duXG4gICAqICAgICAtLWtub3duIGtrayBvcCA9PiBbb3BdLCBbXVxuICAgKiAgICAgb3AgLS1rbm93biBra2sgPT4gW29wXSwgW11cbiAgICogICAgIHN1YiAtLXVua25vd24gdXV1IG9wID0+IFtzdWJdLCBbLS11bmtub3duIHV1dSBvcF1cbiAgICogICAgIHN1YiAtLSAtLXVua25vd24gdXV1IG9wID0+IFtzdWIgLS11bmtub3duIHV1dSBvcF0sIFtdXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3ZcbiAgICogQHJldHVybiB7e29wZXJhbmRzOiBzdHJpbmdbXSwgdW5rbm93bjogc3RyaW5nW119fVxuICAgKi9cblxuICBwYXJzZU9wdGlvbnMoYXJndikge1xuICAgIGNvbnN0IG9wZXJhbmRzID0gW107IC8vIG9wZXJhbmRzLCBub3Qgb3B0aW9ucyBvciB2YWx1ZXNcbiAgICBjb25zdCB1bmtub3duID0gW107IC8vIGZpcnN0IHVua25vd24gb3B0aW9uIGFuZCByZW1haW5pbmcgdW5rbm93biBhcmdzXG4gICAgbGV0IGRlc3QgPSBvcGVyYW5kcztcbiAgICBjb25zdCBhcmdzID0gYXJndi5zbGljZSgpO1xuXG4gICAgZnVuY3Rpb24gbWF5YmVPcHRpb24oYXJnKSB7XG4gICAgICByZXR1cm4gYXJnLmxlbmd0aCA+IDEgJiYgYXJnWzBdID09PSAnLSc7XG4gICAgfVxuXG4gICAgLy8gcGFyc2Ugb3B0aW9uc1xuICAgIGxldCBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG51bGw7XG4gICAgd2hpbGUgKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhcmcgPSBhcmdzLnNoaWZ0KCk7XG5cbiAgICAgIC8vIGxpdGVyYWxcbiAgICAgIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgICAgaWYgKGRlc3QgPT09IHVua25vd24pIGRlc3QucHVzaChhcmcpO1xuICAgICAgICBkZXN0LnB1c2goLi4uYXJncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlVmFyaWFkaWNPcHRpb24gJiYgIW1heWJlT3B0aW9uKGFyZykpIHtcbiAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHthY3RpdmVWYXJpYWRpY09wdGlvbi5uYW1lKCl9YCwgYXJnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG51bGw7XG5cbiAgICAgIGlmIChtYXliZU9wdGlvbihhcmcpKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2ZpbmRPcHRpb24oYXJnKTtcbiAgICAgICAgLy8gcmVjb2duaXNlZCBvcHRpb24sIGNhbGwgbGlzdGVuZXIgdG8gYXNzaWduIHZhbHVlIHdpdGggcG9zc2libGUgY3VzdG9tIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgIGlmIChvcHRpb24ucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXJncy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHRoaXMub3B0aW9uTWlzc2luZ0FyZ3VtZW50KG9wdGlvbik7XG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgLy8gaGlzdG9yaWNhbCBiZWhhdmlvdXIgaXMgb3B0aW9uYWwgdmFsdWUgaXMgZm9sbG93aW5nIGFyZyB1bmxlc3MgYW4gb3B0aW9uXG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwICYmICFtYXliZU9wdGlvbihhcmdzWzBdKSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7b3B0aW9uLm5hbWUoKX1gLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJvb2xlYW4gZmxhZ1xuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG9wdGlvbi52YXJpYWRpYyA/IG9wdGlvbiA6IG51bGw7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9vayBmb3IgY29tYm8gb3B0aW9ucyBmb2xsb3dpbmcgc2luZ2xlIGRhc2gsIGVhdCBmaXJzdCBvbmUgaWYga25vd24uXG4gICAgICBpZiAoYXJnLmxlbmd0aCA+IDIgJiYgYXJnWzBdID09PSAnLScgJiYgYXJnWzFdICE9PSAnLScpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZmluZE9wdGlvbihgLSR7YXJnWzFdfWApO1xuICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgb3B0aW9uLnJlcXVpcmVkIHx8XG4gICAgICAgICAgICAob3B0aW9uLm9wdGlvbmFsICYmIHRoaXMuX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIG9wdGlvbiB3aXRoIHZhbHVlIGZvbGxvd2luZyBpbiBzYW1lIGFyZ3VtZW50XG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCwgYXJnLnNsaWNlKDIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYm9vbGVhbiBvcHRpb24sIGVtaXQgYW5kIHB1dCBiYWNrIHJlbWFpbmRlciBvZiBhcmcgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgICAgYXJncy51bnNoaWZ0KGAtJHthcmcuc2xpY2UoMil9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvb2sgZm9yIGtub3duIGxvbmcgZmxhZyB3aXRoIHZhbHVlLCBsaWtlIC0tZm9vPWJhclxuICAgICAgaWYgKC9eLS1bXj1dKz0vLnRlc3QoYXJnKSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGFyZy5pbmRleE9mKCc9Jyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2ZpbmRPcHRpb24oYXJnLnNsaWNlKDAsIGluZGV4KSk7XG4gICAgICAgIGlmIChvcHRpb24gJiYgKG9wdGlvbi5yZXF1aXJlZCB8fCBvcHRpb24ub3B0aW9uYWwpKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWAsIGFyZy5zbGljZShpbmRleCArIDEpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOb3QgYSByZWNvZ25pc2VkIG9wdGlvbiBieSB0aGlzIGNvbW1hbmQuXG4gICAgICAvLyBNaWdodCBiZSBhIGNvbW1hbmQtYXJndW1lbnQsIG9yIHN1YmNvbW1hbmQgb3B0aW9uLCBvciB1bmtub3duIG9wdGlvbiwgb3IgaGVscCBjb21tYW5kIG9yIG9wdGlvbi5cblxuICAgICAgLy8gQW4gdW5rbm93biBvcHRpb24gbWVhbnMgZnVydGhlciBhcmd1bWVudHMgYWxzbyBjbGFzc2lmaWVkIGFzIHVua25vd24gc28gY2FuIGJlIHJlcHJvY2Vzc2VkIGJ5IHN1YmNvbW1hbmRzLlxuICAgICAgaWYgKG1heWJlT3B0aW9uKGFyZykpIHtcbiAgICAgICAgZGVzdCA9IHVua25vd247XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHVzaW5nIHBvc2l0aW9uYWxPcHRpb25zLCBzdG9wIHByb2Nlc3Npbmcgb3VyIG9wdGlvbnMgYXQgc3ViY29tbWFuZC5cbiAgICAgIGlmIChcbiAgICAgICAgKHRoaXMuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zIHx8IHRoaXMuX3Bhc3NUaHJvdWdoT3B0aW9ucykgJiZcbiAgICAgICAgb3BlcmFuZHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgIHVua25vd24ubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmRDb21tYW5kKGFyZykpIHtcbiAgICAgICAgICBvcGVyYW5kcy5wdXNoKGFyZyk7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgdW5rbm93bi5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMuX2dldEhlbHBDb21tYW5kKCkgJiZcbiAgICAgICAgICBhcmcgPT09IHRoaXMuX2dldEhlbHBDb21tYW5kKCkubmFtZSgpXG4gICAgICAgICkge1xuICAgICAgICAgIG9wZXJhbmRzLnB1c2goYXJnKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSBvcGVyYW5kcy5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSkge1xuICAgICAgICAgIHVua25vd24ucHVzaChhcmcpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHVua25vd24ucHVzaCguLi5hcmdzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB1c2luZyBwYXNzVGhyb3VnaE9wdGlvbnMsIHN0b3AgcHJvY2Vzc2luZyBvcHRpb25zIGF0IGZpcnN0IGNvbW1hbmQtYXJndW1lbnQuXG4gICAgICBpZiAodGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zKSB7XG4gICAgICAgIGRlc3QucHVzaChhcmcpO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSBkZXN0LnB1c2goLi4uYXJncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgYXJnXG4gICAgICBkZXN0LnB1c2goYXJnKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBvcGVyYW5kcywgdW5rbm93biB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBsb2NhbCBvcHRpb24gdmFsdWVzIGFzIGtleS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgb3B0cygpIHtcbiAgICBpZiAodGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBQcmVzZXJ2ZSBvcmlnaW5hbCBiZWhhdmlvdXIgc28gYmFja3dhcmRzIGNvbXBhdGlibGUgd2hlbiBzdGlsbCB1c2luZyBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMub3B0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5vcHRpb25zW2ldLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPVxuICAgICAgICAgIGtleSA9PT0gdGhpcy5fdmVyc2lvbk9wdGlvbk5hbWUgPyB0aGlzLl92ZXJzaW9uIDogdGhpc1trZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uVmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBtZXJnZWQgbG9jYWwgYW5kIGdsb2JhbCBvcHRpb24gdmFsdWVzIGFzIGtleS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgb3B0c1dpdGhHbG9iYWxzKCkge1xuICAgIC8vIGdsb2JhbHMgb3ZlcndyaXRlIGxvY2Fsc1xuICAgIHJldHVybiB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkucmVkdWNlKFxuICAgICAgKGNvbWJpbmVkT3B0aW9ucywgY21kKSA9PiBPYmplY3QuYXNzaWduKGNvbWJpbmVkT3B0aW9ucywgY21kLm9wdHMoKSksXG4gICAgICB7fSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCAob3IgY2FsbCBleGl0T3ZlcnJpZGUpLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge29iamVjdH0gW2Vycm9yT3B0aW9uc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlcnJvck9wdGlvbnMuY29kZV0gLSBhbiBpZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlcnJvclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2Vycm9yT3B0aW9ucy5leGl0Q29kZV0gLSB1c2VkIHdpdGggcHJvY2Vzcy5leGl0XG4gICAqL1xuICBlcnJvcihtZXNzYWdlLCBlcnJvck9wdGlvbnMpIHtcbiAgICAvLyBvdXRwdXQgaGFuZGxpbmdcbiAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLm91dHB1dEVycm9yKFxuICAgICAgYCR7bWVzc2FnZX1cXG5gLFxuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZUVycixcbiAgICApO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fc2hvd0hlbHBBZnRlckVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZUVycihgJHt0aGlzLl9zaG93SGVscEFmdGVyRXJyb3J9XFxuYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zaG93SGVscEFmdGVyRXJyb3IpIHtcbiAgICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIoJ1xcbicpO1xuICAgICAgdGhpcy5vdXRwdXRIZWxwKHsgZXJyb3I6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gZXhpdCBoYW5kbGluZ1xuICAgIGNvbnN0IGNvbmZpZyA9IGVycm9yT3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBleGl0Q29kZSA9IGNvbmZpZy5leGl0Q29kZSB8fCAxO1xuICAgIGNvbnN0IGNvZGUgPSBjb25maWcuY29kZSB8fCAnY29tbWFuZGVyLmVycm9yJztcbiAgICB0aGlzLl9leGl0KGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhbnkgb3B0aW9uIHJlbGF0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBpZiBvcHRpb24gZG9lc1xuICAgKiBub3QgaGF2ZSBhIHZhbHVlIGZyb20gY2xpIG9yIGNsaWVudCBjb2RlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3BhcnNlT3B0aW9uc0VudigpIHtcbiAgICB0aGlzLm9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAob3B0aW9uLmVudlZhciAmJiBvcHRpb24uZW52VmFyIGluIHByb2Nlc3MuZW52KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICAgIC8vIFByaW9yaXR5IGNoZWNrLiBEbyBub3Qgb3ZlcndyaXRlIGNsaSBvciBvcHRpb25zIGZyb20gdW5rbm93biBzb3VyY2UgKGNsaWVudC1jb2RlKS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgWydkZWZhdWx0JywgJ2NvbmZpZycsICdlbnYnXS5pbmNsdWRlcyhcbiAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KSxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChvcHRpb24ucmVxdWlyZWQgfHwgb3B0aW9uLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAvLyBvcHRpb24gY2FuIHRha2UgYSB2YWx1ZVxuICAgICAgICAgICAgLy8ga2VlcCB2ZXJ5IHNpbXBsZSwgb3B0aW9uYWwgYWx3YXlzIHRha2VzIHZhbHVlXG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbkVudjoke29wdGlvbi5uYW1lKCl9YCwgcHJvY2Vzcy5lbnZbb3B0aW9uLmVudlZhcl0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBib29sZWFuXG4gICAgICAgICAgICAvLyBrZWVwIHZlcnkgc2ltcGxlLCBvbmx5IGNhcmUgdGhhdCBlbnZWYXIgZGVmaW5lZCBhbmQgbm90IHRoZSB2YWx1ZVxuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb25FbnY6JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFueSBpbXBsaWVkIG9wdGlvbiB2YWx1ZXMsIGlmIG9wdGlvbiBpcyB1bmRlZmluZWQgb3IgZGVmYXVsdCB2YWx1ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wYXJzZU9wdGlvbnNJbXBsaWVkKCkge1xuICAgIGNvbnN0IGR1YWxIZWxwZXIgPSBuZXcgRHVhbE9wdGlvbnModGhpcy5vcHRpb25zKTtcbiAgICBjb25zdCBoYXNDdXN0b21PcHRpb25WYWx1ZSA9IChvcHRpb25LZXkpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICFbJ2RlZmF1bHQnLCAnaW1wbGllZCddLmluY2x1ZGVzKHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KSlcbiAgICAgICk7XG4gICAgfTtcbiAgICB0aGlzLm9wdGlvbnNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChvcHRpb24pID0+XG4gICAgICAgICAgb3B0aW9uLmltcGxpZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIGhhc0N1c3RvbU9wdGlvblZhbHVlKG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkpICYmXG4gICAgICAgICAgZHVhbEhlbHBlci52YWx1ZUZyb21PcHRpb24oXG4gICAgICAgICAgICB0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkpLFxuICAgICAgICAgICAgb3B0aW9uLFxuICAgICAgICAgICksXG4gICAgICApXG4gICAgICAuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbi5pbXBsaWVkKVxuICAgICAgICAgIC5maWx0ZXIoKGltcGxpZWRLZXkpID0+ICFoYXNDdXN0b21PcHRpb25WYWx1ZShpbXBsaWVkS2V5KSlcbiAgICAgICAgICAuZm9yRWFjaCgoaW1wbGllZEtleSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UoXG4gICAgICAgICAgICAgIGltcGxpZWRLZXksXG4gICAgICAgICAgICAgIG9wdGlvbi5pbXBsaWVkW2ltcGxpZWRLZXldLFxuICAgICAgICAgICAgICAnaW1wbGllZCcsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXJndW1lbnQgYG5hbWVgIGlzIG1pc3NpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIG1pc3NpbmdBcmd1bWVudChuYW1lKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCAnJHtuYW1lfSdgO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLm1pc3NpbmdBcmd1bWVudCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogYE9wdGlvbmAgaXMgbWlzc2luZyBhbiBhcmd1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBvcHRpb25NaXNzaW5nQXJndW1lbnQob3B0aW9uKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogb3B0aW9uICcke29wdGlvbi5mbGFnc30nIGFyZ3VtZW50IG1pc3NpbmdgO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLm9wdGlvbk1pc3NpbmdBcmd1bWVudCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogYE9wdGlvbmAgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgaXMgYSBtYW5kYXRvcnkgb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIG1pc3NpbmdNYW5kYXRvcnlPcHRpb25WYWx1ZShvcHRpb24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiByZXF1aXJlZCBvcHRpb24gJyR7b3B0aW9uLmZsYWdzfScgbm90IHNwZWNpZmllZGA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIubWlzc2luZ01hbmRhdG9yeU9wdGlvblZhbHVlJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgT3B0aW9uYCBjb25mbGljdHMgd2l0aCBhbm90aGVyIG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcGFyYW0ge09wdGlvbn0gY29uZmxpY3RpbmdPcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jb25mbGljdGluZ09wdGlvbihvcHRpb24sIGNvbmZsaWN0aW5nT3B0aW9uKSB7XG4gICAgLy8gVGhlIGNhbGxpbmcgY29kZSBkb2VzIG5vdCBrbm93IHdoZXRoZXIgYSBuZWdhdGVkIG9wdGlvbiBpcyB0aGUgc291cmNlIG9mIHRoZVxuICAgIC8vIHZhbHVlLCBzbyBkbyBzb21lIHdvcmsgdG8gdGFrZSBhbiBlZHVjYXRlZCBndWVzcy5cbiAgICBjb25zdCBmaW5kQmVzdE9wdGlvbkZyb21WYWx1ZSA9IChvcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KTtcbiAgICAgIGNvbnN0IG5lZ2F0aXZlT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoXG4gICAgICAgICh0YXJnZXQpID0+IHRhcmdldC5uZWdhdGUgJiYgb3B0aW9uS2V5ID09PSB0YXJnZXQuYXR0cmlidXRlTmFtZSgpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBvc2l0aXZlT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoXG4gICAgICAgICh0YXJnZXQpID0+ICF0YXJnZXQubmVnYXRlICYmIG9wdGlvbktleSA9PT0gdGFyZ2V0LmF0dHJpYnV0ZU5hbWUoKSxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIG5lZ2F0aXZlT3B0aW9uICYmXG4gICAgICAgICgobmVnYXRpdmVPcHRpb24ucHJlc2V0QXJnID09PSB1bmRlZmluZWQgJiYgb3B0aW9uVmFsdWUgPT09IGZhbHNlKSB8fFxuICAgICAgICAgIChuZWdhdGl2ZU9wdGlvbi5wcmVzZXRBcmcgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgb3B0aW9uVmFsdWUgPT09IG5lZ2F0aXZlT3B0aW9uLnByZXNldEFyZykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG5lZ2F0aXZlT3B0aW9uO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBvc2l0aXZlT3B0aW9uIHx8IG9wdGlvbjtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3QgYmVzdE9wdGlvbiA9IGZpbmRCZXN0T3B0aW9uRnJvbVZhbHVlKG9wdGlvbik7XG4gICAgICBjb25zdCBvcHRpb25LZXkgPSBiZXN0T3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KTtcbiAgICAgIGlmIChzb3VyY2UgPT09ICdlbnYnKSB7XG4gICAgICAgIHJldHVybiBgZW52aXJvbm1lbnQgdmFyaWFibGUgJyR7YmVzdE9wdGlvbi5lbnZWYXJ9J2A7XG4gICAgICB9XG4gICAgICByZXR1cm4gYG9wdGlvbiAnJHtiZXN0T3B0aW9uLmZsYWdzfSdgO1xuICAgIH07XG5cbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiAke2dldEVycm9yTWVzc2FnZShvcHRpb24pfSBjYW5ub3QgYmUgdXNlZCB3aXRoICR7Z2V0RXJyb3JNZXNzYWdlKGNvbmZsaWN0aW5nT3B0aW9uKX1gO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLmNvbmZsaWN0aW5nT3B0aW9uJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmtub3duIG9wdGlvbiBgZmxhZ2AuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIHVua25vd25PcHRpb24oZmxhZykge1xuICAgIGlmICh0aGlzLl9hbGxvd1Vua25vd25PcHRpb24pIHJldHVybjtcbiAgICBsZXQgc3VnZ2VzdGlvbiA9ICcnO1xuXG4gICAgaWYgKGZsYWcuc3RhcnRzV2l0aCgnLS0nKSAmJiB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IpIHtcbiAgICAgIC8vIExvb3BpbmcgdG8gcGljayB1cCB0aGUgZ2xvYmFsIG9wdGlvbnMgdG9vXG4gICAgICBsZXQgY2FuZGlkYXRlRmxhZ3MgPSBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgbGV0IGNvbW1hbmQgPSB0aGlzO1xuICAgICAgZG8ge1xuICAgICAgICBjb25zdCBtb3JlRmxhZ3MgPSBjb21tYW5kXG4gICAgICAgICAgLmNyZWF0ZUhlbHAoKVxuICAgICAgICAgIC52aXNpYmxlT3B0aW9ucyhjb21tYW5kKVxuICAgICAgICAgIC5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLmxvbmcpXG4gICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiBvcHRpb24ubG9uZyk7XG4gICAgICAgIGNhbmRpZGF0ZUZsYWdzID0gY2FuZGlkYXRlRmxhZ3MuY29uY2F0KG1vcmVGbGFncyk7XG4gICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnBhcmVudDtcbiAgICAgIH0gd2hpbGUgKGNvbW1hbmQgJiYgIWNvbW1hbmQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zKTtcbiAgICAgIHN1Z2dlc3Rpb24gPSBzdWdnZXN0U2ltaWxhcihmbGFnLCBjYW5kaWRhdGVGbGFncyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogdW5rbm93biBvcHRpb24gJyR7ZmxhZ30nJHtzdWdnZXN0aW9ufWA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIudW5rbm93bk9wdGlvbicgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXhjZXNzIGFyZ3VtZW50cywgbW9yZSB0aGFuIGV4cGVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSByZWNlaXZlZEFyZ3NcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2V4Y2Vzc0FyZ3VtZW50cyhyZWNlaXZlZEFyZ3MpIHtcbiAgICBpZiAodGhpcy5fYWxsb3dFeGNlc3NBcmd1bWVudHMpIHJldHVybjtcblxuICAgIGNvbnN0IGV4cGVjdGVkID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aDtcbiAgICBjb25zdCBzID0gZXhwZWN0ZWQgPT09IDEgPyAnJyA6ICdzJztcbiAgICBjb25zdCBmb3JTdWJjb21tYW5kID0gdGhpcy5wYXJlbnQgPyBgIGZvciAnJHt0aGlzLm5hbWUoKX0nYCA6ICcnO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IHRvbyBtYW55IGFyZ3VtZW50cyR7Zm9yU3ViY29tbWFuZH0uIEV4cGVjdGVkICR7ZXhwZWN0ZWR9IGFyZ3VtZW50JHtzfSBidXQgZ290ICR7cmVjZWl2ZWRBcmdzLmxlbmd0aH0uYDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci5leGNlc3NBcmd1bWVudHMnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVua25vd24gY29tbWFuZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgdW5rbm93bkNvbW1hbmQoKSB7XG4gICAgY29uc3QgdW5rbm93bk5hbWUgPSB0aGlzLmFyZ3NbMF07XG4gICAgbGV0IHN1Z2dlc3Rpb24gPSAnJztcblxuICAgIGlmICh0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZU5hbWVzID0gW107XG4gICAgICB0aGlzLmNyZWF0ZUhlbHAoKVxuICAgICAgICAudmlzaWJsZUNvbW1hbmRzKHRoaXMpXG4gICAgICAgIC5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgY2FuZGlkYXRlTmFtZXMucHVzaChjb21tYW5kLm5hbWUoKSk7XG4gICAgICAgICAgLy8ganVzdCB2aXNpYmxlIGFsaWFzXG4gICAgICAgICAgaWYgKGNvbW1hbmQuYWxpYXMoKSkgY2FuZGlkYXRlTmFtZXMucHVzaChjb21tYW5kLmFsaWFzKCkpO1xuICAgICAgICB9KTtcbiAgICAgIHN1Z2dlc3Rpb24gPSBzdWdnZXN0U2ltaWxhcih1bmtub3duTmFtZSwgY2FuZGlkYXRlTmFtZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IHVua25vd24gY29tbWFuZCAnJHt1bmtub3duTmFtZX0nJHtzdWdnZXN0aW9ufWA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIudW5rbm93bkNvbW1hbmQnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIHByb2dyYW0gdmVyc2lvbi5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgYXV0by1yZWdpc3RlcnMgdGhlIFwiLVYsIC0tdmVyc2lvblwiIG9wdGlvbiB3aGljaCB3aWxsIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICpcbiAgICogWW91IGNhbiBvcHRpb25hbGx5IHN1cHBseSB0aGUgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhZ3NdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4geyh0aGlzIHwgc3RyaW5nIHwgdW5kZWZpbmVkKX0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nLCBvciB2ZXJzaW9uIHN0cmluZyBpZiBubyBhcmd1bWVudHNcbiAgICovXG5cbiAgdmVyc2lvbihzdHIsIGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgdGhpcy5fdmVyc2lvbiA9IHN0cjtcbiAgICBmbGFncyA9IGZsYWdzIHx8ICctViwgLS12ZXJzaW9uJztcbiAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uIHx8ICdvdXRwdXQgdGhlIHZlcnNpb24gbnVtYmVyJztcbiAgICBjb25zdCB2ZXJzaW9uT3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcbiAgICB0aGlzLl92ZXJzaW9uT3B0aW9uTmFtZSA9IHZlcnNpb25PcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyT3B0aW9uKHZlcnNpb25PcHRpb24pO1xuXG4gICAgdGhpcy5vbignb3B0aW9uOicgKyB2ZXJzaW9uT3B0aW9uLm5hbWUoKSwgKCkgPT4ge1xuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZU91dChgJHtzdHJ9XFxuYCk7XG4gICAgICB0aGlzLl9leGl0KDAsICdjb21tYW5kZXIudmVyc2lvbicsIHN0cik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc0Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cbiAgZGVzY3JpcHRpb24oc3RyLCBhcmdzRGVzY3JpcHRpb24pIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQgJiYgYXJnc0Rlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSBzdHI7XG4gICAgaWYgKGFyZ3NEZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fYXJnc0Rlc2NyaXB0aW9uID0gYXJnc0Rlc2NyaXB0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHN1bW1hcnkuIFVzZWQgd2hlbiBsaXN0ZWQgYXMgc3ViY29tbWFuZCBvZiBwYXJlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cbiAgc3VtbWFyeShzdHIpIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9zdW1tYXJ5O1xuICAgIHRoaXMuX3N1bW1hcnkgPSBzdHI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFuIGFsaWFzIGZvciB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogWW91IG1heSBjYWxsIG1vcmUgdGhhbiBvbmNlIHRvIGFkZCBtdWx0aXBsZSBhbGlhc2VzLiBPbmx5IHRoZSBmaXJzdCBhbGlhcyBpcyBzaG93biBpbiB0aGUgYXV0by1nZW5lcmF0ZWQgaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc11cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG5cbiAgYWxpYXMoYWxpYXMpIHtcbiAgICBpZiAoYWxpYXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2FsaWFzZXNbMF07IC8vIGp1c3QgcmV0dXJuIGZpcnN0LCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuICAgIC8qKiBAdHlwZSB7Q29tbWFuZH0gKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBsZXQgY29tbWFuZCA9IHRoaXM7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb21tYW5kcy5sZW5ndGggIT09IDAgJiZcbiAgICAgIHRoaXMuY29tbWFuZHNbdGhpcy5jb21tYW5kcy5sZW5ndGggLSAxXS5fZXhlY3V0YWJsZUhhbmRsZXJcbiAgICApIHtcbiAgICAgIC8vIGFzc3VtZSBhZGRpbmcgYWxpYXMgZm9yIGxhc3QgYWRkZWQgZXhlY3V0YWJsZSBzdWJjb21tYW5kLCByYXRoZXIgdGhhbiB0aGlzXG4gICAgICBjb21tYW5kID0gdGhpcy5jb21tYW5kc1t0aGlzLmNvbW1hbmRzLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIGlmIChhbGlhcyA9PT0gY29tbWFuZC5fbmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbW1hbmQgYWxpYXMgY2FuJ3QgYmUgdGhlIHNhbWUgYXMgaXRzIG5hbWVcIik7XG4gICAgY29uc3QgbWF0Y2hpbmdDb21tYW5kID0gdGhpcy5wYXJlbnQ/Ll9maW5kQ29tbWFuZChhbGlhcyk7XG4gICAgaWYgKG1hdGNoaW5nQ29tbWFuZCkge1xuICAgICAgLy8gYy5mLiBfcmVnaXN0ZXJDb21tYW5kXG4gICAgICBjb25zdCBleGlzdGluZ0NtZCA9IFttYXRjaGluZ0NvbW1hbmQubmFtZSgpXVxuICAgICAgICAuY29uY2F0KG1hdGNoaW5nQ29tbWFuZC5hbGlhc2VzKCkpXG4gICAgICAgIC5qb2luKCd8Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYW5ub3QgYWRkIGFsaWFzICcke2FsaWFzfScgdG8gY29tbWFuZCAnJHt0aGlzLm5hbWUoKX0nIGFzIGFscmVhZHkgaGF2ZSBjb21tYW5kICcke2V4aXN0aW5nQ21kfSdgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb21tYW5kLl9hbGlhc2VzLnB1c2goYWxpYXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbGlhc2VzIGZvciB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogT25seSB0aGUgZmlyc3QgYWxpYXMgaXMgc2hvd24gaW4gdGhlIGF1dG8tZ2VuZXJhdGVkIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthbGlhc2VzXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nW118Q29tbWFuZCl9XG4gICAqL1xuXG4gIGFsaWFzZXMoYWxpYXNlcykge1xuICAgIC8vIEdldHRlciBmb3IgdGhlIGFycmF5IG9mIGFsaWFzZXMgaXMgdGhlIG1haW4gcmVhc29uIGZvciBoYXZpbmcgYWxpYXNlcygpIGluIGFkZGl0aW9uIHRvIGFsaWFzKCkuXG4gICAgaWYgKGFsaWFzZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2FsaWFzZXM7XG5cbiAgICBhbGlhc2VzLmZvckVhY2goKGFsaWFzKSA9PiB0aGlzLmFsaWFzKGFsaWFzKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IC8gZ2V0IHRoZSBjb21tYW5kIHVzYWdlIGBzdHJgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cl1cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG5cbiAgdXNhZ2Uoc3RyKSB7XG4gICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5fdXNhZ2UpIHJldHVybiB0aGlzLl91c2FnZTtcblxuICAgICAgY29uc3QgYXJncyA9IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5tYXAoKGFyZykgPT4ge1xuICAgICAgICByZXR1cm4gaHVtYW5SZWFkYWJsZUFyZ05hbWUoYXJnKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtdXG4gICAgICAgIC5jb25jYXQoXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxlbmd0aCB8fCB0aGlzLl9oZWxwT3B0aW9uICE9PSBudWxsID8gJ1tvcHRpb25zXScgOiBbXSxcbiAgICAgICAgICB0aGlzLmNvbW1hbmRzLmxlbmd0aCA/ICdbY29tbWFuZF0nIDogW10sXG4gICAgICAgICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aCA/IGFyZ3MgOiBbXSxcbiAgICAgICAgKVxuICAgICAgICAuam9pbignICcpO1xuICAgIH1cblxuICAgIHRoaXMuX3VzYWdlID0gc3RyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cblxuICBuYW1lKHN0cikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX25hbWU7XG4gICAgdGhpcy5fbmFtZSA9IHN0cjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgZnJvbSBzY3JpcHQgZmlsZW5hbWUsIHN1Y2ggYXMgcHJvY2Vzcy5hcmd2WzFdLFxuICAgKiBvciByZXF1aXJlLm1haW4uZmlsZW5hbWUsIG9yIF9fZmlsZW5hbWUuXG4gICAqXG4gICAqIChVc2VkIGludGVybmFsbHkgYW5kIHB1YmxpYyBhbHRob3VnaCBub3QgZG9jdW1lbnRlZCBpbiBSRUFETUUuKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLm5hbWVGcm9tRmlsZW5hbWUocmVxdWlyZS5tYWluLmZpbGVuYW1lKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9XG4gICAqL1xuXG4gIG5hbWVGcm9tRmlsZW5hbWUoZmlsZW5hbWUpIHtcbiAgICB0aGlzLl9uYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgcGF0aC5leHRuYW1lKGZpbGVuYW1lKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBkaXJlY3RvcnkgZm9yIHNlYXJjaGluZyBmb3IgZXhlY3V0YWJsZSBzdWJjb21tYW5kcyBvZiB0aGlzIGNvbW1hbmQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uZXhlY3V0YWJsZURpcihfX2Rpcm5hbWUpO1xuICAgKiAvLyBvclxuICAgKiBwcm9ncmFtLmV4ZWN1dGFibGVEaXIoJ3N1YmNvbW1hbmRzJyk7XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHJldHVybiB7KHN0cmluZ3xudWxsfENvbW1hbmQpfVxuICAgKi9cblxuICBleGVjdXRhYmxlRGlyKHBhdGgpIHtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fZXhlY3V0YWJsZURpcjtcbiAgICB0aGlzLl9leGVjdXRhYmxlRGlyID0gcGF0aDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gcHJvZ3JhbSBoZWxwIGRvY3VtZW50YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7eyBlcnJvcjogYm9vbGVhbiB9fSBbY29udGV4dE9wdGlvbnNdIC0gcGFzcyB7ZXJyb3I6dHJ1ZX0gdG8gd3JhcCBmb3Igc3RkZXJyIGluc3RlYWQgb2Ygc3Rkb3V0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgaGVscEluZm9ybWF0aW9uKGNvbnRleHRPcHRpb25zKSB7XG4gICAgY29uc3QgaGVscGVyID0gdGhpcy5jcmVhdGVIZWxwKCk7XG4gICAgaWYgKGhlbHBlci5oZWxwV2lkdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVscGVyLmhlbHBXaWR0aCA9XG4gICAgICAgIGNvbnRleHRPcHRpb25zICYmIGNvbnRleHRPcHRpb25zLmVycm9yXG4gICAgICAgICAgPyB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLmdldEVyckhlbHBXaWR0aCgpXG4gICAgICAgICAgOiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLmdldE91dEhlbHBXaWR0aCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGVscGVyLmZvcm1hdEhlbHAodGhpcywgaGVscGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZ2V0SGVscENvbnRleHQoY29udGV4dE9wdGlvbnMpIHtcbiAgICBjb250ZXh0T3B0aW9ucyA9IGNvbnRleHRPcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGNvbnRleHQgPSB7IGVycm9yOiAhIWNvbnRleHRPcHRpb25zLmVycm9yIH07XG4gICAgbGV0IHdyaXRlO1xuICAgIGlmIChjb250ZXh0LmVycm9yKSB7XG4gICAgICB3cml0ZSA9IChhcmcpID0+IHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIoYXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd3JpdGUgPSAoYXJnKSA9PiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLndyaXRlT3V0KGFyZyk7XG4gICAgfVxuICAgIGNvbnRleHQud3JpdGUgPSBjb250ZXh0T3B0aW9ucy53cml0ZSB8fCB3cml0ZTtcbiAgICBjb250ZXh0LmNvbW1hbmQgPSB0aGlzO1xuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIE91dHB1dCBoZWxwIGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbW1hbmQuXG4gICAqXG4gICAqIE91dHB1dHMgYnVpbHQtaW4gaGVscCwgYW5kIGN1c3RvbSB0ZXh0IGFkZGVkIHVzaW5nIGAuYWRkSGVscFRleHQoKWAuXG4gICAqXG4gICAqIEBwYXJhbSB7eyBlcnJvcjogYm9vbGVhbiB9IHwgRnVuY3Rpb259IFtjb250ZXh0T3B0aW9uc10gLSBwYXNzIHtlcnJvcjp0cnVlfSB0byB3cml0ZSB0byBzdGRlcnIgaW5zdGVhZCBvZiBzdGRvdXRcbiAgICovXG5cbiAgb3V0cHV0SGVscChjb250ZXh0T3B0aW9ucykge1xuICAgIGxldCBkZXByZWNhdGVkQ2FsbGJhY2s7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0T3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZGVwcmVjYXRlZENhbGxiYWNrID0gY29udGV4dE9wdGlvbnM7XG4gICAgICBjb250ZXh0T3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2dldEhlbHBDb250ZXh0KGNvbnRleHRPcHRpb25zKTtcblxuICAgIHRoaXMuX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZvckVhY2goKGNvbW1hbmQpID0+IGNvbW1hbmQuZW1pdCgnYmVmb3JlQWxsSGVscCcsIGNvbnRleHQpKTtcbiAgICB0aGlzLmVtaXQoJ2JlZm9yZUhlbHAnLCBjb250ZXh0KTtcblxuICAgIGxldCBoZWxwSW5mb3JtYXRpb24gPSB0aGlzLmhlbHBJbmZvcm1hdGlvbihjb250ZXh0KTtcbiAgICBpZiAoZGVwcmVjYXRlZENhbGxiYWNrKSB7XG4gICAgICBoZWxwSW5mb3JtYXRpb24gPSBkZXByZWNhdGVkQ2FsbGJhY2soaGVscEluZm9ybWF0aW9uKTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGhlbHBJbmZvcm1hdGlvbiAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgIUJ1ZmZlci5pc0J1ZmZlcihoZWxwSW5mb3JtYXRpb24pXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvdXRwdXRIZWxwIGNhbGxiYWNrIG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIGEgQnVmZmVyJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnRleHQud3JpdGUoaGVscEluZm9ybWF0aW9uKTtcblxuICAgIGlmICh0aGlzLl9nZXRIZWxwT3B0aW9uKCk/LmxvbmcpIHtcbiAgICAgIHRoaXMuZW1pdCh0aGlzLl9nZXRIZWxwT3B0aW9uKCkubG9uZyk7IC8vIGRlcHJlY2F0ZWRcbiAgICB9XG4gICAgdGhpcy5lbWl0KCdhZnRlckhlbHAnLCBjb250ZXh0KTtcbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY29tbWFuZCkgPT5cbiAgICAgIGNvbW1hbmQuZW1pdCgnYWZ0ZXJBbGxIZWxwJywgY29udGV4dCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHBhc3MgaW4gZmxhZ3MgYW5kIGEgZGVzY3JpcHRpb24gdG8gY3VzdG9taXNlIHRoZSBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICogUGFzcyBpbiBmYWxzZSB0byBkaXNhYmxlIHRoZSBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5oZWxwT3B0aW9uKCctPywgLS1oZWxwJyAnc2hvdyBoZWxwJyk7IC8vIGN1c3RvbWlzZVxuICAgKiBwcm9ncmFtLmhlbHBPcHRpb24oZmFsc2UpOyAvLyBkaXNhYmxlXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IGJvb2xlYW4pfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaGVscE9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pIHtcbiAgICAvLyBTdXBwb3J0IGRpc2FibGluZyBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICBpZiAodHlwZW9mIGZsYWdzID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGlmIChmbGFncykge1xuICAgICAgICB0aGlzLl9oZWxwT3B0aW9uID0gdGhpcy5faGVscE9wdGlvbiA/PyB1bmRlZmluZWQ7IC8vIHByZXNlcnZlIGV4aXN0aW5nIG9wdGlvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faGVscE9wdGlvbiA9IG51bGw7IC8vIGRpc2FibGVcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEN1c3RvbWlzZSBmbGFncyBhbmQgZGVzY3JpcHRpb24uXG4gICAgZmxhZ3MgPSBmbGFncyA/PyAnLWgsIC0taGVscCc7XG4gICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiA/PyAnZGlzcGxheSBoZWxwIGZvciBjb21tYW5kJztcbiAgICB0aGlzLl9oZWxwT3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExhenkgY3JlYXRlIGhlbHAgb3B0aW9uLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgaGFzIGJlZW4gZGlzYWJsZWQgd2l0aCAuaGVscE9wdGlvbihmYWxzZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIHsoT3B0aW9uIHwgbnVsbCl9IHRoZSBoZWxwIG9wdGlvblxuICAgKiBAcGFja2FnZVxuICAgKi9cbiAgX2dldEhlbHBPcHRpb24oKSB7XG4gICAgLy8gTGF6eSBjcmVhdGUgaGVscCBvcHRpb24gb24gZGVtYW5kLlxuICAgIGlmICh0aGlzLl9oZWxwT3B0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaGVscE9wdGlvbih1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9oZWxwT3B0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1cHBseSB5b3VyIG93biBvcHRpb24gdG8gdXNlIGZvciB0aGUgYnVpbHQtaW4gaGVscCBvcHRpb24uXG4gICAqIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgaGVscE9wdGlvbigpIHRvIGN1c3RvbWlzZSB0aGUgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEhlbHBPcHRpb24ob3B0aW9uKSB7XG4gICAgdGhpcy5faGVscE9wdGlvbiA9IG9wdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBhbmQgZXhpdC5cbiAgICpcbiAgICogT3V0cHV0cyBidWlsdC1pbiBoZWxwLCBhbmQgY3VzdG9tIHRleHQgYWRkZWQgdXNpbmcgYC5hZGRIZWxwVGV4dCgpYC5cbiAgICpcbiAgICogQHBhcmFtIHt7IGVycm9yOiBib29sZWFuIH19IFtjb250ZXh0T3B0aW9uc10gLSBwYXNzIHtlcnJvcjp0cnVlfSB0byB3cml0ZSB0byBzdGRlcnIgaW5zdGVhZCBvZiBzdGRvdXRcbiAgICovXG5cbiAgaGVscChjb250ZXh0T3B0aW9ucykge1xuICAgIHRoaXMub3V0cHV0SGVscChjb250ZXh0T3B0aW9ucyk7XG4gICAgbGV0IGV4aXRDb2RlID0gcHJvY2Vzcy5leGl0Q29kZSB8fCAwO1xuICAgIGlmIChcbiAgICAgIGV4aXRDb2RlID09PSAwICYmXG4gICAgICBjb250ZXh0T3B0aW9ucyAmJlxuICAgICAgdHlwZW9mIGNvbnRleHRPcHRpb25zICE9PSAnZnVuY3Rpb24nICYmXG4gICAgICBjb250ZXh0T3B0aW9ucy5lcnJvclxuICAgICkge1xuICAgICAgZXhpdENvZGUgPSAxO1xuICAgIH1cbiAgICAvLyBtZXNzYWdlOiBkbyBub3QgaGF2ZSBhbGwgZGlzcGxheWVkIHRleHQgYXZhaWxhYmxlIHNvIG9ubHkgcGFzc2luZyBwbGFjZWhvbGRlci5cbiAgICB0aGlzLl9leGl0KGV4aXRDb2RlLCAnY29tbWFuZGVyLmhlbHAnLCAnKG91dHB1dEhlbHApJyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFkZGl0aW9uYWwgdGV4dCB0byBiZSBkaXNwbGF5ZWQgd2l0aCB0aGUgYnVpbHQtaW4gaGVscC5cbiAgICpcbiAgICogUG9zaXRpb24gaXMgJ2JlZm9yZScgb3IgJ2FmdGVyJyB0byBhZmZlY3QganVzdCB0aGlzIGNvbW1hbmQsXG4gICAqIGFuZCAnYmVmb3JlQWxsJyBvciAnYWZ0ZXJBbGwnIHRvIGFmZmVjdCB0aGlzIGNvbW1hbmQgYW5kIGFsbCBpdHMgc3ViY29tbWFuZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwb3NpdGlvbiAtIGJlZm9yZSBvciBhZnRlciBidWlsdC1pbiBoZWxwXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IEZ1bmN0aW9uKX0gdGV4dCAtIHN0cmluZyB0byBhZGQsIG9yIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgc3RyaW5nXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkSGVscFRleHQocG9zaXRpb24sIHRleHQpIHtcbiAgICBjb25zdCBhbGxvd2VkVmFsdWVzID0gWydiZWZvcmVBbGwnLCAnYmVmb3JlJywgJ2FmdGVyJywgJ2FmdGVyQWxsJ107XG4gICAgaWYgKCFhbGxvd2VkVmFsdWVzLmluY2x1ZGVzKHBvc2l0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciBwb3NpdGlvbiB0byBhZGRIZWxwVGV4dC5cbkV4cGVjdGluZyBvbmUgb2YgJyR7YWxsb3dlZFZhbHVlcy5qb2luKFwiJywgJ1wiKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGhlbHBFdmVudCA9IGAke3Bvc2l0aW9ufUhlbHBgO1xuICAgIHRoaXMub24oaGVscEV2ZW50LCAoY29udGV4dCkgPT4ge1xuICAgICAgbGV0IGhlbHBTdHI7XG4gICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGVscFN0ciA9IHRleHQoeyBlcnJvcjogY29udGV4dC5lcnJvciwgY29tbWFuZDogY29udGV4dC5jb21tYW5kIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVscFN0ciA9IHRleHQ7XG4gICAgICB9XG4gICAgICAvLyBJZ25vcmUgZmFsc3kgdmFsdWUgd2hlbiBub3RoaW5nIHRvIG91dHB1dC5cbiAgICAgIGlmIChoZWxwU3RyKSB7XG4gICAgICAgIGNvbnRleHQud3JpdGUoYCR7aGVscFN0cn1cXG5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBpZiBoZWxwIGZsYWdzIHNwZWNpZmllZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIC0gYXJyYXkgb2Ygb3B0aW9ucyB0byBzZWFyY2ggZm9yIGhlbHAgZmxhZ3NcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX291dHB1dEhlbHBJZlJlcXVlc3RlZChhcmdzKSB7XG4gICAgY29uc3QgaGVscE9wdGlvbiA9IHRoaXMuX2dldEhlbHBPcHRpb24oKTtcbiAgICBjb25zdCBoZWxwUmVxdWVzdGVkID0gaGVscE9wdGlvbiAmJiBhcmdzLmZpbmQoKGFyZykgPT4gaGVscE9wdGlvbi5pcyhhcmcpKTtcbiAgICBpZiAoaGVscFJlcXVlc3RlZCkge1xuICAgICAgdGhpcy5vdXRwdXRIZWxwKCk7XG4gICAgICAvLyAoRG8gbm90IGhhdmUgYWxsIGRpc3BsYXllZCB0ZXh0IGF2YWlsYWJsZSBzbyBvbmx5IHBhc3NpbmcgcGxhY2Vob2xkZXIuKVxuICAgICAgdGhpcy5fZXhpdCgwLCAnY29tbWFuZGVyLmhlbHBEaXNwbGF5ZWQnLCAnKG91dHB1dEhlbHApJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU2NhbiBhcmd1bWVudHMgYW5kIGluY3JlbWVudCBwb3J0IG51bWJlciBmb3IgaW5zcGVjdCBjYWxscyAodG8gYXZvaWQgY29uZmxpY3RzIHdoZW4gc3Bhd25pbmcgbmV3IGNvbW1hbmQpLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MgLSBhcnJheSBvZiBhcmd1bWVudHMgZnJvbSBub2RlLmV4ZWNBcmd2XG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGluY3JlbWVudE5vZGVJbnNwZWN0b3JQb3J0KGFyZ3MpIHtcbiAgLy8gVGVzdGluZyBmb3IgdGhlc2Ugb3B0aW9uczpcbiAgLy8gIC0taW5zcGVjdFs9W2hvc3Q6XXBvcnRdXG4gIC8vICAtLWluc3BlY3QtYnJrWz1baG9zdDpdcG9ydF1cbiAgLy8gIC0taW5zcGVjdC1wb3J0PVtob3N0Ol1wb3J0XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiB7XG4gICAgaWYgKCFhcmcuc3RhcnRzV2l0aCgnLS1pbnNwZWN0JykpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIGxldCBkZWJ1Z09wdGlvbjtcbiAgICBsZXQgZGVidWdIb3N0ID0gJzEyNy4wLjAuMSc7XG4gICAgbGV0IGRlYnVnUG9ydCA9ICc5MjI5JztcbiAgICBsZXQgbWF0Y2g7XG4gICAgaWYgKChtYXRjaCA9IGFyZy5tYXRjaCgvXigtLWluc3BlY3QoLWJyayk/KSQvKSkgIT09IG51bGwpIHtcbiAgICAgIC8vIGUuZy4gLS1pbnNwZWN0XG4gICAgICBkZWJ1Z09wdGlvbiA9IG1hdGNoWzFdO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAobWF0Y2ggPSBhcmcubWF0Y2goL14oLS1pbnNwZWN0KC1icmt8LXBvcnQpPyk9KFteOl0rKSQvKSkgIT09IG51bGxcbiAgICApIHtcbiAgICAgIGRlYnVnT3B0aW9uID0gbWF0Y2hbMV07XG4gICAgICBpZiAoL15cXGQrJC8udGVzdChtYXRjaFszXSkpIHtcbiAgICAgICAgLy8gZS5nLiAtLWluc3BlY3Q9MTIzNFxuICAgICAgICBkZWJ1Z1BvcnQgPSBtYXRjaFszXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGUuZy4gLS1pbnNwZWN0PWxvY2FsaG9zdFxuICAgICAgICBkZWJ1Z0hvc3QgPSBtYXRjaFszXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKG1hdGNoID0gYXJnLm1hdGNoKC9eKC0taW5zcGVjdCgtYnJrfC1wb3J0KT8pPShbXjpdKyk6KFxcZCspJC8pKSAhPT0gbnVsbFxuICAgICkge1xuICAgICAgLy8gZS5nLiAtLWluc3BlY3Q9bG9jYWxob3N0OjEyMzRcbiAgICAgIGRlYnVnT3B0aW9uID0gbWF0Y2hbMV07XG4gICAgICBkZWJ1Z0hvc3QgPSBtYXRjaFszXTtcbiAgICAgIGRlYnVnUG9ydCA9IG1hdGNoWzRdO1xuICAgIH1cblxuICAgIGlmIChkZWJ1Z09wdGlvbiAmJiBkZWJ1Z1BvcnQgIT09ICcwJykge1xuICAgICAgcmV0dXJuIGAke2RlYnVnT3B0aW9ufT0ke2RlYnVnSG9zdH06JHtwYXJzZUludChkZWJ1Z1BvcnQpICsgMX1gO1xuICAgIH1cbiAgICByZXR1cm4gYXJnO1xuICB9KTtcbn1cblxuZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDtcbiIsIi8qKlxuICogQ29tbWFuZGVyRXJyb3IgY2xhc3NcbiAqL1xuY2xhc3MgQ29tbWFuZGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHRoZSBDb21tYW5kZXJFcnJvciBjbGFzc1xuICAgKiBAcGFyYW0ge251bWJlcn0gZXhpdENvZGUgc3VnZ2VzdGVkIGV4aXQgY29kZSB3aGljaCBjb3VsZCBiZSB1c2VkIHdpdGggcHJvY2Vzcy5leGl0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIGFuIGlkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGVycm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvclxuICAgKi9cbiAgY29uc3RydWN0b3IoZXhpdENvZGUsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAvLyBwcm9wZXJseSBjYXB0dXJlIHN0YWNrIHRyYWNlIGluIE5vZGUuanNcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLmV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgdGhpcy5uZXN0ZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEludmFsaWRBcmd1bWVudEVycm9yIGNsYXNzXG4gKi9cbmNsYXNzIEludmFsaWRBcmd1bWVudEVycm9yIGV4dGVuZHMgQ29tbWFuZGVyRXJyb3Ige1xuICAvKipcbiAgICogQ29uc3RydWN0cyB0aGUgSW52YWxpZEFyZ3VtZW50RXJyb3IgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBleHBsYW5hdGlvbiBvZiB3aHkgYXJndW1lbnQgaXMgaW52YWxpZFxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKDEsICdjb21tYW5kZXIuaW52YWxpZEFyZ3VtZW50JywgbWVzc2FnZSk7XG4gICAgLy8gcHJvcGVybHkgY2FwdHVyZSBzdGFjayB0cmFjZSBpbiBOb2RlLmpzXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG59XG5cbmV4cG9ydHMuQ29tbWFuZGVyRXJyb3IgPSBDb21tYW5kZXJFcnJvcjtcbmV4cG9ydHMuSW52YWxpZEFyZ3VtZW50RXJyb3IgPSBJbnZhbGlkQXJndW1lbnRFcnJvcjtcbiIsImNvbnN0IHsgaHVtYW5SZWFkYWJsZUFyZ05hbWUgfSA9IHJlcXVpcmUoJy4vYXJndW1lbnQuanMnKTtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IGltcG9ydCB0eXBlcyBmb3IgSlNEb2MsIHVzZWQgYnkgVmlzdWFsIFN0dWRpbyBDb2RlIEludGVsbGlTZW5zZSBhbmQgYG5wbSBydW4gdHlwZXNjcmlwdC1jaGVja0pTYFxuICogaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svanNkb2Mtc3VwcG9ydGVkLXR5cGVzLmh0bWwjaW1wb3J0LXR5cGVzXG4gKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vYXJndW1lbnQuanNcIikuQXJndW1lbnQgfSBBcmd1bWVudFxuICogQHR5cGVkZWYgeyBpbXBvcnQoXCIuL2NvbW1hbmQuanNcIikuQ29tbWFuZCB9IENvbW1hbmRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KFwiLi9vcHRpb24uanNcIikuT3B0aW9uIH0gT3B0aW9uXG4gKi9cblxuLy8gQWx0aG91Z2ggdGhpcyBpcyBhIGNsYXNzLCBtZXRob2RzIGFyZSBzdGF0aWMgaW4gc3R5bGUgdG8gYWxsb3cgb3ZlcnJpZGUgdXNpbmcgc3ViY2xhc3Mgb3IganVzdCBmdW5jdGlvbnMuXG5jbGFzcyBIZWxwIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oZWxwV2lkdGggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zb3J0U3ViY29tbWFuZHMgPSBmYWxzZTtcbiAgICB0aGlzLnNvcnRPcHRpb25zID0gZmFsc2U7XG4gICAgdGhpcy5zaG93R2xvYmFsT3B0aW9ucyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiB0aGUgdmlzaWJsZSBzdWJjb21tYW5kcy4gSW5jbHVkZXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGltcGxpY2l0IGhlbHAgY29tbWFuZCwgaWYgdGhlcmUgaXMgb25lLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7Q29tbWFuZFtdfVxuICAgKi9cblxuICB2aXNpYmxlQ29tbWFuZHMoY21kKSB7XG4gICAgY29uc3QgdmlzaWJsZUNvbW1hbmRzID0gY21kLmNvbW1hbmRzLmZpbHRlcigoY21kKSA9PiAhY21kLl9oaWRkZW4pO1xuICAgIGNvbnN0IGhlbHBDb21tYW5kID0gY21kLl9nZXRIZWxwQ29tbWFuZCgpO1xuICAgIGlmIChoZWxwQ29tbWFuZCAmJiAhaGVscENvbW1hbmQuX2hpZGRlbikge1xuICAgICAgdmlzaWJsZUNvbW1hbmRzLnB1c2goaGVscENvbW1hbmQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0U3ViY29tbWFuZHMpIHtcbiAgICAgIHZpc2libGVDb21tYW5kcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2Ugb3ZlcmxvYWRlZCByZXR1cm4gdHlwZVxuICAgICAgICByZXR1cm4gYS5uYW1lKCkubG9jYWxlQ29tcGFyZShiLm5hbWUoKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZpc2libGVDb21tYW5kcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIG9wdGlvbnMgZm9yIHNvcnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBhXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBiXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBjb21wYXJlT3B0aW9ucyhhLCBiKSB7XG4gICAgY29uc3QgZ2V0U29ydEtleSA9IChvcHRpb24pID0+IHtcbiAgICAgIC8vIFdZU0lXWUcgZm9yIG9yZGVyIGRpc3BsYXllZCBpbiBoZWxwLiBTaG9ydCB1c2VkIGZvciBjb21wYXJpc29uIGlmIHByZXNlbnQuIE5vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG5lZ2F0ZWQuXG4gICAgICByZXR1cm4gb3B0aW9uLnNob3J0XG4gICAgICAgID8gb3B0aW9uLnNob3J0LnJlcGxhY2UoL14tLywgJycpXG4gICAgICAgIDogb3B0aW9uLmxvbmcucmVwbGFjZSgvXi0tLywgJycpO1xuICAgIH07XG4gICAgcmV0dXJuIGdldFNvcnRLZXkoYSkubG9jYWxlQ29tcGFyZShnZXRTb3J0S2V5KGIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIHZpc2libGUgb3B0aW9ucy4gSW5jbHVkZXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGltcGxpY2l0IGhlbHAgb3B0aW9uLCBpZiB0aGVyZSBpcyBvbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtPcHRpb25bXX1cbiAgICovXG5cbiAgdmlzaWJsZU9wdGlvbnMoY21kKSB7XG4gICAgY29uc3QgdmlzaWJsZU9wdGlvbnMgPSBjbWQub3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5oaWRkZW4pO1xuICAgIC8vIEJ1aWx0LWluIGhlbHAgb3B0aW9uLlxuICAgIGNvbnN0IGhlbHBPcHRpb24gPSBjbWQuX2dldEhlbHBPcHRpb24oKTtcbiAgICBpZiAoaGVscE9wdGlvbiAmJiAhaGVscE9wdGlvbi5oaWRkZW4pIHtcbiAgICAgIC8vIEF1dG9tYXRpY2FsbHkgaGlkZSBjb25mbGljdGluZyBmbGFncy4gQml0IGR1YmlvdXMgYnV0IGEgaGlzdG9yaWNhbCBiZWhhdmlvdXIgdGhhdCBpcyBjb252ZW5pZW50IGZvciBzaW5nbGUtY29tbWFuZCBwcm9ncmFtcy5cbiAgICAgIGNvbnN0IHJlbW92ZVNob3J0ID0gaGVscE9wdGlvbi5zaG9ydCAmJiBjbWQuX2ZpbmRPcHRpb24oaGVscE9wdGlvbi5zaG9ydCk7XG4gICAgICBjb25zdCByZW1vdmVMb25nID0gaGVscE9wdGlvbi5sb25nICYmIGNtZC5fZmluZE9wdGlvbihoZWxwT3B0aW9uLmxvbmcpO1xuICAgICAgaWYgKCFyZW1vdmVTaG9ydCAmJiAhcmVtb3ZlTG9uZykge1xuICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKGhlbHBPcHRpb24pOyAvLyBubyBjaGFuZ2VzIG5lZWRlZFxuICAgICAgfSBlbHNlIGlmIChoZWxwT3B0aW9uLmxvbmcgJiYgIXJlbW92ZUxvbmcpIHtcbiAgICAgICAgdmlzaWJsZU9wdGlvbnMucHVzaChcbiAgICAgICAgICBjbWQuY3JlYXRlT3B0aW9uKGhlbHBPcHRpb24ubG9uZywgaGVscE9wdGlvbi5kZXNjcmlwdGlvbiksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGhlbHBPcHRpb24uc2hvcnQgJiYgIXJlbW92ZVNob3J0KSB7XG4gICAgICAgIHZpc2libGVPcHRpb25zLnB1c2goXG4gICAgICAgICAgY21kLmNyZWF0ZU9wdGlvbihoZWxwT3B0aW9uLnNob3J0LCBoZWxwT3B0aW9uLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydE9wdGlvbnMpIHtcbiAgICAgIHZpc2libGVPcHRpb25zLnNvcnQodGhpcy5jb21wYXJlT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB2aXNpYmxlT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIHZpc2libGUgZ2xvYmFsIG9wdGlvbnMuIChOb3QgaW5jbHVkaW5nIGhlbHAuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7T3B0aW9uW119XG4gICAqL1xuXG4gIHZpc2libGVHbG9iYWxPcHRpb25zKGNtZCkge1xuICAgIGlmICghdGhpcy5zaG93R2xvYmFsT3B0aW9ucykgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgZ2xvYmFsT3B0aW9ucyA9IFtdO1xuICAgIGZvciAoXG4gICAgICBsZXQgYW5jZXN0b3JDbWQgPSBjbWQucGFyZW50O1xuICAgICAgYW5jZXN0b3JDbWQ7XG4gICAgICBhbmNlc3RvckNtZCA9IGFuY2VzdG9yQ21kLnBhcmVudFxuICAgICkge1xuICAgICAgY29uc3QgdmlzaWJsZU9wdGlvbnMgPSBhbmNlc3RvckNtZC5vcHRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wdGlvbikgPT4gIW9wdGlvbi5oaWRkZW4sXG4gICAgICApO1xuICAgICAgZ2xvYmFsT3B0aW9ucy5wdXNoKC4uLnZpc2libGVPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydE9wdGlvbnMpIHtcbiAgICAgIGdsb2JhbE9wdGlvbnMuc29ydCh0aGlzLmNvbXBhcmVPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbE9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IG9mIHRoZSBhcmd1bWVudHMgaWYgYW55IGhhdmUgYSBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge0FyZ3VtZW50W119XG4gICAqL1xuXG4gIHZpc2libGVBcmd1bWVudHMoY21kKSB7XG4gICAgLy8gU2lkZSBlZmZlY3QhIEFwcGx5IHRoZSBsZWdhY3kgZGVzY3JpcHRpb25zIGJlZm9yZSB0aGUgYXJndW1lbnRzIGFyZSBkaXNwbGF5ZWQuXG4gICAgaWYgKGNtZC5fYXJnc0Rlc2NyaXB0aW9uKSB7XG4gICAgICBjbWQucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChhcmd1bWVudCkgPT4ge1xuICAgICAgICBhcmd1bWVudC5kZXNjcmlwdGlvbiA9XG4gICAgICAgICAgYXJndW1lbnQuZGVzY3JpcHRpb24gfHwgY21kLl9hcmdzRGVzY3JpcHRpb25bYXJndW1lbnQubmFtZSgpXSB8fCAnJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgYXJndW1lbnRzIHdpdGggYSBkZXNjcmlwdGlvbiB0aGVuIHJldHVybiBhbGwgdGhlIGFyZ3VtZW50cy5cbiAgICBpZiAoY21kLnJlZ2lzdGVyZWRBcmd1bWVudHMuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50LmRlc2NyaXB0aW9uKSkge1xuICAgICAgcmV0dXJuIGNtZC5yZWdpc3RlcmVkQXJndW1lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb21tYW5kIHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgc3ViY29tbWFuZFRlcm0oY21kKSB7XG4gICAgLy8gTGVnYWN5LiBJZ25vcmVzIGN1c3RvbSB1c2FnZSBzdHJpbmcsIGFuZCBuZXN0ZWQgY29tbWFuZHMuXG4gICAgY29uc3QgYXJncyA9IGNtZC5yZWdpc3RlcmVkQXJndW1lbnRzXG4gICAgICAubWFwKChhcmcpID0+IGh1bWFuUmVhZGFibGVBcmdOYW1lKGFyZykpXG4gICAgICAuam9pbignICcpO1xuICAgIHJldHVybiAoXG4gICAgICBjbWQuX25hbWUgK1xuICAgICAgKGNtZC5fYWxpYXNlc1swXSA/ICd8JyArIGNtZC5fYWxpYXNlc1swXSA6ICcnKSArXG4gICAgICAoY21kLm9wdGlvbnMubGVuZ3RoID8gJyBbb3B0aW9uc10nIDogJycpICsgLy8gc2ltcGxpc3RpYyBjaGVjayBmb3Igbm9uLWhlbHAgb3B0aW9uXG4gICAgICAoYXJncyA/ICcgJyArIGFyZ3MgOiAnJylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3B0aW9uIHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIG9wdGlvblRlcm0ob3B0aW9uKSB7XG4gICAgcmV0dXJuIG9wdGlvbi5mbGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFyZ3VtZW50IHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIGFyZ3VtZW50VGVybShhcmd1bWVudCkge1xuICAgIHJldHVybiBhcmd1bWVudC5uYW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb25nZXN0IGNvbW1hbmQgdGVybSBsZW5ndGguXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG4gIGxvbmdlc3RTdWJjb21tYW5kVGVybUxlbmd0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBoZWxwZXIudmlzaWJsZUNvbW1hbmRzKGNtZCkucmVkdWNlKChtYXgsIGNvbW1hbmQpID0+IHtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIGhlbHBlci5zdWJjb21tYW5kVGVybShjb21tYW5kKS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZ2VzdCBvcHRpb24gdGVybSBsZW5ndGguXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG4gIGxvbmdlc3RPcHRpb25UZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSB7XG4gICAgcmV0dXJuIGhlbHBlci52aXNpYmxlT3B0aW9ucyhjbWQpLnJlZHVjZSgobWF4LCBvcHRpb24pID0+IHtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIGhlbHBlci5vcHRpb25UZXJtKG9wdGlvbikubGVuZ3RoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmdlc3QgZ2xvYmFsIG9wdGlvbiB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdEdsb2JhbE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gaGVscGVyLnZpc2libGVHbG9iYWxPcHRpb25zKGNtZCkucmVkdWNlKChtYXgsIG9wdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLm9wdGlvblRlcm0ob3B0aW9uKS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZ2VzdCBhcmd1bWVudCB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdEFyZ3VtZW50VGVybUxlbmd0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBoZWxwZXIudmlzaWJsZUFyZ3VtZW50cyhjbWQpLnJlZHVjZSgobWF4LCBhcmd1bWVudCkgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLmFyZ3VtZW50VGVybShhcmd1bWVudCkubGVuZ3RoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbW1hbmQgdXNhZ2UgdG8gYmUgZGlzcGxheWVkIGF0IHRoZSB0b3Agb2YgdGhlIGJ1aWx0LWluIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIGNvbW1hbmRVc2FnZShjbWQpIHtcbiAgICAvLyBVc2FnZVxuICAgIGxldCBjbWROYW1lID0gY21kLl9uYW1lO1xuICAgIGlmIChjbWQuX2FsaWFzZXNbMF0pIHtcbiAgICAgIGNtZE5hbWUgPSBjbWROYW1lICsgJ3wnICsgY21kLl9hbGlhc2VzWzBdO1xuICAgIH1cbiAgICBsZXQgYW5jZXN0b3JDbWROYW1lcyA9ICcnO1xuICAgIGZvciAoXG4gICAgICBsZXQgYW5jZXN0b3JDbWQgPSBjbWQucGFyZW50O1xuICAgICAgYW5jZXN0b3JDbWQ7XG4gICAgICBhbmNlc3RvckNtZCA9IGFuY2VzdG9yQ21kLnBhcmVudFxuICAgICkge1xuICAgICAgYW5jZXN0b3JDbWROYW1lcyA9IGFuY2VzdG9yQ21kLm5hbWUoKSArICcgJyArIGFuY2VzdG9yQ21kTmFtZXM7XG4gICAgfVxuICAgIHJldHVybiBhbmNlc3RvckNtZE5hbWVzICsgY21kTmFtZSArICcgJyArIGNtZC51c2FnZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBjb21tYW5kRGVzY3JpcHRpb24oY21kKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBvdmVybG9hZGVkIHJldHVybiB0eXBlXG4gICAgcmV0dXJuIGNtZC5kZXNjcmlwdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3ViY29tbWFuZCBzdW1tYXJ5IHRvIHNob3cgaW4gdGhlIGxpc3Qgb2Ygc3ViY29tbWFuZHMuXG4gICAqIChGYWxsYmFjayB0byBkZXNjcmlwdGlvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBzdWJjb21tYW5kRGVzY3JpcHRpb24oY21kKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBvdmVybG9hZGVkIHJldHVybiB0eXBlXG4gICAgcmV0dXJuIGNtZC5zdW1tYXJ5KCkgfHwgY21kLmRlc2NyaXB0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvcHRpb24gZGVzY3JpcHRpb24gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgb3B0aW9uRGVzY3JpcHRpb24ob3B0aW9uKSB7XG4gICAgY29uc3QgZXh0cmFJbmZvID0gW107XG5cbiAgICBpZiAob3B0aW9uLmFyZ0Nob2ljZXMpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKFxuICAgICAgICAvLyB1c2Ugc3RyaW5naWZ5IHRvIG1hdGNoIHRoZSBkaXNwbGF5IG9mIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIGBjaG9pY2VzOiAke29wdGlvbi5hcmdDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiBKU09OLnN0cmluZ2lmeShjaG9pY2UpKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9uLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBkZWZhdWx0IGZvciBib29sZWFuIGFuZCBuZWdhdGVkIG1vcmUgZm9yIHByb2dyYW1tZXIgdGhhbiBlbmQgdXNlcixcbiAgICAgIC8vIGJ1dCBzaG93IHRydWUvZmFsc2UgZm9yIGJvb2xlYW4gb3B0aW9uIGFzIG1heSBiZSBmb3IgaGFuZC1yb2xsZWQgZW52IG9yIGNvbmZpZyBwcm9jZXNzaW5nLlxuICAgICAgY29uc3Qgc2hvd0RlZmF1bHQgPVxuICAgICAgICBvcHRpb24ucmVxdWlyZWQgfHxcbiAgICAgICAgb3B0aW9uLm9wdGlvbmFsIHx8XG4gICAgICAgIChvcHRpb24uaXNCb29sZWFuKCkgJiYgdHlwZW9mIG9wdGlvbi5kZWZhdWx0VmFsdWUgPT09ICdib29sZWFuJyk7XG4gICAgICBpZiAoc2hvd0RlZmF1bHQpIHtcbiAgICAgICAgZXh0cmFJbmZvLnB1c2goXG4gICAgICAgICAgYGRlZmF1bHQ6ICR7b3B0aW9uLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uIHx8IEpTT04uc3RyaW5naWZ5KG9wdGlvbi5kZWZhdWx0VmFsdWUpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHByZXNldCBmb3IgYm9vbGVhbiBhbmQgbmVnYXRlZCBhcmUgbW9yZSBmb3IgcHJvZ3JhbW1lciB0aGFuIGVuZCB1c2VyXG4gICAgaWYgKG9wdGlvbi5wcmVzZXRBcmcgIT09IHVuZGVmaW5lZCAmJiBvcHRpb24ub3B0aW9uYWwpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKGBwcmVzZXQ6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9uLnByZXNldEFyZyl9YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb24uZW52VmFyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKGBlbnY6ICR7b3B0aW9uLmVudlZhcn1gKTtcbiAgICB9XG4gICAgaWYgKGV4dHJhSW5mby5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYCR7b3B0aW9uLmRlc2NyaXB0aW9ufSAoJHtleHRyYUluZm8uam9pbignLCAnKX0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9uLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXJndW1lbnQgZGVzY3JpcHRpb24gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgYXJndW1lbnREZXNjcmlwdGlvbihhcmd1bWVudCkge1xuICAgIGNvbnN0IGV4dHJhSW5mbyA9IFtdO1xuICAgIGlmIChhcmd1bWVudC5hcmdDaG9pY2VzKSB7XG4gICAgICBleHRyYUluZm8ucHVzaChcbiAgICAgICAgLy8gdXNlIHN0cmluZ2lmeSB0byBtYXRjaCB0aGUgZGlzcGxheSBvZiB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgICAgICBgY2hvaWNlczogJHthcmd1bWVudC5hcmdDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiBKU09OLnN0cmluZ2lmeShjaG9pY2UpKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXJndW1lbnQuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKFxuICAgICAgICBgZGVmYXVsdDogJHthcmd1bWVudC5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiB8fCBKU09OLnN0cmluZ2lmeShhcmd1bWVudC5kZWZhdWx0VmFsdWUpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZXh0cmFJbmZvLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4dHJhRGVzY3JpcHRvbiA9IGAoJHtleHRyYUluZm8uam9pbignLCAnKX0pYDtcbiAgICAgIGlmIChhcmd1bWVudC5kZXNjcmlwdGlvbikge1xuICAgICAgICByZXR1cm4gYCR7YXJndW1lbnQuZGVzY3JpcHRpb259ICR7ZXh0cmFEZXNjcmlwdG9ufWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXh0cmFEZXNjcmlwdG9uO1xuICAgIH1cbiAgICByZXR1cm4gYXJndW1lbnQuZGVzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGhlIGJ1aWx0LWluIGhlbHAgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgZm9ybWF0SGVscChjbWQsIGhlbHBlcikge1xuICAgIGNvbnN0IHRlcm1XaWR0aCA9IGhlbHBlci5wYWRXaWR0aChjbWQsIGhlbHBlcik7XG4gICAgY29uc3QgaGVscFdpZHRoID0gaGVscGVyLmhlbHBXaWR0aCB8fCA4MDtcbiAgICBjb25zdCBpdGVtSW5kZW50V2lkdGggPSAyO1xuICAgIGNvbnN0IGl0ZW1TZXBhcmF0b3JXaWR0aCA9IDI7IC8vIGJldHdlZW4gdGVybSBhbmQgZGVzY3JpcHRpb25cbiAgICBmdW5jdGlvbiBmb3JtYXRJdGVtKHRlcm0sIGRlc2NyaXB0aW9uKSB7XG4gICAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgZnVsbFRleHQgPSBgJHt0ZXJtLnBhZEVuZCh0ZXJtV2lkdGggKyBpdGVtU2VwYXJhdG9yV2lkdGgpfSR7ZGVzY3JpcHRpb259YDtcbiAgICAgICAgcmV0dXJuIGhlbHBlci53cmFwKFxuICAgICAgICAgIGZ1bGxUZXh0LFxuICAgICAgICAgIGhlbHBXaWR0aCAtIGl0ZW1JbmRlbnRXaWR0aCxcbiAgICAgICAgICB0ZXJtV2lkdGggKyBpdGVtU2VwYXJhdG9yV2lkdGgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVybTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZm9ybWF0TGlzdCh0ZXh0QXJyYXkpIHtcbiAgICAgIHJldHVybiB0ZXh0QXJyYXkuam9pbignXFxuJykucmVwbGFjZSgvXi9nbSwgJyAnLnJlcGVhdChpdGVtSW5kZW50V2lkdGgpKTtcbiAgICB9XG5cbiAgICAvLyBVc2FnZVxuICAgIGxldCBvdXRwdXQgPSBbYFVzYWdlOiAke2hlbHBlci5jb21tYW5kVXNhZ2UoY21kKX1gLCAnJ107XG5cbiAgICAvLyBEZXNjcmlwdGlvblxuICAgIGNvbnN0IGNvbW1hbmREZXNjcmlwdGlvbiA9IGhlbHBlci5jb21tYW5kRGVzY3JpcHRpb24oY21kKTtcbiAgICBpZiAoY29tbWFuZERlc2NyaXB0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoW1xuICAgICAgICBoZWxwZXIud3JhcChjb21tYW5kRGVzY3JpcHRpb24sIGhlbHBXaWR0aCwgMCksXG4gICAgICAgICcnLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gQXJndW1lbnRzXG4gICAgY29uc3QgYXJndW1lbnRMaXN0ID0gaGVscGVyLnZpc2libGVBcmd1bWVudHMoY21kKS5tYXAoKGFyZ3VtZW50KSA9PiB7XG4gICAgICByZXR1cm4gZm9ybWF0SXRlbShcbiAgICAgICAgaGVscGVyLmFyZ3VtZW50VGVybShhcmd1bWVudCksXG4gICAgICAgIGhlbHBlci5hcmd1bWVudERlc2NyaXB0aW9uKGFyZ3VtZW50KSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGFyZ3VtZW50TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBvdXRwdXQgPSBvdXRwdXQuY29uY2F0KFsnQXJndW1lbnRzOicsIGZvcm1hdExpc3QoYXJndW1lbnRMaXN0KSwgJyddKTtcbiAgICB9XG5cbiAgICAvLyBPcHRpb25zXG4gICAgY29uc3Qgb3B0aW9uTGlzdCA9IGhlbHBlci52aXNpYmxlT3B0aW9ucyhjbWQpLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gZm9ybWF0SXRlbShcbiAgICAgICAgaGVscGVyLm9wdGlvblRlcm0ob3B0aW9uKSxcbiAgICAgICAgaGVscGVyLm9wdGlvbkRlc2NyaXB0aW9uKG9wdGlvbiksXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChvcHRpb25MaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoWydPcHRpb25zOicsIGZvcm1hdExpc3Qob3B0aW9uTGlzdCksICcnXSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvd0dsb2JhbE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGdsb2JhbE9wdGlvbkxpc3QgPSBoZWxwZXJcbiAgICAgICAgLnZpc2libGVHbG9iYWxPcHRpb25zKGNtZClcbiAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdEl0ZW0oXG4gICAgICAgICAgICBoZWxwZXIub3B0aW9uVGVybShvcHRpb24pLFxuICAgICAgICAgICAgaGVscGVyLm9wdGlvbkRlc2NyaXB0aW9uKG9wdGlvbiksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAoZ2xvYmFsT3B0aW9uTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoW1xuICAgICAgICAgICdHbG9iYWwgT3B0aW9uczonLFxuICAgICAgICAgIGZvcm1hdExpc3QoZ2xvYmFsT3B0aW9uTGlzdCksXG4gICAgICAgICAgJycsXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbW1hbmRzXG4gICAgY29uc3QgY29tbWFuZExpc3QgPSBoZWxwZXIudmlzaWJsZUNvbW1hbmRzKGNtZCkubWFwKChjbWQpID0+IHtcbiAgICAgIHJldHVybiBmb3JtYXRJdGVtKFxuICAgICAgICBoZWxwZXIuc3ViY29tbWFuZFRlcm0oY21kKSxcbiAgICAgICAgaGVscGVyLnN1YmNvbW1hbmREZXNjcmlwdGlvbihjbWQpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAoY29tbWFuZExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChbJ0NvbW1hbmRzOicsIGZvcm1hdExpc3QoY29tbWFuZExpc3QpLCAnJ10pO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBwYWQgd2lkdGggZnJvbSB0aGUgbWF4aW11bSB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgcGFkV2lkdGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoXG4gICAgICBoZWxwZXIubG9uZ2VzdE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICAgaGVscGVyLmxvbmdlc3RHbG9iYWxPcHRpb25UZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSxcbiAgICAgIGhlbHBlci5sb25nZXN0U3ViY29tbWFuZFRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICAgaGVscGVyLmxvbmdlc3RBcmd1bWVudFRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHdpZHRoIGNoYXJhY3RlcnMgcGVyIGxpbmUsIHdpdGggbGluZXMgYWZ0ZXIgdGhlIGZpcnN0IGluZGVudGVkLlxuICAgKiBEbyBub3Qgd3JhcCBpZiBpbnN1ZmZpY2llbnQgcm9vbSBmb3Igd3JhcHBpbmcgKG1pbkNvbHVtbldpZHRoKSwgb3Igc3RyaW5nIGlzIG1hbnVhbGx5IGZvcm1hdHRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGVudFxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbkNvbHVtbldpZHRoPTQwXVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqXG4gICAqL1xuXG4gIHdyYXAoc3RyLCB3aWR0aCwgaW5kZW50LCBtaW5Db2x1bW5XaWR0aCA9IDQwKSB7XG4gICAgLy8gRnVsbCBcXHMgY2hhcmFjdGVycywgbWludXMgdGhlIGxpbmVmZWVkcy5cbiAgICBjb25zdCBpbmRlbnRzID1cbiAgICAgICcgXFxcXGZcXFxcdFxcXFx2XFx1MDBhMFxcdTE2ODBcXHUyMDAwLVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDBcXHVmZWZmJztcbiAgICAvLyBEZXRlY3QgbWFudWFsbHkgd3JhcHBlZCBhbmQgaW5kZW50ZWQgc3RyaW5ncyBieSBzZWFyY2hpbmcgZm9yIGxpbmUgYnJlYWsgZm9sbG93ZWQgYnkgc3BhY2VzLlxuICAgIGNvbnN0IG1hbnVhbEluZGVudCA9IG5ldyBSZWdFeHAoYFtcXFxcbl1bJHtpbmRlbnRzfV0rYCk7XG4gICAgaWYgKHN0ci5tYXRjaChtYW51YWxJbmRlbnQpKSByZXR1cm4gc3RyO1xuICAgIC8vIERvIG5vdCB3cmFwIGlmIG5vdCBlbm91Z2ggcm9vbSBmb3IgYSB3cmFwcGVkIGNvbHVtbiBvZiB0ZXh0IChhcyBjb3VsZCBlbmQgdXAgd2l0aCBhIHdvcmQgcGVyIGxpbmUpLlxuICAgIGNvbnN0IGNvbHVtbldpZHRoID0gd2lkdGggLSBpbmRlbnQ7XG4gICAgaWYgKGNvbHVtbldpZHRoIDwgbWluQ29sdW1uV2lkdGgpIHJldHVybiBzdHI7XG5cbiAgICBjb25zdCBsZWFkaW5nU3RyID0gc3RyLnNsaWNlKDAsIGluZGVudCk7XG4gICAgY29uc3QgY29sdW1uVGV4dCA9IHN0ci5zbGljZShpbmRlbnQpLnJlcGxhY2UoJ1xcclxcbicsICdcXG4nKTtcbiAgICBjb25zdCBpbmRlbnRTdHJpbmcgPSAnICcucmVwZWF0KGluZGVudCk7XG4gICAgY29uc3QgemVyb1dpZHRoU3BhY2UgPSAnXFx1MjAwQic7XG4gICAgY29uc3QgYnJlYWtzID0gYFxcXFxzJHt6ZXJvV2lkdGhTcGFjZX1gO1xuICAgIC8vIE1hdGNoIGxpbmUgZW5kIChzbyBlbXB0eSBsaW5lcyBkb24ndCBjb2xsYXBzZSksXG4gICAgLy8gb3IgYXMgbXVjaCB0ZXh0IGFzIHdpbGwgZml0IGluIGNvbHVtbiwgb3IgZXhjZXNzIHRleHQgdXAgdG8gZmlyc3QgYnJlYWsuXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgYFxcbnwuezEsJHtjb2x1bW5XaWR0aCAtIDF9fShbJHticmVha3N9XXwkKXxbXiR7YnJlYWtzfV0rPyhbJHticmVha3N9XXwkKWAsXG4gICAgICAnZycsXG4gICAgKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbHVtblRleHQubWF0Y2gocmVnZXgpIHx8IFtdO1xuICAgIHJldHVybiAoXG4gICAgICBsZWFkaW5nU3RyICtcbiAgICAgIGxpbmVzXG4gICAgICAgIC5tYXAoKGxpbmUsIGkpID0+IHtcbiAgICAgICAgICBpZiAobGluZSA9PT0gJ1xcbicpIHJldHVybiAnJzsgLy8gcHJlc2VydmUgZW1wdHkgbGluZXNcbiAgICAgICAgICByZXR1cm4gKGkgPiAwID8gaW5kZW50U3RyaW5nIDogJycpICsgbGluZS50cmltRW5kKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0cy5IZWxwID0gSGVscDtcbiIsImNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3IuanMnKTtcblxuY2xhc3MgT3B0aW9uIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgYE9wdGlvbmAgd2l0aCB0aGUgZ2l2ZW4gYGZsYWdzYCBhbmQgYGRlc2NyaXB0aW9uYC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgJyc7XG5cbiAgICB0aGlzLnJlcXVpcmVkID0gZmxhZ3MuaW5jbHVkZXMoJzwnKTsgLy8gQSB2YWx1ZSBtdXN0IGJlIHN1cHBsaWVkIHdoZW4gdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQuXG4gICAgdGhpcy5vcHRpb25hbCA9IGZsYWdzLmluY2x1ZGVzKCdbJyk7IC8vIEEgdmFsdWUgaXMgb3B0aW9uYWwgd2hlbiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZC5cbiAgICAvLyB2YXJpYWRpYyB0ZXN0IGlnbm9yZXMgPHZhbHVlLC4uLj4gZXQgYWwgd2hpY2ggbWlnaHQgYmUgdXNlZCB0byBkZXNjcmliZSBjdXN0b20gc3BsaXR0aW5nIG9mIHNpbmdsZSBhcmd1bWVudFxuICAgIHRoaXMudmFyaWFkaWMgPSAvXFx3XFwuXFwuXFwuWz5cXF1dJC8udGVzdChmbGFncyk7IC8vIFRoZSBvcHRpb24gY2FuIHRha2UgbXVsdGlwbGUgdmFsdWVzLlxuICAgIHRoaXMubWFuZGF0b3J5ID0gZmFsc2U7IC8vIFRoZSBvcHRpb24gbXVzdCBoYXZlIGEgdmFsdWUgYWZ0ZXIgcGFyc2luZywgd2hpY2ggdXN1YWxseSBtZWFucyBpdCBtdXN0IGJlIHNwZWNpZmllZCBvbiBjb21tYW5kIGxpbmUuXG4gICAgY29uc3Qgb3B0aW9uRmxhZ3MgPSBzcGxpdE9wdGlvbkZsYWdzKGZsYWdzKTtcbiAgICB0aGlzLnNob3J0ID0gb3B0aW9uRmxhZ3Muc2hvcnRGbGFnO1xuICAgIHRoaXMubG9uZyA9IG9wdGlvbkZsYWdzLmxvbmdGbGFnO1xuICAgIHRoaXMubmVnYXRlID0gZmFsc2U7XG4gICAgaWYgKHRoaXMubG9uZykge1xuICAgICAgdGhpcy5uZWdhdGUgPSB0aGlzLmxvbmcuc3RhcnRzV2l0aCgnLS1uby0nKTtcbiAgICB9XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnByZXNldEFyZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVudlZhciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBhcnNlQXJnID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29uZmxpY3RzV2l0aCA9IFtdO1xuICAgIHRoaXMuaW1wbGllZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUsIGFuZCBvcHRpb25hbGx5IHN1cHBseSB0aGUgZGVzY3JpcHRpb24gdG8gYmUgZGlzcGxheWVkIGluIHRoZSBoZWxwLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgZGVmYXVsdCh2YWx1ZSwgZGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVzZXQgdG8gdXNlIHdoZW4gb3B0aW9uIHVzZWQgd2l0aG91dCBvcHRpb24tYXJndW1lbnQsIGVzcGVjaWFsbHkgb3B0aW9uYWwgYnV0IGFsc28gYm9vbGVhbiBhbmQgbmVnYXRlZC5cbiAgICogVGhlIGN1c3RvbSBwcm9jZXNzaW5nIChwYXJzZUFyZykgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBuZXcgT3B0aW9uKCctLWNvbG9yJykuZGVmYXVsdCgnR1JFWVNDQUxFJykucHJlc2V0KCdSR0InKTtcbiAgICogbmV3IE9wdGlvbignLS1kb25hdGUgW2Ftb3VudF0nKS5wcmVzZXQoJzIwJykuYXJnUGFyc2VyKHBhcnNlRmxvYXQpO1xuICAgKlxuICAgKiBAcGFyYW0geyp9IGFyZ1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIHByZXNldChhcmcpIHtcbiAgICB0aGlzLnByZXNldEFyZyA9IGFyZztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgb3B0aW9uIG5hbWUocykgdGhhdCBjb25mbGljdCB3aXRoIHRoaXMgb3B0aW9uLlxuICAgKiBBbiBlcnJvciB3aWxsIGJlIGRpc3BsYXllZCBpZiBjb25mbGljdGluZyBvcHRpb25zIGFyZSBmb3VuZCBkdXJpbmcgcGFyc2luZy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbmV3IE9wdGlvbignLS1yZ2InKS5jb25mbGljdHMoJ2NteWsnKTtcbiAgICogbmV3IE9wdGlvbignLS1qcycpLmNvbmZsaWN0cyhbJ3RzJywgJ2pzeCddKTtcbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgc3RyaW5nW10pfSBuYW1lc1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGNvbmZsaWN0cyhuYW1lcykge1xuICAgIHRoaXMuY29uZmxpY3RzV2l0aCA9IHRoaXMuY29uZmxpY3RzV2l0aC5jb25jYXQobmFtZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgaW1wbGllZCBvcHRpb24gdmFsdWVzIGZvciB3aGVuIHRoaXMgb3B0aW9uIGlzIHNldCBhbmQgdGhlIGltcGxpZWQgb3B0aW9ucyBhcmUgbm90LlxuICAgKlxuICAgKiBUaGUgY3VzdG9tIHByb2Nlc3NpbmcgKHBhcnNlQXJnKSBpcyBub3QgY2FsbGVkIG9uIHRoZSBpbXBsaWVkIHZhbHVlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1sb2cnLCAnd3JpdGUgbG9nZ2luZyBpbmZvcm1hdGlvbiB0byBmaWxlJykpXG4gICAqICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLXRyYWNlJywgJ2xvZyBleHRyYSBkZXRhaWxzJykuaW1wbGllcyh7IGxvZzogJ3RyYWNlLnR4dCcgfSkpO1xuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW1wbGllZE9wdGlvblZhbHVlc1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuICBpbXBsaWVzKGltcGxpZWRPcHRpb25WYWx1ZXMpIHtcbiAgICBsZXQgbmV3SW1wbGllZCA9IGltcGxpZWRPcHRpb25WYWx1ZXM7XG4gICAgaWYgKHR5cGVvZiBpbXBsaWVkT3B0aW9uVmFsdWVzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gc3RyaW5nIGlzIG5vdCBkb2N1bWVudGVkLCBidXQgZWFzeSBtaXN0YWtlIGFuZCB3ZSBjYW4gZG8gd2hhdCB1c2VyIHByb2JhYmx5IGludGVuZGVkLlxuICAgICAgbmV3SW1wbGllZCA9IHsgW2ltcGxpZWRPcHRpb25WYWx1ZXNdOiB0cnVlIH07XG4gICAgfVxuICAgIHRoaXMuaW1wbGllZCA9IE9iamVjdC5hc3NpZ24odGhpcy5pbXBsaWVkIHx8IHt9LCBuZXdJbXBsaWVkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gY2hlY2sgZm9yIG9wdGlvbiB2YWx1ZS5cbiAgICpcbiAgICogQW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgb25seSB1c2VkIGlmIHdoZW4gcHJvY2Vzc2VkIHRoZSBjdXJyZW50IG9wdGlvbiB2YWx1ZSBpc1xuICAgKiB1bmRlZmluZWQsIG9yIHRoZSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgdmFsdWUgaXMgJ2RlZmF1bHQnIG9yICdjb25maWcnIG9yICdlbnYnLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGVudihuYW1lKSB7XG4gICAgdGhpcy5lbnZWYXIgPSBuYW1lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VzdG9tIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgQ0xJIG9wdGlvbiBhcmd1bWVudHMgaW50byBvcHRpb24gdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgYXJnUGFyc2VyKGZuKSB7XG4gICAgdGhpcy5wYXJzZUFyZyA9IGZuO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBtYW5kYXRvcnkgYW5kIG11c3QgaGF2ZSBhIHZhbHVlIGFmdGVyIHBhcnNpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW21hbmRhdG9yeT10cnVlXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIG1ha2VPcHRpb25NYW5kYXRvcnkobWFuZGF0b3J5ID0gdHJ1ZSkge1xuICAgIHRoaXMubWFuZGF0b3J5ID0gISFtYW5kYXRvcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSBvcHRpb24gaW4gaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbaGlkZT10cnVlXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGhpZGVIZWxwKGhpZGUgPSB0cnVlKSB7XG4gICAgdGhpcy5oaWRkZW4gPSAhIWhpZGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhY2thZ2VcbiAgICovXG5cbiAgX2NvbmNhdFZhbHVlKHZhbHVlLCBwcmV2aW91cykge1xuICAgIGlmIChwcmV2aW91cyA9PT0gdGhpcy5kZWZhdWx0VmFsdWUgfHwgIUFycmF5LmlzQXJyYXkocHJldmlvdXMpKSB7XG4gICAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJldmlvdXMuY29uY2F0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IGFsbG93IG9wdGlvbiB2YWx1ZSB0byBiZSBvbmUgb2YgY2hvaWNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdmFsdWVzXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgY2hvaWNlcyh2YWx1ZXMpIHtcbiAgICB0aGlzLmFyZ0Nob2ljZXMgPSB2YWx1ZXMuc2xpY2UoKTtcbiAgICB0aGlzLnBhcnNlQXJnID0gKGFyZywgcHJldmlvdXMpID0+IHtcbiAgICAgIGlmICghdGhpcy5hcmdDaG9pY2VzLmluY2x1ZGVzKGFyZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgIGBBbGxvd2VkIGNob2ljZXMgYXJlICR7dGhpcy5hcmdDaG9pY2VzLmpvaW4oJywgJyl9LmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52YXJpYWRpYykge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uY2F0VmFsdWUoYXJnLCBwcmV2aW91cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIG9wdGlvbiBuYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIG5hbWUoKSB7XG4gICAgaWYgKHRoaXMubG9uZykge1xuICAgICAgcmV0dXJuIHRoaXMubG9uZy5yZXBsYWNlKC9eLS0vLCAnJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3J0LnJlcGxhY2UoL14tLywgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBvcHRpb24gbmFtZSwgaW4gYSBjYW1lbGNhc2UgZm9ybWF0IHRoYXQgY2FuIGJlIHVzZWRcbiAgICogYXMgYSBvYmplY3QgYXR0cmlidXRlIGtleS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBhdHRyaWJ1dGVOYW1lKCkge1xuICAgIHJldHVybiBjYW1lbGNhc2UodGhpcy5uYW1lKCkucmVwbGFjZSgvXm5vLS8sICcnKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYGFyZ2AgbWF0Y2hlcyB0aGUgc2hvcnQgb3IgbG9uZyBmbGFnLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIGlzKGFyZykge1xuICAgIHJldHVybiB0aGlzLnNob3J0ID09PSBhcmcgfHwgdGhpcy5sb25nID09PSBhcmc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgYSBib29sZWFuIG9wdGlvbi5cbiAgICpcbiAgICogT3B0aW9ucyBhcmUgb25lIG9mIGJvb2xlYW4sIG5lZ2F0ZWQsIHJlcXVpcmVkIGFyZ3VtZW50LCBvciBvcHRpb25hbCBhcmd1bWVudC5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogQHBhY2thZ2VcbiAgICovXG5cbiAgaXNCb29sZWFuKCkge1xuICAgIHJldHVybiAhdGhpcy5yZXF1aXJlZCAmJiAhdGhpcy5vcHRpb25hbCAmJiAhdGhpcy5uZWdhdGU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdvcmsgd2l0aCBkdWFsIG9wdGlvbnMsIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGV4aXN0aW5nXG4gKiBpbXBsZW1lbnRhdGlvbi4gV2Ugc3VwcG9ydCBzZXBhcmF0ZSBkdWFsIG9wdGlvbnMgZm9yIHNlcGFyYXRlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBvcHRpb25zLFxuICogbGlrZSBgLS1idWlsZGAgYW5kIGAtLW5vLWJ1aWxkYCwgd2hpY2ggc2hhcmUgYSBzaW5nbGUgb3B0aW9uIHZhbHVlLiBUaGlzIHdvcmtzIG5pY2VseSBmb3Igc29tZVxuICogdXNlIGNhc2VzLCBidXQgaXMgdHJpY2t5IGZvciBvdGhlcnMgd2hlcmUgd2Ugd2FudCBzZXBhcmF0ZSBiZWhhdmlvdXJzIGRlc3BpdGVcbiAqIHRoZSBzaW5nbGUgc2hhcmVkIG9wdGlvbiB2YWx1ZS5cbiAqL1xuY2xhc3MgRHVhbE9wdGlvbnMge1xuICAvKipcbiAgICogQHBhcmFtIHtPcHRpb25bXX0gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHRoaXMucG9zaXRpdmVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgIHRoaXMubmVnYXRpdmVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZHVhbE9wdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgIGlmIChvcHRpb24ubmVnYXRlKSB7XG4gICAgICAgIHRoaXMubmVnYXRpdmVPcHRpb25zLnNldChvcHRpb24uYXR0cmlidXRlTmFtZSgpLCBvcHRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3NpdGl2ZU9wdGlvbnMuc2V0KG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCksIG9wdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5uZWdhdGl2ZU9wdGlvbnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgaWYgKHRoaXMucG9zaXRpdmVPcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuZHVhbE9wdGlvbnMuYWRkKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlkIHRoZSB2YWx1ZSBjb21lIGZyb20gdGhlIG9wdGlvbiwgYW5kIG5vdCBmcm9tIHBvc3NpYmxlIG1hdGNoaW5nIGR1YWwgb3B0aW9uP1xuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICB2YWx1ZUZyb21PcHRpb24odmFsdWUsIG9wdGlvbikge1xuICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgaWYgKCF0aGlzLmR1YWxPcHRpb25zLmhhcyhvcHRpb25LZXkpKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIFVzZSB0aGUgdmFsdWUgdG8gZGVkdWNlIGlmIChwcm9iYWJseSkgY2FtZSBmcm9tIHRoZSBvcHRpb24uXG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5uZWdhdGl2ZU9wdGlvbnMuZ2V0KG9wdGlvbktleSkucHJlc2V0QXJnO1xuICAgIGNvbnN0IG5lZ2F0aXZlVmFsdWUgPSBwcmVzZXQgIT09IHVuZGVmaW5lZCA/IHByZXNldCA6IGZhbHNlO1xuICAgIHJldHVybiBvcHRpb24ubmVnYXRlID09PSAobmVnYXRpdmVWYWx1ZSA9PT0gdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBzdHJpbmcgZnJvbSBrZWJhYi1jYXNlIHRvIGNhbWVsQ2FzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNhbWVsY2FzZShzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgnLScpLnJlZHVjZSgoc3RyLCB3b3JkKSA9PiB7XG4gICAgcmV0dXJuIHN0ciArIHdvcmRbMF0udG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNwbGl0IHRoZSBzaG9ydCBhbmQgbG9uZyBmbGFnIG91dCBvZiBzb21ldGhpbmcgbGlrZSAnLW0sLS1taXhlZCA8dmFsdWU+J1xuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BsaXRPcHRpb25GbGFncyhmbGFncykge1xuICBsZXQgc2hvcnRGbGFnO1xuICBsZXQgbG9uZ0ZsYWc7XG4gIC8vIFVzZSBvcmlnaW5hbCB2ZXJ5IGxvb3NlIHBhcnNpbmcgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG5vdyxcbiAgLy8gd2hpY2ggYWxsb3dlZCBmb3IgZXhhbXBsZSB1bmludGVuZGVkIGAtc3csIC0tc2hvcnQtd29yZGAgW3NpY10uXG4gIGNvbnN0IGZsYWdQYXJ0cyA9IGZsYWdzLnNwbGl0KC9bIHwsXSsvKTtcbiAgaWYgKGZsYWdQYXJ0cy5sZW5ndGggPiAxICYmICEvXltbPF0vLnRlc3QoZmxhZ1BhcnRzWzFdKSlcbiAgICBzaG9ydEZsYWcgPSBmbGFnUGFydHMuc2hpZnQoKTtcbiAgbG9uZ0ZsYWcgPSBmbGFnUGFydHMuc2hpZnQoKTtcbiAgLy8gQWRkIHN1cHBvcnQgZm9yIGxvbmUgc2hvcnQgZmxhZyB3aXRob3V0IHNpZ25pZmljYW50bHkgY2hhbmdpbmcgcGFyc2luZyFcbiAgaWYgKCFzaG9ydEZsYWcgJiYgL14tW14tXSQvLnRlc3QobG9uZ0ZsYWcpKSB7XG4gICAgc2hvcnRGbGFnID0gbG9uZ0ZsYWc7XG4gICAgbG9uZ0ZsYWcgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc2hvcnRGbGFnLCBsb25nRmxhZyB9O1xufVxuXG5leHBvcnRzLk9wdGlvbiA9IE9wdGlvbjtcbmV4cG9ydHMuRHVhbE9wdGlvbnMgPSBEdWFsT3B0aW9ucztcbiIsImNvbnN0IG1heERpc3RhbmNlID0gMztcblxuZnVuY3Rpb24gZWRpdERpc3RhbmNlKGEsIGIpIHtcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGFtZXJhdeKAk0xldmVuc2h0ZWluX2Rpc3RhbmNlXG4gIC8vIENhbGN1bGF0aW5nIG9wdGltYWwgc3RyaW5nIGFsaWdubWVudCBkaXN0YW5jZSwgbm8gc3Vic3RyaW5nIGlzIGVkaXRlZCBtb3JlIHRoYW4gb25jZS5cbiAgLy8gKFNpbXBsZSBpbXBsZW1lbnRhdGlvbi4pXG5cbiAgLy8gUXVpY2sgZWFybHkgZXhpdCwgcmV0dXJuIHdvcnN0IGNhc2UuXG4gIGlmIChNYXRoLmFicyhhLmxlbmd0aCAtIGIubGVuZ3RoKSA+IG1heERpc3RhbmNlKVxuICAgIHJldHVybiBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuXG4gIC8vIGRpc3RhbmNlIGJldHdlZW4gcHJlZml4IHN1YnN0cmluZ3Mgb2YgYSBhbmQgYlxuICBjb25zdCBkID0gW107XG5cbiAgLy8gcHVyZSBkZWxldGlvbnMgdHVybiBhIGludG8gZW1wdHkgc3RyaW5nXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IGEubGVuZ3RoOyBpKyspIHtcbiAgICBkW2ldID0gW2ldO1xuICB9XG4gIC8vIHB1cmUgaW5zZXJ0aW9ucyB0dXJuIGVtcHR5IHN0cmluZyBpbnRvIGJcbiAgZm9yIChsZXQgaiA9IDA7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIGRbMF1bal0gPSBqO1xuICB9XG5cbiAgLy8gZmlsbCBtYXRyaXhcbiAgZm9yIChsZXQgaiA9IDE7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjb3N0ID0gMTtcbiAgICAgIGlmIChhW2kgLSAxXSA9PT0gYltqIC0gMV0pIHtcbiAgICAgICAgY29zdCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3N0ID0gMTtcbiAgICAgIH1cbiAgICAgIGRbaV1bal0gPSBNYXRoLm1pbihcbiAgICAgICAgZFtpIC0gMV1bal0gKyAxLCAvLyBkZWxldGlvblxuICAgICAgICBkW2ldW2ogLSAxXSArIDEsIC8vIGluc2VydGlvblxuICAgICAgICBkW2kgLSAxXVtqIC0gMV0gKyBjb3N0LCAvLyBzdWJzdGl0dXRpb25cbiAgICAgICk7XG4gICAgICAvLyB0cmFuc3Bvc2l0aW9uXG4gICAgICBpZiAoaSA+IDEgJiYgaiA+IDEgJiYgYVtpIC0gMV0gPT09IGJbaiAtIDJdICYmIGFbaSAtIDJdID09PSBiW2ogLSAxXSkge1xuICAgICAgICBkW2ldW2pdID0gTWF0aC5taW4oZFtpXVtqXSwgZFtpIC0gMl1baiAtIDJdICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRbYS5sZW5ndGhdW2IubGVuZ3RoXTtcbn1cblxuLyoqXG4gKiBGaW5kIGNsb3NlIG1hdGNoZXMsIHJlc3RyaWN0ZWQgdG8gc2FtZSBudW1iZXIgb2YgZWRpdHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IGNhbmRpZGF0ZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gc3VnZ2VzdFNpbWlsYXIod29yZCwgY2FuZGlkYXRlcykge1xuICBpZiAoIWNhbmRpZGF0ZXMgfHwgY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgLy8gcmVtb3ZlIHBvc3NpYmxlIGR1cGxpY2F0ZXNcbiAgY2FuZGlkYXRlcyA9IEFycmF5LmZyb20obmV3IFNldChjYW5kaWRhdGVzKSk7XG5cbiAgY29uc3Qgc2VhcmNoaW5nT3B0aW9ucyA9IHdvcmQuc3RhcnRzV2l0aCgnLS0nKTtcbiAgaWYgKHNlYXJjaGluZ09wdGlvbnMpIHtcbiAgICB3b3JkID0gd29yZC5zbGljZSgyKTtcbiAgICBjYW5kaWRhdGVzID0gY2FuZGlkYXRlcy5tYXAoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnNsaWNlKDIpKTtcbiAgfVxuXG4gIGxldCBzaW1pbGFyID0gW107XG4gIGxldCBiZXN0RGlzdGFuY2UgPSBtYXhEaXN0YW5jZTtcbiAgY29uc3QgbWluU2ltaWxhcml0eSA9IDAuNDtcbiAgY2FuZGlkYXRlcy5mb3JFYWNoKChjYW5kaWRhdGUpID0+IHtcbiAgICBpZiAoY2FuZGlkYXRlLmxlbmd0aCA8PSAxKSByZXR1cm47IC8vIG5vIG9uZSBjaGFyYWN0ZXIgZ3Vlc3Nlc1xuXG4gICAgY29uc3QgZGlzdGFuY2UgPSBlZGl0RGlzdGFuY2Uod29yZCwgY2FuZGlkYXRlKTtcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCh3b3JkLmxlbmd0aCwgY2FuZGlkYXRlLmxlbmd0aCk7XG4gICAgY29uc3Qgc2ltaWxhcml0eSA9IChsZW5ndGggLSBkaXN0YW5jZSkgLyBsZW5ndGg7XG4gICAgaWYgKHNpbWlsYXJpdHkgPiBtaW5TaW1pbGFyaXR5KSB7XG4gICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgLy8gYmV0dGVyIGVkaXQgZGlzdGFuY2UsIHRocm93IGF3YXkgcHJldmlvdXMgd29yc2UgbWF0Y2hlc1xuICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgc2ltaWxhciA9IFtjYW5kaWRhdGVdO1xuICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA9PT0gYmVzdERpc3RhbmNlKSB7XG4gICAgICAgIHNpbWlsYXIucHVzaChjYW5kaWRhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgc2ltaWxhci5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBpZiAoc2VhcmNoaW5nT3B0aW9ucykge1xuICAgIHNpbWlsYXIgPSBzaW1pbGFyLm1hcCgoY2FuZGlkYXRlKSA9PiBgLS0ke2NhbmRpZGF0ZX1gKTtcbiAgfVxuXG4gIGlmIChzaW1pbGFyLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gYFxcbihEaWQgeW91IG1lYW4gb25lIG9mICR7c2ltaWxhci5qb2luKCcsICcpfT8pYDtcbiAgfVxuICBpZiAoc2ltaWxhci5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYFxcbihEaWQgeW91IG1lYW4gJHtzaW1pbGFyWzBdfT8pYDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydHMuc3VnZ2VzdFNpbWlsYXIgPSBzdWdnZXN0U2ltaWxhcjtcbiIsImNvbnN0IHBlcmYgPVxuICB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmXG4gIHBlcmZvcm1hbmNlICYmXG4gIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbidcbiAgICA/IHBlcmZvcm1hbmNlXG4gICAgOiBEYXRlXG5cbmNvbnN0IGhhc0Fib3J0Q29udHJvbGxlciA9IHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgPT09ICdmdW5jdGlvbidcblxuLy8gbWluaW1hbCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBwb2x5ZmlsbFxuLy8gdGhpcyBkb2Vzbid0IGhhdmUgbmVhcmx5IGFsbCB0aGUgY2hlY2tzIGFuZCB3aGF0bm90IHRoYXRcbi8vIGFjdHVhbCBBYm9ydENvbnRyb2xsZXIvU2lnbmFsIGhhcywgYnV0IGl0J3MgZW5vdWdoIGZvclxuLy8gb3VyIHB1cnBvc2VzLCBhbmQgaWYgdXNlZCBwcm9wZXJseSwgYmVoYXZlcyB0aGUgc2FtZS5cbmNvbnN0IEFDID0gaGFzQWJvcnRDb250cm9sbGVyXG4gID8gQWJvcnRDb250cm9sbGVyXG4gIDogY2xhc3MgQWJvcnRDb250cm9sbGVyIHtcbiAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNpZ25hbCA9IG5ldyBBUygpXG4gICAgICB9XG4gICAgICBhYm9ydChyZWFzb24gPSBuZXcgRXJyb3IoJ1RoaXMgb3BlcmF0aW9uIHdhcyBhYm9ydGVkJykpIHtcbiAgICAgICAgdGhpcy5zaWduYWwucmVhc29uID0gdGhpcy5zaWduYWwucmVhc29uIHx8IHJlYXNvblxuICAgICAgICB0aGlzLnNpZ25hbC5hYm9ydGVkID0gdHJ1ZVxuICAgICAgICB0aGlzLnNpZ25hbC5kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnYWJvcnQnLFxuICAgICAgICAgIHRhcmdldDogdGhpcy5zaWduYWwsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG5jb25zdCBoYXNBYm9ydFNpZ25hbCA9IHR5cGVvZiBBYm9ydFNpZ25hbCA9PT0gJ2Z1bmN0aW9uJ1xuLy8gU29tZSBwb2x5ZmlsbHMgcHV0IHRoaXMgb24gdGhlIEFDIGNsYXNzLCBub3QgZ2xvYmFsXG5jb25zdCBoYXNBQ0Fib3J0U2lnbmFsID0gdHlwZW9mIEFDLkFib3J0U2lnbmFsID09PSAnZnVuY3Rpb24nXG5jb25zdCBBUyA9IGhhc0Fib3J0U2lnbmFsXG4gID8gQWJvcnRTaWduYWxcbiAgOiBoYXNBQ0Fib3J0U2lnbmFsXG4gID8gQUMuQWJvcnRDb250cm9sbGVyXG4gIDogY2xhc3MgQWJvcnRTaWduYWwge1xuICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucmVhc29uID0gdW5kZWZpbmVkXG4gICAgICAgIHRoaXMuYWJvcnRlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdXG4gICAgICB9XG4gICAgICBkaXNwYXRjaEV2ZW50KGUpIHtcbiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWVcbiAgICAgICAgICB0aGlzLm9uYWJvcnQoZSlcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaChmID0+IGYoZSksIHRoaXMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uYWJvcnQoKSB7fVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihldiwgZm4pIHtcbiAgICAgICAgaWYgKGV2ID09PSAnYWJvcnQnKSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2goZm4pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoZXYsIGZuKSB7XG4gICAgICAgIGlmIChldiA9PT0gJ2Fib3J0Jykge1xuICAgICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycy5maWx0ZXIoZiA9PiBmICE9PSBmbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuY29uc3Qgd2FybmVkID0gbmV3IFNldCgpXG5jb25zdCBkZXByZWNhdGVkT3B0aW9uID0gKG9wdCwgaW5zdGVhZCkgPT4ge1xuICBjb25zdCBjb2RlID0gYExSVV9DQUNIRV9PUFRJT05fJHtvcHR9YFxuICBpZiAoc2hvdWxkV2Fybihjb2RlKSkge1xuICAgIHdhcm4oY29kZSwgYCR7b3B0fSBvcHRpb25gLCBgb3B0aW9ucy4ke2luc3RlYWR9YCwgTFJVQ2FjaGUpXG4gIH1cbn1cbmNvbnN0IGRlcHJlY2F0ZWRNZXRob2QgPSAobWV0aG9kLCBpbnN0ZWFkKSA9PiB7XG4gIGNvbnN0IGNvZGUgPSBgTFJVX0NBQ0hFX01FVEhPRF8ke21ldGhvZH1gXG4gIGlmIChzaG91bGRXYXJuKGNvZGUpKSB7XG4gICAgY29uc3QgeyBwcm90b3R5cGUgfSA9IExSVUNhY2hlXG4gICAgY29uc3QgeyBnZXQgfSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBtZXRob2QpXG4gICAgd2Fybihjb2RlLCBgJHttZXRob2R9IG1ldGhvZGAsIGBjYWNoZS4ke2luc3RlYWR9KClgLCBnZXQpXG4gIH1cbn1cbmNvbnN0IGRlcHJlY2F0ZWRQcm9wZXJ0eSA9IChmaWVsZCwgaW5zdGVhZCkgPT4ge1xuICBjb25zdCBjb2RlID0gYExSVV9DQUNIRV9QUk9QRVJUWV8ke2ZpZWxkfWBcbiAgaWYgKHNob3VsZFdhcm4oY29kZSkpIHtcbiAgICBjb25zdCB7IHByb3RvdHlwZSB9ID0gTFJVQ2FjaGVcbiAgICBjb25zdCB7IGdldCB9ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIGZpZWxkKVxuICAgIHdhcm4oY29kZSwgYCR7ZmllbGR9IHByb3BlcnR5YCwgYGNhY2hlLiR7aW5zdGVhZH1gLCBnZXQpXG4gIH1cbn1cblxuY29uc3QgZW1pdFdhcm5pbmcgPSAoLi4uYSkgPT4ge1xuICB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgcHJvY2VzcyAmJlxuICB0eXBlb2YgcHJvY2Vzcy5lbWl0V2FybmluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gcHJvY2Vzcy5lbWl0V2FybmluZyguLi5hKVxuICAgIDogY29uc29sZS5lcnJvciguLi5hKVxufVxuXG5jb25zdCBzaG91bGRXYXJuID0gY29kZSA9PiAhd2FybmVkLmhhcyhjb2RlKVxuXG5jb25zdCB3YXJuID0gKGNvZGUsIHdoYXQsIGluc3RlYWQsIGZuKSA9PiB7XG4gIHdhcm5lZC5hZGQoY29kZSlcbiAgY29uc3QgbXNnID0gYFRoZSAke3doYXR9IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJHtpbnN0ZWFkfSBpbnN0ZWFkLmBcbiAgZW1pdFdhcm5pbmcobXNnLCAnRGVwcmVjYXRpb25XYXJuaW5nJywgY29kZSwgZm4pXG59XG5cbmNvbnN0IGlzUG9zSW50ID0gbiA9PiBuICYmIG4gPT09IE1hdGguZmxvb3IobikgJiYgbiA+IDAgJiYgaXNGaW5pdGUobilcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgLSBUaGlzIGlzIGEgbGl0dGxlIGJpdCByaWRpY3Vsb3VzLCB0YmguXG4gKiBUaGUgbWF4aW11bSBhcnJheSBsZW5ndGggaXMgMl4zMi0xIG9yIHRoZXJlYWJvdXRzIG9uIG1vc3QgSlMgaW1wbHMuXG4gKiBBbmQgd2VsbCBiZWZvcmUgdGhhdCBwb2ludCwgeW91J3JlIGNhY2hpbmcgdGhlIGVudGlyZSB3b3JsZCwgSSBtZWFuLFxuICogdGhhdCdzIH4zMkdCIG9mIGp1c3QgaW50ZWdlcnMgZm9yIHRoZSBuZXh0L3ByZXYgbGlua3MsIHBsdXMgd2hhdGV2ZXJcbiAqIGVsc2UgdG8gaG9sZCB0aGF0IG1hbnkga2V5cyBhbmQgdmFsdWVzLiAgSnVzdCBmaWxsaW5nIHRoZSBtZW1vcnkgd2l0aFxuICogemVyb2VzIGF0IGluaXQgdGltZSBpcyBicnV0YWwgd2hlbiB5b3UgZ2V0IHRoYXQgYmlnLlxuICogQnV0IHdoeSBub3QgYmUgY29tcGxldGU/XG4gKiBNYXliZSBpbiB0aGUgZnV0dXJlLCB0aGVzZSBsaW1pdHMgd2lsbCBoYXZlIGV4cGFuZGVkLiAqL1xuY29uc3QgZ2V0VWludEFycmF5ID0gbWF4ID0+XG4gICFpc1Bvc0ludChtYXgpXG4gICAgPyBudWxsXG4gICAgOiBtYXggPD0gTWF0aC5wb3coMiwgOClcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IG1heCA8PSBNYXRoLnBvdygyLCAxNilcbiAgICA/IFVpbnQxNkFycmF5XG4gICAgOiBtYXggPD0gTWF0aC5wb3coMiwgMzIpXG4gICAgPyBVaW50MzJBcnJheVxuICAgIDogbWF4IDw9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG4gICAgPyBaZXJvQXJyYXlcbiAgICA6IG51bGxcblxuY2xhc3MgWmVyb0FycmF5IGV4dGVuZHMgQXJyYXkge1xuICBjb25zdHJ1Y3RvcihzaXplKSB7XG4gICAgc3VwZXIoc2l6ZSlcbiAgICB0aGlzLmZpbGwoMClcbiAgfVxufVxuXG5jbGFzcyBTdGFjayB7XG4gIGNvbnN0cnVjdG9yKG1heCkge1xuICAgIGlmIChtYXggPT09IDApIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgICBjb25zdCBVaW50QXJyYXkgPSBnZXRVaW50QXJyYXkobWF4KVxuICAgIHRoaXMuaGVhcCA9IG5ldyBVaW50QXJyYXkobWF4KVxuICAgIHRoaXMubGVuZ3RoID0gMFxuICB9XG4gIHB1c2gobikge1xuICAgIHRoaXMuaGVhcFt0aGlzLmxlbmd0aCsrXSA9IG5cbiAgfVxuICBwb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVhcFstLXRoaXMubGVuZ3RoXVxuICB9XG59XG5cbmNsYXNzIExSVUNhY2hlIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgbWF4ID0gMCxcbiAgICAgIHR0bCxcbiAgICAgIHR0bFJlc29sdXRpb24gPSAxLFxuICAgICAgdHRsQXV0b3B1cmdlLFxuICAgICAgdXBkYXRlQWdlT25HZXQsXG4gICAgICB1cGRhdGVBZ2VPbkhhcyxcbiAgICAgIGFsbG93U3RhbGUsXG4gICAgICBkaXNwb3NlLFxuICAgICAgZGlzcG9zZUFmdGVyLFxuICAgICAgbm9EaXNwb3NlT25TZXQsXG4gICAgICBub1VwZGF0ZVRUTCxcbiAgICAgIG1heFNpemUgPSAwLFxuICAgICAgbWF4RW50cnlTaXplID0gMCxcbiAgICAgIHNpemVDYWxjdWxhdGlvbixcbiAgICAgIGZldGNoTWV0aG9kLFxuICAgICAgZmV0Y2hDb250ZXh0LFxuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgbm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0LFxuICAgICAgaWdub3JlRmV0Y2hBYm9ydCxcbiAgICB9ID0gb3B0aW9uc1xuXG4gICAgLy8gZGVwcmVjYXRlZCBvcHRpb25zLCBkb24ndCB0cmlnZ2VyIGEgd2FybmluZyBmb3IgZ2V0dGluZyB0aGVtIGlmXG4gICAgLy8gdGhlIHRoaW5nIGJlaW5nIHBhc3NlZCBpbiBpcyBhbm90aGVyIExSVUNhY2hlIHdlJ3JlIGNvcHlpbmcuXG4gICAgY29uc3QgeyBsZW5ndGgsIG1heEFnZSwgc3RhbGUgfSA9XG4gICAgICBvcHRpb25zIGluc3RhbmNlb2YgTFJVQ2FjaGUgPyB7fSA6IG9wdGlvbnNcblxuICAgIGlmIChtYXggIT09IDAgJiYgIWlzUG9zSW50KG1heCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heCBvcHRpb24gbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXInKVxuICAgIH1cblxuICAgIGNvbnN0IFVpbnRBcnJheSA9IG1heCA/IGdldFVpbnRBcnJheShtYXgpIDogQXJyYXlcbiAgICBpZiAoIVVpbnRBcnJheSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heCB2YWx1ZTogJyArIG1heClcbiAgICB9XG5cbiAgICB0aGlzLm1heCA9IG1heFxuICAgIHRoaXMubWF4U2l6ZSA9IG1heFNpemVcbiAgICB0aGlzLm1heEVudHJ5U2l6ZSA9IG1heEVudHJ5U2l6ZSB8fCB0aGlzLm1heFNpemVcbiAgICB0aGlzLnNpemVDYWxjdWxhdGlvbiA9IHNpemVDYWxjdWxhdGlvbiB8fCBsZW5ndGhcbiAgICBpZiAodGhpcy5zaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgIGlmICghdGhpcy5tYXhTaXplICYmICF0aGlzLm1heEVudHJ5U2l6ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdjYW5ub3Qgc2V0IHNpemVDYWxjdWxhdGlvbiB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUnXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5zaXplQ2FsY3VsYXRpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZUNhbGN1bGF0aW9uIHNldCB0byBub24tZnVuY3Rpb24nKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZmV0Y2hNZXRob2QgPSBmZXRjaE1ldGhvZCB8fCBudWxsXG4gICAgaWYgKHRoaXMuZmV0Y2hNZXRob2QgJiYgdHlwZW9mIHRoaXMuZmV0Y2hNZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdmZXRjaE1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgc3BlY2lmaWVkJ1xuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuZmV0Y2hDb250ZXh0ID0gZmV0Y2hDb250ZXh0XG4gICAgaWYgKCF0aGlzLmZldGNoTWV0aG9kICYmIGZldGNoQ29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnY2Fubm90IHNldCBmZXRjaENvbnRleHQgd2l0aG91dCBmZXRjaE1ldGhvZCdcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLmtleU1hcCA9IG5ldyBNYXAoKVxuICAgIHRoaXMua2V5TGlzdCA9IG5ldyBBcnJheShtYXgpLmZpbGwobnVsbClcbiAgICB0aGlzLnZhbExpc3QgPSBuZXcgQXJyYXkobWF4KS5maWxsKG51bGwpXG4gICAgdGhpcy5uZXh0ID0gbmV3IFVpbnRBcnJheShtYXgpXG4gICAgdGhpcy5wcmV2ID0gbmV3IFVpbnRBcnJheShtYXgpXG4gICAgdGhpcy5oZWFkID0gMFxuICAgIHRoaXMudGFpbCA9IDBcbiAgICB0aGlzLmZyZWUgPSBuZXcgU3RhY2sobWF4KVxuICAgIHRoaXMuaW5pdGlhbEZpbGwgPSAxXG4gICAgdGhpcy5zaXplID0gMFxuXG4gICAgaWYgKHR5cGVvZiBkaXNwb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmRpc3Bvc2UgPSBkaXNwb3NlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZUFmdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmRpc3Bvc2VBZnRlciA9IGRpc3Bvc2VBZnRlclxuICAgICAgdGhpcy5kaXNwb3NlZCA9IFtdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcG9zZUFmdGVyID0gbnVsbFxuICAgICAgdGhpcy5kaXNwb3NlZCA9IG51bGxcbiAgICB9XG4gICAgdGhpcy5ub0Rpc3Bvc2VPblNldCA9ICEhbm9EaXNwb3NlT25TZXRcbiAgICB0aGlzLm5vVXBkYXRlVFRMID0gISFub1VwZGF0ZVRUTFxuICAgIHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gISFub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb25cbiAgICB0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uID0gISFhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvblxuICAgIHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCA9ICEhYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydFxuICAgIHRoaXMuaWdub3JlRmV0Y2hBYm9ydCA9ICEhaWdub3JlRmV0Y2hBYm9ydFxuXG4gICAgLy8gTkI6IG1heEVudHJ5U2l6ZSBpcyBzZXQgdG8gbWF4U2l6ZSBpZiBpdCdzIHNldFxuICAgIGlmICh0aGlzLm1heEVudHJ5U2l6ZSAhPT0gMCkge1xuICAgICAgaWYgKHRoaXMubWF4U2l6ZSAhPT0gMCkge1xuICAgICAgICBpZiAoIWlzUG9zSW50KHRoaXMubWF4U2l6ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ21heFNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkJ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLm1heEVudHJ5U2l6ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAnbWF4RW50cnlTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCdcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgdGhpcy5pbml0aWFsaXplU2l6ZVRyYWNraW5nKClcbiAgICB9XG5cbiAgICB0aGlzLmFsbG93U3RhbGUgPSAhIWFsbG93U3RhbGUgfHwgISFzdGFsZVxuICAgIHRoaXMubm9EZWxldGVPblN0YWxlR2V0ID0gISFub0RlbGV0ZU9uU3RhbGVHZXRcbiAgICB0aGlzLnVwZGF0ZUFnZU9uR2V0ID0gISF1cGRhdGVBZ2VPbkdldFxuICAgIHRoaXMudXBkYXRlQWdlT25IYXMgPSAhIXVwZGF0ZUFnZU9uSGFzXG4gICAgdGhpcy50dGxSZXNvbHV0aW9uID1cbiAgICAgIGlzUG9zSW50KHR0bFJlc29sdXRpb24pIHx8IHR0bFJlc29sdXRpb24gPT09IDBcbiAgICAgICAgPyB0dGxSZXNvbHV0aW9uXG4gICAgICAgIDogMVxuICAgIHRoaXMudHRsQXV0b3B1cmdlID0gISF0dGxBdXRvcHVyZ2VcbiAgICB0aGlzLnR0bCA9IHR0bCB8fCBtYXhBZ2UgfHwgMFxuICAgIGlmICh0aGlzLnR0bCkge1xuICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLnR0bCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAndHRsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCdcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgdGhpcy5pbml0aWFsaXplVFRMVHJhY2tpbmcoKVxuICAgIH1cblxuICAgIC8vIGRvIG5vdCBhbGxvdyBjb21wbGV0ZWx5IHVuYm91bmRlZCBjYWNoZXNcbiAgICBpZiAodGhpcy5tYXggPT09IDAgJiYgdGhpcy50dGwgPT09IDAgJiYgdGhpcy5tYXhTaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQXQgbGVhc3Qgb25lIG9mIG1heCwgbWF4U2l6ZSwgb3IgdHRsIGlzIHJlcXVpcmVkJ1xuICAgICAgKVxuICAgIH1cbiAgICBpZiAoIXRoaXMudHRsQXV0b3B1cmdlICYmICF0aGlzLm1heCAmJiAhdGhpcy5tYXhTaXplKSB7XG4gICAgICBjb25zdCBjb2RlID0gJ0xSVV9DQUNIRV9VTkJPVU5ERUQnXG4gICAgICBpZiAoc2hvdWxkV2Fybihjb2RlKSkge1xuICAgICAgICB3YXJuZWQuYWRkKGNvZGUpXG4gICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgJ1RUTCBjYWNoaW5nIHdpdGhvdXQgdHRsQXV0b3B1cmdlLCBtYXgsIG9yIG1heFNpemUgY2FuICcgK1xuICAgICAgICAgICdyZXN1bHQgaW4gdW5ib3VuZGVkIG1lbW9yeSBjb25zdW1wdGlvbi4nXG4gICAgICAgIGVtaXRXYXJuaW5nKG1zZywgJ1VuYm91bmRlZENhY2hlV2FybmluZycsIGNvZGUsIExSVUNhY2hlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGFsZSkge1xuICAgICAgZGVwcmVjYXRlZE9wdGlvbignc3RhbGUnLCAnYWxsb3dTdGFsZScpXG4gICAgfVxuICAgIGlmIChtYXhBZ2UpIHtcbiAgICAgIGRlcHJlY2F0ZWRPcHRpb24oJ21heEFnZScsICd0dGwnKVxuICAgIH1cbiAgICBpZiAobGVuZ3RoKSB7XG4gICAgICBkZXByZWNhdGVkT3B0aW9uKCdsZW5ndGgnLCAnc2l6ZUNhbGN1bGF0aW9uJylcbiAgICB9XG4gIH1cblxuICBnZXRSZW1haW5pbmdUVEwoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzKGtleSwgeyB1cGRhdGVBZ2VPbkhhczogZmFsc2UgfSkgPyBJbmZpbml0eSA6IDBcbiAgfVxuXG4gIGluaXRpYWxpemVUVExUcmFja2luZygpIHtcbiAgICB0aGlzLnR0bHMgPSBuZXcgWmVyb0FycmF5KHRoaXMubWF4KVxuICAgIHRoaXMuc3RhcnRzID0gbmV3IFplcm9BcnJheSh0aGlzLm1heClcblxuICAgIHRoaXMuc2V0SXRlbVRUTCA9IChpbmRleCwgdHRsLCBzdGFydCA9IHBlcmYubm93KCkpID0+IHtcbiAgICAgIHRoaXMuc3RhcnRzW2luZGV4XSA9IHR0bCAhPT0gMCA/IHN0YXJ0IDogMFxuICAgICAgdGhpcy50dGxzW2luZGV4XSA9IHR0bFxuICAgICAgaWYgKHR0bCAhPT0gMCAmJiB0aGlzLnR0bEF1dG9wdXJnZSkge1xuICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNTdGFsZShpbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlKHRoaXMua2V5TGlzdFtpbmRleF0pXG4gICAgICAgICAgfVxuICAgICAgICB9LCB0dGwgKyAxKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAtIHVucmVmKCkgbm90IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zICovXG4gICAgICAgIGlmICh0LnVucmVmKSB7XG4gICAgICAgICAgdC51bnJlZigpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUl0ZW1BZ2UgPSBpbmRleCA9PiB7XG4gICAgICB0aGlzLnN0YXJ0c1tpbmRleF0gPSB0aGlzLnR0bHNbaW5kZXhdICE9PSAwID8gcGVyZi5ub3coKSA6IDBcbiAgICB9XG5cbiAgICB0aGlzLnN0YXR1c1RUTCA9IChzdGF0dXMsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy50dGwgPSB0aGlzLnR0bHNbaW5kZXhdXG4gICAgICAgIHN0YXR1cy5zdGFydCA9IHRoaXMuc3RhcnRzW2luZGV4XVxuICAgICAgICBzdGF0dXMubm93ID0gY2FjaGVkTm93IHx8IGdldE5vdygpXG4gICAgICAgIHN0YXR1cy5yZW1haW5pbmdUVEwgPSBzdGF0dXMubm93ICsgc3RhdHVzLnR0bCAtIHN0YXR1cy5zdGFydFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRlYm91bmNlIGNhbGxzIHRvIHBlcmYubm93KCkgdG8gMXMgc28gd2UncmUgbm90IGhpdHRpbmdcbiAgICAvLyB0aGF0IGNvc3RseSBjYWxsIHJlcGVhdGVkbHkuXG4gICAgbGV0IGNhY2hlZE5vdyA9IDBcbiAgICBjb25zdCBnZXROb3cgPSAoKSA9PiB7XG4gICAgICBjb25zdCBuID0gcGVyZi5ub3coKVxuICAgICAgaWYgKHRoaXMudHRsUmVzb2x1dGlvbiA+IDApIHtcbiAgICAgICAgY2FjaGVkTm93ID0gblxuICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dChcbiAgICAgICAgICAoKSA9PiAoY2FjaGVkTm93ID0gMCksXG4gICAgICAgICAgdGhpcy50dGxSZXNvbHV0aW9uXG4gICAgICAgIClcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgLSBub3QgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgKi9cbiAgICAgICAgaWYgKHQudW5yZWYpIHtcbiAgICAgICAgICB0LnVucmVmKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5cbiAgICB9XG5cbiAgICB0aGlzLmdldFJlbWFpbmluZ1RUTCA9IGtleSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMua2V5TWFwLmdldChrZXkpXG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudHRsc1tpbmRleF0gPT09IDAgfHwgdGhpcy5zdGFydHNbaW5kZXhdID09PSAwXG4gICAgICAgID8gSW5maW5pdHlcbiAgICAgICAgOiB0aGlzLnN0YXJ0c1tpbmRleF0gK1xuICAgICAgICAgICAgdGhpcy50dGxzW2luZGV4XSAtXG4gICAgICAgICAgICAoY2FjaGVkTm93IHx8IGdldE5vdygpKVxuICAgIH1cblxuICAgIHRoaXMuaXNTdGFsZSA9IGluZGV4ID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMudHRsc1tpbmRleF0gIT09IDAgJiZcbiAgICAgICAgdGhpcy5zdGFydHNbaW5kZXhdICE9PSAwICYmXG4gICAgICAgIChjYWNoZWROb3cgfHwgZ2V0Tm93KCkpIC0gdGhpcy5zdGFydHNbaW5kZXhdID5cbiAgICAgICAgICB0aGlzLnR0bHNbaW5kZXhdXG4gICAgICApXG4gICAgfVxuICB9XG4gIHVwZGF0ZUl0ZW1BZ2UoX2luZGV4KSB7fVxuICBzdGF0dXNUVEwoX3N0YXR1cywgX2luZGV4KSB7fVxuICBzZXRJdGVtVFRMKF9pbmRleCwgX3R0bCwgX3N0YXJ0KSB7fVxuICBpc1N0YWxlKF9pbmRleCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaW5pdGlhbGl6ZVNpemVUcmFja2luZygpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZWRTaXplID0gMFxuICAgIHRoaXMuc2l6ZXMgPSBuZXcgWmVyb0FycmF5KHRoaXMubWF4KVxuICAgIHRoaXMucmVtb3ZlSXRlbVNpemUgPSBpbmRleCA9PiB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZWRTaXplIC09IHRoaXMuc2l6ZXNbaW5kZXhdXG4gICAgICB0aGlzLnNpemVzW2luZGV4XSA9IDBcbiAgICB9XG4gICAgdGhpcy5yZXF1aXJlU2l6ZSA9IChrLCB2LCBzaXplLCBzaXplQ2FsY3VsYXRpb24pID0+IHtcbiAgICAgIC8vIHByb3Zpc2lvbmFsbHkgYWNjZXB0IGJhY2tncm91bmQgZmV0Y2hlcy5cbiAgICAgIC8vIGFjdHVhbCB2YWx1ZSBzaXplIHdpbGwgYmUgY2hlY2tlZCB3aGVuIHRoZXkgcmV0dXJuLlxuICAgICAgaWYgKHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cbiAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgaWYgKHNpemVDYWxjdWxhdGlvbikge1xuICAgICAgICAgIGlmICh0eXBlb2Ygc2l6ZUNhbGN1bGF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplQ2FsY3VsYXRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uJylcbiAgICAgICAgICB9XG4gICAgICAgICAgc2l6ZSA9IHNpemVDYWxjdWxhdGlvbih2LCBrKVxuICAgICAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICdzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKSdcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdpbnZhbGlkIHNpemUgdmFsdWUgKG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcikuICcgK1xuICAgICAgICAgICAgICAnV2hlbiBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZSBpcyB1c2VkLCBzaXplQ2FsY3VsYXRpb24gb3Igc2l6ZSAnICtcbiAgICAgICAgICAgICAgJ211c3QgYmUgc2V0LidcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzaXplXG4gICAgfVxuICAgIHRoaXMuYWRkSXRlbVNpemUgPSAoaW5kZXgsIHNpemUsIHN0YXR1cykgPT4ge1xuICAgICAgdGhpcy5zaXplc1tpbmRleF0gPSBzaXplXG4gICAgICBpZiAodGhpcy5tYXhTaXplKSB7XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemVzW2luZGV4XVxuICAgICAgICB3aGlsZSAodGhpcy5jYWxjdWxhdGVkU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgICB0aGlzLmV2aWN0KHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsY3VsYXRlZFNpemUgKz0gdGhpcy5zaXplc1tpbmRleF1cbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLmVudHJ5U2l6ZSA9IHNpemVcbiAgICAgICAgc3RhdHVzLnRvdGFsQ2FsY3VsYXRlZFNpemUgPSB0aGlzLmNhbGN1bGF0ZWRTaXplXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlbW92ZUl0ZW1TaXplKF9pbmRleCkge31cbiAgYWRkSXRlbVNpemUoX2luZGV4LCBfc2l6ZSkge31cbiAgcmVxdWlyZVNpemUoX2ssIF92LCBzaXplLCBzaXplQ2FsY3VsYXRpb24pIHtcbiAgICBpZiAoc2l6ZSB8fCBzaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdjYW5ub3Qgc2V0IHNpemUgd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplIG9uIGNhY2hlJ1xuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gICppbmRleGVzKHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5zaXplKSB7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy50YWlsOyB0cnVlOyApIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRJbmRleChpKSkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbG93U3RhbGUgfHwgIXRoaXMuaXNTdGFsZShpKSkge1xuICAgICAgICAgIHlpZWxkIGlcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gdGhpcy5oZWFkKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gdGhpcy5wcmV2W2ldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAqcmluZGV4ZXMoeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLnNpemUpIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLmhlYWQ7IHRydWU7ICkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZEluZGV4KGkpKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxsb3dTdGFsZSB8fCAhdGhpcy5pc1N0YWxlKGkpKSB7XG4gICAgICAgICAgeWllbGQgaVxuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSB0aGlzLnRhaWwpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkgPSB0aGlzLm5leHRbaV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzVmFsaWRJbmRleChpbmRleCkge1xuICAgIHJldHVybiAoXG4gICAgICBpbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLmtleU1hcC5nZXQodGhpcy5rZXlMaXN0W2luZGV4XSkgPT09IGluZGV4XG4gICAgKVxuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRoaXMua2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCBbdGhpcy5rZXlMaXN0W2ldLCB0aGlzLnZhbExpc3RbaV1dXG4gICAgICB9XG4gICAgfVxuICB9XG4gICpyZW50cmllcygpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5yaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRoaXMua2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCBbdGhpcy5rZXlMaXN0W2ldLCB0aGlzLnZhbExpc3RbaV1dXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgKmtleXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMua2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCB0aGlzLmtleUxpc3RbaV1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgKnJrZXlzKCkge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnJpbmRleGVzKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5rZXlMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIXRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy52YWxMaXN0W2ldKVxuICAgICAgKSB7XG4gICAgICAgIHlpZWxkIHRoaXMua2V5TGlzdFtpXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICp2YWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCB0aGlzLnZhbExpc3RbaV1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgKnJ2YWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMucmluZGV4ZXMoKSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnZhbExpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAhdGhpcy5pc0JhY2tncm91bmRGZXRjaCh0aGlzLnZhbExpc3RbaV0pXG4gICAgICApIHtcbiAgICAgICAgeWllbGQgdGhpcy52YWxMaXN0W2ldXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcygpXG4gIH1cblxuICBmaW5kKGZuLCBnZXRPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2ldXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godilcbiAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgIDogdlxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICBpZiAoZm4odmFsdWUsIHRoaXMua2V5TGlzdFtpXSwgdGhpcykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMua2V5TGlzdFtpXSwgZ2V0T3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3JFYWNoKGZuLCB0aGlzcCA9IHRoaXMpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5pbmRleGVzKCkpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbExpc3RbaV1cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgOiB2XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGZuLmNhbGwodGhpc3AsIHZhbHVlLCB0aGlzLmtleUxpc3RbaV0sIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgcmZvckVhY2goZm4sIHRoaXNwID0gdGhpcykge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnJpbmRleGVzKCkpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbExpc3RbaV1cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgOiB2XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGZuLmNhbGwodGhpc3AsIHZhbHVlLCB0aGlzLmtleUxpc3RbaV0sIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgZ2V0IHBydW5lKCkge1xuICAgIGRlcHJlY2F0ZWRNZXRob2QoJ3BydW5lJywgJ3B1cmdlU3RhbGUnKVxuICAgIHJldHVybiB0aGlzLnB1cmdlU3RhbGVcbiAgfVxuXG4gIHB1cmdlU3RhbGUoKSB7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZVxuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnJpbmRleGVzKHsgYWxsb3dTdGFsZTogdHJ1ZSB9KSkge1xuICAgICAgaWYgKHRoaXMuaXNTdGFsZShpKSkge1xuICAgICAgICB0aGlzLmRlbGV0ZSh0aGlzLmtleUxpc3RbaV0pXG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkXG4gIH1cblxuICBkdW1wKCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMua2V5TGlzdFtpXVxuICAgICAgY29uc3QgdiA9IHRoaXMudmFsTGlzdFtpXVxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICA6IHZcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgY29uc3QgZW50cnkgPSB7IHZhbHVlIH1cbiAgICAgIGlmICh0aGlzLnR0bHMpIHtcbiAgICAgICAgZW50cnkudHRsID0gdGhpcy50dGxzW2ldXG4gICAgICAgIC8vIGFsd2F5cyBkdW1wIHRoZSBzdGFydCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlIHRpbWVzdGFtcFxuICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgY29uc3QgYWdlID0gcGVyZi5ub3coKSAtIHRoaXMuc3RhcnRzW2ldXG4gICAgICAgIGVudHJ5LnN0YXJ0ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC0gYWdlKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2l6ZXMpIHtcbiAgICAgICAgZW50cnkuc2l6ZSA9IHRoaXMuc2l6ZXNbaV1cbiAgICAgIH1cbiAgICAgIGFyci51bnNoaWZ0KFtrZXksIGVudHJ5XSlcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgbG9hZChhcnIpIHtcbiAgICB0aGlzLmNsZWFyKClcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBhcnIpIHtcbiAgICAgIGlmIChlbnRyeS5zdGFydCkge1xuICAgICAgICAvLyBlbnRyeS5zdGFydCBpcyBhIHBvcnRhYmxlIHRpbWVzdGFtcCwgYnV0IHdlIG1heSBiZSB1c2luZ1xuICAgICAgICAvLyBub2RlJ3MgcGVyZm9ybWFuY2Uubm93KCksIHNvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0LlxuICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIGVudHJ5LnN0YXJ0XG4gICAgICAgIGVudHJ5LnN0YXJ0ID0gcGVyZi5ub3coKSAtIGFnZVxuICAgICAgfVxuICAgICAgdGhpcy5zZXQoa2V5LCBlbnRyeS52YWx1ZSwgZW50cnkpXG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZShfdiwgX2ssIF9yZWFzb24pIHt9XG5cbiAgc2V0KFxuICAgIGssXG4gICAgdixcbiAgICB7XG4gICAgICB0dGwgPSB0aGlzLnR0bCxcbiAgICAgIHN0YXJ0LFxuICAgICAgbm9EaXNwb3NlT25TZXQgPSB0aGlzLm5vRGlzcG9zZU9uU2V0LFxuICAgICAgc2l6ZSA9IDAsXG4gICAgICBzaXplQ2FsY3VsYXRpb24gPSB0aGlzLnNpemVDYWxjdWxhdGlvbixcbiAgICAgIG5vVXBkYXRlVFRMID0gdGhpcy5ub1VwZGF0ZVRUTCxcbiAgICAgIHN0YXR1cyxcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgc2l6ZSA9IHRoaXMucmVxdWlyZVNpemUoaywgdiwgc2l6ZSwgc2l6ZUNhbGN1bGF0aW9uKVxuICAgIC8vIGlmIHRoZSBpdGVtIGRvZXNuJ3QgZml0LCBkb24ndCBkbyBhbnl0aGluZ1xuICAgIC8vIE5COiBtYXhFbnRyeVNpemUgc2V0IHRvIG1heFNpemUgYnkgZGVmYXVsdFxuICAgIGlmICh0aGlzLm1heEVudHJ5U2l6ZSAmJiBzaXplID4gdGhpcy5tYXhFbnRyeVNpemUpIHtcbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLnNldCA9ICdtaXNzJ1xuICAgICAgICBzdGF0dXMubWF4RW50cnlTaXplRXhjZWVkZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICAvLyBoYXZlIHRvIGRlbGV0ZSwgaW4gY2FzZSBhIGJhY2tncm91bmQgZmV0Y2ggaXMgdGhlcmUgYWxyZWFkeS5cbiAgICAgIC8vIGluIG5vbi1hc3luYyBjYXNlcywgdGhpcyBpcyBhIG5vLW9wXG4gICAgICB0aGlzLmRlbGV0ZShrKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gICAgbGV0IGluZGV4ID0gdGhpcy5zaXplID09PSAwID8gdW5kZWZpbmVkIDogdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGFkZGl0aW9uXG4gICAgICBpbmRleCA9IHRoaXMubmV3SW5kZXgoKVxuICAgICAgdGhpcy5rZXlMaXN0W2luZGV4XSA9IGtcbiAgICAgIHRoaXMudmFsTGlzdFtpbmRleF0gPSB2XG4gICAgICB0aGlzLmtleU1hcC5zZXQoaywgaW5kZXgpXG4gICAgICB0aGlzLm5leHRbdGhpcy50YWlsXSA9IGluZGV4XG4gICAgICB0aGlzLnByZXZbaW5kZXhdID0gdGhpcy50YWlsXG4gICAgICB0aGlzLnRhaWwgPSBpbmRleFxuICAgICAgdGhpcy5zaXplKytcbiAgICAgIHRoaXMuYWRkSXRlbVNpemUoaW5kZXgsIHNpemUsIHN0YXR1cylcbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLnNldCA9ICdhZGQnXG4gICAgICB9XG4gICAgICBub1VwZGF0ZVRUTCA9IGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVwZGF0ZVxuICAgICAgdGhpcy5tb3ZlVG9UYWlsKGluZGV4KVxuICAgICAgY29uc3Qgb2xkVmFsID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgaWYgKHYgIT09IG9sZFZhbCkge1xuICAgICAgICBpZiAodGhpcy5pc0JhY2tncm91bmRGZXRjaChvbGRWYWwpKSB7XG4gICAgICAgICAgb2xkVmFsLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigncmVwbGFjZWQnKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW5vRGlzcG9zZU9uU2V0KSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2Uob2xkVmFsLCBrLCAnc2V0JylcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2VkLnB1c2goW29sZFZhbCwgaywgJ3NldCddKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUl0ZW1TaXplKGluZGV4KVxuICAgICAgICB0aGlzLnZhbExpc3RbaW5kZXhdID0gdlxuICAgICAgICB0aGlzLmFkZEl0ZW1TaXplKGluZGV4LCBzaXplLCBzdGF0dXMpXG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICBzdGF0dXMuc2V0ID0gJ3JlcGxhY2UnXG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPVxuICAgICAgICAgICAgb2xkVmFsICYmIHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2gob2xkVmFsKVxuICAgICAgICAgICAgICA/IG9sZFZhbC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICA6IG9sZFZhbFxuICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkKSBzdGF0dXMub2xkVmFsdWUgPSBvbGRWYWx1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMuc2V0ID0gJ3VwZGF0ZSdcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR0bCAhPT0gMCAmJiB0aGlzLnR0bCA9PT0gMCAmJiAhdGhpcy50dGxzKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVUVExUcmFja2luZygpXG4gICAgfVxuICAgIGlmICghbm9VcGRhdGVUVEwpIHtcbiAgICAgIHRoaXMuc2V0SXRlbVRUTChpbmRleCwgdHRsLCBzdGFydClcbiAgICB9XG4gICAgdGhpcy5zdGF0dXNUVEwoc3RhdHVzLCBpbmRleClcbiAgICBpZiAodGhpcy5kaXNwb3NlQWZ0ZXIpIHtcbiAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2VkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VBZnRlciguLi50aGlzLmRpc3Bvc2VkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBuZXdJbmRleCgpIHtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWlsXG4gICAgfVxuICAgIGlmICh0aGlzLnNpemUgPT09IHRoaXMubWF4ICYmIHRoaXMubWF4ICE9PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5ldmljdChmYWxzZSlcbiAgICB9XG4gICAgaWYgKHRoaXMuZnJlZS5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmZyZWUucG9wKClcbiAgICB9XG4gICAgLy8gaW5pdGlhbCBmaWxsLCBqdXN0IGtlZXAgd3JpdGluZyBkb3duIHRoZSBsaXN0XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbEZpbGwrK1xuICB9XG5cbiAgcG9wKCkge1xuICAgIGlmICh0aGlzLnNpemUpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMudmFsTGlzdFt0aGlzLmhlYWRdXG4gICAgICB0aGlzLmV2aWN0KHRydWUpXG4gICAgICByZXR1cm4gdmFsXG4gICAgfVxuICB9XG5cbiAgZXZpY3QoZnJlZSkge1xuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmhlYWRcbiAgICBjb25zdCBrID0gdGhpcy5rZXlMaXN0W2hlYWRdXG4gICAgY29uc3QgdiA9IHRoaXMudmFsTGlzdFtoZWFkXVxuICAgIGlmICh0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZXZpY3RlZCcpKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3Bvc2UodiwgaywgJ2V2aWN0JylcbiAgICAgIGlmICh0aGlzLmRpc3Bvc2VBZnRlcikge1xuICAgICAgICB0aGlzLmRpc3Bvc2VkLnB1c2goW3YsIGssICdldmljdCddKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlbW92ZUl0ZW1TaXplKGhlYWQpXG4gICAgLy8gaWYgd2UgYXJlbid0IGFib3V0IHRvIHVzZSB0aGUgaW5kZXgsIHRoZW4gbnVsbCB0aGVzZSBvdXRcbiAgICBpZiAoZnJlZSkge1xuICAgICAgdGhpcy5rZXlMaXN0W2hlYWRdID0gbnVsbFxuICAgICAgdGhpcy52YWxMaXN0W2hlYWRdID0gbnVsbFxuICAgICAgdGhpcy5mcmVlLnB1c2goaGVhZClcbiAgICB9XG4gICAgdGhpcy5oZWFkID0gdGhpcy5uZXh0W2hlYWRdXG4gICAgdGhpcy5rZXlNYXAuZGVsZXRlKGspXG4gICAgdGhpcy5zaXplLS1cbiAgICByZXR1cm4gaGVhZFxuICB9XG5cbiAgaGFzKGssIHsgdXBkYXRlQWdlT25IYXMgPSB0aGlzLnVwZGF0ZUFnZU9uSGFzLCBzdGF0dXMgfSA9IHt9KSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmtleU1hcC5nZXQoaylcbiAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RhbGUoaW5kZXgpKSB7XG4gICAgICAgIGlmICh1cGRhdGVBZ2VPbkhhcykge1xuICAgICAgICAgIHRoaXMudXBkYXRlSXRlbUFnZShpbmRleClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuaGFzID0gJ2hpdCdcbiAgICAgICAgdGhpcy5zdGF0dXNUVEwoc3RhdHVzLCBpbmRleClcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy5oYXMgPSAnc3RhbGUnXG4gICAgICAgIHRoaXMuc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgIHN0YXR1cy5oYXMgPSAnbWlzcydcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBsaWtlIGdldCgpLCBidXQgd2l0aG91dCBhbnkgTFJVIHVwZGF0aW5nIG9yIFRUTCBleHBpcmF0aW9uXG4gIHBlZWsoaywgeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgKGFsbG93U3RhbGUgfHwgIXRoaXMuaXNTdGFsZShpbmRleCkpKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgLy8gZWl0aGVyIHN0YWxlIGFuZCBhbGxvd2VkLCBvciBmb3JjaW5nIGEgcmVmcmVzaCBvZiBub24tc3RhbGUgdmFsdWVcbiAgICAgIHJldHVybiB0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHZcbiAgICB9XG4gIH1cblxuICBiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpIHtcbiAgICBjb25zdCB2ID0gaW5kZXggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMudmFsTGlzdFtpbmRleF1cbiAgICBpZiAodGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgcmV0dXJuIHZcbiAgICB9XG4gICAgY29uc3QgYWMgPSBuZXcgQUMoKVxuICAgIGlmIChvcHRpb25zLnNpZ25hbCkge1xuICAgICAgb3B0aW9ucy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PlxuICAgICAgICBhYy5hYm9ydChvcHRpb25zLnNpZ25hbC5yZWFzb24pXG4gICAgICApXG4gICAgfVxuICAgIGNvbnN0IGZldGNoT3B0cyA9IHtcbiAgICAgIHNpZ25hbDogYWMuc2lnbmFsLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGNvbnRleHQsXG4gICAgfVxuICAgIGNvbnN0IGNiID0gKHYsIHVwZGF0ZUNhY2hlID0gZmFsc2UpID0+IHtcbiAgICAgIGNvbnN0IHsgYWJvcnRlZCB9ID0gYWMuc2lnbmFsXG4gICAgICBjb25zdCBpZ25vcmVBYm9ydCA9IG9wdGlvbnMuaWdub3JlRmV0Y2hBYm9ydCAmJiB2ICE9PSB1bmRlZmluZWRcbiAgICAgIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgICAgICBpZiAoYWJvcnRlZCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEFib3J0ZWQgPSB0cnVlXG4gICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hFcnJvciA9IGFjLnNpZ25hbC5yZWFzb25cbiAgICAgICAgICBpZiAoaWdub3JlQWJvcnQpIG9wdGlvbnMuc3RhdHVzLmZldGNoQWJvcnRJZ25vcmVkID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoUmVzb2x2ZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhYm9ydGVkICYmICFpZ25vcmVBYm9ydCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgcmV0dXJuIGZldGNoRmFpbChhYy5zaWduYWwucmVhc29uKVxuICAgICAgfVxuICAgICAgLy8gZWl0aGVyIHdlIGRpZG4ndCBhYm9ydCwgYW5kIGFyZSBzdGlsbCBoZXJlLCBvciB3ZSBkaWQsIGFuZCBpZ25vcmVkXG4gICAgICBpZiAodGhpcy52YWxMaXN0W2luZGV4XSA9PT0gcCkge1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHAuX19zdGFsZVdoaWxlRmV0Y2hpbmcpIHtcbiAgICAgICAgICAgIHRoaXMudmFsTGlzdFtpbmRleF0gPSBwLl9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlKGspXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChvcHRpb25zLnN0YXR1cykgb3B0aW9ucy5zdGF0dXMuZmV0Y2hVcGRhdGVkID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuc2V0KGssIHYsIGZldGNoT3B0cy5vcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdlxuICAgIH1cbiAgICBjb25zdCBlYiA9IGVyID0+IHtcbiAgICAgIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaFJlamVjdGVkID0gdHJ1ZVxuICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEVycm9yID0gZXJcbiAgICAgIH1cbiAgICAgIHJldHVybiBmZXRjaEZhaWwoZXIpXG4gICAgfVxuICAgIGNvbnN0IGZldGNoRmFpbCA9IGVyID0+IHtcbiAgICAgIGNvbnN0IHsgYWJvcnRlZCB9ID0gYWMuc2lnbmFsXG4gICAgICBjb25zdCBhbGxvd1N0YWxlQWJvcnRlZCA9XG4gICAgICAgIGFib3J0ZWQgJiYgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0XG4gICAgICBjb25zdCBhbGxvd1N0YWxlID1cbiAgICAgICAgYWxsb3dTdGFsZUFib3J0ZWQgfHwgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvblxuICAgICAgY29uc3Qgbm9EZWxldGUgPSBhbGxvd1N0YWxlIHx8IG9wdGlvbnMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uXG4gICAgICBpZiAodGhpcy52YWxMaXN0W2luZGV4XSA9PT0gcCkge1xuICAgICAgICAvLyBpZiB3ZSBhbGxvdyBzdGFsZSBvbiBmZXRjaCByZWplY3Rpb25zLCB0aGVuIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXRcbiAgICAgICAgLy8gdGhlIHN0YWxlIHZhbHVlIGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGNhY2hlIHdoZW4gdGhlIGZldGNoIGZhaWxzLlxuICAgICAgICBjb25zdCBkZWwgPSAhbm9EZWxldGUgfHwgcC5fX3N0YWxlV2hpbGVGZXRjaGluZyA9PT0gdW5kZWZpbmVkXG4gICAgICAgIGlmIChkZWwpIHtcbiAgICAgICAgICB0aGlzLmRlbGV0ZShrKVxuICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd1N0YWxlQWJvcnRlZCkge1xuICAgICAgICAgIC8vIHN0aWxsIHJlcGxhY2UgdGhlICpwcm9taXNlKiB3aXRoIHRoZSBzdGFsZSB2YWx1ZSxcbiAgICAgICAgICAvLyBzaW5jZSB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBwcm9taXNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgLy8gbGVhdmUgaXQgdW50b3VjaGVkIGlmIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIGFuXG4gICAgICAgICAgLy8gYWJvcnRlZCBiYWNrZ3JvdW5kIGZldGNoIHRoYXQgaGFzbid0IHlldCByZXR1cm5lZC5cbiAgICAgICAgICB0aGlzLnZhbExpc3RbaW5kZXhdID0gcC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYWxsb3dTdGFsZSkge1xuICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMgJiYgcC5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3B0aW9ucy5zdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgfSBlbHNlIGlmIChwLl9fcmV0dXJuZWQgPT09IHApIHtcbiAgICAgICAgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGNhbGwgPSAocmVzLCByZWopID0+IHtcbiAgICAgIHRoaXMuZmV0Y2hNZXRob2QoaywgdiwgZmV0Y2hPcHRzKS50aGVuKHYgPT4gcmVzKHYpLCByZWopXG4gICAgICAvLyBpZ25vcmVkLCB3ZSBnbyB1bnRpbCB3ZSBmaW5pc2gsIHJlZ2FyZGxlc3MuXG4gICAgICAvLyBkZWZlciBjaGVjayB1bnRpbCB3ZSBhcmUgYWN0dWFsbHkgYWJvcnRpbmcsXG4gICAgICAvLyBzbyBmZXRjaE1ldGhvZCBjYW4gb3ZlcnJpZGUuXG4gICAgICBhYy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhb3B0aW9ucy5pZ25vcmVGZXRjaEFib3J0IHx8XG4gICAgICAgICAgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0XG4gICAgICAgICkge1xuICAgICAgICAgIHJlcygpXG4gICAgICAgICAgLy8gd2hlbiBpdCBldmVudHVhbGx5IHJlc29sdmVzLCB1cGRhdGUgdGhlIGNhY2hlLlxuICAgICAgICAgIGlmIChvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnQpIHtcbiAgICAgICAgICAgIHJlcyA9IHYgPT4gY2IodiwgdHJ1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnN0YXR1cykgb3B0aW9ucy5zdGF0dXMuZmV0Y2hEaXNwYXRjaGVkID0gdHJ1ZVxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZShwY2FsbCkudGhlbihjYiwgZWIpXG4gICAgcC5fX2Fib3J0Q29udHJvbGxlciA9IGFjXG4gICAgcC5fX3N0YWxlV2hpbGVGZXRjaGluZyA9IHZcbiAgICBwLl9fcmV0dXJuZWQgPSBudWxsXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGludGVybmFsLCBkb24ndCBleHBvc2Ugc3RhdHVzLlxuICAgICAgdGhpcy5zZXQoaywgcCwgeyAuLi5mZXRjaE9wdHMub3B0aW9ucywgc3RhdHVzOiB1bmRlZmluZWQgfSlcbiAgICAgIGluZGV4ID0gdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsTGlzdFtpbmRleF0gPSBwXG4gICAgfVxuICAgIHJldHVybiBwXG4gIH1cblxuICBpc0JhY2tncm91bmRGZXRjaChwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHAgJiZcbiAgICAgIHR5cGVvZiBwID09PSAnb2JqZWN0JyAmJlxuICAgICAgdHlwZW9mIHAudGhlbiA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICBwLFxuICAgICAgICAnX19zdGFsZVdoaWxlRmV0Y2hpbmcnXG4gICAgICApICYmXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocCwgJ19fcmV0dXJuZWQnKSAmJlxuICAgICAgKHAuX19yZXR1cm5lZCA9PT0gcCB8fCBwLl9fcmV0dXJuZWQgPT09IG51bGwpXG4gICAgKVxuICB9XG5cbiAgLy8gdGhpcyB0YWtlcyB0aGUgdW5pb24gb2YgZ2V0KCkgYW5kIHNldCgpIG9wdHMsIGJlY2F1c2UgaXQgZG9lcyBib3RoXG4gIGFzeW5jIGZldGNoKFxuICAgIGssXG4gICAge1xuICAgICAgLy8gZ2V0IG9wdGlvbnNcbiAgICAgIGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUsXG4gICAgICB1cGRhdGVBZ2VPbkdldCA9IHRoaXMudXBkYXRlQWdlT25HZXQsXG4gICAgICBub0RlbGV0ZU9uU3RhbGVHZXQgPSB0aGlzLm5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgIC8vIHNldCBvcHRpb25zXG4gICAgICB0dGwgPSB0aGlzLnR0bCxcbiAgICAgIG5vRGlzcG9zZU9uU2V0ID0gdGhpcy5ub0Rpc3Bvc2VPblNldCxcbiAgICAgIHNpemUgPSAwLFxuICAgICAgc2l6ZUNhbGN1bGF0aW9uID0gdGhpcy5zaXplQ2FsY3VsYXRpb24sXG4gICAgICBub1VwZGF0ZVRUTCA9IHRoaXMubm9VcGRhdGVUVEwsXG4gICAgICAvLyBmZXRjaCBleGNsdXNpdmUgb3B0aW9uc1xuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gdGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBpZ25vcmVGZXRjaEFib3J0ID0gdGhpcy5pZ25vcmVGZXRjaEFib3J0LFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCxcbiAgICAgIGZldGNoQ29udGV4dCA9IHRoaXMuZmV0Y2hDb250ZXh0LFxuICAgICAgZm9yY2VSZWZyZXNoID0gZmFsc2UsXG4gICAgICBzdGF0dXMsXG4gICAgICBzaWduYWwsXG4gICAgfSA9IHt9XG4gICkge1xuICAgIGlmICghdGhpcy5mZXRjaE1ldGhvZCkge1xuICAgICAgaWYgKHN0YXR1cykgc3RhdHVzLmZldGNoID0gJ2dldCdcbiAgICAgIHJldHVybiB0aGlzLmdldChrLCB7XG4gICAgICAgIGFsbG93U3RhbGUsXG4gICAgICAgIHVwZGF0ZUFnZU9uR2V0LFxuICAgICAgICBub0RlbGV0ZU9uU3RhbGVHZXQsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGFsbG93U3RhbGUsXG4gICAgICB1cGRhdGVBZ2VPbkdldCxcbiAgICAgIG5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgIHR0bCxcbiAgICAgIG5vRGlzcG9zZU9uU2V0LFxuICAgICAgc2l6ZSxcbiAgICAgIHNpemVDYWxjdWxhdGlvbixcbiAgICAgIG5vVXBkYXRlVFRMLFxuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0LFxuICAgICAgaWdub3JlRmV0Y2hBYm9ydCxcbiAgICAgIHN0YXR1cyxcbiAgICAgIHNpZ25hbCxcbiAgICB9XG5cbiAgICBsZXQgaW5kZXggPSB0aGlzLmtleU1hcC5nZXQoaylcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHN0YXR1cykgc3RhdHVzLmZldGNoID0gJ21pc3MnXG4gICAgICBjb25zdCBwID0gdGhpcy5iYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGZldGNoQ29udGV4dClcbiAgICAgIHJldHVybiAocC5fX3JldHVybmVkID0gcClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW4gY2FjaGUsIG1heWJlIGFscmVhZHkgZmV0Y2hpbmdcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbExpc3RbaW5kZXhdXG4gICAgICBpZiAodGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICBjb25zdCBzdGFsZSA9XG4gICAgICAgICAgYWxsb3dTdGFsZSAmJiB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWRcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdpbmZsaWdodCdcbiAgICAgICAgICBpZiAoc3RhbGUpIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGFsZSA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiAodi5fX3JldHVybmVkID0gdilcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgZm9yY2UgYSByZWZyZXNoLCB0aGF0IG1lYW5zIGRvIE5PVCBzZXJ2ZSB0aGUgY2FjaGVkIHZhbHVlLFxuICAgICAgLy8gdW5sZXNzIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIHJlZnJlc2hpbmcgdGhlIGNhY2hlLlxuICAgICAgY29uc3QgaXNTdGFsZSA9IHRoaXMuaXNTdGFsZShpbmRleClcbiAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmICFpc1N0YWxlKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHN0YXR1cy5mZXRjaCA9ICdoaXQnXG4gICAgICAgIHRoaXMubW92ZVRvVGFpbChpbmRleClcbiAgICAgICAgaWYgKHVwZGF0ZUFnZU9uR2V0KSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVJdGVtQWdlKGluZGV4KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICAgIHJldHVybiB2XG4gICAgICB9XG5cbiAgICAgIC8vIG9rLCBpdCBpcyBzdGFsZSBvciBhIGZvcmNlZCByZWZyZXNoLCBhbmQgbm90IGFscmVhZHkgZmV0Y2hpbmcuXG4gICAgICAvLyByZWZyZXNoIHRoZSBjYWNoZS5cbiAgICAgIGNvbnN0IHAgPSB0aGlzLmJhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgZmV0Y2hDb250ZXh0KVxuICAgICAgY29uc3QgaGFzU3RhbGUgPSBwLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHN0YWxlVmFsID0gaGFzU3RhbGUgJiYgYWxsb3dTdGFsZVxuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMuZmV0Y2ggPSBoYXNTdGFsZSAmJiBpc1N0YWxlID8gJ3N0YWxlJyA6ICdyZWZyZXNoJ1xuICAgICAgICBpZiAoc3RhbGVWYWwgJiYgaXNTdGFsZSkgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhbGVWYWwgPyBwLl9fc3RhbGVXaGlsZUZldGNoaW5nIDogKHAuX19yZXR1cm5lZCA9IHApXG4gICAgfVxuICB9XG5cbiAgZ2V0KFxuICAgIGssXG4gICAge1xuICAgICAgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSxcbiAgICAgIHVwZGF0ZUFnZU9uR2V0ID0gdGhpcy51cGRhdGVBZ2VPbkdldCxcbiAgICAgIG5vRGVsZXRlT25TdGFsZUdldCA9IHRoaXMubm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgc3RhdHVzLFxuICAgIH0gPSB7fVxuICApIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMua2V5TWFwLmdldChrKVxuICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsTGlzdFtpbmRleF1cbiAgICAgIGNvbnN0IGZldGNoaW5nID0gdGhpcy5pc0JhY2tncm91bmRGZXRjaCh2YWx1ZSlcbiAgICAgIHRoaXMuc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICBpZiAodGhpcy5pc1N0YWxlKGluZGV4KSkge1xuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuZ2V0ID0gJ3N0YWxlJ1xuICAgICAgICAvLyBkZWxldGUgb25seSBpZiBub3QgYW4gaW4tZmxpZ2h0IGJhY2tncm91bmQgZmV0Y2hcbiAgICAgICAgaWYgKCFmZXRjaGluZykge1xuICAgICAgICAgIGlmICghbm9EZWxldGVPblN0YWxlR2V0KSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZShrKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IGFsbG93U3RhbGVcbiAgICAgICAgICByZXR1cm4gYWxsb3dTdGFsZSA/IHZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgc3RhdHVzLnJldHVybmVkU3RhbGUgPVxuICAgICAgICAgICAgICBhbGxvd1N0YWxlICYmIHZhbHVlLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFsbG93U3RhbGUgPyB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuZ2V0ID0gJ2hpdCdcbiAgICAgICAgLy8gaWYgd2UncmUgY3VycmVudGx5IGZldGNoaW5nIGl0LCB3ZSBkb24ndCBhY3R1YWxseSBoYXZlIGl0IHlldFxuICAgICAgICAvLyBpdCdzIG5vdCBzdGFsZSwgd2hpY2ggbWVhbnMgdGhpcyBpc24ndCBhIHN0YWxlV2hpbGVSZWZldGNoaW5nLlxuICAgICAgICAvLyBJZiBpdCdzIG5vdCBzdGFsZSwgYW5kIGZldGNoaW5nLCBBTkQgaGFzIGEgX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgLy8gdmFsdWUsIHRoZW4gdGhhdCBtZWFucyB0aGUgdXNlciBmZXRjaGVkIHdpdGgge2ZvcmNlUmVmcmVzaDp0cnVlfSxcbiAgICAgICAgLy8gc28gaXQncyBzYWZlIHRvIHJldHVybiB0aGF0IHZhbHVlLlxuICAgICAgICBpZiAoZmV0Y2hpbmcpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vdmVUb1RhaWwoaW5kZXgpXG4gICAgICAgIGlmICh1cGRhdGVBZ2VPbkdldCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlSXRlbUFnZShpbmRleClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLmdldCA9ICdtaXNzJ1xuICAgIH1cbiAgfVxuXG4gIGNvbm5lY3QocCwgbikge1xuICAgIHRoaXMucHJldltuXSA9IHBcbiAgICB0aGlzLm5leHRbcF0gPSBuXG4gIH1cblxuICBtb3ZlVG9UYWlsKGluZGV4KSB7XG4gICAgLy8gaWYgdGFpbCBhbHJlYWR5LCBub3RoaW5nIHRvIGRvXG4gICAgLy8gaWYgaGVhZCwgbW92ZSBoZWFkIHRvIG5leHRbaW5kZXhdXG4gICAgLy8gZWxzZVxuICAgIC8vICAgbW92ZSBuZXh0W3ByZXZbaW5kZXhdXSB0byBuZXh0W2luZGV4XSAoaGVhZCBoYXMgbm8gcHJldilcbiAgICAvLyAgIG1vdmUgcHJldltuZXh0W2luZGV4XV0gdG8gcHJldltpbmRleF1cbiAgICAvLyBwcmV2W2luZGV4XSA9IHRhaWxcbiAgICAvLyBuZXh0W3RhaWxdID0gaW5kZXhcbiAgICAvLyB0YWlsID0gaW5kZXhcbiAgICBpZiAoaW5kZXggIT09IHRoaXMudGFpbCkge1xuICAgICAgaWYgKGluZGV4ID09PSB0aGlzLmhlYWQpIHtcbiAgICAgICAgdGhpcy5oZWFkID0gdGhpcy5uZXh0W2luZGV4XVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25uZWN0KHRoaXMucHJldltpbmRleF0sIHRoaXMubmV4dFtpbmRleF0pXG4gICAgICB9XG4gICAgICB0aGlzLmNvbm5lY3QodGhpcy50YWlsLCBpbmRleClcbiAgICAgIHRoaXMudGFpbCA9IGluZGV4XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRlbCgpIHtcbiAgICBkZXByZWNhdGVkTWV0aG9kKCdkZWwnLCAnZGVsZXRlJylcbiAgICByZXR1cm4gdGhpcy5kZWxldGVcbiAgfVxuXG4gIGRlbGV0ZShrKSB7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZVxuICAgIGlmICh0aGlzLnNpemUgIT09IDApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGVkID0gdHJ1ZVxuICAgICAgICBpZiAodGhpcy5zaXplID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5jbGVhcigpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVJdGVtU2l6ZShpbmRleClcbiAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgICAgIGlmICh0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZGVsZXRlZCcpKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2UodiwgaywgJ2RlbGV0ZScpXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlZC5wdXNoKFt2LCBrLCAnZGVsZXRlJ10pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMua2V5TWFwLmRlbGV0ZShrKVxuICAgICAgICAgIHRoaXMua2V5TGlzdFtpbmRleF0gPSBudWxsXG4gICAgICAgICAgdGhpcy52YWxMaXN0W2luZGV4XSA9IG51bGxcbiAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMudGFpbCkge1xuICAgICAgICAgICAgdGhpcy50YWlsID0gdGhpcy5wcmV2W2luZGV4XVxuICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuaGVhZCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkID0gdGhpcy5uZXh0W2luZGV4XVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5leHRbdGhpcy5wcmV2W2luZGV4XV0gPSB0aGlzLm5leHRbaW5kZXhdXG4gICAgICAgICAgICB0aGlzLnByZXZbdGhpcy5uZXh0W2luZGV4XV0gPSB0aGlzLnByZXZbaW5kZXhdXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2l6ZS0tXG4gICAgICAgICAgdGhpcy5mcmVlLnB1c2goaW5kZXgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2VkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VBZnRlciguLi50aGlzLmRpc3Bvc2VkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkXG4gIH1cblxuICBjbGVhcigpIHtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIHRoaXMucmluZGV4ZXMoeyBhbGxvd1N0YWxlOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgaWYgKHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2RlbGV0ZWQnKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGsgPSB0aGlzLmtleUxpc3RbaW5kZXhdXG4gICAgICAgIHRoaXMuZGlzcG9zZSh2LCBrLCAnZGVsZXRlJylcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgdGhpcy5kaXNwb3NlZC5wdXNoKFt2LCBrLCAnZGVsZXRlJ10pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtleU1hcC5jbGVhcigpXG4gICAgdGhpcy52YWxMaXN0LmZpbGwobnVsbClcbiAgICB0aGlzLmtleUxpc3QuZmlsbChudWxsKVxuICAgIGlmICh0aGlzLnR0bHMpIHtcbiAgICAgIHRoaXMudHRscy5maWxsKDApXG4gICAgICB0aGlzLnN0YXJ0cy5maWxsKDApXG4gICAgfVxuICAgIGlmICh0aGlzLnNpemVzKSB7XG4gICAgICB0aGlzLnNpemVzLmZpbGwoMClcbiAgICB9XG4gICAgdGhpcy5oZWFkID0gMFxuICAgIHRoaXMudGFpbCA9IDBcbiAgICB0aGlzLmluaXRpYWxGaWxsID0gMVxuICAgIHRoaXMuZnJlZS5sZW5ndGggPSAwXG4gICAgdGhpcy5jYWxjdWxhdGVkU2l6ZSA9IDBcbiAgICB0aGlzLnNpemUgPSAwXG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2VkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VBZnRlciguLi50aGlzLmRpc3Bvc2VkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlc2V0KCkge1xuICAgIGRlcHJlY2F0ZWRNZXRob2QoJ3Jlc2V0JywgJ2NsZWFyJylcbiAgICByZXR1cm4gdGhpcy5jbGVhclxuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICBkZXByZWNhdGVkUHJvcGVydHkoJ2xlbmd0aCcsICdzaXplJylcbiAgICByZXR1cm4gdGhpcy5zaXplXG4gIH1cblxuICBzdGF0aWMgZ2V0IEFib3J0Q29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gQUNcbiAgfVxuICBzdGF0aWMgZ2V0IEFib3J0U2lnbmFsKCkge1xuICAgIHJldHVybiBBU1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTFJVQ2FjaGVcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5cbmxldCBzaGltO1xuY2xhc3MgWTE4TiB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICAvLyBjb25maWd1cmFibGUgb3B0aW9ucy5cbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gb3B0cy5kaXJlY3RvcnkgfHwgJy4vbG9jYWxlcyc7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsZXMgPSB0eXBlb2Ygb3B0cy51cGRhdGVGaWxlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy51cGRhdGVGaWxlcyA6IHRydWU7XG4gICAgICAgIHRoaXMubG9jYWxlID0gb3B0cy5sb2NhbGUgfHwgJ2VuJztcbiAgICAgICAgdGhpcy5mYWxsYmFja1RvTGFuZ3VhZ2UgPSB0eXBlb2Ygb3B0cy5mYWxsYmFja1RvTGFuZ3VhZ2UgPT09ICdib29sZWFuJyA/IG9wdHMuZmFsbGJhY2tUb0xhbmd1YWdlIDogdHJ1ZTtcbiAgICAgICAgLy8gaW50ZXJuYWwgc3R1ZmYuXG4gICAgICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLndyaXRlUXVldWUgPSBbXTtcbiAgICB9XG4gICAgX18oLi4uYXJncykge1xuICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90YWdnZWRMaXRlcmFsKGFyZ3VtZW50c1swXSwgLi4uYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHIgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGxldCBjYiA9IGZ1bmN0aW9uICgpIHsgfTsgLy8gc3RhcnQgd2l0aCBub29wLlxuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiID0gYXJncy5wb3AoKTtcbiAgICAgICAgY2IgPSBjYiB8fCBmdW5jdGlvbiAoKSB7IH07IC8vIG5vb3AuXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICAvLyB3ZSd2ZSBvYnNlcnZlZCBhIG5ldyBzdHJpbmcsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgZmlsZS5cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzdHJdICYmIHRoaXMudXBkYXRlRmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gPSBzdHI7XG4gICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgbG9jYWxlLFxuICAgICAgICAgICAgLy8gc2luY2UgdGhlc2UgdmFsdWVzIGNvdWxkIGNoYW5nZSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyB3cml0ZSBpcyBwZXJmb3JtZWQuXG4gICAgICAgICAgICB0aGlzLl9lbnF1ZXVlV3JpdGUoe1xuICAgICAgICAgICAgICAgIGRpcmVjdG9yeTogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICAgICAgICBjYlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgW3RoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gfHwgc3RyXS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgICBfX24oKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICBjb25zdCBzaW5ndWxhciA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgY29uc3QgcGx1cmFsID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBjb25zdCBxdWFudGl0eSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgbGV0IGNiID0gZnVuY3Rpb24gKCkgeyB9OyAvLyBzdGFydCB3aXRoIG5vb3AuXG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IgPSBhcmdzLnBvcCgpO1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdKVxuICAgICAgICAgICAgdGhpcy5fcmVhZExvY2FsZUZpbGUoKTtcbiAgICAgICAgbGV0IHN0ciA9IHF1YW50aXR5ID09PSAxID8gc2luZ3VsYXIgOiBwbHVyYWw7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdO1xuICAgICAgICAgICAgc3RyID0gZW50cnlbcXVhbnRpdHkgPT09IDEgPyAnb25lJyA6ICdvdGhlciddO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdlJ3ZlIG9ic2VydmVkIGEgbmV3IHN0cmluZywgdXBkYXRlIHRoZSBsYW5ndWFnZSBmaWxlLlxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXSAmJiB0aGlzLnVwZGF0ZUZpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0gPSB7XG4gICAgICAgICAgICAgICAgb25lOiBzaW5ndWxhcixcbiAgICAgICAgICAgICAgICBvdGhlcjogcGx1cmFsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGxvY2FsZSxcbiAgICAgICAgICAgIC8vIHNpbmNlIHRoZXNlIHZhbHVlcyBjb3VsZCBjaGFuZ2UgYmVmb3JlIHRoZVxuICAgICAgICAgICAgLy8gd3JpdGUgaXMgcGVyZm9ybWVkLlxuICAgICAgICAgICAgdGhpcy5fZW5xdWV1ZVdyaXRlKHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuZGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgICAgICAgY2JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhICVkIHBsYWNlaG9sZGVyIGlzIHByb3ZpZGVkLCBhZGQgcXVhbnRpdHlcbiAgICAgICAgLy8gdG8gdGhlIGFyZ3VtZW50cyBleHBhbmRlZCBieSB1dGlsLmZvcm1hdC5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gW3N0cl07XG4gICAgICAgIGlmICh+c3RyLmluZGV4T2YoJyVkJykpXG4gICAgICAgICAgICB2YWx1ZXMucHVzaChxdWFudGl0eSk7XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgdmFsdWVzLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICAgIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgfVxuICAgIGdldExvY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlO1xuICAgIH1cbiAgICB1cGRhdGVMb2NhbGUob2JqKSB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1ba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIF90YWdnZWRMaXRlcmFsKHBhcnRzLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgcGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCwgaSkge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpICsgMV07XG4gICAgICAgICAgICBzdHIgKz0gcGFydDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHN0ciArPSAnJXMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX18uYXBwbHkodGhpcywgW3N0cl0uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJncywgMSkpKTtcbiAgICB9XG4gICAgX2VucXVldWVXcml0ZSh3b3JrKSB7XG4gICAgICAgIHRoaXMud3JpdGVRdWV1ZS5wdXNoKHdvcmspO1xuICAgICAgICBpZiAodGhpcy53cml0ZVF1ZXVlLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NXcml0ZVF1ZXVlKCk7XG4gICAgfVxuICAgIF9wcm9jZXNzV3JpdGVRdWV1ZSgpIHtcbiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xuICAgICAgICBjb25zdCB3b3JrID0gdGhpcy53cml0ZVF1ZXVlWzBdO1xuICAgICAgICAvLyBkZXN0cnVjdHVyZSB0aGUgZW5xdWV1ZWQgd29yay5cbiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gd29yay5kaXJlY3Rvcnk7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9IHdvcmsubG9jYWxlO1xuICAgICAgICBjb25zdCBjYiA9IHdvcmsuY2I7XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHRoaXMuX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZExvY2FsZSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY2FjaGVbbG9jYWxlXSwgbnVsbCwgMik7XG4gICAgICAgIHNoaW0uZnMud3JpdGVGaWxlKGxhbmd1YWdlRmlsZSwgc2VyaWFsaXplZExvY2FsZSwgJ3V0Zi04JywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgX3RoaXMud3JpdGVRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKF90aGlzLndyaXRlUXVldWUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBfdGhpcy5fcHJvY2Vzc1dyaXRlUXVldWUoKTtcbiAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcmVhZExvY2FsZUZpbGUoKSB7XG4gICAgICAgIGxldCBsb2NhbGVMb29rdXAgPSB7fTtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VGaWxlID0gdGhpcy5fcmVzb2x2ZUxvY2FsZUZpbGUodGhpcy5kaXJlY3RvcnksIHRoaXMubG9jYWxlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBidW5kbGVyIHN1Y2ggYXMgd2VicGFjaywgcmVhZEZpbGVTeW5jIG1heSBub3QgYmUgZGVmaW5lZDpcbiAgICAgICAgICAgIGlmIChzaGltLmZzLnJlYWRGaWxlU3luYykge1xuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IEpTT04ucGFyc2Uoc2hpbS5mcy5yZWFkRmlsZVN5bmMobGFuZ3VhZ2VGaWxlLCAndXRmLTgnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSAnc3ludGF4IGVycm9yIGluICcgKyBsYW5ndWFnZUZpbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKVxuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IHt9O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSA9IGxvY2FsZUxvb2t1cDtcbiAgICB9XG4gICAgX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKSB7XG4gICAgICAgIGxldCBmaWxlID0gc2hpbS5yZXNvbHZlKGRpcmVjdG9yeSwgJy4vJywgbG9jYWxlICsgJy5qc29uJyk7XG4gICAgICAgIGlmICh0aGlzLmZhbGxiYWNrVG9MYW5ndWFnZSAmJiAhdGhpcy5fZmlsZUV4aXN0c1N5bmMoZmlsZSkgJiYgfmxvY2FsZS5sYXN0SW5kZXhPZignXycpKSB7XG4gICAgICAgICAgICAvLyBhdHRlbXB0IGZhbGxiYWNrIHRvIGxhbmd1YWdlIG9ubHlcbiAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHNoaW0ucmVzb2x2ZShkaXJlY3RvcnksICcuLycsIGxvY2FsZS5zcGxpdCgnXycpWzBdICsgJy5qc29uJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZmlsZUV4aXN0c1N5bmMobGFuZ3VhZ2VGaWxlKSlcbiAgICAgICAgICAgICAgICBmaWxlID0gbGFuZ3VhZ2VGaWxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cbiAgICBfZmlsZUV4aXN0c1N5bmMoZmlsZSkge1xuICAgICAgICByZXR1cm4gc2hpbS5leGlzdHMoZmlsZSk7XG4gICAgfVxufVxuZnVuY3Rpb24geTE4biQxKG9wdHMsIF9zaGltKSB7XG4gICAgc2hpbSA9IF9zaGltO1xuICAgIGNvbnN0IHkxOG4gPSBuZXcgWTE4TihvcHRzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBfXzogeTE4bi5fXy5iaW5kKHkxOG4pLFxuICAgICAgICBfX246IHkxOG4uX19uLmJpbmQoeTE4biksXG4gICAgICAgIHNldExvY2FsZTogeTE4bi5zZXRMb2NhbGUuYmluZCh5MThuKSxcbiAgICAgICAgZ2V0TG9jYWxlOiB5MThuLmdldExvY2FsZS5iaW5kKHkxOG4pLFxuICAgICAgICB1cGRhdGVMb2NhbGU6IHkxOG4udXBkYXRlTG9jYWxlLmJpbmQoeTE4biksXG4gICAgICAgIGxvY2FsZTogeTE4bi5sb2NhbGVcbiAgICB9O1xufVxuXG52YXIgbm9kZVBsYXRmb3JtU2hpbSA9IHtcbiAgICBmczoge1xuICAgICAgICByZWFkRmlsZVN5bmM6IGZzLnJlYWRGaWxlU3luYyxcbiAgICAgICAgd3JpdGVGaWxlOiBmcy53cml0ZUZpbGVcbiAgICB9LFxuICAgIGZvcm1hdDogdXRpbC5mb3JtYXQsXG4gICAgcmVzb2x2ZTogcGF0aC5yZXNvbHZlLFxuICAgIGV4aXN0czogKGZpbGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBmcy5zdGF0U3luYyhmaWxlKS5pc0ZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jb25zdCB5MThuID0gKG9wdHMpID0+IHtcbiAgICByZXR1cm4geTE4biQxKG9wdHMsIG5vZGVQbGF0Zm9ybVNoaW0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB5MThuO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcblxuZnVuY3Rpb24gY2FtZWxDYXNlKHN0cikge1xuICAgIGNvbnN0IGlzQ2FtZWxDYXNlID0gc3RyICE9PSBzdHIudG9Mb3dlckNhc2UoKSAmJiBzdHIgIT09IHN0ci50b1VwcGVyQ2FzZSgpO1xuICAgIGlmICghaXNDYW1lbENhc2UpIHtcbiAgICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmIChzdHIuaW5kZXhPZignLScpID09PSAtMSAmJiBzdHIuaW5kZXhPZignXycpID09PSAtMSkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNhbWVsY2FzZSA9ICcnO1xuICAgICAgICBsZXQgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdIeXBoZW5zID0gc3RyLm1hdGNoKC9eLSsvKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxlYWRpbmdIeXBoZW5zID8gbGVhZGluZ0h5cGhlbnNbMF0ubGVuZ3RoIDogMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNociA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAobmV4dENoclVwcGVyKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hyID0gY2hyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gMCAmJiAoY2hyID09PSAnLScgfHwgY2hyID09PSAnXycpKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNociAhPT0gJy0nICYmIGNociAhPT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgY2FtZWxjYXNlICs9IGNocjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FtZWxjYXNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRlY2FtZWxpemUoc3RyLCBqb2luU3RyaW5nKSB7XG4gICAgY29uc3QgbG93ZXJjYXNlID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgam9pblN0cmluZyA9IGpvaW5TdHJpbmcgfHwgJy0nO1xuICAgIGxldCBub3RDYW1lbGNhc2UgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaHJMb3dlciA9IGxvd2VyY2FzZS5jaGFyQXQoaSk7XG4gICAgICAgIGNvbnN0IGNoclN0cmluZyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChjaHJMb3dlciAhPT0gY2hyU3RyaW5nICYmIGkgPiAwKSB7XG4gICAgICAgICAgICBub3RDYW1lbGNhc2UgKz0gYCR7am9pblN0cmluZ30ke2xvd2VyY2FzZS5jaGFyQXQoaSl9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5vdENhbWVsY2FzZSArPSBjaHJTdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vdENhbWVsY2FzZTtcbn1cbmZ1bmN0aW9uIGxvb2tzTGlrZU51bWJlcih4KSB7XG4gICAgaWYgKHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKC9eMHhbMC05YS1mXSskL2kudGVzdCh4KSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKC9eMFteLl0vLnRlc3QoeCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gL15bLV0/KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKShlWy0rXT9cXGQrKT8kLy50ZXN0KHgpO1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUFyZ1N0cmluZyhhcmdTdHJpbmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdTdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBhcmdTdHJpbmcubWFwKGUgPT4gdHlwZW9mIGUgIT09ICdzdHJpbmcnID8gZSArICcnIDogZSk7XG4gICAgfVxuICAgIGFyZ1N0cmluZyA9IGFyZ1N0cmluZy50cmltKCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBwcmV2QyA9IG51bGw7XG4gICAgbGV0IGMgPSBudWxsO1xuICAgIGxldCBvcGVuaW5nID0gbnVsbDtcbiAgICBjb25zdCBhcmdzID0gW107XG4gICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGFyZ1N0cmluZy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgcHJldkMgPSBjO1xuICAgICAgICBjID0gYXJnU3RyaW5nLmNoYXJBdChpaSk7XG4gICAgICAgIGlmIChjID09PSAnICcgJiYgIW9wZW5pbmcpIHtcbiAgICAgICAgICAgIGlmICghKHByZXZDID09PSAnICcpKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09IG9wZW5pbmcpIHtcbiAgICAgICAgICAgIG9wZW5pbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjID09PSBcIidcIiB8fCBjID09PSAnXCInKSAmJiAhb3BlbmluZykge1xuICAgICAgICAgICAgb3BlbmluZyA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmdzW2ldKVxuICAgICAgICAgICAgYXJnc1tpXSA9ICcnO1xuICAgICAgICBhcmdzW2ldICs9IGM7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuXG52YXIgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXk7XG4oZnVuY3Rpb24gKERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5KSB7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJCT09MRUFOXCJdID0gXCJib29sZWFuXCI7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJTVFJJTkdcIl0gPSBcInN0cmluZ1wiO1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiTlVNQkVSXCJdID0gXCJudW1iZXJcIjtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIkFSUkFZXCJdID0gXCJhcnJheVwiO1xufSkoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgfHwgKERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5ID0ge30pKTtcblxubGV0IG1peGluO1xuY2xhc3MgWWFyZ3NQYXJzZXIge1xuICAgIGNvbnN0cnVjdG9yKF9taXhpbikge1xuICAgICAgICBtaXhpbiA9IF9taXhpbjtcbiAgICB9XG4gICAgcGFyc2UoYXJnc0lucHV0LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIGFsaWFzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcnJheTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9vbGVhbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29uZmlnOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWdPYmplY3RzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb2VyY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvdW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlbnZQcmVmaXg6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5hcmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5vcm1hbGl6ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3RyaW5nOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBudW1iZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIF9fOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBrZXk6IHVuZGVmaW5lZFxuICAgICAgICB9LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgYXJncyA9IHRva2VuaXplQXJnU3RyaW5nKGFyZ3NJbnB1dCk7XG4gICAgICAgIGNvbnN0IGlucHV0SXNTdHJpbmcgPSB0eXBlb2YgYXJnc0lucHV0ID09PSAnc3RyaW5nJztcbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IGNvbWJpbmVBbGlhc2VzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5hbGlhcykpO1xuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAnYm9vbGVhbi1uZWdhdGlvbic6IHRydWUsXG4gICAgICAgICAgICAnY2FtZWwtY2FzZS1leHBhbnNpb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2NvbWJpbmUtYXJyYXlzJzogZmFsc2UsXG4gICAgICAgICAgICAnZG90LW5vdGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgICAgICdkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5JzogdHJ1ZSxcbiAgICAgICAgICAgICdmbGF0dGVuLWR1cGxpY2F0ZS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2dyZWVkeS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2hhbHQtYXQtbm9uLW9wdGlvbic6IGZhbHNlLFxuICAgICAgICAgICAgJ25hcmdzLWVhdHMtb3B0aW9ucyc6IGZhbHNlLFxuICAgICAgICAgICAgJ25lZ2F0aW9uLXByZWZpeCc6ICduby0nLFxuICAgICAgICAgICAgJ3BhcnNlLW51bWJlcnMnOiB0cnVlLFxuICAgICAgICAgICAgJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyc6IHRydWUsXG4gICAgICAgICAgICAncG9wdWxhdGUtLSc6IGZhbHNlLFxuICAgICAgICAgICAgJ3NldC1wbGFjZWhvbGRlci1rZXknOiBmYWxzZSxcbiAgICAgICAgICAgICdzaG9ydC1vcHRpb24tZ3JvdXBzJzogdHJ1ZSxcbiAgICAgICAgICAgICdzdHJpcC1hbGlhc2VkJzogZmFsc2UsXG4gICAgICAgICAgICAnc3RyaXAtZGFzaGVkJzogZmFsc2UsXG4gICAgICAgICAgICAndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnOiBmYWxzZVxuICAgICAgICB9LCBvcHRzLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5kZWZhdWx0KTtcbiAgICAgICAgY29uc3QgY29uZmlnT2JqZWN0cyA9IG9wdHMuY29uZmlnT2JqZWN0cyB8fCBbXTtcbiAgICAgICAgY29uc3QgZW52UHJlZml4ID0gb3B0cy5lbnZQcmVmaXg7XG4gICAgICAgIGNvbnN0IG5vdEZsYWdzT3B0aW9uID0gY29uZmlndXJhdGlvblsncG9wdWxhdGUtLSddO1xuICAgICAgICBjb25zdCBub3RGbGFnc0FyZ3YgPSBub3RGbGFnc09wdGlvbiA/ICctLScgOiAnXyc7XG4gICAgICAgIGNvbnN0IG5ld0FsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBkZWZhdWx0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBfXyA9IG9wdHMuX18gfHwgbWl4aW4uZm9ybWF0O1xuICAgICAgICBjb25zdCBmbGFncyA9IHtcbiAgICAgICAgICAgIGFsaWFzZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBhcnJheXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBib29sczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIHN0cmluZ3M6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBudW1iZXJzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY291bnRzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgbm9ybWFsaXplOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29uZmlnczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG5hcmdzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29lcmNpb25zOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAga2V5czogW11cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmUgPSAvXi0oWzAtOV0rKFxcLlswLTldKyk/fFxcLlswLTldKykkLztcbiAgICAgICAgY29uc3QgbmVnYXRlZEJvb2xlYW4gPSBuZXcgUmVnRXhwKCdeLS0nICsgY29uZmlndXJhdGlvblsnbmVnYXRpb24tcHJlZml4J10gKyAnKC4rKScpO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5hcnJheSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdHlwZW9mIG9wdCA9PT0gJ29iamVjdCcgPyBvcHQua2V5IDogb3B0O1xuICAgICAgICAgICAgY29uc3QgYXNzaWdubWVudCA9IE9iamVjdC5rZXlzKG9wdCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUZsYWdLZXlzID0ge1xuICAgICAgICAgICAgICAgICAgICBib29sZWFuOiAnYm9vbHMnLFxuICAgICAgICAgICAgICAgICAgICBzdHJpbmc6ICdzdHJpbmdzJyxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiAnbnVtYmVycydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheUZsYWdLZXlzW2tleV07XG4gICAgICAgICAgICB9KS5maWx0ZXIoQm9vbGVhbikucG9wKCk7XG4gICAgICAgICAgICBpZiAoYXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZsYWdzW2Fzc2lnbm1lbnRdW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmxhZ3MuYXJyYXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5ib29sZWFuIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5ib29sc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMuc3RyaW5nIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5zdHJpbmdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5udW1iZXIgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLm51bWJlcnNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmNvdW50IHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5jb3VudHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLm5vcm1hbGl6ZSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZmxhZ3Mubm9ybWFsaXplW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubmFyZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMubmFyZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MubmFyZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY29lcmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb2VyY2UpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29lcmNpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmNvbmZpZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMuY29uZmlnKSB8fCB0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgW10uY29uY2F0KG9wdHMuY29uZmlnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNvbmZpZ3Nba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb25maWcpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5jb25maWdzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV4dGVuZEFsaWFzZXMob3B0cy5rZXksIGFsaWFzZXMsIG9wdHMuZGVmYXVsdCwgZmxhZ3MuYXJyYXlzKTtcbiAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgKGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1thbGlhc10gPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgbGV0IG5vdEZsYWdzID0gW107XG4gICAgICAgIGNvbnN0IGFyZ3YgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHsgXzogW10gfSk7XG4gICAgICAgIGNvbnN0IGFyZ3ZSZXR1cm4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkQXJnID0gYXJnLnJlcGxhY2UoL14tezMsfS8sICctLS0nKTtcbiAgICAgICAgICAgIGxldCBicm9rZW47XG4gICAgICAgICAgICBsZXQga2V5O1xuICAgICAgICAgICAgbGV0IGxldHRlcnM7XG4gICAgICAgICAgICBsZXQgbTtcbiAgICAgICAgICAgIGxldCBuZXh0O1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKGFyZyAhPT0gJy0tJyAmJiAvXi0vLnRlc3QoYXJnKSAmJiBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRydW5jYXRlZEFyZy5tYXRjaCgvXi0tLSsoPXwkKS8pKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLis9LykgfHwgKCFjb25maWd1cmF0aW9uWydzaG9ydC1vcHRpb24tZ3JvdXBzJ10gJiYgYXJnLm1hdGNoKC9eLS4rPS8pKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tLT8oW149XSspPShbXFxzXFxTXSopJC8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKG1bMV0sIGZsYWdzLmFycmF5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXRBcnJheShpLCBtWzFdLCBhcmdzLCBtWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMobVsxXSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIG1bMV0sIGFyZ3MsIG1bMl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKSAmJiBjb25maWd1cmF0aW9uWydib29sZWFuLW5lZ2F0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSA/IFtmYWxzZV0gOiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS0uKy8pIHx8ICghY29uZmlndXJhdGlvblsnc2hvcnQtb3B0aW9uLWdyb3VwcyddICYmIGFyZy5tYXRjaCgvXi1bXi1dKy8pKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tLT8oLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCFuZXh0Lm1hdGNoKC9eLS8pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS5cXC4uKz0vKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tKFtePV0rKT0oW1xcc1xcU10qKSQvKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0uXFwuLisvKSAmJiAhYXJnLm1hdGNoKG5lZ2F0aXZlKSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLSguXFwuLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgIW5leHQubWF0Y2goL14tLykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi1bXi1dKy8pICYmICFhcmcubWF0Y2gobmVnYXRpdmUpKSB7XG4gICAgICAgICAgICAgICAgbGV0dGVycyA9IGFyZy5zbGljZSgxLCAtMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgICAgIGJyb2tlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnLnNsaWNlKGogKyAyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnLnNsaWNlKGogKyAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGxldHRlcnNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXRBcnJheShpLCBrZXksIGFyZ3MsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgL14tP1xcZCsoXFwuXFxkKik/KGUtP1xcZCspPyQvLnRlc3QobmV4dCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhuZXh0LCBmbGFncy5ib29scykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIGRlZmF1bHRWYWx1ZShsZXR0ZXJzW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga2V5ID0gYXJnLnNsaWNlKC0xKVswXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJyb2tlbiAmJiBrZXkgIT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnc1tpICsgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAhPT0gdW5kZWZpbmVkICYmICghL14oLXwtLSlbXi1dLy50ZXN0KG5leHQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLVswLTldJC8pICYmXG4gICAgICAgICAgICAgICAgYXJnLm1hdGNoKG5lZ2F0aXZlKSAmJlxuICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhhcmcuc2xpY2UoMSksIGZsYWdzLmJvb2xzKSkge1xuICAgICAgICAgICAgICAgIGtleSA9IGFyZy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgICAgICAgICAgICBub3RGbGFncyA9IGFyZ3Muc2xpY2UoaSArIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29uZmlndXJhdGlvblsnaGFsdC1hdC1ub24tb3B0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBub3RGbGFncyA9IGFyZ3Muc2xpY2UoaSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwdXNoUG9zaXRpb25hbChhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCB0cnVlKTtcbiAgICAgICAgYXBwbHlFbnZWYXJzKGFyZ3YsIGZhbHNlKTtcbiAgICAgICAgc2V0Q29uZmlnKGFyZ3YpO1xuICAgICAgICBzZXRDb25maWdPYmplY3RzKCk7XG4gICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGFyZ3YsIGZsYWdzLmFsaWFzZXMsIGRlZmF1bHRzLCB0cnVlKTtcbiAgICAgICAgYXBwbHlDb2VyY2lvbnMoYXJndik7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydzZXQtcGxhY2Vob2xkZXIta2V5J10pXG4gICAgICAgICAgICBzZXRQbGFjZWhvbGRlcktleXMoYXJndik7XG4gICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoIWhhc0tleShhcmd2LCBrZXkuc3BsaXQoJy4nKSkpXG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobm90RmxhZ3NPcHRpb24gJiYgbm90RmxhZ3MubGVuZ3RoKVxuICAgICAgICAgICAgYXJndltub3RGbGFnc0FyZ3ZdID0gW107XG4gICAgICAgIG5vdEZsYWdzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgYXJndltub3RGbGFnc0FyZ3ZdLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddICYmIGNvbmZpZ3VyYXRpb25bJ3N0cmlwLWRhc2hlZCddKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJy0tJyAmJiBrZXkuaW5jbHVkZXMoJy0nKSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBhcmd2W2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnc3RyaXAtYWxpYXNlZCddKSB7XG4gICAgICAgICAgICBbXS5jb25jYXQoLi4uT2JqZWN0LmtleXMoYWxpYXNlcykubWFwKGsgPT4gYWxpYXNlc1trXSkpLmZvckVhY2goYWxpYXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddICYmIGFsaWFzLmluY2x1ZGVzKCctJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3ZbYWxpYXMuc3BsaXQoJy4nKS5tYXAocHJvcCA9PiBjYW1lbENhc2UocHJvcCkpLmpvaW4oJy4nKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhcmd2W2FsaWFzXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHB1c2hQb3NpdGlvbmFsKGFyZykge1xuICAgICAgICAgICAgY29uc3QgbWF5YmVDb2VyY2VkTnVtYmVyID0gbWF5YmVDb2VyY2VOdW1iZXIoJ18nLCBhcmcpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgYXJndi5fLnB1c2gobWF5YmVDb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlYXROYXJncyhpLCBrZXksIGFyZ3MsIGFyZ0FmdGVyRXF1YWxTaWduKSB7XG4gICAgICAgICAgICBsZXQgaWk7XG4gICAgICAgICAgICBsZXQgdG9FYXQgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncyk7XG4gICAgICAgICAgICB0b0VhdCA9IHR5cGVvZiB0b0VhdCAhPT0gJ251bWJlcicgfHwgaXNOYU4odG9FYXQpID8gMSA6IHRvRWF0O1xuICAgICAgICAgICAgaWYgKHRvRWF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnQXJndW1lbnQgdW5leHBlY3RlZCBmb3I6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhdmFpbGFibGUgPSBpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgPyAwIDogMTtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWyduYXJncy1lYXRzLW9wdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAtIChpICsgMSkgKyBhdmFpbGFibGUgPCB0b0VhdCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IHRvRWF0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChpaSA9IGkgKyAxOyBpaSA8IGFyZ3MubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJnc1tpaV0ubWF0Y2goL14tW14wLTldLykgfHwgYXJnc1tpaV0ubWF0Y2gobmVnYXRpdmUpIHx8IGlzVW5rbm93bk9wdGlvbkFzQXJnKGFyZ3NbaWldKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSsrO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSA8IHRvRWF0KVxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29uc3VtZWQgPSBNYXRoLm1pbihhdmFpbGFibGUsIHRvRWF0KTtcbiAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pICYmIGNvbnN1bWVkID4gMCkge1xuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGFyZ0FmdGVyRXF1YWxTaWduKTtcbiAgICAgICAgICAgICAgICBjb25zdW1lZC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpaSA9IGkgKyAxOyBpaSA8IChjb25zdW1lZCArIGkgKyAxKTsgaWkrKykge1xuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGFyZ3NbaWldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoaSArIGNvbnN1bWVkKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlYXRBcnJheShpLCBrZXksIGFyZ3MsIGFyZ0FmdGVyRXF1YWxTaWduKSB7XG4gICAgICAgICAgICBsZXQgYXJnc1RvU2V0ID0gW107XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGFyZ0FmdGVyRXF1YWxTaWduIHx8IGFyZ3NbaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgbmFyZ3NDb3VudCA9IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKTtcbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiYgISgvXih0cnVlfGZhbHNlKSQvLnRlc3QobmV4dCkpKSB7XG4gICAgICAgICAgICAgICAgYXJnc1RvU2V0LnB1c2godHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc1VuZGVmaW5lZChuZXh0KSB8fFxuICAgICAgICAgICAgICAgIChpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgJiYgL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdHNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZlZhbCA9IGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldCA9IEFycmF5LmlzQXJyYXkoZGVmVmFsKSA/IGRlZlZhbCA6IFtkZWZWYWxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIGFyZ0FmdGVyRXF1YWxTaWduLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghY29uZmlndXJhdGlvblsnZ3JlZWR5LWFycmF5cyddICYmIGFyZ3NUb1NldC5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKG5hcmdzQ291bnQgJiYgdHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmIGFyZ3NUb1NldC5sZW5ndGggPj0gbmFyZ3NDb3VudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaWldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpID0gaWk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIG5leHQsIGlucHV0SXNTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmICgobmFyZ3NDb3VudCAmJiBhcmdzVG9TZXQubGVuZ3RoIDwgbmFyZ3NDb3VudCkgfHxcbiAgICAgICAgICAgICAgICAoaXNOYU4obmFyZ3NDb3VudCkgJiYgYXJnc1RvU2V0Lmxlbmd0aCA9PT0gMCkpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnTm90IGVub3VnaCBhcmd1bWVudHMgZm9sbG93aW5nOiAlcycsIGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnc1RvU2V0KTtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNldEFyZyhrZXksIHZhbCwgc2hvdWxkU3RyaXBRdW90ZXMgPSBpbnB1dElzU3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAoLy0vLnRlc3Qoa2V5KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxpYXMgPSBrZXkuc3BsaXQoJy4nKS5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZShwcm9wKTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKCcuJyk7XG4gICAgICAgICAgICAgICAgYWRkTmV3QWxpYXMoa2V5LCBhbGlhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHByb2Nlc3NWYWx1ZShrZXksIHZhbCwgc2hvdWxkU3RyaXBRdW90ZXMpO1xuICAgICAgICAgICAgY29uc3Qgc3BsaXRLZXkgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIHNldEtleShhcmd2LCBzcGxpdEtleSwgdmFsdWUpO1xuICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3BsaXRLZXkubGVuZ3RoID4gMSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgIChmbGFncy5hbGlhc2VzW3NwbGl0S2V5WzBdXSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQga2V5UHJvcGVydGllcyA9IHguc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IFtdLmNvbmNhdChzcGxpdEtleSk7XG4gICAgICAgICAgICAgICAgICAgIGEuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAga2V5UHJvcGVydGllcyA9IGtleVByb3BlcnRpZXMuY29uY2F0KGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2tleV0gfHwgW10pLmluY2x1ZGVzKGtleVByb3BlcnRpZXMuam9pbignLicpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIGtleVByb3BlcnRpZXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmFycmF5cykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gW2tleV0uY29uY2F0KGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSk7XG4gICAgICAgICAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFyZ3ZSZXR1cm4sIGtleSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBtaXhpbi5ub3JtYWxpemUodmFsdWUpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFkZE5ld0FsaWFzKGtleSwgYWxpYXMpIHtcbiAgICAgICAgICAgIGlmICghKGZsYWdzLmFsaWFzZXNba2V5XSAmJiBmbGFncy5hbGlhc2VzW2tleV0ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XSA9IFthbGlhc107XG4gICAgICAgICAgICAgICAgbmV3QWxpYXNlc1thbGlhc10gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1thbGlhc10gJiYgZmxhZ3MuYWxpYXNlc1thbGlhc10ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIGFkZE5ld0FsaWFzKGFsaWFzLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NWYWx1ZShrZXksIHZhbCwgc2hvdWxkU3RyaXBRdW90ZXMpIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRTdHJpcFF1b3Rlcykge1xuICAgICAgICAgICAgICAgIHZhbCA9IHN0cmlwUXVvdGVzKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpIHx8IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbCA9PT0gJ3RydWUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgICAgICAgICAgICAgPyB2YWwubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiBtYXliZUNvZXJjZU51bWJlcihrZXksIHYpOyB9KVxuICAgICAgICAgICAgICAgIDogbWF5YmVDb2VyY2VOdW1iZXIoa2V5LCB2YWwpO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykgJiYgKGlzVW5kZWZpbmVkKHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGluY3JlbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsLm1hcCgodmFsKSA9PiB7IHJldHVybiBtaXhpbi5ub3JtYWxpemUodmFsKTsgfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1peGluLm5vcm1hbGl6ZSh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJ10gJiYga2V5ID09PSAnXycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5zdHJpbmdzKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZENvZXJjZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcih2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsncGFyc2UtbnVtYmVycyddICYmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dmFsdWV9YCkpKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENvZXJjZU51bWJlciB8fCAoIWlzVW5kZWZpbmVkKHZhbHVlKSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWcoYXJndikge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGNvbmZpZ0xvb2t1cCwgZmxhZ3MuYWxpYXNlcywgZGVmYXVsdHMpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmxhZ3MuY29uZmlncykuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGFyZ3ZbY29uZmlnS2V5XSB8fCBjb25maWdMb29rdXBbY29uZmlnS2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbmZpZ1BhdGggPSBtaXhpbi5yZXNvbHZlKG1peGluLmN3ZCgpLCBjb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVDb25maWcgPSBmbGFncy5jb25maWdzW2NvbmZpZ0tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSByZXNvbHZlQ29uZmlnKHJlc29sdmVkQ29uZmlnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1peGluLnJlcXVpcmUocmVzb2x2ZWRDb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4Lm5hbWUgPT09ICdQZXJtaXNzaW9uRGVuaWVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJndltjb25maWdLZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgSlNPTiBjb25maWcgZmlsZTogJXMnLCBjb25maWdQYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3QoY29uZmlnLCBwcmV2KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbEtleSA9IHByZXYgPyBwcmV2ICsgJy4nICsga2V5IDoga2V5O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDb25maWdPYmplY3QodmFsdWUsIGZ1bGxLZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwgZnVsbEtleS5zcGxpdCgnLicpKSB8fCAoY2hlY2tBbGxBbGlhc2VzKGZ1bGxLZXksIGZsYWdzLmFycmF5cykgJiYgY29uZmlndXJhdGlvblsnY29tYmluZS1hcnJheXMnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhmdWxsS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3RzKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25maWdPYmplY3RzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGNvbmZpZ09iamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWdPYmplY3QpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5RW52VmFycyhhcmd2LCBjb25maWdPbmx5KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVudlByZWZpeCA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gdHlwZW9mIGVudlByZWZpeCA9PT0gJ3N0cmluZycgPyBlbnZQcmVmaXggOiAnJztcbiAgICAgICAgICAgIGNvbnN0IGVudiA9IG1peGluLmVudigpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGZ1bmN0aW9uIChlbnZWYXIpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09PSAnJyB8fCBlbnZWYXIubGFzdEluZGV4T2YocHJlZml4LCAwKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gZW52VmFyLnNwbGl0KCdfXycpLm1hcChmdW5jdGlvbiAoa2V5LCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtZWxDYXNlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKChjb25maWdPbmx5ICYmIGZsYWdzLmNvbmZpZ3Nba2V5cy5qb2luKCcuJyldKSB8fCAhY29uZmlnT25seSkgJiYgIWhhc0tleShhcmd2LCBrZXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleXMuam9pbignLicpLCBlbnZbZW52VmFyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBhcHBseUNvZXJjaW9ucyhhcmd2KSB7XG4gICAgICAgICAgICBsZXQgY29lcmNlO1xuICAgICAgICAgICAgY29uc3QgYXBwbGllZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGlmICghYXBwbGllZC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb2VyY2UgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb2VyY2lvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1heWJlQ29lcmNlTnVtYmVyKGtleSwgY29lcmNlKGFyZ3Zba2V5XSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpKS5mb3JFYWNoKGFsaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQuYWRkKGFsaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbYWxpXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpIHtcbiAgICAgICAgICAgIGZsYWdzLmtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKH5rZXkuaW5kZXhPZignLicpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd2W2tleV0gPT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgICAgICAgICBhcmd2W2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKG9iaiwgYWxpYXNlcywgZGVmYXVsdHMsIGNhbkxvZyA9IGZhbHNlKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkZWZhdWx0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkob2JqLCBrZXkuc3BsaXQoJy4nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0S2V5KG9iaiwga2V5LnNwbGl0KCcuJyksIGRlZmF1bHRzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FuTG9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdGVkW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAoYWxpYXNlc1trZXldIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzS2V5KG9iaiwgeC5zcGxpdCgnLicpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRLZXkob2JqLCB4LnNwbGl0KCcuJyksIGRlZmF1bHRzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYXNLZXkob2JqLCBrZXlzKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG9iajtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pXG4gICAgICAgICAgICAgICAga2V5cyA9IFtrZXlzLmpvaW4oJy4nKV07XG4gICAgICAgICAgICBrZXlzLnNsaWNlKDAsIC0xKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBvID0gKG9ba2V5XSB8fCB7fSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbyAhPT0gJ29iamVjdCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXkgaW4gbztcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRLZXkob2JqLCBrZXlzLCB2YWx1ZSkge1xuICAgICAgICAgICAgbGV0IG8gPSBvYmo7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb25bJ2RvdC1ub3RhdGlvbiddKVxuICAgICAgICAgICAgICAgIGtleXMgPSBba2V5cy5qb2luKCcuJyldO1xuICAgICAgICAgICAga2V5cy5zbGljZSgwLCAtMSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAga2V5ID0gc2FuaXRpemVLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG8gPT09ICdvYmplY3QnICYmIG9ba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XS5wdXNoKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHt9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvID0gb1trZXldW29ba2V5XS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG8gPSBvW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzYW5pdGl6ZUtleShrZXlzW2tleXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlQXJyYXkgPSBjaGVja0FsbEFsaWFzZXMoa2V5cy5qb2luKCcuJyksIGZsYWdzLmFycmF5cyk7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBkdXBsaWNhdGUgPSBjb25maWd1cmF0aW9uWydkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5J107XG4gICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykpIHtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgoIWlzVW5kZWZpbmVkKG9ba2V5XSkgJiYgZmxhZ3MubmFyZ3Nba2V5XSA9PT0gMSkgfHwgKEFycmF5LmlzQXJyYXkob1trZXldKSAmJiBvW2tleV0ubGVuZ3RoID09PSBmbGFncy5uYXJnc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBpbmNyZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IGluY3JlbWVudChvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSAmJiBpc1R5cGVBcnJheSAmJiBpc1ZhbHVlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gY29uZmlndXJhdGlvblsnZmxhdHRlbi1kdXBsaWNhdGUtYXJyYXlzJ10gPyBvW2tleV0uY29uY2F0KHZhbHVlKSA6IChBcnJheS5pc0FycmF5KG9ba2V5XVswXSkgPyBvW2tleV0gOiBbb1trZXldXSkuY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZHVwbGljYXRlICYmIEJvb2xlYW4oaXNUeXBlQXJyYXkpID09PSBCb29sZWFuKGlzVmFsdWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSBvW2tleV0uY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9ba2V5XSA9PT0gdW5kZWZpbmVkICYmIGlzVHlwZUFycmF5KSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gaXNWYWx1ZUFycmF5ID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHVwbGljYXRlICYmICEob1trZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpIHx8XG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGV4dGVuZEFsaWFzZXMoLi4uYXJncykge1xuICAgICAgICAgICAgYXJncy5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhvYmogfHwge30pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MuYWxpYXNlc1trZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0gPSBbXS5jb25jYXQoYWxpYXNlc1trZXldIHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmNvbmNhdChrZXkpLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvLS8udGVzdCh4KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGNhbWVsQ2FzZSh4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPT0ga2V5ICYmIGZsYWdzLmFsaWFzZXNba2V5XS5pbmRleE9mKGMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0ucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWxpYXNlc1tjXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmNvbmNhdChrZXkpLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4Lmxlbmd0aCA+IDEgJiYgL1tBLVpdLy50ZXN0KHgpICYmIGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gZGVjYW1lbGl6ZSh4LCAnLScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICE9PSBrZXkgJiYgZmxhZ3MuYWxpYXNlc1trZXldLmluZGV4T2YoYykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBbGlhc2VzW2NdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0uZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1t4XSA9IFtrZXldLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0uZmlsdGVyKGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggIT09IHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZykge1xuICAgICAgICAgICAgY29uc3QgdG9DaGVjayA9IFtdLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0gfHwgW10sIGtleSk7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmxhZyk7XG4gICAgICAgICAgICBjb25zdCBzZXRBbGlhcyA9IHRvQ2hlY2suZmluZChrZXkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKTtcbiAgICAgICAgICAgIHJldHVybiBzZXRBbGlhcyA/IGZsYWdbc2V0QWxpYXNdIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzQW55RmxhZyhrZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsYWdzS2V5cyA9IE9iamVjdC5rZXlzKGZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoZmxhZ3NLZXlzLm1hcChrID0+IGZsYWdzW2tdKSk7XG4gICAgICAgICAgICByZXR1cm4gdG9DaGVjay5zb21lKGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmxhZykgPyBmbGFnLmluY2x1ZGVzKGtleSkgOiBmbGFnW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYXNGbGFnc01hdGNoaW5nKGFyZywgLi4ucGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoLi4ucGF0dGVybnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2suc29tZShmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gYXJnLm1hdGNoKHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaCAmJiBoYXNBbnlGbGFnKG1hdGNoWzFdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0FsbFNob3J0RmxhZ3MoYXJnKSB7XG4gICAgICAgICAgICBpZiAoYXJnLm1hdGNoKG5lZ2F0aXZlKSB8fCAhYXJnLm1hdGNoKC9eLVteLV0rLykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaGFzQWxsRmxhZ3MgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IG5leHQ7XG4gICAgICAgICAgICBjb25zdCBsZXR0ZXJzID0gYXJnLnNsaWNlKDEpLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmcuc2xpY2UoaiArIDIpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzQW55RmxhZyhsZXR0ZXJzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNBbGxGbGFncyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChsZXR0ZXJzW2ogKyAxXSAmJiBsZXR0ZXJzW2ogKyAxXSA9PT0gJz0nKSB8fFxuICAgICAgICAgICAgICAgICAgICBuZXh0ID09PSAnLScgfHxcbiAgICAgICAgICAgICAgICAgICAgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJiAvXi0/XFxkKyhcXC5cXGQqKT8oZS0/XFxkKyk/JC8udGVzdChuZXh0KSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhc0FsbEZsYWdzO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVW5rbm93bk9wdGlvbkFzQXJnKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25bJ3Vua25vd24tb3B0aW9ucy1hcy1hcmdzJ10gJiYgaXNVbmtub3duT3B0aW9uKGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaXNVbmtub3duT3B0aW9uKGFyZykge1xuICAgICAgICAgICAgYXJnID0gYXJnLnJlcGxhY2UoL14tezMsfS8sICctLScpO1xuICAgICAgICAgICAgaWYgKGFyZy5tYXRjaChuZWdhdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzQWxsU2hvcnRGbGFncyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmxhZ1dpdGhFcXVhbHMgPSAvXi0rKFtePV0rPyk9W1xcc1xcU10qJC87XG4gICAgICAgICAgICBjb25zdCBub3JtYWxGbGFnID0gL14tKyhbXj1dKz8pJC87XG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5IeXBoZW4gPSAvXi0rKFtePV0rPyktJC87XG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5EaWdpdHMgPSAvXi0rKFtePV0rP1xcZCspJC87XG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyA9IC9eLSsoW149XSs/KVxcVysuKiQvO1xuICAgICAgICAgICAgcmV0dXJuICFoYXNGbGFnc01hdGNoaW5nKGFyZywgZmxhZ1dpdGhFcXVhbHMsIG5lZ2F0ZWRCb29sZWFuLCBub3JtYWxGbGFnLCBmbGFnRW5kaW5nSW5IeXBoZW4sIGZsYWdFbmRpbmdJbkRpZ2l0cywgZmxhZ0VuZGluZ0luTm9uV29yZENoYXJhY3RlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZShrZXkpIHtcbiAgICAgICAgICAgIGlmICghY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmXG4gICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykgJiZcbiAgICAgICAgICAgICAgICBgJHtrZXl9YCBpbiBkZWZhdWx0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRGb3JUeXBlKGd1ZXNzVHlwZShrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBkZWZhdWx0Rm9yVHlwZSh0eXBlKSB7XG4gICAgICAgICAgICBjb25zdCBkZWYgPSB7XG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU5dOiB0cnVlLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5TVFJJTkddOiAnJyxcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuTlVNQkVSXTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5BUlJBWV06IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGRlZlt0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBndWVzc1R5cGUoa2V5KSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU47XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Muc3RyaW5ncykpXG4gICAgICAgICAgICAgICAgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LlNUUklORztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm51bWJlcnMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5OVU1CRVI7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykpXG4gICAgICAgICAgICAgICAgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU47XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5BUlJBWTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKG51bSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bSA9PT0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrQ29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZmluZChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgY29uZmlndXJhdGlvbjogJXMsIG9wdHMuY291bnQgZXhjbHVkZXMgb3B0cy5hcnJheS4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb246ICVzLCBvcHRzLmNvdW50IGV4Y2x1ZGVzIG9wdHMubmFyZy4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGlhc2VzOiBPYmplY3QuYXNzaWduKHt9LCBmbGFncy5hbGlhc2VzKSxcbiAgICAgICAgICAgIGFyZ3Y6IE9iamVjdC5hc3NpZ24oYXJndlJldHVybiwgYXJndiksXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdGVkOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0ZWQpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgbmV3QWxpYXNlczogT2JqZWN0LmFzc2lnbih7fSwgbmV3QWxpYXNlcylcbiAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21iaW5lQWxpYXNlcyhhbGlhc2VzKSB7XG4gICAgY29uc3QgYWxpYXNBcnJheXMgPSBbXTtcbiAgICBjb25zdCBjb21iaW5lZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGNoYW5nZSA9IHRydWU7XG4gICAgT2JqZWN0LmtleXMoYWxpYXNlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGFsaWFzQXJyYXlzLnB1c2goW10uY29uY2F0KGFsaWFzZXNba2V5XSwga2V5KSk7XG4gICAgfSk7XG4gICAgd2hpbGUgKGNoYW5nZSkge1xuICAgICAgICBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaWkgPSBpICsgMTsgaWkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBhbGlhc0FycmF5c1tpXS5maWx0ZXIoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzQXJyYXlzW2lpXS5pbmRleE9mKHYpICE9PSAtMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5c1tpXSA9IGFsaWFzQXJyYXlzW2ldLmNvbmNhdChhbGlhc0FycmF5c1tpaV0pO1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5cy5zcGxpY2UoaWksIDEpO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWxpYXNBcnJheXMuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXNBcnJheSkge1xuICAgICAgICBhbGlhc0FycmF5ID0gYWxpYXNBcnJheS5maWx0ZXIoZnVuY3Rpb24gKHYsIGksIHNlbGYpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmluZGV4T2YodikgPT09IGk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBsYXN0QWxpYXMgPSBhbGlhc0FycmF5LnBvcCgpO1xuICAgICAgICBpZiAobGFzdEFsaWFzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGxhc3RBbGlhcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbWJpbmVkW2xhc3RBbGlhc10gPSBhbGlhc0FycmF5O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbWJpbmVkO1xufVxuZnVuY3Rpb24gaW5jcmVtZW50KG9yaWcpIHtcbiAgICByZXR1cm4gb3JpZyAhPT0gdW5kZWZpbmVkID8gb3JpZyArIDEgOiAxO1xufVxuZnVuY3Rpb24gc2FuaXRpemVLZXkoa2V5KSB7XG4gICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycpXG4gICAgICAgIHJldHVybiAnX19fcHJvdG9fX18nO1xuICAgIHJldHVybiBrZXk7XG59XG5mdW5jdGlvbiBzdHJpcFF1b3Rlcyh2YWwpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICh2YWxbMF0gPT09IFwiJ1wiIHx8IHZhbFswXSA9PT0gJ1wiJykgJiZcbiAgICAgICAgdmFsW3ZhbC5sZW5ndGggLSAxXSA9PT0gdmFsWzBdKVxuICAgICAgICA/IHZhbC5zdWJzdHJpbmcoMSwgdmFsLmxlbmd0aCAtIDEpXG4gICAgICAgIDogdmFsO1xufVxuXG52YXIgX2EsIF9iLCBfYztcbmNvbnN0IG1pbk5vZGVWZXJzaW9uID0gKHByb2Nlc3MgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuWUFSR1NfTUlOX05PREVfVkVSU0lPTilcbiAgICA/IE51bWJlcihwcm9jZXNzLmVudi5ZQVJHU19NSU5fTk9ERV9WRVJTSU9OKVxuICAgIDogMTI7XG5jb25zdCBub2RlVmVyc2lvbiA9IChfYiA9IChfYSA9IHByb2Nlc3MgPT09IG51bGwgfHwgcHJvY2VzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvY2Vzcy52ZXJzaW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vZGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IChfYyA9IHByb2Nlc3MgPT09IG51bGwgfHwgcHJvY2VzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvY2Vzcy52ZXJzaW9uKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Muc2xpY2UoMSk7XG5pZiAobm9kZVZlcnNpb24pIHtcbiAgICBjb25zdCBtYWpvciA9IE51bWJlcihub2RlVmVyc2lvbi5tYXRjaCgvXihbXi5dKykvKVsxXSk7XG4gICAgaWYgKG1ham9yIDwgbWluTm9kZVZlcnNpb24pIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYHlhcmdzIHBhcnNlciBzdXBwb3J0cyBhIG1pbmltdW0gTm9kZS5qcyB2ZXJzaW9uIG9mICR7bWluTm9kZVZlcnNpb259LiBSZWFkIG91ciB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5OiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3MtcGFyc2VyI3N1cHBvcnRlZC1ub2RlanMtdmVyc2lvbnNgKTtcbiAgICB9XG59XG5jb25zdCBlbnYgPSBwcm9jZXNzID8gcHJvY2Vzcy5lbnYgOiB7fTtcbmNvbnN0IHBhcnNlciA9IG5ldyBZYXJnc1BhcnNlcih7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCxcbiAgICBlbnY6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGVudjtcbiAgICB9LFxuICAgIGZvcm1hdDogdXRpbC5mb3JtYXQsXG4gICAgbm9ybWFsaXplOiBwYXRoLm5vcm1hbGl6ZSxcbiAgICByZXNvbHZlOiBwYXRoLnJlc29sdmUsXG4gICAgcmVxdWlyZTogKHBhdGgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF0aC5tYXRjaCgvXFwuanNvbiQvKSkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgsICd1dGY4JykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ29ubHkgLmpzb24gY29uZmlnIGZpbGVzIGFyZSBzdXBwb3J0ZWQgaW4gRVNNJyk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbmNvbnN0IHlhcmdzUGFyc2VyID0gZnVuY3Rpb24gUGFyc2VyKGFyZ3MsIG9wdHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIucGFyc2UoYXJncy5zbGljZSgpLCBvcHRzKTtcbiAgICByZXR1cm4gcmVzdWx0LmFyZ3Y7XG59O1xueWFyZ3NQYXJzZXIuZGV0YWlsZWQgPSBmdW5jdGlvbiAoYXJncywgb3B0cykge1xuICAgIHJldHVybiBwYXJzZXIucGFyc2UoYXJncy5zbGljZSgpLCBvcHRzKTtcbn07XG55YXJnc1BhcnNlci5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG55YXJnc1BhcnNlci5kZWNhbWVsaXplID0gZGVjYW1lbGl6ZTtcbnlhcmdzUGFyc2VyLmxvb2tzTGlrZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcjtcblxubW9kdWxlLmV4cG9ydHMgPSB5YXJnc1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO3ZhciB0PXJlcXVpcmUoXCJhc3NlcnRcIik7Y2xhc3MgZSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHR8fFwieWFyZ3MgZXJyb3JcIiksdGhpcy5uYW1lPVwiWUVycm9yXCIsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsZSl9fWxldCBzLGk9W107ZnVuY3Rpb24gbih0LG8sYSxoKXtzPWg7bGV0IGw9e307aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsXCJleHRlbmRzXCIpKXtpZihcInN0cmluZ1wiIT10eXBlb2YgdC5leHRlbmRzKXJldHVybiBsO2NvbnN0IHI9L1xcLmpzb258XFwuLipyYyQvLnRlc3QodC5leHRlbmRzKTtsZXQgaD1udWxsO2lmKHIpaD1mdW5jdGlvbih0LGUpe3JldHVybiBzLnBhdGgucmVzb2x2ZSh0LGUpfShvLHQuZXh0ZW5kcyk7ZWxzZSB0cnl7aD1yZXF1aXJlLnJlc29sdmUodC5leHRlbmRzKX1jYXRjaChlKXtyZXR1cm4gdH0hZnVuY3Rpb24odCl7aWYoaS5pbmRleE9mKHQpPi0xKXRocm93IG5ldyBlKGBDaXJjdWxhciBleHRlbmRlZCBjb25maWd1cmF0aW9uczogJyR7dH0nLmApfShoKSxpLnB1c2goaCksbD1yP0pTT04ucGFyc2Uocy5yZWFkRmlsZVN5bmMoaCxcInV0ZjhcIikpOnJlcXVpcmUodC5leHRlbmRzKSxkZWxldGUgdC5leHRlbmRzLGw9bihsLHMucGF0aC5kaXJuYW1lKGgpLGEscyl9cmV0dXJuIGk9W10sYT9yKGwsdCk6T2JqZWN0LmFzc2lnbih7fSxsLHQpfWZ1bmN0aW9uIHIodCxlKXtjb25zdCBzPXt9O2Z1bmN0aW9uIGkodCl7cmV0dXJuIHQmJlwib2JqZWN0XCI9PXR5cGVvZiB0JiYhQXJyYXkuaXNBcnJheSh0KX1PYmplY3QuYXNzaWduKHMsdCk7Zm9yKGNvbnN0IG4gb2YgT2JqZWN0LmtleXMoZSkpaShlW25dKSYmaShzW25dKT9zW25dPXIodFtuXSxlW25dKTpzW25dPWVbbl07cmV0dXJuIHN9ZnVuY3Rpb24gbyh0KXtjb25zdCBlPXQucmVwbGFjZSgvXFxzezIsfS9nLFwiIFwiKS5zcGxpdCgvXFxzKyg/IVteW10qXXxbXjxdKj4pLykscz0vXFwuKltcXF1bPD5dL2csaT1lLnNoaWZ0KCk7aWYoIWkpdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIGZvdW5kIGluOiAke3R9YCk7Y29uc3Qgbj17Y21kOmkucmVwbGFjZShzLFwiXCIpLGRlbWFuZGVkOltdLG9wdGlvbmFsOltdfTtyZXR1cm4gZS5mb3JFYWNoKCgodCxpKT0+e2xldCByPSExO3Q9dC5yZXBsYWNlKC9cXHMvZyxcIlwiKSwvXFwuK1tcXF0+XS8udGVzdCh0KSYmaT09PWUubGVuZ3RoLTEmJihyPSEwKSwvXlxcWy8udGVzdCh0KT9uLm9wdGlvbmFsLnB1c2goe2NtZDp0LnJlcGxhY2UocyxcIlwiKS5zcGxpdChcInxcIiksdmFyaWFkaWM6cn0pOm4uZGVtYW5kZWQucHVzaCh7Y21kOnQucmVwbGFjZShzLFwiXCIpLnNwbGl0KFwifFwiKSx2YXJpYWRpYzpyfSl9KSksbn1jb25zdCBhPVtcImZpcnN0XCIsXCJzZWNvbmRcIixcInRoaXJkXCIsXCJmb3VydGhcIixcImZpZnRoXCIsXCJzaXh0aFwiXTtmdW5jdGlvbiBoKHQscyxpKXt0cnl7bGV0IG49MDtjb25zdFtyLGEsaF09XCJvYmplY3RcIj09dHlwZW9mIHQ/W3tkZW1hbmRlZDpbXSxvcHRpb25hbDpbXX0sdCxzXTpbbyhgY21kICR7dH1gKSxzLGldLGY9W10uc2xpY2UuY2FsbChhKTtmb3IoO2YubGVuZ3RoJiZ2b2lkIDA9PT1mW2YubGVuZ3RoLTFdOylmLnBvcCgpO2NvbnN0IGQ9aHx8Zi5sZW5ndGg7aWYoZDxyLmRlbWFuZGVkLmxlbmd0aCl0aHJvdyBuZXcgZShgTm90IGVub3VnaCBhcmd1bWVudHMgcHJvdmlkZWQuIEV4cGVjdGVkICR7ci5kZW1hbmRlZC5sZW5ndGh9IGJ1dCByZWNlaXZlZCAke2YubGVuZ3RofS5gKTtjb25zdCB1PXIuZGVtYW5kZWQubGVuZ3RoK3Iub3B0aW9uYWwubGVuZ3RoO2lmKGQ+dSl0aHJvdyBuZXcgZShgVG9vIG1hbnkgYXJndW1lbnRzIHByb3ZpZGVkLiBFeHBlY3RlZCBtYXggJHt1fSBidXQgcmVjZWl2ZWQgJHtkfS5gKTtyLmRlbWFuZGVkLmZvckVhY2goKHQ9Pntjb25zdCBlPWwoZi5zaGlmdCgpKTswPT09dC5jbWQuZmlsdGVyKCh0PT50PT09ZXx8XCIqXCI9PT10KSkubGVuZ3RoJiZjKGUsdC5jbWQsbiksbis9MX0pKSxyLm9wdGlvbmFsLmZvckVhY2goKHQ9PntpZigwPT09Zi5sZW5ndGgpcmV0dXJuO2NvbnN0IGU9bChmLnNoaWZ0KCkpOzA9PT10LmNtZC5maWx0ZXIoKHQ9PnQ9PT1lfHxcIipcIj09PXQpKS5sZW5ndGgmJmMoZSx0LmNtZCxuKSxuKz0xfSkpfWNhdGNoKHQpe2NvbnNvbGUud2Fybih0LnN0YWNrKX19ZnVuY3Rpb24gbCh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT9cImFycmF5XCI6bnVsbD09PXQ/XCJudWxsXCI6dHlwZW9mIHR9ZnVuY3Rpb24gYyh0LHMsaSl7dGhyb3cgbmV3IGUoYEludmFsaWQgJHthW2ldfHxcIm1hbnlpdGhcIn0gYXJndW1lbnQuIEV4cGVjdGVkICR7cy5qb2luKFwiIG9yIFwiKX0gYnV0IHJlY2VpdmVkICR7dH0uYCl9ZnVuY3Rpb24gZih0KXtyZXR1cm4hIXQmJiEhdC50aGVuJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnRoZW59ZnVuY3Rpb24gZCh0LGUscyxpKXtzLmFzc2VydC5ub3RTdHJpY3RFcXVhbCh0LGUsaSl9ZnVuY3Rpb24gdSh0LGUpe2UuYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiB0LFwic3RyaW5nXCIpfWZ1bmN0aW9uIHAodCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpfWZ1bmN0aW9uIGcodD17fSxlPSgoKT0+ITApKXtjb25zdCBzPXt9O3JldHVybiBwKHQpLmZvckVhY2goKGk9PntlKGksdFtpXSkmJihzW2ldPXRbaV0pfSkpLHN9ZnVuY3Rpb24gbSgpe3JldHVybiBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uJiYhcHJvY2Vzcy5kZWZhdWx0QXBwPzA6MX1mdW5jdGlvbiB5KCl7cmV0dXJuIHByb2Nlc3MuYXJndlttKCldfXZhciBiPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGhpZGVCaW46ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2xpY2UobSgpKzEpfSxnZXRQcm9jZXNzQXJndkJpbjp5fSk7ZnVuY3Rpb24gdih0LGUscyxpKXtpZihcImFcIj09PXMmJiFpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZT90IT09ZXx8IWk6IWUuaGFzKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7cmV0dXJuXCJtXCI9PT1zP2k6XCJhXCI9PT1zP2kuY2FsbCh0KTppP2kudmFsdWU6ZS5nZXQodCl9ZnVuY3Rpb24gTyh0LGUscyxpLG4pe2lmKFwibVwiPT09aSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO2lmKFwiYVwiPT09aSYmIW4pdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBlP3QhPT1lfHwhbjohZS5oYXModCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO3JldHVyblwiYVwiPT09aT9uLmNhbGwodCxzKTpuP24udmFsdWU9czplLnNldCh0LHMpLHN9Y2xhc3Mgd3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmdsb2JhbE1pZGRsZXdhcmU9W10sdGhpcy5mcm96ZW5zPVtdLHRoaXMueWFyZ3M9dH1hZGRNaWRkbGV3YXJlKHQsZSxzPSEwLGk9ITEpe2lmKGgoXCI8YXJyYXl8ZnVuY3Rpb24+IFtib29sZWFuXSBbYm9vbGVhbl0gW2Jvb2xlYW5dXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSxBcnJheS5pc0FycmF5KHQpKXtmb3IobGV0IGk9MDtpPHQubGVuZ3RoO2krKyl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdFtpXSl0aHJvdyBFcnJvcihcIm1pZGRsZXdhcmUgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO2NvbnN0IG49dFtpXTtuLmFwcGx5QmVmb3JlVmFsaWRhdGlvbj1lLG4uZ2xvYmFsPXN9QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5nbG9iYWxNaWRkbGV3YXJlLHQpfWVsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdCl7Y29uc3Qgbj10O24uYXBwbHlCZWZvcmVWYWxpZGF0aW9uPWUsbi5nbG9iYWw9cyxuLm11dGF0ZXM9aSx0aGlzLmdsb2JhbE1pZGRsZXdhcmUucHVzaCh0KX1yZXR1cm4gdGhpcy55YXJnc31hZGRDb2VyY2VNaWRkbGV3YXJlKHQsZSl7Y29uc3Qgcz10aGlzLnlhcmdzLmdldEFsaWFzZXMoKTtyZXR1cm4gdGhpcy5nbG9iYWxNaWRkbGV3YXJlPXRoaXMuZ2xvYmFsTWlkZGxld2FyZS5maWx0ZXIoKHQ9Pntjb25zdCBpPVsuLi5zW2VdfHxbXSxlXTtyZXR1cm4hdC5vcHRpb258fCFpLmluY2x1ZGVzKHQub3B0aW9uKX0pKSx0Lm9wdGlvbj1lLHRoaXMuYWRkTWlkZGxld2FyZSh0LCEwLCEwLCEwKX1nZXRNaWRkbGV3YXJlKCl7cmV0dXJuIHRoaXMuZ2xvYmFsTWlkZGxld2FyZX1mcmVlemUoKXt0aGlzLmZyb3plbnMucHVzaChbLi4udGhpcy5nbG9iYWxNaWRkbGV3YXJlXSl9dW5mcmVlemUoKXtjb25zdCB0PXRoaXMuZnJvemVucy5wb3AoKTt2b2lkIDAhPT10JiYodGhpcy5nbG9iYWxNaWRkbGV3YXJlPXQpfXJlc2V0KCl7dGhpcy5nbG9iYWxNaWRkbGV3YXJlPXRoaXMuZ2xvYmFsTWlkZGxld2FyZS5maWx0ZXIoKHQ9PnQuZ2xvYmFsKSl9fWZ1bmN0aW9uIEModCxlLHMsaSl7cmV0dXJuIHMucmVkdWNlKCgodCxzKT0+e2lmKHMuYXBwbHlCZWZvcmVWYWxpZGF0aW9uIT09aSlyZXR1cm4gdDtpZihzLm11dGF0ZXMpe2lmKHMuYXBwbGllZClyZXR1cm4gdDtzLmFwcGxpZWQ9ITB9aWYoZih0KSlyZXR1cm4gdC50aGVuKCh0PT5Qcm9taXNlLmFsbChbdCxzKHQsZSldKSkpLnRoZW4oKChbdCxlXSk9Pk9iamVjdC5hc3NpZ24odCxlKSkpO3tjb25zdCBpPXModCxlKTtyZXR1cm4gZihpKT9pLnRoZW4oKGU9Pk9iamVjdC5hc3NpZ24odCxlKSkpOk9iamVjdC5hc3NpZ24odCxpKX19KSx0KX1mdW5jdGlvbiBqKHQsZSxzPSh0PT57dGhyb3cgdH0pKXt0cnl7Y29uc3Qgcz1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3QoKTp0O3JldHVybiBmKHMpP3MudGhlbigodD0+ZSh0KSkpOmUocyl9Y2F0Y2godCl7cmV0dXJuIHModCl9fWNvbnN0IE09LyheXFwqKXwoXlxcJDApLztjbGFzcyBfe2NvbnN0cnVjdG9yKHQsZSxzLGkpe3RoaXMucmVxdWlyZUNhY2hlPW5ldyBTZXQsdGhpcy5oYW5kbGVycz17fSx0aGlzLmFsaWFzTWFwPXt9LHRoaXMuZnJvemVucz1bXSx0aGlzLnNoaW09aSx0aGlzLnVzYWdlPXQsdGhpcy5nbG9iYWxNaWRkbGV3YXJlPXMsdGhpcy52YWxpZGF0aW9uPWV9YWRkRGlyZWN0b3J5KHQsZSxzLGkpe1wiYm9vbGVhblwiIT10eXBlb2YoaT1pfHx7fSkucmVjdXJzZSYmKGkucmVjdXJzZT0hMSksQXJyYXkuaXNBcnJheShpLmV4dGVuc2lvbnMpfHwoaS5leHRlbnNpb25zPVtcImpzXCJdKTtjb25zdCBuPVwiZnVuY3Rpb25cIj09dHlwZW9mIGkudmlzaXQ/aS52aXNpdDp0PT50O2kudmlzaXQ9KHQsZSxzKT0+e2NvbnN0IGk9bih0LGUscyk7aWYoaSl7aWYodGhpcy5yZXF1aXJlQ2FjaGUuaGFzKGUpKXJldHVybiBpO3RoaXMucmVxdWlyZUNhY2hlLmFkZChlKSx0aGlzLmFkZEhhbmRsZXIoaSl9cmV0dXJuIGl9LHRoaXMuc2hpbS5yZXF1aXJlRGlyZWN0b3J5KHtyZXF1aXJlOmUsZmlsZW5hbWU6c30sdCxpKX1hZGRIYW5kbGVyKHQsZSxzLGksbixyKXtsZXQgYT1bXTtjb25zdCBoPWZ1bmN0aW9uKHQpe3JldHVybiB0P3QubWFwKCh0PT4odC5hcHBseUJlZm9yZVZhbGlkYXRpb249ITEsdCkpKTpbXX0obik7aWYoaT1pfHwoKCk9Pnt9KSxBcnJheS5pc0FycmF5KHQpKWlmKGZ1bmN0aW9uKHQpe3JldHVybiB0LmV2ZXJ5KCh0PT5cInN0cmluZ1wiPT10eXBlb2YgdCkpfSh0KSlbdCwuLi5hXT10O2Vsc2UgZm9yKGNvbnN0IGUgb2YgdCl0aGlzLmFkZEhhbmRsZXIoZSk7ZWxzZXtpZihmdW5jdGlvbih0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdCYmIUFycmF5LmlzQXJyYXkodCl9KHQpKXtsZXQgZT1BcnJheS5pc0FycmF5KHQuY29tbWFuZCl8fFwic3RyaW5nXCI9PXR5cGVvZiB0LmNvbW1hbmQ/dC5jb21tYW5kOnRoaXMubW9kdWxlTmFtZSh0KTtyZXR1cm4gdC5hbGlhc2VzJiYoZT1bXS5jb25jYXQoZSkuY29uY2F0KHQuYWxpYXNlcykpLHZvaWQgdGhpcy5hZGRIYW5kbGVyKGUsdGhpcy5leHRyYWN0RGVzYyh0KSx0LmJ1aWxkZXIsdC5oYW5kbGVyLHQubWlkZGxld2FyZXMsdC5kZXByZWNhdGVkKX1pZihrKHMpKXJldHVybiB2b2lkIHRoaXMuYWRkSGFuZGxlcihbdF0uY29uY2F0KGEpLGUscy5idWlsZGVyLHMuaGFuZGxlcixzLm1pZGRsZXdhcmVzLHMuZGVwcmVjYXRlZCl9aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe2NvbnN0IG49byh0KTthPWEubWFwKCh0PT5vKHQpLmNtZCkpO2xldCBsPSExO2NvbnN0IGM9W24uY21kXS5jb25jYXQoYSkuZmlsdGVyKCh0PT4hTS50ZXN0KHQpfHwobD0hMCwhMSkpKTswPT09Yy5sZW5ndGgmJmwmJmMucHVzaChcIiQwXCIpLGwmJihuLmNtZD1jWzBdLGE9Yy5zbGljZSgxKSx0PXQucmVwbGFjZShNLG4uY21kKSksYS5mb3JFYWNoKCh0PT57dGhpcy5hbGlhc01hcFt0XT1uLmNtZH0pKSwhMSE9PWUmJnRoaXMudXNhZ2UuY29tbWFuZCh0LGUsbCxhLHIpLHRoaXMuaGFuZGxlcnNbbi5jbWRdPXtvcmlnaW5hbDp0LGRlc2NyaXB0aW9uOmUsaGFuZGxlcjppLGJ1aWxkZXI6c3x8e30sbWlkZGxld2FyZXM6aCxkZXByZWNhdGVkOnIsZGVtYW5kZWQ6bi5kZW1hbmRlZCxvcHRpb25hbDpuLm9wdGlvbmFsfSxsJiYodGhpcy5kZWZhdWx0Q29tbWFuZD10aGlzLmhhbmRsZXJzW24uY21kXSl9fWdldENvbW1hbmRIYW5kbGVycygpe3JldHVybiB0aGlzLmhhbmRsZXJzfWdldENvbW1hbmRzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaGFuZGxlcnMpLmNvbmNhdChPYmplY3Qua2V5cyh0aGlzLmFsaWFzTWFwKSl9aGFzRGVmYXVsdENvbW1hbmQoKXtyZXR1cm4hIXRoaXMuZGVmYXVsdENvbW1hbmR9cnVuQ29tbWFuZCh0LGUscyxpLG4scil7Y29uc3Qgbz10aGlzLmhhbmRsZXJzW3RdfHx0aGlzLmhhbmRsZXJzW3RoaXMuYWxpYXNNYXBbdF1dfHx0aGlzLmRlZmF1bHRDb21tYW5kLGE9ZS5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCksaD1hLmNvbW1hbmRzLnNsaWNlKCksbD0hdDt0JiYoYS5jb21tYW5kcy5wdXNoKHQpLGEuZnVsbENvbW1hbmRzLnB1c2goby5vcmlnaW5hbCkpO2NvbnN0IGM9dGhpcy5hcHBseUJ1aWxkZXJVcGRhdGVVc2FnZUFuZFBhcnNlKGwsbyxlLHMuYWxpYXNlcyxoLGksbixyKTtyZXR1cm4gZihjKT9jLnRoZW4oKHQ9PnRoaXMuYXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0KGwsbyx0LmlubmVyQXJndixhLG4sdC5hbGlhc2VzLGUpKSk6dGhpcy5hcHBseU1pZGRsZXdhcmVBbmRHZXRSZXN1bHQobCxvLGMuaW5uZXJBcmd2LGEsbixjLmFsaWFzZXMsZSl9YXBwbHlCdWlsZGVyVXBkYXRlVXNhZ2VBbmRQYXJzZSh0LGUscyxpLG4scixvLGEpe2NvbnN0IGg9ZS5idWlsZGVyO2xldCBsPXM7aWYoeChoKSl7cy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkuZnJlZXplKCk7Y29uc3QgYz1oKHMuZ2V0SW50ZXJuYWxNZXRob2RzKCkucmVzZXQoaSksYSk7aWYoZihjKSlyZXR1cm4gYy50aGVuKChpPT57dmFyIGE7cmV0dXJuIGw9KGE9aSkmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGEuZ2V0SW50ZXJuYWxNZXRob2RzP2k6cyx0aGlzLnBhcnNlQW5kVXBkYXRlVXNhZ2UodCxlLGwsbixyLG8pfSkpfWVsc2UoZnVuY3Rpb24odCl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIHR9KShoKSYmKHMuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmZyZWV6ZSgpLGw9cy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5yZXNldChpKSxPYmplY3Qua2V5cyhlLmJ1aWxkZXIpLmZvckVhY2goKHQ9PntsLm9wdGlvbih0LGhbdF0pfSkpKTtyZXR1cm4gdGhpcy5wYXJzZUFuZFVwZGF0ZVVzYWdlKHQsZSxsLG4scixvKX1wYXJzZUFuZFVwZGF0ZVVzYWdlKHQsZSxzLGksbixyKXt0JiZzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS51bmZyZWV6ZSghMCksdGhpcy5zaG91bGRVcGRhdGVVc2FnZShzKSYmcy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkudXNhZ2UodGhpcy51c2FnZUZyb21QYXJlbnRDb21tYW5kc0NvbW1hbmRIYW5kbGVyKGksZSksZS5kZXNjcmlwdGlvbik7Y29uc3Qgbz1zLmdldEludGVybmFsTWV0aG9kcygpLnJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzKG51bGwsdm9pZCAwLCEwLG4scik7cmV0dXJuIGYobyk/by50aGVuKCh0PT4oe2FsaWFzZXM6cy5wYXJzZWQuYWxpYXNlcyxpbm5lckFyZ3Y6dH0pKSk6e2FsaWFzZXM6cy5wYXJzZWQuYWxpYXNlcyxpbm5lckFyZ3Y6b319c2hvdWxkVXBkYXRlVXNhZ2UodCl7cmV0dXJuIXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmdldFVzYWdlRGlzYWJsZWQoKSYmMD09PXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmdldFVzYWdlKCkubGVuZ3RofXVzYWdlRnJvbVBhcmVudENvbW1hbmRzQ29tbWFuZEhhbmRsZXIodCxlKXtjb25zdCBzPU0udGVzdChlLm9yaWdpbmFsKT9lLm9yaWdpbmFsLnJlcGxhY2UoTSxcIlwiKS50cmltKCk6ZS5vcmlnaW5hbCxpPXQuZmlsdGVyKCh0PT4hTS50ZXN0KHQpKSk7cmV0dXJuIGkucHVzaChzKSxgJDAgJHtpLmpvaW4oXCIgXCIpfWB9aGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdCh0LGUscyxpLG4scixvLGEpe2lmKCFyLmdldEludGVybmFsTWV0aG9kcygpLmdldEhhc091dHB1dCgpKXtjb25zdCBlPXIuZ2V0SW50ZXJuYWxNZXRob2RzKCkucnVuVmFsaWRhdGlvbihuLGEsci5wYXJzZWQuZXJyb3IsdCk7cz1qKHMsKHQ9PihlKHQpLHQpKSl9aWYoZS5oYW5kbGVyJiYhci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRIYXNPdXRwdXQoKSl7ci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5zZXRIYXNPdXRwdXQoKTtjb25zdCBpPSEhci5nZXRPcHRpb25zKCkuY29uZmlndXJhdGlvbltcInBvcHVsYXRlLS1cIl07ci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5wb3N0UHJvY2VzcyhzLGksITEsITEpLHM9aihzPUMocyxyLG8sITEpLCh0PT57Y29uc3Qgcz1lLmhhbmRsZXIodCk7cmV0dXJuIGYocyk/cy50aGVuKCgoKT0+dCkpOnR9KSksdHx8ci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkuY2FjaGVIZWxwTWVzc2FnZSgpLGYocykmJiFyLmdldEludGVybmFsTWV0aG9kcygpLmhhc1BhcnNlQ2FsbGJhY2soKSYmcy5jYXRjaCgodD0+e3RyeXtyLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5mYWlsKG51bGwsdCl9Y2F0Y2godCl7fX0pKX1yZXR1cm4gdHx8KGkuY29tbWFuZHMucG9wKCksaS5mdWxsQ29tbWFuZHMucG9wKCkpLHN9YXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0KHQsZSxzLGksbixyLG8pe2xldCBhPXt9O2lmKG4pcmV0dXJuIHM7by5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRIYXNPdXRwdXQoKXx8KGE9dGhpcy5wb3B1bGF0ZVBvc2l0aW9uYWxzKGUscyxpLG8pKTtjb25zdCBoPXRoaXMuZ2xvYmFsTWlkZGxld2FyZS5nZXRNaWRkbGV3YXJlKCkuc2xpY2UoMCkuY29uY2F0KGUubWlkZGxld2FyZXMpLGw9QyhzLG8saCwhMCk7cmV0dXJuIGYobCk/bC50aGVuKChzPT50aGlzLmhhbmRsZVZhbGlkYXRpb25BbmRHZXRSZXN1bHQodCxlLHMsaSxyLG8saCxhKSkpOnRoaXMuaGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdCh0LGUsbCxpLHIsbyxoLGEpfXBvcHVsYXRlUG9zaXRpb25hbHModCxlLHMsaSl7ZS5fPWUuXy5zbGljZShzLmNvbW1hbmRzLmxlbmd0aCk7Y29uc3Qgbj10LmRlbWFuZGVkLnNsaWNlKDApLHI9dC5vcHRpb25hbC5zbGljZSgwKSxvPXt9O2Zvcih0aGlzLnZhbGlkYXRpb24ucG9zaXRpb25hbENvdW50KG4ubGVuZ3RoLGUuXy5sZW5ndGgpO24ubGVuZ3RoOyl7Y29uc3QgdD1uLnNoaWZ0KCk7dGhpcy5wb3B1bGF0ZVBvc2l0aW9uYWwodCxlLG8pfWZvcig7ci5sZW5ndGg7KXtjb25zdCB0PXIuc2hpZnQoKTt0aGlzLnBvcHVsYXRlUG9zaXRpb25hbCh0LGUsbyl9cmV0dXJuIGUuXz1zLmNvbW1hbmRzLmNvbmNhdChlLl8ubWFwKCh0PT5cIlwiK3QpKSksdGhpcy5wb3N0UHJvY2Vzc1Bvc2l0aW9uYWxzKGUsbyx0aGlzLmNtZFRvUGFyc2VPcHRpb25zKHQub3JpZ2luYWwpLGkpLG99cG9wdWxhdGVQb3NpdGlvbmFsKHQsZSxzKXtjb25zdCBpPXQuY21kWzBdO3QudmFyaWFkaWM/c1tpXT1lLl8uc3BsaWNlKDApLm1hcChTdHJpbmcpOmUuXy5sZW5ndGgmJihzW2ldPVtTdHJpbmcoZS5fLnNoaWZ0KCkpXSl9Y21kVG9QYXJzZU9wdGlvbnModCl7Y29uc3QgZT17YXJyYXk6W10sZGVmYXVsdDp7fSxhbGlhczp7fSxkZW1hbmQ6e319LHM9byh0KTtyZXR1cm4gcy5kZW1hbmRlZC5mb3JFYWNoKCh0PT57Y29uc3RbcywuLi5pXT10LmNtZDt0LnZhcmlhZGljJiYoZS5hcnJheS5wdXNoKHMpLGUuZGVmYXVsdFtzXT1bXSksZS5hbGlhc1tzXT1pLGUuZGVtYW5kW3NdPSEwfSkpLHMub3B0aW9uYWwuZm9yRWFjaCgodD0+e2NvbnN0W3MsLi4uaV09dC5jbWQ7dC52YXJpYWRpYyYmKGUuYXJyYXkucHVzaChzKSxlLmRlZmF1bHRbc109W10pLGUuYWxpYXNbc109aX0pKSxlfXBvc3RQcm9jZXNzUG9zaXRpb25hbHModCxlLHMsaSl7Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LGkuZ2V0T3B0aW9ucygpKTtuLmRlZmF1bHQ9T2JqZWN0LmFzc2lnbihzLmRlZmF1bHQsbi5kZWZhdWx0KTtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhzLmFsaWFzKSluLmFsaWFzW3RdPShuLmFsaWFzW3RdfHxbXSkuY29uY2F0KHMuYWxpYXNbdF0pO24uYXJyYXk9bi5hcnJheS5jb25jYXQocy5hcnJheSksbi5jb25maWc9e307Y29uc3Qgcj1bXTtpZihPYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0PT57ZVt0XS5tYXAoKGU9PntuLmNvbmZpZ3VyYXRpb25bXCJ1bmtub3duLW9wdGlvbnMtYXMtYXJnc1wiXSYmKG4ua2V5W3RdPSEwKSxyLnB1c2goYC0tJHt0fWApLHIucHVzaChlKX0pKX0pKSwhci5sZW5ndGgpcmV0dXJuO2NvbnN0IG89T2JqZWN0LmFzc2lnbih7fSxuLmNvbmZpZ3VyYXRpb24se1wicG9wdWxhdGUtLVwiOiExfSksYT10aGlzLnNoaW0uUGFyc2VyLmRldGFpbGVkKHIsT2JqZWN0LmFzc2lnbih7fSxuLHtjb25maWd1cmF0aW9uOm99KSk7aWYoYS5lcnJvcilpLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5mYWlsKGEuZXJyb3IubWVzc2FnZSxhLmVycm9yKTtlbHNle2NvbnN0IHM9T2JqZWN0LmtleXMoZSk7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e3MucHVzaCguLi5hLmFsaWFzZXNbdF0pfSkpLE9iamVjdC5rZXlzKGEuYXJndikuZm9yRWFjaCgobj0+e3MuaW5jbHVkZXMobikmJihlW25dfHwoZVtuXT1hLmFyZ3Zbbl0pLCF0aGlzLmlzSW5Db25maWdzKGksbikmJiF0aGlzLmlzRGVmYXVsdGVkKGksbikmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYS5hcmd2LG4pJiYoQXJyYXkuaXNBcnJheSh0W25dKXx8QXJyYXkuaXNBcnJheShhLmFyZ3Zbbl0pKT90W25dPVtdLmNvbmNhdCh0W25dLGEuYXJndltuXSk6dFtuXT1hLmFyZ3Zbbl0pfSkpfX1pc0RlZmF1bHRlZCh0LGUpe2NvbnN0e2RlZmF1bHQ6c309dC5nZXRPcHRpb25zKCk7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLGUpfHxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyx0aGlzLnNoaW0uUGFyc2VyLmNhbWVsQ2FzZShlKSl9aXNJbkNvbmZpZ3ModCxlKXtjb25zdHtjb25maWdPYmplY3RzOnN9PXQuZ2V0T3B0aW9ucygpO3JldHVybiBzLnNvbWUoKHQ9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpKSl8fHMuc29tZSgodD0+T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsdGhpcy5zaGltLlBhcnNlci5jYW1lbENhc2UoZSkpKSl9cnVuRGVmYXVsdEJ1aWxkZXJPbih0KXtpZighdGhpcy5kZWZhdWx0Q29tbWFuZClyZXR1cm47aWYodGhpcy5zaG91bGRVcGRhdGVVc2FnZSh0KSl7Y29uc3QgZT1NLnRlc3QodGhpcy5kZWZhdWx0Q29tbWFuZC5vcmlnaW5hbCk/dGhpcy5kZWZhdWx0Q29tbWFuZC5vcmlnaW5hbDp0aGlzLmRlZmF1bHRDb21tYW5kLm9yaWdpbmFsLnJlcGxhY2UoL15bXltcXF08Pl0qLyxcIiQwIFwiKTt0LmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS51c2FnZShlLHRoaXMuZGVmYXVsdENvbW1hbmQuZGVzY3JpcHRpb24pfWNvbnN0IGU9dGhpcy5kZWZhdWx0Q29tbWFuZC5idWlsZGVyO2lmKHgoZSkpcmV0dXJuIGUodCwhMCk7ayhlKXx8T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgocz0+e3Qub3B0aW9uKHMsZVtzXSl9KSl9bW9kdWxlTmFtZSh0KXtjb25zdCBlPWZ1bmN0aW9uKHQpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiByZXF1aXJlKXJldHVybiBudWxsO2ZvcihsZXQgZSxzPTAsaT1PYmplY3Qua2V5cyhyZXF1aXJlLmNhY2hlKTtzPGkubGVuZ3RoO3MrKylpZihlPXJlcXVpcmUuY2FjaGVbaVtzXV0sZS5leHBvcnRzPT09dClyZXR1cm4gZTtyZXR1cm4gbnVsbH0odCk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIG5hbWUgZ2l2ZW4gZm9yIG1vZHVsZTogJHt0aGlzLnNoaW0uaW5zcGVjdCh0KX1gKTtyZXR1cm4gdGhpcy5jb21tYW5kRnJvbUZpbGVuYW1lKGUuZmlsZW5hbWUpfWNvbW1hbmRGcm9tRmlsZW5hbWUodCl7cmV0dXJuIHRoaXMuc2hpbS5wYXRoLmJhc2VuYW1lKHQsdGhpcy5zaGltLnBhdGguZXh0bmFtZSh0KSl9ZXh0cmFjdERlc2Moe2Rlc2NyaWJlOnQsZGVzY3JpcHRpb246ZSxkZXNjOnN9KXtmb3IoY29uc3QgaSBvZlt0LGUsc10pe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBpfHwhMT09PWkpcmV0dXJuIGk7ZChpLCEwLHRoaXMuc2hpbSl9cmV0dXJuITF9ZnJlZXplKCl7dGhpcy5mcm96ZW5zLnB1c2goe2hhbmRsZXJzOnRoaXMuaGFuZGxlcnMsYWxpYXNNYXA6dGhpcy5hbGlhc01hcCxkZWZhdWx0Q29tbWFuZDp0aGlzLmRlZmF1bHRDb21tYW5kfSl9dW5mcmVlemUoKXtjb25zdCB0PXRoaXMuZnJvemVucy5wb3AoKTtkKHQsdm9pZCAwLHRoaXMuc2hpbSksKHtoYW5kbGVyczp0aGlzLmhhbmRsZXJzLGFsaWFzTWFwOnRoaXMuYWxpYXNNYXAsZGVmYXVsdENvbW1hbmQ6dGhpcy5kZWZhdWx0Q29tbWFuZH09dCl9cmVzZXQoKXtyZXR1cm4gdGhpcy5oYW5kbGVycz17fSx0aGlzLmFsaWFzTWFwPXt9LHRoaXMuZGVmYXVsdENvbW1hbmQ9dm9pZCAwLHRoaXMucmVxdWlyZUNhY2hlPW5ldyBTZXQsdGhpc319ZnVuY3Rpb24gayh0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdCYmISF0LmJ1aWxkZXImJlwiZnVuY3Rpb25cIj09dHlwZW9mIHQuaGFuZGxlcn1mdW5jdGlvbiB4KHQpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHR9ZnVuY3Rpb24gRSh0KXtcInVuZGVmaW5lZFwiIT10eXBlb2YgcHJvY2VzcyYmW3Byb2Nlc3Muc3Rkb3V0LHByb2Nlc3Muc3RkZXJyXS5mb3JFYWNoKChlPT57Y29uc3Qgcz1lO3MuX2hhbmRsZSYmcy5pc1RUWSYmXCJmdW5jdGlvblwiPT10eXBlb2Ygcy5faGFuZGxlLnNldEJsb2NraW5nJiZzLl9oYW5kbGUuc2V0QmxvY2tpbmcodCl9KSl9ZnVuY3Rpb24gQSh0KXtyZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIHR9ZnVuY3Rpb24gUCh0LHMpe2NvbnN0IGk9cy55MThuLl9fLG49e30scj1bXTtuLmZhaWxGbj1mdW5jdGlvbih0KXtyLnB1c2godCl9O2xldCBvPW51bGwsYT1udWxsLGg9ITA7bi5zaG93SGVscE9uRmFpbD1mdW5jdGlvbihlPSEwLHMpe2NvbnN0W2kscl09XCJzdHJpbmdcIj09dHlwZW9mIGU/WyEwLGVdOltlLHNdO3JldHVybiB0LmdldEludGVybmFsTWV0aG9kcygpLmlzR2xvYmFsQ29udGV4dCgpJiYoYT1yKSxvPXIsaD1pLG59O2xldCBsPSExO24uZmFpbD1mdW5jdGlvbihzLGkpe2NvbnN0IGM9dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRMb2dnZXJJbnN0YW5jZSgpO2lmKCFyLmxlbmd0aCl7aWYodC5nZXRFeGl0UHJvY2VzcygpJiZFKCEwKSwhbCl7bD0hMCxoJiYodC5zaG93SGVscChcImVycm9yXCIpLGMuZXJyb3IoKSksKHN8fGkpJiZjLmVycm9yKHN8fGkpO2NvbnN0IGU9b3x8YTtlJiYoKHN8fGkpJiZjLmVycm9yKFwiXCIpLGMuZXJyb3IoZSkpfWlmKGk9aXx8bmV3IGUocyksdC5nZXRFeGl0UHJvY2VzcygpKXJldHVybiB0LmV4aXQoMSk7aWYodC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5oYXNQYXJzZUNhbGxiYWNrKCkpcmV0dXJuIHQuZXhpdCgxLGkpO3Rocm93IGl9Zm9yKGxldCB0PXIubGVuZ3RoLTE7dD49MDstLXQpe2NvbnN0IGU9clt0XTtpZihBKGUpKXtpZihpKXRocm93IGk7aWYocyl0aHJvdyBFcnJvcihzKX1lbHNlIGUocyxpLG4pfX07bGV0IGM9W10sZj0hMTtuLnVzYWdlPSh0LGUpPT5udWxsPT09dD8oZj0hMCxjPVtdLG4pOihmPSExLGMucHVzaChbdCxlfHxcIlwiXSksbiksbi5nZXRVc2FnZT0oKT0+YyxuLmdldFVzYWdlRGlzYWJsZWQ9KCk9PmYsbi5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lPSgpPT5pKFwiUG9zaXRpb25hbHM6XCIpO2xldCBkPVtdO24uZXhhbXBsZT0odCxlKT0+e2QucHVzaChbdCxlfHxcIlwiXSl9O2xldCB1PVtdO24uY29tbWFuZD1mdW5jdGlvbih0LGUscyxpLG49ITEpe3MmJih1PXUubWFwKCh0PT4odFsyXT0hMSx0KSkpKSx1LnB1c2goW3QsZXx8XCJcIixzLGksbl0pfSxuLmdldENvbW1hbmRzPSgpPT51O2xldCBwPXt9O24uZGVzY3JpYmU9ZnVuY3Rpb24odCxlKXtBcnJheS5pc0FycmF5KHQpP3QuZm9yRWFjaCgodD0+e24uZGVzY3JpYmUodCxlKX0pKTpcIm9iamVjdFwiPT10eXBlb2YgdD9PYmplY3Qua2V5cyh0KS5mb3JFYWNoKChlPT57bi5kZXNjcmliZShlLHRbZV0pfSkpOnBbdF09ZX0sbi5nZXREZXNjcmlwdGlvbnM9KCk9PnA7bGV0IG09W107bi5lcGlsb2c9dD0+e20ucHVzaCh0KX07bGV0IHksYj0hMTtuLndyYXA9dD0+e2I9ITAseT10fSxuLmdldFdyYXA9KCk9PnMuZ2V0RW52KFwiWUFSR1NfRElTQUJMRV9XUkFQXCIpP251bGw6KGJ8fCh5PWZ1bmN0aW9uKCl7Y29uc3QgdD04MDtyZXR1cm4gcy5wcm9jZXNzLnN0ZENvbHVtbnM/TWF0aC5taW4odCxzLnByb2Nlc3Muc3RkQ29sdW1ucyk6dH0oKSxiPSEwKSx5KTtjb25zdCB2PVwiX195YXJnc1N0cmluZ19fOlwiO2Z1bmN0aW9uIE8odCxlLGkpe2xldCBuPTA7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl8fCh0PU9iamVjdC52YWx1ZXModCkubWFwKCh0PT5bdF0pKSksdC5mb3JFYWNoKCh0PT57bj1NYXRoLm1heChzLnN0cmluZ1dpZHRoKGk/YCR7aX0gJHtJKHRbMF0pfWA6SSh0WzBdKSkrJCh0WzBdKSxuKX0pKSxlJiYobj1NYXRoLm1pbihuLHBhcnNlSW50KCguNSplKS50b1N0cmluZygpLDEwKSkpLG59bGV0IHc7ZnVuY3Rpb24gQyhlKXtyZXR1cm4gdC5nZXRPcHRpb25zKCkuaGlkZGVuT3B0aW9ucy5pbmRleE9mKGUpPDB8fHQucGFyc2VkLmFyZ3ZbdC5nZXRPcHRpb25zKCkuc2hvd0hpZGRlbk9wdF19ZnVuY3Rpb24gaih0LGUpe2xldCBzPWBbJHtpKFwiZGVmYXVsdDpcIil9IGA7aWYodm9pZCAwPT09dCYmIWUpcmV0dXJuIG51bGw7aWYoZSlzKz1lO2Vsc2Ugc3dpdGNoKHR5cGVvZiB0KXtjYXNlXCJzdHJpbmdcIjpzKz1gXCIke3R9XCJgO2JyZWFrO2Nhc2VcIm9iamVjdFwiOnMrPUpTT04uc3RyaW5naWZ5KHQpO2JyZWFrO2RlZmF1bHQ6cys9dH1yZXR1cm5gJHtzfV1gfW4uZGVmZXJZMThuTG9va3VwPXQ9PnYrdCxuLmhlbHA9ZnVuY3Rpb24oKXtpZih3KXJldHVybiB3OyFmdW5jdGlvbigpe2NvbnN0IGU9dC5nZXREZW1hbmRlZE9wdGlvbnMoKSxzPXQuZ2V0T3B0aW9ucygpOyhPYmplY3Qua2V5cyhzLmFsaWFzKXx8W10pLmZvckVhY2goKGk9PntzLmFsaWFzW2ldLmZvckVhY2goKHI9PntwW3JdJiZuLmRlc2NyaWJlKGkscFtyXSksciBpbiBlJiZ0LmRlbWFuZE9wdGlvbihpLGVbcl0pLHMuYm9vbGVhbi5pbmNsdWRlcyhyKSYmdC5ib29sZWFuKGkpLHMuY291bnQuaW5jbHVkZXMocikmJnQuY291bnQoaSkscy5zdHJpbmcuaW5jbHVkZXMocikmJnQuc3RyaW5nKGkpLHMubm9ybWFsaXplLmluY2x1ZGVzKHIpJiZ0Lm5vcm1hbGl6ZShpKSxzLmFycmF5LmluY2x1ZGVzKHIpJiZ0LmFycmF5KGkpLHMubnVtYmVyLmluY2x1ZGVzKHIpJiZ0Lm51bWJlcihpKX0pKX0pKX0oKTtjb25zdCBlPXQuY3VzdG9tU2NyaXB0TmFtZT90LiQwOnMucGF0aC5iYXNlbmFtZSh0LiQwKSxyPXQuZ2V0RGVtYW5kZWRPcHRpb25zKCksbz10LmdldERlbWFuZGVkQ29tbWFuZHMoKSxhPXQuZ2V0RGVwcmVjYXRlZE9wdGlvbnMoKSxoPXQuZ2V0R3JvdXBzKCksbD10LmdldE9wdGlvbnMoKTtsZXQgZz1bXTtnPWcuY29uY2F0KE9iamVjdC5rZXlzKHApKSxnPWcuY29uY2F0KE9iamVjdC5rZXlzKHIpKSxnPWcuY29uY2F0KE9iamVjdC5rZXlzKG8pKSxnPWcuY29uY2F0KE9iamVjdC5rZXlzKGwuZGVmYXVsdCkpLGc9Zy5maWx0ZXIoQyksZz1PYmplY3Qua2V5cyhnLnJlZHVjZSgoKHQsZSk9PihcIl9cIiE9PWUmJih0W2VdPSEwKSx0KSkse30pKTtjb25zdCB5PW4uZ2V0V3JhcCgpLGI9cy5jbGl1aSh7d2lkdGg6eSx3cmFwOiEheX0pO2lmKCFmKWlmKGMubGVuZ3RoKWMuZm9yRWFjaCgodD0+e2IuZGl2KHt0ZXh0OmAke3RbMF0ucmVwbGFjZSgvXFwkMC9nLGUpfWB9KSx0WzFdJiZiLmRpdih7dGV4dDpgJHt0WzFdfWAscGFkZGluZzpbMSwwLDAsMF19KX0pKSxiLmRpdigpO2Vsc2UgaWYodS5sZW5ndGgpe2xldCB0PW51bGw7dD1vLl8/YCR7ZX0gPCR7aShcImNvbW1hbmRcIil9PlxcbmA6YCR7ZX0gWyR7aShcImNvbW1hbmRcIil9XVxcbmAsYi5kaXYoYCR7dH1gKX1pZih1Lmxlbmd0aD4xfHwxPT09dS5sZW5ndGgmJiF1WzBdWzJdKXtiLmRpdihpKFwiQ29tbWFuZHM6XCIpKTtjb25zdCBzPXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLG49cy5jb21tYW5kcy5sZW5ndGg/YCR7cy5jb21tYW5kcy5qb2luKFwiIFwiKX0gYDpcIlwiOyEwPT09dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRQYXJzZXJDb25maWd1cmF0aW9uKClbXCJzb3J0LWNvbW1hbmRzXCJdJiYodT11LnNvcnQoKCh0LGUpPT50WzBdLmxvY2FsZUNvbXBhcmUoZVswXSkpKSk7Y29uc3Qgcj1lP2Ake2V9IGA6XCJcIjt1LmZvckVhY2goKHQ9Pntjb25zdCBzPWAke3J9JHtufSR7dFswXS5yZXBsYWNlKC9eXFwkMCA/LyxcIlwiKX1gO2Iuc3Bhbih7dGV4dDpzLHBhZGRpbmc6WzAsMiwwLDJdLHdpZHRoOk8odSx5LGAke2V9JHtufWApKzR9LHt0ZXh0OnRbMV19KTtjb25zdCBvPVtdO3RbMl0mJm8ucHVzaChgWyR7aShcImRlZmF1bHRcIil9XWApLHRbM10mJnRbM10ubGVuZ3RoJiZvLnB1c2goYFske2koXCJhbGlhc2VzOlwiKX0gJHt0WzNdLmpvaW4oXCIsIFwiKX1dYCksdFs0XSYmKFwic3RyaW5nXCI9PXR5cGVvZiB0WzRdP28ucHVzaChgWyR7aShcImRlcHJlY2F0ZWQ6ICVzXCIsdFs0XSl9XWApOm8ucHVzaChgWyR7aShcImRlcHJlY2F0ZWRcIil9XWApKSxvLmxlbmd0aD9iLmRpdih7dGV4dDpvLmpvaW4oXCIgXCIpLHBhZGRpbmc6WzAsMCwwLDJdLGFsaWduOlwicmlnaHRcIn0pOmIuZGl2KCl9KSksYi5kaXYoKX1jb25zdCBNPShPYmplY3Qua2V5cyhsLmFsaWFzKXx8W10pLmNvbmNhdChPYmplY3Qua2V5cyh0LnBhcnNlZC5uZXdBbGlhc2VzKXx8W10pO2c9Zy5maWx0ZXIoKGU9PiF0LnBhcnNlZC5uZXdBbGlhc2VzW2VdJiZNLmV2ZXJ5KCh0PT4tMT09PShsLmFsaWFzW3RdfHxbXSkuaW5kZXhPZihlKSkpKSk7Y29uc3QgXz1pKFwiT3B0aW9uczpcIik7aFtfXXx8KGhbX109W10pLGZ1bmN0aW9uKHQsZSxzLGkpe2xldCBuPVtdLHI9bnVsbDtPYmplY3Qua2V5cyhzKS5mb3JFYWNoKCh0PT57bj1uLmNvbmNhdChzW3RdKX0pKSx0LmZvckVhY2goKHQ9PntyPVt0XS5jb25jYXQoZVt0XSksci5zb21lKCh0PT4tMSE9PW4uaW5kZXhPZih0KSkpfHxzW2ldLnB1c2godCl9KSl9KGcsbC5hbGlhcyxoLF8pO2NvbnN0IGs9dD0+L14tLS8udGVzdChJKHQpKSx4PU9iamVjdC5rZXlzKGgpLmZpbHRlcigodD0+aFt0XS5sZW5ndGg+MCkpLm1hcCgodD0+KHtncm91cE5hbWU6dCxub3JtYWxpemVkS2V5czpoW3RdLmZpbHRlcihDKS5tYXAoKHQ9PntpZihNLmluY2x1ZGVzKHQpKXJldHVybiB0O2ZvcihsZXQgZSxzPTA7dm9pZCAwIT09KGU9TVtzXSk7cysrKWlmKChsLmFsaWFzW2VdfHxbXSkuaW5jbHVkZXModCkpcmV0dXJuIGU7cmV0dXJuIHR9KSl9KSkpLmZpbHRlcigoKHtub3JtYWxpemVkS2V5czp0fSk9PnQubGVuZ3RoPjApKS5tYXAoKCh7Z3JvdXBOYW1lOnQsbm9ybWFsaXplZEtleXM6ZX0pPT57Y29uc3Qgcz1lLnJlZHVjZSgoKGUscyk9PihlW3NdPVtzXS5jb25jYXQobC5hbGlhc1tzXXx8W10pLm1hcCgoZT0+dD09PW4uZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpP2U6KC9eWzAtOV0kLy50ZXN0KGUpP2wuYm9vbGVhbi5pbmNsdWRlcyhzKT9cIi1cIjpcIi0tXCI6ZS5sZW5ndGg+MT9cIi0tXCI6XCItXCIpK2UpKS5zb3J0KCgodCxlKT0+ayh0KT09PWsoZSk/MDprKHQpPzE6LTEpKS5qb2luKFwiLCBcIiksZSkpLHt9KTtyZXR1cm57Z3JvdXBOYW1lOnQsbm9ybWFsaXplZEtleXM6ZSxzd2l0Y2hlczpzfX0pKTtpZih4LmZpbHRlcigoKHtncm91cE5hbWU6dH0pPT50IT09bi5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lKCkpKS5zb21lKCgoe25vcm1hbGl6ZWRLZXlzOnQsc3dpdGNoZXM6ZX0pPT4hdC5ldmVyeSgodD0+ayhlW3RdKSkpKSkmJnguZmlsdGVyKCgoe2dyb3VwTmFtZTp0fSk9PnQhPT1uLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKSkpLmZvckVhY2goKCh7bm9ybWFsaXplZEtleXM6dCxzd2l0Y2hlczplfSk9Pnt0LmZvckVhY2goKHQ9Pnt2YXIgcyxpO2soZVt0XSkmJihlW3RdPShzPWVbdF0saT00LFMocyk/e3RleHQ6cy50ZXh0LGluZGVudGF0aW9uOnMuaW5kZW50YXRpb24raX06e3RleHQ6cyxpbmRlbnRhdGlvbjppfSkpfSkpfSkpLHguZm9yRWFjaCgoKHtncm91cE5hbWU6ZSxub3JtYWxpemVkS2V5czpzLHN3aXRjaGVzOm99KT0+e2IuZGl2KGUpLHMuZm9yRWFjaCgoZT0+e2NvbnN0IHM9b1tlXTtsZXQgaD1wW2VdfHxcIlwiLGM9bnVsbDtoLmluY2x1ZGVzKHYpJiYoaD1pKGguc3Vic3RyaW5nKDE2KSkpLGwuYm9vbGVhbi5pbmNsdWRlcyhlKSYmKGM9YFske2koXCJib29sZWFuXCIpfV1gKSxsLmNvdW50LmluY2x1ZGVzKGUpJiYoYz1gWyR7aShcImNvdW50XCIpfV1gKSxsLnN0cmluZy5pbmNsdWRlcyhlKSYmKGM9YFske2koXCJzdHJpbmdcIil9XWApLGwubm9ybWFsaXplLmluY2x1ZGVzKGUpJiYoYz1gWyR7aShcInN0cmluZ1wiKX1dYCksbC5hcnJheS5pbmNsdWRlcyhlKSYmKGM9YFske2koXCJhcnJheVwiKX1dYCksbC5udW1iZXIuaW5jbHVkZXMoZSkmJihjPWBbJHtpKFwibnVtYmVyXCIpfV1gKTtjb25zdCBmPVtlIGluIGE/KGQ9YVtlXSxcInN0cmluZ1wiPT10eXBlb2YgZD9gWyR7aShcImRlcHJlY2F0ZWQ6ICVzXCIsZCl9XWA6YFske2koXCJkZXByZWNhdGVkXCIpfV1gKTpudWxsLGMsZSBpbiByP2BbJHtpKFwicmVxdWlyZWRcIil9XWA6bnVsbCxsLmNob2ljZXMmJmwuY2hvaWNlc1tlXT9gWyR7aShcImNob2ljZXM6XCIpfSAke24uc3RyaW5naWZpZWRWYWx1ZXMobC5jaG9pY2VzW2VdKX1dYDpudWxsLGoobC5kZWZhdWx0W2VdLGwuZGVmYXVsdERlc2NyaXB0aW9uW2VdKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpO3ZhciBkO2Iuc3Bhbih7dGV4dDpJKHMpLHBhZGRpbmc6WzAsMiwwLDIrJChzKV0sd2lkdGg6TyhvLHkpKzR9LGgpO2NvbnN0IHU9ITA9PT10LmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlQ29uZmlndXJhdGlvbigpW1wiaGlkZS10eXBlc1wiXTtmJiYhdT9iLmRpdih7dGV4dDpmLHBhZGRpbmc6WzAsMCwwLDJdLGFsaWduOlwicmlnaHRcIn0pOmIuZGl2KCl9KSksYi5kaXYoKX0pKSxkLmxlbmd0aCYmKGIuZGl2KGkoXCJFeGFtcGxlczpcIikpLGQuZm9yRWFjaCgodD0+e3RbMF09dFswXS5yZXBsYWNlKC9cXCQwL2csZSl9KSksZC5mb3JFYWNoKCh0PT57XCJcIj09PXRbMV0/Yi5kaXYoe3RleHQ6dFswXSxwYWRkaW5nOlswLDIsMCwyXX0pOmIuZGl2KHt0ZXh0OnRbMF0scGFkZGluZzpbMCwyLDAsMl0sd2lkdGg6TyhkLHkpKzR9LHt0ZXh0OnRbMV19KX0pKSxiLmRpdigpKSxtLmxlbmd0aD4wKXtjb25zdCB0PW0ubWFwKCh0PT50LnJlcGxhY2UoL1xcJDAvZyxlKSkpLmpvaW4oXCJcXG5cIik7Yi5kaXYoYCR7dH1cXG5gKX1yZXR1cm4gYi50b1N0cmluZygpLnJlcGxhY2UoL1xccyokLyxcIlwiKX0sbi5jYWNoZUhlbHBNZXNzYWdlPWZ1bmN0aW9uKCl7dz10aGlzLmhlbHAoKX0sbi5jbGVhckNhY2hlZEhlbHBNZXNzYWdlPWZ1bmN0aW9uKCl7dz12b2lkIDB9LG4uaGFzQ2FjaGVkSGVscE1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4hIXd9LG4uc2hvd0hlbHA9ZT0+e2NvbnN0IHM9dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRMb2dnZXJJbnN0YW5jZSgpO2V8fChlPVwiZXJyb3JcIik7KFwiZnVuY3Rpb25cIj09dHlwZW9mIGU/ZTpzW2VdKShuLmhlbHAoKSl9LG4uZnVuY3Rpb25EZXNjcmlwdGlvbj10PT5bXCIoXCIsdC5uYW1lP3MuUGFyc2VyLmRlY2FtZWxpemUodC5uYW1lLFwiLVwiKTppKFwiZ2VuZXJhdGVkLXZhbHVlXCIpLFwiKVwiXS5qb2luKFwiXCIpLG4uc3RyaW5naWZpZWRWYWx1ZXM9ZnVuY3Rpb24odCxlKXtsZXQgcz1cIlwiO2NvbnN0IGk9ZXx8XCIsIFwiLG49W10uY29uY2F0KHQpO3JldHVybiB0JiZuLmxlbmd0aD8obi5mb3JFYWNoKCh0PT57cy5sZW5ndGgmJihzKz1pKSxzKz1KU09OLnN0cmluZ2lmeSh0KX0pKSxzKTpzfTtsZXQgTT1udWxsO24udmVyc2lvbj10PT57TT10fSxuLnNob3dWZXJzaW9uPWU9Pntjb25zdCBzPXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0TG9nZ2VySW5zdGFuY2UoKTtlfHwoZT1cImVycm9yXCIpOyhcImZ1bmN0aW9uXCI9PXR5cGVvZiBlP2U6c1tlXSkoTSl9LG4ucmVzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIG89bnVsbCxsPSExLGM9W10sZj0hMSxtPVtdLGQ9W10sdT1bXSxwPWcocCwoZT0+IXRbZV0pKSxufTtjb25zdCBfPVtdO3JldHVybiBuLmZyZWV6ZT1mdW5jdGlvbigpe18ucHVzaCh7ZmFpbE1lc3NhZ2U6byxmYWlsdXJlT3V0cHV0OmwsdXNhZ2VzOmMsdXNhZ2VEaXNhYmxlZDpmLGVwaWxvZ3M6bSxleGFtcGxlczpkLGNvbW1hbmRzOnUsZGVzY3JpcHRpb25zOnB9KX0sbi51bmZyZWV6ZT1mdW5jdGlvbih0PSExKXtjb25zdCBlPV8ucG9wKCk7ZSYmKHQ/KHA9ey4uLmUuZGVzY3JpcHRpb25zLC4uLnB9LHU9Wy4uLmUuY29tbWFuZHMsLi4udV0sYz1bLi4uZS51c2FnZXMsLi4uY10sZD1bLi4uZS5leGFtcGxlcywuLi5kXSxtPVsuLi5lLmVwaWxvZ3MsLi4ubV0pOih7ZmFpbE1lc3NhZ2U6byxmYWlsdXJlT3V0cHV0OmwsdXNhZ2VzOmMsdXNhZ2VEaXNhYmxlZDpmLGVwaWxvZ3M6bSxleGFtcGxlczpkLGNvbW1hbmRzOnUsZGVzY3JpcHRpb25zOnB9PWUpKX0sbn1mdW5jdGlvbiBTKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0fWZ1bmN0aW9uICQodCl7cmV0dXJuIFModCk/dC5pbmRlbnRhdGlvbjowfWZ1bmN0aW9uIEkodCl7cmV0dXJuIFModCk/dC50ZXh0OnR9Y2xhc3MgRHtjb25zdHJ1Y3Rvcih0LGUscyxpKXt2YXIgbixyLG87dGhpcy55YXJncz10LHRoaXMudXNhZ2U9ZSx0aGlzLmNvbW1hbmQ9cyx0aGlzLnNoaW09aSx0aGlzLmNvbXBsZXRpb25LZXk9XCJnZXQteWFyZ3MtY29tcGxldGlvbnNcIix0aGlzLmFsaWFzZXM9bnVsbCx0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbj1udWxsLHRoaXMuaW5kZXhBZnRlckxhc3RSZXNldD0wLHRoaXMuenNoU2hlbGw9bnVsbCE9PShvPShudWxsPT09KG49dGhpcy5zaGltLmdldEVudihcIlNIRUxMXCIpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5pbmNsdWRlcyhcInpzaFwiKSl8fChudWxsPT09KHI9dGhpcy5zaGltLmdldEVudihcIlpTSF9OQU1FXCIpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5pbmNsdWRlcyhcInpzaFwiKSkpJiZ2b2lkIDAhPT1vJiZvfWRlZmF1bHRDb21wbGV0aW9uKHQsZSxzLGkpe2NvbnN0IG49dGhpcy5jb21tYW5kLmdldENvbW1hbmRIYW5kbGVycygpO2ZvcihsZXQgZT0wLHM9dC5sZW5ndGg7ZTxzOysrZSlpZihuW3RbZV1dJiZuW3RbZV1dLmJ1aWxkZXIpe2NvbnN0IHM9blt0W2VdXS5idWlsZGVyO2lmKHgocykpe3RoaXMuaW5kZXhBZnRlckxhc3RSZXNldD1lKzE7Y29uc3QgdD10aGlzLnlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLnJlc2V0KCk7cmV0dXJuIHModCwhMCksdC5hcmd2fX1jb25zdCByPVtdO3RoaXMuY29tbWFuZENvbXBsZXRpb25zKHIsdCxzKSx0aGlzLm9wdGlvbkNvbXBsZXRpb25zKHIsdCxlLHMpLHRoaXMuY2hvaWNlc0Zyb21PcHRpb25zQ29tcGxldGlvbnMocix0LGUscyksdGhpcy5jaG9pY2VzRnJvbVBvc2l0aW9uYWxzQ29tcGxldGlvbnMocix0LGUscyksaShudWxsLHIpfWNvbW1hbmRDb21wbGV0aW9ucyh0LGUscyl7Y29uc3QgaT10aGlzLnlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKS5jb21tYW5kcztzLm1hdGNoKC9eLS8pfHxpW2kubGVuZ3RoLTFdPT09c3x8dGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoZSl8fHRoaXMudXNhZ2UuZ2V0Q29tbWFuZHMoKS5mb3JFYWNoKChzPT57Y29uc3QgaT1vKHNbMF0pLmNtZDtpZigtMT09PWUuaW5kZXhPZihpKSlpZih0aGlzLnpzaFNoZWxsKXtjb25zdCBlPXNbMV18fFwiXCI7dC5wdXNoKGkucmVwbGFjZSgvOi9nLFwiXFxcXDpcIikrXCI6XCIrZSl9ZWxzZSB0LnB1c2goaSl9KSl9b3B0aW9uQ29tcGxldGlvbnModCxlLHMsaSl7aWYoKGkubWF0Y2goL14tLyl8fFwiXCI9PT1pJiYwPT09dC5sZW5ndGgpJiYhdGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoZSkpe2NvbnN0IHM9dGhpcy55YXJncy5nZXRPcHRpb25zKCksbj10aGlzLnlhcmdzLmdldEdyb3VwcygpW3RoaXMudXNhZ2UuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpXXx8W107T2JqZWN0LmtleXMocy5rZXkpLmZvckVhY2goKHI9Pntjb25zdCBvPSEhcy5jb25maWd1cmF0aW9uW1wiYm9vbGVhbi1uZWdhdGlvblwiXSYmcy5ib29sZWFuLmluY2x1ZGVzKHIpO24uaW5jbHVkZXMocil8fHMuaGlkZGVuT3B0aW9ucy5pbmNsdWRlcyhyKXx8dGhpcy5hcmdzQ29udGFpbktleShlLHIsbyl8fHRoaXMuY29tcGxldGVPcHRpb25LZXkocix0LGksbyYmISFzLmRlZmF1bHRbcl0pfSkpfX1jaG9pY2VzRnJvbU9wdGlvbnNDb21wbGV0aW9ucyh0LGUscyxpKXtpZih0aGlzLnByZXZpb3VzQXJnSGFzQ2hvaWNlcyhlKSl7Y29uc3Qgcz10aGlzLmdldFByZXZpb3VzQXJnQ2hvaWNlcyhlKTtzJiZzLmxlbmd0aD4wJiZ0LnB1c2goLi4ucy5tYXAoKHQ9PnQucmVwbGFjZSgvOi9nLFwiXFxcXDpcIikpKSl9fWNob2ljZXNGcm9tUG9zaXRpb25hbHNDb21wbGV0aW9ucyh0LGUscyxpKXtpZihcIlwiPT09aSYmdC5sZW5ndGg+MCYmdGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoZSkpcmV0dXJuO2NvbnN0IG49dGhpcy55YXJncy5nZXRHcm91cHMoKVt0aGlzLnVzYWdlLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKV18fFtdLHI9TWF0aC5tYXgodGhpcy5pbmRleEFmdGVyTGFzdFJlc2V0LHRoaXMueWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLmNvbW1hbmRzLmxlbmd0aCsxKSxvPW5bcy5fLmxlbmd0aC1yLTFdO2lmKCFvKXJldHVybjtjb25zdCBhPXRoaXMueWFyZ3MuZ2V0T3B0aW9ucygpLmNob2ljZXNbb118fFtdO2Zvcihjb25zdCBlIG9mIGEpZS5zdGFydHNXaXRoKGkpJiZ0LnB1c2goZS5yZXBsYWNlKC86L2csXCJcXFxcOlwiKSl9Z2V0UHJldmlvdXNBcmdDaG9pY2VzKHQpe2lmKHQubGVuZ3RoPDEpcmV0dXJuO2xldCBlPXRbdC5sZW5ndGgtMV0scz1cIlwiO2lmKCFlLnN0YXJ0c1dpdGgoXCItXCIpJiZ0Lmxlbmd0aD4xJiYocz1lLGU9dFt0Lmxlbmd0aC0yXSksIWUuc3RhcnRzV2l0aChcIi1cIikpcmV0dXJuO2NvbnN0IGk9ZS5yZXBsYWNlKC9eLSsvLFwiXCIpLG49dGhpcy55YXJncy5nZXRPcHRpb25zKCkscj1baSwuLi50aGlzLnlhcmdzLmdldEFsaWFzZXMoKVtpXXx8W11dO2xldCBvO2Zvcihjb25zdCB0IG9mIHIpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4ua2V5LHQpJiZBcnJheS5pc0FycmF5KG4uY2hvaWNlc1t0XSkpe289bi5jaG9pY2VzW3RdO2JyZWFrfXJldHVybiBvP28uZmlsdGVyKCh0PT4hc3x8dC5zdGFydHNXaXRoKHMpKSk6dm9pZCAwfXByZXZpb3VzQXJnSGFzQ2hvaWNlcyh0KXtjb25zdCBlPXRoaXMuZ2V0UHJldmlvdXNBcmdDaG9pY2VzKHQpO3JldHVybiB2b2lkIDAhPT1lJiZlLmxlbmd0aD4wfWFyZ3NDb250YWluS2V5KHQsZSxzKXtjb25zdCBpPWU9Pi0xIT09dC5pbmRleE9mKCgvXlteMC05XSQvLnRlc3QoZSk/XCItXCI6XCItLVwiKStlKTtpZihpKGUpKXJldHVybiEwO2lmKHMmJmkoYG5vLSR7ZX1gKSlyZXR1cm4hMDtpZih0aGlzLmFsaWFzZXMpZm9yKGNvbnN0IHQgb2YgdGhpcy5hbGlhc2VzW2VdKWlmKGkodCkpcmV0dXJuITA7cmV0dXJuITF9Y29tcGxldGVPcHRpb25LZXkodCxlLHMsaSl7dmFyIG4scixvLGE7bGV0IGg9dDtpZih0aGlzLnpzaFNoZWxsKXtjb25zdCBlPXRoaXMudXNhZ2UuZ2V0RGVzY3JpcHRpb25zKCkscz1udWxsPT09KHI9bnVsbD09PShuPW51bGw9PXRoaXM/dm9pZCAwOnRoaXMuYWxpYXNlcyl8fHZvaWQgMD09PW4/dm9pZCAwOm5bdF0pfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmZpbmQoKHQ9Pntjb25zdCBzPWVbdF07cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHMmJnMubGVuZ3RoPjB9KSksaT1zP2Vbc106dm9pZCAwLGw9bnVsbCE9PShhPW51bGwhPT0obz1lW3RdKSYmdm9pZCAwIT09bz9vOmkpJiZ2b2lkIDAhPT1hP2E6XCJcIjtoPWAke3QucmVwbGFjZSgvOi9nLFwiXFxcXDpcIil9OiR7bC5yZXBsYWNlKFwiX195YXJnc1N0cmluZ19fOlwiLFwiXCIpLnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZ20sXCIgXCIpfWB9Y29uc3QgbD0hL14tLS8udGVzdChzKSYmKHQ9Pi9eW14wLTldJC8udGVzdCh0KSkodCk/XCItXCI6XCItLVwiO2UucHVzaChsK2gpLGkmJmUucHVzaChsK1wibm8tXCIraCl9Y3VzdG9tQ29tcGxldGlvbih0LGUscyxpKXtpZihkKHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uLG51bGwsdGhpcy5zaGltKSx0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbi5sZW5ndGg8Myl7Y29uc3QgdD10aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihzLGUpO3JldHVybiBmKHQpP3QudGhlbigodD0+e3RoaXMuc2hpbS5wcm9jZXNzLm5leHRUaWNrKCgoKT0+e2kobnVsbCx0KX0pKX0pKS5jYXRjaCgodD0+e3RoaXMuc2hpbS5wcm9jZXNzLm5leHRUaWNrKCgoKT0+e2kodCx2b2lkIDApfSkpfSkpOmkobnVsbCx0KX1yZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoPjN9KHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uKT90aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihzLGUsKChuPWkpPT50aGlzLmRlZmF1bHRDb21wbGV0aW9uKHQsZSxzLG4pKSwodD0+e2kobnVsbCx0KX0pKTp0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihzLGUsKHQ9PntpKG51bGwsdCl9KSl9Z2V0Q29tcGxldGlvbih0LGUpe2NvbnN0IHM9dC5sZW5ndGg/dFt0Lmxlbmd0aC0xXTpcIlwiLGk9dGhpcy55YXJncy5wYXJzZSh0LCEwKSxuPXRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uP2k9PnRoaXMuY3VzdG9tQ29tcGxldGlvbih0LGkscyxlKTppPT50aGlzLmRlZmF1bHRDb21wbGV0aW9uKHQsaSxzLGUpO3JldHVybiBmKGkpP2kudGhlbihuKTpuKGkpfWdlbmVyYXRlQ29tcGxldGlvblNjcmlwdCh0LGUpe2xldCBzPXRoaXMuenNoU2hlbGw/JyNjb21wZGVmIHt7YXBwX25hbWV9fVxcbiMjIy1iZWdpbi17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXFxuI1xcbiMgeWFyZ3MgY29tbWFuZCBjb21wbGV0aW9uIHNjcmlwdFxcbiNcXG4jIEluc3RhbGxhdGlvbjoge3thcHBfcGF0aH19IHt7Y29tcGxldGlvbl9jb21tYW5kfX0gPj4gfi8uenNocmNcXG4jICAgIG9yIHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLnpwcm9maWxlIG9uIE9TWC5cXG4jXFxuX3t7YXBwX25hbWV9fV95YXJnc19jb21wbGV0aW9ucygpXFxue1xcbiAgbG9jYWwgcmVwbHlcXG4gIGxvY2FsIHNpPSRJRlNcXG4gIElGUz0kXFwnXFxuXFwnIHJlcGx5PSgkKENPTVBfQ1dPUkQ9XCIkKChDVVJSRU5ULTEpKVwiIENPTVBfTElORT1cIiRCVUZGRVJcIiBDT01QX1BPSU5UPVwiJENVUlNPUlwiIHt7YXBwX3BhdGh9fSAtLWdldC15YXJncy1jb21wbGV0aW9ucyBcIiR7d29yZHNbQF19XCIpKVxcbiAgSUZTPSRzaVxcbiAgX2Rlc2NyaWJlIFxcJ3ZhbHVlc1xcJyByZXBseVxcbn1cXG5jb21wZGVmIF97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMge3thcHBfbmFtZX19XFxuIyMjLWVuZC17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXFxuJzonIyMjLWJlZ2luLXt7YXBwX25hbWV9fS1jb21wbGV0aW9ucy0jIyNcXG4jXFxuIyB5YXJncyBjb21tYW5kIGNvbXBsZXRpb24gc2NyaXB0XFxuI1xcbiMgSW5zdGFsbGF0aW9uOiB7e2FwcF9wYXRofX0ge3tjb21wbGV0aW9uX2NvbW1hbmR9fSA+PiB+Ly5iYXNocmNcXG4jICAgIG9yIHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLmJhc2hfcHJvZmlsZSBvbiBPU1guXFxuI1xcbl97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMoKVxcbntcXG4gICAgbG9jYWwgY3VyX3dvcmQgYXJncyB0eXBlX2xpc3RcXG5cXG4gICAgY3VyX3dvcmQ9XCIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19XCJcXG4gICAgYXJncz0oXCIke0NPTVBfV09SRFNbQF19XCIpXFxuXFxuICAgICMgYXNrIHlhcmdzIHRvIGdlbmVyYXRlIGNvbXBsZXRpb25zLlxcbiAgICB0eXBlX2xpc3Q9JCh7e2FwcF9wYXRofX0gLS1nZXQteWFyZ3MtY29tcGxldGlvbnMgXCIke2FyZ3NbQF19XCIpXFxuXFxuICAgIENPTVBSRVBMWT0oICQoY29tcGdlbiAtVyBcIiR7dHlwZV9saXN0fVwiIC0tICR7Y3VyX3dvcmR9KSApXFxuXFxuICAgICMgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLCBmYWxsIGJhY2sgdG8gZmlsZW5hbWUgY29tcGxldGlvblxcbiAgICBpZiBbICR7I0NPTVBSRVBMWVtAXX0gLWVxIDAgXTsgdGhlblxcbiAgICAgIENPTVBSRVBMWT0oKVxcbiAgICBmaVxcblxcbiAgICByZXR1cm4gMFxcbn1cXG5jb21wbGV0ZSAtbyBiYXNoZGVmYXVsdCAtbyBkZWZhdWx0IC1GIF97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMge3thcHBfbmFtZX19XFxuIyMjLWVuZC17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXFxuJztjb25zdCBpPXRoaXMuc2hpbS5wYXRoLmJhc2VuYW1lKHQpO3JldHVybiB0Lm1hdGNoKC9cXC5qcyQvKSYmKHQ9YC4vJHt0fWApLHM9cy5yZXBsYWNlKC97e2FwcF9uYW1lfX0vZyxpKSxzPXMucmVwbGFjZSgve3tjb21wbGV0aW9uX2NvbW1hbmR9fS9nLGUpLHMucmVwbGFjZSgve3thcHBfcGF0aH19L2csdCl9cmVnaXN0ZXJGdW5jdGlvbih0KXt0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbj10fXNldFBhcnNlZCh0KXt0aGlzLmFsaWFzZXM9dC5hbGlhc2VzfX1mdW5jdGlvbiBOKHQsZSl7aWYoMD09PXQubGVuZ3RoKXJldHVybiBlLmxlbmd0aDtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHQubGVuZ3RoO2NvbnN0IHM9W107bGV0IGksbjtmb3IoaT0wO2k8PWUubGVuZ3RoO2krKylzW2ldPVtpXTtmb3Iobj0wO248PXQubGVuZ3RoO24rKylzWzBdW25dPW47Zm9yKGk9MTtpPD1lLmxlbmd0aDtpKyspZm9yKG49MTtuPD10Lmxlbmd0aDtuKyspZS5jaGFyQXQoaS0xKT09PXQuY2hhckF0KG4tMSk/c1tpXVtuXT1zW2ktMV1bbi0xXTppPjEmJm4+MSYmZS5jaGFyQXQoaS0yKT09PXQuY2hhckF0KG4tMSkmJmUuY2hhckF0KGktMSk9PT10LmNoYXJBdChuLTIpP3NbaV1bbl09c1tpLTJdW24tMl0rMTpzW2ldW25dPU1hdGgubWluKHNbaS0xXVtuLTFdKzEsTWF0aC5taW4oc1tpXVtuLTFdKzEsc1tpLTFdW25dKzEpKTtyZXR1cm4gc1tlLmxlbmd0aF1bdC5sZW5ndGhdfWNvbnN0IEg9W1wiJDBcIixcIi0tXCIsXCJfXCJdO3ZhciB6LFcscSxVLEYsTCxWLEcsUixULEIsWSxLLEosWixYLFEsdHQsZXQsc3QsaXQsbnQscnQsb3QsYXQsaHQsbHQsY3QsZnQsZHQsdXQscHQsZ3QsbXQseXQ7Y29uc3QgYnQ9U3ltYm9sKFwiY29weURvdWJsZURhc2hcIiksdnQ9U3ltYm9sKFwiY29weURvdWJsZURhc2hcIiksT3Q9U3ltYm9sKFwiZGVsZXRlRnJvbVBhcnNlckhpbnRPYmplY3RcIiksd3Q9U3ltYm9sKFwiZW1pdFdhcm5pbmdcIiksQ3Q9U3ltYm9sKFwiZnJlZXplXCIpLGp0PVN5bWJvbChcImdldERvbGxhclplcm9cIiksTXQ9U3ltYm9sKFwiZ2V0UGFyc2VyQ29uZmlndXJhdGlvblwiKSxfdD1TeW1ib2woXCJnZXRVc2FnZUNvbmZpZ3VyYXRpb25cIiksa3Q9U3ltYm9sKFwiZ3Vlc3NMb2NhbGVcIikseHQ9U3ltYm9sKFwiZ3Vlc3NWZXJzaW9uXCIpLEV0PVN5bWJvbChcInBhcnNlUG9zaXRpb25hbE51bWJlcnNcIiksQXQ9U3ltYm9sKFwicGtnVXBcIiksUHQ9U3ltYm9sKFwicG9wdWxhdGVQYXJzZXJIaW50QXJyYXlcIiksU3Q9U3ltYm9sKFwicG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5XCIpLCR0PVN5bWJvbChcInBvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeVwiKSxJdD1TeW1ib2woXCJwb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5XCIpLER0PVN5bWJvbChcInNhbml0aXplS2V5XCIpLE50PVN5bWJvbChcInNldEtleVwiKSxIdD1TeW1ib2woXCJ1bmZyZWV6ZVwiKSx6dD1TeW1ib2woXCJ2YWxpZGF0ZUFzeW5jXCIpLFd0PVN5bWJvbChcImdldENvbW1hbmRJbnN0YW5jZVwiKSxxdD1TeW1ib2woXCJnZXRDb250ZXh0XCIpLFV0PVN5bWJvbChcImdldEhhc091dHB1dFwiKSxGdD1TeW1ib2woXCJnZXRMb2dnZXJJbnN0YW5jZVwiKSxMdD1TeW1ib2woXCJnZXRQYXJzZUNvbnRleHRcIiksVnQ9U3ltYm9sKFwiZ2V0VXNhZ2VJbnN0YW5jZVwiKSxHdD1TeW1ib2woXCJnZXRWYWxpZGF0aW9uSW5zdGFuY2VcIiksUnQ9U3ltYm9sKFwiaGFzUGFyc2VDYWxsYmFja1wiKSxUdD1TeW1ib2woXCJpc0dsb2JhbENvbnRleHRcIiksQnQ9U3ltYm9sKFwicG9zdFByb2Nlc3NcIiksWXQ9U3ltYm9sKFwicmViYXNlXCIpLEt0PVN5bWJvbChcInJlc2V0XCIpLEp0PVN5bWJvbChcInJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzXCIpLFp0PVN5bWJvbChcInJ1blZhbGlkYXRpb25cIiksWHQ9U3ltYm9sKFwic2V0SGFzT3V0cHV0XCIpLFF0PVN5bWJvbChcImtUcmFja01hbnVhbGx5U2V0S2V5c1wiKTtjbGFzcyB0ZXtjb25zdHJ1Y3Rvcih0PVtdLGUscyxpKXt0aGlzLmN1c3RvbVNjcmlwdE5hbWU9ITEsdGhpcy5wYXJzZWQ9ITEsei5zZXQodGhpcyx2b2lkIDApLFcuc2V0KHRoaXMsdm9pZCAwKSxxLnNldCh0aGlzLHtjb21tYW5kczpbXSxmdWxsQ29tbWFuZHM6W119KSxVLnNldCh0aGlzLG51bGwpLEYuc2V0KHRoaXMsbnVsbCksTC5zZXQodGhpcyxcInNob3ctaGlkZGVuXCIpLFYuc2V0KHRoaXMsbnVsbCksRy5zZXQodGhpcywhMCksUi5zZXQodGhpcyx7fSksVC5zZXQodGhpcywhMCksQi5zZXQodGhpcyxbXSksWS5zZXQodGhpcyx2b2lkIDApLEsuc2V0KHRoaXMse30pLEouc2V0KHRoaXMsITEpLFouc2V0KHRoaXMsbnVsbCksWC5zZXQodGhpcywhMCksUS5zZXQodGhpcyx2b2lkIDApLHR0LnNldCh0aGlzLFwiXCIpLGV0LnNldCh0aGlzLHZvaWQgMCksc3Quc2V0KHRoaXMsdm9pZCAwKSxpdC5zZXQodGhpcyx7fSksbnQuc2V0KHRoaXMsbnVsbCkscnQuc2V0KHRoaXMsbnVsbCksb3Quc2V0KHRoaXMse30pLGF0LnNldCh0aGlzLHt9KSxodC5zZXQodGhpcyx2b2lkIDApLGx0LnNldCh0aGlzLCExKSxjdC5zZXQodGhpcyx2b2lkIDApLGZ0LnNldCh0aGlzLCExKSxkdC5zZXQodGhpcywhMSksdXQuc2V0KHRoaXMsITEpLHB0LnNldCh0aGlzLHZvaWQgMCksZ3Quc2V0KHRoaXMse30pLG10LnNldCh0aGlzLG51bGwpLHl0LnNldCh0aGlzLHZvaWQgMCksTyh0aGlzLGN0LGksXCJmXCIpLE8odGhpcyxodCx0LFwiZlwiKSxPKHRoaXMsVyxlLFwiZlwiKSxPKHRoaXMsc3QscyxcImZcIiksTyh0aGlzLFksbmV3IHcodGhpcyksXCJmXCIpLHRoaXMuJDA9dGhpc1tqdF0oKSx0aGlzW0t0XSgpLE8odGhpcyx6LHYodGhpcyx6LFwiZlwiKSxcImZcIiksTyh0aGlzLHB0LHYodGhpcyxwdCxcImZcIiksXCJmXCIpLE8odGhpcyx5dCx2KHRoaXMseXQsXCJmXCIpLFwiZlwiKSxPKHRoaXMsZXQsdih0aGlzLGV0LFwiZlwiKSxcImZcIiksdih0aGlzLGV0LFwiZlwiKS5zaG93SGlkZGVuT3B0PXYodGhpcyxMLFwiZlwiKSxPKHRoaXMsUSx0aGlzW3Z0XSgpLFwiZlwiKX1hZGRIZWxwT3B0KHQsZSl7cmV0dXJuIGgoXCJbc3RyaW5nfGJvb2xlYW5dIFtzdHJpbmddXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLFosXCJmXCIpJiYodGhpc1tPdF0odih0aGlzLFosXCJmXCIpKSxPKHRoaXMsWixudWxsLFwiZlwiKSksITE9PT10JiZ2b2lkIDA9PT1lfHwoTyh0aGlzLFosXCJzdHJpbmdcIj09dHlwZW9mIHQ/dDpcImhlbHBcIixcImZcIiksdGhpcy5ib29sZWFuKHYodGhpcyxaLFwiZlwiKSksdGhpcy5kZXNjcmliZSh2KHRoaXMsWixcImZcIiksZXx8dih0aGlzLHB0LFwiZlwiKS5kZWZlclkxOG5Mb29rdXAoXCJTaG93IGhlbHBcIikpKSx0aGlzfWhlbHAodCxlKXtyZXR1cm4gdGhpcy5hZGRIZWxwT3B0KHQsZSl9YWRkU2hvd0hpZGRlbk9wdCh0LGUpe2lmKGgoXCJbc3RyaW5nfGJvb2xlYW5dIFtzdHJpbmddXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksITE9PT10JiZ2b2lkIDA9PT1lKXJldHVybiB0aGlzO2NvbnN0IHM9XCJzdHJpbmdcIj09dHlwZW9mIHQ/dDp2KHRoaXMsTCxcImZcIik7cmV0dXJuIHRoaXMuYm9vbGVhbihzKSx0aGlzLmRlc2NyaWJlKHMsZXx8dih0aGlzLHB0LFwiZlwiKS5kZWZlclkxOG5Mb29rdXAoXCJTaG93IGhpZGRlbiBvcHRpb25zXCIpKSx2KHRoaXMsZXQsXCJmXCIpLnNob3dIaWRkZW5PcHQ9cyx0aGlzfXNob3dIaWRkZW4odCxlKXtyZXR1cm4gdGhpcy5hZGRTaG93SGlkZGVuT3B0KHQsZSl9YWxpYXModCxlKXtyZXR1cm4gaChcIjxvYmplY3R8c3RyaW5nfGFycmF5PiBbc3RyaW5nfGFycmF5XVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbJHRdKHRoaXMuYWxpYXMuYmluZCh0aGlzKSxcImFsaWFzXCIsdCxlKSx0aGlzfWFycmF5KHQpe3JldHVybiBoKFwiPGFycmF5fHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tQdF0oXCJhcnJheVwiLHQpLHRoaXNbUXRdKHQpLHRoaXN9Ym9vbGVhbih0KXtyZXR1cm4gaChcIjxhcnJheXxzdHJpbmc+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbUHRdKFwiYm9vbGVhblwiLHQpLHRoaXNbUXRdKHQpLHRoaXN9Y2hlY2sodCxlKXtyZXR1cm4gaChcIjxmdW5jdGlvbj4gW2Jvb2xlYW5dXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdGhpcy5taWRkbGV3YXJlKCgoZSxzKT0+aigoKCk9PnQoZSxzLmdldE9wdGlvbnMoKSkpLChzPT4ocz8oXCJzdHJpbmdcIj09dHlwZW9mIHN8fHMgaW5zdGFuY2VvZiBFcnJvcikmJnYodGhpcyxwdCxcImZcIikuZmFpbChzLnRvU3RyaW5nKCkscyk6dih0aGlzLHB0LFwiZlwiKS5mYWlsKHYodGhpcyxjdCxcImZcIikueTE4bi5fXyhcIkFyZ3VtZW50IGNoZWNrIGZhaWxlZDogJXNcIix0LnRvU3RyaW5nKCkpKSxlKSksKHQ9Pih2KHRoaXMscHQsXCJmXCIpLmZhaWwodC5tZXNzYWdlP3QubWVzc2FnZTp0LnRvU3RyaW5nKCksdCksZSkpKSksITEsZSksdGhpc31jaG9pY2VzKHQsZSl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ3xhcnJheV1cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzWyR0XSh0aGlzLmNob2ljZXMuYmluZCh0aGlzKSxcImNob2ljZXNcIix0LGUpLHRoaXN9Y29lcmNlKHQscyl7aWYoaChcIjxvYmplY3R8c3RyaW5nfGFycmF5PiBbZnVuY3Rpb25dXCIsW3Qsc10sYXJndW1lbnRzLmxlbmd0aCksQXJyYXkuaXNBcnJheSh0KSl7aWYoIXMpdGhyb3cgbmV3IGUoXCJjb2VyY2UgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZFwiKTtmb3IoY29uc3QgZSBvZiB0KXRoaXMuY29lcmNlKGUscyk7cmV0dXJuIHRoaXN9aWYoXCJvYmplY3RcIj09dHlwZW9mIHQpe2Zvcihjb25zdCBlIG9mIE9iamVjdC5rZXlzKHQpKXRoaXMuY29lcmNlKGUsdFtlXSk7cmV0dXJuIHRoaXN9aWYoIXMpdGhyb3cgbmV3IGUoXCJjb2VyY2UgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZFwiKTtyZXR1cm4gdih0aGlzLGV0LFwiZlwiKS5rZXlbdF09ITAsdih0aGlzLFksXCJmXCIpLmFkZENvZXJjZU1pZGRsZXdhcmUoKChpLG4pPT57bGV0IHI7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLHQpP2ooKCgpPT4ocj1uLmdldEFsaWFzZXMoKSxzKGlbdF0pKSksKGU9PntpW3RdPWU7Y29uc3Qgcz1uLmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKVtcInN0cmlwLWFsaWFzZWRcIl07aWYoclt0XSYmITAhPT1zKWZvcihjb25zdCBzIG9mIHJbdF0paVtzXT1lO3JldHVybiBpfSksKHQ9Pnt0aHJvdyBuZXcgZSh0Lm1lc3NhZ2UpfSkpOml9KSx0KSx0aGlzfWNvbmZsaWN0cyh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xvYmplY3Q+IFtzdHJpbmd8YXJyYXldXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLHl0LFwiZlwiKS5jb25mbGljdHModCxlKSx0aGlzfWNvbmZpZyh0PVwiY29uZmlnXCIsZSxzKXtyZXR1cm4gaChcIltvYmplY3R8c3RyaW5nXSBbc3RyaW5nfGZ1bmN0aW9uXSBbZnVuY3Rpb25dXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSxcIm9iamVjdFwiIT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KT8oXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmKHM9ZSxlPXZvaWQgMCksdGhpcy5kZXNjcmliZSh0LGV8fHYodGhpcyxwdCxcImZcIikuZGVmZXJZMThuTG9va3VwKFwiUGF0aCB0byBKU09OIGNvbmZpZyBmaWxlXCIpKSwoQXJyYXkuaXNBcnJheSh0KT90Olt0XSkuZm9yRWFjaCgodD0+e3YodGhpcyxldCxcImZcIikuY29uZmlnW3RdPXN8fCEwfSkpLHRoaXMpOih0PW4odCx2KHRoaXMsVyxcImZcIiksdGhpc1tNdF0oKVtcImRlZXAtbWVyZ2UtY29uZmlnXCJdfHwhMSx2KHRoaXMsY3QsXCJmXCIpKSx2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHM9KHYodGhpcyxldCxcImZcIikuY29uZmlnT2JqZWN0c3x8W10pLmNvbmNhdCh0KSx0aGlzKX1jb21wbGV0aW9uKHQsZSxzKXtyZXR1cm4gaChcIltzdHJpbmddIFtzdHJpbmd8Ym9vbGVhbnxmdW5jdGlvbl0gW2Z1bmN0aW9uXVwiLFt0LGUsc10sYXJndW1lbnRzLmxlbmd0aCksXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmKHM9ZSxlPXZvaWQgMCksTyh0aGlzLEYsdHx8dih0aGlzLEYsXCJmXCIpfHxcImNvbXBsZXRpb25cIixcImZcIiksZXx8ITE9PT1lfHwoZT1cImdlbmVyYXRlIGNvbXBsZXRpb24gc2NyaXB0XCIpLHRoaXMuY29tbWFuZCh2KHRoaXMsRixcImZcIiksZSkscyYmdih0aGlzLFUsXCJmXCIpLnJlZ2lzdGVyRnVuY3Rpb24ocyksdGhpc31jb21tYW5kKHQsZSxzLGksbixyKXtyZXR1cm4gaChcIjxzdHJpbmd8YXJyYXl8b2JqZWN0PiBbc3RyaW5nfGJvb2xlYW5dIFtmdW5jdGlvbnxvYmplY3RdIFtmdW5jdGlvbl0gW2FycmF5XSBbYm9vbGVhbnxzdHJpbmddXCIsW3QsZSxzLGksbixyXSxhcmd1bWVudHMubGVuZ3RoKSx2KHRoaXMseixcImZcIikuYWRkSGFuZGxlcih0LGUscyxpLG4sciksdGhpc31jb21tYW5kcyh0LGUscyxpLG4scil7cmV0dXJuIHRoaXMuY29tbWFuZCh0LGUscyxpLG4scil9Y29tbWFuZERpcih0LGUpe2goXCI8c3RyaW5nPiBbb2JqZWN0XVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpO2NvbnN0IHM9dih0aGlzLHN0LFwiZlwiKXx8dih0aGlzLGN0LFwiZlwiKS5yZXF1aXJlO3JldHVybiB2KHRoaXMseixcImZcIikuYWRkRGlyZWN0b3J5KHQscyx2KHRoaXMsY3QsXCJmXCIpLmdldENhbGxlckZpbGUoKSxlKSx0aGlzfWNvdW50KHQpe3JldHVybiBoKFwiPGFycmF5fHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tQdF0oXCJjb3VudFwiLHQpLHRoaXNbUXRdKHQpLHRoaXN9ZGVmYXVsdCh0LGUscyl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gWypdIFtzdHJpbmddXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSxzJiYodSh0LHYodGhpcyxjdCxcImZcIikpLHYodGhpcyxldCxcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW3RdPXMpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJih1KHQsdih0aGlzLGN0LFwiZlwiKSksdih0aGlzLGV0LFwiZlwiKS5kZWZhdWx0RGVzY3JpcHRpb25bdF18fCh2KHRoaXMsZXQsXCJmXCIpLmRlZmF1bHREZXNjcmlwdGlvblt0XT12KHRoaXMscHQsXCJmXCIpLmZ1bmN0aW9uRGVzY3JpcHRpb24oZSkpLGU9ZS5jYWxsKCkpLHRoaXNbU3RdKHRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLFwiZGVmYXVsdFwiLHQsZSksdGhpc31kZWZhdWx0cyh0LGUscyl7cmV0dXJuIHRoaXMuZGVmYXVsdCh0LGUscyl9ZGVtYW5kQ29tbWFuZCh0PTEsZSxzLGkpe3JldHVybiBoKFwiW251bWJlcl0gW251bWJlcnxzdHJpbmddIFtzdHJpbmd8bnVsbHx1bmRlZmluZWRdIFtzdHJpbmd8bnVsbHx1bmRlZmluZWRdXCIsW3QsZSxzLGldLGFyZ3VtZW50cy5sZW5ndGgpLFwibnVtYmVyXCIhPXR5cGVvZiBlJiYocz1lLGU9MS8wKSx0aGlzLmdsb2JhbChcIl9cIiwhMSksdih0aGlzLGV0LFwiZlwiKS5kZW1hbmRlZENvbW1hbmRzLl89e21pbjp0LG1heDplLG1pbk1zZzpzLG1heE1zZzppfSx0aGlzfWRlbWFuZCh0LGUscyl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/KGUuZm9yRWFjaCgodD0+e2QocywhMCx2KHRoaXMsY3QsXCJmXCIpKSx0aGlzLmRlbWFuZE9wdGlvbih0LHMpfSkpLGU9MS8wKTpcIm51bWJlclwiIT10eXBlb2YgZSYmKHM9ZSxlPTEvMCksXCJudW1iZXJcIj09dHlwZW9mIHQ/KGQocywhMCx2KHRoaXMsY3QsXCJmXCIpKSx0aGlzLmRlbWFuZENvbW1hbmQodCxlLHMscykpOkFycmF5LmlzQXJyYXkodCk/dC5mb3JFYWNoKCh0PT57ZChzLCEwLHYodGhpcyxjdCxcImZcIikpLHRoaXMuZGVtYW5kT3B0aW9uKHQscyl9KSk6XCJzdHJpbmdcIj09dHlwZW9mIHM/dGhpcy5kZW1hbmRPcHRpb24odCxzKTohMCE9PXMmJnZvaWQgMCE9PXN8fHRoaXMuZGVtYW5kT3B0aW9uKHQpLHRoaXN9ZGVtYW5kT3B0aW9uKHQsZSl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW1N0XSh0aGlzLmRlbWFuZE9wdGlvbi5iaW5kKHRoaXMpLFwiZGVtYW5kZWRPcHRpb25zXCIsdCxlKSx0aGlzfWRlcHJlY2F0ZU9wdGlvbih0LGUpe3JldHVybiBoKFwiPHN0cmluZz4gW3N0cmluZ3xib29sZWFuXVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLHYodGhpcyxldCxcImZcIikuZGVwcmVjYXRlZE9wdGlvbnNbdF09ZSx0aGlzfWRlc2NyaWJlKHQsZSl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW050XSh0LCEwKSx2KHRoaXMscHQsXCJmXCIpLmRlc2NyaWJlKHQsZSksdGhpc31kZXRlY3RMb2NhbGUodCl7cmV0dXJuIGgoXCI8Ym9vbGVhbj5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksTyh0aGlzLEcsdCxcImZcIiksdGhpc31lbnYodCl7cmV0dXJuIGgoXCJbc3RyaW5nfGJvb2xlYW5dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLCExPT09dD9kZWxldGUgdih0aGlzLGV0LFwiZlwiKS5lbnZQcmVmaXg6dih0aGlzLGV0LFwiZlwiKS5lbnZQcmVmaXg9dHx8XCJcIix0aGlzfWVwaWxvZ3VlKHQpe3JldHVybiBoKFwiPHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLHB0LFwiZlwiKS5lcGlsb2codCksdGhpc31lcGlsb2codCl7cmV0dXJuIHRoaXMuZXBpbG9ndWUodCl9ZXhhbXBsZSh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xhcnJheT4gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSxBcnJheS5pc0FycmF5KHQpP3QuZm9yRWFjaCgodD0+dGhpcy5leGFtcGxlKC4uLnQpKSk6dih0aGlzLHB0LFwiZlwiKS5leGFtcGxlKHQsZSksdGhpc31leGl0KHQsZSl7Tyh0aGlzLEosITAsXCJmXCIpLE8odGhpcyxWLGUsXCJmXCIpLHYodGhpcyxULFwiZlwiKSYmdih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmV4aXQodCl9ZXhpdFByb2Nlc3ModD0hMCl7cmV0dXJuIGgoXCJbYm9vbGVhbl1cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksTyh0aGlzLFQsdCxcImZcIiksdGhpc31mYWlsKHQpe2lmKGgoXCI8ZnVuY3Rpb258Ym9vbGVhbj5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksXCJib29sZWFuXCI9PXR5cGVvZiB0JiYhMSE9PXQpdGhyb3cgbmV3IGUoXCJJbnZhbGlkIGZpcnN0IGFyZ3VtZW50LiBFeHBlY3RlZCBmdW5jdGlvbiBvciBib29sZWFuICdmYWxzZSdcIik7cmV0dXJuIHYodGhpcyxwdCxcImZcIikuZmFpbEZuKHQpLHRoaXN9Z2V0QWxpYXNlcygpe3JldHVybiB0aGlzLnBhcnNlZD90aGlzLnBhcnNlZC5hbGlhc2VzOnt9fWFzeW5jIGdldENvbXBsZXRpb24odCxlKXtyZXR1cm4gaChcIjxhcnJheT4gW2Z1bmN0aW9uXVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLGU/dih0aGlzLFUsXCJmXCIpLmdldENvbXBsZXRpb24odCxlKTpuZXcgUHJvbWlzZSgoKGUscyk9Pnt2KHRoaXMsVSxcImZcIikuZ2V0Q29tcGxldGlvbih0LCgodCxpKT0+e3Q/cyh0KTplKGkpfSkpfSkpfWdldERlbWFuZGVkT3B0aW9ucygpe3JldHVybiBoKFtdLDApLHYodGhpcyxldCxcImZcIikuZGVtYW5kZWRPcHRpb25zfWdldERlbWFuZGVkQ29tbWFuZHMoKXtyZXR1cm4gaChbXSwwKSx2KHRoaXMsZXQsXCJmXCIpLmRlbWFuZGVkQ29tbWFuZHN9Z2V0RGVwcmVjYXRlZE9wdGlvbnMoKXtyZXR1cm4gaChbXSwwKSx2KHRoaXMsZXQsXCJmXCIpLmRlcHJlY2F0ZWRPcHRpb25zfWdldERldGVjdExvY2FsZSgpe3JldHVybiB2KHRoaXMsRyxcImZcIil9Z2V0RXhpdFByb2Nlc3MoKXtyZXR1cm4gdih0aGlzLFQsXCJmXCIpfWdldEdyb3Vwcygpe3JldHVybiBPYmplY3QuYXNzaWduKHt9LHYodGhpcyxLLFwiZlwiKSx2KHRoaXMsYXQsXCJmXCIpKX1nZXRIZWxwKCl7aWYoTyh0aGlzLEosITAsXCJmXCIpLCF2KHRoaXMscHQsXCJmXCIpLmhhc0NhY2hlZEhlbHBNZXNzYWdlKCkpe2lmKCF0aGlzLnBhcnNlZCl7Y29uc3QgdD10aGlzW0p0XSh2KHRoaXMsaHQsXCJmXCIpLHZvaWQgMCx2b2lkIDAsMCwhMCk7aWYoZih0KSlyZXR1cm4gdC50aGVuKCgoKT0+dih0aGlzLHB0LFwiZlwiKS5oZWxwKCkpKX1jb25zdCB0PXYodGhpcyx6LFwiZlwiKS5ydW5EZWZhdWx0QnVpbGRlck9uKHRoaXMpO2lmKGYodCkpcmV0dXJuIHQudGhlbigoKCk9PnYodGhpcyxwdCxcImZcIikuaGVscCgpKSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KHRoaXMscHQsXCJmXCIpLmhlbHAoKSl9Z2V0T3B0aW9ucygpe3JldHVybiB2KHRoaXMsZXQsXCJmXCIpfWdldFN0cmljdCgpe3JldHVybiB2KHRoaXMsZnQsXCJmXCIpfWdldFN0cmljdENvbW1hbmRzKCl7cmV0dXJuIHYodGhpcyxkdCxcImZcIil9Z2V0U3RyaWN0T3B0aW9ucygpe3JldHVybiB2KHRoaXMsdXQsXCJmXCIpfWdsb2JhbCh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xhcnJheT4gW2Jvb2xlYW5dXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdD1bXS5jb25jYXQodCksITEhPT1lP3YodGhpcyxldCxcImZcIikubG9jYWw9dih0aGlzLGV0LFwiZlwiKS5sb2NhbC5maWx0ZXIoKGU9Pi0xPT09dC5pbmRleE9mKGUpKSk6dC5mb3JFYWNoKCh0PT57dih0aGlzLGV0LFwiZlwiKS5sb2NhbC5pbmNsdWRlcyh0KXx8dih0aGlzLGV0LFwiZlwiKS5sb2NhbC5wdXNoKHQpfSkpLHRoaXN9Z3JvdXAodCxlKXtoKFwiPHN0cmluZ3xhcnJheT4gPHN0cmluZz5cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKTtjb25zdCBzPXYodGhpcyxhdCxcImZcIilbZV18fHYodGhpcyxLLFwiZlwiKVtlXTt2KHRoaXMsYXQsXCJmXCIpW2VdJiZkZWxldGUgdih0aGlzLGF0LFwiZlwiKVtlXTtjb25zdCBpPXt9O3JldHVybiB2KHRoaXMsSyxcImZcIilbZV09KHN8fFtdKS5jb25jYXQodCkuZmlsdGVyKCh0PT4haVt0XSYmKGlbdF09ITApKSksdGhpc31oaWRlKHQpe3JldHVybiBoKFwiPHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLGV0LFwiZlwiKS5oaWRkZW5PcHRpb25zLnB1c2godCksdGhpc31pbXBsaWVzKHQsZSl7cmV0dXJuIGgoXCI8c3RyaW5nfG9iamVjdD4gW251bWJlcnxzdHJpbmd8YXJyYXldXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLHl0LFwiZlwiKS5pbXBsaWVzKHQsZSksdGhpc31sb2NhbGUodCl7cmV0dXJuIGgoXCJbc3RyaW5nXVwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSx2b2lkIDA9PT10Pyh0aGlzW2t0XSgpLHYodGhpcyxjdCxcImZcIikueTE4bi5nZXRMb2NhbGUoKSk6KE8odGhpcyxHLCExLFwiZlwiKSx2KHRoaXMsY3QsXCJmXCIpLnkxOG4uc2V0TG9jYWxlKHQpLHRoaXMpfW1pZGRsZXdhcmUodCxlLHMpe3JldHVybiB2KHRoaXMsWSxcImZcIikuYWRkTWlkZGxld2FyZSh0LCEhZSxzKX1uYXJncyh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xvYmplY3R8YXJyYXk+IFtudW1iZXJdXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tTdF0odGhpcy5uYXJncy5iaW5kKHRoaXMpLFwibmFyZ1wiLHQsZSksdGhpc31ub3JtYWxpemUodCl7cmV0dXJuIGgoXCI8YXJyYXl8c3RyaW5nPlwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW1B0XShcIm5vcm1hbGl6ZVwiLHQpLHRoaXN9bnVtYmVyKHQpe3JldHVybiBoKFwiPGFycmF5fHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tQdF0oXCJudW1iZXJcIix0KSx0aGlzW1F0XSh0KSx0aGlzfW9wdGlvbih0LGUpe2lmKGgoXCI8c3RyaW5nfG9iamVjdD4gW29iamVjdF1cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSxcIm9iamVjdFwiPT10eXBlb2YgdClPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChlPT57dGhpcy5vcHRpb25zKGUsdFtlXSl9KSk7ZWxzZXtcIm9iamVjdFwiIT10eXBlb2YgZSYmKGU9e30pLHRoaXNbUXRdKHQpLCF2KHRoaXMsbXQsXCJmXCIpfHxcInZlcnNpb25cIiE9PXQmJlwidmVyc2lvblwiIT09KG51bGw9PWU/dm9pZCAwOmUuYWxpYXMpfHx0aGlzW3d0XShbJ1widmVyc2lvblwiIGlzIGEgcmVzZXJ2ZWQgd29yZC4nLFwiUGxlYXNlIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOlwiLCctIERpc2FibGUgdmVyc2lvbiB3aXRoIGB5YXJncy52ZXJzaW9uKGZhbHNlKWAgaWYgdXNpbmcgXCJ2ZXJzaW9uXCIgYXMgYW4gb3B0aW9uJyxcIi0gVXNlIHRoZSBidWlsdC1pbiBgeWFyZ3MudmVyc2lvbmAgbWV0aG9kIGluc3RlYWQgKGlmIGFwcGxpY2FibGUpXCIsXCItIFVzZSBhIGRpZmZlcmVudCBvcHRpb24ga2V5XCIsXCJodHRwczovL3lhcmdzLmpzLm9yZy9kb2NzLyNhcGktcmVmZXJlbmNlLXZlcnNpb25cIl0uam9pbihcIlxcblwiKSx2b2lkIDAsXCJ2ZXJzaW9uV2FybmluZ1wiKSx2KHRoaXMsZXQsXCJmXCIpLmtleVt0XT0hMCxlLmFsaWFzJiZ0aGlzLmFsaWFzKHQsZS5hbGlhcyk7Y29uc3Qgcz1lLmRlcHJlY2F0ZXx8ZS5kZXByZWNhdGVkO3MmJnRoaXMuZGVwcmVjYXRlT3B0aW9uKHQscyk7Y29uc3QgaT1lLmRlbWFuZHx8ZS5yZXF1aXJlZHx8ZS5yZXF1aXJlO2kmJnRoaXMuZGVtYW5kKHQsaSksZS5kZW1hbmRPcHRpb24mJnRoaXMuZGVtYW5kT3B0aW9uKHQsXCJzdHJpbmdcIj09dHlwZW9mIGUuZGVtYW5kT3B0aW9uP2UuZGVtYW5kT3B0aW9uOnZvaWQgMCksZS5jb25mbGljdHMmJnRoaXMuY29uZmxpY3RzKHQsZS5jb25mbGljdHMpLFwiZGVmYXVsdFwiaW4gZSYmdGhpcy5kZWZhdWx0KHQsZS5kZWZhdWx0KSx2b2lkIDAhPT1lLmltcGxpZXMmJnRoaXMuaW1wbGllcyh0LGUuaW1wbGllcyksdm9pZCAwIT09ZS5uYXJncyYmdGhpcy5uYXJncyh0LGUubmFyZ3MpLGUuY29uZmlnJiZ0aGlzLmNvbmZpZyh0LGUuY29uZmlnUGFyc2VyKSxlLm5vcm1hbGl6ZSYmdGhpcy5ub3JtYWxpemUodCksZS5jaG9pY2VzJiZ0aGlzLmNob2ljZXModCxlLmNob2ljZXMpLGUuY29lcmNlJiZ0aGlzLmNvZXJjZSh0LGUuY29lcmNlKSxlLmdyb3VwJiZ0aGlzLmdyb3VwKHQsZS5ncm91cCksKGUuYm9vbGVhbnx8XCJib29sZWFuXCI9PT1lLnR5cGUpJiYodGhpcy5ib29sZWFuKHQpLGUuYWxpYXMmJnRoaXMuYm9vbGVhbihlLmFsaWFzKSksKGUuYXJyYXl8fFwiYXJyYXlcIj09PWUudHlwZSkmJih0aGlzLmFycmF5KHQpLGUuYWxpYXMmJnRoaXMuYXJyYXkoZS5hbGlhcykpLChlLm51bWJlcnx8XCJudW1iZXJcIj09PWUudHlwZSkmJih0aGlzLm51bWJlcih0KSxlLmFsaWFzJiZ0aGlzLm51bWJlcihlLmFsaWFzKSksKGUuc3RyaW5nfHxcInN0cmluZ1wiPT09ZS50eXBlKSYmKHRoaXMuc3RyaW5nKHQpLGUuYWxpYXMmJnRoaXMuc3RyaW5nKGUuYWxpYXMpKSwoZS5jb3VudHx8XCJjb3VudFwiPT09ZS50eXBlKSYmdGhpcy5jb3VudCh0KSxcImJvb2xlYW5cIj09dHlwZW9mIGUuZ2xvYmFsJiZ0aGlzLmdsb2JhbCh0LGUuZ2xvYmFsKSxlLmRlZmF1bHREZXNjcmlwdGlvbiYmKHYodGhpcyxldCxcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW3RdPWUuZGVmYXVsdERlc2NyaXB0aW9uKSxlLnNraXBWYWxpZGF0aW9uJiZ0aGlzLnNraXBWYWxpZGF0aW9uKHQpO2NvbnN0IG49ZS5kZXNjcmliZXx8ZS5kZXNjcmlwdGlvbnx8ZS5kZXNjLHI9dih0aGlzLHB0LFwiZlwiKS5nZXREZXNjcmlwdGlvbnMoKTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocix0KSYmXCJzdHJpbmdcIiE9dHlwZW9mIG58fHRoaXMuZGVzY3JpYmUodCxuKSxlLmhpZGRlbiYmdGhpcy5oaWRlKHQpLGUucmVxdWlyZXNBcmcmJnRoaXMucmVxdWlyZXNBcmcodCl9cmV0dXJuIHRoaXN9b3B0aW9ucyh0LGUpe3JldHVybiB0aGlzLm9wdGlvbih0LGUpfXBhcnNlKHQsZSxzKXtoKFwiW3N0cmluZ3xhcnJheV0gW2Z1bmN0aW9ufGJvb2xlYW58b2JqZWN0XSBbZnVuY3Rpb25dXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW0N0XSgpLHZvaWQgMD09PXQmJih0PXYodGhpcyxodCxcImZcIikpLFwib2JqZWN0XCI9PXR5cGVvZiBlJiYoTyh0aGlzLHJ0LGUsXCJmXCIpLGU9cyksXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmKE8odGhpcyxudCxlLFwiZlwiKSxlPSExKSxlfHxPKHRoaXMsaHQsdCxcImZcIiksdih0aGlzLG50LFwiZlwiKSYmTyh0aGlzLFQsITEsXCJmXCIpO2NvbnN0IGk9dGhpc1tKdF0odCwhIWUpLG49dGhpcy5wYXJzZWQ7cmV0dXJuIHYodGhpcyxVLFwiZlwiKS5zZXRQYXJzZWQodGhpcy5wYXJzZWQpLGYoaSk/aS50aGVuKCh0PT4odih0aGlzLG50LFwiZlwiKSYmdih0aGlzLG50LFwiZlwiKS5jYWxsKHRoaXMsdih0aGlzLFYsXCJmXCIpLHQsdih0aGlzLHR0LFwiZlwiKSksdCkpKS5jYXRjaCgodD0+e3Rocm93IHYodGhpcyxudCxcImZcIikmJnYodGhpcyxudCxcImZcIikodCx0aGlzLnBhcnNlZC5hcmd2LHYodGhpcyx0dCxcImZcIikpLHR9KSkuZmluYWxseSgoKCk9Pnt0aGlzW0h0XSgpLHRoaXMucGFyc2VkPW59KSk6KHYodGhpcyxudCxcImZcIikmJnYodGhpcyxudCxcImZcIikuY2FsbCh0aGlzLHYodGhpcyxWLFwiZlwiKSxpLHYodGhpcyx0dCxcImZcIikpLHRoaXNbSHRdKCksdGhpcy5wYXJzZWQ9bixpKX1wYXJzZUFzeW5jKHQsZSxzKXtjb25zdCBpPXRoaXMucGFyc2UodCxlLHMpO3JldHVybiBmKGkpP2k6UHJvbWlzZS5yZXNvbHZlKGkpfXBhcnNlU3luYyh0LHMsaSl7Y29uc3Qgbj10aGlzLnBhcnNlKHQscyxpKTtpZihmKG4pKXRocm93IG5ldyBlKFwiLnBhcnNlU3luYygpIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhc3luY2hyb25vdXMgYnVpbGRlcnMsIGhhbmRsZXJzLCBvciBtaWRkbGV3YXJlXCIpO3JldHVybiBufXBhcnNlckNvbmZpZ3VyYXRpb24odCl7cmV0dXJuIGgoXCI8b2JqZWN0PlwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsaXQsdCxcImZcIiksdGhpc31wa2dDb25mKHQsZSl7aChcIjxzdHJpbmc+IFtzdHJpbmddXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCk7bGV0IHM9bnVsbDtjb25zdCBpPXRoaXNbQXRdKGV8fHYodGhpcyxXLFwiZlwiKSk7cmV0dXJuIGlbdF0mJlwib2JqZWN0XCI9PXR5cGVvZiBpW3RdJiYocz1uKGlbdF0sZXx8dih0aGlzLFcsXCJmXCIpLHRoaXNbTXRdKClbXCJkZWVwLW1lcmdlLWNvbmZpZ1wiXXx8ITEsdih0aGlzLGN0LFwiZlwiKSksdih0aGlzLGV0LFwiZlwiKS5jb25maWdPYmplY3RzPSh2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHN8fFtdKS5jb25jYXQocykpLHRoaXN9cG9zaXRpb25hbCh0LGUpe2goXCI8c3RyaW5nPiA8b2JqZWN0PlwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpO2NvbnN0IHM9W1wiZGVmYXVsdFwiLFwiZGVmYXVsdERlc2NyaXB0aW9uXCIsXCJpbXBsaWVzXCIsXCJub3JtYWxpemVcIixcImNob2ljZXNcIixcImNvbmZsaWN0c1wiLFwiY29lcmNlXCIsXCJ0eXBlXCIsXCJkZXNjcmliZVwiLFwiZGVzY1wiLFwiZGVzY3JpcHRpb25cIixcImFsaWFzXCJdO2U9ZyhlLCgodCxlKT0+IShcInR5cGVcIj09PXQmJiFbXCJzdHJpbmdcIixcIm51bWJlclwiLFwiYm9vbGVhblwiXS5pbmNsdWRlcyhlKSkmJnMuaW5jbHVkZXModCkpKTtjb25zdCBpPXYodGhpcyxxLFwiZlwiKS5mdWxsQ29tbWFuZHNbdih0aGlzLHEsXCJmXCIpLmZ1bGxDb21tYW5kcy5sZW5ndGgtMV0sbj1pP3YodGhpcyx6LFwiZlwiKS5jbWRUb1BhcnNlT3B0aW9ucyhpKTp7YXJyYXk6W10sYWxpYXM6e30sZGVmYXVsdDp7fSxkZW1hbmQ6e319O3JldHVybiBwKG4pLmZvckVhY2goKHM9Pntjb25zdCBpPW5bc107QXJyYXkuaXNBcnJheShpKT8tMSE9PWkuaW5kZXhPZih0KSYmKGVbc109ITApOmlbdF0mJiEocyBpbiBlKSYmKGVbc109aVt0XSl9KSksdGhpcy5ncm91cCh0LHYodGhpcyxwdCxcImZcIikuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpKSx0aGlzLm9wdGlvbih0LGUpfXJlY29tbWVuZENvbW1hbmRzKHQ9ITApe3JldHVybiBoKFwiW2Jvb2xlYW5dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLE8odGhpcyxsdCx0LFwiZlwiKSx0aGlzfXJlcXVpcmVkKHQsZSxzKXtyZXR1cm4gdGhpcy5kZW1hbmQodCxlLHMpfXJlcXVpcmUodCxlLHMpe3JldHVybiB0aGlzLmRlbWFuZCh0LGUscyl9cmVxdWlyZXNBcmcodCl7cmV0dXJuIGgoXCI8YXJyYXl8c3RyaW5nfG9iamVjdD4gW251bWJlcl1cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksXCJzdHJpbmdcIj09dHlwZW9mIHQmJnYodGhpcyxldCxcImZcIikubmFyZ1t0XXx8dGhpc1tTdF0odGhpcy5yZXF1aXJlc0FyZy5iaW5kKHRoaXMpLFwibmFyZ1wiLHQsTmFOKSx0aGlzfXNob3dDb21wbGV0aW9uU2NyaXB0KHQsZSl7cmV0dXJuIGgoXCJbc3RyaW5nXSBbc3RyaW5nXVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLHQ9dHx8dGhpcy4kMCx2KHRoaXMsUSxcImZcIikubG9nKHYodGhpcyxVLFwiZlwiKS5nZW5lcmF0ZUNvbXBsZXRpb25TY3JpcHQodCxlfHx2KHRoaXMsRixcImZcIil8fFwiY29tcGxldGlvblwiKSksdGhpc31zaG93SGVscCh0KXtpZihoKFwiW3N0cmluZ3xmdW5jdGlvbl1cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksTyh0aGlzLEosITAsXCJmXCIpLCF2KHRoaXMscHQsXCJmXCIpLmhhc0NhY2hlZEhlbHBNZXNzYWdlKCkpe2lmKCF0aGlzLnBhcnNlZCl7Y29uc3QgZT10aGlzW0p0XSh2KHRoaXMsaHQsXCJmXCIpLHZvaWQgMCx2b2lkIDAsMCwhMCk7aWYoZihlKSlyZXR1cm4gZS50aGVuKCgoKT0+e3YodGhpcyxwdCxcImZcIikuc2hvd0hlbHAodCl9KSksdGhpc31jb25zdCBlPXYodGhpcyx6LFwiZlwiKS5ydW5EZWZhdWx0QnVpbGRlck9uKHRoaXMpO2lmKGYoZSkpcmV0dXJuIGUudGhlbigoKCk9Pnt2KHRoaXMscHQsXCJmXCIpLnNob3dIZWxwKHQpfSkpLHRoaXN9cmV0dXJuIHYodGhpcyxwdCxcImZcIikuc2hvd0hlbHAodCksdGhpc31zY3JpcHROYW1lKHQpe3JldHVybiB0aGlzLmN1c3RvbVNjcmlwdE5hbWU9ITAsdGhpcy4kMD10LHRoaXN9c2hvd0hlbHBPbkZhaWwodCxlKXtyZXR1cm4gaChcIltib29sZWFufHN0cmluZ10gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx2KHRoaXMscHQsXCJmXCIpLnNob3dIZWxwT25GYWlsKHQsZSksdGhpc31zaG93VmVyc2lvbih0KXtyZXR1cm4gaChcIltzdHJpbmd8ZnVuY3Rpb25dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHYodGhpcyxwdCxcImZcIikuc2hvd1ZlcnNpb24odCksdGhpc31za2lwVmFsaWRhdGlvbih0KXtyZXR1cm4gaChcIjxhcnJheXxzdHJpbmc+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbUHRdKFwic2tpcFZhbGlkYXRpb25cIix0KSx0aGlzfXN0cmljdCh0KXtyZXR1cm4gaChcIltib29sZWFuXVwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsZnQsITEhPT10LFwiZlwiKSx0aGlzfXN0cmljdENvbW1hbmRzKHQpe3JldHVybiBoKFwiW2Jvb2xlYW5dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLE8odGhpcyxkdCwhMSE9PXQsXCJmXCIpLHRoaXN9c3RyaWN0T3B0aW9ucyh0KXtyZXR1cm4gaChcIltib29sZWFuXVwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsdXQsITEhPT10LFwiZlwiKSx0aGlzfXN0cmluZyh0KXtyZXR1cm4gaChcIjxhcnJheXxzdHJpbmc+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbUHRdKFwic3RyaW5nXCIsdCksdGhpc1tRdF0odCksdGhpc310ZXJtaW5hbFdpZHRoKCl7cmV0dXJuIGgoW10sMCksdih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLnN0ZENvbHVtbnN9dXBkYXRlTG9jYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVN0cmluZ3ModCl9dXBkYXRlU3RyaW5ncyh0KXtyZXR1cm4gaChcIjxvYmplY3Q+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLE8odGhpcyxHLCExLFwiZlwiKSx2KHRoaXMsY3QsXCJmXCIpLnkxOG4udXBkYXRlTG9jYWxlKHQpLHRoaXN9dXNhZ2UodCxzLGksbil7aWYoaChcIjxzdHJpbmd8bnVsbHx1bmRlZmluZWQ+IFtzdHJpbmd8Ym9vbGVhbl0gW2Z1bmN0aW9ufG9iamVjdF0gW2Z1bmN0aW9uXVwiLFt0LHMsaSxuXSxhcmd1bWVudHMubGVuZ3RoKSx2b2lkIDAhPT1zKXtpZihkKHQsbnVsbCx2KHRoaXMsY3QsXCJmXCIpKSwodHx8XCJcIikubWF0Y2goL15cXCQwKCB8JCkvKSlyZXR1cm4gdGhpcy5jb21tYW5kKHQscyxpLG4pO3Rocm93IG5ldyBlKFwiLnVzYWdlKCkgZGVzY3JpcHRpb24gbXVzdCBzdGFydCB3aXRoICQwIGlmIGJlaW5nIHVzZWQgYXMgYWxpYXMgZm9yIC5jb21tYW5kKClcIil9cmV0dXJuIHYodGhpcyxwdCxcImZcIikudXNhZ2UodCksdGhpc311c2FnZUNvbmZpZ3VyYXRpb24odCl7cmV0dXJuIGgoXCI8b2JqZWN0PlwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsZ3QsdCxcImZcIiksdGhpc312ZXJzaW9uKHQsZSxzKXtjb25zdCBpPVwidmVyc2lvblwiO2lmKGgoXCJbYm9vbGVhbnxzdHJpbmddIFtzdHJpbmddIFtzdHJpbmddXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSx2KHRoaXMsbXQsXCJmXCIpJiYodGhpc1tPdF0odih0aGlzLG10LFwiZlwiKSksdih0aGlzLHB0LFwiZlwiKS52ZXJzaW9uKHZvaWQgMCksTyh0aGlzLG10LG51bGwsXCJmXCIpKSwwPT09YXJndW1lbnRzLmxlbmd0aClzPXRoaXNbeHRdKCksdD1pO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCExPT09dClyZXR1cm4gdGhpcztzPXQsdD1pfWVsc2UgMj09PWFyZ3VtZW50cy5sZW5ndGgmJihzPWUsZT12b2lkIDApO3JldHVybiBPKHRoaXMsbXQsXCJzdHJpbmdcIj09dHlwZW9mIHQ/dDppLFwiZlwiKSxlPWV8fHYodGhpcyxwdCxcImZcIikuZGVmZXJZMThuTG9va3VwKFwiU2hvdyB2ZXJzaW9uIG51bWJlclwiKSx2KHRoaXMscHQsXCJmXCIpLnZlcnNpb24oc3x8dm9pZCAwKSx0aGlzLmJvb2xlYW4odih0aGlzLG10LFwiZlwiKSksdGhpcy5kZXNjcmliZSh2KHRoaXMsbXQsXCJmXCIpLGUpLHRoaXN9d3JhcCh0KXtyZXR1cm4gaChcIjxudW1iZXJ8bnVsbHx1bmRlZmluZWQ+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHYodGhpcyxwdCxcImZcIikud3JhcCh0KSx0aGlzfVsoej1uZXcgV2Vha01hcCxXPW5ldyBXZWFrTWFwLHE9bmV3IFdlYWtNYXAsVT1uZXcgV2Vha01hcCxGPW5ldyBXZWFrTWFwLEw9bmV3IFdlYWtNYXAsVj1uZXcgV2Vha01hcCxHPW5ldyBXZWFrTWFwLFI9bmV3IFdlYWtNYXAsVD1uZXcgV2Vha01hcCxCPW5ldyBXZWFrTWFwLFk9bmV3IFdlYWtNYXAsSz1uZXcgV2Vha01hcCxKPW5ldyBXZWFrTWFwLFo9bmV3IFdlYWtNYXAsWD1uZXcgV2Vha01hcCxRPW5ldyBXZWFrTWFwLHR0PW5ldyBXZWFrTWFwLGV0PW5ldyBXZWFrTWFwLHN0PW5ldyBXZWFrTWFwLGl0PW5ldyBXZWFrTWFwLG50PW5ldyBXZWFrTWFwLHJ0PW5ldyBXZWFrTWFwLG90PW5ldyBXZWFrTWFwLGF0PW5ldyBXZWFrTWFwLGh0PW5ldyBXZWFrTWFwLGx0PW5ldyBXZWFrTWFwLGN0PW5ldyBXZWFrTWFwLGZ0PW5ldyBXZWFrTWFwLGR0PW5ldyBXZWFrTWFwLHV0PW5ldyBXZWFrTWFwLHB0PW5ldyBXZWFrTWFwLGd0PW5ldyBXZWFrTWFwLG10PW5ldyBXZWFrTWFwLHl0PW5ldyBXZWFrTWFwLGJ0KV0odCl7aWYoIXQuX3x8IXRbXCItLVwiXSlyZXR1cm4gdDt0Ll8ucHVzaC5hcHBseSh0Ll8sdFtcIi0tXCJdKTt0cnl7ZGVsZXRlIHRbXCItLVwiXX1jYXRjaCh0KXt9cmV0dXJuIHR9W3Z0XSgpe3JldHVybntsb2c6KC4uLnQpPT57dGhpc1tSdF0oKXx8Y29uc29sZS5sb2coLi4udCksTyh0aGlzLEosITAsXCJmXCIpLHYodGhpcyx0dCxcImZcIikubGVuZ3RoJiZPKHRoaXMsdHQsdih0aGlzLHR0LFwiZlwiKStcIlxcblwiLFwiZlwiKSxPKHRoaXMsdHQsdih0aGlzLHR0LFwiZlwiKSt0LmpvaW4oXCIgXCIpLFwiZlwiKX0sZXJyb3I6KC4uLnQpPT57dGhpc1tSdF0oKXx8Y29uc29sZS5lcnJvciguLi50KSxPKHRoaXMsSiwhMCxcImZcIiksdih0aGlzLHR0LFwiZlwiKS5sZW5ndGgmJk8odGhpcyx0dCx2KHRoaXMsdHQsXCJmXCIpK1wiXFxuXCIsXCJmXCIpLE8odGhpcyx0dCx2KHRoaXMsdHQsXCJmXCIpK3Quam9pbihcIiBcIiksXCJmXCIpfX19W090XSh0KXtwKHYodGhpcyxldCxcImZcIikpLmZvckVhY2goKGU9PntpZihcImNvbmZpZ09iamVjdHNcIj09PWUpcmV0dXJuO2NvbnN0IHM9dih0aGlzLGV0LFwiZlwiKVtlXTtBcnJheS5pc0FycmF5KHMpP3MuaW5jbHVkZXModCkmJnMuc3BsaWNlKHMuaW5kZXhPZih0KSwxKTpcIm9iamVjdFwiPT10eXBlb2YgcyYmZGVsZXRlIHNbdF19KSksZGVsZXRlIHYodGhpcyxwdCxcImZcIikuZ2V0RGVzY3JpcHRpb25zKClbdF19W3d0XSh0LGUscyl7dih0aGlzLFIsXCJmXCIpW3NdfHwodih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmVtaXRXYXJuaW5nKHQsZSksdih0aGlzLFIsXCJmXCIpW3NdPSEwKX1bQ3RdKCl7dih0aGlzLEIsXCJmXCIpLnB1c2goe29wdGlvbnM6dih0aGlzLGV0LFwiZlwiKSxjb25maWdPYmplY3RzOnYodGhpcyxldCxcImZcIikuY29uZmlnT2JqZWN0cy5zbGljZSgwKSxleGl0UHJvY2Vzczp2KHRoaXMsVCxcImZcIiksZ3JvdXBzOnYodGhpcyxLLFwiZlwiKSxzdHJpY3Q6dih0aGlzLGZ0LFwiZlwiKSxzdHJpY3RDb21tYW5kczp2KHRoaXMsZHQsXCJmXCIpLHN0cmljdE9wdGlvbnM6dih0aGlzLHV0LFwiZlwiKSxjb21wbGV0aW9uQ29tbWFuZDp2KHRoaXMsRixcImZcIiksb3V0cHV0OnYodGhpcyx0dCxcImZcIiksZXhpdEVycm9yOnYodGhpcyxWLFwiZlwiKSxoYXNPdXRwdXQ6dih0aGlzLEosXCJmXCIpLHBhcnNlZDp0aGlzLnBhcnNlZCxwYXJzZUZuOnYodGhpcyxudCxcImZcIikscGFyc2VDb250ZXh0OnYodGhpcyxydCxcImZcIil9KSx2KHRoaXMscHQsXCJmXCIpLmZyZWV6ZSgpLHYodGhpcyx5dCxcImZcIikuZnJlZXplKCksdih0aGlzLHosXCJmXCIpLmZyZWV6ZSgpLHYodGhpcyxZLFwiZlwiKS5mcmVlemUoKX1banRdKCl7bGV0IHQsZT1cIlwiO3JldHVybiB0PS9cXGIobm9kZXxpb2pzfGVsZWN0cm9uKShcXC5leGUpPyQvLnRlc3Qodih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmFyZ3YoKVswXSk/dih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmFyZ3YoKS5zbGljZSgxLDIpOnYodGhpcyxjdCxcImZcIikucHJvY2Vzcy5hcmd2KCkuc2xpY2UoMCwxKSxlPXQubWFwKCh0PT57Y29uc3QgZT10aGlzW1l0XSh2KHRoaXMsVyxcImZcIiksdCk7cmV0dXJuIHQubWF0Y2goL14oXFwvfChbYS16QS1aXTopP1xcXFwpLykmJmUubGVuZ3RoPHQubGVuZ3RoP2U6dH0pKS5qb2luKFwiIFwiKS50cmltKCksdih0aGlzLGN0LFwiZlwiKS5nZXRFbnYoXCJfXCIpJiZ2KHRoaXMsY3QsXCJmXCIpLmdldFByb2Nlc3NBcmd2QmluKCk9PT12KHRoaXMsY3QsXCJmXCIpLmdldEVudihcIl9cIikmJihlPXYodGhpcyxjdCxcImZcIikuZ2V0RW52KFwiX1wiKS5yZXBsYWNlKGAke3YodGhpcyxjdCxcImZcIikucGF0aC5kaXJuYW1lKHYodGhpcyxjdCxcImZcIikucHJvY2Vzcy5leGVjUGF0aCgpKX0vYCxcIlwiKSksZX1bTXRdKCl7cmV0dXJuIHYodGhpcyxpdCxcImZcIil9W190XSgpe3JldHVybiB2KHRoaXMsZ3QsXCJmXCIpfVtrdF0oKXtpZighdih0aGlzLEcsXCJmXCIpKXJldHVybjtjb25zdCB0PXYodGhpcyxjdCxcImZcIikuZ2V0RW52KFwiTENfQUxMXCIpfHx2KHRoaXMsY3QsXCJmXCIpLmdldEVudihcIkxDX01FU1NBR0VTXCIpfHx2KHRoaXMsY3QsXCJmXCIpLmdldEVudihcIkxBTkdcIil8fHYodGhpcyxjdCxcImZcIikuZ2V0RW52KFwiTEFOR1VBR0VcIil8fFwiZW5fVVNcIjt0aGlzLmxvY2FsZSh0LnJlcGxhY2UoL1suOl0uKi8sXCJcIikpfVt4dF0oKXtyZXR1cm4gdGhpc1tBdF0oKS52ZXJzaW9ufHxcInVua25vd25cIn1bRXRdKHQpe2NvbnN0IGU9dFtcIi0tXCJdP3RbXCItLVwiXTp0Ll87Zm9yKGxldCB0LHM9MDt2b2lkIDAhPT0odD1lW3NdKTtzKyspdih0aGlzLGN0LFwiZlwiKS5QYXJzZXIubG9va3NMaWtlTnVtYmVyKHQpJiZOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dH1gKSkpJiYoZVtzXT1OdW1iZXIodCkpO3JldHVybiB0fVtBdF0odCl7Y29uc3QgZT10fHxcIipcIjtpZih2KHRoaXMsb3QsXCJmXCIpW2VdKXJldHVybiB2KHRoaXMsb3QsXCJmXCIpW2VdO2xldCBzPXt9O3RyeXtsZXQgZT10fHx2KHRoaXMsY3QsXCJmXCIpLm1haW5GaWxlbmFtZTshdCYmdih0aGlzLGN0LFwiZlwiKS5wYXRoLmV4dG5hbWUoZSkmJihlPXYodGhpcyxjdCxcImZcIikucGF0aC5kaXJuYW1lKGUpKTtjb25zdCBpPXYodGhpcyxjdCxcImZcIikuZmluZFVwKGUsKCh0LGUpPT5lLmluY2x1ZGVzKFwicGFja2FnZS5qc29uXCIpP1wicGFja2FnZS5qc29uXCI6dm9pZCAwKSk7ZChpLHZvaWQgMCx2KHRoaXMsY3QsXCJmXCIpKSxzPUpTT04ucGFyc2Uodih0aGlzLGN0LFwiZlwiKS5yZWFkRmlsZVN5bmMoaSxcInV0ZjhcIikpfWNhdGNoKHQpe31yZXR1cm4gdih0aGlzLG90LFwiZlwiKVtlXT1zfHx7fSx2KHRoaXMsb3QsXCJmXCIpW2VdfVtQdF0odCxlKXsoZT1bXS5jb25jYXQoZSkpLmZvckVhY2goKGU9PntlPXRoaXNbRHRdKGUpLHYodGhpcyxldCxcImZcIilbdF0ucHVzaChlKX0pKX1bU3RdKHQsZSxzLGkpe3RoaXNbSXRdKHQsZSxzLGksKCh0LGUscyk9Pnt2KHRoaXMsZXQsXCJmXCIpW3RdW2VdPXN9KSl9WyR0XSh0LGUscyxpKXt0aGlzW0l0XSh0LGUscyxpLCgodCxlLHMpPT57dih0aGlzLGV0LFwiZlwiKVt0XVtlXT0odih0aGlzLGV0LFwiZlwiKVt0XVtlXXx8W10pLmNvbmNhdChzKX0pKX1bSXRdKHQsZSxzLGksbil7aWYoQXJyYXkuaXNBcnJheShzKSlzLmZvckVhY2goKGU9Pnt0KGUsaSl9KSk7ZWxzZSBpZigodD0+XCJvYmplY3RcIj09dHlwZW9mIHQpKHMpKWZvcihjb25zdCBlIG9mIHAocykpdChlLHNbZV0pO2Vsc2UgbihlLHRoaXNbRHRdKHMpLGkpfVtEdF0odCl7cmV0dXJuXCJfX3Byb3RvX19cIj09PXQ/XCJfX19wcm90b19fX1wiOnR9W050XSh0LGUpe3JldHVybiB0aGlzW1N0XSh0aGlzW050XS5iaW5kKHRoaXMpLFwia2V5XCIsdCxlKSx0aGlzfVtIdF0oKXt2YXIgdCxlLHMsaSxuLHIsbyxhLGgsbCxjLGY7Y29uc3QgdT12KHRoaXMsQixcImZcIikucG9wKCk7bGV0IHA7ZCh1LHZvaWQgMCx2KHRoaXMsY3QsXCJmXCIpKSx0PXRoaXMsZT10aGlzLHM9dGhpcyxpPXRoaXMsbj10aGlzLHI9dGhpcyxvPXRoaXMsYT10aGlzLGg9dGhpcyxsPXRoaXMsYz10aGlzLGY9dGhpcywoe29wdGlvbnM6e3NldCB2YWx1ZShlKXtPKHQsZXQsZSxcImZcIil9fS52YWx1ZSxjb25maWdPYmplY3RzOnAsZXhpdFByb2Nlc3M6e3NldCB2YWx1ZSh0KXtPKGUsVCx0LFwiZlwiKX19LnZhbHVlLGdyb3Vwczp7c2V0IHZhbHVlKHQpe08ocyxLLHQsXCJmXCIpfX0udmFsdWUsb3V0cHV0OntzZXQgdmFsdWUodCl7TyhpLHR0LHQsXCJmXCIpfX0udmFsdWUsZXhpdEVycm9yOntzZXQgdmFsdWUodCl7TyhuLFYsdCxcImZcIil9fS52YWx1ZSxoYXNPdXRwdXQ6e3NldCB2YWx1ZSh0KXtPKHIsSix0LFwiZlwiKX19LnZhbHVlLHBhcnNlZDp0aGlzLnBhcnNlZCxzdHJpY3Q6e3NldCB2YWx1ZSh0KXtPKG8sZnQsdCxcImZcIil9fS52YWx1ZSxzdHJpY3RDb21tYW5kczp7c2V0IHZhbHVlKHQpe08oYSxkdCx0LFwiZlwiKX19LnZhbHVlLHN0cmljdE9wdGlvbnM6e3NldCB2YWx1ZSh0KXtPKGgsdXQsdCxcImZcIil9fS52YWx1ZSxjb21wbGV0aW9uQ29tbWFuZDp7c2V0IHZhbHVlKHQpe08obCxGLHQsXCJmXCIpfX0udmFsdWUscGFyc2VGbjp7c2V0IHZhbHVlKHQpe08oYyxudCx0LFwiZlwiKX19LnZhbHVlLHBhcnNlQ29udGV4dDp7c2V0IHZhbHVlKHQpe08oZixydCx0LFwiZlwiKX19LnZhbHVlfT11KSx2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHM9cCx2KHRoaXMscHQsXCJmXCIpLnVuZnJlZXplKCksdih0aGlzLHl0LFwiZlwiKS51bmZyZWV6ZSgpLHYodGhpcyx6LFwiZlwiKS51bmZyZWV6ZSgpLHYodGhpcyxZLFwiZlwiKS51bmZyZWV6ZSgpfVt6dF0odCxlKXtyZXR1cm4gaihlLChlPT4odChlKSxlKSkpfWdldEludGVybmFsTWV0aG9kcygpe3JldHVybntnZXRDb21tYW5kSW5zdGFuY2U6dGhpc1tXdF0uYmluZCh0aGlzKSxnZXRDb250ZXh0OnRoaXNbcXRdLmJpbmQodGhpcyksZ2V0SGFzT3V0cHV0OnRoaXNbVXRdLmJpbmQodGhpcyksZ2V0TG9nZ2VySW5zdGFuY2U6dGhpc1tGdF0uYmluZCh0aGlzKSxnZXRQYXJzZUNvbnRleHQ6dGhpc1tMdF0uYmluZCh0aGlzKSxnZXRQYXJzZXJDb25maWd1cmF0aW9uOnRoaXNbTXRdLmJpbmQodGhpcyksZ2V0VXNhZ2VDb25maWd1cmF0aW9uOnRoaXNbX3RdLmJpbmQodGhpcyksZ2V0VXNhZ2VJbnN0YW5jZTp0aGlzW1Z0XS5iaW5kKHRoaXMpLGdldFZhbGlkYXRpb25JbnN0YW5jZTp0aGlzW0d0XS5iaW5kKHRoaXMpLGhhc1BhcnNlQ2FsbGJhY2s6dGhpc1tSdF0uYmluZCh0aGlzKSxpc0dsb2JhbENvbnRleHQ6dGhpc1tUdF0uYmluZCh0aGlzKSxwb3N0UHJvY2Vzczp0aGlzW0J0XS5iaW5kKHRoaXMpLHJlc2V0OnRoaXNbS3RdLmJpbmQodGhpcykscnVuVmFsaWRhdGlvbjp0aGlzW1p0XS5iaW5kKHRoaXMpLHJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzOnRoaXNbSnRdLmJpbmQodGhpcyksc2V0SGFzT3V0cHV0OnRoaXNbWHRdLmJpbmQodGhpcyl9fVtXdF0oKXtyZXR1cm4gdih0aGlzLHosXCJmXCIpfVtxdF0oKXtyZXR1cm4gdih0aGlzLHEsXCJmXCIpfVtVdF0oKXtyZXR1cm4gdih0aGlzLEosXCJmXCIpfVtGdF0oKXtyZXR1cm4gdih0aGlzLFEsXCJmXCIpfVtMdF0oKXtyZXR1cm4gdih0aGlzLHJ0LFwiZlwiKXx8e319W1Z0XSgpe3JldHVybiB2KHRoaXMscHQsXCJmXCIpfVtHdF0oKXtyZXR1cm4gdih0aGlzLHl0LFwiZlwiKX1bUnRdKCl7cmV0dXJuISF2KHRoaXMsbnQsXCJmXCIpfVtUdF0oKXtyZXR1cm4gdih0aGlzLFgsXCJmXCIpfVtCdF0odCxlLHMsaSl7aWYocylyZXR1cm4gdDtpZihmKHQpKXJldHVybiB0O2V8fCh0PXRoaXNbYnRdKHQpKTtyZXR1cm4odGhpc1tNdF0oKVtcInBhcnNlLXBvc2l0aW9uYWwtbnVtYmVyc1wiXXx8dm9pZCAwPT09dGhpc1tNdF0oKVtcInBhcnNlLXBvc2l0aW9uYWwtbnVtYmVyc1wiXSkmJih0PXRoaXNbRXRdKHQpKSxpJiYodD1DKHQsdGhpcyx2KHRoaXMsWSxcImZcIikuZ2V0TWlkZGxld2FyZSgpLCExKSksdH1bS3RdKHQ9e30pe08odGhpcyxldCx2KHRoaXMsZXQsXCJmXCIpfHx7fSxcImZcIik7Y29uc3QgZT17fTtlLmxvY2FsPXYodGhpcyxldCxcImZcIikubG9jYWx8fFtdLGUuY29uZmlnT2JqZWN0cz12KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHN8fFtdO2NvbnN0IHM9e307ZS5sb2NhbC5mb3JFYWNoKChlPT57c1tlXT0hMCwodFtlXXx8W10pLmZvckVhY2goKHQ9PntzW3RdPSEwfSkpfSkpLE9iamVjdC5hc3NpZ24odih0aGlzLGF0LFwiZlwiKSxPYmplY3Qua2V5cyh2KHRoaXMsSyxcImZcIikpLnJlZHVjZSgoKHQsZSk9Pntjb25zdCBpPXYodGhpcyxLLFwiZlwiKVtlXS5maWx0ZXIoKHQ9PiEodCBpbiBzKSkpO3JldHVybiBpLmxlbmd0aD4wJiYodFtlXT1pKSx0fSkse30pKSxPKHRoaXMsSyx7fSxcImZcIik7cmV0dXJuW1wiYXJyYXlcIixcImJvb2xlYW5cIixcInN0cmluZ1wiLFwic2tpcFZhbGlkYXRpb25cIixcImNvdW50XCIsXCJub3JtYWxpemVcIixcIm51bWJlclwiLFwiaGlkZGVuT3B0aW9uc1wiXS5mb3JFYWNoKCh0PT57ZVt0XT0odih0aGlzLGV0LFwiZlwiKVt0XXx8W10pLmZpbHRlcigodD0+IXNbdF0pKX0pKSxbXCJuYXJnXCIsXCJrZXlcIixcImFsaWFzXCIsXCJkZWZhdWx0XCIsXCJkZWZhdWx0RGVzY3JpcHRpb25cIixcImNvbmZpZ1wiLFwiY2hvaWNlc1wiLFwiZGVtYW5kZWRPcHRpb25zXCIsXCJkZW1hbmRlZENvbW1hbmRzXCIsXCJkZXByZWNhdGVkT3B0aW9uc1wiXS5mb3JFYWNoKCh0PT57ZVt0XT1nKHYodGhpcyxldCxcImZcIilbdF0sKHQ9PiFzW3RdKSl9KSksZS5lbnZQcmVmaXg9dih0aGlzLGV0LFwiZlwiKS5lbnZQcmVmaXgsTyh0aGlzLGV0LGUsXCJmXCIpLE8odGhpcyxwdCx2KHRoaXMscHQsXCJmXCIpP3YodGhpcyxwdCxcImZcIikucmVzZXQocyk6UCh0aGlzLHYodGhpcyxjdCxcImZcIikpLFwiZlwiKSxPKHRoaXMseXQsdih0aGlzLHl0LFwiZlwiKT92KHRoaXMseXQsXCJmXCIpLnJlc2V0KHMpOmZ1bmN0aW9uKHQsZSxzKXtjb25zdCBpPXMueTE4bi5fXyxuPXMueTE4bi5fX24scj17bm9uT3B0aW9uQ291bnQ6ZnVuY3Rpb24ocyl7Y29uc3QgaT10LmdldERlbWFuZGVkQ29tbWFuZHMoKSxyPXMuXy5sZW5ndGgrKHNbXCItLVwiXT9zW1wiLS1cIl0ubGVuZ3RoOjApLXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLmNvbW1hbmRzLmxlbmd0aDtpLl8mJihyPGkuXy5taW58fHI+aS5fLm1heCkmJihyPGkuXy5taW4/dm9pZCAwIT09aS5fLm1pbk1zZz9lLmZhaWwoaS5fLm1pbk1zZz9pLl8ubWluTXNnLnJlcGxhY2UoL1xcJDAvZyxyLnRvU3RyaW5nKCkpLnJlcGxhY2UoL1xcJDEvLGkuXy5taW4udG9TdHJpbmcoKSk6bnVsbCk6ZS5mYWlsKG4oXCJOb3QgZW5vdWdoIG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG5lZWQgYXQgbGVhc3QgJXNcIixcIk5vdCBlbm91Z2ggbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbmVlZCBhdCBsZWFzdCAlc1wiLHIsci50b1N0cmluZygpLGkuXy5taW4udG9TdHJpbmcoKSkpOnI+aS5fLm1heCYmKHZvaWQgMCE9PWkuXy5tYXhNc2c/ZS5mYWlsKGkuXy5tYXhNc2c/aS5fLm1heE1zZy5yZXBsYWNlKC9cXCQwL2csci50b1N0cmluZygpKS5yZXBsYWNlKC9cXCQxLyxpLl8ubWF4LnRvU3RyaW5nKCkpOm51bGwpOmUuZmFpbChuKFwiVG9vIG1hbnkgbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbWF4aW11bSBvZiAlc1wiLFwiVG9vIG1hbnkgbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbWF4aW11bSBvZiAlc1wiLHIsci50b1N0cmluZygpLGkuXy5tYXgudG9TdHJpbmcoKSkpKSl9LHBvc2l0aW9uYWxDb3VudDpmdW5jdGlvbih0LHMpe3M8dCYmZS5mYWlsKG4oXCJOb3QgZW5vdWdoIG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG5lZWQgYXQgbGVhc3QgJXNcIixcIk5vdCBlbm91Z2ggbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbmVlZCBhdCBsZWFzdCAlc1wiLHMscytcIlwiLHQrXCJcIikpfSxyZXF1aXJlZEFyZ3VtZW50czpmdW5jdGlvbih0LHMpe2xldCBpPW51bGw7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXMocykpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSkmJnZvaWQgMCE9PXRbZV18fChpPWl8fHt9LGlbZV09c1tlXSk7aWYoaSl7Y29uc3QgdD1bXTtmb3IoY29uc3QgZSBvZiBPYmplY3Qua2V5cyhpKSl7Y29uc3Qgcz1pW2VdO3MmJnQuaW5kZXhPZihzKTwwJiZ0LnB1c2gocyl9Y29uc3Qgcz10Lmxlbmd0aD9gXFxuJHt0LmpvaW4oXCJcXG5cIil9YDpcIlwiO2UuZmFpbChuKFwiTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudDogJXNcIixcIk1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnRzOiAlc1wiLE9iamVjdC5rZXlzKGkpLmxlbmd0aCxPYmplY3Qua2V5cyhpKS5qb2luKFwiLCBcIikrcykpfX0sdW5rbm93bkFyZ3VtZW50czpmdW5jdGlvbihzLGksbyxhLGg9ITApe3ZhciBsO2NvbnN0IGM9dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb21tYW5kSW5zdGFuY2UoKS5nZXRDb21tYW5kcygpLGY9W10sZD10LmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKTtpZihPYmplY3Qua2V5cyhzKS5mb3JFYWNoKChlPT57SC5pbmNsdWRlcyhlKXx8T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sZSl8fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlQ29udGV4dCgpLGUpfHxyLmlzVmFsaWRBbmRTb21lQWxpYXNJc05vdE5ldyhlLGkpfHxmLnB1c2goZSl9KSksaCYmKGQuY29tbWFuZHMubGVuZ3RoPjB8fGMubGVuZ3RoPjB8fGEpJiZzLl8uc2xpY2UoZC5jb21tYW5kcy5sZW5ndGgpLmZvckVhY2goKHQ9PntjLmluY2x1ZGVzKFwiXCIrdCl8fGYucHVzaChcIlwiK3QpfSkpLGgpe2NvbnN0IGU9KG51bGw9PT0obD10LmdldERlbWFuZGVkQ29tbWFuZHMoKS5fKXx8dm9pZCAwPT09bD92b2lkIDA6bC5tYXgpfHwwLGk9ZC5jb21tYW5kcy5sZW5ndGgrZTtpPHMuXy5sZW5ndGgmJnMuXy5zbGljZShpKS5mb3JFYWNoKCh0PT57dD1TdHJpbmcodCksZC5jb21tYW5kcy5pbmNsdWRlcyh0KXx8Zi5pbmNsdWRlcyh0KXx8Zi5wdXNoKHQpfSkpfWYubGVuZ3RoJiZlLmZhaWwobihcIlVua25vd24gYXJndW1lbnQ6ICVzXCIsXCJVbmtub3duIGFyZ3VtZW50czogJXNcIixmLmxlbmd0aCxmLm1hcCgodD0+dC50cmltKCk/dDpgXCIke3R9XCJgKSkuam9pbihcIiwgXCIpKSl9LHVua25vd25Db21tYW5kczpmdW5jdGlvbihzKXtjb25zdCBpPXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29tbWFuZEluc3RhbmNlKCkuZ2V0Q29tbWFuZHMoKSxyPVtdLG89dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCk7cmV0dXJuKG8uY29tbWFuZHMubGVuZ3RoPjB8fGkubGVuZ3RoPjApJiZzLl8uc2xpY2Uoby5jb21tYW5kcy5sZW5ndGgpLmZvckVhY2goKHQ9PntpLmluY2x1ZGVzKFwiXCIrdCl8fHIucHVzaChcIlwiK3QpfSkpLHIubGVuZ3RoPjAmJihlLmZhaWwobihcIlVua25vd24gY29tbWFuZDogJXNcIixcIlVua25vd24gY29tbWFuZHM6ICVzXCIsci5sZW5ndGgsci5qb2luKFwiLCBcIikpKSwhMCl9LGlzVmFsaWRBbmRTb21lQWxpYXNJc05vdE5ldzpmdW5jdGlvbihlLHMpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyxlKSlyZXR1cm4hMTtjb25zdCBpPXQucGFyc2VkLm5ld0FsaWFzZXM7cmV0dXJuW2UsLi4uc1tlXV0uc29tZSgodD0+IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLHQpfHwhaVtlXSkpfSxsaW1pdGVkQ2hvaWNlczpmdW5jdGlvbihzKXtjb25zdCBuPXQuZ2V0T3B0aW9ucygpLHI9e307aWYoIU9iamVjdC5rZXlzKG4uY2hvaWNlcykubGVuZ3RoKXJldHVybjtPYmplY3Qua2V5cyhzKS5mb3JFYWNoKCh0PT57LTE9PT1ILmluZGV4T2YodCkmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLmNob2ljZXMsdCkmJltdLmNvbmNhdChzW3RdKS5mb3JFYWNoKChlPT57LTE9PT1uLmNob2ljZXNbdF0uaW5kZXhPZihlKSYmdm9pZCAwIT09ZSYmKHJbdF09KHJbdF18fFtdKS5jb25jYXQoZSkpfSkpfSkpO2NvbnN0IG89T2JqZWN0LmtleXMocik7aWYoIW8ubGVuZ3RoKXJldHVybjtsZXQgYT1pKFwiSW52YWxpZCB2YWx1ZXM6XCIpO28uZm9yRWFjaCgodD0+e2ErPWBcXG4gICR7aShcIkFyZ3VtZW50OiAlcywgR2l2ZW46ICVzLCBDaG9pY2VzOiAlc1wiLHQsZS5zdHJpbmdpZmllZFZhbHVlcyhyW3RdKSxlLnN0cmluZ2lmaWVkVmFsdWVzKG4uY2hvaWNlc1t0XSkpfWB9KSksZS5mYWlsKGEpfX07bGV0IG89e307ZnVuY3Rpb24gYSh0LGUpe2NvbnN0IHM9TnVtYmVyKGUpO3JldHVyblwibnVtYmVyXCI9PXR5cGVvZihlPWlzTmFOKHMpP2U6cyk/ZT10Ll8ubGVuZ3RoPj1lOmUubWF0Y2goL14tLW5vLS4rLyk/KGU9ZS5tYXRjaCgvXi0tbm8tKC4rKS8pWzFdLGU9IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpKTplPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpLGV9ci5pbXBsaWVzPWZ1bmN0aW9uKGUsaSl7aChcIjxzdHJpbmd8b2JqZWN0PiBbYXJyYXl8bnVtYmVyfHN0cmluZ11cIixbZSxpXSxhcmd1bWVudHMubGVuZ3RoKSxcIm9iamVjdFwiPT10eXBlb2YgZT9PYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0PT57ci5pbXBsaWVzKHQsZVt0XSl9KSk6KHQuZ2xvYmFsKGUpLG9bZV18fChvW2VdPVtdKSxBcnJheS5pc0FycmF5KGkpP2kuZm9yRWFjaCgodD0+ci5pbXBsaWVzKGUsdCkpKTooZChpLHZvaWQgMCxzKSxvW2VdLnB1c2goaSkpKX0sci5nZXRJbXBsaWVkPWZ1bmN0aW9uKCl7cmV0dXJuIG99LHIuaW1wbGljYXRpb25zPWZ1bmN0aW9uKHQpe2NvbnN0IHM9W107aWYoT2JqZWN0LmtleXMobykuZm9yRWFjaCgoZT0+e2NvbnN0IGk9ZTsob1tlXXx8W10pLmZvckVhY2goKGU9PntsZXQgbj1pO2NvbnN0IHI9ZTtuPWEodCxuKSxlPWEodCxlKSxuJiYhZSYmcy5wdXNoKGAgJHtpfSAtPiAke3J9YCl9KSl9KSkscy5sZW5ndGgpe2xldCB0PWAke2koXCJJbXBsaWNhdGlvbnMgZmFpbGVkOlwiKX1cXG5gO3MuZm9yRWFjaCgoZT0+e3QrPWV9KSksZS5mYWlsKHQpfX07bGV0IGw9e307ci5jb25mbGljdHM9ZnVuY3Rpb24oZSxzKXtoKFwiPHN0cmluZ3xvYmplY3Q+IFthcnJheXxzdHJpbmddXCIsW2Usc10sYXJndW1lbnRzLmxlbmd0aCksXCJvYmplY3RcIj09dHlwZW9mIGU/T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e3IuY29uZmxpY3RzKHQsZVt0XSl9KSk6KHQuZ2xvYmFsKGUpLGxbZV18fChsW2VdPVtdKSxBcnJheS5pc0FycmF5KHMpP3MuZm9yRWFjaCgodD0+ci5jb25mbGljdHMoZSx0KSkpOmxbZV0ucHVzaChzKSl9LHIuZ2V0Q29uZmxpY3Rpbmc9KCk9Pmwsci5jb25mbGljdGluZz1mdW5jdGlvbihuKXtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKCh0PT57bFt0XSYmbFt0XS5mb3JFYWNoKChzPT57cyYmdm9pZCAwIT09blt0XSYmdm9pZCAwIT09bltzXSYmZS5mYWlsKGkoXCJBcmd1bWVudHMgJXMgYW5kICVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIix0LHMpKX0pKX0pKSx0LmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKVtcInN0cmlwLWRhc2hlZFwiXSYmT2JqZWN0LmtleXMobCkuZm9yRWFjaCgodD0+e2xbdF0uZm9yRWFjaCgocj0+e3ImJnZvaWQgMCE9PW5bcy5QYXJzZXIuY2FtZWxDYXNlKHQpXSYmdm9pZCAwIT09bltzLlBhcnNlci5jYW1lbENhc2UocildJiZlLmZhaWwoaShcIkFyZ3VtZW50cyAlcyBhbmQgJXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiLHQscikpfSkpfSkpfSxyLnJlY29tbWVuZENvbW1hbmRzPWZ1bmN0aW9uKHQscyl7cz1zLnNvcnQoKCh0LGUpPT5lLmxlbmd0aC10Lmxlbmd0aCkpO2xldCBuPW51bGwscj0xLzA7Zm9yKGxldCBlLGk9MDt2b2lkIDAhPT0oZT1zW2ldKTtpKyspe2NvbnN0IHM9Tih0LGUpO3M8PTMmJnM8ciYmKHI9cyxuPWUpfW4mJmUuZmFpbChpKFwiRGlkIHlvdSBtZWFuICVzP1wiLG4pKX0sci5yZXNldD1mdW5jdGlvbih0KXtyZXR1cm4gbz1nKG8sKGU9PiF0W2VdKSksbD1nKGwsKGU9PiF0W2VdKSkscn07Y29uc3QgYz1bXTtyZXR1cm4gci5mcmVlemU9ZnVuY3Rpb24oKXtjLnB1c2goe2ltcGxpZWQ6byxjb25mbGljdGluZzpsfSl9LHIudW5mcmVlemU9ZnVuY3Rpb24oKXtjb25zdCB0PWMucG9wKCk7ZCh0LHZvaWQgMCxzKSwoe2ltcGxpZWQ6byxjb25mbGljdGluZzpsfT10KX0scn0odGhpcyx2KHRoaXMscHQsXCJmXCIpLHYodGhpcyxjdCxcImZcIikpLFwiZlwiKSxPKHRoaXMseix2KHRoaXMseixcImZcIik/dih0aGlzLHosXCJmXCIpLnJlc2V0KCk6ZnVuY3Rpb24odCxlLHMsaSl7cmV0dXJuIG5ldyBfKHQsZSxzLGkpfSh2KHRoaXMscHQsXCJmXCIpLHYodGhpcyx5dCxcImZcIiksdih0aGlzLFksXCJmXCIpLHYodGhpcyxjdCxcImZcIikpLFwiZlwiKSx2KHRoaXMsVSxcImZcIil8fE8odGhpcyxVLGZ1bmN0aW9uKHQsZSxzLGkpe3JldHVybiBuZXcgRCh0LGUscyxpKX0odGhpcyx2KHRoaXMscHQsXCJmXCIpLHYodGhpcyx6LFwiZlwiKSx2KHRoaXMsY3QsXCJmXCIpKSxcImZcIiksdih0aGlzLFksXCJmXCIpLnJlc2V0KCksTyh0aGlzLEYsbnVsbCxcImZcIiksTyh0aGlzLHR0LFwiXCIsXCJmXCIpLE8odGhpcyxWLG51bGwsXCJmXCIpLE8odGhpcyxKLCExLFwiZlwiKSx0aGlzLnBhcnNlZD0hMSx0aGlzfVtZdF0odCxlKXtyZXR1cm4gdih0aGlzLGN0LFwiZlwiKS5wYXRoLnJlbGF0aXZlKHQsZSl9W0p0XSh0LHMsaSxuPTAscj0hMSl7bGV0IG89ISFpfHxyO3Q9dHx8dih0aGlzLGh0LFwiZlwiKSx2KHRoaXMsZXQsXCJmXCIpLl9fPXYodGhpcyxjdCxcImZcIikueTE4bi5fXyx2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ3VyYXRpb249dGhpc1tNdF0oKTtjb25zdCBhPSEhdih0aGlzLGV0LFwiZlwiKS5jb25maWd1cmF0aW9uW1wicG9wdWxhdGUtLVwiXSxoPU9iamVjdC5hc3NpZ24oe30sdih0aGlzLGV0LFwiZlwiKS5jb25maWd1cmF0aW9uLHtcInBvcHVsYXRlLS1cIjohMH0pLGw9dih0aGlzLGN0LFwiZlwiKS5QYXJzZXIuZGV0YWlsZWQodCxPYmplY3QuYXNzaWduKHt9LHYodGhpcyxldCxcImZcIikse2NvbmZpZ3VyYXRpb246e1wicGFyc2UtcG9zaXRpb25hbC1udW1iZXJzXCI6ITEsLi4uaH19KSksYz1PYmplY3QuYXNzaWduKGwuYXJndix2KHRoaXMscnQsXCJmXCIpKTtsZXQgZDtjb25zdCB1PWwuYWxpYXNlcztsZXQgcD0hMSxnPSExO09iamVjdC5rZXlzKGMpLmZvckVhY2goKHQ9Pnt0PT09dih0aGlzLFosXCJmXCIpJiZjW3RdP3A9ITA6dD09PXYodGhpcyxtdCxcImZcIikmJmNbdF0mJihnPSEwKX0pKSxjLiQwPXRoaXMuJDAsdGhpcy5wYXJzZWQ9bCwwPT09biYmdih0aGlzLHB0LFwiZlwiKS5jbGVhckNhY2hlZEhlbHBNZXNzYWdlKCk7dHJ5e2lmKHRoaXNba3RdKCkscylyZXR1cm4gdGhpc1tCdF0oYyxhLCEhaSwhMSk7aWYodih0aGlzLFosXCJmXCIpKXtbdih0aGlzLFosXCJmXCIpXS5jb25jYXQodVt2KHRoaXMsWixcImZcIildfHxbXSkuZmlsdGVyKCh0PT50Lmxlbmd0aD4xKSkuaW5jbHVkZXMoXCJcIitjLl9bYy5fLmxlbmd0aC0xXSkmJihjLl8ucG9wKCkscD0hMCl9Tyh0aGlzLFgsITEsXCJmXCIpO2NvbnN0IGg9dih0aGlzLHosXCJmXCIpLmdldENvbW1hbmRzKCksbT12KHRoaXMsVSxcImZcIikuY29tcGxldGlvbktleSBpbiBjLHk9cHx8bXx8cjtpZihjLl8ubGVuZ3RoKXtpZihoLmxlbmd0aCl7bGV0IHQ7Zm9yKGxldCBlLHM9bnx8MDt2b2lkIDAhPT1jLl9bc107cysrKXtpZihlPVN0cmluZyhjLl9bc10pLGguaW5jbHVkZXMoZSkmJmUhPT12KHRoaXMsRixcImZcIikpe2NvbnN0IHQ9dih0aGlzLHosXCJmXCIpLnJ1bkNvbW1hbmQoZSx0aGlzLGwscysxLHIscHx8Z3x8cik7cmV0dXJuIHRoaXNbQnRdKHQsYSwhIWksITEpfWlmKCF0JiZlIT09dih0aGlzLEYsXCJmXCIpKXt0PWU7YnJlYWt9fSF2KHRoaXMseixcImZcIikuaGFzRGVmYXVsdENvbW1hbmQoKSYmdih0aGlzLGx0LFwiZlwiKSYmdCYmIXkmJnYodGhpcyx5dCxcImZcIikucmVjb21tZW5kQ29tbWFuZHModCxoKX12KHRoaXMsRixcImZcIikmJmMuXy5pbmNsdWRlcyh2KHRoaXMsRixcImZcIikpJiYhbSYmKHYodGhpcyxULFwiZlwiKSYmRSghMCksdGhpcy5zaG93Q29tcGxldGlvblNjcmlwdCgpLHRoaXMuZXhpdCgwKSl9aWYodih0aGlzLHosXCJmXCIpLmhhc0RlZmF1bHRDb21tYW5kKCkmJiF5KXtjb25zdCB0PXYodGhpcyx6LFwiZlwiKS5ydW5Db21tYW5kKG51bGwsdGhpcyxsLDAscixwfHxnfHxyKTtyZXR1cm4gdGhpc1tCdF0odCxhLCEhaSwhMSl9aWYobSl7dih0aGlzLFQsXCJmXCIpJiZFKCEwKTtjb25zdCBzPSh0PVtdLmNvbmNhdCh0KSkuc2xpY2UodC5pbmRleE9mKGAtLSR7dih0aGlzLFUsXCJmXCIpLmNvbXBsZXRpb25LZXl9YCkrMSk7cmV0dXJuIHYodGhpcyxVLFwiZlwiKS5nZXRDb21wbGV0aW9uKHMsKCh0LHMpPT57aWYodCl0aHJvdyBuZXcgZSh0Lm1lc3NhZ2UpOyhzfHxbXSkuZm9yRWFjaCgodD0+e3YodGhpcyxRLFwiZlwiKS5sb2codCl9KSksdGhpcy5leGl0KDApfSkpLHRoaXNbQnRdKGMsIWEsISFpLCExKX1pZih2KHRoaXMsSixcImZcIil8fChwPyh2KHRoaXMsVCxcImZcIikmJkUoITApLG89ITAsdGhpcy5zaG93SGVscChcImxvZ1wiKSx0aGlzLmV4aXQoMCkpOmcmJih2KHRoaXMsVCxcImZcIikmJkUoITApLG89ITAsdih0aGlzLHB0LFwiZlwiKS5zaG93VmVyc2lvbihcImxvZ1wiKSx0aGlzLmV4aXQoMCkpKSwhbyYmdih0aGlzLGV0LFwiZlwiKS5za2lwVmFsaWRhdGlvbi5sZW5ndGg+MCYmKG89T2JqZWN0LmtleXMoYykuc29tZSgodD0+dih0aGlzLGV0LFwiZlwiKS5za2lwVmFsaWRhdGlvbi5pbmRleE9mKHQpPj0wJiYhMD09PWNbdF0pKSksIW8pe2lmKGwuZXJyb3IpdGhyb3cgbmV3IGUobC5lcnJvci5tZXNzYWdlKTtpZighbSl7Y29uc3QgdD10aGlzW1p0XSh1LHt9LGwuZXJyb3IpO2l8fChkPUMoYyx0aGlzLHYodGhpcyxZLFwiZlwiKS5nZXRNaWRkbGV3YXJlKCksITApKSxkPXRoaXNbenRdKHQsbnVsbCE9ZD9kOmMpLGYoZCkmJiFpJiYoZD1kLnRoZW4oKCgpPT5DKGMsdGhpcyx2KHRoaXMsWSxcImZcIikuZ2V0TWlkZGxld2FyZSgpLCExKSkpKX19fWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IHQ7dih0aGlzLHB0LFwiZlwiKS5mYWlsKHQubWVzc2FnZSx0KX1yZXR1cm4gdGhpc1tCdF0obnVsbCE9ZD9kOmMsYSwhIWksITApfVtadF0odCxzLGksbil7Y29uc3Qgcj17Li4udGhpcy5nZXREZW1hbmRlZE9wdGlvbnMoKX07cmV0dXJuIG89PntpZihpKXRocm93IG5ldyBlKGkubWVzc2FnZSk7dih0aGlzLHl0LFwiZlwiKS5ub25PcHRpb25Db3VudChvKSx2KHRoaXMseXQsXCJmXCIpLnJlcXVpcmVkQXJndW1lbnRzKG8scik7bGV0IGE9ITE7dih0aGlzLGR0LFwiZlwiKSYmKGE9dih0aGlzLHl0LFwiZlwiKS51bmtub3duQ29tbWFuZHMobykpLHYodGhpcyxmdCxcImZcIikmJiFhP3YodGhpcyx5dCxcImZcIikudW5rbm93bkFyZ3VtZW50cyhvLHQscywhIW4pOnYodGhpcyx1dCxcImZcIikmJnYodGhpcyx5dCxcImZcIikudW5rbm93bkFyZ3VtZW50cyhvLHQse30sITEsITEpLHYodGhpcyx5dCxcImZcIikubGltaXRlZENob2ljZXMobyksdih0aGlzLHl0LFwiZlwiKS5pbXBsaWNhdGlvbnMobyksdih0aGlzLHl0LFwiZlwiKS5jb25mbGljdGluZyhvKX19W1h0XSgpe08odGhpcyxKLCEwLFwiZlwiKX1bUXRdKHQpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXYodGhpcyxldCxcImZcIikua2V5W3RdPSEwO2Vsc2UgZm9yKGNvbnN0IGUgb2YgdCl2KHRoaXMsZXQsXCJmXCIpLmtleVtlXT0hMH19dmFyIGVlLHNlO2NvbnN0e3JlYWRGaWxlU3luYzppZX09cmVxdWlyZShcImZzXCIpLHtpbnNwZWN0Om5lfT1yZXF1aXJlKFwidXRpbFwiKSx7cmVzb2x2ZTpyZX09cmVxdWlyZShcInBhdGhcIiksb2U9cmVxdWlyZShcInkxOG5cIiksYWU9cmVxdWlyZShcInlhcmdzLXBhcnNlclwiKTt2YXIgaGUsbGU9e2Fzc2VydDp7bm90U3RyaWN0RXF1YWw6dC5ub3RTdHJpY3RFcXVhbCxzdHJpY3RFcXVhbDp0LnN0cmljdEVxdWFsfSxjbGl1aTpyZXF1aXJlKFwiY2xpdWlcIiksZmluZFVwOnJlcXVpcmUoXCJlc2NhbGFkZS9zeW5jXCIpLGdldEVudjp0PT5wcm9jZXNzLmVudlt0XSxnZXRDYWxsZXJGaWxlOnJlcXVpcmUoXCJnZXQtY2FsbGVyLWZpbGVcIiksZ2V0UHJvY2Vzc0FyZ3ZCaW46eSxpbnNwZWN0Om5lLG1haW5GaWxlbmFtZTpudWxsIT09KHNlPW51bGw9PT0oZWU9bnVsbD09PXJlcXVpcmV8fHZvaWQgMD09PXJlcXVpcmU/dm9pZCAwOnJlcXVpcmUubWFpbil8fHZvaWQgMD09PWVlP3ZvaWQgMDplZS5maWxlbmFtZSkmJnZvaWQgMCE9PXNlP3NlOnByb2Nlc3MuY3dkKCksUGFyc2VyOmFlLHBhdGg6cmVxdWlyZShcInBhdGhcIikscHJvY2Vzczp7YXJndjooKT0+cHJvY2Vzcy5hcmd2LGN3ZDpwcm9jZXNzLmN3ZCxlbWl0V2FybmluZzoodCxlKT0+cHJvY2Vzcy5lbWl0V2FybmluZyh0LGUpLGV4ZWNQYXRoOigpPT5wcm9jZXNzLmV4ZWNQYXRoLGV4aXQ6dD0+e3Byb2Nlc3MuZXhpdCh0KX0sbmV4dFRpY2s6cHJvY2Vzcy5uZXh0VGljayxzdGRDb2x1bW5zOnZvaWQgMCE9PXByb2Nlc3Muc3Rkb3V0LmNvbHVtbnM/cHJvY2Vzcy5zdGRvdXQuY29sdW1uczpudWxsfSxyZWFkRmlsZVN5bmM6aWUscmVxdWlyZTpyZXF1aXJlLHJlcXVpcmVEaXJlY3Rvcnk6cmVxdWlyZShcInJlcXVpcmUtZGlyZWN0b3J5XCIpLHN0cmluZ1dpZHRoOnJlcXVpcmUoXCJzdHJpbmctd2lkdGhcIikseTE4bjpvZSh7ZGlyZWN0b3J5OnJlKF9fZGlybmFtZSxcIi4uL2xvY2FsZXNcIiksdXBkYXRlRmlsZXM6ITF9KX07Y29uc3QgY2U9KG51bGw9PT0oaGU9bnVsbD09PXByb2Nlc3N8fHZvaWQgMD09PXByb2Nlc3M/dm9pZCAwOnByb2Nlc3MuZW52KXx8dm9pZCAwPT09aGU/dm9pZCAwOmhlLllBUkdTX01JTl9OT0RFX1ZFUlNJT04pP051bWJlcihwcm9jZXNzLmVudi5ZQVJHU19NSU5fTk9ERV9WRVJTSU9OKToxMjtpZihwcm9jZXNzJiZwcm9jZXNzLnZlcnNpb24pe2lmKE51bWJlcihwcm9jZXNzLnZlcnNpb24ubWF0Y2goL3YoW14uXSspLylbMV0pPGNlKXRocm93IEVycm9yKGB5YXJncyBzdXBwb3J0cyBhIG1pbmltdW0gTm9kZS5qcyB2ZXJzaW9uIG9mICR7Y2V9LiBSZWFkIG91ciB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5OiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3Mjc3VwcG9ydGVkLW5vZGVqcy12ZXJzaW9uc2ApfWNvbnN0IGZlPXJlcXVpcmUoXCJ5YXJncy1wYXJzZXJcIik7dmFyIGRlLHVlPXthcHBseUV4dGVuZHM6bixjanNQbGF0Zm9ybVNoaW06bGUsWWFyZ3M6KGRlPWxlLCh0PVtdLGU9ZGUucHJvY2Vzcy5jd2QoKSxzKT0+e2NvbnN0IGk9bmV3IHRlKHQsZSxzLGRlKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGksXCJhcmd2XCIse2dldDooKT0+aS5wYXJzZSgpLGVudW1lcmFibGU6ITB9KSxpLmhlbHAoKSxpLnZlcnNpb24oKSxpfSksYXJnc2VydDpoLGlzUHJvbWlzZTpmLG9iakZpbHRlcjpnLHBhcnNlQ29tbWFuZDpvLFBhcnNlcjpmZSxwcm9jZXNzQXJndjpiLFlFcnJvcjplfTttb2R1bGUuZXhwb3J0cz11ZTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBzdGRpbiBhcyBpbnB1dCwgc3Rkb3V0IGFzIG91dHB1dCB9IGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSAncmVhZGxpbmUnO1xuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJ3Byb2dyZXNzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncy95YXJncyc7XG5pbXBvcnQgeyByZXNvbHZlQnVpbGRJZCwgQnJvd3NlclBsYXRmb3JtLCB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG5pbXBvcnQgeyBDYWNoZSB9IGZyb20gJy4vQ2FjaGUuanMnO1xuaW1wb3J0IHsgZGV0ZWN0QnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi9kZXRlY3RQbGF0Zm9ybS5qcyc7XG5pbXBvcnQgeyBpbnN0YWxsIH0gZnJvbSAnLi9pbnN0YWxsLmpzJztcbmltcG9ydCB7IGNvbXB1dGVFeGVjdXRhYmxlUGF0aCwgY29tcHV0ZVN5c3RlbUV4ZWN1dGFibGVQYXRoLCBsYXVuY2gsIH0gZnJvbSAnLi9sYXVuY2guanMnO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBDTEkge1xuICAgICNjYWNoZVBhdGg7XG4gICAgI3JsO1xuICAgICNzY3JpcHROYW1lID0gJyc7XG4gICAgI2FsbG93Q2FjaGVQYXRoT3ZlcnJpZGUgPSB0cnVlO1xuICAgICNwaW5uZWRCcm93c2VycztcbiAgICAjcHJlZml4Q29tbWFuZDtcbiAgICBjb25zdHJ1Y3RvcihvcHRzLCBybCkge1xuICAgICAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgICAgIG9wdHMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBvcHRzID0ge1xuICAgICAgICAgICAgICAgIGNhY2hlUGF0aDogb3B0cyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2FjaGVQYXRoID0gb3B0cy5jYWNoZVBhdGggPz8gcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgdGhpcy4jcmwgPSBybDtcbiAgICAgICAgdGhpcy4jc2NyaXB0TmFtZSA9IG9wdHMuc2NyaXB0TmFtZSA/PyAnQHB1cHBldGVlci9icm93c2Vycyc7XG4gICAgICAgIHRoaXMuI2FsbG93Q2FjaGVQYXRoT3ZlcnJpZGUgPSBvcHRzLmFsbG93Q2FjaGVQYXRoT3ZlcnJpZGUgPz8gdHJ1ZTtcbiAgICAgICAgdGhpcy4jcGlubmVkQnJvd3NlcnMgPSBvcHRzLnBpbm5lZEJyb3dzZXJzO1xuICAgICAgICB0aGlzLiNwcmVmaXhDb21tYW5kID0gb3B0cy5wcmVmaXhDb21tYW5kO1xuICAgIH1cbiAgICAjZGVmaW5lQnJvd3NlclBhcmFtZXRlcih5YXJncykge1xuICAgICAgICB5YXJncy5wb3NpdGlvbmFsKCdicm93c2VyJywge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXaGljaCBicm93c2VyIHRvIGluc3RhbGwgPGJyb3dzZXI+W0A8YnVpbGRJZHxsYXRlc3Q+XS4gYGxhdGVzdGAgd2lsbCB0cnkgdG8gZmluZCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZC4gYGJ1aWxkSWRgIGlzIGEgYnJvd3Nlci1zcGVjaWZpYyBpZGVudGlmaWVyIHN1Y2ggYXMgYSB2ZXJzaW9uIG9yIGEgcmV2aXNpb24uJyxcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgY29lcmNlOiAob3B0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy4jcGFyc2VCcm93c2VyKG9wdCksXG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IHRoaXMuI3BhcnNlQnVpbGRJZChvcHQpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgI2RlZmluZVBsYXRmb3JtUGFyYW1ldGVyKHlhcmdzKSB7XG4gICAgICAgIHlhcmdzLm9wdGlvbigncGxhdGZvcm0nLCB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2M6ICdQbGF0Zm9ybSB0aGF0IHRoZSBiaW5hcnkgbmVlZHMgdG8gYmUgY29tcGF0aWJsZSB3aXRoLicsXG4gICAgICAgICAgICBjaG9pY2VzOiBPYmplY3QudmFsdWVzKEJyb3dzZXJQbGF0Zm9ybSksXG4gICAgICAgICAgICBkZWZhdWx0RGVzY3JpcHRpb246ICdBdXRvLWRldGVjdGVkJyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICNkZWZpbmVQYXRoUGFyYW1ldGVyKHlhcmdzLCByZXF1aXJlZCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghdGhpcy4jYWxsb3dDYWNoZVBhdGhPdmVycmlkZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHlhcmdzLm9wdGlvbigncGF0aCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzYzogJ1BhdGggdG8gdGhlIHJvb3QgZm9sZGVyIGZvciB0aGUgYnJvd3NlciBkb3dubG9hZHMgYW5kIGluc3RhbGxhdGlvbi4gVGhlIGluc3RhbGxhdGlvbiBmb2xkZXIgc3RydWN0dXJlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY2FjaGUgc3RydWN0dXJlIHVzZWQgYnkgUHVwcGV0ZWVyLicsXG4gICAgICAgICAgICBkZWZhdWx0RGVzY3JpcHRpb246ICdDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICAgICAgICAgIC4uLihyZXF1aXJlZCA/IHt9IDogeyBkZWZhdWx0OiBwcm9jZXNzLmN3ZCgpIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB5YXJncy5kZW1hbmRPcHRpb24oJ3BhdGgnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBydW4oYXJndikge1xuICAgICAgICBjb25zdCB5YXJnc0luc3RhbmNlID0geWFyZ3MoaGlkZUJpbihhcmd2KSk7XG4gICAgICAgIGxldCB0YXJnZXQgPSB5YXJnc0luc3RhbmNlLnNjcmlwdE5hbWUodGhpcy4jc2NyaXB0TmFtZSk7XG4gICAgICAgIGlmICh0aGlzLiNwcmVmaXhDb21tYW5kKSB7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuY29tbWFuZCh0aGlzLiNwcmVmaXhDb21tYW5kLmNtZCwgdGhpcy4jcHJlZml4Q29tbWFuZC5kZXNjcmlwdGlvbiwgeWFyZ3MgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNidWlsZCh5YXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuI2J1aWxkKHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGFyZ2V0XG4gICAgICAgICAgICAuZGVtYW5kQ29tbWFuZCgxKVxuICAgICAgICAgICAgLmhlbHAoKVxuICAgICAgICAgICAgLndyYXAoTWF0aC5taW4oMTIwLCB5YXJnc0luc3RhbmNlLnRlcm1pbmFsV2lkdGgoKSkpXG4gICAgICAgICAgICAucGFyc2UoKTtcbiAgICB9XG4gICAgI2J1aWxkKHlhcmdzKSB7XG4gICAgICAgIGNvbnN0IGxhdGVzdE9yUGlubmVkID0gdGhpcy4jcGlubmVkQnJvd3NlcnMgPyAncGlubmVkJyA6ICdsYXRlc3QnO1xuICAgICAgICByZXR1cm4geWFyZ3NcbiAgICAgICAgICAgIC5jb21tYW5kKCdpbnN0YWxsIDxicm93c2VyPicsICdEb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgc3BlY2lmaWVkIGJyb3dzZXIuIElmIHN1Y2Nlc3NmdWwsIHRoZSBjb21tYW5kIG91dHB1dHMgdGhlIGFjdHVhbCBicm93c2VyIGJ1aWxkSWQgdGhhdCB3YXMgaW5zdGFsbGVkIGFuZCB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgYnJvd3NlciBleGVjdXRhYmxlIChmb3JtYXQ6IDxicm93c2VyPkA8YnVpbGRJRD4gPHBhdGg+KS4nLCB5YXJncyA9PiB7XG4gICAgICAgICAgICB0aGlzLiNkZWZpbmVCcm93c2VyUGFyYW1ldGVyKHlhcmdzKTtcbiAgICAgICAgICAgIHRoaXMuI2RlZmluZVBsYXRmb3JtUGFyYW1ldGVyKHlhcmdzKTtcbiAgICAgICAgICAgIHRoaXMuI2RlZmluZVBhdGhQYXJhbWV0ZXIoeWFyZ3MpO1xuICAgICAgICAgICAgeWFyZ3Mub3B0aW9uKCdiYXNlLXVybCcsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZXNjOiAnQmFzZSBVUkwgdG8gZG93bmxvYWQgZnJvbScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lJywgYEluc3RhbGwgdGhlICR7bGF0ZXN0T3JQaW5uZWR9IGF2YWlsYWJsZSBidWlsZCBvZiB0aGUgQ2hyb21lIGJyb3dzZXIuYCk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZUBsYXRlc3QnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgdGhlIENocm9tZSBicm93c2VyLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBjaHJvbWVAc3RhYmxlJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBhdmFpbGFibGUgYnVpbGQgZm9yIHRoZSBDaHJvbWUgYnJvd3NlciBmcm9tIHRoZSBzdGFibGUgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lQGJldGEnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgdGhlIENocm9tZSBicm93c2VyIGZyb20gdGhlIGJldGEgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lQGRldicsICdJbnN0YWxsIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGJ1aWxkIGZvciB0aGUgQ2hyb21lIGJyb3dzZXIgZnJvbSB0aGUgZGV2IGNoYW5uZWwuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZUBjYW5hcnknLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgdGhlIENocm9tZSBDYW5hcnkgYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lQDExNScsICdJbnN0YWxsIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGJ1aWxkIGZvciBDaHJvbWUgMTE1LicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBjaHJvbWVkcml2ZXJAY2FuYXJ5JywgJ0luc3RhbGwgdGhlIGxhdGVzdCBhdmFpbGFibGUgYnVpbGQgZm9yIENocm9tZURyaXZlciBDYW5hcnkuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZWRyaXZlckAxMTUnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgQ2hyb21lRHJpdmVyIDExNS4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lZHJpdmVyQDExNS4wLjU3OTAnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBwYXRjaCAoMTE1LjAuNTc5MC5YKSBidWlsZCBmb3IgQ2hyb21lRHJpdmVyLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBjaHJvbWUtaGVhZGxlc3Mtc2hlbGwnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBjaHJvbWUtaGVhZGxlc3Mtc2hlbGwgYnVpbGQuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZS1oZWFkbGVzcy1zaGVsbEBiZXRhJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBhdmFpbGFibGUgY2hyb21lLWhlYWRsZXNzLXNoZWxsIGJ1aWxkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEJldGEgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lLWhlYWRsZXNzLXNoZWxsQDExOCcsICdJbnN0YWxsIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGNocm9tZS1oZWFkbGVzcy1zaGVsbCAxMTggYnVpbGQuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9taXVtQDEwODMwODAnLCAnSW5zdGFsbCB0aGUgcmV2aXNpb24gMTA4MzA4MCBvZiB0aGUgQ2hyb21pdW0gYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveCcsICdJbnN0YWxsIHRoZSBsYXRlc3QgbmlnaHRseSBhdmFpbGFibGUgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveEBzdGFibGUnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IHN0YWJsZSBidWlsZCBvZiB0aGUgRmlyZWZveCBicm93c2VyLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBmaXJlZm94QGJldGEnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGJldGEgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveEBkZXZlZGl0aW9uJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBkZXZlZGl0aW9uIGJ1aWxkIG9mIHRoZSBGaXJlZm94IGJyb3dzZXIuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGZpcmVmb3hAZXNyJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBFU1IgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveEBuaWdodGx5JywgJ0luc3RhbGwgdGhlIGxhdGVzdCBuaWdodGx5IGJ1aWxkIG9mIHRoZSBGaXJlZm94IGJyb3dzZXIuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGZpcmVmb3hAc3RhYmxlXzExMS4wLjEnLCAnSW5zdGFsbCBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveCAtLXBsYXRmb3JtIG1hYycsICdJbnN0YWxsIHRoZSBsYXRlc3QgTWFjIChJbnRlbCkgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNhbGxvd0NhY2hlUGF0aE92ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBmaXJlZm94IC0tcGF0aCAvdG1wL215LWJyb3dzZXItY2FjaGUnLCAnSW5zdGFsbCB0byB0aGUgc3BlY2lmaWVkIGNhY2hlIGRpcmVjdG9yeS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgYXN5bmMgKGFyZ3YpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBhcmd2O1xuICAgICAgICAgICAgYXJncy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgICAgICAgICBpZiAoIWFyZ3MucGxhdGZvcm0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZXNvbHZlIHRoZSBjdXJyZW50IHBsYXRmb3JtYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJncy5icm93c2VyLmJ1aWxkSWQgPT09ICdwaW5uZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGlubmVkVmVyc2lvbiA9IHRoaXMuI3Bpbm5lZEJyb3dzZXJzPy5bYXJncy5icm93c2VyLm5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICghcGlubmVkVmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBpbm5lZCB2ZXJzaW9uIGZvdW5kIGZvciAke2FyZ3MuYnJvd3Nlci5uYW1lfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhcmdzLmJyb3dzZXIuYnVpbGRJZCA9IHBpbm5lZFZlcnNpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEJ1aWxkSWQgPSBhcmdzLmJyb3dzZXIuYnVpbGRJZDtcbiAgICAgICAgICAgIGFyZ3MuYnJvd3Nlci5idWlsZElkID0gYXdhaXQgcmVzb2x2ZUJ1aWxkSWQoYXJncy5icm93c2VyLm5hbWUsIGFyZ3MucGxhdGZvcm0sIGFyZ3MuYnJvd3Nlci5idWlsZElkKTtcbiAgICAgICAgICAgIGF3YWl0IGluc3RhbGwoe1xuICAgICAgICAgICAgICAgIGJyb3dzZXI6IGFyZ3MuYnJvd3Nlci5uYW1lLFxuICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBhcmdzLnBsYXRmb3JtLFxuICAgICAgICAgICAgICAgIGNhY2hlRGlyOiBhcmdzLnBhdGggPz8gdGhpcy4jY2FjaGVQYXRoLFxuICAgICAgICAgICAgICAgIGRvd25sb2FkUHJvZ3Jlc3NDYWxsYmFjazogbWFrZVByb2dyZXNzQ2FsbGJhY2soYXJncy5icm93c2VyLm5hbWUsIGFyZ3MuYnJvd3Nlci5idWlsZElkKSxcbiAgICAgICAgICAgICAgICBiYXNlVXJsOiBhcmdzLmJhc2VVcmwsXG4gICAgICAgICAgICAgICAgYnVpbGRJZEFsaWFzOiBvcmlnaW5hbEJ1aWxkSWQgIT09IGFyZ3MuYnJvd3Nlci5idWlsZElkXG4gICAgICAgICAgICAgICAgICAgID8gb3JpZ2luYWxCdWlsZElkXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJHthcmdzLmJyb3dzZXIubmFtZX1AJHthcmdzLmJyb3dzZXIuYnVpbGRJZH0gJHtjb21wdXRlRXhlY3V0YWJsZVBhdGgoe1xuICAgICAgICAgICAgICAgIGJyb3dzZXI6IGFyZ3MuYnJvd3Nlci5uYW1lLFxuICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgIGNhY2hlRGlyOiBhcmdzLnBhdGggPz8gdGhpcy4jY2FjaGVQYXRoLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBhcmdzLnBsYXRmb3JtLFxuICAgICAgICAgICAgfSl9YCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY29tbWFuZCgnbGF1bmNoIDxicm93c2VyPicsICdMYXVuY2ggdGhlIHNwZWNpZmllZCBicm93c2VyJywgeWFyZ3MgPT4ge1xuICAgICAgICAgICAgdGhpcy4jZGVmaW5lQnJvd3NlclBhcmFtZXRlcih5YXJncyk7XG4gICAgICAgICAgICB0aGlzLiNkZWZpbmVQbGF0Zm9ybVBhcmFtZXRlcih5YXJncyk7XG4gICAgICAgICAgICB0aGlzLiNkZWZpbmVQYXRoUGFyYW1ldGVyKHlhcmdzKTtcbiAgICAgICAgICAgIHlhcmdzLm9wdGlvbignZGV0YWNoZWQnLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgIGRlc2M6ICdEZXRhY2ggdGhlIGNoaWxkIHByb2Nlc3MuJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgeWFyZ3Mub3B0aW9uKCdzeXN0ZW0nLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgIGRlc2M6ICdTZWFyY2ggZm9yIGEgYnJvd3NlciBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBpbnN0ZWFkIG9mIHRoZSBjYWNoZSBmb2xkZXIuJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgbGF1bmNoIGNocm9tZUAxMTUuMC41NzkwLjE3MCcsICdMYXVuY2ggQ2hyb21lIDExNS4wLjU3OTAuMTcwJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBsYXVuY2ggZmlyZWZveEAxMTIuMGExJywgJ0xhdW5jaCB0aGUgRmlyZWZveCBicm93c2VyIGlkZW50aWZpZWQgYnkgdGhlIG1pbGVzdG9uZSAxMTIuMGExLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgbGF1bmNoIGNocm9tZUAxMTUuMC41NzkwLjE3MCAtLWRldGFjaGVkJywgJ0xhdW5jaCB0aGUgYnJvd3NlciBidXQgZGV0YWNoIHRoZSBzdWItcHJvY2Vzc2VzLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgbGF1bmNoIGNocm9tZUBjYW5hcnkgLS1zeXN0ZW0nLCAnVHJ5IHRvIGxvY2F0ZSB0aGUgQ2FuYXJ5IGJ1aWxkIG9mIENocm9tZSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBhbmQgbGF1bmNoIGl0LicpO1xuICAgICAgICB9LCBhc3luYyAoYXJndikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGFyZ3Y7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRhYmxlUGF0aCA9IGFyZ3Muc3lzdGVtXG4gICAgICAgICAgICAgICAgPyBjb21wdXRlU3lzdGVtRXhlY3V0YWJsZVBhdGgoe1xuICAgICAgICAgICAgICAgICAgICBicm93c2VyOiBhcmdzLmJyb3dzZXIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdGhyb3cgYW4gZXJyb3IgaWYgbm90IGEgQ2hyb21lUmVsZWFzZUNoYW5uZWwgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybTogYXJncy5wbGF0Zm9ybSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogY29tcHV0ZUV4ZWN1dGFibGVQYXRoKHtcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlcjogYXJncy5icm93c2VyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgICAgICBjYWNoZURpcjogYXJncy5wYXRoID8/IHRoaXMuI2NhY2hlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06IGFyZ3MucGxhdGZvcm0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsYXVuY2goe1xuICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVQYXRoLFxuICAgICAgICAgICAgICAgIGRldGFjaGVkOiBhcmdzLmRldGFjaGVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY29tbWFuZCgnY2xlYXInLCB0aGlzLiNhbGxvd0NhY2hlUGF0aE92ZXJyaWRlXG4gICAgICAgICAgICA/ICdSZW1vdmVzIGFsbCBpbnN0YWxsZWQgYnJvd3NlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIGNhY2hlIGRpcmVjdG9yeSdcbiAgICAgICAgICAgIDogYFJlbW92ZXMgYWxsIGluc3RhbGxlZCBicm93c2VycyBmcm9tICR7dGhpcy4jY2FjaGVQYXRofWAsIHlhcmdzID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2RlZmluZVBhdGhQYXJhbWV0ZXIoeWFyZ3MsIHRydWUpO1xuICAgICAgICB9LCBhc3luYyAoYXJndikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGFyZ3Y7XG4gICAgICAgICAgICBjb25zdCBjYWNoZURpciA9IGFyZ3MucGF0aCA/PyB0aGlzLiNjYWNoZVBhdGg7XG4gICAgICAgICAgICBjb25zdCBybCA9IHRoaXMuI3JsID8/IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7IGlucHV0LCBvdXRwdXQgfSk7XG4gICAgICAgICAgICBybC5xdWVzdGlvbihgRG8geW91IHdhbnQgdG8gcGVybWFuZW50bHkgYW5kIHJlY3Vyc2l2ZWx5IGRlbGV0ZSB0aGUgY29udGVudCBvZiAke2NhY2hlRGlyfSAoeWVzL05vKT8gYCwgYW5zd2VyID0+IHtcbiAgICAgICAgICAgICAgICBybC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGlmICghWyd5JywgJ3llcyddLmluY2x1ZGVzKGFuc3dlci50b0xvd2VyQ2FzZSgpLnRyaW0oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NhbmNlbGxlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZShjYWNoZURpcik7XG4gICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtjYWNoZURpcn0gY2xlYXJlZC5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmRlbWFuZENvbW1hbmQoMSlcbiAgICAgICAgICAgIC5oZWxwKCk7XG4gICAgfVxuICAgICNwYXJzZUJyb3dzZXIodmVyc2lvbikge1xuICAgICAgICByZXR1cm4gdmVyc2lvbi5zcGxpdCgnQCcpLnNoaWZ0KCk7XG4gICAgfVxuICAgICNwYXJzZUJ1aWxkSWQodmVyc2lvbikge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHZlcnNpb24uc3BsaXQoJ0AnKTtcbiAgICAgICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMlxuICAgICAgICAgICAgPyBwYXJ0c1sxXVxuICAgICAgICAgICAgOiB0aGlzLiNwaW5uZWRCcm93c2Vyc1xuICAgICAgICAgICAgICAgID8gJ3Bpbm5lZCdcbiAgICAgICAgICAgICAgICA6ICdsYXRlc3QnO1xuICAgIH1cbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVByb2dyZXNzQ2FsbGJhY2soYnJvd3NlciwgYnVpbGRJZCkge1xuICAgIGxldCBwcm9ncmVzc0JhcjtcbiAgICBsZXQgbGFzdERvd25sb2FkZWRCeXRlcyA9IDA7XG4gICAgcmV0dXJuIChkb3dubG9hZGVkQnl0ZXMsIHRvdGFsQnl0ZXMpID0+IHtcbiAgICAgICAgaWYgKCFwcm9ncmVzc0Jhcikge1xuICAgICAgICAgICAgcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoYERvd25sb2FkaW5nICR7YnJvd3Nlcn0gJHtidWlsZElkfSAtICR7dG9NZWdhYnl0ZXModG90YWxCeXRlcyl9IFs6YmFyXSA6cGVyY2VudCA6ZXRhcyBgLCB7XG4gICAgICAgICAgICAgICAgY29tcGxldGU6ICc9JyxcbiAgICAgICAgICAgICAgICBpbmNvbXBsZXRlOiAnICcsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwLFxuICAgICAgICAgICAgICAgIHRvdGFsOiB0b3RhbEJ5dGVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsdGEgPSBkb3dubG9hZGVkQnl0ZXMgLSBsYXN0RG93bmxvYWRlZEJ5dGVzO1xuICAgICAgICBsYXN0RG93bmxvYWRlZEJ5dGVzID0gZG93bmxvYWRlZEJ5dGVzO1xuICAgICAgICBwcm9ncmVzc0Jhci50aWNrKGRlbHRhKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gdG9NZWdhYnl0ZXMoYnl0ZXMpIHtcbiAgICBjb25zdCBtYiA9IGJ5dGVzIC8gMTAwMCAvIDEwMDA7XG4gICAgcmV0dXJuIGAke01hdGgucm91bmQobWIgKiAxMCkgLyAxMH0gTUJgO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q0xJLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IEJyb3dzZXIsIGV4ZWN1dGFibGVQYXRoQnlCcm93c2VyLCBnZXRWZXJzaW9uQ29tcGFyYXRvciwgfSBmcm9tICcuL2Jyb3dzZXItZGF0YS9icm93c2VyLWRhdGEuanMnO1xuaW1wb3J0IHsgZGV0ZWN0QnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi9kZXRlY3RQbGF0Zm9ybS5qcyc7XG5jb25zdCBkZWJ1Z0NhY2hlID0gZGVidWcoJ3B1cHBldGVlcjpicm93c2VyczpjYWNoZScpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnN0YWxsZWRCcm93c2VyIHtcbiAgICBicm93c2VyO1xuICAgIGJ1aWxkSWQ7XG4gICAgcGxhdGZvcm07XG4gICAgZXhlY3V0YWJsZVBhdGg7XG4gICAgI2NhY2hlO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhY2hlLCBicm93c2VyLCBidWlsZElkLCBwbGF0Zm9ybSkge1xuICAgICAgICB0aGlzLiNjYWNoZSA9IGNhY2hlO1xuICAgICAgICB0aGlzLmJyb3dzZXIgPSBicm93c2VyO1xuICAgICAgICB0aGlzLmJ1aWxkSWQgPSBidWlsZElkO1xuICAgICAgICB0aGlzLnBsYXRmb3JtID0gcGxhdGZvcm07XG4gICAgICAgIHRoaXMuZXhlY3V0YWJsZVBhdGggPSBjYWNoZS5jb21wdXRlRXhlY3V0YWJsZVBhdGgoe1xuICAgICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgICAgIGJ1aWxkSWQsXG4gICAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlIGluc3RhbGxhdGlvbiBmb2xkZXIuIFVzZVxuICAgICAqIHtAbGluayBjb21wdXRlRXhlY3V0YWJsZVBhdGh9IHRvIGdldCB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSBiaW5hcnkuXG4gICAgICovXG4gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWNoZS5pbnN0YWxsYXRpb25EaXIodGhpcy5icm93c2VyLCB0aGlzLnBsYXRmb3JtLCB0aGlzLmJ1aWxkSWQpO1xuICAgIH1cbiAgICByZWFkTWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWNoZS5yZWFkTWV0YWRhdGEodGhpcy5icm93c2VyKTtcbiAgICB9XG4gICAgd3JpdGVNZXRhZGF0YShtZXRhZGF0YSkge1xuICAgICAgICB0aGlzLiNjYWNoZS53cml0ZU1ldGFkYXRhKHRoaXMuYnJvd3NlciwgbWV0YWRhdGEpO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIGNhY2hlIHVzZWQgYnkgUHVwcGV0ZWVyIHJlbGllcyBvbiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqXG4gKiAtIHJvb3REaXJcbiAqICAgLS0gPGJyb3dzZXIxPiB8IGJyb3dzZXJSb290KGJyb3dzZXIxKVxuICogICAtLS0tIDxwbGF0Zm9ybT4tPGJ1aWxkSWQ+IHwgaW5zdGFsbGF0aW9uRGlyKClcbiAqICAgLS0tLS0tIHRoZSBicm93c2VyLXBsYXRmb3JtLWJ1aWxkSWRcbiAqICAgLS0tLS0tIHNwZWNpZmljIHN0cnVjdHVyZS5cbiAqICAgLS0gPGJyb3dzZXIyPiB8IGJyb3dzZXJSb290KGJyb3dzZXIyKVxuICogICAtLS0tIDxwbGF0Zm9ybT4tPGJ1aWxkSWQ+IHwgaW5zdGFsbGF0aW9uRGlyKClcbiAqICAgLS0tLS0tIHRoZSBicm93c2VyLXBsYXRmb3JtLWJ1aWxkSWRcbiAqICAgLS0tLS0tIHNwZWNpZmljIHN0cnVjdHVyZS5cbiAqICAgQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWNoZSB7XG4gICAgI3Jvb3REaXI7XG4gICAgY29uc3RydWN0b3Iocm9vdERpcikge1xuICAgICAgICB0aGlzLiNyb290RGlyID0gcm9vdERpcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0IHJvb3REaXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyb290RGlyO1xuICAgIH1cbiAgICBicm93c2VyUm9vdChicm93c2VyKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy4jcm9vdERpciwgYnJvd3Nlcik7XG4gICAgfVxuICAgIG1ldGFkYXRhRmlsZShicm93c2VyKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5icm93c2VyUm9vdChicm93c2VyKSwgJy5tZXRhZGF0YScpO1xuICAgIH1cbiAgICByZWFkTWV0YWRhdGEoYnJvd3Nlcikge1xuICAgICAgICBjb25zdCBtZXRhdGFkYVBhdGggPSB0aGlzLm1ldGFkYXRhRmlsZShicm93c2VyKTtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG1ldGF0YWRhUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGFsaWFzZXM6IHt9IH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogYWRkIHR5cGUtc2FmZSBwYXJzaW5nLlxuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWV0YXRhZGFQYXRoLCAndXRmOCcpKTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcubWV0YWRhdGEgaXMgbm90IGFuIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICB3cml0ZU1ldGFkYXRhKGJyb3dzZXIsIG1ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IG1ldGF0YWRhUGF0aCA9IHRoaXMubWV0YWRhdGFGaWxlKGJyb3dzZXIpO1xuICAgICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG1ldGF0YWRhUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG1ldGF0YWRhUGF0aCwgSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEsIG51bGwsIDIpKTtcbiAgICB9XG4gICAgcmVzb2x2ZUFsaWFzKGJyb3dzZXIsIGFsaWFzKSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5yZWFkTWV0YWRhdGEoYnJvd3Nlcik7XG4gICAgICAgIGlmIChhbGlhcyA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKG1ldGFkYXRhLmFsaWFzZXMgfHwge30pXG4gICAgICAgICAgICAgICAgLnNvcnQoZ2V0VmVyc2lvbkNvbXBhcmF0b3IoYnJvd3NlcikpXG4gICAgICAgICAgICAgICAgLmF0KC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0YWRhdGEuYWxpYXNlc1thbGlhc107XG4gICAgfVxuICAgIGluc3RhbGxhdGlvbkRpcihicm93c2VyLCBwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgICAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuYnJvd3NlclJvb3QoYnJvd3NlciksIGAke3BsYXRmb3JtfS0ke2J1aWxkSWR9YCk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICBmcy5ybVN5bmModGhpcy4jcm9vdERpciwge1xuICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgICBtYXhSZXRyaWVzOiAxMCxcbiAgICAgICAgICAgIHJldHJ5RGVsYXk6IDUwMCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVuaW5zdGFsbChicm93c2VyLCBwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMucmVhZE1ldGFkYXRhKGJyb3dzZXIpO1xuICAgICAgICBmb3IgKGNvbnN0IGFsaWFzIG9mIE9iamVjdC5rZXlzKG1ldGFkYXRhLmFsaWFzZXMpKSB7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEuYWxpYXNlc1thbGlhc10gPT09IGJ1aWxkSWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWxpYXNlc1thbGlhc107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnMucm1TeW5jKHRoaXMuaW5zdGFsbGF0aW9uRGlyKGJyb3dzZXIsIHBsYXRmb3JtLCBidWlsZElkKSwge1xuICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgICBtYXhSZXRyaWVzOiAxMCxcbiAgICAgICAgICAgIHJldHJ5RGVsYXk6IDUwMCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldEluc3RhbGxlZEJyb3dzZXJzKCkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy4jcm9vdERpcikpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuI3Jvb3REaXIpO1xuICAgICAgICBjb25zdCBicm93c2VycyA9IHR5cGVzLmZpbHRlcigodCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoQnJvd3NlcikuaW5jbHVkZXModCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYnJvd3NlcnMuZmxhdE1hcChicm93c2VyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmModGhpcy5icm93c2VyUm9vdChicm93c2VyKSk7XG4gICAgICAgICAgICByZXR1cm4gZmlsZXNcbiAgICAgICAgICAgICAgICAubWFwKGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlRm9sZGVyUGF0aChwYXRoLmpvaW4odGhpcy5icm93c2VyUm9vdChicm93c2VyKSwgZmlsZSkpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluc3RhbGxlZEJyb3dzZXIodGhpcywgYnJvd3NlciwgcmVzdWx0LmJ1aWxkSWQsIHJlc3VsdC5wbGF0Zm9ybSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSAhPT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29tcHV0ZUV4ZWN1dGFibGVQYXRoKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgICAgIGlmICghb3B0aW9ucy5wbGF0Zm9ybSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZG93bmxvYWQgYSBiaW5hcnkgZm9yIHRoZSBwcm92aWRlZCBwbGF0Zm9ybTogJHtvcy5wbGF0Zm9ybSgpfSAoJHtvcy5hcmNoKCl9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvcHRpb25zLmJ1aWxkSWQgPVxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZUFsaWFzKG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5idWlsZElkKSA/PyBvcHRpb25zLmJ1aWxkSWQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgZGVidWdDYWNoZSgnY291bGQgbm90IHJlYWQgLm1ldGFkYXRhIGZpbGUgZm9yIHRoZSBicm93c2VyJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5zdGFsbGF0aW9uRGlyID0gdGhpcy5pbnN0YWxsYXRpb25EaXIob3B0aW9ucy5icm93c2VyLCBvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQpO1xuICAgICAgICByZXR1cm4gcGF0aC5qb2luKGluc3RhbGxhdGlvbkRpciwgZXhlY3V0YWJsZVBhdGhCeUJyb3dzZXJbb3B0aW9ucy5icm93c2VyXShvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZUZvbGRlclBhdGgoZm9sZGVyUGF0aCkge1xuICAgIGNvbnN0IG5hbWUgPSBwYXRoLmJhc2VuYW1lKGZvbGRlclBhdGgpO1xuICAgIGNvbnN0IHNwbGl0cyA9IG5hbWUuc3BsaXQoJy0nKTtcbiAgICBpZiAoc3BsaXRzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFtwbGF0Zm9ybSwgYnVpbGRJZF0gPSBzcGxpdHM7XG4gICAgaWYgKCFidWlsZElkIHx8ICFwbGF0Zm9ybSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB7IHBsYXRmb3JtLCBidWlsZElkIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYWNoZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0ICogYXMgY2hyb21lSGVhZGxlc3NTaGVsbCBmcm9tICcuL2Nocm9tZS1oZWFkbGVzcy1zaGVsbC5qcyc7XG5pbXBvcnQgKiBhcyBjaHJvbWUgZnJvbSAnLi9jaHJvbWUuanMnO1xuaW1wb3J0ICogYXMgY2hyb21lZHJpdmVyIGZyb20gJy4vY2hyb21lZHJpdmVyLmpzJztcbmltcG9ydCAqIGFzIGNocm9taXVtIGZyb20gJy4vY2hyb21pdW0uanMnO1xuaW1wb3J0ICogYXMgZmlyZWZveCBmcm9tICcuL2ZpcmVmb3guanMnO1xuaW1wb3J0IHsgQnJvd3NlciwgQnJvd3NlclBsYXRmb3JtLCBCcm93c2VyVGFnLCBDaHJvbWVSZWxlYXNlQ2hhbm5lbCwgfSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCBjb25zdCBkb3dubG9hZFVybHMgPSB7XG4gICAgW0Jyb3dzZXIuQ0hST01FRFJJVkVSXTogY2hyb21lZHJpdmVyLnJlc29sdmVEb3dubG9hZFVybCxcbiAgICBbQnJvd3Nlci5DSFJPTUVIRUFETEVTU1NIRUxMXTogY2hyb21lSGVhZGxlc3NTaGVsbC5yZXNvbHZlRG93bmxvYWRVcmwsXG4gICAgW0Jyb3dzZXIuQ0hST01FXTogY2hyb21lLnJlc29sdmVEb3dubG9hZFVybCxcbiAgICBbQnJvd3Nlci5DSFJPTUlVTV06IGNocm9taXVtLnJlc29sdmVEb3dubG9hZFVybCxcbiAgICBbQnJvd3Nlci5GSVJFRk9YXTogZmlyZWZveC5yZXNvbHZlRG93bmxvYWRVcmwsXG59O1xuZXhwb3J0IGNvbnN0IGRvd25sb2FkUGF0aHMgPSB7XG4gICAgW0Jyb3dzZXIuQ0hST01FRFJJVkVSXTogY2hyb21lZHJpdmVyLnJlc29sdmVEb3dubG9hZFBhdGgsXG4gICAgW0Jyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTF06IGNocm9tZUhlYWRsZXNzU2hlbGwucmVzb2x2ZURvd25sb2FkUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUVdOiBjaHJvbWUucmVzb2x2ZURvd25sb2FkUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUlVTV06IGNocm9taXVtLnJlc29sdmVEb3dubG9hZFBhdGgsXG4gICAgW0Jyb3dzZXIuRklSRUZPWF06IGZpcmVmb3gucmVzb2x2ZURvd25sb2FkUGF0aCxcbn07XG5leHBvcnQgY29uc3QgZXhlY3V0YWJsZVBhdGhCeUJyb3dzZXIgPSB7XG4gICAgW0Jyb3dzZXIuQ0hST01FRFJJVkVSXTogY2hyb21lZHJpdmVyLnJlbGF0aXZlRXhlY3V0YWJsZVBhdGgsXG4gICAgW0Jyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTF06IGNocm9tZUhlYWRsZXNzU2hlbGwucmVsYXRpdmVFeGVjdXRhYmxlUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUVdOiBjaHJvbWUucmVsYXRpdmVFeGVjdXRhYmxlUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUlVTV06IGNocm9taXVtLnJlbGF0aXZlRXhlY3V0YWJsZVBhdGgsXG4gICAgW0Jyb3dzZXIuRklSRUZPWF06IGZpcmVmb3gucmVsYXRpdmVFeGVjdXRhYmxlUGF0aCxcbn07XG5leHBvcnQgY29uc3QgdmVyc2lvbkNvbXBhcmF0b3JzID0ge1xuICAgIFtCcm93c2VyLkNIUk9NRURSSVZFUl06IGNocm9tZWRyaXZlci5jb21wYXJlVmVyc2lvbnMsXG4gICAgW0Jyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTF06IGNocm9tZUhlYWRsZXNzU2hlbGwuY29tcGFyZVZlcnNpb25zLFxuICAgIFtCcm93c2VyLkNIUk9NRV06IGNocm9tZS5jb21wYXJlVmVyc2lvbnMsXG4gICAgW0Jyb3dzZXIuQ0hST01JVU1dOiBjaHJvbWl1bS5jb21wYXJlVmVyc2lvbnMsXG4gICAgW0Jyb3dzZXIuRklSRUZPWF06IGZpcmVmb3guY29tcGFyZVZlcnNpb25zLFxufTtcbmV4cG9ydCB7IEJyb3dzZXIsIEJyb3dzZXJQbGF0Zm9ybSwgQ2hyb21lUmVsZWFzZUNoYW5uZWwgfTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCdWlsZElkRm9yQnJvd3NlclRhZyhicm93c2VyLCBwbGF0Zm9ybSwgdGFnKSB7XG4gICAgc3dpdGNoIChicm93c2VyKSB7XG4gICAgICAgIGNhc2UgQnJvd3Nlci5GSVJFRk9YOlxuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTEFURVNUOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLk5JR0hUTFkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLkJFVEEpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5OSUdIVExZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLk5JR0hUTFkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVZFRElUSU9OOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLkRFVkVESVRJT04pO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5TVEFCTEU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBmaXJlZm94LnJlc29sdmVCdWlsZElkKGZpcmVmb3guRmlyZWZveENoYW5uZWwuU1RBQkxFKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuRVNSOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLkVTUik7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuREVWOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFnLnRvVXBwZXJDYXNlKCl9IGlzIG5vdCBhdmFpbGFibGUgZm9yIEZpcmVmb3hgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NRToge1xuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTEFURVNUOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkNBTkFSWSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkJFVEE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWUucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuQkVUQSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNocm9tZS5yZXNvbHZlQnVpbGRJZChDaHJvbWVSZWxlYXNlQ2hhbm5lbC5DQU5BUlkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWUucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuREVWKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLlNUQUJMRSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLk5JR0hUTFk6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkRFVkVESVRJT046XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkVTUjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhZy50b1VwcGVyQ2FzZSgpfSBpcyBub3QgYXZhaWxhYmxlIGZvciBDaHJvbWVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FRFJJVkVSOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5MQVRFU1Q6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNocm9tZWRyaXZlci5yZXNvbHZlQnVpbGRJZChDaHJvbWVSZWxlYXNlQ2hhbm5lbC5DQU5BUlkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lZHJpdmVyLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkJFVEEpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVkcml2ZXIucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuREVWKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lZHJpdmVyLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLlNUQUJMRSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLk5JR0hUTFk6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkRFVkVESVRJT046XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkVTUjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhZy50b1VwcGVyQ2FzZSgpfSBpcyBub3QgYXZhaWxhYmxlIGZvciBDaHJvbWVEcml2ZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTDoge1xuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTEFURVNUOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5DQU5BUlk6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkNBTkFSWSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkJFVEE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkJFVEEpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkRFVik7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLlNUQUJMRTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNocm9tZUhlYWRsZXNzU2hlbGwucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTklHSFRMWTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuREVWRURJVElPTjpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuRVNSOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFnfSBpcyBub3QgYXZhaWxhYmxlIGZvciBjaHJvbWUtaGVhZGxlc3Mtc2hlbGxgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01JVU06XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5MQVRFU1Q6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWl1bS5yZXNvbHZlQnVpbGRJZChwbGF0Zm9ybSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLk5JR0hUTFk6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuREVWOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVZFRElUSU9OOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5CRVRBOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5TVEFCTEU6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkVTUjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhZ30gaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2hyb21pdW0uIFVzZSAnbGF0ZXN0JyBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJ1aWxkSWQoYnJvd3NlciwgcGxhdGZvcm0sIHRhZykge1xuICAgIGNvbnN0IGJyb3dzZXJUYWcgPSB0YWc7XG4gICAgaWYgKE9iamVjdC52YWx1ZXMoQnJvd3NlclRhZykuaW5jbHVkZXMoYnJvd3NlclRhZykpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVCdWlsZElkRm9yQnJvd3NlclRhZyhicm93c2VyLCBwbGF0Zm9ybSwgYnJvd3NlclRhZyk7XG4gICAgfVxuICAgIHN3aXRjaCAoYnJvd3Nlcikge1xuICAgICAgICBjYXNlIEJyb3dzZXIuRklSRUZPWDpcbiAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUU6XG4gICAgICAgICAgICBjb25zdCBjaHJvbWVSZXN1bHQgPSBhd2FpdCBjaHJvbWUucmVzb2x2ZUJ1aWxkSWQodGFnKTtcbiAgICAgICAgICAgIGlmIChjaHJvbWVSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hyb21lUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NRURSSVZFUjpcbiAgICAgICAgICAgIGNvbnN0IGNocm9tZURyaXZlclJlc3VsdCA9IGF3YWl0IGNocm9tZWRyaXZlci5yZXNvbHZlQnVpbGRJZCh0YWcpO1xuICAgICAgICAgICAgaWYgKGNocm9tZURyaXZlclJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaHJvbWVEcml2ZXJSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGFnO1xuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTDpcbiAgICAgICAgICAgIGNvbnN0IGNocm9tZUhlYWRsZXNzU2hlbGxSZXN1bHQgPSBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKHRhZyk7XG4gICAgICAgICAgICBpZiAoY2hyb21lSGVhZGxlc3NTaGVsbFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaHJvbWVIZWFkbGVzc1NoZWxsUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NSVVNOlxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVByb2ZpbGUoYnJvd3Nlciwgb3B0cykge1xuICAgIHN3aXRjaCAoYnJvd3Nlcikge1xuICAgICAgICBjYXNlIEJyb3dzZXIuRklSRUZPWDpcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmaXJlZm94LmNyZWF0ZVByb2ZpbGUob3B0cyk7XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUU6XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUlVTTpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvZmlsZSBjcmVhdGlvbiBpcyBub3Qgc3VwcG9ydCBmb3IgJHticm93c2VyfSB5ZXRgKTtcbiAgICB9XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTeXN0ZW1FeGVjdXRhYmxlUGF0aChicm93c2VyLCBwbGF0Zm9ybSwgY2hhbm5lbCkge1xuICAgIHN3aXRjaCAoYnJvd3Nlcikge1xuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FRFJJVkVSOlxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTDpcbiAgICAgICAgY2FzZSBCcm93c2VyLkZJUkVGT1g6XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUlVTTpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3lzdGVtIGJyb3dzZXIgZGV0ZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yICR7YnJvd3Nlcn0geWV0LmApO1xuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FOlxuICAgICAgICAgICAgcmV0dXJuIGNocm9tZS5yZXNvbHZlU3lzdGVtRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIGNoYW5uZWwpO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyBhIHZlcnNpb24gY29tcGFyYXRvciBmb3IgdGhlIGdpdmVuIGJyb3dzZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBzb3J0XG4gKiBicm93c2VyIHZlcnNpb25zLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25Db21wYXJhdG9yKGJyb3dzZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvbkNvbXBhcmF0b3JzW2Jyb3dzZXJdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJvd3Nlci1kYXRhLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vdHlwZXMuanMnO1xuZnVuY3Rpb24gZm9sZGVyKHBsYXRmb3JtKSB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgIHJldHVybiAnbGludXg2NCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgICAgICByZXR1cm4gJ21hYy1hcm02NCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiAnbWFjLXg2NCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICAgICAgcmV0dXJuICd3aW4zMic7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICAgICAgcmV0dXJuICd3aW42NCc7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFVybChwbGF0Zm9ybSwgYnVpbGRJZCwgYmFzZVVybCA9ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vY2hyb21lLWZvci10ZXN0aW5nLXB1YmxpYycpIHtcbiAgICByZXR1cm4gYCR7YmFzZVVybH0vJHtyZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCBidWlsZElkKS5qb2luKCcvJyl9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCBidWlsZElkKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYnVpbGRJZCxcbiAgICAgICAgZm9sZGVyKHBsYXRmb3JtKSxcbiAgICAgICAgYGNocm9tZS1oZWFkbGVzcy1zaGVsbC0ke2ZvbGRlcihwbGF0Zm9ybSl9LnppcGAsXG4gICAgXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUV4ZWN1dGFibGVQYXRoKHBsYXRmb3JtLCBfYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLWhlYWRsZXNzLXNoZWxsLScgKyBmb2xkZXIocGxhdGZvcm0pLCAnY2hyb21lLWhlYWRsZXNzLXNoZWxsJyk7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLWhlYWRsZXNzLXNoZWxsLWxpbnV4NjQnLCAnY2hyb21lLWhlYWRsZXNzLXNoZWxsJyk7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2Nocm9tZS1oZWFkbGVzcy1zaGVsbC0nICsgZm9sZGVyKHBsYXRmb3JtKSwgJ2Nocm9tZS1oZWFkbGVzcy1zaGVsbC5leGUnKTtcbiAgICB9XG59XG5leHBvcnQgeyByZXNvbHZlQnVpbGRJZCwgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnLi9jaHJvbWUuanMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2hyb21lLWhlYWRsZXNzLXNoZWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IGdldEpTT04gfSBmcm9tICcuLi9odHRwVXRpbC5qcyc7XG5pbXBvcnQgeyBCcm93c2VyUGxhdGZvcm0sIENocm9tZVJlbGVhc2VDaGFubmVsIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5mdW5jdGlvbiBmb2xkZXIocGxhdGZvcm0pIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuICdsaW51eDY0JztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDX0FSTTpcbiAgICAgICAgICAgIHJldHVybiAnbWFjLWFybTY0JztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICAgICAgcmV0dXJuICdtYWMteDY0JztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lOMzI6XG4gICAgICAgICAgICByZXR1cm4gJ3dpbjMyJztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gJ3dpbjY0JztcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURvd25sb2FkVXJsKHBsYXRmb3JtLCBidWlsZElkLCBiYXNlVXJsID0gJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9jaHJvbWUtZm9yLXRlc3RpbmctcHVibGljJykge1xuICAgIHJldHVybiBgJHtiYXNlVXJsfS8ke3Jlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpLmpvaW4oJy8nKX1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICByZXR1cm4gW2J1aWxkSWQsIGZvbGRlcihwbGF0Zm9ybSksIGBjaHJvbWUtJHtmb2xkZXIocGxhdGZvcm0pfS56aXBgXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUV4ZWN1dGFibGVQYXRoKHBsYXRmb3JtLCBfYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLScgKyBmb2xkZXIocGxhdGZvcm0pLCAnR29vZ2xlIENocm9tZSBmb3IgVGVzdGluZy5hcHAnLCAnQ29udGVudHMnLCAnTWFjT1MnLCAnR29vZ2xlIENocm9tZSBmb3IgVGVzdGluZycpO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2Nocm9tZS1saW51eDY0JywgJ2Nocm9tZScpO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWUtJyArIGZvbGRlcihwbGF0Zm9ybSksICdjaHJvbWUuZXhlJyk7XG4gICAgfVxufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhc3RLbm93bkdvb2RSZWxlYXNlRm9yQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBnZXRKU09OKG5ldyBVUkwoJ2h0dHBzOi8vZ29vZ2xlY2hyb21lbGFicy5naXRodWIuaW8vY2hyb21lLWZvci10ZXN0aW5nL2xhc3Qta25vd24tZ29vZC12ZXJzaW9ucy5qc29uJykpKTtcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgT2JqZWN0LmtleXMoZGF0YS5jaGFubmVscykpIHtcbiAgICAgICAgZGF0YS5jaGFubmVsc1tjaGFubmVsLnRvTG93ZXJDYXNlKCldID0gZGF0YS5jaGFubmVsc1tjaGFubmVsXTtcbiAgICAgICAgZGVsZXRlIGRhdGEuY2hhbm5lbHNbY2hhbm5lbF07XG4gICAgfVxuICAgIHJldHVybiBkYXRhLmNoYW5uZWxzW2NoYW5uZWxdO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhc3RLbm93bkdvb2RSZWxlYXNlRm9yTWlsZXN0b25lKG1pbGVzdG9uZSkge1xuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgZ2V0SlNPTihuZXcgVVJMKCdodHRwczovL2dvb2dsZWNocm9tZWxhYnMuZ2l0aHViLmlvL2Nocm9tZS1mb3ItdGVzdGluZy9sYXRlc3QtdmVyc2lvbnMtcGVyLW1pbGVzdG9uZS5qc29uJykpKTtcbiAgICByZXR1cm4gZGF0YS5taWxlc3RvbmVzW21pbGVzdG9uZV07XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGFzdEtub3duR29vZFJlbGVhc2VGb3JCdWlsZChcbi8qKlxuICogQGV4YW1wbGUgYDExMi4wLjIzYCxcbiAqL1xuYnVpbGRQcmVmaXgpIHtcbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IGdldEpTT04obmV3IFVSTCgnaHR0cHM6Ly9nb29nbGVjaHJvbWVsYWJzLmdpdGh1Yi5pby9jaHJvbWUtZm9yLXRlc3RpbmcvbGF0ZXN0LXBhdGNoLXZlcnNpb25zLXBlci1idWlsZC5qc29uJykpKTtcbiAgICByZXR1cm4gZGF0YS5idWlsZHNbYnVpbGRQcmVmaXhdO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCdWlsZElkKGNoYW5uZWwpIHtcbiAgICBpZiAoT2JqZWN0LnZhbHVlcyhDaHJvbWVSZWxlYXNlQ2hhbm5lbCkuaW5jbHVkZXMoY2hhbm5lbCkpIHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBnZXRMYXN0S25vd25Hb29kUmVsZWFzZUZvckNoYW5uZWwoY2hhbm5lbCkpLnZlcnNpb247XG4gICAgfVxuICAgIGlmIChjaGFubmVsLm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgICAvLyBQb3RlbnRpYWxseSBhIG1pbGVzdG9uZS5cbiAgICAgICAgcmV0dXJuIChhd2FpdCBnZXRMYXN0S25vd25Hb29kUmVsZWFzZUZvck1pbGVzdG9uZShjaGFubmVsKSk/LnZlcnNpb247XG4gICAgfVxuICAgIGlmIChjaGFubmVsLm1hdGNoKC9eXFxkK1xcLlxcZCtcXC5cXGQrJC8pKSB7XG4gICAgICAgIC8vIFBvdGVudGlhbGx5IGEgYnVpbGQgcHJlZml4IHdpdGhvdXQgdGhlIHBhdGNoIHZlcnNpb24uXG4gICAgICAgIHJldHVybiAoYXdhaXQgZ2V0TGFzdEtub3duR29vZFJlbGVhc2VGb3JCdWlsZChjaGFubmVsKSk/LnZlcnNpb247XG4gICAgfVxuICAgIHJldHVybjtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU3lzdGVtRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIGNoYW5uZWwpIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7cHJvY2Vzcy5lbnZbJ1BST0dSQU1GSUxFUyddfVxcXFxHb29nbGVcXFxcQ2hyb21lXFxcXEFwcGxpY2F0aW9uXFxcXGNocm9tZS5leGVgO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuQkVUQTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3Byb2Nlc3MuZW52WydQUk9HUkFNRklMRVMnXX1cXFxcR29vZ2xlXFxcXENocm9tZSBCZXRhXFxcXEFwcGxpY2F0aW9uXFxcXGNocm9tZS5leGVgO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuQ0FOQVJZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7cHJvY2Vzcy5lbnZbJ1BST0dSQU1GSUxFUyddfVxcXFxHb29nbGVcXFxcQ2hyb21lIFN4U1xcXFxBcHBsaWNhdGlvblxcXFxjaHJvbWUuZXhlYDtcbiAgICAgICAgICAgICAgICBjYXNlIENocm9tZVJlbGVhc2VDaGFubmVsLkRFVjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3Byb2Nlc3MuZW52WydQUk9HUkFNRklMRVMnXX1cXFxcR29vZ2xlXFxcXENocm9tZSBEZXZcXFxcQXBwbGljYXRpb25cXFxcY2hyb21lLmV4ZWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvR29vZ2xlIENocm9tZS5hcHAvQ29udGVudHMvTWFjT1MvR29vZ2xlIENocm9tZSc7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvR29vZ2xlIENocm9tZSBCZXRhLmFwcC9Db250ZW50cy9NYWNPUy9Hb29nbGUgQ2hyb21lIEJldGEnO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuQ0FOQVJZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvR29vZ2xlIENocm9tZSBDYW5hcnkuYXBwL0NvbnRlbnRzL01hY09TL0dvb2dsZSBDaHJvbWUgQ2FuYXJ5JztcbiAgICAgICAgICAgICAgICBjYXNlIENocm9tZVJlbGVhc2VDaGFubmVsLkRFVjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcvQXBwbGljYXRpb25zL0dvb2dsZSBDaHJvbWUgRGV2LmFwcC9Db250ZW50cy9NYWNPUy9Hb29nbGUgQ2hyb21lIERldic7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5TVEFCTEU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnL29wdC9nb29nbGUvY2hyb21lL2Nocm9tZSc7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9vcHQvZ29vZ2xlL2Nocm9tZS1iZXRhL2Nocm9tZSc7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnL29wdC9nb29nbGUvY2hyb21lLXVuc3RhYmxlL2Nocm9tZSc7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRldGVjdCBicm93c2VyIGV4ZWN1dGFibGUgcGF0aCBmb3IgJyR7Y2hhbm5lbH0nIG9uICR7cGxhdGZvcm19LmApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhLCBiKSB7XG4gICAgaWYgKCFzZW12ZXIudmFsaWQoYSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWZXJzaW9uICR7YX0gaXMgbm90IGEgdmFsaWQgc2VtdmVyIHZlcnNpb25gKTtcbiAgICB9XG4gICAgaWYgKCFzZW12ZXIudmFsaWQoYikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWZXJzaW9uICR7Yn0gaXMgbm90IGEgdmFsaWQgc2VtdmVyIHZlcnNpb25gKTtcbiAgICB9XG4gICAgaWYgKHNlbXZlci5ndChhLCBiKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VtdmVyLmx0KGEsIGIpKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNocm9tZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBCcm93c2VyUGxhdGZvcm0gfSBmcm9tICcuL3R5cGVzLmpzJztcbmZ1bmN0aW9uIGZvbGRlcihwbGF0Zm9ybSkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gJ2xpbnV4NjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuICdtYWMtYXJtNjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgICAgICByZXR1cm4gJ21hYy14NjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgIHJldHVybiAnd2luMzInO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiAnd2luNjQnO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRVcmwocGxhdGZvcm0sIGJ1aWxkSWQsIGJhc2VVcmwgPSAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Nocm9tZS1mb3ItdGVzdGluZy1wdWJsaWMnKSB7XG4gICAgcmV0dXJuIGAke2Jhc2VVcmx9LyR7cmVzb2x2ZURvd25sb2FkUGF0aChwbGF0Zm9ybSwgYnVpbGRJZCkuam9pbignLycpfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURvd25sb2FkUGF0aChwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgIHJldHVybiBbYnVpbGRJZCwgZm9sZGVyKHBsYXRmb3JtKSwgYGNocm9tZWRyaXZlci0ke2ZvbGRlcihwbGF0Zm9ybSl9LnppcGBdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIF9idWlsZElkKSB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWVkcml2ZXItJyArIGZvbGRlcihwbGF0Zm9ybSksICdjaHJvbWVkcml2ZXInKTtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWVkcml2ZXItbGludXg2NCcsICdjaHJvbWVkcml2ZXInKTtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lOMzI6XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lZHJpdmVyLScgKyBmb2xkZXIocGxhdGZvcm0pLCAnY2hyb21lZHJpdmVyLmV4ZScpO1xuICAgIH1cbn1cbmV4cG9ydCB7IHJlc29sdmVCdWlsZElkLCBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuL2Nocm9tZS5qcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaHJvbWVkcml2ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0VGV4dCB9IGZyb20gJy4uL2h0dHBVdGlsLmpzJztcbmltcG9ydCB7IEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vdHlwZXMuanMnO1xuZnVuY3Rpb24gYXJjaGl2ZShwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gJ2Nocm9tZS1saW51eCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiAnY2hyb21lLW1hYyc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIC8vIFdpbmRvd3MgYXJjaGl2ZSBuYW1lIGNoYW5nZWQgYXQgcjU5MTQ3OS5cbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChidWlsZElkLCAxMCkgPiA1OTE0NzkgPyAnY2hyb21lLXdpbicgOiAnY2hyb21lLXdpbjMyJztcbiAgICB9XG59XG5mdW5jdGlvbiBmb2xkZXIocGxhdGZvcm0pIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuICdMaW51eF94NjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuICdNYWNfQXJtJztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICAgICAgcmV0dXJuICdNYWMnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgIHJldHVybiAnV2luJztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gJ1dpbl94NjQnO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRVcmwocGxhdGZvcm0sIGJ1aWxkSWQsIGJhc2VVcmwgPSAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Nocm9taXVtLWJyb3dzZXItc25hcHNob3RzJykge1xuICAgIHJldHVybiBgJHtiYXNlVXJsfS8ke3Jlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpLmpvaW4oJy8nKX1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICByZXR1cm4gW2ZvbGRlcihwbGF0Zm9ybSksIGJ1aWxkSWQsIGAke2FyY2hpdmUocGxhdGZvcm0sIGJ1aWxkSWQpfS56aXBgXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUV4ZWN1dGFibGVQYXRoKHBsYXRmb3JtLCBfYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLW1hYycsICdDaHJvbWl1bS5hcHAnLCAnQ29udGVudHMnLCAnTWFjT1MnLCAnQ2hyb21pdW0nKTtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWUtbGludXgnLCAnY2hyb21lJyk7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2Nocm9tZS13aW4nLCAnY2hyb21lLmV4ZScpO1xuICAgIH1cbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlQnVpbGRJZChwbGF0Zm9ybSkge1xuICAgIHJldHVybiBhd2FpdCBnZXRUZXh0KG5ldyBVUkwoYGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9jaHJvbWl1bS1icm93c2VyLXNuYXBzaG90cy8ke2ZvbGRlcihwbGF0Zm9ybSl9L0xBU1RfQ0hBTkdFYCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhLCBiKSB7XG4gICAgcmV0dXJuIE51bWJlcihhKSAtIE51bWJlcihiKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNocm9taXVtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBnZXRKU09OIH0gZnJvbSAnLi4vaHR0cFV0aWwuanMnO1xuaW1wb3J0IHsgQnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5mdW5jdGlvbiBhcmNoaXZlTmlnaHRseShwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gYGZpcmVmb3gtJHtidWlsZElkfS5lbi1VUy4ke3BsYXRmb3JtfS14ODZfNjQudGFyLmJ6MmA7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiBgZmlyZWZveC0ke2J1aWxkSWR9LmVuLVVTLm1hYy5kbWdgO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gYGZpcmVmb3gtJHtidWlsZElkfS5lbi1VUy4ke3BsYXRmb3JtfS56aXBgO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFyY2hpdmUocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuIGBmaXJlZm94LSR7YnVpbGRJZH0udGFyLmJ6MmA7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiBgRmlyZWZveCAke2J1aWxkSWR9LmRtZ2A7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiBgRmlyZWZveCBTZXR1cCAke2J1aWxkSWR9LmV4ZWA7XG4gICAgfVxufVxuZnVuY3Rpb24gcGxhdGZvcm1OYW1lKHBsYXRmb3JtKSB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgIHJldHVybiBgbGludXgteDg2XzY0YDtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDX0FSTTpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICAgICAgcmV0dXJuIGBtYWNgO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gcGxhdGZvcm07XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VCdWlsZElkKGJ1aWxkSWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMoRmlyZWZveENoYW5uZWwpKSB7XG4gICAgICAgIGlmIChidWlsZElkLnN0YXJ0c1dpdGgodmFsdWUgKyAnXycpKSB7XG4gICAgICAgICAgICBidWlsZElkID0gYnVpbGRJZC5zdWJzdHJpbmcodmFsdWUubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICByZXR1cm4gW3ZhbHVlLCBidWlsZElkXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBkbyBub3QgaGF2ZSBjaGFubmVsIGFzIHRoZSBwcmVmaXguwqtcbiAgICByZXR1cm4gW0ZpcmVmb3hDaGFubmVsLk5JR0hUTFksIGJ1aWxkSWRdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFVybChwbGF0Zm9ybSwgYnVpbGRJZCwgYmFzZVVybCkge1xuICAgIGNvbnN0IFtjaGFubmVsLCByZXNvbHZlZEJ1aWxkSWRdID0gcGFyc2VCdWlsZElkKGJ1aWxkSWQpO1xuICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLk5JR0hUTFk6XG4gICAgICAgICAgICBiYXNlVXJsID8/PVxuICAgICAgICAgICAgICAgICdodHRwczovL2FyY2hpdmUubW96aWxsYS5vcmcvcHViL2ZpcmVmb3gvbmlnaHRseS9sYXRlc3QtbW96aWxsYS1jZW50cmFsJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkRFVkVESVRJT046XG4gICAgICAgICAgICBiYXNlVXJsID8/PSAnaHR0cHM6Ly9hcmNoaXZlLm1vemlsbGEub3JnL3B1Yi9kZXZlZGl0aW9uL3JlbGVhc2VzJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkJFVEE6XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuU1RBQkxFOlxuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkVTUjpcbiAgICAgICAgICAgIGJhc2VVcmwgPz89ICdodHRwczovL2FyY2hpdmUubW96aWxsYS5vcmcvcHViL2ZpcmVmb3gvcmVsZWFzZXMnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLk5JR0hUTFk6XG4gICAgICAgICAgICByZXR1cm4gYCR7YmFzZVVybH0vJHtyZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCByZXNvbHZlZEJ1aWxkSWQpLmpvaW4oJy8nKX1gO1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkRFVkVESVRJT046XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuQkVUQTpcbiAgICAgICAgY2FzZSBGaXJlZm94Q2hhbm5lbC5TVEFCTEU6XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuRVNSOlxuICAgICAgICAgICAgcmV0dXJuIGAke2Jhc2VVcmx9LyR7cmVzb2x2ZWRCdWlsZElkfS8ke3BsYXRmb3JtTmFtZShwbGF0Zm9ybSl9L2VuLVVTLyR7YXJjaGl2ZShwbGF0Zm9ybSwgcmVzb2x2ZWRCdWlsZElkKX1gO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCBidWlsZElkKSB7XG4gICAgcmV0dXJuIFthcmNoaXZlTmlnaHRseShwbGF0Zm9ybSwgYnVpbGRJZCldO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICBjb25zdCBbY2hhbm5lbF0gPSBwYXJzZUJ1aWxkSWQoYnVpbGRJZCk7XG4gICAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuTklHSFRMWTpcbiAgICAgICAgICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignRmlyZWZveCBOaWdodGx5LmFwcCcsICdDb250ZW50cycsICdNYWNPUycsICdmaXJlZm94Jyk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2ZpcmVmb3gnLCAnZmlyZWZveCcpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdmaXJlZm94JywgJ2ZpcmVmb3guZXhlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuQkVUQTpcbiAgICAgICAgY2FzZSBGaXJlZm94Q2hhbm5lbC5ERVZFRElUSU9OOlxuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkVTUjpcbiAgICAgICAgY2FzZSBGaXJlZm94Q2hhbm5lbC5TVEFCTEU6XG4gICAgICAgICAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDX0FSTTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ0ZpcmVmb3guYXBwJywgJ0NvbnRlbnRzJywgJ01hY09TJywgJ2ZpcmVmb3gnKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignZmlyZWZveCcsICdmaXJlZm94Jyk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lOMzI6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2NvcmUnLCAnZmlyZWZveC5leGUnKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgdmFyIEZpcmVmb3hDaGFubmVsO1xuKGZ1bmN0aW9uIChGaXJlZm94Q2hhbm5lbCkge1xuICAgIEZpcmVmb3hDaGFubmVsW1wiU1RBQkxFXCJdID0gXCJzdGFibGVcIjtcbiAgICBGaXJlZm94Q2hhbm5lbFtcIkVTUlwiXSA9IFwiZXNyXCI7XG4gICAgRmlyZWZveENoYW5uZWxbXCJERVZFRElUSU9OXCJdID0gXCJkZXZlZGl0aW9uXCI7XG4gICAgRmlyZWZveENoYW5uZWxbXCJCRVRBXCJdID0gXCJiZXRhXCI7XG4gICAgRmlyZWZveENoYW5uZWxbXCJOSUdIVExZXCJdID0gXCJuaWdodGx5XCI7XG59KShGaXJlZm94Q2hhbm5lbCB8fCAoRmlyZWZveENoYW5uZWwgPSB7fSkpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCdWlsZElkKGNoYW5uZWwgPSBGaXJlZm94Q2hhbm5lbC5OSUdIVExZKSB7XG4gICAgY29uc3QgY2hhbm5lbFRvVmVyc2lvbktleSA9IHtcbiAgICAgICAgW0ZpcmVmb3hDaGFubmVsLkVTUl06ICdGSVJFRk9YX0VTUicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5TVEFCTEVdOiAnTEFURVNUX0ZJUkVGT1hfVkVSU0lPTicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5ERVZFRElUSU9OXTogJ0ZJUkVGT1hfREVWRURJVElPTicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5CRVRBXTogJ0ZJUkVGT1hfREVWRURJVElPTicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5OSUdIVExZXTogJ0ZJUkVGT1hfTklHSFRMWScsXG4gICAgfTtcbiAgICBjb25zdCB2ZXJzaW9ucyA9IChhd2FpdCBnZXRKU09OKG5ldyBVUkwoJ2h0dHBzOi8vcHJvZHVjdC1kZXRhaWxzLm1vemlsbGEub3JnLzEuMC9maXJlZm94X3ZlcnNpb25zLmpzb24nKSkpO1xuICAgIGNvbnN0IHZlcnNpb24gPSB2ZXJzaW9uc1tjaGFubmVsVG9WZXJzaW9uS2V5W2NoYW5uZWxdXTtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGFubmVsICR7Y2hhbm5lbH0gaXMgbm90IGZvdW5kLmApO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbCArICdfJyArIHZlcnNpb247XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUHJvZmlsZShvcHRpb25zKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG9wdGlvbnMucGF0aCkpIHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIob3B0aW9ucy5wYXRoLCB7XG4gICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhd2FpdCB3cml0ZVByZWZlcmVuY2VzKHtcbiAgICAgICAgcHJlZmVyZW5jZXM6IHtcbiAgICAgICAgICAgIC4uLmRlZmF1bHRQcm9maWxlUHJlZmVyZW5jZXMob3B0aW9ucy5wcmVmZXJlbmNlcyksXG4gICAgICAgICAgICAuLi5vcHRpb25zLnByZWZlcmVuY2VzLFxuICAgICAgICB9LFxuICAgICAgICBwYXRoOiBvcHRpb25zLnBhdGgsXG4gICAgfSk7XG59XG5mdW5jdGlvbiBkZWZhdWx0UHJvZmlsZVByZWZlcmVuY2VzKGV4dHJhUHJlZnMpIHtcbiAgICBjb25zdCBzZXJ2ZXIgPSAnZHVtbXkudGVzdCc7XG4gICAgY29uc3QgZGVmYXVsdFByZWZzID0ge1xuICAgICAgICAvLyBNYWtlIHN1cmUgU2hpZWxkIGRvZXNuJ3QgaGl0IHRoZSBuZXR3b3JrLlxuICAgICAgICAnYXBwLm5vcm1hbmR5LmFwaV91cmwnOiAnJyxcbiAgICAgICAgLy8gRGlzYWJsZSBGaXJlZm94IG9sZCBidWlsZCBiYWNrZ3JvdW5kIGNoZWNrXG4gICAgICAgICdhcHAudXBkYXRlLmNoZWNrSW5zdGFsbFRpbWUnOiBmYWxzZSxcbiAgICAgICAgLy8gRGlzYWJsZSBhdXRvbWF0aWNhbGx5IHVwZ3JhZGluZyBGaXJlZm94XG4gICAgICAgICdhcHAudXBkYXRlLmRpc2FibGVkRm9yVGVzdGluZyc6IHRydWUsXG4gICAgICAgIC8vIEluY3JlYXNlIHRoZSBBUFogY29udGVudCByZXNwb25zZSB0aW1lb3V0IHRvIDEgbWludXRlXG4gICAgICAgICdhcHouY29udGVudF9yZXNwb25zZV90aW1lb3V0JzogNjAwMDAsXG4gICAgICAgIC8vIFByZXZlbnQgdmFyaW91cyBlcnJvciBtZXNzYWdlIG9uIHRoZSBjb25zb2xlXG4gICAgICAgIC8vIGplc3QtcHVwcGV0ZWVyIGFzc2VydHMgdGhhdCBubyBlcnJvciBtZXNzYWdlIGlzIGVtaXR0ZWQgYnkgdGhlIGNvbnNvbGVcbiAgICAgICAgJ2Jyb3dzZXIuY29udGVudGJsb2NraW5nLmZlYXR1cmVzLnN0YW5kYXJkJzogJy10cCx0cFByaXZhdGUsY29va2llQmVoYXZpb3IwLC1jbSwtZnAnLFxuICAgICAgICAvLyBFbmFibGUgdGhlIGR1bXAgZnVuY3Rpb246IHdoaWNoIHNlbmRzIG1lc3NhZ2VzIHRvIHRoZSBzeXN0ZW1cbiAgICAgICAgLy8gY29uc29sZVxuICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTQzMTE1XG4gICAgICAgICdicm93c2VyLmRvbS53aW5kb3cuZHVtcC5lbmFibGVkJzogdHJ1ZSxcbiAgICAgICAgLy8gRGlzYWJsZSB0b3BzdG9yaWVzXG4gICAgICAgICdicm93c2VyLm5ld3RhYnBhZ2UuYWN0aXZpdHktc3RyZWFtLmZlZWRzLnN5c3RlbS50b3BzdG9yaWVzJzogZmFsc2UsXG4gICAgICAgIC8vIEFsd2F5cyBkaXNwbGF5IGEgYmxhbmsgcGFnZVxuICAgICAgICAnYnJvd3Nlci5uZXd0YWJwYWdlLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gQmFja2dyb3VuZCB0aHVtYm5haWxzIGluIHBhcnRpY3VsYXIgY2F1c2UgZ3JpZWY6IGFuZCBkaXNhYmxpbmdcbiAgICAgICAgLy8gdGh1bWJuYWlscyBpbiBnZW5lcmFsIGNhbm5vdCBodXJ0XG4gICAgICAgICdicm93c2VyLnBhZ2V0aHVtYm5haWxzLmNhcHR1cmluZ19kaXNhYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIERpc2FibGUgc2FmZWJyb3dzaW5nIGNvbXBvbmVudHMuXG4gICAgICAgICdicm93c2VyLnNhZmVicm93c2luZy5ibG9ja2VkVVJJcy5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgICdicm93c2VyLnNhZmVicm93c2luZy5kb3dubG9hZHMuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAnYnJvd3Nlci5zYWZlYnJvd3NpbmcubWFsd2FyZS5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgICdicm93c2VyLnNhZmVicm93c2luZy5waGlzaGluZy5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgdXBkYXRlcyB0byBzZWFyY2ggZW5naW5lcy5cbiAgICAgICAgJ2Jyb3dzZXIuc2VhcmNoLnVwZGF0ZSc6IGZhbHNlLFxuICAgICAgICAvLyBEbyBub3QgcmVzdG9yZSB0aGUgbGFzdCBvcGVuIHNldCBvZiB0YWJzIGlmIHRoZSBicm93c2VyIGhhcyBjcmFzaGVkXG4gICAgICAgICdicm93c2VyLnNlc3Npb25zdG9yZS5yZXN1bWVfZnJvbV9jcmFzaCc6IGZhbHNlLFxuICAgICAgICAvLyBTa2lwIGNoZWNrIGZvciBkZWZhdWx0IGJyb3dzZXIgb24gc3RhcnR1cFxuICAgICAgICAnYnJvd3Nlci5zaGVsbC5jaGVja0RlZmF1bHRCcm93c2VyJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgbmV3dGFicGFnZVxuICAgICAgICAnYnJvd3Nlci5zdGFydHVwLmhvbWVwYWdlJzogJ2Fib3V0OmJsYW5rJyxcbiAgICAgICAgLy8gRG8gbm90IHJlZGlyZWN0IHVzZXIgd2hlbiBhIG1pbHN0b25lIHVwZ3JhZGUgb2YgRmlyZWZveCBpcyBkZXRlY3RlZFxuICAgICAgICAnYnJvd3Nlci5zdGFydHVwLmhvbWVwYWdlX292ZXJyaWRlLm1zdG9uZSc6ICdpZ25vcmUnLFxuICAgICAgICAvLyBTdGFydCB3aXRoIGEgYmxhbmsgcGFnZSBhYm91dDpibGFua1xuICAgICAgICAnYnJvd3Nlci5zdGFydHVwLnBhZ2UnOiAwLFxuICAgICAgICAvLyBEbyBub3QgYWxsb3cgYmFja2dyb3VuZCB0YWJzIHRvIGJlIHpvbWJpZmllZCBvbiBBbmRyb2lkOiBvdGhlcndpc2UgZm9yXG4gICAgICAgIC8vIHRlc3RzIHRoYXQgb3BlbiBhZGRpdGlvbmFsIHRhYnM6IHRoZSB0ZXN0IGhhcm5lc3MgdGFiIGl0c2VsZiBtaWdodCBnZXRcbiAgICAgICAgLy8gdW5sb2FkZWRcbiAgICAgICAgJ2Jyb3dzZXIudGFicy5kaXNhYmxlQmFja2dyb3VuZFpvbWJpZmljYXRpb24nOiBmYWxzZSxcbiAgICAgICAgLy8gRG8gbm90IHdhcm4gd2hlbiBjbG9zaW5nIGFsbCBvdGhlciBvcGVuIHRhYnNcbiAgICAgICAgJ2Jyb3dzZXIudGFicy53YXJuT25DbG9zZU90aGVyVGFicyc6IGZhbHNlLFxuICAgICAgICAvLyBEbyBub3Qgd2FybiB3aGVuIG11bHRpcGxlIHRhYnMgd2lsbCBiZSBvcGVuZWRcbiAgICAgICAgJ2Jyb3dzZXIudGFicy53YXJuT25PcGVuJzogZmFsc2UsXG4gICAgICAgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IG9mZmVyIHRyYW5zbGF0aW9ucywgYXMgdGVzdHMgZG8gbm90IGV4cGVjdCB0aGlzLlxuICAgICAgICAnYnJvd3Nlci50cmFuc2xhdGlvbnMuYXV0b21hdGljYWxseVBvcHVwJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgdGhlIFVJIHRvdXIuXG4gICAgICAgICdicm93c2VyLnVpdG91ci5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIFR1cm4gb2ZmIHNlYXJjaCBzdWdnZXN0aW9ucyBpbiB0aGUgbG9jYXRpb24gYmFyIHNvIGFzIG5vdCB0byB0cmlnZ2VyXG4gICAgICAgIC8vIG5ldHdvcmsgY29ubmVjdGlvbnMuXG4gICAgICAgICdicm93c2VyLnVybGJhci5zdWdnZXN0LnNlYXJjaGVzJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgZmlyc3QgcnVuIHNwbGFzaCBwYWdlIG9uIFdpbmRvd3MgMTBcbiAgICAgICAgJ2Jyb3dzZXIudXNlZE9uV2luZG93czEwLmludHJvVVJMJzogJycsXG4gICAgICAgIC8vIERvIG5vdCB3YXJuIG9uIHF1aXR0aW5nIEZpcmVmb3hcbiAgICAgICAgJ2Jyb3dzZXIud2Fybk9uUXVpdCc6IGZhbHNlLFxuICAgICAgICAvLyBEZWZlbnNpdmVseSBkaXNhYmxlIGRhdGEgcmVwb3J0aW5nIHN5c3RlbXNcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcuaGVhbHRocmVwb3J0LmRvY3VtZW50U2VydmVyVVJJJzogYGh0dHA6Ly8ke3NlcnZlcn0vZHVtbXkvaGVhbHRocmVwb3J0L2AsXG4gICAgICAgICdkYXRhcmVwb3J0aW5nLmhlYWx0aHJlcG9ydC5sb2dnaW5nLmNvbnNvbGVFbmFibGVkJzogZmFsc2UsXG4gICAgICAgICdkYXRhcmVwb3J0aW5nLmhlYWx0aHJlcG9ydC5zZXJ2aWNlLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcuaGVhbHRocmVwb3J0LnNlcnZpY2UuZmlyc3RSdW4nOiBmYWxzZSxcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcuaGVhbHRocmVwb3J0LnVwbG9hZEVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gRG8gbm90IHNob3cgZGF0YXJlcG9ydGluZyBwb2xpY3kgbm90aWZpY2F0aW9ucyB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggdGVzdHNcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcucG9saWN5LmRhdGFTdWJtaXNzaW9uRW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAnZGF0YXJlcG9ydGluZy5wb2xpY3kuZGF0YVN1Ym1pc3Npb25Qb2xpY3lCeXBhc3NOb3RpZmljYXRpb24nOiB0cnVlLFxuICAgICAgICAvLyBEZXZUb29scyBKU09OVmlld2VyIHNvbWV0aW1lcyBmYWlscyB0byBsb2FkIGRlcGVuZGVuY2llcyB3aXRoIGl0cyByZXF1aXJlLmpzLlxuICAgICAgICAvLyBUaGlzIGRvZXNuJ3QgYWZmZWN0IFB1cHBldGVlciBidXQgc3BhbXMgY29uc29sZSAoQnVnIDE0MjQzNzIpXG4gICAgICAgICdkZXZ0b29scy5qc29udmlldy5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgcG9wdXAtYmxvY2tlclxuICAgICAgICAnZG9tLmRpc2FibGVfb3Blbl9kdXJpbmdfbG9hZCc6IGZhbHNlLFxuICAgICAgICAvLyBFbmFibGUgdGhlIHN1cHBvcnQgZm9yIEZpbGUgb2JqZWN0IGNyZWF0aW9uIGluIHRoZSBjb250ZW50IHByb2Nlc3NcbiAgICAgICAgLy8gUmVxdWlyZWQgZm9yIHxQYWdlLnNldEZpbGVJbnB1dEZpbGVzfCBwcm90b2NvbCBtZXRob2QuXG4gICAgICAgICdkb20uZmlsZS5jcmVhdGVJbkNoaWxkJzogdHJ1ZSxcbiAgICAgICAgLy8gRGlzYWJsZSB0aGUgUHJvY2Vzc0hhbmdNb25pdG9yXG4gICAgICAgICdkb20uaXBjLnJlcG9ydFByb2Nlc3NIYW5ncyc6IGZhbHNlLFxuICAgICAgICAvLyBEaXNhYmxlIHNsb3cgc2NyaXB0IGRpYWxvZ3Vlc1xuICAgICAgICAnZG9tLm1heF9jaHJvbWVfc2NyaXB0X3J1bl90aW1lJzogMCxcbiAgICAgICAgJ2RvbS5tYXhfc2NyaXB0X3J1bl90aW1lJzogMCxcbiAgICAgICAgLy8gT25seSBsb2FkIGV4dGVuc2lvbnMgZnJvbSB0aGUgYXBwbGljYXRpb24gYW5kIHVzZXIgcHJvZmlsZVxuICAgICAgICAvLyBBZGRvbk1hbmFnZXIuU0NPUEVfUFJPRklMRSArIEFkZG9uTWFuYWdlci5TQ09QRV9BUFBMSUNBVElPTlxuICAgICAgICAnZXh0ZW5zaW9ucy5hdXRvRGlzYWJsZVNjb3Blcyc6IDAsXG4gICAgICAgICdleHRlbnNpb25zLmVuYWJsZWRTY29wZXMnOiA1LFxuICAgICAgICAvLyBEaXNhYmxlIG1ldGFkYXRhIGNhY2hpbmcgZm9yIGluc3RhbGxlZCBhZGQtb25zIGJ5IGRlZmF1bHRcbiAgICAgICAgJ2V4dGVuc2lvbnMuZ2V0QWRkb25zLmNhY2hlLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gRGlzYWJsZSBpbnN0YWxsaW5nIGFueSBkaXN0cmlidXRpb24gZXh0ZW5zaW9ucyBvciBhZGQtb25zLlxuICAgICAgICAnZXh0ZW5zaW9ucy5pbnN0YWxsRGlzdHJvQWRkb25zJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGVkIHNjcmVlbnNob3RzIGV4dGVuc2lvblxuICAgICAgICAnZXh0ZW5zaW9ucy5zY3JlZW5zaG90cy5kaXNhYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIFR1cm4gb2ZmIGV4dGVuc2lvbiB1cGRhdGVzIHNvIHRoZXkgZG8gbm90IGJvdGhlciB0ZXN0c1xuICAgICAgICAnZXh0ZW5zaW9ucy51cGRhdGUuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBUdXJuIG9mZiBleHRlbnNpb24gdXBkYXRlcyBzbyB0aGV5IGRvIG5vdCBib3RoZXIgdGVzdHNcbiAgICAgICAgJ2V4dGVuc2lvbnMudXBkYXRlLm5vdGlmeVVzZXInOiBmYWxzZSxcbiAgICAgICAgLy8gTWFrZSBzdXJlIG9wZW5pbmcgYWJvdXQ6YWRkb25zIHdpbGwgbm90IGhpdCB0aGUgbmV0d29ya1xuICAgICAgICAnZXh0ZW5zaW9ucy53ZWJzZXJ2aWNlLmRpc2NvdmVyVVJMJzogYGh0dHA6Ly8ke3NlcnZlcn0vZHVtbXkvZGlzY292ZXJ5VVJMYCxcbiAgICAgICAgLy8gQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGhhdmUgZm9jdXMgZXZlbiBpdCBydW5zIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICdmb2N1c21hbmFnZXIudGVzdG1vZGUnOiB0cnVlLFxuICAgICAgICAvLyBEaXNhYmxlIHVzZXJhZ2VudCB1cGRhdGVzXG4gICAgICAgICdnZW5lcmFsLnVzZXJhZ2VudC51cGRhdGVzLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gQWx3YXlzIHVzZSBuZXR3b3JrIHByb3ZpZGVyIGZvciBnZW9sb2NhdGlvbiB0ZXN0cyBzbyB3ZSBieXBhc3MgdGhlXG4gICAgICAgIC8vIG1hY09TIGRpYWxvZyByYWlzZWQgYnkgdGhlIGNvcmVsb2NhdGlvbiBwcm92aWRlclxuICAgICAgICAnZ2VvLnByb3ZpZGVyLnRlc3RpbmcnOiB0cnVlLFxuICAgICAgICAvLyBEbyBub3Qgc2NhbiBXaWZpXG4gICAgICAgICdnZW8ud2lmaS5zY2FuJzogZmFsc2UsXG4gICAgICAgIC8vIE5vIGhhbmcgbW9uaXRvclxuICAgICAgICAnaGFuZ21vbml0b3IudGltZW91dCc6IDAsXG4gICAgICAgIC8vIFNob3cgY2hyb21lIGVycm9ycyBhbmQgd2FybmluZ3MgaW4gdGhlIGVycm9yIGNvbnNvbGVcbiAgICAgICAgJ2phdmFzY3JpcHQub3B0aW9ucy5zaG93SW5Db25zb2xlJzogdHJ1ZSxcbiAgICAgICAgLy8gRGlzYWJsZSBkb3dubG9hZCBhbmQgdXNhZ2Ugb2YgT3BlbkgyNjQ6IGFuZCBXaWRldmluZSBwbHVnaW5zXG4gICAgICAgICdtZWRpYS5nbXAtbWFuYWdlci51cGRhdGVFbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgdGhlIEdGWCBzYW5pdHkgd2luZG93XG4gICAgICAgICdtZWRpYS5zYW5pdHktdGVzdC5kaXNhYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIERpc2FibGUgZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBOaWdodGx5XG4gICAgICAgICduZXR3b3JrLmNvb2tpZS5zYW1lU2l0ZS5sYXhCeURlZmF1bHQnOiBmYWxzZSxcbiAgICAgICAgLy8gRG8gbm90IHByb21wdCBmb3IgdGVtcG9yYXJ5IHJlZGlyZWN0c1xuICAgICAgICAnbmV0d29yay5odHRwLnByb21wdC10ZW1wLXJlZGlyZWN0JzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgc3BlY3VsYXRpdmUgY29ubmVjdGlvbnMgc28gdGhleSBhcmUgbm90IHJlcG9ydGVkIGFzIGxlYWtpbmdcbiAgICAgICAgLy8gd2hlbiB0aGV5IGFyZSBoYW5naW5nIGFyb3VuZFxuICAgICAgICAnbmV0d29yay5odHRwLnNwZWN1bGF0aXZlLXBhcmFsbGVsLWxpbWl0JzogMCxcbiAgICAgICAgLy8gRG8gbm90IGF1dG9tYXRpY2FsbHkgc3dpdGNoIGJldHdlZW4gb2ZmbGluZSBhbmQgb25saW5lXG4gICAgICAgICduZXR3b3JrLm1hbmFnZS1vZmZsaW5lLXN0YXR1cyc6IGZhbHNlLFxuICAgICAgICAvLyBNYWtlIHN1cmUgU05UUCByZXF1ZXN0cyBkbyBub3QgaGl0IHRoZSBuZXR3b3JrXG4gICAgICAgICduZXR3b3JrLnNudHAucG9vbHMnOiBzZXJ2ZXIsXG4gICAgICAgIC8vIERpc2FibGUgRmxhc2guXG4gICAgICAgICdwbHVnaW4uc3RhdGUuZmxhc2gnOiAwLFxuICAgICAgICAncHJpdmFjeS50cmFja2luZ3Byb3RlY3Rpb24uZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBDYW4gYmUgcmVtb3ZlZCBvbmNlIEZpcmVmb3ggODkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzEwODM5XG4gICAgICAgICdyZW1vdGUuZW5hYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIERvbid0IGRvIG5ldHdvcmsgY29ubmVjdGlvbnMgZm9yIG1pdG0gcHJpbWluZ1xuICAgICAgICAnc2VjdXJpdHkuY2VydGVycm9ycy5taXRtLnByaW1pbmcuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBMb2NhbCBkb2N1bWVudHMgaGF2ZSBhY2Nlc3MgdG8gYWxsIG90aGVyIGxvY2FsIGRvY3VtZW50cyxcbiAgICAgICAgLy8gaW5jbHVkaW5nIGRpcmVjdG9yeSBsaXN0aW5nc1xuICAgICAgICAnc2VjdXJpdHkuZmlsZXVyaS5zdHJpY3Rfb3JpZ2luX3BvbGljeSc6IGZhbHNlLFxuICAgICAgICAvLyBEbyBub3Qgd2FpdCBmb3IgdGhlIG5vdGlmaWNhdGlvbiBidXR0b24gc2VjdXJpdHkgZGVsYXlcbiAgICAgICAgJ3NlY3VyaXR5Lm5vdGlmaWNhdGlvbl9lbmFibGVfZGVsYXknOiAwLFxuICAgICAgICAvLyBFbnN1cmUgYmxvY2tsaXN0IHVwZGF0ZXMgZG8gbm90IGhpdCB0aGUgbmV0d29ya1xuICAgICAgICAnc2VydmljZXMuc2V0dGluZ3Muc2VydmVyJzogYGh0dHA6Ly8ke3NlcnZlcn0vZHVtbXkvYmxvY2tsaXN0L2AsXG4gICAgICAgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IGZpbGwgc2lnbi1pbiBmb3JtcyB3aXRoIGtub3duIHVzZXJuYW1lcyBhbmRcbiAgICAgICAgLy8gcGFzc3dvcmRzXG4gICAgICAgICdzaWdub24uYXV0b2ZpbGxGb3Jtcyc6IGZhbHNlLFxuICAgICAgICAvLyBEaXNhYmxlIHBhc3N3b3JkIGNhcHR1cmUsIHNvIHRoYXQgdGVzdHMgdGhhdCBpbmNsdWRlIGZvcm1zIGFyZSBub3RcbiAgICAgICAgLy8gaW5mbHVlbmNlZCBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIHBlcnNpc3RlbnQgZG9vcmhhbmdlciBub3RpZmljYXRpb25cbiAgICAgICAgJ3NpZ25vbi5yZW1lbWJlclNpZ25vbnMnOiBmYWxzZSxcbiAgICAgICAgLy8gRGlzYWJsZSBmaXJzdC1ydW4gd2VsY29tZSBwYWdlXG4gICAgICAgICdzdGFydHVwLmhvbWVwYWdlX3dlbGNvbWVfdXJsJzogJ2Fib3V0OmJsYW5rJyxcbiAgICAgICAgLy8gRGlzYWJsZSBmaXJzdC1ydW4gd2VsY29tZSBwYWdlXG4gICAgICAgICdzdGFydHVwLmhvbWVwYWdlX3dlbGNvbWVfdXJsLmFkZGl0aW9uYWwnOiAnJyxcbiAgICAgICAgLy8gRGlzYWJsZSBicm93c2VyIGFuaW1hdGlvbnMgKHRhYnMsIGZ1bGxzY3JlZW4sIHNsaWRpbmcgYWxlcnRzKVxuICAgICAgICAndG9vbGtpdC5jb3NtZXRpY0FuaW1hdGlvbnMuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBQcmV2ZW50IHN0YXJ0aW5nIGludG8gc2FmZSBtb2RlIGFmdGVyIGFwcGxpY2F0aW9uIGNyYXNoZXNcbiAgICAgICAgJ3Rvb2xraXQuc3RhcnR1cC5tYXhfcmVzdW1lZF9jcmFzaGVzJzogLTEsXG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihkZWZhdWx0UHJlZnMsIGV4dHJhUHJlZnMpO1xufVxuLyoqXG4gKiBQb3B1bGF0ZXMgdGhlIHVzZXIuanMgZmlsZSB3aXRoIGN1c3RvbSBwcmVmZXJlbmNlcyBhcyBuZWVkZWQgdG8gYWxsb3dcbiAqIEZpcmVmb3gncyBDRFAgc3VwcG9ydCB0byBwcm9wZXJseSBmdW5jdGlvbi4gVGhlc2UgcHJlZmVyZW5jZXMgd2lsbCBiZVxuICogYXV0b21hdGljYWxseSBjb3BpZWQgb3ZlciB0byBwcmVmcy5qcyBkdXJpbmcgc3RhcnR1cCBvZiBGaXJlZm94LiBUbyBiZVxuICogYWJsZSB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZXMgb2YgcHJlZmVyZW5jZXMgYSBiYWNrdXAgb2YgcHJlZnMuanNcbiAqIHdpbGwgYmUgY3JlYXRlZC5cbiAqXG4gKiBAcGFyYW0gcHJlZnMgLSBMaXN0IG9mIHByZWZlcmVuY2VzIHRvIGFkZC5cbiAqIEBwYXJhbSBwcm9maWxlUGF0aCAtIEZpcmVmb3ggcHJvZmlsZSB0byB3cml0ZSB0aGUgcHJlZmVyZW5jZXMgdG8uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUHJlZmVyZW5jZXMob3B0aW9ucykge1xuICAgIGNvbnN0IHByZWZzUGF0aCA9IHBhdGguam9pbihvcHRpb25zLnBhdGgsICdwcmVmcy5qcycpO1xuICAgIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucy5wcmVmZXJlbmNlcykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgcmV0dXJuIGB1c2VyX3ByZWYoJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9KTtgO1xuICAgIH0pO1xuICAgIC8vIFVzZSBhbGxTZXR0bGVkIHRvIHByZXZlbnQgY29ycnVwdGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ob3B0aW9ucy5wYXRoLCAndXNlci5qcycpLCBsaW5lcy5qb2luKCdcXG4nKSksXG4gICAgICAgIC8vIENyZWF0ZSBhIGJhY2t1cCBvZiB0aGUgcHJlZmVyZW5jZXMgZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXRzdHMuXG4gICAgICAgIGZzLnByb21pc2VzLmFjY2VzcyhwcmVmc1BhdGgsIGZzLmNvbnN0YW50cy5GX09LKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLmNvcHlGaWxlKHByZWZzUGF0aCwgcGF0aC5qb2luKG9wdGlvbnMucGF0aCwgJ3ByZWZzLmpzLnB1cHBldGVlcicpKTtcbiAgICAgICAgfSwgXG4gICAgICAgIC8vIFN3YWxsb3cgb25seSBpZiBmaWxlIGRvZXMgbm90IGV4aXN0XG4gICAgICAgICgpID0+IHsgfSksXG4gICAgXSk7XG4gICAgZm9yIChjb25zdCBjb21tYW5kIG9mIHJlc3VsdCkge1xuICAgICAgICBpZiAoY29tbWFuZC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIHRocm93IGNvbW1hbmQucmVhc29uO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhLCBiKSB7XG4gICAgLy8gVE9ETzogdGhpcyBpcyBhIG5vdCB2ZXJ5IHJlbGlhYmxlIGNoZWNrLlxuICAgIHJldHVybiBwYXJzZUludChhLnJlcGxhY2UoJy4nLCAnJyksIDE2KSAtIHBhcnNlSW50KGIucmVwbGFjZSgnLicsICcnKSwgMTYpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlyZWZveC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBTdXBwb3J0ZWQgYnJvd3NlcnMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIEJyb3dzZXI7XG4oZnVuY3Rpb24gKEJyb3dzZXIpIHtcbiAgICBCcm93c2VyW1wiQ0hST01FXCJdID0gXCJjaHJvbWVcIjtcbiAgICBCcm93c2VyW1wiQ0hST01FSEVBRExFU1NTSEVMTFwiXSA9IFwiY2hyb21lLWhlYWRsZXNzLXNoZWxsXCI7XG4gICAgQnJvd3NlcltcIkNIUk9NSVVNXCJdID0gXCJjaHJvbWl1bVwiO1xuICAgIEJyb3dzZXJbXCJGSVJFRk9YXCJdID0gXCJmaXJlZm94XCI7XG4gICAgQnJvd3NlcltcIkNIUk9NRURSSVZFUlwiXSA9IFwiY2hyb21lZHJpdmVyXCI7XG59KShCcm93c2VyIHx8IChCcm93c2VyID0ge30pKTtcbi8qKlxuICogUGxhdGZvcm0gbmFtZXMgdXNlZCB0byBpZGVudGlmeSBhIE9TIHBsYXRmb3JtIHggYXJjaGl0ZWN0dXJlIGNvbWJpbmF0aW9uIGluIHRoZSB3YXlcbiAqIHRoYXQgaXMgcmVsZXZhbnQgZm9yIHRoZSBicm93c2VyIGRvd25sb2FkLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBCcm93c2VyUGxhdGZvcm07XG4oZnVuY3Rpb24gKEJyb3dzZXJQbGF0Zm9ybSkge1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIkxJTlVYXCJdID0gXCJsaW51eFwiO1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIk1BQ1wiXSA9IFwibWFjXCI7XG4gICAgQnJvd3NlclBsYXRmb3JtW1wiTUFDX0FSTVwiXSA9IFwibWFjX2FybVwiO1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIldJTjMyXCJdID0gXCJ3aW4zMlwiO1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIldJTjY0XCJdID0gXCJ3aW42NFwiO1xufSkoQnJvd3NlclBsYXRmb3JtIHx8IChCcm93c2VyUGxhdGZvcm0gPSB7fSkpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgQnJvd3NlclRhZztcbihmdW5jdGlvbiAoQnJvd3NlclRhZykge1xuICAgIEJyb3dzZXJUYWdbXCJDQU5BUllcIl0gPSBcImNhbmFyeVwiO1xuICAgIEJyb3dzZXJUYWdbXCJOSUdIVExZXCJdID0gXCJuaWdodGx5XCI7XG4gICAgQnJvd3NlclRhZ1tcIkJFVEFcIl0gPSBcImJldGFcIjtcbiAgICBCcm93c2VyVGFnW1wiREVWXCJdID0gXCJkZXZcIjtcbiAgICBCcm93c2VyVGFnW1wiREVWRURJVElPTlwiXSA9IFwiZGV2ZWRpdGlvblwiO1xuICAgIEJyb3dzZXJUYWdbXCJTVEFCTEVcIl0gPSBcInN0YWJsZVwiO1xuICAgIEJyb3dzZXJUYWdbXCJFU1JcIl0gPSBcImVzclwiO1xuICAgIEJyb3dzZXJUYWdbXCJMQVRFU1RcIl0gPSBcImxhdGVzdFwiO1xufSkoQnJvd3NlclRhZyB8fCAoQnJvd3NlclRhZyA9IHt9KSk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBDaHJvbWVSZWxlYXNlQ2hhbm5lbDtcbihmdW5jdGlvbiAoQ2hyb21lUmVsZWFzZUNoYW5uZWwpIHtcbiAgICBDaHJvbWVSZWxlYXNlQ2hhbm5lbFtcIlNUQUJMRVwiXSA9IFwic3RhYmxlXCI7XG4gICAgQ2hyb21lUmVsZWFzZUNoYW5uZWxbXCJERVZcIl0gPSBcImRldlwiO1xuICAgIENocm9tZVJlbGVhc2VDaGFubmVsW1wiQ0FOQVJZXCJdID0gXCJjYW5hcnlcIjtcbiAgICBDaHJvbWVSZWxlYXNlQ2hhbm5lbFtcIkJFVEFcIl0gPSBcImJldGFcIjtcbn0pKENocm9tZVJlbGVhc2VDaGFubmVsIHx8IChDaHJvbWVSZWxlYXNlQ2hhbm5lbCA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmV4cG9ydCB7IGRlYnVnIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWJ1Zy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCB7IEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEJyb3dzZXJQbGF0Zm9ybSgpIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IG9zLnBsYXRmb3JtKCk7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlICdkYXJ3aW4nOlxuICAgICAgICAgICAgcmV0dXJuIG9zLmFyY2goKSA9PT0gJ2FybTY0J1xuICAgICAgICAgICAgICAgID8gQnJvd3NlclBsYXRmb3JtLk1BQ19BUk1cbiAgICAgICAgICAgICAgICA6IEJyb3dzZXJQbGF0Zm9ybS5NQUM7XG4gICAgICAgIGNhc2UgJ2xpbnV4JzpcbiAgICAgICAgICAgIHJldHVybiBCcm93c2VyUGxhdGZvcm0uTElOVVg7XG4gICAgICAgIGNhc2UgJ3dpbjMyJzpcbiAgICAgICAgICAgIHJldHVybiBvcy5hcmNoKCkgPT09ICd4NjQnIHx8XG4gICAgICAgICAgICAgICAgLy8gV2luZG93cyAxMSBmb3IgQVJNIHN1cHBvcnRzIHg2NCBlbXVsYXRpb25cbiAgICAgICAgICAgICAgICAob3MuYXJjaCgpID09PSAnYXJtNjQnICYmIGlzV2luZG93czExKG9zLnJlbGVhc2UoKSkpXG4gICAgICAgICAgICAgICAgPyBCcm93c2VyUGxhdGZvcm0uV0lONjRcbiAgICAgICAgICAgICAgICA6IEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLyoqXG4gKiBXaW5kb3dzIDExIGlzIGlkZW50aWZpZWQgYnkgdGhlIHZlcnNpb24gMTAuMC4yMjAwMCBvciBncmVhdGVyXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gaXNXaW5kb3dzMTEodmVyc2lvbikge1xuICAgIGNvbnN0IHBhcnRzID0gdmVyc2lvbi5zcGxpdCgnLicpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgIGNvbnN0IG1ham9yID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcbiAgICAgICAgY29uc3QgbWlub3IgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApO1xuICAgICAgICBjb25zdCBwYXRjaCA9IHBhcnNlSW50KHBhcnRzWzJdLCAxMCk7XG4gICAgICAgIHJldHVybiAobWFqb3IgPiAxMCB8fFxuICAgICAgICAgICAgKG1ham9yID09PSAxMCAmJiBtaW5vciA+IDApIHx8XG4gICAgICAgICAgICAobWFqb3IgPT09IDEwICYmIG1pbm9yID09PSAwICYmIHBhdGNoID49IDIyMDAwKSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRldGVjdFBsYXRmb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBleGVjIGFzIGV4ZWNDaGlsZFByb2Nlc3MsIHNwYXduU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyIH0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IGV4dHJhY3RaaXAgZnJvbSAnZXh0cmFjdC16aXAnO1xuaW1wb3J0IHRhciBmcm9tICd0YXItZnMnO1xuaW1wb3J0IGJ6aXAgZnJvbSAndW5iemlwMi1zdHJlYW0nO1xuY29uc3QgZXhlYyA9IHByb21pc2lmeShleGVjQ2hpbGRQcm9jZXNzKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bnBhY2tBcmNoaXZlKGFyY2hpdmVQYXRoLCBmb2xkZXJQYXRoKSB7XG4gICAgaWYgKGFyY2hpdmVQYXRoLmVuZHNXaXRoKCcuemlwJykpIHtcbiAgICAgICAgYXdhaXQgZXh0cmFjdFppcChhcmNoaXZlUGF0aCwgeyBkaXI6IGZvbGRlclBhdGggfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyY2hpdmVQYXRoLmVuZHNXaXRoKCcudGFyLmJ6MicpKSB7XG4gICAgICAgIGF3YWl0IGV4dHJhY3RUYXIoYXJjaGl2ZVBhdGgsIGZvbGRlclBhdGgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmNoaXZlUGF0aC5lbmRzV2l0aCgnLmRtZycpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGZvbGRlclBhdGgpO1xuICAgICAgICBhd2FpdCBpbnN0YWxsRE1HKGFyY2hpdmVQYXRoLCBmb2xkZXJQYXRoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJjaGl2ZVBhdGguZW5kc1dpdGgoJy5leGUnKSkge1xuICAgICAgICAvLyBGaXJlZm94IG9uIFdpbmRvd3MuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhhcmNoaXZlUGF0aCwgW2AvRXh0cmFjdERpcj0ke2ZvbGRlclBhdGh9YF0sIHtcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgIF9fY29tcGF0X2xheWVyOiAnUnVuQXNJbnZva2VyJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCAke2FyY2hpdmVQYXRofSB0byAke2ZvbGRlclBhdGh9OiAke3Jlc3VsdC5vdXRwdXR9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgYXJjaGl2ZSBmb3JtYXQ6ICR7YXJjaGl2ZVBhdGh9YCk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFRhcih0YXJQYXRoLCBmb2xkZXJQYXRoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChmdWxmaWxsLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdGFyU3RyZWFtID0gdGFyLmV4dHJhY3QoZm9sZGVyUGF0aCk7XG4gICAgICAgIHRhclN0cmVhbS5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgICB0YXJTdHJlYW0ub24oJ2ZpbmlzaCcsIGZ1bGZpbGwpO1xuICAgICAgICBjb25zdCByZWFkU3RyZWFtID0gY3JlYXRlUmVhZFN0cmVhbSh0YXJQYXRoKTtcbiAgICAgICAgcmVhZFN0cmVhbS5waXBlKGJ6aXAoKSkucGlwZSh0YXJTdHJlYW0pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbERNRyhkbWdQYXRoLCBmb2xkZXJQYXRoKSB7XG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWMoYGhkaXV0aWwgYXR0YWNoIC1ub2Jyb3dzZSAtbm9hdXRvb3BlbiBcIiR7ZG1nUGF0aH1cImApO1xuICAgIGNvbnN0IHZvbHVtZXMgPSBzdGRvdXQubWF0Y2goL1xcL1ZvbHVtZXNcXC8oLiopL20pO1xuICAgIGlmICghdm9sdW1lcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHZvbHVtZSBwYXRoIGluICR7c3Rkb3V0fWApO1xuICAgIH1cbiAgICBjb25zdCBtb3VudFBhdGggPSB2b2x1bWVzWzBdO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIobW91bnRQYXRoKTtcbiAgICAgICAgY29uc3QgYXBwTmFtZSA9IGZpbGVOYW1lcy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyAmJiBpdGVtLmVuZHNXaXRoKCcuYXBwJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWFwcE5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgYXBwIGluICR7bW91bnRQYXRofWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vdW50ZWRQYXRoID0gcGF0aC5qb2luKG1vdW50UGF0aCwgYXBwTmFtZSk7XG4gICAgICAgIGF3YWl0IGV4ZWMoYGNwIC1SIFwiJHttb3VudGVkUGF0aH1cIiBcIiR7Zm9sZGVyUGF0aH1cImApO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgZXhlYyhgaGRpdXRpbCBkZXRhY2ggXCIke21vdW50UGF0aH1cIiAtcXVpZXRgKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxlVXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgY3JlYXRlV3JpdGVTdHJlYW0gfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IHsgVVJMLCB1cmxUb0h0dHBPcHRpb25zIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IFByb3h5QWdlbnQgfSBmcm9tICdwcm94eS1hZ2VudCc7XG5leHBvcnQgZnVuY3Rpb24gaGVhZEh0dHBSZXF1ZXN0KHVybCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGh0dHBSZXF1ZXN0KHVybCwgJ0hFQUQnLCByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAvLyBjb25zdW1lIHJlc3BvbnNlIGRhdGEgZnJlZSBub2RlIHByb2Nlc3NcbiAgICAgICAgICAgIHJlc3BvbnNlLnJlc3VtZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5zdGF0dXNDb2RlID09PSAyMDApO1xuICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgIHJlcXVlc3Qub24oJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgbWV0aG9kLCByZXNwb25zZSwga2VlcEFsaXZlID0gdHJ1ZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHByb3RvY29sOiB1cmwucHJvdG9jb2wsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIHBvcnQ6IHVybC5wb3J0LFxuICAgICAgICBwYXRoOiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGtlZXBBbGl2ZSA/IHsgQ29ubmVjdGlvbjogJ2tlZXAtYWxpdmUnIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIGF1dGg6IHVybFRvSHR0cE9wdGlvbnModXJsKS5hdXRoLFxuICAgICAgICBhZ2VudDogbmV3IFByb3h5QWdlbnQoKSxcbiAgICB9O1xuICAgIGNvbnN0IHJlcXVlc3RDYWxsYmFjayA9IChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlICYmXG4gICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA+PSAzMDAgJiZcbiAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlIDwgNDAwICYmXG4gICAgICAgICAgICByZXMuaGVhZGVycy5sb2NhdGlvbikge1xuICAgICAgICAgICAgaHR0cFJlcXVlc3QobmV3IFVSTChyZXMuaGVhZGVycy5sb2NhdGlvbiksIG1ldGhvZCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgLy8gY29uc3VtZSByZXNwb25zZSBkYXRhIHRvIGZyZWUgdXAgbWVtb3J5XG4gICAgICAgICAgICAvLyBBbmQgcHJldmVudHMgdGhlIGNvbm5lY3Rpb24gZnJvbSBiZWluZyBrZXB0IGFsaXZlXG4gICAgICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZShyZXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCByZXF1ZXN0ID0gb3B0aW9ucy5wcm90b2NvbCA9PT0gJ2h0dHBzOidcbiAgICAgICAgPyBodHRwcy5yZXF1ZXN0KG9wdGlvbnMsIHJlcXVlc3RDYWxsYmFjaylcbiAgICAgICAgOiBodHRwLnJlcXVlc3Qob3B0aW9ucywgcmVxdWVzdENhbGxiYWNrKTtcbiAgICByZXF1ZXN0LmVuZCgpO1xuICAgIHJldHVybiByZXF1ZXN0O1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkRmlsZSh1cmwsIGRlc3RpbmF0aW9uUGF0aCwgcHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBkb3dubG9hZGVkQnl0ZXMgPSAwO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGZ1bmN0aW9uIG9uRGF0YShjaHVuaykge1xuICAgICAgICAgICAgZG93bmxvYWRlZEJ5dGVzICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIHByb2dyZXNzQ2FsbGJhY2soZG93bmxvYWRlZEJ5dGVzLCB0b3RhbEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gaHR0cFJlcXVlc3QodXJsLCAnR0VUJywgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBEb3dubG9hZCBmYWlsZWQ6IHNlcnZlciByZXR1cm5lZCBjb2RlICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX0uIFVSTDogJHt1cmx9YCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3VtZSByZXNwb25zZSBkYXRhIHRvIGZyZWUgdXAgbWVtb3J5XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gY3JlYXRlV3JpdGVTdHJlYW0oZGVzdGluYXRpb25QYXRoKTtcbiAgICAgICAgICAgIGZpbGUub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaWxlLm9uKCdlcnJvcicsIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzcG9uc2UucGlwZShmaWxlKTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMgPSBwYXJzZUludChyZXNwb25zZS5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddLCAxMCk7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgb25EYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlcXVlc3Qub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IGdldFRleHQodXJsKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBwYXJzZSBKU09OIGZyb20gJyArIHVybC50b1N0cmluZygpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dCh1cmwpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gaHR0cFJlcXVlc3QodXJsLCAnR0VUJywgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSAnJztcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYEdvdCBzdGF0dXMgY29kZSAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgICAgICAgICAgICAgZGF0YSArPSBjaHVuaztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzcG9uc2Uub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShTdHJpbmcoZGF0YSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdDaHJvbWUgdmVyc2lvbiBub3QgZm91bmQnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgcmVxdWVzdC5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cFV0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBta2RpciwgdW5saW5rIH0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQnJvd3NlciwgQnJvd3NlclBsYXRmb3JtLCBkb3dubG9hZFVybHMsIH0gZnJvbSAnLi9icm93c2VyLWRhdGEvYnJvd3Nlci1kYXRhLmpzJztcbmltcG9ydCB7IENhY2hlLCBJbnN0YWxsZWRCcm93c2VyIH0gZnJvbSAnLi9DYWNoZS5qcyc7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4vZGVidWcuanMnO1xuaW1wb3J0IHsgZGV0ZWN0QnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi9kZXRlY3RQbGF0Zm9ybS5qcyc7XG5pbXBvcnQgeyB1bnBhY2tBcmNoaXZlIH0gZnJvbSAnLi9maWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb3dubG9hZEZpbGUsIGdldEpTT04sIGhlYWRIdHRwUmVxdWVzdCB9IGZyb20gJy4vaHR0cFV0aWwuanMnO1xuY29uc3QgZGVidWdJbnN0YWxsID0gZGVidWcoJ3B1cHBldGVlcjpicm93c2VyczppbnN0YWxsJyk7XG5jb25zdCB0aW1lcyA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIGRlYnVnVGltZShsYWJlbCkge1xuICAgIHRpbWVzLnNldChsYWJlbCwgcHJvY2Vzcy5ocnRpbWUoKSk7XG59XG5mdW5jdGlvbiBkZWJ1Z1RpbWVFbmQobGFiZWwpIHtcbiAgICBjb25zdCBlbmQgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGltZXMuZ2V0KGxhYmVsKTtcbiAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb24gPSBlbmRbMF0gKiAxMDAwICsgZW5kWzFdIC8gMWU2IC0gKHN0YXJ0WzBdICogMTAwMCArIHN0YXJ0WzFdIC8gMWU2KTsgLy8gY2FsY3VsYXRlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICAgIGRlYnVnSW5zdGFsbChgRHVyYXRpb24gZm9yICR7bGFiZWx9OiAke2R1cmF0aW9ufW1zYCk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbChvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgb3B0aW9ucy51bnBhY2sgPz89IHRydWU7XG4gICAgaWYgKCFvcHRpb25zLnBsYXRmb3JtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRvd25sb2FkIGEgYmluYXJ5IGZvciB0aGUgcHJvdmlkZWQgcGxhdGZvcm06ICR7b3MucGxhdGZvcm0oKX0gKCR7b3MuYXJjaCgpfSlgKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gZ2V0RG93bmxvYWRVcmwob3B0aW9ucy5icm93c2VyLCBvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQsIG9wdGlvbnMuYmFzZVVybCk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGluc3RhbGxVcmwodXJsLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBJZiBjdXN0b20gYmFzZVVybCBpcyBwcm92aWRlZCwgZG8gbm90IGZhbGwgYmFjayB0byBDZlQgZGFzaGJvYXJkLlxuICAgICAgICBpZiAob3B0aW9ucy5iYXNlVXJsICYmICFvcHRpb25zLmZvcmNlRmFsbGJhY2tGb3JUZXN0aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbnN0YWxsKGBFcnJvciBkb3dubG9hZGluZyBmcm9tICR7dXJsfS5gKTtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLmJyb3dzZXIpIHtcbiAgICAgICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUU6XG4gICAgICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FRFJJVkVSOlxuICAgICAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NRUhFQURMRVNTU0hFTEw6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0luc3RhbGwoYFRyeWluZyB0byBmaW5kIGRvd25sb2FkIFVSTCB2aWEgaHR0cHM6Ly9nb29nbGVjaHJvbWVsYWJzLmdpdGh1Yi5pby9jaHJvbWUtZm9yLXRlc3RpbmcuYCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IChhd2FpdCBnZXRKU09OKG5ldyBVUkwoYGh0dHBzOi8vZ29vZ2xlY2hyb21lbGFicy5naXRodWIuaW8vY2hyb21lLWZvci10ZXN0aW5nLyR7b3B0aW9ucy5idWlsZElkfS5qc29uYCkpKTtcbiAgICAgICAgICAgICAgICBsZXQgcGxhdGZvcm0gPSAnJztcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMucGxhdGZvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSA9ICdsaW51eDY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0gPSAnbWFjLWFybTY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSA9ICdtYWMteDY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3dpbjMyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3dpbjY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB2ZXJzaW9uLmRvd25sb2Fkc1tvcHRpb25zLmJyb3dzZXJdPy5maW5kKGxpbmsgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGlua1sncGxhdGZvcm0nXSA9PT0gcGxhdGZvcm07XG4gICAgICAgICAgICAgICAgfSk/LnVybDtcbiAgICAgICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnSW5zdGFsbChgRmFsbGluZyBiYWNrIHRvIGRvd25sb2FkaW5nIGZyb20gJHt1cmx9LmApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgaW5zdGFsbFVybChuZXcgVVJMKHVybCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbGxVcmwodXJsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgaWYgKCFvcHRpb25zLnBsYXRmb3JtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRvd25sb2FkIGEgYmluYXJ5IGZvciB0aGUgcHJvdmlkZWQgcGxhdGZvcm06ICR7b3MucGxhdGZvcm0oKX0gKCR7b3MuYXJjaCgpfSlgKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWUgPSB1cmwudG9TdHJpbmcoKS5zcGxpdCgnLycpLnBvcCgpO1xuICAgIGFzc2VydChmaWxlTmFtZSwgYEEgbWFsZm9ybWVkIGRvd25sb2FkIFVSTCB3YXMgZm91bmQ6ICR7dXJsfS5gKTtcbiAgICBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZShvcHRpb25zLmNhY2hlRGlyKTtcbiAgICBjb25zdCBicm93c2VyUm9vdCA9IGNhY2hlLmJyb3dzZXJSb290KG9wdGlvbnMuYnJvd3Nlcik7XG4gICAgY29uc3QgYXJjaGl2ZVBhdGggPSBwYXRoLmpvaW4oYnJvd3NlclJvb3QsIGAke29wdGlvbnMuYnVpbGRJZH0tJHtmaWxlTmFtZX1gKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoYnJvd3NlclJvb3QpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGJyb3dzZXJSb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLnVucGFjaykge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhhcmNoaXZlUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmNoaXZlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1Z0luc3RhbGwoYERvd25sb2FkaW5nIGJpbmFyeSBmcm9tICR7dXJsfWApO1xuICAgICAgICBkZWJ1Z1RpbWUoJ2Rvd25sb2FkJyk7XG4gICAgICAgIGF3YWl0IGRvd25sb2FkRmlsZSh1cmwsIGFyY2hpdmVQYXRoLCBvcHRpb25zLmRvd25sb2FkUHJvZ3Jlc3NDYWxsYmFjayk7XG4gICAgICAgIGRlYnVnVGltZUVuZCgnZG93bmxvYWQnKTtcbiAgICAgICAgcmV0dXJuIGFyY2hpdmVQYXRoO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRQYXRoID0gY2FjaGUuaW5zdGFsbGF0aW9uRGlyKG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5wbGF0Zm9ybSwgb3B0aW9ucy5idWlsZElkKTtcbiAgICB0cnkge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhvdXRwdXRQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFsbGVkQnJvd3NlciA9IG5ldyBJbnN0YWxsZWRCcm93c2VyKGNhY2hlLCBvcHRpb25zLmJyb3dzZXIsIG9wdGlvbnMuYnVpbGRJZCwgb3B0aW9ucy5wbGF0Zm9ybSk7XG4gICAgICAgICAgICBpZiAoIWV4aXN0c1N5bmMoaW5zdGFsbGVkQnJvd3Nlci5leGVjdXRhYmxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBicm93c2VyIGZvbGRlciAoJHtvdXRwdXRQYXRofSkgZXhpc3RzIGJ1dCB0aGUgZXhlY3V0YWJsZSAoJHtpbnN0YWxsZWRCcm93c2VyLmV4ZWN1dGFibGVQYXRofSkgaXMgbWlzc2luZ2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxlZEJyb3dzZXI7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbnN0YWxsKGBEb3dubG9hZGluZyBiaW5hcnkgZnJvbSAke3VybH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlYnVnVGltZSgnZG93bmxvYWQnKTtcbiAgICAgICAgICAgIGF3YWl0IGRvd25sb2FkRmlsZSh1cmwsIGFyY2hpdmVQYXRoLCBvcHRpb25zLmRvd25sb2FkUHJvZ3Jlc3NDYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBkZWJ1Z1RpbWVFbmQoJ2Rvd25sb2FkJyk7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbnN0YWxsKGBJbnN0YWxsaW5nICR7YXJjaGl2ZVBhdGh9IHRvICR7b3V0cHV0UGF0aH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlYnVnVGltZSgnZXh0cmFjdCcpO1xuICAgICAgICAgICAgYXdhaXQgdW5wYWNrQXJjaGl2ZShhcmNoaXZlUGF0aCwgb3V0cHV0UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBkZWJ1Z1RpbWVFbmQoJ2V4dHJhY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnN0YWxsZWRCcm93c2VyID0gbmV3IEluc3RhbGxlZEJyb3dzZXIoY2FjaGUsIG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5idWlsZElkLCBvcHRpb25zLnBsYXRmb3JtKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYnVpbGRJZEFsaWFzKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGluc3RhbGxlZEJyb3dzZXIucmVhZE1ldGFkYXRhKCk7XG4gICAgICAgICAgICBtZXRhZGF0YS5hbGlhc2VzW29wdGlvbnMuYnVpbGRJZEFsaWFzXSA9IG9wdGlvbnMuYnVpbGRJZDtcbiAgICAgICAgICAgIGluc3RhbGxlZEJyb3dzZXIud3JpdGVNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbGxlZEJyb3dzZXI7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhhcmNoaXZlUGF0aCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHVubGluayhhcmNoaXZlUGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bmluc3RhbGwob3B0aW9ucykge1xuICAgIG9wdGlvbnMucGxhdGZvcm0gPz89IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSgpO1xuICAgIGlmICghb3B0aW9ucy5wbGF0Zm9ybSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkZXRlY3QgdGhlIGJyb3dzZXIgcGxhdGZvcm0gZm9yOiAke29zLnBsYXRmb3JtKCl9ICgke29zLmFyY2goKX0pYCk7XG4gICAgfVxuICAgIG5ldyBDYWNoZShvcHRpb25zLmNhY2hlRGlyKS51bmluc3RhbGwob3B0aW9ucy5icm93c2VyLCBvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQpO1xufVxuLyoqXG4gKiBSZXR1cm5zIG1ldGFkYXRhIGFib3V0IGJyb3dzZXJzIGluc3RhbGxlZCBpbiB0aGUgY2FjaGUgZGlyZWN0b3J5LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEluc3RhbGxlZEJyb3dzZXJzKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IENhY2hlKG9wdGlvbnMuY2FjaGVEaXIpLmdldEluc3RhbGxlZEJyb3dzZXJzKCk7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhbkRvd25sb2FkKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zLnBsYXRmb3JtID8/PSBkZXRlY3RCcm93c2VyUGxhdGZvcm0oKTtcbiAgICBpZiAoIW9wdGlvbnMucGxhdGZvcm0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZG93bmxvYWQgYSBiaW5hcnkgZm9yIHRoZSBwcm92aWRlZCBwbGF0Zm9ybTogJHtvcy5wbGF0Zm9ybSgpfSAoJHtvcy5hcmNoKCl9KWApO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgaGVhZEh0dHBSZXF1ZXN0KGdldERvd25sb2FkVXJsKG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5wbGF0Zm9ybSwgb3B0aW9ucy5idWlsZElkLCBvcHRpb25zLmJhc2VVcmwpKTtcbn1cbmZ1bmN0aW9uIGdldERvd25sb2FkVXJsKGJyb3dzZXIsIHBsYXRmb3JtLCBidWlsZElkLCBiYXNlVXJsKSB7XG4gICAgcmV0dXJuIG5ldyBVUkwoZG93bmxvYWRVcmxzW2Jyb3dzZXJdKHBsYXRmb3JtLCBidWlsZElkLCBiYXNlVXJsKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnN0YWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgYWNjZXNzU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcmVhZGxpbmUgZnJvbSAncmVhZGxpbmUnO1xuaW1wb3J0IHsgcmVzb2x2ZVN5c3RlbUV4ZWN1dGFibGVQYXRoLCB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG5pbXBvcnQgeyBDYWNoZSB9IGZyb20gJy4vQ2FjaGUuanMnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuL2RlYnVnLmpzJztcbmltcG9ydCB7IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vZGV0ZWN0UGxhdGZvcm0uanMnO1xuY29uc3QgZGVidWdMYXVuY2ggPSBkZWJ1ZygncHVwcGV0ZWVyOmJyb3dzZXJzOmxhdW5jaGVyJyk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVFeGVjdXRhYmxlUGF0aChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBDYWNoZShvcHRpb25zLmNhY2hlRGlyKS5jb21wdXRlRXhlY3V0YWJsZVBhdGgob3B0aW9ucyk7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTeXN0ZW1FeGVjdXRhYmxlUGF0aChvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgaWYgKCFvcHRpb25zLnBsYXRmb3JtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRvd25sb2FkIGEgYmluYXJ5IGZvciB0aGUgcHJvdmlkZWQgcGxhdGZvcm06ICR7b3MucGxhdGZvcm0oKX0gKCR7b3MuYXJjaCgpfSlgKTtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9IHJlc29sdmVTeXN0ZW1FeGVjdXRhYmxlUGF0aChvcHRpb25zLmJyb3dzZXIsIG9wdGlvbnMucGxhdGZvcm0sIG9wdGlvbnMuY2hhbm5lbCk7XG4gICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzU3luYyhwYXRoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgR29vZ2xlIENocm9tZSBleGVjdXRhYmxlIGZvciBjaGFubmVsICcke29wdGlvbnMuY2hhbm5lbH0nIGF0ICcke3BhdGh9Jy5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhdW5jaChvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9jZXNzKG9wdHMpO1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYID0gL15EZXZUb29scyBsaXN0ZW5pbmcgb24gKHdzOlxcL1xcLy4qKSQvO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBXRUJEUklWRVJfQklESV9XRUJTT0NLRVRfRU5EUE9JTlRfUkVHRVggPSAvXldlYkRyaXZlciBCaURpIGxpc3RlbmluZyBvbiAod3M6XFwvXFwvLiopJC87XG5jb25zdCBwcm9jZXNzTGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuY29uc3QgZGlzcGF0Y2hlcnMgPSB7XG4gICAgZXhpdDogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgcHJvY2Vzc0xpc3RlbmVycy5nZXQoJ2V4aXQnKT8uZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKC4uLmFyZ3MpO1xuICAgICAgICB9KTtcbiAgICB9LFxuICAgIFNJR0lOVDogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgcHJvY2Vzc0xpc3RlbmVycy5nZXQoJ1NJR0lOVCcpPy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIoLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgU0lHSFVQOiAoLi4uYXJncykgPT4ge1xuICAgICAgICBwcm9jZXNzTGlzdGVuZXJzLmdldCgnU0lHSFVQJyk/LmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlciguLi5hcmdzKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBTSUdURVJNOiAoLi4uYXJncykgPT4ge1xuICAgICAgICBwcm9jZXNzTGlzdGVuZXJzLmdldCgnU0lHVEVSTScpPy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIoLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH0sXG59O1xuZnVuY3Rpb24gc3Vic2NyaWJlVG9Qcm9jZXNzRXZlbnQoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBwcm9jZXNzTGlzdGVuZXJzLmdldChldmVudCkgfHwgW107XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHJvY2Vzcy5vbihldmVudCwgZGlzcGF0Y2hlcnNbZXZlbnRdKTtcbiAgICB9XG4gICAgbGlzdGVuZXJzLnB1c2goaGFuZGxlcik7XG4gICAgcHJvY2Vzc0xpc3RlbmVycy5zZXQoZXZlbnQsIGxpc3RlbmVycyk7XG59XG5mdW5jdGlvbiB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBwcm9jZXNzTGlzdGVuZXJzLmdldChldmVudCkgfHwgW107XG4gICAgY29uc3QgZXhpc3RpbmdMaXN0ZW5lcklkeCA9IGxpc3RlbmVycy5pbmRleE9mKGhhbmRsZXIpO1xuICAgIGlmIChleGlzdGluZ0xpc3RlbmVySWR4ID09PSAtMSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxpc3RlbmVycy5zcGxpY2UoZXhpc3RpbmdMaXN0ZW5lcklkeCwgMSk7XG4gICAgcHJvY2Vzc0xpc3RlbmVycy5zZXQoZXZlbnQsIGxpc3RlbmVycyk7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHJvY2Vzcy5vZmYoZXZlbnQsIGRpc3BhdGNoZXJzW2V2ZW50XSk7XG4gICAgfVxufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9jZXNzIHtcbiAgICAjZXhlY3V0YWJsZVBhdGg7XG4gICAgI2FyZ3M7XG4gICAgI2Jyb3dzZXJQcm9jZXNzO1xuICAgICNleGl0ZWQgPSBmYWxzZTtcbiAgICAvLyBUaGUgYnJvd3NlciBwcm9jZXNzIGNhbiBiZSBjbG9zZWQgZXh0ZXJuYWxseSBvciBmcm9tIHRoZSBkcml2ZXIgcHJvY2Vzcy4gV2VcbiAgICAvLyBuZWVkIHRvIGludm9rZSB0aGUgaG9va3Mgb25seSBvbmNlIHRob3VnaCBidXQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSB0aW1lc1xuICAgIC8vIHdlIHdpbGwgYmUgaW52b2tlZC5cbiAgICAjaG9va3NSYW4gPSBmYWxzZTtcbiAgICAjb25FeGl0SG9vayA9IGFzeW5jICgpID0+IHsgfTtcbiAgICAjYnJvd3NlclByb2Nlc3NFeGl0aW5nO1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgdGhpcy4jZXhlY3V0YWJsZVBhdGggPSBvcHRzLmV4ZWN1dGFibGVQYXRoO1xuICAgICAgICB0aGlzLiNhcmdzID0gb3B0cy5hcmdzID8/IFtdO1xuICAgICAgICBvcHRzLnBpcGUgPz89IGZhbHNlO1xuICAgICAgICBvcHRzLmR1bXBpbyA/Pz0gZmFsc2U7XG4gICAgICAgIG9wdHMuaGFuZGxlU0lHSU5UID8/PSB0cnVlO1xuICAgICAgICBvcHRzLmhhbmRsZVNJR1RFUk0gPz89IHRydWU7XG4gICAgICAgIG9wdHMuaGFuZGxlU0lHSFVQID8/PSB0cnVlO1xuICAgICAgICAvLyBPbiBub24td2luZG93cyBwbGF0Zm9ybXMsIGBkZXRhY2hlZDogdHJ1ZWAgbWFrZXMgY2hpbGQgcHJvY2VzcyBhXG4gICAgICAgIC8vIGxlYWRlciBvZiBhIG5ldyBwcm9jZXNzIGdyb3VwLCBtYWtpbmcgaXQgcG9zc2libGUgdG8ga2lsbCBjaGlsZFxuICAgICAgICAvLyBwcm9jZXNzIHRyZWUgd2l0aCBgLmtpbGwoLXBpZClgIGNvbW1hbmQuIEBzZWVcbiAgICAgICAgLy8gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9jaGlsZF9wcm9jZXNzLmh0bWwjY2hpbGRfcHJvY2Vzc19vcHRpb25zX2RldGFjaGVkXG4gICAgICAgIG9wdHMuZGV0YWNoZWQgPz89IHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMic7XG4gICAgICAgIGNvbnN0IHN0ZGlvID0gdGhpcy4jY29uZmlndXJlU3RkaW8oe1xuICAgICAgICAgICAgcGlwZTogb3B0cy5waXBlLFxuICAgICAgICAgICAgZHVtcGlvOiBvcHRzLmR1bXBpbyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVudiA9IG9wdHMuZW52IHx8IHt9O1xuICAgICAgICBkZWJ1Z0xhdW5jaChgTGF1bmNoaW5nICR7dGhpcy4jZXhlY3V0YWJsZVBhdGh9ICR7dGhpcy4jYXJncy5qb2luKCcgJyl9YCwge1xuICAgICAgICAgICAgZGV0YWNoZWQ6IG9wdHMuZGV0YWNoZWQsXG4gICAgICAgICAgICBlbnY6IE9iamVjdC5rZXlzKGVudikucmVkdWNlKChyZXMsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdwdXBwZXRlZXJfJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBlbnZba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH0sIHt9KSxcbiAgICAgICAgICAgIHN0ZGlvLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3MgPSBjaGlsZFByb2Nlc3Muc3Bhd24odGhpcy4jZXhlY3V0YWJsZVBhdGgsIHRoaXMuI2FyZ3MsIHtcbiAgICAgICAgICAgIGRldGFjaGVkOiBvcHRzLmRldGFjaGVkLFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgc3RkaW8sXG4gICAgICAgIH0pO1xuICAgICAgICBkZWJ1Z0xhdW5jaChgTGF1bmNoZWQgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9YCk7XG4gICAgICAgIGlmIChvcHRzLmR1bXBpbykge1xuICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Muc3RkZXJyPy5waXBlKHByb2Nlc3Muc3RkZXJyKTtcbiAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLnN0ZG91dD8ucGlwZShwcm9jZXNzLnN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICAgc3Vic2NyaWJlVG9Qcm9jZXNzRXZlbnQoJ2V4aXQnLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NFeGl0KTtcbiAgICAgICAgaWYgKG9wdHMuaGFuZGxlU0lHSU5UKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVUb1Byb2Nlc3NFdmVudCgnU0lHSU5UJywgdGhpcy4jb25Ecml2ZXJQcm9jZXNzU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5oYW5kbGVTSUdURVJNKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVUb1Byb2Nlc3NFdmVudCgnU0lHVEVSTScsIHRoaXMuI29uRHJpdmVyUHJvY2Vzc1NpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuaGFuZGxlU0lHSFVQKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVUb1Byb2Nlc3NFdmVudCgnU0lHSFVQJywgdGhpcy4jb25Ecml2ZXJQcm9jZXNzU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5vbkV4aXQpIHtcbiAgICAgICAgICAgIHRoaXMuI29uRXhpdEhvb2sgPSBvcHRzLm9uRXhpdDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNicm93c2VyUHJvY2Vzc0V4aXRpbmcgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNicm93c2VyUHJvY2Vzcy5vbmNlKCdleGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnTGF1bmNoKGBCcm93c2VyIHByb2Nlc3MgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9IG9uRXhpdGApO1xuICAgICAgICAgICAgICAgIHRoaXMuI2NsZWFyTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNydW5Ib29rcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgI3J1bkhvb2tzKCkge1xuICAgICAgICBpZiAodGhpcy4jaG9va3NSYW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNob29rc1JhbiA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuI29uRXhpdEhvb2soKTtcbiAgICB9XG4gICAgZ2V0IG5vZGVQcm9jZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlclByb2Nlc3M7XG4gICAgfVxuICAgICNjb25maWd1cmVTdGRpbyhvcHRzKSB7XG4gICAgICAgIGlmIChvcHRzLnBpcGUpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLmR1bXBpbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnLCAncGlwZScsICdwaXBlJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChvcHRzLmR1bXBpbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbJ3BpcGUnLCAncGlwZScsICdwaXBlJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWydwaXBlJywgJ2lnbm9yZScsICdwaXBlJ107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2NsZWFyTGlzdGVuZXJzKCkge1xuICAgICAgICB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoJ2V4aXQnLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NFeGl0KTtcbiAgICAgICAgdW5zdWJzY3JpYmVGcm9tUHJvY2Vzc0V2ZW50KCdTSUdJTlQnLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NTaWduYWwpO1xuICAgICAgICB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoJ1NJR1RFUk0nLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NTaWduYWwpO1xuICAgICAgICB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoJ1NJR0hVUCcsIHRoaXMuI29uRHJpdmVyUHJvY2Vzc1NpZ25hbCk7XG4gICAgfVxuICAgICNvbkRyaXZlclByb2Nlc3NFeGl0ID0gKF9jb2RlKSA9PiB7XG4gICAgICAgIHRoaXMua2lsbCgpO1xuICAgIH07XG4gICAgI29uRHJpdmVyUHJvY2Vzc1NpZ25hbCA9IChzaWduYWwpID0+IHtcbiAgICAgICAgc3dpdGNoIChzaWduYWwpIHtcbiAgICAgICAgICAgIGNhc2UgJ1NJR0lOVCc6XG4gICAgICAgICAgICAgICAgdGhpcy5raWxsKCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEzMCk7XG4gICAgICAgICAgICBjYXNlICdTSUdURVJNJzpcbiAgICAgICAgICAgIGNhc2UgJ1NJR0hVUCc6XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNydW5Ib29rcygpO1xuICAgICAgICBpZiAoIXRoaXMuI2V4aXRlZCkge1xuICAgICAgICAgICAgdGhpcy5raWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2Jyb3dzZXJQcm9jZXNzRXhpdGluZztcbiAgICB9XG4gICAgaGFzQ2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlclByb2Nlc3NFeGl0aW5nO1xuICAgIH1cbiAgICBraWxsKCkge1xuICAgICAgICBkZWJ1Z0xhdW5jaChgVHJ5aW5nIHRvIGtpbGwgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9YCk7XG4gICAgICAgIC8vIElmIHRoZSBwcm9jZXNzIGZhaWxlZCB0byBsYXVuY2ggKGZvciBleGFtcGxlIGlmIHRoZSBicm93c2VyIGV4ZWN1dGFibGUgcGF0aFxuICAgICAgICAvLyBpcyBpbnZhbGlkKSwgdGhlbiB0aGUgcHJvY2VzcyBkb2VzIG5vdCBnZXQgYSBwaWQgYXNzaWduZWQuIEEgY2FsbCB0b1xuICAgICAgICAvLyBgcHJvYy5raWxsYCB3b3VsZCBlcnJvciwgYXMgdGhlIGBwaWRgIHRvLWJlLWtpbGxlZCBjYW4gbm90IGJlIGZvdW5kLlxuICAgICAgICBpZiAodGhpcy4jYnJvd3NlclByb2Nlc3MgJiZcbiAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZCAmJlxuICAgICAgICAgICAgcGlkRXhpc3RzKHRoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGVidWdMYXVuY2goYEJyb3dzZXIgcHJvY2VzcyAke3RoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZH0gZXhpc3RzYCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkUHJvY2Vzcy5leGVjU3luYyhgdGFza2tpbGwgL3BpZCAke3RoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZH0gL1QgL0ZgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnTGF1bmNoKGBLaWxsaW5nICR7dGhpcy4jYnJvd3NlclByb2Nlc3MucGlkfSB1c2luZyB0YXNra2lsbCBmYWlsZWRgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXNra2lsbCBjYW4gZmFpbCB0byBraWxsIHRoZSBwcm9jZXNzIGUuZy4gZHVlIHRvIG1pc3NpbmcgcGVybWlzc2lvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyBraWxsIHRoZSBwcm9jZXNzIHZpYSBOb2RlIEFQSS4gVGhpcyBkZWxheXMga2lsbGluZyBvZiBhbGwgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlcyBvZiBgdGhpcy5wcm9jYCB1bnRpbCB0aGUgbWFpbiBOb2RlLmpzIHByb2Nlc3MgZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLmtpbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gbGludXggdGhlIHByb2Nlc3MgZ3JvdXAgY2FuIGJlIGtpbGxlZCB3aXRoIHRoZSBncm91cCBpZCBwcmVmaXhlZCB3aXRoXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgbWludXMgc2lnbi4gVGhlIHByb2Nlc3MgZ3JvdXAgaWQgaXMgdGhlIGdyb3VwIGxlYWRlcidzIHBpZC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0dyb3VwSWQgPSAtdGhpcy4jYnJvd3NlclByb2Nlc3MucGlkO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3NHcm91cElkLCAnU0lHS0lMTCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdMYXVuY2goYEtpbGxpbmcgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9IHVzaW5nIHByb2Nlc3Mua2lsbCBmYWlsZWRgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBLaWxsaW5nIHRoZSBwcm9jZXNzIGdyb3VwIGNhbiBmYWlsIGR1ZSBlLmcuIHRvIG1pc3NpbmcgcGVybWlzc2lvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyBraWxsIHRoZSBwcm9jZXNzIHZpYSBOb2RlIEFQSS4gVGhpcyBkZWxheXMga2lsbGluZyBvZiBhbGwgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlcyBvZiBgdGhpcy5wcm9jYCB1bnRpbCB0aGUgbWFpbiBOb2RlLmpzIHByb2Nlc3MgZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLmtpbGwoJ1NJR0tJTEwnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtQUk9DRVNTX0VSUk9SX0VYUExBTkFUSU9OfVxcbkVycm9yIGNhdXNlOiAke2lzRXJyb3JMaWtlKGVycm9yKSA/IGVycm9yLnN0YWNrIDogZXJyb3J9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2xlYXJMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgd2FpdEZvckxpbmVPdXRwdXQocmVnZXgsIHRpbWVvdXQgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy4jYnJvd3NlclByb2Nlc3Muc3RkZXJyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bicm93c2VyUHJvY2Vzc2AgZG9lcyBub3QgaGF2ZSBzdGRlcnIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UodGhpcy4jYnJvd3NlclByb2Nlc3Muc3RkZXJyKTtcbiAgICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmwub24oJ2xpbmUnLCBvbkxpbmUpO1xuICAgICAgICAgICAgcmwub24oJ2Nsb3NlJywgb25DbG9zZSk7XG4gICAgICAgICAgICB0aGlzLiNicm93c2VyUHJvY2Vzcy5vbignZXhpdCcsIG9uQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Mub24oJ2Vycm9yJywgb25DbG9zZSk7XG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSB0aW1lb3V0ID4gMCA/IHNldFRpbWVvdXQob25UaW1lb3V0LCB0aW1lb3V0KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmwub2ZmKCdsaW5lJywgb25MaW5lKTtcbiAgICAgICAgICAgICAgICBybC5vZmYoJ2Nsb3NlJywgb25DbG9zZSk7XG4gICAgICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Mub2ZmKCdleGl0Jywgb25DbG9zZSk7XG4gICAgICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Mub2ZmKCdlcnJvcicsIG9uQ2xvc2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG9uQ2xvc2UoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihbXG4gICAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gbGF1bmNoIHRoZSBicm93c2VyIHByb2Nlc3MhJHtlcnJvciA/ICcgJyArIGVycm9yLm1lc3NhZ2UgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAnVFJPVUJMRVNIT09USU5HOiBodHRwczovL3BwdHIuZGV2L3Ryb3VibGVzaG9vdGluZycsXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgIF0uam9pbignXFxuJykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUaW1lb3V0RXJyb3IoYFRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9IG1zIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBXUyBlbmRwb2ludCBVUkwgdG8gYXBwZWFyIGluIHN0ZG91dCFgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBvbkxpbmUobGluZSkge1xuICAgICAgICAgICAgICAgIHN0ZGVyciArPSBsaW5lICsgJ1xcbic7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSBSZWdFeHAgbWF0Y2hlcywgc28gdGhpcyB3aWxsIG9idmlvdXNseSBleGlzdC5cbiAgICAgICAgICAgICAgICByZXNvbHZlKG1hdGNoWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuY29uc3QgUFJPQ0VTU19FUlJPUl9FWFBMQU5BVElPTiA9IGBQdXBwZXRlZXIgd2FzIHVuYWJsZSB0byBraWxsIHRoZSBwcm9jZXNzIHdoaWNoIHJhbiB0aGUgYnJvd3NlciBiaW5hcnkuXG5UaGlzIG1lYW5zIHRoYXQsIG9uIGZ1dHVyZSBQdXBwZXRlZXIgbGF1bmNoZXMsIFB1cHBldGVlciBtaWdodCBub3QgYmUgYWJsZSB0byBsYXVuY2ggdGhlIGJyb3dzZXIuXG5QbGVhc2UgY2hlY2sgeW91ciBvcGVuIHByb2Nlc3NlcyBhbmQgZW5zdXJlIHRoYXQgdGhlIGJyb3dzZXIgcHJvY2Vzc2VzIHRoYXQgUHVwcGV0ZWVyIGxhdW5jaGVkIGhhdmUgYmVlbiBraWxsZWQuXG5JZiB5b3UgdGhpbmsgdGhpcyBpcyBhIGJ1ZywgcGxlYXNlIHJlcG9ydCBpdCBvbiB0aGUgUHVwcGV0ZWVyIGlzc3VlIHRyYWNrZXIuYDtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHBpZEV4aXN0cyhwaWQpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5raWxsKHBpZCwgMCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5jb2RlICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3JMaWtlKG9iaikge1xuICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsICYmICduYW1lJyBpbiBvYmogJiYgJ21lc3NhZ2UnIGluIG9iaik7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihvYmopIHtcbiAgICByZXR1cm4gKGlzRXJyb3JMaWtlKG9iaikgJiZcbiAgICAgICAgKCdlcnJubycgaW4gb2JqIHx8ICdjb2RlJyBpbiBvYmogfHwgJ3BhdGgnIGluIG9iaiB8fCAnc3lzY2FsbCcgaW4gb2JqKSk7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhdW5jaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHsgbGF1bmNoLCBjb21wdXRlRXhlY3V0YWJsZVBhdGgsIGNvbXB1dGVTeXN0ZW1FeGVjdXRhYmxlUGF0aCwgVGltZW91dEVycm9yLCBDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBXRUJEUklWRVJfQklESV9XRUJTT0NLRVRfRU5EUE9JTlRfUkVHRVgsIFByb2Nlc3MsIH0gZnJvbSAnLi9sYXVuY2guanMnO1xuZXhwb3J0IHsgaW5zdGFsbCwgZ2V0SW5zdGFsbGVkQnJvd3NlcnMsIGNhbkRvd25sb2FkLCB1bmluc3RhbGwsIH0gZnJvbSAnLi9pbnN0YWxsLmpzJztcbmV4cG9ydCB7IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vZGV0ZWN0UGxhdGZvcm0uanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUJ1aWxkSWQsIEJyb3dzZXIsIEJyb3dzZXJQbGF0Zm9ybSwgQ2hyb21lUmVsZWFzZUNoYW5uZWwsIGNyZWF0ZVByb2ZpbGUsIGdldFZlcnNpb25Db21wYXJhdG9yLCB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG5leHBvcnQgeyBDTEksIG1ha2VQcm9ncmVzc0NhbGxiYWNrIH0gZnJvbSAnLi9DTEkuanMnO1xuZXhwb3J0IHsgQ2FjaGUsIEluc3RhbGxlZEJyb3dzZXIgfSBmcm9tICcuL0NhY2hlLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1haW4uanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYWxpZ24gPSB7XG4gICAgcmlnaHQ6IGFsaWduUmlnaHQsXG4gICAgY2VudGVyOiBhbGlnbkNlbnRlclxufTtcbmNvbnN0IHRvcCA9IDA7XG5jb25zdCByaWdodCA9IDE7XG5jb25zdCBib3R0b20gPSAyO1xuY29uc3QgbGVmdCA9IDM7XG5leHBvcnQgY2xhc3MgVUkge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aDtcbiAgICAgICAgdGhpcy53cmFwID0gKF9hID0gb3B0cy53cmFwKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0cnVlO1xuICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICB9XG4gICAgc3BhbiguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLmRpdiguLi5hcmdzKTtcbiAgICAgICAgY29scy5zcGFuID0gdHJ1ZTtcbiAgICB9XG4gICAgcmVzZXRPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgIH1cbiAgICBkaXYoLi4uYXJncykge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGl2KCcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53cmFwICYmIHRoaXMuc2hvdWxkQXBwbHlMYXlvdXREU0woLi4uYXJncykgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxheW91dERTTChhcmdzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xzID0gYXJncy5tYXAoYXJnID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbEZyb21TdHJpbmcoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJvd3MucHVzaChjb2xzKTtcbiAgICAgICAgcmV0dXJuIGNvbHM7XG4gICAgfVxuICAgIHNob3VsZEFwcGx5TGF5b3V0RFNMKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgL1tcXHRcXG5dLy50ZXN0KGFyZ3NbMF0pO1xuICAgIH1cbiAgICBhcHBseUxheW91dERTTChzdHIpIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IHN0ci5zcGxpdCgnXFxuJykubWFwKHJvdyA9PiByb3cuc3BsaXQoJ1xcdCcpKTtcbiAgICAgICAgbGV0IGxlZnRDb2x1bW5XaWR0aCA9IDA7XG4gICAgICAgIC8vIHNpbXBsZSBoZXVyaXN0aWMgZm9yIGxheW91dCwgbWFrZSBzdXJlIHRoZVxuICAgICAgICAvLyBzZWNvbmQgY29sdW1uIGxpbmVzIHVwIGFsb25nIHRoZSBsZWZ0LWhhbmQuXG4gICAgICAgIC8vIGRvbid0IGFsbG93IHRoZSBmaXJzdCBjb2x1bW4gdG8gdGFrZSB1cCBtb3JlXG4gICAgICAgIC8vIHRoYW4gNTAlIG9mIHRoZSBzY3JlZW4uXG4gICAgICAgIHJvd3MuZm9yRWFjaChjb2x1bW5zID0+IHtcbiAgICAgICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA+IDEgJiYgbWl4aW4uc3RyaW5nV2lkdGgoY29sdW1uc1swXSkgPiBsZWZ0Q29sdW1uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsZWZ0Q29sdW1uV2lkdGggPSBNYXRoLm1pbihNYXRoLmZsb29yKHRoaXMud2lkdGggKiAwLjUpLCBtaXhpbi5zdHJpbmdXaWR0aChjb2x1bW5zWzBdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZW5lcmF0ZSBhIHRhYmxlOlxuICAgICAgICAvLyAgcmVwbGFjaW5nICcgJyB3aXRoIHBhZGRpbmcgY2FsY3VsYXRpb25zLlxuICAgICAgICAvLyAgdXNpbmcgdGhlIGFsZ29yaXRobWljYWxseSBnZW5lcmF0ZWQgd2lkdGguXG4gICAgICAgIHJvd3MuZm9yRWFjaChjb2x1bW5zID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGl2KC4uLmNvbHVtbnMubWFwKChyLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogci50cmltKCksXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IHRoaXMubWVhc3VyZVBhZGRpbmcociksXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAoaSA9PT0gMCAmJiBjb2x1bW5zLmxlbmd0aCA+IDEpID8gbGVmdENvbHVtbldpZHRoIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd3NbdGhpcy5yb3dzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBjb2xGcm9tU3RyaW5nKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICBwYWRkaW5nOiB0aGlzLm1lYXN1cmVQYWRkaW5nKHRleHQpXG4gICAgICAgIH07XG4gICAgfVxuICAgIG1lYXN1cmVQYWRkaW5nKHN0cikge1xuICAgICAgICAvLyBtZWFzdXJlIHBhZGRpbmcgd2l0aG91dCBhbnNpIGVzY2FwZSBjb2Rlc1xuICAgICAgICBjb25zdCBub0Fuc2kgPSBtaXhpbi5zdHJpcEFuc2koc3RyKTtcbiAgICAgICAgcmV0dXJuIFswLCBub0Fuc2kubWF0Y2goL1xccyokLylbMF0ubGVuZ3RoLCAwLCBub0Fuc2kubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoXTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgICAgIHRoaXMucm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvd1RvU3RyaW5nKHJvdywgbGluZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZG9uJ3QgZGlzcGxheSBhbnkgbGluZXMgd2l0aCB0aGVcbiAgICAgICAgLy8gaGlkZGVuIGZsYWcgc2V0LlxuICAgICAgICByZXR1cm4gbGluZXNcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiAhbGluZS5oaWRkZW4pXG4gICAgICAgICAgICAubWFwKGxpbmUgPT4gbGluZS50ZXh0KVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgICByb3dUb1N0cmluZyhyb3csIGxpbmVzKSB7XG4gICAgICAgIHRoaXMucmFzdGVyaXplKHJvdykuZm9yRWFjaCgocnJvdywgcikgPT4ge1xuICAgICAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICAgICAgcnJvdy5mb3JFYWNoKChjb2wsIGMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoIH0gPSByb3dbY107IC8vIHRoZSB3aWR0aCB3aXRoIHBhZGRpbmcuXG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcFdpZHRoID0gdGhpcy5uZWdhdGVQYWRkaW5nKHJvd1tjXSk7IC8vIHRoZSB3aWR0aCB3aXRob3V0IHBhZGRpbmcuXG4gICAgICAgICAgICAgICAgbGV0IHRzID0gY29sOyAvLyB0ZW1wb3Jhcnkgc3RyaW5nIHVzZWQgZHVyaW5nIGFsaWdubWVudC9wYWRkaW5nLlxuICAgICAgICAgICAgICAgIGlmICh3cmFwV2lkdGggPiBtaXhpbi5zdHJpbmdXaWR0aChjb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRzICs9ICcgJy5yZXBlYXQod3JhcFdpZHRoIC0gbWl4aW4uc3RyaW5nV2lkdGgoY29sKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFsaWduIHRoZSBzdHJpbmcgd2l0aGluIGl0cyBjb2x1bW4uXG4gICAgICAgICAgICAgICAgaWYgKHJvd1tjXS5hbGlnbiAmJiByb3dbY10uYWxpZ24gIT09ICdsZWZ0JyAmJiB0aGlzLndyYXApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm4gPSBhbGlnbltyb3dbY10uYWxpZ25dO1xuICAgICAgICAgICAgICAgICAgICB0cyA9IGZuKHRzLCB3cmFwV2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWl4aW4uc3RyaW5nV2lkdGgodHMpIDwgd3JhcFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cyArPSAnICcucmVwZWF0KCh3aWR0aCB8fCAwKSAtIG1peGluLnN0cmluZ1dpZHRoKHRzKSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFwcGx5IGJvcmRlciBhbmQgcGFkZGluZyB0byBzdHJpbmcuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHJvd1tjXS5wYWRkaW5nIHx8IFswLCAwLCAwLCAwXTtcbiAgICAgICAgICAgICAgICBpZiAocGFkZGluZ1tsZWZ0XSkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnLnJlcGVhdChwYWRkaW5nW2xlZnRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyICs9IGFkZEJvcmRlcihyb3dbY10sIHRzLCAnfCAnKTtcbiAgICAgICAgICAgICAgICBzdHIgKz0gdHM7XG4gICAgICAgICAgICAgICAgc3RyICs9IGFkZEJvcmRlcihyb3dbY10sIHRzLCAnIHwnKTtcbiAgICAgICAgICAgICAgICBpZiAocGFkZGluZ1tyaWdodF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJy5yZXBlYXQocGFkZGluZ1tyaWdodF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiBwcmlvciByb3cgaXMgc3BhbiwgdHJ5IHRvIHJlbmRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHJvdyBvbiB0aGUgcHJpb3IgbGluZS5cbiAgICAgICAgICAgICAgICBpZiAociA9PT0gMCAmJiBsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMucmVuZGVySW5saW5lKHN0ciwgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UuXG4gICAgICAgICAgICBsaW5lcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBzdHIucmVwbGFjZSgvICskLywgJycpLFxuICAgICAgICAgICAgICAgIHNwYW46IHJvdy5zcGFuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG4gICAgLy8gaWYgdGhlIGZ1bGwgJ3NvdXJjZScgY2FuIHJlbmRlciBpblxuICAgIC8vIHRoZSB0YXJnZXQgbGluZSwgZG8gc28uXG4gICAgcmVuZGVySW5saW5lKHNvdXJjZSwgcHJldmlvdXNMaW5lKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gc291cmNlLm1hdGNoKC9eICovKTtcbiAgICAgICAgY29uc3QgbGVhZGluZ1doaXRlc3BhY2UgPSBtYXRjaCA/IG1hdGNoWzBdLmxlbmd0aCA6IDA7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHByZXZpb3VzTGluZS50ZXh0O1xuICAgICAgICBjb25zdCB0YXJnZXRUZXh0V2lkdGggPSBtaXhpbi5zdHJpbmdXaWR0aCh0YXJnZXQudHJpbVJpZ2h0KCkpO1xuICAgICAgICBpZiAoIXByZXZpb3VzTGluZS5zcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBhcHBseWluZyB3cmFwcGluZyBsb2dpYyxcbiAgICAgICAgLy8ganVzdCBhbHdheXMgYXBwZW5kIHRvIHRoZSBzcGFuLlxuICAgICAgICBpZiAoIXRoaXMud3JhcCkge1xuICAgICAgICAgICAgcHJldmlvdXNMaW5lLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICsgc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZWFkaW5nV2hpdGVzcGFjZSA8IHRhcmdldFRleHRXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91c0xpbmUuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRhcmdldC50cmltUmlnaHQoKSArICcgJy5yZXBlYXQobGVhZGluZ1doaXRlc3BhY2UgLSB0YXJnZXRUZXh0V2lkdGgpICsgc291cmNlLnRyaW1MZWZ0KCk7XG4gICAgfVxuICAgIHJhc3Rlcml6ZShyb3cpIHtcbiAgICAgICAgY29uc3QgcnJvd3MgPSBbXTtcbiAgICAgICAgY29uc3Qgd2lkdGhzID0gdGhpcy5jb2x1bW5XaWR0aHMocm93KTtcbiAgICAgICAgbGV0IHdyYXBwZWQ7XG4gICAgICAgIC8vIHdvcmQgd3JhcCBhbGwgY29sdW1ucywgYW5kIGNyZWF0ZVxuICAgICAgICAvLyBhIGRhdGEtc3RydWN0dXJlIHRoYXQgaXMgZWFzeSB0byByYXN0ZXJpemUuXG4gICAgICAgIHJvdy5mb3JFYWNoKChjb2wsIGMpID0+IHtcbiAgICAgICAgICAgIC8vIGxlYXZlIHJvb20gZm9yIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcuXG4gICAgICAgICAgICBjb2wud2lkdGggPSB3aWR0aHNbY107XG4gICAgICAgICAgICBpZiAodGhpcy53cmFwKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZCA9IG1peGluLndyYXAoY29sLnRleHQsIHRoaXMubmVnYXRlUGFkZGluZyhjb2wpLCB7IGhhcmQ6IHRydWUgfSkuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZCA9IGNvbC50ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC51bnNoaWZ0KCcuJyArICctJy5yZXBlYXQodGhpcy5uZWdhdGVQYWRkaW5nKGNvbCkgKyAyKSArICcuJyk7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC5wdXNoKFwiJ1wiICsgJy0nLnJlcGVhdCh0aGlzLm5lZ2F0ZVBhZGRpbmcoY29sKSArIDIpICsgXCInXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkIHRvcCBhbmQgYm90dG9tIHBhZGRpbmcuXG4gICAgICAgICAgICBpZiAoY29sLnBhZGRpbmcpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnVuc2hpZnQoLi4ubmV3IEFycmF5KGNvbC5wYWRkaW5nW3RvcF0gfHwgMCkuZmlsbCgnJykpO1xuICAgICAgICAgICAgICAgIHdyYXBwZWQucHVzaCguLi5uZXcgQXJyYXkoY29sLnBhZGRpbmdbYm90dG9tXSB8fCAwKS5maWxsKCcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cmFwcGVkLmZvckVhY2goKHN0ciwgcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcnJvd3Nbcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgcnJvd3MucHVzaChbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJyb3cgPSBycm93c1tyXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnJvd1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBycm93LnB1c2goJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJyb3cucHVzaChzdHIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcnJvd3M7XG4gICAgfVxuICAgIG5lZ2F0ZVBhZGRpbmcoY29sKSB7XG4gICAgICAgIGxldCB3cmFwV2lkdGggPSBjb2wud2lkdGggfHwgMDtcbiAgICAgICAgaWYgKGNvbC5wYWRkaW5nKSB7XG4gICAgICAgICAgICB3cmFwV2lkdGggLT0gKGNvbC5wYWRkaW5nW2xlZnRdIHx8IDApICsgKGNvbC5wYWRkaW5nW3JpZ2h0XSB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICAgICAgd3JhcFdpZHRoIC09IDQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyYXBXaWR0aDtcbiAgICB9XG4gICAgY29sdW1uV2lkdGhzKHJvdykge1xuICAgICAgICBpZiAoIXRoaXMud3JhcCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLndpZHRoIHx8IG1peGluLnN0cmluZ1dpZHRoKGNvbC50ZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCB1bnNldCA9IHJvdy5sZW5ndGg7XG4gICAgICAgIGxldCByZW1haW5pbmdXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIC8vIGNvbHVtbiB3aWR0aHMgY2FuIGJlIHNldCBpbiBjb25maWcuXG4gICAgICAgIGNvbnN0IHdpZHRocyA9IHJvdy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgIGlmIChjb2wud2lkdGgpIHtcbiAgICAgICAgICAgICAgICB1bnNldC0tO1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZ1dpZHRoIC09IGNvbC53aWR0aDtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFueSB1bnNldCB3aWR0aHMgc2hvdWxkIGJlIGNhbGN1bGF0ZWQuXG4gICAgICAgIGNvbnN0IHVuc2V0V2lkdGggPSB1bnNldCA/IE1hdGguZmxvb3IocmVtYWluaW5nV2lkdGggLyB1bnNldCkgOiAwO1xuICAgICAgICByZXR1cm4gd2lkdGhzLm1hcCgodywgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh1bnNldFdpZHRoLCBfbWluV2lkdGgocm93W2ldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkQm9yZGVyKGNvbCwgdHMsIHN0eWxlKSB7XG4gICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgaWYgKC9bLiddLStbLiddLy50ZXN0KHRzKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cy50cmltKCkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcgICc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cbi8vIGNhbGN1bGF0ZXMgdGhlIG1pbmltdW0gd2lkdGggb2Zcbi8vIGEgY29sdW1uLCBiYXNlZCBvbiBwYWRkaW5nIHByZWZlcmVuY2VzLlxuZnVuY3Rpb24gX21pbldpZHRoKGNvbCkge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBjb2wucGFkZGluZyB8fCBbXTtcbiAgICBjb25zdCBtaW5XaWR0aCA9IDEgKyAocGFkZGluZ1tsZWZ0XSB8fCAwKSArIChwYWRkaW5nW3JpZ2h0XSB8fCAwKTtcbiAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICByZXR1cm4gbWluV2lkdGggKyA0O1xuICAgIH1cbiAgICByZXR1cm4gbWluV2lkdGg7XG59XG5mdW5jdGlvbiBnZXRXaW5kb3dXaWR0aCgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZGVwZW5kcyBvbiB0ZXJtaW5hbCAqL1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy5zdGRvdXQgJiYgcHJvY2Vzcy5zdGRvdXQuY29sdW1ucykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRvdXQuY29sdW1ucztcbiAgICB9XG4gICAgcmV0dXJuIDgwO1xufVxuZnVuY3Rpb24gYWxpZ25SaWdodChzdHIsIHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBjb25zdCBzdHJXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHN0cik7XG4gICAgaWYgKHN0cldpZHRoIDwgd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuICcgJy5yZXBlYXQod2lkdGggLSBzdHJXaWR0aCkgKyBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBhbGlnbkNlbnRlcihzdHIsIHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBjb25zdCBzdHJXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHN0cik7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoc3RyV2lkdGggPj0gd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuICcgJy5yZXBlYXQoKHdpZHRoIC0gc3RyV2lkdGgpID4+IDEpICsgc3RyO1xufVxubGV0IG1peGluO1xuZXhwb3J0IGZ1bmN0aW9uIGNsaXVpKG9wdHMsIF9taXhpbikge1xuICAgIG1peGluID0gX21peGluO1xuICAgIHJldHVybiBuZXcgVUkoe1xuICAgICAgICB3aWR0aDogKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy53aWR0aCkgfHwgZ2V0V2luZG93V2lkdGgoKSxcbiAgICAgICAgd3JhcDogb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLndyYXBcbiAgICB9KTtcbn1cbiIsIi8vIE1pbmltYWwgcmVwbGFjZW1lbnQgZm9yIGFuc2kgc3RyaW5nIGhlbHBlcnMgXCJ3cmFwLWFuc2lcIiBhbmQgXCJzdHJpcC1hbnNpXCIuXG4vLyB0byBmYWNpbGl0YXRlIEVTTSBhbmQgRGVubyBtb2R1bGVzLlxuLy8gVE9ETzogbG9vayBhdCBwb3J0aW5nIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3dyYXAtYW5zaSB0byBFU00uXG4vLyBUaGUgbnBtIGFwcGxpY2F0aW9uXG4vLyBDb3B5cmlnaHQgKGMpIG5wbSwgSW5jLiBhbmQgQ29udHJpYnV0b3JzXG4vLyBMaWNlbnNlZCBvbiB0aGUgdGVybXMgb2YgVGhlIEFydGlzdGljIExpY2Vuc2UgMi4wXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vY2xpL2Jsb2IvNGM2NWNkOTUyYmM4NjI3ODExNzM1YmVhNzZiOWIxMTBjYzRmYzgwZS9saWIvdXRpbHMvYW5zaS10cmltLmpzXG5jb25zdCBhbnNpID0gbmV3IFJlZ0V4cCgnXFx4MWIoPzpcXFxcWyg/OlxcXFxkK1tBQkNERUZHSktTVG1dfFxcXFxkKztcXFxcZCtbSGZtXXwnICtcbiAgICAnXFxcXGQrO1xcXFxkKztcXFxcZCttfDZufHN8dXxcXFxcPzI1W2xoXSl8XFxcXHcpJywgJ2cnKTtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEFuc2koc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKGFuc2ksICcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3cmFwKHN0ciwgd2lkdGgpIHtcbiAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSBzdHIubWF0Y2goYW5zaSkgfHwgWycnLCAnJ107XG4gICAgc3RyID0gc3RyaXBBbnNpKHN0cik7XG4gICAgbGV0IHdyYXBwZWQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSAhPT0gMCAmJiAoaSAlIHdpZHRoKSA9PT0gMCkge1xuICAgICAgICAgICAgd3JhcHBlZCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB3cmFwcGVkICs9IHN0ci5jaGFyQXQoaSk7XG4gICAgfVxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgICAgd3JhcHBlZCA9IGAke3N0YXJ0fSR7d3JhcHBlZH0ke2VuZH1gO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlZDtcbn1cbiIsIi8vIEJvb3RzdHJhcCBjbGl1aSB3aXRoIENvbW1vbkpTIGRlcGVuZGVuY2llczpcbmltcG9ydCB7IGNsaXVpIH0gZnJvbSAnLi9idWlsZC9saWIvaW5kZXguanMnXG5pbXBvcnQgeyB3cmFwLCBzdHJpcEFuc2kgfSBmcm9tICcuL2J1aWxkL2xpYi9zdHJpbmctdXRpbHMuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVpIChvcHRzKSB7XG4gIHJldHVybiBjbGl1aShvcHRzLCB7XG4gICAgc3RyaW5nV2lkdGg6IChzdHIpID0+IHtcbiAgICAgIHJldHVybiBbLi4uc3RyXS5sZW5ndGhcbiAgICB9LFxuICAgIHN0cmlwQW5zaSxcbiAgICB3cmFwXG4gIH0pXG59XG4iLCJpbXBvcnQgY29tbWFuZGVyIGZyb20gJy4vaW5kZXguanMnO1xuXG4vLyB3cmFwcGVyIHRvIHByb3ZpZGUgbmFtZWQgZXhwb3J0cyBmb3IgRVNNLlxuZXhwb3J0IGNvbnN0IHtcbiAgcHJvZ3JhbSxcbiAgY3JlYXRlQ29tbWFuZCxcbiAgY3JlYXRlQXJndW1lbnQsXG4gIGNyZWF0ZU9wdGlvbixcbiAgQ29tbWFuZGVyRXJyb3IsXG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkT3B0aW9uQXJndW1lbnRFcnJvciwgLy8gZGVwcmVjYXRlZCBvbGQgbmFtZVxuICBDb21tYW5kLFxuICBBcmd1bWVudCxcbiAgT3B0aW9uLFxuICBIZWxwLFxufSA9IGNvbW1hbmRlcjtcbiIsImltcG9ydCB7IGRpcm5hbWUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IHJlYWRkaXJTeW5jLCBzdGF0U3luYyB9IGZyb20gJ2ZzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHN0YXJ0LCBjYWxsYmFjaykge1xuXHRsZXQgZGlyID0gcmVzb2x2ZSgnLicsIHN0YXJ0KTtcblx0bGV0IHRtcCwgc3RhdHMgPSBzdGF0U3luYyhkaXIpO1xuXG5cdGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuXHRcdGRpciA9IGRpcm5hbWUoZGlyKTtcblx0fVxuXG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0dG1wID0gY2FsbGJhY2soZGlyLCByZWFkZGlyU3luYyhkaXIpKTtcblx0XHRpZiAodG1wKSByZXR1cm4gcmVzb2x2ZShkaXIsIHRtcCk7XG5cdFx0ZGlyID0gZGlybmFtZSh0bXAgPSBkaXIpO1xuXHRcdGlmICh0bXAgPT09IGRpcikgYnJlYWs7XG5cdH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgbWVyZ2UsIHJhY2VXaXRoLCB9IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIGZyb21FbWl0dGVyRXZlbnQsIGZpbHRlckFzeW5jLCB0aW1lb3V0LCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzeW5jRGlzcG9zZVN5bWJvbCwgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgV0VCX1BFUk1JU1NJT05fVE9fUFJPVE9DT0xfUEVSTUlTU0lPTiA9IG5ldyBNYXAoW1xuICAgIFsnZ2VvbG9jYXRpb24nLCAnZ2VvbG9jYXRpb24nXSxcbiAgICBbJ21pZGknLCAnbWlkaSddLFxuICAgIFsnbm90aWZpY2F0aW9ucycsICdub3RpZmljYXRpb25zJ10sXG4gICAgLy8gVE9ETzogcHVzaCBpc24ndCBhIHZhbGlkIHR5cGU/XG4gICAgLy8gWydwdXNoJywgJ3B1c2gnXSxcbiAgICBbJ2NhbWVyYScsICd2aWRlb0NhcHR1cmUnXSxcbiAgICBbJ21pY3JvcGhvbmUnLCAnYXVkaW9DYXB0dXJlJ10sXG4gICAgWydiYWNrZ3JvdW5kLXN5bmMnLCAnYmFja2dyb3VuZFN5bmMnXSxcbiAgICBbJ2FtYmllbnQtbGlnaHQtc2Vuc29yJywgJ3NlbnNvcnMnXSxcbiAgICBbJ2FjY2VsZXJvbWV0ZXInLCAnc2Vuc29ycyddLFxuICAgIFsnZ3lyb3Njb3BlJywgJ3NlbnNvcnMnXSxcbiAgICBbJ21hZ25ldG9tZXRlcicsICdzZW5zb3JzJ10sXG4gICAgWydhY2Nlc3NpYmlsaXR5LWV2ZW50cycsICdhY2Nlc3NpYmlsaXR5RXZlbnRzJ10sXG4gICAgWydjbGlwYm9hcmQtcmVhZCcsICdjbGlwYm9hcmRSZWFkV3JpdGUnXSxcbiAgICBbJ2NsaXBib2FyZC13cml0ZScsICdjbGlwYm9hcmRSZWFkV3JpdGUnXSxcbiAgICBbJ2NsaXBib2FyZC1zYW5pdGl6ZWQtd3JpdGUnLCAnY2xpcGJvYXJkU2FuaXRpemVkV3JpdGUnXSxcbiAgICBbJ3BheW1lbnQtaGFuZGxlcicsICdwYXltZW50SGFuZGxlciddLFxuICAgIFsncGVyc2lzdGVudC1zdG9yYWdlJywgJ2R1cmFibGVTdG9yYWdlJ10sXG4gICAgWydpZGxlLWRldGVjdGlvbicsICdpZGxlRGV0ZWN0aW9uJ10sXG4gICAgLy8gY2hyb21lLXNwZWNpZmljIHBlcm1pc3Npb25zIHdlIGhhdmUuXG4gICAgWydtaWRpLXN5c2V4JywgJ21pZGlTeXNleCddLFxuXSk7XG4vKipcbiAqIHtAbGluayBCcm93c2VyfSByZXByZXNlbnRzIGEgYnJvd3NlciBpbnN0YW5jZSB0aGF0IGlzIGVpdGhlcjpcbiAqXG4gKiAtIGNvbm5lY3RlZCB0byB2aWEge0BsaW5rIFB1cHBldGVlci5jb25uZWN0fSBvclxuICogLSBsYXVuY2hlZCBieSB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXVuY2h9LlxuICpcbiAqIHtAbGluayBCcm93c2VyfSB7QGxpbmsgRXZlbnRFbWl0dGVyLmVtaXQgfCBlbWl0c30gdmFyaW91cyBldmVudHMgd2hpY2ggYXJlXG4gKiBkb2N1bWVudGVkIGluIHRoZSB7QGxpbmsgQnJvd3NlckV2ZW50fSBlbnVtLlxuICpcbiAqIEBleGFtcGxlIFVzaW5nIGEge0BsaW5rIEJyb3dzZXJ9IHRvIGNyZWF0ZSBhIHtAbGluayBQYWdlfTpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICpcbiAqIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gKiBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vZXhhbXBsZS5jb20nKTtcbiAqIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIERpc2Nvbm5lY3RpbmcgZnJvbSBhbmQgcmVjb25uZWN0aW5nIHRvIGEge0BsaW5rIEJyb3dzZXJ9OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gKlxuICogY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqIC8vIFN0b3JlIHRoZSBlbmRwb2ludCB0byBiZSBhYmxlIHRvIHJlY29ubmVjdCB0byB0aGUgYnJvd3Nlci5cbiAqIGNvbnN0IGJyb3dzZXJXU0VuZHBvaW50ID0gYnJvd3Nlci53c0VuZHBvaW50KCk7XG4gKiAvLyBEaXNjb25uZWN0IHB1cHBldGVlciBmcm9tIHRoZSBicm93c2VyLlxuICogYXdhaXQgYnJvd3Nlci5kaXNjb25uZWN0KCk7XG4gKlxuICogLy8gVXNlIHRoZSBlbmRwb2ludCB0byByZWVzdGFibGlzaCBhIGNvbm5lY3Rpb25cbiAqIGNvbnN0IGJyb3dzZXIyID0gYXdhaXQgcHVwcGV0ZWVyLmNvbm5lY3Qoe2Jyb3dzZXJXU0VuZHBvaW50fSk7XG4gKiAvLyBDbG9zZSB0aGUgYnJvd3Nlci5cbiAqIGF3YWl0IGJyb3dzZXIyLmNsb3NlKCk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBCcm93c2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgdW50aWwgYSB7QGxpbmsgVGFyZ2V0IHwgdGFyZ2V0fSBtYXRjaGluZyB0aGUgZ2l2ZW4gYHByZWRpY2F0ZWBcbiAgICAgKiBhcHBlYXJzIGFuZCByZXR1cm5zIGl0LlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGxvb2sgYWxsIG9wZW4ge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0c30uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBGaW5kaW5nIGEgdGFyZ2V0IGZvciBhIHBhZ2Ugb3BlbmVkIHZpYSBgd2luZG93Lm9wZW5gOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHdpbmRvdy5vcGVuKCdodHRwczovL3d3dy5leGFtcGxlLmNvbS8nKSk7XG4gICAgICogY29uc3QgbmV3V2luZG93VGFyZ2V0ID0gYXdhaXQgYnJvd3Nlci53YWl0Rm9yVGFyZ2V0KFxuICAgICAqICAgdGFyZ2V0ID0+IHRhcmdldC51cmwoKSA9PT0gJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tLydcbiAgICAgKiApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JUYXJnZXQocHJlZGljYXRlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyB0aW1lb3V0OiBtcyA9IDMwMDAwIH0gPSBvcHRpb25zO1xuICAgICAgICByZXR1cm4gYXdhaXQgZmlyc3RWYWx1ZUZyb20obWVyZ2UoZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInRhcmdldGNyZWF0ZWRcIiAvKiBCcm93c2VyRXZlbnQuVGFyZ2V0Q3JlYXRlZCAqLyksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJ0YXJnZXRjaGFuZ2VkXCIgLyogQnJvd3NlckV2ZW50LlRhcmdldENoYW5nZWQgKi8pLCBmcm9tKHRoaXMudGFyZ2V0cygpKSkucGlwZShmaWx0ZXJBc3luYyhwcmVkaWNhdGUpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGxpc3Qgb2YgYWxsIG9wZW4ge0BsaW5rIFBhZ2UgfCBwYWdlc30gaW5zaWRlIHRoaXMge0BsaW5rIEJyb3dzZXJ9LlxuICAgICAqXG4gICAgICogSWYgdGhlcmUgYXIgbXVsdGlwbGUge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0c30sIHRoaXNcbiAgICAgKiByZXR1cm5zIGFsbCB7QGxpbmsgUGFnZSB8IHBhZ2VzfSBpbiBhbGxcbiAgICAgKiB7QGxpbmsgQnJvd3NlckNvbnRleHQgfCBicm93c2VyIGNvbnRleHRzfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzIE5vbi12aXNpYmxlIHtAbGluayBQYWdlIHwgcGFnZXN9LCBzdWNoIGFzIGBcImJhY2tncm91bmRfcGFnZVwiYCxcbiAgICAgKiB3aWxsIG5vdCBiZSBsaXN0ZWQgaGVyZS4gWW91IGNhbiBmaW5kIHRoZW0gdXNpbmcge0BsaW5rIFRhcmdldC5wYWdlfS5cbiAgICAgKi9cbiAgICBhc3luYyBwYWdlcygpIHtcbiAgICAgICAgY29uc3QgY29udGV4dFBhZ2VzID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5icm93c2VyQ29udGV4dHMoKS5tYXAoY29udGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5wYWdlcygpO1xuICAgICAgICB9KSk7XG4gICAgICAgIC8vIEZsYXR0ZW4gYXJyYXkuXG4gICAgICAgIHJldHVybiBjb250ZXh0UGFnZXMucmVkdWNlKChhY2MsIHgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhY2MuY29uY2F0KHgpO1xuICAgICAgICB9LCBbXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgUHVwcGV0ZWVyIGlzIGNvbm5lY3RlZCB0byB0aGlzIHtAbGluayBCcm93c2VyIHwgYnJvd3Nlcn0uXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEJyb3dzZXIgfCBCcm93c2VyLmNvbm5lY3RlZH0uXG4gICAgICovXG4gICAgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFtkaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvY2VzcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmNsb3NlKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5kaXNjb25uZWN0KCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbYXN5bmNEaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvY2VzcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgbWVyZ2UsIHJhY2VXaXRoLCB9IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIGZyb21FbWl0dGVyRXZlbnQsIGZpbHRlckFzeW5jLCB0aW1lb3V0LCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzeW5jRGlzcG9zZVN5bWJvbCwgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG5pbXBvcnQgeyBNdXRleCB9IGZyb20gJy4uL3V0aWwvTXV0ZXguanMnO1xuLyoqXG4gKiB7QGxpbmsgQnJvd3NlckNvbnRleHR9IHJlcHJlc2VudHMgaW5kaXZpZHVhbCB1c2VyIGNvbnRleHRzIHdpdGhpbiBhXG4gKiB7QGxpbmsgQnJvd3NlciB8IGJyb3dzZXJ9LlxuICpcbiAqIFdoZW4gYSB7QGxpbmsgQnJvd3NlciB8IGJyb3dzZXJ9IGlzIGxhdW5jaGVkLCBpdCBoYXMgYSBzaW5nbGVcbiAqIHtAbGluayBCcm93c2VyQ29udGV4dCB8IGJyb3dzZXIgY29udGV4dH0gYnkgZGVmYXVsdC4gT3RoZXJzIGNhbiBiZSBjcmVhdGVkXG4gKiB1c2luZyB7QGxpbmsgQnJvd3Nlci5jcmVhdGVCcm93c2VyQ29udGV4dH0uIEVhY2ggY29udGV4dCBoYXMgaXNvbGF0ZWQgc3RvcmFnZVxuICogKGNvb2tpZXMvbG9jYWxTdG9yYWdlL2V0Yy4pXG4gKlxuICoge0BsaW5rIEJyb3dzZXJDb250ZXh0fSB7QGxpbmsgRXZlbnRFbWl0dGVyIHwgZW1pdHN9IHZhcmlvdXMgZXZlbnRzIHdoaWNoIGFyZVxuICogZG9jdW1lbnRlZCBpbiB0aGUge0BsaW5rIEJyb3dzZXJDb250ZXh0RXZlbnR9IGVudW0uXG4gKlxuICogSWYgYSB7QGxpbmsgUGFnZSB8IHBhZ2V9IG9wZW5zIGFub3RoZXIge0BsaW5rIFBhZ2UgfCBwYWdlfSwgZS5nLiB1c2luZ1xuICogYHdpbmRvdy5vcGVuYCwgdGhlIHBvcHVwIHdpbGwgYmVsb25nIHRvIHRoZSBwYXJlbnQge0BsaW5rIFBhZ2UuYnJvd3NlckNvbnRleHRcbiAqIHwgcGFnZSdzIGJyb3dzZXIgY29udGV4dH0uXG4gKlxuICogQGV4YW1wbGUgQ3JlYXRpbmcgYSBuZXcge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0fTpcbiAqXG4gKiBgYGB0c1xuICogLy8gQ3JlYXRlIGEgbmV3IGJyb3dzZXIgY29udGV4dFxuICogY29uc3QgY29udGV4dCA9IGF3YWl0IGJyb3dzZXIuY3JlYXRlQnJvd3NlckNvbnRleHQoKTtcbiAqIC8vIENyZWF0ZSBhIG5ldyBwYWdlIGluc2lkZSBjb250ZXh0LlxuICogY29uc3QgcGFnZSA9IGF3YWl0IGNvbnRleHQubmV3UGFnZSgpO1xuICogLy8gLi4uIGRvIHN0dWZmIHdpdGggcGFnZSAuLi5cbiAqIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICogLy8gRGlzcG9zZSBjb250ZXh0IG9uY2UgaXQncyBubyBsb25nZXIgbmVlZGVkLlxuICogYXdhaXQgY29udGV4dC5jbG9zZSgpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckNvbnRleHQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBkZWZpbmVkLCBpbmRpY2F0ZXMgYW4gb25nb2luZyBzY3JlZW5zaG90IG9wZXJlYXRpb24uXG4gICAgICovXG4gICAgI3BhZ2VTY3JlZW5zaG90TXV0ZXg7XG4gICAgI3NjcmVlbnNob3RPcGVyYXRpb25zQ291bnQgPSAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXJ0U2NyZWVuc2hvdCgpIHtcbiAgICAgICAgY29uc3QgbXV0ZXggPSB0aGlzLiNwYWdlU2NyZWVuc2hvdE11dGV4IHx8IG5ldyBNdXRleCgpO1xuICAgICAgICB0aGlzLiNwYWdlU2NyZWVuc2hvdE11dGV4ID0gbXV0ZXg7XG4gICAgICAgIHRoaXMuI3NjcmVlbnNob3RPcGVyYXRpb25zQ291bnQrKztcbiAgICAgICAgcmV0dXJuIG11dGV4LmFjcXVpcmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jc2NyZWVuc2hvdE9wZXJhdGlvbnNDb3VudC0tO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3NjcmVlbnNob3RPcGVyYXRpb25zQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG11dGV4IHRvIGluZGljYXRlIG5vIG9uZ29pbmcgc2NyZWVuc2hvdCBvcGVyYXRpb24uXG4gICAgICAgICAgICAgICAgdGhpcy4jcGFnZVNjcmVlbnNob3RNdXRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHdhaXRGb3JTY3JlZW5zaG90T3BlcmF0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3BhZ2VTY3JlZW5zaG90TXV0ZXg/LmFjcXVpcmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgdW50aWwgYSB7QGxpbmsgVGFyZ2V0IHwgdGFyZ2V0fSBtYXRjaGluZyB0aGUgZ2l2ZW4gYHByZWRpY2F0ZWBcbiAgICAgKiBhcHBlYXJzIGFuZCByZXR1cm5zIGl0LlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGxvb2sgYWxsIG9wZW4ge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0c30uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBGaW5kaW5nIGEgdGFyZ2V0IGZvciBhIHBhZ2Ugb3BlbmVkIHZpYSBgd2luZG93Lm9wZW5gOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHdpbmRvdy5vcGVuKCdodHRwczovL3d3dy5leGFtcGxlLmNvbS8nKSk7XG4gICAgICogY29uc3QgbmV3V2luZG93VGFyZ2V0ID0gYXdhaXQgYnJvd3NlckNvbnRleHQud2FpdEZvclRhcmdldChcbiAgICAgKiAgIHRhcmdldCA9PiB0YXJnZXQudXJsKCkgPT09ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8nXG4gICAgICogKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyB3YWl0Rm9yVGFyZ2V0KHByZWRpY2F0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgdGltZW91dDogbXMgPSAzMDAwMCB9ID0gb3B0aW9ucztcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1lcmdlKGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJ0YXJnZXRjcmVhdGVkXCIgLyogQnJvd3NlckNvbnRleHRFdmVudC5UYXJnZXRDcmVhdGVkICovKSwgZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInRhcmdldGNoYW5nZWRcIiAvKiBCcm93c2VyQ29udGV4dEV2ZW50LlRhcmdldENoYW5nZWQgKi8pLCBmcm9tKHRoaXMudGFyZ2V0cygpKSkucGlwZShmaWx0ZXJBc3luYyhwcmVkaWNhdGUpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIHtAbGluayBCcm93c2VyQ29udGV4dCB8IGJyb3dzZXIgY29udGV4dH0gaXMgY2xvc2VkLlxuICAgICAqL1xuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5icm93c2VyKCkuYnJvd3NlckNvbnRleHRzKCkuaW5jbHVkZXModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoaXMge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0fS5cbiAgICAgKi9cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHJldHVybiB2b2lkIHRoaXMuY2xvc2UoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFthc3luY0Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJDb250ZXh0LmpzLm1hcCIsImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuLyoqXG4gKiBFdmVudHMgdGhhdCB0aGUgQ0RQU2Vzc2lvbiBjbGFzcyBlbWl0cy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIENEUFNlc3Npb25FdmVudDtcbihmdW5jdGlvbiAoQ0RQU2Vzc2lvbkV2ZW50KSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQgPSBTeW1ib2woJ0NEUFNlc3Npb24uRGlzY29ubmVjdGVkJyk7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIENEUFNlc3Npb25FdmVudC5Td2FwcGVkID0gU3ltYm9sKCdDRFBTZXNzaW9uLlN3YXBwZWQnKTtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHNlc3Npb24gaXMgcmVhZHkgdG8gYmUgY29uZmlndXJlZCBkdXJpbmcgdGhlIGF1dG8tYXR0YWNoXG4gICAgICogcHJvY2Vzcy4gUmlnaHQgYWZ0ZXIgdGhlIGV2ZW50IGlzIGhhbmRsZWQsIHRoZSBzZXNzaW9uIHdpbGwgYmUgcmVzdW1lZC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIENEUFNlc3Npb25FdmVudC5SZWFkeSA9IFN5bWJvbCgnQ0RQU2Vzc2lvbi5SZWFkeScpO1xuICAgIENEUFNlc3Npb25FdmVudC5TZXNzaW9uQXR0YWNoZWQgPSAnc2Vzc2lvbmF0dGFjaGVkJztcbiAgICBDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkID0gJ3Nlc3Npb25kZXRhY2hlZCc7XG59KShDRFBTZXNzaW9uRXZlbnQgfHwgKENEUFNlc3Npb25FdmVudCA9IHt9KSk7XG4vKipcbiAqIFRoZSBgQ0RQU2Vzc2lvbmAgaW5zdGFuY2VzIGFyZSB1c2VkIHRvIHRhbGsgcmF3IENocm9tZSBEZXZ0b29scyBQcm90b2NvbC5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIFByb3RvY29sIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCB3aXRoIHtAbGluayBDRFBTZXNzaW9uLnNlbmR9IG1ldGhvZCBhbmQgcHJvdG9jb2xcbiAqIGV2ZW50cyBjYW4gYmUgc3Vic2NyaWJlZCB0byB3aXRoIGBDRFBTZXNzaW9uLm9uYCBtZXRob2QuXG4gKlxuICogVXNlZnVsIGxpbmtzOiB7QGxpbmsgaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvIHwgRGV2VG9vbHMgUHJvdG9jb2wgVmlld2VyfVxuICogYW5kIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNsdXNobmlrb3YvZ2V0dGluZy1zdGFydGVkLXdpdGgtY2RwL2Jsb2IvSEVBRC9SRUFETUUubWQgfCBHZXR0aW5nIFN0YXJ0ZWQgd2l0aCBEZXZUb29scyBQcm90b2NvbH0uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgY2xpZW50ID0gYXdhaXQgcGFnZS5jcmVhdGVDRFBTZXNzaW9uKCk7XG4gKiBhd2FpdCBjbGllbnQuc2VuZCgnQW5pbWF0aW9uLmVuYWJsZScpO1xuICogY2xpZW50Lm9uKCdBbmltYXRpb24uYW5pbWF0aW9uQ3JlYXRlZCcsICgpID0+XG4gKiAgIGNvbnNvbGUubG9nKCdBbmltYXRpb24gY3JlYXRlZCEnKVxuICogKTtcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnNlbmQoJ0FuaW1hdGlvbi5nZXRQbGF5YmFja1JhdGUnKTtcbiAqIGNvbnNvbGUubG9nKCdwbGF5YmFjayByYXRlIGlzICcgKyByZXNwb25zZS5wbGF5YmFja1JhdGUpO1xuICogYXdhaXQgY2xpZW50LnNlbmQoJ0FuaW1hdGlvbi5zZXRQbGF5YmFja1JhdGUnLCB7XG4gKiAgIHBsYXliYWNrUmF0ZTogcmVzcG9uc2UucGxheWJhY2tSYXRlIC8gMixcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQ0RQU2Vzc2lvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcmVudCBzZXNzaW9uIGluIHRlcm1zIG9mIENEUCdzIGF1dG8tYXR0YWNoIG1lY2hhbmlzbS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHBhcmVudFNlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q0RQU2Vzc2lvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuLyoqXG4gKiBEaWFsb2cgaW5zdGFuY2VzIGFyZSBkaXNwYXRjaGVkIGJ5IHRoZSB7QGxpbmsgUGFnZX0gdmlhIHRoZSBgZGlhbG9nYCBldmVudC5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAqXG4gKiAoYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiAgIHBhZ2Uub24oJ2RpYWxvZycsIGFzeW5jIGRpYWxvZyA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coZGlhbG9nLm1lc3NhZ2UoKSk7XG4gKiAgICAgYXdhaXQgZGlhbG9nLmRpc21pc3MoKTtcbiAqICAgICBhd2FpdCBicm93c2VyLmNsb3NlKCk7XG4gKiAgIH0pO1xuICogICBwYWdlLmV2YWx1YXRlKCgpID0+IGFsZXJ0KCcxJykpO1xuICogfSkoKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERpYWxvZyB7XG4gICAgI3R5cGU7XG4gICAgI21lc3NhZ2U7XG4gICAgI2RlZmF1bHRWYWx1ZTtcbiAgICAjaGFuZGxlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSA9ICcnKSB7XG4gICAgICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLiNtZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy4jZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0eXBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWVzc2FnZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByb21wdCwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBkaWFsb2dcbiAgICAgKiBpcyBub3QgYSBgcHJvbXB0YC5cbiAgICAgKi9cbiAgICBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRpYWxvZyBoYXMgYmVlbiBhY2NlcHRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9tcHRUZXh0IC0gb3B0aW9uYWwgdGV4dCB0aGF0IHdpbGwgYmUgZW50ZXJlZCBpbiB0aGUgZGlhbG9nXG4gICAgICogcHJvbXB0LiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBkaWFsb2cncyB0eXBlIGlzIG5vdCBgcHJvbXB0YC5cbiAgICAgKlxuICAgICAqL1xuICAgIGFzeW5jIGFjY2VwdChwcm9tcHRUZXh0KSB7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBhY2NlcHQgZGlhbG9nIHdoaWNoIGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgdGhpcy4jaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlKHtcbiAgICAgICAgICAgIGFjY2VwdDogdHJ1ZSxcbiAgICAgICAgICAgIHRleHQ6IHByb21wdFRleHQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIG9uY2UgdGhlIGRpYWxvZyBoYXMgYmVlbiBkaXNtaXNzZWRcbiAgICAgKi9cbiAgICBhc3luYyBkaXNtaXNzKCkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2hhbmRsZWQsICdDYW5ub3QgZGlzbWlzcyBkaWFsb2cgd2hpY2ggaXMgYWxyZWFkeSBoYW5kbGVkIScpO1xuICAgICAgICB0aGlzLiNoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGUoe1xuICAgICAgICAgICAgYWNjZXB0OiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGlhbG9nLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG52YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xudmFyIF9fc2V0RnVuY3Rpb25OYW1lID0gKHRoaXMgJiYgdGhpcy5fX3NldEZ1bmN0aW9uTmFtZSkgfHwgZnVuY3Rpb24gKGYsIG5hbWUsIHByZWZpeCkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5pbXBvcnQgeyBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvciB9IGZyb20gJy4uL2NvbW1vbi9HZXRRdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4uL2NvbW1vbi9MYXp5QXJnLmpzJztcbmltcG9ydCB7IGlzU3RyaW5nLCB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgQXN5bmNJdGVyYWJsZVV0aWwgfSBmcm9tICcuLi91dGlsL0FzeW5jSXRlcmFibGVVdGlsLmpzJztcbmltcG9ydCB7IHRocm93SWZEaXNwb3NlZCB9IGZyb20gJy4uL3V0aWwvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBfaXNFbGVtZW50SGFuZGxlIH0gZnJvbSAnLi9FbGVtZW50SGFuZGxlU3ltYm9sLmpzJztcbmltcG9ydCB7IEpTSGFuZGxlIH0gZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG4vKipcbiAqIEVsZW1lbnRIYW5kbGUgcmVwcmVzZW50cyBhbiBpbi1wYWdlIERPTSBlbGVtZW50LlxuICpcbiAqIEByZW1hcmtzXG4gKiBFbGVtZW50SGFuZGxlcyBjYW4gYmUgY3JlYXRlZCB3aXRoIHRoZSB7QGxpbmsgUGFnZS4kfSBtZXRob2QuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAqXG4gKiAoYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiAgIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICogICBjb25zdCBocmVmRWxlbWVudCA9IGF3YWl0IHBhZ2UuJCgnYScpO1xuICogICBhd2FpdCBocmVmRWxlbWVudC5jbGljaygpO1xuICogICAvLyAuLi5cbiAqIH0pKCk7XG4gKiBgYGBcbiAqXG4gKiBFbGVtZW50SGFuZGxlIHByZXZlbnRzIHRoZSBET00gZWxlbWVudCBmcm9tIGJlaW5nIGdhcmJhZ2UtY29sbGVjdGVkIHVubGVzcyB0aGVcbiAqIGhhbmRsZSBpcyB7QGxpbmsgSlNIYW5kbGUuZGlzcG9zZSB8IGRpc3Bvc2VkfS4gRWxlbWVudEhhbmRsZXMgYXJlIGF1dG8tZGlzcG9zZWRcbiAqIHdoZW4gdGhlaXIgb3JpZ2luIGZyYW1lIGdldHMgbmF2aWdhdGVkLlxuICpcbiAqIEVsZW1lbnRIYW5kbGUgaW5zdGFuY2VzIGNhbiBiZSB1c2VkIGFzIGFyZ3VtZW50cyBpbiB7QGxpbmsgUGFnZS4kZXZhbH0gYW5kXG4gKiB7QGxpbmsgUGFnZS5ldmFsdWF0ZX0gbWV0aG9kcy5cbiAqXG4gKiBJZiB5b3UncmUgdXNpbmcgVHlwZVNjcmlwdCwgRWxlbWVudEhhbmRsZSB0YWtlcyBhIGdlbmVyaWMgYXJndW1lbnQgdGhhdFxuICogZGVub3RlcyB0aGUgdHlwZSBvZiBlbGVtZW50IHRoZSBoYW5kbGUgaXMgaG9sZGluZyB3aXRoaW4uIEZvciBleGFtcGxlLCBpZiB5b3VcbiAqIGhhdmUgYSBoYW5kbGUgdG8gYSBgPHNlbGVjdD5gIGVsZW1lbnQsIHlvdSBjYW4gdHlwZSBpdCBhc1xuICogYEVsZW1lbnRIYW5kbGU8SFRNTFNlbGVjdEVsZW1lbnQ+YCBhbmQgeW91IGdldCBzb21lIG5pY2VyIHR5cGUgY2hlY2tzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xubGV0IEVsZW1lbnRIYW5kbGUgPSAoKCkgPT4ge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tLCBfbywgX3AsIF9xLCBfciwgX3MsIF90LCBfdSwgX3YsIF93LCBfeCwgX3ksIF96LCBfMCwgXzEsIF8yLCBfMywgXzQsIF81O1xuICAgIGxldCBfY2xhc3NTdXBlciA9IEpTSGFuZGxlO1xuICAgIGxldCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfZ2V0UHJvcGVydHlfZGVjb3JhdG9ycztcbiAgICBsZXQgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycztcbiAgICBsZXQgX2pzb25WYWx1ZV9kZWNvcmF0b3JzO1xuICAgIGxldCBfJF9kZWNvcmF0b3JzO1xuICAgIGxldCBfJCRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfJCRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfJCRfZGVzY3JpcHRvcjtcbiAgICBsZXQgX3dhaXRGb3JTZWxlY3Rvcl9kZWNvcmF0b3JzO1xuICAgIGxldCBfaXNWaXNpYmxlX2RlY29yYXRvcnM7XG4gICAgbGV0IF9pc0hpZGRlbl9kZWNvcmF0b3JzO1xuICAgIGxldCBfdG9FbGVtZW50X2RlY29yYXRvcnM7XG4gICAgbGV0IF9jbGlja2FibGVQb2ludF9kZWNvcmF0b3JzO1xuICAgIGxldCBfaG92ZXJfZGVjb3JhdG9ycztcbiAgICBsZXQgX2NsaWNrX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcmFnX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcmFnRW50ZXJfZGVjb3JhdG9ycztcbiAgICBsZXQgX2RyYWdPdmVyX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcm9wX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcmFnQW5kRHJvcF9kZWNvcmF0b3JzO1xuICAgIGxldCBfc2VsZWN0X2RlY29yYXRvcnM7XG4gICAgbGV0IF90YXBfZGVjb3JhdG9ycztcbiAgICBsZXQgX3RvdWNoU3RhcnRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3RvdWNoTW92ZV9kZWNvcmF0b3JzO1xuICAgIGxldCBfdG91Y2hFbmRfZGVjb3JhdG9ycztcbiAgICBsZXQgX2ZvY3VzX2RlY29yYXRvcnM7XG4gICAgbGV0IF90eXBlX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcmVzc19kZWNvcmF0b3JzO1xuICAgIGxldCBfYm91bmRpbmdCb3hfZGVjb3JhdG9ycztcbiAgICBsZXQgX2JveE1vZGVsX2RlY29yYXRvcnM7XG4gICAgbGV0IF9zY3JlZW5zaG90X2RlY29yYXRvcnM7XG4gICAgbGV0IF9pc0ludGVyc2VjdGluZ1ZpZXdwb3J0X2RlY29yYXRvcnM7XG4gICAgbGV0IF9zY3JvbGxJbnRvVmlld19kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBFbGVtZW50SGFuZGxlIGV4dGVuZHMgX2NsYXNzU3VwZXIge1xuICAgICAgICBzdGF0aWMge1xuICAgICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9nZXRQcm9wZXJ0eV9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX2EgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfYSldO1xuICAgICAgICAgICAgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9iID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2IpXTtcbiAgICAgICAgICAgIF9qc29uVmFsdWVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9jID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2MpXTtcbiAgICAgICAgICAgIF8kX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfZCA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9kKV07XG4gICAgICAgICAgICBfJCRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKV07XG4gICAgICAgICAgICBfcHJpdmF0ZV8kJF9kZWNvcmF0b3JzID0gWyhfZSA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9lKV07XG4gICAgICAgICAgICBfd2FpdEZvclNlbGVjdG9yX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfZiA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9mKV07XG4gICAgICAgICAgICBfaXNWaXNpYmxlX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfZyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9nKV07XG4gICAgICAgICAgICBfaXNIaWRkZW5fZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9oID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2gpXTtcbiAgICAgICAgICAgIF90b0VsZW1lbnRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9qID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2opXTtcbiAgICAgICAgICAgIF9jbGlja2FibGVQb2ludF9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX2sgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfayldO1xuICAgICAgICAgICAgX2hvdmVyX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfbCA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9sKV07XG4gICAgICAgICAgICBfY2xpY2tfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9tID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX20pXTtcbiAgICAgICAgICAgIF9kcmFnX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfbyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9vKV07XG4gICAgICAgICAgICBfZHJhZ0VudGVyX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfcCA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9wKV07XG4gICAgICAgICAgICBfZHJhZ092ZXJfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9xID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3EpXTtcbiAgICAgICAgICAgIF9kcm9wX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfciA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9yKV07XG4gICAgICAgICAgICBfZHJhZ0FuZERyb3BfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9zID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3MpXTtcbiAgICAgICAgICAgIF9zZWxlY3RfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF90ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3QpXTtcbiAgICAgICAgICAgIF90YXBfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF91ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3UpXTtcbiAgICAgICAgICAgIF90b3VjaFN0YXJ0X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfdiA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF92KV07XG4gICAgICAgICAgICBfdG91Y2hNb3ZlX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfdyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF93KV07XG4gICAgICAgICAgICBfdG91Y2hFbmRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF94ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3gpXTtcbiAgICAgICAgICAgIF9mb2N1c19kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX3kgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfeSldO1xuICAgICAgICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF96ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3opXTtcbiAgICAgICAgICAgIF9wcmVzc19kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoXzAgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfMCldO1xuICAgICAgICAgICAgX2JvdW5kaW5nQm94X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfMSA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF8xKV07XG4gICAgICAgICAgICBfYm94TW9kZWxfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF8yID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoXzIpXTtcbiAgICAgICAgICAgIF9zY3JlZW5zaG90X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfMyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF8zKV07XG4gICAgICAgICAgICBfaXNJbnRlcnNlY3RpbmdWaWV3cG9ydF9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoXzQgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfNCldO1xuICAgICAgICAgICAgX3Njcm9sbEludG9WaWV3X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfNSA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF81KV07XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2dldFByb3BlcnR5X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJnZXRQcm9wZXJ0eVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZ2V0UHJvcGVydHlcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5nZXRQcm9wZXJ0eSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZ2V0UHJvcGVydGllc19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZ2V0UHJvcGVydGllc1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZ2V0UHJvcGVydGllc1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmdldFByb3BlcnRpZXMgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2pzb25WYWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwianNvblZhbHVlXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJqc29uVmFsdWVcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5qc29uVmFsdWUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgXyRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIiRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai4kIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF8kJF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiJCRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIiQkXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouJCQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfJCRfZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jJCRpbXBsKHNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICB9LCBcIiMkJFwiKSB9LCBfcHJpdmF0ZV8kJF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiIyQkXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjJCQgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouIyQkIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF93YWl0Rm9yU2VsZWN0b3JfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIndhaXRGb3JTZWxlY3RvclwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwid2FpdEZvclNlbGVjdG9yXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoud2FpdEZvclNlbGVjdG9yIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9pc1Zpc2libGVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImlzVmlzaWJsZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiaXNWaXNpYmxlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaXNWaXNpYmxlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9pc0hpZGRlbl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiaXNIaWRkZW5cIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImlzSGlkZGVuXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaXNIaWRkZW4gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RvRWxlbWVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidG9FbGVtZW50XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ0b0VsZW1lbnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50b0VsZW1lbnQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2NsaWNrYWJsZVBvaW50X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJjbGlja2FibGVQb2ludFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiY2xpY2thYmxlUG9pbnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5jbGlja2FibGVQb2ludCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfaG92ZXJfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImhvdmVyXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJob3ZlclwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmhvdmVyIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9jbGlja19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiY2xpY2tcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImNsaWNrXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouY2xpY2sgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2RyYWdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImRyYWdcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyYWdcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5kcmFnIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9kcmFnRW50ZXJfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImRyYWdFbnRlclwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZHJhZ0VudGVyXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZHJhZ0VudGVyIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9kcmFnT3Zlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZHJhZ092ZXJcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyYWdPdmVyXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZHJhZ092ZXIgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2Ryb3BfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImRyb3BcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyb3BcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5kcm9wIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9kcmFnQW5kRHJvcF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZHJhZ0FuZERyb3BcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyYWdBbmREcm9wXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZHJhZ0FuZERyb3AgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3NlbGVjdF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2VsZWN0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzZWxlY3RcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5zZWxlY3QgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RhcF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidGFwXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ0YXBcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50YXAgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RvdWNoU3RhcnRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInRvdWNoU3RhcnRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInRvdWNoU3RhcnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50b3VjaFN0YXJ0IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF90b3VjaE1vdmVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInRvdWNoTW92ZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwidG91Y2hNb3ZlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudG91Y2hNb3ZlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF90b3VjaEVuZF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidG91Y2hFbmRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInRvdWNoRW5kXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudG91Y2hFbmQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2ZvY3VzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJmb2N1c1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZm9jdXNcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5mb2N1cyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfdHlwZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidHlwZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwidHlwZVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnR5cGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3ByZXNzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJwcmVzc1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwicHJlc3NcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5wcmVzcyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfYm91bmRpbmdCb3hfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImJvdW5kaW5nQm94XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJib3VuZGluZ0JveFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmJvdW5kaW5nQm94IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9ib3hNb2RlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiYm94TW9kZWxcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImJveE1vZGVsXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYm94TW9kZWwgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3NjcmVlbnNob3RfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInNjcmVlbnNob3RcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInNjcmVlbnNob3RcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5zY3JlZW5zaG90IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9pc0ludGVyc2VjdGluZ1ZpZXdwb3J0X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJpc0ludGVyc2VjdGluZ1ZpZXdwb3J0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJpc0ludGVyc2VjdGluZ1ZpZXdwb3J0XCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaXNJbnRlcnNlY3RpbmdWaWV3cG9ydCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2Nyb2xsSW50b1ZpZXdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInNjcm9sbEludG9WaWV3XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzY3JvbGxJbnRvVmlld1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNjcm9sbEludG9WaWV3IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICogQ2FjaGVkIGlzb2xhdGVkSGFuZGxlIHRvIHByZXZlbnRcbiAgICAgICAgICogdHJ5aW5nIHRvIGFkb3B0IGl0IG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAqL1xuICAgICAgICBpc29sYXRlZEhhbmRsZSA9IF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXMsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZ2l2ZW4gbWV0aG9kIHdpbGwgaGF2ZSBpdCdzIGB0aGlzYCByZXBsYWNlZCB3aXRoIGFuIGlzb2xhdGVkIHZlcnNpb24gb2ZcbiAgICAgICAgICogYHRoaXNgIHdoZW4gZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEFsbCBjaGFuZ2VzIG9mIGlzb2xhdGVkIGB0aGlzYCBhcmUgcmVmbGVjdGVkIG9uIHRoZSBhY3R1YWwgYHRoaXNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHN0YXRpYyBiaW5kSXNvbGF0ZWRIYW5kbGUodGFyZ2V0LCBfKSB7XG4gICAgICAgICAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaGFuZGxlIGlzIGFscmVhZHkgaXNvbGF0ZWQsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBhZG9wdCBpdFxuICAgICAgICAgICAgICAgIC8vIGFnYWluLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWxtID09PSB0aGlzLmZyYW1lLmlzb2xhdGVkUmVhbG0oKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGFyZ2V0LmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBhZG9wdGVkVGhpcztcbiAgICAgICAgICAgICAgICBpZiAodGhpc1snaXNvbGF0ZWRIYW5kbGUnXSkge1xuICAgICAgICAgICAgICAgICAgICBhZG9wdGVkVGhpcyA9IHRoaXNbJ2lzb2xhdGVkSGFuZGxlJ107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzWydpc29sYXRlZEhhbmRsZSddID0gYWRvcHRlZFRoaXMgPSBhd2FpdCB0aGlzLmZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRvcHRIYW5kbGUodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5jYWxsKGFkb3B0ZWRUaGlzLCAuLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBgYWRvcHRlZFRoaXNgLCB0aGVuIHdlIHJldHVybiBgdGhpc2AuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gYWRvcHRlZFRoaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgaGFuZGxlLCB0cmFuc2ZlciBpdCBpbnRvIHRoZSBjdXJyZW50IHJlYWxtLlxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBKU0hhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWFsbS50cmFuc2ZlckhhbmRsZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSBvZiBoYW5kbGVycywgdHJhbnNmZXIgdGhlbSBpbnRvIHRoZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcmVhbG0uXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChyZXN1bHQubWFwKGFzeW5jIChpdGVtLCBpbmRleCwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEpTSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGF3YWl0IHRoaXMucmVhbG0udHJhbnNmZXJIYW5kbGUoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbLi4ucmVzdWx0LmVudHJpZXMoKV0ubWFwKGFzeW5jIChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEpTSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIGF3YWl0IHRoaXMucmVhbG0udHJhbnNmZXJIYW5kbGUodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBoYW5kbGU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0cnVjdG9yKGhhbmRsZSkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlO1xuICAgICAgICAgICAgdGhpc1tfaXNFbGVtZW50SGFuZGxlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0IGlkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLmlkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZS5kaXNwb3NlZDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGdldFByb3BlcnRpZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGUuZ2V0UHJvcGVydGllcygpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICAgICAgcGFnZUZ1bmN0aW9uID0gd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSh0aGlzLmV2YWx1YXRlLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGUuZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBldmFsdWF0ZUhhbmRsZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy5ldmFsdWF0ZUhhbmRsZS5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlLmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMganNvblZhbHVlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlLmpzb25WYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgcmVtb3RlT2JqZWN0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLnJlbW90ZU9iamVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzRWxlbWVudCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBRdWVyaWVzIHRoZSBjdXJyZW50IGVsZW1lbnQgZm9yIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKiBAcmV0dXJucyBBIHtAbGluayBFbGVtZW50SGFuZGxlIHwgZWxlbWVudCBoYW5kbGV9IHRvIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICAgICAqIG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3Rvci4gT3RoZXJ3aXNlLCBgbnVsbGAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICBjb25zdCB7IHVwZGF0ZWRTZWxlY3RvciwgUXVlcnlIYW5kbGVyIH0gPSBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgICAgICByZXR1cm4gKGF3YWl0IFF1ZXJ5SGFuZGxlci5xdWVyeU9uZSh0aGlzLCB1cGRhdGVkU2VsZWN0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUXVlcmllcyB0aGUgY3VycmVudCBlbGVtZW50IGZvciBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB7QGxpbmsgRWxlbWVudEhhbmRsZSB8IGVsZW1lbnQgaGFuZGxlc30gdGhhdCBwb2ludCB0b1xuICAgICAgICAgKiBlbGVtZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkJChzZWxlY3Rvciwgb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmlzb2xhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuIyQkaW1wbChzZWxlY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jJCQoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJc29sYXRlcyB7QGxpbmsgRWxlbWVudEhhbmRsZS4kJH0gaWYgbmVlZGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGdldCAjJCQoKSB7IHJldHVybiBfcHJpdmF0ZV8kJF9kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIEVsZW1lbnRIYW5kbGUuJCR9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICMkJGltcGwoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlZFNlbGVjdG9yLCBRdWVyeUhhbmRsZXIgfSA9IGdldFF1ZXJ5SGFuZGxlckFuZFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBBc3luY0l0ZXJhYmxlVXRpbC5jb2xsZWN0KFF1ZXJ5SGFuZGxlci5xdWVyeUFsbCh0aGlzLCB1cGRhdGVkU2VsZWN0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gdGhlIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGluXG4gICAgICAgICAqIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdGlsbFxuICAgICAgICAgKiB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgdHdlZXRIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJy50d2VldCcpO1xuICAgICAgICAgKiBleHBlY3QoYXdhaXQgdHdlZXRIYW5kbGUuJGV2YWwoJy5saWtlJywgbm9kZSA9PiBub2RlLmlubmVyVGV4dCkpLnRvQmUoXG4gICAgICAgICAqICAgJzEwMCdcbiAgICAgICAgICogKTtcbiAgICAgICAgICogZXhwZWN0KGF3YWl0IHR3ZWV0SGFuZGxlLiRldmFsKCcucmV0d2VldHMnLCBub2RlID0+IG5vZGUuaW5uZXJUZXh0KSkudG9CZShcbiAgICAgICAgICogICAnMTAnXG4gICAgICAgICAqICk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKiBAcGFyYW0gcGFnZUZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZCBpbiB0aGlzIGVsZW1lbnQncyBwYWdlJ3NcbiAgICAgICAgICogY29udGV4dC4gVGhlIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yIHdpbGwgYmUgcGFzc2VkIGluIGFzIHRoZVxuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZfMSA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGFnZUZ1bmN0aW9uID0gd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSh0aGlzLiRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudEhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBhd2FpdCB0aGlzLiQoc2VsZWN0b3IpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3I6IGZhaWxlZCB0byBmaW5kIGVsZW1lbnQgbWF0Y2hpbmcgc2VsZWN0b3IgXCIke3NlbGVjdG9yfVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBlbGVtZW50SGFuZGxlLmV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgZW52XzEuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yXG4gICAgICAgICAqIGluIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdGlsbFxuICAgICAgICAgKiB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogSFRNTDpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgaHRtbFxuICAgICAgICAgKiA8ZGl2IGNsYXNzPVwiZmVlZFwiPlxuICAgICAgICAgKiAgIDxkaXYgY2xhc3M9XCJ0d2VldFwiPkhlbGxvITwvZGl2PlxuICAgICAgICAgKiAgIDxkaXYgY2xhc3M9XCJ0d2VldFwiPkhpITwvZGl2PlxuICAgICAgICAgKiA8L2Rpdj5cbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEphdmFTY3JpcHQ6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGZlZWRIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJy5mZWVkJyk7XG4gICAgICAgICAqIGV4cGVjdChcbiAgICAgICAgICogICBhd2FpdCBmZWVkSGFuZGxlLiQkZXZhbCgnLnR3ZWV0Jywgbm9kZXMgPT4gbm9kZXMubWFwKG4gPT4gbi5pbm5lclRleHQpKVxuICAgICAgICAgKiApLnRvRXF1YWwoWydIZWxsbyEnLCAnSGkhJ10pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC1cbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3NlbGVjdG9ycyB8IHNlbGVjdG9yfVxuICAgICAgICAgKiB0byBxdWVyeSBwYWdlIGZvci5cbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzIHwgQ1NTIHNlbGVjdG9yc31cbiAgICAgICAgICogY2FuIGJlIHBhc3NlZCBhcy1pcyBhbmQgYVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjbm9uLWNzcy1zZWxlY3RvcnMgfCBQdXBwZXRlZXItc3BlY2lmaWMgc2VsZWN0b3Igc3ludGF4fVxuICAgICAgICAgKiBhbGxvd3MgcXVlcmluZyBieVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjdGV4dC1zZWxlY3RvcnMtLXAtdGV4dCB8IHRleHR9LFxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjYXJpYS1zZWxlY3RvcnMtLXAtYXJpYSB8IGExMXkgcm9sZSBhbmQgbmFtZX0sXG4gICAgICAgICAqIGFuZFxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjeHBhdGgtc2VsZWN0b3JzLS1wLXhwYXRoIHwgeHBhdGh9XG4gICAgICAgICAqIGFuZFxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjcXVlcnlpbmctZWxlbWVudHMtaW4tc2hhZG93LWRvbSB8IGNvbWJpbmluZyB0aGVzZSBxdWVyaWVzIGFjcm9zcyBzaGFkb3cgcm9vdHN9LlxuICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNwZWNpZnkgdGhlIHNlbGVjdG9yIHR5cGUgdXNpbmcgYVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjcHJlZml4ZWQtc2VsZWN0b3Itc3ludGF4IHwgcHJlZml4fS5cbiAgICAgICAgICogQHBhcmFtIHBhZ2VGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBiZSBldmFsdWF0ZWQgaW4gdGhlIGVsZW1lbnQncyBwYWdlJ3NcbiAgICAgICAgICogY29udGV4dC4gQW4gYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIHdpbGwgYmUgcGFzc2VkIHRvXG4gICAgICAgICAqIHRoZSBmdW5jdGlvbiBhcyBpdHMgZmlyc3QgYXJndW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBgcGFnZUZ1bmN0aW9uYC5cbiAgICAgICAgICogQHJldHVybnMgQSBwcm9taXNlIHRvIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgJCRldmFsKHNlbGVjdG9yLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuJCRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuJCQoc2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzIsIGF3YWl0IHRoaXMuZXZhbHVhdGVIYW5kbGUoKF8sIC4uLmVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICAgICAgICAgICAgICB9LCAuLi5yZXN1bHRzKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5ldmFsdWF0ZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpLFxuICAgICAgICAgICAgICAgICAgICAuLi5yZXN1bHRzLm1hcChyZXN1bHRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzIpIHtcbiAgICAgICAgICAgICAgICBlbnZfMi5lcnJvciA9IGVfMjtcbiAgICAgICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXYWl0IGZvciBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciB0byBhcHBlYXIgaW4gdGhlIGN1cnJlbnRcbiAgICAgICAgICogZWxlbWVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogVW5saWtlIHtAbGluayBGcmFtZS53YWl0Rm9yU2VsZWN0b3J9LCB0aGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGFjcm9zc1xuICAgICAgICAgKiBuYXZpZ2F0aW9ucyBvciBpZiB0aGUgZWxlbWVudCBpcyBkZXRhY2hlZCBmcm9tIERPTS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKlxuICAgICAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgKiAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gICAgICAgICAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICAgKiAgIGxldCBjdXJyZW50VVJMO1xuICAgICAgICAgKiAgIHBhZ2VcbiAgICAgICAgICogICAgIC5tYWluRnJhbWUoKVxuICAgICAgICAgKiAgICAgLndhaXRGb3JTZWxlY3RvcignaW1nJylcbiAgICAgICAgICogICAgIC50aGVuKCgpID0+IGNvbnNvbGUubG9nKCdGaXJzdCBVUkwgd2l0aCBpbWFnZTogJyArIGN1cnJlbnRVUkwpKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICBmb3IgKGN1cnJlbnRVUkwgb2YgW1xuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZ29vZ2xlLmNvbScsXG4gICAgICAgICAqICAgICAnaHR0cHM6Ly9iYmMuY29tJyxcbiAgICAgICAgICogICBdKSB7XG4gICAgICAgICAqICAgICBhd2FpdCBwYWdlLmdvdG8oY3VycmVudFVSTCk7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIFRoZSBzZWxlY3RvciB0byBxdWVyeSBhbmQgd2FpdCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgY3VzdG9taXppbmcgd2FpdGluZyBiZWhhdmlvci5cbiAgICAgICAgICogQHJldHVybnMgQW4gZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqIEB0aHJvd3MgVGhyb3dzIGlmIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGRvZXNuJ3QgYXBwZWFyLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FpdEZvclNlbGVjdG9yKHNlbGVjdG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlZFNlbGVjdG9yLCBRdWVyeUhhbmRsZXIsIHBvbGxpbmcgfSA9IGdldFF1ZXJ5SGFuZGxlckFuZFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgUXVlcnlIYW5kbGVyLndhaXRGb3IodGhpcywgdXBkYXRlZFNlbGVjdG9yLCB7XG4gICAgICAgICAgICAgICAgcG9sbGluZyxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jICNjaGVja1Zpc2liaWxpdHkodmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXZhbHVhdGUoYXN5bmMgKGVsZW1lbnQsIFB1cHBldGVlclV0aWwsIHZpc2liaWxpdHkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihQdXBwZXRlZXJVdGlsLmNoZWNrVmlzaWJpbGl0eShlbGVtZW50LCB2aXNpYmlsaXR5KSk7XG4gICAgICAgICAgICB9LCBMYXp5QXJnLmNyZWF0ZShjb250ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgfSksIHZpc2liaWxpdHkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBlbGVtZW50IGlzIGNvbnNpZGVyZWQgdG8gYmUgdmlzaWJsZSBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBpc1xuICAgICAgICAgKiB0cnVlOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhc1xuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2dldENvbXB1dGVkU3R5bGUgfCBjb21wdXRlZCBzdHlsZXN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhcyBhIG5vbi1lbXB0eVxuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRCb3VuZGluZ0NsaWVudFJlY3QgfCBib3VuZGluZyBjbGllbnQgcmVjdH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIC0gdGhlIGVsZW1lbnQncyB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3Zpc2liaWxpdHkgfCB2aXNpYmlsaXR5fVxuICAgICAgICAgKiAgIGlzIG5vdCBgaGlkZGVuYCBvciBgY29sbGFwc2VgLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXNWaXNpYmxlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2NoZWNrVmlzaWJpbGl0eSh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gZWxlbWVudCBpcyBjb25zaWRlcmVkIHRvIGJlIGhpZGRlbiBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhcyBub1xuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2dldENvbXB1dGVkU3R5bGUgfCBjb21wdXRlZCBzdHlsZXN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhcyBhbiBlbXB0eVxuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRCb3VuZGluZ0NsaWVudFJlY3QgfCBib3VuZGluZyBjbGllbnQgcmVjdH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIC0gdGhlIGVsZW1lbnQncyB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3Zpc2liaWxpdHkgfCB2aXNpYmlsaXR5fVxuICAgICAgICAgKiAgIGlzIGBoaWRkZW5gIG9yIGBjb2xsYXBzZWAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpc0hpZGRlbigpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjaGVja1Zpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb252ZXJ0cyB0aGUgY3VycmVudCBoYW5kbGUgdG8gdGhlIGdpdmVuIGVsZW1lbnQgdHlwZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgZWxlbWVudDogRWxlbWVudEhhbmRsZTxFbGVtZW50PiA9IGF3YWl0IHBhZ2UuJChcbiAgICAgICAgICogICAnLmNsYXNzLW5hbWUtb2YtYW5jaG9yJ1xuICAgICAgICAgKiApO1xuICAgICAgICAgKiAvLyBETyBOT1QgRElTUE9TRSBgZWxlbWVudGAsIHRoaXMgd2lsbCBiZSBhbHdheXMgYmUgdGhlIHNhbWUgaGFuZGxlLlxuICAgICAgICAgKiBjb25zdCBhbmNob3I6IEVsZW1lbnRIYW5kbGU8SFRNTEFuY2hvckVsZW1lbnQ+ID1cbiAgICAgICAgICogICBhd2FpdCBlbGVtZW50LnRvRWxlbWVudCgnYScpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHRhZ05hbWUgLSBUaGUgdGFnIG5hbWUgb2YgdGhlIGRlc2lyZWQgZWxlbWVudCB0eXBlLlxuICAgICAgICAgKiBAdGhyb3dzIEFuIGVycm9yIGlmIHRoZSBoYW5kbGUgZG9lcyBub3QgbWF0Y2guICoqVGhlIGhhbmRsZSB3aWxsIG5vdCBiZVxuICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IGRpc3Bvc2VkLioqXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0b0VsZW1lbnQodGFnTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgaXNNYXRjaGluZ1RhZ05hbWUgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKChub2RlLCB0YWdOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUubm9kZU5hbWUgPT09IHRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH0sIHRhZ05hbWUpO1xuICAgICAgICAgICAgaWYgKCFpc01hdGNoaW5nVGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBpcyBub3QgYShuKSBcXGAke3RhZ05hbWV9XFxgIGVsZW1lbnRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBtaWRkbGUgcG9pbnQgd2l0aGluIGFuIGVsZW1lbnQgdW5sZXNzIGEgc3BlY2lmaWMgb2Zmc2V0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY2xpY2thYmxlUG9pbnQob2Zmc2V0KSB7XG4gICAgICAgICAgICBjb25zdCBib3ggPSBhd2FpdCB0aGlzLiNjbGlja2FibGVCb3goKTtcbiAgICAgICAgICAgIGlmICghYm94KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb2RlIGlzIGVpdGhlciBub3QgY2xpY2thYmxlIG9yIG5vdCBhbiBFbGVtZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB4OiBib3gueCArIG9mZnNldC54LFxuICAgICAgICAgICAgICAgICAgICB5OiBib3gueSArIG9mZnNldC55LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHg6IGJveC54ICsgYm94LndpZHRoIC8gMixcbiAgICAgICAgICAgICAgICB5OiBib3gueSArIGJveC5oZWlnaHQgLyAyLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2Qgc2Nyb2xscyBlbGVtZW50IGludG8gdmlldyBpZiBuZWVkZWQsIGFuZCB0aGVuXG4gICAgICAgICAqIHVzZXMge0BsaW5rIFBhZ2UubW91c2V9IHRvIGhvdmVyIG92ZXIgdGhlIGNlbnRlciBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICogSWYgdGhlIGVsZW1lbnQgaXMgZGV0YWNoZWQgZnJvbSBET00sIHRoZSBtZXRob2QgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaG92ZXIoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gYXdhaXQgdGhpcy5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkubW91c2UubW92ZSh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2Qgc2Nyb2xscyBlbGVtZW50IGludG8gdmlldyBpZiBuZWVkZWQsIGFuZCB0aGVuXG4gICAgICAgICAqIHVzZXMge0BsaW5rIFBhZ2UubW91c2V9IHRvIGNsaWNrIGluIHRoZSBjZW50ZXIgb2YgdGhlIGVsZW1lbnQuXG4gICAgICAgICAqIElmIHRoZSBlbGVtZW50IGlzIGRldGFjaGVkIGZyb20gRE9NLCB0aGUgbWV0aG9kIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNsaWNrKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQob3B0aW9ucy5vZmZzZXQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkubW91c2UuY2xpY2soeCwgeSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERyYWdzIGFuIGVsZW1lbnQgb3ZlciB0aGUgZ2l2ZW4gZWxlbWVudCBvciBwb2ludC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMgREVQUkVDQVRFRC4gV2hlbiBkcmFnIGludGVyY2VwdGlvbiBpcyBlbmFibGVkLCB0aGUgZHJhZyBwYXlsb2FkIGlzXG4gICAgICAgICAqIHJldHVybmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZHJhZyh0YXJnZXQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZnJhbWUucGFnZSgpO1xuICAgICAgICAgICAgaWYgKHBhZ2UuaXNEcmFnSW50ZXJjZXB0aW9uRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgdGhpcy5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGF3YWl0IHRhcmdldC5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcGFnZS5tb3VzZS5kcmFnKHNvdXJjZSwgdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWdlLl9pc0RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UuX2lzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhvdmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UuZG93bigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0YXJnZXQuaG92ZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UubW92ZSh0YXJnZXQueCwgdGFyZ2V0LnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHBhZ2UuX2lzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZS4gYGRyYWdlbnRlcmAgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHBlcmZvcm1lZCBkdXJpbmcgZHJhZ2dpbmcuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkcmFnRW50ZXIoZGF0YSA9IHsgaXRlbXM6IFtdLCBkcmFnT3BlcmF0aW9uc01hc2s6IDEgfSkge1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZnJhbWUucGFnZSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmNsaWNrYWJsZVBvaW50KCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLm1vdXNlLmRyYWdFbnRlcih0YXJnZXQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlLiBgZHJhZ292ZXJgIHdpbGwgYXV0b21hdGljYWxseSBiZSBwZXJmb3JtZWQgZHVyaW5nIGRyYWdnaW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZHJhZ092ZXIoZGF0YSA9IHsgaXRlbXM6IFtdLCBkcmFnT3BlcmF0aW9uc01hc2s6IDEgfSkge1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZnJhbWUucGFnZSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmNsaWNrYWJsZVBvaW50KCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLm1vdXNlLmRyYWdPdmVyKHRhcmdldCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZHJvcChkYXRhT3JFbGVtZW50ID0ge1xuICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgZHJhZ09wZXJhdGlvbnNNYXNrOiAxLFxuICAgICAgICB9KSB7XG4gICAgICAgICAgICBjb25zdCBwYWdlID0gdGhpcy5mcmFtZS5wYWdlKCk7XG4gICAgICAgICAgICBpZiAoJ2l0ZW1zJyBpbiBkYXRhT3JFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBhd2FpdCB0aGlzLmNsaWNrYWJsZVBvaW50KCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5tb3VzZS5kcm9wKGRlc3RpbmF0aW9uLCBkYXRhT3JFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vdGUgaWYgdGhlIHJlc3QgZXJyb3JzLCB3ZSBzdGlsbCB3YW50IGRyYWdnaW5nIG9mZiBiZWNhdXNlIHRoZSBlcnJvcnNcbiAgICAgICAgICAgICAgICAvLyBpcyBtb3N0IGxpa2VseSBzb21ldGhpbmcgaW1wbHlpbmcgdGhlIG1vdXNlIGlzIG5vIGxvbmdlciBkcmFnZ2luZy5cbiAgICAgICAgICAgICAgICBhd2FpdCBkYXRhT3JFbGVtZW50LmRyYWcodGhpcyk7XG4gICAgICAgICAgICAgICAgcGFnZS5faXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UudXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGBFbGVtZW50SGFuZGxlLmRyb3BgIGluc3RlYWQuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkcmFnQW5kRHJvcCh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmZyYW1lLnBhZ2UoKTtcbiAgICAgICAgICAgIGFzc2VydChwYWdlLmlzRHJhZ0ludGVyY2VwdGlvbkVuYWJsZWQoKSwgJ0RyYWcgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCBzdGFydFBvaW50ID0gYXdhaXQgdGhpcy5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0UG9pbnQgPSBhd2FpdCB0YXJnZXQuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UuZHJhZ0FuZERyb3Aoc3RhcnRQb2ludCwgdGFyZ2V0UG9pbnQsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmlnZ2VycyBhIGBjaGFuZ2VgIGFuZCBgaW5wdXRgIGV2ZW50IG9uY2UgYWxsIHRoZSBwcm92aWRlZCBvcHRpb25zIGhhdmUgYmVlblxuICAgICAgICAgKiBzZWxlY3RlZC4gSWYgdGhlcmUncyBubyBgPHNlbGVjdD5gIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCwgdGhlIG1ldGhvZFxuICAgICAgICAgKiB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGhhbmRsZS5zZWxlY3QoJ2JsdWUnKTsgLy8gc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgKiBoYW5kbGUuc2VsZWN0KCdyZWQnLCAnZ3JlZW4nLCAnYmx1ZScpOyAvLyBtdWx0aXBsZSBzZWxlY3Rpb25zXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdmFsdWVzIC0gVmFsdWVzIG9mIG9wdGlvbnMgdG8gc2VsZWN0LiBJZiB0aGUgYDxzZWxlY3Q+YCBoYXMgdGhlXG4gICAgICAgICAqIGBtdWx0aXBsZWAgYXR0cmlidXRlLCBhbGwgdmFsdWVzIGFyZSBjb25zaWRlcmVkLCBvdGhlcndpc2Ugb25seSB0aGUgZmlyc3RcbiAgICAgICAgICogb25lIGlzIHRha2VuIGludG8gYWNjb3VudC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNlbGVjdCguLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGlzU3RyaW5nKHZhbHVlKSwgJ1ZhbHVlcyBtdXN0IGJlIHN0cmluZ3MuIEZvdW5kIHZhbHVlIFwiJyArXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiIG9mIHR5cGUgXCInICtcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ldmFsdWF0ZSgoZWxlbWVudCwgdmFscykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBTZXQodmFscyk7XG4gICAgICAgICAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnQgaXMgbm90IGEgPHNlbGVjdD4gZWxlbWVudC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGVsZW1lbnQub3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmhhcyhvcHRpb24udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFZhbHVlcy5hZGQob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB2YWx1ZXMuaGFzKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMuYWRkKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5zZWxlY3RlZFZhbHVlcy52YWx1ZXMoKV07XG4gICAgICAgICAgICB9LCB2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBzY3JvbGxzIGVsZW1lbnQgaW50byB2aWV3IGlmIG5lZWRlZCwgYW5kIHRoZW4gdXNlc1xuICAgICAgICAgKiB7QGxpbmsgVG91Y2hzY3JlZW4udGFwfSB0byB0YXAgaW4gdGhlIGNlbnRlciBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICogSWYgdGhlIGVsZW1lbnQgaXMgZGV0YWNoZWQgZnJvbSBET00sIHRoZSBtZXRob2QgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdGFwKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLnRvdWNoc2NyZWVuLnRhcCh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyB0b3VjaFN0YXJ0KCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLnRvdWNoc2NyZWVuLnRvdWNoU3RhcnQoeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgdG91Y2hNb3ZlKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLnRvdWNoc2NyZWVuLnRvdWNoTW92ZSh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyB0b3VjaEVuZCgpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkudG91Y2hzY3JlZW4udG91Y2hFbmQoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbHMge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9mb2N1cyB8IGZvY3VzfSBvbiB0aGUgZWxlbWVudC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZvY3VzKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZvY3VzIG5vbi1IVE1MRWxlbWVudCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvY3VzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGVuIHNlbmRzIGEgYGtleWRvd25gLCBga2V5cHJlc3NgL2BpbnB1dGAsIGFuZFxuICAgICAgICAgKiBga2V5dXBgIGV2ZW50IGZvciBlYWNoIGNoYXJhY3RlciBpbiB0aGUgdGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogVG8gcHJlc3MgYSBzcGVjaWFsIGtleSwgbGlrZSBgQ29udHJvbGAgb3IgYEFycm93RG93bmAsXG4gICAgICAgICAqIHVzZSB7QGxpbmsgRWxlbWVudEhhbmRsZS5wcmVzc30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGF3YWl0IGVsZW1lbnRIYW5kbGUudHlwZSgnSGVsbG8nKTsgLy8gVHlwZXMgaW5zdGFudGx5XG4gICAgICAgICAqIGF3YWl0IGVsZW1lbnRIYW5kbGUudHlwZSgnV29ybGQnLCB7ZGVsYXk6IDEwMH0pOyAvLyBUeXBlcyBzbG93ZXIsIGxpa2UgYSB1c2VyXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBBbiBleGFtcGxlIG9mIHR5cGluZyBpbnRvIGEgdGV4dCBmaWVsZCBhbmQgdGhlbiBzdWJtaXR0aW5nIHRoZSBmb3JtOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBlbGVtZW50SGFuZGxlID0gYXdhaXQgcGFnZS4kKCdpbnB1dCcpO1xuICAgICAgICAgKiBhd2FpdCBlbGVtZW50SGFuZGxlLnR5cGUoJ3NvbWUgdGV4dCcpO1xuICAgICAgICAgKiBhd2FpdCBlbGVtZW50SGFuZGxlLnByZXNzKCdFbnRlcicpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBEZWxheSBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0eXBlKHRleHQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLmtleWJvYXJkLnR5cGUodGV4dCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvY3VzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGVuIHVzZXMge0BsaW5rIEtleWJvYXJkLmRvd259IGFuZCB7QGxpbmsgS2V5Ym9hcmQudXB9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiBga2V5YCBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgYW5kIG5vIG1vZGlmaWVyIGtleXMgYmVzaWRlcyBgU2hpZnRgXG4gICAgICAgICAqIGFyZSBiZWluZyBoZWxkIGRvd24sIGEgYGtleXByZXNzYC9gaW5wdXRgIGV2ZW50IHdpbGwgYWxzbyBiZSBnZW5lcmF0ZWQuXG4gICAgICAgICAqIFRoZSBgdGV4dGAgb3B0aW9uIGNhbiBiZSBzcGVjaWZpZWQgdG8gZm9yY2UgYW4gaW5wdXQgZXZlbnQgdG8gYmUgZ2VuZXJhdGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5PVEUqKiBNb2RpZmllciBrZXlzIERPIGFmZmVjdCBgZWxlbWVudEhhbmRsZS5wcmVzc2AuIEhvbGRpbmcgZG93biBgU2hpZnRgXG4gICAgICAgICAqIHdpbGwgdHlwZSB0aGUgdGV4dCBpbiB1cHBlciBjYXNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ga2V5IC0gTmFtZSBvZiBrZXkgdG8gcHJlc3MsIHN1Y2ggYXMgYEFycm93TGVmdGAuXG4gICAgICAgICAqIFNlZSB7QGxpbmsgS2V5SW5wdXR9IGZvciBhIGxpc3Qgb2YgYWxsIGtleSBuYW1lcy5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByZXNzKGtleSwgb3B0aW9ucykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkua2V5Ym9hcmQucHJlc3Moa2V5LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyAjY2xpY2thYmxlQm94KCkge1xuICAgICAgICAgICAgY29uc3QgYm94ZXMgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5lbGVtZW50LmdldENsaWVudFJlY3RzKCldLm1hcChyZWN0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgeDogcmVjdC54LCB5OiByZWN0LnksIHdpZHRoOiByZWN0LndpZHRoLCBoZWlnaHQ6IHJlY3QuaGVpZ2h0IH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghYm94ZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy4jaW50ZXJzZWN0Qm91bmRpbmdCb3hlc1dpdGhGcmFtZShib3hlcyk7XG4gICAgICAgICAgICBsZXQgZnJhbWUgPSB0aGlzLmZyYW1lO1xuICAgICAgICAgICAgbGV0IHBhcmVudEZyYW1lO1xuICAgICAgICAgICAgd2hpbGUgKChwYXJlbnRGcmFtZSA9IGZyYW1lPy5wYXJlbnRGcmFtZSgpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8zLCBhd2FpdCBmcmFtZS5mcmFtZUVsZW1lbnQoKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBmcmFtZSB0eXBlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Qm94ID0gYXdhaXQgaGFuZGxlLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxlbWVudCBpcyBub3QgdmlzaWJsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0LCAxMCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChzdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHJlY3QudG9wICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUucGFkZGluZ1RvcCwgMTApICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUuYm9yZGVyVG9wV2lkdGgsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudEJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBib3ggb2YgYm94ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJveC54ICs9IHBhcmVudEJveC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYm94LnkgKz0gcGFyZW50Qm94LnRvcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUuI2ludGVyc2VjdEJvdW5kaW5nQm94ZXNXaXRoRnJhbWUoYm94ZXMpO1xuICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IHBhcmVudEZyYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8zKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudl8zLmVycm9yID0gZV8zO1xuICAgICAgICAgICAgICAgICAgICBlbnZfMy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGJveGVzLmZpbmQoYm94ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYm94LndpZHRoID49IDEgJiYgYm94LmhlaWdodCA+PSAxO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWJveCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB4OiBib3gueCxcbiAgICAgICAgICAgICAgICB5OiBib3gueSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGJveC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGJveC53aWR0aCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgI2ludGVyc2VjdEJvdW5kaW5nQm94ZXNXaXRoRnJhbWUoYm94ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZG9jdW1lbnRXaWR0aCwgZG9jdW1lbnRIZWlnaHQgfSA9IGF3YWl0IHRoaXMuZnJhbWVcbiAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudFdpZHRoOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50SGVpZ2h0OiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0Qm91bmRpbmdCb3goYm94LCBkb2N1bWVudFdpZHRoLCBkb2N1bWVudEhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgZWxlbWVudCAocmVsYXRpdmUgdG8gdGhlIG1haW4gZnJhbWUpLFxuICAgICAgICAgKiBvciBgbnVsbGAgaWYgdGhlIGVsZW1lbnQgaXMge0BsaW5rIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtZGlzcGxheS00LyNib3gtZ2VuZXJhdGlvbiB8IG5vdCBwYXJ0IG9mIHRoZSBsYXlvdXR9XG4gICAgICAgICAqIChleGFtcGxlOiBgZGlzcGxheTogbm9uZWApLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYm91bmRpbmdCb3goKSB7XG4gICAgICAgICAgICBjb25zdCBib3ggPSBhd2FpdCB0aGlzLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRWxlbWVudCBpcyBub3QgdmlzaWJsZS5cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgeDogcmVjdC54LCB5OiByZWN0LnksIHdpZHRoOiByZWN0LndpZHRoLCBoZWlnaHQ6IHJlY3QuaGVpZ2h0IH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghYm94KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBhd2FpdCB0aGlzLiNnZXRUb3BMZWZ0Q29ybmVyT2ZGcmFtZSgpO1xuICAgICAgICAgICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgeDogYm94LnggKyBvZmZzZXQueCxcbiAgICAgICAgICAgICAgICB5OiBib3gueSArIG9mZnNldC55LFxuICAgICAgICAgICAgICAgIGhlaWdodDogYm94LmhlaWdodCxcbiAgICAgICAgICAgICAgICB3aWR0aDogYm94LndpZHRoLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBib3hlcyBvZiB0aGUgZWxlbWVudCxcbiAgICAgICAgICogb3IgYG51bGxgIGlmIHRoZSBlbGVtZW50IGlzIHtAbGluayBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLWRpc3BsYXktNC8jYm94LWdlbmVyYXRpb24gfCBub3QgcGFydCBvZiB0aGUgbGF5b3V0fVxuICAgICAgICAgKiAoZXhhbXBsZTogYGRpc3BsYXk6IG5vbmVgKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogQm94ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIHBvaW50cztcbiAgICAgICAgICogRWFjaCBQb2ludCBpcyBhbiBvYmplY3QgYHt4LCB5fWAuIEJveCBwb2ludHMgYXJlIHNvcnRlZCBjbG9jay13aXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYm94TW9kZWwoKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGlzIG5vdCB2aXNpYmxlLlxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0LCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdUb3AsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBwYXJzZUludChzdHlsZS5wYWRkaW5nUmlnaHQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcGFyc2VJbnQoc3R5bGUucGFkZGluZ0JvdHRvbSwgMTApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IC1wYXJzZUludChzdHlsZS5tYXJnaW5MZWZ0LCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IC1wYXJzZUludChzdHlsZS5tYXJnaW5Ub3AsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAtcGFyc2VJbnQoc3R5bGUubWFyZ2luUmlnaHQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogLXBhcnNlSW50KHN0eWxlLm1hcmdpbkJvdHRvbSwgMTApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHBhcnNlSW50KHN0eWxlLmJvcmRlckxlZnQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcGFyc2VJbnQoc3R5bGUuYm9yZGVyVG9wLCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodDogcGFyc2VJbnQoc3R5bGUuYm9yZGVyUmlnaHQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcGFyc2VJbnQoc3R5bGUuYm9yZGVyQm90dG9tLCAxMCksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXIgPSBbXG4gICAgICAgICAgICAgICAgICAgIHsgeDogcmVjdC5sZWZ0LCB5OiByZWN0LnRvcCB9LFxuICAgICAgICAgICAgICAgICAgICB7IHg6IHJlY3QubGVmdCArIHJlY3Qud2lkdGgsIHk6IHJlY3QudG9wIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCwgeTogcmVjdC50b3AgKyByZWN0LmJvdHRvbSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHg6IHJlY3QubGVmdCwgeTogcmVjdC50b3AgKyByZWN0LmJvdHRvbSB9LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHRyYW5zZm9ybVF1YWRXaXRoT2Zmc2V0cyhib3JkZXIsIG9mZnNldHMuYm9yZGVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdHJhbnNmb3JtUXVhZFdpdGhPZmZzZXRzKHBhZGRpbmcsIG9mZnNldHMucGFkZGluZyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFyZ2luID0gdHJhbnNmb3JtUXVhZFdpdGhPZmZzZXRzKGJvcmRlciwgb2Zmc2V0cy5tYXJnaW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcixcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVF1YWRXaXRoT2Zmc2V0cyhxdWFkLCBvZmZzZXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogcXVhZFswXS54ICsgb2Zmc2V0cy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHF1YWRbMF0ueSArIG9mZnNldHMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBxdWFkWzFdLnggLSBvZmZzZXRzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHF1YWRbMV0ueSArIG9mZnNldHMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBxdWFkWzJdLnggLSBvZmZzZXRzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHF1YWRbMl0ueSAtIG9mZnNldHMuYm90dG9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBxdWFkWzNdLnggKyBvZmZzZXRzLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogcXVhZFszXS55IC0gb2Zmc2V0cy5ib3R0b20sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYXdhaXQgdGhpcy4jZ2V0VG9wTGVmdENvcm5lck9mRnJhbWUoKTtcbiAgICAgICAgICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBbXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICdwYWRkaW5nJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyJyxcbiAgICAgICAgICAgICAgICAnbWFyZ2luJyxcbiAgICAgICAgICAgIF0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIG1vZGVsW2F0dHJpYnV0ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQueCArPSBvZmZzZXQueDtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQueSArPSBvZmZzZXQueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgI2dldFRvcExlZnRDb3JuZXJPZkZyYW1lKCkge1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgICAgIGxldCBmcmFtZSA9IHRoaXMuZnJhbWU7XG4gICAgICAgICAgICBsZXQgcGFyZW50RnJhbWU7XG4gICAgICAgICAgICB3aGlsZSAoKHBhcmVudEZyYW1lID0gZnJhbWU/LnBhcmVudEZyYW1lKCkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52XzQgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzQsIGF3YWl0IGZyYW1lLmZyYW1lRWxlbWVudCgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGZyYW1lIHR5cGUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRCb3ggPSBhd2FpdCBoYW5kbGUuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGlzIG5vdCB2aXNpYmxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQsIDEwKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHN0eWxlLmJvcmRlckxlZnRXaWR0aCwgMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcmVjdC50b3AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChzdHlsZS5wYWRkaW5nVG9wLCAxMCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChzdHlsZS5ib3JkZXJUb3BXaWR0aCwgMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50Qm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwb2ludC54ICs9IHBhcmVudEJveC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICBwb2ludC55ICs9IHBhcmVudEJveC50b3A7XG4gICAgICAgICAgICAgICAgICAgIGZyYW1lID0gcGFyZW50RnJhbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzQpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52XzQuZXJyb3IgPSBlXzQ7XG4gICAgICAgICAgICAgICAgICAgIGVudl80Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBvaW50O1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHNjcmVlbnNob3Qob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHNjcm9sbEludG9WaWV3ID0gdHJ1ZSwgY2xpcCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmZyYW1lLnBhZ2UoKTtcbiAgICAgICAgICAgIC8vIE9ubHkgc2Nyb2xsIHRoZSBlbGVtZW50IGludG8gdmlldyBpZiB0aGUgdXNlciB3YW50cyBpdC5cbiAgICAgICAgICAgIGlmIChzY3JvbGxJbnRvVmlldykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZWxlbWVudENsaXAgPSBhd2FpdCB0aGlzLiNub25FbXB0eVZpc2libGVCb3VuZGluZ0JveCgpO1xuICAgICAgICAgICAgY29uc3QgW3BhZ2VMZWZ0LCBwYWdlVG9wXSA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghd2luZG93LnZpc3VhbFZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2luZG93LnZpc3VhbFZpZXdwb3J0IGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy52aXN1YWxWaWV3cG9ydC5wYWdlTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnZpc3VhbFZpZXdwb3J0LnBhZ2VUb3AsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxlbWVudENsaXAueCArPSBwYWdlTGVmdDtcbiAgICAgICAgICAgIGVsZW1lbnRDbGlwLnkgKz0gcGFnZVRvcDtcbiAgICAgICAgICAgIGlmIChjbGlwKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAueCArPSBjbGlwLng7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAueSArPSBjbGlwLnk7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAuaGVpZ2h0ID0gY2xpcC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAud2lkdGggPSBjbGlwLndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IC4uLm9wdGlvbnMsIGNsaXA6IGVsZW1lbnRDbGlwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jICNub25FbXB0eVZpc2libGVCb3VuZGluZ0JveCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGF3YWl0IHRoaXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgIGFzc2VydChib3gsICdOb2RlIGlzIGVpdGhlciBub3QgdmlzaWJsZSBvciBub3QgYW4gSFRNTEVsZW1lbnQnKTtcbiAgICAgICAgICAgIGFzc2VydChib3gud2lkdGggIT09IDAsICdOb2RlIGhhcyAwIHdpZHRoLicpO1xuICAgICAgICAgICAgYXNzZXJ0KGJveC5oZWlnaHQgIT09IDAsICdOb2RlIGhhcyAwIGhlaWdodC4nKTtcbiAgICAgICAgICAgIHJldHVybiBib3g7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXJ0Q29ubmVjdGVkRWxlbWVudCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShhc3luYyAoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05vZGUgaXMgZGV0YWNoZWQgZnJvbSBkb2N1bWVudCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05vZGUgaXMgbm90IG9mIHR5cGUgSFRNTEVsZW1lbnQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpIHtcbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmlzSW50ZXJzZWN0aW5nVmlld3BvcnQoe1xuICAgICAgICAgICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gdGhlIGN1cnJlbnQgdmlld3BvcnQuIElmIGFuXG4gICAgICAgICAqIGVsZW1lbnQgaXMgYW4gU1ZHLCB3ZSBjaGVjayBpZiB0aGUgc3ZnIG93bmVyIGVsZW1lbnQgaXMgaW4gdGhlIHZpZXdwb3J0XG4gICAgICAgICAqIGluc3RlYWQuIFNlZSBodHRwczovL2NyYnVnLmNvbS85NjMyNDYuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhyZXNob2xkIGZvciB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gMCAobm8gaW50ZXJzZWN0aW9uKSBhbmQgMVxuICAgICAgICAgKiAoZnVsbCBpbnRlcnNlY3Rpb24pLiBEZWZhdWx0cyB0byAxLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXNJbnRlcnNlY3RpbmdWaWV3cG9ydChvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl81ID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydENvbm5lY3RlZEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnVsZXNkaXIvdXNlLXVzaW5nIC0tIFJldHVybnMgYHRoaXNgLlxuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IGF3YWl0IHRoaXMuI2FzU1ZHRWxlbWVudEhhbmRsZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl81LCBoYW5kbGUgJiYgKGF3YWl0IGhhbmRsZS4jZ2V0T3duZXJTVkdFbGVtZW50KCkpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0ICh0YXJnZXQgPz8gdGhpcykuZXZhbHVhdGUoYXN5bmMgKGVsZW1lbnQsIHRocmVzaG9sZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXNpYmxlUmF0aW8gPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW50cmllc1swXS5pbnRlcnNlY3Rpb25SYXRpbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZCA9PT0gMSA/IHZpc2libGVSYXRpbyA9PT0gMSA6IHZpc2libGVSYXRpbyA+IHRocmVzaG9sZDtcbiAgICAgICAgICAgICAgICB9LCBvcHRpb25zLnRocmVzaG9sZCA/PyAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzUpIHtcbiAgICAgICAgICAgICAgICBlbnZfNS5lcnJvciA9IGVfNTtcbiAgICAgICAgICAgICAgICBlbnZfNS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTY3JvbGxzIHRoZSBlbGVtZW50IGludG8gdmlldyB1c2luZyBlaXRoZXIgdGhlIGF1dG9tYXRpb24gcHJvdG9jb2wgY2xpZW50XG4gICAgICAgICAqIG9yIGJ5IGNhbGxpbmcgZWxlbWVudC5zY3JvbGxJbnRvVmlldy5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNjcm9sbEludG9WaWV3KCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRDb25uZWN0ZWRFbGVtZW50KCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGFzeW5jIChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW4gZWxlbWVudCBpcyBhbiBTVkdFbGVtZW50IChpbmNsdWRlZCBzdmcsIHBhdGgsIHJlY3RcbiAgICAgICAgICogZXRjLikuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAjYXNTVkdFbGVtZW50SGFuZGxlKCkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBTVkdFbGVtZW50O1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jICNnZXRPd25lclNWR0VsZW1lbnQoKSB7XG4gICAgICAgICAgICAvLyBTVkdTVkdFbGVtZW50Lm93bmVyU1ZHRWxlbWVudCA9PT0gbnVsbC5cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV2YWx1YXRlSGFuZGxlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU1ZHU1ZHRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQub3duZXJTVkdFbGVtZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IEVsZW1lbnRIYW5kbGUgfTtcbmZ1bmN0aW9uIGludGVyc2VjdEJvdW5kaW5nQm94KGJveCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGJveC53aWR0aCA9IE1hdGgubWF4KGJveC54ID49IDBcbiAgICAgICAgPyBNYXRoLm1pbih3aWR0aCAtIGJveC54LCBib3gud2lkdGgpXG4gICAgICAgIDogTWF0aC5taW4od2lkdGgsIGJveC53aWR0aCArIGJveC54KSwgMCk7XG4gICAgYm94LmhlaWdodCA9IE1hdGgubWF4KGJveC55ID49IDBcbiAgICAgICAgPyBNYXRoLm1pbihoZWlnaHQgLSBib3gueSwgYm94LmhlaWdodClcbiAgICAgICAgOiBNYXRoLm1pbihoZWlnaHQsIGJveC5oZWlnaHQgKyBib3gueSksIDApO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RWxlbWVudEhhbmRsZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IF9pc0VsZW1lbnRIYW5kbGUgPSBTeW1ib2woJ19pc0VsZW1lbnRIYW5kbGUnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVsZW1lbnRIYW5kbGVTeW1ib2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudmlyb25tZW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG52YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvciB9IGZyb20gJy4uL2NvbW1vbi9HZXRRdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgdHJhbnNwb3NlSXRlcmFibGVIYW5kbGUgfSBmcm9tICcuLi9jb21tb24vSGFuZGxlSXRlcmF0b3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0RlNQcm9taXNlcywgd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyB0aHJvd0lmRGlzcG9zZWQgfSBmcm9tICcuLi91dGlsL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25Mb2NhdG9yLCBOb2RlTG9jYXRvciwgfSBmcm9tICcuL2xvY2F0b3JzL2xvY2F0b3JzLmpzJztcbi8qKlxuICogV2UgdXNlIHN5bWJvbHMgdG8gcHJldmVudCBleHRlcm5hbCBwYXJ0aWVzIGxpc3RlbmluZyB0byB0aGVzZSBldmVudHMuXG4gKiBUaGV5IGFyZSBpbnRlcm5hbCB0byBQdXBwZXRlZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIEZyYW1lRXZlbnQ7XG4oZnVuY3Rpb24gKEZyYW1lRXZlbnQpIHtcbiAgICBGcmFtZUV2ZW50LkZyYW1lTmF2aWdhdGVkID0gU3ltYm9sKCdGcmFtZS5GcmFtZU5hdmlnYXRlZCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkID0gU3ltYm9sKCdGcmFtZS5GcmFtZVN3YXBwZWQnKTtcbiAgICBGcmFtZUV2ZW50LkxpZmVjeWNsZUV2ZW50ID0gU3ltYm9sKCdGcmFtZS5MaWZlY3ljbGVFdmVudCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCA9IFN5bWJvbCgnRnJhbWUuRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVEZXRhY2hlZCA9IFN5bWJvbCgnRnJhbWUuRnJhbWVEZXRhY2hlZCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkQnlBY3RpdmF0aW9uID0gU3ltYm9sKCdGcmFtZS5GcmFtZVN3YXBwZWRCeUFjdGl2YXRpb24nKTtcbn0pKEZyYW1lRXZlbnQgfHwgKEZyYW1lRXZlbnQgPSB7fSkpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHRocm93SWZEZXRhY2hlZCA9IHRocm93SWZEaXNwb3NlZChmcmFtZSA9PiB7XG4gICAgcmV0dXJuIGBBdHRlbXB0ZWQgdG8gdXNlIGRldGFjaGVkIEZyYW1lICcke2ZyYW1lLl9pZH0nLmA7XG59KTtcbi8qKlxuICogUmVwcmVzZW50cyBhIERPTSBmcmFtZS5cbiAqXG4gKiBUbyB1bmRlcnN0YW5kIGZyYW1lcywgeW91IGNhbiB0aGluayBvZiBmcmFtZXMgYXMgYDxpZnJhbWU+YCBlbGVtZW50cy4gSnVzdFxuICogbGlrZSBpZnJhbWVzLCBmcmFtZXMgY2FuIGJlIG5lc3RlZCwgYW5kIHdoZW4gSmF2YVNjcmlwdCBpcyBleGVjdXRlZCBpbiBhXG4gKiBmcmFtZSwgdGhlIEphdmFTY3JpcHQgZG9lcyBub3QgZWZmZWN0IGZyYW1lcyBpbnNpZGUgdGhlIGFtYmllbnQgZnJhbWUgdGhlXG4gKiBKYXZhU2NyaXB0IGV4ZWN1dGVzIGluLlxuICpcbiAqIEBleGFtcGxlXG4gKiBBdCBhbnkgcG9pbnQgaW4gdGltZSwge0BsaW5rIFBhZ2UgfCBwYWdlc30gZXhwb3NlIHRoZWlyIGN1cnJlbnQgZnJhbWVcbiAqIHRyZWUgdmlhIHRoZSB7QGxpbmsgUGFnZS5tYWluRnJhbWV9IGFuZCB7QGxpbmsgRnJhbWUuY2hpbGRGcmFtZXN9IG1ldGhvZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIEFuIGV4YW1wbGUgb2YgZHVtcGluZyBmcmFtZSB0cmVlOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gKlxuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20vY2hyb21lL2Jyb3dzZXIvY2FuYXJ5Lmh0bWwnKTtcbiAqICAgZHVtcEZyYW1lVHJlZShwYWdlLm1haW5GcmFtZSgpLCAnJyk7XG4gKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqXG4gKiAgIGZ1bmN0aW9uIGR1bXBGcmFtZVRyZWUoZnJhbWUsIGluZGVudCkge1xuICogICAgIGNvbnNvbGUubG9nKGluZGVudCArIGZyYW1lLnVybCgpKTtcbiAqICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZyYW1lLmNoaWxkRnJhbWVzKCkpIHtcbiAqICAgICAgIGR1bXBGcmFtZVRyZWUoY2hpbGQsIGluZGVudCArICcgICcpO1xuICogICAgIH1cbiAqICAgfVxuICogfSkoKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBBbiBleGFtcGxlIG9mIGdldHRpbmcgdGV4dCBmcm9tIGFuIGlmcmFtZSBlbGVtZW50OlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBmcmFtZSA9IHBhZ2UuZnJhbWVzKCkuZmluZChmcmFtZSA9PiBmcmFtZS5uYW1lKCkgPT09ICdteWZyYW1lJyk7XG4gKiBjb25zdCB0ZXh0ID0gYXdhaXQgZnJhbWUuJGV2YWwoJy5zZWxlY3RvcicsIGVsZW1lbnQgPT4gZWxlbWVudC50ZXh0Q29udGVudCk7XG4gKiBjb25zb2xlLmxvZyh0ZXh0KTtcbiAqIGBgYFxuICpcbiAqIEByZW1hcmtzXG4gKiBGcmFtZSBsaWZlY3ljbGVzIGFyZSBjb250cm9sbGVkIGJ5IHRocmVlIGV2ZW50cyB0aGF0IGFyZSBhbGwgZGlzcGF0Y2hlZCBvblxuICogdGhlIHBhcmVudCB7QGxpbmsgRnJhbWUucGFnZSB8IHBhZ2V9OlxuICpcbiAqIC0ge0BsaW5rIFBhZ2VFdmVudC5GcmFtZUF0dGFjaGVkfVxuICogLSB7QGxpbmsgUGFnZUV2ZW50LkZyYW1lTmF2aWdhdGVkfVxuICogLSB7QGxpbmsgUGFnZUV2ZW50LkZyYW1lRGV0YWNoZWR9XG4gKlxuICogQHB1YmxpY1xuICovXG5sZXQgRnJhbWUgPSAoKCkgPT4ge1xuICAgIGxldCBfY2xhc3NTdXBlciA9IEV2ZW50RW1pdHRlcjtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX2ZyYW1lRWxlbWVudF9kZWNvcmF0b3JzO1xuICAgIGxldCBfZXZhbHVhdGVIYW5kbGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX2V2YWx1YXRlX2RlY29yYXRvcnM7XG4gICAgbGV0IF9sb2NhdG9yX2RlY29yYXRvcnM7XG4gICAgbGV0IF8kX2RlY29yYXRvcnM7XG4gICAgbGV0IF8kJF9kZWNvcmF0b3JzO1xuICAgIGxldCBfJGV2YWxfZGVjb3JhdG9ycztcbiAgICBsZXQgXyQkZXZhbF9kZWNvcmF0b3JzO1xuICAgIGxldCBfd2FpdEZvclNlbGVjdG9yX2RlY29yYXRvcnM7XG4gICAgbGV0IF93YWl0Rm9yRnVuY3Rpb25fZGVjb3JhdG9ycztcbiAgICBsZXQgX2NvbnRlbnRfZGVjb3JhdG9ycztcbiAgICBsZXQgX2FkZFNjcmlwdFRhZ19kZWNvcmF0b3JzO1xuICAgIGxldCBfYWRkU3R5bGVUYWdfZGVjb3JhdG9ycztcbiAgICBsZXQgX2NsaWNrX2RlY29yYXRvcnM7XG4gICAgbGV0IF9mb2N1c19kZWNvcmF0b3JzO1xuICAgIGxldCBfaG92ZXJfZGVjb3JhdG9ycztcbiAgICBsZXQgX3NlbGVjdF9kZWNvcmF0b3JzO1xuICAgIGxldCBfdGFwX2RlY29yYXRvcnM7XG4gICAgbGV0IF90eXBlX2RlY29yYXRvcnM7XG4gICAgbGV0IF90aXRsZV9kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBGcmFtZSBleHRlbmRzIF9jbGFzc1N1cGVyIHtcbiAgICAgICAgc3RhdGljIHtcbiAgICAgICAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7XG4gICAgICAgICAgICBfZnJhbWVFbGVtZW50X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9ldmFsdWF0ZUhhbmRsZV9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfZXZhbHVhdGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX2xvY2F0b3JfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgXyRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgXyQkX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF8kZXZhbF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfJCRldmFsX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF93YWl0Rm9yU2VsZWN0b3JfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX3dhaXRGb3JGdW5jdGlvbl9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfY29udGVudF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfYWRkU2NyaXB0VGFnX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9hZGRTdHlsZVRhZ19kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfY2xpY2tfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX2ZvY3VzX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9ob3Zlcl9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfc2VsZWN0X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF90YXBfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX3RpdGxlX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZnJhbWVFbGVtZW50X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJmcmFtZUVsZW1lbnRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImZyYW1lRWxlbWVudFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmZyYW1lRWxlbWVudCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZXZhbHVhdGVIYW5kbGVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImV2YWx1YXRlSGFuZGxlXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJldmFsdWF0ZUhhbmRsZVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmV2YWx1YXRlSGFuZGxlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9ldmFsdWF0ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZXZhbHVhdGVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImV2YWx1YXRlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZXZhbHVhdGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2xvY2F0b3JfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImxvY2F0b3JcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImxvY2F0b3JcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5sb2NhdG9yIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF8kX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIkXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCIkXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouJCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfJCRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiQkXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCIkJFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiQkIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF8kZXZhbF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiJGV2YWxcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIiRldmFsXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouJGV2YWwgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgXyQkZXZhbF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiJCRldmFsXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCIkJGV2YWxcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai4kJGV2YWwgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JTZWxlY3Rvcl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwid2FpdEZvclNlbGVjdG9yXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ3YWl0Rm9yU2VsZWN0b3JcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yU2VsZWN0b3IgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JGdW5jdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwid2FpdEZvckZ1bmN0aW9uXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ3YWl0Rm9yRnVuY3Rpb25cIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yRnVuY3Rpb24gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2NvbnRlbnRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImNvbnRlbnRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImNvbnRlbnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5jb250ZW50IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9hZGRTY3JpcHRUYWdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImFkZFNjcmlwdFRhZ1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiYWRkU2NyaXB0VGFnXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYWRkU2NyaXB0VGFnIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9hZGRTdHlsZVRhZ19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiYWRkU3R5bGVUYWdcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImFkZFN0eWxlVGFnXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYWRkU3R5bGVUYWcgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2NsaWNrX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJjbGlja1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiY2xpY2tcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5jbGljayB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZm9jdXNfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImZvY3VzXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJmb2N1c1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmZvY3VzIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9ob3Zlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiaG92ZXJcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImhvdmVyXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaG92ZXIgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3NlbGVjdF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2VsZWN0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzZWxlY3RcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5zZWxlY3QgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RhcF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidGFwXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ0YXBcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50YXAgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3R5cGVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInR5cGVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInR5cGVcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50eXBlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF90aXRsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidGl0bGVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInRpdGxlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudGl0bGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX2lkID0gX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBfcGFyZW50SWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIF9uYW1lO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBfaGFzU3RhcnRlZExvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICB9XG4gICAgICAgICNfZG9jdW1lbnQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgICNkb2N1bWVudCgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy4jX2RvY3VtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jX2RvY3VtZW50ID0gdGhpcy5tYWluUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNfZG9jdW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY2xlYXIgdGhlIGRvY3VtZW50IGhhbmRsZSB0aGF0IGhhcyBiZWVuIGRlc3Ryb3llZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBjbGVhckRvY3VtZW50SGFuZGxlKCkge1xuICAgICAgICAgICAgdGhpcy4jX2RvY3VtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgZnJhbWUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmcmFtZSAoaWYgYW55KS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZyYW1lRWxlbWVudCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRGcmFtZSA9IHRoaXMucGFyZW50RnJhbWUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHBhcmVudEZyYW1lLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUsZnJhbWUnKTtcbiAgICAgICAgICAgICAgICB9KSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgaWZyYW1lXzEgb2YgdHJhbnNwb3NlSXRlcmFibGVIYW5kbGUobGlzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52XzIgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMiwgaWZyYW1lXzEsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgaWZyYW1lLmNvbnRlbnRGcmFtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lPy5faWQgPT09IHRoaXMuX2lkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZS5tb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgICAgIGVudl8xLmVycm9yID0gZV8yO1xuICAgICAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJlaGF2ZXMgaWRlbnRpY2FsbHkgdG8ge0BsaW5rIFBhZ2UuZXZhbHVhdGVIYW5kbGV9IGV4Y2VwdCBpdCdzIHJ1biB3aXRoaW5cbiAgICAgICAgICogdGhlIGNvbnRleHQgb2YgdGhpcyBmcmFtZS5cbiAgICAgICAgICpcbiAgICAgICAgICogU2VlIHtAbGluayBQYWdlLmV2YWx1YXRlSGFuZGxlfSBmb3IgZGV0YWlscy5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICAgICAgcGFnZUZ1bmN0aW9uID0gd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSh0aGlzLmV2YWx1YXRlSGFuZGxlLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCZWhhdmVzIGlkZW50aWNhbGx5IHRvIHtAbGluayBQYWdlLmV2YWx1YXRlfSBleGNlcHQgaXQncyBydW4gd2l0aGluXG4gICAgICAgICAqIHRoZSBjb250ZXh0IG9mIHRoaXMgZnJhbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFNlZSB7QGxpbmsgUGFnZS5ldmFsdWF0ZX0gZm9yIGRldGFpbHMuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBldmFsdWF0ZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy5ldmFsdWF0ZS5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpblJlYWxtKCkuZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBsb2NhdG9yKHNlbGVjdG9yT3JGdW5jKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNlbGVjdG9yT3JGdW5jID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBOb2RlTG9jYXRvci5jcmVhdGUodGhpcywgc2VsZWN0b3JPckZ1bmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uTG9jYXRvci5jcmVhdGUodGhpcywgc2VsZWN0b3JPckZ1bmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBRdWVyaWVzIHRoZSBmcmFtZSBmb3IgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIEEge0BsaW5rIEVsZW1lbnRIYW5kbGUgfCBlbGVtZW50IGhhbmRsZX0gdG8gdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgICAgICogbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLiBPdGhlcndpc2UsIGBudWxsYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBydWxlc2Rpci91c2UtdXNpbmcgLS0gVGhpcyBpcyBjYWNoZWQuXG4gICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IGF3YWl0IHRoaXMuI2RvY3VtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZG9jdW1lbnQuJChzZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFF1ZXJpZXMgdGhlIGZyYW1lIGZvciBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB7QGxpbmsgRWxlbWVudEhhbmRsZSB8IGVsZW1lbnQgaGFuZGxlc30gdGhhdCBwb2ludCB0b1xuICAgICAgICAgKiBlbGVtZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkJChzZWxlY3Rvciwgb3B0aW9ucykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ1bGVzZGlyL3VzZS11c2luZyAtLSBUaGlzIGlzIGNhY2hlZC5cbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gYXdhaXQgdGhpcy4jZG9jdW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkb2N1bWVudC4kJChzZWxlY3Rvciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJ1bnMgdGhlIGdpdmVuIGZ1bmN0aW9uIG9uIHRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciBpblxuICAgICAgICAgKiB0aGUgZnJhbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdGlsbFxuICAgICAgICAgKiB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VhcmNoVmFsdWUgPSBhd2FpdCBmcmFtZS4kZXZhbCgnI3NlYXJjaCcsIGVsID0+IGVsLnZhbHVlKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBmcmFtZSdzIGNvbnRleHQuXG4gICAgICAgICAqIFRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvciB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYXNcbiAgICAgICAgICogaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICRldmFsKHNlbGVjdG9yLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy4kZXZhbC5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ1bGVzZGlyL3VzZS11c2luZyAtLSBUaGlzIGlzIGNhY2hlZC5cbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gYXdhaXQgdGhpcy4jZG9jdW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkb2N1bWVudC4kZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yXG4gICAgICAgICAqIGluIHRoZSBmcmFtZS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGdpdmVuIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgd2FpdCB0aWxsXG4gICAgICAgICAqIHRoZSBwcm9taXNlIHJlc29sdmVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBkaXZzQ291bnRzID0gYXdhaXQgZnJhbWUuJCRldmFsKCdkaXYnLCBkaXZzID0+IGRpdnMubGVuZ3RoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBmcmFtZSdzIGNvbnRleHQuXG4gICAgICAgICAqIEFuIGFycmF5IG9mIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciB3aWxsIGJlIHBhc3NlZCB0byB0aGVcbiAgICAgICAgICogZnVuY3Rpb24gYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuJCRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnVsZXNkaXIvdXNlLXVzaW5nIC0tIFRoaXMgaXMgY2FjaGVkLlxuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBhd2FpdCB0aGlzLiNkb2N1bWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRvY3VtZW50LiQkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdHMgZm9yIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIHRvIGFwcGVhciBpbiB0aGUgZnJhbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHdvcmtzIGFjcm9zcyBuYXZpZ2F0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKlxuICAgICAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgKiAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gICAgICAgICAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICAgKiAgIGxldCBjdXJyZW50VVJMO1xuICAgICAgICAgKiAgIHBhZ2VcbiAgICAgICAgICogICAgIC5tYWluRnJhbWUoKVxuICAgICAgICAgKiAgICAgLndhaXRGb3JTZWxlY3RvcignaW1nJylcbiAgICAgICAgICogICAgIC50aGVuKCgpID0+IGNvbnNvbGUubG9nKCdGaXJzdCBVUkwgd2l0aCBpbWFnZTogJyArIGN1cnJlbnRVUkwpKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICBmb3IgKGN1cnJlbnRVUkwgb2YgW1xuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZ29vZ2xlLmNvbScsXG4gICAgICAgICAqICAgICAnaHR0cHM6Ly9iYmMuY29tJyxcbiAgICAgICAgICogICBdKSB7XG4gICAgICAgICAqICAgICBhd2FpdCBwYWdlLmdvdG8oY3VycmVudFVSTCk7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIFRoZSBzZWxlY3RvciB0byBxdWVyeSBhbmQgd2FpdCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgY3VzdG9taXppbmcgd2FpdGluZyBiZWhhdmlvci5cbiAgICAgICAgICogQHJldHVybnMgQW4gZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqIEB0aHJvd3MgVGhyb3dzIGlmIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGRvZXNuJ3QgYXBwZWFyLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FpdEZvclNlbGVjdG9yKHNlbGVjdG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlZFNlbGVjdG9yLCBRdWVyeUhhbmRsZXIsIHBvbGxpbmcgfSA9IGdldFF1ZXJ5SGFuZGxlckFuZFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgUXVlcnlIYW5kbGVyLndhaXRGb3IodGhpcywgdXBkYXRlZFNlbGVjdG9yLCB7XG4gICAgICAgICAgICAgICAgcG9sbGluZyxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBUaGUgYHdhaXRGb3JGdW5jdGlvbmAgY2FuIGJlIHVzZWQgdG8gb2JzZXJ2ZSB2aWV3cG9ydCBzaXplIGNoYW5nZTpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKlxuICAgICAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgKiAuICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICAgICAgICAgKiAuICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgICAgICAqIC4gIGNvbnN0IHdhdGNoRG9nID0gcGFnZS5tYWluRnJhbWUoKS53YWl0Rm9yRnVuY3Rpb24oJ3dpbmRvdy5pbm5lcldpZHRoIDwgMTAwJyk7XG4gICAgICAgICAqIC4gIHBhZ2Uuc2V0Vmlld3BvcnQoe3dpZHRoOiA1MCwgaGVpZ2h0OiA1MH0pO1xuICAgICAgICAgKiAuICBhd2FpdCB3YXRjaERvZztcbiAgICAgICAgICogLiAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICAgICAgICAgKiB9KSgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogVG8gcGFzcyBhcmd1bWVudHMgZnJvbSBOb2RlLmpzIHRvIHRoZSBwcmVkaWNhdGUgb2YgYHBhZ2Uud2FpdEZvckZ1bmN0aW9uYCBmdW5jdGlvbjpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VsZWN0b3IgPSAnLmZvbyc7XG4gICAgICAgICAqIGF3YWl0IGZyYW1lLndhaXRGb3JGdW5jdGlvbihcbiAgICAgICAgICogICBzZWxlY3RvciA9PiAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLFxuICAgICAgICAgKiAgIHt9LCAvLyBlbXB0eSBvcHRpb25zIG9iamVjdFxuICAgICAgICAgKiAgIHNlbGVjdG9yXG4gICAgICAgICAqICk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gcGFnZUZ1bmN0aW9uIC0gdGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIGluIHRoZSBmcmFtZSBjb250ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBwb2xsaW5nIG1ldGhvZCBhbmQgdGltZW91dC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEByZXR1cm5zIHRoZSBwcm9taXNlIHdoaWNoIHJlc29sdmUgd2hlbiB0aGUgYHBhZ2VGdW5jdGlvbmAgcmV0dXJucyBhIHRydXRoeSB2YWx1ZS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhaXRGb3JGdW5jdGlvbihwYWdlRnVuY3Rpb24sIG9wdGlvbnMgPSB7fSwgLi4uYXJncykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpblJlYWxtKCkud2FpdEZvckZ1bmN0aW9uKHBhZ2VGdW5jdGlvbiwgb3B0aW9ucywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBmdWxsIEhUTUwgY29udGVudHMgb2YgdGhlIGZyYW1lLCBpbmNsdWRpbmcgdGhlIERPQ1RZUEUuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjb250ZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXZhbHVhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gJyc7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIGRvY3VtZW50LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNldEZyYW1lQ29udGVudChjb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ldmFsdWF0ZShodG1sID0+IHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5vcGVuKCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoaHRtbCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuY2xvc2UoKTtcbiAgICAgICAgICAgIH0sIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZnJhbWUncyBgbmFtZWAgYXR0cmlidXRlIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFnLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiB0aGUgbmFtZSBpcyBlbXB0eSwgaXQgcmV0dXJucyB0aGUgYGlkYCBhdHRyaWJ1dGUgaW5zdGVhZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBjYWxjdWxhdGVkIG9uY2Ugd2hlbiB0aGUgZnJhbWUgaXMgY3JlYXRlZCwgYW5kIHdpbGwgbm90XG4gICAgICAgICAqIHVwZGF0ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGNoYW5nZWQgbGF0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZXByZWNhdGVkIFVzZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBlbGVtZW50ID0gYXdhaXQgZnJhbWUuZnJhbWVFbGVtZW50KCk7XG4gICAgICAgICAqIGNvbnN0IG5hbWVPcklkID0gYXdhaXQgZWxlbWVudC5ldmFsdWF0ZShmcmFtZSA9PiBmcmFtZS5uYW1lID8/IGZyYW1lLmlkKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBuYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25hbWUgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzYHRydWVgIGlmIHRoZSBmcmFtZSBoYXMgYmVlbiBkZXRhY2hlZC4gT3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGBkZXRhY2hlZGAgZ2V0dGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgaXNEZXRhY2hlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGRzIGEgYDxzY3JpcHQ+YCB0YWcgaW50byB0aGUgcGFnZSB3aXRoIHRoZSBkZXNpcmVkIHVybCBvciBjb250ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBzY3JpcHQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIHtAbGluayBFbGVtZW50SGFuZGxlIHwgZWxlbWVudCBoYW5kbGV9IHRvIHRoZSBpbmplY3RlZFxuICAgICAgICAgKiBgPHNjcmlwdD5gIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhZGRTY3JpcHRUYWcob3B0aW9ucykge1xuICAgICAgICAgICAgbGV0IHsgY29udGVudCA9ICcnLCB0eXBlIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgeyBwYXRoIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgaWYgKCshIW9wdGlvbnMudXJsICsgKyEhcGF0aCArICshIWNvbnRlbnQgIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4YWN0bHkgb25lIG9mIGB1cmxgLCBgcGF0aGAsIG9yIGBjb250ZW50YCBtdXN0IGJlIHNwZWNpZmllZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnRGU1Byb21pc2VzKCk7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgICAgICAgY29udGVudCArPSBgLy8jIHNvdXJjZVVSTD0ke3BhdGgucmVwbGFjZSgvXFxuL2csICcnKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHlwZSA9IHR5cGUgPz8gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluUmVhbG0oKS50cmFuc2ZlckhhbmRsZShhd2FpdCB0aGlzLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZShhc3luYyAoeyB1cmwsIGlkLCB0eXBlLCBjb250ZW50IH0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICBzY3JpcHQudGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXZlbnQubWVzc2FnZSA/PyAnQ291bGQgbm90IGxvYWQgc2NyaXB0JykpO1xuICAgICAgICAgICAgICAgICAgICB9LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmlkID0gaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgeyAuLi5vcHRpb25zLCB0eXBlLCBjb250ZW50IH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhZGRTdHlsZVRhZyhvcHRpb25zKSB7XG4gICAgICAgICAgICBsZXQgeyBjb250ZW50ID0gJycgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCB7IHBhdGggfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoKyEhb3B0aW9ucy51cmwgKyArISFwYXRoICsgKyEhY29udGVudCAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhhY3RseSBvbmUgb2YgYHVybGAsIGBwYXRoYCwgb3IgYGNvbnRlbnRgIG11c3QgYmUgc3BlY2lmaWVkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydEZTUHJvbWlzZXMoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgICBjb250ZW50ICs9ICcvKiMgc291cmNlVVJMPScgKyBwYXRoLnJlcGxhY2UoL1xcbi9nLCAnJykgKyAnKi8nO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluUmVhbG0oKS50cmFuc2ZlckhhbmRsZShhd2FpdCB0aGlzLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZShhc3luYyAoeyB1cmwsIGNvbnRlbnQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBsaW5rO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXZlbnQubWVzc2FnZSA/PyAnQ291bGQgbm90IGxvYWQgc3R5bGUnKSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBvcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENsaWNrcyB0aGUgZmlyc3QgZWxlbWVudCBmb3VuZCB0aGF0IG1hdGNoZXMgYHNlbGVjdG9yYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogSWYgYGNsaWNrKClgIHRyaWdnZXJzIGEgbmF2aWdhdGlvbiBldmVudCBhbmQgdGhlcmUncyBhIHNlcGFyYXRlXG4gICAgICAgICAqIGBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKClgIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQsIHlvdSBtYXkgZW5kIHVwIHdpdGggYVxuICAgICAgICAgKiByYWNlIGNvbmRpdGlvbiB0aGF0IHlpZWxkcyB1bmV4cGVjdGVkIHJlc3VsdHMuIFRoZSBjb3JyZWN0IHBhdHRlcm4gZm9yXG4gICAgICAgICAqIGNsaWNrIGFuZCB3YWl0IGZvciBuYXZpZ2F0aW9uIGlzIHRoZSBmb2xsb3dpbmc6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IFtyZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAqICAgcGFnZS53YWl0Rm9yTmF2aWdhdGlvbih3YWl0T3B0aW9ucyksXG4gICAgICAgICAqICAgZnJhbWUuY2xpY2soc2VsZWN0b3IsIGNsaWNrT3B0aW9ucyksXG4gICAgICAgICAqIF0pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIHRvIHF1ZXJ5IGZvci5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNsaWNrKHNlbGVjdG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMywgYXdhaXQgdGhpcy4kKHNlbGVjdG9yKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGFzc2VydChoYW5kbGUsIGBObyBlbGVtZW50IGZvdW5kIGZvciBzZWxlY3RvcjogJHtzZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUuY2xpY2sob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzMpIHtcbiAgICAgICAgICAgICAgICBlbnZfMy5lcnJvciA9IGVfMztcbiAgICAgICAgICAgICAgICBlbnZfMy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGb2N1c2VzIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgYHNlbGVjdG9yYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIHRvIHF1ZXJ5IGZvci5cbiAgICAgICAgICogQHRocm93cyBUaHJvd3MgaWYgdGhlcmUncyBubyBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmb2N1cyhzZWxlY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgZW52XzQgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl80LCBhd2FpdCB0aGlzLiQoc2VsZWN0b3IpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGhhbmRsZSwgYE5vIGVsZW1lbnQgZm91bmQgZm9yIHNlbGVjdG9yOiAke3NlbGVjdG9yfWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZS5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfNCkge1xuICAgICAgICAgICAgICAgIGVudl80LmVycm9yID0gZV80O1xuICAgICAgICAgICAgICAgIGVudl80Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhvdmVycyB0aGUgcG9pbnRlciBvdmVyIHRoZSBjZW50ZXIgb2YgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZVxuICAgICAgICAgKiBgc2VsZWN0b3JgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgc2VsZWN0b3IgdG8gcXVlcnkgZm9yLlxuICAgICAgICAgKiBAdGhyb3dzIFRocm93cyBpZiB0aGVyZSdzIG5vIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGhvdmVyKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZfNSA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzUsIGF3YWl0IHRoaXMuJChzZWxlY3RvciksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoaGFuZGxlLCBgTm8gZWxlbWVudCBmb3VuZCBmb3Igc2VsZWN0b3I6ICR7c2VsZWN0b3J9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLmhvdmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV81KSB7XG4gICAgICAgICAgICAgICAgZW52XzUuZXJyb3IgPSBlXzU7XG4gICAgICAgICAgICAgICAgZW52XzUuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl81KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogU2VsZWN0cyBhIHNldCBvZiB2YWx1ZSBvbiB0aGUgZmlyc3QgYDxzZWxlY3Q+YCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGVcbiAgICAgICAgICogYHNlbGVjdG9yYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogZnJhbWUuc2VsZWN0KCdzZWxlY3QjY29sb3JzJywgJ2JsdWUnKTsgLy8gc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgKiBmcmFtZS5zZWxlY3QoJ3NlbGVjdCNjb2xvcnMnLCAncmVkJywgJ2dyZWVuJywgJ2JsdWUnKTsgLy8gbXVsdGlwbGUgc2VsZWN0aW9uc1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIHRvIHF1ZXJ5IGZvci5cbiAgICAgICAgICogQHBhcmFtIHZhbHVlcyAtIFRoZSBhcnJheSBvZiB2YWx1ZXMgdG8gc2VsZWN0LiBJZiB0aGUgYDxzZWxlY3Q+YCBoYXMgdGhlXG4gICAgICAgICAqIGBtdWx0aXBsZWAgYXR0cmlidXRlLCBhbGwgdmFsdWVzIGFyZSBjb25zaWRlcmVkLCBvdGhlcndpc2Ugb25seSB0aGUgZmlyc3RcbiAgICAgICAgICogb25lIGlzIHRha2VuIGludG8gYWNjb3VudC5cbiAgICAgICAgICogQHJldHVybnMgdGhlIGxpc3Qgb2YgdmFsdWVzIHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgc2VsZWN0ZWQuXG4gICAgICAgICAqIEB0aHJvd3MgVGhyb3dzIGlmIHRoZXJlJ3Mgbm8gYDxzZWxlY3Q+YCBtYXRjaGluZyBgc2VsZWN0b3JgLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2VsZWN0KHNlbGVjdG9yLCAuLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl82ID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfNiwgYXdhaXQgdGhpcy4kKHNlbGVjdG9yKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGFzc2VydChoYW5kbGUsIGBObyBlbGVtZW50IGZvdW5kIGZvciBzZWxlY3RvcjogJHtzZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgaGFuZGxlLnNlbGVjdCguLi52YWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfNikge1xuICAgICAgICAgICAgICAgIGVudl82LmVycm9yID0gZV82O1xuICAgICAgICAgICAgICAgIGVudl82Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhcHMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBgc2VsZWN0b3JgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgc2VsZWN0b3IgdG8gcXVlcnkgZm9yLlxuICAgICAgICAgKiBAdGhyb3dzIFRocm93cyBpZiB0aGVyZSdzIG5vIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRhcChzZWxlY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgZW52XzcgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl83LCBhd2FpdCB0aGlzLiQoc2VsZWN0b3IpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGhhbmRsZSwgYE5vIGVsZW1lbnQgZm91bmQgZm9yIHNlbGVjdG9yOiAke3NlbGVjdG9yfWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZS50YXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzcpIHtcbiAgICAgICAgICAgICAgICBlbnZfNy5lcnJvciA9IGVfNztcbiAgICAgICAgICAgICAgICBlbnZfNy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZW5kcyBhIGBrZXlkb3duYCwgYGtleXByZXNzYC9gaW5wdXRgLCBhbmQgYGtleXVwYCBldmVudCBmb3IgZWFjaCBjaGFyYWN0ZXJcbiAgICAgICAgICogaW4gdGhlIHRleHQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFRvIHByZXNzIGEgc3BlY2lhbCBrZXksIGxpa2UgYENvbnRyb2xgIG9yIGBBcnJvd0Rvd25gLCB1c2VcbiAgICAgICAgICoge0BsaW5rIEtleWJvYXJkLnByZXNzfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogYXdhaXQgZnJhbWUudHlwZSgnI215dGV4dGFyZWEnLCAnSGVsbG8nKTsgLy8gVHlwZXMgaW5zdGFudGx5XG4gICAgICAgICAqIGF3YWl0IGZyYW1lLnR5cGUoJyNteXRleHRhcmVhJywgJ1dvcmxkJywge2RlbGF5OiAxMDB9KTsgLy8gVHlwZXMgc2xvd2VyLCBsaWtlIGEgdXNlclxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gdGhlIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudCB0byB0eXBlIGludG8uIElmIHRoZXJlIGFyZVxuICAgICAgICAgKiBtdWx0aXBsZSB0aGUgZmlyc3Qgd2lsbCBiZSB1c2VkLlxuICAgICAgICAgKiBAcGFyYW0gdGV4dCAtIHRleHQgdG8gdHlwZSBpbnRvIHRoZSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gdGFrZXMgb25lIG9wdGlvbiwgYGRlbGF5YCwgd2hpY2ggc2V0cyB0aGUgdGltZSB0byB3YWl0XG4gICAgICAgICAqIGJldHdlZW4ga2V5IHByZXNzZXMgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byBgMGAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0eXBlKHNlbGVjdG9yLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZfOCA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzgsIGF3YWl0IHRoaXMuJChzZWxlY3RvciksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoaGFuZGxlLCBgTm8gZWxlbWVudCBmb3VuZCBmb3Igc2VsZWN0b3I6ICR7c2VsZWN0b3J9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnR5cGUodGV4dCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV84KSB7XG4gICAgICAgICAgICAgICAgZW52XzguZXJyb3IgPSBlXzg7XG4gICAgICAgICAgICAgICAgZW52XzguaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl84KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGZyYW1lJ3MgdGl0bGUuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0aXRsZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnRpdGxlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IEZyYW1lIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GcmFtZS5qcy5tYXAiLCJpbXBvcnQgeyBkZWJ1Z0Vycm9yLCBpc1N0cmluZyB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogVGhlIGRlZmF1bHQgY29vcGVyYXRpdmUgcmVxdWVzdCBpbnRlcmNlcHRpb24gcmVzb2x1dGlvbiBwcmlvcml0eVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5URVJDRVBUX1JFU09MVVRJT05fUFJJT1JJVFkgPSAwO1xuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEhUVFAgcmVxdWVzdCBzZW50IGJ5IGEgcGFnZS5cbiAqIEByZW1hcmtzXG4gKlxuICogV2hlbmV2ZXIgdGhlIHBhZ2Ugc2VuZHMgYSByZXF1ZXN0LCBzdWNoIGFzIGZvciBhIG5ldHdvcmsgcmVzb3VyY2UsIHRoZVxuICogZm9sbG93aW5nIGV2ZW50cyBhcmUgZW1pdHRlZCBieSBQdXBwZXRlZXIncyBgcGFnZWA6XG4gKlxuICogLSBgcmVxdWVzdGA6IGVtaXR0ZWQgd2hlbiB0aGUgcmVxdWVzdCBpcyBpc3N1ZWQgYnkgdGhlIHBhZ2UuXG4gKiAtIGByZXF1ZXN0ZmluaXNoZWRgIC0gZW1pdHRlZCB3aGVuIHRoZSByZXNwb25zZSBib2R5IGlzIGRvd25sb2FkZWQgYW5kIHRoZVxuICogICByZXF1ZXN0IGlzIGNvbXBsZXRlLlxuICpcbiAqIElmIHJlcXVlc3QgZmFpbHMgYXQgc29tZSBwb2ludCwgdGhlbiBpbnN0ZWFkIG9mIGByZXF1ZXN0ZmluaXNoZWRgIGV2ZW50IHRoZVxuICogYHJlcXVlc3RmYWlsZWRgIGV2ZW50IGlzIGVtaXR0ZWQuXG4gKlxuICogQWxsIG9mIHRoZXNlIGV2ZW50cyBwcm92aWRlIGFuIGluc3RhbmNlIG9mIGBIVFRQUmVxdWVzdGAgcmVwcmVzZW50aW5nIHRoZVxuICogcmVxdWVzdCB0aGF0IG9jY3VycmVkOlxuICpcbiAqIGBgYFxuICogcGFnZS5vbigncmVxdWVzdCcsIHJlcXVlc3QgPT4gLi4uKVxuICogYGBgXG4gKlxuICogTk9URTogSFRUUCBFcnJvciByZXNwb25zZXMsIHN1Y2ggYXMgNDA0IG9yIDUwMywgYXJlIHN0aWxsIHN1Y2Nlc3NmdWxcbiAqIHJlc3BvbnNlcyBmcm9tIEhUVFAgc3RhbmRwb2ludCwgc28gcmVxdWVzdCB3aWxsIGNvbXBsZXRlIHdpdGhcbiAqIGByZXF1ZXN0ZmluaXNoZWRgIGV2ZW50LlxuICpcbiAqIElmIHJlcXVlc3QgZ2V0cyBhICdyZWRpcmVjdCcgcmVzcG9uc2UsIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZFxuICogd2l0aCB0aGUgYHJlcXVlc3RmaW5pc2hlZGAgZXZlbnQsIGFuZCBhIG5ldyByZXF1ZXN0IGlzIGlzc3VlZCB0byBhXG4gKiByZWRpcmVjdGVkIHVybC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBIVFRQUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2ludGVyY2VwdGlvbklkO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9mYWlsdXJlVGV4dCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3Jlc3BvbnNlID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfZnJvbU1lbW9yeUNhY2hlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3JlZGlyZWN0Q2hhaW4gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBpbnRlcmNlcHRpb24gPSB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBoYW5kbGVkOiBmYWxzZSxcbiAgICAgICAgaGFuZGxlcnM6IFtdLFxuICAgICAgICByZXNvbHV0aW9uU3RhdGU6IHtcbiAgICAgICAgICAgIGFjdGlvbjogSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbi5Ob25lLFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0T3ZlcnJpZGVzOiB7fSxcbiAgICAgICAgcmVzcG9uc2U6IG51bGwsXG4gICAgICAgIGFib3J0UmVhc29uOiBudWxsLFxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICAgKiBUaGUgYENvbnRpbnVlUmVxdWVzdE92ZXJyaWRlc2AgdGhhdCB3aWxsIGJlIHVzZWRcbiAgICAgKiBpZiB0aGUgaW50ZXJjZXB0aW9uIGlzIGFsbG93ZWQgdG8gY29udGludWUgKGllLCBgYWJvcnQoKWAgYW5kXG4gICAgICogYHJlc3BvbmQoKWAgYXJlbid0IGNhbGxlZCkuXG4gICAgICovXG4gICAgY29udGludWVSZXF1ZXN0T3ZlcnJpZGVzKCkge1xuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmNlcHRpb24ucmVxdWVzdE92ZXJyaWRlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGBSZXNwb25zZUZvclJlcXVlc3RgIHRoYXQgZ2V0cyB1c2VkIGlmIHRoZVxuICAgICAqIGludGVyY2VwdGlvbiBpcyBhbGxvd2VkIHRvIHJlc3BvbmQgKGllLCBgYWJvcnQoKWAgaXMgbm90IGNhbGxlZCkuXG4gICAgICovXG4gICAgcmVzcG9uc2VGb3JSZXF1ZXN0KCkge1xuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmNlcHRpb24ucmVzcG9uc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IHJlY2VudCByZWFzb24gZm9yIGFib3J0aW5nIHRoZSByZXF1ZXN0XG4gICAgICovXG4gICAgYWJvcnRFcnJvclJlYXNvbigpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuaW50ZXJjZXB0aW9uLmVuYWJsZWQsICdSZXF1ZXN0IEludGVyY2VwdGlvbiBpcyBub3QgZW5hYmxlZCEnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJjZXB0aW9uLmFib3J0UmVhc29uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBJbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGN1cnJlbnQgcmVzb2x1dGlvblxuICAgICAqIGFjdGlvbiBhbmQgcHJpb3JpdHkuXG4gICAgICpcbiAgICAgKiBJbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUgY29udGFpbnM6XG4gICAgICogYWN0aW9uOiBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uXG4gICAgICogcHJpb3JpdHk/OiBudW1iZXJcbiAgICAgKlxuICAgICAqIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24gaXMgb25lIG9mOiBgYWJvcnRgLCBgcmVzcG9uZGAsIGBjb250aW51ZWAsXG4gICAgICogYGRpc2FibGVkYCwgYG5vbmVgLCBvciBgYWxyZWFkeS1oYW5kbGVkYC5cbiAgICAgKi9cbiAgICBpbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgYWN0aW9uOiBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uLkRpc2FibGVkIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGFjdGlvbjogSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbi5BbHJlYWR5SGFuZGxlZCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLnRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZSB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyBgdHJ1ZWAgaWYgdGhlIGludGVyY2VwdCByZXNvbHV0aW9uIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCxcbiAgICAgKiBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc0ludGVyY2VwdFJlc29sdXRpb25IYW5kbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBhc3luYyByZXF1ZXN0IGhhbmRsZXIgdG8gdGhlIHByb2Nlc3NpbmcgcXVldWUuXG4gICAgICogRGVmZXJyZWQgaGFuZGxlcnMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGV4ZWN1dGUgaW4gYW55IHBhcnRpY3VsYXIgb3JkZXIsXG4gICAgICogYnV0IHRoZXkgYXJlIGd1YXJhbnRlZWQgdG8gcmVzb2x2ZSBiZWZvcmUgdGhlIHJlcXVlc3QgaW50ZXJjZXB0aW9uXG4gICAgICogaXMgZmluYWxpemVkLlxuICAgICAqL1xuICAgIGVucXVldWVJbnRlcmNlcHRBY3Rpb24ocGVuZGluZ0hhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlcnMucHVzaChwZW5kaW5nSGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF3YWl0cyBwZW5kaW5nIGludGVyY2VwdGlvbiBoYW5kbGVycyBhbmQgdGhlbiBkZWNpZGVzIGhvdyB0byBmdWxmaWxsXG4gICAgICogdGhlIHJlcXVlc3QgaW50ZXJjZXB0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGZpbmFsaXplSW50ZXJjZXB0aW9ucygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlcnMucmVkdWNlKChwcm9taXNlQ2hhaW4sIGludGVyY2VwdEFjdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VDaGFpbi50aGVuKGludGVyY2VwdEFjdGlvbik7XG4gICAgICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKTtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlcnMgPSBbXTsgLy8gVE9ETzogdmVyaWZ5IHRoaXMgaXMgY29ycmVjdCB0b3AgbGV0IGdjIHJ1blxuICAgICAgICBjb25zdCB7IGFjdGlvbiB9ID0gdGhpcy5pbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUoKTtcbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2Fib3J0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fYWJvcnQodGhpcy5pbnRlcmNlcHRpb24uYWJvcnRSZWFzb24pO1xuICAgICAgICAgICAgY2FzZSAncmVzcG9uZCc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJjZXB0aW9uLnJlc3BvbnNlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UgaXMgbWlzc2luZyBmb3IgdGhlIGludGVyY2VwdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVzcG9uZCh0aGlzLmludGVyY2VwdGlvbi5yZXNwb25zZSk7XG4gICAgICAgICAgICBjYXNlICdjb250aW51ZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbnRpbnVlKHRoaXMuaW50ZXJjZXB0aW9uLnJlcXVlc3RPdmVycmlkZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnRpbnVlcyByZXF1ZXN0IHdpdGggb3B0aW9uYWwgcmVxdWVzdCBvdmVycmlkZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb24odHJ1ZSk7XG4gICAgICogcGFnZS5vbigncmVxdWVzdCcsIHJlcXVlc3QgPT4ge1xuICAgICAqICAgLy8gT3ZlcnJpZGUgaGVhZGVyc1xuICAgICAqICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHJlcXVlc3QuaGVhZGVycygpLCB7XG4gICAgICogICAgIGZvbzogJ2JhcicsIC8vIHNldCBcImZvb1wiIGhlYWRlclxuICAgICAqICAgICBvcmlnaW46IHVuZGVmaW5lZCwgLy8gcmVtb3ZlIFwib3JpZ2luXCIgaGVhZGVyXG4gICAgICogICB9KTtcbiAgICAgKiAgIHJlcXVlc3QuY29udGludWUoe2hlYWRlcnN9KTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvdmVycmlkZXMgLSBvcHRpb25hbCBvdmVycmlkZXMgdG8gYXBwbHkgdG8gdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHByaW9yaXR5IC0gSWYgcHJvdmlkZWQsIGludGVyY2VwdCBpcyByZXNvbHZlZCB1c2luZyBjb29wZXJhdGl2ZVxuICAgICAqIGhhbmRsaW5nIHJ1bGVzLiBPdGhlcndpc2UsIGludGVyY2VwdCBpcyByZXNvbHZlZCBpbW1lZGlhdGVseS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiBUbyB1c2UgdGhpcywgcmVxdWVzdCBpbnRlcmNlcHRpb24gc2hvdWxkIGJlIGVuYWJsZWQgd2l0aFxuICAgICAqIHtAbGluayBQYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb259LlxuICAgICAqXG4gICAgICogRXhjZXB0aW9uIGlzIGltbWVkaWF0ZWx5IHRocm93biBpZiB0aGUgcmVxdWVzdCBpbnRlcmNlcHRpb24gaXMgbm90IGVuYWJsZWQuXG4gICAgICovXG4gICAgYXN5bmMgY29udGludWUob3ZlcnJpZGVzID0ge30sIHByaW9yaXR5KSB7XG4gICAgICAgIC8vIFJlcXVlc3QgaW50ZXJjZXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRhdGE6IHVybHMuXG4gICAgICAgIGlmICh0aGlzLnVybCgpLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQsICdSZXF1ZXN0IGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb250aW51ZShvdmVycmlkZXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlcXVlc3RPdmVycmlkZXMgPSBvdmVycmlkZXM7XG4gICAgICAgIGlmICh0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUucHJpb3JpdHkgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgcHJpb3JpdHkgPiB0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uQ29udGludWUsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmlvcml0eSA9PT0gdGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLmFjdGlvbiA9PT0gJ2Fib3J0JyB8fFxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5hY3Rpb24gPT09ICdyZXNwb25kJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5hY3Rpb24gPVxuICAgICAgICAgICAgICAgIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uQ29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdWxmaWxscyBhIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIEFuIGV4YW1wbGUgb2YgZnVsZmlsbGluZyBhbGwgcmVxdWVzdHMgd2l0aCA0MDQgcmVzcG9uc2VzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb24odHJ1ZSk7XG4gICAgICogcGFnZS5vbigncmVxdWVzdCcsIHJlcXVlc3QgPT4ge1xuICAgICAqICAgcmVxdWVzdC5yZXNwb25kKHtcbiAgICAgKiAgICAgc3RhdHVzOiA0MDQsXG4gICAgICogICAgIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbicsXG4gICAgICogICAgIGJvZHk6ICdOb3QgRm91bmQhJyxcbiAgICAgKiAgIH0pO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogTk9URTogTW9ja2luZyByZXNwb25zZXMgZm9yIGRhdGFVUkwgcmVxdWVzdHMgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKiBDYWxsaW5nIGByZXF1ZXN0LnJlc3BvbmRgIGZvciBhIGRhdGFVUkwgcmVxdWVzdCBpcyBhIG5vb3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2UgLSB0aGUgcmVzcG9uc2UgdG8gZnVsZmlsbCB0aGUgcmVxdWVzdCB3aXRoLlxuICAgICAqIEBwYXJhbSBwcmlvcml0eSAtIElmIHByb3ZpZGVkLCBpbnRlcmNlcHQgaXMgcmVzb2x2ZWQgdXNpbmdcbiAgICAgKiBjb29wZXJhdGl2ZSBoYW5kbGluZyBydWxlcy4gT3RoZXJ3aXNlLCBpbnRlcmNlcHQgaXMgcmVzb2x2ZWRcbiAgICAgKiBpbW1lZGlhdGVseS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiBUbyB1c2UgdGhpcywgcmVxdWVzdFxuICAgICAqIGludGVyY2VwdGlvbiBzaG91bGQgYmUgZW5hYmxlZCB3aXRoIHtAbGluayBQYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb259LlxuICAgICAqXG4gICAgICogRXhjZXB0aW9uIGlzIGltbWVkaWF0ZWx5IHRocm93biBpZiB0aGUgcmVxdWVzdCBpbnRlcmNlcHRpb24gaXMgbm90IGVuYWJsZWQuXG4gICAgICovXG4gICAgYXN5bmMgcmVzcG9uZChyZXNwb25zZSwgcHJpb3JpdHkpIHtcbiAgICAgICAgLy8gTW9ja2luZyByZXNwb25zZXMgZm9yIGRhdGFVUkwgcmVxdWVzdHMgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gICAgICAgIGlmICh0aGlzLnVybCgpLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQsICdSZXF1ZXN0IGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZXNwb25kKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIHByaW9yaXR5ID4gdGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5KSB7XG4gICAgICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uLlJlc3BvbmQsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmlvcml0eSA9PT0gdGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLmFjdGlvbiA9PT0gJ2Fib3J0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5hY3Rpb24gPVxuICAgICAgICAgICAgICAgIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uUmVzcG9uZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgYSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVycm9yQ29kZSAtIG9wdGlvbmFsIGVycm9yIGNvZGUgdG8gcHJvdmlkZS5cbiAgICAgKiBAcGFyYW0gcHJpb3JpdHkgLSBJZiBwcm92aWRlZCwgaW50ZXJjZXB0IGlzIHJlc29sdmVkIHVzaW5nXG4gICAgICogY29vcGVyYXRpdmUgaGFuZGxpbmcgcnVsZXMuIE90aGVyd2lzZSwgaW50ZXJjZXB0IGlzIHJlc29sdmVkXG4gICAgICogaW1tZWRpYXRlbHkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqXG4gICAgICogVG8gdXNlIHRoaXMsIHJlcXVlc3QgaW50ZXJjZXB0aW9uIHNob3VsZCBiZSBlbmFibGVkIHdpdGhcbiAgICAgKiB7QGxpbmsgUGFnZS5zZXRSZXF1ZXN0SW50ZXJjZXB0aW9ufS4gSWYgaXQgaXMgbm90IGVuYWJsZWQsIHRoaXMgbWV0aG9kIHdpbGxcbiAgICAgKiB0aHJvdyBhbiBleGNlcHRpb24gaW1tZWRpYXRlbHkuXG4gICAgICovXG4gICAgYXN5bmMgYWJvcnQoZXJyb3JDb2RlID0gJ2ZhaWxlZCcsIHByaW9yaXR5KSB7XG4gICAgICAgIC8vIFJlcXVlc3QgaW50ZXJjZXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRhdGE6IHVybHMuXG4gICAgICAgIGlmICh0aGlzLnVybCgpLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvclJlYXNvbiA9IGVycm9yUmVhc29uc1tlcnJvckNvZGVdO1xuICAgICAgICBhc3NlcnQoZXJyb3JSZWFzb24sICdVbmtub3duIGVycm9yIGNvZGU6ICcgKyBlcnJvckNvZGUpO1xuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQsICdSZXF1ZXN0IGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9hYm9ydChlcnJvclJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uYWJvcnRSZWFzb24gPSBlcnJvclJlYXNvbjtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5wcmlvcml0eSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBwcmlvcml0eSA+PSB0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uQWJvcnQsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRSZXNwb25zZShib2R5KSB7XG4gICAgICAgIC8vIE5lZWRlZCB0byBnZXQgdGhlIGNvcnJlY3QgYnl0ZUxlbmd0aFxuICAgICAgICBjb25zdCBieXRlQm9keSA9IGlzU3RyaW5nKGJvZHkpXG4gICAgICAgICAgICA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShib2R5KVxuICAgICAgICAgICAgOiBib2R5O1xuICAgICAgICBjb25zdCBieXRlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGJ5dGUgb2YgYnl0ZUJvZHkpIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IGJ5dGVCb2R5LmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICBiYXNlNjQ6IGJ0b2EoYnl0ZXMuam9pbignJykpLFxuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb247XG4oZnVuY3Rpb24gKEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24pIHtcbiAgICBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uW1wiQWJvcnRcIl0gPSBcImFib3J0XCI7XG4gICAgSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbltcIlJlc3BvbmRcIl0gPSBcInJlc3BvbmRcIjtcbiAgICBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uW1wiQ29udGludWVcIl0gPSBcImNvbnRpbnVlXCI7XG4gICAgSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbltcIkRpc2FibGVkXCJdID0gXCJkaXNhYmxlZFwiO1xuICAgIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb25bXCJOb25lXCJdID0gXCJub25lXCI7XG4gICAgSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbltcIkFscmVhZHlIYW5kbGVkXCJdID0gXCJhbHJlYWR5LWhhbmRsZWRcIjtcbn0pKEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24gfHwgKEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24gPSB7fSkpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhlYWRlcnNBcnJheShoZWFkZXJzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCBuYW1lIGluIGhlYWRlcnMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXJzW25hbWVdO1xuICAgICAgICBpZiAoIU9iamVjdC5pcyh2YWx1ZSwgdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi52YWx1ZXMubWFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lLCB2YWx1ZTogdmFsdWUgKyAnJyB9O1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEByZW1hcmtzXG4gKiBMaXN0IHRha2VuIGZyb20ge0BsaW5rIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2h0dHAtc3RhdHVzLWNvZGVzL2h0dHAtc3RhdHVzLWNvZGVzLnhodG1sfVxuICogd2l0aCBleHRyYSAzMDYgYW5kIDQxOCBjb2Rlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUQVRVU19URVhUUyA9IHtcbiAgICAnMTAwJzogJ0NvbnRpbnVlJyxcbiAgICAnMTAxJzogJ1N3aXRjaGluZyBQcm90b2NvbHMnLFxuICAgICcxMDInOiAnUHJvY2Vzc2luZycsXG4gICAgJzEwMyc6ICdFYXJseSBIaW50cycsXG4gICAgJzIwMCc6ICdPSycsXG4gICAgJzIwMSc6ICdDcmVhdGVkJyxcbiAgICAnMjAyJzogJ0FjY2VwdGVkJyxcbiAgICAnMjAzJzogJ05vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uJyxcbiAgICAnMjA0JzogJ05vIENvbnRlbnQnLFxuICAgICcyMDUnOiAnUmVzZXQgQ29udGVudCcsXG4gICAgJzIwNic6ICdQYXJ0aWFsIENvbnRlbnQnLFxuICAgICcyMDcnOiAnTXVsdGktU3RhdHVzJyxcbiAgICAnMjA4JzogJ0FscmVhZHkgUmVwb3J0ZWQnLFxuICAgICcyMjYnOiAnSU0gVXNlZCcsXG4gICAgJzMwMCc6ICdNdWx0aXBsZSBDaG9pY2VzJyxcbiAgICAnMzAxJzogJ01vdmVkIFBlcm1hbmVudGx5JyxcbiAgICAnMzAyJzogJ0ZvdW5kJyxcbiAgICAnMzAzJzogJ1NlZSBPdGhlcicsXG4gICAgJzMwNCc6ICdOb3QgTW9kaWZpZWQnLFxuICAgICczMDUnOiAnVXNlIFByb3h5JyxcbiAgICAnMzA2JzogJ1N3aXRjaCBQcm94eScsXG4gICAgJzMwNyc6ICdUZW1wb3JhcnkgUmVkaXJlY3QnLFxuICAgICczMDgnOiAnUGVybWFuZW50IFJlZGlyZWN0JyxcbiAgICAnNDAwJzogJ0JhZCBSZXF1ZXN0JyxcbiAgICAnNDAxJzogJ1VuYXV0aG9yaXplZCcsXG4gICAgJzQwMic6ICdQYXltZW50IFJlcXVpcmVkJyxcbiAgICAnNDAzJzogJ0ZvcmJpZGRlbicsXG4gICAgJzQwNCc6ICdOb3QgRm91bmQnLFxuICAgICc0MDUnOiAnTWV0aG9kIE5vdCBBbGxvd2VkJyxcbiAgICAnNDA2JzogJ05vdCBBY2NlcHRhYmxlJyxcbiAgICAnNDA3JzogJ1Byb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyxcbiAgICAnNDA4JzogJ1JlcXVlc3QgVGltZW91dCcsXG4gICAgJzQwOSc6ICdDb25mbGljdCcsXG4gICAgJzQxMCc6ICdHb25lJyxcbiAgICAnNDExJzogJ0xlbmd0aCBSZXF1aXJlZCcsXG4gICAgJzQxMic6ICdQcmVjb25kaXRpb24gRmFpbGVkJyxcbiAgICAnNDEzJzogJ1BheWxvYWQgVG9vIExhcmdlJyxcbiAgICAnNDE0JzogJ1VSSSBUb28gTG9uZycsXG4gICAgJzQxNSc6ICdVbnN1cHBvcnRlZCBNZWRpYSBUeXBlJyxcbiAgICAnNDE2JzogJ1JhbmdlIE5vdCBTYXRpc2ZpYWJsZScsXG4gICAgJzQxNyc6ICdFeHBlY3RhdGlvbiBGYWlsZWQnLFxuICAgICc0MTgnOiBcIkknbSBhIHRlYXBvdFwiLFxuICAgICc0MjEnOiAnTWlzZGlyZWN0ZWQgUmVxdWVzdCcsXG4gICAgJzQyMic6ICdVbnByb2Nlc3NhYmxlIEVudGl0eScsXG4gICAgJzQyMyc6ICdMb2NrZWQnLFxuICAgICc0MjQnOiAnRmFpbGVkIERlcGVuZGVuY3knLFxuICAgICc0MjUnOiAnVG9vIEVhcmx5JyxcbiAgICAnNDI2JzogJ1VwZ3JhZGUgUmVxdWlyZWQnLFxuICAgICc0MjgnOiAnUHJlY29uZGl0aW9uIFJlcXVpcmVkJyxcbiAgICAnNDI5JzogJ1RvbyBNYW55IFJlcXVlc3RzJyxcbiAgICAnNDMxJzogJ1JlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2UnLFxuICAgICc0NTEnOiAnVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnMnLFxuICAgICc1MDAnOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbiAgICAnNTAxJzogJ05vdCBJbXBsZW1lbnRlZCcsXG4gICAgJzUwMic6ICdCYWQgR2F0ZXdheScsXG4gICAgJzUwMyc6ICdTZXJ2aWNlIFVuYXZhaWxhYmxlJyxcbiAgICAnNTA0JzogJ0dhdGV3YXkgVGltZW91dCcsXG4gICAgJzUwNSc6ICdIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCcsXG4gICAgJzUwNic6ICdWYXJpYW50IEFsc28gTmVnb3RpYXRlcycsXG4gICAgJzUwNyc6ICdJbnN1ZmZpY2llbnQgU3RvcmFnZScsXG4gICAgJzUwOCc6ICdMb29wIERldGVjdGVkJyxcbiAgICAnNTEwJzogJ05vdCBFeHRlbmRlZCcsXG4gICAgJzUxMSc6ICdOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyxcbn07XG5jb25zdCBlcnJvclJlYXNvbnMgPSB7XG4gICAgYWJvcnRlZDogJ0Fib3J0ZWQnLFxuICAgIGFjY2Vzc2RlbmllZDogJ0FjY2Vzc0RlbmllZCcsXG4gICAgYWRkcmVzc3VucmVhY2hhYmxlOiAnQWRkcmVzc1VucmVhY2hhYmxlJyxcbiAgICBibG9ja2VkYnljbGllbnQ6ICdCbG9ja2VkQnlDbGllbnQnLFxuICAgIGJsb2NrZWRieXJlc3BvbnNlOiAnQmxvY2tlZEJ5UmVzcG9uc2UnLFxuICAgIGNvbm5lY3Rpb25hYm9ydGVkOiAnQ29ubmVjdGlvbkFib3J0ZWQnLFxuICAgIGNvbm5lY3Rpb25jbG9zZWQ6ICdDb25uZWN0aW9uQ2xvc2VkJyxcbiAgICBjb25uZWN0aW9uZmFpbGVkOiAnQ29ubmVjdGlvbkZhaWxlZCcsXG4gICAgY29ubmVjdGlvbnJlZnVzZWQ6ICdDb25uZWN0aW9uUmVmdXNlZCcsXG4gICAgY29ubmVjdGlvbnJlc2V0OiAnQ29ubmVjdGlvblJlc2V0JyxcbiAgICBpbnRlcm5ldGRpc2Nvbm5lY3RlZDogJ0ludGVybmV0RGlzY29ubmVjdGVkJyxcbiAgICBuYW1lbm90cmVzb2x2ZWQ6ICdOYW1lTm90UmVzb2x2ZWQnLFxuICAgIHRpbWVkb3V0OiAnVGltZWRPdXQnLFxuICAgIGZhaWxlZDogJ0ZhaWxlZCcsXG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgLy8gRmlyZWZveCB0aHJvd3MgYW4gaW52YWxpZCBhcmd1bWVudCBlcnJvciB3aXRoIGEgbWVzc2FnZSBzdGFydGluZyB3aXRoXG4gICAgLy8gJ0V4cGVjdGVkIFwiaGVhZGVyXCIgWy4uLl0nLlxuICAgIGlmIChlcnJvci5vcmlnaW5hbE1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgaGVhZGVyJykgfHxcbiAgICAgICAgZXJyb3Iub3JpZ2luYWxNZXNzYWdlLmluY2x1ZGVzKCdFeHBlY3RlZCBcImhlYWRlclwiJykgfHxcbiAgICAgICAgLy8gV2ViRHJpdmVyIEJpRGkgZXJyb3IgZm9yIGludmFsaWQgdmFsdWVzLCBmb3IgZXhhbXBsZSwgaGVhZGVycy5cbiAgICAgICAgZXJyb3Iub3JpZ2luYWxNZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkIGFyZ3VtZW50JykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIC8vIEluIGNlcnRhaW4gY2FzZXMsIHByb3RvY29sIHdpbGwgcmV0dXJuIGVycm9yIGlmIHRoZSByZXF1ZXN0IHdhc1xuICAgIC8vIGFscmVhZHkgY2FuY2VsZWQgb3IgdGhlIHBhZ2Ugd2FzIGNsb3NlZC4gV2Ugc2hvdWxkIHRvbGVyYXRlIHRoZXNlXG4gICAgLy8gZXJyb3JzLlxuICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SFRUUFJlcXVlc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogVGhlIEhUVFBSZXNwb25zZSBjbGFzcyByZXByZXNlbnRzIHJlc3BvbnNlcyB3aGljaCBhcmUgcmVjZWl2ZWQgYnkgdGhlXG4gKiB7QGxpbmsgUGFnZX0gY2xhc3MuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgSFRUUFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhlIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsIChzdGF0dXMgaW4gdGhlIHJhbmdlIDIwMC0yOTkpLlxuICAgICAqL1xuICAgIG9rKCkge1xuICAgICAgICAvLyBUT0RPOiBkb2N1bWVudCA9PT0gMCBjYXNlP1xuICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLnN0YXR1cygpO1xuICAgICAgICByZXR1cm4gc3RhdHVzID09PSAwIHx8IChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8PSAyOTkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGEgdGV4dCAodXRmOCkgcmVwcmVzZW50YXRpb24gb2YgcmVzcG9uc2UgYm9keS5cbiAgICAgKi9cbiAgICBhc3luYyB0ZXh0KCkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5idWZmZXIoKTtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgcmVzcG9uc2UgYm9keS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHRocm93IGlmIHRoZSByZXNwb25zZSBib2R5IGlzIG5vdCBwYXJzYWJsZSB2aWFcbiAgICAgKiBgSlNPTi5wYXJzZWAuXG4gICAgICovXG4gICAgYXN5bmMganNvbigpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMudGV4dCgpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1IVFRQUmVzcG9uc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogS2V5Ym9hcmQgcHJvdmlkZXMgYW4gYXBpIGZvciBtYW5hZ2luZyBhIHZpcnR1YWwga2V5Ym9hcmQuXG4gKiBUaGUgaGlnaCBsZXZlbCBhcGkgaXMge0BsaW5rIEtleWJvYXJkLlwidHlwZVwifSxcbiAqIHdoaWNoIHRha2VzIHJhdyBjaGFyYWN0ZXJzIGFuZCBnZW5lcmF0ZXMgcHJvcGVyIGtleWRvd24sIGtleXByZXNzL2lucHV0LFxuICogYW5kIGtleXVwIGV2ZW50cyBvbiB5b3VyIHBhZ2UuXG4gKlxuICogQHJlbWFya3NcbiAqIEZvciBmaW5lciBjb250cm9sLCB5b3UgY2FuIHVzZSB7QGxpbmsgS2V5Ym9hcmQuZG93bn0sXG4gKiB7QGxpbmsgS2V5Ym9hcmQudXB9LCBhbmQge0BsaW5rIEtleWJvYXJkLnNlbmRDaGFyYWN0ZXJ9XG4gKiB0byBtYW51YWxseSBmaXJlIGV2ZW50cyBhcyBpZiB0aGV5IHdlcmUgZ2VuZXJhdGVkIGZyb20gYSByZWFsIGtleWJvYXJkLlxuICpcbiAqIE9uIG1hY09TLCBrZXlib2FyZCBzaG9ydGN1dHMgbGlrZSBg4oyYIEFgIC1cXD4gU2VsZWN0IEFsbCBkbyBub3Qgd29yay5cbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3B1cHBldGVlci9wdXBwZXRlZXIvaXNzdWVzLzEzMTMgfCAjMTMxM30uXG4gKlxuICogQGV4YW1wbGVcbiAqIEFuIGV4YW1wbGUgb2YgaG9sZGluZyBkb3duIGBTaGlmdGAgaW4gb3JkZXIgdG8gc2VsZWN0IGFuZCBkZWxldGUgc29tZSB0ZXh0OlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBwYWdlLmtleWJvYXJkLnR5cGUoJ0hlbGxvIFdvcmxkIScpO1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygnQXJyb3dMZWZ0Jyk7XG4gKlxuICogYXdhaXQgcGFnZS5rZXlib2FyZC5kb3duKCdTaGlmdCcpO1xuICogZm9yIChsZXQgaSA9IDA7IGkgPCAnIFdvcmxkJy5sZW5ndGg7IGkrKylcbiAqICAgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygnQXJyb3dMZWZ0Jyk7XG4gKiBhd2FpdCBwYWdlLmtleWJvYXJkLnVwKCdTaGlmdCcpO1xuICpcbiAqIGF3YWl0IHBhZ2Uua2V5Ym9hcmQucHJlc3MoJ0JhY2tzcGFjZScpO1xuICogLy8gUmVzdWx0IHRleHQgd2lsbCBlbmQgdXAgc2F5aW5nICdIZWxsbyEnXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQW4gZXhhbXBsZSBvZiBwcmVzc2luZyBgQWBcbiAqXG4gKiBgYGB0c1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC5kb3duKCdTaGlmdCcpO1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygnS2V5QScpO1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC51cCgnU2hpZnQnKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEtleWJvYXJkIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxufVxuLyoqXG4gKiBFbnVtIG9mIHZhbGlkIG1vdXNlIGJ1dHRvbnMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgTW91c2VCdXR0b24gPSBPYmplY3QuZnJlZXplKHtcbiAgICBMZWZ0OiAnbGVmdCcsXG4gICAgUmlnaHQ6ICdyaWdodCcsXG4gICAgTWlkZGxlOiAnbWlkZGxlJyxcbiAgICBCYWNrOiAnYmFjaycsXG4gICAgRm9yd2FyZDogJ2ZvcndhcmQnLFxufSk7XG4vKipcbiAqIFRoZSBNb3VzZSBjbGFzcyBvcGVyYXRlcyBpbiBtYWluLWZyYW1lIENTUyBwaXhlbHNcbiAqIHJlbGF0aXZlIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHZpZXdwb3J0LlxuICpcbiAqIEByZW1hcmtzXG4gKiBFdmVyeSBgcGFnZWAgb2JqZWN0IGhhcyBpdHMgb3duIE1vdXNlLCBhY2Nlc3NpYmxlIHdpdGgge0BsaW5rIFBhZ2UubW91c2V9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIFVzaW5nIOKAmHBhZ2UubW91c2XigJkgdG8gdHJhY2UgYSAxMDB4MTAwIHNxdWFyZS5cbiAqIGF3YWl0IHBhZ2UubW91c2UubW92ZSgwLCAwKTtcbiAqIGF3YWl0IHBhZ2UubW91c2UuZG93bigpO1xuICogYXdhaXQgcGFnZS5tb3VzZS5tb3ZlKDAsIDEwMCk7XG4gKiBhd2FpdCBwYWdlLm1vdXNlLm1vdmUoMTAwLCAxMDApO1xuICogYXdhaXQgcGFnZS5tb3VzZS5tb3ZlKDEwMCwgMCk7XG4gKiBhd2FpdCBwYWdlLm1vdXNlLm1vdmUoMCwgMCk7XG4gKiBhd2FpdCBwYWdlLm1vdXNlLnVwKCk7XG4gKiBgYGBcbiAqXG4gKiAqKk5vdGUqKjogVGhlIG1vdXNlIGV2ZW50cyB0cmlnZ2VyIHN5bnRoZXRpYyBgTW91c2VFdmVudGBzLlxuICogVGhpcyBtZWFucyB0aGF0IGl0IGRvZXMgbm90IGZ1bGx5IHJlcGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB3aGF0IGEgbm9ybWFsIHVzZXJcbiAqIHdvdWxkIGJlIGFibGUgdG8gZG8gd2l0aCB0aGVpciBtb3VzZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgZHJhZ2dpbmcgYW5kIHNlbGVjdGluZyB0ZXh0IGlzIG5vdCBwb3NzaWJsZSB1c2luZyBgcGFnZS5tb3VzZWAuXG4gKiBJbnN0ZWFkLCB5b3UgY2FuIHVzZSB0aGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudE9yU2hhZG93Um9vdC9nZXRTZWxlY3Rpb24gfCBgRG9jdW1lbnRPclNoYWRvd1Jvb3QuZ2V0U2VsZWN0aW9uKClgfSBmdW5jdGlvbmFsaXR5IGltcGxlbWVudGVkIGluIHRoZSBwbGF0Zm9ybS5cbiAqXG4gKiBAZXhhbXBsZVxuICogRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHNlbGVjdCBhbGwgY29udGVudCBiZXR3ZWVuIG5vZGVzOlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBwYWdlLmV2YWx1YXRlKFxuICogICAoZnJvbSwgdG8pID0+IHtcbiAqICAgICBjb25zdCBzZWxlY3Rpb24gPSBmcm9tLmdldFJvb3ROb2RlKCkuZ2V0U2VsZWN0aW9uKCk7XG4gKiAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICogICAgIHJhbmdlLnNldFN0YXJ0QmVmb3JlKGZyb20pO1xuICogICAgIHJhbmdlLnNldEVuZEFmdGVyKHRvKTtcbiAqICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gKiAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAqICAgfSxcbiAqICAgZnJvbUpTSGFuZGxlLFxuICogICB0b0pTSGFuZGxlXG4gKiApO1xuICogYGBgXG4gKlxuICogSWYgeW91IHRoZW4gd291bGQgd2FudCB0byBjb3B5LXBhc3RlIHlvdXIgc2VsZWN0aW9uLCB5b3UgY2FuIHVzZSB0aGUgY2xpcGJvYXJkIGFwaTpcbiAqXG4gKiBgYGB0c1xuICogLy8gVGhlIGNsaXBib2FyZCBhcGkgZG9lcyBub3QgYWxsb3cgeW91IHRvIGNvcHksIHVubGVzcyB0aGUgdGFiIGlzIGZvY3VzZWQuXG4gKiBhd2FpdCBwYWdlLmJyaW5nVG9Gcm9udCgpO1xuICogYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7XG4gKiAgIC8vIENvcHkgdGhlIHNlbGVjdGVkIGNvbnRlbnQgdG8gdGhlIGNsaXBib2FyZFxuICogICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICogICAvLyBPYnRhaW4gdGhlIGNvbnRlbnQgb2YgdGhlIGNsaXBib2FyZCBhcyBhIHN0cmluZ1xuICogICByZXR1cm4gbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpO1xuICogfSk7XG4gKiBgYGBcbiAqXG4gKiAqKk5vdGUqKjogSWYgeW91IHdhbnQgYWNjZXNzIHRvIHRoZSBjbGlwYm9hcmQgQVBJLFxuICogeW91IGhhdmUgdG8gZ2l2ZSBpdCBwZXJtaXNzaW9uIHRvIGRvIHNvOlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBicm93c2VyXG4gKiAgIC5kZWZhdWx0QnJvd3NlckNvbnRleHQoKVxuICogICAub3ZlcnJpZGVQZXJtaXNzaW9ucygnPHlvdXIgb3JpZ2luPicsIFtcbiAqICAgICAnY2xpcGJvYXJkLXJlYWQnLFxuICogICAgICdjbGlwYm9hcmQtd3JpdGUnLFxuICogICBdKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIE1vdXNlIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxufVxuLyoqXG4gKiBUaGUgVG91Y2hzY3JlZW4gY2xhc3MgZXhwb3NlcyB0b3VjaHNjcmVlbiBldmVudHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUb3VjaHNjcmVlbiB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVzIGEgYHRvdWNoc3RhcnRgIGFuZCBgdG91Y2hlbmRgIGV2ZW50LlxuICAgICAqIEBwYXJhbSB4IC0gSG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgdGFwLlxuICAgICAqIEBwYXJhbSB5IC0gVmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHRhcC5cbiAgICAgKi9cbiAgICBhc3luYyB0YXAoeCwgeSkge1xuICAgICAgICBhd2FpdCB0aGlzLnRvdWNoU3RhcnQoeCwgeSk7XG4gICAgICAgIGF3YWl0IHRoaXMudG91Y2hFbmQoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbnB1dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fcnVuSW5pdGlhbGl6ZXJzID0gKHRoaXMgJiYgdGhpcy5fX3J1bkluaXRpYWxpemVycykgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcbnZhciBfX2VzRGVjb3JhdGUgPSAodGhpcyAmJiB0aGlzLl9fZXNEZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gICAgZG9uZSA9IHRydWU7XG59O1xudmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbmltcG9ydCB7IGRlYnVnRXJyb3IsIHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlYWJsZSwgdGhyb3dJZkRpc3Bvc2VkIH0gZnJvbSAnLi4vdXRpbC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VTeW1ib2wsIGFzeW5jRGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYSBKYXZhU2NyaXB0IG9iamVjdC4gSW5zdGFuY2VzIGNhbiBiZSBjcmVhdGVkIHVzaW5nXG4gKiB7QGxpbmsgUGFnZS5ldmFsdWF0ZUhhbmRsZX0uXG4gKlxuICogSGFuZGxlcyBwcmV2ZW50IHRoZSByZWZlcmVuY2VkIEphdmFTY3JpcHQgb2JqZWN0IGZyb20gYmVpbmcgZ2FyYmFnZS1jb2xsZWN0ZWRcbiAqIHVubGVzcyB0aGUgaGFuZGxlIGlzIHB1cnBvc2VseSB7QGxpbmsgSlNIYW5kbGUuZGlzcG9zZSB8IGRpc3Bvc2VkfS4gSlNIYW5kbGVzXG4gKiBhcmUgYXV0by1kaXNwb3NlZCB3aGVuIHRoZWlyIGFzc29jaWF0ZWQgZnJhbWUgaXMgbmF2aWdhdGVkIGF3YXkgb3IgdGhlIHBhcmVudFxuICogY29udGV4dCBnZXRzIGRlc3Ryb3llZC5cbiAqXG4gKiBIYW5kbGVzIGNhbiBiZSB1c2VkIGFzIGFyZ3VtZW50cyBmb3IgYW55IGV2YWx1YXRpb24gZnVuY3Rpb24gc3VjaCBhc1xuICoge0BsaW5rIFBhZ2UuJGV2YWx9LCB7QGxpbmsgUGFnZS5ldmFsdWF0ZX0sIGFuZCB7QGxpbmsgUGFnZS5ldmFsdWF0ZUhhbmRsZX0uXG4gKiBUaGV5IGFyZSByZXNvbHZlZCB0byB0aGVpciByZWZlcmVuY2VkIG9iamVjdC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCB3aW5kb3dIYW5kbGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlSGFuZGxlKCgpID0+IHdpbmRvdyk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmxldCBKU0hhbmRsZSA9ICgoKSA9PiB7XG4gICAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbbW92ZWFibGVdO1xuICAgIGxldCBfY2xhc3NEZXNjcmlwdG9yO1xuICAgIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfY2xhc3NUaGlzO1xuICAgIGxldCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfZ2V0UHJvcGVydHlfZGVjb3JhdG9ycztcbiAgICBsZXQgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycztcbiAgICB2YXIgSlNIYW5kbGUgPSBjbGFzcyB7XG4gICAgICAgIHN0YXRpYyB7IF9jbGFzc1RoaXMgPSB0aGlzOyB9XG4gICAgICAgIHN0YXRpYyB7XG4gICAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZ2V0UHJvcGVydHlfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImdldFByb3BlcnR5XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJnZXRQcm9wZXJ0eVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmdldFByb3BlcnR5IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9nZXRQcm9wZXJ0aWVzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJnZXRQcm9wZXJ0aWVzXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJnZXRQcm9wZXJ0aWVzXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZ2V0UHJvcGVydGllcyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6IFwiY2xhc3NcIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIEpTSGFuZGxlID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7XG4gICAgICAgICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7XG4gICAgICAgICAgICBfX3J1bkluaXRpYWxpemVycyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBfX3J1bkluaXRpYWxpemVycyh0aGlzLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCBoYW5kbGUgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlYWxtLmV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgdGhpcywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCBoYW5kbGUgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZXZhbHVhdGVIYW5kbGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlYWxtLmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgdGhpcywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ldmFsdWF0ZUhhbmRsZSgob2JqZWN0LCBwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0W3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICB9LCBwcm9wZXJ0eU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgbWFwIG9mIGhhbmRsZXMgcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IGhhbmRsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgbGlzdEhhbmRsZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGVIYW5kbGUoKCkgPT4gZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICAgICAqIGNvbnN0IHByb3BlcnRpZXMgPSBhd2FpdCBsaXN0SGFuZGxlLmdldFByb3BlcnRpZXMoKTtcbiAgICAgICAgICogY29uc3QgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICogZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzLnZhbHVlcygpKSB7XG4gICAgICAgICAqICAgY29uc3QgZWxlbWVudCA9IHByb3BlcnR5LmFzRWxlbWVudCgpO1xuICAgICAgICAgKiAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAqICAgICBjaGlsZHJlbi5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgKiAgIH1cbiAgICAgICAgICogfVxuICAgICAgICAgKiBjaGlsZHJlbjsgLy8gaG9sZHMgZWxlbWVudEhhbmRsZXMgdG8gYWxsIGNoaWxkcmVuIG9mIGRvY3VtZW50LmJvZHlcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lcyA9IGF3YWl0IHRoaXMuZXZhbHVhdGUob2JqZWN0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnVtZXJhYmxlUHJvcGVydGllcyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiBkZXNjcmlwdG9ycykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcnNbcHJvcGVydHlOYW1lXT8uZW51bWVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnVtZXJhYmxlUHJvcGVydGllcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb3BlcnR5TmFtZXMubWFwKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoa2V5KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnR5TmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIHJlc3VsdHNba2V5XSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KHZhbHVlLCBoYW5kbGUubW92ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudl8xLmVycm9yID0gZV8xO1xuICAgICAgICAgICAgICAgICAgICBlbnZfMS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBbKF9nZXRQcm9wZXJ0eV9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpXSwgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKV0sIGRpc3Bvc2VTeW1ib2wpXSgpIHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZGlzcG9zZSgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgW2FzeW5jRGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBKU0hhbmRsZSA9IF9jbGFzc1RoaXM7XG59KSgpO1xuZXhwb3J0IHsgSlNIYW5kbGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUpTSGFuZGxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG52YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xuaW1wb3J0IHsgY29uY2F0LCBFTVBUWSwgZmlsdGVyLCBmaXJzdCwgZmlyc3RWYWx1ZUZyb20sIGZyb20sIG1hcCwgbWVyZ2UsIG1lcmdlTWFwLCBtZXJnZVNjYW4sIG9mLCByYWNlV2l0aCwgUmVwbGF5U3ViamVjdCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2UsIHRha2VVbnRpbCwgdGltZXIsIH0gZnJvbSAnLi4vLi4vdGhpcmRfcGFydHkvcnhqcy9yeGpzLmpzJztcbmltcG9ydCB7IFRhcmdldENsb3NlRXJyb3IgfSBmcm9tICcuLi9jb21tb24vRXJyb3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IFRpbWVvdXRTZXR0aW5ncyB9IGZyb20gJy4uL2NvbW1vbi9UaW1lb3V0U2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgZnJvbUVtaXR0ZXJFdmVudCwgZmlsdGVyQXN5bmMsIGltcG9ydEZTUHJvbWlzZXMsIGlzU3RyaW5nLCBORVRXT1JLX0lETEVfVElNRSwgdGltZW91dCwgd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSwgZnJvbUFib3J0U2lnbmFsLCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuLi91dGlsL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQXN5bmNEaXNwb3NhYmxlU3RhY2ssIGFzeW5jRGlzcG9zZVN5bWJvbCwgRGlzcG9zYWJsZVN0YWNrLCBkaXNwb3NlU3ltYm9sLCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbkxvY2F0b3IsIExvY2F0b3IsIE5vZGVMb2NhdG9yLCB9IGZyb20gJy4vbG9jYXRvcnMvbG9jYXRvcnMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRTY3JlZW5zaG90T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5vcHRpbWl6ZUZvclNwZWVkID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLnR5cGUgPz89ICdwbmcnO1xuICAgIG9wdGlvbnMuZnJvbVN1cmZhY2UgPz89IHRydWU7XG4gICAgb3B0aW9ucy5mdWxsUGFnZSA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5vbWl0QmFja2dyb3VuZCA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5lbmNvZGluZyA/Pz0gJ2JpbmFyeSc7XG4gICAgb3B0aW9ucy5jYXB0dXJlQmV5b25kVmlld3BvcnQgPz89IHRydWU7XG59XG4vKipcbiAqIFBhZ2UgcHJvdmlkZXMgbWV0aG9kcyB0byBpbnRlcmFjdCB3aXRoIGEgc2luZ2xlIHRhYiBvclxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZXh0ZW5zaW9ucy9iYWNrZ3JvdW5kX3BhZ2VzIHwgZXh0ZW5zaW9uIGJhY2tncm91bmQgcGFnZX1cbiAqIGluIHRoZSBicm93c2VyLlxuICpcbiAqIDo6Om5vdGVcbiAqXG4gKiBPbmUgQnJvd3NlciBpbnN0YW5jZSBtaWdodCBoYXZlIG11bHRpcGxlIFBhZ2UgaW5zdGFuY2VzLlxuICpcbiAqIDo6OlxuICpcbiAqIEBleGFtcGxlXG4gKiBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIHBhZ2UsIG5hdmlnYXRlcyBpdCB0byBhIFVSTCwgYW5kIHRoZW4gc2F2ZXMgYSBzY3JlZW5zaG90OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gKlxuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vZXhhbXBsZS5jb20nKTtcbiAqICAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHtwYXRoOiAnc2NyZWVuc2hvdC5wbmcnfSk7XG4gKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqIH0pKCk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgUGFnZSBjbGFzcyBleHRlbmRzIGZyb20gUHVwcGV0ZWVyJ3Mge0BsaW5rIEV2ZW50RW1pdHRlcn0gY2xhc3MgYW5kIHdpbGxcbiAqIGVtaXQgdmFyaW91cyBldmVudHMgd2hpY2ggYXJlIGRvY3VtZW50ZWQgaW4gdGhlIHtAbGluayBQYWdlRXZlbnR9IGVudW0uXG4gKlxuICogQGV4YW1wbGVcbiAqIFRoaXMgZXhhbXBsZSBsb2dzIGEgbWVzc2FnZSBmb3IgYSBzaW5nbGUgcGFnZSBgbG9hZGAgZXZlbnQ6XG4gKlxuICogYGBgdHNcbiAqIHBhZ2Uub25jZSgnbG9hZCcsICgpID0+IGNvbnNvbGUubG9nKCdQYWdlIGxvYWRlZCEnKSk7XG4gKiBgYGBcbiAqXG4gKiBUbyB1bnN1YnNjcmliZSBmcm9tIGV2ZW50cyB1c2UgdGhlIHtAbGluayBFdmVudEVtaXR0ZXIub2ZmfSBtZXRob2Q6XG4gKlxuICogYGBgdHNcbiAqIGZ1bmN0aW9uIGxvZ1JlcXVlc3QoaW50ZXJjZXB0ZWRSZXF1ZXN0KSB7XG4gKiAgIGNvbnNvbGUubG9nKCdBIHJlcXVlc3Qgd2FzIG1hZGU6JywgaW50ZXJjZXB0ZWRSZXF1ZXN0LnVybCgpKTtcbiAqIH1cbiAqIHBhZ2Uub24oJ3JlcXVlc3QnLCBsb2dSZXF1ZXN0KTtcbiAqIC8vIFNvbWV0aW1lIGxhdGVyLi4uXG4gKiBwYWdlLm9mZigncmVxdWVzdCcsIGxvZ1JlcXVlc3QpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5sZXQgUGFnZSA9ICgoKSA9PiB7XG4gICAgbGV0IF9jbGFzc1N1cGVyID0gRXZlbnRFbWl0dGVyO1xuICAgIGxldCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfc2NyZWVuc2hvdF9kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBQYWdlIGV4dGVuZHMgX2NsYXNzU3VwZXIge1xuICAgICAgICBzdGF0aWMge1xuICAgICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2NyZWVuc2hvdF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2NyZWVuc2hvdFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwic2NyZWVuc2hvdFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNjcmVlbnNob3QgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX2lzRHJhZ2dpbmcgPSAoX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpLCBmYWxzZSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIF90aW1lb3V0U2V0dGluZ3MgPSBuZXcgVGltZW91dFNldHRpbmdzKCk7XG4gICAgICAgICNyZXF1ZXN0SGFuZGxlcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAjaW5mbGlnaHQkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJyZXF1ZXN0XCIgLyogUGFnZUV2ZW50LlJlcXVlc3QgKi8pXG4gICAgICAgICAgICAgICAgLnBpcGUobWVyZ2VNYXAob3JpZ2luYWxSZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uY2F0KG9mKDEpLCBtZXJnZShmcm9tRW1pdHRlckV2ZW50KHRoaXMsIFwicmVxdWVzdGZhaWxlZFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0RmFpbGVkICovKSwgZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInJlcXVlc3RmaW5pc2hlZFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0RmluaXNoZWQgKi8pLCBmcm9tRW1pdHRlckV2ZW50KHRoaXMsIFwicmVzcG9uc2VcIiAvKiBQYWdlRXZlbnQuUmVzcG9uc2UgKi8pLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB9KSkpLnBpcGUoZmlsdGVyKHJlcXVlc3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5pZCA9PT0gb3JpZ2luYWxSZXF1ZXN0LmlkO1xuICAgICAgICAgICAgICAgIH0pLCB0YWtlKDEpLCBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIH0pLCBtZXJnZVNjYW4oKGFjYywgYWRkZW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKGFjYyArIGFkZGVuZCk7XG4gICAgICAgICAgICB9LCAwKSwgdGFrZVVudGlsKGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykpLCBzdGFydFdpdGgoMCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLiNpbmZsaWdodCQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0ZW4gdG8gcGFnZSBldmVudHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGV4aXN0cyB0byBkZWZpbmUgZXZlbnQgdHlwaW5ncyBhbmQgaGFuZGxlIHByb3BlciB3aXJldXAgb2ZcbiAgICAgICAgICogY29vcGVyYXRpdmUgcmVxdWVzdCBpbnRlcmNlcHRpb24uIEFjdHVhbCBldmVudCBsaXN0ZW5pbmcgYW5kIGRpc3BhdGNoaW5nIGlzXG4gICAgICAgICAqIGRlbGVnYXRlZCB0byB7QGxpbmsgRXZlbnRFbWl0dGVyfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBvbih0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgICAgICBpZiAodHlwZSAhPT0gXCJyZXF1ZXN0XCIgLyogUGFnZUV2ZW50LlJlcXVlc3QgKi8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIub24odHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgd3JhcHBlciA9IHRoaXMuI3JlcXVlc3RIYW5kbGVycy5nZXQoaGFuZGxlcik7XG4gICAgICAgICAgICBpZiAod3JhcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5lbnF1ZXVlSW50ZXJjZXB0QWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZXF1ZXN0SGFuZGxlcnMuc2V0KGhhbmRsZXIsIHdyYXBwZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uKHR5cGUsIHdyYXBwZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIG9mZih0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJyZXF1ZXN0XCIgLyogUGFnZUV2ZW50LlJlcXVlc3QgKi8pIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcmVxdWVzdEhhbmRsZXJzLmdldChoYW5kbGVyKSB8fCBoYW5kbGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9mZih0eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICoge0Bpbmhlcml0RG9jIEFjY2Vzc2liaWxpdHl9XG4gICAgICAgICAqL1xuICAgICAgICBnZXQgYWNjZXNzaWJpbGl0eSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLmFjY2Vzc2liaWxpdHk7XG4gICAgICAgIH1cbiAgICAgICAgbG9jYXRvcihzZWxlY3Rvck9yRnVuYykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxlY3Rvck9yRnVuYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZUxvY2F0b3IuY3JlYXRlKHRoaXMsIHNlbGVjdG9yT3JGdW5jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbkxvY2F0b3IuY3JlYXRlKHRoaXMsIHNlbGVjdG9yT3JGdW5jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQSBzaG9ydGN1dCBmb3Ige0BsaW5rIExvY2F0b3IucmFjZX0gdGhhdCBkb2VzIG5vdCByZXF1aXJlIHN0YXRpYyBpbXBvcnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGxvY2F0b3JSYWNlKGxvY2F0b3JzKSB7XG4gICAgICAgICAgICByZXR1cm4gTG9jYXRvci5yYWNlKGxvY2F0b3JzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4gSWYgbm8gZWxlbWVudCBtYXRjaGVzXG4gICAgICAgICAqIHRoZSBzZWxlY3RvciwgdGhlIHJldHVybiB2YWx1ZSByZXNvbHZlcyB0byBgbnVsbGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuJCB8IFBhZ2UubWFpbkZyYW1lKCkuJChzZWxlY3RvcikgfS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLiQoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaW5kcyBlbGVtZW50cyBvbiB0aGUgcGFnZSB0aGF0IG1hdGNoIHRoZSBzZWxlY3Rvci4gSWYgbm8gZWxlbWVudHNcbiAgICAgICAgICogbWF0Y2ggdGhlIHNlbGVjdG9yLCB0aGUgcmV0dXJuIHZhbHVlIHJlc29sdmVzIHRvIGBbXWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuJCQgfCBQYWdlLm1haW5GcmFtZSgpLiQkKHNlbGVjdG9yKSB9LlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgJCQoc2VsZWN0b3IsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLiQkKHNlbGVjdG9yLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHtAbGluayBQYWdlLmV2YWx1YXRlIHwgcGFnZS5ldmFsdWF0ZX0gYW5kXG4gICAgICAgICAqIGBwYWdlLmV2YWx1YXRlSGFuZGxlYCBpcyB0aGF0IGBldmFsdWF0ZUhhbmRsZWAgd2lsbCByZXR1cm4gdGhlIHZhbHVlXG4gICAgICAgICAqIHdyYXBwZWQgaW4gYW4gaW4tcGFnZSBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gYHBhZ2UuZXZhbHVhdGVIYW5kbGVgIHJldHVybnMgYSBQcm9taXNlLCB0aGVcbiAgICAgICAgICogZnVuY3Rpb24gd2lsbCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0byByZXNvbHZlIGFuZCByZXR1cm4gaXRzIHZhbHVlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBZb3UgY2FuIHBhc3MgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIChhbHRob3VnaCBmdW5jdGlvbnMgYXJlXG4gICAgICAgICAqIHJlY29tbWVuZGVkIGFzIHRoZXkgYXJlIGVhc2llciB0byBkZWJ1ZyBhbmQgdXNlIHdpdGggVHlwZVNjcmlwdCk6XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGFIYW5kbGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlSGFuZGxlKCdkb2N1bWVudCcpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICoge0BsaW5rIEpTSGFuZGxlfSBpbnN0YW5jZXMgY2FuIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gdGhlIGBwYWdlRnVuY3Rpb25gOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBhSGFuZGxlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZUhhbmRsZSgoKSA9PiBkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICogY29uc3QgcmVzdWx0SGFuZGxlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZUhhbmRsZShcbiAgICAgICAgICogICBib2R5ID0+IGJvZHkuaW5uZXJIVE1MLFxuICAgICAgICAgKiAgIGFIYW5kbGVcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc29sZS5sb2coYXdhaXQgcmVzdWx0SGFuZGxlLmpzb25WYWx1ZSgpKTtcbiAgICAgICAgICogYXdhaXQgcmVzdWx0SGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIE1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEge0BsaW5rIEpTSGFuZGxlfSxcbiAgICAgICAgICogYnV0IGlmIGBwYWdlRnVuY3Rpb25gIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudCxcbiAgICAgICAgICogeW91IGluc3RlYWQgZ2V0IGFuIHtAbGluayBFbGVtZW50SGFuZGxlfSBiYWNrOlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBidXR0b24gPSBhd2FpdCBwYWdlLmV2YWx1YXRlSGFuZGxlKCgpID0+XG4gICAgICAgICAqICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uJylcbiAgICAgICAgICogKTtcbiAgICAgICAgICogLy8gY2FuIGNhbGwgYGNsaWNrYCBiZWNhdXNlIGBidXR0b25gIGlzIGFuIGBFbGVtZW50SGFuZGxlYFxuICAgICAgICAgKiBhd2FpdCBidXR0b24uY2xpY2soKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBUeXBlU2NyaXB0IGRlZmluaXRpb25zIGFzc3VtZSB0aGF0IGBldmFsdWF0ZUhhbmRsZWAgcmV0dXJuc1xuICAgICAgICAgKiBhIGBKU0hhbmRsZWAsIGJ1dCBpZiB5b3Uga25vdyBpdCdzIGdvaW5nIHRvIHJldHVybiBhblxuICAgICAgICAgKiBgRWxlbWVudEhhbmRsZWAsIHBhc3MgaXQgYXMgdGhlIGdlbmVyaWMgYXJndW1lbnQ6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGJ1dHRvbiA9IGF3YWl0IHBhZ2UuZXZhbHVhdGVIYW5kbGU8RWxlbWVudEhhbmRsZT4oLi4uKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBhIGZ1bmN0aW9uIHRoYXQgaXMgcnVuIHdpdGhpbiB0aGUgcGFnZVxuICAgICAgICAgKiBAcGFyYW0gYXJncyAtIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHBhZ2VGdW5jdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZXZhbHVhdGVIYW5kbGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IHdpdGhpbiB0aGUgcGFnZSB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yXG4gICAgICAgICAqIGFuZCBwYXNzZXMgdGhlIHJlc3VsdCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBJZiBubyBlbGVtZW50IGlzIGZvdW5kIG1hdGNoaW5nIGBzZWxlY3RvcmAsIHRoZSBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgYHBhZ2VGdW5jdGlvbmAgcmV0dXJucyBhIHByb21pc2UgYCRldmFsYCB3aWxsIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvXG4gICAgICAgICAqIHJlc29sdmUgYW5kIHRoZW4gcmV0dXJuIGl0cyB2YWx1ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VhcmNoVmFsdWUgPSBhd2FpdCBwYWdlLiRldmFsKCcjc2VhcmNoJywgZWwgPT4gZWwudmFsdWUpO1xuICAgICAgICAgKiBjb25zdCBwcmVsb2FkSHJlZiA9IGF3YWl0IHBhZ2UuJGV2YWwoJ2xpbmtbcmVsPXByZWxvYWRdJywgZWwgPT4gZWwuaHJlZik7XG4gICAgICAgICAqIGNvbnN0IGh0bWwgPSBhd2FpdCBwYWdlLiRldmFsKCcubWFpbi1jb250YWluZXInLCBlbCA9PiBlbC5vdXRlckhUTUwpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogSWYgeW91IGFyZSB1c2luZyBUeXBlU2NyaXB0LCB5b3UgbWF5IGhhdmUgdG8gcHJvdmlkZSBhbiBleHBsaWNpdCB0eXBlIHRvIHRoZVxuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgdHlwZWQgYXMgYEVsZW1lbnRgLCBidXQgeW91IG1heSBuZWVkIHRvIHByb3ZpZGUgYSBtb3JlXG4gICAgICAgICAqIHNwZWNpZmljIHN1Yi10eXBlOlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiAvLyBpZiB5b3UgZG9uJ3QgcHJvdmlkZSBIVE1MSW5wdXRFbGVtZW50IGhlcmUsIFRTIHdpbGwgZXJyb3JcbiAgICAgICAgICogLy8gYXMgYHZhbHVlYCBpcyBub3Qgb24gYEVsZW1lbnRgXG4gICAgICAgICAqIGNvbnN0IHNlYXJjaFZhbHVlID0gYXdhaXQgcGFnZS4kZXZhbChcbiAgICAgICAgICogICAnI3NlYXJjaCcsXG4gICAgICAgICAqICAgKGVsOiBIVE1MSW5wdXRFbGVtZW50KSA9PiBlbC52YWx1ZVxuICAgICAgICAgKiApO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIGluZmVyIHRoZSByZXR1cm4gdHlwZVxuICAgICAgICAgKiBmcm9tIHRoZSBgcGFnZUZ1bmN0aW9uYCB5b3UgcHJvdmlkZS4gSWYgaXQgaXMgdW5hYmxlIHRvLCB5b3UgY2FuIHVzZSB0aGUgZ2VuZXJpY1xuICAgICAgICAgKiB0eXBlIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHdoYXQgcmV0dXJuIHR5cGUgeW91IGV4cGVjdCBmcm9tIGAkZXZhbGA6XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIC8vIFRoZSBjb21waWxlciBjYW4gaW5mZXIgdGhlIHJldHVybiB0eXBlIGluIHRoaXMgY2FzZSwgYnV0IGlmIGl0IGNhbid0XG4gICAgICAgICAqIC8vIG9yIGlmIHlvdSB3YW50IHRvIGJlIG1vcmUgZXhwbGljaXQsIHByb3ZpZGUgaXQgYXMgdGhlIGdlbmVyaWMgdHlwZS5cbiAgICAgICAgICogY29uc3Qgc2VhcmNoVmFsdWUgPSBhd2FpdCBwYWdlLiRldmFsPHN0cmluZz4oXG4gICAgICAgICAqICAgJyNzZWFyY2gnLFxuICAgICAgICAgKiAgIChlbDogSFRNTElucHV0RWxlbWVudCkgPT4gZWwudmFsdWVcbiAgICAgICAgICogKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSB0aGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBwYWdlIGNvbnRleHQuXG4gICAgICAgICAqIFdpbGwgYmUgcGFzc2VkIHRoZSByZXN1bHQgb2YgdGhlIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yIGFzIGl0c1xuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0aHJvdWdoIHRvIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgYHBhZ2VGdW5jdGlvbmAuIElmIGl0IHJldHVybnMgYW4gZWxlbWVudCBpdFxuICAgICAgICAgKiBpcyB3cmFwcGVkIGluIGFuIHtAbGluayBFbGVtZW50SGFuZGxlfSwgZWxzZSB0aGUgcmF3IHZhbHVlIGl0c2VsZiBpc1xuICAgICAgICAgKiByZXR1cm5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICRldmFsKHNlbGVjdG9yLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy4kZXZhbC5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuJGV2YWwoc2VsZWN0b3IsIHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvciBhbmQgcGFzc2VzIHRoZVxuICAgICAgICAgKiByZXN1bHRpbmcgYXJyYXkgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBgcGFnZUZ1bmN0aW9uYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogSWYgYHBhZ2VGdW5jdGlvbmAgcmV0dXJucyBhIHByb21pc2UgYCQkZXZhbGAgd2lsbCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0b1xuICAgICAgICAgKiByZXNvbHZlIGFuZCB0aGVuIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIC8vIGdldCB0aGUgYW1vdW50IG9mIGRpdnMgb24gdGhlIHBhZ2VcbiAgICAgICAgICogY29uc3QgZGl2Q291bnQgPSBhd2FpdCBwYWdlLiQkZXZhbCgnZGl2JywgZGl2cyA9PiBkaXZzLmxlbmd0aCk7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIGdldCB0aGUgdGV4dCBjb250ZW50IG9mIGFsbCB0aGUgYC5vcHRpb25zYCBlbGVtZW50czpcbiAgICAgICAgICogY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHBhZ2UuJCRldmFsKCdkaXYgPiBzcGFuLm9wdGlvbnMnLCBvcHRpb25zID0+IHtcbiAgICAgICAgICogICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+IG9wdGlvbi50ZXh0Q29udGVudCk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogSWYgeW91IGFyZSB1c2luZyBUeXBlU2NyaXB0LCB5b3UgbWF5IGhhdmUgdG8gcHJvdmlkZSBhbiBleHBsaWNpdCB0eXBlIHRvIHRoZVxuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgdHlwZWQgYXMgYEVsZW1lbnRbXWAsIGJ1dCB5b3UgbWF5IG5lZWQgdG8gcHJvdmlkZSBhIG1vcmVcbiAgICAgICAgICogc3BlY2lmaWMgc3ViLXR5cGU6XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGF3YWl0IHBhZ2UuJCRldmFsKCdpbnB1dCcsIGVsZW1lbnRzID0+IHtcbiAgICAgICAgICogICByZXR1cm4gZWxlbWVudHMubWFwKGUgPT4gZS52YWx1ZSk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIGluZmVyIHRoZSByZXR1cm4gdHlwZVxuICAgICAgICAgKiBmcm9tIHRoZSBgcGFnZUZ1bmN0aW9uYCB5b3UgcHJvdmlkZS4gSWYgaXQgaXMgdW5hYmxlIHRvLCB5b3UgY2FuIHVzZSB0aGUgZ2VuZXJpY1xuICAgICAgICAgKiB0eXBlIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHdoYXQgcmV0dXJuIHR5cGUgeW91IGV4cGVjdCBmcm9tIGAkJGV2YWxgOlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBhbGxJbnB1dFZhbHVlcyA9IGF3YWl0IHBhZ2UuJCRldmFsKCdpbnB1dCcsIGVsZW1lbnRzID0+XG4gICAgICAgICAqICAgZWxlbWVudHMubWFwKGUgPT4gZS50ZXh0Q29udGVudClcbiAgICAgICAgICogKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSB0aGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBwYWdlIGNvbnRleHQuXG4gICAgICAgICAqIFdpbGwgYmUgcGFzc2VkIGFuIGFycmF5IG9mIG1hdGNoaW5nIGVsZW1lbnRzIGFzIGl0cyBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0aHJvdWdoIHRvIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgYHBhZ2VGdW5jdGlvbmAuIElmIGl0IHJldHVybnMgYW4gZWxlbWVudCBpdFxuICAgICAgICAgKiBpcyB3cmFwcGVkIGluIGFuIHtAbGluayBFbGVtZW50SGFuZGxlfSwgZWxzZSB0aGUgcmF3IHZhbHVlIGl0c2VsZiBpc1xuICAgICAgICAgKiByZXR1cm5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuJCRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluRnJhbWUoKS4kJGV2YWwoc2VsZWN0b3IsIHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgYSBgPHNjcmlwdD5gIHRhZyBpbnRvIHRoZSBwYWdlIHdpdGggdGhlIGRlc2lyZWQgVVJMIG9yIGNvbnRlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFNob3J0Y3V0IGZvclxuICAgICAgICAgKiB7QGxpbmsgRnJhbWUuYWRkU2NyaXB0VGFnIHwgcGFnZS5tYWluRnJhbWUoKS5hZGRTY3JpcHRUYWcob3B0aW9ucyl9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBzY3JpcHQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIHtAbGluayBFbGVtZW50SGFuZGxlIHwgZWxlbWVudCBoYW5kbGV9IHRvIHRoZSBpbmplY3RlZFxuICAgICAgICAgKiBgPHNjcmlwdD5gIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhZGRTY3JpcHRUYWcob3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuYWRkU2NyaXB0VGFnKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGFkZFN0eWxlVGFnKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmFkZFN0eWxlVGFnKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGFnZSdzIFVSTC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogU2hvcnRjdXQgZm9yIHtAbGluayBGcmFtZS51cmwgfCBwYWdlLm1haW5GcmFtZSgpLnVybCgpfS5cbiAgICAgICAgICovXG4gICAgICAgIHVybCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLnVybCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZnVsbCBIVE1MIGNvbnRlbnRzIG9mIHRoZSBwYWdlLCBpbmNsdWRpbmcgdGhlIERPQ1RZUEUuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjb250ZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuY29udGVudCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBodG1sIC0gSFRNTCBtYXJrdXAgdG8gYXNzaWduIHRvIHRoZSBwYWdlLlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFBhcmFtZXRlcnMgdGhhdCBoYXMgc29tZSBwcm9wZXJ0aWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2V0Q29udGVudChodG1sLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLnNldENvbnRlbnQoaHRtbCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHtAaW5oZXJpdERvYyBGcmFtZS5nb3RvfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZ290byh1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmdvdG8odXJsLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdHMgZm9yIHRoZSBwYWdlIHRvIG5hdmlnYXRlIHRvIGEgbmV3IFVSTCBvciB0byByZWxvYWQuIEl0IGlzIHVzZWZ1bCB3aGVuXG4gICAgICAgICAqIHlvdSBydW4gY29kZSB0aGF0IHdpbGwgaW5kaXJlY3RseSBjYXVzZSB0aGUgcGFnZSB0byBuYXZpZ2F0ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgW3Jlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICogICBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKCksIC8vIFRoZSBwcm9taXNlIHJlc29sdmVzIGFmdGVyIG5hdmlnYXRpb24gaGFzIGZpbmlzaGVkXG4gICAgICAgICAqICAgcGFnZS5jbGljaygnYS5teS1saW5rJyksIC8vIENsaWNraW5nIHRoZSBsaW5rIHdpbGwgaW5kaXJlY3RseSBjYXVzZSBhIG5hdmlnYXRpb25cbiAgICAgICAgICogXSk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBVc2FnZSBvZiB0aGVcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IaXN0b3J5X0FQSSB8IEhpc3RvcnkgQVBJfVxuICAgICAgICAgKiB0byBjaGFuZ2UgdGhlIFVSTCBpcyBjb25zaWRlcmVkIGEgbmF2aWdhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBOYXZpZ2F0aW9uIHBhcmFtZXRlcnMgd2hpY2ggbWlnaHQgaGF2ZSB0aGUgZm9sbG93aW5nXG4gICAgICAgICAqIHByb3BlcnRpZXM6XG4gICAgICAgICAqIEByZXR1cm5zIEEgYFByb21pc2VgIHdoaWNoIHJlc29sdmVzIHRvIHRoZSBtYWluIHJlc291cmNlIHJlc3BvbnNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIEluIGNhc2Ugb2YgbXVsdGlwbGUgcmVkaXJlY3RzLCB0aGUgbmF2aWdhdGlvbiB3aWxsIHJlc29sdmUgd2l0aCB0aGVcbiAgICAgICAgICogICByZXNwb25zZSBvZiB0aGUgbGFzdCByZWRpcmVjdC5cbiAgICAgICAgICogLSBJbiBjYXNlIG9mIG5hdmlnYXRpb24gdG8gYSBkaWZmZXJlbnQgYW5jaG9yIG9yIG5hdmlnYXRpb24gZHVlIHRvIEhpc3RvcnlcbiAgICAgICAgICogICBBUEkgdXNhZ2UsIHRoZSBuYXZpZ2F0aW9uIHdpbGwgcmVzb2x2ZSB3aXRoIGBudWxsYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhaXRGb3JOYXZpZ2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkud2FpdEZvck5hdmlnYXRpb24ob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB1cmxPclByZWRpY2F0ZSAtIEEgVVJMIG9yIHByZWRpY2F0ZSB0byB3YWl0IGZvclxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHdhaXRpbmcgcGFyYW1ldGVyc1xuICAgICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSBtYXRjaGVkIHJlcXVlc3RcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgZmlyc3RSZXF1ZXN0ID0gYXdhaXQgcGFnZS53YWl0Rm9yUmVxdWVzdChcbiAgICAgICAgICogICAnaHR0cHM6Ly9leGFtcGxlLmNvbS9yZXNvdXJjZSdcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc3QgZmluYWxSZXF1ZXN0ID0gYXdhaXQgcGFnZS53YWl0Rm9yUmVxdWVzdChcbiAgICAgICAgICogICByZXF1ZXN0ID0+IHJlcXVlc3QudXJsKCkgPT09ICdodHRwczovL2V4YW1wbGUuY29tJ1xuICAgICAgICAgKiApO1xuICAgICAgICAgKiByZXR1cm4gZmluYWxSZXF1ZXN0LnJlc3BvbnNlKCk/Lm9rKCk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBPcHRpb25hbCBXYWl0aW5nIFBhcmFtZXRlcnMgaGF2ZTpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgdGltZW91dGA6IE1heGltdW0gd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcywgZGVmYXVsdHMgdG8gYDMwYCBzZWNvbmRzLCBwYXNzXG4gICAgICAgICAqICAgYDBgIHRvIGRpc2FibGUgdGhlIHRpbWVvdXQuIFRoZSBkZWZhdWx0IHZhbHVlIGNhbiBiZSBjaGFuZ2VkIGJ5IHVzaW5nIHRoZVxuICAgICAgICAgKiAgIHtAbGluayBQYWdlLnNldERlZmF1bHRUaW1lb3V0fSBtZXRob2QuXG4gICAgICAgICAqL1xuICAgICAgICB3YWl0Rm9yUmVxdWVzdCh1cmxPclByZWRpY2F0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSwgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxPclByZWRpY2F0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB1cmxPclByZWRpY2F0ZTtcbiAgICAgICAgICAgICAgICB1cmxPclByZWRpY2F0ZSA9IChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnVybCgpID09PSB1cmw7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmFibGUkID0gZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInJlcXVlc3RcIiAvKiBQYWdlRXZlbnQuUmVxdWVzdCAqLykucGlwZShmaWx0ZXJBc3luYyh1cmxPclByZWRpY2F0ZSksIHJhY2VXaXRoKHRpbWVvdXQobXMpLCBmcm9tQWJvcnRTaWduYWwoc2lnbmFsKSwgZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcImNsb3NlXCIgLyogUGFnZUV2ZW50LkNsb3NlICovKS5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldENsb3NlRXJyb3IoJ1BhZ2UgY2xvc2VkIScpO1xuICAgICAgICAgICAgfSkpKSk7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20ob2JzZXJ2YWJsZSQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gdXJsT3JQcmVkaWNhdGUgLSBBIFVSTCBvciBwcmVkaWNhdGUgdG8gd2FpdCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgd2FpdGluZyBwYXJhbWV0ZXJzXG4gICAgICAgICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIG1hdGNoZWQgcmVzcG9uc2UuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBhd2FpdCBwYWdlLndhaXRGb3JSZXNwb25zZShcbiAgICAgICAgICogICAnaHR0cHM6Ly9leGFtcGxlLmNvbS9yZXNvdXJjZSdcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc3QgZmluYWxSZXNwb25zZSA9IGF3YWl0IHBhZ2Uud2FpdEZvclJlc3BvbnNlKFxuICAgICAgICAgKiAgIHJlc3BvbnNlID0+XG4gICAgICAgICAqICAgICByZXNwb25zZS51cmwoKSA9PT0gJ2h0dHBzOi8vZXhhbXBsZS5jb20nICYmIHJlc3BvbnNlLnN0YXR1cygpID09PSAyMDBcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc3QgZmluYWxSZXNwb25zZSA9IGF3YWl0IHBhZ2Uud2FpdEZvclJlc3BvbnNlKGFzeW5jIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICogICByZXR1cm4gKGF3YWl0IHJlc3BvbnNlLnRleHQoKSkuaW5jbHVkZXMoJzxodG1sPicpO1xuICAgICAgICAgKiB9KTtcbiAgICAgICAgICogcmV0dXJuIGZpbmFsUmVzcG9uc2Uub2soKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIE9wdGlvbmFsIFBhcmFtZXRlciBoYXZlOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIGB0aW1lb3V0YDogTWF4aW11bSB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLCBkZWZhdWx0cyB0byBgMzBgIHNlY29uZHMsXG4gICAgICAgICAqICAgcGFzcyBgMGAgdG8gZGlzYWJsZSB0aGUgdGltZW91dC4gVGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWQgYnkgdXNpbmdcbiAgICAgICAgICogICB0aGUge0BsaW5rIFBhZ2Uuc2V0RGVmYXVsdFRpbWVvdXR9IG1ldGhvZC5cbiAgICAgICAgICovXG4gICAgICAgIHdhaXRGb3JSZXNwb25zZSh1cmxPclByZWRpY2F0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSwgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxPclByZWRpY2F0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB1cmxPclByZWRpY2F0ZTtcbiAgICAgICAgICAgICAgICB1cmxPclByZWRpY2F0ZSA9IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UudXJsKCkgPT09IHVybDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSQgPSBmcm9tRW1pdHRlckV2ZW50KHRoaXMsIFwicmVzcG9uc2VcIiAvKiBQYWdlRXZlbnQuUmVzcG9uc2UgKi8pLnBpcGUoZmlsdGVyQXN5bmModXJsT3JQcmVkaWNhdGUpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSwgZnJvbUFib3J0U2lnbmFsKHNpZ25hbCksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRDbG9zZUVycm9yKCdQYWdlIGNsb3NlZCEnKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKG9ic2VydmFibGUkKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdHMgZm9yIHRoZSBuZXR3b3JrIHRvIGJlIGlkbGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgd2FpdGluZyBiZWhhdmlvci5cbiAgICAgICAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIG9uY2UgdGhlIG5ldHdvcmsgaXMgaWRsZS5cbiAgICAgICAgICovXG4gICAgICAgIHdhaXRGb3JOZXR3b3JrSWRsZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLndhaXRGb3JOZXR3b3JrSWRsZSQob3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHdhaXRGb3JOZXR3b3JrSWRsZSQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSwgaWRsZVRpbWUgPSBORVRXT1JLX0lETEVfVElNRSwgY29uY3VycmVuY3kgPSAwLCBzaWduYWwsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2luZmxpZ2h0JC5waXBlKHN3aXRjaE1hcChpbmZsaWdodCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZmxpZ2h0ID4gY29uY3VycmVuY3kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGltZXIoaWRsZVRpbWUpO1xuICAgICAgICAgICAgfSksIG1hcCgoKSA9PiB7IH0pLCByYWNlV2l0aCh0aW1lb3V0KG1zKSwgZnJvbUFib3J0U2lnbmFsKHNpZ25hbCksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRDbG9zZUVycm9yKCdQYWdlIGNsb3NlZCEnKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXYWl0cyBmb3IgYSBmcmFtZSBtYXRjaGluZyB0aGUgZ2l2ZW4gY29uZGl0aW9ucyB0byBhcHBlYXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGZyYW1lID0gYXdhaXQgcGFnZS53YWl0Rm9yRnJhbWUoYXN5bmMgZnJhbWUgPT4ge1xuICAgICAgICAgKiAgIHJldHVybiBmcmFtZS5uYW1lKCkgPT09ICdUZXN0JztcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FpdEZvckZyYW1lKHVybE9yUHJlZGljYXRlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGltZW91dDogbXMgPSB0aGlzLmdldERlZmF1bHRUaW1lb3V0KCksIHNpZ25hbCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGlmIChpc1N0cmluZyh1cmxPclByZWRpY2F0ZSkpIHtcbiAgICAgICAgICAgICAgICB1cmxPclByZWRpY2F0ZSA9IChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsT3JQcmVkaWNhdGUgPT09IGZyYW1lLnVybCgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyc3RWYWx1ZUZyb20obWVyZ2UoZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcImZyYW1lYXR0YWNoZWRcIiAvKiBQYWdlRXZlbnQuRnJhbWVBdHRhY2hlZCAqLyksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJmcmFtZW5hdmlnYXRlZFwiIC8qIFBhZ2VFdmVudC5GcmFtZU5hdmlnYXRlZCAqLyksIGZyb20odGhpcy5mcmFtZXMoKSkpLnBpcGUoZmlsdGVyQXN5bmModXJsT3JQcmVkaWNhdGUpLCBmaXJzdCgpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSwgZnJvbUFib3J0U2lnbmFsKHNpZ25hbCksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRDbG9zZUVycm9yKCdQYWdlIGNsb3NlZC4nKTtcbiAgICAgICAgICAgIH0pKSkpKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogRW11bGF0ZXMgYSBnaXZlbiBkZXZpY2UncyBtZXRyaWNzIGFuZCB1c2VyIGFnZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBhaWQgZW11bGF0aW9uLCBQdXBwZXRlZXIgcHJvdmlkZXMgYSBsaXN0IG9mIGtub3duIGRldmljZXMgdGhhdCBjYW4gYmVcbiAgICAgICAgICogdmlhIHtAbGluayBLbm93bkRldmljZXN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhIHNob3J0Y3V0IGZvciBjYWxsaW5nIHR3byBtZXRob2RzOlxuICAgICAgICAgKiB7QGxpbmsgUGFnZS5zZXRVc2VyQWdlbnR9IGFuZCB7QGxpbmsgUGFnZS5zZXRWaWV3cG9ydH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmVzaXplIHRoZSBwYWdlLiBBIGxvdCBvZiB3ZWJzaXRlcyBkb24ndCBleHBlY3QgcGhvbmVzIHRvXG4gICAgICAgICAqIGNoYW5nZSBzaXplLCBzbyB5b3Ugc2hvdWxkIGVtdWxhdGUgYmVmb3JlIG5hdmlnYXRpbmcgdG8gdGhlIHBhZ2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGltcG9ydCB7S25vd25EZXZpY2VzfSBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKiBjb25zdCBpUGhvbmUgPSBLbm93bkRldmljZXNbJ2lQaG9uZSA2J107XG4gICAgICAgICAqXG4gICAgICAgICAqIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgICAgICAqICAgYXdhaXQgcGFnZS5lbXVsYXRlKGlQaG9uZSk7XG4gICAgICAgICAqICAgYXdhaXQgcGFnZS5nb3RvKCdodHRwczovL3d3dy5nb29nbGUuY29tJyk7XG4gICAgICAgICAqICAgLy8gb3RoZXIgYWN0aW9ucy4uLlxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBlbXVsYXRlKGRldmljZSkge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VXNlckFnZW50KGRldmljZS51c2VyQWdlbnQpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Vmlld3BvcnQoZGV2aWNlLnZpZXdwb3J0KSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFdmFsdWF0ZXMgYSBmdW5jdGlvbiBpbiB0aGUgcGFnZSdzIGNvbnRleHQgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGZ1bmN0aW9uIHBhc3NlZCB0byBgcGFnZS5ldmFsdWF0ZWAgcmV0dXJucyBhIFByb21pc2UsIHRoZVxuICAgICAgICAgKiBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvIHJlc29sdmUgYW5kIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZyYW1lLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICogICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKDggKiA3KTtcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdCk7IC8vIHByaW50cyBcIjU2XCJcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIFlvdSBjYW4gcGFzcyBhIHN0cmluZyBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gKGFsdGhvdWdoIGZ1bmN0aW9ucyBhcmVcbiAgICAgICAgICogcmVjb21tZW5kZWQgYXMgdGhleSBhcmUgZWFzaWVyIHRvIGRlYnVnIGFuZCB1c2Ugd2l0aCBUeXBlU2NyaXB0KTpcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgYUhhbmRsZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoJzEgKyAyJyk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBnZXQgdGhlIGJlc3QgVHlwZVNjcmlwdCBleHBlcmllbmNlLCB5b3Ugc2hvdWxkIHBhc3MgaW4gYXMgdGhlXG4gICAgICAgICAqIGdlbmVyaWMgdGhlIHR5cGUgb2YgYHBhZ2VGdW5jdGlvbmA6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGFIYW5kbGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IDIpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICoge0BsaW5rIEVsZW1lbnRIYW5kbGV9IGluc3RhbmNlcyAoaW5jbHVkaW5nIHtAbGluayBKU0hhbmRsZX1zKSBjYW4gYmUgcGFzc2VkXG4gICAgICAgICAqIGFzIGFyZ3VtZW50cyB0byB0aGUgYHBhZ2VGdW5jdGlvbmA6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGJvZHlIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJ2JvZHknKTtcbiAgICAgICAgICogY29uc3QgaHRtbCA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoYm9keSA9PiBib2R5LmlubmVySFRNTCwgYm9keUhhbmRsZSk7XG4gICAgICAgICAqIGF3YWl0IGJvZHlIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHBhZ2VGdW5jdGlvbiAtIGEgZnVuY3Rpb24gdGhhdCBpcyBydW4gd2l0aGluIHRoZSBwYWdlXG4gICAgICAgICAqIEBwYXJhbSBhcmdzIC0gYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgcGFnZUZ1bmN0aW9uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHRoZSByZXR1cm4gdmFsdWUgb2YgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBldmFsdWF0ZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy5ldmFsdWF0ZS5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBfbWF5YmVXcml0ZUJ1ZmZlclRvRmlsZShwYXRoLCBidWZmZXIpIHtcbiAgICAgICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0RlNQcm9taXNlcygpO1xuICAgICAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGgsIGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhcHR1cmVzIGEgc2NyZWVuY2FzdCBvZiB0aGlzIHtAbGluayBQYWdlIHwgcGFnZX0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIFJlY29yZGluZyBhIHtAbGluayBQYWdlIHwgcGFnZX06XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIExhdW5jaCBhIGJyb3dzZXJcbiAgICAgICAgICogY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gQ3JlYXRlIGEgbmV3IHBhZ2VcbiAgICAgICAgICogY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBHbyB0byB5b3VyIHNpdGUuXG4gICAgICAgICAqIGF3YWl0IHBhZ2UuZ290byhcImh0dHBzOi8vd3d3LmV4YW1wbGUuY29tXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBTdGFydCByZWNvcmRpbmcuXG4gICAgICAgICAqIGNvbnN0IHJlY29yZGVyID0gYXdhaXQgcGFnZS5zY3JlZW5jYXN0KHtwYXRoOiAncmVjb3JkaW5nLndlYm0nfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIERvIHNvbWV0aGluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogLy8gU3RvcCByZWNvcmRpbmcuXG4gICAgICAgICAqIGF3YWl0IHJlY29yZGVyLnN0b3AoKTtcbiAgICAgICAgICpcbiAgICAgICAgICogYnJvd3Nlci5jbG9zZSgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmVzIHNjcmVlbmNhc3QgYmVoYXZpb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogQWxsIHJlY29yZGluZ3Mgd2lsbCBiZSB7QGxpbmsgaHR0cHM6Ly93d3cud2VibXByb2plY3Qub3JnLyB8IFdlYk19IGZvcm1hdCB1c2luZ1xuICAgICAgICAgKiB0aGUge0BsaW5rIGh0dHBzOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy92cDkvIHwgVlA5fSB2aWRlbyBjb2RlYy4gVGhlIEZQUyBpcyAzMC5cbiAgICAgICAgICpcbiAgICAgICAgICogWW91IG11c3QgaGF2ZSB7QGxpbmsgaHR0cHM6Ly9mZm1wZWcub3JnLyB8IGZmbXBlZ30gaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2NyZWVuY2FzdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IFt7IFNjcmVlblJlY29yZGVyIH0sIFt3aWR0aCwgaGVpZ2h0LCBkZXZpY2VQaXhlbFJhdGlvXV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgaW1wb3J0KCcuLi9ub2RlL1NjcmVlblJlY29yZGVyLmpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy4jZ2V0TmF0aXZlUGl4ZWxEaW1lbnNpb25zKCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIGxldCBjcm9wO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY3JvcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgeCwgeSwgd2lkdGg6IGNyb3BXaWR0aCwgaGVpZ2h0OiBjcm9wSGVpZ2h0LCB9ID0gcm91bmRSZWN0YW5nbGUobm9ybWFsaXplUmVjdGFuZ2xlKG9wdGlvbnMuY3JvcCkpO1xuICAgICAgICAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYGNyb3AueFxcYCBhbmQgXFxgY3JvcC55XFxgIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjcm9wV2lkdGggPD0gMCB8fCBjcm9wSGVpZ2h0IDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGBjcm9wLmhlaWdodFxcYCBhbmQgXFxgY3JvcC53aWR0aFxcYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2lkdGggLyBkZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gaGVpZ2h0IC8gZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgICAgICAgICBpZiAoeCArIGNyb3BXaWR0aCA+IHZpZXdwb3J0V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGBjcm9wLndpZHRoXFxgIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgdmlld3BvcnQgd2lkdGggKCR7dmlld3BvcnRXaWR0aH0pLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoeSArIGNyb3BIZWlnaHQgPiB2aWV3cG9ydEhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYGNyb3AuaGVpZ2h0XFxgIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgdmlld3BvcnQgaGVpZ2h0ICgke3ZpZXdwb3J0SGVpZ2h0fSkuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNyb3AgPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6IHggKiBkZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICB5OiB5ICogZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNyb3BXaWR0aCAqIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogY3JvcEhlaWdodCAqIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnNwZWVkICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zcGVlZCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGBzcGVlZFxcYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2NhbGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnNjYWxlIDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYHNjYWxlXFxgIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZWNvcmRlciA9IG5ldyBTY3JlZW5SZWNvcmRlcih0aGlzLCB3aWR0aCwgaGVpZ2h0LCB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICBwYXRoOiBvcHRpb25zLmZmbXBlZ1BhdGgsXG4gICAgICAgICAgICAgICAgY3JvcCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zdGFydFNjcmVlbmNhc3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHZvaWQgcmVjb3JkZXIuc3RvcCgpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGF0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY3JlYXRlV3JpdGVTdHJlYW0gfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBjcmVhdGVXcml0ZVN0cmVhbShvcHRpb25zLnBhdGgsICdiaW5hcnknKTtcbiAgICAgICAgICAgICAgICByZWNvcmRlci5waXBlKHN0cmVhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgI3NjcmVlbmNhc3RTZXNzaW9uQ291bnQgPSAwO1xuICAgICAgICAjc3RhcnRTY3JlZW5jYXN0UHJvbWlzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgX3N0YXJ0U2NyZWVuY2FzdCgpIHtcbiAgICAgICAgICAgICsrdGhpcy4jc2NyZWVuY2FzdFNlc3Npb25Db3VudDtcbiAgICAgICAgICAgIGlmICghdGhpcy4jc3RhcnRTY3JlZW5jYXN0UHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI3N0YXJ0U2NyZWVuY2FzdFByb21pc2UgPSB0aGlzLm1haW5GcmFtZSgpXG4gICAgICAgICAgICAgICAgICAgIC5jbGllbnQuc2VuZCgnUGFnZS5zdGFydFNjcmVlbmNhc3QnLCB7IGZvcm1hdDogJ3BuZycgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgZmlyc3QgZnJhbWUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLmNsaWVudC5vbmNlKCdQYWdlLnNjcmVlbmNhc3RGcmFtZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy4jc3RhcnRTY3JlZW5jYXN0UHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBfc3RvcFNjcmVlbmNhc3QoKSB7XG4gICAgICAgICAgICAtLXRoaXMuI3NjcmVlbmNhc3RTZXNzaW9uQ291bnQ7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI3N0YXJ0U2NyZWVuY2FzdFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNzdGFydFNjcmVlbmNhc3RQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3NjcmVlbmNhc3RTZXNzaW9uQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmNsaWVudC5zZW5kKCdQYWdlLnN0b3BTY3JlZW5jYXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG5hdGl2ZSwgbm9uLWVtdWxhdGVkIGRpbWVuc2lvbnMgb2YgdGhlIHZpZXdwb3J0LlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgI2dldE5hdGl2ZVBpeGVsRGltZW5zaW9ucygpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBuZXcgRGlzcG9zYWJsZVN0YWNrKCksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAodmlld3BvcnQgJiYgdmlld3BvcnQuZGV2aWNlU2NhbGVGYWN0b3IgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRWaWV3cG9ydCh7IC4uLnZpZXdwb3J0LCBkZXZpY2VTY2FsZUZhY3RvcjogMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2suZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCB0aGlzLnNldFZpZXdwb3J0KHZpZXdwb3J0KS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpXG4gICAgICAgICAgICAgICAgICAgIC5pc29sYXRlZFJlYWxtKClcbiAgICAgICAgICAgICAgICAgICAgLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy52aXN1YWxWaWV3cG9ydC53aWR0aCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnZpc3VhbFZpZXdwb3J0LmhlaWdodCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgZW52XzEuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhc3luYyBzY3JlZW5zaG90KHVzZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfZ3VhcmQgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMiwgYXdhaXQgdGhpcy5icm93c2VyQ29udGV4dCgpLnN0YXJ0U2NyZWVuc2hvdCgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2Ugc3RydWN0dXJlZENsb25lIGFmdGVyIE5vZGUgMTYgc3VwcG9ydCBpcyBkcm9wcGVkLlxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnVzZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBjbGlwOiB1c2VyT3B0aW9ucy5jbGlwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi51c2VyT3B0aW9ucy5jbGlwLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5wYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBvcHRpb25zLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgd2UgY2Fubm90IHVzZSBOb2RlLmpzIGhlcmUgZHVlIHRvIGJyb3dzZXIgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZVBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZShmaWxlUGF0aC5sYXN0SW5kZXhPZignLicpICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGV4dGVuc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncG5nJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAncG5nJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2pwZWcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnanBnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnanBlZyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd3ZWJwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnd2VicCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPCAwIHx8IG9wdGlvbnMucXVhbGl0eSA+IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAncXVhbGl0eScgKCR7b3B0aW9ucy5xdWFsaXR5fSkgdG8gYmUgYmV0d2VlbiAwIGFuZCAxMDAsIGluY2x1c2l2ZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFbJ2pwZWcnLCAnd2VicCddLmluY2x1ZGVzKG9wdGlvbnMudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvcHRpb25zLnR5cGUgPz8gJ3BuZyd9IHNjcmVlbnNob3RzIGRvIG5vdCBzdXBwb3J0ICdxdWFsaXR5Jy5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jbGlwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsaXAud2lkdGggPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ3dpZHRoJyBpbiAnY2xpcCcgbXVzdCBiZSBwb3NpdGl2ZS5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xpcC5oZWlnaHQgPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ2hlaWdodCcgaW4gJ2NsaXAnIG11c3QgYmUgcG9zaXRpdmUuXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldERlZmF1bHRTY3JlZW5zaG90T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8yLCBuZXcgQXN5bmNEaXNwb3NhYmxlU3RhY2soKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xpcCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mdWxsUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ2NsaXAnIGFuZCAnZnVsbFBhZ2UnIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jbGlwID0gcm91bmRSZWN0YW5nbGUobm9ybWFsaXplUmVjdGFuZ2xlKG9wdGlvbnMuY2xpcCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZnVsbFBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGBjYXB0dXJlQmV5b25kVmlld3BvcnRgIGlzIGBmYWxzZWAsIHRoZW4gd2Ugc2V0IHRoZSB2aWV3cG9ydCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSB0aGUgZnVsbCBwYWdlLiBOb3RlIHRoaXMgbWF5IGJlIGFmZmVjdGVkIGJ5IG9uLXBhZ2UgQ1NTIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSmF2YVNjcmlwdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5jYXB0dXJlQmV5b25kVmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxEaW1lbnNpb25zID0gYXdhaXQgdGhpcy5tYWluRnJhbWUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ldmFsdWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZWxlbWVudC5zY3JvbGxXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZWxlbWVudC5zY3JvbGxIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRWaWV3cG9ydCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnZpZXdwb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5zY3JvbGxEaW1lbnNpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLmRlZmVyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRWaWV3cG9ydCh2aWV3cG9ydCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNhcHR1cmVCZXlvbmRWaWV3cG9ydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLl9zY3JlZW5zaG90KG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVuY29kaW5nID09PSAnYmFzZTY0Jykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oZGF0YSwgJ2Jhc2U2NCcpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX21heWJlV3JpdGVCdWZmZXJUb0ZpbGUob3B0aW9ucy5wYXRoLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yKSB7XG4gICAgICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzI7XG4gICAgICAgICAgICAgICAgZW52XzIuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0XzEgPSBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRfMSlcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVzdWx0XzE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwYWdlJ3MgdGl0bGVcbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogU2hvcnRjdXQgZm9yIHtAbGluayBGcmFtZS50aXRsZSB8IHBhZ2UubWFpbkZyYW1lKCkudGl0bGUoKX0uXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0aXRsZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLnRpdGxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYW4gZWxlbWVudCB3aXRoIGBzZWxlY3RvcmAsIHNjcm9sbHMgaXQgaW50byB2aWV3IGlmXG4gICAgICAgICAqIG5lZWRlZCwgYW5kIHRoZW4gdXNlcyB7QGxpbmsgUGFnZS5tb3VzZX0gdG8gY2xpY2sgaW4gdGhlIGNlbnRlciBvZiB0aGVcbiAgICAgICAgICogZWxlbWVudC4gSWYgdGhlcmUncyBubyBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAsIHRoZSBtZXRob2QgdGhyb3dzIGFuXG4gICAgICAgICAqIGVycm9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBCZWFyIGluIG1pbmQgdGhhdCBpZiBgY2xpY2soKWAgdHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIGV2ZW50IGFuZFxuICAgICAgICAgKiB0aGVyZSdzIGEgc2VwYXJhdGUgYHBhZ2Uud2FpdEZvck5hdmlnYXRpb24oKWAgcHJvbWlzZSB0byBiZSByZXNvbHZlZCwgeW91XG4gICAgICAgICAqIG1heSBlbmQgdXAgd2l0aCBhIHJhY2UgY29uZGl0aW9uIHRoYXQgeWllbGRzIHVuZXhwZWN0ZWQgcmVzdWx0cy4gVGhlXG4gICAgICAgICAqIGNvcnJlY3QgcGF0dGVybiBmb3IgY2xpY2sgYW5kIHdhaXQgZm9yIG5hdmlnYXRpb24gaXMgdGhlIGZvbGxvd2luZzpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgW3Jlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICogICBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKHdhaXRPcHRpb25zKSxcbiAgICAgICAgICogICBwYWdlLmNsaWNrKHNlbGVjdG9yLCBjbGlja09wdGlvbnMpLFxuICAgICAgICAgKiBdKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuY2xpY2sgfCBwYWdlLm1haW5GcmFtZSgpLmNsaWNrKHNlbGVjdG9yWywgb3B0aW9uc10pIH0uXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIEEgYHNlbGVjdG9yYCB0byBzZWFyY2ggZm9yIGVsZW1lbnQgdG8gY2xpY2suIElmIHRoZXJlIGFyZVxuICAgICAgICAgKiBtdWx0aXBsZSBlbGVtZW50cyBzYXRpc2Z5aW5nIHRoZSBgc2VsZWN0b3JgLCB0aGUgZmlyc3Qgd2lsbCBiZSBjbGlja2VkXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYE9iamVjdGBcbiAgICAgICAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAgaXNcbiAgICAgICAgICogc3VjY2Vzc2Z1bGx5IGNsaWNrZWQuIFRoZSBQcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgaWYgdGhlcmUgaXMgbm8gZWxlbWVudFxuICAgICAgICAgKiBtYXRjaGluZyBgc2VsZWN0b3JgLlxuICAgICAgICAgKi9cbiAgICAgICAgY2xpY2soc2VsZWN0b3IsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLmNsaWNrKHNlbGVjdG9yLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgZmV0Y2hlcyBhbiBlbGVtZW50IHdpdGggYHNlbGVjdG9yYCBhbmQgZm9jdXNlcyBpdC4gSWYgdGhlcmUncyBub1xuICAgICAgICAgKiBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAsIHRoZSBtZXRob2QgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBBXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IHNlbGVjdG9yIH1cbiAgICAgICAgICogb2YgYW4gZWxlbWVudCB0byBmb2N1cy4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIHNhdGlzZnlpbmcgdGhlXG4gICAgICAgICAqIHNlbGVjdG9yLCB0aGUgZmlyc3Qgd2lsbCBiZSBmb2N1c2VkLlxuICAgICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgbWF0Y2hpbmcgc2VsZWN0b3IgaXNcbiAgICAgICAgICogc3VjY2Vzc2Z1bGx5IGZvY3VzZWQuIFRoZSBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgaWYgdGhlcmUgaXMgbm8gZWxlbWVudFxuICAgICAgICAgKiBtYXRjaGluZyBzZWxlY3Rvci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogU2hvcnRjdXQgZm9yIHtAbGluayBGcmFtZS5mb2N1cyB8IHBhZ2UubWFpbkZyYW1lKCkuZm9jdXMoc2VsZWN0b3IpfS5cbiAgICAgICAgICovXG4gICAgICAgIGZvY3VzKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluRnJhbWUoKS5mb2N1cyhzZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYW4gZWxlbWVudCB3aXRoIGBzZWxlY3RvcmAsIHNjcm9sbHMgaXQgaW50byB2aWV3IGlmXG4gICAgICAgICAqIG5lZWRlZCwgYW5kIHRoZW4gdXNlcyB7QGxpbmsgUGFnZS5tb3VzZX1cbiAgICAgICAgICogdG8gaG92ZXIgb3ZlciB0aGUgY2VudGVyIG9mIHRoZSBlbGVtZW50LlxuICAgICAgICAgKiBJZiB0aGVyZSdzIG5vIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCwgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIEFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHNlYXJjaCBmb3IgZWxlbWVudCB0byBob3Zlci4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIHNhdGlzZnlpbmdcbiAgICAgICAgICogdGhlIHNlbGVjdG9yLCB0aGUgZmlyc3Qgd2lsbCBiZSBob3ZlcmVkLlxuICAgICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCBpc1xuICAgICAgICAgKiBzdWNjZXNzZnVsbHkgaG92ZXJlZC4gUHJvbWlzZSBnZXRzIHJlamVjdGVkIGlmIHRoZXJlJ3Mgbm8gZWxlbWVudCBtYXRjaGluZ1xuICAgICAgICAgKiBgc2VsZWN0b3JgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBTaG9ydGN1dCBmb3Ige0BsaW5rIFBhZ2UuaG92ZXIgfCBwYWdlLm1haW5GcmFtZSgpLmhvdmVyKHNlbGVjdG9yKX0uXG4gICAgICAgICAqL1xuICAgICAgICBob3ZlcihzZWxlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbkZyYW1lKCkuaG92ZXIoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmlnZ2VycyBhIGBjaGFuZ2VgIGFuZCBgaW5wdXRgIGV2ZW50IG9uY2UgYWxsIHRoZSBwcm92aWRlZCBvcHRpb25zIGhhdmUgYmVlblxuICAgICAgICAgKiBzZWxlY3RlZC4gSWYgdGhlcmUncyBubyBgPHNlbGVjdD5gIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCwgdGhlIG1ldGhvZFxuICAgICAgICAgKiB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIHBhZ2Uuc2VsZWN0KCdzZWxlY3QjY29sb3JzJywgJ2JsdWUnKTsgLy8gc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgKiBwYWdlLnNlbGVjdCgnc2VsZWN0I2NvbG9ycycsICdyZWQnLCAnZ3JlZW4nLCAnYmx1ZScpOyAvLyBtdWx0aXBsZSBzZWxlY3Rpb25zXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBBXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IFNlbGVjdG9yfVxuICAgICAgICAgKiB0byBxdWVyeSB0aGUgcGFnZSBmb3JcbiAgICAgICAgICogQHBhcmFtIHZhbHVlcyAtIFZhbHVlcyBvZiBvcHRpb25zIHRvIHNlbGVjdC4gSWYgdGhlIGA8c2VsZWN0PmAgaGFzIHRoZVxuICAgICAgICAgKiBgbXVsdGlwbGVgIGF0dHJpYnV0ZSwgYWxsIHZhbHVlcyBhcmUgY29uc2lkZXJlZCwgb3RoZXJ3aXNlIG9ubHkgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgKiBpcyB0YWtlbiBpbnRvIGFjY291bnQuXG4gICAgICAgICAqIEByZXR1cm5zXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuc2VsZWN0IHwgcGFnZS5tYWluRnJhbWUoKS5zZWxlY3QoKX1cbiAgICAgICAgICovXG4gICAgICAgIHNlbGVjdChzZWxlY3RvciwgLi4udmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluRnJhbWUoKS5zZWxlY3Qoc2VsZWN0b3IsIC4uLnZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYW4gZWxlbWVudCB3aXRoIGBzZWxlY3RvcmAsIHNjcm9sbHMgaXQgaW50byB2aWV3IGlmXG4gICAgICAgICAqIG5lZWRlZCwgYW5kIHRoZW4gdXNlcyB7QGxpbmsgUGFnZS50b3VjaHNjcmVlbn1cbiAgICAgICAgICogdG8gdGFwIGluIHRoZSBjZW50ZXIgb2YgdGhlIGVsZW1lbnQuXG4gICAgICAgICAqIElmIHRoZXJlJ3Mgbm8gZWxlbWVudCBtYXRjaGluZyBgc2VsZWN0b3JgLCB0aGUgbWV0aG9kIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gQVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBTZWxlY3Rvcn1cbiAgICAgICAgICogdG8gc2VhcmNoIGZvciBlbGVtZW50IHRvIHRhcC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIHNhdGlzZnlpbmcgdGhlXG4gICAgICAgICAqIHNlbGVjdG9yLCB0aGUgZmlyc3Qgd2lsbCBiZSB0YXBwZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUudGFwIHwgcGFnZS5tYWluRnJhbWUoKS50YXAoc2VsZWN0b3IpfS5cbiAgICAgICAgICovXG4gICAgICAgIHRhcChzZWxlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbkZyYW1lKCkudGFwKHNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZHMgYSBga2V5ZG93bmAsIGBrZXlwcmVzcy9pbnB1dGAsIGFuZCBga2V5dXBgIGV2ZW50IGZvciBlYWNoIGNoYXJhY3RlclxuICAgICAgICAgKiBpbiB0aGUgdGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogVG8gcHJlc3MgYSBzcGVjaWFsIGtleSwgbGlrZSBgQ29udHJvbGAgb3IgYEFycm93RG93bmAsIHVzZSB7QGxpbmsgS2V5Ym9hcmQucHJlc3N9LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBhd2FpdCBwYWdlLnR5cGUoJyNteXRleHRhcmVhJywgJ0hlbGxvJyk7XG4gICAgICAgICAqIC8vIFR5cGVzIGluc3RhbnRseVxuICAgICAgICAgKiBhd2FpdCBwYWdlLnR5cGUoJyNteXRleHRhcmVhJywgJ1dvcmxkJywge2RlbGF5OiAxMDB9KTtcbiAgICAgICAgICogLy8gVHlwZXMgc2xvd2VyLCBsaWtlIGEgdXNlclxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gQVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogb2YgYW4gZWxlbWVudCB0byB0eXBlIGludG8uIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cyBzYXRpc2Z5aW5nIHRoZVxuICAgICAgICAgKiBzZWxlY3RvciwgdGhlIGZpcnN0IHdpbGwgYmUgdXNlZC5cbiAgICAgICAgICogQHBhcmFtIHRleHQgLSBBIHRleHQgdG8gdHlwZSBpbnRvIGEgZm9jdXNlZCBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGhhdmUgcHJvcGVydHkgYGRlbGF5YCB3aGljaCBpcyB0aGUgVGltZSB0byB3YWl0IGJldHdlZW5cbiAgICAgICAgICoga2V5IHByZXNzZXMgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byBgMGAuXG4gICAgICAgICAqIEByZXR1cm5zXG4gICAgICAgICAqL1xuICAgICAgICB0eXBlKHNlbGVjdG9yLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluRnJhbWUoKS50eXBlKHNlbGVjdG9yLCB0ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdCBmb3IgdGhlIGBzZWxlY3RvcmAgdG8gYXBwZWFyIGluIHBhZ2UuIElmIGF0IHRoZSBtb21lbnQgb2YgY2FsbGluZyB0aGVcbiAgICAgICAgICogbWV0aG9kIHRoZSBgc2VsZWN0b3JgIGFscmVhZHkgZXhpc3RzLCB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LiBJZlxuICAgICAgICAgKiB0aGUgYHNlbGVjdG9yYCBkb2Vzbid0IGFwcGVhciBhZnRlciB0aGUgYHRpbWVvdXRgIG1pbGxpc2Vjb25kcyBvZiB3YWl0aW5nLCB0aGVcbiAgICAgICAgICogZnVuY3Rpb24gd2lsbCB0aHJvdy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogVGhpcyBtZXRob2Qgd29ya3MgYWNyb3NzIG5hdmlnYXRpb25zOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gICAgICAgICAqIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgICAgICAqICAgbGV0IGN1cnJlbnRVUkw7XG4gICAgICAgICAqICAgcGFnZVxuICAgICAgICAgKiAgICAgLndhaXRGb3JTZWxlY3RvcignaW1nJylcbiAgICAgICAgICogICAgIC50aGVuKCgpID0+IGNvbnNvbGUubG9nKCdGaXJzdCBVUkwgd2l0aCBpbWFnZTogJyArIGN1cnJlbnRVUkwpKTtcbiAgICAgICAgICogICBmb3IgKGN1cnJlbnRVUkwgb2YgW1xuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZ29vZ2xlLmNvbScsXG4gICAgICAgICAqICAgICAnaHR0cHM6Ly9iYmMuY29tJyxcbiAgICAgICAgICogICBdKSB7XG4gICAgICAgICAqICAgICBhd2FpdCBwYWdlLmdvdG8oY3VycmVudFVSTCk7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIEFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIG9mIGFuIGVsZW1lbnQgdG8gd2FpdCBmb3JcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCB3YWl0aW5nIHBhcmFtZXRlcnNcbiAgICAgICAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgKiBpcyBhZGRlZCB0byBET00uIFJlc29sdmVzIHRvIGBudWxsYCBpZiB3YWl0aW5nIGZvciBoaWRkZW46IGB0cnVlYCBhbmRcbiAgICAgICAgICogc2VsZWN0b3IgaXMgbm90IGZvdW5kIGluIERPTS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogVGhlIG9wdGlvbmFsIFBhcmFtZXRlciBpbiBBcmd1bWVudHMgYG9wdGlvbnNgIGFyZTpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgdmlzaWJsZWA6IEEgYm9vbGVhbiB3YWl0IGZvciBlbGVtZW50IHRvIGJlIHByZXNlbnQgaW4gRE9NIGFuZCB0byBiZVxuICAgICAgICAgKiAgIHZpc2libGUsIGkuZS4gdG8gbm90IGhhdmUgYGRpc3BsYXk6IG5vbmVgIG9yIGB2aXNpYmlsaXR5OiBoaWRkZW5gIENTU1xuICAgICAgICAgKiAgIHByb3BlcnRpZXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIC0gYGhpZGRlbmA6IFdhaXQgZm9yIGVsZW1lbnQgdG8gbm90IGJlIGZvdW5kIGluIHRoZSBET00gb3IgdG8gYmUgaGlkZGVuLFxuICAgICAgICAgKiAgIGkuZS4gaGF2ZSBgZGlzcGxheTogbm9uZWAgb3IgYHZpc2liaWxpdHk6IGhpZGRlbmAgQ1NTIHByb3BlcnRpZXMuIERlZmF1bHRzIHRvXG4gICAgICAgICAqICAgYGZhbHNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogLSBgdGltZW91dGA6IG1heGltdW0gdGltZSB0byB3YWl0IGZvciBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIGAzMDAwMGBcbiAgICAgICAgICogICAoMzAgc2Vjb25kcykuIFBhc3MgYDBgIHRvIGRpc2FibGUgdGltZW91dC4gVGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWRcbiAgICAgICAgICogICBieSB1c2luZyB0aGUge0BsaW5rIFBhZ2Uuc2V0RGVmYXVsdFRpbWVvdXR9IG1ldGhvZC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhaXRGb3JTZWxlY3RvcihzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluRnJhbWUoKS53YWl0Rm9yU2VsZWN0b3Ioc2VsZWN0b3IsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXYWl0cyBmb3IgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLCBgcGFnZUZ1bmN0aW9uYCwgdG8gcmV0dXJuIGEgdHJ1dGh5IHZhbHVlIHdoZW5cbiAgICAgICAgICogZXZhbHVhdGVkIGluIHRoZSBwYWdlJ3MgY29udGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICoge0BsaW5rIFBhZ2Uud2FpdEZvckZ1bmN0aW9ufSBjYW4gYmUgdXNlZCB0byBvYnNlcnZlIGEgdmlld3BvcnQgc2l6ZSBjaGFuZ2U6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAgICAgICAgICogKGFzeW5jICgpID0+IHtcbiAgICAgICAgICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICAgICAgICAgKiAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBicm93c2VyLm5ld1BhZ2UoKTtcbiAgICAgICAgICogICBjb25zdCB3YXRjaERvZyA9IHBhZ2Uud2FpdEZvckZ1bmN0aW9uKCd3aW5kb3cuaW5uZXJXaWR0aCA8IDEwMCcpO1xuICAgICAgICAgKiAgIGF3YWl0IHBhZ2Uuc2V0Vmlld3BvcnQoe3dpZHRoOiA1MCwgaGVpZ2h0OiA1MH0pO1xuICAgICAgICAgKiAgIGF3YWl0IHdhdGNoRG9nO1xuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIEFyZ3VtZW50cyBjYW4gYmUgcGFzc2VkIGZyb20gTm9kZS5qcyB0byBgcGFnZUZ1bmN0aW9uYDpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VsZWN0b3IgPSAnLmZvbyc7XG4gICAgICAgICAqIGF3YWl0IHBhZ2Uud2FpdEZvckZ1bmN0aW9uKFxuICAgICAgICAgKiAgIHNlbGVjdG9yID0+ICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvciksXG4gICAgICAgICAqICAge30sXG4gICAgICAgICAqICAgc2VsZWN0b3JcbiAgICAgICAgICogKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIFRoZSBwcm92aWRlZCBgcGFnZUZ1bmN0aW9uYCBjYW4gYmUgYXN5bmNocm9ub3VzOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCB1c2VybmFtZSA9ICdnaXRodWItdXNlcm5hbWUnO1xuICAgICAgICAgKiBhd2FpdCBwYWdlLndhaXRGb3JGdW5jdGlvbihcbiAgICAgICAgICogICBhc3luYyB1c2VybmFtZSA9PiB7XG4gICAgICAgICAqICAgICBjb25zdCBnaXRodWJSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgKiAgICAgICBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy8ke3VzZXJuYW1lfWBcbiAgICAgICAgICogICAgICk7XG4gICAgICAgICAqICAgICBjb25zdCBnaXRodWJVc2VyID0gYXdhaXQgZ2l0aHViUmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgKiAgICAgLy8gc2hvdyB0aGUgYXZhdGFyXG4gICAgICAgICAqICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgICAgICogICAgIGltZy5zcmMgPSBnaXRodWJVc2VyLmF2YXRhcl91cmw7XG4gICAgICAgICAqICAgICAvLyB3YWl0IDMgc2Vjb25kc1xuICAgICAgICAgKiAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAzMDAwKSk7XG4gICAgICAgICAqICAgICBpbWcucmVtb3ZlKCk7XG4gICAgICAgICAqICAgfSxcbiAgICAgICAgICogICB7fSxcbiAgICAgICAgICogICB1c2VybmFtZVxuICAgICAgICAgKiApO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHBhZ2VGdW5jdGlvbiAtIEZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZCBpbiBicm93c2VyIGNvbnRleHQgdW50aWwgaXQgcmV0dXJucyBhXG4gICAgICAgICAqIHRydXRoeSB2YWx1ZS5cbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciBjb25maWd1cmluZyB3YWl0aW5nIGJlaGF2aW9yLlxuICAgICAgICAgKi9cbiAgICAgICAgd2FpdEZvckZ1bmN0aW9uKHBhZ2VGdW5jdGlvbiwgb3B0aW9ucywgLi4uYXJncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbkZyYW1lKCkud2FpdEZvckZ1bmN0aW9uKHBhZ2VGdW5jdGlvbiwgb3B0aW9ucywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBbKF9zY3JlZW5zaG90X2RlY29yYXRvcnMgPSBbZ3VhcmRlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnJvd3NlcigpO1xuICAgICAgICAgICAgfSldLCBkaXNwb3NlU3ltYm9sKV0oKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmNsb3NlKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBbYXN5bmNEaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IFBhZ2UgfTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBzdXBwb3J0ZWRNZXRyaWNzID0gbmV3IFNldChbXG4gICAgJ1RpbWVzdGFtcCcsXG4gICAgJ0RvY3VtZW50cycsXG4gICAgJ0ZyYW1lcycsXG4gICAgJ0pTRXZlbnRMaXN0ZW5lcnMnLFxuICAgICdOb2RlcycsXG4gICAgJ0xheW91dENvdW50JyxcbiAgICAnUmVjYWxjU3R5bGVDb3VudCcsXG4gICAgJ0xheW91dER1cmF0aW9uJyxcbiAgICAnUmVjYWxjU3R5bGVEdXJhdGlvbicsXG4gICAgJ1NjcmlwdER1cmF0aW9uJyxcbiAgICAnVGFza0R1cmF0aW9uJyxcbiAgICAnSlNIZWFwVXNlZFNpemUnLFxuICAgICdKU0hlYXBUb3RhbFNpemUnLFxuXSk7XG4vKiogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vd2ViZHJpdmVyLWJpZGkvI25vcm1hbGl6ZS1yZWN0ICovXG5mdW5jdGlvbiBub3JtYWxpemVSZWN0YW5nbGUoY2xpcCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNsaXAsXG4gICAgICAgIC4uLihjbGlwLndpZHRoIDwgMFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgeDogY2xpcC54ICsgY2xpcC53aWR0aCxcbiAgICAgICAgICAgICAgICB3aWR0aDogLWNsaXAud2lkdGgsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICB4OiBjbGlwLngsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGNsaXAud2lkdGgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgLi4uKGNsaXAuaGVpZ2h0IDwgMFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgeTogY2xpcC55ICsgY2xpcC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAtY2xpcC5oZWlnaHQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICB5OiBjbGlwLnksXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBjbGlwLmhlaWdodCxcbiAgICAgICAgICAgIH0pLFxuICAgIH07XG59XG5mdW5jdGlvbiByb3VuZFJlY3RhbmdsZShjbGlwKSB7XG4gICAgY29uc3QgeCA9IE1hdGgucm91bmQoY2xpcC54KTtcbiAgICBjb25zdCB5ID0gTWF0aC5yb3VuZChjbGlwLnkpO1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5yb3VuZChjbGlwLndpZHRoICsgY2xpcC54IC0geCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5yb3VuZChjbGlwLmhlaWdodCArIGNsaXAueSAtIHkpO1xuICAgIHJldHVybiB7IC4uLmNsaXAsIHgsIHksIHdpZHRoLCBoZWlnaHQgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhZ2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IFRhc2tNYW5hZ2VyLCBXYWl0VGFzayB9IGZyb20gJy4uL2NvbW1vbi9XYWl0VGFzay5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlU3ltYm9sIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWFsbSB7XG4gICAgdGltZW91dFNldHRpbmdzO1xuICAgIHRhc2tNYW5hZ2VyID0gbmV3IFRhc2tNYW5hZ2VyKCk7XG4gICAgY29uc3RydWN0b3IodGltZW91dFNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMudGltZW91dFNldHRpbmdzID0gdGltZW91dFNldHRpbmdzO1xuICAgIH1cbiAgICBhc3luYyB3YWl0Rm9yRnVuY3Rpb24ocGFnZUZ1bmN0aW9uLCBvcHRpb25zID0ge30sIC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgeyBwb2xsaW5nID0gJ3JhZicsIHRpbWVvdXQgPSB0aGlzLnRpbWVvdXRTZXR0aW5ncy50aW1lb3V0KCksIHJvb3QsIHNpZ25hbCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmICh0eXBlb2YgcG9sbGluZyA9PT0gJ251bWJlcicgJiYgcG9sbGluZyA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBvbGwgd2l0aCBub24tcG9zaXRpdmUgaW50ZXJ2YWwnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3YWl0VGFzayA9IG5ldyBXYWl0VGFzayh0aGlzLCB7XG4gICAgICAgICAgICBwb2xsaW5nLFxuICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0sIHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0VGFzay5yZXN1bHQ7XG4gICAgfVxuICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VkO1xuICAgIH1cbiAgICAjZGlzcG9zZWQgPSBmYWxzZTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy4jZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnRhc2tNYW5hZ2VyLnRlcm1pbmF0ZUFsbChuZXcgRXJyb3IoJ3dhaXRGb3JGdW5jdGlvbiBmYWlsZWQ6IGZyYW1lIGdvdCBkZXRhY2hlZC4nKSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWxtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBUYXJnZXRUeXBlO1xuKGZ1bmN0aW9uIChUYXJnZXRUeXBlKSB7XG4gICAgVGFyZ2V0VHlwZVtcIlBBR0VcIl0gPSBcInBhZ2VcIjtcbiAgICBUYXJnZXRUeXBlW1wiQkFDS0dST1VORF9QQUdFXCJdID0gXCJiYWNrZ3JvdW5kX3BhZ2VcIjtcbiAgICBUYXJnZXRUeXBlW1wiU0VSVklDRV9XT1JLRVJcIl0gPSBcInNlcnZpY2Vfd29ya2VyXCI7XG4gICAgVGFyZ2V0VHlwZVtcIlNIQVJFRF9XT1JLRVJcIl0gPSBcInNoYXJlZF93b3JrZXJcIjtcbiAgICBUYXJnZXRUeXBlW1wiQlJPV1NFUlwiXSA9IFwiYnJvd3NlclwiO1xuICAgIFRhcmdldFR5cGVbXCJXRUJWSUVXXCJdID0gXCJ3ZWJ2aWV3XCI7XG4gICAgVGFyZ2V0VHlwZVtcIk9USEVSXCJdID0gXCJvdGhlclwiO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIFRhcmdldFR5cGVbXCJUQUJcIl0gPSBcInRhYlwiO1xufSkoVGFyZ2V0VHlwZSB8fCAoVGFyZ2V0VHlwZSA9IHt9KSk7XG4vKipcbiAqIFRhcmdldCByZXByZXNlbnRzIGFcbiAqIHtAbGluayBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvVGFyZ2V0LyB8IENEUCB0YXJnZXR9LlxuICogSW4gQ0RQIGEgdGFyZ2V0IGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBkZWJ1Z2dlZCBzdWNoIGEgZnJhbWUsIGEgcGFnZSBvciBhXG4gKiB3b3JrZXIuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXQge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHRhcmdldCBpcyBub3Qgb2YgdHlwZSBgXCJzZXJ2aWNlX3dvcmtlclwiYCBvciBgXCJzaGFyZWRfd29ya2VyXCJgLCByZXR1cm5zIGBudWxsYC5cbiAgICAgKi9cbiAgICBhc3luYyB3b3JrZXIoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgdGFyZ2V0IGlzIG5vdCBvZiB0eXBlIGBcInBhZ2VcImAsIGBcIndlYnZpZXdcImAgb3IgYFwiYmFja2dyb3VuZF9wYWdlXCJgLFxuICAgICAqIHJldHVybnMgYG51bGxgLlxuICAgICAqL1xuICAgIGFzeW5jIHBhZ2UoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhcmdldC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRPcGVyYXRpb24gfSBmcm9tICcuLi9jb21tb24vRXJyb3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgVGltZW91dFNldHRpbmdzIH0gZnJvbSAnLi4vY29tbW9uL1RpbWVvdXRTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYVxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfV29ya2Vyc19BUEkgfCBXZWJXb3JrZXJ9LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgZXZlbnRzIGB3b3JrZXJjcmVhdGVkYCBhbmQgYHdvcmtlcmRlc3Ryb3llZGAgYXJlIGVtaXR0ZWQgb24gdGhlIHBhZ2VcbiAqIG9iamVjdCB0byBzaWduYWwgdGhlIHdvcmtlciBsaWZlY3ljbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogcGFnZS5vbignd29ya2VyY3JlYXRlZCcsIHdvcmtlciA9PlxuICogICBjb25zb2xlLmxvZygnV29ya2VyIGNyZWF0ZWQ6ICcgKyB3b3JrZXIudXJsKCkpXG4gKiApO1xuICogcGFnZS5vbignd29ya2VyZGVzdHJveWVkJywgd29ya2VyID0+XG4gKiAgIGNvbnNvbGUubG9nKCdXb3JrZXIgZGVzdHJveWVkOiAnICsgd29ya2VyLnVybCgpKVxuICogKTtcbiAqXG4gKiBjb25zb2xlLmxvZygnQ3VycmVudCB3b3JrZXJzOicpO1xuICogZm9yIChjb25zdCB3b3JrZXIgb2YgcGFnZS53b3JrZXJzKCkpIHtcbiAqICAgY29uc29sZS5sb2coJyAgJyArIHdvcmtlci51cmwoKSk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJXb3JrZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRpbWVvdXRTZXR0aW5ncyA9IG5ldyBUaW1lb3V0U2V0dGluZ3MoKTtcbiAgICAjdXJsO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVybCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiN1cmwgPSB1cmw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgdGhpcyB3ZWIgd29ya2VyLlxuICAgICAqL1xuICAgIHVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3VybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZhbHVhdGVzIGEgZ2l2ZW4gZnVuY3Rpb24gaW4gdGhlIHtAbGluayBXZWJXb3JrZXIgfCB3b3JrZXJ9LlxuICAgICAqXG4gICAgICogQHJlbWFya3MgSWYgdGhlIGdpdmVuIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlLFxuICAgICAqIHtAbGluayBXZWJXb3JrZXIuZXZhbHVhdGUgfCBldmFsdWF0ZX0gd2lsbCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0byByZXNvbHZlLlxuICAgICAqXG4gICAgICogQXMgYSBydWxlIG9mIHRodW1iLCBpZiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBtb3JlXG4gICAgICogY29tcGxpY2F0ZWQgdGhhbiBhIEpTT04gb2JqZWN0IChlLmcuIG1vc3QgY2xhc3NlcyksIHRoZW5cbiAgICAgKiB7QGxpbmsgV2ViV29ya2VyLmV2YWx1YXRlIHwgZXZhbHVhdGV9IHdpbGwgX2xpa2VseV8gcmV0dXJuIHNvbWUgdHJ1bmNhdGVkXG4gICAgICogdmFsdWUgKG9yIGB7fWApLiBUaGlzIGlzIGJlY2F1c2Ugd2UgYXJlIG5vdCByZXR1cm5pbmcgdGhlIGFjdHVhbCByZXR1cm5cbiAgICAgKiB2YWx1ZSwgYnV0IGEgZGVzZXJpYWxpemVkIHZlcnNpb24gYXMgYSByZXN1bHQgb2YgdHJhbnNmZXJyaW5nIHRoZSByZXR1cm5cbiAgICAgKiB2YWx1ZSB0aHJvdWdoIGEgcHJvdG9jb2wgdG8gUHVwcGV0ZWVyLlxuICAgICAqXG4gICAgICogSW4gZ2VuZXJhbCwgeW91IHNob3VsZCB1c2VcbiAgICAgKiB7QGxpbmsgV2ViV29ya2VyLmV2YWx1YXRlSGFuZGxlIHwgZXZhbHVhdGVIYW5kbGV9IGlmXG4gICAgICoge0BsaW5rIFdlYldvcmtlci5ldmFsdWF0ZSB8IGV2YWx1YXRlfSBjYW5ub3Qgc2VyaWFsaXplIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgKiBwcm9wZXJseSBvciB5b3UgbmVlZCBhIG11dGFibGUge0BsaW5rIEpTSGFuZGxlIHwgaGFuZGxlfSB0byB0aGUgcmV0dXJuXG4gICAgICogb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZ1bmMgLSBGdW5jdGlvbiB0byBiZSBldmFsdWF0ZWQuXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBcmd1bWVudHMgdG8gcGFzcyBpbnRvIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAgICAgKi9cbiAgICBhc3luYyBldmFsdWF0ZShmdW5jLCAuLi5hcmdzKSB7XG4gICAgICAgIGZ1bmMgPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGUubmFtZSwgZnVuYyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5SZWFsbSgpLmV2YWx1YXRlKGZ1bmMsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmFsdWF0ZXMgYSBnaXZlbiBmdW5jdGlvbiBpbiB0aGUge0BsaW5rIFdlYldvcmtlciB8IHdvcmtlcn0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBJZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UsXG4gICAgICoge0BsaW5rIFdlYldvcmtlci5ldmFsdWF0ZSB8IGV2YWx1YXRlfSB3aWxsIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvIHJlc29sdmUuXG4gICAgICpcbiAgICAgKiBJbiBnZW5lcmFsLCB5b3Ugc2hvdWxkIHVzZVxuICAgICAqIHtAbGluayBXZWJXb3JrZXIuZXZhbHVhdGVIYW5kbGUgfCBldmFsdWF0ZUhhbmRsZX0gaWZcbiAgICAgKiB7QGxpbmsgV2ViV29ya2VyLmV2YWx1YXRlIHwgZXZhbHVhdGV9IGNhbm5vdCBzZXJpYWxpemUgdGhlIHJldHVybiB2YWx1ZVxuICAgICAqIHByb3Blcmx5IG9yIHlvdSBuZWVkIGEgbXV0YWJsZSB7QGxpbmsgSlNIYW5kbGUgfCBoYW5kbGV9IHRvIHRoZSByZXR1cm5cbiAgICAgKiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZnVuYyAtIEZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyB0byBwYXNzIGludG8gYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIEEge0BsaW5rIEpTSGFuZGxlIHwgaGFuZGxlfSB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIGBmdW5jYC5cbiAgICAgKi9cbiAgICBhc3luYyBldmFsdWF0ZUhhbmRsZShmdW5jLCAuLi5hcmdzKSB7XG4gICAgICAgIGZ1bmMgPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgZnVuYyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5SZWFsbSgpLmV2YWx1YXRlSGFuZGxlKGZ1bmMsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uKCdXZWJXb3JrZXIuY2xvc2UoKSBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViV29ya2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL0Jyb3dzZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Ccm93c2VyQ29udGV4dC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0NEUFNlc3Npb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9EaWFsb2cuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9FbGVtZW50SGFuZGxlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRW52aXJvbm1lbnQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9GcmFtZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0hUVFBSZXF1ZXN0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSFRUUFJlc3BvbnNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSW5wdXQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1BhZ2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9SZWFsbS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1RhcmdldC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1dlYldvcmtlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2xvY2F0b3JzL2xvY2F0b3JzLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFwaS5qcy5tYXAiLCJ2YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xuaW1wb3J0IHsgRU1QVFksIGNhdGNoRXJyb3IsIGRlZmF1bHRJZkVtcHR5LCBkZWZlciwgZmlsdGVyLCBmaXJzdCwgZmlyc3RWYWx1ZUZyb20sIGZyb20sIGlkZW50aXR5LCBpZ25vcmVFbGVtZW50cywgbWFwLCBtZXJnZSwgbWVyZ2VNYXAsIG5vb3AsIHBpcGUsIHJhY2UsIHJhY2VXaXRoLCByZXRyeSwgdGFwLCB0aHJvd0lmRW1wdHksIH0gZnJvbSAnLi4vLi4vLi4vdGhpcmRfcGFydHkvcnhqcy9yeGpzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgZnJvbUFib3J0U2lnbmFsLCB0aW1lb3V0IH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWwuanMnO1xuLyoqXG4gKiBBbGwgdGhlIGV2ZW50cyB0aGF0IGEgbG9jYXRvciBpbnN0YW5jZSBtYXkgZW1pdC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRvckV2ZW50O1xuKGZ1bmN0aW9uIChMb2NhdG9yRXZlbnQpIHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGV2ZXJ5IHRpbWUgYmVmb3JlIHRoZSBsb2NhdG9yIHBlcmZvcm1zIGFuIGFjdGlvbiBvbiB0aGUgbG9jYXRlZCBlbGVtZW50KHMpLlxuICAgICAqL1xuICAgIExvY2F0b3JFdmVudFtcIkFjdGlvblwiXSA9IFwiYWN0aW9uXCI7XG59KShMb2NhdG9yRXZlbnQgfHwgKExvY2F0b3JFdmVudCA9IHt9KSk7XG4vKipcbiAqIExvY2F0b3JzIGRlc2NyaWJlIGEgc3RyYXRlZ3kgb2YgbG9jYXRpbmcgb2JqZWN0cyBhbmQgcGVyZm9ybWluZyBhbiBhY3Rpb24gb25cbiAqIHRoZW0uIElmIHRoZSBhY3Rpb24gZmFpbHMgYmVjYXVzZSB0aGUgb2JqZWN0IGlzIG5vdCByZWFkeSBmb3IgdGhlIGFjdGlvbiwgdGhlXG4gKiB3aG9sZSBvcGVyYXRpb24gaXMgcmV0cmllZC4gVmFyaW91cyBwcmVjb25kaXRpb25zIGZvciBhIHN1Y2Nlc3NmdWwgYWN0aW9uIGFyZVxuICogY2hlY2tlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjbG9jYXRvcnN9IGZvciBkZXRhaWxzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIExvY2F0b3IgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByYWNlIGJldHdlZW4gbXVsdGlwbGUgbG9jYXRvcnMgdHJ5aW5nIHRvIGxvY2F0ZSBlbGVtZW50cyBpblxuICAgICAqIHBhcmFsbGVsIGJ1dCBlbnN1cmVzIHRoYXQgb25seSBhIHNpbmdsZSBlbGVtZW50IHJlY2VpdmVzIHRoZSBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgc3RhdGljIHJhY2UobG9jYXRvcnMpIHtcbiAgICAgICAgcmV0dXJuIFJhY2VMb2NhdG9yLmNyZWF0ZShsb2NhdG9ycyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHZpc2liaWxpdHkgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF90aW1lb3V0ID0gMzAwMDA7XG4gICAgI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQgPSB0cnVlO1xuICAgICN3YWl0Rm9yRW5hYmxlZCA9IHRydWU7XG4gICAgI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveCA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgb3BlcmF0b3JzID0ge1xuICAgICAgICBjb25kaXRpb25zOiAoY29uZGl0aW9ucywgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VNYXAoKGhhbmRsZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZSguLi5jb25kaXRpb25zLm1hcChjb25kaXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uKGhhbmRsZSwgc2lnbmFsKTtcbiAgICAgICAgICAgICAgICB9KSkucGlwZShkZWZhdWx0SWZFbXB0eShoYW5kbGUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZXRyeUFuZFJhY2VXaXRoU2lnbmFsQW5kVGltZXI6IChzaWduYWwsIGNhdXNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gW107XG4gICAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKGZyb21BYm9ydFNpZ25hbChzaWduYWwsIGNhdXNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2godGltZW91dCh0aGlzLl90aW1lb3V0LCBjYXVzZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHBpcGUocmV0cnkoeyBkZWxheTogUkVUUllfREVMQVkgfSksIHJhY2VXaXRoKC4uLmNhbmRpZGF0ZXMpKTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIC8vIERldGVybWluZXMgd2hlbiB0aGUgbG9jYXRvciB3aWxsIHRpbWVvdXQgZm9yIGFjdGlvbnMuXG4gICAgZ2V0IHRpbWVvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lb3V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGxvY2F0b3IgaW5zdGFuY2UgYnkgY2xvbmluZyB0aGUgY3VycmVudCBsb2NhdG9yIGFuZCBzZXR0aW5nXG4gICAgICogdGhlIHRvdGFsIHRpbWVvdXQgZm9yIHRoZSBsb2NhdG9yIGFjdGlvbnMuXG4gICAgICpcbiAgICAgKiBQYXNzIGAwYCB0byBkaXNhYmxlIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdFZhbHVlIGBQYWdlLmdldERlZmF1bHRUaW1lb3V0KClgXG4gICAgICovXG4gICAgc2V0VGltZW91dCh0aW1lb3V0KSB7XG4gICAgICAgIGNvbnN0IGxvY2F0b3IgPSB0aGlzLl9jbG9uZSgpO1xuICAgICAgICBsb2NhdG9yLl90aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgbG9jYXRvciBpbnN0YW5jZSBieSBjbG9uaW5nIHRoZSBjdXJyZW50IGxvY2F0b3Igd2l0aCB0aGVcbiAgICAgKiB2aXNpYmlsaXR5IHByb3BlcnR5IGNoYW5nZWQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBzZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpIHtcbiAgICAgICAgY29uc3QgbG9jYXRvciA9IHRoaXMuX2Nsb25lKCk7XG4gICAgICAgIGxvY2F0b3IudmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7XG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGxvY2F0b3IgaW5zdGFuY2UgYnkgY2xvbmluZyB0aGUgY3VycmVudCBsb2NhdG9yIGFuZFxuICAgICAqIHNwZWNpZnlpbmcgd2hldGhlciB0byB3YWl0IGZvciBpbnB1dCBlbGVtZW50cyB0byBiZWNvbWUgZW5hYmxlZCBiZWZvcmUgdGhlXG4gICAgICogYWN0aW9uLiBBcHBsaWNhYmxlIHRvIGBjbGlja2AgYW5kIGBmaWxsYCBhY3Rpb25zLlxuICAgICAqXG4gICAgICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWBcbiAgICAgKi9cbiAgICBzZXRXYWl0Rm9yRW5hYmxlZCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgbG9jYXRvci4jd2FpdEZvckVuYWJsZWQgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgbG9jYXRvciBpbnN0YW5jZSBieSBjbG9uaW5nIHRoZSBjdXJyZW50IGxvY2F0b3IgYW5kXG4gICAgICogc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBsb2NhdG9yIHNob3VsZCBzY3JvbGwgdGhlIGVsZW1lbnQgaW50byB2aWV3cG9ydCBpZlxuICAgICAqIGl0IGlzIG5vdCBpbiB0aGUgdmlld3BvcnQgYWxyZWFkeS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0VmFsdWUgYHRydWVgXG4gICAgICovXG4gICAgc2V0RW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgbG9jYXRvci4jZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBsb2NhdG9yIGluc3RhbmNlIGJ5IGNsb25pbmcgdGhlIGN1cnJlbnQgbG9jYXRvciBhbmRcbiAgICAgKiBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGxvY2F0b3IgaGFzIHRvIHdhaXQgZm9yIHRoZSBlbGVtZW50J3MgYm91bmRpbmcgYm94XG4gICAgICogdG8gYmUgc2FtZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBhbmltYXRpb24gZnJhbWVzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWBcbiAgICAgKi9cbiAgICBzZXRXYWl0Rm9yU3RhYmxlQm91bmRpbmdCb3godmFsdWUpIHtcbiAgICAgICAgY29uc3QgbG9jYXRvciA9IHRoaXMuX2Nsb25lKCk7XG4gICAgICAgIGxvY2F0b3IuI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29weU9wdGlvbnMobG9jYXRvcikge1xuICAgICAgICB0aGlzLl90aW1lb3V0ID0gbG9jYXRvci5fdGltZW91dDtcbiAgICAgICAgdGhpcy52aXNpYmlsaXR5ID0gbG9jYXRvci52aXNpYmlsaXR5O1xuICAgICAgICB0aGlzLiN3YWl0Rm9yRW5hYmxlZCA9IGxvY2F0b3IuI3dhaXRGb3JFbmFibGVkO1xuICAgICAgICB0aGlzLiNlbnN1cmVFbGVtZW50SXNJblRoZVZpZXdwb3J0ID0gbG9jYXRvci4jZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydDtcbiAgICAgICAgdGhpcy4jd2FpdEZvclN0YWJsZUJvdW5kaW5nQm94ID0gbG9jYXRvci4jd2FpdEZvclN0YWJsZUJvdW5kaW5nQm94O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVsZW1lbnQgaGFzIGEgXCJkaXNhYmxlZFwiIHByb3BlcnR5LCB3YWl0IGZvciB0aGUgZWxlbWVudCB0byBiZVxuICAgICAqIGVuYWJsZWQuXG4gICAgICovXG4gICAgI3dhaXRGb3JFbmFibGVkSWZOZWVkZWQgPSAoaGFuZGxlLCBzaWduYWwpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLiN3YWl0Rm9yRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcm9tKGhhbmRsZS5mcmFtZS53YWl0Rm9yRnVuY3Rpb24oZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc05hdGl2ZUZvcm1Db250cm9sID0gW1xuICAgICAgICAgICAgICAgICdCVVRUT04nLFxuICAgICAgICAgICAgICAgICdJTlBVVCcsXG4gICAgICAgICAgICAgICAgJ1NFTEVDVCcsXG4gICAgICAgICAgICAgICAgJ1RFWFRBUkVBJyxcbiAgICAgICAgICAgICAgICAnT1BUSU9OJyxcbiAgICAgICAgICAgICAgICAnT1BUR1JPVVAnLFxuICAgICAgICAgICAgXS5pbmNsdWRlcyhlbGVtZW50Lm5vZGVOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiAhaXNOYXRpdmVGb3JtQ29udHJvbCB8fCAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHRpbWVvdXQ6IHRoaXMuX3RpbWVvdXQsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0sIGhhbmRsZSkpLnBpcGUoaWdub3JlRWxlbWVudHMoKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBlbGVtZW50IGZvciB0d28gY29uc2VjdXRpdmUgYW5pbWF0aW9uXG4gICAgICogZnJhbWVzIGFuZCB3YWl0cyB0aWxsIHRoZXkgYXJlIHRoZSBzYW1lLlxuICAgICAqL1xuICAgICN3YWl0Rm9yU3RhYmxlQm91bmRpbmdCb3hJZk5lZWRlZCA9IChoYW5kbGUpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLiN3YWl0Rm9yU3RhYmxlQm91bmRpbmdCb3gpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgLy8gTm90ZSB3ZSBkb24ndCB1c2Ugd2FpdEZvckZ1bmN0aW9uIGJlY2F1c2UgdGhhdCByZWxpZXMgb24gUkFGLlxuICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0MSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0MiA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHJlY3QxLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiByZWN0MS55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHJlY3QxLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZWN0MS5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHJlY3QyLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiByZWN0Mi55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHJlY3QyLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZWN0Mi5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pLnBpcGUoZmlyc3QoKFtyZWN0MSwgcmVjdDJdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKHJlY3QxLnggPT09IHJlY3QyLnggJiZcbiAgICAgICAgICAgICAgICByZWN0MS55ID09PSByZWN0Mi55ICYmXG4gICAgICAgICAgICAgICAgcmVjdDEud2lkdGggPT09IHJlY3QyLndpZHRoICYmXG4gICAgICAgICAgICAgICAgcmVjdDEuaGVpZ2h0ID09PSByZWN0Mi5oZWlnaHQpO1xuICAgICAgICB9KSwgcmV0cnkoeyBkZWxheTogUkVUUllfREVMQVkgfSksIGlnbm9yZUVsZW1lbnRzKCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSB2aWV3cG9ydCBhbmQgYXV0by1zY3JvbGxzIGl0IGlmIGl0IGlzIG5vdC5cbiAgICAgKi9cbiAgICAjZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydElmTmVlZGVkID0gKGhhbmRsZSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuaXNJbnRlcnNlY3RpbmdWaWV3cG9ydCh7IHRocmVzaG9sZDogMCB9KSkucGlwZShmaWx0ZXIoaXNJbnRlcnNlY3RpbmdWaWV3cG9ydCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIWlzSW50ZXJzZWN0aW5nVmlld3BvcnQ7XG4gICAgICAgIH0pLCBtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIH0pLCBtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tKGhhbmRsZS5pc0ludGVyc2VjdGluZ1ZpZXdwb3J0KHsgdGhyZXNob2xkOiAwIH0pKTtcbiAgICAgICAgICAgIH0pLnBpcGUoZmlyc3QoaWRlbnRpdHkpLCByZXRyeSh7IGRlbGF5OiBSRVRSWV9ERUxBWSB9KSwgaWdub3JlRWxlbWVudHMoKSk7XG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgICNjbGljayhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICAgICAgY29uc3QgY2F1c2UgPSBuZXcgRXJyb3IoJ0xvY2F0b3IuY2xpY2snKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhaXQob3B0aW9ucykucGlwZSh0aGlzLm9wZXJhdG9ycy5jb25kaXRpb25zKFtcbiAgICAgICAgICAgIHRoaXMuI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnRJZk5lZWRlZCxcbiAgICAgICAgICAgIHRoaXMuI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveElmTmVlZGVkLFxuICAgICAgICAgICAgdGhpcy4jd2FpdEZvckVuYWJsZWRJZk5lZWRlZCxcbiAgICAgICAgXSwgc2lnbmFsKSwgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoTG9jYXRvckV2ZW50LkFjdGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSksIG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuY2xpY2sob3B0aW9ucykpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgaGFuZGxlLmRpc3Bvc2UoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pLCB0aGlzLm9wZXJhdG9ycy5yZXRyeUFuZFJhY2VXaXRoU2lnbmFsQW5kVGltZXIoc2lnbmFsLCBjYXVzZSkpO1xuICAgIH1cbiAgICAjZmlsbCh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gbmV3IEVycm9yKCdMb2NhdG9yLmZpbGwnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhaXQob3B0aW9ucykucGlwZSh0aGlzLm9wZXJhdG9ycy5jb25kaXRpb25zKFtcbiAgICAgICAgICAgIHRoaXMuI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnRJZk5lZWRlZCxcbiAgICAgICAgICAgIHRoaXMuI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveElmTmVlZGVkLFxuICAgICAgICAgICAgdGhpcy4jd2FpdEZvckVuYWJsZWRJZk5lZWRlZCxcbiAgICAgICAgXSwgc2lnbmFsKSwgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoTG9jYXRvckV2ZW50LkFjdGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSksIG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuZXZhbHVhdGUoZWwgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnc2VsZWN0JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3R5cGVhYmxlLWlucHV0JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3IFNldChbXG4gICAgICAgICAgICAgICAgICAgICAgICAndGV4dGFyZWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAndGVsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzZWFyY2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2VtYWlsJyxcbiAgICAgICAgICAgICAgICAgICAgXSkuaGFzKGVsLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3R5cGVhYmxlLWlucHV0JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnb3RoZXItaW5wdXQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbnRlbnRlZGl0YWJsZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAndW5rbm93bic7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAucGlwZShtZXJnZU1hcChpbnB1dFR5cGUgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5wdXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuc2VsZWN0KHZhbHVlKS50aGVuKG5vb3ApKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29udGVudGVkaXRhYmxlJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndHlwZWFibGUtaW5wdXQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKChpbnB1dCwgbmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBpbnB1dC5pc0NvbnRlbnRFZGl0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmlubmVyVGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlucHV0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBpbnB1dCBpZiB0aGUgY3VycmVudCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gY3VycmVudFZhbHVlLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmV3VmFsdWUuc3RhcnRzV2l0aChpbnB1dC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5pbm5lclRleHQgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gaW5wdXQuaXNDb250ZW50RWRpdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5pbm5lclRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgcGFydGlhbGx5IGZpbGxlZCBvdXQsIG9ubHkgdHlwZSB0aGUgcmVzdC4gTW92ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBjb21tb24gcHJlZml4LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5pbm5lclRleHQgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuaW5uZXJUZXh0ID0gb3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gb3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlLnN1YnN0cmluZyhvcmlnaW5hbFZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB2YWx1ZSkpLnBpcGUobWVyZ2VNYXAodGV4dFRvVHlwZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLnR5cGUodGV4dFRvVHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdvdGhlci1pbnB1dCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuZm9jdXMoKSkucGlwZShtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKChpbnB1dCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndW5rbm93bic6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY2Fubm90IGJlIGZpbGxlZCBvdXQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgaGFuZGxlLmRpc3Bvc2UoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pLCB0aGlzLm9wZXJhdG9ycy5yZXRyeUFuZFJhY2VXaXRoU2lnbmFsQW5kVGltZXIoc2lnbmFsLCBjYXVzZSkpO1xuICAgIH1cbiAgICAjaG92ZXIob3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gbmV3IEVycm9yKCdMb2NhdG9yLmhvdmVyJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl93YWl0KG9wdGlvbnMpLnBpcGUodGhpcy5vcGVyYXRvcnMuY29uZGl0aW9ucyhbXG4gICAgICAgICAgICB0aGlzLiNlbnN1cmVFbGVtZW50SXNJblRoZVZpZXdwb3J0SWZOZWVkZWQsXG4gICAgICAgICAgICB0aGlzLiN3YWl0Rm9yU3RhYmxlQm91bmRpbmdCb3hJZk5lZWRlZCxcbiAgICAgICAgXSwgc2lnbmFsKSwgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoTG9jYXRvckV2ZW50LkFjdGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSksIG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuaG92ZXIoKSkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBoYW5kbGUuZGlzcG9zZSgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSksIHRoaXMub3BlcmF0b3JzLnJldHJ5QW5kUmFjZVdpdGhTaWduYWxBbmRUaW1lcihzaWduYWwsIGNhdXNlKSk7XG4gICAgfVxuICAgICNzY3JvbGwob3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gbmV3IEVycm9yKCdMb2NhdG9yLnNjcm9sbCcpO1xuICAgICAgICByZXR1cm4gdGhpcy5fd2FpdChvcHRpb25zKS5waXBlKHRoaXMub3BlcmF0b3JzLmNvbmRpdGlvbnMoW1xuICAgICAgICAgICAgdGhpcy4jZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydElmTmVlZGVkLFxuICAgICAgICAgICAgdGhpcy4jd2FpdEZvclN0YWJsZUJvdW5kaW5nQm94SWZOZWVkZWQsXG4gICAgICAgIF0sIHNpZ25hbCksIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KExvY2F0b3JFdmVudC5BY3Rpb24sIHVuZGVmaW5lZCk7XG4gICAgICAgIH0pLCBtZXJnZU1hcChoYW5kbGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKChlbCwgc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbFRvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbExlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBlbC5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBvcHRpb25zPy5zY3JvbGxUb3AsIG9wdGlvbnM/LnNjcm9sbExlZnQpKS5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICB2b2lkIGhhbmRsZS5kaXNwb3NlKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSwgdGhpcy5vcGVyYXRvcnMucmV0cnlBbmRSYWNlV2l0aFNpZ25hbEFuZFRpbWVyKHNpZ25hbCwgY2F1c2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvbmVzIHRoZSBsb2NhdG9yLlxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvbmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgZm9yIHRoZSBsb2NhdG9yIHRvIGdldCBhIGhhbmRsZSBmcm9tIHRoZSBwYWdlLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGFzeW5jIHdhaXRIYW5kbGUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBjYXVzZSA9IG5ldyBFcnJvcignTG9jYXRvci53YWl0SGFuZGxlJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl93YWl0KG9wdGlvbnMpLnBpcGUodGhpcy5vcGVyYXRvcnMucmV0cnlBbmRSYWNlV2l0aFNpZ25hbEFuZFRpbWVyKG9wdGlvbnM/LnNpZ25hbCwgY2F1c2UpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdhaXRzIGZvciB0aGUgbG9jYXRvciB0byBnZXQgdGhlIHNlcmlhbGl6ZWQgdmFsdWUgZnJvbSB0aGUgcGFnZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhpcyByZXF1aXJlcyB0aGUgdmFsdWUgdG8gYmUgSlNPTi1zZXJpYWxpemFibGUuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgYXN5bmMgd2FpdChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHRoaXMud2FpdEhhbmRsZShvcHRpb25zKSwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZS5qc29uVmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFwcyB0aGUgbG9jYXRvciB1c2luZyB0aGUgcHJvdmlkZWQgbWFwcGVyLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIG1hcChtYXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBwZWRMb2NhdG9yKHRoaXMuX2Nsb25lKCksIGhhbmRsZSA9PiB7XG4gICAgICAgICAgICAvLyBTQUZFVFk6IFR5cGVTY3JpcHQgY2Fubm90IGRlZHVjZSB0aGUgdHlwZS5cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGUuZXZhbHVhdGVIYW5kbGUobWFwcGVyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gZXhwZWN0YXRpb24gdGhhdCBpcyBldmFsdWF0ZWQgYWdhaW5zdCBsb2NhdGVkIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBleHBlY3RhdGlvbnMgZG8gbm90IG1hdGNoLCB0aGVuIHRoZSBsb2NhdG9yIHdpbGwgcmV0cnkuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgZmlsdGVyKHByZWRpY2F0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZpbHRlcmVkTG9jYXRvcih0aGlzLl9jbG9uZSgpLCBhc3luYyAoaGFuZGxlLCBzaWduYWwpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZS5mcmFtZS53YWl0Rm9yRnVuY3Rpb24ocHJlZGljYXRlLCB7IHNpZ25hbCwgdGltZW91dDogdGhpcy5fdGltZW91dCB9LCBoYW5kbGUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGV4cGVjdGF0aW9uIHRoYXQgaXMgZXZhbHVhdGVkIGFnYWluc3QgbG9jYXRlZCBoYW5kbGVzLlxuICAgICAqXG4gICAgICogSWYgdGhlIGV4cGVjdGF0aW9ucyBkbyBub3QgbWF0Y2gsIHRoZW4gdGhlIGxvY2F0b3Igd2lsbCByZXRyeS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGZpbHRlckhhbmRsZShwcmVkaWNhdGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJlZExvY2F0b3IodGhpcy5fY2xvbmUoKSwgcHJlZGljYXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFwcyB0aGUgbG9jYXRvciB1c2luZyB0aGUgcHJvdmlkZWQgbWFwcGVyLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgbWFwSGFuZGxlKG1hcHBlcikge1xuICAgICAgICByZXR1cm4gbmV3IE1hcHBlZExvY2F0b3IodGhpcy5fY2xvbmUoKSwgbWFwcGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xpY2tzIHRoZSBsb2NhdGVkIGVsZW1lbnQuXG4gICAgICovXG4gICAgY2xpY2sob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy4jY2xpY2sob3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaWxscyBvdXQgdGhlIGlucHV0IGlkZW50aWZpZWQgYnkgdGhlIGxvY2F0b3IgdXNpbmcgdGhlIHByb3ZpZGVkIHZhbHVlLiBUaGVcbiAgICAgKiB0eXBlIG9mIHRoZSBpbnB1dCBpcyBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUgYW5kIHRoZSBhcHByb3ByaWF0ZSBmaWxsLW91dFxuICAgICAqIG1ldGhvZCBpcyBjaG9zZW4gYmFzZWQgb24gdGhlIHR5cGUuIGBjb250ZW50ZWRpdGFibGVgLCBzZWxlY3QsIHRleHRhcmVhIGFuZFxuICAgICAqIGlucHV0IGVsZW1lbnRzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICovXG4gICAgZmlsbCh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy4jZmlsbCh2YWx1ZSwgb3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIb3ZlcnMgb3ZlciB0aGUgbG9jYXRlZCBlbGVtZW50LlxuICAgICAqL1xuICAgIGhvdmVyKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuI2hvdmVyKG9wdGlvbnMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2Nyb2xscyB0aGUgbG9jYXRlZCBlbGVtZW50LlxuICAgICAqL1xuICAgIHNjcm9sbChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLiNzY3JvbGwob3B0aW9ucykpO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBGdW5jdGlvbkxvY2F0b3IgZXh0ZW5kcyBMb2NhdG9yIHtcbiAgICBzdGF0aWMgY3JlYXRlKHBhZ2VPckZyYW1lLCBmdW5jKSB7XG4gICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25Mb2NhdG9yKHBhZ2VPckZyYW1lLCBmdW5jKS5zZXRUaW1lb3V0KCdnZXREZWZhdWx0VGltZW91dCcgaW4gcGFnZU9yRnJhbWVcbiAgICAgICAgICAgID8gcGFnZU9yRnJhbWUuZ2V0RGVmYXVsdFRpbWVvdXQoKVxuICAgICAgICAgICAgOiBwYWdlT3JGcmFtZS5wYWdlKCkuZ2V0RGVmYXVsdFRpbWVvdXQoKSk7XG4gICAgfVxuICAgICNwYWdlT3JGcmFtZTtcbiAgICAjZnVuYztcbiAgICBjb25zdHJ1Y3RvcihwYWdlT3JGcmFtZSwgZnVuYykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNwYWdlT3JGcmFtZSA9IHBhZ2VPckZyYW1lO1xuICAgICAgICB0aGlzLiNmdW5jID0gZnVuYztcbiAgICB9XG4gICAgX2Nsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uTG9jYXRvcih0aGlzLiNwYWdlT3JGcmFtZSwgdGhpcy4jZnVuYyk7XG4gICAgfVxuICAgIF93YWl0KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZyb20odGhpcy4jcGFnZU9yRnJhbWUud2FpdEZvckZ1bmN0aW9uKHRoaXMuI2Z1bmMsIHtcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiB0aGlzLnRpbWVvdXQsXG4gICAgICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KS5waXBlKHRocm93SWZFbXB0eSgpKTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRGVsZWdhdGVkTG9jYXRvciBleHRlbmRzIExvY2F0b3Ige1xuICAgICNkZWxlZ2F0ZTtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNkZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgICAgICB0aGlzLmNvcHlPcHRpb25zKHRoaXMuI2RlbGVnYXRlKTtcbiAgICB9XG4gICAgZ2V0IGRlbGVnYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGVsZWdhdGU7XG4gICAgfVxuICAgIHNldFRpbWVvdXQodGltZW91dCkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gc3VwZXIuc2V0VGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgbG9jYXRvci4jZGVsZWdhdGUgPSB0aGlzLiNkZWxlZ2F0ZS5zZXRUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KSB7XG4gICAgICAgIGNvbnN0IGxvY2F0b3IgPSBzdXBlci5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IGxvY2F0b3IuI2RlbGVnYXRlLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7XG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgIH1cbiAgICBzZXRXYWl0Rm9yRW5hYmxlZCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gc3VwZXIuc2V0V2FpdEZvckVuYWJsZWQodmFsdWUpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IHRoaXMuI2RlbGVnYXRlLnNldFdhaXRGb3JFbmFibGVkKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XG4gICAgfVxuICAgIHNldEVuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbG9jYXRvciA9IHN1cGVyLnNldEVuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQodmFsdWUpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IHRoaXMuI2RlbGVnYXRlLnNldEVuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQodmFsdWUpO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgc2V0V2FpdEZvclN0YWJsZUJvdW5kaW5nQm94KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0b3IgPSBzdXBlci5zZXRXYWl0Rm9yU3RhYmxlQm91bmRpbmdCb3godmFsdWUpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IHRoaXMuI2RlbGVnYXRlLnNldFdhaXRGb3JTdGFibGVCb3VuZGluZ0JveCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWx0ZXJlZExvY2F0b3IgZXh0ZW5kcyBEZWxlZ2F0ZWRMb2NhdG9yIHtcbiAgICAjcHJlZGljYXRlO1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIHByZWRpY2F0ZSkge1xuICAgICAgICBzdXBlcihiYXNlKTtcbiAgICAgICAgdGhpcy4jcHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgIH1cbiAgICBfY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmlsdGVyZWRMb2NhdG9yKHRoaXMuZGVsZWdhdGUuY2xvbmUoKSwgdGhpcy4jcHJlZGljYXRlKS5jb3B5T3B0aW9ucyh0aGlzKTtcbiAgICB9XG4gICAgX3dhaXQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5fd2FpdChvcHRpb25zKS5waXBlKG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUodGhpcy4jcHJlZGljYXRlKGhhbmRsZSwgb3B0aW9ucz8uc2lnbmFsKSkpLnBpcGUoZmlsdGVyKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9KSwgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTQUZFVFk6IEl0IHBhc3NlZCB0aGUgcHJlZGljYXRlLCBzbyB0aGlzIGlzIGNvcnJlY3QuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSksIHRocm93SWZFbXB0eSgpKTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTWFwcGVkTG9jYXRvciBleHRlbmRzIERlbGVnYXRlZExvY2F0b3Ige1xuICAgICNtYXBwZXI7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgbWFwcGVyKSB7XG4gICAgICAgIHN1cGVyKGJhc2UpO1xuICAgICAgICB0aGlzLiNtYXBwZXIgPSBtYXBwZXI7XG4gICAgfVxuICAgIF9jbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBwZWRMb2NhdG9yKHRoaXMuZGVsZWdhdGUuY2xvbmUoKSwgdGhpcy4jbWFwcGVyKS5jb3B5T3B0aW9ucyh0aGlzKTtcbiAgICB9XG4gICAgX3dhaXQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5fd2FpdChvcHRpb25zKS5waXBlKG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUodGhpcy4jbWFwcGVyKGhhbmRsZSwgb3B0aW9ucz8uc2lnbmFsKSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE5vZGVMb2NhdG9yIGV4dGVuZHMgTG9jYXRvciB7XG4gICAgc3RhdGljIGNyZWF0ZShwYWdlT3JGcmFtZSwgc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlTG9jYXRvcihwYWdlT3JGcmFtZSwgc2VsZWN0b3IpLnNldFRpbWVvdXQoJ2dldERlZmF1bHRUaW1lb3V0JyBpbiBwYWdlT3JGcmFtZVxuICAgICAgICAgICAgPyBwYWdlT3JGcmFtZS5nZXREZWZhdWx0VGltZW91dCgpXG4gICAgICAgICAgICA6IHBhZ2VPckZyYW1lLnBhZ2UoKS5nZXREZWZhdWx0VGltZW91dCgpKTtcbiAgICB9XG4gICAgI3BhZ2VPckZyYW1lO1xuICAgICNzZWxlY3RvcjtcbiAgICBjb25zdHJ1Y3RvcihwYWdlT3JGcmFtZSwgc2VsZWN0b3IpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jcGFnZU9yRnJhbWUgPSBwYWdlT3JGcmFtZTtcbiAgICAgICAgdGhpcy4jc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgZm9yIHRoZSBlbGVtZW50IHRvIGJlY29tZSB2aXNpYmxlIG9yIGhpZGRlbi4gdmlzaWJpbGl0eSA9PT0gJ3Zpc2libGUnXG4gICAgICogbWVhbnMgdGhhdCB0aGUgZWxlbWVudCBoYXMgYSBjb21wdXRlZCBzdHlsZSwgdGhlIHZpc2liaWxpdHkgcHJvcGVydHkgb3RoZXJcbiAgICAgKiB0aGFuICdoaWRkZW4nIG9yICdjb2xsYXBzZScgYW5kIG5vbi1lbXB0eSBib3VuZGluZyBib3guIHZpc2liaWxpdHkgPT09XG4gICAgICogJ2hpZGRlbicgbWVhbnMgdGhlIG9wcG9zaXRlIG9mIHRoYXQuXG4gICAgICovXG4gICAgI3dhaXRGb3JWaXNpYmlsaXR5SWZOZWVkZWQgPSAoaGFuZGxlKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgoKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuaXNIaWRkZW4oKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3Zpc2libGUnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmlzVmlzaWJsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCkucGlwZShmaXJzdChpZGVudGl0eSksIHJldHJ5KHsgZGVsYXk6IFJFVFJZX0RFTEFZIH0pLCBpZ25vcmVFbGVtZW50cygpKTtcbiAgICB9O1xuICAgIF9jbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlTG9jYXRvcih0aGlzLiNwYWdlT3JGcmFtZSwgdGhpcy4jc2VsZWN0b3IpLmNvcHlPcHRpb25zKHRoaXMpO1xuICAgIH1cbiAgICBfd2FpdChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICAgICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMuI3BhZ2VPckZyYW1lLndhaXRGb3JTZWxlY3Rvcih0aGlzLiNzZWxlY3Rvciwge1xuICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IHRoaXMuX3RpbWVvdXQsXG4gICAgICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KS5waXBlKGZpbHRlcigodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbDtcbiAgICAgICAgfSksIHRocm93SWZFbXB0eSgpLCB0aGlzLm9wZXJhdG9ycy5jb25kaXRpb25zKFt0aGlzLiN3YWl0Rm9yVmlzaWJpbGl0eUlmTmVlZGVkXSwgc2lnbmFsKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tMb2NhdG9yQXJyYXkobG9jYXRvcnMpIHtcbiAgICBmb3IgKGNvbnN0IGxvY2F0b3Igb2YgbG9jYXRvcnMpIHtcbiAgICAgICAgaWYgKCEobG9jYXRvciBpbnN0YW5jZW9mIExvY2F0b3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbG9jYXRvciBmb3IgcmFjZSBjYW5kaWRhdGUnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbG9jYXRvcnM7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgUmFjZUxvY2F0b3IgZXh0ZW5kcyBMb2NhdG9yIHtcbiAgICBzdGF0aWMgY3JlYXRlKGxvY2F0b3JzKSB7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gY2hlY2tMb2NhdG9yQXJyYXkobG9jYXRvcnMpO1xuICAgICAgICByZXR1cm4gbmV3IFJhY2VMb2NhdG9yKGFycmF5KTtcbiAgICB9XG4gICAgI2xvY2F0b3JzO1xuICAgIGNvbnN0cnVjdG9yKGxvY2F0b3JzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2xvY2F0b3JzID0gbG9jYXRvcnM7XG4gICAgfVxuICAgIF9jbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYWNlTG9jYXRvcih0aGlzLiNsb2NhdG9ycy5tYXAobG9jYXRvciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvci5jbG9uZSgpO1xuICAgICAgICB9KSkuY29weU9wdGlvbnModGhpcyk7XG4gICAgfVxuICAgIF93YWl0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHJhY2UoLi4udGhpcy4jbG9jYXRvcnMubWFwKGxvY2F0b3IgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3IuX3dhaXQob3B0aW9ucyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG4vKipcbiAqIEZvciBvYnNlcnZhYmxlcyBjb21pbmcgZnJvbSBwcm9taXNlcywgYSBkZWxheSBpcyBuZWVkZWQsIG90aGVyd2lzZSBSeEpTIHdpbGxcbiAqIG5ldmVyIHlpZWxkIGluIGEgcGVybWFuZW50IGZhaWx1cmUgZm9yIGEgcHJvbWlzZS5cbiAqXG4gKiBXZSBhbHNvIGRvbid0IHdhbnQgUnhKUyB0byBkbyBwcm9taXNlIG9wZXJhdGlvbnMgdG8gb2Z0ZW4sIHNvIHdlIGJ1bXAgdGhlXG4gKiBkZWxheSB1cCB0byAxMDBtcy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJFVFJZX0RFTEFZID0gMTAwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9jYXRvcnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuLi9jZHAvQ29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBQcm90b2NvbEVycm9yLCBVbnN1cHBvcnRlZE9wZXJhdGlvbiB9IGZyb20gJy4uL2NvbW1vbi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgREVGQVVMVF9WSUVXUE9SVCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbi8qKlxuICogVXNlcnMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBkaXJlY3RseTsgaXQncyBjYWxsZWQgd2hlbiBjYWxsaW5nIGBwdXBwZXRlZXIuY29ubmVjdGBcbiAqIHdpdGggYHByb3RvY29sOiAnd2ViRHJpdmVyQmlEaSdgLiBUaGlzIG1ldGhvZCBhdHRhY2hlcyBQdXBwZXRlZXIgdG8gYW4gZXhpc3RpbmcgYnJvd3NlclxuICogaW5zdGFuY2UuIEZpcnN0IGl0IHRyaWVzIHRvIGNvbm5lY3QgdG8gdGhlIGJyb3dzZXIgdXNpbmcgcHVyZSBCaURpLiBJZiB0aGUgcHJvdG9jb2wgaXNcbiAqIG5vdCBzdXBwb3J0ZWQsIGNvbm5lY3RzIHRvIHRoZSBicm93c2VyIHVzaW5nIEJpRGkgb3ZlciBDRFAuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfY29ubmVjdFRvQmlEaUJyb3dzZXIoY29ubmVjdGlvblRyYW5zcG9ydCwgdXJsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyBpZ25vcmVIVFRQU0Vycm9ycyA9IGZhbHNlLCBkZWZhdWx0Vmlld3BvcnQgPSBERUZBVUxUX1ZJRVdQT1JUIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgYmlkaUNvbm5lY3Rpb24sIGNsb3NlQ2FsbGJhY2sgfSA9IGF3YWl0IGdldEJpRGlDb25uZWN0aW9uKGNvbm5lY3Rpb25UcmFuc3BvcnQsIHVybCwgb3B0aW9ucyk7XG4gICAgY29uc3QgQmlEaSA9IGF3YWl0IGltcG9ydCgvKiA6IHRydWUgKi8gJy4vYmlkaS5qcycpO1xuICAgIGNvbnN0IGJpZGlCcm93c2VyID0gYXdhaXQgQmlEaS5CaWRpQnJvd3Nlci5jcmVhdGUoe1xuICAgICAgICBjb25uZWN0aW9uOiBiaWRpQ29ubmVjdGlvbixcbiAgICAgICAgY2xvc2VDYWxsYmFjayxcbiAgICAgICAgcHJvY2VzczogdW5kZWZpbmVkLFxuICAgICAgICBkZWZhdWx0Vmlld3BvcnQ6IGRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IGlnbm9yZUhUVFBTRXJyb3JzLFxuICAgIH0pO1xuICAgIHJldHVybiBiaWRpQnJvd3Nlcjtcbn1cbi8qKlxuICogUmV0dXJucyBhIEJpRGlDb25uZWN0aW9uIGVzdGFibGlzaGVkIHRvIHRoZSBlbmRwb2ludCBzcGVjaWZpZWQgYnkgdGhlIG9wdGlvbnMgYW5kIGFcbiAqIGNhbGxiYWNrIGNsb3NpbmcgdGhlIGJyb3dzZXIuIENhbGxiYWNrIGRlcGVuZHMgb24gd2hldGhlciB0aGUgY29ubmVjdGlvbiBpcyBwdXJlIEJpRGlcbiAqIG9yIEJpRGkgb3ZlciBDRFAuXG4gKiBUaGUgbWV0aG9kIHRyaWVzIHRvIGNvbm5lY3QgdG8gdGhlIGJyb3dzZXIgdXNpbmcgcHVyZSBCaURpIHByb3RvY29sLCBhbmQgZmFsbHMgYmFja1xuICogdG8gQmlEaSBvdmVyIENEUC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QmlEaUNvbm5lY3Rpb24oY29ubmVjdGlvblRyYW5zcG9ydCwgdXJsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgQmlEaSA9IGF3YWl0IGltcG9ydCgvKiA6IHRydWUgKi8gJy4vYmlkaS5qcycpO1xuICAgIGNvbnN0IHsgaWdub3JlSFRUUFNFcnJvcnMgPSBmYWxzZSwgc2xvd01vID0gMCwgcHJvdG9jb2xUaW1lb3V0IH0gPSBvcHRpb25zO1xuICAgIC8vIFRyeSBwdXJlIEJpRGkgZmlyc3QuXG4gICAgY29uc3QgcHVyZUJpZGlDb25uZWN0aW9uID0gbmV3IEJpRGkuQmlkaUNvbm5lY3Rpb24odXJsLCBjb25uZWN0aW9uVHJhbnNwb3J0LCBzbG93TW8sIHByb3RvY29sVGltZW91dCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHVyZUJpZGlDb25uZWN0aW9uLnNlbmQoJ3Nlc3Npb24uc3RhdHVzJywge30pO1xuICAgICAgICBpZiAoJ3R5cGUnIGluIHJlc3VsdCAmJiByZXN1bHQudHlwZSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAvLyBUaGUgYGJyb3dzZXJXU0VuZHBvaW50YCBwb2ludHMgdG8gYW4gZW5kcG9pbnQgc3VwcG9ydGluZyBwdXJlIFdlYkRyaXZlciBCaURpLlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBiaWRpQ29ubmVjdGlvbjogcHVyZUJpZGlDb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGNsb3NlQ2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHVyZUJpZGlDb25uZWN0aW9uLnNlbmQoJ2Jyb3dzZXIuY2xvc2UnLCB7fSkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFByb3RvY29sRXJyb3IpKSB7XG4gICAgICAgICAgICAvLyBVbmV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgcmVsYXRlZCB0byBCaURpIC8gQ0RQLiBSZXRocm93LlxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBVbmJpbmQgdGhlIGNvbm5lY3Rpb24gdG8gYXZvaWQgbWVtb3J5IGxlYWtzLlxuICAgIHB1cmVCaWRpQ29ubmVjdGlvbi51bmJpbmQoKTtcbiAgICAvLyBGYWxsIGJhY2sgdG8gQ0RQIG92ZXIgQmlEaSByZXVzaW5nIHRoZSBXUyBjb25uZWN0aW9uLlxuICAgIGNvbnN0IGNkcENvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbih1cmwsIGNvbm5lY3Rpb25UcmFuc3BvcnQsIHNsb3dNbywgcHJvdG9jb2xUaW1lb3V0KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgY2RwQ29ubmVjdGlvbi5zZW5kKCdCcm93c2VyLmdldFZlcnNpb24nKTtcbiAgICBpZiAodmVyc2lvbi5wcm9kdWN0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ZpcmVmb3gnKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb24oJ0ZpcmVmb3ggaXMgbm90IHN1cHBvcnRlZCBpbiBCaURpIG92ZXIgQ0RQIG1vZGUuJyk7XG4gICAgfVxuICAgIC8vIFRPRE86IHVzZSBvdGhlciBvcHRpb25zIHRvby5cbiAgICBjb25zdCBiaWRpT3ZlckNkcENvbm5lY3Rpb24gPSBhd2FpdCBCaURpLmNvbm5lY3RCaWRpT3ZlckNkcChjZHBDb25uZWN0aW9uLCB7XG4gICAgICAgIGFjY2VwdEluc2VjdXJlQ2VydHM6IGlnbm9yZUhUVFBTRXJyb3JzLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGJpZGlDb25uZWN0aW9uOiBiaWRpT3ZlckNkcENvbm5lY3Rpb24sXG4gICAgICAgIGNsb3NlQ2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgQmlEaSBvdmVyIENEUCwgd2UgbmVlZCB0byBjbG9zZSBicm93c2VyIHZpYSBDRFAuXG4gICAgICAgICAgICBhd2FpdCBjZHBDb25uZWN0aW9uLnNlbmQoJ0Jyb3dzZXIuY2xvc2UnKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckNvbm5lY3Rvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgQWNjZXNzaWJpbGl0eSBjbGFzcyBwcm92aWRlcyBtZXRob2RzIGZvciBpbnNwZWN0aW5nIHRoZSBicm93c2VyJ3NcbiAqIGFjY2Vzc2liaWxpdHkgdHJlZS4gVGhlIGFjY2Vzc2liaWxpdHkgdHJlZSBpcyB1c2VkIGJ5IGFzc2lzdGl2ZSB0ZWNobm9sb2d5XG4gKiBzdWNoIGFzIHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TY3JlZW5fcmVhZGVyIHwgc2NyZWVuIHJlYWRlcnN9IG9yXG4gKiB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3dpdGNoX2FjY2VzcyB8IHN3aXRjaGVzfS5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIEFjY2Vzc2liaWxpdHkgaXMgYSB2ZXJ5IHBsYXRmb3JtLXNwZWNpZmljIHRoaW5nLiBPbiBkaWZmZXJlbnQgcGxhdGZvcm1zLFxuICogdGhlcmUgYXJlIGRpZmZlcmVudCBzY3JlZW4gcmVhZGVycyB0aGF0IG1pZ2h0IGhhdmUgd2lsZGx5IGRpZmZlcmVudCBvdXRwdXQuXG4gKlxuICogQmxpbmsgLSBDaHJvbWUncyByZW5kZXJpbmcgZW5naW5lIC0gaGFzIGEgY29uY2VwdCBvZiBcImFjY2Vzc2liaWxpdHkgdHJlZVwiLFxuICogd2hpY2ggaXMgdGhlbiB0cmFuc2xhdGVkIGludG8gZGlmZmVyZW50IHBsYXRmb3JtLXNwZWNpZmljIEFQSXMuIEFjY2Vzc2liaWxpdHlcbiAqIG5hbWVzcGFjZSBnaXZlcyB1c2VycyBhY2Nlc3MgdG8gdGhlIEJsaW5rIEFjY2Vzc2liaWxpdHkgVHJlZS5cbiAqXG4gKiBNb3N0IG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUgZ2V0cyBmaWx0ZXJlZCBvdXQgd2hlbiBjb252ZXJ0aW5nIGZyb20gQmxpbmtcbiAqIEFYIFRyZWUgdG8gUGxhdGZvcm0tc3BlY2lmaWMgQVgtVHJlZSBvciBieSBhc3Npc3RpdmUgdGVjaG5vbG9naWVzIHRoZW1zZWx2ZXMuXG4gKiBCeSBkZWZhdWx0LCBQdXBwZXRlZXIgdHJpZXMgdG8gYXBwcm94aW1hdGUgdGhpcyBmaWx0ZXJpbmcsIGV4cG9zaW5nIG9ubHlcbiAqIHRoZSBcImludGVyZXN0aW5nXCIgbm9kZXMgb2YgdGhlIHRyZWUuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQWNjZXNzaWJpbGl0eSB7XG4gICAgI3JlYWxtO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJlYWxtKSB7XG4gICAgICAgIHRoaXMuI3JlYWxtID0gcmVhbG07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhcHR1cmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuXG4gICAgICogVGhlIHJldHVybmVkIG9iamVjdCByZXByZXNlbnRzIHRoZSByb290IGFjY2Vzc2libGUgbm9kZSBvZiB0aGUgcGFnZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBUaGUgQ2hyb21lIGFjY2Vzc2liaWxpdHkgdHJlZSBjb250YWlucyBub2RlcyB0aGF0IGdvIHVudXNlZCBvblxuICAgICAqIG1vc3QgcGxhdGZvcm1zIGFuZCBieSBtb3N0IHNjcmVlbiByZWFkZXJzLiBQdXBwZXRlZXIgd2lsbCBkaXNjYXJkIHRoZW0gYXNcbiAgICAgKiB3ZWxsIGZvciBhbiBlYXNpZXIgdG8gcHJvY2VzcyB0cmVlLCB1bmxlc3MgYGludGVyZXN0aW5nT25seWAgaXMgc2V0IHRvXG4gICAgICogYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogQW4gZXhhbXBsZSBvZiBkdW1waW5nIHRoZSBlbnRpcmUgYWNjZXNzaWJpbGl0eSB0cmVlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHBhZ2UuYWNjZXNzaWJpbGl0eS5zbmFwc2hvdCgpO1xuICAgICAqIGNvbnNvbGUubG9nKHNuYXBzaG90KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogQW4gZXhhbXBsZSBvZiBsb2dnaW5nIHRoZSBmb2N1c2VkIG5vZGUncyBuYW1lOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHBhZ2UuYWNjZXNzaWJpbGl0eS5zbmFwc2hvdCgpO1xuICAgICAqIGNvbnN0IG5vZGUgPSBmaW5kRm9jdXNlZE5vZGUoc25hcHNob3QpO1xuICAgICAqIGNvbnNvbGUubG9nKG5vZGUgJiYgbm9kZS5uYW1lKTtcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGZpbmRGb2N1c2VkTm9kZShub2RlKSB7XG4gICAgICogICBpZiAobm9kZS5mb2N1c2VkKSByZXR1cm4gbm9kZTtcbiAgICAgKiAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbiB8fCBbXSkge1xuICAgICAqICAgICBjb25zdCBmb3VuZE5vZGUgPSBmaW5kRm9jdXNlZE5vZGUoY2hpbGQpO1xuICAgICAqICAgICByZXR1cm4gZm91bmROb2RlO1xuICAgICAqICAgfVxuICAgICAqICAgcmV0dXJuIG51bGw7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gQVhOb2RlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNuYXBzaG90LlxuICAgICAqL1xuICAgIGFzeW5jIHNuYXBzaG90KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGludGVyZXN0aW5nT25seSA9IHRydWUsIHJvb3QgPSBudWxsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCB7IG5vZGVzIH0gPSBhd2FpdCB0aGlzLiNyZWFsbS5lbnZpcm9ubWVudC5jbGllbnQuc2VuZCgnQWNjZXNzaWJpbGl0eS5nZXRGdWxsQVhUcmVlJyk7XG4gICAgICAgIGxldCBiYWNrZW5kTm9kZUlkO1xuICAgICAgICBpZiAocm9vdCkge1xuICAgICAgICAgICAgY29uc3QgeyBub2RlIH0gPSBhd2FpdCB0aGlzLiNyZWFsbS5lbnZpcm9ubWVudC5jbGllbnQuc2VuZCgnRE9NLmRlc2NyaWJlTm9kZScsIHtcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogcm9vdC5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmFja2VuZE5vZGVJZCA9IG5vZGUuYmFja2VuZE5vZGVJZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZhdWx0Um9vdCA9IEFYTm9kZS5jcmVhdGVUcmVlKHRoaXMuI3JlYWxtLCBub2Rlcyk7XG4gICAgICAgIGxldCBuZWVkbGUgPSBkZWZhdWx0Um9vdDtcbiAgICAgICAgaWYgKGJhY2tlbmROb2RlSWQpIHtcbiAgICAgICAgICAgIG5lZWRsZSA9IGRlZmF1bHRSb290LmZpbmQobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUucGF5bG9hZC5iYWNrZW5kRE9NTm9kZUlkID09PSBiYWNrZW5kTm9kZUlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIW5lZWRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaW50ZXJlc3RpbmdPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVUcmVlKG5lZWRsZSlbMF0gPz8gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnRlcmVzdGluZ05vZGVzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLmNvbGxlY3RJbnRlcmVzdGluZ05vZGVzKGludGVyZXN0aW5nTm9kZXMsIGRlZmF1bHRSb290LCBmYWxzZSk7XG4gICAgICAgIGlmICghaW50ZXJlc3RpbmdOb2Rlcy5oYXMobmVlZGxlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplVHJlZShuZWVkbGUsIGludGVyZXN0aW5nTm9kZXMpWzBdID8/IG51bGw7XG4gICAgfVxuICAgIHNlcmlhbGl6ZVRyZWUobm9kZSwgaW50ZXJlc3RpbmdOb2Rlcykge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goLi4udGhpcy5zZXJpYWxpemVUcmVlKGNoaWxkLCBpbnRlcmVzdGluZ05vZGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyZXN0aW5nTm9kZXMgJiYgIWludGVyZXN0aW5nTm9kZXMuaGFzKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZE5vZGUgPSBub2RlLnNlcmlhbGl6ZSgpO1xuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZXJpYWxpemVkTm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbc2VyaWFsaXplZE5vZGVdO1xuICAgIH1cbiAgICBjb2xsZWN0SW50ZXJlc3RpbmdOb2Rlcyhjb2xsZWN0aW9uLCBub2RlLCBpbnNpZGVDb250cm9sKSB7XG4gICAgICAgIGlmIChub2RlLmlzSW50ZXJlc3RpbmcoaW5zaWRlQ29udHJvbCkpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmlzTGVhZk5vZGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGluc2lkZUNvbnRyb2wgPSBpbnNpZGVDb250cm9sIHx8IG5vZGUuaXNDb250cm9sKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy5jb2xsZWN0SW50ZXJlc3RpbmdOb2Rlcyhjb2xsZWN0aW9uLCBjaGlsZCwgaW5zaWRlQ29udHJvbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBBWE5vZGUge1xuICAgIHBheWxvYWQ7XG4gICAgY2hpbGRyZW4gPSBbXTtcbiAgICAjcmljaGx5RWRpdGFibGUgPSBmYWxzZTtcbiAgICAjZWRpdGFibGUgPSBmYWxzZTtcbiAgICAjZm9jdXNhYmxlID0gZmFsc2U7XG4gICAgI2hpZGRlbiA9IGZhbHNlO1xuICAgICNuYW1lO1xuICAgICNyb2xlO1xuICAgICNpZ25vcmVkO1xuICAgICNjYWNoZWRIYXNGb2N1c2FibGVDaGlsZDtcbiAgICAjcmVhbG07XG4gICAgY29uc3RydWN0b3IocmVhbG0sIHBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgdGhpcy4jbmFtZSA9IHRoaXMucGF5bG9hZC5uYW1lID8gdGhpcy5wYXlsb2FkLm5hbWUudmFsdWUgOiAnJztcbiAgICAgICAgdGhpcy4jcm9sZSA9IHRoaXMucGF5bG9hZC5yb2xlID8gdGhpcy5wYXlsb2FkLnJvbGUudmFsdWUgOiAnVW5rbm93bic7XG4gICAgICAgIHRoaXMuI2lnbm9yZWQgPSB0aGlzLnBheWxvYWQuaWdub3JlZDtcbiAgICAgICAgdGhpcy4jcmVhbG0gPSByZWFsbTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLnBheWxvYWQucHJvcGVydGllcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm5hbWUgPT09ICdlZGl0YWJsZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyaWNobHlFZGl0YWJsZSA9IHByb3BlcnR5LnZhbHVlLnZhbHVlID09PSAncmljaHRleHQnO1xuICAgICAgICAgICAgICAgIHRoaXMuI2VkaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5uYW1lID09PSAnZm9jdXNhYmxlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2ZvY3VzYWJsZSA9IHByb3BlcnR5LnZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm5hbWUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jaGlkZGVuID0gcHJvcGVydHkudmFsdWUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2lzUGxhaW5UZXh0RmllbGQoKSB7XG4gICAgICAgIGlmICh0aGlzLiNyaWNobHlFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNlZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI3JvbGUgPT09ICd0ZXh0Ym94JyB8fCB0aGlzLiNyb2xlID09PSAnc2VhcmNoYm94JztcbiAgICB9XG4gICAgI2lzVGV4dE9ubHlPYmplY3QoKSB7XG4gICAgICAgIGNvbnN0IHJvbGUgPSB0aGlzLiNyb2xlO1xuICAgICAgICByZXR1cm4gKHJvbGUgPT09ICdMaW5lQnJlYWsnIHx8XG4gICAgICAgICAgICByb2xlID09PSAndGV4dCcgfHxcbiAgICAgICAgICAgIHJvbGUgPT09ICdJbmxpbmVUZXh0Qm94JyB8fFxuICAgICAgICAgICAgcm9sZSA9PT0gJ1N0YXRpY1RleHQnKTtcbiAgICB9XG4gICAgI2hhc0ZvY3VzYWJsZUNoaWxkKCkge1xuICAgICAgICBpZiAodGhpcy4jY2FjaGVkSGFzRm9jdXNhYmxlQ2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy4jY2FjaGVkSGFzRm9jdXNhYmxlQ2hpbGQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC4jZm9jdXNhYmxlIHx8IGNoaWxkLiNoYXNGb2N1c2FibGVDaGlsZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2NhY2hlZEhhc0ZvY3VzYWJsZUNoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWNoZWRIYXNGb2N1c2FibGVDaGlsZDtcbiAgICB9XG4gICAgZmluZChwcmVkaWNhdGUpIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGlsZC5maW5kKHByZWRpY2F0ZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaXNMZWFmTm9kZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlc2UgdHlwZXMgb2Ygb2JqZWN0cyBtYXkgaGF2ZSBjaGlsZHJlbiB0aGF0IHdlIHVzZSBhcyBpbnRlcm5hbFxuICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCBidXQgd2Ugd2FudCB0byBleHBvc2UgdGhlbSBhcyBsZWF2ZXMgdG8gcGxhdGZvcm1cbiAgICAgICAgLy8gYWNjZXNzaWJpbGl0eSBBUElzIGJlY2F1c2Ugc2NyZWVuIHJlYWRlcnMgbWlnaHQgYmUgY29uZnVzZWQgaWYgdGhleSBmaW5kXG4gICAgICAgIC8vIGFueSBjaGlsZHJlbi5cbiAgICAgICAgaWYgKHRoaXMuI2lzUGxhaW5UZXh0RmllbGQoKSB8fCB0aGlzLiNpc1RleHRPbmx5T2JqZWN0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJvbGVzIHdob3NlIGNoaWxkcmVuIGFyZSBvbmx5IHByZXNlbnRhdGlvbmFsIGFjY29yZGluZyB0byB0aGUgQVJJQSBhbmRcbiAgICAgICAgLy8gSFRNTDUgU3BlY3Mgc2hvdWxkIGJlIGhpZGRlbiBmcm9tIHNjcmVlbiByZWFkZXJzLlxuICAgICAgICAvLyAoTm90ZSB0aGF0IHdoaWxzdCBBUklBIGJ1dHRvbnMgY2FuIGhhdmUgb25seSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiwgSFRNTDVcbiAgICAgICAgLy8gYnV0dG9ucyBhcmUgYWxsb3dlZCB0byBoYXZlIGNvbnRlbnQuKVxuICAgICAgICBzd2l0Y2ggKHRoaXMuI3JvbGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1jb3Zlcic6XG4gICAgICAgICAgICBjYXNlICdncmFwaGljcy1zeW1ib2wnOlxuICAgICAgICAgICAgY2FzZSAnaW1nJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgICAgIGNhc2UgJ01ldGVyJzpcbiAgICAgICAgICAgIGNhc2UgJ3Njcm9sbGJhcic6XG4gICAgICAgICAgICBjYXNlICdzbGlkZXInOlxuICAgICAgICAgICAgY2FzZSAnc2VwYXJhdG9yJzpcbiAgICAgICAgICAgIGNhc2UgJ3Byb2dyZXNzYmFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGVyZSBhbmQgYmVsb3c6IEFuZHJvaWQgaGV1cmlzdGljc1xuICAgICAgICBpZiAodGhpcy4jaGFzRm9jdXNhYmxlQ2hpbGQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNmb2N1c2FibGUgJiYgdGhpcy4jbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3JvbGUgPT09ICdoZWFkaW5nJyAmJiB0aGlzLiNuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlzQ29udHJvbCgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLiNyb2xlKSB7XG4gICAgICAgICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgY2FzZSAnQ29sb3JXZWxsJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbWJvYm94JzpcbiAgICAgICAgICAgIGNhc2UgJ0Rpc2Nsb3N1cmVUcmlhbmdsZSc6XG4gICAgICAgICAgICBjYXNlICdsaXN0Ym94JzpcbiAgICAgICAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgICAgICAgY2FzZSAnbWVudWJhcic6XG4gICAgICAgICAgICBjYXNlICdtZW51aXRlbSc6XG4gICAgICAgICAgICBjYXNlICdtZW51aXRlbWNoZWNrYm94JzpcbiAgICAgICAgICAgIGNhc2UgJ21lbnVpdGVtcmFkaW8nOlxuICAgICAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgICAgY2FzZSAnc2Nyb2xsYmFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NlYXJjaGJveCc6XG4gICAgICAgICAgICBjYXNlICdzbGlkZXInOlxuICAgICAgICAgICAgY2FzZSAnc3BpbmJ1dHRvbic6XG4gICAgICAgICAgICBjYXNlICdzd2l0Y2gnOlxuICAgICAgICAgICAgY2FzZSAndGFiJzpcbiAgICAgICAgICAgIGNhc2UgJ3RleHRib3gnOlxuICAgICAgICAgICAgY2FzZSAndHJlZSc6XG4gICAgICAgICAgICBjYXNlICd0cmVlaXRlbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc0ludGVyZXN0aW5nKGluc2lkZUNvbnRyb2wpIHtcbiAgICAgICAgY29uc3Qgcm9sZSA9IHRoaXMuI3JvbGU7XG4gICAgICAgIGlmIChyb2xlID09PSAnSWdub3JlZCcgfHwgdGhpcy4jaGlkZGVuIHx8IHRoaXMuI2lnbm9yZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jZm9jdXNhYmxlIHx8IHRoaXMuI3JpY2hseUVkaXRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBpdCdzIG5vdCBmb2N1c2FibGUgYnV0IGhhcyBhIGNvbnRyb2wgcm9sZSwgdGhlbiBpdCdzIGludGVyZXN0aW5nLlxuICAgICAgICBpZiAodGhpcy5pc0NvbnRyb2woKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBub24gZm9jdXNhYmxlIGNoaWxkIG9mIGEgY29udHJvbCBpcyBub3QgaW50ZXJlc3RpbmdcbiAgICAgICAgaWYgKGluc2lkZUNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pc0xlYWZOb2RlKCkgJiYgISF0aGlzLiNuYW1lO1xuICAgIH1cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdGhpcy5wYXlsb2FkLnByb3BlcnRpZXMgfHwgW10pIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0KHByb3BlcnR5Lm5hbWUudG9Mb3dlckNhc2UoKSwgcHJvcGVydHkudmFsdWUudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBheWxvYWQubmFtZSkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoJ25hbWUnLCB0aGlzLnBheWxvYWQubmFtZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGF5bG9hZC52YWx1ZSkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoJ3ZhbHVlJywgdGhpcy5wYXlsb2FkLnZhbHVlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXlsb2FkLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnNldCgnZGVzY3JpcHRpb24nLCB0aGlzLnBheWxvYWQuZGVzY3JpcHRpb24udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgICAgICByb2xlOiB0aGlzLiNyb2xlLFxuICAgICAgICAgICAgZWxlbWVudEhhbmRsZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wYXlsb2FkLmJhY2tlbmRET01Ob2RlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy4jcmVhbG0uYWRvcHRCYWNrZW5kTm9kZSh0aGlzLnBheWxvYWQuYmFja2VuZERPTU5vZGVJZCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdXNlclN0cmluZ1Byb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICdrZXlzaG9ydGN1dHMnLFxuICAgICAgICAgICAgJ3JvbGVkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAndmFsdWV0ZXh0JyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgZ2V0VXNlclN0cmluZ1Byb3BlcnR5VmFsdWUgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCB1c2VyU3RyaW5nUHJvcGVydHkgb2YgdXNlclN0cmluZ1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICghcHJvcGVydGllcy5oYXModXNlclN0cmluZ1Byb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZVt1c2VyU3RyaW5nUHJvcGVydHldID0gZ2V0VXNlclN0cmluZ1Byb3BlcnR5VmFsdWUodXNlclN0cmluZ1Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBib29sZWFuUHJvcGVydGllcyA9IFtcbiAgICAgICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICAgICAnZXhwYW5kZWQnLFxuICAgICAgICAgICAgJ2ZvY3VzZWQnLFxuICAgICAgICAgICAgJ21vZGFsJyxcbiAgICAgICAgICAgICdtdWx0aWxpbmUnLFxuICAgICAgICAgICAgJ211bHRpc2VsZWN0YWJsZScsXG4gICAgICAgICAgICAncmVhZG9ubHknLFxuICAgICAgICAgICAgJ3JlcXVpcmVkJyxcbiAgICAgICAgICAgICdzZWxlY3RlZCcsXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGdldEJvb2xlYW5Qcm9wZXJ0eVZhbHVlID0gKGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0KGtleSk7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgYm9vbGVhblByb3BlcnR5IG9mIGJvb2xlYW5Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAvLyBSb290V2ViQXJlYSdzIHRyZWF0IGZvY3VzIGRpZmZlcmVudGx5IHRoYW4gb3RoZXIgbm9kZXMuIFRoZXkgcmVwb3J0IHdoZXRoZXJcbiAgICAgICAgICAgIC8vIHRoZWlyIGZyYW1lICBoYXMgZm9jdXMsIG5vdCB3aGV0aGVyIGZvY3VzIGlzIHNwZWNpZmljYWxseSBvbiB0aGUgcm9vdFxuICAgICAgICAgICAgLy8gbm9kZS5cbiAgICAgICAgICAgIGlmIChib29sZWFuUHJvcGVydHkgPT09ICdmb2N1c2VkJyAmJiB0aGlzLiNyb2xlID09PSAnUm9vdFdlYkFyZWEnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEJvb2xlYW5Qcm9wZXJ0eVZhbHVlKGJvb2xlYW5Qcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlW2Jvb2xlYW5Qcm9wZXJ0eV0gPSBnZXRCb29sZWFuUHJvcGVydHlWYWx1ZShib29sZWFuUHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyaXN0YXRlUHJvcGVydGllcyA9IFsnY2hlY2tlZCcsICdwcmVzc2VkJ107XG4gICAgICAgIGZvciAoY29uc3QgdHJpc3RhdGVQcm9wZXJ0eSBvZiB0cmlzdGF0ZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICghcHJvcGVydGllcy5oYXModHJpc3RhdGVQcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydGllcy5nZXQodHJpc3RhdGVQcm9wZXJ0eSk7XG4gICAgICAgICAgICBub2RlW3RyaXN0YXRlUHJvcGVydHldID1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9PT0gJ21peGVkJyA/ICdtaXhlZCcgOiB2YWx1ZSA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG51bWVyaWNhbFByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAnbGV2ZWwnLFxuICAgICAgICAgICAgJ3ZhbHVlbWF4JyxcbiAgICAgICAgICAgICd2YWx1ZW1pbicsXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGdldE51bWVyaWNhbFByb3BlcnR5VmFsdWUgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBudW1lcmljYWxQcm9wZXJ0eSBvZiBudW1lcmljYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMuaGFzKG51bWVyaWNhbFByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZVtudW1lcmljYWxQcm9wZXJ0eV0gPSBnZXROdW1lcmljYWxQcm9wZXJ0eVZhbHVlKG51bWVyaWNhbFByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlblByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAnYXV0b2NvbXBsZXRlJyxcbiAgICAgICAgICAgICdoYXNwb3B1cCcsXG4gICAgICAgICAgICAnaW52YWxpZCcsXG4gICAgICAgICAgICAnb3JpZW50YXRpb24nLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBnZXRUb2tlblByb3BlcnR5VmFsdWUgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlblByb3BlcnR5IG9mIHRva2VuUHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRUb2tlblByb3BlcnR5VmFsdWUodG9rZW5Qcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlW3Rva2VuUHJvcGVydHldID0gZ2V0VG9rZW5Qcm9wZXJ0eVZhbHVlKHRva2VuUHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlVHJlZShyZWFsbSwgcGF5bG9hZHMpIHtcbiAgICAgICAgY29uc3Qgbm9kZUJ5SWQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgcGF5bG9hZCBvZiBwYXlsb2Fkcykge1xuICAgICAgICAgICAgbm9kZUJ5SWQuc2V0KHBheWxvYWQubm9kZUlkLCBuZXcgQVhOb2RlKHJlYWxtLCBwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVCeUlkLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkSWQgb2Ygbm9kZS5wYXlsb2FkLmNoaWxkSWRzIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlQnlJZC5nZXQoY2hpbGRJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlQnlJZC52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWNjZXNzaWJpbGl0eS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi4vY29tbW9uL1F1ZXJ5SGFuZGxlci5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBBc3luY0l0ZXJhYmxlVXRpbCB9IGZyb20gJy4uL3V0aWwvQXN5bmNJdGVyYWJsZVV0aWwuanMnO1xuY29uc3QgaXNLbm93bkF0dHJpYnV0ZSA9IChhdHRyaWJ1dGUpID0+IHtcbiAgICByZXR1cm4gWyduYW1lJywgJ3JvbGUnXS5pbmNsdWRlcyhhdHRyaWJ1dGUpO1xufTtcbmNvbnN0IG5vcm1hbGl6ZVZhbHVlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyArL2csICcgJykudHJpbSgpO1xufTtcbi8qKlxuICogVGhlIHNlbGVjdG9ycyBjb25zaXN0IG9mIGFuIGFjY2Vzc2libGUgbmFtZSB0byBxdWVyeSBmb3IgYW5kIG9wdGlvbmFsbHlcbiAqIGZ1cnRoZXIgYXJpYSBhdHRyaWJ1dGVzIG9uIHRoZSBmb3JtIGBbPGF0dHJpYnV0ZT49PHZhbHVlPl1gLlxuICogQ3VycmVudGx5LCB3ZSBvbmx5IHN1cHBvcnQgdGhlIGBuYW1lYCBhbmQgYHJvbGVgIGF0dHJpYnV0ZS5cbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvd2Nhc2UgaG93IHRoZSBzeW50YXggd29ya3Mgd3J0LiBxdWVyeWluZzpcbiAqXG4gKiAtICd0aXRsZVtyb2xlPVwiaGVhZGluZ1wiXScgcXVlcmllcyBmb3IgZWxlbWVudHMgd2l0aCBuYW1lICd0aXRsZScgYW5kIHJvbGUgJ2hlYWRpbmcnLlxuICogLSAnW3JvbGU9XCJpbWFnZVwiXScgcXVlcmllcyBmb3IgZWxlbWVudHMgd2l0aCByb2xlICdpbWFnZScgYW5kIGFueSBuYW1lLlxuICogLSAnbGFiZWwnIHF1ZXJpZXMgZm9yIGVsZW1lbnRzIHdpdGggbmFtZSAnbGFiZWwnIGFuZCBhbnkgcm9sZS5cbiAqIC0gJ1tuYW1lPVwiXCJdW3JvbGU9XCJidXR0b25cIl0nIHF1ZXJpZXMgZm9yIGVsZW1lbnRzIHdpdGggbm8gbmFtZSBhbmQgcm9sZSAnYnV0dG9uJy5cbiAqL1xuY29uc3QgQVRUUklCVVRFX1JFR0VYUCA9IC9cXFtcXHMqKD88YXR0cmlidXRlPlxcdyspXFxzKj1cXHMqKD88cXVvdGU+XCJ8JykoPzx2YWx1ZT5cXFxcLnwuKj8oPz1cXGs8cXVvdGU+KSlcXGs8cXVvdGU+XFxzKlxcXS9nO1xuY29uc3QgcGFyc2VBUklBU2VsZWN0b3IgPSAoc2VsZWN0b3IpID0+IHtcbiAgICBjb25zdCBxdWVyeU9wdGlvbnMgPSB7fTtcbiAgICBjb25zdCBkZWZhdWx0TmFtZSA9IHNlbGVjdG9yLnJlcGxhY2UoQVRUUklCVVRFX1JFR0VYUCwgKF8sIGF0dHJpYnV0ZSwgX18sIHZhbHVlKSA9PiB7XG4gICAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS50cmltKCk7XG4gICAgICAgIGFzc2VydChpc0tub3duQXR0cmlidXRlKGF0dHJpYnV0ZSksIGBVbmtub3duIGFyaWEgYXR0cmlidXRlIFwiJHthdHRyaWJ1dGV9XCIgaW4gc2VsZWN0b3JgKTtcbiAgICAgICAgcXVlcnlPcHRpb25zW2F0dHJpYnV0ZV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcbiAgICBpZiAoZGVmYXVsdE5hbWUgJiYgIXF1ZXJ5T3B0aW9ucy5uYW1lKSB7XG4gICAgICAgIHF1ZXJ5T3B0aW9ucy5uYW1lID0gbm9ybWFsaXplVmFsdWUoZGVmYXVsdE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gcXVlcnlPcHRpb25zO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBBUklBUXVlcnlIYW5kbGVyIGV4dGVuZHMgUXVlcnlIYW5kbGVyIHtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvciA9IGFzeW5jIChub2RlLCBzZWxlY3RvciwgeyBhcmlhUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBhcmlhUXVlcnlTZWxlY3Rvcihub2RlLCBzZWxlY3Rvcik7XG4gICAgfTtcbiAgICBzdGF0aWMgYXN5bmMgKnF1ZXJ5QWxsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgcm9sZSB9ID0gcGFyc2VBUklBU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICB5aWVsZCogZWxlbWVudC5xdWVyeUFYVHJlZShuYW1lLCByb2xlKTtcbiAgICB9XG4gICAgc3RhdGljIHF1ZXJ5T25lID0gYXN5bmMgKGVsZW1lbnQsIHNlbGVjdG9yKSA9PiB7XG4gICAgICAgIHJldHVybiAoKGF3YWl0IEFzeW5jSXRlcmFibGVVdGlsLmZpcnN0KHRoaXMucXVlcnlBbGwoZWxlbWVudCwgc2VsZWN0b3IpKSkgPz8gbnVsbCk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFyaWFRdWVyeUhhbmRsZXIuanMubWFwIiwidmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBKU0hhbmRsZSB9IGZyb20gJy4uL2FwaS9KU0hhbmRsZS5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IGlzRXJyb3JMaWtlIH0gZnJvbSAnLi4vdXRpbC9FcnJvckxpa2UuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEJpbmRpbmcge1xuICAgICNuYW1lO1xuICAgICNmbjtcbiAgICAjaW5pdFNvdXJjZTtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBmbiwgaW5pdFNvdXJjZSkge1xuICAgICAgICB0aGlzLiNuYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy4jZm4gPSBmbjtcbiAgICAgICAgdGhpcy4jaW5pdFNvdXJjZSA9IGluaXRTb3VyY2U7XG4gICAgfVxuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbmFtZTtcbiAgICB9XG4gICAgZ2V0IGluaXRTb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpbml0U291cmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29udGV4dCAtIENvbnRleHQgdG8gcnVuIHRoZSBiaW5kaW5nIGluOyB0aGUgY29udGV4dCBzaG91bGQgaGF2ZVxuICAgICAqIHRoZSBiaW5kaW5nIGFkZGVkIHRvIGl0IGJlZm9yZWhhbmQuXG4gICAgICogQHBhcmFtIGlkIC0gSUQgb2YgdGhlIGNhbGwuIFRoaXMgc2hvdWxkIGNvbWUgZnJvbSB0aGUgQ0RQXG4gICAgICogYG9uQmluZGluZ0NhbGxlZGAgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIGFyZ3MgLSBQbGFpbiBhcmd1bWVudHMgZnJvbSBDRFAuXG4gICAgICovXG4gICAgYXN5bmMgcnVuKGNvbnRleHQsIGlkLCBhcmdzLCBpc1RyaXZpYWwpIHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWlzVHJpdmlhbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldHRpbmcgbm9uLXRyaXZpYWwgYXJndW1lbnRzLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVzID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IGNvbnRleHQuZXZhbHVhdGVIYW5kbGUoKG5hbWUsIHNlcSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBDb2RlIGlzIGV2YWx1YXRlZCBpbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFRoaXNbbmFtZV0uYXJncy5nZXQoc2VxKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy4jbmFtZSwgaWQpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBhd2FpdCBoYW5kbGVzLmdldFByb3BlcnRpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGhhbmRsZV0gb2YgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3Qgc3RyYWlnaHQtZm9yd2FyZCBzaW5jZSBzb21lIGFyZ3VtZW50cyBjYW4gc3RyaW5naWZ5LCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZW4ndCBwbGFpbiBvYmplY3RzIHNvIGFkZCBzdWJ0eXBlcyB3aGVuIHRoZSB1c2UtY2FzZSBhcmlzZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggaW4gYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaGFuZGxlLnJlbW90ZU9iamVjdCgpLnN1YnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbm9kZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWytpbmRleF0gPSBoYW5kbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnVzZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnVzZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5ldmFsdWF0ZSgobmFtZSwgc2VxLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIENvZGUgaXMgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gZ2xvYmFsVGhpc1tuYW1lXS5jYWxsYmFja3M7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzLmdldChzZXEpLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICBjYWxsYmFja3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICB9LCB0aGlzLiNuYW1lLCBpZCwgYXdhaXQgdGhpcy4jZm4oLi4uYXJncykpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBKU0hhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFjay51c2UoYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dFxuICAgICAgICAgICAgICAgICAgICAuZXZhbHVhdGUoKG5hbWUsIHNlcSwgbWVzc2FnZSwgc3RhY2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnN0YWNrID0gc3RhY2s7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgQ29kZSBpcyBldmFsdWF0ZWQgaW4gYSBkaWZmZXJlbnQgY29udGV4dC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gZ2xvYmFsVGhpc1tuYW1lXS5jYWxsYmFja3M7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5nZXQoc2VxKS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcy4jbmFtZSwgaWQsIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5ldmFsdWF0ZSgobmFtZSwgc2VxLCBlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIENvZGUgaXMgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGdsb2JhbFRoaXNbbmFtZV0uY2FsbGJhY2tzO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZ2V0KHNlcSkucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmRlbGV0ZShzZXEpO1xuICAgICAgICAgICAgICAgIH0sIHRoaXMuI25hbWUsIGlkLCBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmluZGluZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQnJvd3NlciBhcyBCcm93c2VyQmFzZSwgfSBmcm9tICcuLi9hcGkvQnJvd3Nlci5qcyc7XG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBDZHBCcm93c2VyQ29udGV4dCB9IGZyb20gJy4vQnJvd3NlckNvbnRleHQuanMnO1xuaW1wb3J0IHsgQ2hyb21lVGFyZ2V0TWFuYWdlciB9IGZyb20gJy4vQ2hyb21lVGFyZ2V0TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBGaXJlZm94VGFyZ2V0TWFuYWdlciB9IGZyb20gJy4vRmlyZWZveFRhcmdldE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRGV2VG9vbHNUYXJnZXQsIEluaXRpYWxpemF0aW9uU3RhdHVzLCBPdGhlclRhcmdldCwgUGFnZVRhcmdldCwgV29ya2VyVGFyZ2V0LCB9IGZyb20gJy4vVGFyZ2V0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBCcm93c2VyIGV4dGVuZHMgQnJvd3NlckJhc2Uge1xuICAgIHByb3RvY29sID0gJ2NkcCc7XG4gICAgc3RhdGljIGFzeW5jIF9jcmVhdGUocHJvZHVjdCwgY29ubmVjdGlvbiwgY29udGV4dElkcywgaWdub3JlSFRUUFNFcnJvcnMsIGRlZmF1bHRWaWV3cG9ydCwgcHJvY2VzcywgY2xvc2VDYWxsYmFjaywgdGFyZ2V0RmlsdGVyQ2FsbGJhY2ssIGlzUGFnZVRhcmdldENhbGxiYWNrLCB3YWl0Rm9ySW5pdGlhbGx5RGlzY292ZXJlZFRhcmdldHMgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXIgPSBuZXcgQ2RwQnJvd3Nlcihwcm9kdWN0LCBjb25uZWN0aW9uLCBjb250ZXh0SWRzLCBkZWZhdWx0Vmlld3BvcnQsIHByb2Nlc3MsIGNsb3NlQ2FsbGJhY2ssIHRhcmdldEZpbHRlckNhbGxiYWNrLCBpc1BhZ2VUYXJnZXRDYWxsYmFjaywgd2FpdEZvckluaXRpYWxseURpc2NvdmVyZWRUYXJnZXRzKTtcbiAgICAgICAgaWYgKGlnbm9yZUhUVFBTRXJyb3JzKSB7XG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1NlY3VyaXR5LnNldElnbm9yZUNlcnRpZmljYXRlRXJyb3JzJywge1xuICAgICAgICAgICAgICAgIGlnbm9yZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGJyb3dzZXIuX2F0dGFjaCgpO1xuICAgICAgICByZXR1cm4gYnJvd3NlcjtcbiAgICB9XG4gICAgI2RlZmF1bHRWaWV3cG9ydDtcbiAgICAjcHJvY2VzcztcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjY2xvc2VDYWxsYmFjaztcbiAgICAjdGFyZ2V0RmlsdGVyQ2FsbGJhY2s7XG4gICAgI2lzUGFnZVRhcmdldENhbGxiYWNrO1xuICAgICNkZWZhdWx0Q29udGV4dDtcbiAgICAjY29udGV4dHMgPSBuZXcgTWFwKCk7XG4gICAgI3RhcmdldE1hbmFnZXI7XG4gICAgY29uc3RydWN0b3IocHJvZHVjdCwgY29ubmVjdGlvbiwgY29udGV4dElkcywgZGVmYXVsdFZpZXdwb3J0LCBwcm9jZXNzLCBjbG9zZUNhbGxiYWNrLCB0YXJnZXRGaWx0ZXJDYWxsYmFjaywgaXNQYWdlVGFyZ2V0Q2FsbGJhY2ssIHdhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cyA9IHRydWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgfHwgJ2Nocm9tZSc7XG4gICAgICAgIHRoaXMuI2RlZmF1bHRWaWV3cG9ydCA9IGRlZmF1bHRWaWV3cG9ydDtcbiAgICAgICAgdGhpcy4jcHJvY2VzcyA9IHByb2Nlc3M7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLiNjbG9zZUNhbGxiYWNrID0gY2xvc2VDYWxsYmFjayB8fCAoKCkgPT4geyB9KTtcbiAgICAgICAgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2sgPVxuICAgICAgICAgICAgdGFyZ2V0RmlsdGVyQ2FsbGJhY2sgfHxcbiAgICAgICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jc2V0SXNQYWdlVGFyZ2V0Q2FsbGJhY2soaXNQYWdlVGFyZ2V0Q2FsbGJhY2spO1xuICAgICAgICBpZiAocHJvZHVjdCA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyID0gbmV3IEZpcmVmb3hUYXJnZXRNYW5hZ2VyKGNvbm5lY3Rpb24sIHRoaXMuI2NyZWF0ZVRhcmdldCwgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jdGFyZ2V0TWFuYWdlciA9IG5ldyBDaHJvbWVUYXJnZXRNYW5hZ2VyKGNvbm5lY3Rpb24sIHRoaXMuI2NyZWF0ZVRhcmdldCwgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2ssIHdhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGVmYXVsdENvbnRleHQgPSBuZXcgQ2RwQnJvd3NlckNvbnRleHQodGhpcy4jY29ubmVjdGlvbiwgdGhpcyk7XG4gICAgICAgIGZvciAoY29uc3QgY29udGV4dElkIG9mIGNvbnRleHRJZHMpIHtcbiAgICAgICAgICAgIHRoaXMuI2NvbnRleHRzLnNldChjb250ZXh0SWQsIG5ldyBDZHBCcm93c2VyQ29udGV4dCh0aGlzLiNjb25uZWN0aW9uLCB0aGlzLCBjb250ZXh0SWQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjZW1pdERpc2Nvbm5lY3RlZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KFwiZGlzY29ubmVjdGVkXCIgLyogQnJvd3NlckV2ZW50LkRpc2Nvbm5lY3RlZCAqLywgdW5kZWZpbmVkKTtcbiAgICB9O1xuICAgIGFzeW5jIF9hdHRhY2goKSB7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24ub24oQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgdGhpcy4jZW1pdERpc2Nvbm5lY3RlZCk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0aGlzLiNvbkF0dGFjaGVkVG9UYXJnZXQpO1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLm9uKFwidGFyZ2V0R29uZVwiIC8qIFRhcmdldE1hbmFnZXJFdmVudC5UYXJnZXRHb25lICovLCB0aGlzLiNvbkRldGFjaGVkRnJvbVRhcmdldCk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXRDaGFuZ2VkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldENoYW5nZWQgKi8sIHRoaXMuI29uVGFyZ2V0Q2hhbmdlZCk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXREaXNjb3ZlcmVkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldERpc2NvdmVyZWQgKi8sIHRoaXMuI29uVGFyZ2V0RGlzY292ZXJlZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuI3RhcmdldE1hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgICBfZGV0YWNoKCkge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZihDRFBTZXNzaW9uRXZlbnQuRGlzY29ubmVjdGVkLCB0aGlzLiNlbWl0RGlzY29ubmVjdGVkKTtcbiAgICAgICAgdGhpcy4jdGFyZ2V0TWFuYWdlci5vZmYoXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0aGlzLiNvbkF0dGFjaGVkVG9UYXJnZXQpO1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLm9mZihcInRhcmdldEdvbmVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0R29uZSAqLywgdGhpcy4jb25EZXRhY2hlZEZyb21UYXJnZXQpO1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLm9mZihcInRhcmdldENoYW5nZWRcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0Q2hhbmdlZCAqLywgdGhpcy4jb25UYXJnZXRDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy4jdGFyZ2V0TWFuYWdlci5vZmYoXCJ0YXJnZXREaXNjb3ZlcmVkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldERpc2NvdmVyZWQgKi8sIHRoaXMuI29uVGFyZ2V0RGlzY292ZXJlZCk7XG4gICAgfVxuICAgIHByb2Nlc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9jZXNzID8/IG51bGw7XG4gICAgfVxuICAgIF90YXJnZXRNYW5hZ2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFyZ2V0TWFuYWdlcjtcbiAgICB9XG4gICAgI3NldElzUGFnZVRhcmdldENhbGxiYWNrKGlzUGFnZVRhcmdldENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuI2lzUGFnZVRhcmdldENhbGxiYWNrID1cbiAgICAgICAgICAgIGlzUGFnZVRhcmdldENhbGxiYWNrIHx8XG4gICAgICAgICAgICAgICAgKCh0YXJnZXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0YXJnZXQudHlwZSgpID09PSAncGFnZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC50eXBlKCkgPT09ICdiYWNrZ3JvdW5kX3BhZ2UnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQudHlwZSgpID09PSAnd2VidmlldycpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0SXNQYWdlVGFyZ2V0Q2FsbGJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc1BhZ2VUYXJnZXRDYWxsYmFjaztcbiAgICB9XG4gICAgYXN5bmMgY3JlYXRlQnJvd3NlckNvbnRleHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgcHJveHlTZXJ2ZXIsIHByb3h5QnlwYXNzTGlzdCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgeyBicm93c2VyQ29udGV4dElkIH0gPSBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5jcmVhdGVCcm93c2VyQ29udGV4dCcsIHtcbiAgICAgICAgICAgIHByb3h5U2VydmVyLFxuICAgICAgICAgICAgcHJveHlCeXBhc3NMaXN0OiBwcm94eUJ5cGFzc0xpc3QgJiYgcHJveHlCeXBhc3NMaXN0LmpvaW4oJywnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgQ2RwQnJvd3NlckNvbnRleHQodGhpcy4jY29ubmVjdGlvbiwgdGhpcywgYnJvd3NlckNvbnRleHRJZCk7XG4gICAgICAgIHRoaXMuI2NvbnRleHRzLnNldChicm93c2VyQ29udGV4dElkLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuICAgIGJyb3dzZXJDb250ZXh0cygpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLiNkZWZhdWx0Q29udGV4dCwgLi4uQXJyYXkuZnJvbSh0aGlzLiNjb250ZXh0cy52YWx1ZXMoKSldO1xuICAgIH1cbiAgICBkZWZhdWx0QnJvd3NlckNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0Q29udGV4dDtcbiAgICB9XG4gICAgYXN5bmMgX2Rpc3Bvc2VDb250ZXh0KGNvbnRleHRJZCkge1xuICAgICAgICBpZiAoIWNvbnRleHRJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LmRpc3Bvc2VCcm93c2VyQ29udGV4dCcsIHtcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IGNvbnRleHRJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2NvbnRleHRzLmRlbGV0ZShjb250ZXh0SWQpO1xuICAgIH1cbiAgICAjY3JlYXRlVGFyZ2V0ID0gKHRhcmdldEluZm8sIHNlc3Npb24pID0+IHtcbiAgICAgICAgY29uc3QgeyBicm93c2VyQ29udGV4dElkIH0gPSB0YXJnZXRJbmZvO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gYnJvd3NlckNvbnRleHRJZCAmJiB0aGlzLiNjb250ZXh0cy5oYXMoYnJvd3NlckNvbnRleHRJZClcbiAgICAgICAgICAgID8gdGhpcy4jY29udGV4dHMuZ2V0KGJyb3dzZXJDb250ZXh0SWQpXG4gICAgICAgICAgICA6IHRoaXMuI2RlZmF1bHRDb250ZXh0O1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBicm93c2VyIGNvbnRleHQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjcmVhdGVTZXNzaW9uID0gKGlzQXV0b0F0dGFjaEVtdWxhdGVkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jY29ubmVjdGlvbi5fY3JlYXRlU2Vzc2lvbih0YXJnZXRJbmZvLCBpc0F1dG9BdHRhY2hFbXVsYXRlZCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gbmV3IE90aGVyVGFyZ2V0KHRhcmdldEluZm8sIHNlc3Npb24sIGNvbnRleHQsIHRoaXMuI3RhcmdldE1hbmFnZXIsIGNyZWF0ZVNlc3Npb24pO1xuICAgICAgICBpZiAodGFyZ2V0SW5mby51cmw/LnN0YXJ0c1dpdGgoJ2RldnRvb2xzOi8vJykpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGV2VG9vbHNUYXJnZXQodGFyZ2V0SW5mbywgc2Vzc2lvbiwgY29udGV4dCwgdGhpcy4jdGFyZ2V0TWFuYWdlciwgY3JlYXRlU2Vzc2lvbiwgdGhpcy4jZGVmYXVsdFZpZXdwb3J0ID8/IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNpc1BhZ2VUYXJnZXRDYWxsYmFjayhvdGhlclRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFnZVRhcmdldCh0YXJnZXRJbmZvLCBzZXNzaW9uLCBjb250ZXh0LCB0aGlzLiN0YXJnZXRNYW5hZ2VyLCBjcmVhdGVTZXNzaW9uLCB0aGlzLiNkZWZhdWx0Vmlld3BvcnQgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldEluZm8udHlwZSA9PT0gJ3NlcnZpY2Vfd29ya2VyJyB8fFxuICAgICAgICAgICAgdGFyZ2V0SW5mby50eXBlID09PSAnc2hhcmVkX3dvcmtlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgV29ya2VyVGFyZ2V0KHRhcmdldEluZm8sIHNlc3Npb24sIGNvbnRleHQsIHRoaXMuI3RhcmdldE1hbmFnZXIsIGNyZWF0ZVNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdGhlclRhcmdldDtcbiAgICB9O1xuICAgICNvbkF0dGFjaGVkVG9UYXJnZXQgPSBhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgIGlmICh0YXJnZXQuX2lzVGFyZ2V0RXhwb3NlZCgpICYmXG4gICAgICAgICAgICAoYXdhaXQgdGFyZ2V0Ll9pbml0aWFsaXplZERlZmVycmVkLnZhbHVlT3JUaHJvdygpKSA9PT1cbiAgICAgICAgICAgICAgICBJbml0aWFsaXphdGlvblN0YXR1cy5TVUNDRVNTKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRjcmVhdGVkXCIgLyogQnJvd3NlckV2ZW50LlRhcmdldENyZWF0ZWQgKi8sIHRhcmdldCk7XG4gICAgICAgICAgICB0YXJnZXQuYnJvd3NlckNvbnRleHQoKS5lbWl0KFwidGFyZ2V0Y3JlYXRlZFwiIC8qIEJyb3dzZXJDb250ZXh0RXZlbnQuVGFyZ2V0Q3JlYXRlZCAqLywgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgI29uRGV0YWNoZWRGcm9tVGFyZ2V0ID0gYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgICB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQucmVzb2x2ZShJbml0aWFsaXphdGlvblN0YXR1cy5BQk9SVEVEKTtcbiAgICAgICAgdGFyZ2V0Ll9pc0Nsb3NlZERlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgICAgaWYgKHRhcmdldC5faXNUYXJnZXRFeHBvc2VkKCkgJiZcbiAgICAgICAgICAgIChhd2FpdCB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQudmFsdWVPclRocm93KCkpID09PVxuICAgICAgICAgICAgICAgIEluaXRpYWxpemF0aW9uU3RhdHVzLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldGRlc3Ryb3llZFwiIC8qIEJyb3dzZXJFdmVudC5UYXJnZXREZXN0cm95ZWQgKi8sIHRhcmdldCk7XG4gICAgICAgICAgICB0YXJnZXQuYnJvd3NlckNvbnRleHQoKS5lbWl0KFwidGFyZ2V0ZGVzdHJveWVkXCIgLyogQnJvd3NlckNvbnRleHRFdmVudC5UYXJnZXREZXN0cm95ZWQgKi8sIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgICNvblRhcmdldENoYW5nZWQgPSAoeyB0YXJnZXQgfSkgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRjaGFuZ2VkXCIgLyogQnJvd3NlckV2ZW50LlRhcmdldENoYW5nZWQgKi8sIHRhcmdldCk7XG4gICAgICAgIHRhcmdldC5icm93c2VyQ29udGV4dCgpLmVtaXQoXCJ0YXJnZXRjaGFuZ2VkXCIgLyogQnJvd3NlckNvbnRleHRFdmVudC5UYXJnZXRDaGFuZ2VkICovLCB0YXJnZXQpO1xuICAgIH07XG4gICAgI29uVGFyZ2V0RGlzY292ZXJlZCA9ICh0YXJnZXRJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdChcInRhcmdldGRpc2NvdmVyZWRcIiAvKiBCcm93c2VyRXZlbnQuVGFyZ2V0RGlzY292ZXJlZCAqLywgdGFyZ2V0SW5mbyk7XG4gICAgfTtcbiAgICB3c0VuZHBvaW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY29ubmVjdGlvbi51cmwoKTtcbiAgICB9XG4gICAgYXN5bmMgbmV3UGFnZSgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2RlZmF1bHRDb250ZXh0Lm5ld1BhZ2UoKTtcbiAgICB9XG4gICAgYXN5bmMgX2NyZWF0ZVBhZ2VJbkNvbnRleHQoY29udGV4dElkKSB7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0SWQgfSA9IGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LmNyZWF0ZVRhcmdldCcsIHtcbiAgICAgICAgICAgIHVybDogJ2Fib3V0OmJsYW5rJyxcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IGNvbnRleHRJZCB8fCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSAoYXdhaXQgdGhpcy53YWl0Rm9yVGFyZ2V0KHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHQuX3RhcmdldElkID09PSB0YXJnZXRJZDtcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHRhcmdldCBmb3IgcGFnZSAoaWQgPSAke3RhcmdldElkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbml0aWFsaXplZCA9IChhd2FpdCB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQudmFsdWVPclRocm93KCkpID09PVxuICAgICAgICAgICAgSW5pdGlhbGl6YXRpb25TdGF0dXMuU1VDQ0VTUztcbiAgICAgICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHRhcmdldCBmb3IgcGFnZSAoaWQgPSAke3RhcmdldElkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGFyZ2V0LnBhZ2UoKTtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgYSBwYWdlIGZvciBjb250ZXh0IChpZCA9ICR7Y29udGV4dElkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICB9XG4gICAgdGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy4jdGFyZ2V0TWFuYWdlci5nZXRBdmFpbGFibGVUYXJnZXRzKCkudmFsdWVzKCkpLmZpbHRlcih0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICh0YXJnZXQuX2lzVGFyZ2V0RXhwb3NlZCgpICYmXG4gICAgICAgICAgICAgICAgdGFyZ2V0Ll9pbml0aWFsaXplZERlZmVycmVkLnZhbHVlKCkgPT09IEluaXRpYWxpemF0aW9uU3RhdHVzLlNVQ0NFU1MpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGFyZ2V0KCkge1xuICAgICAgICBjb25zdCBicm93c2VyVGFyZ2V0ID0gdGhpcy50YXJnZXRzKCkuZmluZCh0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC50eXBlKCkgPT09ICdicm93c2VyJztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghYnJvd3NlclRhcmdldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyIHRhcmdldCBpcyBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnJvd3NlclRhcmdldDtcbiAgICB9XG4gICAgYXN5bmMgdmVyc2lvbigpIHtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IHRoaXMuI2dldFZlcnNpb24oKTtcbiAgICAgICAgcmV0dXJuIHZlcnNpb24ucHJvZHVjdDtcbiAgICB9XG4gICAgYXN5bmMgdXNlckFnZW50KCkge1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgdGhpcy4jZ2V0VmVyc2lvbigpO1xuICAgICAgICByZXR1cm4gdmVyc2lvbi51c2VyQWdlbnQ7XG4gICAgfVxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjbG9zZUNhbGxiYWNrLmNhbGwobnVsbCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuX2RldGFjaCgpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGdldCBjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy4jY29ubmVjdGlvbi5fY2xvc2VkO1xuICAgIH1cbiAgICAjZ2V0VmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnQnJvd3Nlci5nZXRWZXJzaW9uJyk7XG4gICAgfVxuICAgIGdldCBkZWJ1Z0luZm8oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwZW5kaW5nUHJvdG9jb2xFcnJvcnM6IHRoaXMuI2Nvbm5lY3Rpb24uZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCksXG4gICAgICAgIH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3Nlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgZGVidWdFcnJvciwgREVGQVVMVF9WSUVXUE9SVCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IENkcEJyb3dzZXIgfSBmcm9tICcuL0Jyb3dzZXIuanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gJy4vQ29ubmVjdGlvbi5qcyc7XG4vKipcbiAqIFVzZXJzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgZGlyZWN0bHk7IGl0J3MgY2FsbGVkIHdoZW4gY2FsbGluZ1xuICogYHB1cHBldGVlci5jb25uZWN0YCB3aXRoIGBwcm90b2NvbDogJ2NkcCdgLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2Nvbm5lY3RUb0NkcEJyb3dzZXIoY29ubmVjdGlvblRyYW5zcG9ydCwgdXJsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyBpZ25vcmVIVFRQU0Vycm9ycyA9IGZhbHNlLCBkZWZhdWx0Vmlld3BvcnQgPSBERUZBVUxUX1ZJRVdQT1JULCB0YXJnZXRGaWx0ZXIsIF9pc1BhZ2VUYXJnZXQ6IGlzUGFnZVRhcmdldCwgc2xvd01vID0gMCwgcHJvdG9jb2xUaW1lb3V0LCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24odXJsLCBjb25uZWN0aW9uVHJhbnNwb3J0LCBzbG93TW8sIHByb3RvY29sVGltZW91dCk7XG4gICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnQnJvd3Nlci5nZXRWZXJzaW9uJyk7XG4gICAgY29uc3QgcHJvZHVjdCA9IHZlcnNpb24ucHJvZHVjdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdmaXJlZm94JylcbiAgICAgICAgPyAnZmlyZWZveCdcbiAgICAgICAgOiAnY2hyb21lJztcbiAgICBjb25zdCB7IGJyb3dzZXJDb250ZXh0SWRzIH0gPSBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5nZXRCcm93c2VyQ29udGV4dHMnKTtcbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgQ2RwQnJvd3Nlci5fY3JlYXRlKHByb2R1Y3QgfHwgJ2Nocm9tZScsIGNvbm5lY3Rpb24sIGJyb3dzZXJDb250ZXh0SWRzLCBpZ25vcmVIVFRQU0Vycm9ycywgZGVmYXVsdFZpZXdwb3J0LCB1bmRlZmluZWQsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uc2VuZCgnQnJvd3Nlci5jbG9zZScpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgIH0sIHRhcmdldEZpbHRlciwgaXNQYWdlVGFyZ2V0KTtcbiAgICByZXR1cm4gYnJvd3Nlcjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJDb25uZWN0b3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjQgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBXRUJfUEVSTUlTU0lPTl9UT19QUk9UT0NPTF9QRVJNSVNTSU9OLCB9IGZyb20gJy4uL2FwaS9Ccm93c2VyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJDb250ZXh0IH0gZnJvbSAnLi4vYXBpL0Jyb3dzZXJDb250ZXh0LmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBCcm93c2VyQ29udGV4dCBleHRlbmRzIEJyb3dzZXJDb250ZXh0IHtcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjYnJvd3NlcjtcbiAgICAjaWQ7XG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbiwgYnJvd3NlciwgY29udGV4dElkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLiNicm93c2VyID0gYnJvd3NlcjtcbiAgICAgICAgdGhpcy4jaWQgPSBjb250ZXh0SWQ7XG4gICAgfVxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lkO1xuICAgIH1cbiAgICB0YXJnZXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3Nlci50YXJnZXRzKCkuZmlsdGVyKHRhcmdldCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmJyb3dzZXJDb250ZXh0KCkgPT09IHRoaXM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBwYWdlcygpIHtcbiAgICAgICAgY29uc3QgcGFnZXMgPSBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnRhcmdldHMoKVxuICAgICAgICAgICAgLmZpbHRlcih0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICh0YXJnZXQudHlwZSgpID09PSAncGFnZScgfHxcbiAgICAgICAgICAgICAgICAodGFyZ2V0LnR5cGUoKSA9PT0gJ290aGVyJyAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNicm93c2VyLl9nZXRJc1BhZ2VUYXJnZXRDYWxsYmFjaygpPy4odGFyZ2V0KSkpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLm1hcCh0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5wYWdlKCk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgcmV0dXJuIHBhZ2VzLmZpbHRlcigocGFnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICEhcGFnZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlzSW5jb2duaXRvKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLiNpZDtcbiAgICB9XG4gICAgYXN5bmMgb3ZlcnJpZGVQZXJtaXNzaW9ucyhvcmlnaW4sIHBlcm1pc3Npb25zKSB7XG4gICAgICAgIGNvbnN0IHByb3RvY29sUGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucy5tYXAocGVybWlzc2lvbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm90b2NvbFBlcm1pc3Npb24gPSBXRUJfUEVSTUlTU0lPTl9UT19QUk9UT0NPTF9QRVJNSVNTSU9OLmdldChwZXJtaXNzaW9uKTtcbiAgICAgICAgICAgIGlmICghcHJvdG9jb2xQZXJtaXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHBlcm1pc3Npb246ICcgKyBwZXJtaXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm90b2NvbFBlcm1pc3Npb247XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ0Jyb3dzZXIuZ3JhbnRQZXJtaXNzaW9ucycsIHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IHRoaXMuI2lkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBwcm90b2NvbFBlcm1pc3Npb25zLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgY2xlYXJQZXJtaXNzaW9uT3ZlcnJpZGVzKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ0Jyb3dzZXIucmVzZXRQZXJtaXNzaW9ucycsIHtcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IHRoaXMuI2lkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIG5ld1BhZ2UoKSB7XG4gICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgX2d1YXJkID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHRoaXMud2FpdEZvclNjcmVlbnNob3RPcGVyYXRpb25zKCksIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNicm93c2VyLl9jcmVhdGVQYWdlSW5Db250ZXh0KHRoaXMuI2lkKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnJvd3NlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Jyb3dzZXI7XG4gICAgfVxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jaWQsICdOb24taW5jb2duaXRvIHByb2ZpbGVzIGNhbm5vdCBiZSBjbG9zZWQhJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2Jyb3dzZXIuX2Rpc3Bvc2VDb250ZXh0KHRoaXMuI2lkKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyQ29udGV4dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbiwgQ0RQU2Vzc2lvbkV2ZW50LCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IENhbGxiYWNrUmVnaXN0cnkgfSBmcm9tICcuLi9jb21tb24vQ2FsbGJhY2tSZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyBUYXJnZXRDbG9zZUVycm9yIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm90b2NvbEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBDRFBTZXNzaW9uIGV4dGVuZHMgQ0RQU2Vzc2lvbiB7XG4gICAgI3Nlc3Npb25JZDtcbiAgICAjdGFyZ2V0VHlwZTtcbiAgICAjY2FsbGJhY2tzID0gbmV3IENhbGxiYWNrUmVnaXN0cnkoKTtcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjcGFyZW50U2Vzc2lvbklkO1xuICAgICN0YXJnZXQ7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbiwgdGFyZ2V0VHlwZSwgc2Vzc2lvbklkLCBwYXJlbnRTZXNzaW9uSWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIHRoaXMuI3RhcmdldFR5cGUgPSB0YXJnZXRUeXBlO1xuICAgICAgICB0aGlzLiNzZXNzaW9uSWQgPSBzZXNzaW9uSWQ7XG4gICAgICAgIHRoaXMuI3BhcmVudFNlc3Npb25JZCA9IHBhcmVudFNlc3Npb25JZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUge0BsaW5rIENkcFRhcmdldH0gYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3NldFRhcmdldCh0YXJnZXQpIHtcbiAgICAgICAgdGhpcy4jdGFyZ2V0ID0gdGFyZ2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB7QGxpbmsgQ2RwVGFyZ2V0fSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfdGFyZ2V0KCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jdGFyZ2V0LCAnVGFyZ2V0IG11c3QgZXhpc3QnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhcmdldDtcbiAgICB9XG4gICAgY29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Nvbm5lY3Rpb247XG4gICAgfVxuICAgIHBhcmVudFNlc3Npb24oKSB7XG4gICAgICAgIGlmICghdGhpcy4jcGFyZW50U2Vzc2lvbklkKSB7XG4gICAgICAgICAgICAvLyBUbyBtYWtlIGl0IHdvcmsgaW4gRmlyZWZveCB0aGF0IGRvZXMgbm90IGhhdmUgcGFyZW50ICh0YWIpIHNlc3Npb25zLlxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy4jY29ubmVjdGlvbj8uc2Vzc2lvbih0aGlzLiNwYXJlbnRTZXNzaW9uSWQpO1xuICAgICAgICByZXR1cm4gcGFyZW50ID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc2VuZChtZXRob2QsIHBhcmFtcywgb3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuI2Nvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVGFyZ2V0Q2xvc2VFcnJvcihgUHJvdG9jb2wgZXJyb3IgKCR7bWV0aG9kfSk6IFNlc3Npb24gY2xvc2VkLiBNb3N0IGxpa2VseSB0aGUgJHt0aGlzLiN0YXJnZXRUeXBlfSBoYXMgYmVlbiBjbG9zZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNjb25uZWN0aW9uLl9yYXdTZW5kKHRoaXMuI2NhbGxiYWNrcywgbWV0aG9kLCBwYXJhbXMsIHRoaXMuI3Nlc3Npb25JZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbk1lc3NhZ2Uob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QuaWQpIHtcbiAgICAgICAgICAgIGlmIChvYmplY3QuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjYWxsYmFja3MucmVqZWN0KG9iamVjdC5pZCwgY3JlYXRlUHJvdG9jb2xFcnJvck1lc3NhZ2Uob2JqZWN0KSwgb2JqZWN0LmVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY2FsbGJhY2tzLnJlc29sdmUob2JqZWN0LmlkLCBvYmplY3QucmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydCghb2JqZWN0LmlkKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChvYmplY3QubWV0aG9kLCBvYmplY3QucGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXRhY2hlcyB0aGUgY2RwU2Vzc2lvbiBmcm9tIHRoZSB0YXJnZXQuIE9uY2UgZGV0YWNoZWQsIHRoZSBjZHBTZXNzaW9uIG9iamVjdFxuICAgICAqIHdvbid0IGVtaXQgYW55IGV2ZW50cyBhbmQgY2FuJ3QgYmUgdXNlZCB0byBzZW5kIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIGFzeW5jIGRldGFjaCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNjb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlc3Npb24gYWxyZWFkeSBkZXRhY2hlZC4gTW9zdCBsaWtlbHkgdGhlICR7dGhpcy4jdGFyZ2V0VHlwZX0gaGFzIGJlZW4gY2xvc2VkLmApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LmRldGFjaEZyb21UYXJnZXQnLCB7XG4gICAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuI3Nlc3Npb25JZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbkNsb3NlZCgpIHtcbiAgICAgICAgdGhpcy4jY2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZW1pdChDRFBTZXNzaW9uRXZlbnQuRGlzY29ubmVjdGVkLCB1bmRlZmluZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uJ3MgaWQuXG4gICAgICovXG4gICAgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzZXNzaW9uSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldFBlbmRpbmdQcm90b2NvbEVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NhbGxiYWNrcy5nZXRQZW5kaW5nUHJvdG9jb2xFcnJvcnMoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DRFBTZXNzaW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwUHJlbG9hZFNjcmlwdCB7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgSUQgb2YgdGhlIHByZWxvYWQgc2NyaXB0IHJldHVybmVkIGJ5XG4gICAgICogUGFnZS5hZGRTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCBpbiB0aGUgbWFpbiBmcmFtZS5cbiAgICAgKlxuICAgICAqIFN1Yi1mcmFtZXMgd291bGQgZ2V0IGEgZGlmZmVyZW50IENEUCBJRCBiZWNhdXNlXG4gICAgICogYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQgaXMgY2FsbGVkIGZvciBlYWNoIHN1YmZyYW1lLiBCdXRcbiAgICAgKiB1c2VycyBvbmx5IHNlZSB0aGlzIElEIGFuZCBzdWJmcmFtZSBJRHMgYXJlIGludGVybmFsIHRvIFB1cHBldGVlci5cbiAgICAgKi9cbiAgICAjaWQ7XG4gICAgI3NvdXJjZTtcbiAgICAjZnJhbWVUb0lkID0gbmV3IFdlYWtNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihtYWluRnJhbWUsIGlkLCBzb3VyY2UpIHtcbiAgICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICAgICAgdGhpcy4jc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLiNmcmFtZVRvSWQuc2V0KG1haW5GcmFtZSwgaWQpO1xuICAgIH1cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpZDtcbiAgICB9XG4gICAgZ2V0IHNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NvdXJjZTtcbiAgICB9XG4gICAgZ2V0SWRGb3JGcmFtZShmcmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVUb0lkLmdldChmcmFtZSk7XG4gICAgfVxuICAgIHNldElkRm9yRnJhbWUoZnJhbWUsIGlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy4jZnJhbWVUb0lkLnNldChmcmFtZSwgaWRlbnRpZmllcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2RwUHJlbG9hZFNjcmlwdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbiwgQ0RQU2Vzc2lvbkV2ZW50IH0gZnJvbSAnLi4vYXBpL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IENkcFRhcmdldCwgSW5pdGlhbGl6YXRpb25TdGF0dXMgfSBmcm9tICcuL1RhcmdldC5qcyc7XG5mdW5jdGlvbiBpc1BhZ2VUYXJnZXRCZWNvbWluZ1ByaW1hcnkodGFyZ2V0LCBuZXdUYXJnZXRJbmZvKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGFyZ2V0Ll9zdWJ0eXBlKCkpICYmICFuZXdUYXJnZXRJbmZvLnN1YnR5cGU7XG59XG4vKipcbiAqIENocm9tZVRhcmdldE1hbmFnZXIgdXNlcyB0aGUgQ0RQJ3MgYXV0by1hdHRhY2ggbWVjaGFuaXNtIHRvIGludGVyY2VwdFxuICogbmV3IHRhcmdldHMgYW5kIGFsbG93IHRoZSByZXN0IG9mIFB1cHBldGVlciB0byBjb25maWd1cmUgbGlzdGVuZXJzIHdoaWxlXG4gKiB0aGUgdGFyZ2V0IGlzIHBhdXNlZC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENocm9tZVRhcmdldE1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNjb25uZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzOiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnLFxuICAgICAqICdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJywgJ1RhcmdldC50YXJnZXRJbmZvQ2hhbmdlZCcuXG4gICAgICpcbiAgICAgKiBBIHRhcmdldCBiZWNvbWVzIGRpc2NvdmVyZWQgd2hlbiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnIGlzIHJlY2VpdmVkLlxuICAgICAqIEEgdGFyZ2V0IGlzIHJlbW92ZWQgZnJvbSB0aGlzIG1hcCBvbmNlICdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJyBpc1xuICAgICAqIHJlY2VpdmVkLlxuICAgICAqXG4gICAgICogYHRhcmdldEZpbHRlckNhbGxiYWNrYCBoYXMgbm8gZWZmZWN0IG9uIHRoaXMgbWFwLlxuICAgICAqL1xuICAgICNkaXNjb3ZlcmVkVGFyZ2V0c0J5VGFyZ2V0SWQgPSBuZXcgTWFwKCk7XG4gICAgLyoqXG4gICAgICogQSB0YXJnZXQgaXMgYWRkZWQgdG8gdGhpcyBtYXAgb25jZSBDaHJvbWVUYXJnZXRNYW5hZ2VyIGhhcyBjcmVhdGVkXG4gICAgICogYSBUYXJnZXQgYW5kIGF0dGFjaGVkIGF0IGxlYXN0IG9uY2UgdG8gaXQuXG4gICAgICovXG4gICAgI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQgPSBuZXcgTWFwKCk7XG4gICAgLyoqXG4gICAgICogVHJhY2tzIHdoaWNoIHNlc3Npb25zIGF0dGFjaCB0byB3aGljaCB0YXJnZXQuXG4gICAgICovXG4gICAgI2F0dGFjaGVkVGFyZ2V0c0J5U2Vzc2lvbklkID0gbmV3IE1hcCgpO1xuICAgIC8qKlxuICAgICAqIElmIGEgdGFyZ2V0IHdhcyBmaWx0ZXJlZCBvdXQgYnkgYHRhcmdldEZpbHRlckNhbGxiYWNrYCwgd2Ugc3RpbGwgcmVjZWl2ZVxuICAgICAqIGV2ZW50cyBhYm91dCBpdCBmcm9tIENEUCwgYnV0IHdlIGRvbid0IGZvcndhcmQgdGhlbSB0byB0aGUgcmVzdCBvZiBQdXBwZXRlZXIuXG4gICAgICovXG4gICAgI2lnbm9yZWRUYXJnZXRzID0gbmV3IFNldCgpO1xuICAgICN0YXJnZXRGaWx0ZXJDYWxsYmFjaztcbiAgICAjdGFyZ2V0RmFjdG9yeTtcbiAgICAjYXR0YWNoZWRUb1RhcmdldExpc3RlbmVyc0J5U2Vzc2lvbiA9IG5ldyBXZWFrTWFwKCk7XG4gICAgI2RldGFjaGVkRnJvbVRhcmdldExpc3RlbmVyc0J5U2Vzc2lvbiA9IG5ldyBXZWFrTWFwKCk7XG4gICAgI2luaXRpYWxpemVEZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICN0YXJnZXRzSWRzRm9ySW5pdCA9IG5ldyBTZXQoKTtcbiAgICAjd2FpdEZvckluaXRpYWxseURpc2NvdmVyZWRUYXJnZXRzID0gdHJ1ZTtcbiAgICAjZGlzY292ZXJ5RmlsdGVyID0gW3t9XTtcbiAgICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uLCB0YXJnZXRGYWN0b3J5LCB0YXJnZXRGaWx0ZXJDYWxsYmFjaywgd2FpdEZvckluaXRpYWxseURpc2NvdmVyZWRUYXJnZXRzID0gdHJ1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2sgPSB0YXJnZXRGaWx0ZXJDYWxsYmFjaztcbiAgICAgICAgdGhpcy4jdGFyZ2V0RmFjdG9yeSA9IHRhcmdldEZhY3Rvcnk7XG4gICAgICAgIHRoaXMuI3dhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cyA9IHdhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cztcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vbignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKCdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJywgdGhpcy4jb25UYXJnZXREZXN0cm95ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKCdUYXJnZXQudGFyZ2V0SW5mb0NoYW5nZWQnLCB0aGlzLiNvblRhcmdldEluZm9DaGFuZ2VkKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vbihDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCB0aGlzLiNvblNlc3Npb25EZXRhY2hlZCk7XG4gICAgICAgIHRoaXMuI3NldHVwQXR0YWNobWVudExpc3RlbmVycyh0aGlzLiNjb25uZWN0aW9uKTtcbiAgICB9XG4gICAgI3N0b3JlRXhpc3RpbmdUYXJnZXRzRm9ySW5pdCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLiN3YWl0Rm9ySW5pdGlhbGx5RGlzY292ZXJlZFRhcmdldHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFt0YXJnZXRJZCwgdGFyZ2V0SW5mbyxdIG9mIHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEZvckZpbHRlciA9IG5ldyBDZHBUYXJnZXQodGFyZ2V0SW5mbywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRoaXMsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAvLyBUYXJnZXRzIGZyb20gZXh0ZW5zaW9ucyBhbmQgdGhlIGJyb3dzZXIgdGhhdCB3aWxsIG5vdCBiZVxuICAgICAgICAgICAgLy8gYXV0by1hdHRhY2hlZC4gVGhlcmVmb3JlLCB3ZSBzaG91bGQgbm90IGFkZCB0aGVtIHRvXG4gICAgICAgICAgICAvLyAjdGFyZ2V0c0lkc0ZvckluaXQuXG4gICAgICAgICAgICBjb25zdCBza2lwVGFyZ2V0ID0gdGFyZ2V0SW5mby50eXBlID09PSAnYnJvd3NlcicgfHxcbiAgICAgICAgICAgICAgICB0YXJnZXRJbmZvLnVybC5zdGFydHNXaXRoKCdjaHJvbWUtZXh0ZW5zaW9uOi8vJyk7XG4gICAgICAgICAgICBpZiAoKCF0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayB8fFxuICAgICAgICAgICAgICAgIHRoaXMuI3RhcmdldEZpbHRlckNhbGxiYWNrKHRhcmdldEZvckZpbHRlcikpICYmXG4gICAgICAgICAgICAgICAgIXNraXBUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdC5hZGQodGFyZ2V0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBhc3luYyBpbml0aWFsaXplKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5zZXREaXNjb3ZlclRhcmdldHMnLCB7XG4gICAgICAgICAgICBkaXNjb3ZlcjogdHJ1ZSxcbiAgICAgICAgICAgIGZpbHRlcjogdGhpcy4jZGlzY292ZXJ5RmlsdGVyLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jc3RvcmVFeGlzdGluZ1RhcmdldHNGb3JJbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LnNldEF1dG9BdHRhY2gnLCB7XG4gICAgICAgICAgICB3YWl0Rm9yRGVidWdnZXJPblN0YXJ0OiB0cnVlLFxuICAgICAgICAgICAgZmxhdHRlbjogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9BdHRhY2g6IHRydWUsXG4gICAgICAgICAgICBmaWx0ZXI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuI2Rpc2NvdmVyeUZpbHRlcixcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkoKTtcbiAgICAgICAgYXdhaXQgdGhpcy4jaW5pdGlhbGl6ZURlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgIH1cbiAgICBnZXRDaGlsZFRhcmdldHModGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQuX2NoaWxkVGFyZ2V0cygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldERlc3Ryb3llZCcsIHRoaXMuI29uVGFyZ2V0RGVzdHJveWVkKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vZmYoJ1RhcmdldC50YXJnZXRJbmZvQ2hhbmdlZCcsIHRoaXMuI29uVGFyZ2V0SW5mb0NoYW5nZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZihDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCB0aGlzLiNvblNlc3Npb25EZXRhY2hlZCk7XG4gICAgICAgIHRoaXMuI3JlbW92ZUF0dGFjaG1lbnRMaXN0ZW5lcnModGhpcy4jY29ubmVjdGlvbik7XG4gICAgfVxuICAgIGdldEF2YWlsYWJsZVRhcmdldHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkO1xuICAgIH1cbiAgICAjc2V0dXBBdHRhY2htZW50TGlzdGVuZXJzKHNlc3Npb24pIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KHNlc3Npb24sIGV2ZW50KTtcbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSk7XG4gICAgICAgIHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uc2V0KHNlc3Npb24sIGxpc3RlbmVyKTtcbiAgICAgICAgc2Vzc2lvbi5vbignVGFyZ2V0LmF0dGFjaGVkVG9UYXJnZXQnLCBsaXN0ZW5lcik7XG4gICAgICAgIGNvbnN0IGRldGFjaGVkTGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNvbkRldGFjaGVkRnJvbVRhcmdldChzZXNzaW9uLCBldmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIGFzc2VydCghdGhpcy4jZGV0YWNoZWRGcm9tVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSk7XG4gICAgICAgIHRoaXMuI2RldGFjaGVkRnJvbVRhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5zZXQoc2Vzc2lvbiwgZGV0YWNoZWRMaXN0ZW5lcik7XG4gICAgICAgIHNlc3Npb24ub24oJ1RhcmdldC5kZXRhY2hlZEZyb21UYXJnZXQnLCBkZXRhY2hlZExpc3RlbmVyKTtcbiAgICB9XG4gICAgI3JlbW92ZUF0dGFjaG1lbnRMaXN0ZW5lcnMoc2Vzc2lvbikge1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uZ2V0KHNlc3Npb24pO1xuICAgICAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHNlc3Npb24ub2ZmKCdUYXJnZXQuYXR0YWNoZWRUb1RhcmdldCcsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uZGVsZXRlKHNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNkZXRhY2hlZEZyb21UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uaGFzKHNlc3Npb24pKSB7XG4gICAgICAgICAgICBzZXNzaW9uLm9mZignVGFyZ2V0LmRldGFjaGVkRnJvbVRhcmdldCcsIHRoaXMuI2RldGFjaGVkRnJvbVRhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5nZXQoc2Vzc2lvbikpO1xuICAgICAgICAgICAgdGhpcy4jZGV0YWNoZWRGcm9tVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmRlbGV0ZShzZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjb25TZXNzaW9uRGV0YWNoZWQgPSAoc2Vzc2lvbikgPT4ge1xuICAgICAgICB0aGlzLiNyZW1vdmVBdHRhY2htZW50TGlzdGVuZXJzKHNlc3Npb24pO1xuICAgIH07XG4gICAgI29uVGFyZ2V0Q3JlYXRlZCA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLiNkaXNjb3ZlcmVkVGFyZ2V0c0J5VGFyZ2V0SWQuc2V0KGV2ZW50LnRhcmdldEluZm8udGFyZ2V0SWQsIGV2ZW50LnRhcmdldEluZm8pO1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXREaXNjb3ZlcmVkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldERpc2NvdmVyZWQgKi8sIGV2ZW50LnRhcmdldEluZm8pO1xuICAgICAgICAvLyBUaGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZSBicm93c2VyIHRhcmdldCBpbXBsaWNpdGx5LFxuICAgICAgICAvLyB0aGVyZWZvcmUsIG5vIG5ldyBDRFBTZXNzaW9uIGlzIGNyZWF0ZWQgYW5kIHdlIGhhdmUgc3BlY2lhbCBoYW5kbGluZ1xuICAgICAgICAvLyBoZXJlLlxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0SW5mby50eXBlID09PSAnYnJvd3NlcicgJiYgZXZlbnQudGFyZ2V0SW5mby5hdHRhY2hlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuaGFzKGV2ZW50LnRhcmdldEluZm8udGFyZ2V0SWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4jdGFyZ2V0RmFjdG9yeShldmVudC50YXJnZXRJbmZvLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgdGFyZ2V0Ll9pbml0aWFsaXplKCk7XG4gICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLnNldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAjb25UYXJnZXREZXN0cm95ZWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5mbyA9IHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5nZXQoZXZlbnQudGFyZ2V0SWQpO1xuICAgICAgICB0aGlzLiNkaXNjb3ZlcmVkVGFyZ2V0c0J5VGFyZ2V0SWQuZGVsZXRlKGV2ZW50LnRhcmdldElkKTtcbiAgICAgICAgdGhpcy4jZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KGV2ZW50LnRhcmdldElkKTtcbiAgICAgICAgaWYgKHRhcmdldEluZm8/LnR5cGUgPT09ICdzZXJ2aWNlX3dvcmtlcicgJiZcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuaGFzKGV2ZW50LnRhcmdldElkKSkge1xuICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzZXJ2aWNlIHdvcmtlcnM6IHJlcG9ydCBUYXJnZXRHb25lIGV2ZW50IHdoZW5cbiAgICAgICAgICAgIC8vIHRoZSB3b3JrZXIgaXMgZGVzdHJveWVkLlxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4jYXR0YWNoZWRUYXJnZXRzQnlUYXJnZXRJZC5nZXQoZXZlbnQudGFyZ2V0SWQpO1xuICAgICAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldEdvbmVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0R29uZSAqLywgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmRlbGV0ZShldmVudC50YXJnZXRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgICNvblRhcmdldEluZm9DaGFuZ2VkID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5zZXQoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCwgZXZlbnQudGFyZ2V0SW5mbyk7XG4gICAgICAgIGlmICh0aGlzLiNpZ25vcmVkVGFyZ2V0cy5oYXMoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCkgfHxcbiAgICAgICAgICAgICF0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmhhcyhldmVudC50YXJnZXRJbmZvLnRhcmdldElkKSB8fFxuICAgICAgICAgICAgIWV2ZW50LnRhcmdldEluZm8uYXR0YWNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmdldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2aW91c1VSTCA9IHRhcmdldC51cmwoKTtcbiAgICAgICAgY29uc3Qgd2FzSW5pdGlhbGl6ZWQgPSB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQudmFsdWUoKSA9PT0gSW5pdGlhbGl6YXRpb25TdGF0dXMuU1VDQ0VTUztcbiAgICAgICAgaWYgKGlzUGFnZVRhcmdldEJlY29taW5nUHJpbWFyeSh0YXJnZXQsIGV2ZW50LnRhcmdldEluZm8pKSB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gdGFyZ2V0Py5fc2Vzc2lvbigpO1xuICAgICAgICAgICAgYXNzZXJ0KHNlc3Npb24sICdUYXJnZXQgdGhhdCBpcyBiZWluZyBhY3RpdmF0ZWQgaXMgbWlzc2luZyBhIENEUFNlc3Npb24uJyk7XG4gICAgICAgICAgICBzZXNzaW9uLnBhcmVudFNlc3Npb24oKT8uZW1pdChDRFBTZXNzaW9uRXZlbnQuU3dhcHBlZCwgc2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0Ll90YXJnZXRJbmZvQ2hhbmdlZChldmVudC50YXJnZXRJbmZvKTtcbiAgICAgICAgaWYgKHdhc0luaXRpYWxpemVkICYmIHByZXZpb3VzVVJMICE9PSB0YXJnZXQudXJsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldENoYW5nZWRcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0Q2hhbmdlZCAqLywge1xuICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICB3YXNJbml0aWFsaXplZCxcbiAgICAgICAgICAgICAgICBwcmV2aW91c1VSTCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAjb25BdHRhY2hlZFRvVGFyZ2V0ID0gYXN5bmMgKHBhcmVudFNlc3Npb24sIGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZm8gPSBldmVudC50YXJnZXRJbmZvO1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy4jY29ubmVjdGlvbi5zZXNzaW9uKGV2ZW50LnNlc3Npb25JZCk7XG4gICAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXNzaW9uICR7ZXZlbnQuc2Vzc2lvbklkfSB3YXMgbm90IGNyZWF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2lsZW50RGV0YWNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kKCdSdW50aW1lLnJ1bklmV2FpdGluZ0ZvckRlYnVnZ2VyJykuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCB1c2UgYHNlc3Npb24uZGV0YWNoKClgIGJlY2F1c2UgdGhhdCBkaXNwYXRjaGVzIGFsbCBjb21tYW5kcyBvblxuICAgICAgICAgICAgLy8gdGhlIGNvbm5lY3Rpb24gaW5zdGVhZCBvZiB0aGUgcGFyZW50IHNlc3Npb24uXG4gICAgICAgICAgICBhd2FpdCBwYXJlbnRTZXNzaW9uXG4gICAgICAgICAgICAgICAgLnNlbmQoJ1RhcmdldC5kZXRhY2hGcm9tVGFyZ2V0Jywge1xuICAgICAgICAgICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbi5pZCgpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGlmICghdGhpcy4jY29ubmVjdGlvbi5pc0F1dG9BdHRhY2hlZCh0YXJnZXRJbmZvLnRhcmdldElkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3Igc2VydmljZSB3b3JrZXJzOiBiZWluZyBhdHRhY2hlZCB0byBzZXJ2aWNlIHdvcmtlcnMgd2lsbFxuICAgICAgICAvLyBwcmV2ZW50IHRoZW0gZnJvbSBldmVyIGJlaW5nIGRlc3Ryb3llZC4gVGhlcmVmb3JlLCB3ZSBzaWxlbnRseSBkZXRhY2hcbiAgICAgICAgLy8gZnJvbSBzZXJ2aWNlIHdvcmtlcnMgdW5sZXNzIHRoZSBjb25uZWN0aW9uIHdhcyBtYW51YWxseSBjcmVhdGVkIHZpYVxuICAgICAgICAvLyBgcGFnZS53b3JrZXIoKWAuIFRvIGRldGVybWluZSB0aGlzLCB3ZSB1c2VcbiAgICAgICAgLy8gYHRoaXMuI2Nvbm5lY3Rpb24uaXNBdXRvQXR0YWNoZWQodGFyZ2V0SW5mby50YXJnZXRJZClgLiBJbiB0aGUgZnV0dXJlLCB3ZVxuICAgICAgICAvLyBzaG91bGQgZGV0ZXJtaW5lIGlmIGEgdGFyZ2V0IGlzIGF1dG8tYXR0YWNoZWQgb3Igbm90IHdpdGggdGhlIGhlbHAgb2ZcbiAgICAgICAgLy8gQ0RQLlxuICAgICAgICBpZiAodGFyZ2V0SW5mby50eXBlID09PSAnc2VydmljZV93b3JrZXInKSB7XG4gICAgICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgICAgICBhd2FpdCBzaWxlbnREZXRhY2goKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmhhcyh0YXJnZXRJbmZvLnRhcmdldElkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI3RhcmdldEZhY3RvcnkodGFyZ2V0SW5mbyk7XG4gICAgICAgICAgICB0YXJnZXQuX2luaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuc2V0KHRhcmdldEluZm8udGFyZ2V0SWQsIHRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0YXJnZXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzRXhpc3RpbmdUYXJnZXQgPSB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmhhcyh0YXJnZXRJbmZvLnRhcmdldElkKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNFeGlzdGluZ1RhcmdldFxuICAgICAgICAgICAgPyB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmdldCh0YXJnZXRJbmZvLnRhcmdldElkKVxuICAgICAgICAgICAgOiB0aGlzLiN0YXJnZXRGYWN0b3J5KHRhcmdldEluZm8sIHNlc3Npb24sIHBhcmVudFNlc3Npb24gaW5zdGFuY2VvZiBDRFBTZXNzaW9uID8gcGFyZW50U2Vzc2lvbiA6IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayAmJiAhdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2sodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhpcy4jaWdub3JlZFRhcmdldHMuYWRkKHRhcmdldEluZm8udGFyZ2V0SWQpO1xuICAgICAgICAgICAgdGhpcy4jZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KHRhcmdldEluZm8udGFyZ2V0SWQpO1xuICAgICAgICAgICAgYXdhaXQgc2lsZW50RGV0YWNoKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc2V0dXBBdHRhY2htZW50TGlzdGVuZXJzKHNlc3Npb24pO1xuICAgICAgICBpZiAoaXNFeGlzdGluZ1RhcmdldCkge1xuICAgICAgICAgICAgc2Vzc2lvbi5fc2V0VGFyZ2V0KHRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVNlc3Npb25JZC5zZXQoc2Vzc2lvbi5pZCgpLCB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmdldCh0YXJnZXRJbmZvLnRhcmdldElkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXQuX2luaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuc2V0KHRhcmdldEluZm8udGFyZ2V0SWQsIHRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVNlc3Npb25JZC5zZXQoc2Vzc2lvbi5pZCgpLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudFRhcmdldCA9IHBhcmVudFNlc3Npb24gaW5zdGFuY2VvZiBDRFBTZXNzaW9uXG4gICAgICAgICAgICA/IHBhcmVudFNlc3Npb24uX3RhcmdldCgpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIHBhcmVudFRhcmdldD8uX2FkZENoaWxkVGFyZ2V0KHRhcmdldCk7XG4gICAgICAgIHBhcmVudFNlc3Npb24uZW1pdChDRFBTZXNzaW9uRXZlbnQuUmVhZHksIHNlc3Npb24pO1xuICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdC5kZWxldGUodGFyZ2V0Ll90YXJnZXRJZCk7XG4gICAgICAgIGlmICghaXNFeGlzdGluZ1RhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwidGFyZ2V0QXZhaWxhYmxlXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldEF2YWlsYWJsZSAqLywgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkoKTtcbiAgICAgICAgLy8gVE9ETzogdGhlIGJyb3dzZXIgbWlnaHQgYmUgc2h1dHRpbmcgZG93biBoZXJlLiBXaGF0IGRvIHdlIGRvIHdpdGggdGhlXG4gICAgICAgIC8vIGVycm9yP1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICBzZXNzaW9uLnNlbmQoJ1RhcmdldC5zZXRBdXRvQXR0YWNoJywge1xuICAgICAgICAgICAgICAgIHdhaXRGb3JEZWJ1Z2dlck9uU3RhcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZmxhdHRlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhdXRvQXR0YWNoOiB0cnVlLFxuICAgICAgICAgICAgICAgIGZpbHRlcjogdGhpcy4jZGlzY292ZXJ5RmlsdGVyLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzZXNzaW9uLnNlbmQoJ1J1bnRpbWUucnVuSWZXYWl0aW5nRm9yRGVidWdnZXInKSxcbiAgICAgICAgXSkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgfTtcbiAgICAjZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KHRhcmdldElkKSB7XG4gICAgICAgIHRhcmdldElkICE9PSB1bmRlZmluZWQgJiYgdGhpcy4jdGFyZ2V0c0lkc0ZvckluaXQuZGVsZXRlKHRhcmdldElkKTtcbiAgICAgICAgaWYgKHRoaXMuI3RhcmdldHNJZHNGb3JJbml0LnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uRGV0YWNoZWRGcm9tVGFyZ2V0ID0gKHBhcmVudFNlc3Npb24sIGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5U2Vzc2lvbklkLmdldChldmVudC5zZXNzaW9uSWQpO1xuICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVNlc3Npb25JZC5kZWxldGUoZXZlbnQuc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50U2Vzc2lvbiBpbnN0YW5jZW9mIENEUFNlc3Npb24pIHtcbiAgICAgICAgICAgIHBhcmVudFNlc3Npb24uX3RhcmdldCgpLl9yZW1vdmVDaGlsZFRhcmdldCh0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuZGVsZXRlKHRhcmdldC5fdGFyZ2V0SWQpO1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRHb25lXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldEdvbmUgKi8sIHRhcmdldCk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNocm9tZVRhcmdldE1hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IENEUFNlc3Npb25FdmVudCwgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBDYWxsYmFja1JlZ2lzdHJ5IH0gZnJvbSAnLi4vY29tbW9uL0NhbGxiYWNrUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuLi9jb21tb24vRGVidWcuanMnO1xuaW1wb3J0IHsgVGFyZ2V0Q2xvc2VFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm90b2NvbEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IENkcENEUFNlc3Npb24gfSBmcm9tICcuL0NEUFNlc3Npb24uanMnO1xuY29uc3QgZGVidWdQcm90b2NvbFNlbmQgPSBkZWJ1ZygncHVwcGV0ZWVyOnByb3RvY29sOlNFTkQg4pa6Jyk7XG5jb25zdCBkZWJ1Z1Byb3RvY29sUmVjZWl2ZSA9IGRlYnVnKCdwdXBwZXRlZXI6cHJvdG9jb2w6UkVDViDil4AnKTtcbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgI3VybDtcbiAgICAjdHJhbnNwb3J0O1xuICAgICNkZWxheTtcbiAgICAjdGltZW91dDtcbiAgICAjc2Vzc2lvbnMgPSBuZXcgTWFwKCk7XG4gICAgI2Nsb3NlZCA9IGZhbHNlO1xuICAgICNtYW51YWxseUF0dGFjaGVkID0gbmV3IFNldCgpO1xuICAgICNjYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tSZWdpc3RyeSgpO1xuICAgIGNvbnN0cnVjdG9yKHVybCwgdHJhbnNwb3J0LCBkZWxheSA9IDAsIHRpbWVvdXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jdXJsID0gdXJsO1xuICAgICAgICB0aGlzLiNkZWxheSA9IGRlbGF5O1xuICAgICAgICB0aGlzLiN0aW1lb3V0ID0gdGltZW91dCA/PyAxODBfMDAwO1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgICAgIHRoaXMuI3RyYW5zcG9ydC5vbm1lc3NhZ2UgPSB0aGlzLm9uTWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQub25jbG9zZSA9IHRoaXMuI29uQ2xvc2UuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21TZXNzaW9uKHNlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHNlc3Npb24uY29ubmVjdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgZGVsYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWxheTtcbiAgICB9XG4gICAgZ2V0IHRpbWVvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0aW1lb3V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgX2Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Nsb3NlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0IF9zZXNzaW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Nlc3Npb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIC0gVGhlIHNlc3Npb24gaWRcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBDRFAgc2Vzc2lvbiBpZiBpdCBleGlzdHNcbiAgICAgKi9cbiAgICBzZXNzaW9uKHNlc3Npb25JZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCkgfHwgbnVsbDtcbiAgICB9XG4gICAgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdXJsO1xuICAgIH1cbiAgICBzZW5kKG1ldGhvZCwgcGFyYW1zLCBvcHRpb25zKSB7XG4gICAgICAgIC8vIFRoZXJlIGlzIG9ubHkgZXZlciAxIHBhcmFtIGFyZyBwYXNzZWQsIGJ1dCB0aGUgUHJvdG9jb2wgZGVmaW5lcyBpdCBhcyBhblxuICAgICAgICAvLyBhcnJheSBvZiAwIG9yIDEgaXRlbXMgU2VlIHRoaXMgY29tbWVudDpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0Nocm9tZURldlRvb2xzL2RldnRvb2xzLXByb3RvY29sL3B1bGwvMTEzI2lzc3VlY29tbWVudC00MTI2MDMyODVcbiAgICAgICAgLy8gd2hpY2ggZXhwbGFpbnMgd2h5IHRoZSBwcm90b2NvbCBkZWZpbmVzIHRoZSBwYXJhbXMgdGhpcyB3YXkgZm9yIGJldHRlclxuICAgICAgICAvLyB0eXBlLWluZmVyZW5jZS5cbiAgICAgICAgLy8gU28gbm93IHdlIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcGFyYW1zIG9yIG5vdCBhbmQgZGVhbCB3aXRoIHRoZW0gYWNjb3JkaW5nbHkuXG4gICAgICAgIHJldHVybiB0aGlzLl9yYXdTZW5kKHRoaXMuI2NhbGxiYWNrcywgbWV0aG9kLCBwYXJhbXMsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9yYXdTZW5kKGNhbGxiYWNrcywgbWV0aG9kLCBwYXJhbXMsIHNlc3Npb25JZCwgb3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy4jY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdQcm90b2NvbCBlcnJvcjogQ29ubmVjdGlvbiBjbG9zZWQuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFja3MuY3JlYXRlKG1ldGhvZCwgb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLiN0aW1lb3V0LCBpZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHJpbmdpZmllZE1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlYnVnUHJvdG9jb2xTZW5kKHN0cmluZ2lmaWVkTWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLiN0cmFuc3BvcnQuc2VuZChzdHJpbmdpZmllZE1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmQoJ0Jyb3dzZXIuY2xvc2UnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgb25NZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RlbGF5KSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChyLCB0aGlzLiNkZWxheSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1Z1Byb3RvY29sUmVjZWl2ZShtZXNzYWdlKTtcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gSlNPTi5wYXJzZShtZXNzYWdlKTtcbiAgICAgICAgaWYgKG9iamVjdC5tZXRob2QgPT09ICdUYXJnZXQuYXR0YWNoZWRUb1RhcmdldCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IG9iamVjdC5wYXJhbXMuc2Vzc2lvbklkO1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBDZHBDRFBTZXNzaW9uKHRoaXMsIG9iamVjdC5wYXJhbXMudGFyZ2V0SW5mby50eXBlLCBzZXNzaW9uSWQsIG9iamVjdC5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgdGhpcy4jc2Vzc2lvbnMuc2V0KHNlc3Npb25JZCwgc2Vzc2lvbik7XG4gICAgICAgICAgICB0aGlzLmVtaXQoQ0RQU2Vzc2lvbkV2ZW50LlNlc3Npb25BdHRhY2hlZCwgc2Vzc2lvbik7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRTZXNzaW9uID0gdGhpcy4jc2Vzc2lvbnMuZ2V0KG9iamVjdC5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgaWYgKHBhcmVudFNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRTZXNzaW9uLmVtaXQoQ0RQU2Vzc2lvbkV2ZW50LlNlc3Npb25BdHRhY2hlZCwgc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob2JqZWN0Lm1ldGhvZCA9PT0gJ1RhcmdldC5kZXRhY2hlZEZyb21UYXJnZXQnKSB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy4jc2Vzc2lvbnMuZ2V0KG9iamVjdC5wYXJhbXMuc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5fb25DbG9zZWQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNzZXNzaW9ucy5kZWxldGUob2JqZWN0LnBhcmFtcy5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRTZXNzaW9uID0gdGhpcy4jc2Vzc2lvbnMuZ2V0KG9iamVjdC5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRTZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFNlc3Npb24uZW1pdChDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdC5zZXNzaW9uSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLiNzZXNzaW9ucy5nZXQob2JqZWN0LnNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgIHNlc3Npb24uX29uTWVzc2FnZShvYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9iamVjdC5pZCkge1xuICAgICAgICAgICAgaWYgKG9iamVjdC5lcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NhbGxiYWNrcy5yZWplY3Qob2JqZWN0LmlkLCBjcmVhdGVQcm90b2NvbEVycm9yTWVzc2FnZShvYmplY3QpLCBvYmplY3QuZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjYWxsYmFja3MucmVzb2x2ZShvYmplY3QuaWQsIG9iamVjdC5yZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KG9iamVjdC5tZXRob2QsIG9iamVjdC5wYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNvbkNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy4jY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9ubWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9uY2xvc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuI2NhbGxiYWNrcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IHNlc3Npb24gb2YgdGhpcy4jc2Vzc2lvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHNlc3Npb24uX29uQ2xvc2VkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc2Vzc2lvbnMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbWl0KENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuI29uQ2xvc2UoKTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGlzQXV0b0F0dGFjaGVkKHRhcmdldElkKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy4jbWFudWFsbHlBdHRhY2hlZC5oYXModGFyZ2V0SWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBfY3JlYXRlU2Vzc2lvbih0YXJnZXRJbmZvLCBpc0F1dG9BdHRhY2hFbXVsYXRlZCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCFpc0F1dG9BdHRhY2hFbXVsYXRlZCkge1xuICAgICAgICAgICAgdGhpcy4jbWFudWFsbHlBdHRhY2hlZC5hZGQodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzZXNzaW9uSWQgfSA9IGF3YWl0IHRoaXMuc2VuZCgnVGFyZ2V0LmF0dGFjaFRvVGFyZ2V0Jywge1xuICAgICAgICAgICAgdGFyZ2V0SWQ6IHRhcmdldEluZm8udGFyZ2V0SWQsXG4gICAgICAgICAgICBmbGF0dGVuOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jbWFudWFsbHlBdHRhY2hlZC5kZWxldGUodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLiNzZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NEUFNlc3Npb24gY3JlYXRpb24gZmFpbGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGFyZ2V0SW5mbyAtIFRoZSB0YXJnZXQgaW5mb1xuICAgICAqIEByZXR1cm5zIFRoZSBDRFAgc2Vzc2lvbiB0aGF0IGlzIGNyZWF0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTZXNzaW9uKHRhcmdldEluZm8pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NyZWF0ZVNlc3Npb24odGFyZ2V0SW5mbywgZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRQZW5kaW5nUHJvdG9jb2xFcnJvcnMoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLiNjYWxsYmFja3MuZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCkpO1xuICAgICAgICBmb3IgKGNvbnN0IHNlc3Npb24gb2YgdGhpcy4jc2Vzc2lvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnNlc3Npb24uZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGFyZ2V0Q2xvc2VkRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRDbG9zZUVycm9yO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yLCBQdXBwZXRlZXJVUkwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2sgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuLyoqXG4gKiBUaGUgQ292ZXJhZ2UgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0byBnYXRoZXIgaW5mb3JtYXRpb24gYWJvdXQgcGFydHMgb2ZcbiAqIEphdmFTY3JpcHQgYW5kIENTUyB0aGF0IHdlcmUgdXNlZCBieSB0aGUgcGFnZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogVG8gb3V0cHV0IGNvdmVyYWdlIGluIGEgZm9ybSBjb25zdW1hYmxlIGJ5IHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vaXN0YW5idWxqcyB8IElzdGFuYnVsfSxcbiAqIHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2lzdGFuYnVsanMvcHVwcGV0ZWVyLXRvLWlzdGFuYnVsIHwgcHVwcGV0ZWVyLXRvLWlzdGFuYnVsfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogQW4gZXhhbXBsZSBvZiB1c2luZyBKYXZhU2NyaXB0IGFuZCBDU1MgY292ZXJhZ2UgdG8gZ2V0IHBlcmNlbnRhZ2Ugb2YgaW5pdGlhbGx5XG4gKiBleGVjdXRlZCBjb2RlOlxuICpcbiAqIGBgYHRzXG4gKiAvLyBFbmFibGUgYm90aCBKYXZhU2NyaXB0IGFuZCBDU1MgY292ZXJhZ2VcbiAqIGF3YWl0IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS5jb3ZlcmFnZS5zdGFydEpTQ292ZXJhZ2UoKSxcbiAqICAgcGFnZS5jb3ZlcmFnZS5zdGFydENTU0NvdmVyYWdlKCksXG4gKiBdKTtcbiAqIC8vIE5hdmlnYXRlIHRvIHBhZ2VcbiAqIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICogLy8gRGlzYWJsZSBib3RoIEphdmFTY3JpcHQgYW5kIENTUyBjb3ZlcmFnZVxuICogY29uc3QgW2pzQ292ZXJhZ2UsIGNzc0NvdmVyYWdlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS5jb3ZlcmFnZS5zdG9wSlNDb3ZlcmFnZSgpLFxuICogICBwYWdlLmNvdmVyYWdlLnN0b3BDU1NDb3ZlcmFnZSgpLFxuICogXSk7XG4gKiBsZXQgdG90YWxCeXRlcyA9IDA7XG4gKiBsZXQgdXNlZEJ5dGVzID0gMDtcbiAqIGNvbnN0IGNvdmVyYWdlID0gWy4uLmpzQ292ZXJhZ2UsIC4uLmNzc0NvdmVyYWdlXTtcbiAqIGZvciAoY29uc3QgZW50cnkgb2YgY292ZXJhZ2UpIHtcbiAqICAgdG90YWxCeXRlcyArPSBlbnRyeS50ZXh0Lmxlbmd0aDtcbiAqICAgZm9yIChjb25zdCByYW5nZSBvZiBlbnRyeS5yYW5nZXMpIHVzZWRCeXRlcyArPSByYW5nZS5lbmQgLSByYW5nZS5zdGFydCAtIDE7XG4gKiB9XG4gKiBjb25zb2xlLmxvZyhgQnl0ZXMgdXNlZDogJHsodXNlZEJ5dGVzIC8gdG90YWxCeXRlcykgKiAxMDB9JWApO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQ292ZXJhZ2Uge1xuICAgICNqc0NvdmVyYWdlO1xuICAgICNjc3NDb3ZlcmFnZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy4janNDb3ZlcmFnZSA9IG5ldyBKU0NvdmVyYWdlKGNsaWVudCk7XG4gICAgICAgIHRoaXMuI2Nzc0NvdmVyYWdlID0gbmV3IENTU0NvdmVyYWdlKGNsaWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHVwZGF0ZUNsaWVudChjbGllbnQpIHtcbiAgICAgICAgdGhpcy4janNDb3ZlcmFnZS51cGRhdGVDbGllbnQoY2xpZW50KTtcbiAgICAgICAgdGhpcy4jY3NzQ292ZXJhZ2UudXBkYXRlQ2xpZW50KGNsaWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gU2V0IG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zIGZvciBjb3ZlcmFnZSBkZWZhdWx0cyB0b1xuICAgICAqIGByZXNldE9uTmF2aWdhdGlvbiA6IHRydWUsIHJlcG9ydEFub255bW91c1NjcmlwdHMgOiBmYWxzZSxgXG4gICAgICogYGluY2x1ZGVSYXdTY3JpcHRDb3ZlcmFnZSA6IGZhbHNlLCB1c2VCbG9ja0NvdmVyYWdlIDogdHJ1ZWBcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjb3ZlcmFnZSBpcyBzdGFydGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbm9ueW1vdXMgc2NyaXB0cyBhcmUgb25lcyB0aGF0IGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCB1cmwuIFRoZXNlIGFyZVxuICAgICAqIHNjcmlwdHMgdGhhdCBhcmUgZHluYW1pY2FsbHkgY3JlYXRlZCBvbiB0aGUgcGFnZSB1c2luZyBgZXZhbGAgb3JcbiAgICAgKiBgbmV3IEZ1bmN0aW9uYC4gSWYgYHJlcG9ydEFub255bW91c1NjcmlwdHNgIGlzIHNldCB0byBgdHJ1ZWAsIGFub255bW91c1xuICAgICAqIHNjcmlwdHMgVVJMIHdpbGwgc3RhcnQgd2l0aCBgZGVidWdnZXI6Ly9WTWAgKHVubGVzcyBhIG1hZ2ljIC8vIyBzb3VyY2VVUkxcbiAgICAgKiBjb21tZW50IGlzIHByZXNlbnQsIGluIHdoaWNoIGNhc2UgdGhhdCB3aWxsIHRoZSBiZSBVUkwpLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YXJ0SlNDb3ZlcmFnZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2pzQ292ZXJhZ2Uuc3RhcnQob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgY292ZXJhZ2UgcmVwb3J0cyBmb3JcbiAgICAgKiBhbGwgc2NyaXB0cy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSmF2YVNjcmlwdCBDb3ZlcmFnZSBkb2Vzbid0IGluY2x1ZGUgYW5vbnltb3VzIHNjcmlwdHMgYnkgZGVmYXVsdC5cbiAgICAgKiBIb3dldmVyLCBzY3JpcHRzIHdpdGggc291cmNlVVJMcyBhcmUgcmVwb3J0ZWQuXG4gICAgICovXG4gICAgYXN5bmMgc3RvcEpTQ292ZXJhZ2UoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNqc0NvdmVyYWdlLnN0b3AoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTZXQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMgZm9yIGNvdmVyYWdlLCBkZWZhdWx0cyB0b1xuICAgICAqIGByZXNldE9uTmF2aWdhdGlvbiA6IHRydWVgXG4gICAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gY292ZXJhZ2UgaXMgc3RhcnRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBzdGFydENTU0NvdmVyYWdlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jY3NzQ292ZXJhZ2Uuc3RhcnQob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgY292ZXJhZ2UgcmVwb3J0c1xuICAgICAqIGZvciBhbGwgc3R5bGVzaGVldHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIENTUyBDb3ZlcmFnZSBkb2Vzbid0IGluY2x1ZGUgZHluYW1pY2FsbHkgaW5qZWN0ZWQgc3R5bGUgdGFnc1xuICAgICAqIHdpdGhvdXQgc291cmNlVVJMcy5cbiAgICAgKi9cbiAgICBhc3luYyBzdG9wQ1NTQ292ZXJhZ2UoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjc3NDb3ZlcmFnZS5zdG9wKCk7XG4gICAgfVxufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBKU0NvdmVyYWdlIHtcbiAgICAjY2xpZW50O1xuICAgICNlbmFibGVkID0gZmFsc2U7XG4gICAgI3NjcmlwdFVSTHMgPSBuZXcgTWFwKCk7XG4gICAgI3NjcmlwdFNvdXJjZXMgPSBuZXcgTWFwKCk7XG4gICAgI3N1YnNjcmlwdGlvbnM7XG4gICAgI3Jlc2V0T25OYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgI3JlcG9ydEFub255bW91c1NjcmlwdHMgPSBmYWxzZTtcbiAgICAjaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdXBkYXRlQ2xpZW50KGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIGFzeW5jIHN0YXJ0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2VuYWJsZWQsICdKU0NvdmVyYWdlIGlzIGFscmVhZHkgZW5hYmxlZCcpO1xuICAgICAgICBjb25zdCB7IHJlc2V0T25OYXZpZ2F0aW9uID0gdHJ1ZSwgcmVwb3J0QW5vbnltb3VzU2NyaXB0cyA9IGZhbHNlLCBpbmNsdWRlUmF3U2NyaXB0Q292ZXJhZ2UgPSBmYWxzZSwgdXNlQmxvY2tDb3ZlcmFnZSA9IHRydWUsIH0gPSBvcHRpb25zO1xuICAgICAgICB0aGlzLiNyZXNldE9uTmF2aWdhdGlvbiA9IHJlc2V0T25OYXZpZ2F0aW9uO1xuICAgICAgICB0aGlzLiNyZXBvcnRBbm9ueW1vdXNTY3JpcHRzID0gcmVwb3J0QW5vbnltb3VzU2NyaXB0cztcbiAgICAgICAgdGhpcy4jaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlID0gaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlO1xuICAgICAgICB0aGlzLiNlbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jc2NyaXB0VVJMcy5jbGVhcigpO1xuICAgICAgICB0aGlzLiNzY3JpcHRTb3VyY2VzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbnMgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgICAgIGNvbnN0IGNsaWVudEVtaXR0ZXIgPSB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRFbWl0dGVyKHRoaXMuI2NsaWVudCkpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdEZWJ1Z2dlci5zY3JpcHRQYXJzZWQnLCB0aGlzLiNvblNjcmlwdFBhcnNlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgY2xpZW50RW1pdHRlci5vbignUnVudGltZS5leGVjdXRpb25Db250ZXh0c0NsZWFyZWQnLCB0aGlzLiNvbkV4ZWN1dGlvbkNvbnRleHRzQ2xlYXJlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1Byb2ZpbGVyLmVuYWJsZScpLFxuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1Byb2ZpbGVyLnN0YXJ0UHJlY2lzZUNvdmVyYWdlJywge1xuICAgICAgICAgICAgICAgIGNhbGxDb3VudDogdGhpcy4jaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlLFxuICAgICAgICAgICAgICAgIGRldGFpbGVkOiB1c2VCbG9ja0NvdmVyYWdlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnRGVidWdnZXIuZW5hYmxlJyksXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnRGVidWdnZXIuc2V0U2tpcEFsbFBhdXNlcycsIHsgc2tpcDogdHJ1ZSB9KSxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgICNvbkV4ZWN1dGlvbkNvbnRleHRzQ2xlYXJlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNyZXNldE9uTmF2aWdhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3NjcmlwdFVSTHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy4jc2NyaXB0U291cmNlcy5jbGVhcigpO1xuICAgIH1cbiAgICBhc3luYyAjb25TY3JpcHRQYXJzZWQoZXZlbnQpIHtcbiAgICAgICAgLy8gSWdub3JlIHB1cHBldGVlci1pbmplY3RlZCBzY3JpcHRzXG4gICAgICAgIGlmIChQdXBwZXRlZXJVUkwuaXNQdXBwZXRlZXJVUkwoZXZlbnQudXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElnbm9yZSBvdGhlciBhbm9ueW1vdXMgc2NyaXB0cyB1bmxlc3MgdGhlIHJlcG9ydEFub255bW91c1NjcmlwdHMgb3B0aW9uIGlzIHRydWUuXG4gICAgICAgIGlmICghZXZlbnQudXJsICYmICF0aGlzLiNyZXBvcnRBbm9ueW1vdXNTY3JpcHRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ0RlYnVnZ2VyLmdldFNjcmlwdFNvdXJjZScsIHtcbiAgICAgICAgICAgICAgICBzY3JpcHRJZDogZXZlbnQuc2NyaXB0SWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuI3NjcmlwdFVSTHMuc2V0KGV2ZW50LnNjcmlwdElkLCBldmVudC51cmwpO1xuICAgICAgICAgICAgdGhpcy4jc2NyaXB0U291cmNlcy5zZXQoZXZlbnQuc2NyaXB0SWQsIHJlc3BvbnNlLnNjcmlwdFNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IGhhcHBlbiBpZiB0aGUgcGFnZSBoYXMgYWxyZWFkeSBuYXZpZ2F0ZWQgYXdheS5cbiAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHN0b3AoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLiNlbmFibGVkLCAnSlNDb3ZlcmFnZSBpcyBub3QgZW5hYmxlZCcpO1xuICAgICAgICB0aGlzLiNlbmFibGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdQcm9maWxlci50YWtlUHJlY2lzZUNvdmVyYWdlJyksXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnUHJvZmlsZXIuc3RvcFByZWNpc2VDb3ZlcmFnZScpLFxuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1Byb2ZpbGVyLmRpc2FibGUnKSxcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdEZWJ1Z2dlci5kaXNhYmxlJyksXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zPy5kaXNwb3NlKCk7XG4gICAgICAgIGNvbnN0IGNvdmVyYWdlID0gW107XG4gICAgICAgIGNvbnN0IHByb2ZpbGVSZXNwb25zZSA9IHJlc3VsdFswXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBwcm9maWxlUmVzcG9uc2UucmVzdWx0KSB7XG4gICAgICAgICAgICBsZXQgdXJsID0gdGhpcy4jc2NyaXB0VVJMcy5nZXQoZW50cnkuc2NyaXB0SWQpO1xuICAgICAgICAgICAgaWYgKCF1cmwgJiYgdGhpcy4jcmVwb3J0QW5vbnltb3VzU2NyaXB0cykge1xuICAgICAgICAgICAgICAgIHVybCA9ICdkZWJ1Z2dlcjovL1ZNJyArIGVudHJ5LnNjcmlwdElkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuI3NjcmlwdFNvdXJjZXMuZ2V0KGVudHJ5LnNjcmlwdElkKTtcbiAgICAgICAgICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQgfHwgdXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5SYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZnVuYyBvZiBlbnRyeS5mdW5jdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBmbGF0dGVuUmFuZ2VzLnB1c2goLi4uZnVuYy5yYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmFuZ2VzID0gY29udmVydFRvRGlzam9pbnRSYW5nZXMoZmxhdHRlblJhbmdlcyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI2luY2x1ZGVSYXdTY3JpcHRDb3ZlcmFnZSkge1xuICAgICAgICAgICAgICAgIGNvdmVyYWdlLnB1c2goeyB1cmwsIHJhbmdlcywgdGV4dCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvdmVyYWdlLnB1c2goeyB1cmwsIHJhbmdlcywgdGV4dCwgcmF3U2NyaXB0Q292ZXJhZ2U6IGVudHJ5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3ZlcmFnZTtcbiAgICB9XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIENTU0NvdmVyYWdlIHtcbiAgICAjY2xpZW50O1xuICAgICNlbmFibGVkID0gZmFsc2U7XG4gICAgI3N0eWxlc2hlZXRVUkxzID0gbmV3IE1hcCgpO1xuICAgICNzdHlsZXNoZWV0U291cmNlcyA9IG5ldyBNYXAoKTtcbiAgICAjZXZlbnRMaXN0ZW5lcnM7XG4gICAgI3Jlc2V0T25OYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdXBkYXRlQ2xpZW50KGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIGFzeW5jIHN0YXJ0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2VuYWJsZWQsICdDU1NDb3ZlcmFnZSBpcyBhbHJlYWR5IGVuYWJsZWQnKTtcbiAgICAgICAgY29uc3QgeyByZXNldE9uTmF2aWdhdGlvbiA9IHRydWUgfSA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuI3Jlc2V0T25OYXZpZ2F0aW9uID0gcmVzZXRPbk5hdmlnYXRpb247XG4gICAgICAgIHRoaXMuI2VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLiNzdHlsZXNoZWV0VVJMcy5jbGVhcigpO1xuICAgICAgICB0aGlzLiNzdHlsZXNoZWV0U291cmNlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLiNldmVudExpc3RlbmVycyA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTtcbiAgICAgICAgY29uc3QgY2xpZW50RW1pdHRlciA9IHRoaXMuI2V2ZW50TGlzdGVuZXJzLnVzZShuZXcgRXZlbnRFbWl0dGVyKHRoaXMuI2NsaWVudCkpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdDU1Muc3R5bGVTaGVldEFkZGVkJywgdGhpcy4jb25TdHlsZVNoZWV0LmJpbmQodGhpcykpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHRzQ2xlYXJlZCcsIHRoaXMuI29uRXhlY3V0aW9uQ29udGV4dHNDbGVhcmVkLmJpbmQodGhpcykpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnRE9NLmVuYWJsZScpLFxuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ0NTUy5lbmFibGUnKSxcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdDU1Muc3RhcnRSdWxlVXNhZ2VUcmFja2luZycpLFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgI29uRXhlY3V0aW9uQ29udGV4dHNDbGVhcmVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuI3Jlc2V0T25OYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc3R5bGVzaGVldFVSTHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy4jc3R5bGVzaGVldFNvdXJjZXMuY2xlYXIoKTtcbiAgICB9XG4gICAgYXN5bmMgI29uU3R5bGVTaGVldChldmVudCkge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBldmVudC5oZWFkZXI7XG4gICAgICAgIC8vIElnbm9yZSBhbm9ueW1vdXMgc2NyaXB0c1xuICAgICAgICBpZiAoIWhlYWRlci5zb3VyY2VVUkwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnQ1NTLmdldFN0eWxlU2hlZXRUZXh0Jywge1xuICAgICAgICAgICAgICAgIHN0eWxlU2hlZXRJZDogaGVhZGVyLnN0eWxlU2hlZXRJZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy4jc3R5bGVzaGVldFVSTHMuc2V0KGhlYWRlci5zdHlsZVNoZWV0SWQsIGhlYWRlci5zb3VyY2VVUkwpO1xuICAgICAgICAgICAgdGhpcy4jc3R5bGVzaGVldFNvdXJjZXMuc2V0KGhlYWRlci5zdHlsZVNoZWV0SWQsIHJlc3BvbnNlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gVGhpcyBtaWdodCBoYXBwZW4gaWYgdGhlIHBhZ2UgaGFzIGFscmVhZHkgbmF2aWdhdGVkIGF3YXkuXG4gICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBzdG9wKCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jZW5hYmxlZCwgJ0NTU0NvdmVyYWdlIGlzIG5vdCBlbmFibGVkJyk7XG4gICAgICAgIHRoaXMuI2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcnVsZVRyYWNraW5nUmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnQ1NTLnN0b3BSdWxlVXNhZ2VUcmFja2luZycpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnQ1NTLmRpc2FibGUnKSxcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdET00uZGlzYWJsZScpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy4jZXZlbnRMaXN0ZW5lcnM/LmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gYWdncmVnYXRlIGJ5IHN0eWxlU2hlZXRJZFxuICAgICAgICBjb25zdCBzdHlsZVNoZWV0SWRUb0NvdmVyYWdlID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJ1bGVUcmFja2luZ1Jlc3BvbnNlLnJ1bGVVc2FnZSkge1xuICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHN0eWxlU2hlZXRJZFRvQ292ZXJhZ2UuZ2V0KGVudHJ5LnN0eWxlU2hlZXRJZCk7XG4gICAgICAgICAgICBpZiAoIXJhbmdlcykge1xuICAgICAgICAgICAgICAgIHJhbmdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHN0eWxlU2hlZXRJZFRvQ292ZXJhZ2Uuc2V0KGVudHJ5LnN0eWxlU2hlZXRJZCwgcmFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdGFydE9mZnNldDogZW50cnkuc3RhcnRPZmZzZXQsXG4gICAgICAgICAgICAgICAgZW5kT2Zmc2V0OiBlbnRyeS5lbmRPZmZzZXQsXG4gICAgICAgICAgICAgICAgY291bnQ6IGVudHJ5LnVzZWQgPyAxIDogMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvdmVyYWdlID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgc3R5bGVTaGVldElkIG9mIHRoaXMuI3N0eWxlc2hlZXRVUkxzLmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy4jc3R5bGVzaGVldFVSTHMuZ2V0KHN0eWxlU2hlZXRJZCk7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIHVybCAhPT0gJ3VuZGVmaW5lZCcsIGBTdHlsZXNoZWV0IFVSTCBpcyB1bmRlZmluZWQgKHN0eWxlU2hlZXRJZD0ke3N0eWxlU2hlZXRJZH0pYCk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy4jc3R5bGVzaGVldFNvdXJjZXMuZ2V0KHN0eWxlU2hlZXRJZCk7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIHRleHQgIT09ICd1bmRlZmluZWQnLCBgU3R5bGVzaGVldCB0ZXh0IGlzIHVuZGVmaW5lZCAoc3R5bGVTaGVldElkPSR7c3R5bGVTaGVldElkfSlgKTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlcyA9IGNvbnZlcnRUb0Rpc2pvaW50UmFuZ2VzKHN0eWxlU2hlZXRJZFRvQ292ZXJhZ2UuZ2V0KHN0eWxlU2hlZXRJZCkgfHwgW10pO1xuICAgICAgICAgICAgY292ZXJhZ2UucHVzaCh7IHVybCwgcmFuZ2VzLCB0ZXh0IH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3ZlcmFnZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb252ZXJ0VG9EaXNqb2ludFJhbmdlcyhuZXN0ZWRSYW5nZXMpIHtcbiAgICBjb25zdCBwb2ludHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIG5lc3RlZFJhbmdlcykge1xuICAgICAgICBwb2ludHMucHVzaCh7IG9mZnNldDogcmFuZ2Uuc3RhcnRPZmZzZXQsIHR5cGU6IDAsIHJhbmdlIH0pO1xuICAgICAgICBwb2ludHMucHVzaCh7IG9mZnNldDogcmFuZ2UuZW5kT2Zmc2V0LCB0eXBlOiAxLCByYW5nZSB9KTtcbiAgICB9XG4gICAgLy8gU29ydCBwb2ludHMgdG8gZm9ybSBhIHZhbGlkIHBhcmVudGhlc2lzIHNlcXVlbmNlLlxuICAgIHBvaW50cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIFNvcnQgd2l0aCBpbmNyZWFzaW5nIG9mZnNldHMuXG4gICAgICAgIGlmIChhLm9mZnNldCAhPT0gYi5vZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBhLm9mZnNldCAtIGIub2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsbCBcImVuZFwiIHBvaW50cyBzaG91bGQgZ28gYmVmb3JlIFwic3RhcnRcIiBwb2ludHMuXG4gICAgICAgIGlmIChhLnR5cGUgIT09IGIudHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGIudHlwZSAtIGEudHlwZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhTGVuZ3RoID0gYS5yYW5nZS5lbmRPZmZzZXQgLSBhLnJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgICAgICBjb25zdCBiTGVuZ3RoID0gYi5yYW5nZS5lbmRPZmZzZXQgLSBiLnJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgICAgICAvLyBGb3IgdHdvIFwic3RhcnRcIiBwb2ludHMsIHRoZSBvbmUgd2l0aCBsb25nZXIgcmFuZ2UgZ29lcyBmaXJzdC5cbiAgICAgICAgaWYgKGEudHlwZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJMZW5ndGggLSBhTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvciB0d28gXCJlbmRcIiBwb2ludHMsIHRoZSBvbmUgd2l0aCBzaG9ydGVyIHJhbmdlIGdvZXMgZmlyc3QuXG4gICAgICAgIHJldHVybiBhTGVuZ3RoIC0gYkxlbmd0aDtcbiAgICB9KTtcbiAgICBjb25zdCBoaXRDb3VudFN0YWNrID0gW107XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgIGxldCBsYXN0T2Zmc2V0ID0gMDtcbiAgICAvLyBSdW4gc2Nhbm5pbmcgbGluZSB0byBpbnRlcnNlY3QgYWxsIHJhbmdlcy5cbiAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHBvaW50cykge1xuICAgICAgICBpZiAoaGl0Q291bnRTdGFjay5sZW5ndGggJiZcbiAgICAgICAgICAgIGxhc3RPZmZzZXQgPCBwb2ludC5vZmZzZXQgJiZcbiAgICAgICAgICAgIGhpdENvdW50U3RhY2tbaGl0Q291bnRTdGFjay5sZW5ndGggLSAxXSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RSZXN1bHQgPSByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAobGFzdFJlc3VsdCAmJiBsYXN0UmVzdWx0LmVuZCA9PT0gbGFzdE9mZnNldCkge1xuICAgICAgICAgICAgICAgIGxhc3RSZXN1bHQuZW5kID0gcG9pbnQub2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgc3RhcnQ6IGxhc3RPZmZzZXQsIGVuZDogcG9pbnQub2Zmc2V0IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxhc3RPZmZzZXQgPSBwb2ludC5vZmZzZXQ7XG4gICAgICAgIGlmIChwb2ludC50eXBlID09PSAwKSB7XG4gICAgICAgICAgICBoaXRDb3VudFN0YWNrLnB1c2gocG9pbnQucmFuZ2UuY291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGl0Q291bnRTdGFjay5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBGaWx0ZXIgb3V0IGVtcHR5IHJhbmdlcy5cbiAgICByZXR1cm4gcmVzdWx0cy5maWx0ZXIocmFuZ2UgPT4ge1xuICAgICAgICByZXR1cm4gcmFuZ2UuZW5kIC0gcmFuZ2Uuc3RhcnQgPiAwO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q292ZXJhZ2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi4vdXRpbC9EZWZlcnJlZC5qcyc7XG4vKipcbiAqIERldmljZSBpbiBhIHJlcXVlc3QgcHJvbXB0LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERldmljZVJlcXVlc3RQcm9tcHREZXZpY2Uge1xuICAgIC8qKlxuICAgICAqIERldmljZSBpZCBkdXJpbmcgYSBwcm9tcHQuXG4gICAgICovXG4gICAgaWQ7XG4gICAgLyoqXG4gICAgICogRGV2aWNlIG5hbWUgYXMgaXQgYXBwZWFycyBpbiBhIHByb21wdC5cbiAgICAgKi9cbiAgICBuYW1lO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlkLCBuYW1lKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB9XG59XG4vKipcbiAqIERldmljZSByZXF1ZXN0IHByb21wdHMgbGV0IHlvdSByZXNwb25kIHRvIHRoZSBwYWdlIHJlcXVlc3RpbmcgZm9yIGEgZGV2aWNlXG4gKiB0aHJvdWdoIGFuIEFQSSBsaWtlIFdlYkJsdWV0b290aC5cbiAqXG4gKiBAcmVtYXJrc1xuICogYERldmljZVJlcXVlc3RQcm9tcHRgIGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgdmlhIHRoZVxuICoge0BsaW5rIFBhZ2Uud2FpdEZvckRldmljZVByb21wdH0gbWV0aG9kLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IFtkZXZpY2VSZXF1ZXN0XSA9IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS53YWl0Rm9yRGV2aWNlUHJvbXB0KCksXG4gKiAgIHBhZ2UuY2xpY2soJyNjb25uZWN0LWJsdWV0b290aCcpLFxuICogXSk7XG4gKiBhd2FpdCBkZXZpY2VQcm9tcHQuc2VsZWN0KFxuICogICBhd2FpdCBkZXZpY2VQcm9tcHQud2FpdEZvckRldmljZSgoe25hbWV9KSA9PiBuYW1lLmluY2x1ZGVzKCdNeSBEZXZpY2UnKSlcbiAqICk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXZpY2VSZXF1ZXN0UHJvbXB0IHtcbiAgICAjY2xpZW50O1xuICAgICN0aW1lb3V0U2V0dGluZ3M7XG4gICAgI2lkO1xuICAgICNoYW5kbGVkID0gZmFsc2U7XG4gICAgI3VwZGF0ZURldmljZXNIYW5kbGUgPSB0aGlzLiN1cGRhdGVEZXZpY2VzLmJpbmQodGhpcyk7XG4gICAgI3dhaXRGb3JEZXZpY2VQcm9taXNlcyA9IG5ldyBTZXQoKTtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGxpc3Qgb2Ygc2VsZWN0YWJsZSBkZXZpY2VzLlxuICAgICAqL1xuICAgIGRldmljZXMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIHRpbWVvdXRTZXR0aW5ncywgZmlyc3RFdmVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3RpbWVvdXRTZXR0aW5ncyA9IHRpbWVvdXRTZXR0aW5ncztcbiAgICAgICAgdGhpcy4jaWQgPSBmaXJzdEV2ZW50LmlkO1xuICAgICAgICB0aGlzLiNjbGllbnQub24oJ0RldmljZUFjY2Vzcy5kZXZpY2VSZXF1ZXN0UHJvbXB0ZWQnLCB0aGlzLiN1cGRhdGVEZXZpY2VzSGFuZGxlKTtcbiAgICAgICAgdGhpcy4jY2xpZW50Lm9uKCdUYXJnZXQuZGV0YWNoZWRGcm9tVGFyZ2V0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jY2xpZW50ID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI3VwZGF0ZURldmljZXMoZmlyc3RFdmVudCk7XG4gICAgfVxuICAgICN1cGRhdGVEZXZpY2VzKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5pZCAhPT0gdGhpcy4jaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJhd0RldmljZSBvZiBldmVudC5kZXZpY2VzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZXZpY2VzLnNvbWUoZGV2aWNlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLmlkID09PSByYXdEZXZpY2UuaWQ7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3RGV2aWNlID0gbmV3IERldmljZVJlcXVlc3RQcm9tcHREZXZpY2UocmF3RGV2aWNlLmlkLCByYXdEZXZpY2UubmFtZSk7XG4gICAgICAgICAgICB0aGlzLmRldmljZXMucHVzaChuZXdEZXZpY2UpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB3YWl0Rm9yRGV2aWNlUHJvbWlzZSBvZiB0aGlzLiN3YWl0Rm9yRGV2aWNlUHJvbWlzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAod2FpdEZvckRldmljZVByb21pc2UuZmlsdGVyKG5ld0RldmljZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FpdEZvckRldmljZVByb21pc2UucHJvbWlzZS5yZXNvbHZlKG5ld0RldmljZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgdG8gdGhlIGZpcnN0IGRldmljZSBpbiB0aGUgcHJvbXB0IG1hdGNoaW5nIGEgZmlsdGVyLlxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JEZXZpY2UoZmlsdGVyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXZpY2Ugb2YgdGhpcy5kZXZpY2VzKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyKGRldmljZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdGltZW91dCA9IHRoaXMuI3RpbWVvdXRTZXR0aW5ncy50aW1lb3V0KCkgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBXYWl0aW5nIGZvciBcXGBEZXZpY2VSZXF1ZXN0UHJvbXB0RGV2aWNlXFxgIGZhaWxlZDogJHt0aW1lb3V0fW1zIGV4Y2VlZGVkYCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBoYW5kbGUgPSB7IGZpbHRlciwgcHJvbWlzZTogZGVmZXJyZWQgfTtcbiAgICAgICAgdGhpcy4jd2FpdEZvckRldmljZVByb21pc2VzLmFkZChoYW5kbGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy4jd2FpdEZvckRldmljZVByb21pc2VzLmRlbGV0ZShoYW5kbGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBhIGRldmljZSBpbiB0aGUgcHJvbXB0J3MgbGlzdC5cbiAgICAgKi9cbiAgICBhc3luYyBzZWxlY3QoZGV2aWNlKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLiNjbGllbnQgIT09IG51bGwsICdDYW5ub3Qgc2VsZWN0IGRldmljZSB0aHJvdWdoIGRldGFjaGVkIHNlc3Npb24hJyk7XG4gICAgICAgIGFzc2VydCh0aGlzLmRldmljZXMuaW5jbHVkZXMoZGV2aWNlKSwgJ0Nhbm5vdCBzZWxlY3QgdW5rbm93biBkZXZpY2UhJyk7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBzZWxlY3QgRGV2aWNlUmVxdWVzdFByb21wdCB3aGljaCBpcyBhbHJlYWR5IGhhbmRsZWQhJyk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vZmYoJ0RldmljZUFjY2Vzcy5kZXZpY2VSZXF1ZXN0UHJvbXB0ZWQnLCB0aGlzLiN1cGRhdGVEZXZpY2VzSGFuZGxlKTtcbiAgICAgICAgdGhpcy4jaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnRGV2aWNlQWNjZXNzLnNlbGVjdFByb21wdCcsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLiNpZCxcbiAgICAgICAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgdGhlIHByb21wdC5cbiAgICAgKi9cbiAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLiNjbGllbnQgIT09IG51bGwsICdDYW5ub3QgY2FuY2VsIHByb21wdCB0aHJvdWdoIGRldGFjaGVkIHNlc3Npb24hJyk7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBjYW5jZWwgRGV2aWNlUmVxdWVzdFByb21wdCB3aGljaCBpcyBhbHJlYWR5IGhhbmRsZWQhJyk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vZmYoJ0RldmljZUFjY2Vzcy5kZXZpY2VSZXF1ZXN0UHJvbXB0ZWQnLCB0aGlzLiN1cGRhdGVEZXZpY2VzSGFuZGxlKTtcbiAgICAgICAgdGhpcy4jaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnRGV2aWNlQWNjZXNzLmNhbmNlbFByb21wdCcsIHsgaWQ6IHRoaXMuI2lkIH0pO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXZpY2VSZXF1ZXN0UHJvbXB0TWFuYWdlciB7XG4gICAgI2NsaWVudDtcbiAgICAjdGltZW91dFNldHRpbmdzO1xuICAgICNkZXZpY2VSZXF1ZXN0UHJvbXBEZWZlcnJlZHMgPSBuZXcgU2V0KCk7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2xpZW50LCB0aW1lb3V0U2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB0aGlzLiN0aW1lb3V0U2V0dGluZ3MgPSB0aW1lb3V0U2V0dGluZ3M7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbignRGV2aWNlQWNjZXNzLmRldmljZVJlcXVlc3RQcm9tcHRlZCcsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuI29uRGV2aWNlUmVxdWVzdFByb21wdGVkKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbignVGFyZ2V0LmRldGFjaGVkRnJvbVRhcmdldCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudCA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXYWl0IGZvciBkZXZpY2UgcHJvbXB0IGNyZWF0ZWQgYnkgYW4gYWN0aW9uIGxpa2UgY2FsbGluZyBXZWJCbHVldG9vdGgnc1xuICAgICAqIHJlcXVlc3REZXZpY2UuXG4gICAgICovXG4gICAgYXN5bmMgd2FpdEZvckRldmljZVByb21wdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuI2NsaWVudCAhPT0gbnVsbCwgJ0Nhbm5vdCB3YWl0IGZvciBkZXZpY2UgcHJvbXB0IHRocm91Z2ggZGV0YWNoZWQgc2Vzc2lvbiEnKTtcbiAgICAgICAgY29uc3QgbmVlZHNFbmFibGUgPSB0aGlzLiNkZXZpY2VSZXF1ZXN0UHJvbXBEZWZlcnJlZHMuc2l6ZSA9PT0gMDtcbiAgICAgICAgbGV0IGVuYWJsZVByb21pc2U7XG4gICAgICAgIGlmIChuZWVkc0VuYWJsZSkge1xuICAgICAgICAgICAgZW5hYmxlUHJvbWlzZSA9IHRoaXMuI2NsaWVudC5zZW5kKCdEZXZpY2VBY2Nlc3MuZW5hYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0aW1lb3V0ID0gdGhpcy4jdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoe1xuICAgICAgICAgICAgbWVzc2FnZTogYFdhaXRpbmcgZm9yIFxcYERldmljZVJlcXVlc3RQcm9tcHRcXGAgZmFpbGVkOiAke3RpbWVvdXR9bXMgZXhjZWVkZWRgLFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQudmFsdWVPclRocm93KCksXG4gICAgICAgICAgICAgICAgZW5hYmxlUHJvbWlzZSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgICNvbkRldmljZVJlcXVlc3RQcm9tcHRlZChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5zaXplKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHRoaXMuI2NsaWVudCAhPT0gbnVsbCk7XG4gICAgICAgIGNvbnN0IGRldmljZVByb21wdCA9IG5ldyBEZXZpY2VSZXF1ZXN0UHJvbXB0KHRoaXMuI2NsaWVudCwgdGhpcy4jdGltZW91dFNldHRpbmdzLCBldmVudCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiB0aGlzLiNkZXZpY2VSZXF1ZXN0UHJvbXBEZWZlcnJlZHMpIHtcbiAgICAgICAgICAgIHByb21pc2UucmVzb2x2ZShkZXZpY2VQcm9tcHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5jbGVhcigpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURldmljZVJlcXVlc3RQcm9tcHQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IERpYWxvZyB9IGZyb20gJy4uL2FwaS9EaWFsb2cuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENkcERpYWxvZyBleHRlbmRzIERpYWxvZyB7XG4gICAgI2NsaWVudDtcbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIHR5cGUsIG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSA9ICcnKSB7XG4gICAgICAgIHN1cGVyKHR5cGUsIG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgYXN5bmMgaGFuZGxlKG9wdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ1BhZ2UuaGFuZGxlSmF2YVNjcmlwdERpYWxvZycsIHtcbiAgICAgICAgICAgIGFjY2VwdDogb3B0aW9ucy5hY2NlcHQsXG4gICAgICAgICAgICBwcm9tcHRUZXh0OiBvcHRpb25zLnRleHQsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpYWxvZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fcnVuSW5pdGlhbGl6ZXJzID0gKHRoaXMgJiYgdGhpcy5fX3J1bkluaXRpYWxpemVycykgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcbnZhciBfX2VzRGVjb3JhdGUgPSAodGhpcyAmJiB0aGlzLl9fZXNEZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gICAgZG9uZSA9IHRydWU7XG59O1xuaW1wb3J0IHsgRWxlbWVudEhhbmRsZSB9IGZyb20gJy4uL2FwaS9FbGVtZW50SGFuZGxlLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBBc3luY0l0ZXJhYmxlVXRpbCB9IGZyb20gJy4uL3V0aWwvQXN5bmNJdGVyYWJsZVV0aWwuanMnO1xuaW1wb3J0IHsgdGhyb3dJZkRpc3Bvc2VkIH0gZnJvbSAnLi4vdXRpbC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENkcEpTSGFuZGxlIH0gZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG5jb25zdCBOT05fRUxFTUVOVF9OT0RFX1JPTEVTID0gbmV3IFNldChbJ1N0YXRpY1RleHQnLCAnSW5saW5lVGV4dEJveCddKTtcbi8qKlxuICogVGhlIENkcEVsZW1lbnRIYW5kbGUgZXh0ZW5kcyBFbGVtZW50SGFuZGxlIG5vdyB0byBrZWVwIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggYGluc3RhbmNlb2ZgIGJlY2F1c2Ugb2YgdGhhdCB3ZSBuZWVkIHRvIGhhdmUgbWV0aG9kcyBmb3JcbiAqIENkcEpTSGFuZGxlIHRvIGluIHRoaXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xubGV0IENkcEVsZW1lbnRIYW5kbGUgPSAoKCkgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgbGV0IF9jbGFzc1N1cGVyID0gRWxlbWVudEhhbmRsZTtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX2NvbnRlbnRGcmFtZV9kZWNvcmF0b3JzO1xuICAgIGxldCBfc2Nyb2xsSW50b1ZpZXdfZGVjb3JhdG9ycztcbiAgICBsZXQgX3VwbG9hZEZpbGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX2F1dG9maWxsX2RlY29yYXRvcnM7XG4gICAgcmV0dXJuIGNsYXNzIENkcEVsZW1lbnRIYW5kbGUgZXh0ZW5kcyBfY2xhc3NTdXBlciB7XG4gICAgICAgIHN0YXRpYyB7XG4gICAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwO1xuICAgICAgICAgICAgX2NvbnRlbnRGcmFtZV9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpXTtcbiAgICAgICAgICAgIF9zY3JvbGxJbnRvVmlld19kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX2EgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfYSldO1xuICAgICAgICAgICAgX3VwbG9hZEZpbGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9iID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2IpXTtcbiAgICAgICAgICAgIF9hdXRvZmlsbF9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpXTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfY29udGVudEZyYW1lX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJjb250ZW50RnJhbWVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImNvbnRlbnRGcmFtZVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmNvbnRlbnRGcmFtZSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2Nyb2xsSW50b1ZpZXdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInNjcm9sbEludG9WaWV3XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzY3JvbGxJbnRvVmlld1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNjcm9sbEludG9WaWV3IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF91cGxvYWRGaWxlX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJ1cGxvYWRGaWxlXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ1cGxvYWRGaWxlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudXBsb2FkRmlsZSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfYXV0b2ZpbGxfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImF1dG9maWxsXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJhdXRvZmlsbFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmF1dG9maWxsIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0cnVjdG9yKHdvcmxkLCByZW1vdGVPYmplY3QpIHtcbiAgICAgICAgICAgIHN1cGVyKG5ldyBDZHBKU0hhbmRsZSh3b3JsZCwgcmVtb3RlT2JqZWN0KSk7XG4gICAgICAgICAgICBfX3J1bkluaXRpYWxpemVycyh0aGlzLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHJlYWxtKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLnJlYWxtO1xuICAgICAgICB9XG4gICAgICAgIGdldCBjbGllbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGUuY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIHJlbW90ZU9iamVjdCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZS5yZW1vdGVPYmplY3QoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI2ZyYW1lTWFuYWdlcigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZyYW1lLl9mcmFtZU1hbmFnZXI7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGZyYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhbG0uZW52aXJvbm1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgY29udGVudEZyYW1lKCkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUluZm8gPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uZGVzY3JpYmVOb2RlJywge1xuICAgICAgICAgICAgICAgIG9iamVjdElkOiB0aGlzLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGVJbmZvLm5vZGUuZnJhbWVJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNmcmFtZU1hbmFnZXIuZnJhbWUobm9kZUluZm8ubm9kZS5mcmFtZUlkKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBzY3JvbGxJbnRvVmlldygpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0Q29ubmVjdGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byBFbGVtZW50LnNjcm9sbEludG9WaWV3IGlmIERPTS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkIGlzIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICBhd2FpdCBzdXBlci5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHVwbG9hZEZpbGUoLi4uZmlsZVBhdGhzKSB7XG4gICAgICAgICAgICBjb25zdCBpc011bHRpcGxlID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5tdWx0aXBsZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXNzZXJ0KGZpbGVQYXRocy5sZW5ndGggPD0gMSB8fCBpc011bHRpcGxlLCAnTXVsdGlwbGUgZmlsZSB1cGxvYWRzIG9ubHkgd29yayB3aXRoIDxpbnB1dCB0eXBlPWZpbGUgbXVsdGlwbGU+Jyk7XG4gICAgICAgICAgICAvLyBMb2NhdGUgYWxsIGZpbGVzIGFuZCBjb25maXJtIHRoYXQgdGhleSBleGlzdC5cbiAgICAgICAgICAgIGxldCBwYXRoO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXRoID0gYXdhaXQgaW1wb3J0KCdwYXRoJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBKU0hhbmRsZSN1cGxvYWRGaWxlIGNhbiBvbmx5IGJlIHVzZWQgaW4gTm9kZS1saWtlIGVudmlyb25tZW50cy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGZpbGVQYXRocy5tYXAoZmlsZVBhdGggPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoLndpbjMyLmlzQWJzb2x1dGUoZmlsZVBhdGgpIHx8IHBhdGgucG9zaXguaXNBYnNvbHV0ZShmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSB6ZXJvLWxlbmd0aCBhcnJheSBpcyBhIHNwZWNpYWwgY2FzZSwgaXQgc2VlbXMgdGhhdFxuICAgICAgICAgICAgICogRE9NLnNldEZpbGVJbnB1dEZpbGVzIGRvZXMgbm90IGFjdHVhbGx5IHVwZGF0ZSB0aGUgZmlsZXMgaW4gdGhhdCBjYXNlLCBzb1xuICAgICAgICAgICAgICogdGhlIHNvbHV0aW9uIGlzIHRvIGV2YWwgdGhlIGVsZW1lbnQgdmFsdWUgdG8gYSBuZXcgRmlsZUxpc3QgZGlyZWN0bHkuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBYWFg6IFRoZXNlIGV2ZW50cyBzaG91bGQgY29udmVydGVkIHRvIHRydXN0ZWQgZXZlbnRzLiBQZXJoYXBzIGRvIHRoaXNcbiAgICAgICAgICAgICAgICAvLyBpbiBgRE9NLnNldEZpbGVJbnB1dEZpbGVzYD9cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZpbGVzID0gbmV3IERhdGFUcmFuc2ZlcigpLmZpbGVzO1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaCBldmVudHMgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIGl0IHNob3VsZCBiZWhhdmUgYWtpbiB0byBhIHVzZXIgYWN0aW9uLlxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgbm9kZTogeyBiYWNrZW5kTm9kZUlkIH0sIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uZGVzY3JpYmVOb2RlJywge1xuICAgICAgICAgICAgICAgIG9iamVjdElkOiB0aGlzLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uc2V0RmlsZUlucHV0RmlsZXMnLCB7XG4gICAgICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZmlsZXMsXG4gICAgICAgICAgICAgICAgYmFja2VuZE5vZGVJZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGF1dG9maWxsKGRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJbmZvID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnRE9NLmRlc2NyaWJlTm9kZScsIHtcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5oYW5kbGUuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkSWQgPSBub2RlSW5mby5ub2RlLmJhY2tlbmROb2RlSWQ7XG4gICAgICAgICAgICBjb25zdCBmcmFtZUlkID0gdGhpcy5mcmFtZS5faWQ7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdBdXRvZmlsbC50cmlnZ2VyJywge1xuICAgICAgICAgICAgICAgIGZpZWxkSWQsXG4gICAgICAgICAgICAgICAgZnJhbWVJZCxcbiAgICAgICAgICAgICAgICBjYXJkOiBkYXRhLmNyZWRpdENhcmQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyAqcXVlcnlBWFRyZWUobmFtZSwgcm9sZSkge1xuICAgICAgICAgICAgY29uc3QgeyBub2RlcyB9ID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnQWNjZXNzaWJpbGl0eS5xdWVyeUFYVHJlZScsIHtcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBhY2Nlc3NpYmxlTmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gbm9kZXMuZmlsdGVyKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmlnbm9yZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUucm9sZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChOT05fRUxFTUVOVF9OT0RFX1JPTEVTLmhhcyhub2RlLnJvbGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogQXN5bmNJdGVyYWJsZVV0aWwubWFwKHJlc3VsdHMsIG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWxtLmFkb3B0QmFja2VuZE5vZGUobm9kZS5iYWNrZW5kRE9NTm9kZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5leHBvcnQgeyBDZHBFbGVtZW50SGFuZGxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbGVtZW50SGFuZGxlLmpzLm1hcCIsInZhciBfX3J1bkluaXRpYWxpemVycyA9ICh0aGlzICYmIHRoaXMuX19ydW5Jbml0aWFsaXplcnMpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG52YXIgX19lc0RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2VzRGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICAgIGRvbmUgPSB0cnVlO1xufTtcbnZhciBfX3NldEZ1bmN0aW9uTmFtZSA9ICh0aGlzICYmIHRoaXMuX19zZXRGdW5jdGlvbk5hbWUpIHx8IGZ1bmN0aW9uIChmLCBuYW1lLCBwcmVmaXgpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbkV2ZW50IH0gZnJvbSAnLi4vYXBpL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IGludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHMgfSBmcm9tICcuLi91dGlsL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRW11bGF0ZWRTdGF0ZSB7XG4gICAgI3N0YXRlO1xuICAgICNjbGllbnRQcm92aWRlcjtcbiAgICAjdXBkYXRlcjtcbiAgICBjb25zdHJ1Y3Rvcihpbml0aWFsU3RhdGUsIGNsaWVudFByb3ZpZGVyLCB1cGRhdGVyKSB7XG4gICAgICAgIHRoaXMuI3N0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgICAgICB0aGlzLiNjbGllbnRQcm92aWRlciA9IGNsaWVudFByb3ZpZGVyO1xuICAgICAgICB0aGlzLiN1cGRhdGVyID0gdXBkYXRlcjtcbiAgICAgICAgdGhpcy4jY2xpZW50UHJvdmlkZXIucmVnaXN0ZXJTdGF0ZSh0aGlzKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0U3RhdGUoc3RhdGUpIHtcbiAgICAgICAgdGhpcy4jc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gICAgfVxuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3N0YXRlO1xuICAgIH1cbiAgICBhc3luYyBzeW5jKCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLiNjbGllbnRQcm92aWRlci5jbGllbnRzKCkubWFwKGNsaWVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jdXBkYXRlcihjbGllbnQsIHRoaXMuI3N0YXRlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBFbXVsYXRpb25NYW5hZ2VyID0gKCgpID0+IHtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX3ByaXZhdGVfYXBwbHlWaWV3cG9ydF9kZWNvcmF0b3JzO1xuICAgIGxldCBfcHJpdmF0ZV9hcHBseVZpZXdwb3J0X2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVJZGxlU3RhdGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfZW11bGF0ZUlkbGVTdGF0ZV9kZXNjcmlwdG9yO1xuICAgIGxldCBfcHJpdmF0ZV9lbXVsYXRlVGltZXpvbmVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVWaXNpb25EZWZpY2llbmN5X2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVWaXNpb25EZWZpY2llbmN5X2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVNZWRpYUZlYXR1cmVzX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVNZWRpYUZlYXR1cmVzX2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVNZWRpYVR5cGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfZW11bGF0ZU1lZGlhVHlwZV9kZXNjcmlwdG9yO1xuICAgIGxldCBfcHJpdmF0ZV9zZXRHZW9sb2NhdGlvbl9kZWNvcmF0b3JzO1xuICAgIGxldCBfcHJpdmF0ZV9zZXRHZW9sb2NhdGlvbl9kZXNjcmlwdG9yO1xuICAgIGxldCBfcHJpdmF0ZV9zZXREZWZhdWx0QmFja2dyb3VuZENvbG9yX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX3NldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3JfZGVzY3JpcHRvcjtcbiAgICBsZXQgX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVzY3JpcHRvcjtcbiAgICByZXR1cm4gY2xhc3MgRW11bGF0aW9uTWFuYWdlciB7XG4gICAgICAgIHN0YXRpYyB7XG4gICAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9wcml2YXRlX2FwcGx5Vmlld3BvcnRfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX2VtdWxhdGVJZGxlU3RhdGVfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX2VtdWxhdGVUaW1lem9uZV9kZWNvcmF0b3JzID0gW2ludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHNdO1xuICAgICAgICAgICAgX3ByaXZhdGVfZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2RlY29yYXRvcnMgPSBbaW52b2tlQXRNb3N0T25jZUZvckFyZ3VtZW50c107XG4gICAgICAgICAgICBfcHJpdmF0ZV9lbXVsYXRlTWVkaWFGZWF0dXJlc19kZWNvcmF0b3JzID0gW2ludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHNdO1xuICAgICAgICAgICAgX3ByaXZhdGVfZW11bGF0ZU1lZGlhVHlwZV9kZWNvcmF0b3JzID0gW2ludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHNdO1xuICAgICAgICAgICAgX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX3NldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3JfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX3NldEphdmFTY3JpcHRFbmFibGVkX2RlY29yYXRvcnMgPSBbaW52b2tlQXRNb3N0T25jZUZvckFyZ3VtZW50c107XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfYXBwbHlWaWV3cG9ydF9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZpZXdwb3J0U3RhdGUudmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2VuZCgnRW11bGF0aW9uLmNsZWFyRGV2aWNlTWV0cmljc092ZXJyaWRlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRUb3VjaEVtdWxhdGlvbkVuYWJsZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB2aWV3cG9ydCB9ID0gdmlld3BvcnRTdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9iaWxlID0gdmlld3BvcnQuaXNNb2JpbGUgfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gdmlld3BvcnQud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHZpZXdwb3J0LmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlU2NhbGVGYWN0b3IgPSB2aWV3cG9ydC5kZXZpY2VTY2FsZUZhY3RvciA/PyAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JlZW5PcmllbnRhdGlvbiA9IHZpZXdwb3J0LmlzTGFuZHNjYXBlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHsgYW5nbGU6IDkwLCB0eXBlOiAnbGFuZHNjYXBlUHJpbWFyeScgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7IGFuZ2xlOiAwLCB0eXBlOiAncG9ydHJhaXRQcmltYXJ5JyB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNUb3VjaCA9IHZpZXdwb3J0Lmhhc1RvdWNoIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZCgnRW11bGF0aW9uLnNldERldmljZU1ldHJpY3NPdmVycmlkZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2JpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbk9yaWVudGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ1RhcmdldCBkb2VzIG5vdCBzdXBwb3J0IG1ldHJpY3Mgb3ZlcnJpZGUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldFRvdWNoRW11bGF0aW9uRW5hYmxlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBoYXNUb3VjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9LCBcIiNhcHBseVZpZXdwb3J0XCIpIH0sIF9wcml2YXRlX2FwcGx5Vmlld3BvcnRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNhcHBseVZpZXdwb3J0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjYXBwbHlWaWV3cG9ydCBpbiBvYmosIGdldDogb2JqID0+IG9iai4jYXBwbHlWaWV3cG9ydCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9lbXVsYXRlSWRsZVN0YXRlX2Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfX3NldEZ1bmN0aW9uTmFtZShhc3luYyBmdW5jdGlvbiAoY2xpZW50LCBpZGxlU3RhdGVTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlkbGVTdGF0ZVN0YXRlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZGxlU3RhdGVTdGF0ZS5vdmVycmlkZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdFbXVsYXRpb24uc2V0SWRsZU92ZXJyaWRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVXNlckFjdGl2ZTogaWRsZVN0YXRlU3RhdGUub3ZlcnJpZGVzLmlzVXNlckFjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NjcmVlblVubG9ja2VkOiBpZGxlU3RhdGVTdGF0ZS5vdmVycmlkZXMuaXNTY3JlZW5VbmxvY2tlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5jbGVhcklkbGVPdmVycmlkZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgXCIjZW11bGF0ZUlkbGVTdGF0ZVwiKSB9LCBfcHJpdmF0ZV9lbXVsYXRlSWRsZVN0YXRlX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZUlkbGVTdGF0ZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI2VtdWxhdGVJZGxlU3RhdGUgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouI2VtdWxhdGVJZGxlU3RhdGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfX3NldEZ1bmN0aW9uTmFtZShhc3luYyBmdW5jdGlvbiAoY2xpZW50LCB0aW1lem9uZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGltZXpvbmVTdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRUaW1lem9uZU92ZXJyaWRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV6b25lSWQ6IHRpbWV6b25lU3RhdGUudGltZXpvbmVJZCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRXJyb3JMaWtlKGVycm9yKSAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIHRpbWV6b25lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGltZXpvbmUgSUQ6ICR7dGltZXpvbmVTdGF0ZS50aW1lem9uZUlkfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBcIiNlbXVsYXRlVGltZXpvbmVcIikgfSwgX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZVRpbWV6b25lXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjZW11bGF0ZVRpbWV6b25lIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNlbXVsYXRlVGltZXpvbmUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lfZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChjbGllbnQsIHZpc2lvbkRlZmljaWVuY3kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2aXNpb25EZWZpY2llbmN5LmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdFbXVsYXRpb24uc2V0RW11bGF0ZWRWaXNpb25EZWZpY2llbmN5Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdmlzaW9uRGVmaWNpZW5jeS52aXNpb25EZWZpY2llbmN5IHx8ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgXCIjZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lcIikgfSwgX3ByaXZhdGVfZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNlbXVsYXRlVmlzaW9uRGVmaWNpZW5jeVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI2VtdWxhdGVWaXNpb25EZWZpY2llbmN5IGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNlbXVsYXRlVmlzaW9uRGVmaWNpZW5jeSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9lbXVsYXRlQ3B1VGhyb3R0bGluZ19kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldENQVVRocm90dGxpbmdSYXRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogc3RhdGUuZmFjdG9yID8/IDEsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIFwiI2VtdWxhdGVDcHVUaHJvdHRsaW5nXCIpIH0sIF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZUNwdVRocm90dGxpbmdcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogdHJ1ZSwgYWNjZXNzOiB7IGhhczogb2JqID0+ICNlbXVsYXRlQ3B1VGhyb3R0bGluZyBpbiBvYmosIGdldDogb2JqID0+IG9iai4jZW11bGF0ZUNwdVRocm90dGxpbmcgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZU1lZGlhRmVhdHVyZXNfZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChjbGllbnQsIHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRFbXVsYXRlZE1lZGlhJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IHN0YXRlLm1lZGlhRmVhdHVyZXMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIFwiI2VtdWxhdGVNZWRpYUZlYXR1cmVzXCIpIH0sIF9wcml2YXRlX2VtdWxhdGVNZWRpYUZlYXR1cmVzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZU1lZGlhRmVhdHVyZXNcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogdHJ1ZSwgYWNjZXNzOiB7IGhhczogb2JqID0+ICNlbXVsYXRlTWVkaWFGZWF0dXJlcyBpbiBvYmosIGdldDogb2JqID0+IG9iai4jZW11bGF0ZU1lZGlhRmVhdHVyZXMgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZU1lZGlhVHlwZV9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldEVtdWxhdGVkTWVkaWEnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTogc3RhdGUudHlwZSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgXCIjZW11bGF0ZU1lZGlhVHlwZVwiKSB9LCBfcHJpdmF0ZV9lbXVsYXRlTWVkaWFUeXBlX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZU1lZGlhVHlwZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI2VtdWxhdGVNZWRpYVR5cGUgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouI2VtdWxhdGVNZWRpYVR5cGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChjbGllbnQsIHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRHZW9sb2NhdGlvbk92ZXJyaWRlJywgc3RhdGUuZ2VvTG9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogc3RhdGUuZ2VvTG9jYXRpb24ubG9uZ2l0dWRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlOiBzdGF0ZS5nZW9Mb2NhdGlvbi5sYXRpdHVkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeTogc3RhdGUuZ2VvTG9jYXRpb24uYWNjdXJhY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfSwgXCIjc2V0R2VvbG9jYXRpb25cIikgfSwgX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNzZXRHZW9sb2NhdGlvblwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI3NldEdlb2xvY2F0aW9uIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNzZXRHZW9sb2NhdGlvbiB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9zZXREZWZhdWx0QmFja2dyb3VuZENvbG9yX2Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfX3NldEZ1bmN0aW9uTmFtZShhc3luYyBmdW5jdGlvbiAoY2xpZW50LCBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdFbXVsYXRpb24uc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvck92ZXJyaWRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHN0YXRlLmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCBcIiNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yXCIpIH0sIF9wcml2YXRlX3NldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3JfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvciBpbiBvYmosIGdldDogb2JqID0+IG9iai4jc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvciB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9zZXRKYXZhU2NyaXB0RW5hYmxlZF9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldFNjcmlwdEV4ZWN1dGlvbkRpc2FibGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICFzdGF0ZS5qYXZhU2NyaXB0RW5hYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgXCIjc2V0SmF2YVNjcmlwdEVuYWJsZWRcIikgfSwgX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNzZXRKYXZhU2NyaXB0RW5hYmxlZFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI3NldEphdmFTY3JpcHRFbmFibGVkIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNzZXRKYXZhU2NyaXB0RW5hYmxlZCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICAjY2xpZW50ID0gX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAjZW11bGF0aW5nTW9iaWxlID0gZmFsc2U7XG4gICAgICAgICNoYXNUb3VjaCA9IGZhbHNlO1xuICAgICAgICAjc3RhdGVzID0gW107XG4gICAgICAgICN2aWV3cG9ydFN0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jYXBwbHlWaWV3cG9ydCk7XG4gICAgICAgICNpZGxlT3ZlcnJpZGVzU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNlbXVsYXRlSWRsZVN0YXRlKTtcbiAgICAgICAgI3RpbWV6b25lU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNlbXVsYXRlVGltZXpvbmUpO1xuICAgICAgICAjdmlzaW9uRGVmaWNpZW5jeVN0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jZW11bGF0ZVZpc2lvbkRlZmljaWVuY3kpO1xuICAgICAgICAjY3B1VGhyb3R0bGluZ1N0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jZW11bGF0ZUNwdVRocm90dGxpbmcpO1xuICAgICAgICAjbWVkaWFGZWF0dXJlc1N0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jZW11bGF0ZU1lZGlhRmVhdHVyZXMpO1xuICAgICAgICAjbWVkaWFUeXBlU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNlbXVsYXRlTWVkaWFUeXBlKTtcbiAgICAgICAgI2dlb0xvY2F0aW9uU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNzZXRHZW9sb2NhdGlvbik7XG4gICAgICAgICNkZWZhdWx0QmFja2dyb3VuZENvbG9yU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgI2phdmFzY3JpcHRFbmFibGVkU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBqYXZhU2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgIH0sIHRoaXMsIHRoaXMuI3NldEphdmFTY3JpcHRFbmFibGVkKTtcbiAgICAgICAgI3NlY29uZGFyeUNsaWVudHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGNvbnN0cnVjdG9yKGNsaWVudCkge1xuICAgICAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUNsaWVudChjbGllbnQpIHtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICAgICAgICAgIHRoaXMuI3NlY29uZGFyeUNsaWVudHMuZGVsZXRlKGNsaWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVnaXN0ZXJTdGF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy4jc3RhdGVzLnB1c2goc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGNsaWVudHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gW3RoaXMuI2NsaWVudCwgLi4uQXJyYXkuZnJvbSh0aGlzLiNzZWNvbmRhcnlDbGllbnRzKV07XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgcmVnaXN0ZXJTcGVjdWxhdGl2ZVNlc3Npb24oY2xpZW50KSB7XG4gICAgICAgICAgICB0aGlzLiNzZWNvbmRhcnlDbGllbnRzLmFkZChjbGllbnQpO1xuICAgICAgICAgICAgY2xpZW50Lm9uY2UoQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI3NlY29uZGFyeUNsaWVudHMuZGVsZXRlKGNsaWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IGF3YWl0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvIHJlZ2lzdGVyIGFsbCBzdGF0ZSBjaGFuZ2VzIGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBpcyB1bnBhdXNlZC5cbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGwodGhpcy4jc3RhdGVzLm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcy5zeW5jKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGphdmFzY3JpcHRFbmFibGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2phdmFzY3JpcHRFbmFibGVkU3RhdGUuc3RhdGUuamF2YVNjcmlwdEVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgZW11bGF0ZVZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLiN2aWV3cG9ydFN0YXRlLnN0YXRlO1xuICAgICAgICAgICAgaWYgKCF2aWV3cG9ydCAmJiAhY3VycmVudFN0YXRlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3ZpZXdwb3J0U3RhdGUuc2V0U3RhdGUodmlld3BvcnRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgdmlld3BvcnQsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBtb2JpbGUgPSB2aWV3cG9ydD8uaXNNb2JpbGUgfHwgZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBoYXNUb3VjaCA9IHZpZXdwb3J0Py5oYXNUb3VjaCB8fCBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHJlbG9hZE5lZWRlZCA9IHRoaXMuI2VtdWxhdGluZ01vYmlsZSAhPT0gbW9iaWxlIHx8IHRoaXMuI2hhc1RvdWNoICE9PSBoYXNUb3VjaDtcbiAgICAgICAgICAgIHRoaXMuI2VtdWxhdGluZ01vYmlsZSA9IG1vYmlsZTtcbiAgICAgICAgICAgIHRoaXMuI2hhc1RvdWNoID0gaGFzVG91Y2g7XG4gICAgICAgICAgICByZXR1cm4gcmVsb2FkTmVlZGVkO1xuICAgICAgICB9XG4gICAgICAgIGdldCAjYXBwbHlWaWV3cG9ydCgpIHsgcmV0dXJuIF9wcml2YXRlX2FwcGx5Vmlld3BvcnRfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBlbXVsYXRlSWRsZVN0YXRlKG92ZXJyaWRlcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jaWRsZU92ZXJyaWRlc1N0YXRlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0ICNlbXVsYXRlSWRsZVN0YXRlKCkgeyByZXR1cm4gX3ByaXZhdGVfZW11bGF0ZUlkbGVTdGF0ZV9kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIGdldCAjZW11bGF0ZVRpbWV6b25lKCkgeyByZXR1cm4gX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2Rlc2NyaXB0b3IudmFsdWU7IH1cbiAgICAgICAgYXN5bmMgZW11bGF0ZVRpbWV6b25lKHRpbWV6b25lSWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3RpbWV6b25lU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHRpbWV6b25lSWQsXG4gICAgICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0ICNlbXVsYXRlVmlzaW9uRGVmaWNpZW5jeSgpIHsgcmV0dXJuIF9wcml2YXRlX2VtdWxhdGVWaXNpb25EZWZpY2llbmN5X2Rlc2NyaXB0b3IudmFsdWU7IH1cbiAgICAgICAgYXN5bmMgZW11bGF0ZVZpc2lvbkRlZmljaWVuY3kodHlwZSkge1xuICAgICAgICAgICAgY29uc3QgdmlzaW9uRGVmaWNpZW5jaWVzID0gbmV3IFNldChbXG4gICAgICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgICAgICdhY2hyb21hdG9wc2lhJyxcbiAgICAgICAgICAgICAgICAnYmx1cnJlZFZpc2lvbicsXG4gICAgICAgICAgICAgICAgJ2RldXRlcmFub3BpYScsXG4gICAgICAgICAgICAgICAgJ3Byb3Rhbm9waWEnLFxuICAgICAgICAgICAgICAgICd0cml0YW5vcGlhJyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgYXNzZXJ0KCF0eXBlIHx8IHZpc2lvbkRlZmljaWVuY2llcy5oYXModHlwZSksIGBVbnN1cHBvcnRlZCB2aXNpb24gZGVmaWNpZW5jeTogJHt0eXBlfWApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jdmlzaW9uRGVmaWNpZW5jeVN0YXRlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmlzaW9uRGVmaWNpZW5jeTogdHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCAjZW11bGF0ZUNwdVRocm90dGxpbmcoKSB7IHJldHVybiBfcHJpdmF0ZV9lbXVsYXRlQ3B1VGhyb3R0bGluZ19kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIGFzeW5jIGVtdWxhdGVDUFVUaHJvdHRsaW5nKGZhY3Rvcikge1xuICAgICAgICAgICAgYXNzZXJ0KGZhY3RvciA9PT0gbnVsbCB8fCBmYWN0b3IgPj0gMSwgJ1Rocm90dGxpbmcgcmF0ZSBzaG91bGQgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxJyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNjcHVUaHJvdHRsaW5nU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBmYWN0b3I6IGZhY3RvciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI2VtdWxhdGVNZWRpYUZlYXR1cmVzKCkgeyByZXR1cm4gX3ByaXZhdGVfZW11bGF0ZU1lZGlhRmVhdHVyZXNfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBlbXVsYXRlTWVkaWFGZWF0dXJlcyhmZWF0dXJlcykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmVhdHVyZXMpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtZWRpYUZlYXR1cmUgb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IG1lZGlhRmVhdHVyZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQoL14oPzpwcmVmZXJzLSg/OmNvbG9yLXNjaGVtZXxyZWR1Y2VkLW1vdGlvbil8Y29sb3ItZ2FtdXQpJC8udGVzdChuYW1lKSwgJ1Vuc3VwcG9ydGVkIG1lZGlhIGZlYXR1cmU6ICcgKyBuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNtZWRpYUZlYXR1cmVzU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZWRpYUZlYXR1cmVzOiBmZWF0dXJlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCAjZW11bGF0ZU1lZGlhVHlwZSgpIHsgcmV0dXJuIF9wcml2YXRlX2VtdWxhdGVNZWRpYVR5cGVfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBlbXVsYXRlTWVkaWFUeXBlKHR5cGUpIHtcbiAgICAgICAgICAgIGFzc2VydCh0eXBlID09PSAnc2NyZWVuJyB8fFxuICAgICAgICAgICAgICAgIHR5cGUgPT09ICdwcmludCcgfHxcbiAgICAgICAgICAgICAgICAodHlwZSA/PyB1bmRlZmluZWQpID09PSB1bmRlZmluZWQsICdVbnN1cHBvcnRlZCBtZWRpYSB0eXBlOiAnICsgdHlwZSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNtZWRpYVR5cGVTdGF0ZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI3NldEdlb2xvY2F0aW9uKCkgeyByZXR1cm4gX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBzZXRHZW9sb2NhdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCB7IGxvbmdpdHVkZSwgbGF0aXR1ZGUsIGFjY3VyYWN5ID0gMCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGlmIChsb25naXR1ZGUgPCAtMTgwIHx8IGxvbmdpdHVkZSA+IDE4MCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb25naXR1ZGUgXCIke2xvbmdpdHVkZX1cIjogcHJlY29uZGl0aW9uIC0xODAgPD0gTE9OR0lUVURFIDw9IDE4MCBmYWlsZWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGF0aXR1ZGUgPCAtOTAgfHwgbGF0aXR1ZGUgPiA5MCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsYXRpdHVkZSBcIiR7bGF0aXR1ZGV9XCI6IHByZWNvbmRpdGlvbiAtOTAgPD0gTEFUSVRVREUgPD0gOTAgZmFpbGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFjY3VyYWN5IDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhY2N1cmFjeSBcIiR7YWNjdXJhY3l9XCI6IHByZWNvbmRpdGlvbiAwIDw9IEFDQ1VSQUNZIGZhaWxlZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2dlb0xvY2F0aW9uU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW9Mb2NhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGUsXG4gICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlLFxuICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0ICNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yKCkgeyByZXR1cm4gX3ByaXZhdGVfc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvcl9kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXNldHMgZGVmYXVsdCB3aGl0ZSBiYWNrZ3JvdW5kXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyByZXNldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNkZWZhdWx0QmFja2dyb3VuZENvbG9yU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhpZGVzIGRlZmF1bHQgd2hpdGUgYmFja2dyb3VuZFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNkZWZhdWx0QmFja2dyb3VuZENvbG9yU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogeyByOiAwLCBnOiAwLCBiOiAwLCBhOiAwIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI3NldEphdmFTY3JpcHRFbmFibGVkKCkgeyByZXR1cm4gX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBzZXRKYXZhU2NyaXB0RW5hYmxlZChlbmFibGVkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNqYXZhc2NyaXB0RW5hYmxlZFN0YXRlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgamF2YVNjcmlwdEVuYWJsZWQ6IGVuYWJsZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuZXhwb3J0IHsgRW11bGF0aW9uTWFuYWdlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RW11bGF0aW9uTWFuYWdlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbmltcG9ydCB7IENEUFNlc3Npb25FdmVudCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4uL2NvbW1vbi9MYXp5QXJnLmpzJztcbmltcG9ydCB7IHNjcmlwdEluamVjdG9yIH0gZnJvbSAnLi4vY29tbW9uL1NjcmlwdEluamVjdG9yLmpzJztcbmltcG9ydCB7IFB1cHBldGVlclVSTCwgU09VUkNFX1VSTF9SRUdFWCwgZGVidWdFcnJvciwgZ2V0U291cmNlUHVwcGV0ZWVyVVJMSWZBdmFpbGFibGUsIGdldFNvdXJjZVVybENvbW1lbnQsIGlzU3RyaW5nLCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IEFzeW5jSXRlcmFibGVVdGlsIH0gZnJvbSAnLi4vdXRpbC9Bc3luY0l0ZXJhYmxlVXRpbC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2ssIGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5RnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL0Z1bmN0aW9uLmpzJztcbmltcG9ydCB7IE11dGV4IH0gZnJvbSAnLi4vdXRpbC9NdXRleC5qcyc7XG5pbXBvcnQgeyBBUklBUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9BcmlhUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IEJpbmRpbmcgfSBmcm9tICcuL0JpbmRpbmcuanMnO1xuaW1wb3J0IHsgQ2RwRWxlbWVudEhhbmRsZSB9IGZyb20gJy4vRWxlbWVudEhhbmRsZS5qcyc7XG5pbXBvcnQgeyBDZHBKU0hhbmRsZSB9IGZyb20gJy4vSlNIYW5kbGUuanMnO1xuaW1wb3J0IHsgYWRkUGFnZUJpbmRpbmcsIENEUF9CSU5ESU5HX1BSRUZJWCwgY3JlYXRlRXZhbHVhdGlvbkVycm9yLCB2YWx1ZUZyb21SZW1vdGVPYmplY3QsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5jb25zdCBhcmlhUXVlcnlTZWxlY3RvckJpbmRpbmcgPSBuZXcgQmluZGluZygnX19hcmlhUXVlcnlTZWxlY3RvcicsIEFSSUFRdWVyeUhhbmRsZXIucXVlcnlPbmUsICcnIC8vIGN1c3RvbSBpbml0XG4pO1xuY29uc3QgYXJpYVF1ZXJ5U2VsZWN0b3JBbGxCaW5kaW5nID0gbmV3IEJpbmRpbmcoJ19fYXJpYVF1ZXJ5U2VsZWN0b3JBbGwnLCAoYXN5bmMgKGVsZW1lbnQsIHNlbGVjdG9yKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IEFSSUFRdWVyeUhhbmRsZXIucXVlcnlBbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICAgIHJldHVybiBhd2FpdCBlbGVtZW50LnJlYWxtLmV2YWx1YXRlSGFuZGxlKCguLi5lbGVtZW50cykgPT4ge1xuICAgICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfSwgLi4uKGF3YWl0IEFzeW5jSXRlcmFibGVVdGlsLmNvbGxlY3QocmVzdWx0cykpKTtcbn0pLCAnJyAvLyBjdXN0b20gaW5pdFxuKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICAjY2xpZW50O1xuICAgICN3b3JsZDtcbiAgICAjaWQ7XG4gICAgI25hbWU7XG4gICAgI2Rpc3Bvc2FibGVzID0gbmV3IERpc3Bvc2FibGVTdGFjaygpO1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCwgY29udGV4dFBheWxvYWQsIHdvcmxkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICAgICAgdGhpcy4jd29ybGQgPSB3b3JsZDtcbiAgICAgICAgdGhpcy4jaWQgPSBjb250ZXh0UGF5bG9hZC5pZDtcbiAgICAgICAgaWYgKGNvbnRleHRQYXlsb2FkLm5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuI25hbWUgPSBjb250ZXh0UGF5bG9hZC5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsaWVudEVtaXR0ZXIgPSB0aGlzLiNkaXNwb3NhYmxlcy51c2UobmV3IEV2ZW50RW1pdHRlcih0aGlzLiNjbGllbnQpKTtcbiAgICAgICAgY2xpZW50RW1pdHRlci5vbignUnVudGltZS5iaW5kaW5nQ2FsbGVkJywgdGhpcy4jb25CaW5kaW5nQ2FsbGVkLmJpbmQodGhpcykpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHREZXN0cm95ZWQnLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5leGVjdXRpb25Db250ZXh0SWQgPT09IHRoaXMuI2lkKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tkaXNwb3NlU3ltYm9sXSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY2xpZW50RW1pdHRlci5vbignUnVudGltZS5leGVjdXRpb25Db250ZXh0c0NsZWFyZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdSdW50aW1lLmNvbnNvbGVBUElDYWxsZWQnLCB0aGlzLiNvbkNvbnNvbGVBUEkuYmluZCh0aGlzKSk7XG4gICAgICAgIGNsaWVudEVtaXR0ZXIub24oQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpc1tkaXNwb3NlU3ltYm9sXSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ29udGFpbnMgbWFwcGluZyBmcm9tIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBib3VuZCB0byBQdXBwZXRlZXIgZnVuY3Rpb25zLlxuICAgICNiaW5kaW5ncyA9IG5ldyBNYXAoKTtcbiAgICAvLyBJZiBtdWx0aXBsZSB3YWl0Rm9yIGFyZSBzZXQgdXAgYXN5bmNocm9ub3VzbHksIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlXG4gICAgLy8gZmlyc3Qgb25lIHRvIHNldCB1cCB0aGUgYmluZGluZyBpbiB0aGUgcGFnZSBiZWZvcmUgcnVubmluZyB0aGUgb3RoZXJzLlxuICAgICNtdXRleCA9IG5ldyBNdXRleCgpO1xuICAgIGFzeW5jICNhZGRCaW5kaW5nKGJpbmRpbmcpIHtcbiAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jYmluZGluZ3MuaGFzKGJpbmRpbmcubmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBfID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHRoaXMuI211dGV4LmFjcXVpcmUoKSwgZmFsc2UpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnUnVudGltZS5hZGRCaW5kaW5nJywgdGhpcy4jbmFtZVxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IENEUF9CSU5ESU5HX1BSRUZJWCArIGJpbmRpbmcubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHROYW1lOiB0aGlzLiNuYW1lLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogQ0RQX0JJTkRJTkdfUFJFRklYICsgYmluZGluZy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dElkOiB0aGlzLiNpZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShhZGRQYWdlQmluZGluZywgJ2ludGVybmFsJywgYmluZGluZy5uYW1lLCBDRFBfQklORElOR19QUkVGSVgpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2JpbmRpbmdzLnNldChiaW5kaW5nLm5hbWUsIGJpbmRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY291bGQgaGF2ZSB0cmllZCB0byBldmFsdWF0ZSBpbiBhIGNvbnRleHQgd2hpY2ggd2FzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAvLyBkZXN0cm95ZWQuIFRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsIGlmIHRoZSBwYWdlIGlzIG5hdmlnYXRlZCB3aGlsZVxuICAgICAgICAgICAgICAgIC8vIHdlIGFyZSB0cnlpbmcgdG8gYWRkIHRoZSBiaW5kaW5nXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVzdHJveWVkIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFeGVjdXRpb24gY29udGV4dCB3YXMgZGVzdHJveWVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBNaXNzaW5nIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdDYW5ub3QgZmluZCBjb250ZXh0IHdpdGggc3BlY2lmaWVkIGlkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI29uQmluZGluZ0NhbGxlZChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQuZXhlY3V0aW9uQ29udGV4dElkICE9PSB0aGlzLiNpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXlsb2FkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoZXZlbnQucGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgLy8gVGhlIGJpbmRpbmcgd2FzIGVpdGhlciBjYWxsZWQgYnkgc29tZXRoaW5nIGluIHRoZSBwYWdlIG9yIGl0IHdhc1xuICAgICAgICAgICAgLy8gY2FsbGVkIGJlZm9yZSBvdXIgd3JhcHBlciB3YXMgaW5pdGlhbGl6ZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlLCBuYW1lLCBzZXEsIGFyZ3MsIGlzVHJpdmlhbCB9ID0gcGF5bG9hZDtcbiAgICAgICAgaWYgKHR5cGUgIT09ICdpbnRlcm5hbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYmluZGluZ2NhbGxlZCcsIGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuI2JpbmRpbmdzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdiaW5kaW5nY2FsbGVkJywgZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy4jYmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgYXdhaXQgYmluZGluZz8ucnVuKHRoaXMsIHNlcSwgYXJncywgaXNUcml2aWFsKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaWQ7XG4gICAgfVxuICAgICNvbkNvbnNvbGVBUEkoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmV4ZWN1dGlvbkNvbnRleHRJZCAhPT0gdGhpcy4jaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoJ2NvbnNvbGVhcGljYWxsZWQnLCBldmVudCk7XG4gICAgfVxuICAgICNiaW5kaW5nc0luc3RhbGxlZCA9IGZhbHNlO1xuICAgICNwdXBwZXRlZXJVdGlsO1xuICAgIGdldCBwdXBwZXRlZXJVdGlsKCkge1xuICAgICAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBpZiAoIXRoaXMuI2JpbmRpbmdzSW5zdGFsbGVkKSB7XG4gICAgICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2FkZEJpbmRpbmdXaXRob3V0VGhyb3dpbmcoYXJpYVF1ZXJ5U2VsZWN0b3JCaW5kaW5nKSxcbiAgICAgICAgICAgICAgICB0aGlzLiNhZGRCaW5kaW5nV2l0aG91dFRocm93aW5nKGFyaWFRdWVyeVNlbGVjdG9yQWxsQmluZGluZyksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHRoaXMuI2JpbmRpbmdzSW5zdGFsbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBzY3JpcHRJbmplY3Rvci5pbmplY3Qoc2NyaXB0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNwdXBwZXRlZXJVdGlsKSB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLiNwdXBwZXRlZXJVdGlsLnRoZW4oaGFuZGxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdm9pZCBoYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jcHVwcGV0ZWVyVXRpbCA9IHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVIYW5kbGUoc2NyaXB0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCAhdGhpcy4jcHVwcGV0ZWVyVXRpbCk7XG4gICAgICAgIHJldHVybiB0aGlzLiNwdXBwZXRlZXJVdGlsO1xuICAgIH1cbiAgICBhc3luYyAjYWRkQmluZGluZ1dpdGhvdXRUaHJvd2luZyhiaW5kaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNhZGRCaW5kaW5nKGJpbmRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZSBhZGRlZCwgdGhlbiBlaXRoZXIgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0XG4gICAgICAgICAgICAvLyBiaW5kaW5ncyAoZS5nLiBGaXJlZm94KSBvciB0aGUgY29udGV4dCBpcyBicm9rZW4uIEVpdGhlciBicmVha2FnZSBpc1xuICAgICAgICAgICAgLy8gb2theSwgc28gd2UgaWdub3JlIHRoZSBlcnJvci5cbiAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IGF3YWl0IHBhZ2UubWFpbkZyYW1lKCkuZXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGUoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKDggKiA3KSkqIDtcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBwcmludHMgXCI1NlwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIEEgc3RyaW5nIGNhbiBhbHNvIGJlIHBhc3NlZCBpbiBpbnN0ZWFkIG9mIGEgZnVuY3Rpb246XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnNvbGUubG9nKGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGUoJzEgKyAyJykpOyAvLyBwcmludHMgXCIzXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogSGFuZGxlcyBjYW4gYWxzbyBiZSBwYXNzZWQgYXMgYGFyZ3NgLiBUaGV5IHJlc29sdmUgdG8gdGhlaXIgcmVmZXJlbmNlZCBvYmplY3Q6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IG9uZUhhbmRsZSA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGVIYW5kbGUoKCkgPT4gMSk7XG4gICAgICogY29uc3QgdHdvSGFuZGxlID0gYXdhaXQgZXhlY3V0aW9uQ29udGV4dC5ldmFsdWF0ZUhhbmRsZSgoKSA9PiAyKTtcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRpb25Db250ZXh0LmV2YWx1YXRlKFxuICAgICAqICAgKGEsIGIpID0+IGEgKyBiLFxuICAgICAqICAgb25lSGFuZGxlLFxuICAgICAqICAgdHdvSGFuZGxlXG4gICAgICogKTtcbiAgICAgKiBhd2FpdCBvbmVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAqIGF3YWl0IHR3b0hhbmRsZS5kaXNwb3NlKCk7XG4gICAgICogY29uc29sZS5sb2cocmVzdWx0KTsgLy8gcHJpbnRzICczJy5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIGludG8gdGhlIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZnVuY3Rpb24uIElmIHRoZSByZXN1bHQgaXMgYW4gb2JqZWN0LFxuICAgICAqIGEgdmFuaWxsYSBvYmplY3QgY29udGFpbmluZyB0aGUgc2VyaWFsaXphYmxlIHByb3BlcnRpZXMgb2YgdGhlIHJlc3VsdCBpc1xuICAgICAqIHJldHVybmVkLlxuICAgICAqL1xuICAgIGFzeW5jIGV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZXZhbHVhdGUodHJ1ZSwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZhbHVhdGVzIHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIFVubGlrZSB7QGxpbmsgRXhlY3V0aW9uQ29udGV4dC5ldmFsdWF0ZSB8IGV2YWx1YXRlfSwgdGhpcyBtZXRob2QgcmV0dXJucyBhXG4gICAgICogaGFuZGxlIHRvIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGJldHRlciBzdWl0ZWQgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgc2VyaWFsaXplZCAoZS5nLlxuICAgICAqIGBNYXBgKSBhbmQgcmVxdWlyZXMgZnVydGhlciBtYW5pcHVsYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBjb250ZXh0ID0gYXdhaXQgcGFnZS5tYWluRnJhbWUoKS5leGVjdXRpb25Db250ZXh0KCk7XG4gICAgICogY29uc3QgaGFuZGxlOiBKU0hhbmRsZTx0eXBlb2YgZ2xvYmFsVGhpcz4gPSBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKFxuICAgICAqICAgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHNlbGYpXG4gICAgICogKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogQSBzdHJpbmcgY2FuIGFsc28gYmUgcGFzc2VkIGluIGluc3RlYWQgb2YgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgaGFuZGxlOiBKU0hhbmRsZTxudW1iZXI+ID0gYXdhaXQgY29udGV4dC5ldmFsdWF0ZUhhbmRsZSgnMSArIDInKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogSGFuZGxlcyBjYW4gYWxzbyBiZSBwYXNzZWQgYXMgYGFyZ3NgLiBUaGV5IHJlc29sdmUgdG8gdGhlaXIgcmVmZXJlbmNlZCBvYmplY3Q6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGJvZHlIYW5kbGU6IEVsZW1lbnRIYW5kbGU8SFRNTEJvZHlFbGVtZW50PiA9XG4gICAgICogICBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKCgpID0+IHtcbiAgICAgKiAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG4gICAgICogICB9KTtcbiAgICAgKiBjb25zdCBzdHJpbmdIYW5kbGU6IEpTSGFuZGxlPHN0cmluZz4gPSBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKFxuICAgICAqICAgYm9keSA9PiBib2R5LmlubmVySFRNTCxcbiAgICAgKiAgIGJvZHlcbiAgICAgKiApO1xuICAgICAqIGNvbnNvbGUubG9nKGF3YWl0IHN0cmluZ0hhbmRsZS5qc29uVmFsdWUoKSk7IC8vIHByaW50cyBib2R5J3MgaW5uZXJIVE1MXG4gICAgICogLy8gQWx3YXlzIGRpc3Bvc2UgeW91ciBnYXJiYWdlISA6KVxuICAgICAqIGF3YWl0IGJvZHlIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAqIGF3YWl0IHN0cmluZ0hhbmRsZS5kaXNwb3NlKCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFnZUZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyBpbnRvIHRoZSBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIHtAbGluayBKU0hhbmRsZSB8IGhhbmRsZX0gdG8gdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZVxuICAgICAqIGZ1bmN0aW9uLiBJZiB0aGUgcmVzdWx0IGlzIGEgYE5vZGVgLCB0aGVuIHRoaXMgd2lsbCByZXR1cm4gYW5cbiAgICAgKiB7QGxpbmsgRWxlbWVudEhhbmRsZSB8IGVsZW1lbnQgaGFuZGxlfS5cbiAgICAgKi9cbiAgICBhc3luYyBldmFsdWF0ZUhhbmRsZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2V2YWx1YXRlKGZhbHNlLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpO1xuICAgIH1cbiAgICBhc3luYyAjZXZhbHVhdGUocmV0dXJuQnlWYWx1ZSwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVVybENvbW1lbnQgPSBnZXRTb3VyY2VVcmxDb21tZW50KGdldFNvdXJjZVB1cHBldGVlclVSTElmQXZhaWxhYmxlKHBhZ2VGdW5jdGlvbik/LnRvU3RyaW5nKCkgPz9cbiAgICAgICAgICAgIFB1cHBldGVlclVSTC5JTlRFUk5BTF9VUkwpO1xuICAgICAgICBpZiAoaXNTdHJpbmcocGFnZUZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dElkID0gdGhpcy4jaWQ7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uID0gcGFnZUZ1bmN0aW9uO1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbldpdGhTb3VyY2VVcmwgPSBTT1VSQ0VfVVJMX1JFR0VYLnRlc3QoZXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICA/IGV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICA6IGAke2V4cHJlc3Npb259XFxuJHtzb3VyY2VVcmxDb21tZW50fVxcbmA7XG4gICAgICAgICAgICBjb25zdCB7IGV4Y2VwdGlvbkRldGFpbHMsIHJlc3VsdDogcmVtb3RlT2JqZWN0IH0gPSBhd2FpdCB0aGlzLiNjbGllbnRcbiAgICAgICAgICAgICAgICAuc2VuZCgnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uV2l0aFNvdXJjZVVybCxcbiAgICAgICAgICAgICAgICBjb250ZXh0SWQsXG4gICAgICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZSxcbiAgICAgICAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgICAgICAgdXNlckdlc3R1cmU6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZXdyaXRlRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbkRldGFpbHMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVFdmFsdWF0aW9uRXJyb3IoZXhjZXB0aW9uRGV0YWlscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuQnlWYWx1ZVxuICAgICAgICAgICAgICAgID8gdmFsdWVGcm9tUmVtb3RlT2JqZWN0KHJlbW90ZU9iamVjdClcbiAgICAgICAgICAgICAgICA6IHRoaXMuI3dvcmxkLmNyZWF0ZUNkcEhhbmRsZShyZW1vdGVPYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uRGVjbGFyYXRpb24gPSBzdHJpbmdpZnlGdW5jdGlvbihwYWdlRnVuY3Rpb24pO1xuICAgICAgICBjb25zdCBmdW5jdGlvbkRlY2xhcmF0aW9uV2l0aFNvdXJjZVVybCA9IFNPVVJDRV9VUkxfUkVHRVgudGVzdChmdW5jdGlvbkRlY2xhcmF0aW9uKVxuICAgICAgICAgICAgPyBmdW5jdGlvbkRlY2xhcmF0aW9uXG4gICAgICAgICAgICA6IGAke2Z1bmN0aW9uRGVjbGFyYXRpb259XFxuJHtzb3VyY2VVcmxDb21tZW50fVxcbmA7XG4gICAgICAgIGxldCBjYWxsRnVuY3Rpb25PblByb21pc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjYWxsRnVuY3Rpb25PblByb21pc2UgPSB0aGlzLiNjbGllbnQuc2VuZCgnUnVudGltZS5jYWxsRnVuY3Rpb25PbicsIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbkRlY2xhcmF0aW9uOiBmdW5jdGlvbkRlY2xhcmF0aW9uV2l0aFNvdXJjZVVybCxcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0SWQ6IHRoaXMuI2lkLFxuICAgICAgICAgICAgICAgIGFyZ3VtZW50czogYXJncy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBQcm9taXNlLmFsbChhcmdzLm1hcChjb252ZXJ0QXJndW1lbnQuYmluZCh0aGlzKSkpXG4gICAgICAgICAgICAgICAgICAgIDogW10sXG4gICAgICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZSxcbiAgICAgICAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgICAgICAgdXNlckdlc3R1cmU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJlxuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTicpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSArPSAnIFJlY3Vyc2l2ZSBvYmplY3RzIGFyZSBub3QgYWxsb3dlZC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBleGNlcHRpb25EZXRhaWxzLCByZXN1bHQ6IHJlbW90ZU9iamVjdCB9ID0gYXdhaXQgY2FsbEZ1bmN0aW9uT25Qcm9taXNlLmNhdGNoKHJld3JpdGVFcnJvcik7XG4gICAgICAgIGlmIChleGNlcHRpb25EZXRhaWxzKSB7XG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVFdmFsdWF0aW9uRXJyb3IoZXhjZXB0aW9uRGV0YWlscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldHVybkJ5VmFsdWVcbiAgICAgICAgICAgID8gdmFsdWVGcm9tUmVtb3RlT2JqZWN0KHJlbW90ZU9iamVjdClcbiAgICAgICAgICAgIDogdGhpcy4jd29ybGQuY3JlYXRlQ2RwSGFuZGxlKHJlbW90ZU9iamVjdCk7XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRBcmd1bWVudChhcmcpIHtcbiAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBMYXp5QXJnKSB7XG4gICAgICAgICAgICAgICAgYXJnID0gYXdhaXQgYXJnLmdldCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdmFsaWQtdHlwZW9mXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdW5zZXJpYWxpemFibGVWYWx1ZTogYCR7YXJnLnRvU3RyaW5nKCl9bmAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChPYmplY3QuaXMoYXJnLCAtMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB1bnNlcmlhbGl6YWJsZVZhbHVlOiAnLTAnIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmlzKGFyZywgSW5maW5pdHkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdW5zZXJpYWxpemFibGVWYWx1ZTogJ0luZmluaXR5JyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE9iamVjdC5pcyhhcmcsIC1JbmZpbml0eSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB1bnNlcmlhbGl6YWJsZVZhbHVlOiAnLUluZmluaXR5JyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE9iamVjdC5pcyhhcmcsIE5hTikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB1bnNlcmlhbGl6YWJsZVZhbHVlOiAnTmFOJyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SGFuZGxlID0gYXJnICYmIChhcmcgaW5zdGFuY2VvZiBDZHBKU0hhbmRsZSB8fCBhcmcgaW5zdGFuY2VvZiBDZHBFbGVtZW50SGFuZGxlKVxuICAgICAgICAgICAgICAgID8gYXJnXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgaWYgKG9iamVjdEhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGlmIChvYmplY3RIYW5kbGUucmVhbG0gIT09IHRoaXMuI3dvcmxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSlNIYW5kbGVzIGNhbiBiZSBldmFsdWF0ZWQgb25seSBpbiB0aGUgY29udGV4dCB0aGV5IHdlcmUgY3JlYXRlZCEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdEhhbmRsZS5kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pTSGFuZGxlIGlzIGRpc3Bvc2VkIScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0SGFuZGxlLnJlbW90ZU9iamVjdCgpLnVuc2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2VyaWFsaXphYmxlVmFsdWU6IG9iamVjdEhhbmRsZS5yZW1vdGVPYmplY3QoKS51bnNlcmlhbGl6YWJsZVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdEhhbmRsZS5yZW1vdGVPYmplY3QoKS5vYmplY3RJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogb2JqZWN0SGFuZGxlLnJlbW90ZU9iamVjdCgpLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IG9iamVjdElkOiBvYmplY3RIYW5kbGUucmVtb3RlT2JqZWN0KCkub2JqZWN0SWQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBhcmcgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2FibGVzLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5lbWl0KCdkaXNwb3NlZCcsIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuY29uc3QgcmV3cml0ZUVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ09iamVjdCByZWZlcmVuY2UgY2hhaW4gaXMgdG9vIGxvbmcnKSkge1xuICAgICAgICByZXR1cm4geyByZXN1bHQ6IHsgdHlwZTogJ3VuZGVmaW5lZCcgfSB9O1xuICAgIH1cbiAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIk9iamVjdCBjb3VsZG4ndCBiZSByZXR1cm5lZCBieSB2YWx1ZVwiKSkge1xuICAgICAgICByZXR1cm4geyByZXN1bHQ6IHsgdHlwZTogJ3VuZGVmaW5lZCcgfSB9O1xuICAgIH1cbiAgICBpZiAoZXJyb3IubWVzc2FnZS5lbmRzV2l0aCgnQ2Fubm90IGZpbmQgY29udGV4dCB3aXRoIHNwZWNpZmllZCBpZCcpIHx8XG4gICAgICAgIGVycm9yLm1lc3NhZ2UuZW5kc1dpdGgoJ0luc3BlY3RlZCB0YXJnZXQgbmF2aWdhdGVkIG9yIGNsb3NlZCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhlY3V0aW9uIGNvbnRleHQgd2FzIGRlc3Ryb3llZCwgbW9zdCBsaWtlbHkgYmVjYXVzZSBvZiBhIG5hdmlnYXRpb24uJyk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4ZWN1dGlvbkNvbnRleHQuanMubWFwIiwiY29uc3QgdGFiVGFyZ2V0SW5mbyA9IHtcbiAgICB0YXJnZXRJZDogJ3RhYlRhcmdldElkJyxcbiAgICB0eXBlOiAndGFiJyxcbiAgICB0aXRsZTogJ3RhYicsXG4gICAgdXJsOiAnYWJvdXQ6YmxhbmsnLFxuICAgIGF0dGFjaGVkOiBmYWxzZSxcbiAgICBjYW5BY2Nlc3NPcGVuZXI6IGZhbHNlLFxufTtcbmNvbnN0IHBhZ2VUYXJnZXRJbmZvID0ge1xuICAgIHRhcmdldElkOiAncGFnZVRhcmdldElkJyxcbiAgICB0eXBlOiAncGFnZScsXG4gICAgdGl0bGU6ICdwYWdlJyxcbiAgICB1cmw6ICdhYm91dDpibGFuaycsXG4gICAgYXR0YWNoZWQ6IGZhbHNlLFxuICAgIGNhbkFjY2Vzc09wZW5lcjogZmFsc2UsXG59O1xuLyoqXG4gKiBFeHBlcmltZW50YWwgRXh0ZW5zaW9uVHJhbnNwb3J0IGFsbG93cyBlc3RhYmxpc2hpbmcgYSBjb25uZWN0aW9uIHZpYVxuICogY2hyb21lLmRlYnVnZ2VyIEFQSSBpZiBQdXBwZXRlZXIgcnVucyBpbiBhbiBleHRlbnNpb24uIFNpbmNlIENocm9tZVxuICogRGV2VG9vbHMgUHJvdG9jb2wgaXMgcmVzdHJpY3RlZCBmb3IgZXh0ZW5zaW9ucywgdGhlIHRyYW5zcG9ydFxuICogaW1wbGVtZW50cyBtaXNzaW5nIGNvbW1hbmRzIGFuZCBldmVudHMuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uVHJhbnNwb3J0IHtcbiAgICBzdGF0aWMgYXN5bmMgY29ubmVjdFRhYih0YWJJZCkge1xuICAgICAgICBhd2FpdCBjaHJvbWUuZGVidWdnZXIuYXR0YWNoKHsgdGFiSWQgfSwgJzEuMycpO1xuICAgICAgICByZXR1cm4gbmV3IEV4dGVuc2lvblRyYW5zcG9ydCh0YWJJZCk7XG4gICAgfVxuICAgIG9ubWVzc2FnZTtcbiAgICBvbmNsb3NlO1xuICAgICN0YWJJZDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0YWJJZCkge1xuICAgICAgICB0aGlzLiN0YWJJZCA9IHRhYklkO1xuICAgICAgICBjaHJvbWUuZGVidWdnZXIub25FdmVudC5hZGRMaXN0ZW5lcih0aGlzLiNkZWJ1Z2dlckV2ZW50SGFuZGxlcik7XG4gICAgfVxuICAgICNkZWJ1Z2dlckV2ZW50SGFuZGxlciA9IChzb3VyY2UsIG1ldGhvZCwgcGFyYW1zKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UudGFiSWQgIT09IHRoaXMuI3RhYklkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHNlc3Npb25JZCBpcyBub3QgaW4gc3RhYmxlIHlldC5cbiAgICAgICAgICAgIHNlc3Npb25JZDogc291cmNlLnNlc3Npb25JZCA/PyAncGFnZVRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgICNkaXNwYXRjaFJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5vbm1lc3NhZ2U/LihKU09OLnN0cmluZ2lmeShtZXNzYWdlKSk7XG4gICAgfVxuICAgIHNlbmQobWVzc2FnZSkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgICAgICBzd2l0Y2ggKHBhcnNlZC5tZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Jyb3dzZXIuZ2V0VmVyc2lvbic6IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBhcnNlZC5pZCxcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXJzZWQuc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcnNlZC5tZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xWZXJzaW9uOiAnMS4zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Q6ICdjaHJvbWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb246ICd1bmtub3duJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJBZ2VudDogJ2Nocm9tZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBqc1ZlcnNpb246ICd1bmtub3duJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdUYXJnZXQuZ2V0QnJvd3NlckNvbnRleHRzJzoge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3BhdGNoUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgICAgICBpZDogcGFyc2VkLmlkLFxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHBhcnNlZC5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogcGFyc2VkLm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyQ29udGV4dElkczogW10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnVGFyZ2V0LnNldERpc2NvdmVyVGFyZ2V0cyc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEluZm86IHRhYlRhcmdldEluZm8sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1RhcmdldC50YXJnZXRDcmVhdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbmZvOiBwYWdlVGFyZ2V0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBhcnNlZC5pZCxcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXJzZWQuc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcnNlZC5tZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge30sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnVGFyZ2V0LnNldEF1dG9BdHRhY2gnOiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5zZXNzaW9uSWQgPT09ICd0YWJUYXJnZXRTZXNzaW9uSWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3BhdGNoUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnVGFyZ2V0LmF0dGFjaGVkVG9UYXJnZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5mbzogcGFnZVRhcmdldEluZm8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiAncGFnZVRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXBhcnNlZC5zZXNzaW9uSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdUYXJnZXQuYXR0YWNoZWRUb1RhcmdldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbmZvOiB0YWJUYXJnZXRJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDogJ3RhYlRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBwYXJzZWQuaWQsXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDogcGFyc2VkLnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBwYXJzZWQubWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHt9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLnNlc3Npb25JZCA9PT0gJ3BhZ2VUYXJnZXRTZXNzaW9uSWQnKSB7XG4gICAgICAgICAgICBkZWxldGUgcGFyc2VkLnNlc3Npb25JZDtcbiAgICAgICAgfVxuICAgICAgICBjaHJvbWUuZGVidWdnZXJcbiAgICAgICAgICAgIC5zZW5kQ29tbWFuZChcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzZXNzaW9uSWQgaXMgbm90IGluIHN0YWJsZSB5ZXQuXG4gICAgICAgIHsgdGFiSWQ6IHRoaXMuI3RhYklkLCBzZXNzaW9uSWQ6IHBhcnNlZC5zZXNzaW9uSWQgfSwgcGFyc2VkLm1ldGhvZCwgcGFyc2VkLnBhcmFtcylcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3BhdGNoUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgIGlkOiBwYXJzZWQuaWQsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXJzZWQuc2Vzc2lvbklkID8/ICdwYWdlVGFyZ2V0U2Vzc2lvbklkJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcnNlZC5tZXRob2QsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiByZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICBpZDogcGFyc2VkLmlkLFxuICAgICAgICAgICAgICAgIHNlc3Npb25JZDogcGFyc2VkLnNlc3Npb25JZCA/PyAncGFnZVRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBwYXJzZWQubWV0aG9kLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICBjaHJvbWUuZGVidWdnZXIub25FdmVudC5yZW1vdmVMaXN0ZW5lcih0aGlzLiNkZWJ1Z2dlckV2ZW50SGFuZGxlcik7XG4gICAgICAgIHZvaWQgY2hyb21lLmRlYnVnZ2VyLmRldGFjaCh7IHRhYklkOiB0aGlzLiN0YWJJZCB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeHRlbnNpb25UcmFuc3BvcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IENEUFNlc3Npb25FdmVudCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbi8qKlxuICogRmlyZWZveFRhcmdldE1hbmFnZXIgaW1wbGVtZW50cyB0YXJnZXQgbWFuYWdlbWVudCB1c2luZ1xuICogYFRhcmdldC5zZXREaXNjb3ZlclRhcmdldHNgIHdpdGhvdXQgdXNpbmcgYXV0by1hdHRhY2guIEl0LCB0aGVyZWZvcmUsIGNyZWF0ZXNcbiAqIHRhcmdldHMgdGhhdCBsYXppbHkgZXN0YWJsaXNoIHRoZWlyIENEUCBzZXNzaW9ucy5cbiAqXG4gKiBBbHRob3VnaCB0aGUgYXBwcm9hY2ggaXMgcG90ZW50aWFsbHkgZmxha3ksIHRoZXJlIGlzIG5vIG90aGVyIHdheSBmb3IgRmlyZWZveFxuICogYmVjYXVzZSBGaXJlZm94J3MgQ0RQIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgYXV0by1hdHRhY2guXG4gKlxuICogRmlyZWZveCBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldEluZm9DaGFuZ2VkIGFuZCBkZXRhY2hlZEZyb21UYXJnZXQgZXZlbnRzOlxuICpcbiAqIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMDg1NVxuICogLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM2OTc5XG4gKiAgIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRmlyZWZveFRhcmdldE1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNjb25uZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzOiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnLFxuICAgICAqICdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJy5cbiAgICAgKlxuICAgICAqIEEgdGFyZ2V0IGJlY29tZXMgZGlzY292ZXJlZCB3aGVuICdUYXJnZXQudGFyZ2V0Q3JlYXRlZCcgaXMgcmVjZWl2ZWQuXG4gICAgICogQSB0YXJnZXQgaXMgcmVtb3ZlZCBmcm9tIHRoaXMgbWFwIG9uY2UgJ1RhcmdldC50YXJnZXREZXN0cm95ZWQnIGlzXG4gICAgICogcmVjZWl2ZWQuXG4gICAgICpcbiAgICAgKiBgdGFyZ2V0RmlsdGVyQ2FsbGJhY2tgIGhhcyBubyBlZmZlY3Qgb24gdGhpcyBtYXAuXG4gICAgICovXG4gICAgI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZCA9IG5ldyBNYXAoKTtcbiAgICAvKipcbiAgICAgKiBLZWVwcyB0cmFjayBvZiB0YXJnZXRzIHRoYXQgd2VyZSBjcmVhdGVkIHZpYSAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnXG4gICAgICogYW5kIHdoaWNoIG9uZSBhcmUgbm90IGZpbHRlcmVkIG91dCBieSBgdGFyZ2V0RmlsdGVyQ2FsbGJhY2tgLlxuICAgICAqXG4gICAgICogVGhlIHRhcmdldCBpcyByZW1vdmVkIGZyb20gaGVyZSBvbmNlIGl0J3MgYmVlbiBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkID0gbmV3IE1hcCgpO1xuICAgIC8qKlxuICAgICAqIFRyYWNrcyB3aGljaCBzZXNzaW9ucyBhdHRhY2ggdG8gd2hpY2ggdGFyZ2V0LlxuICAgICAqL1xuICAgICNhdmFpbGFibGVUYXJnZXRzQnlTZXNzaW9uSWQgPSBuZXcgTWFwKCk7XG4gICAgI3RhcmdldEZpbHRlckNhbGxiYWNrO1xuICAgICN0YXJnZXRGYWN0b3J5O1xuICAgICNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uID0gbmV3IFdlYWtNYXAoKTtcbiAgICAjaW5pdGlhbGl6ZURlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgI3RhcmdldHNJZHNGb3JJbml0ID0gbmV3IFNldCgpO1xuICAgIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb24sIHRhcmdldEZhY3RvcnksIHRhcmdldEZpbHRlckNhbGxiYWNrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayA9IHRhcmdldEZpbHRlckNhbGxiYWNrO1xuICAgICAgICB0aGlzLiN0YXJnZXRGYWN0b3J5ID0gdGFyZ2V0RmFjdG9yeTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vbignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKCdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJywgdGhpcy4jb25UYXJnZXREZXN0cm95ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKENEUFNlc3Npb25FdmVudC5TZXNzaW9uRGV0YWNoZWQsIHRoaXMuI29uU2Vzc2lvbkRldGFjaGVkKTtcbiAgICAgICAgdGhpcy5zZXR1cEF0dGFjaG1lbnRMaXN0ZW5lcnModGhpcy4jY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHNldHVwQXR0YWNobWVudExpc3RlbmVycyhzZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KHNlc3Npb24sIGV2ZW50KTtcbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSk7XG4gICAgICAgIHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uc2V0KHNlc3Npb24sIGxpc3RlbmVyKTtcbiAgICAgICAgc2Vzc2lvbi5vbignVGFyZ2V0LmF0dGFjaGVkVG9UYXJnZXQnLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgICNvblNlc3Npb25EZXRhY2hlZCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlU2Vzc2lvbkxpc3RlbmVycyhzZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jYXZhaWxhYmxlVGFyZ2V0c0J5U2Vzc2lvbklkLmRlbGV0ZShzZXNzaW9uLmlkKCkpO1xuICAgIH07XG4gICAgcmVtb3ZlU2Vzc2lvbkxpc3RlbmVycyhzZXNzaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLiNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSkge1xuICAgICAgICAgICAgc2Vzc2lvbi5vZmYoJ1RhcmdldC5hdHRhY2hlZFRvVGFyZ2V0JywgdGhpcy4jYXR0YWNoZWRUb1RhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5nZXQoc2Vzc2lvbikpO1xuICAgICAgICAgICAgdGhpcy4jYXR0YWNoZWRUb1RhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5kZWxldGUoc2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0QXZhaWxhYmxlVGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkO1xuICAgIH1cbiAgICBnZXRDaGlsZFRhcmdldHMoX3RhcmdldCkge1xuICAgICAgICByZXR1cm4gbmV3IFNldCgpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldERlc3Ryb3llZCcsIHRoaXMuI29uVGFyZ2V0RGVzdHJveWVkKTtcbiAgICB9XG4gICAgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY29ubmVjdGlvbi5zZW5kKCdUYXJnZXQuc2V0RGlzY292ZXJUYXJnZXRzJywge1xuICAgICAgICAgICAgZGlzY292ZXI6IHRydWUsXG4gICAgICAgICAgICBmaWx0ZXI6IFt7fV0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdCA9IG5ldyBTZXQodGhpcy4jZGlzY292ZXJlZFRhcmdldHNCeVRhcmdldElkLmtleXMoKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2luaXRpYWxpemVEZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgI29uVGFyZ2V0Q3JlYXRlZCA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy4jZGlzY292ZXJlZFRhcmdldHNCeVRhcmdldElkLmhhcyhldmVudC50YXJnZXRJbmZvLnRhcmdldElkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5zZXQoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCwgZXZlbnQudGFyZ2V0SW5mbyk7XG4gICAgICAgIGlmIChldmVudC50YXJnZXRJbmZvLnR5cGUgPT09ICdicm93c2VyJyAmJiBldmVudC50YXJnZXRJbmZvLmF0dGFjaGVkKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiN0YXJnZXRGYWN0b3J5KGV2ZW50LnRhcmdldEluZm8sIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB0YXJnZXQuX2luaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLnNldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkLCB0YXJnZXQpO1xuICAgICAgICAgICAgdGhpcy4jZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KHRhcmdldC5fdGFyZ2V0SWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI3RhcmdldEZhY3RvcnkoZXZlbnQudGFyZ2V0SW5mbywgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHRoaXMuI3RhcmdldEZpbHRlckNhbGxiYWNrICYmICF0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0Ll9pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLnNldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkLCB0YXJnZXQpO1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0YXJnZXQpO1xuICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkodGFyZ2V0Ll90YXJnZXRJZCk7XG4gICAgfTtcbiAgICAjb25UYXJnZXREZXN0cm95ZWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy4jZGlzY292ZXJlZFRhcmdldHNCeVRhcmdldElkLmRlbGV0ZShldmVudC50YXJnZXRJZCk7XG4gICAgICAgIHRoaXMuI2ZpbmlzaEluaXRpYWxpemF0aW9uSWZSZWFkeShldmVudC50YXJnZXRJZCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLmdldChldmVudC50YXJnZXRJZCk7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldEdvbmVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0R29uZSAqLywgdGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLmRlbGV0ZShldmVudC50YXJnZXRJZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgICNvbkF0dGFjaGVkVG9UYXJnZXQgPSBhc3luYyAocGFyZW50U2Vzc2lvbiwgZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5mbyA9IGV2ZW50LnRhcmdldEluZm87XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLiNjb25uZWN0aW9uLnNlc3Npb24oZXZlbnQuc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlc3Npb24gJHtldmVudC5zZXNzaW9uSWR9IHdhcyBub3QgY3JlYXRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiNhdmFpbGFibGVUYXJnZXRzQnlUYXJnZXRJZC5nZXQodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgIGFzc2VydCh0YXJnZXQsIGBUYXJnZXQgJHt0YXJnZXRJbmZvLnRhcmdldElkfSBpcyBtaXNzaW5nYCk7XG4gICAgICAgIHNlc3Npb24uX3NldFRhcmdldCh0YXJnZXQpO1xuICAgICAgICB0aGlzLnNldHVwQXR0YWNobWVudExpc3RlbmVycyhzZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jYXZhaWxhYmxlVGFyZ2V0c0J5U2Vzc2lvbklkLnNldChzZXNzaW9uLmlkKCksIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLmdldCh0YXJnZXRJbmZvLnRhcmdldElkKSk7XG4gICAgICAgIHBhcmVudFNlc3Npb24uZW1pdChDRFBTZXNzaW9uRXZlbnQuUmVhZHksIHNlc3Npb24pO1xuICAgIH07XG4gICAgI2ZpbmlzaEluaXRpYWxpemF0aW9uSWZSZWFkeSh0YXJnZXRJZCkge1xuICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdC5kZWxldGUodGFyZ2V0SWQpO1xuICAgICAgICBpZiAodGhpcy4jdGFyZ2V0c0lkc0ZvckluaXQuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy4jaW5pdGlhbGl6ZURlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpcmVmb3hUYXJnZXRNYW5hZ2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG5pbXBvcnQgeyBGcmFtZSwgRnJhbWVFdmVudCwgdGhyb3dJZkRldGFjaGVkIH0gZnJvbSAnLi4vYXBpL0ZyYW1lLmpzJztcbmltcG9ydCB7IFVuc3VwcG9ydGVkT3BlcmF0aW9uIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5IH0gZnJvbSAnLi9BY2Nlc3NpYmlsaXR5LmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlckV2ZW50IH0gZnJvbSAnLi9GcmFtZU1hbmFnZXJFdmVudHMuanMnO1xuaW1wb3J0IHsgSXNvbGF0ZWRXb3JsZCB9IGZyb20gJy4vSXNvbGF0ZWRXb3JsZC5qcyc7XG5pbXBvcnQgeyBNQUlOX1dPUkxELCBQVVBQRVRFRVJfV09STEQgfSBmcm9tICcuL0lzb2xhdGVkV29ybGRzLmpzJztcbmltcG9ydCB7IExpZmVjeWNsZVdhdGNoZXIsIH0gZnJvbSAnLi9MaWZlY3ljbGVXYXRjaGVyLmpzJztcbmltcG9ydCB7IENEUF9CSU5ESU5HX1BSRUZJWCB9IGZyb20gJy4vdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xubGV0IENkcEZyYW1lID0gKCgpID0+IHtcbiAgICBsZXQgX2NsYXNzU3VwZXIgPSBGcmFtZTtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX2dvdG9fZGVjb3JhdG9ycztcbiAgICBsZXQgX3dhaXRGb3JOYXZpZ2F0aW9uX2RlY29yYXRvcnM7XG4gICAgbGV0IF9zZXRDb250ZW50X2RlY29yYXRvcnM7XG4gICAgbGV0IF9hZGRQcmVsb2FkU2NyaXB0X2RlY29yYXRvcnM7XG4gICAgbGV0IF9hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnM7XG4gICAgbGV0IF9yZW1vdmVFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnM7XG4gICAgbGV0IF93YWl0Rm9yRGV2aWNlUHJvbXB0X2RlY29yYXRvcnM7XG4gICAgcmV0dXJuIGNsYXNzIENkcEZyYW1lIGV4dGVuZHMgX2NsYXNzU3VwZXIge1xuICAgICAgICBzdGF0aWMge1xuICAgICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZ290b19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZ290b1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZ290b1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmdvdG8gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JOYXZpZ2F0aW9uX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJ3YWl0Rm9yTmF2aWdhdGlvblwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwid2FpdEZvck5hdmlnYXRpb25cIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yTmF2aWdhdGlvbiB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2V0Q29udGVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2V0Q29udGVudFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwic2V0Q29udGVudFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNldENvbnRlbnQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2FkZFByZWxvYWRTY3JpcHRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImFkZFByZWxvYWRTY3JpcHRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImFkZFByZWxvYWRTY3JpcHRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5hZGRQcmVsb2FkU2NyaXB0IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJhZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJhZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYWRkRXhwb3NlZEZ1bmN0aW9uQmluZGluZyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfcmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwicmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZ1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwicmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZ1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnJlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmcgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JEZXZpY2VQcm9tcHRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIndhaXRGb3JEZXZpY2VQcm9tcHRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIndhaXRGb3JEZXZpY2VQcm9tcHRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yRGV2aWNlUHJvbXB0IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgICN1cmwgPSAoX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpLCAnJyk7XG4gICAgICAgICNkZXRhY2hlZCA9IGZhbHNlO1xuICAgICAgICAjY2xpZW50O1xuICAgICAgICBfZnJhbWVNYW5hZ2VyO1xuICAgICAgICBfbG9hZGVySWQgPSAnJztcbiAgICAgICAgX2xpZmVjeWNsZUV2ZW50cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgX2lkO1xuICAgICAgICBfcGFyZW50SWQ7XG4gICAgICAgIGFjY2Vzc2liaWxpdHk7XG4gICAgICAgIHdvcmxkcztcbiAgICAgICAgY29uc3RydWN0b3IoZnJhbWVNYW5hZ2VyLCBmcmFtZUlkLCBwYXJlbnRGcmFtZUlkLCBjbGllbnQpIHtcbiAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZU1hbmFnZXIgPSBmcmFtZU1hbmFnZXI7XG4gICAgICAgICAgICB0aGlzLiN1cmwgPSAnJztcbiAgICAgICAgICAgIHRoaXMuX2lkID0gZnJhbWVJZDtcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudElkID0gcGFyZW50RnJhbWVJZDtcbiAgICAgICAgICAgIHRoaXMuI2RldGFjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZXJJZCA9ICcnO1xuICAgICAgICAgICAgdGhpcy53b3JsZHMgPSB7XG4gICAgICAgICAgICAgICAgW01BSU5fV09STERdOiBuZXcgSXNvbGF0ZWRXb3JsZCh0aGlzLCB0aGlzLl9mcmFtZU1hbmFnZXIudGltZW91dFNldHRpbmdzKSxcbiAgICAgICAgICAgICAgICBbUFVQUEVURUVSX1dPUkxEXTogbmV3IElzb2xhdGVkV29ybGQodGhpcywgdGhpcy5fZnJhbWVNYW5hZ2VyLnRpbWVvdXRTZXR0aW5ncyksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5hY2Nlc3NpYmlsaXR5ID0gbmV3IEFjY2Vzc2liaWxpdHkodGhpcy53b3JsZHNbTUFJTl9XT1JMRF0pO1xuICAgICAgICAgICAgdGhpcy5vbihGcmFtZUV2ZW50LkZyYW1lU3dhcHBlZEJ5QWN0aXZhdGlvbiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEVtdWxhdGUgbG9hZGluZyBwcm9jZXNzIGZvciBzd2FwcGVkIGZyYW1lcy5cbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRpbmdTdGFydGVkKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Mb2FkaW5nU3RvcHBlZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLndvcmxkc1tNQUlOX1dPUkxEXS5lbWl0dGVyLm9uKCdjb25zb2xlYXBpY2FsbGVkJywgdGhpcy4jb25NYWluV29ybGRDb25zb2xlQXBpQ2FsbGVkLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy53b3JsZHNbTUFJTl9XT1JMRF0uZW1pdHRlci5vbignYmluZGluZ2NhbGxlZCcsIHRoaXMuI29uTWFpbldvcmxkQmluZGluZ0NhbGxlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICAjb25NYWluV29ybGRDb25zb2xlQXBpQ2FsbGVkKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZU1hbmFnZXIuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5Db25zb2xlQXBpQ2FsbGVkLCBbXG4gICAgICAgICAgICAgICAgdGhpcy53b3JsZHNbTUFJTl9XT1JMRF0sXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICAjb25NYWluV29ybGRCaW5kaW5nQ2FsbGVkKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZU1hbmFnZXIuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5CaW5kaW5nQ2FsbGVkLCBbXG4gICAgICAgICAgICAgICAgdGhpcy53b3JsZHNbTUFJTl9XT1JMRF0sXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkgaW4gRGV2VG9vbHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX2NsaWVudCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZXMgdGhlIGZyYW1lIElEIHdpdGggdGhlIG5ldyBJRC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIG1haW4gZnJhbWUgaXNcbiAgICAgICAgICogcmVwbGFjZWQgYnkgYSBkaWZmZXJlbnQgZnJhbWUuXG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGVJZChpZCkge1xuICAgICAgICAgICAgdGhpcy5faWQgPSBpZDtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcGFnZSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcmFtZU1hbmFnZXIucGFnZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlzT09QRnJhbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50ICE9PSB0aGlzLl9mcmFtZU1hbmFnZXIuY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGdvdG8odXJsLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmVmZXJlciA9IHRoaXMuX2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5leHRyYUhUVFBIZWFkZXJzKClbJ3JlZmVyZXInXSwgcmVmZXJyZXJQb2xpY3kgPSB0aGlzLl9mcmFtZU1hbmFnZXIubmV0d29ya01hbmFnZXIuZXh0cmFIVFRQSGVhZGVycygpWydyZWZlcmVyLXBvbGljeSddLCB3YWl0VW50aWwgPSBbJ2xvYWQnXSwgdGltZW91dCA9IHRoaXMuX2ZyYW1lTWFuYWdlci50aW1lb3V0U2V0dGluZ3MubmF2aWdhdGlvblRpbWVvdXQoKSwgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBsZXQgZW5zdXJlTmV3RG9jdW1lbnROYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCB3YXRjaGVyID0gbmV3IExpZmVjeWNsZVdhdGNoZXIodGhpcy5fZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLCB0aGlzLCB3YWl0VW50aWwsIHRpbWVvdXQpO1xuICAgICAgICAgICAgbGV0IGVycm9yID0gYXdhaXQgRGVmZXJyZWQucmFjZShbXG4gICAgICAgICAgICAgICAgbmF2aWdhdGUodGhpcy4jY2xpZW50LCB1cmwsIHJlZmVyZXIsIHJlZmVycmVyUG9saWN5LCB0aGlzLl9pZCksXG4gICAgICAgICAgICAgICAgd2F0Y2hlci50ZXJtaW5hdGlvblByb21pc2UoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9yID0gYXdhaXQgRGVmZXJyZWQucmFjZShbXG4gICAgICAgICAgICAgICAgICAgIHdhdGNoZXIudGVybWluYXRpb25Qcm9taXNlKCksXG4gICAgICAgICAgICAgICAgICAgIGVuc3VyZU5ld0RvY3VtZW50TmF2aWdhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgPyB3YXRjaGVyLm5ld0RvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB3YXRjaGVyLnNhbWVEb2N1bWVudE5hdmlnYXRpb25Qcm9taXNlKCksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHdhdGNoZXIubmF2aWdhdGlvblJlc3BvbnNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB3YXRjaGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRlKGNsaWVudCwgdXJsLCByZWZlcnJlciwgcmVmZXJyZXJQb2xpY3ksIGZyYW1lSWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKCdQYWdlLm5hdmlnYXRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3ksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbnN1cmVOZXdEb2N1bWVudE5hdmlnYXRpb24gPSAhIXJlc3BvbnNlLmxvYWRlcklkO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3JUZXh0ID09PSAnbmV0OjpFUlJfSFRUUF9SRVNQT05TRV9DT0RFX0ZBSUxVUkUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZXJyb3JUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBFcnJvcihgJHtyZXNwb25zZS5lcnJvclRleHR9IGF0ICR7dXJsfWApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHdhaXRGb3JOYXZpZ2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgY29uc3QgeyB3YWl0VW50aWwgPSBbJ2xvYWQnXSwgdGltZW91dCA9IHRoaXMuX2ZyYW1lTWFuYWdlci50aW1lb3V0U2V0dGluZ3MubmF2aWdhdGlvblRpbWVvdXQoKSwgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCB3YXRjaGVyID0gbmV3IExpZmVjeWNsZVdhdGNoZXIodGhpcy5fZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLCB0aGlzLCB3YWl0VW50aWwsIHRpbWVvdXQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCBEZWZlcnJlZC5yYWNlKFtcbiAgICAgICAgICAgICAgICB3YXRjaGVyLnRlcm1pbmF0aW9uUHJvbWlzZSgpLFxuICAgICAgICAgICAgICAgIC4uLihvcHRpb25zLmlnbm9yZVNhbWVEb2N1bWVudE5hdmlnYXRpb25cbiAgICAgICAgICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgICAgICAgICA6IFt3YXRjaGVyLnNhbWVEb2N1bWVudE5hdmlnYXRpb25Qcm9taXNlKCldKSxcbiAgICAgICAgICAgICAgICB3YXRjaGVyLm5ld0RvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IERlZmVycmVkLnJhY2UoW3dhdGNoZXIudGVybWluYXRpb25Qcm9taXNlKCksIHdhdGNoZXIubmF2aWdhdGlvblJlc3BvbnNlKCldKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgfHwgbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHdhdGNoZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCBjbGllbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIG1haW5SZWFsbSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndvcmxkc1tNQUlOX1dPUkxEXTtcbiAgICAgICAgfVxuICAgICAgICBpc29sYXRlZFJlYWxtKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud29ybGRzW1BVUFBFVEVFUl9XT1JMRF07XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgc2V0Q29udGVudChodG1sLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgd2FpdFVudGlsID0gWydsb2FkJ10sIHRpbWVvdXQgPSB0aGlzLl9mcmFtZU1hbmFnZXIudGltZW91dFNldHRpbmdzLm5hdmlnYXRpb25UaW1lb3V0KCksIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgLy8gV2UgcmVseSB1cG9uIHRoZSBmYWN0IHRoYXQgZG9jdW1lbnQub3BlbigpIHdpbGwgcmVzZXQgZnJhbWUgbGlmZWN5Y2xlIHdpdGggXCJpbml0XCJcbiAgICAgICAgICAgIC8vIGxpZmVjeWNsZSBldmVudC4gQHNlZSBodHRwczovL2NycmV2LmNvbS82MDg2NThcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0RnJhbWVDb250ZW50KGh0bWwpO1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hlciA9IG5ldyBMaWZlY3ljbGVXYXRjaGVyKHRoaXMuX2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlciwgdGhpcywgd2FpdFVudGlsLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgRGVmZXJyZWQucmFjZShbXG4gICAgICAgICAgICAgICAgd2F0Y2hlci50ZXJtaW5hdGlvblByb21pc2UoKSxcbiAgICAgICAgICAgICAgICB3YXRjaGVyLmxpZmVjeWNsZVByb21pc2UoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgd2F0Y2hlci5kaXNwb3NlKCk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cmwoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jdXJsO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudEZyYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lTWFuYWdlci5fZnJhbWVUcmVlLnBhcmVudEZyYW1lKHRoaXMuX2lkKSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkRnJhbWVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lTWFuYWdlci5fZnJhbWVUcmVlLmNoaWxkRnJhbWVzKHRoaXMuX2lkKTtcbiAgICAgICAgfVxuICAgICAgICAjZGV2aWNlUmVxdWVzdFByb21wdE1hbmFnZXIoKSB7XG4gICAgICAgICAgICBjb25zdCByb290RnJhbWUgPSB0aGlzLnBhZ2UoKS5tYWluRnJhbWUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT09QRnJhbWUoKSB8fCByb290RnJhbWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWVNYW5hZ2VyLl9kZXZpY2VSZXF1ZXN0UHJvbXB0TWFuYWdlcih0aGlzLiNjbGllbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvb3RGcmFtZS5fZnJhbWVNYW5hZ2VyLl9kZXZpY2VSZXF1ZXN0UHJvbXB0TWFuYWdlcih0aGlzLiNjbGllbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGFkZFByZWxvYWRTY3JpcHQocHJlbG9hZFNjcmlwdCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzT09QRnJhbWUoKSAmJiB0aGlzICE9PSB0aGlzLl9mcmFtZU1hbmFnZXIubWFpbkZyYW1lKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJlbG9hZFNjcmlwdC5nZXRJZEZvckZyYW1lKHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnUGFnZS5hZGRTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCcsIHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHByZWxvYWRTY3JpcHQuc291cmNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcmVsb2FkU2NyaXB0LnNldElkRm9yRnJhbWUodGhpcywgaWRlbnRpZmllcik7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgYWRkRXhwb3NlZEZ1bmN0aW9uQmluZGluZyhiaW5kaW5nKSB7XG4gICAgICAgICAgICAvLyBJZiBhIGZyYW1lIGhhcyBub3Qgc3RhcnRlZCBsb2FkaW5nLCBpdCBtaWdodCBuZXZlciBzdGFydC4gUmVseSBvblxuICAgICAgICAgICAgLy8gYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQgaW4gdGhhdCBjYXNlLlxuICAgICAgICAgICAgaWYgKHRoaXMgIT09IHRoaXMuX2ZyYW1lTWFuYWdlci5tYWluRnJhbWUoKSAmJiAhdGhpcy5faGFzU3RhcnRlZExvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1J1bnRpbWUuYWRkQmluZGluZycsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogQ0RQX0JJTkRJTkdfUFJFRklYICsgYmluZGluZy5uYW1lLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGUoYmluZGluZy5pbml0U291cmNlKS5jYXRjaChkZWJ1Z0Vycm9yKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHJlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZykge1xuICAgICAgICAgICAgLy8gSWYgYSBmcmFtZSBoYXMgbm90IHN0YXJ0ZWQgbG9hZGluZywgaXQgbWlnaHQgbmV2ZXIgc3RhcnQuIFJlbHkgb25cbiAgICAgICAgICAgIC8vIGFkZFNjcmlwdFRvRXZhbHVhdGVPbk5ld0RvY3VtZW50IGluIHRoYXQgY2FzZS5cbiAgICAgICAgICAgIGlmICh0aGlzICE9PSB0aGlzLl9mcmFtZU1hbmFnZXIubWFpbkZyYW1lKCkgJiYgIXRoaXMuX2hhc1N0YXJ0ZWRMb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdSdW50aW1lLnJlbW92ZUJpbmRpbmcnLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IENEUF9CSU5ESU5HX1BSRUZJWCArIGJpbmRpbmcubmFtZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0aGlzLmV2YWx1YXRlKG5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmVzIHRoZSBkYW5nbGluZyBQdXBwZXRlZXIgYmluZGluZyB3cmFwcGVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBJbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH0sIGJpbmRpbmcubmFtZSkuY2F0Y2goZGVidWdFcnJvciksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyB3YWl0Rm9yRGV2aWNlUHJvbXB0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyKCkud2FpdEZvckRldmljZVByb21wdChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBfbmF2aWdhdGVkKGZyYW1lUGF5bG9hZCkge1xuICAgICAgICAgICAgdGhpcy5fbmFtZSA9IGZyYW1lUGF5bG9hZC5uYW1lO1xuICAgICAgICAgICAgdGhpcy4jdXJsID0gYCR7ZnJhbWVQYXlsb2FkLnVybH0ke2ZyYW1lUGF5bG9hZC51cmxGcmFnbWVudCB8fCAnJ31gO1xuICAgICAgICB9XG4gICAgICAgIF9uYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCh1cmwpIHtcbiAgICAgICAgICAgIHRoaXMuI3VybCA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBfb25MaWZlY3ljbGVFdmVudChsb2FkZXJJZCwgbmFtZSkge1xuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdpbml0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRlcklkID0gbG9hZGVySWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGlmZWN5Y2xlRXZlbnRzLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9saWZlY3ljbGVFdmVudHMuYWRkKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIF9vbkxvYWRpbmdTdG9wcGVkKCkge1xuICAgICAgICAgICAgdGhpcy5fbGlmZWN5Y2xlRXZlbnRzLmFkZCgnRE9NQ29udGVudExvYWRlZCcpO1xuICAgICAgICAgICAgdGhpcy5fbGlmZWN5Y2xlRXZlbnRzLmFkZCgnbG9hZCcpO1xuICAgICAgICB9XG4gICAgICAgIF9vbkxvYWRpbmdTdGFydGVkKCkge1xuICAgICAgICAgICAgdGhpcy5faGFzU3RhcnRlZExvYWRpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBkZXRhY2hlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkZXRhY2hlZDtcbiAgICAgICAgfVxuICAgICAgICBbKF9nb3RvX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXSwgX3dhaXRGb3JOYXZpZ2F0aW9uX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXSwgX3NldENvbnRlbnRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdLCBfYWRkUHJlbG9hZFNjcmlwdF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF0sIF9hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXSwgX3JlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmdfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdLCBfd2FpdEZvckRldmljZVByb21wdF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF0sIGRpc3Bvc2VTeW1ib2wpXSgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNkZXRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2RldGFjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMud29ybGRzW01BSU5fV09STERdW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgICAgICB0aGlzLndvcmxkc1tQVVBQRVRFRVJfV09STERdW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3NlRnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuZXhwb3J0IHsgQ2RwRnJhbWUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyYW1lLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBGcmFtZUV2ZW50IH0gZnJvbSAnLi4vYXBpL0ZyYW1lLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgUHVwcGV0ZWVyVVJMLCBVVElMSVRZX1dPUkxEX05BTUUgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4uL3V0aWwvRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG5pbXBvcnQgeyBpc0Vycm9yTGlrZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IENkcFByZWxvYWRTY3JpcHQgfSBmcm9tICcuL0NkcFByZWxvYWRTY3JpcHQuanMnO1xuaW1wb3J0IHsgQ2RwQ0RQU2Vzc2lvbiB9IGZyb20gJy4vQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBpc1RhcmdldENsb3NlZEVycm9yIH0gZnJvbSAnLi9Db25uZWN0aW9uLmpzJztcbmltcG9ydCB7IERldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyIH0gZnJvbSAnLi9EZXZpY2VSZXF1ZXN0UHJvbXB0LmpzJztcbmltcG9ydCB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4ZWN1dGlvbkNvbnRleHQuanMnO1xuaW1wb3J0IHsgQ2RwRnJhbWUgfSBmcm9tICcuL0ZyYW1lLmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlckV2ZW50IH0gZnJvbSAnLi9GcmFtZU1hbmFnZXJFdmVudHMuanMnO1xuaW1wb3J0IHsgRnJhbWVUcmVlIH0gZnJvbSAnLi9GcmFtZVRyZWUuanMnO1xuaW1wb3J0IHsgTUFJTl9XT1JMRCwgUFVQUEVURUVSX1dPUkxEIH0gZnJvbSAnLi9Jc29sYXRlZFdvcmxkcy5qcyc7XG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlciB9IGZyb20gJy4vTmV0d29ya01hbmFnZXIuanMnO1xuY29uc3QgVElNRV9GT1JfV0FJVElOR19GT1JfU1dBUCA9IDEwMDsgLy8gbXMuXG4vKipcbiAqIEEgZnJhbWUgbWFuYWdlciBtYW5hZ2VzIHRoZSBmcmFtZXMgZm9yIGEgZ2l2ZW4ge0BsaW5rIFBhZ2UgfCBwYWdlfS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZyYW1lTWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgI3BhZ2U7XG4gICAgI25ldHdvcmtNYW5hZ2VyO1xuICAgICN0aW1lb3V0U2V0dGluZ3M7XG4gICAgI2lzb2xhdGVkV29ybGRzID0gbmV3IFNldCgpO1xuICAgICNjbGllbnQ7XG4gICAgI3NjcmlwdHNUb0V2YWx1YXRlT25OZXdEb2N1bWVudCA9IG5ldyBNYXAoKTtcbiAgICAjYmluZGluZ3MgPSBuZXcgU2V0KCk7XG4gICAgX2ZyYW1lVHJlZSA9IG5ldyBGcmFtZVRyZWUoKTtcbiAgICAvKipcbiAgICAgKiBTZXQgb2YgZnJhbWUgSURzIHN0b3JlZCB0byBpbmRpY2F0ZSBpZiBhIGZyYW1lIGhhcyByZWNlaXZlZCBhXG4gICAgICogZnJhbWVOYXZpZ2F0ZWQgZXZlbnQgc28gdGhhdCBmcmFtZSB0cmVlIHJlc3BvbnNlcyBjb3VsZCBiZSBpZ25vcmVkIGFzIHRoZVxuICAgICAqIGZyYW1lTmF2aWdhdGVkIGV2ZW50IHVzdWFsbHkgY29udGFpbnMgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICAjZnJhbWVOYXZpZ2F0ZWRSZWNlaXZlZCA9IG5ldyBTZXQoKTtcbiAgICAjZGV2aWNlUmVxdWVzdFByb21wdE1hbmFnZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICNmcmFtZVRyZWVIYW5kbGVkO1xuICAgIGdldCB0aW1lb3V0U2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0aW1lb3V0U2V0dGluZ3M7XG4gICAgfVxuICAgIGdldCBuZXR3b3JrTWFuYWdlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25ldHdvcmtNYW5hZ2VyO1xuICAgIH1cbiAgICBnZXQgY2xpZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50O1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIHBhZ2UsIHRpbWVvdXRTZXR0aW5ncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3BhZ2UgPSBwYWdlO1xuICAgICAgICB0aGlzLiNuZXR3b3JrTWFuYWdlciA9IG5ldyBOZXR3b3JrTWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy4jdGltZW91dFNldHRpbmdzID0gdGltZW91dFNldHRpbmdzO1xuICAgICAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnModGhpcy4jY2xpZW50KTtcbiAgICAgICAgY2xpZW50Lm9uY2UoQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jb25DbGllbnREaXNjb25uZWN0KCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhbWUncyBjbGllbnQgaXMgZGlzY29ubmVjdGVkLiBXZSBkb24ndCBrbm93IGlmIHRoZVxuICAgICAqIGRpc2Nvbm5lY3QgbWVhbnMgdGhhdCB0aGUgZnJhbWUgaXMgcmVtb3ZlZCBvciBpZiBpdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IGFcbiAgICAgKiBuZXcgZnJhbWUuIFRoZXJlZm9yZSwgd2Ugd2FpdCBmb3IgYSBzd2FwIGV2ZW50LlxuICAgICAqL1xuICAgIGFzeW5jICNvbkNsaWVudERpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGNvbnN0IG1haW5GcmFtZSA9IHRoaXMuX2ZyYW1lVHJlZS5nZXRNYWluRnJhbWUoKTtcbiAgICAgICAgaWYgKCFtYWluRnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG1haW5GcmFtZS5jaGlsZEZyYW1lcygpKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3dhcHBlZCA9IERlZmVycmVkLmNyZWF0ZSh7XG4gICAgICAgICAgICB0aW1lb3V0OiBUSU1FX0ZPUl9XQUlUSU5HX0ZPUl9TV0FQLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZyYW1lIHdhcyBub3Qgc3dhcHBlZCcsXG4gICAgICAgIH0pO1xuICAgICAgICBtYWluRnJhbWUub25jZShGcmFtZUV2ZW50LkZyYW1lU3dhcHBlZEJ5QWN0aXZhdGlvbiwgKCkgPT4ge1xuICAgICAgICAgICAgc3dhcHBlZC5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgc3dhcHBlZC52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShtYWluRnJhbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIG1haW4gZnJhbWUgaXMgcmVwbGFjZWQgYnkgYW5vdGhlciBtYWluIGZyYW1lLFxuICAgICAqIHdlIG1haW50YWluIHRoZSBtYWluIGZyYW1lIG9iamVjdCBpZGVudGl0eSB3aGlsZSB1cGRhdGluZ1xuICAgICAqIGl0cyBmcmFtZSB0cmVlIGFuZCBJRC5cbiAgICAgKi9cbiAgICBhc3luYyBzd2FwRnJhbWVUcmVlKGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIGFzc2VydCh0aGlzLiNjbGllbnQgaW5zdGFuY2VvZiBDZHBDRFBTZXNzaW9uLCAnQ0RQU2Vzc2lvbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgQ0RQU2Vzc2lvbkltcGwuJyk7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5fZnJhbWVUcmVlLmdldE1haW5GcmFtZSgpO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuI2ZyYW1lTmF2aWdhdGVkUmVjZWl2ZWQuYWRkKHRoaXMuI2NsaWVudC5fdGFyZ2V0KCkuX3RhcmdldElkKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lVHJlZS5yZW1vdmVGcmFtZShmcmFtZSk7XG4gICAgICAgICAgICBmcmFtZS51cGRhdGVJZCh0aGlzLiNjbGllbnQuX3RhcmdldCgpLl90YXJnZXRJZCk7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZVRyZWUuYWRkRnJhbWUoZnJhbWUpO1xuICAgICAgICAgICAgZnJhbWUudXBkYXRlQ2xpZW50KGNsaWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKGNsaWVudCk7XG4gICAgICAgIGNsaWVudC5vbmNlKENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI29uQ2xpZW50RGlzY29ubmVjdCgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplKGNsaWVudCwgZnJhbWUpO1xuICAgICAgICBhd2FpdCB0aGlzLiNuZXR3b3JrTWFuYWdlci5hZGRDbGllbnQoY2xpZW50KTtcbiAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkQnlBY3RpdmF0aW9uLCB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlZ2lzdGVyU3BlY3VsYXRpdmVTZXNzaW9uKGNsaWVudCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNuZXR3b3JrTWFuYWdlci5hZGRDbGllbnQoY2xpZW50KTtcbiAgICB9XG4gICAgc2V0dXBFdmVudExpc3RlbmVycyhzZXNzaW9uKSB7XG4gICAgICAgIHNlc3Npb24ub24oJ1BhZ2UuZnJhbWVBdHRhY2hlZCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jZnJhbWVUcmVlSGFuZGxlZD8udmFsdWVPclRocm93KCk7XG4gICAgICAgICAgICB0aGlzLiNvbkZyYW1lQXR0YWNoZWQoc2Vzc2lvbiwgZXZlbnQuZnJhbWVJZCwgZXZlbnQucGFyZW50RnJhbWVJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdQYWdlLmZyYW1lTmF2aWdhdGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU5hdmlnYXRlZFJlY2VpdmVkLmFkZChldmVudC5mcmFtZS5pZCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25GcmFtZU5hdmlnYXRlZChldmVudC5mcmFtZSwgZXZlbnQudHlwZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdQYWdlLm5hdmlnYXRlZFdpdGhpbkRvY3VtZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudChldmVudC5mcmFtZUlkLCBldmVudC51cmwpO1xuICAgICAgICB9KTtcbiAgICAgICAgc2Vzc2lvbi5vbignUGFnZS5mcmFtZURldGFjaGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRnJhbWVEZXRhY2hlZChldmVudC5mcmFtZUlkLCBldmVudC5yZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgICAgc2Vzc2lvbi5vbignUGFnZS5mcmFtZVN0YXJ0ZWRMb2FkaW5nJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRnJhbWVTdGFydGVkTG9hZGluZyhldmVudC5mcmFtZUlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNlc3Npb24ub24oJ1BhZ2UuZnJhbWVTdG9wcGVkTG9hZGluZycsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jZnJhbWVUcmVlSGFuZGxlZD8udmFsdWVPclRocm93KCk7XG4gICAgICAgICAgICB0aGlzLiNvbkZyYW1lU3RvcHBlZExvYWRpbmcoZXZlbnQuZnJhbWVJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRXhlY3V0aW9uQ29udGV4dENyZWF0ZWQoZXZlbnQuY29udGV4dCwgc2Vzc2lvbik7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdQYWdlLmxpZmVjeWNsZUV2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uTGlmZWN5Y2xlRXZlbnQoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgaW5pdGlhbGl6ZShjbGllbnQsIGZyYW1lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy5yZXNvbHZlKCk7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNjaGVkdWxlIGFsbCB0aGVzZSBjb21tYW5kcyB3aGlsZSB0aGUgdGFyZ2V0IGlzIHBhdXNlZCxcbiAgICAgICAgICAgIC8vIHRoZXJlZm9yZSwgaXQgbmVlZHMgdG8gaGFwcGVuIHN5bmNocm9uaW91c2x5LiBBdCB0aGUgc2FtZSB0aW1lIHdlXG4gICAgICAgICAgICAvLyBzaG91bGQgbm90IHN0YXJ0IHByb2Nlc3NpbmcgZXhlY3V0aW9uIGNvbnRleHQgYW5kIGZyYW1lIGV2ZW50cyBiZWZvcmVcbiAgICAgICAgICAgIC8vIHdlIHJlY2VpdmVkIHRoZSBpbml0aWFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmcmFtZSB0cmVlLlxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI25ldHdvcmtNYW5hZ2VyLmFkZENsaWVudChjbGllbnQpLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdQYWdlLmVuYWJsZScpLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdQYWdlLmdldEZyYW1lVHJlZScpLnRoZW4oKHsgZnJhbWVUcmVlIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jaGFuZGxlRnJhbWVUcmVlKGNsaWVudCwgZnJhbWVUcmVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZnJhbWVUcmVlSGFuZGxlZD8ucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdQYWdlLnNldExpZmVjeWNsZUV2ZW50c0VuYWJsZWQnLCB7IGVuYWJsZWQ6IHRydWUgfSksXG4gICAgICAgICAgICAgICAgY2xpZW50LnNlbmQoJ1J1bnRpbWUuZW5hYmxlJykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNjcmVhdGVJc29sYXRlZFdvcmxkKGNsaWVudCwgVVRJTElUWV9XT1JMRF9OQU1FKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAuLi4oZnJhbWVcbiAgICAgICAgICAgICAgICAgICAgPyBBcnJheS5mcm9tKHRoaXMuI3NjcmlwdHNUb0V2YWx1YXRlT25OZXdEb2N1bWVudC52YWx1ZXMoKSlcbiAgICAgICAgICAgICAgICAgICAgOiBbXSkubWFwKHNjcmlwdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZT8uYWRkUHJlbG9hZFNjcmlwdChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC4uLihmcmFtZSA/IEFycmF5LmZyb20odGhpcy4jYmluZGluZ3MudmFsdWVzKCkpIDogW10pLm1hcChiaW5kaW5nID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lPy5hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nKGJpbmRpbmcpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy5yZXNvbHZlKCk7XG4gICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG1pZ2h0IGhhdmUgYmVlbiBjbG9zZWQgYmVmb3JlIHRoZSBpbml0aWFsaXphdGlvbiBmaW5pc2hlZC5cbiAgICAgICAgICAgIGlmIChpc0Vycm9yTGlrZShlcnJvcikgJiYgaXNUYXJnZXRDbG9zZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGFnZTtcbiAgICB9XG4gICAgbWFpbkZyYW1lKCkge1xuICAgICAgICBjb25zdCBtYWluRnJhbWUgPSB0aGlzLl9mcmFtZVRyZWUuZ2V0TWFpbkZyYW1lKCk7XG4gICAgICAgIGFzc2VydChtYWluRnJhbWUsICdSZXF1ZXN0aW5nIG1haW4gZnJhbWUgdG9vIGVhcmx5IScpO1xuICAgICAgICByZXR1cm4gbWFpbkZyYW1lO1xuICAgIH1cbiAgICBmcmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2ZyYW1lVHJlZS5mcmFtZXMoKSk7XG4gICAgfVxuICAgIGZyYW1lKGZyYW1lSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lVHJlZS5nZXRCeUlkKGZyYW1lSWQpIHx8IG51bGw7XG4gICAgfVxuICAgIGFzeW5jIGFkZEV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZykge1xuICAgICAgICB0aGlzLiNiaW5kaW5ncy5hZGQoYmluZGluZyk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuZnJhbWVzKCkubWFwKGFzeW5jIChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZyYW1lLmFkZEV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgYXN5bmMgcmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZyhiaW5kaW5nKSB7XG4gICAgICAgIHRoaXMuI2JpbmRpbmdzLmRlbGV0ZShiaW5kaW5nKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mcmFtZXMoKS5tYXAoYXN5bmMgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZnJhbWUucmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZyhiaW5kaW5nKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBhc3luYyBldmFsdWF0ZU9uTmV3RG9jdW1lbnQoc291cmNlKSB7XG4gICAgICAgIGNvbnN0IHsgaWRlbnRpZmllciB9ID0gYXdhaXQgdGhpcy5tYWluRnJhbWUoKVxuICAgICAgICAgICAgLl9jbGllbnQoKVxuICAgICAgICAgICAgLnNlbmQoJ1BhZ2UuYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQnLCB7XG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwcmVsb2FkU2NyaXB0ID0gbmV3IENkcFByZWxvYWRTY3JpcHQodGhpcy5tYWluRnJhbWUoKSwgaWRlbnRpZmllciwgc291cmNlKTtcbiAgICAgICAgdGhpcy4jc2NyaXB0c1RvRXZhbHVhdGVPbk5ld0RvY3VtZW50LnNldChpZGVudGlmaWVyLCBwcmVsb2FkU2NyaXB0KTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mcmFtZXMoKS5tYXAoYXN5bmMgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZnJhbWUuYWRkUHJlbG9hZFNjcmlwdChwcmVsb2FkU2NyaXB0KTtcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4geyBpZGVudGlmaWVyIH07XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZVNjcmlwdFRvRXZhbHVhdGVPbk5ld0RvY3VtZW50KGlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgcHJlbG9hZFNjcmlwdCA9IHRoaXMuI3NjcmlwdHNUb0V2YWx1YXRlT25OZXdEb2N1bWVudC5nZXQoaWRlbnRpZmllcik7XG4gICAgICAgIGlmICghcHJlbG9hZFNjcmlwdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgdG8gZXZhbHVhdGUgb24gbmV3IGRvY3VtZW50IHdpdGggaWQgJHtpZGVudGlmaWVyfSBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNzY3JpcHRzVG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQuZGVsZXRlKGlkZW50aWZpZXIpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmZyYW1lcygpLm1hcChmcmFtZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gcHJlbG9hZFNjcmlwdC5nZXRJZEZvckZyYW1lKGZyYW1lKTtcbiAgICAgICAgICAgIGlmICghaWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmcmFtZVxuICAgICAgICAgICAgICAgIC5fY2xpZW50KClcbiAgICAgICAgICAgICAgICAuc2VuZCgnUGFnZS5yZW1vdmVTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCcsIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgb25BdHRhY2hlZFRvVGFyZ2V0KHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0Ll9nZXRUYXJnZXRJbmZvKCkudHlwZSAhPT0gJ2lmcmFtZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUodGFyZ2V0Ll9nZXRUYXJnZXRJbmZvKCkudGFyZ2V0SWQpO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIGZyYW1lLnVwZGF0ZUNsaWVudCh0YXJnZXQuX3Nlc3Npb24oKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKHRhcmdldC5fc2Vzc2lvbigpKTtcbiAgICAgICAgdm9pZCB0aGlzLmluaXRpYWxpemUodGFyZ2V0Ll9zZXNzaW9uKCksIGZyYW1lKTtcbiAgICB9XG4gICAgX2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyKGNsaWVudCkge1xuICAgICAgICBsZXQgbWFuYWdlciA9IHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyTWFwLmdldChjbGllbnQpO1xuICAgICAgICBpZiAobWFuYWdlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtYW5hZ2VyID0gbmV3IERldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyKGNsaWVudCwgdGhpcy4jdGltZW91dFNldHRpbmdzKTtcbiAgICAgICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyTWFwLnNldChjbGllbnQsIG1hbmFnZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYW5hZ2VyO1xuICAgIH1cbiAgICAjb25MaWZlY3ljbGVFdmVudChldmVudCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUoZXZlbnQuZnJhbWVJZCk7XG4gICAgICAgIGlmICghZnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZS5fb25MaWZlY3ljbGVFdmVudChldmVudC5sb2FkZXJJZCwgZXZlbnQubmFtZSk7XG4gICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5MaWZlY3ljbGVFdmVudCwgZnJhbWUpO1xuICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuTGlmZWN5Y2xlRXZlbnQsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgICNvbkZyYW1lU3RhcnRlZExvYWRpbmcoZnJhbWVJZCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUoZnJhbWVJZCk7XG4gICAgICAgIGlmICghZnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZS5fb25Mb2FkaW5nU3RhcnRlZCgpO1xuICAgIH1cbiAgICAjb25GcmFtZVN0b3BwZWRMb2FkaW5nKGZyYW1lSWQpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmZyYW1lKGZyYW1lSWQpO1xuICAgICAgICBpZiAoIWZyYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUuX29uTG9hZGluZ1N0b3BwZWQoKTtcbiAgICAgICAgdGhpcy5lbWl0KEZyYW1lTWFuYWdlckV2ZW50LkxpZmVjeWNsZUV2ZW50LCBmcmFtZSk7XG4gICAgICAgIGZyYW1lLmVtaXQoRnJhbWVFdmVudC5MaWZlY3ljbGVFdmVudCwgdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgI2hhbmRsZUZyYW1lVHJlZShzZXNzaW9uLCBmcmFtZVRyZWUpIHtcbiAgICAgICAgaWYgKGZyYW1lVHJlZS5mcmFtZS5wYXJlbnRJZCkge1xuICAgICAgICAgICAgdGhpcy4jb25GcmFtZUF0dGFjaGVkKHNlc3Npb24sIGZyYW1lVHJlZS5mcmFtZS5pZCwgZnJhbWVUcmVlLmZyYW1lLnBhcmVudElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuI2ZyYW1lTmF2aWdhdGVkUmVjZWl2ZWQuaGFzKGZyYW1lVHJlZS5mcmFtZS5pZCkpIHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25GcmFtZU5hdmlnYXRlZChmcmFtZVRyZWUuZnJhbWUsICdOYXZpZ2F0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU5hdmlnYXRlZFJlY2VpdmVkLmRlbGV0ZShmcmFtZVRyZWUuZnJhbWUuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZnJhbWVUcmVlLmNoaWxkRnJhbWVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmcmFtZVRyZWUuY2hpbGRGcmFtZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZUZyYW1lVHJlZShzZXNzaW9uLCBjaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uRnJhbWVBdHRhY2hlZChzZXNzaW9uLCBmcmFtZUlkLCBwYXJlbnRGcmFtZUlkKSB7XG4gICAgICAgIGxldCBmcmFtZSA9IHRoaXMuZnJhbWUoZnJhbWVJZCk7XG4gICAgICAgIGlmIChmcmFtZSkge1xuICAgICAgICAgICAgaWYgKHNlc3Npb24gJiYgZnJhbWUuaXNPT1BGcmFtZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gT09QIGlmcmFtZXMgYmVjb21lcyBhIG5vcm1hbCBpZnJhbWUgYWdhaW5cbiAgICAgICAgICAgICAgICAvLyBpdCBpcyBmaXJzdCBhdHRhY2hlZCB0byB0aGUgcGFyZW50IHBhZ2UgYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBpcyByZW1vdmVkLlxuICAgICAgICAgICAgICAgIGZyYW1lLnVwZGF0ZUNsaWVudChzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZSA9IG5ldyBDZHBGcmFtZSh0aGlzLCBmcmFtZUlkLCBwYXJlbnRGcmFtZUlkLCBzZXNzaW9uKTtcbiAgICAgICAgdGhpcy5fZnJhbWVUcmVlLmFkZEZyYW1lKGZyYW1lKTtcbiAgICAgICAgdGhpcy5lbWl0KEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lQXR0YWNoZWQsIGZyYW1lKTtcbiAgICB9XG4gICAgYXN5bmMgI29uRnJhbWVOYXZpZ2F0ZWQoZnJhbWVQYXlsb2FkLCBuYXZpZ2F0aW9uVHlwZSkge1xuICAgICAgICBjb25zdCBmcmFtZUlkID0gZnJhbWVQYXlsb2FkLmlkO1xuICAgICAgICBjb25zdCBpc01haW5GcmFtZSA9ICFmcmFtZVBheWxvYWQucGFyZW50SWQ7XG4gICAgICAgIGxldCBmcmFtZSA9IHRoaXMuX2ZyYW1lVHJlZS5nZXRCeUlkKGZyYW1lSWQpO1xuICAgICAgICAvLyBEZXRhY2ggYWxsIGNoaWxkIGZyYW1lcyBmaXJzdC5cbiAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZyYW1lLmNoaWxkRnJhbWVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIG9yIGNyZWF0ZSBtYWluIGZyYW1lLlxuICAgICAgICBpZiAoaXNNYWluRnJhbWUpIHtcbiAgICAgICAgICAgIGlmIChmcmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmcmFtZSBpZCB0byByZXRhaW4gZnJhbWUgaWRlbnRpdHkgb24gY3Jvc3MtcHJvY2VzcyBuYXZpZ2F0aW9uLlxuICAgICAgICAgICAgICAgIHRoaXMuX2ZyYW1lVHJlZS5yZW1vdmVGcmFtZShmcmFtZSk7XG4gICAgICAgICAgICAgICAgZnJhbWUuX2lkID0gZnJhbWVJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgbWFpbiBmcmFtZSBuYXZpZ2F0aW9uLlxuICAgICAgICAgICAgICAgIGZyYW1lID0gbmV3IENkcEZyYW1lKHRoaXMsIGZyYW1lSWQsIHVuZGVmaW5lZCwgdGhpcy4jY2xpZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lVHJlZS5hZGRGcmFtZShmcmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUgPSBhd2FpdCB0aGlzLl9mcmFtZVRyZWUud2FpdEZvckZyYW1lKGZyYW1lSWQpO1xuICAgICAgICBmcmFtZS5fbmF2aWdhdGVkKGZyYW1lUGF5bG9hZCk7XG4gICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5GcmFtZU5hdmlnYXRlZCwgZnJhbWUpO1xuICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuRnJhbWVOYXZpZ2F0ZWQsIG5hdmlnYXRpb25UeXBlKTtcbiAgICB9XG4gICAgYXN5bmMgI2NyZWF0ZUlzb2xhdGVkV29ybGQoc2Vzc2lvbiwgbmFtZSkge1xuICAgICAgICBjb25zdCBrZXkgPSBgJHtzZXNzaW9uLmlkKCl9OiR7bmFtZX1gO1xuICAgICAgICBpZiAodGhpcy4jaXNvbGF0ZWRXb3JsZHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmQoJ1BhZ2UuYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQnLCB7XG4gICAgICAgICAgICBzb3VyY2U6IGAvLyMgc291cmNlVVJMPSR7UHVwcGV0ZWVyVVJMLklOVEVSTkFMX1VSTH1gLFxuICAgICAgICAgICAgd29ybGROYW1lOiBuYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mcmFtZXMoKVxuICAgICAgICAgICAgLmZpbHRlcihmcmFtZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJhbWUuY2xpZW50ID09PSBzZXNzaW9uO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLm1hcChmcmFtZSA9PiB7XG4gICAgICAgICAgICAvLyBGcmFtZXMgbWlnaHQgYmUgcmVtb3ZlZCBiZWZvcmUgd2Ugc2VuZCB0aGlzLCBzbyB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgICAgICAvLyB0aHJvdyBhbiBlcnJvci5cbiAgICAgICAgICAgIHJldHVybiBzZXNzaW9uXG4gICAgICAgICAgICAgICAgLnNlbmQoJ1BhZ2UuY3JlYXRlSXNvbGF0ZWRXb3JsZCcsIHtcbiAgICAgICAgICAgICAgICBmcmFtZUlkOiBmcmFtZS5faWQsXG4gICAgICAgICAgICAgICAgd29ybGROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgIGdyYW50VW5pdmVyYWxBY2Nlc3M6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLiNpc29sYXRlZFdvcmxkcy5hZGQoa2V5KTtcbiAgICB9XG4gICAgI29uRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudChmcmFtZUlkLCB1cmwpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmZyYW1lKGZyYW1lSWQpO1xuICAgICAgICBpZiAoIWZyYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUuX25hdmlnYXRlZFdpdGhpbkRvY3VtZW50KHVybCk7XG4gICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5GcmFtZU5hdmlnYXRlZFdpdGhpbkRvY3VtZW50LCBmcmFtZSk7XG4gICAgICAgIGZyYW1lLmVtaXQoRnJhbWVFdmVudC5GcmFtZU5hdmlnYXRlZFdpdGhpbkRvY3VtZW50LCB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmVtaXQoRnJhbWVNYW5hZ2VyRXZlbnQuRnJhbWVOYXZpZ2F0ZWQsIGZyYW1lKTtcbiAgICAgICAgZnJhbWUuZW1pdChGcmFtZUV2ZW50LkZyYW1lTmF2aWdhdGVkLCAnTmF2aWdhdGlvbicpO1xuICAgIH1cbiAgICAjb25GcmFtZURldGFjaGVkKGZyYW1lSWQsIHJlYXNvbikge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUoZnJhbWVJZCk7XG4gICAgICAgIGlmICghZnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgY2FzZSAncmVtb3ZlJzpcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHJlbW92ZSB0aGUgZnJhbWUgaWYgdGhlIHJlYXNvbiBmb3IgdGhlIGRldGFjaGVkIGV2ZW50IGlzXG4gICAgICAgICAgICAgICAgLy8gYW4gYWN0dWFsIHJlbW92ZW1lbnQgb2YgdGhlIGZyYW1lLlxuICAgICAgICAgICAgICAgIC8vIEZvciBmcmFtZXMgdGhhdCBiZWNvbWUgT09QIGlmcmFtZXMsIHRoZSByZWFzb24gd291bGQgYmUgJ3N3YXAnLlxuICAgICAgICAgICAgICAgIHRoaXMuI3JlbW92ZUZyYW1lc1JlY3Vyc2l2ZWx5KGZyYW1lKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3N3YXAnOlxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5GcmFtZVN3YXBwZWQsIGZyYW1lKTtcbiAgICAgICAgICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgICNvbkV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkKGNvbnRleHRQYXlsb2FkLCBzZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGF1eERhdGEgPSBjb250ZXh0UGF5bG9hZC5hdXhEYXRhO1xuICAgICAgICBjb25zdCBmcmFtZUlkID0gYXV4RGF0YSAmJiBhdXhEYXRhLmZyYW1lSWQ7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdHlwZW9mIGZyYW1lSWQgPT09ICdzdHJpbmcnID8gdGhpcy5mcmFtZShmcmFtZUlkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHdvcmxkO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgY2FyZSBhYm91dCBleGVjdXRpb24gY29udGV4dHMgY3JlYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi5cbiAgICAgICAgICAgIGlmIChmcmFtZS5jbGllbnQgIT09IHNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29udGV4dFBheWxvYWQuYXV4RGF0YSAmJiBjb250ZXh0UGF5bG9hZC5hdXhEYXRhWydpc0RlZmF1bHQnXSkge1xuICAgICAgICAgICAgICAgIHdvcmxkID0gZnJhbWUud29ybGRzW01BSU5fV09STERdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29udGV4dFBheWxvYWQubmFtZSA9PT0gVVRJTElUWV9XT1JMRF9OQU1FKSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBtdWx0aXBsZSBzZXNzaW9ucyB0byB0aGUgc2FtZSB0YXJnZXQsIHRoZXJlJ3MgYSByYWNlIGJldHdlZW5cbiAgICAgICAgICAgICAgICAvLyBjb25uZWN0aW9ucyBzbyB3ZSBtaWdodCBlbmQgdXAgY3JlYXRpbmcgbXVsdGlwbGUgaXNvbGF0ZWQgd29ybGRzLlxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgZWl0aGVyLlxuICAgICAgICAgICAgICAgIHdvcmxkID0gZnJhbWUud29ybGRzW1BVUFBFVEVFUl9XT1JMRF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gd29ybGQsIHRoZSBjb250ZXh0IGlzIG5vdCBtZWFudCB0byBiZSBoYW5kbGVkIGJ5IHVzLlxuICAgICAgICBpZiAoIXdvcmxkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBFeGVjdXRpb25Db250ZXh0KGZyYW1lPy5jbGllbnQgfHwgdGhpcy4jY2xpZW50LCBjb250ZXh0UGF5bG9hZCwgd29ybGQpO1xuICAgICAgICB3b3JsZC5zZXRDb250ZXh0KGNvbnRleHQpO1xuICAgIH1cbiAgICAjcmVtb3ZlRnJhbWVzUmVjdXJzaXZlbHkoZnJhbWUpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmcmFtZS5jaGlsZEZyYW1lcygpKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWVbZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgdGhpcy5fZnJhbWVUcmVlLnJlbW92ZUZyYW1lKGZyYW1lKTtcbiAgICAgICAgdGhpcy5lbWl0KEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lRGV0YWNoZWQsIGZyYW1lKTtcbiAgICAgICAgZnJhbWUuZW1pdChGcmFtZUV2ZW50LkZyYW1lRGV0YWNoZWQsIGZyYW1lKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GcmFtZU1hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogV2UgdXNlIHN5bWJvbHMgdG8gcHJldmVudCBleHRlcm5hbCBwYXJ0aWVzIGxpc3RlbmluZyB0byB0aGVzZSBldmVudHMuXG4gKiBUaGV5IGFyZSBpbnRlcm5hbCB0byBQdXBwZXRlZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIEZyYW1lTWFuYWdlckV2ZW50O1xuKGZ1bmN0aW9uIChGcmFtZU1hbmFnZXJFdmVudCkge1xuICAgIEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lQXR0YWNoZWQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZUF0dGFjaGVkJyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuRnJhbWVOYXZpZ2F0ZWQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZU5hdmlnYXRlZCcpO1xuICAgIEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lRGV0YWNoZWQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZURldGFjaGVkJyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuRnJhbWVTd2FwcGVkID0gU3ltYm9sKCdGcmFtZU1hbmFnZXIuRnJhbWVTd2FwcGVkJyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuTGlmZWN5Y2xlRXZlbnQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5MaWZlY3ljbGVFdmVudCcpO1xuICAgIEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lTmF2aWdhdGVkV2l0aGluRG9jdW1lbnQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZU5hdmlnYXRlZFdpdGhpbkRvY3VtZW50Jyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuQ29uc29sZUFwaUNhbGxlZCA9IFN5bWJvbCgnRnJhbWVNYW5hZ2VyLkNvbnNvbGVBcGlDYWxsZWQnKTtcbiAgICBGcmFtZU1hbmFnZXJFdmVudC5CaW5kaW5nQ2FsbGVkID0gU3ltYm9sKCdGcmFtZU1hbmFnZXIuQmluZGluZ0NhbGxlZCcpO1xufSkoRnJhbWVNYW5hZ2VyRXZlbnQgfHwgKEZyYW1lTWFuYWdlckV2ZW50ID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyYW1lTWFuYWdlckV2ZW50cy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIHBhZ2UgZnJhbWUgdHJlZSBhbmQgaXQncyBpcyBtYW5hZ2VkIGJ5XG4gKiB7QGxpbmsgRnJhbWVNYW5hZ2VyfS4gRnJhbWVUcmVlIHVzZXMgZnJhbWUgSURzIHRvIHJlZmVyZW5jZSBmcmFtZSBhbmQgaXRcbiAqIG1lYW5zIHRoYXQgcmVmZXJlbmNlZCBmcmFtZXMgbWlnaHQgbm90IGJlIGluIHRoZSB0cmVlIGFueW1vcmUuIFRodXMsIHRoZSB0cmVlXG4gKiBzdHJ1Y3R1cmUgaXMgZXZlbnR1YWxseSBjb25zaXN0ZW50LlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBGcmFtZVRyZWUge1xuICAgICNmcmFtZXMgPSBuZXcgTWFwKCk7XG4gICAgLy8gZnJhbWVJRCAtPiBwYXJlbnRGcmFtZUlEXG4gICAgI3BhcmVudElkcyA9IG5ldyBNYXAoKTtcbiAgICAvLyBmcmFtZUlEIC0+IGNoaWxkRnJhbWVJRHNcbiAgICAjY2hpbGRJZHMgPSBuZXcgTWFwKCk7XG4gICAgI21haW5GcmFtZTtcbiAgICAjaXNNYWluRnJhbWVTdGFsZSA9IGZhbHNlO1xuICAgICN3YWl0UmVxdWVzdHMgPSBuZXcgTWFwKCk7XG4gICAgZ2V0TWFpbkZyYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWFpbkZyYW1lO1xuICAgIH1cbiAgICBnZXRCeUlkKGZyYW1lSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZyYW1lcy5nZXQoZnJhbWVJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgZnJhbWUgd2l0aFxuICAgICAqIHRoZSBnaXZlbiBJRCBpcyBhZGRlZCB0byB0aGUgdHJlZS5cbiAgICAgKi9cbiAgICB3YWl0Rm9yRnJhbWUoZnJhbWVJZCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZ2V0QnlJZChmcmFtZUlkKTtcbiAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZyYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLiN3YWl0UmVxdWVzdHMuZ2V0KGZyYW1lSWQpIHx8IG5ldyBTZXQoKTtcbiAgICAgICAgY2FsbGJhY2tzLmFkZChkZWZlcnJlZCk7XG4gICAgICAgIHJldHVybiBkZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgZnJhbWVzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiNmcmFtZXMudmFsdWVzKCkpO1xuICAgIH1cbiAgICBhZGRGcmFtZShmcmFtZSkge1xuICAgICAgICB0aGlzLiNmcmFtZXMuc2V0KGZyYW1lLl9pZCwgZnJhbWUpO1xuICAgICAgICBpZiAoZnJhbWUuX3BhcmVudElkKSB7XG4gICAgICAgICAgICB0aGlzLiNwYXJlbnRJZHMuc2V0KGZyYW1lLl9pZCwgZnJhbWUuX3BhcmVudElkKTtcbiAgICAgICAgICAgIGlmICghdGhpcy4jY2hpbGRJZHMuaGFzKGZyYW1lLl9wYXJlbnRJZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjaGlsZElkcy5zZXQoZnJhbWUuX3BhcmVudElkLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jY2hpbGRJZHMuZ2V0KGZyYW1lLl9wYXJlbnRJZCkuYWRkKGZyYW1lLl9pZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuI21haW5GcmFtZSB8fCB0aGlzLiNpc01haW5GcmFtZVN0YWxlKSB7XG4gICAgICAgICAgICB0aGlzLiNtYWluRnJhbWUgPSBmcmFtZTtcbiAgICAgICAgICAgIHRoaXMuI2lzTWFpbkZyYW1lU3RhbGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN3YWl0UmVxdWVzdHMuZ2V0KGZyYW1lLl9pZCk/LmZvckVhY2gocmVxdWVzdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5yZXNvbHZlKGZyYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZUZyYW1lKGZyYW1lKSB7XG4gICAgICAgIHRoaXMuI2ZyYW1lcy5kZWxldGUoZnJhbWUuX2lkKTtcbiAgICAgICAgdGhpcy4jcGFyZW50SWRzLmRlbGV0ZShmcmFtZS5faWQpO1xuICAgICAgICBpZiAoZnJhbWUuX3BhcmVudElkKSB7XG4gICAgICAgICAgICB0aGlzLiNjaGlsZElkcy5nZXQoZnJhbWUuX3BhcmVudElkKT8uZGVsZXRlKGZyYW1lLl9pZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNpc01haW5GcmFtZVN0YWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjaGlsZEZyYW1lcyhmcmFtZUlkKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkSWRzID0gdGhpcy4jY2hpbGRJZHMuZ2V0KGZyYW1lSWQpO1xuICAgICAgICBpZiAoIWNoaWxkSWRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oY2hpbGRJZHMpXG4gICAgICAgICAgICAubWFwKGlkID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEJ5SWQoaWQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigoZnJhbWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmcmFtZSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGFyZW50RnJhbWUoZnJhbWVJZCkge1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMuI3BhcmVudElkcy5nZXQoZnJhbWVJZCk7XG4gICAgICAgIHJldHVybiBwYXJlbnRJZCA/IHRoaXMuZ2V0QnlJZChwYXJlbnRJZCkgOiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnJhbWVUcmVlLmpzLm1hcCIsImltcG9ydCB7IGhlYWRlcnNBcnJheSwgSFRUUFJlcXVlc3QsIFNUQVRVU19URVhUUywgaGFuZGxlRXJyb3IsIH0gZnJvbSAnLi4vYXBpL0hUVFBSZXF1ZXN0LmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwSFRUUFJlcXVlc3QgZXh0ZW5kcyBIVFRQUmVxdWVzdCB7XG4gICAgaWQ7XG4gICAgI2NsaWVudDtcbiAgICAjaXNOYXZpZ2F0aW9uUmVxdWVzdDtcbiAgICAjdXJsO1xuICAgICNyZXNvdXJjZVR5cGU7XG4gICAgI21ldGhvZDtcbiAgICAjaGFzUG9zdERhdGEgPSBmYWxzZTtcbiAgICAjcG9zdERhdGE7XG4gICAgI2hlYWRlcnMgPSB7fTtcbiAgICAjZnJhbWU7XG4gICAgI2luaXRpYXRvcjtcbiAgICBnZXQgY2xpZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50O1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIGZyYW1lLCBpbnRlcmNlcHRpb25JZCwgYWxsb3dJbnRlcmNlcHRpb24sIGRhdGEsIHJlZGlyZWN0Q2hhaW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB0aGlzLmlkID0gZGF0YS5yZXF1ZXN0SWQ7XG4gICAgICAgIHRoaXMuI2lzTmF2aWdhdGlvblJlcXVlc3QgPVxuICAgICAgICAgICAgZGF0YS5yZXF1ZXN0SWQgPT09IGRhdGEubG9hZGVySWQgJiYgZGF0YS50eXBlID09PSAnRG9jdW1lbnQnO1xuICAgICAgICB0aGlzLl9pbnRlcmNlcHRpb25JZCA9IGludGVyY2VwdGlvbklkO1xuICAgICAgICB0aGlzLiN1cmwgPSBkYXRhLnJlcXVlc3QudXJsO1xuICAgICAgICB0aGlzLiNyZXNvdXJjZVR5cGUgPSAoZGF0YS50eXBlIHx8ICdvdGhlcicpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHRoaXMuI21ldGhvZCA9IGRhdGEucmVxdWVzdC5tZXRob2Q7XG4gICAgICAgIHRoaXMuI3Bvc3REYXRhID0gZGF0YS5yZXF1ZXN0LnBvc3REYXRhO1xuICAgICAgICB0aGlzLiNoYXNQb3N0RGF0YSA9IGRhdGEucmVxdWVzdC5oYXNQb3N0RGF0YSA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy4jZnJhbWUgPSBmcmFtZTtcbiAgICAgICAgdGhpcy5fcmVkaXJlY3RDaGFpbiA9IHJlZGlyZWN0Q2hhaW47XG4gICAgICAgIHRoaXMuI2luaXRpYXRvciA9IGRhdGEuaW5pdGlhdG9yO1xuICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5lbmFibGVkID0gYWxsb3dJbnRlcmNlcHRpb247XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEucmVxdWVzdC5oZWFkZXJzKSkge1xuICAgICAgICAgICAgdGhpcy4jaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN1cmw7XG4gICAgfVxuICAgIHJlc291cmNlVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlVHlwZTtcbiAgICB9XG4gICAgbWV0aG9kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWV0aG9kO1xuICAgIH1cbiAgICBwb3N0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Bvc3REYXRhO1xuICAgIH1cbiAgICBoYXNQb3N0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hhc1Bvc3REYXRhO1xuICAgIH1cbiAgICBhc3luYyBmZXRjaFBvc3REYXRhKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ05ldHdvcmsuZ2V0UmVxdWVzdFBvc3REYXRhJywge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5wb3N0RGF0YTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hlYWRlcnM7XG4gICAgfVxuICAgIHJlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2U7XG4gICAgfVxuICAgIGZyYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWU7XG4gICAgfVxuICAgIGlzTmF2aWdhdGlvblJlcXVlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc05hdmlnYXRpb25SZXF1ZXN0O1xuICAgIH1cbiAgICBpbml0aWF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpbml0aWF0b3I7XG4gICAgfVxuICAgIHJlZGlyZWN0Q2hhaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWRpcmVjdENoYWluLnNsaWNlKCk7XG4gICAgfVxuICAgIGZhaWx1cmUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZmFpbHVyZVRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvclRleHQ6IHRoaXMuX2ZhaWx1cmVUZXh0LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBfY29udGludWUob3ZlcnJpZGVzID0ge30pIHtcbiAgICAgICAgY29uc3QgeyB1cmwsIG1ldGhvZCwgcG9zdERhdGEsIGhlYWRlcnMgfSA9IG92ZXJyaWRlcztcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBvc3REYXRhQmluYXJ5QmFzZTY0ID0gcG9zdERhdGEgPyBidG9hKHBvc3REYXRhKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMuX2ludGVyY2VwdGlvbklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSFRUUFJlcXVlc3QgaXMgbWlzc2luZyBfaW50ZXJjZXB0aW9uSWQgbmVlZGVkIGZvciBGZXRjaC5jb250aW51ZVJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnRcbiAgICAgICAgICAgIC5zZW5kKCdGZXRjaC5jb250aW51ZVJlcXVlc3QnLCB7XG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHRoaXMuX2ludGVyY2VwdGlvbklkLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgcG9zdERhdGE6IHBvc3REYXRhQmluYXJ5QmFzZTY0LFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyA/IGhlYWRlcnNBcnJheShoZWFkZXJzKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5oYW5kbGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX3Jlc3BvbmQocmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGxldCBwYXJzZWRCb2R5O1xuICAgICAgICBpZiAocmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgcGFyc2VkQm9keSA9IEhUVFBSZXF1ZXN0LmdldFJlc3BvbnNlKHJlc3BvbnNlLmJvZHkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgb2YgT2JqZWN0LmtleXMocmVzcG9uc2UuaGVhZGVycykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgICAgICAgICByZXNwb25zZUhlYWRlcnNbaGVhZGVyLnRvTG93ZXJDYXNlKCldID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyB2YWx1ZS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLmNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICByZXNwb25zZUhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gcmVzcG9uc2UuY29udGVudFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZEJvZHk/LmNvbnRlbnRMZW5ndGggJiYgISgnY29udGVudC1sZW5ndGgnIGluIHJlc3BvbnNlSGVhZGVycykpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9IFN0cmluZyhwYXJzZWRCb2R5LmNvbnRlbnRMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cyB8fCAyMDA7XG4gICAgICAgIGlmICh0aGlzLl9pbnRlcmNlcHRpb25JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hUVFBSZXF1ZXN0IGlzIG1pc3NpbmcgX2ludGVyY2VwdGlvbklkIG5lZWRlZCBmb3IgRmV0Y2guZnVsZmlsbFJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnRcbiAgICAgICAgICAgIC5zZW5kKCdGZXRjaC5mdWxmaWxsUmVxdWVzdCcsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZDogdGhpcy5faW50ZXJjZXB0aW9uSWQsXG4gICAgICAgICAgICByZXNwb25zZUNvZGU6IHN0YXR1cyxcbiAgICAgICAgICAgIHJlc3BvbnNlUGhyYXNlOiBTVEFUVVNfVEVYVFNbc3RhdHVzXSxcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyczogaGVhZGVyc0FycmF5KHJlc3BvbnNlSGVhZGVycyksXG4gICAgICAgICAgICBib2R5OiBwYXJzZWRCb2R5Py5iYXNlNjQsXG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIF9hYm9ydChlcnJvclJlYXNvbikge1xuICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5oYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuX2ludGVyY2VwdGlvbklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSFRUUFJlcXVlc3QgaXMgbWlzc2luZyBfaW50ZXJjZXB0aW9uSWQgbmVlZGVkIGZvciBGZXRjaC5mYWlsUmVxdWVzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudFxuICAgICAgICAgICAgLnNlbmQoJ0ZldGNoLmZhaWxSZXF1ZXN0Jywge1xuICAgICAgICAgICAgcmVxdWVzdElkOiB0aGlzLl9pbnRlcmNlcHRpb25JZCxcbiAgICAgICAgICAgIGVycm9yUmVhc29uOiBlcnJvclJlYXNvbiB8fCAnRmFpbGVkJyxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChoYW5kbGVFcnJvcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SFRUUFJlcXVlc3QuanMubWFwIiwiaW1wb3J0IHsgSFRUUFJlc3BvbnNlIH0gZnJvbSAnLi4vYXBpL0hUVFBSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBQcm90b2NvbEVycm9yIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eURldGFpbHMgfSBmcm9tICcuLi9jb21tb24vU2VjdXJpdHlEZXRhaWxzLmpzJztcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi4vdXRpbC9EZWZlcnJlZC5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwSFRUUFJlc3BvbnNlIGV4dGVuZHMgSFRUUFJlc3BvbnNlIHtcbiAgICAjY2xpZW50O1xuICAgICNyZXF1ZXN0O1xuICAgICNjb250ZW50UHJvbWlzZSA9IG51bGw7XG4gICAgI2JvZHlMb2FkZWREZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICNyZW1vdGVBZGRyZXNzO1xuICAgICNzdGF0dXM7XG4gICAgI3N0YXR1c1RleHQ7XG4gICAgI3VybDtcbiAgICAjZnJvbURpc2tDYWNoZTtcbiAgICAjZnJvbVNlcnZpY2VXb3JrZXI7XG4gICAgI2hlYWRlcnMgPSB7fTtcbiAgICAjc2VjdXJpdHlEZXRhaWxzO1xuICAgICN0aW1pbmc7XG4gICAgY29uc3RydWN0b3IoY2xpZW50LCByZXF1ZXN0LCByZXNwb25zZVBheWxvYWQsIGV4dHJhSW5mbykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3JlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICB0aGlzLiNyZW1vdGVBZGRyZXNzID0ge1xuICAgICAgICAgICAgaXA6IHJlc3BvbnNlUGF5bG9hZC5yZW1vdGVJUEFkZHJlc3MsXG4gICAgICAgICAgICBwb3J0OiByZXNwb25zZVBheWxvYWQucmVtb3RlUG9ydCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3RhdHVzVGV4dCA9XG4gICAgICAgICAgICB0aGlzLiNwYXJzZVN0YXR1c1RleHRGcm9tRXh0cmFJbmZvKGV4dHJhSW5mbykgfHxcbiAgICAgICAgICAgICAgICByZXNwb25zZVBheWxvYWQuc3RhdHVzVGV4dDtcbiAgICAgICAgdGhpcy4jdXJsID0gcmVxdWVzdC51cmwoKTtcbiAgICAgICAgdGhpcy4jZnJvbURpc2tDYWNoZSA9ICEhcmVzcG9uc2VQYXlsb2FkLmZyb21EaXNrQ2FjaGU7XG4gICAgICAgIHRoaXMuI2Zyb21TZXJ2aWNlV29ya2VyID0gISFyZXNwb25zZVBheWxvYWQuZnJvbVNlcnZpY2VXb3JrZXI7XG4gICAgICAgIHRoaXMuI3N0YXR1cyA9IGV4dHJhSW5mbyA/IGV4dHJhSW5mby5zdGF0dXNDb2RlIDogcmVzcG9uc2VQYXlsb2FkLnN0YXR1cztcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGV4dHJhSW5mbyA/IGV4dHJhSW5mby5oZWFkZXJzIDogcmVzcG9uc2VQYXlsb2FkLmhlYWRlcnM7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgICB0aGlzLiNoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3NlY3VyaXR5RGV0YWlscyA9IHJlc3BvbnNlUGF5bG9hZC5zZWN1cml0eURldGFpbHNcbiAgICAgICAgICAgID8gbmV3IFNlY3VyaXR5RGV0YWlscyhyZXNwb25zZVBheWxvYWQuc2VjdXJpdHlEZXRhaWxzKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICB0aGlzLiN0aW1pbmcgPSByZXNwb25zZVBheWxvYWQudGltaW5nIHx8IG51bGw7XG4gICAgfVxuICAgICNwYXJzZVN0YXR1c1RleHRGcm9tRXh0cmFJbmZvKGV4dHJhSW5mbykge1xuICAgICAgICBpZiAoIWV4dHJhSW5mbyB8fCAhZXh0cmFJbmZvLmhlYWRlcnNUZXh0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RMaW5lID0gZXh0cmFJbmZvLmhlYWRlcnNUZXh0LnNwbGl0KCdcXHInLCAxKVswXTtcbiAgICAgICAgaWYgKCFmaXJzdExpbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXRjaCA9IGZpcnN0TGluZS5tYXRjaCgvW14gXSogW14gXSogKC4qKS8pO1xuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzVGV4dCA9IG1hdGNoWzFdO1xuICAgICAgICBpZiAoIXN0YXR1c1RleHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdHVzVGV4dDtcbiAgICB9XG4gICAgX3Jlc29sdmVCb2R5KGVycikge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jYm9keUxvYWRlZERlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNib2R5TG9hZGVkRGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdGVBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmVtb3RlQWRkcmVzcztcbiAgICB9XG4gICAgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdXJsO1xuICAgIH1cbiAgICBzdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0dXM7XG4gICAgfVxuICAgIHN0YXR1c1RleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0dXNUZXh0O1xuICAgIH1cbiAgICBoZWFkZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaGVhZGVycztcbiAgICB9XG4gICAgc2VjdXJpdHlEZXRhaWxzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc2VjdXJpdHlEZXRhaWxzO1xuICAgIH1cbiAgICB0aW1pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0aW1pbmc7XG4gICAgfVxuICAgIGJ1ZmZlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNjb250ZW50UHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy4jY29udGVudFByb21pc2UgPSB0aGlzLiNib2R5TG9hZGVkRGVmZXJyZWRcbiAgICAgICAgICAgICAgICAudmFsdWVPclRocm93KClcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnTmV0d29yay5nZXRSZXNwb25zZUJvZHknLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHRoaXMuI3JlcXVlc3QuaWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20ocmVzcG9uc2UuYm9keSwgcmVzcG9uc2UuYmFzZTY0RW5jb2RlZCA/ICdiYXNlNjQnIDogJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFByb3RvY29sRXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm9yaWdpbmFsTWVzc2FnZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTm8gcmVzb3VyY2Ugd2l0aCBnaXZlbiBpZGVudGlmaWVyIGZvdW5kJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGJvZHkgZm9yIHRoaXMgcmVxdWVzdC4gVGhpcyBtaWdodCBoYXBwZW4gaWYgdGhlIHJlcXVlc3QgaXMgYSBwcmVmbGlnaHQgcmVxdWVzdC4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jY29udGVudFByb21pc2U7XG4gICAgfVxuICAgIHJlcXVlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0O1xuICAgIH1cbiAgICBmcm9tQ2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmcm9tRGlza0NhY2hlIHx8IHRoaXMuI3JlcXVlc3QuX2Zyb21NZW1vcnlDYWNoZTtcbiAgICB9XG4gICAgZnJvbVNlcnZpY2VXb3JrZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmcm9tU2VydmljZVdvcmtlcjtcbiAgICB9XG4gICAgZnJhbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0LmZyYW1lKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SFRUUFJlc3BvbnNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBLZXlib2FyZCwgTW91c2UsIE1vdXNlQnV0dG9uLCBUb3VjaHNjcmVlbiwgfSBmcm9tICcuLi9hcGkvSW5wdXQuanMnO1xuaW1wb3J0IHsgX2tleURlZmluaXRpb25zLCB9IGZyb20gJy4uL2NvbW1vbi9VU0tleWJvYXJkTGF5b3V0LmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBLZXlib2FyZCBleHRlbmRzIEtleWJvYXJkIHtcbiAgICAjY2xpZW50O1xuICAgICNwcmVzc2VkS2V5cyA9IG5ldyBTZXQoKTtcbiAgICBfbW9kaWZpZXJzID0gMDtcbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICB1cGRhdGVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgYXN5bmMgZG93bihrZXksIG9wdGlvbnMgPSB7XG4gICAgICAgIHRleHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgY29tbWFuZHM6IFtdLFxuICAgIH0pIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLiNrZXlEZXNjcmlwdGlvbkZvclN0cmluZyhrZXkpO1xuICAgICAgICBjb25zdCBhdXRvUmVwZWF0ID0gdGhpcy4jcHJlc3NlZEtleXMuaGFzKGRlc2NyaXB0aW9uLmNvZGUpO1xuICAgICAgICB0aGlzLiNwcmVzc2VkS2V5cy5hZGQoZGVzY3JpcHRpb24uY29kZSk7XG4gICAgICAgIHRoaXMuX21vZGlmaWVycyB8PSB0aGlzLiNtb2RpZmllckJpdChkZXNjcmlwdGlvbi5rZXkpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gb3B0aW9ucy50ZXh0ID09PSB1bmRlZmluZWQgPyBkZXNjcmlwdGlvbi50ZXh0IDogb3B0aW9ucy50ZXh0O1xuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hLZXlFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6IHRleHQgPyAna2V5RG93bicgOiAncmF3S2V5RG93bicsXG4gICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuX21vZGlmaWVycyxcbiAgICAgICAgICAgIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogZGVzY3JpcHRpb24ua2V5Q29kZSxcbiAgICAgICAgICAgIGNvZGU6IGRlc2NyaXB0aW9uLmNvZGUsXG4gICAgICAgICAgICBrZXk6IGRlc2NyaXB0aW9uLmtleSxcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgICB1bm1vZGlmaWVkVGV4dDogdGV4dCxcbiAgICAgICAgICAgIGF1dG9SZXBlYXQsXG4gICAgICAgICAgICBsb2NhdGlvbjogZGVzY3JpcHRpb24ubG9jYXRpb24sXG4gICAgICAgICAgICBpc0tleXBhZDogZGVzY3JpcHRpb24ubG9jYXRpb24gPT09IDMsXG4gICAgICAgICAgICBjb21tYW5kczogb3B0aW9ucy5jb21tYW5kcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICNtb2RpZmllckJpdChrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ0FsdCcpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdDb250cm9sJykge1xuICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ01ldGEnKSB7XG4gICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSAnU2hpZnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gODtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgI2tleURlc2NyaXB0aW9uRm9yU3RyaW5nKGtleVN0cmluZykge1xuICAgICAgICBjb25zdCBzaGlmdCA9IHRoaXMuX21vZGlmaWVycyAmIDg7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0ge1xuICAgICAgICAgICAga2V5OiAnJyxcbiAgICAgICAgICAgIGtleUNvZGU6IDAsXG4gICAgICAgICAgICBjb2RlOiAnJyxcbiAgICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgICAgbG9jYXRpb246IDAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBfa2V5RGVmaW5pdGlvbnNba2V5U3RyaW5nXTtcbiAgICAgICAgYXNzZXJ0KGRlZmluaXRpb24sIGBVbmtub3duIGtleTogXCIke2tleVN0cmluZ31cImApO1xuICAgICAgICBpZiAoZGVmaW5pdGlvbi5rZXkpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLmtleSA9IGRlZmluaXRpb24ua2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaGlmdCAmJiBkZWZpbml0aW9uLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi5rZXkgPSBkZWZpbml0aW9uLnNoaWZ0S2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZpbml0aW9uLmtleUNvZGUpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLmtleUNvZGUgPSBkZWZpbml0aW9uLmtleUNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoaWZ0ICYmIGRlZmluaXRpb24uc2hpZnRLZXlDb2RlKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi5rZXlDb2RlID0gZGVmaW5pdGlvbi5zaGlmdEtleUNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmluaXRpb24uY29kZSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24uY29kZSA9IGRlZmluaXRpb24uY29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmaW5pdGlvbi5sb2NhdGlvbikge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24ubG9jYXRpb24gPSBkZWZpbml0aW9uLmxvY2F0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbi5rZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi50ZXh0ID0gZGVzY3JpcHRpb24ua2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZpbml0aW9uLnRleHQpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLnRleHQgPSBkZWZpbml0aW9uLnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoaWZ0ICYmIGRlZmluaXRpb24uc2hpZnRUZXh0KSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi50ZXh0ID0gZGVmaW5pdGlvbi5zaGlmdFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYW55IG1vZGlmaWVycyBiZXNpZGVzIHNoaWZ0IGFyZSBwcmVzc2VkLCBubyB0ZXh0IHNob3VsZCBiZSBzZW50XG4gICAgICAgIGlmICh0aGlzLl9tb2RpZmllcnMgJiB+OCkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24udGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgYXN5bmMgdXAoa2V5KSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy4ja2V5RGVzY3JpcHRpb25Gb3JTdHJpbmcoa2V5KTtcbiAgICAgICAgdGhpcy5fbW9kaWZpZXJzICY9IH50aGlzLiNtb2RpZmllckJpdChkZXNjcmlwdGlvbi5rZXkpO1xuICAgICAgICB0aGlzLiNwcmVzc2VkS2V5cy5kZWxldGUoZGVzY3JpcHRpb24uY29kZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaEtleUV2ZW50Jywge1xuICAgICAgICAgICAgdHlwZTogJ2tleVVwJyxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy5fbW9kaWZpZXJzLFxuICAgICAgICAgICAga2V5OiBkZXNjcmlwdGlvbi5rZXksXG4gICAgICAgICAgICB3aW5kb3dzVmlydHVhbEtleUNvZGU6IGRlc2NyaXB0aW9uLmtleUNvZGUsXG4gICAgICAgICAgICBjb2RlOiBkZXNjcmlwdGlvbi5jb2RlLFxuICAgICAgICAgICAgbG9jYXRpb246IGRlc2NyaXB0aW9uLmxvY2F0aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2VuZENoYXJhY3RlcihjaGFyKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5pbnNlcnRUZXh0JywgeyB0ZXh0OiBjaGFyIH0pO1xuICAgIH1cbiAgICBjaGFySXNLZXkoY2hhcikge1xuICAgICAgICByZXR1cm4gISFfa2V5RGVmaW5pdGlvbnNbY2hhcl07XG4gICAgfVxuICAgIGFzeW5jIHR5cGUodGV4dCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gb3B0aW9ucy5kZWxheSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hhciBvZiB0ZXh0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGFySXNLZXkoY2hhcikpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByZXNzKGNoYXIsIHsgZGVsYXkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChmLCBkZWxheSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRDaGFyYWN0ZXIoY2hhcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcHJlc3Moa2V5LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IG51bGwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGF3YWl0IHRoaXMuZG93bihrZXksIG9wdGlvbnMpO1xuICAgICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKGYgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGYsIG9wdGlvbnMuZGVsYXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy51cChrZXkpO1xuICAgIH1cbn1cbmNvbnN0IGdldEZsYWcgPSAoYnV0dG9uKSA9PiB7XG4gICAgc3dpdGNoIChidXR0b24pIHtcbiAgICAgICAgY2FzZSBNb3VzZUJ1dHRvbi5MZWZ0OlxuICAgICAgICAgICAgcmV0dXJuIDEgLyogTW91c2VCdXR0b25GbGFnLkxlZnQgKi87XG4gICAgICAgIGNhc2UgTW91c2VCdXR0b24uUmlnaHQ6XG4gICAgICAgICAgICByZXR1cm4gMiAvKiBNb3VzZUJ1dHRvbkZsYWcuUmlnaHQgKi87XG4gICAgICAgIGNhc2UgTW91c2VCdXR0b24uTWlkZGxlOlxuICAgICAgICAgICAgcmV0dXJuIDQgLyogTW91c2VCdXR0b25GbGFnLk1pZGRsZSAqLztcbiAgICAgICAgY2FzZSBNb3VzZUJ1dHRvbi5CYWNrOlxuICAgICAgICAgICAgcmV0dXJuIDggLyogTW91c2VCdXR0b25GbGFnLkJhY2sgKi87XG4gICAgICAgIGNhc2UgTW91c2VCdXR0b24uRm9yd2FyZDpcbiAgICAgICAgICAgIHJldHVybiAxNiAvKiBNb3VzZUJ1dHRvbkZsYWcuRm9yd2FyZCAqLztcbiAgICB9XG59O1xuLyoqXG4gKiBUaGlzIHNob3VsZCBtYXRjaFxuICogaHR0cHM6Ly9zb3VyY2UuY2hyb21pdW0ub3JnL2Nocm9taXVtL2Nocm9taXVtL3NyYy8rL3JlZnMvaGVhZHMvbWFpbjpjb250ZW50L2Jyb3dzZXIvcmVuZGVyZXJfaG9zdC9pbnB1dC93ZWJfaW5wdXRfZXZlbnRfYnVpbGRlcnNfbWFjLm1tO2RyYz1hNjFiOTVjNjNiMGI3NWMxY2ZlODcyZDljOGNkZjkyN2MyMjYwNDZlO2Jwdj0xO2JwdD0xO2w9MjIxLlxuICovXG5jb25zdCBnZXRCdXR0b25Gcm9tUHJlc3NlZEJ1dHRvbnMgPSAoYnV0dG9ucykgPT4ge1xuICAgIGlmIChidXR0b25zICYgMSAvKiBNb3VzZUJ1dHRvbkZsYWcuTGVmdCAqLykge1xuICAgICAgICByZXR1cm4gTW91c2VCdXR0b24uTGVmdDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnV0dG9ucyAmIDIgLyogTW91c2VCdXR0b25GbGFnLlJpZ2h0ICovKSB7XG4gICAgICAgIHJldHVybiBNb3VzZUJ1dHRvbi5SaWdodDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnV0dG9ucyAmIDQgLyogTW91c2VCdXR0b25GbGFnLk1pZGRsZSAqLykge1xuICAgICAgICByZXR1cm4gTW91c2VCdXR0b24uTWlkZGxlO1xuICAgIH1cbiAgICBlbHNlIGlmIChidXR0b25zICYgOCAvKiBNb3VzZUJ1dHRvbkZsYWcuQmFjayAqLykge1xuICAgICAgICByZXR1cm4gTW91c2VCdXR0b24uQmFjaztcbiAgICB9XG4gICAgZWxzZSBpZiAoYnV0dG9ucyAmIDE2IC8qIE1vdXNlQnV0dG9uRmxhZy5Gb3J3YXJkICovKSB7XG4gICAgICAgIHJldHVybiBNb3VzZUJ1dHRvbi5Gb3J3YXJkO1xuICAgIH1cbiAgICByZXR1cm4gJ25vbmUnO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBNb3VzZSBleHRlbmRzIE1vdXNlIHtcbiAgICAjY2xpZW50O1xuICAgICNrZXlib2FyZDtcbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIGtleWJvYXJkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICAgICAgdGhpcy4ja2V5Ym9hcmQgPSBrZXlib2FyZDtcbiAgICB9XG4gICAgdXBkYXRlQ2xpZW50KGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgICNfc3RhdGUgPSB7XG4gICAgICAgIHBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgYnV0dG9uczogMCAvKiBNb3VzZUJ1dHRvbkZsYWcuTm9uZSAqLyxcbiAgICB9O1xuICAgIGdldCAjc3RhdGUoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgLi4udGhpcy4jX3N0YXRlIH0sIC4uLnRoaXMuI3RyYW5zYWN0aW9ucyk7XG4gICAgfVxuICAgIC8vIFRyYW5zYWN0aW9ucyBjYW4gcnVuIGluIHBhcmFsbGVsLCBzbyB3ZSBzdG9yZSBlYWNoIG9mIHRobWUgaW4gdGhpcyBhcnJheS5cbiAgICAjdHJhbnNhY3Rpb25zID0gW107XG4gICAgI2NyZWF0ZVRyYW5zYWN0aW9uKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHt9O1xuICAgICAgICB0aGlzLiN0cmFuc2FjdGlvbnMucHVzaCh0cmFuc2FjdGlvbik7XG4gICAgICAgIGNvbnN0IHBvcFRyYW5zYWN0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jdHJhbnNhY3Rpb25zLnNwbGljZSh0aGlzLiN0cmFuc2FjdGlvbnMuaW5kZXhPZih0cmFuc2FjdGlvbiksIDEpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXBkYXRlOiAodXBkYXRlcykgPT4ge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odHJhbnNhY3Rpb24sIHVwZGF0ZXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbW1pdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI19zdGF0ZSA9IHsgLi4udGhpcy4jX3N0YXRlLCAuLi50cmFuc2FjdGlvbiB9O1xuICAgICAgICAgICAgICAgIHBvcFRyYW5zYWN0aW9uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm9sbGJhY2s6IHBvcFRyYW5zYWN0aW9uLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIGEgdHlwaWNhbCB1cGRhdGUsIGNvbW1pdC9yb2xsYmFjayBsaWZlY3ljbGUgYmFzZWQgb25cbiAgICAgKiB0aGUgZXJyb3Igb2YgdGhlIGFjdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyAjd2l0aFRyYW5zYWN0aW9uKGFjdGlvbikge1xuICAgICAgICBjb25zdCB7IHVwZGF0ZSwgY29tbWl0LCByb2xsYmFjayB9ID0gdGhpcy4jY3JlYXRlVHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGFjdGlvbih1cGRhdGUpO1xuICAgICAgICAgICAgY29tbWl0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByb2xsYmFjaygpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcmVzZXQoKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbZmxhZywgYnV0dG9uXSBvZiBbXG4gICAgICAgICAgICBbMSAvKiBNb3VzZUJ1dHRvbkZsYWcuTGVmdCAqLywgTW91c2VCdXR0b24uTGVmdF0sXG4gICAgICAgICAgICBbNCAvKiBNb3VzZUJ1dHRvbkZsYWcuTWlkZGxlICovLCBNb3VzZUJ1dHRvbi5NaWRkbGVdLFxuICAgICAgICAgICAgWzIgLyogTW91c2VCdXR0b25GbGFnLlJpZ2h0ICovLCBNb3VzZUJ1dHRvbi5SaWdodF0sXG4gICAgICAgICAgICBbMTYgLyogTW91c2VCdXR0b25GbGFnLkZvcndhcmQgKi8sIE1vdXNlQnV0dG9uLkZvcndhcmRdLFxuICAgICAgICAgICAgWzggLyogTW91c2VCdXR0b25GbGFnLkJhY2sgKi8sIE1vdXNlQnV0dG9uLkJhY2tdLFxuICAgICAgICBdKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jc3RhdGUuYnV0dG9ucyAmIGZsYWcpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zLnB1c2godGhpcy51cCh7IGJ1dHRvbjogYnV0dG9uIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jc3RhdGUucG9zaXRpb24ueCAhPT0gMCB8fCB0aGlzLiNzdGF0ZS5wb3NpdGlvbi55ICE9PSAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2godGhpcy5tb3ZlKDAsIDApKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChhY3Rpb25zKTtcbiAgICB9XG4gICAgYXN5bmMgbW92ZSh4LCB5LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzdGVwcyA9IDEgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGZyb20gPSB0aGlzLiNzdGF0ZS5wb3NpdGlvbjtcbiAgICAgICAgY29uc3QgdG8gPSB7IHgsIHkgfTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gc3RlcHM7IGkrKykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jd2l0aFRyYW5zYWN0aW9uKHVwZGF0ZVN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBmcm9tLnggKyAodG8ueCAtIGZyb20ueCkgKiAoaSAvIHN0ZXBzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGZyb20ueSArICh0by55IC0gZnJvbS55KSAqIChpIC8gc3RlcHMpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYnV0dG9ucywgcG9zaXRpb24gfSA9IHRoaXMuI3N0YXRlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50Jywge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbW91c2VNb3ZlZCcsXG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uOiBnZXRCdXR0b25Gcm9tUHJlc3NlZEJ1dHRvbnMoYnV0dG9ucyksXG4gICAgICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZG93bihvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBidXR0b24gPSBNb3VzZUJ1dHRvbi5MZWZ0LCBjbGlja0NvdW50ID0gMSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZmxhZyA9IGdldEZsYWcoYnV0dG9uKTtcbiAgICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG1vdXNlIGJ1dHRvbjogJHtidXR0b259YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3N0YXRlLmJ1dHRvbnMgJiBmbGFnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2J1dHRvbn0nIGlzIGFscmVhZHkgcHJlc3NlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiN3aXRoVHJhbnNhY3Rpb24odXBkYXRlU3RhdGUgPT4ge1xuICAgICAgICAgICAgdXBkYXRlU3RhdGUoe1xuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IHRoaXMuI3N0YXRlLmJ1dHRvbnMgfCBmbGFnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB7IGJ1dHRvbnMsIHBvc2l0aW9uIH0gPSB0aGlzLiNzdGF0ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50Jywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdtb3VzZVByZXNzZWQnLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgICAgICAgICBjbGlja0NvdW50LFxuICAgICAgICAgICAgICAgIGJ1dHRvbnMsXG4gICAgICAgICAgICAgICAgYnV0dG9uLFxuICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyB1cChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBidXR0b24gPSBNb3VzZUJ1dHRvbi5MZWZ0LCBjbGlja0NvdW50ID0gMSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZmxhZyA9IGdldEZsYWcoYnV0dG9uKTtcbiAgICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG1vdXNlIGJ1dHRvbjogJHtidXR0b259YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEodGhpcy4jc3RhdGUuYnV0dG9ucyAmIGZsYWcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2J1dHRvbn0nIGlzIG5vdCBwcmVzc2VkLmApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI3dpdGhUcmFuc2FjdGlvbih1cGRhdGVTdGF0ZSA9PiB7XG4gICAgICAgICAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgICAgICAgYnV0dG9uczogdGhpcy4jc3RhdGUuYnV0dG9ucyAmIH5mbGFnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB7IGJ1dHRvbnMsIHBvc2l0aW9uIH0gPSB0aGlzLiNzdGF0ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50Jywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdtb3VzZVJlbGVhc2VkJyxcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuI2tleWJvYXJkLl9tb2RpZmllcnMsXG4gICAgICAgICAgICAgICAgY2xpY2tDb3VudCxcbiAgICAgICAgICAgICAgICBidXR0b25zLFxuICAgICAgICAgICAgICAgIGJ1dHRvbixcbiAgICAgICAgICAgICAgICAuLi5wb3NpdGlvbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgY2xpY2soeCwgeSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXksIGNvdW50ID0gMSwgY2xpY2tDb3VudCA9IGNvdW50IH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAoY291bnQgPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NsaWNrIG11c3Qgb2NjdXIgYSBwb3NpdGl2ZSBudW1iZXIgb2YgdGltZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IFt0aGlzLm1vdmUoeCwgeSldO1xuICAgICAgICBpZiAoY2xpY2tDb3VudCA9PT0gY291bnQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY291bnQ7ICsraSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaCh0aGlzLmRvd24oeyAuLi5vcHRpb25zLCBjbGlja0NvdW50OiBpIH0pLCB0aGlzLnVwKHsgLi4ub3B0aW9ucywgY2xpY2tDb3VudDogaSB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWN0aW9ucy5wdXNoKHRoaXMuZG93bih7IC4uLm9wdGlvbnMsIGNsaWNrQ291bnQgfSkpO1xuICAgICAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYWN0aW9ucyk7XG4gICAgICAgICAgICBhY3Rpb25zLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFjdGlvbnMucHVzaCh0aGlzLnVwKHsgLi4ub3B0aW9ucywgY2xpY2tDb3VudCB9KSk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGFjdGlvbnMpO1xuICAgIH1cbiAgICBhc3luYyB3aGVlbChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBkZWx0YVggPSAwLCBkZWx0YVkgPSAwIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCB7IHBvc2l0aW9uLCBidXR0b25zIH0gPSB0aGlzLiNzdGF0ZTtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ0lucHV0LmRpc3BhdGNoTW91c2VFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdtb3VzZVdoZWVsJyxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiAnbW91c2UnLFxuICAgICAgICAgICAgbW9kaWZpZXJzOiB0aGlzLiNrZXlib2FyZC5fbW9kaWZpZXJzLFxuICAgICAgICAgICAgZGVsdGFZLFxuICAgICAgICAgICAgZGVsdGFYLFxuICAgICAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZyhzdGFydCwgdGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5vbmNlKCdJbnB1dC5kcmFnSW50ZXJjZXB0ZWQnLCBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMubW92ZShzdGFydC54LCBzdGFydC55KTtcbiAgICAgICAgYXdhaXQgdGhpcy5kb3duKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubW92ZSh0YXJnZXQueCwgdGFyZ2V0LnkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZ0VudGVyKHRhcmdldCwgZGF0YSkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hEcmFnRXZlbnQnLCB7XG4gICAgICAgICAgICB0eXBlOiAnZHJhZ0VudGVyJyxcbiAgICAgICAgICAgIHg6IHRhcmdldC54LFxuICAgICAgICAgICAgeTogdGFyZ2V0LnksXG4gICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuI2tleWJvYXJkLl9tb2RpZmllcnMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZ092ZXIodGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaERyYWdFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdkcmFnT3ZlcicsXG4gICAgICAgICAgICB4OiB0YXJnZXQueCxcbiAgICAgICAgICAgIHk6IHRhcmdldC55LFxuICAgICAgICAgICAgbW9kaWZpZXJzOiB0aGlzLiNrZXlib2FyZC5fbW9kaWZpZXJzLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGRyb3AodGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaERyYWdFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdkcm9wJyxcbiAgICAgICAgICAgIHg6IHRhcmdldC54LFxuICAgICAgICAgICAgeTogdGFyZ2V0LnksXG4gICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuI2tleWJvYXJkLl9tb2RpZmllcnMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZ0FuZERyb3Aoc3RhcnQsIHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSBudWxsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5kcmFnKHN0YXJ0LCB0YXJnZXQpO1xuICAgICAgICBhd2FpdCB0aGlzLmRyYWdFbnRlcih0YXJnZXQsIGRhdGEpO1xuICAgICAgICBhd2FpdCB0aGlzLmRyYWdPdmVyKHRhcmdldCwgZGF0YSk7XG4gICAgICAgIGlmIChkZWxheSkge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5kcm9wKHRhcmdldCwgZGF0YSk7XG4gICAgICAgIGF3YWl0IHRoaXMudXAoKTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwVG91Y2hzY3JlZW4gZXh0ZW5kcyBUb3VjaHNjcmVlbiB7XG4gICAgI2NsaWVudDtcbiAgICAja2V5Ym9hcmQ7XG4gICAgY29uc3RydWN0b3IoY2xpZW50LCBrZXlib2FyZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI2tleWJvYXJkID0ga2V5Ym9hcmQ7XG4gICAgfVxuICAgIHVwZGF0ZUNsaWVudChjbGllbnQpIHtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICBhc3luYyB0b3VjaFN0YXJ0KHgsIHkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ0lucHV0LmRpc3BhdGNoVG91Y2hFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICd0b3VjaFN0YXJ0JyxcbiAgICAgICAgICAgIHRvdWNoUG9pbnRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB4OiBNYXRoLnJvdW5kKHgpLFxuICAgICAgICAgICAgICAgICAgICB5OiBNYXRoLnJvdW5kKHkpLFxuICAgICAgICAgICAgICAgICAgICByYWRpdXNYOiAwLjUsXG4gICAgICAgICAgICAgICAgICAgIHJhZGl1c1k6IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2U6IDAuNSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHRvdWNoTW92ZSh4LCB5KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaFRvdWNoRXZlbnQnLCB7XG4gICAgICAgICAgICB0eXBlOiAndG91Y2hNb3ZlJyxcbiAgICAgICAgICAgIHRvdWNoUG9pbnRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB4OiBNYXRoLnJvdW5kKHgpLFxuICAgICAgICAgICAgICAgICAgICB5OiBNYXRoLnJvdW5kKHkpLFxuICAgICAgICAgICAgICAgICAgICByYWRpdXNYOiAwLjUsXG4gICAgICAgICAgICAgICAgICAgIHJhZGl1c1k6IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2U6IDAuNSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHRvdWNoRW5kKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50Jywge1xuICAgICAgICAgICAgdHlwZTogJ3RvdWNoRW5kJyxcbiAgICAgICAgICAgIHRvdWNoUG9pbnRzOiBbXSxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBtYXAsIHJhY2VXaXRoIH0gZnJvbSAnLi4vLi4vdGhpcmRfcGFydHkvcnhqcy9yeGpzLmpzJztcbmltcG9ydCB7IFJlYWxtIH0gZnJvbSAnLi4vYXBpL1JlYWxtLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZnJvbUVtaXR0ZXJFdmVudCwgdGltZW91dCwgd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlU3ltYm9sIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IENkcEVsZW1lbnRIYW5kbGUgfSBmcm9tICcuL0VsZW1lbnRIYW5kbGUuanMnO1xuaW1wb3J0IHsgQ2RwSlNIYW5kbGUgfSBmcm9tICcuL0pTSGFuZGxlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBJc29sYXRlZFdvcmxkIGV4dGVuZHMgUmVhbG0ge1xuICAgICNjb250ZXh0O1xuICAgICNlbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICNmcmFtZU9yV29ya2VyO1xuICAgIGNvbnN0cnVjdG9yKGZyYW1lT3JXb3JrZXIsIHRpbWVvdXRTZXR0aW5ncykge1xuICAgICAgICBzdXBlcih0aW1lb3V0U2V0dGluZ3MpO1xuICAgICAgICB0aGlzLiNmcmFtZU9yV29ya2VyID0gZnJhbWVPcldvcmtlcjtcbiAgICB9XG4gICAgZ2V0IGVudmlyb25tZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVPcldvcmtlcjtcbiAgICB9XG4gICAgZ2V0IGNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZyYW1lT3JXb3JrZXIuY2xpZW50O1xuICAgIH1cbiAgICBnZXQgZW1pdHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2VtaXR0ZXI7XG4gICAgfVxuICAgIHNldENvbnRleHQoY29udGV4dCkge1xuICAgICAgICB0aGlzLiNjb250ZXh0Py5bZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgY29udGV4dC5vbmNlKCdkaXNwb3NlZCcsIHRoaXMuI29uQ29udGV4dERpc3Bvc2VkLmJpbmQodGhpcykpO1xuICAgICAgICBjb250ZXh0Lm9uKCdjb25zb2xlYXBpY2FsbGVkJywgdGhpcy4jb25Db250ZXh0Q29uc29sZUFwaUNhbGxlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgY29udGV4dC5vbignYmluZGluZ2NhbGxlZCcsIHRoaXMuI29uQ29udGV4dEJpbmRpbmdDYWxsZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuI2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLiNlbWl0dGVyLmVtaXQoJ2NvbnRleHQnLCBjb250ZXh0KTtcbiAgICAgICAgdm9pZCB0aGlzLnRhc2tNYW5hZ2VyLnJlcnVuQWxsKCk7XG4gICAgfVxuICAgICNvbkNvbnRleHREaXNwb3NlZCgpIHtcbiAgICAgICAgdGhpcy4jY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCdjbGVhckRvY3VtZW50SGFuZGxlJyBpbiB0aGlzLiNmcmFtZU9yV29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU9yV29ya2VyLmNsZWFyRG9jdW1lbnRIYW5kbGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjb25Db250ZXh0Q29uc29sZUFwaUNhbGxlZChldmVudCkge1xuICAgICAgICB0aGlzLiNlbWl0dGVyLmVtaXQoJ2NvbnNvbGVhcGljYWxsZWQnLCBldmVudCk7XG4gICAgfVxuICAgICNvbkNvbnRleHRCaW5kaW5nQ2FsbGVkKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuI2VtaXR0ZXIuZW1pdCgnYmluZGluZ2NhbGxlZCcsIGV2ZW50KTtcbiAgICB9XG4gICAgaGFzQ29udGV4dCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy4jY29udGV4dDtcbiAgICB9XG4gICAgZ2V0IGNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb250ZXh0O1xuICAgIH1cbiAgICAjZXhlY3V0aW9uQ29udGV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhlY3V0aW9uIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBkZXRhY2hlZCBmcmFtZSBvciB3b3JrZXIgXCIke3RoaXMuZW52aXJvbm1lbnQudXJsKCl9XCIgKGFyZSB5b3UgdHJ5aW5nIHRvIGV2YWx1YXRlPylgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jY29udGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgZm9yIHRoZSBuZXh0IGNvbnRleHQgdG8gYmUgc2V0IG9uIHRoZSBpc29sYXRlZCB3b3JsZC5cbiAgICAgKi9cbiAgICBhc3luYyAjd2FpdEZvckV4ZWN1dGlvbkNvbnRleHQoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGZyb21FbWl0dGVyRXZlbnQodGhpcy4jZW1pdHRlciwgJ2NvbnRleHQnKS5waXBlKHJhY2VXaXRoKGZyb21FbWl0dGVyRXZlbnQodGhpcy4jZW1pdHRlciwgJ2Rpc3Bvc2VkJykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIG1lc3NhZ2UgaGFzIHRvIG1hdGNoIHRoZSBDRFAgbWVzc2FnZSBleHBlY3RlZCBieSB0aGUgV2FpdFRhc2sgY2xhc3MuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4ZWN1dGlvbiBjb250ZXh0IHdhcyBkZXN0cm95ZWQnKTtcbiAgICAgICAgfSkpLCB0aW1lb3V0KHRoaXMudGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSkpKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIGV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgLy8gVGhpcyBjb2RlIG5lZWRzIHRvIHNjaGVkdWxlIGV2YWx1YXRlSGFuZGxlIGNhbGwgc3luY2hyb25pb3VzbHkgKGF0XG4gICAgICAgIC8vIGxlYXN0IHdoZW4gdGhlIGNvbnRleHQgaXMgdGhlcmUpIHNvIHdlIGNhbm5vdCB1bmNvbmRpdGlvbmFsbHlcbiAgICAgICAgLy8gYXdhaXQuXG4gICAgICAgIGxldCBjb250ZXh0ID0gdGhpcy4jZXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSBhd2FpdCB0aGlzLiN3YWl0Rm9yRXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgfVxuICAgIGFzeW5jIGV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgLy8gVGhpcyBjb2RlIG5lZWRzIHRvIHNjaGVkdWxlIGV2YWx1YXRlIGNhbGwgc3luY2hyb25pb3VzbHkgKGF0XG4gICAgICAgIC8vIGxlYXN0IHdoZW4gdGhlIGNvbnRleHQgaXMgdGhlcmUpIHNvIHdlIGNhbm5vdCB1bmNvbmRpdGlvbmFsbHlcbiAgICAgICAgLy8gYXdhaXQuXG4gICAgICAgIGxldCBjb250ZXh0ID0gdGhpcy4jZXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSBhd2FpdCB0aGlzLiN3YWl0Rm9yRXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBjb250ZXh0LmV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgfVxuICAgIGFzeW5jIGFkb3B0QmFja2VuZE5vZGUoYmFja2VuZE5vZGVJZCkge1xuICAgICAgICAvLyBUaGlzIGNvZGUgbmVlZHMgdG8gc2NoZWR1bGUgcmVzb2x2ZU5vZGUgY2FsbCBzeW5jaHJvbmlvdXNseSAoYXRcbiAgICAgICAgLy8gbGVhc3Qgd2hlbiB0aGUgY29udGV4dCBpcyB0aGVyZSkgc28gd2UgY2Fubm90IHVuY29uZGl0aW9uYWxseVxuICAgICAgICAvLyBhd2FpdC5cbiAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLiNleGVjdXRpb25Db250ZXh0KCk7XG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgICAgY29udGV4dCA9IGF3YWl0IHRoaXMuI3dhaXRGb3JFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBvYmplY3QgfSA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoJ0RPTS5yZXNvbHZlTm9kZScsIHtcbiAgICAgICAgICAgIGJhY2tlbmROb2RlSWQ6IGJhY2tlbmROb2RlSWQsXG4gICAgICAgICAgICBleGVjdXRpb25Db250ZXh0SWQ6IGNvbnRleHQuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDZHBIYW5kbGUob2JqZWN0KTtcbiAgICB9XG4gICAgYXN5bmMgYWRvcHRIYW5kbGUoaGFuZGxlKSB7XG4gICAgICAgIGlmIChoYW5kbGUucmVhbG0gPT09IHRoaXMpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb250ZXh0IGhhcyBhbHJlYWR5IGFkb3B0ZWQgdGhpcyBoYW5kbGUsIGNsb25lIGl0IHNvIGRvd25zdHJlYW1cbiAgICAgICAgICAgIC8vIGRpc3Bvc2FsIGRvZXNuJ3QgYmVjb21lIGFuIGlzc3VlLlxuICAgICAgICAgICAgcmV0dXJuIChhd2FpdCBoYW5kbGUuZXZhbHVhdGVIYW5kbGUodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub2RlSW5mbyA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoJ0RPTS5kZXNjcmliZU5vZGUnLCB7XG4gICAgICAgICAgICBvYmplY3RJZDogaGFuZGxlLmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmFkb3B0QmFja2VuZE5vZGUobm9kZUluZm8ubm9kZS5iYWNrZW5kTm9kZUlkKSk7XG4gICAgfVxuICAgIGFzeW5jIHRyYW5zZmVySGFuZGxlKGhhbmRsZSkge1xuICAgICAgICBpZiAoaGFuZGxlLnJlYWxtID09PSB0aGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEltcGxpZXMgaXQncyBhIHByaW1pdGl2ZSB2YWx1ZSwgcHJvYmFibHkuXG4gICAgICAgIGlmIChoYW5kbGUucmVtb3RlT2JqZWN0KCkub2JqZWN0SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnRE9NLmRlc2NyaWJlTm9kZScsIHtcbiAgICAgICAgICAgIG9iamVjdElkOiBoYW5kbGUucmVtb3RlT2JqZWN0KCkub2JqZWN0SWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBuZXdIYW5kbGUgPSAoYXdhaXQgdGhpcy5hZG9wdEJhY2tlbmROb2RlKGluZm8ubm9kZS5iYWNrZW5kTm9kZUlkKSk7XG4gICAgICAgIGF3YWl0IGhhbmRsZS5kaXNwb3NlKCk7XG4gICAgICAgIHJldHVybiBuZXdIYW5kbGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNyZWF0ZUNkcEhhbmRsZShyZW1vdGVPYmplY3QpIHtcbiAgICAgICAgaWYgKHJlbW90ZU9iamVjdC5zdWJ0eXBlID09PSAnbm9kZScpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2RwRWxlbWVudEhhbmRsZSh0aGlzLCByZW1vdGVPYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2RwSlNIYW5kbGUodGhpcywgcmVtb3RlT2JqZWN0KTtcbiAgICB9XG4gICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICB0aGlzLiNjb250ZXh0Py5bZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgdGhpcy4jZW1pdHRlci5lbWl0KCdkaXNwb3NlZCcsIHVuZGVmaW5lZCk7XG4gICAgICAgIHN1cGVyW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIHRoaXMuI2VtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SXNvbGF0ZWRXb3JsZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBBIHVuaXF1ZSBrZXkgZm9yIHtAbGluayBJc29sYXRlZFdvcmxkQ2hhcnR9IHRvIGRlbm90ZSB0aGUgZGVmYXVsdCB3b3JsZC5cbiAqIEV4ZWN1dGlvbiBjb250ZXh0cyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGluIHRoZSBkZWZhdWx0IHdvcmxkLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTUFJTl9XT1JMRCA9IFN5bWJvbCgnbWFpbldvcmxkJyk7XG4vKipcbiAqIEEgdW5pcXVlIGtleSBmb3Ige0BsaW5rIElzb2xhdGVkV29ybGRDaGFydH0gdG8gZGVub3RlIHRoZSBwdXBwZXRlZXIgd29ybGQuXG4gKiBUaGlzIHdvcmxkIGNvbnRhaW5zIGFsbCBwdXBwZXRlZXItaW50ZXJuYWwgYmluZGluZ3MvY29kZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFBVUFBFVEVFUl9XT1JMRCA9IFN5bWJvbCgncHVwcGV0ZWVyV29ybGQnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlzb2xhdGVkV29ybGRzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBKU0hhbmRsZSB9IGZyb20gJy4uL2FwaS9KU0hhbmRsZS5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgdmFsdWVGcm9tUmVtb3RlT2JqZWN0IH0gZnJvbSAnLi91dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwSlNIYW5kbGUgZXh0ZW5kcyBKU0hhbmRsZSB7XG4gICAgI2Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgI3JlbW90ZU9iamVjdDtcbiAgICAjd29ybGQ7XG4gICAgY29uc3RydWN0b3Iod29ybGQsIHJlbW90ZU9iamVjdCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiN3b3JsZCA9IHdvcmxkO1xuICAgICAgICB0aGlzLiNyZW1vdGVPYmplY3QgPSByZW1vdGVPYmplY3Q7XG4gICAgfVxuICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VkO1xuICAgIH1cbiAgICBnZXQgcmVhbG0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3b3JsZDtcbiAgICB9XG4gICAgZ2V0IGNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhbG0uZW52aXJvbm1lbnQuY2xpZW50O1xuICAgIH1cbiAgICBhc3luYyBqc29uVmFsdWUoKSB7XG4gICAgICAgIGlmICghdGhpcy4jcmVtb3RlT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVGcm9tUmVtb3RlT2JqZWN0KHRoaXMuI3JlbW90ZU9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKG9iamVjdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHNlcmlhbGl6ZSByZWZlcmVuY2VkIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGBudWxsYCBvciB0aGUgaGFuZGxlIGl0c2VsZiBpZiB0aGUgaGFuZGxlIGlzIGFuXG4gICAgICogaW5zdGFuY2Ugb2Yge0BsaW5rIEVsZW1lbnRIYW5kbGV9LlxuICAgICAqL1xuICAgIGFzRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGFzeW5jIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgcmVsZWFzZU9iamVjdCh0aGlzLmNsaWVudCwgdGhpcy4jcmVtb3RlT2JqZWN0KTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmICghdGhpcy4jcmVtb3RlT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0pTSGFuZGxlOicgKyB2YWx1ZUZyb21SZW1vdGVPYmplY3QodGhpcy4jcmVtb3RlT2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy4jcmVtb3RlT2JqZWN0LnN1YnR5cGUgfHwgdGhpcy4jcmVtb3RlT2JqZWN0LnR5cGU7XG4gICAgICAgIHJldHVybiAnSlNIYW5kbGVAJyArIHR5cGU7XG4gICAgfVxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3JlbW90ZU9iamVjdC5vYmplY3RJZDtcbiAgICB9XG4gICAgcmVtb3RlT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmVtb3RlT2JqZWN0O1xuICAgIH1cbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKCkge1xuICAgICAgICAvLyBXZSB1c2UgUnVudGltZS5nZXRQcm9wZXJ0aWVzIHJhdGhlciB0aGFuIGl0ZXJhdGl2ZSB2ZXJzaW9uIGZvclxuICAgICAgICAvLyBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhcyBpdCBhbGxvd3MgZ2V0dGluZyBldmVyeXRoaW5nIGF0IG9uY2UuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnUnVudGltZS5nZXRQcm9wZXJ0aWVzJywge1xuICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuI3JlbW90ZU9iamVjdC5vYmplY3RJZCxcbiAgICAgICAgICAgIG93blByb3BlcnRpZXM6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcmVzcG9uc2UucmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5LmVudW1lcmFibGUgfHwgIXByb3BlcnR5LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQuc2V0KHByb3BlcnR5Lm5hbWUsIHRoaXMuI3dvcmxkLmNyZWF0ZUNkcEhhbmRsZShwcm9wZXJ0eS52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VPYmplY3QoY2xpZW50LCByZW1vdGVPYmplY3QpIHtcbiAgICBpZiAoIXJlbW90ZU9iamVjdC5vYmplY3RJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGNsaWVudFxuICAgICAgICAuc2VuZCgnUnVudGltZS5yZWxlYXNlT2JqZWN0JywgeyBvYmplY3RJZDogcmVtb3RlT2JqZWN0Lm9iamVjdElkIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIC8vIEV4Y2VwdGlvbnMgbWlnaHQgaGFwcGVuIGluIGNhc2Ugb2YgYSBwYWdlIGJlZW4gbmF2aWdhdGVkIG9yIGNsb3NlZC5cbiAgICAgICAgLy8gU3dhbGxvdyB0aGVzZSBzaW5jZSB0aGV5IGFyZSBoYXJtbGVzcyBhbmQgd2UgZG9uJ3QgbGVhayBhbnl0aGluZyBpbiB0aGlzIGNhc2UuXG4gICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SlNIYW5kbGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IEZyYW1lRXZlbnQgfSBmcm9tICcuLi9hcGkvRnJhbWUuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlckV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL05ldHdvcmtNYW5hZ2VyRXZlbnRzLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi4vdXRpbC9EZWZlcnJlZC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2sgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgRnJhbWVNYW5hZ2VyRXZlbnQgfSBmcm9tICcuL0ZyYW1lTWFuYWdlckV2ZW50cy5qcyc7XG5jb25zdCBwdXBwZXRlZXJUb1Byb3RvY29sTGlmZWN5Y2xlID0gbmV3IE1hcChbXG4gICAgWydsb2FkJywgJ2xvYWQnXSxcbiAgICBbJ2RvbWNvbnRlbnRsb2FkZWQnLCAnRE9NQ29udGVudExvYWRlZCddLFxuICAgIFsnbmV0d29ya2lkbGUwJywgJ25ldHdvcmtJZGxlJ10sXG4gICAgWyduZXR3b3JraWRsZTInLCAnbmV0d29ya0FsbW9zdElkbGUnXSxcbl0pO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIExpZmVjeWNsZVdhdGNoZXIge1xuICAgICNleHBlY3RlZExpZmVjeWNsZTtcbiAgICAjZnJhbWU7XG4gICAgI3RpbWVvdXQ7XG4gICAgI25hdmlnYXRpb25SZXF1ZXN0ID0gbnVsbDtcbiAgICAjc3Vic2NyaXB0aW9ucyA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTtcbiAgICAjaW5pdGlhbExvYWRlcklkO1xuICAgICN0ZXJtaW5hdGlvbkRlZmVycmVkO1xuICAgICNzYW1lRG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAjbGlmZWN5Y2xlRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAjbmV3RG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAjaGFzU2FtZURvY3VtZW50TmF2aWdhdGlvbjtcbiAgICAjc3dhcHBlZDtcbiAgICAjbmF2aWdhdGlvblJlc3BvbnNlUmVjZWl2ZWQ7XG4gICAgY29uc3RydWN0b3IobmV0d29ya01hbmFnZXIsIGZyYW1lLCB3YWl0VW50aWwsIHRpbWVvdXQpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2FpdFVudGlsKSkge1xuICAgICAgICAgICAgd2FpdFVudGlsID0gd2FpdFVudGlsLnNsaWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHdhaXRVbnRpbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHdhaXRVbnRpbCA9IFt3YWl0VW50aWxdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2luaXRpYWxMb2FkZXJJZCA9IGZyYW1lLl9sb2FkZXJJZDtcbiAgICAgICAgdGhpcy4jZXhwZWN0ZWRMaWZlY3ljbGUgPSB3YWl0VW50aWwubWFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3RvY29sRXZlbnQgPSBwdXBwZXRlZXJUb1Byb3RvY29sTGlmZWN5Y2xlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBhc3NlcnQocHJvdG9jb2xFdmVudCwgJ1Vua25vd24gdmFsdWUgZm9yIG9wdGlvbnMud2FpdFVudGlsOiAnICsgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sRXZlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNmcmFtZSA9IGZyYW1lO1xuICAgICAgICB0aGlzLiN0aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgY29uc3QgZnJhbWVNYW5hZ2VyRW1pdHRlciA9IHRoaXMuI3N1YnNjcmlwdGlvbnMudXNlKG5ldyBFdmVudEVtaXR0ZXIoZnJhbWUuX2ZyYW1lTWFuYWdlcikpO1xuICAgICAgICBmcmFtZU1hbmFnZXJFbWl0dGVyLm9uKEZyYW1lTWFuYWdlckV2ZW50LkxpZmVjeWNsZUV2ZW50LCB0aGlzLiNjaGVja0xpZmVjeWNsZUNvbXBsZXRlLmJpbmQodGhpcykpO1xuICAgICAgICBjb25zdCBmcmFtZUVtaXR0ZXIgPSB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRFbWl0dGVyKGZyYW1lKSk7XG4gICAgICAgIGZyYW1lRW1pdHRlci5vbihGcmFtZUV2ZW50LkZyYW1lTmF2aWdhdGVkV2l0aGluRG9jdW1lbnQsIHRoaXMuI25hdmlnYXRlZFdpdGhpbkRvY3VtZW50LmJpbmQodGhpcykpO1xuICAgICAgICBmcmFtZUVtaXR0ZXIub24oRnJhbWVFdmVudC5GcmFtZU5hdmlnYXRlZCwgdGhpcy4jbmF2aWdhdGVkLmJpbmQodGhpcykpO1xuICAgICAgICBmcmFtZUVtaXR0ZXIub24oRnJhbWVFdmVudC5GcmFtZVN3YXBwZWQsIHRoaXMuI2ZyYW1lU3dhcHBlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgZnJhbWVFbWl0dGVyLm9uKEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkQnlBY3RpdmF0aW9uLCB0aGlzLiNmcmFtZVN3YXBwZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIGZyYW1lRW1pdHRlci5vbihGcmFtZUV2ZW50LkZyYW1lRGV0YWNoZWQsIHRoaXMuI29uRnJhbWVEZXRhY2hlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgY29uc3QgbmV0d29ya01hbmFnZXJFbWl0dGVyID0gdGhpcy4jc3Vic2NyaXB0aW9ucy51c2UobmV3IEV2ZW50RW1pdHRlcihuZXR3b3JrTWFuYWdlcikpO1xuICAgICAgICBuZXR3b3JrTWFuYWdlckVtaXR0ZXIub24oTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0LCB0aGlzLiNvblJlcXVlc3QuYmluZCh0aGlzKSk7XG4gICAgICAgIG5ldHdvcmtNYW5hZ2VyRW1pdHRlci5vbihOZXR3b3JrTWFuYWdlckV2ZW50LlJlc3BvbnNlLCB0aGlzLiNvblJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgICAgICBuZXR3b3JrTWFuYWdlckVtaXR0ZXIub24oTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmFpbGVkLCB0aGlzLiNvblJlcXVlc3RGYWlsZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuI3Rlcm1pbmF0aW9uRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoe1xuICAgICAgICAgICAgdGltZW91dDogdGhpcy4jdGltZW91dCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBOYXZpZ2F0aW9uIHRpbWVvdXQgb2YgJHt0aGlzLiN0aW1lb3V0fSBtcyBleGNlZWRlZGAsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNjaGVja0xpZmVjeWNsZUNvbXBsZXRlKCk7XG4gICAgfVxuICAgICNvblJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5mcmFtZSgpICE9PSB0aGlzLiNmcmFtZSB8fCAhcmVxdWVzdC5pc05hdmlnYXRpb25SZXF1ZXN0KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNuYXZpZ2F0aW9uUmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICAgIC8vIFJlc29sdmUgcHJldmlvdXMgbmF2aWdhdGlvbiByZXNwb25zZSBpbiBjYXNlIHRoZXJlIGFyZSBtdWx0aXBsZVxuICAgICAgICAvLyBuYXZpZ2F0aW9uIHJlcXVlc3RzIHJlcG9ydGVkIGJ5IHRoZSBiYWNrZW5kLiBUaGlzIGdlbmVyYWxseSBzaG91bGQgbm90XG4gICAgICAgIC8vIGhhcHBlbiBieSBpdCBsb29rcyBsaWtlIGl0J3MgcG9zc2libGUuXG4gICAgICAgIHRoaXMuI25hdmlnYXRpb25SZXNwb25zZVJlY2VpdmVkPy5yZXNvbHZlKCk7XG4gICAgICAgIHRoaXMuI25hdmlnYXRpb25SZXNwb25zZVJlY2VpdmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgICAgIGlmIChyZXF1ZXN0LnJlc3BvbnNlKCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuI25hdmlnYXRpb25SZXNwb25zZVJlY2VpdmVkPy5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uUmVxdWVzdEZhaWxlZChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICh0aGlzLiNuYXZpZ2F0aW9uUmVxdWVzdD8uaWQgIT09IHJlcXVlc3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNuYXZpZ2F0aW9uUmVzcG9uc2VSZWNlaXZlZD8ucmVzb2x2ZSgpO1xuICAgIH1cbiAgICAjb25SZXNwb25zZShyZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy4jbmF2aWdhdGlvblJlcXVlc3Q/LmlkICE9PSByZXNwb25zZS5yZXF1ZXN0KCkuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNuYXZpZ2F0aW9uUmVzcG9uc2VSZWNlaXZlZD8ucmVzb2x2ZSgpO1xuICAgIH1cbiAgICAjb25GcmFtZURldGFjaGVkKGZyYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLiNmcmFtZSA9PT0gZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuI3Rlcm1pbmF0aW9uRGVmZXJyZWQucmVzb2x2ZShuZXcgRXJyb3IoJ05hdmlnYXRpbmcgZnJhbWUgd2FzIGRldGFjaGVkJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2NoZWNrTGlmZWN5Y2xlQ29tcGxldGUoKTtcbiAgICB9XG4gICAgYXN5bmMgbmF2aWdhdGlvblJlc3BvbnNlKCkge1xuICAgICAgICAvLyBDb250aW51ZSB3aXRoIGEgcG9zc2libHkgbnVsbCByZXNwb25zZS5cbiAgICAgICAgYXdhaXQgdGhpcy4jbmF2aWdhdGlvblJlc3BvbnNlUmVjZWl2ZWQ/LnZhbHVlT3JUaHJvdygpO1xuICAgICAgICByZXR1cm4gdGhpcy4jbmF2aWdhdGlvblJlcXVlc3QgPyB0aGlzLiNuYXZpZ2F0aW9uUmVxdWVzdC5yZXNwb25zZSgpIDogbnVsbDtcbiAgICB9XG4gICAgc2FtZURvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzYW1lRG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQudmFsdWVPclRocm93KCk7XG4gICAgfVxuICAgIG5ld0RvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNuZXdEb2N1bWVudE5hdmlnYXRpb25EZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgbGlmZWN5Y2xlUHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xpZmVjeWNsZURlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgIH1cbiAgICB0ZXJtaW5hdGlvblByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0ZXJtaW5hdGlvbkRlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgIH1cbiAgICAjbmF2aWdhdGVkV2l0aGluRG9jdW1lbnQoKSB7XG4gICAgICAgIHRoaXMuI2hhc1NhbWVEb2N1bWVudE5hdmlnYXRpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLiNjaGVja0xpZmVjeWNsZUNvbXBsZXRlKCk7XG4gICAgfVxuICAgICNuYXZpZ2F0ZWQobmF2aWdhdGlvblR5cGUpIHtcbiAgICAgICAgaWYgKG5hdmlnYXRpb25UeXBlID09PSAnQmFja0ZvcndhcmRDYWNoZVJlc3RvcmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVTd2FwcGVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2hlY2tMaWZlY3ljbGVDb21wbGV0ZSgpO1xuICAgIH1cbiAgICAjZnJhbWVTd2FwcGVkKCkge1xuICAgICAgICB0aGlzLiNzd2FwcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jY2hlY2tMaWZlY3ljbGVDb21wbGV0ZSgpO1xuICAgIH1cbiAgICAjY2hlY2tMaWZlY3ljbGVDb21wbGV0ZSgpIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IG5hdmlnYXRpb24gdG8gY29tbWl0LlxuICAgICAgICBpZiAoIWNoZWNrTGlmZWN5Y2xlKHRoaXMuI2ZyYW1lLCB0aGlzLiNleHBlY3RlZExpZmVjeWNsZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNsaWZlY3ljbGVEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgIGlmICh0aGlzLiNoYXNTYW1lRG9jdW1lbnROYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLiNzYW1lRG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzd2FwcGVkIHx8IHRoaXMuI2ZyYW1lLl9sb2FkZXJJZCAhPT0gdGhpcy4jaW5pdGlhbExvYWRlcklkKSB7XG4gICAgICAgICAgICB0aGlzLiNuZXdEb2N1bWVudE5hdmlnYXRpb25EZWZlcnJlZC5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tMaWZlY3ljbGUoZnJhbWUsIGV4cGVjdGVkTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV4cGVjdGVkTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmcmFtZS5fbGlmZWN5Y2xlRXZlbnRzLmhhcyhldmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE8oIzEpOiBJdHMgcG9zc2libGUgd2UgZG9uJ3QgbmVlZCB0aGlzIGNoZWNrXG4gICAgICAgICAgICAvLyBDRFAgcHJvdmlkZWQgdGhlIGNvcnJlY3Qgb3JkZXIgZm9yIExvYWRpbmcgRXZlbnRzXG4gICAgICAgICAgICAvLyBBbmQgTmV0d29ya0lkbGUgaXMgYSBnbG9iYWwgc3RhdGVcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIHJlbW92aW5nXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZyYW1lLmNoaWxkRnJhbWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuX2hhc1N0YXJ0ZWRMb2FkaW5nICYmXG4gICAgICAgICAgICAgICAgICAgICFjaGVja0xpZmVjeWNsZShjaGlsZCwgZXhwZWN0ZWRMaWZlY3ljbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy4jdGVybWluYXRpb25EZWZlcnJlZC5yZXNvbHZlKG5ldyBFcnJvcignTGlmZWN5Y2xlV2F0Y2hlciBkaXNwb3NlZCcpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaWZlY3ljbGVXYXRjaGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEhlbHBlciBjbGFzcyB0byB0cmFjayBuZXR3b3JrIGV2ZW50cyBieSByZXF1ZXN0IElEXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXR3b3JrRXZlbnRNYW5hZ2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBvcmRlcnMgb2YgZXZlbnRzOlxuICAgICAqIEEuIGBfb25SZXF1ZXN0V2lsbEJlU2VudGBcbiAgICAgKiBCLiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGBcbiAgICAgKiBDLiBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0V2lsbEJlU2VudGBcbiAgICAgKiBELiBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0V2lsbEJlU2VudGAsIGBfb25SZXF1ZXN0UGF1c2VkYCxcbiAgICAgKiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0UGF1c2VkYFxuICAgICAqIChzZWUgY3JidWcuY29tLzExOTYwMDQpXG4gICAgICpcbiAgICAgKiBGb3IgYF9vblJlcXVlc3RgIHdlIG5lZWQgdGhlIGV2ZW50IGZyb20gYF9vblJlcXVlc3RXaWxsQmVTZW50YCBhbmRcbiAgICAgKiBvcHRpb25hbGx5IHRoZSBgaW50ZXJjZXB0aW9uSWRgIGZyb20gYF9vblJlcXVlc3RQYXVzZWRgLlxuICAgICAqXG4gICAgICogSWYgcmVxdWVzdCBpbnRlcmNlcHRpb24gaXMgZGlzYWJsZWQsIGNhbGwgYF9vblJlcXVlc3RgIG9uY2UgcGVyIGNhbGwgdG9cbiAgICAgKiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLlxuICAgICAqIElmIHJlcXVlc3QgaW50ZXJjZXB0aW9uIGlzIGVuYWJsZWQsIGNhbGwgYF9vblJlcXVlc3RgIG9uY2UgcGVyIGNhbGwgdG9cbiAgICAgKiBgX29uUmVxdWVzdFBhdXNlZGAgKG9uY2UgcGVyIGBpbnRlcmNlcHRpb25JZGApLlxuICAgICAqXG4gICAgICogRXZlbnRzIGFyZSBzdG9yZWQgdG8gYWxsb3cgZm9yIHN1YnNlcXVlbnQgZXZlbnRzIHRvIGNhbGwgYF9vblJlcXVlc3RgLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IChjaGFpbnMgb2YpIHJlZGlyZWN0IHJlcXVlc3RzIGhhdmUgdGhlIHNhbWUgYHJlcXVlc3RJZGAgKCEpIGFzXG4gICAgICogdGhlIG9yaWdpbmFsIHJlcXVlc3QuIFdlIGhhdmUgdG8gYW50aWNpcGF0ZSBzZXJpZXMgb2YgZXZlbnRzIGxpa2UgdGhlc2U6XG4gICAgICogQS4gYF9vblJlcXVlc3RXaWxsQmVTZW50YCxcbiAgICAgKiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCAuLi5cbiAgICAgKiBCLiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsXG4gICAgICogYF9vblJlcXVlc3RXaWxsQmVTZW50YCwgYF9vblJlcXVlc3RQYXVzZWRgLCAuLi5cbiAgICAgKiBDLiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsXG4gICAgICogYF9vblJlcXVlc3RQYXVzZWRgLCBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCAuLi5cbiAgICAgKiBELiBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0V2lsbEJlU2VudGAsXG4gICAgICogYF9vblJlcXVlc3RQYXVzZWRgLCBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsXG4gICAgICogYF9vblJlcXVlc3RXaWxsQmVTZW50YCwgYF9vblJlcXVlc3RQYXVzZWRgLCBgX29uUmVxdWVzdFBhdXNlZGAsIC4uLlxuICAgICAqIChzZWUgY3JidWcuY29tLzExOTYwMDQpXG4gICAgICovXG4gICAgI3JlcXVlc3RXaWxsQmVTZW50TWFwID0gbmV3IE1hcCgpO1xuICAgICNyZXF1ZXN0UGF1c2VkTWFwID0gbmV3IE1hcCgpO1xuICAgICNodHRwUmVxdWVzdHNNYXAgPSBuZXcgTWFwKCk7XG4gICAgLypcbiAgICAgKiBUaGUgYmVsb3cgbWFwcyBhcmUgdXNlZCB0byByZWNvbmNpbGUgTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvXG4gICAgICogZXZlbnRzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyByZXF1ZXN0LiBFYWNoIHJlc3BvbnNlIGFuZCByZWRpcmVjdFxuICAgICAqIHJlc3BvbnNlIGdldHMgYW4gRXh0cmFJbmZvIGV2ZW50LCBhbmQgd2UgZG9uJ3Qga25vdyB3aGljaCB3aWxsIGNvbWUgZmlyc3QuXG4gICAgICogVGhpcyBtZWFucyB0aGF0IHdlIGhhdmUgdG8gc3RvcmUgYSBSZXNwb25zZSBvciBhbiBFeHRyYUluZm8gZm9yIGVhY2hcbiAgICAgKiByZXNwb25zZSwgYW5kIGVtaXQgdGhlIGV2ZW50IHdoZW4gd2UgZ2V0IGJvdGggb2YgdGhlbS4gSW4gYWRkaXRpb24sIHRvXG4gICAgICogaGFuZGxlIHJlZGlyZWN0cywgd2UgaGF2ZSB0byBtYWtlIHRoZW0gQXJyYXlzIHRvIHJlcHJlc2VudCB0aGUgY2hhaW4gb2ZcbiAgICAgKiBldmVudHMuXG4gICAgICovXG4gICAgI3Jlc3BvbnNlUmVjZWl2ZWRFeHRyYUluZm9NYXAgPSBuZXcgTWFwKCk7XG4gICAgI3F1ZXVlZFJlZGlyZWN0SW5mb01hcCA9IG5ldyBNYXAoKTtcbiAgICAjcXVldWVkRXZlbnRHcm91cE1hcCA9IG5ldyBNYXAoKTtcbiAgICBmb3JnZXQobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0V2lsbEJlU2VudE1hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgICAgIHRoaXMuI3JlcXVlc3RQYXVzZWRNYXAuZGVsZXRlKG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgICAgICB0aGlzLiNxdWV1ZWRFdmVudEdyb3VwTWFwLmRlbGV0ZShuZXR3b3JrUmVxdWVzdElkKTtcbiAgICAgICAgdGhpcy4jcXVldWVkUmVkaXJlY3RJbmZvTWFwLmRlbGV0ZShuZXR3b3JrUmVxdWVzdElkKTtcbiAgICAgICAgdGhpcy4jcmVzcG9uc2VSZWNlaXZlZEV4dHJhSW5mb01hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHJlc3BvbnNlRXh0cmFJbmZvKG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNyZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvTWFwLmhhcyhuZXR3b3JrUmVxdWVzdElkKSkge1xuICAgICAgICAgICAgdGhpcy4jcmVzcG9uc2VSZWNlaXZlZEV4dHJhSW5mb01hcC5zZXQobmV0d29ya1JlcXVlc3RJZCwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvTWFwLmdldChuZXR3b3JrUmVxdWVzdElkKTtcbiAgICB9XG4gICAgcXVldWVkUmVkaXJlY3RJbmZvKGZldGNoUmVxdWVzdElkKSB7XG4gICAgICAgIGlmICghdGhpcy4jcXVldWVkUmVkaXJlY3RJbmZvTWFwLmhhcyhmZXRjaFJlcXVlc3RJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuI3F1ZXVlZFJlZGlyZWN0SW5mb01hcC5zZXQoZmV0Y2hSZXF1ZXN0SWQsIFtdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jcXVldWVkUmVkaXJlY3RJbmZvTWFwLmdldChmZXRjaFJlcXVlc3RJZCk7XG4gICAgfVxuICAgIHF1ZXVlUmVkaXJlY3RJbmZvKGZldGNoUmVxdWVzdElkLCByZWRpcmVjdEluZm8pIHtcbiAgICAgICAgdGhpcy5xdWV1ZWRSZWRpcmVjdEluZm8oZmV0Y2hSZXF1ZXN0SWQpLnB1c2gocmVkaXJlY3RJbmZvKTtcbiAgICB9XG4gICAgdGFrZVF1ZXVlZFJlZGlyZWN0SW5mbyhmZXRjaFJlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZWRSZWRpcmVjdEluZm8oZmV0Y2hSZXF1ZXN0SWQpLnNoaWZ0KCk7XG4gICAgfVxuICAgIGluRmxpZ2h0UmVxdWVzdHNDb3VudCgpIHtcbiAgICAgICAgbGV0IGluRmxpZ2h0UmVxdWVzdENvdW50ZXIgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgdGhpcy4jaHR0cFJlcXVlc3RzTWFwLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoIXJlcXVlc3QucmVzcG9uc2UoKSkge1xuICAgICAgICAgICAgICAgIGluRmxpZ2h0UmVxdWVzdENvdW50ZXIrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5GbGlnaHRSZXF1ZXN0Q291bnRlcjtcbiAgICB9XG4gICAgc3RvcmVSZXF1ZXN0V2lsbEJlU2VudChuZXR3b3JrUmVxdWVzdElkLCBldmVudCkge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0V2lsbEJlU2VudE1hcC5zZXQobmV0d29ya1JlcXVlc3RJZCwgZXZlbnQpO1xuICAgIH1cbiAgICBnZXRSZXF1ZXN0V2lsbEJlU2VudChuZXR3b3JrUmVxdWVzdElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0V2lsbEJlU2VudE1hcC5nZXQobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIGZvcmdldFJlcXVlc3RXaWxsQmVTZW50KG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhpcy4jcmVxdWVzdFdpbGxCZVNlbnRNYXAuZGVsZXRlKG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgIH1cbiAgICBnZXRSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3JlcXVlc3RQYXVzZWRNYXAuZ2V0KG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgIH1cbiAgICBmb3JnZXRSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhpcy4jcmVxdWVzdFBhdXNlZE1hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHN0b3JlUmVxdWVzdFBhdXNlZChuZXR3b3JrUmVxdWVzdElkLCBldmVudCkge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0UGF1c2VkTWFwLnNldChuZXR3b3JrUmVxdWVzdElkLCBldmVudCk7XG4gICAgfVxuICAgIGdldFJlcXVlc3QobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaHR0cFJlcXVlc3RzTWFwLmdldChuZXR3b3JrUmVxdWVzdElkKTtcbiAgICB9XG4gICAgc3RvcmVSZXF1ZXN0KG5ldHdvcmtSZXF1ZXN0SWQsIHJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy4jaHR0cFJlcXVlc3RzTWFwLnNldChuZXR3b3JrUmVxdWVzdElkLCByZXF1ZXN0KTtcbiAgICB9XG4gICAgZm9yZ2V0UmVxdWVzdChuZXR3b3JrUmVxdWVzdElkKSB7XG4gICAgICAgIHRoaXMuI2h0dHBSZXF1ZXN0c01hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIGdldFF1ZXVlZEV2ZW50R3JvdXAobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcXVldWVkRXZlbnRHcm91cE1hcC5nZXQobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHF1ZXVlRXZlbnRHcm91cChuZXR3b3JrUmVxdWVzdElkLCBldmVudCkge1xuICAgICAgICB0aGlzLiNxdWV1ZWRFdmVudEdyb3VwTWFwLnNldChuZXR3b3JrUmVxdWVzdElkLCBldmVudCk7XG4gICAgfVxuICAgIGZvcmdldFF1ZXVlZEV2ZW50R3JvdXAobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICB0aGlzLiNxdWV1ZWRFdmVudEdyb3VwTWFwLmRlbGV0ZShuZXR3b3JrUmVxdWVzdElkKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OZXR3b3JrRXZlbnRNYW5hZ2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyRXZlbnQsIH0gZnJvbSAnLi4vY29tbW9uL05ldHdvcmtNYW5hZ2VyRXZlbnRzLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIGlzU3RyaW5nIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IENkcEhUVFBSZXF1ZXN0IH0gZnJvbSAnLi9IVFRQUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBDZHBIVFRQUmVzcG9uc2UgfSBmcm9tICcuL0hUVFBSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBOZXR3b3JrRXZlbnRNYW5hZ2VyLCB9IGZyb20gJy4vTmV0d29ya0V2ZW50TWFuYWdlci5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTmV0d29ya01hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNmcmFtZU1hbmFnZXI7XG4gICAgI25ldHdvcmtFdmVudE1hbmFnZXIgPSBuZXcgTmV0d29ya0V2ZW50TWFuYWdlcigpO1xuICAgICNleHRyYUhUVFBIZWFkZXJzO1xuICAgICNjcmVkZW50aWFscyA9IG51bGw7XG4gICAgI2F0dGVtcHRlZEF1dGhlbnRpY2F0aW9ucyA9IG5ldyBTZXQoKTtcbiAgICAjdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICAjdXNlckNhY2hlRGlzYWJsZWQ7XG4gICAgI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnM7XG4gICAgI3VzZXJBZ2VudDtcbiAgICAjdXNlckFnZW50TWV0YWRhdGE7XG4gICAgI2hhbmRsZXJzID0gW1xuICAgICAgICBbJ0ZldGNoLnJlcXVlc3RQYXVzZWQnLCB0aGlzLiNvblJlcXVlc3RQYXVzZWRdLFxuICAgICAgICBbJ0ZldGNoLmF1dGhSZXF1aXJlZCcsIHRoaXMuI29uQXV0aFJlcXVpcmVkXSxcbiAgICAgICAgWydOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50JywgdGhpcy4jb25SZXF1ZXN0V2lsbEJlU2VudF0sXG4gICAgICAgIFsnTmV0d29yay5yZXF1ZXN0U2VydmVkRnJvbUNhY2hlJywgdGhpcy4jb25SZXF1ZXN0U2VydmVkRnJvbUNhY2hlXSxcbiAgICAgICAgWydOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQnLCB0aGlzLiNvblJlc3BvbnNlUmVjZWl2ZWRdLFxuICAgICAgICBbJ05ldHdvcmsubG9hZGluZ0ZpbmlzaGVkJywgdGhpcy4jb25Mb2FkaW5nRmluaXNoZWRdLFxuICAgICAgICBbJ05ldHdvcmsubG9hZGluZ0ZhaWxlZCcsIHRoaXMuI29uTG9hZGluZ0ZhaWxlZF0sXG4gICAgICAgIFsnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvJywgdGhpcy4jb25SZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvXSxcbiAgICAgICAgW0NEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsIHRoaXMuI3JlbW92ZUNsaWVudF0sXG4gICAgXTtcbiAgICAjY2xpZW50cyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihmcmFtZU1hbmFnZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jZnJhbWVNYW5hZ2VyID0gZnJhbWVNYW5hZ2VyO1xuICAgIH1cbiAgICBhc3luYyBhZGRDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIGlmICh0aGlzLiNjbGllbnRzLmhhcyhjbGllbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTtcbiAgICAgICAgdGhpcy4jY2xpZW50cy5zZXQoY2xpZW50LCBzdWJzY3JpcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2xpZW50RW1pdHRlciA9IHN1YnNjcmlwdGlvbnMudXNlKG5ldyBFdmVudEVtaXR0ZXIoY2xpZW50KSk7XG4gICAgICAgIGZvciAoY29uc3QgW2V2ZW50LCBoYW5kbGVyXSBvZiB0aGlzLiNoYW5kbGVycykge1xuICAgICAgICAgICAgY2xpZW50RW1pdHRlci5vbihldmVudCwgKGFyZykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLmJpbmQodGhpcykoY2xpZW50LCBhcmcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgY2xpZW50LnNlbmQoJ05ldHdvcmsuZW5hYmxlJyksXG4gICAgICAgICAgICB0aGlzLiNhcHBseUV4dHJhSFRUUEhlYWRlcnMoY2xpZW50KSxcbiAgICAgICAgICAgIHRoaXMuI2FwcGx5TmV0d29ya0NvbmRpdGlvbnMoY2xpZW50KSxcbiAgICAgICAgICAgIHRoaXMuI2FwcGx5UHJvdG9jb2xDYWNoZURpc2FibGVkKGNsaWVudCksXG4gICAgICAgICAgICB0aGlzLiNhcHBseVByb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbihjbGllbnQpLFxuICAgICAgICAgICAgdGhpcy4jYXBwbHlVc2VyQWdlbnQoY2xpZW50KSxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGFzeW5jICNyZW1vdmVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudHMuZ2V0KGNsaWVudCk/LmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy4jY2xpZW50cy5kZWxldGUoY2xpZW50KTtcbiAgICB9XG4gICAgYXN5bmMgYXV0aGVudGljYXRlKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHRoaXMuI2NyZWRlbnRpYWxzID0gY3JlZGVudGlhbHM7XG4gICAgICAgIGNvbnN0IGVuYWJsZWQgPSB0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgfHwgISF0aGlzLiNjcmVkZW50aWFscztcbiAgICAgICAgaWYgKGVuYWJsZWQgPT09IHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNwcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXBwbHlUb0FsbENsaWVudHModGhpcy4jYXBwbHlQcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb24uYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jIHNldEV4dHJhSFRUUEhlYWRlcnMoaGVhZGVycykge1xuICAgICAgICBjb25zdCBleHRyYUhUVFBIZWFkZXJzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgICBhc3NlcnQoaXNTdHJpbmcodmFsdWUpLCBgRXhwZWN0ZWQgdmFsdWUgb2YgaGVhZGVyIFwiJHtrZXl9XCIgdG8gYmUgU3RyaW5nLCBidXQgXCIke3R5cGVvZiB2YWx1ZX1cIiBpcyBmb3VuZC5gKTtcbiAgICAgICAgICAgIGV4dHJhSFRUUEhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZXh0cmFIVFRQSGVhZGVycyA9IGV4dHJhSFRUUEhlYWRlcnM7XG4gICAgICAgIGF3YWl0IHRoaXMuI2FwcGx5VG9BbGxDbGllbnRzKHRoaXMuI2FwcGx5RXh0cmFIVFRQSGVhZGVycy5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgYXN5bmMgI2FwcGx5RXh0cmFIVFRQSGVhZGVycyhjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2V4dHJhSFRUUEhlYWRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdOZXR3b3JrLnNldEV4dHJhSFRUUEhlYWRlcnMnLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLiNleHRyYUhUVFBIZWFkZXJzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZXh0cmFIVFRQSGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuI2V4dHJhSFRUUEhlYWRlcnMpO1xuICAgIH1cbiAgICBpbkZsaWdodFJlcXVlc3RzQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmluRmxpZ2h0UmVxdWVzdHNDb3VudCgpO1xuICAgIH1cbiAgICBhc3luYyBzZXRPZmZsaW5lTW9kZSh2YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgb2ZmbGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdXBsb2FkOiAtMSxcbiAgICAgICAgICAgICAgICBkb3dubG9hZDogLTEsXG4gICAgICAgICAgICAgICAgbGF0ZW5jeTogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZW11bGF0ZWROZXR3b3JrQ29uZGl0aW9ucy5vZmZsaW5lID0gdmFsdWU7XG4gICAgICAgIGF3YWl0IHRoaXMuI2FwcGx5VG9BbGxDbGllbnRzKHRoaXMuI2FwcGx5TmV0d29ya0NvbmRpdGlvbnMuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jIGVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyhuZXR3b3JrQ29uZGl0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgb2ZmbGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdXBsb2FkOiAtMSxcbiAgICAgICAgICAgICAgICBkb3dubG9hZDogLTEsXG4gICAgICAgICAgICAgICAgbGF0ZW5jeTogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZW11bGF0ZWROZXR3b3JrQ29uZGl0aW9ucy51cGxvYWQgPSBuZXR3b3JrQ29uZGl0aW9uc1xuICAgICAgICAgICAgPyBuZXR3b3JrQ29uZGl0aW9ucy51cGxvYWRcbiAgICAgICAgICAgIDogLTE7XG4gICAgICAgIHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMuZG93bmxvYWQgPSBuZXR3b3JrQ29uZGl0aW9uc1xuICAgICAgICAgICAgPyBuZXR3b3JrQ29uZGl0aW9ucy5kb3dubG9hZFxuICAgICAgICAgICAgOiAtMTtcbiAgICAgICAgdGhpcy4jZW11bGF0ZWROZXR3b3JrQ29uZGl0aW9ucy5sYXRlbmN5ID0gbmV0d29ya0NvbmRpdGlvbnNcbiAgICAgICAgICAgID8gbmV0d29ya0NvbmRpdGlvbnMubGF0ZW5jeVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBhd2FpdCB0aGlzLiNhcHBseVRvQWxsQ2xpZW50cyh0aGlzLiNhcHBseU5ldHdvcmtDb25kaXRpb25zLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBhc3luYyAjYXBwbHlUb0FsbENsaWVudHMoZm4pIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh0aGlzLiNjbGllbnRzLmtleXMoKSkubWFwKGNsaWVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZm4oY2xpZW50KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBhc3luYyAjYXBwbHlOZXR3b3JrQ29uZGl0aW9ucyhjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdOZXR3b3JrLmVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucycsIHtcbiAgICAgICAgICAgIG9mZmxpbmU6IHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMub2ZmbGluZSxcbiAgICAgICAgICAgIGxhdGVuY3k6IHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMubGF0ZW5jeSxcbiAgICAgICAgICAgIHVwbG9hZFRocm91Z2hwdXQ6IHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMudXBsb2FkLFxuICAgICAgICAgICAgZG93bmxvYWRUaHJvdWdocHV0OiB0aGlzLiNlbXVsYXRlZE5ldHdvcmtDb25kaXRpb25zLmRvd25sb2FkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2V0VXNlckFnZW50KHVzZXJBZ2VudCwgdXNlckFnZW50TWV0YWRhdGEpIHtcbiAgICAgICAgdGhpcy4jdXNlckFnZW50ID0gdXNlckFnZW50O1xuICAgICAgICB0aGlzLiN1c2VyQWdlbnRNZXRhZGF0YSA9IHVzZXJBZ2VudE1ldGFkYXRhO1xuICAgICAgICBhd2FpdCB0aGlzLiNhcHBseVRvQWxsQ2xpZW50cyh0aGlzLiNhcHBseVVzZXJBZ2VudC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgYXN5bmMgI2FwcGx5VXNlckFnZW50KGNsaWVudCkge1xuICAgICAgICBpZiAodGhpcy4jdXNlckFnZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnTmV0d29yay5zZXRVc2VyQWdlbnRPdmVycmlkZScsIHtcbiAgICAgICAgICAgIHVzZXJBZ2VudDogdGhpcy4jdXNlckFnZW50LFxuICAgICAgICAgICAgdXNlckFnZW50TWV0YWRhdGE6IHRoaXMuI3VzZXJBZ2VudE1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2V0Q2FjaGVFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy4jdXNlckNhY2hlRGlzYWJsZWQgPSAhZW5hYmxlZDtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXBwbHlUb0FsbENsaWVudHModGhpcy4jYXBwbHlQcm90b2NvbENhY2hlRGlzYWJsZWQuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jIHNldFJlcXVlc3RJbnRlcmNlcHRpb24odmFsdWUpIHtcbiAgICAgICAgdGhpcy4jdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IGVuYWJsZWQgPSB0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgfHwgISF0aGlzLiNjcmVkZW50aWFscztcbiAgICAgICAgaWYgKGVuYWJsZWQgPT09IHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNwcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXBwbHlUb0FsbENsaWVudHModGhpcy4jYXBwbHlQcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb24uYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jICNhcHBseVByb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbihjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI3VzZXJDYWNoZURpc2FibGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuI3VzZXJDYWNoZURpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLiNhcHBseVByb3RvY29sQ2FjaGVEaXNhYmxlZChjbGllbnQpLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdGZXRjaC5lbmFibGUnLCB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZUF1dGhSZXF1ZXN0czogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybnM6IFt7IHVybFBhdHRlcm46ICcqJyB9XSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2FwcGx5UHJvdG9jb2xDYWNoZURpc2FibGVkKGNsaWVudCksXG4gICAgICAgICAgICAgICAgY2xpZW50LnNlbmQoJ0ZldGNoLmRpc2FibGUnKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jICNhcHBseVByb3RvY29sQ2FjaGVEaXNhYmxlZChjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI3VzZXJDYWNoZURpc2FibGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnTmV0d29yay5zZXRDYWNoZURpc2FibGVkJywge1xuICAgICAgICAgICAgY2FjaGVEaXNhYmxlZDogdGhpcy4jdXNlckNhY2hlRGlzYWJsZWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAjb25SZXF1ZXN0V2lsbEJlU2VudChjbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIFJlcXVlc3QgaW50ZXJjZXB0aW9uIGRvZXNuJ3QgaGFwcGVuIGZvciBkYXRhIFVSTHMgd2l0aCBOZXR3b3JrIFNlcnZpY2UuXG4gICAgICAgIGlmICh0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgJiZcbiAgICAgICAgICAgICFldmVudC5yZXF1ZXN0LnVybC5zdGFydHNXaXRoKCdkYXRhOicpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHJlcXVlc3RJZDogbmV0d29ya1JlcXVlc3RJZCB9ID0gZXZlbnQ7XG4gICAgICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLnN0b3JlUmVxdWVzdFdpbGxCZVNlbnQobmV0d29ya1JlcXVlc3RJZCwgZXZlbnQpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDRFAgbWF5IGhhdmUgc2VudCBhIEZldGNoLnJlcXVlc3RQYXVzZWQgZXZlbnQgYWxyZWFkeS4gQ2hlY2sgZm9yIGl0LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0UGF1c2VkRXZlbnQgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFJlcXVlc3RQYXVzZWQobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdFBhdXNlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyByZXF1ZXN0SWQ6IGZldGNoUmVxdWVzdElkIH0gPSByZXF1ZXN0UGF1c2VkRXZlbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy4jcGF0Y2hSZXF1ZXN0RXZlbnRIZWFkZXJzKGV2ZW50LCByZXF1ZXN0UGF1c2VkRXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuI29uUmVxdWVzdChjbGllbnQsIGV2ZW50LCBmZXRjaFJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5mb3JnZXRSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI29uUmVxdWVzdChjbGllbnQsIGV2ZW50LCB1bmRlZmluZWQpO1xuICAgIH1cbiAgICAjb25BdXRoUmVxdWlyZWQoY2xpZW50LCBldmVudCkge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSAnRGVmYXVsdCc7XG4gICAgICAgIGlmICh0aGlzLiNhdHRlbXB0ZWRBdXRoZW50aWNhdGlvbnMuaGFzKGV2ZW50LnJlcXVlc3RJZCkpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gJ0NhbmNlbEF1dGgnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI2NyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICByZXNwb25zZSA9ICdQcm92aWRlQ3JlZGVudGlhbHMnO1xuICAgICAgICAgICAgdGhpcy4jYXR0ZW1wdGVkQXV0aGVudGljYXRpb25zLmFkZChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0gPSB0aGlzLiNjcmVkZW50aWFscyB8fCB7XG4gICAgICAgICAgICB1c2VybmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgY2xpZW50XG4gICAgICAgICAgICAuc2VuZCgnRmV0Y2guY29udGludWVXaXRoQXV0aCcsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZDogZXZlbnQucmVxdWVzdElkLFxuICAgICAgICAgICAgYXV0aENoYWxsZW5nZVJlc3BvbnNlOiB7IHJlc3BvbnNlLCB1c2VybmFtZSwgcGFzc3dvcmQgfSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ0RQIG1heSBzZW5kIGEgRmV0Y2gucmVxdWVzdFBhdXNlZCB3aXRob3V0IG9yIGJlZm9yZSBhXG4gICAgICogTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudFxuICAgICAqXG4gICAgICogQ0RQIG1heSBzZW5kIG11bHRpcGxlIEZldGNoLnJlcXVlc3RQYXVzZWRcbiAgICAgKiBmb3IgdGhlIHNhbWUgTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudC5cbiAgICAgKi9cbiAgICAjb25SZXF1ZXN0UGF1c2VkKGNsaWVudCwgZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgJiZcbiAgICAgICAgICAgIHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGNsaWVudFxuICAgICAgICAgICAgICAgIC5zZW5kKCdGZXRjaC5jb250aW51ZVJlcXVlc3QnLCB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdElkOiBldmVudC5yZXF1ZXN0SWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG5ldHdvcmtJZDogbmV0d29ya1JlcXVlc3RJZCwgcmVxdWVzdElkOiBmZXRjaFJlcXVlc3RJZCB9ID0gZXZlbnQ7XG4gICAgICAgIGlmICghbmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICAgICAgdGhpcy4jb25SZXF1ZXN0V2l0aG91dE5ldHdvcmtJbnN0cnVtZW50YXRpb24oY2xpZW50LCBldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdFdpbGxCZVNlbnRFdmVudCA9ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0V2lsbEJlU2VudEV2ZW50ID0gdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5nZXRSZXF1ZXN0V2lsbEJlU2VudChuZXR3b3JrUmVxdWVzdElkKTtcbiAgICAgICAgICAgIC8vIHJlZGlyZWN0IHJlcXVlc3RzIGhhdmUgdGhlIHNhbWUgYHJlcXVlc3RJZGAsXG4gICAgICAgICAgICBpZiAocmVxdWVzdFdpbGxCZVNlbnRFdmVudCAmJlxuICAgICAgICAgICAgICAgIChyZXF1ZXN0V2lsbEJlU2VudEV2ZW50LnJlcXVlc3QudXJsICE9PSBldmVudC5yZXF1ZXN0LnVybCB8fFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0V2lsbEJlU2VudEV2ZW50LnJlcXVlc3QubWV0aG9kICE9PSBldmVudC5yZXF1ZXN0Lm1ldGhvZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmZvcmdldFJlcXVlc3RXaWxsQmVTZW50KG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0V2lsbEJlU2VudEV2ZW50O1xuICAgICAgICB9KSgpO1xuICAgICAgICBpZiAocmVxdWVzdFdpbGxCZVNlbnRFdmVudCkge1xuICAgICAgICAgICAgdGhpcy4jcGF0Y2hSZXF1ZXN0RXZlbnRIZWFkZXJzKHJlcXVlc3RXaWxsQmVTZW50RXZlbnQsIGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMuI29uUmVxdWVzdChjbGllbnQsIHJlcXVlc3RXaWxsQmVTZW50RXZlbnQsIGZldGNoUmVxdWVzdElkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuc3RvcmVSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjcGF0Y2hSZXF1ZXN0RXZlbnRIZWFkZXJzKHJlcXVlc3RXaWxsQmVTZW50RXZlbnQsIHJlcXVlc3RQYXVzZWRFdmVudCkge1xuICAgICAgICByZXF1ZXN0V2lsbEJlU2VudEV2ZW50LnJlcXVlc3QuaGVhZGVycyA9IHtcbiAgICAgICAgICAgIC4uLnJlcXVlc3RXaWxsQmVTZW50RXZlbnQucmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgICAgLy8gaW5jbHVkZXMgZXh0cmEgaGVhZGVycywgbGlrZTogQWNjZXB0LCBPcmlnaW5cbiAgICAgICAgICAgIC4uLnJlcXVlc3RQYXVzZWRFdmVudC5yZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgIH07XG4gICAgfVxuICAgICNvblJlcXVlc3RXaXRob3V0TmV0d29ya0luc3RydW1lbnRhdGlvbihjbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIElmIGFuIGV2ZW50IGhhcyBubyBuZXR3b3JrSWQgaXQgc2hvdWxkIG5vdCBoYXZlIGFueSBuZXR3b3JrIGV2ZW50cy4gV2VcbiAgICAgICAgLy8gc3RpbGwgd2FudCB0byBkaXNwYXRjaCBpdCBmb3IgdGhlIGludGVyY2VwdGlvbiBieSB0aGUgdXNlci5cbiAgICAgICAgY29uc3QgZnJhbWUgPSBldmVudC5mcmFtZUlkXG4gICAgICAgICAgICA/IHRoaXMuI2ZyYW1lTWFuYWdlci5mcmFtZShldmVudC5mcmFtZUlkKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IENkcEhUVFBSZXF1ZXN0KGNsaWVudCwgZnJhbWUsIGV2ZW50LnJlcXVlc3RJZCwgdGhpcy4jdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkLCBldmVudCwgW10pO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0LCByZXF1ZXN0KTtcbiAgICAgICAgdm9pZCByZXF1ZXN0LmZpbmFsaXplSW50ZXJjZXB0aW9ucygpO1xuICAgIH1cbiAgICAjb25SZXF1ZXN0KGNsaWVudCwgZXZlbnQsIGZldGNoUmVxdWVzdElkKSB7XG4gICAgICAgIGxldCByZWRpcmVjdENoYWluID0gW107XG4gICAgICAgIGlmIChldmVudC5yZWRpcmVjdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAvLyBXZSB3YW50IHRvIGVtaXQgYSByZXNwb25zZSBhbmQgcmVxdWVzdGZpbmlzaGVkIGZvciB0aGVcbiAgICAgICAgICAgIC8vIHJlZGlyZWN0UmVzcG9uc2UsIGJ1dCB3ZSBjYW4ndCBkbyBzbyB1bmxlc3Mgd2UgaGF2ZSBhXG4gICAgICAgICAgICAvLyByZXNwb25zZUV4dHJhSW5mbyByZWFkeSB0byBwYWlyIGl0IHVwIHdpdGguIElmIHdlIGRvbid0IGhhdmUgYW55XG4gICAgICAgICAgICAvLyByZXNwb25zZUV4dHJhSW5mb3Mgc2F2ZWQgaW4gb3VyIHF1ZXVlLCB0aGV5IHdlIGhhdmUgdG8gd2FpdCB1bnRpbFxuICAgICAgICAgICAgLy8gdGhlIG5leHQgb25lIHRvIGVtaXQgcmVzcG9uc2UgYW5kIHJlcXVlc3RmaW5pc2hlZCwgKmFuZCogd2Ugc2hvdWxkXG4gICAgICAgICAgICAvLyBhbHNvIHdhaXQgdG8gZW1pdCB0aGlzIFJlcXVlc3QgdG9vIGJlY2F1c2UgaXQgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAvLyByZXNwb25zZS9yZXF1ZXN0ZmluaXNoZWQuXG4gICAgICAgICAgICBsZXQgcmVkaXJlY3RSZXNwb25zZUV4dHJhSW5mbyA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZXZlbnQucmVkaXJlY3RIYXNFeHRyYUluZm8pIHtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFJlc3BvbnNlRXh0cmFJbmZvID0gdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAucmVzcG9uc2VFeHRyYUluZm8oZXZlbnQucmVxdWVzdElkKVxuICAgICAgICAgICAgICAgICAgICAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0UmVzcG9uc2VFeHRyYUluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5xdWV1ZVJlZGlyZWN0SW5mbyhldmVudC5yZXF1ZXN0SWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hSZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICAgICAgLy8gSWYgd2UgY29ubmVjdCBsYXRlIHRvIHRoZSB0YXJnZXQsIHdlIGNvdWxkIGhhdmUgbWlzc2VkIHRoZVxuICAgICAgICAgICAgLy8gcmVxdWVzdFdpbGxCZVNlbnQgZXZlbnQuXG4gICAgICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2hhbmRsZVJlcXVlc3RSZWRpcmVjdChjbGllbnQsIHJlcXVlc3QsIGV2ZW50LnJlZGlyZWN0UmVzcG9uc2UsIHJlZGlyZWN0UmVzcG9uc2VFeHRyYUluZm8pO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0Q2hhaW4gPSByZXF1ZXN0Ll9yZWRpcmVjdENoYWluO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZyYW1lID0gZXZlbnQuZnJhbWVJZFxuICAgICAgICAgICAgPyB0aGlzLiNmcmFtZU1hbmFnZXIuZnJhbWUoZXZlbnQuZnJhbWVJZClcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBDZHBIVFRQUmVxdWVzdChjbGllbnQsIGZyYW1lLCBmZXRjaFJlcXVlc3RJZCwgdGhpcy4jdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkLCBldmVudCwgcmVkaXJlY3RDaGFpbik7XG4gICAgICAgIHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuc3RvcmVSZXF1ZXN0KGV2ZW50LnJlcXVlc3RJZCwgcmVxdWVzdCk7XG4gICAgICAgIHRoaXMuZW1pdChOZXR3b3JrTWFuYWdlckV2ZW50LlJlcXVlc3QsIHJlcXVlc3QpO1xuICAgICAgICB2b2lkIHJlcXVlc3QuZmluYWxpemVJbnRlcmNlcHRpb25zKCk7XG4gICAgfVxuICAgICNvblJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUoX2NsaWVudCwgZXZlbnQpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmVxdWVzdC5fZnJvbU1lbW9yeUNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0U2VydmVkRnJvbUNhY2hlLCByZXF1ZXN0KTtcbiAgICB9XG4gICAgI2hhbmRsZVJlcXVlc3RSZWRpcmVjdChjbGllbnQsIHJlcXVlc3QsIHJlc3BvbnNlUGF5bG9hZCwgZXh0cmFJbmZvKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IENkcEhUVFBSZXNwb25zZShjbGllbnQsIHJlcXVlc3QsIHJlc3BvbnNlUGF5bG9hZCwgZXh0cmFJbmZvKTtcbiAgICAgICAgcmVxdWVzdC5fcmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgcmVxdWVzdC5fcmVkaXJlY3RDaGFpbi5wdXNoKHJlcXVlc3QpO1xuICAgICAgICByZXNwb25zZS5fcmVzb2x2ZUJvZHkobmV3IEVycm9yKCdSZXNwb25zZSBib2R5IGlzIHVuYXZhaWxhYmxlIGZvciByZWRpcmVjdCByZXNwb25zZXMnKSk7XG4gICAgICAgIHRoaXMuI2ZvcmdldFJlcXVlc3QocmVxdWVzdCwgZmFsc2UpO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmluaXNoZWQsIHJlcXVlc3QpO1xuICAgIH1cbiAgICAjZW1pdFJlc3BvbnNlRXZlbnQoY2xpZW50LCByZXNwb25zZVJlY2VpdmVkLCBleHRyYUluZm8pIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChyZXNwb25zZVJlY2VpdmVkLnJlcXVlc3RJZCk7XG4gICAgICAgIC8vIEZpbGVVcGxvYWQgc2VuZHMgYSByZXNwb25zZSB3aXRob3V0IGEgbWF0Y2hpbmcgcmVxdWVzdC5cbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXh0cmFJbmZvcyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIucmVzcG9uc2VFeHRyYUluZm8ocmVzcG9uc2VSZWNlaXZlZC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAoZXh0cmFJbmZvcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRlYnVnRXJyb3IobmV3IEVycm9yKCdVbmV4cGVjdGVkIGV4dHJhSW5mbyBldmVudHMgZm9yIHJlcXVlc3QgJyArXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VSZWNlaXZlZC5yZXF1ZXN0SWQpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaHJvbWl1bSBzZW5kcyB3cm9uZyBleHRyYUluZm8gZXZlbnRzIGZvciByZXNwb25zZXMgc2VydmVkIGZyb20gY2FjaGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHVwcGV0ZWVyL3B1cHBldGVlci9pc3N1ZXMvOTk2NSBhbmRcbiAgICAgICAgLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vMTM0MDM5OC5cbiAgICAgICAgaWYgKHJlc3BvbnNlUmVjZWl2ZWQucmVzcG9uc2UuZnJvbURpc2tDYWNoZSkge1xuICAgICAgICAgICAgZXh0cmFJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IG5ldyBDZHBIVFRQUmVzcG9uc2UoY2xpZW50LCByZXF1ZXN0LCByZXNwb25zZVJlY2VpdmVkLnJlc3BvbnNlLCBleHRyYUluZm8pO1xuICAgICAgICByZXF1ZXN0Ll9yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgIH1cbiAgICAjb25SZXNwb25zZVJlY2VpdmVkKGNsaWVudCwgZXZlbnQpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBsZXQgZXh0cmFJbmZvID0gbnVsbDtcbiAgICAgICAgaWYgKHJlcXVlc3QgJiYgIXJlcXVlc3QuX2Zyb21NZW1vcnlDYWNoZSAmJiBldmVudC5oYXNFeHRyYUluZm8pIHtcbiAgICAgICAgICAgIGV4dHJhSW5mbyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXJcbiAgICAgICAgICAgICAgICAucmVzcG9uc2VFeHRyYUluZm8oZXZlbnQucmVxdWVzdElkKVxuICAgICAgICAgICAgICAgIC5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKCFleHRyYUluZm8pIHtcbiAgICAgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHdlIGdldCB0aGUgY29ycmVzcG9uZGluZyBFeHRyYUluZm8gZXZlbnQuXG4gICAgICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5xdWV1ZUV2ZW50R3JvdXAoZXZlbnQucmVxdWVzdElkLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUmVjZWl2ZWRFdmVudDogZXZlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2VtaXRSZXNwb25zZUV2ZW50KGNsaWVudCwgZXZlbnQsIGV4dHJhSW5mbyk7XG4gICAgfVxuICAgICNvblJlc3BvbnNlUmVjZWl2ZWRFeHRyYUluZm8oY2xpZW50LCBldmVudCkge1xuICAgICAgICAvLyBXZSBtYXkgaGF2ZSBza2lwcGVkIGEgcmVkaXJlY3QgcmVzcG9uc2UvcmVxdWVzdCBwYWlyIGR1ZSB0byB3YWl0aW5nIGZvclxuICAgICAgICAvLyB0aGlzIEV4dHJhSW5mbyBldmVudC4gSWYgc28sIGNvbnRpbnVlIHRoYXQgd29yayBub3cgdGhhdCB3ZSBoYXZlIHRoZVxuICAgICAgICAvLyByZXF1ZXN0LlxuICAgICAgICBjb25zdCByZWRpcmVjdEluZm8gPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLnRha2VRdWV1ZWRSZWRpcmVjdEluZm8oZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgaWYgKHJlZGlyZWN0SW5mbykge1xuICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5yZXNwb25zZUV4dHJhSW5mbyhldmVudC5yZXF1ZXN0SWQpLnB1c2goZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy4jb25SZXF1ZXN0KGNsaWVudCwgcmVkaXJlY3RJbmZvLmV2ZW50LCByZWRpcmVjdEluZm8uZmV0Y2hSZXF1ZXN0SWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIG1heSBoYXZlIHNraXBwZWQgcmVzcG9uc2UgYW5kIGxvYWRpbmcgZXZlbnRzIGJlY2F1c2Ugd2UgZGlkbid0IGhhdmVcbiAgICAgICAgLy8gdGhpcyBFeHRyYUluZm8gZXZlbnQgeWV0LiBJZiBzbywgZW1pdCB0aG9zZSBldmVudHMgbm93LlxuICAgICAgICBjb25zdCBxdWV1ZWRFdmVudHMgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFF1ZXVlZEV2ZW50R3JvdXAoZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgaWYgKHF1ZXVlZEV2ZW50cykge1xuICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5mb3JnZXRRdWV1ZWRFdmVudEdyb3VwKGV2ZW50LnJlcXVlc3RJZCk7XG4gICAgICAgICAgICB0aGlzLiNlbWl0UmVzcG9uc2VFdmVudChjbGllbnQsIHF1ZXVlZEV2ZW50cy5yZXNwb25zZVJlY2VpdmVkRXZlbnQsIGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChxdWV1ZWRFdmVudHMubG9hZGluZ0ZpbmlzaGVkRXZlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNlbWl0TG9hZGluZ0ZpbmlzaGVkKHF1ZXVlZEV2ZW50cy5sb2FkaW5nRmluaXNoZWRFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocXVldWVkRXZlbnRzLmxvYWRpbmdGYWlsZWRFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXRMb2FkaW5nRmFpbGVkKHF1ZXVlZEV2ZW50cy5sb2FkaW5nRmFpbGVkRXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhaXQgdW50aWwgd2UgZ2V0IGFub3RoZXIgZXZlbnQgdGhhdCBjYW4gdXNlIHRoaXMgRXh0cmFJbmZvIGV2ZW50LlxuICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLnJlc3BvbnNlRXh0cmFJbmZvKGV2ZW50LnJlcXVlc3RJZCkucHVzaChldmVudCk7XG4gICAgfVxuICAgICNmb3JnZXRSZXF1ZXN0KHJlcXVlc3QsIGV2ZW50cykge1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSByZXF1ZXN0LmlkO1xuICAgICAgICBjb25zdCBpbnRlcmNlcHRpb25JZCA9IHJlcXVlc3QuX2ludGVyY2VwdGlvbklkO1xuICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmZvcmdldFJlcXVlc3QocmVxdWVzdElkKTtcbiAgICAgICAgaW50ZXJjZXB0aW9uSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdGhpcy4jYXR0ZW1wdGVkQXV0aGVudGljYXRpb25zLmRlbGV0ZShpbnRlcmNlcHRpb25JZCk7XG4gICAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZm9yZ2V0KHJlcXVlc3RJZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uTG9hZGluZ0ZpbmlzaGVkKF9jbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBldmVudCBmb3IgdGhpcyByZXF1ZXN0IGlzIHN0aWxsIHdhaXRpbmcgb24gYVxuICAgICAgICAvLyBjb3JyZXNwb25kaW5nIEV4dHJhSW5mbyBldmVudCwgdGhlbiB3YWl0IHRvIGVtaXQgdGhpcyBldmVudCB0b28uXG4gICAgICAgIGNvbnN0IHF1ZXVlZEV2ZW50cyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UXVldWVkRXZlbnRHcm91cChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAocXVldWVkRXZlbnRzKSB7XG4gICAgICAgICAgICBxdWV1ZWRFdmVudHMubG9hZGluZ0ZpbmlzaGVkRXZlbnQgPSBldmVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2VtaXRMb2FkaW5nRmluaXNoZWQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNlbWl0TG9hZGluZ0ZpbmlzaGVkKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFJlcXVlc3QoZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgLy8gRm9yIGNlcnRhaW4gcmVxdWVzdElkcyB3ZSBuZXZlciByZWNlaXZlIHJlcXVlc3RXaWxsQmVTZW50IGV2ZW50LlxuICAgICAgICAvLyBAc2VlIGh0dHBzOi8vY3JidWcuY29tLzc1MDQ2OVxuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMgd2UgbmV2ZXIgZ2V0IHRoZSBOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWRcbiAgICAgICAgLy8gZXZlbnQgZnJvbSBwcm90b2NvbC4gQHNlZSBodHRwczovL2NyYnVnLmNvbS84ODM0NzVcbiAgICAgICAgaWYgKHJlcXVlc3QucmVzcG9uc2UoKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZSgpPy5fcmVzb2x2ZUJvZHkoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmb3JnZXRSZXF1ZXN0KHJlcXVlc3QsIHRydWUpO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmluaXNoZWQsIHJlcXVlc3QpO1xuICAgIH1cbiAgICAjb25Mb2FkaW5nRmFpbGVkKF9jbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBldmVudCBmb3IgdGhpcyByZXF1ZXN0IGlzIHN0aWxsIHdhaXRpbmcgb24gYVxuICAgICAgICAvLyBjb3JyZXNwb25kaW5nIEV4dHJhSW5mbyBldmVudCwgdGhlbiB3YWl0IHRvIGVtaXQgdGhpcyBldmVudCB0b28uXG4gICAgICAgIGNvbnN0IHF1ZXVlZEV2ZW50cyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UXVldWVkRXZlbnRHcm91cChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAocXVldWVkRXZlbnRzKSB7XG4gICAgICAgICAgICBxdWV1ZWRFdmVudHMubG9hZGluZ0ZhaWxlZEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNlbWl0TG9hZGluZ0ZhaWxlZChldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2VtaXRMb2FkaW5nRmFpbGVkKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFJlcXVlc3QoZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgLy8gRm9yIGNlcnRhaW4gcmVxdWVzdElkcyB3ZSBuZXZlciByZWNlaXZlIHJlcXVlc3RXaWxsQmVTZW50IGV2ZW50LlxuICAgICAgICAvLyBAc2VlIGh0dHBzOi8vY3JidWcuY29tLzc1MDQ2OVxuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0Ll9mYWlsdXJlVGV4dCA9IGV2ZW50LmVycm9yVGV4dDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXF1ZXN0LnJlc3BvbnNlKCk7XG4gICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgcmVzcG9uc2UuX3Jlc29sdmVCb2R5KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZm9yZ2V0UmVxdWVzdChyZXF1ZXN0LCB0cnVlKTtcbiAgICAgICAgdGhpcy5lbWl0KE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdEZhaWxlZCwgcmVxdWVzdCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmV0d29ya01hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgcmFjZVdpdGggfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMnO1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbkV2ZW50IH0gZnJvbSAnLi4vYXBpL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgUGFnZSwgfSBmcm9tICcuLi9hcGkvUGFnZS5qcyc7XG5pbXBvcnQgeyBDb25zb2xlTWVzc2FnZSwgfSBmcm9tICcuLi9jb21tb24vQ29uc29sZU1lc3NhZ2UuanMnO1xuaW1wb3J0IHsgVGFyZ2V0Q2xvc2VFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgRmlsZUNob29zZXIgfSBmcm9tICcuLi9jb21tb24vRmlsZUNob29zZXIuanMnO1xuaW1wb3J0IHsgTmV0d29ya01hbmFnZXJFdmVudCB9IGZyb20gJy4uL2NvbW1vbi9OZXR3b3JrTWFuYWdlckV2ZW50cy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yLCBldmFsdWF0aW9uU3RyaW5nLCBnZXRSZWFkYWJsZUFzQnVmZmVyLCBnZXRSZWFkYWJsZUZyb21Qcm90b2NvbFN0cmVhbSwgcGFyc2VQREZPcHRpb25zLCB0aW1lb3V0LCB2YWxpZGF0ZURpYWxvZ1R5cGUsIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IEFzeW5jRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IGlzRXJyb3JMaWtlIH0gZnJvbSAnLi4vdXRpbC9FcnJvckxpa2UuanMnO1xuaW1wb3J0IHsgQmluZGluZyB9IGZyb20gJy4vQmluZGluZy5qcyc7XG5pbXBvcnQgeyBDZHBDRFBTZXNzaW9uIH0gZnJvbSAnLi9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IGlzVGFyZ2V0Q2xvc2VkRXJyb3IgfSBmcm9tICcuL0Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHsgQ292ZXJhZ2UgfSBmcm9tICcuL0NvdmVyYWdlLmpzJztcbmltcG9ydCB7IENkcERpYWxvZyB9IGZyb20gJy4vRGlhbG9nLmpzJztcbmltcG9ydCB7IEVtdWxhdGlvbk1hbmFnZXIgfSBmcm9tICcuL0VtdWxhdGlvbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRmlyZWZveFRhcmdldE1hbmFnZXIgfSBmcm9tICcuL0ZpcmVmb3hUYXJnZXRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlciB9IGZyb20gJy4vRnJhbWVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlckV2ZW50IH0gZnJvbSAnLi9GcmFtZU1hbmFnZXJFdmVudHMuanMnO1xuaW1wb3J0IHsgQ2RwS2V5Ym9hcmQsIENkcE1vdXNlLCBDZHBUb3VjaHNjcmVlbiB9IGZyb20gJy4vSW5wdXQuanMnO1xuaW1wb3J0IHsgTUFJTl9XT1JMRCB9IGZyb20gJy4vSXNvbGF0ZWRXb3JsZHMuanMnO1xuaW1wb3J0IHsgcmVsZWFzZU9iamVjdCB9IGZyb20gJy4vSlNIYW5kbGUuanMnO1xuaW1wb3J0IHsgVHJhY2luZyB9IGZyb20gJy4vVHJhY2luZy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVDbGllbnRFcnJvciwgcGFnZUJpbmRpbmdJbml0U3RyaW5nLCB2YWx1ZUZyb21SZW1vdGVPYmplY3QsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBDZHBXZWJXb3JrZXIgfSBmcm9tICcuL1dlYldvcmtlci5qcyc7XG5mdW5jdGlvbiBjb252ZXJ0Q29uc29sZU1lc3NhZ2VMZXZlbChtZXRob2QpIHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICBjYXNlICd3YXJuaW5nJzpcbiAgICAgICAgICAgIHJldHVybiAnd2Fybic7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBQYWdlIGV4dGVuZHMgUGFnZSB7XG4gICAgc3RhdGljIGFzeW5jIF9jcmVhdGUoY2xpZW50LCB0YXJnZXQsIGRlZmF1bHRWaWV3cG9ydCkge1xuICAgICAgICBjb25zdCBwYWdlID0gbmV3IENkcFBhZ2UoY2xpZW50LCB0YXJnZXQpO1xuICAgICAgICBhd2FpdCBwYWdlLiNpbml0aWFsaXplKCk7XG4gICAgICAgIGlmIChkZWZhdWx0Vmlld3BvcnQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5zZXRWaWV3cG9ydChkZWZhdWx0Vmlld3BvcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChpc0Vycm9yTGlrZShlcnIpICYmIGlzVGFyZ2V0Q2xvc2VkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWdlO1xuICAgIH1cbiAgICAjY2xvc2VkID0gZmFsc2U7XG4gICAgI3RhcmdldE1hbmFnZXI7XG4gICAgI3ByaW1hcnlUYXJnZXRDbGllbnQ7XG4gICAgI3ByaW1hcnlUYXJnZXQ7XG4gICAgI3RhYlRhcmdldENsaWVudDtcbiAgICAjdGFiVGFyZ2V0O1xuICAgICNrZXlib2FyZDtcbiAgICAjbW91c2U7XG4gICAgI3RvdWNoc2NyZWVuO1xuICAgICNmcmFtZU1hbmFnZXI7XG4gICAgI2VtdWxhdGlvbk1hbmFnZXI7XG4gICAgI3RyYWNpbmc7XG4gICAgI2JpbmRpbmdzID0gbmV3IE1hcCgpO1xuICAgICNleHBvc2VkRnVuY3Rpb25zID0gbmV3IE1hcCgpO1xuICAgICNjb3ZlcmFnZTtcbiAgICAjdmlld3BvcnQ7XG4gICAgI3dvcmtlcnMgPSBuZXcgTWFwKCk7XG4gICAgI2ZpbGVDaG9vc2VyRGVmZXJyZWRzID0gbmV3IFNldCgpO1xuICAgICNzZXNzaW9uQ2xvc2VEZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICNzZXJ2aWNlV29ya2VyQnlwYXNzZWQgPSBmYWxzZTtcbiAgICAjdXNlckRyYWdJbnRlcmNlcHRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgI2ZyYW1lTWFuYWdlckhhbmRsZXJzID0gW1xuICAgICAgICBbXG4gICAgICAgICAgICBGcmFtZU1hbmFnZXJFdmVudC5GcmFtZUF0dGFjaGVkLFxuICAgICAgICAgICAgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZnJhbWVhdHRhY2hlZFwiIC8qIFBhZ2VFdmVudC5GcmFtZUF0dGFjaGVkICovLCBmcmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICBGcmFtZU1hbmFnZXJFdmVudC5GcmFtZURldGFjaGVkLFxuICAgICAgICAgICAgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZnJhbWVkZXRhY2hlZFwiIC8qIFBhZ2VFdmVudC5GcmFtZURldGFjaGVkICovLCBmcmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICBGcmFtZU1hbmFnZXJFdmVudC5GcmFtZU5hdmlnYXRlZCxcbiAgICAgICAgICAgIChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImZyYW1lbmF2aWdhdGVkXCIgLyogUGFnZUV2ZW50LkZyYW1lTmF2aWdhdGVkICovLCBmcmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgIF07XG4gICAgI25ldHdvcmtNYW5hZ2VySGFuZGxlcnMgPSBbXG4gICAgICAgIFtcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdCxcbiAgICAgICAgICAgIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwicmVxdWVzdFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0ICovLCByZXF1ZXN0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdFNlcnZlZEZyb21DYWNoZSxcbiAgICAgICAgICAgIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwicmVxdWVzdHNlcnZlZGZyb21jYWNoZVwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0U2VydmVkRnJvbUNhY2hlICovLCByZXF1ZXN0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVzcG9uc2UsXG4gICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJyZXNwb25zZVwiIC8qIFBhZ2VFdmVudC5SZXNwb25zZSAqLywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmFpbGVkLFxuICAgICAgICAgICAgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJyZXF1ZXN0ZmFpbGVkXCIgLyogUGFnZUV2ZW50LlJlcXVlc3RGYWlsZWQgKi8sIHJlcXVlc3QpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmluaXNoZWQsXG4gICAgICAgICAgICAocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcInJlcXVlc3RmaW5pc2hlZFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0RmluaXNoZWQgKi8sIHJlcXVlc3QpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICBdO1xuICAgICNzZXNzaW9uSGFuZGxlcnMgPSBbXG4gICAgICAgIFtcbiAgICAgICAgICAgIENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4jc2Vzc2lvbkNsb3NlRGVmZXJyZWQucmVqZWN0KG5ldyBUYXJnZXRDbG9zZUVycm9yKCdUYXJnZXQgY2xvc2VkJykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgJ1BhZ2UuZG9tQ29udGVudEV2ZW50RmlyZWQnLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoXCJkb21jb250ZW50bG9hZGVkXCIgLyogUGFnZUV2ZW50LkRPTUNvbnRlbnRMb2FkZWQgKi8sIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICAnUGFnZS5sb2FkRXZlbnRGaXJlZCcsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdChcImxvYWRcIiAvKiBQYWdlRXZlbnQuTG9hZCAqLywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIFsnUGFnZS5qYXZhc2NyaXB0RGlhbG9nT3BlbmluZycsIHRoaXMuI29uRGlhbG9nLmJpbmQodGhpcyldLFxuICAgICAgICBbJ1J1bnRpbWUuZXhjZXB0aW9uVGhyb3duJywgdGhpcy4jaGFuZGxlRXhjZXB0aW9uLmJpbmQodGhpcyldLFxuICAgICAgICBbJ0luc3BlY3Rvci50YXJnZXRDcmFzaGVkJywgdGhpcy4jb25UYXJnZXRDcmFzaGVkLmJpbmQodGhpcyldLFxuICAgICAgICBbJ1BlcmZvcm1hbmNlLm1ldHJpY3MnLCB0aGlzLiNlbWl0TWV0cmljcy5iaW5kKHRoaXMpXSxcbiAgICAgICAgWydMb2cuZW50cnlBZGRlZCcsIHRoaXMuI29uTG9nRW50cnlBZGRlZC5iaW5kKHRoaXMpXSxcbiAgICAgICAgWydQYWdlLmZpbGVDaG9vc2VyT3BlbmVkJywgdGhpcy4jb25GaWxlQ2hvb3Nlci5iaW5kKHRoaXMpXSxcbiAgICBdO1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCwgdGFyZ2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3RhYlRhcmdldENsaWVudCA9IGNsaWVudC5wYXJlbnRTZXNzaW9uKCk7XG4gICAgICAgIGFzc2VydCh0aGlzLiN0YWJUYXJnZXRDbGllbnQsICdUYWIgdGFyZ2V0IHNlc3Npb24gaXMgbm90IGRlZmluZWQuJyk7XG4gICAgICAgIHRoaXMuI3RhYlRhcmdldCA9IHRoaXMuI3RhYlRhcmdldENsaWVudC5fdGFyZ2V0KCk7XG4gICAgICAgIGFzc2VydCh0aGlzLiN0YWJUYXJnZXQsICdUYWIgdGFyZ2V0IGlzIG5vdCBkZWZpbmVkLicpO1xuICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyID0gdGFyZ2V0Ll90YXJnZXRNYW5hZ2VyKCk7XG4gICAgICAgIHRoaXMuI2tleWJvYXJkID0gbmV3IENkcEtleWJvYXJkKGNsaWVudCk7XG4gICAgICAgIHRoaXMuI21vdXNlID0gbmV3IENkcE1vdXNlKGNsaWVudCwgdGhpcy4ja2V5Ym9hcmQpO1xuICAgICAgICB0aGlzLiN0b3VjaHNjcmVlbiA9IG5ldyBDZHBUb3VjaHNjcmVlbihjbGllbnQsIHRoaXMuI2tleWJvYXJkKTtcbiAgICAgICAgdGhpcy4jZnJhbWVNYW5hZ2VyID0gbmV3IEZyYW1lTWFuYWdlcihjbGllbnQsIHRoaXMsIHRoaXMuX3RpbWVvdXRTZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIgPSBuZXcgRW11bGF0aW9uTWFuYWdlcihjbGllbnQpO1xuICAgICAgICB0aGlzLiN0cmFjaW5nID0gbmV3IFRyYWNpbmcoY2xpZW50KTtcbiAgICAgICAgdGhpcy4jY292ZXJhZ2UgPSBuZXcgQ292ZXJhZ2UoY2xpZW50KTtcbiAgICAgICAgdGhpcy4jdmlld3BvcnQgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIHRoaXMuI2ZyYW1lTWFuYWdlckhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIub24oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIub24oRnJhbWVNYW5hZ2VyRXZlbnQuQ29uc29sZUFwaUNhbGxlZCwgKFt3b3JsZCwgZXZlbnRdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNvbkNvbnNvbGVBUEkod29ybGQsIGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5vbihGcmFtZU1hbmFnZXJFdmVudC5CaW5kaW5nQ2FsbGVkLCAoW3dvcmxkLCBldmVudF0pID0+IHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25CaW5kaW5nQ2FsbGVkKHdvcmxkLCBldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIHRoaXMuI25ldHdvcmtNYW5hZ2VySGFuZGxlcnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBhbnkuXG4gICAgICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIubmV0d29ya01hbmFnZXIub24oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN0YWJUYXJnZXRDbGllbnQub24oQ0RQU2Vzc2lvbkV2ZW50LlN3YXBwZWQsIHRoaXMuI29uQWN0aXZhdGlvbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy4jdGFiVGFyZ2V0Q2xpZW50Lm9uKENEUFNlc3Npb25FdmVudC5SZWFkeSwgdGhpcy4jb25TZWNvbmRhcnlUYXJnZXQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXRHb25lXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldEdvbmUgKi8sIHRoaXMuI29uRGV0YWNoZWRGcm9tVGFyZ2V0KTtcbiAgICAgICAgdGhpcy4jdGFiVGFyZ2V0Ll9pc0Nsb3NlZERlZmVycmVkXG4gICAgICAgICAgICAudmFsdWVPclRocm93KClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub2ZmKFwidGFyZ2V0R29uZVwiIC8qIFRhcmdldE1hbmFnZXJFdmVudC5UYXJnZXRHb25lICovLCB0aGlzLiNvbkRldGFjaGVkRnJvbVRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHRoaXMuI2Nsb3NlZCA9IHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIHRoaXMuI3NldHVwUHJpbWFyeVRhcmdldExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLiNhdHRhY2hFeGlzdGluZ1RhcmdldHMoKTtcbiAgICB9XG4gICAgI2F0dGFjaEV4aXN0aW5nVGFyZ2V0cygpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZFRhcmdldCBvZiB0aGlzLiN0YXJnZXRNYW5hZ2VyLmdldENoaWxkVGFyZ2V0cyh0aGlzLiNwcmltYXJ5VGFyZ2V0KSkge1xuICAgICAgICAgICAgcXVldWUucHVzaChjaGlsZFRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlkeCA9IDA7XG4gICAgICAgIHdoaWxlIChpZHggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBxdWV1ZVtpZHhdO1xuICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gbmV4dC5fc2Vzc2lvbigpO1xuICAgICAgICAgICAgaWYgKHNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNvbkF0dGFjaGVkVG9UYXJnZXQoc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkVGFyZ2V0IG9mIHRoaXMuI3RhcmdldE1hbmFnZXIuZ2V0Q2hpbGRUYXJnZXRzKG5leHQpKSB7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaChjaGlsZFRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI29uQWN0aXZhdGlvbihuZXdTZXNzaW9uKSB7XG4gICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQgPSBuZXdTZXNzaW9uO1xuICAgICAgICBhc3NlcnQodGhpcy4jcHJpbWFyeVRhcmdldENsaWVudCBpbnN0YW5jZW9mIENkcENEUFNlc3Npb24sICdDRFBTZXNzaW9uIGlzIG5vdCBpbnN0YW5jZSBvZiBDRFBTZXNzaW9uSW1wbCcpO1xuICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0ID0gdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5fdGFyZ2V0KCk7XG4gICAgICAgIGFzc2VydCh0aGlzLiNwcmltYXJ5VGFyZ2V0LCAnTWlzc2luZyB0YXJnZXQgb24gc3dhcCcpO1xuICAgICAgICB0aGlzLiNrZXlib2FyZC51cGRhdGVDbGllbnQobmV3U2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI21vdXNlLnVwZGF0ZUNsaWVudChuZXdTZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jdG91Y2hzY3JlZW4udXBkYXRlQ2xpZW50KG5ld1Nlc3Npb24pO1xuICAgICAgICB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLnVwZGF0ZUNsaWVudChuZXdTZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jdHJhY2luZy51cGRhdGVDbGllbnQobmV3U2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI2NvdmVyYWdlLnVwZGF0ZUNsaWVudChuZXdTZXNzaW9uKTtcbiAgICAgICAgYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLnN3YXBGcmFtZVRyZWUobmV3U2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI3NldHVwUHJpbWFyeVRhcmdldExpc3RlbmVycygpO1xuICAgIH1cbiAgICBhc3luYyAjb25TZWNvbmRhcnlUYXJnZXQoc2Vzc2lvbikge1xuICAgICAgICBhc3NlcnQoc2Vzc2lvbiBpbnN0YW5jZW9mIENkcENEUFNlc3Npb24pO1xuICAgICAgICBpZiAoc2Vzc2lvbi5fdGFyZ2V0KCkuX3N1YnR5cGUoKSAhPT0gJ3ByZXJlbmRlcicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIucmVnaXN0ZXJTcGVjdWxhdGl2ZVNlc3Npb24oc2Vzc2lvbikuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIHRoaXMuI2VtdWxhdGlvbk1hbmFnZXJcbiAgICAgICAgICAgIC5yZWdpc3RlclNwZWN1bGF0aXZlU2Vzc2lvbihzZXNzaW9uKVxuICAgICAgICAgICAgLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHVwIGxpc3RlbmVycyBmb3IgdGhlIHByaW1hcnkgdGFyZ2V0LiBUaGUgcHJpbWFyeSB0YXJnZXQgY2FuIGNoYW5nZVxuICAgICAqIGR1cmluZyBhIG5hdmlnYXRpb24gdG8gYSBwcmVyZW5kZWQgcGFnZS5cbiAgICAgKi9cbiAgICAjc2V0dXBQcmltYXJ5VGFyZ2V0TGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50Lm9uKENEUFNlc3Npb25FdmVudC5SZWFkeSwgdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KTtcbiAgICAgICAgZm9yIChjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSBvZiB0aGlzLiNzZXNzaW9uSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBhbnkuXG4gICAgICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50Lm9uKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uRGV0YWNoZWRGcm9tVGFyZ2V0ID0gKHRhcmdldCkgPT4ge1xuICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSB0YXJnZXQuX3Nlc3Npb24oKT8uaWQoKTtcbiAgICAgICAgY29uc3Qgd29ya2VyID0gdGhpcy4jd29ya2Vycy5nZXQoc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCF3b3JrZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN3b3JrZXJzLmRlbGV0ZShzZXNzaW9uSWQpO1xuICAgICAgICB0aGlzLmVtaXQoXCJ3b3JrZXJkZXN0cm95ZWRcIiAvKiBQYWdlRXZlbnQuV29ya2VyRGVzdHJveWVkICovLCB3b3JrZXIpO1xuICAgIH07XG4gICAgI29uQXR0YWNoZWRUb1RhcmdldCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICAgIGFzc2VydChzZXNzaW9uIGluc3RhbmNlb2YgQ2RwQ0RQU2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5vbkF0dGFjaGVkVG9UYXJnZXQoc2Vzc2lvbi5fdGFyZ2V0KCkpO1xuICAgICAgICBpZiAoc2Vzc2lvbi5fdGFyZ2V0KCkuX2dldFRhcmdldEluZm8oKS50eXBlID09PSAnd29ya2VyJykge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gbmV3IENkcFdlYldvcmtlcihzZXNzaW9uLCBzZXNzaW9uLl90YXJnZXQoKS51cmwoKSwgc2Vzc2lvbi5fdGFyZ2V0KCkuX3RhcmdldElkLCBzZXNzaW9uLl90YXJnZXQoKS50eXBlKCksIHRoaXMuI2FkZENvbnNvbGVNZXNzYWdlLmJpbmQodGhpcyksIHRoaXMuI2hhbmRsZUV4Y2VwdGlvbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuI3dvcmtlcnMuc2V0KHNlc3Npb24uaWQoKSwgd29ya2VyKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcIndvcmtlcmNyZWF0ZWRcIiAvKiBQYWdlRXZlbnQuV29ya2VyQ3JlYXRlZCAqLywgd29ya2VyKTtcbiAgICAgICAgfVxuICAgICAgICBzZXNzaW9uLm9uKENEUFNlc3Npb25FdmVudC5SZWFkeSwgdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KTtcbiAgICB9O1xuICAgIGFzeW5jICNpbml0aWFsaXplKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5pbml0aWFsaXplKHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQpLFxuICAgICAgICAgICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnUGVyZm9ybWFuY2UuZW5hYmxlJyksXG4gICAgICAgICAgICAgICAgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdMb2cuZW5hYmxlJyksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyKSAmJiBpc1RhcmdldENsb3NlZEVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI29uRmlsZUNob29zZXIoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzLnNpemUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuI2ZyYW1lTWFuYWdlci5mcmFtZShldmVudC5mcmFtZUlkKTtcbiAgICAgICAgICAgIGFzc2VydChmcmFtZSwgJ1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4nKTtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSBhbiBIVE1MSW5wdXRFbGVtZW50IGhhbmRsZSBieSB0aGUgZXZlbnQuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMSwgKGF3YWl0IGZyYW1lLndvcmxkc1tNQUlOX1dPUkxEXS5hZG9wdEJhY2tlbmROb2RlKGV2ZW50LmJhY2tlbmROb2RlSWQpKSwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc3QgZmlsZUNob29zZXIgPSBuZXcgRmlsZUNob29zZXIoaGFuZGxlLm1vdmUoKSwgZXZlbnQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9taXNlIG9mIHRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKGZpbGVDaG9vc2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMSkge1xuICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICBlbnZfMS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9jbGllbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50O1xuICAgIH1cbiAgICBpc1NlcnZpY2VXb3JrZXJCeXBhc3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NlcnZpY2VXb3JrZXJCeXBhc3NlZDtcbiAgICB9XG4gICAgaXNEcmFnSW50ZXJjZXB0aW9uRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3VzZXJEcmFnSW50ZXJjZXB0aW9uRW5hYmxlZDtcbiAgICB9XG4gICAgaXNKYXZhU2NyaXB0RW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuamF2YXNjcmlwdEVuYWJsZWQ7XG4gICAgfVxuICAgIGFzeW5jIHdhaXRGb3JGaWxlQ2hvb3NlcihvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgbmVlZHNFbmFibGUgPSB0aGlzLiNmaWxlQ2hvb3NlckRlZmVycmVkcy5zaXplID09PSAwO1xuICAgICAgICBjb25zdCB7IHRpbWVvdXQgPSB0aGlzLl90aW1lb3V0U2V0dGluZ3MudGltZW91dCgpIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSh7XG4gICAgICAgICAgICBtZXNzYWdlOiBgV2FpdGluZyBmb3IgXFxgRmlsZUNob29zZXJcXGAgZmFpbGVkOiAke3RpbWVvdXR9bXMgZXhjZWVkZWRgLFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gICAgICAgIGxldCBlbmFibGVQcm9taXNlO1xuICAgICAgICBpZiAobmVlZHNFbmFibGUpIHtcbiAgICAgICAgICAgIGVuYWJsZVByb21pc2UgPSB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ1BhZ2Uuc2V0SW50ZXJjZXB0RmlsZUNob29zZXJEaWFsb2cnLCB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC52YWx1ZU9yVGhyb3coKSxcbiAgICAgICAgICAgICAgICBlbmFibGVQcm9taXNlLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy4jZmlsZUNob29zZXJEZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNldEdlb2xvY2F0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuc2V0R2VvbG9jYXRpb24ob3B0aW9ucyk7XG4gICAgfVxuICAgIHRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3ByaW1hcnlUYXJnZXQ7XG4gICAgfVxuICAgIGJyb3dzZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmltYXJ5VGFyZ2V0LmJyb3dzZXIoKTtcbiAgICB9XG4gICAgYnJvd3NlckNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmltYXJ5VGFyZ2V0LmJyb3dzZXJDb250ZXh0KCk7XG4gICAgfVxuICAgICNvblRhcmdldENyYXNoZWQoKSB7XG4gICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIgLyogUGFnZUV2ZW50LkVycm9yICovLCBuZXcgRXJyb3IoJ1BhZ2UgY3Jhc2hlZCEnKSk7XG4gICAgfVxuICAgICNvbkxvZ0VudHJ5QWRkZWQoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgeyBsZXZlbCwgdGV4dCwgYXJncywgc291cmNlLCB1cmwsIGxpbmVOdW1iZXIgfSA9IGV2ZW50LmVudHJ5O1xuICAgICAgICBpZiAoYXJncykge1xuICAgICAgICAgICAgYXJncy5tYXAoYXJnID0+IHtcbiAgICAgICAgICAgICAgICB2b2lkIHJlbGVhc2VPYmplY3QodGhpcy4jcHJpbWFyeVRhcmdldENsaWVudCwgYXJnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UgIT09ICd3b3JrZXInKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJjb25zb2xlXCIgLyogUGFnZUV2ZW50LkNvbnNvbGUgKi8sIG5ldyBDb25zb2xlTWVzc2FnZShjb252ZXJ0Q29uc29sZU1lc3NhZ2VMZXZlbChsZXZlbCksIHRleHQsIFtdLCBbeyB1cmwsIGxpbmVOdW1iZXIgfV0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtYWluRnJhbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmcmFtZU1hbmFnZXIubWFpbkZyYW1lKCk7XG4gICAgfVxuICAgIGdldCBrZXlib2FyZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2tleWJvYXJkO1xuICAgIH1cbiAgICBnZXQgdG91Y2hzY3JlZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0b3VjaHNjcmVlbjtcbiAgICB9XG4gICAgZ2V0IGNvdmVyYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY292ZXJhZ2U7XG4gICAgfVxuICAgIGdldCB0cmFjaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhY2luZztcbiAgICB9XG4gICAgZnJhbWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVNYW5hZ2VyLmZyYW1lcygpO1xuICAgIH1cbiAgICB3b3JrZXJzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiN3b3JrZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0UmVxdWVzdEludGVyY2VwdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLnNldFJlcXVlc3RJbnRlcmNlcHRpb24odmFsdWUpO1xuICAgIH1cbiAgICBhc3luYyBzZXRCeXBhc3NTZXJ2aWNlV29ya2VyKGJ5cGFzcykge1xuICAgICAgICB0aGlzLiNzZXJ2aWNlV29ya2VyQnlwYXNzZWQgPSBieXBhc3M7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ05ldHdvcmsuc2V0QnlwYXNzU2VydmljZVdvcmtlcicsIHsgYnlwYXNzIH0pO1xuICAgIH1cbiAgICBhc3luYyBzZXREcmFnSW50ZXJjZXB0aW9uKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy4jdXNlckRyYWdJbnRlcmNlcHRpb25FbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnSW5wdXQuc2V0SW50ZXJjZXB0RHJhZ3MnLCB7XG4gICAgICAgICAgICBlbmFibGVkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2V0T2ZmbGluZU1vZGUoZW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLnNldE9mZmxpbmVNb2RlKGVuYWJsZWQpO1xuICAgIH1cbiAgICBhc3luYyBlbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMobmV0d29ya0NvbmRpdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMobmV0d29ya0NvbmRpdGlvbnMpO1xuICAgIH1cbiAgICBzZXREZWZhdWx0TmF2aWdhdGlvblRpbWVvdXQodGltZW91dCkge1xuICAgICAgICB0aGlzLl90aW1lb3V0U2V0dGluZ3Muc2V0RGVmYXVsdE5hdmlnYXRpb25UaW1lb3V0KHRpbWVvdXQpO1xuICAgIH1cbiAgICBzZXREZWZhdWx0VGltZW91dCh0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuX3RpbWVvdXRTZXR0aW5ncy5zZXREZWZhdWx0VGltZW91dCh0aW1lb3V0KTtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdFRpbWVvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lb3V0U2V0dGluZ3MudGltZW91dCgpO1xuICAgIH1cbiAgICBhc3luYyBxdWVyeU9iamVjdHMocHJvdG90eXBlSGFuZGxlKSB7XG4gICAgICAgIGFzc2VydCghcHJvdG90eXBlSGFuZGxlLmRpc3Bvc2VkLCAnUHJvdG90eXBlIEpTSGFuZGxlIGlzIGRpc3Bvc2VkIScpO1xuICAgICAgICBhc3NlcnQocHJvdG90eXBlSGFuZGxlLmlkLCAnUHJvdG90eXBlIEpTSGFuZGxlIG11c3Qgbm90IGJlIHJlZmVyZW5jaW5nIHByaW1pdGl2ZSB2YWx1ZScpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuY2xpZW50LnNlbmQoJ1J1bnRpbWUucXVlcnlPYmplY3RzJywge1xuICAgICAgICAgICAgcHJvdG90eXBlT2JqZWN0SWQ6IHByb3RvdHlwZUhhbmRsZS5pZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpXG4gICAgICAgICAgICAubWFpblJlYWxtKClcbiAgICAgICAgICAgIC5jcmVhdGVDZHBIYW5kbGUocmVzcG9uc2Uub2JqZWN0cyk7XG4gICAgfVxuICAgIGFzeW5jIGNvb2tpZXMoLi4udXJscykge1xuICAgICAgICBjb25zdCBvcmlnaW5hbENvb2tpZXMgPSAoYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdOZXR3b3JrLmdldENvb2tpZXMnLCB7XG4gICAgICAgICAgICB1cmxzOiB1cmxzLmxlbmd0aCA/IHVybHMgOiBbdGhpcy51cmwoKV0sXG4gICAgICAgIH0pKS5jb29raWVzO1xuICAgICAgICBjb25zdCB1bnN1cHBvcnRlZENvb2tpZUF0dHJpYnV0ZXMgPSBbJ3NvdXJjZVBvcnQnXTtcbiAgICAgICAgY29uc3QgZmlsdGVyVW5zdXBwb3J0ZWRBdHRyaWJ1dGVzID0gKGNvb2tpZSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIHVuc3VwcG9ydGVkQ29va2llQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb29raWVbYXR0cl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29va2llO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxDb29raWVzLm1hcChmaWx0ZXJVbnN1cHBvcnRlZEF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgICBhc3luYyBkZWxldGVDb29raWUoLi4uY29va2llcykge1xuICAgICAgICBjb25zdCBwYWdlVVJMID0gdGhpcy51cmwoKTtcbiAgICAgICAgZm9yIChjb25zdCBjb29raWUgb2YgY29va2llcykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGNvb2tpZSk7XG4gICAgICAgICAgICBpZiAoIWNvb2tpZS51cmwgJiYgcGFnZVVSTC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICAgICAgICBpdGVtLnVybCA9IHBhZ2VVUkw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ05ldHdvcmsuZGVsZXRlQ29va2llcycsIGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNldENvb2tpZSguLi5jb29raWVzKSB7XG4gICAgICAgIGNvbnN0IHBhZ2VVUkwgPSB0aGlzLnVybCgpO1xuICAgICAgICBjb25zdCBzdGFydHNXaXRoSFRUUCA9IHBhZ2VVUkwuc3RhcnRzV2l0aCgnaHR0cCcpO1xuICAgICAgICBjb25zdCBpdGVtcyA9IGNvb2tpZXMubWFwKGNvb2tpZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgY29va2llKTtcbiAgICAgICAgICAgIGlmICghaXRlbS51cmwgJiYgc3RhcnRzV2l0aEhUVFApIHtcbiAgICAgICAgICAgICAgICBpdGVtLnVybCA9IHBhZ2VVUkw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQoaXRlbS51cmwgIT09ICdhYm91dDpibGFuaycsIGBCbGFuayBwYWdlIGNhbiBub3QgaGF2ZSBjb29raWUgXCIke2l0ZW0ubmFtZX1cImApO1xuICAgICAgICAgICAgYXNzZXJ0KCFTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGguY2FsbChpdGVtLnVybCB8fCAnJywgJ2RhdGE6JyksIGBEYXRhIFVSTCBwYWdlIGNhbiBub3QgaGF2ZSBjb29raWUgXCIke2l0ZW0ubmFtZX1cImApO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUNvb2tpZSguLi5pdGVtcyk7XG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnTmV0d29yay5zZXRDb29raWVzJywge1xuICAgICAgICAgICAgICAgIGNvb2tpZXM6IGl0ZW1zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZXhwb3NlRnVuY3Rpb24obmFtZSwgcHB0ckZ1bmN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLiNiaW5kaW5ncy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGFkZCBwYWdlIGJpbmRpbmcgd2l0aCBuYW1lICR7bmFtZX06IHdpbmRvd1snJHtuYW1lfSddIGFscmVhZHkgZXhpc3RzIWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHBhZ2VCaW5kaW5nSW5pdFN0cmluZygnZXhwb3NlZEZ1bicsIG5hbWUpO1xuICAgICAgICBsZXQgYmluZGluZztcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgcHB0ckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICAgICAgYmluZGluZyA9IG5ldyBCaW5kaW5nKG5hbWUsIHBwdHJGdW5jdGlvbiwgc291cmNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYmluZGluZyA9IG5ldyBCaW5kaW5nKG5hbWUsIHBwdHJGdW5jdGlvbi5kZWZhdWx0LCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2JpbmRpbmdzLnNldChuYW1lLCBiaW5kaW5nKTtcbiAgICAgICAgY29uc3QgW3sgaWRlbnRpZmllciB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5ldmFsdWF0ZU9uTmV3RG9jdW1lbnQoc291cmNlKSxcbiAgICAgICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nKGJpbmRpbmcpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy4jZXhwb3NlZEZ1bmN0aW9ucy5zZXQobmFtZSwgaWRlbnRpZmllcik7XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZUV4cG9zZWRGdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGV4cG9zZWRGdW5jdGlvbklkID0gdGhpcy4jZXhwb3NlZEZ1bmN0aW9ucy5nZXQobmFtZSk7XG4gICAgICAgIGlmICghZXhwb3NlZEZ1bmN0aW9uSWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb24gd2l0aCBuYW1lIFwiJHtuYW1lfVwiIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gI2JpbmRpbmdzIG11c3QgYmUgdXBkYXRlZCB0b2dldGhlciB3aXRoICNleHBvc2VkRnVuY3Rpb25zLlxuICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy4jYmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgICAgICB0aGlzLiNleHBvc2VkRnVuY3Rpb25zLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgdGhpcy4jYmluZGluZ3MuZGVsZXRlKG5hbWUpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIucmVtb3ZlU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQoZXhwb3NlZEZ1bmN0aW9uSWQpLFxuICAgICAgICAgICAgdGhpcy4jZnJhbWVNYW5hZ2VyLnJlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZyksXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBhc3luYyBhdXRoZW50aWNhdGUoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5hdXRoZW50aWNhdGUoY3JlZGVudGlhbHMpO1xuICAgIH1cbiAgICBhc3luYyBzZXRFeHRyYUhUVFBIZWFkZXJzKGhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5zZXRFeHRyYUhUVFBIZWFkZXJzKGhlYWRlcnMpO1xuICAgIH1cbiAgICBhc3luYyBzZXRVc2VyQWdlbnQodXNlckFnZW50LCB1c2VyQWdlbnRNZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLnNldFVzZXJBZ2VudCh1c2VyQWdlbnQsIHVzZXJBZ2VudE1ldGFkYXRhKTtcbiAgICB9XG4gICAgYXN5bmMgbWV0cmljcygpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ1BlcmZvcm1hbmNlLmdldE1ldHJpY3MnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2J1aWxkTWV0cmljc09iamVjdChyZXNwb25zZS5tZXRyaWNzKTtcbiAgICB9XG4gICAgI2VtaXRNZXRyaWNzKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZW1pdChcIm1ldHJpY3NcIiAvKiBQYWdlRXZlbnQuTWV0cmljcyAqLywge1xuICAgICAgICAgICAgdGl0bGU6IGV2ZW50LnRpdGxlLFxuICAgICAgICAgICAgbWV0cmljczogdGhpcy4jYnVpbGRNZXRyaWNzT2JqZWN0KGV2ZW50Lm1ldHJpY3MpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgI2J1aWxkTWV0cmljc09iamVjdChtZXRyaWNzKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IG1ldHJpYyBvZiBtZXRyaWNzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoc3VwcG9ydGVkTWV0cmljcy5oYXMobWV0cmljLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W21ldHJpYy5uYW1lXSA9IG1ldHJpYy52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAjaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgICB0aGlzLmVtaXQoXCJwYWdlZXJyb3JcIiAvKiBQYWdlRXZlbnQuUGFnZUVycm9yICovLCBjcmVhdGVDbGllbnRFcnJvcihleGNlcHRpb24uZXhjZXB0aW9uRGV0YWlscykpO1xuICAgIH1cbiAgICAjb25Db25zb2xlQVBJKHdvcmxkLCBldmVudCkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBldmVudC5hcmdzLm1hcChhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdvcmxkLmNyZWF0ZUNkcEhhbmRsZShhcmcpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jYWRkQ29uc29sZU1lc3NhZ2UoY29udmVydENvbnNvbGVNZXNzYWdlTGV2ZWwoZXZlbnQudHlwZSksIHZhbHVlcywgZXZlbnQuc3RhY2tUcmFjZSk7XG4gICAgfVxuICAgIGFzeW5jICNvbkJpbmRpbmdDYWxsZWQod29ybGQsIGV2ZW50KSB7XG4gICAgICAgIGxldCBwYXlsb2FkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoZXZlbnQucGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgLy8gVGhlIGJpbmRpbmcgd2FzIGVpdGhlciBjYWxsZWQgYnkgc29tZXRoaW5nIGluIHRoZSBwYWdlIG9yIGl0IHdhc1xuICAgICAgICAgICAgLy8gY2FsbGVkIGJlZm9yZSBvdXIgd3JhcHBlciB3YXMgaW5pdGlhbGl6ZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlLCBuYW1lLCBzZXEsIGFyZ3MsIGlzVHJpdmlhbCB9ID0gcGF5bG9hZDtcbiAgICAgICAgaWYgKHR5cGUgIT09ICdleHBvc2VkRnVuJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB3b3JsZC5jb250ZXh0O1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy4jYmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgICAgICBhd2FpdCBiaW5kaW5nPy5ydW4oY29udGV4dCwgc2VxLCBhcmdzLCBpc1RyaXZpYWwpO1xuICAgIH1cbiAgICAjYWRkQ29uc29sZU1lc3NhZ2UoZXZlbnRUeXBlLCBhcmdzLCBzdGFja1RyYWNlKSB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lckNvdW50KFwiY29uc29sZVwiIC8qIFBhZ2VFdmVudC5Db25zb2xlICovKSkge1xuICAgICAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0VG9rZW5zID0gW107XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuIC0tIFRoZSBjb21tZW50IGlzIGxvbmcuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBydWxlc2Rpci91c2UtdXNpbmcgLS0gVGhlc2UgYXJlIG5vdCBvd25lZCBieSB0aGlzIGZ1bmN0aW9uLlxuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdGVPYmplY3QgPSBhcmcucmVtb3RlT2JqZWN0KCk7XG4gICAgICAgICAgICBpZiAocmVtb3RlT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICAgICAgdGV4dFRva2Vucy5wdXNoKGFyZy50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRleHRUb2tlbnMucHVzaCh2YWx1ZUZyb21SZW1vdGVPYmplY3QocmVtb3RlT2JqZWN0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhY2tUcmFjZUxvY2F0aW9ucyA9IFtdO1xuICAgICAgICBpZiAoc3RhY2tUcmFjZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYWxsRnJhbWUgb2Ygc3RhY2tUcmFjZS5jYWxsRnJhbWVzKSB7XG4gICAgICAgICAgICAgICAgc3RhY2tUcmFjZUxvY2F0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBjYWxsRnJhbWUudXJsLFxuICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBjYWxsRnJhbWUubGluZU51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyOiBjYWxsRnJhbWUuY29sdW1uTnVtYmVyLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgQ29uc29sZU1lc3NhZ2UoY29udmVydENvbnNvbGVNZXNzYWdlTGV2ZWwoZXZlbnRUeXBlKSwgdGV4dFRva2Vucy5qb2luKCcgJyksIGFyZ3MsIHN0YWNrVHJhY2VMb2NhdGlvbnMpO1xuICAgICAgICB0aGlzLmVtaXQoXCJjb25zb2xlXCIgLyogUGFnZUV2ZW50LkNvbnNvbGUgKi8sIG1lc3NhZ2UpO1xuICAgIH1cbiAgICAjb25EaWFsb2coZXZlbnQpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbGlkYXRlRGlhbG9nVHlwZShldmVudC50eXBlKTtcbiAgICAgICAgY29uc3QgZGlhbG9nID0gbmV3IENkcERpYWxvZyh0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LCB0eXBlLCBldmVudC5tZXNzYWdlLCBldmVudC5kZWZhdWx0UHJvbXB0KTtcbiAgICAgICAgdGhpcy5lbWl0KFwiZGlhbG9nXCIgLyogUGFnZUV2ZW50LkRpYWxvZyAqLywgZGlhbG9nKTtcbiAgICB9XG4gICAgYXN5bmMgcmVsb2FkKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLndhaXRGb3JOYXZpZ2F0aW9uKHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgIGlnbm9yZVNhbWVEb2N1bWVudE5hdmlnYXRpb246IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnUGFnZS5yZWxvYWQnKSxcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIGNyZWF0ZUNEUFNlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRhcmdldCgpLmNyZWF0ZUNEUFNlc3Npb24oKTtcbiAgICB9XG4gICAgYXN5bmMgZ29CYWNrKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZ28oLTEsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBhc3luYyBnb0ZvcndhcmQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNnbygrMSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGFzeW5jICNnbyhkZWx0YSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBoaXN0b3J5ID0gYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5Jyk7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gaGlzdG9yeS5lbnRyaWVzW2hpc3RvcnkuY3VycmVudEluZGV4ICsgZGVsdGFdO1xuICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLndhaXRGb3JOYXZpZ2F0aW9uKG9wdGlvbnMpLFxuICAgICAgICAgICAgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLm5hdmlnYXRlVG9IaXN0b3J5RW50cnknLCB7XG4gICAgICAgICAgICAgICAgZW50cnlJZDogZW50cnkuaWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiByZXN1bHRbMF07XG4gICAgfVxuICAgIGFzeW5jIGJyaW5nVG9Gcm9udCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmJyaW5nVG9Gcm9udCcpO1xuICAgIH1cbiAgICBhc3luYyBzZXRKYXZhU2NyaXB0RW5hYmxlZChlbmFibGVkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLnNldEphdmFTY3JpcHRFbmFibGVkKGVuYWJsZWQpO1xuICAgIH1cbiAgICBhc3luYyBzZXRCeXBhc3NDU1AoZW5hYmxlZCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ1BhZ2Uuc2V0QnlwYXNzQ1NQJywgeyBlbmFibGVkIH0pO1xuICAgIH1cbiAgICBhc3luYyBlbXVsYXRlTWVkaWFUeXBlKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuZW11bGF0ZU1lZGlhVHlwZSh0eXBlKTtcbiAgICB9XG4gICAgYXN5bmMgZW11bGF0ZUNQVVRocm90dGxpbmcoZmFjdG9yKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLmVtdWxhdGVDUFVUaHJvdHRsaW5nKGZhY3Rvcik7XG4gICAgfVxuICAgIGFzeW5jIGVtdWxhdGVNZWRpYUZlYXR1cmVzKGZlYXR1cmVzKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLmVtdWxhdGVNZWRpYUZlYXR1cmVzKGZlYXR1cmVzKTtcbiAgICB9XG4gICAgYXN5bmMgZW11bGF0ZVRpbWV6b25lKHRpbWV6b25lSWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuZW11bGF0ZVRpbWV6b25lKHRpbWV6b25lSWQpO1xuICAgIH1cbiAgICBhc3luYyBlbXVsYXRlSWRsZVN0YXRlKG92ZXJyaWRlcykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZW11bGF0aW9uTWFuYWdlci5lbXVsYXRlSWRsZVN0YXRlKG92ZXJyaWRlcyk7XG4gICAgfVxuICAgIGFzeW5jIGVtdWxhdGVWaXNpb25EZWZpY2llbmN5KHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuZW11bGF0ZVZpc2lvbkRlZmljaWVuY3kodHlwZSk7XG4gICAgfVxuICAgIGFzeW5jIHNldFZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgICAgIGNvbnN0IG5lZWRzUmVsb2FkID0gYXdhaXQgdGhpcy4jZW11bGF0aW9uTWFuYWdlci5lbXVsYXRlVmlld3BvcnQodmlld3BvcnQpO1xuICAgICAgICB0aGlzLiN2aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICAgICBpZiAobmVlZHNSZWxvYWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlld3BvcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2aWV3cG9ydDtcbiAgICB9XG4gICAgYXN5bmMgZXZhbHVhdGVPbk5ld0RvY3VtZW50KHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmFsdWF0aW9uU3RyaW5nKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNmcmFtZU1hbmFnZXIuZXZhbHVhdGVPbk5ld0RvY3VtZW50KHNvdXJjZSk7XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZVNjcmlwdFRvRXZhbHVhdGVPbk5ld0RvY3VtZW50KGlkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5yZW1vdmVTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudChpZGVudGlmaWVyKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0Q2FjaGVFbmFibGVkKGVuYWJsZWQgPSB0cnVlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5zZXRDYWNoZUVuYWJsZWQoZW5hYmxlZCk7XG4gICAgfVxuICAgIGFzeW5jIF9zY3JlZW5zaG90KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZW52XzIgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IGZyb21TdXJmYWNlLCBvbWl0QmFja2dyb3VuZCwgb3B0aW1pemVGb3JTcGVlZCwgcXVhbGl0eSwgY2xpcDogdXNlckNsaXAsIHR5cGUsIGNhcHR1cmVCZXlvbmRWaWV3cG9ydCwgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBpc0ZpcmVmb3ggPSB0aGlzLnRhcmdldCgpLl90YXJnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBGaXJlZm94VGFyZ2V0TWFuYWdlcjtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzIsIG5ldyBBc3luY0Rpc3Bvc2FibGVTdGFjaygpLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIEZpcmVmb3ggb21pdHMgYmFja2dyb3VuZCBieSBkZWZhdWx0OyBpdCdzIG5vdCBjb25maWd1cmFibGUuXG4gICAgICAgICAgICBpZiAoIWlzRmlyZWZveCAmJiBvbWl0QmFja2dyb3VuZCAmJiAodHlwZSA9PT0gJ3BuZycgfHwgdHlwZSA9PT0gJ3dlYnAnKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kQ29sb3IoKTtcbiAgICAgICAgICAgICAgICBzdGFjay5kZWZlcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3IoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNsaXAgPSB1c2VyQ2xpcDtcbiAgICAgICAgICAgIGlmIChjbGlwICYmICFjYXB0dXJlQmV5b25kVmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IGF3YWl0IHRoaXMubWFpbkZyYW1lKClcbiAgICAgICAgICAgICAgICAgICAgLmlzb2xhdGVkUmVhbG0oKVxuICAgICAgICAgICAgICAgICAgICAuZXZhbHVhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGhlaWdodCwgcGFnZUxlZnQ6IHgsIHBhZ2VUb3A6IHksIHdpZHRoLCB9ID0gd2luZG93LnZpc3VhbFZpZXdwb3J0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB4LCB5LCBoZWlnaHQsIHdpZHRoIH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2xpcCA9IGdldEludGVyc2VjdGlvblJlY3QoY2xpcCwgdmlld3BvcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGVzZSBzcHJlYWRzIGJlY2F1c2UgRmlyZWZveCBkb2Vzbid0IGFsbG93IHVua25vd24gb3B0aW9ucy5cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmNhcHR1cmVTY3JlZW5zaG90Jywge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogdHlwZSxcbiAgICAgICAgICAgICAgICAuLi4ob3B0aW1pemVGb3JTcGVlZCA/IHsgb3B0aW1pemVGb3JTcGVlZCB9IDoge30pLFxuICAgICAgICAgICAgICAgIC4uLihxdWFsaXR5ICE9PSB1bmRlZmluZWQgPyB7IHF1YWxpdHk6IE1hdGgucm91bmQocXVhbGl0eSkgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAuLi4oY2xpcCA/IHsgY2xpcDogeyAuLi5jbGlwLCBzY2FsZTogY2xpcC5zY2FsZSA/PyAxIH0gfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAuLi4oIWZyb21TdXJmYWNlID8geyBmcm9tU3VyZmFjZSB9IDoge30pLFxuICAgICAgICAgICAgICAgIGNhcHR1cmVCZXlvbmRWaWV3cG9ydCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzI7XG4gICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRfMSA9IF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMik7XG4gICAgICAgICAgICBpZiAocmVzdWx0XzEpXG4gICAgICAgICAgICAgICAgYXdhaXQgcmVzdWx0XzE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgY3JlYXRlUERGU3RyZWFtKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgeyBsYW5kc2NhcGUsIGRpc3BsYXlIZWFkZXJGb290ZXIsIGhlYWRlclRlbXBsYXRlLCBmb290ZXJUZW1wbGF0ZSwgcHJpbnRCYWNrZ3JvdW5kLCBzY2FsZSwgd2lkdGg6IHBhcGVyV2lkdGgsIGhlaWdodDogcGFwZXJIZWlnaHQsIG1hcmdpbiwgcGFnZVJhbmdlcywgcHJlZmVyQ1NTUGFnZVNpemUsIG9taXRCYWNrZ3JvdW5kLCB0YWdnZWQ6IGdlbmVyYXRlVGFnZ2VkUERGLCBvdXRsaW5lOiBnZW5lcmF0ZURvY3VtZW50T3V0bGluZSwgd2FpdEZvckZvbnRzLCB9ID0gcGFyc2VQREZPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAob21pdEJhY2tncm91bmQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kQ29sb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2FpdEZvckZvbnRzKSB7XG4gICAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShmcm9tKHRoaXMubWFpbkZyYW1lKClcbiAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZm9udHMucmVhZHk7XG4gICAgICAgICAgICB9KSkucGlwZShyYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmludENvbW1hbmRQcm9taXNlID0gdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLnByaW50VG9QREYnLCB7XG4gICAgICAgICAgICB0cmFuc2Zlck1vZGU6ICdSZXR1cm5Bc1N0cmVhbScsXG4gICAgICAgICAgICBsYW5kc2NhcGUsXG4gICAgICAgICAgICBkaXNwbGF5SGVhZGVyRm9vdGVyLFxuICAgICAgICAgICAgaGVhZGVyVGVtcGxhdGUsXG4gICAgICAgICAgICBmb290ZXJUZW1wbGF0ZSxcbiAgICAgICAgICAgIHByaW50QmFja2dyb3VuZCxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgcGFwZXJXaWR0aCxcbiAgICAgICAgICAgIHBhcGVySGVpZ2h0LFxuICAgICAgICAgICAgbWFyZ2luVG9wOiBtYXJnaW4udG9wLFxuICAgICAgICAgICAgbWFyZ2luQm90dG9tOiBtYXJnaW4uYm90dG9tLFxuICAgICAgICAgICAgbWFyZ2luTGVmdDogbWFyZ2luLmxlZnQsXG4gICAgICAgICAgICBtYXJnaW5SaWdodDogbWFyZ2luLnJpZ2h0LFxuICAgICAgICAgICAgcGFnZVJhbmdlcyxcbiAgICAgICAgICAgIHByZWZlckNTU1BhZ2VTaXplLFxuICAgICAgICAgICAgZ2VuZXJhdGVUYWdnZWRQREYsXG4gICAgICAgICAgICBnZW5lcmF0ZURvY3VtZW50T3V0bGluZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGZyb20ocHJpbnRDb21tYW5kUHJvbWlzZSkucGlwZShyYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICAgICAgaWYgKG9taXRCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLnJlc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvcigpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChyZXN1bHQuc3RyZWFtLCAnYHN0cmVhbWAgaXMgbWlzc2luZyBmcm9tIGBQYWdlLnByaW50VG9QREYnKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldFJlYWRhYmxlRnJvbVByb3RvY29sU3RyZWFtKHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQsIHJlc3VsdC5zdHJlYW0pO1xuICAgIH1cbiAgICBhc3luYyBwZGYob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgcGF0aCA9IHVuZGVmaW5lZCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgcmVhZGFibGUgPSBhd2FpdCB0aGlzLmNyZWF0ZVBERlN0cmVhbShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZ2V0UmVhZGFibGVBc0J1ZmZlcihyZWFkYWJsZSwgcGF0aCk7XG4gICAgICAgIGFzc2VydChidWZmZXIsICdDb3VsZCBub3QgY3JlYXRlIGJ1ZmZlcicpO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBjbG9zZShvcHRpb25zID0geyBydW5CZWZvcmVVbmxvYWQ6IHVuZGVmaW5lZCB9KSB7XG4gICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgX2d1YXJkID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzMsIGF3YWl0IHRoaXMuYnJvd3NlckNvbnRleHQoKS53YWl0Rm9yU2NyZWVuc2hvdE9wZXJhdGlvbnMoKSwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuY29ubmVjdGlvbigpO1xuICAgICAgICAgICAgYXNzZXJ0KGNvbm5lY3Rpb24sICdQcm90b2NvbCBlcnJvcjogQ29ubmVjdGlvbiBjbG9zZWQuIE1vc3QgbGlrZWx5IHRoZSBwYWdlIGhhcyBiZWVuIGNsb3NlZC4nKTtcbiAgICAgICAgICAgIGNvbnN0IHJ1bkJlZm9yZVVubG9hZCA9ICEhb3B0aW9ucy5ydW5CZWZvcmVVbmxvYWQ7XG4gICAgICAgICAgICBpZiAocnVuQmVmb3JlVW5sb2FkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmNsb3NlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5jbG9zZVRhcmdldCcsIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SWQ6IHRoaXMuI3ByaW1hcnlUYXJnZXQuX3RhcmdldElkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3RhYlRhcmdldC5faXNDbG9zZWREZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8zKSB7XG4gICAgICAgICAgICBlbnZfMy5lcnJvciA9IGVfMztcbiAgICAgICAgICAgIGVudl8zLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNDbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjbG9zZWQ7XG4gICAgfVxuICAgIGdldCBtb3VzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI21vdXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY291cGxlZCB3aXRoIGFuIGFjdGlvbiB0aGF0IHRyaWdnZXJzIGEgZGV2aWNlXG4gICAgICogcmVxdWVzdCBmcm9tIGFuIGFwaSBzdWNoIGFzIFdlYkJsdWV0b290aC5cbiAgICAgKlxuICAgICAqIDo6OmNhdXRpb25cbiAgICAgKlxuICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBkZXZpY2UgcmVxdWVzdCBpcyBtYWRlLiBJdCB3aWxsIG5vdCByZXR1cm4gYVxuICAgICAqIGN1cnJlbnRseSBhY3RpdmUgZGV2aWNlIHByb21wdC5cbiAgICAgKlxuICAgICAqIDo6OlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgW2RldmljZVByb21wdF0gPSBQcm9taXNlLmFsbChbXG4gICAgICogICBwYWdlLndhaXRGb3JEZXZpY2VQcm9tcHQoKSxcbiAgICAgKiAgIHBhZ2UuY2xpY2soJyNjb25uZWN0LWJsdWV0b290aCcpLFxuICAgICAqIF0pO1xuICAgICAqIGF3YWl0IGRldmljZVByb21wdC5zZWxlY3QoXG4gICAgICogICBhd2FpdCBkZXZpY2VQcm9tcHQud2FpdEZvckRldmljZSgoe25hbWV9KSA9PiBuYW1lLmluY2x1ZGVzKCdNeSBEZXZpY2UnKSlcbiAgICAgKiApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JEZXZpY2VQcm9tcHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLndhaXRGb3JEZXZpY2VQcm9tcHQob3B0aW9ucyk7XG4gICAgfVxufVxuY29uc3Qgc3VwcG9ydGVkTWV0cmljcyA9IG5ldyBTZXQoW1xuICAgICdUaW1lc3RhbXAnLFxuICAgICdEb2N1bWVudHMnLFxuICAgICdGcmFtZXMnLFxuICAgICdKU0V2ZW50TGlzdGVuZXJzJyxcbiAgICAnTm9kZXMnLFxuICAgICdMYXlvdXRDb3VudCcsXG4gICAgJ1JlY2FsY1N0eWxlQ291bnQnLFxuICAgICdMYXlvdXREdXJhdGlvbicsXG4gICAgJ1JlY2FsY1N0eWxlRHVyYXRpb24nLFxuICAgICdTY3JpcHREdXJhdGlvbicsXG4gICAgJ1Rhc2tEdXJhdGlvbicsXG4gICAgJ0pTSGVhcFVzZWRTaXplJyxcbiAgICAnSlNIZWFwVG90YWxTaXplJyxcbl0pO1xuLyoqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmRyaXZlci1iaWRpLyNyZWN0YW5nbGUtaW50ZXJzZWN0aW9uICovXG5mdW5jdGlvbiBnZXRJbnRlcnNlY3Rpb25SZWN0KGNsaXAsIHZpZXdwb3J0KSB7XG4gICAgLy8gTm90ZSB0aGVzZSB3aWxsIGFscmVhZHkgYmUgbm9ybWFsaXplZC5cbiAgICBjb25zdCB4ID0gTWF0aC5tYXgoY2xpcC54LCB2aWV3cG9ydC54KTtcbiAgICBjb25zdCB5ID0gTWF0aC5tYXgoY2xpcC55LCB2aWV3cG9ydC55KTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3aWR0aDogTWF0aC5tYXgoTWF0aC5taW4oY2xpcC54ICsgY2xpcC53aWR0aCwgdmlld3BvcnQueCArIHZpZXdwb3J0LndpZHRoKSAtIHgsIDApLFxuICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KE1hdGgubWluKGNsaXAueSArIGNsaXAuaGVpZ2h0LCB2aWV3cG9ydC55ICsgdmlld3BvcnQuaGVpZ2h0KSAtIHksIDApLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QYWdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEEgbGlzdCBvZiBwcmUtZGVmaW5lZCBuZXR3b3JrIGNvbmRpdGlvbnMgdG8gYmUgdXNlZCB3aXRoXG4gKiB7QGxpbmsgUGFnZS5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7UHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zfSBmcm9tICdwdXBwZXRlZXInO1xuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyhcbiAqICAgICBQcmVkZWZpbmVkTmV0d29ya0NvbmRpdGlvbnNbJ1Nsb3cgM0cnXVxuICogICApO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20nKTtcbiAqICAgYXdhaXQgcGFnZS5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMoXG4gKiAgICAgUHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zWydGYXN0IDNHJ11cbiAqICAgKTtcbiAqICAgYXdhaXQgcGFnZS5nb3RvKCdodHRwczovL3d3dy5nb29nbGUuY29tJyk7XG4gKiAgIGF3YWl0IHBhZ2UuZW11bGF0ZU5ldHdvcmtDb25kaXRpb25zKFxuICogICAgIFByZWRlZmluZWROZXR3b3JrQ29uZGl0aW9uc1snU2xvdyA0RyddXG4gKiAgICk7IC8vIGFsaWFzIHRvIEZhc3QgM0cuXG4gKiAgIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbScpO1xuICogICBhd2FpdCBwYWdlLmVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyhcbiAqICAgICBQcmVkZWZpbmVkTmV0d29ya0NvbmRpdGlvbnNbJ0Zhc3QgNEcnXVxuICogICApO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20nKTtcbiAqICAgLy8gb3RoZXIgYWN0aW9ucy4uLlxuICogICBhd2FpdCBicm93c2VyLmNsb3NlKCk7XG4gKiB9KSgpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgUHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgLy8gR2VuZXJhbGx5IGFsaWduZWQgd2l0aCBEZXZUb29sc1xuICAgIC8vIGh0dHBzOi8vc291cmNlLmNocm9taXVtLm9yZy9jaHJvbWl1bS9jaHJvbWl1bS9zcmMvKy9tYWluOnRoaXJkX3BhcnR5L2RldnRvb2xzLWZyb250ZW5kL3NyYy9mcm9udF9lbmQvY29yZS9zZGsvTmV0d29ya01hbmFnZXIudHM7bD0zOTg7ZHJjPTIyNWUxMjQwZjUyMmNhNjg0NDczZjU0MWFlNmRhZTZjZDc2NmRkMzMuXG4gICAgJ1Nsb3cgM0cnOiB7XG4gICAgICAgIC8vIH41MDBLYnBzIGRvd25cbiAgICAgICAgZG93bmxvYWQ6ICgoNTAwICogMTAwMCkgLyA4KSAqIDAuOCxcbiAgICAgICAgLy8gfjUwMEticHMgdXBcbiAgICAgICAgdXBsb2FkOiAoKDUwMCAqIDEwMDApIC8gOCkgKiAwLjgsXG4gICAgICAgIC8vIDQwMG1zIFJUVFxuICAgICAgICBsYXRlbmN5OiA0MDAgKiA1LFxuICAgIH0sXG4gICAgJ0Zhc3QgM0cnOiB7XG4gICAgICAgIC8vIH4xLjYgTWJwcyBkb3duXG4gICAgICAgIGRvd25sb2FkOiAoKDEuNiAqIDEwMDAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyB+MC43NSBNYnBzIHVwXG4gICAgICAgIHVwbG9hZDogKCg3NTAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyAxNTBtcyBSVFRcbiAgICAgICAgbGF0ZW5jeTogMTUwICogMy43NSxcbiAgICB9LFxuICAgIC8vIGFsaWFzIHRvIEZhc3QgM0cgdG8gYWxpZ24gd2l0aCBMaWdodGhvdXNlIChjcmJ1Zy5jb20vMzQyNDA2NjA4KVxuICAgIC8vIGFuZCBEZXZUb29scyAoY3JidWcuY29tLzM0MjQwNjYwOCksXG4gICAgJ1Nsb3cgNEcnOiB7XG4gICAgICAgIC8vIH4xLjYgTWJwcyBkb3duXG4gICAgICAgIGRvd25sb2FkOiAoKDEuNiAqIDEwMDAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyB+MC43NSBNYnBzIHVwXG4gICAgICAgIHVwbG9hZDogKCg3NTAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyAxNTBtcyBSVFRcbiAgICAgICAgbGF0ZW5jeTogMTUwICogMy43NSxcbiAgICB9LFxuICAgICdGYXN0IDRHJzoge1xuICAgICAgICAvLyA5IE1icHMgZG93blxuICAgICAgICBkb3dubG9hZDogKCg5ICogMTAwMCAqIDEwMDApIC8gOCkgKiAwLjksXG4gICAgICAgIC8vIDEuNSBNYnBzIHVwXG4gICAgICAgIHVwbG9hZDogKCgxLjUgKiAxMDAwICogMTAwMCkgLyA4KSAqIDAuOSxcbiAgICAgICAgLy8gNjBtcyBSVFRcbiAgICAgICAgbGF0ZW5jeTogNjAgKiAyLjc1LFxuICAgIH0sXG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByZWRlZmluZWROZXR3b3JrQ29uZGl0aW9ucy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVGFyZ2V0LCBUYXJnZXRUeXBlIH0gZnJvbSAnLi4vYXBpL1RhcmdldC5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IENkcENEUFNlc3Npb24gfSBmcm9tICcuL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgQ2RwUGFnZSB9IGZyb20gJy4vUGFnZS5qcyc7XG5pbXBvcnQgeyBDZHBXZWJXb3JrZXIgfSBmcm9tICcuL1dlYldvcmtlci5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdmFyIEluaXRpYWxpemF0aW9uU3RhdHVzO1xuKGZ1bmN0aW9uIChJbml0aWFsaXphdGlvblN0YXR1cykge1xuICAgIEluaXRpYWxpemF0aW9uU3RhdHVzW1wiU1VDQ0VTU1wiXSA9IFwic3VjY2Vzc1wiO1xuICAgIEluaXRpYWxpemF0aW9uU3RhdHVzW1wiQUJPUlRFRFwiXSA9IFwiYWJvcnRlZFwiO1xufSkoSW5pdGlhbGl6YXRpb25TdGF0dXMgfHwgKEluaXRpYWxpemF0aW9uU3RhdHVzID0ge30pKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBUYXJnZXQgZXh0ZW5kcyBUYXJnZXQge1xuICAgICNicm93c2VyQ29udGV4dDtcbiAgICAjc2Vzc2lvbjtcbiAgICAjdGFyZ2V0SW5mbztcbiAgICAjdGFyZ2V0TWFuYWdlcjtcbiAgICAjc2Vzc2lvbkZhY3Rvcnk7XG4gICAgI2NoaWxkVGFyZ2V0cyA9IG5ldyBTZXQoKTtcbiAgICBfaW5pdGlhbGl6ZWREZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgIF9pc0Nsb3NlZERlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgX3RhcmdldElkO1xuICAgIC8qKlxuICAgICAqIFRvIGluaXRpYWxpemUgdGhlIHRhcmdldCBmb3IgdXNlLCBjYWxsIGluaXRpYWxpemUuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0YXJnZXRJbmZvLCBzZXNzaW9uLCBicm93c2VyQ29udGV4dCwgdGFyZ2V0TWFuYWdlciwgc2Vzc2lvbkZhY3RvcnkpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIgPSB0YXJnZXRNYW5hZ2VyO1xuICAgICAgICB0aGlzLiN0YXJnZXRJbmZvID0gdGFyZ2V0SW5mbztcbiAgICAgICAgdGhpcy4jYnJvd3NlckNvbnRleHQgPSBicm93c2VyQ29udGV4dDtcbiAgICAgICAgdGhpcy5fdGFyZ2V0SWQgPSB0YXJnZXRJbmZvLnRhcmdldElkO1xuICAgICAgICB0aGlzLiNzZXNzaW9uRmFjdG9yeSA9IHNlc3Npb25GYWN0b3J5O1xuICAgICAgICBpZiAodGhpcy4jc2Vzc2lvbiAmJiB0aGlzLiNzZXNzaW9uIGluc3RhbmNlb2YgQ2RwQ0RQU2Vzc2lvbikge1xuICAgICAgICAgICAgdGhpcy4jc2Vzc2lvbi5fc2V0VGFyZ2V0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGFzUGFnZSgpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuX3Nlc3Npb24oKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVDRFBTZXNzaW9uKCkudGhlbihjbGllbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBDZHBQYWdlLl9jcmVhdGUoY2xpZW50LCB0aGlzLCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBDZHBQYWdlLl9jcmVhdGUoc2Vzc2lvbiwgdGhpcywgbnVsbCk7XG4gICAgfVxuICAgIF9zdWJ0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFyZ2V0SW5mby5zdWJ0eXBlO1xuICAgIH1cbiAgICBfc2Vzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Nlc3Npb247XG4gICAgfVxuICAgIF9hZGRDaGlsZFRhcmdldCh0YXJnZXQpIHtcbiAgICAgICAgdGhpcy4jY2hpbGRUYXJnZXRzLmFkZCh0YXJnZXQpO1xuICAgIH1cbiAgICBfcmVtb3ZlQ2hpbGRUYXJnZXQodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuI2NoaWxkVGFyZ2V0cy5kZWxldGUodGFyZ2V0KTtcbiAgICB9XG4gICAgX2NoaWxkVGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NoaWxkVGFyZ2V0cztcbiAgICB9XG4gICAgX3Nlc3Npb25GYWN0b3J5KCkge1xuICAgICAgICBpZiAoIXRoaXMuI3Nlc3Npb25GYWN0b3J5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nlc3Npb25GYWN0b3J5IGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNzZXNzaW9uRmFjdG9yeTtcbiAgICB9XG4gICAgY3JlYXRlQ0RQU2Vzc2lvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNzZXNzaW9uRmFjdG9yeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXNzaW9uRmFjdG9yeSBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jc2Vzc2lvbkZhY3RvcnkoZmFsc2UpLnRoZW4oc2Vzc2lvbiA9PiB7XG4gICAgICAgICAgICBzZXNzaW9uLl9zZXRUYXJnZXQodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhcmdldEluZm8udXJsO1xuICAgIH1cbiAgICB0eXBlKCkge1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy4jdGFyZ2V0SW5mby50eXBlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3BhZ2UnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXRUeXBlLlBBR0U7XG4gICAgICAgICAgICBjYXNlICdiYWNrZ3JvdW5kX3BhZ2UnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXRUeXBlLkJBQ0tHUk9VTkRfUEFHRTtcbiAgICAgICAgICAgIGNhc2UgJ3NlcnZpY2Vfd29ya2VyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0VHlwZS5TRVJWSUNFX1dPUktFUjtcbiAgICAgICAgICAgIGNhc2UgJ3NoYXJlZF93b3JrZXInOlxuICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXRUeXBlLlNIQVJFRF9XT1JLRVI7XG4gICAgICAgICAgICBjYXNlICdicm93c2VyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0VHlwZS5CUk9XU0VSO1xuICAgICAgICAgICAgY2FzZSAnd2Vidmlldyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRhcmdldFR5cGUuV0VCVklFVztcbiAgICAgICAgICAgIGNhc2UgJ3RhYic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRhcmdldFR5cGUuVEFCO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0VHlwZS5PVEhFUjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfdGFyZ2V0TWFuYWdlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiN0YXJnZXRNYW5hZ2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldE1hbmFnZXIgaXMgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhcmdldE1hbmFnZXI7XG4gICAgfVxuICAgIF9nZXRUYXJnZXRJbmZvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFyZ2V0SW5mbztcbiAgICB9XG4gICAgYnJvd3NlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNicm93c2VyQ29udGV4dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdicm93c2VyQ29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlckNvbnRleHQuYnJvd3NlcigpO1xuICAgIH1cbiAgICBicm93c2VyQ29udGV4dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNicm93c2VyQ29udGV4dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdicm93c2VyQ29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlckNvbnRleHQ7XG4gICAgfVxuICAgIG9wZW5lcigpIHtcbiAgICAgICAgY29uc3QgeyBvcGVuZXJJZCB9ID0gdGhpcy4jdGFyZ2V0SW5mbztcbiAgICAgICAgaWYgKCFvcGVuZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJyb3dzZXIoKVxuICAgICAgICAgICAgLnRhcmdldHMoKVxuICAgICAgICAgICAgLmZpbmQodGFyZ2V0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQuX3RhcmdldElkID09PSBvcGVuZXJJZDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF90YXJnZXRJbmZvQ2hhbmdlZCh0YXJnZXRJbmZvKSB7XG4gICAgICAgIHRoaXMuI3RhcmdldEluZm8gPSB0YXJnZXRJbmZvO1xuICAgICAgICB0aGlzLl9jaGVja0lmSW5pdGlhbGl6ZWQoKTtcbiAgICB9XG4gICAgX2luaXRpYWxpemUoKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkRGVmZXJyZWQucmVzb2x2ZShJbml0aWFsaXphdGlvblN0YXR1cy5TVUNDRVNTKTtcbiAgICB9XG4gICAgX2lzVGFyZ2V0RXhwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSgpICE9PSBUYXJnZXRUeXBlLlRBQiAmJiAhdGhpcy5fc3VidHlwZSgpO1xuICAgIH1cbiAgICBfY2hlY2tJZkluaXRpYWxpemVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkRGVmZXJyZWQucmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWREZWZlcnJlZC5yZXNvbHZlKEluaXRpYWxpemF0aW9uU3RhdHVzLlNVQ0NFU1MpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VUYXJnZXQgZXh0ZW5kcyBDZHBUYXJnZXQge1xuICAgICNkZWZhdWx0Vmlld3BvcnQ7XG4gICAgcGFnZVByb21pc2U7XG4gICAgY29uc3RydWN0b3IodGFyZ2V0SW5mbywgc2Vzc2lvbiwgYnJvd3NlckNvbnRleHQsIHRhcmdldE1hbmFnZXIsIHNlc3Npb25GYWN0b3J5LCBkZWZhdWx0Vmlld3BvcnQpIHtcbiAgICAgICAgc3VwZXIodGFyZ2V0SW5mbywgc2Vzc2lvbiwgYnJvd3NlckNvbnRleHQsIHRhcmdldE1hbmFnZXIsIHNlc3Npb25GYWN0b3J5KTtcbiAgICAgICAgdGhpcy4jZGVmYXVsdFZpZXdwb3J0ID0gZGVmYXVsdFZpZXdwb3J0ID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgX2luaXRpYWxpemUoKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkRGVmZXJyZWRcbiAgICAgICAgICAgIC52YWx1ZU9yVGhyb3coKVxuICAgICAgICAgICAgLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gSW5pdGlhbGl6YXRpb25TdGF0dXMuQUJPUlRFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9wZW5lciA9IHRoaXMub3BlbmVyKCk7XG4gICAgICAgICAgICBpZiAoIShvcGVuZXIgaW5zdGFuY2VvZiBQYWdlVGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3BlbmVyIHx8ICFvcGVuZXIucGFnZVByb21pc2UgfHwgdGhpcy50eXBlKCkgIT09ICdwYWdlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3BlbmVyUGFnZSA9IGF3YWl0IG9wZW5lci5wYWdlUHJvbWlzZTtcbiAgICAgICAgICAgIGlmICghb3BlbmVyUGFnZS5saXN0ZW5lckNvdW50KFwicG9wdXBcIiAvKiBQYWdlRXZlbnQuUG9wdXAgKi8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwb3B1cFBhZ2UgPSBhd2FpdCB0aGlzLnBhZ2UoKTtcbiAgICAgICAgICAgIG9wZW5lclBhZ2UuZW1pdChcInBvcHVwXCIgLyogUGFnZUV2ZW50LlBvcHVwICovLCBwb3B1cFBhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIHRoaXMuX2NoZWNrSWZJbml0aWFsaXplZCgpO1xuICAgIH1cbiAgICBhc3luYyBwYWdlKCkge1xuICAgICAgICBpZiAoIXRoaXMucGFnZVByb21pc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9zZXNzaW9uKCk7XG4gICAgICAgICAgICB0aGlzLnBhZ2VQcm9taXNlID0gKHNlc3Npb25cbiAgICAgICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZShzZXNzaW9uKVxuICAgICAgICAgICAgICAgIDogdGhpcy5fc2Vzc2lvbkZhY3RvcnkoKSgvKiBpc0F1dG9BdHRhY2hFbXVsYXRlZD0qLyBmYWxzZSkpLnRoZW4oY2xpZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2RwUGFnZS5fY3JlYXRlKGNsaWVudCwgdGhpcywgdGhpcy4jZGVmYXVsdFZpZXdwb3J0ID8/IG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnBhZ2VQcm9taXNlKSA/PyBudWxsO1xuICAgIH1cbiAgICBfY2hlY2tJZkluaXRpYWxpemVkKCkge1xuICAgICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWREZWZlcnJlZC5yZXNvbHZlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2dldFRhcmdldEluZm8oKS51cmwgIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplZERlZmVycmVkLnJlc29sdmUoSW5pdGlhbGl6YXRpb25TdGF0dXMuU1VDQ0VTUyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRGV2VG9vbHNUYXJnZXQgZXh0ZW5kcyBQYWdlVGFyZ2V0IHtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZXJUYXJnZXQgZXh0ZW5kcyBDZHBUYXJnZXQge1xuICAgICN3b3JrZXJQcm9taXNlO1xuICAgIGFzeW5jIHdvcmtlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiN3b3JrZXJQcm9taXNlKSB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fc2Vzc2lvbigpO1xuICAgICAgICAgICAgLy8gVE9ETyhlaW5iaW5kZXIpOiBNYWtlIHdvcmtlcnMgc2VuZCB0aGVpciBjb25zb2xlIGxvZ3MuXG4gICAgICAgICAgICB0aGlzLiN3b3JrZXJQcm9taXNlID0gKHNlc3Npb25cbiAgICAgICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZShzZXNzaW9uKVxuICAgICAgICAgICAgICAgIDogdGhpcy5fc2Vzc2lvbkZhY3RvcnkoKSgvKiBpc0F1dG9BdHRhY2hFbXVsYXRlZD0qLyBmYWxzZSkpLnRoZW4oY2xpZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENkcFdlYldvcmtlcihjbGllbnQsIHRoaXMuX2dldFRhcmdldEluZm8oKS51cmwsIHRoaXMuX3RhcmdldElkLCB0aGlzLnR5cGUoKSwgKCkgPT4geyB9IC8qIGNvbnNvbGVBUElDYWxsZWQgKi8sICgpID0+IHsgfSAvKiBleGNlcHRpb25UaHJvd24gKi8pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI3dvcmtlclByb21pc2U7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE90aGVyVGFyZ2V0IGV4dGVuZHMgQ2RwVGFyZ2V0IHtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhcmdldC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFyZ2V0TWFuYWdlci5qcy5tYXAiLCJpbXBvcnQgeyBnZXRSZWFkYWJsZUFzQnVmZmVyLCBnZXRSZWFkYWJsZUZyb21Qcm90b2NvbFN0cmVhbSwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4uL3V0aWwvRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG4vKipcbiAqIFRoZSBUcmFjaW5nIGNsYXNzIGV4cG9zZXMgdGhlIHRyYWNpbmcgYXVkaXQgaW50ZXJmYWNlLlxuICogQHJlbWFya3NcbiAqIFlvdSBjYW4gdXNlIGB0cmFjaW5nLnN0YXJ0YCBhbmQgYHRyYWNpbmcuc3RvcGAgdG8gY3JlYXRlIGEgdHJhY2UgZmlsZVxuICogd2hpY2ggY2FuIGJlIG9wZW5lZCBpbiBDaHJvbWUgRGV2VG9vbHMgb3Ige0BsaW5rIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL3RpbWVsaW5lLXZpZXdlci8gfCB0aW1lbGluZSB2aWV3ZXJ9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IHBhZ2UudHJhY2luZy5zdGFydCh7cGF0aDogJ3RyYWNlLmpzb24nfSk7XG4gKiBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20nKTtcbiAqIGF3YWl0IHBhZ2UudHJhY2luZy5zdG9wKCk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFjaW5nIHtcbiAgICAjY2xpZW50O1xuICAgICNyZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAjcGF0aDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB1cGRhdGVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIGEgdHJhY2UgZm9yIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBPbmx5IG9uZSB0cmFjZSBjYW4gYmUgYWN0aXZlIGF0IGEgdGltZSBwZXIgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYFRyYWNpbmdPcHRpb25zYC5cbiAgICAgKi9cbiAgICBhc3luYyBzdGFydChvcHRpb25zID0ge30pIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNyZWNvcmRpbmcsICdDYW5ub3Qgc3RhcnQgcmVjb3JkaW5nIHRyYWNlIHdoaWxlIGFscmVhZHkgcmVjb3JkaW5nIHRyYWNlLicpO1xuICAgICAgICBjb25zdCBkZWZhdWx0Q2F0ZWdvcmllcyA9IFtcbiAgICAgICAgICAgICctKicsXG4gICAgICAgICAgICAnZGV2dG9vbHMudGltZWxpbmUnLFxuICAgICAgICAgICAgJ3Y4LmV4ZWN1dGUnLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUnLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUuZnJhbWUnLFxuICAgICAgICAgICAgJ3RvcGxldmVsJyxcbiAgICAgICAgICAgICdibGluay5jb25zb2xlJyxcbiAgICAgICAgICAgICdibGluay51c2VyX3RpbWluZycsXG4gICAgICAgICAgICAnbGF0ZW5jeUluZm8nLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUuc3RhY2snLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtdjguY3B1X3Byb2ZpbGVyJyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgeyBwYXRoLCBzY3JlZW5zaG90cyA9IGZhbHNlLCBjYXRlZ29yaWVzID0gZGVmYXVsdENhdGVnb3JpZXMgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChzY3JlZW5zaG90cykge1xuICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKCdkaXNhYmxlZC1ieS1kZWZhdWx0LWRldnRvb2xzLnNjcmVlbnNob3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGNsdWRlZENhdGVnb3JpZXMgPSBjYXRlZ29yaWVzXG4gICAgICAgICAgICAuZmlsdGVyKGNhdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2F0LnN0YXJ0c1dpdGgoJy0nKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5tYXAoY2F0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYXQuc2xpY2UoMSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbmNsdWRlZENhdGVnb3JpZXMgPSBjYXRlZ29yaWVzLmZpbHRlcihjYXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFjYXQuc3RhcnRzV2l0aCgnLScpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jcGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuI3JlY29yZGluZyA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdUcmFjaW5nLnN0YXJ0Jywge1xuICAgICAgICAgICAgdHJhbnNmZXJNb2RlOiAnUmV0dXJuQXNTdHJlYW0nLFxuICAgICAgICAgICAgdHJhY2VDb25maWc6IHtcbiAgICAgICAgICAgICAgICBleGNsdWRlZENhdGVnb3JpZXMsXG4gICAgICAgICAgICAgICAgaW5jbHVkZWRDYXRlZ29yaWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3BzIGEgdHJhY2Ugc3RhcnRlZCB3aXRoIHRoZSBgc3RhcnRgIG1ldGhvZC5cbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGJ1ZmZlciB3aXRoIHRyYWNlIGRhdGEuXG4gICAgICovXG4gICAgYXN5bmMgc3RvcCgpIHtcbiAgICAgICAgY29uc3QgY29udGVudERlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbmNlKCdUcmFjaW5nLnRyYWNpbmdDb21wbGV0ZScsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZXZlbnQuc3RyZWFtLCAnTWlzc2luZyBcInN0cmVhbVwiJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZGFibGUgPSBhd2FpdCBnZXRSZWFkYWJsZUZyb21Qcm90b2NvbFN0cmVhbSh0aGlzLiNjbGllbnQsIGV2ZW50LnN0cmVhbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZ2V0UmVhZGFibGVBc0J1ZmZlcihyZWFkYWJsZSwgdGhpcy4jcGF0aCk7XG4gICAgICAgICAgICAgICAgY29udGVudERlZmVycmVkLnJlc29sdmUoYnVmZmVyID8/IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnREZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudERlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoYFVua25vd24gZXJyb3I6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdUcmFjaW5nLmVuZCcpO1xuICAgICAgICB0aGlzLiNyZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRlbnREZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFjaW5nLmpzLm1hcCIsImltcG9ydCB7IENEUFNlc3Npb25FdmVudCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IFRhcmdldFR5cGUgfSBmcm9tICcuLi9hcGkvVGFyZ2V0LmpzJztcbmltcG9ydCB7IFdlYldvcmtlciB9IGZyb20gJy4uL2FwaS9XZWJXb3JrZXIuanMnO1xuaW1wb3J0IHsgVGltZW91dFNldHRpbmdzIH0gZnJvbSAnLi4vY29tbW9uL1RpbWVvdXRTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vRXhlY3V0aW9uQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBJc29sYXRlZFdvcmxkIH0gZnJvbSAnLi9Jc29sYXRlZFdvcmxkLmpzJztcbmltcG9ydCB7IENkcEpTSGFuZGxlIH0gZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwV2ViV29ya2VyIGV4dGVuZHMgV2ViV29ya2VyIHtcbiAgICAjd29ybGQ7XG4gICAgI2NsaWVudDtcbiAgICAjaWQ7XG4gICAgI3RhcmdldFR5cGU7XG4gICAgY29uc3RydWN0b3IoY2xpZW50LCB1cmwsIHRhcmdldElkLCB0YXJnZXRUeXBlLCBjb25zb2xlQVBJQ2FsbGVkLCBleGNlcHRpb25UaHJvd24pIHtcbiAgICAgICAgc3VwZXIodXJsKTtcbiAgICAgICAgdGhpcy4jaWQgPSB0YXJnZXRJZDtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB0aGlzLiN0YXJnZXRUeXBlID0gdGFyZ2V0VHlwZTtcbiAgICAgICAgdGhpcy4jd29ybGQgPSBuZXcgSXNvbGF0ZWRXb3JsZCh0aGlzLCBuZXcgVGltZW91dFNldHRpbmdzKCkpO1xuICAgICAgICB0aGlzLiNjbGllbnQub25jZSgnUnVudGltZS5leGVjdXRpb25Db250ZXh0Q3JlYXRlZCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jd29ybGQuc2V0Q29udGV4dChuZXcgRXhlY3V0aW9uQ29udGV4dChjbGllbnQsIGV2ZW50LmNvbnRleHQsIHRoaXMuI3dvcmxkKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN3b3JsZC5lbWl0dGVyLm9uKCdjb25zb2xlYXBpY2FsbGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zb2xlQVBJQ2FsbGVkKGV2ZW50LnR5cGUsIGV2ZW50LmFyZ3MubWFwKChvYmplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDZHBKU0hhbmRsZSh0aGlzLiN3b3JsZCwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9KSwgZXZlbnQuc3RhY2tUcmFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZGVidWdFcnJvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jY2xpZW50Lm9uKCdSdW50aW1lLmV4Y2VwdGlvblRocm93bicsIGV4Y2VwdGlvblRocm93bik7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbmNlKENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3dvcmxkLmRpc3Bvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFRoaXMgbWlnaHQgZmFpbCBpZiB0aGUgdGFyZ2V0IGlzIGNsb3NlZCBiZWZvcmUgd2UgcmVjZWl2ZSBhbGwgZXhlY3V0aW9uIGNvbnRleHRzLlxuICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnUnVudGltZS5lbmFibGUnKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICB9XG4gICAgbWFpblJlYWxtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jd29ybGQ7XG4gICAgfVxuICAgIGdldCBjbGllbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQ7XG4gICAgfVxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuI3RhcmdldFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVGFyZ2V0VHlwZS5TRVJWSUNFX1dPUktFUjpcbiAgICAgICAgICAgIGNhc2UgVGFyZ2V0VHlwZS5TSEFSRURfV09SS0VSOiB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHNlcnZpY2UgYW5kIHNoYXJlZCB3b3JrZXJzIHdlIG5lZWQgdG8gY2xvc2UgdGhlIHRhcmdldCBhbmQgZGV0YWNoIHRvIGFsbG93XG4gICAgICAgICAgICAgICAgLy8gdGhlIHdvcmtlciB0byBzdG9wLlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LmNvbm5lY3Rpb24oKT8uc2VuZCgnVGFyZ2V0LmNsb3NlVGFyZ2V0Jywge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRJZDogdGhpcy4jaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuY29ubmVjdGlvbigpPy5zZW5kKCdUYXJnZXQuZGV0YWNoRnJvbVRhcmdldCcsIHtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLmNsaWVudC5pZCgpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViV29ya2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL0FjY2Vzc2liaWxpdHkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9BcmlhUXVlcnlIYW5kbGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQmluZGluZy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0Jyb3dzZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Ccm93c2VyQ29ubmVjdG9yLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ0RQU2Vzc2lvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0Nocm9tZVRhcmdldE1hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25uZWN0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ292ZXJhZ2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXZpY2VSZXF1ZXN0UHJvbXB0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRGlhbG9nLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRWxlbWVudEhhbmRsZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0VtdWxhdGlvbk1hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeGVjdXRpb25Db250ZXh0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZW5zaW9uVHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRmlyZWZveFRhcmdldE1hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9GcmFtZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZyYW1lTWFuYWdlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZyYW1lTWFuYWdlckV2ZW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZyYW1lVHJlZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0hUVFBSZXF1ZXN0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSFRUUFJlc3BvbnNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSW5wdXQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Jc29sYXRlZFdvcmxkLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSXNvbGF0ZWRXb3JsZHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0xpZmVjeWNsZVdhdGNoZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9OZXR3b3JrRXZlbnRNYW5hZ2VyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vTmV0d29ya01hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QYWdlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGFyZ2V0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGFyZ2V0TWFuYWdlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1RyYWNpbmcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1dlYldvcmtlci5qcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jZHAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IFB1cHBldGVlclVSTCwgZXZhbHVhdGlvblN0cmluZyB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmFsdWF0aW9uRXJyb3IoZGV0YWlscykge1xuICAgIGxldCBuYW1lO1xuICAgIGxldCBtZXNzYWdlO1xuICAgIGlmICghZGV0YWlscy5leGNlcHRpb24pIHtcbiAgICAgICAgbmFtZSA9ICdFcnJvcic7XG4gICAgICAgIG1lc3NhZ2UgPSBkZXRhaWxzLnRleHQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKChkZXRhaWxzLmV4Y2VwdGlvbi50eXBlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICBkZXRhaWxzLmV4Y2VwdGlvbi5zdWJ0eXBlICE9PSAnZXJyb3InKSAmJlxuICAgICAgICAhZGV0YWlscy5leGNlcHRpb24ub2JqZWN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlRnJvbVJlbW90ZU9iamVjdChkZXRhaWxzLmV4Y2VwdGlvbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBkZXRhaWwgPSBnZXRFcnJvckRldGFpbHMoZGV0YWlscyk7XG4gICAgICAgIG5hbWUgPSBkZXRhaWwubmFtZTtcbiAgICAgICAgbWVzc2FnZSA9IGRldGFpbC5tZXNzYWdlO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlSGVpZ2h0ID0gbWVzc2FnZS5zcGxpdCgnXFxuJykubGVuZ3RoO1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIGVycm9yLm5hbWUgPSBuYW1lO1xuICAgIGNvbnN0IHN0YWNrTGluZXMgPSBlcnJvci5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgY29uc3QgbWVzc2FnZUxpbmVzID0gc3RhY2tMaW5lcy5zcGxpY2UoMCwgbWVzc2FnZUhlaWdodCk7XG4gICAgLy8gVGhlIGZpcnN0IGxpbmUgaXMgdGhpcyBmdW5jdGlvbiB3aGljaCB3ZSBpZ25vcmUuXG4gICAgc3RhY2tMaW5lcy5zaGlmdCgpO1xuICAgIGlmIChkZXRhaWxzLnN0YWNrVHJhY2UgJiYgc3RhY2tMaW5lcy5sZW5ndGggPCBFcnJvci5zdGFja1RyYWNlTGltaXQpIHtcbiAgICAgICAgZm9yIChjb25zdCBmcmFtZSBvZiBkZXRhaWxzLnN0YWNrVHJhY2UuY2FsbEZyYW1lcy5yZXZlcnNlKCkpIHtcbiAgICAgICAgICAgIGlmIChQdXBwZXRlZXJVUkwuaXNQdXBwZXRlZXJVUkwoZnJhbWUudXJsKSAmJlxuICAgICAgICAgICAgICAgIGZyYW1lLnVybCAhPT0gUHVwcGV0ZWVyVVJMLklOVEVSTkFMX1VSTCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IFB1cHBldGVlclVSTC5wYXJzZShmcmFtZS51cmwpO1xuICAgICAgICAgICAgICAgIHN0YWNrTGluZXMudW5zaGlmdChgICAgIGF0ICR7ZnJhbWUuZnVuY3Rpb25OYW1lIHx8IHVybC5mdW5jdGlvbk5hbWV9ICgke3VybC5mdW5jdGlvbk5hbWV9IGF0ICR7dXJsLnNpdGVTdHJpbmd9LCA8YW5vbnltb3VzPjoke2ZyYW1lLmxpbmVOdW1iZXJ9OiR7ZnJhbWUuY29sdW1uTnVtYmVyfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YWNrTGluZXMucHVzaChgICAgIGF0ICR7ZnJhbWUuZnVuY3Rpb25OYW1lIHx8ICc8YW5vbnltb3VzPid9ICgke2ZyYW1lLnVybH06JHtmcmFtZS5saW5lTnVtYmVyfToke2ZyYW1lLmNvbHVtbk51bWJlcn0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhY2tMaW5lcy5sZW5ndGggPj0gRXJyb3Iuc3RhY2tUcmFjZUxpbWl0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXJyb3Iuc3RhY2sgPSBbLi4ubWVzc2FnZUxpbmVzLCAuLi5zdGFja0xpbmVzXS5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gZXJyb3I7XG59XG5jb25zdCBnZXRFcnJvckRldGFpbHMgPSAoZGV0YWlscykgPT4ge1xuICAgIGxldCBuYW1lID0gJyc7XG4gICAgbGV0IG1lc3NhZ2U7XG4gICAgY29uc3QgbGluZXMgPSBkZXRhaWxzLmV4Y2VwdGlvbj8uZGVzY3JpcHRpb24/LnNwbGl0KCdcXG4gICAgYXQgJykgPz8gW107XG4gICAgY29uc3Qgc2l6ZSA9IE1hdGgubWluKGRldGFpbHMuc3RhY2tUcmFjZT8uY2FsbEZyYW1lcy5sZW5ndGggPz8gMCwgbGluZXMubGVuZ3RoIC0gMSk7XG4gICAgbGluZXMuc3BsaWNlKC1zaXplLCBzaXplKTtcbiAgICBpZiAoZGV0YWlscy5leGNlcHRpb24/LmNsYXNzTmFtZSkge1xuICAgICAgICBuYW1lID0gZGV0YWlscy5leGNlcHRpb24uY2xhc3NOYW1lO1xuICAgIH1cbiAgICBtZXNzYWdlID0gbGluZXMuam9pbignXFxuJyk7XG4gICAgaWYgKG5hbWUgJiYgbWVzc2FnZS5zdGFydHNXaXRoKGAke25hbWV9OiBgKSkge1xuICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5zbGljZShuYW1lLmxlbmd0aCArIDIpO1xuICAgIH1cbiAgICByZXR1cm4geyBtZXNzYWdlLCBuYW1lIH07XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNsaWVudEVycm9yKGRldGFpbHMpIHtcbiAgICBsZXQgbmFtZTtcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBpZiAoIWRldGFpbHMuZXhjZXB0aW9uKSB7XG4gICAgICAgIG5hbWUgPSAnRXJyb3InO1xuICAgICAgICBtZXNzYWdlID0gZGV0YWlscy50ZXh0O1xuICAgIH1cbiAgICBlbHNlIGlmICgoZGV0YWlscy5leGNlcHRpb24udHlwZSAhPT0gJ29iamVjdCcgfHxcbiAgICAgICAgZGV0YWlscy5leGNlcHRpb24uc3VidHlwZSAhPT0gJ2Vycm9yJykgJiZcbiAgICAgICAgIWRldGFpbHMuZXhjZXB0aW9uLm9iamVjdElkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZUZyb21SZW1vdGVPYmplY3QoZGV0YWlscy5leGNlcHRpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZGV0YWlsID0gZ2V0RXJyb3JEZXRhaWxzKGRldGFpbHMpO1xuICAgICAgICBuYW1lID0gZGV0YWlsLm5hbWU7XG4gICAgICAgIG1lc3NhZ2UgPSBkZXRhaWwubWVzc2FnZTtcbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgZXJyb3IubmFtZSA9IG5hbWU7XG4gICAgY29uc3QgbWVzc2FnZUhlaWdodCA9IGVycm9yLm1lc3NhZ2Uuc3BsaXQoJ1xcbicpLmxlbmd0aDtcbiAgICBjb25zdCBtZXNzYWdlTGluZXMgPSBlcnJvci5zdGFjay5zcGxpdCgnXFxuJykuc3BsaWNlKDAsIG1lc3NhZ2VIZWlnaHQpO1xuICAgIGNvbnN0IHN0YWNrTGluZXMgPSBbXTtcbiAgICBpZiAoZGV0YWlscy5zdGFja1RyYWNlKSB7XG4gICAgICAgIGZvciAoY29uc3QgZnJhbWUgb2YgZGV0YWlscy5zdGFja1RyYWNlLmNhbGxGcmFtZXMpIHtcbiAgICAgICAgICAgIC8vIE5vdGUgd2UgbmVlZCB0byBhZGQgYDFgIGJlY2F1c2UgdGhlIHZhbHVlcyBhcmUgMC1pbmRleGVkLlxuICAgICAgICAgICAgc3RhY2tMaW5lcy5wdXNoKGAgICAgYXQgJHtmcmFtZS5mdW5jdGlvbk5hbWUgfHwgJzxhbm9ueW1vdXM+J30gKCR7ZnJhbWUudXJsfToke2ZyYW1lLmxpbmVOdW1iZXIgKyAxfToke2ZyYW1lLmNvbHVtbk51bWJlciArIDF9KWApO1xuICAgICAgICAgICAgaWYgKHN0YWNrTGluZXMubGVuZ3RoID49IEVycm9yLnN0YWNrVHJhY2VMaW1pdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVycm9yLnN0YWNrID0gWy4uLm1lc3NhZ2VMaW5lcywgLi4uc3RhY2tMaW5lc10uam9pbignXFxuJyk7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlRnJvbVJlbW90ZU9iamVjdChyZW1vdGVPYmplY3QpIHtcbiAgICBhc3NlcnQoIXJlbW90ZU9iamVjdC5vYmplY3RJZCwgJ0Nhbm5vdCBleHRyYWN0IHZhbHVlIHdoZW4gb2JqZWN0SWQgaXMgZ2l2ZW4nKTtcbiAgICBpZiAocmVtb3RlT2JqZWN0LnVuc2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgaWYgKHJlbW90ZU9iamVjdC50eXBlID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChyZW1vdGVPYmplY3QudW5zZXJpYWxpemFibGVWYWx1ZS5yZXBsYWNlKCduJywgJycpKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHJlbW90ZU9iamVjdC51bnNlcmlhbGl6YWJsZVZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlICctMCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0wO1xuICAgICAgICAgICAgY2FzZSAnTmFOJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgICAgY2FzZSAnSW5maW5pdHknOlxuICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgIGNhc2UgJy1JbmZpbml0eSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB1bnNlcmlhbGl6YWJsZSB2YWx1ZTogJyArXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZU9iamVjdC51bnNlcmlhbGl6YWJsZVZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVtb3RlT2JqZWN0LnZhbHVlO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFBhZ2VCaW5kaW5nKHR5cGUsIG5hbWUsIHByZWZpeCkge1xuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgZnJhbWUgbG9hZGluZyBzdGF0ZSBlaXRoZXIgUnVudGltZS5ldmFsdWF0ZSBvclxuICAgIC8vIFBhZ2UuYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQgbWlnaHQgc3VjY2VlZC4gTGV0J3MgY2hlY2sgdGhhdCB3ZVxuICAgIC8vIGRvbid0IHJlLXdyYXAgUHVwcGV0ZWVyJ3MgYmluZGluZy5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBJbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgIGlmIChnbG9iYWxUaGlzW25hbWVdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gV2UgcmVwbGFjZSB0aGUgQ0RQIGJpbmRpbmcgd2l0aCBhIFB1cHBldGVlciBiaW5kaW5nLlxuICAgIE9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywge1xuICAgICAgICBbbmFtZV0oLi4uYXJncykge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgUHVwcGV0ZWVyIGJpbmRpbmcuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBJbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgICAgICAgICAgY29uc3QgY2FsbFB1cHBldGVlciA9IGdsb2JhbFRoaXNbbmFtZV07XG4gICAgICAgICAgICBjYWxsUHVwcGV0ZWVyLmFyZ3MgPz89IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNhbGxQdXBwZXRlZXIuY2FsbGJhY2tzID8/PSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBzZXEgPSAoY2FsbFB1cHBldGVlci5sYXN0U2VxID8/IDApICsgMTtcbiAgICAgICAgICAgIGNhbGxQdXBwZXRlZXIubGFzdFNlcSA9IHNlcTtcbiAgICAgICAgICAgIGNhbGxQdXBwZXRlZXIuYXJncy5zZXQoc2VxLCBhcmdzKTtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IEluIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gICAgICAgICAgICAvLyBOZWVkcyB0byBiZSB0aGUgc2FtZSBhcyBDRFBfQklORElOR19QUkVGSVguXG4gICAgICAgICAgICBnbG9iYWxUaGlzW3ByZWZpeCArIG5hbWVdKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgaXNUcml2aWFsOiAhYXJncy5zb21lKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgTm9kZTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbFB1cHBldGVlci5jYWxsYmFja3Muc2V0KHNlcSwge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUHVwcGV0ZWVyLmFyZ3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUHVwcGV0ZWVyLmFyZ3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ0RQX0JJTkRJTkdfUFJFRklYID0gJ3B1cHBldGVlcl8nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZ2VCaW5kaW5nSW5pdFN0cmluZyh0eXBlLCBuYW1lKSB7XG4gICAgcmV0dXJuIGV2YWx1YXRpb25TdHJpbmcoYWRkUGFnZUJpbmRpbmcsIHR5cGUsIG5hbWUsIENEUF9CSU5ESU5HX1BSRUZJWCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgX2Nvbm5lY3RUb0JpRGlCcm93c2VyIH0gZnJvbSAnLi4vYmlkaS9Ccm93c2VyQ29ubmVjdG9yLmpzJztcbmltcG9ydCB7IF9jb25uZWN0VG9DZHBCcm93c2VyIH0gZnJvbSAnLi4vY2RwL0Jyb3dzZXJDb25uZWN0b3IuanMnO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi4vZW52aXJvbm1lbnQuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG5jb25zdCBnZXRXZWJTb2NrZXRUcmFuc3BvcnRDbGFzcyA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gaXNOb2RlXG4gICAgICAgID8gKGF3YWl0IGltcG9ydCgnLi4vbm9kZS9Ob2RlV2ViU29ja2V0VHJhbnNwb3J0LmpzJykpLk5vZGVXZWJTb2NrZXRUcmFuc3BvcnRcbiAgICAgICAgOiAoYXdhaXQgaW1wb3J0KCcuLi9jb21tb24vQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydC5qcycpKVxuICAgICAgICAgICAgLkJyb3dzZXJXZWJTb2NrZXRUcmFuc3BvcnQ7XG59O1xuLyoqXG4gKiBVc2VycyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIGRpcmVjdGx5OyBpdCdzIGNhbGxlZCB3aGVuIGNhbGxpbmdcbiAqIGBwdXBwZXRlZXIuY29ubmVjdGAuIFRoaXMgbWV0aG9kIGF0dGFjaGVzIFB1cHBldGVlciB0byBhbiBleGlzdGluZyBicm93c2VyIGluc3RhbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2Nvbm5lY3RUb0Jyb3dzZXIob3B0aW9ucykge1xuICAgIGNvbnN0IHsgY29ubmVjdGlvblRyYW5zcG9ydCwgZW5kcG9pbnRVcmwgfSA9IGF3YWl0IGdldENvbm5lY3Rpb25UcmFuc3BvcnQob3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMucHJvdG9jb2wgPT09ICd3ZWJEcml2ZXJCaURpJykge1xuICAgICAgICBjb25zdCBiaWRpQnJvd3NlciA9IGF3YWl0IF9jb25uZWN0VG9CaURpQnJvd3Nlcihjb25uZWN0aW9uVHJhbnNwb3J0LCBlbmRwb2ludFVybCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBiaWRpQnJvd3NlcjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGNkcEJyb3dzZXIgPSBhd2FpdCBfY29ubmVjdFRvQ2RwQnJvd3Nlcihjb25uZWN0aW9uVHJhbnNwb3J0LCBlbmRwb2ludFVybCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBjZHBCcm93c2VyO1xuICAgIH1cbn1cbi8qKlxuICogRXN0YWJsaXNoZXMgYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiBieSBnaXZlbiBvcHRpb25zIGFuZCByZXR1cm5zIGJvdGggdHJhbnNwb3J0IGFuZFxuICogZW5kcG9pbnQgdXJsIHRoZSB0cmFuc3BvcnQgaXMgY29ubmVjdGVkIHRvLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDb25uZWN0aW9uVHJhbnNwb3J0KG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGJyb3dzZXJXU0VuZHBvaW50LCBicm93c2VyVVJMLCB0cmFuc3BvcnQsIGhlYWRlcnMgPSB7fSB9ID0gb3B0aW9ucztcbiAgICBhc3NlcnQoTnVtYmVyKCEhYnJvd3NlcldTRW5kcG9pbnQpICsgTnVtYmVyKCEhYnJvd3NlclVSTCkgKyBOdW1iZXIoISF0cmFuc3BvcnQpID09PVxuICAgICAgICAxLCAnRXhhY3RseSBvbmUgb2YgYnJvd3NlcldTRW5kcG9pbnQsIGJyb3dzZXJVUkwgb3IgdHJhbnNwb3J0IG11c3QgYmUgcGFzc2VkIHRvIHB1cHBldGVlci5jb25uZWN0Jyk7XG4gICAgaWYgKHRyYW5zcG9ydCkge1xuICAgICAgICByZXR1cm4geyBjb25uZWN0aW9uVHJhbnNwb3J0OiB0cmFuc3BvcnQsIGVuZHBvaW50VXJsOiAnJyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChicm93c2VyV1NFbmRwb2ludCkge1xuICAgICAgICBjb25zdCBXZWJTb2NrZXRDbGFzcyA9IGF3YWl0IGdldFdlYlNvY2tldFRyYW5zcG9ydENsYXNzKCk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25UcmFuc3BvcnQgPSBhd2FpdCBXZWJTb2NrZXRDbGFzcy5jcmVhdGUoYnJvd3NlcldTRW5kcG9pbnQsIGhlYWRlcnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29ubmVjdGlvblRyYW5zcG9ydDogY29ubmVjdGlvblRyYW5zcG9ydCxcbiAgICAgICAgICAgIGVuZHBvaW50VXJsOiBicm93c2VyV1NFbmRwb2ludCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnJvd3NlclVSTCkge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uVVJMID0gYXdhaXQgZ2V0V1NFbmRwb2ludChicm93c2VyVVJMKTtcbiAgICAgICAgY29uc3QgV2ViU29ja2V0Q2xhc3MgPSBhd2FpdCBnZXRXZWJTb2NrZXRUcmFuc3BvcnRDbGFzcygpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uVHJhbnNwb3J0ID0gYXdhaXQgV2ViU29ja2V0Q2xhc3MuY3JlYXRlKGNvbm5lY3Rpb25VUkwpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29ubmVjdGlvblRyYW5zcG9ydDogY29ubmVjdGlvblRyYW5zcG9ydCxcbiAgICAgICAgICAgIGVuZHBvaW50VXJsOiBjb25uZWN0aW9uVVJMLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29ubmVjdGlvbiBvcHRpb25zJyk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRXU0VuZHBvaW50KGJyb3dzZXJVUkwpIHtcbiAgICBjb25zdCBlbmRwb2ludFVSTCA9IG5ldyBVUkwoJy9qc29uL3ZlcnNpb24nLCBicm93c2VyVVJMKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnbG9iYWxUaGlzLmZldGNoKGVuZHBvaW50VVJMLnRvU3RyaW5nKCksIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzdWx0LnN0YXR1c1RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3VsdC5qc29uKCk7XG4gICAgICAgIHJldHVybiBkYXRhLndlYlNvY2tldERlYnVnZ2VyVXJsO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGlzRXJyb3JMaWtlKGVycm9yKSkge1xuICAgICAgICAgICAgZXJyb3IubWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCBicm93c2VyIHdlYlNvY2tldCBVUkwgZnJvbSAke2VuZHBvaW50VVJMfTogYCArXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckNvbm5lY3Rvci5qcy5tYXAiLCIvKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydCB7XG4gICAgc3RhdGljIGNyZWF0ZSh1cmwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh1cmwpO1xuICAgICAgICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShuZXcgQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydCh3cykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAjd3M7XG4gICAgb25tZXNzYWdlO1xuICAgIG9uY2xvc2U7XG4gICAgY29uc3RydWN0b3Iod3MpIHtcbiAgICAgICAgdGhpcy4jd3MgPSB3cztcbiAgICAgICAgdGhpcy4jd3MuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9ubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25tZXNzYWdlLmNhbGwobnVsbCwgZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN3cy5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uY2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2xvc2UuY2FsbChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSBhbGwgZXJyb3JzIC0gd2UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggdGhlbS5cbiAgICAgICAgdGhpcy4jd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7IH0pO1xuICAgIH1cbiAgICBzZW5kKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy4jd3Muc2VuZChtZXNzYWdlKTtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuI3dzLmNsb3NlKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9RdWVyeUhhbmRsZXIuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENTU1F1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3IgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgY3NzUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjc3NRdWVyeVNlbGVjdG9yKGVsZW1lbnQsIHNlbGVjdG9yKTtcbiAgICB9O1xuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yQWxsID0gKGVsZW1lbnQsIHNlbGVjdG9yLCB7IGNzc1F1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY3NzUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNTU1F1ZXJ5SGFuZGxlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IHJld3JpdGVFcnJvciB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IFByb3RvY29sRXJyb3IsIFRhcmdldENsb3NlRXJyb3IgfSBmcm9tICcuL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi91dGlsLmpzJztcbi8qKlxuICogTWFuYWdlcyBjYWxsYmFja3MgYW5kIHRoZWlyIElEcyBmb3IgdGhlIHByb3RvY29sIHJlcXVlc3QvcmVzcG9uc2UgY29tbXVuaWNhdGlvbi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxiYWNrUmVnaXN0cnkge1xuICAgICNjYWxsYmFja3MgPSBuZXcgTWFwKCk7XG4gICAgI2lkR2VuZXJhdG9yID0gY3JlYXRlSW5jcmVtZW50YWxJZEdlbmVyYXRvcigpO1xuICAgIGNyZWF0ZShsYWJlbCwgdGltZW91dCwgcmVxdWVzdCkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IG5ldyBDYWxsYmFjayh0aGlzLiNpZEdlbmVyYXRvcigpLCBsYWJlbCwgdGltZW91dCk7XG4gICAgICAgIHRoaXMuI2NhbGxiYWNrcy5zZXQoY2FsbGJhY2suaWQsIGNhbGxiYWNrKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QoY2FsbGJhY2suaWQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gV2Ugc3RpbGwgdGhyb3cgc3luYyBlcnJvcnMgc3luY2hyb25vdXNseSBhbmQgY2xlYW4gdXAgdGhlIHNjaGVkdWxlZFxuICAgICAgICAgICAgLy8gY2FsbGJhY2suXG4gICAgICAgICAgICBjYWxsYmFjay5wcm9taXNlLmNhdGNoKGRlYnVnRXJyb3IpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2suaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYWxsYmFjay5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTXVzdCBvbmx5IGhhdmUgc3luYyBjb2RlIHVwIHVudGlsIGhlcmUuXG4gICAgICAgIHJldHVybiBjYWxsYmFjay5wcm9taXNlLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jY2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjay5pZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWplY3QoaWQsIG1lc3NhZ2UsIG9yaWdpbmFsTWVzc2FnZSkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuI2NhbGxiYWNrcy5nZXQoaWQpO1xuICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVqZWN0KGNhbGxiYWNrLCBtZXNzYWdlLCBvcmlnaW5hbE1lc3NhZ2UpO1xuICAgIH1cbiAgICBfcmVqZWN0KGNhbGxiYWNrLCBlcnJvck1lc3NhZ2UsIG9yaWdpbmFsTWVzc2FnZSkge1xuICAgICAgICBsZXQgZXJyb3I7XG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlIGluc3RhbmNlb2YgUHJvdG9jb2xFcnJvcikge1xuICAgICAgICAgICAgZXJyb3IgPSBlcnJvck1lc3NhZ2U7XG4gICAgICAgICAgICBlcnJvci5jYXVzZSA9IGNhbGxiYWNrLmVycm9yO1xuICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IgPSBjYWxsYmFjay5lcnJvcjtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2sucmVqZWN0KHJld3JpdGVFcnJvcihlcnJvciwgYFByb3RvY29sIGVycm9yICgke2NhbGxiYWNrLmxhYmVsfSk6ICR7bWVzc2FnZX1gLCBvcmlnaW5hbE1lc3NhZ2UpKTtcbiAgICB9XG4gICAgcmVzb2x2ZShpZCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLiNjYWxsYmFja3MuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrLnJlc29sdmUodmFsdWUpO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLiNjYWxsYmFja3MudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHByb2JhYmx5IHdlIGNhbiBhY2NlcHQgZXJyb3IgbWVzc2FnZXMgYXMgcGFyYW1zLlxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0KGNhbGxiYWNrLCBuZXcgVGFyZ2V0Q2xvc2VFcnJvcignVGFyZ2V0IGNsb3NlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNjYWxsYmFja3MuY2xlYXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLiNjYWxsYmFja3MudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBFcnJvcihgJHtjYWxsYmFjay5sYWJlbH0gdGltZWQgb3V0LiBUcmFjZTogJHtjYWxsYmFjay5lcnJvci5zdGFja31gKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2FsbGJhY2sge1xuICAgICNpZDtcbiAgICAjZXJyb3IgPSBuZXcgUHJvdG9jb2xFcnJvcigpO1xuICAgICNkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICN0aW1lcjtcbiAgICAjbGFiZWw7XG4gICAgY29uc3RydWN0b3IoaWQsIGxhYmVsLCB0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuI2lkID0gaWQ7XG4gICAgICAgIHRoaXMuI2xhYmVsID0gbGFiZWw7XG4gICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgICB0aGlzLiN0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2RlZmVycmVkLnJlamVjdChyZXdyaXRlRXJyb3IodGhpcy4jZXJyb3IsIGAke2xhYmVsfSB0aW1lZCBvdXQuIEluY3JlYXNlIHRoZSAncHJvdG9jb2xUaW1lb3V0JyBzZXR0aW5nIGluIGxhdW5jaC9jb25uZWN0IGNhbGxzIGZvciBhIGhpZ2hlciB0aW1lb3V0IGlmIG5lZWRlZC5gKSk7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0aW1lcik7XG4gICAgICAgIHRoaXMuI2RlZmVycmVkLnJlc29sdmUodmFsdWUpO1xuICAgIH1cbiAgICByZWplY3QoZXJyb3IpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3RpbWVyKTtcbiAgICAgICAgdGhpcy4jZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaWQ7XG4gICAgfVxuICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGVmZXJyZWQudmFsdWVPclRocm93KCk7XG4gICAgfVxuICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Vycm9yO1xuICAgIH1cbiAgICBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYWJlbDtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5jcmVtZW50YWxJZEdlbmVyYXRvcigpIHtcbiAgICBsZXQgaWQgPSAwO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHJldHVybiArK2lkO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYWxsYmFja1JlZ2lzdHJ5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25maWd1cmF0aW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25uZWN0T3B0aW9ucy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvblRyYW5zcG9ydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBDb25zb2xlTWVzc2FnZSBvYmplY3RzIGFyZSBkaXNwYXRjaGVkIGJ5IHBhZ2UgdmlhIHRoZSAnY29uc29sZScgZXZlbnQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25zb2xlTWVzc2FnZSB7XG4gICAgI3R5cGU7XG4gICAgI3RleHQ7XG4gICAgI2FyZ3M7XG4gICAgI3N0YWNrVHJhY2VMb2NhdGlvbnM7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZSwgdGV4dCwgYXJncywgc3RhY2tUcmFjZUxvY2F0aW9ucykge1xuICAgICAgICB0aGlzLiN0eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy4jdGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuI2FyZ3MgPSBhcmdzO1xuICAgICAgICB0aGlzLiNzdGFja1RyYWNlTG9jYXRpb25zID0gc3RhY2tUcmFjZUxvY2F0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGNvbnNvbGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHRleHQgb2YgdGhlIGNvbnNvbGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICB0ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgY29uc29sZS5cbiAgICAgKi9cbiAgICBhcmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYXJncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBjb25zb2xlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgbG9jYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGFja1RyYWNlTG9jYXRpb25zWzBdID8/IHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYXJyYXkgb2YgbG9jYXRpb25zIG9uIHRoZSBzdGFjayBvZiB0aGUgY29uc29sZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIHN0YWNrVHJhY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGFja1RyYWNlTG9jYXRpb25zO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnNvbGVNZXNzYWdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db29raWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IGludGVycG9sYXRlRnVuY3Rpb24sIHN0cmluZ2lmeUZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbC9GdW5jdGlvbi5qcyc7XG5pbXBvcnQgeyBRdWVyeUhhbmRsZXIsIH0gZnJvbSAnLi9RdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgc2NyaXB0SW5qZWN0b3IgfSBmcm9tICcuL1NjcmlwdEluamVjdG9yLmpzJztcbi8qKlxuICogVGhlIHJlZ2lzdHJ5IG9mIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBjdXN0b20gcXVlcnkgaGFuZGxlcnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIFB1cHBldGVlci5jdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKCdsaXQnLCB7IOKApiB9KTtcbiAqIGNvbnN0IGFIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJ2xpdC/igKYnKTtcbiAqIGBgYFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ3VzdG9tUXVlcnlIYW5kbGVyUmVnaXN0cnkge1xuICAgICNoYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBnZXQobmFtZSkge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy4jaGFuZGxlcnMuZ2V0KG5hbWUpO1xuICAgICAgICByZXR1cm4gaGFuZGxlciA/IGhhbmRsZXJbMV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBjdXN0b20gcXVlcnkgaGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFmdGVyIHJlZ2lzdHJhdGlvbiwgdGhlIGhhbmRsZXIgY2FuIGJlIHVzZWQgZXZlcnl3aGVyZSB3aGVyZSBhIHNlbGVjdG9yIGlzXG4gICAgICogZXhwZWN0ZWQgYnkgcHJlcGVuZGluZyB0aGUgc2VsZWN0aW9uIHN0cmluZyB3aXRoIGA8bmFtZT4vYC4gVGhlIG5hbWUgaXNcbiAgICAgKiBvbmx5IGFsbG93ZWQgdG8gY29uc2lzdCBvZiBsb3dlci0gYW5kIHVwcGVyIGNhc2UgbGF0aW4gbGV0dGVycy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIFB1cHBldGVlci5jdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKCdsaXQnLCB7IOKApiB9KTtcbiAgICAgKiBjb25zdCBhSGFuZGxlID0gYXdhaXQgcGFnZS4kKCdsaXQv4oCmJyk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgdG8gcmVnaXN0ZXIgdW5kZXIuXG4gICAgICogQHBhcmFtIHF1ZXJ5SGFuZGxlciAtIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBDdXN0b20gcXVlcnkgaGFuZGxlcn0gdG9cbiAgICAgKiByZWdpc3Rlci5cbiAgICAgKi9cbiAgICByZWdpc3RlcihuYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlcnMuaGFzKG5hbWUpLCBgQ2Fubm90IHJlZ2lzdGVyIG92ZXIgZXhpc3RpbmcgaGFuZGxlcjogJHtuYW1lfWApO1xuICAgICAgICBhc3NlcnQoL15bYS16QS1aXSskLy50ZXN0KG5hbWUpLCBgQ3VzdG9tIHF1ZXJ5IGhhbmRsZXIgbmFtZXMgbWF5IG9ubHkgY29udGFpbiBbYS16QS1aXWApO1xuICAgICAgICBhc3NlcnQoaGFuZGxlci5xdWVyeUFsbCB8fCBoYW5kbGVyLnF1ZXJ5T25lLCBgQXQgbGVhc3Qgb25lIHF1ZXJ5IG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkLmApO1xuICAgICAgICBjb25zdCBIYW5kbGVyID0gY2xhc3MgZXh0ZW5kcyBRdWVyeUhhbmRsZXIge1xuICAgICAgICAgICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JBbGwgPSBpbnRlcnBvbGF0ZUZ1bmN0aW9uKChub2RlLCBzZWxlY3RvciwgUHVwcGV0ZWVyVXRpbCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQdXBwZXRlZXJVdGlsLmN1c3RvbVF1ZXJ5U2VsZWN0b3JzXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoUExBQ0VIT0xERVIoJ25hbWUnKSlcbiAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwobm9kZSwgc2VsZWN0b3IpO1xuICAgICAgICAgICAgfSwgeyBuYW1lOiBKU09OLnN0cmluZ2lmeShuYW1lKSB9KTtcbiAgICAgICAgICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yID0gaW50ZXJwb2xhdGVGdW5jdGlvbigobm9kZSwgc2VsZWN0b3IsIFB1cHBldGVlclV0aWwpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHVwcGV0ZWVyVXRpbC5jdXN0b21RdWVyeVNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICAuZ2V0KFBMQUNFSE9MREVSKCduYW1lJykpXG4gICAgICAgICAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKG5vZGUsIHNlbGVjdG9yKTtcbiAgICAgICAgICAgIH0sIHsgbmFtZTogSlNPTi5zdHJpbmdpZnkobmFtZSkgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyU2NyaXB0ID0gaW50ZXJwb2xhdGVGdW5jdGlvbigoUHVwcGV0ZWVyVXRpbCkgPT4ge1xuICAgICAgICAgICAgUHVwcGV0ZWVyVXRpbC5jdXN0b21RdWVyeVNlbGVjdG9ycy5yZWdpc3RlcihQTEFDRUhPTERFUignbmFtZScpLCB7XG4gICAgICAgICAgICAgICAgcXVlcnlBbGw6IFBMQUNFSE9MREVSKCdxdWVyeUFsbCcpLFxuICAgICAgICAgICAgICAgIHF1ZXJ5T25lOiBQTEFDRUhPTERFUigncXVlcnlPbmUnKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBuYW1lOiBKU09OLnN0cmluZ2lmeShuYW1lKSxcbiAgICAgICAgICAgIHF1ZXJ5QWxsOiBoYW5kbGVyLnF1ZXJ5QWxsXG4gICAgICAgICAgICAgICAgPyBzdHJpbmdpZnlGdW5jdGlvbihoYW5kbGVyLnF1ZXJ5QWxsKVxuICAgICAgICAgICAgICAgIDogU3RyaW5nKHVuZGVmaW5lZCksXG4gICAgICAgICAgICBxdWVyeU9uZTogaGFuZGxlci5xdWVyeU9uZVxuICAgICAgICAgICAgICAgID8gc3RyaW5naWZ5RnVuY3Rpb24oaGFuZGxlci5xdWVyeU9uZSlcbiAgICAgICAgICAgICAgICA6IFN0cmluZyh1bmRlZmluZWQpLFxuICAgICAgICB9KS50b1N0cmluZygpO1xuICAgICAgICB0aGlzLiNoYW5kbGVycy5zZXQobmFtZSwgW3JlZ2lzdGVyU2NyaXB0LCBIYW5kbGVyXSk7XG4gICAgICAgIHNjcmlwdEluamVjdG9yLmFwcGVuZChyZWdpc3RlclNjcmlwdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIHRoZSB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJ9IGZvciB0aGVcbiAgICAgKiBnaXZlbiBuYW1lLlxuICAgICAqXG4gICAgICogQHRocm93cyBgRXJyb3JgIGlmIHRoZXJlIGlzIG5vIGhhbmRsZXIgdW5kZXIgdGhlIGdpdmVuIG5hbWUuXG4gICAgICovXG4gICAgdW5yZWdpc3RlcihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLiNoYW5kbGVycy5nZXQobmFtZSk7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdW5yZWdpc3RlciB1bmtub3duIGhhbmRsZXI6ICR7bmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBzY3JpcHRJbmplY3Rvci5wb3AoaGFuZGxlclswXSk7XG4gICAgICAgIHRoaXMuI2hhbmRsZXJzLmRlbGV0ZShuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBjdXN0b20gcXVlcnkgaGFuZGxlcnN9LlxuICAgICAqL1xuICAgIG5hbWVzKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuI2hhbmRsZXJzLmtleXMoKV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIGFsbCBjdXN0b20gcXVlcnkgaGFuZGxlcnMuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3JlZ2lzdGVyU2NyaXB0XSBvZiB0aGlzLiNoYW5kbGVycykge1xuICAgICAgICAgICAgc2NyaXB0SW5qZWN0b3IucG9wKHJlZ2lzdGVyU2NyaXB0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNoYW5kbGVycy5jbGVhcigpO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21RdWVyeUhhbmRsZXJzID0gbmV3IEN1c3RvbVF1ZXJ5SGFuZGxlclJlZ2lzdHJ5KCk7XG4vKipcbiAqIEBkZXByZWNhdGVkIEltcG9ydCB7QGxpbmsgUHVwcGV0ZWVyfSBhbmQgdXNlIHRoZSBzdGF0aWMgbWV0aG9kXG4gKiB7QGxpbmsgUHVwcGV0ZWVyLnJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyfVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBjdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKG5hbWUsIGhhbmRsZXIpO1xufVxuLyoqXG4gKiBAZGVwcmVjYXRlZCBJbXBvcnQge0BsaW5rIFB1cHBldGVlcn0gYW5kIHVzZSB0aGUgc3RhdGljIG1ldGhvZFxuICoge0BsaW5rIFB1cHBldGVlci51bnJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyfVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJDdXN0b21RdWVyeUhhbmRsZXIobmFtZSkge1xuICAgIGN1c3RvbVF1ZXJ5SGFuZGxlcnMudW5yZWdpc3RlcihuYW1lKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgSW1wb3J0IHtAbGluayBQdXBwZXRlZXJ9IGFuZCB1c2UgdGhlIHN0YXRpYyBtZXRob2RcbiAqIHtAbGluayBQdXBwZXRlZXIuY3VzdG9tUXVlcnlIYW5kbGVyTmFtZXN9XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tUXVlcnlIYW5kbGVyTmFtZXMoKSB7XG4gICAgcmV0dXJuIGN1c3RvbVF1ZXJ5SGFuZGxlcnMubmFtZXMoKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgSW1wb3J0IHtAbGluayBQdXBwZXRlZXJ9IGFuZCB1c2UgdGhlIHN0YXRpYyBtZXRob2RcbiAqIHtAbGluayBQdXBwZXRlZXIuY2xlYXJDdXN0b21RdWVyeUhhbmRsZXJzfVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQ3VzdG9tUXVlcnlIYW5kbGVycygpIHtcbiAgICBjdXN0b21RdWVyeUhhbmRsZXJzLmNsZWFyKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdXN0b21RdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gJy4uL2Vudmlyb25tZW50LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBkZWJ1Z01vZHVsZSA9IG51bGw7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RGVidWcoKSB7XG4gICAgaWYgKCFkZWJ1Z01vZHVsZSkge1xuICAgICAgICBkZWJ1Z01vZHVsZSA9IChhd2FpdCBpbXBvcnQoJ2RlYnVnJykpLmRlZmF1bHQ7XG4gICAgfVxuICAgIHJldHVybiBkZWJ1Z01vZHVsZTtcbn1cbi8qKlxuICogQSBkZWJ1ZyBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGFueSBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgdXNlZCBpbiBOb2RlLCBpdCBmYWxscyBiYWNrIHRvIHRoZVxuICoge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2RlYnVnIHwgZGVidWcgbW9kdWxlfS4gSW4gdGhlIGJyb3dzZXIgaXRcbiAqIHVzZXMgYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBJbiBOb2RlLCB1c2UgdGhlIGBERUJVR2AgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gY29udHJvbCBsb2dnaW5nOlxuICpcbiAqIGBgYFxuICogREVCVUc9KiAvLyBsb2dzIGFsbCBjaGFubmVsc1xuICogREVCVUc9Zm9vIC8vIGxvZ3MgdGhlIGBmb29gIGNoYW5uZWxcbiAqIERFQlVHPWZvbyogLy8gbG9ncyBhbnkgY2hhbm5lbHMgc3RhcnRpbmcgd2l0aCBgZm9vYFxuICogYGBgXG4gKlxuICogSW4gdGhlIGJyb3dzZXIsIHNldCBgd2luZG93Ll9fUFVQUEVURUVSX0RFQlVHYCB0byBhIHN0cmluZzpcbiAqXG4gKiBgYGBcbiAqIHdpbmRvdy5fX1BVUFBFVEVFUl9ERUJVRz0nKic7IC8vIGxvZ3MgYWxsIGNoYW5uZWxzXG4gKiB3aW5kb3cuX19QVVBQRVRFRVJfREVCVUc9J2Zvbyc7IC8vIGxvZ3MgdGhlIGBmb29gIGNoYW5uZWxcbiAqIHdpbmRvdy5fX1BVUFBFVEVFUl9ERUJVRz0nZm9vKic7IC8vIGxvZ3MgYW55IGNoYW5uZWxzIHN0YXJ0aW5nIHdpdGggYGZvb2BcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgXG4gKiBjb25zdCBsb2cgPSBkZWJ1ZygnUGFnZScpO1xuICpcbiAqIGxvZygnbmV3IHBhZ2UgY3JlYXRlZCcpXG4gKiAvLyBsb2dzIFwiUGFnZTogbmV3IHBhZ2UgY3JlYXRlZFwiXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHJlZml4IC0gdGhpcyB3aWxsIGJlIHByZWZpeGVkIHRvIGVhY2ggbG9nLlxuICogQHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gbG9nIHRvIHRoYXQgZGVidWcgY2hhbm5lbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGRlYnVnID0gKHByZWZpeCkgPT4ge1xuICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jICguLi5sb2dBcmdzKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2FwdHVyZUxvZ3MpIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlZExvZ3MucHVzaChwcmVmaXggKyBsb2dBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChhd2FpdCBpbXBvcnREZWJ1ZygpKShwcmVmaXgpKGxvZ0FyZ3MpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gKC4uLmxvZ0FyZ3MpID0+IHtcbiAgICAgICAgY29uc3QgZGVidWdMZXZlbCA9IGdsb2JhbFRoaXMuX19QVVBQRVRFRVJfREVCVUc7XG4gICAgICAgIGlmICghZGVidWdMZXZlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZXJ5dGhpbmdTaG91bGRCZUxvZ2dlZCA9IGRlYnVnTGV2ZWwgPT09ICcqJztcbiAgICAgICAgY29uc3QgcHJlZml4TWF0Y2hlc0RlYnVnTGV2ZWwgPSBldmVyeXRoaW5nU2hvdWxkQmVMb2dnZWQgfHxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSWYgdGhlIGRlYnVnIGxldmVsIGlzIGBmb28qYCwgdGhhdCBtZWFucyB3ZSBtYXRjaCBhbnkgcHJlZml4IHRoYXRcbiAgICAgICAgICAgICAqIHN0YXJ0cyB3aXRoIGBmb29gLiBJZiB0aGUgbGV2ZWwgaXMgYGZvb2AsIHdlIG1hdGNoIG9ubHkgdGhlIHByZWZpeFxuICAgICAgICAgICAgICogYGZvb2AuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIChkZWJ1Z0xldmVsLmVuZHNXaXRoKCcqJylcbiAgICAgICAgICAgICAgICA/IHByZWZpeC5zdGFydHNXaXRoKGRlYnVnTGV2ZWwpXG4gICAgICAgICAgICAgICAgOiBwcmVmaXggPT09IGRlYnVnTGV2ZWwpO1xuICAgICAgICBpZiAoIXByZWZpeE1hdGNoZXNEZWJ1Z0xldmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coYCR7cHJlZml4fTpgLCAuLi5sb2dBcmdzKTtcbiAgICB9O1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBjYXB0dXJlZExvZ3MgPSBbXTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBjYXB0dXJlTG9ncyA9IGZhbHNlO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExvZ0NhcHR1cmUodmFsdWUpIHtcbiAgICBjYXB0dXJlZExvZ3MgPSBbXTtcbiAgICBjYXB0dXJlTG9ncyA9IHZhbHVlO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhcHR1cmVkTG9ncygpIHtcbiAgICByZXR1cm4gY2FwdHVyZWRMb2dzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVidWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmNvbnN0IGtub3duRGV2aWNlcyA9IFtcbiAgICB7XG4gICAgICAgIG5hbWU6ICdCbGFja2JlcnJ5IFBsYXlCb29rJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKFBsYXlCb29rOyBVOyBSSU0gVGFibGV0IE9TIDIuMS4wOyBlbi1VUykgQXBwbGVXZWJLaXQvNTM2LjIrIChLSFRNTCBsaWtlIEdlY2tvKSBWZXJzaW9uLzcuMi4xLjAgU2FmYXJpLzUzNi4yKycsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDI0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDEsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnQmxhY2tiZXJyeSBQbGF5Qm9vayBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoUGxheUJvb2s7IFU7IFJJTSBUYWJsZXQgT1MgMi4xLjA7IGVuLVVTKSBBcHBsZVdlYktpdC81MzYuMisgKEtIVE1MIGxpa2UgR2Vja28pIFZlcnNpb24vNy4yLjEuMCBTYWZhcmkvNTM2LjIrJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDI0LFxuICAgICAgICAgICAgaGVpZ2h0OiA2MDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0JsYWNrQmVycnkgWjMwJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKEJCMTA7IFRvdWNoKSBBcHBsZVdlYktpdC81MzcuMTArIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wLjkuMjM3MiBNb2JpbGUgU2FmYXJpLzUzNy4xMCsnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnQmxhY2tCZXJyeSBaMzAgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKEJCMTA7IFRvdWNoKSBBcHBsZVdlYktpdC81MzcuMTArIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wLjkuMjM3MiBNb2JpbGUgU2FmYXJpLzUzNy4xMCsnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgTm90ZSAzJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMzsgZW4tdXM7IFNNLU45MDBUIEJ1aWxkL0pTUzE1SikgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnR2FsYXh5IE5vdGUgMyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgNC4zOyBlbi11czsgU00tTjkwMFQgQnVpbGQvSlNTMTVKKSBBcHBsZVdlYktpdC81MzQuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBNb2JpbGUgU2FmYXJpLzUzNC4zMCcsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBOb3RlIElJJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMTsgZW4tdXM7IEdULU43MTAwIEJ1aWxkL0pSTzAzQykgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnR2FsYXh5IE5vdGUgSUkgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMTsgZW4tdXM7IEdULU43MTAwIEJ1aWxkL0pSTzAzQykgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUyBJSUknLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgNC4wOyBlbi11czsgR1QtSTkzMDAgQnVpbGQvSU1NNzZEKSBBcHBsZVdlYktpdC81MzQuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBNb2JpbGUgU2FmYXJpLzUzNC4zMCcsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzYwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUyBJSUkgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMDsgZW4tdXM7IEdULUk5MzAwIEJ1aWxkL0lNTTc2RCkgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUzUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNS4wOyBTTS1HOTAwUCBCdWlsZC9MUlgyMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzYwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUzUgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDUuMDsgU00tRzkwMFAgQnVpbGQvTFJYMjFUKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUzgnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNy4wOyBTTS1HOTUwVSBCdWlsZC9OUkQ5ME0pIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS82Mi4wLjMyMDIuODQgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNzQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnR2FsYXh5IFM4IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA3LjA7IFNNLUc5NTBVIEJ1aWxkL05SRDkwTSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzYyLjAuMzIwMi44NCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBTOSsnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4wLjA7IFNNLUc5NjVVIEJ1aWxkL1IxNk5XKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNjMuMC4zMjM5LjExMSBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzIwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NTgsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogNC41LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBTOSsgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBTTS1HOTY1VSBCdWlsZC9SMTZOVykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzYzLjAuMzIzOS4xMTEgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY1OCxcbiAgICAgICAgICAgIGhlaWdodDogMzIwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDQuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBUYWIgUzQnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4xLjA7IFNNLVQ4MzdBKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzAuMC4zNTM4LjgwIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDcxMixcbiAgICAgICAgICAgIGhlaWdodDogMTEzOCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLjI1LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBUYWIgUzQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMS4wOyBTTS1UODM3QSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzcwLjAuMzUzOC44MCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMTM4LFxuICAgICAgICAgICAgaGVpZ2h0OiA3MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi4yNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzQgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTUzNDFmIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzY4LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDI0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzQgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTUzNDFmIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMTAyNCxcbiAgICAgICAgICAgIGhlaWdodDogNzY4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIChnZW4gNiknLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDEyXzIgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDc2OCxcbiAgICAgICAgICAgIGhlaWdodDogMTAyNCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQgKGdlbiA2KSBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDEyXzIgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDEwMjQsXG4gICAgICAgICAgICBoZWlnaHQ6IDc2OCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCAoZ2VuIDcpJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMl8yIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xNS40IE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4MTAsXG4gICAgICAgICAgICBoZWlnaHQ6IDEwODAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIChnZW4gNykgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMl8yIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xNS40IE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDgwLFxuICAgICAgICAgICAgaGVpZ2h0OiA4MTAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQgTWluaScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zNCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBNTM0MWYgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA3NjgsXG4gICAgICAgICAgICBoZWlnaHQ6IDEwMjQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIE1pbmkgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM0IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUE1MzQxZiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDEwMjQsXG4gICAgICAgICAgICBoZWlnaHQ6IDc2OCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzQgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTUzNDFmIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMTAyNCxcbiAgICAgICAgICAgIGhlaWdodDogMTM2NixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQgUHJvIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zNCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBNTM0MWYgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMzY2LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDI0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIFBybyAxMScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgMTJfMiBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODM0LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMTk0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCBQcm8gMTEgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMl8yIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xNS40IE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMTk0LFxuICAgICAgICAgICAgaGVpZ2h0OiA4MzQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA0JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyA3XzFfMiBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC81MzcuNTEuMiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNy4wIE1vYmlsZS8xMUQyNTcgU2FmYXJpLzk1MzcuNTMnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDMyMCxcbiAgICAgICAgICAgIGhlaWdodDogNDgwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyA3XzFfMiBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC81MzcuNTEuMiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNy4wIE1vYmlsZS8xMUQyNTcgU2FmYXJpLzk1MzcuNTMnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQ4MCxcbiAgICAgICAgICAgIGhlaWdodDogMzIwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgNScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTBfM18xIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwMy4xLjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wIE1vYmlsZS8xNEUzMDQgU2FmYXJpLzYwMi4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzMjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDU2OCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA1IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTBfM18xIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwMy4xLjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wIE1vYmlsZS8xNEUzMDQgU2FmYXJpLzYwMi4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA1NjgsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDYnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM3NSxcbiAgICAgICAgICAgIGhlaWdodDogNjY3LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDYgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA2NjcsXG4gICAgICAgICAgICBoZWlnaHQ6IDM3NSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDYgUGx1cycsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDE0LFxuICAgICAgICAgICAgaGVpZ2h0OiA3MzYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgNiBQbHVzIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzM2LFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA3JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNzUsXG4gICAgICAgICAgICBoZWlnaHQ6IDY2NyxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA3IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjY3LFxuICAgICAgICAgICAgaGVpZ2h0OiAzNzUsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA3IFBsdXMnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQxNCxcbiAgICAgICAgICAgIGhlaWdodDogNzM2LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDcgUGx1cyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDczNixcbiAgICAgICAgICAgIGhlaWdodDogNDE0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgOCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzc1LFxuICAgICAgICAgICAgaGVpZ2h0OiA2NjcsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgOCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY2NyxcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgOCBQbHVzJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTQsXG4gICAgICAgICAgICBoZWlnaHQ6IDczNixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA4IFBsdXMgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA3MzYsXG4gICAgICAgICAgICBoZWlnaHQ6IDQxNCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFNFJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMF8zXzEgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjAzLjEuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEwLjAgTW9iaWxlLzE0RTMwNCBTYWZhcmkvNjAyLjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDMyMCxcbiAgICAgICAgICAgIGhlaWdodDogNTY4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFNFIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTBfM18xIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwMy4xLjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wIE1vYmlsZS8xNEUzMDQgU2FmYXJpLzYwMi4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA1NjgsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFgnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM3NSxcbiAgICAgICAgICAgIGhlaWdodDogODEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFggbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4MTIsXG4gICAgICAgICAgICBoZWlnaHQ6IDM3NSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFhSJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMl8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMi4wIE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTQsXG4gICAgICAgICAgICBoZWlnaHQ6IDg5NixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSBYUiBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEyXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEyLjAgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg5NixcbiAgICAgICAgICAgIGhlaWdodDogNDE0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTEnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQxNCxcbiAgICAgICAgICAgIGhlaWdodDogODI4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDExIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTNfNyBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTMuMSBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODI4LFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSAxMSBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM3NSxcbiAgICAgICAgICAgIGhlaWdodDogODEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDExIFBybyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgxMixcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTEgUHJvIE1heCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTNfNyBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTMuMSBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDE0LFxuICAgICAgICAgICAgaGVpZ2h0OiA4OTYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTEgUHJvIE1heCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg5NixcbiAgICAgICAgICAgIGhlaWdodDogNDE0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTInLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEyIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTRfNCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODQ0LFxuICAgICAgICAgICAgaGVpZ2h0OiAzOTAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSAxMiBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEyIFBybyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg0NCxcbiAgICAgICAgICAgIGhlaWdodDogMzkwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgUHJvIE1heCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTRfNCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDI4LFxuICAgICAgICAgICAgaGVpZ2h0OiA5MjYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgUHJvIE1heCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDkyNixcbiAgICAgICAgICAgIGhlaWdodDogNDI4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgTWluaScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTRfNCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzc1LFxuICAgICAgICAgICAgaGVpZ2h0OiA4MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgTWluaSBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgxMixcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEzIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTVfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODQ0LFxuICAgICAgICAgICAgaGVpZ2h0OiAzOTAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSAxMyBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEzIFBybyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg0NCxcbiAgICAgICAgICAgIGhlaWdodDogMzkwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgUHJvIE1heCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTVfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDI4LFxuICAgICAgICAgICAgaGVpZ2h0OiA5MjYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgUHJvIE1heCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDkyNixcbiAgICAgICAgICAgIGhlaWdodDogNDI4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgTWluaScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTVfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzc1LFxuICAgICAgICAgICAgaGVpZ2h0OiA4MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgTWluaSBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgxMixcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdKaW9QaG9uZSAyJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKE1vYmlsZTsgTFlGL0YzMDBCL0xZRi1GMzAwQi0wMDEtMDEtMTUtMTMwNzE4LWk7QW5kcm9pZDsgcnY6NDguMCkgR2Vja28vNDguMCBGaXJlZm94LzQ4LjAgS0FJT1MvMi41JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAyNDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0ppb1Bob25lIDIgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKE1vYmlsZTsgTFlGL0YzMDBCL0xZRi1GMzAwQi0wMDEtMDEtMTUtMTMwNzE4LWk7QW5kcm9pZDsgcnY6NDguMCkgR2Vja28vNDguMCBGaXJlZm94LzQ4LjAgS0FJT1MvMi41JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzMjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDI0MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnS2luZGxlIEZpcmUgSERYJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBlbi11czsgS0ZBUFdJIEJ1aWxkL0pEUTM5KSBBcHBsZVdlYktpdC81MzUuMTkgKEtIVE1MLCBsaWtlIEdlY2tvKSBTaWxrLzMuMTMgU2FmYXJpLzUzNS4xOSBTaWxrLUFjY2VsZXJhdGVkPXRydWUnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgwMCxcbiAgICAgICAgICAgIGhlaWdodDogMTI4MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0tpbmRsZSBGaXJlIEhEWCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IFU7IGVuLXVzOyBLRkFQV0kgQnVpbGQvSkRRMzkpIEFwcGxlV2ViS2l0LzUzNS4xOSAoS0hUTUwsIGxpa2UgR2Vja28pIFNpbGsvMy4xMyBTYWZhcmkvNTM1LjE5IFNpbGstQWNjZWxlcmF0ZWQ9dHJ1ZScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMTI4MCxcbiAgICAgICAgICAgIGhlaWdodDogODAwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdMRyBPcHRpbXVzIEw3MCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgVTsgQW5kcm9pZCA0LjQuMjsgZW4tdXM7IExHTVMzMjMgQnVpbGQvS09UNDlJLk1TMzIzMTBjKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM4NCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDEuMjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTEcgT3B0aW11cyBMNzAgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuNC4yOyBlbi11czsgTEdNUzMyMyBCdWlsZC9LT1Q0OUkuTVMzMjMxMGMpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzODQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMS4yNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ01pY3Jvc29mdCBMdW1pYSA1NTAnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBQaG9uZSAxMC4wOyBBbmRyb2lkIDQuMi4xOyBNaWNyb3NvZnQ7IEx1bWlhIDU1MCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzQ2LjAuMjQ4Ni4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2IEVkZ2UvMTQuMTQyNjMnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTWljcm9zb2Z0IEx1bWlhIDk1MCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChXaW5kb3dzIFBob25lIDEwLjA7IEFuZHJvaWQgNC4yLjE7IE1pY3Jvc29mdDsgTHVtaWEgOTUwKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDYuMC4yNDg2LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYgRWRnZS8xNC4xNDI2MycsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzYwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogNCxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdNaWNyb3NvZnQgTHVtaWEgOTUwIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChXaW5kb3dzIFBob25lIDEwLjA7IEFuZHJvaWQgNC4yLjE7IE1pY3Jvc29mdDsgTHVtaWEgOTUwKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDYuMC4yNDg2LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYgRWRnZS8xNC4xNDI2MycsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogNCxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDEwJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMC4xOyBOZXh1cyAxMCBCdWlsZC9NT0IzMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4MDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDEyODAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyAxMCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wLjE7IE5leHVzIDEwIEJ1aWxkL01PQjMxVCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDEyODAsXG4gICAgICAgICAgICBoZWlnaHQ6IDgwMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTmV4dXMgNCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA0LjQuMjsgTmV4dXMgNCBCdWlsZC9LT1Q0OUgpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzg0LFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyA0IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA0LjQuMjsgTmV4dXMgNCBCdWlsZC9LT1Q0OUgpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzODQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wOyBOZXh1cyA1IEJ1aWxkL01SQTU4TikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDY0MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDUgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMDsgTmV4dXMgNSBCdWlsZC9NUkE1OE4pIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDVYJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBOZXh1cyA1WCBCdWlsZC9PUFI0LjE3MDYyMy4wMDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDEyLFxuICAgICAgICAgICAgaGVpZ2h0OiA3MzIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi42MjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTmV4dXMgNVggbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBOZXh1cyA1WCBCdWlsZC9PUFI0LjE3MDYyMy4wMDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzMyLFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi42MjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyA2JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMS4xOyBOZXh1cyA2IEJ1aWxkL042RjI2VSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTIsXG4gICAgICAgICAgICBoZWlnaHQ6IDczMixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTmV4dXMgNiBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNy4xLjE7IE5leHVzIDYgQnVpbGQvTjZGMjZVKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDczMixcbiAgICAgICAgICAgIGhlaWdodDogNDEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDZQJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBOZXh1cyA2UCBCdWlsZC9PUFAzLjE3MDUxOC4wMDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDEyLFxuICAgICAgICAgICAgaGVpZ2h0OiA3MzIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMy41LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDZQIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA4LjAuMDsgTmV4dXMgNlAgQnVpbGQvT1BQMy4xNzA1MTguMDA2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDczMixcbiAgICAgICAgICAgIGhlaWdodDogNDEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDcnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wLjE7IE5leHVzIDcgQnVpbGQvTU9CMzBYKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiA5NjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyA3IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA2LjAuMTsgTmV4dXMgNyBCdWlsZC9NT0IzMFgpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA5NjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDYwMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTm9raWEgTHVtaWEgNTIwJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IE1TSUUgMTAuMDsgV2luZG93cyBQaG9uZSA4LjA7IFRyaWRlbnQvNi4wOyBJRU1vYmlsZS8xMC4wOyBBUk07IFRvdWNoOyBOT0tJQTsgTHVtaWEgNTIwKScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzIwLFxuICAgICAgICAgICAgaGVpZ2h0OiA1MzMsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMS41LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05va2lhIEx1bWlhIDUyMCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoY29tcGF0aWJsZTsgTVNJRSAxMC4wOyBXaW5kb3dzIFBob25lIDguMDsgVHJpZGVudC82LjA7IElFTW9iaWxlLzEwLjA7IEFSTTsgVG91Y2g7IE5PS0lBOyBMdW1pYSA1MjApJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA1MzMsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOb2tpYSBOOScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChNZWVHbzsgTm9raWFOOSkgQXBwbGVXZWJLaXQvNTM0LjEzIChLSFRNTCwgbGlrZSBHZWNrbykgTm9raWFCcm93c2VyLzguNS4wIE1vYmlsZSBTYWZhcmkvNTM0LjEzJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0ODAsXG4gICAgICAgICAgICBoZWlnaHQ6IDg1NCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05va2lhIE45IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChNZWVHbzsgTm9raWFOOSkgQXBwbGVXZWJLaXQvNTM0LjEzIChLSFRNTCwgbGlrZSBHZWNrbykgTm9raWFCcm93c2VyLzguNS4wIE1vYmlsZSBTYWZhcmkvNTM0LjEzJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4NTQsXG4gICAgICAgICAgICBoZWlnaHQ6IDQ4MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnUGl4ZWwgMicsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA4LjA7IFBpeGVsIDIgQnVpbGQvT1BEMy4xNzA4MTYuMDEyKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQxMSxcbiAgICAgICAgICAgIGhlaWdodDogNzMxLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIuNjI1LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDIgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMDsgUGl4ZWwgMiBCdWlsZC9PUEQzLjE3MDgxNi4wMTIpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzMxLFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTEsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi42MjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdQaXhlbCAyIFhMJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBQaXhlbCAyIFhMIEJ1aWxkL09QRDEuMTcwODE2LjAwNCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTEsXG4gICAgICAgICAgICBoZWlnaHQ6IDgyMyxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnUGl4ZWwgMiBYTCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4wLjA7IFBpeGVsIDIgWEwgQnVpbGQvT1BEMS4xNzA4MTYuMDA0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgyMyxcbiAgICAgICAgICAgIGhlaWdodDogNDExLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDMnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOTsgUGl4ZWwgMyBCdWlsZC9QUTFBLjE4MTEwNS4wMTcuQTEpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS82Ni4wLjMzNTkuMTU4IE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzOTMsXG4gICAgICAgICAgICBoZWlnaHQ6IDc4NixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLjc1LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDMgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDk7IFBpeGVsIDMgQnVpbGQvUFExQS4xODExMDUuMDE3LkExKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNjYuMC4zMzU5LjE1OCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzg2LFxuICAgICAgICAgICAgaGVpZ2h0OiAzOTMsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi43NSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDQnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IFBpeGVsIDQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84MS4wLjQwNDQuMTM4IE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNTMsXG4gICAgICAgICAgICBoZWlnaHQ6IDc0NSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDEwOyBQaXhlbCA0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODEuMC40MDQ0LjEzOCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzQ1LFxuICAgICAgICAgICAgaGVpZ2h0OiAzNTMsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDRhICg1RyknLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTE7IFBpeGVsIDRhICg1RykpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS85OS4wLjQ4MTIuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzUzLFxuICAgICAgICAgICAgaGVpZ2h0OiA3NDUsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdQaXhlbCA0YSAoNUcpIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMTsgUGl4ZWwgNGEgKDVHKSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA3NDUsXG4gICAgICAgICAgICBoZWlnaHQ6IDM1MyxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnUGl4ZWwgNScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMTsgUGl4ZWwgNSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzOTMsXG4gICAgICAgICAgICBoZWlnaHQ6IDg1MSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDUgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDExOyBQaXhlbCA1KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvOTkuMC40ODEyLjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg1MSxcbiAgICAgICAgICAgIGhlaWdodDogMzkzLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdNb3RvIEc0JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMDsgTW90byBHICg0KSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDY0MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ01vdG8gRzQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMDsgTW90byBHICg0KSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA2NDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDM2MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG5dO1xuY29uc3Qga25vd25EZXZpY2VzQnlOYW1lID0ge307XG5mb3IgKGNvbnN0IGRldmljZSBvZiBrbm93bkRldmljZXMpIHtcbiAgICBrbm93bkRldmljZXNCeU5hbWVbZGV2aWNlLm5hbWVdID0gZGV2aWNlO1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgZGV2aWNlcyB0byBiZSB1c2VkIHdpdGgge0BsaW5rIFBhZ2UuZW11bGF0ZX0uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHtLbm93bkRldmljZXN9IGZyb20gJ3B1cHBldGVlcic7XG4gKiBjb25zdCBpUGhvbmUgPSBLbm93bkRldmljZXNbJ2lQaG9uZSA2J107XG4gKlxuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmVtdWxhdGUoaVBob25lKTtcbiAqICAgYXdhaXQgcGFnZS5nb3RvKCdodHRwczovL3d3dy5nb29nbGUuY29tJyk7XG4gKiAgIC8vIG90aGVyIGFjdGlvbnMuLi5cbiAqICAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICogfSkoKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IEtub3duRGV2aWNlcyA9IE9iamVjdC5mcmVlemUoa25vd25EZXZpY2VzQnlOYW1lKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURldmljZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIFB1cHBldGVlci1zcGVjaWZpYyBlcnJvcnNcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQdXBwZXRlZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICB9XG59XG4vKipcbiAqIFRpbWVvdXRFcnJvciBpcyBlbWl0dGVkIHdoZW5ldmVyIGNlcnRhaW4gb3BlcmF0aW9ucyBhcmUgdGVybWluYXRlZCBkdWUgdG9cbiAqIHRpbWVvdXQuXG4gKlxuICogQHJlbWFya3NcbiAqIEV4YW1wbGUgb3BlcmF0aW9ucyBhcmUge0BsaW5rIFBhZ2Uud2FpdEZvclNlbGVjdG9yIHwgcGFnZS53YWl0Rm9yU2VsZWN0b3J9IG9yXG4gKiB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXVuY2ggfCBwdXBwZXRlZXIubGF1bmNofS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lb3V0RXJyb3IgZXh0ZW5kcyBQdXBwZXRlZXJFcnJvciB7XG59XG4vKipcbiAqIFByb3RvY29sRXJyb3IgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGVyZSBpcyBhbiBlcnJvciBmcm9tIHRoZSBwcm90b2NvbC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm90b2NvbEVycm9yIGV4dGVuZHMgUHVwcGV0ZWVyRXJyb3Ige1xuICAgICNjb2RlO1xuICAgICNvcmlnaW5hbE1lc3NhZ2UgPSAnJztcbiAgICBzZXQgY29kZShjb2RlKSB7XG4gICAgICAgIHRoaXMuI2NvZGUgPSBjb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgZ2V0IGNvZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb2RlO1xuICAgIH1cbiAgICBzZXQgb3JpZ2luYWxNZXNzYWdlKG9yaWdpbmFsTWVzc2FnZSkge1xuICAgICAgICB0aGlzLiNvcmlnaW5hbE1lc3NhZ2UgPSBvcmlnaW5hbE1lc3NhZ2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBnZXQgb3JpZ2luYWxNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jb3JpZ2luYWxNZXNzYWdlO1xuICAgIH1cbn1cbi8qKlxuICogUHVwcGV0ZWVyIHdpbGwgdGhyb3cgdGhpcyBlcnJvciBpZiBhIG1ldGhvZCBpcyBub3RcbiAqIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHVzZWQgcHJvdG9jb2xcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZE9wZXJhdGlvbiBleHRlbmRzIFB1cHBldGVlckVycm9yIHtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRDbG9zZUVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcnJvcnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBtaXR0IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L21pdHQvbWl0dC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlU3ltYm9sIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbi8qKlxuICogVGhlIEV2ZW50RW1pdHRlciBjbGFzcyB0aGF0IG1hbnkgUHVwcGV0ZWVyIGNsYXNzZXMgZXh0ZW5kLlxuICpcbiAqIEByZW1hcmtzXG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIGxpc3RlbiB0byBldmVudHMgdGhhdCBQdXBwZXRlZXIgY2xhc3NlcyBmaXJlIGFuZCBhY3RcbiAqIGFjY29yZGluZ2x5LiBUaGVyZWZvcmUgeW91J2xsIG1vc3RseSB1c2Uge0BsaW5rIEV2ZW50RW1pdHRlci5vbiB8IG9ufSBhbmRcbiAqIHtAbGluayBFdmVudEVtaXR0ZXIub2ZmIHwgb2ZmfSB0byBiaW5kXG4gKiBhbmQgdW5iaW5kIHRvIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXIge1xuICAgICNlbWl0dGVyO1xuICAgICNoYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICAvKipcbiAgICAgKiBJZiB5b3UgcGFzcyBhbiBlbWl0dGVyLCB0aGUgcmV0dXJuZWQgZW1pdHRlciB3aWxsIHdyYXAgdGhlIHBhc3NlZCBlbWl0dGVyLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZW1pdHRlciA9IG1pdHQobmV3IE1hcCgpKSkge1xuICAgICAgICB0aGlzLiNlbWl0dGVyID0gZW1pdHRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQmluZCBhbiBldmVudCBsaXN0ZW5lciB0byBmaXJlIHdoZW4gYW4gZXZlbnQgb2NjdXJzLlxuICAgICAqIEBwYXJhbSB0eXBlIC0gdGhlIGV2ZW50IHR5cGUgeW91J2QgbGlrZSB0byBsaXN0ZW4gdG8uIENhbiBiZSBhIHN0cmluZyBvciBzeW1ib2wuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IG9jY3Vycy5cbiAgICAgKiBAcmV0dXJucyBgdGhpc2AgdG8gZW5hYmxlIHlvdSB0byBjaGFpbiBtZXRob2QgY2FsbHMuXG4gICAgICovXG4gICAgb24odHlwZSwgaGFuZGxlcikge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuI2hhbmRsZXJzLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKGhhbmRsZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZXJzLnNldCh0eXBlLCBbaGFuZGxlcl0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNlbWl0dGVyLm9uKHR5cGUsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gZmlyaW5nLlxuICAgICAqIEBwYXJhbSB0eXBlIC0gdGhlIGV2ZW50IHR5cGUgeW91J2QgbGlrZSB0byBzdG9wIGxpc3RlbmluZyB0by5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciAtIHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSByZW1vdmVkLlxuICAgICAqIEByZXR1cm5zIGB0aGlzYCB0byBlbmFibGUgeW91IHRvIGNoYWluIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICBvZmYodHlwZSwgaGFuZGxlcikge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuI2hhbmRsZXJzLmdldCh0eXBlKSA/PyBbXTtcbiAgICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZW1pdHRlci5vZmYodHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNoYW5kbGVycy5kZWxldGUodHlwZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IGhhbmRsZXJzLmxhc3RJbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy4jZW1pdHRlci5vZmYodHlwZSwgLi4uaGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVtaXQgYW4gZXZlbnQgYW5kIGNhbGwgYW55IGFzc29jaWF0ZWQgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgLSB0aGUgZXZlbnQgeW91J2QgbGlrZSB0byBlbWl0XG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSAtIGFueSBkYXRhIHlvdSdkIGxpa2UgdG8gZW1pdCB3aXRoIHRoZSBldmVudFxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGVyZSBhcmUgYW55IGxpc3RlbmVycywgYGZhbHNlYCBpZiB0aGVyZSBhcmUgbm90LlxuICAgICAqL1xuICAgIGVtaXQodHlwZSwgZXZlbnQpIHtcbiAgICAgICAgdGhpcy4jZW1pdHRlci5lbWl0KHR5cGUsIGV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXJDb3VudCh0eXBlKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpa2UgYG9uYCBidXQgdGhlIGxpc3RlbmVyIHdpbGwgb25seSBiZSBmaXJlZCBvbmNlIGFuZCB0aGVuIGl0IHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAgKiBAcGFyYW0gdHlwZSAtIHRoZSBldmVudCB5b3UnZCBsaWtlIHRvIGxpc3RlbiB0b1xuICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gdGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gcnVuIHdoZW4gdGhlIGV2ZW50IG9jY3Vyc1xuICAgICAqIEByZXR1cm5zIGB0aGlzYCB0byBlbmFibGUgeW91IHRvIGNoYWluIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICBvbmNlKHR5cGUsIGhhbmRsZXIpIHtcbiAgICAgICAgY29uc3Qgb25jZUhhbmRsZXIgPSBldmVudERhdGEgPT4ge1xuICAgICAgICAgICAgaGFuZGxlcihldmVudERhdGEpO1xuICAgICAgICAgICAgdGhpcy5vZmYodHlwZSwgb25jZUhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5vbih0eXBlLCBvbmNlSGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSAtIHRoZSBldmVudCB0byBnZXQgdGhlIGxpc3RlbmVyIGNvdW50IGZvclxuICAgICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGJvdW5kIHRvIHRoZSBnaXZlbiBldmVudFxuICAgICAqL1xuICAgIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaGFuZGxlcnMuZ2V0KHR5cGUpPy5sZW5ndGggfHwgMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgbGlzdGVuZXJzLiBJZiBnaXZlbiBhbiBldmVudCBhcmd1bWVudCwgaXQgd2lsbCByZW1vdmUgb25seVxuICAgICAqIGxpc3RlbmVycyBmb3IgdGhhdCBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlIC0gdGhlIGV2ZW50IHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICAgICAqIEByZXR1cm5zIGB0aGlzYCB0byBlbmFibGUgeW91IHRvIGNoYWluIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vZmYodHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpc1tkaXNwb3NlU3ltYm9sXSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICBmb3IgKGNvbnN0IFt0eXBlLCBoYW5kbGVyc10gb2YgdGhpcy4jaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXR0ZXIub2ZmKHR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2hhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50U3Vic2NyaXB0aW9uIHtcbiAgICAjdGFyZ2V0O1xuICAgICN0eXBlO1xuICAgICNoYW5kbGVyO1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgdHlwZSwgaGFuZGxlcikge1xuICAgICAgICB0aGlzLiN0YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLiNoYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgdGhpcy4jdGFyZ2V0Lm9uKHRoaXMuI3R5cGUsIHRoaXMuI2hhbmRsZXIpO1xuICAgIH1cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHRoaXMuI3RhcmdldC5vZmYodGhpcy4jdHlwZSwgdGhpcy4jaGFuZGxlcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRFbWl0dGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG4vKipcbiAqIEZpbGUgY2hvb3NlcnMgbGV0IHlvdSByZWFjdCB0byB0aGUgcGFnZSByZXF1ZXN0aW5nIGZvciBhIGZpbGUuXG4gKlxuICogQHJlbWFya3NcbiAqIGBGaWxlQ2hvb3NlcmAgaW5zdGFuY2VzIGFyZSByZXR1cm5lZCB2aWEgdGhlIHtAbGluayBQYWdlLndhaXRGb3JGaWxlQ2hvb3Nlcn0gbWV0aG9kLlxuICpcbiAqIEluIGJyb3dzZXJzLCBvbmx5IG9uZSBmaWxlIGNob29zZXIgY2FuIGJlIG9wZW5lZCBhdCBhIHRpbWUuXG4gKiBBbGwgZmlsZSBjaG9vc2VycyBtdXN0IGJlIGFjY2VwdGVkIG9yIGNhbmNlbGVkLiBOb3QgZG9pbmcgc28gd2lsbCBwcmV2ZW50XG4gKiBzdWJzZXF1ZW50IGZpbGUgY2hvb3NlcnMgZnJvbSBhcHBlYXJpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgW2ZpbGVDaG9vc2VyXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS53YWl0Rm9yRmlsZUNob29zZXIoKSxcbiAqICAgcGFnZS5jbGljaygnI3VwbG9hZC1maWxlLWJ1dHRvbicpLCAvLyBzb21lIGJ1dHRvbiB0aGF0IHRyaWdnZXJzIGZpbGUgc2VsZWN0aW9uXG4gKiBdKTtcbiAqIGF3YWl0IGZpbGVDaG9vc2VyLmFjY2VwdChbJy90bXAvbXlmaWxlLnBkZiddKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVDaG9vc2VyIHtcbiAgICAjZWxlbWVudDtcbiAgICAjbXVsdGlwbGU7XG4gICAgI2hhbmRsZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBldmVudCkge1xuICAgICAgICB0aGlzLiNlbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy4jbXVsdGlwbGUgPSBldmVudC5tb2RlICE9PSAnc2VsZWN0U2luZ2xlJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciBmaWxlIGNob29zZXIgYWxsb3cgZm9yXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dC9maWxlI2F0dHItbXVsdGlwbGUgfCBtdWx0aXBsZX1cbiAgICAgKiBmaWxlIHNlbGVjdGlvbi5cbiAgICAgKi9cbiAgICBpc011bHRpcGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbXVsdGlwbGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjY2VwdCB0aGUgZmlsZSBjaG9vc2VyIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gZmlsZSBwYXRocy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzIFRoaXMgd2lsbCBub3QgdmFsaWRhdGUgd2hldGhlciB0aGUgZmlsZSBwYXRocyBleGlzdHMuIEFsc28sIGlmIGFcbiAgICAgKiBwYXRoIGlzIHJlbGF0aXZlLCB0aGVuIGl0IGlzIHJlc29sdmVkIGFnYWluc3QgdGhlXG4gICAgICoge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19jd2QgfCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5fS5cbiAgICAgKiBGb3IgbG9jYWxzIHNjcmlwdCBjb25uZWN0aW5nIHRvIHJlbW90ZSBjaHJvbWUgZW52aXJvbm1lbnRzLCBwYXRocyBtdXN0IGJlXG4gICAgICogYWJzb2x1dGUuXG4gICAgICovXG4gICAgYXN5bmMgYWNjZXB0KHBhdGhzKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBhY2NlcHQgRmlsZUNob29zZXIgd2hpY2ggaXMgYWxyZWFkeSBoYW5kbGVkIScpO1xuICAgICAgICB0aGlzLiNoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy4jZWxlbWVudC51cGxvYWRGaWxlKC4uLnBhdGhzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBmaWxlIGNob29zZXIgd2l0aG91dCBzZWxlY3RpbmcgYW55IGZpbGVzLlxuICAgICAqL1xuICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNoYW5kbGVkLCAnQ2Fubm90IGNhbmNlbCBGaWxlQ2hvb3NlciB3aGljaCBpcyBhbHJlYWR5IGhhbmRsZWQhJyk7XG4gICAgICAgIHRoaXMuI2hhbmRsZWQgPSB0cnVlO1xuICAgICAgICAvLyBYWFg6IFRoZXNlIGV2ZW50cyBzaG91bGQgY29udmVydGVkIHRvIHRydXN0ZWQgZXZlbnRzLiBQZXJoYXBzIGRvIHRoaXNcbiAgICAgICAgLy8gaW4gYERPTS5zZXRGaWxlSW5wdXRGaWxlc2A/XG4gICAgICAgIGF3YWl0IHRoaXMuI2VsZW1lbnQuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjYW5jZWwnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaWxlQ2hvb3Nlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQVJJQVF1ZXJ5SGFuZGxlciB9IGZyb20gJy4uL2NkcC9BcmlhUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IENTU1F1ZXJ5SGFuZGxlciB9IGZyb20gJy4vQ1NTUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IGN1c3RvbVF1ZXJ5SGFuZGxlcnMgfSBmcm9tICcuL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG5pbXBvcnQgeyBQaWVyY2VRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1BpZXJjZVF1ZXJ5SGFuZGxlci5qcyc7XG5pbXBvcnQgeyBQUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9QUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IHBhcnNlUFNlbGVjdG9ycyB9IGZyb20gJy4vUFNlbGVjdG9yUGFyc2VyLmpzJztcbmltcG9ydCB7IFRleHRRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1RleHRRdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgWFBhdGhRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1hQYXRoUXVlcnlIYW5kbGVyLmpzJztcbmNvbnN0IEJVSUxUSU5fUVVFUllfSEFORExFUlMgPSB7XG4gICAgYXJpYTogQVJJQVF1ZXJ5SGFuZGxlcixcbiAgICBwaWVyY2U6IFBpZXJjZVF1ZXJ5SGFuZGxlcixcbiAgICB4cGF0aDogWFBhdGhRdWVyeUhhbmRsZXIsXG4gICAgdGV4dDogVGV4dFF1ZXJ5SGFuZGxlcixcbn07XG5jb25zdCBRVUVSWV9TRVBBUkFUT1JTID0gWyc9JywgJy8nXTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGZvciAoY29uc3QgaGFuZGxlck1hcCBvZiBbXG4gICAgICAgIGN1c3RvbVF1ZXJ5SGFuZGxlcnMubmFtZXMoKS5tYXAobmFtZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gW25hbWUsIGN1c3RvbVF1ZXJ5SGFuZGxlcnMuZ2V0KG5hbWUpXTtcbiAgICAgICAgfSksXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKEJVSUxUSU5fUVVFUllfSEFORExFUlMpLFxuICAgIF0pIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgUXVlcnlIYW5kbGVyXSBvZiBoYW5kbGVyTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlcGFyYXRvciBvZiBRVUVSWV9TRVBBUkFUT1JTKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gYCR7bmFtZX0ke3NlcGFyYXRvcn1gO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2xsaW5nOiBuYW1lID09PSAnYXJpYScgPyBcInJhZlwiIC8qIFBvbGxpbmdPcHRpb25zLlJBRiAqLyA6IFwibXV0YXRpb25cIiAvKiBQb2xsaW5nT3B0aW9ucy5NVVRBVElPTiAqLyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5SGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgW3BTZWxlY3RvciwgaXNQdXJlQ1NTLCBoYXNQc2V1ZG9DbGFzc2VzLCBoYXNBcmlhXSA9IHBhcnNlUFNlbGVjdG9ycyhzZWxlY3Rvcik7XG4gICAgICAgIGlmIChpc1B1cmVDU1MpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBwb2xsaW5nOiBoYXNQc2V1ZG9DbGFzc2VzXG4gICAgICAgICAgICAgICAgICAgID8gXCJyYWZcIiAvKiBQb2xsaW5nT3B0aW9ucy5SQUYgKi9cbiAgICAgICAgICAgICAgICAgICAgOiBcIm11dGF0aW9uXCIgLyogUG9sbGluZ09wdGlvbnMuTVVUQVRJT04gKi8sXG4gICAgICAgICAgICAgICAgUXVlcnlIYW5kbGVyOiBDU1NRdWVyeUhhbmRsZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1cGRhdGVkU2VsZWN0b3I6IEpTT04uc3RyaW5naWZ5KHBTZWxlY3RvciksXG4gICAgICAgICAgICBwb2xsaW5nOiBoYXNBcmlhID8gXCJyYWZcIiAvKiBQb2xsaW5nT3B0aW9ucy5SQUYgKi8gOiBcIm11dGF0aW9uXCIgLyogUG9sbGluZ09wdGlvbnMuTVVUQVRJT04gKi8sXG4gICAgICAgICAgICBRdWVyeUhhbmRsZXI6IFBRdWVyeUhhbmRsZXIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVwZGF0ZWRTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICBwb2xsaW5nOiBcIm11dGF0aW9uXCIgLyogUG9sbGluZ09wdGlvbnMuTVVUQVRJT04gKi8sXG4gICAgICAgICAgICBRdWVyeUhhbmRsZXI6IENTU1F1ZXJ5SGFuZGxlcixcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HZXRRdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2ssIGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuY29uc3QgREVGQVVMVF9CQVRDSF9TSVpFID0gMjA7XG4vKipcbiAqIFRoaXMgd2lsbCB0cmFuc3Bvc2UgYW4gaXRlcmF0b3IgSlNIYW5kbGUgaW50byBhIGZhc3QsIFB1cHBldGVlci1zaWRlIGl0ZXJhdG9yXG4gKiBvZiBKU0hhbmRsZXMuXG4gKlxuICogQHBhcmFtIHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRyYW5zcG9zZS4gVGhpcyBzaG91bGQgYmUgc29tZXRoaW5nXG4gKiByZWFzb25hYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiogZmFzdFRyYW5zcG9zZUl0ZXJhdG9ySGFuZGxlKGl0ZXJhdG9yLCBzaXplKSB7XG4gICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMSwgYXdhaXQgaXRlcmF0b3IuZXZhbHVhdGVIYW5kbGUoYXN5bmMgKGl0ZXJhdG9yLCBzaXplKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgICAgICAgICB3aGlsZSAocmVzdWx0cy5sZW5ndGggPCBzaXplKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfSwgc2l6ZSksIGZhbHNlKTtcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IChhd2FpdCBhcnJheS5nZXRQcm9wZXJ0aWVzKCkpO1xuICAgICAgICBjb25zdCBoYW5kbGVzID0gcHJvcGVydGllcy52YWx1ZXMoKTtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMSwgbmV3IERpc3Bvc2FibGVTdGFjaygpLCBmYWxzZSk7XG4gICAgICAgIHN0YWNrLmRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlXzEgb2YgaGFuZGxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8yLCBoYW5kbGVfMSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVbZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgICAgICAgICBlbnZfMi5lcnJvciA9IGVfMjtcbiAgICAgICAgICAgICAgICAgICAgZW52XzIuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB5aWVsZCogaGFuZGxlcztcbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuc2l6ZSA9PT0gMDtcbiAgICB9XG4gICAgY2F0Y2ggKGVfMSkge1xuICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgZW52XzEuaGFzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8xKTtcbiAgICB9XG59XG4vKipcbiAqIFRoaXMgd2lsbCB0cmFuc3Bvc2UgYW4gaXRlcmF0b3IgSlNIYW5kbGUgaW4gYmF0Y2hlcyBiYXNlZCBvbiB0aGUgZGVmYXVsdCBzaXplXG4gKiBvZiB7QGxpbmsgZmFzdFRyYW5zcG9zZUl0ZXJhdG9ySGFuZGxlfS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24qIHRyYW5zcG9zZUl0ZXJhdG9ySGFuZGxlKGl0ZXJhdG9yKSB7XG4gICAgbGV0IHNpemUgPSBERUZBVUxUX0JBVENIX1NJWkU7XG4gICAgd2hpbGUgKCEoeWllbGQqIGZhc3RUcmFuc3Bvc2VJdGVyYXRvckhhbmRsZShpdGVyYXRvciwgc2l6ZSkpKSB7XG4gICAgICAgIHNpemUgPDw9IDE7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uKiB0cmFuc3Bvc2VJdGVyYWJsZUhhbmRsZShoYW5kbGUpIHtcbiAgICBjb25zdCBlbnZfMyA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBnZW5lcmF0b3JIYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMywgYXdhaXQgaGFuZGxlLmV2YWx1YXRlSGFuZGxlKGl0ZXJhYmxlID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoYXN5bmMgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogaXRlcmFibGU7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9KSwgZmFsc2UpO1xuICAgICAgICB5aWVsZCogdHJhbnNwb3NlSXRlcmF0b3JIYW5kbGUoZ2VuZXJhdG9ySGFuZGxlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVfMykge1xuICAgICAgICBlbnZfMy5lcnJvciA9IGVfMztcbiAgICAgICAgZW52XzMuaGFzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8zKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1IYW5kbGVJdGVyYXRvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIExhenlBcmcge1xuICAgIHN0YXRpYyBjcmVhdGUgPSAoZ2V0KSA9PiB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gaW50cm9kdWNlIExhenlBcmcgdG8gdGhlIHR5cGUgc3lzdGVtLCBvdGhlcndpc2Ugd2Ugd291bGRcbiAgICAgICAgLy8gaGF2ZSB0byBtYWtlIGl0IHB1YmxpYy5cbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5QXJnKGdldCk7XG4gICAgfTtcbiAgICAjZ2V0O1xuICAgIGNvbnN0cnVjdG9yKGdldCkge1xuICAgICAgICB0aGlzLiNnZXQgPSBnZXQ7XG4gICAgfVxuICAgIGFzeW5jIGdldChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNnZXQoY29udGV4dCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGF6eUFyZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBXZSB1c2Ugc3ltYm9scyB0byBwcmV2ZW50IGFueSBleHRlcm5hbCBwYXJ0aWVzIGxpc3RlbmluZyB0byB0aGVzZSBldmVudHMuXG4gKiBUaGV5IGFyZSBpbnRlcm5hbCB0byBQdXBwZXRlZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIE5ldHdvcmtNYW5hZ2VyRXZlbnQ7XG4oZnVuY3Rpb24gKE5ldHdvcmtNYW5hZ2VyRXZlbnQpIHtcbiAgICBOZXR3b3JrTWFuYWdlckV2ZW50LlJlcXVlc3QgPSBTeW1ib2woJ05ldHdvcmtNYW5hZ2VyLlJlcXVlc3QnKTtcbiAgICBOZXR3b3JrTWFuYWdlckV2ZW50LlJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUgPSBTeW1ib2woJ05ldHdvcmtNYW5hZ2VyLlJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUnKTtcbiAgICBOZXR3b3JrTWFuYWdlckV2ZW50LlJlc3BvbnNlID0gU3ltYm9sKCdOZXR3b3JrTWFuYWdlci5SZXNwb25zZScpO1xuICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdEZhaWxlZCA9IFN5bWJvbCgnTmV0d29ya01hbmFnZXIuUmVxdWVzdEZhaWxlZCcpO1xuICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdEZpbmlzaGVkID0gU3ltYm9sKCdOZXR3b3JrTWFuYWdlci5SZXF1ZXN0RmluaXNoZWQnKTtcbn0pKE5ldHdvcmtNYW5hZ2VyRXZlbnQgfHwgKE5ldHdvcmtNYW5hZ2VyRXZlbnQgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmV0d29ya01hbmFnZXJFdmVudHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBwYXBlckZvcm1hdHMgPSB7XG4gICAgbGV0dGVyOiB7IHdpZHRoOiA4LjUsIGhlaWdodDogMTEgfSxcbiAgICBsZWdhbDogeyB3aWR0aDogOC41LCBoZWlnaHQ6IDE0IH0sXG4gICAgdGFibG9pZDogeyB3aWR0aDogMTEsIGhlaWdodDogMTcgfSxcbiAgICBsZWRnZXI6IHsgd2lkdGg6IDE3LCBoZWlnaHQ6IDExIH0sXG4gICAgYTA6IHsgd2lkdGg6IDMzLjEsIGhlaWdodDogNDYuOCB9LFxuICAgIGExOiB7IHdpZHRoOiAyMy40LCBoZWlnaHQ6IDMzLjEgfSxcbiAgICBhMjogeyB3aWR0aDogMTYuNTQsIGhlaWdodDogMjMuNCB9LFxuICAgIGEzOiB7IHdpZHRoOiAxMS43LCBoZWlnaHQ6IDE2LjU0IH0sXG4gICAgYTQ6IHsgd2lkdGg6IDguMjcsIGhlaWdodDogMTEuNyB9LFxuICAgIGE1OiB7IHdpZHRoOiA1LjgzLCBoZWlnaHQ6IDguMjcgfSxcbiAgICBhNjogeyB3aWR0aDogNC4xMywgaGVpZ2h0OiA1LjgzIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT3B0aW9ucy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyLCB9IGZyb20gJy4vUXVlcnlIYW5kbGVyLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBQUXVlcnlIYW5kbGVyIGV4dGVuZHMgUXVlcnlIYW5kbGVyIHtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvckFsbCA9IChlbGVtZW50LCBzZWxlY3RvciwgeyBwUXVlcnlTZWxlY3RvckFsbCB9KSA9PiB7XG4gICAgICAgIHJldHVybiBwUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvciA9IChlbGVtZW50LCBzZWxlY3RvciwgeyBwUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBwUXVlcnlTZWxlY3RvcihlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBRdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IHRva2VuaXplLCBUT0tFTlMsIHN0cmluZ2lmeSwgfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9wYXJzZWwtanMvcGFyc2VsLWpzLmpzJztcblRPS0VOU1snbmVzdGluZyddID0gLyYvZztcblRPS0VOU1snY29tYmluYXRvciddID0gL1xccyooPj4+Pj98W1xccz4rfl0pXFxzKi9nO1xuY29uc3QgRVNDQVBFX1JFR0VYUCA9IC9cXFxcW1xcc1xcU10vZztcbmNvbnN0IHVucXVvdGUgPSAodGV4dCkgPT4ge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBpZiAoKHRleHRbMF0gPT09ICdcIicgfHwgdGV4dFswXSA9PT0gXCInXCIpICYmIHRleHQuZW5kc1dpdGgodGV4dFswXSkpIHtcbiAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMSwgLTEpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKEVTQ0FQRV9SRUdFWFAsIG1hdGNoID0+IHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdO1xuICAgIH0pO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBTZWxlY3RvcnMoc2VsZWN0b3IpIHtcbiAgICBsZXQgaXNQdXJlQ1NTID0gdHJ1ZTtcbiAgICBsZXQgaGFzQXJpYSA9IGZhbHNlO1xuICAgIGxldCBoYXNQc2V1ZG9DbGFzc2VzID0gZmFsc2U7XG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemUoc2VsZWN0b3IpO1xuICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbW10sIGlzUHVyZUNTUywgaGFzUHNldWRvQ2xhc3NlcywgZmFsc2VdO1xuICAgIH1cbiAgICBsZXQgY29tcG91bmRTZWxlY3RvciA9IFtdO1xuICAgIGxldCBjb21wbGV4U2VsZWN0b3IgPSBbY29tcG91bmRTZWxlY3Rvcl07XG4gICAgY29uc3Qgc2VsZWN0b3JzID0gW2NvbXBsZXhTZWxlY3Rvcl07XG4gICAgY29uc3Qgc3RvcmFnZSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY29tYmluYXRvcic6XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbi5jb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCI+Pj5cIiAvKiBQQ29tYmluYXRvci5EZXNjZW5kZW50ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQdXJlQ1NTID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3VuZFNlbGVjdG9yLnB1c2goc3RyaW5naWZ5KHN0b3JhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNwbGljZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kU2VsZWN0b3IgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZWxlY3Rvci5wdXNoKFwiPj4+XCIgLyogUENvbWJpbmF0b3IuRGVzY2VuZGVudCAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4U2VsZWN0b3IucHVzaChjb21wb3VuZFNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPj4+PlwiIC8qIFBDb21iaW5hdG9yLkNoaWxkICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQdXJlQ1NTID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3VuZFNlbGVjdG9yLnB1c2goc3RyaW5naWZ5KHN0b3JhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNwbGljZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kU2VsZWN0b3IgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZWxlY3Rvci5wdXNoKFwiPj4+PlwiIC8qIFBDb21iaW5hdG9yLkNoaWxkICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZWxlY3Rvci5wdXNoKGNvbXBvdW5kU2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHNldWRvLWVsZW1lbnQnOlxuICAgICAgICAgICAgICAgIGlmICghdG9rZW4ubmFtZS5zdGFydHNXaXRoKCctcC0nKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNQdXJlQ1NTID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JhZ2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kU2VsZWN0b3IucHVzaChzdHJpbmdpZnkoc3RvcmFnZSkpO1xuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNwbGljZSgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRva2VuLm5hbWUuc2xpY2UoMyk7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdhcmlhJykge1xuICAgICAgICAgICAgICAgICAgICBoYXNBcmlhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcG91bmRTZWxlY3Rvci5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVucXVvdGUodG9rZW4uYXJndW1lbnQgPz8gJycpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgY2FzZSAncHNldWRvLWNsYXNzJzpcbiAgICAgICAgICAgICAgICBoYXNQc2V1ZG9DbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmRTZWxlY3Rvci5wdXNoKHN0cmluZ2lmeShzdG9yYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2Uuc3BsaWNlKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wb3VuZFNlbGVjdG9yID0gW107XG4gICAgICAgICAgICAgICAgY29tcGxleFNlbGVjdG9yID0gW2NvbXBvdW5kU2VsZWN0b3JdO1xuICAgICAgICAgICAgICAgIHNlbGVjdG9ycy5wdXNoKGNvbXBsZXhTZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmFnZS5wdXNoKHRva2VuKTtcbiAgICB9XG4gICAgaWYgKHN0b3JhZ2UubGVuZ3RoKSB7XG4gICAgICAgIGNvbXBvdW5kU2VsZWN0b3IucHVzaChzdHJpbmdpZnkoc3RvcmFnZSkpO1xuICAgIH1cbiAgICByZXR1cm4gW3NlbGVjdG9ycywgaXNQdXJlQ1NTLCBoYXNQc2V1ZG9DbGFzc2VzLCBoYXNBcmlhXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBTZWxlY3RvclBhcnNlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9RdWVyeUhhbmRsZXIuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBpZXJjZVF1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3IgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgcGllcmNlUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBwaWVyY2VRdWVyeVNlbGVjdG9yKGVsZW1lbnQsIHNlbGVjdG9yKTtcbiAgICB9O1xuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yQWxsID0gKGVsZW1lbnQsIHNlbGVjdG9yLCB7IHBpZXJjZVF1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICByZXR1cm4gcGllcmNlUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBpZXJjZVF1ZXJ5SGFuZGxlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvZHVjdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgX2Nvbm5lY3RUb0Jyb3dzZXIgfSBmcm9tICcuL0Jyb3dzZXJDb25uZWN0b3IuanMnO1xuaW1wb3J0IHsgY3VzdG9tUXVlcnlIYW5kbGVycywgfSBmcm9tICcuL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG4vKipcbiAqIFRoZSBtYWluIFB1cHBldGVlciBjbGFzcy5cbiAqXG4gKiBJTVBPUlRBTlQ6IGlmIHlvdSBhcmUgdXNpbmcgUHVwcGV0ZWVyIGluIGEgTm9kZSBlbnZpcm9ubWVudCwgeW91IHdpbGwgZ2V0IGFuXG4gKiBpbnN0YW5jZSBvZiB7QGxpbmsgUHVwcGV0ZWVyTm9kZX0gd2hlbiB5b3UgaW1wb3J0IG9yIHJlcXVpcmUgYHB1cHBldGVlcmAuXG4gKiBUaGF0IGNsYXNzIGV4dGVuZHMgYFB1cHBldGVlcmAsIHNvIGhhcyBhbGwgdGhlIG1ldGhvZHMgZG9jdW1lbnRlZCBiZWxvdyBhc1xuICogd2VsbCBhcyBhbGwgdGhhdCBhcmUgZGVmaW5lZCBvbiB7QGxpbmsgUHVwcGV0ZWVyTm9kZX0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUHVwcGV0ZWVyIHtcbiAgICAvKipcbiAgICAgKiBPcGVyYXRpb25zIGZvciB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJzfS4gU2VlXG4gICAgICoge0BsaW5rIEN1c3RvbVF1ZXJ5SGFuZGxlclJlZ2lzdHJ5fS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBjdXN0b21RdWVyeUhhbmRsZXJzID0gY3VzdG9tUXVlcnlIYW5kbGVycztcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBZnRlciByZWdpc3RyYXRpb24sIHRoZSBoYW5kbGVyIGNhbiBiZSB1c2VkIGV2ZXJ5d2hlcmUgd2hlcmUgYSBzZWxlY3RvciBpc1xuICAgICAqIGV4cGVjdGVkIGJ5IHByZXBlbmRpbmcgdGhlIHNlbGVjdGlvbiBzdHJpbmcgd2l0aCBgPG5hbWU+L2AuIFRoZSBuYW1lIGlzIG9ubHlcbiAgICAgKiBhbGxvd2VkIHRvIGNvbnNpc3Qgb2YgbG93ZXItIGFuZCB1cHBlciBjYXNlIGxhdGluIGxldHRlcnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogcHVwcGV0ZWVyLnJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyKCd0ZXh0JywgeyDigKYgfSk7XG4gICAgICogY29uc3QgYUhhbmRsZSA9IGF3YWl0IHBhZ2UuJCgndGV4dC/igKYnKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgdGhhdCB0aGUgY3VzdG9tIHF1ZXJ5IGhhbmRsZXIgd2lsbCBiZSByZWdpc3RlcmVkXG4gICAgICogdW5kZXIuXG4gICAgICogQHBhcmFtIHF1ZXJ5SGFuZGxlciAtIFRoZSB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJ9XG4gICAgICogdG8gcmVnaXN0ZXIuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyKG5hbWUsIHF1ZXJ5SGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKG5hbWUsIHF1ZXJ5SGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIHF1ZXJ5IGhhbmRsZXIgZm9yIGEgZ2l2ZW4gbmFtZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdW5yZWdpc3RlckN1c3RvbVF1ZXJ5SGFuZGxlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVF1ZXJ5SGFuZGxlcnMudW5yZWdpc3RlcihuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIGN1c3RvbSBxdWVyeSBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3VzdG9tUXVlcnlIYW5kbGVyTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVF1ZXJ5SGFuZGxlcnMubmFtZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgYWxsIGN1c3RvbSBxdWVyeSBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBzdGF0aWMgY2xlYXJDdXN0b21RdWVyeUhhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21RdWVyeUhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9pc1B1cHBldGVlckNvcmU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2NoYW5nZWRQcm9kdWN0ID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5faXNQdXBwZXRlZXJDb3JlID0gc2V0dGluZ3MuaXNQdXBwZXRlZXJDb3JlO1xuICAgICAgICB0aGlzLmNvbm5lY3QgPSB0aGlzLmNvbm5lY3QuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgYXR0YWNoZXMgUHVwcGV0ZWVyIHRvIGFuIGV4aXN0aW5nIGJyb3dzZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTZXQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMgdG8gc2V0IG9uIHRoZSBicm93c2VyLlxuICAgICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gYnJvd3NlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25uZWN0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9jb25uZWN0VG9Ccm93c2VyKG9wdGlvbnMpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVB1cHBldGVlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbmltcG9ydCB7IF9pc0VsZW1lbnRIYW5kbGUgfSBmcm9tICcuLi9hcGkvRWxlbWVudEhhbmRsZVN5bWJvbC5qcyc7XG5pbXBvcnQgeyBpc0Vycm9yTGlrZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IGludGVycG9sYXRlRnVuY3Rpb24sIHN0cmluZ2lmeUZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbC9GdW5jdGlvbi5qcyc7XG5pbXBvcnQgeyB0cmFuc3Bvc2VJdGVyYWJsZUhhbmRsZSB9IGZyb20gJy4vSGFuZGxlSXRlcmF0b3IuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4vTGF6eUFyZy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgUXVlcnlIYW5kbGVyIHtcbiAgICAvLyBFaXRoZXIgb25lIG9mIHRoZXNlIG1heSBiZSBpbXBsZW1lbnRlZCwgYnV0IGF0IGxlYXN0IG9uZSBtdXN0IGJlLlxuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yQWxsO1xuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yO1xuICAgIHN0YXRpYyBnZXQgX3F1ZXJ5U2VsZWN0b3IoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5U2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBkZWZhdWx0IGBxdWVyeVNlbGVjdG9yYC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMucXVlcnlTZWxlY3RvciA9IGludGVycG9sYXRlRnVuY3Rpb24oYXN5bmMgKG5vZGUsIHNlbGVjdG9yLCBQdXBwZXRlZXJVdGlsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVNlbGVjdG9yQWxsID0gUExBQ0VIT0xERVIoJ3F1ZXJ5U2VsZWN0b3JBbGwnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBxdWVyeVNlbGVjdG9yQWxsKG5vZGUsIHNlbGVjdG9yLCBQdXBwZXRlZXJVdGlsKTtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHF1ZXJ5U2VsZWN0b3JBbGw6IHN0cmluZ2lmeUZ1bmN0aW9uKHRoaXMucXVlcnlTZWxlY3RvckFsbCksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBfcXVlcnlTZWxlY3RvckFsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucXVlcnlTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGRlZmF1bHQgYHF1ZXJ5U2VsZWN0b3JBbGxgLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodGhpcy5xdWVyeVNlbGVjdG9yQWxsID0gaW50ZXJwb2xhdGVGdW5jdGlvbihhc3luYyBmdW5jdGlvbiogKG5vZGUsIHNlbGVjdG9yLCBQdXBwZXRlZXJVdGlsKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVNlbGVjdG9yID0gUExBQ0VIT0xERVIoJ3F1ZXJ5U2VsZWN0b3InKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5U2VsZWN0b3Iobm9kZSwgc2VsZWN0b3IsIFB1cHBldGVlclV0aWwpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgcXVlcnlTZWxlY3Rvcjogc3RyaW5naWZ5RnVuY3Rpb24odGhpcy5xdWVyeVNlbGVjdG9yKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIGZvciBtdWx0aXBsZSBub2RlcyBnaXZlbiBhIHNlbGVjdG9yIGFuZCB7QGxpbmsgRWxlbWVudEhhbmRsZX0uXG4gICAgICpcbiAgICAgKiBBa2luIHRvIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvcXVlcnlTZWxlY3RvckFsbCB8IERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoKX0uXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jICpxdWVyeUFsbChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICBjb25zdCBlbnZfMSA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBhd2FpdCBlbGVtZW50LmV2YWx1YXRlSGFuZGxlKHRoaXMuX3F1ZXJ5U2VsZWN0b3JBbGwsIHNlbGVjdG9yLCBMYXp5QXJnLmNyZWF0ZShjb250ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgfSkpLCBmYWxzZSk7XG4gICAgICAgICAgICB5aWVsZCogdHJhbnNwb3NlSXRlcmFibGVIYW5kbGUoaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUXVlcmllcyBmb3IgYSBzaW5nbGUgbm9kZSBnaXZlbiBhIHNlbGVjdG9yIGFuZCB7QGxpbmsgRWxlbWVudEhhbmRsZX0uXG4gICAgICpcbiAgICAgKiBBa2luIHRvIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvcXVlcnlTZWxlY3Rvcn0uXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHF1ZXJ5T25lKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzIsIGF3YWl0IGVsZW1lbnQuZXZhbHVhdGVIYW5kbGUodGhpcy5fcXVlcnlTZWxlY3Rvciwgc2VsZWN0b3IsIExhenlBcmcuY3JlYXRlKGNvbnRleHQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnB1cHBldGVlclV0aWw7XG4gICAgICAgICAgICB9KSksIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghKF9pc0VsZW1lbnRIYW5kbGUgaW4gcmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzI7XG4gICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdhaXRzIHVudGlsIGEgc2luZ2xlIG5vZGUgYXBwZWFycyBmb3IgYSBnaXZlbiBzZWxlY3RvciBhbmRcbiAgICAgKiB7QGxpbmsgRWxlbWVudEhhbmRsZX0uXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIHF1ZXJ5IHRoZSBoYW5kbGUgaW4gdGhlIFB1cHBldGVlciB3b3JsZCBhbmQgbWlncmF0ZSB0aGVcbiAgICAgKiByZXN1bHQgdG8gdGhlIG1haW4gd29ybGQuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHdhaXRGb3IoZWxlbWVudE9yRnJhbWUsIHNlbGVjdG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGZyYW1lO1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8zLCBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKF9pc0VsZW1lbnRIYW5kbGUgaW4gZWxlbWVudE9yRnJhbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyYW1lID0gZWxlbWVudE9yRnJhbWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnJhbWUgPSBlbGVtZW50T3JGcmFtZS5mcmFtZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZnJhbWUuaXNvbGF0ZWRSZWFsbSgpLmFkb3B0SGFuZGxlKGVsZW1lbnRPckZyYW1lKTtcbiAgICAgICAgICAgIH0pKCksIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmlzaWJsZSA9IGZhbHNlLCBoaWRkZW4gPSBmYWxzZSwgdGltZW91dCwgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgcG9sbGluZyA9IG9wdGlvbnMucG9sbGluZyA/P1xuICAgICAgICAgICAgICAgICh2aXNpYmxlIHx8IGhpZGRlbiA/IFwicmFmXCIgLyogUG9sbGluZ09wdGlvbnMuUkFGICovIDogXCJtdXRhdGlvblwiIC8qIFBvbGxpbmdPcHRpb25zLk1VVEFUSU9OICovKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52XzQgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfNCwgYXdhaXQgZnJhbWUuaXNvbGF0ZWRSZWFsbSgpLndhaXRGb3JGdW5jdGlvbihhc3luYyAoUHVwcGV0ZWVyVXRpbCwgcXVlcnksIHNlbGVjdG9yLCByb290LCB2aXNpYmxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVNlbGVjdG9yID0gUHVwcGV0ZWVyVXRpbC5jcmVhdGVGdW5jdGlvbihxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gYXdhaXQgcXVlcnlTZWxlY3Rvcihyb290ID8/IGRvY3VtZW50LCBzZWxlY3RvciwgUHVwcGV0ZWVyVXRpbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHVwcGV0ZWVyVXRpbC5jaGVja1Zpc2liaWxpdHkobm9kZSwgdmlzaWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvbGxpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICByb290OiBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgfSwgTGF6eUFyZy5jcmVhdGUoY29udGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgICAgICAgICB9KSwgc3RyaW5naWZ5RnVuY3Rpb24odGhpcy5fcXVlcnlTZWxlY3RvciksIHNlbGVjdG9yLCBlbGVtZW50LCB2aXNpYmxlID8gdHJ1ZSA6IGhpZGRlbiA/IGZhbHNlIDogdW5kZWZpbmVkKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzaWduYWwucmVhc29uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghKF9pc0VsZW1lbnRIYW5kbGUgaW4gaGFuZGxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZyYW1lLm1haW5SZWFsbSgpLnRyYW5zZmVySGFuZGxlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzMpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52XzQuZXJyb3IgPSBlXzM7XG4gICAgICAgICAgICAgICAgICAgIGVudl80Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0Vycm9yTGlrZShlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPSBgV2FpdGluZyBmb3Igc2VsZWN0b3IgXFxgJHtzZWxlY3Rvcn1cXGAgZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV80KSB7XG4gICAgICAgICAgICBlbnZfMy5lcnJvciA9IGVfNDtcbiAgICAgICAgICAgIGVudl8zLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjQgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IHNvdXJjZSBhcyBpbmplY3RlZFNvdXJjZSB9IGZyb20gJy4uL2dlbmVyYXRlZC9pbmplY3RlZC5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgU2NyaXB0SW5qZWN0b3Ige1xuICAgICN1cGRhdGVkID0gZmFsc2U7XG4gICAgI2FtZW5kbWVudHMgPSBuZXcgU2V0KCk7XG4gICAgLy8gQXBwZW5kcyBhIHN0YXRlbWVudCBvZiB0aGUgZm9ybSBgKFB1cHBldGVlclV0aWwpID0+IHsuLi59YC5cbiAgICBhcHBlbmQoc3RhdGVtZW50KSB7XG4gICAgICAgIHRoaXMuI3VwZGF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNhbWVuZG1lbnRzLmFkZChzdGF0ZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9wKHN0YXRlbWVudCkge1xuICAgICAgICB0aGlzLiN1cGRhdGUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jYW1lbmRtZW50cy5kZWxldGUoc3RhdGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGluamVjdChpbmplY3QsIGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuI3VwZGF0ZWQgfHwgZm9yY2UpIHtcbiAgICAgICAgICAgIGluamVjdCh0aGlzLiNnZXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jdXBkYXRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAjdXBkYXRlKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuI3VwZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICAjZ2V0KCkge1xuICAgICAgICByZXR1cm4gYCgoKSA9PiB7XG4gICAgICBjb25zdCBtb2R1bGUgPSB7fTtcbiAgICAgICR7aW5qZWN0ZWRTb3VyY2V9XG4gICAgICAke1suLi50aGlzLiNhbWVuZG1lbnRzXVxuICAgICAgICAgICAgLm1hcChzdGF0ZW1lbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAoJHtzdGF0ZW1lbnR9KShtb2R1bGUuZXhwb3J0cy5kZWZhdWx0KTtgO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJycpfVxuICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzLmRlZmF1bHQ7XG4gICAgfSkoKWA7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHNjcmlwdEluamVjdG9yID0gbmV3IFNjcmlwdEluamVjdG9yKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY3JpcHRJbmplY3Rvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgU2VjdXJpdHlEZXRhaWxzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHNlY3VyaXR5IGRldGFpbHMgb2YgYVxuICogcmVzcG9uc2UgdGhhdCB3YXMgcmVjZWl2ZWQgb3ZlciBhIHNlY3VyZSBjb25uZWN0aW9uLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3VyaXR5RGV0YWlscyB7XG4gICAgI3N1YmplY3ROYW1lO1xuICAgICNpc3N1ZXI7XG4gICAgI3ZhbGlkRnJvbTtcbiAgICAjdmFsaWRUbztcbiAgICAjcHJvdG9jb2w7XG4gICAgI3Nhbkxpc3Q7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2VjdXJpdHlQYXlsb2FkKSB7XG4gICAgICAgIHRoaXMuI3N1YmplY3ROYW1lID0gc2VjdXJpdHlQYXlsb2FkLnN1YmplY3ROYW1lO1xuICAgICAgICB0aGlzLiNpc3N1ZXIgPSBzZWN1cml0eVBheWxvYWQuaXNzdWVyO1xuICAgICAgICB0aGlzLiN2YWxpZEZyb20gPSBzZWN1cml0eVBheWxvYWQudmFsaWRGcm9tO1xuICAgICAgICB0aGlzLiN2YWxpZFRvID0gc2VjdXJpdHlQYXlsb2FkLnZhbGlkVG87XG4gICAgICAgIHRoaXMuI3Byb3RvY29sID0gc2VjdXJpdHlQYXlsb2FkLnByb3RvY29sO1xuICAgICAgICB0aGlzLiNzYW5MaXN0ID0gc2VjdXJpdHlQYXlsb2FkLnNhbkxpc3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpc3N1ZXIgb2YgdGhlIGNlcnRpZmljYXRlLlxuICAgICAqL1xuICAgIGlzc3VlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzc3VlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfdGltZSB8IFVuaXggdGltZXN0YW1wfVxuICAgICAqIG1hcmtpbmcgdGhlIHN0YXJ0IG9mIHRoZSBjZXJ0aWZpY2F0ZSdzIHZhbGlkaXR5LlxuICAgICAqL1xuICAgIHZhbGlkRnJvbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3ZhbGlkRnJvbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfdGltZSB8IFVuaXggdGltZXN0YW1wfVxuICAgICAqIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgY2VydGlmaWNhdGUncyB2YWxpZGl0eS5cbiAgICAgKi9cbiAgICB2YWxpZFRvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdmFsaWRUbztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHByb3RvY29sIGJlaW5nIHVzZWQsIGUuZy4gXCJUTFMgMS4yXCIuXG4gICAgICovXG4gICAgcHJvdG9jb2woKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm90b2NvbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QgdG8gd2hpY2ggdGhlIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQuXG4gICAgICovXG4gICAgc3ViamVjdE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdWJqZWN0TmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2Yge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N1YmplY3RfQWx0ZXJuYXRpdmVfTmFtZSB8IHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZXMgKFNBTnMpfSBvZiB0aGUgY2VydGlmaWNhdGUuXG4gICAgICovXG4gICAgc3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzYW5MaXN0O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNlY3VyaXR5RGV0YWlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tRdWV1ZSB7XG4gICAgI2NoYWluO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLiNjaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBwb3N0VGFzayh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI2NoYWluLnRoZW4odGFzayk7XG4gICAgICAgIHRoaXMuI2NoYWluID0gcmVzdWx0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFza1F1ZXVlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1F1ZXJ5SGFuZGxlci5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgVGV4dFF1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JBbGwgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgdGV4dFF1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICByZXR1cm4gdGV4dFF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UZXh0UXVlcnlIYW5kbGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSAzMDAwMDtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lb3V0U2V0dGluZ3Mge1xuICAgICNkZWZhdWx0VGltZW91dDtcbiAgICAjZGVmYXVsdE5hdmlnYXRpb25UaW1lb3V0O1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0VGltZW91dCA9IG51bGw7XG4gICAgICAgIHRoaXMuI2RlZmF1bHROYXZpZ2F0aW9uVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIHNldERlZmF1bHRUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy4jZGVmYXVsdFRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIH1cbiAgICBzZXREZWZhdWx0TmF2aWdhdGlvblRpbWVvdXQodGltZW91dCkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0TmF2aWdhdGlvblRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIH1cbiAgICBuYXZpZ2F0aW9uVGltZW91dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RlZmF1bHROYXZpZ2F0aW9uVGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHROYXZpZ2F0aW9uVGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jZGVmYXVsdFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0VGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gREVGQVVMVF9USU1FT1VUO1xuICAgIH1cbiAgICB0aW1lb3V0KCkge1xuICAgICAgICBpZiAodGhpcy4jZGVmYXVsdFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0VGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gREVGQVVMVF9USU1FT1VUO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRpbWVvdXRTZXR0aW5ncy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IF9rZXlEZWZpbml0aW9ucyA9IHtcbiAgICAnMCc6IHsga2V5Q29kZTogNDgsIGtleTogJzAnLCBjb2RlOiAnRGlnaXQwJyB9LFxuICAgICcxJzogeyBrZXlDb2RlOiA0OSwga2V5OiAnMScsIGNvZGU6ICdEaWdpdDEnIH0sXG4gICAgJzInOiB7IGtleUNvZGU6IDUwLCBrZXk6ICcyJywgY29kZTogJ0RpZ2l0MicgfSxcbiAgICAnMyc6IHsga2V5Q29kZTogNTEsIGtleTogJzMnLCBjb2RlOiAnRGlnaXQzJyB9LFxuICAgICc0JzogeyBrZXlDb2RlOiA1Miwga2V5OiAnNCcsIGNvZGU6ICdEaWdpdDQnIH0sXG4gICAgJzUnOiB7IGtleUNvZGU6IDUzLCBrZXk6ICc1JywgY29kZTogJ0RpZ2l0NScgfSxcbiAgICAnNic6IHsga2V5Q29kZTogNTQsIGtleTogJzYnLCBjb2RlOiAnRGlnaXQ2JyB9LFxuICAgICc3JzogeyBrZXlDb2RlOiA1NSwga2V5OiAnNycsIGNvZGU6ICdEaWdpdDcnIH0sXG4gICAgJzgnOiB7IGtleUNvZGU6IDU2LCBrZXk6ICc4JywgY29kZTogJ0RpZ2l0OCcgfSxcbiAgICAnOSc6IHsga2V5Q29kZTogNTcsIGtleTogJzknLCBjb2RlOiAnRGlnaXQ5JyB9LFxuICAgIFBvd2VyOiB7IGtleTogJ1Bvd2VyJywgY29kZTogJ1Bvd2VyJyB9LFxuICAgIEVqZWN0OiB7IGtleTogJ0VqZWN0JywgY29kZTogJ0VqZWN0JyB9LFxuICAgIEFib3J0OiB7IGtleUNvZGU6IDMsIGNvZGU6ICdBYm9ydCcsIGtleTogJ0NhbmNlbCcgfSxcbiAgICBIZWxwOiB7IGtleUNvZGU6IDYsIGNvZGU6ICdIZWxwJywga2V5OiAnSGVscCcgfSxcbiAgICBCYWNrc3BhY2U6IHsga2V5Q29kZTogOCwgY29kZTogJ0JhY2tzcGFjZScsIGtleTogJ0JhY2tzcGFjZScgfSxcbiAgICBUYWI6IHsga2V5Q29kZTogOSwgY29kZTogJ1RhYicsIGtleTogJ1RhYicgfSxcbiAgICBOdW1wYWQ1OiB7XG4gICAgICAgIGtleUNvZGU6IDEyLFxuICAgICAgICBzaGlmdEtleUNvZGU6IDEwMSxcbiAgICAgICAga2V5OiAnQ2xlYXInLFxuICAgICAgICBjb2RlOiAnTnVtcGFkNScsXG4gICAgICAgIHNoaWZ0S2V5OiAnNScsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkRW50ZXI6IHtcbiAgICAgICAga2V5Q29kZTogMTMsXG4gICAgICAgIGNvZGU6ICdOdW1wYWRFbnRlcicsXG4gICAgICAgIGtleTogJ0VudGVyJyxcbiAgICAgICAgdGV4dDogJ1xccicsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgRW50ZXI6IHsga2V5Q29kZTogMTMsIGNvZGU6ICdFbnRlcicsIGtleTogJ0VudGVyJywgdGV4dDogJ1xccicgfSxcbiAgICAnXFxyJzogeyBrZXlDb2RlOiAxMywgY29kZTogJ0VudGVyJywga2V5OiAnRW50ZXInLCB0ZXh0OiAnXFxyJyB9LFxuICAgICdcXG4nOiB7IGtleUNvZGU6IDEzLCBjb2RlOiAnRW50ZXInLCBrZXk6ICdFbnRlcicsIHRleHQ6ICdcXHInIH0sXG4gICAgU2hpZnRMZWZ0OiB7IGtleUNvZGU6IDE2LCBjb2RlOiAnU2hpZnRMZWZ0Jywga2V5OiAnU2hpZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIFNoaWZ0UmlnaHQ6IHsga2V5Q29kZTogMTYsIGNvZGU6ICdTaGlmdFJpZ2h0Jywga2V5OiAnU2hpZnQnLCBsb2NhdGlvbjogMiB9LFxuICAgIENvbnRyb2xMZWZ0OiB7XG4gICAgICAgIGtleUNvZGU6IDE3LFxuICAgICAgICBjb2RlOiAnQ29udHJvbExlZnQnLFxuICAgICAgICBrZXk6ICdDb250cm9sJyxcbiAgICAgICAgbG9jYXRpb246IDEsXG4gICAgfSxcbiAgICBDb250cm9sUmlnaHQ6IHtcbiAgICAgICAga2V5Q29kZTogMTcsXG4gICAgICAgIGNvZGU6ICdDb250cm9sUmlnaHQnLFxuICAgICAgICBrZXk6ICdDb250cm9sJyxcbiAgICAgICAgbG9jYXRpb246IDIsXG4gICAgfSxcbiAgICBBbHRMZWZ0OiB7IGtleUNvZGU6IDE4LCBjb2RlOiAnQWx0TGVmdCcsIGtleTogJ0FsdCcsIGxvY2F0aW9uOiAxIH0sXG4gICAgQWx0UmlnaHQ6IHsga2V5Q29kZTogMTgsIGNvZGU6ICdBbHRSaWdodCcsIGtleTogJ0FsdCcsIGxvY2F0aW9uOiAyIH0sXG4gICAgUGF1c2U6IHsga2V5Q29kZTogMTksIGNvZGU6ICdQYXVzZScsIGtleTogJ1BhdXNlJyB9LFxuICAgIENhcHNMb2NrOiB7IGtleUNvZGU6IDIwLCBjb2RlOiAnQ2Fwc0xvY2snLCBrZXk6ICdDYXBzTG9jaycgfSxcbiAgICBFc2NhcGU6IHsga2V5Q29kZTogMjcsIGNvZGU6ICdFc2NhcGUnLCBrZXk6ICdFc2NhcGUnIH0sXG4gICAgQ29udmVydDogeyBrZXlDb2RlOiAyOCwgY29kZTogJ0NvbnZlcnQnLCBrZXk6ICdDb252ZXJ0JyB9LFxuICAgIE5vbkNvbnZlcnQ6IHsga2V5Q29kZTogMjksIGNvZGU6ICdOb25Db252ZXJ0Jywga2V5OiAnTm9uQ29udmVydCcgfSxcbiAgICBTcGFjZTogeyBrZXlDb2RlOiAzMiwgY29kZTogJ1NwYWNlJywga2V5OiAnICcgfSxcbiAgICBOdW1wYWQ5OiB7XG4gICAgICAgIGtleUNvZGU6IDMzLFxuICAgICAgICBzaGlmdEtleUNvZGU6IDEwNSxcbiAgICAgICAga2V5OiAnUGFnZVVwJyxcbiAgICAgICAgY29kZTogJ051bXBhZDknLFxuICAgICAgICBzaGlmdEtleTogJzknLFxuICAgICAgICBsb2NhdGlvbjogMyxcbiAgICB9LFxuICAgIFBhZ2VVcDogeyBrZXlDb2RlOiAzMywgY29kZTogJ1BhZ2VVcCcsIGtleTogJ1BhZ2VVcCcgfSxcbiAgICBOdW1wYWQzOiB7XG4gICAgICAgIGtleUNvZGU6IDM0LFxuICAgICAgICBzaGlmdEtleUNvZGU6IDk5LFxuICAgICAgICBrZXk6ICdQYWdlRG93bicsXG4gICAgICAgIGNvZGU6ICdOdW1wYWQzJyxcbiAgICAgICAgc2hpZnRLZXk6ICczJyxcbiAgICAgICAgbG9jYXRpb246IDMsXG4gICAgfSxcbiAgICBQYWdlRG93bjogeyBrZXlDb2RlOiAzNCwgY29kZTogJ1BhZ2VEb3duJywga2V5OiAnUGFnZURvd24nIH0sXG4gICAgRW5kOiB7IGtleUNvZGU6IDM1LCBjb2RlOiAnRW5kJywga2V5OiAnRW5kJyB9LFxuICAgIE51bXBhZDE6IHtcbiAgICAgICAga2V5Q29kZTogMzUsXG4gICAgICAgIHNoaWZ0S2V5Q29kZTogOTcsXG4gICAgICAgIGtleTogJ0VuZCcsXG4gICAgICAgIGNvZGU6ICdOdW1wYWQxJyxcbiAgICAgICAgc2hpZnRLZXk6ICcxJyxcbiAgICAgICAgbG9jYXRpb246IDMsXG4gICAgfSxcbiAgICBIb21lOiB7IGtleUNvZGU6IDM2LCBjb2RlOiAnSG9tZScsIGtleTogJ0hvbWUnIH0sXG4gICAgTnVtcGFkNzoge1xuICAgICAgICBrZXlDb2RlOiAzNixcbiAgICAgICAgc2hpZnRLZXlDb2RlOiAxMDMsXG4gICAgICAgIGtleTogJ0hvbWUnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkNycsXG4gICAgICAgIHNoaWZ0S2V5OiAnNycsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgQXJyb3dMZWZ0OiB7IGtleUNvZGU6IDM3LCBjb2RlOiAnQXJyb3dMZWZ0Jywga2V5OiAnQXJyb3dMZWZ0JyB9LFxuICAgIE51bXBhZDQ6IHtcbiAgICAgICAga2V5Q29kZTogMzcsXG4gICAgICAgIHNoaWZ0S2V5Q29kZTogMTAwLFxuICAgICAgICBrZXk6ICdBcnJvd0xlZnQnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkNCcsXG4gICAgICAgIHNoaWZ0S2V5OiAnNCcsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkODoge1xuICAgICAgICBrZXlDb2RlOiAzOCxcbiAgICAgICAgc2hpZnRLZXlDb2RlOiAxMDQsXG4gICAgICAgIGtleTogJ0Fycm93VXAnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkOCcsXG4gICAgICAgIHNoaWZ0S2V5OiAnOCcsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgQXJyb3dVcDogeyBrZXlDb2RlOiAzOCwgY29kZTogJ0Fycm93VXAnLCBrZXk6ICdBcnJvd1VwJyB9LFxuICAgIEFycm93UmlnaHQ6IHsga2V5Q29kZTogMzksIGNvZGU6ICdBcnJvd1JpZ2h0Jywga2V5OiAnQXJyb3dSaWdodCcgfSxcbiAgICBOdW1wYWQ2OiB7XG4gICAgICAgIGtleUNvZGU6IDM5LFxuICAgICAgICBzaGlmdEtleUNvZGU6IDEwMixcbiAgICAgICAga2V5OiAnQXJyb3dSaWdodCcsXG4gICAgICAgIGNvZGU6ICdOdW1wYWQ2JyxcbiAgICAgICAgc2hpZnRLZXk6ICc2JyxcbiAgICAgICAgbG9jYXRpb246IDMsXG4gICAgfSxcbiAgICBOdW1wYWQyOiB7XG4gICAgICAgIGtleUNvZGU6IDQwLFxuICAgICAgICBzaGlmdEtleUNvZGU6IDk4LFxuICAgICAgICBrZXk6ICdBcnJvd0Rvd24nLFxuICAgICAgICBjb2RlOiAnTnVtcGFkMicsXG4gICAgICAgIHNoaWZ0S2V5OiAnMicsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgQXJyb3dEb3duOiB7IGtleUNvZGU6IDQwLCBjb2RlOiAnQXJyb3dEb3duJywga2V5OiAnQXJyb3dEb3duJyB9LFxuICAgIFNlbGVjdDogeyBrZXlDb2RlOiA0MSwgY29kZTogJ1NlbGVjdCcsIGtleTogJ1NlbGVjdCcgfSxcbiAgICBPcGVuOiB7IGtleUNvZGU6IDQzLCBjb2RlOiAnT3BlbicsIGtleTogJ0V4ZWN1dGUnIH0sXG4gICAgUHJpbnRTY3JlZW46IHsga2V5Q29kZTogNDQsIGNvZGU6ICdQcmludFNjcmVlbicsIGtleTogJ1ByaW50U2NyZWVuJyB9LFxuICAgIEluc2VydDogeyBrZXlDb2RlOiA0NSwgY29kZTogJ0luc2VydCcsIGtleTogJ0luc2VydCcgfSxcbiAgICBOdW1wYWQwOiB7XG4gICAgICAgIGtleUNvZGU6IDQ1LFxuICAgICAgICBzaGlmdEtleUNvZGU6IDk2LFxuICAgICAgICBrZXk6ICdJbnNlcnQnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkMCcsXG4gICAgICAgIHNoaWZ0S2V5OiAnMCcsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgRGVsZXRlOiB7IGtleUNvZGU6IDQ2LCBjb2RlOiAnRGVsZXRlJywga2V5OiAnRGVsZXRlJyB9LFxuICAgIE51bXBhZERlY2ltYWw6IHtcbiAgICAgICAga2V5Q29kZTogNDYsXG4gICAgICAgIHNoaWZ0S2V5Q29kZTogMTEwLFxuICAgICAgICBjb2RlOiAnTnVtcGFkRGVjaW1hbCcsXG4gICAgICAgIGtleTogJ1xcdTAwMDAnLFxuICAgICAgICBzaGlmdEtleTogJy4nLFxuICAgICAgICBsb2NhdGlvbjogMyxcbiAgICB9LFxuICAgIERpZ2l0MDogeyBrZXlDb2RlOiA0OCwgY29kZTogJ0RpZ2l0MCcsIHNoaWZ0S2V5OiAnKScsIGtleTogJzAnIH0sXG4gICAgRGlnaXQxOiB7IGtleUNvZGU6IDQ5LCBjb2RlOiAnRGlnaXQxJywgc2hpZnRLZXk6ICchJywga2V5OiAnMScgfSxcbiAgICBEaWdpdDI6IHsga2V5Q29kZTogNTAsIGNvZGU6ICdEaWdpdDInLCBzaGlmdEtleTogJ0AnLCBrZXk6ICcyJyB9LFxuICAgIERpZ2l0MzogeyBrZXlDb2RlOiA1MSwgY29kZTogJ0RpZ2l0MycsIHNoaWZ0S2V5OiAnIycsIGtleTogJzMnIH0sXG4gICAgRGlnaXQ0OiB7IGtleUNvZGU6IDUyLCBjb2RlOiAnRGlnaXQ0Jywgc2hpZnRLZXk6ICckJywga2V5OiAnNCcgfSxcbiAgICBEaWdpdDU6IHsga2V5Q29kZTogNTMsIGNvZGU6ICdEaWdpdDUnLCBzaGlmdEtleTogJyUnLCBrZXk6ICc1JyB9LFxuICAgIERpZ2l0NjogeyBrZXlDb2RlOiA1NCwgY29kZTogJ0RpZ2l0NicsIHNoaWZ0S2V5OiAnXicsIGtleTogJzYnIH0sXG4gICAgRGlnaXQ3OiB7IGtleUNvZGU6IDU1LCBjb2RlOiAnRGlnaXQ3Jywgc2hpZnRLZXk6ICcmJywga2V5OiAnNycgfSxcbiAgICBEaWdpdDg6IHsga2V5Q29kZTogNTYsIGNvZGU6ICdEaWdpdDgnLCBzaGlmdEtleTogJyonLCBrZXk6ICc4JyB9LFxuICAgIERpZ2l0OTogeyBrZXlDb2RlOiA1NywgY29kZTogJ0RpZ2l0OScsIHNoaWZ0S2V5OiAnKCcsIGtleTogJzknIH0sXG4gICAgS2V5QTogeyBrZXlDb2RlOiA2NSwgY29kZTogJ0tleUEnLCBzaGlmdEtleTogJ0EnLCBrZXk6ICdhJyB9LFxuICAgIEtleUI6IHsga2V5Q29kZTogNjYsIGNvZGU6ICdLZXlCJywgc2hpZnRLZXk6ICdCJywga2V5OiAnYicgfSxcbiAgICBLZXlDOiB7IGtleUNvZGU6IDY3LCBjb2RlOiAnS2V5QycsIHNoaWZ0S2V5OiAnQycsIGtleTogJ2MnIH0sXG4gICAgS2V5RDogeyBrZXlDb2RlOiA2OCwgY29kZTogJ0tleUQnLCBzaGlmdEtleTogJ0QnLCBrZXk6ICdkJyB9LFxuICAgIEtleUU6IHsga2V5Q29kZTogNjksIGNvZGU6ICdLZXlFJywgc2hpZnRLZXk6ICdFJywga2V5OiAnZScgfSxcbiAgICBLZXlGOiB7IGtleUNvZGU6IDcwLCBjb2RlOiAnS2V5RicsIHNoaWZ0S2V5OiAnRicsIGtleTogJ2YnIH0sXG4gICAgS2V5RzogeyBrZXlDb2RlOiA3MSwgY29kZTogJ0tleUcnLCBzaGlmdEtleTogJ0cnLCBrZXk6ICdnJyB9LFxuICAgIEtleUg6IHsga2V5Q29kZTogNzIsIGNvZGU6ICdLZXlIJywgc2hpZnRLZXk6ICdIJywga2V5OiAnaCcgfSxcbiAgICBLZXlJOiB7IGtleUNvZGU6IDczLCBjb2RlOiAnS2V5SScsIHNoaWZ0S2V5OiAnSScsIGtleTogJ2knIH0sXG4gICAgS2V5SjogeyBrZXlDb2RlOiA3NCwgY29kZTogJ0tleUonLCBzaGlmdEtleTogJ0onLCBrZXk6ICdqJyB9LFxuICAgIEtleUs6IHsga2V5Q29kZTogNzUsIGNvZGU6ICdLZXlLJywgc2hpZnRLZXk6ICdLJywga2V5OiAnaycgfSxcbiAgICBLZXlMOiB7IGtleUNvZGU6IDc2LCBjb2RlOiAnS2V5TCcsIHNoaWZ0S2V5OiAnTCcsIGtleTogJ2wnIH0sXG4gICAgS2V5TTogeyBrZXlDb2RlOiA3NywgY29kZTogJ0tleU0nLCBzaGlmdEtleTogJ00nLCBrZXk6ICdtJyB9LFxuICAgIEtleU46IHsga2V5Q29kZTogNzgsIGNvZGU6ICdLZXlOJywgc2hpZnRLZXk6ICdOJywga2V5OiAnbicgfSxcbiAgICBLZXlPOiB7IGtleUNvZGU6IDc5LCBjb2RlOiAnS2V5TycsIHNoaWZ0S2V5OiAnTycsIGtleTogJ28nIH0sXG4gICAgS2V5UDogeyBrZXlDb2RlOiA4MCwgY29kZTogJ0tleVAnLCBzaGlmdEtleTogJ1AnLCBrZXk6ICdwJyB9LFxuICAgIEtleVE6IHsga2V5Q29kZTogODEsIGNvZGU6ICdLZXlRJywgc2hpZnRLZXk6ICdRJywga2V5OiAncScgfSxcbiAgICBLZXlSOiB7IGtleUNvZGU6IDgyLCBjb2RlOiAnS2V5UicsIHNoaWZ0S2V5OiAnUicsIGtleTogJ3InIH0sXG4gICAgS2V5UzogeyBrZXlDb2RlOiA4MywgY29kZTogJ0tleVMnLCBzaGlmdEtleTogJ1MnLCBrZXk6ICdzJyB9LFxuICAgIEtleVQ6IHsga2V5Q29kZTogODQsIGNvZGU6ICdLZXlUJywgc2hpZnRLZXk6ICdUJywga2V5OiAndCcgfSxcbiAgICBLZXlVOiB7IGtleUNvZGU6IDg1LCBjb2RlOiAnS2V5VScsIHNoaWZ0S2V5OiAnVScsIGtleTogJ3UnIH0sXG4gICAgS2V5VjogeyBrZXlDb2RlOiA4NiwgY29kZTogJ0tleVYnLCBzaGlmdEtleTogJ1YnLCBrZXk6ICd2JyB9LFxuICAgIEtleVc6IHsga2V5Q29kZTogODcsIGNvZGU6ICdLZXlXJywgc2hpZnRLZXk6ICdXJywga2V5OiAndycgfSxcbiAgICBLZXlYOiB7IGtleUNvZGU6IDg4LCBjb2RlOiAnS2V5WCcsIHNoaWZ0S2V5OiAnWCcsIGtleTogJ3gnIH0sXG4gICAgS2V5WTogeyBrZXlDb2RlOiA4OSwgY29kZTogJ0tleVknLCBzaGlmdEtleTogJ1knLCBrZXk6ICd5JyB9LFxuICAgIEtleVo6IHsga2V5Q29kZTogOTAsIGNvZGU6ICdLZXlaJywgc2hpZnRLZXk6ICdaJywga2V5OiAneicgfSxcbiAgICBNZXRhTGVmdDogeyBrZXlDb2RlOiA5MSwgY29kZTogJ01ldGFMZWZ0Jywga2V5OiAnTWV0YScsIGxvY2F0aW9uOiAxIH0sXG4gICAgTWV0YVJpZ2h0OiB7IGtleUNvZGU6IDkyLCBjb2RlOiAnTWV0YVJpZ2h0Jywga2V5OiAnTWV0YScsIGxvY2F0aW9uOiAyIH0sXG4gICAgQ29udGV4dE1lbnU6IHsga2V5Q29kZTogOTMsIGNvZGU6ICdDb250ZXh0TWVudScsIGtleTogJ0NvbnRleHRNZW51JyB9LFxuICAgIE51bXBhZE11bHRpcGx5OiB7XG4gICAgICAgIGtleUNvZGU6IDEwNixcbiAgICAgICAgY29kZTogJ051bXBhZE11bHRpcGx5JyxcbiAgICAgICAga2V5OiAnKicsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkQWRkOiB7IGtleUNvZGU6IDEwNywgY29kZTogJ051bXBhZEFkZCcsIGtleTogJysnLCBsb2NhdGlvbjogMyB9LFxuICAgIE51bXBhZFN1YnRyYWN0OiB7XG4gICAgICAgIGtleUNvZGU6IDEwOSxcbiAgICAgICAgY29kZTogJ051bXBhZFN1YnRyYWN0JyxcbiAgICAgICAga2V5OiAnLScsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkRGl2aWRlOiB7IGtleUNvZGU6IDExMSwgY29kZTogJ051bXBhZERpdmlkZScsIGtleTogJy8nLCBsb2NhdGlvbjogMyB9LFxuICAgIEYxOiB7IGtleUNvZGU6IDExMiwgY29kZTogJ0YxJywga2V5OiAnRjEnIH0sXG4gICAgRjI6IHsga2V5Q29kZTogMTEzLCBjb2RlOiAnRjInLCBrZXk6ICdGMicgfSxcbiAgICBGMzogeyBrZXlDb2RlOiAxMTQsIGNvZGU6ICdGMycsIGtleTogJ0YzJyB9LFxuICAgIEY0OiB7IGtleUNvZGU6IDExNSwgY29kZTogJ0Y0Jywga2V5OiAnRjQnIH0sXG4gICAgRjU6IHsga2V5Q29kZTogMTE2LCBjb2RlOiAnRjUnLCBrZXk6ICdGNScgfSxcbiAgICBGNjogeyBrZXlDb2RlOiAxMTcsIGNvZGU6ICdGNicsIGtleTogJ0Y2JyB9LFxuICAgIEY3OiB7IGtleUNvZGU6IDExOCwgY29kZTogJ0Y3Jywga2V5OiAnRjcnIH0sXG4gICAgRjg6IHsga2V5Q29kZTogMTE5LCBjb2RlOiAnRjgnLCBrZXk6ICdGOCcgfSxcbiAgICBGOTogeyBrZXlDb2RlOiAxMjAsIGNvZGU6ICdGOScsIGtleTogJ0Y5JyB9LFxuICAgIEYxMDogeyBrZXlDb2RlOiAxMjEsIGNvZGU6ICdGMTAnLCBrZXk6ICdGMTAnIH0sXG4gICAgRjExOiB7IGtleUNvZGU6IDEyMiwgY29kZTogJ0YxMScsIGtleTogJ0YxMScgfSxcbiAgICBGMTI6IHsga2V5Q29kZTogMTIzLCBjb2RlOiAnRjEyJywga2V5OiAnRjEyJyB9LFxuICAgIEYxMzogeyBrZXlDb2RlOiAxMjQsIGNvZGU6ICdGMTMnLCBrZXk6ICdGMTMnIH0sXG4gICAgRjE0OiB7IGtleUNvZGU6IDEyNSwgY29kZTogJ0YxNCcsIGtleTogJ0YxNCcgfSxcbiAgICBGMTU6IHsga2V5Q29kZTogMTI2LCBjb2RlOiAnRjE1Jywga2V5OiAnRjE1JyB9LFxuICAgIEYxNjogeyBrZXlDb2RlOiAxMjcsIGNvZGU6ICdGMTYnLCBrZXk6ICdGMTYnIH0sXG4gICAgRjE3OiB7IGtleUNvZGU6IDEyOCwgY29kZTogJ0YxNycsIGtleTogJ0YxNycgfSxcbiAgICBGMTg6IHsga2V5Q29kZTogMTI5LCBjb2RlOiAnRjE4Jywga2V5OiAnRjE4JyB9LFxuICAgIEYxOTogeyBrZXlDb2RlOiAxMzAsIGNvZGU6ICdGMTknLCBrZXk6ICdGMTknIH0sXG4gICAgRjIwOiB7IGtleUNvZGU6IDEzMSwgY29kZTogJ0YyMCcsIGtleTogJ0YyMCcgfSxcbiAgICBGMjE6IHsga2V5Q29kZTogMTMyLCBjb2RlOiAnRjIxJywga2V5OiAnRjIxJyB9LFxuICAgIEYyMjogeyBrZXlDb2RlOiAxMzMsIGNvZGU6ICdGMjInLCBrZXk6ICdGMjInIH0sXG4gICAgRjIzOiB7IGtleUNvZGU6IDEzNCwgY29kZTogJ0YyMycsIGtleTogJ0YyMycgfSxcbiAgICBGMjQ6IHsga2V5Q29kZTogMTM1LCBjb2RlOiAnRjI0Jywga2V5OiAnRjI0JyB9LFxuICAgIE51bUxvY2s6IHsga2V5Q29kZTogMTQ0LCBjb2RlOiAnTnVtTG9jaycsIGtleTogJ051bUxvY2snIH0sXG4gICAgU2Nyb2xsTG9jazogeyBrZXlDb2RlOiAxNDUsIGNvZGU6ICdTY3JvbGxMb2NrJywga2V5OiAnU2Nyb2xsTG9jaycgfSxcbiAgICBBdWRpb1ZvbHVtZU11dGU6IHtcbiAgICAgICAga2V5Q29kZTogMTczLFxuICAgICAgICBjb2RlOiAnQXVkaW9Wb2x1bWVNdXRlJyxcbiAgICAgICAga2V5OiAnQXVkaW9Wb2x1bWVNdXRlJyxcbiAgICB9LFxuICAgIEF1ZGlvVm9sdW1lRG93bjoge1xuICAgICAgICBrZXlDb2RlOiAxNzQsXG4gICAgICAgIGNvZGU6ICdBdWRpb1ZvbHVtZURvd24nLFxuICAgICAgICBrZXk6ICdBdWRpb1ZvbHVtZURvd24nLFxuICAgIH0sXG4gICAgQXVkaW9Wb2x1bWVVcDogeyBrZXlDb2RlOiAxNzUsIGNvZGU6ICdBdWRpb1ZvbHVtZVVwJywga2V5OiAnQXVkaW9Wb2x1bWVVcCcgfSxcbiAgICBNZWRpYVRyYWNrTmV4dDoge1xuICAgICAgICBrZXlDb2RlOiAxNzYsXG4gICAgICAgIGNvZGU6ICdNZWRpYVRyYWNrTmV4dCcsXG4gICAgICAgIGtleTogJ01lZGlhVHJhY2tOZXh0JyxcbiAgICB9LFxuICAgIE1lZGlhVHJhY2tQcmV2aW91czoge1xuICAgICAgICBrZXlDb2RlOiAxNzcsXG4gICAgICAgIGNvZGU6ICdNZWRpYVRyYWNrUHJldmlvdXMnLFxuICAgICAgICBrZXk6ICdNZWRpYVRyYWNrUHJldmlvdXMnLFxuICAgIH0sXG4gICAgTWVkaWFTdG9wOiB7IGtleUNvZGU6IDE3OCwgY29kZTogJ01lZGlhU3RvcCcsIGtleTogJ01lZGlhU3RvcCcgfSxcbiAgICBNZWRpYVBsYXlQYXVzZToge1xuICAgICAgICBrZXlDb2RlOiAxNzksXG4gICAgICAgIGNvZGU6ICdNZWRpYVBsYXlQYXVzZScsXG4gICAgICAgIGtleTogJ01lZGlhUGxheVBhdXNlJyxcbiAgICB9LFxuICAgIFNlbWljb2xvbjogeyBrZXlDb2RlOiAxODYsIGNvZGU6ICdTZW1pY29sb24nLCBzaGlmdEtleTogJzonLCBrZXk6ICc7JyB9LFxuICAgIEVxdWFsOiB7IGtleUNvZGU6IDE4NywgY29kZTogJ0VxdWFsJywgc2hpZnRLZXk6ICcrJywga2V5OiAnPScgfSxcbiAgICBOdW1wYWRFcXVhbDogeyBrZXlDb2RlOiAxODcsIGNvZGU6ICdOdW1wYWRFcXVhbCcsIGtleTogJz0nLCBsb2NhdGlvbjogMyB9LFxuICAgIENvbW1hOiB7IGtleUNvZGU6IDE4OCwgY29kZTogJ0NvbW1hJywgc2hpZnRLZXk6ICc8Jywga2V5OiAnLCcgfSxcbiAgICBNaW51czogeyBrZXlDb2RlOiAxODksIGNvZGU6ICdNaW51cycsIHNoaWZ0S2V5OiAnXycsIGtleTogJy0nIH0sXG4gICAgUGVyaW9kOiB7IGtleUNvZGU6IDE5MCwgY29kZTogJ1BlcmlvZCcsIHNoaWZ0S2V5OiAnPicsIGtleTogJy4nIH0sXG4gICAgU2xhc2g6IHsga2V5Q29kZTogMTkxLCBjb2RlOiAnU2xhc2gnLCBzaGlmdEtleTogJz8nLCBrZXk6ICcvJyB9LFxuICAgIEJhY2txdW90ZTogeyBrZXlDb2RlOiAxOTIsIGNvZGU6ICdCYWNrcXVvdGUnLCBzaGlmdEtleTogJ34nLCBrZXk6ICdgJyB9LFxuICAgIEJyYWNrZXRMZWZ0OiB7IGtleUNvZGU6IDIxOSwgY29kZTogJ0JyYWNrZXRMZWZ0Jywgc2hpZnRLZXk6ICd7Jywga2V5OiAnWycgfSxcbiAgICBCYWNrc2xhc2g6IHsga2V5Q29kZTogMjIwLCBjb2RlOiAnQmFja3NsYXNoJywgc2hpZnRLZXk6ICd8Jywga2V5OiAnXFxcXCcgfSxcbiAgICBCcmFja2V0UmlnaHQ6IHsga2V5Q29kZTogMjIxLCBjb2RlOiAnQnJhY2tldFJpZ2h0Jywgc2hpZnRLZXk6ICd9Jywga2V5OiAnXScgfSxcbiAgICBRdW90ZTogeyBrZXlDb2RlOiAyMjIsIGNvZGU6ICdRdW90ZScsIHNoaWZ0S2V5OiAnXCInLCBrZXk6IFwiJ1wiIH0sXG4gICAgQWx0R3JhcGg6IHsga2V5Q29kZTogMjI1LCBjb2RlOiAnQWx0R3JhcGgnLCBrZXk6ICdBbHRHcmFwaCcgfSxcbiAgICBQcm9wczogeyBrZXlDb2RlOiAyNDcsIGNvZGU6ICdQcm9wcycsIGtleTogJ0NyU2VsJyB9LFxuICAgIENhbmNlbDogeyBrZXlDb2RlOiAzLCBrZXk6ICdDYW5jZWwnLCBjb2RlOiAnQWJvcnQnIH0sXG4gICAgQ2xlYXI6IHsga2V5Q29kZTogMTIsIGtleTogJ0NsZWFyJywgY29kZTogJ051bXBhZDUnLCBsb2NhdGlvbjogMyB9LFxuICAgIFNoaWZ0OiB7IGtleUNvZGU6IDE2LCBrZXk6ICdTaGlmdCcsIGNvZGU6ICdTaGlmdExlZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIENvbnRyb2w6IHsga2V5Q29kZTogMTcsIGtleTogJ0NvbnRyb2wnLCBjb2RlOiAnQ29udHJvbExlZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIEFsdDogeyBrZXlDb2RlOiAxOCwga2V5OiAnQWx0JywgY29kZTogJ0FsdExlZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIEFjY2VwdDogeyBrZXlDb2RlOiAzMCwga2V5OiAnQWNjZXB0JyB9LFxuICAgIE1vZGVDaGFuZ2U6IHsga2V5Q29kZTogMzEsIGtleTogJ01vZGVDaGFuZ2UnIH0sXG4gICAgJyAnOiB7IGtleUNvZGU6IDMyLCBrZXk6ICcgJywgY29kZTogJ1NwYWNlJyB9LFxuICAgIFByaW50OiB7IGtleUNvZGU6IDQyLCBrZXk6ICdQcmludCcgfSxcbiAgICBFeGVjdXRlOiB7IGtleUNvZGU6IDQzLCBrZXk6ICdFeGVjdXRlJywgY29kZTogJ09wZW4nIH0sXG4gICAgJ1xcdTAwMDAnOiB7IGtleUNvZGU6IDQ2LCBrZXk6ICdcXHUwMDAwJywgY29kZTogJ051bXBhZERlY2ltYWwnLCBsb2NhdGlvbjogMyB9LFxuICAgIGE6IHsga2V5Q29kZTogNjUsIGtleTogJ2EnLCBjb2RlOiAnS2V5QScgfSxcbiAgICBiOiB7IGtleUNvZGU6IDY2LCBrZXk6ICdiJywgY29kZTogJ0tleUInIH0sXG4gICAgYzogeyBrZXlDb2RlOiA2Nywga2V5OiAnYycsIGNvZGU6ICdLZXlDJyB9LFxuICAgIGQ6IHsga2V5Q29kZTogNjgsIGtleTogJ2QnLCBjb2RlOiAnS2V5RCcgfSxcbiAgICBlOiB7IGtleUNvZGU6IDY5LCBrZXk6ICdlJywgY29kZTogJ0tleUUnIH0sXG4gICAgZjogeyBrZXlDb2RlOiA3MCwga2V5OiAnZicsIGNvZGU6ICdLZXlGJyB9LFxuICAgIGc6IHsga2V5Q29kZTogNzEsIGtleTogJ2cnLCBjb2RlOiAnS2V5RycgfSxcbiAgICBoOiB7IGtleUNvZGU6IDcyLCBrZXk6ICdoJywgY29kZTogJ0tleUgnIH0sXG4gICAgaTogeyBrZXlDb2RlOiA3Mywga2V5OiAnaScsIGNvZGU6ICdLZXlJJyB9LFxuICAgIGo6IHsga2V5Q29kZTogNzQsIGtleTogJ2onLCBjb2RlOiAnS2V5SicgfSxcbiAgICBrOiB7IGtleUNvZGU6IDc1LCBrZXk6ICdrJywgY29kZTogJ0tleUsnIH0sXG4gICAgbDogeyBrZXlDb2RlOiA3Niwga2V5OiAnbCcsIGNvZGU6ICdLZXlMJyB9LFxuICAgIG06IHsga2V5Q29kZTogNzcsIGtleTogJ20nLCBjb2RlOiAnS2V5TScgfSxcbiAgICBuOiB7IGtleUNvZGU6IDc4LCBrZXk6ICduJywgY29kZTogJ0tleU4nIH0sXG4gICAgbzogeyBrZXlDb2RlOiA3OSwga2V5OiAnbycsIGNvZGU6ICdLZXlPJyB9LFxuICAgIHA6IHsga2V5Q29kZTogODAsIGtleTogJ3AnLCBjb2RlOiAnS2V5UCcgfSxcbiAgICBxOiB7IGtleUNvZGU6IDgxLCBrZXk6ICdxJywgY29kZTogJ0tleVEnIH0sXG4gICAgcjogeyBrZXlDb2RlOiA4Miwga2V5OiAncicsIGNvZGU6ICdLZXlSJyB9LFxuICAgIHM6IHsga2V5Q29kZTogODMsIGtleTogJ3MnLCBjb2RlOiAnS2V5UycgfSxcbiAgICB0OiB7IGtleUNvZGU6IDg0LCBrZXk6ICd0JywgY29kZTogJ0tleVQnIH0sXG4gICAgdTogeyBrZXlDb2RlOiA4NSwga2V5OiAndScsIGNvZGU6ICdLZXlVJyB9LFxuICAgIHY6IHsga2V5Q29kZTogODYsIGtleTogJ3YnLCBjb2RlOiAnS2V5VicgfSxcbiAgICB3OiB7IGtleUNvZGU6IDg3LCBrZXk6ICd3JywgY29kZTogJ0tleVcnIH0sXG4gICAgeDogeyBrZXlDb2RlOiA4OCwga2V5OiAneCcsIGNvZGU6ICdLZXlYJyB9LFxuICAgIHk6IHsga2V5Q29kZTogODksIGtleTogJ3knLCBjb2RlOiAnS2V5WScgfSxcbiAgICB6OiB7IGtleUNvZGU6IDkwLCBrZXk6ICd6JywgY29kZTogJ0tleVonIH0sXG4gICAgTWV0YTogeyBrZXlDb2RlOiA5MSwga2V5OiAnTWV0YScsIGNvZGU6ICdNZXRhTGVmdCcsIGxvY2F0aW9uOiAxIH0sXG4gICAgJyonOiB7IGtleUNvZGU6IDEwNiwga2V5OiAnKicsIGNvZGU6ICdOdW1wYWRNdWx0aXBseScsIGxvY2F0aW9uOiAzIH0sXG4gICAgJysnOiB7IGtleUNvZGU6IDEwNywga2V5OiAnKycsIGNvZGU6ICdOdW1wYWRBZGQnLCBsb2NhdGlvbjogMyB9LFxuICAgICctJzogeyBrZXlDb2RlOiAxMDksIGtleTogJy0nLCBjb2RlOiAnTnVtcGFkU3VidHJhY3QnLCBsb2NhdGlvbjogMyB9LFxuICAgICcvJzogeyBrZXlDb2RlOiAxMTEsIGtleTogJy8nLCBjb2RlOiAnTnVtcGFkRGl2aWRlJywgbG9jYXRpb246IDMgfSxcbiAgICAnOyc6IHsga2V5Q29kZTogMTg2LCBrZXk6ICc7JywgY29kZTogJ1NlbWljb2xvbicgfSxcbiAgICAnPSc6IHsga2V5Q29kZTogMTg3LCBrZXk6ICc9JywgY29kZTogJ0VxdWFsJyB9LFxuICAgICcsJzogeyBrZXlDb2RlOiAxODgsIGtleTogJywnLCBjb2RlOiAnQ29tbWEnIH0sXG4gICAgJy4nOiB7IGtleUNvZGU6IDE5MCwga2V5OiAnLicsIGNvZGU6ICdQZXJpb2QnIH0sXG4gICAgJ2AnOiB7IGtleUNvZGU6IDE5Miwga2V5OiAnYCcsIGNvZGU6ICdCYWNrcXVvdGUnIH0sXG4gICAgJ1snOiB7IGtleUNvZGU6IDIxOSwga2V5OiAnWycsIGNvZGU6ICdCcmFja2V0TGVmdCcgfSxcbiAgICAnXFxcXCc6IHsga2V5Q29kZTogMjIwLCBrZXk6ICdcXFxcJywgY29kZTogJ0JhY2tzbGFzaCcgfSxcbiAgICAnXSc6IHsga2V5Q29kZTogMjIxLCBrZXk6ICddJywgY29kZTogJ0JyYWNrZXRSaWdodCcgfSxcbiAgICBcIidcIjogeyBrZXlDb2RlOiAyMjIsIGtleTogXCInXCIsIGNvZGU6ICdRdW90ZScgfSxcbiAgICBBdHRuOiB7IGtleUNvZGU6IDI0Niwga2V5OiAnQXR0bicgfSxcbiAgICBDclNlbDogeyBrZXlDb2RlOiAyNDcsIGtleTogJ0NyU2VsJywgY29kZTogJ1Byb3BzJyB9LFxuICAgIEV4U2VsOiB7IGtleUNvZGU6IDI0OCwga2V5OiAnRXhTZWwnIH0sXG4gICAgRXJhc2VFb2Y6IHsga2V5Q29kZTogMjQ5LCBrZXk6ICdFcmFzZUVvZicgfSxcbiAgICBQbGF5OiB7IGtleUNvZGU6IDI1MCwga2V5OiAnUGxheScgfSxcbiAgICBab29tT3V0OiB7IGtleUNvZGU6IDI1MSwga2V5OiAnWm9vbU91dCcgfSxcbiAgICAnKSc6IHsga2V5Q29kZTogNDgsIGtleTogJyknLCBjb2RlOiAnRGlnaXQwJyB9LFxuICAgICchJzogeyBrZXlDb2RlOiA0OSwga2V5OiAnIScsIGNvZGU6ICdEaWdpdDEnIH0sXG4gICAgJ0AnOiB7IGtleUNvZGU6IDUwLCBrZXk6ICdAJywgY29kZTogJ0RpZ2l0MicgfSxcbiAgICAnIyc6IHsga2V5Q29kZTogNTEsIGtleTogJyMnLCBjb2RlOiAnRGlnaXQzJyB9LFxuICAgICQ6IHsga2V5Q29kZTogNTIsIGtleTogJyQnLCBjb2RlOiAnRGlnaXQ0JyB9LFxuICAgICclJzogeyBrZXlDb2RlOiA1Mywga2V5OiAnJScsIGNvZGU6ICdEaWdpdDUnIH0sXG4gICAgJ14nOiB7IGtleUNvZGU6IDU0LCBrZXk6ICdeJywgY29kZTogJ0RpZ2l0NicgfSxcbiAgICAnJic6IHsga2V5Q29kZTogNTUsIGtleTogJyYnLCBjb2RlOiAnRGlnaXQ3JyB9LFxuICAgICcoJzogeyBrZXlDb2RlOiA1Nywga2V5OiAnKCcsIGNvZGU6ICdEaWdpdDknIH0sXG4gICAgQTogeyBrZXlDb2RlOiA2NSwga2V5OiAnQScsIGNvZGU6ICdLZXlBJyB9LFxuICAgIEI6IHsga2V5Q29kZTogNjYsIGtleTogJ0InLCBjb2RlOiAnS2V5QicgfSxcbiAgICBDOiB7IGtleUNvZGU6IDY3LCBrZXk6ICdDJywgY29kZTogJ0tleUMnIH0sXG4gICAgRDogeyBrZXlDb2RlOiA2OCwga2V5OiAnRCcsIGNvZGU6ICdLZXlEJyB9LFxuICAgIEU6IHsga2V5Q29kZTogNjksIGtleTogJ0UnLCBjb2RlOiAnS2V5RScgfSxcbiAgICBGOiB7IGtleUNvZGU6IDcwLCBrZXk6ICdGJywgY29kZTogJ0tleUYnIH0sXG4gICAgRzogeyBrZXlDb2RlOiA3MSwga2V5OiAnRycsIGNvZGU6ICdLZXlHJyB9LFxuICAgIEg6IHsga2V5Q29kZTogNzIsIGtleTogJ0gnLCBjb2RlOiAnS2V5SCcgfSxcbiAgICBJOiB7IGtleUNvZGU6IDczLCBrZXk6ICdJJywgY29kZTogJ0tleUknIH0sXG4gICAgSjogeyBrZXlDb2RlOiA3NCwga2V5OiAnSicsIGNvZGU6ICdLZXlKJyB9LFxuICAgIEs6IHsga2V5Q29kZTogNzUsIGtleTogJ0snLCBjb2RlOiAnS2V5SycgfSxcbiAgICBMOiB7IGtleUNvZGU6IDc2LCBrZXk6ICdMJywgY29kZTogJ0tleUwnIH0sXG4gICAgTTogeyBrZXlDb2RlOiA3Nywga2V5OiAnTScsIGNvZGU6ICdLZXlNJyB9LFxuICAgIE46IHsga2V5Q29kZTogNzgsIGtleTogJ04nLCBjb2RlOiAnS2V5TicgfSxcbiAgICBPOiB7IGtleUNvZGU6IDc5LCBrZXk6ICdPJywgY29kZTogJ0tleU8nIH0sXG4gICAgUDogeyBrZXlDb2RlOiA4MCwga2V5OiAnUCcsIGNvZGU6ICdLZXlQJyB9LFxuICAgIFE6IHsga2V5Q29kZTogODEsIGtleTogJ1EnLCBjb2RlOiAnS2V5UScgfSxcbiAgICBSOiB7IGtleUNvZGU6IDgyLCBrZXk6ICdSJywgY29kZTogJ0tleVInIH0sXG4gICAgUzogeyBrZXlDb2RlOiA4Mywga2V5OiAnUycsIGNvZGU6ICdLZXlTJyB9LFxuICAgIFQ6IHsga2V5Q29kZTogODQsIGtleTogJ1QnLCBjb2RlOiAnS2V5VCcgfSxcbiAgICBVOiB7IGtleUNvZGU6IDg1LCBrZXk6ICdVJywgY29kZTogJ0tleVUnIH0sXG4gICAgVjogeyBrZXlDb2RlOiA4Niwga2V5OiAnVicsIGNvZGU6ICdLZXlWJyB9LFxuICAgIFc6IHsga2V5Q29kZTogODcsIGtleTogJ1cnLCBjb2RlOiAnS2V5VycgfSxcbiAgICBYOiB7IGtleUNvZGU6IDg4LCBrZXk6ICdYJywgY29kZTogJ0tleVgnIH0sXG4gICAgWTogeyBrZXlDb2RlOiA4OSwga2V5OiAnWScsIGNvZGU6ICdLZXlZJyB9LFxuICAgIFo6IHsga2V5Q29kZTogOTAsIGtleTogJ1onLCBjb2RlOiAnS2V5WicgfSxcbiAgICAnOic6IHsga2V5Q29kZTogMTg2LCBrZXk6ICc6JywgY29kZTogJ1NlbWljb2xvbicgfSxcbiAgICAnPCc6IHsga2V5Q29kZTogMTg4LCBrZXk6ICc8JywgY29kZTogJ0NvbW1hJyB9LFxuICAgIF86IHsga2V5Q29kZTogMTg5LCBrZXk6ICdfJywgY29kZTogJ01pbnVzJyB9LFxuICAgICc+JzogeyBrZXlDb2RlOiAxOTAsIGtleTogJz4nLCBjb2RlOiAnUGVyaW9kJyB9LFxuICAgICc/JzogeyBrZXlDb2RlOiAxOTEsIGtleTogJz8nLCBjb2RlOiAnU2xhc2gnIH0sXG4gICAgJ34nOiB7IGtleUNvZGU6IDE5Miwga2V5OiAnficsIGNvZGU6ICdCYWNrcXVvdGUnIH0sXG4gICAgJ3snOiB7IGtleUNvZGU6IDIxOSwga2V5OiAneycsIGNvZGU6ICdCcmFja2V0TGVmdCcgfSxcbiAgICAnfCc6IHsga2V5Q29kZTogMjIwLCBrZXk6ICd8JywgY29kZTogJ0JhY2tzbGFzaCcgfSxcbiAgICAnfSc6IHsga2V5Q29kZTogMjIxLCBrZXk6ICd9JywgY29kZTogJ0JyYWNrZXRSaWdodCcgfSxcbiAgICAnXCInOiB7IGtleUNvZGU6IDIyMiwga2V5OiAnXCInLCBjb2RlOiAnUXVvdGUnIH0sXG4gICAgU29mdExlZnQ6IHsga2V5OiAnU29mdExlZnQnLCBjb2RlOiAnU29mdExlZnQnLCBsb2NhdGlvbjogNCB9LFxuICAgIFNvZnRSaWdodDogeyBrZXk6ICdTb2Z0UmlnaHQnLCBjb2RlOiAnU29mdFJpZ2h0JywgbG9jYXRpb246IDQgfSxcbiAgICBDYW1lcmE6IHsga2V5Q29kZTogNDQsIGtleTogJ0NhbWVyYScsIGNvZGU6ICdDYW1lcmEnLCBsb2NhdGlvbjogNCB9LFxuICAgIENhbGw6IHsga2V5OiAnQ2FsbCcsIGNvZGU6ICdDYWxsJywgbG9jYXRpb246IDQgfSxcbiAgICBFbmRDYWxsOiB7IGtleUNvZGU6IDk1LCBrZXk6ICdFbmRDYWxsJywgY29kZTogJ0VuZENhbGwnLCBsb2NhdGlvbjogNCB9LFxuICAgIFZvbHVtZURvd246IHtcbiAgICAgICAga2V5Q29kZTogMTgyLFxuICAgICAgICBrZXk6ICdWb2x1bWVEb3duJyxcbiAgICAgICAgY29kZTogJ1ZvbHVtZURvd24nLFxuICAgICAgICBsb2NhdGlvbjogNCxcbiAgICB9LFxuICAgIFZvbHVtZVVwOiB7IGtleUNvZGU6IDE4Mywga2V5OiAnVm9sdW1lVXAnLCBjb2RlOiAnVm9sdW1lVXAnLCBsb2NhdGlvbjogNCB9LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVTS2V5Ym9hcmRMYXlvdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZXdwb3J0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4uL3V0aWwvRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlGdW5jdGlvbiB9IGZyb20gJy4uL3V0aWwvRnVuY3Rpb24uanMnO1xuaW1wb3J0IHsgVGltZW91dEVycm9yIH0gZnJvbSAnLi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4vTGF6eUFyZy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgV2FpdFRhc2sge1xuICAgICN3b3JsZDtcbiAgICAjcG9sbGluZztcbiAgICAjcm9vdDtcbiAgICAjZm47XG4gICAgI2FyZ3M7XG4gICAgI3RpbWVvdXQ7XG4gICAgI3RpbWVvdXRFcnJvcjtcbiAgICAjcmVzdWx0ID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgI3BvbGxlcjtcbiAgICAjc2lnbmFsO1xuICAgICNyZXJ1bnMgPSBbXTtcbiAgICBjb25zdHJ1Y3Rvcih3b3JsZCwgb3B0aW9ucywgZm4sIC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy4jd29ybGQgPSB3b3JsZDtcbiAgICAgICAgdGhpcy4jcG9sbGluZyA9IG9wdGlvbnMucG9sbGluZztcbiAgICAgICAgdGhpcy4jcm9vdCA9IG9wdGlvbnMucm9vdDtcbiAgICAgICAgdGhpcy4jc2lnbmFsID0gb3B0aW9ucy5zaWduYWw7XG4gICAgICAgIHRoaXMuI3NpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHRoaXMudGVybWluYXRlKHRoaXMuI3NpZ25hbD8ucmVhc29uKTtcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGZuKSB7XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIHRoaXMuI2ZuID0gYCgpID0+IHtyZXR1cm4gKCR7Zm59KTt9YDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy4jZm4gPSBzdHJpbmdpZnlGdW5jdGlvbihmbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jYXJncyA9IGFyZ3M7XG4gICAgICAgIHRoaXMuI3dvcmxkLnRhc2tNYW5hZ2VyLmFkZCh0aGlzKTtcbiAgICAgICAgaWYgKG9wdGlvbnMudGltZW91dCkge1xuICAgICAgICAgICAgdGhpcy4jdGltZW91dEVycm9yID0gbmV3IFRpbWVvdXRFcnJvcihgV2FpdGluZyBmYWlsZWQ6ICR7b3B0aW9ucy50aW1lb3V0fW1zIGV4Y2VlZGVkYCk7XG4gICAgICAgICAgICB0aGlzLiN0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnRlcm1pbmF0ZSh0aGlzLiN0aW1lb3V0RXJyb3IpO1xuICAgICAgICAgICAgfSwgb3B0aW9ucy50aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICB2b2lkIHRoaXMucmVydW4oKTtcbiAgICB9XG4gICAgZ2V0IHJlc3VsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Jlc3VsdC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgYXN5bmMgcmVydW4oKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJldiBvZiB0aGlzLiNyZXJ1bnMpIHtcbiAgICAgICAgICAgIHByZXYuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNyZXJ1bnMubGVuZ3RoID0gMDtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgdGhpcy4jcmVydW5zLnB1c2goY29udHJvbGxlcik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuI3BvbGxpbmcpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdyYWYnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNwb2xsZXIgPSBhd2FpdCB0aGlzLiN3b3JsZC5ldmFsdWF0ZUhhbmRsZSgoeyBSQUZQb2xsZXIsIGNyZWF0ZUZ1bmN0aW9uIH0sIGZuLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmdW4gPSBjcmVhdGVGdW5jdGlvbihmbik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJBRlBvbGxlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1biguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LCBMYXp5QXJnLmNyZWF0ZShjb250ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnB1cHBldGVlclV0aWw7XG4gICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLiNmbiwgLi4udGhpcy4jYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ211dGF0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcG9sbGVyID0gYXdhaXQgdGhpcy4jd29ybGQuZXZhbHVhdGVIYW5kbGUoKHsgTXV0YXRpb25Qb2xsZXIsIGNyZWF0ZUZ1bmN0aW9uIH0sIHJvb3QsIGZuLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmdW4gPSBjcmVhdGVGdW5jdGlvbihmbik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE11dGF0aW9uUG9sbGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm9vdCB8fCBkb2N1bWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIExhenlBcmcuY3JlYXRlKGNvbnRleHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHVwcGV0ZWVyVXRpbDtcbiAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuI3Jvb3QsIHRoaXMuI2ZuLCAuLi50aGlzLiNhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcG9sbGVyID0gYXdhaXQgdGhpcy4jd29ybGQuZXZhbHVhdGVIYW5kbGUoKHsgSW50ZXJ2YWxQb2xsZXIsIGNyZWF0ZUZ1bmN0aW9uIH0sIG1zLCBmbiwgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVuID0gY3JlYXRlRnVuY3Rpb24oZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbFBvbGxlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1biguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG1zKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgTGF6eUFyZy5jcmVhdGUoY29udGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy4jcG9sbGluZywgdGhpcy4jZm4sIC4uLnRoaXMuI2FyZ3MpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3BvbGxlci5ldmFsdWF0ZShwb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgcG9sbGVyLnN0YXJ0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI3BvbGxlci5ldmFsdWF0ZUhhbmRsZShwb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb2xsZXIucmVzdWx0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuI3Jlc3VsdC5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRlcm1pbmF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiYWRFcnJvciA9IHRoaXMuZ2V0QmFkRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgaWYgKGJhZEVycm9yKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy50ZXJtaW5hdGUoYmFkRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHRlcm1pbmF0ZShlcnJvcikge1xuICAgICAgICB0aGlzLiN3b3JsZC50YXNrTWFuYWdlci5kZWxldGUodGhpcyk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0aW1lb3V0KTtcbiAgICAgICAgaWYgKGVycm9yICYmICF0aGlzLiNyZXN1bHQuZmluaXNoZWQoKSkge1xuICAgICAgICAgICAgdGhpcy4jcmVzdWx0LnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3BvbGxlcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNwb2xsZXIuZXZhbHVhdGVIYW5kbGUoYXN5bmMgKHBvbGxlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwb2xsZXIuc3RvcCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNwb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcG9sbGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcG9sbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIHNpbmNlIHRoZXkgbW9zdCBsaWtlbHkgY29tZSBmcm9tIGxvdy1sZXZlbCBjbGVhbnVwLlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vdCBhbGwgZXJyb3JzIGxlYWQgdG8gdGVybWluYXRpb24uIFRoZXkgdXN1YWxseSBpbXBseSB3ZSBuZWVkIHRvIHJlcnVuIHRoZSB0YXNrLlxuICAgICAqL1xuICAgIGdldEJhZEVycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChpc0Vycm9yTGlrZShlcnJvcikpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gZnJhbWUgaXMgZGV0YWNoZWQgdGhlIHRhc2sgc2hvdWxkIGhhdmUgYmVlbiB0ZXJtaW5hdGVkIGJ5IHRoZSBJc29sYXRlZFdvcmxkLlxuICAgICAgICAgICAgLy8gVGhpcyBjYW4gZmFpbCBpZiB3ZSB3ZXJlIGFkZGluZyB0aGlzIHRhc2sgd2hpbGUgdGhlIGZyYW1lIHdhcyBkZXRhY2hlZCxcbiAgICAgICAgICAgIC8vIHNvIHdlIHRlcm1pbmF0ZSBoZXJlIGluc3RlYWQuXG4gICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRXhlY3V0aW9uIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBkZXRhY2hlZCBmcmFtZScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignV2FpdGluZyBmYWlsZWQ6IEZyYW1lIGRldGFjaGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXaGVuIHRoZSBwYWdlIGlzIG5hdmlnYXRlZCwgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQuXG4gICAgICAgICAgICAvLyBXZSB3aWxsIHRyeSBhZ2FpbiBpbiB0aGUgbmV3IGV4ZWN1dGlvbiBjb250ZXh0LlxuICAgICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0V4ZWN1dGlvbiBjb250ZXh0IHdhcyBkZXN0cm95ZWQnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGNvdWxkIGhhdmUgdHJpZWQgdG8gZXZhbHVhdGUgaW4gYSBjb250ZXh0IHdoaWNoIHdhcyBhbHJlYWR5XG4gICAgICAgICAgICAvLyBkZXN0cm95ZWQuXG4gICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnQ2Fubm90IGZpbmQgY29udGV4dCB3aXRoIHNwZWNpZmllZCBpZCcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRXJyb3JzIGNvbWluZyBmcm9tIFdlYkRyaXZlciBCaURpLiBUT0RPOiBBZGp1c3QgbWVzc2FnZXMgYWZ0ZXJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93M2Mvd2ViZHJpdmVyLWJpZGkvaXNzdWVzLzU0MCBpcyByZXNvbHZlZC5cbiAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQWJvcnRFcnJvcjogQWN0b3IgJ01lc3NhZ2VIYW5kbGVyRnJhbWUnIGRlc3Ryb3llZFwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdXYWl0VGFzayBmYWlsZWQgd2l0aCBhbiBlcnJvcicsIHtcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tNYW5hZ2VyIHtcbiAgICAjdGFza3MgPSBuZXcgU2V0KCk7XG4gICAgYWRkKHRhc2spIHtcbiAgICAgICAgdGhpcy4jdGFza3MuYWRkKHRhc2spO1xuICAgIH1cbiAgICBkZWxldGUodGFzaykge1xuICAgICAgICB0aGlzLiN0YXNrcy5kZWxldGUodGFzayk7XG4gICAgfVxuICAgIHRlcm1pbmF0ZUFsbChlcnJvcikge1xuICAgICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy4jdGFza3MpIHtcbiAgICAgICAgICAgIHZvaWQgdGFzay50ZXJtaW5hdGUoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3Rhc2tzLmNsZWFyKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlcnVuQWxsKCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbLi4udGhpcy4jdGFza3NdLm1hcCh0YXNrID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0YXNrLnJlcnVuKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XYWl0VGFzay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyLCB9IGZyb20gJy4vUXVlcnlIYW5kbGVyLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBYUGF0aFF1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JBbGwgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgeHBhdGhRdWVyeVNlbGVjdG9yQWxsIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHhwYXRoUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvciA9IChlbGVtZW50LCBzZWxlY3RvciwgeyB4cGF0aFF1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiB4cGF0aFF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudCwgc2VsZWN0b3IsIDEpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1YUGF0aFF1ZXJ5SGFuZGxlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9Ccm93c2VyV2ViU29ja2V0VHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FsbGJhY2tSZWdpc3RyeS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbmZpZ3VyYXRpb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25uZWN0aW9uVHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ29ubmVjdE9wdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25zb2xlTWVzc2FnZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0Nvb2tpZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0RlYnVnLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRGV2aWNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXJyb3JzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXZlbnRFbWl0dGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRmlsZUNob29zZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRRdWVyeUhhbmRsZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9IYW5kbGVJdGVyYXRvci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0xhenlBcmcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9OZXR3b3JrTWFuYWdlckV2ZW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1BERk9wdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QaWVyY2VRdWVyeUhhbmRsZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QUXVlcnlIYW5kbGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHJvZHVjdC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1BTZWxlY3RvclBhcnNlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1B1cHBldGVlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5SGFuZGxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1NjcmlwdEluamVjdG9yLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vU2VjdXJpdHlEZXRhaWxzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGFza1F1ZXVlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dFF1ZXJ5SGFuZGxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1RpbWVvdXRTZXR0aW5ncy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVVNLZXlib2FyZExheW91dC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWwuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9WaWV3cG9ydC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1dhaXRUYXNrLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vWFBhdGhRdWVyeUhhbmRsZXIuanMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgZmlsdGVyLCBmcm9tLCBmcm9tRXZlbnQsIG1hcCwgbWVyZ2VNYXAsIE5FVkVSLCBPYnNlcnZhYmxlLCB0aW1lciwgfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuL0RlYnVnLmpzJztcbmltcG9ydCB7IFRpbWVvdXRFcnJvciB9IGZyb20gJy4vRXJyb3JzLmpzJztcbmltcG9ydCB7IHBhcGVyRm9ybWF0cyB9IGZyb20gJy4vUERGT3B0aW9ucy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZGVidWdFcnJvciA9IGRlYnVnKCdwdXBwZXRlZXI6ZXJyb3InKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1ZJRVdQT1JUID0gT2JqZWN0LmZyZWV6ZSh7IHdpZHRoOiA4MDAsIGhlaWdodDogNjAwIH0pO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgU09VUkNFX1VSTCA9IFN5bWJvbCgnU291cmNlIFVSTCBmb3IgUHVwcGV0ZWVyIGV2YWx1YXRpb24gc2NyaXB0cycpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFB1cHBldGVlclVSTCB7XG4gICAgc3RhdGljIElOVEVSTkFMX1VSTCA9ICdwcHRyOmludGVybmFsJztcbiAgICBzdGF0aWMgZnJvbUNhbGxTaXRlKGZ1bmN0aW9uTmFtZSwgc2l0ZSkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgUHVwcGV0ZWVyVVJMKCk7XG4gICAgICAgIHVybC4jZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lO1xuICAgICAgICB1cmwuI3NpdGVTdHJpbmcgPSBzaXRlLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuICAgIHN0YXRpYyBwYXJzZSA9ICh1cmwpID0+IHtcbiAgICAgICAgdXJsID0gdXJsLnNsaWNlKCdwcHRyOicubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgW2Z1bmN0aW9uTmFtZSA9ICcnLCBzaXRlU3RyaW5nID0gJyddID0gdXJsLnNwbGl0KCc7Jyk7XG4gICAgICAgIGNvbnN0IHB1cHBldGVlclVybCA9IG5ldyBQdXBwZXRlZXJVUkwoKTtcbiAgICAgICAgcHVwcGV0ZWVyVXJsLiNmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgIHB1cHBldGVlclVybC4jc2l0ZVN0cmluZyA9IGRlY29kZVVSSUNvbXBvbmVudChzaXRlU3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHB1cHBldGVlclVybDtcbiAgICB9O1xuICAgIHN0YXRpYyBpc1B1cHBldGVlclVSTCA9ICh1cmwpID0+IHtcbiAgICAgICAgcmV0dXJuIHVybC5zdGFydHNXaXRoKCdwcHRyOicpO1xuICAgIH07XG4gICAgI2Z1bmN0aW9uTmFtZTtcbiAgICAjc2l0ZVN0cmluZztcbiAgICBnZXQgZnVuY3Rpb25OYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnVuY3Rpb25OYW1lO1xuICAgIH1cbiAgICBnZXQgc2l0ZVN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NpdGVTdHJpbmc7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYHBwdHI6JHtbXG4gICAgICAgICAgICB0aGlzLiNmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQodGhpcy4jc2l0ZVN0cmluZyksXG4gICAgICAgIF0uam9pbignOycpfWA7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUgPSAoZnVuY3Rpb25OYW1lLCBvYmplY3QpID0+IHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgU09VUkNFX1VSTCkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtcbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IChfLCBzdGFjaykgPT4ge1xuICAgICAgICAvLyBGaXJzdCBlbGVtZW50IGlzIHRoZSBmdW5jdGlvbi5cbiAgICAgICAgLy8gU2Vjb25kIGVsZW1lbnQgaXMgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uLlxuICAgICAgICAvLyBUaGlyZCBlbGVtZW50IGlzIHRoZSBjYWxsZXIgb2YgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uXG4gICAgICAgIC8vIHdoaWNoIGlzIHByZWNpc2VseSB3aGF0IHdlIHdhbnQuXG4gICAgICAgIHJldHVybiBzdGFja1syXTtcbiAgICB9O1xuICAgIGNvbnN0IHNpdGUgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IG9yaWdpbmFsO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG9iamVjdCwge1xuICAgICAgICBbU09VUkNFX1VSTF06IFB1cHBldGVlclVSTC5mcm9tQ2FsbFNpdGUoZnVuY3Rpb25OYW1lLCBzaXRlKSxcbiAgICB9KTtcbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0U291cmNlUHVwcGV0ZWVyVVJMSWZBdmFpbGFibGUgPSAob2JqZWN0KSA9PiB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIFNPVVJDRV9VUkwpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3RbU09VUkNFX1VSTF07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU3RyaW5nID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCBvYmogaW5zdGFuY2VvZiBTdHJpbmc7XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGlzTnVtYmVyID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCBvYmogaW5zdGFuY2VvZiBOdW1iZXI7XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGlzUGxhaW5PYmplY3QgPSAob2JqKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaj8uY29uc3RydWN0b3IgPT09IE9iamVjdDtcbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaXNSZWdFeHAgPSAob2JqKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaj8uY29uc3RydWN0b3IgPT09IFJlZ0V4cDtcbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaXNEYXRlID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmo/LmNvbnN0cnVjdG9yID09PSBEYXRlO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0aW9uU3RyaW5nKGZ1biwgLi4uYXJncykge1xuICAgIGlmIChpc1N0cmluZyhmdW4pKSB7XG4gICAgICAgIGFzc2VydChhcmdzLmxlbmd0aCA9PT0gMCwgJ0Nhbm5vdCBldmFsdWF0ZSBhIHN0cmluZyB3aXRoIGFyZ3VtZW50cycpO1xuICAgICAgICByZXR1cm4gZnVuO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXJpYWxpemVBcmd1bWVudChhcmcpIHtcbiAgICAgICAgaWYgKE9iamVjdC5pcyhhcmcsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIGAoJHtmdW59KSgke2FyZ3MubWFwKHNlcmlhbGl6ZUFyZ3VtZW50KS5qb2luKCcsJyl9KWA7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5sZXQgZnMgPSBudWxsO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEZTUHJvbWlzZXMoKSB7XG4gICAgaWYgKCFmcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZnMgPSBhd2FpdCBpbXBvcnQoJ2ZzL3Byb21pc2VzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB3cml0ZSB0byBhIHBhdGggb3V0c2lkZSBvZiBhIE5vZGUtbGlrZSBlbnZpcm9ubWVudC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWFkYWJsZUFzQnVmZmVyKHJlYWRhYmxlLCBwYXRoKSB7XG4gICAgY29uc3QgYnVmZmVycyA9IFtdO1xuICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgIGlmIChwYXRoKSB7XG4gICAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0RlNQcm9taXNlcygpO1xuICAgICAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgZnMub3BlbihwYXRoLCAndysnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBmaWxlSGFuZGxlLndyaXRlRmlsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBmaWxlSGFuZGxlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlYWRhYmxlRnJvbVByb3RvY29sU3RyZWFtKGNsaWVudCwgaGFuZGxlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0VW5pdDhBcnJheShkYXRhLCBpc0Jhc2U2NCkge1xuICAgICAgICAgICAgICAgIGlmIChpc0Jhc2U2NCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGF0b2IoZGF0YSksIG0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uY29kZVBvaW50QXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZXIuZW5jb2RlKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBiYXNlNjRFbmNvZGVkLCBlb2YgfSA9IGF3YWl0IGNsaWVudC5zZW5kKCdJTy5yZWFkJywge1xuICAgICAgICAgICAgICAgIGhhbmRsZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGdldFVuaXQ4QXJyYXkoZGF0YSwgYmFzZTY0RW5jb2RlZCA/PyBmYWxzZSkpO1xuICAgICAgICAgICAgaWYgKGVvZikge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdJTy5jbG9zZScsIHsgaGFuZGxlIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZURpYWxvZ1R5cGUodHlwZSkge1xuICAgIGxldCBkaWFsb2dUeXBlID0gbnVsbDtcbiAgICBjb25zdCB2YWxpZERpYWxvZ1R5cGVzID0gbmV3IFNldChbXG4gICAgICAgICdhbGVydCcsXG4gICAgICAgICdjb25maXJtJyxcbiAgICAgICAgJ3Byb21wdCcsXG4gICAgICAgICdiZWZvcmV1bmxvYWQnLFxuICAgIF0pO1xuICAgIGlmICh2YWxpZERpYWxvZ1R5cGVzLmhhcyh0eXBlKSkge1xuICAgICAgICBkaWFsb2dUeXBlID0gdHlwZTtcbiAgICB9XG4gICAgYXNzZXJ0KGRpYWxvZ1R5cGUsIGBVbmtub3duIGphdmFzY3JpcHQgZGlhbG9nIHR5cGU6ICR7dHlwZX1gKTtcbiAgICByZXR1cm4gZGlhbG9nVHlwZTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lb3V0KG1zLCBjYXVzZSkge1xuICAgIHJldHVybiBtcyA9PT0gMFxuICAgICAgICA/IE5FVkVSXG4gICAgICAgIDogdGltZXIobXMpLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXJyb3IoYFRpbWVkIG91dCBhZnRlciB3YWl0aW5nICR7bXN9bXNgLCB7IGNhdXNlIH0pO1xuICAgICAgICB9KSk7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVVRJTElUWV9XT1JMRF9OQU1FID0gJ19fcHVwcGV0ZWVyX3V0aWxpdHlfd29ybGRfXyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU09VUkNFX1VSTF9SRUdFWCA9IC9eW1xcMDQwXFx0XSpcXC9cXC9bQCNdIHNvdXJjZVVSTD1cXHMqKFxcUyo/KVxccyokL207XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U291cmNlVXJsQ29tbWVudCh1cmwpIHtcbiAgICByZXR1cm4gYC8vIyBzb3VyY2VVUkw9JHt1cmx9YDtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBORVRXT1JLX0lETEVfVElNRSA9IDUwMDtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBERk9wdGlvbnMob3B0aW9ucyA9IHt9LCBsZW5ndGhVbml0ID0gJ2luJykge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgZGlzcGxheUhlYWRlckZvb3RlcjogZmFsc2UsXG4gICAgICAgIGhlYWRlclRlbXBsYXRlOiAnJyxcbiAgICAgICAgZm9vdGVyVGVtcGxhdGU6ICcnLFxuICAgICAgICBwcmludEJhY2tncm91bmQ6IGZhbHNlLFxuICAgICAgICBsYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICBwYWdlUmFuZ2VzOiAnJyxcbiAgICAgICAgcHJlZmVyQ1NTUGFnZVNpemU6IGZhbHNlLFxuICAgICAgICBvbWl0QmFja2dyb3VuZDogZmFsc2UsXG4gICAgICAgIG91dGxpbmU6IGZhbHNlLFxuICAgICAgICB0YWdnZWQ6IHRydWUsXG4gICAgICAgIHdhaXRGb3JGb250czogdHJ1ZSxcbiAgICB9O1xuICAgIGxldCB3aWR0aCA9IDguNTtcbiAgICBsZXQgaGVpZ2h0ID0gMTE7XG4gICAgaWYgKG9wdGlvbnMuZm9ybWF0KSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IHBhcGVyRm9ybWF0c1tvcHRpb25zLmZvcm1hdC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgYXNzZXJ0KGZvcm1hdCwgJ1Vua25vd24gcGFwZXIgZm9ybWF0OiAnICsgb3B0aW9ucy5mb3JtYXQpO1xuICAgICAgICB3aWR0aCA9IGZvcm1hdC53aWR0aDtcbiAgICAgICAgaGVpZ2h0ID0gZm9ybWF0LmhlaWdodDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdpZHRoID0gY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy53aWR0aCwgbGVuZ3RoVW5pdCkgPz8gd2lkdGg7XG4gICAgICAgIGhlaWdodCA9XG4gICAgICAgICAgICBjb252ZXJ0UHJpbnRQYXJhbWV0ZXJUb0luY2hlcyhvcHRpb25zLmhlaWdodCwgbGVuZ3RoVW5pdCkgPz8gaGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBtYXJnaW4gPSB7XG4gICAgICAgIHRvcDogY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy5tYXJnaW4/LnRvcCwgbGVuZ3RoVW5pdCkgfHwgMCxcbiAgICAgICAgbGVmdDogY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy5tYXJnaW4/LmxlZnQsIGxlbmd0aFVuaXQpIHx8IDAsXG4gICAgICAgIGJvdHRvbTogY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy5tYXJnaW4/LmJvdHRvbSwgbGVuZ3RoVW5pdCkgfHwgMCxcbiAgICAgICAgcmlnaHQ6IGNvbnZlcnRQcmludFBhcmFtZXRlclRvSW5jaGVzKG9wdGlvbnMubWFyZ2luPy5yaWdodCwgbGVuZ3RoVW5pdCkgfHwgMCxcbiAgICB9O1xuICAgIC8vIFF1aXJrIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTg0MDQ1NSNjNDRcbiAgICBpZiAob3B0aW9ucy5vdXRsaW5lKSB7XG4gICAgICAgIG9wdGlvbnMudGFnZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmYXVsdHMsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIG1hcmdpbixcbiAgICB9O1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHVuaXRUb1BpeGVscyA9IHtcbiAgICBweDogMSxcbiAgICBpbjogOTYsXG4gICAgY206IDM3LjgsXG4gICAgbW06IDMuNzgsXG59O1xuZnVuY3Rpb24gY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMocGFyYW1ldGVyLCBsZW5ndGhVbml0ID0gJ2luJykge1xuICAgIGlmICh0eXBlb2YgcGFyYW1ldGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgcGl4ZWxzO1xuICAgIGlmIChpc051bWJlcihwYXJhbWV0ZXIpKSB7XG4gICAgICAgIC8vIFRyZWF0IG51bWJlcnMgYXMgcGl4ZWwgdmFsdWVzIHRvIGJlIGFsaWduZWQgd2l0aCBwaGFudG9tJ3MgcGFwZXJTaXplLlxuICAgICAgICBwaXhlbHMgPSBwYXJhbWV0ZXI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzU3RyaW5nKHBhcmFtZXRlcikpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IHBhcmFtZXRlcjtcbiAgICAgICAgbGV0IHVuaXQgPSB0ZXh0LnN1YnN0cmluZyh0ZXh0Lmxlbmd0aCAtIDIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCB2YWx1ZVRleHQgPSAnJztcbiAgICAgICAgaWYgKHVuaXQgaW4gdW5pdFRvUGl4ZWxzKSB7XG4gICAgICAgICAgICB2YWx1ZVRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCAtIDIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1bmtub3duIHVuaXQgdHJ5IHRvIHBhcnNlIHRoZSB3aG9sZSBwYXJhbWV0ZXIgYXMgbnVtYmVyIG9mIHBpeGVscy5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHBoYW50b20ncyBwYXBlclNpemUgYmVoYXZpb3IuXG4gICAgICAgICAgICB1bml0ID0gJ3B4JztcbiAgICAgICAgICAgIHZhbHVlVGV4dCA9IHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBOdW1iZXIodmFsdWVUZXh0KTtcbiAgICAgICAgYXNzZXJ0KCFpc05hTih2YWx1ZSksICdGYWlsZWQgdG8gcGFyc2UgcGFyYW1ldGVyIHZhbHVlOiAnICsgdGV4dCk7XG4gICAgICAgIHBpeGVscyA9IHZhbHVlICogdW5pdFRvUGl4ZWxzW3VuaXRdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYWdlLnBkZigpIENhbm5vdCBoYW5kbGUgcGFyYW1ldGVyIHR5cGU6ICcgKyB0eXBlb2YgcGFyYW1ldGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHBpeGVscyAvIHVuaXRUb1BpeGVsc1tsZW5ndGhVbml0XTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRW1pdHRlckV2ZW50KGVtaXR0ZXIsIGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChldmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIGVtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBlbWl0dGVyLm9mZihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQWJvcnRTaWduYWwoc2lnbmFsLCBjYXVzZSkge1xuICAgIHJldHVybiBzaWduYWxcbiAgICAgICAgPyBmcm9tRXZlbnQoc2lnbmFsLCAnYWJvcnQnKS5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgc2lnbmFsLnJlYXNvbi5jYXVzZSA9IGNhdXNlO1xuICAgICAgICAgICAgICAgIHRocm93IHNpZ25hbC5yZWFzb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2lnbmFsLnJlYXNvbiwgeyBjYXVzZSB9KTtcbiAgICAgICAgfSkpXG4gICAgICAgIDogTkVWRVI7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyQXN5bmMocHJlZGljYXRlKSB7XG4gICAgcmV0dXJuIG1lcmdlTWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUocHJlZGljYXRlKHZhbHVlKSkpLnBpcGUoZmlsdGVyKGlzTWF0Y2ggPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGlzTWF0Y2g7XG4gICAgICAgIH0pLCBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaXNOb2RlID0gISEodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MudmVyc2lvbik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbnZpcm9ubWVudC5qcy5tYXAiLCIvKipcbiAqIEphdmFTY3JpcHQgY29kZSB0aGF0IHByb3ZpZGVzIHRoZSBwdXBwZXRlZXIgdXRpbGl0aWVzLiBTZWUgdGhlXG4gKiBbUkVBRE1FXShodHRwczovL2dpdGh1Yi5jb20vcHVwcGV0ZWVyL3B1cHBldGVlci9ibG9iL21haW4vc3JjL2luamVjdGVkL1JFQURNRS5tZClcbiAqIGZvciBpbmplY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBzb3VyY2UgPSBcIlxcXCJ1c2Ugc3RyaWN0XFxcIjt2YXIgZz1PYmplY3QuZGVmaW5lUHJvcGVydHk7dmFyIFg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgQj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczt2YXIgWT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBsPSh0LGUpPT57Zm9yKHZhciByIGluIGUpZyh0LHIse2dldDplW3JdLGVudW1lcmFibGU6ITB9KX0sSj0odCxlLHIsbyk9PntpZihlJiZ0eXBlb2YgZT09XFxcIm9iamVjdFxcXCJ8fHR5cGVvZiBlPT1cXFwiZnVuY3Rpb25cXFwiKWZvcihsZXQgbiBvZiBCKGUpKSFZLmNhbGwodCxuKSYmbiE9PXImJmcodCxuLHtnZXQ6KCk9PmVbbl0sZW51bWVyYWJsZTohKG89WChlLG4pKXx8by5lbnVtZXJhYmxlfSk7cmV0dXJuIHR9O3ZhciB6PXQ9PkooZyh7fSxcXFwiX19lc01vZHVsZVxcXCIse3ZhbHVlOiEwfSksdCk7dmFyIHBlPXt9O2wocGUse2RlZmF1bHQ6KCk9PmhlfSk7bW9kdWxlLmV4cG9ydHM9eihwZSk7dmFyIE49Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHIpe3N1cGVyKGUsciksdGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWV9fSxwPWNsYXNzIGV4dGVuZHMgTnt9O3ZhciBjPWNsYXNzIHR7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gbmV3IHQoZSl9c3RhdGljIGFzeW5jIHJhY2UoZSl7bGV0IHI9bmV3IFNldDt0cnl7bGV0IG89ZS5tYXAobj0+biBpbnN0YW5jZW9mIHQ/KG4uI24mJnIuYWRkKG4pLG4udmFsdWVPclRocm93KCkpOm4pO3JldHVybiBhd2FpdCBQcm9taXNlLnJhY2Uobyl9ZmluYWxseXtmb3IobGV0IG8gb2YgcilvLnJlamVjdChuZXcgRXJyb3IoXFxcIlRpbWVvdXQgY2xlYXJlZFxcXCIpKX19I2U9ITE7I3I9ITE7I287I3Q7I2E9bmV3IFByb21pc2UoZT0+e3RoaXMuI3Q9ZX0pOyNuOyNpO2NvbnN0cnVjdG9yKGUpe2UmJmUudGltZW91dD4wJiYodGhpcy4jaT1uZXcgcChlLm1lc3NhZ2UpLHRoaXMuI249c2V0VGltZW91dCgoKT0+e3RoaXMucmVqZWN0KHRoaXMuI2kpfSxlLnRpbWVvdXQpKX0jbChlKXtjbGVhclRpbWVvdXQodGhpcy4jbiksdGhpcy4jbz1lLHRoaXMuI3QoKX1yZXNvbHZlKGUpe3RoaXMuI3J8fHRoaXMuI2V8fCh0aGlzLiNlPSEwLHRoaXMuI2woZSkpfXJlamVjdChlKXt0aGlzLiNyfHx0aGlzLiNlfHwodGhpcy4jcj0hMCx0aGlzLiNsKGUpKX1yZXNvbHZlZCgpe3JldHVybiB0aGlzLiNlfWZpbmlzaGVkKCl7cmV0dXJuIHRoaXMuI2V8fHRoaXMuI3J9dmFsdWUoKXtyZXR1cm4gdGhpcy4jb30jczt2YWx1ZU9yVGhyb3coKXtyZXR1cm4gdGhpcy4jc3x8KHRoaXMuI3M9KGFzeW5jKCk9PntpZihhd2FpdCB0aGlzLiNhLHRoaXMuI3IpdGhyb3cgdGhpcy4jbztyZXR1cm4gdGhpcy4jb30pKCkpLHRoaXMuI3N9fTt2YXIgTD1uZXcgTWFwLEY9dD0+e2xldCBlPUwuZ2V0KHQpO3JldHVybiBlfHwoZT1uZXcgRnVuY3Rpb24oYHJldHVybiAke3R9YCkoKSxMLnNldCh0LGUpLGUpfTt2YXIgeD17fTtsKHgse2FyaWFRdWVyeVNlbGVjdG9yOigpPT5HLGFyaWFRdWVyeVNlbGVjdG9yQWxsOigpPT5ifSk7dmFyIEc9KHQsZSk9Pmdsb2JhbFRoaXMuX19hcmlhUXVlcnlTZWxlY3Rvcih0LGUpLGI9YXN5bmMgZnVuY3Rpb24qKHQsZSl7eWllbGQqYXdhaXQgZ2xvYmFsVGhpcy5fX2FyaWFRdWVyeVNlbGVjdG9yQWxsKHQsZSl9O3ZhciBFPXt9O2woRSx7Y3NzUXVlcnlTZWxlY3RvcjooKT0+Syxjc3NRdWVyeVNlbGVjdG9yQWxsOigpPT5afSk7dmFyIEs9KHQsZSk9PnQucXVlcnlTZWxlY3RvcihlKSxaPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChlKX07dmFyIEE9e307bChBLHtjdXN0b21RdWVyeVNlbGVjdG9yczooKT0+UH0pO3ZhciB2PWNsYXNzeyNlPW5ldyBNYXA7cmVnaXN0ZXIoZSxyKXtpZighci5xdWVyeU9uZSYmci5xdWVyeUFsbCl7bGV0IG89ci5xdWVyeUFsbDtyLnF1ZXJ5T25lPShuLGkpPT57Zm9yKGxldCBzIG9mIG8obixpKSlyZXR1cm4gcztyZXR1cm4gbnVsbH19ZWxzZSBpZihyLnF1ZXJ5T25lJiYhci5xdWVyeUFsbCl7bGV0IG89ci5xdWVyeU9uZTtyLnF1ZXJ5QWxsPShuLGkpPT57bGV0IHM9byhuLGkpO3JldHVybiBzP1tzXTpbXX19ZWxzZSBpZighci5xdWVyeU9uZXx8IXIucXVlcnlBbGwpdGhyb3cgbmV3IEVycm9yKFxcXCJBdCBsZWFzdCBvbmUgcXVlcnkgbWV0aG9kIG11c3QgYmUgZGVmaW5lZC5cXFwiKTt0aGlzLiNlLnNldChlLHtxdWVyeVNlbGVjdG9yOnIucXVlcnlPbmUscXVlcnlTZWxlY3RvckFsbDpyLnF1ZXJ5QWxsfSl9dW5yZWdpc3RlcihlKXt0aGlzLiNlLmRlbGV0ZShlKX1nZXQoZSl7cmV0dXJuIHRoaXMuI2UuZ2V0KGUpfWNsZWFyKCl7dGhpcy4jZS5jbGVhcigpfX0sUD1uZXcgdjt2YXIgUj17fTtsKFIse3BpZXJjZVF1ZXJ5U2VsZWN0b3I6KCk9PmVlLHBpZXJjZVF1ZXJ5U2VsZWN0b3JBbGw6KCk9PnRlfSk7dmFyIGVlPSh0LGUpPT57bGV0IHI9bnVsbCxvPW49PntsZXQgaT1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKG4sTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO2Rve2xldCBzPWkuY3VycmVudE5vZGU7cy5zaGFkb3dSb290JiZvKHMuc2hhZG93Um9vdCksIShzIGluc3RhbmNlb2YgU2hhZG93Um9vdCkmJnMhPT1uJiYhciYmcy5tYXRjaGVzKGUpJiYocj1zKX13aGlsZSghciYmaS5uZXh0Tm9kZSgpKX07cmV0dXJuIHQgaW5zdGFuY2VvZiBEb2N1bWVudCYmKHQ9dC5kb2N1bWVudEVsZW1lbnQpLG8odCkscn0sdGU9KHQsZSk9PntsZXQgcj1bXSxvPW49PntsZXQgaT1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKG4sTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO2Rve2xldCBzPWkuY3VycmVudE5vZGU7cy5zaGFkb3dSb290JiZvKHMuc2hhZG93Um9vdCksIShzIGluc3RhbmNlb2YgU2hhZG93Um9vdCkmJnMhPT1uJiZzLm1hdGNoZXMoZSkmJnIucHVzaChzKX13aGlsZShpLm5leHROb2RlKCkpfTtyZXR1cm4gdCBpbnN0YW5jZW9mIERvY3VtZW50JiYodD10LmRvY3VtZW50RWxlbWVudCksbyh0KSxyfTt2YXIgdT0odCxlKT0+e2lmKCF0KXRocm93IG5ldyBFcnJvcihlKX07dmFyIHk9Y2xhc3N7I2U7I3I7I287I3Q7Y29uc3RydWN0b3IoZSxyKXt0aGlzLiNlPWUsdGhpcy4jcj1yfWFzeW5jIHN0YXJ0KCl7bGV0IGU9dGhpcy4jdD1jLmNyZWF0ZSgpLHI9YXdhaXQgdGhpcy4jZSgpO2lmKHIpe2UucmVzb2x2ZShyKTtyZXR1cm59dGhpcy4jbz1uZXcgTXV0YXRpb25PYnNlcnZlcihhc3luYygpPT57bGV0IG89YXdhaXQgdGhpcy4jZSgpO28mJihlLnJlc29sdmUobyksYXdhaXQgdGhpcy5zdG9wKCkpfSksdGhpcy4jby5vYnNlcnZlKHRoaXMuI3Ise2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwLGF0dHJpYnV0ZXM6ITB9KX1hc3luYyBzdG9wKCl7dSh0aGlzLiN0LFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jdC5maW5pc2hlZCgpfHx0aGlzLiN0LnJlamVjdChuZXcgRXJyb3IoXFxcIlBvbGxpbmcgc3RvcHBlZFxcXCIpKSx0aGlzLiNvJiYodGhpcy4jby5kaXNjb25uZWN0KCksdGhpcy4jbz12b2lkIDApfXJlc3VsdCgpe3JldHVybiB1KHRoaXMuI3QsXFxcIlBvbGxpbmcgbmV2ZXIgc3RhcnRlZC5cXFwiKSx0aGlzLiN0LnZhbHVlT3JUaHJvdygpfX0sdz1jbGFzc3sjZTsjcjtjb25zdHJ1Y3RvcihlKXt0aGlzLiNlPWV9YXN5bmMgc3RhcnQoKXtsZXQgZT10aGlzLiNyPWMuY3JlYXRlKCkscj1hd2FpdCB0aGlzLiNlKCk7aWYocil7ZS5yZXNvbHZlKHIpO3JldHVybn1sZXQgbz1hc3luYygpPT57aWYoZS5maW5pc2hlZCgpKXJldHVybjtsZXQgbj1hd2FpdCB0aGlzLiNlKCk7aWYoIW4pe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobyk7cmV0dXJufWUucmVzb2x2ZShuKSxhd2FpdCB0aGlzLnN0b3AoKX07d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShvKX1hc3luYyBzdG9wKCl7dSh0aGlzLiNyLFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jci5maW5pc2hlZCgpfHx0aGlzLiNyLnJlamVjdChuZXcgRXJyb3IoXFxcIlBvbGxpbmcgc3RvcHBlZFxcXCIpKX1yZXN1bHQoKXtyZXR1cm4gdSh0aGlzLiNyLFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jci52YWx1ZU9yVGhyb3coKX19LFQ9Y2xhc3N7I2U7I3I7I287I3Q7Y29uc3RydWN0b3IoZSxyKXt0aGlzLiNlPWUsdGhpcy4jcj1yfWFzeW5jIHN0YXJ0KCl7bGV0IGU9dGhpcy4jdD1jLmNyZWF0ZSgpLHI9YXdhaXQgdGhpcy4jZSgpO2lmKHIpe2UucmVzb2x2ZShyKTtyZXR1cm59dGhpcy4jbz1zZXRJbnRlcnZhbChhc3luYygpPT57bGV0IG89YXdhaXQgdGhpcy4jZSgpO28mJihlLnJlc29sdmUobyksYXdhaXQgdGhpcy5zdG9wKCkpfSx0aGlzLiNyKX1hc3luYyBzdG9wKCl7dSh0aGlzLiN0LFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jdC5maW5pc2hlZCgpfHx0aGlzLiN0LnJlamVjdChuZXcgRXJyb3IoXFxcIlBvbGxpbmcgc3RvcHBlZFxcXCIpKSx0aGlzLiNvJiYoY2xlYXJJbnRlcnZhbCh0aGlzLiNvKSx0aGlzLiNvPXZvaWQgMCl9cmVzdWx0KCl7cmV0dXJuIHUodGhpcy4jdCxcXFwiUG9sbGluZyBuZXZlciBzdGFydGVkLlxcXCIpLHRoaXMuI3QudmFsdWVPclRocm93KCl9fTt2YXIgXz17fTtsKF8se1BDb21iaW5hdG9yOigpPT5ILHBRdWVyeVNlbGVjdG9yOigpPT5mZSxwUXVlcnlTZWxlY3RvckFsbDooKT0+JH0pO3ZhciBhPWNsYXNze3N0YXRpYyBhc3luYyptYXAoZSxyKXtmb3IgYXdhaXQobGV0IG8gb2YgZSl5aWVsZCBhd2FpdCByKG8pfXN0YXRpYyBhc3luYypmbGF0TWFwKGUscil7Zm9yIGF3YWl0KGxldCBvIG9mIGUpeWllbGQqcihvKX1zdGF0aWMgYXN5bmMgY29sbGVjdChlKXtsZXQgcj1bXTtmb3IgYXdhaXQobGV0IG8gb2YgZSlyLnB1c2gobyk7cmV0dXJuIHJ9c3RhdGljIGFzeW5jIGZpcnN0KGUpe2ZvciBhd2FpdChsZXQgciBvZiBlKXJldHVybiByfX07dmFyIEM9e307bChDLHt0ZXh0UXVlcnlTZWxlY3RvckFsbDooKT0+bX0pO3ZhciByZT1uZXcgU2V0KFtcXFwiY2hlY2tib3hcXFwiLFxcXCJpbWFnZVxcXCIsXFxcInJhZGlvXFxcIl0pLG9lPXQ9PnQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudHx8dCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnR8fHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50JiYhcmUuaGFzKHQudHlwZSksbmU9bmV3IFNldChbXFxcIlNDUklQVFxcXCIsXFxcIlNUWUxFXFxcIl0pLGY9dD0+IW5lLmhhcyh0Lm5vZGVOYW1lKSYmIWRvY3VtZW50LmhlYWQ/LmNvbnRhaW5zKHQpLEk9bmV3IFdlYWtNYXAsaj10PT57Zm9yKDt0OylJLmRlbGV0ZSh0KSx0IGluc3RhbmNlb2YgU2hhZG93Um9vdD90PXQuaG9zdDp0PXQucGFyZW50Tm9kZX0sVz1uZXcgV2Vha1NldCxzZT1uZXcgTXV0YXRpb25PYnNlcnZlcih0PT57Zm9yKGxldCBlIG9mIHQpaihlLnRhcmdldCl9KSxkPXQ9PntsZXQgZT1JLmdldCh0KTtpZihlfHwoZT17ZnVsbDpcXFwiXFxcIixpbW1lZGlhdGU6W119LCFmKHQpKSlyZXR1cm4gZTtsZXQgcj1cXFwiXFxcIjtpZihvZSh0KSllLmZ1bGw9dC52YWx1ZSxlLmltbWVkaWF0ZS5wdXNoKHQudmFsdWUpLHQuYWRkRXZlbnRMaXN0ZW5lcihcXFwiaW5wdXRcXFwiLG89PntqKG8udGFyZ2V0KX0se29uY2U6ITAsY2FwdHVyZTohMH0pO2Vsc2V7Zm9yKGxldCBvPXQuZmlyc3RDaGlsZDtvO289by5uZXh0U2libGluZyl7aWYoby5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXtlLmZ1bGwrPW8ubm9kZVZhbHVlPz9cXFwiXFxcIixyKz1vLm5vZGVWYWx1ZT8/XFxcIlxcXCI7Y29udGludWV9ciYmZS5pbW1lZGlhdGUucHVzaChyKSxyPVxcXCJcXFwiLG8ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGUuZnVsbCs9ZChvKS5mdWxsKX1yJiZlLmltbWVkaWF0ZS5wdXNoKHIpLHQgaW5zdGFuY2VvZiBFbGVtZW50JiZ0LnNoYWRvd1Jvb3QmJihlLmZ1bGwrPWQodC5zaGFkb3dSb290KS5mdWxsKSxXLmhhcyh0KXx8KHNlLm9ic2VydmUodCx7Y2hpbGRMaXN0OiEwLGNoYXJhY3RlckRhdGE6ITAsc3VidHJlZTohMH0pLFcuYWRkKHQpKX1yZXR1cm4gSS5zZXQodCxlKSxlfTt2YXIgbT1mdW5jdGlvbioodCxlKXtsZXQgcj0hMTtmb3IobGV0IG8gb2YgdC5jaGlsZE5vZGVzKWlmKG8gaW5zdGFuY2VvZiBFbGVtZW50JiZmKG8pKXtsZXQgbjtvLnNoYWRvd1Jvb3Q/bj1tKG8uc2hhZG93Um9vdCxlKTpuPW0obyxlKTtmb3IobGV0IGkgb2Ygbil5aWVsZCBpLHI9ITB9cnx8dCBpbnN0YW5jZW9mIEVsZW1lbnQmJmYodCkmJmQodCkuZnVsbC5pbmNsdWRlcyhlKSYmKHlpZWxkIHQpfTt2YXIgaz17fTtsKGsse2NoZWNrVmlzaWJpbGl0eTooKT0+bGUscGllcmNlOigpPT5TLHBpZXJjZUFsbDooKT0+T30pO3ZhciBpZT1bXFxcImhpZGRlblxcXCIsXFxcImNvbGxhcHNlXFxcIl0sbGU9KHQsZSk9PntpZighdClyZXR1cm4gZT09PSExO2lmKGU9PT12b2lkIDApcmV0dXJuIHQ7bGV0IHI9dC5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFP3QucGFyZW50RWxlbWVudDp0LG89d2luZG93LmdldENvbXB1dGVkU3R5bGUociksbj1vJiYhaWUuaW5jbHVkZXMoby52aXNpYmlsaXR5KSYmIWFlKHIpO3JldHVybiBlPT09bj90OiExfTtmdW5jdGlvbiBhZSh0KXtsZXQgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBlLndpZHRoPT09MHx8ZS5oZWlnaHQ9PT0wfXZhciBjZT10PT5cXFwic2hhZG93Um9vdFxcXCJpbiB0JiZ0LnNoYWRvd1Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290O2Z1bmN0aW9uKlModCl7Y2UodCk/eWllbGQgdC5zaGFkb3dSb290OnlpZWxkIHR9ZnVuY3Rpb24qTyh0KXt0PVModCkubmV4dCgpLnZhbHVlLHlpZWxkIHQ7bGV0IGU9W2RvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIodCxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCldO2ZvcihsZXQgciBvZiBlKXtsZXQgbztmb3IoO289ci5uZXh0Tm9kZSgpOylvLnNoYWRvd1Jvb3QmJih5aWVsZCBvLnNoYWRvd1Jvb3QsZS5wdXNoKGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoby5zaGFkb3dSb290LE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKSkpfX12YXIgUT17fTtsKFEse3hwYXRoUXVlcnlTZWxlY3RvckFsbDooKT0+cX0pO3ZhciBxPWZ1bmN0aW9uKih0LGUscj0tMSl7bGV0IG49KHQub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQpLmV2YWx1YXRlKGUsdCxudWxsLFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9JVEVSQVRPUl9UWVBFKSxpPVtdLHM7Zm9yKDsocz1uLml0ZXJhdGVOZXh0KCkpJiYoaS5wdXNoKHMpLCEociYmaS5sZW5ndGg9PT1yKSk7KTtmb3IobGV0IGg9MDtoPGkubGVuZ3RoO2grKylzPWlbaF0seWllbGQgcyxkZWxldGUgaVtoXX07dmFyIHVlPS9bLVxcXFx3XFxcXFB7QVNDSUl9Kl0vLEg9KHI9PihyLkRlc2NlbmRlbnQ9XFxcIj4+PlxcXCIsci5DaGlsZD1cXFwiPj4+PlxcXCIscikpKEh8fHt9KSxWPXQ9PlxcXCJxdWVyeVNlbGVjdG9yQWxsXFxcImluIHQsTT1jbGFzc3sjZTsjcj1bXTsjbz12b2lkIDA7ZWxlbWVudHM7Y29uc3RydWN0b3IoZSxyKXt0aGlzLmVsZW1lbnRzPVtlXSx0aGlzLiNlPXIsdGhpcy4jdCgpfWFzeW5jIHJ1bigpe2lmKHR5cGVvZiB0aGlzLiNvPT1cXFwic3RyaW5nXFxcIilzd2l0Y2godGhpcy4jby50cmltU3RhcnQoKSl7Y2FzZVxcXCI6c2NvcGVcXFwiOnRoaXMuI3QoKTticmVha31mb3IoO3RoaXMuI28hPT12b2lkIDA7dGhpcy4jdCgpKXtsZXQgZT10aGlzLiNvO3R5cGVvZiBlPT1cXFwic3RyaW5nXFxcIj9lWzBdJiZ1ZS50ZXN0KGVbMF0pP3RoaXMuZWxlbWVudHM9YS5mbGF0TWFwKHRoaXMuZWxlbWVudHMsYXN5bmMgZnVuY3Rpb24qKHIpe1YocikmJih5aWVsZCpyLnF1ZXJ5U2VsZWN0b3JBbGwoZSkpfSk6dGhpcy5lbGVtZW50cz1hLmZsYXRNYXAodGhpcy5lbGVtZW50cyxhc3luYyBmdW5jdGlvbioocil7aWYoIXIucGFyZW50RWxlbWVudCl7aWYoIVYocikpcmV0dXJuO3lpZWxkKnIucXVlcnlTZWxlY3RvckFsbChlKTtyZXR1cm59bGV0IG89MDtmb3IobGV0IG4gb2Ygci5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKWlmKCsrbyxuPT09cilicmVhazt5aWVsZCpyLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChgOnNjb3BlPjpudGgtY2hpbGQoJHtvfSkke2V9YCl9KTp0aGlzLmVsZW1lbnRzPWEuZmxhdE1hcCh0aGlzLmVsZW1lbnRzLGFzeW5jIGZ1bmN0aW9uKihyKXtzd2l0Y2goZS5uYW1lKXtjYXNlXFxcInRleHRcXFwiOnlpZWxkKm0ocixlLnZhbHVlKTticmVhaztjYXNlXFxcInhwYXRoXFxcIjp5aWVsZCpxKHIsZS52YWx1ZSk7YnJlYWs7Y2FzZVxcXCJhcmlhXFxcIjp5aWVsZCpiKHIsZS52YWx1ZSk7YnJlYWs7ZGVmYXVsdDpsZXQgbz1QLmdldChlLm5hbWUpO2lmKCFvKXRocm93IG5ldyBFcnJvcihgVW5rbm93biBzZWxlY3RvciB0eXBlOiAke2UubmFtZX1gKTt5aWVsZCpvLnF1ZXJ5U2VsZWN0b3JBbGwocixlLnZhbHVlKX19KX19I3QoKXtpZih0aGlzLiNyLmxlbmd0aCE9PTApe3RoaXMuI289dGhpcy4jci5zaGlmdCgpO3JldHVybn1pZih0aGlzLiNlLmxlbmd0aD09PTApe3RoaXMuI289dm9pZCAwO3JldHVybn1sZXQgZT10aGlzLiNlLnNoaWZ0KCk7c3dpdGNoKGUpe2Nhc2VcXFwiPj4+PlxcXCI6e3RoaXMuZWxlbWVudHM9YS5mbGF0TWFwKHRoaXMuZWxlbWVudHMsUyksdGhpcy4jdCgpO2JyZWFrfWNhc2VcXFwiPj4+XFxcIjp7dGhpcy5lbGVtZW50cz1hLmZsYXRNYXAodGhpcy5lbGVtZW50cyxPKSx0aGlzLiN0KCk7YnJlYWt9ZGVmYXVsdDp0aGlzLiNyPWUsdGhpcy4jdCgpO2JyZWFrfX19LEQ9Y2xhc3N7I2U9bmV3IFdlYWtNYXA7Y2FsY3VsYXRlKGUscj1bXSl7aWYoZT09PW51bGwpcmV0dXJuIHI7ZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QmJihlPWUuaG9zdCk7bGV0IG89dGhpcy4jZS5nZXQoZSk7aWYobylyZXR1cm5bLi4ubywuLi5yXTtsZXQgbj0wO2ZvcihsZXQgcz1lLnByZXZpb3VzU2libGluZztzO3M9cy5wcmV2aW91c1NpYmxpbmcpKytuO2xldCBpPXRoaXMuY2FsY3VsYXRlKGUucGFyZW50Tm9kZSxbbl0pO3JldHVybiB0aGlzLiNlLnNldChlLGkpLFsuLi5pLC4uLnJdfX0sVT0odCxlKT0+e2lmKHQubGVuZ3RoK2UubGVuZ3RoPT09MClyZXR1cm4gMDtsZXRbcj0tMSwuLi5vXT10LFtuPS0xLC4uLmldPWU7cmV0dXJuIHI9PT1uP1UobyxpKTpyPG4/LTE6MX0sZGU9YXN5bmMgZnVuY3Rpb24qKHQpe2xldCBlPW5ldyBTZXQ7Zm9yIGF3YWl0KGxldCBvIG9mIHQpZS5hZGQobyk7bGV0IHI9bmV3IEQ7eWllbGQqWy4uLmUudmFsdWVzKCldLm1hcChvPT5bbyxyLmNhbGN1bGF0ZShvKV0pLnNvcnQoKFssb10sWyxuXSk9PlUobyxuKSkubWFwKChbb10pPT5vKX0sJD1mdW5jdGlvbih0LGUpe2xldCByPUpTT04ucGFyc2UoZSk7aWYoci5zb21lKG89PntsZXQgbj0wO3JldHVybiBvLnNvbWUoaT0+KHR5cGVvZiBpPT1cXFwic3RyaW5nXFxcIj8rK246bj0wLG4+MSkpfSkpdGhyb3cgbmV3IEVycm9yKFxcXCJNdWx0aXBsZSBkZWVwIGNvbWJpbmF0b3JzIGZvdW5kIGluIHNlcXVlbmNlLlxcXCIpO3JldHVybiBkZShhLmZsYXRNYXAocixvPT57bGV0IG49bmV3IE0odCxvKTtyZXR1cm4gbi5ydW4oKSxuLmVsZW1lbnRzfSkpfSxmZT1hc3luYyBmdW5jdGlvbih0LGUpe2ZvciBhd2FpdChsZXQgciBvZiAkKHQsZSkpcmV0dXJuIHI7cmV0dXJuIG51bGx9O3ZhciBtZT1PYmplY3QuZnJlZXplKHsuLi54LC4uLkEsLi4uUiwuLi5fLC4uLkMsLi4uaywuLi5RLC4uLkUsRGVmZXJyZWQ6YyxjcmVhdGVGdW5jdGlvbjpGLGNyZWF0ZVRleHRDb250ZW50OmQsSW50ZXJ2YWxQb2xsZXI6VCxpc1N1aXRhYmxlTm9kZUZvclRleHRNYXRjaGluZzpmLE11dGF0aW9uUG9sbGVyOnksUkFGUG9sbGVyOnd9KSxoZT1tZTtcXG5cIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluamVjdGVkLmpzLm1hcCIsIi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBwYWNrYWdlVmVyc2lvbiA9ICcyMi4xMy4wJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vYXBpL2FwaS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NkcC9jZHAuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vY29tbW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmV2aXNpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbC91dGlsLmpzJztcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBxdWVyeSBoYW5kbGVyIEFQSSBkZWZpbmVkIG9uIHtAbGluayBQdXBwZXRlZXJ9XG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC1icm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL2luZGV4LWJyb3dzZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub2RlL25vZGUuanMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IG1rZHRlbXAgfSBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjb21wdXRlU3lzdGVtRXhlY3V0YWJsZVBhdGgsIEJyb3dzZXIgYXMgU3VwcG9ydGVkQnJvd3NlcnMsIENocm9tZVJlbGVhc2VDaGFubmVsIGFzIEJyb3dzZXJzQ2hyb21lUmVsZWFzZUNoYW5uZWwsIH0gZnJvbSAnQHB1cHBldGVlci9icm93c2Vycyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgUHJvZHVjdExhdW5jaGVyIH0gZnJvbSAnLi9Qcm9kdWN0TGF1bmNoZXIuanMnO1xuaW1wb3J0IHsgcm0gfSBmcm9tICcuL3V0aWwvZnMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENocm9tZUxhdW5jaGVyIGV4dGVuZHMgUHJvZHVjdExhdW5jaGVyIHtcbiAgICBjb25zdHJ1Y3RvcihwdXBwZXRlZXIpIHtcbiAgICAgICAgc3VwZXIocHVwcGV0ZWVyLCAnY2hyb21lJyk7XG4gICAgfVxuICAgIGxhdW5jaChvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24ubG9nTGV2ZWwgPT09ICd3YXJuJyAmJlxuICAgICAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicgJiZcbiAgICAgICAgICAgIHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNwdXMgPSBvcy5jcHVzKCk7XG4gICAgICAgICAgICBpZiAoY3B1c1swXT8ubW9kZWwuaW5jbHVkZXMoJ0FwcGxlJykpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oW1xuICAgICAgICAgICAgICAgICAgICAnXFx4MUJbMW1cXHgxQls0M21cXHgxQlszMG0nLFxuICAgICAgICAgICAgICAgICAgICAnRGVncmFkZWQgcGVyZm9ybWFuY2Ugd2FybmluZzpcXHgxQlswbVxceDFCWzMzbScsXG4gICAgICAgICAgICAgICAgICAgICdMYXVuY2hpbmcgQ2hyb21lIG9uIE1hYyBTaWxpY29uIChhcm02NCkgZnJvbSBhbiB4NjQgTm9kZSBpbnN0YWxsYXRpb24gcmVzdWx0cyBpbicsXG4gICAgICAgICAgICAgICAgICAgICdSb3NldHRhIHRyYW5zbGF0aW5nIHRoZSBDaHJvbWUgYmluYXJ5LCBldmVuIGlmIENocm9tZSBpcyBhbHJlYWR5IGFybTY0LiBUaGlzIHdvdWxkJyxcbiAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCBpbiBodWdlIHBlcmZvcm1hbmNlIGlzc3Vlcy4gVG8gcmVzb2x2ZSB0aGlzLCB5b3UgbXVzdCBydW4gUHVwcGV0ZWVyIHdpdGgnLFxuICAgICAgICAgICAgICAgICAgICAnYSB2ZXJzaW9uIG9mIE5vZGUgYnVpbHQgZm9yIGFybTY0LicsXG4gICAgICAgICAgICAgICAgXS5qb2luKCdcXG4gICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIubGF1bmNoKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBjb21wdXRlTGF1bmNoQXJndW1lbnRzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGlnbm9yZURlZmF1bHRBcmdzID0gZmFsc2UsIGFyZ3MgPSBbXSwgcGlwZSA9IGZhbHNlLCBkZWJ1Z2dpbmdQb3J0LCBjaGFubmVsLCBleGVjdXRhYmxlUGF0aCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGNocm9tZUFyZ3VtZW50cyA9IFtdO1xuICAgICAgICBpZiAoIWlnbm9yZURlZmF1bHRBcmdzKSB7XG4gICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaCguLi50aGlzLmRlZmF1bHRBcmdzKG9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlnbm9yZURlZmF1bHRBcmdzKSkge1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goLi4udGhpcy5kZWZhdWx0QXJncyhvcHRpb25zKS5maWx0ZXIoYXJnID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIWlnbm9yZURlZmF1bHRBcmdzLmluY2x1ZGVzKGFyZyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaCguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNocm9tZUFyZ3VtZW50cy5zb21lKGFyZ3VtZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcmd1bWVudC5zdGFydHNXaXRoKCctLXJlbW90ZS1kZWJ1Z2dpbmctJyk7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBpZiAocGlwZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydCghZGVidWdnaW5nUG9ydCwgJ0Jyb3dzZXIgc2hvdWxkIGJlIGxhdW5jaGVkIHdpdGggZWl0aGVyIHBpcGUgb3IgZGVidWdnaW5nIHBvcnQgLSBub3QgYm90aC4nKTtcbiAgICAgICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaCgnLS1yZW1vdGUtZGVidWdnaW5nLXBpcGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNocm9tZUFyZ3VtZW50cy5wdXNoKGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke2RlYnVnZ2luZ1BvcnQgfHwgMH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgaXNUZW1wVXNlckRhdGFEaXIgPSBmYWxzZTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSB1c2VyIGRhdGEgZGlyIGFyZ3VtZW50LCB3aGljaCB3aWxsIGFsd2F5cyBiZSBzZXQgZXZlblxuICAgICAgICAvLyB3aXRoIGEgY3VzdG9tIGRpcmVjdG9yeSBzcGVjaWZpZWQgdmlhIHRoZSB1c2VyRGF0YURpciBvcHRpb24uXG4gICAgICAgIGxldCB1c2VyRGF0YURpckluZGV4ID0gY2hyb21lQXJndW1lbnRzLmZpbmRJbmRleChhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFyZy5zdGFydHNXaXRoKCctLXVzZXItZGF0YS1kaXInKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh1c2VyRGF0YURpckluZGV4IDwgMCkge1xuICAgICAgICAgICAgaXNUZW1wVXNlckRhdGFEaXIgPSB0cnVlO1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goYC0tdXNlci1kYXRhLWRpcj0ke2F3YWl0IG1rZHRlbXAodGhpcy5nZXRQcm9maWxlUGF0aCgpKX1gKTtcbiAgICAgICAgICAgIHVzZXJEYXRhRGlySW5kZXggPSBjaHJvbWVBcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VyRGF0YURpciA9IGNocm9tZUFyZ3VtZW50c1t1c2VyRGF0YURpckluZGV4XS5zcGxpdCgnPScsIDIpWzFdO1xuICAgICAgICBhc3NlcnQodHlwZW9mIHVzZXJEYXRhRGlyID09PSAnc3RyaW5nJywgJ2AtLXVzZXItZGF0YS1kaXJgIGlzIG1hbGZvcm1lZCcpO1xuICAgICAgICBsZXQgY2hyb21lRXhlY3V0YWJsZSA9IGV4ZWN1dGFibGVQYXRoO1xuICAgICAgICBpZiAoIWNocm9tZUV4ZWN1dGFibGUpIHtcbiAgICAgICAgICAgIGFzc2VydChjaGFubmVsIHx8ICF0aGlzLnB1cHBldGVlci5faXNQdXBwZXRlZXJDb3JlLCBgQW4gXFxgZXhlY3V0YWJsZVBhdGhcXGAgb3IgXFxgY2hhbm5lbFxcYCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgXFxgcHVwcGV0ZWVyLWNvcmVcXGBgKTtcbiAgICAgICAgICAgIGNocm9tZUV4ZWN1dGFibGUgPSB0aGlzLmV4ZWN1dGFibGVQYXRoKGNoYW5uZWwsIG9wdGlvbnMuaGVhZGxlc3MgPz8gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4ZWN1dGFibGVQYXRoOiBjaHJvbWVFeGVjdXRhYmxlLFxuICAgICAgICAgICAgYXJnczogY2hyb21lQXJndW1lbnRzLFxuICAgICAgICAgICAgaXNUZW1wVXNlckRhdGFEaXIsXG4gICAgICAgICAgICB1c2VyRGF0YURpcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY2xlYW5Vc2VyRGF0YURpcihwYXRoLCBvcHRzKSB7XG4gICAgICAgIGlmIChvcHRzLmlzVGVtcCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBybShwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGRlZmF1bHRBcmdzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZS9jaHJvbWUtbGF1bmNoZXIvYmxvYi9tYWluL2RvY3MvY2hyb21lLWZsYWdzLWZvci10b29scy5tZFxuICAgICAgICBjb25zdCB1c2VyRGlzYWJsZWRGZWF0dXJlcyA9IGdldEZlYXR1cmVzKCctLWRpc2FibGUtZmVhdHVyZXMnLCBvcHRpb25zLmFyZ3MpO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzICYmIHVzZXJEaXNhYmxlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlbW92ZU1hdGNoaW5nRmxhZ3Mob3B0aW9ucy5hcmdzLCAnLS1kaXNhYmxlLWZlYXR1cmVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHVybk9uRXhwZXJpbWVudGFsRmVhdHVyZXNGb3JUZXN0aW5nID0gcHJvY2Vzcy5lbnZbJ1BVUFBFVEVFUl9URVNUX0VYUEVSSU1FTlRBTF9DSFJPTUVfRkVBVFVSRVMnXSA9PT0gJ3RydWUnO1xuICAgICAgICAvLyBNZXJnZSBkZWZhdWx0IGRpc2FibGVkIGZlYXR1cmVzIHdpdGggdXNlci1wcm92aWRlZCBvbmVzLCBpZiBhbnkuXG4gICAgICAgIGNvbnN0IGRpc2FibGVkRmVhdHVyZXMgPSBbXG4gICAgICAgICAgICAnVHJhbnNsYXRlJyxcbiAgICAgICAgICAgIC8vIEFjY2VwdENIRnJhbWUgZGlzYWJsZWQgYmVjYXVzZSBvZiBjcmJ1Zy5jb20vMTM0ODEwNi5cbiAgICAgICAgICAgICdBY2NlcHRDSEZyYW1lJyxcbiAgICAgICAgICAgICdNZWRpYVJvdXRlcicsXG4gICAgICAgICAgICAnT3B0aW1pemF0aW9uSGludHMnLFxuICAgICAgICAgICAgLi4uKHR1cm5PbkV4cGVyaW1lbnRhbEZlYXR1cmVzRm9yVGVzdGluZ1xuICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vMTQ5MjA1M1xuICAgICAgICAgICAgICAgICAgICAnUHJvY2Vzc1BlclNpdGVVcFRvTWFpbkZyYW1lVGhyZXNob2xkJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3B1cHBldGVlci9wdXBwZXRlZXIvaXNzdWVzLzEwNzE1XG4gICAgICAgICAgICAgICAgICAgICdJc29sYXRlU2FuZGJveGVkSWZyYW1lcycsXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAuLi51c2VyRGlzYWJsZWRGZWF0dXJlcyxcbiAgICAgICAgXS5maWx0ZXIoZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmVhdHVyZSAhPT0gJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB1c2VyRW5hYmxlZEZlYXR1cmVzID0gZ2V0RmVhdHVyZXMoJy0tZW5hYmxlLWZlYXR1cmVzJywgb3B0aW9ucy5hcmdzKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncyAmJiB1c2VyRW5hYmxlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlbW92ZU1hdGNoaW5nRmxhZ3Mob3B0aW9ucy5hcmdzLCAnLS1lbmFibGUtZmVhdHVyZXMnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNZXJnZSBkZWZhdWx0IGVuYWJsZWQgZmVhdHVyZXMgd2l0aCB1c2VyLXByb3ZpZGVkIG9uZXMsIGlmIGFueS5cbiAgICAgICAgY29uc3QgZW5hYmxlZEZlYXR1cmVzID0gW1xuICAgICAgICAgICAgJ1BkZk9vcGlmJyxcbiAgICAgICAgICAgIC8vIEFkZCBmZWF0dXJlcyB0byBlbmFibGUgYnkgZGVmYXVsdCBoZXJlLlxuICAgICAgICAgICAgLi4udXNlckVuYWJsZWRGZWF0dXJlcyxcbiAgICAgICAgXS5maWx0ZXIoZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmVhdHVyZSAhPT0gJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjaHJvbWVBcmd1bWVudHMgPSBbXG4gICAgICAgICAgICAnLS1hbGxvdy1wcmUtY29tbWl0LWlucHV0JyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYmFja2dyb3VuZC1uZXR3b3JraW5nJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYmFja2dyb3VuZC10aW1lci10aHJvdHRsaW5nJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYmFja2dyb3VuZGluZy1vY2NsdWRlZC13aW5kb3dzJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYnJlYWtwYWQnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1jbGllbnQtc2lkZS1waGlzaGluZy1kZXRlY3Rpb24nLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1jb21wb25lbnQtZXh0ZW5zaW9ucy13aXRoLWJhY2tncm91bmQtcGFnZXMnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1jb21wb25lbnQtdXBkYXRlJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtZGVmYXVsdC1hcHBzJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtZGV2LXNobS11c2FnZScsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLWV4dGVuc2lvbnMnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1oYW5nLW1vbml0b3InLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1pbmZvYmFycycsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLWlwYy1mbG9vZGluZy1wcm90ZWN0aW9uJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtcG9wdXAtYmxvY2tpbmcnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1wcm9tcHQtb24tcmVwb3N0JyxcbiAgICAgICAgICAgICctLWRpc2FibGUtcmVuZGVyZXItYmFja2dyb3VuZGluZycsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLXNlYXJjaC1lbmdpbmUtY2hvaWNlLXNjcmVlbicsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLXN5bmMnLFxuICAgICAgICAgICAgJy0tZW5hYmxlLWF1dG9tYXRpb24nLFxuICAgICAgICAgICAgJy0tZXhwb3J0LXRhZ2dlZC1wZGYnLFxuICAgICAgICAgICAgJy0tZ2VuZXJhdGUtcGRmLWRvY3VtZW50LW91dGxpbmUnLFxuICAgICAgICAgICAgJy0tZm9yY2UtY29sb3ItcHJvZmlsZT1zcmdiJyxcbiAgICAgICAgICAgICctLW1ldHJpY3MtcmVjb3JkaW5nLW9ubHknLFxuICAgICAgICAgICAgJy0tbm8tZmlyc3QtcnVuJyxcbiAgICAgICAgICAgICctLXBhc3N3b3JkLXN0b3JlPWJhc2ljJyxcbiAgICAgICAgICAgICctLXVzZS1tb2NrLWtleWNoYWluJyxcbiAgICAgICAgICAgIGAtLWRpc2FibGUtZmVhdHVyZXM9JHtkaXNhYmxlZEZlYXR1cmVzLmpvaW4oJywnKX1gLFxuICAgICAgICAgICAgYC0tZW5hYmxlLWZlYXR1cmVzPSR7ZW5hYmxlZEZlYXR1cmVzLmpvaW4oJywnKX1gLFxuICAgICAgICBdLmZpbHRlcihhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFyZyAhPT0gJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB7IGRldnRvb2xzID0gZmFsc2UsIGhlYWRsZXNzID0gIWRldnRvb2xzLCBhcmdzID0gW10sIHVzZXJEYXRhRGlyLCB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKHVzZXJEYXRhRGlyKSB7XG4gICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaChgLS11c2VyLWRhdGEtZGlyPSR7cGF0aC5yZXNvbHZlKHVzZXJEYXRhRGlyKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGV2dG9vbHMpIHtcbiAgICAgICAgICAgIGNocm9tZUFyZ3VtZW50cy5wdXNoKCctLWF1dG8tb3Blbi1kZXZ0b29scy1mb3ItdGFicycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkbGVzcykge1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goaGVhZGxlc3MgPT09ICdzaGVsbCcgPyAnLS1oZWFkbGVzcycgOiAnLS1oZWFkbGVzcz1uZXcnLCAnLS1oaWRlLXNjcm9sbGJhcnMnLCAnLS1tdXRlLWF1ZGlvJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZ3MuZXZlcnkoYXJnID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcmcuc3RhcnRzV2l0aCgnLScpO1xuICAgICAgICB9KSkge1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goJ2Fib3V0OmJsYW5rJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBjaHJvbWVBcmd1bWVudHM7XG4gICAgfVxuICAgIGV4ZWN1dGFibGVQYXRoKGNoYW5uZWwsIGhlYWRsZXNzKSB7XG4gICAgICAgIGlmIChjaGFubmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcHV0ZVN5c3RlbUV4ZWN1dGFibGVQYXRoKHtcbiAgICAgICAgICAgICAgICBicm93c2VyOiBTdXBwb3J0ZWRCcm93c2Vycy5DSFJPTUUsXG4gICAgICAgICAgICAgICAgY2hhbm5lbDogY29udmVydFB1cHBldGVlckNoYW5uZWxUb0Jyb3dzZXJzQ2hhbm5lbChjaGFubmVsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUV4ZWN1dGFibGVQYXRoKGhlYWRsZXNzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbnZlcnRQdXBwZXRlZXJDaGFubmVsVG9Ccm93c2Vyc0NoYW5uZWwoY2hhbm5lbCkge1xuICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICBjYXNlICdjaHJvbWUnOlxuICAgICAgICAgICAgcmV0dXJuIEJyb3dzZXJzQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFO1xuICAgICAgICBjYXNlICdjaHJvbWUtZGV2JzpcbiAgICAgICAgICAgIHJldHVybiBCcm93c2Vyc0Nocm9tZVJlbGVhc2VDaGFubmVsLkRFVjtcbiAgICAgICAgY2FzZSAnY2hyb21lLWJldGEnOlxuICAgICAgICAgICAgcmV0dXJuIEJyb3dzZXJzQ2hyb21lUmVsZWFzZUNoYW5uZWwuQkVUQTtcbiAgICAgICAgY2FzZSAnY2hyb21lLWNhbmFyeSc6XG4gICAgICAgICAgICByZXR1cm4gQnJvd3NlcnNDaHJvbWVSZWxlYXNlQ2hhbm5lbC5DQU5BUlk7XG4gICAgfVxufVxuLyoqXG4gKiBFeHRyYWN0cyBhbGwgZmVhdHVyZXMgZnJvbSB0aGUgZ2l2ZW4gY29tbWFuZC1saW5lIGZsYWdcbiAqIChlLmcuIGAtLWVuYWJsZS1mZWF0dXJlc2AsIGAtLWVuYWJsZS1mZWF0dXJlcz1gKS5cbiAqXG4gKiBFeGFtcGxlIGlucHV0OlxuICogW1wiLS1lbmFibGUtZmVhdHVyZXM9TmV0d29ya1NlcnZpY2UsTmV0d29ya1NlcnZpY2VJblByb2Nlc3NcIiwgXCItLWVuYWJsZS1mZWF0dXJlcz1Gb29cIl1cbiAqXG4gKiBFeGFtcGxlIG91dHB1dDpcbiAqIFtcIk5ldHdvcmtTZXJ2aWNlXCIsIFwiTmV0d29ya1NlcnZpY2VJblByb2Nlc3NcIiwgXCJGb29cIl1cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZlYXR1cmVzKGZsYWcsIG9wdGlvbnMgPSBbXSkge1xuICAgIHJldHVybiBvcHRpb25zXG4gICAgICAgIC5maWx0ZXIocyA9PiB7XG4gICAgICAgIHJldHVybiBzLnN0YXJ0c1dpdGgoZmxhZy5lbmRzV2l0aCgnPScpID8gZmxhZyA6IGAke2ZsYWd9PWApO1xuICAgIH0pXG4gICAgICAgIC5tYXAocyA9PiB7XG4gICAgICAgIHJldHVybiBzLnNwbGl0KG5ldyBSZWdFeHAoYCR7ZmxhZ309XFxcXHMqYCkpWzFdPy50cmltKCk7XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihzID0+IHtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfSk7XG59XG4vKipcbiAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGluLXBsYWNlIGZyb20gdGhlIGdpdmVuIHN0cmluZyBhcnJheVxuICogdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gY29tbWFuZC1saW5lIGZsYWcuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVNYXRjaGluZ0ZsYWdzKGFycmF5LCBmbGFnKSB7XG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtmbGFnfT0uKmApO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICBpZiAocmVnZXgudGVzdChhcnJheVtpXSkpIHtcbiAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaHJvbWVMYXVuY2hlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IHJlbmFtZSwgdW5saW5rLCBta2R0ZW1wIH0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQnJvd3NlciBhcyBTdXBwb3J0ZWRCcm93c2VycywgY3JlYXRlUHJvZmlsZSwgQ2FjaGUsIGRldGVjdEJyb3dzZXJQbGF0Zm9ybSwgQnJvd3NlciwgfSBmcm9tICdAcHVwcGV0ZWVyL2Jyb3dzZXJzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBQcm9kdWN0TGF1bmNoZXIgfSBmcm9tICcuL1Byb2R1Y3RMYXVuY2hlci5qcyc7XG5pbXBvcnQgeyBybSB9IGZyb20gJy4vdXRpbC9mcy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRmlyZWZveExhdW5jaGVyIGV4dGVuZHMgUHJvZHVjdExhdW5jaGVyIHtcbiAgICBjb25zdHJ1Y3RvcihwdXBwZXRlZXIpIHtcbiAgICAgICAgc3VwZXIocHVwcGV0ZWVyLCAnZmlyZWZveCcpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0UHJlZmVyZW5jZXMoZXh0cmFQcmVmc0ZpcmVmb3gsIHByb3RvY29sKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5leHRyYVByZWZzRmlyZWZveCxcbiAgICAgICAgICAgIC4uLihwcm90b2NvbCA9PT0gJ3dlYkRyaXZlckJpRGknXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZW5hYmxlIHRoZSBXZWJEcml2ZXIgQmlEaSBwcm90b2NvbFxuICAgICAgICAgICAgICAgICAgICAncmVtb3RlLmFjdGl2ZS1wcm90b2NvbHMnOiAxLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGNsb3NlIHRoZSB3aW5kb3cgd2hlbiB0aGUgbGFzdCB0YWIgZ2V0cyBjbG9zZWRcbiAgICAgICAgICAgICAgICAgICAgJ2Jyb3dzZXIudGFicy5jbG9zZVdpbmRvd1dpdGhMYXN0VGFiJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgdmFyaW91cyBlcnJvciBtZXNzYWdlIG9uIHRoZSBjb25zb2xlXG4gICAgICAgICAgICAgICAgICAgIC8vIGplc3QtcHVwcGV0ZWVyIGFzc2VydHMgdGhhdCBubyBlcnJvciBtZXNzYWdlIGlzIGVtaXR0ZWQgYnkgdGhlIGNvbnNvbGVcbiAgICAgICAgICAgICAgICAgICAgJ25ldHdvcmsuY29va2llLmNvb2tpZUJlaGF2aW9yJzogMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gVGVtcG9yYXJpbHkgZm9yY2UgZGlzYWJsZSBCRkNhY2hlIGluIHBhcmVudCAoaHR0cHM6Ly9iaXQubHkvYnVnLTE3MzIyNjMpXG4gICAgICAgICAgICAgICAgICAgICdmaXNzaW9uLmJmY2FjaGVJblBhcmVudCc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGVuYWJsZSB0aGUgQ0RQIHByb3RvY29sXG4gICAgICAgICAgICAgICAgICAgICdyZW1vdGUuYWN0aXZlLXByb3RvY29scyc6IDIsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAvLyBGb3JjZSBhbGwgd2ViIGNvbnRlbnQgdG8gdXNlIGEgc2luZ2xlIGNvbnRlbnQgcHJvY2Vzcy4gVE9ETzogcmVtb3ZlXG4gICAgICAgICAgICAvLyB0aGlzIG9uY2UgRmlyZWZveCBzdXBwb3J0cyBtb3VzZSBldmVudCBkaXNwYXRjaCBmcm9tIHRoZSBtYWluIGZyYW1lXG4gICAgICAgICAgICAvLyBjb250ZXh0LiBPbmNlIHRoaXMgaGFwcGVucywgd2ViQ29udGVudElzb2xhdGlvblN0cmF0ZWd5IHNob3VsZCBvbmx5XG4gICAgICAgICAgICAvLyBiZSBzZXQgZm9yIENEUC4gU2VlXG4gICAgICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzczMzkzXG4gICAgICAgICAgICAnZmlzc2lvbi53ZWJDb250ZW50SXNvbGF0aW9uU3RyYXRlZ3knOiAwLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBjb21wdXRlTGF1bmNoQXJndW1lbnRzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGlnbm9yZURlZmF1bHRBcmdzID0gZmFsc2UsIGFyZ3MgPSBbXSwgZXhlY3V0YWJsZVBhdGgsIHBpcGUgPSBmYWxzZSwgZXh0cmFQcmVmc0ZpcmVmb3ggPSB7fSwgZGVidWdnaW5nUG9ydCA9IG51bGwsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBmaXJlZm94QXJndW1lbnRzID0gW107XG4gICAgICAgIGlmICghaWdub3JlRGVmYXVsdEFyZ3MpIHtcbiAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCguLi50aGlzLmRlZmF1bHRBcmdzKG9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlnbm9yZURlZmF1bHRBcmdzKSkge1xuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKC4uLnRoaXMuZGVmYXVsdEFyZ3Mob3B0aW9ucykuZmlsdGVyKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFpZ25vcmVEZWZhdWx0QXJncy5pbmNsdWRlcyhhcmcpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmlyZWZveEFyZ3VtZW50cy5zb21lKGFyZ3VtZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcmd1bWVudC5zdGFydHNXaXRoKCctLXJlbW90ZS1kZWJ1Z2dpbmctJyk7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBpZiAocGlwZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydChkZWJ1Z2dpbmdQb3J0ID09PSBudWxsLCAnQnJvd3NlciBzaG91bGQgYmUgbGF1bmNoZWQgd2l0aCBlaXRoZXIgcGlwZSBvciBkZWJ1Z2dpbmcgcG9ydCAtIG5vdCBib3RoLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke2RlYnVnZ2luZ1BvcnQgfHwgMH1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdXNlckRhdGFEaXI7XG4gICAgICAgIGxldCBpc1RlbXBVc2VyRGF0YURpciA9IHRydWU7XG4gICAgICAgIC8vIENoZWNrIGZvciB0aGUgcHJvZmlsZSBhcmd1bWVudCwgd2hpY2ggd2lsbCBhbHdheXMgYmUgc2V0IGV2ZW5cbiAgICAgICAgLy8gd2l0aCBhIGN1c3RvbSBkaXJlY3Rvcnkgc3BlY2lmaWVkIHZpYSB0aGUgdXNlckRhdGFEaXIgb3B0aW9uLlxuICAgICAgICBjb25zdCBwcm9maWxlQXJnSW5kZXggPSBmaXJlZm94QXJndW1lbnRzLmZpbmRJbmRleChhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFsnLXByb2ZpbGUnLCAnLS1wcm9maWxlJ10uaW5jbHVkZXMoYXJnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwcm9maWxlQXJnSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB1c2VyRGF0YURpciA9IGZpcmVmb3hBcmd1bWVudHNbcHJvZmlsZUFyZ0luZGV4ICsgMV07XG4gICAgICAgICAgICBpZiAoIXVzZXJEYXRhRGlyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXJlZm94IHByb2ZpbGUgbm90IGZvdW5kIGF0ICcke3VzZXJEYXRhRGlyfSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBjdXN0b20gRmlyZWZveCBwcm9maWxlIGl0IG5lZWRzIHRvIGJlIHBvcHVsYXRlZFxuICAgICAgICAgICAgLy8gd2l0aCByZXF1aXJlZCBwcmVmZXJlbmNlcy5cbiAgICAgICAgICAgIGlzVGVtcFVzZXJEYXRhRGlyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1c2VyRGF0YURpciA9IGF3YWl0IG1rZHRlbXAodGhpcy5nZXRQcm9maWxlUGF0aCgpKTtcbiAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCgnLS1wcm9maWxlJyk7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2godXNlckRhdGFEaXIpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNyZWF0ZVByb2ZpbGUoU3VwcG9ydGVkQnJvd3NlcnMuRklSRUZPWCwge1xuICAgICAgICAgICAgcGF0aDogdXNlckRhdGFEaXIsXG4gICAgICAgICAgICBwcmVmZXJlbmNlczogRmlyZWZveExhdW5jaGVyLmdldFByZWZlcmVuY2VzKGV4dHJhUHJlZnNGaXJlZm94LCBvcHRpb25zLnByb3RvY29sKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBmaXJlZm94RXhlY3V0YWJsZTtcbiAgICAgICAgaWYgKHRoaXMucHVwcGV0ZWVyLl9pc1B1cHBldGVlckNvcmUgfHwgZXhlY3V0YWJsZVBhdGgpIHtcbiAgICAgICAgICAgIGFzc2VydChleGVjdXRhYmxlUGF0aCwgYEFuIFxcYGV4ZWN1dGFibGVQYXRoXFxgIG11c3QgYmUgc3BlY2lmaWVkIGZvciBcXGBwdXBwZXRlZXItY29yZVxcYGApO1xuICAgICAgICAgICAgZmlyZWZveEV4ZWN1dGFibGUgPSBleGVjdXRhYmxlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZpcmVmb3hFeGVjdXRhYmxlID0gdGhpcy5leGVjdXRhYmxlUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1RlbXBVc2VyRGF0YURpcixcbiAgICAgICAgICAgIHVzZXJEYXRhRGlyLFxuICAgICAgICAgICAgYXJnczogZmlyZWZveEFyZ3VtZW50cyxcbiAgICAgICAgICAgIGV4ZWN1dGFibGVQYXRoOiBmaXJlZm94RXhlY3V0YWJsZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY2xlYW5Vc2VyRGF0YURpcih1c2VyRGF0YURpciwgb3B0cykge1xuICAgICAgICBpZiAob3B0cy5pc1RlbXApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcm0odXNlckRhdGFEaXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZGVidWdFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gYW4gZXhpc3RpbmcgdXNlciBwcm9maWxlIGhhcyBiZWVuIHVzZWQgcmVtb3ZlIHRoZSB1c2VyXG4gICAgICAgICAgICAgICAgLy8gcHJlZmVyZW5jZXMgZmlsZSBhbmQgcmVzdG9yZSBwb3NzaWJseSBiYWNrdXBlZCBwcmVmZXJlbmNlcy5cbiAgICAgICAgICAgICAgICBhd2FpdCB1bmxpbmsocGF0aC5qb2luKHVzZXJEYXRhRGlyLCAndXNlci5qcycpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVmc0JhY2t1cFBhdGggPSBwYXRoLmpvaW4odXNlckRhdGFEaXIsICdwcmVmcy5qcy5wdXBwZXRlZXInKTtcbiAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwcmVmc0JhY2t1cFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZzUGF0aCA9IHBhdGguam9pbih1c2VyRGF0YURpciwgJ3ByZWZzLmpzJyk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHVubGluayhwcmVmc1BhdGgpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZW5hbWUocHJlZnNCYWNrdXBQYXRoLCBwcmVmc1BhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGV4ZWN1dGFibGVQYXRoKCkge1xuICAgICAgICAvLyByZXBsYWNlICdsYXRlc3QnIHBsYWNlaG9sZGVyIHdpdGggYWN0dWFsIGRvd25sb2FkZWQgcmV2aXNpb25cbiAgICAgICAgaWYgKHRoaXMucHVwcGV0ZWVyLmJyb3dzZXJSZXZpc2lvbiA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IENhY2hlKHRoaXMucHVwcGV0ZWVyLmRlZmF1bHREb3dubG9hZFBhdGgpO1xuICAgICAgICAgICAgY29uc3QgaW5zdGFsbGVkRmlyZWZveCA9IGNhY2hlLmdldEluc3RhbGxlZEJyb3dzZXJzKCkuZmluZChicm93c2VyID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGJyb3dzZXIucGxhdGZvcm0gPT09IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSgpICYmXG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXIuYnJvd3NlciA9PT0gQnJvd3Nlci5GSVJFRk9YKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGluc3RhbGxlZEZpcmVmb3gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbEJyb3dzZXJSZXZpc2lvbiA9IGluc3RhbGxlZEZpcmVmb3guYnVpbGRJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlRXhlY3V0YWJsZVBhdGgoKTtcbiAgICB9XG4gICAgZGVmYXVsdEFyZ3Mob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgZGV2dG9vbHMgPSBmYWxzZSwgaGVhZGxlc3MgPSAhZGV2dG9vbHMsIGFyZ3MgPSBbXSwgdXNlckRhdGFEaXIgPSBudWxsLCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZmlyZWZveEFyZ3VtZW50cyA9IFsnLS1uby1yZW1vdGUnXTtcbiAgICAgICAgc3dpdGNoIChvcy5wbGF0Zm9ybSgpKSB7XG4gICAgICAgICAgICBjYXNlICdkYXJ3aW4nOlxuICAgICAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCgnLS1mb3JlZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3aW4zMic6XG4gICAgICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKCctLXdhaXQtZm9yLWJyb3dzZXInKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlckRhdGFEaXIpIHtcbiAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCgnLS1wcm9maWxlJyk7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2godXNlckRhdGFEaXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkbGVzcykge1xuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKCctLWhlYWRsZXNzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRldnRvb2xzKSB7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2goJy0tZGV2dG9vbHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJncy5ldmVyeShhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFyZy5zdGFydHNXaXRoKCctJyk7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2goJ2Fib3V0OmJsYW5rJyk7XG4gICAgICAgIH1cbiAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICByZXR1cm4gZmlyZWZveEFyZ3VtZW50cztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaXJlZm94TGF1bmNoZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxhdW5jaE9wdGlvbnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBOb2RlV2ViU29ja2V0IGZyb20gJ3dzJztcbmltcG9ydCB7IHBhY2thZ2VWZXJzaW9uIH0gZnJvbSAnLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE5vZGVXZWJTb2NrZXRUcmFuc3BvcnQge1xuICAgIHN0YXRpYyBjcmVhdGUodXJsLCBoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3cyA9IG5ldyBOb2RlV2ViU29ja2V0KHVybCwgW10sIHtcbiAgICAgICAgICAgICAgICBmb2xsb3dSZWRpcmVjdHM6IHRydWUsXG4gICAgICAgICAgICAgICAgcGVyTWVzc2FnZURlZmxhdGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvYmxvYi9tYXN0ZXIvZG9jL3dzLm1kI25ldy13ZWJzb2NrZXRhZGRyZXNzLXByb3RvY29scy1vcHRpb25zXG4gICAgICAgICAgICAgICAgYWxsb3dTeW5jaHJvbm91c0V2ZW50czogZmFsc2UsXG4gICAgICAgICAgICAgICAgbWF4UGF5bG9hZDogMjU2ICogMTAyNCAqIDEwMjQsIC8vIDI1Nk1iXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IGBQdXBwZXRlZXIgJHtwYWNrYWdlVmVyc2lvbn1gLFxuICAgICAgICAgICAgICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobmV3IE5vZGVXZWJTb2NrZXRUcmFuc3BvcnQod3MpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgI3dzO1xuICAgIG9ubWVzc2FnZTtcbiAgICBvbmNsb3NlO1xuICAgIGNvbnN0cnVjdG9yKHdzKSB7XG4gICAgICAgIHRoaXMuI3dzID0gd3M7XG4gICAgICAgIHRoaXMuI3dzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vbm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9ubWVzc2FnZS5jYWxsKG51bGwsIGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jd3MuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vbmNsb3NlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNsb3NlLmNhbGwobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBTaWxlbnRseSBpZ25vcmUgYWxsIGVycm9ycyAtIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoZW0uXG4gICAgICAgIHRoaXMuI3dzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4geyB9KTtcbiAgICB9XG4gICAgc2VuZChtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuI3dzLnNlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLiN3cy5jbG9zZSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vZGVXZWJTb2NrZXRUcmFuc3BvcnQuanMubWFwIiwiaW1wb3J0IHsgRXZlbnRTdWJzY3JpcHRpb24gfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2sgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBpcGVUcmFuc3BvcnQge1xuICAgICNwaXBlV3JpdGU7XG4gICAgI3N1YnNjcmlwdGlvbnMgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgI2lzQ2xvc2VkID0gZmFsc2U7XG4gICAgI3BlbmRpbmdNZXNzYWdlID0gJyc7XG4gICAgb25jbG9zZTtcbiAgICBvbm1lc3NhZ2U7XG4gICAgY29uc3RydWN0b3IocGlwZVdyaXRlLCBwaXBlUmVhZCkge1xuICAgICAgICB0aGlzLiNwaXBlV3JpdGUgPSBwaXBlV3JpdGU7XG4gICAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbnMudXNlKG5ldyBFdmVudFN1YnNjcmlwdGlvbihwaXBlUmVhZCwgJ2RhdGEnLCAoYnVmZmVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZGlzcGF0Y2goYnVmZmVyKTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRTdWJzY3JpcHRpb24ocGlwZVJlYWQsICdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uY2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2xvc2UuY2FsbChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRTdWJzY3JpcHRpb24ocGlwZVJlYWQsICdlcnJvcicsIGRlYnVnRXJyb3IpKTtcbiAgICAgICAgdGhpcy4jc3Vic2NyaXB0aW9ucy51c2UobmV3IEV2ZW50U3Vic2NyaXB0aW9uKHBpcGVXcml0ZSwgJ2Vycm9yJywgZGVidWdFcnJvcikpO1xuICAgIH1cbiAgICBzZW5kKG1lc3NhZ2UpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNpc0Nsb3NlZCwgJ2BQaXBlVHJhbnNwb3J0YCBpcyBjbG9zZWQuJyk7XG4gICAgICAgIHRoaXMuI3BpcGVXcml0ZS53cml0ZShtZXNzYWdlKTtcbiAgICAgICAgdGhpcy4jcGlwZVdyaXRlLndyaXRlKCdcXDAnKTtcbiAgICB9XG4gICAgI2Rpc3BhdGNoKGJ1ZmZlcikge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2lzQ2xvc2VkLCAnYFBpcGVUcmFuc3BvcnRgIGlzIGNsb3NlZC4nKTtcbiAgICAgICAgbGV0IGVuZCA9IGJ1ZmZlci5pbmRleE9mKCdcXDAnKTtcbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuI3BlbmRpbmdNZXNzYWdlICs9IGJ1ZmZlci50b1N0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLiNwZW5kaW5nTWVzc2FnZSArIGJ1ZmZlci50b1N0cmluZyh1bmRlZmluZWQsIDAsIGVuZCk7XG4gICAgICAgIGlmICh0aGlzLm9ubWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2UuY2FsbChudWxsLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnQgPSBlbmQgKyAxO1xuICAgICAgICBlbmQgPSBidWZmZXIuaW5kZXhPZignXFwwJywgc3RhcnQpO1xuICAgICAgICB3aGlsZSAoZW5kICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub25tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2UuY2FsbChudWxsLCBidWZmZXIudG9TdHJpbmcodW5kZWZpbmVkLCBzdGFydCwgZW5kKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7XG4gICAgICAgICAgICBlbmQgPSBidWZmZXIuaW5kZXhPZignXFwwJywgc3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3BlbmRpbmdNZXNzYWdlID0gYnVmZmVyLnRvU3RyaW5nKHVuZGVmaW5lZCwgc3RhcnQpO1xuICAgIH1cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy4jaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLmRpc3Bvc2UoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QaXBlVHJhbnNwb3J0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQnJvd3NlciBhcyBJbnN0YWxsZWRCcm93c2VyLCBDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBsYXVuY2gsIFRpbWVvdXRFcnJvciBhcyBCcm93c2Vyc1RpbWVvdXRFcnJvciwgV0VCRFJJVkVSX0JJRElfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBjb21wdXRlRXhlY3V0YWJsZVBhdGgsIH0gZnJvbSAnQHB1cHBldGVlci9icm93c2Vycyc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgbWFwLCByYWNlLCB0aW1lciwgfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMnO1xuaW1wb3J0IHsgQ2RwQnJvd3NlciB9IGZyb20gJy4uL2NkcC9Ccm93c2VyLmpzJztcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuLi9jZHAvQ29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBUaW1lb3V0RXJyb3IgfSBmcm9tICcuLi9jb21tb24vRXJyb3JzLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIERFRkFVTFRfVklFV1BPUlQgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBOb2RlV2ViU29ja2V0VHJhbnNwb3J0IGFzIFdlYlNvY2tldFRyYW5zcG9ydCB9IGZyb20gJy4vTm9kZVdlYlNvY2tldFRyYW5zcG9ydC5qcyc7XG5pbXBvcnQgeyBQaXBlVHJhbnNwb3J0IH0gZnJvbSAnLi9QaXBlVHJhbnNwb3J0LmpzJztcbi8qKlxuICogRGVzY3JpYmVzIGEgbGF1bmNoZXIgLSBhIGNsYXNzIHRoYXQgaXMgYWJsZSB0byBjcmVhdGUgYW5kIGxhdW5jaCBhIGJyb3dzZXIgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUHJvZHVjdExhdW5jaGVyIHtcbiAgICAjcHJvZHVjdDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdXBwZXRlZXI7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYWN0dWFsQnJvd3NlclJldmlzaW9uO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHB1cHBldGVlciwgcHJvZHVjdCkge1xuICAgICAgICB0aGlzLnB1cHBldGVlciA9IHB1cHBldGVlcjtcbiAgICAgICAgdGhpcy4jcHJvZHVjdCA9IHByb2R1Y3Q7XG4gICAgfVxuICAgIGdldCBwcm9kdWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvZHVjdDtcbiAgICB9XG4gICAgYXN5bmMgbGF1bmNoKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGR1bXBpbyA9IGZhbHNlLCBlbnYgPSBwcm9jZXNzLmVudiwgaGFuZGxlU0lHSU5UID0gdHJ1ZSwgaGFuZGxlU0lHVEVSTSA9IHRydWUsIGhhbmRsZVNJR0hVUCA9IHRydWUsIGlnbm9yZUhUVFBTRXJyb3JzID0gZmFsc2UsIGRlZmF1bHRWaWV3cG9ydCA9IERFRkFVTFRfVklFV1BPUlQsIHNsb3dNbyA9IDAsIHRpbWVvdXQgPSAzMDAwMCwgd2FpdEZvckluaXRpYWxQYWdlID0gdHJ1ZSwgcHJvdG9jb2xUaW1lb3V0LCBwcm90b2NvbCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGxhdW5jaEFyZ3MgPSBhd2FpdCB0aGlzLmNvbXB1dGVMYXVuY2hBcmd1bWVudHMob3B0aW9ucyk7XG4gICAgICAgIGlmICghZXhpc3RzU3luYyhsYXVuY2hBcmdzLmV4ZWN1dGFibGVQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm93c2VyIHdhcyBub3QgZm91bmQgYXQgdGhlIGNvbmZpZ3VyZWQgZXhlY3V0YWJsZVBhdGggKCR7bGF1bmNoQXJncy5leGVjdXRhYmxlUGF0aH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlUGlwZSA9IGxhdW5jaEFyZ3MuYXJncy5pbmNsdWRlcygnLS1yZW1vdGUtZGVidWdnaW5nLXBpcGUnKTtcbiAgICAgICAgY29uc3Qgb25Qcm9jZXNzRXhpdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYW5Vc2VyRGF0YURpcihsYXVuY2hBcmdzLnVzZXJEYXRhRGlyLCB7XG4gICAgICAgICAgICAgICAgaXNUZW1wOiBsYXVuY2hBcmdzLmlzVGVtcFVzZXJEYXRhRGlyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLiNwcm9kdWN0ID09PSAnZmlyZWZveCcgJiZcbiAgICAgICAgICAgIHByb3RvY29sICE9PSAnd2ViRHJpdmVyQmlEaScgJiZcbiAgICAgICAgICAgIHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24ubG9nTGV2ZWwgPT09ICd3YXJuJykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2wgKENEUCkgc3VwcG9ydCBmb3IgRmlyZWZveCBpcyBkZXByZWNhdGVkIGluIFB1cHBldGVlciBgICtcbiAgICAgICAgICAgICAgICBgYW5kIGl0IHdpbGwgYmUgZXZlbnR1YWxseSByZW1vdmVkLiBgICtcbiAgICAgICAgICAgICAgICBgVXNlIFdlYkRyaXZlciBCaURpIGluc3RlYWQgKHNlZSBodHRwczovL3BwdHIuZGV2L3dlYmRyaXZlci1iaWRpI2dldC1zdGFydGVkKS5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBicm93c2VyUHJvY2VzcyA9IGxhdW5jaCh7XG4gICAgICAgICAgICBleGVjdXRhYmxlUGF0aDogbGF1bmNoQXJncy5leGVjdXRhYmxlUGF0aCxcbiAgICAgICAgICAgIGFyZ3M6IGxhdW5jaEFyZ3MuYXJncyxcbiAgICAgICAgICAgIGhhbmRsZVNJR0hVUCxcbiAgICAgICAgICAgIGhhbmRsZVNJR1RFUk0sXG4gICAgICAgICAgICBoYW5kbGVTSUdJTlQsXG4gICAgICAgICAgICBkdW1waW8sXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICBwaXBlOiB1c2VQaXBlLFxuICAgICAgICAgICAgb25FeGl0OiBvblByb2Nlc3NFeGl0LFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGJyb3dzZXI7XG4gICAgICAgIGxldCBjZHBDb25uZWN0aW9uO1xuICAgICAgICBsZXQgY2xvc2luZyA9IGZhbHNlO1xuICAgICAgICBjb25zdCBicm93c2VyQ2xvc2VDYWxsYmFjayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChjbG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xvc2luZyA9IHRydWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlQnJvd3Nlcihicm93c2VyUHJvY2VzcywgY2RwQ29ubmVjdGlvbik7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jcHJvZHVjdCA9PT0gJ2ZpcmVmb3gnICYmIHByb3RvY29sID09PSAnd2ViRHJpdmVyQmlEaScpIHtcbiAgICAgICAgICAgICAgICBicm93c2VyID0gYXdhaXQgdGhpcy5jcmVhdGVCaURpQnJvd3Nlcihicm93c2VyUHJvY2VzcywgYnJvd3NlckNsb3NlQ2FsbGJhY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xUaW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICBzbG93TW8sXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodXNlUGlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjZHBDb25uZWN0aW9uID0gYXdhaXQgdGhpcy5jcmVhdGVDZHBQaXBlQ29ubmVjdGlvbihicm93c2VyUHJvY2Vzcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sVGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3dNbyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjZHBDb25uZWN0aW9uID0gYXdhaXQgdGhpcy5jcmVhdGVDZHBTb2NrZXRDb25uZWN0aW9uKGJyb3dzZXJQcm9jZXNzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xUaW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2xvd01vLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb3RvY29sID09PSAnd2ViRHJpdmVyQmlEaScpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlciA9IGF3YWl0IHRoaXMuY3JlYXRlQmlEaU92ZXJDZHBCcm93c2VyKGJyb3dzZXJQcm9jZXNzLCBjZHBDb25uZWN0aW9uLCBicm93c2VyQ2xvc2VDYWxsYmFjaywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlciA9IGF3YWl0IENkcEJyb3dzZXIuX2NyZWF0ZSh0aGlzLnByb2R1Y3QsIGNkcENvbm5lY3Rpb24sIFtdLCBpZ25vcmVIVFRQU0Vycm9ycywgZGVmYXVsdFZpZXdwb3J0LCBicm93c2VyUHJvY2Vzcy5ub2RlUHJvY2VzcywgYnJvd3NlckNsb3NlQ2FsbGJhY2ssIG9wdGlvbnMudGFyZ2V0RmlsdGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB2b2lkIGJyb3dzZXJDbG9zZUNhbGxiYWNrKCk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCcm93c2Vyc1RpbWVvdXRFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2FpdEZvckluaXRpYWxQYWdlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JQYWdlVGFyZ2V0KGJyb3dzZXIsIHRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBicm93c2VyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgb25seSBmb3IgRmlyZWZveCwgYWZ0ZXIgdGhlIGxhdW5jaGVyIHJlc29sdmVzIHRoZSBgbGF0ZXN0YCByZXZpc2lvbiB0b1xuICAgICAqIHRoZSBhY3R1YWwgcmV2aXNpb24uXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0QWN0dWFsQnJvd3NlclJldmlzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3R1YWxCcm93c2VyUmV2aXNpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIGNsb3NlQnJvd3Nlcihicm93c2VyUHJvY2VzcywgY2RwQ29ubmVjdGlvbikge1xuICAgICAgICBpZiAoY2RwQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBjbG9zZSB0aGUgYnJvd3NlciBncmFjZWZ1bGx5XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNkcENvbm5lY3Rpb24uY2xvc2VCcm93c2VyKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYnJvd3NlclByb2Nlc3MuaGFzQ2xvc2VkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBicm93c2VyUHJvY2Vzcy5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV2FpdCBmb3IgYSBwb3NzaWJsZSBncmFjZWZ1bCBzaHV0ZG93bi5cbiAgICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHJhY2UoZnJvbShicm93c2VyUHJvY2Vzcy5oYXNDbG9zZWQoKSksIHRpbWVyKDUwMDApLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShicm93c2VyUHJvY2Vzcy5jbG9zZSgpKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JQYWdlVGFyZ2V0KGJyb3dzZXIsIHRpbWVvdXQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGJyb3dzZXIud2FpdEZvclRhcmdldCh0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC50eXBlKCkgPT09ICdwYWdlJztcbiAgICAgICAgICAgIH0sIHsgdGltZW91dCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUNkcFNvY2tldENvbm5lY3Rpb24oYnJvd3NlclByb2Nlc3MsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgYnJvd3NlcldTRW5kcG9pbnQgPSBhd2FpdCBicm93c2VyUHJvY2Vzcy53YWl0Rm9yTGluZU91dHB1dChDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBvcHRzLnRpbWVvdXQpO1xuICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSBhd2FpdCBXZWJTb2NrZXRUcmFuc3BvcnQuY3JlYXRlKGJyb3dzZXJXU0VuZHBvaW50KTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uKGJyb3dzZXJXU0VuZHBvaW50LCB0cmFuc3BvcnQsIG9wdHMuc2xvd01vLCBvcHRzLnByb3RvY29sVGltZW91dCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUNkcFBpcGVDb25uZWN0aW9uKGJyb3dzZXJQcm9jZXNzLCBvcHRzKSB7XG4gICAgICAgIC8vIHN0ZGlvIHdhcyBhc3NpZ25lZCBkdXJpbmcgc3RhcnQoKSwgYW5kIHRoZSAncGlwZScgb3B0aW9uIHRoZXJlIGFkZHMgdGhlXG4gICAgICAgIC8vIDR0aCBhbmQgNXRoIGl0ZW1zIHRvIHN0ZGlvIGFycmF5XG4gICAgICAgIGNvbnN0IHsgMzogcGlwZVdyaXRlLCA0OiBwaXBlUmVhZCB9ID0gYnJvd3NlclByb2Nlc3Mubm9kZVByb2Nlc3Muc3RkaW87XG4gICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBQaXBlVHJhbnNwb3J0KHBpcGVXcml0ZSwgcGlwZVJlYWQpO1xuICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oJycsIHRyYW5zcG9ydCwgb3B0cy5zbG93TW8sIG9wdHMucHJvdG9jb2xUaW1lb3V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQmlEaU92ZXJDZHBCcm93c2VyKGJyb3dzZXJQcm9jZXNzLCBjb25uZWN0aW9uLCBjbG9zZUNhbGxiYWNrLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IEJpRGkgPSBhd2FpdCBpbXBvcnQoLyogOiB0cnVlICovICcuLi9iaWRpL2JpZGkuanMnKTtcbiAgICAgICAgY29uc3QgYmlkaUNvbm5lY3Rpb24gPSBhd2FpdCBCaURpLmNvbm5lY3RCaWRpT3ZlckNkcChjb25uZWN0aW9uLCB7XG4gICAgICAgICAgICBhY2NlcHRJbnNlY3VyZUNlcnRzOiBvcHRzLmlnbm9yZUhUVFBTRXJyb3JzID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IEJpRGkuQmlkaUJyb3dzZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb246IGJpZGlDb25uZWN0aW9uLFxuICAgICAgICAgICAgY2xvc2VDYWxsYmFjayxcbiAgICAgICAgICAgIHByb2Nlc3M6IGJyb3dzZXJQcm9jZXNzLm5vZGVQcm9jZXNzLFxuICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0OiBvcHRzLmRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiBvcHRzLmlnbm9yZUhUVFBTRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQmlEaUJyb3dzZXIoYnJvd3NlclByb2Nlc3MsIGNsb3NlQ2FsbGJhY2ssIG9wdHMpIHtcbiAgICAgICAgY29uc3QgYnJvd3NlcldTRW5kcG9pbnQgPSAoYXdhaXQgYnJvd3NlclByb2Nlc3Mud2FpdEZvckxpbmVPdXRwdXQoV0VCRFJJVkVSX0JJRElfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBvcHRzLnRpbWVvdXQpKSArICcvc2Vzc2lvbic7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IGF3YWl0IFdlYlNvY2tldFRyYW5zcG9ydC5jcmVhdGUoYnJvd3NlcldTRW5kcG9pbnQpO1xuICAgICAgICBjb25zdCBCaURpID0gYXdhaXQgaW1wb3J0KC8qIDogdHJ1ZSAqLyAnLi4vYmlkaS9iaWRpLmpzJyk7XG4gICAgICAgIGNvbnN0IGJpZGlDb25uZWN0aW9uID0gbmV3IEJpRGkuQmlkaUNvbm5lY3Rpb24oYnJvd3NlcldTRW5kcG9pbnQsIHRyYW5zcG9ydCwgb3B0cy5zbG93TW8sIG9wdHMucHJvdG9jb2xUaW1lb3V0KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IEJpRGkuQmlkaUJyb3dzZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb246IGJpZGlDb25uZWN0aW9uLFxuICAgICAgICAgICAgY2xvc2VDYWxsYmFjayxcbiAgICAgICAgICAgIHByb2Nlc3M6IGJyb3dzZXJQcm9jZXNzLm5vZGVQcm9jZXNzLFxuICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0OiBvcHRzLmRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiBvcHRzLmlnbm9yZUhUVFBTRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0UHJvZmlsZVBhdGgoKSB7XG4gICAgICAgIHJldHVybiBqb2luKHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24udGVtcG9yYXJ5RGlyZWN0b3J5ID8/IHRtcGRpcigpLCBgcHVwcGV0ZWVyX2Rldl8ke3RoaXMucHJvZHVjdH1fcHJvZmlsZS1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcmVzb2x2ZUV4ZWN1dGFibGVQYXRoKGhlYWRsZXNzKSB7XG4gICAgICAgIGxldCBleGVjdXRhYmxlUGF0aCA9IHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24uZXhlY3V0YWJsZVBhdGg7XG4gICAgICAgIGlmIChleGVjdXRhYmxlUGF0aCkge1xuICAgICAgICAgICAgaWYgKCFleGlzdHNTeW5jKGV4ZWN1dGFibGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gZmluZCB0aGUgYnJvd3NlciBhdCB0aGUgY29uZmlndXJlZCBwYXRoICgke2V4ZWN1dGFibGVQYXRofSksIGJ1dCBubyBleGVjdXRhYmxlIHdhcyBmb3VuZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBleGVjdXRhYmxlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBwcm9kdWN0VG9Ccm93c2VyKHByb2R1Y3QsIGhlYWRsZXNzKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHByb2R1Y3QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjaHJvbWUnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGxlc3MgPT09ICdzaGVsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnN0YWxsZWRCcm93c2VyLkNIUk9NRUhFQURMRVNTU0hFTEw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEluc3RhbGxlZEJyb3dzZXIuQ0hST01FO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2ZpcmVmb3gnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW5zdGFsbGVkQnJvd3Nlci5GSVJFRk9YO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEluc3RhbGxlZEJyb3dzZXIuQ0hST01FO1xuICAgICAgICB9XG4gICAgICAgIGV4ZWN1dGFibGVQYXRoID0gY29tcHV0ZUV4ZWN1dGFibGVQYXRoKHtcbiAgICAgICAgICAgIGNhY2hlRGlyOiB0aGlzLnB1cHBldGVlci5kZWZhdWx0RG93bmxvYWRQYXRoLFxuICAgICAgICAgICAgYnJvd3NlcjogcHJvZHVjdFRvQnJvd3Nlcih0aGlzLnByb2R1Y3QsIGhlYWRsZXNzKSxcbiAgICAgICAgICAgIGJ1aWxkSWQ6IHRoaXMucHVwcGV0ZWVyLmJyb3dzZXJSZXZpc2lvbixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZXhpc3RzU3luYyhleGVjdXRhYmxlUGF0aCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnB1cHBldGVlci5jb25maWd1cmF0aW9uLmJyb3dzZXJSZXZpc2lvbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gZmluZCB0aGUgYnJvd3NlciBhdCB0aGUgY29uZmlndXJlZCBwYXRoICgke2V4ZWN1dGFibGVQYXRofSkgZm9yIHJldmlzaW9uICR7dGhpcy5wdXBwZXRlZXIuYnJvd3NlclJldmlzaW9ufSwgYnV0IG5vIGV4ZWN1dGFibGUgd2FzIGZvdW5kLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnByb2R1Y3QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjaHJvbWUnOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIENocm9tZSAodmVyLiAke3RoaXMucHVwcGV0ZWVyLmJyb3dzZXJSZXZpc2lvbn0pLiBUaGlzIGNhbiBvY2N1ciBpZiBlaXRoZXJcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgMS4geW91IGRpZCBub3QgcGVyZm9ybSBhbiBpbnN0YWxsYXRpb24gYmVmb3JlIHJ1bm5pbmcgdGhlIHNjcmlwdCAoZS5nLiBgbnB4IHB1cHBldGVlciBicm93c2VycyBpbnN0YWxsIGNocm9tZWApIG9yXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBgIDIuIHlvdXIgY2FjaGUgcGF0aCBpcyBpbmNvcnJlY3RseSBjb25maWd1cmVkICh3aGljaCBpczogJHt0aGlzLnB1cHBldGVlci5jb25maWd1cmF0aW9uLmNhY2hlRGlyZWN0b3J5fSkuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnRm9yICgyKSwgY2hlY2sgb3V0IG91ciBndWlkZSBvbiBjb25maWd1cmluZyBwdXBwZXRlZXIgYXQgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvY29uZmlndXJhdGlvbi4nKTtcbiAgICAgICAgICAgICAgICBjYXNlICdmaXJlZm94JzpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBGaXJlZm94IChyZXYuICR7dGhpcy5wdXBwZXRlZXIuYnJvd3NlclJldmlzaW9ufSkuIFRoaXMgY2FuIG9jY3VyIGlmIGVpdGhlclxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAxLiB5b3UgZGlkIG5vdCBwZXJmb3JtIGFuIGluc3RhbGxhdGlvbiBmb3IgRmlyZWZveCBiZWZvcmUgcnVubmluZyB0aGUgc2NyaXB0IChlLmcuIGBucHggcHVwcGV0ZWVyIGJyb3dzZXJzIGluc3RhbGwgZmlyZWZveGApIG9yXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBgIDIuIHlvdXIgY2FjaGUgcGF0aCBpcyBpbmNvcnJlY3RseSBjb25maWd1cmVkICh3aGljaCBpczogJHt0aGlzLnB1cHBldGVlci5jb25maWd1cmF0aW9uLmNhY2hlRGlyZWN0b3J5fSkuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnRm9yICgyKSwgY2hlY2sgb3V0IG91ciBndWlkZSBvbiBjb25maWd1cmluZyBwdXBwZXRlZXIgYXQgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvY29uZmlndXJhdGlvbi4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhlY3V0YWJsZVBhdGg7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvZHVjdExhdW5jaGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBCcm93c2VyIGFzIFN1cHBvcnRlZEJyb3dzZXIsIHJlc29sdmVCdWlsZElkLCBkZXRlY3RCcm93c2VyUGxhdGZvcm0sIGdldEluc3RhbGxlZEJyb3dzZXJzLCB1bmluc3RhbGwsIH0gZnJvbSAnQHB1cHBldGVlci9icm93c2Vycyc7XG5pbXBvcnQgeyBQdXBwZXRlZXIgfSBmcm9tICcuLi9jb21tb24vUHVwcGV0ZWVyLmpzJztcbmltcG9ydCB7IFBVUFBFVEVFUl9SRVZJU0lPTlMgfSBmcm9tICcuLi9yZXZpc2lvbnMuanMnO1xuaW1wb3J0IHsgQ2hyb21lTGF1bmNoZXIgfSBmcm9tICcuL0Nocm9tZUxhdW5jaGVyLmpzJztcbmltcG9ydCB7IEZpcmVmb3hMYXVuY2hlciB9IGZyb20gJy4vRmlyZWZveExhdW5jaGVyLmpzJztcbi8qKlxuICogRXh0ZW5kcyB0aGUgbWFpbiB7QGxpbmsgUHVwcGV0ZWVyfSBjbGFzcyB3aXRoIE5vZGUgc3BlY2lmaWMgYmVoYXZpb3VyIGZvclxuICogZmV0Y2hpbmcgYW5kIGRvd25sb2FkaW5nIGJyb3dzZXJzLlxuICpcbiAqIElmIHlvdSdyZSB1c2luZyBQdXBwZXRlZXIgaW4gYSBOb2RlIGVudmlyb25tZW50LCB0aGlzIGlzIHRoZSBjbGFzcyB5b3UnbGwgZ2V0XG4gKiB3aGVuIHlvdSBydW4gYHJlcXVpcmUoJ3B1cHBldGVlcicpYCAob3IgdGhlIGVxdWl2YWxlbnQgRVMgYGltcG9ydGApLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgbW9zdCBjb21tb24gbWV0aG9kIHRvIHVzZSBpcyB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXVuY2ggfCBsYXVuY2h9LCB3aGljaFxuICogaXMgdXNlZCB0byBsYXVuY2ggYW5kIGNvbm5lY3QgdG8gYSBuZXcgYnJvd3NlciBpbnN0YW5jZS5cbiAqXG4gKiBTZWUge0BsaW5rIFB1cHBldGVlciB8IHRoZSBtYWluIFB1cHBldGVlciBjbGFzc30gZm9yIG1ldGhvZHMgY29tbW9uIHRvIGFsbFxuICogZW52aXJvbm1lbnRzLCBzdWNoIGFzIHtAbGluayBQdXBwZXRlZXIuY29ubmVjdH0uXG4gKlxuICogQGV4YW1wbGVcbiAqIFRoZSBmb2xsb3dpbmcgaXMgYSB0eXBpY2FsIGV4YW1wbGUgb2YgdXNpbmcgUHVwcGV0ZWVyIHRvIGRyaXZlIGF1dG9tYXRpb246XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAqXG4gKiAoYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiAgIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbScpO1xuICogICAvLyBvdGhlciBhY3Rpb25zLi4uXG4gKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqIH0pKCk7XG4gKiBgYGBcbiAqXG4gKiBPbmNlIHlvdSBoYXZlIGNyZWF0ZWQgYSBgcGFnZWAgeW91IGhhdmUgYWNjZXNzIHRvIGEgbGFyZ2UgQVBJIHRvIGludGVyYWN0XG4gKiB3aXRoIHRoZSBwYWdlLCBuYXZpZ2F0ZSwgb3IgZmluZCBjZXJ0YWluIGVsZW1lbnRzIGluIHRoYXQgcGFnZS5cbiAqIFRoZSB7QGxpbmsgUGFnZSB8IGBwYWdlYCBkb2N1bWVudGF0aW9ufSBsaXN0cyBhbGwgdGhlIGF2YWlsYWJsZSBtZXRob2RzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFB1cHBldGVlck5vZGUgZXh0ZW5kcyBQdXBwZXRlZXIge1xuICAgICNfbGF1bmNoZXI7XG4gICAgI2xhc3RMYXVuY2hlZFByb2R1Y3Q7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZGVmYXVsdEJyb3dzZXJSZXZpc2lvbjtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25maWd1cmF0aW9uID0ge307XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3QgeyBjb25maWd1cmF0aW9uLCAuLi5jb21tb25TZXR0aW5ncyB9ID0gc2V0dGluZ3M7XG4gICAgICAgIHN1cGVyKGNvbW1vblNldHRpbmdzKTtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFByb2R1Y3QpIHtcbiAgICAgICAgICAgIGNhc2UgJ2ZpcmVmb3gnOlxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJyb3dzZXJSZXZpc2lvbiA9IFBVUFBFVEVFUl9SRVZJU0lPTlMuZmlyZWZveDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRQcm9kdWN0ID0gJ2Nocm9tZSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QnJvd3NlclJldmlzaW9uID0gUFVQUEVURUVSX1JFVklTSU9OUy5jaHJvbWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25uZWN0ID0gdGhpcy5jb25uZWN0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubGF1bmNoID0gdGhpcy5sYXVuY2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5leGVjdXRhYmxlUGF0aCA9IHRoaXMuZXhlY3V0YWJsZVBhdGguYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0QXJncyA9IHRoaXMuZGVmYXVsdEFyZ3MuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy50cmltQ2FjaGUgPSB0aGlzLnRyaW1DYWNoZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBhdHRhY2hlcyBQdXBwZXRlZXIgdG8gYW4gZXhpc3RpbmcgYnJvd3NlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gU2V0IG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zIHRvIHNldCBvbiB0aGUgYnJvd3Nlci5cbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGJyb3dzZXIgaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29ubmVjdChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5jb25uZWN0KG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMYXVuY2hlcyBhIGJyb3dzZXIgaW5zdGFuY2Ugd2l0aCBnaXZlbiBhcmd1bWVudHMgYW5kIG9wdGlvbnMgd2hlblxuICAgICAqIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIFdoZW4gdXNpbmcgd2l0aCBgcHVwcGV0ZWVyLWNvcmVgLFxuICAgICAqIHtAbGluayBMYXVuY2hPcHRpb25zLmV4ZWN1dGFibGVQYXRoIHwgb3B0aW9ucy5leGVjdXRhYmxlUGF0aH0gb3JcbiAgICAgKiB7QGxpbmsgTGF1bmNoT3B0aW9ucy5jaGFubmVsIHwgb3B0aW9ucy5jaGFubmVsfSBtdXN0IGJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBZb3UgY2FuIHVzZSB7QGxpbmsgTGF1bmNoT3B0aW9ucy5pZ25vcmVEZWZhdWx0QXJncyB8IG9wdGlvbnMuaWdub3JlRGVmYXVsdEFyZ3N9XG4gICAgICogdG8gZmlsdGVyIG91dCBgLS1tdXRlLWF1ZGlvYCBmcm9tIGRlZmF1bHQgYXJndW1lbnRzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCh7XG4gICAgICogICBpZ25vcmVEZWZhdWx0QXJnczogWyctLW11dGUtYXVkaW8nXSxcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUHVwcGV0ZWVyIGNhbiBhbHNvIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgQ2hyb21lIGJyb3dzZXIsIGJ1dCBpdCB3b3JrcyBiZXN0XG4gICAgICogd2l0aCB0aGUgdmVyc2lvbiBvZiBDaHJvbWUgZm9yIFRlc3RpbmcgZG93bmxvYWRlZCBieSBkZWZhdWx0LlxuICAgICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSBpdCB3aWxsIHdvcmsgd2l0aCBhbnkgb3RoZXIgdmVyc2lvbi4gSWYgR29vZ2xlIENocm9tZVxuICAgICAqIChyYXRoZXIgdGhhbiBDaHJvbWUgZm9yIFRlc3RpbmcpIGlzIHByZWZlcnJlZCwgYVxuICAgICAqIHtAbGluayBodHRwczovL3d3dy5nb29nbGUuY29tL2Nocm9tZS9icm93c2VyL2NhbmFyeS5odG1sIHwgQ2hyb21lIENhbmFyeX1cbiAgICAgKiBvclxuICAgICAqIHtAbGluayBodHRwczovL3d3dy5jaHJvbWl1bS5vcmcvZ2V0dGluZy1pbnZvbHZlZC9kZXYtY2hhbm5lbCB8IERldiBDaGFubmVsfVxuICAgICAqIGJ1aWxkIGlzIHN1Z2dlc3RlZC4gU2VlXG4gICAgICoge0BsaW5rIGh0dHBzOi8vd3d3Lmhvd3RvZ2Vlay5jb20vMjAyODI1L3doYXQlRTIlODAlOTlzLXRoZS1kaWZmZXJlbmNlLWJldHdlZW4tY2hyb21pdW0tYW5kLWNocm9tZS8gfCB0aGlzIGFydGljbGV9XG4gICAgICogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gQ2hyb21pdW0gYW5kIENocm9tZS5cbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYy8rL2xrZ3IvZG9jcy9jaHJvbWl1bV9icm93c2VyX3ZzX2dvb2dsZV9jaHJvbWUubWQgfCBUaGlzIGFydGljbGV9XG4gICAgICogZGVzY3JpYmVzIHNvbWUgZGlmZmVyZW5jZXMgZm9yIExpbnV4IHVzZXJzLiBTZWVcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9ibG9nL2Nocm9tZS1mb3ItdGVzdGluZy8gfCB0aGlzIGRvY30gZm9yIHRoZSBkZXNjcmlwdGlvblxuICAgICAqIG9mIENocm9tZSBmb3IgVGVzdGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgbGF1bmNoaW5nIGJlaGF2aW9yLlxuICAgICAqL1xuICAgIGxhdW5jaChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBwcm9kdWN0ID0gdGhpcy5kZWZhdWx0UHJvZHVjdCB9ID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy4jbGFzdExhdW5jaGVkUHJvZHVjdCA9IHByb2R1Y3Q7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYXVuY2hlci5sYXVuY2gob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCAjbGF1bmNoZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLiNfbGF1bmNoZXIgJiZcbiAgICAgICAgICAgIHRoaXMuI19sYXVuY2hlci5wcm9kdWN0ID09PSB0aGlzLmxhc3RMYXVuY2hlZFByb2R1Y3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNfbGF1bmNoZXI7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0aGlzLmxhc3RMYXVuY2hlZFByb2R1Y3QpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Nocm9tZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QnJvd3NlclJldmlzaW9uID0gUFVQUEVURUVSX1JFVklTSU9OUy5jaHJvbWU7XG4gICAgICAgICAgICAgICAgdGhpcy4jX2xhdW5jaGVyID0gbmV3IENocm9tZUxhdW5jaGVyKHRoaXMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZmlyZWZveCc6XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QnJvd3NlclJldmlzaW9uID0gUFVQUEVURUVSX1JFVklTSU9OUy5maXJlZm94O1xuICAgICAgICAgICAgICAgIHRoaXMuI19sYXVuY2hlciA9IG5ldyBGaXJlZm94TGF1bmNoZXIodGhpcyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcm9kdWN0OiAke3RoaXMuI2xhc3RMYXVuY2hlZFByb2R1Y3R9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI19sYXVuY2hlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgZXhlY3V0YWJsZSBwYXRoLlxuICAgICAqL1xuICAgIGV4ZWN1dGFibGVQYXRoKGNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xhdW5jaGVyLmV4ZWN1dGFibGVQYXRoKGNoYW5uZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgYnJvd3NlclJldmlzaW9uKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI19sYXVuY2hlcj8uZ2V0QWN0dWFsQnJvd3NlclJldmlzaW9uKCkgPz9cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5icm93c2VyUmV2aXNpb24gPz9cbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJyb3dzZXJSZXZpc2lvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGRvd25sb2FkIHBhdGggZm9yIHB1cHBldGVlci4gRm9yIHB1cHBldGVlci1jb3JlLCB0aGlzXG4gICAgICogY29kZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGFzIGl0IGlzIG5ldmVyIGRlZmluZWQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdERvd25sb2FkUGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5jYWNoZURpcmVjdG9yeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJyb3dzZXIgdGhhdCB3YXMgbGFzdCBsYXVuY2hlZC5cbiAgICAgKi9cbiAgICBnZXQgbGFzdExhdW5jaGVkUHJvZHVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xhc3RMYXVuY2hlZFByb2R1Y3QgPz8gdGhpcy5kZWZhdWx0UHJvZHVjdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJyb3dzZXIgdGhhdCB3aWxsIGJlIGxhdW5jaGVkIGJ5IGRlZmF1bHQuIEZvclxuICAgICAqIGBwdXBwZXRlZXJgLCB0aGlzIGlzIGluZmx1ZW5jZWQgYnkgeW91ciBjb25maWd1cmF0aW9uLiBPdGhlcndpc2UsIGl0J3NcbiAgICAgKiBgY2hyb21lYC5cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByb2R1Y3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFByb2R1Y3QgPz8gJ2Nocm9tZSc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgYXMgdGhpcyBmaWVsZCBhcyBpdCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudFxuICAgICAqIG11bHRpcGxlIGJyb3dzZXJzIG9mIGRpZmZlcmVudCB0eXBlcy4gVXNlXG4gICAgICoge0BsaW5rIFB1cHBldGVlck5vZGUuZGVmYXVsdFByb2R1Y3QgfCBkZWZhdWx0UHJvZHVjdH0gb3JcbiAgICAgKiB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXN0TGF1bmNoZWRQcm9kdWN0IHwgbGFzdExhdW5jaGVkUHJvZHVjdH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgYnJvd3NlciB0aGF0IGlzIHVuZGVyIGF1dG9tYXRpb24uXG4gICAgICovXG4gICAgZ2V0IHByb2R1Y3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYXVuY2hlci5wcm9kdWN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFNldCBvZiBjb25maWd1cmFibGUgb3B0aW9ucyB0byBzZXQgb24gdGhlIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBmbGFncyB0aGF0IENocm9taXVtIHdpbGwgYmUgbGF1bmNoZWQgd2l0aC5cbiAgICAgKi9cbiAgICBkZWZhdWx0QXJncyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xhdW5jaGVyLmRlZmF1bHRBcmdzKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBub24tY3VycmVudCBGaXJlZm94IGFuZCBDaHJvbWUgYmluYXJpZXMgaW4gdGhlIGNhY2hlIGRpcmVjdG9yeVxuICAgICAqIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIFB1cHBldGVlciBjb25maWd1cmF0aW9uLiBUaGUgY3VycmVudCBicm93c2VyXG4gICAgICogdmVyc2lvbiBpcyBkZXRlcm1pbmVkIGJ5IHJlc29sdmluZyBQVVBQRVRFRVJfUkVWSVNJT05TIGZyb20gUHVwcGV0ZWVyXG4gICAgICogdW5sZXNzIGBjb25maWd1cmF0aW9uLmJyb3dzZXJSZXZpc2lvbmAgaXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoZSBtZXRob2QgZG9lcyBub3QgY2hlY2sgaWYgYW55IG90aGVyIFB1cHBldGVlciB2ZXJzaW9uc1xuICAgICAqIGluc3RhbGxlZCBvbiB0aGUgaG9zdCB0aGF0IHVzZSB0aGUgc2FtZSBjYWNoZSBkaXJlY3RvcnkgcmVxdWlyZSB0aGVcbiAgICAgKiBub24tY3VycmVudCBiaW5hcmllcy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBhc3luYyB0cmltQ2FjaGUoKSB7XG4gICAgICAgIGNvbnN0IHBsYXRmb3JtID0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgICAgIGlmICghcGxhdGZvcm0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYWNoZURpciA9IHRoaXMuY29uZmlndXJhdGlvbi5jYWNoZURpcmVjdG9yeTtcbiAgICAgICAgY29uc3QgaW5zdGFsbGVkQnJvd3NlcnMgPSBhd2FpdCBnZXRJbnN0YWxsZWRCcm93c2Vycyh7XG4gICAgICAgICAgICBjYWNoZURpcixcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb2R1Y3QgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFByb2R1Y3Q7XG4gICAgICAgIGNvbnN0IHB1cHBldGVlckJyb3dzZXJzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByb2R1Y3Q6ICdjaHJvbWUnLFxuICAgICAgICAgICAgICAgIGJyb3dzZXI6IFN1cHBvcnRlZEJyb3dzZXIuQ0hST01FLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRCdWlsZElkOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdDogJ2ZpcmVmb3gnLFxuICAgICAgICAgICAgICAgIGJyb3dzZXI6IFN1cHBvcnRlZEJyb3dzZXIuRklSRUZPWCxcbiAgICAgICAgICAgICAgICBjdXJyZW50QnVpbGRJZDogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICAvLyBSZXNvbHZlIGN1cnJlbnQgYnVpbGRJZHMuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwdXBwZXRlZXJCcm93c2Vycykge1xuICAgICAgICAgICAgaXRlbS5jdXJyZW50QnVpbGRJZCA9IGF3YWl0IHJlc29sdmVCdWlsZElkKGl0ZW0uYnJvd3NlciwgcGxhdGZvcm0sIChwcm9kdWN0ID09PSBpdGVtLnByb2R1Y3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuY29uZmlndXJhdGlvbi5icm93c2VyUmV2aXNpb25cbiAgICAgICAgICAgICAgICA6IG51bGwpIHx8IFBVUFBFVEVFUl9SRVZJU0lPTlNbaXRlbS5wcm9kdWN0XSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudEJyb3dzZXJCdWlsZHMgPSBuZXcgU2V0KHB1cHBldGVlckJyb3dzZXJzLm1hcChicm93c2VyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgJHticm93c2VyLmJyb3dzZXJ9XyR7YnJvd3Nlci5jdXJyZW50QnVpbGRJZH1gO1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCcm93c2VycyA9IG5ldyBTZXQocHVwcGV0ZWVyQnJvd3NlcnMubWFwKGJyb3dzZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIuYnJvd3NlcjtcbiAgICAgICAgfSkpO1xuICAgICAgICBmb3IgKGNvbnN0IGluc3RhbGxlZEJyb3dzZXIgb2YgaW5zdGFsbGVkQnJvd3NlcnMpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHVuaW5zdGFsbCBicm93c2VycyB0aGF0IGFyZSBub3QgbWFuYWdlZCBieSBQdXBwZXRlZXIgeWV0LlxuICAgICAgICAgICAgaWYgKCFjdXJyZW50QnJvd3NlcnMuaGFzKGluc3RhbGxlZEJyb3dzZXIuYnJvd3NlcikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIGJyb3dzZXIgYnVpbGQgdXNlZCBieSB0aGUgY3VycmVudCBQdXBwZXRlZXIgaW5zdGFsbGF0aW9uLlxuICAgICAgICAgICAgaWYgKGN1cnJlbnRCcm93c2VyQnVpbGRzLmhhcyhgJHtpbnN0YWxsZWRCcm93c2VyLmJyb3dzZXJ9XyR7aW5zdGFsbGVkQnJvd3Nlci5idWlsZElkfWApKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB1bmluc3RhbGwoe1xuICAgICAgICAgICAgICAgIGJyb3dzZXI6IGluc3RhbGxlZEJyb3dzZXIuYnJvd3NlcixcbiAgICAgICAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICAgICAgICBjYWNoZURpcixcbiAgICAgICAgICAgICAgICBidWlsZElkOiBpbnN0YWxsZWRCcm93c2VyLmJ1aWxkSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVB1cHBldGVlck5vZGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX3J1bkluaXRpYWxpemVycyA9ICh0aGlzICYmIHRoaXMuX19ydW5Jbml0aWFsaXplcnMpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG52YXIgX19lc0RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2VzRGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICAgIGRvbmUgPSB0cnVlO1xufTtcbnZhciBfX3NldEZ1bmN0aW9uTmFtZSA9ICh0aGlzICYmIHRoaXMuX19zZXRGdW5jdGlvbk5hbWUpIHx8IGZ1bmN0aW9uIChmLCBuYW1lLCBwcmVmaXgpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuaW1wb3J0IHsgc3Bhd24sIHNwYXduU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgUGFzc1Rocm91Z2ggfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IGJ1ZmZlckNvdW50LCBjb25jYXRNYXAsIGZpbHRlciwgZnJvbSwgZnJvbUV2ZW50LCBsYXN0VmFsdWVGcm9tLCBtYXAsIHRha2VVbnRpbCwgdGFwLCB9IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyc7XG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yLCBmcm9tRW1pdHRlckV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgZ3VhcmRlZCB9IGZyb20gJy4uL3V0aWwvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBhc3luY0Rpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuY29uc3QgQ1JGX1ZBTFVFID0gMzA7XG5jb25zdCBERUZBVUxUX0ZQUyA9IDMwO1xuY29uc3QgZGVidWdGZm1wZWcgPSBkZWJ1ZygncHVwcGV0ZWVyOmZmbXBlZycpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmxldCBTY3JlZW5SZWNvcmRlciA9ICgoKSA9PiB7XG4gICAgbGV0IF9jbGFzc1N1cGVyID0gUGFzc1Rocm91Z2g7XG4gICAgbGV0IF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzID0gW107XG4gICAgbGV0IF9wcml2YXRlX3dyaXRlRnJhbWVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfd3JpdGVGcmFtZV9kZXNjcmlwdG9yO1xuICAgIGxldCBfc3RvcF9kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBTY3JlZW5SZWNvcmRlciBleHRlbmRzIF9jbGFzc1N1cGVyIHtcbiAgICAgICAgc3RhdGljIHtcbiAgICAgICAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfd3JpdGVGcmFtZV9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jcHJvY2Vzcy5zdGRpbi53cml0ZShidWZmZXIsIHJlc29sdmUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgZmZtcGVnIGZhaWxlZCB0byB3cml0ZTogJHtlcnJvci5tZXNzYWdlfS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIFwiI3dyaXRlRnJhbWVcIikgfSwgX3ByaXZhdGVfd3JpdGVGcmFtZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiI3dyaXRlRnJhbWVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogdHJ1ZSwgYWNjZXNzOiB7IGhhczogb2JqID0+ICN3cml0ZUZyYW1lIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiN3cml0ZUZyYW1lIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9zdG9wX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJzdG9wXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzdG9wXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouc3RvcCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICAjcGFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXMsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgI3Byb2Nlc3M7XG4gICAgICAgICNjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICAjbGFzdEZyYW1lO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdHJ1Y3RvcihwYWdlLCB3aWR0aCwgaGVpZ2h0LCB7IHNwZWVkLCBzY2FsZSwgY3JvcCwgZm9ybWF0LCBwYXRoIH0gPSB7fSkge1xuICAgICAgICAgICAgc3VwZXIoeyBhbGxvd0hhbGZPcGVuOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIHBhdGggPz89ICdmZm1wZWcnO1xuICAgICAgICAgICAgLy8gVGVzdHMgaWYgYGZmbXBlZ2AgZXhpc3RzLlxuICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gc3Bhd25TeW5jKHBhdGgpO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNwcm9jZXNzID0gc3Bhd24ocGF0aCwgXG4gICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly90cmFjLmZmbXBlZy5vcmcvd2lraS9FbmNvZGUvVlA5IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGZsYWdzLlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsnLWxvZ2xldmVsJywgJ2Vycm9yJ10sXG4gICAgICAgICAgICAgICAgLy8gUmVkdWNlcyBnZW5lcmFsIGJ1ZmZlcmluZy5cbiAgICAgICAgICAgICAgICBbJy1hdmlvZmxhZ3MnLCAnZGlyZWN0J10sXG4gICAgICAgICAgICAgICAgLy8gUmVkdWNlcyBpbml0aWFsIGJ1ZmZlcmluZyB3aGlsZSBhbmFseXppbmcgaW5wdXQgZnBzIGFuZCBvdGhlciBzdGF0cy5cbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICctZnBzcHJvYmVzaXplJyxcbiAgICAgICAgICAgICAgICAgICAgJzAnLFxuICAgICAgICAgICAgICAgICAgICAnLXByb2Jlc2l6ZScsXG4gICAgICAgICAgICAgICAgICAgICczMicsXG4gICAgICAgICAgICAgICAgICAgICctYW5hbHl6ZWR1cmF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJzAnLFxuICAgICAgICAgICAgICAgICAgICAnLWZmbGFncycsXG4gICAgICAgICAgICAgICAgICAgICdub2J1ZmZlcicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAvLyBGb3JjZXMgaW5wdXQgdG8gYmUgcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LCBhbmQgZm9yY2VzIHBuZyBpbnB1dFxuICAgICAgICAgICAgICAgIC8vIGltYWdlIGZvcm1hdC5cbiAgICAgICAgICAgICAgICBbJy1mJywgJ2ltYWdlMnBpcGUnLCAnLWM6dicsICdwbmcnLCAnLWknLCAncGlwZTowJ10sXG4gICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIG91dHB1dCBhbmQgbm8gYXVkaW8uXG4gICAgICAgICAgICAgICAgWycteScsICctYW4nXSxcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGRyYXN0aWNhbGx5IHJlZHVjZXMgc3RhbGxpbmcgd2hlbiBjcHUgaXMgb3ZlcmJvb2tlZC4gQnkgZGVmYXVsdFxuICAgICAgICAgICAgICAgIC8vIFZQOSB0cmllcyB0byB1c2UgYWxsIGF2YWlsYWJsZSB0aHJlYWRzP1xuICAgICAgICAgICAgICAgIFsnLXRocmVhZHMnLCAnMSddLFxuICAgICAgICAgICAgICAgIC8vIFNwZWNpZmllcyB0aGUgZnJhbWUgcmF0ZSB3ZSBhcmUgZ2l2aW5nIGZmbXBlZy5cbiAgICAgICAgICAgICAgICBbJy1mcmFtZXJhdGUnLCBgJHtERUZBVUxUX0ZQU31gXSxcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWZpZXMgdGhlIGVuY29kaW5nIGFuZCBmb3JtYXQgd2UgYXJlIHVzaW5nLlxuICAgICAgICAgICAgICAgIHRoaXMuI2dldEZvcm1hdEFyZ3MoZm9ybWF0ID8/ICd3ZWJtJyksXG4gICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBiaXRyYXRlLlxuICAgICAgICAgICAgICAgIFsnLWI6dicsICcwJ10sXG4gICAgICAgICAgICAgICAgLy8gRmlsdGVycyB0byBlbnN1cmUgdGhlIGltYWdlcyBhcmUgcGlwZWQgY29ycmVjdGx5LlxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgJy12ZicsXG4gICAgICAgICAgICAgICAgICAgIGAke3NwZWVkID8gYHNldHB0cz0kezEgLyBzcGVlZH0qUFRTLGAgOiAnJ31jcm9wPSdtaW4oJHt3aWR0aH0saXcpOm1pbigke2hlaWdodH0saWgpOjA6MCcscGFkPSR7d2lkdGh9OiR7aGVpZ2h0fTowOjAke2Nyb3AgPyBgLGNyb3A9JHtjcm9wLndpZHRofToke2Nyb3AuaGVpZ2h0fToke2Nyb3AueH06JHtjcm9wLnl9YCA6ICcnfSR7c2NhbGUgPyBgLHNjYWxlPWl3KiR7c2NhbGV9Oi0xYCA6ICcnfWAsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAncGlwZToxJyxcbiAgICAgICAgICAgIF0uZmxhdCgpLCB7IHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdwaXBlJ10gfSk7XG4gICAgICAgICAgICB0aGlzLiNwcm9jZXNzLnN0ZG91dC5waXBlKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy4jcHJvY2Vzcy5zdGRlcnIub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnRmZtcGVnKGRhdGEudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuI3BhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHRoaXMuI3BhZ2UubWFpbkZyYW1lKCk7XG4gICAgICAgICAgICBjbGllbnQub25jZShDRFBTZXNzaW9uRXZlbnQuRGlzY29ubmVjdGVkLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnN0b3AoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy4jbGFzdEZyYW1lID0gbGFzdFZhbHVlRnJvbShmcm9tRW1pdHRlckV2ZW50KGNsaWVudCwgJ1BhZ2Uuc2NyZWVuY2FzdEZyYW1lJykucGlwZSh0YXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgY2xpZW50LnNlbmQoJ1BhZ2Uuc2NyZWVuY2FzdEZyYW1lQWNrJywge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IGV2ZW50LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLCBmaWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmVudC5tZXRhZGF0YS50aW1lc3RhbXAgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pLCBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogQnVmZmVyLmZyb20oZXZlbnQuZGF0YSwgJ2Jhc2U2NCcpLFxuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IGV2ZW50Lm1ldGFkYXRhLnRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksIGJ1ZmZlckNvdW50KDIsIDEpLCBjb25jYXRNYXAoKFt7IHRpbWVzdGFtcDogcHJldmlvdXNUaW1lc3RhbXAsIGJ1ZmZlciB9LCB7IHRpbWVzdGFtcCB9XSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tKEFycmF5KE1hdGgucm91bmQoREVGQVVMVF9GUFMgKiBNYXRoLm1heCh0aW1lc3RhbXAgLSBwcmV2aW91c1RpbWVzdGFtcCwgMCkpKS5maWxsKGJ1ZmZlcikpO1xuICAgICAgICAgICAgfSksIG1hcChidWZmZXIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy4jd3JpdGVGcmFtZShidWZmZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbYnVmZmVyLCBwZXJmb3JtYW5jZS5ub3coKV07XG4gICAgICAgICAgICB9KSwgdGFrZVVudGlsKGZyb21FdmVudCh0aGlzLiNjb250cm9sbGVyLnNpZ25hbCwgJ2Fib3J0JykpKSwgeyBkZWZhdWx0VmFsdWU6IFtCdWZmZXIuZnJvbShbXSksIHBlcmZvcm1hbmNlLm5vdygpXSB9KTtcbiAgICAgICAgfVxuICAgICAgICAjZ2V0Rm9ybWF0QXJncyhmb3JtYXQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2VibSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBjb2RlYyB0byB1c2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBbJy1jOnYnLCAndnA5J10sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnLWYnLCAnd2VibSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0cyB0aGUgcXVhbGl0eS4gTG93ZXIgdGhlIGJldHRlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIFsnLWNyZicsIGAke0NSRl9WQUxVRX1gXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldHMgdGhlIHF1YWxpdHkgYW5kIGhvdyBlZmZpY2llbnQgdGhlIGNvbXByZXNzaW9uIHdpbGwgYmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBbJy1kZWFkbGluZScsICdyZWFsdGltZScsICctY3B1LXVzZWQnLCAnOCddLFxuICAgICAgICAgICAgICAgICAgICBdLmZsYXQoKTtcbiAgICAgICAgICAgICAgICBjYXNlICdnaWYnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0cyB0aGUgZnJhbWUgcmF0ZSBhbmQgdXNlcyBhIGN1c3RvbSBwYWxldHRlIGdlbmVyYXRlZCBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQuXG4gICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy12ZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zwcz01LHNwbGl0W3MwXVtzMV07W3MwXXBhbGV0dGVnZW49c3RhdHNfbW9kZT1kaWZmW3BdO1tzMV1bcF1wYWxldHRldXNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnLWYnLCAnZ2lmJ10sXG4gICAgICAgICAgICAgICAgICAgIF0uZmxhdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCAjd3JpdGVGcmFtZSgpIHsgcmV0dXJuIF9wcml2YXRlX3dyaXRlRnJhbWVfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICAvKipcbiAgICAgICAgICogU3RvcHMgdGhlIHJlY29yZGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzdG9wKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2NvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTdG9wcGluZyB0aGUgc2NyZWVuY2FzdCB3aWxsIGZsdXNoIHRoZSBmcmFtZXMuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwYWdlLl9zdG9wU2NyZWVuY2FzdCgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy4jY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgLy8gUmVwZWF0IHRoZSBsYXN0IGZyYW1lIGZvciB0aGUgcmVtYWluaW5nIGZyYW1lcy5cbiAgICAgICAgICAgIGNvbnN0IFtidWZmZXIsIHRpbWVzdGFtcF0gPSBhd2FpdCB0aGlzLiNsYXN0RnJhbWU7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheShNYXRoLm1heCgxLCBNYXRoLnJvdW5kKChERUZBVUxUX0ZQUyAqIChwZXJmb3JtYW5jZS5ub3coKSAtIHRpbWVzdGFtcCkpIC8gMTAwMCkpKVxuICAgICAgICAgICAgICAgIC5maWxsKGJ1ZmZlcilcbiAgICAgICAgICAgICAgICAubWFwKHRoaXMuI3dyaXRlRnJhbWUuYmluZCh0aGlzKSkpO1xuICAgICAgICAgICAgLy8gQ2xvc2Ugc3RkaW4gdG8gbm90aWZ5IEZGbXBlZyB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIHRoaXMuI3Byb2Nlc3Muc3RkaW4uZW5kKCk7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNwcm9jZXNzLm9uY2UoJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBbKF9wcml2YXRlX3dyaXRlRnJhbWVfZGVjb3JhdG9ycyA9IFtndWFyZGVkKCldLCBfc3RvcF9kZWNvcmF0b3JzID0gW2d1YXJkZWQoKV0sIGFzeW5jRGlzcG9zZVN5bWJvbCldKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9wKCk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IFNjcmVlblJlY29yZGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY3JlZW5SZWNvcmRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9DaHJvbWVMYXVuY2hlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZpcmVmb3hMYXVuY2hlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0xhdW5jaE9wdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXBlVHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHJvZHVjdExhdW5jaGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHVwcGV0ZWVyTm9kZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1NjcmVlblJlY29yZGVyLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vZGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBmcyBmcm9tICdmcyc7XG5jb25zdCBybU9wdGlvbnMgPSB7XG4gICAgZm9yY2U6IHRydWUsXG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgIG1heFJldHJpZXM6IDUsXG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJtKHBhdGgpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLCBybU9wdGlvbnMpO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJtU3luYyhwYXRoKSB7XG4gICAgZnMucm1TeW5jKHBhdGgsIHJtT3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9pbmRleC5qcyc7XG5pbXBvcnQgeyBQdXBwZXRlZXJOb2RlIH0gZnJvbSAnLi9ub2RlL1B1cHBldGVlck5vZGUuanMnO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IHB1cHBldGVlciA9IG5ldyBQdXBwZXRlZXJOb2RlKHtcbiAgICBpc1B1cHBldGVlckNvcmU6IHRydWUsXG59KTtcbmV4cG9ydCBjb25zdCB7IFxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmNvbm5lY3QsIFxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmRlZmF1bHRBcmdzLCBcbi8qKlxuICogQHB1YmxpY1xuICovXG5leGVjdXRhYmxlUGF0aCwgXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xubGF1bmNoLCB9ID0gcHVwcGV0ZWVyO1xuZXhwb3J0IGRlZmF1bHQgcHVwcGV0ZWVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVwcGV0ZWVyLWNvcmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQVVBQRVRFRVJfUkVWSVNJT05TID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgY2hyb21lOiAnMTI2LjAuNjQ3OC4xMjYnLFxuICAgICdjaHJvbWUtaGVhZGxlc3Mtc2hlbGwnOiAnMTI2LjAuNjQ3OC4xMjYnLFxuICAgIGZpcmVmb3g6ICdsYXRlc3QnLFxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXZpc2lvbnMuanMubWFwIiwiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jSXRlcmFibGVVdGlsIHtcbiAgICBzdGF0aWMgYXN5bmMgKm1hcChpdGVyYWJsZSwgbWFwKSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIHlpZWxkIGF3YWl0IG1hcCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jICpmbGF0TWFwKGl0ZXJhYmxlLCBtYXApIHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgeWllbGQqIG1hcCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGNvbGxlY3QoaXRlcmFibGUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZmlyc3QoaXRlcmFibGUpIHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc3luY0l0ZXJhYmxlVXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyNCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVGltZW91dEVycm9yIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBkZWZlcnJlZCBvYmplY3QgYWxvbmcgd2l0aCB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zLlxuICpcbiAqIElmIHRoZSBkZWZlcnJlZCBoYXMgbm90IGJlZW4gcmVzb2x2ZWQvcmVqZWN0ZWQgd2l0aGluIHRoZSBgdGltZW91dGAgcGVyaW9kLFxuICogdGhlIGRlZmVycmVkIGdldHMgcmVzb2x2ZXMgd2l0aCBhIHRpbWVvdXQgZXJyb3IuIGB0aW1lb3V0YCBoYXMgdG8gYmUgZ3JlYXRlciB0aGFuIDAgb3JcbiAqIGl0IGlzIGlnbm9yZWQuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgc3RhdGljIGNyZWF0ZShvcHRzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVmZXJyZWQob3B0cyk7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyByYWNlKGF3YWl0YWJsZXMpIHtcbiAgICAgICAgY29uc3QgZGVmZXJyZWRXaXRoVGltZW91dCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gYXdhaXRhYmxlcy5tYXAodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERlZmVycmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS4jdGltZW91dElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZFdpdGhUaW1lb3V0LmFkZCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlT3JUaHJvdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShwcm9taXNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlZmVycmVkIG9mIGRlZmVycmVkV2l0aFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHN0b3AgdGhlIHRpbWVvdXQgZWxzZVxuICAgICAgICAgICAgICAgIC8vIE5vZGUuSlMgd2lsbCBrZWVwIHJ1bm5pbmcgdGhlIGV2ZW50IGxvb3AgdGlsbCB0aGVcbiAgICAgICAgICAgICAgICAvLyB0aW1lciBleGVjdXRlc1xuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoJ1RpbWVvdXQgY2xlYXJlZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAjaXNSZXNvbHZlZCA9IGZhbHNlO1xuICAgICNpc1JlamVjdGVkID0gZmFsc2U7XG4gICAgI3ZhbHVlO1xuICAgIC8vIFNBRkVUWTogVGhpcyBpcyBlbnN1cmVkIGJ5ICN0YXNrUHJvbWlzZS5cbiAgICAjcmVzb2x2ZTtcbiAgICAjdGFza1Byb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gICAgI3RpbWVvdXRJZDtcbiAgICAjdGltZW91dEVycm9yO1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy50aW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgdGhpcy4jdGltZW91dEVycm9yID0gbmV3IFRpbWVvdXRFcnJvcihvcHRzLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy4jdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3QodGhpcy4jdGltZW91dEVycm9yKTtcbiAgICAgICAgICAgIH0sIG9wdHMudGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2ZpbmlzaCh2YWx1ZSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jdGltZW91dElkKTtcbiAgICAgICAgdGhpcy4jdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLiNpc1JlamVjdGVkIHx8IHRoaXMuI2lzUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNpc1Jlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jZmluaXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmVqZWN0KGVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLiNpc1JlamVjdGVkIHx8IHRoaXMuI2lzUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNpc1JlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jZmluaXNoKGVycm9yKTtcbiAgICB9XG4gICAgcmVzb2x2ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc1Jlc29sdmVkO1xuICAgIH1cbiAgICBmaW5pc2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzUmVzb2x2ZWQgfHwgdGhpcy4jaXNSZWplY3RlZDtcbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2YWx1ZTtcbiAgICB9XG4gICAgI3Byb21pc2U7XG4gICAgdmFsdWVPclRocm93KCkge1xuICAgICAgICBpZiAoIXRoaXMuI3Byb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMuI3Byb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Rhc2tQcm9taXNlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNpc1JlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMuI3ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4jdmFsdWU7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9taXNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlZmVycmVkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvckxpa2Uob2JqKSB7XG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwgJiYgJ25hbWUnIGluIG9iaiAmJiAnbWVzc2FnZScgaW4gb2JqKTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Vycm5vRXhjZXB0aW9uKG9iaikge1xuICAgIHJldHVybiAoaXNFcnJvckxpa2Uob2JqKSAmJlxuICAgICAgICAoJ2Vycm5vJyBpbiBvYmogfHwgJ2NvZGUnIGluIG9iaiB8fCAncGF0aCcgaW4gb2JqIHx8ICdzeXNjYWxsJyBpbiBvYmopKTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXdyaXRlRXJyb3IoZXJyb3IsIG1lc3NhZ2UsIG9yaWdpbmFsTWVzc2FnZSkge1xuICAgIGVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIGVycm9yLm9yaWdpbmFsTWVzc2FnZSA9IG9yaWdpbmFsTWVzc2FnZSA/PyBlcnJvci5vcmlnaW5hbE1lc3NhZ2U7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3RvY29sRXJyb3JNZXNzYWdlKG9iamVjdCkge1xuICAgIGxldCBtZXNzYWdlID0gb2JqZWN0LmVycm9yLm1lc3NhZ2U7XG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoZSB0eXBlIGNoZWNrcyB3aGVuIHdlIHN0b3AgY29ubmVjdGluZyB0byBCaURpIHdpdGggYSBDRFBcbiAgICAvLyBjbGllbnQuXG4gICAgaWYgKG9iamVjdC5lcnJvciAmJlxuICAgICAgICB0eXBlb2Ygb2JqZWN0LmVycm9yID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAnZGF0YScgaW4gb2JqZWN0LmVycm9yKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYCAke29iamVjdC5lcnJvci5kYXRhfWA7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXJyb3JMaWtlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5jb25zdCBjcmVhdGVkRnVuY3Rpb25zID0gbmV3IE1hcCgpO1xuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gZnJvbSBhIHN0cmluZy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUZ1bmN0aW9uID0gKGZ1bmN0aW9uVmFsdWUpID0+IHtcbiAgICBsZXQgZm4gPSBjcmVhdGVkRnVuY3Rpb25zLmdldChmdW5jdGlvblZhbHVlKTtcbiAgICBpZiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuO1xuICAgIH1cbiAgICBmbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICR7ZnVuY3Rpb25WYWx1ZX1gKSgpO1xuICAgIGNyZWF0ZWRGdW5jdGlvbnMuc2V0KGZ1bmN0aW9uVmFsdWUsIGZuKTtcbiAgICByZXR1cm4gZm47XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeUZ1bmN0aW9uKGZuKSB7XG4gICAgbGV0IHZhbHVlID0gZm4udG9TdHJpbmcoKTtcbiAgICB0cnkge1xuICAgICAgICBuZXcgRnVuY3Rpb24oYCgke3ZhbHVlfSlgKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoYFJlZnVzZWQgdG8gZXZhbHVhdGUgYSBzdHJpbmcgYXMgSmF2YVNjcmlwdCBiZWNhdXNlICd1bnNhZmUtZXZhbCcgaXMgbm90IGFuIGFsbG93ZWQgc291cmNlIG9mIHNjcmlwdCBpbiB0aGUgZm9sbG93aW5nIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGRpcmVjdGl2ZWApKSB7XG4gICAgICAgICAgICAvLyBUaGUgY29udGVudCBzZWN1cml0eSBwb2xpY3kgZG9lcyBub3QgYWxsb3cgRnVuY3Rpb24gZXZhbC4gTGV0J3NcbiAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgdmFsdWUgbWlnaHQgYmUgdmFsaWQgYXMgaXMuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBtaWdodCBoYXZlIGEgZnVuY3Rpb24gc2hvcnRoYW5kIChlLmcuIGB0ZXN0KCl7fWApLiBMZXQnc1xuICAgICAgICAvLyB0cnkgcHJlZml4aW5nLlxuICAgICAgICBsZXQgcHJlZml4ID0gJ2Z1bmN0aW9uICc7XG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdhc3luYyAnKSkge1xuICAgICAgICAgICAgcHJlZml4ID0gYGFzeW5jICR7cHJlZml4fWA7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygnYXN5bmMgJy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gYCR7cHJlZml4fSR7dmFsdWV9YDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ldyBGdW5jdGlvbihgKCR7dmFsdWV9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIC8vIFdlIHRyaWVkIGhhcmQgdG8gc2VyaWFsaXplLCBidXQgdGhlcmUncyBhIHdlaXJkIGJlYXN0IGhlcmUuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Bhc3NlZCBmdW5jdGlvbiBjYW5ub3QgYmUgc2VyaWFsaXplZCEnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4vKipcbiAqIFJlcGxhY2VzIGBQTEFDRUhPTERFUmBzIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50cy5cbiAqXG4gKiBBbGwgcmVwbGFjZW1lbnRzIG11c3QgYmUgdmFsaWQgSlMgY29kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBpbnRlcnBvbGF0ZUZ1bmN0aW9uKCgpID0+IFBMQUNFSE9MREVSKCd0ZXN0JyksIHt0ZXN0OiAndm9pZCAwJ30pO1xuICogLy8gRXF1aXZhbGVudCB0byAoKSA9PiB2b2lkIDBcbiAqIGBgYFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaW50ZXJwb2xhdGVGdW5jdGlvbiA9IChmbiwgcmVwbGFjZW1lbnRzKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gc3RyaW5naWZ5RnVuY3Rpb24oZm4pO1xuICAgIGZvciAoY29uc3QgW25hbWUsIGpzVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcGxhY2VtZW50cykpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYFBMQUNFSE9MREVSXFxcXChcXFxccyooPzonJHtuYW1lfSd8XCIke25hbWV9XCIpXFxcXHMqXFxcXClgLCAnZycpLCBcbiAgICAgICAgLy8gV3JhcHBpbmcgdGhpcyBlbnN1cmVzIHRlcnNlcnMgdGhhdCBhY2NpZGVudGFsbHkgaW5saW5lIFBMQUNFSE9MREVSIGNhbGxzXG4gICAgICAgIC8vIGFyZSBzdGlsbCB2YWxpZC4gV2l0aG91dCwgd2UgbWF5IGdldCBjYWxscyBsaWtlICgpPT57Li4ufSgpIHdoaWNoIGlzXG4gICAgICAgIC8vIG5vdCB2YWxpZC5cbiAgICAgICAgYCgke2pzVmFsdWV9KWApO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb24odmFsdWUpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZ1bmN0aW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4vZGlzcG9zYWJsZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTXV0ZXgge1xuICAgIHN0YXRpYyBHdWFyZCA9IGNsYXNzIEd1YXJkIHtcbiAgICAgICAgI211dGV4O1xuICAgICAgICAjb25SZWxlYXNlO1xuICAgICAgICBjb25zdHJ1Y3RvcihtdXRleCwgb25SZWxlYXNlKSB7XG4gICAgICAgICAgICB0aGlzLiNtdXRleCA9IG11dGV4O1xuICAgICAgICAgICAgdGhpcy4jb25SZWxlYXNlID0gb25SZWxlYXNlO1xuICAgICAgICB9XG4gICAgICAgIFtkaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgICAgIHRoaXMuI29uUmVsZWFzZT8uKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jbXV0ZXgucmVsZWFzZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAjbG9ja2VkID0gZmFsc2U7XG4gICAgI2FjcXVpcmVycyA9IFtdO1xuICAgIC8vIFRoaXMgaXMgRklGTy5cbiAgICBhc3luYyBhY3F1aXJlKG9uUmVsZWFzZSkge1xuICAgICAgICBpZiAoIXRoaXMuI2xvY2tlZCkge1xuICAgICAgICAgICAgdGhpcy4jbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTXV0ZXguR3VhcmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAgICAgdGhpcy4jYWNxdWlyZXJzLnB1c2goZGVmZXJyZWQucmVzb2x2ZS5iaW5kKGRlZmVycmVkKSk7XG4gICAgICAgIGF3YWl0IGRlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgICAgICByZXR1cm4gbmV3IE11dGV4Lkd1YXJkKHRoaXMsIG9uUmVsZWFzZSk7XG4gICAgfVxuICAgIHJlbGVhc2UoKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmUgPSB0aGlzLiNhY3F1aXJlcnMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCFyZXNvbHZlKSB7XG4gICAgICAgICAgICB0aGlzLiNsb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXV0ZXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiB2YWx1ZSBpcyB0cnV0aHkuXG4gKiBAcGFyYW0gdmFsdWUgLSBzb21lIGNvbmRpdGlvbmFsIHN0YXRlbWVudFxuICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHRydXRoeS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGFzc2VydCA9ICh2YWx1ZSwgbWVzc2FnZSkgPT4ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hc3NlcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBhc3luY0Rpc3Bvc2VTeW1ib2wsIGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgTXV0ZXggfSBmcm9tICcuL011dGV4LmpzJztcbmNvbnN0IGluc3RhbmNlcyA9IG5ldyBXZWFrU2V0KCk7XG5leHBvcnQgZnVuY3Rpb24gbW92ZWFibGUoQ2xhc3MsIF8pIHtcbiAgICBsZXQgaGFzRGlzcG9zZSA9IGZhbHNlO1xuICAgIGlmIChDbGFzcy5wcm90b3R5cGVbZGlzcG9zZVN5bWJvbF0pIHtcbiAgICAgICAgY29uc3QgZGlzcG9zZSA9IENsYXNzLnByb3RvdHlwZVtkaXNwb3NlU3ltYm9sXTtcbiAgICAgICAgQ2xhc3MucHJvdG90eXBlW2Rpc3Bvc2VTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlcy5oYXModGhpcykpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXMuZGVsZXRlKHRoaXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkaXNwb3NlLmNhbGwodGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIGhhc0Rpc3Bvc2UgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoQ2xhc3MucHJvdG90eXBlW2FzeW5jRGlzcG9zZVN5bWJvbF0pIHtcbiAgICAgICAgY29uc3QgYXN5bmNEaXNwb3NlID0gQ2xhc3MucHJvdG90eXBlW2FzeW5jRGlzcG9zZVN5bWJvbF07XG4gICAgICAgIENsYXNzLnByb3RvdHlwZVthc3luY0Rpc3Bvc2VTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlcy5oYXModGhpcykpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXMuZGVsZXRlKHRoaXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhc3luY0Rpc3Bvc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgaGFzRGlzcG9zZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChoYXNEaXNwb3NlKSB7XG4gICAgICAgIENsYXNzLnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaW5zdGFuY2VzLmFkZCh0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gQ2xhc3M7XG59XG5leHBvcnQgZnVuY3Rpb24gdGhyb3dJZkRpc3Bvc2VkKG1lc3NhZ2UgPSB2YWx1ZSA9PiB7XG4gICAgcmV0dXJuIGBBdHRlbXB0ZWQgdG8gdXNlIGRpc3Bvc2VkICR7dmFsdWUuY29uc3RydWN0b3IubmFtZX0uYDtcbn0pIHtcbiAgICByZXR1cm4gKHRhcmdldCwgXykgPT4ge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gaW5lcnRJZkRpc3Bvc2VkKHRhcmdldCwgXykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQuY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICB9O1xufVxuLyoqXG4gKiBUaGUgZGVjb3JhdG9yIG9ubHkgaW52b2tlcyB0aGUgdGFyZ2V0IGlmIHRoZSB0YXJnZXQgaGFzIG5vdCBiZWVuIGludm9rZWQgd2l0aFxuICogdGhlIHNhbWUgYXJndW1lbnRzIGJlZm9yZS4gVGhlIGRlY29yYXRlZCBtZXRob2QgdGhyb3dzIGFuIGVycm9yIGlmIGl0J3NcbiAqIGludm9rZWQgd2l0aCBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHM6IGlmIHlvdSBkZWNvcmF0ZSBhIG1ldGhvZCwgaXRcbiAqIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHNcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHModGFyZ2V0LCBfKSB7XG4gICAgY29uc3QgY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuICAgIGxldCBjYWNoZURlcHRoID0gLTE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGlmIChjYWNoZURlcHRoID09PSAtMSkge1xuICAgICAgICAgICAgY2FjaGVEZXB0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWNoZURlcHRoICE9PSBhcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vaXplZCBtZXRob2Qgd2FzIGNhbGxlZCB3aXRoIHRoZSB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZyZXNoQXJndW1lbnRzID0gZmFsc2U7XG4gICAgICAgIGxldCBjYWNoZUl0ZXJhdG9yID0gY2FjaGU7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgIGlmIChjYWNoZUl0ZXJhdG9yLmhhcyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgY2FjaGVJdGVyYXRvciA9IGNhY2hlSXRlcmF0b3IuZ2V0KGFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmVzaEFyZ3VtZW50cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2FjaGVJdGVyYXRvci5zZXQoYXJnLCBuZXcgV2Vha01hcCgpKTtcbiAgICAgICAgICAgICAgICBjYWNoZUl0ZXJhdG9yID0gY2FjaGVJdGVyYXRvci5nZXQoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZyZXNoQXJndW1lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ3VhcmRlZChnZXRLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG59KSB7XG4gICAgcmV0dXJuICh0YXJnZXQsIF8pID0+IHtcbiAgICAgICAgY29uc3QgbXV0ZXhlcyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGdldEtleS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIGxldCBtdXRleCA9IG11dGV4ZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFtdXRleCkge1xuICAgICAgICAgICAgICAgICAgICBtdXRleCA9IG5ldyBNdXRleCgpO1xuICAgICAgICAgICAgICAgICAgICBtdXRleGVzLnNldChrZXksIG11dGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgXyA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBhd2FpdCBtdXRleC5hY3F1aXJlKCksIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0YXJnZXQuY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzEpIHtcbiAgICAgICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgICAgICBlbnZfMS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRfMSA9IF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdF8xKVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXN1bHRfMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xufVxuY29uc3QgYnViYmxlSGFuZGxlcnMgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgYnViYmxlSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZXZlbnRzKSB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSBidWJibGVIYW5kbGVycy5nZXQodGhpcykgPz8gbmV3IE1hcCgpO1xuICAgIGlmIChoYW5kbGVycy5oYXMoZXZlbnRzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXIgPSBldmVudHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/ICh0eXBlLCBldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50cy5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCh0eXBlLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgOiAodHlwZSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCh0eXBlLCBldmVudCk7XG4gICAgICAgIH07XG4gICAgaGFuZGxlcnMuc2V0KGV2ZW50cywgaGFuZGxlcik7XG4gICAgYnViYmxlSGFuZGxlcnMuc2V0KHRoaXMsIGhhbmRsZXJzKTtcbn07XG4vKipcbiAqIEV2ZW50IGVtaXR0ZXIgZmllbGRzIG1hcmtlZCB3aXRoIGBidWJibGVgIHdpbGwgaGF2ZSB0aGVpciBldmVudHMgYnViYmxlIHVwXG4gKiB0aGUgZmllbGQgb3duZXIuXG4gKi9cbi8vIFRoZSB0eXBlIGlzIHRvbyBjb21wbGljYXRlZCB0byB0eXBlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbmV4cG9ydCBmdW5jdGlvbiBidWJibGUoZXZlbnRzKSB7XG4gICAgcmV0dXJuICh7IHNldCwgZ2V0IH0sIGNvbnRleHQpID0+IHtcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gYnViYmxlSW5pdGlhbGl6ZXIuYXBwbHkodGhpcywgW2V2ZW50c10pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNldChlbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IGJ1YmJsZUhhbmRsZXJzLmdldCh0aGlzKS5nZXQoZXZlbnRzKTtcbiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGFyZSByZS1zZXR0aW5nLlxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZEVtaXR0ZXIgPSBnZXQuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAob2xkRW1pdHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZEVtaXR0ZXIub2ZmKCcqJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbWl0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbWl0dGVyLm9uKCcqJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgc2V0LmNhbGwodGhpcywgZW1pdHRlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5pdChlbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVtaXR0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdHRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnViYmxlSW5pdGlhbGl6ZXIuYXBwbHkodGhpcywgW2V2ZW50c10pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBidWJibGVIYW5kbGVycy5nZXQodGhpcykuZ2V0KGV2ZW50cyk7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5vbignKicsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbWl0dGVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVjb3JhdG9ycy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuU3ltYm9sLmRpc3Bvc2UgPz89IFN5bWJvbCgnZGlzcG9zZScpO1xuU3ltYm9sLmFzeW5jRGlzcG9zZSA/Pz0gU3ltYm9sKCdhc3luY0Rpc3Bvc2UnKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBkaXNwb3NlU3ltYm9sID0gU3ltYm9sLmRpc3Bvc2U7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgYXN5bmNEaXNwb3NlU3ltYm9sID0gU3ltYm9sLmFzeW5jRGlzcG9zZTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXNwb3NhYmxlU3RhY2sge1xuICAgICNkaXNwb3NlZCA9IGZhbHNlO1xuICAgICNzdGFjayA9IFtdO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBzdGFjayBoYXMgYmVlbiBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBnZXQgZGlzcG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkaXNwb3NlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZXMgZWFjaCByZXNvdXJjZSBpbiB0aGUgc3RhY2sgaW4gdGhlIHJldmVyc2Ugb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWRkZWQuXG4gICAgICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHRoaXMuI3N0YWNrLnJldmVyc2UoKSkge1xuICAgICAgICAgICAgcmVzb3VyY2VbZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZGlzcG9zYWJsZSByZXNvdXJjZSB0byB0aGUgc3RhY2ssIHJldHVybmluZyB0aGUgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgcmVzb3VyY2UgdG8gYWRkLiBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIHdpbGwgbm90IGJlIGFkZGVkLFxuICAgICAqIGJ1dCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEByZXR1cm5zIFRoZSBwcm92aWRlZCBgdmFsdWVgLlxuICAgICAqL1xuICAgIHVzZSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuI3N0YWNrLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHZhbHVlIGFuZCBhc3NvY2lhdGVkIGRpc3Bvc2FsIGNhbGxiYWNrIGFzIGEgcmVzb3VyY2UgdG8gdGhlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0gb25EaXNwb3NlIC0gVGhlIGNhbGxiYWNrIHRvIHVzZSBpbiBwbGFjZSBvZiBhIGBbZGlzcG9zZVN5bWJvbF0oKWBcbiAgICAgKiBtZXRob2QuIFdpbGwgYmUgaW52b2tlZCB3aXRoIGB2YWx1ZWAgYXMgdGhlIGZpcnN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvdmlkZWQgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBhZG9wdCh2YWx1ZSwgb25EaXNwb3NlKSB7XG4gICAgICAgIHRoaXMuI3N0YWNrLnB1c2goe1xuICAgICAgICAgICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICAgICAgICAgIG9uRGlzcG9zZSh2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBzdGFjayBpcyBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBkZWZlcihvbkRpc3Bvc2UpIHtcbiAgICAgICAgdGhpcy4jc3RhY2sucHVzaCh7XG4gICAgICAgICAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgICAgICAgICAgb25EaXNwb3NlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTW92ZSBhbGwgcmVzb3VyY2VzIG91dCBvZiB0aGlzIHN0YWNrIGFuZCBpbnRvIGEgbmV3IGBEaXNwb3NhYmxlU3RhY2tgLCBhbmRcbiAgICAgKiBtYXJrcyB0aGlzIHN0YWNrIGFzIGRpc3Bvc2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY2xhc3MgQyB7XG4gICAgICogICAjcmVzMTogRGlzcG9zYWJsZTtcbiAgICAgKiAgICNyZXMyOiBEaXNwb3NhYmxlO1xuICAgICAqICAgI2Rpc3Bvc2FibGVzOiBEaXNwb3NhYmxlU3RhY2s7XG4gICAgICogICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgKiAgICAgLy8gc3RhY2sgd2lsbCBiZSBkaXNwb3NlZCB3aGVuIGV4aXRpbmcgY29uc3RydWN0b3IgZm9yIGFueSByZWFzb25cbiAgICAgKiAgICAgdXNpbmcgc3RhY2sgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgICpcbiAgICAgKiAgICAgLy8gZ2V0IGZpcnN0IHJlc291cmNlXG4gICAgICogICAgIHRoaXMuI3JlczEgPSBzdGFjay51c2UoZ2V0UmVzb3VyY2UxKCkpO1xuICAgICAqXG4gICAgICogICAgIC8vIGdldCBzZWNvbmQgcmVzb3VyY2UuIElmIHRoaXMgZmFpbHMsIGJvdGggYHN0YWNrYCBhbmQgYCNyZXMxYCB3aWxsIGJlIGRpc3Bvc2VkLlxuICAgICAqICAgICB0aGlzLiNyZXMyID0gc3RhY2sudXNlKGdldFJlc291cmNlMigpKTtcbiAgICAgKlxuICAgICAqICAgICAvLyBhbGwgb3BlcmF0aW9ucyBzdWNjZWVkZWQsIG1vdmUgcmVzb3VyY2VzIG91dCBvZiBgc3RhY2tgIHNvIHRoYXRcbiAgICAgKiAgICAgLy8gdGhleSBhcmVuJ3QgZGlzcG9zZWQgd2hlbiBjb25zdHJ1Y3RvciBleGl0c1xuICAgICAqICAgICB0aGlzLiNkaXNwb3NhYmxlcyA9IHN0YWNrLm1vdmUoKTtcbiAgICAgKiAgIH1cbiAgICAgKlxuICAgICAqICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAqICAgICB0aGlzLiNkaXNwb3NhYmxlcy5kaXNwb3NlKCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCdhIGRpc3Bvc2VkIHN0YWNrIGNhbiBub3QgdXNlIGFueXRoaW5nIG5ldycpOyAvLyBzdGVwIDNcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFjayA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTsgLy8gc3RlcCA0LTVcbiAgICAgICAgc3RhY2suI3N0YWNrID0gdGhpcy4jc3RhY2s7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH1cbiAgICBbZGlzcG9zZVN5bWJvbF0gPSB0aGlzLmRpc3Bvc2U7XG4gICAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnRGlzcG9zYWJsZVN0YWNrJztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0Rpc3Bvc2FibGVTdGFjayB7XG4gICAgI2Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgI3N0YWNrID0gW107XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHN0YWNrIGhhcyBiZWVuIGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlcyBlYWNoIHJlc291cmNlIGluIHRoZSBzdGFjayBpbiB0aGUgcmV2ZXJzZSBvcmRlciB0aGF0IHRoZXkgd2VyZSBhZGRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNkaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgdGhpcy4jc3RhY2sucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBhd2FpdCByZXNvdXJjZVthc3luY0Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGRpc3Bvc2FibGUgcmVzb3VyY2UgdG8gdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIHJlc291cmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHJlc291cmNlIHRvIGFkZC4gYG51bGxgIGFuZCBgdW5kZWZpbmVkYCB3aWxsIG5vdCBiZSBhZGRlZCxcbiAgICAgKiBidXQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvdmlkZWQgYHZhbHVlYC5cbiAgICAgKi9cbiAgICB1c2UodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLiNzdGFjay5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB2YWx1ZSBhbmQgYXNzb2NpYXRlZCBkaXNwb3NhbCBjYWxsYmFjayBhcyBhIHJlc291cmNlIHRvIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBhZGQuXG4gICAgICogQHBhcmFtIG9uRGlzcG9zZSAtIFRoZSBjYWxsYmFjayB0byB1c2UgaW4gcGxhY2Ugb2YgYSBgW2Rpc3Bvc2VTeW1ib2xdKClgXG4gICAgICogbWV0aG9kLiBXaWxsIGJlIGludm9rZWQgd2l0aCBgdmFsdWVgIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMgVGhlIHByb3ZpZGVkIGB2YWx1ZWAuXG4gICAgICovXG4gICAgYWRvcHQodmFsdWUsIG9uRGlzcG9zZSkge1xuICAgICAgICB0aGlzLiNzdGFjay5wdXNoKHtcbiAgICAgICAgICAgIFthc3luY0Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvbkRpc3Bvc2UodmFsdWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc3RhY2sgaXMgZGlzcG9zZWQuXG4gICAgICovXG4gICAgZGVmZXIob25EaXNwb3NlKSB7XG4gICAgICAgIHRoaXMuI3N0YWNrLnB1c2goe1xuICAgICAgICAgICAgW2FzeW5jRGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9uRGlzcG9zZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmUgYWxsIHJlc291cmNlcyBvdXQgb2YgdGhpcyBzdGFjayBhbmQgaW50byBhIG5ldyBgRGlzcG9zYWJsZVN0YWNrYCwgYW5kXG4gICAgICogbWFya3MgdGhpcyBzdGFjayBhcyBkaXNwb3NlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNsYXNzIEMge1xuICAgICAqICAgI3JlczE6IERpc3Bvc2FibGU7XG4gICAgICogICAjcmVzMjogRGlzcG9zYWJsZTtcbiAgICAgKiAgICNkaXNwb3NhYmxlczogRGlzcG9zYWJsZVN0YWNrO1xuICAgICAqICAgY29uc3RydWN0b3IoKSB7XG4gICAgICogICAgIC8vIHN0YWNrIHdpbGwgYmUgZGlzcG9zZWQgd2hlbiBleGl0aW5nIGNvbnN0cnVjdG9yIGZvciBhbnkgcmVhc29uXG4gICAgICogICAgIHVzaW5nIHN0YWNrID0gbmV3IERpc3Bvc2FibGVTdGFjaygpO1xuICAgICAqXG4gICAgICogICAgIC8vIGdldCBmaXJzdCByZXNvdXJjZVxuICAgICAqICAgICB0aGlzLiNyZXMxID0gc3RhY2sudXNlKGdldFJlc291cmNlMSgpKTtcbiAgICAgKlxuICAgICAqICAgICAvLyBnZXQgc2Vjb25kIHJlc291cmNlLiBJZiB0aGlzIGZhaWxzLCBib3RoIGBzdGFja2AgYW5kIGAjcmVzMWAgd2lsbCBiZSBkaXNwb3NlZC5cbiAgICAgKiAgICAgdGhpcy4jcmVzMiA9IHN0YWNrLnVzZShnZXRSZXNvdXJjZTIoKSk7XG4gICAgICpcbiAgICAgKiAgICAgLy8gYWxsIG9wZXJhdGlvbnMgc3VjY2VlZGVkLCBtb3ZlIHJlc291cmNlcyBvdXQgb2YgYHN0YWNrYCBzbyB0aGF0XG4gICAgICogICAgIC8vIHRoZXkgYXJlbid0IGRpc3Bvc2VkIHdoZW4gY29uc3RydWN0b3IgZXhpdHNcbiAgICAgKiAgICAgdGhpcy4jZGlzcG9zYWJsZXMgPSBzdGFjay5tb3ZlKCk7XG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiAgIFtkaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgKiAgICAgdGhpcy4jZGlzcG9zYWJsZXMuZGlzcG9zZSgpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb3ZlKCkge1xuICAgICAgICBpZiAodGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcignYSBkaXNwb3NlZCBzdGFjayBjYW4gbm90IHVzZSBhbnl0aGluZyBuZXcnKTsgLy8gc3RlcCAzXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgQXN5bmNEaXNwb3NhYmxlU3RhY2soKTsgLy8gc3RlcCA0LTVcbiAgICAgICAgc3RhY2suI3N0YWNrID0gdGhpcy4jc3RhY2s7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH1cbiAgICBbYXN5bmNEaXNwb3NlU3ltYm9sXSA9IHRoaXMuZGlzcG9zZTtcbiAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdBc3luY0Rpc3Bvc2FibGVTdGFjayc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXNwb3NhYmxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL2Fzc2VydC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0RlZmVycmVkLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXJyb3JMaWtlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQXN5bmNJdGVyYWJsZVV0aWwuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXNwb3NhYmxlLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWwuanMubWFwIiwiLyoqXG5NSVQgTGljZW5zZVxuXG5Db3B5cmlnaHQgKGMpIDIwMjEgSmFzb24gTWlsbGVyXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG5jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG5TT0ZUV0FSRS5cblxuKi9cbi8vIC4uLy4uL25vZGVfbW9kdWxlcy9taXR0L2Rpc3QvbWl0dC5tanNcbmZ1bmN0aW9uIG1pdHRfZGVmYXVsdChuKSB7XG4gIHJldHVybiB7IGFsbDogbiA9IG4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgb246IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICB2YXIgaSA9IG4uZ2V0KHQpO1xuICAgIGkgPyBpLnB1c2goZSkgOiBuLnNldCh0LCBbZV0pO1xuICB9LCBvZmY6IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICB2YXIgaSA9IG4uZ2V0KHQpO1xuICAgIGkgJiYgKGUgPyBpLnNwbGljZShpLmluZGV4T2YoZSkgPj4+IDAsIDEpIDogbi5zZXQodCwgW10pKTtcbiAgfSwgZW1pdDogZnVuY3Rpb24odCwgZSkge1xuICAgIHZhciBpID0gbi5nZXQodCk7XG4gICAgaSAmJiBpLnNsaWNlKCkubWFwKGZ1bmN0aW9uKG4yKSB7XG4gICAgICBuMihlKTtcbiAgICB9KSwgKGkgPSBuLmdldChcIipcIikpICYmIGkuc2xpY2UoKS5tYXAoZnVuY3Rpb24objIpIHtcbiAgICAgIG4yKHQsIGUpO1xuICAgIH0pO1xuICB9IH07XG59XG5leHBvcnQge1xuICBtaXR0X2RlZmF1bHQgYXMgZGVmYXVsdFxufTtcbiIsIi8qKlxuTUlUIExpY2Vuc2VcblxuQ29weXJpZ2h0IChjKSAyMDIwIExlYSBWZXJvdVxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuU09GVFdBUkUuXG5cbiovXG4vLyAuLi8uLi9ub2RlX21vZHVsZXMvcGFyc2VsLWpzL2Rpc3QvcGFyc2VsLmpzXG52YXIgVE9LRU5TID0ge1xuICBhdHRyaWJ1dGU6IC9cXFtcXHMqKD86KD88bmFtZXNwYWNlPlxcKnxbLVxcd1xcUHtBU0NJSX1dKilcXHwpPyg/PG5hbWU+Wy1cXHdcXFB7QVNDSUl9XSspXFxzKig/Oig/PG9wZXJhdG9yPlxcVz89KVxccyooPzx2YWx1ZT4uKz8pXFxzKihcXHMoPzxjYXNlU2Vuc2l0aXZlPltpSXNTXSkpP1xccyopP1xcXS9ndSxcbiAgaWQ6IC8jKD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykvZ3UsXG4gIGNsYXNzOiAvXFwuKD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykvZ3UsXG4gIGNvbW1hOiAvXFxzKixcXHMqL2csXG4gIGNvbWJpbmF0b3I6IC9cXHMqW1xccz4rfl1cXHMqL2csXG4gIFwicHNldWRvLWVsZW1lbnRcIjogLzo6KD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykoPzpcXCgoPzxhcmd1bWVudD7CtiopXFwpKT8vZ3UsXG4gIFwicHNldWRvLWNsYXNzXCI6IC86KD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykoPzpcXCgoPzxhcmd1bWVudD7CtiopXFwpKT8vZ3UsXG4gIHVuaXZlcnNhbDogLyg/Oig/PG5hbWVzcGFjZT5cXCp8Wy1cXHdcXFB7QVNDSUl9XSopXFx8KT9cXCovZ3UsXG4gIHR5cGU6IC8oPzooPzxuYW1lc3BhY2U+XFwqfFstXFx3XFxQe0FTQ0lJfV0qKVxcfCk/KD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykvZ3VcbiAgLy8gdGhpcyBtdXN0IGJlIGxhc3Rcbn07XG52YXIgVFJJTV9UT0tFTlMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXCJjb21iaW5hdG9yXCIsIFwiY29tbWFcIl0pO1xudmFyIGdldEFyZ3VtZW50UGF0dGVybkJ5VHlwZSA9ICh0eXBlKSA9PiB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJwc2V1ZG8tZWxlbWVudFwiOlxuICAgIGNhc2UgXCJwc2V1ZG8tY2xhc3NcIjpcbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKFRPS0VOU1t0eXBlXS5zb3VyY2UucmVwbGFjZShcIig/PGFyZ3VtZW50PlxceEI2KilcIiwgXCIoPzxhcmd1bWVudD4uKilcIiksIFwiZ3VcIik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBUT0tFTlNbdHlwZV07XG4gIH1cbn07XG5mdW5jdGlvbiBnb2JibGVQYXJlbnModGV4dCwgb2Zmc2V0KSB7XG4gIGxldCBuZXN0aW5nID0gMDtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGZvciAoOyBvZmZzZXQgPCB0ZXh0Lmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICBjb25zdCBjaGFyID0gdGV4dFtvZmZzZXRdO1xuICAgIHN3aXRjaCAoY2hhcikge1xuICAgICAgY2FzZSBcIihcIjpcbiAgICAgICAgKytuZXN0aW5nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCIpXCI6XG4gICAgICAgIC0tbmVzdGluZztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJlc3VsdCArPSBjaGFyO1xuICAgIGlmIChuZXN0aW5nID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdG9rZW5pemVCeSh0ZXh0LCBncmFtbWFyID0gVE9LRU5TKSB7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCB0b2tlbnMgPSBbdGV4dF07XG4gIGZvciAoY29uc3QgW3R5cGUsIHBhdHRlcm5dIG9mIE9iamVjdC5lbnRyaWVzKGdyYW1tYXIpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKHRva2VuKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBmcm9tID0gbWF0Y2guaW5kZXggLSAxO1xuICAgICAgY29uc3QgYXJncyA9IFtdO1xuICAgICAgY29uc3QgY29udGVudCA9IG1hdGNoWzBdO1xuICAgICAgY29uc3QgYmVmb3JlID0gdG9rZW4uc2xpY2UoMCwgZnJvbSArIDEpO1xuICAgICAgaWYgKGJlZm9yZSkge1xuICAgICAgICBhcmdzLnB1c2goYmVmb3JlKTtcbiAgICAgIH1cbiAgICAgIGFyZ3MucHVzaCh7XG4gICAgICAgIC4uLm1hdGNoLmdyb3VwcyxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgY29udGVudFxuICAgICAgfSk7XG4gICAgICBjb25zdCBhZnRlciA9IHRva2VuLnNsaWNlKGZyb20gKyBjb250ZW50Lmxlbmd0aCArIDEpO1xuICAgICAgaWYgKGFmdGVyKSB7XG4gICAgICAgIGFyZ3MucHVzaChhZnRlcik7XG4gICAgICB9XG4gICAgICB0b2tlbnMuc3BsaWNlKGksIDEsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB0b2tlbikge1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2VxdWVuY2UgJHt0b2tlbn0gZm91bmQgYXQgaW5kZXggJHtvZmZzZXR9YCk7XG4gICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgIG9mZnNldCArPSB0b2tlbi5jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgdG9rZW4ucG9zID0gW29mZnNldCAtIHRva2VuLmNvbnRlbnQubGVuZ3RoLCBvZmZzZXRdO1xuICAgICAgICBpZiAoVFJJTV9UT0tFTlMuaGFzKHRva2VuLnR5cGUpKSB7XG4gICAgICAgICAgdG9rZW4uY29udGVudCA9IHRva2VuLmNvbnRlbnQudHJpbSgpIHx8IFwiIFwiO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG9rZW5zO1xufVxudmFyIFNUUklOR19QQVRURVJOID0gLyhbJ1wiXSkoW15cXFxcXFxuXSs/KVxcMS9nO1xudmFyIEVTQ0FQRV9QQVRURVJOID0gL1xcXFwuL2c7XG5mdW5jdGlvbiB0b2tlbml6ZShzZWxlY3RvciwgZ3JhbW1hciA9IFRPS0VOUykge1xuICBzZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKTtcbiAgaWYgKHNlbGVjdG9yID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHJlcGxhY2VtZW50cyA9IFtdO1xuICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoRVNDQVBFX1BBVFRFUk4sICh2YWx1ZSwgb2Zmc2V0KSA9PiB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyB2YWx1ZSwgb2Zmc2V0IH0pO1xuICAgIHJldHVybiBcIlxcdUUwMDBcIi5yZXBlYXQodmFsdWUubGVuZ3RoKTtcbiAgfSk7XG4gIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZShTVFJJTkdfUEFUVEVSTiwgKHZhbHVlLCBxdW90ZSwgY29udGVudCwgb2Zmc2V0KSA9PiB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyB2YWx1ZSwgb2Zmc2V0IH0pO1xuICAgIHJldHVybiBgJHtxdW90ZX0ke1wiXFx1RTAwMVwiLnJlcGVhdChjb250ZW50Lmxlbmd0aCl9JHtxdW90ZX1gO1xuICB9KTtcbiAge1xuICAgIGxldCBwb3MgPSAwO1xuICAgIGxldCBvZmZzZXQ7XG4gICAgd2hpbGUgKChvZmZzZXQgPSBzZWxlY3Rvci5pbmRleE9mKFwiKFwiLCBwb3MpKSA+IC0xKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGdvYmJsZVBhcmVucyhzZWxlY3Rvciwgb2Zmc2V0KTtcbiAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHsgdmFsdWUsIG9mZnNldCB9KTtcbiAgICAgIHNlbGVjdG9yID0gYCR7c2VsZWN0b3Iuc3Vic3RyaW5nKDAsIG9mZnNldCl9KCR7XCJcXHhCNlwiLnJlcGVhdCh2YWx1ZS5sZW5ndGggLSAyKX0pJHtzZWxlY3Rvci5zdWJzdHJpbmcob2Zmc2V0ICsgdmFsdWUubGVuZ3RoKX1gO1xuICAgICAgcG9zID0gb2Zmc2V0ICsgdmFsdWUubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZUJ5KHNlbGVjdG9yLCBncmFtbWFyKTtcbiAgY29uc3QgY2hhbmdlZFRva2VucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGZvciAoY29uc3QgcmVwbGFjZW1lbnQgb2YgcmVwbGFjZW1lbnRzLnJldmVyc2UoKSkge1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICBjb25zdCB7IG9mZnNldCwgdmFsdWUgfSA9IHJlcGxhY2VtZW50O1xuICAgICAgaWYgKCEodG9rZW4ucG9zWzBdIDw9IG9mZnNldCAmJiBvZmZzZXQgKyB2YWx1ZS5sZW5ndGggPD0gdG9rZW4ucG9zWzFdKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgY29udGVudCB9ID0gdG9rZW47XG4gICAgICBjb25zdCB0b2tlbk9mZnNldCA9IG9mZnNldCAtIHRva2VuLnBvc1swXTtcbiAgICAgIHRva2VuLmNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIHRva2VuT2Zmc2V0KSArIHZhbHVlICsgY29udGVudC5zbGljZSh0b2tlbk9mZnNldCArIHZhbHVlLmxlbmd0aCk7XG4gICAgICBpZiAodG9rZW4uY29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgICBjaGFuZ2VkVG9rZW5zLmFkZCh0b2tlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgdG9rZW4gb2YgY2hhbmdlZFRva2Vucykge1xuICAgIGNvbnN0IHBhdHRlcm4gPSBnZXRBcmd1bWVudFBhdHRlcm5CeVR5cGUodG9rZW4udHlwZSk7XG4gICAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdG9rZW4gdHlwZTogJHt0b2tlbi50eXBlfWApO1xuICAgIH1cbiAgICBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWModG9rZW4uY29udGVudCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgY29udGVudCBmb3IgJHt0b2tlbi50eXBlfTogJHt0b2tlbi5jb250ZW50fWApO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHRva2VuLCBtYXRjaC5ncm91cHMpO1xuICB9XG4gIHJldHVybiB0b2tlbnM7XG59XG5mdW5jdGlvbiogZmxhdHRlbihub2RlLCBwYXJlbnQpIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwibGlzdFwiOlxuICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5saXN0KSB7XG4gICAgICAgIHlpZWxkKiBmbGF0dGVuKGNoaWxkLCBub2RlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJjb21wbGV4XCI6XG4gICAgICB5aWVsZCogZmxhdHRlbihub2RlLmxlZnQsIG5vZGUpO1xuICAgICAgeWllbGQqIGZsYXR0ZW4obm9kZS5yaWdodCwgbm9kZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiY29tcG91bmRcIjpcbiAgICAgIHlpZWxkKiBub2RlLmxpc3QubWFwKCh0b2tlbikgPT4gW3Rva2VuLCBub2RlXSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgeWllbGQgW25vZGUsIHBhcmVudF07XG4gIH1cbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeShsaXN0T3JOb2RlKSB7XG4gIGxldCB0b2tlbnM7XG4gIGlmIChBcnJheS5pc0FycmF5KGxpc3RPck5vZGUpKSB7XG4gICAgdG9rZW5zID0gbGlzdE9yTm9kZTtcbiAgfSBlbHNlIHtcbiAgICB0b2tlbnMgPSBbLi4uZmxhdHRlbihsaXN0T3JOb2RlKV0ubWFwKChbdG9rZW5dKSA9PiB0b2tlbik7XG4gIH1cbiAgcmV0dXJuIHRva2Vucy5tYXAoKHRva2VuKSA9PiB0b2tlbi5jb250ZW50KS5qb2luKFwiXCIpO1xufVxuZXhwb3J0IHtcbiAgVE9LRU5TLFxuICBzdHJpbmdpZnksXG4gIHRva2VuaXplXG59O1xuIiwiLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0XG4gICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL1xuXG4gVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OXG5cbiAxLiBEZWZpbml0aW9ucy5cblxuICAgIFwiTGljZW5zZVwiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbixcbiAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC5cblxuICAgIFwiTGljZW5zb3JcIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnlcbiAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICBcIkxlZ2FsIEVudGl0eVwiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGxcbiAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uXG4gICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbixcbiAgICBcImNvbnRyb2xcIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZVxuICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yXG4gICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlXG4gICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS5cblxuICAgIFwiWW91XCIgKG9yIFwiWW91clwiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5XG4gICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS5cblxuICAgIFwiU291cmNlXCIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsXG4gICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvblxuICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG5cbiAgICBcIk9iamVjdFwiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsXG4gICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dFxuICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbixcbiAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuXG5cbiAgICBcIldvcmtcIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yXG4gICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYVxuICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29ya1xuICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuXG5cbiAgICBcIkRlcml2YXRpdmUgV29ya3NcIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3RcbiAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlXG4gICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9uc1xuICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzXG4gICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluXG4gICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLFxuICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuXG5cbiAgICBcIkNvbnRyaWJ1dGlvblwiIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nXG4gICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9uc1xuICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseVxuICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXJcbiAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2ZcbiAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgXCJzdWJtaXR0ZWRcIlxuICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnRcbiAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0b1xuICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsXG4gICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGVcbiAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXRcbiAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZVxuICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzIFwiTm90IGEgQ29udHJpYnV0aW9uLlwiXG5cbiAgICBcIkNvbnRyaWJ1dG9yXCIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5XG4gICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kXG4gICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuXG5cbiAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsXG4gICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGVcbiAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZixcbiAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGVcbiAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLlxuXG4gMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG4gICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLFxuICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlXG4gICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsXG4gICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssXG4gICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGVcbiAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpclxuICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocylcbiAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdVxuICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhXG4gICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29ya1xuICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0XG4gICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlc1xuICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZVxuICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC5cblxuIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlXG4gICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0XG4gICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3VcbiAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yXG4gICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kXG5cbiAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzXG4gICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZFxuXG4gICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzXG4gICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmRcbiAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yayxcbiAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZlxuICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kXG5cbiAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSBcIk5PVElDRVwiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0c1xuICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0XG4gICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZFxuICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3RcbiAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lXG4gICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkXG4gICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3JcbiAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsXG4gICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmRcbiAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzXG4gICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmRcbiAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb25cbiAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGVcbiAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkXG4gICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZFxuICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmRcbiAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zXG4gICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvclxuICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLFxuICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aFxuICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuXG5cbiA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsXG4gICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrXG4gICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy5cbiAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5XG4gICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWRcbiAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuXG5cbiA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlXG4gICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLFxuICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZVxuICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLlxuXG4gNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yXG4gICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaFxuICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yXG4gICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnNcbiAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBXG4gICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlXG4gICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55XG4gICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLlxuXG4gOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksXG4gICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsXG4gICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHlcbiAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZVxuICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCxcbiAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGFcbiAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlXG4gICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLFxuICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsXG4gICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvclxuICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy5cblxuIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmdcbiAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLFxuICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksXG4gICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXNcbiAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seVxuICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmXG4gICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LFxuICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eVxuICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb25cbiAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS5cblxuIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OU1xuXG4gQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLlxuXG4gICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmdcbiAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBcIltdXCJcbiAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZVxuICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlXG4gICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhXG4gICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZVxuICAgIHNhbWUgXCJwcmludGVkIHBhZ2VcIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyXG4gICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLlxuXG4gQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggR29vZ2xlLCBJbmMuLCBOZXRmbGl4LCBJbmMuLCBNaWNyb3NvZnQgQ29ycC4gYW5kIGNvbnRyaWJ1dG9yc1xuXG4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiBcblxuKi9cbi8vIG5vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikge1xuICAgIGQyLl9fcHJvdG9fXyA9IGIyO1xuICB9IHx8IGZ1bmN0aW9uKGQyLCBiMikge1xuICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdO1xuICB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5mdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7XG4gIH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgfVxuICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdO1xuICAgIHJldHVybiB0WzFdO1xuICB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odikge1xuICAgICAgcmV0dXJuIHN0ZXAoW24sIHZdKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICB5ID0gb3BbMV07XG4gICAgICAgICAgb3AgPSBbMF07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpO1xuICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCBvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkge1xuICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV07XG4gICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9wID0gWzYsIGVdO1xuICAgICAgeSA9IDA7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGYgPSB0ID0gMDtcbiAgICB9XG4gICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07XG4gICAgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cbmZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZSA9IHsgZXJyb3IgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5mdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tMiwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20yLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoYXIgfHwgIShpIGluIGZyb20yKSkge1xuICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tMiwgMCwgaSk7XG4gICAgICBhcltpXSA9IGZyb20yW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20yKSk7XG59XG5mdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5mdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0ZXAoZ1tuXSh2KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2V0dGxlKHFbMF1bM10sIGUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzdGVwKHIpIHtcbiAgICByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTtcbiAgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7XG4gICAgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpO1xuICB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7XG4gICAgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTtcbiAgfVxufVxuZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikge1xuICAgIGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHtcbiAgICBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2Mikge1xuICAgICAgcmVzb2x2ZSh7IHZhbHVlOiB2MiwgZG9uZTogZCB9KTtcbiAgICB9LCByZWplY3QpO1xuICB9XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzRnVuY3Rpb24uanNcbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9jcmVhdGVFcnJvckNsYXNzLmpzXG5mdW5jdGlvbiBjcmVhdGVFcnJvckNsYXNzKGNyZWF0ZUltcGwpIHtcbiAgdmFyIF9zdXBlciA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgRXJyb3IuY2FsbChpbnN0YW5jZSk7XG4gICAgaW5zdGFuY2Uuc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgfTtcbiAgdmFyIGN0b3JGdW5jID0gY3JlYXRlSW1wbChfc3VwZXIpO1xuICBjdG9yRnVuYy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4gIGN0b3JGdW5jLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JGdW5jO1xuICByZXR1cm4gY3RvckZ1bmM7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL1Vuc3Vic2NyaXB0aW9uRXJyb3IuanNcbnZhciBVbnN1YnNjcmlwdGlvbkVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVuc3Vic2NyaXB0aW9uRXJyb3JJbXBsKGVycm9ycykge1xuICAgIF9zdXBlcih0aGlzKTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBlcnJvcnMgPyBlcnJvcnMubGVuZ3RoICsgXCIgZXJyb3JzIG9jY3VycmVkIGR1cmluZyB1bnN1YnNjcmlwdGlvbjpcXG5cIiArIGVycm9ycy5tYXAoZnVuY3Rpb24oZXJyLCBpKSB7XG4gICAgICByZXR1cm4gaSArIDEgKyBcIikgXCIgKyBlcnIudG9TdHJpbmcoKTtcbiAgICB9KS5qb2luKFwiXFxuICBcIikgOiBcIlwiO1xuICAgIHRoaXMubmFtZSA9IFwiVW5zdWJzY3JpcHRpb25FcnJvclwiO1xuICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICB9O1xufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyclJlbW92ZS5qc1xuZnVuY3Rpb24gYXJyUmVtb3ZlKGFyciwgaXRlbSkge1xuICBpZiAoYXJyKSB7XG4gICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7XG4gICAgMCA8PSBpbmRleCAmJiBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvU3Vic2NyaXB0aW9uLmpzXG52YXIgU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIFN1YnNjcmlwdGlvbjIoaW5pdGlhbFRlYXJkb3duKSB7XG4gICAgdGhpcy5pbml0aWFsVGVhcmRvd24gPSBpbml0aWFsVGVhcmRvd247XG4gICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsO1xuICAgIHRoaXMuX2ZpbmFsaXplcnMgPSBudWxsO1xuICB9XG4gIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGVfMSwgX2EsIGVfMiwgX2I7XG4gICAgdmFyIGVycm9ycztcbiAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICAgIGlmIChfcGFyZW50YWdlKSB7XG4gICAgICAgIHRoaXMuX3BhcmVudGFnZSA9IG51bGw7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KF9wYXJlbnRhZ2UpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9wYXJlbnRhZ2VfMSA9IF9fdmFsdWVzKF9wYXJlbnRhZ2UpLCBfcGFyZW50YWdlXzFfMSA9IF9wYXJlbnRhZ2VfMS5uZXh0KCk7ICFfcGFyZW50YWdlXzFfMS5kb25lOyBfcGFyZW50YWdlXzFfMSA9IF9wYXJlbnRhZ2VfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgdmFyIHBhcmVudF8xID0gX3BhcmVudGFnZV8xXzEudmFsdWU7XG4gICAgICAgICAgICAgIHBhcmVudF8xLnJlbW92ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlXzFfMSkge1xuICAgICAgICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKF9wYXJlbnRhZ2VfMV8xICYmICFfcGFyZW50YWdlXzFfMS5kb25lICYmIChfYSA9IF9wYXJlbnRhZ2VfMS5yZXR1cm4pKSBfYS5jYWxsKF9wYXJlbnRhZ2VfMSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9wYXJlbnRhZ2UucmVtb3ZlKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgaW5pdGlhbEZpbmFsaXplciA9IHRoaXMuaW5pdGlhbFRlYXJkb3duO1xuICAgICAgaWYgKGlzRnVuY3Rpb24oaW5pdGlhbEZpbmFsaXplcikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbml0aWFsRmluYWxpemVyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBlcnJvcnMgPSBlIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvciA/IGUuZXJyb3JzIDogW2VdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX2ZpbmFsaXplcnMgPSB0aGlzLl9maW5hbGl6ZXJzO1xuICAgICAgaWYgKF9maW5hbGl6ZXJzKSB7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplcnMgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9maW5hbGl6ZXJzXzEgPSBfX3ZhbHVlcyhfZmluYWxpemVycyksIF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpOyAhX2ZpbmFsaXplcnNfMV8xLmRvbmU7IF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgZmluYWxpemVyID0gX2ZpbmFsaXplcnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZXhlY0ZpbmFsaXplcihmaW5hbGl6ZXIpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycyAhPT0gbnVsbCAmJiBlcnJvcnMgIT09IHZvaWQgMCA/IGVycm9ycyA6IFtdO1xuICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9ycyA9IF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGVycm9ycykpLCBfX3JlYWQoZXJyLmVycm9ycykpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVfMl8xKSB7XG4gICAgICAgICAgZV8yID0geyBlcnJvcjogZV8yXzEgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9maW5hbGl6ZXJzXzFfMSAmJiAhX2ZpbmFsaXplcnNfMV8xLmRvbmUgJiYgKF9iID0gX2ZpbmFsaXplcnNfMS5yZXR1cm4pKSBfYi5jYWxsKF9maW5hbGl6ZXJzXzEpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1YnNjcmlwdGlvbkVycm9yKGVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbih0ZWFyZG93bikge1xuICAgIHZhciBfYTtcbiAgICBpZiAodGVhcmRvd24gJiYgdGVhcmRvd24gIT09IHRoaXMpIHtcbiAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICBleGVjRmluYWxpemVyKHRlYXJkb3duKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0ZWFyZG93biBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbjIpIHtcbiAgICAgICAgICBpZiAodGVhcmRvd24uY2xvc2VkIHx8IHRlYXJkb3duLl9oYXNQYXJlbnQodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGVhcmRvd24uX2FkZFBhcmVudCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICAodGhpcy5fZmluYWxpemVycyA9IChfYSA9IHRoaXMuX2ZpbmFsaXplcnMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKS5wdXNoKHRlYXJkb3duKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9oYXNQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHtcbiAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICByZXR1cm4gX3BhcmVudGFnZSA9PT0gcGFyZW50IHx8IEFycmF5LmlzQXJyYXkoX3BhcmVudGFnZSkgJiYgX3BhcmVudGFnZS5pbmNsdWRlcyhwYXJlbnQpO1xuICB9O1xuICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5fYWRkUGFyZW50ID0gZnVuY3Rpb24ocGFyZW50KSB7XG4gICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7XG4gICAgdGhpcy5fcGFyZW50YWdlID0gQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSA/IChfcGFyZW50YWdlLnB1c2gocGFyZW50KSwgX3BhcmVudGFnZSkgOiBfcGFyZW50YWdlID8gW19wYXJlbnRhZ2UsIHBhcmVudF0gOiBwYXJlbnQ7XG4gIH07XG4gIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9yZW1vdmVQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHtcbiAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICBpZiAoX3BhcmVudGFnZSA9PT0gcGFyZW50KSB7XG4gICAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSkge1xuICAgICAgYXJyUmVtb3ZlKF9wYXJlbnRhZ2UsIHBhcmVudCk7XG4gICAgfVxuICB9O1xuICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbih0ZWFyZG93bikge1xuICAgIHZhciBfZmluYWxpemVycyA9IHRoaXMuX2ZpbmFsaXplcnM7XG4gICAgX2ZpbmFsaXplcnMgJiYgYXJyUmVtb3ZlKF9maW5hbGl6ZXJzLCB0ZWFyZG93bik7XG4gICAgaWYgKHRlYXJkb3duIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uMikge1xuICAgICAgdGVhcmRvd24uX3JlbW92ZVBhcmVudCh0aGlzKTtcbiAgICB9XG4gIH07XG4gIFN1YnNjcmlwdGlvbjIuRU1QVFkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZW1wdHkgPSBuZXcgU3Vic2NyaXB0aW9uMigpO1xuICAgIGVtcHR5LmNsb3NlZCA9IHRydWU7XG4gICAgcmV0dXJuIGVtcHR5O1xuICB9KCk7XG4gIHJldHVybiBTdWJzY3JpcHRpb24yO1xufSgpO1xudmFyIEVNUFRZX1NVQlNDUklQVElPTiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbmZ1bmN0aW9uIGlzU3Vic2NyaXB0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbiB8fCB2YWx1ZSAmJiBcImNsb3NlZFwiIGluIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUucmVtb3ZlKSAmJiBpc0Z1bmN0aW9uKHZhbHVlLmFkZCkgJiYgaXNGdW5jdGlvbih2YWx1ZS51bnN1YnNjcmliZSk7XG59XG5mdW5jdGlvbiBleGVjRmluYWxpemVyKGZpbmFsaXplcikge1xuICBpZiAoaXNGdW5jdGlvbihmaW5hbGl6ZXIpKSB7XG4gICAgZmluYWxpemVyKCk7XG4gIH0gZWxzZSB7XG4gICAgZmluYWxpemVyLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL2NvbmZpZy5qc1xudmFyIGNvbmZpZyA9IHtcbiAgb25VbmhhbmRsZWRFcnJvcjogbnVsbCxcbiAgb25TdG9wcGVkTm90aWZpY2F0aW9uOiBudWxsLFxuICBQcm9taXNlOiB2b2lkIDAsXG4gIHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmc6IGZhbHNlLFxuICB1c2VEZXByZWNhdGVkTmV4dENvbnRleHQ6IGZhbHNlXG59O1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL3RpbWVvdXRQcm92aWRlci5qc1xudmFyIHRpbWVvdXRQcm92aWRlciA9IHtcbiAgc2V0VGltZW91dDogZnVuY3Rpb24oaGFuZGxlciwgdGltZW91dCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGFyZ3NbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBkZWxlZ2F0ZSA9IHRpbWVvdXRQcm92aWRlci5kZWxlZ2F0ZTtcbiAgICBpZiAoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLnNldFRpbWVvdXQpIHtcbiAgICAgIHJldHVybiBkZWxlZ2F0ZS5zZXRUaW1lb3V0LmFwcGx5KGRlbGVnYXRlLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyLCB0aW1lb3V0XSwgX19yZWFkKGFyZ3MpKSk7XG4gICAgfVxuICAgIHJldHVybiBzZXRUaW1lb3V0LmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbaGFuZGxlciwgdGltZW91dF0sIF9fcmVhZChhcmdzKSkpO1xuICB9LFxuICBjbGVhclRpbWVvdXQ6IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgIHZhciBkZWxlZ2F0ZSA9IHRpbWVvdXRQcm92aWRlci5kZWxlZ2F0ZTtcbiAgICByZXR1cm4gKChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuY2xlYXJUaW1lb3V0KSB8fCBjbGVhclRpbWVvdXQpKGhhbmRsZSk7XG4gIH0sXG4gIGRlbGVnYXRlOiB2b2lkIDBcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3JlcG9ydFVuaGFuZGxlZEVycm9yLmpzXG5mdW5jdGlvbiByZXBvcnRVbmhhbmRsZWRFcnJvcihlcnIpIHtcbiAgdGltZW91dFByb3ZpZGVyLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uVW5oYW5kbGVkRXJyb3IgPSBjb25maWcub25VbmhhbmRsZWRFcnJvcjtcbiAgICBpZiAob25VbmhhbmRsZWRFcnJvcikge1xuICAgICAgb25VbmhhbmRsZWRFcnJvcihlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvbm9vcC5qc1xuZnVuY3Rpb24gbm9vcCgpIHtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL05vdGlmaWNhdGlvbkZhY3Rvcmllcy5qc1xudmFyIENPTVBMRVRFX05PVElGSUNBVElPTiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKFwiQ1wiLCB2b2lkIDAsIHZvaWQgMCk7XG59KCk7XG5mdW5jdGlvbiBlcnJvck5vdGlmaWNhdGlvbihlcnJvcikge1xuICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKFwiRVwiLCB2b2lkIDAsIGVycm9yKTtcbn1cbmZ1bmN0aW9uIG5leHROb3RpZmljYXRpb24odmFsdWUpIHtcbiAgcmV0dXJuIGNyZWF0ZU5vdGlmaWNhdGlvbihcIk5cIiwgdmFsdWUsIHZvaWQgMCk7XG59XG5mdW5jdGlvbiBjcmVhdGVOb3RpZmljYXRpb24oa2luZCwgdmFsdWUsIGVycm9yKSB7XG4gIHJldHVybiB7XG4gICAga2luZCxcbiAgICB2YWx1ZSxcbiAgICBlcnJvclxuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9lcnJvckNvbnRleHQuanNcbnZhciBjb250ZXh0ID0gbnVsbDtcbmZ1bmN0aW9uIGVycm9yQ29udGV4dChjYikge1xuICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHtcbiAgICB2YXIgaXNSb290ID0gIWNvbnRleHQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgY29udGV4dCA9IHsgZXJyb3JUaHJvd246IGZhbHNlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cbiAgICBjYigpO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHZhciBfYSA9IGNvbnRleHQsIGVycm9yVGhyb3duID0gX2EuZXJyb3JUaHJvd24sIGVycm9yID0gX2EuZXJyb3I7XG4gICAgICBjb250ZXh0ID0gbnVsbDtcbiAgICAgIGlmIChlcnJvclRocm93bikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY2IoKTtcbiAgfVxufVxuZnVuY3Rpb24gY2FwdHVyZUVycm9yKGVycikge1xuICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgJiYgY29udGV4dCkge1xuICAgIGNvbnRleHQuZXJyb3JUaHJvd24gPSB0cnVlO1xuICAgIGNvbnRleHQuZXJyb3IgPSBlcnI7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1N1YnNjcmliZXIuanNcbnZhciBTdWJzY3JpYmVyID0gZnVuY3Rpb24oX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhTdWJzY3JpYmVyMiwgX3N1cGVyKTtcbiAgZnVuY3Rpb24gU3Vic2NyaWJlcjIoZGVzdGluYXRpb24pIHtcbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgIGlmIChkZXN0aW5hdGlvbikge1xuICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICAgIGlmIChpc1N1YnNjcmlwdGlvbihkZXN0aW5hdGlvbikpIHtcbiAgICAgICAgZGVzdGluYXRpb24uYWRkKF90aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBFTVBUWV9PQlNFUlZFUjtcbiAgICB9XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIFN1YnNjcmliZXIyLmNyZWF0ZSA9IGZ1bmN0aW9uKG5leHQsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgIHJldHVybiBuZXcgU2FmZVN1YnNjcmliZXIobmV4dCwgZXJyb3IsIGNvbXBsZXRlKTtcbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmICh0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgaGFuZGxlU3RvcHBlZE5vdGlmaWNhdGlvbihuZXh0Tm90aWZpY2F0aW9uKHZhbHVlKSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX25leHQodmFsdWUpO1xuICAgIH1cbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKGVycm9yTm90aWZpY2F0aW9uKGVyciksIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICB0aGlzLl9lcnJvcihlcnIpO1xuICAgIH1cbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKENPTVBMRVRFX05PVElGSUNBVElPTiwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NvbXBsZXRlKCk7XG4gICAgfVxuICB9O1xuICBTdWJzY3JpYmVyMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICBfc3VwZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLmRlc3RpbmF0aW9uID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIFN1YnNjcmliZXIyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTtcbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH07XG4gIFN1YnNjcmliZXIyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gU3Vic2NyaWJlcjI7XG59KFN1YnNjcmlwdGlvbik7XG52YXIgX2JpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDtcbmZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIF9iaW5kLmNhbGwoZm4sIHRoaXNBcmcpO1xufVxudmFyIENvbnN1bWVyT2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gQ29uc3VtZXJPYnNlcnZlcjIocGFydGlhbE9ic2VydmVyKSB7XG4gICAgdGhpcy5wYXJ0aWFsT2JzZXJ2ZXIgPSBwYXJ0aWFsT2JzZXJ2ZXI7XG4gIH1cbiAgQ29uc3VtZXJPYnNlcnZlcjIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAocGFydGlhbE9ic2VydmVyLm5leHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnRpYWxPYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIENvbnN1bWVyT2JzZXJ2ZXIyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAocGFydGlhbE9ic2VydmVyLmVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyKTtcbiAgICB9XG4gIH07XG4gIENvbnN1bWVyT2JzZXJ2ZXIyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAocGFydGlhbE9ic2VydmVyLmNvbXBsZXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBDb25zdW1lck9ic2VydmVyMjtcbn0oKTtcbnZhciBTYWZlU3Vic2NyaWJlciA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoU2FmZVN1YnNjcmliZXIyLCBfc3VwZXIpO1xuICBmdW5jdGlvbiBTYWZlU3Vic2NyaWJlcjIob2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgdmFyIHBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAoaXNGdW5jdGlvbihvYnNlcnZlck9yTmV4dCkgfHwgIW9ic2VydmVyT3JOZXh0KSB7XG4gICAgICBwYXJ0aWFsT2JzZXJ2ZXIgPSB7XG4gICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0ICE9PSBudWxsICYmIG9ic2VydmVyT3JOZXh0ICE9PSB2b2lkIDAgPyBvYnNlcnZlck9yTmV4dCA6IHZvaWQgMCxcbiAgICAgICAgZXJyb3I6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6IHZvaWQgMCxcbiAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlICE9PSBudWxsICYmIGNvbXBsZXRlICE9PSB2b2lkIDAgPyBjb21wbGV0ZSA6IHZvaWQgMFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbnRleHRfMTtcbiAgICAgIGlmIChfdGhpcyAmJiBjb25maWcudXNlRGVwcmVjYXRlZE5leHRDb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHRfMSA9IE9iamVjdC5jcmVhdGUob2JzZXJ2ZXJPck5leHQpO1xuICAgICAgICBjb250ZXh0XzEudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgcGFydGlhbE9ic2VydmVyID0ge1xuICAgICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0Lm5leHQgJiYgYmluZChvYnNlcnZlck9yTmV4dC5uZXh0LCBjb250ZXh0XzEpLFxuICAgICAgICAgIGVycm9yOiBvYnNlcnZlck9yTmV4dC5lcnJvciAmJiBiaW5kKG9ic2VydmVyT3JOZXh0LmVycm9yLCBjb250ZXh0XzEpLFxuICAgICAgICAgIGNvbXBsZXRlOiBvYnNlcnZlck9yTmV4dC5jb21wbGV0ZSAmJiBiaW5kKG9ic2VydmVyT3JOZXh0LmNvbXBsZXRlLCBjb250ZXh0XzEpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIgPSBvYnNlcnZlck9yTmV4dDtcbiAgICAgIH1cbiAgICB9XG4gICAgX3RoaXMuZGVzdGluYXRpb24gPSBuZXcgQ29uc3VtZXJPYnNlcnZlcihwYXJ0aWFsT2JzZXJ2ZXIpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICByZXR1cm4gU2FmZVN1YnNjcmliZXIyO1xufShTdWJzY3JpYmVyKTtcbmZ1bmN0aW9uIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKSB7XG4gIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykge1xuICAgIGNhcHR1cmVFcnJvcihlcnJvcik7XG4gIH0gZWxzZSB7XG4gICAgcmVwb3J0VW5oYW5kbGVkRXJyb3IoZXJyb3IpO1xuICB9XG59XG5mdW5jdGlvbiBkZWZhdWx0RXJyb3JIYW5kbGVyKGVycikge1xuICB0aHJvdyBlcnI7XG59XG5mdW5jdGlvbiBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgc3Vic2NyaWJlcikge1xuICB2YXIgb25TdG9wcGVkTm90aWZpY2F0aW9uID0gY29uZmlnLm9uU3RvcHBlZE5vdGlmaWNhdGlvbjtcbiAgb25TdG9wcGVkTm90aWZpY2F0aW9uICYmIHRpbWVvdXRQcm92aWRlci5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBvblN0b3BwZWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBzdWJzY3JpYmVyKTtcbiAgfSk7XG59XG52YXIgRU1QVFlfT0JTRVJWRVIgPSB7XG4gIGNsb3NlZDogdHJ1ZSxcbiAgbmV4dDogbm9vcCxcbiAgZXJyb3I6IGRlZmF1bHRFcnJvckhhbmRsZXIsXG4gIGNvbXBsZXRlOiBub29wXG59O1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc3ltYm9sL29ic2VydmFibGUuanNcbnZhciBvYnNlcnZhYmxlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm9ic2VydmFibGUgfHwgXCJAQG9ic2VydmFibGVcIjtcbn0oKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaWRlbnRpdHkuanNcbmZ1bmN0aW9uIGlkZW50aXR5KHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3BpcGUuanNcbmZ1bmN0aW9uIHBpcGUoKSB7XG4gIHZhciBmbnMgPSBbXTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBmbnNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICByZXR1cm4gcGlwZUZyb21BcnJheShmbnMpO1xufVxuZnVuY3Rpb24gcGlwZUZyb21BcnJheShmbnMpIHtcbiAgaWYgKGZucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgaWYgKGZucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZm5zWzBdO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBwaXBlZChpbnB1dCkge1xuICAgIHJldHVybiBmbnMucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGZuKSB7XG4gICAgICByZXR1cm4gZm4ocHJldik7XG4gICAgfSwgaW5wdXQpO1xuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvT2JzZXJ2YWJsZS5qc1xudmFyIE9ic2VydmFibGUgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gT2JzZXJ2YWJsZTIoc3Vic2NyaWJlKSB7XG4gICAgaWYgKHN1YnNjcmliZSkge1xuICAgICAgdGhpcy5fc3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgIH1cbiAgfVxuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUubGlmdCA9IGZ1bmN0aW9uKG9wZXJhdG9yKSB7XG4gICAgdmFyIG9ic2VydmFibGUyID0gbmV3IE9ic2VydmFibGUyKCk7XG4gICAgb2JzZXJ2YWJsZTIuc291cmNlID0gdGhpcztcbiAgICBvYnNlcnZhYmxlMi5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgIHJldHVybiBvYnNlcnZhYmxlMjtcbiAgfTtcbiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLnN1YnNjcmliZSA9IGZ1bmN0aW9uKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBzdWJzY3JpYmVyID0gaXNTdWJzY3JpYmVyKG9ic2VydmVyT3JOZXh0KSA/IG9ic2VydmVyT3JOZXh0IDogbmV3IFNhZmVTdWJzY3JpYmVyKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpO1xuICAgIGVycm9yQ29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBfYSA9IF90aGlzLCBvcGVyYXRvciA9IF9hLm9wZXJhdG9yLCBzb3VyY2UgPSBfYS5zb3VyY2U7XG4gICAgICBzdWJzY3JpYmVyLmFkZChvcGVyYXRvciA/IG9wZXJhdG9yLmNhbGwoc3Vic2NyaWJlciwgc291cmNlKSA6IHNvdXJjZSA/IF90aGlzLl9zdWJzY3JpYmUoc3Vic2NyaWJlcikgOiBfdGhpcy5fdHJ5U3Vic2NyaWJlKHN1YnNjcmliZXIpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3Vic2NyaWJlcjtcbiAgfTtcbiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLl90cnlTdWJzY3JpYmUgPSBmdW5jdGlvbihzaW5rKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpYmUoc2luayk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzaW5rLmVycm9yKGVycik7XG4gICAgfVxuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKG5leHQsIHByb21pc2VDdG9yKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBwcm9taXNlQ3RvciA9IGdldFByb21pc2VDdG9yKHByb21pc2VDdG9yKTtcbiAgICByZXR1cm4gbmV3IHByb21pc2VDdG9yKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHN1YnNjcmliZXIgPSBuZXcgU2FmZVN1YnNjcmliZXIoe1xuICAgICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXh0KHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IHJlamVjdCxcbiAgICAgICAgY29tcGxldGU6IHJlc29sdmVcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIH0pO1xuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IHRoaXMuc291cmNlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGVbb2JzZXJ2YWJsZV0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3BlcmF0aW9ucyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBvcGVyYXRpb25zW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHJldHVybiBwaXBlRnJvbUFycmF5KG9wZXJhdGlvbnMpKHRoaXMpO1xuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUudG9Qcm9taXNlID0gZnVuY3Rpb24ocHJvbWlzZUN0b3IpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHByb21pc2VDdG9yID0gZ2V0UHJvbWlzZUN0b3IocHJvbWlzZUN0b3IpO1xuICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICBfdGhpcy5zdWJzY3JpYmUoZnVuY3Rpb24oeCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPSB4O1xuICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgT2JzZXJ2YWJsZTIuY3JlYXRlID0gZnVuY3Rpb24oc3Vic2NyaWJlKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlMihzdWJzY3JpYmUpO1xuICB9O1xuICByZXR1cm4gT2JzZXJ2YWJsZTI7XG59KCk7XG5mdW5jdGlvbiBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3Rvcikge1xuICB2YXIgX2E7XG4gIHJldHVybiAoX2EgPSBwcm9taXNlQ3RvciAhPT0gbnVsbCAmJiBwcm9taXNlQ3RvciAhPT0gdm9pZCAwID8gcHJvbWlzZUN0b3IgOiBjb25maWcuUHJvbWlzZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGlzT2JzZXJ2ZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUubmV4dCkgJiYgaXNGdW5jdGlvbih2YWx1ZS5lcnJvcikgJiYgaXNGdW5jdGlvbih2YWx1ZS5jb21wbGV0ZSk7XG59XG5mdW5jdGlvbiBpc1N1YnNjcmliZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgU3Vic2NyaWJlciB8fCBpc09ic2VydmVyKHZhbHVlKSAmJiBpc1N1YnNjcmlwdGlvbih2YWx1ZSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2xpZnQuanNcbmZ1bmN0aW9uIGhhc0xpZnQoc291cmNlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHNvdXJjZSA9PT0gbnVsbCB8fCBzb3VyY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNvdXJjZS5saWZ0KTtcbn1cbmZ1bmN0aW9uIG9wZXJhdGUoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7XG4gICAgaWYgKGhhc0xpZnQoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KGZ1bmN0aW9uKGxpZnRlZFNvdXJjZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBpbml0KGxpZnRlZFNvdXJjZSwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMuZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmFibGUgdG8gbGlmdCB1bmtub3duIE9ic2VydmFibGUgdHlwZVwiKTtcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9PcGVyYXRvclN1YnNjcmliZXIuanNcbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgb25OZXh0LCBvbkNvbXBsZXRlLCBvbkVycm9yLCBvbkZpbmFsaXplKSB7XG4gIHJldHVybiBuZXcgT3BlcmF0b3JTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBvbk5leHQsIG9uQ29tcGxldGUsIG9uRXJyb3IsIG9uRmluYWxpemUpO1xufVxudmFyIE9wZXJhdG9yU3Vic2NyaWJlciA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoT3BlcmF0b3JTdWJzY3JpYmVyMiwgX3N1cGVyKTtcbiAgZnVuY3Rpb24gT3BlcmF0b3JTdWJzY3JpYmVyMihkZXN0aW5hdGlvbiwgb25OZXh0LCBvbkNvbXBsZXRlLCBvbkVycm9yLCBvbkZpbmFsaXplLCBzaG91bGRVbnN1YnNjcmliZSkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKSB8fCB0aGlzO1xuICAgIF90aGlzLm9uRmluYWxpemUgPSBvbkZpbmFsaXplO1xuICAgIF90aGlzLnNob3VsZFVuc3Vic2NyaWJlID0gc2hvdWxkVW5zdWJzY3JpYmU7XG4gICAgX3RoaXMuX25leHQgPSBvbk5leHQgPyBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb25OZXh0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9uZXh0O1xuICAgIF90aGlzLl9lcnJvciA9IG9uRXJyb3IgPyBmdW5jdGlvbihlcnIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgIH0gY2F0Y2ggKGVycjIpIHtcbiAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyMik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfSA6IF9zdXBlci5wcm90b3R5cGUuX2Vycm9yO1xuICAgIF90aGlzLl9jb21wbGV0ZSA9IG9uQ29tcGxldGUgPyBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9uQ29tcGxldGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9jb21wbGV0ZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgT3BlcmF0b3JTdWJzY3JpYmVyMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKCF0aGlzLnNob3VsZFVuc3Vic2NyaWJlIHx8IHRoaXMuc2hvdWxkVW5zdWJzY3JpYmUoKSkge1xuICAgICAgdmFyIGNsb3NlZF8xID0gdGhpcy5jbG9zZWQ7XG4gICAgICBfc3VwZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyk7XG4gICAgICAhY2xvc2VkXzEgJiYgKChfYSA9IHRoaXMub25GaW5hbGl6ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodGhpcykpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIE9wZXJhdG9yU3Vic2NyaWJlcjI7XG59KFN1YnNjcmliZXIpO1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9PYmplY3RVbnN1YnNjcmliZWRFcnJvci5qc1xudmFyIE9iamVjdFVuc3Vic2NyaWJlZEVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIE9iamVjdFVuc3Vic2NyaWJlZEVycm9ySW1wbCgpIHtcbiAgICBfc3VwZXIodGhpcyk7XG4gICAgdGhpcy5uYW1lID0gXCJPYmplY3RVbnN1YnNjcmliZWRFcnJvclwiO1xuICAgIHRoaXMubWVzc2FnZSA9IFwib2JqZWN0IHVuc3Vic2NyaWJlZFwiO1xuICB9O1xufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9TdWJqZWN0LmpzXG52YXIgU3ViamVjdCA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoU3ViamVjdDIsIF9zdXBlcik7XG4gIGZ1bmN0aW9uIFN1YmplY3QyKCkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgX3RoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgX3RoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7XG4gICAgX3RoaXMub2JzZXJ2ZXJzID0gW107XG4gICAgX3RoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgX3RoaXMuaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBfdGhpcy50aHJvd25FcnJvciA9IG51bGw7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIFN1YmplY3QyLnByb3RvdHlwZS5saWZ0ID0gZnVuY3Rpb24ob3BlcmF0b3IpIHtcbiAgICB2YXIgc3ViamVjdCA9IG5ldyBBbm9ueW1vdXNTdWJqZWN0KHRoaXMsIHRoaXMpO1xuICAgIHN1YmplY3Qub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICByZXR1cm4gc3ViamVjdDtcbiAgfTtcbiAgU3ViamVjdDIucHJvdG90eXBlLl90aHJvd0lmQ2xvc2VkID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTtcbiAgICB9XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIGVycm9yQ29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICAgIGlmICghX3RoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIGlmICghX3RoaXMuY3VycmVudE9ic2VydmVycykge1xuICAgICAgICAgIF90aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBBcnJheS5mcm9tKF90aGlzLm9ic2VydmVycyk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKF90aGlzLmN1cnJlbnRPYnNlcnZlcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZV8xXzEpIHtcbiAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgU3ViamVjdDIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5fdGhyb3dJZkNsb3NlZCgpO1xuICAgICAgaWYgKCFfdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgX3RoaXMuaGFzRXJyb3IgPSBfdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICBfdGhpcy50aHJvd25FcnJvciA9IGVycjtcbiAgICAgICAgdmFyIG9ic2VydmVycyA9IF90aGlzLm9ic2VydmVycztcbiAgICAgICAgd2hpbGUgKG9ic2VydmVycy5sZW5ndGgpIHtcbiAgICAgICAgICBvYnNlcnZlcnMuc2hpZnQoKS5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgZXJyb3JDb250ZXh0KGZ1bmN0aW9uKCkge1xuICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICAgIGlmICghX3RoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIF90aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHZhciBvYnNlcnZlcnMgPSBfdGhpcy5vYnNlcnZlcnM7XG4gICAgICAgIHdoaWxlIChvYnNlcnZlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgb2JzZXJ2ZXJzLnNoaWZ0KCkuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBTdWJqZWN0Mi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlzU3RvcHBlZCA9IHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLm9ic2VydmVycyA9IHRoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdWJqZWN0Mi5wcm90b3R5cGUsIFwib2JzZXJ2ZWRcIiwge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgX2E7XG4gICAgICByZXR1cm4gKChfYSA9IHRoaXMub2JzZXJ2ZXJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKSA+IDA7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIFN1YmplY3QyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlLmNhbGwodGhpcywgc3Vic2NyaWJlcik7XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICB0aGlzLl9jaGVja0ZpbmFsaXplZFN0YXR1c2VzKHN1YnNjcmliZXIpO1xuICAgIHJldHVybiB0aGlzLl9pbm5lclN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgfTtcbiAgU3ViamVjdDIucHJvdG90eXBlLl9pbm5lclN1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBfYSA9IHRoaXMsIGhhc0Vycm9yID0gX2EuaGFzRXJyb3IsIGlzU3RvcHBlZCA9IF9hLmlzU3RvcHBlZCwgb2JzZXJ2ZXJzID0gX2Eub2JzZXJ2ZXJzO1xuICAgIGlmIChoYXNFcnJvciB8fCBpc1N0b3BwZWQpIHtcbiAgICAgIHJldHVybiBFTVBUWV9TVUJTQ1JJUFRJT047XG4gICAgfVxuICAgIHRoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7XG4gICAgb2JzZXJ2ZXJzLnB1c2goc3Vic2NyaWJlcik7XG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDtcbiAgICAgIGFyclJlbW92ZShvYnNlcnZlcnMsIHN1YnNjcmliZXIpO1xuICAgIH0pO1xuICB9O1xuICBTdWJqZWN0Mi5wcm90b3R5cGUuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIF9hID0gdGhpcywgaGFzRXJyb3IgPSBfYS5oYXNFcnJvciwgdGhyb3duRXJyb3IgPSBfYS50aHJvd25FcnJvciwgaXNTdG9wcGVkID0gX2EuaXNTdG9wcGVkO1xuICAgIGlmIChoYXNFcnJvcikge1xuICAgICAgc3Vic2NyaWJlci5lcnJvcih0aHJvd25FcnJvcik7XG4gICAgfSBlbHNlIGlmIChpc1N0b3BwZWQpIHtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5hc09ic2VydmFibGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JzZXJ2YWJsZTIgPSBuZXcgT2JzZXJ2YWJsZSgpO1xuICAgIG9ic2VydmFibGUyLnNvdXJjZSA9IHRoaXM7XG4gICAgcmV0dXJuIG9ic2VydmFibGUyO1xuICB9O1xuICBTdWJqZWN0Mi5jcmVhdGUgPSBmdW5jdGlvbihkZXN0aW5hdGlvbiwgc291cmNlKSB7XG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNTdWJqZWN0KGRlc3RpbmF0aW9uLCBzb3VyY2UpO1xuICB9O1xuICByZXR1cm4gU3ViamVjdDI7XG59KE9ic2VydmFibGUpO1xudmFyIEFub255bW91c1N1YmplY3QgPSBmdW5jdGlvbihfc3VwZXIpIHtcbiAgX19leHRlbmRzKEFub255bW91c1N1YmplY3QyLCBfc3VwZXIpO1xuICBmdW5jdGlvbiBBbm9ueW1vdXNTdWJqZWN0MihkZXN0aW5hdGlvbiwgc291cmNlKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICBfdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuICAgIF90aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgKF9iID0gKF9hID0gdGhpcy5kZXN0aW5hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5leHQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCB2YWx1ZSk7XG4gIH07XG4gIEFub255bW91c1N1YmplY3QyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICAgIHZhciBfYSwgX2I7XG4gICAgKF9iID0gKF9hID0gdGhpcy5kZXN0aW5hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVycm9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgZXJyKTtcbiAgfTtcbiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICAoX2IgPSAoX2EgPSB0aGlzLmRlc3RpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29tcGxldGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hKTtcbiAgfTtcbiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5zb3VyY2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdWJzY3JpYmUoc3Vic2NyaWJlcikpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IEVNUFRZX1NVQlNDUklQVElPTjtcbiAgfTtcbiAgcmV0dXJuIEFub255bW91c1N1YmplY3QyO1xufShTdWJqZWN0KTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9kYXRlVGltZXN0YW1wUHJvdmlkZXIuanNcbnZhciBkYXRlVGltZXN0YW1wUHJvdmlkZXIgPSB7XG4gIG5vdzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIChkYXRlVGltZXN0YW1wUHJvdmlkZXIuZGVsZWdhdGUgfHwgRGF0ZSkubm93KCk7XG4gIH0sXG4gIGRlbGVnYXRlOiB2b2lkIDBcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9SZXBsYXlTdWJqZWN0LmpzXG52YXIgUmVwbGF5U3ViamVjdCA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoUmVwbGF5U3ViamVjdDIsIF9zdXBlcik7XG4gIGZ1bmN0aW9uIFJlcGxheVN1YmplY3QyKF9idWZmZXJTaXplLCBfd2luZG93VGltZSwgX3RpbWVzdGFtcFByb3ZpZGVyKSB7XG4gICAgaWYgKF9idWZmZXJTaXplID09PSB2b2lkIDApIHtcbiAgICAgIF9idWZmZXJTaXplID0gSW5maW5pdHk7XG4gICAgfVxuICAgIGlmIChfd2luZG93VGltZSA9PT0gdm9pZCAwKSB7XG4gICAgICBfd2luZG93VGltZSA9IEluZmluaXR5O1xuICAgIH1cbiAgICBpZiAoX3RpbWVzdGFtcFByb3ZpZGVyID09PSB2b2lkIDApIHtcbiAgICAgIF90aW1lc3RhbXBQcm92aWRlciA9IGRhdGVUaW1lc3RhbXBQcm92aWRlcjtcbiAgICB9XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICBfdGhpcy5fYnVmZmVyU2l6ZSA9IF9idWZmZXJTaXplO1xuICAgIF90aGlzLl93aW5kb3dUaW1lID0gX3dpbmRvd1RpbWU7XG4gICAgX3RoaXMuX3RpbWVzdGFtcFByb3ZpZGVyID0gX3RpbWVzdGFtcFByb3ZpZGVyO1xuICAgIF90aGlzLl9idWZmZXIgPSBbXTtcbiAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gdHJ1ZTtcbiAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gX3dpbmRvd1RpbWUgPT09IEluZmluaXR5O1xuICAgIF90aGlzLl9idWZmZXJTaXplID0gTWF0aC5tYXgoMSwgX2J1ZmZlclNpemUpO1xuICAgIF90aGlzLl93aW5kb3dUaW1lID0gTWF0aC5tYXgoMSwgX3dpbmRvd1RpbWUpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBSZXBsYXlTdWJqZWN0Mi5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIF9hID0gdGhpcywgaXNTdG9wcGVkID0gX2EuaXNTdG9wcGVkLCBfYnVmZmVyID0gX2EuX2J1ZmZlciwgX2luZmluaXRlVGltZVdpbmRvdyA9IF9hLl9pbmZpbml0ZVRpbWVXaW5kb3csIF90aW1lc3RhbXBQcm92aWRlciA9IF9hLl90aW1lc3RhbXBQcm92aWRlciwgX3dpbmRvd1RpbWUgPSBfYS5fd2luZG93VGltZTtcbiAgICBpZiAoIWlzU3RvcHBlZCkge1xuICAgICAgX2J1ZmZlci5wdXNoKHZhbHVlKTtcbiAgICAgICFfaW5maW5pdGVUaW1lV2luZG93ICYmIF9idWZmZXIucHVzaChfdGltZXN0YW1wUHJvdmlkZXIubm93KCkgKyBfd2luZG93VGltZSk7XG4gICAgfVxuICAgIHRoaXMuX3RyaW1CdWZmZXIoKTtcbiAgICBfc3VwZXIucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gIH07XG4gIFJlcGxheVN1YmplY3QyLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICB0aGlzLl90cmltQnVmZmVyKCk7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuX2lubmVyU3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIHZhciBfYSA9IHRoaXMsIF9pbmZpbml0ZVRpbWVXaW5kb3cgPSBfYS5faW5maW5pdGVUaW1lV2luZG93LCBfYnVmZmVyID0gX2EuX2J1ZmZlcjtcbiAgICB2YXIgY29weSA9IF9idWZmZXIuc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcHkubGVuZ3RoICYmICFzdWJzY3JpYmVyLmNsb3NlZDsgaSArPSBfaW5maW5pdGVUaW1lV2luZG93ID8gMSA6IDIpIHtcbiAgICAgIHN1YnNjcmliZXIubmV4dChjb3B5W2ldKTtcbiAgICB9XG4gICAgdGhpcy5fY2hlY2tGaW5hbGl6ZWRTdGF0dXNlcyhzdWJzY3JpYmVyKTtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICB9O1xuICBSZXBsYXlTdWJqZWN0Mi5wcm90b3R5cGUuX3RyaW1CdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX2EgPSB0aGlzLCBfYnVmZmVyU2l6ZSA9IF9hLl9idWZmZXJTaXplLCBfdGltZXN0YW1wUHJvdmlkZXIgPSBfYS5fdGltZXN0YW1wUHJvdmlkZXIsIF9idWZmZXIgPSBfYS5fYnVmZmVyLCBfaW5maW5pdGVUaW1lV2luZG93ID0gX2EuX2luZmluaXRlVGltZVdpbmRvdztcbiAgICB2YXIgYWRqdXN0ZWRCdWZmZXJTaXplID0gKF9pbmZpbml0ZVRpbWVXaW5kb3cgPyAxIDogMikgKiBfYnVmZmVyU2l6ZTtcbiAgICBfYnVmZmVyU2l6ZSA8IEluZmluaXR5ICYmIGFkanVzdGVkQnVmZmVyU2l6ZSA8IF9idWZmZXIubGVuZ3RoICYmIF9idWZmZXIuc3BsaWNlKDAsIF9idWZmZXIubGVuZ3RoIC0gYWRqdXN0ZWRCdWZmZXJTaXplKTtcbiAgICBpZiAoIV9pbmZpbml0ZVRpbWVXaW5kb3cpIHtcbiAgICAgIHZhciBub3cgPSBfdGltZXN0YW1wUHJvdmlkZXIubm93KCk7XG4gICAgICB2YXIgbGFzdDIgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBfYnVmZmVyLmxlbmd0aCAmJiBfYnVmZmVyW2ldIDw9IG5vdzsgaSArPSAyKSB7XG4gICAgICAgIGxhc3QyID0gaTtcbiAgICAgIH1cbiAgICAgIGxhc3QyICYmIF9idWZmZXIuc3BsaWNlKDAsIGxhc3QyICsgMSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gUmVwbGF5U3ViamVjdDI7XG59KFN1YmplY3QpO1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FjdGlvbi5qc1xudmFyIEFjdGlvbiA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQWN0aW9uMiwgX3N1cGVyKTtcbiAgZnVuY3Rpb24gQWN0aW9uMihzY2hlZHVsZXIsIHdvcmspIHtcbiAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgfVxuICBBY3Rpb24yLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKHN0YXRlLCBkZWxheTIpIHtcbiAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHtcbiAgICAgIGRlbGF5MiA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICByZXR1cm4gQWN0aW9uMjtcbn0oU3Vic2NyaXB0aW9uKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9pbnRlcnZhbFByb3ZpZGVyLmpzXG52YXIgaW50ZXJ2YWxQcm92aWRlciA9IHtcbiAgc2V0SW50ZXJ2YWw6IGZ1bmN0aW9uKGhhbmRsZXIsIHRpbWVvdXQpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgZGVsZWdhdGUgPSBpbnRlcnZhbFByb3ZpZGVyLmRlbGVnYXRlO1xuICAgIGlmIChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuc2V0SW50ZXJ2YWwpIHtcbiAgICAgIHJldHVybiBkZWxlZ2F0ZS5zZXRJbnRlcnZhbC5hcHBseShkZWxlZ2F0ZSwgX19zcHJlYWRBcnJheShbaGFuZGxlciwgdGltZW91dF0sIF9fcmVhZChhcmdzKSkpO1xuICAgIH1cbiAgICByZXR1cm4gc2V0SW50ZXJ2YWwuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyLCB0aW1lb3V0XSwgX19yZWFkKGFyZ3MpKSk7XG4gIH0sXG4gIGNsZWFySW50ZXJ2YWw6IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgIHZhciBkZWxlZ2F0ZSA9IGludGVydmFsUHJvdmlkZXIuZGVsZWdhdGU7XG4gICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLmNsZWFySW50ZXJ2YWwpIHx8IGNsZWFySW50ZXJ2YWwpKGhhbmRsZSk7XG4gIH0sXG4gIGRlbGVnYXRlOiB2b2lkIDBcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQXN5bmNBY3Rpb24uanNcbnZhciBBc3luY0FjdGlvbiA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQXN5bmNBY3Rpb24yLCBfc3VwZXIpO1xuICBmdW5jdGlvbiBBc3luY0FjdGlvbjIoc2NoZWR1bGVyLCB3b3JrKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyLCB3b3JrKSB8fCB0aGlzO1xuICAgIF90aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICBfdGhpcy53b3JrID0gd29yaztcbiAgICBfdGhpcy5wZW5kaW5nID0gZmFsc2U7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIEFzeW5jQWN0aW9uMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbihzdGF0ZSwgZGVsYXkyKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkge1xuICAgICAgZGVsYXkyID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHZhciBpZCA9IHRoaXMuaWQ7XG4gICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyO1xuICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheTIpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZGVsYXkgPSBkZWxheTI7XG4gICAgdGhpcy5pZCA9IChfYSA9IHRoaXMuaWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMucmVxdWVzdEFzeW5jSWQoc2NoZWR1bGVyLCB0aGlzLmlkLCBkZWxheTIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBBc3luY0FjdGlvbjIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBfaWQsIGRlbGF5Mikge1xuICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkge1xuICAgICAgZGVsYXkyID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGludGVydmFsUHJvdmlkZXIuc2V0SW50ZXJ2YWwoc2NoZWR1bGVyLmZsdXNoLmJpbmQoc2NoZWR1bGVyLCB0aGlzKSwgZGVsYXkyKTtcbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uKF9zY2hlZHVsZXIsIGlkLCBkZWxheTIpIHtcbiAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHtcbiAgICAgIGRlbGF5MiA9IDA7XG4gICAgfVxuICAgIGlmIChkZWxheTIgIT0gbnVsbCAmJiB0aGlzLmRlbGF5ID09PSBkZWxheTIgJiYgdGhpcy5wZW5kaW5nID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgaW50ZXJ2YWxQcm92aWRlci5jbGVhckludGVydmFsKGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24oc3RhdGUsIGRlbGF5Mikge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcihcImV4ZWN1dGluZyBhIGNhbmNlbGxlZCBhY3Rpb25cIik7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZyA9IGZhbHNlO1xuICAgIHZhciBlcnJvciA9IHRoaXMuX2V4ZWN1dGUoc3RhdGUsIGRlbGF5Mik7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBlbmRpbmcgPT09IGZhbHNlICYmIHRoaXMuaWQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQodGhpcy5zY2hlZHVsZXIsIHRoaXMuaWQsIG51bGwpO1xuICAgIH1cbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5fZXhlY3V0ZSA9IGZ1bmN0aW9uKHN0YXRlLCBfZGVsYXkpIHtcbiAgICB2YXIgZXJyb3JlZCA9IGZhbHNlO1xuICAgIHZhciBlcnJvclZhbHVlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLndvcmsoc3RhdGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yZWQgPSB0cnVlO1xuICAgICAgZXJyb3JWYWx1ZSA9IGUgPyBlIDogbmV3IEVycm9yKFwiU2NoZWR1bGVkIGFjdGlvbiB0aHJldyBmYWxzeSBlcnJvclwiKTtcbiAgICB9XG4gICAgaWYgKGVycm9yZWQpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIHJldHVybiBlcnJvclZhbHVlO1xuICAgIH1cbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgIHZhciBfYSA9IHRoaXMsIGlkID0gX2EuaWQsIHNjaGVkdWxlciA9IF9hLnNjaGVkdWxlcjtcbiAgICAgIHZhciBhY3Rpb25zID0gc2NoZWR1bGVyLmFjdGlvbnM7XG4gICAgICB0aGlzLndvcmsgPSB0aGlzLnN0YXRlID0gdGhpcy5zY2hlZHVsZXIgPSBudWxsO1xuICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XG4gICAgICBhcnJSZW1vdmUoYWN0aW9ucywgdGhpcyk7XG4gICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVsYXkgPSBudWxsO1xuICAgICAgX3N1cGVyLnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIEFzeW5jQWN0aW9uMjtcbn0oQWN0aW9uKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1NjaGVkdWxlci5qc1xudmFyIFNjaGVkdWxlciA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBTY2hlZHVsZXIyKHNjaGVkdWxlckFjdGlvbkN0b3IsIG5vdykge1xuICAgIGlmIChub3cgPT09IHZvaWQgMCkge1xuICAgICAgbm93ID0gU2NoZWR1bGVyMi5ub3c7XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3RvciA9IHNjaGVkdWxlckFjdGlvbkN0b3I7XG4gICAgdGhpcy5ub3cgPSBub3c7XG4gIH1cbiAgU2NoZWR1bGVyMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbih3b3JrLCBkZWxheTIsIHN0YXRlKSB7XG4gICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWxheTIgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3Rvcih0aGlzLCB3b3JrKS5zY2hlZHVsZShzdGF0ZSwgZGVsYXkyKTtcbiAgfTtcbiAgU2NoZWR1bGVyMi5ub3cgPSBkYXRlVGltZXN0YW1wUHJvdmlkZXIubm93O1xuICByZXR1cm4gU2NoZWR1bGVyMjtcbn0oKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9Bc3luY1NjaGVkdWxlci5qc1xudmFyIEFzeW5jU2NoZWR1bGVyID0gZnVuY3Rpb24oX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhBc3luY1NjaGVkdWxlcjIsIF9zdXBlcik7XG4gIGZ1bmN0aW9uIEFzeW5jU2NoZWR1bGVyMihTY2hlZHVsZXJBY3Rpb24sIG5vdykge1xuICAgIGlmIChub3cgPT09IHZvaWQgMCkge1xuICAgICAgbm93ID0gU2NoZWR1bGVyLm5vdztcbiAgICB9XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgU2NoZWR1bGVyQWN0aW9uLCBub3cpIHx8IHRoaXM7XG4gICAgX3RoaXMuYWN0aW9ucyA9IFtdO1xuICAgIF90aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgQXN5bmNTY2hlZHVsZXIyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKGFjdGlvbikge1xuICAgIHZhciBhY3Rpb25zID0gdGhpcy5hY3Rpb25zO1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZXJyb3I7XG4gICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICBkbyB7XG4gICAgICBpZiAoZXJyb3IgPSBhY3Rpb24uZXhlY3V0ZShhY3Rpb24uc3RhdGUsIGFjdGlvbi5kZWxheSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKTtcbiAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpIHtcbiAgICAgICAgYWN0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG4gIHJldHVybiBBc3luY1NjaGVkdWxlcjI7XG59KFNjaGVkdWxlcik7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvYXN5bmMuanNcbnZhciBhc3luY1NjaGVkdWxlciA9IG5ldyBBc3luY1NjaGVkdWxlcihBc3luY0FjdGlvbik7XG52YXIgYXN5bmMgPSBhc3luY1NjaGVkdWxlcjtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZW1wdHkuanNcbnZhciBFTVBUWSA9IG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbn0pO1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1NjaGVkdWxlci5qc1xuZnVuY3Rpb24gaXNTY2hlZHVsZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUuc2NoZWR1bGUpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9hcmdzLmpzXG5mdW5jdGlvbiBsYXN0KGFycikge1xuICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbn1cbmZ1bmN0aW9uIHBvcFJlc3VsdFNlbGVjdG9yKGFyZ3MpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24obGFzdChhcmdzKSkgPyBhcmdzLnBvcCgpIDogdm9pZCAwO1xufVxuZnVuY3Rpb24gcG9wU2NoZWR1bGVyKGFyZ3MpIHtcbiAgcmV0dXJuIGlzU2NoZWR1bGVyKGxhc3QoYXJncykpID8gYXJncy5wb3AoKSA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHBvcE51bWJlcihhcmdzLCBkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiBsYXN0KGFyZ3MpID09PSBcIm51bWJlclwiID8gYXJncy5wb3AoKSA6IGRlZmF1bHRWYWx1ZTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNBcnJheUxpa2UuanNcbnZhciBpc0FycmF5TGlrZSA9IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHggJiYgdHlwZW9mIHgubGVuZ3RoID09PSBcIm51bWJlclwiICYmIHR5cGVvZiB4ICE9PSBcImZ1bmN0aW9uXCI7XG59O1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1Byb21pc2UuanNcbmZ1bmN0aW9uIGlzUHJvbWlzZSh2YWx1ZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmFsdWUudGhlbik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzSW50ZXJvcE9ic2VydmFibGUuanNcbmZ1bmN0aW9uIGlzSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24oaW5wdXRbb2JzZXJ2YWJsZV0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0FzeW5jSXRlcmFibGUuanNcbmZ1bmN0aW9uIGlzQXN5bmNJdGVyYWJsZShvYmopIHtcbiAgcmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yICYmIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3Rocm93VW5vYnNlcnZhYmxlRXJyb3IuanNcbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRPYnNlcnZhYmxlVHlwZUVycm9yKGlucHV0KSB7XG4gIHJldHVybiBuZXcgVHlwZUVycm9yKFwiWW91IHByb3ZpZGVkIFwiICsgKGlucHV0ICE9PSBudWxsICYmIHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiA/IFwiYW4gaW52YWxpZCBvYmplY3RcIiA6IFwiJ1wiICsgaW5wdXQgKyBcIidcIikgKyBcIiB3aGVyZSBhIHN0cmVhbSB3YXMgZXhwZWN0ZWQuIFlvdSBjYW4gcHJvdmlkZSBhbiBPYnNlcnZhYmxlLCBQcm9taXNlLCBSZWFkYWJsZVN0cmVhbSwgQXJyYXksIEFzeW5jSXRlcmFibGUsIG9yIEl0ZXJhYmxlLlwiKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3N5bWJvbC9pdGVyYXRvci5qc1xuZnVuY3Rpb24gZ2V0U3ltYm9sSXRlcmF0b3IoKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcImZ1bmN0aW9uXCIgfHwgIVN5bWJvbC5pdGVyYXRvcikge1xuICAgIHJldHVybiBcIkBAaXRlcmF0b3JcIjtcbiAgfVxuICByZXR1cm4gU3ltYm9sLml0ZXJhdG9yO1xufVxudmFyIGl0ZXJhdG9yID0gZ2V0U3ltYm9sSXRlcmF0b3IoKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNJdGVyYWJsZS5qc1xuZnVuY3Rpb24gaXNJdGVyYWJsZShpbnB1dCkge1xuICByZXR1cm4gaXNGdW5jdGlvbihpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5wdXRbaXRlcmF0b3JdKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNSZWFkYWJsZVN0cmVhbUxpa2UuanNcbmZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IocmVhZGFibGVTdHJlYW0pIHtcbiAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiByZWFkYWJsZVN0cmVhbUxpa2VUb0FzeW5jR2VuZXJhdG9yXzEoKSB7XG4gICAgdmFyIHJlYWRlciwgX2EsIHZhbHVlLCBkb25lO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfYikge1xuICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2IudHJ5cy5wdXNoKFsxLCAsIDksIDEwXSk7XG4gICAgICAgICAgX2IubGFiZWwgPSAyO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKGZhbHNlKSByZXR1cm4gWzMsIDhdO1xuICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdChyZWFkZXIucmVhZCgpKV07XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfYSA9IF9iLnNlbnQoKSwgdmFsdWUgPSBfYS52YWx1ZSwgZG9uZSA9IF9hLmRvbmU7XG4gICAgICAgICAgaWYgKCFkb25lKSByZXR1cm4gWzMsIDVdO1xuICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdCh2b2lkIDApXTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiBbMiwgX2Iuc2VudCgpXTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdCh2YWx1ZSldO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgcmV0dXJuIFs0LCBfYi5zZW50KCldO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgIHJldHVybiBbMywgMl07XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gWzMsIDEwXTtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgICAgIHJldHVybiBbN107XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgcmV0dXJuIFsyXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtTGlrZShvYmopIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqLmdldFJlYWRlcik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2lubmVyRnJvbS5qc1xuZnVuY3Rpb24gaW5uZXJGcm9tKGlucHV0KSB7XG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICBpZiAoaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkpIHtcbiAgICAgIHJldHVybiBmcm9tSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheUxpa2UoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZShpbnB1dCk7XG4gICAgfVxuICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIGZyb21Bc3luY0l0ZXJhYmxlKGlucHV0KTtcbiAgICB9XG4gICAgaWYgKGlzSXRlcmFibGUoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gZnJvbUl0ZXJhYmxlKGlucHV0KTtcbiAgICB9XG4gICAgaWYgKGlzUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIGZyb21SZWFkYWJsZVN0cmVhbUxpa2UoaW5wdXQpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCk7XG59XG5mdW5jdGlvbiBmcm9tSW50ZXJvcE9ic2VydmFibGUob2JqKSB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIG9icyA9IG9ialtvYnNlcnZhYmxlXSgpO1xuICAgIGlmIChpc0Z1bmN0aW9uKG9icy5zdWJzY3JpYmUpKSB7XG4gICAgICByZXR1cm4gb2JzLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb3ZpZGVkIG9iamVjdCBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IFN5bWJvbC5vYnNlcnZhYmxlXCIpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UoYXJyYXkpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aCAmJiAhc3Vic2NyaWJlci5jbG9zZWQ7IGkrKykge1xuICAgICAgc3Vic2NyaWJlci5uZXh0KGFycmF5W2ldKTtcbiAgICB9XG4gICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21Qcm9taXNlKHByb21pc2UpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZXJyKTtcbiAgICB9KS50aGVuKG51bGwsIHJlcG9ydFVuaGFuZGxlZEVycm9yKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBmcm9tSXRlcmFibGUoaXRlcmFibGUpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgZV8xLCBfYTtcbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgaXRlcmFibGVfMSA9IF9fdmFsdWVzKGl0ZXJhYmxlKSwgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCk7ICFpdGVyYWJsZV8xXzEuZG9uZTsgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gaXRlcmFibGVfMV8xLnZhbHVlO1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzFfMSkge1xuICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGl0ZXJhYmxlXzFfMSAmJiAhaXRlcmFibGVfMV8xLmRvbmUgJiYgKF9hID0gaXRlcmFibGVfMS5yZXR1cm4pKSBfYS5jYWxsKGl0ZXJhYmxlXzEpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZnJvbUFzeW5jSXRlcmFibGUoYXN5bmNJdGVyYWJsZSkge1xuICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHByb2Nlc3MoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgIH0pO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21SZWFkYWJsZVN0cmVhbUxpa2UocmVhZGFibGVTdHJlYW0pIHtcbiAgcmV0dXJuIGZyb21Bc3luY0l0ZXJhYmxlKHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IocmVhZGFibGVTdHJlYW0pKTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3MoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikge1xuICB2YXIgYXN5bmNJdGVyYWJsZV8xLCBhc3luY0l0ZXJhYmxlXzFfMTtcbiAgdmFyIGVfMiwgX2E7XG4gIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSwgZV8yXzE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9iKSB7XG4gICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDExXSk7XG4gICAgICAgICAgYXN5bmNJdGVyYWJsZV8xID0gX19hc3luY1ZhbHVlcyhhc3luY0l0ZXJhYmxlKTtcbiAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gWzQsIGFzeW5jSXRlcmFibGVfMS5uZXh0KCldO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKCEoYXN5bmNJdGVyYWJsZV8xXzEgPSBfYi5zZW50KCksICFhc3luY0l0ZXJhYmxlXzFfMS5kb25lKSkgcmV0dXJuIFszLCA0XTtcbiAgICAgICAgICB2YWx1ZSA9IGFzeW5jSXRlcmFibGVfMV8xLnZhbHVlO1xuICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gWzJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByZXR1cm4gWzMsIDFdO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIFszLCAxMV07XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBlXzJfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICAgIHJldHVybiBbMywgMTFdO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2IudHJ5cy5wdXNoKFs2LCAsIDksIDEwXSk7XG4gICAgICAgICAgaWYgKCEoYXN5bmNJdGVyYWJsZV8xXzEgJiYgIWFzeW5jSXRlcmFibGVfMV8xLmRvbmUgJiYgKF9hID0gYXN5bmNJdGVyYWJsZV8xLnJldHVybikpKSByZXR1cm4gWzMsIDhdO1xuICAgICAgICAgIHJldHVybiBbNCwgX2EuY2FsbChhc3luY0l0ZXJhYmxlXzEpXTtcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICBfYi5sYWJlbCA9IDg7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gWzMsIDEwXTtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjtcbiAgICAgICAgICByZXR1cm4gWzddO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIHJldHVybiBbN107XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybiBbMl07XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9leGVjdXRlU2NoZWR1bGUuanNcbmZ1bmN0aW9uIGV4ZWN1dGVTY2hlZHVsZShwYXJlbnRTdWJzY3JpcHRpb24sIHNjaGVkdWxlciwgd29yaywgZGVsYXkyLCByZXBlYXQpIHtcbiAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7XG4gICAgZGVsYXkyID0gMDtcbiAgfVxuICBpZiAocmVwZWF0ID09PSB2b2lkIDApIHtcbiAgICByZXBlYXQgPSBmYWxzZTtcbiAgfVxuICB2YXIgc2NoZWR1bGVTdWJzY3JpcHRpb24gPSBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7XG4gICAgd29yaygpO1xuICAgIGlmIChyZXBlYXQpIHtcbiAgICAgIHBhcmVudFN1YnNjcmlwdGlvbi5hZGQodGhpcy5zY2hlZHVsZShudWxsLCBkZWxheTIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfSwgZGVsYXkyKTtcbiAgcGFyZW50U3Vic2NyaXB0aW9uLmFkZChzY2hlZHVsZVN1YnNjcmlwdGlvbik7XG4gIGlmICghcmVwZWF0KSB7XG4gICAgcmV0dXJuIHNjaGVkdWxlU3Vic2NyaXB0aW9uO1xuICB9XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvb2JzZXJ2ZU9uLmpzXG5mdW5jdGlvbiBvYnNlcnZlT24oc2NoZWR1bGVyLCBkZWxheTIpIHtcbiAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7XG4gICAgZGVsYXkyID0gMDtcbiAgfVxuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0sIGRlbGF5Mik7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LCBkZWxheTIpO1xuICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgcmV0dXJuIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgICAgfSwgZGVsYXkyKTtcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N1YnNjcmliZU9uLmpzXG5mdW5jdGlvbiBzdWJzY3JpYmVPbihzY2hlZHVsZXIsIGRlbGF5Mikge1xuICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHtcbiAgICBkZWxheTIgPSAwO1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHN1YnNjcmliZXIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIH0sIGRlbGF5MikpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZU9ic2VydmFibGUuanNcbmZ1bmN0aW9uIHNjaGVkdWxlT2JzZXJ2YWJsZShpbnB1dCwgc2NoZWR1bGVyKSB7XG4gIHJldHVybiBpbm5lckZyb20oaW5wdXQpLnBpcGUoc3Vic2NyaWJlT24oc2NoZWR1bGVyKSwgb2JzZXJ2ZU9uKHNjaGVkdWxlcikpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlUHJvbWlzZS5qc1xuZnVuY3Rpb24gc2NoZWR1bGVQcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpIHtcbiAgcmV0dXJuIGlubmVyRnJvbShpbnB1dCkucGlwZShzdWJzY3JpYmVPbihzY2hlZHVsZXIpLCBvYnNlcnZlT24oc2NoZWR1bGVyKSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVBcnJheS5qc1xuZnVuY3Rpb24gc2NoZWR1bGVBcnJheShpbnB1dCwgc2NoZWR1bGVyKSB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGkgPSAwO1xuICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoaSA9PT0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnNjcmliZXIubmV4dChpbnB1dFtpKytdKTtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUl0ZXJhYmxlLmpzXG5mdW5jdGlvbiBzY2hlZHVsZUl0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgaXRlcmF0b3IyO1xuICAgIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgaXRlcmF0b3IyID0gaW5wdXRbaXRlcmF0b3JdKCk7XG4gICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgIHZhciBkb25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIF9hID0gaXRlcmF0b3IyLm5leHQoKSwgdmFsdWUgPSBfYS52YWx1ZSwgZG9uZSA9IF9hLmRvbmU7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSwgMCwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oaXRlcmF0b3IyID09PSBudWxsIHx8IGl0ZXJhdG9yMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogaXRlcmF0b3IyLnJldHVybikgJiYgaXRlcmF0b3IyLnJldHVybigpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlQXN5bmNJdGVyYWJsZS5qc1xuZnVuY3Rpb24gc2NoZWR1bGVBc3luY0l0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkl0ZXJhYmxlIGNhbm5vdCBiZSBudWxsXCIpO1xuICB9XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaXRlcmF0b3IyID0gaW5wdXRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaXRlcmF0b3IyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgMCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlLmpzXG5mdW5jdGlvbiBzY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCwgc2NoZWR1bGVyKSB7XG4gIHJldHVybiBzY2hlZHVsZUFzeW5jSXRlcmFibGUocmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvcihpbnB1dCksIHNjaGVkdWxlcik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVkLmpzXG5mdW5jdGlvbiBzY2hlZHVsZWQoaW5wdXQsIHNjaGVkdWxlcikge1xuICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgIGlmIChpc0ludGVyb3BPYnNlcnZhYmxlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlT2JzZXJ2YWJsZShpbnB1dCwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXlMaWtlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcik7XG4gICAgfVxuICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVQcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpO1xuICAgIH1cbiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQXN5bmNJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGlzSXRlcmFibGUoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGlzUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0LCBzY2hlZHVsZXIpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb20uanNcbmZ1bmN0aW9uIGZyb20oaW5wdXQsIHNjaGVkdWxlcikge1xuICByZXR1cm4gc2NoZWR1bGVyID8gc2NoZWR1bGVkKGlucHV0LCBzY2hlZHVsZXIpIDogaW5uZXJGcm9tKGlucHV0KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvb2YuanNcbmZ1bmN0aW9uIG9mKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKGFyZ3MpO1xuICByZXR1cm4gZnJvbShhcmdzLCBzY2hlZHVsZXIpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9FbXB0eUVycm9yLmpzXG52YXIgRW1wdHlFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiBFbXB0eUVycm9ySW1wbCgpIHtcbiAgICBfc3VwZXIodGhpcyk7XG4gICAgdGhpcy5uYW1lID0gXCJFbXB0eUVycm9yXCI7XG4gICAgdGhpcy5tZXNzYWdlID0gXCJubyBlbGVtZW50cyBpbiBzZXF1ZW5jZVwiO1xuICB9O1xufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9sYXN0VmFsdWVGcm9tLmpzXG5mdW5jdGlvbiBsYXN0VmFsdWVGcm9tKHNvdXJjZSwgY29uZmlnMikge1xuICB2YXIgaGFzQ29uZmlnID0gdHlwZW9mIGNvbmZpZzIgPT09IFwib2JqZWN0XCI7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgX2hhc1ZhbHVlID0gZmFsc2U7XG4gICAgdmFyIF92YWx1ZTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF92YWx1ZSA9IHZhbHVlO1xuICAgICAgICBfaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChfaGFzVmFsdWUpIHtcbiAgICAgICAgICByZXNvbHZlKF92YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQ29uZmlnKSB7XG4gICAgICAgICAgcmVzb2x2ZShjb25maWcyLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFbXB0eUVycm9yKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvZmlyc3RWYWx1ZUZyb20uanNcbmZ1bmN0aW9uIGZpcnN0VmFsdWVGcm9tKHNvdXJjZSwgY29uZmlnMikge1xuICB2YXIgaGFzQ29uZmlnID0gdHlwZW9mIGNvbmZpZzIgPT09IFwib2JqZWN0XCI7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgc3Vic2NyaWJlciA9IG5ldyBTYWZlU3Vic2NyaWJlcih7XG4gICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChoYXNDb25maWcpIHtcbiAgICAgICAgICByZXNvbHZlKGNvbmZpZzIuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QobmV3IEVtcHR5RXJyb3IoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNEYXRlLmpzXG5mdW5jdGlvbiBpc1ZhbGlkRGF0ZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2YWx1ZSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWFwLmpzXG5mdW5jdGlvbiBtYXAocHJvamVjdCwgdGhpc0FyZykge1xuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBzdWJzY3JpYmVyLm5leHQocHJvamVjdC5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCsrKSk7XG4gICAgfSkpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvbWFwT25lT3JNYW55QXJncy5qc1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gY2FsbE9yQXBwbHkoZm4sIGFyZ3MpIHtcbiAgcmV0dXJuIGlzQXJyYXkoYXJncykgPyBmbi5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhcmdzKSkpIDogZm4oYXJncyk7XG59XG5mdW5jdGlvbiBtYXBPbmVPck1hbnlBcmdzKGZuKSB7XG4gIHJldHVybiBtYXAoZnVuY3Rpb24oYXJncykge1xuICAgIHJldHVybiBjYWxsT3JBcHBseShmbiwgYXJncyk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9hcmdzQXJnQXJyYXlPck9iamVjdC5qc1xudmFyIGlzQXJyYXkyID0gQXJyYXkuaXNBcnJheTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG52YXIgZ2V0S2V5cyA9IE9iamVjdC5rZXlzO1xuZnVuY3Rpb24gYXJnc0FyZ0FycmF5T3JPYmplY3QoYXJncykge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICB2YXIgZmlyc3RfMSA9IGFyZ3NbMF07XG4gICAgaWYgKGlzQXJyYXkyKGZpcnN0XzEpKSB7XG4gICAgICByZXR1cm4geyBhcmdzOiBmaXJzdF8xLCBrZXlzOiBudWxsIH07XG4gICAgfVxuICAgIGlmIChpc1BPSk8oZmlyc3RfMSkpIHtcbiAgICAgIHZhciBrZXlzID0gZ2V0S2V5cyhmaXJzdF8xKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFyZ3M6IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIHJldHVybiBmaXJzdF8xW2tleV07XG4gICAgICAgIH0pLFxuICAgICAgICBrZXlzXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBhcmdzLCBrZXlzOiBudWxsIH07XG59XG5mdW5jdGlvbiBpc1BPSk8ob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiBnZXRQcm90b3R5cGVPZihvYmopID09PSBvYmplY3RQcm90bztcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvY3JlYXRlT2JqZWN0LmpzXG5mdW5jdGlvbiBjcmVhdGVPYmplY3Qoa2V5cywgdmFsdWVzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbihyZXN1bHQsIGtleSwgaSkge1xuICAgIHJldHVybiByZXN1bHRba2V5XSA9IHZhbHVlc1tpXSwgcmVzdWx0O1xuICB9LCB7fSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2NvbWJpbmVMYXRlc3QuanNcbmZ1bmN0aW9uIGNvbWJpbmVMYXRlc3QoKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG4gIHZhciBzY2hlZHVsZXIgPSBwb3BTY2hlZHVsZXIoYXJncyk7XG4gIHZhciByZXN1bHRTZWxlY3RvciA9IHBvcFJlc3VsdFNlbGVjdG9yKGFyZ3MpO1xuICB2YXIgX2EgPSBhcmdzQXJnQXJyYXlPck9iamVjdChhcmdzKSwgb2JzZXJ2YWJsZXMgPSBfYS5hcmdzLCBrZXlzID0gX2Eua2V5cztcbiAgaWYgKG9ic2VydmFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmcm9tKFtdLCBzY2hlZHVsZXIpO1xuICB9XG4gIHZhciByZXN1bHQgPSBuZXcgT2JzZXJ2YWJsZShjb21iaW5lTGF0ZXN0SW5pdChvYnNlcnZhYmxlcywgc2NoZWR1bGVyLCBrZXlzID8gZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU9iamVjdChrZXlzLCB2YWx1ZXMpO1xuICB9IDogaWRlbnRpdHkpKTtcbiAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0LnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpIDogcmVzdWx0O1xufVxuZnVuY3Rpb24gY29tYmluZUxhdGVzdEluaXQob2JzZXJ2YWJsZXMsIHNjaGVkdWxlciwgdmFsdWVUcmFuc2Zvcm0pIHtcbiAgaWYgKHZhbHVlVHJhbnNmb3JtID09PSB2b2lkIDApIHtcbiAgICB2YWx1ZVRyYW5zZm9ybSA9IGlkZW50aXR5O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgbWF5YmVTY2hlZHVsZShzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGxlbmd0aCA9IG9ic2VydmFibGVzLmxlbmd0aDtcbiAgICAgIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICAgIHZhciBhY3RpdmUgPSBsZW5ndGg7XG4gICAgICB2YXIgcmVtYWluaW5nRmlyc3RWYWx1ZXMgPSBsZW5ndGg7XG4gICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uKGkyKSB7XG4gICAgICAgIG1heWJlU2NoZWR1bGUoc2NoZWR1bGVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgc291cmNlID0gZnJvbShvYnNlcnZhYmxlc1tpMl0sIHNjaGVkdWxlcik7XG4gICAgICAgICAgdmFyIGhhc0ZpcnN0VmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWVzW2kyXSA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFoYXNGaXJzdFZhbHVlKSB7XG4gICAgICAgICAgICAgIGhhc0ZpcnN0VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICByZW1haW5pbmdGaXJzdFZhbHVlcy0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZW1haW5pbmdGaXJzdFZhbHVlcykge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWVUcmFuc2Zvcm0odmFsdWVzLnNsaWNlKCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICghLS1hY3RpdmUpIHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSwgc3Vic2NyaWJlcik7XG4gICAgICB9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBfbG9vcF8xKGkpO1xuICAgICAgfVxuICAgIH0sIHN1YnNjcmliZXIpO1xuICB9O1xufVxuZnVuY3Rpb24gbWF5YmVTY2hlZHVsZShzY2hlZHVsZXIsIGV4ZWN1dGUsIHN1YnNjcmlwdGlvbikge1xuICBpZiAoc2NoZWR1bGVyKSB7XG4gICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmlwdGlvbiwgc2NoZWR1bGVyLCBleGVjdXRlKTtcbiAgfSBlbHNlIHtcbiAgICBleGVjdXRlKCk7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUludGVybmFscy5qc1xuZnVuY3Rpb24gbWVyZ2VJbnRlcm5hbHMoc291cmNlLCBzdWJzY3JpYmVyLCBwcm9qZWN0LCBjb25jdXJyZW50LCBvbkJlZm9yZU5leHQsIGV4cGFuZCwgaW5uZXJTdWJTY2hlZHVsZXIsIGFkZGl0aW9uYWxGaW5hbGl6ZXIpIHtcbiAgdmFyIGJ1ZmZlciA9IFtdO1xuICB2YXIgYWN0aXZlID0gMDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGlzQ29tcGxldGUgPSBmYWxzZTtcbiAgdmFyIGNoZWNrQ29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoaXNDb21wbGV0ZSAmJiAhYnVmZmVyLmxlbmd0aCAmJiAhYWN0aXZlKSB7XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfVxuICB9O1xuICB2YXIgb3V0ZXJOZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gYWN0aXZlIDwgY29uY3VycmVudCA/IGRvSW5uZXJTdWIodmFsdWUpIDogYnVmZmVyLnB1c2godmFsdWUpO1xuICB9O1xuICB2YXIgZG9Jbm5lclN1YiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgZXhwYW5kICYmIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgYWN0aXZlKys7XG4gICAgdmFyIGlubmVyQ29tcGxldGUgPSBmYWxzZTtcbiAgICBpbm5lckZyb20ocHJvamVjdCh2YWx1ZSwgaW5kZXgrKykpLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oaW5uZXJWYWx1ZSkge1xuICAgICAgb25CZWZvcmVOZXh0ID09PSBudWxsIHx8IG9uQmVmb3JlTmV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CZWZvcmVOZXh0KGlubmVyVmFsdWUpO1xuICAgICAgaWYgKGV4cGFuZCkge1xuICAgICAgICBvdXRlck5leHQoaW5uZXJWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoaW5uZXJWYWx1ZSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICBpbm5lckNvbXBsZXRlID0gdHJ1ZTtcbiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGlubmVyQ29tcGxldGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhY3RpdmUtLTtcbiAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGJ1ZmZlcmVkVmFsdWUgPSBidWZmZXIuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChpbm5lclN1YlNjaGVkdWxlcikge1xuICAgICAgICAgICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgaW5uZXJTdWJTY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkb0lubmVyU3ViKGJ1ZmZlcmVkVmFsdWUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRvSW5uZXJTdWIoYnVmZmVyZWRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCAmJiBhY3RpdmUgPCBjb25jdXJyZW50KSB7XG4gICAgICAgICAgICBfbG9vcF8xKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoZWNrQ29tcGxldGUoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpO1xuICB9O1xuICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBvdXRlck5leHQsIGZ1bmN0aW9uKCkge1xuICAgIGlzQ29tcGxldGUgPSB0cnVlO1xuICAgIGNoZWNrQ29tcGxldGUoKTtcbiAgfSkpO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgYWRkaXRpb25hbEZpbmFsaXplciA9PT0gbnVsbCB8fCBhZGRpdGlvbmFsRmluYWxpemVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZGRpdGlvbmFsRmluYWxpemVyKCk7XG4gIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VNYXAuanNcbmZ1bmN0aW9uIG1lcmdlTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50KSB7XG4gIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHtcbiAgICBjb25jdXJyZW50ID0gSW5maW5pdHk7XG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24ocmVzdWx0U2VsZWN0b3IpKSB7XG4gICAgcmV0dXJuIG1lcmdlTWFwKGZ1bmN0aW9uKGEsIGkpIHtcbiAgICAgIHJldHVybiBtYXAoZnVuY3Rpb24oYiwgaWkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yKGEsIGIsIGksIGlpKTtcbiAgICAgIH0pKGlubmVyRnJvbShwcm9qZWN0KGEsIGkpKSk7XG4gICAgfSwgY29uY3VycmVudCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSBcIm51bWJlclwiKSB7XG4gICAgY29uY3VycmVudCA9IHJlc3VsdFNlbGVjdG9yO1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBtZXJnZUludGVybmFscyhzb3VyY2UsIHN1YnNjcmliZXIsIHByb2plY3QsIGNvbmN1cnJlbnQpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUFsbC5qc1xuZnVuY3Rpb24gbWVyZ2VBbGwoY29uY3VycmVudCkge1xuICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7XG4gICAgY29uY3VycmVudCA9IEluZmluaXR5O1xuICB9XG4gIHJldHVybiBtZXJnZU1hcChpZGVudGl0eSwgY29uY3VycmVudCk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0QWxsLmpzXG5mdW5jdGlvbiBjb25jYXRBbGwoKSB7XG4gIHJldHVybiBtZXJnZUFsbCgxKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvY29uY2F0LmpzXG5mdW5jdGlvbiBjb25jYXQoKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG4gIHJldHVybiBjb25jYXRBbGwoKShmcm9tKGFyZ3MsIHBvcFNjaGVkdWxlcihhcmdzKSkpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9kZWZlci5qc1xuZnVuY3Rpb24gZGVmZXIob2JzZXJ2YWJsZUZhY3RvcnkpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICBpbm5lckZyb20ob2JzZXJ2YWJsZUZhY3RvcnkoKSkuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZm9ya0pvaW4uanNcbmZ1bmN0aW9uIGZvcmtKb2luKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBwb3BSZXN1bHRTZWxlY3RvcihhcmdzKTtcbiAgdmFyIF9hID0gYXJnc0FyZ0FycmF5T3JPYmplY3QoYXJncyksIHNvdXJjZXMgPSBfYS5hcmdzLCBrZXlzID0gX2Eua2V5cztcbiAgdmFyIHJlc3VsdCA9IG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHZhbHVlcyA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgIHZhciByZW1haW5pbmdDb21wbGV0aW9ucyA9IGxlbmd0aDtcbiAgICB2YXIgcmVtYWluaW5nRW1pc3Npb25zID0gbGVuZ3RoO1xuICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24oc291cmNlSW5kZXgyKSB7XG4gICAgICB2YXIgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgIGlubmVyRnJvbShzb3VyY2VzW3NvdXJjZUluZGV4Ml0pLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKCFoYXNWYWx1ZSkge1xuICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICByZW1haW5pbmdFbWlzc2lvbnMtLTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXNbc291cmNlSW5kZXgyXSA9IHZhbHVlO1xuICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByZW1haW5pbmdDb21wbGV0aW9ucy0tO1xuICAgICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCFyZW1haW5pbmdDb21wbGV0aW9ucyB8fCAhaGFzVmFsdWUpIHtcbiAgICAgICAgICBpZiAoIXJlbWFpbmluZ0VtaXNzaW9ucykge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGtleXMgPyBjcmVhdGVPYmplY3Qoa2V5cywgdmFsdWVzKSA6IHZhbHVlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH07XG4gICAgZm9yICh2YXIgc291cmNlSW5kZXggPSAwOyBzb3VyY2VJbmRleCA8IGxlbmd0aDsgc291cmNlSW5kZXgrKykge1xuICAgICAgX2xvb3BfMShzb3VyY2VJbmRleCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0LnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpIDogcmVzdWx0O1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tRXZlbnQuanNcbnZhciBub2RlRXZlbnRFbWl0dGVyTWV0aG9kcyA9IFtcImFkZExpc3RlbmVyXCIsIFwicmVtb3ZlTGlzdGVuZXJcIl07XG52YXIgZXZlbnRUYXJnZXRNZXRob2RzID0gW1wiYWRkRXZlbnRMaXN0ZW5lclwiLCBcInJlbW92ZUV2ZW50TGlzdGVuZXJcIl07XG52YXIganF1ZXJ5TWV0aG9kcyA9IFtcIm9uXCIsIFwib2ZmXCJdO1xuZnVuY3Rpb24gZnJvbUV2ZW50KHRhcmdldCwgZXZlbnROYW1lLCBvcHRpb25zLCByZXN1bHRTZWxlY3Rvcikge1xuICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgIHJlc3VsdFNlbGVjdG9yID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0gdm9pZCAwO1xuICB9XG4gIGlmIChyZXN1bHRTZWxlY3Rvcikge1xuICAgIHJldHVybiBmcm9tRXZlbnQodGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpLnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpO1xuICB9XG4gIHZhciBfYSA9IF9fcmVhZChpc0V2ZW50VGFyZ2V0KHRhcmdldCkgPyBldmVudFRhcmdldE1ldGhvZHMubWFwKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oaGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRhcmdldFttZXRob2ROYW1lXShldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIH07XG4gIH0pIDogaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSA/IG5vZGVFdmVudEVtaXR0ZXJNZXRob2RzLm1hcCh0b0NvbW1vbkhhbmRsZXJSZWdpc3RyeSh0YXJnZXQsIGV2ZW50TmFtZSkpIDogaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpID8ganF1ZXJ5TWV0aG9kcy5tYXAodG9Db21tb25IYW5kbGVyUmVnaXN0cnkodGFyZ2V0LCBldmVudE5hbWUpKSA6IFtdLCAyKSwgYWRkID0gX2FbMF0sIHJlbW92ZSA9IF9hWzFdO1xuICBpZiAoIWFkZCkge1xuICAgIGlmIChpc0FycmF5TGlrZSh0YXJnZXQpKSB7XG4gICAgICByZXR1cm4gbWVyZ2VNYXAoZnVuY3Rpb24oc3ViVGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBmcm9tRXZlbnQoc3ViVGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpO1xuICAgICAgfSkoaW5uZXJGcm9tKHRhcmdldCkpO1xuICAgIH1cbiAgfVxuICBpZiAoIWFkZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGV2ZW50IHRhcmdldFwiKTtcbiAgfVxuICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1YnNjcmliZXIubmV4dCgxIDwgYXJncy5sZW5ndGggPyBhcmdzIDogYXJnc1swXSk7XG4gICAgfTtcbiAgICBhZGQoaGFuZGxlcik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJlbW92ZShoYW5kbGVyKTtcbiAgICB9O1xuICB9KTtcbn1cbmZ1bmN0aW9uIHRvQ29tbW9uSGFuZGxlclJlZ2lzdHJ5KHRhcmdldCwgZXZlbnROYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHRhcmdldC5hZGRMaXN0ZW5lcikgJiYgaXNGdW5jdGlvbih0YXJnZXQucmVtb3ZlTGlzdGVuZXIpO1xufVxuZnVuY3Rpb24gaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24odGFyZ2V0Lm9uKSAmJiBpc0Z1bmN0aW9uKHRhcmdldC5vZmYpO1xufVxuZnVuY3Rpb24gaXNFdmVudFRhcmdldCh0YXJnZXQpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24odGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpICYmIGlzRnVuY3Rpb24odGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS90aW1lci5qc1xuZnVuY3Rpb24gdGltZXIoZHVlVGltZSwgaW50ZXJ2YWxPclNjaGVkdWxlciwgc2NoZWR1bGVyKSB7XG4gIGlmIChkdWVUaW1lID09PSB2b2lkIDApIHtcbiAgICBkdWVUaW1lID0gMDtcbiAgfVxuICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHtcbiAgICBzY2hlZHVsZXIgPSBhc3luYztcbiAgfVxuICB2YXIgaW50ZXJ2YWxEdXJhdGlvbiA9IC0xO1xuICBpZiAoaW50ZXJ2YWxPclNjaGVkdWxlciAhPSBudWxsKSB7XG4gICAgaWYgKGlzU2NoZWR1bGVyKGludGVydmFsT3JTY2hlZHVsZXIpKSB7XG4gICAgICBzY2hlZHVsZXIgPSBpbnRlcnZhbE9yU2NoZWR1bGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbER1cmF0aW9uID0gaW50ZXJ2YWxPclNjaGVkdWxlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgZHVlID0gaXNWYWxpZERhdGUoZHVlVGltZSkgPyArZHVlVGltZSAtIHNjaGVkdWxlci5ub3coKSA6IGR1ZVRpbWU7XG4gICAgaWYgKGR1ZSA8IDApIHtcbiAgICAgIGR1ZSA9IDA7XG4gICAgfVxuICAgIHZhciBuID0gMDtcbiAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQobisrKTtcbiAgICAgICAgaWYgKDAgPD0gaW50ZXJ2YWxEdXJhdGlvbikge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGUodm9pZCAwLCBpbnRlcnZhbER1cmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBkdWUpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvbWVyZ2UuanNcbmZ1bmN0aW9uIG1lcmdlKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKGFyZ3MpO1xuICB2YXIgY29uY3VycmVudCA9IHBvcE51bWJlcihhcmdzLCBJbmZpbml0eSk7XG4gIHZhciBzb3VyY2VzID0gYXJncztcbiAgcmV0dXJuICFzb3VyY2VzLmxlbmd0aCA/IEVNUFRZIDogc291cmNlcy5sZW5ndGggPT09IDEgPyBpbm5lckZyb20oc291cmNlc1swXSkgOiBtZXJnZUFsbChjb25jdXJyZW50KShmcm9tKHNvdXJjZXMsIHNjaGVkdWxlcikpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9uZXZlci5qc1xudmFyIE5FVkVSID0gbmV3IE9ic2VydmFibGUobm9vcCk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyZ3NPckFyZ0FycmF5LmpzXG52YXIgaXNBcnJheTMgPSBBcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gYXJnc09yQXJnQXJyYXkoYXJncykge1xuICByZXR1cm4gYXJncy5sZW5ndGggPT09IDEgJiYgaXNBcnJheTMoYXJnc1swXSkgPyBhcmdzWzBdIDogYXJncztcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9maWx0ZXIuanNcbmZ1bmN0aW9uIGZpbHRlcihwcmVkaWNhdGUsIHRoaXNBcmcpIHtcbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCsrKSAmJiBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgIH0pKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3JhY2UuanNcbmZ1bmN0aW9uIHJhY2UoKSB7XG4gIHZhciBzb3VyY2VzID0gW107XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgc291cmNlc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG4gIHNvdXJjZXMgPSBhcmdzT3JBcmdBcnJheShzb3VyY2VzKTtcbiAgcmV0dXJuIHNvdXJjZXMubGVuZ3RoID09PSAxID8gaW5uZXJGcm9tKHNvdXJjZXNbMF0pIDogbmV3IE9ic2VydmFibGUocmFjZUluaXQoc291cmNlcykpO1xufVxuZnVuY3Rpb24gcmFjZUluaXQoc291cmNlcykge1xuICByZXR1cm4gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHZhciBzdWJzY3JpcHRpb25zID0gW107XG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbihpMikge1xuICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKGlubmVyRnJvbShzb3VyY2VzW2kyXSkuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucykge1xuICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgc3Vic2NyaXB0aW9ucy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgcyAhPT0gaTIgJiYgc3Vic2NyaXB0aW9uc1tzXS51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdWJzY3JpcHRpb25zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgfSkpKTtcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBzdWJzY3JpcHRpb25zICYmICFzdWJzY3JpYmVyLmNsb3NlZCAmJiBpIDwgc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgX2xvb3BfMShpKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3ppcC5qc1xuZnVuY3Rpb24gemlwKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBwb3BSZXN1bHRTZWxlY3RvcihhcmdzKTtcbiAgdmFyIHNvdXJjZXMgPSBhcmdzT3JBcmdBcnJheShhcmdzKTtcbiAgcmV0dXJuIHNvdXJjZXMubGVuZ3RoID8gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHZhciBidWZmZXJzID0gc291cmNlcy5tYXAoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG4gICAgdmFyIGNvbXBsZXRlZCA9IHNvdXJjZXMubWFwKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIHN1YnNjcmliZXIuYWRkKGZ1bmN0aW9uKCkge1xuICAgICAgYnVmZmVycyA9IGNvbXBsZXRlZCA9IG51bGw7XG4gICAgfSk7XG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbihzb3VyY2VJbmRleDIpIHtcbiAgICAgIGlubmVyRnJvbShzb3VyY2VzW3NvdXJjZUluZGV4Ml0pLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgYnVmZmVyc1tzb3VyY2VJbmRleDJdLnB1c2godmFsdWUpO1xuICAgICAgICBpZiAoYnVmZmVycy5ldmVyeShmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgICAgICByZXR1cm4gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gYnVmZmVycy5tYXAoZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyLnNoaWZ0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0U2VsZWN0b3IuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQocmVzdWx0KSkpIDogcmVzdWx0KTtcbiAgICAgICAgICBpZiAoYnVmZmVycy5zb21lKGZ1bmN0aW9uKGJ1ZmZlciwgaSkge1xuICAgICAgICAgICAgcmV0dXJuICFidWZmZXIubGVuZ3RoICYmIGNvbXBsZXRlZFtpXTtcbiAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbXBsZXRlZFtzb3VyY2VJbmRleDJdID0gdHJ1ZTtcbiAgICAgICAgIWJ1ZmZlcnNbc291cmNlSW5kZXgyXS5sZW5ndGggJiYgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfSkpO1xuICAgIH07XG4gICAgZm9yICh2YXIgc291cmNlSW5kZXggPSAwOyAhc3Vic2NyaWJlci5jbG9zZWQgJiYgc291cmNlSW5kZXggPCBzb3VyY2VzLmxlbmd0aDsgc291cmNlSW5kZXgrKykge1xuICAgICAgX2xvb3BfMShzb3VyY2VJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIGJ1ZmZlcnMgPSBjb21wbGV0ZWQgPSBudWxsO1xuICAgIH07XG4gIH0pIDogRU1QVFk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvYnVmZmVyQ291bnQuanNcbmZ1bmN0aW9uIGJ1ZmZlckNvdW50KGJ1ZmZlclNpemUsIHN0YXJ0QnVmZmVyRXZlcnkpIHtcbiAgaWYgKHN0YXJ0QnVmZmVyRXZlcnkgPT09IHZvaWQgMCkge1xuICAgIHN0YXJ0QnVmZmVyRXZlcnkgPSBudWxsO1xuICB9XG4gIHN0YXJ0QnVmZmVyRXZlcnkgPSBzdGFydEJ1ZmZlckV2ZXJ5ICE9PSBudWxsICYmIHN0YXJ0QnVmZmVyRXZlcnkgIT09IHZvaWQgMCA/IHN0YXJ0QnVmZmVyRXZlcnkgOiBidWZmZXJTaXplO1xuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgYnVmZmVycyA9IFtdO1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBlXzEsIF9hLCBlXzIsIF9iO1xuICAgICAgdmFyIHRvRW1pdCA9IG51bGw7XG4gICAgICBpZiAoY291bnQrKyAlIHN0YXJ0QnVmZmVyRXZlcnkgPT09IDApIHtcbiAgICAgICAgYnVmZmVycy5wdXNoKFtdKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIGJ1ZmZlcnNfMSA9IF9fdmFsdWVzKGJ1ZmZlcnMpLCBidWZmZXJzXzFfMSA9IGJ1ZmZlcnNfMS5uZXh0KCk7ICFidWZmZXJzXzFfMS5kb25lOyBidWZmZXJzXzFfMSA9IGJ1ZmZlcnNfMS5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gYnVmZmVyc18xXzEudmFsdWU7XG4gICAgICAgICAgYnVmZmVyLnB1c2godmFsdWUpO1xuICAgICAgICAgIGlmIChidWZmZXJTaXplIDw9IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRvRW1pdCA9IHRvRW1pdCAhPT0gbnVsbCAmJiB0b0VtaXQgIT09IHZvaWQgMCA/IHRvRW1pdCA6IFtdO1xuICAgICAgICAgICAgdG9FbWl0LnB1c2goYnVmZmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7XG4gICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChidWZmZXJzXzFfMSAmJiAhYnVmZmVyc18xXzEuZG9uZSAmJiAoX2EgPSBidWZmZXJzXzEucmV0dXJuKSkgX2EuY2FsbChidWZmZXJzXzEpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRvRW1pdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIHRvRW1pdF8xID0gX192YWx1ZXModG9FbWl0KSwgdG9FbWl0XzFfMSA9IHRvRW1pdF8xLm5leHQoKTsgIXRvRW1pdF8xXzEuZG9uZTsgdG9FbWl0XzFfMSA9IHRvRW1pdF8xLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IHRvRW1pdF8xXzEudmFsdWU7XG4gICAgICAgICAgICBhcnJSZW1vdmUoYnVmZmVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZV8yXzEpIHtcbiAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodG9FbWl0XzFfMSAmJiAhdG9FbWl0XzFfMS5kb25lICYmIChfYiA9IHRvRW1pdF8xLnJldHVybikpIF9iLmNhbGwodG9FbWl0XzEpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZV8zLCBfYTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIGJ1ZmZlcnNfMiA9IF9fdmFsdWVzKGJ1ZmZlcnMpLCBidWZmZXJzXzJfMSA9IGJ1ZmZlcnNfMi5uZXh0KCk7ICFidWZmZXJzXzJfMS5kb25lOyBidWZmZXJzXzJfMSA9IGJ1ZmZlcnNfMi5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gYnVmZmVyc18yXzEudmFsdWU7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVfM18xKSB7XG4gICAgICAgIGVfMyA9IHsgZXJyb3I6IGVfM18xIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChidWZmZXJzXzJfMSAmJiAhYnVmZmVyc18yXzEuZG9uZSAmJiAoX2EgPSBidWZmZXJzXzIucmV0dXJuKSkgX2EuY2FsbChidWZmZXJzXzIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgIH0sIHZvaWQgMCwgZnVuY3Rpb24oKSB7XG4gICAgICBidWZmZXJzID0gbnVsbDtcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NhdGNoRXJyb3IuanNcbmZ1bmN0aW9uIGNhdGNoRXJyb3Ioc2VsZWN0b3IpIHtcbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGlubmVyU3ViID0gbnVsbDtcbiAgICB2YXIgc3luY1Vuc3ViID0gZmFsc2U7XG4gICAgdmFyIGhhbmRsZWRSZXN1bHQ7XG4gICAgaW5uZXJTdWIgPSBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICBoYW5kbGVkUmVzdWx0ID0gaW5uZXJGcm9tKHNlbGVjdG9yKGVyciwgY2F0Y2hFcnJvcihzZWxlY3Rvcikoc291cmNlKSkpO1xuICAgICAgaWYgKGlubmVyU3ViKSB7XG4gICAgICAgIGlubmVyU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGlubmVyU3ViID0gbnVsbDtcbiAgICAgICAgaGFuZGxlZFJlc3VsdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jVW5zdWIgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pKTtcbiAgICBpZiAoc3luY1Vuc3ViKSB7XG4gICAgICBpbm5lclN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgaW5uZXJTdWIgPSBudWxsO1xuICAgICAgaGFuZGxlZFJlc3VsdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb25jYXRNYXAuanNcbmZ1bmN0aW9uIGNvbmNhdE1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3Rvcikge1xuICByZXR1cm4gaXNGdW5jdGlvbihyZXN1bHRTZWxlY3RvcikgPyBtZXJnZU1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvciwgMSkgOiBtZXJnZU1hcChwcm9qZWN0LCAxKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZWJvdW5jZVRpbWUuanNcbmZ1bmN0aW9uIGRlYm91bmNlVGltZShkdWVUaW1lLCBzY2hlZHVsZXIpIHtcbiAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7XG4gICAgc2NoZWR1bGVyID0gYXN5bmNTY2hlZHVsZXI7XG4gIH1cbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGFjdGl2ZVRhc2sgPSBudWxsO1xuICAgIHZhciBsYXN0VmFsdWUgPSBudWxsO1xuICAgIHZhciBsYXN0VGltZSA9IG51bGw7XG4gICAgdmFyIGVtaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChhY3RpdmVUYXNrKSB7XG4gICAgICAgIGFjdGl2ZVRhc2sudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgYWN0aXZlVGFzayA9IG51bGw7XG4gICAgICAgIHZhciB2YWx1ZSA9IGxhc3RWYWx1ZTtcbiAgICAgICAgbGFzdFZhbHVlID0gbnVsbDtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGVtaXRXaGVuSWRsZSgpIHtcbiAgICAgIHZhciB0YXJnZXRUaW1lID0gbGFzdFRpbWUgKyBkdWVUaW1lO1xuICAgICAgdmFyIG5vdyA9IHNjaGVkdWxlci5ub3coKTtcbiAgICAgIGlmIChub3cgPCB0YXJnZXRUaW1lKSB7XG4gICAgICAgIGFjdGl2ZVRhc2sgPSB0aGlzLnNjaGVkdWxlKHZvaWQgMCwgdGFyZ2V0VGltZSAtIG5vdyk7XG4gICAgICAgIHN1YnNjcmliZXIuYWRkKGFjdGl2ZVRhc2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbWl0KCk7XG4gICAgfVxuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBsYXN0VmFsdWUgPSB2YWx1ZTtcbiAgICAgIGxhc3RUaW1lID0gc2NoZWR1bGVyLm5vdygpO1xuICAgICAgaWYgKCFhY3RpdmVUYXNrKSB7XG4gICAgICAgIGFjdGl2ZVRhc2sgPSBzY2hlZHVsZXIuc2NoZWR1bGUoZW1pdFdoZW5JZGxlLCBkdWVUaW1lKTtcbiAgICAgICAgc3Vic2NyaWJlci5hZGQoYWN0aXZlVGFzayk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICBlbWl0KCk7XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHtcbiAgICAgIGxhc3RWYWx1ZSA9IGFjdGl2ZVRhc2sgPSBudWxsO1xuICAgIH0pKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVmYXVsdElmRW1wdHkuanNcbmZ1bmN0aW9uIGRlZmF1bHRJZkVtcHR5KGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghaGFzVmFsdWUpIHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSkpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YWtlLmpzXG5mdW5jdGlvbiB0YWtlKGNvdW50KSB7XG4gIHJldHVybiBjb3VudCA8PSAwID8gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIEVNUFRZO1xuICB9IDogb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgc2VlbiA9IDA7XG4gICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICgrK3NlZW4gPD0gY291bnQpIHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgaWYgKGNvdW50IDw9IHNlZW4pIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2lnbm9yZUVsZW1lbnRzLmpzXG5mdW5jdGlvbiBpZ25vcmVFbGVtZW50cygpIHtcbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgbm9vcCkpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tYXBUby5qc1xuZnVuY3Rpb24gbWFwVG8odmFsdWUpIHtcbiAgcmV0dXJuIG1hcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlbGF5V2hlbi5qc1xuZnVuY3Rpb24gZGVsYXlXaGVuKGRlbGF5RHVyYXRpb25TZWxlY3Rvciwgc3Vic2NyaXB0aW9uRGVsYXkpIHtcbiAgaWYgKHN1YnNjcmlwdGlvbkRlbGF5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGNvbmNhdChzdWJzY3JpcHRpb25EZWxheS5waXBlKHRha2UoMSksIGlnbm9yZUVsZW1lbnRzKCkpLCBzb3VyY2UucGlwZShkZWxheVdoZW4oZGVsYXlEdXJhdGlvblNlbGVjdG9yKSkpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIG1lcmdlTWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgIHJldHVybiBpbm5lckZyb20oZGVsYXlEdXJhdGlvblNlbGVjdG9yKHZhbHVlLCBpbmRleCkpLnBpcGUodGFrZSgxKSwgbWFwVG8odmFsdWUpKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVsYXkuanNcbmZ1bmN0aW9uIGRlbGF5KGR1ZSwgc2NoZWR1bGVyKSB7XG4gIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkge1xuICAgIHNjaGVkdWxlciA9IGFzeW5jU2NoZWR1bGVyO1xuICB9XG4gIHZhciBkdXJhdGlvbiA9IHRpbWVyKGR1ZSwgc2NoZWR1bGVyKTtcbiAgcmV0dXJuIGRlbGF5V2hlbihmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rocm93SWZFbXB0eS5qc1xuZnVuY3Rpb24gdGhyb3dJZkVtcHR5KGVycm9yRmFjdG9yeSkge1xuICBpZiAoZXJyb3JGYWN0b3J5ID09PSB2b2lkIDApIHtcbiAgICBlcnJvckZhY3RvcnkgPSBkZWZhdWx0RXJyb3JGYWN0b3J5O1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHZhciBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBoYXNWYWx1ZSA9IHRydWU7XG4gICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGhhc1ZhbHVlID8gc3Vic2NyaWJlci5jb21wbGV0ZSgpIDogc3Vic2NyaWJlci5lcnJvcihlcnJvckZhY3RvcnkoKSk7XG4gICAgfSkpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRFcnJvckZhY3RvcnkoKSB7XG4gIHJldHVybiBuZXcgRW1wdHlFcnJvcigpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpcnN0LmpzXG5mdW5jdGlvbiBmaXJzdChwcmVkaWNhdGUsIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgaGFzRGVmYXVsdFZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+PSAyO1xuICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7XG4gICAgcmV0dXJuIHNvdXJjZS5waXBlKHByZWRpY2F0ZSA/IGZpbHRlcihmdW5jdGlvbih2LCBpKSB7XG4gICAgICByZXR1cm4gcHJlZGljYXRlKHYsIGksIHNvdXJjZSk7XG4gICAgfSkgOiBpZGVudGl0eSwgdGFrZSgxKSwgaGFzRGVmYXVsdFZhbHVlID8gZGVmYXVsdElmRW1wdHkoZGVmYXVsdFZhbHVlKSA6IHRocm93SWZFbXB0eShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgRW1wdHlFcnJvcigpO1xuICAgIH0pKTtcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZVNjYW4uanNcbmZ1bmN0aW9uIG1lcmdlU2NhbihhY2N1bXVsYXRvciwgc2VlZCwgY29uY3VycmVudCkge1xuICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7XG4gICAgY29uY3VycmVudCA9IEluZmluaXR5O1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHZhciBzdGF0ZSA9IHNlZWQ7XG4gICAgcmV0dXJuIG1lcmdlSW50ZXJuYWxzKHNvdXJjZSwgc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3Ioc3RhdGUsIHZhbHVlLCBpbmRleCk7XG4gICAgfSwgY29uY3VycmVudCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHN0YXRlID0gdmFsdWU7XG4gICAgfSwgZmFsc2UsIHZvaWQgMCwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3RhdGUgPSBudWxsO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yYWNlV2l0aC5qc1xuZnVuY3Rpb24gcmFjZVdpdGgoKSB7XG4gIHZhciBvdGhlclNvdXJjZXMgPSBbXTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBvdGhlclNvdXJjZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICByZXR1cm4gIW90aGVyU291cmNlcy5sZW5ndGggPyBpZGVudGl0eSA6IG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgcmFjZUluaXQoX19zcHJlYWRBcnJheShbc291cmNlXSwgX19yZWFkKG90aGVyU291cmNlcykpKShzdWJzY3JpYmVyKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmV0cnkuanNcbmZ1bmN0aW9uIHJldHJ5KGNvbmZpZ09yQ291bnQpIHtcbiAgaWYgKGNvbmZpZ09yQ291bnQgPT09IHZvaWQgMCkge1xuICAgIGNvbmZpZ09yQ291bnQgPSBJbmZpbml0eTtcbiAgfVxuICB2YXIgY29uZmlnMjtcbiAgaWYgKGNvbmZpZ09yQ291bnQgJiYgdHlwZW9mIGNvbmZpZ09yQ291bnQgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25maWcyID0gY29uZmlnT3JDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcyID0ge1xuICAgICAgY291bnQ6IGNvbmZpZ09yQ291bnRcbiAgICB9O1xuICB9XG4gIHZhciBfYSA9IGNvbmZpZzIuY291bnQsIGNvdW50ID0gX2EgPT09IHZvaWQgMCA/IEluZmluaXR5IDogX2EsIGRlbGF5MiA9IGNvbmZpZzIuZGVsYXksIF9iID0gY29uZmlnMi5yZXNldE9uU3VjY2VzcywgcmVzZXRPblN1Y2Nlc3MgPSBfYiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYjtcbiAgcmV0dXJuIGNvdW50IDw9IDAgPyBpZGVudGl0eSA6IG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIHNvRmFyID0gMDtcbiAgICB2YXIgaW5uZXJTdWI7XG4gICAgdmFyIHN1YnNjcmliZUZvclJldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc3luY1Vuc3ViID0gZmFsc2U7XG4gICAgICBpbm5lclN1YiA9IHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmIChyZXNldE9uU3VjY2Vzcykge1xuICAgICAgICAgIHNvRmFyID0gMDtcbiAgICAgICAgfVxuICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgfSwgdm9pZCAwLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKHNvRmFyKysgPCBjb3VudCkge1xuICAgICAgICAgIHZhciByZXN1Yl8xID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoaW5uZXJTdWIpIHtcbiAgICAgICAgICAgICAgaW5uZXJTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgaW5uZXJTdWIgPSBudWxsO1xuICAgICAgICAgICAgICBzdWJzY3JpYmVGb3JSZXRyeSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3luY1Vuc3ViID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChkZWxheTIgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIG5vdGlmaWVyID0gdHlwZW9mIGRlbGF5MiA9PT0gXCJudW1iZXJcIiA/IHRpbWVyKGRlbGF5MikgOiBpbm5lckZyb20oZGVsYXkyKGVyciwgc29GYXIpKTtcbiAgICAgICAgICAgIHZhciBub3RpZmllclN1YnNjcmliZXJfMSA9IGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgbm90aWZpZXJTdWJzY3JpYmVyXzEudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgcmVzdWJfMSgpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbm90aWZpZXIuc3Vic2NyaWJlKG5vdGlmaWVyU3Vic2NyaWJlcl8xKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWJfMSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICAgIGlmIChzeW5jVW5zdWIpIHtcbiAgICAgICAgaW5uZXJTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaW5uZXJTdWIgPSBudWxsO1xuICAgICAgICBzdWJzY3JpYmVGb3JSZXRyeSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgc3Vic2NyaWJlRm9yUmV0cnkoKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3RhcnRXaXRoLmpzXG5mdW5jdGlvbiBzdGFydFdpdGgoKSB7XG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YWx1ZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKHZhbHVlcyk7XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIChzY2hlZHVsZXIgPyBjb25jYXQodmFsdWVzLCBzb3VyY2UsIHNjaGVkdWxlcikgOiBjb25jYXQodmFsdWVzLCBzb3VyY2UpKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaE1hcC5qc1xuZnVuY3Rpb24gc3dpdGNoTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yKSB7XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHZhciBpbm5lclN1YnNjcmliZXIgPSBudWxsO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGlzQ29tcGxldGUgPSBmYWxzZTtcbiAgICB2YXIgY2hlY2tDb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGlzQ29tcGxldGUgJiYgIWlubmVyU3Vic2NyaWJlciAmJiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaW5uZXJTdWJzY3JpYmVyID09PSBudWxsIHx8IGlubmVyU3Vic2NyaWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5uZXJTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB2YXIgaW5uZXJJbmRleCA9IDA7XG4gICAgICB2YXIgb3V0ZXJJbmRleCA9IGluZGV4Kys7XG4gICAgICBpbm5lckZyb20ocHJvamVjdCh2YWx1ZSwgb3V0ZXJJbmRleCkpLnN1YnNjcmliZShpbm5lclN1YnNjcmliZXIgPSBjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oaW5uZXJWYWx1ZSkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5uZXh0KHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0U2VsZWN0b3IodmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgrKykgOiBpbm5lclZhbHVlKTtcbiAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICBpbm5lclN1YnNjcmliZXIgPSBudWxsO1xuICAgICAgICBjaGVja0NvbXBsZXRlKCk7XG4gICAgICB9KSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICBpc0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgIGNoZWNrQ29tcGxldGUoKTtcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rha2VVbnRpbC5qc1xuZnVuY3Rpb24gdGFrZVVudGlsKG5vdGlmaWVyKSB7XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIGlubmVyRnJvbShub3RpZmllcikuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSwgbm9vcCkpO1xuICAgICFzdWJzY3JpYmVyLmNsb3NlZCAmJiBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YXAuanNcbmZ1bmN0aW9uIHRhcChvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gIHZhciB0YXBPYnNlcnZlciA9IGlzRnVuY3Rpb24ob2JzZXJ2ZXJPck5leHQpIHx8IGVycm9yIHx8IGNvbXBsZXRlID8geyBuZXh0OiBvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlIH0gOiBvYnNlcnZlck9yTmV4dDtcbiAgcmV0dXJuIHRhcE9ic2VydmVyID8gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgX2E7XG4gICAgKF9hID0gdGFwT2JzZXJ2ZXIuc3Vic2NyaWJlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0YXBPYnNlcnZlcik7XG4gICAgdmFyIGlzVW5zdWIgPSB0cnVlO1xuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgX2EyO1xuICAgICAgKF9hMiA9IHRhcE9ic2VydmVyLm5leHQpID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmNhbGwodGFwT2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgX2EyO1xuICAgICAgaXNVbnN1YiA9IGZhbHNlO1xuICAgICAgKF9hMiA9IHRhcE9ic2VydmVyLmNvbXBsZXRlKSA9PT0gbnVsbCB8fCBfYTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMi5jYWxsKHRhcE9ic2VydmVyKTtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIHZhciBfYTI7XG4gICAgICBpc1Vuc3ViID0gZmFsc2U7XG4gICAgICAoX2EyID0gdGFwT2JzZXJ2ZXIuZXJyb3IpID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmNhbGwodGFwT2JzZXJ2ZXIsIGVycik7XG4gICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgX2EyLCBfYjtcbiAgICAgIGlmIChpc1Vuc3ViKSB7XG4gICAgICAgIChfYTIgPSB0YXBPYnNlcnZlci51bnN1YnNjcmliZSkgPT09IG51bGwgfHwgX2EyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTIuY2FsbCh0YXBPYnNlcnZlcik7XG4gICAgICB9XG4gICAgICAoX2IgPSB0YXBPYnNlcnZlci5maW5hbGl6ZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwodGFwT2JzZXJ2ZXIpO1xuICAgIH0pKTtcbiAgfSkgOiBpZGVudGl0eTtcbn1cbmV4cG9ydCB7XG4gIEVNUFRZLFxuICBORVZFUixcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgYnVmZmVyQ291bnQsXG4gIGNhdGNoRXJyb3IsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGNvbmNhdCxcbiAgY29uY2F0TWFwLFxuICBkZWJvdW5jZVRpbWUsXG4gIGRlZmF1bHRJZkVtcHR5LFxuICBkZWZlcixcbiAgZGVsYXksXG4gIGRlbGF5V2hlbixcbiAgZmlsdGVyLFxuICBmaXJzdCxcbiAgZmlyc3RWYWx1ZUZyb20sXG4gIGZvcmtKb2luLFxuICBmcm9tLFxuICBmcm9tRXZlbnQsXG4gIGlkZW50aXR5LFxuICBpZ25vcmVFbGVtZW50cyxcbiAgbGFzdFZhbHVlRnJvbSxcbiAgbWFwLFxuICBtZXJnZSxcbiAgbWVyZ2VNYXAsXG4gIG1lcmdlU2NhbixcbiAgbm9vcCxcbiAgb2YsXG4gIHBpcGUsXG4gIHJhY2UsXG4gIHJhY2VXaXRoLFxuICByZXRyeSxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB0aHJvd0lmRW1wdHksXG4gIHRpbWVyLFxuICB6aXBcbn07XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG59O1xuIiwiaW1wb3J0IGNyZWF0ZVdlYlNvY2tldFN0cmVhbSBmcm9tICcuL2xpYi9zdHJlYW0uanMnO1xuaW1wb3J0IFJlY2VpdmVyIGZyb20gJy4vbGliL3JlY2VpdmVyLmpzJztcbmltcG9ydCBTZW5kZXIgZnJvbSAnLi9saWIvc2VuZGVyLmpzJztcbmltcG9ydCBXZWJTb2NrZXQgZnJvbSAnLi9saWIvd2Vic29ja2V0LmpzJztcbmltcG9ydCBXZWJTb2NrZXRTZXJ2ZXIgZnJvbSAnLi9saWIvd2Vic29ja2V0LXNlcnZlci5qcyc7XG5cbmV4cG9ydCB7IGNyZWF0ZVdlYlNvY2tldFN0cmVhbSwgUmVjZWl2ZXIsIFNlbmRlciwgV2ViU29ja2V0LCBXZWJTb2NrZXRTZXJ2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IFdlYlNvY2tldDtcbiIsImxldCBzaGltO1xuY2xhc3MgWTE4TiB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICAvLyBjb25maWd1cmFibGUgb3B0aW9ucy5cbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gb3B0cy5kaXJlY3RvcnkgfHwgJy4vbG9jYWxlcyc7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsZXMgPSB0eXBlb2Ygb3B0cy51cGRhdGVGaWxlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy51cGRhdGVGaWxlcyA6IHRydWU7XG4gICAgICAgIHRoaXMubG9jYWxlID0gb3B0cy5sb2NhbGUgfHwgJ2VuJztcbiAgICAgICAgdGhpcy5mYWxsYmFja1RvTGFuZ3VhZ2UgPSB0eXBlb2Ygb3B0cy5mYWxsYmFja1RvTGFuZ3VhZ2UgPT09ICdib29sZWFuJyA/IG9wdHMuZmFsbGJhY2tUb0xhbmd1YWdlIDogdHJ1ZTtcbiAgICAgICAgLy8gaW50ZXJuYWwgc3R1ZmYuXG4gICAgICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLndyaXRlUXVldWUgPSBbXTtcbiAgICB9XG4gICAgX18oLi4uYXJncykge1xuICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90YWdnZWRMaXRlcmFsKGFyZ3VtZW50c1swXSwgLi4uYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHIgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGxldCBjYiA9IGZ1bmN0aW9uICgpIHsgfTsgLy8gc3RhcnQgd2l0aCBub29wLlxuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiID0gYXJncy5wb3AoKTtcbiAgICAgICAgY2IgPSBjYiB8fCBmdW5jdGlvbiAoKSB7IH07IC8vIG5vb3AuXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICAvLyB3ZSd2ZSBvYnNlcnZlZCBhIG5ldyBzdHJpbmcsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgZmlsZS5cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzdHJdICYmIHRoaXMudXBkYXRlRmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gPSBzdHI7XG4gICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgbG9jYWxlLFxuICAgICAgICAgICAgLy8gc2luY2UgdGhlc2UgdmFsdWVzIGNvdWxkIGNoYW5nZSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyB3cml0ZSBpcyBwZXJmb3JtZWQuXG4gICAgICAgICAgICB0aGlzLl9lbnF1ZXVlV3JpdGUoe1xuICAgICAgICAgICAgICAgIGRpcmVjdG9yeTogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICAgICAgICBjYlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgW3RoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gfHwgc3RyXS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgICBfX24oKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICBjb25zdCBzaW5ndWxhciA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgY29uc3QgcGx1cmFsID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBjb25zdCBxdWFudGl0eSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgbGV0IGNiID0gZnVuY3Rpb24gKCkgeyB9OyAvLyBzdGFydCB3aXRoIG5vb3AuXG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IgPSBhcmdzLnBvcCgpO1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdKVxuICAgICAgICAgICAgdGhpcy5fcmVhZExvY2FsZUZpbGUoKTtcbiAgICAgICAgbGV0IHN0ciA9IHF1YW50aXR5ID09PSAxID8gc2luZ3VsYXIgOiBwbHVyYWw7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdO1xuICAgICAgICAgICAgc3RyID0gZW50cnlbcXVhbnRpdHkgPT09IDEgPyAnb25lJyA6ICdvdGhlciddO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdlJ3ZlIG9ic2VydmVkIGEgbmV3IHN0cmluZywgdXBkYXRlIHRoZSBsYW5ndWFnZSBmaWxlLlxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXSAmJiB0aGlzLnVwZGF0ZUZpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0gPSB7XG4gICAgICAgICAgICAgICAgb25lOiBzaW5ndWxhcixcbiAgICAgICAgICAgICAgICBvdGhlcjogcGx1cmFsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGxvY2FsZSxcbiAgICAgICAgICAgIC8vIHNpbmNlIHRoZXNlIHZhbHVlcyBjb3VsZCBjaGFuZ2UgYmVmb3JlIHRoZVxuICAgICAgICAgICAgLy8gd3JpdGUgaXMgcGVyZm9ybWVkLlxuICAgICAgICAgICAgdGhpcy5fZW5xdWV1ZVdyaXRlKHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuZGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgICAgICAgY2JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhICVkIHBsYWNlaG9sZGVyIGlzIHByb3ZpZGVkLCBhZGQgcXVhbnRpdHlcbiAgICAgICAgLy8gdG8gdGhlIGFyZ3VtZW50cyBleHBhbmRlZCBieSB1dGlsLmZvcm1hdC5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gW3N0cl07XG4gICAgICAgIGlmICh+c3RyLmluZGV4T2YoJyVkJykpXG4gICAgICAgICAgICB2YWx1ZXMucHVzaChxdWFudGl0eSk7XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgdmFsdWVzLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICAgIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgfVxuICAgIGdldExvY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlO1xuICAgIH1cbiAgICB1cGRhdGVMb2NhbGUob2JqKSB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1ba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIF90YWdnZWRMaXRlcmFsKHBhcnRzLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgcGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCwgaSkge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpICsgMV07XG4gICAgICAgICAgICBzdHIgKz0gcGFydDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHN0ciArPSAnJXMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX18uYXBwbHkodGhpcywgW3N0cl0uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJncywgMSkpKTtcbiAgICB9XG4gICAgX2VucXVldWVXcml0ZSh3b3JrKSB7XG4gICAgICAgIHRoaXMud3JpdGVRdWV1ZS5wdXNoKHdvcmspO1xuICAgICAgICBpZiAodGhpcy53cml0ZVF1ZXVlLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NXcml0ZVF1ZXVlKCk7XG4gICAgfVxuICAgIF9wcm9jZXNzV3JpdGVRdWV1ZSgpIHtcbiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xuICAgICAgICBjb25zdCB3b3JrID0gdGhpcy53cml0ZVF1ZXVlWzBdO1xuICAgICAgICAvLyBkZXN0cnVjdHVyZSB0aGUgZW5xdWV1ZWQgd29yay5cbiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gd29yay5kaXJlY3Rvcnk7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9IHdvcmsubG9jYWxlO1xuICAgICAgICBjb25zdCBjYiA9IHdvcmsuY2I7XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHRoaXMuX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZExvY2FsZSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY2FjaGVbbG9jYWxlXSwgbnVsbCwgMik7XG4gICAgICAgIHNoaW0uZnMud3JpdGVGaWxlKGxhbmd1YWdlRmlsZSwgc2VyaWFsaXplZExvY2FsZSwgJ3V0Zi04JywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgX3RoaXMud3JpdGVRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKF90aGlzLndyaXRlUXVldWUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBfdGhpcy5fcHJvY2Vzc1dyaXRlUXVldWUoKTtcbiAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcmVhZExvY2FsZUZpbGUoKSB7XG4gICAgICAgIGxldCBsb2NhbGVMb29rdXAgPSB7fTtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VGaWxlID0gdGhpcy5fcmVzb2x2ZUxvY2FsZUZpbGUodGhpcy5kaXJlY3RvcnksIHRoaXMubG9jYWxlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBidW5kbGVyIHN1Y2ggYXMgd2VicGFjaywgcmVhZEZpbGVTeW5jIG1heSBub3QgYmUgZGVmaW5lZDpcbiAgICAgICAgICAgIGlmIChzaGltLmZzLnJlYWRGaWxlU3luYykge1xuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IEpTT04ucGFyc2Uoc2hpbS5mcy5yZWFkRmlsZVN5bmMobGFuZ3VhZ2VGaWxlLCAndXRmLTgnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSAnc3ludGF4IGVycm9yIGluICcgKyBsYW5ndWFnZUZpbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKVxuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IHt9O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSA9IGxvY2FsZUxvb2t1cDtcbiAgICB9XG4gICAgX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKSB7XG4gICAgICAgIGxldCBmaWxlID0gc2hpbS5yZXNvbHZlKGRpcmVjdG9yeSwgJy4vJywgbG9jYWxlICsgJy5qc29uJyk7XG4gICAgICAgIGlmICh0aGlzLmZhbGxiYWNrVG9MYW5ndWFnZSAmJiAhdGhpcy5fZmlsZUV4aXN0c1N5bmMoZmlsZSkgJiYgfmxvY2FsZS5sYXN0SW5kZXhPZignXycpKSB7XG4gICAgICAgICAgICAvLyBhdHRlbXB0IGZhbGxiYWNrIHRvIGxhbmd1YWdlIG9ubHlcbiAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHNoaW0ucmVzb2x2ZShkaXJlY3RvcnksICcuLycsIGxvY2FsZS5zcGxpdCgnXycpWzBdICsgJy5qc29uJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZmlsZUV4aXN0c1N5bmMobGFuZ3VhZ2VGaWxlKSlcbiAgICAgICAgICAgICAgICBmaWxlID0gbGFuZ3VhZ2VGaWxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cbiAgICBfZmlsZUV4aXN0c1N5bmMoZmlsZSkge1xuICAgICAgICByZXR1cm4gc2hpbS5leGlzdHMoZmlsZSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHkxOG4ob3B0cywgX3NoaW0pIHtcbiAgICBzaGltID0gX3NoaW07XG4gICAgY29uc3QgeTE4biA9IG5ldyBZMThOKG9wdHMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIF9fOiB5MThuLl9fLmJpbmQoeTE4biksXG4gICAgICAgIF9fbjogeTE4bi5fX24uYmluZCh5MThuKSxcbiAgICAgICAgc2V0TG9jYWxlOiB5MThuLnNldExvY2FsZS5iaW5kKHkxOG4pLFxuICAgICAgICBnZXRMb2NhbGU6IHkxOG4uZ2V0TG9jYWxlLmJpbmQoeTE4biksXG4gICAgICAgIHVwZGF0ZUxvY2FsZTogeTE4bi51cGRhdGVMb2NhbGUuYmluZCh5MThuKSxcbiAgICAgICAgbG9jYWxlOiB5MThuLmxvY2FsZVxuICAgIH07XG59XG4iLCJpbXBvcnQgeyByZWFkRmlsZVN5bmMsIHN0YXRTeW5jLCB3cml0ZUZpbGUgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBmczoge1xuICAgICAgICByZWFkRmlsZVN5bmMsXG4gICAgICAgIHdyaXRlRmlsZVxuICAgIH0sXG4gICAgZm9ybWF0LFxuICAgIHJlc29sdmUsXG4gICAgZXhpc3RzOiAoZmlsZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRTeW5jKGZpbGUpLmlzRmlsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCJpbXBvcnQgc2hpbSBmcm9tICcuL2J1aWxkL2xpYi9wbGF0Zm9ybS1zaGltcy9ub2RlLmpzJ1xuaW1wb3J0IHsgeTE4biBhcyBfeTE4biB9IGZyb20gJy4vYnVpbGQvbGliL2luZGV4LmpzJ1xuXG5jb25zdCB5MThuID0gKG9wdHMpID0+IHtcbiAgcmV0dXJuIF95MThuKG9wdHMsIHNoaW0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IHkxOG5cbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBNYWluIGVudHJ5cG9pbnQgZm9yIGxpYnJhcmllcyB1c2luZyB5YXJncy1wYXJzZXIgaW4gTm9kZS5qc1xuICogQ0pTIGFuZCBFU00gZW52aXJvbm1lbnRzLlxuICpcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG52YXIgX2EsIF9iLCBfYztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHsgbm9ybWFsaXplLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjYW1lbENhc2UsIGRlY2FtZWxpemUsIGxvb2tzTGlrZU51bWJlciB9IGZyb20gJy4vc3RyaW5nLXV0aWxzLmpzJztcbmltcG9ydCB7IFlhcmdzUGFyc2VyIH0gZnJvbSAnLi95YXJncy1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJncy95YXJncy1wYXJzZXIjc3VwcG9ydGVkLW5vZGVqcy12ZXJzaW9ucyBmb3Igb3VyXG4vLyB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5LiBUaGUgWUFSR1NfTUlOX05PREVfVkVSU0lPTiBpcyB1c2VkIGZvciB0ZXN0aW5nIG9ubHkuXG5jb25zdCBtaW5Ob2RlVmVyc2lvbiA9IChwcm9jZXNzICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52LllBUkdTX01JTl9OT0RFX1ZFUlNJT04pXG4gICAgPyBOdW1iZXIocHJvY2Vzcy5lbnYuWUFSR1NfTUlOX05PREVfVkVSU0lPTilcbiAgICA6IDEyO1xuY29uc3Qgbm9kZVZlcnNpb24gPSAoX2IgPSAoX2EgPSBwcm9jZXNzID09PSBudWxsIHx8IHByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2Nlc3MudmVyc2lvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub2RlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAoX2MgPSBwcm9jZXNzID09PSBudWxsIHx8IHByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2Nlc3MudmVyc2lvbikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnNsaWNlKDEpO1xuaWYgKG5vZGVWZXJzaW9uKSB7XG4gICAgY29uc3QgbWFqb3IgPSBOdW1iZXIobm9kZVZlcnNpb24ubWF0Y2goL14oW14uXSspLylbMV0pO1xuICAgIGlmIChtYWpvciA8IG1pbk5vZGVWZXJzaW9uKSB7XG4gICAgICAgIHRocm93IEVycm9yKGB5YXJncyBwYXJzZXIgc3VwcG9ydHMgYSBtaW5pbXVtIE5vZGUuanMgdmVyc2lvbiBvZiAke21pbk5vZGVWZXJzaW9ufS4gUmVhZCBvdXIgdmVyc2lvbiBzdXBwb3J0IHBvbGljeTogaHR0cHM6Ly9naXRodWIuY29tL3lhcmdzL3lhcmdzLXBhcnNlciNzdXBwb3J0ZWQtbm9kZWpzLXZlcnNpb25zYCk7XG4gICAgfVxufVxuLy8gQ3JlYXRlcyBhIHlhcmdzLXBhcnNlciBpbnN0YW5jZSB1c2luZyBOb2RlLmpzIHN0YW5kYXJkIGxpYnJhcmllczpcbmNvbnN0IGVudiA9IHByb2Nlc3MgPyBwcm9jZXNzLmVudiA6IHt9O1xuY29uc3QgcGFyc2VyID0gbmV3IFlhcmdzUGFyc2VyKHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkLFxuICAgIGVudjogKCkgPT4ge1xuICAgICAgICByZXR1cm4gZW52O1xuICAgIH0sXG4gICAgZm9ybWF0LFxuICAgIG5vcm1hbGl6ZSxcbiAgICByZXNvbHZlLFxuICAgIC8vIFRPRE86IGZpZ3VyZSAgb3V0IGEgIHdheSB0byBjb21iaW5lIEVTTSBhbmQgQ0pTIGNvdmVyYWdlLCBzdWNoICB0aGF0XG4gICAgLy8gd2UgY2FuIGV4ZXJjaXNlIGFsbCB0aGUgbGluZXMgYmVsb3c6XG4gICAgcmVxdWlyZTogKHBhdGgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF0aC5tYXRjaCgvXFwuanNvbiQvKSkge1xuICAgICAgICAgICAgLy8gQWRkcmVzc2VzOiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3MvaXNzdWVzLzIwNDBcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwYXRoLCAndXRmOCcpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdvbmx5IC5qc29uIGNvbmZpZyBmaWxlcyBhcmUgc3VwcG9ydGVkIGluIEVTTScpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5jb25zdCB5YXJnc1BhcnNlciA9IGZ1bmN0aW9uIFBhcnNlcihhcmdzLCBvcHRzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKGFyZ3Muc2xpY2UoKSwgb3B0cyk7XG4gICAgcmV0dXJuIHJlc3VsdC5hcmd2O1xufTtcbnlhcmdzUGFyc2VyLmRldGFpbGVkID0gZnVuY3Rpb24gKGFyZ3MsIG9wdHMpIHtcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGFyZ3Muc2xpY2UoKSwgb3B0cyk7XG59O1xueWFyZ3NQYXJzZXIuY2FtZWxDYXNlID0gY2FtZWxDYXNlO1xueWFyZ3NQYXJzZXIuZGVjYW1lbGl6ZSA9IGRlY2FtZWxpemU7XG55YXJnc1BhcnNlci5sb29rc0xpa2VOdW1iZXIgPSBsb29rc0xpa2VOdW1iZXI7XG5leHBvcnQgZGVmYXVsdCB5YXJnc1BhcnNlcjtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiwgQ29udHJpYnV0b3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogSVNDXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbENhc2Uoc3RyKSB7XG4gICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGFzIGNhbWVsIGNhc2UsIGUuZy4sIGZvb0Jhci5cbiAgICAvLyBieSBlbnN1cmluZyB0aGF0IHRoZSBzdHJpbmcgaXNuJ3QgYWxyZWFkeSBtaXhlZCBjYXNlOlxuICAgIGNvbnN0IGlzQ2FtZWxDYXNlID0gc3RyICE9PSBzdHIudG9Mb3dlckNhc2UoKSAmJiBzdHIgIT09IHN0ci50b1VwcGVyQ2FzZSgpO1xuICAgIGlmICghaXNDYW1lbENhc2UpIHtcbiAgICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmIChzdHIuaW5kZXhPZignLScpID09PSAtMSAmJiBzdHIuaW5kZXhPZignXycpID09PSAtMSkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNhbWVsY2FzZSA9ICcnO1xuICAgICAgICBsZXQgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdIeXBoZW5zID0gc3RyLm1hdGNoKC9eLSsvKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxlYWRpbmdIeXBoZW5zID8gbGVhZGluZ0h5cGhlbnNbMF0ubGVuZ3RoIDogMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNociA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAobmV4dENoclVwcGVyKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hyID0gY2hyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gMCAmJiAoY2hyID09PSAnLScgfHwgY2hyID09PSAnXycpKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNociAhPT0gJy0nICYmIGNociAhPT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgY2FtZWxjYXNlICs9IGNocjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FtZWxjYXNlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNhbWVsaXplKHN0ciwgam9pblN0cmluZykge1xuICAgIGNvbnN0IGxvd2VyY2FzZSA9IHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIGpvaW5TdHJpbmcgPSBqb2luU3RyaW5nIHx8ICctJztcbiAgICBsZXQgbm90Q2FtZWxjYXNlID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hyTG93ZXIgPSBsb3dlcmNhc2UuY2hhckF0KGkpO1xuICAgICAgICBjb25zdCBjaHJTdHJpbmcgPSBzdHIuY2hhckF0KGkpO1xuICAgICAgICBpZiAoY2hyTG93ZXIgIT09IGNoclN0cmluZyAmJiBpID4gMCkge1xuICAgICAgICAgICAgbm90Q2FtZWxjYXNlICs9IGAke2pvaW5TdHJpbmd9JHtsb3dlcmNhc2UuY2hhckF0KGkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub3RDYW1lbGNhc2UgKz0gY2hyU3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub3RDYW1lbGNhc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gbG9va3NMaWtlTnVtYmVyKHgpIHtcbiAgICBpZiAoeCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBpZiBsb2FkZWQgZnJvbSBjb25maWcsIG1heSBhbHJlYWR5IGJlIGEgbnVtYmVyLlxuICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIGhleGFkZWNpbWFsLlxuICAgIGlmICgvXjB4WzAtOWEtZl0rJC9pLnRlc3QoeCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIGRvbid0IHRyZWF0IDAxMjMgYXMgYSBudW1iZXI7IGFzIGl0IGRyb3BzIHRoZSBsZWFkaW5nICcwJy5cbiAgICBpZiAoL14wW14uXS8udGVzdCh4KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAvXlstXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKGVbLStdP1xcZCspPyQvLnRlc3QoeCk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG4vLyB0YWtlIGFuIHVuLXNwbGl0IGFyZ3Ygc3RyaW5nIGFuZCB0b2tlbml6ZSBpdC5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZUFyZ1N0cmluZyhhcmdTdHJpbmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdTdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBhcmdTdHJpbmcubWFwKGUgPT4gdHlwZW9mIGUgIT09ICdzdHJpbmcnID8gZSArICcnIDogZSk7XG4gICAgfVxuICAgIGFyZ1N0cmluZyA9IGFyZ1N0cmluZy50cmltKCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBwcmV2QyA9IG51bGw7XG4gICAgbGV0IGMgPSBudWxsO1xuICAgIGxldCBvcGVuaW5nID0gbnVsbDtcbiAgICBjb25zdCBhcmdzID0gW107XG4gICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGFyZ1N0cmluZy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgcHJldkMgPSBjO1xuICAgICAgICBjID0gYXJnU3RyaW5nLmNoYXJBdChpaSk7XG4gICAgICAgIC8vIHNwbGl0IG9uIHNwYWNlcyB1bmxlc3Mgd2UncmUgaW4gcXVvdGVzLlxuICAgICAgICBpZiAoYyA9PT0gJyAnICYmICFvcGVuaW5nKSB7XG4gICAgICAgICAgICBpZiAoIShwcmV2QyA9PT0gJyAnKSkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRvbid0IHNwbGl0IHRoZSBzdHJpbmcgaWYgd2UncmUgaW4gbWF0Y2hpbmdcbiAgICAgICAgLy8gb3BlbmluZyBvciBjbG9zaW5nIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlcy5cbiAgICAgICAgaWYgKGMgPT09IG9wZW5pbmcpIHtcbiAgICAgICAgICAgIG9wZW5pbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjID09PSBcIidcIiB8fCBjID09PSAnXCInKSAmJiAhb3BlbmluZykge1xuICAgICAgICAgICAgb3BlbmluZyA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmdzW2ldKVxuICAgICAgICAgICAgYXJnc1tpXSA9ICcnO1xuICAgICAgICBhcmdzW2ldICs9IGM7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xuZXhwb3J0IHZhciBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleTtcbihmdW5jdGlvbiAoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkpIHtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIkJPT0xFQU5cIl0gPSBcImJvb2xlYW5cIjtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIlNUUklOR1wiXSA9IFwic3RyaW5nXCI7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJOVU1CRVJcIl0gPSBcIm51bWJlclwiO1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiQVJSQVlcIl0gPSBcImFycmF5XCI7XG59KShEZWZhdWx0VmFsdWVzRm9yVHlwZUtleSB8fCAoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgPSB7fSkpO1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xuaW1wb3J0IHsgdG9rZW5pemVBcmdTdHJpbmcgfSBmcm9tICcuL3Rva2VuaXplLWFyZy1zdHJpbmcuanMnO1xuaW1wb3J0IHsgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgfSBmcm9tICcuL3lhcmdzLXBhcnNlci10eXBlcy5qcyc7XG5pbXBvcnQgeyBjYW1lbENhc2UsIGRlY2FtZWxpemUsIGxvb2tzTGlrZU51bWJlciB9IGZyb20gJy4vc3RyaW5nLXV0aWxzLmpzJztcbmxldCBtaXhpbjtcbmV4cG9ydCBjbGFzcyBZYXJnc1BhcnNlciB7XG4gICAgY29uc3RydWN0b3IoX21peGluKSB7XG4gICAgICAgIG1peGluID0gX21peGluO1xuICAgIH1cbiAgICBwYXJzZShhcmdzSW5wdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgYWxpYXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFycmF5OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib29sZWFuOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZ09iamVjdHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvZXJjZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY291bnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVudlByZWZpeDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbmFyZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbm9ybWFsaXplOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdHJpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG51bWJlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgX186IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGtleTogdW5kZWZpbmVkXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgICAvLyBhbGxvdyBhIHN0cmluZyBhcmd1bWVudCB0byBiZSBwYXNzZWQgaW4gcmF0aGVyXG4gICAgICAgIC8vIHRoYW4gYW4gYXJndiBhcnJheS5cbiAgICAgICAgY29uc3QgYXJncyA9IHRva2VuaXplQXJnU3RyaW5nKGFyZ3NJbnB1dCk7XG4gICAgICAgIC8vIHRva2VuaXplQXJnU3RyaW5nIGFkZHMgZXh0cmEgcXVvdGVzIHRvIGFyZ3MgaWYgYXJnc0lucHV0IGlzIGEgc3RyaW5nXG4gICAgICAgIC8vIG9ubHkgc3RyaXAgdGhvc2UgZXh0cmEgcXVvdGVzIGluIHByb2Nlc3NWYWx1ZSBpZiBhcmdzSW5wdXQgaXMgYSBzdHJpbmdcbiAgICAgICAgY29uc3QgaW5wdXRJc1N0cmluZyA9IHR5cGVvZiBhcmdzSW5wdXQgPT09ICdzdHJpbmcnO1xuICAgICAgICAvLyBhbGlhc2VzIG1pZ2h0IGhhdmUgdHJhbnNpdGl2ZSByZWxhdGlvbnNoaXBzLCBub3JtYWxpemUgdGhpcy5cbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IGNvbWJpbmVBbGlhc2VzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5hbGlhcykpO1xuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAnYm9vbGVhbi1uZWdhdGlvbic6IHRydWUsXG4gICAgICAgICAgICAnY2FtZWwtY2FzZS1leHBhbnNpb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2NvbWJpbmUtYXJyYXlzJzogZmFsc2UsXG4gICAgICAgICAgICAnZG90LW5vdGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgICAgICdkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5JzogdHJ1ZSxcbiAgICAgICAgICAgICdmbGF0dGVuLWR1cGxpY2F0ZS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2dyZWVkeS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2hhbHQtYXQtbm9uLW9wdGlvbic6IGZhbHNlLFxuICAgICAgICAgICAgJ25hcmdzLWVhdHMtb3B0aW9ucyc6IGZhbHNlLFxuICAgICAgICAgICAgJ25lZ2F0aW9uLXByZWZpeCc6ICduby0nLFxuICAgICAgICAgICAgJ3BhcnNlLW51bWJlcnMnOiB0cnVlLFxuICAgICAgICAgICAgJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyc6IHRydWUsXG4gICAgICAgICAgICAncG9wdWxhdGUtLSc6IGZhbHNlLFxuICAgICAgICAgICAgJ3NldC1wbGFjZWhvbGRlci1rZXknOiBmYWxzZSxcbiAgICAgICAgICAgICdzaG9ydC1vcHRpb24tZ3JvdXBzJzogdHJ1ZSxcbiAgICAgICAgICAgICdzdHJpcC1hbGlhc2VkJzogZmFsc2UsXG4gICAgICAgICAgICAnc3RyaXAtZGFzaGVkJzogZmFsc2UsXG4gICAgICAgICAgICAndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnOiBmYWxzZVxuICAgICAgICB9LCBvcHRzLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5kZWZhdWx0KTtcbiAgICAgICAgY29uc3QgY29uZmlnT2JqZWN0cyA9IG9wdHMuY29uZmlnT2JqZWN0cyB8fCBbXTtcbiAgICAgICAgY29uc3QgZW52UHJlZml4ID0gb3B0cy5lbnZQcmVmaXg7XG4gICAgICAgIGNvbnN0IG5vdEZsYWdzT3B0aW9uID0gY29uZmlndXJhdGlvblsncG9wdWxhdGUtLSddO1xuICAgICAgICBjb25zdCBub3RGbGFnc0FyZ3YgPSBub3RGbGFnc09wdGlvbiA/ICctLScgOiAnXyc7XG4gICAgICAgIGNvbnN0IG5ld0FsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBkZWZhdWx0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyBhbGxvdyBhIGkxOG4gaGFuZGxlciB0byBiZSBwYXNzZWQgaW4sIGRlZmF1bHQgdG8gYSBmYWtlIG9uZSAodXRpbC5mb3JtYXQpLlxuICAgICAgICBjb25zdCBfXyA9IG9wdHMuX18gfHwgbWl4aW4uZm9ybWF0O1xuICAgICAgICBjb25zdCBmbGFncyA9IHtcbiAgICAgICAgICAgIGFsaWFzZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBhcnJheXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBib29sczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIHN0cmluZ3M6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBudW1iZXJzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY291bnRzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgbm9ybWFsaXplOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29uZmlnczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG5hcmdzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29lcmNpb25zOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAga2V5czogW11cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmUgPSAvXi0oWzAtOV0rKFxcLlswLTldKyk/fFxcLlswLTldKykkLztcbiAgICAgICAgY29uc3QgbmVnYXRlZEJvb2xlYW4gPSBuZXcgUmVnRXhwKCdeLS0nICsgY29uZmlndXJhdGlvblsnbmVnYXRpb24tcHJlZml4J10gKyAnKC4rKScpO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5hcnJheSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdHlwZW9mIG9wdCA9PT0gJ29iamVjdCcgPyBvcHQua2V5IDogb3B0O1xuICAgICAgICAgICAgLy8gYXNzaWduIHRvIGZsYWdzW2Jvb2xzfHN0cmluZ3N8bnVtYmVyc11cbiAgICAgICAgICAgIGNvbnN0IGFzc2lnbm1lbnQgPSBPYmplY3Qua2V5cyhvcHQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlGbGFnS2V5cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbjogJ2Jvb2xzJyxcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nOiAnc3RyaW5ncycsXG4gICAgICAgICAgICAgICAgICAgIG51bWJlcjogJ251bWJlcnMnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlGbGFnS2V5c1trZXldO1xuICAgICAgICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pLnBvcCgpO1xuICAgICAgICAgICAgLy8gYXNzaWduIGtleSB0byBiZSBjb2VyY2VkXG4gICAgICAgICAgICBpZiAoYXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZsYWdzW2Fzc2lnbm1lbnRdW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmxhZ3MuYXJyYXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5ib29sZWFuIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5ib29sc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMuc3RyaW5nIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5zdHJpbmdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5udW1iZXIgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLm51bWJlcnNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmNvdW50IHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5jb3VudHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLm5vcm1hbGl6ZSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZmxhZ3Mubm9ybWFsaXplW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubmFyZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMubmFyZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MubmFyZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY29lcmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb2VyY2UpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29lcmNpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmNvbmZpZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMuY29uZmlnKSB8fCB0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIFtdLmNvbmNhdChvcHRzLmNvbmZpZykuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5jb25maWdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdHMuY29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMuY29uZmlnKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29uZmlnc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgdGFibGUgdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgYWxsXG4gICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBhbGlhc2VzOiB7ZjogWydmb28nXSwgZm9vOiBbJ2YnXX1cbiAgICAgICAgZXh0ZW5kQWxpYXNlcyhvcHRzLmtleSwgYWxpYXNlcywgb3B0cy5kZWZhdWx0LCBmbGFncy5hcnJheXMpO1xuICAgICAgICAvLyBhcHBseSBkZWZhdWx0IHZhbHVlcyB0byBhbGwgYWxpYXNlcy5cbiAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgKGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1thbGlhc10gPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgbGV0IG5vdEZsYWdzID0gW107XG4gICAgICAgIGNvbnN0IGFyZ3YgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHsgXzogW10gfSk7XG4gICAgICAgIC8vIFRPRE8oYmNvZSk6IGZvciB0aGUgZmlyc3QgcGFzcyBhdCByZW1vdmluZyBvYmplY3QgcHJvdG90eXBlICB3ZSBkaWRuJ3RcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBwcm90b3R5cGVzIGZyb20gb2JqZWN0cyByZXR1cm5lZCBieSB0aGlzIEFQSSwgd2UgbWlnaHQgd2FudFxuICAgICAgICAvLyB0byBncmFkdWFsbHkgbW92ZSB0b3dhcmRzIGRvaW5nIHNvLlxuICAgICAgICBjb25zdCBhcmd2UmV0dXJuID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHRydW5jYXRlZEFyZyA9IGFyZy5yZXBsYWNlKC9eLXszLH0vLCAnLS0tJyk7XG4gICAgICAgICAgICBsZXQgYnJva2VuO1xuICAgICAgICAgICAgbGV0IGtleTtcbiAgICAgICAgICAgIGxldCBsZXR0ZXJzO1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgIC8vIGFueSB1bmtub3duIG9wdGlvbiAoZXhjZXB0IGZvciBlbmQtb2Ytb3B0aW9ucywgXCItLVwiKVxuICAgICAgICAgICAgaWYgKGFyZyAhPT0gJy0tJyAmJiAvXi0vLnRlc3QoYXJnKSAmJiBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgICAgICAvLyAtLS0sIC0tLT0sIC0tLS0sIGV0YyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRydW5jYXRlZEFyZy5tYXRjaCgvXi0tLSsoPXwkKS8pKSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW9ucyB3aXRob3V0IGtleSBuYW1lIGFyZSBpbnZhbGlkLlxuICAgICAgICAgICAgICAgIHB1c2hQb3NpdGlvbmFsKGFyZyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gLS0gc2VwYXJhdGVkIGJ5ID1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLis9LykgfHwgKCFjb25maWd1cmF0aW9uWydzaG9ydC1vcHRpb24tZ3JvdXBzJ10gJiYgYXJnLm1hdGNoKC9eLS4rPS8pKSkge1xuICAgICAgICAgICAgICAgIC8vIFVzaW5nIFtcXHNcXFNdIGluc3RlYWQgb2YgLiBiZWNhdXNlIGpzIGRvZXNuJ3Qgc3VwcG9ydCB0aGVcbiAgICAgICAgICAgICAgICAvLyAnZG90YWxsJyByZWdleCBtb2RpZmllci4gU2VlOlxuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEwNjgzMDgvMTMyMTZcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLS0/KFtePV0rKT0oW1xcc1xcU10qKSQvKTtcbiAgICAgICAgICAgICAgICAvLyBhcnJheXMgZm9ybWF0ID0gJy0tZj1hIGIgYydcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhtWzFdLCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwgbVsxXSwgYXJncywgbVsyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKG1bMV0sIGZsYWdzLm5hcmdzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hcmdzIGZvcm1hdCA9ICctLWY9bW9ua2V5IHdhc2hpbmcgY2F0J1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIG1bMV0sIGFyZ3MsIG1bMl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKSAmJiBjb25maWd1cmF0aW9uWydib29sZWFuLW5lZ2F0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSA/IFtmYWxzZV0gOiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIC0tIHNlcGFyYXRlZCBieSBzcGFjZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLisvKSB8fCAoIWNvbmZpZ3VyYXRpb25bJ3Nob3J0LW9wdGlvbi1ncm91cHMnXSAmJiBhcmcubWF0Y2goL14tW14tXSsvKSkpIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLS0/KC4rKS8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBtWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy0tZm9vIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy0tZm9vIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRydXRoeSBldmVuIGlmOiBmbGFncy5uYXJnc1trZXldID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCFuZXh0Lm1hdGNoKC9eLS8pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRvdC1ub3RhdGlvbiBmbGFnIHNlcGFyYXRlZCBieSAnPScuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2goL14tLlxcLi4rPS8pKSB7XG4gICAgICAgICAgICAgICAgbSA9IGFyZy5tYXRjaCgvXi0oW149XSspPShbXFxzXFxTXSopJC8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBzZXRBcmcobVsxXSwgbVsyXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRvdC1ub3RhdGlvbiBmbGFnIHNlcGFyYXRlZCBieSBzcGFjZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0uXFwuLisvKSAmJiAhYXJnLm1hdGNoKG5lZ2F0aXZlKSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLSguXFwuLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgIW5leHQubWF0Y2goL14tLykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi1bXi1dKy8pICYmICFhcmcubWF0Y2gobmVnYXRpdmUpKSB7XG4gICAgICAgICAgICAgICAgbGV0dGVycyA9IGFyZy5zbGljZSgxLCAtMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgICAgIGJyb2tlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnLnNsaWNlKGogKyAyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnLnNsaWNlKGogKyAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGxldHRlcnNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGZvcm1hdCA9ICctZj1hIGIgYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy1mPW1vbmtleSB3YXNoaW5nIGNhdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBsZXR0ZXIgaXMgYW4gYWxwaGFiZXRpYyBjaGFyYWN0ZXIgYW5kIG5leHQgdmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgL14tP1xcZCsoXFwuXFxkKik/KGUtP1xcZCspPyQvLnRlc3QobmV4dCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhuZXh0LCBmbGFncy5ib29scykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIGRlZmF1bHRWYWx1ZShsZXR0ZXJzW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga2V5ID0gYXJnLnNsaWNlKC0xKVswXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJyb2tlbiAmJiBrZXkgIT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy1mIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy1mIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRydXRoeSBldmVuIGlmOiBmbGFncy5uYXJnc1trZXldID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCEvXigtfC0tKVteLV0vLnRlc3QobmV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Lm1hdGNoKG5lZ2F0aXZlKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgvXih0cnVlfGZhbHNlKSQvLnRlc3QobmV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2goL14tWzAtOV0kLykgJiZcbiAgICAgICAgICAgICAgICBhcmcubWF0Y2gobmVnYXRpdmUpICYmXG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGFyZy5zbGljZSgxKSwgZmxhZ3MuYm9vbHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gc2luZ2xlLWRpZ2l0IGJvb2xlYW4gYWxpYXMsIGUuZzogeGFyZ3MgLTBcbiAgICAgICAgICAgICAgICBrZXkgPSBhcmcuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICAgICAgICAgICAgbm90RmxhZ3MgPSBhcmdzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmZpZ3VyYXRpb25bJ2hhbHQtYXQtbm9uLW9wdGlvbiddKSB7XG4gICAgICAgICAgICAgICAgbm90RmxhZ3MgPSBhcmdzLnNsaWNlKGkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBvcmRlciBvZiBwcmVjZWRlbmNlOlxuICAgICAgICAvLyAxLiBjb21tYW5kIGxpbmUgYXJnXG4gICAgICAgIC8vIDIuIHZhbHVlIGZyb20gZW52IHZhclxuICAgICAgICAvLyAzLiB2YWx1ZSBmcm9tIGNvbmZpZyBmaWxlXG4gICAgICAgIC8vIDQuIHZhbHVlIGZyb20gY29uZmlnIG9iamVjdHNcbiAgICAgICAgLy8gNS4gY29uZmlndXJlZCBkZWZhdWx0IHZhbHVlXG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCB0cnVlKTsgLy8gc3BlY2lhbCBjYXNlOiBjaGVjayBlbnYgdmFycyB0aGF0IHBvaW50IHRvIGNvbmZpZyBmaWxlXG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCBmYWxzZSk7XG4gICAgICAgIHNldENvbmZpZyhhcmd2KTtcbiAgICAgICAgc2V0Q29uZmlnT2JqZWN0cygpO1xuICAgICAgICBhcHBseURlZmF1bHRzQW5kQWxpYXNlcyhhcmd2LCBmbGFncy5hbGlhc2VzLCBkZWZhdWx0cywgdHJ1ZSk7XG4gICAgICAgIGFwcGx5Q29lcmNpb25zKGFyZ3YpO1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnc2V0LXBsYWNlaG9sZGVyLWtleSddKVxuICAgICAgICAgICAgc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpO1xuICAgICAgICAvLyBmb3IgYW55IGNvdW50cyBlaXRoZXIgbm90IGluIGFyZ3Mgb3Igd2l0aG91dCBhbiBleHBsaWNpdCBkZWZhdWx0LCBzZXQgdG8gMFxuICAgICAgICBPYmplY3Qua2V5cyhmbGFncy5jb3VudHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwga2V5LnNwbGl0KCcuJykpKVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gJy0tJyBkZWZhdWx0cyB0byB1bmRlZmluZWQuXG4gICAgICAgIGlmIChub3RGbGFnc09wdGlvbiAmJiBub3RGbGFncy5sZW5ndGgpXG4gICAgICAgICAgICBhcmd2W25vdEZsYWdzQXJndl0gPSBbXTtcbiAgICAgICAgbm90RmxhZ3MuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBhcmd2W25vdEZsYWdzQXJndl0ucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10gJiYgY29uZmlndXJhdGlvblsnc3RyaXAtZGFzaGVkJ10pIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZpbHRlcihrZXkgPT4ga2V5ICE9PSAnLS0nICYmIGtleS5pbmNsdWRlcygnLScpKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3Zba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydzdHJpcC1hbGlhc2VkJ10pIHtcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIFtdLmNvbmNhdCguLi5PYmplY3Qua2V5cyhhbGlhc2VzKS5tYXAoayA9PiBhbGlhc2VzW2tdKSkuZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10gJiYgYWxpYXMuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgYXJndlthbGlhcy5zcGxpdCgnLicpLm1hcChwcm9wID0+IGNhbWVsQ2FzZShwcm9wKSkuam9pbignLicpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3ZbYWxpYXNdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHVzaCBhcmd1bWVudCBpbnRvIHBvc2l0aW9uYWwgYXJyYXksIGFwcGx5aW5nIG51bWVyaWMgY29lcmNpb246XG4gICAgICAgIGZ1bmN0aW9uIHB1c2hQb3NpdGlvbmFsKGFyZykge1xuICAgICAgICAgICAgY29uc3QgbWF5YmVDb2VyY2VkTnVtYmVyID0gbWF5YmVDb2VyY2VOdW1iZXIoJ18nLCBhcmcpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgYXJndi5fLnB1c2gobWF5YmVDb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBob3cgbWFueSBhcmd1bWVudHMgc2hvdWxkIHdlIGNvbnN1bWUsIGJhc2VkXG4gICAgICAgIC8vIG9uIHRoZSBuYXJncyBvcHRpb24/XG4gICAgICAgIGZ1bmN0aW9uIGVhdE5hcmdzKGksIGtleSwgYXJncywgYXJnQWZ0ZXJFcXVhbFNpZ24pIHtcbiAgICAgICAgICAgIGxldCBpaTtcbiAgICAgICAgICAgIGxldCB0b0VhdCA9IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKTtcbiAgICAgICAgICAgIC8vIE5hTiBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgZm9yIHRoZSBhcnJheSB0eXBlLCBpbmRpY2F0aW5nIHRoYXQgb25lIG9yXG4gICAgICAgICAgICAvLyBtb3JlIHZhbHVlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICAgICAgICB0b0VhdCA9IHR5cGVvZiB0b0VhdCAhPT0gJ251bWJlcicgfHwgaXNOYU4odG9FYXQpID8gMSA6IHRvRWF0O1xuICAgICAgICAgICAgaWYgKHRvRWF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnQXJndW1lbnQgdW5leHBlY3RlZCBmb3I6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhdmFpbGFibGUgPSBpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgPyAwIDogMTtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWyduYXJncy1lYXRzLW9wdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgIC8vIGNsYXNzaWMgYmVoYXZpb3IsIHlhcmdzIGVhdHMgcG9zaXRpb25hbCBhbmQgZGFzaCBhcmd1bWVudHMuXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIC0gKGkgKyAxKSArIGF2YWlsYWJsZSA8IHRvRWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gdG9FYXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBuYXJncyB3aWxsIG5vdCBjb25zdW1lIGZsYWcgYXJndW1lbnRzLCBlLmcuLCAtYWJjLCAtLWZvbyxcbiAgICAgICAgICAgICAgICAvLyBhbmQgdGVybWluYXRlcyB3aGVuIG9uZSBpcyBvYnNlcnZlZC5cbiAgICAgICAgICAgICAgICBmb3IgKGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmdzW2lpXS5tYXRjaCgvXi1bXjAtOV0vKSB8fCBhcmdzW2lpXS5tYXRjaChuZWdhdGl2ZSkgfHwgaXNVbmtub3duT3B0aW9uQXNBcmcoYXJnc1tpaV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlKys7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlIDwgdG9FYXQpXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb25zdW1lZCA9IE1hdGgubWluKGF2YWlsYWJsZSwgdG9FYXQpO1xuICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgJiYgY29uc3VtZWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnQWZ0ZXJFcXVhbFNpZ24pO1xuICAgICAgICAgICAgICAgIGNvbnN1bWVkLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGlpID0gaSArIDE7IGlpIDwgKGNvbnN1bWVkICsgaSArIDEpOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnc1tpaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChpICsgY29uc3VtZWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFuIG9wdGlvbiBpcyBhbiBhcnJheSwgZWF0IGFsbCBub24taHlwaGVuYXRlZCBhcmd1bWVudHNcbiAgICAgICAgLy8gZm9sbG93aW5nIGl0Li4uIFlVTSFcbiAgICAgICAgLy8gZS5nLiwgLS1mb28gYXBwbGUgYmFuYW5hIGNhdCBiZWNvbWVzIFtcImFwcGxlXCIsIFwiYmFuYW5hXCIsIFwiY2F0XCJdXG4gICAgICAgIGZ1bmN0aW9uIGVhdEFycmF5KGksIGtleSwgYXJncywgYXJnQWZ0ZXJFcXVhbFNpZ24pIHtcbiAgICAgICAgICAgIGxldCBhcmdzVG9TZXQgPSBbXTtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gYXJnQWZ0ZXJFcXVhbFNpZ24gfHwgYXJnc1tpICsgMV07XG4gICAgICAgICAgICAvLyBJZiBib3RoIGFycmF5IGFuZCBuYXJncyBhcmUgY29uZmlndXJlZCwgZW5mb3JjZSB0aGUgbmFyZ3MgY291bnQ6XG4gICAgICAgICAgICBjb25zdCBuYXJnc0NvdW50ID0gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJiAhKC9eKHRydWV8ZmFsc2UpJC8udGVzdChuZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBhcmdzVG9TZXQucHVzaCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzVW5kZWZpbmVkKG5leHQpIHx8XG4gICAgICAgICAgICAgICAgKGlzVW5kZWZpbmVkKGFyZ0FmdGVyRXF1YWxTaWduKSAmJiAvXi0vLnRlc3QobmV4dCkgJiYgIW5lZ2F0aXZlLnRlc3QobmV4dCkgJiYgIWlzVW5rbm93bk9wdGlvbkFzQXJnKG5leHQpKSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBrZXlzIHdpdGhvdXQgdmFsdWUgPT0+IGFyZ3NUb1NldCByZW1haW5zIGFuIGVtcHR5IFtdXG4gICAgICAgICAgICAgICAgLy8gc2V0IHVzZXIgZGVmYXVsdCB2YWx1ZSwgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZWYWwgPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgICAgICAgICBhcmdzVG9TZXQgPSBBcnJheS5pc0FycmF5KGRlZlZhbCkgPyBkZWZWYWwgOiBbZGVmVmFsXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpbiAtLW9wdGlvbj12YWx1ZSBpcyBlYXRlbiBhcyBpc1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIGFyZ0FmdGVyRXF1YWxTaWduLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghY29uZmlndXJhdGlvblsnZ3JlZWR5LWFycmF5cyddICYmIGFyZ3NUb1NldC5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKG5hcmdzQ291bnQgJiYgdHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmIGFyZ3NUb1NldC5sZW5ndGggPj0gbmFyZ3NDb3VudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaWldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpID0gaWk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIG5leHQsIGlucHV0SXNTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBib3RoIGFycmF5IGFuZCBuYXJncyBhcmUgY29uZmlndXJlZCwgY3JlYXRlIGFuIGVycm9yIGlmIGxlc3MgdGhhblxuICAgICAgICAgICAgLy8gbmFyZ3MgcG9zaXRpb25hbHMgd2VyZSBmb3VuZC4gTmFOIGhhcyBzcGVjaWFsIG1lYW5pbmcsIGluZGljYXRpbmdcbiAgICAgICAgICAgIC8vIHRoYXQgYXQgbGVhc3Qgb25lIHZhbHVlIGlzIHJlcXVpcmVkIChtb3JlIGFyZSBva2F5KS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFyZ3NDb3VudCA9PT0gJ251bWJlcicgJiYgKChuYXJnc0NvdW50ICYmIGFyZ3NUb1NldC5sZW5ndGggPCBuYXJnc0NvdW50KSB8fFxuICAgICAgICAgICAgICAgIChpc05hTihuYXJnc0NvdW50KSAmJiBhcmdzVG9TZXQubGVuZ3RoID09PSAwKSkpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRBcmcoa2V5LCBhcmdzVG9TZXQpO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0QXJnKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3RlcyA9IGlucHV0SXNTdHJpbmcpIHtcbiAgICAgICAgICAgIGlmICgvLS8udGVzdChrZXkpICYmIGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGlhcyA9IGtleS5zcGxpdCgnLicpLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtZWxDYXNlKHByb3ApO1xuICAgICAgICAgICAgICAgIH0pLmpvaW4oJy4nKTtcbiAgICAgICAgICAgICAgICBhZGROZXdBbGlhcyhrZXksIGFsaWFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvY2Vzc1ZhbHVlKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3Rlcyk7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEtleSA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIHNwbGl0S2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAvLyBoYW5kbGUgcG9wdWxhdGluZyBhbGlhc2VzIG9mIHRoZSBmdWxsIGtleVxuICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBoYW5kbGUgcG9wdWxhdGluZyBhbGlhc2VzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBkb3Qtbm90YXRpb24ga2V5XG4gICAgICAgICAgICBpZiAoc3BsaXRLZXkubGVuZ3RoID4gMSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAoZmxhZ3MuYWxpYXNlc1tzcGxpdEtleVswXV0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cGFuZCBhbGlhcyB3aXRoIG5lc3RlZCBvYmplY3RzIGluIGtleVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0gW10uY29uY2F0KHNwbGl0S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgYS5zaGlmdCgpOyAvLyBudWtlIHRoZSBvbGQga2V5LlxuICAgICAgICAgICAgICAgICAgICBrZXlQcm9wZXJ0aWVzID0ga2V5UHJvcGVydGllcy5jb25jYXQoYSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBvcHVsYXRlIGFsaWFzIG9ubHkgaWYgaXMgbm90IGFscmVhZHkgYW4gYWxpYXMgb2YgdGhlIGZ1bGwga2V5XG4gICAgICAgICAgICAgICAgICAgIC8vIChhbHJlYWR5IHBvcHVsYXRlZCBhYm92ZSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKS5pbmNsdWRlcyhrZXlQcm9wZXJ0aWVzLmpvaW4oJy4nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCBub3JtYWxpemUgZ2V0dGVyIGFuZCBzZXR0ZXIgd2hlbiBrZXkgaXMgaW4gJ25vcm1hbGl6ZScgYnV0IGlzbid0IGFuIGFycmF5XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Mubm9ybWFsaXplKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBba2V5XS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKTtcbiAgICAgICAgICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJndlJldHVybiwga2V5LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG1peGluLm5vcm1hbGl6ZSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYWRkTmV3QWxpYXMoa2V5LCBhbGlhcykge1xuICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1trZXldICYmIGZsYWdzLmFsaWFzZXNba2V5XS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldID0gW2FsaWFzXTtcbiAgICAgICAgICAgICAgICBuZXdBbGlhc2VzW2FsaWFzXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2FsaWFzXSAmJiBmbGFncy5hbGlhc2VzW2FsaWFzXS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgYWRkTmV3QWxpYXMoYWxpYXMsIGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc1ZhbHVlKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3Rlcykge1xuICAgICAgICAgICAgLy8gc3RyaW5ncyBtYXkgYmUgcXVvdGVkLCBjbGVhbiB0aGlzIHVwIGFzIHdlIGFzc2lnbiB2YWx1ZXMuXG4gICAgICAgICAgICBpZiAoc2hvdWxkU3RyaXBRdW90ZXMpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBzdHJpcFF1b3Rlcyh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaGFuZGxlIHBhcnNpbmcgYm9vbGVhbiBhcmd1bWVudHMgLS1mb289dHJ1ZSAtLWJhciBmYWxzZS5cbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgfHwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsID09PSAndHJ1ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbClcbiAgICAgICAgICAgICAgICA/IHZhbC5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdik7IH0pXG4gICAgICAgICAgICAgICAgOiBtYXliZUNvZXJjZU51bWJlcihrZXksIHZhbCk7XG4gICAgICAgICAgICAvLyBpbmNyZW1lbnQgYSBjb3VudCBnaXZlbiBhcyBhcmcgKGVpdGhlciBubyB2YWx1ZSBvciB2YWx1ZSBwYXJzZWQgYXMgYm9vbGVhbilcbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpICYmIChpc1VuZGVmaW5lZCh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBpbmNyZW1lbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCBub3JtYWxpemVkIHZhbHVlIHdoZW4ga2V5IGlzIGluICdub3JtYWxpemUnIGFuZCBpbiAnYXJyYXlzJ1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsLm1hcCgodmFsKSA9PiB7IHJldHVybiBtaXhpbi5ub3JtYWxpemUodmFsKTsgfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1peGluLm5vcm1hbGl6ZSh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJ10gJiYga2V5ID09PSAnXycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5zdHJpbmdzKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZENvZXJjZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcih2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsncGFyc2UtbnVtYmVycyddICYmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dmFsdWV9YCkpKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENvZXJjZU51bWJlciB8fCAoIWlzVW5kZWZpbmVkKHZhbHVlKSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgYXJncyBmcm9tIGNvbmZpZy5qc29uIGZpbGUsIHRoaXMgc2hvdWxkIGJlXG4gICAgICAgIC8vIGFwcGxpZWQgbGFzdCBzbyB0aGF0IGRlZmF1bHRzIGNhbiBiZSBhcHBsaWVkLlxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWcoYXJndikge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIC8vIGV4cGFuZCBkZWZhdWx0cy9hbGlhc2VzLCBpbi1jYXNlIGFueSBoYXBwZW4gdG8gcmVmZXJlbmNlXG4gICAgICAgICAgICAvLyB0aGUgY29uZmlnLmpzb24gZmlsZS5cbiAgICAgICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGNvbmZpZ0xvb2t1cCwgZmxhZ3MuYWxpYXNlcywgZGVmYXVsdHMpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmxhZ3MuY29uZmlncykuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGFyZ3ZbY29uZmlnS2V5XSB8fCBjb25maWdMb29rdXBbY29uZmlnS2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbmZpZ1BhdGggPSBtaXhpbi5yZXNvbHZlKG1peGluLmN3ZCgpLCBjb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVDb25maWcgPSBmbGFncy5jb25maWdzW2NvbmZpZ0tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSByZXNvbHZlQ29uZmlnKHJlc29sdmVkQ29uZmlnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1peGluLnJlcXVpcmUocmVzb2x2ZWRDb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVubyB3aWxsIHJlY2VpdmUgYSBQZXJtaXNzaW9uRGVuaWVkIGVycm9yIGlmIGFuIGF0dGVtcHQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hZGUgdG8gbG9hZCBjb25maWcgd2l0aG91dCB0aGUgLS1hbGxvdy1yZWFkIGZsYWc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXgubmFtZSA9PT0gJ1Blcm1pc3Npb25EZW5pZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmd2W2NvbmZpZ0tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnSW52YWxpZCBKU09OIGNvbmZpZyBmaWxlOiAlcycsIGNvbmZpZ1BhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBhcmdzIGZyb20gY29uZmlnIG9iamVjdC5cbiAgICAgICAgLy8gaXQgcmVjdXJzaXZlbHkgY2hlY2tzIG5lc3RlZCBvYmplY3RzLlxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3QoY29uZmlnLCBwcmV2KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbEtleSA9IHByZXYgPyBwcmV2ICsgJy4nICsga2V5IDoga2V5O1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbm5lciBvYmplY3QgYW5kIHdlIGhhdmUgZG90LW5vdGF0aW9uXG4gICAgICAgICAgICAgICAgLy8gZW5hYmxlZCwgdHJlYXQgaW5uZXIgb2JqZWN0cyBpbiBjb25maWcgdGhlIHNhbWUgYXNcbiAgICAgICAgICAgICAgICAvLyBoZWF2aWx5IG5lc3RlZCBkb3Qgbm90YXRpb25zIChmb28uYmFyLmFwcGxlKS5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCBidXQgbm90IGFuIGFycmF5LCBjaGVjayBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdCh2YWx1ZSwgZnVsbEtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXR0aW5nIGFyZ3VtZW50cyB2aWEgQ0xJIHRha2VzIHByZWNlZGVuY2Ugb3ZlclxuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgd2l0aGluIHRoZSBjb25maWcgZmlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwgZnVsbEtleS5zcGxpdCgnLicpKSB8fCAoY2hlY2tBbGxBbGlhc2VzKGZ1bGxLZXksIGZsYWdzLmFycmF5cykgJiYgY29uZmlndXJhdGlvblsnY29tYmluZS1hcnJheXMnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhmdWxsS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgYWxsIGNvbmZpZyBvYmplY3RzIHBhc3NlZCBpbiBvcHRzXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbmZpZ09iamVjdHMoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZ09iamVjdHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnT2JqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChjb25maWdPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0Q29uZmlnT2JqZWN0KGNvbmZpZ09iamVjdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlFbnZWYXJzKGFyZ3YsIGNvbmZpZ09ubHkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW52UHJlZml4ID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSB0eXBlb2YgZW52UHJlZml4ID09PSAnc3RyaW5nJyA/IGVudlByZWZpeCA6ICcnO1xuICAgICAgICAgICAgY29uc3QgZW52ID0gbWl4aW4uZW52KCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhlbnYpLmZvckVhY2goZnVuY3Rpb24gKGVudlZhcikge1xuICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT09ICcnIHx8IGVudlZhci5sYXN0SW5kZXhPZihwcmVmaXgsIDApID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBhcnJheSBvZiBuZXN0ZWQga2V5cyBhbmQgY29udmVydCB0aGVtIHRvIGNhbWVsIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IGVudlZhci5zcGxpdCgnX18nKS5tYXAoZnVuY3Rpb24gKGtleSwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZShrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCgoY29uZmlnT25seSAmJiBmbGFncy5jb25maWdzW2tleXMuam9pbignLicpXSkgfHwgIWNvbmZpZ09ubHkpICYmICFoYXNLZXkoYXJndiwga2V5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXlzLmpvaW4oJy4nKSwgZW52W2VudlZhcl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlDb2VyY2lvbnMoYXJndikge1xuICAgICAgICAgICAgbGV0IGNvZXJjZTtcbiAgICAgICAgICAgIGNvbnN0IGFwcGxpZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFwcGxpZWQuaGFzKGtleSkpIHsgLy8gSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGNvZXJjZWQgdGhpcyBvcHRpb24gdmlhIG9uZSBvZiBpdHMgYWxpYXNlc1xuICAgICAgICAgICAgICAgICAgICBjb2VyY2UgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb2VyY2lvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1heWJlQ29lcmNlTnVtYmVyKGtleSwgY29lcmNlKGFyZ3Zba2V5XSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpKS5mb3JFYWNoKGFsaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQuYWRkKGFsaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbYWxpXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpIHtcbiAgICAgICAgICAgIGZsYWdzLmtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2V0IHBsYWNlaG9sZGVyIGtleXMgZm9yIGRvdCBub3RhdGlvbiBvcHRpb25zICdmb28uYmFyJy5cbiAgICAgICAgICAgICAgICBpZiAofmtleS5pbmRleE9mKCcuJykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3Zba2V5XSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgICAgIGFyZ3Zba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlEZWZhdWx0c0FuZEFsaWFzZXMob2JqLCBhbGlhc2VzLCBkZWZhdWx0cywgY2FuTG9nID0gZmFsc2UpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleShvYmosIGtleS5zcGxpdCgnLicpKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRLZXkob2JqLCBrZXkuc3BsaXQoJy4nKSwgZGVmYXVsdHNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5Mb2cpXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ZWRba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIChhbGlhc2VzW2tleV0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNLZXkob2JqLCB4LnNwbGl0KCcuJykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEtleShvYmosIHguc3BsaXQoJy4nKSwgZGVmYXVsdHNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0tleShvYmosIGtleXMpIHtcbiAgICAgICAgICAgIGxldCBvID0gb2JqO1xuICAgICAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSlcbiAgICAgICAgICAgICAgICBrZXlzID0gW2tleXMuam9pbignLicpXTtcbiAgICAgICAgICAgIGtleXMuc2xpY2UoMCwgLTEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIG8gPSAob1trZXldIHx8IHt9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleSBpbiBvO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNldEtleShvYmosIGtleXMsIHZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG9iajtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pXG4gICAgICAgICAgICAgICAga2V5cyA9IFtrZXlzLmpvaW4oJy4nKV07XG4gICAgICAgICAgICBrZXlzLnNsaWNlKDAsIC0xKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPKGJjb2UpOiBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIHlhcmdzLCBzd2l0Y2ggdG9cbiAgICAgICAgICAgICAgICAvLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG4gICAgICAgICAgICAgICAga2V5ID0gc2FuaXRpemVLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG8gPT09ICdvYmplY3QnICYmIG9ba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IG9ba2V5XSBpcyBhbiBhcnJheSwgYW5kIHRoYXQgdGhlIGxhc3QgaXRlbSBpcyBhbiBlbXB0eSBvYmplY3QuXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XS5wdXNoKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHt9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgZW1wdHkgb2JqZWN0IGF0IHRoZSBlbmQgb2YgdGhlIG9ba2V5XSBhcnJheSwgc28gc2V0IG8gdG8gdGhhdCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgbyA9IG9ba2V5XVtvW2tleV0ubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvID0gb1trZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gVE9ETyhiY29lKTogaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiB5YXJncywgc3dpdGNoIHRvXG4gICAgICAgICAgICAvLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzYW5pdGl6ZUtleShrZXlzW2tleXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlQXJyYXkgPSBjaGVja0FsbEFsaWFzZXMoa2V5cy5qb2luKCcuJyksIGZsYWdzLmFycmF5cyk7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBkdXBsaWNhdGUgPSBjb25maWd1cmF0aW9uWydkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5J107XG4gICAgICAgICAgICAvLyBuYXJncyBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gZHVwbGljYXRlXG4gICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykpIHtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgoIWlzVW5kZWZpbmVkKG9ba2V5XSkgJiYgZmxhZ3MubmFyZ3Nba2V5XSA9PT0gMSkgfHwgKEFycmF5LmlzQXJyYXkob1trZXldKSAmJiBvW2tleV0ubGVuZ3RoID09PSBmbGFncy5uYXJnc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBpbmNyZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IGluY3JlbWVudChvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSAmJiBpc1R5cGVBcnJheSAmJiBpc1ZhbHVlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gY29uZmlndXJhdGlvblsnZmxhdHRlbi1kdXBsaWNhdGUtYXJyYXlzJ10gPyBvW2tleV0uY29uY2F0KHZhbHVlKSA6IChBcnJheS5pc0FycmF5KG9ba2V5XVswXSkgPyBvW2tleV0gOiBbb1trZXldXSkuY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZHVwbGljYXRlICYmIEJvb2xlYW4oaXNUeXBlQXJyYXkpID09PSBCb29sZWFuKGlzVmFsdWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSBvW2tleV0uY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9ba2V5XSA9PT0gdW5kZWZpbmVkICYmIGlzVHlwZUFycmF5KSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gaXNWYWx1ZUFycmF5ID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHVwbGljYXRlICYmICEob1trZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpIHx8XG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGV4dGVuZCB0aGUgYWxpYXNlcyBsaXN0IHdpdGggaW5mZXJyZWQgYWxpYXNlcy5cbiAgICAgICAgZnVuY3Rpb24gZXh0ZW5kQWxpYXNlcyguLi5hcmdzKSB7XG4gICAgICAgICAgICBhcmdzLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9iaiB8fCB7fSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNob3J0LWNpcmN1aXQgaWYgd2UndmUgYWxyZWFkeSBhZGRlZCBhIGtleVxuICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgYWxpYXNlcyBhcnJheSwgZm9yIGV4YW1wbGUgaXQgbWlnaHRcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3QgaW4gYm90aCAnb3B0cy5kZWZhdWx0JyBhbmQgJ29wdHMua2V5Jy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldID0gW10uY29uY2F0KGFsaWFzZXNba2V5XSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBcIi0tb3B0aW9uLW5hbWVcIiwgYWxzbyBzZXQgYXJndi5vcHRpb25OYW1lXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5jb25jYXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoLy0vLnRlc3QoeCkgJiYgY29uZmlndXJhdGlvblsnY2FtZWwtY2FzZS1leHBhbnNpb24nXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBjYW1lbENhc2UoeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT09IGtleSAmJiBmbGFncy5hbGlhc2VzW2tleV0uaW5kZXhPZihjKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FsaWFzZXNbY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBcIi0tb3B0aW9uTmFtZVwiLCBhbHNvIHNldCBhcmd2WydvcHRpb24tbmFtZSddXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5jb25jYXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5sZW5ndGggPiAxICYmIC9bQS1aXS8udGVzdCh4KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGRlY2FtZWxpemUoeCwgJy0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPT0ga2V5ICYmIGZsYWdzLmFsaWFzZXNba2V5XS5pbmRleE9mKGMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0ucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWxpYXNlc1tjXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNbeF0gPSBba2V5XS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldLmZpbHRlcihmdW5jdGlvbiAoeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICE9PSB5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWcpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpO1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZsYWcpO1xuICAgICAgICAgICAgY29uc3Qgc2V0QWxpYXMgPSB0b0NoZWNrLmZpbmQoa2V5ID0+IGtleXMuaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgICAgICByZXR1cm4gc2V0QWxpYXMgPyBmbGFnW3NldEFsaWFzXSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0FueUZsYWcoa2V5KSB7XG4gICAgICAgICAgICBjb25zdCBmbGFnc0tleXMgPSBPYmplY3Qua2V5cyhmbGFncyk7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gW10uY29uY2F0KGZsYWdzS2V5cy5tYXAoayA9PiBmbGFnc1trXSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2suc29tZShmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGZsYWcpID8gZmxhZy5pbmNsdWRlcyhrZXkpIDogZmxhZ1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzRmxhZ3NNYXRjaGluZyhhcmcsIC4uLnBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gW10uY29uY2F0KC4uLnBhdHRlcm5zKTtcbiAgICAgICAgICAgIHJldHVybiB0b0NoZWNrLnNvbWUoZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IGFyZy5tYXRjaChwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2ggJiYgaGFzQW55RmxhZyhtYXRjaFsxXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBiYXNlZCBvbiBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgc2hvcnQgZmxhZyBncm91cCBwYXJzaW5nIGxvZ2ljXG4gICAgICAgIGZ1bmN0aW9uIGhhc0FsbFNob3J0RmxhZ3MoYXJnKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLCBvciBkb2Vzbid0IHN0YXJ0IHdpdGggYSBzaW5nbGUgaHlwaGVuLCBpdCdzIG5vdCBhIHNob3J0IGZsYWcgZ3JvdXBcbiAgICAgICAgICAgIGlmIChhcmcubWF0Y2gobmVnYXRpdmUpIHx8ICFhcmcubWF0Y2goL14tW14tXSsvKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBoYXNBbGxGbGFncyA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgICAgIGNvbnN0IGxldHRlcnMgPSBhcmcuc2xpY2UoMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZXR0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV4dCA9IGFyZy5zbGljZShqICsgMik7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNBbnlGbGFnKGxldHRlcnNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0FsbEZsYWdzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHx8XG4gICAgICAgICAgICAgICAgICAgIG5leHQgPT09ICctJyB8fFxuICAgICAgICAgICAgICAgICAgICAoL1tBLVphLXpdLy50ZXN0KGxldHRlcnNbal0pICYmIC9eLT9cXGQrKFxcLlxcZCopPyhlLT9cXGQrKT8kLy50ZXN0KG5leHQpKSB8fFxuICAgICAgICAgICAgICAgICAgICAobGV0dGVyc1tqICsgMV0gJiYgbGV0dGVyc1tqICsgMV0ubWF0Y2goL1xcVy8pKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGFzQWxsRmxhZ3M7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaXNVbmtub3duT3B0aW9uQXNBcmcoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvblsndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnXSAmJiBpc1Vua25vd25PcHRpb24oYXJnKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1Vua25vd25PcHRpb24oYXJnKSB7XG4gICAgICAgICAgICBhcmcgPSBhcmcucmVwbGFjZSgvXi17Myx9LywgJy0tJyk7XG4gICAgICAgICAgICAvLyBpZ25vcmUgbmVnYXRpdmUgbnVtYmVyc1xuICAgICAgICAgICAgaWYgKGFyZy5tYXRjaChuZWdhdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgc2hvcnQgb3B0aW9uIGdyb3VwIGFuZCBhbGwgb2YgdGhlbSBhcmUgY29uZmlndXJlZCwgaXQgaXNuJ3QgdW5rbm93blxuICAgICAgICAgICAgaWYgKGhhc0FsbFNob3J0RmxhZ3MoYXJnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGUuZy4gJy0tY291bnQ9MidcbiAgICAgICAgICAgIGNvbnN0IGZsYWdXaXRoRXF1YWxzID0gL14tKyhbXj1dKz8pPVtcXHNcXFNdKiQvO1xuICAgICAgICAgICAgLy8gZS5nLiAnLWEnIG9yICctLWFyZydcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbEZsYWcgPSAvXi0rKFtePV0rPykkLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hLSdcbiAgICAgICAgICAgIGNvbnN0IGZsYWdFbmRpbmdJbkh5cGhlbiA9IC9eLSsoW149XSs/KS0kLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hYmMxMjMnXG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5EaWdpdHMgPSAvXi0rKFtePV0rP1xcZCspJC87XG4gICAgICAgICAgICAvLyBlLmcuICctYS91c3IvbG9jYWwnXG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyA9IC9eLSsoW149XSs/KVxcVysuKiQvO1xuICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBmbGFnIHN0eWxlcywgaW5jbHVkaW5nIG5lZ2F0ZWRCb29sZWFuLCBhIHBhdHRlcm4gZGVmaW5lZCBuZWFyIHRoZSBzdGFydCBvZiB0aGUgcGFyc2UgbWV0aG9kXG4gICAgICAgICAgICByZXR1cm4gIWhhc0ZsYWdzTWF0Y2hpbmcoYXJnLCBmbGFnV2l0aEVxdWFscywgbmVnYXRlZEJvb2xlYW4sIG5vcm1hbEZsYWcsIGZsYWdFbmRpbmdJbkh5cGhlbiwgZmxhZ0VuZGluZ0luRGlnaXRzLCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHBpY2sgYSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIC8vIGZvciBhbiBvcHRpb24gYmFzZWQgb24gbmFtZSBhbmQgdHlwZS5cbiAgICAgICAgZnVuY3Rpb24gZGVmYXVsdFZhbHVlKGtleSkge1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSAmJlxuICAgICAgICAgICAgICAgIGAke2tleX1gIGluIGRlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdEZvclR5cGUoZ3Vlc3NUeXBlKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHJldHVybiBhIGRlZmF1bHQgdmFsdWUsIGdpdmVuIHRoZSB0eXBlIG9mIGEgZmxhZy4sXG4gICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRGb3JUeXBlKHR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQk9PTEVBTl06IHRydWUsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LlNUUklOR106ICcnLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5OVU1CRVJdOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkFSUkFZXTogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZGVmW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdpdmVuIGEgZmxhZywgZW5mb3JjZSBhIGRlZmF1bHQgdHlwZS5cbiAgICAgICAgZnVuY3Rpb24gZ3Vlc3NUeXBlKGtleSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLnN0cmluZ3MpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5TVFJJTkc7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSlcbiAgICAgICAgICAgICAgICB0eXBlID0gRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuTlVNQkVSO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSlcbiAgICAgICAgICAgICAgICB0eXBlID0gRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQVJSQVk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZChudW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudW0gPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayB1c2VyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGluY29uc2lzdGVuY2llc1xuICAgICAgICBmdW5jdGlvbiBjaGVja0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgICAgICAvLyBjb3VudCBrZXlzIHNob3VsZCBub3QgYmUgc2V0IGFzIGFycmF5L25hcmdcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZmluZChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgY29uZmlndXJhdGlvbjogJXMsIG9wdHMuY291bnQgZXhjbHVkZXMgb3B0cy5hcnJheS4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb246ICVzLCBvcHRzLmNvdW50IGV4Y2x1ZGVzIG9wdHMubmFyZy4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGlhc2VzOiBPYmplY3QuYXNzaWduKHt9LCBmbGFncy5hbGlhc2VzKSxcbiAgICAgICAgICAgIGFyZ3Y6IE9iamVjdC5hc3NpZ24oYXJndlJldHVybiwgYXJndiksXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdGVkOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0ZWQpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgbmV3QWxpYXNlczogT2JqZWN0LmFzc2lnbih7fSwgbmV3QWxpYXNlcylcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyBpZiBhbnkgYWxpYXNlcyByZWZlcmVuY2UgZWFjaCBvdGhlciwgd2Ugc2hvdWxkXG4vLyBtZXJnZSB0aGVtIHRvZ2V0aGVyLlxuZnVuY3Rpb24gY29tYmluZUFsaWFzZXMoYWxpYXNlcykge1xuICAgIGNvbnN0IGFsaWFzQXJyYXlzID0gW107XG4gICAgY29uc3QgY29tYmluZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjaGFuZ2UgPSB0cnVlO1xuICAgIC8vIHR1cm4gYWxpYXMgbG9va3VwIGhhc2gge2tleTogWydhbGlhczEnLCAnYWxpYXMyJ119IGludG9cbiAgICAvLyBhIHNpbXBsZSBhcnJheSBbJ2tleScsICdhbGlhczEnLCAnYWxpYXMyJ11cbiAgICBPYmplY3Qua2V5cyhhbGlhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgYWxpYXNBcnJheXMucHVzaChbXS5jb25jYXQoYWxpYXNlc1trZXldLCBrZXkpKTtcbiAgICB9KTtcbiAgICAvLyBjb21iaW5lIGFycmF5cyB1bnRpbCB6ZXJvIGNoYW5nZXMgYXJlXG4gICAgLy8gbWFkZSBpbiBhbiBpdGVyYXRpb24uXG4gICAgd2hpbGUgKGNoYW5nZSkge1xuICAgICAgICBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaWkgPSBpICsgMTsgaWkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBhbGlhc0FycmF5c1tpXS5maWx0ZXIoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzQXJyYXlzW2lpXS5pbmRleE9mKHYpICE9PSAtMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5c1tpXSA9IGFsaWFzQXJyYXlzW2ldLmNvbmNhdChhbGlhc0FycmF5c1tpaV0pO1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5cy5zcGxpY2UoaWksIDEpO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbWFwIGFycmF5cyBiYWNrIHRvIHRoZSBoYXNoLWxvb2t1cCAoZGUtZHVwZSB3aGlsZVxuICAgIC8vIHdlJ3JlIGF0IGl0KS5cbiAgICBhbGlhc0FycmF5cy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhc0FycmF5KSB7XG4gICAgICAgIGFsaWFzQXJyYXkgPSBhbGlhc0FycmF5LmZpbHRlcihmdW5jdGlvbiAodiwgaSwgc2VsZikge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZih2KSA9PT0gaTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGxhc3RBbGlhcyA9IGFsaWFzQXJyYXkucG9wKCk7XG4gICAgICAgIGlmIChsYXN0QWxpYXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbGFzdEFsaWFzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29tYmluZWRbbGFzdEFsaWFzXSA9IGFsaWFzQXJyYXk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29tYmluZWQ7XG59XG4vLyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGEgY291bnQgaXMgZ2l2ZW4gYXMgYW4gYXJnXG4vLyBpdCBpcyBOT1QgY2FsbGVkIHRvIHNldCBhIGRlZmF1bHQgdmFsdWVcbi8vIHRodXMgd2UgY2FuIHN0YXJ0IHRoZSBjb3VudCBhdCAxIGluc3RlYWQgb2YgMFxuZnVuY3Rpb24gaW5jcmVtZW50KG9yaWcpIHtcbiAgICByZXR1cm4gb3JpZyAhPT0gdW5kZWZpbmVkID8gb3JpZyArIDEgOiAxO1xufVxuLy8gVE9ETyhiY29lKTogaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiB5YXJncywgc3dpdGNoIHRvXG4vLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG5mdW5jdGlvbiBzYW5pdGl6ZUtleShrZXkpIHtcbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJylcbiAgICAgICAgcmV0dXJuICdfX19wcm90b19fXyc7XG4gICAgcmV0dXJuIGtleTtcbn1cbmZ1bmN0aW9uIHN0cmlwUXVvdGVzKHZhbCkge1xuICAgIHJldHVybiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgKHZhbFswXSA9PT0gXCInXCIgfHwgdmFsWzBdID09PSAnXCInKSAmJlxuICAgICAgICB2YWxbdmFsLmxlbmd0aCAtIDFdID09PSB2YWxbMF0pXG4gICAgICAgID8gdmFsLnN1YnN0cmluZygxLCB2YWwubGVuZ3RoIC0gMSlcbiAgICAgICAgOiB2YWw7XG59XG4iLCJpbXBvcnQgeyBZRXJyb3IgfSBmcm9tICcuLi95ZXJyb3IuanMnO1xubGV0IHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncyA9IFtdO1xubGV0IHNoaW07XG5leHBvcnQgZnVuY3Rpb24gYXBwbHlFeHRlbmRzKGNvbmZpZywgY3dkLCBtZXJnZUV4dGVuZHMsIF9zaGltKSB7XG4gICAgc2hpbSA9IF9zaGltO1xuICAgIGxldCBkZWZhdWx0Q29uZmlnID0ge307XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdleHRlbmRzJykpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcuZXh0ZW5kcyAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdENvbmZpZztcbiAgICAgICAgY29uc3QgaXNQYXRoID0gL1xcLmpzb258XFwuLipyYyQvLnRlc3QoY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICBsZXQgcGF0aFRvRGVmYXVsdCA9IG51bGw7XG4gICAgICAgIGlmICghaXNQYXRoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBhdGhUb0RlZmF1bHQgPSByZXF1aXJlLnJlc29sdmUoY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGF0aFRvRGVmYXVsdCA9IGdldFBhdGhUb0RlZmF1bHRDb25maWcoY3dkLCBjb25maWcuZXh0ZW5kcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tGb3JDaXJjdWxhckV4dGVuZHMocGF0aFRvRGVmYXVsdCk7XG4gICAgICAgIHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncy5wdXNoKHBhdGhUb0RlZmF1bHQpO1xuICAgICAgICBkZWZhdWx0Q29uZmlnID0gaXNQYXRoXG4gICAgICAgICAgICA/IEpTT04ucGFyc2Uoc2hpbS5yZWFkRmlsZVN5bmMocGF0aFRvRGVmYXVsdCwgJ3V0ZjgnKSlcbiAgICAgICAgICAgIDogcmVxdWlyZShjb25maWcuZXh0ZW5kcyk7XG4gICAgICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5kcztcbiAgICAgICAgZGVmYXVsdENvbmZpZyA9IGFwcGx5RXh0ZW5kcyhkZWZhdWx0Q29uZmlnLCBzaGltLnBhdGguZGlybmFtZShwYXRoVG9EZWZhdWx0KSwgbWVyZ2VFeHRlbmRzLCBzaGltKTtcbiAgICB9XG4gICAgcHJldmlvdXNseVZpc2l0ZWRDb25maWdzID0gW107XG4gICAgcmV0dXJuIG1lcmdlRXh0ZW5kc1xuICAgICAgICA/IG1lcmdlRGVlcChkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdENvbmZpZywgY29uZmlnKTtcbn1cbmZ1bmN0aW9uIGNoZWNrRm9yQ2lyY3VsYXJFeHRlbmRzKGNmZ1BhdGgpIHtcbiAgICBpZiAocHJldmlvdXNseVZpc2l0ZWRDb25maWdzLmluZGV4T2YoY2ZnUGF0aCkgPiAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgWUVycm9yKGBDaXJjdWxhciBleHRlbmRlZCBjb25maWd1cmF0aW9uczogJyR7Y2ZnUGF0aH0nLmApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFBhdGhUb0RlZmF1bHRDb25maWcoY3dkLCBwYXRoVG9FeHRlbmQpIHtcbiAgICByZXR1cm4gc2hpbS5wYXRoLnJlc29sdmUoY3dkLCBwYXRoVG9FeHRlbmQpO1xufVxuZnVuY3Rpb24gbWVyZ2VEZWVwKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgICBmdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgY29uZmlnMSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnMikpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGNvbmZpZzJba2V5XSkgJiYgaXNPYmplY3QodGFyZ2V0W2tleV0pKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IG1lcmdlRGVlcChjb25maWcxW2tleV0sIGNvbmZpZzJba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvbmZpZzJba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuIiwiZnVuY3Rpb24gZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCgpIHtcbiAgICBpZiAoaXNCdW5kbGVkRWxlY3Ryb25BcHAoKSlcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgcmV0dXJuIDE7XG59XG5mdW5jdGlvbiBpc0J1bmRsZWRFbGVjdHJvbkFwcCgpIHtcbiAgICByZXR1cm4gaXNFbGVjdHJvbkFwcCgpICYmICFwcm9jZXNzLmRlZmF1bHRBcHA7XG59XG5mdW5jdGlvbiBpc0VsZWN0cm9uQXBwKCkge1xuICAgIHJldHVybiAhIXByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb247XG59XG5leHBvcnQgZnVuY3Rpb24gaGlkZUJpbihhcmd2KSB7XG4gICAgcmV0dXJuIGFyZ3Yuc2xpY2UoZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCgpICsgMSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvY2Vzc0FyZ3ZCaW4oKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuYXJndltnZXRQcm9jZXNzQXJndkJpbkluZGV4KCldO1xufVxuIiwiZXhwb3J0IGNsYXNzIFlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICAgICAgc3VwZXIobXNnIHx8ICd5YXJncyBlcnJvcicpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnWUVycm9yJztcbiAgICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBZRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHthcHBseUV4dGVuZHMgYXMgX2FwcGx5RXh0ZW5kc30gZnJvbSAnLi4vYnVpbGQvbGliL3V0aWxzL2FwcGx5LWV4dGVuZHMuanMnO1xuaW1wb3J0IHtoaWRlQmlufSBmcm9tICcuLi9idWlsZC9saWIvdXRpbHMvcHJvY2Vzcy1hcmd2LmpzJztcbmltcG9ydCBQYXJzZXIgZnJvbSAneWFyZ3MtcGFyc2VyJztcbmltcG9ydCBzaGltIGZyb20gJy4uL2xpYi9wbGF0Zm9ybS1zaGltcy9lc20ubWpzJztcblxuY29uc3QgYXBwbHlFeHRlbmRzID0gKGNvbmZpZywgY3dkLCBtZXJnZUV4dGVuZHMpID0+IHtcbiAgcmV0dXJuIF9hcHBseUV4dGVuZHMoY29uZmlnLCBjd2QsIG1lcmdlRXh0ZW5kcywgc2hpbSk7XG59O1xuXG5leHBvcnQge2FwcGx5RXh0ZW5kcywgaGlkZUJpbiwgUGFyc2VyfTtcbiIsIid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBub3RTdHJpY3RFcXVhbCwgc3RyaWN0RXF1YWwgfSBmcm9tICdhc3NlcnQnXG5pbXBvcnQgY2xpdWkgZnJvbSAnY2xpdWknXG5pbXBvcnQgZXNjYWxhZGUgZnJvbSAnZXNjYWxhZGUvc3luYydcbmltcG9ydCB7IGluc3BlY3QgfSBmcm9tICd1dGlsJ1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnXG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCBQYXJzZXIgZnJvbSAneWFyZ3MtcGFyc2VyJ1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGV4dG5hbWUsIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAncGF0aCdcbmltcG9ydCB7IGdldFByb2Nlc3NBcmd2QmluIH0gZnJvbSAnLi4vLi4vYnVpbGQvbGliL3V0aWxzL3Byb2Nlc3MtYXJndi5qcydcbmltcG9ydCB7IFlFcnJvciB9IGZyb20gJy4uLy4uL2J1aWxkL2xpYi95ZXJyb3IuanMnXG5pbXBvcnQgeTE4biBmcm9tICd5MThuJ1xuXG5jb25zdCBSRVFVSVJFX0VSUk9SID0gJ3JlcXVpcmUgaXMgbm90IHN1cHBvcnRlZCBieSBFU00nXG5jb25zdCBSRVFVSVJFX0RJUkVDVE9SWV9FUlJPUiA9ICdsb2FkaW5nIGEgZGlyZWN0b3J5IG9mIGNvbW1hbmRzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IGZvciBFU00nXG5cbmxldCBfX2Rpcm5hbWU7XG50cnkge1xuICBfX2Rpcm5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG59IGNhdGNoIChlKSB7XG4gIF9fZGlybmFtZSA9IHByb2Nlc3MuY3dkKCk7XG59XG5jb25zdCBtYWluRmlsZW5hbWUgPSBfX2Rpcm5hbWUuc3Vic3RyaW5nKDAsIF9fZGlybmFtZS5sYXN0SW5kZXhPZignbm9kZV9tb2R1bGVzJykpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFzc2VydDoge1xuICAgIG5vdFN0cmljdEVxdWFsLFxuICAgIHN0cmljdEVxdWFsXG4gIH0sXG4gIGNsaXVpLFxuICBmaW5kVXA6IGVzY2FsYWRlLFxuICBnZXRFbnY6IChrZXkpID0+IHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZba2V5XVxuICB9LFxuICBpbnNwZWN0LFxuICBnZXRDYWxsZXJGaWxlOiAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFlFcnJvcihSRVFVSVJFX0RJUkVDVE9SWV9FUlJPUilcbiAgfSxcbiAgZ2V0UHJvY2Vzc0FyZ3ZCaW4sXG4gIG1haW5GaWxlbmFtZTogbWFpbkZpbGVuYW1lIHx8IHByb2Nlc3MuY3dkKCksXG4gIFBhcnNlcixcbiAgcGF0aDoge1xuICAgIGJhc2VuYW1lLFxuICAgIGRpcm5hbWUsXG4gICAgZXh0bmFtZSxcbiAgICByZWxhdGl2ZSxcbiAgICByZXNvbHZlXG4gIH0sXG4gIHByb2Nlc3M6IHtcbiAgICBhcmd2OiAoKSA9PiBwcm9jZXNzLmFyZ3YsXG4gICAgY3dkOiBwcm9jZXNzLmN3ZCxcbiAgICBlbWl0V2FybmluZzogKHdhcm5pbmcsIHR5cGUpID0+IHByb2Nlc3MuZW1pdFdhcm5pbmcod2FybmluZywgdHlwZSksXG4gICAgZXhlY1BhdGg6ICgpID0+IHByb2Nlc3MuZXhlY1BhdGgsXG4gICAgZXhpdDogcHJvY2Vzcy5leGl0LFxuICAgIG5leHRUaWNrOiBwcm9jZXNzLm5leHRUaWNrLFxuICAgIHN0ZENvbHVtbnM6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgOiBudWxsXG4gIH0sXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVxdWlyZTogKCkgPT4ge1xuICAgIHRocm93IG5ldyBZRXJyb3IoUkVRVUlSRV9FUlJPUilcbiAgfSxcbiAgcmVxdWlyZURpcmVjdG9yeTogKCkgPT4ge1xuICAgIHRocm93IG5ldyBZRXJyb3IoUkVRVUlSRV9ESVJFQ1RPUllfRVJST1IpXG4gIH0sXG4gIHN0cmluZ1dpZHRoOiAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIFsuLi5zdHJdLmxlbmd0aFxuICB9LFxuICB5MThuOiB5MThuKHtcbiAgICBkaXJlY3Rvcnk6IHJlc29sdmUoX19kaXJuYW1lLCAnLi4vLi4vLi4vbG9jYWxlcycpLFxuICAgIHVwZGF0ZUZpbGVzOiBmYWxzZVxuICB9KVxufVxuIiwiLy8gVE9ETzogY29uc29saWRhdGUgb24gdXNpbmcgYSBoZWxwZXJzIGZpbGUgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLCB3aGljaFxuLy8gaXMgdGhlIGFwcHJvYWNoIGN1cnJlbnRseSB1c2VkIHRvIGV4cG9ydCBQYXJzZXIgYW5kIGFwcGx5RXh0ZW5kcyBmb3IgRVNNOlxuaW1wb3J0IHBrZyBmcm9tICcuL2J1aWxkL2luZGV4LmNqcyc7XG5jb25zdCB7YXBwbHlFeHRlbmRzLCBjanNQbGF0Zm9ybVNoaW0sIFBhcnNlciwgcHJvY2Vzc0FyZ3YsIFlhcmdzfSA9IHBrZztcbllhcmdzLmFwcGx5RXh0ZW5kcyA9IChjb25maWcsIGN3ZCwgbWVyZ2VFeHRlbmRzKSA9PiB7XG4gIHJldHVybiBhcHBseUV4dGVuZHMoY29uZmlnLCBjd2QsIG1lcmdlRXh0ZW5kcywgY2pzUGxhdGZvcm1TaGltKTtcbn07XG5ZYXJncy5oaWRlQmluID0gcHJvY2Vzc0FyZ3YuaGlkZUJpbjtcbllhcmdzLlBhcnNlciA9IFBhcnNlcjtcbmV4cG9ydCBkZWZhdWx0IFlhcmdzO1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0bG9hZGVkOiBmYWxzZSxcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG5cdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX187XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwidmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mID8gKG9iaikgPT4gKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSA6IChvYmopID0+IChvYmouX19wcm90b19fKTtcbnZhciBsZWFmUHJvdG90eXBlcztcbi8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLy8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLy8gbW9kZSAmIDE2OiByZXR1cm4gdmFsdWUgd2hlbiBpdCdzIFByb21pc2UtbGlrZVxuLy8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuX193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcblx0aWYobW9kZSAmIDEpIHZhbHVlID0gdGhpcyh2YWx1ZSk7XG5cdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG5cdGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUpIHtcblx0XHRpZigobW9kZSAmIDQpICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcblx0XHRpZigobW9kZSAmIDE2KSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHZhbHVlO1xuXHR9XG5cdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG5cdHZhciBkZWYgPSB7fTtcblx0bGVhZlByb3RvdHlwZXMgPSBsZWFmUHJvdG90eXBlcyB8fCBbbnVsbCwgZ2V0UHJvdG8oe30pLCBnZXRQcm90byhbXSksIGdldFByb3RvKGdldFByb3RvKV07XG5cdGZvcih2YXIgY3VycmVudCA9IG1vZGUgJiAyICYmIHZhbHVlOyB0eXBlb2YgY3VycmVudCA9PSAnb2JqZWN0JyAmJiAhfmxlYWZQcm90b3R5cGVzLmluZGV4T2YoY3VycmVudCk7IGN1cnJlbnQgPSBnZXRQcm90byhjdXJyZW50KSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGN1cnJlbnQpLmZvckVhY2goKGtleSkgPT4gKGRlZltrZXldID0gKCkgPT4gKHZhbHVlW2tleV0pKSk7XG5cdH1cblx0ZGVmWydkZWZhdWx0J10gPSAoKSA9PiAodmFsdWUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGRlZik7XG5cdHJldHVybiBucztcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5mID0ge307XG4vLyBUaGlzIGZpbGUgY29udGFpbnMgb25seSB0aGUgZW50cnkgY2h1bmsuXG4vLyBUaGUgY2h1bmsgbG9hZGluZyBmdW5jdGlvbiBmb3IgYWRkaXRpb25hbCBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18uZSA9IChjaHVua0lkKSA9PiB7XG5cdHJldHVybiBQcm9taXNlLmFsbChPYmplY3Qua2V5cyhfX3dlYnBhY2tfcmVxdWlyZV9fLmYpLnJlZHVjZSgocHJvbWlzZXMsIGtleSkgPT4ge1xuXHRcdF9fd2VicGFja19yZXF1aXJlX18uZltrZXldKGNodW5rSWQsIHByb21pc2VzKTtcblx0XHRyZXR1cm4gcHJvbWlzZXM7XG5cdH0sIFtdKSk7XG59OyIsIi8vIFRoaXMgZnVuY3Rpb24gYWxsb3cgdG8gcmVmZXJlbmNlIGFzeW5jIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy51ID0gKGNodW5rSWQpID0+IHtcblx0Ly8gcmV0dXJuIHVybCBmb3IgZmlsZW5hbWVzIGJhc2VkIG9uIHRlbXBsYXRlXG5cdHJldHVybiBcIlwiICsgY2h1bmtJZCArIFwiLmNqc1wiO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBjaHVua3Ncbi8vIFwiMVwiIG1lYW5zIFwibG9hZGVkXCIsIG90aGVyd2lzZSBub3QgbG9hZGVkIHlldFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJkZWZhdWx0X2luc3RhbGxhdGlvblwiOiAxXG59O1xuXG4vLyBubyBvbiBjaHVua3MgbG9hZGVkXG5cbnZhciBpbnN0YWxsQ2h1bmsgPSAoY2h1bmspID0+IHtcblx0dmFyIG1vcmVNb2R1bGVzID0gY2h1bmsubW9kdWxlcywgY2h1bmtJZHMgPSBjaHVuay5pZHMsIHJ1bnRpbWUgPSBjaHVuay5ydW50aW1lO1xuXHRmb3IodmFyIG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcblx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0fVxuXHR9XG5cdGlmKHJ1bnRpbWUpIHJ1bnRpbWUoX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBjaHVua0lkcy5sZW5ndGg7IGkrKylcblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHNbaV1dID0gMTtcblxufTtcblxuLy8gcmVxdWlyZSgpIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcbl9fd2VicGFja19yZXF1aXJlX18uZi5yZXF1aXJlID0gKGNodW5rSWQsIHByb21pc2VzKSA9PiB7XG5cdC8vIFwiMVwiIGlzIHRoZSBzaWduYWwgZm9yIFwiYWxyZWFkeSBsb2FkZWRcIlxuXHRpZighaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0aWYodHJ1ZSkgeyAvLyBhbGwgY2h1bmtzIGhhdmUgSlNcblx0XHRcdGluc3RhbGxDaHVuayhyZXF1aXJlKFwiLi9cIiArIF9fd2VicGFja19yZXF1aXJlX18udShjaHVua0lkKSkpO1xuXHRcdH0gZWxzZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAxO1xuXHR9XG59O1xuXG4vLyBubyBleHRlcm5hbCBpbnN0YWxsIGNodW5rXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3QiLCIiLCIvLyBtb2R1bGUgY2FjaGUgYXJlIHVzZWQgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvdGVzdHMvZGVmYXVsdF9pbnN0YWxsYXRpb24udHNcIik7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLDZCQUE2QjtBQUMzRCxpQkFBaUI7QUFDakI7QUFDQSw4QkFBOEIsNkJBQTZCO0FBQzNELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsdUJBQXVCO0FBQy9DO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHVEQUF1RCxTQUFTO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0ZBQW9GLGtCQUFrQjtBQUN0RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBZTtBQUNmOzs7Ozs7Ozs7Ozs7QUMvUGE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLDJDQUEyQyxtQkFBTyxDQUFDLGdFQUFjO0FBQ2pFLHFDQUFxQyxtQkFBTyxDQUFDLG9EQUFRO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDVmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLHNDQUFzQyxtQkFBTyxDQUFDLDJEQUFjO0FBQzVELHVDQUF1QyxtQkFBTyxDQUFDLDZEQUFlO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDelNhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixzQ0FBc0MsbUJBQU8sQ0FBQywyREFBYztBQUM1RCx1Q0FBdUMsbUJBQU8sQ0FBQyw2REFBZTtBQUM5RCxxQ0FBcUMsbUJBQU8sQ0FBQyxvREFBUTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFlO0FBQ2Y7Ozs7Ozs7Ozs7OztBQ2hDYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0Isb0NBQW9DLG1CQUFPLENBQUMsa0RBQU87QUFDbkQsc0NBQXNDLG1CQUFPLENBQUMsMkRBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDZmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLHFDQUFxQyxtQkFBTyxDQUFDLG9EQUFRO0FBQ3JELHNDQUFzQyxtQkFBTyxDQUFDLDJEQUFjO0FBQzVELHVDQUF1QyxtQkFBTyxDQUFDLDZEQUFlO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGlDQUFpQztBQUMzRDtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDak5hO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixvQ0FBb0MsbUJBQU8sQ0FBQyxrREFBTztBQUNuRCxzQ0FBc0MsbUJBQU8sQ0FBQywyREFBYztBQUM1RCx1Q0FBdUMsbUJBQU8sQ0FBQyw2REFBZTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDakNhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixvQ0FBb0MsbUJBQU8sQ0FBQyxrREFBTztBQUNuRCxzQ0FBc0MsbUJBQU8sQ0FBQywyREFBYztBQUM1RCx1Q0FBdUMsbUJBQU8sQ0FBQyw2REFBZTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFlO0FBQ2Y7Ozs7Ozs7Ozs7OztBQ2hEYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0Isb0NBQW9DLG1CQUFPLENBQUMsa0RBQU87QUFDbkQsaURBQWlELG1CQUFPLENBQUMsNEVBQW9CO0FBQzdFLHNDQUFzQyxtQkFBTyxDQUFDLDJEQUFjO0FBQzVELHVDQUF1QyxtQkFBTyxDQUFDLDZEQUFlO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qix3QkFBd0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEZBQTBGLGtCQUFrQjtBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsYUFBYTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBZTtBQUNmOzs7Ozs7Ozs7Ozs7QUMxWmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLHNDQUFzQyxtQkFBTyxDQUFDLHNEQUFTO0FBQ3ZELDBDQUEwQyxtQkFBTyxDQUFDLDhEQUFhO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG1CQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFVBQVU7QUFDbEM7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGVBQWU7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsZ0JBQWdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFlO0FBQ2Y7Ozs7Ozs7Ozs7OztBQ3RWYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0Isc0NBQXNDLG1CQUFPLENBQUMsc0RBQVM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQXVCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFdBQVc7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFNBQVM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixTQUFTO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLHVCQUF1QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQXVCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsVUFBVTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qix1QkFBdUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qix1QkFBdUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFdBQVc7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixXQUFXO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDMVVhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixzQ0FBc0MsbUJBQU8sQ0FBQyxzREFBUztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGFBQWE7QUFDakMsb0JBQW9CLG1CQUFtQjtBQUN2Qyx3QkFBd0IsdUNBQXVDO0FBQy9ELHFCQUFxQixjQUFjO0FBQ25DLHNCQUFzQixvQkFBb0I7QUFDMUMsd0JBQXdCLFdBQVc7QUFDbkMscUJBQXFCLFdBQVc7QUFDaEMsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixPQUFPO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsT0FBTztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBZTtBQUNmOzs7Ozs7Ozs7Ozs7QUM3VGE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLHNDQUFzQyxtQkFBTyxDQUFDLHNEQUFTO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsZ0RBQWdEO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsY0FBYztBQUM1QyxvQ0FBb0MsWUFBWTtBQUNoRCwrQkFBK0IsZUFBZTtBQUM5Qyw4QkFBOEIsY0FBYztBQUM1QyxvQ0FBb0M7QUFDcEMsb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDOUNhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELFdBQVc7QUFDWCxjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUVBQXFFLDBDQUEwQztBQUMvRztBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qix1QkFBdUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsMkJBQTJCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLENBQUM7QUFDRCxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qix1QkFBdUI7QUFDcEQ7QUFDQTtBQUNBLDBEQUEwRCx5QkFBeUI7QUFDbkYsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsNEJBQTRCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCx5Q0FBeUM7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0EsK0RBQStEO0FBQy9EO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0ZBQStGLGtDQUFrQztBQUNqSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qix1QkFBdUI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsd0JBQXdCO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyx1QkFBdUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG1CQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLDRCQUE0QjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsdUJBQXVCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qix1QkFBdUI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsbUJBQW1CO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFlBQVk7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDM3dCYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxhQUFhLEdBQUcsV0FBVyxHQUFHLFlBQVksR0FBRyxpQkFBaUIsR0FBRyxtQkFBbUIsR0FBRyxZQUFZLEdBQUcsZ0JBQWdCLEdBQUcsa0JBQWtCLEdBQUcseUJBQXlCLEdBQUcscUJBQXFCLEdBQUcscUJBQXFCLEdBQUcsc0JBQXNCLEdBQUcsZ0JBQWdCLEdBQUcsaUJBQWlCLEdBQUcsb0JBQW9CLEdBQUcsb0JBQW9CLEdBQUcsZ0JBQWdCLEdBQUcsNkJBQTZCO0FBQ3hYLGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixxQ0FBcUMsbUJBQU8sQ0FBQyxnREFBUTtBQUNyRCxxQ0FBcUMsbUJBQU8sQ0FBQyx3REFBWTtBQUN6RCxvQ0FBb0MsbUJBQU8sQ0FBQyxzREFBVztBQUN2RCxvQ0FBb0MsbUJBQU8sQ0FBQyxzREFBVztBQUN2RCx1Q0FBdUMsbUJBQU8sQ0FBQyw0REFBYztBQUM3RCxvQ0FBb0MsbUJBQU8sQ0FBQyxzREFBVztBQUN2RCxxQ0FBcUMsbUJBQU8sQ0FBQyx3REFBWTtBQUN6RCx3Q0FBd0MsbUJBQU8sQ0FBQyw4REFBZTtBQUMvRCxzQ0FBc0MsbUJBQU8sQ0FBQywwREFBYTtBQUMzRCwyQ0FBMkMsbUJBQU8sQ0FBQyxvRUFBa0I7QUFDckUsNkNBQTZDLG1CQUFPLENBQUMsd0VBQW9CO0FBQ3pFLG1CQUFtQixtQkFBTyxDQUFDLG9FQUFrQjtBQUM3Qyw4Q0FBNkMsRUFBRSxxQ0FBcUMsbUNBQW1DLEVBQUM7QUFDeEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsZ0JBQWdCO0FBQ2hCLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsaUJBQWlCO0FBQ2pCLGdCQUFnQjtBQUNoQixzQkFBc0I7QUFDdEIscUJBQXFCO0FBQ3JCLHFCQUFxQjtBQUNyQix5QkFBeUI7QUFDekIsZ0JBQWdCO0FBQ2hCLFlBQVk7QUFDWixtQkFBbUI7QUFDbkIsaUJBQWlCO0FBQ2pCLFlBQVk7QUFDWixXQUFXO0FBQ1gsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNwREE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuSmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYztBQUNkLGFBQWEsbUJBQU8sQ0FBQyxjQUFJO0FBQ3pCLGVBQWUsbUJBQU8sQ0FBQyxrQkFBTTtBQUM3QixjQUFjLG1CQUFPLENBQUMsZ0JBQUs7QUFDM0IsZUFBZSxtQkFBTyxDQUFDLGtCQUFNO0FBQzdCLHFCQUFxQixtQkFBTyxDQUFDLGlFQUFjO0FBQzNDLG9CQUFvQixtQkFBTyxDQUFDLCtEQUFhO0FBQ3pDLDBCQUEwQixtQkFBTyxDQUFDLDJFQUFtQjtBQUNyRCx1QkFBdUIsbUJBQU8sQ0FBQyxxRUFBZ0I7QUFDL0Msd0JBQXdCLG1CQUFPLENBQUMsdUVBQWlCO0FBQ2pELG1CQUFtQixtQkFBTyxDQUFDLDZEQUFZO0FBQ3ZDLG1CQUFtQixtQkFBTyxDQUFDLDZEQUFZO0FBQ3ZDLCtCQUErQixtQkFBTyxDQUFDLHFGQUF3QjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxxQ0FBcUMsa0RBQWtELEdBQUcsNkNBQTZDO0FBQ2hKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRTtBQUNBLHdHQUF3RyxrREFBa0QsR0FBRyw2Q0FBNkM7QUFDMU07QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0Isc0NBQXNDO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsaURBQWlELDZDQUE2QztBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsNkNBQTZDO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUZBQWlGO0FBQ2pGO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQyxnREFBZ0Q7QUFDaEQsc0RBQXNEO0FBQ3REO0FBQ0EseURBQXlELEtBQUssT0FBTyxPQUFPLFVBQVUsV0FBVyxXQUFXLGVBQWUsZUFBZSxJQUFJO0FBQzlJO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQsb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRSxZQUFZO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxVQUFVO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsVUFBVTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLFFBQVEsMEJBQTBCLFlBQVk7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFVBQVU7QUFDNUQ7QUFDQSxpQ0FBaUMsVUFBVTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxRQUFRLFlBQVksVUFBVTtBQUM3RTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxXQUFXLEVBQUUsVUFBVTtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFVBQVU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdHQUF3RyxVQUFVO0FBQ2xIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGlCQUFpQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNqd0JhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGdCQUFnQixHQUFHLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGVBQWUsZ0JBQWdCLGdCQUFnQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzRmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qsa0JBQWtCLEdBQUcsZ0JBQWdCO0FBQ3JDLGNBQWMsbUJBQU8sQ0FBQyxnQkFBSztBQUMzQiwrQkFBK0IsbUJBQU8sQ0FBQyxxRkFBd0I7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDLDJGQUEyRjtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxRQUFRO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELGlCQUFpQjtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsMkJBQTJCLElBQUk7QUFDakcsa0RBQWtELHlCQUF5QjtBQUMzRTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELFFBQVE7QUFDekQ7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLDRDQUE0Qzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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O0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxRQUFRO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdURBQXVELFFBQVE7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsUUFBUTtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSwyQ0FBMkM7QUFDM0MsMkJBQTJCO0FBQzNCO0FBQ0EsK0JBQStCLDZCQUE2QjtBQUM1RDtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQSw2REFBNkQsUUFBUTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QseURBQXlELFFBQVE7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQSx5REFBeUQsUUFBUTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBeUQsUUFBUTtBQUNqRTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsUUFBUTtBQUN6RDtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQSxtREFBbUQsUUFBUTtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsUUFBUTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsUUFBUTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0EsZ0NBQWdDLGdDQUFtQjs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGdCQUFnQixzQ0FBc0Msa0JBQWtCO0FBQ3BGLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsZ0RBQWdELGFBQWE7QUFDN0QsbUJBQW1CLGdDQUFtQjtBQUN0QyxlQUFlLGdDQUFtQjtBQUNsQyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDLFlBQVksZ0NBQW1CO0FBQy9CLGdCQUFnQixnQ0FBbUI7QUFDbkMsZUFBZSxnQ0FBbUI7QUFDbEMsd0JBQXdCLGdDQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQiw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Qsb0VBQW9FO0FBQ3hIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLGdEQUFnRCxhQUFhO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekMsTUFBTTtBQUNOO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBLGdDQUFnQyxnQ0FBbUI7O0FBRW5EO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Qsb0JBQW9CLGdDQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLGdEQUFnRCxhQUFhO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQSxnQ0FBZ0MsZ0NBQW1COztBQUVuRDtBQUNBLGdEQUFnRCxhQUFhO0FBQzdELGdCQUFnQixnQ0FBbUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQSxnQ0FBZ0MsZ0NBQW1COztBQUVuRDtBQUNBLGdEQUFnRCxhQUFhO0FBQzdELGdCQUFnQixnQ0FBbUI7QUFDbkMsdUJBQXVCLGdDQUFtQjtBQUMxQyxrQkFBa0IsZ0NBQW1CO0FBQ3JDLFlBQVksZ0NBQW1CO0FBQy9CLGlCQUFpQixnQ0FBbUI7QUFDcEMsZ0JBQWdCLGdDQUFtQjtBQUNuQyxlQUFlLGdDQUFtQjtBQUNsQztBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHVCQUF1QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdUJBQXVCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFCQUFxQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSwwQkFBMEI7QUFDMUIsOEJBQThCO0FBQzlCO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0QsMEJBQTBCO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCwwQkFBMEI7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMEJBQTBCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLDRCQUE0QjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsd0JBQXdCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLHdCQUF3QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsNkJBQTZCO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGlCQUFpQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMkJBQTJCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw2QkFBNkI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsbUJBQW1CO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxjQUFjO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RkFBOEYsY0FBYztBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qiw4QkFBOEI7QUFDOUI7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxjQUFjO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLGFBQWE7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLGFBQWE7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsb0JBQW9CO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELG1FQUFtRTtBQUMvSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQyx1QkFBdUI7QUFDdkIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsU0FBUztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsK0JBQStCO0FBQy9CLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsaUJBQWlCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLE1BQU0sSUFBSSxNQUFNO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxnQkFBZ0IsaUJBQWlCLEVBQUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsc0JBQXNCO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsK0ZBQStGO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxhQUFhO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBLGdDQUFnQyxpQ0FBbUI7O0FBRW5EO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0QsdUJBQXVCLGlDQUFtQjtBQUMxQyxpQkFBaUIsaUNBQW1CO0FBQ3BDLGVBQWUsaUNBQW1CO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFCQUFxQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7Ozs7Ozs7O0FDcGpOQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0QsUUFBUTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0QsUUFBUTtBQUMxRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsU0FBUztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1EQUFtRCxTQUFTO0FBQzVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxlQUFlOztBQUU1RDtBQUNBLENBQUM7QUFDRDs7Ozs7Ozs7Ozs7QUNweUJBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7O0FBRVY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDs7Ozs7Ozs7Ozs7QUMvSUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEM7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0EsMENBQTBDO0FBQzFDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6Qzs7QUFFQTtBQUNBLGdCQUFnQixXQUFXO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7Ozs7Ozs7OztBQ3RJQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxlQUFlLG1CQUFPLENBQUMsa0RBQVE7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLCtCQUErQjs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DLFFBQVE7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsK0JBQStCOztBQUUvQjtBQUNBLG9DQUFvQyxRQUFRO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7Ozs7Ozs7Ozs7O0FDcEtBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQSxJQUFJLG1GQUE4QjtBQUNsQyxJQUFJLHNGQUFnQztBQUNwQyxJQUFJLCtGQUFzQztBQUMxQyxDQUFDO0FBQ0Q7Ozs7Ozs7Ozs7O0FDaENBLGNBQWMsbUJBQU8sQ0FBQyxnREFBTztBQUM3QjtBQUNBLFFBQVEsa0NBQWtDLEVBQUUsbUJBQU8sQ0FBQyxjQUFJO0FBQ3hELGtCQUFrQixtQkFBTyxDQUFDLHNEQUFZO0FBQ3RDLGFBQWEsbUJBQU8sQ0FBQyxrQkFBTTtBQUMzQixRQUFRLFlBQVksRUFBRSxtQkFBTyxDQUFDLGtCQUFNO0FBQ3BDLGVBQWUsbUJBQU8sQ0FBQyxzQkFBUTtBQUMvQixjQUFjLG1CQUFPLENBQUMsNENBQU87O0FBRTdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCxtQkFBbUI7QUFDcEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELDBCQUEwQjtBQUM5RTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esb0NBQW9DLGlCQUFpQjs7QUFFckQ7QUFDQTs7QUFFQTtBQUNBLGtEQUFrRCxpQkFBaUIsZ0NBQWdDLGVBQWU7QUFDbEg7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsMEJBQTBCO0FBQ3JGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0NBQWdDLDREQUE0RDs7QUFFNUY7O0FBRUE7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLCtCQUErQjtBQUNwRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sMkRBQTJELGdCQUFnQjtBQUMzRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIsaUJBQWlCO0FBQzlDO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUM1S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN0Q0Esa0JBQWtCLG1CQUFPLENBQUMsNERBQWM7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQy9DQSxTQUFTLG1CQUFPLENBQUMsY0FBSTtBQUNyQixXQUFXLG1CQUFPLENBQUMsa0JBQU07QUFDekIsYUFBYSxtQkFBTyxDQUFDLHNCQUFRO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLFdBQVcsbUJBQU8sQ0FBQywwQ0FBTTtBQUN6QixtQkFBbUIsMERBQThCOztBQUVqRCx3QkFBd0I7QUFDeEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQixnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDhCQUE4QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQy9iQSxhQUFhLG9EQUF3Qjs7QUFFckM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQSw4Q0FBOEMsZ0JBQWdCO0FBQzlEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QyxnQkFBZ0I7QUFDOUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNySEEsZ0JBQWdCLG1CQUFPLENBQUMsNEJBQVc7O0FBRW5DO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1QsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1gsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNO0FBQ04sK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbFdhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDUGE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qsc0JBQXNCO0FBQ3RCLHlCQUF5QixtQkFBTyxDQUFDLGdCQUFLO0FBQ3RDLHlCQUF5QixtQkFBTyxDQUFDLGdCQUFLO0FBQ3RDLGdDQUFnQyxtQkFBTyxDQUFDLGdEQUFPO0FBQy9DLGlCQUFpQixtQkFBTyxDQUFDLHNCQUFRO0FBQ2pDLHFCQUFxQixtQkFBTyxDQUFDLDJEQUFZO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxnQkFBSztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQSx3QkFBd0IsU0FBUyxJQUFJLFNBQVM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQSw0QkFBNEIsbUNBQW1DLEdBQUcsbUNBQW1DO0FBQ3JHLHNEQUFzRCxxQ0FBcUM7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNuSmE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsdUJBQXVCO0FBQ3ZCLHlCQUF5QixtQkFBTyxDQUFDLGdCQUFLO0FBQ3RDLHlCQUF5QixtQkFBTyxDQUFDLGdCQUFLO0FBQ3RDLGlDQUFpQyxtQkFBTyxDQUFDLHNCQUFRO0FBQ2pELGdDQUFnQyxtQkFBTyxDQUFDLGdEQUFPO0FBQy9DLHFCQUFxQixtQkFBTyxDQUFDLDJEQUFZO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxnQkFBSztBQUMzQiwrQkFBK0IsbUJBQU8sQ0FBQyw2RkFBd0I7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsaURBQWlELFVBQVU7QUFDM0QsaUNBQWlDLEtBQUssR0FBRyxXQUFXO0FBQ3BEO0FBQ0E7QUFDQSw0QkFBNEIsbUNBQW1DLEdBQUcsbUNBQW1DO0FBQ3JHLHNEQUFzRCxxQ0FBcUM7QUFDM0Y7QUFDQSwwQkFBMEIsS0FBSyxHQUFHLFVBQVU7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLEtBQUssSUFBSSxjQUFjO0FBQ2pEO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQyxnQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsaUJBQWlCO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDOUthO0FBQ2I7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsMEJBQTBCO0FBQzFCLGdDQUFnQyxtQkFBTyxDQUFDLGdEQUFPO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEZBQTRGLE9BQU87QUFDbkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsMEJBQTBCO0FBQzFCOzs7Ozs7Ozs7OztBQ3BHYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7OztBQ2JhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGlCQUFpQixHQUFHLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7Ozs7Ozs7Ozs7QUN6QmE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELFVBQVUsR0FBRyxvQkFBb0IsR0FBRyxnQkFBZ0IsR0FBRyxnQkFBZ0I7QUFDdkUsZUFBZSxtQkFBTyxDQUFDLHNEQUFRO0FBQy9CLDRDQUEyQyxFQUFFLHFDQUFxQywyQkFBMkIsRUFBQztBQUM5RyxlQUFlLG1CQUFPLENBQUMsc0RBQVE7QUFDL0IsNENBQTJDLEVBQUUscUNBQXFDLDJCQUEyQixFQUFDO0FBQzlHLHdCQUF3QixtQkFBTyxDQUFDLHdFQUFpQjtBQUNqRCxnREFBK0MsRUFBRSxxQ0FBcUMsd0NBQXdDLEVBQUM7QUFDL0gsNkJBQTZCLG1CQUFPLENBQUMsa0VBQWM7QUFDbkQsVUFBVSxLQUFLO0FBQ2Y7Ozs7Ozs7Ozs7O0FDbENhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsb0NBQW9DO0FBQ25EO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLDBDQUEwQyw0QkFBNEI7QUFDdEUsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGdCQUFnQjtBQUNoQiw0QkFBNEIsbUJBQU8sQ0FBQywwREFBVTtBQUM5QywrQkFBK0IsbUJBQU8sQ0FBQyxzRUFBZ0I7QUFDdkQsd0JBQXdCLG1CQUFPLENBQUMsd0VBQWlCO0FBQ2pELGVBQWUsbUJBQU8sQ0FBQywwQ0FBTTtBQUM3QixxQkFBcUIsbUJBQU8sQ0FBQyw0REFBWTtBQUN6QztBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGdCQUFnQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7Ozs7Ozs7Ozs7QUNyVWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsZUFBZTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFFBQVE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFFBQVE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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QUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN0REEsK0dBQStDOzs7Ozs7Ozs7OztBQ0EvQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxlQUFlO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGVBQWU7QUFDMUIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM09hO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9DQUFvQztBQUNuRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwwQ0FBMEMsNEJBQTRCO0FBQ3RFLENBQUM7QUFDRDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGtCQUFrQixHQUFHLGVBQWU7QUFDcEMsMEJBQTBCLG1CQUFPLENBQUMsa0JBQU07QUFDeEMsMkJBQTJCLG1CQUFPLENBQUMsb0JBQU87QUFDMUMsY0FBYyxtQkFBTyxDQUFDLGdCQUFLO0FBQzNCLG9DQUFvQyxtQkFBTyxDQUFDLG9EQUFXO0FBQ3ZELHFCQUFxQixtQkFBTyxDQUFDLDJEQUFZO0FBQ3pDLGdDQUFnQyxtQkFBTyxDQUFDLGdEQUFPO0FBQy9DLHlCQUF5QixtQkFBTyxDQUFDLDhEQUFnQjtBQUNqRCwwQkFBMEIsbUJBQU8sQ0FBQyxxRUFBaUI7QUFDbkQsMkJBQTJCLG1CQUFPLENBQUMsdUVBQWtCO0FBQ3JELDRCQUE0QixtQkFBTyxDQUFDLHlFQUFtQjtBQUN2RCw0QkFBNEIsbUJBQU8sQ0FBQyx5RUFBbUI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsU0FBUztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGlCQUFpQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsU0FBUyxJQUFJLEtBQUs7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixTQUFTLEdBQUcsTUFBTTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFLE1BQU07QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCOzs7Ozs7Ozs7OztBQ3JJYTs7QUFFYixlQUFlLDZDQUFvQjs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsZUFBZTtBQUMxQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7Ozs7Ozs7Ozs7O0FDM0d0QixXQUFXLG1CQUFPLENBQUMseUNBQU07QUFDekIsVUFBVSxtQkFBTyxDQUFDLDREQUFlO0FBQ2pDLFNBQVMsbUJBQU8sQ0FBQyxjQUFJOztBQUVyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsZUFBZSxxQ0FBcUM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2pGQTtBQUNBO0FBQ0EsSUFBSSxtQkFBTyxDQUFDLHVFQUFtQjs7Ozs7Ozs7Ozs7QUNGL0I7Ozs7Ozs7Ozs7OztBQ0FhOztBQUViLFNBQVMsbUJBQU8sQ0FBQyxjQUFJO0FBQ3JCLFNBQVMsOENBQW9CO0FBQzdCLFlBQVksaURBQXVCO0FBQ25DLFlBQVksaURBQXVCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qjs7Ozs7Ozs7Ozs7QUNyRnZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpREFBaUQsS0FBSztBQUN0RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEscUJBQXFCLG1CQUFPLENBQUMsa0ZBQTJCO0FBQ3hELFFBQVEsZ0JBQWdCLEVBQUUsbUJBQU8sQ0FBQyw0REFBZ0I7QUFDbEQsWUFBWSxtQkFBTyxDQUFDLGdFQUFrQjtBQUN0QyxjQUFjLG1CQUFPLENBQUMsa0VBQW1CO0FBQ3pDLGVBQWUsbUJBQU8sQ0FBQyx5REFBVTtBQUNqQyxjQUFjLG1CQUFPLENBQUMsdURBQVM7Ozs7Ozs7Ozs7O0FDNUkvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtREFBbUQsU0FBUztBQUM1RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHFCQUFxQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsd0VBQVc7QUFDL0Isd0JBQXdCLFdBQVc7O0FBRW5DLHFCQUFxQixtQkFBTyxDQUFDLGtGQUEyQjtBQUN4RCxtQkFBbUIsbUJBQU8sQ0FBQyxpRUFBYztBQUN6QyxjQUFjLG1CQUFPLENBQUMsa0VBQW1CO0FBQ3pDLGVBQWUsbUJBQU8sQ0FBQyx5REFBVTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEVBQUUsbUJBQU8sQ0FBQyw0REFBZ0I7QUFDNUIsUUFBUSxzQ0FBc0MsRUFBRSxtQkFBTyxDQUFDLDBFQUF1Qjs7QUFFL0U7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGlCQUFpQixFQUFFLFFBQVEsT0FBTztBQUNsQyxNQUFNO0FBQ047QUFDQSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTztBQUMxQyxNQUFNO0FBQ047QUFDQSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDaEMsUUFBUSxHQUFHLEVBQUUsR0FBRyxPQUFPO0FBQ3ZCLE1BQU07QUFDTjtBQUNBLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQzNCLFFBQVEsR0FBRyxFQUFFLEdBQUcsT0FBTztBQUN2Qjs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGlCQUFpQixFQUFFLE1BQU0sR0FBRyxHQUFHLE9BQU87QUFDdEMsTUFBTTtBQUNOO0FBQ0EsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPO0FBQ2hELFFBQVE7QUFDUixtQkFBbUIsRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsT0FBTztBQUMzQztBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDcEMsWUFBWSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTztBQUNoQyxVQUFVO0FBQ1YscUJBQXFCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQ3BDLFlBQVksR0FBRyxFQUFFLEdBQUcsT0FBTztBQUMzQjtBQUNBLFFBQVE7QUFDUixtQkFBbUIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDbEMsVUFBVSxHQUFHLE9BQU87QUFDcEI7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EscUJBQXFCLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDL0IsV0FBVyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU87QUFDcEMsVUFBVTtBQUNWLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQy9CLFdBQVcsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLE9BQU87QUFDL0I7QUFDQSxRQUFRO0FBQ1IsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDN0IsVUFBVSxHQUFHLE9BQU87QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGVBQWUsU0FBUyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRztBQUN2QyxNQUFNO0FBQ04saUJBQWlCLEVBQUUsTUFBTSxJQUFJLEdBQUcsT0FBTztBQUN2QyxNQUFNO0FBQ04saUJBQWlCLEVBQUUsR0FBRyxFQUFFLElBQUk7QUFDNUIsUUFBUSxHQUFHLEVBQUUsR0FBRyxPQUFPO0FBQ3ZCOztBQUVBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osZ0JBQWdCLEdBQUcsTUFBTSxrQkFBa0I7QUFDM0MsSUFBSTtBQUNKLGdCQUFnQixHQUFHLEdBQUcsR0FBRyxJQUFJLGtCQUFrQjtBQUMvQyxJQUFJO0FBQ0osZ0JBQWdCLEtBQUs7QUFDckIsSUFBSTtBQUNKLGdCQUFnQixLQUFLLEVBQUUsa0JBQWtCO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osYUFBYSxRQUFRO0FBQ3JCLElBQUk7QUFDSixhQUFhLEdBQUcsR0FBRyxRQUFRO0FBQzNCLElBQUk7QUFDSixjQUFjLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUk7QUFDcEMsSUFBSTtBQUNKLGFBQWEsR0FBRyxHQUFHLEdBQUcsR0FBRyxRQUFRO0FBQ2pDLElBQUk7QUFDSixjQUFjLEdBQUc7QUFDakI7O0FBRUEsWUFBWSxNQUFNLEVBQUUsR0FBRztBQUN2Qjs7QUFFQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDMWhCQSxjQUFjLG1CQUFPLENBQUMsa0VBQW1CO0FBQ3pDLFFBQVEsK0JBQStCLEVBQUUsbUJBQU8sQ0FBQywwRUFBdUI7QUFDeEUsUUFBUSxnQkFBZ0IsRUFBRSxtQkFBTyxDQUFDLDREQUFnQjs7QUFFbEQscUJBQXFCLG1CQUFPLENBQUMsa0ZBQTJCO0FBQ3hELFFBQVEscUJBQXFCLEVBQUUsbUJBQU8sQ0FBQyw4RUFBeUI7QUFDaEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ04sMEVBQTBFLGVBQWU7QUFDekY7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQyxZQUFZO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLFdBQVcsR0FBRyxXQUFXLEdBQUcsV0FBVztBQUM3RDtBQUNBLDBCQUEwQiwwQkFBMEI7QUFDcEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsUUFBUTtBQUMvRDtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IscUJBQXFCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQzdTQSxjQUFjLG1CQUFPLENBQUMseURBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNMQSxXQUFXLG1CQUFPLENBQUMsbURBQU07QUFDekIsWUFBWSxtQkFBTyxDQUFDLHFEQUFPO0FBQzNCLFdBQVcsbUJBQU8sQ0FBQyxtREFBTTtBQUN6QixZQUFZLG1CQUFPLENBQUMscURBQU87QUFDM0IsV0FBVyxtQkFBTyxDQUFDLG1EQUFNO0FBQ3pCLFlBQVksbUJBQU8sQ0FBQyxxREFBTzs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0MsR0FBRztBQUNsRDtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDbkRBLGVBQWUsbUJBQU8sQ0FBQyxrRUFBbUI7QUFDMUMsY0FBYyxtQkFBTyxDQUFDLHlEQUFTO0FBQy9CLFFBQVEsZ0JBQWdCLEVBQUUsbUJBQU8sQ0FBQyw0REFBZ0I7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRSxTQUFTO0FBQzFFLDREQUE0RCxTQUFTOztBQUVyRSxrQkFBa0IsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU07QUFDL0Q7QUFDQTs7Ozs7Ozs7Ozs7QUMzREEsZUFBZSxtQkFBTyxDQUFDLGtFQUFtQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDTkEsZ0JBQWdCLG1CQUFPLENBQUMsNkRBQVc7QUFDbkM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxlQUFlLG1CQUFPLENBQUMsa0VBQW1CO0FBQzFDO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDSkEsY0FBYyxtQkFBTyxDQUFDLDREQUFZOztBQUVsQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2hFQSxnQkFBZ0IsbUJBQU8sQ0FBQyw2REFBVztBQUNuQztBQUNBOzs7Ozs7Ozs7OztBQ0ZBLGdCQUFnQixtQkFBTyxDQUFDLDZEQUFXO0FBQ25DO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkEsZ0JBQWdCLG1CQUFPLENBQUMsNkRBQVc7QUFDbkM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxlQUFlLG1CQUFPLENBQUMsa0VBQW1COztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNsQkEsZ0JBQWdCLG1CQUFPLENBQUMsNkRBQVc7QUFDbkM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxnQkFBZ0IsbUJBQU8sQ0FBQyw2REFBVztBQUNuQztBQUNBOzs7Ozs7Ozs7OztBQ0ZBLGVBQWUsbUJBQU8sQ0FBQyxrRUFBbUI7QUFDMUM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxlQUFlLG1CQUFPLENBQUMsa0VBQW1CO0FBQzFDO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkEsZ0JBQWdCLG1CQUFPLENBQUMsNkRBQVc7QUFDbkM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxlQUFlLG1CQUFPLENBQUMsa0VBQW1CO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDZkEsZUFBZSxtQkFBTyxDQUFDLGtFQUFtQjtBQUMxQztBQUNBOzs7Ozs7Ozs7OztBQ0ZBLGNBQWMsbUJBQU8sQ0FBQyx5REFBUztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0xBLGdCQUFnQixtQkFBTyxDQUFDLDZEQUFXO0FBQ25DO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkEscUJBQXFCLG1CQUFPLENBQUMseUVBQWlCO0FBQzlDO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkEsY0FBYyxtQkFBTyxDQUFDLGdFQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNUQSxxQkFBcUIsbUJBQU8sQ0FBQyx5RUFBaUI7QUFDOUM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxjQUFjLG1CQUFPLENBQUMseURBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBLG1CQUFtQixtQkFBTyxDQUFDLDJEQUFlO0FBQzFDLGtCQUFrQixtQkFBTyxDQUFDLHlFQUFzQjtBQUNoRCxlQUFlLG1CQUFPLENBQUMsaUVBQWtCO0FBQ3pDLG9CQUFvQixtQkFBTyxDQUFDLDZFQUF3QjtBQUNwRCxjQUFjLG1CQUFPLENBQUMsbUVBQW1CO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDekMsY0FBYyxtQkFBTyxDQUFDLG1FQUFtQjtBQUN6QyxZQUFZLG1CQUFPLENBQUMsK0RBQWlCO0FBQ3JDLGFBQWEsbUJBQU8sQ0FBQyxpRUFBa0I7QUFDdkMsY0FBYyxtQkFBTyxDQUFDLG1FQUFtQjtBQUN6QyxjQUFjLG1CQUFPLENBQUMsbUVBQW1CO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDekMsbUJBQW1CLG1CQUFPLENBQUMsNkVBQXdCO0FBQ25ELGdCQUFnQixtQkFBTyxDQUFDLHVFQUFxQjtBQUM3QyxpQkFBaUIsbUJBQU8sQ0FBQyx5RUFBc0I7QUFDL0MscUJBQXFCLG1CQUFPLENBQUMsbUZBQTJCO0FBQ3hELHFCQUFxQixtQkFBTyxDQUFDLG1GQUEyQjtBQUN4RCxhQUFhLG1CQUFPLENBQUMsaUVBQWtCO0FBQ3ZDLGNBQWMsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDekMsV0FBVyxtQkFBTyxDQUFDLDZEQUFnQjtBQUNuQyxXQUFXLG1CQUFPLENBQUMsNkRBQWdCO0FBQ25DLFdBQVcsbUJBQU8sQ0FBQyw2REFBZ0I7QUFDbkMsWUFBWSxtQkFBTyxDQUFDLCtEQUFpQjtBQUNyQyxZQUFZLG1CQUFPLENBQUMsK0RBQWlCO0FBQ3JDLFlBQVksbUJBQU8sQ0FBQywrREFBaUI7QUFDckMsWUFBWSxtQkFBTyxDQUFDLCtEQUFpQjtBQUNyQyxlQUFlLG1CQUFPLENBQUMscUVBQW9CO0FBQzNDLG1CQUFtQixtQkFBTyxDQUFDLHlFQUFzQjtBQUNqRCxjQUFjLG1CQUFPLENBQUMsK0RBQWlCO0FBQ3ZDLGtCQUFrQixtQkFBTyxDQUFDLDJFQUF1QjtBQUNqRCxzQkFBc0IsbUJBQU8sQ0FBQywrRUFBeUI7QUFDdkQsc0JBQXNCLG1CQUFPLENBQUMsK0VBQXlCO0FBQ3ZELHNCQUFzQixtQkFBTyxDQUFDLCtFQUF5QjtBQUN2RCxtQkFBbUIsbUJBQU8sQ0FBQyx5RUFBc0I7QUFDakQsbUJBQW1CLG1CQUFPLENBQUMsNkRBQWdCO0FBQzNDLGdCQUFnQixtQkFBTyxDQUFDLGlFQUFrQjtBQUMxQyxZQUFZLG1CQUFPLENBQUMseURBQWM7QUFDbEMsWUFBWSxtQkFBTyxDQUFDLHlEQUFjO0FBQ2xDLG1CQUFtQixtQkFBTyxDQUFDLHVFQUFxQjtBQUNoRCxzQkFBc0IsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDakQsZUFBZSxtQkFBTyxDQUFDLCtEQUFpQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3hGQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3RCQTtBQUNBLG9DQUFvQyxhQUFhO0FBQ2pELG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxFQUFFLG1CQUFPLENBQUMsZ0VBQWE7QUFDekIsY0FBYyxtQkFBTyxDQUFDLHdEQUFTO0FBQy9COztBQUVBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLGVBQWUsY0FBYztBQUM3QixZQUFZLFdBQVc7QUFDdkIsVUFBVSxTQUFTO0FBQ25COztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE1BQU0sWUFBWSxPQUFPLElBQUksS0FBSztBQUNsRCxnQkFBZ0IsTUFBTSxZQUFZLE9BQU8sSUFBSSxLQUFLO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9EQUFvRCxpQkFBaUI7O0FBRXJFO0FBQ0E7O0FBRUEsK0JBQStCLHlCQUF5QjtBQUN4RCx1QkFBdUIseUJBQXlCO0FBQ2hELHVCQUF1Qix5QkFBeUI7O0FBRWhELG9DQUFvQyw4QkFBOEI7QUFDbEUsNEJBQTRCLDhCQUE4QjtBQUMxRCw0QkFBNEIsOEJBQThCOztBQUUxRDtBQUNBOztBQUVBLDBDQUEwQztBQUMxQyxDQUFDLEdBQUcsNEJBQTRCOztBQUVoQywrQ0FBK0M7QUFDL0MsQ0FBQyxHQUFHLDRCQUE0Qjs7QUFFaEM7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQyxDQUFDLFFBQVEsNEJBQTRCOztBQUVyQyx3Q0FBd0M7QUFDeEMsQ0FBQyxRQUFRLGlDQUFpQzs7QUFFMUM7QUFDQTs7QUFFQSxrQ0FBa0MsaUJBQWlCOztBQUVuRDtBQUNBO0FBQ0E7O0FBRUEsK0JBQStCO0FBQy9CLENBQUMsUUFBUSx1QkFBdUI7O0FBRWhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7QUFDOUIsQ0FBQyxFQUFFLGtCQUFrQjtBQUNyQixlQUFlOztBQUVmLHdCQUF3QixpQkFBaUI7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxDQUFDLEVBQUUsdUJBQXVCO0FBQzFCLGVBQWU7O0FBRWYseUJBQXlCLGtCQUFrQjs7QUFFM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLDhCQUE4QjtBQUN0RSxtQ0FBbUMseUJBQXlCOztBQUU1RCx1Q0FBdUMsd0JBQXdCO0FBQy9ELDZCQUE2Qix3QkFBd0I7QUFDckQsNkJBQTZCLHdCQUF3QjtBQUNyRCx5QkFBeUIsa0JBQWtCO0FBQzNDLGtDQUFrQztBQUNsQzs7QUFFQSw0Q0FBNEMsNkJBQTZCO0FBQ3pFLGtDQUFrQyw2QkFBNkI7QUFDL0Qsa0NBQWtDLDZCQUE2QjtBQUMvRCw4QkFBOEIsdUJBQXVCO0FBQ3JELHVDQUF1QztBQUN2Qzs7QUFFQSwwQkFBMEIsWUFBWSxNQUFNLG1CQUFtQjtBQUMvRCwrQkFBK0IsWUFBWSxNQUFNLHdCQUF3Qjs7QUFFekU7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QixvQkFBb0IsSUFBSSxFQUFFLDJCQUEyQjtBQUNyRCwwQkFBMEIsSUFBSSwyQkFBMkI7QUFDekQsMEJBQTBCLElBQUksMkJBQTJCO0FBQ3pELHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDLG9CQUFvQixhQUFhO0FBQ2pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDLGlCQUFpQjtBQUNuRCx3QkFBd0I7O0FBRXhCLHlCQUF5QixpQkFBaUIsRUFBRSxtQkFBbUI7QUFDL0QsOEJBQThCLGlCQUFpQixFQUFFLHdCQUF3Qjs7QUFFekU7QUFDQTtBQUNBOztBQUVBLGtDQUFrQyxpQkFBaUI7QUFDbkQsd0JBQXdCOztBQUV4Qix5QkFBeUIsaUJBQWlCLEVBQUUsbUJBQW1CO0FBQy9ELDhCQUE4QixpQkFBaUIsRUFBRSx3QkFBd0I7O0FBRXpFO0FBQ0EsbUNBQW1DLFlBQVksT0FBTyxrQkFBa0I7QUFDeEUsOEJBQThCLFlBQVksT0FBTyxpQkFBaUI7O0FBRWxFO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsQ0FBQyxPQUFPLGtCQUFrQixHQUFHLG1CQUFtQjtBQUNoRCw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLG1CQUFtQjtBQUN2RDtBQUNBLHVCQUF1QixtQkFBbUI7QUFDMUM7O0FBRUEseUNBQXlDLHdCQUF3QjtBQUNqRTtBQUNBLDRCQUE0Qix3QkFBd0I7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeE5ZOztBQUVaO0FBQ0EsZ0JBQWdCLG1CQUFPLENBQUMsa0RBQVM7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUIsa0JBQWtCO0FBQ2xCLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBLDJDQUEyQyxnQkFBZ0I7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkNBQTJDLGdCQUFnQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Qy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsU0FBUztBQUMvQix1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTO0FBQ2hDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsU0FBUztBQUMvQix1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTO0FBQ2hDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTO0FBQ2hDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFNBQVM7QUFDaEMsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFNBQVM7QUFDaEMsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsa0JBQWtCO0FBQ3ZDO0FBQ0EseUJBQXlCLFNBQVM7QUFDbEM7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDLHlCQUF5QixTQUFTO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IscUJBQXFCLGtCQUFrQjtBQUN2Qyx5QkFBeUIsU0FBUztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsU0FBUztBQUNsQztBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGlCQUFpQjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IscUJBQXFCLGtCQUFrQjtBQUN2Qyx5QkFBeUIsU0FBUztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHFCQUFxQixrQkFBa0I7QUFDdkMseUJBQXlCLFNBQVM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQztBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsaUJBQWlCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsU0FBUztBQUMvQix1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixpQkFBaUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsaUJBQWlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixTQUFTO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsU0FBUztBQUMvQix5QkFBeUIsVUFBVTtBQUNuQyxxQkFBcUIsa0JBQWtCO0FBQ3ZDLHlCQUF5QixTQUFTO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFNBQVM7QUFDaEMsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsU0FBUztBQUNwQyx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsU0FBUztBQUNwQyx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixTQUFTO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBLHFCQUFxQixxQ0FBcUM7QUFDMUQseUJBQXlCLFNBQVM7QUFDbEMsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQSxrQkFBa0IsSUFBSTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBLHFCQUFxQix3Q0FBd0M7QUFDN0QseUJBQXlCLFNBQVM7QUFDbEMsc0JBQXNCLElBQUk7QUFDMUIsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixrQkFBa0I7QUFDeEM7QUFDQSxxQkFBcUIsd0NBQXdDO0FBQzdELHlCQUF5QixTQUFTO0FBQ2xDLHNCQUFzQixJQUFJO0FBQzFCLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COzs7Ozs7Ozs7OztBQ2h0Q2E7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsaUJBQWlCLG1CQUFPLENBQUMsc0JBQVE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxZQUFZLFNBQVM7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxTQUFTO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQSxZQUFZLFNBQVM7QUFDckIsWUFBWSxjQUFjO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0UsYUFBYTtBQUNuRjtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDOzs7Ozs7Ozs7OztBQzNHYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCx1QkFBdUI7QUFDdkIsZ0JBQWdCLG1CQUFPLENBQUMsa0RBQU87QUFDL0IscUJBQXFCLG1CQUFPLENBQUMsMkRBQVk7QUFDekMsZ0NBQWdDLG1CQUFPLENBQUMsZ0RBQU87QUFDL0MseUJBQXlCLG1CQUFPLENBQUMsZ0JBQUs7QUFDdEMseUJBQXlCLG1CQUFPLENBQUMsZ0JBQUs7QUFDdEMsY0FBYyxtQkFBTyxDQUFDLGdCQUFLO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFLHFCQUFxQjtBQUNuRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZ0JBQWdCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLCtCQUErQjtBQUMvQztBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsZ0JBQWdCLHNDQUFzQztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixTQUFTO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3hMYTtBQUNiO0FBQ0EsNEJBQTRCLCtEQUErRCxpQkFBaUI7QUFDNUc7QUFDQSxvQ0FBb0MsTUFBTSwrQkFBK0IsWUFBWTtBQUNyRixtQ0FBbUMsTUFBTSxtQ0FBbUMsWUFBWTtBQUN4RixnQ0FBZ0M7QUFDaEM7QUFDQSxLQUFLO0FBQ0w7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0Qsd0JBQXdCLEdBQUcsbUJBQW1CO0FBQzlDLGlCQUFpQixtQkFBTyxDQUFDLHNCQUFRO0FBQ2pDLFlBQVksbUJBQU8sQ0FBQyxnQkFBSztBQUN6Qix1QkFBdUIsbUJBQU8sQ0FBQyxzRUFBYztBQUM3QyxvQkFBb0IsbUJBQU8sQ0FBQywyRUFBcUI7QUFDakQsa0JBQWtCLG1CQUFPLENBQUMsdUVBQW1CO0FBQzdDLHdCQUF3QixtQkFBTyxDQUFDLG1GQUF5QjtBQUN6RCxlQUFlLG1CQUFPLENBQUMsaUVBQWdCO0FBQ3ZDLG9EQUFtRCxFQUFFLHFDQUFxQyxtQ0FBbUMsRUFBQztBQUM5SCxxQkFBcUIsbUJBQU8sQ0FBQyxnRUFBWTtBQUN6QztBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFCQUFxQjtBQUM3Qyx5QkFBeUIsV0FBVztBQUNwQyxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDBCQUEwQjtBQUNsRCx5QkFBeUIsV0FBVztBQUNwQyxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsNEJBQTRCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxjQUFjO0FBQ25ELDhCQUE4QixjQUFjLEdBQUc7QUFDL0M7QUFDQTtBQUNBLDhCQUE4QixjQUFjO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGtDQUFrQyw4RkFBOEY7QUFDN0s7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxrREFBa0QsS0FBSyxvQ0FBb0M7QUFDM0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGlDQUFpQztBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLHFCQUFxQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQywrREFBK0QsS0FBSyxvQ0FBb0M7QUFDeEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsaUNBQWlDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx3REFBd0QsSUFBSSxzQ0FBc0M7QUFDbEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0dBQStHO0FBQy9HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGlDQUFpQztBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxpQ0FBaUM7QUFDdEU7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O0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsa0NBQWtDO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUF1RCxZQUFZO0FBQ25FO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsY0FBYztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHdDQUF3QztBQUNoRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxvQkFBb0I7QUFDcEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkNBQTJDLFNBQVM7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBCQUEwQjs7Ozs7Ozs7Ozs7QUN4YTFCLGlCQUFpQixvQkFBb0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsK0hBQW9EO0FBQzdFLFdBQVcsbUJBQU8sQ0FBQyxxREFBUTs7QUFFM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVE7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLFNBQVM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxTQUFTO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDLFNBQVM7QUFDbkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxjQUFjO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxXQUFXO0FBQ1g7O0FBRUEsa0JBQWtCOzs7Ozs7Ozs7OztBQzVabEIsaUJBQWlCLG9CQUFvQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLGNBQWM7O0FBRWQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7O0FBRVosa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJDQUEyQzs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EseUJBQXlCLGlGQUFpRixJQUFJO0FBQzlHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUIsaUZBQWlGLElBQUk7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHdCQUF3QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBZ0MsYUFBYTtBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGtDQUFrQztBQUM5RDtBQUNBOztBQUVB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QUFJO0FBQ3ZCLGFBQWEsbUJBQU8sQ0FBQyxrQkFBTTs7QUFFM0I7O0FBRUEsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBFQUEwRSxnRUFBZ0U7O0FBRTFJLG9DQUFvQztBQUNwQztBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGVBQWU7QUFDZjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FB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QUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUM5UkEsMkJBQTJCLG1CQUFPLENBQUMsMkZBQTRCO0FBQy9ELG9CQUFvQixtQkFBTyxDQUFDLDJFQUFvQjs7QUFFaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQzNEQSxZQUFZLG1CQUFPLENBQUMsd0NBQUs7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNkQSxZQUFZLG1CQUFP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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsYUFBYTtBQUN6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLG9CQUFvQjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLDBCQUEwQixhQUFhO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFF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Q0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxpQkFBaUI7QUFDOUIsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsc0JBQXNCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxzQkFBc0I7QUFDbkMsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxzQkFBc0I7QUFDbkMsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFF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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsR0FBRztBQUNoQixhQUFhLFNBQVM7QUFDdEIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsR0FBRztBQUNoQixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtB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QTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLG9EQUFvRCxTQUFTO0FBQzdEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZUFBZTtBQUN0RDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksWUFBWTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksZUFBZTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFdBQVc7QUFDdEIsV0FBVyw0Q0FBNEM7QUFDdkQ7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsR0FBRztBQUNkLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkNBQTJDLHNCQUFzQjtBQUNqRSxZQUFZLGtDQUFrQztBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsb0JBQW9CO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDhCQUE4QjtBQUN6QyxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsV0FBVztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDMzJDWTtBQUNaO0FBQ0E7QUFDQSxpQ0FBaUMsUUFBUTtBQUN6QztBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDUFk7QUFDWjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0osMENBQTBDLE9BQU87QUFDakQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0NBQXdDLE9BQU87QUFDL0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3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Qy9EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw4QkFBOEI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw4QkFBOEI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCO0FBQ3pCLHFDQUFxQztBQUNyQyx3Q0FBd0M7O0FBRXhDO0FBQ0Esa0NBQWtDO0FBQ2xDLGlDQUFpQztBQUNqQyxnQ0FBZ0M7O0FBRWhDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLCtCQUErQjtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsd0NBQXdDO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0VBQStFLGlFQUFpRSxFQUFFO0FBQ2xKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLHdCQUF3QixTQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUMzeEJBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7OztBQ0FhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFFBQVEsVUFBVTtBQUMxQyw4REFBOEQ7QUFDOUQsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsWUFBWTtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsT0FBTztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLDJCQUEyQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEdBQUc7QUFDaEIsYUFBYSxRQUFRO0FBQ3JCLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxR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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQSxZQUFZLHdCQUF3QjtBQUNwQyx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkIsdUJBQXVCO0FBQ2xEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLCtCQUErQixJQUFJO0FBQ2hEO0FBQ0EsOEJBQThCLE1BQU07QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGNBQWMsK0JBQStCLElBQUk7QUFDakQ7QUFDQSw4QkFBOEIsTUFBTTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQ0FBb0Msa0JBQWtCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUMsa0JBQWtCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLCtDQUErQyxJQUFJO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZLCtCQUErQixJQUFJO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFVBQVU7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxVQUFVO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIseUNBQXlDO0FBQ2hFO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlELGtCQUFrQjtBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QyxrQkFBa0I7QUFDMUQ7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUMxc0NhOztBQUViLFNBQVMsbUJBQU8sQ0FBQyxjQUFJO0FBQ3JCLFdBQVcsbUJBQU8sQ0FBQyxrQkFBTTtBQUN6QixXQUFXLG1CQUFPLENBQUMsa0JBQU07O0FBRXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUMxTWE7O0FBRWIsV0FBVyxtQkFBTyxDQUFDLGtCQUFNO0FBQ3pCLFdBQVcsbUJBQU8sQ0FBQyxrQkFBTTtBQUN6QixTQUFTLG1CQUFPLENBQUMsY0FBSTs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLGdCQUFnQjtBQUNwRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFdBQVcsRUFBRSxvQkFBb0I7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHVCQUF1QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsMERBQTBEOztBQUUzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCxPQUFPO0FBQ2pFO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBLGlEQUFpRCxHQUFHO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG9CQUFvQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0EsZ0JBQWdCLHVEQUFNLDJDQUEyQyxTQUFTO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0EsZ0JBQWdCLHVEQUFNLDJDQUEyQyxTQUFTO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0EsZ0JBQWdCLHVEQUFNLDJDQUEyQyxTQUFTO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQsa0VBQWtFO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxnQkFBZ0IsdURBQU0sMkNBQTJDLFNBQVM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0EsZ0JBQWdCLHVEQUFNLDJDQUEyQyxTQUFTO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxxQkFBcUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQscURBQXFELFdBQVcsR0FBRztBQUNuRTtBQUNB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CLGdCQUFnQixzQ0FBc0M7QUFDdEQsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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LDhDQUE4QyxlQUFlO0FBQzdELFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLHVEQUFRO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUN4S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsR0FBRyxxQkFBcUI7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSwyQ0FBMkMsR0FBRyxxQkFBcUI7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsR0FBRyxhQUFhLE9BQU87QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsR0FBRyxhQUFhLE9BQU87QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsR0FBRyxhQUFhLE9BQU87QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsR0FBRyxhQUFhLE9BQU87QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsR0FBRyxhQUFhLE9BQU87QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsR0FBRyxhQUFhLE9BQU87QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsYUFBYTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGFBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsYUFBYTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDLHVDQUF1QyxTQUFTO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EseUNBQXlDLHVDQUF1QyxTQUFTO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLEdBQUcsT0FBTztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLE9BQU87QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNrRDtBQUNJO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qyw0QkFBNEI7QUFDekUsSUFBSSw4QkFBOEI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHFFQUFJO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsOERBQWE7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssOERBQWE7QUFDbEI7QUFD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LDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyw0Q0FBSztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxjQUFjLFVBQVU7QUFDeEI7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQix1QkFBdUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQix1QkFBdUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQix1QkFBdUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRSxVQUFVO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixrQkFBa0I7QUFDbEIsVUFBVTtBQUNWO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVDQUF1QztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IseUNBQXlDO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHVCQUF1QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLEtBQUssRUFBRSxFQUFjO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isd0NBQXdDO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0ZBQWtGLG9CQUFvQjtBQUN0RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sY0FBYztBQUNkLE1BQU07QUFDTjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Es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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHVCQUF1QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHVCQUF1QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSx3RUFBd0Usd0NBQXdDO0FBQ2hIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUEyQ0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdHlGRjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTLGdCQUFnQixzQ0FBc0Msa0JBQWtCO0FBQ2pGLHdCQUF3QjtBQUN4QjtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRU87QUFDUDtBQUNBLCtDQUErQyxPQUFPO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsY0FBYztBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0E7O0FBRU87QUFDUCxrQ0FBa0M7QUFDbEM7O0FBRU87QUFDUCx1QkFBdUIsdUZBQXVGO0FBQzlHO0FBQ0E7QUFDQSx5R0FBeUc7QUFDekc7QUFDQSxzQ0FBc0MsUUFBUTtBQUM5QztBQUNBLGdFQUFnRTtBQUNoRTtBQUNBLDhDQUE4Qyx5RkFBeUY7QUFDdkksOERBQThELDJDQUEyQztBQUN6RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBLGtCQUFrQix5QkFBeUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBOztBQUVPO0FBQ1A7QUFDQSw0Q0FBNEMseUVBQXlFO0FBQ3JIOztBQUVPO0FBQ1A7QUFDQTs7QUFFTztBQUNQLDBCQUEwQiwrREFBK0QsaUJBQWlCO0FBQzFHO0FBQ0Esa0NBQWtDLE1BQU0sK0JBQStCLFlBQVk7QUFDbkYsaUNBQWlDLE1BQU0sbUNBQW1DLFlBQVk7QUFDdEYsOEJBQThCO0FBQzlCO0FBQ0EsR0FBRztBQUNIOztBQUVPO0FBQ1AsWUFBWSw2QkFBNkIsMEJBQTBCLGNBQWMscUJBQXFCO0FBQ3RHLDJJQUEySSxjQUFjO0FBQ3pKLHFCQUFxQixzQkFBc0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDLGlDQUFpQyxTQUFTO0FBQzFDLGlDQUFpQyxXQUFXLFVBQVU7QUFDdEQsd0NBQXdDLGNBQWM7QUFDdEQ7QUFDQSw0R0FBNEcsT0FBTztBQUNuSCwrRUFBK0UsaUJBQWlCO0FBQ2hHLHVEQUF1RCxnQkFBZ0IsUUFBUTtBQUMvRSw2Q0FBNkMsZ0JBQWdCLGdCQUFnQjtBQUM3RTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0EsUUFBUSxZQUFZLGFBQWEsU0FBUyxVQUFVO0FBQ3BELGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9DQUFvQztBQUNuRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDOztBQUVNO0FBQ1A7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsTUFBTTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDTztBQUNQLDJCQUEyQixzQkFBc0I7QUFDakQ7QUFDQTtBQUNBOztBQUVBO0FBQ087QUFDUCxnREFBZ0QsUUFBUTtBQUN4RCx1Q0FBdUMsUUFBUTtBQUMvQyx1REFBdUQsUUFBUTtBQUMvRDtBQUNBO0FBQ0E7O0FBRU87QUFDUCwyRUFBMkUsT0FBTztBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0Esd01BQXdNLGNBQWM7QUFDdE4sNEJBQTRCLHNCQUFzQjtBQUNsRCx3QkFBd0IsWUFBWSxzQkFBc0IscUNBQXFDLDJDQUEyQyxNQUFNO0FBQ2hKLDBCQUEwQixNQUFNLGlCQUFpQixZQUFZO0FBQzdELHFCQUFxQjtBQUNyQiw0QkFBNEI7QUFDNUIsMkJBQTJCO0FBQzNCLDBCQUEwQjtBQUMxQjs7QUFFTztBQUNQO0FBQ0EsZUFBZSw2Q0FBNkMsVUFBVSxzREFBc0QsY0FBYztBQUMxSSx3QkFBd0IsNkJBQTZCLG9CQUFvQix1Q0FBdUMsa0JBQWtCO0FBQ2xJOztBQUVPO0FBQ1A7QUFDQTtBQUNBLHlHQUF5Ryx1RkFBdUYsY0FBYztBQUM5TSxxQkFBcUIsOEJBQThCLGdEQUFnRCx3REFBd0Q7QUFDM0osMkNBQTJDLHNDQUFzQyxVQUFVLG1CQUFtQixJQUFJO0FBQ2xIOztBQUVPO0FBQ1AsK0JBQStCLHVDQUF1QyxZQUFZLEtBQUssT0FBTztBQUM5RjtBQUNBOztBQUVBO0FBQ0Esd0NBQXdDLDRCQUE0QjtBQUNwRSxDQUFDO0FBQ0Q7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQLDJDQUEyQztBQUMzQzs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLE1BQU0sb0JBQW9CLFlBQVk7QUFDNUUscUJBQXFCLDhDQUE4QztBQUNuRTtBQUNBO0FBQ0EscUJBQXFCLGFBQWE7QUFDbEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVGQUF1RixTQUFTLGdCQUFnQjtBQUNoSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDelhrRDtBQUNYO0FBQ0o7QUFDTTtBQUNhOztBQUV1QjtBQUMvRSxpRUFBZSw4Q0FBUyxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FDUHpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0t1RDtBQUN6QjtBQUNDO0FBQy9CLGlFQUFlO0FBQ2Y7QUFDQSxvQkFBb0I7QUFDcEIsaUJBQWlCO0FBQ2pCLEtBQUs7QUFDTCxVQUFVO0FBQ1YsV0FBVztBQUNYO0FBQ0E7QUFDQSxtQkFBbUIsNENBQVE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEJtRDtBQUNEOztBQUVwRDtBQUNBLFNBQVMseURBQUssT0FBTyx5RUFBSTtBQUN6Qjs7QUFFQSxpRUFBZSxJQUFJOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQzhCO0FBQ1k7QUFDaUM7QUFDM0I7QUFDZDtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsZUFBZTtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQix5REFBVztBQUM5QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsVUFBVTtBQUNWLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QixnREFBWTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHVEQUFTO0FBQ2pDLHlCQUF5Qix3REFBVTtBQUNuQyw4QkFBOEIsNkRBQWU7QUFDN0MsaUVBQWUsV0FBVyxFQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3RDNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLGdCQUFnQjtBQUNwRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFdBQVcsRUFBRSxvQkFBb0I7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsdUJBQXVCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsMERBQTBEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWDNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDNkQ7QUFDSztBQUNTO0FBQzNFO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLHFCQUFxQiwwRUFBaUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwwREFBMEQsT0FBTztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQSxpREFBaUQsR0FBRztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxvQkFBb0I7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO1dBQ0E7V0FDQTtXQUNBLGdCQUFnQixxQkFBcUI7V0FDckM7O1dBRUE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQSxhQUFhO1dBQ2I7V0FDQSxJQUFJO1dBQ0o7V0FDQTs7V0FFQTs7V0FFQTs7V0FFQTs7Ozs7VUVyQ0E7VUFDQTtVQUNBO1VBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9jb21tb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9ub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9hc3luY2lmeS1oZWxwZXJzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvY29udGV4dC1hc3luY2lmeS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2NvbnRleHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9kZWJ1Zy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2RlZmVycmVkLXByb21pc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9lcnJvcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9lc21IZWxwZXJzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvZ2VuZXJhdGVkL2Vtc2NyaXB0ZW4tbW9kdWxlLldBU01fUkVMRUFTRV9TWU5DLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvZ2VuZXJhdGVkL2ZmaS5XQVNNX1JFTEVBU0VfU1lOQy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvbGlmZXRpbWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9tZW1vcnkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9tb2R1bGUtYXN5bmNpZnkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9tb2R1bGUtdGVzdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L21vZHVsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L3J1bnRpbWUtYXN5bmNpZnkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9ydW50aW1lLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvdHlwZXMtZmZpLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC92YXJpYW50cy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L3ZtLWludGVyZmFjZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYWdlbnQtYmFzZS9kaXN0L2hlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FnZW50LWJhc2UvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYW5zaS1yZWdleC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYW5zaS1zdHlsZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvYmFiZWwtY29yZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi9iYWJlbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi9jb3JlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2VzLXByb3Bvc2Fscy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi9lczIwMjAuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvZXM2LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2VzNy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi9lc3ByaW1hLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2Zsb3cuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvanN4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL3R5cGUtYW5ub3RhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvdHlwZXNjcmlwdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2ZvcmsuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9nZW4vbmFtZWRUeXBlcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2xpYi9lcXVpdi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2xpYi9ub2RlLXBhdGguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9saWIvcGF0aC12aXNpdG9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvbGliL3BhdGguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9saWIvc2NvcGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9saWIvc2hhcmVkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvbGliL3R5cGVzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvbWFpbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYjRhL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC9DbGllbnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L0ZpbGVJbmZvLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC9GdHBDb250ZXh0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC9Qcm9ncmVzc1RyYWNrZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L1N0cmluZ0VuY29kaW5nLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC9TdHJpbmdXcml0ZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC9uZXRVdGlscy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvcGFyc2VDb250cm9sUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L3BhcnNlTGlzdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvcGFyc2VMaXN0RE9TLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC9wYXJzZUxpc3RNTFNELmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC9wYXJzZUxpc3RVbml4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC90cmFuc2Zlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYnVmZmVyLWNyYzMyL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9idWZmZXJ1dGlsL2ZhbGxiYWNrLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9idWZmZXJ1dGlsL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jb2xvci1jb252ZXJ0L2NvbnZlcnNpb25zLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jb2xvci1jb252ZXJ0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jb2xvci1jb252ZXJ0L3JvdXRlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jb2xvci1uYW1lL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9kYXRhLXVyaS10by1idWZmZXIvZGlzdC9jb21tb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RhdGEtdXJpLXRvLWJ1ZmZlci9kaXN0L25vZGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9icm93c2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvY29tbW9uLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9ub2RlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9kZWdlbmVyYXRvci9kaXN0L2NvbXBpbGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RlZ2VuZXJhdG9yL2Rpc3QvZGVnZW5lcmF0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RlZ2VuZXJhdG9yL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Vtb2ppLXJlZ2V4L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9lbmQtb2Ytc3RyZWFtL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9lc2NhbGFkZS9zeW5jL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9lc2NvZGVnZW4vZXNjb2RlZ2VuLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9lc3ByaW1hL2Rpc3QvZXNwcmltYS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZXN0cmF2ZXJzZS9lc3RyYXZlcnNlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9lc3V0aWxzL2xpYi9hc3QuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzdXRpbHMvbGliL2NvZGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzdXRpbHMvbGliL2tleXdvcmQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzdXRpbHMvbGliL3V0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9leHRyYWN0LXppcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZmFzdC1maWZvL2ZpeGVkLXNpemUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Zhc3QtZmlmby9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZmQtc2xpY2VyL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvY29weS9jb3B5LXN5bmMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9jb3B5L2NvcHkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9jb3B5L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvZW1wdHkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9lbnN1cmUvZmlsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2Vuc3VyZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2Vuc3VyZS9saW5rLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvZW5zdXJlL3N5bWxpbmstcGF0aHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9lbnN1cmUvc3ltbGluay10eXBlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvZW5zdXJlL3N5bWxpbmsuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9mcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvanNvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2pzb24vanNvbmZpbGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9qc29uL291dHB1dC1qc29uLXN5bmMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9qc29uL291dHB1dC1qc29uLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvbWtkaXJzL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvbWtkaXJzL21ha2UtZGlyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvbWtkaXJzL3V0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvbW92ZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL21vdmUvbW92ZS1zeW5jLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvbW92ZS9tb3ZlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvb3V0cHV0LWZpbGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9wYXRoLWV4aXN0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL3JlbW92ZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL3V0aWwvc3RhdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL3V0aWwvdXRpbWVzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtY2FsbGVyLWZpbGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC1zdHJlYW0vYnVmZmVyLXN0cmVhbS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXN0cmVhbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXVyaS9kaXN0L2RhdGEuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC11cmkvZGlzdC9maWxlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtdXJpL2Rpc3QvZnRwLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtdXJpL2Rpc3QvaHR0cC1lcnJvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXVyaS9kaXN0L2h0dHAuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC11cmkvZGlzdC9odHRwcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXVyaS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtdXJpL2Rpc3Qvbm90Zm91bmQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC11cmkvZGlzdC9ub3Rtb2RpZmllZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ3JhY2VmdWwtZnMvY2xvbmUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dyYWNlZnVsLWZzL2dyYWNlZnVsLWZzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9ncmFjZWZ1bC1mcy9sZWdhY3ktc3RyZWFtcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ3JhY2VmdWwtZnMvcG9seWZpbGxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9oYXMtZmxhZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvaHR0cC1wcm94eS1hZ2VudC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9odHRwcy1wcm94eS1hZ2VudC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9odHRwcy1wcm94eS1hZ2VudC9kaXN0L3BhcnNlLXByb3h5LXJlc3BvbnNlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvYWRkcmVzcy1lcnJvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvaXAtYWRkcmVzcy9kaXN0L2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvaXAtYWRkcmVzcy9kaXN0L2lwLWFkZHJlc3MuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2lwLWFkZHJlc3MvZGlzdC9pcHY0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvaXB2Ni5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvaXAtYWRkcmVzcy9kaXN0L3Y0L2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvaXAtYWRkcmVzcy9kaXN0L3Y2L2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvaXAtYWRkcmVzcy9kaXN0L3Y2L2hlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2lwLWFkZHJlc3MvZGlzdC92Ni9yZWd1bGFyLWV4cHJlc3Npb25zLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcy1mdWxsd2lkdGgtY29kZS1wb2ludC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvanNibi9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvanNvbmZpbGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2pzb25maWxlL3V0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvbmV0bWFzay9saWIvbmV0bWFzay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvbm9kZS1neXAtYnVpbGQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL25vZGUtZ3lwLWJ1aWxkL25vZGUtZ3lwLWJ1aWxkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9vbmNlL29uY2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1wcm94eS1hZ2VudC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wYWMtcmVzb2x2ZXIvZGlzdC9kYXRlUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2Ruc0RvbWFpbklzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wYWMtcmVzb2x2ZXIvZGlzdC9kbnNEb21haW5MZXZlbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2Ruc1Jlc29sdmUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wYWMtcmVzb2x2ZXIvZGlzdC9pcC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvaXNJbk5ldC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvaXNQbGFpbkhvc3ROYW1lLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wYWMtcmVzb2x2ZXIvZGlzdC9pc1Jlc29sdmFibGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2xvY2FsSG9zdE9yRG9tYWluSXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L215SXBBZGRyZXNzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wYWMtcmVzb2x2ZXIvZGlzdC9zaEV4cE1hdGNoLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wYWMtcmVzb2x2ZXIvZGlzdC90aW1lUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L3V0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L3dlZWtkYXlSYW5nZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGVuZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHJvZ3Jlc3MvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Byb2dyZXNzL2xpYi9ub2RlLXByb2dyZXNzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wcm94eS1hZ2VudC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wcm94eS1mcm9tLWVudi9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVtcC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcXVldWUtdGljay9wcm9jZXNzLW5leHQtdGljay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcXVldWUtdGljay9xdWV1ZS1taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3JlcXVpcmUtZGlyZWN0b3J5L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvY2xhc3Nlcy9jb21wYXJhdG9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvY2xhc3Nlcy9yYW5nZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2NsYXNzZXMvc2VtdmVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2NsZWFuLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2NtcC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9jb2VyY2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS1idWlsZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLWxvb3NlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvZGlmZi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9lcS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9ndC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9ndGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvaW5jLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2x0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2x0ZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9tYWpvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9taW5vci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9uZXEuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvcGFyc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvcGF0Y2guanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvcHJlcmVsZWFzZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9yY29tcGFyZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9yc29ydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9zYXRpc2ZpZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvc29ydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy92YWxpZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvZGVidWcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9pZGVudGlmaWVycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL3BhcnNlLW9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9yZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL25vZGVfbW9kdWxlcy9scnUtY2FjaGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvZ3RyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvcmFuZ2VzL2ludGVyc2VjdHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvbHRyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvcmFuZ2VzL21heC1zYXRpc2Z5aW5nLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvcmFuZ2VzL21pbi1zYXRpc2Z5aW5nLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvcmFuZ2VzL21pbi12ZXJzaW9uLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvcmFuZ2VzL291dHNpZGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvc2ltcGxpZnkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvc3Vic2V0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvcmFuZ2VzL3RvLWNvbXBhcmF0b3JzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvcmFuZ2VzL3ZhbGlkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zbWFydC1idWZmZXIvYnVpbGQvc21hcnRidWZmZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NtYXJ0LWJ1ZmZlci9idWlsZC91dGlscy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc29ja3MtcHJveHktYWdlbnQvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc29ja3MvYnVpbGQvY2xpZW50L3NvY2tzY2xpZW50LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb2Nrcy9idWlsZC9jb21tb24vY29uc3RhbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb2Nrcy9idWlsZC9jb21tb24vaGVscGVycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc29ja3MvYnVpbGQvY29tbW9uL3JlY2VpdmVidWZmZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvY2tzL2J1aWxkL2NvbW1vbi91dGlsLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb2Nrcy9idWlsZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYXJyYXktc2V0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9iYXNlNjQtdmxxLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9iYXNlNjQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2JpbmFyeS1zZWFyY2guanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL21hcHBpbmctbGlzdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvcXVpY2stc29ydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC1nZW5lcmF0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1ub2RlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi91dGlsLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL3NvdXJjZS1tYXAuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NwcmludGYtanMvc3JjL3NwcmludGYuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3N0cmVhbXgvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3N0cmluZy13aWR0aC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc3RyaXAtYW5zaS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc3VwcG9ydHMtY29sb3IvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Rhci1mcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGFyLXN0cmVhbS9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Rhci1zdHJlYW0vZXh0cmFjdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGFyLXN0cmVhbS9oZWFkZXJzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL3BhY2suanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3RleHQtZGVjb2Rlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGV4dC1kZWNvZGVyL2xpYi9wYXNzLXRocm91Z2gtZGVjb2Rlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGV4dC1kZWNvZGVyL2xpYi91dGY4LWRlY29kZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Rocm91Z2gvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vc3JjL2NvbmZpZ3VyYXRpb24udHMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vc3JjL3BhZ2VzL2NvbmZpcm0taW5zdGFsbGF0aW9uLXBhZ2UudHMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vc3JjL3BhZ2VzL2NyZWF0ZS11c2VyLXBhZ2UudHMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vc3JjL3BhZ2VzL2xvZ2luLWFzLXJvb3QtcGFnZS50cyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9zcmMvcGFnZXMvb3Zlcmlldy1wYWdlLnRzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL3NyYy9wYWdlcy9wcm9kdWN0LXNlbGVjdGlvbi1wYWdlLnRzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL3NyYy9wYWdlcy9yb290LXBhc3N3b3JkLXBhZ2UudHMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vc3JjL3BhZ2VzL3NpZGViYXItcGFnZS50cyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9zcmMvcGFnZXMvdXNlcnMtcGFnZS50cyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9zcmMvdGVzdHMvZGVmYXVsdF9pbnN0YWxsYXRpb24udHMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3VuYnppcDItc3RyZWFtL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy91bmJ6aXAyLXN0cmVhbS9saWIvYml0X2l0ZXJhdG9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy91bmJ6aXAyLXN0cmVhbS9saWIvYnppcDIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3VuaXZlcnNhbGlmeS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdXRmLTgtdmFsaWRhdGUvZmFsbGJhY2suanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3V0Zi04LXZhbGlkYXRlL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cmFwLWFuc2kvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dyYXBweS93cmFwcHkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9idWZmZXItdXRpbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL2V2ZW50LXRhcmdldC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL2V4dGVuc2lvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL2xpbWl0ZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9wZXJtZXNzYWdlLWRlZmxhdGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9yZWNlaXZlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL3NlbmRlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL3N0cmVhbS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL3N1YnByb3RvY29sLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cy9saWIvdmFsaWRhdGlvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL3dlYnNvY2tldC1zZXJ2ZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi93ZWJzb2NrZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhbGxpc3QvaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhbGxpc3QveWFsbGlzdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkLyBzeW5jIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC8gc3luYyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWF1emwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJhc3NlcnRcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImJ1ZmZlclwiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiY2hpbGRfcHJvY2Vzc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiY29uc3RhbnRzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImRuc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiZXZlbnRzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJmc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiZnMvcHJvbWlzZXNcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImh0dHBcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImh0dHBzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJuZXRcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm5vZGU6YXNzZXJ0L3N0cmljdFwiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwibm9kZTpjaGlsZF9wcm9jZXNzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJub2RlOmV2ZW50c1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwibm9kZTpmc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwibm9kZTpwYXRoXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJub2RlOnByb2Nlc3NcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm5vZGU6dGVzdFwiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwib3NcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInBhdGhcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInByb2Nlc3NcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInJlYWRsaW5lXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJzdHJlYW1cIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInRsc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwidHR5XCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJ1cmxcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInV0aWxcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInpsaWJcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY2xpdWkvYnVpbGQvaW5kZXguY2pzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jb21tYW5kZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvYXJndW1lbnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvY29tbWFuZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY29tbWFuZGVyL2xpYi9lcnJvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY29tbWFuZGVyL2xpYi9oZWxwLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jb21tYW5kZXIvbGliL29wdGlvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY29tbWFuZGVyL2xpYi9zdWdnZXN0U2ltaWxhci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvbHJ1LWNhY2hlL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95MThuL2J1aWxkL2luZGV4LmNqcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkL2luZGV4LmNqcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvaW5kZXguY2pzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vQ0xJLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vQ2FjaGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9icm93c2VyLWRhdGEvYnJvd3Nlci1kYXRhLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vYnJvd3Nlci1kYXRhL2Nocm9tZS1oZWFkbGVzcy1zaGVsbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2Jyb3dzZXItZGF0YS9jaHJvbWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9icm93c2VyLWRhdGEvY2hyb21lZHJpdmVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vYnJvd3Nlci1kYXRhL2Nocm9taXVtLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vYnJvd3Nlci1kYXRhL2ZpcmVmb3guanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9icm93c2VyLWRhdGEvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9kZWJ1Zy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2RldGVjdFBsYXRmb3JtLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vZmlsZVV0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9odHRwVXRpbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2luc3RhbGwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9sYXVuY2guanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9tYWluLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jbGl1aS9idWlsZC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NsaXVpL2J1aWxkL2xpYi9zdHJpbmctdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NsaXVpL2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY29tbWFuZGVyL2VzbS5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzY2FsYWRlL3N5bmMvaW5kZXgubWpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvQnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0Jyb3dzZXJDb250ZXh0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvQ0RQU2Vzc2lvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0RpYWxvZy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0VsZW1lbnRIYW5kbGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9FbGVtZW50SGFuZGxlU3ltYm9sLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvRW52aXJvbm1lbnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9GcmFtZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0hUVFBSZXF1ZXN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvSFRUUFJlc3BvbnNlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvSW5wdXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9KU0hhbmRsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL1BhZ2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9SZWFsbS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL1RhcmdldC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL1dlYldvcmtlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL2FwaS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL2xvY2F0b3JzL2xvY2F0b3JzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9iaWRpL0Jyb3dzZXJDb25uZWN0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9BY2Nlc3NpYmlsaXR5LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQXJpYVF1ZXJ5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0JpbmRpbmcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9Ccm93c2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQnJvd3NlckNvbm5lY3Rvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0Jyb3dzZXJDb250ZXh0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQ0RQU2Vzc2lvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0NkcFByZWxvYWRTY3JpcHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9DaHJvbWVUYXJnZXRNYW5hZ2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQ29ubmVjdGlvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0NvdmVyYWdlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRGV2aWNlUmVxdWVzdFByb21wdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0RpYWxvZy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0VsZW1lbnRIYW5kbGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9FbXVsYXRpb25NYW5hZ2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRXhlY3V0aW9uQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0V4dGVuc2lvblRyYW5zcG9ydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0ZpcmVmb3hUYXJnZXRNYW5hZ2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRnJhbWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9GcmFtZU1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9GcmFtZU1hbmFnZXJFdmVudHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9GcmFtZVRyZWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9IVFRQUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0hUVFBSZXNwb25zZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0lucHV0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvSXNvbGF0ZWRXb3JsZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0lzb2xhdGVkV29ybGRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvSlNIYW5kbGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9MaWZlY3ljbGVXYXRjaGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvTmV0d29ya0V2ZW50TWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL05ldHdvcmtNYW5hZ2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvUGFnZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL1ByZWRlZmluZWROZXR3b3JrQ29uZGl0aW9ucy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL1RhcmdldC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL1RhcmdldE1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9UcmFjaW5nLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvV2ViV29ya2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvY2RwLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9Ccm93c2VyQ29ubmVjdG9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0NTU1F1ZXJ5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0NhbGxiYWNrUmVnaXN0cnkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9Db25maWd1cmF0aW9uLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQ29ubmVjdE9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9Db25uZWN0aW9uVHJhbnNwb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQ29uc29sZU1lc3NhZ2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9Db29raWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9DdXN0b21RdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9EZWJ1Zy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0RldmljZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0Vycm9ycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0V2ZW50RW1pdHRlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0ZpbGVDaG9vc2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vR2V0UXVlcnlIYW5kbGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vSGFuZGxlSXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9MYXp5QXJnLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vTmV0d29ya01hbmFnZXJFdmVudHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9QREZPcHRpb25zLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vUFF1ZXJ5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1BTZWxlY3RvclBhcnNlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1BpZXJjZVF1ZXJ5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1Byb2R1Y3QuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9QdXBwZXRlZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9RdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9TY3JpcHRJbmplY3Rvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1NlY3VyaXR5RGV0YWlscy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1Rhc2tRdWV1ZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1RleHRRdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9UaW1lb3V0U2V0dGluZ3MuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9VU0tleWJvYXJkTGF5b3V0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vVmlld3BvcnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9XYWl0VGFzay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1hQYXRoUXVlcnlIYW5kbGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vY29tbW9uLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vdHlwZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi91dGlsLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9lbnZpcm9ubWVudC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvZ2VuZXJhdGVkL2luamVjdGVkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9nZW5lcmF0ZWQvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvaW5kZXgtYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL25vZGUvQ2hyb21lTGF1bmNoZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL25vZGUvRmlyZWZveExhdW5jaGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL0xhdW5jaE9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL25vZGUvTm9kZVdlYlNvY2tldFRyYW5zcG9ydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvbm9kZS9QaXBlVHJhbnNwb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL1Byb2R1Y3RMYXVuY2hlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvbm9kZS9QdXBwZXRlZXJOb2RlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL1NjcmVlblJlY29yZGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL25vZGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL25vZGUvdXRpbC9mcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvcHVwcGV0ZWVyLWNvcmUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3JldmlzaW9ucy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvdXRpbC9Bc3luY0l0ZXJhYmxlVXRpbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvdXRpbC9EZWZlcnJlZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvdXRpbC9FcnJvckxpa2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvRnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvTXV0ZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvYXNzZXJ0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci91dGlsL2RlY29yYXRvcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvZGlzcG9zYWJsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvdXRpbC91dGlsLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3RoaXJkX3BhcnR5L21pdHQvbWl0dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS90aGlyZF9wYXJ0eS9wYXJzZWwtanMvcGFyc2VsLWpzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2Lm1qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3Mvd3JhcHBlci5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3kxOG4vYnVpbGQvbGliL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95MThuL2J1aWxkL2xpYi9wbGF0Zm9ybS1zaGltcy9ub2RlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95MThuL2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkL2xpYi9zdHJpbmctdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvdG9rZW5pemUtYXJnLXN0cmluZy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkL2xpYi95YXJncy1wYXJzZXItdHlwZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIveWFyZ3MtcGFyc2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YXJncy9idWlsZC9saWIvdXRpbHMvYXBwbHktZXh0ZW5kcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL3Byb2Nlc3MtYXJndi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3llcnJvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvaGVscGVycy9oZWxwZXJzLm1qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvbGliL3BsYXRmb3JtLXNoaW1zL2VzbS5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzL3lhcmdzLm1qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3Qvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvY3JlYXRlIGZha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3Qvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvZW5zdXJlIGNodW5rIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvZ2V0IGphdmFzY3JpcHQgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svcnVudGltZS9ub2RlIG1vZHVsZSBkZWNvcmF0b3IiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svcnVudGltZS9yZXF1aXJlIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svYmVmb3JlLXN0YXJ0dXAiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svc3RhcnR1cCIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3Qvd2VicGFjay9hZnRlci1zdGFydHVwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGRlYnVnIGluc3RhbmNlIHRvIGJlIGNvbG9yZWRcblx0KiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBBbiBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG5cdFx0bGV0IGhhc2ggPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcblx0XHR9XG5cblx0XHRyZXR1cm4gY3JlYXRlRGVidWcuY29sb3JzW01hdGguYWJzKGhhc2gpICUgY3JlYXRlRGVidWcuY29sb3JzLmxlbmd0aF07XG5cdH1cblx0Y3JlYXRlRGVidWcuc2VsZWN0Q29sb3IgPSBzZWxlY3RDb2xvcjtcblxuXHQvKipcblx0KiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblx0XHRsZXQgcHJldlRpbWU7XG5cdFx0bGV0IGVuYWJsZU92ZXJyaWRlID0gbnVsbDtcblx0XHRsZXQgbmFtZXNwYWNlc0NhY2hlO1xuXHRcdGxldCBlbmFibGVkQ2FjaGU7XG5cblx0XHRmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG5cdFx0XHQvLyBEaXNhYmxlZD9cblx0XHRcdGlmICghZGVidWcuZW5hYmxlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNlbGYgPSBkZWJ1ZztcblxuXHRcdFx0Ly8gU2V0IGBkaWZmYCB0aW1lc3RhbXBcblx0XHRcdGNvbnN0IGN1cnIgPSBOdW1iZXIobmV3IERhdGUoKSk7XG5cdFx0XHRjb25zdCBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG5cdFx0XHRzZWxmLmRpZmYgPSBtcztcblx0XHRcdHNlbGYucHJldiA9IHByZXZUaW1lO1xuXHRcdFx0c2VsZi5jdXJyID0gY3Vycjtcblx0XHRcdHByZXZUaW1lID0gY3VycjtcblxuXHRcdFx0YXJnc1swXSA9IGNyZWF0ZURlYnVnLmNvZXJjZShhcmdzWzBdKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdFx0XHRhcmdzLnVuc2hpZnQoJyVPJyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0YXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIChtYXRjaCwgZm9ybWF0KSA9PiB7XG5cdFx0XHRcdC8vIElmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcblx0XHRcdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuICclJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZXIgPSBjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cdFx0XHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gYXJnc1tpbmRleF07XG5cdFx0XHRcdFx0bWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG5cdFx0XHRcdFx0Ly8gTm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuXHRcdFx0XHRcdGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdFx0XHRpbmRleC0tO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtYXRjaDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuXHRcdFx0Y3JlYXRlRGVidWcuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG5cdFx0XHRjb25zdCBsb2dGbiA9IHNlbGYubG9nIHx8IGNyZWF0ZURlYnVnLmxvZztcblx0XHRcdGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdH1cblxuXHRcdGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblx0XHRkZWJ1Zy51c2VDb2xvcnMgPSBjcmVhdGVEZWJ1Zy51c2VDb2xvcnMoKTtcblx0XHRkZWJ1Zy5jb2xvciA9IGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cdFx0ZGVidWcuZXh0ZW5kID0gZXh0ZW5kO1xuXHRcdGRlYnVnLmRlc3Ryb3kgPSBjcmVhdGVEZWJ1Zy5kZXN0cm95OyAvLyBYWFggVGVtcG9yYXJ5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWJ1ZywgJ2VuYWJsZWQnLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoZW5hYmxlT3ZlcnJpZGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW5hYmxlT3ZlcnJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5hbWVzcGFjZXNDYWNoZSAhPT0gY3JlYXRlRGVidWcubmFtZXNwYWNlcykge1xuXHRcdFx0XHRcdG5hbWVzcGFjZXNDYWNoZSA9IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXM7XG5cdFx0XHRcdFx0ZW5hYmxlZENhY2hlID0gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVuYWJsZWRDYWNoZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cdFx0Y3JlYXRlRGVidWcubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zbGljZSgxKSArICckJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLm1hcCh0b05hbWVzcGFjZSksXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5za2lwcy5tYXAodG9OYW1lc3BhY2UpLm1hcChuYW1lc3BhY2UgPT4gJy0nICsgbmFtZXNwYWNlKVxuXHRcdF0uam9pbignLCcpO1xuXHRcdGNyZWF0ZURlYnVnLmVuYWJsZSgnJyk7XG5cdFx0cmV0dXJuIG5hbWVzcGFjZXM7XG5cdH1cblxuXHQvKipcblx0KiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHQqIEByZXR1cm4ge0Jvb2xlYW59XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG5cdFx0aWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRsZXQgaTtcblx0XHRsZXQgbGVuO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCogQ29udmVydCByZWdleHAgdG8gbmFtZXNwYWNlXG5cdCpcblx0KiBAcGFyYW0ge1JlZ0V4cH0gcmVneGVwXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gdG9OYW1lc3BhY2UocmVnZXhwKSB7XG5cdFx0cmV0dXJuIHJlZ2V4cC50b1N0cmluZygpXG5cdFx0XHQuc3Vic3RyaW5nKDIsIHJlZ2V4cC50b1N0cmluZygpLmxlbmd0aCAtIDIpXG5cdFx0XHQucmVwbGFjZSgvXFwuXFwqXFw/JC8sICcqJyk7XG5cdH1cblxuXHQvKipcblx0KiBDb2VyY2UgYHZhbGAuXG5cdCpcblx0KiBAcGFyYW0ge01peGVkfSB2YWxcblx0KiBAcmV0dXJuIHtNaXhlZH1cblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0cmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxuXG5cdC8qKlxuXHQqIFhYWCBETyBOT1QgVVNFLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0dWIgZnVuY3Rpb24uXG5cdCogWFhYIEl0IFdJTEwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXHQqL1xuXHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHR9XG5cblx0Y3JlYXRlRGVidWcuZW5hYmxlKGNyZWF0ZURlYnVnLmxvYWQoKSk7XG5cblx0cmV0dXJuIGNyZWF0ZURlYnVnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHVwO1xuIiwiLyoqXG4gKiBEZXRlY3QgRWxlY3Ryb24gcmVuZGVyZXIgLyBud2pzIHByb2Nlc3MsIHdoaWNoIGlzIG5vZGUsIGJ1dCB3ZSBzaG91bGRcbiAqIHRyZWF0IGFzIGEgYnJvd3Nlci5cbiAqL1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8IHByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCBwcm9jZXNzLmJyb3dzZXIgPT09IHRydWUgfHwgcHJvY2Vzcy5fX253anMpIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Jyb3dzZXIuanMnKTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9ub2RlLmpzJyk7XG59XG4iLCIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxuY29uc3QgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5kZXN0cm95ID0gdXRpbC5kZXByZWNhdGUoXG5cdCgpID0+IHt9LFxuXHQnSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLidcbik7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gWzYsIDIsIDMsIDQsIDUsIDFdO1xuXG50cnkge1xuXHQvLyBPcHRpb25hbCBkZXBlbmRlbmN5IChhcyBpbiwgZG9lc24ndCBuZWVkIHRvIGJlIGluc3RhbGxlZCwgTk9UIGxpa2Ugb3B0aW9uYWxEZXBlbmRlbmNpZXMgaW4gcGFja2FnZS5qc29uKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5cdGNvbnN0IHN1cHBvcnRzQ29sb3IgPSByZXF1aXJlKCdzdXBwb3J0cy1jb2xvcicpO1xuXG5cdGlmIChzdXBwb3J0c0NvbG9yICYmIChzdXBwb3J0c0NvbG9yLnN0ZGVyciB8fCBzdXBwb3J0c0NvbG9yKS5sZXZlbCA+PSAyKSB7XG5cdFx0ZXhwb3J0cy5jb2xvcnMgPSBbXG5cdFx0XHQyMCxcblx0XHRcdDIxLFxuXHRcdFx0MjYsXG5cdFx0XHQyNyxcblx0XHRcdDMyLFxuXHRcdFx0MzMsXG5cdFx0XHQzOCxcblx0XHRcdDM5LFxuXHRcdFx0NDAsXG5cdFx0XHQ0MSxcblx0XHRcdDQyLFxuXHRcdFx0NDMsXG5cdFx0XHQ0NCxcblx0XHRcdDQ1LFxuXHRcdFx0NTYsXG5cdFx0XHQ1Nyxcblx0XHRcdDYyLFxuXHRcdFx0NjMsXG5cdFx0XHQ2OCxcblx0XHRcdDY5LFxuXHRcdFx0NzQsXG5cdFx0XHQ3NSxcblx0XHRcdDc2LFxuXHRcdFx0NzcsXG5cdFx0XHQ3OCxcblx0XHRcdDc5LFxuXHRcdFx0ODAsXG5cdFx0XHQ4MSxcblx0XHRcdDkyLFxuXHRcdFx0OTMsXG5cdFx0XHQ5OCxcblx0XHRcdDk5LFxuXHRcdFx0MTEyLFxuXHRcdFx0MTEzLFxuXHRcdFx0MTI4LFxuXHRcdFx0MTI5LFxuXHRcdFx0MTM0LFxuXHRcdFx0MTM1LFxuXHRcdFx0MTQ4LFxuXHRcdFx0MTQ5LFxuXHRcdFx0MTYwLFxuXHRcdFx0MTYxLFxuXHRcdFx0MTYyLFxuXHRcdFx0MTYzLFxuXHRcdFx0MTY0LFxuXHRcdFx0MTY1LFxuXHRcdFx0MTY2LFxuXHRcdFx0MTY3LFxuXHRcdFx0MTY4LFxuXHRcdFx0MTY5LFxuXHRcdFx0MTcwLFxuXHRcdFx0MTcxLFxuXHRcdFx0MTcyLFxuXHRcdFx0MTczLFxuXHRcdFx0MTc4LFxuXHRcdFx0MTc5LFxuXHRcdFx0MTg0LFxuXHRcdFx0MTg1LFxuXHRcdFx0MTk2LFxuXHRcdFx0MTk3LFxuXHRcdFx0MTk4LFxuXHRcdFx0MTk5LFxuXHRcdFx0MjAwLFxuXHRcdFx0MjAxLFxuXHRcdFx0MjAyLFxuXHRcdFx0MjAzLFxuXHRcdFx0MjA0LFxuXHRcdFx0MjA1LFxuXHRcdFx0MjA2LFxuXHRcdFx0MjA3LFxuXHRcdFx0MjA4LFxuXHRcdFx0MjA5LFxuXHRcdFx0MjE0LFxuXHRcdFx0MjE1LFxuXHRcdFx0MjIwLFxuXHRcdFx0MjIxXG5cdFx0XTtcblx0fVxufSBjYXRjaCAoZXJyb3IpIHtcblx0Ly8gU3dhbGxvdyAtIHdlIG9ubHkgY2FyZSBpZiBgc3VwcG9ydHMtY29sb3JgIGlzIGF2YWlsYWJsZTsgaXQgZG9lc24ndCBoYXZlIHRvIGJlLlxufVxuXG4vKipcbiAqIEJ1aWxkIHVwIHRoZSBkZWZhdWx0IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiAgICQgREVCVUdfQ09MT1JTPW5vIERFQlVHX0RFUFRIPTEwIERFQlVHX1NIT1dfSElEREVOPWVuYWJsZWQgbm9kZSBzY3JpcHQuanNcbiAqL1xuXG5leHBvcnRzLmluc3BlY3RPcHRzID0gT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmZpbHRlcihrZXkgPT4ge1xuXHRyZXR1cm4gL15kZWJ1Z18vaS50ZXN0KGtleSk7XG59KS5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XG5cdC8vIENhbWVsLWNhc2Vcblx0Y29uc3QgcHJvcCA9IGtleVxuXHRcdC5zdWJzdHJpbmcoNilcblx0XHQudG9Mb3dlckNhc2UoKVxuXHRcdC5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgaykgPT4ge1xuXHRcdFx0cmV0dXJuIGsudG9VcHBlckNhc2UoKTtcblx0XHR9KTtcblxuXHQvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlIGludG8gSlMgdmFsdWVcblx0bGV0IHZhbCA9IHByb2Nlc3MuZW52W2tleV07XG5cdGlmICgvXih5ZXN8b258dHJ1ZXxlbmFibGVkKSQvaS50ZXN0KHZhbCkpIHtcblx0XHR2YWwgPSB0cnVlO1xuXHR9IGVsc2UgaWYgKC9eKG5vfG9mZnxmYWxzZXxkaXNhYmxlZCkkL2kudGVzdCh2YWwpKSB7XG5cdFx0dmFsID0gZmFsc2U7XG5cdH0gZWxzZSBpZiAodmFsID09PSAnbnVsbCcpIHtcblx0XHR2YWwgPSBudWxsO1xuXHR9IGVsc2Uge1xuXHRcdHZhbCA9IE51bWJlcih2YWwpO1xuXHR9XG5cblx0b2JqW3Byb3BdID0gdmFsO1xuXHRyZXR1cm4gb2JqO1xufSwge30pO1xuXG4vKipcbiAqIElzIHN0ZG91dCBhIFRUWT8gQ29sb3JlZCBvdXRwdXQgaXMgZW5hYmxlZCB3aGVuIGB0cnVlYC5cbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdHJldHVybiAnY29sb3JzJyBpbiBleHBvcnRzLmluc3BlY3RPcHRzID9cblx0XHRCb29sZWFuKGV4cG9ydHMuaW5zcGVjdE9wdHMuY29sb3JzKSA6XG5cdFx0dHR5LmlzYXR0eShwcm9jZXNzLnN0ZGVyci5mZCk7XG59XG5cbi8qKlxuICogQWRkcyBBTlNJIGNvbG9yIGVzY2FwZSBjb2RlcyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdGNvbnN0IHtuYW1lc3BhY2U6IG5hbWUsIHVzZUNvbG9yc30gPSB0aGlzO1xuXG5cdGlmICh1c2VDb2xvcnMpIHtcblx0XHRjb25zdCBjID0gdGhpcy5jb2xvcjtcblx0XHRjb25zdCBjb2xvckNvZGUgPSAnXFx1MDAxQlszJyArIChjIDwgOCA/IGMgOiAnODs1OycgKyBjKTtcblx0XHRjb25zdCBwcmVmaXggPSBgICAke2NvbG9yQ29kZX07MW0ke25hbWV9IFxcdTAwMUJbMG1gO1xuXG5cdFx0YXJnc1swXSA9IHByZWZpeCArIGFyZ3NbMF0uc3BsaXQoJ1xcbicpLmpvaW4oJ1xcbicgKyBwcmVmaXgpO1xuXHRcdGFyZ3MucHVzaChjb2xvckNvZGUgKyAnbSsnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKSArICdcXHUwMDFCWzBtJyk7XG5cdH0gZWxzZSB7XG5cdFx0YXJnc1swXSA9IGdldERhdGUoKSArIG5hbWUgKyAnICcgKyBhcmdzWzBdO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldERhdGUoKSB7XG5cdGlmIChleHBvcnRzLmluc3BlY3RPcHRzLmhpZGVEYXRlKSB7XG5cdFx0cmV0dXJuICcnO1xuXHR9XG5cdHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgKyAnICc7XG59XG5cbi8qKlxuICogSW52b2tlcyBgdXRpbC5mb3JtYXQoKWAgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBhbmQgd3JpdGVzIHRvIHN0ZGVyci5cbiAqL1xuXG5mdW5jdGlvbiBsb2coLi4uYXJncykge1xuXHRyZXR1cm4gcHJvY2Vzcy5zdGRlcnIud3JpdGUodXRpbC5mb3JtYXQoLi4uYXJncykgKyAnXFxuJyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcblx0aWYgKG5hbWVzcGFjZXMpIHtcblx0XHRwcm9jZXNzLmVudi5ERUJVRyA9IG5hbWVzcGFjZXM7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSWYgeW91IHNldCBhIHByb2Nlc3MuZW52IGZpZWxkIHRvIG51bGwgb3IgdW5kZWZpbmVkLCBpdCBnZXRzIGNhc3QgdG8gdGhlXG5cdFx0Ly8gc3RyaW5nICdudWxsJyBvciAndW5kZWZpbmVkJy4gSnVzdCBkZWxldGUgaW5zdGVhZC5cblx0XHRkZWxldGUgcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRyZXR1cm4gcHJvY2Vzcy5lbnYuREVCVUc7XG59XG5cbi8qKlxuICogSW5pdCBsb2dpYyBmb3IgYGRlYnVnYCBpbnN0YW5jZXMuXG4gKlxuICogQ3JlYXRlIGEgbmV3IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGluIGNhc2UgYHVzZUNvbG9yc2AgaXMgc2V0XG4gKiBkaWZmZXJlbnRseSBmb3IgYSBwYXJ0aWN1bGFyIGBkZWJ1Z2AgaW5zdGFuY2UuXG4gKi9cblxuZnVuY3Rpb24gaW5pdChkZWJ1Zykge1xuXHRkZWJ1Zy5pbnNwZWN0T3B0cyA9IHt9O1xuXG5cdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhleHBvcnRzLmluc3BlY3RPcHRzKTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0ZGVidWcuaW5zcGVjdE9wdHNba2V5c1tpXV0gPSBleHBvcnRzLmluc3BlY3RPcHRzW2tleXNbaV1dO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9jb21tb24nKShleHBvcnRzKTtcblxuY29uc3Qge2Zvcm1hdHRlcnN9ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogTWFwICVvIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbCBvbiBhIHNpbmdsZSBsaW5lLlxuICovXG5cbmZvcm1hdHRlcnMubyA9IGZ1bmN0aW9uICh2KSB7XG5cdHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cdHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cylcblx0XHQuc3BsaXQoJ1xcbicpXG5cdFx0Lm1hcChzdHIgPT4gc3RyLnRyaW0oKSlcblx0XHQuam9pbignICcpO1xufTtcblxuLyoqXG4gKiBNYXAgJU8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsb3dpbmcgbXVsdGlwbGUgbGluZXMgaWYgbmVlZGVkLlxuICovXG5cbmZvcm1hdHRlcnMuTyA9IGZ1bmN0aW9uICh2KSB7XG5cdHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cdHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cyk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmF3YWl0RWFjaFlpZWxkZWRQcm9taXNlID0gZXhwb3J0cy5tYXliZUFzeW5jID0gZXhwb3J0cy5tYXliZUFzeW5jRm4gPSB2b2lkIDA7XG5mdW5jdGlvbiogYXdhaXRZaWVsZCh2YWx1ZSkge1xuICAgIHJldHVybiAoeWllbGQgdmFsdWUpO1xufVxuZnVuY3Rpb24gYXdhaXRZaWVsZE9mKGdlbmVyYXRvcikge1xuICAgIHJldHVybiBhd2FpdFlpZWxkKGF3YWl0RWFjaFlpZWxkZWRQcm9taXNlKGdlbmVyYXRvcikpO1xufVxuY29uc3QgQXdhaXRZaWVsZCA9IGF3YWl0WWllbGQ7XG5Bd2FpdFlpZWxkLm9mID0gYXdhaXRZaWVsZE9mO1xuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB0aGF0IG1heSBvciBtYXkgbm90IGJlIGFzeW5jLCB1c2luZyBhIGdlbmVyYXRvclxuICpcbiAqIFdpdGhpbiB0aGUgZ2VuZXJhdG9yLCBjYWxsIGB5aWVsZCogYXdhaXRlZChtYXliZVByb21pc2UpYCB0byBhd2FpdCBhIHZhbHVlXG4gKiB0aGF0IG1heSBvciBtYXkgbm90IGJlIGEgcHJvbWlzZS5cbiAqXG4gKiBJZiB0aGUgaW5uZXIgZnVuY3Rpb24gbmV2ZXIgeWllbGRzIGEgcHJvbWlzZSwgaXQgd2lsbCByZXR1cm4gc3luY2hyb25vdXNseS5cbiAqL1xuZnVuY3Rpb24gbWF5YmVBc3luY0ZuKHRoYXQsIGZuKSB7XG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRvciA9IGZuLmNhbGwodGhhdCwgQXdhaXRZaWVsZCwgLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBhd2FpdEVhY2hZaWVsZGVkUHJvbWlzZShnZW5lcmF0b3IpO1xuICAgIH07XG59XG5leHBvcnRzLm1heWJlQXN5bmNGbiA9IG1heWJlQXN5bmNGbjtcbmNsYXNzIEV4YW1wbGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm1heWJlQXN5bmNNZXRob2QgPSBtYXliZUFzeW5jRm4odGhpcywgZnVuY3Rpb24qIChhd2FpdGVkLCBhKSB7XG4gICAgICAgICAgICB5aWVsZCogYXdhaXRlZChuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBhKSkpO1xuICAgICAgICAgICAgcmV0dXJuIDU7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1heWJlQXN5bmModGhhdCwgc3RhcnRHZW5lcmF0b3IpIHtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBzdGFydEdlbmVyYXRvci5jYWxsKHRoYXQsIEF3YWl0WWllbGQpO1xuICAgIHJldHVybiBhd2FpdEVhY2hZaWVsZGVkUHJvbWlzZShnZW5lcmF0b3IpO1xufVxuZXhwb3J0cy5tYXliZUFzeW5jID0gbWF5YmVBc3luYztcbmZ1bmN0aW9uIGF3YWl0RWFjaFlpZWxkZWRQcm9taXNlKGdlbikge1xuICAgIGZ1bmN0aW9uIGhhbmRsZU5leHRTdGVwKHN0ZXApIHtcbiAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXAudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZXAudmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RlcC52YWx1ZS50aGVuKCh2YWx1ZSkgPT4gaGFuZGxlTmV4dFN0ZXAoZ2VuLm5leHQodmFsdWUpKSwgKGVycm9yKSA9PiBoYW5kbGVOZXh0U3RlcChnZW4udGhyb3coZXJyb3IpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZU5leHRTdGVwKGdlbi5uZXh0KHN0ZXAudmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhbmRsZU5leHRTdGVwKGdlbi5uZXh0KCkpO1xufVxuZXhwb3J0cy5hd2FpdEVhY2hZaWVsZGVkUHJvbWlzZSA9IGF3YWl0RWFjaFlpZWxkZWRQcm9taXNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXN5bmNpZnktaGVscGVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU0FzeW5jQ29udGV4dCA9IHZvaWQgMDtcbmNvbnN0IGNvbnRleHRfMSA9IHJlcXVpcmUoXCIuL2NvbnRleHRcIik7XG5jb25zdCBkZWJ1Z18xID0gcmVxdWlyZShcIi4vZGVidWdcIik7XG5jb25zdCB0eXBlc18xID0gcmVxdWlyZShcIi4vdHlwZXNcIik7XG4vKipcbiAqIEFzeW5jaWZpZWQgdmVyc2lvbiBvZiBbW1F1aWNrSlNDb250ZXh0XV0uXG4gKlxuICogKkFzeW5jaWZ5KiBhbGxvd3Mgbm9ybWFsbHkgc3luY2hyb25vdXMgY29kZSB0byB3YWl0IGZvciBhc3luY2hyb25vdXMgUHJvbWlzZXNcbiAqIG9yIGNhbGxiYWNrcy4gVGhlIGFzeW5jaWZpZWQgdmVyc2lvbiBvZiBRdWlja0pTQ29udGV4dCBjYW4gd2FpdCBmb3IgYXN5bmNcbiAqIGhvc3QgZnVuY3Rpb25zIGFzIHRob3VnaCB0aGV5IHdlcmUgc3luY2hyb25vdXMuXG4gKi9cbmNsYXNzIFF1aWNrSlNBc3luY0NvbnRleHQgZXh0ZW5kcyBjb250ZXh0XzEuUXVpY2tKU0NvbnRleHQge1xuICAgIC8qKlxuICAgICAqIEFzeW5jaWZpZWQgdmVyc2lvbiBvZiBbW2V2YWxDb2RlXV0uXG4gICAgICovXG4gICAgYXN5bmMgZXZhbENvZGVBc3luYyhjb2RlLCBmaWxlbmFtZSA9IFwiZXZhbC5qc1wiLCBcbiAgICAvKiogU2VlIFtbRXZhbEZsYWdzXV0gZm9yIG51bWJlciBzZW1hbnRpY3MgKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGRldGVjdE1vZHVsZSA9IChvcHRpb25zID09PSB1bmRlZmluZWQgPyAxIDogMCk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gKDAsIHR5cGVzXzEuZXZhbE9wdGlvbnNUb0ZsYWdzKShvcHRpb25zKTtcbiAgICAgICAgbGV0IHJlc3VsdFB0ciA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHRQdHIgPSBhd2FpdCB0aGlzLm1lbW9yeVxuICAgICAgICAgICAgICAgIC5uZXdIZWFwQ2hhclBvaW50ZXIoY29kZSlcbiAgICAgICAgICAgICAgICAuY29uc3VtZSgoY2hhckhhbmRsZSkgPT4gdGhpcy5mZmkuUVRTX0V2YWxfTWF5YmVBc3luYyh0aGlzLmN0eC52YWx1ZSwgY2hhckhhbmRsZS52YWx1ZSwgZmlsZW5hbWUsIGRldGVjdE1vZHVsZSwgZmxhZ3MpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICgwLCBkZWJ1Z18xLmRlYnVnTG9nKShcIlFUU19FdmFsX01heWJlQXN5bmMgdGhyZXdcIiwgZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXJyb3JQdHIgPSB0aGlzLmZmaS5RVFNfUmVzb2x2ZUV4Y2VwdGlvbih0aGlzLmN0eC52YWx1ZSwgcmVzdWx0UHRyKTtcbiAgICAgICAgaWYgKGVycm9yUHRyKSB7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZVZhbHVlUG9pbnRlcih0aGlzLmN0eC52YWx1ZSwgcmVzdWx0UHRyKTtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUoZXJyb3JQdHIpIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShyZXN1bHRQdHIpIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbWlsYXIgdG8gW1tuZXdGdW5jdGlvbl1dLlxuICAgICAqIENvbnZlcnQgYW4gYXN5bmMgaG9zdCBKYXZhc2NyaXB0IGZ1bmN0aW9uIGludG8gYSBzeW5jaHJvbm91cyBRdWlja0pTIGZ1bmN0aW9uIHZhbHVlLlxuICAgICAqXG4gICAgICogV2hlbmV2ZXIgUXVpY2tKUyBjYWxscyB0aGlzIGZ1bmN0aW9uLCB0aGUgVk0ncyBzdGFjayB3aWxsIGJlIHVud291bmQgd2hpbGVcbiAgICAgKiB3YWl0aW5nIHRoZSBhc3luYyBmdW5jdGlvbiB0byBjb21wbGV0ZSwgYW5kIHRoZW4gcmVzdG9yZWQgd2hlbiB0aGUgcmV0dXJuZWRcbiAgICAgKiBwcm9taXNlIHJlc29sdmVzLlxuICAgICAqXG4gICAgICogQXN5bmNpZmllZCBmdW5jdGlvbnMgbXVzdCBuZXZlciBjYWxsIG90aGVyIGFzeW5jaWZpZWQgZnVuY3Rpb25zIG9yXG4gICAgICogYGltcG9ydGAsIGV2ZW4gaW5kaXJlY3RseSwgYmVjYXVzZSB0aGUgc3RhY2sgY2Fubm90IGJlIHVud291bmQgdHdpY2UuXG4gICAgICpcbiAgICAgKiBTZWUgW0Vtc2NyaXB0ZW4ncyBkb2NzIG9uIEFzeW5jaWZ5XShodHRwczovL2Vtc2NyaXB0ZW4ub3JnL2RvY3MvcG9ydGluZy9hc3luY2lmeS5odG1sKS5cbiAgICAgKi9cbiAgICBuZXdBc3luY2lmaWVkRnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3RnVuY3Rpb24obmFtZSwgZm4pO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU0FzeW5jQ29udGV4dCA9IFF1aWNrSlNBc3luY0NvbnRleHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb250ZXh0LWFzeW5jaWZ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWlja0pTQ29udGV4dCA9IHZvaWQgMDtcbmNvbnN0IGRlYnVnXzEgPSByZXF1aXJlKFwiLi9kZWJ1Z1wiKTtcbmNvbnN0IGRlZmVycmVkX3Byb21pc2VfMSA9IHJlcXVpcmUoXCIuL2RlZmVycmVkLXByb21pc2VcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuL2Vycm9yc1wiKTtcbmNvbnN0IGxpZmV0aW1lXzEgPSByZXF1aXJlKFwiLi9saWZldGltZVwiKTtcbmNvbnN0IG1lbW9yeV8xID0gcmVxdWlyZShcIi4vbWVtb3J5XCIpO1xuY29uc3QgdHlwZXNfMSA9IHJlcXVpcmUoXCIuL3R5cGVzXCIpO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDb250ZXh0TWVtb3J5IGV4dGVuZHMgbWVtb3J5XzEuTW9kdWxlTWVtb3J5IHtcbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIHN1cGVyKGFyZ3MubW9kdWxlKTtcbiAgICAgICAgdGhpcy5zY29wZSA9IG5ldyBsaWZldGltZV8xLlNjb3BlKCk7XG4gICAgICAgIHRoaXMuY29weUpTVmFsdWUgPSAocHRyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mZmkuUVRTX0R1cFZhbHVlUG9pbnRlcih0aGlzLmN0eC52YWx1ZSwgcHRyKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mcmVlSlNWYWx1ZSA9IChwdHIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmZpLlFUU19GcmVlVmFsdWVQb2ludGVyKHRoaXMuY3R4LnZhbHVlLCBwdHIpO1xuICAgICAgICB9O1xuICAgICAgICBhcmdzLm93bmVkTGlmZXRpbWVzPy5mb3JFYWNoKChsaWZldGltZSkgPT4gdGhpcy5zY29wZS5tYW5hZ2UobGlmZXRpbWUpKTtcbiAgICAgICAgdGhpcy5vd25lciA9IGFyZ3Mub3duZXI7XG4gICAgICAgIHRoaXMubW9kdWxlID0gYXJncy5tb2R1bGU7XG4gICAgICAgIHRoaXMuZmZpID0gYXJncy5mZmk7XG4gICAgICAgIHRoaXMucnQgPSBhcmdzLnJ0O1xuICAgICAgICB0aGlzLmN0eCA9IHRoaXMuc2NvcGUubWFuYWdlKGFyZ3MuY3R4KTtcbiAgICB9XG4gICAgZ2V0IGFsaXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZS5hbGl2ZTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGUuZGlzcG9zZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmFjayBgbGlmZXRpbWVgIHNvIHRoYXQgaXQgaXMgZGlzcG9zZWQgd2hlbiB0aGlzIHNjb3BlIGlzIGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIG1hbmFnZShsaWZldGltZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZS5tYW5hZ2UobGlmZXRpbWUpO1xuICAgIH1cbiAgICBjb25zdW1lSlNDaGFyUG9pbnRlcihwdHIpIHtcbiAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5tb2R1bGUuVVRGOFRvU3RyaW5nKHB0cik7XG4gICAgICAgIHRoaXMuZmZpLlFUU19GcmVlQ1N0cmluZyh0aGlzLmN0eC52YWx1ZSwgcHRyKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgaGVhcFZhbHVlSGFuZGxlKHB0cikge1xuICAgICAgICByZXR1cm4gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUocHRyLCB0aGlzLmNvcHlKU1ZhbHVlLCB0aGlzLmZyZWVKU1ZhbHVlLCB0aGlzLm93bmVyKTtcbiAgICB9XG59XG4vKipcbiAqIFF1aWNrSlNDb250ZXh0IHdyYXBzIGEgUXVpY2tKUyBKYXZhc2NyaXB0IGNvbnRleHQgKEpTQ29udGV4dCopIHdpdGhpbiBhXG4gKiBydW50aW1lLiBUaGUgY29udGV4dHMgd2l0aGluIHRoZSBzYW1lIHJ1bnRpbWUgbWF5IGV4Y2hhbmdlIG9iamVjdHMgZnJlZWx5LlxuICogWW91IGNhbiB0aGluayBvZiBzZXBhcmF0ZSBydW50aW1lcyBsaWtlIGRpZmZlcmVudCBkb21haW5zIGluIGEgYnJvd3NlciwgYW5kXG4gKiB0aGUgY29udGV4dHMgd2l0aGluIGEgcnVudGltZSBsaWtlIHRoZSBkaWZmZXJlbnQgd2luZG93cyBvcGVuIHRvIHRoZSBzYW1lXG4gKiBkb21haW4uIFRoZSB7QGxpbmsgcnVudGltZX0gcmVmZXJlbmNlcyB0aGUgY29udGV4dCdzIHJ1bnRpbWUuXG4gKlxuICogVGhpcyBjbGFzcydzIG1ldGhvZHMgcmV0dXJuIHtAbGluayBRdWlja0pTSGFuZGxlfSwgd2hpY2ggd3JhcCBDIHBvaW50ZXJzIChKU1ZhbHVlKikuXG4gKiBJdCdzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBjYWxsIGAuZGlzcG9zZSgpYCBvbiBhbnlcbiAqIGhhbmRsZXMgeW91IGNyZWF0ZSB0byBmcmVlIG1lbW9yeSBvbmNlIHlvdSdyZSBkb25lIHdpdGggdGhlIGhhbmRsZS5cbiAqXG4gKiBVc2Uge0BsaW5rIFF1aWNrSlNSdW50aW1lLm5ld0NvbnRleHR9IG9yIHtAbGluayBRdWlja0pTV0FTTU1vZHVsZS5uZXdDb250ZXh0fVxuICogdG8gY3JlYXRlIGEgbmV3IFF1aWNrSlNDb250ZXh0LlxuICpcbiAqIENyZWF0ZSBRdWlja0pTIHZhbHVlcyBpbnNpZGUgdGhlIGludGVycHJldGVyIHdpdGggbWV0aG9kcyBsaWtlXG4gKiBbW25ld051bWJlcl1dLCBbW25ld1N0cmluZ11dLCBbW25ld0FycmF5XV0sIFtbbmV3T2JqZWN0XV0sXG4gKiBbW25ld0Z1bmN0aW9uXV0sIGFuZCBbW25ld1Byb21pc2VdXS5cbiAqXG4gKiBDYWxsIFtbc2V0UHJvcF1dIG9yIFtbZGVmaW5lUHJvcF1dIHRvIGN1c3RvbWl6ZSBvYmplY3RzLiBVc2UgdGhvc2UgbWV0aG9kc1xuICogd2l0aCBbW2dsb2JhbF1dIHRvIGV4cG9zZSB0aGUgdmFsdWVzIHlvdSBjcmVhdGUgdG8gdGhlIGludGVyaW9yIG9mIHRoZVxuICogaW50ZXJwcmV0ZXIsIHNvIHRoZXkgY2FuIGJlIHVzZWQgaW4gW1tldmFsQ29kZV1dLlxuICpcbiAqIFVzZSBbW2V2YWxDb2RlXV0gb3IgW1tjYWxsRnVuY3Rpb25dXSB0byBleGVjdXRlIEphdmFzY3JpcHQgaW5zaWRlIHRoZSBWTS4gSWZcbiAqIHlvdSdyZSB1c2luZyBhc3luY2hyb25vdXMgY29kZSBpbnNpZGUgdGhlIFF1aWNrSlNDb250ZXh0LCB5b3UgbWF5IG5lZWQgdG8gYWxzb1xuICogY2FsbCBbW2V4ZWN1dGVQZW5kaW5nSm9ic11dLiBFeGVjdXRpbmcgY29kZSBpbnNpZGUgdGhlIHJ1bnRpbWUgcmV0dXJucyBhXG4gKiByZXN1bHQgb2JqZWN0IHJlcHJlc2VudGluZyBzdWNjZXNzZnVsIGV4ZWN1dGlvbiBvciBhbiBlcnJvci4gWW91IG11c3QgZGlzcG9zZVxuICogb2YgYW55IHN1Y2ggcmVzdWx0cyB0byBhdm9pZCBsZWFraW5nIG1lbW9yeSBpbnNpZGUgdGhlIFZNLlxuICpcbiAqIEltcGxlbWVudCBtZW1vcnkgYW5kIENQVSBjb25zdHJhaW50cyBhdCB0aGUgcnVudGltZSBsZXZlbCwgdXNpbmcgW1tydW50aW1lXV0uXG4gKiBTZWUge0BsaW5rIFF1aWNrSlNSdW50aW1lfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKi9cbi8vIFRPRE86IE1hbmFnZSBvd24gY2FsbGJhY2sgcmVnaXN0cmF0aW9uXG5jbGFzcyBRdWlja0pTQ29udGV4dCB7XG4gICAgLyoqXG4gICAgICogVXNlIHtAbGluayBRdWlja0pTLmNyZWF0ZVZtfSB0byBjcmVhdGUgYSBRdWlja0pTQ29udGV4dCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLl91bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLl9udWxsID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5fZmFsc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLl90cnVlID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5fZ2xvYmFsID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5fQmlnSW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5mbk5leHRJZCA9IC0zMjc2ODsgLy8gbWluIHZhbHVlIG9mIHNpZ25lZCAxNmJpdCBpbnQgdXNlZCBieSBRdWlja2pzXG4gICAgICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmZuTWFwcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBoaWRkZW5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY1RvSG9zdENhbGxiYWNrcyA9IHtcbiAgICAgICAgICAgIGNhbGxGdW5jdGlvbjogKGN0eCwgdGhpc19wdHIsIGFyZ2MsIGFyZ3YsIGZuX2lkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN0eCAhPT0gdGhpcy5jdHgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUXVpY2tKU0NvbnRleHQgaW5zdGFuY2UgcmVjZWl2ZWQgQyAtPiBKUyBjYWxsIHdpdGggbWlzbWF0Y2hlZCBjdHhcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZuID0gdGhpcy5nZXRGdW5jdGlvbihmbl9pZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFmbikge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIFwidGhyb3dcIiBpcyBub3QgY2F0Y2gtYWJsZSBmcm9tIHRoZSBUUyBzaWRlLiBjb3VsZCB3ZSBzb21laG93IGhhbmRsZSB0aGlzIGhpZ2hlciB1cD9cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWlja0pTQ29udGV4dCBoYWQgbm8gY2FsbGJhY2sgd2l0aCBpZCAke2ZuX2lkfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbGlmZXRpbWVfMS5TY29wZS53aXRoU2NvcGVNYXliZUFzeW5jKHRoaXMsIGZ1bmN0aW9uKiAoYXdhaXRlZCwgc2NvcGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGhpc0hhbmRsZSA9IHNjb3BlLm1hbmFnZShuZXcgbGlmZXRpbWVfMS5XZWFrTGlmZXRpbWUodGhpc19wdHIsIHRoaXMubWVtb3J5LmNvcHlKU1ZhbHVlLCB0aGlzLm1lbW9yeS5mcmVlSlNWYWx1ZSwgdGhpcy5ydW50aW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ0hhbmRsZXMgPSBuZXcgQXJyYXkoYXJnYyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdHIgPSB0aGlzLmZmaS5RVFNfQXJndkdldEpTVmFsdWVDb25zdFBvaW50ZXIoYXJndiwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdIYW5kbGVzW2ldID0gc2NvcGUubWFuYWdlKG5ldyBsaWZldGltZV8xLldlYWtMaWZldGltZShwdHIsIHRoaXMubWVtb3J5LmNvcHlKU1ZhbHVlLCB0aGlzLm1lbW9yeS5mcmVlSlNWYWx1ZSwgdGhpcy5ydW50aW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkKiBhd2FpdGVkKGZuLmFwcGx5KHRoaXNIYW5kbGUsIGFyZ0hhbmRsZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXCJlcnJvclwiIGluIHJlc3VsdCAmJiByZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwidGhyb3cgZXJyb3JcIiwgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBzY29wZS5tYW5hZ2UocmVzdWx0IGluc3RhbmNlb2YgbGlmZXRpbWVfMS5MaWZldGltZSA/IHJlc3VsdCA6IHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmZpLlFUU19EdXBWYWx1ZVBvaW50ZXIodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yVG9IYW5kbGUoZXJyb3IpLmNvbnN1bWUoKGVycm9ySGFuZGxlKSA9PiB0aGlzLmZmaS5RVFNfVGhyb3codGhpcy5jdHgudmFsdWUsIGVycm9ySGFuZGxlLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucnVudGltZSA9IGFyZ3MucnVudGltZTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBhcmdzLm1vZHVsZTtcbiAgICAgICAgdGhpcy5mZmkgPSBhcmdzLmZmaTtcbiAgICAgICAgdGhpcy5ydCA9IGFyZ3MucnQ7XG4gICAgICAgIHRoaXMuY3R4ID0gYXJncy5jdHg7XG4gICAgICAgIHRoaXMubWVtb3J5ID0gbmV3IENvbnRleHRNZW1vcnkoe1xuICAgICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgICAgIG93bmVyOiB0aGlzLnJ1bnRpbWUsXG4gICAgICAgIH0pO1xuICAgICAgICBhcmdzLmNhbGxiYWNrcy5zZXRDb250ZXh0Q2FsbGJhY2tzKHRoaXMuY3R4LnZhbHVlLCB0aGlzLmNUb0hvc3RDYWxsYmFja3MpO1xuICAgICAgICB0aGlzLmR1bXAgPSB0aGlzLmR1bXAuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5nZXRTdHJpbmcgPSB0aGlzLmdldFN0cmluZy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmdldE51bWJlciA9IHRoaXMuZ2V0TnVtYmVyLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucmVzb2x2ZVByb21pc2UgPSB0aGlzLnJlc29sdmVQcm9taXNlLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIC8vIEBpbXBsZW1lbnQgRGlzcG9zYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZ2V0IGFsaXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkuYWxpdmU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc3Bvc2Ugb2YgdGhpcyBWTSdzIHVuZGVybHlpbmcgcmVzb3VyY2VzLlxuICAgICAqXG4gICAgICogQHRocm93cyBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGhvdXQgZGlzcG9zaW5nIG9mIGFsbCBjcmVhdGVkIGhhbmRsZXNcbiAgICAgKiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLm1lbW9yeS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIC8vIEdsb2JhbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogW2B1bmRlZmluZWRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy91bmRlZmluZWQpLlxuICAgICAqL1xuICAgIGdldCB1bmRlZmluZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl91bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVW5kZWZpbmVkIGlzIGEgY29uc3RhbnQsIGltbXV0YWJsZSB2YWx1ZSBpbiBRdWlja0pTLlxuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLmZmaS5RVFNfR2V0VW5kZWZpbmVkKCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fdW5kZWZpbmVkID0gbmV3IGxpZmV0aW1lXzEuU3RhdGljTGlmZXRpbWUocHRyKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtgbnVsbGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL251bGwpLlxuICAgICAqL1xuICAgIGdldCBudWxsKCkge1xuICAgICAgICBpZiAodGhpcy5fbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX251bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTnVsbCBpcyBhIGNvbnN0YW50LCBpbW11dGFibGUgdmFsdWUgaW4gUXVpY2tKUy5cbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5mZmkuUVRTX0dldE51bGwoKTtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9udWxsID0gbmV3IGxpZmV0aW1lXzEuU3RhdGljTGlmZXRpbWUocHRyKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtgdHJ1ZWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL3RydWUpLlxuICAgICAqL1xuICAgIGdldCB0cnVlKCkge1xuICAgICAgICBpZiAodGhpcy5fdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJ1ZSBpcyBhIGNvbnN0YW50LCBpbW11dGFibGUgdmFsdWUgaW4gUXVpY2tKUy5cbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5mZmkuUVRTX0dldFRydWUoKTtcbiAgICAgICAgcmV0dXJuICh0aGlzLl90cnVlID0gbmV3IGxpZmV0aW1lXzEuU3RhdGljTGlmZXRpbWUocHRyKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtgZmFsc2VgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9mYWxzZSkuXG4gICAgICovXG4gICAgZ2V0IGZhbHNlKCkge1xuICAgICAgICBpZiAodGhpcy5fZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGYWxzZSBpcyBhIGNvbnN0YW50LCBpbW11dGFibGUgdmFsdWUgaW4gUXVpY2tKUy5cbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5mZmkuUVRTX0dldEZhbHNlKCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fZmFsc2UgPSBuZXcgbGlmZXRpbWVfMS5TdGF0aWNMaWZldGltZShwdHIpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogW2BnbG9iYWxgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cykuXG4gICAgICogQSBoYW5kbGUgdG8gdGhlIGdsb2JhbCBvYmplY3QgaW5zaWRlIHRoZSBpbnRlcnByZXRlci5cbiAgICAgKiBZb3UgY2FuIHNldCBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBnbG9iYWwgdmFyaWFibGVzLlxuICAgICAqL1xuICAgIGdldCBnbG9iYWwoKSB7XG4gICAgICAgIGlmICh0aGlzLl9nbG9iYWwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nbG9iYWw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGdsb2JhbCBpcyBhIEpTVmFsdWUsIGJ1dCBzaW5jZSBpdCdzIGxpZmV0aW1lIGlzIGFzIGxvbmcgYXMgdGhlIFZNJ3MsXG4gICAgICAgIC8vIHdlIHNob3VsZCBtYW5hZ2UgaXQuXG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMuZmZpLlFUU19HZXRHbG9iYWxPYmplY3QodGhpcy5jdHgudmFsdWUpO1xuICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGNsZWFuIHVwIHRoaXMgcmVmZXJlbmNlIHdoZW4gd2UgZGlzcG9zZVxuICAgICAgICB0aGlzLm1lbW9yeS5tYW5hZ2UodGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHB0cikpO1xuICAgICAgICAvLyBUaGlzIGlzbid0IHRlY2huaWNhbGx5IGEgc3RhdGljIGxpZmV0aW1lLCBidXQgc2luY2UgaXQgaGFzIHRoZSBzYW1lXG4gICAgICAgIC8vIGxpZmV0aW1lIGFzIHRoZSBWTSwgaXQncyBva2F5IHRvIGZha2Ugb25lIHNpbmNlIHdoZW4gdGhlIFZNIGlzXG4gICAgICAgIC8vIGRpc3Bvc2VkLCBubyBvdGhlciBmdW5jdGlvbnMgd2lsbCBhY2NlcHQgdGhlIHZhbHVlLlxuICAgICAgICB0aGlzLl9nbG9iYWwgPSBuZXcgbGlmZXRpbWVfMS5TdGF0aWNMaWZldGltZShwdHIsIHRoaXMucnVudGltZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9nbG9iYWw7XG4gICAgfVxuICAgIC8vIE5ldyB2YWx1ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSBKYXZhc2NyaXB0IG51bWJlciBpbnRvIGEgUXVpY2tKUyB2YWx1ZS5cbiAgICAgKi9cbiAgICBuZXdOdW1iZXIobnVtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUodGhpcy5mZmkuUVRTX05ld0Zsb2F0NjQodGhpcy5jdHgudmFsdWUsIG51bSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBRdWlja0pTIFtzdHJpbmddKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N0cmluZykgdmFsdWUuXG4gICAgICovXG4gICAgbmV3U3RyaW5nKHN0cikge1xuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLm1lbW9yeVxuICAgICAgICAgICAgLm5ld0hlYXBDaGFyUG9pbnRlcihzdHIpXG4gICAgICAgICAgICAuY29uc3VtZSgoY2hhckhhbmRsZSkgPT4gdGhpcy5mZmkuUVRTX05ld1N0cmluZyh0aGlzLmN0eC52YWx1ZSwgY2hhckhhbmRsZS52YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHB0cik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIFF1aWNrSlMgW3N5bWJvbF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3ltYm9sKSB2YWx1ZS5cbiAgICAgKiBObyB0d28gc3ltYm9scyBjcmVhdGVkIHdpdGggdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHRoZSBzYW1lIHZhbHVlLlxuICAgICAqL1xuICAgIG5ld1VuaXF1ZVN5bWJvbChkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCBrZXkgPSAodHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInN5bWJvbFwiID8gZGVzY3JpcHRpb24uZGVzY3JpcHRpb24gOiBkZXNjcmlwdGlvbikgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5tZW1vcnlcbiAgICAgICAgICAgIC5uZXdIZWFwQ2hhclBvaW50ZXIoa2V5KVxuICAgICAgICAgICAgLmNvbnN1bWUoKGNoYXJIYW5kbGUpID0+IHRoaXMuZmZpLlFUU19OZXdTeW1ib2wodGhpcy5jdHgudmFsdWUsIGNoYXJIYW5kbGUudmFsdWUsIDApKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShwdHIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzeW1ib2wgZnJvbSB0aGUgW2dsb2JhbCByZWdpc3RyeV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3ltYm9sI3NoYXJlZF9zeW1ib2xzX2luX3RoZV9nbG9iYWxfc3ltYm9sX3JlZ2lzdHJ5KSBmb3IgdGhlIGdpdmVuIGtleS5cbiAgICAgKiBBbGwgc3ltYm9scyBjcmVhdGVkIHdpdGggdGhlIHNhbWUga2V5IHdpbGwgYmUgdGhlIHNhbWUgdmFsdWUuXG4gICAgICovXG4gICAgbmV3U3ltYm9sRm9yKGtleSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9ICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiID8ga2V5LmRlc2NyaXB0aW9uIDoga2V5KSA/PyBcIlwiO1xuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLm1lbW9yeVxuICAgICAgICAgICAgLm5ld0hlYXBDaGFyUG9pbnRlcihkZXNjcmlwdGlvbilcbiAgICAgICAgICAgIC5jb25zdW1lKChjaGFySGFuZGxlKSA9PiB0aGlzLmZmaS5RVFNfTmV3U3ltYm9sKHRoaXMuY3R4LnZhbHVlLCBjaGFySGFuZGxlLnZhbHVlLCAxKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocHRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgUXVpY2tKUyBbYmlnaW50XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9CaWdJbnQpIHZhbHVlLlxuICAgICAqL1xuICAgIG5ld0JpZ0ludChudW0pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9CaWdJbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpZ0ludEhhbmRsZSA9IHRoaXMuZ2V0UHJvcCh0aGlzLmdsb2JhbCwgXCJCaWdJbnRcIik7XG4gICAgICAgICAgICB0aGlzLm1lbW9yeS5tYW5hZ2UoYmlnSW50SGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMuX0JpZ0ludCA9IG5ldyBsaWZldGltZV8xLlN0YXRpY0xpZmV0aW1lKGJpZ0ludEhhbmRsZS52YWx1ZSwgdGhpcy5ydW50aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiaWdJbnRIYW5kbGUgPSB0aGlzLl9CaWdJbnQ7XG4gICAgICAgIGNvbnN0IGFzU3RyaW5nID0gU3RyaW5nKG51bSk7XG4gICAgICAgIHJldHVybiB0aGlzLm5ld1N0cmluZyhhc1N0cmluZykuY29uc3VtZSgoaGFuZGxlKSA9PiB0aGlzLnVud3JhcFJlc3VsdCh0aGlzLmNhbGxGdW5jdGlvbihiaWdJbnRIYW5kbGUsIHRoaXMudW5kZWZpbmVkLCBoYW5kbGUpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGB7fWAuXG4gICAgICogQ3JlYXRlIGEgbmV3IFF1aWNrSlMgW29iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL09iamVjdF9pbml0aWFsaXplcikuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvdG90eXBlIC0gTGlrZSBbYE9iamVjdC5jcmVhdGVgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvY3JlYXRlKS5cbiAgICAgKi9cbiAgICBuZXdPYmplY3QocHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm90b3R5cGUpIHtcbiAgICAgICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChwcm90b3R5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB0ciA9IHByb3RvdHlwZVxuICAgICAgICAgICAgPyB0aGlzLmZmaS5RVFNfTmV3T2JqZWN0UHJvdG8odGhpcy5jdHgudmFsdWUsIHByb3RvdHlwZS52YWx1ZSlcbiAgICAgICAgICAgIDogdGhpcy5mZmkuUVRTX05ld09iamVjdCh0aGlzLmN0eC52YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocHRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYFtdYC5cbiAgICAgKiBDcmVhdGUgYSBuZXcgUXVpY2tKUyBbYXJyYXldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5KS5cbiAgICAgKi9cbiAgICBuZXdBcnJheSgpIHtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5mZmkuUVRTX05ld0FycmF5KHRoaXMuY3R4LnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShwdHIpO1xuICAgIH1cbiAgICBuZXdQcm9taXNlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkUHJvbWlzZSA9IGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlKChzY29wZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbXV0YWJsZVBvaW50ZXJBcnJheSA9IHNjb3BlLm1hbmFnZSh0aGlzLm1lbW9yeS5uZXdNdXRhYmxlUG9pbnRlckFycmF5KDIpKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VQdHIgPSB0aGlzLmZmaS5RVFNfTmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcy5jdHgudmFsdWUsIG11dGFibGVQb2ludGVyQXJyYXkudmFsdWUucHRyKTtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VIYW5kbGUgPSB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocHJvbWlzZVB0cik7XG4gICAgICAgICAgICBjb25zdCBbcmVzb2x2ZUhhbmRsZSwgcmVqZWN0SGFuZGxlXSA9IEFycmF5LmZyb20obXV0YWJsZVBvaW50ZXJBcnJheS52YWx1ZS50eXBlZEFycmF5KS5tYXAoKGpzdmFsdWVQdHIpID0+IHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShqc3ZhbHVlUHRyKSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGRlZmVycmVkX3Byb21pc2VfMS5RdWlja0pTRGVmZXJyZWRQcm9taXNlKHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB0aGlzLFxuICAgICAgICAgICAgICAgIHByb21pc2VIYW5kbGUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUhhbmRsZSxcbiAgICAgICAgICAgICAgICByZWplY3RIYW5kbGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgUHJvbWlzZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZGVmZXJyZWRQcm9taXNlLnJlc29sdmUsIChlcnJvcikgPT4gZXJyb3IgaW5zdGFuY2VvZiBsaWZldGltZV8xLkxpZmV0aW1lXG4gICAgICAgICAgICAgICAgPyBkZWZlcnJlZFByb21pc2UucmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgICAgIDogdGhpcy5uZXdFcnJvcihlcnJvcikuY29uc3VtZShkZWZlcnJlZFByb21pc2UucmVqZWN0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkUHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIEphdmFzY3JpcHQgZnVuY3Rpb24gaW50byBhIFF1aWNrSlMgZnVuY3Rpb24gdmFsdWUuXG4gICAgICogU2VlIFtbVm1GdW5jdGlvbkltcGxlbWVudGF0aW9uXV0gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEEgW1tWbUZ1bmN0aW9uSW1wbGVtZW50YXRpb25dXSBzaG91bGQgbm90IGZyZWUgaXRzIGFyZ3VtZW50cyBvciBpdHMgcmV0dXJuXG4gICAgICogdmFsdWUuIEEgVm1GdW5jdGlvbkltcGxlbWVudGF0aW9uIHNob3VsZCBhbHNvIG5vdCByZXRhaW4gYW55IHJlZmVyZW5jZXMgdG9cbiAgICAgKiBpdHMgcmV0dXJuIHZhbHVlLlxuICAgICAqXG4gICAgICogVG8gaW1wbGVtZW50IGFuIGFzeW5jIGZ1bmN0aW9uLCBjcmVhdGUgYSBwcm9taXNlIHdpdGggW1tuZXdQcm9taXNlXV0sIHRoZW5cbiAgICAgKiByZXR1cm4gdGhlIGRlZmVycmVkIHByb21pc2UgaGFuZGxlIGZyb20gYGRlZmVycmVkLmhhbmRsZWAgZnJvbSB5b3VyXG4gICAgICogZnVuY3Rpb24gaW1wbGVtZW50YXRpb246XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBjb25zdCBkZWZlcnJlZCA9IHZtLm5ld1Byb21pc2UoKVxuICAgICAqIHNvbWVOYXRpdmVBc3luY0Z1bmN0aW9uKCkudGhlbihkZWZlcnJlZC5yZXNvbHZlKVxuICAgICAqIHJldHVybiBkZWZlcnJlZC5oYW5kbGVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBuZXdGdW5jdGlvbihuYW1lLCBmbikge1xuICAgICAgICBjb25zdCBmbklkID0gKyt0aGlzLmZuTmV4dElkO1xuICAgICAgICB0aGlzLnNldEZ1bmN0aW9uKGZuSWQsIGZuKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZSh0aGlzLmZmaS5RVFNfTmV3RnVuY3Rpb24odGhpcy5jdHgudmFsdWUsIGZuSWQsIG5hbWUpKTtcbiAgICB9XG4gICAgbmV3RXJyb3IoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JIYW5kbGUgPSB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUodGhpcy5mZmkuUVRTX05ld0Vycm9yKHRoaXMuY3R4LnZhbHVlKSk7XG4gICAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5ld1N0cmluZyhlcnJvci5uYW1lKS5jb25zdW1lKChoYW5kbGUpID0+IHRoaXMuc2V0UHJvcChlcnJvckhhbmRsZSwgXCJuYW1lXCIsIGhhbmRsZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubmV3U3RyaW5nKGVycm9yLm1lc3NhZ2UpLmNvbnN1bWUoKGhhbmRsZSkgPT4gdGhpcy5zZXRQcm9wKGVycm9ySGFuZGxlLCBcIm1lc3NhZ2VcIiwgaGFuZGxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aGlzLm5ld1N0cmluZyhlcnJvcikuY29uc3VtZSgoaGFuZGxlKSA9PiB0aGlzLnNldFByb3AoZXJyb3JIYW5kbGUsIFwibWVzc2FnZVwiLCBoYW5kbGUpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzbid0IHN1cHBvcnRlZCBpbiB0aGUgdHlwZSBzaWduYXR1cmUgYnV0IG1heWJlIGl0IHdpbGwgbWFrZSBsaWZlIGVhc2llci5cbiAgICAgICAgICAgIHRoaXMubmV3U3RyaW5nKFN0cmluZyhlcnJvcikpLmNvbnN1bWUoKGhhbmRsZSkgPT4gdGhpcy5zZXRQcm9wKGVycm9ySGFuZGxlLCBcIm1lc3NhZ2VcIiwgaGFuZGxlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9ySGFuZGxlO1xuICAgIH1cbiAgICAvLyBSZWFkIHZhbHVlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIGB0eXBlb2ZgIG9wZXJhdG9yLiAqKk5vdCoqIFtzdGFuZGFyZHMgY29tcGxpYW50XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9PcGVyYXRvcnMvdHlwZW9mKS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRG9lcyBub3Qgc3VwcG9ydCBCaWdJbnQgdmFsdWVzIGNvcnJlY3RseS5cbiAgICAgKi9cbiAgICB0eXBlb2YoaGFuZGxlKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChoYW5kbGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkuY29uc3VtZUhlYXBDaGFyUG9pbnRlcih0aGlzLmZmaS5RVFNfVHlwZW9mKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYGhhbmRsZWAgaW50byBhIEphdmFzY3JpcHQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIGBOYU5gIG9uIGVycm9yLCBvdGhlcndpc2UgYSBgbnVtYmVyYC5cbiAgICAgKi9cbiAgICBnZXROdW1iZXIoaGFuZGxlKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChoYW5kbGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5mZmkuUVRTX0dldEZsb2F0NjQodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBoYW5kbGVgIHRvIGEgSmF2YXNjcmlwdCBzdHJpbmcuXG4gICAgICovXG4gICAgZ2V0U3RyaW5nKGhhbmRsZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmNvbnN1bWVKU0NoYXJQb2ludGVyKHRoaXMuZmZpLlFUU19HZXRTdHJpbmcodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgaGFuZGxlYCBpbnRvIGEgSmF2YXNjcmlwdCBzeW1ib2wuIElmIHRoZSBzeW1ib2wgaXMgaW4gdGhlIGdsb2JhbFxuICAgICAqIHJlZ2lzdHJ5IGluIHRoZSBndWVzdCwgaXQgd2lsbCBiZSBjcmVhdGVkIHdpdGggU3ltYm9sLmZvciBvbiB0aGUgaG9zdC5cbiAgICAgKi9cbiAgICBnZXRTeW1ib2woaGFuZGxlKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChoYW5kbGUpO1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLm1lbW9yeS5jb25zdW1lSlNDaGFyUG9pbnRlcih0aGlzLmZmaS5RVFNfR2V0U3ltYm9sRGVzY3JpcHRpb25PcktleSh0aGlzLmN0eC52YWx1ZSwgaGFuZGxlLnZhbHVlKSk7XG4gICAgICAgIGNvbnN0IGlzR2xvYmFsID0gdGhpcy5mZmkuUVRTX0lzR2xvYmFsU3ltYm9sKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNHbG9iYWwgPyBTeW1ib2wuZm9yKGtleSkgOiBTeW1ib2woa2V5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYGhhbmRsZWAgdG8gYSBKYXZhc2NyaXB0IGJpZ2ludC5cbiAgICAgKi9cbiAgICBnZXRCaWdJbnQoaGFuZGxlKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChoYW5kbGUpO1xuICAgICAgICBjb25zdCBhc1N0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKGhhbmRsZSk7XG4gICAgICAgIHJldHVybiBCaWdJbnQoYXNTdHJpbmcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKWAuXG4gICAgICogQ29udmVydCBhIGhhbmRsZSBjb250YWluaW5nIGEgUHJvbWlzZS1saWtlIHZhbHVlIGluc2lkZSB0aGUgVk0gaW50byBhblxuICAgICAqIGFjdHVhbCBwcm9taXNlIG9uIHRoZSBob3N0LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBZb3UgbWF5IG5lZWQgdG8gY2FsbCBbW2V4ZWN1dGVQZW5kaW5nSm9ic11dIHRvIGVuc3VyZSB0aGF0IHRoZSBwcm9taXNlIGlzIHJlc29sdmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb21pc2VMaWtlSGFuZGxlIC0gQSBoYW5kbGUgdG8gYSBQcm9taXNlLWxpa2UgdmFsdWUgd2l0aCBhIGAudGhlbihvblN1Y2Nlc3MsIG9uRXJyb3IpYCBtZXRob2QuXG4gICAgICovXG4gICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZUxpa2VIYW5kbGUpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmFzc2VydE93bmVkKHByb21pc2VMaWtlSGFuZGxlKTtcbiAgICAgICAgY29uc3Qgdm1SZXNvbHZlUmVzdWx0ID0gbGlmZXRpbWVfMS5TY29wZS53aXRoU2NvcGUoKHNjb3BlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2bVByb21pc2UgPSBzY29wZS5tYW5hZ2UodGhpcy5nZXRQcm9wKHRoaXMuZ2xvYmFsLCBcIlByb21pc2VcIikpO1xuICAgICAgICAgICAgY29uc3Qgdm1Qcm9taXNlUmVzb2x2ZSA9IHNjb3BlLm1hbmFnZSh0aGlzLmdldFByb3Aodm1Qcm9taXNlLCBcInJlc29sdmVcIikpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEZ1bmN0aW9uKHZtUHJvbWlzZVJlc29sdmUsIHZtUHJvbWlzZSwgcHJvbWlzZUxpa2VIYW5kbGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHZtUmVzb2x2ZVJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2bVJlc29sdmVSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgbGlmZXRpbWVfMS5TY29wZS53aXRoU2NvcGUoKHNjb3BlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZUhhbmRsZSA9IHNjb3BlLm1hbmFnZSh0aGlzLm5ld0Z1bmN0aW9uKFwicmVzb2x2ZVwiLCAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7IHZhbHVlOiB2YWx1ZSAmJiB2YWx1ZS5kdXAoKSB9KTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVqZWN0SGFuZGxlID0gc2NvcGUubWFuYWdlKHRoaXMubmV3RnVuY3Rpb24oXCJyZWplY3RcIiwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBlcnJvcjogZXJyb3IgJiYgZXJyb3IuZHVwKCkgfSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2VIYW5kbGUgPSBzY29wZS5tYW5hZ2Uodm1SZXNvbHZlUmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlVGhlbkhhbmRsZSA9IHNjb3BlLm1hbmFnZSh0aGlzLmdldFByb3AocHJvbWlzZUhhbmRsZSwgXCJ0aGVuXCIpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVud3JhcFJlc3VsdCh0aGlzLmNhbGxGdW5jdGlvbihwcm9taXNlVGhlbkhhbmRsZSwgcHJvbWlzZUhhbmRsZSwgcmVzb2x2ZUhhbmRsZSwgcmVqZWN0SGFuZGxlKSkuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBQcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIGBoYW5kbGVba2V5XWAuXG4gICAgICogR2V0IGEgcHJvcGVydHkgZnJvbSBhIEpTVmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IG1heSBiZSBzcGVjaWZpZWQgYXMgYSBKU1ZhbHVlIGhhbmRsZSwgb3IgYXMgYVxuICAgICAqIEphdmFzY3JpcHQgc3RyaW5nICh3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5KS5cbiAgICAgKi9cbiAgICBnZXRQcm9wKGhhbmRsZSwga2V5KSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChoYW5kbGUpO1xuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLmJvcnJvd1Byb3BlcnR5S2V5KGtleSkuY29uc3VtZSgocXVpY2tKU0tleSkgPT4gdGhpcy5mZmkuUVRTX0dldFByb3AodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSwgcXVpY2tKU0tleS52YWx1ZSkpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocHRyKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYGhhbmRsZVtrZXldID0gdmFsdWVgLlxuICAgICAqIFNldCBhIHByb3BlcnR5IG9uIGEgSlNWYWx1ZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogTm90ZSB0aGF0IHRoZSBRdWlja0pTIGF1dGhvcnMgcmVjb21tZW5kIHVzaW5nIFtbZGVmaW5lUHJvcF1dIHRvIGRlZmluZSBuZXdcbiAgICAgKiBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgSlNWYWx1ZSBoYW5kbGUsIG9yIGFzIGFcbiAgICAgKiBKYXZhc2NyaXB0IHN0cmluZyBvciBudW1iZXIgKHdoaWNoIHdpbGwgYmUgY29udmVydGVkIGF1dG9tYXRpY2FsbHkgdG8gYSBKU1ZhbHVlKS5cbiAgICAgKi9cbiAgICBzZXRQcm9wKGhhbmRsZSwga2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgLy8gZnJlZSBuZXdseSBhbGxvY2F0ZWQgdmFsdWUgaWYga2V5IHdhcyBhIHN0cmluZyBvciBudW1iZXIuIE5vLW9wIGlmIHN0cmluZyB3YXMgYWxyZWFkeVxuICAgICAgICAvLyBhIFF1aWNrSlMgaGFuZGxlLlxuICAgICAgICB0aGlzLmJvcnJvd1Byb3BlcnR5S2V5KGtleSkuY29uc3VtZSgocXVpY2tKU0tleSkgPT4gdGhpcy5mZmkuUVRTX1NldFByb3AodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSwgcXVpY2tKU0tleS52YWx1ZSwgdmFsdWUudmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogW2BPYmplY3QuZGVmaW5lUHJvcGVydHkoaGFuZGxlLCBrZXksIGRlc2NyaXB0b3IpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2RlZmluZVByb3BlcnR5KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkgbWF5IGJlIHNwZWNpZmllZCBhcyBhIEpTVmFsdWUgaGFuZGxlLCBvciBhcyBhXG4gICAgICogSmF2YXNjcmlwdCBzdHJpbmcgb3IgbnVtYmVyICh3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5IHRvIGEgSlNWYWx1ZSkuXG4gICAgICovXG4gICAgZGVmaW5lUHJvcChoYW5kbGUsIGtleSwgZGVzY3JpcHRvcikge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgbGlmZXRpbWVfMS5TY29wZS53aXRoU2NvcGUoKHNjb3BlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxdWlja0pTS2V5ID0gc2NvcGUubWFuYWdlKHRoaXMuYm9ycm93UHJvcGVydHlLZXkoa2V5KSk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRlc2NyaXB0b3IudmFsdWUgfHwgdGhpcy51bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBjb25maWd1cmFibGUgPSBCb29sZWFuKGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGVudW1lcmFibGUgPSBCb29sZWFuKGRlc2NyaXB0b3IuZW51bWVyYWJsZSk7XG4gICAgICAgICAgICBjb25zdCBoYXNWYWx1ZSA9IEJvb2xlYW4oZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBnZXQgPSBkZXNjcmlwdG9yLmdldFxuICAgICAgICAgICAgICAgID8gc2NvcGUubWFuYWdlKHRoaXMubmV3RnVuY3Rpb24oZGVzY3JpcHRvci5nZXQubmFtZSwgZGVzY3JpcHRvci5nZXQpKVxuICAgICAgICAgICAgICAgIDogdGhpcy51bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBzZXQgPSBkZXNjcmlwdG9yLnNldFxuICAgICAgICAgICAgICAgID8gc2NvcGUubWFuYWdlKHRoaXMubmV3RnVuY3Rpb24oZGVzY3JpcHRvci5zZXQubmFtZSwgZGVzY3JpcHRvci5zZXQpKVxuICAgICAgICAgICAgICAgIDogdGhpcy51bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRGVmaW5lUHJvcCh0aGlzLmN0eC52YWx1ZSwgaGFuZGxlLnZhbHVlLCBxdWlja0pTS2V5LnZhbHVlLCB2YWx1ZS52YWx1ZSwgZ2V0LnZhbHVlLCBzZXQudmFsdWUsIGNvbmZpZ3VyYWJsZSwgZW51bWVyYWJsZSwgaGFzVmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gRXZhbHVhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBbYGZ1bmMuY2FsbCh0aGlzVmFsLCAuLi5hcmdzKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Z1bmN0aW9uL2NhbGwpLlxuICAgICAqIENhbGwgYSBKU1ZhbHVlIGFzIGEgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBTZWUgW1t1bndyYXBSZXN1bHRdXSwgd2hpY2ggd2lsbCB0aHJvdyBpZiB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYW4gZXJyb3IsIG9yXG4gICAgICogcmV0dXJuIHRoZSByZXN1bHQgaGFuZGxlIGRpcmVjdGx5LiBJZiBldmFsdWF0aW9uIHJldHVybmVkIGEgaGFuZGxlIGNvbnRhaW5pbmdcbiAgICAgKiBhIHByb21pc2UsIHVzZSBbW3Jlc29sdmVQcm9taXNlXV0gdG8gY29udmVydCBpdCB0byBhIG5hdGl2ZSBwcm9taXNlIGFuZFxuICAgICAqIFtbZXhlY3V0ZVBlbmRpbmdKb2JzXV0gdG8gZmluaXNoIGV2YWx1YXRpbmcgdGhlIHByb21pc2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHJlc3VsdC4gSWYgdGhlIGZ1bmN0aW9uIHRocmV3IHN5bmNocm9ub3VzbHksIGByZXN1bHQuZXJyb3JgIGJlIGFcbiAgICAgKiBoYW5kbGUgdG8gdGhlIGV4Y2VwdGlvbi4gT3RoZXJ3aXNlIGByZXN1bHQudmFsdWVgIHdpbGwgYmUgYSBoYW5kbGUgdG8gdGhlXG4gICAgICogdmFsdWUuXG4gICAgICovXG4gICAgY2FsbEZ1bmN0aW9uKGZ1bmMsIHRoaXNWYWwsIC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmFzc2VydE93bmVkKGZ1bmMpO1xuICAgICAgICBjb25zdCByZXN1bHRQdHIgPSB0aGlzLm1lbW9yeVxuICAgICAgICAgICAgLnRvUG9pbnRlckFycmF5KGFyZ3MpXG4gICAgICAgICAgICAuY29uc3VtZSgoYXJnc0FycmF5UHRyKSA9PiB0aGlzLmZmaS5RVFNfQ2FsbCh0aGlzLmN0eC52YWx1ZSwgZnVuYy52YWx1ZSwgdGhpc1ZhbC52YWx1ZSwgYXJncy5sZW5ndGgsIGFyZ3NBcnJheVB0ci52YWx1ZSkpO1xuICAgICAgICBjb25zdCBlcnJvclB0ciA9IHRoaXMuZmZpLlFUU19SZXNvbHZlRXhjZXB0aW9uKHRoaXMuY3R4LnZhbHVlLCByZXN1bHRQdHIpO1xuICAgICAgICBpZiAoZXJyb3JQdHIpIHtcbiAgICAgICAgICAgIHRoaXMuZmZpLlFUU19GcmVlVmFsdWVQb2ludGVyKHRoaXMuY3R4LnZhbHVlLCByZXN1bHRQdHIpO1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShlcnJvclB0cikgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWx1ZTogdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHJlc3VsdFB0cikgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlrZSBbYGV2YWwoY29kZSlgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9ldmFsI0Rlc2NyaXB0aW9uKS5cbiAgICAgKiBFdmFsdWF0ZXMgdGhlIEphdmFzY3JpcHQgc291cmNlIGBjb2RlYCBpbiB0aGUgZ2xvYmFsIHNjb3BlIG9mIHRoaXMgVk0uXG4gICAgICogV2hlbiB3b3JraW5nIHdpdGggYXN5bmMgY29kZSwgeW91IG1hbnkgbmVlZCB0byBjYWxsIFtbZXhlY3V0ZVBlbmRpbmdKb2JzXV1cbiAgICAgKiB0byBleGVjdXRlIGNhbGxiYWNrcyBwZW5kaW5nIGFmdGVyIHN5bmNocm9ub3VzIGV2YWx1YXRpb24gcmV0dXJucy5cbiAgICAgKlxuICAgICAqIFNlZSBbW3Vud3JhcFJlc3VsdF1dLCB3aGljaCB3aWxsIHRocm93IGlmIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBhbiBlcnJvciwgb3JcbiAgICAgKiByZXR1cm4gdGhlIHJlc3VsdCBoYW5kbGUgZGlyZWN0bHkuIElmIGV2YWx1YXRpb24gcmV0dXJuZWQgYSBoYW5kbGUgY29udGFpbmluZ1xuICAgICAqIGEgcHJvbWlzZSwgdXNlIFtbcmVzb2x2ZVByb21pc2VdXSB0byBjb252ZXJ0IGl0IHRvIGEgbmF0aXZlIHByb21pc2UgYW5kXG4gICAgICogW1tleGVjdXRlUGVuZGluZ0pvYnNdXSB0byBmaW5pc2ggZXZhbHVhdGluZyB0aGUgcHJvbWlzZS5cbiAgICAgKlxuICAgICAqICpOb3RlKjogdG8gcHJvdGVjdCBhZ2FpbnN0IGluZmluaXRlIGxvb3BzLCBwcm92aWRlIGFuIGludGVycnVwdCBoYW5kbGVyIHRvXG4gICAgICogW1tzZXRJbnRlcnJ1cHRIYW5kbGVyXV0uIFlvdSBjYW4gdXNlIFtbc2hvdWxkSW50ZXJydXB0QWZ0ZXJEZWFkbGluZV1dIHRvXG4gICAgICogY3JlYXRlIGEgdGltZS1iYXNlZCBkZWFkbGluZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBsYXN0IHN0YXRlbWVudCdzIHZhbHVlLiBJZiB0aGUgY29kZSB0aHJldyBzeW5jaHJvbm91c2x5LFxuICAgICAqIGByZXN1bHQuZXJyb3JgIHdpbGwgYmUgYSBoYW5kbGUgdG8gdGhlIGV4Y2VwdGlvbi4gSWYgZXhlY3V0aW9uIHdhc1xuICAgICAqIGludGVycnVwdGVkLCB0aGUgZXJyb3Igd2lsbCBoYXZlIG5hbWUgYEludGVybmFsRXJyb3JgIGFuZCBtZXNzYWdlXG4gICAgICogYGludGVycnVwdGVkYC5cbiAgICAgKi9cbiAgICBldmFsQ29kZShjb2RlLCBmaWxlbmFtZSA9IFwiZXZhbC5qc1wiLCBcbiAgICAvKipcbiAgICAgKiBJZiBubyBvcHRpb25zIGFyZSBwYXNzZWQsIGEgaGV1cmlzdGljIHdpbGwgYmUgdXNlZCB0byBkZXRlY3QgaWYgYGNvZGVgIGlzXG4gICAgICogYW4gRVMgbW9kdWxlLlxuICAgICAqXG4gICAgICogU2VlIFtbRXZhbEZsYWdzXV0gZm9yIG51bWJlciBzZW1hbnRpY3MuXG4gICAgICovXG4gICAgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBkZXRlY3RNb2R1bGUgPSAob3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gMSA6IDApO1xuICAgICAgICBjb25zdCBmbGFncyA9ICgwLCB0eXBlc18xLmV2YWxPcHRpb25zVG9GbGFncykob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFB0ciA9IHRoaXMubWVtb3J5XG4gICAgICAgICAgICAubmV3SGVhcENoYXJQb2ludGVyKGNvZGUpXG4gICAgICAgICAgICAuY29uc3VtZSgoY2hhckhhbmRsZSkgPT4gdGhpcy5mZmkuUVRTX0V2YWwodGhpcy5jdHgudmFsdWUsIGNoYXJIYW5kbGUudmFsdWUsIGZpbGVuYW1lLCBkZXRlY3RNb2R1bGUsIGZsYWdzKSk7XG4gICAgICAgIGNvbnN0IGVycm9yUHRyID0gdGhpcy5mZmkuUVRTX1Jlc29sdmVFeGNlcHRpb24odGhpcy5jdHgudmFsdWUsIHJlc3VsdFB0cik7XG4gICAgICAgIGlmIChlcnJvclB0cikge1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX0ZyZWVWYWx1ZVBvaW50ZXIodGhpcy5jdHgudmFsdWUsIHJlc3VsdFB0cik7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKGVycm9yUHRyKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocmVzdWx0UHRyKSB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaHJvdyBhbiBlcnJvciBpbiB0aGUgVk0sIGludGVycnVwdGVkIHdoYXRldmVyIGN1cnJlbnQgZXhlY3V0aW9uIGlzIGluIHByb2dyZXNzIHdoZW4gZXhlY3V0aW9uIHJlc3VtZXMuXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqL1xuICAgIHRocm93KGVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yVG9IYW5kbGUoZXJyb3IpLmNvbnN1bWUoKGhhbmRsZSkgPT4gdGhpcy5mZmkuUVRTX1Rocm93KHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBib3Jyb3dQcm9wZXJ0eUtleShrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5ld051bWJlcihrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uZXdTdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBrZXkgaXMgYWxyZWFkeSBhIEpTVmFsdWUsIGJ1dCB3ZSdyZSBib3Jyb3dpbmcgaXQuIFJldHVybiBhIHN0YXRpYyBoYW5kbGVcbiAgICAgICAgLy8gZm9yIGludGVybmFsIHVzZSBvbmx5LlxuICAgICAgICByZXR1cm4gbmV3IGxpZmV0aW1lXzEuU3RhdGljTGlmZXRpbWUoa2V5LnZhbHVlLCB0aGlzLnJ1bnRpbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldE1lbW9yeShydCkge1xuICAgICAgICBpZiAocnQgPT09IHRoaXMucnQudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1lbW9yeTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlByaXZhdGUgQVBJLiBDYW5ub3QgZ2V0IG1lbW9yeSBmcm9tIGEgZGlmZmVyZW50IHJ1bnRpbWVcIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVXRpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBEdW1wIGEgSlNWYWx1ZSB0byBKYXZhc2NyaXB0IGluIGEgYmVzdC1lZmZvcnQgZmFzaGlvbi5cbiAgICAgKiBSZXR1cm5zIGBoYW5kbGUudG9TdHJpbmcoKWAgaWYgaXQgY2Fubm90IGJlIHNlcmlhbGl6ZWQgdG8gSlNPTi5cbiAgICAgKi9cbiAgICBkdW1wKGhhbmRsZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZW9mKGhhbmRsZSk7XG4gICAgICAgIGlmICh0eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmcoaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXROdW1iZXIoaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRCaWdJbnQoaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFN5bWJvbChoYW5kbGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0ciA9IHRoaXMubWVtb3J5LmNvbnN1bWVKU0NoYXJQb2ludGVyKHRoaXMuZmZpLlFUU19EdW1wKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0cik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbndyYXAgYSBTdWNjZXNzT3JGYWlsIHJlc3VsdCBzdWNoIGFzIGEgW1tWbUNhbGxSZXN1bHRdXSBvciBhXG4gICAgICogW1tFeGVjdXRlUGVuZGluZ0pvYnNSZXN1bHRdXSwgd2hlcmUgdGhlIGZhaWwgYnJhbmNoIGNvbnRhaW5zIGEgaGFuZGxlIHRvIGEgUXVpY2tKUyBlcnJvciB2YWx1ZS5cbiAgICAgKiBJZiB0aGUgcmVzdWx0IGlzIGEgc3VjY2VzcywgcmV0dXJucyB0aGUgdmFsdWUuXG4gICAgICogSWYgdGhlIHJlc3VsdCBpcyBhbiBlcnJvciwgY29udmVydHMgdGhlIGVycm9yIHRvIGEgbmF0aXZlIG9iamVjdCBhbmQgdGhyb3dzIHRoZSBlcnJvci5cbiAgICAgKi9cbiAgICB1bndyYXBSZXN1bHQocmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBcImNvbnRleHRcIiBpbiByZXN1bHQuZXJyb3IgPyByZXN1bHQuZXJyb3IuY29udGV4dCA6IHRoaXM7XG4gICAgICAgICAgICBjb25zdCBjYXVzZSA9IHJlc3VsdC5lcnJvci5jb25zdW1lKChlcnJvcikgPT4gdGhpcy5kdW1wKGVycm9yKSk7XG4gICAgICAgICAgICBpZiAoY2F1c2UgJiYgdHlwZW9mIGNhdXNlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBjYXVzZS5tZXNzYWdlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBuYW1lLCBzdGFjayB9ID0gY2F1c2U7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gbmV3IGVycm9yc18xLlF1aWNrSlNVbndyYXBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0U3RhY2sgPSBleGNlcHRpb24uc3RhY2s7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5uYW1lID0gY2F1c2UubmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzdGFjayA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24uc3RhY2sgPSBgJHtuYW1lfTogJHttZXNzYWdlfVxcbiR7Y2F1c2Uuc3RhY2t9SG9zdDogJHtob3N0U3RhY2t9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihleGNlcHRpb24sIHsgY2F1c2UsIGNvbnRleHQsIG1lc3NhZ2UgfSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNVbndyYXBFcnJvcihjYXVzZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0RnVuY3Rpb24oZm5faWQpIHtcbiAgICAgICAgY29uc3QgbWFwX2lkID0gZm5faWQgPj4gODtcbiAgICAgICAgY29uc3QgZm5NYXAgPSB0aGlzLmZuTWFwcy5nZXQobWFwX2lkKTtcbiAgICAgICAgaWYgKCFmbk1hcCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm5NYXAuZ2V0KGZuX2lkKTtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgc2V0RnVuY3Rpb24oZm5faWQsIGhhbmRsZSkge1xuICAgICAgICBjb25zdCBtYXBfaWQgPSBmbl9pZCA+PiA4O1xuICAgICAgICBsZXQgZm5NYXAgPSB0aGlzLmZuTWFwcy5nZXQobWFwX2lkKTtcbiAgICAgICAgaWYgKCFmbk1hcCkge1xuICAgICAgICAgICAgZm5NYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICB0aGlzLmZuTWFwcy5zZXQobWFwX2lkLCBmbk1hcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuTWFwLnNldChmbl9pZCwgaGFuZGxlKTtcbiAgICB9XG4gICAgZXJyb3JUb0hhbmRsZShlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBsaWZldGltZV8xLkxpZmV0aW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubmV3RXJyb3IoZXJyb3IpO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU0NvbnRleHQgPSBRdWlja0pTQ29udGV4dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRleHQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlYnVnTG9nID0gZXhwb3J0cy5RVFNfREVCVUcgPSB2b2lkIDA7XG5leHBvcnRzLlFUU19ERUJVRyA9IGZhbHNlIHx8IEJvb2xlYW4odHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgcHJvY2Vzcy5lbnYuUVRTX0RFQlVHKTtcbmV4cG9ydHMuZGVidWdMb2cgPSBleHBvcnRzLlFUU19ERUJVRyA/IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSkgOiAoKSA9PiB7IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWJ1Zy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU0RlZmVycmVkUHJvbWlzZSA9IHZvaWQgMDtcbi8qKlxuICogUXVpY2tKU0RlZmVycmVkUHJvbWlzZSB3cmFwcyBhIFF1aWNrSlMgcHJvbWlzZSBbW2hhbmRsZV1dIGFuZCBhbGxvd3NcbiAqIFtbcmVzb2x2ZV1daW5nIG9yIFtbcmVqZWN0XV1pbmcgdGhhdCBwcm9taXNlLiBVc2UgaXQgdG8gYnJpZGdlIGFzeW5jaHJvbm91c1xuICogY29kZSBvbiB0aGUgaG9zdCB0byBBUElzIGluc2lkZSBhIFF1aWNrSlNDb250ZXh0LlxuICpcbiAqIE1hbmFnaW5nIHRoZSBsaWZldGltZSBvZiBwcm9taXNlcyBpcyB0cmlja3kuIFRoZXJlIGFyZSB0aHJlZVxuICogW1tRdWlja0pTSGFuZGxlXV1zIGluc2lkZSBvZiBlYWNoIGRlZmVycmVkIHByb21pc2Ugb2JqZWN0OiAoMSkgdGhlIHByb21pc2VcbiAqIGl0c2VsZiwgKDIpIHRoZSBgcmVzb2x2ZWAgY2FsbGJhY2ssIGFuZCAoMykgdGhlIGByZWplY3RgIGNhbGxiYWNrLlxuICpcbiAqIC0gSWYgdGhlIHByb21pc2Ugd2lsbCBiZSBmdWxmaWxsZWQgYmVmb3JlIHRoZSBlbmQgb2YgaXQncyBbW293bmVyXV0ncyBsaWZldGltZSxcbiAqICAgdGhlIG9ubHkgY2xlYW51cCBuZWNlc3NhcnkgaXMgYGRlZmVycmVkLmhhbmRsZS5kaXNwb3NlKClgLCBiZWNhdXNlXG4gKiAgIGNhbGxpbmcgW1tyZXNvbHZlXV0gb3IgW1tyZWplY3RdXSB3aWxsIGRpc3Bvc2Ugb2YgYm90aCBjYWxsYmFja3MgYXV0b21hdGljYWxseS5cbiAqXG4gKiAtIEFzIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBbW1ZtRnVuY3Rpb25JbXBsZW1lbnRhdGlvbl1dLCByZXR1cm4gW1toYW5kbGVdXSxcbiAqICAgYW5kIGVuc3VyZSB0aGF0IGVpdGhlciBbW3Jlc29sdmVdXSBvciBbW3JlamVjdF1dIHdpbGwgYmUgY2FsbGVkLiBObyBvdGhlclxuICogICBjbGVhbi11cCBpcyBuZWNlc3NhcnkuXG4gKlxuICogLSBJbiBvdGhlciBjYXNlcywgY2FsbCBbW2Rpc3Bvc2VdXSwgd2hpY2ggd2lsbCBkaXNwb3NlIFtbaGFuZGxlXV0gYXMgd2VsbCBhcyB0aGVcbiAqICAgUXVpY2tKUyBoYW5kbGVzIHRoYXQgYmFjayBbW3Jlc29sdmVdXSBhbmQgW1tyZWplY3RdXS4gRm9yIHRoaXMgb2JqZWN0LFxuICogICBbW2Rpc3Bvc2VdXSBpcyBpZGVtcG90ZW50LlxuICovXG5jbGFzcyBRdWlja0pTRGVmZXJyZWRQcm9taXNlIHtcbiAgICAvKipcbiAgICAgKiBVc2UgW1tRdWlja0pTQ29udGV4dC5uZXdQcm9taXNlXV0gdG8gY3JlYXRlIGEgbmV3IHByb21pc2UgaW5zdGVhZCBvZiBjYWxsaW5nXG4gICAgICogdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseS5cbiAgICAgKiBAdW5zdGFibGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXNvbHZlIFtbaGFuZGxlXV0gd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGlmIGFueS5cbiAgICAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBhZnRlciBjYWxsaW5nIFtbZGlzcG9zZV1dIGlzIGEgbm8tb3AuXG4gICAgICAgICAqXG4gICAgICAgICAqIE5vdGUgdGhhdCBhZnRlciByZXNvbHZpbmcgYSBwcm9taXNlLCB5b3UgbWF5IG5lZWQgdG8gY2FsbFxuICAgICAgICAgKiBbW1F1aWNrSlNDb250ZXh0LmV4ZWN1dGVQZW5kaW5nSm9ic11dIHRvIHByb3BhZ2F0ZSB0aGUgcmVzdWx0IHRvIHRoZSBwcm9taXNlJ3NcbiAgICAgICAgICogY2FsbGJhY2tzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZXNvbHZlID0gKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzb2x2ZUhhbmRsZS5hbGl2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGV4dFxuICAgICAgICAgICAgICAgIC51bndyYXBSZXN1bHQodGhpcy5jb250ZXh0LmNhbGxGdW5jdGlvbih0aGlzLnJlc29sdmVIYW5kbGUsIHRoaXMuY29udGV4dC51bmRlZmluZWQsIHZhbHVlIHx8IHRoaXMuY29udGV4dC51bmRlZmluZWQpKVxuICAgICAgICAgICAgICAgIC5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VSZXNvbHZlcnMoKTtcbiAgICAgICAgICAgIHRoaXMub25TZXR0bGVkKCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWplY3QgW1toYW5kbGVdXSB3aXRoIHRoZSBnaXZlbiB2YWx1ZSwgaWYgYW55LlxuICAgICAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGFmdGVyIGNhbGxpbmcgW1tkaXNwb3NlXV0gaXMgYSBuby1vcC5cbiAgICAgICAgICpcbiAgICAgICAgICogTm90ZSB0aGF0IGFmdGVyIHJlamVjdGluZyBhIHByb21pc2UsIHlvdSBtYXkgbmVlZCB0byBjYWxsXG4gICAgICAgICAqIFtbUXVpY2tKU0NvbnRleHQuZXhlY3V0ZVBlbmRpbmdKb2JzXV0gdG8gcHJvcGFnYXRlIHRoZSByZXN1bHQgdG8gdGhlIHByb21pc2Unc1xuICAgICAgICAgKiBjYWxsYmFja3MuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlamVjdCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlamVjdEhhbmRsZS5hbGl2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGV4dFxuICAgICAgICAgICAgICAgIC51bndyYXBSZXN1bHQodGhpcy5jb250ZXh0LmNhbGxGdW5jdGlvbih0aGlzLnJlamVjdEhhbmRsZSwgdGhpcy5jb250ZXh0LnVuZGVmaW5lZCwgdmFsdWUgfHwgdGhpcy5jb250ZXh0LnVuZGVmaW5lZCkpXG4gICAgICAgICAgICAgICAgLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZVJlc29sdmVycygpO1xuICAgICAgICAgICAgdGhpcy5vblNldHRsZWQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFuZGxlLmFsaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kaXNwb3NlUmVzb2x2ZXJzKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGFyZ3MuY29udGV4dDtcbiAgICAgICAgdGhpcy5vd25lciA9IGFyZ3MuY29udGV4dC5ydW50aW1lO1xuICAgICAgICB0aGlzLmhhbmRsZSA9IGFyZ3MucHJvbWlzZUhhbmRsZTtcbiAgICAgICAgdGhpcy5zZXR0bGVkID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25TZXR0bGVkID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzb2x2ZUhhbmRsZSA9IGFyZ3MucmVzb2x2ZUhhbmRsZTtcbiAgICAgICAgdGhpcy5yZWplY3RIYW5kbGUgPSBhcmdzLnJlamVjdEhhbmRsZTtcbiAgICB9XG4gICAgZ2V0IGFsaXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGUuYWxpdmUgfHwgdGhpcy5yZXNvbHZlSGFuZGxlLmFsaXZlIHx8IHRoaXMucmVqZWN0SGFuZGxlLmFsaXZlO1xuICAgIH1cbiAgICBkaXNwb3NlUmVzb2x2ZXJzKCkge1xuICAgICAgICBpZiAodGhpcy5yZXNvbHZlSGFuZGxlLmFsaXZlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnJlamVjdEhhbmRsZS5hbGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5yZWplY3RIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTRGVmZXJyZWRQcm9taXNlID0gUXVpY2tKU0RlZmVycmVkUHJvbWlzZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlZmVycmVkLXByb21pc2UuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQgPSBleHBvcnRzLlF1aWNrSlNBc3luY2lmeVN1c3BlbmRlZCA9IGV4cG9ydHMuUXVpY2tKU0FzeW5jaWZ5RXJyb3IgPSBleHBvcnRzLlF1aWNrSlNOb3RJbXBsZW1lbnRlZCA9IGV4cG9ydHMuUXVpY2tKU1VzZUFmdGVyRnJlZSA9IGV4cG9ydHMuUXVpY2tKU1dyb25nT3duZXIgPSBleHBvcnRzLlF1aWNrSlNVbndyYXBFcnJvciA9IHZvaWQgMDtcbi8qKlxuICogRXJyb3IgdGhyb3duIGlmIFtbUXVpY2tKU0NvbnRleHQudW53cmFwUmVzdWx0XV0gdW53cmFwcyBhbiBlcnJvciB2YWx1ZSB0aGF0IGlzbid0IGFuIG9iamVjdC5cbiAqL1xuY2xhc3MgUXVpY2tKU1Vud3JhcEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNhdXNlLCBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKFN0cmluZyhjYXVzZSkpO1xuICAgICAgICB0aGlzLmNhdXNlID0gY2F1c2U7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU1Vud3JhcEVycm9yXCI7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTVW53cmFwRXJyb3IgPSBRdWlja0pTVW53cmFwRXJyb3I7XG5jbGFzcyBRdWlja0pTV3JvbmdPd25lciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJRdWlja0pTV3JvbmdPd25lclwiO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU1dyb25nT3duZXIgPSBRdWlja0pTV3JvbmdPd25lcjtcbmNsYXNzIFF1aWNrSlNVc2VBZnRlckZyZWUgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU1VzZUFmdGVyRnJlZVwiO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU1VzZUFmdGVyRnJlZSA9IFF1aWNrSlNVc2VBZnRlckZyZWU7XG5jbGFzcyBRdWlja0pTTm90SW1wbGVtZW50ZWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU05vdEltcGxlbWVudGVkXCI7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTTm90SW1wbGVtZW50ZWQgPSBRdWlja0pTTm90SW1wbGVtZW50ZWQ7XG5jbGFzcyBRdWlja0pTQXN5bmNpZnlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJRdWlja0pTQXN5bmNpZnlFcnJvclwiO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU0FzeW5jaWZ5RXJyb3IgPSBRdWlja0pTQXN5bmNpZnlFcnJvcjtcbmNsYXNzIFF1aWNrSlNBc3luY2lmeVN1c3BlbmRlZCBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJRdWlja0pTQXN5bmNpZnlTdXNwZW5kZWRcIjtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNBc3luY2lmeVN1c3BlbmRlZCA9IFF1aWNrSlNBc3luY2lmeVN1c3BlbmRlZDtcbmNsYXNzIFF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU01lbW9yeUxlYWtEZXRlY3RlZFwiO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU01lbW9yeUxlYWtEZXRlY3RlZCA9IFF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lcnJvcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVud3JhcEphdmFzY3JpcHQgPSBleHBvcnRzLnVud3JhcFR5cGVzY3JpcHQgPSB2b2lkIDA7XG4vKiogVHlwZXNjcmlwdCB0aGlua3MgaW1wb3J0KCcuLi5qcy8uZC50cycpIG5lZWRzIG1vZC5kZWZhdWx0LmRlZmF1bHQgKi9cbmZ1bmN0aW9uIGZha2VVbndyYXBEZWZhdWx0KG1vZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiZmFrZVVud3JhcERlZmF1bHRcIiwgbW9kKVxuICAgIHJldHVybiBtb2QuZGVmYXVsdDtcbn1cbi8qKiBUeXBlc2NyaXB0IHRoaW5rcyBpbXBvcnQoJy4uLnRzJykgZG9lc24ndCBuZWVkIG1vZC5kZWZhdWx0LmRlZmF1bHQsIGJ1dCBkb2VzICovXG5mdW5jdGlvbiBhY3R1YWxVbndyYXBEZWZhdWx0KG1vZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiYWN0dWFsVW53cmFwRGVmYXVsdFwiLCBtb2QpXG4gICAgY29uc3QgbWF5YmVVbndyYXAgPSBtb2QuZGVmYXVsdDtcbiAgICByZXR1cm4gbWF5YmVVbndyYXAgPz8gbW9kO1xufVxuLy8gSSdtIG5vdCBzdXJlIGlmIHRoaXMgYmVoYXZpb3IgaXMgbmVlZGVkIGluIGFsbCBydW50aW1lcyxcbi8vIG9yIGp1c3QgZm9yIG1vY2hhICsgdHMtbm9kZS5cbmV4cG9ydHMudW53cmFwVHlwZXNjcmlwdCA9IGFjdHVhbFVud3JhcERlZmF1bHQ7XG5leHBvcnRzLnVud3JhcEphdmFzY3JpcHQgPSBmYWtlVW53cmFwRGVmYXVsdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVzbUhlbHBlcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgUXVpY2tKU1JhdyA9ICgoKSA9PiB7XG4gICAgdmFyIF9zY3JpcHREaXIgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgPyBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyA6IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIF9fZmlsZW5hbWUgIT09ICd1bmRlZmluZWQnKVxuICAgICAgICBfc2NyaXB0RGlyID0gX3NjcmlwdERpciB8fCBfX2ZpbGVuYW1lO1xuICAgIHJldHVybiAoZnVuY3Rpb24gKFF1aWNrSlNSYXcgPSB7fSkge1xuICAgICAgICB2YXIgYTtcbiAgICAgICAgYSB8fCAoYSA9IHR5cGVvZiBRdWlja0pTUmF3ICE9PSAndW5kZWZpbmVkJyA/IFF1aWNrSlNSYXcgOiB7fSk7XG4gICAgICAgIHZhciBtLCBuO1xuICAgICAgICBhLnJlYWR5ID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGIsIGMpIHsgbSA9IGI7IG4gPSBjOyB9KTtcbiAgICAgICAgdmFyIHAgPSBPYmplY3QuYXNzaWduKHt9LCBhKSwgdCA9IFwiLi90aGlzLnByb2dyYW1cIiwgdSA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIHdpbmRvdywgdiA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgaW1wb3J0U2NyaXB0cywgdyA9IFwib2JqZWN0XCIgPT0gdHlwZW9mIHByb2Nlc3MgJiYgXCJvYmplY3RcIiA9PSB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucyAmJiBcInN0cmluZ1wiID09IHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUsIHggPSBcIlwiLCB5LCB6LCBBO1xuICAgICAgICBpZiAodykge1xuICAgICAgICAgICAgdmFyIGZzID0gcmVxdWlyZShcImZzXCIpLCBCID0gcmVxdWlyZShcInBhdGhcIik7XG4gICAgICAgICAgICB4ID0gdiA/IEIuZGlybmFtZSh4KSArIFwiL1wiIDogX19kaXJuYW1lICsgXCIvXCI7XG4gICAgICAgICAgICB5ID0gKGIsIGMpID0+IHsgdmFyIGQgPSBDKGIpOyBpZiAoZClcbiAgICAgICAgICAgICAgICByZXR1cm4gYyA/IGQgOiBkLnRvU3RyaW5nKCk7IGIgPSBiLnN0YXJ0c1dpdGgoXCJmaWxlOi8vXCIpID8gbmV3IFVSTChiKSA6IEIubm9ybWFsaXplKGIpOyByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGIsIGMgPyB2b2lkIDAgOiBcInV0ZjhcIik7IH07XG4gICAgICAgICAgICBBID0gYiA9PiB7IGIgPSB5KGIsICEwKTsgYi5idWZmZXIgfHwgKGIgPSBuZXcgVWludDhBcnJheShiKSk7IHJldHVybiBiOyB9O1xuICAgICAgICAgICAgeiA9IChiLCBjLCBkKSA9PiB7IHZhciBlID0gQyhiKTsgZSAmJiBjKGUpOyBiID0gYi5zdGFydHNXaXRoKFwiZmlsZTovL1wiKSA/IG5ldyBVUkwoYikgOiBCLm5vcm1hbGl6ZShiKTsgZnMucmVhZEZpbGUoYiwgZnVuY3Rpb24gKGYsIGcpIHsgZiA/IGQoZikgOiBjKGcuYnVmZmVyKTsgfSk7IH07XG4gICAgICAgICAgICAhYS50aGlzUHJvZ3JhbSAmJiAxIDwgcHJvY2Vzcy5hcmd2Lmxlbmd0aCAmJiAodCA9IHByb2Nlc3MuYXJndlsxXS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKSk7XG4gICAgICAgICAgICBwcm9jZXNzLmFyZ3Yuc2xpY2UoMik7XG4gICAgICAgICAgICBhLmluc3BlY3QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBcIltFbXNjcmlwdGVuIE1vZHVsZSBvYmplY3RdXCI7IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodSB8fCB2KVxuICAgICAgICAgICAgdiA/IHggPSBzZWxmLmxvY2F0aW9uLmhyZWYgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBkb2N1bWVudCAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmICh4ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLCBfc2NyaXB0RGlyICYmICh4ID0gX3NjcmlwdERpciksIDAgIT09IHguaW5kZXhPZihcImJsb2I6XCIpID8geCA9IHguc3Vic3RyKDAsIHgucmVwbGFjZSgvWz8jXS4qLywgXCJcIikubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgOiB4ID0gXCJcIiwgeSA9IGIgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjID0gbmV3IFhNTEh0dHBSZXF1ZXN0O1xuICAgICAgICAgICAgICAgICAgICBjLm9wZW4oXCJHRVRcIiwgYiwgITEpO1xuICAgICAgICAgICAgICAgICAgICBjLnNlbmQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGYpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPSBDKGIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8IGIubGVuZ3RoOyBkKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGJbZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1IDwgZSAmJiAoZSAmPSAyNTUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmpvaW4oXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB2ICYmIChBID0gYiA9PiB7IHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgWE1MSHR0cFJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgYy5vcGVuKFwiR0VUXCIsIGIsICExKTtcbiAgICAgICAgICAgICAgICBjLnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjtcbiAgICAgICAgICAgICAgICBjLnNlbmQobnVsbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGMucmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYiA9IEMoYikpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICAgICAgICAgIHRocm93IGQ7XG4gICAgICAgICAgICB9IH0pLCB6ID0gKGIsIGMsIGQpID0+IHsgdmFyIGUgPSBuZXcgWE1MSHR0cFJlcXVlc3Q7IGUub3BlbihcIkdFVFwiLCBiLCAhMCk7IGUucmVzcG9uc2VUeXBlID0gXCJhcnJheWJ1ZmZlclwiOyBlLm9ubG9hZCA9ICgpID0+IHsgaWYgKDIwMCA9PSBlLnN0YXR1cyB8fCAwID09IGUuc3RhdHVzICYmIGUucmVzcG9uc2UpXG4gICAgICAgICAgICAgICAgYyhlLnJlc3BvbnNlKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmID0gQyhiKTtcbiAgICAgICAgICAgICAgICBmID8gYyhmLmJ1ZmZlcikgOiBkKCk7XG4gICAgICAgICAgICB9IH07IGUub25lcnJvciA9IGQ7IGUuc2VuZChudWxsKTsgfTtcbiAgICAgICAgdmFyIGFhID0gYS5wcmludCB8fCBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLCBEID0gYS5wcmludEVyciB8fCBjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihhLCBwKTtcbiAgICAgICAgcCA9IG51bGw7XG4gICAgICAgIGEudGhpc1Byb2dyYW0gJiYgKHQgPSBhLnRoaXNQcm9ncmFtKTtcbiAgICAgICAgdmFyIEU7XG4gICAgICAgIGEud2FzbUJpbmFyeSAmJiAoRSA9IGEud2FzbUJpbmFyeSk7XG4gICAgICAgIHZhciBub0V4aXRSdW50aW1lID0gYS5ub0V4aXRSdW50aW1lIHx8ICEwO1xuICAgICAgICBcIm9iamVjdFwiICE9IHR5cGVvZiBXZWJBc3NlbWJseSAmJiBGKFwibm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZFwiKTtcbiAgICAgICAgdmFyIEcsIEggPSAhMSwgSSwgSiwgSywgTDtcbiAgICAgICAgZnVuY3Rpb24gTSgpIHsgdmFyIGIgPSBHLmJ1ZmZlcjsgYS5IRUFQOCA9IEkgPSBuZXcgSW50OEFycmF5KGIpOyBhLkhFQVAxNiA9IG5ldyBJbnQxNkFycmF5KGIpOyBhLkhFQVAzMiA9IEsgPSBuZXcgSW50MzJBcnJheShiKTsgYS5IRUFQVTggPSBKID0gbmV3IFVpbnQ4QXJyYXkoYik7IGEuSEVBUFUxNiA9IG5ldyBVaW50MTZBcnJheShiKTsgYS5IRUFQVTMyID0gTCA9IG5ldyBVaW50MzJBcnJheShiKTsgYS5IRUFQRjMyID0gbmV3IEZsb2F0MzJBcnJheShiKTsgYS5IRUFQRjY0ID0gbmV3IEZsb2F0NjRBcnJheShiKTsgfVxuICAgICAgICB2YXIgYmEgPSBbXSwgY2EgPSBbXSwgZGEgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gZWEoKSB7IHZhciBiID0gYS5wcmVSdW4uc2hpZnQoKTsgYmEudW5zaGlmdChiKTsgfVxuICAgICAgICB2YXIgTiA9IDAsIE8gPSBudWxsLCBQID0gbnVsbDtcbiAgICAgICAgZnVuY3Rpb24gRihiKSB7IGlmIChhLm9uQWJvcnQpXG4gICAgICAgICAgICBhLm9uQWJvcnQoYik7IGIgPSBcIkFib3J0ZWQoXCIgKyBiICsgXCIpXCI7IEQoYik7IEggPSAhMDsgYiA9IG5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoYiArIFwiLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLlwiKTsgbihiKTsgdGhyb3cgYjsgfVxuICAgICAgICB2YXIgUSA9IFwiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LFwiLCBSO1xuICAgICAgICBSID0gXCJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsQUdGemJRRUFBQUFCOVFaeFlBSi9md0JnQTM5L2Z3Ri9ZQVIvZm45L0FYNWdBbjkvQVg5Z0FYOEJmMkFGZjM1L2YzOEJmbUFEZjM5L0FHQUVmMzkvZndGL1lBSi9mZ0YrWUFGL0FHQUZmMzkvZjM4QmYyQUJmQUY4WUFKL2ZnQmdBbjkvQVg1Z0FuOStBWDlnQTM5L2ZnRi9ZQU4vZm44QmZtQURmMzUvQUdBR2YzNS9mMzkvQVg1Z0JuOS9mMzkvZndGL1lBUi9mMzkvQUdBRGYzNS9BWDlnQm45K2ZuOS9md0YrWUFSL2YzNS9BWDlnQTM5K2ZnRitZQU4vZjM4QmZtQUZmMzkvZm40QmYyQUVmMzkvZmdGL1lBUi9mMzUrQVg5Z0JYOStmbjUrQUdBQmZ3RitZQU4vZm40QmYyQUVmMzkvZndGK1lBZC9mMzkvZjM5L0FYOWdCWDkvZjM5L0FYNWdBbng4QVh4Z0FBRi9ZQVYvZjM5L2Z3QmdCWDkrZjM1L0FYOWdCWDkrZm45L0FYNWdBWDRCZjJBRWYzNStmd0JnQjM5K2YzNStmbjhCZjJBSWYzOS9mMzkvZjM4QmYyQUZmMzUrZm44QmYyQUdmMzUvZm41L0FYOWdCSDkrZjM0QmZtQUVmMzUvZndCZ0JIOStmMzRBWUFaL2YzOS9mMzhCZm1BRWYzNStmd0YvWUFsL2YzOS9mMzkvZjM4QmYyQUVmMzUrZndGK1lBUi9mbjkvQVg5Z0EzOStmZ0JnQTM1L2Z3Ri9ZQVYvZm41L2Z3QmdBMzkvZmdGK1lBZC9mbjkvZjM5L0FYNWdBQUJnQTM5L2ZnQmdCSDkrZjM0QmYyQUZmMzkrZjM4QmYyQUVmMzUrZmdGL1lBZC9mMzkvZjM5L0FHQUNmSDhCZkdBQmZBRi9ZQU44Zkg4QmZHQUNmMzhCZkdBRWYzOStmd0JnQkg5K2ZuNEJmbUFCZmdGK1lBSi9mQUYvWUFaL2ZIOS9mMzhCZjJBQUFYeGdCWDkrZjM1L0FYNWdCbjkvZm41K2ZnRi9ZQUorZndCZ0FuOThBR0FFZjM5K2Z3RitZQVYvZjM5L2ZnRitZQWQvZm41K2YzOS9BWDVnQkg1K2ZuNEJmMkFIZjM5L2YzOS9mZ0YrWUFwL2YzOS9mMzkvZjM5L0FYOWdCMzkvZm41L2YzOEJmMkFGZjN4L2YzOEJmbUFDZm44QmYyQUdmSDkvZjM5L0FHQUZmMzUvZjM4QVlBVi9mMzUvZndCZ0JuOStmbjUrZndGL1lBVi9mMzUrZndGL1lBWi9mbjkvZjM4QmYyQURmM3gvQVg5Z0JYOStmMzkvQVg5Z0JYOS9mbjUrQVg1Z0JYOStmbjUrQVg5Z0JuOS9mbjUvZndGL1lBZC9mMzkrZm41L0FYOWdCSDkvZjM0QmZtQUNmSDhCZjJBR2YzOS9mMzkvQUdBSWYzOS9mMzkvZjM4QVlBTi9mbndCZm1BQUFYNWdBbng4QVg5Z0FuNStBWHhnQVg4QmZHQURmbjUrQVg5Z0EzOS9mQUJnQ0g5K2ZuNStmMzUrQVg1Z0NYOS9mMzkvZjM5L2Z3QUNXdzhCWVFGaEFCUUJZUUZpQURzQllRRmpBQWNCWVFGa0FBUUJZUUZsQUFNQllRRm1BQU1CWVFGbkFBY0JZUUZvQUFFQllRRnBBQW9CWVFGcUFBUUJZUUZyQUFZQllRRnNBQUFCWVFGdEFFb0JZUUZ1QUFRQllRRnZBQW9EeWduSUNRd0FBQVFBU3dZR0FBTW1BQWtCQUFBQlBDY3ZEQWtJRGdFSUF3QUJBdzBkSnc0T0JBWWVDUjRJRGdBR0F3OEJIZ1F3QXc4S0F6MEdDQUFRQXhVSEdBY0JCZ2NmS0FBRUJENEJDQVlHRFFZR0F3NEJEU1VBRUIwcEFRRS9DUWdxRHdFZEZRWVlURDRORHdvQUJ3UUpBd0VPQkJjeEF5QXlQdzREQUF3REFBZ0tCZ0VFRGhVR0NnUWVEdzRRQ1FaTkFUTUhBQVFQQmowUEFnY0dBMDRCRlRRbUVBUVFEaFVyQXdRQkF3OFBNaXhQVUFsQUV3b0tCQU1CR0FNT0NnY0lBVEVtQXl3REFUVVBMRkVBUVRZR0F6QURRQU1KR0FvUEFSQUlDUUVBQUZJRUpnRlRCQWtEVkFrS0lRTWZBUTRPQlFBR0JBTURBRlVBQ0FFQk56SUlEaWxXRUFBR0dRUlhPQXNIQVFBUEFBRUJCZ1FCQXdRS0JnUUJDUVlDR0FVRkFEVkNCQU1CRFFrSkFTSUlEZzhJUWlVNUFRTVhBUmdVQmdBS1dGa0hDdzBVUXlNRUN3WmFBQWNUQVFNRUV3TUlJQUZFQmdRSEFRQUVCd2NCQXdFRUFRTUVEaEFERTFzUEdRNE9HRVVBQ2dBQUVBNEJBUWtaQVFBRUF4a0hYQU1OSXlNbkJ3TURBRjB2QVNRQkZBWW5CUU1OWGdNQUtBa0VBd3NEQVFvRUJ3TUNCQUVMQVFvSUFBNWZLQVFCQXdNRER3RUpCd2tCQ2dBSEJ3TXpBd2NIQndRRERnTWVDQnhnQWlnRUF3SmhOQUFWUEFBSER3Y0tJUUVVRXhFQUN3QmlHUVlHQXdNVUNnTUFCQ2tCR0FnREZ3TUdHV01kQ0E0M0xUWUpEeFlIQWdnUUFBQURGQU5HRnd4a0dBb0pCbVVMRXhSbUt3b0pFeE1oS3pkbkJ3Y0RCQ3NEQmdFR0J3UUJCQUFCQUFFN0FnSUlCQVFCQVFvT0FRVW1CV2dOUjBjQkFRVnBBZ1FKREFFQUF3UURBUUVBQXdNSkF3RVRBd0VBQUFNVE13b1RGQTBKQVNFQ0F3RUJCd2dGQlM0QkR3WnFDQThRRUFoRk5RQUJBQUFBS1E4bEFRNElEd0VEQVFvSEVBUUFBUkFOQkFRRUNSRUpDUUFQRFFNREJBTUlEd0VERXdjRE1BRUJBd0FlTVFFQlNBRUhBeDlySHhBWEJnOFBLQlluQVRvWERnMERBQjhHQVFNc0JRVU5IeFVBRUFnWFJnQU5Bd1FkYkFBWkFBQnRDUlFHQUFFWkpRTUFBeUlnRFFNZEFnVTJBaThSQndnREZBUWhRVU1lS1IxdUFRc2pCQVFCRkFjVEF3UVRBZ29ISlJRSEV5VWhBQU1KQmdjaEF3TUJBd1FCQVFNZmJ3SUZCQUVDQWdJQ0FnSUNBZ0lDQlFVQ0FnSUNCUVVGQWdJQ0FnSUZCUVVDQWdJQ0VnSUNDd0lDQ3lNTEJRSUNCUUlGQWdVQ0FnVUNBZ2dDQWdJQ0VnSUNBZ1VDQWdJQ0FnSUVDUllXRmhZQ0FnSUNBZ0lDQWdJUUNBZ1NDQ0lDQWhFTUxTNFZLaFViR3hjU0FnVUZFQVVhQlFVRkJSSUNCVGtRRFEwTkRRME5EUTBERFEwQkFRRUJBUUVCQVFFQkJRVUJBZ0lDQWdVQ0JRVWtBZ2dGQWdnQ0pBSUdCU1FGRUJFa0RCRU1EQXdSREJJU0pCSUNBZ0lJQWdBU0JRSVNCUmtTQlJrQkFnSUVCUVVGQlFNQ0FRQUFFUXdSREF3TUVRd1JEQXdSREF3TUVRd0VFUXdSREJFTURCRU1FUXdxS2hVWEZRTUFBQUFTQVNBZ0lBa0JFZ1FKSkJrSkFBY0JDUWtEQXdFRkF3UURDZ01EQ25BVUFRRUVBd01CQTBSSUJBTUVBd0FBQUFBSkFpSWJHaHdJRmhZV0ZnSUNBZ0lGRmdJNkFnRUFTUUlMQ3dzTEVBc0xBUkFMQ3dzTEN3c2pDd3NMQ3dzTEFSQUVCd0lIQndvS0NnSUNCZ1lHQmdZR0JnWUdCZ0VGQWdJRkFnSUNCUUlDQWdJQ0JRVUZHQWdDQWdJQ0FnZ0lBZ0lDQWdVQ0JRRUNBZ0lDQlFJQ0JRSUNBZ0lDQWdJQ0JRVUNBZ0lGQWdJQ0N3UUZBWEFBbXdNRkJ3RUJnQUtBZ0FJR0NRRi9BVUdRM3NRQ0N3ZkFBandCY0FJQUFYRUF1d1FCY2dDeEFRRnpBS01JQVhRQWtnZ0JkUUNBQ0FGMkFQd0hBWGNBOXdjQmVBQ1lBd0Y1QUpnREFYb0E2Z2NCUVFEakJ3RkNBTmtIQVVNQTFRY0JSQURSQndGRkFNb0hBVVlBK2dZQlJ3RDVCZ0ZJQU5jSUFVa0ExZ2dCU2dDYkFRRkxBTlVJQVV3QTFBZ0JUUURUQ0FGT0FOSUlBVThBMFFnQlVBRFFDQUZSQU04SUFWSUF6Z2dCVXdETkNBRlVBTXdJQVZVQTl3VUJWZ0RMQ0FGWEFNb0lBVmdBeVFnQldRRElDQUZhQU1jSUFWOEF4Z2dCSkFERkNBSmhZUURFQ0FKaVlRRERDQUpqWVFEQ0NBSmtZUURCQ0FKbFlRREFDQUptWVFDL0NBSm5ZUUMrQ0FKb1lRQzlDQUpwWVFDc0NBSnFZUUNZQXdKcllRQ1lBd0pzWVFDN0NBSnRZUUM2Q0FKdVlRQzRDQUp2WVFDM0NBSndZUUMwQ0FKeFlRQ3pDQUp5WVFFQUFuTmhBTEVJQW5SaEFMQUlBblZoQUs4SUNic0dBUUJCQVF1YUEvY0lpd2IyQ05nRDJBT3lCNmdIb0FlWEI0MEhqQWYwQlA0Ry9RYjhCdnNHK0FiQ0J0VUp2UW1wQ1p3SnJnT1FDWThKbHdhSkNlNEk2Z2pwQ0pnRTZBam5DUHdGNWdqbENPUUk0d2o2QmVJSTRRamdDTjhJM2dqNUJkMEkzQWpiQ05vSTJRallDUE1FOHdlOENMa0l0Z2kxQ09zSTlBU3lDTlVGcmdpdENLY0lxQWltQ0tVSXBBajBCNDRKalFtS0NZZ0pqQW53Qi9FSDdnZnJCK1FINGdmaEI5TUh3UWVhQi9FRXZBbWJDWm9KbVFtWUNaY0psZ21WQ1pRSmt3bVNDWkVKaXdudENPd0luUWljQ0pzSW1naVpDS0FGbUFpWENKWUlsUWlVQ0pNSWtRaVFDSThJamdpTkNJd0lpd2lLQ0lrSWlBaUhDSVlJNlFPRkNPa0RoQWlEQ0lJSWdRaWVDS0VJb0FpZkNLSUkyUVAvQi80SGtRZVFCNWtIbUFlV0I1VUhsQWVUQjVJSDRBZmZCOTRINlFQZEI2QUYzQWZiQjlvSDJBZXJDS29JcVFqL0Jvb0hpUWVJQjRjSGhnZUZCNFFIZ3dlQ0I0RUhnQWZvQjRzSGp3ZU9CNXNIcEFlaEI2TUhvZ2VmQjU0SG5RZWNCNlVINXdmbUIrVUgvZ0hzQitrSDdRZnZCL0lIOVFiUEJQUUc4d2J5QnZFR3lBVHdCdThHOXdiUkJQWUc5Z2YxQi9zSCtnZjVCL2dIL1Flb0NlTUdwd25tQnFZSnBRbWtDYU1KNFFiZkJzWUVvZ21oQ2FBSnNRYWZDWjRKblFtd0JySUpzUW13Q2E4SnJnbXRDYXdKcXdtcUNiZ0puUU8zQ2JZSnRRbTBDYk1KeGduSkI4Z0h4UW5FQ2NNSndnbldBOEVKd0FuM0JQZ0V2d20rQ2JzSnVnbTVDY2tKeUFuSENkQUp6d205Qkx3RXpnbk5DY3dKeXduS0NiUUcxQW5UQ2RJSjBRbTRCcmNHdGdhMUJyb0d1UWE5QnJ3R3V3YlNCdEVHMEFiUEJzNEd6UWJNQnNzR3lnYkpCc2dHeHdiR0JzVUd4QWJEQnNFR3dBYS9CcjRHMHdiY0JvQUorZ2o3Q05zR2d3bUVDWUVKblFUK0NQa0k2d1BNQXRvRzlRanhDTzhJMlFiNENQUUk4QWlDQ2Y4SS9RaVhBcWNEMWdueUNQd0kyQWJYQnRZRzFRYlVCdWdHNXdibEJ1UUc0Z2JnQnQ0RzNRYnJCdW9HNlFidEJ1d0c3Z2FwQjZjSHBnZlBCNEVGMXdlQUJjNEh6UWZNQjhzSHh3ZkdCOFVIeEFmREI4SUh3QWUvQjlJSDBBZldCOVFIdEFlekI3RUhzQWV2QjY0SHJRZXNCNnNIcWdlK0I3MEh2QWU3QjdvSHVRZTRCN2NIdGdlMUI0Y0poUW1HQ2RnRDh3Z0sxNVlYeUFrMUFRRi9Ba0FnQVVJZ2lLZEJkVWtOQUNBQnB5SUNJQUlvQWdBaUFrRUJhellDQUNBQ1FRRktEUUFnQUNnQ0VDQUJFSllFQ3d0TkFRSi9JQUFvQWtBaUFrR0FBbW9oQXlBQ0tBS2NBaUFBS0FJRVJ3UkFJQU5Cd2dFUUVTQURJQUFvQWdRUUhTQUNJQUFvQWdRMkFwd0NDeUFDSUFJb0FvUUNOZ0tZQWlBRElBRVFFUXNtQVFGL0l3QkJFR3NpQWlRQUlBSWdBVG9BRHlBQUlBSkJEMnBCQVJCeUlBSkJFR29rQUF2L0Z3SUdmd0orSXdCQkVHc2lBaVFBQW44Q1FDQUFLQUlBS0FJUUtBSjRJQUpMQkVBZ0FFR05Ja0VBRUJZTUFRc2dBQ0FBUVJCcUlnUVEvd0VnQUNBQUtBSTRJZ0UyQWpRZ0FpQUJOZ0lNSUFCQkFEWUNNQ0FBSUFBb0FoUTJBZ1FEUUNBQUlBRTJBaGdnQUNBQUtBSUlJZ00yQWhRQ1FBSkFBa0FDUUFKQUFrQUNRQUovQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FTd0FBQ0lGUWY4QmNTSUdEbjBBRnhjWEZ4Y1hGeGNFQXdRRUFoY1hGeGNYRnhjWEZ4Y1hGeGNYRnhjWEZ3UVNHZ2dIREJNYUZ4Y0xEUmNPQ1FVS0hSMGRIUjBkSFIwZEZ4Y1BFUkFXRndjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NIRndZWEZBY0JCd2NIQndjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NIQndjSEJ3Y1hGUmNMUVFBaEJTQUJJQUFvQWp4SkRSZ2dCRUdzZnpZQ0FBd2dDeUFBSUFGQkFXb1F6d01OSFNBQ0lBQW9BamcyQWd3TUh3c2dBVUVCYWlBQklBRXRBQUZCQ2tZYklRRUxJQUlnQVVFQmFqWUNEQXdlQ3lBQ0lBRkJBV28yQWd3TUhnc0NRQUpBSUFFdEFBRWlBMEVxUndSQUlBTkJMMFlOQVNBRFFUMUhEUUlnQWlBQlFRSnFOZ0lNSUFSQmhuODJBZ0FNSGdzZ0FpQUJRUUpxSWdFMkFnd0RRQUpBQWtBQ1FBSkFBa0FDUUNBQkxRQUFJZ05CQ21zT0JBRURBd0lBQ3lBRFFTcEhCRUFnQXcwRElBRWdBQ2dDUEVrTkJDQUFRZFVzUVFBUUZnd2lDeUFCTFFBQlFTOUhEUU1nQWlBQlFRSnFOZ0lNRENVTElBQkJBVFlDTUNBQUlBQW9BZ2hCQVdvMkFnZ2dBaUFCUVFGcU5nSU1EQU1MSUFCQkFUWUNNQ0FDSUFGQkFXbzJBZ3dNQWdzZ0E4QkJBRTROQUNBQlFRWWdBa0VNYWhCWUlnRkJmbkZCcU1BQVJnUkFJQUJCQVRZQ01Bd0NDeUFCUVg5SERRRWdBaUFDS0FJTVFRRnFOZ0lNREFFTElBSWdBVUVCYWpZQ0RBc2dBaWdDRENFQkRBQUxBQXNnQVVFQ2FpRUJRUUFNRndzZ0FpQUJRUUZxTmdJTUlBUkJMellDQUF3YkMwSGNBQ0VGSUFFdEFBRkI5UUJIRFJJZ0FpQUJRUUZxTmdJRUlBSkJCR3BCQVJENUFTSUdRUUJJRFJJZ0JoRHZBa1VORWlBQ0lBSW9BZ1EyQWd3Z0FrRUJOZ0lJREJjTElBSkJBRFlDQ0NBQ0lBRkJBV28yQWd3TUZnc2dBaUFCUVFKcU5nSUVRZHdBSVFNQ1FDQUJMUUFCSWdWQjNBQkdCRUFnQVMwQUFrSDFBRWNOQVNBQ1FRUnFRUUVRK1FFaEF3d0JDeUFGSWdQQVFRQk9EUUFnQVVFQmFrRUdJQUpCQkdvUVdDRURDeUFERU84Q1JRUkFJQUJCeE9jQVFRQVFGZ3dYQ3lBQ0lBSW9BZ1EyQWd3Z0FDQUNRUXhxSUFKQkNHb2dBMEVCRU9vRUlnRkZEUllnQUVHcmZ6WUNFQ0FBSUFFMkFpQU1HQXRCTGlFRklBRXRBQUVpQTBFdVJ3ME9JQUV0QUFKQkxrY05EeUFDSUFGQkEybzJBZ3dnQkVHbmZ6WUNBQXdYQ3lBQkxRQUJRVHByUVhaSkRSSWdBQ2dDUUMwQWJrRUJjVVVORWlBQVFmdnNBRUVBRUJZTUZBdEJLaUVGSUFFdEFBRWlBMEVxUndSQUlBTkJQVWNORGlBQ0lBRkJBbW8yQWd3Z0JFR0ZmellDQUF3V0N5QUJMUUFDUVQxR0JFQWdBaUFCUVFOcU5nSU1JQVJCa1g4MkFnQU1GZ3NnQWlBQlFRSnFOZ0lNSUFSQnBYODJBZ0FNRlF0QkpTRUZJQUV0QUFGQlBVY05EQ0FDSUFGQkFtbzJBZ3dnQkVHSGZ6WUNBQXdVQzBFcklRVWdBUzBBQVNJRFFTdEhCRUFnQTBFOVJ3ME1JQUlnQVVFQ2FqWUNEQ0FFUVloL05nSUFEQlFMSUFJZ0FVRUNhallDRENBRVFaWi9OZ0lBREJNTFFTMGhCU0FCTFFBQklnWkJMVWNFUUNBR1FUMUhEUXNnQWlBQlFRSnFOZ0lNSUFSQmlYODJBZ0FNRXdzQ1FDQUFLQUpJUlEwQUlBRXRBQUpCUGtjTkFDQUFLQUlFSUFOSERRMExJQUlnQVVFQ2FqWUNEQ0FFUVpWL05nSUFEQklMQWtBQ1FBSkFJQUV0QUFFaUEwRThhdzRDQVFBQ0N5QUNJQUZCQW1vMkFnd2dCRUdiZnpZQ0FBd1RDeUFCTFFBQ1FUMUdCRUFnQWlBQlFRTnFOZ0lNSUFSQmluODJBZ0FNRXdzZ0FpQUJRUUpxTmdJTUlBUkJsMzgyQWdBTUVndEJQQ0VGSUFOQklVY05DU0FBS0FKSVJRMEpJQUV0QUFKQkxVY05DU0FCTFFBRFFTMUdEUXNNQ1F0QlBpRUZBa0FDUUNBQkxRQUJRVDFyRGdJQUFRb0xJQUlnQVVFQ2FqWUNEQ0FFUVoxL05nSUFEQkVMQWtBQ1FBSkFJQUV0QUFKQlBXc09BZ0VBQWdzZ0FTMEFBMEU5UmdSQUlBSWdBVUVFYWpZQ0RDQUVRWXgvTmdJQURCTUxJQUlnQVVFRGFqWUNEQ0FFUVpsL05nSUFEQklMSUFJZ0FVRURhallDRENBRVFZdC9OZ0lBREJFTElBSWdBVUVDYWpZQ0RDQUVRWmgvTmdJQURCQUxRVDBoQlFKQUFrQWdBUzBBQVVFOWF3NENBQUVKQ3lBQkxRQUNRVDFHQkVBZ0FpQUJRUU5xTmdJTUlBUkJuMzgyQWdBTUVRc2dBaUFCUVFKcU5nSU1JQVJCbm44MkFnQU1FQXNnQWlBQlFRSnFOZ0lNSUFSQnBuODJBZ0FNRHd0QklTRUZJQUV0QUFGQlBVY05CaUFCTFFBQ1FUMUdCRUFnQWlBQlFRTnFOZ0lNSUFSQm9YODJBZ0FNRHdzZ0FpQUJRUUpxTmdJTUlBUkJvSDgyQWdBTURndEJKaUVGSUFFdEFBRWlBMEVtUndSQUlBTkJQVWNOQmlBQ0lBRkJBbW8yQWd3Z0JFR05mellDQUF3T0N5QUJMUUFDUVQxR0JFQWdBaUFCUVFOcU5nSU1JQVJCa244MkFnQU1EZ3NnQWlBQlFRSnFOZ0lNSUFSQm9uODJBZ0FNRFFzQ1FDQUJMUUFCSWdOQjNnQkhCRUFnQTBFOVJ3MEJJQUlnQVVFQ2FqWUNEQ0FBS0FKQUxRQnVRUVJ4QkVBZ0JFR1FmellDQUF3UEN5QUVRWTUvTmdJQURBNExJQUV0QUFKQlBVWUVRQ0FDSUFGQkEybzJBZ3dnQkVHT2Z6WUNBQXdPQ3lBQ0lBRkJBbW8yQWd3Z0JFSGVBRFlDQUF3TkN5QUNJQUZCQVdvMkFnd2dBQ2dDUUMwQWJrRUVjUVJBSUFSQnBIODJBZ0FNRFFzZ0JFSGVBRFlDQUF3TUMwSDhBQ0VGSUFFdEFBRWlBMEg4QUVjRVFDQURRVDFIRFFRZ0FpQUJRUUpxTmdJTUlBUkJqMzgyQWdBTURBc2dBUzBBQWtFOVJnUkFJQUlnQVVFRGFqWUNEQ0FFUVpOL05nSUFEQXdMSUFJZ0FVRUNhallDRENBRVFhTi9OZ0lBREFzTFFUOGhCU0FCTFFBQklnTkJMa2NFUUNBRFFUOUhEUU1nQVMwQUFrRTlSZ1JBSUFJZ0FVRURhallDRENBRVFaUi9OZ0lBREF3TElBSWdBVUVDYWpZQ0RDQUVRYWgvTmdJQURBc0xJQUV0QUFKQk1HdEIvd0Z4UVFwSkRRSWdBaUFCUVFKcU5nSU1JQVJCcVg4MkFnQU1DZ3NnQlVFQVRnMEJJQUZCQmlBQ1FReHFFRmdpQmtGK2NVR293QUJHQkVBZ0FDZ0NDQ0VEREFzTElBWVFod01OQ3lBR0VPOENCRUFnQWtFQU5nSUlEQWNMSUFCQjBjTUFRUUFRRmd3SEN5QURRVEJyUWY4QmNVRUtTUTBFQ3lBRUlBVkIvd0Z4TmdJQUlBSWdBVUVCYWpZQ0RBd0hDeUFBSUFaQkFTQUJRUUZxSUFRZ0FrRU1haER6QWtVTkJnd0VDMEVCQ3lFREEwQUNmd0pBQWtBQ1FBSkFJQU5GQkVBZ0FpQUJOZ0lNREFFTElBRXRBQUFpQTBVTkFnSkFJQU5CQ21zT0JBMEFBQTBBQ3lBRHdFRUFUZzBESUFGQkJpQUNRUXhxRUZnaUEwRitjVUdvd0FCR0RRd2dBaWdDRENFQklBTkJmMFlOQVF0QkFTRUREQVFMSUFGQkFXb01BZ3NnQVNBQUtBSThUdzBKQ3lBQlFRRnFDeUVCUVFBaEF3d0FDd0FMSUFBb0FrQXRBRzRoQXlBQVFTaHFJZ1ZCQURZQ0FBSkFJQUFvQWdBZ0FTQUNRUXhxUVFCQjlBWkI5QUFnQTBFRWNSc2dCUkMzQlNJSFFvQ0FnSUJ3Z3lJSVFvQ0FnSURBZmxJRVFDQUlRb0NBZ0lEZ0FGRU5BeUFDS0FJTVFRWWdBa0VJYWhCWUVNVUJSUTBCQ3lBQUtBSUFJQWNRRHlBQVFkWFZBRUVBRUJZTUFnc2dBQ0FITndNZ0lBQkJnSDgyQWhBTUF3c2dBQ0FDUVF4cUlBSkJDR29nQmtFQUVPb0VJZ0ZGRFFBZ0FDQUJOZ0lnSUFJb0FnZ2hCU0FBUVFBMkFpZ2dBQ0FGTmdJa0FrQWdBVUVsU1EwQUlBRkJMVTBFUUNBQUtBSkFJZ010QUc1QkFYRU5BU0FCUVMxSERRTWdBeThCYkNJR1FRRnhEUUVnQmtHQS9nTnhRWUFHUncwRElBTW9BbVFOQXlBREtBSUVJZ05GRFFNZ0F5MEFiRUVCY1EwQkRBTUxJQUZCTGtjTkFpQUFLQUpFRFFBZ0FDZ0NRQ0lETHdGc0lnWkJBbkVOQUNBR1FZRCtBM0ZCZ0FaSERRSWdBeWdDWkEwQ0lBTW9BZ1FpQTBVTkFpQURMUUJzUVFKeFJRMENDeUFGQkVBZ0FFR0RmellDRUNBQVFRRTJBaWdNQXdzZ0JDQUJRZFFBYXpZQ0FBd0NDeUFFUWFwL05nSUFEQVVMSUFSQmczODJBZ0FMSUFBZ0FpZ0NERFlDT0VFQURBUUxJQUJCQVRZQ01DQUFJQU5CQVdvMkFnZ0xJQUlvQWd3aEFRd0FDd0FMUVg4TElRRWdBa0VRYWlRQUlBRUxGUUFnQVVIZUFVNEVRQ0FBS0FJUUlBRVE2QVVMQzdvSEFnWi9BWDRqQUVFZ2F5SUhKQUJDZ0lDQWdPQUFJUXNDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQlFpQ0lweUlHUVFGcURnZ0RCUVVBQVFVRkNRSUxJQUFnQWtHSDFBQVFqd0VNQmdzZ0FDQUNRZmY0QUJDUEFRd0ZDeUFHUVhsR0RRRU1BZ3NnQWFjaEJnd0NDeUFCcHlFR0lBSkJBRWdFUUNBQ1FmLy8vLzhIY1NJRklBWXBBZ1FpQzZkQi8vLy8vd2R4VHcwQklBWkJFR29oQWlBQUFuOGdDMEtBZ0lDQUNJTlFSUVJBSUFJZ0JVRUJkR292QVFBTUFRc2dBaUFGYWkwQUFBdEIvLzhEY1JDZkF5RUxEQVVMSUFKQk1FY05BQ0FHS1FJRVF2Ly8vLzhIZ3lFTERBUUxJQUFnQVJDTkJLY2lCa1VOQWdzZ0FrSC8vLy8vQjNFaENRTkFJQVlvQWhBaUJVRXdhaUVLSUFVZ0JTZ0NHQ0FDY1VGL2MwRUNkR29vQWdBaEJRSkFBMEFnQlVVTkFTQUNJQW9nQlVFQmEwRURkQ0lGYWlJSUtBSUVSd1JBSUFnb0FnQkIvLy8vSDNFaEJRd0JDd3NnQmlnQ0ZDQUZhaUVGQWtBQ1FBSkFBa0FnQ0NnQ0FFRWVka0VCYXc0REFBRUNBd3NnQlNnQ0FDSUNSUTBHSUFJZ0FpZ0NBRUVCYWpZQ0FDQUFJQUt0UW9DQWdJQndoQ0FEUVFCQkFCQXZJUXNNQndzZ0JTZ0NBQ2dDRUNrREFDSUxRb0NBZ0lCd2cwS0FnSUNBd0FCUkJFQWdBQ0FDRU5rQkRBVUxJQXRDSUlpblFYVkpEUVlnQzZjaUFDQUFLQUlBUVFGcU5nSUFEQVlMSUFBZ0JpQUNJQVVnQ0JESUFrVU5BZ3dEQ3lBRktRTUFJZ3RDSUlpblFYVkpEUVFnQzZjaUFDQUFLQUlBUVFGcU5nSUFEQVFMQWtBZ0JpMEFCU0lGUVFSeFJRMEFJQVZCQ0hFRVFDQUNRUUJJQkVBZ0JpZ0NLQ0FKU3dSQUlBQWdCcTFDZ0lDQWdIQ0VJQWtRc0FFaEN3d0hDeUFHTHdFR1FTQnJRZi8vQTNGQjlmOERUdzBGREFJTElBWXZBUVpCRld0Qi8vOERjVUVLU3cwQklBQWdBaENlQXlJRlJRMEJRb0NBZ0lEZ0FFS0FnSUNBTUNBRlFRQklHeUVMREFVTElBQW9BaEFvQWtRZ0JpOEJCa0VZYkdvb0FoUWlCVVVOQUNBRktBSVVJZ2dFUUNBR0lBWW9BZ0JCQVdvMkFnQWdBQ0FHclVLQWdJQ0FjSVFpQVNBQ0lBTWdDQkV1QUNFTElBQWdBUkFQREFVTElBVW9BZ0FpQlVVTkFDQUdJQVlvQWdCQkFXbzJBZ0FnQUNBSElBYXRRb0NBZ0lCd2hDSUJJQUlnQlJFWEFDRUZJQUFnQVJBUElBVkJBRWdOQWlBRlJRMEFJQWN0QUFCQkVIRUVRQ0FBSUFjcEF4Z1FEeUFBSUFjcEF4QWdBMEVBUVFBUUx5RUxEQVVMSUFjcEF3Z2hDd3dFQ3lBR0tBSVFLQUlzSWdZTkFBdENnSUNBZ0RBaEN5QUVSUTBDSUFBZ0FoREhBZ3RDZ0lDQWdPQUFJUXNNQVF0Q2dJQ0FnREFoQ3dzZ0IwRWdhaVFBSUFzTERRQWdBQ0FCSUFKQkJCRE9BZ3RmQVFOL0l3QkJFR3NpQkNRQUlBQW9BZ0FoQXlBRUlBSTJBZ3dnQTBFRElBRWdBa0VBRVBBRklBTWdBeWdDRUNrRGdBRWdBQ2dDRENBQUtBSUlJQUFvQWtBaUFRUi9JQUVvQW1oQkFFZEJBWFFGUVFBTEVNb0NJQVJCRUdva0FBc01BQ0FBUVlBQ2FpQUJFQ29MS3dBZ0FVSGVBVTRFUUNBQUtBSVFLQUk0SUFGQkFuUnFLQUlBSWdBZ0FDZ0NBRUVCYWpZQ0FBc2dBUXNwQUNBQUlBRWdBaUFEUW9DQWdJQXdRb0NBZ0lBd0lBUkJnTTRBY2hCdElRSWdBQ0FERUE4Z0Fnc1pBQ0FBS0FJQUlBRVFHQ0VCSUFCQlFHc29BZ0FnQVJBNUN5MEJBWDhDUUNBQUtBSUFJZ0ZGRFFBZ0FDZ0NFQ0lBUlEwQUlBRW9BZ0FnQUVFQUlBRW9BZ1FSQVFBYUN3dGNBUUYvSUFCQlFHc29BZ0FpQXhEbUFrVUVRRUYvRHdzZ0FrRUFTQVJBSUFNUU1pRUNDeUFBSUFGQi93RnhFQkFnQUVGQWF5SUFLQUlBSUFJUU9TQUFLQUlBS0FLa0FpQUNRUlJzYWlJQUlBQW9BZ0JCQVdvMkFnQWdBZ3NtQVFGL0l3QkJFR3NpQWlRQUlBSWdBVFlDRENBQUlBSkJER3BCQkJCeUlBSkJFR29rQUFzNUFDQUJRUUJPQkVBZ0FFRzJBUkFRSUFCQlFHc2lBQ2dDQUNBQkVEa2dBQ2dDQUNJQUtBS2tBaUFCUVJSc2FpQUFLQUtFQWpZQ0JBc0xNd0VCZnlBQ0JFQWdBQ0VEQTBBZ0F5QUJMUUFBT2dBQUlBTkJBV29oQXlBQlFRRnFJUUVnQWtFQmF5SUNEUUFMQ3lBQUN4Z0JBWDRnQVNrREFDRURJQUVnQWpjREFDQUFJQU1RRHdzWEFDQUFJQUVnQWtLQWdJQ0FNQ0FESUFSQkFoRFlBUXZBQlFJQ2ZnWi9Jd0JCNEFCcklna2tBQ0FEUVFBZ0EwRUFTaHNoQ3dOQUlBb2dDMFpGQkVBZ0FDQUNJQXBCQkhScUlnTW9BZ0FRdEFVaEJpQURMUUFFSVFkQ2dJQ0FnREFoQkFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBTXRBQVVPQ2dFQ0FnVUhBd1FJQlFBR0N5QUFJQU1vQWdnUXRBVWhDQUorQWtBQ1FBSkFJQU1vQWd4QkFXb09Bd0lBQVFrTElBQWdBQ2tEd0FFaUJDQUlJQVJCQUJBVURBSUxJQUFnQUNnQ0tDa0RFQ0lFSUFnZ0JFRUFFQlFNQVFzZ0FDQUJJQWdnQVVFQUVCUUxJUVFnQUNBSUVCTWdCa0hRQVVZRVFFRUJJUWNNQ0FzZ0JrSFpBVWNOQjBFQUlRY01Cd3NDUUNBR1FkQUJSZ1JBUVFFaEJ3d0JDeUFHUWRrQlJ3MEFRUUFoQndzZ0FDQUJJQVpCQWlBRElBY1FsUU1hREFjTFFvQ0FnSUF3SVFVZ0F5Z0NDQVJBSUFrZ0F5Z0NBRFlDRUNBSlFTQnFJZ2hCd0FCQnpEd2dDVUVRYWhCT0dpQUFJQU1vQWdnZ0NFRUFRUXBCQ0NBRExRQUZRUUpHR3lBRExnRUdFSUlCSVFVTElBTW9BZ3dFUUNBSklBTW9BZ0EyQWdBZ0NVRWdhaUlJUWNBQVFjVThJQWtRVGhvZ0FDQURLQUlNSUFoQkFVRUxRUWtnQXkwQUJVRUNSaHNnQXk0QkJoQ0NBU0VFQ3lBQUlBRWdCa0tBZ0lDQU1DQUZJQVFnQjBHQU9uSVFiUm9nQUNBRkVBOGdBQ0FFRUE4TUJnc2dBeWtEQ0NJRVFvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBRVF2Ly8vLzhQZ3lFRURBVUxRb0NBZ0lEQWZpQUV1YjBpQkVLQWdJQ0F3SUdBL1A4QWZTQUVRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d5RUVEQVFMUW9DQWdJREFmaUFES1FNSUlnUkNnSUNBZ01DQmdQei9BSDBnQkVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNoQkF3REN5QUFJQUVnQmtFQ0lBTWdCeENWQXhvTUF3c1FBUUFMSUFNMUFnZ2hCQXNnQUNBQklBWWdCQ0FIRUJrYUN5QUFJQVlRRXlBS1FRRnFJUW9NQVFzTElBbEI0QUJxSkFBTE1nRUJmd0pBSUFGQ0lJaW5RWFZKRFFBZ0FhY2lBaUFDS0FJQUlnSkJBV3MyQWdBZ0FrRUJTZzBBSUFBZ0FSQ1dCQXNMQ3dBZ0FFR0FNVUVBRUJVTG9nSUNBbjRCZndKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQkJCeUFCUWlDSXB5SUVJQVJCQjJ0QmJra2JRUXRxRGhNRUFnTUlCZ0FBQUFBQUFRVUhBQUFBQUFFRkFBc2dBRUdWTUVFQUVCVkNnSUNBZ09BQUR3c2dCRUYxU1EwSUlBR25JZ0FnQUNnQ0FFRUJhallDQUF3SUN5QUFRU0VRZGlFQ0RBWUxJQUJCSWhCMklRSU1CUXNnQUVFa0VIWWhBZ3dFQ3lBQVFRUVFkaUVDREFNTElBQWdBRUVGRUhZaUFrRXdJQUduS1FJRVF2Ly8vLzhIZzBFQUVCa2FEQUlMSUFCQkJoQjJJUUlNQVFzZ0FFRUhFSFloQWd0Q2dJQ0FnT0FBSVFNZ0FrS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSK0lBUkJkVThFUUNBQnB5SUVJQVFvQWdCQkFXbzJBZ0FMSUFBZ0FpQUJFTnNCSUFJRlFvQ0FnSURnQUFzUEN5QUJDOWtCQWdKL0FYNUJmeUVDQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FCUWlDSXB5SURRUXRxRGhJSEJ3Y0ZBZ1VGQlFVRkJBQUJBUUVGQlFZRkN5QUJwMEVBUnc4TElBR25Ed3NnQWFjcEFnUWhCQ0FBSUFFUUR5QUVRdi8vLy84SGcwSUFVZzhMQUFzZ0FhY3NBQVVoQWlBQUlBRVFEeUFDUVFCT0R3c2dBMEVIYTBGdFRRUkFJQUZDZ0lDQWdNQ0JnUHovQUh4Qy8vLy8vLy8vLy8vL0FJTkNBWDFDZ0lDQWdJQ0FnUGovQUZRUEN5QUFJQUVRRDBFQklRSUxJQUlQQ3lBQnB5Z0NEQ0VDSUFBZ0FSQVBJQUpCLy8vLy93ZHFRWDVKQzZnRUFRdC9JQUFvQWdBaEJTTUFRUkJySWdnZ0FqWUNERUYvSVFrQ1FBTkFBa0FnQ0NBQ0lnTkJCR29pQWpZQ0RDQURLQUlBSWdkQmYwWU5BQ0FBS0FJRUlRb0RRQ0FCSWdRZ0NrNE5BeUFFSUFRZ0JXb2lEQzBBQUNJR1FRSjBJZzFCZ0xnQmFpMEFBR29pQVNBS1NnMERJQVpCd2dGR0JFQWdEQ2dBQVNFSkRBRUxDeUFHSUFkSEJFQWdCaUFIUWY4QmNVWWdCaUFIUVFoMlFmOEJjVVp5SUFZZ0IwRVFka0gvQVhGR2NrVWdCMEVZZGlBR1IzRWdCa1VnQjBHQUFrbHljZzBESUFBZ0JqWUNFQXNnQkVFQmFpRUVBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQU5RWU80QVdvdEFBQkJCV3NPR0FBSkFBa0pBUWtKQVFrSkFRRUJBZ0lDQWdRRkJnY0pBd2tMSUFRZ0JXb3RBQUFoQkNBSUlBTkJDR29pQWpZQ0RDQURLQUlFSWdOQmYwWUVRQ0FBSUFRMkFoUU1DUXNnQXlBRVJnMElEQWtMSUFRZ0JXb3ZBQUFoQkNBSUlBTkJDR29pQWpZQ0RDQURLQUlFSWdOQmYwWUVRQ0FBSUFRMkFoUU1DQXNnQXlBRVJnMEhEQWdMSUFBZ0JDQUZhaWdBQURZQ0dBd0dDeUFBSUFRZ0JXb2lBeWdBQURZQ0dDQUFJQU12QUFRMkFod01CUXNnQUNBRUlBVnFLQUFBTmdJZ0RBUUxJQUFnQkNBRmFpSURLQUFBTmdJZ0lBQWdBeTBBQkRZQ0hBd0RDeUFBSUFRZ0JXb2lBeWdBQURZQ0lDQUFJQU12QUFRMkFod01BZ3NnQUNBRUlBVnFJZ01vQUFBMkFpQWdBQ0FES0FBRU5nSVlJQUFnQXkwQUNEWUNIQXdCQ3dzZ0FDQUpOZ0lNSUFBZ0FUWUNDRUVCSVFzTElBc0xDd0FnQUNBQlFRQVFqZ1FMSkFFQmZ5QUFLQUlRSWdKQkVHb2dBU0FDS0FJQUVRTUFJZ0ZGQkVBZ0FCQjhDeUFCQ3lZQkFYOGpBRUVRYXlJQ0pBQWdBaUFCT3dFT0lBQWdBa0VPYWtFQ0VISWdBa0VRYWlRQUN5a0JBWDhnQWdSQUlBQWhBd05BSUFNZ0FUb0FBQ0FEUVFGcUlRTWdBa0VCYXlJQ0RRQUxDeUFBQ3o4QkFYOGpBRUVRYXlJQ0pBQUNmeUFCSUFBb0FoQkhCRUFnQWlBQk5nSUFJQUJCb0pnQklBSVFGa0YvREFFTElBQVFFZ3NoQUNBQ1FSQnFKQUFnQUFzTEFDQUFJQUZCQVJEbUJRdkRDZ0lGZnc5K0l3QkI0QUJySWdVa0FDQUVRdi8vLy8vLy96K0RJUXdnQWlBRWhVS0FnSUNBZ0lDQWdJQi9neUVLSUFKQy8vLy8vLy8vUDRNaURVSWdpQ0VPSUFSQ01JaW5RZi8vQVhFaEJ3SkFBa0FnQWtJd2lLZEIvLzhCY1NJSlFmLy9BV3RCZ29CK1R3UkFJQWRCLy84QmEwR0JnSDVMRFFFTElBRlFJQUpDLy8vLy8vLy8vLy8vQUlNaUMwS0FnSUNBZ0lEQS8vOEFWQ0FMUW9DQWdJQ0FnTUQvL3dCUkcwVUVRQ0FDUW9DQWdJQ0FnQ0NFSVFvTUFnc2dBMUFnQkVMLy8vLy8vLy8vLy84QWd5SUNRb0NBZ0lDQWdNRC8vd0JVSUFKQ2dJQ0FnSUNBd1AvL0FGRWJSUVJBSUFSQ2dJQ0FnSUNBSUlRaENpQURJUUVNQWdzZ0FTQUxRb0NBZ0lDQWdNRC8vd0NGaEZBRVFDQUNJQU9FVUFSQVFvQ0FnSUNBZ09ELy93QWhDa0lBSVFFTUF3c2dDa0tBZ0lDQWdJREEvLzhBaENFS1FnQWhBUXdDQ3lBRElBSkNnSUNBZ0lDQXdQLy9BSVdFVUFSQUlBRWdDNFFoQWtJQUlRRWdBbEFFUUVLQWdJQ0FnSURnLy84QUlRb01Bd3NnQ2tLQWdJQ0FnSURBLy84QWhDRUtEQUlMSUFFZ0M0UlFCRUJDQUNFQkRBSUxJQUlnQTRSUUJFQkNBQ0VCREFJTElBdEMvLy8vLy8vL1AxZ0VRQ0FGUWRBQWFpQUJJQTBnQVNBTklBMVFJZ1liZVNBR1FRWjByWHluSWdaQkQyc1FaMEVRSUFacklRWWdCU2tEV0NJTlFpQ0lJUTRnQlNrRFVDRUJDeUFDUXYvLy8vLy8vejlXRFFBZ0JVRkFheUFESUF3Z0F5QU1JQXhRSWdnYmVTQUlRUVowclh5bklnaEJEMnNRWnlBR0lBaHJRUkJxSVFZZ0JTa0RTQ0VNSUFVcEEwQWhBd3NnQTBJUGhpSUxRb0NBL3Y4UGd5SUNJQUZDSUlnaUJINGlFQ0FMUWlDSUloTWdBVUwvLy8vL0Q0TWlBWDU4SWc5Q0lJWWlFU0FCSUFKK2ZDSUxJQkZVclNBQ0lBMUMvLy8vL3crRElnMStJaFVnQkNBVGZud2lFU0FNUWcrR0loSWdBMEl4aUlSQy8vLy8vdytESWdNZ0FYNThJaFFnRHlBUVZLMUNJSVlnRDBJZ2lJUjhJZzhnQWlBT1FvQ0FCSVFpREg0aUZpQU5JQk4rZkNJT0lCSkNJSWhDZ0lDQWdBaUVJZ0lnQVg1OEloQWdBeUFFZm53aUVrSWdobndpRjN3aEFTQUhJQWxxSUFacVFmLy9BR3NoQmdKQUlBSWdCSDRpR0NBTUlCTitmQ0lFSUJoVXJTQUVJQVFnQXlBTmZud2lCRmF0ZkNBQ0lBeCtmQ0FFSUFRZ0VTQVZWSzBnRVNBVVZxMThmQ0lFVnExOElBTWdESDRpQXlBQ0lBMStmQ0lDSUFOVXJVSWdoaUFDUWlDSWhId2dCQ0FDUWlDR2ZDSUNJQVJVclh3Z0FpQUNJQkFnRWxhdElBNGdGbFN0SUE0Z0VGYXRmSHhDSUlZZ0VrSWdpSVI4SWdKV3JYd2dBaUFDSUE4Z0ZGU3RJQThnRjFhdGZId2lBbGF0ZkNJRVFvQ0FnSUNBZ01BQWcxQkZCRUFnQmtFQmFpRUdEQUVMSUF0Q1A0Z2hBeUFFUWdHR0lBSkNQNGlFSVFRZ0FrSUJoaUFCUWorSWhDRUNJQXRDQVlZaEN5QURJQUZDQVlhRUlRRUxJQVpCLy84QlRnUkFJQXBDZ0lDQWdJQ0F3UC8vQUlRaENrSUFJUUVNQVFzQ2ZpQUdRUUJNQkVCQkFTQUdheUlIUWY4QVRRUkFJQVZCTUdvZ0N5QUJJQVpCL3dCcUlnWVFaeUFGUVNCcUlBSWdCQ0FHRUdjZ0JVRVFhaUFMSUFFZ0J4Q09BaUFGSUFJZ0JDQUhFSTRDSUFVcEF6QWdCU2tET0lSQ0FGS3RJQVVwQXlBZ0JTa0RFSVNFSVFzZ0JTa0RLQ0FGS1FNWWhDRUJJQVVwQXdBaEFpQUZLUU1JREFJTFFnQWhBUXdDQ3lBRVF2Ly8vLy8vL3orRElBYXRRakNHaEFzZ0NvUWhDaUFMVUNBQlFnQlpJQUZDZ0lDQWdJQ0FnSUNBZjFFYlJRUkFJQW9nQWtJQmZDSUJVSzE4SVFvTUFRc2dDeUFCUW9DQWdJQ0FnSUNBZ0grRmhGQkZCRUFnQWlFQkRBRUxJQW9nQWlBQ1FnR0RmQ0lCSUFKVXJYd2hDZ3NnQUNBQk53TUFJQUFnQ2pjRENDQUZRZUFBYWlRQUN5RUFJQUFnQVNBQ1FvQ0FnSUF3SUFNZ0JFRUNFTmdCSVFJZ0FDQUJFQThnQWd1bUFRRUVmeUFBUVFBMkFnUWdBVkFFUUNBQVFZQ0FnSUI0TmdJSUlBQkJBQkJCR2tFQUR3c0NRQ0FCUXYvLy8vOFBXQVJBSUFCQkFSQkJEUUVnQUNnQ0VDQUJJQUduWnlJQ3JZWStBZ0FnQUVFZ0lBSnJOZ0lJUVFBUEN5QUFRUUlRUVEwQUlBQW9BaEFpQXlBQnB5SUVJQUZDSUlpbklnVm5JZ0owTmdJQUlBTWdCU0FDZENBRVFTQWdBbXQyY2pZQ0JDQUFRY0FBSUFKck5nSUlRUUFQQ3lBQUVEVkJJQXQvQWdKL0FYNGdBVUlnaUtjaUF5QUJweUlDUVFCSWNrVUVRQ0FDUVlDQWdJQjRjZzhMSUFOQmVFWUVRQ0FBSUFBb0FoQWdBaERCQWhBWUR3c2dBQ0FCRUlNRUlnRkNnSUNBZ0hDRElnUkNnSUNBZ09BQVVRUkFRUUFQQ3lBRVFvQ0FnSUNBZjFFRVFDQUFLQUlRSUFFUWpRSVBDeUFBS0FJUUlBR25FUHdEQ3drQUlBQkJmeERJQXd0cUFRSi9Ba0FnQUNnQzJBSWlBMFVOQUNBQUtBTGdBaUlFSUFBb0F0d0NUZzBBSUFBb0F1Z0NJQUZMRFFBZ0FDZ0M1QUlnQWtZTkFDQURJQVJCQTNScUlnTWdBallDQkNBRElBRTJBZ0FnQUNBQk5nTG9BaUFBSUFSQkFXbzJBdUFDSUFBZ0FqWUM1QUlMQ3hBQUlBQWdBQ2dDS0NrRENFRUJFRWtMR1FBZ0FFRUFFRUVhSUFCQ2dJQ0FnUEQvLy8vL0FEY0NCQXVEQWdJRGZ3RitRb0NBZ0lEZ0FDRUVJQUFvQWhRRWZrS0FnSUNBNEFBRklBQW9BZ1FoQVNBQUtBSUlJZ0pGQkVBZ0FDZ0NBQ2dDRUNJQ1FSQnFJQUVnQWlnQ0JCRUFBQ0FBUVFBMkFnUWdBQ2dDQUVFdkVDMFBDeUFBS0FJTUlBSktCRUFnQUNnQ0FDZ0NFQ0lEUVJCcUlBRWdBaUFBS0FJUUlnRjBJQUZyUVJGcUlBTW9BZ2dSQVFBaUFVVUVRQ0FBS0FJRUlRRUxJQUFnQVRZQ0JBc2dBU0FBS0FJUUlnSUVmeUFDQlNBQklBQW9BZ2hxUVFBNkFCQWdBQ2dDRUF0QkgzU3RJQUVwQWdSQy8vLy8vM2VEaENJRU53SUVJQUVnQkVLQWdJQ0FlSU1nQURVQ0NFTC8vLy8vQjRPRU53SUVJQUJCQURZQ0JDQUJyVUtBZ0lDQWtIK0VDd3NVQVFGK0lBQWdBUkFvSVFJZ0FDQUJFQThnQWd0TEFRSi9JQUZDZ0lDQWdIQmFCSDhnQWFjaUF5OEJCaUlDUVExR0JFQkJBUThMSUFKQk1FWUVRQ0FES0FJZ0xRQVFEd3NnQUNnQ0VDZ0NSQ0FDUVJoc2FpZ0NFRUVBUndWQkFBc0xEQUFnQUVHQUFtb2dBUkFkQ3l3QkFYOGpBRUVRYXlJREpBQWdBeUFDTmdJTUlBQkIzQUJxUVlBQklBRWdBaERMQWhvZ0EwRVFhaVFBQzJrQkFuOENmeUFBS0FJSUlnSWdBQ2dDREU0RVFFRi9JQUFnQWtFQmFpQUJFTGNDRFFFYUlBQW9BZ2doQWdzZ0FDQUNRUUZxTmdJSUlBQW9BZ1JCRUdvaEF3SkFJQUFvQWhBRVFDQURJQUpCQVhScUlBRTdBUUFNQVFzZ0FpQURhaUFCT2dBQUMwRUFDd3MxQUNBQUlBSkJNQ0FDUVFBUUZDSUNRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBVUlBTndNQVFYOFBDeUFBSUFFZ0FoQ2pBUXNOQUNBQUlBRWdBa0VBRUlvREN4OEJBWDhnQUNnQ0pDSUJJQUVvQWdCQkFXbzJBZ0FnQUNBQlFRSVE3d1VMYVFFRGZ3SkFJQUFpQVVFRGNRUkFBMEFnQVMwQUFFVU5BaUFCUVFGcUlnRkJBM0VOQUFzTEEwQWdBU0lDUVFScUlRRWdBaWdDQUNJRFFYOXpJQU5CZ1lLRUNHdHhRWUNCZ29SNGNVVU5BQXNEUUNBQ0lnRkJBV29oQWlBQkxRQUFEUUFMQ3lBQklBQnJDeDhBSUFBZ0FTQUFJQUlRcWdFaUFpQURRWUNBQVJEUUFSb2dBQ0FDRUJNTFR3RUJmd0ovUVFBZ0FDZ0NEQ0FCUmcwQUdpQUFLQUlBSWdJb0FnQWdBQ2dDRUNBQlFRSjBJQUlvQWdRUkFRQWhBaUFCQkVCQmZ5QUNSUTBCR2dzZ0FDQUJOZ0lNSUFBZ0FqWUNFRUVBQ3dzb0FRRi9JQUpDSUlpblFYVlBCRUFnQXFjaUF5QURLQUlBUVFGcU5nSUFDeUFBSUFFZ0FoQnVDN0lFQVFoL0l3QkJJR3NpQnlRQUlBRWdBaUFCS0FJTUlBSW9BZ3hKSWdZYklnZ29BZ1FnQWlBQklBWWJJZ2tvQWdSeklRb0NRQUpBSUFnb0Fnd2lBa1VFUUFKQUlBa29BZ2dpQVVILy8vLy9CMGNFUUNBSUtBSUlJZ0pCLy8vLy93ZEhEUUVMSUFBUU5VRUFJUUlNQXdzZ0FVSCsvLy8vQjBjZ0FrSCsvLy8vQjBkeFJRUkFBa0FnQVVIKy8vLy9CMFlFUUNBQ1FZQ0FnSUI0UmcwQkRBUUxJQUZCZ0lDQWdIaEhJQUpCL3YvLy93ZEhjZzBEQ3lBQUVEVkJBU0VDREFNTElBQWdDaENKQVVFQUlRSU1BZ3NnQ1NnQ0RDSUdJUVVnQWlFQklBUkJCM0ZCQmtZRVFDQUNJQU5CSVdwQkJYWWlCU0FDSUFWSUd5RUJJQVlnQlNBRklBWktHeUVGQ3lBSUtBSVFJQUpCQW5ScUlBRkJBblJySVFzZ0NTZ0NFQ0FHUVFKMGFpQUZRUUowYXlFTUFuOENRQUpBQWtBZ0FVSGtBRThFUUVFQUlRWWdBQ2dDQUNBQUlBd2dCU0FMSUFFZ0FDQUpSaUlCUVFKeUlBRWdBQ0FJUmhzUW53WU5BUXdEQ3dKL0FrQWdBQ0FKUmcwQVFRQWhCaUFBSUFoR0RRQWdBQXdCQ3lBQUtBSUFJUUlnQjBJQU53SVlJQWRDZ0lDQWdJQ0FnSUNBZnpjQ0VDQUhJQUkyQWd3Z0FDRUdJQWRCREdvTElnSWdBU0FGYWhCQlJRMEJJQUloQUFzZ0FCQTFRU0FNQWdzZ0FpZ0NFQ0FNSUFVZ0N5QUJFSjRHSUFJaEFBc2dBQ0FLTmdJRUlBQWdDQ2dDQ0NBSktBSUlhallDQ0NBQUlBTWdCQkN6QWdzaEFpQUFJQWRCREdwSERRRWdCaUFIUVF4cUVLQUdEQUVMSUFBZ0NoQ01BVUVBSVFJTElBZEJJR29rQUNBQ0MwZ0FJQUFnQVVjRVFDQUFJQUVvQWd3UVFRUkFJQUFRTlVFZ0R3c2dBQ0FCS0FJRU5nSUVJQUFnQVNnQ0NEWUNDQ0FBS0FJUUlBRW9BaEFnQVNnQ0RFRUNkQkFmR2d0QkFBc1JBQ0FBSUFFZ0FpQURRWUNBQVJEUUFRc05BQ0FBSUFFZ0FrRUdFTTRDQ3dvQUlBQWdBVUVCRUVrTEhRQWdBQ0FCS1FNUUVBOGdBQ0FCS1FNWUVBOGdBQ0FCS1FNSUVBOExwZ0VCQTM4Z0FDZ0NFQ0lES0FMVUFTQUJwMEVBSUFGQy8vLy8vMjlXR3lJRVFZR0EzUEY1YkVILy82T09CbXNpQlVFZ0lBTW9Bc2dCYTNaQkFuUnFJUU1DUUFKQUEwQWdBeWdDQUNJREJFQUNRQ0FES0FJVUlBVkhEUUFnQXlnQ0xDQUVSdzBBSUFNb0FpQkZEUU1MSUFOQktHb2hBd3dCQ3dzZ0FDQUVRUUlReFFRaUF3MEJRb0NBZ0lEZ0FBOExJQU1nQXlnQ0FFRUJhallDQUFzZ0FDQURJQUlRN3dVTEpnRUJmd0pBSUFBb0FoQkJnMzlIRFFBZ0FDZ0NJQ0FCUncwQUlBQW9BaVJGSVFJTElBSUxPQUVCZndKQUFrQWdBVUtBZ0lDQWNGUU5BQ0FCcHlJREx3RUdJQUpIRFFBZ0F5Z0NJQ0lERFFFTElBQWdBaENHQTBFQUlRTUxJQU1MbFFVQ0EzOEJmZ0pBQWtBQ1FBSkFBa0FDUUFOQUlBSW9BaEFpQkVFd2FpRUZJQVFnQkNnQ0dDQURjVUYvYzBFQ2RHb29BZ0FoQkFOQUlBUkZEUVFnQXlBRklBUkJBV3RCQTNRaUJtb2lCQ2dDQkVjRVFDQUVLQUlBUWYvLy94OXhJUVFNQVFzTElBSW9BaFFnQm1vaEJTQUVLQUlBSVFZZ0FVVU5BU0FCUW9DQWdJQXdOd01ZSUFGQ2dJQ0FnREEzQXhBZ0FVS0FnSUNBTURjRENDQUJJQVpCR25aQkIzRWlCallDQUFKQUFrQUNRQUpBSUFRb0FnQkJIblpCQVdzT0F3QUJBZ01MSUFFZ0JrRVFjallDQUNBRktBSUFJZ0FFUUNBQUlBQW9BZ0JCQVdvMkFnQWdBU0FBclVLQWdJQ0FjSVEzQXhBTElBVW9BZ1FpQUVVTkNTQUFJQUFvQWdCQkFXbzJBZ0FnQVNBQXJVS0FnSUNBY0lRM0F4aEJBUThMSUFVb0FnQW9BaEFwQXdBaUIwS0FnSUNBY0lOQ2dJQ0FnTUFBVVEwRUlBZENJSWluUVhWUEJFQWdCNmNpQUNBQUtBSUFRUUZxTmdJQUN5QUJJQWMzQXdnTUNBc2dBQ0FDSUFNZ0JTQUVFTWdDUlEwQkRBWUxDeUFGS1FNQUlnZENJSWluUVhWUEJFQWdCNmNpQUNBQUtBSUFRUUZxTmdJQUN5QUJJQWMzQXdnTUJRdEJBU0VFSUFaQmdJQ0FnSHh4UVlDQWdJQjRSdzBDSUFVb0FnQW9BaEExQWdSQ0lJWkNnSUNBZ01BQVVnMENDeUFBSUFNUTJRRU1BZ3RCQUNFRUlBSXRBQVVpQlVFRWNVVU5BQ0FGUVFoeEJFQWdBMEVBVGcwQklBTkIvLy8vL3dkeElnTWdBaWdDS0NJRlNTRUVJQUZGSUFNZ0JVOXlEUUVnQVVLQWdJQ0FNRGNER0NBQlFvQ0FnSUF3TndNUUlBRkJCellDQUNBQklBQWdBcTFDZ0lDQWdIQ0VJQU1Rc0FFM0F3Z01Bd3NnQUNnQ0VDZ0NSQ0FDTHdFR1FSaHNhaWdDRkNJRlJRMEFJQVVvQWdBaUJVVU5BQ0FBSUFFZ0FxMUNnSUNBZ0hDRUlBTWdCUkVYQUNFRUN5QUVEd3RCZnc4TFFRRUxvUVFCQW44Q1FBSkFJQUZDZ0lDQWdIQlVJQUpDLy8vLy93OVdjZzBBSUFLbklnUWdBYWNpQXlnQ0tFOE5BQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0F5OEJCa0VDYXc0ZUFBc0xDd3NMQUFzTEN3c0xDd3NMQ3dzTEN3SUJBZ01FQlFZSENBa0tDd3NnQXlnQ0pDQUVRUU4wYWlrREFDSUJRaUNJcDBGMVNRMExJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FDQUJEd3NnQXlnQ0pDQUVhakFBQUVMLy8vLy9ENE1QQ3lBREtBSWtJQVJxTVFBQUR3c2dBeWdDSkNBRVFRRjBhaklCQUVMLy8vLy9ENE1QQ3lBREtBSWtJQVJCQVhScU13RUFEd3NnQXlnQ0pDQUVRUUowYWpVQ0FBOExJQU1vQWlRZ0JFRUNkR29vQWdBaUFFRUFUZ1JBSUFDdER3dENnSUNBZ01CK0lBQzR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkR3c2dBQ0FES0FJa0lBUkJBM1JxS1FNQUVJY0NEd3NnQUNBREtBSWtJQVJCQTNScUtRTUFFUHNERHd0Q2dJQ0FnTUIrSUFNb0FpUWdCRUVDZEdvcUFnQzd2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkR3dENnSUNBZ01CK0lBTW9BaVFnQkVFRGRHb3BBd0FpQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3OExJQUFnQWhBeElRTWdBQ0FDRUE4Z0EwVUVRRUtBZ0lDQTRBQVBDeUFBSUFFZ0F5QUJRUUFRRkNFQklBQWdBeEFUQ3lBQkN5b0JBWDhqQUVFUWF5SUVKQUFnQkNBRE5nSU1JQUFnQVNBQ0lBTVF5d0loQUNBRVFSQnFKQUFnQUF1TUFRRUNmeUFCS0FKOElnUkJnSUFFVGdSQUlBQkJqVHBCQUJCR1FYOFBDMEYvSVFNZ0FDQUJRZlFBYWtFUUlBRkIrQUJxSUFSQkFXb1FlQVIvUVg4RklBRWdBU2dDZkNJRFFRRnFOZ0o4SUFFb0FuUWdBMEVFZEdvaUEwSUFOd0lBSUFOQ0FEY0NDQ0FESUFBZ0FoQVlOZ0lBSUFNZ0F5Z0NERUdBLy8vL0IzSTJBZ3dnQVNnQ2ZFRUJhd3NMRFFBZ0FDQUJJQUpCQVJET0FndXJBZ0VFZndKQUlBSWdBMDhOQUNBRElBSnJJUVVnQVVFUWFpRUVJQUV0QUFkQmdBRnhCRUJCQUNFRElBVkJBQ0FGUVFCS0d5RUdJQVFnQWtFQmRHb2hBVUVBSVFJRFFDQUNJQVpHUlFSQUlBTWdBU0FDUVFGMGFpOEJBSEloQXlBQ1FRRnFJUUlNQVFzTEFrQWdBQ2dDQ0NBRmFpSUNJQUFvQWd3aUIwb0VRRUYvSVFRZ0FDQUNJQU1RdHdKRkRRRU1Bd3NnQUNnQ0VDQURRWUFDU0hJTkFFRi9JUVFnQUNBSEVQVUREUUlMQWtBZ0FDZ0NFRVVFUUVFQUlRSURRQ0FDSUFaR0RRSWdBQ2dDQkNBQUtBSUlJQUpxYWlBQklBSkJBWFJxTFFBQU9nQVFJQUpCQVdvaEFnd0FDd0FMSUFBb0FnUWdBQ2dDQ0VFQmRHcEJFR29nQVNBRlFRRjBFQjhhQ3lBQUlBQW9BZ2dnQldvMkFnaEJBQThMSUFBZ0FpQUVhaUFGRUlnQ0lRUUxJQVFMUndFQmZ5QUJRaUNJcDBGMVR3UkFJQUduSWdNZ0F5Z0NBRUVCYWpZQ0FBc2dBa0lnaUtkQmRVOEVRQ0FDcHlJRElBTW9BZ0JCQVdvMkFnQUxJQUFnQVNBQ1FRRVF2QUVMRndFQmYwRUlFTEVCSWdFRVFDQUJJQUEzQXdBTElBRUxHUUFnQVFSQUlBQWdBVUVRYTYxQ2dJQ0FnSkIvaEJBUEN3dUNBd0lFZndKK0FrQWdBQ2tEY0NJRlVFVWdCU0FBS1FONElBQW9BZ1FpQVNBQUtBSXNJZ0pyckh3aUJsZHhSUVJBSXdCQkVHc2lBaVFBUVg4aEFRSkFBbjhnQUNBQUtBSklJZ05CQVdzZ0EzSTJBa2dnQUNnQ0ZDQUFLQUljUndSQUlBQkJBRUVBSUFBb0FpUVJBUUFhQ3lBQVFRQTJBaHdnQUVJQU53TVFJQUFvQWdBaUEwRUVjUVJBSUFBZ0EwRWdjallDQUVGL0RBRUxJQUFnQUNnQ0xDQUFLQUl3YWlJRU5nSUlJQUFnQkRZQ0JDQURRUnQwUVI5MUN3MEFJQUFnQWtFUGFrRUJJQUFvQWlBUkFRQkJBVWNOQUNBQ0xRQVBJUUVMSUFKQkVHb2tBQ0FCSWdOQkFFNE5BU0FBS0FJRUlRRWdBQ2dDTENFQ0N5QUFRbjgzQTNBZ0FDQUJOZ0pvSUFBZ0JpQUNJQUZyckh3M0EzaEJmdzhMSUFaQ0FYd2hCaUFBS0FJRUlRRWdBQ2dDQ0NFQ0FrQWdBQ2tEY0NJRlVBMEFJQVVnQm4waUJTQUNJQUZyckZrTkFDQUJJQVduYWlFQ0N5QUFJQUkyQW1nZ0FDQUdJQUFvQWl3aUFDQUJhNng4TndONElBQWdBVThFUUNBQlFRRnJJQU02QUFBTElBTUxDUUFnQUVFQkVMWUJDMk1CQVg4Z0FrSWdpS2RCZFU4RVFDQUNweUlGSUFVb0FnQkJBV28yQWdBTEFrQWdBQ0FCSUFJUWl3VWlCUTBBQWtBZ0FTZ0NBQ0lBUVFCSUJFQWdBQ0FFYWlJQVFRQWdBRUVBU2hzaEF3d0JDeUFBSUFOTURRRUxJQUVnQXpZQ0FBc2dCUXZSQVFFR2Z5QUFRUUZxSVFVQ1FBSkFJQUF0QUFBaUE4QWlCMEVBVGdSQUlBVWhBUXdCQzBGL0lRUWdCMEZBYTBIL0FYRWlBMEU5U3cwQklBTkJBblJCNUo4RWFpZ0NBQ0lHSUFGT0RRRWdCa0VCYXlFSUlBQWdCbXBCQVdvaEFTQUhJQVpCd3A4RWFpMEFBSEVoQTBFQUlRQURRQ0FBSUFaSEJFQWdCU3dBQUNJRVFiOS9TZ1JBUVg4UEJTQUVRVDl4SUFOQkJuUnlJUU1nQUVFQmFpRUFJQVZCQVdvaEJRd0NDd0FMQzBGL0lRUWdBeUFJUVFKMFFkQ2ZCR29vQWdCSkRRRUxJQUlnQVRZQ0FDQURJUVFMSUFRTExRQWdBVUtBZ0lDQVlJTkNnSUNBZ0NCUkJFQWdBRUc3MFFCQkFCQVZRb0NBZ0lEZ0FBOExJQUFnQVJBb0MwRUJBWDhnQVFSQUEwQWdBaUFEUmtVRVFDQUFJQUVnQTBFRGRHb29BZ1FRRXlBRFFRRnFJUU1NQVFzTElBQW9BaEFpQUVFUWFpQUJJQUFvQWdRUkFBQUxDeGdBSUFBdEFBQkJJSEZGQkVBZ0FTQUNJQUFRdWdRYUN3c0xBQ0FBSUFGQkFCRG1CUXV1QWdBQ1FBSkFBa0FDUUNBQ1FRTk1CRUFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQVVIWUFHc09DUUFCQWdNRUJRWUhDQW9MSUFBZ0FrRTdhMEgvQVhFUUVROExJQUFnQWtFM2EwSC9BWEVRRVE4TElBQWdBa0V6YTBIL0FYRVFFUThMSUFBZ0FrRXZhMEgvQVhFUUVROExJQUFnQWtFcmEwSC9BWEVRRVE4TElBQWdBa0VuYTBIL0FYRVFFUThMSUFBZ0FrRWphMEgvQVhFUUVROExJQUFnQWtFZmEwSC9BWEVRRVE4TElBQWdBa0ViYTBIL0FYRVFFUThMSUFKQi93RkxEUUVDUUFKQUFrQWdBVUhZQUdzT0F3QUJBZ1FMSUFCQndnRVFFUXdGQ3lBQVFjTUJFQkVNQkFzZ0FFSEVBUkFSREFNTElBRkJJa1lOQVFzZ0FDQUJRZjhCY1JBUklBQWdBa0gvL3dOeEVDb1BDeUFBSUFKQkVtdEIvd0Z4RUJFUEN5QUFJQUpCL3dGeEVCRUxJUUFnQVNBQ1JnUkFJQUVRR3c4TElBQWdBVUVFYTYxQ2dJQ0FnUEIraEJBUEN5d0JBWDhnQUNnQ0VDSUNRUkJxSUFFZ0FpZ0NBQkVEQUNJQ0JFQWdBa0VBSUFFUUt3OExJQUFRZkNBQ0N4d0JBWDhnQUNBQkVEZ0VmMEVBQlNBQVFadk1BRUVBRUJWQmZ3c0xRd0VEZndKQUlBSkZEUUFEUUNBQUxRQUFJZ1FnQVMwQUFDSUZSZ1JBSUFGQkFXb2hBU0FBUVFGcUlRQWdBa0VCYXlJQ0RRRU1BZ3NMSUFRZ0JXc2hBd3NnQXdzTkFDQUFJQUVnQVJBL0VKTUNDMjBCQVg4akFFR0FBbXNpQlNRQUlBUkJnTUFFY1NBQ0lBTk1ja1VFUUNBRklBRkIvd0Z4SUFJZ0Eyc2lBMEdBQWlBRFFZQUNTU0lCR3hBckdpQUJSUVJBQTBBZ0FDQUZRWUFDRUZzZ0EwR0FBbXNpQTBIL0FVc05BQXNMSUFBZ0JTQURFRnNMSUFWQmdBSnFKQUFMREFBZ0FFR0FBbW9nQVJBUkM3NEJBZ0YrQVg4Q1FBSkFJQUZDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUFvQWlnZ0FrRURkR29wQXdBaUEwSWdpS2RCZEVzTkFRd0NDeUFBSUFGQk95QUJRUUFRRkNJRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0F3OExJQU5DLy8vLy8yOVdEUUVnQUNBREVBOGdBQ0FCRUlBRElnUkZCRUJDZ0lDQWdPQUFEd3NnQkNnQ0tDQUNRUU4wYWlrREFDSURRaUNJcDBGMVNRMEJDeUFEcHlJRUlBUW9BZ0JCQVdvMkFnQUxJQUFnQXlBQ0VFa2hBU0FBSUFNUUR5QUJDM1VCQVg0Z0FDQUJJQVIrSUFJZ0EzNThJQU5DSUlnaUFpQUJRaUNJSWdSK2ZDQURRdi8vLy84UGd5SURJQUZDLy8vLy93K0RJZ0YrSWdWQ0lJZ2dBeUFFZm53aUEwSWdpSHdnQVNBQ2ZpQURRdi8vLy84UGczd2lBVUlnaUh3M0F3Z2dBQ0FGUXYvLy8vOFBneUFCUWlDR2hEY0RBQXRRQVFGK0FrQWdBMEhBQUhFRVFDQUJJQU5CUUdxdGhpRUNRZ0FoQVF3QkN5QURSUTBBSUFJZ0E2MGlCSVlnQVVIQUFDQURhNjJJaENFQ0lBRWdCSVloQVFzZ0FDQUJOd01BSUFBZ0FqY0RDQXRWQVFOL0lBRWdBa0VGZFNJRVN3UkFJQUFnQkVFQ2RHb29BZ0FoQXdzZ0FrRWZjU0lDQkg4Z0FTQUVRUUZxSWdSTEJIOGdBQ0FFUVFKMGFpZ0NBQVZCQUF0QkFYUWdBa0VmYzNRZ0F5QUNkbklGSUFNTEMyUUFBa0FDUUNBQlFRQklEUUFnQUNnQ3JBSWdBVXdOQUNBQUtBS2tBaUFCUVJSc2FpSUFJQUFvQWdBZ0Ftb2lBRFlDQUNBQVFRQklEUUVnQUE4TFFZVXBRYTc4QUVISXFBRkJsTlVBRUFBQUMwR21qZ0ZCcnZ3QVFjdW9BVUdVMVFBUUFBQUxZQUFnQUNBQklBSkNnSUNBZ0FoOFF2Ly8vLzhQV0FSK0lBSkMvLy8vL3crREJVS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElBTkJoNEFCRUwwQkN3d0FJQUJCaHZzQVFRQVFGUXNMQUNBQUlBRkJBUkRCQlF2U0VBSU1md0YrSXdCQkVHc2lDaVFBQWtBQ1FDQUJRdi8vLy85dldBUkFJQUFRSkF3QkN5QUdRWUF3Y1NJT1JTQUdJQVpCQ0hZaUVIRWdFRUYvYzNKQkIzRWlFVUVIUm5FaEVpQUdRWURBQUhFaERDQUNRZi8vLy84SGNTRU5JQUduSVFrQ1FBSkFBa0FDUUFKQUEwQWdDU2dDRUNJSFFUQnFJUWdnQnlBSEtBSVlJQUp4UVg5elFRSjBhaWdDQUNFSEFrQURRQ0FIUlEwQklBSWdDQ0FIUVFGclFRTjBJZ3RxSWdjb0FnUkhCRUFnQnlnQ0FFSC8vLzhmY1NFSERBRUxDeUFKS0FJVUlBdHFJUWdnQ2lBSE5nSU1JQXhGSUFjb0FnQWlDMEdBZ0lDQUFuRkZja1VFUUNBRFFpQ0lwMEYxVHdSQUlBT25JZ2NnQnlnQ0FFRUJhallDQUFzZ0FDQUtRUWhxSUFOQkFCRENBZzBJQW40Z0NpZ0NDQ0lIUVFCT0JFQWdCNjBNQVF0Q2dJQ0FnTUIrSUFlNHZTSURRb0NBZ0lEQWdZRDgvd0I5SUFOQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3lFRElBa29BaEFpQjBFd2FpRUlJQWNnQnlnQ0dDQUNjVUYvYzBFQ2RHb29BZ0FoQndKQUEwQWdCd1JBSUFnZ0IwRUJhMEVEZENJTGFpSUhLQUlFSUFKR0RRSWdCeWdDQUVILy8vOGZjU0VIREFFTEMwSDRnd0ZCcnZ3QVFkakdBRUhQSEJBQUFBc2dDU2dDRkNBTGFpRUlJQW9nQnpZQ0RDQUhLQUlBSVFzTElBdEJHbllpRHlBR0VKTURSUTBHSUE5Qk1IRWlEMEV3UmdSQUlBQWdDU0FDSUFnZ0J4RElBa1VOQWd3SUN5QUdRWUQwQUhGRkRRVWdEZ1JBSUFTbklnMUJBQ0FBSUFRUU9Cc2hBaUFGcHlJT1FRQWdBQ0FGRURnYklRd0NRQ0FMUVlDQWdJQjhjVUdBZ0lDQUJFY0VRRUYvSVFjZ0FDQUpJQXBCREdvUTFBRU5Dd0pBSUFvb0Fnd29BZ0JCZ0lDQWdIeHhRWUNBZ0lCNFJnUkFJQUFvQWhBZ0NDZ0NBQkRyQVF3QkN5QUFJQWdwQXdBUUR3c2dDaWdDRENJSElBY29BZ0JCLy8vL3Z3RnhRWUNBZ0lBRWNqWUNBQ0FJUWdBM0F3QU1BUXNnQzBHQWdJQWdjUTBBSUFaQmdCQnhCRUFnQWlBSUtBSUFSdzBKQ3lBR1FZQWdjVVVOQUNBTUlBZ29BZ1JIRFFnTElBWkJnQkJ4QkVBZ0NDZ0NBQ0lIQkVBZ0FDQUhyVUtBZ0lDQWNJUVFEd3NnQWtVZ0JFSWdpS2RCZFVseVJRUkFJQTBnRFNnQ0FFRUJhallDQUFzZ0NDQUNOZ0lBQ3lBR1FZQWdjVVVOQmlBSUtBSUVJZ0lFUUNBQUlBS3RRb0NBZ0lCd2hCQVBDeUFNUlNBRlFpQ0lwMEYxU1hKRkJFQWdEaUFPS0FJQVFRRnFOZ0lBQ3lBSUlBdzJBZ1FNQmdzZ0QwRWdSZzBFSUE5QkVFWUVRRUYvSVFjZ0FDQUpJQXBCREdvUTFBRU5DU0FJS0FJQUlnSUVRQ0FBSUFLdFFvQ0FnSUJ3aEJBUEN5QUlLQUlFSWdJRVFDQUFJQUt0UW9DQWdJQndoQkFQQ3lBS0tBSU1JZ0lnQWlnQ0FFSC8vLysvQTNFMkFnQWdDRUtBZ0lDQU1EY0RBQ0FLS0FJTUtBSUFJUXNNQlFzZ0RFVWdDMEdBZ0lEZ0FIRnlEUVJCQVNFSElBQWdBeUFJS1FNQUVGSkZEUVlNQ0FzZ0NrRUFOZ0lNSUFrdEFBVkJDSEZGRFFJZ0NTOEJCaUlIUVFKSERRRWdBa0VBVGcwQ0lBMGdDU2dDS0U4TkFpQVNSUVJBSUFBZ0NSQ1NBMFVOQVF3SEN3dEJBU0VISUF4RkRRWWdDU2dDSkNBTlFRTjBhaUVDSUFOQ0lJaW5RWFZQQkVBZ0E2Y2lCaUFHS0FJQVFRRnFOZ0lBQ3lBQUlBSWdBeEFnREFZTElBZEJGV3RCLy84RGNVRUtTdzBBQWtBQ1FDQUNRUUJPQkVBZ0FDQUNFTTBGSWdGQ2dJQ0FnSENESWhOQ2dJQ0FnREJSRFFOQmZ5RUhJQk5DZ0lDQWdPQUFVUTBJSUFBZ0FSRE1CU0lDUVFCSUJFQWdBQ0FCRUE4TUNRc2dBa1VFUUNBQUlBRVFEeUFBSUFaQnZoNFFieUVIREFrTFFRQWhCd0pBQWtBQ1FBSkFBa0JCQnlBQlFpQ0lweUlDSUFKQkIydEJia2tiSWdKQkMyb09Bd01CQWdBTElBSkJCMGNFUUNBQ0RRUWdBVUtBZ0lDQUNJTkNINGluSVFjTUJBc2dBVUtBZ0lDQXdJR0EvUDhBZkVJL2lLY2hCd3dEQ3lBQnB5SUNLQUlJUlEwQ0lBSW9BZ3hCZ0lDQWdIaEhJUWNNQWdzZ0FhY29BZ2doQnd3QkN5QUJweWdDQ0NFSEN5QUFJQUVRRHlBSFJRMEJJQUFnQmtIZkhoQnZJUWNNQ0FzZ0RTQUpLQUlnS0FJVUlBZEI1YVlCYWkwQUFIWkpEUUVMSUFBZ0JrSDlIaEJ2SVFjTUJnc2dEa1VnRVVFSFJuRkZCRUFnQUNBR1FiYzRFRzhoQnd3R0MwRUJJUWNnREVVTkJTQURRaUNJcDBGMVR3UkFJQU9uSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dBQ0FCSUEydElBTWdCaERYQVNFSERBVUxJQUFnQ1NBQ0lBTWdCQ0FGSUFZUWdRUWhCd3dFQ3lBTFFZQ0FnSUI4Y1VHQWdJQ0FlRVlFUUNBTUJFQWdDUzhCQmtFTFJnUkFJQUFnQXlBSUtBSUFLQUlRS1FNQUVGSkZEUVFMSUFnb0FnQW9BaEFoQWlBRFFpQ0lwMEYxVHdSQUlBT25JZ2NnQnlnQ0FFRUJhallDQUFzZ0FDQUNJQU1RSUFzZ0JrR0NCSEZCZ0FSSERRRkJmeUVISUFBZ0NTQUtRUXhxRU5RQkRRUWdDQ2dDQUNJSEtBSVFLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lBaUFDS0FJQVFRRnFOZ0lBSUFnb0FnQWhCd3NnQUNnQ0VDQUhFT3NCSUFnZ0FUY0RBQ0FLS0FJTUlnSWdBaWdDQUVILy8vKy9BM0UyQWdBTUFRc2dDMEdBZ0lDQUFuRUVRRUVCSVFJZ0RBUkFJQU5DSUlpblFYVlBCRUFnQTZjaUFpQUNLQUlBUVFGcU5nSUFDeUFBSUFrZ0F5QUdFTXNGSVFJTElBWkJnZ1J4UVlBRVJnUkFJQW9nQ1NnQ0VDSUdRVEJxTmdJTVFYOGhCeUFBSUFrZ0NrRU1haUFHS0FJd1FScDJRVDF4RUpFRERRVUxJQUloQnd3RUN5QU1CRUFnQUNBSUtRTUFFQThnQTBJZ2lLZEJkVThFUUNBRHB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFnZ0F6Y0RBQXNnQmtHQUJIRkZEUUJCZnlFSElBQWdDU0FLUVF4cUlBb29BZ3dvQWdCQkduWkJQWEVnQmtFQ2NYSVFrUU1OQXd0QmYwRUJJQUFnQ1NBS1FReHFJQkJCQlhFaUFFRi9jeUFLS0FJTUtBSUFRUnAyY1NBQUlBWnhjaENSQXhzaEJ3d0NDeUFBSUFaQjRla0FFRzhoQnd3QkMwRi9JUWNMSUFwQkVHb2tBQ0FIQy84QkFnSi9BWHdqQUVFUWF5SUVKQUFDUUNBQ1FpQ0lweUlEUVFKTkJFQWdBU0FDcDdjNUF3QkJBQ0VBREFFTElBTkJCMnRCYlUwRVFDQUJJQUpDZ0lDQWdNQ0JnUHovQUh3M0F3QkJBQ0VBREFFTEFuOGdBQ0FDRUkwQklnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFUUFBQUFBQUFENGZ5RUZRWDhNQVFzQ2ZBSkFBa0JCQnlBQ1FpQ0lweUlESUFOQkIydEJia2tiSWdOQkNtcEJBazhFUUNBRFFRZEdEUUlnQXcwQklBS250d3dEQ3lBQ3AwRUVhaUFFUVFocUVMVUZJQUFnQWhBUElBUXJBd2doQlVFQURBTUxFQUVBQ3lBQ1FvQ0FnSURBZ1lEOC93Qjh2d3NoQlVFQUN5RUFJQUVnQlRrREFBc2dCRUVRYWlRQUlBQUxYUUVDZnlNQVFSQnJJZ01rQUFKQUlBRkJnSUFCY1VVRVFDQUJRWUNBQW5GRkRRRWdBQ2dDRUNnQ2pBRWlBVVVOQVNBQkxRQW9RUUZ4UlEwQkN5QURRUUEyQWd3Z0FFRUVJQUpCQUJDU0JFRi9JUVFMSUFOQkVHb2tBQ0FFQzhZSkFnUi9CWDRqQUVId0FHc2lCaVFBSUFSQy8vLy8vLy8vLy8vL0FJTWhDUUpBQWtBZ0FWQWlCU0FDUXYvLy8vLy8vLy8vL3dDRElncENnSUNBZ0lDQXdQLy9BSDFDZ0lDQWdJQ0F3SUNBZjFRZ0NsQWJSUVJBSUFOQ0FGSWdDVUtBZ0lDQWdJREEvLzhBZlNJTFFvQ0FnSUNBZ01DQWdIOVdJQXRDZ0lDQWdJQ0F3SUNBZjFFYkRRRUxJQVVnQ2tLQWdJQ0FnSURBLy84QVZDQUtRb0NBZ0lDQWdNRC8vd0JSRzBVRVFDQUNRb0NBZ0lDQWdDQ0VJUVFnQVNFRERBSUxJQU5RSUFsQ2dJQ0FnSUNBd1AvL0FGUWdDVUtBZ0lDQWdJREEvLzhBVVJ0RkJFQWdCRUtBZ0lDQWdJQWdoQ0VFREFJTElBRWdDa0tBZ0lDQWdJREEvLzhBaFlSUUJFQkNnSUNBZ0lDQTRQLy9BQ0FDSUFFZ0E0VWdBaUFFaFVLQWdJQ0FnSUNBZ0lCL2hZUlFJZ1ViSVFSQ0FDQUJJQVViSVFNTUFnc2dBeUFKUW9DQWdJQ0FnTUQvL3dDRmhGQU5BU0FCSUFxRVVBUkFJQU1nQ1lSQ0FGSU5BaUFCSUFPRElRTWdBaUFFZ3lFRURBSUxJQU1nQ1lSUVJRMEFJQUVoQXlBQ0lRUU1BUXNnQXlBQklBRWdBMVFnQ1NBS1ZpQUpJQXBSR3lJSUd5RUtJQVFnQWlBSUd5SUxRdi8vLy8vLy96K0RJUWtnQWlBRUlBZ2JJZ0pDTUlpblFmLy9BWEVoQnlBTFFqQ0lwMEgvL3dGeElnVkZCRUFnQmtIZ0FHb2dDaUFKSUFvZ0NTQUpVQ0lGRzNrZ0JVRUdkSzE4cHlJRlFROXJFR2NnQmlrRGFDRUpJQVlwQTJBaENrRVFJQVZySVFVTElBRWdBeUFJR3lFRElBSkMvLy8vLy8vL1A0TWhCQ0FIUlFSQUlBWkIwQUJxSUFNZ0JDQURJQVFnQkZBaUJ4dDVJQWRCQm5TdGZLY2lCMEVQYXhCblFSQWdCMnNoQnlBR0tRTllJUVFnQmlrRFVDRURDeUFFUWdPR0lBTkNQWWlFUW9DQWdJQ0FnSUFFaENFQklBbENBNFlnQ2tJOWlJUWhCQ0FDSUF1RklRMENmaUFEUWdPR0lnSWdCU0FIUmcwQUdpQUZJQWRySWdkQi93QkxCRUJDQUNFQlFnRU1BUXNnQmtGQWF5QUNJQUZCZ0FFZ0Iyc1FaeUFHUVRCcUlBSWdBU0FIRUk0Q0lBWXBBemdoQVNBR0tRTXdJQVlwQTBBZ0Jpa0RTSVJDQUZLdGhBc2hDU0FFUW9DQWdJQ0FnSUFFaENFTUlBcENBNFloQ2dKQUlBMUNBRk1FUUVJQUlRTkNBQ0VFSUFrZ0NvVWdBU0FNaFlSUURRSWdDaUFKZlNFQ0lBd2dBWDBnQ1NBS1ZxMTlJZ1JDLy8vLy8vLy8vd05XRFFFZ0JrRWdhaUFDSUFRZ0FpQUVJQVJRSWdjYmVTQUhRUVowclh5blFReHJJZ2NRWnlBRklBZHJJUVVnQmlrREtDRUVJQVlwQXlBaEFnd0JDeUFKSUFwOElnSWdDVlN0SUFFZ0RIeDhJZ1JDZ0lDQWdJQ0FnQWlEVUEwQUlBbENBWU1nQkVJL2hpQUNRZ0dJaElRaEFpQUZRUUZxSVFVZ0JFSUJpQ0VFQ3lBTFFvQ0FnSUNBZ0lDQWdIK0RJUUVnQlVILy93Rk9CRUFnQVVLQWdJQ0FnSURBLy84QWhDRUVRZ0FoQXd3QkMwRUFJUWNDUUNBRlFRQktCRUFnQlNFSERBRUxJQVpCRUdvZ0FpQUVJQVZCL3dCcUVHY2dCaUFDSUFSQkFTQUZheENPQWlBR0tRTUFJQVlwQXhBZ0Jpa0RHSVJDQUZLdGhDRUNJQVlwQXdnaEJBc2dBcWRCQjNFaUJVRUVTNjBnQkVJOWhpQUNRZ09JaENJQ2ZDSURJQUpVclNBRVFnT0lRdi8vLy8vLy96K0RJQWV0UWpDR2hDQUJoSHdoQkFKQUlBVkJCRVlFUUNBRUlBTkNBWU1pQVNBRGZDSURJQUZVclh3aEJBd0JDeUFGUlEwQkN3c2dBQ0FETndNQUlBQWdCRGNEQ0NBR1FmQUFhaVFBQzkwQkFRSi9Ba0FnQVVLQWdJQ0FjRm9FUUNBQnB5RURBMEFDUUNBRExRQUZRUVJ4UlEwQUlBQW9BaEFvQWtRZ0F5OEJCa0VZYkdvb0FoUWlCRVVOQUNBRUtBSVFJZ1JGRFFBZ0F5QURLQUlBUVFGcU5nSUFJQUFnQTYxQ2dJQ0FnSENFSWdFZ0FpQUVFUlVBSVFJZ0FDQUJFQThnQWc4TElBTWdBeWdDQUVFQmFqWUNBQ0FBUVFBZ0F5QUNFRXdoQkNBQUlBT3RRb0NBZ0lCd2hCQVBJQVFOQWdKQUlBTXZBUVpCRld0Qi8vOERjVUVLU3cwQUlBQWdBaENlQXlJRVJRMEFJQVJCSDNVUEN5QURLQUlRS0FJc0lnTU5BQXNMUVFBaEJBc2dCQXROQVFKL0FuOGdBQ2dDQkNJRElBSnFJZ1FnQUNnQ0NFc0VmMEYvSUFBZ0JCREdBUTBCR2lBQUtBSUVCU0FEQ3lBQUtBSUFhaUFCSUFJUUh4b2dBQ0FBS0FJRUlBSnFOZ0lFUVFBTEdndEVBUUYvSUFKQy8vLy8vd2RZQkVBZ0FDQUJJQUlRVFE4TElBQWdBaEQ0QWlJRFJRUkFRb0NBZ0lEZ0FBOExJQUFnQVNBRElBRkJBQkFVSVFFZ0FDQURFQk1nQVF0akFRRi9JQUpDSUlpblFYVlBCRUFnQXFjaUJpQUdLQUlBUVFGcU5nSUFDd0pBSUFBZ0FTQUNFSkFGSWdBTkFDQUJLUU1BSWdKQ0FGTUVRQ0FCSUFJZ0JYd2lBamNEQUFzZ0FpQURXUVJBSUFRaUF5QUNXUTBCQ3lBQklBTTNBd0FMSUFBTFh3RURmeU1BUVNCcklnVWtBQ0FBS0FJQUlRWWdCVUlBTndJWUlBVkNnSUNBZ0lDQWdJQ0FmemNDRUNBRklBWTJBZ3dnQlVFTWFpSUhJQUlRdWdJaEJpQUFJQUVnQnlBRElBUVF5d0VoQUNBSEVCc2dCVUVnYWlRQUlBQWdCbklMRmdBZ0FDQUFLQUlvSUFGQkEzUnFLUU1BSUFFUVNRc3BBUUYvSUFKQ0lJaW5RWFZQQkVBZ0FxY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBRWdBaENZQVF0d0FRRi9JQVFnQXlnQ0FFb0VmeU1BUVJCcklnVWtBQ0FBSUFFb0FnQWdCQ0FES0FJQVFRTnNRUUp0SWdBZ0FDQUVTQnNpQUNBQ2JDQUZRUXhxRUtnQklnUUVmeUFESUFVb0Fnd2dBbTRnQUdvMkFnQWdBU0FFTmdJQVFRQUZRWDhMSVFBZ0JVRVFhaVFBSUFBRlFRQUxDMzRDQW44QmZpTUFRUkJySWdNa0FDQUFBbjRnQVVVRVFFSUFEQUVMSUFNZ0FTQUJRUjkxSWdKeklBSnJJZ0t0UWdBZ0FtY2lBa0hSQUdvUVp5QURLUU1JUW9DQWdJQ0FnTUFBaFVHZWdBRWdBbXV0UWpDR2ZDQUJRWUNBZ0lCNGNhMUNJSWFFSVFRZ0F5a0RBQXMzQXdBZ0FDQUVOd01JSUFOQkVHb2tBQXZkQXdFSmZ5QUJRUkJxSVFjQ1FBSkFBbjhDUUFKQUlBRW9BaEFpQkMwQUVBUkFJQUFvQWhBaUNDZ0MxQUVnQkNnQ0ZDQUNha0dCZ056eGVXd2dBMnBCZ1lEYzhYbHNJZ3RCSUNBSUtBTElBV3QyUVFKMGFpRUdBa0FEUUNBR0tBSUFJZ1ZGRFFFQ1FBSkFJQVVvQWhRZ0MwY05BQ0FGS0FJc0lBUW9BaXhIRFFCQkFDRUdJQVVvQWlBZ0JDZ0NJQ0lLUVFGcVJ3MEFBMEFnQmlBS1J3UkFJQVVnQmtFRGRDSUphaUlNS0FJMElBUWdDV29pQ1NnQ05FY05BaUFHUVFGcUlRWWdDU2dDTUNBTUtBSXdjMEdBZ0lBZ1NRMEJEQUlMQ3lBRklBcEJBM1JxSWdZb0FqUWdBa2NOQUNBR0tBSXdRUnAySUFOR0RRRUxJQVZCS0dvaEJnd0JDd3NnQlNnQ0hDSUNJQVFvQWh4SEJFQWdBQ0FCS0FJVUlBSkJBM1FRaVFJaUFrVU5CeUFCSUFJMkFoUWdBQ2dDRUNFSUN5QUZJQVVvQWdCQkFXbzJBZ0FnQnlBRk5nSUFJQWdnQkJDUkFnd0RDeUFFS0FJQVFRRkdEUUVnQUNBRUVNNEZJZ1JGRFFVZ0JFRUJPZ0FRSUFBb0FoQWdCQkNVQXlBQUtBSVFJQWNvQWdBUWtRSWdCeUFFTmdJQUN5QUVLQUlBUVFGSERRTUxRUUFnQUNBSElBRWdBaUFERU1NRURRRWFJQWNvQWdBaEJRc2dBU2dDRkNBRktBSWdRUU4wYWtFSWF3c1BDMEg4akFGQnJ2d0FRY3crUWRjYUVBQUFDMEVBQzVFQkFnTi9BWDRnQUNBQUtBTHNBU0lCUVFGck5nTHNBU0FCUVFGTUJIOUJBQ0VCSUFCQmtNNEFOZ0xzQVFKQUlBQW9BaEFpQWlnQ2tBRWlBMFVOQUNBQ0lBSW9BcFFCSUFNUkF3QkZEUUFnQUVHLzlnQkJBQkJHUVg4aEFTQUFLQUlRS1FPQUFTSUVRb0NBZ0lCd1ZBMEFJQVNuSWdBdkFRWkJBMGNOQUNBQUlBQXRBQVZCSUhJNkFBVUxJQUVGUVFBTEN5d0JBWDhnQUNnQ0VDSUJMUUNJQVVVRVFDQUJRUUU2QUlnQklBQkIvaHhCQUJCR0lBRkJBRG9BaUFFTEM1b0hBUWQvSXdCQjRBQnJJZ1FrQUNBRUlBRTJBbHdDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUEwQWdCQ0FDUVFGcklnRkJGR3hxSVFVRFFBSkFJQVFnQkNnQ1hDSURRUVJxTmdKY0FrQUNRQUpBQWtBQ1FDQURLQUlBSWdjT0NBQUJBZ01EQXdRSUJRc2dBa0VFVGcwUUlBUWdBMEVJYWpZQ1hDQURLQUlFSVFVZ0FDZ0NFQ0VESUFRZ0FrRVViR29pQVNBQUtBSU1OZ0lNSUFGQkFEWUNDQ0FCUWdBM0FnQWdBU0FEUWRjQUlBTWJOZ0lRSUFKQkFXb2hBaUFCSUFVUW9RWkZEUVlNQ1FzZ0FrRUVUZzBPSUFRZ0EwRUlhallDWENBREtBSUVJUVVnQUNnQ0VDRURJQVFnQWtFVWJHb2lBU0FBS0FJTU5nSU1JQUZCQURZQ0NDQUJRZ0EzQWdBZ0FTQURRZGNBSUFNYk5nSVFJQUpCQVdvaEFpQUJJQVVRcGdaRkRRVU1DQXNnQWtFRVRnME1JQVFnQTBFSWFqWUNYQ0FES0FJRUlRVWdBQ2dDRUNFRElBUWdBa0VVYkdvaUFTQUFLQUlNTmdJTUlBRkJBRFlDQ0NBQlFnQTNBZ0FnQVNBRFFkY0FJQU1iTmdJUUlBSkJBV29oQWlBQklBVVFyUU5GRFFRTUJ3c2dBa0VCVEEwS0lBSkJCRThOQ1NBQUtBSU1JUVlnQkNBQ1FSUnNhaUlESUFBb0FoQWlDRUhYQUNBSUd6WUNFQ0FESUFZMkFnd2dBMEVBTmdJSUlBTkNBRGNDQUNBRElBTkJLR3NpQmlnQ0NDQUdLQUlBSUFVb0FnZ2dCU2dDQUNBSFFRTnJFTnNDRFFVZ0JDQUNRUUpyUVJSc2FpSUNLQUlNSUFZb0FnaEJBQ0FDS0FJUUVRRUFHaUFGS0FJTUlBVW9BZ2hCQUNBRktBSVFFUUVBR2lBR0lBTW9BaEEyQWhBZ0JpQURLUUlJTndJSUlBWWdBeWtDQURjQ0FDQUJJUUlNQXdzZ0FrRUFUQTBISUFVUTJnSkZEUUVNQlFzTEN4QUJBQXNnQWtFQlJ3MENBbjhnQUNBRUtBSUFJZ0VRMlFJRVFDQUVLQUlJSVFKQmZ3d0JDeUFBS0FJSUlBUW9BZ2dpQWlBQlFRSjBFQjhhSUFBZ0FUWUNBRUVBQ3lFQklBUW9BZ3dnQWtFQUlBUW9BaEFSQVFBYURBa0xJQUpCQVdvaEFnc2dBa0VBSUFKQkFFb2JJUUpCQUNFQkEwQWdBU0FDUmdSQVFYOGhBUXdKQlNBRUlBRkJGR3hxSWdBb0Fnd2dBQ2dDQ0VFQUlBQW9BaEFSQVFBYUlBRkJBV29oQVF3QkN3QUxBQXRCbkkwQlFlVDhBRUdtQ2tHRE5oQUFBQXRCMUl3QlFlVDhBRUdiQ2tHRE5oQUFBQXRCOTRBQlFlVDhBRUdNQ2tHRE5oQUFBQXRCNDRzQlFlVDhBRUdMQ2tHRE5oQUFBQXRCOTRBQlFlVDhBRUdBQ2tHRE5oQUFBQXRCOTRBQlFlVDhBRUg1Q1VHRE5oQUFBQXRCOTRBQlFlVDhBRUh5Q1VHRE5oQUFBQXNnQkVIZ0FHb2tBQ0FCQzJrQkFuOENmeUFBS0FJQUlnTkJBbW9pQkNBQUtBSUVTZ1JBUVg4Z0FDQUVFTmtDRFFFYUlBQW9BZ0FoQXdzZ0FDQURRUUZxTmdJQUlBQW9BZ2dpQkNBRFFRSjBhaUFCTmdJQUlBQWdBQ2dDQUNJQVFRRnFOZ0lBSUFRZ0FFRUNkR29nQWpZQ0FFRUFDd3QyQVFGL0lBQW9BaFFFUUNBQUtBSUFJQUVRRDBGL0R3c0NRQ0FCUW9DQWdJQndnMEtBZ0lDQWtIOVJEUUFnQUNnQ0FDQUJFRGNpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBBSUFBUWd3TkJmdzhMSUFBZ0FhY2lBa0VBSUFJb0FnUkIvLy8vL3dkeEVGRWhBaUFBS0FJQUlBRVFEeUFDQzdVQ0FRZC9Jd0JCRUdzaUJTUUFBa0FnQUVGQWF5Z0NBQ0lCUlFSQURBRUxBa0FnQVFKL0lBRW9Bc2dCSWdRZ0FTZ0N4QUVpQWtnRVFDQUJLQUxNQVNFRElBUU1BUXNnQkVFQmFpSURJQUpCQTJ4QkFtMGlBaUFDSUFOSUd5SUdRUU4wSVFJZ0FDZ0NBQ0VEQWtBZ0FTZ0N6QUVpQnlBQlFkQUJha1lFUUNBRFFRQWdBaUFGUVF4cUVLZ0JJZ05GRFFNZ0F5QUJLQUxNQVNBQktBTElBVUVEZEJBZkdnd0JDeUFESUFjZ0FpQUZRUXhxRUtnQklnTkZEUUlMSUFVb0Fnd2hBaUFCSUFNMkFzd0JJQUVnQWtFRGRpQUdhallDeEFFZ0FTZ0N5QUVMUVFGcU5nTElBU0FESUFSQkEzUnFJZ0lnQVNnQ3ZBRTJBZ0FnQWlBQktBTEFBVFlDQkNBQVFiUUJFQkFnQUVGQWF5Z0NBQ0FFUWYvL0EzRVFGeUFCSUFRMkFyd0JEQUVMUVg4aEJBc2dCVUVRYWlRQUlBUUxvUUVDQTM4QmZpTUFJUVlDUUNBQ1FvQ0FnSUJ3VkEwQUlBS25JZ1V2QVFaQk1FY05BQ0FGS0FJZ0lRUUxBbjhnQmlBQUtBSVFLQUo0U1FSQUlBQVE2UUZCQUF3QkN5QUVMUUFSQkVBZ0FCQzJBa0VBREFFTFFRQWdBQ0FFS1FNSUlnSWdBeUFDUVFBUUZDSUhRb0NBZ0lCd2d5SUNRb0NBZ0lEZ0FGRU5BQm9nQVVLQWdJQ0FNQ0FISUFKQ2dJQ0FnQ0JSR3pjREFDQUVDeUVGSUFZa0FDQUZDeFlBSUFBZ0FTQUNJQU1nQkNBRklBQXBBekFROFFFTEtRRUJmeU1BUVJCcklnSWtBQ0FDSUFBMkFnd2dBa0VNYWlBQkVKTUVJUUFnQWtFUWFpUUFJQUFMbmdJQ0EzOEJmaUFDSUFFcEFnUWlCNmRCLy8vLy93ZHhJQU5IY2tVRVFDQUJJQUVvQWdCQkFXbzJBZ0FnQWExQ2dJQ0FnSkIvaEE4TElBRkJFR29oQlNBSFFvQ0FnSUFJZzFBZ0F5QUNheUlFUVFCTWNrVUVRQ0FESUFJZ0FpQURTQnNoQmtFQUlRTWdBaUVCQTBBZ0FTQUdSa1VFUUNBRklBRkJBWFJxTHdFQUlBTnlJUU1nQVVFQmFpRUJEQUVMQ3lBRFFmLy9BM0ZCZ0FKUEJFQWdBQ0FGSUFKQkFYUnFJQVFRN2dNUEMwRUFJUUVnQUNBRVFRQVE2Z0VpQUVVRVFFS0FnSUNBNEFBUEN5QUFRUkJxSVFNRFFDQUJJQVJHUlFSQUlBRWdBMm9nQlNBQklBSnFRUUYwYWkwQUFEb0FBQ0FCUVFGcUlRRU1BUXNMSUFNZ0JHcEJBRG9BQUNBQXJVS0FnSUNBa0grRUR3c2dBQ0FDSUFWcUlBUVFoQU1MdWdFQkFuOENRQUpBSUFKQy8vLy8vd2RZQkVBZ0FDQUJJQUtuUVlDQWdJQjRjaEJ4SWdSQkFFd05BU0FBSUFFZ0FoQk5JZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5Ba0YvSVFRTUFnc2dBQ0FDRVBnQ0lnVkZCRUJCZnlFRURBRUxBa0FnQUNBQklBVVFjU0lFUVFCTUJFQkNnSUNBZ0RBaEFnd0JDeUFBSUFFZ0JTQUJRUUFRRkNJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFCQmZ5RUVDeUFBSUFVUUV3d0JDMEtBZ0lDQU1DRUNDeUFESUFJM0F3QWdCQXRLQVFKL0lBSkMvLy8vL3dkWUJFQWdBQ0FCSUFJZ0EwR0FnQUVRMXdFUEN5QUFJQUlRK0FJaUJFVUVRQ0FBSUFNUUQwRi9Ed3NnQUNBQklBUWdBeEJGSVFVZ0FDQUVFQk1nQlF1SUFRRUJmMEYvSVFJZ0FDZ0NGQVIvUVg4RklBRkNnSUNBZ0hDRFFvQ0FnSUNRZjFJRVFDQUFLQUlBSUFFUUtDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQkNEQTBGL0R3c2dBQ0FCcHlJQ1FRQWdBaWdDQkVILy8vLy9CM0VRVVNFQ0lBQW9BZ0FnQVJBUElBSVBDeUFBSUFHbklnQkJBQ0FBS0FJRVFmLy8vLzhIY1JCUkN3c05BQ0FBSUFFZ0FSQS9FSWdDQ3hzQUlBQkJBQkJCR2lBQUlBRTJBZ1FnQUVHQWdJQ0FlRFlDQ0FzWkFDQUFJQUFvQWhBaUFDa0RnQUVRRHlBQUlBRTNBNEFCQzRRQ0FRRi9Ba0FnQUNnQ0NDSUNJQUFvQWd4T0RRQWdBQ2dDRUFSQUlBQWdBa0VCYWpZQ0NDQUFLQUlFSUFKQkFYUnFJQUU3QVJCQkFBOExJQUZCL3dGTERRQWdBQ0FDUVFGcU5nSUlJQUFvQWdRZ0Ftb2dBVG9BRUVFQUR3c0NmeUFBS0FJSUlnSWdBQ2dDREU0RVFFRi9JQUFnQWtFQmFpQUJFTGNDRFFFYUN3SkFJQUFvQWhBRVFDQUFJQUFvQWdnaUFrRUJhallDQ0NBQUtBSUVJQUpCQVhScUlBRTdBUkFNQVFzZ0FVSC9BVTBFUUNBQUlBQW9BZ2dpQWtFQmFqWUNDQ0FDSUFBb0FnUnFJQUU2QUJBTUFRdEJmeUFBSUFBb0Fnd1E5UU1OQVJvZ0FDQUFLQUlJSWdKQkFXbzJBZ2dnQUNnQ0JDQUNRUUYwYWlBQk93RVFDMEVBQ3dzYkFDQUFRUUFRUVJvZ0FDQUJOZ0lFSUFCQi92Ly8vd2MyQWdnTEN3QWdBQ0FCUVFBUXdRVUwyZ29DRW44QmZpTUFRVEJySWdna0FDQUJRUUEyQWdBZ0FrRUFOZ0lBSUFoQkFEWUNMQ0FJUVFBMkFpZ2dCRUV3Y1NFTklBUkJFSEVoRUNBREtBSVFJZzVCTUdvaEJnSkFBa0FDUUFKQUEwQWdEaWdDSUNBSlNnUkFBa0FnQmlnQ0JDSUZSUTBBUVFBZ0VDQUdLQUlBUVlDQWdJQUJjUnNnQkNBQUlBVVFqQU1pQjNaQkFYRkZjZzBBQWtBZ0RVVWdCaWdDQUVHQWdJQ0FmSEZCZ0lDQWdIaEhjZzBBSUFNb0FoUWdDVUVEZEdvb0FnQW9BaEExQWdSQ0lJWkNnSUNBZ01BQVVnMEFJQUFnQmlnQ0JCRFpBVUYvSVFrTUJBc2dBQ0FJUVNScUlBVVFyQUVFUUNBTFFRRnFJUXNNQVFzZ0IwVUVRQ0FNUVFGcUlRd01BUXNnQ2tFQmFpRUtDeUFHUVFocUlRWWdDVUVCYWlFSkRBRUxDMEVBSVFZQ1FDQURMUUFGSWdWQkJIRkZEUUFnQlVFSWNRUkFJQVJCQVhGRkRRRWdBeWdDS0NBTGFpRUxEQUVMSUFNdkFRWWlCVUVGUmdSQUlBUkJBWEZGRFFGQkFDRUpJQU1wQXlBaUYwS0FnSUNBY0lOQ2dJQ0FnSkIvVVFSL0lCZW5LQUlFUWYvLy8vOEhjUVZCQUFzZ0Myb2hDd3dCQ3lBQUtBSVFLQUpFSUFWQkdHeHFLQUlVSWdWRkRRQWdCU2dDQkNJRlJRMEFRWDhoQ1NBQUlBaEJMR29nQ0VFb2FpQURyVUtBZ0lDQWNJUWdCUkViQUEwQlFRQWhCUU5BSUFVZ0NDZ0NLRThOQVFKQUlBUWdBQ0FGUVFOMElnNGdDQ2dDTEdvb0FnUWlCeENNQTNaQkFYRUVRQUpBSUExRkJFQkJBQ0VIREFFTElBQWdDQ0FESUFjUVRDSUhRUUJJRFFJZ0J3Ui9JQWdvQWdBaEJ5QUFJQWdRU0NBSFFRSjJRUUZ4QlVFQUN5RUhJQWdvQWl3Z0Rtb2dCellDQUFzZ0JpQVFSU0FIY21vaEJnc2dCVUVCYWlFRkRBRUxDeUFBSUFnb0Fpd2dDQ2dDS0JCYURBRUxJQUJCQVNBTElBeHFJaE1nQ21vZ0Jtb2lFU0FSUVFGTUcwRURkQkFwSWc5RkJFQWdBQ0FJS0FJc0lBZ29BaWdRV2tGL0lRa01BUXNnQXlnQ0VDSVZRVEJxSVFaQkFDRUZJQXNoRENBVElRZEJBU0VVUVFBaENRTkFJQWtnRlNnQ0lFNUZCRUFDUUNBR0tBSUVJaEpGRFFCQkFDQVFJQVlvQWdCQmdJQ0FnQUZ4SWdvYklBUWdBQ0FTRUl3RElnMTJRUUZ4UlhJTkFDQUtRUngySVJZQ2Z5QUFJQWhCSkdvZ0VoQ3NBUVJBSUFWQkFXb2hDa0VBSVJRZ0J5RU9JQXdNQVFzZ0RVVUVRQ0FGSVFvZ0J5RU9JQXdpQlVFQmFnd0JDeUFIUVFGcUlRNGdCU0VLSUFjaEJTQU1DeUVOSUFBZ0VoQVlJUWNnRHlBRlFRTjBhaUlGSUJZMkFnQWdCU0FITmdJRUlBb2hCU0FOSVF3Z0RpRUhDeUFHUVFocUlRWWdDVUVCYWlFSkRBRUxDd0pBSUFNdEFBVWlDa0VFY1VVTkFBSi9JQXBCQ0hFRVFDQUVRUUZ4UlEwQ0lBTW9BaWdNQVFzZ0F5OEJCa0VGUndSQVFRQWhCZ05BSUFnb0Fpd2hBeUFHSUFnb0FpaFBSUVJBQWtCQkFDQVFJQU1nQmtFRGRHb2lDaWdDQUNJREd5QUVJQUFnQ2lnQ0JDSUtFSXdEZGtFQmNVVnlSUVJBSUE4Z0IwRURkR29pRFNBRE5nSUFJQTBnQ2pZQ0JDQUhRUUZxSVFjTUFRc2dBQ0FLRUJNTElBWkJBV29oQmd3QkN3c2dBQ2dDRUNJRVFSQnFJQU1nQkNnQ0JCRUFBQXdDQ3lBRVFRRnhSUTBCUVFBZ0F5a0RJQ0lYUW9DQWdJQndnMEtBZ0lDQWtIOVNEUUFhSUJlbktBSUVRZi8vLy84SGNRc2hDVUVBSVFZZ0NVRUFJQWxCQUVvYklRTURRQ0FESUFaR0RRRWdEeUFGUVFOMGFpSUVRUUUyQWdBZ0JDQUdRWUNBZ0lCNGNqWUNCQ0FHUVFGcUlRWWdCVUVCYWlFRkRBQUxBQXNnQlNBTFJ3MEJJQXdnRTBjTkFpQUhJQkZIRFFNZ0MwVWdGSEpGQkVBZ0R5QUxRUWhCUHlBQUVMNENDeUFCSUE4MkFnQWdBaUFSTmdJQVFRQWhDUXNnQ0VFd2FpUUFJQWtQQzBHOEtFR3UvQUJCeWp0Qno5WUFFQUFBQzBHUEtFR3UvQUJCeXp0Qno5WUFFQUFBQzBIdEtFR3UvQUJCekR0Qno5WUFFQUFBQ3pJQkFYOGpBRUhRQUdzaUF5UUFJQU1nQUNnQ0VDQURRUkJxSUFFUWtBRTJBZ0FnQUNBQ0lBTVFGU0FEUWRBQWFpUUFDd3NBSUFBZ0FTQUNFSVlGQ3drQUlBQkJBUkRaQkFzMkFRSi9RWDhoQXlBQUlBRkJBQkNUQVNJQ0JIOGdBaWdDSUNnQ0RDZ0NJQzBBQkFSQUlBQVFhMEYvRHdzZ0FpZ0NLQVZCZndzTGFRRURmeU1BUVJCcklnTWtBQUpBQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlFTHdFR0lRVWdBZ1JBSUFWQklFY05BUXdDQ3lBRlFSVnJRZi8vQTNGQkMwa05BUXNnQTBHN0lrSFNIeUFDR3pZQ0FDQUFRZmM4SUFNUUZVRUFJUVFMSUFOQkVHb2tBQ0FFQ3lRQkFYOGpBRUVRYXlJREpBQWdBeUFDTmdJTUlBQWdBU0FDRUpzRUlBTkJFR29rQUFzU0FDQUFJQUVnQWlBRElBUkJ4Z0FRcEFRTERRQWdBRUVhUVNSQkdSRC9CUXNPQUNBQVFvQ0FnSURnZmhDQUJndXhBZ0lDZndGOEl3QkJFR3NpQkNRQUFuOENRQU5BQWtBQ1FBSkFBbjhDUUFKQVFRY2dBa0lnaUtjaUF5QURRUWRyUVc1Skd5SUREZ2dBQUFBQUJRVUZBUVFMSUFLbkRBRUxJQUpDZ0lDQWdNQ0JnUHovQUh3aUFrSTBpS2RCL3c5eElnQkJuUWhMRFFFZ0FyOGlCWmxFQUFBQUFBQUE0RUZqQkVBZ0Jhb01BUXRCZ0lDQWdIZ0xJUU5CQUF3RkMwRUFJUU5CQUNBQVFkSUlTdzBFR2tFQUlBSkMvLy8vLy8vLy93ZURRb0NBZ0lDQWdJQUloQ0FBUVpNSWE2MkdRaUNJcHlJRGF5QURJQUpDQUZNYklRTkJBQXdFQ3lBRFFYZEdEUUlMSUFBZ0FoQ05BU0lDUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUFMUVFBaEEwRi9EQUVMSUFSQkRHb2dBcWRCQkdwQkFSQ3BBU0FBSUFJUUR5QUVLQUlNSVFOQkFBc2hBQ0FCSUFNMkFnQWdCRUVRYWlRQUlBQUx6Z0VCQTM4akFFRVFheUlFSkFBQ1FDQUJRb0NBZ0lCd1ZBUkFEQUVMSUFHbklnSXZBUVpCTUVZRVFBSkFJQUFnQkVFSWFpQUJRZUVBRUlFQklnTkZEUUFnQkNrRENDSUJRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFJQU1wQXdBUW1RRWhBZ3dEQ3lBQUlBRWdBeWtEQ0VFQklBTVFMeUlCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBQkVDWWhBaUFBSUFNcEF3QVFtUUVpQTBFQVNBMEFJQUlnQTBZTkFpQUFRWkRwQUVFQUVCVUxRWDhoQWd3QkN5QUNMUUFGUVFGeElRSUxJQVJCRUdva0FDQUNDNGdEQWdKK0FuOGpBRUVRYXlJR0pBQUNRQ0FCUW9DQWdJQndWQVJBSUFFaEF3d0JDeUFDUVc5eElRVUNRQUpBQWtBZ0FrRVFjUTBBSUFBZ0FVSFFBU0FCUVFBUUZDSUVRb0NBZ0lCd2d5SURRb0NBZ0lBZ1VTQURRb0NBZ0lBd1VYSU5BQ0FEUW9DQWdJRGdBRkVOQVNBR0lBQkJ4Z0JCRmlBRlFRRkdHMEhJQUNBRkd4QXROd01JSUFBZ0JDQUJRUUVnQmtFSWFoQXZJUU1nQUNBR0tRTUlFQThnQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCSUFBZ0FSQVBJQU5DZ0lDQWdIQlVEUU1nQUNBREVBOGdBRUdXNFFCQkFCQVZEQUlMSUFWQkFFY2hCVUVBSVFJRFFDQUNRUUpIQkVBZ0FDQUJRVGRCT1NBQ0lBVkdHeUFCUVFBUUZDSURRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSUNRQ0FBSUFNUU9FVU5BQ0FBSUFNZ0FVRUFRUUFRTHlJRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFNZ0EwTC8vLy8vYjFZTkFDQUFJQUVRRHd3RkN5QUFJQU1RRHlBQ1FRRnFJUUlNQVFzTElBQkJsdUVBUVFBUUZRc2dBQ0FCRUE4TFFvQ0FnSURnQUNFREN5QUdRUkJxSkFBZ0F3dnVDd0VIZndKQUlBQkZEUUFnQUVFSWF5SUNJQUJCQkdzb0FnQWlBVUY0Y1NJQWFpRUZBa0FnQVVFQmNRMEFJQUZCQTNGRkRRRWdBaUFDS0FJQUlnRnJJZ0pCd05BRUtBSUFTUTBCSUFBZ0FXb2hBRUhFMEFRb0FnQWdBa2NFUUNBQlFmOEJUUVJBSUFGQkEzWWhBU0FDS0FJTUlnTWdBaWdDQ0NJRVJnUkFRYkRRQkVHdzBBUW9BZ0JCZmlBQmQzRTJBZ0FNQXdzZ0JDQUROZ0lNSUFNZ0JEWUNDQXdDQ3lBQ0tBSVlJUVlDUUNBQ0lBSW9BZ3dpQVVjRVFDQUNLQUlJSWdNZ0FUWUNEQ0FCSUFNMkFnZ01BUXNDUUNBQ1FSUnFJZ1FvQWdBaUF3MEFJQUpCRUdvaUJDZ0NBQ0lERFFCQkFDRUJEQUVMQTBBZ0JDRUhJQU1pQVVFVWFpSUVLQUlBSWdNTkFDQUJRUkJxSVFRZ0FTZ0NFQ0lERFFBTElBZEJBRFlDQUFzZ0JrVU5BUUpBSUFJb0Fod2lCRUVDZEVIZzBnUnFJZ01vQWdBZ0FrWUVRQ0FESUFFMkFnQWdBUTBCUWJUUUJFRzAwQVFvQWdCQmZpQUVkM0UyQWdBTUF3c2dCa0VRUVJRZ0JpZ0NFQ0FDUmh0cUlBRTJBZ0FnQVVVTkFnc2dBU0FHTmdJWUlBSW9BaEFpQXdSQUlBRWdBellDRUNBRElBRTJBaGdMSUFJb0FoUWlBMFVOQVNBQklBTTJBaFFnQXlBQk5nSVlEQUVMSUFVb0FnUWlBVUVEY1VFRFJ3MEFRYmpRQkNBQU5nSUFJQVVnQVVGK2NUWUNCQ0FDSUFCQkFYSTJBZ1FnQUNBQ2FpQUFOZ0lBRHdzZ0FpQUZUdzBBSUFVb0FnUWlBVUVCY1VVTkFBSkFJQUZCQW5GRkJFQkJ5TkFFS0FJQUlBVkdCRUJCeU5BRUlBSTJBZ0JCdk5BRVFielFCQ2dDQUNBQWFpSUFOZ0lBSUFJZ0FFRUJjallDQkNBQ1FjVFFCQ2dDQUVjTkEwRzQwQVJCQURZQ0FFSEUwQVJCQURZQ0FBOExRY1RRQkNnQ0FDQUZSZ1JBUWNUUUJDQUNOZ0lBUWJqUUJFRzQwQVFvQWdBZ0FHb2lBRFlDQUNBQ0lBQkJBWEkyQWdRZ0FDQUNhaUFBTmdJQUR3c2dBVUY0Y1NBQWFpRUFBa0FnQVVIL0FVMEVRQ0FCUVFOMklRRWdCU2dDRENJRElBVW9BZ2dpQkVZRVFFR3cwQVJCc05BRUtBSUFRWDRnQVhkeE5nSUFEQUlMSUFRZ0F6WUNEQ0FESUFRMkFnZ01BUXNnQlNnQ0dDRUdBa0FnQlNBRktBSU1JZ0ZIQkVCQndOQUVLQUlBR2lBRktBSUlJZ01nQVRZQ0RDQUJJQU0yQWdnTUFRc0NRQ0FGUVJScUlnUW9BZ0FpQXcwQUlBVkJFR29pQkNnQ0FDSUREUUJCQUNFQkRBRUxBMEFnQkNFSElBTWlBVUVVYWlJRUtBSUFJZ01OQUNBQlFSQnFJUVFnQVNnQ0VDSUREUUFMSUFkQkFEWUNBQXNnQmtVTkFBSkFJQVVvQWh3aUJFRUNkRUhnMGdScUlnTW9BZ0FnQlVZRVFDQURJQUUyQWdBZ0FRMEJRYlRRQkVHMDBBUW9BZ0JCZmlBRWQzRTJBZ0FNQWdzZ0JrRVFRUlFnQmlnQ0VDQUZSaHRxSUFFMkFnQWdBVVVOQVFzZ0FTQUdOZ0lZSUFVb0FoQWlBd1JBSUFFZ0F6WUNFQ0FESUFFMkFoZ0xJQVVvQWhRaUEwVU5BQ0FCSUFNMkFoUWdBeUFCTmdJWUN5QUNJQUJCQVhJMkFnUWdBQ0FDYWlBQU5nSUFJQUpCeE5BRUtBSUFSdzBCUWJqUUJDQUFOZ0lBRHdzZ0JTQUJRWDV4TmdJRUlBSWdBRUVCY2pZQ0JDQUFJQUpxSUFBMkFnQUxJQUJCL3dGTkJFQWdBRUY0Y1VIWTBBUnFJUUVDZjBHdzBBUW9BZ0FpQTBFQklBQkJBM1owSWdCeFJRUkFRYkRRQkNBQUlBTnlOZ0lBSUFFTUFRc2dBU2dDQ0FzaEFDQUJJQUkyQWdnZ0FDQUNOZ0lNSUFJZ0FUWUNEQ0FDSUFBMkFnZ1BDMEVmSVFRZ0FFSC8vLzhIVFFSQUlBQkJKaUFBUVFoMlp5SUJhM1pCQVhFZ0FVRUJkR3RCUG1vaEJBc2dBaUFFTmdJY0lBSkNBRGNDRUNBRVFRSjBRZURTQkdvaEJ3SkFBa0FDUUVHMDBBUW9BZ0FpQTBFQklBUjBJZ0Z4UlFSQVFiVFFCQ0FCSUFOeU5nSUFJQWNnQWpZQ0FDQUNJQWMyQWhnTUFRc2dBRUVaSUFSQkFYWnJRUUFnQkVFZlJ4dDBJUVFnQnlnQ0FDRUJBMEFnQVNJREtBSUVRWGh4SUFCR0RRSWdCRUVkZGlFQklBUkJBWFFoQkNBRElBRkJCSEZxSWdkQkVHb29BZ0FpQVEwQUN5QUhJQUkyQWhBZ0FpQUROZ0lZQ3lBQ0lBSTJBZ3dnQWlBQ05nSUlEQUVMSUFNb0FnZ2lBQ0FDTmdJTUlBTWdBallDQ0NBQ1FRQTJBaGdnQWlBRE5nSU1JQUlnQURZQ0NBdEIwTkFFUWREUUJDZ0NBRUVCYXlJQVFYOGdBQnMyQWdBTEMwY0FJQUFnQVVrRVFDQUFJQUVnQWhBZkdnOExJQUlFUUNBQUlBSnFJUUFnQVNBQ2FpRUJBMEFnQUVFQmF5SUFJQUZCQVdzaUFTMEFBRG9BQUNBQ1FRRnJJZ0lOQUFzTEN4NEFJQUJDZ0lDQWdIQ0RRb0NBZ0lDUWYxRUVRQ0FBcHlBQkVMY0VDd3UvQlFFSGZ5TUFRWkFDYXlJR0pBQWdCa0VBT2dBUUlBWWdBQ2dDQkRZQ0FDQUdJQUFvQWhRMkFnUWdCaUFBS0FJWU5nSU1JQVlnQUNnQ01EWUNDQ0FBUVJCcUlRbEJBU0VFQWtBQ1FBTkFRWDRoQ0FKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdDU2dDQUNJRFFmNEFhZzRGQVFrSkNRY0FDd0pBQWtBQ1FBSkFBa0FnQTBFb2F3NENBUUlBQ3dKQUlBTkJPMnNPQXdjTkNRQUxBa0FnQTBIYkFHc09Bd0VOQXdBTEFrQWdBMEg3QUdzT0F3RU5CQUFMSUFOQnAzOUdEUWNnQTBFdlJnMEpJQU5Cckg5SERRd01FQXNnQkVIL0FVME5CQXdPQ3lBRVFRRnJJZ1FnQmtFUWFtb3RBQUJCS0VjTkRRd0pDeUFFUVFGcklnUWdCa0VRYW1vdEFBQkIyd0JIRFF3TUNBdEIvUUFoQlNBRVFRRnJJZ1FnQmtFUWFtb3RBQUFpQ0VIN0FFWU5DVUdzZnlFRElBaEI0QUJIRFF3Z0FDQUpFUDhCSUFCQkFEWUNNQ0FBSUFBb0FoUTJBZ1FnQUNBQUtBSTRFTThERFF3TElBQW9BaWhCNEFCR0RRWkI0QUFoQXlBRVFmOEJTdzBLQ3lBR1FSQnFJQVJxSUFNNkFBQWdCRUVCYWlFRURBVUxJQWNnQkVFQ1JuSWhCMEU3SVFVTUJnc2dCMEVDY2lBSElBUkJBa1liSVFkQnAzOGhCUXdGQ3lBSFFRUnlJUWRCUFNFRkRBUUxRWDhoQ0FzZ0JVR0FBV29pQTBFV1RVRUFRUUVnQTNSQm00Q0FBM0ViRFFBZ0JVRXBSaUFGUWQwQVJuSWdCVUhUQUdvaUEwRUhUVUVBUVFFZ0EzUkJod0Z4RzNJZ0JVSDlBRVp5RFFBZ0FDQUFLQUk0SUFocU5nSTRJQUFRMkFRTkJBc2dDU2dDQUNFREN5QURRWU4vUndSQUlBTWhCUXdCQzBGYklRVWdBRUhEQUJCS0RRQWdBRUV0RUVvTkFFR0RmeUVGQ3lBQUVCSU5BU0FFUVFGTERRQUxRVnNnQUNnQ0VDQUFRY01BRUVvYklRTWdBa1VOQVVFS0lBTWdBQ2dDQkNBQUtBSVVSeHNoQXd3QkMwR3NmeUVEQ3lBQkJFQWdBU0FITmdJQUN5QUFJQVlRN2dJaEFDQUdRWkFDYWlRQVFYOGdBeUFBR3dzWkFDQUFJQUVnQWtFQklBTWdCQ0FGSUFZZ0J5QUlFUFVCQzZvR0FRWi9JQUFvQWdBaEJRSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRERnY0VBQUFBQUFFQ0F3c2dBU0FDSUFFb0FzQUJRUUVRd1FNaUNVRUFTQVJBSUFFb0Fyd0JJUVFNQmdzQ1FDQUpRZi8vLy84RFRRUkFJQUVvQW5RaUNDQUpRUVIwYWlJSEtBSUVJZ1lnQVNnQ3ZBRWlCRVlFUUNBRFFRTkhEUUlnQVMwQWJrRUJjUTBDSUFnZ0NVRUVkR29vQWd4QitBQnhRUWhIRFFJTUNRc2dCeWdDREVINEFIRkJHRWNnQmtFQ2FpQUVSM0lOQnd3QkN5QUJLQUs4QVNJRUlBRW9BdkFCUncwR0N5QUFRWkRFQUVFQUVCWU1Cd3NnQlNBQklBSkJBeERqQWc4TElBRWdBaUFCS0FMQUFVRUFFTUVEUVFCT0RRSWdBU2dDS0FSQUFrQWdBU0FDRUtJQ0lnTkZEUUFnQXkwQUJFRUNjVVVOQUNBREtBSUlJQUVvQXJ3QlJ3MEFJQUVvQWlSQkFVWU5CQXRCZ0lDQWdBUkJmeUFGSUFFZ0FoRGtBaHNQQ3lBQklBSVE5QUVpQkVFQVRnMElJQVVnQVNBQ0VFOGlCRUVBU0EwSUFrQWdBa0hOQUVjTkFDQUJLQUpJUlEwQUlBRWdCRFlDbUFFTElBRW9BblFnQkVFRWRHb2dBU2dDdkFFMkFnZ2dCQThMRUFFQUN5QUZJQUVnQWtFQUVPTUNJUVFNQmdzZ0FFR1F4QUJCQUJBV0RBSUxBa0FnQTBFQ1N3MEFJQVFnQVNnQzhBRkhEUUFnQkNFR0lBRWdBaERnQkVFQVNBMEJJQUJCeStZQVFRQVFGZ3dDQ3lBRUlRWUxRUUFoQkNBQktBSjhJZ2RCQUNBSFFRQktHeUVIQWtBRFFDQUVJQWRHRFFFQ1FBSkFJQUVvQW5RZ0JFRUVkR29pQ0NnQ0FDQUNSdzBBSUFnb0FnUU5BQ0FCSUFnb0FnZ2dCaERhQkEwQkN5QUVRUUZxSVFRTUFRc0xJQVJCQUVnTkFDQUFRZUhxQUVFQUVCWU1BUXNDUUNBQktBSW9SUTBBSUFFZ0FoQ2lBaUlFUlEwQUlBRWdCQ2dDQ0NBR0VOb0VSUTBBSUFCQjQ4UUFRUUFRRmd3QkN5QUJLQUlnUlEwQ0lBRW9BaVJCQVVzTkFpQUdJQUVvQXZBQlJ3MENJQVVnQVNBQ0VPUUNJZ0FOQVF0QmZ3OExJQUFnQUMwQUJFSDVBWEZCQmtFQ0lBTkJBa1liY2pvQUJFR0FnSUNBQkE4TElBVWdBU0FDUVFFZ0EwRUVSa0VCZENBRFFRTkdHeERqQWlJRVFRQklEUUFnQVNnQ2RDQUVRUVIwYWlJQUlBQW9BZ3hCZkhFZ0EwRUNSbkpCQW5JMkFnd2dCQThMSUFRTHNnRUJCWDhDUUFKQUlBQW9Ba0FpQWlnQ21BSWlBMEVBU0EwQUlBSW9Bb0FDSWdRZ0Eyb2lCUzBBQUNJR1FjRUJSd1JBSUFaQnpRQkhEUUVnQWtGL05nS1lBaUFDSUFNMkFvUUNJQUJCelFBUUVDQUFJQUVRR2c4TElBUWdBeUFGS0FBQmEwRUJhaUlEYWlJRUxRQUFRZFlBUncwQklBQW9BZ0FnQkNnQUFSQVRJQUlvQW9BQ0lBTnFJQUFvQWdBZ0FSQVlOZ0FCSUFKQmZ6WUNtQUlMRHd0QjNUUkJydndBUWRPd0FVSE41UUFRQUFBTDJRa0NDSDhCZmlNQVFaQUJheUlDSkFBQ2Z3SkFJQUFvQWdBb0FoQW9BbmdnQWtzRVFDQUFRWTBpUVFBUUZnd0JDeUFBSUFCQkVHb2lCaEQvQVNBQUlBQW9BamdpQVRZQ05DQUNJQUUyQWdRZ0FDQUFLQUlVTmdJRUFrQURRQUpBSUFBZ0FUWUNHQ0FBSUFBb0FnZ2lCVFlDRkFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQVN3QUFDSURRZjhCY1NJRURuc0FDUWtKQ1FrSkNRa0dCQVVGQXdrSkNRa0pDUWtKQ1FrSkNRa0pDUWtKQ1FZSkFna09DUWtCQ1FrSkN3a0tDUWNJREF3TURBd01EQXdNQ1FrSkNRa0pDUTRPRGc0T0RnNE9EZzRPRGc0T0RnNE9EZzRPRGc0T0RnNE9DUWtKQ1E0SkRnNE9EZzRPRGc0T0RnNE9EZzRPRGc0T0RnNE9EZzRPRGc0SkMwRUFJUU1nQVNBQUtBSThTUTBNSUFaQnJIODJBZ0FNRGd0Qkp5RURJQUFvQWt4RkRRdEJKeUVFQ3lBQUlBUkJBU0FCUVFGcUlBWWdBa0VFYWhEekFrVU5EQXdRQ3lBQlFRRnFJQUVnQVMwQUFVRUtSaHNoQVFzZ0FpQUJRUUZxSWdFMkFnUWdBQ0FGUVFGcU5nSUlEQTBMSUFBb0FreEZEUWNMSUFJZ0FVRUJhaUlCTmdJRURBc0xJQUFvQWt4RkJFQkJMeUVEREFZTFFTOGhBeUFCTFFBQklnUkJMMFlOQ0NBRVFTcEhEUVVnQVVFQ2FpRUJBMEFnQWlBQk5nSUVBMEFDUUFKQUFrQUNRQ0FCTFFBQUlnTkJDbXNPQkFFQ0FnTUFDeUFEUVNwSEJFQWdBdzBDSUFFZ0FDZ0NQRWtOQTBIVkxDRUJEQThMSUFFdEFBRkJMMGNOQWlBQ0lBRkJBbW9pQVRZQ0JBd1BDeUFBSUFBb0FnaEJBV28yQWdnTUFRc2dBOEJCQUU0TkFDQUJRUVlnQWtFRWFoQllJUU1nQWlnQ0JDRUJJQU5CZjBjTkFRc0xJQUZCQVdvaEFRd0FDd0FMUVRBaEF5QUJMUUFCUVRwclFYWkpEUU1NQkFzZ0EwRUFUZzBEUWRIREFDRUJEQWNMUVMwaEF5QUJMUUFCUVRwclFYWkpEUUlNQVF0Qkt5RURJQUFvQWt4RkRRRWdBUzBBQVVFNmEwRjJTUTBCQ3lBQUtBSUFJQUVnQWtFRWFrRUFRUW9nQUNnQ1RDSUJHeUFCUVFCSFFRSjBFTGdDSWdsQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQmlBQVFZQi9OZ0lRSUFBZ0NUY0RJQXdDQ3lBR0lBTkIvd0Z4TmdJQUlBSWdBVUVCYWpZQ0JBd0JDeUFDSUFGQkFXb2lCellDQkVHQUFTRUVJQUpCZ0FFMkFnZ2dBaUFDUVJCcUlnVTJBZ3hCQUNFQkFuOERRQ0FFUVFacklRZ0NRQU5BSUFFZ0JXb2dBem9BQUNBQlFRRnFJUUVnQnkwQUFDSUV3Q0lEUVFCSURRRWdCRUVEZGtFY2NVR2dnUUpxS0FJQUlBUjJRUUZ4UlEwQklBZEJBV29oQnlBQklBaEpEUUFMSUFBb0FnQWdBa0VNYWlBQ1FRaHFJQUpCRUdvUTlRUWhCQ0FDS0FJTUlRVkJBQ0FFRFFJYUlBSW9BZ2doQkF3QkN3c2dBQ2dDQUNBRklBRVFoUU1MSVFFZ0FrRVFhaUFGUndSQUlBQW9BZ0FvQWhBaUEwRVFhaUFGSUFNb0FnUVJBQUFMSUFJZ0J6WUNCQ0FCUlEwRUlBQkNBRGNDSkNBQVFZTi9OZ0lRSUFBZ0FUWUNJQXNnQUNBQ0tBSUVOZ0k0UVFBTUJRc2dBVUVDYWlFQkEwQWdBaUFCTmdJRUEwQUNRQUpBSUFFdEFBQWlBd1JBSUFOQkNtc09CQVlCQVFZQkN5QUJJQUFvQWp4UERRVU1BUXNnQThCQkFFNE5BQ0FCUVFZZ0FrRUVhaEJZSWdOQmZuRkJxTUFBUmdSQUlBSW9BZ1FoQVF3RkN5QUNLQUlFSVFFZ0EwRi9SdzBCQ3dzZ0FVRUJhaUVCREFBTEFBc0xJQUFnQVVFQUVCWUxJQVpCcW44MkFnQUxRWDhMSVFFZ0FrR1FBV29rQUNBQkN5RUFJQUFnQVNBQ1FnQkMvLy8vLy8vLy93OUNBQkIwSVFFZ0FDQUNFQThnQVFzcUFRRi9Jd0JCRUdzaUF5UUFJQU1nQWpZQ0RDQUFJQUVnQWtIakFFRUFFSmtFR2lBRFFSQnFKQUFMVHdBZ0FDQUJJQUpCQUU0RWZpQUNyUVZDZ0lDQWdNQitJQUs0dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeUFEUVlDQUFSRFhBUXRaQVFKL0l3QkJFR3NpQXlRQVFYOGhCQ0FBSUFOQkNHb2dBaERpQTBVRVFFRUFJUVFnQVNBREtRTUlJZ0pDZ0lDQWdJQ0FnQkJhQkg0Z0FFR0FJRUVBRUZCQmZ5RUVRZ0FGSUFJTE53TUFDeUFEUVJCcUpBQWdCQXNSQUNBQUlBRWdBU0FDSUFOQkFoQ0tCQXRUQVFGL0lBQW9BaEFpQkVFUWFpQUJJQUlnQkNnQ0NCRUJBQ0lCSUFKRmNrVUVRQ0FBRUh3Z0FROExJQU1FUUNBRElBRWdBQ2dDRUNnQ0RCRUVBQ0lBSUFKcklnSkJBQ0FBSUFKUEd6WUNBQXNnQVF2QUFRQWdBQUovSUFFb0FnZ2lBRUgrLy8vL0IwNEVRRUVBSUFKQkFYRU5BUnBCLy8vLy93Y2dBRUgrLy8vL0IwY05BUm9nQVNnQ0JFSC8vLy8vQjJvTUFRdEJBQ0FBUVFCTURRQWFJQUJCSDAwRVFFRUFJQUVvQWhBZ0FTZ0NERUVDZEdwQkJHc29BZ0JCSUNBQWEzWWlBbXNnQWlBQktBSUVHd3dCQ3lBQ1FRRnhSUVJBUVlDQWdJQjRRZi8vLy84SElBRW9BZ1FiREFFTFFRQWdBU2dDRUNBQktBSU1JZ0lnQWtFRmRDQUFheEJvSWdKcklBSWdBU2dDQkJzTE5nSUFDdzBBSUFBZ0FTQUJFRDhRaFFNTCtRRUNBMzRDZnlNQVFSQnJJZ1VrQUFKK0lBRzlJZ05DLy8vLy8vLy8vLy8vQUlNaUFrS0FnSUNBZ0lDQUNIMUMvLy8vLy8vLy8rLy9BRmdFUUNBQ1FqeUdJUVFnQWtJRWlFS0FnSUNBZ0lDQWdEeDhEQUVMSUFKQ2dJQ0FnSUNBZ1BqL0FGb0VRQ0FEUWp5R0lRUWdBMElFaUVLQWdJQ0FnSURBLy84QWhBd0JDeUFDVUFSQVFnQU1BUXNnQlNBQ1FnQWdBNmRuUVNCcUlBSkNJSWluWnlBQ1FvQ0FnSUFRVkJzaUJrRXhhaEJuSUFVcEF3QWhCQ0FGS1FNSVFvQ0FnSUNBZ01BQWhVR00rQUFnQm11dFFqQ0doQXNoQWlBQUlBUTNBd0FnQUNBQ0lBTkNnSUNBZ0lDQWdJQ0FmNE9FTndNSUlBVkJFR29rQUF1MkFRRUJmeU1BUVJCcklnTWtBQUpBQWtBZ0FrRUFTQVJBSUFFZ0FrSC8vLy8vQjNFMkFnQkJBU0VDREFFTElBQW9BaEFpQUNnQ0xDQUNUUTBCQW44Q1FDQUFLQUk0SUFKQkFuUnFLQUlBSWdBcEFnUkNnSUNBZ0lDQWdJQkFnMEtBZ0lDQWdJQ0FnTUFBVWcwQUlBTkJER29nQUJDOUJVVU5BRUVCSUFNb0Fnd2lBRUYvUncwQkdndEJBQ0VBUVFBTElRSWdBU0FBTmdJQUN5QURRUkJxSkFBZ0FnOExRZS9mQUVHdS9BQkJ2eGhCcnlBUUFBQUwxUUVDQW44RGZnSi9JQUpGQkVCQ2dJQ0FnREFoQlVFQURBRUxJQUFvQWhBaUF5a0RnQUVoQlNBRFFvQ0FnSUFnTndPQUFVRi9DeUVEQWtBZ0FDQUJRUVlnQVVFQUVCUWlCMEtBZ0lDQWNJTWlCa0tBZ0lDQUlGRWdCa0tBZ0lDQU1GRnlSUVJBUVg4aEJDQUdRb0NBZ0lEZ0FGRU5BU0FBSUFjZ0FVRUFRUUFRTHlFQkFuOGdBeUFDRFFBYVFYOGdBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFHaUFESUFGQy8vLy8vMjlXRFFBYUlBQVFKRUYvQ3lFRUlBQWdBUkFQREFFTElBTWhCQXNnQWdSQUlBQWdCUkNLQVFzZ0JBdkZBUUlCZmdKL0l3QkJFR3NpQlNRQVFvQ0FnSURnQUNFRUFrQUNRQ0FBSUFFZ0FrRUFRUUFnQlVFTWFoREhCU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQlNnQ0RDSUdRUUpIQkVBZ0F5QUdOZ0lBSUFFaEJBd0NDeUFBSUFGQjZRQWdBVUVBRUJRaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBTWdBQ0FDRUNZaUF6WUNBRUtBZ0lDQU1DRUVJQU5GQkVBZ0FDQUJRY0FBSUFGQkFCQVVJUVFMSUFBZ0FSQVBEQUVMSUFBZ0FSQVBJQU5CQURZQ0FBc2dCVUVRYWlRQUlBUUxUUUFnQUNBQklBSkJBRTRFZmlBQ3JRVkNnSUNBZ01CK0lBSzR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN5QURJQVFRdlFFTFNBQWdBQ0FCSUFKQkFFNEVmaUFDclFWQ2dJQ0FnTUIrSUFLNHZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCTkM2Y3BBUXQvSXdCQkVHc2lDeVFBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FBUWZRQlRRUkFRYkRRQkNnQ0FDSUpRUkFnQUVFTGFrRjRjU0FBUVF0Skd5SUdRUU4ySWdGMklnSkJBM0VFUUFKQUlBSkJmM05CQVhFZ0FXb2lBVUVEZENJQVFkalFCR29pQWlBQVFlRFFCR29vQWdBaUF5Z0NDQ0lBUmdSQVFiRFFCQ0FKUVg0Z0FYZHhOZ0lBREFFTElBQWdBallDRENBQ0lBQTJBZ2dMSUFOQkNHb2hBQ0FESUFGQkEzUWlBa0VEY2pZQ0JDQUNJQU5xSWdJZ0FpZ0NCRUVCY2pZQ0JBd0pDeUFHUWJqUUJDZ0NBQ0lLVFEwQklBSUVRQUpBUVFJZ0FYUWlBRUVBSUFCcmNpQUNJQUYwY1NJQVFRQWdBR3R4YUNJRFFRTjBJZ0JCMk5BRWFpSUNJQUJCNE5BRWFpZ0NBQ0lIS0FJSUlnQkdCRUJCc05BRUlBbEJmaUFEZDNFaUNUWUNBQXdCQ3lBQUlBSTJBZ3dnQWlBQU5nSUlDeUFISUFaQkEzSTJBZ1FnQmlBSGFpSUJJQU5CQTNRaUFDQUdheUlFUVFGeU5nSUVJQUFnQjJvZ0JEWUNBQ0FLQkVBZ0NrRjRjVUhZMEFScUlRQkJ4TkFFS0FJQUlRVUNmeUFKUVFFZ0NrRURkblFpQW5GRkJFQkJzTkFFSUFJZ0NYSTJBZ0FnQUF3QkN5QUFLQUlJQ3lFRElBQWdCVFlDQ0NBRElBVTJBZ3dnQlNBQU5nSU1JQVVnQXpZQ0NBc2dCMEVJYWlFQVFjVFFCQ0FCTmdJQVFialFCQ0FFTmdJQURBa0xRYlRRQkNnQ0FDSUhSUTBCSUFkQkFDQUhhM0ZvUVFKMFFlRFNCR29vQWdBaUFTZ0NCRUY0Y1NBR2F5RUVJQUVoQWdOQUFrQWdBaWdDRUNJQVJRUkFJQUlvQWhRaUFFVU5BUXNnQUNnQ0JFRjRjU0FHYXlJQ0lBUWdBaUFFU1NJQ0d5RUVJQUFnQVNBQ0d5RUJJQUFoQWd3QkN3c2dBU2dDR0NFSUlBRWdBU2dDRENJRFJ3UkFRY0RRQkNnQ0FCb2dBU2dDQ0NJQUlBTTJBZ3dnQXlBQU5nSUlEQWdMSUFGQkZHb2lBaWdDQUNJQVJRUkFJQUVvQWhBaUFFVU5BeUFCUVJCcUlRSUxBMEFnQWlFRklBQWlBMEVVYWlJQ0tBSUFJZ0FOQUNBRFFSQnFJUUlnQXlnQ0VDSUFEUUFMSUFWQkFEWUNBQXdIQzBGL0lRWWdBRUcvZjBzTkFDQUFRUXRxSWdCQmVIRWhCa0cwMEFRb0FnQWlDRVVOQUVFQUlBWnJJUVFDUUFKQUFrQUNmMEVBSUFaQmdBSkpEUUFhUVI4Z0JrSC8vLzhIU3cwQUdpQUdRU1lnQUVFSWRtY2lBR3QyUVFGeElBQkJBWFJyUVQ1cUN5SUhRUUowUWVEU0JHb29BZ0FpQWtVRVFFRUFJUUFNQVF0QkFDRUFJQVpCR1NBSFFRRjJhMEVBSUFkQkgwY2JkQ0VCQTBBQ1FDQUNLQUlFUVhoeElBWnJJZ1VnQkU4TkFDQUNJUU1nQlNJRURRQkJBQ0VFSUFJaEFBd0RDeUFBSUFJb0FoUWlCU0FGSUFJZ0FVRWRka0VFY1dvb0FoQWlBa1liSUFBZ0JSc2hBQ0FCUVFGMElRRWdBZzBBQ3dzZ0FDQURja1VFUUVFQUlRTkJBaUFIZENJQVFRQWdBR3R5SUFoeElnQkZEUU1nQUVFQUlBQnJjV2hCQW5SQjROSUVhaWdDQUNFQUN5QUFSUTBCQ3dOQUlBQW9BZ1JCZUhFZ0Jtc2lBU0FFU1NFRklBRWdCQ0FGR3lFRUlBQWdBeUFGR3lFRElBQW9BaEFpQWdSL0lBSUZJQUFvQWhRTElnQU5BQXNMSUFORkRRQWdCRUc0MEFRb0FnQWdCbXRQRFFBZ0F5Z0NHQ0VISUFNZ0F5Z0NEQ0lCUndSQVFjRFFCQ2dDQUJvZ0F5Z0NDQ0lBSUFFMkFnd2dBU0FBTmdJSURBWUxJQU5CRkdvaUFpZ0NBQ0lBUlFSQUlBTW9BaEFpQUVVTkF5QURRUkJxSVFJTEEwQWdBaUVGSUFBaUFVRVVhaUlDS0FJQUlnQU5BQ0FCUVJCcUlRSWdBU2dDRUNJQURRQUxJQVZCQURZQ0FBd0ZDeUFHUWJqUUJDZ0NBQ0lBVFFSQVFjVFFCQ2dDQUNFREFrQWdBQ0FHYXlJQ1FSQlBCRUFnQXlBR2FpSUJJQUpCQVhJMkFnUWdBQ0FEYWlBQ05nSUFJQU1nQmtFRGNqWUNCQXdCQ3lBRElBQkJBM0kyQWdRZ0FDQURhaUlBSUFBb0FnUkJBWEkyQWdSQkFDRUJRUUFoQWd0QnVOQUVJQUkyQWdCQnhOQUVJQUUyQWdBZ0EwRUlhaUVBREFjTElBWkJ2TkFFS0FJQUlncEpCRUJCdk5BRUlBb2dCbXNpQWpZQ0FFSEkwQVJCeU5BRUtBSUFJZ0VnQm1vaUFEWUNBQ0FBSUFKQkFYSTJBZ1FnQVNBR1FRTnlOZ0lFSUFGQkNHb2hBQXdIQzBFQUlRQWdCa0V2YWlJSUFuOUJpTlFFS0FJQUJFQkJrTlFFS0FJQURBRUxRWlRVQkVKL053SUFRWXpVQkVLQW9JQ0FnSUFFTndJQVFZalVCQ0FMUVF4cVFYQnhRZGlxMWFvRmN6WUNBRUdjMUFSQkFEWUNBRUhzMHdSQkFEWUNBRUdBSUFzaUJHb2lCMEVBSUFScklnVnhJZ0lnQmswTkJrSG8wd1FvQWdBaUJBUkFRZURUQkNnQ0FDSURJQUpxSWdFZ0EwMGdBU0FFUzNJTkJ3c0NRRUhzMHdRdEFBQkJCSEZGQkVBQ1FBSkFBa0FDUUVISTBBUW9BZ0FpQXdSQVFmRFRCQ0VFQTBBZ0F5QUVLQUlBSWdGUEJFQWdBU0FFS0FJRWFpQURTdzBEQ3lBRUtBSUlJZ1FOQUFzTFFRQVFsQUlpQVVGL1JnMERJQUloQjBHTTFBUW9BZ0FpQkVFQmF5SURJQUZ4QkVBZ0FpQUJheUFCSUFOcVFRQWdCR3R4YWlFSEN5QUdJQWRQRFFOQjZOTUVLQUlBSWdVRVFFSGcwd1FvQWdBaUJDQUhhaUlESUFSTklBTWdCVXR5RFFRTElBY1FsQUlpQkNBQlJ3MEJEQVVMSUFjZ0Ntc2dCWEVpQnhDVUFpSUJJQVFvQWdBZ0JDZ0NCR3BHRFFFZ0FTRUVDeUFFUVg5R0RRRWdCeUFHUVRCcVR3UkFJQVFoQVF3RUMwR1ExQVFvQWdBaUFTQUlJQWRyYWtFQUlBRnJjU0lCRUpRQ1FYOUdEUUVnQVNBSGFpRUhJQVFoQVF3REN5QUJRWDlIRFFJTFFlelRCRUhzMHdRb0FnQkJCSEkyQWdBTElBSVFsQUlpQVVGL1JrRUFFSlFDSWdKQmYwWnlJQUVnQWs5eURRY2dBaUFCYXlJSElBWkJLR3BORFFjTFFlRFRCRUhnMHdRb0FnQWdCMm9pQURZQ0FFSGswd1FvQWdBZ0FFa0VRRUhrMHdRZ0FEWUNBQXNDUUVISTBBUW9BZ0FpQlFSQVFmRFRCQ0VBQTBBZ0FTQUFLQUlBSWdNZ0FDZ0NCQ0lDYWtZTkFpQUFLQUlJSWdBTkFBc01CQXRCd05BRUtBSUFJZ0JCQUNBQUlBRk5HMFVFUUVIQTBBUWdBVFlDQUF0QkFDRUFRZlRUQkNBSE5nSUFRZkRUQkNBQk5nSUFRZERRQkVGL05nSUFRZFRRQkVHSTFBUW9BZ0EyQWdCQi9OTUVRUUEyQWdBRFFDQUFRUU4wSWdOQjROQUVhaUFEUWRqUUJHb2lBallDQUNBRFFlVFFCR29nQWpZQ0FDQUFRUUZxSWdCQklFY05BQXRCdk5BRUlBZEJLR3NpQTBGNElBRnJRUWR4UVFBZ0FVRUlha0VIY1JzaUFHc2lBallDQUVISTBBUWdBQ0FCYWlJQU5nSUFJQUFnQWtFQmNqWUNCQ0FCSUFOcVFTZzJBZ1JCek5BRVFaalVCQ2dDQURZQ0FBd0VDeUFBTFFBTVFRaHhJQU1nQlV0eUlBRWdCVTF5RFFJZ0FDQUNJQWRxTmdJRVFjalFCQ0FGUVhnZ0JXdEJCM0ZCQUNBRlFRaHFRUWR4R3lJQWFpSUJOZ0lBUWJ6UUJFRzgwQVFvQWdBZ0Iyb2lBaUFBYXlJQU5nSUFJQUVnQUVFQmNqWUNCQ0FDSUFWcVFTZzJBZ1JCek5BRVFaalVCQ2dDQURZQ0FBd0RDMEVBSVFNTUJBdEJBQ0VCREFJTFFjRFFCQ2dDQUNBQlN3UkFRY0RRQkNBQk5nSUFDeUFCSUFkcUlRSkI4Tk1FSVFBQ1FBSkFBa0FDUUFKQUFrQURRQ0FDSUFBb0FnQkhCRUFnQUNnQ0NDSUFEUUVNQWdzTElBQXRBQXhCQ0hGRkRRRUxRZkRUQkNFQUEwQWdCU0FBS0FJQUlnSlBCRUFnQWlBQUtBSUVhaUlFSUFWTERRTUxJQUFvQWdnaEFBd0FDd0FMSUFBZ0FUWUNBQ0FBSUFBb0FnUWdCMm8yQWdRZ0FVRjRJQUZyUVFkeFFRQWdBVUVJYWtFSGNSdHFJZ2NnQmtFRGNqWUNCQ0FDUVhnZ0FtdEJCM0ZCQUNBQ1FRaHFRUWR4RzJvaUNTQUdJQWRxSWdocklRQWdCU0FKUmdSQVFjalFCQ0FJTmdJQVFielFCRUc4MEFRb0FnQWdBR29pQURZQ0FDQUlJQUJCQVhJMkFnUU1Bd3RCeE5BRUtBSUFJQWxHQkVCQnhOQUVJQWcyQWdCQnVOQUVRYmpRQkNnQ0FDQUFhaUlBTmdJQUlBZ2dBRUVCY2pZQ0JDQUFJQWhxSUFBMkFnQU1Bd3NnQ1NnQ0JDSUVRUU54UVFGR0JFQWdCRUY0Y1NFRkFrQWdCRUgvQVUwRVFDQUVRUU4ySVFJZ0NTZ0NEQ0lCSUFrb0FnZ2lBMFlFUUVHdzBBUkJzTkFFS0FJQVFYNGdBbmR4TmdJQURBSUxJQU1nQVRZQ0RDQUJJQU0yQWdnTUFRc2dDU2dDR0NFR0FrQWdDU0FKS0FJTUlnRkhCRUFnQ1NnQ0NDSUNJQUUyQWd3Z0FTQUNOZ0lJREFFTEFrQWdDVUVVYWlJRUtBSUFJZ0lOQUNBSlFSQnFJZ1FvQWdBaUFnMEFRUUFoQVF3QkN3TkFJQVFoQXlBQ0lnRkJGR29pQkNnQ0FDSUNEUUFnQVVFUWFpRUVJQUVvQWhBaUFnMEFDeUFEUVFBMkFnQUxJQVpGRFFBQ1FDQUpLQUljSWdOQkFuUkI0TklFYWlJQ0tBSUFJQWxHQkVBZ0FpQUJOZ0lBSUFFTkFVRzAwQVJCdE5BRUtBSUFRWDRnQTNkeE5nSUFEQUlMSUFaQkVFRVVJQVlvQWhBZ0NVWWJhaUFCTmdJQUlBRkZEUUVMSUFFZ0JqWUNHQ0FKS0FJUUlnSUVRQ0FCSUFJMkFoQWdBaUFCTmdJWUN5QUpLQUlVSWdKRkRRQWdBU0FDTmdJVUlBSWdBVFlDR0FzZ0JTQUphaUlKS0FJRUlRUWdBQ0FGYWlFQUN5QUpJQVJCZm5FMkFnUWdDQ0FBUVFGeU5nSUVJQUFnQ0dvZ0FEWUNBQ0FBUWY4QlRRUkFJQUJCZUhGQjJOQUVhaUVDQW45QnNOQUVLQUlBSWdGQkFTQUFRUU4yZENJQWNVVUVRRUd3MEFRZ0FDQUJjallDQUNBQ0RBRUxJQUlvQWdnTElRQWdBaUFJTmdJSUlBQWdDRFlDRENBSUlBSTJBZ3dnQ0NBQU5nSUlEQU1MUVI4aEJDQUFRZi8vL3dkTkJFQWdBRUVtSUFCQkNIWm5JZ0pyZGtFQmNTQUNRUUYwYTBFK2FpRUVDeUFJSUFRMkFod2dDRUlBTndJUUlBUkJBblJCNE5JRWFpRURBa0JCdE5BRUtBSUFJZ0ZCQVNBRWRDSUNjVVVFUUVHMDBBUWdBU0FDY2pZQ0FDQURJQWcyQWdBZ0NDQUROZ0lZREFFTElBQkJHU0FFUVFGMmEwRUFJQVJCSDBjYmRDRUVJQU1vQWdBaEFRTkFJQUVpQWlnQ0JFRjRjU0FBUmcwRElBUkJIWFloQVNBRVFRRjBJUVFnQWlBQlFRUnhhaUlEUVJCcUtBSUFJZ0VOQUFzZ0F5QUlOZ0lRSUFnZ0FqWUNHQXNnQ0NBSU5nSU1JQWdnQ0RZQ0NBd0NDMEc4MEFRZ0IwRW9heUlEUVhnZ0FXdEJCM0ZCQUNBQlFRaHFRUWR4R3lJQWF5SUNOZ0lBUWNqUUJDQUFJQUZxSWdBMkFnQWdBQ0FDUVFGeU5nSUVJQUVnQTJwQktEWUNCRUhNMEFSQm1OUUVLQUlBTmdJQUlBVWdCRUVuSUFSclFRZHhRUUFnQkVFbmEwRUhjUnRxUVM5cklnQWdBQ0FGUVJCcVNSc2lBMEViTmdJRUlBTkIrTk1FS1FJQU53SVFJQU5COE5NRUtRSUFOd0lJUWZqVEJDQURRUWhxTmdJQVFmVFRCQ0FITmdJQVFmRFRCQ0FCTmdJQVFmelRCRUVBTmdJQUlBTkJHR29oQUFOQUlBQkJCellDQkNBQVFRaHFJUUlnQUVFRWFpRUFJQUlnQkVrTkFBc2dBeUFGUmcwRElBTWdBeWdDQkVGK2NUWUNCQ0FGSUFNZ0JXc2lCRUVCY2pZQ0JDQURJQVEyQWdBZ0JFSC9BVTBFUUNBRVFYaHhRZGpRQkdvaEFBSi9RYkRRQkNnQ0FDSUJRUUVnQkVFRGRuUWlBbkZGQkVCQnNOQUVJQUVnQW5JMkFnQWdBQXdCQ3lBQUtBSUlDeUVDSUFBZ0JUWUNDQ0FDSUFVMkFnd2dCU0FBTmdJTUlBVWdBallDQ0F3RUMwRWZJUUFnQkVILy8vOEhUUVJBSUFSQkppQUVRUWgyWnlJQWEzWkJBWEVnQUVFQmRHdEJQbW9oQUFzZ0JTQUFOZ0ljSUFWQ0FEY0NFQ0FBUVFKMFFlRFNCR29oQXdKQVFiVFFCQ2dDQUNJQlFRRWdBSFFpQW5GRkJFQkJ0TkFFSUFFZ0FuSTJBZ0FnQXlBRk5nSUFJQVVnQXpZQ0dBd0JDeUFFUVJrZ0FFRUJkbXRCQUNBQVFSOUhHM1FoQUNBREtBSUFJUU1EUUNBRElnSW9BZ1JCZUhFZ0JFWU5CQ0FBUVIxMklRRWdBRUVCZENFQUlBSWdBVUVFY1dvaUFVRVFhaWdDQUNJRERRQUxJQUVnQlRZQ0VDQUZJQUkyQWhnTElBVWdCVFlDRENBRklBVTJBZ2dNQXdzZ0FpZ0NDQ0lBSUFnMkFnd2dBaUFJTmdJSUlBaEJBRFlDR0NBSUlBSTJBZ3dnQ0NBQU5nSUlDeUFIUVFocUlRQU1CQXNnQWlnQ0NDSUFJQVUyQWd3Z0FpQUZOZ0lJSUFWQkFEWUNHQ0FGSUFJMkFnd2dCU0FBTmdJSUMwRUFJUUJCdk5BRUtBSUFJZ0lnQmswTkFrRzgwQVFnQWlBR2F5SUNOZ0lBUWNqUUJFSEkwQVFvQWdBaUFTQUdhaUlBTmdJQUlBQWdBa0VCY2pZQ0JDQUJJQVpCQTNJMkFnUWdBVUVJYWlFQURBSUxBa0FnQjBVTkFBSkFJQU1vQWh3aUFrRUNkRUhnMGdScUlnQW9BZ0FnQTBZRVFDQUFJQUUyQWdBZ0FRMEJRYlRRQkNBSVFYNGdBbmR4SWdnMkFnQU1BZ3NnQjBFUVFSUWdCeWdDRUNBRFJodHFJQUUyQWdBZ0FVVU5BUXNnQVNBSE5nSVlJQU1vQWhBaUFBUkFJQUVnQURZQ0VDQUFJQUUyQWhnTElBTW9BaFFpQUVVTkFDQUJJQUEyQWhRZ0FDQUJOZ0lZQ3dKQUlBUkJEMDBFUUNBRElBUWdCbW9pQUVFRGNqWUNCQ0FBSUFOcUlnQWdBQ2dDQkVFQmNqWUNCQXdCQ3lBRElBWkJBM0kyQWdRZ0F5QUdhaUlGSUFSQkFYSTJBZ1FnQkNBRmFpQUVOZ0lBSUFSQi93Rk5CRUFnQkVGNGNVSFkwQVJxSVFBQ2YwR3cwQVFvQWdBaUFVRUJJQVJCQTNaMElnSnhSUVJBUWJEUUJDQUJJQUp5TmdJQUlBQU1BUXNnQUNnQ0NBc2hCQ0FBSUFVMkFnZ2dCQ0FGTmdJTUlBVWdBRFlDRENBRklBUTJBZ2dNQVF0Qkh5RUFJQVJCLy8vL0IwMEVRQ0FFUVNZZ0JFRUlkbWNpQUd0MlFRRnhJQUJCQVhSclFUNXFJUUFMSUFVZ0FEWUNIQ0FGUWdBM0FoQWdBRUVDZEVIZzBnUnFJUUVDUUFKQUlBaEJBU0FBZENJQ2NVVUVRRUcwMEFRZ0FpQUljallDQUNBQklBVTJBZ0FnQlNBQk5nSVlEQUVMSUFSQkdTQUFRUUYyYTBFQUlBQkJIMGNiZENFQUlBRW9BZ0FoQmdOQUlBWWlBaWdDQkVGNGNTQUVSZzBDSUFCQkhYWWhBU0FBUVFGMElRQWdBaUFCUVFSeGFpSUJRUkJxS0FJQUlnWU5BQXNnQVNBRk5nSVFJQVVnQWpZQ0dBc2dCU0FGTmdJTUlBVWdCVFlDQ0F3QkN5QUNLQUlJSWdBZ0JUWUNEQ0FDSUFVMkFnZ2dCVUVBTmdJWUlBVWdBallDRENBRklBQTJBZ2dMSUFOQkNHb2hBQXdCQ3dKQUlBaEZEUUFDUUNBQktBSWNJZ0pCQW5SQjROSUVhaUlBS0FJQUlBRkdCRUFnQUNBRE5nSUFJQU1OQVVHMDBBUWdCMEYrSUFKM2NUWUNBQXdDQ3lBSVFSQkJGQ0FJS0FJUUlBRkdHMm9nQXpZQ0FDQURSUTBCQ3lBRElBZzJBaGdnQVNnQ0VDSUFCRUFnQXlBQU5nSVFJQUFnQXpZQ0dBc2dBU2dDRkNJQVJRMEFJQU1nQURZQ0ZDQUFJQU0yQWhnTEFrQWdCRUVQVFFSQUlBRWdCQ0FHYWlJQVFRTnlOZ0lFSUFBZ0FXb2lBQ0FBS0FJRVFRRnlOZ0lFREFFTElBRWdCa0VEY2pZQ0JDQUJJQVpxSWdVZ0JFRUJjallDQkNBRUlBVnFJQVEyQWdBZ0NnUkFJQXBCZUhGQjJOQUVhaUVBUWNUUUJDZ0NBQ0VIQW45QkFTQUtRUU4yZENJQ0lBbHhSUVJBUWJEUUJDQUNJQWx5TmdJQUlBQU1BUXNnQUNnQ0NBc2hBeUFBSUFjMkFnZ2dBeUFITmdJTUlBY2dBRFlDRENBSElBTTJBZ2dMUWNUUUJDQUZOZ0lBUWJqUUJDQUVOZ0lBQ3lBQlFRaHFJUUFMSUF0QkVHb2tBQ0FBQ3g4QUlBQWdBU0FBSUFJUXFnRWlBaUFCUVFBUUZDRUJJQUFnQWhBVElBRUxEUUFnQUVFQUlBRkJBQkNWQkF1WUFRRUJmd0pBSUFKRklBRkNnSUNBZ0hDRFFvQ0FnSUNRZjFKeVJRUkFJQUduSWdNZ0F5Z0NBRUVCYWpZQ0FFRUVJUUlnQUNnQ0FDZ0NFQ0FERVB3RElnTkJBRW9OQVFzZ0FVSWdpS2RCZFU4RVFDQUJweUlDSUFJb0FnQkJBV28yQWdBTFFRSWhBaUFBS0FJQUlBQkJRR3NvQWdBZ0FSQytBeUlEUVFCT0RRQkJmdzhMSUFBZ0FoQVFJQUJCUUdzb0FnQWdBeEE1UVFBTHNRVUJCMzhDUUFKQUFrQWdBRUZBYXlnQ0FDSUxLQUtZQWlJT1FRQklEUUJCQWlFTkFrQUNRQ0FMS0FLQUFpQU9haUlNTFFBQUlnaEJ4d0JyRGdRRUFnSUJBQXNnQ0VIQkFFWU5BaUFJUWI0QlJ3UkFJQWhCdUFGSERRSWdEQ2dBQVNJSlFRaEdEUUlnREM4QUJTRUtJQWxCT2tjRVFDQUpRZkVBUmcwRElBbEJ6UUJIRFFVTElBc3RBRzVCQVhGRkRRUWdBRUhTNndCQkFCQVdRWDhQQ3lBTUx3QUZJUW9nRENnQUFTRUpRUUVoRFF3REMwRURJUTBNQWdzZ0IwRzlmMFlFUUNBQVFaUHZBRUVBRUJaQmZ3OExJQWRCNndCcVFRRk5CRUFnQUVIYTh3QkJBQkFXUVg4UEN5QUhRVjl4UWRzQVJnUkFJQUJCaFM5QkFCQVdRWDhQQ3lBQVFiVHZBRUVBRUJaQmZ3OExJQXdvQUFFaENVRUJJUTBMUVg4aEJ5QUxRWDgyQXBnQ0lBc2dEallDaEFJQ1FBSkFJQVlFUUFKQUFrQUNRQUpBSUFoQnh3QnJEZ1FCQXdNQ0FBc0NRQ0FJUWNFQVJ3UkFJQWhCdmdGR0RRRWdDRUc0QVVjTkJDQUxFREloQnlBQVFic0JFQkFnQUNBSkVCb2dBRUZBYXlJR0tBSUFJQWNRT1NBR0tBSUFJQW9RRnlBTElBZEJBUkJwR2tFOElRZ2dBRUU4RUJBTUJ3c2dBRUhDQUJBUUlBQWdDUkFhUWNFQUlRZ01CZ3NnQUVHL0FSQVFJQUFnQ1JBYUlBQkJRR3NvQWdBZ0NoQVhRYjRCSVFnTUJRc2dBRUh4QUJBUUlBQkJFeEFRUWNjQUlRZ01Bd3NnQUVId0FCQVFJQUJCRkJBUVFjb0FJUWdNQWdzUUFRQUxBa0FDUUFKQUlBaEJ4d0JyRGdRQkJBUUNBQXNnQ0VHNEFVY05BeUFMRURJaEJ5QUFRYnNCRUJBZ0FDQUpFQm9nQUVGQWF5SUFLQUlBSUFjUU9TQUFLQUlBSUFvUUZ5QUxJQWRCQVJCcEdrRThJUWdNQXdzZ0FFSHhBQkFRUWNjQUlRZ01BZ3NnQUVId0FCQVFRY29BSVFnTUFRc2dBQ0FJRUJBTElBRWdDRFlDQUNBQ0lBbzJBZ0FnQXlBSk5nSUFJQVFnQnpZQ0FDQUZCRUFnQlNBTk5nSUFDMEVBQzhjTUFRWi9Jd0JCSUdzaUJDUUFBa0FDUUFKQUFrQUNRQUpBQWtBQ2Z5QUFLQUlRSWdKQmczOUhCRUJCQUNBQ1FWbEhEUUVhSUFCQlFHc29BZ0FpQWkwQWJFRUJjVVVFUUNBQVFabnhBRUVBRUJZTUF3c2dBaWdDWkVVRVFDQUFRYXpOQUVFQUVCWU1Bd3RCZnlFRElBQVFFZzBJQWtBQ1FBSkFBa0FnQUNnQ0VDSUZRU2xyRGdRQ0FRRUNBQXNnQlVIZEFFWWdCVUU2YTBFQ1NYSWdCVUg5QUVaeURRRUxJQUFvQWpBTkFFRUFJUUlnQlVFcVJnUkFJQUFRRWcwTFFRRWhBZ3NnQUNBQkVMWUJSUTBCREFvTElBQkJCaEFRUVFBaEFnc2dBRUZBYXlJRktBSUFJZ010QUd3aEFTQUNCRUFnQXhBeUlRTWdCU2dDQUJBeUlRSWdBRUgrQUVIOUFDQUJRUU5HR3hBUUlBQkJEaEFRSUFCQkJoQVFJQUJCQmhBUUlBQWdBeEFlSUFCQmhRRVFFQ0FCUVFOSElnZEZCRUFnQUVHTEFSQVFDeUFBUVlFQkVCQWdBRUhDQUJBUUlBQkI2UUFRR2lBQVFlb0FRWDhRSENFR0lBQWdBaEFlUVlrQklRVWdBQ0FIQkg5QmlRRUZJQUJCd1FBUUVDQUFRY0FBRUJvZ0FFR0xBUkFRUVlvQkN4QVFJQUJCRVJBUUlBQkI2Z0JCZnhBY0lRVWdBRUVPRUJBZ0FFSHJBQ0FERUJ3YUlBQWdCUkFlSUFCQkFSQVFJQUJCUUdzaUF5Z0NBRUVDRURrZ0FFR3JBUkFRSUFCQjZnQkJmeEFjSVFVZ0FVRURSeUlIUlFSQUlBQkJpd0VRRUFzZ0FFR0dBUkFRSUFNb0FnQkJBQkJrSUFCQjZnQkJmeEFjSVFNZ0IwVUVRQ0FBUVlzQkVCQUxJQUJCZ1FFUUVDQUFRY0lBRUJBZ0FFSHBBQkFhSUFCQjZRQWdBaEFjR2lBQVFjRUFFQkFnQUVIQUFCQWFJQUFnQXhBZUlBQkJEeEFRSUFCQkR4QVFJQUJCRHhBUUlBQkJBUkRsQWlBQUlBVVFIaUFBUVlZQkVCQWdBRUZBYXlJREtBSUFRUUVRWkNBQVFlb0FRWDhRSENFRklBRkJBMGNpQVVVRVFDQUFRWXNCRUJBTElBQkJnUUVRRUNBQVFjSUFFQkFnQUVIcEFCQWFJQUJCNlFBZ0FoQWNHaUFBUWVzQUlBWVFIQm9nQUNBRkVCNGdBRUdHQVJBUUlBTW9BZ0JCQWhCa0lBQkI2Z0JCZnhBY0lRSWdBVVVFUUNBQVFZc0JFQkFMSUFBZ0FoQWVJQUJCTUJBUVFRQWhBeUFBUVFBUUdpQUFRVUJyS0FJQVFRUVFaQ0FBSUFZUUhpQUFRY0VBRUJBZ0FFSEFBQkFhSUFCQkR4QVFJQUJCRHhBUUlBQkJEeEFRREFrTElBRkJBMFlFUUNBQVFZc0JFQkFMSUFCQmlBRVFFQ0FBUWVrQVFYOFFIQ0VCSUFCQkFSRGxBZ3dFQ3lBQUtBSWdDeUVGUVg4aEF5QUFRYU4vSUFGQkJISVF1Z01OQmlBQUtBSVFJZ0pCcUg5R0JFQWdBVUY3Y1NFR0lBQkJRR3NvQWdBUU1pRUNBMEFnQUJBU0RRZ2dBRUVSRUJBZ0FFR3dBUkFRSUFCQjZRQWdBaEFjR2lBQVFRNFFFQ0FBUVFnZ0JoQ2VBZzBJSUFBb0FoQkJxSDlHRFFBTElBQWdBaEFlSUFBb0FoQWhBZ3NnQWtFL1JnUkFJQUFRRWcwSElBQkI2UUJCZnhBY0lRSWdBQkJXRFFjZ0FFRTZFQ3dOQnlBQVFlc0FRWDhRSENFR0lBQWdBaEFlSUFBZ0FVRUJjUkMyQVEwSElBQWdCaEFlSUFBb0FoQWhBZ3NnQWtFOVJ5QUNRZnNBYWlJRFFReExjVVVFUUNBQUVCSU5BU0FBSUFSQkhHb2dCRUVZYWlBRVFSUnFJQVJCRUdwQkFDQUNRVDFISUFJUXRRRkJBRWdOQVNBQUlBRVF0Z0VFUUNBQUtBSUFJQVFvQWhRUUV3d0NDeUFDUVQxR0JFQWdCQ2dDSENJQlFUeEhEUWNnQkNnQ0ZDQUZSdzBHSUFBZ0JSQ2hBUXdHQ3lBQVFiSi9JQU5COE5JQmFpMEFBQ0lCSUFOQkFrWWJJQUVnQUNnQ1FDMEFia0VFY1J0Qi93RnhFQkFnQkNnQ0hDRUJEQVlMUVFBaEF5QUNRZTRBYWtFQ1N3MEdJQUFRRWcwQUlBQWdCRUVjYWlBRVFSaHFJQVJCRkdvZ0JFRVFhaUFFUVF4cVFRRWdBaEMxQVVFQVNBMEFJQUJCRVJBUUlBSkJsSDlHQkVBZ0FFR3dBUkFRQ3lBQVFlb0FRZWtBSUFKQmszOUdHMEYvRUJ3aEFpQUFRUTRRRUNBQUlBRVF0Z0ZGRFFFZ0FDZ0NBQ0FFS0FJVUVCTUxRWDhoQXd3RkN5QUVLQUljSWdGQlBFY2dCQ2dDRkNJRElBVkhja1VFUUNBQUlBVVFvUUVMSUFRb0FneEJBV3NpQlVFRFR3MEJJQUFnQlVFVmFrSC9BWEVRRUNBQUlBRWdCQ2dDR0NBRElBUW9BaEJCQVVFQUVNRUJJQUJCNndCQmZ4QWNJUUVnQUNBQ0VCNGdCQ2dDRENFREEwQWdBd1JBSUFCQkR4QVFJQVFnQkNnQ0RFRUJheUlETmdJTURBRUxDd3NnQUNBQkVCNUJBQ0VEREFNTEVBRUFDMEU4SVFFTFFRQWhBeUFBSUFFZ0JDZ0NHQ0FFS0FJVUlBUW9BaEJCQWtFQUVNRUJDeUFFUVNCcUpBQWdBd3RhQVFOL0l3QkJFR3NpQVNRQUFrQWdBQ2dDRUNJRFFheC9SZzBBSUFOQk8wY0VRQ0FEUWYwQVJnMEJJQUFvQWpBTkFTQUJRVHMyQWdBZ0FFR2dtQUVnQVJBV1FYOGhBZ3dCQ3lBQUVCSWhBZ3NnQVVFUWFpUUFJQUlMR3dBZ0FDQUJRZjhCY1JBUklBQW9BZ1FoQVNBQUlBSVFIU0FCQ3pzQUFuOGdBQ0FCUVlDQUJFOEVmMEYvSUFBZ0FVR0FnQVJyUVFwMlFZQ3dBMm9RaXdFTkFSb2dBVUgvQjNGQmdMZ0RjZ1VnQVFzUWl3RUxDeWtCQVg4Z0FrSWdpS2RCZFU4RVFDQUNweUlESUFNb0FnQkJBV28yQWdBTElBQWdBU0FDRUlzRkN5a0JBWDhnQWtJZ2lLZEJkVThFUUNBQ3B5SURJQU1vQWdCQkFXbzJBZ0FMSUFBZ0FTQUNFS3NGQzRZR0F3ZC9BbndDZmlNQVFUQnJJZ2NrQUVFSElBSkNJSWluSWdRZ0JFRUhhMEZ1U1JzaEJVRUFJUVFDUUFKQUFrQUNRQUpBQW53Q1FBSkFBa0FDUUFKQUFrQUNRRUVISUFGQ0lJaW5JZ1lnQmtFSGEwRnVTUnNpQmtFTGFnNFRDZ2dKQXdJTEN3c0xDd1FGQUFFQkN3c0xCZ3NMSUFWQkFVY05DaUFCcHlBQ3AwWWhCQXdMQ3lBRklBWkdJUVFNQ1FzZ0JVRjVSdzBJSUFHbklBS25FSU1DUlNFRURBZ0xJQUduSUFLblJpQUZRWGhHY1NFRURBY0xJQVZCZjBjTkJpQUJweUFDcDBZaEJBd0dDeUFCcDdjaEN5QUZRUWRIQkVBZ0JRMEdJQUtudHd3Q0N5QUNRb0NBZ0lEQWdZRDgvd0I4dnd3QkN5QUJRb0NBZ0lEQWdZRDgvd0I4dnlFTElBVUVRQ0FGUVFkSERRVWdBa0tBZ0lDQXdJR0EvUDhBZkw4TUFRc2dBcWUzQ3lFTUFrQWdBd1JBSUF5OUlnSkMvLy8vLy8vLy8vLy9BSU1pQVVLQmdJQ0FnSUNBK1A4QVZDQUx2U0lOUXYvLy8vLy8vLy8vL3dDRElnNUNnSUNBZ0lDQWdQai9BRmh4UlFSQUlBNUNnWUNBZ0lDQWdQai9BRlFnQVVLQWdJQ0FnSUNBK1A4QVZuTWhCQXdIQ3lBRFFRSkhEUUVMSUFzZ0RHRWhCQXdGQ3lBQ0lBMVJJUVFNQkFzZ0JVRjJSdzBDSUFBZ0IwRWNhaUlHSUFFUXV3SWlBeUFBSUFkQkNHb2dBaEM3QWlJRkVJSUNJUVFnQXlBR1JnUkFJQWRCSEdvUUd3c2dCU0FIUVFocVJ3MENJQWRCQ0dvUUd3d0NDeUFGUVhkSERRRWdBcWNpQlVFRWFpRUlJQUduSWdaQkJHb2hDUUpBQWtBQ1FBSkFBa0FDUUFKQUlBTU9Bd1lCQUFFTElBWW9BZ3dpQkVHQWdJQ0FlRWNOQVVFQklRUWdCU2dDREVHQWdJQ0FlRVlOQnlBRktBSU1JUU5CZ0lDQWdIZ2hCQXdDQ3lBR0tBSU1JUVFMSUFVb0Fnd2hBeUFFUWYvLy8vOEhSZzBCQ3lBRFFmLy8vLzhIUnlFS1FmLy8vLzhISVFNZ0NnMEJDeUFESUFSR0lRUU1Bd3RCQUNFRUlBWW9BZ2dpQXlBRktBSUlSdzBDUVFBZ0NTQUlFTk1CSWdScklBUWdBeHRGSVFRTUFnc2dDU0FJRUlJQ0lRUU1BUXNnQlVGMVJ3MEFJQUduUVFScUlBS25RUVJxRUlnRFJTRUVDeUFBSUFFUUR5QUFJQUlRRHdzZ0IwRXdhaVFBSUFRTE53RUJmeUFBSUFJUU1TRUZJQUFnQWhBUElBVkZCRUFnQUNBREVBOUJmdzhMSUFBZ0FTQUZJQU1nQkJBWklRUWdBQ0FGRUJNZ0JBdkNBUUVGZnlNQVFTQnJJZ1VrQUFKK0FrQWdBa0tBZ0lDQWNJTkNnSUNBZ0pCL1VnUkFJQUFnQWhBM0lnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFRc2dBQ0FGUVFocUlBRVFQeUlISUFNUVB5SUlhaUFDcHlJR0tBSUVJZ1JCLy8vLy93ZHhhaUFFUVI5MkVJb0REUUFnQlVFSWFpSUVJQUVnQnhDSUFob2dCQ0FHUVFBZ0JpZ0NCRUgvLy8vL0IzRVFVUm9nQkNBRElBZ1FpQUlhSUFBZ0FoQVBJQVFRTmd3QkN5QUFJQUlRRDBLQWdJQ0E0QUFMSVFJZ0JVRWdhaVFBSUFJTElBRUJmaUFBSUFBZ0FpQUJJQU5CQkVFQUVJSUJJZ1VnQVNBRUVONEJJQVVMTkFFQmZ5QUFRVUJySWdFb0FnQW9BcVFCUVFCT0JFQWdBRUVHRUJBZ0FFSFpBQkFRSUFFb0FnQWlBQ0FBTHdHa0FSQVhDd3VKQXdBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFGQnh3QnJEZ1FCRFEwQ0FBc2dBVUU4UndSQUlBRkJ2Z0ZIQkVBZ0FVRzRBVVlOQnlBQlFjRUFSdzBPQzBFVklRUUNRQ0FGRGdVR0JnVUVBQTRMUVJzaEJBd0VDeUFBS0FJQUlBTVFFeUFBSUFRUUhndEJzd0VoQkFKQUFrQUNRQ0FGRGdVRkJnQUJBZzRMUVJZaEJBd0VDMEVaSVFRTUF3dEJIU0VFREFJTFFSY2hBUUpBSUFVT0JRb0tDUWdBQ3d0Qkh5RUJEQWdMUVJnaEJBc2dBQ0FFRUJBTEFrQWdBVUhIQUdzT0JBTUlDQWNBQ3lBQlFUeEdEUU1nQVVIQkFFWU5DQ0FCUWI0QlJnMEJJQUZCdUFGSERRY0xJQVZCQWs4TkNDQUFRYjBCUWJrQklBWWJFQkFNQ1FzZ0FFSEFBUkFRREFnTElBQkJ5UUFRRUE4TElBQkJQUkFRRHd0QkdpRUJDeUFBSUFFUUVBc2dBRUhMQUJBUUR3c1FBUUFMSUFCQnd3QVFFQ0FBUVVCcktBSUFJQU1RT1E4TFFmNkVBVUd1L0FCQnQ3a0JRYUxoQUJBQUFBc2dBRUZBYXlJQUtBSUFJQU1RT1NBQUtBSUFJQUpCLy84RGNSQVhDODBUQVF0L0l3QkJRR29pQmlRQUlBUkJBRWdFUUNBQUlBWkJLR3BCQUJDZUFSb2dCaWdDS0VFQ2NTRUVDeUFBUVVCcklnY29BZ0FRTWlFTElBY29BZ0FRTWlFTUlBY29BZ0FvQW9RQ0lRNENRQ0FEQkVBZ0FFRVJFQkFnQUVFR0VCQWdBRUdyQVJBUUlBQkI2Z0FnQ3hBY0dpQUFJQXdRSGd3QkN5QUFRZXNBSUFzUUhCb2dBQ0FNRUI0Z0FFRVJFQkFMSUFCQlFHc29BZ0FvQW9RQ0lROENRQUpBQWtBQ1FBSkFJQUFvQWhBaUIwSGJBRWNFUUNBSFFmc0FSZ1JBUVg4aEJ5QUFFQklOQmlBQVFlOEFFQkFnQkFSQUlBQkJDeEFRSUFCQkd4QVFDeUFCUVV0R0lBRkJVMFp5SVEwZ0FVR3pmMGNoRUFOQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FBS0FJUUlnZEJwMzlIQkVBZ0IwSDlBRVlOQ3lBQUlBWkJPR3BCQUVFQlFRQVF4QU1pQjBFQVNBMFNJQVpCdUFFMkFqQWdCa0VBTmdJMElBQkJRR3NpQ1NnQ0FDSUtLQUs4QVNFSUlBWkJmellDUENBR0lBZzJBaXdnQmtFQU5nSUlJQWNOQWlBQUVCSkZEUUVnQmlnQ09DRUhEQVlMSUFSRkJFQWdBQ2dDQUVHSTBRQkJBQkJHREJJTFFYOGhCeUFBRUJJTkVnSkFJQUVFUUNBR0lBQWdBaEM4QXlJSU5nSTBJQWhGRFJRZ0JrRzRBVFlDTUNBQVFVQnJLQUlBS0FLOEFTRUhJQVpCZnpZQ1BDQUdJQWMyQWl3Z0JrRUFOZ0lJREFFTElBQVFvd0lORXlBQUlBWkJNR29nQmtFc2FpQUdRVFJxSUFaQlBHb2dCa0VJYWtFQVFmc0FFTFVCRFJNTElBQW9BaEJCL1FCR0RRSWdBRUhvSmtFQUVCWU1FQXNDUUNBQUtBSVFRU0J5UWZzQVJ3MEFJQUFnQmtFb2FrRUFFSjRCSWdkQkxFWWdCMEg5QUVaeVJTQUhRVDFIY1EwQUFrQWdCaWdDT0NJSFJRUkFJQVFFUUNBQVFmQUFFQkFnQUVFWUVCQWdBRUVIRUJBZ0FFSFJBQkFRSUFCQkdCQVFDeUFBUWNnQUVCQU1BUXNnQkFSQUlBQkJHeEFRSUFCQkJ4QVFJQUJCekFBUUVDQUFJQWNRR2lBQVFSc1FFQXNnQUVIQ0FCQVFJQWtvQWdBZ0J4QTVDMEYvSVFjZ0FDQUJJQUpCQVVGL1FRRVF3Z0ZCQUVnTkVpQUFLQUlRUWYwQVJnMEtJQUJCTEJBc1JRMExEQklMQWtBQ2Z5QUdLQUk0SWdkRkJFQWdBRUh4QUJBUUlBUkZCRUJCRWlFSURBTUxRUmdoQ2lBQVFSZ1FFQ0FBUVFjUUVDQUFRZEVBRUJCQkVnd0JDeUFFUlFSQVFSRWhDQXdDQzBFYklRb2dBRUViRUJBZ0FFRUhFQkFnQUVITUFCQVFJQUFnQnhBYVFSRUxJUWdnQUNBS0VCQUxJQUFnQ0JBUUlBRUVRQ0FHSUFBZ0FoQzhBeUlJTmdJMElBaEZEUVVnQjBVTkJBd0dDeUFBRUtNQ0RRUU1BZ3NDUUNBQ0JIOGdBQ0FHS0FJNElnY1Exd1FOQlNBSktBSUFCU0FLQ3kwQWJrRUJjVVVOQUNBR0tBSTRJZ2RCelFCSElBZEJPa2R4RFFBZ0FFR0ZMMEVBRUJZTUJBc2dCQVJBSUFCQkd4QVFJQUJCQnhBUUlBQkJ6QUFRRUNBQUlBWW9BamdRR2lBQVFSc1FFQXNnQVVFQUlCQWJSUVJBSUFCQkVSQVFJQUJCdUFFUUVDQUFJQVlvQWpnaUJ4QWFJQWtvQWdBaUNDQUlMd0c4QVJBWERBSUxJQVlnQUNnQ0FDQUdLQUk0RUJnaUJ6WUNOQ0FBUWNJQUVCQWdDU2dDQUNBSEVEa01CZ3NnQUVFTEVCQWdBRUhUQUJBUUlBQkJRR3NvQWdBZ0JpZ0NDQ0lIUVFKMFFRUnFJQWRCQlhSQlFHdHlRZndCY1JCa0RBUUxJQUFnQmtFd2FpQUdRU3hxSUFaQk5Hb2dCa0U4YWlBR1FRaHFRUUJCK3dBUXRRRU5BU0FHS0FJSUlRZ0NRQUpBSUFkRkJFQkJIaUVIQWtBZ0NFRUJhdzREQXdJQUJBdEJJQ0VISUFCQklCQVFEQUlMSUFoQkFXc2lDRUVEVHcwRUlBQWdDRUVCZEVFYmFrSC9BWEVRRUF3RUMwRWNJUWNMSUFBZ0J4QVFDeUFBUWNjQUVCQU1BZ3NnQUNnQ0FDQUhFQk1NQ2dzZ0FFSEJBQkFRSUFrb0FnQWdCeEE1Q3lBQlJRMEJJQVlvQWpRaEJ3c2dBQ0FISUFFUW9RSU5CeUFHSUFCQlFHc29BZ0FvQXJ3Qk5nSXNDd0pBSUFBb0FoQkJQVWNFUUNBR0tBSXdJUWNNQVFzZ0FFRVJFQkFnQUVFR0VCQWdBRUdyQVJBUUlBQkI2UUJCZnhBY0lRZ2dBQkFTRFFjZ0FFRU9FQkFnQUJCV0RRY2dCaWdDTUNJSFFiZ0JSeUFIUVR4SGNVVUVRQ0FBSUFZb0FqUVFvUUVMSUFBZ0NCQWVDeUFBSUFjZ0JpZ0NMQ0FHS0FJMElBWW9BanhCQVNBTkVNRUJJQUFvQWhCQi9RQkdEUUJCZnlFSElBQkJMQkFzUlEwQkRBZ0xDeUFBUVE0UUVDQUVCRUFnQUVFT0VCQUxRWDhoQnlBQUVCSkZEUUlNQmdzZ0FFSGpJRUVBRUJZTUJBc2dBQkFTRFFNZ0JpQUFRVUJySWdrb0FnQWlCQ2dDc0FJMkFnZ2dCQ0FHUVFocU5nS3dBaUFHUVg4MkFod2dCa0wvLy8vL0x6Y0NGQ0FHUW9DQWdJQndOd0lNSUFRb0Fyd0JJUVFnQmtFQk5nSWtJQVlnQkRZQ0lDQUFRZjBBRUJBZ0FVRkxSaUFCUVZOR2NpRU5BMEFDUUNBQUtBSVFJZ2RCM1FCR0RRQWdCeUlFUWFkL1J5SUtSUVJBSUFBUUVnMEdRY0NRQVNFSUlBQW9BaEFpQkVFc1JpQUVRZDBBUm5JTkJBc0NRQUpBSUFSQit3QkdJQVJCMndCR2NrVUVRQ0FFUVN4SERRRWdBRUdBQVJBUUlBa29BZ0JCQUJCa0lBQkJEaEFRSUFCQkRoQVFEQUlMSUFBZ0JrRW9ha0VBRUo0QklnUkJMRVlnQkVIZEFFWnlSU0FFUVQxSGNRMEFBa0FnQ2tVRVFDQUVRVDFHQkVCQnpPRUFJUWdNQ0FzZ0FFRUFFTllFREFFTElBQkJnQUVRRUNBSktBSUFRUUFRWkNBQVFRNFFFQXNnQUNBQklBSkJBU0FHS0FJb1FRSnhRUUVRd2dGQkFFZ05Cd3dCQ3lBR1FRQTJBamdnQmtFQU5nSTBBa0FnQVFSQUlBWWdBQ0FDRUx3RElnUTJBalFnQkVVTkJ5QUFJQVFnQVJDaEFnMEhJQVpCdUFFMkFqQWdCaUFKS0FJQUtBSzhBVFlDTEF3QkN5QUFFS01DRFFjZ0FDQUdRVEJxSUFaQkxHb2dCa0UwYWlBR1FUeHFJQVpCT0dwQkFFSGJBQkMxQVEwSEN3SkFJQXBGQkVBZ0FDQUdLQUk0RU5ZRURBRUxJQUJCZ0FFUUVDQUpLQUlBSUFZdEFEZ1FaQ0FBUVE0UUVDQUFLQUlRUVQxSERRQWdBRUVSRUJBZ0FFRUdFQkFnQUVHckFSQVFJQUJCNlFCQmZ4QWNJUVFnQUJBU0RRWWdBRUVPRUJBZ0FCQldEUVlnQmlnQ01DSUlRYmdCUnlBSVFUeEhjVVVFUUNBQUlBWW9BalFRb1FFTElBQWdCQkFlQ3lBQUlBWW9BakFnQmlnQ0xDQUdLQUkwSUFZb0FqeEJBU0FORU1FQkN5QUFLQUlRUWQwQVJnMEFJQWRCcDM5R0JFQkI2ZVFBSVFnTUJBc2dBRUVzRUN4RkRRRU1CUXNMSUFCQmd3RVFFQ0FBUVVCcktBSUFJZ0VnQVNnQ3NBSW9BZ0EyQXJBQ0lBQVFFZzBEQ3dKQUlBVkZEUUFnQUNnQ0VFRTlSdzBBUVg4aEJ5QUFRZXNBUVg4UUhDRUJJQUFRRWcwRUlBQWdDeEFlSUFNRVFDQUFRUTRRRUFzZ0FCQldEUVFnQUVIckFDQU1FQndhSUFBZ0FSQWVRUUVoQnd3RUN5QURSUVJBSUFCQmhjOEFRUUFRRmd3REN5QUFRVUJySWdBb0FnQW9Bb0FDSUE1cVFiTUJJQThnRG1zUUt4b2dBQ2dDQUNnQ3BBSWdDMEVVYkdvaUFDQUFLQUlBUVFGck5nSUFRUUFoQnd3REN5QUFJQWhCQUJBV0RBRUxJQUFvQWdBZ0JpZ0NOQkFUQzBGL0lRY0xJQVpCUUdza0FDQUhDNDBDQVFKL0l3QkJNR3NpQlNRQUFuOGdBaUFCS0FJQVR3UkFJQVVnQWpZQ0pDQUZJQU0yQWlBZ0FFSDdrZ0VnQlVFZ2FoQkdRWDhNQVFzQ1FDQUJLQUlFSUFST0RRQWdBU0FFTmdJRUlBUkIvLzhEU0EwQUlBVWdBallDQkNBRklBTTJBZ0FnQUVHamt3RWdCUkJHUVg4TUFRc2dBU2dDQ0NBQ1FRRjBhaUlETHdFQUlnWkIvLzhEUndSQVFRQWdCQ0FHUmcwQkdpQUZJQUkyQWhnZ0JTQUVOZ0lVSUFVZ0JqWUNFQ0FBUWRTU0FTQUZRUkJxRUVaQmZ3d0JDeUFESUFRN0FRQkJmeUFBSUFGQkRHcEJCQ0FCUVJScUlBRW9BaEJCQVdvUWVBMEFHaUFCSUFFb0FoQWlBRUVCYWpZQ0VDQUJLQUlNSUFCQkFuUnFJQUkyQWdCQkFBc2hBeUFGUVRCcUpBQWdBd3NUQUNBQUlBRWdBaUFESUFSQkFFRUFFUGdCQ3prQUlBQkIvd0JOQkVBZ0FFRURka0g4Ly8vL0FYRkJvSUVDYWlnQ0FDQUFka0VCY1E4TElBQkJmbkZCak1BQVJpQUFFTklFUVFCSGNndG1BUUYvQW45QkFDQUFLQUlJSWdJZ0FVOE5BQnBCZnlBQUtBSU1EUUFhSUFBb0FoUWdBQ2dDQUNBQ1FRTnNRUUYySWdJZ0FTQUJJQUpKR3lJQklBQW9BaEFSQVFBaUFrVUVRQ0FBUVFFMkFneEJmdzhMSUFBZ0FUWUNDQ0FBSUFJMkFnQkJBQXNMckFFQ0FYOEJmaUFBS1FJRUlnU25RZi8vLy84SGNTRURBa0FDUUNBRVFvQ0FnSUFJZzFCRkJFQWdBaUFESUFJZ0Ewb2JJUU1nQUVFUWFpRUFBMEFnQWlBRFJnMENJQUFnQWtFQmRHb3ZBUUFnQVVZTkF5QUNRUUZxSVFJTUFBc0FDeUFCUWY4QlN3MEFJQUlnQXlBQ0lBTktHeUVESUFCQkVHb2hBQ0FCUWY4QmNTRUJBMEFnQWlBRFJnMEJJQUFnQW1vdEFBQWdBVVlOQWlBQ1FRRnFJUUlNQUFzQUMwRi9JUUlMSUFJTHBnRUJBWDhqQUVFUWF5SURKQUFnQXlBQ053TUlBa0FnQUNBQlFZWUJJQUZCQUJBVUlnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQUlRT0FSQUlBQWdBaUFCUVFFZ0EwRUlhaEF2SWdKQy8vLy8vMjlXSUFKQ2dJQ0FnTEIvZzBLQWdJQ0FJRkZ5RFFFZ0FDQUNFQThnQUVHSzB3QkJBQkFWUW9DQWdJRGdBQ0VDREFFTElBQWdBaEFQSUFBZ0FTQURJQU5CQ0dvUThRUWhBZ3NnQTBFUWFpUUFJQUlMb3dFQ0EzOEJmaUFBUVJCcUlRSWdBU2dDQUNJRVFRRnFJUU1DUUNBQUtRSUVJZ1ZDZ0lDQWdBaURVRVVFUUNBQ0lBUkJBWFJxTHdFQUlnQkJnUGdEY1VHQXNBTkhJQU1nQmFkQi8vLy8vd2R4VG5JTkFTQUNJQU5CQVhScUx3RUFJZ0pCZ1BnRGNVR0F1QU5IRFFFZ0FFRUtkRUdBK0Q5eElBSkIvd2R4Y2tHQWdBUnFJUUFnQkVFQ2FpRUREQUVMSUFJZ0JHb3RBQUFoQUFzZ0FTQUROZ0lBSUFBTFVRRURmd0pBQTBBZ0FVS0FnSUNBY0ZRTkFTQUJweUlDTHdFR0lnUkJNRVlFUUNBQ0tBSWdJZ0pGRFFJZ0FpMEFFUVJBSUFBUXRnSkJmdzhMSUFJcEF3QWhBUXdCQ3dzZ0JFRUNSaUVEQ3lBREN4SUFJQUFnQVNBQ0lBTWdCRUhLQUJDa0JBdE9BUUYvSUFBb0Fnd2lCRVVFUUVFQUR3c2dBQ0FBS0FJSVFmLy8vLzhEUVlHQWdJQjhJQUVnQVVHQmdJQ0FmRXdiSWdFZ0FVSC8vLy8vQTA0YmFqWUNDQ0FBSUFJZ0F5QUVRUUFRcWdNTEpRQWdBQ0FCSUFBb0FoQW9Bb3dCSWdBRWZ5QUFLQUlvUVFKMlFRRnhCVUVBQ3hDV0JRc2ZBUUYvSUFBb0Fnd2lBMFVFUUVFQUR3c2dBQ0FCSUFJZ0EwRUFFS29EQzkwQkFnSi9BbjRDUUNBQUlBQXBBekJCRHhCSklnaENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQVJCQTNSQkNHb1FLU0lHUlFSQUlBQWdDQkFQREFFTElBWWdBenNCQmlBR0lBUTZBQVVnQmlBQ09nQUVJQVlnQVRZQ0FFRUFJUU1nQkVFQUlBUkJBRW9iSVFFRFFDQUJJQU5IQkVBZ0JTQURRUU4wSWdScUtRTUFJZ2xDSUlpblFYVlBCRUFnQ2FjaUJ5QUhLQUlBUVFGcU5nSUFDeUFFSUFacUlBazNBd2dnQTBFQmFpRUREQUVMQ3lBSVFvQ0FnSUJ3V2dSQUlBaW5JQVkyQWlBTElBQWdDRUV2SUFJUWxnTWdDQThMUW9DQWdJRGdBQXVEQ3dJSGZ3RitJd0JCSUdzaUNTUUFBa0FDUUFKQUFrQUNRQUpBQW44Q1FBSkFBa0FDUUFKQUlBRkNJSWluUVFGcURnVURBZ0lBQVFJTElBQWdBeEFQSUFBZ0FrSG0wd0FRandGQmZ5RUZEQW9MSUFBZ0F4QVBJQUFnQWtIUitBQVFqd0ZCZnlFRkRBa0xJQUFnQVJDTkJLY2hCZ3dCQ3lBQnB5RUdBa0FEUUNBR0tBSVFJZ2RCTUdvaENDQUhJQWNvQWhnZ0FuRkJmM05CQW5ScUtBSUFJUVVEUUNBRlJRUkFJQVloQjBFQURBVUxJQUlnQ0NBRlFRRnJRUU4wSWdkcUlnVW9BZ1JIQkVBZ0JTZ0NBRUgvLy84ZmNTRUZEQUVMQ3lBR0tBSVVJQWRxSVFjZ0JTZ0NBQ0lJUVlDQWdNQitjVUdBZ0lEQUFFWUVRQ0FBSUFjZ0F4QWdEQVVMQWtBZ0NFR0FnSUNBQW5FRVFDQUdMd0VHUVFKSERRRWdBa0V3UncwRElBQWdCaUFESUFRUXl3VWhCUXdMQ3lBSVFScDJRVEJ4SWdoQk1FY0VRQ0FJUVNCSEJFQWdDRUVRUncwSUlBQWdCeWdDQkNBQklBTWdCQkNMQXlFRkRBd0xJQVl2QVFaQkMwWU5CeUFBSUFjb0FnQW9BaEFnQXhBZ0RBWUxJQUFnQmlBQ0lBY2dCUkRJQWtVTkFRd0pDd3RCMllBQlFhNzhBRUdQd2dCQnVOWUFFQUFBQzBISzJBQkJydndBUVpEQ0FFRzQxZ0FRQUFBTFFRRUxJUVVEUUFKQUFrQWdCVVVFUUFKQUlBWXRBQVVpQlVFRWNVVU5BQUpBSUFWQkNIRUVRQ0FDUVFCSUJFQWdBa0gvLy8vL0IzRWlCU0FHS0FJb1R3MENJQVlnQjBjTkJTQUFJQUVnQmEwZ0F5QUVFTmNCSVFVTURRc2dCaThCQmtFVmEwSC8vd054UVFwTERRSWdBQ0FDRUo0RElnaEZEUUpCZnlFRklBaEJBRTROQ1F3S0N5QUFLQUlRS0FKRUlBWXZBUVpCR0d4cUtBSVVJZ1ZGRFFFZ0JTZ0NHQ0lJQkVBZ0JpQUdLQUlBUVFGcU5nSUFJQUFnQnExQ2dJQ0FnSENFSWd3Z0FpQURJQUVnQkNBSUVTMEFJUVVnQUNBTUVBOE1DZ3NnQlNnQ0FDSUZSUTBCSUFZZ0JpZ0NBRUVCYWpZQ0FDQUFJQWtnQnExQ2dJQ0FnSENFSWd3Z0FpQUZFUmNBSVFVZ0FDQU1FQThnQlVFQVNBMEpJQVZGRFFFZ0NTMEFBRUVRY1FSQUlBQWdDU2tER0NJTXAwRUFJQXhDZ0lDQWdIQ0RRb0NBZ0lBd1Voc2dBU0FESUFRUWl3TWhCU0FBSUFrcEF4QVFEeUFBSUFrcEF4Z1FEd3dNQ3lBQUlBa3BBd2dRRHlBSkxRQUFRUUp4UlEwSElBWWdCMGNOQXlBQUlBRWdBaUFEUW9DQWdJQXdRb0NBZ0lBd1FZREFBQkJ0SVFVTUNRc2dCaThCQmtFVmEwSC8vd054UVF0SkRRY0xJQVlvQWhBb0Fpd2hCa0VCSVFVTUF3c2dCa1VOQUFOQUlBWW9BaEFpQlVFd2FpRUtJQVVnQlNnQ0dDQUNjVUYvYzBFQ2RHb29BZ0FoQlFOQUlBVkZEUU1nQWlBS0lBVkJBV3RCQTNRaUJXb2lDQ2dDQkVjRVFDQUlLQUlBUWYvLy94OXhJUVVNQVFzTElBWW9BaFFnQldvaENnSkFJQWdvQWdBaUJVRWFka0V3Y1NJTFFUQkhCRUFnQzBFUVJ3MEJJQUFnQ2lnQ0JDQUJJQU1nQkJDTEF5RUZEQXNMUVg4aEJTQUFJQVlnQWlBS0lBZ1F5QUpGRFFFTUNnc0xJQVZCZ0lDQXdBQnhEUUVNQkFzZ0JFR0FnQVJ4QkVBZ0FDQURFQThnQUNBQ0VNY0NRWDhoQlF3SUN5QUhSUVJBSUFBZ0F4QVBJQUFnQkVHQU1SQnZJUVVNQ0FzZ0J5MEFCU0lHUVFGeFJRUkFJQUFnQXhBUElBQWdCRUgzNkFBUWJ5RUZEQWdMSUFaQkJIRUVRQUpBSUFKQkFFNE5BQ0FHUVFoeFJTQUhMd0VHUVFKSGNnMEFJQWNvQWlnZ0FrSC8vLy8vQjNGSERRQWdBQ0FISUFNZ0JCRDlBeUVGREFrTElBQWdCeUFDSUFOQ2dJQ0FnREJDZ0lDQWdEQWdCRUdIemdCeUVJRUVJUVVNQmdzZ0FDQUhJQUpCQnhCNklnSkZEUVlnQWlBRE53TUFEQUlMUVFBaEJRd0FDd0FMUVFFaEJRd0VDeUFBSUFNUUR5QUFJQVFnQWhEQUFpRUZEQU1MSUFBZ0FDQURFSTBCSWdFUUQwRi9JUVVnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBZ0JFR1VJQkJ2SVFVTUFnc2dBQ0FERUE4TUFRc2dBQ0FERUE5QmZ5RUZDeUFKUVNCcUpBQWdCUXNPQUNBQVFRQWdBVUVRY2hET0FRdGhBQ0FBSUFFZ0FrS0FnSUNBQ0h4Qy8vLy8vdzlZQkg0Z0FrTC8vLy8vRDRNRlFvQ0FnSURBZmlBQ3ViMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzZ0F5QUVRUWR5RUwwQkM2c0JBUWgvSUFBb0FnZ2lBeUFCS0FJSUlnSkhCRUJCZjBFQklBSWdBMG9iRHdzZ0FTZ0NEQ0lGSUFBb0Fnd2lCaUFGSUFVZ0JrZ2JJZ0pySVFnZ0JpQUNheUVKQW44RFFFRUFJQUpCQVdzaUFrRUFTQTBCR2tFQUlRTkJBQ0VFSUFJZ0NXb2lCeUFHU1FSQUlBQW9BaEFnQjBFQ2RHb29BZ0FoQkFzZ0FpQUlhaUlISUFWSkJFQWdBU2dDRUNBSFFRSjBhaWdDQUNFREN5QURJQVJHRFFBTFFYOUJBU0FESUFSTEd3c0xpZ0VCQW44Z0FTZ0NFQ0lETFFBUVJRUkFRUUFQQ3dKQUlBTW9BZ0JCQVVjRVFDQUNCSDhnQWlnQ0FDQURhMEV3YTBFRGRRVkJBQXNoQkNBQUlBTVF6Z1VpQTBVRVFFRi9Ed3NnQUNnQ0VDQUJLQUlRRUpFQ0lBRWdBellDRUNBQ1JRMEJJQUlnQXlBRVFRTjBha0V3YWpZQ0FFRUFEd3NnQUNnQ0VDQURFSkFFSUFOQkFEb0FFQXRCQUF0N0FRRi9RWDhoQkFKQUlBQWdBUkFsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBR25JQUlRK1FNaEJDQUFJQUVRRHlBRURRQWdBMEdBZ0FGeFJRUkFRUUFoQkNBRFFZQ0FBbkZGRFFFZ0FDZ0NFQ2dDakFFaUFrVU5BU0FDTFFBb1FRRnhSUTBCQ3lBQVFhd2JRUUFRRlVGL0lRUUxJQVFMTlFBZ0FDQUNRVEFnQWtFQUVCUWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQUZCQURZQ0FFRi9Ed3NnQUNBQklBSVFtQUVMeEFVQkJIOGpBRUVnYXlJSUpBQUNRQUpBQWtBQ1FBSkFJQUZDZ0lDQWdIQlVJQUpDLy8vLy93OVdjZzBBSUFLbklRWUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FCcHlJRkx3RUdRUUpyRGg0QUNnb0tDZ29KQ2dvS0Nnb0tDZ29LQ2dvS0J3WUdCUVVFQkFNREFnRUtDeUFGS0FJb0lnY2dCa3NOQ3lBR0lBZEhEUWtnQlMwQUJVRUpjVUVKUncwSklBVW9BaEFoQmdOQUFrQWdCaWdDTENJSEJFQWdCeWdDRUNFR0FrQWdCeThCQmtFQmF3NENBQUlOQ3lBR0xRQVJSUTBDREF3TElBQWdCU0FESUFRUS9RTWhCd3dQQ3lBSExRQUZRUWh4RFFBTERBa0xRWDhoQnlBQUlBaEJHR29nQXhCdURRd2dCU2dDS0NBR1RRMEdJQVVvQWlRZ0JrRURkR29nQ0NzREdEa0RBQXdMQzBGL0lRY2dBQ0FJUVJocUlBTVFiZzBMSUFVb0FpZ2dCazBOQlNBRktBSWtJQVpCQW5ScUlBZ3JBeGkyT0FJQURBb0xJQUFnQ0VFSWFpQURFTVVGRFFjZ0JTZ0NLQ0FHVFEwRUlBVW9BaVFnQmtFRGRHb2dDQ2tEQ0RjREFBd0pDMEYvSVFjZ0FDQUlRUlJxSUFNUW1BRU5DU0FGS0FJb0lBWk5EUU1nQlNnQ0pDQUdRUUowYWlBSUtBSVVOZ0lBREFnTFFYOGhCeUFBSUFoQkZHb2dBeENZQVEwSUlBVW9BaWdnQmswTkFrRUJJUWNnQlNnQ0pDQUdRUUYwYWlBSUtBSVVPd0VBREFnTFFYOGhCeUFBSUFoQkZHb2dBeENZQVEwSElBVW9BaWdnQmswTkFTQUZLQUlrSUFacUlBZ29BaFE2QUFBTUJndEJmeUVISUFBZ0NFRVVhaUFERU1RRkRRWWdCU2dDS0NBR1RRMEFJQVVvQWlRZ0Jtb2dDQ2dDRkRvQUFBd0ZDeUFBSUFSQmxDQVFieUVIREFVTElBVW9BaWdnQmswTkFDQUFJQVVvQWlRZ0JrRURkR29nQXhBZ0RBTUxJQUFnQWhBeElRVWdBQ0FDRUE4Z0JVVUVRQ0FBSUFNUUR3d0JDeUFBSUFFZ0JTQURJQVFRMEFFaEJ5QUFJQVVRRXd3REMwRi9JUWNNQWdzZ0FDQUZLQUlrSUFaQkEzUnFJQU1RSUF0QkFTRUhDeUFJUVNCcUpBQWdCd3V1eUFFREpuOEhmZ044SXdCQm9BRnJJZ2doRGlBSUpBQWdBQ2dDRUNFV1FvQ0FnSURnQUNFdUFrQWdBQkI3RFFBQ2Z3SkFBa0FDUUFKQUFrQWdBVUwvLy8vL2IxZ0VRQ0FHUVFSeFJRMEJJQUduSWdjb0Fqd2hDQ0FIS0FJWUlob29BaVFoRkNBYUtBSWdJaE1vQWpBaEJpQVRMd0VxSVEwZ0IwRUFOZ0k4SUFjZ0ZpZ0NqQUUyQWhBZ0J5Z0NJQ0VWSUFjb0FqQWhDaUFIS0FJa0lSRWdGaUFIUVJCcUloSTJBb3dCSUJFZ0RVRURkR29oSENBVklSY2dDaUVOSUFjb0FneEZEUVFNQlFzZ0FhY2lHaThCQmlJSFFRMUdEUUlnRmlnQ1JDQUhRUmhzYWlnQ0VDSUlEUUVMSUFCQm04d0FRUUFRRlF3RkN5QUFJQUVnQWlBRUlBVWdCaUFJRVJZQUlTNE1CQXNnRmlnQ2VDQU9JQm9vQWlBaUV5OEJMaUFUTHdFcUlndHFJQk12QVNnaUJ5QUhRUUFnQkNBSFNCc2dCa0VDY1VFQmRoc2lCbXBCQTNRaUZXdExCRUFnQUJEcEFRd0VDeUFUTFFBUUlRb2dEaUFPUWNnQWFpSVhOZ0pNSUE0Z0JEWUNWQ0FPSUFvMkFsZ2dEaUFYTmdKSUlBNGdBVGNET0NBYUtBSWtJUlFnQ0NBVlFROXFRZkQvL3dGeGF5SVhKQUFnQlNFVklBWUVRQ0FISUFRZ0J5QUVJQWRJR3lJSVFRQWdDRUVBU2hzaUNHc2lGVUVBSUFjZ0ZVOGJJUkVEUUFKQUlBZ2dDVVlFUUFOQUlBZ2dFVVlOQWlBWElBaEJBM1JxUW9DQWdJQXdOd01BSUFoQkFXb2hDQXdBQ3dBTElBVWdDVUVEZENJVmFpa0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnb2dDaWdDQUVFQmFqWUNBQXNnRlNBWGFpQUJOd01BSUJGQkFXb2hFU0FKUVFGcUlRa01BUXNMSUE0Z0J6WUNWQ0FYSVJVTElBNGdGVFlDUUNBT0lCY2dCa0VEZEdvaUVUWUNSRUVBSVFnRFFDQUlJQXRIQkVBZ0VTQUlRUU4wYWtLQWdJQ0FNRGNEQUNBSVFRRnFJUWdNQVFzTElCTW9BaFFoQ2lBT0lCWW9Bb3dCTmdJd0lCWWdEa0V3YWlJU05nS01BU0FUS0FJd0lRWWdFU0FMUVFOMGFpSUlJUndMUVFBTUFRdEJBUXNoQndOQUFrQUNRQUpBQWtBZ0IwVUVRQ0FFUVFOMElTY2dBMEtBZ0lDQWNJTWhNeUFSUVFocUlSMGdFVUVRYWlFZUlCRkJHR29oSHlBVlFRaHFJU0FnRlVFUWFpRWhJQlZCR0dvaElpQVNRUmhxSVNnZ0JrSElBV29oR3lBY1FSaHFJU2tnQmtIQUFXb2hHU0FDUWlDSXB5SWtRWDV4SVNvZ0EwSWdpS2NoS3lBRXJTRXlJQU9uSVNVZ0RrRXdhaUVzSUE1QjZBQnFJU1lnQ0NFSEFrQURRQUpBSUFwQkFXb2hEVUlCSVM1Q2dJQ0FnREFoQVFKL0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSi9Ba0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdDaTBBQUNJSlFRRnJEdlVCQUFFbENaSUJDZ3NNRFE0UEVCRVNFeFFWR0JZWEdSb2JIQ0VpSXlRZElCNGZLU2NuS2lvckxOc0IrZ0V0TGk4dzJRRXhNak0wTlRZM09EazVPam83bndHaUFUMDhQbzhCa0FHUkFaTUJsQUdWQVowQm5nR2hBYUFCb3dHV0FaY0JtQUdaQVpvQnBBR21BYWNCbXdHYkFad0JuQUUvUUVGQ1EwUnNiVzV5YzNSMWIzQnhkbjE4ZVlBQmdRR0NBY3NCekFITkFjNEJ6Z0hPQWM0QnpnSE9BWGQzZDNpREFZVUJod0dFQVlZQmlRR0lBWW9CaXdHTUFZMEIyUUg1QWRnQjJBSGFBYkFCcndHeUFiRUJzd0d6QWJVQnRBR3BBYllCamdISUFja0J5Z0dyQWF3QnJRR29BYW9CcmdHM0Fia0J1QUc5QWI0QnZ3SEFBY2NCeGdIQkFjSUJ3d0hFQWJvQnZBRzdBZFFCeFFHdEFmTUJBZ0lDQWdJQ0FnSUNBd1FGQmdkRlJrZElTVXBMVEUxT1QxQlJVbE5VVlZaWFdGbGFXMXhkWGw5Z1lXSmpaR1ZtWjJocGFtc0lmMzU3ZWlZbUppYlBBZEFCMFFIU0FkWUJDeUFJSUFvMUFBRTNBd0FnQ2tFRmFpRU5JQWhCQ0dvaEJ3enlBUXNnRXlnQ05DQU5LQUFBUVFOMGFpa0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnY2dCeWdDQUVFQmFqWUNBQXNnQ0NBQk53TUFJQXBCQldvaERTQUlRUWhxSVFjTThRRUxJQWdnQ1VHMUFXdXROd01BSUFoQkNHb2hCd3p3QVFzZ0NDQUtNQUFCUXYvLy8vOFBnemNEQUNBS1FRSnFJUTBnQ0VFSWFpRUhETzhCQ3lBSUlBb3lBQUZDLy8vLy93K0ROd01BSUFwQkEyb2hEU0FJUVFocUlRY003Z0VMSUJNb0FqUWdDaTBBQVVFRGRHb3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFwQkFtb2hEU0FJSUFFM0F3QWdDRUVJYWlFSERPMEJDeUFUS0FJMElBb3RBQUZCQTNScUtRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFLUVFKcUlRMGdDQ0FHSUFFZ0ZDQVNFSXdFSWdFM0F3QWdDRUVJYWlFSElBRkNnSUNBZ0hDRFFvQ0FnSURnQUZJTjdBRU03Z0VMSUFnZ0JrRXZFQzAzQXdBZ0NFRUlhaUVIRE9zQkN5QUdJQWhCQ0dzaUJ5a0RBQ0lCUVRBZ0FVRUFFQlFpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTN1QVNBR0lBY3BBd0FRRHlBSElBRTNBd0FNNUFFTElBZ2dCaUFLS0FBQkVGdzNBd0FnQ2tFRmFpRU5JQWhCQ0dvaEJ3enBBUXNnQ0VLQWdJQ0FNRGNEQUNBSVFRaHFJUWNNNkFFTElBaENnSUNBZ0NBM0F3QWdDRUVJYWlFSERPY0JDd0pBQWtBQ1FDQWtRWDlHRFFBZ0V5MEFFRUVCY1EwQUlDcEJBa1lFUUNBWktRTUFJaTVDSUlpblFYUkxEUUlNQXdzZ0JpQUNFQ1VpTGtLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBDRE8wQkN5QUNJUzRnSkVGMVNRMEJDeUF1cHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnTGpjREFDQUlRUWhxSVFjTTVnRUxJQWhDZ0lDQWdCQTNBd0FnQ0VFSWFpRUhET1VCQ3lBSVFvR0FnSUFRTndNQUlBaEJDR29oQnd6a0FRc2dDQ0FHRURRaUFUY0RBQ0FJUVFocUlRY2dBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnM2pBUXpsQVFzZ0NrRUNhaUVOQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FLTFFBQkRnY0FBUUlEQkFVR0J3c0NRQ0FHSUFZb0FpZ3BBd2hCQ0JCSklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUdJQUduSWd0Qk1FRURFSG9nTWpjREFDQUVRUUJNQkVCQkFDRUpET3NCQzBFQUlRY2dCaUFuRUNraUNRMEJJQVlnQVJBUEN5QUlRb0NBZ0lEZ0FEY0RBQ0FJUVFocUlRZ003Z0VMQTBBZ0JDQUhSZzNwQVNBRklBZEJBM1FpQ21vcEF3QWlMVUlnaUtkQmRVOEVRQ0F0cHlJTUlBd29BZ0JCQVdvMkFnQUxJQWtnQ21vZ0xUY0RBQ0FIUVFGcUlRY01BQXNBQ3lBVEx3RW9JUWtnQmlBR0tBSW9LUU1JUVFrUVNTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRlWUJJQVlnQWFjaURFRXdRUU1RZWlBeU53TUFRUUFoQnlBRUlBa2dCQ0FKU0JzaUNVRUFJQWxCQUVvYklROERRQ0FISUE5SEJFQWdCaUFTSUFkQkFSQ0xCQ0lMUlEzbkFTQUdJQXdnQjBHQWdJQ0FlSEpCSnhCNkloQUVRQ0FRSUFzMkFnQWdCMEVCYWlFSERBSUZJQVlvQWhBZ0N4RHJBUXpvQVFzQUN3c0RRQ0FFSUFsSEJFQWdCU0FKUVFOMGFpa0RBQ0l0UWlDSXAwRjFUd1JBSUMybklnY2dCeWdDQUVFQmFqWUNBQXNnQmlBQklBa2dMVUVIRUs4QklRY2dDVUVCYWlFSklBZEJBRTROQVF6bkFRc0xJQVlwQTZnQklpMUNJSWluUVhWUEJFQWdMYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUdJQUZCMFFFZ0xVRURFQmthSUFZb0FoQW9Bb3dCS1FNSUlpMUNJSWluUVhWUEJFQWdMYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUdJQUZCemdBZ0xVRURFQmthSUFnZ0FUY0RBQ0FJUVFocUlRY002QUVMSUJJcEF3Z2lBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnQVRjREFDQUlRUWhxSVFjTTV3RUxJQ3RCZFU4RVFDQWxJQ1VvQWdCQkFXbzJBZ0FMSUFnZ0F6Y0RBQ0FJUVFocUlRY001Z0VMSUFnZ0dpZ0NLQ0lIQkg0Z0J5QUhLQUlBUVFGcU5nSUFJQWV0UW9DQWdJQndoQVZDZ0lDQWdEQUxOd01BSUFoQkNHb2hCd3psQVFzZ0NDQUdRb0NBZ0lBZ0VFY2lBVGNEQUNBSVFRaHFJUWNnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZzNrQVF6bUFRc0NRQ0FHRU9JRklna0VRQ0FHSUFrUTRRVWhCeUFHSUFrUUV5QUhEUUVMSUFaQmd5VkJBQkFWSUFoQ2dJQ0FnT0FBTndNQUlBaEJDR29oQ0F6b0FRc2dCeWtEYUNJdVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBR1FvQ0FnSUFnRUVjaUxrS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBaENnSUNBZ09BQU53TUFJQWhCQ0dvaENBenBBUXNnQnlBdU53Tm9DeUF1UWlDSXAwRjFUd1JBSUM2bklnY2dCeWdDQUVFQmFqWUNBQXNnQ0NBdU53TUFJQWhCQ0dvaEJ5QXVRb0NBZ0lCd2cwS0FnSUNBNEFCU0RlTUJET1VCQ3hBQkFBc2dDa0VEYWlFTklBb3ZBQUVoQ1FKQUlBWVFQaUlCUW9DQWdJQndnMEtBZ0lDQTRBQlNCRUFnQkNBSklBUWdDVW9iSVFzZ0NTRUhBMEFnQnlBTFJnMENJQVVnQjBFRGRHb3BBd0FpTFVJZ2lLZEJkVThFUUNBdHB5SU1JQXdvQWdCQkFXbzJBZ0FMSUFjZ0NXc2hEQ0FIUVFGcUlRY2dCaUFCSUF3Z0xVRUhFSzhCUVFCT0RRQUxJQVlnQVJBUEN5QUlRb0NBZ0lEZ0FEY0RBQ0FJUVFocUlRZ001Z0VMSUFnZ0FUY0RBQ0FJUVFocUlRY000UUVMSUFZZ0NFRUlheUlIS1FNQUVBOE00QUVMSUFZZ0NFRVFheUlIS1FNQUVBOGdCeUFJUVFocklnY3BBd0EzQXdBTTN3RUxJQVlnQ0VFWWF5SUhLUU1BRUE4Z0J5QUlRUkJySWdjcEF3QTNBd0FnQnlBSVFRaHJJZ2NwQXdBM0F3QU0zZ0VMSUFoQkNHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0FUY0RBQ0FJUVFocUlRY00zUUVMSUFoQkVHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0FUY0RBQ0FJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFJSUFFM0F3Z2dDRUVRYWlFSEROd0JDeUFJUVJocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFJSUFFM0F3QWdDRUVRYXlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDQ0FCTndNSUlBaEJDR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dBVGNERUNBSVFSaHFJUWNNMndFTElBZ2dDRUVJYXlJSEtRTUFOd01BSUFoQkVHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUtJQW9vQWdCQkFXbzJBZ0FMSUFjZ0FUY0RBQ0FJUVFocUlRY00yZ0VMSUFnZ0NFRUlheUlIS1FNQUlnRTNBd0FnQnlBSVFSQnJJZ2NwQXdBM0F3QWdBVUlnaUtkQmRVOEVRQ0FCcHlJS0lBb29BZ0JCQVdvMkFnQUxJQWNnQVRjREFDQUlRUWhxSVFjTTJRRUxJQWdnQ0VFSWF5SUhLUU1BSWdFM0F3QWdDRUVRYXlJS0tRTUFJUzBnQ2lBSVFSaHJJZ29wQXdBM0F3QWdCeUF0TndNQUlBRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUtJQUUzQXdBZ0NFRUlhaUVIRE5nQkN5QUlJQWhCQ0dzaUJ5a0RBQ0lCTndNQUlBaEJFR3NpQ2lrREFDRXRJQW9nQ0VFWWF5SUtLUU1BTndNQUlBY2dMVGNEQUNBS0lBaEJJR3NpQnlrREFEY0RBQ0FCUWlDSXAwRjFUd1JBSUFHbklnb2dDaWdDQUVFQmFqWUNBQXNnQnlBQk53TUFJQWhCQ0dvaEJ3elhBUXNnQ0VFUWF5SUhLUU1BSVFFZ0J5QUlRUmhySWdjcEF3QTNBd0FnQnlBQk53TUFETkFCQ3lBSVFSaHJJZ2NwQXdBaEFTQUhJQWhCRUdzaUJ5a0RBRGNEQUNBSVFRaHJJZ29wQXdBaExTQUtJQUUzQXdBZ0J5QXROd01BRE04QkN5QUlRU0JySWdjcEF3QWhBU0FISUFoQkdHc2lCeWtEQURjREFDQUlRUkJySWdvcEF3QWhMU0FLSUFoQkNHc2lDaWtEQURjREFDQUhJQzAzQXdBZ0NpQUJOd01BRE00QkN5QUlRU2hySWdjcEF3QWhBU0FISUFoQklHc2lCeWtEQURjREFDQUlRUmhySWdvcEF3QWhMU0FLSUFoQkVHc2lDaWtEQURjREFDQUhJQzAzQXdBZ0NpQUlRUWhySWdjcEF3QTNBd0FnQnlBQk53TUFETTBCQ3lBSVFRaHJJZ2NwQXdBaEFTQUhJQWhCRUdzaUJ5a0RBRGNEQUNBSVFSaHJJZ29wQXdBaExTQUtJQUUzQXdBZ0J5QXROd01BRE13QkN5QUlRUkJySWdjcEF3QWhBU0FISUFoQkdHc2lCeWtEQURjREFDQUlRU0JySWdvcEF3QWhMU0FLSUFFM0F3QWdCeUF0TndNQURNc0JDeUFJUVJCcklnY3BBd0FoQVNBSElBaEJHR3NpQnlrREFEY0RBQ0FJUVNCcklnb3BBd0FoTFNBS0lBaEJLR3NpQ2lrREFEY0RBQ0FISUMwM0F3QWdDaUFCTndNQURNb0JDeUFJUVFocklnY3BBd0FoQVNBSElBaEJFR3NpQnlrREFEY0RBQ0FISUFFM0F3QU15UUVMSUFoQklHc2lCeWtEQUNFQklBY2dDRUVRYXlJSEtRTUFOd01BSUFoQkNHc2lDaWtEQUNFdElBb2dDRUVZYXlJS0tRTUFOd01BSUFjZ0FUY0RBQ0FLSUMwM0F3QU15QUVMSUJNb0FqUWdEU2dBQUVFRGRHb3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0JpQUJJQlFnRWhDTUJDSUJOd01BSUFoQkNHb2hCeUFLUVFWcUlRMGdBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMS9ETTBCQ3lBSlFlNEJhd3dCQ3lBS1FRTnFJUTBnQ2k4QUFRc2hDeUFTSUEwMkFpQWdCaUFJSUF0QkEzUnJJZ3hCQ0dzcEF3QkNnSUNBZ0RCQ2dJQ0FnREFnQ3lBTVFRQVEyQUVpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTNPQVVGL0lRY2dDVUVqUmczUkFRTkFJQWNnQzBjRVFDQUdJQXdnQjBFRGRHb3BBd0FRRHlBSFFRRnFJUWNNQVFzTElBZ2dDMEYvYzBFRGRHb2lDQ0FCTndNQUlBaEJDR29oQnd6S0FRc2dDaThBQVNFSklCSWdDa0VEYWlJTk5nSWdRWDRoQnlBR0lBZ2dDVUVEZEdzaUMwRVFheWtEQUNBTFFRaHJLUU1BSUFrZ0MwRUFFSW9FSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOelFFRFFDQUhJQWxIQkVBZ0JpQUxJQWRCQTNScUtRTUFFQThnQjBFQmFpRUhEQUVMQ3lBSVFYNGdDV3RCQTNScUlnZ2dBVGNEQUNBSVFRaHFJUWNNeVFFTElBb3ZBQUVoQ3lBU0lBcEJBMm9pRFRZQ0lDQUdJQWdnQzBFRGRHc2lERUVJYXlrREFDQU1RUkJyS1FNQVFvQ0FnSUF3SUFzZ0RFRUFFTmdCSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOekFGQmZpRUhJQWxCSlVZTnp3RURRQ0FISUF0SEJFQWdCaUFNSUFkQkEzUnFLUU1BRUE4Z0IwRUJhaUVIREFFTEN5QUlRWDRnQzJ0QkEzUnFJZ2dnQVRjREFDQUlRUWhxSVFjTXlBRUxJQXBCQTJvaERTQUtMd0FCSVFzZ0JoQStJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU55d0VnQ0NBTFFRTjBheUVKUVFBaEJ3SkFBMEFnQnlBTFJnMEJJQVlnQVNBSFFZQ0FnSUI0Y2lBSklBZEJBM1JxSWd3cEF3QkJoNEFCRUJraER5QU1Rb0NBZ0lBd053TUFJQWRCQVdvaEJ5QVBRUUJPRFFBTElBWWdBUkFQRE13QkN5QUpJQUUzQXdBZ0NVRUlhaUVIRE1jQkN5QUtRUU5xSVEwZ0JpQUlRUmhySWdrcEF3QWdDQ0FJUVJCcklnY2dDaThBQVJDZEF5SUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRjb0JJQVlnQ1NrREFCQVBJQVlnQnlrREFCQVBJQVlnQ0VFSWF5a0RBQkFQSUFrZ0FUY0RBQXpHQVF0Q2dJQ0FnQkFoTGdKQUlBaEJDR3NwQXdBaUFVTC8vLy8vYjFZTkFFS0JnSUNBRUNFdUlBRkNnSUNBZ0hDRFFvQ0FnSUF3VVEwQUlBQkJsUGdBUVFBUUZRektBUXNnQ0NBdU53TUFJQWhCQ0dvaEJ3ekZBUXNnTTBLQWdJQ0FNRklOdmdFZ0JrSFJsQUZCQUJBVkRNZ0JDeUFJUVFocktRTUFJaTFDLy8vLy8yOVlEYjhCSUFoQkVHc3BBd0FoQVNBdHB5SUhMd0VHRU80QlJRMi9BU0FIS0FJb0lnZEZEYjhCSUFjb0FoQWlDVUV3YWlFTElBa2dDU2dDR0VGL2MwRUNkRUhBZVhKcUtBSUFJUWtDUUFOQUlBa0VRQ0FMSUFsQkFXdEJBM1FpQ1dvaURDZ0NCRUhQQVVZTkFpQU1LQUlBUWYvLy94OXhJUWtNQVFzTElBWkJuL1VBUVFBUUZReklBUXNnQVVLQWdJQ0FjRlFOdndFZ0J5Z0NGQ0FKYWlrREFDSXRRb0NBZ0lCd2cwS0FnSUNBZ0g5U0RiOEJJQVlvQWhBZ0xSQ05BaUVKSUFHbktBSVFJZ2RCTUdvaEN5QUhJQWtnQnlnQ0dIRkJmM05CQW5ScUtBSUFJUWNEUUNBSEJFQWdDeUFIUVFGclFRTjBhaUlIS0FJRUlBbEdEYjhCSUFjb0FnQkIvLy8vSDNFaEJ3d0JDd3NnQmtHdU1FRUFFQlVNeHdFTElBaEJDR3NpRENrREFDSUJRdi8vLy85dldBMitBU0FJUVJCcklna3BBd0FoTFNBQnB5SUxLQUlRSWdkQk1Hb2hEeUFISUFjb0FoaEJmM05CQW5SQndIbHlhaWdDQUNFSEFrQUNRQU5BSUFjRVFDQVBJQWRCQVd0QkEzUWlCMm9pRUNnQ0JFSFBBVVlOQWlBUUtBSUFRZi8vL3g5eElRY01BUXNMSUFaQjl3QVE0QVVpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTNJQVNBR0lBdEJ6d0ZCQnhCNklnZEZCRUFnQmlBQkVBOE15UUVMSUFGQ0lJaW5RWFZQQkVBZ0FhY2lDeUFMS0FJQVFRRnFOZ0lBQ3lBSElBRTNBd0FNQVFzZ0N5Z0NGQ0FIYWlrREFDSUJRaUNJcDBGMVNRMEFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dCaWdDRUNBQkVJMENJUWNnTFVMLy8vLy9iMWdFUUNBR0VDUWdCaUFIRUJNTXh3RUxJQVlnTGFjZ0IwRUhFSG9oQ3lBR0lBY1FFeUFMUlEzR0FTQUxRb0NBZ0lBd053TUFJQVlnQ1NrREFCQVBJQVlnRENrREFCQVBJQWtoQnd6Q0FRc2dCaUFJUVFocklnZ3BBd0FRaWdFTXhRRUxJQXBCQm1vaERTQUtLQUFCSVFjQ1FBSkFBa0FDUUFKQUFrQWdDaTBBQlNJSkRnVUFBUUlEQkFVTElBWWdCMEhPSFJDUEFRekpBUXNnQmlBSEVOOEZETWdCQ3lBR0lBY1EyUUVNeHdFTElBWkJ2cGNCUVFBUXhnSU14Z0VMSUFaQnh2RUFRUUFRRlF6RkFRc2dEaUFKTmdJUUlBWkIzZnNBSUE1QkVHb1FSZ3pFQVFzZ0NpOEFBU0VKSUFvdkFBTWhEQ0FTSUFwQkJXb2lEVFlDSUVGL0lRY0NmaUFHSUFnZ0NVRURkR3NpQzBFSWF5SVBLUU1BSUFZcEE3Z0JFRklFUUNBR1FvQ0FnSUF3SUFrRWZpQUxLUU1BQlVLQWdJQ0FNQXRCQWlBTVFRRnJFSndEREFFTElBWWdEeWtEQUVLQWdJQ0FNRUtBZ0lDQU1DQUpJQXRCQUJEWUFRc2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRM0RBUU5BSUFjZ0NVY0VRQ0FHSUFzZ0IwRURkR29wQXdBUUR5QUhRUUZxSVFjTUFRc0xJQWdnQ1VGL2MwRURkR29pQ0NBQk53TUFJQWhCQ0dvaEJ3eS9BUXNnQ2tFRGFpRU5JQW92QUFFaER5QUdJQTVCNEFCcUlBaEJDR3NpQnlrREFCQ0pCQ0lKUlEzQ0FRSitJQVlnQ0VFUWF5SUxLUU1BSUFZcEE3Z0JFRklFUUNBR1FvQ0FnSUF3SUE0b0FtQWlEQVIrSUFrcEF3QUZRb0NBZ0lBd0MwRUNJQTlCQVdzUW5BTU1BUXNnQmlBTEtRTUFRb0NBZ0lBd0lBNG9BbUFpRENBSkVDRUxJUUVnQmlBSklBd1Ftd01nQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTNDQVNBR0lBc3BBd0FRRHlBR0lBY3BBd0FRRHlBTElBRTNBd0FNdmdFTElBaEJFR3NpQnlBR1FvQ0FnSUF3SUFjcEF3QWdDRUVJYXlJSEtRTUFFTjRGTndNQURMMEJDeUFHSUFoQkNHc2lCeWtEQUJEb0FTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRjQUJJQVlnQnlrREFCQVBJQWNnQVRjREFBeTJBUXNnQ0VFSWF5SUhLUU1BSVFFQ1FDQUdFT0lGSWdsRkJFQkNnSUNBZ0NBaExnd0JDeUFHSUFrUVhDRXVJQVlnQ1JBVElDNUNnSUNBZ0hDRFFvQ0FnSURnQUZFTndBRUxJQVlnRGtHQUFXb1F6UUlpTFVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFZZ0xoQVBETUFCQ3lBT0lBNHBBNEFCSWk4M0EyQWdEaUFCTndONElBNGdMamNEY0NBT0lBNHBBNGdCSWdFM0EyZ2dCa0U4UVFRZ0RrSGdBR29RbWdNZ0JpQXVFQThnQmlBdkVBOGdCaUFCRUE4Z0JpQUhLUU1BRUE4Z0J5QXROd01BRExVQkN5QUtRUVZxSVEwZ0d5Z0NBQ2dDRUNJSFFUQnFJUXdnQnlBS0tBQUJJZ2tnQnlnQ0dIRkJmM05CQW5ScUtBSUFJUWNDUUFOQUlBY0VRRUVCSVFzZ0RDQUhRUUZyUVFOMGFpSUhLQUlFSUFsR0RRSWdCeWdDQUVILy8vOGZjU0VIREFFTEN5QUdJQVlwQThBQklBa1FjU0lMUVFCSURiOEJDeUFJSUF0QkFFZXRRb0NBZ0lBUWhEY0RBQ0FJUVFocUlRY011Z0VMSUFsQk4yc2hDeUFLUVFWcUlRMGdHeWdDQUNJTUtBSVFJZ2RCTUdvaER5QUhJQW9vQUFFaUNTQUhLQUlZY1VGL2MwRUNkR29vQWdBaEJ3SkFBa0FEUUNBSFJRMEJJQWtnRHlBSFFRRnJRUU4wSWdkcUloQW9BZ1JIQkVBZ0VDZ0NBRUgvLy84ZmNTRUhEQUVMQ3lBTUtBSVVJQWRxS1FNQUlpNUNnSUNBZ0hDRElnRkNnSUNBZ01BQVVRUkFJQVlnQ1JEWkFRekFBUXNnTGtJZ2lLZEJkVWtOQVNBdXB5SUhJQWNvQWdCQkFXbzJBZ0FNQVFzZ0JpQUdLUVBBQVNJQklBa2dBU0FMRUJRaUxrS0FnSUNBY0lNaEFRc2dBVUtBZ0lDQTRBQlJEYjBCSUFnZ0xqY0RBQ0FJUVFocUlRY011UUVMSUFwQkJXb2hEU0FHSUFvb0FBRWdDRUVJYXlJSEtRTUFJQWxCT1dzUTNRVkJBRWdOYWd5NEFRc2dDa0VGYWlFTklBb29BQUVoQ1NBSVFSQnJJZ2NvQWdCRkJFQWdCaUFKRU1jQ0RMd0JDeUFHSUFrZ0NFRUlheWtEQUVFQ0VOMEZJZ2hCQUU0TnR3RWdDRUVlZGtFQ2NReTRBUXNnQ2tFR2FpRU5JQmtvQWdBaURDZ0NFQ0lKUVRCcUlROGdDU0FLS0FBQklnY2dDU2dDR0hGQmYzTkJBblJxS0FJQUlRa2dDaXdBQlNFTEFrQURRQ0FKUlEwQklBY2dDVUVEZENBUGFrRUlheUlKS0FJRVJ3UkFJQWtvQWdCQi8vLy9IM0VoQ1F3QkN3c2dDMEVBU0FSQUlBa3RBQU5CQkhFTnNRRU1zd0VMSUF0QndBQnhSUTJ3QVNBSktBSUFJZ2xCZ0lDQUlIRU5zQUVnQ1VHQWdJQ0FmSEZCZ0lDQWdBUkdEYThCSUFsQmdJQ0F3QUZ4UVlDQWdNQUJSZzJ3QVF5dkFRc2dDMEVBVGcydEFReXZBUXNnQ2l3QUJTSUhRUUZ4UVFaeUlBZEJBbkZCQlhJZ0IwRUFUaUlIR3lFUUlCa2dHeUFIR3lnQ0FDSUpLQUlRSWd3Z0NpZ0FBU0lQSUF3b0FoaHhRWDl6UVFKMGFpZ0NBQ0VMSUFwQkJtb2hEU0FNUVRCcUlRd0RRQ0FMQkVBZ0RDQUxRUUZyUVFOMGFpSUxLQUlFSUE5R0RiRUJJQXNvQWdCQi8vLy9IM0VoQ3d3QkN3c2dDUzBBQlVFQmNVVU5yd0VnQmlBSklBOGdFQkI2SWdsRkRia0JJQWxDZ0lDQWdEQkNnSUNBZ01BQUlBY2JOd01BREs4QkN5QUtRUVpxSVEwZ0dTa0RBQ0lCcHlnQ0VDSUhRVEJxSVF3Z0J5QUtLQUFCSWdzZ0J5Z0NHSEZCZjNOQkFuUnFLQUlBSVFjZ0NpMEFCU0VQSUFZZ0FTQUxJQWhCQ0dzaUNTa0RBRUtBZ0lDQU1FS0FnSUNBTUFKL0FrQURRQ0FIUlEwQklBZEJBM1FnREdwQkNHc2lFQ2dDQUNFSElBc2dFQ2dDQkVjRVFDQUhRZi8vL3g5eElRY01BUXNMUVlEQUFTQUhRWUNBZ0NCeFJRMEJHZ3NnRDBHR3pnRnlDeEJ0UVFCSURiZ0JJQVlnQ1NrREFCQVBJQWtoQnd5MEFRc2dFU0FLTHdBQlFRTjBhaWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NrRURhaUVOSUFnZ0FUY0RBQ0FJUVFocUlRY01zd0VMSUFZZ0VTQUtMd0FCUVFOMGFpQUlRUWhySWdjcEF3QVFJQ0FLUVFOcUlRME1zZ0VMSUJFZ0NpOEFBVUVEZEdvaEJ5QUlRUWhyS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpRFNBTktBSUFRUUZxTmdJQUN5QUtRUU5xSVEwZ0JpQUhJQUVRSUF5ckFRc2dGU0FLTHdBQlFRTjBhaWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NrRURhaUVOSUFnZ0FUY0RBQ0FJUVFocUlRY01zQUVMSUFZZ0ZTQUtMd0FCUVFOMGFpQUlRUWhySWdjcEF3QVFJQ0FLUVFOcUlRME1yd0VMSUJVZ0NpOEFBVUVEZEdvaEJ5QUlRUWhyS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpRFNBTktBSUFRUUZxTmdJQUN5QUtRUU5xSVEwZ0JpQUhJQUVRSUF5b0FRc2dFU0FLTFFBQlFRTjBhaWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NrRUNhaUVOSUFnZ0FUY0RBQ0FJUVFocUlRY01yUUVMSUFZZ0VTQUtMUUFCUVFOMGFpQUlRUWhySWdjcEF3QVFJQ0FLUVFKcUlRME1yQUVMSUJFZ0NpMEFBVUVEZEdvaEJ5QUlRUWhyS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpRFNBTktBSUFRUUZxTmdJQUN5QUtRUUpxSVEwZ0JpQUhJQUVRSUF5bEFRc2dFU2tEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQUJOd01BSUFoQkNHb2hCd3lxQVFzZ0hTa0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnY2dCeWdDQUVFQmFqWUNBQXNnQ0NBQk53TUFJQWhCQ0dvaEJ3eXBBUXNnSGlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDQ0FCTndNQUlBaEJDR29oQnd5b0FRc2dIeWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQUJOd01BSUFoQkNHb2hCd3luQVFzZ0JpQVJJQWhCQ0dzaUJ5a0RBQkFnREtZQkN5QUdJQjBnQ0VFSWF5SUhLUU1BRUNBTXBRRUxJQVlnSGlBSVFRaHJJZ2NwQXdBUUlBeWtBUXNnQmlBZklBaEJDR3NpQnlrREFCQWdES01CQ3lBSVFRaHJLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBR0lCRWdBUkFnREp3QkN5QUlRUWhyS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUdJQjBnQVJBZ0RKc0JDeUFJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUI0Z0FSQWdESm9CQ3lBSVFRaHJLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBR0lCOGdBUkFnREprQkN5QVZLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBSUlBRTNBd0FnQ0VFSWFpRUhESjRCQ3lBZ0tRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFJSUFFM0F3QWdDRUVJYWlFSERKMEJDeUFoS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUlJQUUzQXdBZ0NFRUlhaUVIREp3QkN5QWlLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBSUlBRTNBd0FnQ0VFSWFpRUhESnNCQ3lBR0lCVWdDRUVJYXlJSEtRTUFFQ0FNbWdFTElBWWdJQ0FJUVFocklnY3BBd0FRSUF5WkFRc2dCaUFoSUFoQkNHc2lCeWtEQUJBZ0RKZ0JDeUFHSUNJZ0NFRUlheUlIS1FNQUVDQU1sd0VMSUFoQkNHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFZZ0ZTQUJFQ0FNa0FFTElBaEJDR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBWWdJQ0FCRUNBTWp3RUxJQWhCQ0dzcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQVlnSVNBQkVDQU1qZ0VMSUFoQkNHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFZZ0lpQUJFQ0FNalFFTElCUW9BZ0FvQWhBcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnQVRjREFDQUlRUWhxSVFjTWtnRUxJQlFvQWdRb0FoQXBBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0FUY0RBQ0FJUVFocUlRY01rUUVMSUJRb0FnZ29BaEFwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dBVGNEQUNBSVFRaHFJUWNNa0FFTElCUW9BZ3dvQWhBcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnQVRjREFDQUlRUWhxSVFjTWp3RUxJQVlnRkNnQ0FDZ0NFQ0FJUVFocklnY3BBd0FRSUF5T0FRc2dCaUFVS0FJRUtBSVFJQWhCQ0dzaUJ5a0RBQkFnREkwQkN5QUdJQlFvQWdnb0FoQWdDRUVJYXlJSEtRTUFFQ0FNakFFTElBWWdGQ2dDRENnQ0VDQUlRUWhySWdjcEF3QVFJQXlMQVFzZ0ZDZ0NBQ2dDRUNFSElBaEJDR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlLSUFvb0FnQkJBV28yQWdBTElBWWdCeUFCRUNBTWhBRUxJQlFvQWdRb0FoQWhCeUFJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUNpQUtLQUlBUVFGcU5nSUFDeUFHSUFjZ0FSQWdESU1CQ3lBVUtBSUlLQUlRSVFjZ0NFRUlheWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ29nQ2lnQ0FFRUJhallDQUFzZ0JpQUhJQUVRSUF5Q0FRc2dGQ2dDRENnQ0VDRUhJQWhCQ0dzcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJS0lBb29BZ0JCQVdvMkFnQUxJQVlnQnlBQkVDQU1nUUVMSUJRZ0NpOEFBVUVDZEdvb0FnQW9BaEFwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBcEJBMm9oRFNBSUlBRTNBd0FnQ0VFSWFpRUhESVlCQ3lBR0lCUWdDaThBQVVFQ2RHb29BZ0FvQWhBZ0NFRUlheUlIS1FNQUVDQWdDa0VEYWlFTkRJVUJDeUFVSUFvdkFBRkJBblJxS0FJQUtBSVFJUWNnQ0VFSWF5a0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnMGdEU2dDQUVFQmFqWUNBQXNnQ2tFRGFpRU5JQVlnQnlBQkVDQU1mZ3NnQ2tFRGFpRU5JQlFnQ2k4QUFTSUhRUUowYWlnQ0FDZ0NFQ2tEQUNJQlFvQ0FnSUJ3ZzBLQWdJQ0F3QUJTQkVBZ0FVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dBVGNEQUNBSVFRaHFJUWNNaEFFTElBWWdFeUFIUVFFUXhRSU1od0VMSUFwQkEyb2hEU0FVSUFvdkFBRWlCMEVDZEdvb0FnQW9BaEFpQ1RVQ0JFSWdoa0tBZ0lDQXdBQlNCRUFnQmlBSklBaEJDR3NpQnlrREFCQWdESU1CQ3lBR0lCTWdCMEVCRU1VQ0RJWUJDeUFLUVFOcUlRMGdGQ0FLTHdBQklnZEJBblJxS0FJQUtBSVFJZ2sxQWdSQ0lJWkNnSUNBZ01BQVVnUkFJQVlnRXlBSFFRRVF4UUlNaGdFTElBWWdDU0FJUVFocklnY3BBd0FRSUF5QkFRc2dCaUFSSUFvdkFBRkJBM1JxUW9DQWdJREFBQkFnSUFwQkEyb2hEUXg2Q3lBS1FRTnFJUTBnRVNBS0x3QUJJZ2RCQTNScUtRTUFJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEQUFGSUVRQ0FCUWlDSXAwRjFUd1JBSUFHbklnY2dCeWdDQUVFQmFqWUNBQXNnQ0NBQk53TUFJQWhCQ0dvaEJ3eUFBUXNnQmlBVElBZEJBQkRGQWd5REFRc2dDa0VEYWlFTklCRWdDaThBQVNJSFFRTjBhaUlKTlFJRVFpQ0dRb0NBZ0lEQUFGSUVRQ0FHSUFrZ0NFRUlheUlIS1FNQUVDQU1md3NnQmlBVElBZEJBQkRGQWd5Q0FRc2dDa0VEYWlFTklCRWdDaThBQVVFRGRHb2lCelVDQkVJZ2hrS0FnSUNBd0FCU0JFQWdCa0hrN3dCQkFCREdBZ3lDQVFzZ0JpQUhJQWhCQ0dzaUJ5a0RBQkFnREgwTElCSW9BaHdoQ1NBTkx3QUFJUXNEUUNBSklnY2dLRVlOWVNBSEtBSUVJUWtnQjBFQ2F5OEJBQ0FMUncwQUlBZEJBMnNpRFMwQUFFRUNjUTBBSUJJb0FoUWdDMEVEZEdvcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJTUlBd29BZ0JCQVdvMkFnQUxJQWNnQVRjREVDQUhJQWRCRUdvMkFnZ2dCeWdDQUNJTUlBazJBZ1FnQ1NBTU5nSUFJQWRCQURZQ0FDQU5JQTB0QUFCQkFYSTZBQUFnQmlnQ0VDRU5JQWRCQkd0QkF6b0FBQ0FOS0FKUUlnd2dCellDQkNBSElBMUIwQUJxTmdJRUlBY2dERFlDQUNBTklBYzJBbEFNQUFzQUN5QUtMd0FGSVFzZ0NpZ0FBU0VNSUFnZ0JrS0FnSUNBSUJCSElnRTNBd0FnQ0VFSWFpRUhJQXBCQjJvaERRSkFBa0FnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBQWtBZ0NVSDZBRVlFUUNBVUlBdEJBblJxS0FJQUlna2dDU2dDQUVFQmFqWUNBQXdCQ3lBR0lCSWdDeUFKUWZrQVJoQ0xCQ0lKUlEwQkN5QUdJQWdvQWdBZ0RFRWlFSG9pQ3cwQklCWWdDUkRyQVFzZ0J5RUlESUFCQ3lBTElBazJBZ0FnQ0NBR0lBd1FYRGNEQ0NBSVFSQnFJUWNNZXdzZ0NrRUZhaUVOSUJzcEF3QWlMcWNpQ3lnQ0VDSUhRVEJxSVF3Z0J5QUtLQUFCSWdrZ0J5Z0NHSEZCZjNOQkFuUnFLQUlBSVFjQ1FBSkFBa0FDUUFOQUlBZEZEUUVnQ1NBTUlBZEJBV3RCQTNRaUQyb2lCeWdDQkVjRVFDQUhLQUlBUWYvLy94OXhJUWNNQVFzTElBc29BaFFnRDJvMUFnUkNJSVpDZ0lDQWdNQUFVUVJBSUFZZ0NSRFpBUXlEQVFzZ0J5MEFBMEVJY1VVTkF5QXVRaUNJcDBGMFN3MEJEQUlMSUFZZ0Jpa0R3QUVnQ1JCeElnZEJBRWdOZ1FFZ0IwVUVRRUtBZ0lDQU1DRXVEQUlMSUJrcEF3QWlMa0lnaUtkQmRVa05BU0F1cHlFTEN5QUxJQXNvQWdCQkFXbzJBZ0FMSUFnZ0xqY0RBQ0FJSUFZZ0NSQmNOd01JSUFoQkVHb2hCd3g3Q3lBR0lBbEJ6aDBRandFTWZnc2dEU0FOS0FBQWFpRU5JQWdoQnlBR0VIdEZEWGtNZlFzZ0RTQU5MZ0FBYWlFTklBZ2hCeUFHRUh0RkRYZ01mQXNnRFNBTkxBQUFhaUVOSUFnaEJ5QUdFSHRGRFhjTWV3c2dDa0VGYWlFSkFuOGdDRUVJYXlJSEtRTUFJZ0ZDLy8vLy96OVlCRUFnQWFjTUFRc2dCaUFCRUNZTEJIOGdEU2dBQUNBSmFrRUVhd1VnQ1FzaERTQUdFSHRGRFhZTUtBc2dDa0VGYWlFSkFuOGdDRUVJYXlJSEtRTUFJZ0ZDLy8vLy96OVlCRUFnQWFjTUFRc2dCaUFCRUNZTEJIOGdDUVVnRFNnQUFDQUpha0VFYXdzaERTQUdFSHRGRFhVTUp3c2dDa0VDYWlFSkFuOGdDRUVJYXlJSEtRTUFJZ0ZDLy8vLy96OVlCRUFnQWFjTUFRc2dCaUFCRUNZTEJIOGdEU3dBQUNBSmFrRUJhd1VnQ1FzaERTQUdFSHRGRFhRTUpnc2dDa0VDYWlFSkFuOGdDRUVJYXlJSEtRTUFJZ0ZDLy8vLy96OVlCRUFnQWFjTUFRc2dCaUFCRUNZTEJIOGdDUVVnRFN3QUFDQUpha0VCYXdzaERTQUdFSHRGRFhNTUpRc2dDQ0FOSUFvb0FBRnFJQk1vQWhScnJVS0FnSUNBMEFDRU53TUFJQXBCQldvaERTQUlRUWhxSVFjTWNnc2dDaWdBQVNFSElBZ2dDaUFUS0FJVWEwRUZhcTAzQXdBZ0J5QU5haUVOSUFoQkNHb2hCd3h4Q3dKQUlBaEJDR3NpQnlrREFDSUJRdi8vLy84UFZnMEFJQUduSWdrZ0V5Z0NHRThOQUNBVEtBSVVJQWxxSVEwTWNRc2dCa0gxNFFCQkFCQkdESFFMSUFoQkNHc2lEeWtEQUNJdFFpQ0lweUlIUVFGcUlnbEJCRTFCQUVFQklBbDBRUmx4RzBVRVFDQUdJQzBRM0FVaExRc0NRQ0FHUVJnUUtTSUpCRUFnQmtLQWdJQ0FJRUVSRUVraUxrS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQklBWW9BaEFpQjBFUWFpQUpJQWNvQWdRUkFBQUxJQzBoTGd4bEN5QUpRUUEyQWhBZ0NTQXROd01BSUFsQkFEWUNDQ0F1cHlBSk5nSWdJQWRCZm5GQkFrWU5aU0F0SWdGQ0lJaW5JZ2RCZFU4RVFDQXRweUlMSUFzb0FnQkJBV28yQWdBTEEwQWdCaUFCRUl3Q0lnRkNnSUNBZ0hDRElpOUNnSUNBZ0NCU0JFQWdMMEtBZ0lDQTRBQlJEV1lnQmlBT1FlQUFhaUFPUVlBQmFpQUJwMEVSRUk0QkRXVWdCaUFPS0FKZ0lBNG9Bb0FCSWdzUVdpQUxCRUFnQmlBQkVBOGdCMEYxU1ExbElDMm5JZ2NnQnlnQ0FFRUJhallDQUF4bEN5QUdFSHRGRFFFTVpRc0xBa0FDUUNBdHB5SU1MUUFGUVFoeFJRMEFRUUFoQnlBTUtBSVFJZ3NvQWlBaUVFRUFJQkJCQUVvYklSQWdDMEV3YWlFTEEwQWdCeUFRUmcwQ0lBc3RBQU5CRUhFTkFTQUxRUWhxSVFzZ0IwRUJhaUVIREFBTEFBc2dCaUFPUWVBQWFpQU9RWUFCYWlBTVFSRVFqZ0VOWlVFQUlRY2dEaWdDWUNFS0lBNG9Bb0FCSVFrRFFDQUhJQWxIQkVBZ0JpQXVJQW9nQjBFRGRHb29BZ1JDZ0lDQWdDQkJBQkRRQVJvZ0IwRUJhaUVIREFFTEN5QUdJQW9nQ1JCYURHWUxJQWxCQVRZQ0NDQUpJQXdvQWlnMkFnd01aUXRDZ1lDQWdCQWhMZ0pBSUFoQkNHc3BBd0FpTFVLQWdJQ0FjRlFOQUNBdHB5SUxMd0VHUVJGSERRQWdDeWdDSUNFSEEwQUNRQ0FIS0FJSUJFQWdCeWdDRUNJSklBY29BZ3hQRFFNZ0J5QUpRUUZxTmdJUUlBbEJnSUNBZ0hoeUlRa01BUXNnQnlnQ0VDSU1JQXNvQWhBaUNTZ0NJRThOQWlBSlFUQnFJQXhCQTNScUlnOG9BZ1FoQ1NBSElBeEJBV28yQWhBZ0NVVU5BU0FQTFFBRFFSQnhSUTBCQ3lBR0lBY3BBd0FnQ1JCeElneEJBRWdOZENBTVJRMEFDMEtBZ0lDQUVDRXVJQVlnQ1JCY0lRRUxJQWdnTGpjRENDQUlJQUUzQXdBZ0NFRVFhaUVIREc0TElBWWdDRUVBRUprRERYRWdDRUtBZ0lDQTBBQTNBd2dnQ0VFUWFpRUhERzBMSUFvdEFBRWhDVUVCSVFjZ0RrRUJOZ0pnSUFwQkFtb2hEVUtBZ0lDQU1DRXVJQWhCZlNBSmEwRURkR29pQ3lrREFDSUJRb0NBZ0lCd2cwS0FnSUNBTUZFTlhpQUdJQUVnQ0VGK0lBbHJRUU4wYWlrREFDQU9RZUFBYWhDdUFTSXVRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQkJmeUVISUE1QmZ6WUNZQXhlQ3lBT0tBSmdJZ2NOWFVFQUlRY01YZ3NnQmlBSVFRRVFtUU1OYnlBSVFvQ0FnSURRQURjRENDQUlRUkJxSVFjTWF3c2dDRUVJYXlJSEtRTUFJZ0ZDLy8vLy8yOVlCRUFnQmtHT01VRUFFQlVNYndzZ0JpQUJJQTVCNEFCcUVOc0ZJaTFDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5iaUFHSUFFUUR5QUhJQzAzQXdBZ0NDQU9LQUpnUVFCSHJVS0FnSUNBRUlRM0F3QWdDRUVJYWlFSERHb0xJQWhCQ0dzcEF3QkMvLy8vLzI5V0RXTWdCa0dPTVVFQUVCVU1iUXNnQmlBSVFSQnJJZ2twQXdBUUR5QUlRUmhySWdjcEF3QWlBVUtBZ0lDQWNJTkNnSUNBZ0RCUkRXZ2dCaUFCUVFBUXJRRUVRQ0FKSVFnTWJRc2dCaUFIS1FNQUVBOE1hQXNnQ0VFSWF5SUlLUU1BSVFFRFFBSkFJQWdnSEUwTkFDQUlRUWhySWdjcEF3QWlMVUtBZ0lDQWNJTkNnSUNBZ05BQVVRMEFJQVlnTFJBUElBY2hDQXdCQ3dzZ0NDQXBTUVJBSUFaQjNjb0FRUUFRUmlBR0lBRVFEd3hzQ3lBSUlBaEJDR3NpQnlrREFEY0RBQ0FJUVJCcklnb3BBd0FoTFNBS0lBaEJHR3NpQ2lrREFEY0RBQ0FISUMwM0F3QWdDaUFCTndNQUlBaEJDR29oQnd4bkN5QUdJQWhCR0dzcEF3QWdDRUVnYXlrREFFRUJJQWhCQ0dzaUJ4QWhJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5haUFHSUFjcEF3QVFEeUFISUFFM0F3QU1ZQXNnQ2tFQ2FpRU5JQWdnQmlBSVFTQnJJZ2NwQXdBaUFVRVhRUVlnQ2kwQUFTSUpRUUZ4R3lBQlFRQVFGQ0lCUW9DQWdJQndneUl0UW9DQWdJQWdVU0F0UW9DQWdJQXdVWElFZmtLQmdJQ0FFQVVnTFVLQWdJQ0E0QUJSRFdvZ0J5a0RBQ0V0QW40Z0NVRUNjUVJBSUFZZ0FTQXRRUUJCQUJBdkRBRUxJQVlnQVNBdFFRRWdDRUVJYXhBdkN5SUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRXb2dCaUFJUVFocklnY3BBd0FRRHlBSElBRTNBd0JDZ0lDQWdCQUxOd01BSUFoQkNHb2hCd3hsQ3dKL0lBaEJDR3NpQnlrREFDSUJRdi8vLy84L1dBUkFJQUduUVFCSERBRUxJQVlnQVJBbUN5RUtJQWNnQ2tXdFFvQ0FnSUFRaERjREFBeGVDeUFLUVFWcUlRMGdCaUFJUVFocklnY3BBd0FpQVNBS0tBQUJJQUZCQUJBVUlnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTlp5QUdJQWNwQXdBUUR5QUhJQUUzQXdBTVhRc2dDa0VGYWlFTklBWWdDRUVJYXlrREFDSUJJQW9vQUFFZ0FVRUFFQlFpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTFtSUFnZ0FUY0RBQ0FJUVFocUlRY01ZZ3NnQmlBSVFSQnJJZ2NwQXdBZ0NpZ0FBU0FJUVFocktRTUFRWUNBQWhEUUFTRUlJQVlnQnlrREFCQVBJQXBCQldvaERTQUlRUUJPRFdFTUV3c2dDa0VGYWlFTklBWWdDaWdBQVJEZ0JTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRXUWdDQ0FCTndNQUlBaEJDR29oQnd4Z0N5QUlRUWhySVFjQ1FDQUlRUkJySWdrcEF3QWlBVUwvLy8vL2IxZ0VRQ0FHRUNSQ2dJQ0FnT0FBSVM0TUFRc2dCeWtEQUNJdFFvQ0FnSUJ3ZzBLQWdJQ0FnSDlTQkVBZ0JoQ0lCRUtBZ0lDQTRBQWhMZ3dCQ3lBR0tBSVFJQzBRalFJaENDQUJweUlNS0FJUUlndEJNR29oRHlBTElBZ2dDeWdDR0hGQmYzTkJBblJxS0FJQUlRc0NRQU5BSUFzRVFDQVBJQXRCQVd0QkEzUWlDMm9pRUNnQ0JDQUlSZzBDSUJBb0FnQkIvLy8vSDNFaEN3d0JDd3NnQmlBSUVOb0ZRb0NBZ0lEZ0FDRXVEQUVMSUF3b0FoUWdDMm9wQXdBaUxrSWdpS2RCZFVrTkFDQXVweUlJSUFnb0FnQkJBV28yQWdBTElBWWdCeWtEQUJBUElBWWdDU2tEQUJBUElBa2dMamNEQUNBdVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFY4TUVRc2dDRUVRYXlrREFDRUJJQWhCQ0dzaENRSkFBa0FnQ0VFWWF5SUhLUU1BSWkxQy8vLy8vMjlZQkVBZ0JoQWtEQUVMSUFrcEF3QWlMa0tBZ0lDQWNJTkNnSUNBZ0lCL1VnUkFJQVlRaUFRTUFRc2dCaWdDRUNBdUVJMENJUWdnTGFjaURDZ0NFQ0lMUVRCcUlROGdDeUFJSUFzb0FoaHhRWDl6UVFKMGFpZ0NBQ0VMQTBBZ0N3UkFJQThnQzBFQmEwRURkQ0lMYWlJUUtBSUVJQWhHRFFNZ0VDZ0NBRUgvLy84ZmNTRUxEQUVMQ3lBR0lBZ1EyZ1VMSUFZZ0FSQVBJQVlnQnlrREFCQVBJQVlnQ1NrREFCQVBJQWNoQ0F4akN5QUdJQXdvQWhRZ0Myb2dBUkFnSUFZZ0J5a0RBQkFQSUFZZ0NTa0RBQkFQREY0TElBaEJHR3NoQnlBSVFRaHJLUU1BSVFFZ0NFRVFheUVJQWtBQ1FDQUhLUU1BSWkxQy8vLy8vMjlZQkVBZ0JoQWtEQUVMSUFncEF3QWlMa0tBZ0lDQWNJTkNnSUNBZ0lCL1VnUkFJQVlRaUFRTUFRc2dCaWdDRUNBdUVJMENJUWNnTGFjaUN5Z0NFQ0lKUVRCcUlRd2dDU0FISUFrb0FoaHhRWDl6UVFKMGFpZ0NBQ0VKQWtBRFFDQUpSUTBCSUFjZ0RDQUpRUUZyUVFOMGFpSUpLQUlFUndSQUlBa29BZ0JCLy8vL0gzRWhDUXdCQ3dzZ0JpQUhRWmd6RUk4QkRBRUxJQVlnQ3lBSFFRY1FlaUlIRFFFTElBWWdBUkFQSUFZZ0NDa0RBQkFQREdJTElBY2dBVGNEQUNBR0lBZ3BBd0FRRHd4WEN5QUtRUVZxSVEwZ0JpQUlRUkJyS1FNQUlBb29BQUVnQ0VFSWF5SUhLUU1BUVllQUFSQVpRUUJPRFZ3TURnc2dDa0VGYWlFTklBZ2hCeUFHSUFoQkNHc3BBd0FnQ2lnQUFSRFpCVUVBVGcxYkRGOExJQWdoQnlBR0lBaEJDR3NwQXdBZ0NFRVFheWtEQUJEWUJVRUFUZzFhREY0TElBaEJDR3NpQnlrREFDSUJRdi8vLy85dldDQUJRb0NBZ0lCd2cwS0FnSUNBSUZKeFJRUkFJQVlnQ0VFUWF5a0RBQ0FCUVFFUWl3SkJBRWdOWGdzZ0JpQUJFQThNV1FzZ0JpQUlRUWhyS1FNQUlBaEJFR3NwQXdBUWh3UU1VZ3NnQ0FKL0lBbEIxUUJHQkVCQmZTQUdJQWhCRUdzcEF3QVFNU0lMRFFFYURGMExJQXBCQldvaERTQUtLQUFCSVF0QmZndEJBM1JxSVFjQ2ZnSitBa0FDUUFKQUlBMHRBQUFpREVFRGNRNENBQUVDQzBHRHpnRWhDaUFJUVFocktRTUFJZ0VoTDBLQWdJQ0FNQXdDQzBLQWdJQ0FNQ0V2UVlHYUFTRUtRb0NBZ0lBd0lTMGdDRUVJYXlrREFDSUJEQUlMUW9DQWdJQXdJUzlCZ2FvQklRb2dDRUVJYXlrREFDSUJDeUV0UW9DQWdJQXdDeUV4SUFjcEF3QWhNRUcybVFFaEJ5QUdJQXNRMXdVaExnSkFJQXBCZ0JCeFJRUkFRYkdaQVNFSElBcEJnQ0J4UlEwQkN5QUdJQWNnTGtITW5nRVF2Z0VoTGdzZ0NFRUlheUVIQW45QmZ5QXVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWFRWDhnQmlBQlFUWWdMa0VCRUJsQkFFZ05BQm9nQmlBQklEQVFod1FnQmlBd0lBc2dMeUF4SUMwZ0NpQU1RUVJ4Y2hCdEN5RUtJQVlnQnlrREFCQVBJQTFCQVdvaERTQUlJQWxCMVFCR0JIOGdCaUFMRUJNZ0JpQUlRUkJyS1FNQUVBOUJmZ1ZCZnd0QkEzUnFJUWNnQ2tFQVRnMVhJQXBCSG5aQkFuRU1XQXNnQ2tFR2FpRU5JQWhCQ0dzaURDa0RBQ0V4SUFoQkVHc2hDeUFLS0FBQklROENRQUpBSUFvdEFBVkJBWEVFUUVLQWdJQ0FJQ0V0SUFzcEF3QWlNRUtBZ0lDQWNJTkNnSUNBZ0NCUkJFQWdCaWtETUNJd1FpQ0lwMEYwU3cwQ0RBTUxRb0NBZ0lBd0lTOUJnVDRoQnlBd1FvQ0FnSUJ3VkExR0lEQ25MUUFGUVJCeFJRMUdJQVlnTUVFN0lEQkJBQkFVSWkxQ2dJQ0FnSENESWdGQ2dJQ0FnQ0JSRFFJZ0FVS0FnSUNBNEFCUkRVZ2dMVUtBZ0lDQWNGb05Ba0c3MHdBaEJ3eEhDeUFHS0FJb0tRTUlJaTFDSUlpblFYVlBCRUFnTGFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHS1FNd0lqQkNJSWluUVhWSkRRRUxJRENuSWdjZ0J5Z0NBRUVCYWpZQ0FBdENnSUNBZ09BQUlTOGdCaUF0RUVjaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVExRklER25JZ2N0QUJGQk1IRU5QMEtBZ0lDQTRBQWhMaUFHSURCQkRSQkpJaTlDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5Ra0tBZ0lDQU1DRXhJQVlnTHlBSElCUWdFaERXQlNJdVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFVJZ0JpQXVJQUVRaHdRZ0xrS0FnSUNBY0ZvRVFDQXVweUlRSUJBdEFBVkJFSEk2QUFVTElBWWdMa0V3SUFjekFTeEJBUkFaR2dKQUlBbEIxd0JHQkVBZ0JpQXVJQWhCR0dzcEF3QVEyQVZCQUVnTlJBd0JDeUFHSUM0Z0R4RFpCVUVBU0ExREN5QXVRaUNJcDBGMVR3UkFJQzZuSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dCaUFCUVR3Z0xrR0RnQUVRR1VFQVNBMUNJQUZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUM1Qk95QUJRWUNBQVJBWlFRQklEVUlnQmlBdEVBOGdCaUF3RUE4Z0N5QXVOd01BSUF3Z0FUY0RBQXhRQ3lBR0lBaEJFR3NpQ1NrREFDQUlRUWhySWdjcEF3QVFUU0VCSUFZZ0NTa0RBQkFQSUFrZ0FUY0RBQ0FCUW9DQWdJQndnMEtBZ0lDQTRBQlNEVlVNQndzZ0NFRUlheUlISUFZZ0NFRVFheWtEQUNBSEtRTUFFRTBpQVRjREFDQUlJUWNnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZzFVREZnTElBaEJDR3NwQXdBaEFTQUlRUkJyS1FNQUlpMUNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBWWdBUkF4SWdkRkRWZ2dCaUFIRU1jQ0lBWWdCeEFUREZnTElBRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUdJQzBnQVJCTklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTlZ5QUlJQUUzQXdBZ0NFRUlhaUVIREZNTElBWWdDRUVJYXlJTUtRTUFFREVpQ1VVTlZpQUdJQWhCRUdzaUJ5a0RBQ0FKSUFoQkdHc2lDeWtEQUVFQUVCUWhBU0FHSUFrUUV5QUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRWWWdCaUFNS1FNQUVBOGdCaUFIS1FNQUVBOGdCaUFMS1FNQUVBOGdDeUFCTndNQURGSUxJQVlnQ0VFWWF5SUhLUU1BSUFoQkVHc3BBd0FnQ0VFSWF5a0RBRUdBZ0FJUTF3RWhDQ0FHSUFjcEF3QVFEeUFJUVFCT0RWRU1Bd3NnQmlnQ0VDZ0NqQUVoQ1FKL0FrQWdDRUVZYXlJSEtRTUFJaTVDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFBa0FnQ1VVTkFDQUpMUUFvUVFGeFJRMEFJQVlnQ0VFUWF5a0RBQkF4SWdkRkRWZ2dCaUFIRU1jQ0lBWWdCeEFUREZnTElCa3BBd0FpTGtJZ2lLZEJkVThFUUNBdXB5SUtJQW9vQWdCQkFXbzJBZ0FMSUFjZ0xqY0RBQXdCQ3lBSlJRMEFRWUNBQmlBSktBSW9RUUZ4RFFFYUMwR0FnQUlMSVFvZ0JpQXVJQWhCRUdzcEF3QWdDRUVJYXlrREFDQUtFTmNCSVFnZ0JpQUhLUU1BRUE4Z0NFRUFUZzFRSUFoQkhuWkJBbkVNVVFzZ0NFRVlheUlKS1FNQVF2Ly8vLzl2V0ExTElBWWdDRUVRYXlJTUtRTUFFREVpQzBVTlV5QUdJQWtwQXdBZ0N5QUlRUWhyS1FNQUlBaEJJR3NpQnlrREFFR0FnQUlRaGdRaENDQUdJQXNRRXlBR0lBY3BBd0FRRHlBR0lBa3BBd0FRRHlBR0lBd3BBd0FRRHlBSVFRQk9EVThnQ0VFZWRrRUNjUXhRQ3lBSVFSaHJLUU1BSVMwZ0NFRVFheWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0JpQXRJQUVnQ0VFSWF5SUhLUU1BUVllQUFSQzlBVUVBVGcxT0N5QUhJUWdNVVFzZ0NFRVFheUlNS1FNQUlpNUNnSUNBZ0JCYUJFQWdCa0gyOGdCQkFCQkdERkVMSUFZZ0NFRUlheUlIS1FNQUlnRkIwUUVnQVVFQUVCUWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMVFJQUZCUFVFQkVJVUVJUXNnQmlBQkVBOGdCaUFIS1FNQVFRQVE1d0VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTFRSUFZZ0FVSHFBQ0FCUVFBUUZDSXRRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdCaUFCRUE4TVVRc2dMcWNoQ1FKQUFrQWdDMFVOQUNBdFFUNUJBQkNGQkVVTkFDQUhLUU1BSWk0Z0RrSGdBR29nRGtHQUFXb1FpZ0pGRFFBZ0JpQU9RWndCYWlBdUVOWUJEVGtnRGlnQ25BRWlEeUFPS0FLQUFVY05BQ0FJUVJocklSQkJBQ0VMSUE0b0FtQWhJd05BSUFzZ0QwWU5BaUFRS1FNQUlTOGdJeUFMUVFOMGFpa0RBQ0l1UWlDSXAwRjFUd1JBSUM2bkloZ2dHQ2dDQUVFQmFqWUNBQXNnQmlBdklBa2dMa0VIRUs4QklSZ2dDMEVCYWlFTElBbEJBV29oQ1NBWVFRQk9EUUFMRERrTElBaEJHR3NoQ3dOQUlBWWdBU0F0SUE1Qm5BRnFFSzRCSWk1Q2dJQ0FnSENEUW9DQWdJRGdBRkVOT1NBT0tBS2NBUTBCSUFZZ0N5a0RBQ0FKSUM1QkJ4Q3ZBVUVBU0EwNUlBbEJBV29oQ1F3QUN3QUxJQXdnQ2EwM0F3QWdCaUFCRUE4Z0JpQXRFQThnQmlBSEtRTUFFQThNVEFzZ0NrRUNhaUVOSUFnaEJ5QUdJQWdnQ2kwQUFTSUpRWDl6SWd0QkEzUkJZSEpxS1FNQUlBZ2dDMEVCZEVGQWNrRjRjV29wQXdBZ0NDQUpRUVYyUVg5elFRTjBhaWtEQUVFQUVOUUZSUTFMREU4TEFrQWdDRUVJYXlJSEtRTUFJZ0ZDSUlpbklnc2dDRUVRYXlJSktRTUFJaTFDSUlpbklneHlSUVJBSUFIRUlDM0VmQ0lCUW9DQWdJQUlmRUwvLy8vL0QxWU5BU0FKSUFGQy8vLy8vdytETndNQURFd0xJQXhCQjJ0QmJVc2dDMEVIYTBGdFMzSU5BQ0FKUW9DQWdJREFmaUF0UW9DQWdJREFnWUQ4L3dCOHZ5QUJRb0NBZ0lEQWdZRDgvd0I4djZDOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHMzQXdBTVN3c2dCaUFJRU5NRlJRMUtERTRMSUFwQkFtb2hEUUpBSUFoQkNHc2lDQ2tEQUNJdElCRWdDaTBBQVVFRGRHb2lCeWtEQUNJQmhFTC8vLy8vRDFnRVFDQXR4Q0FCeEh3aUxVS0FnSUNBQ0h4Qy8vLy8vdzlXRFFFZ0J5QXRRdi8vLy84UGd6Y0RBQXhGQ3lBQlFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFBZ0JpQXRRUUlRbWdFaUxVS0FnSUNBY0lOQ2dJQ0FnT0FBVVExT0lBY3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUpJQWtvQWdCQkFXbzJBZ0FMSUFZZ0FTQXRFTVFDSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOVGlBR0lBY2dBUkFnREVRTElBRkNJSWluUVhWUEJFQWdBYWNpQ1NBSktBSUFRUUZxTmdJQUN5QU9JQUUzQXlBZ0RpQUlLUU1BTndNb0lBWWdMQkRUQlExTklBWWdCeUFPS1FNZ0VDQU1Rd3NnQ0VFSWF5SUhLUU1BSWdGQ0lJaW5JZ3dnQ0VFUWF5SUxLUU1BSWkxQ0lJaW5JZzl5UlFSQUlDM0VJQUhFZlNJQlFvQ0FnSUFJZkVMLy8vLy9EMVlOQkNBTElBRkMvLy8vL3crRE53TUFERWtMSUE5QkIydEJiVXNnREVFSGEwRnRTM0lOQXlBTFFvQ0FnSURBZmlBdFFvQ0FnSURBZ1lEOC93Qjh2eUFCUW9DQWdJREFnWUQ4L3dCOHY2RzlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzM0F3QU1TQXNDZkNBSVFRaHJJZ2NwQXdBaUxVSWdpS2NpRENBSVFSQnJJZ3NwQXdBaUxrSWdpS2NpRDNKRkJFQWdMY1FnTHNSK0lnRkNnSUNBZ0FoOFFvQ0FnSUFRV2dSQUlCSXRBQ2hCQkhGQkFDQUJRb0NBZ0lDQWdJQVFmVUtCZ0lDQWdJQ0FZRlFiRFFVZ0Fia01BZ3RFQUFBQUFBQUFBSUFnTFNBdWhFS0FnSUNBQ0lOUUlBRkNBRkp5UlEwQkdpQUxJQUZDLy8vLy93K0ROd01BREVrTElBOUJCMnRCYlVzZ0RFRUhhMEZ0UzNJTkF5QVNMUUFvUVFSeERRTWdMa0tBZ0lDQXdJR0EvUDhBZkw4Z0xVS0FnSUNBd0lHQS9QOEFmTCtpQ3lFMElBdENnSUNBZ01CK0lEUzlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzM0F3QU1Sd3NnQ0VFSWF5SUhLUU1BSWdFZ0NFRVFheUlMS1FNQUlpMkVRdi8vLy84UFZnMEJJQkl0QUNoQkJIRU5BU0FMQW40Z0xhZTNJQUdudDZNaU5MMGlBUUovSURTWlJBQUFBQUFBQU9CQll3UkFJRFNxREFFTFFZQ0FnSUI0Q3lJSXQ3MVJCRUFnQ0swTUFRdENnSUNBZ01CK0lBRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMTndNQURFWUxJQWhCQ0dzaUJ5a0RBQ0lCSUFoQkVHc2lDeWtEQUNJdGhFTC8vLy8vRDFZTkFDQXRweUlNUVFCSURRQWdBYWNpRDBFQVRBMEFJQXNnRENBUGNLMDNBd0FNUlFzakFFRWdheUlISkFBQ2Z3SkFBa0FDUUFKQUFuNENRQUpBQWtBQ1FBSkFBa0FDUUVFSElBaEJFR3NpQ3lrREFDSUJRaUNJcHlJTUlBeEJCMnRCYmtrYklneEJCMGRCQnlBSVFRaHJJaU1wQXdBaUxrSWdpS2NpRHlBUFFRZHJRVzVKR3lJUFFRZEhja1VFUUNBSElDNUNnSUNBZ01DQmdQei9BSHczQXdnZ0J5QUJRb0NBZ0lEQWdZRDgvd0I4TndNUURBRUxBa0FnREVGL1JpQVBRWDV4UVFKSGNVVWdERUYrY1VFQ1JpQVBRWDlIY25FTkFDQUdJQWRCR0dvZ0FTQXVJQWxCQVVFQUVJVUNJZ3hGRFFBZ0JpQUJFQThnQmlBdUVBOGdERUVBU0EwTUlBc2dCeWtER0RjREFBd0pDeUFHSUFFUWJDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRb2dCaUF1RUd3aUxrS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBWWdBUkFQREF3TFFRY2dBVUlnaUtjaURDQU1RUWRyUVc1Skd5SU1RUWNnTGtJZ2lLY2lEeUFQUVFkclFXNUpHeUlQY2tVRVFDQXVweUVNSUFHbklROENRQUpBQWtBQ1FBSkFBa0FnQ1VHYUFXc09CZ0FCQWdrRkF3UUxJQzdFSUFIRWZpRXRBa0FnQmlnQ0VDSVFLQUtNQVNJWVJRMEFJQmd0QUNoQkJIRkZEUUFnTFVLQWdJQ0FnSUNBRUgxQ2dZQ0FnSUNBZ0dCVURRZ0xRZ0FoQVNBdFFnQlNEUW9nRENBUGNrRUFUZzBMSUF0Q2dJQ0FnTUQrL3dNM0F3QU1EZ3NnQmlnQ0VDSVFLQUtNQVNJWUJFQWdHQzBBS0VFRWNRMEhDeUFMUW9DQWdJREFmaUFQdHlBTXQ2TzlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzM0F3QU1EUXNnREVFQVNpQVBRUUJPY1VVRVFDQUxBbjRnRDdjZ0RMY1FqZ01pTkwwaUFRSi9JRFNaUkFBQUFBQUFBT0JCWXdSQUlEU3FEQUVMUVlDQWdJQjRDeUlKdDcxUkJFQWdDYTBNQVF0Q2dJQ0FnTUIrSUFGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xOd01BREEwTElBOGdESEN0SVMwTUNBc2dCaWdDRUNJUUtBS01BU0lZQkVBZ0dDMEFLRUVFY1EwRkN5QVB0eUUwSUFzQ2ZnSjhJQXkzSWpXOVFvQ0FnSUNBZ0lENC93Q0RRb0NBZ0lDQWdJRDQvd0JSQkVCRUFBQUFBQUFBK0g4Z05KbEVBQUFBQUFBQThEOWhEUUVhQ3lBMElEVVFqd01MSWpTOUlnRUNmeUEwbVVRQUFBQUFBQURnUVdNRVFDQTBxZ3dCQzBHQWdJQ0FlQXNpQ2JlOVVRUkFJQW10REFFTFFvQ0FnSURBZmlBQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDemNEQUF3TEN5QUpRYklCUmcwRkRBUUxJQUhFSUM3RWZTRXREQVVMSUF4QmRVY2dEMEYxUjNGRkJFQWdCaUFKSUFzZ0FTQXVJQVlvQWhBb0F0Z0NFUm9BRFF3TUNRc2dERUYzUnlBUFFYZEhjVVVFUUNBR0lBa2dDeUFCSUM0Z0JpZ0NFQ2dDdkFJUkdnQkZEUWtNREFzZ0RFRjJSeUFQUVhaSGNVVUVRQ0FHS0FJUUlSQU1BZ3NnQmlBSFFSQnFJQUVRYmcwS0lBWWdCMEVJYWlBdUVHNE5Dd3NDUUNBR0tBSVFJaEFvQW93QklneEZEUUFnREMwQUtFRUVjVVVOQUNBSEt3TVFFTDBDUlEwQUlBY3JBd2dRdlFJTkFRc0NRQUpBQWtBQ1FBSkFBa0FDUUNBSlFab0JhdzRHQUFFQ0NBVUVBd3NnQnlzREVDQUhLd01Jb2lFMERBVUxJQWNyQXhBZ0J5c0RDS01oTkF3RUN5QUhLd01RSUFjckF3Z1FqZ01oTkF3REN5QUpRYklCUncwRUlBY3JBeEFnQnlzRENKa2lOUkNPQXlJMFJBQUFBQUFBQUFBQVkwVU5BaUExSURTZ0lUUU1BZ3NnQnlzREVDRTFJQWNyQXdnaU5yMUNnSUNBZ0lDQWdQai9BSU5DZ0lDQWdJQ0FnUGovQUZFRVFFUUFBQUFBQUFENGZ5RTBJRFdaUkFBQUFBQUFBUEEvWVEwQ0N5QTFJRFlRandNaE5Bd0JDeUFIS3dNUUlBY3JBd2loSVRRTElBdENnSUNBZ01CK0lEUzlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzM0F3QU1Cd3NnQmlBSklBc2dBU0F1SUJBb0FxQUNFUm9BUlEwR0RBa0xFQUVBQ3lBTVJRMEZJQUhFSUM3RUlnR0JJaTFDQUZrTkFDQU1RUUJJQkVBZ0xTQUJmU0V0REFFTElBRWdMWHdoTFFzZ0xVS0FnSUNBQ0h4Qy8vLy8vdzlXRFFFZ0xTRUJDeUFCUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnTGJtOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMSVFFZ0N5QUJOd01BQzBFQURBTUxJQVpCQWhDRUFnd0JDeUFHSUM0UUR3c2dDMEtBZ0lDQU1EY0RBQ0FqUW9DQWdJQXdOd01BUVg4TElRa2dCMEVnYWlRQUlBa05TQ0FJUVFocklRY01SQXNnQ0VFRWF5Z0NBQ0lIUlNBSFFRZHJRVzVKY2cwOUlBZ2hCeUFHSUFoQmpRRVE1Z0ZGRFVNTVJ3c0NRQUo4SUFoQkNHc2lCeWtEQUNJQlFpQ0lweUlKUlFSQVJBQUFBQUFBQUFDQUlBR25JZ3BGRFFFYVJBQUFBQUFBQU9CQklBcEJnSUNBZ0hoR0RRRWFJQWRDQUNBQmZVTC8vLy8vRDRNM0F3QU1Qd3NnQ1VFSGEwRnRTdzBCSUFGQ2dJQ0FnTUQrL3dOOXZ3c2hOQ0FIUW9DQWdJREFmaUEwdlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJOd01BREQwTElBZ2hCeUFHSUFoQmpBRVE1Z0ZGRFVJTVJnc2dDRUVJYXlJSEtRTUFJZ0ZDLy8vLy93OVdJQUZDLy8vLy93K0RRdi8vLy84SFVYSkZCRUFnQnlBQlFnRjhRdi8vLy84UGd6Y0RBQXc4Q3lBSUlRY2dCaUFJUVk4QkVPWUJSUTFCREVVTElBaEJDR3NpQnlrREFDSUJRdi8vLy84UFZpQUJRdi8vLy84UGcwS0FnSUNBQ0ZGeVJRUkFJQWNnQVVJQmZVTC8vLy8vRDRNM0F3QU1Pd3NnQ0NFSElBWWdDRUdPQVJEbUFVVU5RQXhFQ3lBR0lBaEJDR3NpQnlrREFCQnNJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FIUW9DQWdJQXdOd01BREVRTElBY2dBVGNEQUNBQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQUJOd01BSUFZZ0NFRUlhaUlISUFsQkFtc1E1Z0ZGRFQ4TVF3c2dDa0VDYWlFTklCRWdDaTBBQVVFRGRHb2lCeWtEQUNJQlF2Ly8vLzhQVmlBQlF2Ly8vLzhQZzBMLy8vLy9CMUZ5UlFSQUlBY2dBVUlCZkVMLy8vLy9ENE0zQXdBTU9Rc2dBVUlnaUtkQmRVOEVRQ0FCcHlJSklBa29BZ0JCQVdvMkFnQUxJQTRnQVRjRFlDQUdJQ1pCandFUTVnRU5RaUFHSUFjZ0Rpa0RZQkFnRERnTElBcEJBbW9oRFNBUklBb3RBQUZCQTNScUlnY3BBd0FpQVVMLy8vLy9EMVlnQVVMLy8vLy9ENE5DZ0lDQWdBaFJja1VFUUNBSElBRkNBWDFDLy8vLy93K0ROd01BRERnTElBRkNJSWluUVhWUEJFQWdBYWNpQ1NBSktBSUFRUUZxTmdJQUN5QU9JQUUzQTJBZ0JpQW1RWTRCRU9ZQkRVRWdCaUFISUE0cEEyQVFJQXczQ3lBSVFRaHJJZ2NwQXdBaUFVTC8vLy8vRDFnRVFDQUhJQUZDLy8vLy93K0ZOd01BRERjTElBZ2hCeU1BUVJCcklna2tBQUovQWtBQ1FBSkFJQWhCQ0dzaUN5a0RBQ0lCUW9DQWdJQndWQTBBSUFZZ0NVRUlhaUFCUVpVQkVNSUZJZ3hCQUVnTkFTQU1SUTBBSUFZZ0FSQVBJQXNnQ1NrRENEY0RBQXdDQ3dKQUlBWWdBUkJzSWdGQ2dJQ0FnSENESWkxQ2dJQ0FnT0FBVVEwQUlBWW9BaEFpRENnQ2pBRWlEd1IvSUE4dEFDaEJCSEZCQW5ZRlFRQUxSU0F0UW9DQWdJRGdmbEp4UlFSQUlBWWdDMEdWQVNBQklBd29BcHdDRVJzQURRRU1Bd3NnQmlBSlFRUnFJQUVRbUFFTkFDQUxJQWsxQWdSQy8vLy8vdytGTndNQURBSUxJQXRDZ0lDQWdEQTNBd0FMUVg4TUFRdEJBQXNoQ3lBSlFSQnFKQUFnQzBVTlBBeEFDd0pBQWtBQ1FDQUlRUWhySWdjcEF3QWlBU0FJUVJCcklnc3BBd0FpTFlSQy8vLy8vdzlXRFFBZ0FhY2hDU0FTTFFBb1FRUnhSUTBCSUFsQkgwc05BQ0F0SUFHR1FvQ0FnSUFJZkVLQWdJQ0FFRlFOQWdzZ0JpQUlRYUFCRU1NQ1JRMDlERUVMSUFsQkgzRWhDUXNnQ3lBdHB5QUpkSzAzQXdBTU93c2dDRUVJYXlJSEtRTUFJZ0VnQ0VFUWF5SUpLUU1BSWkyRVF2Ly8vLzhQV0FSQUlBa0NmaUF0cHlBQnAzWWlDRUVBVGdSQUlBaXREQUVMUW9DQWdJREFmaUFJdUwwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3MzQXdBTU93c2pBRUVRYXlJSkpBQWdDRUVJYXlJTUtRTUFJUzBDZndKQUFrQWdCaUFJUVJCcklnc3BBd0FRYkNJQlFvQ0FnSUJ3Z3lJdVFvQ0FnSURnQUZFRVFDQUdJQzBRRHd3QkN5QUdJQzBRYkNJdFFvQ0FnSUJ3Z3lJdlFvQ0FnSURnQUZFRVFDQUdJQUVRRHd3QkN5QUdLQUlRS0FLTUFTSVBCRUFnRHkwQUtFRUVjUTBDQ3lBdVFvQ0FnSURnZmxJZ0wwS0FnSUNBNEg1U2NRMEJJQVpCK29nQlFRQVFGU0FHSUFFUUR5QUdJQzBRRHdzZ0MwS0FnSUNBTURjREFDQU1Rb0NBZ0lBd053TUFRWDhNQVFzZ0JpQUpRUXhxSUFFUW1BRWFJQVlnQ1VFSWFpQXRFSmdCR2lBTEFuNGdDU2dDRENBSktBSUlkaUlMUVFCT0JFQWdDNjBNQVF0Q2dJQ0FnTUIrSUF1NHZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3pjREFFRUFDeUVMSUFsQkVHb2tBQ0FMUlEwNkRENExBa0FnQ0VFSWF5SUhLUU1BSWdFZ0NFRVFheUlKS1FNQUlpMkVRdi8vLy84UFZnMEFJQWtnTGFjZ0FhY2lDVUVnVHdSL0lCSXRBQ2hCQkhFTkFTQUpRUjl4QlNBSkMzV3ROd01BRERvTElBWWdDRUdoQVJEREFrVU5PUXc5Q3lBSVFRaHJJZ2NwQXdBaUFTQUlRUkJySWdrcEF3QWlMWVJDLy8vLy93OVlCRUFnQ1NBQklDMkROd01BRERrTElBWWdDRUd0QVJEREFrVU5PQXc4Q3lBSVFRaHJJZ2NwQXdBZ0NFRVFheUlKS1FNQWhDSUJRdi8vLy84UFdBUkFJQWtnQVRjREFBdzRDeUFHSUFoQnJ3RVF3d0pGRFRjTU93c2dDRUVJYXlJSEtRTUFJZ0VnQ0VFUWF5SUpLUU1BSWkyRVF2Ly8vLzhQV0FSQUlBa2dBU0F0aFRjREFBdzNDeUFHSUFoQnJnRVF3d0pGRFRZTU9nc2dDRUVJYXlJSEtRTUFJZ0VnQ0VFUWF5SUpLUU1BSWkyRVF2Ly8vLzhQV0FSQUlBa2dMYWNnQWFkSXJVS0FnSUNBRUlRM0F3QU1OZ3NnQmlBSVFhTUJFSmNEUlEwMUREa0xJQWhCQ0dzaUJ5a0RBQ0lCSUFoQkVHc2lDU2tEQUNJdGhFTC8vLy8vRDFnRVFDQUpJQzJuSUFHblRLMUNnSUNBZ0JDRU53TUFERFVMSUFZZ0NFR2tBUkNYQTBVTk5BdzRDeUFJUVFocklnY3BBd0FpQVNBSVFSQnJJZ2twQXdBaUxZUkMvLy8vL3c5WUJFQWdDU0F0cHlBQnAwcXRRb0NBZ0lBUWhEY0RBQXcwQ3lBR0lBaEJwUUVRbHdORkRUTU1Od3NnQ0VFSWF5SUhLUU1BSWdFZ0NFRVFheUlKS1FNQUlpMkVRdi8vLy84UFdBUkFJQWtnTGFjZ0FhZE9yVUtBZ0lDQUVJUTNBd0FNTXdzZ0JpQUlRYVlCRUpjRFJRMHlERFlMSUFoQkNHc2lCeWtEQUNJQklBaEJFR3NpQ1NrREFDSXRoRUwvLy8vL0QxZ0VRQ0FKSUMybklBR25ScTFDZ0lDQWdCQ0VOd01BRERJTElBWWdDRUVBRU5JRlJRMHhERFVMSUFoQkNHc2lCeWtEQUNJQklBaEJFR3NpQ1NrREFDSXRoRUwvLy8vL0QxZ0VRQ0FKSUMybklBR25SNjFDZ0lDQWdCQ0VOd01BRERFTElBWWdDRUVCRU5JRlJRMHdERFFMSUFoQkNHc2lCeWtEQUNJQklBaEJFR3NpQ2lrREFDSXRoRUwvLy8vL0QxZ0VRQ0FLSUMybklBR25ScTFDZ0lDQWdCQ0VOd01BRERBTElBWWdDRUVBRU5FRkRDOExJQWhCQ0dzaUJ5a0RBQ0lCSUFoQkVHc2lDaWtEQUNJdGhFTC8vLy8vRDFnRVFDQUtJQzJuSUFHblI2MUNnSUNBZ0JDRU53TUFEQzhMSUFZZ0NFRUJFTkVGREM0TElBWWdDQ0FXS0FMSUFoRURBQTB4SUFoQkNHc2hCd3d0Q3lBSVFRaHJJZ2NwQXdBaUFVTC8vLy8vYjFnRVFDQUdRYUgwQUVFQUVCVU1NUXNnQmlBSVFSQnJJZ3dwQXdBaUxSQXhJZ2xGRFRBZ0JpQUJJQWtRY1NFTElBWWdDUkFUSUF0QkFFZ05NQ0FHSUMwUUR5QUdJQUVRRHlBTUlBdEJBRWV0UW9DQWdJQVFoRGNEQUF3c0N5QUdJQWhCRUdzaUNTa0RBQ0lCSUFoQkNHc2lCeWtEQUNJdEVOQUZJZ3RCQUVnTkx5QUdJQUVRRHlBR0lDMFFEeUFKSUF0QkFFZXRRb0NBZ0lBUWhEY0RBQXdyQ3lBR0lBaEJDR3NpQnlrREFDSUJFSVFFSVFvZ0JpQUJFQThnQnlBR0lBb1FMVGNEQUF3a0N5QUlRUkJySWd3cEF3QWhBU0FHSUFoQkNHc2lCeWtEQUNJdEVERWlDVVVOTFNBR0lBRWdDVUdBZ0FJUTFRRWhDeUFHSUFrUUV5QUxRUUJJRFMwZ0JpQUJFQThnQmlBdEVBOGdEQ0FMUVFCSHJVS0FnSUNBRUlRM0F3QU1LUXNnQ2tFRmFpRU5JQVlnQmlrRHdBRWdDaWdBQVVFQUVOVUJJZ2RCQUVnTkxDQUlJQWRCQUVldFFvQ0FnSUFRaERjREFDQUlRUWhxSVFjTUtBc2dDRUVJYXlJSEtRTUFJZ0ZDLy8vLy8yOVdEU0VnQmlBQkVDVWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMHJJQVlnQnlrREFCQVBJQWNnQVRjREFBd2hDeUFJUVFocklnY3BBd0FpQVVJZ2lLZEJDR29pQ1VFSVRVRUFRUUVnQ1hSQmd3SnhHdzBnSUFZZ0FSQ0RCQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEU29nQmlBSEtRTUFFQThnQnlBQk53TUFEQ0FMSUFoQkVHc3BBd0JDZ0lDQWdCQ0VRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUdRWlliUVFBUUZRd3FDeUFJUVFocklnY3BBd0FpQVVJZ2lLZEJDR29pQ1VFSVRVRUFRUUVnQ1hSQmd3SnhHdzBmSUFZZ0FSQ0RCQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEU2tnQmlBSEtRTUFFQThnQnlBQk53TUFEQjhMSUFwQkNtb2hEU0FLTFFBSklRc2dDaWdBQlNFUElBWWdDRUVJYXlJSEtRTUFJZ0VnQ2lnQUFTSU1FSEVpRUVFQVNBMG9Ba0FnRUVVTkFDQUxCRUJCQUNFTElBWWdBVUhiQVNBQlFRQVFGQ0l0UW9DQWdJQndnMEtBZ0lDQTRBQlJEU29nTFVLQWdJQ0FjRm9FUUNBR0lBWWdMU0FNSUMxQkFCQVVFQ1loQ3dzZ0JpQXRFQThnQzBFQVNBMHFJQXNOQVFzQ1FBSkFBa0FDUUFKQUFrQUNRQ0FKUWZJQWF3NEdBQUVDQXdRRkJnc2dCaUFCSUF3Z0FVRUFFQlFpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTB2SUFZZ0J5QUJFQ0FNQlFzZ0JpQUJJQXdnQ0VFUWF5SUlLUU1BUVlDQUFoRFFBU0VKSUFZZ0J5a0RBQkFQSUFsQkFFNE5CQXd1Q3lBR0lBRWdERUVBRU5VQklnbEJBRWdOTFNBR0lBY3BBd0FRRHlBSElBbEJBRWV0UW9DQWdJQVFoRGNEQUF3REN5QUlJQVlnREJCY053TUFJQWhCQ0dvaENBd0NDeUFHSUFFZ0RDQUJRUUFRRkNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFNzZ0NDQUJOd01BSUFoQkNHb2hDQXdCQ3lBR0lBRWdEQ0FCUVFBUUZDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRTb2dCaUFIS1FNQUVBOGdCMEtBZ0lDQU1EY0RBQ0FJSUFFM0F3QWdDRUVJYWlFSUN5QU5JQTlxUVFWcklRME1Id3NnQmlBSEtRTUFFQThNSkFzZ0NFRUlheWtEQUNJdVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVORFF3RkN5QUlRUWhyS1FNQUlpNUNnSUNBZ0hDRFFvQ0FnSUFnVVEwTURBUUxJQVlnQ0VFSWF5a0RBQ0l1RUlRRVFjVUFSZzBCREFNTElBWWdDRUVJYXlrREFDSXVFSVFFUVJ0SERRSUxJQVlnTGhBUERBa0xJQWhCQ0dzcEF3QWlMa0tBZ0lDQVlJTkNnSUNBZ0NCUkRRZ0xJQVlnTGhBUElBaEJDR3RDZ0lDQWdCQTNBd0FNRndzZ0V5Z0NGQ0VISUE0Z0NUWUNCQ0FPSUFkQmYzTWdEV28yQWdBZ0JrR0lJU0FPRUVZTUlBc2dDa0VEYWlFTkRCVUxRZ0loTGd3Z0MwS0FnSUNBTUNFdURCOExRZ0FoTGd3ZUN5QUlRUWhySWdncEF3QWhBUXdlQzBISWhBRkJydndBUWFqOEFFSEtOQkFBQUFzZ0NFRUlhMEtCZ0lDQUVEY0RBQXdQQ3lBR0lBRkJBUkN0QVJvZ0JpQUJFQThnQmlBdEVBOE1HQXNnQVNFdkRBTUxRb0NBZ0lBd0lTMExJQVlnQjBFQUVCVUxRb0NBZ0lBd0lTNExJQVlnTUJBUElBWWdMUkFQSUFZZ01SQVBJQVlnTHhBUElBWWdMaEFQSUF0Q2dJQ0FnREEzQXdBZ0RFS0FnSUNBTURjREFBd1RDeUFHSUFzcEF3QVFEeUFMUW9DQWdJQXdOd01BSUFkQkFFZ05FaUFHSUM0UUQwS0FnSUNBTUNFdUN5QUlJQzQzQXdBZ0NDQUhRUUJIclVLQWdJQ0FFSVEzQXdnZ0NFRVFhaUVIREEwTElDMGhBUU5BSUFZZ0RrSGdBR29nRGtHQUFXb2dBYWRCSVJDT0FRMEJRUUFoQnlBT0tBSmdJUWtnRGlnQ2dBRWhDd05BSUFjZ0MwY0VRQ0FHSUM0Z0NTQUhRUU4wYWlJTUtBSUVRb0NBZ0lBZ0lBd29BZ0JCQUVkQkFuUVFHUm9nQjBFQmFpRUhEQUVMQ3lBR0lBa2dDeEJhSUFZZ0FSQ01BaUlCUW9DQWdJQndneUl0UW9DQWdJQWdVUTBESUMxQ2dJQ0FnT0FBVVEwQ0lBWVFlMFVOQUFzTElBWWdBUkFQQ3lBR0lDNFFEeUFQUW9DQWdJRGdBRGNEQUF3T0N5QVBJQzQzQXdBTUF3c2dEQzBBQlVFQmNRMEJDeUFHSUFkQmhaY0JFSThCREFzTElCc29BZ0FvQWhBaUNVRXdhaUVMSUFrZ0NTZ0NHQ0FIY1VGL2MwRUNkR29vQWdBaENRTkFJQWxGRFFFZ0N5QUpRUUZyUVFOMGFpSUpLQUlFSUFkR0RRSWdDU2dDQUVILy8vOGZjU0VKREFBTEFBc2dDQ0VIREFVTElBWWdCeERmQlF3SUN5QUdFQ1FNQndzZ0JpQUJFQThMSUFoQ2dJQ0FnT0FBTndNQUlBaEJDR29oQ0F3RkN5QUxJQWsyQWlRZ0N5QUVOZ0lvSUFZcEE2Z0JJaTFDSUlpblFYVlBCRUFnTGFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUFGQjBRRWdMVUVERUJrYUlBWWdBVUhPQUVLQWdJQ0FNQ0FHS1FPd0FTSXRJQzFCZ0RBUWJSb2dDQ0FCTndNQUlBaEJDR29oQnd0QkFBc2hDU0FISVFnZ0RTRUtJQWxGRFFFTEN5QUhJUWdMUVFFaEJ3d0ZDd0pBQWtBZ0Zpa0RnQUVpTGtLQWdJQ0FjRlFOQUNBdXB5SUhMd0VHUVFOSERRQWdCeWdDRUNJSFFUQnFJUW9nQnlBSEtBSVlRWDl6UVFKMFFhaCtjbW9vQWdBaEJ3SkFBMEFnQndSQUlBb2dCMEVCYTBFRGRHb2lCeWdDQkVFMVJnMENJQWNvQWdCQi8vLy9IM0VoQnd3QkN3c2dFaUFOTmdJZ0lBWWdMa0VBUVFCQkFCREtBaUFXS1FPQUFTRXVDeUF1UW9DQWdJQndWQTBBSUM2bklnY3ZBUVpCQTBjTkFDQUhMUUFGUVNCeERRRUxBMEFnSENBSUlnZFBEUUVnQmlBSFFRaHJJZ2dwQXdBaUFSQVBJQUZDZ0lDQWdIQ0RRb0NBZ0lEUUFGSU5BQ0FCcHlJS0RRVWdCaUFIUVJCcklnZ3BBd0FRRHlBR0lBZEJHR3NwQXdCQkFSQ3RBUm9NQUFzQUMwS0FnSUNBNEFBaExrS0FnSUNBNEFBaEFTQVRMUUFSUVRCeFJRMEJDeUFTSUFnMkFpd2dFaUFOTmdJZ0RBRUxJQklvQWh3Z0VrRVlha2NFUUNBV0lCSVF6d1VMQTM0Z0NDQVhUUVIrSUFFRklBWWdGeWtEQUJBUElCZEJDR29oRnd3QkN3c2hMZ3NnRmlBU0tBSUFOZ0tNQVF3Q0N5QUlJQllwQTRBQk53TUFJQlpDZ0lDQWdDQTNBNEFCSUJNb0FoUWdDbW9oQ2lBSElRaEJBQ0VIREFBTEFBc2dEa0dnQVdva0FDQXVDejhCQVg4akFFSFFBR3NpQWlRQUlBSWdBUVIvSUFBb0FoQWdBa0VRYWlBQkVKQUJCVUhRNmdBTE5nSUFJQUJCdi9VQUlBSVF4Z0lnQWtIUUFHb2tBQXVvQVFBQ1FDQUJRWUFJVGdSQUlBQkVBQUFBQUFBQTRIK2lJUUFnQVVIL0Qwa0VRQ0FCUWY4SGF5RUJEQUlMSUFCRUFBQUFBQUFBNEgraUlRQkIvUmNnQVNBQlFmMFhUaHRCL2c5cklRRU1BUXNnQVVHQmVFb05BQ0FBUkFBQUFBQUFBR0FEb2lFQUlBRkJ1SEJMQkVBZ0FVSEpCMm9oQVF3QkN5QUFSQUFBQUFBQUFHQURvaUVBUWZCb0lBRWdBVUh3YUV3YlFaSVBhaUVCQ3lBQUlBRkIvd2RxclVJMGhyK2lDM1VCQTM4Q1FBSkFJQUZDZ0lDQWdIQmFCRUFnQWFjaUF5OEJCaUlFUVFwcklnVkJHazFCQUVFQklBVjBRWUdBZ0N4eEd5QUVRUVJyUVFSSmNnMEJDeUFBSUFJUUR5QUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBRUhINUFCQkFCQVZEd3NnQUNBREtRTWdFQThnQXlBQ053TWdDd3NiQUNBQUlBRkIvd0Z4RUJFZ0FDQUNJQUFvQWdSclFRUnJFQjBMamdFQkFuOGpBRUVRYXlJQ0pBQUNmeUFCQkVBZ0FFRWdhaUFBSUFCQndRQnJRUnBKR3lBQVFmOEFUUTBCR2lBQ1FRUnFJQUJCQWhDeUF4b2dBaWdDQkF3QkN5QUFRU0JySUFBZ0FFSGhBR3RCR2trYklBQkIvd0JORFFBYUlBSkJCR29nQUVFQUVMSURJUUVnQWlnQ0JDSURJQUFnQTBIL0FFc2JJQUFnQVVFQlJoc0xJUUFnQWtFUWFpUUFJQUFMUndJQmZnRi9JQUFwQThBQklRUWdBVUlnaUtkQmRVOEVRQ0FCcHlJRklBVW9BZ0JCQVdvMkFnQUxJQUFnQkNBQ0lBRkJBeER2QVJvZ0FDQUJJQU1RK3dVZ0FDQUJFQThMaUFnQ0JYOEJmaU1BUVJCcklnTWtBQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUFLQUlRSWdKQnl3QnFEZ01FQVFNQUN5QUNRZXNBYWtFQ1NRMEJBa0FnQWtFcmF3NERBUVlCQUFzZ0FrRmFSZzBFSUFKQi9nQkdEUUFnQWtFaFJ3MEZDMEYvSVFRZ0FCQVNEUWtnQUVFUUVOOEJEUWtDUUFKQUFrQUNRQUpBQWtBZ0FrRXJhdzREQWdVQkFBc2dBa0cyZjBZTkF5QUNRU0ZHRFFJZ0FrSCtBRWNOQkNBQVFaVUJFQkFNRFFzZ0FFR01BUkFRREF3TElBQkJqUUVRRUF3TEN5QUFRWllCRUJBTUNnc2dBRUVPRUJBZ0FFRUdFQkFNQ1FzUUFRQUxJQUFRRWcwRklBQkJBQkRmQVEwRklBQWdBMEVNYWlBRFFRaHFJQU1nQTBFRWFrRUFRUUVnQWhDMUFRMEZJQUFnQWtFSGEwSC9BWEVRRUNBQUlBTW9BZ3dnQXlnQ0NDQURLQUlBSUFNb0FnUkJBa0VBRU1FQkRBUUxRWDhoQkNBQUVCSU5CeUFBUVJBUTN3RU5CMEVBSVFRQ1FDQUFLQUpBSWdFb0FwZ0NJZ0pCQUVnTkFDQUJLQUtBQWlBQ2FpSUJMUUFBUWJnQlJ3MEFJQUZCdHdFNkFBQUxJQUJCbHdFUUVBd0hDeUFBUVVCcktBSUFJUUZCZnlFRUlBQVFFZzBHSUFCQkVCRGZBUTBHUVFBaEJBSkFJQUVvQXBnQ0lnSkJBRWdOQUFKQUFrQUNRQUpBQWtBQ1FDQUJLQUtBQWlBQ2FpSUZMUUFBSWdaQnh3QnJEZ1FCQmdZRkFBc2dCa0crQVVZTkF5QUdRYmdCUmcwQ0lBWkJ3UUJIRFFVZ0JTZ0FBU0VGUVg4aEJDQUJRWDgyQXBnQ0lBRWdBallDaEFJZ0FDQUFLQUlBSUFVUVhDSUhRUUVRdEFFaEFTQUFLQUlBSUFjUUR5QUFLQUlBSUFVUUV5QUJSUTBCREF3TElBRkJmellDbUFJZ0FTQUNOZ0tFQWdzZ0FFR1lBUkFRREFrTElBVW9BQUVpQWtFSVJpQUNRZkVBUm5JTkFpQUJMUUJ1UVFGeEJFQWdBRUdWN0FCQkFCQVdEQWNMSUFWQnVnRTZBQUFNQ0FzZ0FFSDc5QUJCQUJBV0RBVUxJQUJCTUJBUUlBQkJBQkFhSUFCQlFHc29BZ0JCQXhCa0RBY0xJQUJCRGhBUUlBQkJDaEFRREFZTElBQW9Ba0FpQVMwQWJFRUNjVVVFUUNBQVFmN3dBRUVBRUJZTUF3c2dBU2dDWkVVRVFDQUFRWkROQUVFQUVCWU1Bd3RCZnlFRUlBQVFFZzBGSUFCQkVCRGZBUTBGSUFCQml3RVFFQXdFQzBGL0lRUWdBQ0FCUVFSeFFRSnlFTHNERFFRZ0FDZ0NNQTBBSUFBb0FoQWlBa0hyQUdwQkFVc05BQ0FBSUFOQkRHb2dBMEVJYWlBRElBTkJCR3BCQUVFQklBSVF0UUVOQkNBQUlBSkJCV3RCL3dGeEVCQWdBQ0FES0FJTUlBTW9BZ2dnQXlnQ0FDQURLQUlFUVFOQkFCREJBU0FBRUJJTkJBdEJBQ0VFSUFGQkdIRkZEUU1nQUNnQ0VFRitjVUdrZjBjTkF5QUJRUkJ4UlEwQklBQW9Ba0F0QUc1QkJIRU5BU0FBS0FJQVFhK1lBVUVBRUlBQ0MwRi9JUVFNQWd0QmZ5RUVJQUFRRWcwQklBQkJDQkRmQVEwQklBQkJud0VRRUF0QkFDRUVDeUFEUVJCcUpBQWdCQXRnQUNBRVFmSUFJQU5CeGdCcklBTkJ0d0ZHRzBIL0FYRVFFU0FFSUFBZ0FoQVlFQjBnQlNBQklBVW9BZ0FReUFNaUFEWUNBQ0FFSUFBUUhTQUVJQVpCL3dGeEVCRWdBU0FGS0FJQVFRRVFhUm9nQVNBQktBTFFBa0VCYWpZQzBBSUw4aXNCRVg4akFFR1FBV3NpQXlRQUlBQW9BZ0FoRGdKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FBS0FJUUlnUkJnMzlIRFFBZ0FDZ0NLQTBDSUFBb0FqaEJBQkNEQVVFNlJ3MEJJQTRnQUNnQ0lCQVlJUWtnQUVGQWF5Z0NBRUd3QW1vaEFnSkFBMEFnQWlnQ0FDSUNSUTBCSUFJb0FnUWdDVWNOQUFzZ0FFR3Y1d0JCQUJBV0RCc0xJQUFRRWcwYUlBQkJPaEFzRFJvZ0FDZ0NFQ0lFUWNVQWFrRURTUTBBSUFCQlFHc2lCU2dDQUJBeUlRY2dBeUFGS0FJQUlnUW9BckFDTmdKUUlBUWdBMEhRQUdvMkFyQUNJQU5CZnpZQ1pDQURRdi8vLy84UE53SmNJQU1nQnpZQ1dDQURJQWsyQWxRZ0F5QUVLQUs4QVRZQ2FFRUFJUUlnQTBFQU5nSnNJQUFnQVVFZWRFRWZkVUVBUVFNZ0JDMEFia0VCY1J0eEVPRUJEUm9nQUNBSEVCNGdCU2dDQUNJQUlBQW9BckFDS0FJQU5nS3dBZ3djQ3dKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFSQjBBQnFEaVFERkFFbEZCUVVGQlFVRkFVRUJnY0hDQlFVQWdrVUZBd1NDeEVrRXhNVEZCUVVGQ1FBQ3lBRVFZTi9SZzBNSUFSQk8wWU5DU0FFUWZzQVJ3MFRJQUFRNGdJTkpRd21DeUFBS0FKQUtBSWdCRUFnQUVHcXpBQkJBQkFXRENVTElBQVFFZzBrUVFBaEFpQUFBbjlCQUNBQUtBSVFJZ1JCTzBZTkFCcEJBQ0FFUWYwQVJnMEFHa0VBSUFBb0FqQU5BQm9nQUJDUkFRMGxRUUVMRU9VQ0lBQVF0d0VOSkF3bUN5QUFFQklOSXlBQUtBSXdCRUFnQUVISklVRUFFQllNSkFzZ0FCQ1JBUTBqSUFCQkx4QVFJQUFRdHdGRkRTUU1Jd3NnQUJBU0RTSWdBQkNBQVJvZ0FCREFBU0FBRVBJQkRTSWdBRUhwQUVGL0VCd2hBU0FBSUFBb0FrQXRBRzVCQVhGRklnSVE0UUVOSWdKQUlBQW9BaEJCc1g5SEJFQWdBU0VFREFFTElBQkI2d0JCZnhBY0lRUWdBQkFTRFNNZ0FDQUJFQjRnQUNBQ0VPRUJEU01MSUFBZ0JCQWVEQjhMSUFCQlFHc2lCQ2dDQUJBeUlRRWdCQ2dDQUJBeUlRSWdBeUFFS0FJQUlnUW9BckFDTmdKUUlBUWdBMEhRQUdvMkFyQUNJQU5DZ0lDQWdIQTNBbUFnQXlBQk5nSmNJQU1nQWpZQ1dDQURJQWsyQWxRZ0JDZ0N2QUVoQkNBRFFRQTJBbXdnQXlBRU5nSm9JQUFRRWcwaElBQVF3QUVnQUNBQkVCNGdBQkR5QVEwaElBQkI2UUFnQWhBY0dpQUFFS0FDRFNFZ0FFSHJBQ0FCRUJ3YUlBQWdBaEFlSUFCQlFHc29BZ0FpQUNBQUtBS3dBaWdDQURZQ3NBSU1JZ3NnQUVGQWF5SUJLQUlBRURJaEFpQUJLQUlBRURJaEJDQUJLQUlBRURJaEJTQURJQUVvQWdBaUFTZ0NzQUkyQWxBZ0FTQURRZEFBYWpZQ3NBSWdBMEtBZ0lDQWNEY0NZQ0FESUFJMkFsd2dBeUFFTmdKWUlBTWdDVFlDVkNBQktBSzhBU0VCSUFOQkFEWUNiQ0FESUFFMkFtZ2dBQkFTRFNBZ0FDQUZFQjRnQUJEQUFTQUFFS0FDRFNBZ0FDQUNFQjRnQUVHOGZ4QXNEU0FnQUJEeUFRMGdJQUFvQWhCQk8wWUVRQ0FBRUJJTklRc2dBRUhxQUNBRkVCd2FJQUFnQkJBZUlBQkJRR3NvQWdBaUFDQUFLQUt3QWlnQ0FEWUNzQUlNSVFzZ0FCQVNEUjhnQUJEQUFTQURRUUEyQWhnQ1FDQUFLQUlRSWdKQldrY0VRRUVCSVFFZ0FrRW9SdzBCSUFBZ0EwRVlha0VBRUo0Qkdnd0JDeUFBS0FKQUxRQnNRUUp4UlFSQUlBQkJtVFpCQUJBV0RDRUxJQUFRRWcwZ1FRQWhBUXNnQUVFb0VDd05IMEVCSVFRZ0F5MEFHRUVCY1VVRVFDQUFLQUlBSVFvZ0FFRkFheUlDS0FJQUlnZ29BcndCSVE4Z0NCQXlJUWNnQWlnQ0FCQXlJUkFnQWlnQ0FCQXlJUkVnQWlnQ0FCQXlJUklnQUJDQUFSb2dBeUFDS0FJQUlnVW9BckFDTmdKUUlBVWdBMEhRQUdvMkFyQUNJQU5CQURZQ2JDQURRb0dBZ0lCd053SmdJQU1nQnpZQ1hDQURJQkUyQWxnZ0F5QUpOZ0pVSUFNZ0R6WUNhQ0FBUWVzQVFYOFFIQ0VNSUFJb0FnQW9Bb1FDSVFzZ0FDQVNFQjRnQUNnQ0VDRUNRVk1oQlFKQUFrQUNRQUpBSUFCQkJCQzlBdzRDQUFFa0N5QUNRVXRHSVEwZ0FrRlRSaUVFSUFRZ0FrR3pmMFp5UlNBQ1FVdEhjUTBCSUFJaEJRc2dBQkFTRFNJZ0FDZ0NFQ0lDUWZzQVJpQUNRZHNBUm5JTkVnSkFJQUpCZzM5R0JFQWdBQ2dDS0VVTkFRc2dBRUhKOXdCQkFCQVdEQ01MSUFvZ0FDZ0NJQkFZSVFZZ0FCQVNCRUFnQUNnQ0FDQUdFQk1NSXdzZ0FDQUdJQVVRb1FJRVFDQUFLQUlBSUFZUUV3d2pDeUFBUWIwQlFiMEJRYmtCSUFRYklBMGJFQkFnQUNBR0VCb2dBRUZBYXlnQ0FDQUlMd0c4QVJBWERBRUxBa0FDUUNBQUtBSVFRU0J5UWZzQVJ3MEFJQUFnQTBGQWEwRUFFSjRCSWdSQlcwY2dCRUc1ZjBkeERRQWdBRUVBUVFCQkFTQURLQUpBUVFKeFFRRVF3Z0ZCQUU0TkFRd2pDeUFBRUtNQ0RTSWdBQ0FEUWNnQWFpQURRY1FBYWlBRFFjd0FhaUFEUVR4cVFRQkJBRUc5ZnhDMUFRMGlJQUFnQXlnQ1NDQURLQUpFSUFNb0Frd2dBeWdDUEVFRVFRQVF3UUVMSUFJaEJRdEJBQ0VDREJ3TElBQkJRR3NvQWdBb0Fyd0JJUVlnQUJDQUFSb2dBQ2dDRUNJQlFUdEdEUnBCVXlFRUFrQWdBRUVFRUwwRERnSUFHU0FMSUFGQnMzOUdJQUZCVTBaeURSY2dBU0lFUVV0R0RSZ2dBRUVBRU5rRURSOGdBRUVPRUJBTUdRc2dBQkFTRFI0Q1FDQUFLQUl3RFFBZ0FDZ0NFRUdEZjBjTkFDQUFLQUlvRFFBZ0FDZ0NJQ0VIQ3lBQUtBSkFJZ0pCc0FKcUlRRWdBaWdDdkFFaEJTQUVRYjUvUmlFR0FrQURRQ0FCS0FJQUlnRUVRQ0FBSUFVZ0FTZ0NHQkNmQWlBQktBSVlJUVVDUUNBR1JRUkFJQUVvQWd3aUFrRi9SZzBCSUFkRkRRUWdBU2dDQkNBSFJ3MEJEQmtMSUFFb0FnZ2lBa0YvUmcwQUlBZEZEUU1nQVNnQ0JDQUhSZzBZQ3lBQktBSWNCSDhnQUVHREFSQVFRUU1GUVFBTElRSURRQ0FDSUFFb0FoQk9SUVJBSUFCQkRoQVFJQUpCQVdvaEFnd0JDd3NnQVNnQ0ZFRi9SZzBCSUFCQkJoQVFJQUJCN1FBZ0FTZ0NGQkFjR2lBQVFRNFFFQXdCQ3dzZ0IwVUVRQ0FFUWI1L1JnMFBJQUJCMDhrQVFRQVFGZ3dnQ3lBQVFjRHlBRUVBRUJZTUh3c2dBRUhyQUNBQ0VCd2FEQlVMSUFBUUVnMGRJQUFRd0FFZ0FCRHlBUTBkSUFBUWdBRWFJQUJCUUdzaUJDZ0NBQkF5SVFVZ0F5QUVLQUlBSWdJb0FyQUNOZ0pRSUFJZ0EwSFFBR28yQXJBQ1FYOGhBU0FEUVg4MkFtUWdBMEwvLy8vL0h6Y0NYQ0FESUFVMkFsZ2dBeUFKTmdKVUlBSW9BcndCSVFJZ0EwRUFOZ0pzSUFNZ0FqWUNhQ0FBUWZzQUVDd05IVUYvSVFjRFFBSkFBa0FDUUNBQUtBSVFJZ0pCUDJvT0FnQUJBZ3NnQVVFQVNBUi9RWDhGSUFCQjZ3QkJmeEFjQ3lFQ0lBQWdBUkFlQTBBZ0FCQVNEU0VnQUVFUkVCQWdBQkNSQVEwaElBQkJPaEFzRFNFZ0FFR3JBUkFRSUFBb0FoQkJRVVlFUUNBQVFlb0FJQUlRSENFQ0RBRUxDeUFBUWVrQVFYOFFIQ0VCSUFBZ0FoQWVEQUlMSUFBUUVnMGZJQUJCT2hBc0RSOGdCMEVBVGdSQVFaZ3RJUUlNRlFzZ0FVRUFTQVJBSUFCQjZ3QkJmeEFjSVFFTElBQkJ0Z0VRRUNBRUtBSUFRUUFRT1NBRUtBSUFLQUtFQWtFRWF5RUhEQUVMSUFKQi9RQkhCRUFnQVVFQVNBUkFRZThzSVFJTUZRc2dBRUVIRU9FQlJRMEJEQjhMQ3lBQVFmMEFFQ3dOSFFKQUlBZEJBRTRFUUNBQVFVQnJLQUlBSWdJb0FvQUNJQWRxSUFFMkFBQWdBaWdDcEFJZ0FVRVViR29nQjBFRWFqWUNCQXdCQ3lBQUlBRVFIZ3NnQUNBRkVCNGdBRUVPRUJBZ0FFRkFheWdDQUNJQklBRW9BckFDS0FJQU5nS3dBZ3dhQ3lBQUVNQUJJQUFRRWcwY0lBQkJRR3NpQkNnQ0FCQXlJUVVnQkNnQ0FCQXlJUUVnQkNnQ0FCQXlJUUlnQkNnQ0FCQXlJUWNnQUVIc0FDQUZFQndhSUFNZ0JDZ0NBQ0lHS0FLd0FqWUNVQ0FHSUFOQjBBQnFOZ0t3QWlBRFF2Ly8vLzhmTndKY0lBTkNnSUNBZ0hBM0FsUWdCaWdDdkFFaEJpQURRUUEyQW13Z0F5QUdOZ0pvSUFNZ0FqWUNaQ0FBRU9JQ0RSd2dCQ2dDQUNJRUlBUW9BckFDS0FJQU5nS3dBaUFFRU9ZQ0JFQWdBRUVPRUJBZ0FFRUdFQkFnQUVIdEFDQUNFQndhSUFCQkRoQVFJQUJCNndBZ0J4QWNHZ3NDUUFKQUFrQWdBQ2dDRUVFN2FnNENBQk1CQ3lBQUVCSU5IaUFBRUlBQkdpQUFJQVVRSGlBQUtBSVFRZnNBUmdSQUlBQkJEaEFRREJJTElBQkJLQkFzRFI0Z0FDZ0NFQ0lFUWZzQVJpQUVRZHNBUm5JTkFRSkFJQVJCZzM5R0JFQWdBQ2dDS0VVTkFRc2dBRUhlOWdCQkFCQVdEQjhMSUE0Z0FDZ0NJQkFZSVFRQ1FDQUFFQkpGQkVBZ0FDQUVRVVVRb1FKQkFFNE5BUXNnRGlBRUVCTU1Id3NnQUVHNUFSQVFJQUJCUUdzaUJTZ0NBQ0FFRURrZ0JTZ0NBQ0lFSUFRdkFid0JFQmNNRUFzZ0FFSGdIVUVBRUJZTUhRc2dBRUZUUVFCQkFVRi9RUUVRd2dGQkFFNE5EZ3djQ3lBQUVCSkZEUndNR3dzZ0FFRkFheWdDQUMwQWJrRUJjUVJBSUFCQm9OZ0FRUUFRRmd3YkN5QUFFQklOR2lBQUVQSUJEUm9nQUJDQUFSb2dBQ0FBUVVCcklnRW9BZ0JCMUFCQkFCQ2dBU0lDUVFCSURSb2dBRUh2QUJBUUlBQkIyUUFRRUNBQktBSUFJQUpCLy84RGNSQVhJQUFRd0FFZ0FCQ2dBZzBhREJjTElBRkJBWEZGRFFNZ0FVRUVjUTBLSUFBb0FqaEJBQkNEQVVFcVJnMEREQW9MSUFBb0FpaEZEUUVMSUFBUTRnRU1Gd3RCVXlFRUFrQWdBQ0FCRUwwRERnSUFGUmNMSUFCQmhRRVFTa1VOQkNBQUtBSTRRUUVRZ3dGQlIwY05CQ0FCUVFSeERRY0xJQUJCbXlOQkFCQVdEQlVMSUFGQkJIRkZCRUFnQUVIZklrRUFFQllNRlF0QmZ5RUJRUUFoQWlBQVFRQkJBQkR0QWtVTkZnd1hDeUFBRUJJTkV5QUFFTGNCUlEwVURCTUxJQU1nQUNnQ0FDZ0NFQ0FEUWRBQWFpQUFLQUlnRUpBQk5nSVFJQUJCZ0QwZ0EwRVFhaEFXREJJTElBQVFrUUVORVFKQUlBQkJRR3NpQVNnQ0FDZ0NwQUZCQUU0RVFDQUFRZGtBRUJBZ0FTZ0NBQ0lCSUFFdkFhUUJFQmNNQVFzZ0FFRU9FQkFMSUFBUXR3RkZEUklNRVFzZ0FFSHIyUUJCQUJBV0RCQUxRUUVoQWlBQUlBVkJBRUVCUVg5QkFCRENBVUVBVGcwTERBOExRUUFoQWlBQVFRRkJBQ0FBS0FJWUlBQW9BaFFReEFFTkRnd1FDeUFBUVNrUUxBME5DeUFBUWV3QUlBRVFIQm9nQUJDQUFSb2dBeUFBUVVCcklnUW9BZ0FpQlNnQ3NBSTJBbEFnQlNBRFFkQUFhallDc0FJZ0EwTC8vLy8vSHpjQ1hDQURRb0NBZ0lCd053SlVJQVVvQXJ3QklRVWdBMEVBTmdKc0lBTWdCVFlDYUNBRElBSTJBbVFnQUJEaUFnME1JQVFvQWdBaUJTQUZLQUt3QWlnQ0FEWUNzQUlnQUJEekFTQUFFUE1CSUFRb0FnQVE1Z0lFUUNBQVFRNFFFQ0FBUVFZUUVDQUFRZTBBSUFJUUhCb2dBRUVPRUJBZ0FFSHJBQ0FIRUJ3YUN5QUJJUVVMSUFBZ0JSQWVJQUJCN1FBZ0FoQWNHaUFBUVM4UUVDQUFJQUlRSGlBQUtBSVFRVVpHQkVBZ0FCQVNEUXdnQXlBQVFVQnJLQUlBSWdJb0FyQUNOZ0pRSUFJZ0EwSFFBR28yQXJBQ0lBTkJmellDWkNBRFF2Ly8vLzh2TndKY0lBTkNnSUNBZ0hBM0FsUWdBaWdDdkFFaEJFRUFJUUVnQTBFQU5nSnNJQU1nQkRZQ2FDQUNLQUtrQVVFQVRnUkFJQUFvQWdBZ0FrSFJBQkJQSWdGQkFFZ05EU0FBUWRnQUVCQWdBRUZBYXlJQ0tBSUFJZ1FnQkM4QnBBRVFGeUFBUWRrQUVCQWdBaWdDQUNBQlFmLy9BM0VRRnlBQUVNQUJDeUFBRU9JQ0RRd2dBRUZBYXlJRUtBSUFJZ0lvQXFRQlFRQk9CRUFnQUVIWUFCQVFJQVFvQWdBZ0FVSC8vd054RUJjZ0FFSFpBQkFRSUFRb0FnQWlBU0FCTHdHa0FSQVhJQVFvQWdBaEFnc2dBaUFDS0FLd0FpZ0NBRFlDc0FJTElBQkI3Z0FRRUNBQUlBY1FIZ3dNQ3lBQUlBSkJBQkFXREFvTElBQkI2d0FnQWhBY0dpQUFFQklOQ1FzZ0FCQzNBVVVOQ1F3SUN5QUJJUVFMSUFBUUVnMEdJQUJCQUNBRVFRQVF6QU1OQmdzZ0FDQUFRVUJyS0FJQUtBSzhBU0FHRUo4Q0N5QUFRVHNRTEEwRUlBQkJRR3NpQWlnQ0FCQXlJUVVnQWlnQ0FCQXlJUVFnQWlnQ0FCQXlJUUVnQWlnQ0FCQXlJUWNnQXlBQ0tBSUFJZ0lvQXJBQ05nSWNJQUlnQTBFY2FqWUNzQUlnQTBLQWdJQ0FjRGNDTENBRElBUTJBaWdnQXlBSE5nSWtJQU1nQ1RZQ0lDQUNLQUs4QVNFQ0lBTkJBRFlDT0NBRElBSTJBalFnQVNFQ0lBQW9BaEJCTzBjRVFDQUFJQVVRSGlBQUVKRUJEUVVnQUVIcEFDQUhFQndhSUFVaEFnc2dBRUU3RUN3TkJBSkFJQUFvQWhCQktVWUVRQ0FESUFJMkFpaEJBQ0VGSUFJaEJBd0JDeUFBUWVzQUlBRVFIQm9nQUVGQWF5Z0NBQ2dDaEFJaEJTQUFJQVFRSGlBQUVKRUJEUVVnQUVFT0VCQWdBU0FDUmcwQUlBQkI2d0FnQWhBY0dnc2dBRUVwRUN3TkJDQUFRVUJySWdnb0FnQW9Bb1FDSVFzZ0FDQUJFQjRnQUJDZ0FnMEVJQUFnQ0NnQ0FDZ0N2QUVnQmhDZkFnSkFJQUVnQWtZZ0FpQUVSbkpGQkVBZ0FFRkFheUlHS0FJQUlnRkJnQUpxSWdnZ0FTZ0NoQUlpQ2lBTElBVnJJZ0pxRU1ZQkdpQUlJQUVvQW9BQ0lBVnFJQUlRY2lBQktBS0FBaUFGYWtHekFTQUNFQ3NhSUFZb0FnQWlBaUFCS0FLRUFrRUZhellDbUFJZ0JDQUNLQUtzQWlJQklBRWdCRWdiSVFZZ0NpQUZheUVJQTBBZ0JDQUdSZzBDSUFJb0FxUUNJQVJCRkd4cUlnb29BZ1FpQVNBRlNDQUJJQXRPY2tVRVFDQUtJQUVnQ0dvMkFnUUxJQVJCQVdvaEJBd0FDd0FMSUFCQjZ3QWdCQkFjR2dzZ0FDQUhFQjRnQUVGQWF5Z0NBQ0lCSUFFb0FyQUNLQUlBTmdLd0Fnd0JDeUFBUWVzQUlCQVFIQm9nQUVGQWF5Z0NBQ2dDaEFJaERTQUFJQXdRSGdKQUlBQW9BaEFpREVFOVJ3MEFBa0FnQUJBU1JRUkFJQUJCQUJDMkFVVU5BUXNnQ2lBR0VCTU1CUXNnQmtVTkFDQUFRYmtCRUJBZ0FDQUdFQm9nQUVGQWF5Z0NBQ0FJTHdHOEFSQVhDeUFLSUFZUUV3SkFBa0FDUUNBQVFjTUFFRW9pQkFSQUlBTkJBVFlDYkNBRElBTW9BbUJCQW1vMkFtQkJxZDBBSVFZZ0RFRTlSZzBCREFNTElBQW9BaEJCdVg5SERRRWdBVVVFUUNBQVFmYVhBVUVBRUJZTUJ3c2dERUU5UncwQ1FjVFFBQ0VHSUFWQnMzOUhEUUFnQ0MwQWJrRUJjVVVnQWtGL2MzRU5BZ3NnQXlBR05nSUFJQUJCL2NBQUlBTVFGZ3dGQ3lBQVFkWE9BRUVBRUJZTUJBc2dBQkFTRFFNQ1FDQUVCRUFnQUJCV1JRMEJEQVVMSUFBUWtRRU5CQXNnQUNBQVFVQnJJZ1VvQWdBb0Fyd0JJQThRbndJZ0FFSDlBRUgrQUNBQkcwSDhBQ0FFR3hBUUlBQkI2d0FnQnhBY0dpQUFRU2tRTEEwRElBVW9BZ0FpQWtHQUFtb2lDQ0FDS0FLRUFpSUtJQTBnQzJzaUJtb1F4Z0VhSUFnZ0FpZ0NnQUlnQzJvZ0JoQnlJQUlvQW9BQ0lBdHFRYk1CSUFZUUt4b2dCU2dDQUNJRklBSW9Bb1FDUVFWck5nS1lBaUFISUFVb0Fxd0NJZ0lnQWlBSFNCc2hDQ0FLSUF0cklRb2dCeUVDQTBBZ0FpQUlSd1JBSUFVb0FxUUNJQUpCRkd4cUlnd29BZ1FpQmlBTFNDQUdJQTFPY2tVRVFDQU1JQVlnQ21vMkFnUUxJQUpCQVdvaEFnd0JDd3NnQUNBUUVCNGdBQkNnQWcwRElBQWdBRUZBYXlnQ0FDZ0N2QUVnRHhDZkFpQUFJQWNRSGdKL0lBUUVRQ0FCUlFSQUlBQkJGQkFRSUFCQkRoQVFJQUJCSkJBUUlBQkJRR3NvQWdCQkFCQVhJQUJCaXdFUUVDQUFRWUlCRUJCQmd3RU1BZ3NnQUVHQUFSQVFJQUJCUUdzb0FnQkJBQkJrUVlNQkRBRUxJQUJCL3dBUUVFRU9DeUVDSUFCQjZRQWdFaEFjR2lBQVFRNFFFQ0FBSUJFUUhpQUFJQUlRRUNBQVFVQnJLQUlBSWdFZ0FTZ0NzQUlvQWdBMkFyQUNDeUFBRVBNQkRBTUxJQUZCQkhFTkFDQUFRZG9qUVFBUUZnd0JDeUFBRUJJTkFFRUFJUUlnQUVFQklBUkJBQkRNQXcwQUlBQVF0d0ZGRFFJTFFYOGhBZ3dCQzBFQUlRSUxJQTRnQ1JBVElBSWhBUXNnQTBHUUFXb2tBQ0FCQ3pvQkFYOGpBRUhRQUdzaUFTUUFJQUVnQUNnQ0FDZ0NFQ0FCUVJCcUlBQW9BaUFRa0FFMkFnQWdBRUdzeFFBZ0FSQVdJQUZCMEFCcUpBQUxqZ0lCQVg0Q1FBSkFBa0FDUUNBQlF2Ly8vLzl2V0EwQUlBQWdBVUU4SUFGQkFCQVVJZ0ZDZ0lDQWdIQ0RJZ05DZ0lDQWdPQUFVUVJBSUFFUEN5QURRb0NBZ0lBd1VRUkFJQUpDSUlpblFYVkpEUU1NQkFzZ0FVTC8vLy8vYjFnRVFDQUFJQUVRRHd3QkN5QUFJQUZCMmdFZ0FVRUFFQlFoQXlBQUlBRVFEd0pBQWtBZ0EwS0FnSUNBY0lNaUFVS0FnSUNBSUZJRVFDQUJRb0NBZ0lEZ0FGRU5BaUFCUW9DQWdJQXdVZzBCQ3lBQ1FpQ0lwMEYxU1EwRURBVUxJQU5DZ0lDQWdIQmFCRUFnQTZjdEFBVkJFSEVOQVFzZ0FDQURFQThnQUVHaVBrRUFFQlVNQWdzZ0F3OExJQUFRSkF0Q2dJQ0FnT0FBSVFJTElBSVBDeUFDcHlJQUlBQW9BZ0JCQVdvMkFnQWdBZ3NTQUNBQUlBRWdBaUFESUFSQnh3QVFwQVFMRFFBZ0FDQUJJQUpCQUJDVkJBdnNCQU1DZmdGOEEzOGpBRUVRYXlJSEpBQUNRQUpBQWtBQ1FBSitBa0FDUUFKQUFrQWdBVUVJYXlJR0tRTUFJZ1JDSUlpblFRZHJRVzVKRFFBQ1FDQUVRb0NBZ0lCd1ZBMEFJQUFnQjBFSWFpQUVJQUlRd2dVaUFVRUFTQVJBUVg4aEFRd0tDeUFCUlEwQUlBQWdCQkFQUVFBaEFTQUhLUU1JSVFNTUNBdEJmeUVCUW9DQWdJQXdJUU1nQUNBRUVHd2lCRUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEhBa0FDUUFKQUFrQWdCRUlnaUtjaUNFRUxhZzREQXdFQ0FBc2dDQTBESUFURUlRTUNRQUpBQWtBZ0FrR01BV3NPQkFBQ0FRRUhDeUFFUWlDR1VBUkFRUUFoQVVLQWdJQ0F3UDcvQXlFRERBMExRZ0FnQTMwaEF3d0JDeUFESUFKQkFYUkJuUUpyckh3aEF3c2dBMEwvLy8vL0Q0TWdBMEtBZ0lDQUNIeEMvLy8vL3c5WURRY2FRb0NBZ0lEQWZpQUR1YjBpQTBLQWdJQ0F3SUdBL1A4QWZTQURRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3d0hDeUFBS0FJUUlRRU1Cd3NnQUNBR0lBSWdCQ0FBS0FJUUtBSzRBaEViQUVVTkJ3d0lDeUFBSUFZZ0FpQUVJQUFvQWhBb0F0UUNFUnNBRFFjTUJnc2dBQ2dDRUNJQktBS01BU0lJQkVBZ0NDMEFLRUVFY1EwRkN5QUVRb0NBZ0lEQWdZRDgvd0I4dnlFRkFrQWdBa0dNQVdzT0JBQURBZ0lCQ3lBRm1pRUZEQUlMRUFFQUN5QUNRUUYwUVowQ2E3Y2dCYUFoQlF0Q2dJQ0FnTUIrSUFXOUlnTkNnSUNBZ01DQmdQei9BSDBnQTBMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMSVFOQkFDRUJEQUlMSUFBZ0JpQUNJQVFnQVNnQ25BSVJHd0JGRFFCQmZ5RUJRb0NBZ0lBd0lRTU1BUXRCQUNFQkRBRUxJQVlnQXpjREFBc2dCMEVRYWlRQUlBRUxuZ01DQTM0QmZ3SkFBa0FnQWdSQUlBQWdBVUhjQVNBQlFRQVFGQ0lEUW9DQWdJQndneUlFUW9DQWdJQWdVZ1JBSUFSQ2dJQ0FnT0FBVVEwRElBUkNnSUNBZ0RCU0RRSUxJQUFnQVVIUkFTQUJRUUFRRkNJRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJZ0FDQUJJQU1RK2dNaEJDQUFJQU1RRHlBRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0JBOExRb0NBZ0lEZ0FDRURBa0FnQUNBRVFlb0FJQVJCQUJBVUlnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFRVGNRZGlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUZFQThNQVFzZ0FFRVFFRjhpQWtVRVFDQUFJQUVRRHlBQUlBVVFEd3dCQ3lBRVFpQ0lwMEYxVHdSQUlBU25JZ1lnQmlnQ0FFRUJhallDQUFzZ0FpQUZOd01JSUFJZ0JEY0RBQ0FCUW9DQWdJQndXZ1JBSUFHbklBSTJBaUFMSUFFaEF3c2dBQ0FFRUE4Z0F3OExJQUFnQVVIUkFTQUJRUUFRRkNJRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFTElBQWdBeEE0UlFSQUlBQWdBeEFQSUFCQi91a0FRUUFRRlVLQWdJQ0E0QUFQQ3lBQUlBRWdBeEQ2QXlFQklBQWdBeEFQSUFFaEF3c2dBd3YvQWdJRGZ3SitJd0JCRUdzaUF5UUFBa0FDUUNBQlFvQ0FnSUJ3V2dSQUlBR25JZ0l2QVFaQk1FWUVRQUpBSUFBZ0EwRUlhaUFCUWQ4QUVJRUJJZ0pGRFFBZ0F5a0RDQ0lCUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FBSUFJcEF3QVE2QUVoQVF3RkN5QUFJQUVnQWlrRENFRUJJQUlRTHlJRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFNQ1FBSkFJQVZDSUlpblFRRnFEZ1FBQVFFQUFRc2dBQ0FDS1FNQUVKa0JJZ1JCQUVnRVFDQUFJQVVRRHd3Q0N5QUVEUVJDZ0lDQWdPQUFJUUVnQUNBQ0tRTUFFT2dCSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUlBVVFEd3dHQ3lBQUlBWVFEeUFHcHlBRnAwWU5CQXNnQUNBRkVBOGdBRUdFNUFCQkFCQVZDMEtBZ0lDQTRBQWhBUXdEQ3lBQ0tBSVFLQUlzSWdCRkJFQkNnSUNBZ0NBaEFRd0RDeUFBSUFBb0FnQkJBV28yQWdBZ0FLMUNnSUNBZ0hDRUlRRU1BZ3NnQUNBQkVJMEVJZ0ZDSUlpblFYVkpEUUVnQWFjaUFDQUFLQUlBUVFGcU5nSUFEQUVMSUFVaEFRc2dBMEVRYWlRQUlBRUxDd0FnQUVHTklrRUFFRVlMR2dBZ0FDZ0NFQ0FCSUFJUTd3UWlBVVVFUUNBQUVId0xJQUVMZ0FFQkFuOENRQUpBSUFGRkRRQWdBU2dDQUNJQ1FRQk1EUUVnQVNBQ1FRRnJJZ0kyQWdBZ0FnMEFJQUV0QUFWQkFYRUVRQ0FBSUFFcEF4Z1FJd3NnQVNnQ0NDSUNJQUVvQWd3aUF6WUNCQ0FESUFJMkFnQWdBVUlBTndJSUlBQkJFR29nQVNBQUtBSUVFUUFBQ3c4TFFkYU5BVUd1L0FCQjlDaEI2dDBBRUFBQUN4SUFJQUZCM2dGT0JFQWdBQ0FCRU9nRkN3dmJBUUlCZndKK1FRRWhCQUpBSUFCQ0FGSWdBVUwvLy8vLy8vLy8vLzhBZ3lJRlFvQ0FnSUNBZ01ELy93QldJQVZDZ0lDQWdJQ0F3UC8vQUZFYkRRQWdBa0lBVWlBRFF2Ly8vLy8vLy8vLy93Q0RJZ1pDZ0lDQWdJQ0F3UC8vQUZZZ0JrS0FnSUNBZ0lEQS8vOEFVUnNOQUNBQUlBS0VJQVVnQm9TRVVBUkFRUUFQQ3lBQklBT0RRZ0JaQkVCQmZ5RUVJQUFnQWxRZ0FTQURVeUFCSUFOUkd3MEJJQUFnQW9VZ0FTQURoWVJDQUZJUEMwRi9JUVFnQUNBQ1ZpQUJJQU5WSUFFZ0ExRWJEUUFnQUNBQ2hTQUJJQU9GaEVJQVVpRUVDeUFFQ3kwQkFYOUJBU0VCQWtBQ1FBSkFJQUJCRFdzT0JBSUJBUUlBQ3lBQVFUUkdEUUVMSUFCQk9FWWhBUXNnQVFzZkFDQUFJQUVnQUNBQ0VLb0JJZ0lnQXlBRUVCa2hCQ0FBSUFJUUV5QUVDMFFCQVg5QmZ5RURJQUFnQUNnQ0JDQUNhaERHQVFSL1FYOEZJQUFvQWdBZ0FXb2lBeUFDYWlBRElBQW9BZ1FnQVdzUW5BRWdBQ0FBS0FJRUlBSnFOZ0lFUVFBTEM0NEJBUUYvSUFBZ0JrRU1FRWtpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBSUFBZ0FDZ0NBRUVCYWpZQ0FDQUdweUlISUFVN0FTb2dCeUFFT2dBcElBY2dBem9BS0NBSElBRTJBaVFnQnlBQU5nSWdJQWNnQnkwQUJVSHZBWEVnQkVFQ2EwRUVTVUVFZEhJNkFBVWdBQ0FHSUFBZ0FrSE1uZ0VnQWhzUXFnRWlBU0FERUpZRElBQWdBUkFUQ3lBR0N5a0JBWDlCZnlFQkFrQWdBRUVvRUN3TkFDQUFFSkVCRFFCQmYwRUFJQUJCS1JBc0d5RUJDeUFCQzRJQkFRTi9JQUJCUUdzaUF5Z0NBQ0lCQkVBZ0FTZ0N2QUVoQWlBQVFiVUJFQkFnQXlnQ0FDQUNRZi8vQTNFUUZ5QUJJQUVvQXN3QklnTWdBa0VEZEdvb0FnQWlBRFlDdkFFRFFBSkFJQUJCQUVnRVFFRi9JUUFNQVFzZ0F5QUFRUU4wYWlJQ0tBSUVJZ0JCQUU0TkFDQUNLQUlBSVFBTUFRc0xJQUVnQURZQ3dBRUxDMGNCQW44Z0FDZ0NmQ0VDQWtBRFFDQUNRUUJLQkVBZ0FDZ0NkQ0FDUVFGcklnSkJCSFJxSWdNb0FnQWdBVWNOQVNBREtBSUVEUUVNQWdzTElBQWdBUkRnQkNFQ0N5QUNDN1lCQVFKL0FrQWdBaUFCS0FJRUlncEdCRUFnQXlFTERBRUxJQUFnQ2lBQ0lBTWdCQ0FGSUFZZ0J5QUlJQWtROVFFaUJVRUFUZzBBUVg4UEMwRUFJUUlnQVNnQ3dBSWlBMEVBSUFOQkFFb2JJUU1DUUFOQUlBSWdBMGNFUUFKQUlBVWdBU2dDeUFJZ0FrRURkR29pQ2k4QkFrY05BQ0FLTFFBQUlncEJBWFpCQVhFZ0JFY05BQ0FMSUFwQkFYRkdEUU1MSUFKQkFXb2hBZ3dCQ3dzZ0FDQUJJQXNnQkNBRklBWWdCeUFJSUFrUXlRTWhBZ3NnQWdzMUFRRi9JQUFvQWdBaUFRUkFJQUFvQWhRZ0FVRUFJQUFvQWhBUkFRQWFDeUFBUWdBM0FnQWdBRUlBTndJUUlBQkNBRGNDQ0F2RUFRRUNmeU1BUWRBQWF5SUZKQUFnQUNnQ0FDRUdBa0FnQVNBREVLMEZCRUFnQlNBR0tBSVFJQVZCRUdvZ0F4Q1FBVFlDQUNBQVFlU1ZBU0FGRUJaQkFDRUFEQUVMUVFBaEFDQUdJQUZCSEdwQkZDQUJRU1JxSUFFb0FpQkJBV29RZUEwQUlBRWdBU2dDSUNJQVFRRnFOZ0lnSUFFb0Fod2dBRUVVYkdvaUFFSUFOd0lBSUFCQkVHcEJBRFlDQUNBQVFRaHFRZ0EzQWdBZ0FDQUdJQUlRR0RZQ0RDQUdJQU1RR0NFQklBQWdCRFlDQ0NBQUlBRTJBaEFMSUFWQjBBQnFKQUFnQUF2M0ZnRU1meU1BUVJCckloQWtBQ0FBUVVCcktBSUFJUWdnQUNnQ0FDRUxBa0FDUUFKQUlBRkJBa3NOQUFKQUlBSU5BRUVBSVFJZ0FFR0ZBUkJLUlEwQUlBQW9BamhCQVJDREFVRUtSZzBBUVg4aEJ5QUFFQklOQTBFQ0lRSUxRWDhoQnlBQUVCSU5BaUFBS0FJUUlnbEJLa1lFUUNBQUVCSU5BeUFBS0FJUUlRa2dBa0VCY2lFQ0N3SkFBa0FDUUFKQUFrQWdDVUVuYWc0Q0FRSUFDeUFKUVlOL1J3MERBa0FnQUNnQ0tBMEFJQUZCQWtjaURDQUNRUUZ4UlhKRklBQW9BaUFpQ1VFdFJuRU5BQ0FNSUFKQkFuRkZjaUFKUVM1SGNnMERDeUFBRU9JQkRBWUxJQUZCQWtjTkFpQUlMUUJ1UVFGeFJRMEJEQUlMSUFGQkFrY05BU0FBS0FKRURRRUxJQXNnQUNnQ0lCQVlJUXdnQUJBU1JRMEJEQUlMSUFGQkFrWWdCVUVDUm5JTkFDQUFRYkwzQUVFQUVCWU1BZ3NDUUFKQUFrQWdDQ2dDSUNJSFJTQUJRUUZMY2cwQUlBZ29BaVJCQVVjTkFDQUlJQXdRb2dJaUNVVU5BQ0FKS0FJSUlBZ29BcndCUncwQUlBQkJwKzRBUVFBUUZnd0JDMEYvSVJFQ1FDQUJRUUZIQkVBTUFRc0NRQ0FDRFFBZ0NDMEFia0VCY1EwQUlBZ2dEQ0FJS0FMQUFVRUFFTUVEUVFCT0RRQWdDQ0FNRVBRQlFZQ0FnSUI2Y1VHQWdJQ0FBa1lOQUNBTVFjMEFSZ1JBSUFnb0FrZ05BUXRCQVNFUEN3SkFJQWRGRFFBZ0NDZ0NKRUVCU3cwQUlBZ29BcndCSWdjZ0NDZ0M4QUZIRFFBZ0NDQU1FS0lDSWdsRkRRRWdDU2dDQ0NBSFJ3MEJJQUJCNDhRQVFRQVFGZ3dDQzBGL0lRY2dBQ0FJSUF4QkJFRURJQUliRUtBQkloRkJBRWdOQXdzZ0N5QUlRUUFnQVVFQlN5QUFLQUlNSUFRUTZBTWlCQTBCQ3lBTElBd1FFMEYvSVFjTUFnc2dCZ1JBSUFZZ0JEWUNBQXNnQUVGQWF5QUVOZ0lBSUFRZ0FrVWdBVUVEU1hFMkFqUWdCQ0FNTmdKd0lBUWdBVUVJUmlJSE5nSmdJQVFnQVVFRFJ5SU5OZ0pNSUFRZ0RUWUNTQ0FFSUFjZ0FVRjhjVUVFUm5JaUNUWUNNRUVCSVFoQkFTRUtJQTFGQkVBZ0JDZ0NCQ0lJS0FKY0lRb2dDQ2dDV0NFSklBZ29BbFFoQnlBSUtBSlFJUWdMSUFRZ0NqWUNYQ0FFSUFrMkFsZ2dCQ0FITmdKVUlBUWdDRFlDVUNBRUlBSkIvd0Z4SUFGQkNIUnlPd0ZzQWtBQ1FBSkFBa0FDUUNBQlFRZHJRUUZOQkVBZ0FFRXJFQkFnQVVFSFJnUkFJQUFRd0FNTElBUkNBVGNDT0NBRVFUeHFJUWtnQkVFNGFpRUlEQUVMSUFSQ0FUY0NPQ0FFUVR4cUlRa2dCRUU0YWlFSUlBRkJBMGNOQUNBQUtBSVFRWU4vUncwQUlBQW9BaWdOQXlBTElBUWdBQ2dDSUJDL0EwRUFTQTBFSUFSQkFUWUNqQUVNQVFzQ1FDQUFLQUlRUVNoR0JFQWdBQ0FRUVF4cVFRQVFuZ0VhSUJBdEFBeEJCSEVFUUNBSlFRRTJBZ0FMSUFBUUVrVU5BUXdGQ3lBQVFTZ1FMQTBFQ3lBSktBSUFCRUJCZnlFSElBUkJmellDdkFFZ0FCQ0FBVUVBU0EwR0N5QUFRVUJySVExQkFDRUtBa0FEUUNBQUtBSVFJZ2RCS1VZTkFTQUhRYWQvUnlJT1JRUkFJQWhCQURZQ0FDQUFFQklOQmlBQUtBSVFJUWNMQWtBQ1FBSkFBa0FnQjBHRGYwY0VRQ0FIUWZzQVJ5QUhRZHNBUjNFTkJDQUlRUUEyQWdBQ1FDQU9SUVJBSUFCQkRSQVFJQVFvQW9nQklRY01BUXNnQ3lBRVFRQVF2d01oQnlBQVFkc0FFQkFMSUEwb0FnQWdCMEgvL3dOeEVCY2dBRUZUUWJOL0lBa29BZ0FiUVFGQkFVRi9RUUVRd2dFaUIwRUFTQTBLSUFjZ0NuSWhCMEVCSVFvZ0IwVUVRQ0FFSUFRb0Fvd0JRUUZxTmdLTUFVRUFJUW9MSUE1RkRRRU1Bd3NnQUNnQ0tBMElJQUFvQWlBaUIwRXRSZ1JBSUFRdEFHeEJBVVlOQ1FzZ0NTZ0NBQVJBSUFBZ0JDQUhRUUVRb0FGQkFFZ05DZ3NnQ3lBRUlBY1F2d01pRWtFQVNBMEpJQUFRRWcwSklBNE5BU0FBUVEwUUVDQUFRVUJySWdvb0FnQWdFa0gvL3dOeElnMFFGeUFKS0FJQUJFQWdBRUVSRUJBZ0FFRzlBUkFRSUFBZ0J4QWFJQW9vQWdBZ0JDOEJ2QUVRRndzZ0FFSGNBQkFRSUFvb0FnQWdEUkFYSUFoQkFEWUNBQXNnQUNnQ0VFRXBSZzBFSUFCQktSQXNHZ3dJQ3dKQUlBQW9BaEJCUFVZRVFDQUlRUUEyQWdBZ0FCQVNEUWtnRFNnQ0FCQXlJUW9nQUVIYkFCQVFJQTBvQWdBZ0VrSC8vd054SWc0UUZ5QUFRUkVRRUNBQVFRWVFFQ0FBUWFzQkVCQWdBRUhwQUNBS0VCd2FJQUJCRGhBUUlBQVFWZzBKSUFBZ0J4Q2hBU0FBUVJFUUVDQUFRZHdBRUJBZ0RTZ0NBQ0FPRUJjZ0FDQUtFQjVCQVNFS0RBRUxJQXBGQkVBZ0JDQUVLQUtNQVVFQmFqWUNqQUVMSUFrb0FnQkZEUUVnQUVIYkFCQVFJQTBvQWdBZ0VrSC8vd054RUJjTElBQkJ2UUVRRUNBQUlBY1FHaUFOS0FJQUlBUXZBYndCRUJjTElBQW9BaEJCS1VZTkFpQUFRU3dRTEVVTkFRd0dDd3NnQUVIWndnQkJBQkFXREFRTEFrQUNRQ0FCUVFSckRnSUJBQUlMSUFRb0FvZ0JRUUZHRFFFTUFnc2dCQ2dDaUFFTkFRc2dDU2dDQUFSQUlBUW9Bc3dCSUFRb0Fyd0JRUU4wYWtFRWFpRUhJQUJCUUdzaENBTkFBa0FnQnlnQ0FDSUpRUUJJRFFBZ0JDZ0NkQ0lISUFsQkJIUWlDV29pQ2lnQ0JDQUVLQUs4QVVjTkFDQUVJQW9vQWdBaUNoRDBBVUVBU0FSQUlBc2dCQ0FLRUU5QkFFZ05CaUFFS0FKMElRY2dBRUc0QVJBUUlBQWdCeUFKYWlJS0tBSUFFQm9nQ0NnQ0FDQUVMd0c4QVJBWElBQkJ1UUVRRUNBQUlBb29BZ0FRR2lBSUtBSUFRUUFRRndzZ0J5QUpha0VJYWlFSERBRUxDeUFBUWJVQkVCQWdBRUZBYXlnQ0FDQUVMd0c4QVJBWElBUkJBRFlDdkFFZ0JDQUVLQUxNQVNnQ0JEWUN3QUVMSUFBUUVnMENJQUpCZlhGQkFVWUVRQ0FBUVljQkVCQUxJQVJCQVRZQ1pDQUFFSUFCR2lBRUlBUW9BcndCTmdMd0FRSkFBa0FnQUNnQ0VFR21mMGNOQUNBQUVCSU5CQ0FBS0FJUVFmc0FSZzBBSUFBZ0JDQU1FTnNFRFFRZ0FCQldEUVFnQUVFdVFTZ2dBaHNRRUNBRUxRQnVRUUp4RFFFZ0JDQUFLQUkwSUFOcklnSTJBcEFESUFRZ0N5QURJQUlRZ1FNaUFqWUNqQU1nQWcwQkRBUUxJQUJCK3dBUUxBMERJQUFRblFVTkF5QUFJQVFnREJEYkJBMERBMEFnQUNnQ0VFSDlBRWNFUUNBQUVKd0ZSUTBCREFVTEN5QUVMUUJ1UVFKeFJRUkFJQVFnQUNnQ09DQURheUlDTmdLUUF5QUVJQXNnQXlBQ0VJRURJZ0kyQW93RElBSkZEUVFMSUFBUUVnMERJQUJCUUdzb0FnQVE1Z0pGRFFBZ0FFRUFFT1VDQ3lBQVFVQnJJQVFvQWdRaUF6WUNBQ0FFS0FKd0lRSWdCQ0FBS0FJQUlBTkNnSUNBZ0NBUXZnTWlBellDQ0NBQlFRSlBCRUJCQUNFSElBRkJDV3RCZlVzTkJTQUFRUU1RRUNBQVFVQnJJZ0VvQWdBZ0F4QTVJQUlOQlNBQVFjMEFFQkFnQVNnQ0FFRUFFRGtNQlFzZ0FVRUJSZ1JBSUFCQkF4QVFJQUJCUUdzaUFTZ0NBQ0FERURrZ0R3UkFBa0FnQVNnQ0FDSUJLQUlvQkVBZ0N5QUJJQUlRNUFJaUFVVU5CaUFCUVFBMkFnZ2dBU0FCTFFBRVFmNEJjU0FBUVVCcktBSUFMUUJ1UVFGeGNqb0FCQXdCQ3lBQklBSVE5QUZCQUU0TkFDQUxJQUVnQWhCUFFRQklEUVVMSUFCQkVSQVFJQUJCdVFFUUVDQUFJQUlRR2lBQVFVQnJLQUlBUVFBUUZ3dEJBQ0VISUJGQkFFNEVRQ0FBUVVCcktBSUFLQUowSUJGQkJIUnFJZ0VnQVNnQ0RFSC9nSUNBZUhFZ0EwRUhkRUdBLy8vL0IzRnlOZ0lNSUFCQkRoQVFEQVlMSUFCQnZRRVFFQ0FBSUFJUUdpQUFRVUJyS0FJQUlnQWdBQzhCdkFFUUZ3d0ZDd0pBQWtBZ0FFRkFheWdDQUNJQktBSW9SUVJBSUFBZ0FTQUNRUVlRb0FFaUFVRUFTQTBGSUFCQlFHc29BZ0FoQUNBQlFZQ0FnSUFDY1FSQUlBQW9Bb0FCSUFGQkJIUnFJZ0FnQUNnQ0RFSC9nSUNBZUhFZ0EwRUhkRUdBLy8vL0IzRnlOZ0lNREFJTElBQW9BblFnQVVFRWRHb2lBQ0FBS0FJTVFmK0FnSUI0Y1NBRFFRZDBRWUQvLy84SGNYSTJBZ3dNQVFzZ0N5QUJJQUpCL0FBZ0Foc2lBUkRrQWlJQ1JRMEVJQUlnQXpZQ0FDQUZEUUVMUVFBaEJ3d0ZDMEVBSVFjZ0FDQUFRVUJyS0FJQUtBS1VBeUFCUVJZZ0FTQUZRUUZIRzBFQUVQY0JEUVFNQWdzZ0FFR0R3Z0JCQUJBV0RBRUxJQUFRNGdFTElBQkJRR3NnQkNnQ0JEWUNBQ0FMSUFRUS9RSkJmeUVISUFaRkRRRWdCa0VBTmdJQURBRUxJQXNnREJBVEN5QVFRUkJxSkFBZ0J3dmxCQUVHZnlBQUtBSUFJZ1JCQVdvaEFrRUlJUU1DUUFKQUFrQWdCQzBBQUNJR1FUQnJJZ2RCQ0U4RVFFRitJUVVDUUFKQUFrQUNRQUpBQWtBZ0JrSHVBR3NPQ3dFSkNRa0NDUU1GQkFrRkFBc0NRQ0FHUWVJQWF3NEZDQWtKQ1FBSkMwRU1JUU1NQnd0QkNpRUREQVlMUVEwaEF3d0ZDMEVKSVFNTUJBdEJDeUVEREFNTEFrQWdBVVVOQUNBQ0xRQUFRZnNBUncwQUlBUkJBbW9oQWlBRUxRQUNJUVJCQUNFREEwQWdBaUVCUVg4aEJTQUVFTFlFSWdKQkFFZ05CU0FDSUFOQkJIUnlJZ05CLy8vREFFc05CU0FCUVFGcUlnSXRBQUFpQkVIOUFFY05BQXNnQVVFQ2FpRUNEQU1MSUFSQkFrRUVJQVpCK0FCR0d5SUhha0VCYWlFRVFRQWhBMEVBSVFVRFFDQUZJQWRIQkVBZ0FpMEFBQkMyQkNJR1FRQklCRUJCZnc4RklBVkJBV29oQlNBQ1FRRnFJUUlnQmlBRFFRUjBjaUVEREFJTEFBc0xJQUZCQWtjZ0EwR0FlSEZCZ0xBRFIzSU5BU0FFTFFBQVFkd0FSdzBCSUFRdEFBRkI5UUJIRFFGQkFDRUNRUUFoQlFOQUFrQWdBa0VFUmcwQUlBSWdCR290QUFJUXRnUWlBVUVBU0EwQUlBSkJBV29oQWlBQklBVkJCSFJ5SVFVTUFRc0xJQUpCQkVjZ0JVR0F1QU5KY2lBRlFmKy9BMHR5RFFFZ0EwRUtkRUdBK0Q5eElBVkIvd2R4Y2tHQWdBUnFJUU1nQkVFR2FpRUNEQUlMSUFGQkFrWUVRRUYvSVFVZ0J3MERRUUFoQXlBQ0xRQUFRVHByUVhaSkRRSU1Bd3NnQWkwQUFFRXdheUlCUVFkTEJFQWdCeUVEREFJTElBUkJBbW9oQWlBQklBZEJBM1J5SWdOQkgwc05BU0FFTFFBQ1FUQnJJZ0ZCQjBzTkFTQUVRUU5xSVFJZ0FTQURRUU4wY2lFRERBRUxJQVFoQWdzZ0FDQUNOZ0lBSUFNaEJRc2dCUXROQVFKL0lBSkMvLy8vL3dkWUJFQWdBQ0FCSUFLblFZQ0FnSUI0Y2tHQWdBRVExUUVQQ3lBQUlBSVErQUlpQTBVRVFFRi9Ed3NnQUNBQklBTkJnSUFCRU5VQklRUWdBQ0FERUJNZ0JBdmdBUUVDZnlBQ1FRQkhJUU1DUUFKQUFrQWdBRUVEY1VVZ0FrVnlEUUFnQVVIL0FYRWhCQU5BSUFBdEFBQWdCRVlOQWlBQ1FRRnJJZ0pCQUVjaEF5QUFRUUZxSWdCQkEzRkZEUUVnQWcwQUN3c2dBMFVOQVNBQUxRQUFJQUZCL3dGeFJpQUNRUVJKY2tVRVFDQUJRZjhCY1VHQmdvUUliQ0VEQTBBZ0FDZ0NBQ0FEY3lJRVFYOXpJQVJCZ1lLRUNHdHhRWUNCZ29SNGNRMENJQUJCQkdvaEFDQUNRUVJySWdKQkEwc05BQXNMSUFKRkRRRUxJQUZCL3dGeElRRURRQ0FCSUFBdEFBQkdCRUFnQUE4TElBQkJBV29oQUNBQ1FRRnJJZ0lOQUFzTFFRQUxHUUFnQUNBQkVBOGdBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRc21BUUYvSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQUlBRVFKZ3VvQWdJQmZnRi9Jd0JCRUdzaUFpUUFBa0FnQVVMLy8vLy9iMWdFUUNBQUVDUkNnSUNBZ09BQUlRVU1BUXNDUUNBRURRQWdBeWtEQUNJRlFvQ0FnSUJ3VkEwQUlBV25JZ1l2QVFaQk1VY05BQ0FHS0FJZ1JRMEFJQUFnQlVFOElBVkJBQkFVSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBVWdBUkJTSVFZZ0FDQUZFQThnQmtVTkFDQURLUU1BSWdWQ0lJaW5RWFZKRFFFZ0JhY2lBQ0FBS0FJQVFRRnFOZ0lBREFFTElBQWdBaUFCRUw4Q0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUFJQUlnQkVFRGRHb3BBd0JDZ0lDQWdEQkJBU0FERUNFaEJTQUFJQUlwQXdBUUR5QUFJQUlwQXdnUUR5QUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQ0FCRUE4TUFnc2dBQ0FGRUE4TElBRWhCUXNnQWtFUWFpUUFJQVVMZVFFQmZ3SkFBa0FDUUFKQUFrQWdBU2dDQUNJQ1FZQUJhZzRGQkFRRUFnQUJDeUFBS0FJQUlBRXBBeEFRRHlBQUtBSUFJQUVwQXhnUUR3OExJQUpCcTM5SERRRUxJQUFvQWdBZ0FTZ0NFQkFURHdzZ0FrSFRBR3BCTFUwRVFDQUFLQUlBSUFFb0FoQVFFd3NQQ3lBQUtBSUFJQUVwQXhBUUR3c05BQ0FBSUFFZ0FrRURFTTRDQzNBQkEzOGpBRUVRYXlJQ0pBQWdBQ0VCQTBBQ1FDQUJMQUFBSWdOQkFFNEVRQ0FEUWY4QmNVRUpheUlEUVJkTFFRRWdBM1JCbjRDQUJIRkZjZzBCSUFGQkFXb2hBUXdDQ3lBQlFRWWdBa0VNYWhCWUVJY0RSUTBBSUFJb0Fnd2hBUXdCQ3dzZ0FrRVFhaVFBSUFFZ0FHc0xDZ0FnQUNBQkVJZ0RSUXROQVFGL0FrQWdBQ0FCSUFBb0FnUkIvLy8vL3dkeElnQWdBU2dDQkVILy8vLy9CM0VpQWlBQUlBSklHeEM3QlNJQkRRQkJBQ0VCSUFBZ0FrWU5BRUYvUVFFZ0FDQUNTUnNoQVFzZ0FRdEtBUUYvSXdCQkVHc2lBaVFBQWtBZ0FVRWdjUVJBSUFBUWZBd0JDeUFDUWNUS0FFSG96QUJCL0NFZ0FVRUJjUnNnQVVFQ2NSczJBZ0FnQUVHVlBTQUNFRkFMSUFKQkVHb2tBQXYwQlFJR2Z3TitJd0JCSUdzaUNTUUFBbjlCQUNBQUx3SG9BVUdBQWtrTkFCcENnSUNBZ0RBaERrRUFJQUFnQWtIZEFTQUNRUUFRRkNJUFFvQ0FnSUJ3Z3lJTlFvQ0FnSUF3VVEwQUdnSkFJQTFDZ0lDQWdPQUFVUTBBSUFBZ0QwRWxFRXNpQ0VVTkFDQUFJQU5CM1FFZ0EwRUFFQlFpRGtLQWdJQ0FjSU1pRFVLQWdJQ0E0QUJSRFFBZ0RVS0FnSUNBTUZFRVFDQUFJQThRRDBFQURBSUxJQUFnRGtFbEVFc2lDMFVOQUFKQUlBZ29BZ1JGRFFBZ0N5Z0NCRVVOQUNBQUlBOFFEeUFBSUE0UUQwRUFEQUlMSUFRUTl3TWhCd0ovSUFnb0FnQWlDaUFMS0FJQUlneEdCRUFnQ0NBSFFRSjBhaWdDQ0F3QkN5QUtJQXhMQkVBZ0NFSFVBR29nRENBSEVMZ0ZEQUVMSUF0QjNBQnFJQW9nQnhDNEJRc2lDa1VFUUNBSklBZEJBblJCd01BQmFqWUNBQ0FBUVpMNkFDQUpFQlVNQVFzQ1FDQUlLQUlFQkVBQ2ZpQUZCRUFnQUNBQ0VMa0NEQUVMSUFBZ0FpQUdFSkFDQ3lJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTUFnc2dBa0lnaUtkQmRVa05BQ0FDcHlJSUlBZ29BZ0JCQVdvMkFnQUxBa0FnQ3lnQ0JBUkFBbjRnQlFSQUlBQWdBeEM1QWd3QkN5QUFJQU1nQmhDUUFnc2lBMEtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJJQUFnQWhBUERBSUxJQU5DSUlpblFYVkpEUUFnQTZjaUJTQUZLQUlBUVFGcU5nSUFDeUFLSUFvb0FnQkJBV28yQWdBZ0NTQUNJQU1nQkVGK2NVR2tBVVlnQjBFTlJuRWlCUnMzQXhnZ0NTQURJQUlnQlJzM0F4QWdBQ0FLclVLQWdJQ0FjSVJDZ0lDQWdEQkJBaUFKUVJCcUVDOGhEU0FBSUFJUUR5QUFJQU1RRHlBTlFvQ0FnSUJ3Z3lJQ1FvQ0FnSURnQUZFTkFBSitJQWRCREVZRVFDQUFJQTBRSmlBRVFhb0JSa2V0UW9DQWdJQVFoQXdCQ3lBTklBZEJEVWNOQUJwQ2dJQ0FnQkFnQWtLQWdJQ0FNRkVOQUJvZ0FDQU5FQ1lnQkVGOWNVR2tBVVpIclVLQWdJQ0FFSVFMSVFNZ0FDQVBFQThnQUNBT0VBOGdBU0FETndNQVFRRU1BUXNnQUNBUEVBOGdBQ0FPRUE4Z0FVS0FnSUNBTURjREFFRi9DeUVISUFsQklHb2tBQ0FIQzJNQ0FYOEJmaU1BUVJCcklnSWtBQ0FBQW40Z0FVVUVRRUlBREFFTElBSWdBYTFDQUNBQlp5SUJRZEVBYWhCbklBSXBBd2hDZ0lDQWdJQ0F3QUNGUVo2QUFTQUJhNjFDTUlaOElRTWdBaWtEQUFzM0F3QWdBQ0FETndNSUlBSkJFR29rQUF2SEFRSUJmZ0YvQWtBZ0FDZ0NFQ2dDakFFaUEwVWdBVUwvLy8vLy8vLy9EM3hDL3YvLy8vLy8veDlXY2cwQUlBTW9BaWhCQkhGRkRRQWdBVUtBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBVUwvLy8vL0Q0TVBDMEtBZ0lDQXdINGdBYm05SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc1BDeUFBRUpjQklnSkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUNwMEVFYWlBQkVMb0NSUVJBSUFJUEN5QUFJQUlRRHlBQUVId0xRb0NBZ0lEZ0FBdVRBUUVDZndKL0lBQW9BZ2dnQW1vaUJDQUFLQUlNU2dSQVFYOGdBQ0FFUVFBUXR3SU5BUm9MQWtBZ0FDZ0NFQVJBSUFKQkFDQUNRUUJLR3lFRUEwQWdBeUFFUmcwQ0lBQW9BZ1FnQUNnQ0NDQURha0VCZEdvZ0FTQURhaTBBQURzQkVDQURRUUZxSVFNTUFBc0FDeUFBS0FJRUlBQW9BZ2hxUVJCcUlBRWdBaEFmR2dzZ0FDQUFLQUlJSUFKcU5nSUlRUUFMQ3lvQkFYOGdBQ2dDRUNJRFFSQnFJQUVnQWlBREtBSUlFUUVBSWdFZ0FrVnlSUVJBSUFBUWZBc2dBUXRFQVFKL0FrQWdBRUtBZ0lDQWNGUU5BQ0FBcHlJREx3RUdRUUpIRFFBZ0F5MEFCVUVJY1VVTkFDQUNJQU1vQWlnMkFnQWdBU0FES0FJa05nSUFRUUVoQkFzZ0JBdWdCQUlGZndGK0l3QkJJR3NpQmlRQUFrQUNRQUpBQWtBZ0F3UkFJQUZDZ0lDQWdHQ0RRb0NBZ0lBZ1VnMEJEQUlMSUFGQ2dJQ0FnSEJVRFFFTFFRRWhCQUpBQWtBZ0FrSWdpS2NpQ0VFQmFnNEVBQUlDQVFJTElBS25JUVVMSUFGQy8vLy8vMjlZUVFBZ0F4c05BZ0pBSUFHbklnY3ZBUVpCTUVZRVFDQUFJQVpCR0dvZ0FVSGdBQkNCQVNJRlJRMERJQVVwQXdBaENTQUdLUU1ZSWdGQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFBZ0NTQUNJQU1RaXdJaEJBd0ZDeUFHSUFJM0F3Z2dCaUFKTndNQUlBQWdBU0FGS1FNSVFRSWdCaEF2SWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQUlBRVFKa1VFUUNBRFJRMENJQUJCb3VRQVFRQVFGUXdFQ3lBQUlBVXBBd0FRbVFFaUEwRUFTQTBESUFNTkJDQUFJQVVwQXdBUTZBRWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMERJQUFnQVJBUElBS25JQUduUmcwRUlBQkJoT1FBUVFBUUZRd0RDeUFIS0FJUUtBSXNJQVZHRFFNZ0J5MEFCVUVCY1VVRVFDQURSUTBCSUFCQjkrZ0FRUUFRRlF3REN3SkFJQVZGRFFBZ0JTRUVBMEFnQkNBSFJnUkFJQU5GRFFNZ0FFR3UwQUJCQUJBVkRBVUxJQVFvQWhBb0Fpd2lCQTBBQ3lBSVFYVkpEUUFnQXFjaUF5QURLQUlBUVFGcU5nSUFDMEYvSVFRZ0FDQUhRUUFRMUFFTkF5QUhLQUlRSWdRb0Fpd2lBd1JBSUFBZ0E2MUNnSUNBZ0hDRUVBOExJQVFnQlRZQ0xFRUJJUVFNQXd0QkFDRUVEQUlMSUFBUUpBdEJmeUVFQ3lBR1FTQnFKQUFnQkFzVkFRRitJQUFnQVJEb0FTRUNJQUFnQVJBUElBSUxDZ0FnQUNBQnB4REJBZ3RRQVFGK0FrQWdBMEhBQUhFRVFDQUNJQU5CUUdxdGlDRUJRZ0FoQWd3QkN5QURSUTBBSUFKQndBQWdBMnV0aGlBQklBT3RJZ1NJaENFQklBSWdCSWdoQWdzZ0FDQUJOd01BSUFBZ0FqY0RDQXZSQ3dJRWZ3UitJd0JCb0FOcklnVWtBQUpBSUFHOUlnbENnSUNBZ0lDQWdQai9BSU5DZ0lDQWdJQ0FnUGovQUZFRVFDQUpRdi8vLy8vLy8vLy8vd0NEUW9HQWdJQ0FnSUQ0L3dCYUJFQWdCVUhPd3JrQ05nS2dBZ3dDQ3lBRlFhQUNhaUVESUFGRUFBQUFBQUFBQUFCakJFQWdCVUV0T2dDZ0FpQUZRYUFDYWtFQmNpRURDeUFEUWYwY0xRQUFPZ0FJSUFOQjlSd3BBQUEzQUFBTUFRc0NRQUpBQWtBZ0JFVUVRQUorSUFHWlJBQUFBQUFBQU9CRFl3UkFJQUd3REFFTFFvQ0FnSUNBZ0lDQWdIOExJZ3BDZ0lDQWdJQ0FnQkI5UW9HQWdJQ0FnSUJnVkNBS3VTQUJZbklOQVNBRlFRQTZBT1VCSUFvZ0NrSS9oeUlKaFNBSmZTRUpJQUt0SVFzZ0JVSGxBV29oQXdOQUlBTWlBa0VCYXlJRFFUQkIxd0FnQ1NBSklBdUFJZ3dnQzM1OXB5SUVRUXBJR3lBRWFqb0FBQ0FKSUF0YUlRUWdEQ0VKSUFRTkFBc2dDa0lBVXdSQUlBSkJBbXNpQTBFdE9nQUFDeUFGUWFBQ2FpQURFT1VGREFRTFJBQUFBQUFBQUFBQUlBRWdBVVFBQUFBQUFBQUFBR0ViSVFFZ0JFRUNSZ1JBQWtBZ0JVR2dBbW9nQVNBRFFRRnFJZ0lRb0FNZ0JXb3RBSjhDUVRWSERRQWdCVUdnQW1vZ0FTQUNFS0FESWdRZ0JVR2dBV29nQVNBQ0VLQURSdzBBSUFWQm9BSnFJQVZCb0FGcUlBUVFZUTBBSUFVdEFLQUNHZ3NnQlVHZ0Ftb2dBU0FERUtBREdnd0VDeUFFUVFOeFFRRkdEUUVMUVJFaEJrRUJJUWNEUUNBR0lBZE5CRUJCRlNFRERBTUxJQUVnQmlBSGFrRUJkaUlESUFWQkhHb2dCVUVnYWlBRlFhQUJhaUFGUWFBQ2FpSUNFTWtDSUFJUTVBVWdBV0VFUUVFQklBTWdBMEVBU2hzaEJnTkFJQU1pQWtFQ1NBMENJQUpCQVdzaUF5QUZRYUFCYW1vdEFBQkJNRVlOQUFzZ0FpRUdCU0FEUVFGcUlRY0xEQUFMQUFzZ0FTQURRUUZxSWdJZ0JVRWNhaUFGUVJocUlBVkJvQUZxSWdZZ0JVR2dBbW9ReVFJQ1FDQURJQVpxTFFBQVFUVkhEUUFnQVNBQ0lBVkJIR29nQlVFWWFpQUZRYUFCYWlJR0lBVkJvQUpxSWdjUXlRSWdBU0FDSUFWQkZHb2dCVUVRYWlBRlFTQnFJZ2dnQnhESkFpQUdJQWdnQWhCaERRQWdCU2dDSENBRktBSVVSdzBBSUFVb0FoZ2FDeUFESVFZTElBRWdCaUFGUVJ4cUlBVkJJR29nQlVHZ0FXb2dCVUdnQW1vUXlRSWdCU2dDSUFSL0lBVkJMVG9Bb0FJZ0JVR2dBbXBCQVhJRklBVkJvQUpxQ3lFQ0lBVW9BaHdoQndKQUlBUkJCSEVOQUNBRElBZElJQWRCQUV4eVJRUkFJQVlnQjB3RVFFRUFJUU1nQnlBR2F5SUVRUUFnQkVFQVNoc2hCQ0FDSUFWQm9BRnFJQVlRSHlBR2FpRUNBMEFnQXlBRVJ3UkFJQUpCTURvQUFDQURRUUZxSVFNZ0FrRUJhaUVDREFFTEN5QUNRUUE2QUFBTUF3c2dBaUFGUWFBQmFpQUhFQjhnQjJvaUFrRXVPZ0FBUVFBaEF5QUdJQWRySWdSQkFDQUVRUUJLR3lFRUEwQWdBa0VCYWlFQ0lBTWdCRWNFUUNBQ0lBVkJvQUZxSUFNZ0IycHFMUUFBT2dBQUlBTkJBV29oQXd3QkN3c2dBa0VBT2dBQURBSUxJQWRCQldwQkJVc05BQ0FDUWJEY0FEc0FBRUVBSVFOQkFDQUhheUVFSUFKQkFtb2hBZ05BSUFNZ0JFY0VRQ0FDUVRBNkFBQWdBMEVCYWlFRElBSkJBV29oQWd3QkN3c2dBaUFGUWFBQmFpQUdFQjhnQm1wQkFEb0FBQXdCQ3lBQ0lBVXRBS0FCT2dBQUFrQWdCa0VDU0FSQUlBSkJBV29oQWd3QkN5QUNRUzQ2QUFFZ0FrRUNhaUVDUVFFaEF3TkFJQU1nQmtZTkFTQUNJQVZCb0FGcUlBTnFMUUFBT2dBQUlBTkJBV29oQXlBQ1FRRnFJUUlNQUFzQUN5QUNRZVVBT2dBQUlBZEJBV3NoQXlBSFFRQk1CSDhnQWtFQmFnVWdBa0VyT2dBQklBSkJBbW9MSVFJZ0JTQUROZ0lBSXdCQkVHc2lCQ1FBSUFRZ0JUWUNEQ01BUVpBQmF5SURKQUFnQTBIQXhRUkJrQUVRSHlJRElBSTJBaXdnQXlBQ05nSVVJQU5CLy8vLy93ZEJmaUFDYXlJR0lBWkIvLy8vL3dkUEd5SUdOZ0l3SUFNZ0FpQUdhaUlDTmdJY0lBTWdBallDRUNBRFFmVDdBQ0FGRUpzRUlBWUVRQ0FES0FJVUlnSWdBaUFES0FJUVJtdEJBRG9BQUFzZ0EwR1FBV29rQUNBRVFSQnFKQUFMSUFBZ0JVR2dBbW9RWWlFSklBVkJvQU5xSkFBZ0NRc3BBUUYvSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBRWdBaENhQVF2TUFRRUNmeUFCSUFFb0FnQWlBa0VCYXlJRE5nSUFBa0FnQWtFQlRBUkFJQU1OQVNBQkxRQVFCRUFnQUNBQkVKQUVDeUFCS0FJc0lnSUVRQ0FBSUFLdFFvQ0FnSUJ3aEJBakN5QUJRVEJxSVFKQkFDRURBMEFnQXlBQktBSWdUMFVFUUNBQUlBSW9BZ1FRN0FFZ0EwRUJhaUVESUFKQkNHb2hBZ3dCQ3dzZ0FTZ0NDQ0lDSUFFb0Fnd2lBellDQkNBRElBSTJBZ0FnQVVJQU53SUlJQUJCRUdvZ0FTQUJLQUlZUVg5elFRSjBhaUFBS0FJRUVRQUFDdzhMUVk2UEFVR3UvQUJCd3lKQnE0MEJFQUFBQzRRQkFRTi9Jd0JCa0FGcklnTWtBQ0FESUFJMkFvd0JBa0FnQTBHQUFTQUJJQUlReXdJaUJFSC9BRTBFUUNBQUlBTWdCQkJ5REFFTElBQWdCQ0FBS0FJRWFrRUJhaERHQVEwQUlBTWdBallDakFFZ0FDZ0NCQ0lGSUFBb0FnQnFJQUFvQWdnZ0JXc2dBU0FDRU1zQ0dpQUFJQUFvQWdRZ0JHbzJBZ1FMSUFOQmtBRnFKQUFMb0FNQ0JIOEJmaU1BUVNCcklnUWtBQ0FCSUFKcUlRVWdBU0VEQTBBQ1FDQURJQVZQRFFBZ0F5d0FBRUVBU0EwQUlBTkJBV29oQXd3QkN3c0NmZ0pBSUFNZ0FXc2lCa0dBZ0lDQUJFOEVRQ0FBUWNEYUFFRUFFRVlNQVFzZ0F5QUZSZ1JBSUFBZ0FTQUNFSVFEREFJTElBQWdCRUVFYWlBQ0VEMUZCRUFnQkVFRWFpQUJJQVlRaUFJYUEwQWdBeUFGU1FSQUlBTXNBQUFpQUVFQVRnUkFJQVJCQkdvZ0FFSC9BWEVRT3hvZ0EwRUJhaUVEREFJRkFrQWdBeUFGSUFOcklBUkJIR29RV0NJQlFmLy9BMDBFUUNBRUtBSWNJUU1NQVFzZ0FVSC8vOE1BVFFSQUlBUW9BaHdoQXlBRVFRUnFJQUZCZ0lBRWEwRUtka0dBc0FOcUVJc0JHaUFCUWY4SGNVR0F1QU55SVFFTUFRc0RRRUg5L3dNaEFTQURJQVZQRFFFZ0F5d0FBRUZBU0FSQUlBTkJBV29oQXd3QkN3c0RRQ0FGSUFOQkFXb2lBMDBFUUNBRklRTU1BZ3NnQXl3QUFFRkFTQTBBQ3dzZ0JFRUVhaUFCRUlzQkdnd0NDd0FMQ3lBRVFRUnFFRFlNQWdzZ0JDZ0NCQ2dDRUNJQVFSQnFJQVFvQWdnZ0FDZ0NCQkVBQUF0Q2dJQ0FnT0FBQ3lFSElBUkJJR29rQUNBSEMwNEJBMzlCME1ZRUtBSUFJZ0lnQUVFSGFrRjRjU0lEYWlFQlFYOGhBQUpBSUFOQkFDQUJJQUpOR3cwQUlBRS9BRUVRZEVzRVFDQUJFQWxGRFFFTFFkREdCQ0FCTmdJQUlBSWhBQXNnQUF1RkFRSURmd0YrQWtBZ0FFS0FnSUNBRUZRRVFDQUFJUVVNQVFzRFFDQUJRUUZySWdFZ0FFSUtnQ0lGUXZZQmZpQUFmS2RCTUhJNkFBQWdBRUwvLy8vL253RldJUUlnQlNFQUlBSU5BQXNMSUFXbklnSUVRQU5BSUFGQkFXc2lBU0FDUVFwdUlnTkI5Z0ZzSUFKcVFUQnlPZ0FBSUFKQkNVc2hCQ0FESVFJZ0JBMEFDd3NnQVF0V0FRRi9JQUpDSUlpblFYVlBCRUFnQXFjaUJTQUZLQUlBUVFGcU5nSUFDeUFBSUFGQk95QUNJQU1RR1JvZ0FVSWdpS2RCZFU4RVFDQUJweUlESUFNb0FnQkJBV28yQWdBTElBQWdBa0U4SUFFZ0JCQVpHZ3ZsQlFNRWZBRi9BWDRDUUFKQUFrQUNmQUpBSUFDOUlnWkNJSWluUWYvLy8vOEhjU0lGUWZyUWpZSUVUd1JBSUFDOVF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXRFFVZ0JrSUFVd1JBUkFBQUFBQUFBUEMvRHdzZ0FFVHZPZnIrUWk2R1FHUkZEUUVnQUVRQUFBQUFBQURnZjZJUEN5QUZRY1BjMlA0RFNRMENJQVZCc2NYQy93TkxEUUFnQmtJQVdRUkFRUUVoQlVSMlBIazE3em5xUFNFQklBQkVBQURnL2tJdTVyK2dEQUlMUVg4aEJVUjJQSGsxN3pucXZTRUJJQUJFQUFEZy9rSXU1aitnREFFTEFuOGdBRVQrZ2l0bFJ4WDNQNkpFQUFBQUFBQUE0RDhnQUthZ0lnR1pSQUFBQUFBQUFPQkJZd1JBSUFHcURBRUxRWUNBZ0lCNEN5SUZ0eUlDUkhZOGVUWHZPZW85b2lFQklBQWdBa1FBQU9EK1FpN212NktnQ3lJQUlBQWdBYUVpQUtFZ0FhRWhBUXdCQ3lBRlFZQ0F3T1FEU1EwQlFRQWhCUXNnQUNBQVJBQUFBQUFBQU9BL29pSURvaUlDSUFJZ0FpQUNJQUlnQWtRdHd3bHV0LzJLdnFKRU9WTG1oc3JQMEQ2Z29rUzMyNnFlR2M0VXY2Q2lSSVZWL2htZ0FWby9vS0pFOUJBUkVSRVJvYitnb2tRQUFBQUFBQUR3UDZBaUJFUUFBQUFBQUFBSVFDQUVJQU9pb1NJRG9VUUFBQUFBQUFBWVFDQUFJQU9pb2FPaUlRTWdCVVVFUUNBQUlBQWdBNklnQXFHaER3c2dBQ0FESUFHaG9pQUJvU0FDb1NFQkFrQUNRQUpBSUFWQkFXb09Bd0FDQVFJTElBQWdBYUZFQUFBQUFBQUE0RCtpUkFBQUFBQUFBT0Mvb0E4TElBQkVBQUFBQUFBQTBMOWpCRUFnQVNBQVJBQUFBQUFBQU9BL29LRkVBQUFBQUFBQUFNQ2lEd3NnQUNBQm9TSUFJQUNnUkFBQUFBQUFBUEEvb0E4TElBVkIvd2RxclVJMGhyOGhBaUFGUVRsUEJFQWdBQ0FCb1VRQUFBQUFBQUR3UDZBaUFDQUFvRVFBQUFBQUFBRGdmNklnQUNBQ29pQUZRWUFJUmh0RUFBQUFBQUFBOEwrZ0R3dEVBQUFBQUFBQThEOUIvd2NnQld1dFFqU0d2eUlEb1NBQUlBR2hvQ0FBSUFFZ0E2Q2hSQUFBQUFBQUFQQS9vQ0FGUVJOTkd5QUNvaUVBQ3lBQUMxOEJCWDhnQTBFQUlBTkJBRW9iSVFaQkFDRURBMEFnQXlBR1JrVUVRQ0FBSUFOQkFuUWlCV29nQVNBRmFpZ0NBQ0lISUFJZ0JXb29BZ0FpQldzaUNDQUVhellDQUNBRklBZExJQVFnQ0V0eUlRUWdBMEVCYWlFRERBRUxDeUFFQ3k4QkFYOENRQ0FDUVFCSURRQWdBU0FDUVFWMUlnRk5EUUFnQUNBQlFRSjBhaWdDQUNBQ2RrRUJjU0VEQ3lBREM1d0JBUVIvSXdCQkVHc2lBaVFBSUFKQkpUb0FDa0VCSVFNZ0FVR0FBazRFUUNBQ1FmVUFPZ0FMSUFJZ0FVRUlka0VQY1VHRmhnRnFMUUFBT2dBTklBSWdBVUVNZGtFUGNVR0ZoZ0ZxTFFBQU9nQU1RUVFoQXdzZ0FrRUthaUlFSUFOcUlnVWdBVUVQY1VHRmhnRnFMUUFBT2dBQklBVWdBVUVFZGtFUGNVR0ZoZ0ZxTFFBQU9nQUFJQUFnQkNBRFFRSnlFSWdDR2lBQ1FSQnFKQUFMVFFFQmZ3SkFJQUpDZ0lDQWdIQlVEUUFnQXFjaUF5OEJCa0VLUncwQUlBTXBBeUFpQWtJZ2lLY2lBMEVBSUFOQkMycEJFa2tiRFFBZ0FDQUJJQUlRUWc4TElBQkJyVEZCQUJBVlFYOExad0lDZndGK0lBQkJFR29oQXlBQktBSUFJUUlEUUFKQUlBSWdBQ2tDQkNJRXAwSC8vLy8vQjNGT0RRQUNmeUFFUW9DQWdJQUlnMUJGQkVBZ0F5QUNRUUYwYWk4QkFBd0JDeUFDSUFOcUxRQUFDMEVnUncwQUlBRWdBa0VCYWlJQ05nSUFEQUVMQ3d1M0FRSUNmZ1YvUVg4aEJRSkFJQUVvQWdBaUJpQUFLUUlFSWdPblFmLy8vLzhIY1NJSFRnMEFJQUJCRUdvaENDQURRb0NBZ0lBSWd5RUVRZ0FoQXlBR0lRQURRQUpBQWtBZ0FDQUhSZ1JBSUFjaEFBd0JDd0ovSUFSUVJRUkFJQWdnQUVFQmRHb3ZBUUFNQVFzZ0FDQUlhaTBBQUFzaUNVRXdhMEVLU1EwQklBQWdCa1lOQXdzZ0FpQUROd01BSUFFZ0FEWUNBRUVBSVFVTUFnc2dBRUVCYWlFQUlBbXRJQU5DQ241OFFqQjlJUU1NQUFzQUN5QUZDN3NEQVFWL0lBRkZCRUFnQUNBQ1FRUnhRUWh5RU44QkR3dEJmeUVEQWtBQ1FDQUFJQUZCQVdzaUJDQUNFSjRDRFFBZ0FrRjdjU0VGSUFKQkFYRWhCaUFCUVFGcklRY0RRQ0FBS0FJUUlRRUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FIRGdjQUFRSURCQVVHQndzZ0FVRWxSd1JBUVpvQklRSWdBVUVxUmcwSklBRkJMMGNOREVHYkFTRUNEQWtMUWJKL1FaeC9JQUFvQWtBdEFHNUJCSEViSVFJTUNBdEJuUUVoQWtFQUlRTUNRQ0FCUVN0ckRnTUlDZ0FLQzBHZUFTRUNEQWNMSUFGQjZRQnFJZ0ZCQTA4TkNTQUJRZUFBYXlFQ0RBWUxRUUFoQXdKQUFrQUNRQUpBSUFGQjVRQnFEZ01CQ3dJQUN3SkFJQUZCeHdCcURnSUlBd0FMUWFNQklRSUNRQ0FCUVR4ckRnTUpDd0FMQzBHbEFTRUNEQWdMUWFRQklRSU1Cd3RCcGdFaEFnd0dDMEduQVNFQ0RBVUxJQUZCNGdCcUlnRkJCRThOQjBHcDE2cmxlaUFCUVFOMGRpRUNEQVFMUWEwQklRSWdBVUVtUncwR0RBTUxRYTRCSVFJZ0FVSGVBRWNOQlF3Q0MwR3ZBU0VDSUFGQi9BQkhEUVFNQVF0QnFBRWhBaUFHUlEwQ0MwRi9JUU1nQUJBU0RRRWdBQ0FFSUFVUW5nSU5BU0FBSUFKQi93RnhFQkFNQUFzQUN5QUREd3RCQUF0Q0FRRi9JQUJCUUdzaEF3TkFJQUVnQWt4RkJFQWdBRUcxQVJBUUlBTW9BZ0FnQVVILy93TnhFQmNnQXlnQ0FDZ0N6QUVnQVVFRGRHb29BZ0FoQVF3QkN3c0xDUUFnQUVFQUVPRUJDOW9CQVFGL0lBQWdBQ2dDUUNJRElBRUNmd0pBQWtBQ1FBSkFBa0FnQVVFblJnMEFJQUZCelFCR0lBRkJPa1p5UlFSQUlBRkJ4UUJHRFFFZ0FVRXRSdzBDSUFNdEFHeEJBVWNOQWlBQVFZM0ZBRUVBRUJaQmZ3OExJQU10QUc1QkFYRUVRQ0FBUWZEckFFRUFFQlpCZnc4TElBRkJ4UUJIRFFFTElBSkJzMzlHRFFNZ0FrRkZSZzBCSUFKQlUwY2dBa0ZMUjNFTkFpQUFRZXpuQUVFQUVCWkJmdzhMSUFKQnMzOUdEUUlnQWtGRlJnMEFRUUVnQWtGVFJnMERHaUFDUVV0SERRRkJBZ3dEQzBFRkRBSUxFQUVBQzBFR0N4Q2dBVUVmZFF0VEFRUi9JQUFvQXZRQklnSkJBQ0FDUVFCS0d5RUVRUUFoQWdKQUEwQWdBaUFFUmcwQklBRWdBQ2dDL0FFaUJTQUNRUVIwYWlnQ0RFY0VRQ0FDUVFGcUlRSU1BUXNMSUFVZ0FrRUVkR29oQXdzZ0F3c0pBQ0FBUVFJUXV3TUw3d0VCQkg4RFFBSkFJQUlnQTB3TkFDQUJJQU5xSWdVdEFBQWlCa0VDZENJSFFZQzRBV290QUFBaENBSkFBa0FnQmtHMkFVY0VRQ0FHUWNJQlJ3MEJJQVFnQlNnQUFUWUNBQXdDQ3lBQUlBVW9BQUVpQlVFQUVHa05BaUFBS0FLa0FpQUZRUlJzYWlnQ0VFVU5BVUdyZ3dGQnJ2d0FRWWp3QVVITzdRQVFBQUFMSUFkQmc3Z0JhaTBBQUNJR1FSeExEUUJCQVNBR2RDSUdRWUNBZ0J4eFJRUkFJQVpCZ0lDQTRBQnhSUVJBSUFaQmdJQ0FnZ0Z4UlEwQ0lBQWdCU2dBQVVGL0VHa2FEQUlMSUFBZ0JTZ0FCVUYvRUdrYUN5QUFLQUlBSUFVb0FBRVFFd3NnQXlBSWFpRUREQUVMQ3lBREN4b0FJQUJCM2dCQjJBQWdBUnNRRVNBQUlBSkIvLzhEY1JBcUMvd0JBUWQvSXdCQkVHc2lCQ1FBQWtBZ0JFRU1haUFBUWJES0EwRWJFS1FHSWdGQkFFZ05BQ0FCUVpETEEyb2hBaUFFS0FJTUlRRURRQ0FCSVFVZ0FpMEFBQ0lCd0NJSFFRQk9BbjhnQWtFQmFpQUJRVDl4SWdGQk1Fa05BQm9nQVVFSWRDRUdJQUZCTjAwRVFDQUdJQUl0QUFGcVFkRGZBR3NoQVNBQ1FRSnFEQUVMSUFJdEFBSWdCa0dBOEFCcklBSXRBQUZCQ0hSeWFrR3dFR29oQVNBQ1FRTnFDMm9oQWlBQklBVnFRUUZxSWdFZ0FFME5BQXNDUUFKQUFrQWdCMEhBQVhGQkJuWU9Bd0FCQXdJTElBSkJBV3N0QUFBaEF3d0NDeUFDUVFGckxRQUFJQUFnQld0cUlRTU1BUXRCNWdFaEF3c2dCRUVRYWlRQUlBTUxxUWNDQ1g4QmZnSkFBa0FDUUFKL0lBSkJBa3dFUUNBQ0lBRXBBZ1FpREVJK2lLZEdCRUFnQUNBQkVNRUNJZ1JCM1FGS0RRVWdBU0FCS0FJQVFRRnJOZ0lBSUFRUEN5QUFLQUkwSUFBb0FpUkJBV3NnQVNBQ0VMQUZRZi8vLy84RGNTSUhjU0lLUVFKMGFpRURJQXluUWYvLy8vOEhjU0VGQTBBZ0FpQURLQUlBSWdSRkRRSWFBa0FnQUNnQ09DQUVRUUowYWlnQ0FDSURLUUlFSWd4Q0lJaW5RZi8vLy84RGNTQUhSeUFNUWo2SXB5QUNSM0lnREtkQi8vLy8vd2R4SUFWSGNnMEFJQU1nQVNBRkVMc0ZEUUFnQkVIZUFVZ05CQ0FESUFNb0FnQkJBV28yQWdBTUJBc2dBMEVNYWlFRERBQUxBQXNnQWtFRFJ5RUhRUU1MSVFVQ1FDQUFLQUk4RFFCQkFDRUVJQUJCRUdvaUN5QUFLQUk0UWRNQklBQW9BaXhCQTJ4QkFtMGlBaUFDUWRNQlRCc2lBa0VDZENBQUtBSUlFUUVBSWdoRkRRRWdBQ2dDTENJSklRTWdDVVVFUUNBTFFSQWdBQ2dDQUJFREFDSUdSUVJBSUFzZ0NDQUFLQUlFRVFBQURBTUxJQVpDZ0lDQWdJQ0FnSUJBTndJRUlBWkJBVFlDQUNBR1FRQTJBQXdnQ0NBR05nSUFJQUFnQUNnQ0tFRUJhallDS0VFQklRTUxJQUFnQXpZQ1BDQUFJQWcyQWpnZ0FDQUNOZ0lzSUFrZ0FpQUNJQWxKR3lFRUlBSkJBV3NoQmdOQUlBTWdCRVlOQVNBQUtBSTRJQU5CQW5ScVFRRWdBMEVCYWlJQ1FRRjBRUUZ5SUFNZ0JrWWJOZ0lBSUFJaEF3d0FDd0FMQWtBZ0FRUkFJQUVwQWdRaURFTC8vLy8vLy8vLy96OVlCRUFnQVNBTUlBV3RRajZHaERjQ0JBd0NDeUFBUVJCcUlBeW5JZ0pCSDNVZ0FrSC8vLy8vQjNFZ0FrRWZkblJxUVJGcUlBQW9BZ0FSQXdBaUFrVUVRRUVBSVFRTUJBc2dBa0VCTmdJQUlBSWdBaWtDQkVMLy8vLy9kNE1nQVNrQ0JFS0FnSUNBQ0lPRUlndzNBZ1FnQWlBTVFvQ0FnSUI0Z3lBQktRSUVRdi8vLy84SGc0UTNBZ1FnQWtFUWFpQUJRUkJxSUFFb0FnUWlBMEgvLy8vL0IzRWdBMEVmZG5RZ0EwRi9jMEVmZG1vUUh4b2dBQ0FCRVBZRElBSWhBUXdCQ3lBQVFSQnFRUkFnQUNnQ0FCRURBQ0lCUlFSQVFRQVBDeUFCUW9HQWdJQ0FnSUNBZ0g4M0FnQUxJQUFnQUNnQ09DQUFLQUk4SWdSQkFuUnFJZ0lvQWdCQkFYWTJBandnQWlBQk5nSUFJQUVnQkRZQ0RDQUJJQUUxQWdRZ0I2MUNJSWFFSUFXdFFqNkdoRGNDQkNBQUlBQW9BaWhCQVdvMkFpZ2dCVUVEUmcwQ0lBRWdBQ2dDTkNBS1FRSjBhaUlCS0FJQU5nSU1JQUVnQkRZQ0FDQUFLQUlvSUFBb0FqQklEUUlnQUNBQUtBSWtRUUYwRVBJRUdnd0NDeUFCUlEwQkN5QUFJQUVROWdNZ0JBOExJQVFMQ3dBZ0FFSCtIRUVBRURvTEZnQWdBQ0FCUWY4QmNSQVJJQUFnQWtIL0FYRVFFUXVPQkFJSWZ3TitJd0JCTUdzaUJDUUFRb0NBZ0lEZ0FDRU5JQUFnQVJBbElneENnSUNBZ0hDRFFvQ0FnSURnQUZJRVFBSkFJQUFDZmtLQWdJQ0FNQ0FBSUFSQkxHb2dCRUVvYWlBTXB5SUlJQUpCYjNFUWpnRU5BQnBDZ0lDQWdPQUFJQUFRUGlJTlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBYUlBSkJFSEVoQ1NBRUtBSXNJUVVnQkNnQ0tDRUdJQU5CQVdzaENrRUFJUUlDUUFOQUlBSWdCa1lOQXlBRklBSkJBM1JxS0FJRUlRTUNRQUpBSUFrRVFDQUFJQVJCQ0dvZ0NDQURFRXdpQzBFQVNBMEVJQXRGRFFFZ0FDQUVRUWhxRUVnZ0JDZ0NDRUVFY1VVTkFRc0NRQUpBQWtBQ1FDQUtEZ0lCQWdBTElBQWdBeEJjSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRklOQWd3R0N5QUFJQXdnQXlBTVFRQVFGQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVNQlFzZ0FCQStJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQ0FBSUFNUVhDSU9Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSWdBQ0FCUWdBZ0RrR0hnQUVRdlFGQkFFZ05BaUFBSUF3Z0F5QU1RUUFRRkNJT1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJZ0FDQUJRZ0VnRGtHSGdBRVF2UUZCQUVnTkFnc2dBQ0FOSUFldElBRkJBQkRTQVVFQVNBMERJQWRCQVdvaEJ3c2dBa0VCYWlFQ0RBRUxDeUFBSUFFUUR3c2dEUXNRRDBLQWdJQ0E0QUFoRFNBRUtBSW9JUVlnQkNnQ0xDRUZDeUFBSUFVZ0JoQmFJQUFnREJBUEN5QUVRVEJxSkFBZ0RRdlFBZ0VDZnlNQVFSQnJJZ01rQUNBRElBSTNBd2dDUUFKQUlBQWdBUkRLQVNJRVFRQklEUUFnQkVVRVFDQUFRb0NBZ0lBd1FRRWdBMEVJYWhDdUF5RUJEQUlMSUFBZ0FVRThJQUZCQUJBVUlnSkNnSUNBZ0hDRElnRkNnSUNBZ09BQVVRUkFJQUloQVF3Q0N3SkFBa0FnQWtLQWdJQ0FjRm9FZmdKQUlBS25MUUFGUVJCeFJRMEFJQUFnQWhDQUF5SUVSUVJBSUFBZ0FoQVBEQVVMSUFBZ0JFWU5BQ0FBSUFJZ0JDa0RRQkJTUlEwQUlBQWdBaEFQREFJTElBQWdBa0hhQVNBQ1FRQVFGQ0VCSUFBZ0FoQVBJQUZDZ0lDQWdIQ0RJZ0pDZ0lDQWdPQUFVUTBFUW9DQWdJQXdJQUVnQWtLQWdJQ0FJRkViSWdKQ2dJQ0FnSENEQlNBQkMwS0FnSUNBTUZJTkFRc2dBRUtBZ0lDQU1FRUJJQU5CQ0dvUXJnTWhBUXdDQ3lBQUlBSkJBU0FEUVFocUVLY0JJUUVnQUNBQ0VBOE1BUXRDZ0lDQWdPQUFJUUVMSUFOQkVHb2tBQ0FCQ3pNQkFYNGdBQ0FCSUFJZ0FVRUFFQlFpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1IrSUFBZ0JTQUJJQU1nQkJBdkJTQUZDd3NiQVFGK0lBQWdBU0FDSUFNZ0JCQ3NBaUVGSUFBZ0FSQVBJQVVMTEFBZ0FDQUJLUU1JRUNNZ0FDQUJLUU1RRUNNZ0FDQUJLUU1ZRUNNZ0FFRVFhaUFCSUFBb0FnUVJBQUFMMGdRQ0IzOEJmaU1BUVRCcklnVWtBQUovUVFBZ0FVS0FnSUNBY0ZRTkFCcEJBQ0FCcHlJRUx3RUdRVEZIRFFBYUlBUW9BaUFMSVFjZ0JVSUFOd0lvQWtBRFFDQUdRUUpIQkVCQkFDRUVJQUJCSUJCZklnaEZCRUJCZnlFRUlBWkJBVWNOQXlBQUtBSVFJQVVvQWlnUXJnSU1Bd3NEUUNBRVFRSkhCRUFnQXlBRVFRTjBJZ2xxS1FNQUlndENJSWluUVhWUEJFQWdDNmNpQ2lBS0tBSUFRUUZxTmdJQUN5QUlJQWxxSUFzM0F3Z2dCRUVCYWlFRURBRUxDeUFDSUFaQkEzUnFLUU1BSWd0Q2dJQ0FnREFnQUNBTEVEZ2JJZ3RDSUlpblFYVlBCRUFnQzZjaUJDQUVLQUlBUVFGcU5nSUFDeUFJSUFzM0F4Z2dCVUVvYWlBR1FRSjBhaUFJTmdJQUlBWkJBV29oQmd3QkN3c0NRQ0FIS0FJQUlnUkZCRUJCQUNFRUEwQWdCRUVDUmcwQ0lBY2dCRUVEZEdvaUFrRUVhaUlES0FJQUlnWWdCVUVvYWlBRVFRSjBhaWdDQUNJQU5nSUVJQUFnQXpZQ0JDQUFJQVkyQWdBZ0FpQUFOZ0lFSUFSQkFXb2hCQXdBQ3dBTEFrQWdCRUVDUncwQVFRSWhCQ0FIS0FJVURRQWdBQ2dDRUNJQ0tBS1lBU0lEUlEwQUlBQWdBU0FIS1FNWVFRRWdBaWdDbkFFZ0F4RTRBQ0FIS0FJQUlRUUxJQVVnQlVFb2FpQUVRUUZySWdOQkFuUnFLQUlBSWdJcEF3ZzNBd0FnQlNBQ0tRTVFOd01JSUFVZ0Fpa0RHRGNERUVFQUlRUWdCU0FEUVFCSHJVS0FnSUNBRUlRM0F4Z2dCU0FIS1FNWU53TWdJQUJCeXdCQkJTQUZFSm9EQTBBZ0JFRUNSZzBCSUFBb0FoQWdCVUVvYWlBRVFRSjBhaWdDQUJDdUFpQUVRUUZxSVFRTUFBc0FDeUFIUVFFMkFoUkJBQ0VFQ3lBRlFUQnFKQUFnQkFzSkFDQUF2VUkwaUtjTFRBRUVmeUFBS0FJTUlRSURRQUpBSUFFZ0FrY0VmeUFBS0FJUUlBRkJBblJxS0FJQUlnUkZEUUVnQUNnQ0NDQUVhQ0FCSUFKclFRVjBjbW9GUVFBTER3c2dBVUVCYWlFQkRBQUxBQXNNQUNBQUlBRVFpQU5CSDNZTHZnRUJCMzhnQUNnQ0RDSUZJUU1DUUFOQUlBTWlCRVVOQVNBQUtBSVFJZ2tnQkVFQmF5SURRUUowYWlJR0tBSUFSUTBBQ3lBQUlBQW9BZ2dnQkNBRmEwRUZkR28yQWdnZ0JpZ0NBR2NpQndSQVFTQWdCMnNoQlVFQUlRTURRQ0FESUFSR1JRUkFJQWtnQTBFQ2RHb2lCaUFJSUFWMklBWW9BZ0FpQ0NBSGRISTJBZ0FnQTBFQmFpRUREQUVMQ3lBQUlBQW9BZ2dnQjJzMkFnZ0xJQUFnQVNBQ0lBUkJBQkNxQXc4TElBQkJnSUNBZ0hnMkFnZ2dBRUVBRUVFYVFRQUxUZ0lCZndGK0FuNGpBQ0lDSUFBb0FoQW9BbmhKQkVBZ0FCRHBBVUtBZ0lDQTRBQU1BUXNnQUNBQnJTQUJLUU1BUW9DQWdJQXdJQUVvQWdnZ0FTZ0NJRUVFRU5nQkN5RURJQUlrQUNBREN3d0FJQUJCK3N3QVFRQVFGUXNMQUNBQVFjTWFRUUFRRlF2VkFRRURmeU1BUVJCcklnVWtBRUYvSVFNQ1FDQUFLQUlVRFFBQ1FBSkFJQUZCZ0lDQWdBUk9CRUFnQUNnQ0FFSEEyZ0JCQUJCR0RBRUxJQUVnQUNnQ0RFRURiRUVDYlNJRUlBRWdCRW9iSVFFZ0FDZ0NFQ0lFSUFKQmdBSklja1VFUUNBQUlBRVE5UU1oQXd3REN5QUFLQUlBSUFBb0FnUWdBU0FFZENBRWEwRVJhaUFGUVF4cUVLZ0JJZ0lOQVFzZ0FCQ0RBd3dCQ3lBRktBSU1JUU1nQUNBQ05nSUVJQUJCLy8vLy93TWdBeUFBS0FJUWRpQUJhaUlBSUFCQi8vLy8vd05PR3pZQ0RFRUFJUU1MSUFWQkVHb2tBQ0FEQ3hFQUlBQWdBU0FDSUFNZ0JFRUFFTGNGQ3lZQkFYOGdBVUlnaUtkQmRVOEVRQ0FCcHlJQ0lBSW9BZ0JCQVdvMkFnQUxJQUFnQVJCc0N5Y0JBWDhnQVVJQVV3UkFJQUJDQUNBQmZSQXdJUUlnQUVFQk5nSUVJQUlQQ3lBQUlBRVFNQXZzQVFFQmZ3SkFBa0FDUUFKQUFrQUNRQUpBUVFjZ0FrSWdpS2NpQXlBRFFRZHJRVzVKR3lJRERnZ0FBQUFFQkFRRUFRTUxJQUFvQXRnQklRQWdBVUlBTndJTUlBRkNnSUNBZ0lDQWdJQ0FmemNDQkNBQklBQTJBZ0FnQVNBQ3hCQzZBZzBCREFRTElBQW9BdGdCSVFBZ0FVSUFOd0lNSUFGQ2dJQ0FnSUNBZ0lDQWZ6Y0NCQ0FCSUFBMkFnQWdBU0FDUW9DQWdJREFnWUQ4L3dCOHZ4QzZCVVVOQXdzZ0FSQWJRUUFQQ3lBRFFRcHFRUUpKRFFJTElBQW9BdGdCSVFBZ0FVSUFOd0lNSUFGQ2dJQ0FnSUNBZ0lDQWZ6Y0NCQ0FCSUFBMkFnQWdBUkExQ3lBQkR3c2dBcWRCQkdvTDVBRUJCSDhqQUVFUWF5SUNKQUFnQUNBQ1FRaHFJQUVRNVFFaEF5QUFJQUVRRHdKQUlBTkZCRUJDZ0lDQWdPQUFJUUVNQVFzZ0FpQURJQU1RZ1FJaUJHb2lCVFlDREFKQUlBSW9BZ2dnQkVZRVFDQUFRZ0FRaHdJaEFRd0JDeUFBSUFVZ0FrRU1ha0VBQW44Z0FDZ0NFQ2dDakFFaUJBUkFRWVVGSUFRb0FpaEJCSEVOQVJvTFFZVUJDeEM0QWlFQklBSWdBaWdDREJDQkFpQUNLQUlNYWlJRU5nSU1JQUZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FDS0FJSUlBUWdBMnRHRFFBZ0FDQUJFQTlDZ0lDQWdNQitJUUVMSUFBZ0F4QlVDeUFDUVJCcUpBQWdBUXN5QUNBQXZVS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVWlBQW5DQUFZWEVnQUpsRS8vLy8vLy8vUDBObGNRdUlDQUVQZnlNQVFlQUVheUlOSkFBZ0FDQUNFS3dFSVE0Z0FDQUNRWUFCY2hDc0JDRVNBa0FnQWtVZ0FVRUNTWElOQUNBTklBRTJBZ1FnRFNBQU5nSUFJQTFCQURZQ0NFRUFJQUpySVE4Z0RVRU1jaUVKQTBBZ0NTQU5UUTBCUVRJZ0NVRU1heUlKS0FJSUlnd2dERUV5VEJzaEV5QUpLQUlBSVFBZ0NTZ0NCQ0VIQTBBQ1FDQUhRUWRKRFFBZ0RDQVRSZ1JBSUFJZ0Iyd2lCaUFDYXlFS0lBZEJBWFlnQW13aEJ5QUFJQUlRckFRaENBTkFJQWNFUUNBSElBSnJJZ2NoQlFOQUlBVkJBWFFnQW1vaUFTQUdUdzBDSUFFZ0Nra0VRQ0FCSUFKQkFDQUFJQUZxSWdFZ0FTQUNhaUFFSUFNUkFRQkJBRXdiYWlFQkN5QUFJQVZxSWdVZ0FDQUJhaUlNSUFRZ0F4RUJBRUVBU2cwQ0lBVWdEQ0FDSUFnUkJnQWdBU0VGREFBTEFBc0xBMEFnQmlBQ2F5SUdSUVJBUVFBaEJ3d0RDeUFBSUFBZ0Jtb2dBaUFJRVFZQUlBWWdBbXNoQjBFQUlRVURRQ0FGUVFGMElBSnFJZ0VnQms4TkFTQUJJQWRKQkVBZ0FTQUNRUUFnQUNBQmFpSUJJQUVnQW1vZ0JDQURFUUVBUVFCTUcyb2hBUXNnQUNBRmFpSUZJQUFnQVdvaUNpQUVJQU1SQVFCQkFFb05BU0FGSUFvZ0FpQUlFUVlBSUFFaEJRd0FDd0FMQUFzZ0FDQUhRUUoySUFKc0lnVnFJZ1lnQUNBRlFRRjBhaUlCSUFRZ0F4RUJBQ0VLSUFFZ0FDQUZRUU5zYWlJRklBUWdBeEVCQUNFSUFrQWdDa0VBU0FSQUlBaEJBRWdOQVNBRklBWWdCaUFGSUFRZ0F4RUJBRUVBU0JzaEFRd0JDeUFJUVFCS0RRQWdCaUFGSUFZZ0JTQUVJQU1SQVFCQkFFZ2JJUUVMSUF4QkFXb2hEQ0FBSUFFZ0FpQU9FUVlBUVFFaEJpQUFJQUlnQjJ4cUlnZ2hCU0FJSVFvZ0FDQUNhaUlMSVFGQkFTRVFBMEFDUUFKQUlBRWdCVThOQUNBQUlBRWdCQ0FERVFFQUloRkJBRWdOQUNBUkRRRWdDeUFCSUFJZ0RoRUdBQ0FDSUF0cUlRc2dFRUVCYWlFUURBRUxBa0FEUUNBQklBVWdEMm9pQlU4TkFTQUFJQVVnQkNBREVRRUFJaEZCQUV3RVFDQVJEUUVnQ2lBUGFpSUtJQVVnQWlBT0VRWUFJQWRCQVdzaEJ3d0JDd3NnQVNBRklBSWdEaEVHQUF3QkN5QUFJQUVnQ3lBQWF5SUZJQUVnQzJzaUN5QUZJQXRKR3lJRmF5QUZJQklSQmdBZ0FTQUlJQWdnQ21zaUN5QUtJQUZySWdVZ0JTQUxTeHNpQVdzZ0FTQVNFUVlBSUFjZ0Jtc2hBU0FJSUFWcklRVUNRQ0FCSUFZZ0VHc2lCMGtFUUNBQUlRWWdCeUVJSUFVaEFDQUJJUWNNQVFzZ0JTRUdJQUVoQ0FzZ0NTQU1OZ0lJSUFrZ0NEWUNCQ0FKSUFZMkFnQWdDVUVNYWlFSkRBTUxJQUVnQW1vaEFTQUdRUUZxSVFZTUFBc0FDd3NnQUNBQ0lBZHNhaUVISUFBaEJnTkFJQUlnQm1vaUJpRUJJQVlnQjA4TkFRTkFJQUFnQVU4TkFTQUJJQTlxSWdVZ0FTQUVJQU1SQVFCQkFFd05BU0FCSUFVZ0FpQU9FUVlBSUFVaEFRd0FDd0FMQUFzQUN5QU5RZUFFYWlRQUMrb0NBZ1IvQW40akFFRWdheUlESkFBZ0EwS0FnSUNBTURjREdDQURRb0NBZ0lBd053TVFJQU1nQUVIQUFFRUNRUUJCQWlBRFFSQnFFTThCSWdjM0F3Z2dCMEtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFRb0NBZ0lEZ0FDRUhJQUFDZmdKK0lBSkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQWdBa0VBSUFOQkNHb1ErUVVNQVFzZ0FDQUNRUUVnQTBFSWFoQ25BUXNpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBQW45QkFDQURLUU1JSWdoQ2dJQ0FnSEJVRFFBYVFRQWdDS2NpQlM4QkJrRVBSdzBBR2lBRktBSWdDeUVHQTBBZ0JFRUNSZ1JBUVFBaEJBTkFJQVJCQWtjRVFDQUdJQVJCQTNRaUJXb3BBd2dpQjBJZ2lLZEJkVThFUUNBSHB5SUFJQUFvQWdCQkFXbzJBZ0FMSUFFZ0JXb2dCemNEQUNBRVFRRnFJUVFNQVFzTElBSWhCeUFES1FNSURBTUxJQVJCQTNRaEJTQUVRUUZxSVFRZ0FDQUZJQVpxS1FNSUVHQkZEUUFMQ3lBQUlBTXBBd2dRRHlBQ0N4QVBDeUFEUVNCcUpBQWdCd3RGQVFGL0FrQWdBVUdBZ0FGeFJRUkFJQUZCZ0lBQ2NVVU5BU0FBS0FJUUtBS01BU0lCUlEwQklBRXRBQ2hCQVhGRkRRRUxJQUFnQWtIT0hSQ1BBVUYvSVFNTElBTUxnUUVDQW44QmZnSkFJQUVwQWdRaUJFTC8vLy8vLy8vLy83OS9WZ1JBSUFFb0Fnd2hBQXdCQ3lBQUtBSTBJQVJDSUlpbklBQW9BaVJCQVd0eFFRSjBhaUVDSUFBb0FqZ2hBd05BSUFNZ0FpZ0NBQ0lBUVFKMGFpZ0NBQ0lDSUFGR0RRRWdBa0VNYWlFQ0lBQU5BQXRCbVpBQlFhNzhBRUg0RkVIdUh4QUFBQXNnQUF1aUF3SURmd0Y4SXdCQklHc2lCQ1FBQWtBQ1FBSkFJQUpDSUlpbklnVkJBMDhFUUNBRlFRcHFRUUpKQkVBZ0JFRWNhaUFDcDBFRWFpSUZRUUVRcVFFZ0FDZ0MyQUVoQXlBRVFnQTNBaFFnQkVLQWdJQ0FnSUNBZ0lCL053SU1JQVFnQXpZQ0NDQUVRUWhxSWdZZ0JDZ0NIQ0lEclJBd0dpQUdJQVVRZ2dJaEJTQUdFQnNnQUNBQ0VBOGdCVVVOQXd3Q0N5QUZRUWRyUVcxTkJFQUNmeUFDUW9DQWdJREFnWUQ4L3dCOHZ5SUhSQUFBQUFBQUFQQkJZeUFIUkFBQUFBQUFBQUFBWm5FRVFDQUhxd3dCQzBFQUN5SUR1Q0FIWWcwRERBSUxJQU1FUUVGL0lRTWdBQ0FDRUkwQklnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkJDQUFJQVJCSEdvZ0FrRUJFTUlDRFFRZ0JDZ0NIQ0VEREFJTElBQWdCRUVjYWlBQ0VIY0VRQ0FBSUFJUUQwRi9JUU1NQkF0QmZ5RURJQUFnQWhDTkFTSUNRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdBQ0FFUVFScUlBSkJBQkRDQWcwRElBUW9BZ1FpQXlBRUtBSWNSZzBCREFJTElBS25JZ05CQUVnTkFRc2dBU0FETmdJQVFRQWhBd3dCQ3lBQVFlSFlBRUVBRUZCQmZ5RURDeUFFUVNCcUpBQWdBd3VqQkFJRmZ3SitJd0JCRUdzaUF5UUFRUWNnQVVFSWF5SUdLUU1BSWdoQ0lJaW5JZ1FnQkVFSGEwRnVTUnNoQkFKL0FrQUNRQUpBUVFjZ0FVRVFheUlCS1FNQUlnbENJSWluSWdVZ0JVRUhhMEZ1U1JzaUJVRi9SaUFFUVg1eFFRSkhjVVVnQlVGK2NVRUNSaUFFUVg5SGNuRU5BQ0FBSUFOQkNHb2dDU0FJSUFKQkFVRUFFSVVDSWdSRkRRQWdBQ0FKRUE4Z0FDQUlFQThnQkVFQVNBMEJJQUVnQXlrRENEY0RBQXdDQ3lBQUlBa1FiQ0lKUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBSUVBOE1BUXNnQUNBSUVHd2lDRUtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQUFnQ1JBUERBRUxBa0FDUUNBQUtBSVFJZ1VvQW93QklnUUVRQ0FFTFFBb1FRUnhEUUVMSUFsQ0lJaW5JZ2RCZGtjZ0NFSWdpS2NpQkVGMlIzRU5BU0FFSUFkR0RRQWdBQ0FKRUE4Z0FDQUlFQThnQUVHRkxFRUFFQlVNQWdzZ0FDQUNJQUVnQ1NBSUlBVW9BcUFDRVJvQURRRU1BZ3NnQUNBRFFRUnFJQWtRbUFFRVFDQUFJQWdRRHd3QkN5QUFJQU1nQ0JDWUFRMEFJQUVDZndKQUFrQUNRQUpBQWtBQ1FDQUNRYTBCYXc0REFRTUNBQXNDUUNBQ1FhQUJhdzRDQlFBRUN5QURLQUlFSUFNb0FnQjFEQVVMSUFNb0FnQWdBeWdDQkhFTUJBc2dBeWdDQUNBREtBSUVjZ3dEQ3lBREtBSUFJQU1vQWdSekRBSUxFQUVBQ3lBREtBSUVJQU1vQWdCMEM2MDNBd0FNQVFzZ0FVS0FnSUNBTURjREFDQUdRb0NBZ0lBd053TUFRWDhNQVF0QkFBc2hBQ0FEUVJCcUpBQWdBQXVHQlFJSGZ3SitBa0FnQVVLQWdJQ0FjSU5DZ0lDQWdKQi9VZ1JBUW9DQWdJRGdBQ0VLSUFBZ0FSQTNJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BUXNDUUNBQ1FvQ0FnSUJ3ZzBLQWdJQ0FrSDlSRFFCQ2dJQ0FnT0FBSVFvZ0FDQUNFRGNpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBBSUFFaEFnd0JDd0pBSUFLbklnVXBBZ1FpQ2tMLy8vLy9CNE5RRFFBZ0FhY2lBeWtDQkNFTEFrQWdBeWdDQUVFQlJ5QUtJQXVGUW9DQWdJQUlnMElBVW5JTkFDQURJQUFvQWhBb0Fnd1JCQUFnQlNrQ0JDSUtweUlFUWYvLy8vOEhjU0lISUFNcEFnUWlDNmNpQmtILy8vLy9CM0VpQ0dvZ0JFRWZkblFnQmtFZmRpSUpRUkZ6YWtrTkFDQUZRUkJxSVFZZ0EwRVFhaUVFSUFrRVFDQUVJQWhCQVhScUlBWWdCMEVCZEJBZkdpQURJQU1wQWdRaUNpQUZLUUlFZkVMLy8vLy9CNE1nQ2tLQWdJQ0FlSU9FTndJRURBSUxJQVFnQ0dvZ0JpQUhFQjhhSUFNZ0F5a0NCQ0lLSUFVcEFnUjhRdi8vLy84SGd5SUxJQXBDZ0lDQWdIaURoRGNDQkNBRUlBdW5ha0VBT2dBQURBRUxBbjRDUUFKQUlBdW5RZi8vLy84SGNTQUtwMEgvLy8vL0IzRnFJZ2RCZ0lDQWdBUlBCRUFnQUVIQTJnQkJBQkJHREFFTElBQWdCeUFLSUF1RXB5SUdRUjkyRU9vQklnZ05BUXRDZ0lDQWdPQUFEQUVMSUFoQkVHb2hCQUpBSUFaQkFFNEVRQ0FFSUFOQkVHb2dBeWdDQkVILy8vLy9CM0VRSHlJRUlBTW9BZ1JCLy8vLy93ZHhhaUFGUVJCcUlBVW9BZ1JCLy8vLy93ZHhFQjhhSUFRZ0IycEJBRG9BQUF3QkN5QUVJQU1nQXlnQ0JFSC8vLy8vQjNFUXd3VWdCQ0FES0FJRVFRRjBhaUFGSUFVb0FnUkIvLy8vL3dkeEVNTUZDeUFJclVLQWdJQ0FrSCtFQ3lFS0lBQWdBUkFQREFFTElBRWhDZ3NnQUNBQ0VBOGdDZ3RBQUNBQUFuOENmeUFEQkVBZ0FTZ0NKQ0FDUVFOMGFrRUVhZ3dCQzBFQUlBRW9BaUFpQTBVTkFSb2dBeUFCTHdFb0lBSnFRUVIwYWdzb0FnQUxFTmtCQ3cwQUlBQWdBU0FDUVFJUXpnSUxOUUVCZnlNQVFkQUFheUlDSkFBZ0FpQUFLQUlRSUFKQkVHb2dBUkNRQVRZQ0FDQUFRZWY1QUNBQ0VNWUNJQUpCMEFCcUpBQUxvd0VDQVg4QmZpTUFRUkJySWdVa0FDQUZJQVEyQWd4QmZ5RUVJQUFnQVNBRlFReHFFTlFCUlFSQUlBTW9BZ0FpQUVGOGNTQUJJQUlnQXlnQ0JDQUFRUU54UVFKMFFaVEFBV29vQWdBUklBQWhCaUFES0FJQUVPb0ZJQVVvQWd3aUFDQUFLQUlBUWYvLy8vOERjVFlDQUNBRFFvQ0FnSUF3SUFZZ0JrS0FnSUNBY0lOQ2dJQ0FnT0FBVVNJQUd6Y0RBRUYvUVFBZ0FCc2hCQXNnQlVFUWFpUUFJQVFMOVFFQkEzOGpBRUVRYXlJR0pBQWdCaUFBT1FNSUlBWWdBVUVCYXlJSE5nSUFJQVZCZ0FGQitQQUFJQVlRVGhvZ0F5QUZMUUFBUVMxR05nSUFJQVFnQlMwQUFUb0FBQ0FCUVFKT0JFQWdCRUVCYWlBRlFRTnFJQWNRSHhvTElBRWdCR3BCQURvQUFDQUNJUWdnQVNBRmFpQUJRUUZLYWtFQ2FpRUNRUUFoQTBFQUlRUURRQ0FDSWdGQkFXb2hBaUFCTEFBQUlnVVFqZ1lOQUFzQ1FBSkFBa0FnQlVFcmF3NERBUUlBQWd0QkFTRUVDeUFDSVFFTEEwQWdBU3dBQUNJQ0VORUNCRUFnQVVFQmFpRUJJQU5CQ213Z0FtdEJNR29oQXd3QkN3c2dDQ0FEUVFBZ0Eyc2dCQnRCQVdvMkFnQWdCa0VRYWlRQUM1a0hBZ3AvQVg0akFFSHdBR3NpQlNRQUlBQW9BaEFoQmlBRlFnQTNBMWdnQlVJQU53TlFJQVVnQmpZQ1pDQUZRVHMyQW1BQ1FDQUNCSDhnQlNBQ05nSkFJQVZCMEFCcVFkTThJQVZCUUdzUWtnSWdBMEYvUndSQUlBVWdBellDTUNBRlFkQUFha0haK3dBZ0JVRXdhaENTQWdzZ0JVSFFBR3BCQ2hBUklBQWdBVUV4SUFBZ0FoQmlRUU1RR1JvZ0FDQUJRVElnQTYxQkF4QVpHaUFFUVFKeERRRWdBQ2dDRUFVZ0JndEJqQUZxSVFnZ0JFRUJjVVVoQ3dOQUlBZ29BZ0FpQ0VVTkFTQUxSUVJBUVFFaEN3d0JDMEhnaUFFaEFrRUFJUVlDUUNBSUtRTUlJZzlDZ0lDQWdIQlVEUUFnRDZjaUJDZ0NFQ0lEUVRCcUlRY2dBeUFES0FJWVFYOXpRUUowUWFSK2Ntb29BZ0FoQXdOQUlBTkZEUUVnQnlBRFFRRnJRUU4wSWdscUlnb29BZ0FoQXlBS0tBSUVRVFpIQkVBZ0EwSC8vLzhmY1NFRERBRUxDeUFEUWYvLy8vOERTdzBBSUFRb0FoUWdDV29wQXdBaUQwS0FnSUNBY0lOQ2dJQ0FnSkIvVWcwQUlBQWdEeEN6QVNJRFJRMEFJQU5CNElnQklBTXRBQUFiSVFJZ0F5RUdDeUFGSUFJMkFpQWdCVUhRQUdwQjB6d2dCVUVnYWhDU0FpQUFJQVlRVkFKQUlBZ29BZ2dpQWk4QkJoRHVBUVJBSUFJb0FpQWlCeThBRVNJQ1FRdDJRUUZ4SVFvZ0FrR0FDSEZGRFFGQmZ5RUdBa0FnQnlnQ1VDSUNSUTBBSUFnb0FpQWdCeWdDRkVGL2Myb2hEaUFDSUFjb0FreHFJUWtnQnlnQ1JDRUVRUUFoREFOQUlBUWhCaUFDSUFsUERRRWdBa0VCYWlFREFuOGdBaTBBQUNJQ1JRUkFBa0FnQlVIb0FHb2dBeUFKRU80RklnSkJBRWdOQUNBRktBSm9JUTBnQlVIc0FHb2dBaUFEYWlJQ0lBa1E3Z1VpQTBFQVNBMEFJQVVvQW13aUJFRUJka0VBSUFSQkFYRnJjeUFHYWlFRUlBSWdBMm9NQWdzZ0J5Z0NSQ0VHREFNTElBWWdBa0VCYXlJQ1FmOEJjVUVGYmlJTlFYdHNJQUpxUWY4QmNXcEJBV3NoQkNBREN5RUNJQXdnRFdvaURDQU9UUTBBQ3dzZ0JTQUFJQWNvQWtBUWtRUWlBa0h6aUFFZ0FoczJBaEFnQlVIUUFHcEJ3RHdnQlVFUWFoQ1NBaUFBSUFJUVZDQUdRWDlIQkVBZ0JTQUdOZ0lBSUFWQjBBQnFRZG43QUNBRkVKSUNDeUFGUWRBQWFrRXBFQkVNQVF0QkFDRUtJQVZCMEFCcVFhZVNBVUVBRUpJQ0N5QUZRZEFBYWtFS0VCRWdDa1VOQUFzTElBVkIwQUJxUVFBUUVVS0FnSUNBSUNFUElBVW9BbEFoQWlBRktBSmNSUVJBSUFBZ0FoQmlJUThMSUFJRVFDQUZLQUprSUFKQkFDQUZLQUpnRVFFQUdnc2dBQ0FCUVRVZ0QwRURFQmthSUFWQjhBQnFKQUFMcGdFQkEzOGpBRUdnQVdzaUJDUUFJQVFnQUNBRVFaNEJhaUFCR3lJRk5nS1VBVUYvSVFBZ0JDQUJRUUZySWdaQkFDQUJJQVpQR3pZQ21BRWdCRUVBUVpBQkVDc2lCRUYvTmdKTUlBUkJPallDSkNBRVFYODJBbEFnQkNBRVFaOEJhallDTENBRUlBUkJsQUZxTmdKVUFrQWdBVUVBU0FSQVFhRFVCRUU5TmdJQURBRUxJQVZCQURvQUFDQUVJQUlnQTBIakFFSGtBQkNaQkNFQUN5QUVRYUFCYWlRQUlBQUxuUU1EQVg0RGZ3TjhBa0FDUUFKQUFrQWdBTDBpQVVJQVdRUkFJQUZDSUlpbklnSkIvLzgvU3cwQkN5QUJRdi8vLy8vLy8vLy8vd0NEVUFSQVJBQUFBQUFBQVBDL0lBQWdBS0tqRHdzZ0FVSUFXUTBCSUFBZ0FLRkVBQUFBQUFBQUFBQ2pEd3NnQWtILy83Ly9CMHNOQWtHQWdNRC9BeUVEUVlGNElRUWdBa0dBZ01EL0EwY0VRQ0FDSVFNTUFnc2dBYWNOQVVRQUFBQUFBQUFBQUE4TElBQkVBQUFBQUFBQVVFT2l2U0lCUWlDSXB5RURRY3QzSVFRTElBUWdBMEhpdmlWcUlnSkJGSFpxdHlJR1JBQUE0UDVDTHVZL29pQUJRdi8vLy84UGd5QUNRZi8vUDNGQm5zR2Evd05xclVJZ2hvUy9SQUFBQUFBQUFQQy9vQ0lBSUFBZ0FFUUFBQUFBQUFBQVFLQ2pJZ1VnQUNBQVJBQUFBQUFBQU9BL29xSWlCeUFGSUFXaUlnVWdCYUlpQUNBQUlBQkVuOFo0MEFtYXd6K2lSSzk0amgzRmNjdy9vS0pFQlBxWG1abVoyVCtnb2lBRklBQWdBQ0FBUkVSU1B0OFM4Y0kvb2tUZUE4dVdaRWJIUDZDaVJGbVRJcFFrU2RJL29LSkVrMVZWVlZWVjVUK2dvcUNnb2lBR1JIWThlVFh2T2VvOW9xQWdCNkdnb0NFQUN5QUFDdzhBSUFBZ0FVS0FnSUNBTUJDL0Fnc21BUUYvSXdCQkVHc2lCQ1FBSUFRZ0FqWUNEQ0FBSUFNZ0FTQUNFSklFSUFSQkVHb2tBQXVaQVFFRGZDQUFJQUNpSWdNZ0F5QURvcUlnQTBSODFjOWFPdG5sUGFKRTY1d3JpdWJsV3I2Z29pQURJQU5FZmY2eFYrTWR4ejZpUk5WaHdSbWdBU3Evb0tKRXB2Z1FFUkVSZ1QrZ29DRUZJQU1nQUtJaEJDQUNSUVJBSUFRZ0F5QUZva1JKVlZWVlZWWEZ2NkNpSUFDZ0R3c2dBQ0FESUFGRUFBQUFBQUFBNEQraUlBVWdCS0tob2lBQm9TQUVSRWxWVlZWVlZjVS9vcUNoQzVJQkFRTjhSQUFBQUFBQUFQQS9JQUFnQUtJaUFrUUFBQUFBQUFEZ1A2SWlBNkVpQkVRQUFBQUFBQUR3UHlBRW9TQURvU0FDSUFJZ0FpQUNSSkFWeXhtZ0Fmbytva1IzVWNFV2JNRld2NkNpUkV4VlZWVlZWYVUvb0tJZ0FpQUNvaUlESUFPaUlBSWdBa1RVT0lpKzZmcW92YUpFeExHMHZaN3VJVDZnb2tTdFVweUFUMzZTdnFDaW9LSWdBQ0FCb3FHZ29Bc0tBQ0FBUVRCclFRcEpDNDBCQUNBQUlBQWdBQ0FBSUFCRUNmZjlEZUU5QWoraVJJaXlBWFhnNzBrL29LSkVPNDlvdFNpQ3BMK2dva1JWUklnT1ZjSEpQNkNpUkgxdjZ3TVMxdFMvb0tKRVZWVlZWVlZWeFQrZ0lBQ2lJQUFnQUNBQUlBQkVncEl1c2NXNHN6K2lSRmtCalJ0c0J1YS9vS0pFeUlwWm5PVXFBRUNnb2tSTExZb2NKem9Ed0tDaVJBQUFBQUFBQVBBL29LTUxxd0lCQ0g4akFFRXdheUlFSkFBZ0FrRUhjU0VKSUFBb0FnQWlCVUVJYWlFR1FTQWhCd05BSUFVb0Fod2lBeUFCSUFkcUlnaEpCRUFDUUNBRktBSVVCRUFnQmlnQ0FDRUREQUVMSUFBb0FnQWhBeUFGUWdBM0FoUWdCVUtBZ0lDQWdJQ0FnSUIvTndJTUlBVWdBellDQ0FzZ0JFSUFOd0lvSUFSQ2dJQ0FnSUNBZ0lDQWZ6Y0NJQ0FFSUFNMkFod2dCRUlBTndJVUlBUkNnSUNBZ0lDQWdJQ0FmemNDRENBRUlBTTJBZ2dnQmlBRVFSeHFJZ29nQkVFSWFpSURRUUFnQ0VFUGFrRURia0VCYWtFQUVLQUVJQVlnQmlBRElBaEJBQkNWQVJvZ0NoQWJJQU1RR3lBRklBZzJBaHdnQ0NFREN5QUFJQVlRUkJvZ0FFRUFOZ0lFSUFBZ0FTQUpJQU1RNFFORkJFQWdCMEVCZGlBSGFpRUhEQUVMQ3lBQUlBRWdBaERPQVJvZ0JFRXdhaVFBQzFjQkFuOGpBRUVnYXlJRkpBQWdBQ2dDQUNFR0lBVkNBRGNDR0NBRlFvQ0FnSUNBZ0lDQWdIODNBaEFnQlNBR05nSU1JQVZCREdvaUJpQUNFTG9DR2lBQUlBRWdCaUFESUFRUVF4b2dCaEFiSUFWQklHb2tBQXNlQUNBQkJFQWdBQ2dDQUNJQUtBSUFJQUZCQUNBQUtBSUVFUUVBR2dzTEVBQWdBYTBnQUsxK0lBSWdBeENvQkF0aUFRRi9Jd0JCSUdzaUJpUUFBa0FDUUNBRElBVWdBeUFGU0J0QjVBQk9CRUFnQmlBQk5nSWNRWDhoQVNBQUlBWkJER29nQWlBRElBUWdCVUVFRUo4R1JRMEJEQUlMSUFFZ0FpQURJQVFnQlJDZUJndEJBQ0VCQ3lBR1FTQnFKQUFnQVF0UUFRSi9JQUpCQUNBQ1FRQktHeUVDQWtBRFFDQUNJQVJHRFFFZ0FDQUVRUUowYWlJRElBTW9BZ0FpQXlBQmF6WUNBQ0FFUVFGcUlRUWdBU0FEU3lFRFFRRWhBU0FERFFBTFFRQWhBUXNnQVF0VEFRRi9JQUVnQUNnQ0JDSUNTZ1JBSUFBb0Fnd2dBQ2dDQ0NBQklBSkJBMnhCQW0waUFpQUJJQUpLR3lJQlFRSjBJQUFvQWhBUkFRQWlBa1VFUUVGL0R3c2dBQ0FCTmdJRUlBQWdBallDQ0F0QkFBdFpBUU4vUVg4aEFTQUFJQUFvQWdBaUFrRUNhaUlERU5rQ0JIOUJmd1VnQUNnQ0NDSUJRUVJxSUFFZ0FrRUNkQ0lDRUp3QklBQW9BZ2dpQVVFQU5nSUFJQUVnQW1wQmZ6WUNCQ0FBSUFNMkFnQWdBQkNpQmtFQUN3dWxBZ0VGZndOQUFrQUNRQUpBQWtBQ2Z5QUNJQWRNSWdrZ0JDQUdUSEpGQkVBZ0FTQUhRUUowYWlnQ0FDSUlJQU1nQmtFQ2RHb29BZ0FpQ1VrRVFDQUlEQUlMSUFnZ0NVY05BeUFHUVFGcUlRWWdCMEVCYWlFSElBZ2hDUXdFQ3lBSkRRRWdBU0FIUVFKMGFpZ0NBQXNoQ1NBSFFRRnFJUWNNQWdzZ0JDQUdUQTBDSUFNZ0JrRUNkR29vQWdBaENRc2dCa0VCYWlFR0N3Si9Ba0FDUUFKQUFrQWdCUTREQXdBQkFnc2dCaUFIY1VFQmNRd0RDeUFHSUFkelFRRnhEQUlMRUFFQUN5QUdJQWR5UVFGeEN5RUtJQW9nQUNnQ0FDSUlRUUZ4UmcwQklBQW9BZ1FnQ0V3RVFDQUFJQWhCQVdvUTJRSUVRRUYvRHdzZ0FDZ0NBQ0VJQ3lBQUlBaEJBV28yQWdBZ0FDZ0NDQ0FJUVFKMGFpQUpOZ0lBREFFTEN5QUFFS0lHUVFBTGF3SUJmZ0ovSUFBb0FnQWhBd05BSUFNdEFBQWlCRUU2YTBIL0FYRkI5Z0ZQQkVBZ0FrSUtmaUFFclVML0FZTjhRakI5SWdKQy8vLy8vd2RVSWdRZ0FYSUVRQ0FDUXYvLy8vOEhJQVFiSVFJZ0EwRUJhaUVEREFJRlFYOFBDd0FMQ3lBQUlBTTJBZ0FnQXFjTFpBRUJmd0pBSUFGQ0lJaW5JZ0pGSUFKQkMycEJFVXR5RFFBQ1FDQUJRb0NBZ0lCd1ZBMEFJQUduSWdJdkFRWkJCRWNOQUNBQ0tRTWdJZ0ZDSUlpbklnSkZJQUpCQzJwQkVVdHlEUUVMSUFCQjlzY0FRUUFRRlVLQWdJQ0E0QUFoQVFzZ0FRc1JBQ0FBSUFFZ0FpQURRUUJCQUJDQ0FRdStBUUlHZndKK0lBRW9BZ0FpQXlBQUtRSUVJZ21uUWYvLy8vOEhjU0lFSUFNZ0JFb2JJQU5ySVFjZ0FFRVFhaUVGSUFOQkFtb2hDQ0FKUW9DQWdJQUlneUVLUVFBaEFFSUFJUWtDUUFOQUlBQkJBa2NFUUVGL0lRWWdBQ0FIUmcwQ0FuOGdDbEJGQkVBZ0JTQURRUUYwYWk4QkFBd0JDeUFESUFWcUxRQUFDeUlFUVRCclFRbExEUUlnQUVFQmFpRUFJQU5CQVdvaEF5QUVyU0FKUWdwK2ZFSXdmU0VKREFFTEN5QUNJQWszQXdBZ0FTQUlOZ0lBUVFBaEJnc2dCZ3VhQXdNQ2ZBTi9BWDRDZnlBQUt3TUlJZ0pFQUFBQUFBQUFLRUFRamdNaUE1bEVBQUFBQUFBQTRFRmpCRUFnQTZvTUFRdEJnSUNBZ0hnTElnUkJER29nQkNBRVFRQklHeUlFUVFCS0lRWWdCRUVBSUFZYklRWUNmaUFBS3dNQUlBSkVBQUFBQUFBQUtFQ2puS0FpQXBsRUFBQUFBQUFBNEVOakJFQWdBckFNQVF0Q2dJQ0FnSUNBZ0lDQWZ3c2lCeERNQkxraEFnTkFJQVVnQmtaRkJFQWdCVUVDZEVHUTBnRnFLQUlBSVFRZ0JVRUJSZ1JBSUFRZ0J4RExCS2RxUWUwQ2F5RUVDeUFGUVFGcUlRVWdBaUFFdDZBaEFnd0JDd3NnQWlBQUt3TVFSQUFBQUFBQUFQQy9vS0JFQUFBQUFIQ1psRUdpSUFBckF6QWdBQ3NES0VRQUFBQUFBRUNQUUtJZ0FDc0RHRVFBQUFBQVFIZExRYUlnQUNzRElFUUFBQUFBQUV6dFFLS2dvS0NnSVFJZ0FRUkFJQUlDZmlBQ21VUUFBQUFBQUFEZ1EyTUVRQ0FDc0F3QkMwS0FnSUNBZ0lDQWdJQi9DeEM0QTBIZzFBTnN0NkFoQWdzZ0FwMUVBQUFBQUFBQUFBQ2dSQUFBQUFBQUFQaC9JQUpFQUFEY3dnaXlQa05sRzBRQUFBQUFBQUQ0ZnlBQ1JBQUEzTUlJc2o3RFpoc0xkZ0VDZnlBQktBSUFRUUJJQkVBZ0FTQUFRVUJyS0FJQUVESTJBZ0FMSUFCQkVSQVFJQUJCc0FFUUVDQUNRUUFnQWtFQVNoc2hBaUFBUWVrQVFYOFFIQ0VFQTBBZ0FpQURSa1VFUUNBQVFRNFFFQ0FEUVFGcUlRTU1BUXNMSUFCQkJoQVFJQUJCNndBZ0FTZ0NBQkFjR2lBQUlBUVFIZ3RQQVFGL1FYOGhBUUpBSUFCQit3QVFMQTBBSUFBb0FoQkIvUUJIQkVBZ0FCQ0FBUm9EUUNBQVFRY1E0UUVOQWlBQUtBSVFRZjBBUncwQUN5QUFFUE1CQzBGL1FRQWdBQkFTR3lFQkN5QUJDMmdBSUFBZ0FTQUNFRThpQUVFQVRnUkFJQUVvQW5RZ0FFRUVkR29pQWlBQ0tBSU1RWWQvY1NBRFFRTjBRZmdBY1hJMkFnd2dBaUFCS0FLOEFTSUROZ0lFSUFJZ0FTZ0N3QUUyQWdnZ0FTZ0N6QUVnQTBFRGRHb2dBRFlDQkNBQklBQTJBc0FCQ3lBQUMyMEJBWDhnQUNBQlFmd0Jha0VRSUFGQitBRnFJQUVvQXZRQlFRRnFFSGhGQkVBZ0FTQUJLQUwwQVNJRFFRRnFOZ0wwQVNBQktBTDhBU0FEUVFSMGFpSURRWDgyQWdBZ0F5QURMUUFFUWZnQmNUb0FCQ0FESUFFb0Fyd0JOZ0lJSUFNZ0FDQUNFQmcyQWd3TElBTUx4Z01CQkg4Z0FFRkFheUlGS0FJQVFiQUNhaUVEQTBCQkFDRUNBa0FEUUNBREtBSUFJZ05GRFFFZ0F5Z0NIQVJBSUFGRkJFQWdBRUVHRUJBTElBQkJoQUVRRUVHREFTRUNJQUFnQlNnQ0FDMEFiRUVEUmdSL0lBQkJEaEFRSUFCQkRoQVFJQUJCd2dBUUVDQUFRUVlRR2lBQVFSRVFFQ0FBUWJBQkVCQWdBRUhxQUVGL0VCd2hBU0FBUVNRUUVDQUZLQUlBUVFBUUZ5QUFRWUVCRUJBZ0FFR0xBUkFRSUFCQjZ3QkJmeEFjSVFRZ0FDQUJFQjRnQUVFT0VCQWdBQ0FFRUI1QkRnVkJnd0VMRUJCQmZTRUNRUUVoQVFzZ0F5Z0NFQ0FDYWlFQ0lBTW9BaFJCZjBZTkFBdEJEMEVPSUFFYklRUURRQ0FDQkVBZ0FDQUVFQkFnQWtFQmF5RUNEQUVMQ3lBQlJRUkFJQUJCQmhBUUN5QUFRZTBBSUFNb0FoUVFIQnBCQVNFQkRBRUxDd0pBSUFCQlFHc29BZ0FpQWlnQ1lBUkFBa0FnQVVVRVFFRi9JUUlNQVFzZ0FFRXFFQkFnQUVIcEFFRi9FQndoQWlBQVFRNFFFQXNnQUVHNEFSQVFJQUJCQ0JBYUlBQkJRR3NvQWdCQkFCQVhJQUFnQWhBZVFTZ2hBZ3dCQ3lBQ0xRQnNJZ01FUUNBQlJRUkFJQUJCQmhBUVFTNGhBZ3dDQzBFdUlRSWdBMEVEUncwQklBQkJpd0VRRUF3QkMwRW9RU2tnQVJzaEFnc2dBQ0FDRUJBTFhRRUNmd0pBQWtBZ0FDZ0NtQUlpQVVFQVNBMEFJQUFvQW9BQ0lBRnFMUUFBSWdCQkkyc2lBVUVOVFVFQVFRRWdBWFJCNWZBQWNSc05BUUpBSUFCQjZ3QnJEZ1FDQVFFQ0FBc2dBRUhzQVd0QkFra05BUXRCQVNFQ0N5QUNDeThBSUFBZ0FTQUNJQU1RNHdJaUFFRUFUZ1JBSUFFb0FuUWdBRUVFZEdvaUFTQUJLQUlNUVFOeU5nSU1DeUFBQ3k0QUlBQkJEQkFwSWdBRVFDQUFJQU0yQWdnZ0FDQUNOZ0lFSUFBZ0FTZ0NFRFlDQUNBQklBQTJBaEFMSUFBTGF3RUJmd0pBSUFFb0FxQUJJZ05CQUU0TkFDQUFJQUVnQWhCUElnTkJBRWdOQUNBQklBTTJBcUFCSUFOQkJIUWlBQ0FCS0FKMGFpSUNJQUlvQWd4QmgzOXhRU0J5TmdJTUlBRXRBRzVCQVhGRkRRQWdBU2dDZENBQWFpSUFJQUFvQWd4QkFYSTJBZ3dMSUFNTExnRUJmd0pBSUFFb0FwZ0JJZ0pCQUU0TkFDQUFJQUZCelFBUVR5SUNRUUJJRFFBZ0FTQUNOZ0tZQVFzZ0FndVlBUUVFZnlBQktBSVVJZ1ZCQUNBRlFRQktHeUVHSUFGQkVHb2hCQUpBQTBBZ0F5QUdSd1JBSUFRb0FnQWdBMEVEZEdvb0FnQWdBa1lOQWlBRFFRRnFJUU1NQVFzTFFYOGhBeUFBSUFSQkNDQUJRUmhxSUFWQkFXb1FlQTBBSUFFZ0FTZ0NGQ0lFUVFGcU5nSVVJQUVvQWhBaEF5QUFJQUlRR0NFQklBTWdCRUVEZEdvaUFFRUFOZ0lFSUFBZ0FUWUNBQ0FHSVFNTElBTUxaUUVCZnlBQVFmb0FFRXBGQkVBZ0FFR2Q5d0JCQUJBV1FRQVBDd0pBSUFBUUVnMEFJQUFvQWhCQmdYOUhCRUFnQUVHTjl3QkJBQkFXUVFBUEN5QUFLQUlBSUFBcEF5QVFNU0lCUlEwQUlBQVFFa1VFUUNBQkR3c2dBQ2dDQUNBQkVCTUxRUUFMNEJNQkdIOGpBRUhRQUdzaUJDUUFJQUJCUUdzb0FnQWhCU0FBS0FJQUlRY2dCRUVBTmdJOElBQW9BaGdoRWlBRklBVXRBRzRpRlVFQmNqb0FiZ0ovQWtBQ1FDQUFFQklOQUFKQUFrQWdBQ2dDRUVHRGYwWUVRQ0FBS0FJb1JRMEJJQUFRNGdFTUF3c2dBU0FDUVFKR2NnMEJJQUJCeHVnQVFRQVFGZ3dDQ3lBSElBQW9BaUFRR0NFSklBQVFFZzBDQ3lBQlJRUkFJQWNnQ1VIOEFDQUpHeEFZSVFzTElBQVFnQUVhQW44Z0FDZ0NFQ0lPUVU1R0JFQWdBQkFTRFFNZ0FCQ2pBZzBEUVFFTUFRc2dBRUVHRUJCQkFBc2hBU0FKQkVBZ0FDQUZJQWxCQWhDZ0FVRUFTQTBDQ3lBQVFmc0FFQ3dOQVNBT1FVNUdJUllnQUJDQUFSb2dBRUVDRUJBZ0JTZ0NoQUloRnlBQVFVQnJJZ01vQWdCQkFCQTVJQUJCMWdBUUVDQUFJQWxCRmtFdklBc2JJQWtiRUJvZ0F5Z0NBQ0FCRUdRZ0JTZ0NtQUloR0VFQUlRTURRQ0FEUVFKR1JRUkFJQVJCRUdvZ0EwRUVkR29pQVVFQU5nSUlJQUZDQURjREFDQURRUUZxSVFNTUFRc0xJQVJCQURZQ05FRUlRUWNnRGtGT1Joc2hFeUFPUVU1SElSa2dBRUZBYXlFS0EwQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNmd0ovQWtBZ0FDZ0NFQ0lEUVR0SEJFQWdBMEg5QUVZTkJFRUFJQU5CV0VjTkFob2dBQkFTUlEwQkRBd0xRUUFoQXlBQUVCSkZEUXdNRGdzQ1FBSkFJQUFvQWhCQk8yc09Bd0FCQUFFTFFTd2hBU0FFUVN3MkFqd2dBQ2dDR0NFUlFRQWhEMEVBSVFaQkFBd0NDeUFBUVJzUUVFRUJDeUVQSUFBb0FoZ2hFU0FBSUFSQlBHcEJBVUVBUVFFUXhBTWhCaUFFS0FJOElRRWdCa0VBU0EwRUlBTkJXRVlMSVJCQlBDRURBa0FnQVVFOFJ5QVFjaUlhUVFFZ0JrRnZjU0lOR3dSQUlBRkJPMFlnRUhGRklBRkIrQUJIY1EwQklBRWhBd3NnQUVHSzZBQkJBQkFXREF3TElBWkJFSEVoREFKQUFrQUNRQ0FHUVc1eFFRSkdCRUFnREVVTkJpQUZJQUVnQlNnQ3ZBRVF3d01pQTBFQVRnUkFJQVVvQW5RZ0EwRUVkR29pQmlnQ0RDSUlRUU4yUVE5eElnTkJDVTFCQUVFQklBTjBRZUFFY1JzZ0F5QU5RUVZxUm5JTkFpQUdJQWhCaDM5eFFjZ0FjallDREF3R0N5QUFLQUlBSUFVZ0FTQU5RUVZxRU9jQ1FRQk9EUVVNQnd0QkJpRVVRUUVoQTBFQUlRaEJBQ0VHQWtBQ1FBSkFBa0FDUUFKQUlBME9Cd0FDQWdJRkF3RUNDeUFBS0FJUVFTaEdEUUVnQVVFN2EwRUJUUVJBSUFCQnMrZ0FRUUFRRmd3TUN5QU1CRUFnQlNBQklBVW9BcndCRU1NRFFRQk9EUVlnQUNnQ0FDQUZJQUZCQlJEbkFrRUFTQTBNSUFCQkJSQVFJQUFnQVJBYUlBQkJ2UUVRRUNBQUlBRVFHaUFLS0FJQUlnTWdBeThCdkFFUUZ3c2dCRUVRYWlBUFFRUjBhaUlJS0FJQVJRUkFJQUFnQ0JEZUJBME1DeUFCUlFSQUlBUWdDQ2dDQkRZQ0FDQUVRVUJySWdaQkVFSGNJaUFFRUU0YVFRQWhBeUFIUWZVQVFmUUFJQkFiSUFZUTRRUWlCa1VORkNBQUlBVWdCa0VDRUtBQlFRQklCRUFnQnlBR0VCTU1GUXNnQUVId0FCQVFJQUJCdlFFUUVDQUFJQVlRR2lBS0tBSUFJZ01nQXk4QnZBRVFGd3NnQ2lBSUtBSUFOZ0lBSUFCQnVBRVFFQ0FBUVFnUUdpQUtLQUlBUVFBUUZ3SkFJQUZGQkVBZ0FFRzRBUkFRSUFBZ0JoQWFJQW9vQWdBaUF5QURMd0c4QVJBWElBZ2dDQ2dDQkVFQmFqWUNCQ0FISUFZUUV3d0JDeUFNUlEwQUlBQkJ1QUVRRUNBQUlBRVFHaUFLS0FJQUlnTWdBeThCdkFFUUZ3c0NRQ0FBS0FJUVFUMUdCRUFnQUJBU0RRMGdBQkJXRFEwTUFRc2dBRUVHRUJBTEFrQWdEQVJBSUFBUXdnTWdBRUhHQUJBUURBRUxJQUZGQkVBZ0FCRENBeUFBUWRFQUVCQWdBRUVPRUJBTUFRc2dBQ0FCRUtFQklBQkJ6QUFRRUNBQUlBRVFHZ3NnQ2lBS0tBSUFLQUlFTmdJQUlBQVF0d0VOQ3d3UEMwRURJUU1NQWd0QkFDRURJQm9FUUF3Q0N5QVdJUWdnR1NFR0lCTWhGQ0FFS0FJMFJRMENJQUJCaVBBQVFRQVFGa0U4SVFNTUVRdEJBaUVEQ3dzZ0RBUkFJQUFnQkVFUWFpQVBRUVIwYWhEZEJFRUFTQTBIQ3lBQUlCUWdBeUFSSUFBb0FoUkJBQ0FFUVRocUVQZ0JEUVlnQmlBSWNrRUJSZ1JBSUFRZ0JDZ0NPRFlDTkF3TEN5QU1SUTBDSUFRb0FqaEJBVFlDdUFFZ0JTQUJJQVVvQXJ3QkVNTURRUUJJRFFFTElBQkJ3UGtBUVFBUUZnd0ZDeUFBS0FJQUlBVWdBVUVHRU9jQ1FRQklEUVFnQUVIUUFCQVFJQUJCelFBUUVDQUFJQUVRR2lBQVFiMEJFQkFnQUNBQkVCb2dDaWdDQUNJRElBTXZBYndCRUJjTUNBc0NRQ0FCUlFSQUlBQkIxUUFRRUF3QkN5QUFRZFFBRUJBZ0FDQUJFQm9MSUFvb0FnQkJBQkJrREFjTElBUW9BalFpQTBVRVFDQUVJQUFvQWdRMkFrQWdCQ0FBS0FJVUlnWTJBa1FnQkNBQUtBSVlOZ0pNSUFRZ0FDZ0NNRFlDU0NBQVFhVVpRYUFaSUE1QlRrWWlBUnNpQXpZQ09DQUFLQUk4SVFnZ0FDQURRUmhCQkNBQkcybzJBanhCZnlFQklBQVFFa1VFUUNBQUlCTkJBQ0FESUFaQkFDQUVRVFJxRVBnQklRRUxJQUFnQ0RZQ1BFRUFJUU1nQUNBRVFVQnJFTzRDSUFGeURRc2dCQ2dDTkNFREN5QUZLQUtBQWlBWGFpQURLQUlJTmdBQUlBVXRBRzVCQW5GRkJFQWdCeWdDRUNJQlFSQnFJQU1vQW93RElBRW9BZ1FSQUFBZ0JDZ0NOQ0FBS0FJNElCSnJJZ0UyQXBBRElBY2dFaUFCRUlFRElRRWdCQ2dDTkNBQk5nS01BeUFCUlEwSUMwRUFJUU1nQUJBU0RRb2dBQ0FGUWZZQVFRSVFvQUZCQUVnTkNnSkFJQVFvQWhBRVFDQUFJQVJCRUdvUTNBUU1BUXNnQUVFR0VCQUxJQUJCdlFFUUVDQUFRZllBRUJvZ0FFRkFheUlCS0FJQUlnTWdBeThCdkFFUUZ5QUFRUTRRRUNBRUtBSWdCRUFnQUVFUkVCQWdBQ0FFUVNCcUVOd0VJQUJCSkJBUUlBRW9BZ0JCQUJBWElBQkJEaEFRQ3lBSkJFQWdBRUVSRUJBZ0FFRzlBUkFRSUFBZ0NSQWFJQUJCUUdzb0FnQWdCUzhCdkFFUUZ3c2dBQkR6QVNBQUVQTUJBa0FnQ3dSQVFRQWhBeUFBSUFVZ0MwRUJFS0FCUVFCSURRd2dBRUc5QVJBUUlBQWdDeEFhSUFCQlFHc29BZ0FnQlM4QnZBRVFGd3dCQ3lBSkRRQWdBRUhCQVJBUUlBQkJRR3NvQWdBZ0JTZ0NtQUlnR0d0QkFXb1FPUXRCQUNBQ1JRMExHa0VBSWdNZ0FDQUZLQUtVQXlBTFFSWWdDeUFDUVFGSEcwRUFFUGNCRFFzYURBb0xJQUFnQkVFUWFpQVBRUVIwYWhEZEJFRUFTQTBCQ3lBQUlBMUJBbXBCQUNBUklBQW9BaFJCQUNBRVFVQnJFUGdCRFFBZ0RFVU5BeUFFS0FKQVFRRTJBcmdCSUFCQjBBQVFFQ0FBUWIwQkVCQWdEVUVDUmcwQklBY2dBUkRuQkNJRFJRMEFJQUFnQXhBYUlBQW9BZ0FnQlNBRFFRZ1E1d0loQmlBSElBTVFFeUFHUVFCT0RRSUxJQUVoQXd3SEN5QUFJQUVRR2dzZ0NpZ0NBQ0lESUFNdkFid0JFQmNNQVFzQ1FDQUJSUVJBSUFCQjFRQVFFQXdCQ3lBQVFkUUFFQkFnQUNBQkVCb0xJQW9vQWdBZ0RVRUJhMEgvQVhFUVpBc2dFQVJBSUFCQkd4QVFDeUFISUFFUUV5QUVRUUEyQWp3TUFRc0xRUUFoQXd3QkN3c2dCeUFERUJOQmZ3c2hBeUFISUFrUUV5QUhJQXNRRXlBRklCVTZBRzRnQkVIUUFHb2tBQ0FEQ3k0QUlBQWdBU2dDQURZQ0ZDQUFJQUVvQWdRMkFnZ2dBQ0FCS0FJTU5nSTRJQUFnQVNnQ0NEWUNNQ0FBRUJJTEt3QWdBRUgvQUUwRVFDQUFRUU4yUWZ6Ly8vOEJjVUdRZ1FKcUtBSUFJQUIyUVFGeER3c2dBQkM1QXdzdUFRRi9Ba0FnQVVLQWdJQ0FjRlFOQUNBQnB5SUNMd0VHUVJKSERRQWdBa0VnYWc4TElBQkJFaENHQTBFQUMyY0NBWDhCZmlNQVFSQnJJZ01rQUFKK0FrQUNRQ0FDUlEwQUlBQXBBZ1FpQkVMLy8vLy9CNE1nQVZjTkFDQUVRb0NBZ0lBSWcwSUFVZzBCQ3lBQlFnRjhEQUVMSUFNZ0FUNENEQ0FBSUFOQkRHb1F5UUVhSUFNMEFnd0xJUUVnQTBFUWFpUUFJQUVMemdFQkJIOENRQ01BSWdVZ0FDZ0NRQ2dDRUNnQ2VFa0VRQ0FBUVkwaVFRQVFPa0YvSVFRTUFRc2dBQ2dDQkNFRFFYOGhCQ0FBSUFFUXJRWU5BQU5BSUFBb0FoZ2lBaTBBQUVIOEFFY0VRRUVBSVFRTUFnc2dBQ0FDUVFGcU5nSVlJQUFvQWdRaEFpQUFJQU5CQlJEd0FRUkFJQUFRcUFJTUFnc2dBQ2dDQUNBRGFrRUpPZ0FBSUFBb0FnQWdBMm9nQWlBRGEwRUZhallBQVNBQVFRZEJBQkM0QVNFQ0lBQWdBUkN0QmcwQklBQW9BZ0FnQW1vZ0FDZ0NCQ0FDYTBFRWF6WUFBQXdBQ3dBTElBVWtBQ0FFQzVFR0FRWi9Jd0JCSUdzaUJ5UUFJQWNnQXpZQ0hBSi9Ba0FnQUNnQ0FDQUhRUVJxUVNBUVBRMEFJQUZCNEFCSElRc0RRQUpBQWtBQ1FBSkFJQU1nQUNnQ1BDSUtUdzBBQWtBZ0F5MEFBQ0lHUVI5TERRQWdBQ2dDUUVVRVFFR3Yyd0FoQmlBQ0RRTU1Cd3NnQzBVRVFDQUdRUTFIRFFGQkNpRUdJQU5CQVdvZ0F5QURMUUFCUVFwR0d5RUREQUVMSUFaQkNtc09CQUVBQUFFQUN5QUhJQU5CQVdvaUNEWUNIQUpBQWtBQ1FBSkFBa0FnQVNBR1J3UkFJQVpCM0FCR0RRRWdCa0VrUncwQ1FTUWhCaUFMRFFrZ0NDMEFBRUg3QUVjTkNTQURRUUpxSVFoQkpDRUJDeUFFUVlGL05nSUFJQVFnQVRZQ0dDQUVJQWRCQkdvUU5qY0RFQ0FGSUFnMkFnQkJBQXdMQzBFQklRWUNRQUpBQWtBQ1FDQUlMUUFBSWdsQkNtc09CQUlEQXdFQUN5QUpRZHdBUmlBSlFTSkdjaUFKUVNkR2NnMEVJQWtOQWlBSUlBcFBEUWNnQnlBRFFRSnFOZ0ljUVFBaEJnd0tDMEVDUVFFZ0F5MEFBa0VLUmhzaEJnc2dCeUFHSUFocUlnTTJBaHdnQVVIZ0FFWU5DU0FBSUFBb0FnaEJBV28yQWdnTUNRc0NRQUpBQWtBZ0NjQWlCa0V3YTBIL0FYRkJDVTBFUUNBQUtBSkFJZ3BGRFFJZ0FVSGdBRWNFUUNBS0xRQnVRUUZ4UlEwQ0N5QUJRZUFBUmlBR1FUQkdCSDhnQXkwQUFrRXdhMEgvQVhGQkNrOE5DMEV3QlNBR0MwRTNTM0lOQWtIRjdBQWhCaUFDRFFrTURRc2dCa0VBVGcwQUlBaEJCaUFIRUZnaUJrR0FnTVFBVHcwR0lBY2dCeWdDQUNJRE5nSWNJQVpCZm5GQnFNQUFSZzBMREFvTElBZEJIR3BCQVJENUFTSUdRWDlIRFFFTFFlelZBQ0VHSUFJTkJnd0tDeUFHUVFCT0RRY2dCeUFIS0FJY1FRRnFOZ0ljREFJTElBYkFRUUJPRFFZZ0EwRUdJQWNRV0NJR1FmLy93d0JMRFFJZ0J5QUhLQUlBTmdJY0RBWUxJQWNnQTBFQ2FqWUNIQXNnQ1NFR0RBUUxRYlR3QUNFR0lBSU5BUXdGQzBHSjJ3QWhCaUFDUlEwRUN5QUFJQVpCQUJBV0RBTUxJQWNnQTBFQ2FqWUNIRUVBSVFZTElBZEJCR29nQmhDNUFRMEJJQWNvQWh3aEF3d0FDd0FMSUFjb0FnUW9BaEFpQUVFUWFpQUhLQUlJSUFBb0FnUVJBQUJCZndzaEJpQUhRU0JxSkFBZ0JndWpBUUlEZmdOL0l3QkJFR3NpQ1NRQUlBUkNBQ0FFUWdCVkd5RUlJQVZCQUVnaENnTkFBa0FnQmlBSVVRUkFRUUFoQlF3QkMwRi9JUVVnQUNBQklBWkNmNFVnQkh3Z0JpQUtHeUlISUFOOElBbEJDR29RaFFFaUMwRUFTQTBBSUFJZ0Izd2hCd0pBSUFzRVFDQUFJQUVnQnlBSktRTUlFSVlCUVFCT0RRRU1BZ3NnQUNBQklBY1ErZ0ZCQUVnTkFRc2dCa0lCZkNFR0RBRUxDeUFKUVJCcUpBQWdCUXVrQVFJRmZ3RitJQUVvQWhBaUJDQUJLQUlVUVFGcklBSVExd054UVFOMElnWnFRUVJxSVFNZ0FxY2hCU0FDUWlDSXAwRjFTU0VIQTM4Z0F5Z0NBQ0lESUFRZ0JtcEdCRUJCQUE4TElBTXBBd2dpQ0VJZ2lLZEJkVThFUUNBSXB5SUVJQVFvQWdCQkFXbzJBZ0FMSUFkRkJFQWdCU0FGS0FJQVFRRnFOZ0lBQ3lBQUlBZ2dBa0VDRUx3QkJIOGdBMEVZYXdVZ0EwRUVhaUVESUFFb0FoQWhCQXdCQ3dzTGtBRUNBbjRCZnlBQUlBSXBBd0FpQTBFQUVKTUJJZ1ZGQkVCQ2dJQ0FnT0FBRHdzZ0FDQURRb0NBZ0lBd0VPTUJJZ05DZ0lDQWdIQ0RJZ1JDZ0lDQWdPQUFVUVJBSUFNUEN5QUNRUWhxSVFJZ0JFS0FnSUNBTUZFRVFDQUFRb0NBZ0lBd0lBQWdBaUFGTHdFR0VQb0ZEd3NnQUNBRFFRRWdBU0FCUVFGTUcwRUJheUFDRU5vRElRUWdBQ0FERUE4Z0JBc3dBUUovQWtBZ0FDQUJRUUFRa3dFaUF3UkFJQU1vQWlBb0Fnd29BaUF0QUFSRkRRRWdBQkJyQzBGL0lRSUxJQUlMY3dFQ2Z5TUFRVEJySWdJa0FBSi9JQUduUVlDQWdJQjRjaUFCUXYvLy8vOEhXQTBBR2lBQ0lBRTNBd0FnQWtFUWFpSURRUmhCeXZRQUlBSVFUaHBCQUNBQUlBTVFZaUlCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFhSUFBb0FoQWdBYWRCQVJDbkFnc2hBQ0FDUVRCcUpBQWdBQXNOQUNBQUlBRWdBa0VURU53REN6OEJBWDhnQWtJZ2lLZEJkVThFUUNBQ3B5SUVJQVFvQWdCQkFXbzJBZ0FMSUFBZ0FpQURFUDhDSVFJZ0FDQUJLQUpNSUFKQkFCQ0RCU0FBSUFJUUR3c01BQ0FBSUFFZ0FSQS9FSElMZ2dFQkFuOGpBRUVnYXlJRkpBQUNRQ0FCUVFwSElBSkJDVXR5UlFSQUlBQWdBa0VDZEVHUXBRUnFOUUlBRURBaEFnd0JDeUFBS0FJQUlRWWdCVUlBTndJWUlBVkNnSUNBZ0lDQWdJQ0FmemNDRUNBRklBWTJBZ3dnQlVFTWFpSUdJQUd0RURBZ0FDQUdJQUlnQXlBRUVLSUVjaUVDSUFZUUd3c2dCVUVnYWlRQUlBSUxtd1VCQTM4Z0FVRVFhaUVESUFFb0FoUWhBZ05BSUFJZ0EwWkZCRUFnQWtFWWF5RUVJQUlvQWdRaEFpQUFJQVFRL1FJTUFRc0xJQUFvQWhBZ0FTZ0NnQUlnQVNnQ2hBSWdBU2dDb0FJUTZ3VWdBVUdBQW1vUTlnRWdBQ2dDRUNJQ1FSQnFJQUVvQXN3Q0lBSW9BZ1FSQUFBZ0FDZ0NFQ0lDUVJCcUlBRW9BcVFDSUFJb0FnUVJBQUFnQUNnQ0VDSUNRUkJxSUFFb0F0Z0NJQUlvQWdRUkFBQkJBQ0VDQTBBZ0FTZ0N0QUloQXlBQ0lBRW9BcmdDVGtVRVFDQUFJQU1nQWtFRGRHb3BBd0FRRHlBQ1FRRnFJUUlNQVFzTElBQW9BaEFpQWtFUWFpQURJQUlvQWdRUkFBQWdBQ0FCS0FKd0VCTkJBQ0VDQTBBZ0FTZ0NkQ0VESUFJZ0FTZ0NmRTVGQkVBZ0FDQURJQUpCQkhScUtBSUFFQk1nQWtFQmFpRUNEQUVMQ3lBQUtBSVFJZ0pCRUdvZ0F5QUNLQUlFRVFBQVFRQWhBZ05BSUFFb0FvQUJJUU1nQWlBQktBS0lBVTVGQkVBZ0FDQURJQUpCQkhScUtBSUFFQk1nQWtFQmFpRUNEQUVMQ3lBQUtBSVFJZ0pCRUdvZ0F5QUNLQUlFRVFBQVFRQWhBZ05BSUFFb0F2d0JJUU1nQWlBQktBTDBBVTVGQkVBZ0FDQURJQUpCQkhScUtBSU1FQk1nQWtFQmFpRUNEQUVMQ3lBQUtBSVFJZ0pCRUdvZ0F5QUNLQUlFRVFBQVFRQWhBZ05BSUFFb0FzZ0NJUU1nQWlBQktBTEFBazVGQkVBZ0FDQURJQUpCQTNScUtBSUVFQk1nQWtFQmFpRUNEQUVMQ3lBQUtBSVFJZ0pCRUdvZ0F5QUNLQUlFRVFBQUlBRW9Bc3dCSWdJZ0FVSFFBV3BIQkVBZ0FDZ0NFQ0lEUVJCcUlBSWdBeWdDQkJFQUFBc2dBQ0FCS0FMc0FoQVRJQUZCOUFKcUVQWUJJQUFvQWhBaUFrRVFhaUFCS0FLTUF5QUNLQUlFRVFBQUlBRW9BZ1FFUUNBQktBSVlJZ0lnQVNnQ0hDSUROZ0lFSUFNZ0FqWUNBQ0FCUWdBM0FoZ0xJQUFvQWhBaUFFRVFhaUFCSUFBb0FnUVJBQUFMZ2dFQkFuOGdBQ0FCUVJCcUVNOEZBa0FnQVNnQ0lDSUNCRUFnQVNnQ1BDSURSUTBCQTBBZ0FpQURUMFVFUUNBQUlBSXBBd0FRSXlBQ1FRaHFJUUlnQVNnQ1BDRUREQUVMQ3lBQVFSQnFJQUVvQWlBZ0FDZ0NCQkVBQUFzZ0FDQUJLUU1ZRUNNZ0FDQUJLUU1BRUNNUEMwR0VoQUZCcnZ3QVFZbVVBVUhDNndBUUFBQUxhQUVCZmdKQUFrQWdBQkEwSWdOQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRTU1BUXNnQUNBRFFjQUFJQUZCQnhBWlFRQklEUUFnQUNBRFFla0FJQUpCQUVldFFvQ0FnSUFRaEVFSEVCbEJBRTROQVFzZ0FDQURFQTlDZ0lDQWdPQUFJUU1MSUFNTGpBRUJBbjhDUUFOQUlBRkNnSUNBZ0hCVURRRUNRQUpBQWtBQ1FBSkFBa0FnQWFjaUFpOEJCaUlEUVF4ckRnVUZBUU1IQVFBTElBTkJNRVlOQVNBRFFUUnJEZ1VBQmdZR0FBWUxJQUlvQWlBb0FqQVBDeUFDS0FJZ0lnSkZEUVFnQWkwQUVVVU5BU0FBRUxZQ1FRQVBDeUFDS0FJZ0lRSUxJQUlwQXdBaEFRd0JDd3NnQWlnQ0lDRUFDeUFBQ3lJQUlBQWdBa0VCYWhBcElnQUVRQ0FBSUFFZ0FoQWZJQUpxUVFBNkFBQUxJQUFMalFNQ0EzNEVmd0pBSUFFb0FnZ2lCa0grLy8vL0IwNEVRRUVCSVFjZ0FrRUJjUTBCUXYvLy8vLy8vLy8vL3dBaEF5QUdRZjcvLy84SFJ3MEJJQUUwQWdSQy8vLy8vLy8vLy8vL0FId2hBd3dCQ3lBR1FRQk1CRUFNQVFzZ0JrRS9UUVJBSUFFb0FoQWlDU0FCS0FJTUlnSkJBblJxUVFScktBSUFJUWhDQUNBR1FTQk5CSDRnQ0VFZ0lBWnJkcTBGSUFKQkFrOEVmaUFDUVFKMElBbHFRUWhyTlFJQUJVSUFDeUFJclVJZ2hvUkJ3QUFnQm11dGlBc2lBMzBnQXlBQktBSUVHeUVEREFFTElBSkJBWEZGQkVBZ0FTZ0NCRVVFUUVMLy8vLy8vLy8vLy84QUlRTkJBU0VIREFJTFFvQ0FnSUNBZ0lDQWdIOGhBMEVCSVFjZ0JrSEFBRWNOQVNBQktBSVFJQUVvQWd3aUFVRUNkR29pQWtFRWF6VUNBRUlnaGlFRUlBRkJBazhFZmlBQ1FRaHJOUUlBQlVJQUN5QUVoRUtBZ0lDQWdJQ0FnSUIvVWlFSERBRUxRZ0FnQVNnQ0VDSUlJQUVvQWd3aUFpQUNRUVYwSUFacklnWVFhSzBnQ0NBQ0lBWkJJR29RYUsxQ0lJYUVJZ045SUFNZ0FTZ0NCQnNoQXdzZ0FDQUROd01BSUFjTE13RUJmeUFBS0FJQUtBSVFJZ0ZCRUdvZ0FDZ0NCQ0FCS0FJRUVRQUFJQUJCQURZQ0RDQUFRZ0EzQWdRZ0FFRi9OZ0lVQzBZQUlBSkJBRXdFUUNBQVFTOFFMUThMSUFBZ0FrRUFFT29CSWdCRkJFQkNnSUNBZ09BQUR3c2dBRUVRYWlBQklBSVFIeUFDYWtFQU9nQUFJQUN0UW9DQWdJQ1FmNFFMYndJQmZ3RitBa0FDUUFKL0lBSkZCRUFnQUNnQ0VDQUJRUUFRc3dVTUFRc2dBU3dBQUVFNmEwRjJUdzBCSUFBb0FoQWdBU0FDRUxNRkN5SUREUUVMUVFBaEF5QUFJQUVnQWhDVEFpSUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ2dDRUNBRXB4RDhBeUVEQ3lBREN4d0FJQUFnQUNnQ0VDZ0NSQ0FCUVJoc2FpZ0NCRUhMOWdBUWp3RUxTQUVDZndKQUEwQWdBVUVLUmcwQklBRkJBblJCNG9BQ2FpOEJBQ0FBU2cwQklBRkJBWFFoQWlBQlFRRnFJUUVnQWtFQmRFSGtnQUpxTHdFQUlBQk1EUUFMUVFFUEMwRUFDM1FCQkg5QkFpRUNBa0FnQUNnQ0NDSUVRZi8vLy84SFJnMEFJQUVvQWdnaUJVSC8vLy8vQjBZTkFDQUFLQUlFSWdNZ0FTZ0NCRWNFUUNBRVFZQ0FnSUI0UmdSQVFRQWhBaUFGUVlDQWdJQjRSZzBDQzBFQklBTkJBWFJyRHd0QkFDQUFJQUVRMHdFaUFHc2dBQ0FER3lFQ0N5QUNDNGtCQVFSK0lBQVFQaUlFUW9DQWdJQndnMEtBZ0lDQTRBQlNCRUFnQVVFQUlBRkJBRW9iclNFR0EwQWdBeUFHVVFSQUlBUVBDeUFDSUFPblFRTjBhaWtEQUNJRlFpQ0lwMEYxVHdSQUlBV25JZ0VnQVNnQ0FFRUJhallDQUFzZ0FDQUVJQU1nQlVFQUVOSUJJUUVnQTBJQmZDRURJQUZCQUU0TkFBc2dBQ0FFRUE4TFFvQ0FnSURnQUF0UEFRRi9JQUVnQWpZQ0RDQUJJQUEyQWdBZ0FVRUFOZ0lVSUFFZ0F6WUNFQ0FCUVFBMkFnZ2dBU0FBSUFJZ0F4RHFBU0lBTmdJRUlBQUVmMEVBQlNBQlFYODJBaFFnQVVFQU5nSU1RWDhMQzd3QkFRRi9Jd0JCRUdzaUJTUUFJQVVnQXpjRENBSkFJQUVFUUNBQklBRW9BZ0JCQVdvMkFnQWdBQ0FCclVLQWdJQ0FjSVFnQWtFQklBVkJDR29RTHlFQ0lBQWdCU2tEQ0JBUFFYOGhBU0FDUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQUNBQ0VBOUJBU0VCREFFTElBQWdBeEFQSUFSQmdJQUJjVVVFUUVFQUlRRWdCRUdBZ0FKeFJRMEJJQUFvQWhBb0Fvd0JJZ1JGRFFFZ0JDMEFLRUVCY1VVTkFRc2dBRUgvR2tFQUVCVkJmeUVCQ3lBRlFSQnFKQUFnQVF0aEFnRi9BWDRDUUNBQlFRQklEUUFDUUFKQUFrQWdBQ2dDRUNnQ09DQUJRUUowYWlnQ0FDa0NCQ0lEUWo2SXAwRUJhdzREQXdJQUFRdEJBU0VDQWtBZ0EwSWdpS2RCLy8vLy93TnhEZ0lEQUFFTFFRSVBDeEFCQUF0QkFTRUNDeUFDQzZjRkFnbC9BbjRqQUVFZ2F5SURKQUFDUUNBQktRTkFJZ3RDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFRb0NBZ0lEZ0FDRU1JQUJCQ3hCMklndENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQURRZ0EzQXhnZ0EwSUFOd01RSUFOQ0FEY0RDQ0FBSUFOQkNHb2dBVUVBRUs4RklRUWdBQ2dDRUNJQ1FSQnFJQU1vQWdnZ0FpZ0NCQkVBQUFKQUFrQWdCQVJBSUFNb0FoUWhCZ3dCQ3lBTHB5RUhJQU1vQWh3aUNFRUFJQWhCQUVvYklRa2dBeWdDRkNFR1FRQWhCQUpBQTBBZ0JDQUpSd1JBQWtBQ1FBSkFJQVlnQkVFTWJHb2lBaWdDQ0NJRkJFQWdBeUFCTmdJQURBRUxBa0FnQUNBRElBTkJCR29nQVNBQ0tBSUFFUFFESWdVT0JBQUdCZ0lHQ3lBREtBSUVJUVVMSUFVb0FneEIvUUJHQkVBZ0FrRUNOZ0lFSUFJZ0F5Z0NBQ2dDRUNBRktBSUFRUU4wYWlnQ0JEWUNDQXdDQ3lBQ1FRRTJBZ1FnQlNnQ0JDSUtCRUFnQWlBS05nSUlEQUlMSUFJZ0F5Z0NBQ2dDU0NnQ0pDQUZLQUlBUVFKMGFpZ0NBRFlDQ0F3QkN5QUNRUUEyQWdRTElBUkJBV29oQkF3QkN3c2dCaUFJUVF4QndRQWdBQkMrQWtFQUlRUURRQ0FFSUFsR0RRTUNRQUpBQWtBZ0JpQUVRUXhzYWlJQ0tBSUVRUUZyRGdJQUFRSUxJQUlvQWdnaEJTQUFJQWNnQWlnQ0FFRW1FSG9pQWtVTkJDQUZJQVVvQWdCQkFXbzJBZ0FnQWlBRk5nSUFEQUVMSUFBZ0N5QUNLQUlBUVFFZ0FpZ0NDRUVHRUpVRFFRQklEUU1MSUFSQkFXb2hCQXdBQ3dBTElBQWdCU0FCSUFJb0FnQVE4d01MSUFBb0FoQWlBVUVRYWlBR0lBRW9BZ1FSQUFBZ0FDQUxFQThNQWdzZ0FDZ0NFQ0lFUVJCcUlBWWdCQ2dDQkJFQUFDQUFJQXRCMXdFZ0FFSCtBQkF0UVFBUUdSb2dCeUFITFFBRlFmNEJjVG9BQlNBQklBczNBMEFMSUF0Q0lJaW5RWFZQQkVBZ0M2Y2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBTElRd0xJQU5CSUdva0FDQU1DNGtFQWdSK0FuOENRQUpBSUFHOUlnUkNBWVlpQTFBTkFDQUJ2U0VDSUFDOUlnVkNOSWluUWY4UGNTSUdRZjhQUmcwQUlBSkMvLy8vLy8vLy8vLy9BSU5DZ1lDQWdJQ0FnUGovQUZRTkFRc2dBQ0FCb2lJQUlBQ2pEd3NnQXlBRlFnR0dJZ0phQkVBZ0FFUUFBQUFBQUFBQUFLSWdBQ0FDSUFOUkd3OExJQVJDTklpblFmOFBjU0VIQW40Z0JrVUVRRUVBSVFZZ0JVSU1oaUlDUWdCWkJFQURRQ0FHUVFGcklRWWdBa0lCaGlJQ1FnQlpEUUFMQ3lBRlFRRWdCbXV0aGd3QkN5QUZRdi8vLy8vLy8vOEhnMEtBZ0lDQWdJQ0FDSVFMSVFJQ2ZpQUhSUVJBUVFBaEJ5QUVRZ3lHSWdOQ0FGa0VRQU5BSUFkQkFXc2hCeUFEUWdHR0lnTkNBRmtOQUFzTElBUkJBU0FIYTYyR0RBRUxJQVJDLy8vLy8vLy8vd2VEUW9DQWdJQ0FnSUFJaEFzaEJDQUdJQWRLQkVBRFFBSkFJQUlnQkgwaUEwSUFVdzBBSUFNaUFrSUFVZzBBSUFCRUFBQUFBQUFBQUFDaUR3c2dBa0lCaGlFQ0lBWkJBV3NpQmlBSFNnMEFDeUFISVFZTEFrQWdBaUFFZlNJRFFnQlREUUFnQXlJQ1FnQlNEUUFnQUVRQUFBQUFBQUFBQUtJUEN3SkFJQUpDLy8vLy8vLy8vd2RXQkVBZ0FpRUREQUVMQTBBZ0JrRUJheUVHSUFKQ2dJQ0FnSUNBZ0FSVUlRY2dBa0lCaGlJRElRSWdCdzBBQ3dzZ0JVS0FnSUNBZ0lDQWdJQi9neUFEUW9DQWdJQ0FnSUFJZlNBR3JVSTBob1FnQTBFQklBWnJyWWdnQmtFQVNodUV2d3ZvRHdNSGZBaC9BbjVFQUFBQUFBQUE4RDhoQXdKQUFrQUNRQ0FCdlNJUlFpQ0lweUlQUWYvLy8vOEhjU0lKSUJHbklneHlSUTBBSUFDOUloSkNJSWluSVFvZ0VxY2lFRVVnQ2tHQWdNRC9BMFp4RFFBZ0NrSC8vLy8vQjNFaUMwR0FnTUQvQjBzZ0MwR0FnTUQvQjBZZ0VFRUFSM0Z5SUFsQmdJREEvd2RMY2tVZ0RFVWdDVUdBZ01EL0IwZHljVVVFUUNBQUlBR2dEd3NDUUFKQUFrQUNRQUpBQW45QkFDQVNRZ0JaRFFBYVFRSWdDVUgvLy8rWkJFc05BQnBCQUNBSlFZQ0F3UDhEU1EwQUdpQUpRUlIySVEwZ0NVR0FnSUNLQkVrTkFVRUFJQXhCc3dnZ0RXc2lEbllpRFNBT2RDQU1SdzBBR2tFQ0lBMUJBWEZyQ3lFT0lBd05BaUFKUVlDQXdQOEhSdzBCSUF0QmdJREEvd05ySUJCeVJRMEZJQXRCZ0lEQS93TkpEUU1nQVVRQUFBQUFBQUFBQUNBUlFnQlpHdzhMSUF3TkFTQUpRWk1JSUExcklneDJJZzBnREhRZ0NVY05BRUVDSUExQkFYRnJJUTRMSUFsQmdJREEvd05HQkVBZ0VVSUFXUVJBSUFBUEMwUUFBQUFBQUFEd1B5QUFvdzhMSUE5QmdJQ0FnQVJHQkVBZ0FDQUFvZzhMSUE5QmdJQ0Evd05ISUJKQ0FGTnlEUUFnQUo4UEN5QUFtU0VDSUJBTkFRSkFJQXBCQUVnRVFDQUtRWUNBZ0lCNFJpQUtRWUNBd1A5N1JuSWdDa0dBZ0VCR2NnMEJEQU1MSUFwRklBcEJnSURBL3dkR2NnMEFJQXBCZ0lEQS93TkhEUUlMUkFBQUFBQUFBUEEvSUFLaklBSWdFVUlBVXhzaEF5QVNRZ0JaRFFJZ0RpQUxRWUNBd1A4RGEzSkZCRUFnQXlBRG9TSUFJQUNqRHdzZ0E1b2dBeUFPUVFGR0d3OExSQUFBQUFBQUFBQUFJQUdhSUJGQ0FGa2JEd3NDUUNBU1FnQlpEUUFDUUFKQUlBNE9BZ0FCQWdzZ0FDQUFvU0lBSUFDakR3dEVBQUFBQUFBQThMOGhBd3NDZkNBSlFZR0FnSThFVHdSQUlBbEJnWURBbndSUEJFQWdDMEgvLzcvL0EwMEVRRVFBQUFBQUFBRHdmMFFBQUFBQUFBQUFBQ0FSUWdCVEd3OExSQUFBQUFBQUFQQi9SQUFBQUFBQUFBQUFJQTlCQUVvYkR3c2dDMEgrLzcvL0EwMEVRQ0FEUkp4MUFJZzg1RGQrb2tTY2RRQ0lQT1EzZnFJZ0EwUlo4L2pDSDI2bEFhSkVXZlA0d2g5dXBRR2lJQkZDQUZNYkR3c2dDMEdCZ01EL0EwOEVRQ0FEUkp4MUFJZzg1RGQrb2tTY2RRQ0lQT1EzZnFJZ0EwUlo4L2pDSDI2bEFhSkVXZlA0d2g5dXBRR2lJQTlCQUVvYkR3c2dBa1FBQUFBQUFBRHd2NkFpQUVSRTMxMzRDNjVVUHFJZ0FDQUFva1FBQUFBQUFBRGdQeUFBSUFCRUFBQUFBQUFBMEwraVJGVlZWVlZWVmRVL29LS2hva1QrZ2l0bFJ4WDN2NktnSWdJZ0FpQUFSQUFBQUdCSEZmYy9vaUlDb0wxQ2dJQ0FnSENEdnlJQUlBS2hvUXdCQ3lBQ1JBQUFBQUFBQUVCRG9pSUFJQUlnQzBHQWdNQUFTU0lKR3lFQ0lBQzlRaUNJcHlBTElBa2JJZ3hCLy84L2NTSUtRWUNBd1A4RGNpRUxJQXhCRkhWQnpIZEJnWGdnQ1J0cUlReEJBQ0VKQWtBZ0NrR1BzUTVKRFFBZ0NrSDY3QzVKQkVCQkFTRUpEQUVMSUFwQmdJQ0Evd055SVFzZ0RFRUJhaUVNQ3lBSlFRTjBJZ3BCZ0JscUt3TUFJQUs5UXYvLy8vOFBneUFMclVJZ2hvUy9JZ1FnQ2tId0dHb3JBd0FpQmFFaUJrUUFBQUFBQUFEd1B5QUZJQVNnb3lJSG9pSUN2VUtBZ0lDQWNJTy9JZ0FnQUNBQW9pSUlSQUFBQUFBQUFBaEFvQ0FISUFZZ0FDQUpRUkowSUF0QkFYWnFRWUNBb0lBQ2FxMUNJSWEvSWdhaW9TQUFJQVFnQmlBRm9hR2lvYUlpQkNBQ0lBQ2dvaUFDSUFLaUlnQWdBS0lnQUNBQUlBQWdBQ0FBUk85T1JVb29mc28vb2tSbDI4bVRTb2JOUDZDaVJBRkJIYWxnZE5FL29LSkVUU2FQVVZWVjFUK2dva1QvcTIvYnRtM2JQNkNpUkFNek16TXpNK00vb0tLZ0lnV2d2VUtBZ0lDQWNJTy9JZ0NpSWdZZ0JDQUFvaUFDSUFVZ0FFUUFBQUFBQUFBSXdLQWdDS0dob3FBaUFxQzlRb0NBZ0lCd2c3OGlBRVQxQVZzVTRDOCt2cUlnQWlBQUlBYWhvVVQ5QXpyY0NjZnVQNktnb0NJQ0lBcEJrQmxxS3dNQUlnUWdBaUFBUkFBQUFPQUp4KzQvb2lJQ29LQWdETGNpQmFDOVFvQ0FnSUJ3Zzc4aUFDQUZvU0FFb1NBQ29hRUxJUUlnQVNBUlFvQ0FnSUJ3Zzc4aUJLRWdBS0lnQWlBQm9xQWlBaUFBSUFTaUlnR2dJZ0M5SWhHbklRa0NRQ0FSUWlDSXB5SUtRWUNBd0lRRVRnUkFJQXBCZ0lEQWhBUnJJQWx5RFFNZ0FrVCtnaXRsUnhXWFBLQWdBQ0FCb1dSRkRRRU1Bd3NnQ2tHQStQLy9CM0ZCZ0pqRGhBUkpEUUFnQ2tHQTZMejdBMm9nQ1hJTkF5QUNJQUFnQWFGbFJRMEFEQU1MUVFBaENTQURBbndnQ2tILy8vLy9CM0VpQzBHQmdJRC9BMDhFZmtFQVFZQ0F3QUFnQzBFVWRrSCtCMnQySUFwcUlncEIvLzgvY1VHQWdNQUFja0dUQ0NBS1FSUjJRZjhQY1NJTGEzWWlDV3NnQ1NBUlFnQlRHeUVKSUFJZ0FVR0FnRUFnQzBIL0IydDFJQXB4clVJZ2hyK2hJZ0dndlFVZ0VRdENnSUNBZ0hDRHZ5SUFSQUFBQUFCREx1WS9vaUlESUFJZ0FDQUJvYUZFN3puNi9rSXU1aitpSUFCRU9XeW9ER0ZjSUw2aW9DSUNvQ0lBSUFBZ0FDQUFJQUNpSWdFZ0FTQUJJQUVnQVVUUXBMNXlhVGRtUHFKRThXdlN4VUc5dTc2Z29rUXMzaVd2YWxZUlA2Q2lSSk85dmhac3dXYS9vS0pFUGxWVlZWVlZ4VCtnb3FFaUFhSWdBVVFBQUFBQUFBQUF3S0NqSUFBZ0FpQUFJQU9ob1NJQW9pQUFvS0doUkFBQUFBQUFBUEEvb0NJQXZTSVJRaUNJcHlBSlFSUjBhaUlLUWYvL1Awd0VRQ0FBSUFrUTJnRU1BUXNnRVVMLy8vLy9ENE1nQ3ExQ0lJYUV2d3VpSVFNTElBTVBDeUFEUkp4MUFJZzg1RGQrb2tTY2RRQ0lQT1EzZnFJUEN5QURSRm56K01JZmJxVUJva1JaOC9qQ0gyNmxBYUlMRVFBZ0FDQUJJQUlnQXlBRVFRSVFpZ1FMUXdBQ2YwRUFJQUlvQWdBb0FnQkJHbllnQTBZTkFCcEJmeUFBSUFFZ0FoRFVBUTBBR2lBQ0tBSUFJZ0FnQUNnQ0FFSC8vLzhmY1NBRFFScDBjallDQUVFQUN3dThBUUVFZjBGL0lRSUNRQ0FBSUFGQkFCRFVBUTBBSUFFb0FpZ2lCQ0FCS0FJUUlnTW9BaUJxSWdVZ0F5Z0NIRXNFUUNBQUlBRkJFR29nQVNBRkVMd0ZEUUVMSUFFb0FpUWhBMEVBSVFJRFFDQUNJQVJHUlFSQUlBQWdBU0FDUVlDQWdJQjRja0VIRUhvZ0F5a0RBRGNEQUNBQ1FRRnFJUUlnQTBFSWFpRUREQUVMQ3lBQUtBSVFJZ0JCRUdvZ0FTZ0NKQ0FBS0FJRUVRQUFRUUFoQWlBQlFRQTJBaWdnQVVJQU53TWdJQUVnQVMwQUJVSDNBWEU2QUFVTElBSUxkQUVEZndKQUFrQWdBRUVCY1EwQUlBRkJnUUp4UVlFQ1JpQUJRWUFJY1VFQUlBQWdBWE5CQkhFYmNnMEJJQUZCZ1BRQWNVVU5BQ0FBUVRCeElnTkJFRVlnQVVHQU1IRWlCRUVBUjNNTkFTQUFRUUp4SUFGQmdnUnhRWUlFUjNJZ0EwRVFSbklOQUNBRVJRMEJDMEVCSVFJTElBSUxQUUVCZnlBQklBQW9BdFFCSUFFb0FoUkJJQ0FBS0FMSUFXdDJRUUowYWlJQ0tBSUFOZ0lvSUFJZ0FUWUNBQ0FBSUFBb0F0QUJRUUZxTmdMUUFRdkpBUUVEZndKQUlBRkNnSUNBZ0hCYUJFQWdBYWNpQnlnQ0VDSUdRVEJxSVFnZ0JpQUdLQUlZSUFKeFFYOXpRUUowYWlnQ0FDRUdBa0FEUUNBR1JRMEJJQUlnQ0NBR1FRRnJRUU4wYWlJR0tBSUVSd1JBSUFZb0FnQkIvLy8vSDNFaEJnd0JDd3NRQVFBTElBQWdCeUFDSUFWQkIzRkJNSElRZWlJQ1JRUkFRWDhQQzBFQklRWWdBQ0FBS0FJQVFRRnFOZ0lBSUFJZ0FEWUNBQ0FBUVFOeERRRWdBaUFFTmdJRUlBSWdBQ0FEY2pZQ0FBc2dCZzhMUWN1UEFVR3UvQUJCM3NnQVFlQWJFQUFBQ3lFQUlBQWdBVUV3SUFPdFFRRVFHUm9nQUNBQlFUWWdBQ0FDRUMxQkFSQVpHZ3ZGQndNQ2ZnVi9BbndqQUVFUWF5SUdKQUJCQnlBQlFRaHJJZ2dwQXdBaUJFSWdpS2NpQlNBRlFRZHJRVzVKR3lFRkFuOENRQUpBUVFjZ0FVRVFheUlIS1FNQUlnTkNJSWluSWdFZ0FVRUhhMEZ1U1JzaUFVRi9SaUFGUVg1eFFRSkhjVVVnQVVGK2NVRUNSaUFGUVg5SGNuRU5BQ0FBSUFaQkNHb2dBeUFFSUFKQkFFRUJFSVVDSWdGRkRRQWdBQ0FERUE4Z0FDQUVFQThnQVVFQVNBMEJJQWNnQmlrRENEY0RBRUVBREFJTEFrQWdBQ0FEUVFFUW1nRWlBMEtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQVFoQXd3QkN5QUFJQVJCQVJDYUFTSUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQUNRRUVISUFOQ0lJaW5JZ0VnQVVFSGEwRnVTUnNpQlVGNVIwRUhJQVJDSUlpbklnRWdBVUVIYTBGdVNSc2lBVUY1UjNKRkJFQWdBNmNnQktjUWd3SWhBUUovQWtBQ1FBSkFBa0FnQWtHakFXc09Bd0FCQWdNTElBRkJIM1lNQXdzZ0FVRUFUQXdDQ3lBQlFRQktEQUVMSUFGQkFFNExJUUVnQUNBREVBOGdBQ0FFRUE4TUFRc0NRRUVCSUFWMFFZY0JjVVVnQlVFSFMzSWdBVUVIUzNKQkFVRUJJQUYwUVljQmNSdEZEUUFDUUFKQUlBVkJka1lnQVVGNVJuRWdBVUYyUmlBRlFYbEdjWEpGRFFBZ0FDZ0NFQ2dDakFFaUNRUkFJQWt0QUNoQkJIRU5BUXNDUUNBRlFYbEdCRUFnQUNBREVMd0NJZ05DZ0lDQWdIQ0RRb0NBZ0lEZ2ZsSU5BUXNnQVVGNVJ3MENJQUFnQkJDOEFpSUVRb0NBZ0lCd2cwS0FnSUNBNEg1UkRRSUxJQUFnQXhBUElBQWdCQkFQUVFBaEFRd0RDeUFBSUFNUWJDSURRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdCQ0VEREFRTElBQWdCQkJzSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXdzQ1FFRUhJQU5DSUlpbklnRWdBVUVIYTBGdVNSc2lCVUYxUndSQVFRY2dCRUlnaUtjaUFTQUJRUWRyUVc1Skd5SUJRWFZIRFFFTElBQWdBaUFESUFRZ0FDZ0NFQ2dDM0FJUkhBQWlBVUVBU0EwRURBSUxJQVZCZDBjZ0FVRjNSM0ZGQkVBZ0FDQUNJQU1nQkNBQUtBSVFLQUxBQWhFY0FDSUJRUUJJRFFRTUFnc2dCVUYyUnlBQlFYWkhjUTBBSUFBZ0FpQURJQVFnQUNnQ0VDZ0NwQUlSSEFBaUFVRUFUZzBCREFNTElBUkNnSUNBZ01DQmdQei9BSHkvSUFTbnR5QUJRUWRHR3lFS0lBTkNnSUNBZ01DQmdQei9BSHkvSUFPbnR5QUZRUWRHR3lFTEFrQUNRQUpBQWtBZ0FrR2pBV3NPQXdBQkFnTUxJQW9nQzJRaEFRd0RDeUFLSUF0bUlRRU1BZ3NnQ2lBTFl5RUJEQUVMSUFvZ0MyVWhBUXNnQnlBQlFRQkhyVUtBZ0lDQUVJUTNBd0JCQUF3Q0N5QUFJQU1RRHdzZ0IwS0FnSUNBTURjREFDQUlRb0NBZ0lBd053TUFRWDhMSVFBZ0JrRVFhaVFBSUFBTEJBQkJBQXR0QWdKK0FuOUJmeUVGQWtBZ0FDQUJRUWhySWdZcEF3QWlCQ0FDRU9jQklnTkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQVFRRHlBR0lBTTNBd0FnQUNBRFFlb0FJQU5CQUJBVUlnTkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUJJQU0zQXdCQkFDRUZDeUFGQzdFQkFnTi9BWDRnQUNnQ0VDRUZJQUFnQWtFRGRFRVlhaEFwSWdRRVFDQUVJQUkyQWhBZ0JDQUJOZ0lNSUFRZ0FEWUNDRUVBSVFBZ0FrRUFJQUpCQUVvYklRRURRQ0FBSUFGSEJFQWdBeUFBUVFOMElnSnFLUU1BSWdkQ0lJaW5RWFZQQkVBZ0I2Y2lCaUFHS0FJQVFRRnFOZ0lBQ3lBQ0lBUnFJQWMzQXhnZ0FFRUJhaUVBREFFTEN5QUZLQUtnQVNJQUlBUTJBZ1FnQkNBRlFhQUJhallDQkNBRUlBQTJBZ0FnQlNBRU5nS2dBUXNMUEFFQmZ3TkFJQUlnQTBaRkJFQWdBQ0FCSUFOQkEzUnFLUU1BRUE4Z0EwRUJhaUVEREFFTEN5QUFLQUlRSWdCQkVHb2dBU0FBS0FJRUVRQUFDNFVCQVFKL0l3QkJFR3NpQlNRQUFrQWdBa0tBZ0lDQWNJTkNnSUNBZ0pCL1VnUkFJQUpDSUlpblFYVkpEUUVnQXFjaUFDQUFLQUlBUVFGcU5nSUFEQUVMSUFBZ0JVRU1haUFDRU9VQklnWkZCRUJDZ0lDQWdPQUFJUUlNQVFzZ0FDQUJJQVlnQlNnQ0RFSFNpQUVnQXlBRUVNb0ZJUUlnQUNBR0VGUUxJQVZCRUdva0FDQUNDN3dCQWdOK0FYOGpBRUVRYXlJQ0pBQkNnSUNBZ09BQUlRVUNRQ0FBSUFFUVlBMEFJQU1wQXdBaEJnSkFBa0FnQXlrRENDSUhRaUNJcHlJRFFRTkhCRUFnQkVFQ1JnMENJQU5CQWtZTkFRd0NDeUFFUVFKR0RRRUxJQUFnQVNBR1FRQkJBQkFoSVFVTUFRc2dBQ0FDUVF4cUlBY1FpUVFpQTBVTkFDQUNLQUlNSVFnQ2ZpQUVRUUZ4QkVBZ0FDQUJJQVlnQ0NBREVKQUREQUVMSUFBZ0FTQUdJQWdnQXhBaEN5RUZJQUFnQXlBSUVKc0RDeUFDUVJCcUpBQWdCUXM5QWdGL0FuNGdBQ0FCRU0wRklnTkNnSUNBZ0hDRElnUkNnSUNBZ0RCU0JIOGdCRUtBZ0lDQTRBQlNCRUFnQUNBREVBOUJBUThMUVg4RlFRQUxDMDRDQVg4QmZpTUFRUkJySWdJa0FBSitJQUZCL3dGTkJFQWdBaUFCT2dBUElBQWdBa0VQYWtFQkVJUUREQUVMSUFJZ0FUc0JEQ0FBSUFKQkRHcEJBUkR1QXdzaEF5QUNRUkJxSkFBZ0F3dE5BUUYvSXdCQkVHc2lBeVFBSUFNZ0FUa0RDQ0FESUFJMkFnQWdBRUdBQVVHVjN3QWdBeEJPSWdCQmdBRk9CRUJCb09BQVFhNzhBRUdEMlFCQmlZd0JFQUFBQ3lBRFFSQnFKQUFnQUF1WUFnRUNmd0ovSUFGQi93Qk5CRUFnQUNBQk9nQUFJQUJCQVdvTUFRc0NRQ0FCUWY4UFRRUkFJQUFnQVVFR2RrSEFBWEk2QUFBZ0FDRUNEQUVMQW44Z0FVSC8vd05OQkVBZ0FDQUJRUXgyUWVBQmNqb0FBQ0FBUVFGcURBRUxBa0FnQVVILy8vOEFUUVJBSUFBZ0FVRVNka0h3QVhJNkFBQWdBQ0VDREFFTEFuOGdBVUgvLy84ZlRRUkFJQUZCR0haQmVISWhBeUFBUVFGcURBRUxJQUFnQVVFWWRrRS9jVUdBQVhJNkFBRWdBVUVlZGtGOGNpRURJQUJCQW1vTElRSWdBQ0FET2dBQUlBSWdBVUVTZGtFL2NVR0FBWEk2QUFBTElBSWdBVUVNZGtFL2NVR0FBWEk2QUFFZ0FrRUNhZ3NpQWlBQlFRWjJRVDl4UVlBQmNqb0FBQXNnQWlBQlFUOXhRWUFCY2pvQUFTQUNRUUpxQ3lBQWF3dUlBZ0lGZndGK0lBRW9BZ3doQWdKQUFrQUNRQ0FCS1FJRUlnZENnSUNBZ0lDQWdJQkFXZ1JBSUFBb0FqZ2hCQXdCQ3dKQUlBRWdBQ2dDT0NJRUlBQW9BalFnQjBJZ2lLY2dBQ2dDSkVFQmEzRkJBblJxSWdNb0FnQWlCVUVDZEdvb0FnQWlCa1lFUUNBRElBSTJBZ0FNQVFzRFFDQUdJUU1nQlVVTkF5QUVJQU1vQWd3aUJVRUNkR29vQWdBaUJpQUJSdzBBQ3lBRElBSTJBZ3dMSUFVaEFnc2dCQ0FDUVFKMGFpQUFLQUk4UVFGMFFRRnlOZ0lBSUFBZ0FqWUNQQ0FBUVJCcUlBRWdBQ2dDQkJFQUFDQUFJQUFvQWlnaUFFRUJhellDS0NBQVFRQk1EUUVQQzBHWmtBRkJydndBUWRnV1Fjd3ZFQUFBQzBHU2pnRkJydndBUWV3V1Fjd3ZFQUFBQ3lrQkFuOENRQ0FBUW9DQWdJQndWQTBBSUFDbklnSXZBUVlRN2dGRkRRQWdBaWdDSUNFQkN5QUJDNG9EQVFOL0lBQWdBQ2dDQUNJQlFRRnJJZ0kyQWdBQ1FDQUJRUUZLRFFBZ0FrVUVRQ0FBS0FJUUlRSkJBQ0VCSUFCQkFCQ1BCQ0FBSUFBcEE4QUJFQThnQUNBQUtRUElBUkFQSUFBZ0FDa0RzQUVRRHlBQUlBQXBBN2dCRUE4Z0FDQUFLUU9vQVJBUEEwQWdBVUVJUmdSQVFRQWhBUU5BSUFBb0FpZ2hBeUFCSUFJb0FrQk9SUVJBSUFBZ0F5QUJRUU4wYWlrREFCQVBJQUZCQVdvaEFRd0JDd3NnQWtFUWFpQURJQUlvQWdRUkFBQWdBQ0FBS1FPWUFSQVBJQUFnQUNrRG9BRVFEeUFBSUFBcEExQVFEeUFBSUFBcEEwQVFEeUFBSUFBcEEwZ1FEeUFBSUFBcEF6Z1FEeUFBSUFBcEF6QVFEeUFBS0FJa0lnRUVRQ0FBS0FJUUlBRVFrUUlMSUFBb0FoUWlBU0FBS0FJWUlnSTJBZ1FnQWlBQk5nSUFJQUJDQURjQ0ZDQUFLQUlJSWdFZ0FDZ0NEQ0lDTmdJRUlBSWdBVFlDQUNBQVFnQTNBZ2dnQUNnQ0VDSUJRUkJxSUFBZ0FTZ0NCQkVBQUF3REJTQUFJQUFnQVVFRGRHb3BBMWdRRHlBQlFRRnFJUUVNQVFzQUN3QUxRZk9PQVVHdS9BQkI2QkZCclNVUUFBQUxDL1lCQVFOL0FrQWdBRVVFUUVHZ3lRUW9BZ0FFUUVHZ3lRUW9BZ0FRcFFNaEFRdEJpTWdFS0FJQUJFQkJpTWdFS0FJQUVLVURJQUZ5SVFFTFFhVFVCQ2dDQUNJQVJRMEJBMEFnQUNnQ1RCb2dBQ2dDRkNBQUtBSWNSd1JBSUFBUXBRTWdBWEloQVFzZ0FDZ0NPQ0lBRFFBTERBRUxJQUFvQWt4QkFFNGhBZ0pBQWtBZ0FDZ0NGQ0FBS0FJY1JnMEFJQUJCQUVFQUlBQW9BaVFSQVFBYUlBQW9BaFFOQUVGL0lRRWdBZzBCREFJTElBQW9BZ1FpQVNBQUtBSUlJZ05IQkVBZ0FDQUJJQU5yckVFQklBQW9BaWdSRUFBYUMwRUFJUUVnQUVFQU5nSWNJQUJDQURjREVDQUFRZ0EzQWdRZ0FrVU5BUXNMSUFFTDd3RUJBbjhDZndKQUlBRkIvd0Z4SWdNRVFDQUFRUU54QkVBRFFDQUFMUUFBSWdKRklBSWdBVUgvQVhGR2NnMERJQUJCQVdvaUFFRURjUTBBQ3dzQ1FDQUFLQUlBSWdKQmYzTWdBa0dCZ29RSWEzRkJnSUdDaEhoeERRQWdBMEdCZ29RSWJDRURBMEFnQWlBRGN5SUNRWDl6SUFKQmdZS0VDR3R4UVlDQmdvUjRjUTBCSUFBb0FnUWhBaUFBUVFScUlRQWdBa0dCZ29RSWF5QUNRWDl6Y1VHQWdZS0VlSEZGRFFBTEN3TkFJQUFpQWkwQUFDSURCRUFnQWtFQmFpRUFJQU1nQVVIL0FYRkhEUUVMQ3lBQ0RBSUxJQUFRUHlBQWFnd0JDeUFBQ3lJQVFRQWdBQzBBQUNBQlFmOEJjVVliQzlRREF3Si9CSHdCZmlBQXZTSUhRaUNJcHlFQkFrQUNmQUo4QWtBZ0FVSDVoT3IrQTBzZ0IwSUFXWEZGQkVBZ0FVR0FnTUQvZTA4RVFFUUFBQUFBQUFEdy95QUFSQUFBQUFBQUFQQy9ZUTBFR2lBQUlBQ2hSQUFBQUFBQUFBQUFvdzhMSUFGQkFYUkJnSUNBeWdkSkRRUWdBVUhGL2NyK2UwOE5BVVFBQUFBQUFBQUFBQXdDQ3lBQlFmLy92LzhIU3cwREN5QUFSQUFBQUFBQUFQQS9vQ0lEdlNJSFFpQ0lwMEhpdmlWcUlnRkJGSFpCL3dkcklRSWdBQ0FEb1VRQUFBQUFBQUR3UDZBZ0FDQURSQUFBQUFBQUFQQy9vS0VnQVVILy83K0FCRXNiSUFPalJBQUFBQUFBQUFBQUlBRkIvLysvbWdSTkd5RUZJQWRDLy8vLy93K0RJQUZCLy84L2NVR2V3WnIvQTJxdFFpQ0doTDlFQUFBQUFBQUE4TCtnSVFBZ0FyY0xJZ05FQUFEZy9rSXU1aitpSUFBZ0FDQUFSQUFBQUFBQUFBQkFvS01pQkNBQUlBQkVBQUFBQUFBQTREK2lvaUlHSUFRZ0JLSWlCQ0FFb2lJQUlBQWdBRVNmeG5qUUNackRQNkpFcjNpT0hjVnh6RCtnb2tRRStwZVptWm5aUDZDaUlBUWdBQ0FBSUFCRVJGSSszeEx4d2oraVJONER5NVprUnNjL29LSkVXWk1pbENSSjBqK2dva1NUVlZWVlZWWGxQNkNpb0tDaUlBTkVkang1TmU4NTZqMmlJQVdnb0NBR29hQ2dDdzhMSUFBTE9RRUNmeUFCUVFBZ0FVRUFTaHNoQVFOQUlBRWdBa1lFUUVFQUR3c2dBa0VDZENFRElBSkJBV29oQWlBQUlBTnFLQUlBUlEwQUMwRUJDejhCQW44RFFDQUJSU0FDSUFOTmNrVUVRQ0FBSUFOQkFuUnFJZ1FnQVNBRUtBSUFJZ0ZxSWdRMkFnQWdBU0FFU3lFQklBTkJBV29oQXd3QkN3c2dBUXVDQndFTWYwRURRWUNBZ0lBQ1FRRkJIQ0FDUVFWMlFUOXhJZ1ZyZENBRlFUOUdHeUlPYXlFUEFrQUNRQUpBQW44Z0FrRVFjUVJBUWYvLy8vOERJQUZCLy8vLy93TkdEUUVhSUFBb0FnZ2dBV29NQVFzZ0FTQUFLQUlJSWdVZ0QwNE5BQm9nQVNBQ1FRaHhSUTBBR2lBQlFmLy8vLzhEUmcwQklBNUJBMnNnQVdvZ0JXb0xJUVlnQTBFRmRDRUxBa0FDUUNBQ1FRZHhJZ3hCQmtZRVFDQUFLQUlRSWdjZ0F5QUxJQVpCZjNOcUVKa0NJUVVNQVFzQ2Z5QUxRWDhnQmlBR1FRQklHMnRCQW1zaUNFRUFTQVJBSUFBb0FoQWhCMEVBREFFTFFRRWhDU0FBS0FJUUlnY2dDRUVGZGlJRlFRSjBhaWdDQUVGL1FYNGdDSFJCZjNNZ0NFRWZjVUVmUmh0eFJRUkFBMEFnQlVFQVNpRUpRUUFnQlVFQVRBMENHaUFISUFWQkFXc2lCVUVDZEdvb0FnQkZEUUFMQzBFQkN5QUhJQU1nQ3lBR1FYOXphaENaQWlJSWNpRUtRUUFoQlFKQUFrQUNRQUpBQWtBQ1FDQU1EZ2NBQlFRRUFnRUNBd3NnQ1NBSUlnVkZjZzBFSUFjZ0F5QUxJQVpyRUprQ0lRVU1CQXRCQVNFRklBb05CQ0FHUVFCS0RRY01DQXNnQ0NFRklBb05Bd3dFQ3hBQkFBc2dDa0VBSUFBb0FnUWdERUVDUmtZYklRVUxJQXBGRFFFTElBUkJFSEloQkFzZ0JrRUFUQVJBSUFWRkRRTWdBRUVCRUVFYUlBQW9BaEJCZ0lDQWdIZzJBZ0FnQUNBQUtBSUlJQVpyUVFGcU5nSUlJQVJCR0hJUEN5QUZSUTBCSUFzZ0Jtc2lCVUVGZFNJSUlBTWdBeUFJU1JzaERFRUJJUXBCQVNBRmRDRUpJQWdoQlFOQUlBVWdERVlFUUNBRElRVURRQ0FGUVFGcklnVWdDRWhGQkVBZ0J5QUZRUUowYWlJSklBcEJIM1FnQ1NnQ0FDSUtRUUYyY2pZQ0FBd0JDd3NnQUNBQUtBSUlRUUZxTmdJSURBTUxJQWNnQlVFQ2RHb2lEU0FOS0FJQUlnMGdDV29pRURZQ0FFRUJJUWtnQlVFQmFpRUZJQTBnRUVzTkFBc01BUXRCOElVQlFkVDhBRUg1QTBHMThnQVFBQUFMSUE4Z0FDZ0NDQ0lGU2dSQUlBSkJDSEZGRFFFZ0JFRUJka0VJY1NBRWNpRUVDeUFGSUE1S0JFQWdBQ0FBS0FJRUlBRWdBaENyQkE4TFFRQWhCUUpBSUFzZ0Jtc2lBVUVBU0EwQUlBRkJCWFVoQlNBQlFSOXhJZ0ZGRFFBZ0J5QUZRUUowYWlJQ0lBSW9BZ0JCZjBFZ0lBRnJkRUYvY3lBQmRIRTJBZ0FMQTBBZ0JTSUJRUUZxSVFVZ0J5QUJRUUowYWlJQ0tBSUFSUTBBQ3lBQlFRQktCRUFnQnlBQ0lBTWdBV3NpQTBFQ2RCQ2NBUXNnQUNBREVFRWFJQVFQQ3lBQUlBQW9BZ1FRaVFFZ0JFRVljZ3NyQUNBQVFZQUJUd1IvSUFCQnp3Rk5CRUFnQUVHQUJXb1BDeUFBUVFGMFFmN0dBMm92QVFBRklBQUxDNHNDQVFOL0l3QkJFR3NpQkNRQUFrQWdCRUVNYWlBQUlBSWdBeENrQmlJQ1FRQklEUUFnQVNBQ2FpRURJQVFvQWd3aEFRTkFJQU5CQVdvaEFnSkFJQU10QUFBaUJVRS9UUVJBSUFWQkEzWWdBV3BCQVdvaUFTQUFTdzBESUFRZ0JVRUhjU0FCYWtFQmFpSUJOZ0lNSUFaQkFYTWhCZ3dCQ3lBRndFRUFTQVJBSUFRZ0FTQUZha0gvQUdzaUFUWUNEQXdCQ3lBQ0xRQUFJUUlnQlVIZkFFMEVRQ0FFSUFWQkNIUWdBbklnQVdwQi8vOEFheUlCTmdJTUlBTkJBbW9oQWd3QkN5QUVJQU10QUFJZ0JVRVFkQ0FDUVFoMGNuSWdBV3BCLy8vL0Ftc2lBVFlDRENBRFFRTnFJUUlMSUFBZ0FVa05BU0FHUVFGeklRWWdBaUVEREFBTEFBc2dCRUVRYWlRQUlBWUx2UUlCQjM4Q1FDQUJSUTBBQTBBZ0FrRURSZ1JBSUFGQkFYRWlCVVVnQVVFR2NVVnlJUWNEUUNBRVFla0NSZzBEQWtBQ1FDQURJQVJCQW5SQmtJSUNhaWdDQUNJQ1FRUjJRUTl4SWdaMlFRRnhSUTBBSUFKQkQzWWhBU0FDUVFoMlFmOEFjU0VJQWtBQ1FBSkFJQVpCQkdzT0FnQUJBZ3NnQjBVTkFTQUJJQVZxSVFaQkFDRUNBMEFnQWlBSVR3MERJQUlnQm1vaEFTQUNRUUpxSVFJZ0FDQUJJQUZCQVdvUWZrVU5BQXNNQXdzZ0IwVU5BQ0FCUVFGcUlRSWdCVVVFUUNBQUlBRWdBaEIrRFFNTElBQWdBaUFCUVFKcUlnSVFma1VFUUNBRlJRMENJQUFnQWlBQlFRTnFFSDVGRFFJTFFYOFBDeUFBSUFFZ0FTQUlhaEIrRFFFTElBUkJBV29oQkF3QkN3dEJmdzhGSUFFZ0FuWkJBWEVFUUNBQ1FRSjBRYkQrQTJvb0FnQWdBM0loQXdzZ0FrRUJhaUVDREFFTEFBc0FDMEVBQzdBQ0FnTi9BWDRqQUVFUWF5SUZKQUFDUUNBQUlBRkJBaEJsSWdkQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUFKQUFrQWdBa0VCUncwQUlBTXBBd0FpQVVJZ2lLY2lCRUVBSUFSQkMycEJFa2tiRFFBZ0FDQUZRUXhxSUFGQkFSRENBZzBCSUFBZ0IwRXdBbjRnQlNnQ0RDSUNRUUJPQkVBZ0FxME1BUXRDZ0lDQWdNQitJQUs0dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJGUVFCSURRRU1BZ3RCQUNFRUlBSkJBQ0FDUVFCS0d5RUNBMEFnQWlBRVJnMENJQU1nQkVFRGRHb3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUdJQVlvQWdCQkFXbzJBZ0FMSUFBZ0J5QUVJQUVRcFFFaEJpQUVRUUZxSVFRZ0JrRUFUZzBBQ3dzZ0FDQUhFQTlDZ0lDQWdPQUFJUWNMSUFWQkVHb2tBQ0FIQ3g0QUlBQkJNR3RCQ2trZ0FFRmZjVUhCQUd0QkdrbHlJQUJCM3dCR2NndE1BUUovSXdCQkVHc2lBeVFBQW44Z0FpQUJLQUlBSWdRdEFBQkhCRUFnQXlBQ05nSUFJQUJCb0pnQklBTVFPa0YvREFFTElBRWdCRUVCYWpZQ0FFRUFDeUVCSUFOQkVHb2tBQ0FCQzZ3QkF3RjhBWDRCZnlBQXZTSUNRalNJcDBIL0QzRWlBMEd5Q0UwRWZDQURRZjBIVFFSQUlBQkVBQUFBQUFBQUFBQ2lEd3NDZkNBQUlBQ2FJQUpDQUZrYklnQkVBQUFBQUFBQU1FT2dSQUFBQUFBQUFERERvQ0FBb1NJQlJBQUFBQUFBQU9BL1pBUkFJQUFnQWFCRUFBQUFBQUFBOEwrZ0RBRUxJQUFnQWFBaUFDQUJSQUFBQUFBQUFPQy9aVVVOQUJvZ0FFUUFBQUFBQUFEd1A2QUxJZ0FnQUpvZ0FrSUFXUnNGSUFBTEM1QUZBUWQvQWtBQ1FDQUJRZjhBVFFSQUlBSkZEUUVnQVVFZ2FpQUJJQUZCd1FCclFScEpHeUVCREFJTElBSkJBRWNoQ0VIb0FpRUZBMEFnQXlBRlNnMENJQUVnQXlBRmFrRUJkaUlHUVFKMFFaQ0NBbW9vQWdBaUIwRVBkaUlFU1FSQUlBWkJBV3NoQlF3QkN5QUJJQWRCQ0haQi93QnhJQVJxVHdSQUlBWkJBV29oQXd3QkN3c2dCMEVJZEVHQUhuRWlDU0FHUWNDTkFtb3RBQUFpQlhJaEF3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUhRUVIySWdkQkQzRWlCZzROQUFBQUFBRUNBd1FGQmdZSEJ3Z0xJQUpCQWtjZ0JrRUNTWElnQWlBSFFRRnhSM0VOQ1NBQklBUnJJQU5CQW5SQmtJSUNhaWdDQUVFUGRtb2hBUXdKQ3lBQklBUnJJZ05CQVhFZ0FrRUFSMFlOQ0NBRFFRRnpJQVJxSVFFTUNBc2dBU0FFYXlJRVFRRkdCRUJCQVVGL0lBSWJJQUZxSVFFTUNBc2dCQ0FDUlVFQmRFY05CMEVDUVg0Z0Foc2dBV29oQVF3SEN5QUJJQVJySVFFZ0FrVUVRQ0FBUVprSE5nSUVJQUFnQVNBRFFRVjJRZjRBY1VHd2tBSnFMd0VBYWpZQ0FFRUNEd3NnQVNBRlFUOXhRUUYwUWJDUUFtb3ZBUUJxSVFFTUJnc2dBa0VCUmcwRklBTWdBa0VDUmtFRmRHb2hBUXdGQ3lBQ1FRRkdEUVFnQTBFQmRFR3drQUpxTHdFQUlBSkJBa1pxSVFFTUJBc2dCa0VKYXlBSVJ3MERJQU5CQVhSQnNKQUNhaThCQUNFQkRBTUxJQVpCQzJzZ0FrY05BaUFBSUFWQlAzRkJBWFJCc0pBQ2FpOEJBRFlDQkNBQUlBTkJCWFpCL2dCeFFiQ1FBbW92QVFBZ0FTQUVhMm8yQWdCQkFnOExJQUlOQVNBQUlBbEJCM1pCc0pBQ2FpOEJBRFlDQUNBQUlBVkJEM0ZCQVhSQnNKQUNhaThCQURZQ0NDQUFJQVZCQTNaQkhuRkJzSkFDYWk4QkFEWUNCRUVERHdzZ0FVRWdheUFCSUFGQjRRQnJRUnBKR3lFQkN5QUFJQUUyQWdCQkFRdWdBUUVHZnlBRVFRQWdCRUVBU2hzaENTQUJRUkJxSVFjZ0FFRVFhaUVJSUFBaENrRUFJUVFDUUFOQUlBUWdDVVlOQVNBQ0lBUnFJUUFnQXlBRWFpRUZJQVJCQVdvaEJBSi9JQW90QUFkQmdBRnhCRUFnQ0NBQVFRRjBhaThCQUF3QkN5QUFJQWhxTFFBQUN5SUFBbjhnQVMwQUIwR0FBWEVFUUNBSElBVkJBWFJxTHdFQURBRUxJQVVnQjJvdEFBQUxJZ1ZHRFFBTElBQWdCV3NoQmdzZ0JndHNBUUYvQWtBQ1FDQUJRaUNJcHlJQ1FYOUhCRUFnQWtGNFJ3MEJEQUlMSUFHbklnSXZBUVpCQjBjTkFDQUNLUU1nSWdGQ2dJQ0FnSENEUW9DQWdJQ0FmMUlOQUF3QkN5QUFRZmJTQUVFQUVCVkNnSUNBZ09BQUR3c2dBYWNpQUNBQUtBSUFRUUZxTmdJQUlBRUxDUUFnQUNBQkVPd0RDOXdCQVFOL0l3QkJFR3NpQkNRQUFrQUNRQ0FCUW9DQWdJQndWQTBBSUFHbklnSXZBUVpCTUVZRVFBSkFJQUFnQkVFSWFpQUJRZUlBRUlFQklnTkZEUUFnQkNrRENDSUJRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFJQU1wQXdBUXRnTWhBZ3dFQ3lBQUlBRWdBeWtEQ0VFQklBTVFMeUlCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBQkVDWWlBa1VOQWlBQUlBTXBBd0FRbVFFaUEwRUFTQTBBSUFORkRRTWdBRUdUTjBFQUVCVUxRWDhoQWd3Q0N5QUNJQUl0QUFWQi9nRnhPZ0FGUVFFaEFnd0JDMEVBSVFJTElBUkJFR29rQUNBQ0M3QUVBd1YrQTM4QmZDTUFRUkJySWdza0FFRi9JUW9DUUNBQUlBdEJDR29nQVJDYkFnMEFBbndnQ3lzRENDSU52VUwvLy8vLy8vLy8vLzhBZzBLQmdJQ0FnSUNBK1A4QVdnUkFJQVFFUUVJQUlRRkVBQUFBQUFBQUFBQU1BZ3RCQUNFS0RBSUxBbjRnRFpsRUFBQUFBQUFBNEVOakJFQWdEYkFNQVF0Q2dJQ0FnSUNBZ0lDQWZ3c2hBVVFBQUFBQUFBQUFBQ0FEUlEwQUdrRUFJQUVRdUFOcklnQ3NRdURVQTM0Z0FYd2hBU0FBdHdzaERTQUJJQUZDZ0xpWktZRWlBVUkvaDBLQXVKa3BneUFCZkNJRmZVS0F1SmtwZnlJSVFwRE9BSDRpQVNBQlFzbjIzZ0dCSWdGOUlBRkNQNGRDdDRtaGZvTjhRc24yM2dGL1FySVBmQ0VCSUFXbklneEI0TlFEYlNFQUlBaENCSHhDQjRFaENRTkFBa0FnQ0NBQkVNd0VmU0lIUWdCVEJFQkNmeUVHREFFTFFnRWhCaUFISUFFUXl3UWlCVm9OQUNBRlF1MENmU0VJSUF4QmdOM2JBVzBoQ2lBQXdVRThieUVFSUF4QjZBZHRJZ0JCUEc4aEF5QUpRaitIUWdlRElBbDhJUWtnQUVHWWVHd2dER29oQUVJQUlRWURRRUlMSVFVQ1FDQUdRZ3RTQkVBZ0J5QUdwMEVDZEVHUTBnRnFOQUlBSUFoQ0FDQUdRZ0ZSRzN3aUJWa05BU0FHSVFVTElBSWdEVGtEUUNBQ0lBbTVPUU00SUFJZ0FMYzVBekFnQWlBRHR6a0RLQ0FDSUFTM09RTWdJQUlnQ3JjNUF4Z2dBaUFGdVRrRENDQUNJQUc1T1FNQUlBSWdCMElCZkxrNUF4QkJBU0VLREFRTElBWkNBWHdoQmlBSElBVjlJUWNNQUFzQUN5QUJJQVo4SVFFTUFBc0FDeUFMUVJCcUpBQWdDZ3QvQVFKL0l3QkJRR29pQVNRQUlBRWdBRUxvQjM4M0F6Z0NRRUg0M1FRdEFBQkJBWEVOQUVINDNRUXRBQUJCQVhFTkFFSDgzUVJCZ040RVFZVGVCQkFLUWZqZEJFRUJPZ0FBQ3lBQlFUaHFJQUZCREdvUUN5QUJRWWplQkVHRTNnUWdBU2dDTEJzb0FnQTJBalFnQVNnQ01DRUNJQUZCUUdza0FDQUNRVVJ0Q3hFQUlBQkJrSmtDUWJDaEFrRWhFS3dEQzlvQkFRTi9Ba0FDUUNBQlFhSi9SZ1JBUVg4aEF5QUFRUWdnQWhDZUFrVU5BUXdDQzBGL0lRTWdBRUdpZnlBQ0VMb0REUUVMUVFBaEF5QUFLQUlRSUFGSERRQkI2UUJCNmdBZ0FVR2lmMFliSVFVZ0FrRjdjU0VDSUFCQlFHc29BZ0FRTWlFRUEwQkJmeUVESUFBUUVnMEJJQUJCRVJBUUlBQWdCU0FFRUJ3YUlBQkJEaEFRQWtBZ0FVR2lmMFlFUUNBQVFRZ2dBaENlQWtVTkFRd0RDeUFBUWFKL0lBSVF1Z01OQWdzZ0FDZ0NFQ0lESUFGR0RRQUxJQU5CcUg5R0JFQWdBRUhYR1VFQUVCWkJmdzhMSUFBZ0JCQWVRUUFoQXdzZ0F3dTFJd0lLZndGK0l3QkJJR3NpQlNRQUlBRkJBbkVpQmtFQmRpRUtRWDRoQkFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQUNnQ0VDSURRWUFCYWc0SEFnTVBEUUVCQlFBTEFrQWdBMEhUQUdvT0RBa0xEQUVCQVFFS0FRRUJFZ0FMQWtBZ0EwRTVhZzRLQndFQkNBRUJBUUVRRVFBTElBTkJLRVlOQlNBRFFTOUdEUU1nQTBIYkFFWWdBMEg3QUVaeURRMExJQUFvQWpnaEFTQUZJQUFvQWhnaUF6WUNCQ0FGSUFFZ0EyczJBZ0FnQUVHT2xRRWdCUkFXREJZTEFrQUNRQUpBSUFBcEF5QWlERUlnaUtjaUFVRjNSd1JBSUFFTkFTQUFRUUVRRUNBQVFVQnJLQUlBSUF5bkVEa01Bd3NnQUNBTVFRQVF0QUZCQUU0TkFRd1lDeUFBSUF4QkFCQzBBVUVBU0EwWERBRUxJQUFvQWlnaEFTQUFRUUVRRUNBQVFVQnJLQUlBSUFFUU9TQUFRYkVCRUJBTFFYOGhBaUFBRUJJTkZnd1RDMEYvSVFJZ0FDQUFLUU1nUVFFUXRBRU5GU0FBRUJKRkRSSU1GUXRCZnlFRUN5QUFJQUFvQWpnZ0JHbzJBamdnQUNnQ0FDZ0MvQUZGQkVBZ0FFR205Z0JCQUJBV0RCTUxRWDhoQWlBQUVOZ0VEUk5CQUNFQklBQWdBQ2tESUVFQUVMUUJHaUFBS0FJQUlnTWdBQ2tESUNBQUtRTW9JQU1vQXZ3QkVSZ0FJZ3hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FBS0FKQUlnTUVRQ0FES0FKb1FRQkhRUUYwSVFFTElBQW9BZ0FpQXlBREtBSVFLUU9BQVNBQUtBSU1JQUFvQWhRZ0FSREtBZ3dVQ3lBQUlBeEJBQkMwQVNFQklBQW9BZ0FnREJBUElBRU5FeUFBUVRNUUVDQUFFQkpGRFJBTUV3c0NRQ0FCUVFSeFJRMEFRUUFoQkNBQVFRQkJBUkNlQVVHbWYwY05BRUYvSVFJZ0FFRURRUUFnQUNnQ0dDQUFLQUlVRU1RQlJRMFJEQk1MUVg4aEFpQUFFUElCUlEwUERCSUxRWDhoQWtFQUlRUWdBRUVDUVFBZ0FDZ0NHQ0FBS0FJVUVNUUJSUTBQREJFTFFYOGhBa0VBSVFRZ0FFRUJRUUFRN1FKRkRRNE1FQXRCZnlFQ0lBQVFFZzBQSUFCQkJ4QVFEQXdMUVg4aEFpQUFFQklORGlBQVFiZ0JFQkFnQUVFSUVCcEJBQ0VFSUFCQlFHc29BZ0JCQUJBWERBd0xRWDhoQWlBQUVCSU5EU0FBUVFrUUVBd0tDMEYvSVFJZ0FCQVNEUXdnQUVFS0VCQU1DUXNnQUNnQ0tBUkFJQUFRNGdFTUN3c0NRQ0FCUVFSeElnZEZEUUFnQUNnQ09FRUJFSU1CUWFaL1J3MEFRWDhoQWtFQUlRUWdBRUVEUVFBZ0FDZ0NHQ0FBS0FJVUVNUUJSUTBLREF3TEFrQWdBRUdGQVJCS1JRMEFJQUFvQWpoQkFSQ0RBVUVLUmcwQUlBQW9BaFFoQVNBQUtBSVlJUVpCZnlFQ0lBQVFFZzBNSUFBb0FoQWlBMEZIUmdSQUlBQkJBa0VDSUFZZ0FSREVBVVVOQ2d3TkMwR0ZBU0VFSUFkRkRRZ0NRQ0FEUVNoR0JIOGdBRUVBUVFFUW5nRkJwbjlHRFFFZ0FDZ0NFQVVnQXd0QmczOUhEUWtnQUNnQ0tBMEpJQUFvQWpoQkFSQ0RBVUdtZjBjTkNRc2dBRUVEUVFJZ0JpQUJFTVFCUlEwSkRBd0xJQUFvQWlBaUJFSE5BRWNFUUNBQUtBSUFJQVFRR0JvTUJ3c2dBQ2dDUUNnQ1hBMEdJQUJCd3NFQVFRQVFGZ3dLQ3lBQUlBVkJHR3BCQUJDZUFVRTlSZ1JBSUFCQkFFRUFRUUFnQlNnQ0dFRUNjVUVCRU1JQlFRQklEUW9NQ0FzZ0FDZ0NFRUg3QUVZRVFFRUFJUUVnQlVFQU5nSWNJQUFRRWcwRklBQkJDeEFRSUFCQlFHc2hBa0VBSVFRQ1FBTkFJQUFvQWhBaUFVSDlBRVlOQVFKQUFrQWdBVUduZjBZRVFDQUFFQklORHlBQUVGWU5EeUFBUVFjUUVDQUFRZE1BRUJBZ0FpZ0NBRUVHRUdRZ0FFRU9FQkFnQUVFT0VCQU1BUXNnQUNnQ0ZDRUhJQUFvQWhnaENDQUFJQVZCSEdwQkFVRUJRUUFReEFNaUJrRUFTQTBCQWtBQ1FDQUdRUUZHQkVBZ0FFRzRBUkFRSUFBZ0JTZ0NIQ0lCRUJvZ0FpZ0NBQ0lESUFNdkFid0JFQmNNQVFzZ0FDZ0NFRUVvUmdSQUlBQUNmeUFHUVg1eElnbEJBa1lFUUVFQUlRTWdCa0VDYWd3QkN5QUdRUU5yUVFBZ0JrRUVhMEVEU1JzaEEwRUdDeUFESUFnZ0J4REVBUTBFQWtBZ0JTZ0NIQ0lCUlFSQUlBQkIxUUFRRUF3QkN5QUFRZFFBRUJBZ0FDQUJFQm9MSUFJb0FnQkJCQ0FHUVFGclFRUnlJQWxCQWtjYlFmOEJjUkJrREFJTElBQkJPaEFzRFFNZ0FCQldEUU1DUUNBRktBSWNJZ0ZCeEFCSEJFQWdBUTBCSUFBUXdnTWdBRUhSQUJBUUlBQkJEaEFRUVFBaEFRd0RDeUFFQkVBZ0FFR3A1Z0JCQUJBV1FjUUFJUUVNRFFzZ0FFSFBBQkFRUVFFaEJFSEVBQ0VCREFJTElBQWdBUkNoQVFzZ0FFSE1BQkFRSUFBZ0FSQWFDeUFBS0FJQUlBRVFFd3NnQlVFQU5nSWNJQUFvQWhCQkxFY05BaUFBRUJKRkRRRUxDeUFGS0FJY0lRRU1CZ3RCQUNFQklBQkIvUUFRTEVVTkNBd0ZDeUFBRUJJTkNVRUFJUUVDUUFOQUlBQW9BaEFoQWdKQUEwQWdBa0hkQUVZZ0FVRWZTM0lnQWtHbmYwWnlJQUpCTEVaeURRRWdBQkJXRFEwZ0FVRUJhaUVCSUFBb0FoQWlBa0hkQUVZTkFBc2dBa0VzUncwQ0lBQVFFZzBNREFFTEN5QUFRU1lRRUNBQVFVQnJJZ01vQWdBZ0FVSC8vd054RUJkQkFDRUVBa0FDUUFOQUlBQW9BaEFoQWdKQUEwQWdBVUgvLy8vL0IwWU5BU0FDUWFkL1JnMEVJQUpCM1FCR0RRTUNRQ0FDUVN4R0JFQkJBU0VFSUFGQkFXb2hBUXdCQ3lBQUVGWU5FQ0FBUWN3QUVCQWdBeWdDQUNBQlFZQ0FnSUI0Y2hBNUlBRkJBV29oQVVFQUlRUWdBQ2dDRUNJQ1FTeEhEUUVMQ3lBQUVCSU5EZ3dCQ3d0Qi8vLy8vd2NoQVNBQ1FkMEFSdzBCQ3lBRVJRMEJJQUJCRVJBUUlBQkJBUkFRSUFCQlFHc29BZ0FnQVJBNUlBQkJ3d0FRRUNBQVFUQVFHZ3dCQ3lBQVFRRVFFQ0FBUVVCcktBSUFJQUVRT1FOQUFrQUNRQUpBSUFBb0FoQWlBVUduZjBjRVFFR1BBU0VDSUFGQkxFY05BVUVCSVFRTUFnc2dBQkFTRFE1QjBnQWhBaUFBRUZZTkRnd0JDeUFCUWQwQVJnMEJJQUFRVmcwTklBQkIwUUFRRUVFQUlRUUxJQUFnQWhBUUlBQW9BaEJCTEVjTkFDQUFFQkpGRFFFTURBc0xJQVFFUUNBQVFSSVFFQ0FBUWNNQUVCQWdBRUV3RUJvTUFRc2dBRUVPRUJBTElBQkIzUUFRTEEwSkRBY0xRWDhoQWtFQUlRUWdBRUVBUVFBUTFRUU5DUXdIQzBGL0lRSWdBQkFTRFFnZ0FDZ0NFRUV1UmdSQUlBQVFFZzBKSUFCQit3QVFTa1VFUUNBQVFlRDNBRUVBRUJZTUNnc2dBQ2dDUkVVRVFDQUFRZUR1QUVFQUVCWU1DZ3NnQUJBU0RRa2dBRUVNRUJBZ0FFRkFheWdDQUVFR0VHUU1CZ3NnQUVFb0VDd05DQ0FHUlFSQUlBQkIrNWdCUVFBUUZnd0pDeUFBRUZZTkNDQUFRU2tRTEEwSUlBQkJOUkFRUVFBaEJFRUJJUW9NQmd0QmZ5RUNJQUFRRWcwSEFrQWdBQ2dDRUNJQlFkc0FSaUFCUVM1R2NrVUVRQ0FCUVNoSERRRkJBaUVFSUFBb0FrQW9BbFFOQnlBQVFjdzlRUUFRRmd3SkN5QUFRVUJySWdFb0FnQW9BbGhGQkVBZ0FFR004Z0JCQUJBV0RBa0xJQUJCdUFFUUVDQUFRUWdRR2tFQUlRUWdBU2dDQUVFQUVCY2dBRUc0QVJBUUlBQkI4d0FRR2lBQktBSUFRUUFRRnlBQVFUUVFFQXdHQ3lBQVFkK1hBVUVBRUJZTUJ3dEJmeUVDSUFBUUVnMEdJQUFvQWhCQkxrWUVRQ0FBRUJJTkJ5QUFRZFlBRUVwRkJFQWdBRUgwTGtFQUVCWU1DQXNnQUVGQWF5Z0NBQ2dDVUVVRVFDQUFRY3MyUVFBUUZnd0lDeUFBRUJJTkJ5QUFRYmdCRUJBZ0FFSHhBQkFhUVFBaEJDQUFRVUJyS0FJQVFRQVFGd3dGQ3lBQVFRQVF1d01OQmtFQklRb2dBQ2dDRUVFb1JnUkFRUUVoQkF3RkN5QUFRUkVRRUNBQVFTRVFFRUVBSVFRZ0FFRkFheWdDQUVFQUVCY01CQXNnQUNnQ0FDQUJFQk1NQkF0QmZ5RUNJQUFRRWcwRUN5QUFRYmdCRUJBZ0FFRkFheUlCS0FJQUlBUVFPU0FCS0FJQUlnRWdBUzhCdkFFUUZ3dEJBQ0VFQ3lBRlFYODJBaHdnQUVGQWF5RUhBMEFnQnlnQ0FDRUdBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBbjhDUUNBQUtBSVFJZ0ZCcVg5SElnTkZCRUFnQUJBU0RRMGdBQ2dDRUNJQlFTaEdCRUJCQVNFSklBb05BZ3NnQVVIYkFFY05DQXdMQ3lBQlFZSi9SeUFFY2tVRVFFRUFJUWtnQlNnQ0hFRUFTQVJBUVFBaENFRUREQU1MSUFCQitzOEFRUUFRRmd3TkN5QUJRU2hIRFFaQkFDRUpJQXBGRFFZTElBQVFFZzBMSUFRTkFVRUJJUWhCQUFzaEJFRUFJUU5CQVNFQkFrQUNRQ0FHS0FLWUFpSUNRUUJJRFFBQ2Z3Si9Ba0FDUUFKQUFrQWdCaWdDZ0FJZ0Ftb2lDeTBBQUNJQ1FjY0FhdzRFQVFZR0F3QUxJQUpCd1FCR0JFQkJ3Z0FoQ0NBQ0RBUUxJQUpCdUFGR0RRRWdBa0crQVVjTkJVRy9BU0VJUWI0QkRBTUxRY2dBSVFoQnh3QU1BZ3NnQ1VVRVFFRXhJUU1nQ0NBTEtBQUJRVHBHY1EwRkN5QUxMd0FGSVFJZ0JpRURBMEFnQTBVRVFFRzRBU0VEREFVTElBTW9Bc3dCSUFKQkEzUnFRUVJxSVFJRFFDQUNLQUlBSWdKQkFFNEVRQ0FES0FKMElBSkJCSFJxSWdJb0FnQkIxQUJHQkVCQnZBRWhDRUc4QVNFRFFRRU1CZ1VnQWtFSWFpRUNEQUlMQUFzTElBTW9BZ3doQWlBREtBSUVJUU1NQUFzQUMwSEhBQ0VJUWNjQUN5RURRUUlMSVFFZ0N5QUlPZ0FBQ3lBSlJRMEFJQUFnQlVFY2FpQUJFT0VDQzBFQUlRa2dCRUVEUncwQklBQkJBU0FGUVJScUVOVUVEUW9NQXdzZ0JFRUNSaUVKUVFBaEF5QUVRUUpIRFFBZ0FFRzRBUkFRSUFCQjhnQVFHaUFIS0FJQVFRQVFGeUFBUVRRUUVDQUFRYmdCRUJBZ0FFSHhBQkFhSUFjb0FnQkJBQkFYUVFBaEFRd0JDMEVBSVFFZ0JFRUJSdzBBSUFCQkVSQVFDd0pBQTBBZ0FDZ0NFQ0lDUVNsR0RRRWdBVUgvL3dOR0JFQWdBRUhUTTBFQUVCWU1DZ3NnQWtHbmYwY0VRRUYvSVFJZ0FCQldEUXNnQVVFQmFpRUJJQUFvQWhCQktVWU5BaUFBUVN3UUxFVU5BUXdMQ3dzZ0JTQUJOZ0lVSUFCQkpoQVFJQWNvQWdBZ0FVSC8vd054RUJjZ0FFRUJFQkFnQnlnQ0FDQUJFRGtEUUFKQUFrQWdBQ2dDRUNJQlFhZC9Sd1JBSUFGQktVWU5BaUFBRUZZTkRDQUFRZEVBRUJCQmp3RWhBUXdCQzBGL0lRSWdBQkFTRFF4QjBnQWhBU0FBRUZZTkRBc2dBQ0FCRUJBZ0FDZ0NFRUVwUmcwQVFYOGhBaUFBUVN3UUxFVU5BUXdMQ3dzZ0FCQVNEUWdnQUVFT0VCQUNRQUpBQWtBQ1FDQURRYndCYXc0REFRTUJBQXNnQTBFeFJnMEJJQU5CeHdCR0RRQWdBMEhCQUVjTkFnc2dBRUVZRUJBZ0FFRW5FQkFnQnlnQ0FDQUVRUUZHRUJkQkFDRUVEQWtMSUFCQk1oQVFEQVlMSUFrRVFDQUFRU2NRRUNBSEtBSUFRUUVRRnlBQVFSRVFFQ0FBUWIwQkVCQWdBRUVJRUJwQkFDRUVJQWNvQWdCQkFCQVhJQUFRd0FNTUNBc2dCRUVCUmdSQUlBQkJHQkFRSUFCQkp4QVFJQWNvQWdCQkFSQVhRUUFoQkF3SUN5QUFRUVlRRUNBQVFSc1FFQ0FBUVNjUUVFRUFJUVFnQnlnQ0FFRUFFQmNNQndzZ0JTQUJOZ0lVSUFBUUVnMEhDd0pBQWtBQ1FBSkFJQU5CdkFGckRnTUJBd0VBQ3lBRFFURkdEUUVnQTBISEFFWU5BQ0FEUWNFQVJ3MENDeUFBUVNRUUVDQUhLQUlBSUFVdkFSUVFGMEVBSVFRTUJ3c2dBRUV4RUJBZ0J5Z0NBQ0FGTHdFVUVCY01CQXNDUUFKQUFrQWdCRUVCYXc0Q0FRQUNDeUFBUVNFUUVDQUhLQUlBSUFVdkFSUVFGeUFBUVJFUUVDQUFRYjBCRUJBZ0FFRUlFQnBCQUNFRUlBY29BZ0JCQUJBWElBQVF3QU1NQndzZ0FFRWhFQkFnQnlnQ0FDQUZMd0VVRUJkQkFDRUVEQVlMSUFCQkloQVFJQWNvQWdBZ0JTOEJGQkFYUVFBaEJBd0ZDeUFCUWRzQVJnMERJQUZCTGtjTkFTQUFFQklOQlNBQUtBSVFJUUVMQWtBZ0FVR3JmMFlFUUFKQUlBWW9BcGdDSWdGQkFFZ05BQ0FHS0FLQUFpQUJhaTBBQUVFMFJ3MEFJQUJCNXNNQVFRQVFGZ3dIQ3lBRFJRUkFJQUFnQlVFY2FrRUJFT0VDQ3lBQVFiNEJFQkFnQUNBQUtBSWdFQm9nQnlnQ0FDSUJJQUV2QWJ3QkVCY01BUXNnQVVHRGYwWWdBVUVsYWtGUlMzSkZCRUFnQUVHZTZBQkJBQkFXREFZTEFrQWdCaWdDbUFJaUFVRUFTQTBBSUFZb0FvQUNJQUZxTFFBQVFUUkhEUUFnQUNBQUtBSUFJQUFvQWlBUVhDSU1RUUVRdEFFaEFTQUFLQUlBSUF3UUR5QUJEUVlnQUVIS0FCQVFEQUVMSUFORkJFQWdBQ0FGUVJ4cVFRRVE0UUlMSUFCQndRQVFFQ0FBSUFBb0FpQVFHZ3RCZnlFQ0lBQVFFa1VOQXd3RkMwRUFJUUlnQlNnQ0hDSUJRUUJJRFFRZ0FDQUJFQjRNQkFzZ0J5Z0NBQ0FHTHdHOEFSQVhJQVpCQVRZQ1JFRUFJUVFNQVF0QkFDRUJJQVlvQXBnQ0lnSkJBRTRFUUNBR0tBS0FBaUFDYWkwQUFDRUJDeUFEUlFSQUlBQWdCVUVjYWtFQkVPRUNDMEYvSVFJZ0FCQVNEUUlnQUJDUkFRMENJQUJCM1FBUUxBMENJQUZCTkVZRVFDQUFRY29BRUJBRklBQkJ4d0FRRUFzTUFBc0FDMEYvSVFJTElBVkJJR29rQUNBQ0M0RUJBUUYvQWtBQ1FDQUFLQUlRUVlOL1J3MEFJQUFvQWlnTkFDQUFLQUlnSVFJZ0FDZ0NRQzBBYmtFQmNVVU5BU0FDUWMwQVJnMEFJQUpCT2tjTkFRc2dBRUdGTDBFQUVCWkJBQThMSUFBb0FnQWdBaEFZSVFJQ1FBSkFJQUVFUUNBQUlBSVExd1FOQVFzZ0FCQVNSUTBCQ3lBQUtBSUFJQUlRRTBFQUlRSUxJQUlMd0FFQkEzOGpBRUVRYXlJQ0pBQWdBRUVuRUVvRWZ5QUNJQUFvQWdRMkFnQWdBaUFBS0FJVU5nSUVJQUlnQUNnQ0dEWUNEQ0FDSUFBb0FqQTJBZ2hCZndKL1FYOGdBQkFTRFFBYUFrQWdBQ2dDRUNJRFFTMXFJZ1JCQjAxQkFFRUJJQVIwUWNFQmNSc2dBMEg3QUVaeVJRUkFRUUVnQTBIYkFFWU5BaG9nQTBHRGYwY05BVUVBSUFBb0FpZ05BaG9MSUFGQkJIRkJBbllnQUNnQ0JDQUFLQUlVUm5JTUFRdEJBQXNnQUNBQ0VPNENHd1ZCQUFzaEFDQUNRUkJxSkFBZ0FBdExBUUYvUVg4aEF5QUFJQUZCdEFKcVFRZ2dBVUc4QW1vZ0FTZ0N1QUpCQVdvUWVFVUVRQ0FCSUFFb0FyZ0NJZ05CQVdvMkFyZ0NJQUVvQXJRQ0lBTkJBM1JxSUFJM0F3QUxJQU1Ma1FFQkFuOGdBU2dDaUFFaUJFR0FnQVJPQkVBZ0FFSEFNMEVBRUVaQmZ3OExRWDhoQXlBQUlBRkJnQUZxUVJBZ0FVR0VBV29nQkVFQmFoQjRCSDlCZndVZ0FTQUJLQUtJQVNJRFFRRnFOZ0tJQVNBQktBS0FBU0FEUVFSMGFpSURRZ0EzQWdBZ0EwSUFOd0lJSUFNZ0FDQUNFQmcyQWdBZ0F5QURLQUlNUVlELy8vOEhjallDRENBQktBS0lBVUVCYXdzTGJnRUNmeUFBUWJnQkVCQWdBRUgyQUJBYUlBQkJRR3NpQWlnQ0FDSUJJQUV2QWJ3QkVCY2dBRUVSRUJBZ0FFSHBBRUYvRUJ3aEFTQUFRYmdCRUJBZ0FFRUlFQm9nQWlnQ0FFRUFFQmNnQUVFYkVCQWdBRUVrRUJBZ0FpZ0NBRUVBRUJjZ0FDQUJFQjRnQUVFT0VCQUxoZ0VCQW44Q1FBTkFJQUpCQUU0RVFBSkFJQUFvQW5RZ0FrRUVkR29pQkNnQ0FDQUJSdzBBSUFRb0Fnd2lCVUVDY1EwRElBTkZEUUFnQlVINEFIRkJHRVlOQXdzZ0JDZ0NDQ0VDREFFTEMwRi9JUUlnQUNnQ0lFVU5BQ0FBS0FJa0RRQWdBQ0FCRUtJQ0lnQUVRRUdBZ0lDQUJDRUNJQUF0QUFSQkFuRU5BUXRCZnlFQ0N5QUNDNUVCQVFWL0FrQUNRQ0FBS0FKQUlnRW9BcGdDSWdKQkFFZ05BQ0FCS0FLQUFpSURJQUpxSWdRdEFBQWlCVUhCQVVjRVFDQUZRYzBBUncwQklBRkJmellDbUFJZ0FTQUNOZ0tFQWlBQVFjNEFFQkFQQ3lBQ0lBUW9BQUZySUFOcUlnQkJBV290QUFCQjFnQkhEUUVnQUVIWEFEb0FBU0FCUVg4MkFwZ0NDdzhMUWQwMFFhNzhBRUh0c0FGQjQvVUFFQUFBQzFrQkEzOGdBQ2dDekFFZ0FrRURkR3BCQkdvaEF3TkFBa0JCZnlFRUlBTW9BZ0FpQTBGL1JnMEFJQUFvQW5RZ0EwRUVkR29pQlNnQ0JDQUNSdzBBSUFNaEJDQUZLQUlBSUFGR0RRQWdCVUVJYWlFRERBRUxDeUFFQzhvRkFnUi9BWDRDUUFKQUFrQUNmd0pBQWtBQ1FBSkFBa0FnQWtVTkFBSkFJQUJCd1FBUVNrVUVRQ0FBUWNJQUVFcEZEUUVMSUFBb0FnQWdBQ2dDSUJBWUlRVWdBQkFTRFFSQkFTRUhBa0FDUUNBQUtBSVFJZ2hCS0dzT0JRUUJBUUVFQUFzZ0NFRTZSaUFJUWYwQVJuSU5Bd3NnQUNnQ0FDQUZFQk5CQTBFQ0lBVkJ3Z0JHR3lFR0RBRUxJQUFvQWhCQktrWUVRQ0FBRUJJTkNFRUVJUVlNQVFzZ0FFR0ZBUkJLUlEwQUlBQW9BamhCQVJDREFVRUtSZzBBSUFBb0FnQWdBQ2dDSUJBWUlRVWdBQkFTRFFOQkFTRUhBa0FDUUNBQUtBSVFJZ2hCS0dzT0JRTUJBUUVEQUFzZ0NFRTZSaUFJUWYwQVJuSU5BZ3NnQUNnQ0FDQUZFQk5CQlNFR0lBQW9BaEJCS2tjTkFDQUFFQklOQjBFR0lRWUxJQUFvQWhBaUJVR0RmMGNnQlVFbGFrRlNTWEVOQVVFQUlRY2dCVUdEZjBZRVFDQUFLQUlvUlNFSEN5QUFLQUlBSUFBb0FpQVFHQ0VGSUFBUUVnMENDMEVBSUFZZ0EwVWdCMFZ5Y2cwREdpQUFLQUlRSWdCQk9rY2dBa1VnQUVFb1IzSnhJUVpCQUNFRURBWUxBa0FDUUFKQUlBVkJnQUZxRGdJQkFBSUxJQUFvQWdBZ0FDa0RJQkF4SWdWRkRRWWdBQkFTRFFJTUF3c0NRQ0FBS1FNZ0lnbENnSUNBZ0hDRFFvQ0FnSUR3ZmxFRVFDQUFLQUlBSWdJZ0NhZEJCR29nQURRQ0tDQUNLQUlRS0FMRUFoRTVBQ0lKUW9DQWdJQndnMEtBZ0lDQTRBQlJEUWNnQUNnQ0FDQUpFREVoQlNBQUtBSUFJQWtRRHd3QkN5QUFLQUlBSUFrUU1TRUZDeUFGUlEwRklBQVFFa1VOQWd3QkN5QUZRZHNBUndSQUlBUkZJQVZCcTM5SGNnMEVJQUFvQWdBZ0FDZ0NJQkFZSVFVZ0FCQVNEUUZCRUF3REN5QUFFQklOQkNBQUVKRUJEUVFnQUVIZEFCQXNEUVJCQUNFRlFRQU1BZ3NnQUNnQ0FDQUZFQk1NQXd0QkFBc2hCQ0FHUVFKSkRRSWdBQ2dDRUVFb1JnMENJQUFvQWdBZ0JSQVRDeUFBUVpQbUFFRUFFQllMSUFGQkFEWUNBRUYvRHdzZ0FTQUZOZ0lBSUFRZ0JuSUxhUUFnQVVFQmFrRUlUUVJBSUFBZ0FVSExBR3RCL3dGeEVCRVBDeUFCUVlBQmFrSC9BVTBFUUNBQVFiMEJFQkVnQUNBQlFmOEJjUkFSRHdzZ0FVR0FnQUpxUWYvL0EwMEVRQ0FBUWI0QkVCRWdBQ0FCUWYvL0EzRVFLZzhMSUFCQkFSQVJJQUFnQVJBZEMxOEJBMzhDUUFOQUlBRWdBa3dOQVFKQUFrQWdBQ0FDYWlJRkxRQUFJZ1pCdGdGSEJFQWdCa0hDQVVZTkFTQUdRZXNBUncwRUlBVW9BQUVnQTBjTkJBd0NDeUFGS0FBQklBTkdEUUVMSUFKQkJXb2hBZ3dCQ3d0QkFTRUVDeUFFQzRFQ0FRVi9JQUFnQVVGL0VHa2FBa0FEUUNBR1FRcEdCRUJCNndBaEJBd0NDd0pBSUFGQkFFZ05BQ0FCSUFBb0Fxd0NUZzBBSUFBb0FxUUNJQUZCRkd4cUtBSUlJUVVnQUNnQ2dBSWhCd05BQWtBQ1FDQUZJQWRxSWdndEFBQWlCRUcyQVVZTkFDQUVRY0lCUndSQUlBUkJEa2NOQWtFT0lRUURRQ0FISUFWQkFXb2lCV290QUFBaUEwRU9SZzBBQ3lBRFFTbEhEUVpCS1NFRURBWUxJQU5GRFFBZ0F5QUlLQUFCTmdJQUN5QUZJQVJCQW5SQmdMZ0JhaTBBQUdvaEJRd0JDd3NnQkVIckFFY05BaUFHUVFGcUlRWWdDQ2dBQVNFQkRBRUxDMEdGS1VHdS9BQkIvL01CUWVNdUVBQUFDeUFDSUFRMkFnQWdBQ0FCUVFFUWFSb2dBUXRvQUFKQUlBRkJBRTROQUVGL0lRRWdBQ2dDQUNBQVFhUUNha0VVSUFCQnFBSnFJQUFvQXF3Q1FRRnFFSGdOQUNBQUlBQW9BcXdDSWdGQkFXbzJBcXdDSUFBb0FxUUNJQUZCRkd4cUlnQkJBRFlDRUNBQVFuODNBZ2dnQUVLQWdJQ0FjRGNDQUFzZ0FRdWtBUUVDZnlBQktBTEFBaUlLUVlDQUJFNEVRQ0FBUWFZNlFRQVFSa0YvRHd0QmZ5RUpJQUFnQVVISUFtcEJDQ0FCUWNRQ2FpQUtRUUZxRUhnRWYwRi9CU0FCSUFFb0FzQUNJZ2xCQVdvMkFzQUNJQUVvQXNnQ0lBbEJBM1JxSWdrZ0JEc0JBaUFKSUFkQkEzUkJDSEVnQmtFQ2RFRUVjU0FEUVFGMFFRSnhJQUpCQVhGeWNuSWdDRUVFZEhJNkFBQWdDU0FBSUFVUUdEWUNCQ0FCS0FMQUFrRUJhd3NMTmdBQ1FDQUFJQUZCQ0JCUElnQkJBRWdOQUNBQktBSmdSUTBBSUFFb0FuUWdBRUVFZEdvaUFTQUJLQUlNUVFKeU5nSU1DeUFBQzRJQ0FRVi9Ba0FDUUFKQUlBSkJ6UUJHSUFKQk9rWnlSUVJBSUFBb0FnQWhCU0FDUVJaSERRRWdBQ2dDUUNFR0RBSUxJQUJCOE53QVFRQVFGZ3dDQ3lBQUtBSkFJZ1lvQXNBQ0lnZEJBQ0FIUVFCS0d5RUhBMEFnQkNBSFJnMEJJQVJCQTNRaENDQUVRUUZxSVFRZ0NDQUdLQUxJQW1vb0FnUWdBa2NOQUFzZ0FFSFgzQUJCQUJBV0RBRUxJQVVnQmlBRFFmMEFSa0VBSUFFb0FqZ2dBa0VCUVFGQkFCREpBeUlBUVFCSURRQWdCU0FCUVRScVFRd2dBVUU4YWlBQktBSTRRUUZxRUhnTkFDQUJJQUVvQWpnaUFrRUJhallDT0NBQktBSTBJUUVnQlNBREVCZ2hBeUFCSUFKQkRHeHFJZ0VnQURZQ0FDQUJJQU0yQWdSQkFBOExRWDhMdlFRQkNIOGpBRUVRYXlJRkpBQWdBRUZBYXlJR0tBSUFJUWdnQUNnQ0FDRUhJQUpCczM5SElRcEJ2WDlCdlg5QnVYOGdBa0ZUUmlJSkd5QUNRVXRHRzBIL0FYRWhDd0ovQWtBQ1FBTkFBa0FDUUNBQUtBSVFJZ1JCZzM5R0JFQWdBQ2dDS0FSQUlBQVE0Z0VNQmdzZ0NVVWdBa0ZMUjNFZ0J5QUFLQUlnRUJnaUJFRW5SM0pGQkVBZ0FFRzd4QUJCQUJBV1FTY2hCQXdGQ3lBQUVCSU5CQ0FBSUFRZ0FoQ2hBZzBFSUFNRVFDQUFJQVlvQWdBb0FwUURJQVFnQkVFQUVQY0JSUTBGQ3dKQUlBQW9BaEJCUFVZRVFDQUFFQklOQmlBS1JRUkFJQUJCdUFFUUVDQUFJQVFRR2lBR0tBSUFJQWd2QWJ3QkVCY2dBQ0FGUVF4cUlBVkJDR29nQlNBRlFRUnFRUUJCQUVFOUVMVUJRUUJJRFFjZ0FDQUJFTFlCQkVBZ0J5QUZLQUlBRUJNTUNBc2dBQ0FFRUtFQklBQWdCU2dDRENBRktBSUlJQVVvQWdBZ0JTZ0NCRUVBUVFBUXdRRU1BZ3NnQUNBQkVMWUJEUVlnQUNBRUVLRUJJQUFnQ3hBUUlBQWdCQkFhSUFZb0FnQWdDQzhCdkFFUUZ3d0JDeUFKUlFSQUlBSkJTMGNOQVNBQVFhbnFBRUVBRUJZTUJnc2dBRUVHRUJBZ0FFRzlBUkFRSUFBZ0JCQWFJQVlvQWdBZ0NDOEJ2QUVRRndzZ0J5QUVFQk1NQVFzZ0JFRWdja0g3QUVjTkFTQUFJQVZCREdwQkFCQ2VBVUU5UncwQklBQkJCaEFRUVg4Z0FDQUNRUUJCQVNBRktBSU1RUUp4UVFFUXdnRkJBRWdOQlJvTFFRQWdBQ2dDRUVFc1J3MEVHaUFBRUJKRkRRRU1Bd3NMSUFCQnlmY0FRUUFRRmd3QkN5QUhJQVFRRXd0QmZ3c2hCQ0FGUVJCcUpBQWdCQXZJQXdFT2YwR0FnQVFnQW1zaUNVRUFJQWxCZ0lBRVRSc2hEQ0FEUVFBZ0EwRUFTaHNoRFNBQVFSQnFJUXNnQUVITUFHb2hDU0FBUWNnQWFpRU9BMEFnQkNBTlJnUkFRUUFQQ3dKQUlBUWdERVlOQUNBQklBUkJER3hxSWdNb0FnQWhDaUFES0FJSUlROGdBeWdDQkNFUUFrQWdBQ2dDUUNJRElBSWdCR29pQlVzRVFDQUFLQUpFSWdNZ0JVRVliR29vQWdCRkRRRU1BZ3RCT2lBRlFRRnFJZ1lnQTBFRGJFRUJkaUlESUFNZ0JrZ2JJZ01nQTBFNlRCc2lCa0VEZENFUklBa2hBd05BQWtBZ0FDZ0NDQ0VISUFNb0FnQWlDQ0FPUmcwQUlBc2dDQ2dDRkNBUklBY1JBUUFpQjBVTkF5QUFLQUpBSVFNRFFDQURJQVpPUlFSQUlBY2dBMEVEZEdwQ2dJQ0FnQ0EzQXdBZ0EwRUJhaUVEREFFTEN5QUlJQWMyQWhRZ0NFRUVhaUVEREFFTEN5QUxJQUFvQWtRZ0JrRVliQ0FIRVFFQUlnTkZEUUVnQXlBQUtBSkFJZ2hCR0d4cVFRQWdCaUFJYTBFWWJCQXJHaUFBSUFZMkFrQWdBQ0FETmdKRUN5QURJQVZCR0d4cUlnTWdCVFlDQUNBS1FkNEJUZ1JBSUFBb0FqZ2dDa0VDZEdvb0FnQWlCU0FGS0FJQVFRRnFOZ0lBQ3lBRFFnQTNBaEFnQXlBUE5nSU1JQU1nRURZQ0NDQURJQW8yQWdRZ0JFRUJhaUVFREFFTEMwRi9DMWtCQVg4Z0FDQUFLQUpJSWdGQkFXc2dBWEkyQWtnZ0FDZ0NBQ0lCUVFoeEJFQWdBQ0FCUVNCeU5nSUFRWDhQQ3lBQVFnQTNBZ1FnQUNBQUtBSXNJZ0UyQWh3Z0FDQUJOZ0lVSUFBZ0FTQUFLQUl3YWpZQ0VFRUFDL2dDQWdSL0FYNGpBRUVnYXlJQ0pBQUNmd0pBSUFBb0FnQWdBa0VJYWtFZ0VEME5BQUpBQTBBQ1FDQUJJZ01nQUNnQ1BFOE5BQ0FEUVFGcUlRRUNRQUpBQWtBQ1FBSkFJQU10QUFBaUJVSGNBR3NPQlFJREF3TUJBQXNnQlVFa1J3MENRU1FoQkNBQkxRQUFRZnNBUncwRElBTkJBbW9oQVFzZ0FFR0NmellDRUNBQUlBVTJBaWdnQWtFSWFoQTJJUVlnQUNBQk5nSTRJQUFnQmpjRElFRUFEQWNMSUFKQkNHcEIzQUFRT3cwRklBRWdBQ2dDUEU4TkFpQURRUUpxSVFFZ0F5MEFBU0VGQ3dKQUFrQUNRQ0FGSWdSQkNtc09CQUVDQWdBQ0N5QUJJQUV0QUFCQkNrWnFJUUVMSUFBZ0FDZ0NDRUVCYWpZQ0NFRUtJUVFNQVFzZ0JNQkJBRTROQUNBQlFRRnJRUVlnQWtFRWFoQllJZ1JCLy8vREFFc05BeUFDS0FJRUlRRUxJQUpCQ0dvZ0JCQzVBVVVOQVF3REN3c2dBRUdKMndCQkFCQVdEQUVMSUFCQnRQQUFRUUFRRmdzZ0FpZ0NDQ2dDRUNJQVFSQnFJQUlvQWd3Z0FDZ0NCQkVBQUVGL0N5RUJJQUpCSUdva0FDQUJDMVlCQW40Q2YwRUFJQUZDZ0lDQWdIQlVEUUFhSUFBZ0FVSFNBU0FCUVFBUUZDSUNRb0NBZ0lCd2d5SURRb0NBZ0lBd1VnUkFRWDhnQTBLQWdJQ0E0QUJSRFFFYUlBQWdBaEFtRHdzZ0FhY3ZBUVpCRWtZTEMwQUJBWDhqQUVFUWF5SUNKQUFDZnlBQklBQW9BaEJIQkVBZ0FpQUJOZ0lBSUFCQm9KZ0JJQUlRRmtGL0RBRUxJQUFRb2dFTElRQWdBa0VRYWlRQUlBQUx6d1VDQW40RWZ5TUFRUkJySWdZa0FDQUFLQUlBSVFVQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUFvQWhBaUJFR0FBV29PQkFJQkJRTUFDeUFFUWF4L1JnMERJQVJCMndCSEJFQWdCRUg3QUVjTkJVS0FnSUNBSUNFQklBQVFvZ0VOQ1VLQWdJQ0E0QUFoQVNBRkVEUWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEpBa0FnQUNnQ0VDSURRZjBBUmcwQUEwQUNRQ0FEUVlGL1JnUkFJQVVnQUNrRElCQXhJZ01OQVF3TUN5QUFLQUpNUlNBRFFZTi9SM0lOQ2lBRklBQW9BaUFRR0NFREN3SkFBa0FnQUJDaUFRMEFJQUJCT2hEUkF3MEFJQUFRMGdNaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkN5QUZJQU1RRXd3TEN5QUZJQUlnQXlBQlFRY1FHU0VFSUFVZ0F4QVRJQVJCQUVnTkNpQUFLQUlRUVN4SERRRWdBQkNpQVEwS0lBQW9Ba3hGSUFBb0FoQWlBMEg5QUVkeURRQUxDeUFDSVFFZ0FFSDlBQkRSQXcwSkRBb0xRb0NBZ0lBZ0lRRWdBQkNpQVEwSVFvQ0FnSURnQUNFQklBVVFQaUlDUW9DQWdJQndnMEtBZ0lDQTRBQlJEUWdDUUNBQUtBSVFRZDBBUmcwQUEwQWdBQkRTQXlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFrZ0JTQUNJQU1nQVVFSEVLOEJRUUJJRFFrZ0FDZ0NFRUVzUncwQklBQVFvZ0VOQ1NBRFFRRnFJUU1nQUNnQ1RFVU5BQ0FBS0FJUVFkMEFSdzBBQ3dzZ0FpRUJJQUJCM1FBUTBRTU5DQXdKQ3lBQUtRTWdJZ0ZDSUlpblFYVlBCRUFnQWFjaUJDQUVLQUlBUVFGcU5nSUFDeUFCSVFJZ0FCQ2lBUTBIREFnTElBQXBBeUFpQVNFQ0lBQVFvZ0VOQmd3SEN5QUFLQUlnUVFGcklnUkJBa3NOQVNBRVFRTjBRYWorQVdvcEF3QWlBU0VDSUFBUW9nRU5CUXdHQ3lBQVFmb2xRUUFRRmd3QkN5QUFLQUk0SVFNZ0JpQUFLQUlZSWdRMkFnUWdCaUFESUFSck5nSUFJQUJCdFpVQklBWVFGZ3RDZ0lDQWdDQWhBUXdDQ3lBQVFkM2xBRUVBRUJZTElBSWhBUXNnQlNBQkVBOUNnSUNBZ09BQUlRSUxJQVpCRUdva0FDQUNDeFVCQVg0Z0FDQUJFUFlFSVFJZ0FDQUJFQThnQWd1NER3SUVmd3ArSXdCQkVHc2lCU1FBSUFVZ0FqY0RDQUpBQWtBQ2ZnSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FFRUhJQUpDSUlpbklnUWdCRUVIYTBGdVNSdEJDbW9PRWdjRUFnTUNBZ0lDQWdBRUJBUUNBZ0lDQVFJTEFrQUNRQUpBQWtBQ1FBSkFJQUtuSWdRdkFRWWlCa0VFYXc0REFnRURBQXNnQmtFaGF3NENDd01FQzBLQWdJQ0FNQ0VLSUFBZ0FoQTNJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5DeUFBSUFJUTB3TWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMExJQUVvQWlnZ0FoQi9JUVFNRGd0Q2dJQ0FnREFoQ2lBQUlBSVFqUUVpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBLSUFFb0FpZ2dBaEIvSVFRTURRc2dBU2dDS0NBRUtRTWdFSWNCSVFRZ0FDQUNFQThNREFzZ0FTZ0NLQ0FDRUg4aEJBd0xDMEtBZ0lDQU1DRUxJQUFnQVNrRENFRUJJQVZCQ0dvUTFnTWlDRUtBZ0lDQThBQ0RRb0NBZ0lEZ0FGRU5CU0FBSUFnUUpnUkFJQUJCeS9BQVFRQVFGUXdHQ3lBRFFpQ0lwMEYxVHdSQUlBT25JZ1FnQkNnQ0FFRUJhallDQUFzZ0FTa0RHQ0lJUWlDSXAwRjFUd1JBSUFpbklnUWdCQ2dDQUVFQmFqWUNBQXNDUUFKQUFrQUNRQ0FBSUFNZ0NCREVBaUlNUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJDZ0lDQWdEQWhDZ3dCQ3lBQktRTVlJZ2hDZ0lDQWdIQ0RRb0NBZ0lDUWYxRUVRQ0FJcHlnQ0JFSC8vLy8vQjNGRkRRTUxJQXhDSUlpblFYVlBCRUFnREtjaUJDQUVLQUlBUVFGcU5nSUFDeUFBUWN1ZUFTQU1RY3llQVJDK0FTSUtRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRRUxRb0NBZ0lBd0lRME1Cd3NnQUVHRW1nRVFZaUlOUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVNQmdzZ0FTa0RJQ0lLUWlDSXAwRjFUd1JBSUFxbklnUWdCQ2dDQUVFQ2FqWUNBQXNnQ2lFTkN5QUFJQUFnQVNrRENFRUJJQVZCQ0dwQkFCRDRCQkQ4QVEwRUlBQWdBaERLQVNJRVFRQklEUVFDUUFKQUlBUUVRQ0FBSUFVZ0FoQThEUWNnQVNnQ0tFSGJBQkE3R2lBRktRTUFJZzVDQUNBT1FnQlZHeUVRSUFGQktHb2hCZ0pBQTBBZ0NTQVFVUTBCSUFFb0FpZ2hCQUpBQWtBZ0NWQkZCRUFnQkVFc0VEc2FJQUVvQWlnZ0NoQ0hBUm9nQUNBQ0lBa1FjeUlQUW9DQWdJQndnMEtBZ0lDQTRBQlJEUXdnQ1VLQWdJQ0FDRm9OQVNBSklRZ01BZ3NnQkNBS0VJY0JHa0lBSVFnZ0FDQUNRZ0FRVFNJUFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFzTUFRdENnSUNBZ01CK0lBbTV2U0lJUW9DQWdJREFnWUQ4L3dCOUlBaEMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYklRZ0xJQUFnQ0JBM0lnaENnSUNBZ0hDRFFvQ0FnSURnQUZFTkRpQUFJQUVnQWlBUElBZ1ExUU1oRHlBQUlBZ1FEeUFQUW9DQWdJQndneUlSUW9DQWdJRGdBRkVOQ1NBSlFnRjhJUWxDZ0lDQWdEQWhDQ0FBSUFGQ2dJQ0FnQ0FnRHlBUlFvQ0FnSUF3VVJzZ0RCRFVBMFVOQUFzTURRc2dEa0lBVndSQVFkMEFJUVJDZ0lDQWdEQWhDQXdEQ3lBQktRTVlJZ2xDZ0lDQWdIQ0RRb0NBZ0lDUWYxSUVRRUhkQUNFRVFvQ0FnSUF3SVFnTUFndEIzUUFoQkVLQWdJQ0FNQ0VJSUFtbktBSUVRZi8vLy84SGNRMEJEQUlMQWtBZ0FTa0RFQ0lMUW9DQWdJQndneUlKUW9DQWdJQXdVZ1JBSUF0Q0lJaW5RWFZKRFFFZ0M2Y2lCQ0FFS0FJQVFRRnFOZ0lBREFFTElBQWdBa0VSUVFBUXFnSWlDMEtBZ0lDQWNJTWhDUXRDZ0lDQWdEQWhDQ0FKUW9DQWdJRGdBRkVOQ3lBQUlBVWdDeEE4RFFzZ0FTZ0NLRUg3QUJBN0drSUFJUWtnQlNrREFDSUlRZ0FnQ0VJQVZSc2hEeUFCUVNocUlRWkJBQ0VFUW9DQWdJQXdJUWdEUUNBSklBOVNCRUFnQUNBSUVBOGdBQ0FMSUFrUWN5SUlRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRMGdDRUlnaUtkQmRVOEVRQ0FJcHlJSElBY29BZ0JCQVdvMkFnQUxJQUFnQWlBSUVFMGlEa0tBZ0lDQWNJTkNnSUNBZ09BQVVRME5JQUFnQVNBQ0lBNGdDQkRWQXlJT1FvQ0FnSUJ3Z3lJUVFvQ0FnSUF3VWdSQUlCQkNnSUNBZ09BQVVRME9JQVFFUUNBQktBSW9RU3dRT3hvTElBQWdDQkRUQXlJSVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQU9FQThNRHdzZ0FTZ0NLQ0FLRUljQkdpQUJLQUlvSUFnUWh3RWFJQUVvQWloQk9oQTdHaUFCS0FJb0lBMFFod0VhUVFFaEJDQUFJQUVnRGlBTUVOUUREUTRMSUFsQ0FYd2hDUXdCQ3dzZ0JFVUVRRUg5QUNFRURBSUxRZjBBSVFRZ0FTZ0NHQ2dDQkVILy8vLy9CM0ZGRFFFTElBWW9BZ0JCQ2hBN0dpQUdLQUlBSUFNUWh3RWFDeUFCS0FJb0lBUVFPeHBCQUNFRUlBQWdBQ0FCS1FNSUlBVWdCVUVBRVBjRUVQd0JEUWtnQUNBQ0VBOGdBQ0FMRUE4Z0FDQUtFQThnQUNBTkVBOGdBQ0FNRUE4Z0FDQUlFQThNQ2d0Q2dJQ0FnQ0FnQWlBQ1FvQ0FnSURBZ1lEOC93QjhRb0NBZ0lDQWdJRDQvd0NEUW9DQWdJQ0FnSUQ0L3dCUkd5RUNEQUlMSUFBZ0FoQVBRUUFoQkF3SUMwS0FnSUNBTUNFS1FvQ0FnSUF3SVExQ2dJQ0FnREFoQzBLQWdJQ0FNQ0VJUW9DQWdJQXdJUXdnQUNBQ0VOTURJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CZ3NnQVNnQ0tDQUNFSDhoQkF3R0MwS0FnSUNBTUNFSURBUUxRb0NBZ0lBd0lRcENnSUNBZ0RBTUFnc2dBRUdDSGtFQUVCVkNnSUNBZ0RBaENndENnSUNBZ0RBaEMwS0FnSUNBTUFzaERVS0FnSUNBTUNFSVFvQ0FnSUF3SVF3TElBQWdBaEFQSUFBZ0N4QVBJQUFnQ2hBUElBQWdEUkFQSUFBZ0RCQVBJQUFnQ0JBUFFYOGhCQXNnQlVFUWFpUUFJQVFML0FJQ0FYOEJmaU1BUVNCcklnVWtBQ0FGSUFRM0F4Z0NRQUpBQWtBZ0EwS0FnSUNBY0lOQ2dJQ0FnT0IrVWlBRFF2Ly8vLzl2V0hGRkJFQkNnSUNBZ09BQUlRWWdBQ0FEUVpFQklBTkJBQkFVSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBRElRUU1Bd3NnQUNBRUVEZ0VRQ0FBSUFRZ0EwRUJJQVZCR0dvUUx5RUVJQUFnQXhBUElBUkNnSUNBZ0hDRFFvQ0FnSURnQUZJTkFnd0RDeUFBSUFRUUR3c2dBeUVFQ3dKQUlBRXBBd0FpQTBLQWdJQ0FjSU5DZ0lDQWdEQlJCRUFnQkNFRERBRUxJQVVnQkRjRENDQUZJQVVwQXhnM0F3QWdBQ0FESUFKQkFpQUZFQ0VoQXlBQUlBUVFEMEtBZ0lDQTRBQWhCaUFESVFRZ0EwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQkN3SkFRUWNnQTBJZ2lLY2lBU0FCUVFkclFXNUpHMEVLYWlJQlFSRkxEUUJCQVNBQmRFR0x1QXh4RFFJZ0FVRUpSdzBBSUFNaEJFS0FnSUNBTUNFR0lBQWdBeEE0UlEwQ0RBRUxJQU1oQkVLQWdJQ0FNQ0VHQ3lBQUlBUVFEeUFHSVFNTElBVkJJR29rQUNBREM1NERBZ1YrQW44akFFRWdheUlKSkFCQ2dJQ0FnT0FBSVFRQ1FDQUFJQWxCR0dvZ0FDQUJFQ1VpQnhBOERRQUNRQ0FKS1FNWUlnVkNBRmNOQUNBSlFnQTNBeEFnQWtFQ1RnUkFJQUFnQ1VFUWFpQURLUU1JUWdBZ0JTQUZFSFFOQWdzQ1FBSkFJQWNnQ1VFTWFpQUpRUWhxRUlvQ1JRUkFJQWtwQXhBaEFRd0JDeUFKS1FNUUlnRWdDVFVDQ0NJRUlBRWdCRlViSVFnZ0NTZ0NEQ0VDQTBBZ0FTQUlVUTBCSUFNcEF3QWlCRUlnaUtkQmRVOEVRQ0FFcHlJS0lBb29BZ0JCQVdvMkFnQUxJQUlnQWFkQkEzUnFLUU1BSWdaQ0lJaW5RWFZQQkVBZ0JxY2lDaUFLS0FJQVFRRnFOZ0lBQ3lBQUlBUWdCa0VDRUx3QkRRSWdBVUlCZkNFQkRBQUxBQXNnQVNBRklBRWdCVlViSVFVRFFDQUJJQVZSRFFKQ2dJQ0FnT0FBSVFRZ0FDQUhJQUVRY3lJR1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFNZ0F5a0RBQ0lFUWlDSXAwRjFUd1JBSUFTbklnSWdBaWdDQUVFQmFqWUNBQXNnQUNBRUlBWkJBaEM4QVEwQklBRkNBWHdoQVF3QUN3QUxRb0dBZ0lBUUlRUU1BUXRDZ0lDQWdCQWhCQXNnQUNBSEVBOGdDVUVnYWlRQUlBUUx0d0VCQW44Q1FBSjhBa0FDUUFKQUFrQUNRRUVISUFCQ0lJaW5JZ0lnQWtFSGEwRnVTUnNpQWtFSWFnNEtBZ0VHQmdZR0JnSURBQVFMSUFDbklRRU1CUXNnQUtkQkFCQ3dCU0VCREFRTElBQ25RZHNZYkNFQkRBTUxJQUNuUWRzWWJMY01BUXNnQWtFSFJ3MEJSQUFBQUFBQUFQaC9JQUJDZ0lDQWdNQ0JnUHovQUh3aUFMOGdBRUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0x2U0lBUWlDSUlBQ0ZwMEhiR0d3aEFRc2dBU0FDY3dzRUFFRUFDMWdCQW44Z0FRUkFBa0FnQUNnQ0NDQUFLQUlFSWdNZ0FXcEpEUUFnQVJDeEFTSUJSUTBBSUFBZ0EwRUlhallDQkNBQUlBQW9BZ0JCQVdvMkFnQWdBU0VDQ3lBQ0R3dEJvSkFCUWE3OEFFR2lEVUg2K3dBUUFBQUxwQUVDQW44QmZpTUFRUkJySWdRa0FBSkFJQUFnQVNBQ0lBTVFwd0VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBQWtBZ0FDQUJFSklCSWdWQkFFZ05BQ0FDUVFGSERRRWdBeWtEQUNJR1FpQ0lwMEYxVHdSQUlBYW5JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUVRUWhxSUFZUW93RU5BQ0FFS1FNSUlBV3RWdzBCSUFCQjBOUUFRUUFRRlFzZ0FDQUJFQTlDZ0lDQWdPQUFJUUVMSUFSQkVHb2tBQ0FCQzVnQkFRUi9JQUduSWdZdkFRWkI1YVlCYWpFQUFDRUJJQUJCR0JBcElnVkZCRUFnQUNBQ0VBOUJmdzhMSUFLbklnY29BaUFoQUNBRklBUWdBWVkrQWhRZ0JTQURweUlJTmdJUUlBVWdCellDRENBRklBWTJBZ2dnQUNnQ0RDSUhJQVUyQWdRZ0JTQUFRUXhxTmdJRUlBVWdCellDQUNBQUlBVTJBZ3dnQmlBRVBnSW9JQVlnQlRZQ0lDQUdJQUFvQWdnZ0NHbzJBaVJCQUF1b0FnRUVmeUFBS0FJUUlRWUNRQUpBSUFBZ0FTQURFR1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFKQ2dJQ0FnQWhhQkVBZ0FFSDIyQUJCQUJCUURBSUxJQUJCSEJBcElnUkZCRUJCQUNFRURBSUxJQVFnQXFjaUJUWUNBQUpBQWtBZ0EwRVVSdzBBSUFZb0FyZ0JJZ2RGRFFBZ0JDQUdLQUxFQVVFQklBVWdCVUVCVEJzZ0J4RURBQ0lHTmdJSUlBWkZEUU1nQmtFQUlBVVFLeG9NQVFzZ0JDQUFRUUVnQlNBRlFRRk1HeEJmSWdVMkFnZ2dCVVVOQWdzZ0JFSFNBRFlDR0NBRVFRQTJBaFFnQkVFQU9nQUVJQVFnQkVFTWFpSUFOZ0lRSUFRZ0FEWUNEQ0FFSUFOQkZFWTZBQVVnQVVLQWdJQ0FjRlFOQUNBQnB5QUVOZ0lnQ3lBQkR3c2dBQ0FCRUE4Z0FDZ0NFQ0lBUVJCcUlBUWdBQ2dDQkJFQUFFS0FnSUNBNEFBTEd3QWdBU2dDSUFSQUlBQWdBVUVvYWhEK0FpQUJRUUEyQWlBTEMyWUNBbjhCZmlNQVFSQnJJZ01rQUVGL0lRUUNRQ0FBSUFGQ0FCQk5JZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFOQkRHb2dCUkNZQVEwQUlBQWdBVUVBSUFNb0Fnd2dBbW9pQUswUXBRRkJBRWdOQUNBQVJTRUVDeUFEUVJCcUpBQWdCQXNOQUNBQUlBRWdBa0VCRUlNRkN5RUFJQUVvQWdSQkJVY0VRQ0FCUVFVMkFnUWdBQ2dDRUNBQlFRaHFFUDRDQ3d1UkFRRURmd0pBSUFBb0FnZ2lCRUg5Ly8vL0Iwb05BQ0FDUVFaR0JFQWdBU0FEU0E4TElBUkJnSUNBZ0hoR0lBRkJBbW9nQTBweURRQWdBQ2dDRUNJR0lBQW9BZ3dpQkNBQlFYOXpJZ0FnQkVFRmRHb2lBUkNaQWlBQ1FYdHhSWE1oQWlBQUlBTnFJUUFEUUNBQVJRMEJJQUJCQVdzaEFDQUdJQVFnQVVFQmF5SUJFSmtDSUFKR0RRQUxRUUVoQlFzZ0JRc3BBUUYvSUFKQ0lJaW5RWFZQQkVBZ0FxY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBRWdBaENRQlF1akJRRU1meU1BUVRCcklnUWtBQUpBQWtBQ1FDQUFJQUZHSUFBZ0FrWnlSUVJBSUFFb0FnaEJBRW9FUUNBQktBSUVJUVlMSUFJb0FnaEJBRW9FUUNBQ0tBSUVJUWNMSUFaRkJFQWdBU0VGREFJTElBQW9BZ0FoQlNBRVFnQTNBaFFnQkVLQWdJQ0FnSUNBZ0lCL053SU1JQVFnQlRZQ0NDQUVRUWhxSVFVZ0JTQUJRZ0ZCLy8vLy93TkJBUkIxUlEwQlFRQWhBZ3dDQzBHcWpBRkIxUHdBUVpvU1FmREpBQkFBQUFzQ1FBSkFBbjhnQjBVRVFFRUFJQU5CQWs4TkFSb2dCa1VoQ1NBR0lRZ01BZ3NnQUNnQ0FDRUJJQVJDQURjQ0tDQUVRb0NBZ0lDQWdJQ0FnSDgzQWlBZ0JDQUJOZ0ljSUFSQkhHb2dBa0lCUWYvLy8vOERRUUVRZFFSQUlBUkJIR29oQWd3RUN5QUVRUnhxSVFJZ0JpQUhJQU1Ra0FZTElnaEZJUWtnQTBFQ1J5QUljZzBBQW44Z0JpQUhja1VFUUNBRktBSUlJZ0VnQWlnQ0NDSUlJQUVnQ0VnYkRBRUxJQVpGQkVBZ0JTZ0NDQXdCQ3lBQ0tBSUlDeUVCUVFBaENFRUJJUWtNQVFzZ0JTZ0NDQ0lCSUFJb0FnZ2lDaUFCSUFwS0d5RUJDeUFBUVFFZ0FTQUJRUUZNRzBFZmFpSUtRUVYySWdzUVFRMEFRUUFoQVVFQUlBaHJJUXhCQUNBSGF5RUhRUUFnQm1zaEJpQUNLQUlNUVFWMElBSW9BZ2hySVEwZ0JTZ0NERUVGZENBRktBSUlheUVPQTBBZ0FTQUxSa1VFUUNBQUtBSVFJQUZCQW5ScUlBVW9BaEFnQlNnQ0RDQU9JQUZCQlhRaUQyb1FhQ0FHY3lBQ0tBSVFJQUlvQWd3Z0RTQVBhaEJvSUFkeklBTVFrQVlnREhNMkFnQWdBVUVCYWlFQkRBRUxDeUFBSUFnMkFnUWdBQ0FLUVdCeE5nSUlJQUJCLy8vLy93TkJBUkN6QWhwQkFDRUJJQWtOQVNBQUlBQkNmMEgvLy8vL0EwRUJFSFZGRFFFTElBQVFOVUVnSVFFTElBUkJDR29nQlVZRVFDQUVRUWhxRUJzTElBUkJIR29nQWtZRVFDQUVRUnhxRUJzTElBUkJNR29rQUNBQkMvNEZBUWQvSXdCQk1Hc2lCU1FBQWtBQ1FDQUFJQUpHSUFBZ0EwWnlSUVJBSUFFZ0FrWWdBU0FEUm5JTkFTQUFJQUZHRFFJQ1FBSkFJQUlvQWd3aUNBUkFJQU1vQWd3aUNRMEJDMEVBSVFRZ0FFRUFFSWtCQWtBZ0FpZ0NDQ0lBUWYvLy8vOEhSd1JBSUFNb0FnZ2lBMEgvLy8vL0IwY05BUXNnQVJBMURBSUxJQUJCL3YvLy93ZEhJQU5CZ0lDQWdIaEhjVVVFUUNBQkVEVkJBU0VFREFJTElBRWdBaEJFR2lBQlFmLy8vLzhEUVFFUXpnRWhCQXdCQ3lBQ0tBSUVJZ2NnQXlnQ0JITWhDZ0pBQWtBQ1FBSkFBa0FnQkVFQ2F3NEZBQUVFQWdNRUN5QUtJUVlNQXdzZ0NrRUJjeUVHREFJTFFRRWhCZ3dCQ3lBSElRWUxJQVVnQWlnQ0NDSUhOZ0lrSUFJb0FoQWhDeUFGSUFnMkFpZ2dCU0FMTmdJc0lBVkJBRFlDSUNBRklBTW9BZ2dpQ0RZQ0VDQURLQUlRSVFNZ0JTQUpOZ0lVSUFVZ0F6WUNHQ0FGUVFBMkFnd0NRQ0FGUVJ4cUlBVkJDR29RMHdGQkFFZ0VRQ0FBUWdBUU1Cb2dBU0FGUVJ4cUVFUWFEQUVMSUFBZ0JVRWNhaUlKSUFWQkNHb2lDMEVCSUFjZ0NHc2lBeUFEUVFGTUcwRUJha0VCRUpVQkdpQUFRUUVRMFFFYUlBRWdBQ0FMUWYvLy8vOERRUUVRUXhvZ0FTQUpJQUZCLy8vLy93TkJBUkRrQVJvTEFrQWdBQ2dDQ0NJSFFmLy8vLzhIUmcwQUlBRW9BZ2hCLy8vLy93ZEdEUUFDUUNBQktBSU1SUTBBQWtBQ1FBSkFJQVFPQlFBQkFRRUFBUXNnQlNBRktBSVFJZ1pCQVdzMkFoQWdBU0FGUVFocUVOTUJJUU1nQlNBR05nSVFJQU5CQUVvTkFTQUREUUlnQkVFRVJnMEJJQUFvQWhBZ0FDZ0NEQ0lESUFOQkJYUWdCMnNRbVFJTkFRd0NDeUFHUlEwQkN5QUFJQUJDQVVILy8vLy9BMEVCRUhVZ0FTQUJJQVZCQ0dwQi8vLy8vd05CQVJEa0FYSkJJSEVOQVFzZ0FTQUJLQUlFSUFJb0FnUnpOZ0lFSUFBZ0NqWUNCQ0FCUWYvLy8vOERRUUVRemdFaEJBd0JDeUFBRURVZ0FSQTFRU0FoQkFzZ0JVRXdhaVFBSUFRUEMwSEQvUUJCMVB3QVFjd05RZC9TQUJBQUFBdEJzdjBBUWRUOEFFSE5EVUhmMGdBUUFBQUxRZkhJQUVIVS9BQkJ6ZzFCMzlJQUVBQUFDL2NCQVFSL0l3QkJJR3NpQnlRQUFrQWdBa0VCUmdSQUlBQWdBVFVDQUJBd0lRTU1BUXNnQkVFQmRDQURRUUZxSWdsMlFRRnFRUUYySVFnZ0JpQURRUlJzYWlJS0tBSU1SUVJBSUFvZ0JTQUlRZi8vLy84RFFRRVEvQUlpQXcwQkN5QUFJQUVnQ0VFQ2RHb2dBaUFJYXlBSklBUWdCU0FHRU9VRElnTU5BQ0FBSUFBZ0NrSC8vLy8vQTBFQkVFTWlBdzBBSUFBb0FnQWhBaUFIUWdBM0FoZ2dCMEtBZ0lDQWdJQ0FnSUIvTndJUUlBY2dBallDRENBSFFReHFJQUVnQ0NBSklBUWdCU0FHRU9VRElnTkZCRUFnQUNBQUlBZEJER3BCLy8vLy93TkJBUkRMQVNFREN5QUhRUXhxRUJzTElBZEJJR29rQUNBREM2WUJBUVYvUVg4aEJnSkFJQUVvQWdBaUJFRUFTQVJBSUFBb0FnQWlCU2dDQUNBQUtBSVFJQUFvQWd3aUEwRUJhaUlISUFOQkEyeEJBWFlpQXlBRElBZElHeUlEUVFKMElBVW9BZ1FSQVFBaUJVVU5BU0FBSUFVMkFoQWdCU0FESUFBb0Fnd2lCbXNpQjBFQ2RHb2dCU0FHUVFKMEVKd0JJQUFnQXpZQ0RDQUVJQWRxSVFRTElBQW9BaEFnQkVFQ2RHb2dBallDQUNBQklBUkJBV3MyQWdCQkFDRUdDeUFHQzNZQkFuOGdBU0FCTFFBQVFYeHhRUUZ5SWdRNkFBQWdBU0FDTFFBTVFRSjBRUVJ4SUFSQmVYRnlJZ1E2QUFBZ0FTQUVRWFZ4SUFJdEFBeEJBblJCQ0hGeUlnUTZBQUFnQWkwQURDRUZJQUVnQXpzQkFpQUJJQVJCRFhFZ0JVRUJkRUh3QVhGeU9nQUFJQUVnQUNBQ0tBSUFFQmcyQWdRTHl3SUJBMzhnQUVHWUF4QmZJZ1lFUUNBR0lBQTJBZ0FnQmtGL05nSUlJQVlnQVRZQ0JDQUdJQVpCRUdvaUJ6WUNGQ0FHSUFjMkFoQWdBUVJBSUFFb0FoQWlCeUFHUVJocUlnZzJBZ1FnQmlBQlFSQnFOZ0ljSUFZZ0J6WUNHQ0FCSUFnMkFoQWdCaUFCTFFCdU9nQnVJQVlnQVNnQ3ZBRTJBZ3dMSUFZZ0F6WUNMQ0FHSUFJMkFpQWdBQ2dDRUNFQklBWkNBRGNDaUFJZ0JrSUFOd0tBQWlBR0lBRTJBcFFDSUFaQmZ6WUNtQUlnQmtFN05nS1FBaUFHUVFBMkFuQWdCa0dRQVdwQi93RkJLQkFyR2lBR1FvU0FnSUFRTndMRUFTQUdJQVpCMEFGcU5nTE1BU0FHUW44M0F0QUJJQVpCZnpZQzhBRWdCa0tBZ0lDQWNEY0N2QUVnQUNBRUVLb0JJUUVnQmlBRk5nTHdBaUFHSUFFMkF1d0NJQUFvQWhBaEFDQUdRZ0EzQXZ3Q0lBWkNBRGNDOUFJZ0JpQUFOZ0tJQXlBR1FUczJBb1FESUFZZ0JUWUNuQUlMSUFZTExBRUJmd0pBSUFHbktBSWdJZ05GRFFBZ0F5a0RBQ0lCUW9DQWdJQmdWQTBBSUFBZ0FhY2dBaEVBQUFzTFpRRUNmeUFCSUFFb0FnQkJBV3NpQWpZQ0FBSkFJQUpGQkVBZ0FTZ0NCRVVOQVNBQktBSVFJZ0lnQVNnQ0ZDSUROZ0lFSUFNZ0FqWUNBQ0FCUWdBM0FoQWdBRUVRYWlBQklBQW9BZ1FSQUFBTER3dEI0aHhCcnZ3QVFjYmxBa0cwOFFBUUFBQUx2QVFEQTN3RGZ3SitBbndDUUNBQUVMQUNRZjhQY1NJRlJBQUFBQUFBQUpBOEVMQUNJZ1JyUkFBQUFBQUFBSUJBRUxBQ0lBUnJTUVJBSUFVaEJBd0JDeUFFSUFWTEJFQWdBRVFBQUFBQUFBRHdQNkFQQzBFQUlRUkVBQUFBQUFBQWtFQVFzQUlnQlVzTkFFUUFBQUFBQUFBQUFDQUF2U0lIUW9DQWdJQ0FnSUI0VVEwQkdrUUFBQUFBQUFEd2Z4Q3dBaUFGVFFSQUlBQkVBQUFBQUFBQThEK2dEd3NnQjBJQVV3UkFSQUFBQUFBQUFBQVFFSXdHRHd0RUFBQUFBQUFBQUhBUWpBWVBDMEdBQ0NzREFDQUFva0dJQ0NzREFDSUJvQ0lDSUFHaElnRkJtQWdyQXdDaUlBRkJrQWdyQXdDaUlBQ2dvQ0lCSUFHaUlnQWdBS0lnQVVHNENDc0RBS0pCc0FnckF3Q2dvaUFBSUFGQnFBZ3JBd0NpUWFBSUt3TUFvS0lnQXIwaUI2ZEJCSFJCOEE5eElnVkI4QWhxS3dNQUlBR2dvS0FoQVNBRlFmZ0lhaWtEQUNBSFFpMkdmQ0VJSUFSRkJFQUNmQ0FIUW9DQWdJQUlnMUFFUUNBSVFvQ0FnSUNBZ0lDSVAzMi9JZ0FnQWFJZ0FLQkVBQUFBQUFBQUFIK2lEQUVMSUFoQ2dJQ0FnSUNBZ1BBL2ZMOGlBaUFCb2lJQklBS2dJZ05FQUFBQUFBQUE4RDlqQkh3akFFRVFheUlFSVFZZ0JFS0FnSUNBZ0lDQUNEY0RDQ0FHSUFRckF3aEVBQUFBQUFBQUVBQ2lPUU1JUkFBQUFBQUFBQUFBSUFORUFBQUFBQUFBOEQrZ0lnQWdBU0FDSUFPaG9DQURSQUFBQUFBQUFQQS9JQUNob0tDZ1JBQUFBQUFBQVBDL29DSUFJQUJFQUFBQUFBQUFBQUJoR3dVZ0F3dEVBQUFBQUFBQUVBQ2lDdzhMSUFpL0lnQWdBYUlnQUtBTEN4NEFJQUVvQWdCQkJFY0VRQ0FBSUFGQkNHb1EvZ0lnQVVFRU5nSUFDd3Z6QWdFRmZ5QUJJQUZCS0dvaUJqWUNMQ0FCSUFZMkFpZ2dBU0FDcHlJSEtBSWdJZ1l0QUJBMkFqZ2dBU0FHS0FJVU5nSXdJQUVnQUVFQklBWXZBUzRnQmk4QktDSUFJQVFnQUNBRVNoc2lDQ0FHTHdFcWFtb2lBQ0FBUVFGTUcwRURkQkFwSWdBMkFpQWdBRVVFUUVGL0R3c2dBa0lnaUtkQmRVOEVRQ0FISUFjb0FnQkJBV28yQWdBTElBRWdBamNER0NBRFFpQ0lwMEYxVHdSQUlBT25JZ2NnQnlnQ0FFRUJhallDQUFzZ0FTQUVOZ0lJSUFFZ0F6Y0RBQ0FCSUFnMkFqUWdBU0FBSUFoQkEzUnFJZ2MyQWlRZ0FTQUhJQVl2QVNvaUJrRURkR28yQWp4QkFDRUJJQVJCQUNBRVFRQktHeUVIQTBBZ0FTQUhSd1JBSUFVZ0FVRURkQ0lKYWlrREFDSUNRaUNJcDBGMVR3UkFJQUtuSWdvZ0NpZ0NBRUVCYWpZQ0FBc2dBQ0FKYWlBQ053TUFJQUZCQVdvaEFRd0JDd3NnQkNBR0lBaHFJZ0VnQVNBRVNCc2hBUU4vSUFFZ0JFWUVmMEVBQlNBQUlBUkJBM1JxUW9DQWdJQXdOd01BSUFSQkFXb2hCQXdCQ3dzTE13QWdBQ0FDUVFFUTZnRWlBRVVFUUVLQWdJQ0E0QUFQQ3lBQVFSQnFJQUVnQWtFQmRCQWZHaUFBclVLQWdJQ0FrSCtFQzRZQkFnRitBbjhnQVNrREdDSURRb0NBZ0lCZ1dnUkFJQUFnQTZjZ0FoRUFBQXNnQVNrREFDSURRb0NBZ0lCZ1dnUkFJQUFnQTZjZ0FoRUFBQXNDUUNBQktBSThJZ1ZGRFFBZ0FTZ0NJQ0VFQTBBZ0JDQUZUdzBCSUFRcEF3QWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFnQVNnQ1BDRUZDeUFFUVFocUlRUU1BQXNBQ3d2VkNRSUJmZ1YvQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FTMEFCRUVQY1E0R0FBRUVBZ01GQ0FzZ0FDQUJLQUlRSWdZZ0FoRUFBQ0FHUVRCcUlRY0RRQ0FFSUFZb0FpQk9SUVJBQWtBZ0J5Z0NCRVVOQUNBQktBSVVJQVJCQTNScUlRVUNRQUpBQWtBQ1FDQUhLQUlBUVI1MlFRRnJEZ01BQVFJREN5QUZLQUlBSWdnRVFDQUFJQWdnQWhFQUFBc2dCU2dDQkNJRlJRMERJQUFnQlNBQ0VRQUFEQU1MSUFVb0FnQWlCUzBBQlVFQmNVVU5BaUFBSUFVZ0FoRUFBQXdDQ3lBQUlBVW9BZ0JCZkhFZ0FoRUFBQXdCQ3lBRktRTUFJZ05DZ0lDQWdHQlVEUUFnQUNBRHB5QUNFUUFBQ3lBRVFRRnFJUVFnQjBFSWFpRUhEQUVMQ3lBQkx3RUdJZ1JCQVVZTkJTQUFLQUpFSUFSQkdHeHFLQUlNSWdSRkRRVWdBQ0FCclVLQWdJQ0FjSVFnQWlBRUVSRUFEd3NEUUNBQktBSTRJQVJLQkVBZ0FTZ0NOQ0FFUVFOMGFpa0RBQ0lEUW9DQWdJQmdXZ1JBSUFBZ0E2Y2dBaEVBQUFzZ0JFRUJhaUVFREFFTEN5QUJLQUl3SWdGRkRRUWdBQ0FCSUFJUkFBQVBDeUFCTFFBRlFRRnhSUTBFSUFFb0FoQXBBd0FpQTBLQWdJQ0FZRlFOQXd3R0N5QUJLQUlnQkVBZ0FDQUJRU2hxSUFJUTd3TUxJQUVwQXhBaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQXhnaUEwS0FnSUNBWUZRTkFnd0ZDeUFCS0FJc0lnRkZEUUVnQUNBQklBSVJBQUFQQ3lBQlFmZ0JhaUVFSUFGQjlBRnFJUWNEUUNBSElBUW9BZ0FpQlVjRVFFRUFJUVFEUUNBRUlBVW9BaGhPUlFSQUFrQWdCU2dDRkNBRVFSUnNhaUlHS0FJSURRQWdCaWdDQkNJR1JRMEFJQUFnQmlBQ0VRQUFDeUFFUVFGcUlRUU1BUXNMSUFVcEF6Z2lBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFVcEEwQWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFVcEExZ2lBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFVcEEyQWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFWQkJHb2hCQXdCQ3dzZ0FTa0R3QUVpQTBLQWdJQ0FZRm9FUUNBQUlBT25JQUlSQUFBTElBRXBBOGdCSWdOQ2dJQ0FnR0JhQkVBZ0FDQURweUFDRVFBQUN5QUJLUU93QVNJRFFvQ0FnSUJnV2dSQUlBQWdBNmNnQWhFQUFBc2dBU2tEdUFFaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxRUUFoQkNBQktRT29BU0lEUW9DQWdJQmdXZ1JBSUFBZ0E2Y2dBaEVBQUFzRFFBSkFJQVJCQ0VZRVFFRUFJUVFEUUNBRUlBQW9Ba0JPRFFJZ0FTZ0NLQ0FFUVFOMGFpa0RBQ0lEUW9DQWdJQmdXZ1JBSUFBZ0E2Y2dBaEVBQUFzZ0JFRUJhaUVFREFBTEFBc2dBU0FFUVFOMGFpa0RXQ0lEUW9DQWdJQmdXZ1JBSUFBZ0E2Y2dBaEVBQUFzZ0JFRUJhaUVFREFFTEN5QUJLUU9ZQVNJRFFvQ0FnSUJnV2dSQUlBQWdBNmNnQWhFQUFBc2dBU2tEb0FFaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQTFBaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQTBBaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQTBnaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQXpnaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQXpBaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVvQWlRaUFVVU5BQ0FBSUFFZ0FoRUFBQXNQQzBIeCtnQkJydndBUVk0c1FlRFFBQkFBQUFzUUFRQUxJQUFnQTZjZ0FoRUFBQXQ4QVFKL0lBQkJJQkFwSWdJRVFDQUNRUUUyQWdBZ0FrS0FnSUNBd0FCQ2dJQ0FnREFnQVJzM0F4Z2dBaUFDUVJocU5nSVFJQUlnQWkwQUJVRUJjam9BQlNBQUtBSVFJUUFnQWtFRE9nQUVJQUFvQWxBaUFTQUNRUWhxSWdNMkFnUWdBaUFBUWRBQWFqWUNEQ0FDSUFFMkFnZ2dBQ0FETmdKUUN5QUNDMG9CQW44Q1FDQUFMUUFBSWdKRklBSWdBUzBBQUNJRFIzSU5BQU5BSUFFdEFBRWhBeUFBTFFBQklnSkZEUUVnQVVFQmFpRUJJQUJCQVdvaEFDQUNJQU5HRFFBTEN5QUNJQU5yQzNzQkFuOGpBRUdRQVdzaUJDUUFRY0NXQVNFRkFrQUNRQUpBQWtBZ0FVRUJhZzRGQXdJQ0FBRUNDMEdCbGdFaEJRd0JDMEh3TWlFRkN5QUFLQUlRSUFSQjBBQnFJQU1Ra0FFaEFTQUVJQUFvQWhBZ0JFRVFhaUFDS0FJRUVKQUJOZ0lFSUFRZ0FUWUNBQ0FBSUFVZ0JCQ0FBZ3NnQkVHUUFXb2tBQXVJQVFFQ2Z5TUFRUkJySWdVa0FDQUZRUUEyQWd3Z0JVSUFOd0lFSUFBZ0FTQUNJQU1nQkNBRlFRUnFFSzRGSVFJZ0JTZ0NEQ0lCUVFBZ0FVRUFTaHNoQXlBRktBSUVJUUVEUUNBRElBWkdSUVJBSUFBZ0FTQUdRUU4wYWlnQ0JCQVRJQVpCQVdvaEJnd0JDd3NnQUNnQ0VDSUFRUkJxSUFFZ0FDZ0NCQkVBQUNBRlFSQnFKQUFnQWd1bEFRRUZmeU1BUVJCcklnTWtBRUYvSVFJQ1FDQUFLQUlVRFFBZ0FDZ0NBQ0FBS0FJRUlBRkJBWFJCRUdvZ0EwRU1haENvQVNJRVJRUkFJQUFRZ3dNTUFRc2dCRUVRYWlFRklBQW9BZ2doQWlBREtBSU1JUVlEUUNBQ1FRQk1SUVJBSUFVZ0FrRUJheUlDUVFGMGFpQUNJQVZxTFFBQU93RUFEQUVMQ3lBQVFRRTJBaEFnQUNBRU5nSUVJQUFnQmtFQmRpQUJhallDREVFQUlRSUxJQU5CRUdva0FDQUNDMFlCQVg4Z0FTQUJLQUlBSWdKQkFXczJBZ0FnQWtFQlRBUkFJQUVwQWdSQ2dJQ0FnSUNBZ0lEQUFGb0VRQ0FBSUFFUW9nTVBDeUFBUVJCcUlBRWdBQ2dDQkJFQUFBc0xNZ0FnQUVHTUFXc2lBRUVuVDBLUGdQKy81Z2tnQUsySVFnR0RVSEpGQkVBZ0FFRUNkRUhBL2dGcUtBSUFEd3NRQVFBTGNRRUJmZ0pBSUFBZ0FTQUFJQU1RcWdFaUF5QUJRUUFRRkNJRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQUlBSWdBeUFDUVFBUUZDSUNRb0NBZ0lCd2d5SUVRb0NBZ0lBd1VTQUVRb0NBZ0lEZ0FGRnlEUUVnQUNBQklBTWdBaEN4QlF3QkN5QUFJQVFRRHdzZ0FDQURFQk1MaXdrQkMzOGpBRUVRYXlJSUpBQUNRQUpBQWtBQ1FBSkFBa0FEUUNBQktBSVFJZ05CTUdvaEJpQURJQU1vQWhnZ0FuRkJmM01pQ1VFQ2RHb29BZ0FoQkVFQUlRTURRQ0FFQkVBZ0NDQUdJQVJCQVdzaUNrRURkR29pQlRZQ0RDQUZLQUlBSVFjZ0FpQUZLQUlFUmdSQVFRQWhCQ0FIUVlDQWdDQnhSUTBKUVg4aEJDQUFJQUVnQ0VFTWFoRFVBUTBKSUFFb0FoQWhBZ0pBSUFNRVFDQUNJQU1nQm10QkEzVkJBQ0FERzBFRGRHb2lBMEV3YWlBREtBSXdRWUNBZ0dCeElBZ29BZ3dvQWdCQi8vLy9IM0Z5TmdJQUlBZ29BZ3doQ1F3QkN5QUNJQWxCQW5ScUlBZ29BZ3dpQ1NnQ0FFSC8vLzhmY1RZQ0FBdEJBU0VFSUFJZ0FpZ0NKRUVCYWpZQ0pDQUFLQUlRSUFFb0FoUWdDa0VEZEdvaUF5QUpLQUlBUVJwMkVPd0ZJQUFnQ0NnQ0RDZ0NCQkFUSUFnb0Fnd2lCU0FGS0FJQVFmLy8veDl4TmdJQUlBZ29BZ3hCQURZQ0JDQURRb0NBZ0lBd053TUFJQUlvQWlRaUEwRUlTQTBKSUFNZ0FpZ0NJRUVCZGtrTkNTQUJLQUlRSWdjdEFCQU5CVUVDSUFjb0FpQWdCeWdDSkdzaUFpQUNRUUpNR3lJS0lBY29BaHhMRFFZZ0J5Z0NHRUVCYWlFRUEwQWdCQ0lDUVFGMklnUWdDazhOQUFzZ0FDQUtRUU4wSWcwZ0FrRUNkQ0lGYWtFd2FoQXBJZ1JGRFFnZ0FrRUJheUVMSUFjb0FnZ2lBaUFIS0FJTUlnTTJBZ1FnQXlBQ05nSUFJQWRDQURjQ0NDQUVJQVZxSUFkQk1CQWZJUVlnQUNnQ0VDSUNLQUpRSWdNZ0JrRUlhaUlKTmdJRUlBWWdBa0hRQUdvMkFnd2dCaUFETmdJSUlBSWdDVFlDVUVFQUlRTWdCRUVBSUFVUUt4b2dCMEV3YWlFRUlBWkJNR29oQWlBQktBSVVJUXhCQUNFSkEwQWdDU0FHS0FJZ0lnVlBSUVJBSUFRb0FnUWlCUVJBSUFJZ0JUWUNCQ0FDSUFRb0FnQkJnSUNBWUhFaUJTQUNLQUlBUWYvLy94OXhjallDQUNBQ0lBVWdCaUFFS0FJRUlBdHhRWDl6UVFKMGFpSUZLQUlBUWYvLy94OXhjallDQUNBRklBTkJBV29pQlRZQ0FDQU1JQU5CQTNScUlBd2dDVUVEZEdvcEF3QTNBd0FnQlNFRElBSkJDR29oQWdzZ0NVRUJhaUVKSUFSQkNHb2hCQXdCQ3dzZ0F5QUZJQVlvQWlSclJ3MEhJQVpCQURZQ0pDQUdJQW8yQWh3Z0JpQUxOZ0lZSUFZZ0F6WUNJQ0FCSUFZMkFoQWdBQ2dDRUNJQ1FSQnFJQWNnQnlnQ0dFRi9jMEVDZEdvZ0FpZ0NCQkVBQUVFQklRUWdBQ0FCS0FJVUlBMFFpUUlpQUVVTkNTQUJJQUEyQWhRTUNRVWdCMEgvLy84ZmNTRUVJQVVoQXd3Q0N3QUxDMEVCSVFRZ0FTMEFCU0lEUVFSeFJRMEdJQU5CQ0hGRkRRRWdBQ0FJUVFocUlBSVFyQUZGRFFZZ0NDZ0NDQ0lESUFFb0FpZ2lCVThOQmlBQkx3RUdJZ1JCQ0VZZ0JFRUNSbkpGQkVCQkFDRUVEQWNMSUFWQkFXc2dBMFlFUUNBQUlBRW9BaVFnQTBFRGRHb3BBd0FRRHlBQklBTTJBaWdNQmdzZ0FDQUJFSklEUlEwQUMwRi9JUVFNQlFzZ0FDZ0NFQ2dDUkNBQkx3RUdRUmhzYWlnQ0ZDSURSUTBFSUFNb0FnZ2lBMFVOQkNBQUlBR3RRb0NBZ0lCd2hDQUNJQU1SRlFBaEJBd0VDMEhpK2dCQnJ2d0FRYTBqUWNFNkVBQUFDMEcvM3dCQnJ2d0FRYkVqUWNFNkVBQUFDMEdxa1FGQnJ2d0FRZFlqUWNFNkVBQUFDMEVCSVFRTElBaEJFR29rQUNBRUMwRUFJQUFnQWlBQlFRQkJBQkFoSWdGQy8vLy8vMjlXSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkZ5UlFSQUlBQWdBUkFQSUFBUUpFS0FnSUNBNEFBUEN5QUJDNjRCQWdGK0FYOENRQ0FBS0FJUUtBS01BU0lEUlNBQlF2Ly8vLy8vLy84UFZuSU5BQ0FES0FJb1FRUnhSUTBBSUFGQ2dJQ0FnQWhVQkVBZ0FROExRb0NBZ0lEQWZpQUJ1YjBpQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3OExJQUFRbHdFaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBS25RUVJxSUFFUU1FVUVRQ0FDRHdzZ0FDQUNFQThnQUJCOEMwS0FnSUNBNEFBTFVnRUNmeU1BUVJCcklnSWtBQUovQWtBZ0FrRU1haUFCRUwwRlJRMEFJQUlvQWd3aUEwRUFTQTBBSUFBZ0FSRDJBeUFEUVlDQWdJQjRjZ3dCQ3lBQUlBRkJBUkNuQWdzaEFTQUNRUkJxSkFBZ0FRdVFBUUlEZndGK0lBRW9BaFFpQlNrREFDSUhRdi8vLy84UFZpQUJLQUlvSWdaQkFXb2lCQ0FIcDAxeVJRUkFJQUVvQWhBdEFETkJDSEZGQkVBZ0FDQUNFQThnQUNBRFFUQVF3QUlQQ3lBRklBU3ROd01BQ3dKQUlBUWdBU2dDSUUwTkFDQUFJQUVnQkJDc0JVVU5BQ0FBSUFJUUQwRi9Ed3NnQVNnQ0pDQUdRUU4wYWlBQ053TUFJQUVnQkRZQ0tFRUJDNjBCQWdaL0FYNENRQ0FCS1FKVUlnaW5RZjhCY1EwQUlBRWdDRUtBZm9OQ0FZUTNBbFFEUUNBQktBSVVJQUpNQkVCQkFBOExJQUVvQWhBZ0FrRURkR29pQnlnQ0FDRURRWDhoQmlBQUlBRW9BZ1FRa1FRaUJFVU5BUUpBSUFBZ0F4Q1JCQ0lEUlFSQVFRQWhCUXdCQ3lBQUlBUWdBeERKQlNFRklBQWdCQkJVSUFNaEJBc2dBQ0FFRUZRZ0JVVU5BU0FISUFVMkFnUWdBa0VCYWlFQ0lBQWdCUkQrQTBFQVRnMEFDd3NnQmdzekFRRi9Jd0JCMEFCcklnTWtBQ0FESUFBb0FoQWdBMEVRYWlBQkVKQUJOZ0lBSUFBZ0FpQURFSUFDSUFOQjBBQnFKQUFMT2dFQmZ5QUFLQUlRSWdNZ0FTQUNFS2NDSWdGRkJFQWdBQkI4UW9DQWdJRGdBQThMSUFNb0FqZ2dBVUVDZEdvMUFnQkNnSUNBZ0lCL2hBdU9CZ0lEZndGK0l3QkJFR3NpQ0NRQUFrQUNRQUpBQWtBQ1FDQUJMUUFGSWdkQkJIRkZEUUFnQVM4QkJpSUpRUUpHQkVBQ1FDQUhRUWh4QkVBQ1FDQUNRUUJJQkVBZ0NDQUNRZi8vLy84SGNTSUpOZ0lNSUFrZ0FTZ0NLRWNOQVNBSFFRRnhSUTBHSUFaQmdEQnhJQVlnQmtFSWRuRkJCM0ZCQjBkeURRRWdBMElnaUtkQmRVOEVRQ0FEcHlJQ0lBSW9BZ0JCQVdvMkFnQUxJQUFnQVNBRElBWVEvUU1oQnd3SkN5QUFJQWhCREdvZ0FoQ3NBVVVOQkF0QmZ5RUhJQUFnQVJDU0EwVU5BUXdIQ3lBQUlBaEJER29nQWhDc0FVVU5BZ3NnQUNBSVFRaHFJQUVvQWhRaUNTa0RBQkIzR2lBSUtBSU1RUUZxSWdjZ0NDZ0NDRTBOQVNBQktBSVFMUUF6UVFoeFJRUkFJQUFnQmtFd0VNQUNJUWNNQmdzZ0FDQUpJQWRCQUU0RWZpQUhyUVZDZ0lDQWdNQitJQWU0dlNJS1FvQ0FnSURBZ1lEOC93QjlJQXBDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEFnREFFTElBbEJGV3RCLy84RGNVRUtUUVJBSUFBZ0FoQ2VBeUlIUlEwQklBZEJBRWdOQkNBQUlBWkJueDhRYnlFSERBVUxJQVpCZ0lBSWNRMEFJQUFvQWhBb0FrUWdDVUVZYkdvb0FoUWlCMFVOQUNBQnJVS0FnSUNBY0lRaENpQUhLQUlNSWdjRVFDQUFJQW9nQWlBRElBUWdCU0FHSUFjUktnQWhCd3dGQ3lBQUlBb1FtUUVpQjBFQVNBMERJQWRGRFFFTElBRXRBQVZCQVhFTkFRc2dBQ0FHUWZmb0FCQnZJUWNNQWdzZ0FDQUJJQUlnQmtFRmNVRVFjaUFHUVFkeElBWkJnREJ4SWdJYkVIb2lBVVVOQUNBQ0JFQWdBVUVBTmdJQUFrQWdCa0dBRUhGRkRRQWdBQ0FFRURoRkRRQWdCS2NoQWlBRVFpQ0lwMEYxVHdSQUlBSWdBaWdDQUVFQmFqWUNBQXNnQVNBQ05nSUFDeUFCUVFBMkFnUkJBU0VISUFaQmdDQnhSUTBDSUFBZ0JSQTRSUTBDSUFXbklRQWdCVUlnaUtkQmRVOEVRQ0FBSUFBb0FnQkJBV28yQWdBTElBRWdBRFlDQkF3Q0N3SkFJQVpCZ01BQWNRUkFJQU5DSUlpblFYVlBCRUFnQTZjaUFDQUFLQUlBUVFGcU5nSUFDeUFCSUFNM0F3QU1BUXNnQVVLQWdJQ0FNRGNEQUF0QkFTRUhEQUVMUVg4aEJ3c2dDRUVRYWlRQUlBY0xSQUVCZnlNQVFSQnJJZ1VrQUNBRklBRWdBaUFESUFSQ2dJQ0FnSUNBZ0lDQWY0VVFjQ0FGS1FNQUlRRWdBQ0FGS1FNSU53TUlJQUFnQVRjREFDQUZRUkJxSkFBTEN3QWdBQ0FCUVFFUWpnUUxsd0VCQW45Qml3RWhBZ0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FFRUhJQUZDSUlpbklnTWdBMEVIYTBGdVNSdEJDMm9PRXdFTEFBa0VDZ29LQ2dvRkFnTUlCZ29LQ2dJS0MwR01BUThMUVkwQkR3dEJ4Z0FQQzBISEFBOExRY2dBRHdzZ0FhY3NBQVZCQUU0TkFRdEJ4UUFQQzBFYklRSWdBQ0FCRURnTkF3dEJ5UUFQQzBIS0FBOExRY3dBSVFJTElBSUxOUUVDZndKQUlBQkNnSUNBZ0hCVURRQWdBS2NpQkM4QkJrRU1SdzBBSUFRb0FpUWdBVWNOQUNBRUxnRXFJQUpHSVFNTElBTUxtd1FDQTM4QmZpTUFRU0JySWdja0FDQUJRaUNJcDBGMVR3UkFJQUduSWdZZ0JpZ0NBRUVCYWpZQ0FBc0NRQUpBQWtBQ1FBSkFBMEFDUUFKQUFrQWdBYWNpQmkwQUJVRUVjVVVOQUNBQUtBSVFLQUpFSUFZdkFRWkJHR3hxS0FJVUlnaEZEUUFnQ0NnQ0dDSUlSUTBBSUFBZ0FTQUNJQU1nQkNBRklBZ1JMUUFoQmd3QkN5QUFJQWNnQmlBQ0VFd2lCa0VBVGcwQkN5QUFJQUVRRHd3RkN3SkFJQVlFUUNBSExRQUFRUkJ4QkVBZ0FDQUhLUU1ZSWdtblFRQWdDVUtBZ0lDQWNJTkNnSUNBZ0RCU0d5QUVJQU1nQlJDTEF5RUdJQUFnQnlrREVCQVBJQUFnQnlrREdCQVBJQUFnQVJBUERBZ0xJQUFnQnlrRENCQVBJQWN0QUFCQkFuRU5BU0FBSUFFUUR3d0RDeUFBSUFFUWpBSWlBVUtBZ0lDQWNJTkNnSUNBZ0NCU0RRRUxDeUFBSUFFUUR5QUVRdi8vLy85dldBUkFJQUFnQXhBUElBQWdCVUgwTUJCdklRWU1CUXNnQUNBSElBU25JZ2dnQWhCTUlnWkJBRWdOQXlBR1JRMENJQWN0QUFCQkVIRUVRQ0FBSUFjcEF4QVFEeUFBSUFjcEF4Z1FEeUFBSUFNUUR5QUFJQVZCcDlFQUVHOGhCZ3dGQ3lBQUlBY3BBd2dRRHlBSExRQUFRUUp4UlEwQUlBZ3ZBUVpCQzBjTkFRc2dBQ0FERUE4Z0FDQUZJQUlRd0FJaEJnd0RDeUFBSUFRZ0FpQURRb0NBZ0lBd1FvQ0FnSUF3UVlEQUFCQnRJUVlNQVFzZ0FDQUlJQUlnQTBLQWdJQ0FNRUtBZ0lDQU1DQUZRWWZPQUhJUWdRUWhCZ3NnQUNBREVBOExJQWRCSUdva0FDQUdDMjBCQW44Q1FDQUJRb0NBZ0lCd1ZBMEFJQUduSWdNdkFRWVE3Z0ZGRFFBZ0F5Z0NJQzBBRVVFSWNVVU5BQ0FES0FJb0lnUUVRQ0FBSUFTdFFvQ0FnSUJ3aEJBUEMwRUFJUUFnQWtLQWdJQ0FjRm9FUUNBQ3B5SUFJQUFvQWdCQkFXbzJBZ0FMSUFNZ0FEWUNLQXNMREFBZ0FFSDIwZ0JCQUJBVkM4RUNBZ1ovQVg0akFFRVFheUlHSkFBQ1FDQUNRdi8vLy85dldBUkFJQUJCdnpGQkFCQVZEQUVMSUFBZ0JrRU1haUFDRU5ZQkRRQWdCaWdDRENJRVFZR0FCRThFUUNBQVFjQXpRUUFRUmd3QkN5QUFRUUVnQkNBRVFRRk5HMEVEZEJCZklnVkZEUUFDUUFKQUlBS25JZ2N2QVFZaUNFRUlSeUFJUVFKSGNRMEFJQWN0QUFWQkNIRkZEUUFnQkNBSEtBSW9SdzBBQTBBZ0F5QUVSZzBDSUFOQkEzUWlDQ0FIS0FJa2Fpa0RBQ0lDUWlDSXAwRjFUd1JBSUFLbklnQWdBQ2dDQUVFQmFqWUNBQXNnQlNBSWFpQUNOd01BSUFOQkFXb2hBd3dBQ3dBTEEwQWdBeUFFUmcwQklBQWdBaUFERUxBQklnbENnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUZJQU5CQTNScUlBazNBd0FnQTBFQmFpRUREQUVMQ3lBQUlBVWdBeENiQTBFQUlRTU1BUXNnQVNBRU5nSUFJQVVoQXdzZ0JrRVFhaVFBSUFNTG5RSUNBbjhCZmdKK1FvQ0FnSURnQUNBQUVIc05BQm9DUUFKQUlBRkNnSUNBZ0hCYUJFQWdBYWNpQnkwQUJVRVFjVVVFUUNBQVFhSStRUUFRRlVLQWdJQ0E0QUFQQ3lBRlFRRnlJUVlnQnk4QkJpSUZRUTFHRFFJZ0FDZ0NFQ2dDUkNBRlFSaHNhaWdDRUNJRkRRRUxJQUJCbTh3QVFRQVFGVUtBZ0lDQTRBQVBDeUFBSUFFZ0FpQURJQVFnQmlBRkVSWUFEd3NnQnlnQ0lDMEFFVUVFY1FSQUlBQWdBVUtBZ0lDQU1DQUNJQU1nQkNBR0VOZ0JEd3RDZ0lDQWdPQUFJQUFnQWtFQkVHVWlDRUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFHaUFBSUFFZ0NDQUNJQU1nQkNBR0VOZ0JJZ0ZDLy8vLy8yOVlJQUZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSnhSUVJBSUFBZ0NCQVBJQUVQQ3lBQUlBRVFEeUFJQ3d2bUFRRURmeUFCUVJ4cUlRUWdBVUVZYWlFRkEwQWdCU0FFS0FJQUlnUkhCRUFDUUNBRVFRSnJMd0VBSUFKSERRQWdCRUVEYXkwQUFFRUJka0VCY1NBRFJ3MEFJQVJCQ0dzaUFDQUFLQUlBUVFGcU5nSUFJQUFQQ3lBRVFRUnFJUVFNQVFzTElBQkJJQkFwSWdCRkJFQkJBQThMSUFCQkFUWUNBQ0FBSUFJN0FRWWdBQ0FBTFFBRlFmd0JjU0FEUVFGMFFRSnhjam9BQlNBQktBSVlJZ1FnQUVFSWFpSUdOZ0lFSUFBZ0JUWUNEQ0FBSUFRMkFnZ2dBU0FHTmdJWUlBRkJFRUVVSUFNYmFpZ0NBQ0VCSUFCQ2dJQ0FnREEzQXhnZ0FDQUJJQUpCQTNScU5nSVFJQUFMaXdJQ0FYOEJmZ0pBQWtBZ0FDQUJweUlFTHdBUlFRTjJRUVp4UWE3QUFXb3ZBUUFRZGlJRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBTUFRc0NRQ0FBSUFVZ0JDQUNJQU1RMWdVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdBU0FFS0FJY0lnSkJMeUFDR3lBRUx3RXNFSllESUFRdkFCRWlBa0VRY1FSQUlBQWdBQ2dDS0VISUEwSDRBaUFDUVRCeFFUQkdHMm9wQXdBUVJ5SUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBQ0FCUVRzZ0JVRUNFQmthSUFFUEN5QUNRUUZ4UlEwQ0lBRkNnSUNBZ0hCYUJFQWdBYWNpQWlBQ0xRQUZRUkJ5T2dBRkN5QUFJQUZCTzBFQVFRQkJBaENWQXhvZ0FROExDeUFBSUFFUUQwS0FnSUNBNEFBaEFRc2dBUXRZQWdGL0FYNUNnSUNBZ0NBaEEwRVNJQUZDSUlpbklnSkJDMm9nQWtFSGEwRnVTUnNpQWtFU1MwR2ZzQkFnQW5aQkFYRkZjZ1IrUW9DQWdJQWdCU0FBS0FJb0lBSkJBblJCc1AwQmFpZ0NBRUVEZEdvcEF3QUxDNmNEQWdGK0EzOGpBRUV3YXlJRUpBQkI1UDhBSVFWQ2dJQ0FnT0FBSVFNQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQkJCeUFCUWlDSXB5SUdJQVpCQjJ0QmJra2JRUXRxRGhNS0NBa0dBQXNMQ3dzTUJRRUNBd1FMQ3c0SEN3c2dCa0YxU1EwTUlBR25JZ0FnQUNnQ0FFRUJhallDQUF3TUN5QUVJQUUrQWdBZ0JFRVFhaUlGUVNCQjlQc0FJQVFRVGhvTUNnc2dBRUVEUVFJZ0FhY2JFQzBoQXd3TEN5QUFRUUVRTFNFRERBb0xJQUJCeFFBUUxTRUREQWtMSUFBZ0FVRUFFSkFDSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRTU1DUXNnQUNBQklBSVFqZ1FoQXlBQUlBRVFEd3dJQ3lBQ0JFQWdCa0YxU1EwSElBR25JZ0FnQUNnQ0FFRUJhallDQUF3SEN5QUFRZW5hQUVFQUVCVU1Cd3NnQUNBQlFvQ0FnSURBZ1lEOC93Qjh2MEVLUVFCQkFCQ1BBaUVEREFZTElBQWdBU0FBS0FJUUtBS1VBaEVJQUNFRERBVUxJQUFnQVNBQUtBSVFLQUt3QWhFSUFDRUREQVFMSUFBZ0FTQUFLQUlRS0FMTUFoRUlBQ0VEREFNTFFkSC9BQ0VGQ3lBQUlBVVFZaUVEREFFTElBRWhBd3NnQkVFd2FpUUFJQU1MWEFFRGZ5QUFRZlFCYWlFRUlBQW9BdmdCSVFNRFFDQUVJQU1pQWtjRVFDQUNLQUlFSVFNQ1FBSkFBa0FnQVE0REFnQUJCQXNnQWkwQVRBMEREQUVMSUFJcEFreENJSVpDT0llbkRRSUxJQUFnQWtFSWF4RG5CUXdCQ3dzTFVBRURmeUFBS0FMVUFTQUJLQUlVUVNBZ0FDZ0N5QUZyZGtFQ2RHb2hBZ05BSUFJaUF5Z0NBQ0lFUVNocUlRSWdBU0FFUncwQUN5QURJQUVvQWlnMkFnQWdBQ0FBS0FMUUFVRUJhellDMEFFTE1RSUJmd0YrSUFBZ0FSQXRJZ05DZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FBSUFNUXN3RWhBaUFBSUFNUUR3c2dBZ3MzQUNBQUlBRWdBaUFEQW45QkFDQUFLQUlRSWdBdEFJZ0JEUUFhUVFFZ0FDZ0NqQUVpQUVVTkFCb2dBQ2tEQ0JDakEwVUxFUEFGQy9vRUFRVi9JQUFvQWdBaEF3SkFBa0FEUUNBRExRQUFJUVFnQXlFQ0FrQURRQ0FDUVFGcUlRTWdCQ0lHUVM5SEJFQWdCa0VKYXlJRlFSZExEUVJCQVNBRmRDSUZRWTJBZ0FSeERRTWdCVUVTY1VVTkJDQUJSUTBEREFJTElBTXRBQUFpQWtFcVJnUkFJQU1oQWdOQUlBSWlBMEVCYWlFQ0lBTXRBQUVpQkVFTlJ3UkFJQVJGRFFNZ0FVRUFJQVJCQ2tZYkRRUWdCRUVxUncwQklBTXRBQUpCTDBjTkFTQURRUU5xSVFNTUJRc2dBVVVOQUFzTUFnc0xRUzhoQlNBQ1FTOUhEUU5CTHlFRUlBRU5BQU5BQWtBQ1FDQUVJZ0pCQ21zT0JBUUJBUVFBQ3lBQ1JRMERDeUFETFFBQklRUWdBMEVCYWlFRERBQUxBQXNMUVFvUEMwRTlJUVVDZnlBR1FUMUdCRUJCcG44Z0F5MEFBRUUrUmcwQkdnd0NDeUFFSWdVUTd3SkZEUUVDUUFKQUFrQUNRQUpBSUFRaUFVSGxBR3NPQlFFQ0JBUUFBd3NDUUFKQUlBTXRBQUJCN1FCckRnSUJBQVVMSUFJdEFBSVF4UUVOQkVHNWZ3OExJQUl0QUFKQjhBQkhEUU1nQWkwQUEwSHZBRWNOQXlBQ0xRQUVRZklBUncwRElBSXRBQVZCOUFCSERRTWdBaTBBQmhERkFRMERJQUFnQWtFR2FqWUNBRUZQRHdzZ0F5MEFBRUg0QUVjTkFpQUNMUUFDUWZBQVJ3MENJQUl0QUFOQjd3QkhEUUlnQWkwQUJFSHlBRWNOQWlBQ0xRQUZRZlFBUncwQ0lBSXRBQVlReFFFTkFpQUFJQUpCQm1vMkFnQkJUUThMSUFNdEFBQkI5UUJIRFFFZ0FpMEFBa0h1QUVjTkFTQUNMUUFEUWVNQVJ3MEJJQUl0QUFSQjlBQkhEUUVnQWkwQUJVSHBBRWNOQVNBQ0xRQUdRZThBUncwQklBSXRBQWRCN2dCSERRRWdBaTBBQ0JERkFRMEJRVWNQQ3lBQlFlOEFSdzBBSUFNdEFBQkI1Z0JIRFFBZ0FpMEFBaERGQVEwQVFWc1BDMEdEZndzUEN5QUZDNFVKQWdSL0NYNGpBRUhnQUdzaUJDUUFRb0NBZ0lBd0lRc2dCRUtBZ0lDQU1EY0RNQ0FFUW9DQWdJQXdOd01vSUFSQ2dJQ0FnREEzQXhnZ0JDQUVRY2dBYWlJR05nSkFJQVFnQUVFdkVDMGlDamNET0NBQUlBWkJBQkE5R2lBRUlBQVFQaUlJTndNZ1FvQ0FnSURnQUNFSkFrQUNRQ0FJUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFDUUFKQUlBQWdBaEE0QkVBZ0JDQUNOd01ZREFFTElBQWdBaERLQVNJRlFRQklEUUlnQlVVTkFDQUVJQUFRUGlJTk53TW9JQTFDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BaUFBSUFSQkNHb2dBaEE4RFFJZ0JDa0RDQ0lKUWdBZ0NVSUFWUnNoRUFOQUlBd2dFRkVOQVNBRUlBQWdBaUFNRUhNaUNEY0RFRUtBZ0lDQTRBQWhDU0FJUW9DQWdJQndneUlQUW9DQWdJRGdBRkVOQXdKQUFrQUNRQ0FJUW9DQWdJQndXZ1JBSUFpbkx3RUdRZjcvQTNGQkJFY05BaUFFSUFBZ0NCQTNJZ2czQXhBZ0NFS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkRBWUxJQWhDSUlpbklnVkJBQ0FGUVF0cVFSSkpHMFVFUUNBRUlBQWdDQkEzSWdnM0F4QWdDRUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEdEQUVMSUE5Q2dJQ0FnSkIvVWcwQkN5QUFJQTFCQVNBRVFSQnFFTllESWc5Q2dJQ0FnUEFBZzBLQWdJQ0E0QUJSQkVBZ0FDQUlFQThNQmdzZ0FDQVBFQ1lOQUNBQUlBMGdEaUFJRUlZQkdpQU9RZ0Y4SVE0TUFRc2dBQ0FJRUE4TElBeENBWHdoREF3QUN3QUxJQU5DSUlpbklnVkJkVThFUUNBRHB5SUhJQWNvQWdCQkFXbzJBZ0FMQWtBZ0EwS0FnSUNBY0ZvRVFBSkFBa0FDUUNBRHB5OEJCa0VFYXc0Q0FBRUNDeUFBSUFNUWpRRWhBd3dCQ3lBQUlBTVFOeUVEQzBLQWdJQ0E0QUFoQ1NBRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0EwSWdpS2NoQlFzQ1FDQUZRUUFnQlVFTGFrRVNTUnRGQkVBZ0FDQUVRUVJxSUFOQkNrRUFFRmNOQXlBRUlBQkIrNWtCSUFRb0FnUVFrd0lpQWpjRE1Bd0JDeUFEUW9DQWdJQndnMEtBZ0lDQWtIOVJCRUFnQkNBQUlBT25JZ1ZCQUVFS0lBVW9BZ1JCLy8vLy93ZHhJZ1VnQlVFS1R4c1FoQUVpQWpjRE1Bd0JDeUFLUWlDSXAwRjFUd1JBSUFxbklnVWdCU2dDQUVFQmFqWUNBQXNnQkNBS053TXdJQW9oQWdzZ0FDQURFQTlDZ0lDQWdPQUFJUWtnQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBUU5DSUxRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQkNnSUNBZ09BQUlRc01Bd3NnQVVJZ2lLY2lCVUYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0FDQUxRUzhnQVVFSEVCbEJBRWdOQWlBRlFYVlBCRUFnQWFjaUJTQUZLQUlBUVFGcU5nSUFDMEtBZ0lDQU1DRUpJQUFnQkVFWWFpQUxJQUVnQ2hEVkF5SUNRb0NBZ0lCd2d5SUJRb0NBZ0lBd1VRMENRb0NBZ0lEZ0FDRUpJQUZDZ0lDQWdPQUFVUVJBSUFFaENRd0RDeUFBSUFSQkdHb2dBaUFLRU5RRElRVWdCQ2dDUUNFR0lBVU5BaUFHRURZaENRd0RDeUFBSUFNUUR3d0JDMEtBZ0lDQTRBQWhDUXNnQmlnQ0FDZ0NFQ0lGUVJCcUlBWW9BZ1FnQlNnQ0JCRUFBQ0FHUVFBMkFnUUxJQUFnQ3hBUElBQWdCQ2tET0JBUElBQWdCQ2tETUJBUElBQWdCQ2tES0JBUElBQWdCQ2tESUJBUElBUkI0QUJxSkFBZ0NRdkZCQUlJZndGK0FrQUNRQUpBQWtBQ1FDQUNRb0NBZ0lCd2cwS0FnSUNBa0g5U0JFQWdBQ0FDRUNnaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ0lBS25JUVFNQVFzZ0FxY2lCQ0FFS0FJQVFRRnFOZ0lBQ3lBRVFSQnFJUWNnQkNrQ0JDSU1wMEgvLy8vL0IzRWhCZ0pBSUF4Q2dJQ0FnQWlEVUFSQVFRQWhCRUVBSVFNRFFDQUVJQVpHUlFSQUlBTWdCQ0FIYWkwQUFFRUhkbW9oQXlBRVFRRnFJUVFNQVFzTElBTkZCRUFnQnlFRUlBRU5CQXdHQ3lBQUlBTWdCbXBCQUJEcUFTSUlSUTBDSUFoQkVHb2hCRUVBSVFNRFFDQURJQVpHRFFJZ0F5QUhhaXdBQUNJRlFRQk9CSDhnQkVFQmFnVWdCQ0FGUVQ5eFFZQUJjam9BQVNBRlFjQUJjVUVHZGtGQWNpRUZJQVJCQW1vTElRa2dCQ0FGT2dBQUlBTkJBV29oQXlBSklRUU1BQXNBQ3lBQUlBWkJBMnhCQUJEcUFTSUlSUTBCSUFoQkVHb2hCQU5BSUFVaUNpQUdUZzBCSUFwQkFXb2hCU0FISUFwQkFYUnFMd0VBSWdsQi93Qk5CRUFnQkNBSk9nQUFJQVJCQVdvaEJBVUNRQ0FKUVlENEEzRkJnTEFEUnlBRGNpQUZJQVpPY2cwQUlBY2dCVUVCZEdvdkFRQWlDMEdBK0FOeFFZQzRBMGNOQUNBSlFRcDBRWUQ0UDNFZ0MwSC9CM0Z5UVlDQUJHb2hDU0FLUVFKcUlRVUxJQVFnQ1JDaEF5QUVhaUVFQ3d3QUN3QUxJQVJCQURvQUFDQUlJQVFnQ0VFUWFpSUhhMEgvLy8vL0IzR3RJQWdwQWdSQ2dJQ0FnSGlEaERjQ0JDQUFJQUlRRHlBQlJRMENJQWdvQWdSQi8vLy8vd2R4SVFZTUFRdEJBQ0VHUVFBaEIwRUFJUVFnQVVVTkFnc2dBU0FHTmdJQUN5QUhJUVFMSUFRTGp3TUJCSDhqQUVFUWF5SUVKQUFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQlFpQ0lweUlDUVF0cURnc0RBZ0lFQUFVRkJRWUJBUVVMSUFHbklnSXBBZ1JDZ0lDQWdJQ0FnSURBQUZRTkJpQUFJQUlRb2dNTUJ3c2dBQzBBYUVFQ1JnMEdJQUduSWdJb0FnZ2lBeUFDS0FJTUlnVTJBZ1FnQlNBRE5nSUFJQUpCQURZQ0RDQUFLQUpjSVFNZ0FDQUNRUWhxSWdVMkFsd2dBaUFETmdJTUlBSWdBRUhZQUdvaUFqWUNDQ0FESUFVMkFnQWdBQzBBYUEwR0lBQkJBVG9BYUFOQUlBSWdBQ2dDWENJRFJ3UkFJQU5CQ0dzaUF5Z0NBQTBKSUFBZ0F4RHRCUXdCQ3dzZ0FFRUFPZ0JvREFZTElBR25JZ0pCQkdvUUd5QUFRUkJxSUFJZ0FDZ0NCQkVBQUF3RkN5QUJweUlDUVFScUVCc2dBRUVRYWlBQ0lBQW9BZ1FSQUFBTUJBc2dBQ0FCcHhDaUF3d0RDeUFFSUFJMkFnQWpBRUVRYXlJQUpBQWdBQ0FFTmdJTVFaRElCRUdUbXdFZ0JCQ2JCQ0FBUVJCcUpBQUxFQUVBQ3lBQVFSQnFJQUlnQUNnQ0JCRUFBQXNnQkVFUWFpUUFEd3RCNFk0QlFhNzhBRUhiS2tIWEp4QUFBQXNnQVFGK0lBQWdBQ0FDSUFGQkFVRUNRUUFRZ2dFaUJDQUJJQU1RM2dFZ0JBdjlDUUlMZndGK0l3QkJ3QUpySWdNa0FBSkFJQUpDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFRb0NBZ0lEZ0FDRU9JQUFnQTBIY0FHb2dBaERsQVNJR1JRMEJJQU1vQWx3aENBTkFJQVFnQ0VjRVFBSkFJQVFnQm1vc0FBQkI1d0JyUVI5M0lnZEJDVXRCeXdVZ0IzWkJBWEZGY2tVRVFDQUhRUUowUWZ6OUFXb29BZ0FpQnlBRmNVVU5BUXNnQUNBR0VGUWdBRUhRT0VFQUVJQUNEQVFMSUFSQkFXb2hCQ0FGSUFkeUlRVU1BUXNMSUFBZ0JoQlVDMEtBZ0lDQTRBQWhEaUFBSUFOQjNBQnFJQUVnQlVFRWRrRUJjU0lFUlJDVkJDSUlSUTBBSUFNb0Fsd2hCaUFEUWJ3QmFrRUFRWUFCRUNzYUlBTkNBRGNEYUNBRFFnQTNBcXdCSUFNZ0FEWUN1QUVnQTBFME5nSzBBU0FEUVg4MkFwd0JJQU5DZ1lDQWdIQTNBcFFCSUFNZ0JEWUNpQUVnQXlBSU5nS0FBU0FESUFZZ0NHbzJBbndnQXlBSU5nSjRJQU1nQURZQ29BRWdBMElBTndOZ0lBTWdBRFlDZENBRFFnQTNBcVFCSUFOQk5EWUNjQ0FESUFVMkFvUUJJQU1nQlVFRGRrRUJjVFlDa0FFZ0F5QUZRUUYyUVFGeE5nS01BU0FEUWVBQWFpSUVJQVZCL3dGeEVCRWdCRUVBRUJFZ0JFRUFFQkVnQkVFQUVCMGdCVUVnY1VVRVFDQURRZUFBYWlJRVFRaEJCaEM0QVJvZ0JFRUVFQkVnQkVFSFFYVVF1QUVhQ3lBRFFlQUFhaUlFUVF0QkFCQ3BBZ0ovQWtBZ0JFRUFFUElDRFFBZ0EwSGdBR29pQkVFTVFRQVFxUUlnQkVFS0VCRWdBeWdDZUMwQUFBUkFJQU5CNEFCcVFZL3pBRUVBRURvTUFRc2dBeWdDYkFSQUlBTkI0QUJxRUtnQ0RBRUxJQU1vQW1SQkIyc2hDeUFES0FKZ0lneEJCMm9oRFVFQUlRUkJBQ0VGQWtBQ1FBSkFBa0FDUUFOQUlBVWdDMGdFUUNBRklBMXFJZ1l0QUFBaUNrRWRUdzBFSUFVZ0NrSHdnUUpxTFFBQUlnZHFJQXRLRFFVQ1FBSkFBa0FDUUFKQUlBcEJEMnNPREFBQkJBUUVCQUlEQkFRQUFRUUxJQVJCQVdvaEJpQUVJQWxJQkVBZ0JpRUVEQVFMSUFSQi9nRktJUW9nQmlJRUlRa2dDa1VOQXd3R0N5QUVRUUJNRFFrZ0JFRUJheUVFREFJTElBWXZBQUZCQW5RZ0Iyb2hCd3dCQ3lBR0x3QUJRUU4wSUFkcUlRY0xJQVVnQjJvaEJRd0JDd3NnQ1VFQVRnMEJDeUFEUWVBQWFrSGpOVUVBRURvTUJBc2dEQ0FES0FLVUFUb0FBU0FES0FKZ0lBazZBQUlnQXlnQ1lDQURLQUprUVFkck5nQURJQU1vQXFnQklnUWdBeWdDbEFGQkFXdExCRUFnQTBIZ0FHb2dBeWdDcEFFZ0JCQnlJQU1vQW1BaUJDQUVMUUFBUVlBQmNqb0FBQXNnQXlnQ3BBRWlCQVJBSUFNb0FyZ0JJQVJCQUNBREtBSzBBUkVCQUJvTElBTkJBRG9BRUNBREtBSmdJUVVnQXlnQ1pBd0VDMEd4Z1FGQndQd0FRZm9OUVlUZ0FCQUFBQXRCN3RBQVFjRDhBRUg3RFVHRTRBQVFBQUFMUWZTTkFVSEEvQUJCaUE1QmhPQUFFQUFBQ3lBREtBSmdJZ1FFUUNBREtBSjBJQVJCQUNBREtBSndFUUVBR2dzZ0EwSUFOd053SUFOQ0FEY0RhQ0FEUWdBM0EyQWdBeWdDcEFFaUJBUkFJQU1vQXJnQklBUkJBQ0FES0FLMEFSRUJBQm9MSUFOQnBBRnFJZ1JDQURjQ0FDQUVRZ0EzQWhBZ0JFSUFOd0lJSUFOQnZBRnFJUVJCQUNFRkEwQWdBMEVRYWlBRmFpRUdJQVF0QUFBaUIwVWdCVUUrUzNKRkJFQWdCaUFIT2dBQUlBVkJBV29oQlNBRVFRRnFJUVFNQVFzTElBWkJBRG9BQUVFQUlRVkJBQXNoQkNBQUlBZ1FWQ0FGUlFSQUlBTWdBMEVRYWpZQ0FDQUFRWlU5SUFNUWdBSU1BUXNnQUNBRklBUVFoQU1oRGlBQUtBSVFJZ0JCRUdvZ0JTQUFLQUlFRVFBQUN5QURRY0FDYWlRQUlBNEwxQUlCQkg4akFFSFFBV3NpQlNRQUlBVWdBallDekFFZ0JVR2dBV29pQWtFQVFTZ1FLeG9nQlNBRktBTE1BVFlDeUFFQ1FFRUFJQUVnQlVISUFXb2dCVUhRQUdvZ0FpQURJQVFRaEFaQkFFZ0VRRUYvSVFRTUFRc2dBQ2dDVEVFQVRpRUdJQUFvQWdBaEJ5QUFLQUpJUVFCTUJFQWdBQ0FIUVY5eE5nSUFDd0ovQWtBQ1FDQUFLQUl3UlFSQUlBQkIwQUEyQWpBZ0FFRUFOZ0ljSUFCQ0FEY0RFQ0FBS0FJc0lRZ2dBQ0FGTmdJc0RBRUxJQUFvQWhBTkFRdEJmeUFBRU00RERRRWFDeUFBSUFFZ0JVSElBV29nQlVIUUFHb2dCVUdnQVdvZ0F5QUVFSVFHQ3lFQ0lBZ0VRQ0FBUVFCQkFDQUFLQUlrRVFFQUdpQUFRUUEyQWpBZ0FDQUlOZ0lzSUFCQkFEWUNIQ0FBS0FJVUlRRWdBRUlBTndNUUlBSkJmeUFCR3lFQ0N5QUFJQUFvQWdBaUFDQUhRU0J4Y2pZQ0FFRi9JQUlnQUVFZ2NSc2hCQ0FHUlEwQUN5QUZRZEFCYWlRQUlBUUxKQUFnQUVJQU53TndJQUFnQUNnQ0NEWUNhQ0FBSUFBb0Fpd2dBQ2dDQkd1c053TjRDeEFBSUFBZ0FTQUNRUUJCQUJDWkJCb0x0UmdERkg4RWZBRitJd0JCTUdzaUNTUUFBa0FDUUFKQUlBQzlJaHBDSUlpbklnSkIvLy8vL3dkeElnTkIrdFM5Z0FSTkJFQWdBa0gvL3o5eFFmdkRKRVlOQVNBRFFmeXlpNEFFVFFSQUlCcENBRmtFUUNBQklBQkVBQUJBVlBzaCtiK2dJZ0JFTVdOaUdtRzAwTDJnSWhZNUF3QWdBU0FBSUJhaFJERmpZaHBodE5DOW9Ea0RDRUVCSVFJTUJRc2dBU0FBUkFBQVFGVDdJZmsvb0NJQVJERmpZaHBodE5BOW9DSVdPUU1BSUFFZ0FDQVdvVVF4WTJJYVliVFFQYUE1QXdoQmZ5RUNEQVFMSUJwQ0FGa0VRQ0FCSUFCRUFBQkFWUHNoQ2NDZ0lnQkVNV05pR21HMDRMMmdJaFk1QXdBZ0FTQUFJQmFoUkRGallocGh0T0M5b0RrRENFRUNJUUlNQkFzZ0FTQUFSQUFBUUZUN0lRbEFvQ0lBUkRGallocGh0T0E5b0NJV09RTUFJQUVnQUNBV29VUXhZMklhWWJUZ1BhQTVBd2hCZmlFQ0RBTUxJQU5CdTR6eGdBUk5CRUFnQTBHOCs5ZUFCRTBFUUNBRFFmeXl5NEFFUmcwQ0lCcENBRmtFUUNBQklBQkVBQUF3ZjN6WkVzQ2dJZ0JFeXBTVHA1RU82YjJnSWhZNUF3QWdBU0FBSUJhaFJNcVVrNmVSRHVtOW9Ea0RDRUVESVFJTUJRc2dBU0FBUkFBQU1IOTgyUkpBb0NJQVJNcVVrNmVSRHVrOW9DSVdPUU1BSUFFZ0FDQVdvVVRLbEpPbmtRN3BQYUE1QXdoQmZTRUNEQVFMSUFOQis4UGtnQVJHRFFFZ0drSUFXUVJBSUFFZ0FFUUFBRUJVK3lFWndLQWlBRVF4WTJJYVliVHd2YUFpRmprREFDQUJJQUFnRnFGRU1XTmlHbUcwOEwyZ09RTUlRUVFoQWd3RUN5QUJJQUJFQUFCQVZQc2hHVUNnSWdCRU1XTmlHbUcwOEQyZ0loWTVBd0FnQVNBQUlCYWhSREZqWWhwaHRQQTlvRGtEQ0VGOElRSU1Bd3NnQTBINncrU0pCRXNOQVFzZ0FDQUFSSVBJeVcwd1grUS9va1FBQUFBQUFBQTRRNkJFQUFBQUFBQUFPTU9nSWhkRUFBQkFWUHNoK2IraW9DSVdJQmRFTVdOaUdtRzAwRDJpSWhpaElobEVHQzFFVlBzaDZiOWpJUVFDZnlBWG1VUUFBQUFBQUFEZ1FXTUVRQ0FYcWd3QkMwR0FnSUNBZUFzaEFnSkFJQVFFUUNBQ1FRRnJJUUlnRjBRQUFBQUFBQUR3djZBaUYwUXhZMklhWWJUUVBhSWhHQ0FBSUJkRUFBQkFWUHNoK2IraW9DRVdEQUVMSUJsRUdDMUVWUHNoNlQ5a1JRMEFJQUpCQVdvaEFpQVhSQUFBQUFBQUFQQS9vQ0lYUkRGallocGh0TkE5b2lFWUlBQWdGMFFBQUVCVSt5SDV2NktnSVJZTElBRWdGaUFZb1NJQU9RTUFBa0FnQTBFVWRpSUVJQUM5UWpTSXAwSC9EM0ZyUVJGSURRQWdBU0FXSUJkRUFBQmdHbUcwMEQyaUlnQ2hJaGtnRjBSemNBTXVpaG1qTzZJZ0ZpQVpvU0FBb2FFaUdLRWlBRGtEQUNBRUlBQzlRalNJcDBIL0QzRnJRVEpJQkVBZ0dTRVdEQUVMSUFFZ0dTQVhSQUFBQUM2S0dhTTdvaUlBb1NJV0lCZEV3VWtnSlpxRGV6bWlJQmtnRnFFZ0FLR2hJaGloSWdBNUF3QUxJQUVnRmlBQW9TQVlvVGtEQ0F3QkN5QURRWUNBd1A4SFR3UkFJQUVnQUNBQW9TSUFPUU1BSUFFZ0FEa0RDRUVBSVFJTUFRc2dHa0wvLy8vLy8vLy9CNE5DZ0lDQWdJQ0FnTERCQUlTL0lRQkJBQ0VDUVFFaEJBTkFJQWxCRUdvZ0FrRURkR29DZnlBQW1VUUFBQUFBQUFEZ1FXTUVRQ0FBcWd3QkMwR0FnSUNBZUF1M0loWTVBd0FnQUNBV29VUUFBQUFBQUFCd1FhSWhBRUVCSVFJZ0JDRUdRUUFoQkNBR0RRQUxJQWtnQURrRElFRUNJUUlEUUNBQ0lncEJBV3NoQWlBSlFSQnFJQXBCQTNScUt3TUFSQUFBQUFBQUFBQUFZUTBBQ3lBSlFSQnFJUTRqQUVHd0JHc2lCU1FBSUFOQkZIWkJsZ2hySWdKQkEydEJHRzBpQmtFQUlBWkJBRW9iSWc5QmFHd2dBbW9oQmtHVXF3UW9BZ0FpQ3lBS1FRRnFJZ3hCQVdzaUNHcEJBRTRFUUNBTElBeHFJUUlnRHlBSWF5RURBMEFnQlVIQUFtb2dCRUVEZEdvZ0EwRUFTQVI4UkFBQUFBQUFBQUFBQlNBRFFRSjBRYUNyQkdvb0FnQzNDemtEQUNBRFFRRnFJUU1nQkVFQmFpSUVJQUpIRFFBTEN5QUdRUmhySVFwQkFDRUNJQXRCQUNBTFFRQktHeUVFSUF4QkFFd2hEUU5BQWtBZ0RRUkFSQUFBQUFBQUFBQUFJUUFNQVFzZ0FpQUlhaUVIUVFBaEEwUUFBQUFBQUFBQUFDRUFBMEFnRGlBRFFRTjBhaXNEQUNBRlFjQUNhaUFISUFOclFRTjBhaXNEQUtJZ0FLQWhBQ0FEUVFGcUlnTWdERWNOQUFzTElBVWdBa0VEZEdvZ0FEa0RBQ0FDSUFSR0lRTWdBa0VCYWlFQ0lBTkZEUUFMUVM4Z0Jtc2hFMEV3SUFacklSQWdCa0VaU0NFUklBWkJHV3NoRkNBTElRSUNRQU5BSUFVZ0FrRURkR29yQXdBaEFFRUFJUU1nQWlFRUlBSkJBRXdpQjBVRVFBTkFJQVZCNEFOcUlBTkJBblJxQW44Q2Z5QUFSQUFBQUFBQUFIQStvaUlXbVVRQUFBQUFBQURnUVdNRVFDQVdxZ3dCQzBHQWdJQ0FlQXUzSWhaRUFBQUFBQUFBY01HaUlBQ2dJZ0NaUkFBQUFBQUFBT0JCWXdSQUlBQ3FEQUVMUVlDQWdJQjRDellDQUNBRklBUkJBV3NpQkVFRGRHb3JBd0FnRnFBaEFDQURRUUZxSWdNZ0FrY05BQXNMQW44Z0FDQUtFTm9CSWdBZ0FFUUFBQUFBQUFEQVA2S2NSQUFBQUFBQUFDREFvcUFpQUpsRUFBQUFBQUFBNEVGakJFQWdBS29NQVF0QmdJQ0FnSGdMSVFnZ0FDQUl0NkVoQUFKQUFrQUNRQUovSUJGRkJFQWdBa0VDZENBRmFpSUVJQVFvQXR3RElnUWdCQ0FRZFNJRUlCQjBheUlETmdMY0F5QUVJQWhxSVFnZ0F5QVRkUXdCQ3lBS0RRRWdBa0VDZENBRmFpZ0MzQU5CRjNVTElnMUJBRXdOQWd3QkMwRUNJUTBnQUVRQUFBQUFBQURnUDJZTkFFRUFJUTBNQVF0QkFDRURRUUFoQkNBSFJRUkFBMEFnQlVIZ0Eyb2dBMEVDZEdvaUZTZ0NBQ0VTUWYvLy93Y2hCd0ovQWtBZ0JBMEFRWUNBZ0FnaEJ5QVNEUUJCQUF3QkN5QVZJQWNnRW1zMkFnQkJBUXNoQkNBRFFRRnFJZ01nQWtjTkFBc0xBa0FnRVEwQVFmLy8vd01oQXdKQUFrQWdGQTRDQVFBQ0MwSC8vLzhCSVFNTElBSkJBblFnQldvaUJ5QUhLQUxjQXlBRGNUWUMzQU1MSUFoQkFXb2hDQ0FOUVFKSERRQkVBQUFBQUFBQThEOGdBS0VoQUVFQ0lRMGdCRVVOQUNBQVJBQUFBQUFBQVBBL0lBb1EyZ0doSVFBTElBQkVBQUFBQUFBQUFBQmhCRUJCQVNFRFFRQWhCeUFDSVFRQ1FDQUNJQXRNRFFBRFFDQUZRZUFEYWlBRVFRRnJJZ1JCQW5ScUtBSUFJQWR5SVFjZ0JDQUxTZzBBQ3lBSFJRMEFJQW9oQmdOQUlBWkJHR3NoQmlBRlFlQURhaUFDUVFGcklnSkJBblJxS0FJQVJRMEFDd3dEQ3dOQUlBTWlCRUVCYWlFRElBVkI0QU5xSUFzZ0JHdEJBblJxS0FJQVJRMEFDeUFDSUFScUlRUURRQ0FGUWNBQ2FpQUNJQXhxSWdoQkEzUnFJQUpCQVdvaUFpQVBha0VDZEVHZ3F3UnFLQUlBdHprREFFRUFJUU5FQUFBQUFBQUFBQUFoQUNBTVFRQktCRUFEUUNBT0lBTkJBM1JxS3dNQUlBVkJ3QUpxSUFnZ0EydEJBM1JxS3dNQW9pQUFvQ0VBSUFOQkFXb2lBeUFNUncwQUN3c2dCU0FDUVFOMGFpQUFPUU1BSUFJZ0JFZ05BQXNnQkNFQ0RBRUxDd0pBSUFCQkdDQUdheERhQVNJQVJBQUFBQUFBQUhCQlpnUkFJQVZCNEFOcUlBSkJBblJxQW44Q2Z5QUFSQUFBQUFBQUFIQStvaUlXbVVRQUFBQUFBQURnUVdNRVFDQVdxZ3dCQzBHQWdJQ0FlQXNpQTdkRUFBQUFBQUFBY01HaUlBQ2dJZ0NaUkFBQUFBQUFBT0JCWXdSQUlBQ3FEQUVMUVlDQWdJQjRDellDQUNBQ1FRRnFJUUlNQVFzQ2Z5QUFtVVFBQUFBQUFBRGdRV01FUUNBQXFnd0JDMEdBZ0lDQWVBc2hBeUFLSVFZTElBVkI0QU5xSUFKQkFuUnFJQU0yQWdBTFJBQUFBQUFBQVBBL0lBWVEyZ0VoQUNBQ1FRQk9CRUFnQWlFRUEwQWdCU0FFSWdaQkEzUnFJQUFnQlVIZ0Eyb2dCRUVDZEdvb0FnQzNvamtEQUNBRVFRRnJJUVFnQUVRQUFBQUFBQUJ3UHFJaEFDQUdEUUFMSUFJaEJBTkFSQUFBQUFBQUFBQUFJUUJCQUNFRElBc2dBaUFFYXlJR0lBWWdDMG9iSWdwQkFFNEVRQU5BSUFOQkEzUkI4TUFFYWlzREFDQUZJQU1nQkdwQkEzUnFLd01Bb2lBQW9DRUFJQU1nQ2tjaERDQURRUUZxSVFNZ0RBMEFDd3NnQlVHZ0FXb2dCa0VEZEdvZ0FEa0RBQ0FFUVFCS0lRWWdCRUVCYXlFRUlBWU5BQXNMUkFBQUFBQUFBQUFBSVFBZ0FrRUFUZ1JBSUFJaEJBTkFJQVFpQmtFQmF5RUVJQUFnQlVHZ0FXb2dCa0VEZEdvckF3Q2dJUUFnQmcwQUN3c2dDU0FBbWlBQUlBMGJPUU1BSUFVckE2QUJJQUNoSVFCQkFTRURJQUpCQUVvRVFBTkFJQUFnQlVHZ0FXb2dBMEVEZEdvckF3Q2dJUUFnQWlBRFJ5RUVJQU5CQVdvaEF5QUVEUUFMQ3lBSklBQ2FJQUFnRFJzNUF3Z2dCVUd3Qkdva0FDQUlRUWR4SVFJZ0NTc0RBQ0VBSUJwQ0FGTUVRQ0FCSUFDYU9RTUFJQUVnQ1NzRENKbzVBd2hCQUNBQ2F5RUNEQUVMSUFFZ0FEa0RBQ0FCSUFrckF3ZzVBd2dMSUFsQk1Hb2tBQ0FDQy80REF3TjhBbjhCZmlBQXZTSUdRaUNJcDBILy8vLy9CM0VpQkVHQWdNQ2dCRThFUUNBQVJCZ3RSRlQ3SWZrL0lBQ21JQUM5UXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHdzhMQWtBQ2Z5QUVRZi8vNy80RFRRUkFRWDhnQkVHQWdJRHlBMDhOQVJvTUFnc2dBSmtoQUNBRVFmLy95LzhEVFFSQUlBUkIvLytYL3dOTkJFQWdBQ0FBb0VRQUFBQUFBQUR3djZBZ0FFUUFBQUFBQUFBQVFLQ2pJUUJCQUF3Q0N5QUFSQUFBQUFBQUFQQy9vQ0FBUkFBQUFBQUFBUEEvb0tNaEFFRUJEQUVMSUFSQi8vK05nQVJOQkVBZ0FFUUFBQUFBQUFENHY2QWdBRVFBQUFBQUFBRDRQNkpFQUFBQUFBQUE4RCtnb3lFQVFRSU1BUXRFQUFBQUFBQUE4TDhnQUtNaEFFRURDeUVGSUFBZ0FLSWlBaUFDb2lJQklBRWdBU0FCSUFGRUwyeHFMRVMwb3IraVJKcjkzbEl0M3EyL29LSkViWnAwci9Ld3M3K2dva1J4RmlQK3huRzh2NkNpUk1Ucm1KbVptY20vb0tJaEF5QUNJQUVnQVNBQklBRWdBVVFSMmlMak9xMlFQNkpFNncxMkpFdDdxVCtnb2tSUlBkQ2daZzJ4UDZDaVJHNGdUTVhOUmJjL29LSkUvNE1Ba2lSSndqK2dva1FOVlZWVlZWWFZQNkNpSVFFZ0JFSC8vKy8rQTAwRVFDQUFJQUFnQXlBQm9LS2hEd3NnQlVFRGRDSUVRWkNxQkdvckF3QWdBQ0FESUFHZ29pQUVRYkNxQkdvckF3Q2hJQUNob1NJQW1pQUFJQVpDQUZNYklRQUxJQUFMaUFFQkJIOENRQUovQWtBZ0EwRUhjU0lJUVFaSEJFQkJJQ0VIQTBBZ0FDQUJJQUlnQjJvaUNTQUZJQVFSQndBaUJrRXNjUTBFSUFaQkVIRkZEUUlnQjBFQmRDRUhJQUFnQWlBSUlBa1E0UU5GRFFBTFFSQU1BZ3NnQUNBQklBSWdCU0FFRVFjQUdndEJBQXNoQmlBQUtBSU1JZ0ZGRFFBZ0FDQUNJQU1nQVNBR0VLb0RJUVlMSUFZTDRnRUJBbjhqQUVFZ2F5SUVKQUFnQUNBQlJ3UkFBa0FDUUFKQUlBRW9BZ3hGQkVBQ1FBSkFJQUVvQWdoQi92Ly8vd2RyRGdJQUF3RUxJQUVvQWdRTkFpQUFRUUFRakFFTUJBc2dBRUVCRUl3QkRBTUxJQUVvQWdSRkRRRUxJQUFRTlF3QkN5QUFLQUlBSVFVZ0JFSUFOd0lZSUFSQ2dJQ0FnSUNBZ0lDQWZ6Y0NFQ0FFSUFVMkFnd2dCRUVNYWlJRlFnRVFNQm9nQVNBRkVJSUNCRUFnQUVFQUVJa0JJQVJCREdvUUd3d0JDeUFFUVF4cUVCc2dBQ0FCSUFJZ0EwSGlBRUVBRUo0RUdnc2dCRUVnYWlRQUR3dEIyUDBBUWRUOEFFRzNJMEdxMmdBUUFBQUw4Z0lCQTM4akFFRkFhaUlHSkFBQ1FDQUVJQU5ySWdoQkFVWUVRQUpBSUFORkJFQWdBVUlERURBYURBRUxJQUVnQTYwUU1Cb2dBVUVCTmdJRUN5QUNJQU5CQVhSQkFYS3RFREFhSUFJZ0FpZ0NDRUVDYWpZQ0NDQUFJQUVRUkJvTUFRc2dBQ2dDQUNFSElBQWdBU0FDSUFNZ0NFRUJkaUFEYWlJRFFRRVFvQVFnQmtJQU53STRJQVpDZ0lDQWdJQ0FnSUNBZnpjQ01DQUdJQWMyQWl3Z0JrSUFOd0lrSUFaQ2dJQ0FnSUNBZ0lDQWZ6Y0NIQ0FHSUFjMkFoZ2dCa0lBTndJUUlBWkNnSUNBZ0lDQWdJQ0FmemNDQ0NBR0lBYzJBZ1FnQmtFc2FpSUhJQVpCR0dvZ0JrRUVhaUlJSUFNZ0JDQUZFS0FFSUFBZ0FDQUlRZi8vLy84RFFRRVFReG9nQnlBSElBRkIvLy8vL3dOQkFSQkRHaUFBSUFBZ0IwSC8vLy8vQTBFQkVNc0JHaUFGQkVBZ0FTQUJJQVpCR0dwQi8vLy8vd05CQVJCREdnc2dBaUFDSUFaQkJHb2lBRUgvLy8vL0EwRUJFRU1hSUFaQkxHb1FHeUFHUVJocUVCc2dBQkFiQ3lBR1FVQnJKQUFMemdVQ0IzOERmaU1BUVRCcklnZ2tBQUovQWtBQ1FBSkFBa0FDUUNBRERnTUFBUUlEQzBIY2pBRkIxUHdBUWJVYVFaYjhBQkFBQUFzZ0FTQUNLQUlRSUFJb0Fnd2lBQ0FBUVFWMElBSW9BZ2hyRUdnMkFnQU1BZ3NnQWlnQ0VDSURJQUlvQWd3aUFDQUFRUVYwSUFJb0FnaHJJZ0pCSUdvUWFLMUNJSVlnQXlBQUlBSVFhSzJFSVE4Z0JrR0FsT3ZjQTBZRVFDQUJJQTlDZ0pUcjNBT0FJaEErQWdRZ0FTQVFRb0RzbEtNTWZpQVBmRDRDQUF3Q0N5QUJJQThnQnEwaUVJQWlFVDRDQkNBQklBOGdFQ0FSZm4wK0FnQU1BUXNnQWlnQ0FDRUtJQWhDQURjQ0tDQUlRb0NBZ0lDQWdJQ0FnSDgzQWlBZ0NDQUtOZ0ljSUFoQ0FEY0NGQ0FJUW9DQWdJQ0FnSUNBZ0g4M0Fnd2dDQ0FLTmdJSUlBTWdCVUVCZENBRVFRRnFJZ3QyUVFGcVFRRjJJZ3BySVF3Z0FDQUVRUUYwUVFGeVFSUnNhaUVOUVFBaEF5QUFJQVJCS0d4cUlnUW9BZ3hGQkVBZ0JDQUdJQXBCLy8vLy93TkJBUkQ4QWlBSVFRaHFJZ2xDQVJBd2NpQU5JQWtnQkNBS1FRRnFJQWRzUVFKcVFRQVFsUUZ5SVFrTEFrQUNRQ0FJUVJ4cUlnNGdBaUFOSUFjZ0RHeEJBQkJESUFseUlBNUJBUkRSQVhJZ0NFRUlhaUlKSUE0Z0JFSC8vLy8vQTBFQkVFTnlJQWtnQWlBSlFmLy8vLzhEUVFFUTVBRnlRU0J4RFFBRFFBSkFJQWdvQWd4RkRRQWdDQ2dDRkVVTkFDQUlRUWhxSWdJZ0FpQUVRZi8vLy84RFFRRVF5d0VOQWlBRFFRRnJJUU1NQVFzTEEwQWdDRUVJYWlBRUVOTUJRUUJPQkVBZ0NFRUlhaUlDSUFJZ0JFSC8vLy8vQTBFQkVPUUJEUUlnQTBFQmFpRUREQUVMQ3lBREJFQWdDRUVjYWlJQ0lBSWdBNnhCLy8vLy93TkJBUkIxRFFFTElBQWdBU0FLUVFKMGFpQUlRUnhxSUF3Z0N5QUZJQVlnQnhDaEJBMEFJQUFnQVNBSVFRaHFJQW9nQ3lBRklBWWdCeENoQkVVTkFRc2dDRUVjYWhBYklBaEJDR29RRzBGL0RBSUxJQWhCSEdvUUd5QUlRUWhxRUJzTFFRQUxJUU1nQ0VFd2FpUUFJQU1MaEFFQkFuOENRQ0FBSUFGSEJFQWdBa1VFUUNBQVFnRVFNQ0VGREFJTFFSNGdBbWRySVFZZ0FDQUJFRVFoQlFOQUlBWkJBRWdOQWlBQUlBQWdBQ0FESUFRUVF5QUZjaUVGSUFJZ0JuWkJBWEVFUUNBQUlBQWdBU0FESUFRUVF5QUZjaUVGQ3lBR1FRRnJJUVlNQUFzQUMwSFkvUUJCMVB3QVFkb1JRZXpYQUJBQUFBc2dCUXQxQWdKOEFYNGdBQUorRUF3aUFVUUFBQUFBQUVDUFFLTWlBcGxFQUFBQUFBQUE0RU5qQkVBZ0FyQU1BUXRDZ0lDQWdJQ0FnSUNBZndzaUF6Y0RBQ0FBQW44Z0FTQURRdWdIZnJtaFJBQUFBQUFBUUk5QW9pSUJtVVFBQUFBQUFBRGdRV01FUUNBQnFnd0JDMEdBZ0lDQWVBczJBZ2dMZlFFQ2Z5TUFRU0JySWdZa0FBSkFJQUFnQVVjZ0FDQUNSM0ZGQkVBZ0FDZ0NBQ0VISUFaQ0FEY0NHQ0FHUW9DQWdJQ0FnSUNBZ0g4M0FoQWdCaUFITmdJTUlBWkJER29pQnlBQklBSWdBeUFFSUFVUkNnQWhBU0FBSUFjUW9BWU1BUXNnQUNBQklBSWdBeUFFSUFVUkNnQWhBUXNnQmtFZ2FpUUFJQUVMNWdvQ0MzOERmaU1BUVJCcklnMGtBQ0FFSUFWQkFXc2lCa0VDZEdvb0FnQWhCd0pBQWtBQ1FDQUZRUUZHQkVCQkFDRUdJQTFCQURZQ0RBSkFJQU5CQWswRVFDQUhyU0VSQTBBZ0EwRUFUQTBDSUFFZ0EwRUJheUlEUVFKMElnQnFJQUFnQW1vMUFnQWdCcTFDSUlhRUloSWdFWUFpRXo0Q0FDQVNJQkVnRTM1OXB5RUdEQUFMQUFzZ0IwRi9jNjFDSUlaQy8vLy8vdytFSUFldGdLY2hBQU5BSUFOQkFXc2lBMEVBU0EwQklBRWdBMEVDZENJRWFpQU5RUXhxSUFZZ0FpQUVhaWdDQUNBSElBQVFtQVkyQWdBZ0RTZ0NEQ0VHREFBTEFBc2dBaUFHTmdJQURBRUxBa0FDUUFKQUFrQUNRQ0FESUFWcklnZ2dCU0FGSUFoS0cwRXlUZ1JBSUFnRVFDQUFLQUlBUVFBZ0NFRUJhaUlPSUFnZ0JTQUlTeHNpQ1VFQmFpSU1RUUowSUFBb0FnUVJBUUFpQzBVZ0FDZ0NBRUVBSUF4QkEzUWdBQ2dDQkJFQkFDSUhSWElOQlNBRklBbExEUUlnQ1NBRmF5RVBRUUFoQmdOQUlBb2dEMFlFUUFOQUlBVWdCa1lOQmlBSElBWWdEMnBCQW5ScUlBUWdCa0VDZEdvb0FnQTJBZ0FnQmtFQmFpRUdEQUFMQUFVZ0J5QUtRUUowYWtFQU5nSUFJQXBCQVdvaENnd0JDd0FMQUF0QnpJd0JRZFQ4QUVHa0MwR1Y2d0FRQUFBTElBaEJBMDhFUUNBSFFYOXpyVUlnaGtMLy8vLy9ENFFnQjYyQXB5RUpDd0pBQWtBQ1FBTkFJQVpCQUVnTkFTQUdRUUowSVFBZ0JpQUlhaUVESUFaQkFXc2hCaUFDSUFOQkFuUnFLQUlBSWdNZ0FDQUVhaWdDQUNJQVJnMEFDeUFCSUFoQkFuUnFJQUFnQTAwaUFEWUNBQ0FBRFFFTUFnc2dBU0FJUVFKMGFrRUJOZ0lBQ3lBQ0lBaEJBblJxSWdBZ0FDQUVJQVVRbUFJYUN5QUhyU0VSQTBBZ0NFRUJheUlJUVFCSURRZ2dBaUFJUVFKMElnNXFJUXdDZjBGL0lBY2dBaUFGSUFocVFRSjBhaUlHS0FJQUlnQk5EUUFhSUFrRVFDQU5RUWhxSUFBZ0JrRUVheWdDQUNBSElBa1FtQVlNQVFzZ0JrRUVhelVDQUNBQXJVSWdob1FnRVlDbkN5SUFyU0VTUVFBaENrRUFJUU1EUUNBRElBVkdSUVJBSUF3Z0EwRUNkQ0lQYWlJUUlCQTFBZ0FnQ3EwZ0JDQVBhalVDQUNBU2ZueDlJaE0rQWdCQkFDQVRRaUNJcDJzaENpQURRUUZxSVFNTUFRc0xJQVlnQmlnQ0FDSURJQXByTmdJQUlBTWdDa2tFUUFOQUlBQkJBV3NoQUNBTUlBd2dCQ0FGRUtvRVJRMEFJQVlnQmlnQ0FFRUJhaUlETmdJQUlBTU5BQXNMSUFFZ0Rtb2dBRFlDQUF3QUN3QUxJQVVnQ1dzaENrRUFJUVlEUUNBR0lBbEdSUVJBSUFjZ0JrRUNkR29nQkNBR0lBcHFRUUowYWlnQ0FEWUNBQ0FHUVFGcUlRWU1BUXNMSUFkQkFTQUpFS2tEUlEwQUlBdEJBQ0FKUVFKMElnWVFLeUFHYWtFQk5nSUFEQUVMSUFBZ0N5QUhJQWtRbVFZTkFRc2dBQ0FISUFzZ0RDQUNJQU5CQW5ScUlBbEJmM05CQW5ScUlBd1Exd0lOQUNBSVFYOXpJQXhCQVhScUlRaEJBQ0VHQTBBZ0JpQU9Sa1VFUUNBQklBWkJBblJxSUFjZ0JpQUlha0VDZEdvb0FnQTJBZ0FnQmtFQmFpRUdEQUVMQ3lBQUtBSUFJQWRCQUNBQUtBSUVFUUVBR2lBQUtBSUFJQXRCQUNBQUtBSUVFUUVBR2lBQUtBSUFRUUFnQTBFQ2RFRUVhaUFBS0FJRUVRRUFJZ2RGRFFNZ0FDQUhJQUVnRGlBRUlBVVExd0lOQVNBQ0lBSWdCeUFGUVFGcUVKZ0NHaUFBS0FJQUlBZEJBQ0FBS0FJRUVRRUFHaUFDSUFWQkFuUnFJUUFEUUNBRklRTUNRQ0FBS0FJQURRQURRQ0FEUVFCTURRRWdBaUFEUVFGcklnTkJBblFpQm1vb0FnQWlDQ0FFSUFacUtBSUFJZ1pHRFFBTElBWWdDRXNOQkFzZ0FpQUNJQVFnQlJDWUFpRURJQUFnQUNnQ0FDQURhellDQUNBQlFRRWdEaENwQXhvTUFBc0FDeUFMQkVBZ0FDZ0NBQ0FMUVFBZ0FDZ0NCQkVCQUJvTElBZEZEUUlMSUFBb0FnQWdCMEVBSUFBb0FnUVJBUUFhREFFTFFRQWhDd3dCQzBGL0lRc0xJQTFCRUdva0FDQUxDNVlGQWhGL0EzNUJBU0FFZENJUVFRRjJJUklnQmtFQ2RFR1FxUVJxS0FJQUloVkJBWFFoQ2tFQklRc0RRQ0FDSVF3Q1FBSkFJQkJCQWtZRVFFRUFJUUFEUUNBUklCSkdEUUlnQVNBUlFRSjBJZ05xSUF3Z0VTQVNha0VDZENJRWFpZ0NBQ0lDSUFNZ0RHb29BZ0FpQTJvaUJTQUtRUUFnQlNBS1R4dHJOZ0lBSUFFZ0JHb2dBeUFDYXlBS1FRQWdBaUFEU3h0cU5nSUFJQkZCQVdvaEVRd0FDd0FMUVFBaEFnSkFJQVJCRTBvTkFDQUFJQVpCb0FGc2FpQUZRZEFBYkdvZ0JFRUNkR3BCcUExcUlnMG9BZ0FpQWcwQUlBWkJBblJCa0trRWFpZ0NBQ0VIUVFBaEFpQUFLQUlBSWdnb0FnQkJBRUVFSUFSMElBZ29BZ1FSQVFBaUNFVU5BQ0FFUVFGcklRNGdBQ0FHUWFnQmJHb2dCVUhVQUd4cUlBUkJBblJxSWdJMUF1QUdJUmdnQWlnQ0dDRVRJQWV0SVJsQkFTRUNRUUFoQ1FOQUlBa2dEblpGQkVBZ0NDQUpRUU4wYWlJUElBSTJBZ0FnRHlBQ3JTSWFRaUNHSUJtQVBnSUVJQUlnRTJ3Z0J5QVlJQnArUWlDSXAyeHJJZ0lnQjBFQUlBSWdCMDhiYXlFQ0lBbEJBV29oQ1F3QkN3c2dEU0FJTmdJQUlBZ2hBZ3NnQWlJSERRRkJmeUVBQ3lBQUR3c2dFRUVCZGlFUUlBdEJBWFFoQ0VFQUlRbEJBQ0VOUVFBaERnTkFJQWtnRUVjRVFDQUhOUUlFSVJnZ0J5Z0NBQ0VUUVFBaEFnTkFJQUlnQzBjRVFDQURJQUlnRG1vaUQwRUNkR29nRENBQ0lBMXFJaFFnRW1wQkFuUnFLQUlBSWhZZ0RDQVVRUUowYWlnQ0FDSVVhaUlYSUFwQkFDQUtJQmRORzJzMkFnQWdBeUFMSUE5cVFRSjBhaUFVSUJacklBcHFJZzhnRTJ3Z0ZTQVByU0FZZmtJZ2lLZHNhellDQUNBQ1FRRnFJUUlNQVFzTElBbEJBV29oQ1NBSUlBNXFJUTRnQ3lBTmFpRU5JQWRCQ0dvaEJ3d0JDd3NnQkVFQmF5RUVJQU1oQWlBTUlRTWdDQ0VMREFBTEFBdlVCQUVKZndKQUlBQW9BZ0FpQ1NnQ0FFRUFJQVJCQW5RZ0NTZ0NCQkVCQUNJTFJRMEFBa0FnQTBVRVFDQUFJQUVnQVNBTElBSWdCaUFIRUtZRVJRMEJEQUlMSUFBb0FnQWlDU2dDQUVFQUlBUkJCblFnQ1NnQ0JCRUJBQ0lKUlEwQkFrQWdCVUVQY1VVRVFDQUFJQWRCcUFGc2FpQUdRZFFBYkdvZ0FpQURha0VDZEdvb0FoZ2hFQ0FIUVFKMElnTkJrS2tFYWlnQ0FDRU9JQUFnQTJvb0FnUWhEMEVCSVEwRFFFRUFJUU1nQlNBTVRRMENBMEJCQUNFS0lBTWdCRVlFUUVFQUlRZ0RRQUpBSUFoQkVFY0VRQ0FKSUFRZ0NHeEJBblJxSVFNQ1FDQUdSUVJBSUFBZ0F5QURJQXNnQWtFQUlBY1FwZ1FOQVNBRElBUWdEU0FPSUE4UW1nWU1Bd3NnQXlBRUlBMGdEaUFQRUpvR0lBQWdBeUFESUFzZ0FrRUJJQWNRcGdSRkRRSUxJQWtoQ0F3SkN3TkFBa0FnQkNBS1J3UkFJQVVnQ213Z0RHb2hBMEVBSVFnRFFDQUlRUkJHRFFJZ0FTQURJQWhxUVFKMGFpQUpJQVFnQ0d3Z0NtcEJBblJxS0FJQU5nSUFJQWhCQVdvaENBd0FDd0FMSUF4QkVHb2hEQXdHQ3lBS1FRRnFJUW9NQUFzQUN5QUlRUUZxSVFnZ0RTQVFJQTRnRHhEV0FpRU5EQUFMQUFVZ0F5QUZiQ0FNYWlFS1FRQWhDQU5BSUFoQkVFWkZCRUFnQ1NBRUlBaHNJQU5xUVFKMGFpQUJJQWdnQ21wQkFuUnFLQUlBTmdJQUlBaEJBV29oQ0F3QkN3c2dBMEVCYWlFRERBRUxBQXNBQ3dBTFFiV1BBVUhVL0FCQjRUMUJpOWNBRUFBQUN5QUFLQUlBSWdFb0FnQWdDVUVBSUFFb0FnUVJBUUFhQ3lBQUtBSUFJZ0FvQWdBZ0MwRUFJQUFvQWdRUkFRQWFRUUFQQ3lBQUlBZ1ExUUlnQUNBTEVOVUNRWDhMUUFBZ0FDQUJRUUYwclNBQnJTQUNyU0FBUWgySVF2Ly8vLzhQZzM1Q0lJaCtmSDBpQUNBQVFpQ0lwMEVCZFNBQmNhMThJZ0JDSUlpbklBRnhJQUNuYWd2OUFnSUxmd0orSUFGQkFDQUNJQWRzUVFKMEVDc2hDeUFDSUFVZ0JFRUZkR3BCQVdzZ0JXNGlBU0FCSUFKS0d5SUJRUUFnQVVFQVNoc2hERUYvSUFWMFFYOXpRWDhnQlVFZmNSc2hDaUFIUVFBZ0IwRUFTaHNoRFNBRlFTQktJUTRnQlVFK1NDRVBJQVZCUFVzaEVDQUZRY0VBU1NFUkEwQWdDU0FNUmtVRVFDQURJQVFnQlNBSmJDSUJFR2doQndKK0lBNUZCRUFnQnlBS2NhMGlFd3dCQ3lBRElBUWdBVUVnYWhCb0lRZ2dFRVVFUUNBSHJTSVRJQWdnQ25HdFFpQ0doQXdCQ3dKL0lCRkZCRUFnQXlBRUlBRkJRR3NRYUNBS2NRd0JDeUFJSUFweElRaEJBQXNoQVNBSFFmLy8vLzhIY2EwaEV5QUhRUjkyclNBSXJVSUJob1FnQWExQ0lZYUVDeUVVUVFBaEJ3TkFJQWNnRFVaRkJFQWdGQ0FHSUFkcVFRSjBJZ0ZCa0trRWFpZ0NBQ0lJSUFBZ0FXb29BZ1FpRWhDb0JDRUJJQXNnQWlBSGJDQUpha0VDZEdvZ0R3Ui9JQUVGSUFHdFFoK0dJQk9FSUFnZ0VoQ29CQXMyQWdBZ0IwRUJhaUVIREFFTEN5QUpRUUZxSVFrTUFRc0xDMDhCQkg4RFFDQURJQVZHUlFSQUlBQWdCVUVDZENJR2FpQUVJQUlnQm1vb0FnQWlCeUFCSUFacUtBSUFhaUlFYWlJR05nSUFJQVFnQjBrZ0JDQUdTM0loQkNBRlFRRnFJUVVNQVFzTElBUUw0d0VCQTM4Q1FBSkFJQU5CQTNGRklBTkJCM0VpQkVFRlJpQUNRZi8vLy84RFJuSnlJQUZCQVVZZ0JFRUNSbkZ5UlFSQUlBRWdCRUVEUjNJTkFRc2dBQ0FCRUl3QkRBRUxJQUFnQWtFZmFrRUZkaUlFRUVFRVFDQUFFRFZCSUE4TElBQW9BaEFpQlVGL1FTQkJBQ0FDYXlJQ1FSOXhJZ1pyZEVGL2N5QUNkRUYvSUFZYk5nSUFRUUVnQkNBRVFRRk5HeUVFUVFFaEFnTkFJQUlnQkVaRkJFQWdCU0FDUVFKMGFrRi9OZ0lBSUFKQkFXb2hBZ3dCQ3dzZ0FDQUJOZ0lFSUFCQmdJQ0FnQUpCQVVFY0lBTkJCWFpCUDNFaUFHdDBJQUJCUDBZYk5nSUlDMEVVQzJzQUFrQUNRQUpBQWtBQ1FDQUFJQUZ5UVE5eERnOEFCQU1FQWdRREJBRUVBd1FDQkFNRUMwSFlBRUhaQUNBQlFSQkdHdzhMUWRvQVFkc0FJQUZCQ0VZYkR3dEIzQUJCM1FBZ0FVRUVSaHNQQzBIZUFFSGZBQ0FCUVFKR0d3OExRZUFBUWVFQUlBRkJBVVliQ3pFQkFYOUJBU0VCQWtBQ1FBSkFJQUJCQ21zT0JBSUJBUUlBQ3lBQVFhakFBRVlOQVFzZ0FFR3B3QUJHSVFFTElBRUx0UUlCQTM4Q1FBSkFJQUFvQWpBaUNVRUJhaUlLSUFBb0Fpd2lDRTBFUUNBQUtBSW9JUWdNQVFzZ0FDZ0NJQ2dDRUNJSlFSQnFJQUFvQWloQkNDQUlRUU5zUVFGMklnZ2dDRUVJVFJzaUNpQUFLQUlrYkNBSktBSUlFUUVBSWdoRkJFQkJmeUVJREFJTElBQWdDRFlDS0NBQUlBbzJBaXdnQUNnQ01DSUpRUUZxSVFvTElBQWdDallDTUNBSUlBQW9BaVFnQ1d4cUlnZ2dCellDQkNBSUlBWTZBQUFnQ0NBRU5nSU1JQWdnQlRZQ0NDQUlJQU02QUFFZ0NFRVFhaUVFSUFBb0FneEJBWFFoQlVFQUlRQURRQ0FBSUFWR1JRUkFJQVFnQUVFQ2RDSUdhaUFCSUFacUtBSUFOZ0lBSUFCQkFXb2hBQXdCQ3dzZ0JDQUZRUUowYWlFQlFRQWhDRUVBSVFBRFFDQUFJQU5HRFFFZ0FTQUFRUUowSWdScUlBSWdCR29vQWdBMkFnQWdBRUVCYWlFQURBQUxBQXNnQ0F0cEFRUi9JQUVRUHlFREEwQUNRQ0FBTFFBQVJRUkFRWDhoQWd3QkN3TkFBbjhnQUVFc0VLWURJZ1JGQkVBZ0FCQS9EQUVMSUFRZ0FHc0xJZ1VnQTBZRVFDQUFJQUVnQXhCaFJRMENDeUFBSUFWcVFRRnFJUUFnQkEwQUN5QUNRUUZxSVFJTUFRc0xJQUlMVEFFQ2Z3SkFJQUFvQWdRaUF5QUNhaUlFSUFBb0FnaExCSDhnQUNBRUVNWUJEUUVnQUNnQ0JBVWdBd3NnQUNnQ0FDSURhaUFCSUFOcUlBSVFIeG9nQUNBQUtBSUVJQUpxTmdJRUN3dE5BUVIvSUFBb0FnZ2hBeUFBUVFBMkFnZ2dBQ2dDQUNFRUlBQkNBRGNDQUNBQUtBSVFJUVVnQUNnQ0RDRUdJQUFnQXlBRUlBRWdBa0VBRU5zQ0lRQWdCaUFEUVFBZ0JSRUJBQm9nQUFzWEFDQUFJQUZCL3dGeEVCRWdBQ0FDUWYvL0EzRVFLZ3VqR2dFTmZ5TUFRZEFGYXlJRUpBQWdCQ0FDS0FJQUlnVTJBcHdFQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUZMUUFBSWdnRVFDQUlRZHdBUncwR0lBVkJBV29pQnlBQUtBSWNUdzBCSUFRZ0JVRUNhaUlHTmdLY0JBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQVV0QUFFaUNFSFRBR3NPQlFRQkFRRUdBQXNDUUNBSVFlTUFhdzRDQ0FjQUN3SkFJQWhCOHdCckRnVURBUUVCQlFBTElBaEJ4QUJHRFFFZ0NFSFFBRVlnQ0VId0FFWnlEUWdMSUFBb0FpZ2hBUXdOQzBFQklRa01CQXRCQWlFSkRBTUxRUU1oQ1F3Q0MwRUVJUWtNQVF0QkJTRUpDeUFKUVFGMFFReHhRYkNCQW1vb0FnQWlCaThCQUNFRklBQW9Ba0FoQUNBQlFUUTJBaEFnQVNBQU5nSU1RUUFoQXlBQlFRQTJBZ2dnQVVJQU53SUFJQWxCQVhFaEFDQUdRUUpxSVFZZ0JVRUJkQ0VKUVFBaENBSkFBMEFnQ0NBSlJ3UkFJQVlnQ0VFQmRHb3ZBUUFoQnlBQktBSUFJZ1VnQVNnQ0JFNEVRQ0FCSUFWQkFXb1EyUUlOQXlBQktBSUFJUVVnQVNnQ0NDRURDeUFCSUFWQkFXbzJBZ0FnQXlBRlFRSjBhaUFITmdJQUlBaEJBV29oQ0F3QkN3dEJnSUNBZ0FRaENDQUFSUTBMSUFFUTJnSkZEUXNMSUFFb0Fnd2dBU2dDQ0VFQUlBRW9BaEFSQVFBYURBd0xBa0FnQmkwQUFDSUJRZDhCY1VIQkFHdEIvd0Z4UVJwUEJFQWdBQ2dDS0NFR0lBTkZJQUZCM3dCR0lBRkJNR3RCL3dGeFFRcEpja1Z5RFFFZ0JnME1DeUFFSUFWQkEybzJBcHdFSUFGQkgzRWhDQXdLQ3lBR0RRb2dCQ0FITmdLY0JFSGNBQ0VJREFrTElBQW9BaWhGQkVCQkFDRUJEQVlMSUFZdEFBQkIrd0JIRFFJZ0JFSGdCR29oQlFKQUFrQUNRQUpBQWtBRFFBSkFJQVpCQVdvaENTQUdMUUFCSWdNUXJ3TkZEUUFnQlNBRVFlQUVhbXRCUGtzTkFpQUZJQU02QUFBZ0JVRUJhaUVGSUFraEJnd0JDd3NnQlVFQU9nQUFJQVJCb0FScUlRVUNRQ0FKTFFBQUlnTkJQVWNOQUNBR1FRSnFJUWtnQkVHZ0JHb2hCUU5BSUFrdEFBQWlBeEN2QTBVTkFTQUZJQVJCb0FScWEwRS9Ud1JBSUFCQnJlRUFRUUFRT2d3U0JTQUZJQU02QUFBZ0JVRUJhaUVGSUFsQkFXb2hDUXdCQ3dBTEFBc2dCVUVBT2dBQUlBTkIvUUJIQkVBZ0FFSERsQUZCQUJBNkRCQUxRUUVoQXdKQUFrQWdCRUhnQkdwQnlpZEJCeEJoUlEwQUlBUkI0QVJxUWZmN0FFRURFR0ZGRFFCQkFDRURJQVJCNEFScVFiazNRUklRWVVVTkFDQUVLQUxnQkVIenh1RURSdzBCQ3lBQUtBSkFJUVlnQVVFME5nSVFJQUVnQmpZQ0RDQUJRUUEyQWdnZ0FVSUFOd0lBUWVDbkFpQUVRYUFFYWhDdkJDSU1RUUJJQkVBZ0JrRUFRUUFROHdRYUlBQkJzeWRCQUJBNkRCRUxJQUVoQlNBRFJRUkFJQVJCTkRZQ3pBVWdCQ0FHTmdMSUJTQUVRUUEyQXNRRklBUkNBRGNDdkFVZ0JFRTBOZ0s0QlNBRUlBWTJBclFGSUFSQkFEWUNzQVVnQkVJQU53S29CU0FFUWJ3RmFpRUZDeUFNUVFGcUlRNUIwTGtDSVFCQkFDRUhBa0FEUUNBQVFZSE9Ba2tFUUNBSElRc2dBQzBBQUNJR3dDRU5BbjhnQUVFQmFpQUdRZjhBY1NJSFFlQUFTUTBBR2lBQUxRQUJJUW9nQjBIdkFFMEVRQ0FIUVFoMElBcHlRYUMvQVdzaEJ5QUFRUUpxREFFTElBQXRBQUlnQjBFUWRISWdDa0VJZEhKQm9OKy9BMnNoQnlBQVFRTnFDeUVHSUExQkFFNEVRQ0FISUF0cVFRRnFJUWNnQmlFQURBSUxJQVpCQVdvaEFDQUhJQXRxUVFGcUlRY2dEaUFHTFFBQVJ3MEJJQVVnQ3lBSEVINUZEUUVNQWdzTElBTU5DMEdRemdJaEFFRUFJUVlnREVFMlJpRU5JQXhCR0VjaER3TkFJQUJCcjlRQ1NRUkFJQVloQ3lBQUxBQUFJZ1pCL3dGeElRY0NmeUFBUVFGcUlBWkJBRTROQUJvZ0FDMEFBU0VLSUFaQnYzOU5CRUFnQjBFSWRDQUtja0dBL3dGcklRY2dBRUVDYWd3QkN5QUFMUUFDSUFkQkVIUnlJQXBCQ0hSeVFZRC8vZ1ZySVFjZ0FFRURhZ3NpQUVFQmFpRUtJQWNnQzJwQkFXb2hCaUFBTFFBQUlRY0NRQUpBSUExRkJFQkJBQ0VBSUE4TkFRc2dCMFVOQVNBRVFhZ0ZhaUFMSUFZUWZrVU5BUXdFQ3dOQUlBQWdCMFlOQVNBQUlBcHFJUkFnQUVFQmFpRUFJQTRnRUMwQUFFY05BQXNnQkVHb0JXb2dDeUFHRUg0TkF3c2dCeUFLYWlFQURBRUxDeUFNUVRaSElBeEJHRWR4UlFSQUlBUkJxQVZxRU5vQ0RRRWdBU0FGS0FJSUlBVW9BZ0FnQkNnQ3NBVWlBQ0FFS0FLb0JVRUJFTnNDRFFFTUN3c2dBU0FGS0FJSUlBVW9BZ0FnQkNnQ3NBVWlBQ0FFS0FLb0JVRUFFTnNDUlEwS0N5QUVLQUt3QlNFQUlBUW9BclFGSVFFZ0JDZ0N1QVVoQWdOQUlBTU5BQ0FGS0FJTUlBVW9BZ2hCQUNBRktBSVFFUUVBR2lBQklBQkJBQ0FDRVFFQUdnd0FDd0FMQWtBZ0JFSGdCR3BCclIxQkVSQmhCRUFnQkVIZ0JHcEJqdndBUVFNUVlRMEJDeUFBS0FKQUlRTWdBVUUwTmdJUUlBRWdBellDRENBQlFRQTJBZ2dnQVVJQU53SUFJQUVnQkVHZ0JHb1Fwd1lpQTBVTkNpQUJLQUlNSUFFb0FnaEJBQ0FCS0FJUUVRRUFHaUFEUVg1SERRVWdBRUdNSFVFQUVEb01FQXNnQkMwQW9BUU5BQ0FBS0FKQUlRTWdBVUUwTmdJUUlBRWdBellDRENBQlFRQTJBZ2dnQVVJQU53SUFJQUVnQkVIZ0JHb1Fwd1lpQTBGL1JnMERJQU5CQUU0TkNRSkFRZkRaQWlBRVFlQUVhaEN2QkNJRFFRQklEUUFDZndKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRFFTSnJEaE1XQlJVQUJBNE1DdzhOQ2dZSEVBSUJBd2tJRVFzZ0JFS0dnSUNBOEFBM0F3Z2dCRUtBZ0lDQUVEY0RBQ0FCSUFRUWZRd1JDeUFFUW9PQWdJRHdBRGNESUNBRVFvR0FnSUFRTndNWUlBUkNnSUNBZ0lDQUJEY0RFQ0FCSUFSQkVHb1FmUXdRQ3lBRVFVQnJRb09BZ0lEd0FEY0RBQ0FFUW9HQWdJQXdOd000SUFSQ2dJQ0FnTUFBTndNd0lBRWdCRUV3YWhCOURBOExJQVJDZzRDQWdQQUFOd05nSUFSQ2dZQ0FnTUFBTndOWUlBUkNnSUNBZ0NBM0ExQWdBU0FFUWRBQWFoQjlEQTRMSUFSQkJ6WUNrQUVnQkVLRGdJQ0FNRGNEaUFFZ0JFS0RnSUNBRURjRGdBRWdCRUtCZ0lDQXdBQTNBM2dnQkVLQWdJQ0E0QUUzQTNBZ0FTQUVRZkFBYWhCOURBMExJQVJDZzRDQWdQQUFOd1BJQVNBRVFvR0FnSUFnTndQQUFTQUVRb09BZ0lBd053TzRBU0FFUW9PQWdJQVFOd093QVNBRVFvR0FnSURBQURjRHFBRWdCRUtBZ0lDQTRJY0JOd09nQVNBQklBUkJvQUZxRUgwTURBc2dCRUVITmdMb0FTQUVRb09BZ0lEZ0FEY0Q0QUVnQkVLQmdJQ0EwQUEzQTlnQklBUkNnSUNBZ0pDb2dJQS9Od1BRQVNBQklBUkIwQUZxRUgwTUN3c2dCRUtEZ0lDQThBQTNBNEFDSUFSQ2dZQ0FnTkFBTndQNEFTQUVRb0NBZ0lDQUtEY0Q4QUVnQVNBRVFmQUJhaEI5REFvTElBUkNoSUNBZ1BBQU53UElBaUFFUW9PQWdJRGdBRGNEd0FJZ0JFS0JnSUNBc0FFM0E3Z0NJQVJDbm9DQWdEQTNBN0FDSUFSQ25ZQ0FnQkEzQTZnQ0lBUkNnNENBZ0JBM0E2QUNJQVJDZ1lDQWdQQUFOd09ZQWlBRVFvQ0FnSURnaHdFM0E1QUNJQUVnQkVHUUFtb1FmUXdKQ3lBRVFRYzJBcGdESUFSQ2hvQ0FnTUFBTndPUUF5QUVRb3lBZ0lBd053T0lBeUFFUW9PQWdJQVFOd09BQXlBRVFvR0FnSURnQXpjRCtBSWdCRUtCZ0lDQTBBTTNBL0FDSUFSQ2lJQ0FnREEzQStnQ0lBUkNnNENBZ0JBM0ErQUNJQVJDZ1lDQWdQQUFOd1BZQWlBRVFvQ0FnSURnMzhFQU53UFFBaUFCSUFSQjBBSnFFSDBNQ0FzZ0FVRUJFSzBEREFjTElBRkJBaEN0QXd3R0N5QUJRUWNRclFNTUJRc2dCRUtGZ0lDQThBQTNBN0FESUFSQ2dZQ0FnTkFCTndPb0F5QUVRb0tBZ0lBUU53T2dBeUFCSUFSQm9BTnFFSDBNQkFzZ0JFS0ZnSUNBOEFBM0E5QURJQVJDZ1lDQWdPQUJOd1BJQXlBRVFvS0FnSURBQURjRHdBTWdBU0FFUWNBRGFoQjlEQU1MSUFSQ2hZQ0FnUEFBTndQd0F5QUVRb0dBZ0lEd0FUY0Q2QU1nQkVLQ2dJQ0F3QUEzQStBRElBRWdCRUhnQTJvUWZRd0NDeUFFUW9XQWdJRHdBRGNEa0FRZ0JFS0JnSUNBb0FFM0E0Z0VJQVJDZ1lDQWdJQUdOd09BQkNBQklBUkJnQVJxRUgwTUFRc2dBMEVoU3cwQklBRWdBMEVRYWhDbUJndEZEUW9NQkFzZ0FTZ0NEQ0FCS0FJSVFRQWdBU2dDRUJFQkFCb0xJQUJCOWVVQVFRQVFPZ3dPQ3lBQlFRQkJnSURFQUJCK0RRRU1Cd3NnQVVFQVFZQUJFSDVGRFFZTElBRW9BZ3dnQVNnQ0NFRUFJQUVvQWhBUkFRQWFDeUFBRUtnQ0RBb0xRUUFoQ0NBRklBQW9BaHhKRFFZTElBQkJ5L01BUVFBUU9nd0lDeUFBUWFmS0FFRUFFRG9NQndzZ0JTZ0NEQ0FGS0FJSVFRQWdCU2dDRUJFQkFCb2dCQ2dDdEFVZ0FFRUFJQVFvQXJnRkVRRUFHZ3NDUUNBSVFkQUFSdzBBSUFFUTJnSkZEUUFnQVNnQ0RDQUJLQUlJUVFBZ0FTZ0NFQkVCQUJvTUJnc2dCQ0FKUVFGcU5nS2NCRUdBZ0lDQUJDRUlEQU1MSUFRZ0J6WUNuQVFnQkVHY0JHb2dBVUVCZEJENUFTSURRUUJPQkVBZ0F5RUlEQU1MQWtBZ0EwRitSdzBBSUFRb0Fwd0VJZ1V0QUFBaUEwVU5BRUdxa0FFZ0EwRVFFUHNCSUFGRmNnMEJEQVFMSUFFTkF5QUVLQUtjQkNFRkN5QUl3RUVBVGcwQUlBVkJCaUFFUVp3RWFoQllJZ2hCZ0lBRVNRMEJJQUFvQWlnTkFTQUFRWTdJQUVFQUVEb01Bd3NnQkNBRlFRRnFOZ0tjQkFzZ0FpQUVLQUtjQkRZQ0FBd0NDeUFBUWFmT0FFRUFFRG9MUVg4aENBc2dCRUhRQldva0FDQUlDeDhCQVg4Z0FDZ0NQQ0lCUVFCSUJIOGdBQkNxQmhvZ0FDZ0NQQVVnQVFzTGdRTUJCSDhqQUVFUWF5SUVKQUFnQkNBQktBSUFJZ1UyQWd3Z0FrRUJkQ0VHSUFBaEF3Si9BMEFDUUFKQUFrQUNmd0pBQWtBZ0JTMEFBQ0lDUWR3QVJ3UkFJQUpCUGtjTkFTQUFJQU5HRFFZZ0EwRUFPZ0FBSUFFZ0JDZ0NERUVCYWpZQ0FFRUFEQWdMSUFRZ0JVRUJhallDRENBRkxRQUJRZlVBUmcwQkRBVUxJQUxBUVFCT0RRSWdCVUVHSUFSQkRHb1FXQXdCQ3lBRVFReHFJQVlRK1FFTElnSkIvLy9EQUVzTkFnd0JDeUFFSUFWQkFXbzJBZ3dMQWtBZ0FDQURSZ1JBQW44Z0FrSC9BRTBFUUNBQ1FRTjJRZnovLy84QmNVR1FnUUpxS0FJQUlBSjJRUUZ4REFFTElBSVF1UU1MUlEwQ0RBRUxBbjhnQWtIL0FFMEVRQ0FDUVFOMlFmei8vLzhCY1VHZ2dRSnFLQUlBSUFKMlFRRnhEQUVMSUFKQi92Ly9BSEZCak1BQVJpQUNFTklFUVFCSGNndEZEUUVMSUFNZ0FHdEIrUUJLRFFBQ2Z5QUNRZjhBVFFSQUlBTWdBam9BQUNBRFFRRnFEQUVMSUFNZ0FoQ2hBeUFEYWdzaEF5QUVLQUlNSVFVTUFRc0xRWDhMSVFJZ0JFRVFhaVFBSUFJTERRQWdBRUVHUVg5QkJSRC9CUXRnQVFGOElBQXBBZ1JDLy8vLy8vLy8vLzgvV0FSQUlBRWdBU3NEQ0VRQUFBQUFBQUR3UHlBQUtBSUF0eUlDbzZBNUF3Z2dBU0FCS3dNUUlBQW9BZ1FpQUVFZmRTQUFRZi8vLy84SGNTQUFRUjkyZEdwQkVXcTRJQUtqb0RrREVBc0xtZ0VCQkg4Z0FFRVFhaUVGSUFBaEJnSkFBMEFnQWtFQVRBMEJBa0FDUUFKL0lBWXRBQWRCZ0FGeEJFQWdCU0FCUVFGMGFpOEJBQXdCQ3lBQklBVnFMUUFBQ3lJQVFUQnJJZ1JCQ2trTkFDQUFRY0VBYTBFRlRRUkFJQUJCTjJzaEJBd0JDeUFBUWVjQWEwRjZTUTBCSUFCQjF3QnJJUVFMSUFKQkFXc2hBaUFCUVFGcUlRRWdCQ0FEUVFSMGNpRUREQUVMQzBGL0lRTUxJQU1MSmdFQmZ5TUFRUkJySWdJa0FDQUNRUUEyQWd3Z0FFRUZJQUZCQUJDU0JDQUNRUkJxSkFBTHdRRUJBMzhDUUNBQklBSW9BaEFpQXdSL0lBTUZJQUlRemdNTkFTQUNLQUlRQ3lBQ0tBSVVJZ1ZyU3dSQUlBSWdBQ0FCSUFJb0FpUVJBUUFQQ3dKQUlBSW9BbEJCQUVnRVFFRUFJUU1NQVFzZ0FTRUVBMEFnQkNJRFJRUkFRUUFoQXd3Q0N5QUFJQU5CQVdzaUJHb3RBQUJCQ2tjTkFBc2dBaUFBSUFNZ0FpZ0NKQkVCQUNJRUlBTkpEUUVnQUNBRGFpRUFJQUVnQTJzaEFTQUNLQUlVSVFVTElBVWdBQ0FCRUI4YUlBSWdBaWdDRkNBQmFqWUNGQ0FCSUFOcUlRUUxJQVFMaXdFQkEzOGpBRUVRYXlJQUpBQUNRQ0FBUVF4cUlBQkJDR29RQlEwQVFZemVCQ0FBS0FJTVFRSjBRUVJxRUxFQklnRTJBZ0FnQVVVTkFDQUFLQUlJRUxFQklnRUVRRUdNM2dRb0FnQWlBaUFBS0FJTVFRSjBha0VBTmdJQUlBSWdBUkFFUlEwQkMwR00zZ1JCQURZQ0FBc2dBRUVRYWlRQVFZalZCRUhNMVFRMkFnQkJ3TlFFUVNvMkFnQUxWQUFqQUVFUWF5SUNKQUFnQUNBQ1FRaHFJQU1wQXdBUVFnUitRb0NBZ0lEZ0FBVWdBaWtEQ0VLQWdJQ0FnSUNBK1A4QWcwS0FnSUNBZ0lDQStQOEFVcTFDZ0lDQWdCQ0VDeUVCSUFKQkVHb2tBQ0FCQzFRQUl3QkJFR3NpQWlRQUlBQWdBa0VJYWlBREtRTUFFRUlFZmtLQWdJQ0E0QUFGSUFJcEF3aEMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZhdFFvQ0FnSUFRaEFzaEFTQUNRUkJxSkFBZ0FRdFZBUUYvQWtBQ1FBSkFJQUZDSUlpblFRRnFEZ01BQVFJQkN5QUJweUlDTHdFR1FRWkhEUUFnQWlrRElDSUJRb0NBZ0lCd2cwS0FnSUNBRUZFTkFRc2dBRUhrMFFCQkFCQVZRb0NBZ0lEZ0FDRUJDeUFCQzI0QkJYOUI2QUloQVFOQUlBRWdBazRFUUNBQUlBRWdBbXBCQVhZaUEwRUNkRUdRZ2dKcUtBSUFJZ1JCRDNZaUJVa0VRQ0FEUVFGcklRRU1BZ3NnQUNBRVFRaDJRZjhBY1NBRmFra0VRRUVCRHdVZ0EwRUJhaUVDREFJTEFBc0xJQUJCc0pFQ1FlQ1NBa0VHRUt3REN4RUFJQUJCZ0pNQ1FjQ1lBa0VXRUt3REMwWUJBWDhDUUNBQUtBSUlJQUpxSWdNZ0FDZ0NERW9FUUNBQUlBTWdBUkMzQWcwQkN3TkFJQUpCQUV3RVFFRUFEd3NnQWtFQmF5RUNJQUFnQVJDTEFVVU5BQXNMUVg4TG1BRUNCWDhCZmlBQktRSUVJZ2luUWYvLy8vOEhjU0lFUlFSQUlBSVBDeUFBS0FJRUlRTUNmeUFJUW9DQWdJQUlnMUJGQkVBZ0FTOEJFQXdCQ3lBQkxRQVFDeUVHSUFOQi8vLy8vd2R4SVFVZ0JFRUJheUVIQWtBRFFDQUNJQVJxSUFWS0RRRWdBQ0FHSUFJUXh3RWlBMEVBU0NBRElBUnFJQVZLY2cwQklBQWdBU0FEUVFGcUlnSkJBU0FIRUxNRERRQUxJQU1QQzBGL0M1WUNBUVIvSUFBb0FoQWhCaUFCS0FJQUlnVXRBQkFFZnlBR0lBVVFrQVFnQlNnQ0ZDQURha0dCZ056eGVXd2dCR3BCZ1lEYzhYbHNCVUVBQ3lFSEFuOGdCU2dDSUNJSUlBVW9BaHhPQkVBZ0FDQUJJQUlnQ0VFQmFoQzhCUVJBUVg4Z0JTMEFFRVVOQWhvZ0JpQUZFSlFEUVg4UEN5QUJLQUlBSVFVTElBVXRBQkFFUUNBRklBYzJBaFFnQmlBRkVKUURDeUFGSUFVb0FpQWlBVUVCYWpZQ0lDQUZJQUZCQTNScUlnRWdBQ0FERUJnaUFEWUNOQ0FCSUFFb0FqQkIvLy8vSDNFZ0JFRWFkSEkyQWpBZ0JTQUZMUUFSSUFCQkgzWnlPZ0FSSUFFZ0FTZ0NNRUdBZ0lCZ2NTQUZJQUFnQlNnQ0dIRkJmM05CQW5ScUlnQW9BZ0JCLy8vL0gzRnlOZ0l3SUFBZ0JTZ0NJRFlDQUVFQUN3dW5BUUlDZndGK0FrQUNRQ0FBSUFFUTBBTWlBMEVBU0EwQUlBTkZEUUZCbFRBaEFpQUFJQUFnQVVIdEFDQUJRUUFRRkNJRVFvQ0FnSUJ3Z3lJQlFvQ0FnSUFnVVNBQlFvQ0FnSUF3VVhJRWYwR1ZNQVVnQVVLQWdJQ0E0QUJSRFFFZ0FDQUVFRGNpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCUVFBaEFpQUJwMEhuQUVFQUVNY0JJUU1nQUNBQkVBOGdBMEVBVGcwQ1FZdmRBQXRCQUJBVkMwRi9JUUlMSUFJTHFRTUJDMzhDUUNBQUtBSVFJZ1FvQXRBQlFRRjBRUUpxSUFRb0Fzd0JUQTBBSUFSQkVHb2lDVUVFSUFRb0FzZ0JJZ05CQVdvaUNIUWlCU0FFS0FJQUVRTUFJZ2RGRFFCQkFTQUlkQ0VLSUFkQkFDQUZFQ3NoQnlBRUtBTE1BU0lGUVFBZ0JVRUFTaHNoQzBFZklBTnJJUXdEUUNBRUtBTFVBU0VESUFZZ0MwWkZCRUFnQXlBR1FRSjBhaWdDQUNFREEwQWdBd1JBSUFNb0FpZ2hCU0FESUFjZ0F5Z0NGQ0FNZGtFQ2RHb2lEU2dDQURZQ0tDQU5JQU0yQWdBZ0JTRUREQUVMQ3lBR1FRRnFJUVlNQVFzTElBa2dBeUFFS0FJRUVRQUFJQVFnQnpZQzFBRWdCQ0FLTmdMTUFTQUVJQWcyQXNnQkN5QUFJQUpCQTNSQlFHc1FLU0lEUlFSQVFRQVBDeUFEUVFJNkFCUWdBMEVCTmdJUUlBUW9BbEFpQlNBRFFSaHFJZ1kyQWdRZ0F5QUVRZEFBYWpZQ0hDQURJQVUyQWhnZ0JDQUdOZ0pRSUFFRVFDQUJJQUVvQWdCQkFXbzJBZ0FMSUFOQ0FEY0NBQ0FESUFFMkFqd2dBMElBTndJd0lBTWdBallDTENBRFFRTTJBaWdnQTBFQk93RWdJQU5DQURjQ0NDQURJQUZCZ1lEYzhYbHNRZi8vbzQ0R2F6WUNKQ0FBS0FJUUlBTkJFR29pQUJDVUF5QUFDNDRFQVFKK0l3QkJJR3NpQWlRQUlBTXBBd0FoQlFKQUFrQUNRQ0FFQkVBZ0JVTC8vLy8vYjFnRVFDQUFFQ1FNQXdzZ0JhY2lCQ0FFS0FJQVFRRnFOZ0lBREFFTElBQWdCUkFsSWdVaEFTQUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSUxBa0FnQUNBREtRTUlFREVpQTBVTkFFS0FnSUNBTUNFQkFrQUNRQ0FGUW9DQWdJQndWQTBBSUFBZ0FpQUZweUFERUV3aUJFRUFTQTBDSUFSRkRRQWdBQkEwSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVFKQUlBSXRBQUJCRUhFRVFDQUNLUU1RSWdaQ0lJaW5RWFZQQkVBZ0JxY2lCQ0FFS0FJQVFRRnFOZ0lBQ3lBQUlBRkJ3UUFnQmtHSGdBRVFHVUVBU0EwRElBSXBBeGdpQmtJZ2lLZEJkVThFUUNBR3B5SUVJQVFvQWdCQkFXbzJBZ0FMSUFBZ0FVSENBQ0FHUVllQUFSQVpRUUJPRFFFTUF3c2dBaWtEQ0NJR1FpQ0lwMEYxVHdSQUlBYW5JZ1FnQkNnQ0FFRUJhallDQUFzZ0FDQUJRY0FBSUFaQmg0QUJFQmxCQUVnTkFpQUFJQUZCUGlBQ05RSUFRZ0dJUWdHRFFvQ0FnSUFRaEVHSGdBRVFHVUVBU0EwQ0N5QUFJQUZCUHlBQ05RSUFRZ0tJUWdHRFFvQ0FnSUFRaEVHSGdBRVFHVUVBU0EwQklBQWdBVUU5SUFJMUFnQkNBWU5DZ0lDQWdCQ0VRWWVBQVJBWlFRQklEUUVnQUNBQ0VFZ0xJQUFnQXhBVElBQWdCUkFQREFNTElBQWdBaEJJSUFBZ0FSQVBDeUFBSUFNUUV5QUFJQVVRRHd0Q2dJQ0FnT0FBSVFFTElBSkJJR29rQUNBQkMxVUJBWDhqQUVFZ2F5SUZKQUFDUUNBQUlBVWdBeEQ3QkVFQVNBUkFRWDhoQkF3QkN5QUFJQUVnQWlBRktRTUlJQVVwQXhBZ0JTa0RHQ0FGS0FJQUlBUnlFRzBoQkNBQUlBVVFTQXNnQlVFZ2FpUUFJQVFMZ2dJREJIOEJmZ0o4SXdCQjRBQnJJZ1lrQUVLQWdJQ0E0QUFoQ1FKQUlBQWdBU0FHUVJCcUlBUkJEM0VpQ0NBRVFRaDJRUTl4SWdkRkVMY0RJZ1ZCQUVnTkFFUUFBQUFBQUFENGZ5RUtBa0FnQlVVZ0FrRUFUSElOQUVFQUlRVWdCRUVFZGtFUGNTQUhheUlFSUFJZ0FpQUVTaHNpQWtFQUlBSkJBRW9iSVFJRFFDQUNJQVZIQkVBZ0FDQUdRUWhxSUFNZ0JVRURkR29wQXdBUVFnMERJQVlyQXdnaUM3MUNnSUNBZ0lDQWdQai9BSU5DZ0lDQWdJQ0FnUGovQUZFTkFpQUdRUkJxSUFVZ0IycEJBM1JxSUF1ZE9RTUFJQVZCQVdvaEJRd0JDd3NnQmtFUWFpQUlFT0FDSVFvTElBQWdBU0FLRU1rRUlRa0xJQVpCNEFCcUpBQWdDUXZIQVFFQmZ3SkFBa0FnQVVLQWdJQ0FjRlFOQUNBQnB5SURMd0VHUVFwSERRQWdBQ0FES1FNZ0VBOGdBd0orSUFLOUlnRUNmeUFDbVVRQUFBQUFBQURnUVdNRVFDQUNxZ3dCQzBHQWdJQ0FlQXNpQUxlOVVRUkFJQUN0REFFTFFvQ0FnSURBZmlBQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeUlCTndNZ0lBRkNJSWluUVhWSkRRRWdBYWNpQUNBQUtBSUFRUUZxTmdJQUlBRVBDeUFBUWEweFFRQVFGVUtBZ0lDQTRBQWhBUXNnQVFzcEFRRitJQUFnQVJDcUFTSUJSUVJBUW9DQWdJRGdBQThMSUFBZ0FSQXRJUUlnQUNBQkVCTWdBZ3NoQUNBQVFwQURnVkN0UXU0Q1F1MENJQUJDQTROUUd5QUFRdVFBZ1ZDdGZYd0xXUUVCZmlBQVF1MENmaUFBUXJFUGZVSUNoM3dnQUVMdERuMGlBU0FCUXVRQWdTSUJmU0FCUWorSFFweC9nM3hDbkg5L2ZDQUFRc0VNZlNJQUlBQkNrQU9CSWdCOUlBQkNQNGRDOEh5RGZFS1FBMzk4UXNyeEszMEx4UUVDQ0g4QmZpQUFJQUVRbkFKQmZ5RUVBa0FnQVNnQ0FDSUhRUU5xSWdnZ0FDa0NCQ0lMcDBILy8vLy9CM0ZLRFFBZ0FFRVFhaUVGSUF0Q2dJQ0FnQWlESVFzRFFDQURRUXhHRFFFZ0EwRURiQ0VKUVFBaEFBSkFBMEFnQUVFRFJnMEJJQUFnQjJvaEJpQUFJQWxxSVFvZ0FFRUJhaUVBQW44Z0MxQkZCRUFnQlNBR1FRRjBhaThCQUF3QkN5QUZJQVpxTFFBQUN5QUtRZURSQVdvc0FBQkdEUUFMSUFOQkFXb2hBd3dCQ3dzZ0FpQURyVGNEQUNBQklBZzJBZ0JCQUNFRUN5QUVDN1FCQWdSL0FYNGpBRUVRYXlJREpBQWdBeUFCS0FJQUlnUTJBZ3hCZnlFR0lBQXBBZ1FpQjZkQi8vLy8vd2R4SUFSS0JFQWdBRUVRYWlFRkFrQUNRQUovSUFkQ2dJQ0FnQWlEVUVVRVFDQUZJQVJCQVhScUx3RUFEQUVMSUFRZ0JXb3RBQUFMSWdWQksyc09Bd0FCQUFFTElBTWdCRUVCYWpZQ0RBc2dBQ0FEUVF4cUlBSVFuUUlpQmlBRlFTMUhja1VFUUNBQ1FnQWdBaWtEQUgwM0F3QUxJQUVnQXlnQ0REWUNBQXNnQTBFUWFpUUFJQVlMOFFrREFYd0xmd0YrSXdCQjBBSnJJZ0lrQUVLQWdJQ0E0QUFoRVFKQUlBQWdBU0FDUWNBQmFpQUVRUVIySWdOQkFYRkJBQkMzQXlJR1FRQklEUUFnQTBFUGNTRU5JQVpGQkVBZ0RVRUNSZ1JBSUFCQjg0SUJRUUFRVUF3Q0N5QUFRZDNpQUJCaUlSRU1BUXNDZnlBQ0t3T0FBaUlGbVVRQUFBQUFBQURnUVdNRVFDQUZxZ3dCQzBHQWdJQ0FlQXNoRGdKL0lBSXJBL2dCSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Q3lFUEFuOGdBaXNEOEFFaUJabEVBQUFBQUFBQTRFRmpCRUFnQmFvTUFRdEJnSUNBZ0hnTElSQUNmeUFDS3dQb0FTSUZtVVFBQUFBQUFBRGdRV01FUUNBRnFnd0JDMEdBZ0lDQWVBc2hDUUovSUFJckErQUJJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDeUVLQW44Z0Fpc0QyQUVpQlpsRUFBQUFBQUFBNEVGakJFQWdCYW9NQVF0QmdJQ0FnSGdMSVFjQ2Z5QUNLd1BRQVNJRm1VUUFBQUFBQUFEZ1FXTUVRQ0FGcWd3QkMwR0FnSUNBZUFzaEN3Si9JQUlyQThnQklnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEN5RU1JQVJCQVhFaENBSi9JQUlyQThBQklnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEN5RUdRUUFoQXdKQUlBaEZEUUFnQkVFUGNTRUlBa0FDUUFKQUFrQWdEUTRFQUFFQ0F3UUxJQUlnQmpZQ1lDQUNJQXMyQWxRZ0FpQUdRUjkyUVFSeU5nSmNJQUlnREVFRGJFSGcwUUZxTmdKWUlBSWdEMEVEYkVIQTBRRnFOZ0pRSUFKQmtBSnFRY0FBUWR1WkFTQUNRZEFBYWhCT0lRTU1Bd3NnQWlBR05nS0FBU0FDSUFzMkFuZ2dBaUFHUVI5MlFRUnlOZ0o4SUFJZ0RFRURiRUhnMFFGcU5nSjBJQUlnRDBFRGJFSEEwUUZxTmdKd0lBSkJrQUpxUWNBQVFjWDdBQ0FDUWZBQWFoQk9JUU1nQ0VFRFJ3MENJQUpCa0FKcUlBTnFRU0E2QUFBZ0EwRUJhaUVEREFJTElBSWdCallDb0FFZ0FrR1FBbW9pQ0VIQUFFR28rd0JCb3ZzQUlBWkJrTTRBU1JzZ0FrR2dBV29RVGlFRElBSWdDellDbEFFZ0FpQU1RUUZxTmdLUUFTQURJQWhxUWNBQUlBTnJRWldCQVNBQ1FaQUJhaEJPSUFOcUlRTU1BUXNnQWlBTE5nSzBBU0FDSUF4QkFXbzJBckFCSUFJZ0JqWUN2QUVnQWlBR1FSOTJRUVJ5TmdLNEFTQUNRWkFDYWtIQUFFRzIrd0FnQWtHd0FXb1FUaUVESUFoQkEwY05BQ0FDUVpBQ2FpQURha0dzd0FBN0FBQWdBMEVDYWlFREN3SkFJQVJCQW5GRkRRQUNRQUpBQWtBQ1FDQU5EZ1FBQVFJREJBc2dBaUFKTmdJSUlBSWdDallDQkNBQ0lBYzJBZ0FnQWtHUUFtb2dBMnBCd0FBZ0EydEIxNEVCSUFJUVRpQURhaUVEREFNTElBSWdDVFlDS0NBQ0lBbzJBaVFnQWlBSE5nSWdJQUpCa0FKcUlnY2dBMnBCd0FBZ0EydEIxNEVCSUFKQklHb1FUaUFEYWlJRElBZHFRUzFCS3lBT1FRQklHem9BQUNBQ0lBNGdEa0VmZFNJRWN5QUVheUlFUVR4dUlnWTJBaEFnQWlBR1FVUnNJQVJxTmdJVUlBY2dBMEVCYWlJRWFrRS9JQU5yUWEzN0FDQUNRUkJxRUU0Z0JHb2hBd3dDQ3lBQ0lCQTJBandnQWlBSk5nSTRJQUlnQ2pZQ05DQUNJQWMyQWpBZ0FrR1FBbW9nQTJwQndBQWdBMnRCb0lBQklBSkJNR29RVGlBRGFpRUREQUVMSUFJZ0NUWUNTQ0FDSUFvMkFrUWdBa0hCQUVIUUFDQUhRUXhJR3pZQ1RDQUNJQWRCQVdwQkRHOUJBV3MyQWtBZ0FrR1FBbW9nQTJwQndBQWdBMnRCbUlNQklBSkJRR3NRVGlBRGFpRURDeUFBSUFKQmtBSnFJQU1Ra3dJaEVRc2dBa0hRQW1va0FDQVJDemNDQW44QmZpTUFRUkJySWdBa0FDQUFFS01FSUFBcEF3QWhBaUFBS0FJSUlRRWdBRUVRYWlRQUlBRkI2QWR0ckNBQ1F1Z0hmbndMbEF3REMzOERmZ0Y4SXdCQm9BRnJJZ1FrQUNBRVFlQUFha0VBUVRnUUt4b2dCRUlCTndOd0lBUkNBVGNEYUVLQWdJQ0E0QUFoQVNBQUlBTXBBd0FRS0NJUlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0JFRUFOZ0lNSUJHbklnVXBBZ1FpRDBLQWdJQ0FDSU1oRUFKQUFrQUNRQUpBSUE5Qy8vLy8vd2VEVUEwQUlBVkJFR29oQndKQUFuOGdFRkFpREVVRVFDQUhMd0VBREFFTElBY3RBQUFMSWdOQk1HdEJDa2tOQUNBRFFTdHJEZ01BQVFBQkMwS0FnSUNBd0g0aEFTQUZJQVJCREdvZ0JFSGdBR29RemdRTkF5QVBwMEgvLy8vL0IzRWhCa0VCSVFrRFFBSkFBa0FDUUNBSlFRZEdJQVFvQWd3aUF5QUdUbklOQUNBSlFRSjBRZGovQVdvb0FnQWhBZ0ovSUF4RkJFQWdCeUFEUVFGMGFpOEJBQXdCQ3lBRElBZHFMUUFBQ3lBQ1J3MEFJQVFnQTBFQmFpSUlOZ0lNSUFsQkJrY05BU0FHSUFoTURRZEI2QWNoQWtFQUlRc2dDQ0VEQTBBQ1FBSkFJQU1nQmtZRVFDQUdJUU1NQVFzQ2Z5QU1SUVJBSUFjZ0EwRUJkR292QVFBTUFRc2dBeUFIYWkwQUFBc2lDa0V3YXlJTlFRcEpEUUVnQXlBSVJnMEtDeUFFSUFNMkFnd2dCQ0FMckRjRGtBRU1CQXNnQWtFQlJpRU9JQTBnQWtFS2JTSUNiQ0FMYWlBT0lBcEJORXR4YWlFTElBTkJBV29oQXd3QUN3QUxJQVFnQkNrRGFFSUJmVGNEYUNBRElBWk9CRUFnQ1VFRFN5RUtEQVVMQW44Q1FBSkFBbjhnREVVRVFDQUhJQU5CQVhScUx3RUFEQUVMSUFNZ0Iyb3RBQUFMSWdKQksyc09Bd0VKQVFBTElBSkIyZ0JIRFFoQ0FDRVBJQU5CQVdvTUFRc2dCQ0FEUVFGcUlnTTJBZ3dnQmlBRGF5SURRUVpyUVg1SkRRY2dCU0FFUVF4cUlBUkJHR29RM3dJTkJ5QURRUVZHQkVBZ0JDZ0NEQ0VEQW44Z0RFVUVRQ0FISUFOQkFYUnFMd0VBREFFTElBTWdCMm90QUFBTFFUcEhEUWdnQkNBRFFRRnFOZ0lNQ3lBRklBUkJER29nQkVFUWFoRGZBZzBIUWdBZ0JDa0RFQ0FFS1FNWVFqeCtmQ0lQZlNBUElBSkJMVVliSVE4Z0JDZ0NEQXNoQTBFQUlRb2dBeUFHUmcwRkRBWUxJQVVnQkVFTWFpQUVRZUFBYWlBSlFRTjBhaENkQWcwRkN5QUpRUUZxSVFrTUFBc0FDeUFGUVJCcUlRZ2dENmRCLy8vLy93ZHhJUVpCQUNFQ0EwQUNRQ0FHSUFJaUEwWUVRQ0FHSVFNTUFRc2dBMEVCYWlFQ0FuOGdFRkJGQkVBZ0NDQURRUUYwYWk4QkFBd0JDeUFESUFocUxRQUFDMEVnUncwQkN3c2dCQ0FETmdJTUlBVWdCRUVNYWhDY0FrS0FnSUNBd0g0aEFTQUVLQUlNSWdJZ0JrNE5BaUFFUWZBQWFpRUtJQVJCNEFCcVFRaHlJUWNDUUFKL0lCQlFJZ2xGQkVBZ0NDQUNRUUYwYWk4QkFBd0JDeUFDSUFocUxRQUFDMEV3YTBFSlRRUkFJQVVnQkVFTWFpQUtFSjBDRFFRZ0JTQUVRUXhxSUFjUXpRUkZEUUVNQkFzZ0JTQUVRUXhxSUFjUXpRUU5BeUFGSUFSQkRHb2lBaENjQWlBRklBSWdDaENkQWcwREN5QUZJQVJCREdvaUFoQ2NBaUFGSUFJZ0JFSGdBR29RemdRTkFpQUZJQVJCREdvUW5BSkJBQ0VEQTBBZ0EwRURSZ1JBSUFRb0Fnd2lBeUFHSUFNZ0Jrb2JJUUlEUUVFQUlRb2dBaUFEUmcwREFrQUNRQUovSUFsRkJFQWdDQ0FEUVFGMGFpOEJBQXdCQ3lBRElBaHFMUUFBQ3lJTFFTdHJEZ01BQVFBQkN5QUVJQU5CQVdvMkFnd2dCU0FFUVF4cUlBUkJHR29RM3dJTkJpQUZJQVJCREdvZ0JFRVFhaERmQWcwR1FnQWdCQ2tERUNBRUtRTVlRangrZkNJQmZTQUJJQXRCTFVZYklROE1CUXNnQTBFQmFpRUREQUFMQUFzZ0EwRUJhMEVCVFFSQUlBUW9BZ3dpQWlBR1RnMEVBbjhnQ1VVRVFDQUlJQUpCQVhScUx3RUFEQUVMSUFJZ0NHb3RBQUFMUVRwSERRUWdCQ0FDUVFGcU5nSU1DeUFEUVFOMElRSWdBMEVCYWlFRElBVWdCRUVNYWlBQ0lBUnFRZmdBYWhDZEFrVU5BQXNNQWd0Q0FDRVBDMEVBSVFNRFFDQURRUWRHUlFSQUlBTkJBM1FpQWlBRVFTQnFhaUFFUWVBQWFpQUNhaWtEQUxrNUF3QWdBMEVCYWlFRERBRUxDeUFFUVNCcUlBb1E0QUlnRDBMZzFBTit1YUVpRXIwaUFRSi9JQktaUkFBQUFBQUFBT0JCWXdSQUlCS3FEQUVMUVlDQWdJQjRDeUlEdDcxUkJFQWdBNjBoQVF3QkMwS0FnSUNBd0g0Z0FVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeUVCQ3lBQUlCRVFEd3NnQkVHZ0FXb2tBQ0FCQ3lJQkFYOUJBU0VCSUFBUXVRTUVmMEVCQlNBQVFhQ2lBa0dncHdKQkZCQ3NBd3NMZlFFQ2Z5TUFRUkJySWdFa0FDQUJRUW82QUE4Q1FBSkFJQUFvQWhBaUFnUi9JQUlGSUFBUXpnTU5BaUFBS0FJUUN5QUFLQUlVSWdKR0RRQWdBQ2dDVUVFS1JnMEFJQUFnQWtFQmFqWUNGQ0FDUVFvNkFBQU1BUXNnQUNBQlFROXFRUUVnQUNnQ0pCRUJBRUVCUncwQUlBRXRBQThhQ3lBQlFSQnFKQUFMbXdFQkJIOGpBRUVRYXlJREpBQWdBYWNpQkNnQ0VDSUNRVEJxSVFVZ0FpQUNLQUlZUVg5elFRSjBRYngrY21vb0FnQWhBZ0pBQWtBRFFDQUNSUTBCSUFKQkEzUWdCV3BCQ0dzaUFpZ0NCRUV3UndSQUlBSW9BZ0JCLy8vL0gzRWhBZ3dCQ3dzZ0F5QUNOZ0lNSUFBZ0JDQURRUXhxSUFJb0FnQkJHblpCUEhFUWtRTU5BUXNnQkNBRUxRQUZRZjRCY1RvQUJRc2dBMEVRYWlRQUM3Y0ZBZ1ovQTM0akFFRXdheUlFSkFBZ0FDZ0NBQ0VGUW9DQWdJQXdJUXRDZ0lDQWdEQWhDZ0pBSUFFRVFFRi9JUU1nQlJBK0lncENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQXBCQUJDMEFTRUdJQVVnQ2hBUElBWU5BU0FGRUQ0aUMwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBVWdDa0h3QUNBTFFZQ0FBUkFaUVFCSURRRUxJQUJCRUdvaEJrRUFJUU1DUUFKQUEwQWdCaWdDQUVHQ2YwWUVRQ0FBS0FJWUlRY2dCQ0FHS1FNWU53TW9JQVFnQmlrREVEY0RJQ0FFSUFZcEF3ZzNBeGdnQkNBR0tRTUFOd01RSUFkQkFXb2hCeUFBS1FNZ0lRa0NRQUpBQWtBZ0FRUkFJQWxDSUlpblFYVlBCRUFnQ2FjaUNDQUlLQUlBUVFGcU5nSUFDeUFGSUFzZ0F5QUpRWVNBQVJDdkFVRUFTQTBDSUFVZ0NpQURBbjRnQUVIZ0FFRUFJQWNnQkVFUWFpQUVRUXhxRVBNQ1JRUkFJQVFwQXlBTUFRc2dCRUtBZ0lDQU1EY0RJRUtBZ0lDQU1BdEJoSUFCRUs4QlFRQklEUUlnQUNnQ0tFSGdBRWNOQVNBRklBc1ExQVFnQlNBS0VOUUVJQUlnQTBFQmFqWUNBQXdIQ3lBRklBa1FEeUFBUW9DQWdJQXdOd01nSUFCQjRBQkJBU0FISUFSQkVHb2dCRUVNYWhEekFnMEJBa0FnQkNrRElDSUpweWdDQkVILy8vLy9CM0ZCQVNBREd3UkFJQUFnQ1VFQkVMUUJJUWNnQUNnQ0FDQUpFQThnQncwRElBTkZCRUFnQUNnQ0tFSGdBRVlOQ1NBQVFjSUFFQkFnQUVIY0FCQWFDeUFEUVFGcUlRTU1BUXNnQUNnQ0FDQUpFQThMSUFBb0FpaEI0QUJHRFFVTElBQVFFZzBBSUFBUWtRRU5BQ0FHS0FJQVFmMEFSd1JBSUFCQnJzOEFRUUFRRmd3QkN5QUFJQVlRL3dFZ0FFRUFOZ0l3SUFBZ0FDZ0NGRFlDQkNBQUlBQW9BamdRendORkRRRUxRWDhoQXd3RkN5QURRUUZxSVFNTUFRc0xJQUJCZ244UUxDRUREQUlMSUFCQkpCQVFJQUJCUUdzb0FnQWdBMEVCYTBILy93TnhFQmNMSUFBUUVpRURDeUFFUVRCcUpBQWdBd3VBQVFFQ2Z5QUFRU1lRRUNBQVFVQnJJZ0lvQWdCQkFCQVhJQUJCQVJBUUlBSW9BZ0JCQUJBNUlBQWdBaWdDQUJBeUlnTVFIaUFBUVlBQkVCQWdBaWdDQUNBQlFRSnFRZjhCY1JCa0lBQkI2Z0JCZnhBY0lRRWdBRUhSQUJBUUlBQkJqd0VRRUNBQVFlc0FJQU1RSEJvZ0FDQUJFQjRnQUVFT0VCQWdBRUVPRUJBTG5RRUJCWDhnQUNnQ1FDSUVLQUtJQVNJRFFRQWdBMEVBU2hzaEF3SkFBMEFDUUNBQ0lBTkdCRUJCQUNFRElBUW9BbndpQWtFQUlBSkJBRW9iSVFWQkFDRUNBMEFnQWlBRlJnMEVJQUpCQkhRaEJpQUNRUUZxSVFJZ0JpQUVLQUowYWlnQ0FDQUJSdzBBQ3d3QkN5QUNRUVIwSVFVZ0FrRUJhaUVDSUFVZ0JDZ0NnQUZxS0FJQUlBRkhEUUVMQ3lBQVFjMGtRUUFRRmtGL0lRTUxJQU1MaGdVQ0NIOEJmaU1BUVVCcUlnRWtBQ0FBS0FJNElRSkJmeUVJQWtBZ0FDZ0NBQ0FCUVNocVFTQVFQUTBBQWtBZ0FDZ0NBQ0FCUVJCcVFRRVFQUTBBSUFKQkFXb2hBMEVBSVFJQ1FBTkFJQU1pQlNBQUtBSThUdzBCSUFJaEJrRUJJUUlnQlVFQmFpRURBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUZMUUFBSWdSQjJ3QnJEZ01HQXdFQUN5QUVRUzlIQkVBZ0JFRUthdzRFQndJQ0J3SUxRUzhoQkNBR0RRVURRQ0FCSUFOQkFXbzJBZ3dDUUNBRExBQUFJZ0pCQUU0RVFDQUNRZjhCY1NFQ0RBRUxJQU5CQmlBQlFReHFFRmdpQWtHQWdNUUFUdzBHQ3lBQ0VNVUJCRUFnQVVFUWFpQUNFTGtCRFFzZ0FTZ0NEQ0VEREFFTEN5QUFRWVIvTmdJUUlBQWdBVUVvYWhBMk53TWdJQUZCRUdvUU5pRUpJQUFnQXpZQ09DQUFJQWszQXloQkFDRUlEQW9MUWQwQUlRUkJBQ0VDREFRTElBVEFRUUJPRFFFZ0JVRUdJQUZCQ0dvUVdDSUVRWUNBeEFCUERRSWdCRUYrY1VHb3dBQkdEUVFnQVNnQ0NDRUREQUVMSUFGQktHcEIzQUFRT3cwR0lBVkJBbW9oQndKQUlBVXRBQUVpQkFSQUlBUkJDbXNPQkFVQkFRVUJDMEVBSVFRZ0JpRUNJQWNpQXlBQUtBSThUdzBHREFNTElBVEFRUUJPQkVBZ0JpRUNJQWNoQXd3REMwRUhRUVpCQUNBRFFRWWdBVUVNYWhCWUlnUkJmbkZCcU1BQVJoc2dCRUgvLzhNQVN5SUNHeUlEUlFSQUlBY2dBU2dDRENBQ0d5RUREQUVMSUFOQkJtc09BZ01CQndzZ0JpRUNEQUVMSUFCQnRQQUFRUUFRRmd3RUN5QUJRU2hxSUFRUXVRRkZEUUVNQXdzTElBQkIrTWdBUVFBUUZnd0JDeUFBUVozSkFFRUFFQllMSUFFb0FpZ29BaEFpQUVFUWFpQUJLQUlzSUFBb0FnUVJBQUFnQVNnQ0VDZ0NFQ0lBUVJCcUlBRW9BaFFnQUNnQ0JCRUFBQXNnQVVGQWF5UUFJQWdMVVFFQ2YwRi9JUUpCQVNFREEwQUNRQ0FBSUFFUXRnRU5BQ0FEUlFSQUlBQW9Ba0JCZnpZQ21BSUxJQUFvQWhCQkxFY0VRRUVBSVFJTUFRc2dBQkFTRFFBZ0FFRU9FQkJCQUNFRERBRUxDeUFDQ3pNQkFYOERRQUpBSUFGQkFFNEVmeUFCSUFKSERRRkJBUVZCQUFzUEN5QUFLQUxNQVNBQlFRTjBhaWdDQUNFQkRBQUxBQXVFQXdFR2Z5QUJLQUk0SVFNQ1FBSkFBa0FnQVMwQWJrRUJjUVJBSUFORkJFQkI4c0lBSVFNZ0FTZ0NRQTBEQzBHQzdnQWhBeUFDUVRwR0lBSkJ6UUJHY2cwQ1FRQWhBaUFCS0FLSUFTSURRUUFnQTBFQVNoc2hCQU5BSUFJZ0JFWU5Ba0hkN1FBaEF5QUJLQUtBQVNBQ1FRUjBhaWdDQUNJR1FUcEdJQVpCelFCR2NnMERJQUpCQVdvaEFnd0FDd0FMSUFORkRRQWdBUzhCYkNJQ1FZSU1SZzBBSUFKQkNIWkJBMnNPQkFBQ0FnQUNDMEVBSVFRZ0FTZ0NpQUVpQWtFQUlBSkJBRW9iSVFoQkFDRURBMEFnQXlBSVJnMENRUUFoQWdKQUlBRW9Bb0FCSWdVZ0EwRUVkR29vQWdBaUJrVU5BQU5BQWtBZ0FpQURSZ1JBUVFBaEFpQUJLQUo4SWdWQkFDQUZRUUJLR3lFRkEwQWdBaUFGUmcwRUlBWWdBU2dDZENBQ1FRUjBhaUlIS0FJQVJnUkFJQWNvQWdSRkRRTUxJQUpCQVdvaEFnd0FDd0FMSUFKQkJIUWhCeUFDUVFGcUlRSWdCU0FIYWlnQ0FDQUdSdzBCQ3d0Qm1DUWhBd3dDQ3lBRFFRRnFJUU1NQUFzQUN5QUFJQU5CQUJBV1FYOGhCQXNnQkF0YUFRSi9JQUJCUUdzaUF5QUJLQUlBTmdJQUlBQkJLUkFRSUFNZ0F5Z0NBQ2dDQkNJQ05nSUFJQUFvQWdBZ0FrS0FnSUNBSUJDK0F5RUNJQUVvQWdBZ0FqWUNDQ0FBUVFNUUVDQURLQUlBSUFJUU9TQUFRZEFBRUJBTFJ3RUJmd0ovUVFBZ0FTZ0NDQTBBR2lBQktBSUFJZ0lFZnlBQ0JVRi9JQUFnQVJEZUJBMEJHaUFCS0FJQUN5Z0NnQUlnQVNnQ0RHcEJDam9BQUNBQlFRRTJBZ2hCQUFzTDNBRUJBbjhnQUNnQ0FDQUFRVUJySWdNb0FnQkJBRUVBSUFBb0FneEJBQkRvQXlJQ1JRUkFJQUZCQURZQ0FFRi9Ed3NnQWtFQU5nSndJQUpCQURZQ1lDQUNRb0NBZ0lBUU53SklJQUpDQVRjQ01DQUNRWUFNT3dGc0lBSkNBVGNDV0NBQ1FnRTNBbEFnQVNBQ05nSUFJQU1nQWpZQ0FDQUFRUWtRRUNBQklBRW9BZ0FvQXBnQ05nSU1JQUJCNlFCQmZ4QWNJUUVnQUVHNEFSQVFJQUJCQ0JBYUlBTW9BZ0JCQUJBWElBQkJ1QUVRRUNBQVFmTUFFQm9nQXlnQ0FFRUFFQmNnQUVFdEVCQWdBQ0FCRUI0Z0F5QURLQUlBS0FJRU5nSUFRUUFMM2dRQkNYOGpBRUVRYXlJR0pBQWdBQ0FBS1FPQUFSQWpJQUJCRUdvaEF5QUFRYUFCYWlFRUlBQW9BcVFCSVFFRFFDQUJJQVJHUlFSQUlBRW9BZ1FoQlVFQUlRSURRQ0FDSUFFb0FoQk9SUVJBSUFBZ0FTQUNRUU4wYWlrREdCQWpJQUpCQVdvaEFnd0JDd3NnQXlBQklBQW9BZ1FSQUFBZ0JTRUJEQUVMQ3lBQUlBUTJBcVFCSUFBZ0FFR2dBV28yQXFBQklBQVFvZ1VnQUNnQ1ZDQUFRZEFBYWtZRVFFRUFJUUlEUUFKQUlBQW9Ba1FoQVNBQ0lBQW9Ba0JPRFFBZ0FTQUNRUmhzYWlJQktBSUFCRUFnQUNBQktBSUVFT3dCQ3lBQ1FRRnFJUUlNQVFzTElBTWdBU0FBS0FJRUVRQUFJQUFvQXBBQ0lnUUVRRUVBSVFFRFFFRUFJUVVnQVVFRlJrVUVRQU5BUVFBaEFpQUZRUUpHUlFSQUEwQWdBa0VVUndSQUlBUWdBVUdnQVd4cUlBVkIwQUJzYWlBQ1FRSjBha0dvRFdvaUJ5Z0NBQ0lJQkVBZ0JDZ0NBQ0lKS0FJQUlBaEJBQ0FKS0FJRUVRRUFHaUFIUVFBMkFnQUxJQUpCQVdvaEFnd0JDd3NnQlVFQmFpRUZEQUVMQ3lBQlFRRnFJUUVNQVFzTElBQW9BdGdCSUFSQkFDQUFLQUxjQVJFQkFCb2dBRUVBTmdLUUFnc2dBRUhnQVdvUW9RVWdBRUg0QVdvUW9RVkJBQ0VDQTBBQ1FDQUFLQUk0SVFFZ0FpQUFLQUlzVGcwQUlBRWdBa0VDZEdvb0FnQWlBVUVCY1VVRVFDQURJQUVnQUNnQ0JCRUFBQXNnQWtFQmFpRUNEQUVMQ3lBRElBRWdBQ2dDQkJFQUFDQURJQUFvQWpRZ0FDZ0NCQkVBQUNBRElBQW9BdFFCSUFBb0FnUVJBQUFnQmlBREtRSUlOd01JSUFZZ0F5a0NBRGNEQUNBR0lBQWdBQ2dDQkJFQUFDQUdRUkJxSkFBUEMwR05rUUZCcnZ3QVFiOFBRYVRsQUJBQUFBdERBUUovSUFBb0FvZ0JJUUpCZnlFREFrQURRQ0FDUVFCTURRRWdBQ2dDZ0FFZ0FrRUJheUlDUVFSMGFpZ0NBQ0FCUncwQUN5QUNRWUNBZ0lBQ2NpRURDeUFEQzhZQkFnUi9BWDRqQUVFUWF5SURKQUFnQUNBQkVDMGlCMEtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFBa0FnQUNBRFFReHFJQWNRNVFFaUJrVUVRQXdCQ3dKQUlBQWdBaEEvSWdFZ0F5Z0NER3BCQVdvUUtTSUVSUVJBUVFBaEJBd0JDeUFFSUFZZ0F5Z0NEQkFmSWdVZ0F5Z0NER29nQWlBQkVCOGFJQVVnQXlnQ0RDQUJhbXBCQURvQUFDQUFJQVVnQXlnQ0RDQUJhaENGQXlFRUlBQW9BaEFpQVVFUWFpQUZJQUVvQWdRUkFBQUxJQUFnQmhCVUN5QUFJQWNRRHdzZ0EwRVFhaVFBSUFRTHZ3RUJBWDhnQVNBRGFpMEFBRUU4UmdSQUlBQWdCRUgvQVhFUUVTQUFJQVZCLy84RGNSQXFJQU5CQVdvaEF3c2dBU0FDS0FJRUlnQkJCV3NpQW1vaUJpMEFBRUcyQVVZRVFDQUFJQUZxTFFBQVFSWkdCRUFnQmtFUk9nQUFJQUJCQkdzaEFnc2dBRUVDYWlFQUlBRWdBbW9pQmlBRk93QUJJQVlnQkVFQmFqb0FBQ0FDUVFOcUlRSURRQ0FBSUFKTVJRUkFJQUVnQW1wQnN3RTZBQUFnQWtFQmFpRUNEQUVMQ3lBRER3dEJvZFVBUWE3OEFFSHM1UUZCdGQ0QUVBQUFDMElCQVg4Q1FDQUFJQUZxSWdBdEFBRkJQVWNOQUVFQklRSUNRQUpBSUFBdEFBQWlBRUVXYXc0RUFnRUJBZ0FMSUFCQnN3RkdEUUVMSUFCQkhVWWhBZ3NnQWd1ekFRRUJmMEYvSVFNQ1FDQUJLQUpNUlEwQUFrQUNRQUpBQWtBZ0FrSHhBR3NPQXdJQkFBTUxJQUVvQXJRQklnTkJBRTROQXlBQklBQWdBVUh6QUJCUElnQTJBclFCSUFBUEN5QUJLQUt3QVNJRFFRQk9EUUlnQVNBQUlBRkI4Z0FRVHlJQU5nS3dBU0FBRHdzZ0FTZ0NyQUVpQTBFQVRnMEJJQUVnQUNBQlFmRUFFRThpQURZQ3JBRWdBQThMSUFKQkNFY05BQ0FCS0FLb0FTSURRUUJPRFFBZ0FTQUFJQUVReWdNaUF6WUNxQUVMSUFNTFJRQWdBQ2dDekFFZ0FVRURkR3BCQkdvaEFRTkFJQUVvQWdBaUFVRUFTRVVFUUNBQUtBSjBJQUZCQkhScUlnRWdBU2dDREVFRWNqWUNEQ0FCUVFocUlRRU1BUXNMQ3pBQUEwQWdBVUdBQVVsRkJFQWdBQ0FCUVlBQmNrSC9BWEVRRVNBQlFRZDJJUUVNQVFzTElBQWdBVUgvQVhFUUVRc05BQ0FBSUFGQjJvZ0JFT0VFQy9rQ0FRUi9RUUVoQ1NBRElRY0NRQU5BSUFjb0Fzd0JJQVZCQTNScVFRUnFJUVVDUUFKQUEwQWdCU2dDQUNJRlFRQklEUUVnQkNBSEtBSjBJZ1lnQlVFRWRHb2lDQ2dDQUVjRVFDQUlRUWhxSVFVTUFRc0xJQVlnQlVFRWRHb29BZ3hCQTNaQkQzRWhDRUVCSVFZZ0NRUkFRUUFoQmd3Q0N5QUFJQU1nQjBFQUlBVWdCRUVCUVFGQkFCQ2ZBU0lGUVFCT0RRRU1Bd3NnQnlnQ0JDSUdSUVJBQWtBZ0J5Z0NJRVVOQUVFQUlRVWdCeWdDd0FJaUJrRUFJQVpCQUVvYklRWURRQ0FGSUFaR0RRRWdCQ0FIS0FMSUFpSUlJQVZCQTNScUtBSUVSZ1JBSUFnZ0JVRURkR290QUFBaUNVRUVkaUVJSUFNZ0IwWUVRRUVCSVFZTUJRdEJBU0VHSUFBZ0F5QUhRUUFnQ1VFQmRrRUJjU0FGSUFRZ0NVRUNka0VCY1NBSlFRTjJRUUZ4SUFnUTlRRWlCVUVBU0EwR0RBUUZJQVZCQVdvaEJRd0JDd0FMQUFzZ0FDQUVRYUdYQVJEL0F3d0RDeUFIS0FJTUlRVkJBQ0VKSUFZaEJ3d0JDd3NnQVNBR05nSUFJQUlnQ0RZQ0FDQUZEd3RCZnd2R0Z3RUdmeU1BUVJCcklnd2tBQ0FNUVg4MkFnd0NmMEVCSUFKQjhRQnJRUU5KRFFBYVFRRWdBa0VJUmcwQUdrRUFDeUVMSUFFb0Fzd0JJQU5CQTNScVFRUnFJUU1DUUFKQUFrQUNRQUpBQWtBRFFDQURLQUlBSWdOQkFFNEVRQ0FDSUFFb0FuUWlDaUFEUVFSMGFpSUpLQUlBSWcxR0JFQWdCRUY5Y1VHNUFVY0VRQ0FESVFrTUJBc2dDaUFESWdsQkJIUnFMUUFNUVFGeFJRMERJQVZCTUJBUklBVWdBQ0FDRUJnUUhTQUZRUUFRRVF3SEN5QUxJQTFCMUFCSGNrVUVRQ0FGUWRnQUVCRWdCU0FEUWYvL0EzRVFLaUFBSUFFZ0FpQUVJQVVnREVFTWFrRUJFT0FCQ3lBSlFRaHFJUU1NQVFzTFFYOGhDU0FEUVg1SEJFQWdBU0FDRVBRQklRa0xJQXRCQVhNZ0NVRUFUbkpGQkVBZ0FDQUJJQUlRNUFRaENRc0NRQ0FDUWMwQVJ5QUpRUUJPY2tVRVFDQUJLQUpJUlEwQklBQWdBUkRxQWlFSkN5QUpRUUJPRFFFTEFrQWdBU2dDTEFSQUlBRW9BbkFnQWtZTkFRc2dBMEYrUncwRERBUUxJQUFnQVNBQ0VPa0NJZ2xCQUVnTkFRc0NRQUpBQWtBQ1FDQUVRYmNCYXc0SEFnSUFBd0FCQWdjTEFrQWdDVUdBZ0lDQUFuRWlBdzBBSUFFb0FuUWdDVUVFZEdvdEFBeEJBWEZGRFFBZ0JVRXdFQkVnQlNBQUlBSVFHQkFkSUFWQkFCQVJEQWNMQWtBZ0JFRzVBV3NPQXdJREFBY0xBa0FnQXcwQUlBRW9BblFnQ1VFRWRHb29BZ3hCK0FCeFFTQkhEUUFnQlVFTEVCRWdCVUhZQUJBUklBVWdDVUgvL3dOeEVDb2dCVUhNQUJBUklBVWdBQ0FDRUJnaUFoQWRJQVZCQkJBUklBVWdBQ0FDRUJnUUhRd0hDd0pBSUF3b0FneEJmMGNOQUNBR0lBY29BZ1FRNHdSRkRRQWdCU0FHSUFjZ0NBSi9JQU1FUUNBSlFZQ0FnSUFDYXlFSlFkc0FEQUVMUWVJQVFkZ0FJQUVvQW5RZ0NVRUVkR290QUF4QkFuRWJDeUFKRU9JRUlRZ01Cd3NnQXdSQUlBVkIrUUFRRVNBRklBQWdBaEFZRUIwZ0JTQUpRZi8vQTNFUUtnd0hDeUFGUWZnQUVCRWdCU0FBSUFJUUdCQWRJQVVnQ1VILy93TnhFQ29NQmdzZ0JVRUdFQkVMSUFsQmdJQ0FnQUp4QkVBZ0JVSGNBRUhjQUVIYkFDQUVRYjBCUmhzZ0JFRzVBVVliRUJFZ0JTQUpRZi8vQTNFUUtnd0ZDd0pBQWtBQ1FDQUVRYmtCYXc0RkFBRUJBUUFCQzBIakFFSFpBQ0FCS0FKMElBbEJCSFJxS0FJTVFRSnhJZ0JCQVhZYklRTWdBRVVnQkVHOUFVZHlEUUZCNUFCQjJRQWdBa0VJUmhzaEF3d0JDMEhpQUVIWUFDQUJLQUowSUFsQkJIUnFMUUFNUVFKeEd5RURDeUFGSUFNUUVTQUZJQWxCLy84RGNSQXFEQVFMSUFWQkNSQVJEQU1MSUFOQmZrWU5BUXNnQ3lBQktBS1FBVUVBU0hJTkFDQUZRZGdBRUJFZ0JTQUJMd0dRQVJBcUlBQWdBU0FDSUFRZ0JTQU1RUXhxUVFBUTRBRUxJQXNnQVNJREtBS1VBVUVBU0hKRkJFQWdCVUhZQUJBUklBVWdBUzhCbEFFUUtpQUFJQUVnQWlBRUlBVWdERUVNYWtFQUVPQUJDd0pBQWtBQ2Z3SkFBa0FDUUFOQUlBTW9BZ1FpQ2tVRVFDQURJUW9NQXdzZ0NpZ0N6QUVnQXlnQ0RFRURkR3BCQkdvaEF3TkFJQU1vQWdBaUNVRUFUZ1JBSUFJZ0NpZ0NkQ0lOSUFsQkJIUnFJZ01vQWdBaURrWUVRQ0FFUVgxeFFia0JSd1JBSUFraEF3d0ZDeUFOSUFraUEwRUVkR290QUF4QkFYRkZEUVFnQlVFd0VCRWdCU0FBSUFJUUdCQWRJQVZCQUJBUkRBb0ZBa0FnQ3lBT1FkUUFSM0lOQUNBRElBTW9BZ3hCQkhJMkFnd2dBQ0FCSUFwQkFDQUpRZFFBUVFCQkFFRUFFSjhCSWdsQkFFZ05BQ0FGUWQ0QUVCRWdCU0FKUWYvL0EzRVFLaUFBSUFFZ0FpQUVJQVVnREVFTWFrRUJFT0FCQ3lBRFFRaHFJUU1NQWdzQUN3c2dDVUYrUndSQUlBb2dBaEQwQVNJRFFRQk9EUUlMSUFzRVFDQUFJQW9nQWhEa0JDSURRUUJPRFFJTEFrQUNRQ0FDUWMwQVJ3MEFJQW9vQWtoRkRRQWdBQ0FLRU9vQ0lRTU1BUXNDUUNBS0tBSXNSUTBBSUFvb0FuQWdBa2NOQUNBQUlBb2dBaERwQWlFRERBRUxBa0FnQ1VGK1JnMEFJQXNnQ2lnQ2tBRWlBMEVBU0hJTkFDQUtLQUowSUFOQkJIUnFJZ01nQXlnQ0RFRUVjallDRENBQUlBRWdDa0VBSUFvb0FwQUJJQU1vQWdCQkFFRUFRUUFRbndFaEF5QUZRZDRBRUJFZ0JTQURRZi8vQTNFUUtpQUFJQUVnQWlBRUlBVWdERUVNYWtFQUVPQUJDeUFMSUFvb0FwUUJJZ05CQUVoeVJRUkFJQW9vQW5RZ0EwRUVkR29pQXlBREtBSU1RUVJ5TmdJTUlBQWdBU0FLUVFBZ0NpZ0NsQUVnQXlnQ0FFRUFRUUJCQUJDZkFTRURJQVZCM2dBUUVTQUZJQU5CLy84RGNSQXFJQUFnQVNBQ0lBUWdCU0FNUVF4cVFRQVE0QUVMSUFvaUF5Z0NJRVVOQVF3REN3c2dBMEVBU0EwQkN5QURRWUNBZ0lBQ2NVVU5BU0FLS0FLQUFTQURRWUNBZ0lBQ2F5SURRUVIwYWlJSklBa29BZ3hCQkhJMkFnd2dBQ0FCSUFwQkFTQURJQUpCQUVFQVFRQVFud0VNQWdzZ0NpZ0NJRVVOQTBFQUlRTURRQ0FESUFvb0FzQUNUZzBFSUFJZ0NpZ0N5QUlnQTBFRGRHb2lEaWdDQkNJTlJnUkFJQUVnQ2tZTkJDQUFJQUVnQ2tFQUlBNHRBQUFpQ2tFQmRrRUJjU0FESUFJZ0NrRUNka0VCY1NBS1FRTjJRUUZ4SUFwQkJIWVE5UUVoQXd3RUJRSkFBa0FnRFVGK2NVSFNBRWNFUUNBTElBMUIxQUJIY2tVTkFRd0NDeUFMRFFFTElBTWhDU0FCSUFwSEJFQWdBQ0FCSUFwQkFDQU9MUUFBUVFGMlFRRnhJQU1nRFVFQVFRQkJBQkQxQVNFSkN5QUZRZDRBRUJFZ0JTQUpRZi8vQTNFUUtpQUFJQUVnQWlBRUlBVWdERUVNYWlBTlFkUUFSaERnQVFzZ0EwRUJhaUVEREFFTEFBc0FDeUFEUVFSMElna2dDaWdDZEdvaUN5QUxLQUlNUVFSeU5nSU1JQUFnQVNBS1FRQWdBeUFDSUFvb0FuUWdDV29vQWd3aUEwRUJjU0FEUVFGMlFRRnhJQU5CQTNaQkQzRVFud0VMSWdOQkFFZ05BUXNDUUFKQUFrQUNRQUpBQWtBQ1FDQUVRYmNCYXc0SEFRRUFCZ0FEQVFnTElBRW9Bc2dDSUFOQkEzUnFMUUFBSWdsQkJIRUVRQ0FGUVRBUUVTQUZJQUFnQWhBWUVCMGdCVUVBRUJFTUNBdEJBQ0VLQWtBZ0JFRzVBV3NPQXdJR0FBZ0xJQWxCOEFGeFFjQUFSZ1JBSUFWQkN4QVJJQVZCM2dBUUVTQUZJQU5CLy84RGNSQXFJQVZCekFBUUVTQUZJQUFnQWhBWUlnSVFIU0FGUVFRUUVTQUZJQUFnQWhBWUVCME1DQXNDUUNBTUtBSU1RWDlIRFFBZ0JpQUhLQUlFRU9NRVJRMEFJQVVnQmlBSElBaEI1UUJCM2dBZ0NVRUljUnNnQXhEaUJDRUlEQWdMSUFWQitnQVFFU0FGSUFBZ0FoQVlFQjBnQlNBRFFmLy9BM0VRS2d3SEN5QUVRYjBCUmlFS0lBUkJ1UUZyRGdVQUFnSUNBQUlMUWVZQVFkOEFJQUVvQXNnQ0lBTkJBM1JxTFFBQVFRaHhJZ0JCQTNZYklRa2dBRVVnQ2tWeURRSkI1d0JCM3dBZ0FrRUlSaHNoQ1F3Q0N5QUZRUVlRRVF0QjVRQkIzZ0FnQVNnQ3lBSWdBMEVEZEdvdEFBQkJDSEViSVFrTElBVWdDUkFSSUFVZ0EwSC8vd054RUNvTUFnc2dCVUVKRUJFTUFRc0NRQUpBQWtBQ1FBSkFJQVJCdHdGckRnY0NBZ0lFQUFFREJRc0NRQ0FNS0FJTVFYOUhEUUFnQnlnQ0JDQUdhaUlETFFBQlFUMUhEUUFDUUFKQUlBTXRBQUFpQTBFWmF3NEZBUUlDQWdFQUN5QURRYk1CUmcwQUlBTkJGa2NOQVFzZ0FTMEFia0VCY1NJRUJFQWdCVUUyRUJFZ0JTQUFJQUlRR0JBZEN5QUdJQWhxTFFBQVFUeEdCRUFnQlVFNEVCRWdCU0FBSUFJUUdCQWRJQWhCQVdvaENBc2dCaUFIS0FJRUlnZEJCV3NpQ21vaUNTMEFBRUcyQVVjTkJpQUdJQWRxTFFBQUlRTUNRQUpBSUFRRVFFRTdJUXNDUUFKQUFrQUNRQ0FEUVJsckRnVUNBUUVCQXdBTFFSVWhCQ0FEUVJaR0RRUWdBMEd6QVVZTkJRc1FBUUFMUVJnaEJBd0NDMEViSVFRTUFRdEJPU0VMUVJFaEJDQURRUlpIRFFFTElBa2dCRG9BQUNBSFFRUnJJUW9MSUFkQkFtb2hCQ0FHSUFwcUlnTWdDem9BQUNBRElBQWdBaEFZTmdBQklBcEJCV29oQXdOQUlBTWdCRTROQmlBRElBWnFRYk1CT2dBQUlBTkJBV29oQXd3QUN3QUxJQVZCK3dBUUVTQUZJQUFnQWhBWUVCME1CQXNnQlVFR0VCRWdCVUU0RUJFZ0JTQUFJQUlRR0JBZERBTUxJQVVnQkVHQUFYTkIvd0Z4RUJFZ0JTQUFJQUlRR0JBZERBSUxJQVZCT2hBUklBVWdBQ0FDRUJnUUhRd0JDeUFGUVprQkVCRWdCU0FBSUFJUUdCQWRDeUFNS0FJTUlnQkJBRTRFUUNBRlFiWUJFQkVnQlNBQUVCMGdBU2dDcEFJZ0FFRVViR29nQlNnQ0JEWUNDQXNnREVFUWFpUUFJQWdQQzBHaDFRQkJydndBUVozbUFVSDMzUUFRQUFBTDFnSUJCSDhqQUVHZ0FXc2lCU1FBSUFFb0FnQWhCaUFGUVlBQk5nSUlJQVVnQlVFUWFqWUNEQ0FFQkg4Z0JVRWpPZ0FRUVFFRlFRQUxJUVFDZndKQUEwQUNmeUFEUWY4QVRBUkFJQVVvQWd3aUJ5QUVhaUFET2dBQUlBUkJBV29NQVFzZ0JTZ0NEQ0lISUFScUlBTVFvUU1nQkdvTElRUWdCU0FHUVFGcU5nS2NBVUhjQUNFREFrQWdCaTBBQUNJSVFkd0FSZ1JBSUFZdEFBRkI5UUJIRFFFZ0JVR2NBV3BCQVJENUFTRURJQUpCQVRZQ0FBd0JDeUFJSWdQQVFRQk9EUUFnQmtFR0lBVkJuQUZxRUZnaEF3c2dBeERGQVVVTkFTQUZLQUtjQVNFR0lBUWdCU2dDQ0VFR2Ewa05BQ0FBS0FJQUlBVkJER29nQlVFSWFpQUZRUkJxRVBVRVJRMEFDeUFGS0FJTUlRZEJBQXdCQ3lBQUtBSUFJQWNnQkJDRkF3c2hBeUFGUVJCcUlBZEhCRUFnQUNnQ0FDZ0NFQ0lBUVJCcUlBY2dBQ2dDQkJFQUFBc2dBU0FHTmdJQUlBVkJvQUZxSkFBZ0F3dWFCZ0VFZjBFQklRa2dBa0VCZEVIZzl3SnFMd0VBSVFJZ0JVVUVRQ0FBSUFJMkFnQkJBUThMSUFKQjBJSURhaUVHUVJJaEJ3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBVkJBV3NPSWdBQUFBQUFBQUFCQVFJQ0FnSUNCQU1EQXdNREF3VUZCUVVGQlFVRkJnY0lDUWtMQ3lBR0lBRWdBMnNnQld4QkFYUnFJUUZCQUNFQ0EwQWdBaUFGUmdSQUlBVVBDeUFBSUFKQkFuUnFJQUVnQWtFQmRHb3ZBQUFpQXpZQ0FDQUNRUUZxSVFJZ0F3MEFDd3dMQ3lBRlFRZHJJZ2dnQVNBRGEyd2hBaUFFSUFoc1FRRjBJUUZCQUNFSEEwQWdCeUFJUmcwS0lBWWdBa0VCZENJRGFpOEFBQ0FHSUFKQkFuWWdBV3BxTFFBQUlBTkJCbkYyUVJCMFFZQ0FESEZ5SWdORkRRc2dBQ0FIUVFKMGFpQUROZ0lBSUFkQkFXb2hCeUFDUVFGcUlRSU1BQXNBQ3lBR0lBVkJDV3NpQ0NBQklBTnJiR29oQVVFQUlRSURRQ0FDSUFoR0RRa2dBQ0FDUVFKMGFpQUJJQUpxTFFBQUVLc0RJZ00yQWdBZ0FrRUJhaUVDSUFNTkFBc01DUXNnQlVFQmNTQUZRUkJySWdKQkFVdHFJUWdnQWtFQmRrRUNhaUVKQ3lBQklBTnJJUUZCQUNFQ0EwQWdBaUFKUmdSQUlBa1BCU0FBSUFKQkFuUnFJQVlnQWtFQmRHb3ZBQUFnQVVFQUlBSWdDRVliYWpZQ0FDQUNRUUZxSVFJTUFRc0FDd0FMSUFWQkZXc2hCd3NnQnlBQklBTnJiQ0FHYWtFQ2FpRUJJQVl2QUFBaEEwRUFJUUlEUUNBQ0lBZEdCRUFnQnc4RklBQWdBa0VDZEdwQklDQURJQUVnQW1vdEFBQWlCR29nQkVIL0FVWWJOZ0lBSUFKQkFXb2hBZ3dCQ3dBTEFBc2dBQ0FHSUFFZ0EydEJBMnhxSWdFdkFBQWlBallDQUNBQ1JRMERJQUFnQVMwQUFoQ3JBellDQkF3Q0N5QUFJQVl2QUFJMkFnZ2dBQ0FHTHdBQU5nSUFJQUFnQVNBRGEwRUJkQ0FHYWk4QUJEWUNCRUVERHdzZ0FTQURheUVCQW44Z0JVRWhSZ1JBSUFZZ0FVRitjV29pQWtFQmFpRURJQUl0QUFBUXF3TU1BUXNnQmlBQlFRRjJRUU5zYWlJQ1FRSnFJUU1nQWk4QUFBc2hBaUFBUVNCQklFRUJJQUpCa0FoclFTQkpHeUFDUVlBQ1NSc2dBbW9nQWlBQlFRRnhHellDQUNBQUlBTXRBQUFRcXdNMkFnUUxRUUloQ0FzZ0NBOExRUUFMdEFJQkNIOGpBRUhRQUdzaUJ5UUFJQUpCQUNBQ1FRQktHeUVMQTBBQ1FBSkFJQVlnQzBjRVFDQUJJQVpCQW5ScUtBSUFJZ1ZCZ05nQ2F5SUNRYVBYQUUwTkFVR3hCU0VDUVFBaEJBSkFBMEFnQWlBRVNBMEJJQVVnQWlBRWFrRUNiU0lJUVFKMFFaRGlBbW9vQWdBaUNVRU9kaUlLU1FSQUlBaEJBV3NoQWd3QkN5QUZJQWxCQjNaQi93QnhJZ1FnQ21wUEJFQWdDRUVCYWlFRURBRUxDeUFKUVFGeElBTkxEUUFnQnlBRklBZ2dDaUFFSUFsQkFYWkJQM0VRNndRaUFrVU5BQ0FBSUFjZ0FpQURFT3dFREFNTElBQWdCUkFkREFJTElBZEIwQUJxSkFBUEN5QUFJQUpCLy84RGNTSUZRY3dFYmlJRVFZQWljaEFkSUFBZ0JFRzBlMndnQW1wQi8vOERjVUVjYmtIaEltb1FIU0FGUVJ4d0lnSkZEUUFnQUNBQ1FhY2phaEFkQ3lBR1FRRnFJUVlNQUFzQUM5c0dBZ3gvQm40akFFRXdheUlDSkFBQ2ZnSkFBa0FnQVNrREtDSU9Rb0NBZ0lCd2cwS0FnSUNBa0g5UkJFQWdBU2tEQ0NJUVFvQ0FnSUJ3ZzBLQWdJQ0FrSDlSRFFFTElBQkJvdHNBUVFBUUZRd0JDeUFCS1FNZ0lSSWdBU2tER0NFUElBRXBBd0FoRXlBQUlBSkJER3BCQUJBOUdpQUNRUUEyQWlRQ1FDQVBRb0NBZ0lCd2cwS0FnSUNBTUZJRVFDQUFJQUpCSkdvZ0R4RFdBUTBCQ3lBQUlBSkJLR29nRXhEV0FRMEFJQUFnQWtFc2FpQUJLUU1RRUhkQkFFZ05BQ0FRcHlFSUlCSkNnSUNBZ0hDRElSQWdBaWdDTENJTUlBSW9BaWhxSVEwZ0RxY2lCRUVRYWlFSElBUW9BZ1JCLy8vLy93ZHhJUW9nQWlnQ0pDRUxRUUFoQVFOQUFrQUNRQUpBSUFSQkpDQUJFTWNCSWdaQkFFZ05BQ0FHUVFGcUlnTWdDazhOQUNBQ1FReHFJQVFnQVNBR0VGRWFJQVpCQW1vaEFRSkFBa0FDUUFKQUFuOGdCQ2tDQkVLQWdJQ0FDSU5RSWdsRkJFQWdCeUFEUVFGMGFpOEJBQXdCQ3lBRElBZHFMUUFBQ3lJRFFTUnJEZ1FBQXdVQkFnc2dBa0VNYWtFa0VEc2FEQVlMSUFKQkRHb2dDQ0FOSUFnb0FnUkIvLy8vL3dkeEVGRWFEQVVMSUFOQjRBQkdEUU1MQWtBZ0EwRXdheUlGUVFsTkJFQUNRQ0FCSUFwUERRQUNmeUFKUlFSQUlBY2dBVUVCZEdvdkFRQU1BUXNnQVNBSGFpMEFBQXNpQTBFd2EwRUpTdzBBSUFaQkEyb2dBU0FESUFWQkNteHFJZ0ZCTUVzZ0FVRXdheUlESUF0SmNTSUpHeUVCSUFNZ0JTQUpHeUVGQ3lBRlJTQUZJQXRQY2cwQklBQWdEeUFGclJCeklnNUNnSUNBZ0hDREloRkNnSUNBZ0RCUkRRVWdFVUtBZ0lDQTRBQlJEUVlnQWtFTWFpQU9FSDlGRFFVTUJnc2dBMEU4UnlBUVFvQ0FnSUF3VVhJTkFDQUVRVDRnQVJESEFTSURRUUJJRFFBZ0FDQUVJQUVnQXhDRUFTSU9Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRVWdBQ0FTSUE0UVRTSU9Rb0NBZ0lCd2d5SVJRb0NBZ0lBd1VnUkFJQkZDZ0lDQWdPQUFVUTBHSUFKQkRHb2dEaEIvRFFZTElBTkJBV29oQVF3RUN5QUNRUXhxSUFRZ0JpQUJFRkVhREFNTElBSkJER29pQUNBRUlBRWdCQ2dDQkVILy8vLy9CM0VRVVJvZ0FCQTJEQVVMSUFKQkRHb2dFeENIQVVVTkFRd0NDeUFDUVF4cUlBaEJBQ0FNRUZFYURBQUxBQXNnQWlnQ0RDZ0NFQ0lBUVJCcUlBSW9BaEFnQUNnQ0JCRUFBQXRDZ0lDQWdPQUFDeUVQSUFKQk1Hb2tBQ0FQQzI4QkEzOERRQ0FBS0FJb0lnRkJBRXhGQkVBZ0FDQUJRUUZySWdFMkFpZ2dBQ2dDQUNBQUtBSUVJQUZCQTNScUtRTUFFQThNQVFzTElBQW9BZ1FpQVNBQVFRaHFJZ0pIQkVBZ0FDZ0NBQ2dDRUNJRFFSQnFJQUVnQXlnQ0JCRUFBQXNnQUVFRU5nSXNJQUFnQWpZQ0JBdEVBQ0FBUVJCcUlBRWdBblFnQW10QkVXb2dBQ2dDQUJFREFDSUFCRUFnQUVFQU5nSU1JQUJCQVRZQ0FDQUFJQUZCLy8vLy93ZHhJQUpCSDNSeXJUY0NCQXNnQUF1cEFnRUVmeU1BUVVCcUlnY2tBQ0FISUFFdEFBQWlDRUVCZGtFQmNUWUNKQ0FISUFoQkFuWkJBWEUyQWlBZ0J5QUlRUVIyUVFGeElnZzJBaWdnQnlBQkxRQUJJZ2syQWhnZ0FTMEFBaUVLSUFkQkFEWUNQQ0FISUFZMkFpd2dCeUFGUVFJZ0JTQUlHeUFGUVFGSEd6WUNGQ0FISUFJZ0JDQUZkR28yQWhBZ0J5QUNOZ0lNSUFjZ0NqWUNIQ0FIUWdBM0FqUWdCeUFLUVFKMElnWWdDVUVEZEdwQkVHbzJBakFnQ1VFQmRDRUVRUUFoQ0FOQUlBUWdDRVpGQkVBZ0FDQUlRUUowYWtFQU5nSUFJQWhCQVdvaENBd0JDd3NnQnlBR1FROXFRZkFQY1dzaUJDUUFJQWRCREdvZ0FDQUVRUUFnQVVFSGFpQUNJQU1nQlhScVFRQVFwUVloQVNBSEtBSXNLQUlRSWdCQkVHb2dCeWdDTkVFQUlBQW9BZ2dSQVFBYUlBZEJRR3NrQUNBQkMvd0dBZ2gvQTM0akFFRVFheUlHSkFBQ1FBSkFJQUFnQVJEd0FpSUNSUTBBSUFBZ0F5a0RBQkFvSWc1Q2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBT0lRRU1BZ3NDUUNBQUlBRkIxUUFnQVVFQUVCUWlERUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQmtFSWFpQU1FS01CRFFBZ0FpZ0NCQ0lGTFFBUVFTRnhJZ05GQkVBZ0JrSUFOd01JQ3dKQUlBVXRBQkVpQ1VVRVFFRUFJUUlNQVFzZ0FDQUpRUU4wRUNraUFrVU5BUXNDUUFKK0FrQUNRQUpBQWtBQ1FBSkFBa0FnQmlrRENDSU1JQTZuSWdvcEFnUWlEVUwvLy8vL0I0TlZEUUFnQWlBRlFSQnFJQXBCRUdvaUJ5QU1weUFOcHlJRVFmLy8vLzhIY1NBRVFSOTJJZ2dnQUJEd0JDSUVRUUZHRFFNZ0JFRUFTQTBCSUFNTkFDQUVRUUpIRFFJTElBQWdBVUhWQUVJQUVFVkJBRTROQVF3RkN5QUFRWXZMQUVFQUVFWU1CQXNnQUNBT0VBOUNnSUNBZ0NBaEFRd0JDeUFEQkVBZ0FDQUJRZFVBSUFJb0FnUWdCMnNnQ0hXdEVFVkJBRWdOQXd0Q2dJQ0FnREFoRFVLQWdJQ0E0QUFnQUJBK0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF4cEJBQ0VEUVFBaEJDQUZMQUFRUVFCSUJFQWdCU2dBRXlFRUlBQkNnSUNBZ0NBUVJ5SU5Rb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQkNnSUNBZ09BQUlRME1Bd3NnQkNBRmFrRVhhaUVFQ3dOQUlBTWdDVWNFUUVLQWdJQ0FNQ0VNQWtBZ0FpQURRUU4wYWlnQ0FDSUZSUTBBSUFJZ0EwRURkRUVFY21vb0FnQWlDMFVOQUNBQUlBb2dCU0FIYXlBSWRTQUxJQWRySUFoMUVJUUJJZ3hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQXNnQkVVZ0EwVnlSUVJBQWtBZ0JDMEFBRVVOQUNBTVFpQ0lwMEYxVHdSQUlBeW5JZ1VnQlNnQ0FFRUJhallDQUFzZ0FDQU5JQVFnREVHSGdBRVE3d0ZCQUU0TkFDQUFJQXdRRHd3RkN5QUVFRDhnQkdwQkFXb2hCQXNnQUNBQklBTWdERUdIZ0FFUXJ3RWhCU0FEUVFGcUlRTWdCVUVBVGcwQkRBTUxDeUFBSUFGQmh3RWdEVUdIZ0FFUUdVRUFTQTBCSUFBZ0FVSFhBQ0FDS0FJQUlBZHJJQWgxclVHSGdBRVFHVUVBU0EwQklBRWhEQ0FBSUFGQjJBQWdEa0dIZ0FFUUdVRUFTQTBFQ3lBQUtBSVFJZ0JCRUdvZ0FpQUFLQUlFRVFBQURBWUxJQUVNQVF0Q2dJQ0FnREFoRFVLQWdJQ0FJQXNoRENBQUlBMFFEeUFBSUE0UUR3c2dBQ0FNRUE4Z0FDZ0NFQ0lBUVJCcUlBSWdBQ2dDQkJFQUFBd0JDeUFBSUE0UUR3dENnSUNBZ09BQUlRRUxJQVpCRUdva0FDQUJDL1VCQVFoL1FYOGhBaUFCSUFGQkFXdHhSUVJBSUFCQkVHb2lDQ0FCUVFKMElnTWdBQ2dDQUJFREFDSUZCSDhnQlVFQUlBTVFLeUVHSUFGQi8vLy8vd05xUWYvLy8vOERjU0VKSUFBb0FqUWhCd05BSUFRZ0FDZ0NKRTlGQkVBZ0J5QUVRUUowYWlnQ0FDRUNBMEFnQWdSQUlBQW9BamdnQWtFQ2RHb29BZ0FpQXlnQ0RDRUZJQU1nQmlBSklBTW9BZ2h4UVFKMGFpSURLQUlBTmdJTUlBTWdBallDQUNBRklRSU1BUXNMSUFSQkFXb2hCQXdCQ3dzZ0NDQUhJQUFvQWdRUkFBQWdBQ0FCUVFGME5nSXdJQUFnQVRZQ0pDQUFJQVkyQWpSQkFBVkJmd3NQQzBIdWp3RkJydndBUVlBVVFjM1pBQkFBQUFzWUFDQUFLQUlRSWdCQkVHb2dBU0FDSUFBb0FnZ1JBUUFMRXdBZ0FFRVFhaUFCSUFJZ0FDZ0NDQkVCQUF0dUFRUi9RWDhoQmtGL0lBSW9BZ0FpQkVFQmRpQUVhaUFFUWFuVnF0VjZTeHNoQlFKQUFrQWdBeUFCS0FJQUlnZEdCRUFnQUNBRkVDa2lBRVVOQWlBQUlBTWdCQkFmR2d3QkN5QUFJQWNnQlJDSkFpSUFSUTBCQ3lBQklBQTJBZ0FnQWlBRk5nSUFRUUFoQmdzZ0JndU5Bd0VEZnlNQVFVQnFJZ0lrQUFKQUlBQWdBUkJaSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUFKQUlBQWdBa0VrYWlBQnB5SUVLQUlFUWYvLy8vOEhjVUVDYWhBOURRQWdBa0VrYWtFaUVEc05BQ0FDUVFBMkFqd0RRQ0FFS0FJRVFmLy8vLzhIY1NBRFNnUkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQkNBQ1FUeHFFTWtCSWdOQkNHc09CZ1VDQkFFR0F3QUxJQU5CSWtZZ0EwSGNBRVp5RFFZTElBTkJnUEQvQUhGQmdMQURSeUFEUVNCUGNRMEdJQUlnQXpZQ0FDQUNRUkJxSWdOQkVFR0JJU0FDRUU0YUlBSkJKR29nQXhDSUFRMEtEQWNMUWZRQUlRTU1CQXRCOGdBaEF3d0RDMEh1QUNFRERBSUxRZUlBSVFNTUFRdEI1Z0FoQXdzZ0FrRWtha0hjQUJBN0RRUWdBa0VrYWlBREVEdEZEUUVNQkFzZ0FrRWthaUFERUxrQkRRTUxJQUlvQWp3aEF3d0JDd3NnQWtFa2FrRWlFRHNOQUNBQUlBRVFEeUFDUVNScUVEWWhBUXdCQ3lBQUlBRVFEeUFDS0FJa0tBSVFJZ0JCRUdvZ0FpZ0NLQ0FBS0FJRUVRQUFRb0NBZ0lEZ0FDRUJDeUFDUVVCckpBQWdBUXVLQXdJRGZnSi9Jd0JCRUdzaUFpUUFRb0NBZ0lBd0lRWUNRQUpBSUFBZ0FrRUlhaUFBSUFFUUpTSUJFRHdOQUFKQUlBSXBBd2dpQjBJQVZ3UkFEQUVMSUFkQ0FYMGhCUUpBQWtBQ1FBSkFJQUVnQWtFRWFpQUNFSW9DUlEwQUlBY2dBaWdDQUNJSXJWSU5BQ0FCcHlFSklBSW9BZ1FoQXlBRVJRMEJJQU1wQXdBaEJpQURJQU5CQ0dvZ0NFRURkRUVJYXhDY0FRd0NDd0pBSUFRRVFDQUFJQUZDQUJCTklnWkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkJpQUFJQUZDQUVJQklBVkJBUkQwQWtVTkFRd0dDeUFBSUFFZ0JSQnpJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CUXNnQUNBQklBVVErZ0ZCQUU0TkFnd0VDeUFJUVFOMElBTnFRUWhyS1FNQUlRWUxJQWtnQ1NnQ0tFRUJhellDS0FzZ0IwS0JnSUNBQ0ZRTkFFS0FnSUNBd0g0Z0JibTlJZ1ZDZ0lDQWdNQ0JnUHovQUgwZ0JVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzaEJRc2dBQ0FCUVRBZ0JSQkZRUUJPRFFFTElBQWdCaEFQUW9DQWdJRGdBQ0VHQ3lBQUlBRVFEeUFDUVJCcUpBQWdCZ3ZrQlFJR2ZnUi9Jd0JCRUdzaURDUUFBbjRDUUFKQUFrQWdBQ0FCRUNVaUJrS0FnSUNBY0ZRTkFDQUdweUlMTHdFR1FRSkhEUUFnQ3kwQUJVRUpjVUVKUncwQUlBc29BaEF0QUROQkNIRkZEUUFnQ3lnQ0ZDa0RBQ0lCUXYvLy8vOFBWZzBBSUF3Z0FjUWlCemNEQ0NBSElBczFBaWhTRFFBZ0J5QUNySHdpQlVMLy8vLy9CMVVOQUNBTE5RSWdJQVZUQkVBZ0FDQUxJQVduRUt3RkRRTUxBbjhnQkVVZ0FrRUFUSEpGQkVBZ0N5Z0NKQ0lFSUFKQkEzUnFJQVFnQWFkQkEzUVFuQUZCQUF3QkN5QUJwd3NoRFVFQUlRUWdBa0VBSUFKQkFFb2JJUUlEUUNBQ0lBUkhCRUFnQXlBRVFRTjBhaWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZzRnRGlnQ0FFRUJhallDQUFzZ0N5Z0NKQ0FFSUExcVFRTjBhaUFCTndNQUlBUkJBV29oQkF3QkN3c2dDeUFGUGdJb0lBc29BaFFnQlVMLy8vLy9ENE0zQXdBZ0JVS0FnSUNBQ0h3aEFRd0JDeUFBSUF4QkNHb2dCaEE4RFFFZ0RDa0RDQ0lCSUFLc0lnaDhJZ1ZDZ0lDQWdJQ0FnQkJaQkVBZ0FFSFEyZ0JCQUJBVkRBSUxBa0FnQkVVZ0FrRUFUSEpGQkVCQ0FDRUhJQUFnQmlBSVFnQWdBVUYvRVBRQ0RRTU1BUXNnQVNFSEN5QUNRUUFnQWtFQVNodXRJUWxDQUNFQkEwQWdBU0FKVWdSQUlBTWdBYWRCQTNScUtRTUFJZ2hDSUlpblFYVlBCRUFnQ0tjaUFpQUNLQUlBUVFGcU5nSUFDeUFCSUFkOElRb2dBVUlCZkNFQklBQWdCaUFLSUFnUWhnRkJBRTROQVF3REN3c2dBQ0FHUVRBZ0JVS0FnSUNBQ0h3aUFVTC8vLy8vRDFnRWZpQUZRdi8vLy84UGd3VkNnSUNBZ01CK0lBVzV2U0lIUW9DQWdJREFnWUQ4L3dCOUlBZEMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkZRUUJJRFFFTElBQWdCaEFQSUFWQy8vLy8vdytESUFGQy8vLy8vdzlZRFFFYVFvQ0FnSURBZmlBRnViMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3d3QkN5QUFJQVlRRDBLQWdJQ0E0QUFMSVFFZ0RFRVFhaVFBSUFFTDBnTUNCMzhEZmlNQVFTQnJJZ1FrQUNBRVFRQTJBZ3dnQkVFQU5nSUlBa0FDUUNBRUlBQW9BaEFvQW5oSkJFQWdBQkRwQVF3QkN5QUFJQUVnQWlBQlFRQVFGQ0lMUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQ3lFQkRBSUxBa0FDUUNBTFFvQ0FnSUJ3VkEwQUlBQWdDeERLQVNJS1FRQklEUUVDUUNBS0JFQWdBQ0FFUVF4cUlBc1ExZ0ZGRFFFTUF3c2dBQ0FFUVFocUlBUkJER29nQzZkQkVSQ09BU0VKSUFRb0FnZ2hCU0FKUVFCSURRSUxJQVFvQWd3aENBTkFJQWNnQ0VZTkFRSkFJQW9FUUNBQUlBY1FxUVVpQmtVTkJBd0JDeUFBSUFVZ0IwRURkR29vQWdRUUdDRUdDd0ovQWtBZ0FDQUxJQVlnQXhENUJDSU5Rb0NBZ0lCd2d5SU1Rb0NBZ0lBd1VnUkFJQXhDZ0lDQWdPQUFVZzBCSUFBZ0JoQVREQVVMSUFBZ0N5QUdRUUFRMVFFTUFRc2dBQ0FMSUFZZ0RVRUhFQmtMSVFrZ0FDQUdFQk1nQjBFQmFpRUhJQWxCQUU0TkFBc01BUXNnQUNBRklBZ1FXa0VBSVFVZ0FDQUNFRndpREVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFRZ0N6Y0RHQ0FFSUF3M0F4QWdBQ0FESUFGQkFpQUVRUkJxRUNFaEFTQUFJQXdRRHlBQUlBc1FEd3dDQ3lBQUlBVWdCQ2dDREJCYUlBQWdDeEFQQzBLQWdJQ0E0QUFoQVFzZ0JFRWdhaVFBSUFFTFB3RUJmeUFCUVFBZ0FVRUFTaHNoQVFOQUFrQWdBU0FEUmdSQVFYOGhBd3dCQ3lBQUlBTkJBM1JxS0FJRUlBSkdEUUFnQTBFQmFpRUREQUVMQ3lBREMvOEVBZ0ovQkg0Q1FDQUNRdi8vLy85dldBUkFJQUFRSkF3QkN3SkFJQUFnQWtFOUVIRUVmMEtBZ0lDQU1DRUZRb0NBZ0lBd0lRWkNnSUNBZ0RBaENDQUFJQUpCUFNBQ1FRQVFGQ0lIUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUZCZ1FKQmdBSWdBQ0FIRUNZYkJVRUFDeUVESUFBZ0FrRStFSEVFUUVLQWdJQ0FNQ0VGUW9DQWdJQXdJUVpDZ0lDQWdEQWhDQ0FBSUFKQlBpQUNRUUFRRkNJSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFGQmdnUkJnQVFnQUNBSEVDWWJJQU55SVFNTElBQWdBa0UvRUhFRVFFS0FnSUNBTUNFRlFvQ0FnSUF3SVFaQ2dJQ0FnREFoQ0NBQUlBSkJQeUFDUVFBUUZDSUhRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRkJoQWhCZ0FnZ0FDQUhFQ1liSUFOeUlRTUxRb0NBZ0lBd0lRWUNRQ0FBSUFKQndBQVFjVVVFUUVLQWdJQ0FNQ0VJREFFTFFvQ0FnSUF3SVFVZ0FDQUNRY0FBSUFKQkFCQVVJZ2hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQXdDQ3lBRFFZREFBSEloQXdzQ1FBSkFJQUFnQWtIQkFCQnhSUTBBUW9DQWdJQXdJUVVnQTBHQUVISWhBeUFBSUFKQndRQWdBa0VBRUJRaUJrS0FnSUNBY0lNaUIwS0FnSUNBTUZFTkFFSER3Z0FoQkNBSFFvQ0FnSURnQUZFTkFTQUFJQVlRT0VVTkFRc0NRQ0FBSUFKQndnQVFjVVVFUUVLQWdJQ0FNQ0VGREFFTElBTkJnQ0J5SVFNZ0FDQUNRY0lBSUFKQkFCQVVJZ1ZDZ0lDQWdIQ0RJZ0pDZ0lDQWdEQlJEUUJCdE1JQUlRUWdBa0tBZ0lDQTRBQlJEUUVnQUNBRkVEaEZEUUVMSUFOQmdEQnhCRUJCc2VrQUlRUWdBMEdBeEFCeERRRUxJQUVnQlRjREdDQUJJQVkzQXhBZ0FTQUlOd01JSUFFZ0F6WUNBRUVBRHdzZ0FDQUVRUUFRRlFzZ0FDQUlFQThnQUNBR0VBOGdBQ0FGRUE4TFFYOEx3Z0VCQW44Z0FpZ0NCRVVFUUNBQ0tBSVlJZ01nQWlnQ0hDSUVOZ0lFSUFRZ0F6WUNBQ0FDUWdBM0FoZ0NRQ0FCS0FJQUJFQWdBaENmQlF3QkN5QUFJQUlwQXlBUUl3c2dBQ0FDS1FNb0VDTWdBaUFDS0FJQVFRRnJJZ00yQWdBQ1FDQURSUVJBSUFJb0FoQWlBeUFDS0FJVUlnUTJBZ1FnQkNBRE5nSUFJQUpDQURjQ0VDQUFRUkJxSUFJZ0FDZ0NCQkVBQUF3QkN5QUNRb0NBZ0lBd053TW9JQUpDZ0lDQWdEQTNBeUFnQWtFQk5nSUVDeUFCSUFFb0FneEJBV3MyQWd3TEM1VUJBUU4rSUFHOUlnSkMvLy8vLy8vLy8vLy9BSU1oQXlBQXZTSUVRdi8vLy8vLy8vLy8vd0NEUW9HQWdJQ0FnSUQ0L3dCYUJFQWdBMEtCZ0lDQWdJQ0ErUDhBVkE4TEFuOUJmeUFEUW9DQWdJQ0FnSUQ0L3dCV0lBQWdBV055RFFBYVFRRWdBQ0FCWkEwQUdrRUFJQUJFQUFBQUFBQUFBQUJpRFFBYUlBUkNBRk1FUUNBQ1FqK0hwMEYvY3c4TElBSkNQNGluQ3dzd0FDQUJRb0NBZ0lBUWhFS0FnSUNBY0lOQ2dJQ0FnREJSQkVBZ0FDQUJFRGNQQ3lBQUlBRkJPRUVBUVFBUXJRSUxLUUVCZnlBQ1FpQ0lwMEYxVHdSQUlBS25JZ01nQXlnQ0FFRUJhallDQUFzZ0FDQUJJQUlReFFVTFVnSUJmd0YrUW9DQWdJRGdBQ0VFSUFBZ0FTQUNFSk1CSWdNRWZpQURLQUlnSWdNb0Fnd29BaUF0QUFRRVFDQUNSUVJBUWdBUEN5QUFFR3RDZ0lDQWdPQUFEd3NnQXpVQ0VBVkNnSUNBZ09BQUN3czRBQ0FBSUFFZ0FoQ1RBU0lBUlFSQVFvQ0FnSURnQUE4TElBQW9BaUFvQWd3aUFDQUFLQUlBUVFGcU5nSUFJQUN0UW9DQWdJQndoQXRSQWdGK0FYOGdBQ0FBS1FPUUFVRURFRWtpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBSkJOQ0FCUVFNUUdSb0xJQUlMbFFFQkEzOGpBRUVRYXlJRUpBQWdCQ0FDTndNSUlBRW9BZ0FpQlNBQktBSUVJZ1kyQWdRZ0JpQUZOZ0lBSUFGQ0FEY0NBQ0FBSUFBZ0FVRWdhaUFEUVFOMGFpa0RBRUtBZ0lDQU1FRUJJQVJCQ0dvUUlSQVBJQUFnQVNrREVCQVBJQUFnQVNrREdCQVBJQUFnQVNrRElCQVBJQUFnQVNrREtCQVBJQUFvQWhBaUFFRVFhaUFCSUFBb0FnUVJBQUFnQkVFUWFpUUFDNDBCQVFOL0l3QkJFR3NpQkNRQUlBUWdBVGNEQ0NBRFFRRjBJUVpCQUNFREEwQUNRQUpBSUFOQkFrWU5BQ0FBUWN3QVFRRWdBeUFHYWtFQklBUkJDR29RendFaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQlFYOGhCU0FEUVFGSERRQWdBQ0FDS1FNQUVBOExJQVJCRUdva0FDQUZEd3NnQWlBRFFRTjBhaUFCTndNQUlBTkJBV29oQXd3QUN3QUx5QVlDQm44Q2ZpTUFRVEJySWdNa0FDQUJRUWhxSVFVZ0FVSElBR29oQmdKQUFrQUNRQUpBQTBBZ0FTZ0NUQ0lDSUFaR0RRUUNRQUpBQW44Q1FBSkFBa0FDUUNBQktBSUVJZ1FPQmdBQ0FnVUxBUVlMSUFJb0FnaEZEUUlnQUNBQkVPQUREQVlMQWtBQ1FDQUNLQUlJRGdJSUFBRUxJQUZCQkRZQ0JDQURJQUlwQXhBM0F5Z2dBQ0FBS1FOUUlBRWdBMEVvYWtFQUVQNEJJZ2hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5DaUFBSUFFMUFnQkNnSUNBZ0hDRUlBTkJBUkNFQlVVRVFDQURRb0NBZ0lBd053TVlJQU5DZ0lDQWdEQTNBeEFnQUNBSUlBTWdBMEVRYWhDdkFob2dBQ0FES1FNQUVBOGdBQ0FES1FNSUVBOExJQUFnQ0JBUERBb0xJQUFnQWlBQ0tRTVFFTjhEREFrTElBSXBBeEFpQ0VJZ2lLZEJkVThFUUNBSXB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFSQkFVY2dBaWdDQ0NJRVFRSkhja1VFUUNBQUlBZ1FpZ0ZCQVF3Q0N5QUJLQUpFSWdJZ0JLMDNBd0FnQWtFSWF5QUlOd01BSUFFZ0FrRUlhallDUkF0QkFBc2hBaUFCUVFNMkFnUWdBU0FDTmdJVUN5QUFJQVVRdEFJaUNVS0FnSUNBY0lNaUNFS0FnSUNBNEFCUkJFQWdBQ2dDRUNJQ0tRT0FBU0VJSUFKQ2dJQ0FnQ0EzQTRBQklBQWdBUkRnQXlBQUlBRW9Ba3dnQ0JEZkF5QUFJQWdRRHd3Q0N5QUpRdi8vLy84UFdBUkFJQUVvQWtSQkNHc2lBaWtEQUNFSUlBSkNnSUNBZ0RBM0F3QUNRQUpBSUFtbklnSU9Bd0VBQUFNTElBRWdBallDQkNBQUlBRWdDRUVBRVBvQ0lBQWdDQkFQREFNTElBTWdDRGNES0NBQUlBQXBBMUFnQVNBRFFTaHFRUUFRL2dFaUNVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRklBQWdBVFVDQUVLQWdJQ0FjSVFnQTBFUWFrRUFFSVFGQkVBZ0FDQUpFQThNQmdzZ0EwS0FnSUNBTURjRENDQURRb0NBZ0lBd053TUFJQUFnQ1NBRFFSQnFJQU1RcndJYUlBQWdDUkFQUVFBaEFRTkFJQUZCQWtZTkJpQUFJQU5CRUdvZ0FVRURkR29wQXdBUUR5QUJRUUZxSVFFTUFBc0FDeUFJUW9DQWdJQXdVZzBESUFFb0FrUkJDR3NpQWlrREFDRUlJQUpDZ0lDQWdEQTNBd0FnQUNBQkVPQURJQUFnQVNBSVFRRVErZ0lnQUNBSUVBOE1BUXNMRUFFQUN5QUFJQUZDZ0lDQWdEQkJBUkQ2QWd3Q0MwSFprUUZCcnZ3QVFiV1pBVUhiSlJBQUFBc2dBQ0FJRUE4TElBTkJNR29rQUF1bEF3SUVmd0YrSXdCQkVHc2lCaVFBQWtBQ1FBSkFBa0FnQWtFQVNBUkFJQVlnQWtILy8vLy9CM0UyQWdBZ0FVSEFBRUhjSWlBR0VFNGFEQUVMSUFBb0Fpd2dBazBOQWlBQ1JRUkFJQUZCOW9nQktBQUFOZ0FESUFGQjg0Z0JLQUFBTmdBQURBRUxJQUFvQWpnZ0FrRUNkR29vQWdBaUJFRUJjUTBESUFFaEFnSkFJQVJGRFFBZ0JDa0NCQ0lIUW9DQWdJQUlnMUFFUUNBRVFSQnFJUU1nQjZkQi8vLy8vd2R4SVFWQkFDRUNRUUFoQUFOQUlBSWdCVVpGQkVBZ0FDQUNJQU5xTFFBQWNpRUFJQUpCQVdvaEFnd0JDd3NnQUVHQUFVZ05Bd3NnQkVFUWFpRUZRUUFoQUNBQklRSURRQ0FBSUFlblFmLy8vLzhIY1U4TkFRSi9JQWRDZ0lDQWdBaURVRVVFUUNBRklBQkJBWFJxTHdFQURBRUxJQUFnQldvdEFBQUxJUU1nQWlBQmEwRTVTZzBCQW44Z0EwSC9BRTBFUUNBQ0lBTTZBQUFnQWtFQmFnd0JDeUFDSUFNUW9RTWdBbW9MSVFJZ0FFRUJhaUVBSUFRcEFnUWhCd3dBQ3dBTElBSkJBRG9BQUFzZ0FTRURDeUFHUVJCcUpBQWdBdzhMUWUvZkFFR3UvQUJCM3hkQm9ZRUJFQUFBQzBHUGtnRkJydndBUWVrWFFhR0JBUkFBQUF1SEFRRUVmeUFBUVJCcUlRTWdBVUhJQUdvaEJDQUJLQUpNSVFJRFFDQUNJQVJHUlFSQUlBSW9BZ1FoQlNBQUlBSXBBeEFRSXlBQUlBSXBBeGdRSXlBQUlBSXBBeUFRSXlBQUlBSXBBeWdRSXlBRElBSWdBQ2dDQkJFQUFDQUZJUUlNQVFzTElBRW9BZ1JCZm5GQkJFY0VRQ0FBSUFGQkNHb1EvZ0lMSUFNZ0FTQUFLQUlFRVFBQUMyQUJBbjhnQVNBQktBSUFRUUZySWdJMkFnQWdBa1VFUUNBQUlBRVEzUU1nQUNBQktRTVFFQ01nQUNBQktRTVlFQ01nQVNnQ0NDSUNJQUVvQWd3aUF6WUNCQ0FESUFJMkFnQWdBVUlBTndJSUlBQkJFR29nQVNBQUtBSUVFUUFBQ3d2ekF3SURmd0orSXdCQk1Hc2lBaVFBQWtBQ1FDQUFJQUZCS0dvUXRBSWlCVUtBZ0lDQWNJTWlCa0tBZ0lDQTRBQlJEUUFnQWlBQktBSmtRUWhySWdNcEF3QTNBeUFnQTBLQWdJQ0FNRGNEQUNBR1FvQ0FnSUF3VVFSQUlBQWdBQ0FCS1FNUVFvQ0FnSUF3UVFFZ0FrRWdhaEFoRUE4Z0FDQUNLUU1nRUE4Z0FDZ0NFQ0FCRU4wRERBSUxJQUFnQlJBUFFRQWhBeUFBSUFBcEExQWdBQ0FDUVNCcVFRQVEvZ0VoQlNBQUlBSXBBeUFRRHlBRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBRFFBSkFJQU5CQWtjRVFDQUNRUkJxSUFOQkEzUnFJQUFnQUNrRE1DQURRVFZxRUVraUJqY0RBQ0FHUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVnQTBFQlJnUkFJQUFnQWlrREVCQVBDeUFBSUFVUUR3d0RDeUFDUW9DQWdJQXdOd01JSUFKQ2dJQ0FnREEzQXdBZ0FDQUZJQUpCRUdvZ0FoQ3ZBaUVFSUFBZ0JSQVBRUUFoQXdOQUlBTkJBa1pGQkVBZ0FDQUNRUkJxSUFOQkEzUnFLUU1BRUE4Z0EwRUJhaUVEREFFTEN5QUVEUUlNQXdzZ0FTQUJLQUlBUVFGcU5nSUFJQWFuSUFFMkFpQWdBMEVCYWlFRERBQUxBQXNnQUNnQ0VDSURLUU9BQVNFRklBTkNnSUNBZ0NBM0E0QUJJQUlnQlRjREtDQUFJQUVwQXhoQ2dJQ0FnREJCQVNBQ1FTaHFFQ0VoQlNBQUlBSXBBeWdRRHlBQUtBSVFJQUVRM1FNZ0FDQUZFQThMSUFKQk1Hb2tBQXVmQXdJSGZ3RitJd0JCTUdzaUJpUUFBa0FnQVVLQWdJQ0FjRlFOQUNBQnB5SUVMd0VHUVRGSERRQWdCQ2dDSUNJRlJRMEFJQVVvQWdBTkFDQUNRaUNJcDBGMVR3UkFJQUtuSWdRZ0JDZ0NBRUVCYWpZQ0FBc2dBQ0FGUVJocUlBSVFJQ0FGSUFOQkFXb2lCRFlDQUFKQUlBUkJBa2NOQUNBRktBSVVEUUFnQUNnQ0VDSUVLQUtZQVNJSFJRMEFJQUFnQVNBQ1FRQWdCQ2dDbkFFZ0J4RTRBQXNnQTBFQVI2MUNnSUNBZ0JDRUlRRWdCU0FEUVFOMGFpSUVRUVJxSVFnZ0JDZ0NDQ0VFQTBBZ0JDQUlSa1VFUUNBRUtBSUVJUWNnQmlBRUtRTUlOd01BSUFZZ0JDa0RFRGNEQ0NBRUtRTVlJUXNnQmlBQ053TWdJQVlnQVRjREdDQUdJQXMzQXhBZ0FFSExBRUVGSUFZUW1nTWdCQ2dDQUNJSklBUW9BZ1FpQ2pZQ0JDQUtJQWsyQWdBZ0JFSUFOd0lBSUFBb0FoQWdCQkN1QWlBSElRUU1BUXNMSUFWQkFTQURhMEVEZEdvaUEwRUVhaUVISUFNb0FnZ2hCQU5BSUFRZ0IwWU5BU0FFS0FJQUlnVWdCQ2dDQkNJRE5nSUVJQU1nQlRZQ0FDQUVRZ0EzQWdBZ0FDZ0NFQ0FFRUs0Q0lBTWhCQXdBQ3dBTElBWkJNR29rQUF1b0FnSUVmd0Y4SXdCQkVHc2lCU1FBQTBBQ1FFRi9JUVFDUUFKQUFrQUNRRUVISUFKQ0lJaW5JZ1lnQmtFSGEwRnVTUnRCQ1dvT0VRSURBd01EQXdNREF3QUFBQUFEQXdRQkF3c2dBcWNoQTBFQUlRUU1Bd3RCQUNFRUlBSkNnSUNBZ01DQmdQei9BSHdpQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWZ1JBREFNTFFZQ0FnSUI0SVFNZ0FyOGlCMFFBQUFBQUFBRGd3V01OQWtILy8vLy9CeUVESUFkRUFBREEvLy8vMzBGa0RRSWdCNWxFQUFBQUFBQUE0RUZqQkVBZ0I2b2hBd3dEQzBHQWdJQ0FlQ0VEREFJTFFRQWhCQ0FGUVF4cUlBS25RUVJxUVFBUXFRRWdBQ0FDRUE4Z0JTZ0NEQ0VEREFFTElBQWdBaENOQVNJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTEN5QUJJQU0yQWdBZ0JVRVFhaVFBSUFRTHNRWUJEWDhqQUVId0FHc2lCeVFBQWtBQ1FBSi9JQUlnQWtFQmF5SUZjVVVFUUNBQktBSU1RUVYwSUFFb0FnaEJJQ0FGWjJzaUNXOGlCV3NnQ1VFQUlBVkJBRW9iYWlFTklBbEJJQ0FKUWY4QmNXNGlER3doRGlBQkRBRUxJQUlRbHdVaENDQUJLQUlBSVFVZ0IwSUFOd0lZSUFkQ2dJQ0FnSUNBZ0lDQWZ6Y0NFQ0FISUFVMkFnd2dCMEVNYWlBRElBSkIzcWdFYWkwQUFDSU1ha0VCYXlBTWJpSU5FRUVOQVVFQUlRVWdCeWdDRENJTEtBSUFRUUJCQkVIRUFDQUhLQUlZSWdsQkFXdG5RUUYwYXlBSlFRSkpHeUlLUVJSc0lBc29BZ1FSQVFBaUJrVU5BUU5BSUFVZ0NrWkZCRUFnQnlnQ0RDRVFJQVlnQlVFVWJHb2lEa0lBTndJTUlBNUNnSUNBZ0lDQWdJQ0FmemNDQkNBT0lCQTJBZ0FnQlVFQmFpRUZEQUVMQzBFQUlRVWdCaUFIS0FJY0lBRWdDVUVBSUFrZ0NFRWdJQWhCQVd0bmEwRUFJQWhCQWs4YkVLRUVJUWdEUUNBRklBcEdSUVJBSUFZZ0JVRVViR29RR3lBRlFRRnFJUVVNQVFzTFFRQWhDU0FMS0FJQUlBWkJBQ0FMS0FJRUVRRUFHaUFJRFFFZ0RDQU5iQ0FEYXlFTFFRRWhEaUFIUVF4cUN5RUlRWDhnQ1hSQmYzTWhFRUVBSVFvZ0FrRUtSeUVSSUF3aEJRTkFJQU1nQ2swTkFpQUZJQXhHQkVBZ0RTQU9heUVOQWtBZ0NVVUVRRUVBSVFVZ0RTQUlLQUlNU1FSQUlBZ29BaEFnRFVFQ2RHb29BZ0FoQlFzZ0RDRUdJQkZGQkVBRFFDQUdRUUJNRFFNZ0JrRUJheUlHSUFkQklHcHFJQVVnQlVFS2JpSUZRZllCYkdwQk1ISTZBQUFNQUFzQUN3TkFJQVpCQUV3TkFpQUdRUUZySWdZZ0IwRWdhbXBCTUVIWEFDQUZJQVVnQW00aUJTQUNiR3NpRDBFS1NCc2dEMm82QUFBTUFBc0FDeUFJS0FJUUlBZ29BZ3dnRFJCb0lRWWdEQ0VGQTBBZ0JVRUFUQTBCSUFWQkFXc2lCU0FIUVNCcWFrRXdRZGNBSUFZZ0VIRWlEMEVLU0JzZ0QybzZBQUFnQmlBSmRpRUdEQUFMQUFzZ0N5RUZRUUFoQ3dzQ1FDQUtJQVFpQmtrTkFDQURJUVlnQkNBS1J3MEFJQUJCTGhBUkN5QUFJQWRCSUdvZ0JXb2dEQ0FGYXlJUElBWWdDbXNpQmlBR0lBOUtHeUlHRUhJZ0JpQUthaUVLSUFVZ0Jtb2hCUXdBQ3dBTElBQkJBVFlDRENBSFFReHFJUWdMSUFFZ0NFY0VRQ0FJRUJzTElBZEI4QUJxSkFBTHdnRUNBMzhCZmlBQUlBQkJIM1VpQTNNZ0Eyc2hBMEVBQW44Z0FTQUJRUUZySWdSeFJRUkFRU0FnQkdjaUJXc2hCQ0FDQkVCQkh5QUZhMEVBSUFCQkFFNGJJQU5xSUFSdURBSUxJQVJCQUNBQlFRSlBHeUFEYkF3QkN5QUFRWDl6UVI5MklRUWdBVUVDYXlFQklBUUNmaUFDQkVBZ0E2MGlCaUFCUVFOMElnRkI1S0VFYWpVQ0FINUNJSWdnQVVIZ29RUnFOUUlBSUFaK2ZFSWZpQXdCQ3lBQlFRSjBRWUNrQkdvMUFnQWdBNjErUWgySUM2ZHFDeUlCYXlBQklBQkJBRWdiQzBnQkFuOGpBRUVRYXlJQ0pBQkJmeUVEQWtBZ0FDQUNRUXhxSUFFUXVnRU5BQ0FDS0FJTUlnTkJKV3RCWEVzTkFDQUFRZG1KQVVFQUVGQkJmeUVEQ3lBQ1FSQnFKQUFnQXd0MUFRRi9Ba0FnQVVLQWdJQ0FjSU5DZ0lDQWdPQitVUVJBREFFTEFrQWdBVUtBZ0lDQWNGUU5BQ0FCcHlJQ0x3RUdRU0ZIRFFBZ0Fpa0RJQ0lCUW9DQWdJQndnMEtBZ0lDQTRINVNEUUFNQVFzZ0FFR2lMRUVBRUJWQ2dJQ0FnT0FBRHdzZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBSUFFTHJnSUNBWHdCZndKQUEwQUNRQUpBQWtBQ1FBSkFRUWNnQWtJZ2lLY2lCQ0FFUVFkclFXNUpHMEVKYWc0UkFnTURBd01EQXdNREFBQUFBQU1EQkFFREN5QUJJQUxFTndNQURBVUxJQUpDZ0lDQWdNQ0JnUHovQUh3aUFrTC8vLy8vLy8vLy8vOEFnMEtCZ0lDQWdJQ0ErUDhBV2dSQUlBRkNBRGNEQUF3RkN5QUN2eUlEUkFBQUFBQUFBT0REWXdSQUlBRkNnSUNBZ0lDQWdJQ0FmemNEQUF3RkN5QURSQUFBQUFBQUFPQkRaQVJBSUFGQy8vLy8vLy8vLy8vL0FEY0RBQXdGQ3lBQkFuNGdBNWxFQUFBQUFBQUE0RU5qQkVBZ0E3QU1BUXRDZ0lDQWdJQ0FnSUNBZndzM0F3QU1CQXNnQVNBQ3AwRUVha0VBRUlJREdpQUFJQUlRRHd3REN5QUFJQUlRalFFaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkN3c2dBVUlBTndNQVFYOFBDMEVBQzdFQ0FRSi9Jd0JCSUdzaUJDUUFBa0FDUUFKQUlBSW9BZ3hGQkVBQ1FBSkFBa0FDUUNBQ0tBSUlRZjcvLy84SGF3NENBUUFDQ3lBQUVEVU1BZ3NnQWlnQ0JBMERDeUFBSUFJUVJCb0xRUUFoQWlBQlJRMERJQUZDQUJBd0dnd0RDeUFDS0FJRVJRMEJDeUFBRURWQkFTRUNJQUZGRFFFZ0FVSUFFREFhREFFTElBQWdBaUFDS0FJSVFRRnFRUUp0UVFFUWtRWWdBRUVCRU5FQkdpQUJJZ05GQkVBZ0FDZ0NBQ0VESUFSQ0FEY0NHQ0FFUW9DQWdJQ0FnSUNBZ0g4M0FoQWdCQ0FETmdJTUlBUkJER29oQXdzZ0F5QUFJQUJCLy8vLy93TkJBUkJER2lBRElBTW9BZ1JCQVhNMkFnUWdBeUFESUFKQi8vLy8vd05CQVJETEFScEJJQ0VDSUFNb0FnaEIvLy8vL3dkSEJFQWdBeWdDREVFQVIwRUVkQ0VDQ3lBQkRRQWdBeEFiQ3lBRVFTQnFKQUFnQWdzTUFDQUFJQUVRaUFOQkFFd0xEUUFnQUNBQklBSkJBaERqQXd2UkRBRUlmeU1BUVlBQmF5SUZKQUFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBU2dDREFSQUlBSW9BZ3dOQVFzZ0FpZ0NDRUdBZ0lDQWVFWUVRQ0FBUWdFUU1Cb01Dd3NnQVNnQ0NFSC8vLy8vQjBZTkNTQUFRZ0VRTUJvQ1FDQUJJQUFRMHdFaUF5QUVRWUNBQkhGRmNrVUVRQ0FDS0FJSVFmNy8vLzhIVGcwTERBRUxJQU1OQWdzZ0FTZ0NCRVVOQ2lBQ0tBSUlRZi8vLy84SFJnMEpEQW9MSUFBb0FnQWhCeUFGUWdBM0Fqd2dCVUtBZ0lDQWdJQ0FnSUIvTndJMElBVWdCellDTUNBRlFUQnFJQUVRUkJvZ0FoQ3hBaUVLSUFRaENDQUJLQUlFQkVBZ0NrRUFTQVJBSUFBUU5TQUZRVEJxRUJ0QkFTRUdEQXdMSUFVZ0JTZ0NORUVCY3pZQ05DQUtSU0lNSUFSQkJuRkJBa1p4SUFSeklRZ0xJQUJDQVJBd0dpQUZRVEJxSUFBUWdnSU5CQ0FGUWdBM0FpZ2dCVUtBZ0lDQWdJQ0FnSUIvTndJZ0lBVWdCellDSENBRlFnQTNBaFFnQlVLQWdJQ0FnSUNBZ0lCL053SU1JQVVnQnpZQ0NDQUZRUnhxSWdFZ0JVRXdhaUlKUVNCQkFoQ2ZCQ0FGUVFocUlnWWdDVUVnUVFNUW53UWdBU0FCSUFKQklDQUNLQUlFUVFKekVFTWFJQVlnQmlBQ1FTQWdBaWdDQkVFRGN4QkRHa0VBSVFZQ1FDQUZLQUlRUVFCTURRQWdCVUlBTndKa0lBVkNnSUNBZ0lDQWdJQ0FmemNDWENBRklBYzJBbGdnQlVJQU53SlFJQVZDZ0lDQWdJQ0FnSUNBZnpjQ1NDQUZJQWMyQWtRZ0JVSEVBR29pQ1VFZ1FRTVEwd0lnQlVJQU53SjRJQVZDZ0lDQWdJQ0FnSUNBZnpjQ2NDQUZJQVVvQWxnMkFtd2dCVUhzQUdvaUIwR0FnSUNBQWtFQlFSd2dDRUVGZGtFL2NTSUJhM1FnQVVFL1Joc2lBYXdRTUJvZ0JVSFlBR29pQ3lBSklBZEJJRUVERUVNYUlBY1FHeUFMSUFWQkhHb1FzZ0lFUUNBRlFkZ0FhaEFiSUFWQnhBQnFFQnNnQUVFQUlBTWdDQkNyQkNFR0RBRUxJQVZCeEFCcUlnZEJJRUVDRU5NQ0lBVkIyQUJxSWdrZ0IwRUJJQUVnQTBFQmF5QUlRUngwUVI5MWNXb2lBV3VzUVNCQkFoRFVBaUFGUVFocUlBa1FzZ0lFUUNBRlFkZ0FhaEFiSUFWQnhBQnFFQnNnQ0VFSGNVRURSZ1JBSUFCQ0FSQXdHaUFBUVFNZ0FXczJBZ2hCR0NFR0RBSUxJQUJCQUJDSkFVRVlJUVlNQVFzZ0JVSEVBR29RR3lBRlFkZ0FhaEFiQ3lBRlFSeHFFQnNnQlVFSWFoQWJJQVlOQkNBRVFRZHhJUVlnQ2tFQVRnMENJQVpCQmtZTkEwRUFJUWNnQUNnQ0FDRUpJQVZCTUdvUXNRSWhBUUpBUVFBZ0Ntc2lCRUVnVHdSQUlBRkZEUUVNQlFzZ0FVRi9JQVIwUVg5emNRMEVJQUVnQkhVaEJ3c2dCU2dDUUNBRktBSThJZ3NnQVNBRktBSTRheUFMUVFWMGFoQm9RUWR4UVFGSERRTWdCVUlBTndKNElBVkNnSUNBZ0lDQWdJQ0FmemNDY0NBRklBazJBbXdnQlVIc0FHb2dCVUV3YWhCRUdpQUZJQVVvQW5RZ0FXczJBblJCQUNFQkEwQWdBU0FFUmcwQ0lBRUVRQ0FGUWV3QWFpQUFFRVFhQ3lBQlFRRnFJUUVnQUVFQUlBVkI3QUJxRUpFRlJRMEFDd3dEQ3lBQ0tBSUlRZjcvLy84SGF3NENCZ2NGQ3lBQUlBQW9BZ2dnQjJvMkFnZ2dCVUV3YWlBQUVFUWFJQVVnQWlnQ0VEWUNmQ0FGSUFJb0FndzJBbmdnQlNBQ0tBSUVOZ0p3SUFVZ0FpZ0NDQ0FLYXpZQ2RDQUZRZXdBYWlFQ0N5QUZLQUk0SWdFZ0JVRXdhaEN4QW1zaUJFRUJSZ1JBSUFWQk1Hb2lCQ0FDSUFGQkFXdXNRU0JCQVJEVUFpQUZRUVJxSUFSQkFCQ3BBU0FBUWdFUU1Cb2dBQ0FGS0FJRUlBTWdDQkRNQVNFR0RBSUxJQU5CLy8vLy93TkdCRUFnQlVIWUFHb2dBa0VBRUtrQklBSW9BZ1FOQXlBRktBSllJZ0ZCLy8vLy93Rk1CRUFnQUNBRlFUQnFJQUZCLy8vLy93TkJBUkNpQkNFR0RBTUxJQVZCTUdvUUd5QUFRUUJCLy8vLy93TWdDQkNyQkNFR0RBZ0xJQUlvQWdoQklFNEVRQ0FHUVFaR0RRRWdBaWdDQkEwQklBQWdBaUFFUVFGcnJFRWdRUUVRMUFJZ0JVRUVhaUFBUVFBUXFRRWdCU2dDQkNBRFN3MEJDeUFBSUFWQk1Hb2dBeUFJUWNnQUlBSVFuZ1FoQmd3QkN5QUFJQVZCTUdvZ0F5QUlRY2tBSUFJUW5nUWhCZ3NnQlVFd2FoQWJJQUFnRERZQ0JBd0ZDMEhPMEFCQjFQd0FRYUVsUWZFaEVBQUFDeUFCS0FJRUlBSVFzUUpGY1NFRElBSW9BZ1FnQVNnQ0NFR0FnSUNBZUVaR0JFQWdBQ0FERUl3QlFRSWhCaUFDS0FJRVJRMEREQVFMSUFBZ0F4Q0pBUXdDQ3lBQ0tBSUVJQU5CQUVwR0JFQWdBRUVBRUlrQkRBSUxJQUJCQUJDTUFRd0JDeUFBRURVTFFRQWhCZ3NnQlVHQUFXb2tBQ0FHQzFNQkFuOGpBRUVnYXlJRUpBQWdBQ2dDQUNFRklBUkNBRGNDR0NBRVFvQ0FnSUNBZ0lDQWdIODNBaEFnQkNBRk5nSU1JQVJCREdvaUJTQUFJQUVnQWlBREVPUURJUUFnQlJBYklBUkJJR29rQUNBQUM0Z0NBZ0ovQVg0akFFRVFheUlFSkFBQ1FBSkFJQUZDZ0lDQWdIQ0RRb0NBZ0lEZ2ZsSU5BQ0FCcHlFREFrQWdBa1VOQUNBRVFRaHFJQU5CQkdwQkFCQ0NBdzBBSUFRcEF3Z2lCVUtCZ0lDQWdJQ0FjRk1nQlVMLy8vLy8vLy8vRDFWeURRQWdBQ0FCRUE4Z0JVS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0JVTC8vLy8vRDRNaEFRd0NDMEtBZ0lDQXdINGdCYm05SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2hBUXdCQ3lBREtBSU1RWUNBZ0lCNFJ3MEFJQU1vQWdoRkRRQWdBeWdDQUVFQlJ3MEJJQU5CQURZQ0NBc2dCRUVRYWlRQUlBRVBDMEhqakFGQnJ2d0FRYkhnQUVHU2pBRVFBQUFMUUFFRGYwRUJJQUJCM3FnRWFpMEFBQ0lCSUFGQkFVMGJJUU5CQVNFQ0lBQWhBUU5BSUFJZ0EwWkZCRUFnQWtFQmFpRUNJQUFnQVd3aEFRd0JDd3NnQVF1MkZRTUpmd3grQW53akFFRkFhaUlDSkFBZ0FrRUFRY0FBRUNzaEJDQUJRUUJCMEFFUUt5SUNJQUExQWhBM0F4Z2dBaUFBTlFJVU53TUFJQUExQWhnaEN5QUNRZ0kzQXlBZ0FpQUxOd01JSUFJZ0FDZ0NRRUVEZEVId0FtcXROd01RSUFCQnpBQnFJUUVnQUVISUFHb2hDQU5BSUFFb0FnQWlCU0FJUmtVRVFDQUZLQUlRSVFFZ0FpQUNLUU1nUWdKOE53TWdJQUlnQWlrREVDQUFLQUpBUVFOMFFZZ0NhcTE4TndNUUlBSWdBaWtEd0FFZ0JUTUJDSHczQThBQklBSWdBaWtEeUFFZ0JUUUNESHczQThnQkFrQWdBVVVOQUNBQkxRQVFEUUFnQVNnQ0dDRURJQUlnQWlrRGFFSUJmRGNEYUNBQ0lBSXBBM0FnQTBFQ2RDQUJLQUljUVFOMGFrRTBhcTE4TndOd0N5QUZRZVFCYWlFQklBVkI0QUZxSVFrRFFDQUpJQUVvQWdBaUEwY0VRQ0FDSUFJcEF5QWlEVUlCZkNJTU53TWdJQUlnQWlrREVFTHdBSHdpQ3pjREVDQURLQUlJQkVBZ0FpQU5RZ0o4SWd3M0F5QWdBaUFMSUFNb0FneEJBM1N0ZkNJTE53TVFDd0pBSUFNb0FoUkZEUUFnQWlBTVFnRjhOd01nSUFJZ0N5QURLQUlZSWdaQkZHeXRmRGNERUVFQUlRRURRQ0FCSUFaT0RRRUNRQ0FES0FJVUlBRkJGR3hxSWdjb0FnZ05BQ0FIS0FJRVJRMEFJQUlnQWlrRElFSUJmRGNESUNBSEtBSUVLUU1ZSUFRUW5RRWdBeWdDR0NFR0N5QUJRUUZxSVFFTUFBc0FDeUFES0FJZ0JFQWdBaUFDS1FNZ1FnRjhOd01nSUFJZ0Fpa0RFQ0FES0FJa1FRSjByWHczQXhBTElBTW9BaXdFUUNBQ0lBSXBBeUJDQVh3M0F5QWdBaUFDS1FNUUlBTW9BakJCREd5dGZEY0RFQXNnQXlrRE9DQUVFSjBCSUFNcEEwQWdCQkNkQVNBRFFRUnFJUUVNQVFzTElBVkJCR29oQVF3QkN3c2dBRUhVQUdvaEFTQUFRZEFBYWlFSUEwQWdBU2dDQUNJRElBaEdSUVJBQWtBQ1FBSkFJQU5CQkdzdEFBQkJEM0VPQWdFQUFnc2dBeWdDR0FSL0lBTXZBU0lnQXk4QklHcEJCSFJCUUdzRlFjQUFDeUVHSUFNb0Fpd0VRRUVBSVFFZ0F5Z0NNQ0lISVFVRFFDQUJJQVZPUlFSQUlBTW9BaXdnQVVFRGRHb3BBd0FnQkJDZEFTQUJRUUZxSVFFZ0F5Z0NNQ0VGREFFTEN5QUhRUU4wSUFacUlRWUxJQU1vQWh3RVFDQURLQUkwUVFOMElBWnFJUVlMQWtBZ0F5OEFDU0lGUVlBZ2NRMEFJQU1vQWd4RkRRQWdCQ0FFS1FNb0lBTTBBaEI4TndNb0N3Si9RUUFnQlVHQUNIRkZEUUFhQW44Z0F5Z0NURVVFUUNBR1FSaHFJUVpCQUF3QkN5QUdJQU1vQWtCcVFSbHFJUVpCQVFzaUFTQURLQUpFSWdWRkRRQWFJQVFnQkNrRE1FSUJmRGNETUNBRUlBUXBBemdnQmF4OE53TTRJQUZCQVdvTElRRWdCQ0FFS1FNWVFnRjhOd01ZSUFRZ0JDc0RJQ0FHdDZBNUF5QWdCQ0FFS3dNQUlBRzNvRGtEQUF3QkN5QURLQUlJSVFjZ0FpQUNLUU5JUWdGOE53TklBa0FnQXlnQ0RFVU5BQ0FDSUFJcEF5QkNBWHczQXlBZ0FpQUNLUU5nSUFjb0FoeEJBM1N0ZkRjRFlDQUNJQUlwQTFnZ0J5Z0NJQ0lHckh3M0ExZ2dCMEV3YWlFQlFRQWhCUU5BSUFVZ0JrNE5BUUpBSUFFb0FnUkZEUUFnQVNnQ0FFSC8vLy8vQTBzTkFDQURLQUlNSUFWQkEzUnFLUU1BSUFRUW5RRWdCeWdDSUNFR0N5QUZRUUZxSVFVZ0FVRUlhaUVCREFBTEFBc2dCeTBBRUVVRVFDQUhLQUlZSVFFZ0FpQUNLUU5vUWdGOE53Tm9JQUlnQWlrRGNDQUJRUUowSUFjb0FoeEJBM1JxUVRScXJYdzNBM0FMQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0EwRUNheThCQUVFQ2F3NGpBQWtCQVFFQkFBa0JDUUlEQkFVSkJ3WUlDQWtKQ1FrSkNRa0pDUWtKQ1FFQkNRRUpDeUFDSUFJcEE2Z0JRZ0Y4TndPb0FTQURRUU5yTFFBQVFRaHhSUTBKSUFJZ0Fpa0RzQUZDQVh3M0E3QUJJQU1vQWh4RkRRa2dBaUFDS1FNZ1FnRjhOd01nSUFJZ0Fpa0RFQ0FES0FJZ1FRTjByWHczQXhBZ0FpQUNLUU80QVNBRE5RSWdmRGNEdUFGQkFDRUJBMEFnQVNBREtBSWdUdzBLSUFNb0Fod2dBVUVEZEdvcEF3QWdCQkNkQVNBQlFRRnFJUUVNQUFzQUN5QURLUU1ZSUFRUW5RRU1DQXNnQWlBQ0tRT2dBVUlCZkRjRG9BRU1Cd3NnQXlnQ0hDSUpSUTBHSUFNb0FoZ2hCeUFDSUFJcEF5QkNBWHczQXlBZ0FpQUNLUU9BQVNBSEtBSThJZ1pCQW5TdGZEY0RnQUZCQUNFQkEwQWdBU0FHVGcwSEFrQWdDU0FCUVFKMGFpZ0NBQ0lGUlEwQUlBSUNma1FBQUFBQUFBRHdQeUFGS0FJQXR5SVhveUFDS1FNZ3VhQWlHSmxFQUFBQUFBQUE0RU5qQkVBZ0dMQU1BUXRDZ0lDQWdJQ0FnSUNBZndzM0F5QWdBZ0orUkFBQUFBQUFBRUJBSUJlaklBSXBBNEFCdWFBaUY1bEVBQUFBQUFBQTRFTmpCRUFnRjdBTUFRdENnSUNBZ0lDQWdJQ0Fmd3MzQTRBQklBVW9BaEFpQ2lBRlFSaHFSdzBBSUFvcEF3QWdCQkNkQVNBSEtBSThJUVlMSUFGQkFXb2hBUXdBQ3dBTElBTW9BaGdoQmtFQUlRRURRQ0FCSUFZb0FoQWlCVTVGQkVBZ0JpQUJRUU4wYWlrREdDQUVFSjBCSUFGQkFXb2hBUXdCQ3dzZ0FpQUNLUU1nUWdGOE53TWdJQUlnQWlrREVDQUZRUU4wUVJocXJYdzNBeEFNQlFzZ0F5Z0NHQ0lHUlEwRVFRQWhBUU5BSUFFZ0JpMEFCU0lGVDBVRVFDQUdJQUZCQTNScUtRTUlJQVFRblFFZ0FVRUJhaUVCREFFTEN5QUNJQUlwQXlCQ0FYdzNBeUFnQWlBQ0tRTVFJQVd0UWdPR2ZFSUlmRGNERUF3RUN5QURLQUlZSUFRUXR3UWdBeWdDSENBRUVMY0VEQU1MSUFNb0FoZ2lBVVVOQWlBQktRTUFJQVFRblFFZ0FpQUNLUU1nUWdGOE53TWdJQUlnQWlrREVFSVlmRGNERUF3Q0N5QURLQUlZSWdGRkRRRWdBaUFDS1FNZ0lndENBWHczQXlBZ0FpQUNLUU1RUWh4OElndzNBeEFnQVNnQ0NFVU5BU0FDSUF0Q0FudzNBeUFnQWlBTUlBRTBBZ0I4TndNUURBRUxJQU1vQWhoRkRRQWdBaUFDS1FNZ1FnRjhOd01nQ3lBRFFRUnFJUUVNQVFzTElBSWdBaWtEVUNBQ0tRTklJZzVDTUg1OElnODNBMUFnQWlBQ0tRTVFJQUFvQXN3QklnRkJBblN0ZkNJUU53TVFRUUFoQlNBQlFRQWdBVUVBU2hzaEF5QUNLUU1nSVFzRFFDQURJQVZHUlFSQUlBQW9BdFFCSUFWQkFuUnFJUUVEUUNBQktBSUFJZ0VFUUNBQktBSVlJUVlnQWlBQ0tRTm9RZ0Y4TndOb0lBSWdBaWtEY0NBR1FRSjBJQUVvQWh4QkEzUnFRVFJxclh3M0EzQWdBVUVvYWlFQkRBRUxDeUFGUVFGcUlRVU1BUXNMSUFJZ0MwSURmQ0lSTndNZ0lBSWdBQ2dDS0NJR3JEY0RLQ0FDSUFBb0Fpd2lBeUFBS0FJa2FrRUNkSzBpQ3pjRE1FRUFJUUVnQTBFQUlBTkJBRW9iSVFVRFFDQUJJQVZIQkVBZ0FDZ0NPQ0FCUVFKMGFpZ0NBQ0lEUVFGeFJRUkFJQUlnQ3lBREtBSUVJZ05CSDNVZ0EwSC8vLy8vQjNFZ0EwRWZkblJxUVJGcXJYd2lDemNETUFzZ0FVRUJhaUVCREFFTEN5QUNBbjRnQkNzRENCQ3hBeUlYbVVRQUFBQUFBQURnUTJNRVFDQVhzQXdCQzBLQWdJQ0FnSUNBZ0lCL0N5SU1Od000SUFJQ2ZpQUVLd01RRUxFREloZVpSQUFBQUFBQUFPQkRZd1JBSUJld0RBRUxRb0NBZ0lDQWdJQ0FnSDhMSWcwM0EwQWdBaUFFS1FNWUloSTNBM2dnQWdKK0lBUXJBeUFRc1FNaUY1bEVBQUFBQUFBQTRFTmpCRUFnRjdBTUFRdENnSUNBZ0lDQWdJQ0Fmd3NpRXpjRGdBRWdBaUFFS1FNb0loUTNBNGdCSUFJZ0JDa0RNQ0lWTndPUUFTQUNJQVFwQXpnaUZqY0RtQUVnQkNzREFDRVhJQUlnQWlrRGNDQUNLUU5nSUJZZ0ZDQVBJQkI4SUExOElCTjhmSHdnQzN4OGZEY0RFQ0FDQW40Z0Z4Q3hBeUFHdDZBZ0RMbWdJQTY1b0NBQ0tRTm91YUFnRXJtZ0lCVzVvQ0FSdWFBaUY1bEVBQUFBQUFBQTRFTmpCRUFnRjdBTUFRdENnSUNBZ0lDQWdJQ0Fmd3MzQXlBZ0JFRkFheVFBQzFBQkFuOERRQ0FCTEFBQUlnUUVRQ0FFSUFBc0FBQWlBMEVnYWlBRElBTkJ3UUJyUVJwSkcwY0VRRUVBRHdVZ0FVRUJhaUVCSUFCQkFXb2hBQXdDQ3dBTEN5QUNCRUFnQWlBQU5nSUFDMEVCQzcwSEFncC9BWDRqQUVIZ0FHc2lBeVFBUW9DQWdJRGdBQ0VOQWtBZ0FDQURRUXhxSUFFUXV3RWlCa1VOQUNBR0tBSUVJZ3doQlNBR0tBSUlJZ1JCZ0lDQWdIaEdCRUFnQmtFQU5nSUVRUUFoQlFzZ0JpZ0NBQ0VLSUFOQ0FEY0RVQ0FEUWdBM0EwZ2dBeUFLTmdKY0lBTkJ4UUEyQWxnQ2Z3SkFBa0FnQkVILy8vLy9CMFlFUUNBRFFjZ0Fha0dCZ3dFUSt3SU1BUXNnQlFSQUlBTkJ5QUJxUVMwUUVTQUdLQUlJSVFRTElBUkIvdi8vL3dkR0JFQWdBMEhJQUdwQjlSd1Erd0lNQVF0QkFDRUZJQU5DQURjQ1FDQURRb0NBZ0lDQWdJQ0FnSDgzQWpnZ0F5QUtOZ0kwSUFJZ0FrRUJheUlJY1VVRVFFRWdJQWhuYTBFQUlBSkJBazhiSVFVTEFrQUNRQUpBQWtBZ0JRUkFJQU5CTkdvZ0JoQkVEUUVnQTBFMGFrRUFRUkVRemdGQklIRU5BU0FES0FJOElnUWdCVUVCYTBFQUlBUkJBRTRiYWlBRmJTRUZJQVJCZ0lDQWdIaEdCRUFnQTBISUFHcEJxSkFCRVBzQ0RBVUxRUUFoQkNBRlFRQktEUUlnQTBISUFHcEJ2WkFCRVBzQ1FRQWdCV3NoQWdOQUlBSWdCRVlOQlNBRFFjZ0Fha0V3RUJFZ0JFRUJhaUVFREFBTEFBc2dBeUFHS0FJUU5nSXdJQU1nQmlnQ0RDSUZOZ0lzSUFOQkFEWUNKQ0FESUFRMkFpZ2dCRUVBSUFSQkFFb2JJQUpCQVJDTkJVRUJhaUVJQWtBZ0JRUkFJQWdnQWtFQUVJMEZJUVZCRUNFRUEwQWdBMEUwYWlJTElBSkJBQ0FFSUFWcUlnbEJBV29pQjBIZ0R4RDhBaUFMSUFzZ0EwRWdhaUFIUWVBUEVFTnlJZ2RCSUhFTkF5QUhRUkJ4UlEwQ0lBTkJOR29nQXlnQ1BFRUJJQWtRNFFNTkFpQUVRUUp0SUFScUlRUU1BQXNBQ3lBRFFUUnFJQU5CSUdvUVJBMEJEQU1MSUFOQk5HcEJBUkRSQVVFZ2NVVU5BZ3NnQTBFMGFoQWJEQVFMSUFOQnlBQnFJQU5CTkdvZ0FpQUZJQVVRakFVTUFRc2dBeWdDVENFRklBTkJ5QUJxSUFOQk5Hb2dBaUFJSUFnUWpBVWdBeWdDVENJSklBVkJBV29pQWlBQ0lBbEpHMEVCYXlFSUlBTW9Ba2doQnlBRklRUURRQUpBSUFrZ0JDSUNRUUZxSWdSTkJFQWdDQ0VDREFFTElBSWdCMm90QUFCQk1FY05BQ0FFSUFkcUxRQUFRUzVIRFFFTEN5QUNJQVZORFFBZ0JTQUhhaUFDSUFkcUlBa2dBbXNRbkFFZ0F5QUZJQUpySUFscU5nSk1DeUFEUVRScUVCc0xJQU5CeUFCcVFRQVFFU0FES0FKVURRQWdBeWdDU0F3QkMwRUFJQU1vQWtnaUFrVU5BQm9nQ2lnQ0FDQUNRUUFnQ2lnQ0JCRUJBQnBCQUFzaEJDQUdJQXcyQWdRZ0FDQUdJQU5CREdvUVhpQUVSUVJBSUFBUWZBd0JDeUFBSUFRUVlpRU5JQUFvQXRnQklnQW9BZ0FnQkVFQUlBQW9BZ1FSQVFBYUN5QURRZUFBYWlRQUlBMEx3M1VDRW44QmZpTUFRYUFHYXlJREpBQWdBU2dDeUFFaUJFRUFJQVJCQUVvYklRWURRQ0FDSUFaR1JRUkFJQUVvQXN3QklBSkJBM1JxUVg4MkFnUWdBa0VCYWlFQ0RBRUxDeUFCS0FJOEJFQWdBU2dDekFGQmZqWUNEQXRCQUNFQ0lBRW9BbndpQmtFQUlBWkJBRW9iSVFZQ2ZnSkFBa0FEUUNBQ0lBWkdCRUFDUUVFQ0lRSkJBaUFFSUFSQkFrd2JJUWdEUUFKQUlBSWdDRVlFUUVFQUlRSURRQ0FDSUFaR0RRSUNRQ0FCS0FKMElBSkJCSFJxSWdRb0FnaEJBRTROQUNBRUtBSUVJZ2hCQWtnTkFDQUVJQUVvQXN3QklnUWdCQ0FJUVFOMGFpZ0NBRUVEZEdvb0FnUTJBZ2dMSUFKQkFXb2hBZ3dBQ3dBTElBRW9Bc3dCSWdjZ0FrRURkR29pQkNnQ0JFRUFTQVJBSUFRZ0J5QUVLQUlBUVFOMGFpZ0NCRFlDQkFzZ0FrRUJhaUVDREFFTEN3SkFJQUVvQWtSRkRRQUNRQ0FCS0FJZ0RRQWdBUzBBYmtFQmNRMEFJQUVnQUNBQlFkSUFFRTgyQXBBQklBRW9BanhGRFFBZ0FTQUFJQUZCMHdBUVR6WUNsQUVMQWtBZ0FTZ0NUQ0lJUlEwQUlBRW9BcWdCUVFCSUJFQWdBU0FBSUFFUXlnTTJBcWdCQ3lBQktBS3NBVUVBU0FSQUlBRWdBQ0FCUWZFQUVFODJBcXdCQ3dKQUlBRW9BbUJGRFFBZ0FTZ0NzQUZCQUU0TkFDQUJJQUFnQVVIeUFCQlBOZ0t3QVFzZ0FTZ0NNRVVOQUNBQktBSzBBVUVBVGcwQUlBRWdBQ0FCUWZNQUVFODJBclFCQ3dKQUlBRW9Ba2dpQkVVTkFDQUFJQUVRNmdJYUlBRW9BanhGRFFBZ0FTMEFia0VCY1EwQUlBRW9BcHdCUVFCT0RRQWdBU2dDekFGQkRHb2hBZ05BQWtBZ0FpZ0NBQ0lDUVFCSURRQWdBU2dDZENBQ1FRUjBhaUlDS0FJRVFRRkhEUUFnQWlnQ0FFSE5BRVlOQWlBQ1FRaHFJUUlNQVFzTElBQWdBVUhOQUJCUElnSkJBRWdOQUNBQktBSjBJQUpCQkhScUlnWWdBU2dDekFFaUIwRU1haWdDQURZQ0NDQUhJQUkyQWd3Z0JrRUJOZ0lFSUFZZ0JpZ0NERUVDY2pZQ0RDQUJJQUkyQXB3QkN3SkFJQUVvQWl4RkRRQWdBU2dDY0NJQ1JRMEFJQUFnQVNBQ0VPa0NHZ3NDUUNBQktBSWdCRUFnQVNFRkRBRUxJQUVoQlNBQktBTEFBZzBDQ3dOQUlBVW9BZ1FpQWtVTkFTQUZLQUlNSVFZQ1FDQUlEUUFnQWlnQ1RFVUVRRUVBSVFnTUFRc2dBaWdDcUFGQkFFZ0VRQ0FDSUFBZ0FoREtBellDcUFFTElBSW9BcXdCUVFCSUJFQWdBaUFBSUFKQjhRQVFUellDckFFTEFrQWdBaWdDWUVVTkFDQUNLQUt3QVVFQVRnMEFJQUlnQUNBQ1FmSUFFRTgyQXJBQkMwRUJJUWdnQWlnQ01FVU5BQ0FDS0FLMEFVRUFUZzBBSUFJZ0FDQUNRZk1BRUU4MkFyUUJDd0pBSUFRTkFDQUNLQUpJUlFSQVFRQWhCQXdCQ3lBQUlBSVE2Z0lhUVFFaEJBc0NRQ0FDS0FJc1JRMEFJQUlvQW5BaUIwVU5BQ0FBSUFJZ0J4RHBBaG9MSUFJb0Fzd0JJQVpCQTNScVFRUnFJUVVEUUNBRktBSUFJZ1pCQUVoRkJFQWdBaWdDZENBR1FRUjBhaUlISUFjb0Fnd2lCVUVFY2pZQ0RDQUFJQUVnQWtFQUlBWWdCeWdDQUNBRlFRRnhJQVZCQVhaQkFYRWdCVUVEZGtFUGNSQ2ZBUm9nQjBFSWFpRUZEQUVMQ3dKQUlBWkJma2NFUUVFQUlRVURRQ0FDS0FLSUFTQUZUQVJBUVFBaEJRTkFJQVVnQWlnQ2ZFNE5CQUpBSUFJb0FuUWdCVUVFZEdvaUJpZ0NCQTBBSUFZb0FnQWlCa1VnQmtIUkFFWnlEUUFnQUNBQklBSkJBQ0FGSUFaQkFFRUFRUUFRbndFYUN5QUZRUUZxSVFVTUFBc0FDeUFDS0FLQUFTQUZRUVIwYWlnQ0FDSUdCRUFnQUNBQklBSkJBU0FGSUFaQkFFRUFRUUFRbndFYUN5QUZRUUZxSVFVTUFBc0FDMEVBSVFVRFFDQUZJQUlvQW54T0RRRUNRQ0FDS0FKMElBVkJCSFJxSWdZb0FnUU5BQ0FHRUo0RlJRMEFJQUFnQVNBQ1FRQWdCU0FHS0FJQVFRQkJBRUVBRUo4Qkdnc2dCVUVCYWlFRkRBQUxBQXNnQWlJRktBSWdSUTBBUVFBaEJRTkFJQUlvQXNBQ0lBVk1CRUFnQWlFRkRBSUZJQUFnQVNBQ1FRQWdBaWdDeUFJZ0JVRURkR29pQnkwQUFDSUdRUUYyUVFGeElBVWdCeWdDQkNBR1FRSjJRUUZ4SUFaQkEzWkJBWEVnQmtFRWRoRDFBUm9nQlVFQmFpRUZEQUVMQUFzQUN3QUxJQUVvQXBRRElnUkZEUU5CQUNFQ0EwQWdBU2dDOUFFZ0Frd0VRRUVBSVFjRFFDQUhJQVFvQWlCT0RRWWdCQ2dDSENBSFFSUnNhaUlHS0FJSVJRUkFRUUFoQWlBQktBTEFBaUlJUVFBZ0NFRUFTaHNoQlNBR0tBSU1JUWdDUUFKQUEwQWdBaUFGUmcwQklBZ2dBU2dDeUFJZ0FrRURkR29vQWdSSEJFQWdBa0VCYWlFQ0RBRUxDeUFDUVFCT0RRRUxJQUFnQ0VHVkpoRC9Bd3dKQ3lBR0lBSTJBZ0FMSUFkQkFXb2hCd3dBQ3dBTElBQWdBVUVCUVFBZ0FpQUJLQUw4QVNBQ1FRUjBhaUlHS0FJTUlBWXRBQVFpQmtFQ2RrRUJjU0FHUVFGMlFRRnhRUUFReVFNaEJpQUNRUUZxSVFJZ0JrRUFUZzBBQ3d3RUN3VWdBU2dDZENBQ1FRUjBhaUlJSUFFb0Fzd0JJQWdvQWdSQkEzUnFJZ2dvQWdRMkFnZ2dDQ0FDTmdJRUlBSkJBV29oQWd3QkN3dEJ1WTRCUWE3OEFFRzE3QUZCNkRrUUFBQUxJQUZCRUdvaENDQUJLQUlVSVFJQ1FBTkFJQUlnQ0VjRVFDQUNLQUlFSVFRZ0FrRVFheWdDQUNFR0lBQWdBa0VZYXhDYkJTSVVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdCa0VBU0EwQ0lBRW9BclFDSUFaQkEzUnFJQlEzQXdBZ0JDRUNEQUVMQ3lBRElBRW9Bb0FDSWcwMkF0d0ZJQU1nQVNnQ2hBSWlEallDNEFVZ0FDZ0NFQ0VDSUFOQ0FEY0RpQVlnQTBJQU53T0FCaUFESUFJMkFwUUdJQU5CT3pZQ2tBWWdBVUdBQW1vaERFRUFJUVFEUUNBQktBTDBBU0FFVEFSQVFRQWhCa0VBSVFnRlFRQWhBaUFCS0FMQUFpSUdRUUFnQmtFQVNoc2hDQ0FCS0FMOEFTQUVRUVIwYWlFR0FrQWdBMEdBQm1vQ2Z3TkFJQUlnQ0VjRVFDQUJLQUxJQWlBQ1FRTjBhaUlIS0FJRUlnVWdCaWdDREVZRVFDQUJLQUlrUVFKSERRUWdCeTBBQUVFSWNVVU5CQ0FEUVlBR2FpSUNRVEFRRVNBQ0lBQWdCaWdDREJBWUVCMUJBUXdEQ3lBRlFYNXhRZElBUmcwRElBSkJBV29oQWd3QkN3c2dBMEdBQm1vaUFrRS9FQkVnQWlBQUlBWW9BZ3dRR0JBZElBWXRBQVJCQm5RaUFrR0FmM0VnQWtIQUFISWdCaWdDQUVFQVNCc0xRZjhCY1JBUkN5QUVRUUZxSVFRTUFRc0xBMEFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnRGlBSUlnSktCRUFnQWlBQ0lBMXFJZ2t0QUFBaUJFRUNkRUdBdUFGcUxRQUFJZzlxSVFnQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUVRYk1CYXc0UUZBVU5CQUVCQVFFQ0FRRURBd01VQ3dBTElBUkJFV3NpQWtFZlN3ME9RUUVnQW5SQmdJRFFqSHh4RFE4Z0FrVU5DeUFDUVFWSERRNGdBMEYvTmdJWUlBTkN5ZnFBZ09BQk53TVFJQU5CM0FWcUlBZ2dBMEVRYWhBblJRMFJJQU5CZ0FacUlBTXRBT3dGRUJFZ0F5Z0M1QVVoQ0NBREtBTG9CU0lDUVg5R0lBSWdCa1p5RFJNZ0FTQUJLQUxjQWtFQmFqWUMzQUlnQTBHQUJtb2lCRUhDQVJBUklBUWdBaEFkSUFJaEJnd1RDeUFBSUFFZ0NTZ0FBU0lDSUFrdkFBVWdCQ0FEUVlBR2FrRUFRUUFnQ0JEcEJDRUlJQUFnQWhBVERCSUxJQWt2QUFraEJ5QUpLQUFCSVFJZ0FTZ0NwQUlnQ1NnQUJVRVViR29pQkNBRUtBSUFRUUZyTmdJQUlBQWdBU0FDSUFkQnV3RWdBMEdBQm1vZ0RTQUVJQWdRNlFRaENDQUFJQUlRRXd3UkN5QUFJQU5CbUFacUlBTkJuQVpxSUFFZ0NTZ0FBU0lISUFrdkFBVWlDUkRvQkNJRlFRQklEUVVnQXlnQ25BWWlDa1VOQkFKQUFrQUNRQUpBQWtBZ0JFRytBV3NPQXdBQUFRSUxBa0FDUUFKQUlBcEJCV3NPQlFBQkFnVUNCQXNnQkVHL0FVWUVRQ0FEUVlBR2FrRVJFQkVMSUFOQmdBWnFJZ0lnQXlnQ21BWWdCUkNsQWlBQ1FjUUFFQkVNQlFzZ0EwR0FCbW9pQWlBREtBS1lCaUFGRUtVQ0lBSkJMQkFSSUFSQnZ3RkdEUVFnQTBHQUJtcEJEeEFSREFRTElBUkJ2d0ZHQkVBZ0EwR0FCbXBCRVJBUkN5QURRWUFHYWlJQ0lBTW9BcGdHSUFVUXBRSWdBa0VzRUJFZ0FrRWtFQkVnQWtFQUVDb01Bd3NDUUFKQUFrQWdDa0VGYXc0RkFBRUJBZ0lEQ3lBRFFZQUdhaUlDSUFNb0FwZ0dJQVVRcFFJZ0FrSEZBQkFSREFRTElBTkJnQVpxSWdKQk1CQVJJQUlnQUNBSEVCZ1FIU0FDUVFBUUVRd0RDeUFBSUFjUTV3UWlCRVVOQ0NBQUlBTkJtQVpxSUFOQm5BWnFJQUVnQkNBSkVPZ0VJUVVnQUNBRUVCTWdCVUVBU0EwSUlBTW9BcHdHUVFoSERRWWdBMEdBQm1vaUFpQURLQUtZQmlBRkVLVUNJQUpCR3hBUklBSkJIaEFSSUFKQkxCQVJJQUpCSFJBUklBSkJKQkFSSUFKQkFSQXFEQUlMRUFFQUN5QURRWUFHYWlJQ1FUQVFFU0FDSUFBZ0J4QVlFQjBnQWtFQUVCRUxJQUFnQnhBVERCQUxJQWtvQUFFaUFrRUFTQTBCSUFJZ0FTZ0NyQUpPRFFFZ0FTZ0NwQUlnQWtFVWJHb2dBeWdDaEFZZ0QybzJBZ2dNRFF0QkFDRUZRUUFoQWlBSkx3QUJJZzhnQVNnQzhBRkhEUWdEUUNBQktBS0lBU0FDU2dSQUlBRW9Bb0FCSUFKQkJIUnFJZ1F0QUE5QndBQnhSUVJBSUFOQmdBWnFJZ2RCQXhBUklBY2dCQ2dDREVFQmRFRUlkUkFkSUFkQjNBQVFFU0FISUFKQi8vOERjUkFxQ3lBQ1FRRnFJUUlNQVFzTEEwQWdCU0FCS0FKOFRrVUVRQUpBSUFFb0FuUWdCVUVFZEdvaUFpZ0NCQTBBSUFJdEFBOUJ3QUJ4RFFBZ0EwR0FCbW9pQkVFREVCRWdCQ0FDS0FJTVFRRjBRUWgxRUIwZ0JFSFpBQkFSSUFRZ0JVSC8vd054RUNvTElBVkJBV29oQlF3QkN3c0NRQ0FCS0FLVUEwVUVRRUYvSVFzTUFRc2dBVUYvRU1nRElRc2dBMEdBQm1vaUFrRUlFQkVnQWtIcEFCQVJJQUlnQ3hBZElBRWdDMEVCRUdrYUlBRWdBU2dDMEFKQkFXbzJBdEFDQzBFQUlRUURRQUpBQWtBZ0FTZ0M5QUVnQkVvRVFFRUFJUUlnQVNnQ3dBSWlCMEVBSUFkQkFFb2JJUWNnQVNnQy9BRWdCRUVFZEdvaUNTMEFCQ0lRUVFGeElRb0Nmd05BSUFJZ0IwY0VRQ0FCS0FMSUFpQUNRUU4wYWlnQ0JDSUZJQWtvQWd4R0JFQkJBQ0VLSUFJaEIwRUNEQU1MSUFWQmZuRkIwZ0JHQkVBZ0EwR0FCbW9pQlVIZUFCQVJJQVVnQWtILy93TnhFQ3BCQVNFS0lBSWhCMEVCREFNRklBSkJBV29oQWd3Q0N3QUxDeUFCS0FJa1FRQkhJUkVnRUVFQ2NTSUNSU0FKS0FJQVFRQk9jUTBDSUFOQmdBWnFJZ1ZCUGhBUklBVWdBQ0FKS0FJTUVCZ1FIU0FGUVlCL1FZSi9JQkJCQkhFYlFRQWdBaHNnRVhKQmd3RnhFQkZCQUFzaEJTQUtSU0FKS0FJQUlnSkJBRWh4RFFJQ1FDQUNRUUJPQkVBZ0EwR0FCbW9pQWtFREVCRWdBaUFKS0FJQUVCMGdDU2dDREVIOEFFY05BU0FEUVlBR2FpSUNRYzBBRUJFZ0FrRVdFQjBNQVFzZ0EwR0FCbXBCQmhBUkN3SkFBa0FDUUNBRlFRRnJEZ0lCQUFJTElBTkJnQVpxSWdKQjN3QVFFU0FDSUFkQi8vOERjUkFxREFRTElBTkJnQVpxSWdKQnpBQVFFU0FDSUFBZ0NTZ0NEQkFZRUIwZ0FrRU9FQkVNQXdzZ0EwR0FCbW9pQWtFNUVCRWdBaUFBSUFrb0Fnd1FHQkFkREFJTElBRW9BcFFEQkVBZ0EwR0FCbW9pQWtFcEVCRWdBa0cyQVJBUklBSWdDeEFkSUFFb0FxUUNJQXRCRkd4cUlBTW9Bb1FHTmdJSUN5QUFLQUlRSWdKQkVHb2dBU2dDL0FFZ0FpZ0NCQkVBQUNBQlFnQTNBdlFCSUFGQkFEWUMvQUVNQ3dzZ0EwR0FCbW9pQWtFREVCRWdBaUFKS0FJQUVCMGdBa0hBQUJBUklBSWdBQ0FKS0FJTUVCZ1FIU0FDSUJFUUVRc2dBQ0FKS0FJTUVCTWdCRUVCYWlFRURBQUxBQXRCaFNsQnJ2d0FRWXp5QVVIN09SQUFBQXRCbW9JQlFhNzhBRUhZNndGQjMvUUFFQUFBQzBHdWhBRkJydndBUVp2ckFVSGY5QUFRQUFBTEEwQWdBaUFPVGtVRVFDQURRWUFHYWlBQ0lBMXFJZ1FnQkMwQUFFRUNkRUdBdUFGcUxRQUFJZ1FRY2lBQ0lBUnFJUUlNQVFzTElBd1E5Z0VnRENBREtRT1FCamNDRUNBTUlBTXBBNGdHTndJSUlBd2dBeWtEZ0FZM0FnQU1EQXNnREJEMkFTQU1JQU1wQTVBR053SVFJQXdnQXlrRGlBWTNBZ2dnRENBREtRT0FCamNDQUFKQUlBRW9Bb3dDRFFBZ0FTZ0NwQUloRFNBRElBRW9BdkFDTmdLWUJpQURJQUVvQW9BQ0lnazJBdHdGSUFNZ0FTZ0NoQUlpQ3pZQzRBVWdBQ2dDRUNFQ0lBTkNBRGNEaUFZZ0EwSUFOd09BQmlBRElBSTJBcFFHSUFOQk96WUNrQVlnQVNnQzBBSWlBZ1JBSUFFZ0FTZ0NBQ0FDUVFSMEVGOGlBallDekFJZ0FrVU5EUXNDUUNBQktBTGNBaUlDUlEwQUlBRXRBRzVCQW5FTkFDQUJJQUVvQWdBZ0FrRURkQkJmSWdJMkF0Z0NJQUpGRFEwZ0FVRUFOZ0xvQWlBQklBRW9BdkFDTmdMa0Fnc2dBU2dDdEFGQkFFNEVRQ0FEUVlBR2FpSUNRUXdRRVNBQ1FRUVFFU0FDUWRrQUlBRW9BclFCRUYwTElBRW9BckFCUVFCT0JFQWdBMEdBQm1vaUFrRU1FQkVnQWtFQ0VCRWdBa0haQUNBQktBS3dBUkJkQ3lBQktBS3NBVUVBVGdSQUlBTkJnQVpxSWdKQkRCQVJJQUpCQXhBUklBSkIyUUFnQVNnQ3JBRVFYUXNDUUNBQktBS29BVUVBU0EwQUlBRW9BbUFFUUNBRFFZQUdhaUlDUWVFQUVCRWdBaUFCTHdHb0FSQXFEQUVMSUFOQmdBWnFJZ0pCQ0JBUklBSkIyUUFnQVNnQ3FBRVFYUXNnQVNnQ21BRkJBRTRFUUVFQUlRSWdBUzBBYmtFQmNVVUVRQ0FCS0FJNFFRQkhJUUlMSUFOQmdBWnFJZ1JCREJBUklBUWdBaEFSSUFFb0Fwd0JJZ0pCQUU0RVFDQURRWUFHYWtIYUFDQUNFRjBMSUFOQmdBWnFRZGtBSUFFb0FwZ0JFRjBMSUFFb0FxQUJRUUJPQkVBZ0EwR0FCbW9pQWtFTUVCRWdBa0VDRUJFZ0FrSFpBQ0FCS0FLZ0FSQmRDeUFCS0FLUUFVRUFUZ1JBSUFOQmdBWnFJZ0pCREJBUklBSkJCUkFSSUFKQjJRQWdBU2dDa0FFUVhRc2dBU2dDbEFGQkFFNEVRQ0FEUVlBR2FpSUNRUXdRRVNBQ1FRVVFFU0FDUWRrQUlBRW9BcFFCRUYwTFFRQWhBZ0pBQTBBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBaUFMVGdSQVFRQWhBaUFCS0FLc0FpSUVRUUFnQkVFQVNoc2hCQU5BSUFJZ0JFWU5BaUFDUVJSc0lRWWdBa0VCYWlFQ0lBWWdEV29vQWhCRkRRQUxRZFdEQVVHdS9BQkIvZm9CUVpRNEVBQUFDeUFDSUFJZ0NXb2lCaTBBQUNJRlFRSjBRWUM0QVdvdEFBQWlCMm9oQkFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdCVUhZQUdzT0lCQVNHaEVTR2hFU0dob2FHaG9hR2hvYUJBUUJBd0lhR2d3TUJRVUZCUVVGQUFzQ1FDQUZRUUZyRGhVSkNnb0xHZzBIR2dnSUdob2FCaG9hRHhvYUdnNEFDeUFGUVNKcklnaEJIMHNOR0VFQklBaDBJZ3BCd09FQmNRMFNJQXBCQlhGRkJFQWdDRUVmUncwWklBWW9BQUZCTUVjTkdpQUJJQU1vQW9RR0lBTW9BcGdHRURNZ0EwR0FCbXBCNlFFUUVTQUVJUUlNSXdzZ0JpOEFBU0VDSUFOQ3FJQ0FnSEEzQTFBZ0EwSGNCV29nQkNBRFFkQUFhaEFuQkVBQ1FDQURLQUxvQlNJRVFRQklCRUFnQXlnQ21BWWhCQXdCQ3lBRElBUTJBcGdHQ3lBQklBTW9Bb1FHSUFRUU15QURRWUFHYWlBRlFRRnFJQUlRWFNBQklBa2dDeUFES0FMa0JTQURRWmdHYWhDa0FpRUNEQ01MSUFFZ0F5Z0NoQVlnQXlnQ21BWVFNeUFEUVlBR2FpQUZJQUlRWFNBRUlRSU1JZ3NnQmlnQUFTRUZJQVFoQmd3V0N5QUdLQUFCSVFkQjdRQWhCUXdVQ3lBR0tBQUJJUWRCN0FBaEJRd1RDeUFCSUFZb0FBRWdBMEdjQm1wQkFCREhBeUVISUFNb0F0d0ZJQU1vQXVBRklBUWdCeERHQXdSQUlBRWdCMEYvRUdrYUlBTkJnQVpxUVE0UUVTQUVJUUlNSHdzZ0EwTHJnSUNBY0RjRFlDQURRZHdGYWlBRUlBTkI0QUJxRUNkRkRSSWdBeWdDNkFVaENDQURLQUxjQlNBREtBTGdCU0FES0FMa0JTSUdJQWNReGdORkRSSWdDRUVBVGdSQUlBTWdDRFlDbUFZTElBRWdCMEYvRUdrYUlBVkJBM01oQlNBREtBTDBCU0VIREJ3TElBWXRBQWtoQ0NBR0tBQUJJUWNnQVNBR0tBQUZJQU5CbkFacVFRQVF4d01pQWtFQVNBMFBJQUlnQVNnQ3JBSk9EUThnQVNBREtBS0VCaUFES0FLWUJoQXpJQUVnQVNnQzFBSWlCa0VCYWpZQzFBSWdBU2dDekFJZ0JrRUVkR29pQmtFRU5nSUVJQVlnQlRZQ0FDQURLQUtFQmlFS0lBWWdBallDRENBR0lBcEJCV28yQWdnZ0EwR0FCbW9pQmlBRkVCRWdCaUFIRUIwZ0JpQU5JQUpCRkd4cUlnSW9BZ3dnQXlnQ2hBWnJFQjBnQWlnQ0RFRi9SZ1JBSUFBZ0FpQURLQUtFQmtFRWEwRUVFT2dDUlEwZEN5QURRWUFHYWlBSUVCRWdCQ0VDREIwTElBTkNxWUNBZ0hBM0EzQWdBMEhjQldvZ0JDQURRZkFBYWhBblJRMFRJQVFoQWlBREtBTG9CU0lFUVFCSURSd2dBeUFFTmdLWUJnd2NDeUFEUXF1QmdJQndOd09nQVNBRFFkd0ZhaUFFSUFOQm9BRnFFQ2NFUUFKQUlBTW9BdWdGSWdKQkFFZ0VRQ0FES0FLWUJpRUNEQUVMSUFNZ0FqWUNtQVlMSUFFZ0F5Z0NoQVlnQWhBeklBTkJnQVpxUWZNQkVCRU1HQXNnQTBGL05nS1lBU0FEUXF5QmdJQ1F6Um8zQTVBQklBTkIzQVZxSUFRZ0EwR1FBV29RSjBVTkFBSkFJQU1vQXVnRklnVkJBRWdFUUNBREtBS1lCaUVGREFFTElBTWdCVFlDbUFZTElBRWdBeWdDaEFZZ0JSQXpJQU5CZ0FacVFmTUJFQkVnQXlnQzdBVkJBM01oQlF3WUN5QURRdW5VZ1lCd053T0FBU0FEUWR3RmFpQUVJQU5CZ0FGcUVDZEZEUkVnQlVFS1JpRUtEQTBMQWtBZ0JpZ0FBU0lHUVlDQWdJQjRja0dBZ0lDQWVFWU5BQ0FEUW95QmdJQndOd1BnQVNBRFFkd0ZhaUFFSUFOQjRBRnFFQ2RGRFFBZ0F5Z0M2QVVpQWtFQVRnUkFJQU1nQWpZQ21BWUxJQU5Dam9DQWdIQTNBOUFCSUFOQjNBVnFJQU1vQXVRRklBTkIwQUZxRUNjRVFDQURLQUxvQlNJQ1FRQklEUmNnQXlBQ05nS1lCZ3dYQ3lBQklBTW9Bb1FHSUFNb0FwZ0dFRE1nQTBHQUJtcEJBQ0FHYXhERkF3d1dDeUFEUW82QWdJQndOd1BBQVNBRFFkd0ZhaUFFSUFOQndBRnFFQ2NFUUNBREtBTG9CU0lDUVFCSURSWWdBeUFDTmdLWUJnd1dDeUFEUXVuVWdZQndOd093QVNBRFFkd0ZhaUFFSUFOQnNBRnFFQ2NFUUNBR1FRQkhJUW9NRFFzZ0FTQURLQUtFQmlBREtBS1lCaEF6SUFOQmdBWnFJQVlReFFNZ0JDRUNEQmtMSUFZb0FBRWlBa0gvQVVvTkR5QUJJQU1vQW9RR0lBTW9BcGdHRURNZ0EwR0FCbW9pQmlBRlFjTUFhMEgvQVhFUUVTQUdJQUpCL3dGeEVCRWdCQ0VDREJnTElBWW9BQUVoQWlBRFFvNkFnSUJ3TndQd0FTQURRZHdGYWlBRUlBTkI4QUZxRUNjRVFDQUFJQUlRRXlBREtBTG9CU0lDUVFCSURSUWdBeUFDTmdLWUJnd1VDeUFDUVM5SERRNGdBU0FES0FLRUJpQURLQUtZQmhBeklBTkJnQVpxUWNFQkVCRWdCQ0VDREJjTElBTkN5WUNBZ0hBM0E2Z0NJQU5DMkxiNWduQTNBNkFDSUFOQjNBVnFJQVFpQWlBRFFhQUNhaEFuRFJZZ0EwRi9OZ0tZQWlBRFFvR0VrSUNRQ1RjRGtBSWdBMEhjQldvZ0FpQURRWkFDYWhBbkRSWWdBMEYvTmdLSUFpQURRb2FPcU1pUUNUY0RnQUlnQTBIY0JXb2dBaUFEUVlBQ2FoQW5EUllNRFFzZ0EwS09nSUNBY0RjRDhBSWdBMEhjQldvZ0JDQURRZkFDYWhBbkJFQWdBeWdDNkFVaUFrRUFTQTBTSUFNZ0FqWUNtQVlNRWdzZ0EwS29nSUNBY0RjRDRBSWdBMEhjQldvZ0JDQURRZUFDYWhBbkJFQUNRQ0FES0FMb0JTSUNRUUJJQkVBZ0F5Z0NtQVloQWd3QkN5QURJQUkyQXBnR0N5QUJJQU1vQW9RR0lBSVFNeUFEUVlBR2FrRXBFQkVNRWdzZ0EwTHAxSUdBY0RjRDBBSkJBQ0VLSUFOQjNBVnFJQVFnQTBIUUFtb1FKdzBJSUFOQ3E0R0FnSEEzQThBQ0lBTkIzQVZxSUFRZ0EwSEFBbW9RSndSQUFrQWdBeWdDNkFVaUFrRUFTQVJBSUFNb0FwZ0dJUUlNQVFzZ0F5QUNOZ0tZQmdzZ0FTQURLQUtFQmlBQ0VETWdBMEdBQm1wQjhnRVFFUXdTQ3lBRFFYODJBcmdDSUFOQ3JJR0FnSkROR2pjRHNBSWdBMEhjQldvZ0JDQURRYkFDYWhBblJRME1Ba0FnQXlnQzZBVWlCVUVBU0FSQUlBTW9BcGdHSVFVTUFRc2dBeUFGTmdLWUJnc2dBU0FES0FLRUJpQUZFRE1nQTBHQUJtcEI4Z0VRRVNBREtBTHNCVUVEY3lFRkRCSUxJQU5CZnpZQ2lBTWdBMExEOW9DQTRBRTNBNEFESUFOQjNBVnFJQVFnQTBHQUEyb1FKMFVOQ3dKQUlBTW9BdWdGSWdKQkFFZ0VRQ0FES0FLWUJpRUNEQUVMSUFNZ0FqWUNtQVlMSUFFZ0F5Z0NoQVlnQWhBeklBTkJnQVpxSWdJZ0F5MEE3QVVRRVNBQ0lBTW9BdndGRUIwTUVBc2dBMEYvTmdLNEF5QURRdG00L1lKd053T3dBeUFEUWR3RmFpQUVJQU5Cc0FOcUVDZEZEUW9nQXlnQzZBVWlBa0VBVGdSQUlBTWdBallDbUFZTElBTkNqb0NBZ0hBM0E2QURJQU1vQXV3RklnVkJBV29oQmdKQUlBTkIzQVZxSUFNb0F1UUZJZ0lnQTBHZ0Eyb1FKd1IvSUFNb0F1Z0ZJZ0pCQUU0RVFDQURJQUkyQXBnR0N5QURJQU1vQXZBRk5nS1VBMEYvSVFRZ0EwRi9OZ0tZQXlBRElBVkJBV3MyQXBBRElBTkIzQVZxSUFNb0F1UUZJZ0lnQTBHUUEyb1FKMFVOQVNBREtBTGtCU0VDSUFNb0F1Z0ZCVUYvQ3lFRUlBWWhCUXNnQVNBREtBS0VCaUFES0FLWUJoQXpJQU5CZ0FacUlBVWdBeWdDOEFVUVhTQUVRUUJJRFJNZ0F5QUVOZ0tZQmd3VEN5QUdMd0FCSWdKQi93RkxEUWtnQTBLT2dJQ0FjRGNDekFRZ0F5QUNOZ0xJQkNBRFFwQ2pnb0NRQ3pjRHdBUUNRQ0FEUWR3RmFpQUVJQU5Cd0FScUVDZEZCRUFnQTBLT2dJQ0FjRGNEc0FRZ0F5QUNOZ0tzQkNBRFFka0FOZ0tvQkNBRFFvNmZnb0NRQWpjRG9BUWdBMEhjQldvZ0JDQURRYUFFYWhBblJRMEJDd0pBSUFNb0F1Z0ZJZ1ZCQUVnRVFDQURLQUtZQmlFRkRBRUxJQU1nQlRZQ21BWUxJQUVnQXlnQ2hBWWdCUkF6SUFOQmdBWnFJZ1pCa3dGQmt3RkJrZ0VnQXlnQzdBVWlCRUdSQVVZYklBUkJqd0ZHR3hBUklBWWdBa0gvQVhFUUVRd1BDeUFEUW82QWdJQndOd0tVQkNBRElBSTJBcEFFSUFOQ2tZQ0FnSkFMTndPSUJDQURRb1NBZ0lEUUV6Y0RnQVFnQTBIY0JXb2dCQ0FEUVlBRWFoQW5CRUFDUUNBREtBTG9CU0lGUVFCSUJFQWdBeWdDbUFZaEJRd0JDeUFESUFVMkFwZ0dDeUFCSUFNb0FvUUdJQVVRTXdKQUlBTW9BdndGUVM5R0JFQWdBMEdBQm1wQndRRVFFUXdCQ3lBRFFZQUdhaUlFUVFRUUVTQUVJQU1vQXZ3RkVCMExJQU5CZ0FacUlnUkJsQUVRRVNBRUlBSkIvd0Z4RUJFTUR3c2dBMEtPZ0lDQWNEY0M5QU1nQXlBQ05nTHdBeUFEUXBHQWdJQ1FDemNENkFNZ0EwS0JnSUNBMEJNM0ErQURJQU5CM0FWcUlBUWdBMEhnQTJvUUp3UkFBa0FnQXlnQzZBVWlCVUVBU0FSQUlBTW9BcGdHSVFVTUFRc2dBeUFGTmdLWUJnc2dBU0FES0FLRUJpQUZFRE1nQTBHQUJtb2lCQ0FES0FMMEJSREZBeUFFUVpRQkVCRWdCQ0FDUWY4QmNSQVJEQThMSUFOQ2pvQ0FnSEEzQTlnRElBTWdBallDMUFNZ0EwSFpBRFlDMEFNZ0EwS2RnWUNBa0FJM0E4Z0RJQU5DMkxiNWduQTNBOEFESUFOQjNBVnFJQVFnQTBIQUEyb1FKd1JBQWtBZ0F5Z0M2QVVpQlVFQVNBUkFJQU1vQXBnR0lRVU1BUXNnQXlBRk5nS1lCZ3NnQVNBREtBS0VCaUFGRURNZ0EwR0FCbW9pQkNBREtBTHNCU0FES0FMd0JSQmRJQVJCbEFFUUVTQUVJQUpCL3dGeEVCRU1Ed3NnQVNBREtBS0VCaUFES0FLWUJoQXpJQU5CZ0FacVFkZ0FJQUlRWFNBRUlRSU1FZ3NnQmk4QUFTRUNJQUVnQXlnQ2hBWWdBeWdDbUFZUU15QURRWUFHYWlBRklBSVFYU0FFSVFJTUVRc2dBeUFHTHdBQklnSTJBdVFFSUFOQmZ6WUM2QVFnQXlBRlFRRnJOZ0xnQkNBRFFkd0ZhaUFFSUFOQjRBUnFFQ2NFUUFKQUlBTW9BdWdGSWdSQkFFZ0VRQ0FES0FLWUJpRUVEQUVMSUFNZ0JEWUNtQVlMSUFFZ0F5Z0NoQVlnQkJBeklBTkJnQVpxSUFWQkFXb2dBaEJkREEwTElBRWdBeWdDaEFZZ0F5Z0NtQVlRTXlBRFFZQUdhaUFGSUFJUVhTQUVJUUlNRUFzZ0FTQUpJQXNnQkNBRFFaZ0dhaENrQWlFRURBWUxJQUVvQXRRQ0lRc2dBU2dDekFJaEJrRUFJUXBCQUNFSkEwQUNRQ0FLSUF0SUJFQkJBeUVJSUFZb0FnQWlBa0hwQUd0QkEwOEVRQ0FDUWUwQlJ3MENRUUVoQ0FzQ1FDQUJLQUtrQWlBR0tBSU1RUlJzYWlnQ0RDQUdLQUlJSWdWcklnUkJnSDlJSUFRZ0NFSC9BR3BLY2tVRVFDQUdRUUUyQWdRZ0FrSHRBVVlFUUVIc0FTRUNJQVpCN0FFMkFnQU1BZ3NnQmlBQ1FZRUJhaUlDTmdJQURBRUxJQUpCNndCSElBUkJnSUFDYWtILy93TkxjZzBDSUFaQzdZR0FnQ0EzQWdCQkFpRUlRZTBCSVFJTElBVWdBeWdDZ0FacVFRRnJJQUk2QUFBZ0JpZ0NCQ0lDSUFNb0FvQUdJQVZxYWlJRUlBUWdDR29nQXlnQ2hBWWdCU0FJYWlBQ2Ftc1FuQUVnQXlBREtBS0VCaUFJYXpZQ2hBWkJBQ0VFSUFFb0Fxd0NJZ0pCQUNBQ1FRQktHeUVISUFFb0FxUUNJUUlEUUNBRUlBZEdCRUFnQVNnQzFBSWhDeUFHSVFjZ0NpRUVBMEFDUUNBTElBUkJBV29pQkV3RVFFRUFJUUlnQVNnQzRBSWlCRUVBSUFSQkFFb2JJUVFEUUNBQ0lBUkdEUUlnQlNBQktBTFlBaUFDUVFOMGFpSUhLQUlBSWcxSkJFQWdCeUFOSUFock5nSUFDeUFDUVFGcUlRSU1BQXNBQ3lBSElnSkJFR29oQnlBQ0tBSVlJZzBnQlV3TkFTQUNJQTBnQ0dzMkFoZ01BUXNMSUFsQkFXb2hDUXdEQ3lBRklBSW9BZ3dpQzBnRVFDQUNJQXNnQ0dzMkFnd0xJQUpCRkdvaEFpQUVRUUZxSVFRTUFBc0FDd0pBSUFsRkRRQWdBU2dDekFJaEFrRUFJUVVEUUNBRklBdE9EUUVnQVNnQ3BBSWdBaWdDREVFVWJHb29BZ3dnQWlnQ0NDSUVheUVHQWtBQ1FBSkFBa0FnQWlnQ0JFRUJhdzRFQUFFREFnTUxJQU1vQW9BR0lBUnFJQVk2QUFBZ0FTZ0MxQUloQ3d3Q0N5QURLQUtBQmlBRWFpQUdPd0FBREFFTElBTW9Bb0FHSUFScUlBWTJBQUFMSUFKQkVHb2hBaUFGUVFGcUlRVU1BQXNBQ3lBQUtBSVFJZ0pCRUdvZ0FTZ0N6QUlnQWlnQ0JCRUFBQ0FCUVFBMkFzd0NJQUFvQWhBaUFrRVFhaUFCS0FLa0FpQUNLQUlFRVFBQUlBRkJBRFlDcEFJQ1FDQUJMUUJ1UVFKeERRQWdBU2dDMkFKRkRRQWdBU2dDQUNnQ0VDRUNJQUZDQURjQzlBSWdBVUlBTndMOEFpQUJJQUkyQW9nRElBRkJPellDaEFNZ0FVSDBBbW9oQlNBQktBTHdBaUVIUVFBaEFrRUFJUWdEUUNBQ0lBRW9BdUFDVGcwQkFrQWdBU2dDMkFJZ0FrRURkR29pQmlnQ0JDSUVRUUJJSUFRZ0IwWnlEUUFnQmlnQ0FDSUdJQWhySWdwQkFFZ05BQUpBSUFRZ0Iyc2lDRUVCYWlJSFFRUkxJQXBCTWt0eVJRUkFJQVVnQnlBS1FRVnNha0VCYWtIL0FYRVFFUXdCQ3lBRlFRQVFFU0FGSUFvUTVnUWdCU0FJUVFGMElBaEJIM1Z6RU9ZRUN5QUdJUWdnQkNFSEN5QUNRUUZxSVFJTUFBc0FDeUFBS0FJUUlnSkJFR29nQVNnQzJBSWdBaWdDQkJFQUFDQUJRUUEyQXRnQ0lBd1E5Z0VnRENBREtRT1FCamNDRUNBTUlBTXBBNGdHTndJSUlBd2dBeWtEZ0FZM0FnQWdBVUVCTmdLZ0FpQUJLQUtNQWcwU0lBRW9Bb0FDSVFjZ0F5QUJLQUtFQWlJRU5nTGNCU0FESUFBZ0JFRUJkQkFwSWdZMkF1UUZJQVpGRFI1QkFDRUNJQVJCQUNBRVFRQktHeUVFQTBBZ0FpQUVSa1VFUUNBR0lBSkJBWFJxUWYvL0F6c0JBQ0FDUVFGcUlRSU1BUXNMSUFOQkFEWUM4QVVnQTBJQU53TG9CU0FEUVFBMkF1QUZBa0FnQUNBRFFkd0Zha0VBUVFCQkFCRERBUTBBQTBBQ1FBSkFBa0FnQXlnQzdBVWlBa0VBU2dSQUlBTWdBa0VCYXlJQ05nTHNCU0FISUFNb0F1Z0ZJQUpCQW5ScUtBSUFJZ1JxSWdndEFBQWlBa0VLYWtIL0FYRkJDMGtFUUVIZ2t3RWhCUXdFQ3lBRUlBSkJEMm9nQWlBQ1FiTUJTeHNpQmtFQ2RDSUtRWUM0QVdvdEFBQnFJZ2tnQXlnQzNBVktCRUJCKzVJQklRVU1CQXNnQXlnQzVBVWdCRUVCZEdvdkFRQWhEQ0FLUVlHNEFXb3RBQUFoQlFKQUlBWkJJV3NpQzBFUVMwRUJJQXQwUWIrQUJIRkZja1VFUUNBSUx3QUJJQVZxSVFVTUFRc2dCa0g5QVd0QkEwc05BQ0FDSUFWcVFlNEJheUVGQ3lBRklBeEtCRUJCd1pNQklRVU1CQXNDUUNBS1FZSzRBV290QUFBZ0JXc2dER29pQmlBREtBTGdCVXdOQUNBRElBWTJBdUFGSUFaQi92OERUQTBBUWFPVEFTRUZEQVFMQWtBQ1FBSkFBa0FDUUFKQUFrQWdBa0hwQUdzT0R3SUNBUUlEQ3drSkNRUUdCQVVGQlFBTElBSkJJMnNpQlVFTlN3MEhRUUVnQlhSQjVmQUFjUTBLREFjTElBUWdDQ2dBQVdwQkFXb2hDUXdIQ3lBQUlBTkIzQVZxSUFRZ0NDZ0FBV3BCQVdvZ0FpQUdFTU1CUlEwR0RBa0xJQUFnQTBIY0JXb2dCQ0FJS0FBQmFrRUJhaUFDSUFaQkFXb1F3d0ZGRFFVTUNBc2dBQ0FEUWR3RmFpQUVJQWdvQUFWcVFRVnFJQUlnQmtFQmFoRERBVVVOQkF3SEN5QUFJQU5CM0FWcUlBUWdDQ2dBQldwQkJXb2dBaUFHUVFKcUVNTUJSUTBEREFZTElBQWdBMEhjQldvZ0JDQUlLQUFGYWtFRmFpQUNJQVpCQVdzUXd3RU5CUXdDQ3lBQUtBSVFJZ0pCRUdvZ0F5Z0M1QVVnQWlnQ0JCRUFBQ0FBS0FJUUlnSkJFR29nQXlnQzZBVWdBaWdDQkJFQUFFSEFBRUhZQUNBQkxRQnVRUUp4SWdRYklnZ2dBU2dDdUFKQkEzUnFJUUlnQXlnQzRBVWhDaUFBQW44Z0JBUkFJQUlnQVNnQ1JFVU5BUm9MSUFFb0Fud2dBU2dDaUFGcVFRUjBJQUpxQ3lJSElBRW9Bc0FDUVFOMGFpSUVJQUVvQW9RQ2FoQmZJZ1pGRFNNZ0JrRUJOZ0lBSUFZZ0JDQUdhaUlFTmdJVUlBWWdBU2dDaEFJaUJUWUNHQ0FFSUFFb0FvQUNJQVVRSHhvZ0FDZ0NFQ0lFUVJCcUlBRW9Bb0FDSUFRb0FnUVJBQUFnQVVFQU5nS0FBaUFHSUFFb0FuQTJBaHdnQVNnQ2ZDSUVJQUVvQW9nQklnVnFRUUJLQkVBQ1FBSkFJQUV0QUc1QkFuRkZEUUFnQVNnQ1JBMEFRUUFoQlFOQUlBUWdCVXdFUUVFQUlRVURRQ0FCS0FLSUFTQUZUQVJBUVFBaEJRTkFJQVVnQVNnQ3dBSk9EUVlnQUNBRlFRTjBJZ0lnQVNnQ3lBSnFLQUlFRUJNZ0FTZ0N5QUlnQW1wQkFEWUNCQ0FGUVFGcUlRVU1BQXNBQlNBQUlBRW9Bb0FCSUFWQkJIUnFLQUlBRUJNZ0JVRUJhaUVGREFFTEFBc0FCU0FBSUFFb0FuUWdCVUVFZEdvb0FnQVFFeUFGUVFGcUlRVWdBU2dDZkNFRURBRUxBQXNBQ3lBR0lBSWdCbW9pQWpZQ0lDQUNJQUVvQW9BQklBVkJCSFFRSHhvZ0JpZ0NJQ0FCS0FLSUFVRUVkR29nQVNnQ2RDQUJLQUo4UVFSMEVCOGFDeUFHSUFFb0FudzdBU29nQmlBQktBS0lBVHNCS0NBR0lBRW9Bb3dCT3dFc0lBQW9BaEFpQWtFUWFpQUJLQUtBQVNBQ0tBSUVFUUFBSUFBb0FoQWlBa0VRYWlBQktBSjBJQUlvQWdRUkFBQUxJQVlnQVNnQ3VBSWlBallDT0NBQ0JFQWdCaUFHSUFocUlnUTJBalFnQkNBQktBSzBBaUFDUVFOMEVCOGFDeUFBS0FJUUlnSkJFR29nQVNnQ3RBSWdBaWdDQkJFQUFDQUJRUUEyQXJRQ0lBWWdDanNCTGdKQUlBRXRBRzVCQW5FRVFDQUFJQUVvQXV3Q0VCTWdBVUgwQW1vUTlnRU1BUXNnQmlBR0x3QVJRWUFJY2pzQUVTQUdJQUVvQXV3Q05nSkFJQVlnQVNnQzhBSTJBa1FnQmlBQUlBRW9BdlFDSUFFb0F2Z0NFSWtDSWdJMkFsQWdBa1VFUUNBR0lBRW9BdlFDTmdKUUN5QUdJQUVvQXZnQ05nSk1JQVlnQVNnQ2pBTTJBbFFnQmlBQktBS1FBellDU0FzZ0FTZ0N6QUVpQWlBQlFkQUJha2NFUUNBQUtBSVFJZ1JCRUdvZ0FpQUVLQUlFRVFBQUN5QUdJQUVvQXNBQ0lnSTJBandnQWdSQUlBWWdCaUFIYWlJRU5nSWtJQVFnQVNnQ3lBSWdBa0VEZEJBZkdnc2dBQ2dDRUNJQ1FSQnFJQUVvQXNnQ0lBSW9BZ1FSQUFBZ0FVRUFOZ0xJQWlBR0lBWXZBQkZCZm5FZ0FTOEJORUVCY1hJaUFqc0FFU0FHSUFFdkFUaEJBWFJCQW5FZ0FrRjljWElpQWpzQUVTQUdJQUV0QUc0NkFCQWdCaUFCTHdGZ1FRSjBRUVJ4SUFKQmUzRnlJZ0k3QUJFZ0JpQUNRVTl4SUFFdkFXeEJCSFJCTUhGeUlnSTdBQkZCQ0NFRklBWWdBU2dDdEFGQkFFZ0VmeUFCS0FLNEFVRUFSMEVEZEFWQkNBc2dBa0YzY1hJaUFqc0FFU0FHSUFFdkFWQkJCblJCd0FCeElBSkJ2Mzl4Y2lJQ093QVJJQVlnQWtIL2ZuRWdBUzhCVkVFSGRFR0FBWEZ5SWdJN0FCRWdCaUFDUWY5OWNTQUJMd0ZZUVFoMFFZQUNjWElpQWpzQUVTQUdJQUpCLzN0eElBRXZBVnhCQ1hSQmdBUnhjaUlDT3dBUklBWWdBa0gvN3dOeElBRXZBV2hCQzNSQmdCQnhjanNBRVNBQUlBQW9BZ0JCQVdvMkFnQWdCaUFBTmdJd0lBQW9BaEFoQWlBR1FRRTZBQVFnQWlnQ1VDSUVJQVpCQ0dvaUNEWUNCQ0FHSUFKQjBBQnFOZ0lNSUFZZ0JEWUNDQ0FDSUFnMkFsQWdBU2dDQkFSQUlBRW9BaGdpQWlBQktBSWNJZ1EyQWdRZ0JDQUNOZ0lBSUFGQ0FEY0NHQXNnQUNnQ0VDSUFRUkJxSUFFZ0FDZ0NCQkVBQUNBR3JVS0FnSUNBWUlRTUpBc0NRQUpBQWtBZ0FrSHFBV3NPQkFJQ0FRQURDeUFFSUFndUFBRnFRUUZxSVFrTUFnc2dCRUVCYWlJRUlBUWdCMm9zQUFCcUlRa01BUXNnQUNBRFFkd0ZhaUFFUVFGcUlnUWdCQ0FIYWl3QUFHb2dBaUFHRU1NQkRRTUxJQUFnQTBIY0JXb2dDU0FDSUFZUXd3RkZEUUVNQWdzTElBTWdCRFlDMUFVZ0F5QUNOZ0xRQlNBQUlBVWdBMEhRQldvUVJnc2dBQ2dDRUNJQ1FSQnFJQU1vQXVRRklBSW9BZ1FSQUFBZ0FDZ0NFQ0lDUVJCcUlBTW9BdWdGSUFJb0FnUVJBQUFNSGdzZ0JrRVFhaUVHSUFwQkFXb2hDZ3dBQ3dBTFFZVXBRYTc4QUVHczl3RkJsRGdRQUFBTElBTW9BdWdGSWdSQkFFNEVRQ0FESUFRMkFwZ0dDeUFES0FMMEJTRUZJQU1vQXVRRklRWWdBeWdDN0FWQjZRQnJJQXBHRFFFZ0FTQUZRWDhRYVJvZ0JpRUNEQXdMSUFRaEJnd0pDeUFEUVg4MkF0Z0ZJQUVnQlNBRFFad0dhaUFEUWRnRmFoREhBeUVISUFNb0F0d0ZJQU1vQXVBRklBWWdCeERHQXdSQUlBRWdCMEYvRUdrYUlBWWhBZ3dMQ3lBREtBS2NCaUlFUVNocklnaEJCMHRCQVNBSWRFR0RBWEZGY2tVRVFDQUJJQWRCZnhCcEdpQUJJQU1vQW9RR0lBTW9BcGdHRURNZ0EwR0FCbW9nQkVIL0FYRVFFU0FCSUFrZ0N5QUdJQU5CbUFacUVLUUNJUUlNQ3d0QjZ3QWhCUXdJQ3dKQUlBVkJrQUZyUVFKUEJFQWdCVUdYQVVZTkFTQUZRYllCUndSQUlBVkJ3Z0ZIRFFNZ0F5QUdLQUFCTmdLWUJpQUVJUUlNREFzZ0JpZ0FBU0lDUVFCSURRTWdBaUFCS0FLc0FrNE5BeUFOSUFKQkZHeHFJZ2dvQWd4QmYwY05CQ0FJSUFNb0FvUUdOZ0lNSUFnb0FoQWhCd05BSUFjaUFnUkFJQWdvQWd3Z0FpZ0NCQ0lGYXlFR0lBSW9BZ0FoQndKQUFrQUNRQUpBSUFJb0FnaEJBV3NPQkFJQkF3QURDeUFES0FLQUJpQUZhaUFHTmdBQURBSUxJQVpCZ0lBQ2FrR0FnQVJQRFFrZ0F5Z0NnQVlnQldvZ0Jqc0FBQXdCQ3lBR1FZQUJha0dBQWs4TkNTQURLQUtBQmlBRmFpQUdPZ0FBQ3lBQUtBSVFJZ1pCRUdvZ0FpQUdLQUlFRVFBQURBRUxDeUFJUVFBMkFoQWdCQ0VDREFzTElBTkNqb0NBZ0hBM0E2Z0ZJQU5DMmJqOWduQTNBNkFGSUFOQjNBVnFJQVFnQTBHZ0JXb1FKd1JBSUFNb0F1Z0ZJZ0pCQUU0RVFDQURJQUkyQXBnR0N5QURJQU1vQXZBRklnWTJBcFFGSUFOQmZ6WUNtQVVnQXlBREtBTHNCU0lFUVFGck5nS1FCU0FEUWR3RmFpQURLQUxrQlNJQ0lBTkJrQVZxRUNjRVFDQURLQUxvQlNJQ1FRQk9CRUFnQXlBQ05nS1lCZ3NnQkVFQmFpRUVJQU1vQXVRRklRSUxJQUVnQXlnQ2hBWWdBeWdDbUFZUU15QURRWUFHYWlJSElBVkJBbXRCL3dGeEVCRWdCeUFFSUFZUVhRd0xDeUFEUW82QWdJQndOd09JQlNBRFFwaUFnSUN3NkE0M0E0QUZJQU5CM0FWcUlBUWdBMEdBQldvUUp3UkFBa0FnQXlnQzZBVWlBa0VBU0FSQUlBTW9BcGdHSVFJTUFRc2dBeUFDTmdLWUJnc2dBU0FES0FLRUJpQUNFRE1nQTBHQUJtb2lBaUFGUVFKclFmOEJjUkFSSUFJZ0F5MEE3QVVRRVNBQ0lBTW9BdndGRUIwTUJ3c2dBMEtPZ0lDQWNEY0QrQVFnQTBLWmdJQ0FrQWszQS9BRUlBTkIzQVZxSUFRZ0EwSHdCR29RSjBVTkFRSkFJQU1vQXVnRklnSkJBRWdFUUNBREtBS1lCaUVDREFFTElBTWdBallDbUFZTElBRWdBeWdDaEFZZ0FoQXpJQU5CZ0FacUlnSWdCVUVDYTBIL0FYRVFFU0FDUWNrQUVCRU1CZ3NnQTBGL05nTElCU0FEUW9TQWdJQ3dsZXZVcW44M0E4QUZJQU5CM0FWcUlBUWdBMEhBQldvUUowVU5BQ0FES0FMb0JTSUlRUUJPQkVBZ0F5QUlOZ0tZQmdzZ0F5Z0M3QVVoQ0NBREtBTDhCU0lGUWNVQVJnUi9RZlFCQlNBRlFSdEhEUUZCOVFFTElRb2dDRUY5Y1VHcEFVWUVRQ0FCSUFNb0FvUUdJQU1vQXBnR0VETWdBMEdBQm1vZ0NoQVJJQUFnQXlnQy9BVVFFd3dHQ3lBRFF1bUFnSUJ3TndPd0JTQURRZHdGYWlBREtBTGtCU0FEUWJBRmFoQW5SUTBBQWtBZ0F5Z0M2QVVpQlVFQVNBUkFJQU1vQXBnR0lRVU1BUXNnQXlBRk5nS1lCZ3NnQVNBREtBS0VCaUFGRURNZ0EwR0FCbW9nQ2hBUklBQWdBeWdDL0FVUUUwSHFBQ0VGREFZTElBRWdBeWdDaEFZZ0F5Z0NtQVlRTXlBRFFZQUdhaUFHSUFjUWNpQUVJUUlNQ0F0QmhTbEJydndBUWVQMUFVR1VPQkFBQUF0QnZZd0JRYTc4QUVIbDlRRkJsRGdRQUFBTFFjWGRBRUd1L0FCQjhQVUJRWlE0RUFBQUMwR3czUUJCcnZ3QVFmVDFBVUdVT0JBQUFBc2dBeWdDNUFVaEFnd0RDeUFES0FMMEJTRUhJQU1vQXVRRklRWUxJQUVnQXlnQ2hBWWdBeWdDbUFZUU15QUZRZXNBUnlJS1JRUkFJQUVnQ1NBTElBWWdBMEdZQm1vUXBBSWhCZ3NnQjBFQVNBMENJQWNnQVNnQ3JBSk9EUUlnQVNBQktBTFVBaUlFUVFGcU5nTFVBaUFCS0FMTUFpQUVRUVIwYWlJRVFRUTJBZ1FnQkNBRk5nSUFJQU1vQW9RR0lRNGdCQ0FITmdJTUlBUWdEa0VCYWpZQ0NBSkFJQTBnQjBFVWJHb2lDQ2dDRENJSFFYOUdCRUFnQ0NnQ0NDQUNRWDl6YWlJQ1FmOEFTaUFGUWVrQWEwRUNTM0pGQkVBZ0JFRUJOZ0lFSUFRZ0JVR0JBV29pQWpZQ0FDQURRWUFHYWlJRUlBSkIvd0Z4RUJFZ0JFRUFFQkVnQmlFQ0lBQWdDQ0FES0FLRUJrRUJhMEVCRU9nQ0RRUU1Bd3NnQ2lBQ1FmLy9BVXB5RFFFZ0JFRUNOZ0lFSUFSQjdRRTJBZ0FnQTBHQUJtb2lBa0h0QVJBUklBSkJBQkFxSUFZaEFpQUFJQWdnQXlnQ2hBWkJBbXRCQWhEb0FnMEREQUlMSUFjZ0RrRi9jMm9pQWtHQUFXcEIvd0ZMSUFWQjZRQnJRUUpMY2tVRVFDQUVRUUUyQWdRZ0JDQUZRWUVCYWlJRU5nSUFJQU5CZ0FacUlnVWdCRUgvQVhFUUVTQUZJQUpCL3dGeEVCRWdCaUVDREFNTElBb2dBa0dBZ0FKcVFmLy9BMHR5RFFBZ0JFRUNOZ0lFSUFSQjdRRTJBZ0FnQTBHQUJtb2lCRUh0QVJBUklBUWdBa0gvL3dOeEVDb2dCaUVDREFJTElBTkJnQVpxSWdJZ0JVSC9BWEVRRVNBQ0lBZ29BZ3dnQXlnQ2hBWnJFQjBnQmlFQ0lBZ29BZ3hCZjBjTkFTQUFJQWdnQXlnQ2hBWkJCR3RCQkJEb0FnMEJDd3NnQXlnQ2dBWWlBa1VORFNBREtBS1VCaUFDUVFBZ0F5Z0NrQVlSQVFBYURBMExRWVVwUWE3OEFFSGw5Z0ZCbERnUUFBQUxJQUFRZkF3TEN5QUpLQUFCSVFZZ0FTQUJLQUxjQWtFQmFqWUMzQUlNQmdzZ0EwRi9OZ0pJSUFOQzZkU0JnT0FCTndOQUlBTkIzQVZxSUFnZ0EwRkFheEFuUlEwRkFrQWdBeWdDOUFVaUIwRUFTQTBBSUFjZ0FTZ0NyQUpPRFFBZ0F5Z0M2QVVoQkNBREtBTGtCU0VLSUFNb0F1d0ZJUkFnQnlFRkEwQWdBU2dDZ0FJaEVTQUJLQUtrQWlFU1FRQWhDd05BQWtBZ0MwRVVSZzBBSUJJZ0JVRVViR29vQWdRaEFnTkFJQUlnRVdvaUV5MEFBQ0lGUWJZQlJpQUZRY0lCUm5JRVFDQUNRUVZxSVFJTUFRVWdCVUhyQUVjTkFpQUxRUUZxSVFzZ0V5Z0FBU0VGREFNTEFBc0FDd3NnQTBLT2dJQ0FjRGNET0NBRElCQTJBalFnQTBFUk5nSXdJQU5CM0FWcUlBSWdBMEV3YWhBbkJFQWdBeWdDOUFVaEJRd0JDd3NnQTBGL05nSWtJQU1nRURZQ0lDQURRZHdGYWlBQ0lBTkJJR29RSjBVTkJpQUJJQUVvQXRBQ1FRRnFOZ0xRQWlBQklBZEJmeEJwR2lBQklBTW9BdlFGSWdKQkFSQnBHaUFEUVlBR2FpSUZJQkJCL3dGeEVCRWdCU0FDRUIwZ0NpRUlJQVJCZjBZZ0JDQUdSbklOQ0NBQklBRW9BdHdDUVFGcU5nTGNBaUFEUVlBR2FpSUNRY0lCRUJFZ0FpQUVFQjBnQkNFR0RBZ0xRYW9wUWE3OEFFSGQ4Z0ZCK3prUUFBQUxJQUVvQXN3QklBa3ZBQUVpQjBFRGRHcEJCR29oQWdOQUlBSW9BZ0FpQWtFQVNBMEhJQUVvQW5RZ0FrRUVkR29pQkNnQ0JDQUhSdzBISUFRdEFBeEJCSEVFUUNBRFFZQUdhaUlGUWVnQUVCRWdCU0FDUWYvL0EzRVFLZ3NnQkVFSWFpRUNEQUFMQUFzZ0FTZ0N6QUVnRDBFRGRHcEJCR29oQWdOQUlBSW9BZ0FpQWtFQVNBMEdJQUVvQW5RZ0FrRUVkR29pQnlnQ0JDQVBSdzBHSUFFb0Fwd0JJQUpIQkVCQjRRQWhCQ0FEUVlBR2FpSUZJQWNvQWd4QkEzWkJEM0ZCQVd0QkFVMEVmeUFEUVlBR2FpSUVRUU1RRVNBRUlBY29BZ3hCQVhSQkNIVVFIVUhaQUFWQjRRQUxFQkVnQlNBQ1FmLy9BM0VRS2dzZ0IwRUlhaUVDREFBTEFBc0NRQUpBQWtBZ0JFSHBBR3NPQmdRRUFnUUJBd0FMSUFSQk1VWUVRQ0FKTHdBQklRSWdBU0FKTHdBRElnUVE1UVFnQTBHQUJtb2lCVUV4RUJFZ0JTQUNFQ29nQlNBQktBTE1BU0FFUVFOMGFpOEJCRUVCYWtILy93TnhFQ29NQndzZ0JFRXlSd1JBSUFSQnpRQkhEUVVnQ1NnQUFVVU5Cd3dGQ3lBQklBa3ZBQUVpQWhEbEJDQURRWUFHYWlJRVFUSVFFU0FFSUFFb0Fzd0JJQUpCQTNScUx3RUVRUUZxUWYvL0EzRVFLZ3dHQ3lBQklBRW9BdEFDUVFGcU5nTFFBaUFKS0FBQklnSkJBRWdOQkNBQ0lBRW9BcXdDVGcwRUlBRW9BcVFDSUFKQkZHeHFJZ0lvQWdRaEJDQURRdTZBZ0lCd053TUFJQU5CM0FWcUlBUWdBeEFuUlEwRElBSWdBaWdDQUVFQmF6WUNBQXdGQ3lBQklBRW9BdEFDUVFGcU5nTFFBZ3NnQTBGL05nS2NCaUFEUVlBR2FpQUpJQThRY2lBQklBMGdEaUFJSUFOQm5BWnFFS1FDSWdnZ0RrNE5BeUFES0FLY0JpSUNRUUJJSUFJZ0JrWnlEUU1nQVNBQktBTGNBa0VCYWpZQzNBSWdBMEdBQm1vaUJFSENBUkFSSUFRZ0FoQWRJQUloQmd3REN5QUJJQUVvQXRBQ1FRRnFOZ0xRQWdzZ0EwR0FCbW9nQ1NBUEVISU1BUXNMUVlVcFFhNzhBRUc4OFFGQit6a1FBQUFMUVlPT0FVR3UvQUJCZy80QlFmM0xBQkFBQUFzZ0FDQUJFUDBDUW9DQWdJRGdBQXNoRkNBRFFhQUdhaVFBSUJRTHh3MEJCMzhDUUFKQUFrQUNRQUpBSUFBb0FoQWlBMEZIUndSQUlBQkJRR3NvQWdBaEFTQUFRWVVCRUVwRkRRRWdBQ2dDT0VFQkVJTUJRVWRIRFFFTFFYOGhCaUFBUVFCQkFDQUFLQUlZSUFBb0FoUVF4QUZGRFFFTUFnc0NRQUpBQWtBQ1FBSkFBa0FnQTBFemFnNERBQUlCQWdzZ0FTZ0NsQU1pQTBVTkFTQUFLQUlBSVFGQmZ5RUdJQUFRRWcwR0FrQUNRQUpBQWtBZ0FDZ0NFQ0lDUVRscURnUUNBUUVBQVFzZ0FFRUFRUUVRN1FJaEFBd0hDeUFBUVlVQkVFcEZEUUVnQUNnQ09FRUJFSU1CUVVkSERRRUxJQUJCQUVFQUlBQW9BaGdnQUNnQ0ZFRUJRUUFRK0FFaEFBd0ZDeUFBRUJJTkJnSkFBa0FnQWtHemYwWU5BQUpBSUFKQlFrY0VRQ0FDUVV0R0lBSkJVMFp5RFFJZ0FrRXFSd1JBSUFKQit3QkhEUVFnQXlnQ0lDRUVBMEFDUUNBQUtBSVFJZ0pCL1FCR0RRQWdBa0dEZjBZZ0FrRWxha0ZSUzNKRkJFQU1Ed3RCQUNFQ0lBRWdBQ2dDSUJBWUlRVUNRQUpBQWtBZ0FCQVNEUUFnQUVINUFCQktSUTBCSUFBUUVnMEFJQUFvQWhBaUFrR0RmMFlnQWtFbGFrRlJTM0pGQkVCQkFDRUNJQUJCM3ZZQVFRQVFGZ3dCQ3lBQklBQW9BaUFRR0NFQ0lBQVFFa1VOQWdzZ0FTQUZFQk1NREFzZ0FTQUZFQmdoQWdzZ0FDQURJQVVnQWtFQUVQY0JJUWNnQVNBRkVCTWdBU0FDRUJNZ0IwVU5EU0FBS0FJUVFTeEhEUUFnQUJBU1JRMEJEQTBMQ3lBQVFmMEFFQ3dOQ3lBQVFmb0FFRXBGRFFJZ0FCRHNBaUlDUlEwTElBRWdBeUFDRU9zQ0lRVWdBU0FDRUJNZ0JVRUFTQTBMQTBBZ0JDQURLQUlnVGcwRElBTW9BaHdnQkVFVWJHb2lBU0FGTmdJQUlBRkJBVFlDQ0NBRVFRRnFJUVFNQUFzQUN5QUFRZmtBRUVvRVFDQUFFQklOQ3lBQUtBSVFJZ0pCZzM5R0lBSkJKV3BCVVV0eVJRUkFEQTBMSUFFZ0FDZ0NJQkFZSVFJZ0FCQVNEUWdnQUJEc0FpSUVSUTBJSUFFZ0F5QUVFT3NDSVFVZ0FTQUVFQk1nQlVFQVNBMElJQUFnQTBIOUFDQUNRUUVROXdFaEF5QUJJQUlRRXlBRFJRMExJQU1nQlRZQ0FBd0NDeUFBRU93Q0lnSkZEUW9nQVNBRElBSVE2d0loQkNBQklBSVFFeUFFUVFCSURRb2dBU0FEUVNocVFRUWdBMEV3YWlBREtBSXNRUUZxRUhnTkNpQURJQU1vQWl3aUFVRUJhallDTENBREtBSW9JQUZCQW5ScUlBUTJBZ0FNQVFzQ1FBSkFBa0FDUUNBQUtBSVFRVGxxRGdRQ0FRRUFBUXNnQUVFQVFRSVE3UUloQUF3S0N5QUFRWVVCRUVwRkRRRWdBQ2dDT0VFQkVJTUJRVWRIRFFFTElBQkJBRUVBSUFBb0FoZ2dBQ2dDRkVFQ1FRQVErQUVoQUF3SUN5QUFFRllOQ1NBQVFSWVFvUUVnQUNBQVFVQnJJZ0VvQWdCQi9BQkJBUkNnQVVFQVNBMEpJQUJCdlFFUUVDQUFRZndBRUJvZ0FTZ0NBRUVBRUJjZ0FDQURRZndBUVJaQkFCRDNBVVVOQ1FzZ0FCQzNBU0VBREFZTElBQkJBU0FDUVFFUXpBTWhBQXdGQ3lBQVFjMGdRUUFRRmd3SUN5QUJLQUtVQXlJRVJRMEFJQUFvQWpoQkFCQ0RBU0lCUVNoR0lBRkJMa1p5RFFBZ0FDZ0NBQ0VEUVg4aEJpQUFFQklOQlNBRUtBSTRJUVVDUUFKQUFrQUNRQUpBSUFBb0FoQWlBVUgvQUdvT0F3QUNBUUlMSUFNZ0FDa0RJQkF4SWdKRkRRa2dBQkFTUlEwRElBTWdBaEFUREFzTElBQW9BaWdFUUNBQUVPSUJEQXNMUVJZaEFpQURJQUFvQWlBUUdDRUJJQUFRRWcwRUlBQWdCQ0FCUVJZUXl3TU5CQ0FESUFFUUV5QUFLQUlRUVN4SERRRWdBQkFTRFFnZ0FDZ0NFQ0VCQ3lBQlFmc0FSd1JBSUFGQktrY05BU0FBRUJJTkNDQUFRZmtBRUVwRkJFQWdBRUgvbEFGQkFCQVdEQXNMSUFBUUVnMElJQUFvQWhBaUFVR0RmMFlnQVVFbGFrRlJTM0pGQkVBTUNndEIvUUFoQWlBRElBQW9BaUFRR0NFQklBQVFFZzBFSUFBZ0JDQUJRZjBBRU1zRERRUWdBeUFCRUJNTUFRc2dBQkFTRFFjRFFBSkFJQUFvQWhBaUFVSDlBRVlOQUNBQlFZTi9SaUFCUVNWcVFWRkxja1VFUUF3TEMwRUFJUUVnQXlBQUtBSWdFQmdoQWlBQUVCSU5CUUpBSUFCQitRQVFTZ1JBSUFBUUVnMEhJQUFvQWhBaUFVR0RmMFlnQVVFbGFrRlJTM0pGQkVCQkFDRUJJQUJCM3ZZQVFRQVFGZ3dJQ3lBRElBQW9BaUFRR0NFQklBQVFFa1VOQVF3SEN5QURJQUlRR0NFQkN5QUFJQVFnQVNBQ0VNc0REUVVnQXlBQkVCTWdBeUFDRUJNZ0FDZ0NFRUVzUncwQUlBQVFFa1VOQVF3SkN3c2dBRUg5QUJBc0RRY0xJQUFRN0FJaUFrVU5CZ3NnQXlBRUlBSVE2d0loQVNBRElBSVFFeUFCUVFCSURRVWdCU0FFS0FJNElnTWdBeUFGU0JzaEF3TkFJQU1nQlVaRkJFQWdCQ2dDTkNBRlFReHNhaUFCTmdJSUlBVkJBV29oQlF3QkN3c2dBQkMzQVVVTkJBd0ZDMEYvSVFZZ0FFRUhFT0VCRFFRTUF3c2dBeUFCRUJNZ0F5QUNFQk1NQlFzZ0FTQUNFQk1NQkFzZ0FBMEJDMEVBSVFZTElBWVBDeUFBUWQ3MkFFRUFFQllMUVg4THRRTUJBMzhqQUVGQWFpSUJKQUFDUUNBQUtBSVFRWUYvUncwQUlBRWdBQ2dDQkRZQ0VDQUJJQUFvQWhRMkFoUWdBU0FBS0FJWU5nSWNJQUVnQUNnQ01EWUNHRUdCZnlFQ0EwQUNRQ0FDUVlGL1J3MEFJQUFvQWpnaEFpQUJJQUFvQWhnaUEwRUJhallDQkNBQklBSWdBMnRCQW1zMkFnQWdBVUVnYWtFVVFiczhJQUVRVGhwQmZ5RUNJQUFRRWcwQ0FrQUNRQUpBSUFBb0FoQWlBMEdBQVdvT1dRRUJBUUVCQXdNREF3TURBd01EQXdNREF3TURBd0VCQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREFnRUJBUUVEQVFFQkFRTUJBUU1EQVFFQkF3TUJBd01CQVFNREFRRUJBUUVCQVFNQkFRTUJBUUVCQVFFQkFBc2dBMEg5QUVZTkFTQURRVHRIRFFJZ0FCQVNSUTBCREFRTElBQW9BakJGRFFFTEFrQUNmeUFCUVNCcVFkNHZRUXNRWVVVRVFDQUFLQUpBSWdKQkFUWUNRRUVCREFFTElBRkJJR3BCaWNvQVFRb1FZVVVFUUNBQUtBSkFJUUpCQWd3QkN5QUFLQUlBTFFEb0FVVU5BU0FCUVNCcVFiVFpBRUVKRUdFTkFTQUFLQUpBSVFKQkJBc2hBeUFDSUFJdEFHNGdBM0k2QUc0TElBQW9BaEFoQWd3QkN3c2dBQ0FCUVJCcUVPNENJUUlMSUFGQlFHc2tBQ0FDQ3pVQkFuOUJBU0VDSUFBb0FnQWlBVUh4QUd0QkEwa2dBVUVJUm5JZ0FVSFRBRVp5Qkg5QkFRVWdBQ2dDREVINEFIRkJJRVlMQzB3QkEzOGdBQ2dDSUVFWWFpRUJBa0FEUUNBQklnTW9BZ0FpQWtVTkFTQUNRUXhxSVFFZ0FDQUNSdzBBQ3lBRElBQW9BZ3cyQWdBUEMwR2loQUZCcnZ3QVFhUGxBa0dsM2dBUUFBQUxHQUVCZnlBQnB5Z0NJQ0lEQkVBZ0FDQURJQUlSQUFBTEN4c0FJQUFRR3lBQVFnQTNBaEFnQUVJQU53SUlJQUJDQURjQ0FBdkVCQUVJZnlBQVFlUUFhaUlISUFCQjRBQnFJZ00yQWdBZ0FDQUROZ0pnSUFCQjBBQnFJUVFnQUVIVUFHb2lCU2dDQUNFQ0EwQWdCQ0FDSWdGR0JFQUNRQUpBQTBBQ1FDQUVJQVVvQWdBaUFVWUVRQ0FISVFFRFFDQUJLQUlBSWdFZ0EwWU5BaUFBSUFGQkNHdEJ3Z0FROEFNZ0FVRUVhaUVCREFBTEFBc2dBVUVJYXlJQ0tBSUFRUUJNRFFJZ0FVRUVheUlGSUFVdEFBQkJEM0U2QUFBZ0FDQUNRY01BRVBBRElBRkJCR29oQlF3QkN3c2dBRUVDT2dCb0lBQkIyQUJxSVFJRFFDQURJQWNvQWdBaUFVY0VRQ0FCUVFSckxRQUFRUTV4QkVBZ0FTZ0NBQ0lFSUFFb0FnUWlCVFlDQkNBRklBUTJBZ0FnQVVFQU5nSUFJQUlvQWdBaUJDQUJOZ0lFSUFFZ0FqWUNCQ0FCSUFRMkFnQWdBaUFCTmdJQURBSUZJQUFnQVVFSWF4RHRCUXdDQ3dBTEN5QUFRUUE2QUdnZ0FFRVFhaUVESUFBb0Fsd2hBUU5BSUFFZ0FrY0VRQ0FCUVFSckxRQUFRUTV4RFFNZ0FTZ0NCQ0VISUFNZ0FVRUlheUFBS0FJRUVRQUFJQWNoQVF3QkN3c2dBQ0FDTmdKY0lBQWdBRUhZQUdvMkFsZ1BDMEhGalFGQnJ2d0FRZWNzUWZyUkFCQUFBQXRCK1lZQlFhNzhBRUdkTFVIWk9SQUFBQXNnQVVFRWF5SUdMUUFBUVJCSkJFQWdBU2dDQkNFQ0lBQWdBVUVJYXlJSVFjUUFFUEFESUFZZ0JpMEFBRUVQY1VFUWNqb0FBQ0FJS0FJQURRRWdBU2dDQUNJR0lBRW9BZ1FpQ0RZQ0JDQUlJQVkyQWdBZ0FVRUFOZ0lBSUFNb0FnQWlCaUFCTmdJRUlBRWdBellDQkNBQklBWTJBZ0FnQXlBQk5nSUFEQUVMQzBHb2p3RkJydndBUWNRc1FlRGRBQkFBQUFzb0FRRi9JQUVnQVNnQ0FFRUJheUlDTmdJQUlBSkZCRUFnQUVFUWFpQUJJQUFvQWdRUkFBQUxDL0VCQWdaL0FYNGdBRUVJRUNraUJFVUVRRUYvRHdzZ0JFSUJOd0lBSUFLbklRWWdBa0lnaUtkQmRVa2hDQU5BQWtBQ1FDQURRUUpHRFFBZ0FDQUFLUU13SUFOQk1tb1FTU0lKUW9DQWdJQndnMEtBZ0lDQTRBQlNCRUFnQUVFUUVDa2lCUTBDSUFBZ0NSQVBDMEYvSVFjZ0EwVU5BQ0FBSUFFcEF3QVFEd3NnQUNnQ0VDQUVFS01GSUFjUEN5QUVJQVFvQWdCQkFXbzJBZ0FnQlNBRU5nSUlJQWhGQkVBZ0JpQUdLQUlBUVFGcU5nSUFDeUFGSUFJM0F3QWdDVUtBZ0lDQWNGb0VRQ0FKcHlBRk5nSWdDeUFBSUFsQkwwRUJFSllESUFFZ0EwRURkR29nQ1RjREFDQURRUUZxSVFNTUFBc0FDNWdEQWdKK0FuOUNnSUNBZ0RBaEFnSkFBa0FnQVNrQ1ZDSURRaGlHUWppSHB3MEFJQU5DSUlaQ09JZW5CRUFnQTBJUWhrSTRoNmRGRFFFZ0FTa0RZQ0lDUWlDSXAwRjFUd1JBSUFLbklnRWdBU2dDQUVFQmFqWUNBQXNnQUNBQ0VJb0JRb0NBZ0lEZ0FBOExJQUVnQTBMLy8vLy9qMkNEUW9DQWdJQVFoRGNDVkFOQUlBRW9BaFFnQkVvRVFDQUJLQUlRSUFSQkEzUnFLQUlFSWdVcEFsUkNHSVpDT0llblJRUkFJQUFnQlJDbEJTSUNRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRUWdBQ0FDRUE4TElBUkJBV29oQkF3QkN3c0NRQ0FCS0FKUUlnUUVRRUtBZ0lDQTRBQkNnSUNBZ0RBZ0FDQUJJQVFSQXdCQkFFZ2JJUUlNQVFzZ0FDQUJLUU5JUW9DQWdJQXdRUUJCQUJBdklRSWdBVUtBZ0lDQU1EY0RTQXNnQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFGQkFUb0FXU0FBS0FJUUtRT0FBU0lEUWlDSXAwRjFUd1JBSUFPbklnQWdBQ2dDQUVFQmFqWUNBQXNnQVNBRE53TmdDeUFCSUFFcEFsUkMvLy8vaDRCZ2cwS0FnSUFJaERjQ1ZBc2dBZzhMSUFFZ0FTa0NWRUwvLy8vL2oyQ0ROd0pVSUFJTDVnVUNCMzhCZmlNQVFSQnJJZ1VrQUFKQUlBRXBBbFFpQ1VJb2hrSTRoNmNOQUNBQklBbEMvLytEZUlOQ2dJQUVoRGNDVkFOQUFrQWdBU2dDRkNBRFRBUkFRUUFoQXdOQUlBRW9BaUFnQTBvRVFBSkFJQUVvQWh3aUJDQURRUlJzYWlJQ0tBSUlRUUZIRFFBZ0FpZ0NEQ0lIUWYwQVJnMEFJQUFnQlVFSWFpQUZRUXhxSUFFb0FoQWdBaWdDQUVFRGRHb29BZ1FnQnhEMEF5SUNSUTBBSUFBZ0FpQUJJQVFnQTBFVWJHb29BaEFROHdNTUJBc2dBMEVCYWlFRERBRUxDMEVBSVFJZ0FTZ0NVQTBESUFFb0FrZ29BaVFoQ0VFQUlRTkJBQ0VFQTBBQ1FDQUJLQUk0SUFSTUJFQURRQ0FESUFFb0FpQk9EUUlnQVNnQ0hDQURRUlJzYWlJQ0tBSUlSUVJBSUFnZ0FpZ0NBRUVDZEdvb0FnQWlCQ0FFS0FJQVFRRnFOZ0lBSUFJZ0JEWUNCQXNnQTBFQmFpRUREQUFMQUFzZ0FTZ0NFQ0FCS0FJMElBUkJER3hxSWdjb0FnaEJBM1JxS0FJRUlRSUNRQUpBSUFjb0FnUWlCa0g5QUVZRVFDQUFJQUlRalFNaUNVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkRBWUxJQUFnQlVFSWFpQUZRUXhxSUFJZ0JoRDBBeUlHQkVBZ0FDQUdJQUlnQnlnQ0JCRHpBd3dHQ3dKQUlBVW9BZ3dpQmlnQ0RFSDlBRVlFUUNBQUlBVW9BZ2dvQWhBZ0JpZ0NBRUVEZEdvb0FnUVFqUU1pQ1VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBISUFCQkFSRHhBeUlDUlFSQUlBQWdDUkFQREFnTElBQWdBa0VZYWlBSkVDQU1BUXNnQmlnQ0JDSUNSUVJBSUFVb0FnZ29Ba2dvQWlRZ0JpZ0NBRUVDZEdvb0FnQWhBZ3NnQWlBQ0tBSUFRUUZxTmdJQUN5QUlJQWNvQWdCQkFuUnFJQUkyQWdBTUFRc2dBQ0FJSUFjb0FnQkJBblJxS0FJQVFSaHFJQWtRSUFzZ0JFRUJhaUVFREFFTEMwRi9JUUlnQUNBQktRTklRb0dBZ0lBUVFRQkJBQkFoSWdsQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQUlBa1FEMEVBSVFJTUF3c2dBMEVEZENFRVFYOGhBaUFEUVFGcUlRTWdBQ0FFSUFFb0FoQnFLQUlFRUtZRlFRQk9EUUVNQWdzTFFYOGhBZ3NnQlVFUWFpUUFJQUlML2dJQ0JIOENmZ0pBSUFFcEFsUkNNSVpDT0llbkRRQUNRQ0FCS0FKUUJFQURRQ0FDSUFFb0FpQk9EUUlnQVNnQ0hDQUNRUlJzYWlJREtBSUlSUVJBSUFCQkFCRHhBeUlFUlFSQVFYOFBDeUFESUFRMkFnUUxJQUpCQVdvaEFnd0FDd0FMSUFFcEEwZ2hCMEYvSVFNZ0FDQUFLUU13UVEwUVNTSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdCcWNpQWlBSHB5SUROZ0lnSUFNZ0F5Z0NBRUVCYWpZQ0FDQUNRZ0EzQWlRQ1FDQURLQUk4SWdSRkRRQUNRQ0FBSUFSQkFuUVFYeUlFUlEwQUlBSWdCRFlDSkVFQUlRSURRQ0FDSUFNb0FqeE9EUUlnQXlnQ0pDQUNRUU4wYWkwQUFDSUZRUUZ4QkVBZ0FDQUZRUU4yUVFGeEVQRURJZ1ZGRFFJZ0JDQUNRUUowYWlBRk5nSUFDeUFDUVFGcUlRSU1BQXNBQ3lBQUlBWVFEMEYvRHdzZ0FTQUdOd05JSUFBZ0J4QVBDeUFCUVFFNkFGVkJBQ0VDQTBBZ0FTZ0NGQ0FDVEFSQVFRQVBDeUFDUVFOMElRUkJmeUVESUFKQkFXb2hBaUFBSUFRZ0FTZ0NFR29vQWdRUXB3VkJBRTROQUFzTElBTUxNUUVDZndKL0lBQVFQMEVCYWlFQkEwQkJBQ0FCUlEwQkdpQUFJQUZCQVdzaUFXb2lBaTBBQUVFdlJ3MEFDeUFDQ3d0d0FnSi9BWDRqQUVFUWF5SUNKQUFDUUNBQlFRQk9CRUFnQVVHQWdJQ0FlSEloQXd3QkN5QUNJQUUyQWdBZ0FrRUZhaUlCUVF0QjNDSWdBaEJPR2lBQUlBRVFZaUlFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNnQ0VDQUVwMEVCRUtjQ0lRTUxJQUpCRUdva0FDQURDeklBSUFBZ0FSQzhBaUlCUW9DQWdJQndnMEtBZ0lDQXdINVJCSDRnQUVHKzFRQkJBQkNBQWtLQWdJQ0E0QUFGSUFFTEM5QURBZ0ovQVg0Q1FBTkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FFRUhJQUpDSUlpbklnTWdBMEVIYTBGdVNSdEJDbW9PRWdNRUJ3VUhCd2NIQndZQUFRQUFCd2NIQWdjTElBQW9BaEFvQW93QklnTkZEUVlnQXkwQUtFRUVjVVVOQmdzZ0FDZ0MyQUVoQUNBQlFnQTNBZ3dnQVVLQWdJQ0FnSUNBZ0lCL053SUVJQUVnQURZQ0FDQUJJQUxFRUxvQ0dpQUJEd3NnQUNnQ0VDZ0NqQUVpQTBVTkJDQURMUUFvUVFSeFJRMEVJQUpDZ0lDQWdNQ0JnUHovQUh3aUJVS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVVEwRUlBQW9BdGdCSVFBZ0FVSUFOd0lNSUFGQ2dJQ0FnSUNBZ0lDQWZ6Y0NCQ0FCSUFBMkFnQWdBU0FGdjUwUXVnVWFJQUVQQ3lBQ3AwRUVhZzhMSUFBb0FoQW9Bb3dCSWdORkRRSWdBeTBBS0VFRWNVVU5BaUFDcHlJREtBSU1RZjMvLy84SFNnMENJQUFvQXRnQklRUWdBVUlBTndJTUlBRkNnSUNBZ0lDQWdJQ0FmemNDQkNBQklBUTJBZ0FnQVNBRFFRUnFFRVFhSUFGQkFSRFJBUm9nQUNBQ0VBOGdBUThMSUFBZ0FoQ3FCU0lDUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUlNQXdzZ0FDQUNRUUVRbWdFaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkRBSUxDeUFBSUFJUUR5QUFRZXdyUVFBUUZVRUFEd3RCQUF0bUFRSi9Jd0JCRUdzaUF5UUFJQUFnQVNnQ0pDQUNJQUVvQWlCQkEyeEJBWFlpQUNBQUlBSklHeUlBUVFOMElBTkJER29RcUFFaUFnUi9JQU1vQWd3aEJDQUJJQUkyQWlRZ0FTQUVRUU4ySUFCcU5nSWdRUUFGUVg4TElRRWdBMEVRYWlRQUlBRUxVZ0VFZnlBQUtBSWdJZ0pCQUNBQ1FRQktHeUVFUVFBaEFnTkFBa0FnQWlBRVJ3Ui9JQUFvQWh3aUJTQUNRUlJzYWlnQ0VDQUJSdzBCSUFVZ0FrRVViR29GUVFBTER3c2dBa0VCYWlFQ0RBQUxBQXZoQXdFR2Z5TUFRUkJySWdja0FDQUZRUVJxSVFrQ1FBSkFBMEJCQUNFR0lBRkJBRFlDQUNBQ1FRQTJBZ0FnQlNnQ0NDSUlRUUFnQ0VFQVNoc2hDZ0pBQTBBZ0JpQUtSZzBCQWtBZ0F5QUZLQUlBSUFaQkEzUnFJZ3NvQWdCR0JFQWdDeWdDQkNBRVJnMEJDeUFHUVFGcUlRWU1BUXNMSUFaQkFFZ05BRUVDSVFRTUF3c2dBQ0FGUVFnZ0NTQUlRUUZxRUhnRVFFRi9JUVFNQXdzZ0JTQUZLQUlJSWdaQkFXbzJBZ2dnQlNnQ0FDQUdRUU4wYWlJR0lBTTJBZ0FnQmlBQUlBUVFHQ0lJTmdJRUlBTWdDQkN0QlNJR0JFQWdCaWdDQ0VVTkFpQUdLQUlNSWdSQi9RQkdEUUlnQXlnQ0VDQUdLQUlBUVFOMGFpZ0NCQ0VEREFFTEN5QUlRUlpIQkVCQkFDRUdBMEFnQXlnQ0xDQUdTZ1JBQWtBQ1FDQUFJQWRCREdvZ0IwRUlhaUFES0FJUUlBTW9BaWdnQmtFQ2RHb29BZ0JCQTNScUtBSUVJQWdnQlJDdUJTSUVRUUZxRGdVR0FBRUJCZ0VMSUFJb0FnQWlCQVJBSUFFb0FnQWdCeWdDREVZRVFDQUhLQUlJS0FJTUlBUW9BZ3hHRFFJTElBRkJBRFlDQUNBQ1FRQTJBZ0JCQXlFRURBWUxJQUVnQnlnQ0REWUNBQ0FDSUFjb0FnZzJBZ0FMSUFaQkFXb2hCZ3dCQ3d0QkFDRUVJQUlvQWdBTkFndEJBU0VFREFFTElBRWdBellDQUNBQ0lBWTJBZ0JCQUNFRUN5QUhRUkJxSkFBZ0JBdkNBd0VKZnlBQktBSUlJZ1pCQUNBR1FRQktHeUVGQWtBQ1FBTkFJQVFnQlVZTkFTQUVRUUowSVFjZ0JFRUJhaUVFSUFjZ0FTZ0NBR29vQWdBZ0FrY05BQXRCQUNFRkRBRUxRWDhoQlNBQUlBRkJCQ0FCUVFScUlBWkJBV29RZUEwQUlBRWdBU2dDQ0NJRVFRRnFOZ0lJSUFFb0FnQWdCRUVDZEdvZ0FqWUNBQ0FCUVJCcUlRa2dBVUVNYWlFSFFRQWhCUU5BQWtBZ0FpZ0NJQ0FGVEFSQVFRQWhCVUVBSVFRRFFDQUVJQUlvQWl4T0RRUWdCRUVDZENFRElBUkJBV29oQkNBQUlBRWdBaWdDRUNBRElBSW9BaWhxS0FJQVFRTjBhaWdDQkVFQkVLOEZSUTBBQ3d3QkN3SkFJQU5CQUNBQ0tBSWNJQVZCRkd4cUlnWW9BaEFpQ2tFV1Joc05BRUVBSVFRZ0FTZ0NGQ0lJUVFBZ0NFRUFTaHNoQ3dKQUFrQURRQ0FFSUF0R0RRRWdDaUFIS0FJQUlBUkJER3hxSWd3b0FnQkhCRUFnQkVFQmFpRUVEQUVMQ3lBRVFRQk9EUUVMSUFBZ0IwRU1JQWtnQ0VFQmFoQjREUUlnQVNBQktBSVVJZ1JCQVdvMkFoUWdBU2dDRENBRVFReHNhaUlFSUFZb0FoQTJBZ0FDUUNBRFJRUkFJQVlvQWdoRkRRRUxJQVJCQURZQ0NBd0NDeUFFSUFZMkFnZ01BUXNnREVFQU5nSUlDeUFGUVFGcUlRVU1BUXNMUVg4UEN5QUZDMmdDQW44QmZpQUFRUkJxSVFJZ0FDa0NCQ0lFcDBILy8vLy9CM0VoQXdKQUlBUkNnSUNBZ0FpRFVFVUVRRUVBSVFBRFFDQUFJQU5HRFFJZ0FpQUFRUUYwYWk4QkFDQUJRWWNDYkdvaEFTQUFRUUZxSVFBTUFBc0FDeUFDSUFNZ0FSQ3lCU0VCQ3lBQkN4SUFJQUFnQVNBQ0lBTkJnSUFCRU5BQkdnc3NBUUYvQTBBZ0FTQURSa1VFUUNBQUlBTnFMUUFBSUFKQmh3SnNhaUVDSUFOQkFXb2hBd3dCQ3dzZ0Fndk9BUUlEZndGK0lBRWdBa0VCRUxJRklnTkIvLy8vL3dOeElRVWdBQ2dDTkNBQUtBSWtRUUZySUFOeFFRSjBhaUVEQTBBZ0F5Z0NBQ0lFUlFSQVFRQVBDd0pBSUFBb0FqZ2dCRUVDZEdvb0FnQWlBeWtDQkNJR1FpQ0lwMEgvLy8vL0EzRWdCVWNnQmtLQWdJQ0FnSUNBZ0VDRFFvQ0FnSUNBZ0lDQXdBQlNjaUFHcDBILy8vLy9CM0VnQWtjZ0JrS0FnSUNBQ0lOQ0FGSnljZzBBSUFOQkVHb2dBU0FDRUdFTkFDQUVRZDRCVGdSQUlBTWdBeWdDQUVFQmFqWUNBQXNnQkE4TElBTkJER29oQXd3QUN3QUxmd0VFZnlBQkxRQUFRZHNBUmdSQUlBRkJBV29pQXhBL1FRRnJJUUlnQUNnQ0VDZ0NPQ0VFUWRBQklRRURRQ0FCUWQ0QlJ3UkFBa0FnQkNBQlFRSjBhaWdDQUNJRktBSUVRZi8vLy84SGNTQUNSdzBBSUFWQkVHb2dBeUFDRUdFTkFDQUFJQUVRR0E4TElBRkJBV29oQVF3QkN3c1FBUUFMSUFBZ0FSQ3FBUXVzQWdNQ2Z3SitBWHdqQUVFZ2F5SUNKQUJFQUFBQUFBQUErSDhoQmlBQUtBSUlRZi8vLy84SFJ3UkFJQUFvQWdBaEF5QUNRZ0EzQWhnZ0FrS0FnSUNBZ0lDQWdJQi9Od0lRSUFJZ0F6WUNEQ0FDUVF4cUlBQVFSQm9DZmlBQ0tBSVVJZ0JCL2YvLy93ZE1CRUFnQWtFTWFrRTFRY2dFRU00QkdpQUNLQUlVSVFBTFFvQ0FnSUNBZ0lENC93QWdBRUgrLy8vL0IwWU5BQm9nQUVHQWdJQ0FlRVlFUUVJQURBRUxJQUlvQWh3aEF3SitJQUlvQWhoQkFrWUVRQ0FES1FJQURBRUxJQU0xQWdCQ0lJWUxJUVFnQUVHQ2VFd0VRQ0FFUVk1NElBQnJyWWdoQkVJQURBRUxJQVJDQzRoQy8vLy8vLy8vL3dlRElRUWdBRUgrQjJxdFFqU0dDeUVGSUFRZ0JZUWdBalVDRUVJL2hvUy9JUVlnQWtFTWFoQWJDeUFCSUFZNUF3QWdBa0VnYWlRQUN3NEFJQUJDZ0lDQWdQQitFSUFHQys0UEF3dC9BMzRCZkNNQVFVQnFJaEFrQUVIZkFFR0FBaUFFUVNCeEd5RUpJQVJCZ0FOeElRc0NRQUpBQWtBQ2Z3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUJMUUFBSWdaQksyc09Bd0VEQUFNTFFRRWhEaUFCUVFGcUlRRU1BUXNnQVVFQmFpRUJDeUFFUVlBSWNVVU5BU0FCTFFBQUlRWUxJQVpCL3dGeFFUQkhEUUFDUUFKQUFrQWdBUzBBQVNJSFFmZ0FSd1JBSUFkQjd3QkdEUUlnQjBIWUFFY05BUXNnQTBGdmNRMEZJQUZCQW1vaEIwRVFJUU1NQ1FzZ0F5QUhRYzhBUjNJTkFRd0ZDeUFEUlEwRURBTUxBa0FDUUNBSFFlSUFSd1JBSUFORklBZEJ3Z0JHY1EwQklBTWdCMEV3YTBIL0FYRkJDVXR5RFFRZ0JFRVFjUTBDREFjTElBTU5CQXNnQkVFRWNVVU5CVUVDSVFNZ0FVRUNhaUVIREFjTElBRkJBV29oQjBFQklRWURRQ0FCSUFacUlRTWdCa0VCYWlFR0lBTXRBQUFpQ0VINEFYRkJNRVlOQUF0QkNDRURRWUFDSVFsQkFTRUtJQWhCL2dGeFFUaEdEUVFNQmdzZ0JFRUJjU0FMUVlBQ2NrR0FBa2R5RFFBZ0FVRUlhaUVIUWZVY0lRWWdBU0VJQTBBZ0JrSDlIRWNFUUNBSUxRQUFJQVl0QUFCSERRSWdCa0VCYWlFR0lBaEJBV29oQ0F3QkN3c2dDMEdBQWtZRVFDQUFFTFlGSWhGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0E0QUFoRVF3SkN5QVJwMEVFYWlBT0VJd0JEQWdMUkFBQUFBQUFBUEQvUkFBQUFBQUFBUEIvSUE0YkloUzlJaEVDZnlBVW1VUUFBQUFBQUFEZ1FXTUVRQ0FVcWd3QkMwR0FnSUNBZUFzaUJyZTlVUVJBSUFhdElSRU1DQXRDZ0lDQWdNQitJQkZDZ0lDQWdNQ0JnUHovQUgwZ0VVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzaEVRd0hDeUFCSWdjZ0EwVU5BeG9NQlFzZ0FTRUhEQVFMSUFSQkJIRkZEUUFnQVVFQ2FpRUhRUWdoQXd3Q0N5QUJDeUVIUVFvaEF3d0JDMEtBZ0lDQXdINGhFU0FITFFBQUVKWUJJQU5QRFFFTFFRQWhCaUFEUVFwSElRd2dCeUVCQTBBQ1FDQUdJQWRxSWcwdEFBQWlDTUFoRHlBSUVKWUJJQU5PQkVBZ0NTQVBSdzBCQWtBZ0RDQUdRUUZIY2cwQUlBMUJBV3N0QUFCQk1FY05BRUVCSVFZTUFnc2dEUzBBQVJDV0FTQURUZzBCQ3lBSElBWkJBV29pQm1vaEFRd0JDd3RCQUNFTUFrQUNRQ0FFUVFGeERRQUNRQ0FJUVM1SERRQWdEUzBBQVNFSUlBWkZCRUFnQ0JDV0FTQURUZzBCQ3lBTlFRRnFJUUZDZ0lDQWdNQitJUkVnQ1NBSXdFWU5BZ05BQWtBZ0NFSC9BWEVRbGdFZ0EwZ0VRQ0FCTFFBQklRZ01BUXRCQVNFTUlBa2dDTUJIRFFJZ0FTMEFBU0lJRUpZQklBTk9EUUlMSUFGQkFXb2hBUXdBQ3dBTElBRWdCMDBOQUFKQUlBRXRBQUFpQmtIbEFFY0VRQ0FEUVFwR0lBWkJ4UUJHY1EwQklBWkJJSEpCOEFCSElBTkJFRXR5RFFKQkFTQURkRUdFZ2dSeERRRU1BZ3NnQTBFS1J3MEJDMEVCSVF3Z0FVRUJhaUVHQWtBQ1FBSkFJQUV0QUFGQksyc09Bd0FDQVFJTElBRkJBbW9oQmd3QkN5QUJRUUpxSVFZTElBWXRBQUJCT210QmRra05BQ0FHSVFFRFFDQUJJZ1pCQVdvaEFTQUdMUUFCSWdqQUlRMGdDRUU2YTBGMVN3MEFJQWtnRFVjTkFTQUdMUUFDUVRwclFYVkxEUUFMQ3lBQklBZEdCRUJDZ0lDQWdNQitJUkVNQVFzZ0VDRUpBa0FnQVNBSGF5SU5RUUpxSWc5QndRQlBCRUFnQUNnQ0VDSUdRUkJxSUE4Z0JpZ0NBQkVEQUNJSlJRMEJDMEVBSVFaQkFDRUlJQTRFUUNBSlFTMDZBQUJCQVNFSUN5QU5RUUFnRFVFQVNoc2hEZ05BSUFZZ0RrWkZCRUFnQmlBSGFpMEFBQ0lOUWQ4QVJ3UkFJQWdnQ1dvZ0RUb0FBQ0FJUVFGcUlRZ0xJQVpCQVdvaEJnd0JDd3NnQ0NBSmFrRUFPZ0FBQW40Q1FBSkFJQVJCd0FCeEJFQUNRQUpBQWtBQ1FDQUJMUUFBUWV3QWF3NERBUUlBQXdzZ0FVRUJhaUVCUVlBQklRc01CUXNnQVVFQmFpRUJRWUFDSVFzTUJBc2dBVUVCYWlFQlFZQURJUXNNQXdzZ0JFR0FCSEVFUUVLQWdJQ0F3SDRnQ2cwRUdpQUxRWUFCSUF3YklRc01Bd3NnQTBFS1J3MEJEQUlMSUFzTkFTQUVRWUFFY1FSQVFvQ0FnSURBZmlBS0RRTWFJQXhGUVFkMElRc01BZ3RCQUNFTElBTkJDa1lOQVF0Q2dJQ0FnTUIrSUF3TkFSb0xBa0FDUUFKQUFrQUNRQUpBSUF0QkdYY09CQUFCQWdNRUN3SjhJQXdnQTBFS1JuRkZCRUFnQ1NBSkxRQUFJZ1JCTFVacUlRY0RRQ0FISWdaQkFXb2hCeUFHTFFBQUlnaEJNRVlOQUF0Q21MUG16Sm16NXN3WklSSWdBMEVLUndSQVFRQWdBMnVzSUFPc2dDRVNDeUFEclNFVFFRQWhCMElBSVJFRFFBSkFJQWhCL3dGeElnVkZEUUFnQlJDV0FTSUZJQU5PRFFBZ0VTQUZyU0FSSUJOK2ZDQVJJQkpXSWdVYklSRWdCU0FIYWlFSElBWXRBQUVoQ0NBR1FRRnFJUVlNQVFzTElCRzZJUlFnQndSQUlBTzNJQWUzRUk4RElCU2lJUlFMSUJTYUlCUWdCRUV0UmhzTUFRc2dDUkRrQlFzaUZMMGhFU0FSQW44Z0ZKbEVBQUFBQUFBQTRFRmpCRUFnRktvTUFRdEJnSUNBZ0hnTElnYTN2VklOQkNBR3JRd0ZDMEtBZ0lDQXdINGdDaUFNY2cwRUdpQUFJQWtnQXlBRVFRQWdBQ2dDRUNnQ21BSVJJZ0FNQkF0Q2dJQ0FnTUIrSUFvTkF4b2dBQ0FKSUFNZ0JDQUZJQUFvQWhBb0FyUUNFU0lBREFNTFFvQ0FnSURBZmlBRFFRcEhEUUlhSUFBZ0NVRUtJQVJCQUNBQUtBSVFLQUxRQWhFaUFBd0NDeEFCQUF0Q2dJQ0FnTUIrSUJGQ2dJQ0FnTUNCZ1B6L0FIMGdFVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xJUkVnRDBIQkFFa05BU0FBS0FJUUlnQkJFR29nQ1NBQUtBSUVFUUFBREFFTElBQVFmRUtBZ0lDQTRBQWhFUXNnQVNFSEN5QUNCRUFnQWlBSE5nSUFDeUFRUVVCckpBQWdFUXRiQVFSL0lBQW9BZ0FpQTBFQUlBTkJBRW9iSVFWQkFDRURBMEFDUUNBRElBVkhCSDhnQUNnQ0JDSUdJQU5CUEd4cUtBSUFJQUZIRFFFZ0JpQURRVHhzYWlBQ1FRSjBhaWdDQkFWQkFBc1BDeUFEUVFGcUlRTU1BQXNBQzBnQkEzOGdBa0VBSUFKQkFFb2JJUUlEUUNBQ0lBTkdCRUJCQUE4TElBRWdBMm9oQkNBRFFRRjBJUVVnQTBFQmFpRURJQUFnQldvdkFRQWdCQzBBQUdzaUJFVU5BQXNnQkF1L0FRSUNmZ0ovSUFHOUlnTkMvLy8vLy8vLy93ZURJUUlnQTBJL2lLY2hCQUpBQWtBZ0EwSTBpS2RCL3c5eElnVUVRQ0FGUWY4UFJ3MEJJQUpRUlFSQUlBQVFOVUVBRHdzZ0FDQUVFSXdCUVFBUEN5QUNVQVJBSUFBZ0JCQ0pBVUVBRHdzZ0FrSU1oaUlDSUFKNUlnT0dJUUpCQUNBRHAyc2hCUXdCQ3lBQ1FndUdRb0NBZ0lDQWdJQ0FnSCtFSVFJTElBQWdCVUgrQjJzMkFnZ2dBRUVDRUVGRkJFQWdBQ2dDRUNBQ053SUFJQUFnQkRZQ0JFRUFEd3NnQUJBMVFTQUxxd0VDQVg0Q2Z5QUJLUUlFUW9DQWdJQUlneUVESUFBdEFBZEJnQUZ4UlFSQUlBTlFCRUFnQUVFUWFpQUJRUkJxSUFJUVlROExRUUFnQVVFUWFpQUFRUkJxSUFJUXVRVnJEd3NnQVVFUWFpRUVJQUJCRUdvaEFDQURVQVJBSUFBZ0JDQUNFTGtGRHdzZ0FrRUFJQUpCQUVvYklRVkJBQ0VCQTBBZ0FTQUZSZ1JBUVFBUEN5QUJRUUYwSVFJZ0FVRUJhaUVCSUFBZ0Ftb3ZBUUFnQWlBRWFpOEJBR3NpQWtVTkFBc2dBZ3ZUQkFFSWZ5QURJQUVvQWdBaUJDZ0NIRUVEYkVFQ2JTSUZJQU1nQlVvYklRZ0NRQ0FDQkVBZ0FDQUNLQUlVSUFoQkEzUVFpUUlpQTBVTkFTQUNJQU0yQWhRTElBUW9BaGdpQmtFQmFpSUZJUU1EUUNBRElnSkJBWFFoQXlBQ0lBaEpEUUFMQWtBZ0FpQUZSd1JBSUFBZ0FrRUNkQ0lISUFoQkEzUnFRVEJxRUNraUNrVU5BaUFFS0FJSUlnTWdCQ2dDRENJRk5nSUVJQVVnQXpZQ0FDQUVRZ0EzQWdnZ0J5QUthaUlHSUFRZ0JDZ0NJRUVEZEVFd2FoQWZJUVVnQUNnQ0VDSURLQUpRSWdrZ0JVRUlhaUlMTmdJRUlBVWdBMEhRQUdvMkFnd2dCU0FKTmdJSUlBTWdDellDVUNBRklBSkJBV3NpQ1RZQ0dFRUFJUU1nQ2tFQUlBY1FLeG9nQlVFd2FpRUNBMEFnQXlBRktBSWdUMFVFUUFKQUlBSW9BZ1FpQjBVRVFDQURRUUZxSVFNTUFRc2dBaUFDS0FJQVFZQ0FnR0J4SUFVZ0J5QUpjVUYvYzBFQ2RHb2lCeWdDQUVILy8vOGZjWEkyQWdBZ0J5QURRUUZxSWdNMkFnQUxJQUpCQ0dvaEFnd0JDd3NnQUNnQ0VDSUFRUkJxSUFRZ0JDZ0NHRUYvYzBFQ2RHb2dBQ2dDQkJFQUFBd0JDeUFFS0FJSUlnSWdCQ2dDRENJRE5nSUVJQU1nQWpZQ0FDQUVRZ0EzQWdnZ0FDQUVJQVpCZjNOQkFuUnFJQVZCQW5RaUFpQUlRUU4wYWtFd2FoQ0pBaUlEUlFSQUlBQW9BaEFpQUNnQ1VDSUJJQVJCQ0dvaUFqWUNCQ0FFSUFCQjBBQnFOZ0lNSUFRZ0FUWUNDQ0FBSUFJMkFsQkJmdzhMSUFBb0FoQWlBQ2dDVUNJRUlBSWdBMm9pQmtFSWFpSUNOZ0lFSUFZZ0FFSFFBR28yQWd3Z0JpQUVOZ0lJSUFBZ0FqWUNVQXNnQVNBR05nSUFJQVlnQ0RZQ0hFRUFEd3RCZnd2VEFRSUZmd0YrQWtBZ0FTa0NCQ0lIcDBILy8vLy9CM0VpQkVFTGEwRjJTUTBBSUFGQkVHb2hBZ0ovSUFkQ2dJQ0FnQWlEVUNJRlJRUkFJQUl2QVFBTUFRc2dBaTBBQUFzaUFVRXdheUlEUVFsTERRQUNmd0pBSUFGQk1FY0VRRUVCSVFFRFFDQUJJQVJHRFFJQ2Z5QUZSUVJBSUFJZ0FVRUJkR292QVFBTUFRc2dBU0FDYWkwQUFBdEJNR3NpQmtFSlN3MEVJQUZCQVdvaEFTQUdyU0FEclVJS2Zud2lCNmNoQXlBSFFvQ0FnSUFRVkEwQUN3d0RDMEVBSWdNZ0JFRUJSdzBCR2dzZ0FDQUROZ0lBUVFFTER3dEJBQXVwQWdJRGZ3RitBa0FnQUNBQ0VEaEZEUUFnQXFjaUJDOEJCa0VPUmdSQUlBQWdBU0FFS0FJZ0tRTUFFTkFGRHdzZ0FVS0FnSUNBY0ZRTkFBSkFJQUFnQWtFN0lBSkJBQkFVSWdKQy8vLy8vMjlZQkVCQmZ5RURJQUpDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBUWNZd1FRQVFGUXdCQ3lBQnB5RUVJQUtuSVFVQ1FBTkFBa0FnQkNnQ0VDZ0NMQ0lEUlFSQVFRQWhBeUFFTHdFR1FUQkhEUVFnQkNBRUtBSUFRUUZxTmdJQUlBU3RRb0NBZ0lCd2hDRUJBMEFnQUNBQkVJd0NJZ0ZDZ0lDQWdIQ0RJZ1pDZ0lDQWdDQlJEUVJCZnlFRElBWkNnSUNBZ09BQVVRMEZJQUduSUFWR0JFQWdBQ0FCRUE4TUF3c2dBQkI3UlEwQUN5QUFJQUVRRHd3RUN5QURJZ1FnQlVjTkFRc0xRUUVoQXd3QkMwRUFJUU1MSUFBZ0FoQVBDeUFEQzlJREFnSitBbjhqQUVFZ2F5SUVKQUFDUUNBQlF2Ly8vLy8vLy8vLy93Q0RJZ05DZ0lDQWdJQ0F3SUE4ZlNBRFFvQ0FnSUNBZ01EL3d3QjlWQVJBSUFGQ0JJWWdBRUk4aUlRaEF5QUFRdi8vLy8vLy8vLy9ENE1pQUVLQmdJQ0FnSUNBZ0FoYUJFQWdBMEtCZ0lDQWdJQ0FnTUFBZkNFQ0RBSUxJQU5DZ0lDQWdJQ0FnSUJBZlNFQ0lBQkNnSUNBZ0lDQWdJQUlVZzBCSUFJZ0EwSUJnM3doQWd3QkN5QUFVQ0FEUW9DQWdJQ0FnTUQvL3dCVUlBTkNnSUNBZ0lDQXdQLy9BRkViUlFSQUlBRkNCSVlnQUVJOGlJUkMvLy8vLy8vLy93T0RRb0NBZ0lDQWdJRDgvd0NFSVFJTUFRdENnSUNBZ0lDQWdQai9BQ0VDSUFOQy8vLy8vLy8vdi8vREFGWU5BRUlBSVFJZ0EwSXdpS2NpQlVHUjl3QkpEUUFnQkVFUWFpQUFJQUZDLy8vLy8vLy9QNE5DZ0lDQWdJQ0F3QUNFSWdJZ0JVR0I5d0JyRUdjZ0JDQUFJQUpCZ2ZnQUlBVnJFSTRDSUFRcEF3aENCSVlnQkNrREFDSUFRanlJaENFQ0lBUXBBeEFnQkNrREdJUkNBRkt0SUFCQy8vLy8vLy8vLy84UGc0UWlBRUtCZ0lDQWdJQ0FnQWhhQkVBZ0FrSUJmQ0VDREFFTElBQkNnSUNBZ0lDQWdJQUlVZzBBSUFKQ0FZTWdBbndoQWdzZ0JFRWdhaVFBSUFJZ0FVS0FnSUNBZ0lDQWdJQi9nNFMvQ3cwQUlBQWdBU0FDUVFBUXZBRUx1Z01DQVg0RGZ5TUFRUkJySWdRa0FBSkFBa0FDUUFKQUFrQURRQUpBSUFFaEF3SkFBa0FDUUFKQUFrQUNRQUpBUVFjZ0FVSWdpS2NpQlNBRlFRZHJRVzVKRzBFTGFnNFRBQUVDQ1FjS0Nnb0tDZ1lOQlFVTENnb05EUW9MSUFKQkFVWU5BaUFBSUFFUUR5QUFRZExIQUVFQUVCVU1Dd3NnQWtFQlJnMEJJQUFnQVJBUElBQkI4TVlBUVFBUUZRd0tDeUFDUVFGSERRRUxJQUVoQXd3SkN5QUFJQUVRRHlBQVFaREhBRUVBRUJVTUJ3c2dBVUwvLy8vL0Q0TWhBd3dIQzBLQWdJQ0E0QUFoQXlBQUlBRkJBUkNhQVNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTUJnc0xJQUFnQkVFSWFpQUJFT1VCSVFJZ0FDQUJFQThnQWtVTkF5QUVJQUlnQWhDQkFpSUZhaUlHTmdJTVFnQWhBd0pBSUFVZ0JDZ0NDRVlOQUNBQUlBWWdCRUVNYWtFQVFRUVF1QUlpQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFRZ0JDZ0NEQkNCQWlBRUtBSU1haUlGTmdJTUlBUW9BZ2dnQlNBQ2EwWU5BQ0FBSUFNUUQwS0FnSUNBd0g0aEF3c2dBQ0FDRUZRTUJBc2dBQ0FCRUE4Z0FFR3l4d0JCQUJBVkRBSUxJQUFnQVJBUEMwS0FnSUNBd0g0aEF3d0JDMEtBZ0lDQTRBQWhBd3NnQkVFUWFpUUFJQU1MaXdJQ0EzOEJmaU1BUVJCcklnVWtBQ0FGSUFJM0F3Z0NRQ0FBTHdIb0FVR0FBa2tOQUNBQUlBSkIzUUVnQWtFQUVCUWlBa0tBZ0lDQWNJTWlCMEtBZ0lDQU1GRU5BQUpBSUFkQ2dJQ0FnT0FBVVEwQUlBQWdBa0VsRUVzaUJrVU5BQ0FHS0FJRUJFQWdBQ0FDRUE4TUFnc2dCaUFERVBjRFFRSjBJZ1JxS0FJSUlnTkZCRUFnQlNBRVFjREFBV28yQWdBZ0FFSGRQQ0FGRUJVTUFRdEJBU0VFSUFNZ0F5Z0NBRUVCYWpZQ0FDQUFJQU90UW9DQWdJQndoRUtBZ0lDQU1FRUJJQVZCQ0dvUUx5SUhRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FDRUE4Z0FTQUhOd01BREFFTElBQWdBaEFQSUFGQ2dJQ0FnREEzQXdCQmZ5RUVDeUFGUVJCcUpBQWdCQXRmQVFGL0lBRkJFR29oQXdKQUlBRXRBQWRCZ0FGeEJFQWdBQ0FESUFKQkFYUVFIeG9NQVF0QkFDRUJJQUpCQUNBQ1FRQktHeUVDQTBBZ0FTQUNSZzBCSUFBZ0FVRUJkR29nQVNBRGFpMEFBRHNCQUNBQlFRRnFJUUVNQUFzQUN3dnZBZ0lCZndGOEl3QkJJR3NpQXlRQUlBRUNmd0ovQWtBQ1FBTkFBa0FDUUFKQUFrQkJCeUFDUWlDSXB5SUJJQUZCQjJ0QmJra2JJZ0VPQ0FBQUFBQURBd01CQWdzZ0FxY01CZ3RCQUNFQUlBSkNnSUNBZ01DQmdQei9BSHdpQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWZzBESUFLL0lnUkVBQUFBQUFBQUFBQmpEUU5CL3dFZ0JFUUFBQUFBQU9CdlFHUU5CaG9DZnlBRW5pSUVtVVFBQUFBQUFBRGdRV01FUUNBRXFnd0JDMEdBZ0lDQWVBc01CZ3NnQVVGM1JnMERDeUFBSUFJUWpRRWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVnMEFDMEYvSVFBTFFRQU1BZ3NnQUNnQzJBRWhBU0FEUWdBM0FoUWdBMEtBZ0lDQWdJQ0FnSUIvTndJTUlBTWdBVFlDQ0NBRFFRaHFJZ0VnQXFkQkJHb1FSQm9nQVVFQUVORUJHaUFEUVJ4cUlBRkJBQkNwQVNBQkVCc2dBQ0FDRUE4Z0F5Z0NIQXNoQVVFQUlRQkIvd0VnQVNBQlFmOEJUaHNpQVVFQUlBRkJBRW9iQ3pZQ0FDQURRU0JxSkFBZ0FBdFBBUUovSXdCQklHc2lBeVFBQW44Z0FDQURRUXhxSUFJUXF3VWlCRVVFUUNBQlFnQTNBd0JCZnd3QkN5QUJJQVJCQVJDQ0F4b2dBQ0FFSUFOQkRHb1FYa0VBQ3lFQUlBTkJJR29rQUNBQUM2Z0JBUVYvSUFDbklnTW9BaEFpQVVFd2FpRUVJQUVnQVNnQ0dFRi9jMEVDZEVHa2ZuSnFLQUlBSVFFRFFDQUJSUVJBUVFBUEN5QUVJQUZCQVdzaUJVRURkR29pQVNnQ0FDRUNJQUVvQWdSQk5rY0VRQ0FDUWYvLy94OXhJUUVNQVFzTFFRRWhBUUpBSUFKQi8vLy8vd05MRFFBZ0F5Z0NGQ0FGUVFOMGFpa0RBQ0lBUW9DQWdJQndnMEtBZ0lDQWtIOVNEUUFnQUtjb0FnUkIvLy8vL3dkeFFRQkhJUUVMSUFFTHl3RUNBbjhCZmlNQVFSQnJJZ1lrQUFKQUFrQWdBa0tBZ0lDQWNGUU5BQ0FDcHlJSEx3RUdRUXhIRFFBZ0J5MEFLVUVNUncwQUlBQWdBU0FESUFNRWZ5QUVCU0FHUW9DQWdJQXdOd01JSUFaQkNHb0xJQVVnQnk0QktpQUhLQUlrRVJJQUlRZ01BUXRDZ0lDQWdPQUFJUWdDUUNBQUlBSWdBU0FESUFRUUlTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCU0JFQWdBVUwvLy8vL2IxWU5BU0FBSUFFUUR5QUFRWTR4UVFBUUZRc2dCVUVBTmdJQURBRUxJQVZCQWpZQ0FDQUJJUWdMSUFaQkVHb2tBQ0FJQzVjQkFBSkFBa0FDUUFKQUFrQWdBVUlnaUtkQkEyb09BZ0VBQWdzZ0FDQUFJQUVnQXlBRUVJd0VJQUpCQUVFQUVDOFBDeUFBSUFFUUR3SkFJQUFnQWFjaUF4Q25CVUVBU0EwQUlBQWdBeENtQlVFQVNBMEFJQUFnQXhDbEJTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRTUxJQUJCQWhDUEJBd0JDeUFBSUFFUUR5QUFRZkwyQUVFQUVCVUxRb0NBZ0lEZ0FDRUJDeUFCQytvREFRVi9Jd0JCRUdzaUJpUUFBa0FDUUFKQUFuOGdBQ2dDRUNJRUtBS29BU0lEUlFSQUlBSXRBQUJCTGtjRVFDQUFJQUlROFFVTUFnc2dBUkNvQlNFRlFRQWhBeUFBSUFJUVB5QUZJQUZyUVFBZ0JSc2lCV3BCQW1vUUtTSUhSUTBFSUFjZ0FTQUZFQjhpQVNBRmFrRUFPZ0FBQWtBRFFBSkFJQUl0QUFCQkxrY05BRUVDSVFNQ1FBSkFJQUl0QUFGQkxtc09BZ0FCQWdzZ0FpMEFBa0V2UncwQklBRXRBQUJGRFFNZ0FSQ29CU0lEUVFGcUlBRWdBeHNpQTBIWmtBRVE4Z05GRFFFZ0EwSFlrQUVROGdORkRRRWdBeUFCSUFOSmEwRUFPZ0FBUVFNaEF3c2dBaUFEYWlFQ0RBRUxDeUFCTFFBQVJRMEFJQUVRUHlBQmFrRXZPd0FBQ3lBQkVEOGdBV29nQWhEbEJTQUJJUUlNQWdzZ0FDQUJJQUlnQkNnQ3NBRWdBeEVIQUFzaUFrVU5BUXNnQUNBQ0VLb0JJZ0ZGQkVBZ0FDZ0NFQ0lBUVJCcUlBSWdBQ2dDQkJFQUFBd0JDeUFBSUFFUTRRVWlBd1JBSUFBb0FoQWlCRUVRYWlBQ0lBUW9BZ1FSQUFBZ0FDQUJFQk1NQWdzZ0FDQUJFQk1nQkNnQ3JBRWlBVVVFUUNBR0lBSTJBZ0FnQUVIcWxnRWdCaERHQWlBQUtBSVFJZ0JCRUdvZ0FpQUFLQUlFRVFBQURBRUxJQUFnQWlBRUtBS3dBU0FCRVFFQUlRTWdBQ2dDRUNJQVFSQnFJQUlnQUNnQ0JCRUFBQXdCQzBFQUlRTUxJQVpCRUdva0FDQURDelVCQVg4Z0FDZ0NnQUlpQjBVRVFDQUFRWkQyQUVFQUVCVkNnSUNBZ09BQUR3c2dBQ0FCSUFJZ0F5QUVJQVVnQmlBSEVUb0FDLzRFQVFsL0l3QkJFR3NpQmlRQUFuOUJmeUFBSUFaQkRHb2dBa0VBRU1JQ0RRQWFJQUVvQWhBdEFETkJDSEZGQkVBZ0FDQURRVEFRd0FJTUFRc2dBUzBBQlVFSWNRUkFJQVlvQWd3aUF5QUJLQUlvSWdWSkJFQWdBeUVFQTBBZ0JDQUZSa1VFUUNBQUlBRW9BaVFnQkVFRGRHb3BBd0FRRHlBRVFRRnFJUVFNQVFzTElBRWdBellDS0FzZ0FTZ0NGQ0FEUVFCT0JINGdBNjBGUW9DQWdJREFmaUFEdUwwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3MzQXdCQkFRd0JDeUFBSUFaQkJHb2dBU2dDRkNrREFCQjNHaUFHS0FJTUlnZ2hCUUpBSUFZb0FnUWlCeUFJVFEwQUlBRW9BaEFpQ2lnQ0lDSUVJQWNnQ0d0UEJFQURRQ0FISWdVZ0NFME5BaUFBSUFFZ0FDQUZRUUZySWdjUXFRVWlDUkQ1QXlFRUlBQWdDUkFUSUFRTkFBd0NDd0FMSUFwQk1Hb2lCeUVNQTBBZ0JDQUpUQVJBQTBBZ0JDQUxUQTBEQWtBZ0J5Z0NCQ0lFUlEwQUlBQWdCa0VJYWlBRUVLd0JSUTBBSUFZb0FnZ2dCVWtOQUNBQUlBRWdCeWdDQkJENUF4b2dBU2dDRUNJS0lBdEJBM1JxUVRCcUlRY0xJQWRCQ0dvaEJ5QUxRUUZxSVFzZ0NpZ0NJQ0VFREFBTEFBVUNRQ0FNS0FJRUlnUkZEUUFnQUNBR1FRaHFJQVFRckFGRkRRQWdCaWdDQ0NJRUlBVkpEUUFnQlNBRVFRRnFJQXd0QUFOQkJIRWJJUVVMSUF4QkNHb2hEQ0FKUVFGcUlRa2dDaWdDSUNFRURBRUxBQXNBQ3lBQUlBRW9BaFFnQlVFQVRnUitJQVd0QlVLQWdJQ0F3SDRnQmJpOUlnSkNnSUNBZ01DQmdQei9BSDBnQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUNCQkFTQUZJQWhORFFBYUlBQWdBMEh0NlFBUWJ3c2hCQ0FHUVJCcUpBQWdCQXRzQWdKL0FYd2pBRUVRYXlJQ0pBQUNmeUFCUWlDSXB5SURCRUJCQUNBRFFRdHFRUkpKRFFFYUMwRi9JQUFnQWtFSWFpQUJFRUlOQUJvZ0Fpc0RDQ0lFdlVLQWdJQ0FnSUNBK1A4QWcwS0FnSUNBZ0lDQStQOEFVaUFFbkNBRVlYRUxJUUFnQWtFUWFpUUFJQUFMNEFNQ0JIOENmaUFCUVFCSUJFQWdBVUgvLy8vL0IzR3REd3NDUUNBQklBQW9BaEFpQkNnQ0xFa0VRQUorQWtBZ0JDZ0NPQ0FCUVFKMGFpZ0NBQ0lDS1FJRUlnWkNnSUNBZ0lDQWdJQkFnMEtBZ0lDQWdJQ0FnTUFBVWcwQUlBSkJFR29oQkNBR3AwSC8vLy8vQjNFaEJRSkFJQVpDZ0lDQWdBaURVRVVFUUNBRlJRMENBa0FnQkNJQkx3RUFJZ05CTFVjTkFDQUNRUkpxSVFFZ0FpOEJFaUlEUVRCSERRQkNnSUNBZ01EKy93TWdCVUVDUmcwRUdnc2dBMEU2YTBGMVN3MEJJQU5CeVFCSElBUWdCVUVCZEdvZ0FXdEJFRWR5RFFJZ0FVRUNha0dnd0FGQkRoQmhSUTBCREFJTElBVkZEUUVDUUNBRUlnRXRBQUFpQTBFdFJ3MEFJQUpCRVdvaEFTQUNMUUFSSWdOQk1FY05BRUtBZ0lDQXdQNy9BeUFGUVFKR0RRTWFDeUFEUVRwclFYVkxEUUFnQTBISkFFY2dCQ0FGYWlBQmEwRUlSM0lOQVNBQlFRRnFRZlljUVFjUVlRMEJDeUFDSUFJb0FnQkJBV28yQWdBZ0FDQUNyVUtBZ0lDQWtIK0VFSTBCSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQUlBWVFLQ0lIUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBR0VBOGdCdzhMSUFJZ0I2Y1Fnd0loQVNBQUlBY1FEeUFCUlEwRElBQWdCaEFQQzBLQWdJQ0FNQXNQQzBIdjN3QkJydndBUWRrWVFmS0xBUkFBQUFzZ0JndmJBUUVEZndKQUlBQWdBU2dDR0VFQmFrRUNkQ0lDSUFFb0FoeEJBM1JxUVRCcUlnTVFLU0lFUlFSQVFRQWhBZ3dCQ3lBRUlBRWdBU2dDR0VGL2MwRUNkR29nQXhBZklBSnFJZ0pCQVRZQ0FDQUFLQUlRSVFFZ0FrRUNPZ0FFSUFFb0FsQWlBeUFDUVFocUlnUTJBZ1FnQWlBQlFkQUFhallDRENBQ0lBTTJBZ2dnQVNBRU5nSlFRUUFoQVNBQ1FRQTZBQkFnQWlnQ0xDSURCRUFnQXlBREtBSUFRUUZxTmdJQUN5QUNRVEJxSVFNRFFDQUJJQUlvQWlCUERRRWdBQ0FES0FJRUVCZ2FJQU5CQ0dvaEF5QUJRUUZxSVFFTUFBc0FDeUFDQytvQkFnZC9BWDRnQUNJRFFkQUFhaUVHSUFGQkdHb2hCeUFCS0FJY0lRQURRQ0FBSUFkR1JRUkFJQUFvQWdRaENDQUFRUUpyTHdFQUlRSUNRQUpBSUFCQkEyc2lCQzBBQUNJRlFRSnhCRUFnQVNnQ0VDQUNRUU4wYWlrREFDSUpRaUNJcDBGMFN3MEJEQUlMSUFFb0FoUWdBa0VEZEdvcEF3QWlDVUlnaUtkQmRVa05BUXNnQ2FjaUFpQUNLQUlBUVFGcU5nSUFJQVF0QUFBaEJRc2dBQ0FKTndNUUlBQWdBRUVRYWpZQ0NDQUVJQVZCQVhJNkFBQWdBRUVFYTBFRE9nQUFJQU1vQWxBaUFpQUFOZ0lFSUFBZ0JqWUNCQ0FBSUFJMkFnQWdBeUFBTmdKUUlBZ2hBQXdCQ3dzTG93RUNBWDhDZmlNQVFSQnJJZ01rQUNBRElBRTNBd2dDZndKQUlBSkNnSUNBZ0hCYUJFQWdBQ0FDUWRrQklBSkJBQkFVSWdWQ2dJQ0FnSENESWdSQ2dJQ0FnQ0JSSUFSQ2dJQ0FnREJSY2tVRVFFRi9JQVJDZ0lDQWdPQUFVUTBER2lBQUlBQWdCU0FDUVFFZ0EwRUlhaEF2RUNZTUF3c2dBQ0FDRURnTkFRc2dBRUgrOHdCQkFCQVZRWDhNQVFzZ0FDQUJJQUlRdmdVTElRQWdBMEVRYWlRQUlBQUxLd0VCZnlBQlFSQnJJZ01nQUNBREtRTUFJQUZCQ0dzcEF3QVF3QVVnQWtldFFvQ0FnSUFRaERjREFBdVZDZ01FZmdsL0Fud2pBRUVRYXlJS0pBQkJxZ0ZCcVFFZ0Foc2hEaUFCUVFocklnOHBBd0FoQXlBQlFSQnJJZ3dwQXdBaEJRSkFBa0FDUUFKQUEwQkJCeUFEUWlDSXB5SUJJQUZCQjJ0QmJra2JJUWNnQlVMLy8vLy9ENE1oQmdKQUFrQUNRQUpBQWtBQ1FBTkFBa0JCQnlBRklnUkNJSWluSWdFZ0FVRUhhMEZ1U1JzaUFVRUxhaUlJUVJKTFFRRWdDSFJCaDVBUWNVVnlEUUFnQjBFTGFpSUlRUkpMUVFFZ0NIUkJoNUFRY1VWeURRQWdBU0FIY2tVRVFDQUVweUFEcDBZaENRd01Dd0pBQW53Q2ZDQUJRUWRHQkVBZ0IwRUFJQWRCQjBjYkRRTWdCRUtBZ0lDQXdJR0EvUDhBZkw4aUVDQUhRUWRHRFFFYUlBT250d3dDQ3lBSFFRZEhJQUZ5RFFJZ0JLZTNDeUVRSUFOQ2dJQ0FnTUNCZ1B6L0FIeS9DeUVSSUJBZ0VXRWhDUXdNQ3lBQlFYVkhJQWRCZFVkeFJRUkFJQUJCcVFFZ0JDQURJQUFvQWhBb0F0d0NFUndBSWdsQkFFNE5EQXdMQ3lBQUtBSVFJUWdnQVVGM1J5QUhRWGRIY1VVRVFDQUFRYWtCSUFRZ0F5QUlLQUxBQWhFY0FDSUpRUUJPRFF3TUN3c2dBRUdwQVNBRUlBTWdDQ2dDcEFJUkhBQWlDVUVBVGcwTERBb0xJQUVnQjBZRVFBSkFJQWRCZjBjTkFDQUFJQXBCQ0dvZ0JDQURJQTVCQUVFQ0VJVUNJZ0ZGRFFBZ0FDQUVFQThnQUNBREVBOGdBVUVBU0EwTElBd2dDaWtEQ0RjREFFRUFJUUVNRFFzZ0FDQUVJQU5CQUJDOEFTRUpEQXNMUVFFaENTQUJRUUpHSUFkQkEwWnhJQWRCQWtZZ0FVRURSbkZ5RFFvQ1FBSkFJQUZCZVVZRVFFRUFJUWxCZVNFTElBY2lEU0VJQWtBZ0IwRUxhZzROQWdJQ0J3Z0hCd2NIQndjQ0JRQUxJQWRCQjBZTkFRd0dDeUFIUVhsSERRRkJlU0VOSUFZaEJTQUJJUWdDUUFKQUlBRkJBV29PQ1FrQkJBZ0lDQWdJQVFBTElBRkJDMnBCQTBrTkFBd0hDeUFCUVhaR0lRbEJlU0VIQ3dKQUFrQWdDVVVnQjBGMlIzRU5BQ0FBS0FJUUtBS01BU0lJQkVBZ0NDMEFLRUVFY1EwQkN3SkFBa0FnQVVGNVJ3UkFJQVFoQlF3QkN5QUFJQVFRdkFJaUJVS0FnSUNBY0lOQ2dJQ0FnT0IrVWcwQkN5QUhRWGxIRFFJZ0FDQURFTHdDSWdOQ2dJQ0FnSENEUW9DQWdJRGdmbEVOQWdzZ0FDQUZFQThnQUNBREVBOUJBQ0VKREEwTElBQWdCQkJzSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQ0NBQUlBTVFiQ0lEUW9DQWdJQndnMEtBZ0lDQTRBQlJEUW9MSUFBZ0JTQURFTUFGSVFrTUN3c2dCaUVGSUFGQkFVWU5BQXNnQjBFQlJ3MEJDeUFEUXYvLy8vOFBneUVESUFRaEJRd0ZDeUFCSWd0QmYwY05BQ0FIUVF0cUlnRkJFazFCQUVFQklBRjBRWWVRRUhFYkRRSkJmeUVMSUFkQmZuRkJlRVlOQWdzZ0IwRi9Sd1IvSUFjRklBdEJmbkZCZUVZZ0MwRUxhaUlCUVJKTlFRQkJBU0FCZEVHSGtCQnhHM0lOQWtGL0N5RU5JQXNoQ0FzQ2Z3SkFJQVJDZ0lDQWdIQlVEUUFnQktjc0FBVkJBRTROQUVFQklBMUJmbkZCQWtZTkFSb0xRUUFoQVNBRFFvQ0FnSUJ3V2dSL0lBT25MQUFGUVFCSUJVRUFDeUFJUVg1eFFRSkdjUXNoQ1NBQUlBUVFEeUFBSUFNUUR3d0ZDeUFBSUFwQkNHb2dCQ0FESUE1QkFFRUNFSVVDSWdnRVFDQUFJQVFRRHlBQUlBTVFEMEVBSVFFZ0NFRUFTQTBFSUF3Z0Npa0RDRGNEQUF3R0N5QUFJQVJCQWhDYUFTSUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FEUVFJUW1nRWlBMEtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQUlMQ3lBRElRVUxJQUFnQlJBUEN5QU1Rb0NBZ0lBd053TUFJQTlDZ0lDQWdEQTNBd0JCZnlFQkRBRUxJQXdnQWlBSlI2MUNnSUNBZ0JDRU53TUFRUUFoQVFzZ0NrRVFhaVFBSUFFTGhBZ0NBbjRGZnlNQVFTQnJJZ1lrQUVFSElBRkJDR3NpQnlrREFDSURRaUNJcHlJRklBVkJCMnRCYmtrYklRUUNRQUpBQWtBQ1FFRUhJQUZCRUdzaUJTa0RBQ0lDUWlDSXB5SUJJQUZCQjJ0QmJra2JJZ0ZCQjBjZ0JFRUhSM0pGQkVBZ0JVS0FnSUNBd0g0Z0FrS0FnSUNBd0lHQS9QOEFmTDhnQTBLQWdJQ0F3SUdBL1A4QWZMK2d2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYk53TUFEQUVMSUFGQmYwY2dCRUYvUjNFRWZ5QUJCUUpBQWtBZ0FVRi9SZ1JBSUFSQkIyb2lDRUVLUzBFQklBaDBRWUVNY1VWeURRRUxJQVJCZjBjTkFTQUJRUWRxSWdGQkNrc05BRUVCSUFGMFFZRU1jUTBCQ3lBQUlBWkJHR29nQWlBRFFaMEJRUUJCQWhDRkFpSUJSUTBBSUFBZ0FoQVBJQUFnQXhBUElBRkJBRWdOQkNBRklBWXBBeGczQXdBTUFnc2dBQ0FDUVFJUW1nRWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQUFnQTBFQ0VKb0JJZ05DZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FBSUFJUUR3d0VDMEVISUFOQ0lJaW5JZ0VnQVVFSGEwRnVTUnNoQkVFSElBSkNJSWluSWdFZ0FVRUhhMEZ1U1JzTFFYbEhJQVJCZVVkeFJRUkFJQVVnQUNBQ0lBTVF4QUlpQWpjREFFRUFJUUVnQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBEREFRTElBQWdBaEJzSWdKQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBTVFiQ0lEUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBQ0VBOE1Bd3RCQnlBQ1FpQ0lweUlCSUFGQkIydEJia2tiSWdGQkJ5QURRaUNJcHlJRUlBUkJCMnRCYmtrYklnUnlSUVJBSUFVQ2ZpQUR4Q0FDeEh3aUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN6Y0RBQXdCQ3lBQlFYVkhJQVJCZFVkeFJRUkFJQUJCblFFZ0JTQUNJQU1nQUNnQ0VDZ0MyQUlSR2dBTkF3d0JDeUFCUVhkSElBUkJkMGR4UlFSQUlBQkJuUUVnQlNBQ0lBTWdBQ2dDRUNnQ3ZBSVJHZ0JGRFFFTUF3c0NRQ0FCUVhaSElBUkJka2R4UlFSQUlBQW9BaEFoQVF3QkN5QUFJQVpCRUdvZ0FoQnVCRUFnQUNBREVBOE1CQXNnQUNBR1FRaHFJQU1RYmcwREFrQWdBQ2dDRUNJQktBS01BU0lFUlEwQUlBUXRBQ2hCQkhGRkRRQWdCaXNERUJDOUFrVU5BQ0FHS3dNSUVMMENEUUVMSUFWQ2dJQ0FnTUIrSUFZckF4QWdCaXNEQ0tDOUlnSkNnSUNBZ01DQmdQei9BSDBnQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHMzQXdBTUFRc2dBRUdkQVNBRklBSWdBeUFCS0FLZ0FoRWFBQTBDQzBFQUlRRU1BZ3NnQUNBREVBOExJQVZDZ0lDQWdEQTNBd0FnQjBLQWdJQ0FNRGNEQUVGL0lRRUxJQVpCSUdva0FDQUJDNUFEQVFsL0l3QkJNR3NpQnlRQUFrQWdBa0tBZ0lDQWNGUU5BRUVUSVFVQ1FDQUNweUlLTFFBRlFRUnhSUTBBSUFBb0FoQW9Ba1FnQ2k4QkJrRVliR29vQWhRaUNFVU5BRUVEUVJNZ0NDZ0NCQnNoQlF0QmZ5RUpJQUFnQjBFc2FpQUhRU2hxSUFvZ0JSQ09BUTBBSUFPblFRQWdBMEwvLy8vL2IxWWJJUXdnQnlnQ0xDRUlJQWNvQWlnaEN5QUZRUTlMSVExQkFDRUZBa0FEUUNBRklBdEhCRUFDUUFKQUlBeEZEUUFnQUVFQUlBd2dDQ0FGUVFOMGFpZ0NCQkJNSWdaRkRRQWdCa0VBVGcwQkRBUUxJQTFGQkVBZ0FDQUhRUWhxSUFvZ0NDQUZRUU4wYWlnQ0JCQk1JZ1pCQUVnTkJDQUdSUTBCSUFjb0FnZ2hCaUFBSUFkQkNHb1FTQ0FHUVFSeFJRMEJDeUFBSUFJZ0NDQUZRUU4wYWlJR0tBSUVJQUpCQUJBVUlnTkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF5QUdLQUlFSVFZQ2Z5QUVCRUFnQUNBQklBWWdBeEJGREFFTElBQWdBU0FHSUFOQkJ4QVpDMEVBU0EwREN5QUZRUUZxSVFVTUFRc0xJQUFnQ0NBTEVGcEJBQ0VKREFFTElBQWdDQ0FMRUZvTElBZEJNR29rQUNBSkM2VUJBUUYrQWtBQ1FBSitJQVJCQkhFRVFFRXRJUUlnQUNBQkVGa01BUXRCTENFQ0lBQWdBUkFsQ3lJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUNFSFlpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFCQkVCQXBJZ0lFUUNBQ1FRQTJBZ3dnQWlBRVFRTnhOZ0lJSUFJZ0FUY0RBQ0FGUW9DQWdJQndWQTBDSUFXbklBSTJBaUFNQWdzZ0FDQUZFQThMSUFBZ0FSQVBRb0NBZ0lEZ0FBOExJQVVMeEFFQkJIOGdBYWNpQlNBQ05nSWdJQVZDQURjQ0pBSkFJQUlvQWp3aUJrVU5BQUpBSUFBZ0JrRUNkQkJmSWdoRkRRQWdCU0FJTmdJa1FRQWhCUU5BSUFVZ0FpZ0NQRTROQWlBQ0tBSWtJQVZCQTNScUlnY3ZBUUloQmdKQUlBY3RBQUFpQjBFQmNRUkFJQUFnQkNBR0lBZEJBWFpCQVhFUWl3UWlCZzBCREFNTElBTWdCa0VDZEdvb0FnQWlCaUFHS0FJQVFRRnFOZ0lBQ3lBSUlBVkJBblJxSUFZMkFnQWdCVUVCYWlFRkRBQUxBQXNnQUNBQkVBOUNnSUNBZ09BQUlRRUxJQUVMaUFFQkFuNGdBQ0FCRUMwaEFnSkFJQUZCQUVnTkFDQUFLQUlRS0FJNElBRkJBblJxS0FJQUtRSUVJZ05DZ0lDQWdJQ0FnSUJBZzBLQWdJQ0FnSUNBZ0lCL1VpQURRb0NBZ0lEdy8vLy9QNE5DQUZJZ0EwS0FnSUNBZ0lDQWdFQlVjbkVnQTBMLy8vLy9ENE5DZ0lDQWdBaFJjZzBBSUFCQm5vQUJJQUpCbklBQkVMNEJJUUlMSUFJTFpBRUNmd0pBQWtBZ0FVS0FnSUNBY0ZRTkFDQUJFTVlGRFFCQmZ5RURJQUFnQWhBeElnUkZEUUVnQUNBRUVOY0ZJUUlnQUNBRUVCTWdBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEJJQUFnQVVFMklBSkJBUkFaUVFCSURRRUxRUUFoQXdzZ0F3czFBQUpBSUFKRklBRkNnSUNBZ0hCVWNnMEFJQUVReGdVTkFDQUFJQUZCTmlBQUlBSVFMVUVCRUJsQkFFNE5BRUYvRHd0QkFBc01BQ0FBSUFGQnV5WVFqd0VMYUFJQmZ3RitBa0FnQUNBQlFla0FJQUZCQUJBVUlnUkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUFJQVFRSmlFRElBQWdBVUhBQUNBQlFRQVFGQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVMUVFBaEEwS0FnSUNBNEFBaEFRc2dBaUFETmdJQUlBRUxGQUVCZmlBQUlBRVFKU0VDSUFBZ0FSQVBJQUlMOWdFQkJIOGdBQ2dDeUFFaUJTZ0NFQ0lFUVRCcUlRWWdCQ0FFS0FJWUlBRnhRWDl6UVFKMGFpZ0NBQ0VFQWtBRFFDQUVSUTBCSUFFZ0JpQUVRUUZySWdkQkEzUnFJZ1FvQWdSSEJFQWdCQ2dDQUVILy8vOGZjU0VFREFFTEN5QUZLQUlVSUFkQkEzUnFJUVVDUUNBRFFRRkdEUUFnQlRVQ0JFSWdoa0tBZ0lDQXdBQlJCRUFnQUNBQ0VBOGdBQ0FFS0FJRUVOa0JRWDhQQ3lBRUxRQURRUWh4RFFBZ0FDQUNFQThnQUNBQlFjNGRFSThCUVg4UEN5QUFJQVVnQWhBZ1FRQVBDeUFBSUFBcEE4QUJJQUVnQWdKL0lBQW9BaEFvQW93QklnTUVRRUdBZ0FZZ0F5Z0NLRUVCY1EwQkdndEJnSUFDQ3hEUUFRdUtBUUVCZndKQUlBSkNnSUNBZ0hDRFFvQ0FnSUNRZjFFZ0EwS0FnSUNBY0lOQ2dJQ0FnSkIvVVhGRkJFQWdBRUdOOXdCQkFCQVZEQUVMSUFBZ0FVRVNFR1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFHbklnUWdBejRDSkNBRUlBSStBaUFnQUNBQlFkVUFRZ0JCQWhBWkdpQUJEd3NnQUNBREVBOGdBQ0FDRUE5Q2dJQ0FnT0FBQ3cwQUlBQWdBVUhPbFFFUS93TUxad0VCZndKQUlBRkJBRTRFUUNBQUtBSVFJZ0lvQWl3Z0FVME5BU0FDS0FJNElBRkJBblJxS0FJQUlnRWdBU2dDQUVFQmFqWUNBQ0FBSUFGQkJCQ0FCQThMUWZLUkFVR3UvQUJCemhkQm1kSUFFQUFBQzBIWjN3QkJydndBUWM4WFFablNBQkFBQUF0RUFRRi9JQUJCK0FGcUlRSWdBRUgwQVdvaEFBTi9JQUFnQWlnQ0FDSUNSZ1JBUVFBUEN5QUJJQUpCQkdzb0FnQkdCSDhnQWtFSWF3VWdBa0VFYWlFQ0RBRUxDd3RTQWdKL0FYNENRQ0FBS0FJUUtBS01BU0lCUlEwQUlBRXBBd2dpQTBLQWdJQ0FjRlFOQUNBRHB5SUJMd0VHRU80QlJRMEFJQUVvQWlBaUFTMEFFa0VFY1VVTkFDQUFJQUVvQWtBUUdDRUNDeUFDQzZvUEFnVi9EMzRqQUVIUUFtc2lCU1FBSUFSQy8vLy8vLy8vUDRNaEN5QUNRdi8vLy8vLy96K0RJUW9nQWlBRWhVS0FnSUNBZ0lDQWdJQi9neUVOSUFSQ01JaW5RZi8vQVhFaENBSkFBa0FnQWtJd2lLZEIvLzhCY1NJSlFmLy9BV3RCZ29CK1R3UkFJQWhCLy84QmEwR0JnSDVMRFFFTElBRlFJQUpDLy8vLy8vLy8vLy8vQUlNaURFS0FnSUNBZ0lEQS8vOEFWQ0FNUW9DQWdJQ0FnTUQvL3dCUkcwVUVRQ0FDUW9DQWdJQ0FnQ0NFSVEwTUFnc2dBMUFnQkVMLy8vLy8vLy8vLy84QWd5SUNRb0NBZ0lDQWdNRC8vd0JVSUFKQ2dJQ0FnSUNBd1AvL0FGRWJSUVJBSUFSQ2dJQ0FnSUNBSUlRaERTQURJUUVNQWdzZ0FTQU1Rb0NBZ0lDQWdNRC8vd0NGaEZBRVFDQURJQUpDZ0lDQWdJQ0F3UC8vQUlXRVVBUkFRZ0FoQVVLQWdJQ0FnSURnLy84QUlRME1Bd3NnRFVLQWdJQ0FnSURBLy84QWhDRU5RZ0FoQVF3Q0N5QURJQUpDZ0lDQWdJQ0F3UC8vQUlXRVVBUkFRZ0FoQVF3Q0N5QUJJQXlFVUFSQVFvQ0FnSUNBZ09ELy93QWdEU0FDSUFPRVVCc2hEVUlBSVFFTUFnc2dBaUFEaEZBRVFDQU5Rb0NBZ0lDQWdNRC8vd0NFSVExQ0FDRUJEQUlMSUF4Qy8vLy8vLy8vUDFnRVFDQUZRY0FDYWlBQklBb2dBU0FLSUFwUUlnWWJlU0FHUVFaMHJYeW5JZ1pCRDJzUVowRVFJQVpySVFZZ0JTa0R5QUloQ2lBRktRUEFBaUVCQ3lBQ1F2Ly8vLy8vL3o5V0RRQWdCVUd3QW1vZ0F5QUxJQU1nQ3lBTFVDSUhHM2tnQjBFR2RLMThweUlIUVE5ckVHY2dCaUFIYWtFUWF5RUdJQVVwQTdnQ0lRc2dCU2tEc0FJaEF3c2dCVUdnQW1vZ0MwS0FnSUNBZ0lEQUFJUWlFa0lQaGlBRFFqR0loQ0lDUWdCQ2dJQ0FnTERtdklMMUFDQUNmU0lFUWdBUVppQUZRWkFDYWtJQUlBVXBBNmdDZlVJQUlBUkNBQkJtSUFWQmdBSnFJQVVwQTVnQ1FnR0dJQVVwQTVBQ1FqK0loQ0lFUWdBZ0FrSUFFR1lnQlVId0FXb2dCRUlBUWdBZ0JTa0RpQUo5UWdBUVppQUZRZUFCYWlBRktRUDRBVUlCaGlBRktRUHdBVUkvaUlRaUJFSUFJQUpDQUJCbUlBVkIwQUZxSUFSQ0FFSUFJQVVwQStnQmZVSUFFR1lnQlVIQUFXb2dCU2tEMkFGQ0FZWWdCU2tEMEFGQ1A0aUVJZ1JDQUNBQ1FnQVFaaUFGUWJBQmFpQUVRZ0JDQUNBRktRUElBWDFDQUJCbUlBVkJvQUZxSUFKQ0FDQUZLUU80QVVJQmhpQUZLUU93QVVJL2lJUkNBWDBpQWtJQUVHWWdCVUdRQVdvZ0EwSVBoa0lBSUFKQ0FCQm1JQVZCOEFCcUlBSkNBRUlBSUFVcEE2Z0JJQVVwQTZBQklnd2dCU2tEbUFGOElnUWdERlN0ZkNBRVFnRldyWHg5UWdBUVppQUZRWUFCYWtJQklBUjlRZ0FnQWtJQUVHWWdCaUFKSUFocmFpRUdBbjhnQlNrRGNDSVRRZ0dHSWc0Z0JTa0RpQUVpRDBJQmhpQUZLUU9BQVVJL2lJUjhJaEJDNSt3QWZTSVVRaUNJSWdJZ0NrS0FnSUNBZ0lEQUFJUWlGVUlCaGlJV1FpQ0lJZ1IrSWhFZ0FVSUJoaUlNUWlDSUlnc2dFQ0FVVnEwZ0RpQVFWcTBnQlNrRGVFSUJoaUFUUWorSWhDQVBRaitJZkh4OFFnRjlJaE5DSUlnaUVINThJZzRnRVZTdElBNGdEaUFUUXYvLy8vOFBneUlUSUFGQ1A0Z2lGeUFLUWdHR2hFTC8vLy8vRDRNaUNuNThJZzVXclh3Z0JDQVFmbndnQkNBVGZpSVJJQW9nRUg1OElnOGdFVlN0UWlDR0lBOUNJSWlFZkNBT0lBNGdEMElnaG53aURsYXRmQ0FPSUE0Z0ZFTC8vLy8vRDRNaUZDQUtmaUlSSUFJZ0MzNThJZzhnRVZTdElBOGdEeUFUSUF4Qy92Ly8vdytESWhGK2ZDSVBWcTE4ZkNJT1ZxMThJQTRnQkNBVWZpSVlJQkFnRVg1OElnUWdBaUFLZm53aUNpQUxJQk4rZkNJUVFpQ0lJQW9nRUZhdElBUWdHRlN0SUFRZ0NsYXRmSHhDSUlhRWZDSUVJQTVVclh3Z0JDQVBJQUlnRVg0aUFpQUxJQlIrZkNJTFFpQ0lJQUlnQzFhdFFpQ0doSHdpQWlBUFZLMGdBaUFRUWlDR2ZDQUNWSzE4ZkNJQ0lBUlVyWHdpQkVMLy8vLy8vLy8vQUZnRVFDQVdJQmVFSVJVZ0JVSFFBR29nQWlBRUlBTWdFaEJtSUFGQ01ZWWdCU2tEV0gwZ0JTa0RVQ0lCUWdCU3JYMGhDa0lBSUFGOUlRc2dCa0grL3dCcURBRUxJQVZCNEFCcUlBUkNQNFlnQWtJQmlJUWlBaUFFUWdHSUlnUWdBeUFTRUdZZ0FVSXdoaUFGS1FOb2ZTQUZLUU5nSWd4Q0FGS3RmU0VLUWdBZ0RIMGhDeUFCSVF3Z0JrSC8vd0JxQ3lJR1FmLy9BVTRFUUNBTlFvQ0FnSUNBZ01ELy93Q0VJUTFDQUNFQkRBRUxBbjRnQmtFQVNnUkFJQXBDQVlZZ0MwSS9pSVFoQ2lBRVF2Ly8vLy8vL3orRElBYXRRakNHaENFTUlBdENBWVlNQVFzZ0JrR1BmMHdFUUVJQUlRRU1BZ3NnQlVGQWF5QUNJQVJCQVNBR2F4Q09BaUFGUVRCcUlBd2dGU0FHUWZBQWFoQm5JQVZCSUdvZ0F5QVNJQVVwQTBBaUFpQUZLUU5JSWd3UVppQUZLUU00SUFVcEF5aENBWVlnQlNrRElDSUJRaitJaEgwZ0JTa0RNQ0lFSUFGQ0FZWWlBVlN0ZlNFS0lBUWdBWDBMSVFRZ0JVRVFhaUFESUJKQ0EwSUFFR1lnQlNBRElCSkNCVUlBRUdZZ0RDQUNJQUlnQXlBQ1FnR0RJZ0VnQkh3aUExUWdDaUFCSUFOV3JYd2lBU0FTVmlBQklCSlJHNjE4SWdKV3JYd2lCQ0FDSUFJZ0JFS0FnSUNBZ0lEQS8vOEFWQ0FESUFVcEF4QldJQUVnQlNrREdDSUVWaUFCSUFSUkczR3RmQ0lDVnExOElnUWdBaUFFUW9DQWdJQ0FnTUQvL3dCVUlBTWdCU2tEQUZZZ0FTQUZLUU1JSWdOV0lBRWdBMUViY2ExOElnRWdBbFN0ZkNBTmhDRU5DeUFBSUFFM0F3QWdBQ0FOTndNSUlBVkIwQUpxSkFBTHlESURFWDhIZmdGOEl3QkJFR3NpRUNRQUl3QkJvQUZySWc4a0FDQVBJQUEyQWp3Z0R5QUFOZ0lVSUE5QmZ6WUNHQ0FQUVJCcUlnSVFtZ1FqQUVFd2F5SU9KQUFEUUFKL0lBSW9BZ1FpQUNBQ0tBSm9Sd1JBSUFJZ0FFRUJhallDQkNBQUxRQUFEQUVMSUFJUVZRc2lCUkNPQmcwQUMwRUJJUU1DUUFKQUlBVkJLMnNPQXdBQkFBRUxRWDlCQVNBRlFTMUdHeUVESUFJb0FnUWlBQ0FDS0FKb1J3UkFJQUlnQUVFQmFqWUNCQ0FBTFFBQUlRVU1BUXNnQWhCVklRVUxBa0FDUUFKQUEwQWdCa0hzSEdvc0FBQWdCVUVnY2tZRVFBSkFJQVpCQmtzTkFDQUNLQUlFSWdBZ0FpZ0NhRWNFUUNBQ0lBQkJBV28yQWdRZ0FDMEFBQ0VGREFFTElBSVFWU0VGQ3lBR1FRRnFJZ1pCQ0VjTkFRd0NDd3NnQmtFRFJ3UkFJQVpCQ0VZTkFTQUdRUVJKRFFJZ0JrRUlSZzBCQ3lBQ0tRTndJaEpDQUZrRVFDQUNJQUlvQWdSQkFXczJBZ1FMSUFaQkJFa05BQ0FTUWdCVElRQURRQ0FBUlFSQUlBSWdBaWdDQkVFQmF6WUNCQXNnQmtFQmF5SUdRUU5MRFFBTEMwSUFJUklqQUVFUWF5SUZKQUFDZmlBRHNrTUFBSUIvbEx3aUEwSC8vLy8vQjNFaUFFR0FnSUFFYTBILy8vLzNCMDBFUUNBQXJVSVpoa0tBZ0lDQWdJQ0F3RDk4REFFTElBT3RRaG1HUW9DQWdJQ0FnTUQvL3dDRUlBQkJnSUNBL0FkUERRQWFRZ0FnQUVVTkFCb2dCU0FBclVJQUlBQm5JZ0JCMFFCcUVHY2dCU2tEQUNFU0lBVXBBd2hDZ0lDQWdJQ0F3QUNGUVluL0FDQUFhNjFDTUlhRUN5RVRJQTRnRWpjREFDQU9JQk1nQTBHQWdJQ0FlSEd0UWlDR2hEY0RDQ0FGUVJCcUpBQWdEaWtEQ0NFU0lBNHBBd0FoRXd3QkN3SkFBa0FnQmcwQVFRQWhCZ05BSUFaQjRORUFhaXdBQUNBRlFTQnlSdzBCQWtBZ0JrRUJTdzBBSUFJb0FnUWlBQ0FDS0FKb1J3UkFJQUlnQUVFQmFqWUNCQ0FBTFFBQUlRVU1BUXNnQWhCVklRVUxJQVpCQVdvaUJrRURSdzBBQ3d3QkN3SkFBa0FnQmc0RUFBRUJBZ0VMQWtBZ0JVRXdSdzBBQW44Z0FpZ0NCQ0lBSUFJb0FtaEhCRUFnQWlBQVFRRnFOZ0lFSUFBdEFBQU1BUXNnQWhCVkMwRmZjVUhZQUVZRVFDQURJUUJCQUNFREl3QkJzQU5ySWdRa0FBSi9Ba0FnQWlnQ0JDSUZJQUlvQW1oSEJFQWdBaUFGUVFGcU5nSUVJQVV0QUFBaEF3d0JDMEVBREFFTFFRRUxJUVlEUUFKQUFrQUNRQUpBQW40Q1FBSkFBbjhnQmtVRVFDQUNFRlVNQVFzZ0EwRXdSd1JBUW9DQWdJQ0FnTUQvUHlFVElBTkJMa1lOQTBJQURBUUxJQUlvQWdRaUJTQUNLQUpvUmcwQlFRRWhDeUFDSUFWQkFXbzJBZ1FnQlMwQUFBc2hBMEVCSVFZTUJ3dEJBU0VMREFRTEFuOGdBaWdDQkNJRElBSW9BbWhIQkVBZ0FpQURRUUZxTmdJRUlBTXRBQUFNQVFzZ0FoQlZDeUlEUVRCR0RRRkJBU0VNUWdBTElSWU1BUXNEUUNBVlFnRjlJUlZCQVNFTUFuOGdBaWdDQkNJRElBSW9BbWhIQkVBZ0FpQURRUUZxTmdJRUlBTXRBQUFNQVFzZ0FoQlZDeUlEUVRCR0RRQUxRUUVoQ3dzRFFDQURRU0J5SVFvQ1FBSkFJQU5CTUdzaUJVRUtTUTBBSUFOQkxrWWdDa0hoQUd0QkJrbHlSUVJBSUFNaEJnd0ZDMEV1SVFZZ0EwRXVSdzBBSUF3TkJFRUJJUXdnRWlFVkRBRUxJQXBCMXdCcklBVWdBMEU1U2hzaEF3SkFJQkpDQjFjRVFDQURJQWRCQkhScUlRY01BUXNnRWtJY1dBUkFJQVJCTUdvZ0F4QjVJQVJCSUdvZ0Z5QVRRZ0JDZ0lDQWdJQ0F3UDAvRUM0Z0JFRVFhaUFFS1FNd0lBUXBBemdnQkNrRElDSVhJQVFwQXlnaUV4QXVJQVFnQkNrREVDQUVLUU1ZSUJRZ0ZoQndJQVFwQXdnaEZpQUVLUU1BSVJRTUFRc2dBMFVnQ0hJTkFDQUVRZEFBYWlBWElCTkNBRUtBZ0lDQWdJQ0EvejhRTGlBRVFVQnJJQVFwQTFBZ0JDa0RXQ0FVSUJZUWNDQUVLUU5JSVJaQkFTRUlJQVFwQTBBaEZBc2dFa0lCZkNFU1FRRWhDd3NnQWlnQ0JDSURJQUlvQW1oSEJIOGdBaUFEUVFGcU5nSUVJQU10QUFBRklBSVFWUXNoQXd3QUN3QUxRUUFoQmd3QkN3c0NmaUFMUlFSQUFrQWdBaWtEY0VJQVV3MEFJQUlnQWlnQ0JDSURRUUpyTmdJRUlBeEZEUUFnQWlBRFFRTnJOZ0lFQ3lBRVFlQUFhaUFBdDBRQUFBQUFBQUFBQUtJUXF3RWdCQ2tEWUNFVUlBUXBBMmdNQVFzZ0VrSUhWd1JBSUJJaEV3TkFJQWRCQkhRaEJ5QVRRZ0Y4SWhOQ0NGSU5BQXNMQWtBQ1FBSkFJQVpCWDNGQjBBQkdCRUFnQWhDSEJpSVRRb0NBZ0lDQWdJQ0FnSDlTRFFNZ0Fpa0RjRUlBV1EwQkRBSUxRZ0FoRXlBQ0tRTndRZ0JURFFJTElBSWdBaWdDQkVFQmF6WUNCQXRDQUNFVEN5QUhSUVJBSUFSQjhBQnFJQUMzUkFBQUFBQUFBQUFBb2hDckFTQUVLUU53SVJRZ0JDa0RlQXdCQ3lBVklCSWdEQnRDQW9ZZ0UzeENJSDBpRWtLekNGa0VRRUdnMUFSQnhBQTJBZ0FnQkVHZ0FXb2dBQkI1SUFSQmtBRnFJQVFwQTZBQklBUXBBNmdCUW45Qy8vLy8vLy8vdi8vL0FCQXVJQVJCZ0FGcUlBUXBBNUFCSUFRcEE1Z0JRbjlDLy8vLy8vLy92Ly8vQUJBdUlBUXBBNEFCSVJRZ0JDa0RpQUVNQVFzZ0VrTHNkVmtFUUNBSFFRQk9CRUFEUUNBRVFhQURhaUFVSUJaQ0FFS0FnSUNBZ0lEQS83OS9FSEFnRkNBV1FvQ0FnSUNBZ0lEL1B4RHBCU0VESUFSQmtBTnFJQlFnRmlBRUtRT2dBeUFVSUFOQkFFNGlBeHNnQkNrRHFBTWdGaUFER3hCd0lCSkNBWDBoRWlBRUtRT1lBeUVXSUFRcEE1QURJUlFnQjBFQmRDQURjaUlIUVFCT0RRQUxDd0orUVRVZ0VrTFNDSHdpRTZjaUEwRUFJQU5CQUVvYklCTkNOVmtiSWdOQjhRQlBCRUFnQkVHQUEyb2dBQkI1SUFRcEE0Z0RJUlVnQkNrRGdBTWhGMElBREFFTElBUkI0QUpxUkFBQUFBQUFBUEEvUVpBQklBTnJFTm9CRUtzQklBUkIwQUpxSUFBUWVTQUVRZkFDYWlBRUtRUGdBaUFFS1FQb0FpQUVLUVBRQWlJWElBUXBBOWdDSWhVUWlRWWdCQ2tEK0FJaEdDQUVLUVB3QWdzaEV5QUVRY0FDYWlBSElBZEJBWEZGSUJRZ0ZrSUFRZ0FRN1FGQkFFY2dBMEVnU1hGeElnQnFFSVlDSUFSQnNBSnFJQmNnRlNBRUtRUEFBaUFFS1FQSUFoQXVJQVJCa0FKcUlBUXBBN0FDSUFRcEE3Z0NJQk1nR0JCd0lBUkJvQUpxSUJjZ0ZVSUFJQlFnQUJ0Q0FDQVdJQUFiRUM0Z0JFR0FBbW9nQkNrRG9BSWdCQ2tEcUFJZ0JDa0RrQUlnQkNrRG1BSVFjQ0FFUWZBQmFpQUVLUU9BQWlBRUtRT0lBaUFUSUJnUWdnUWdCQ2tEOEFFaUZTQUVLUVA0QVNJVFFnQkNBQkR0QVVVRVFFR2cxQVJCeEFBMkFnQUxJQVJCNEFGcUlCVWdFeUFTcHhDSUJpQUVLUVBnQVNFVUlBUXBBK2dCREFFTFFhRFVCRUhFQURZQ0FDQUVRZEFCYWlBQUVIa2dCRUhBQVdvZ0JDa0QwQUVnQkNrRDJBRkNBRUtBZ0lDQWdJREFBQkF1SUFSQnNBRnFJQVFwQThBQklBUXBBOGdCUWdCQ2dJQ0FnSUNBd0FBUUxpQUVLUU93QVNFVUlBUXBBN2dCQ3lFU0lBNGdGRGNERUNBT0lCSTNBeGdnQkVHd0Eyb2tBQ0FPS1FNWUlSSWdEaWtERUNFVERBUUxJQUlwQTNCQ0FGTU5BQ0FDSUFJb0FnUkJBV3MyQWdRTElBVWhBQ0FESVFaQkFDRURJd0JCa01ZQWF5SUJKQUFDUUFKL0EwQWdBRUV3UndSQUFrQWdBRUV1UncwRUlBSW9BZ1FpQUNBQ0tBSm9SZzBBSUFJZ0FFRUJhallDQkNBQUxRQUFEQU1MQlNBQ0tBSUVJZ0FnQWlnQ2FFY0VmMEVCSVFNZ0FpQUFRUUZxTmdJRUlBQXRBQUFGUVFFaEF5QUNFRlVMSVFBTUFRc0xJQUlRVlFzaEFFRUJJUWdnQUVFd1J3MEFBMEFnRWtJQmZTRVNBbjhnQWlnQ0JDSUFJQUlvQW1oSEJFQWdBaUFBUVFGcU5nSUVJQUF0QUFBTUFRc2dBaEJWQ3lJQVFUQkdEUUFMUVFFaEF3c2dBVUVBTmdLUUJpQU9BbjRDUUFKQUFrQWdBRUV1UmlJRklBQkJNR3NpRFVFSlRYSUVRQU5BQWtBZ0JVRUJjUVJBSUFoRkJFQWdFeUVTUVFFaENBd0NDeUFEUlNFRkRBUUxJQk5DQVh3aEV5QUhRZndQVEFSQUlBc2dFNmNnQUVFd1Joc2hDeUFCUVpBR2FpQUhRUUowYWlJRElBb0VmeUFBSUFNb0FnQkJDbXhxUVRCckJTQU5DellDQUVFQklRTkJBQ0FLUVFGcUlnQWdBRUVKUmlJQUd5RUtJQUFnQjJvaEJ3d0JDeUFBUVRCR0RRQWdBU0FCS0FLQVJrRUJjallDZ0VaQjNJOEJJUXNMQW44Z0FpZ0NCQ0lBSUFJb0FtaEhCRUFnQWlBQVFRRnFOZ0lFSUFBdEFBQU1BUXNnQWhCVkN5SUFRUzVHSWdVZ0FFRXdheUlOUVFwSmNnMEFDd3NnRWlBVElBZ2JJUklnQTBVZ0FFRmZjVUhGQUVkeVJRUkFBa0FnQWhDSEJpSVVRb0NBZ0lDQWdJQ0FnSDlTRFFCQ0FDRVVJQUlwQTNCQ0FGTU5BQ0FDSUFJb0FnUkJBV3MyQWdRTElCSWdGSHdoRWd3REN5QURSU0VGSUFCQkFFZ05BUXNnQWlrRGNFSUFVdzBBSUFJZ0FpZ0NCRUVCYXpZQ0JBc2dCVVVOQUVHZzFBUkJIRFlDQUNBQ0VKb0VRZ0FoRTBJQURBRUxJQUVvQXBBR0lnQkZCRUFnQVNBR3QwUUFBQUFBQUFBQUFLSVFxd0VnQVNrREFDRVRJQUVwQXdnTUFRc2dFaUFUVWlBVFFnbFZja1VFUUNBQlFUQnFJQVlRZVNBQlFTQnFJQUFRaGdJZ0FVRVFhaUFCS1FNd0lBRXBBemdnQVNrRElDQUJLUU1vRUM0Z0FTa0RFQ0VUSUFFcEF4Z01BUXNnRWtLYUJGa0VRRUdnMUFSQnhBQTJBZ0FnQVVIZ0FHb2dCaEI1SUFGQjBBQnFJQUVwQTJBZ0FTa0RhRUovUXYvLy8vLy8vNy8vL3dBUUxpQUJRVUJySUFFcEExQWdBU2tEV0VKL1F2Ly8vLy8vLzcvLy93QVFMaUFCS1FOQUlSTWdBU2tEU0F3QkN5QVNRdXQxVndSQVFhRFVCRUhFQURZQ0FDQUJRWkFCYWlBR0VIa2dBVUdBQVdvZ0FTa0RrQUVnQVNrRG1BRkNBRUtBZ0lDQWdJREFBQkF1SUFGQjhBQnFJQUVwQTRBQklBRXBBNGdCUWdCQ2dJQ0FnSUNBd0FBUUxpQUJLUU53SVJNZ0FTa0RlQXdCQ3lBS0JFQWdDa0VJVEFSQUlBRkJrQVpxSUFkQkFuUnFJZ0FvQWdBaENRTkFJQWxCQ213aENTQUtRUUZxSWdwQkNVY05BQXNnQUNBSk5nSUFDeUFIUVFGcUlRY0xBa0FnQ3lBU3B5SUlTaUFMUVFoS2NpQUlRUkZLY2cwQUlBaEJDVVlFUUNBQlFjQUJhaUFHRUhrZ0FVR3dBV29nQVNnQ2tBWVFoZ0lnQVVHZ0FXb2dBU2tEd0FFZ0FTa0R5QUVnQVNrRHNBRWdBU2tEdUFFUUxpQUJLUU9nQVNFVElBRXBBNmdCREFJTElBaEJDRXdFUUNBQlFaQUNhaUFHRUhrZ0FVR0FBbW9nQVNnQ2tBWVFoZ0lnQVVId0FXb2dBU2tEa0FJZ0FTa0RtQUlnQVNrRGdBSWdBU2tEaUFJUUxpQUJRZUFCYWtFQUlBaHJRUUowUWVEQkJHb29BZ0FRZVNBQlFkQUJhaUFCS1FQd0FTQUJLUVA0QVNBQktRUGdBU0FCS1FQb0FSRGpCU0FCS1FQUUFTRVRJQUVwQTlnQkRBSUxJQWhCRVU1QkFDQUJLQUtRQmlJQUlBaEJmV3hCMEFCcWRoc05BQ0FCUWVBQ2FpQUdFSGtnQVVIUUFtb2dBQkNHQWlBQlFjQUNhaUFCS1FQZ0FpQUJLUVBvQWlBQktRUFFBaUFCS1FQWUFoQXVJQUZCc0FKcUlBaEJBblJCbU1FRWFpZ0NBQkI1SUFGQm9BSnFJQUVwQThBQ0lBRXBBOGdDSUFFcEE3QUNJQUVwQTdnQ0VDNGdBU2tEb0FJaEV5QUJLUU9vQWd3QkN3TkFJQUZCa0FacUlBY2lBRUVCYXlJSFFRSjBhaWdDQUVVTkFBc0NRQ0FJUVFsdklnTkZCRUJCQUNFS1FRQWhCUXdCQzBFQUlRb2dBMEVKYWlBRElBaEJBRWdiSVFRQ1FDQUFSUVJBUVFBaEJVRUFJUUFNQVF0QmdKVHIzQU5CQUNBRWEwRUNkRUhnd1FScUtBSUFJZ3R0SVF4QkFDRU5RUUFoQ1VFQUlRVURRQ0FCUVpBR2FpQUpRUUowYWlJRElBMGdBeWdDQUNJQ0lBdHVJZ2RxSWdNMkFnQWdCVUVCYWtIL0QzRWdCU0FEUlNBRklBbEdjU0lER3lFRklBaEJDV3NnQ0NBREd5RUlJQXdnQWlBSElBdHNhMndoRFNBSlFRRnFJZ2tnQUVjTkFBc2dEVVVOQUNBQlFaQUdhaUFBUVFKMGFpQU5OZ0lBSUFCQkFXb2hBQXNnQ0NBRWEwRUphaUVJQ3dOQUlBRkJrQVpxSUFWQkFuUnFJUXdnQ0VFa1NDRUNBa0FEUUFKQUlBSU5BQ0FJUVNSSERRSWdEQ2dDQUVIUTZma0VUUTBBUVNRaENBd0NDeUFBUWY4UGFpRUhRUUFoRFNBQUlRTURRQ0FESVFBZ0RhMGdBVUdRQm1vZ0IwSC9EM0VpQzBFQ2RHb2lBelVDQUVJZGhud2lFa0tCbE92Y0ExUUVmMEVBQlNBU1FvQ1U2OXdEZ0NJVFFvRHNsS044ZmlBU2ZDRVNJQk9uQ3lFTklBTWdFcWNpQXpZQ0FDQUFJQUFnQUNBTElBTWJJQVVnQzBZYklBc2dBRUVCYTBIL0QzRkhHeUVESUF0QkFXc2hCeUFGSUF0SERRQUxJQXBCSFdzaENpQU5SUTBBQ3lBRElBVkJBV3RCL3c5eElnVkdCRUFnQVVHUUJtb2lCeUFEUWY0UGFrSC9EM0ZCQW5ScUlnQWdBQ2dDQUNBSElBTkJBV3RCL3c5eElnQkJBblJxS0FJQWNqWUNBQXNnQ0VFSmFpRUlJQUZCa0FacUlBVkJBblJxSUEwMkFnQU1BUXNMQWtBRFFDQUFRUUZxUWY4UGNTRUhJQUZCa0FacUlBQkJBV3RCL3c5eFFRSjBhaUVOQTBCQkNVRUJJQWhCTFVvYklSRUNRQU5BSUFVaEEwRUFJUWtDUUFOQUFrQWdBeUFKYWtIL0QzRWlCU0FBUmcwQUlBRkJrQVpxSUFWQkFuUnFLQUlBSWdJZ0NVRUNkRUd3d1FScUtBSUFJZ1ZKRFFBZ0FpQUZTdzBDSUFsQkFXb2lDVUVFUncwQkN3c2dDRUVrUncwQVFnQWhFa0VBSVFsQ0FDRVRBMEFnQUNBRElBbHFRZjhQY1NJRlJnUkFJQUJCQVdwQi93OXhJZ0JCQW5RZ0FXcEJBRFlDakFZTElBRkJnQVpxSUFGQmtBWnFJQVZCQW5ScUtBSUFFSVlDSUFGQjhBVnFJQklnRTBJQVFvQ0FnSURsbXJlT3dBQVFMaUFCUWVBRmFpQUJLUVB3QlNBQktRUDRCU0FCS1FPQUJpQUJLUU9JQmhCd0lBRXBBK2dGSVJNZ0FTa0Q0QVVoRWlBSlFRRnFJZ2xCQkVjTkFBc2dBVUhRQldvZ0JoQjVJQUZCd0FWcUlCSWdFeUFCS1FQUUJTQUJLUVBZQlJBdUlBRXBBOGdGSVJOQ0FDRVNJQUVwQThBRklSUkJOU0FLUWFNSmFpSUNRUUFnQWtFQVNoc2dDa0dTZDA0YklneEI4QUJORFFJTUJRc2dDaUFSYWlFS0lBQWhCU0FBSUFOR0RRQUxRWUNVNjl3RElCRjJJUVJCZnlBUmRFRi9jeUVMUVFBaENTQURJUVVEUUNBQlFaQUdhaUFEUVFKMGFpSUNJQWtnQWlnQ0FDSU1JQkYyYWlJQ05nSUFJQVZCQVdwQi93OXhJQVVnQWtVZ0F5QUZSbkVpQWhzaEJTQUlRUWxySUFnZ0Foc2hDQ0FMSUF4eElBUnNJUWtnQTBFQmFrSC9EM0VpQXlBQVJ3MEFDeUFKUlEwQklBVWdCMGNFUUNBQlFaQUdhaUFBUVFKMGFpQUpOZ0lBSUFjaEFBd0RDeUFOSUEwb0FnQkJBWEkyQWdBTUFRc0xDeUFCUVpBRmFrUUFBQUFBQUFEd1AwSGhBU0FNYXhEYUFSQ3JBU0FCUWJBRmFpQUJLUU9RQlNBQktRT1lCU0FVSUJNUWlRWWdBU2tEdUFVaEZ5QUJLUU93QlNFV0lBRkJnQVZxUkFBQUFBQUFBUEEvUWZFQUlBeHJFTm9CRUtzQklBRkJvQVZxSUJRZ0V5QUJLUU9BQlNBQktRT0lCUkQ0QlNBQlFmQUVhaUFVSUJNZ0FTa0RvQVVpRWlBQktRT29CU0lWRUlJRUlBRkI0QVJxSUJZZ0Z5QUJLUVB3QkNBQktRUDRCQkJ3SUFFcEErZ0VJUk1nQVNrRDRBUWhGQXNnQ2tIeEFHb2hCd0pBSUFOQkJHcEIvdzl4SWdVZ0FFWU5BQUpBSUFGQmtBWnFJQVZCQW5ScUtBSUFJZ1ZCLzhtMTdnRk5CRUFnQlVVZ0EwRUZha0gvRDNFZ0FFWnhEUUVnQVVId0Eyb2dCcmRFQUFBQUFBQUEwRCtpRUtzQklBRkI0QU5xSUJJZ0ZTQUJLUVB3QXlBQktRUDRBeEJ3SUFFcEErZ0RJUlVnQVNrRDRBTWhFZ3dCQ3lBRlFZREt0ZTRCUndSQUlBRkIwQVJxSUFhM1JBQUFBQUFBQU9nL29oQ3JBU0FCUWNBRWFpQVNJQlVnQVNrRDBBUWdBU2tEMkFRUWNDQUJLUVBJQkNFVklBRXBBOEFFSVJJTUFRc2dCcmNoR1NBQUlBTkJCV3BCL3c5eFJnUkFJQUZCa0FScUlCbEVBQUFBQUFBQTREK2lFS3NCSUFGQmdBUnFJQklnRlNBQktRT1FCQ0FCS1FPWUJCQndJQUVwQTRnRUlSVWdBU2tEZ0FRaEVnd0JDeUFCUWJBRWFpQVpSQUFBQUFBQUFPZy9vaENyQVNBQlFhQUVhaUFTSUJVZ0FTa0RzQVFnQVNrRHVBUVFjQ0FCS1FPb0JDRVZJQUVwQTZBRUlSSUxJQXhCN3dCTERRQWdBVUhRQTJvZ0VpQVZRZ0JDZ0lDQWdJQ0F3UDgvRVBnRklBRXBBOUFESUFFcEE5Z0RRZ0JDQUJEdEFRMEFJQUZCd0FOcUlCSWdGVUlBUW9DQWdJQ0FnTUQvUHhCd0lBRXBBOGdESVJVZ0FTa0R3QU1oRWdzZ0FVR3dBMm9nRkNBVElCSWdGUkJ3SUFGQm9BTnFJQUVwQTdBRElBRXBBN2dESUJZZ0Z4Q0NCQ0FCS1FPb0F5RVRJQUVwQTZBRElSUUNRQ0FIUWZ6Ly8vOEhjVUg4QjBrRVFDQUtJUUFNQVFzZ0FTQVRRdi8vLy8vLy8vLy8vd0NETndPWUF5QUJJQlEzQTVBRElBRkJnQU5xSUJRZ0UwSUFRb0NBZ0lDQWdJRC9QeEF1SUFFcEE1QURJQUVwQTVnRFFvQ0FnSUNBZ0lDNHdBQVE2UVVoQUNBQktRT0lBeUFUSUFCQkFFNGlCUnNoRXlBQktRT0FBeUFVSUFVYklSUWdFaUFWUWdCQ0FCRHRBU0VESUFVZ0Ntb2lBRUdQQjB3RVFDQURRUUJISUFwQmtuZElJZ01nQWlBTVIzRWdBeUFGRzNGRkRRRUxRYURVQkVIRUFEWUNBQXNnQVVId0Ftb2dGQ0FUSUFBUWlBWWdBU2tEOEFJaEV5QUJLUVA0QWdzM0F5Z2dEaUFUTndNZ0lBRkJrTVlBYWlRQUlBNHBBeWdoRWlBT0tRTWdJUk1NQWdzZ0Fpa0RjRUlBV1FSQUlBSWdBaWdDQkVFQmF6WUNCQXRCb05RRVFSdzJBZ0FnQWhDYUJBd0JDd0pBQW44Z0FpZ0NCQ0lBSUFJb0FtaEhCRUFnQWlBQVFRRnFOZ0lFSUFBdEFBQU1BUXNnQWhCVkMwRW9SZ1JBUVFFaEJnd0JDMEtBZ0lDQWdJRGcvLzhBSVJJZ0Fpa0RjRUlBVXcwQklBSWdBaWdDQkVFQmF6WUNCQXdCQ3dOQUFuOGdBaWdDQkNJQUlBSW9BbWhIQkVBZ0FpQUFRUUZxTmdJRUlBQXRBQUFNQVFzZ0FoQlZDeUlBUVRCclFRcEpJQUJCd1FCclFScEpjaUFBUWQ4QVJuSkZJQUJCNFFCclFScFBjVVVFUUNBR1FRRnFJUVlNQVFzTFFvQ0FnSUNBZ09ELy93QWhFaUFBUVNsR0RRQWdBaWtEY0NJVlFnQlpCRUFnQWlBQ0tBSUVRUUZyTmdJRUN5QUdSUTBBQTBBZ0JrRUJheUVHSUJWQ0FGa0VRQ0FDSUFJb0FnUkJBV3MyQWdRTElBWU5BQXNMSUE4Z0V6Y0RBQ0FQSUJJM0F3Z2dEa0V3YWlRQUlBOHBBd0FoRWlBUUlBOHBBd2czQXdnZ0VDQVNOd01BSUE5Qm9BRnFKQUFnRUNrREFDQVFLUU1JRUw4RklSa2dFRUVRYWlRQUlCa0wwUUVCQVg4Q1FBSkFJQUFnQVhOQkEzRUVRQ0FCTFFBQUlRSU1BUXNnQVVFRGNRUkFBMEFnQUNBQkxRQUFJZ0k2QUFBZ0FrVU5BeUFBUVFGcUlRQWdBVUVCYWlJQlFRTnhEUUFMQ3lBQktBSUFJZ0pCZjNNZ0FrR0Jnb1FJYTNGQmdJR0NoSGh4RFFBRFFDQUFJQUkyQWdBZ0FTZ0NCQ0VDSUFCQkJHb2hBQ0FCUVFScUlRRWdBa0dCZ29RSWF5QUNRWDl6Y1VHQWdZS0VlSEZGRFFBTEN5QUFJQUk2QUFBZ0FrSC9BWEZGRFFBRFFDQUFJQUV0QUFFaUFqb0FBU0FBUVFGcUlRQWdBVUVCYWlFQklBSU5BQXNMQy9VQkFnRi9BWDRqQUVIUUFHc2lBeVFBQWtBQ2ZpQUJRUUJJQkVBZ0F5QUJRZi8vLy84SGNUWUNBQ0FEUVJCcUlnRkJ3QUJCM0NJZ0F4Qk9HaUFBSUFFUVlnd0JDeUFBS0FJUUlnQW9BaXdnQVUwTkFRSkFBa0FnQUNnQ09DSUFJQUZCQW5ScUtBSUFJZ0VwQWdRaUJFS0FnSUNBZ0lDQWdFQ0RRb0NBZ0lDQWdJQ0F3QUJSRFFBZ0FrVU5BU0FFcDBHQWdJQ0FlRWNOQUNBQUtBSzhBU0VCQ3lBQklBRW9BZ0JCQVdvMkFnQWdBYTFDZ0lDQWdKQi9oQXdCQ3lBQklBRW9BZ0JCQVdvMkFnQWdBYTFDZ0lDQWdJQi9oQXNoQkNBRFFkQUFhaVFBSUFRUEMwSHYzd0JCcnZ3QVFaZ1lRWWZpQUJBQUFBdnJBZ0VDZnlBQUlBRW9BZ1FRRXdOQUlBRW9BaEFoQXlBQ0lBRW9BaFJPUlFSQUlBQWdBeUFDUVFOMGFpZ0NBQkFUSUFKQkFXb2hBZ3dCQ3dzZ0FDZ0NFQ0lDUVJCcUlBTWdBaWdDQkJFQUFFRUFJUUlEUUFKQUlBRW9BaHdoQXlBQ0lBRW9BaUJPRFFBZ0F5QUNRUlJzYWlJREtBSUlSUVJBSUFBb0FoQWdBeWdDQkJEckFRc2dBQ0FES0FJUUVCTWdBQ0FES0FJTUVCTWdBa0VCYWlFQ0RBRUxDeUFBS0FJUUlnSkJFR29nQXlBQ0tBSUVFUUFBSUFBb0FoQWlBa0VRYWlBQktBSW9JQUlvQWdRUkFBQkJBQ0VDQTBBZ0FTZ0NOQ0VESUFJZ0FTZ0NPRTVGQkVBZ0FDQURJQUpCREd4cUtBSUVFQk1nQWtFQmFpRUNEQUVMQ3lBQUtBSVFJZ0pCRUdvZ0F5QUNLQUlFRVFBQUlBQWdBU2tEUUJBUElBQWdBU2tEU0JBUElBQWdBU2tEWUJBUElBQWdBU2tEYUJBUElBRW9BZ2dpQWlBQktBSU1JZ00yQWdRZ0F5QUNOZ0lBSUFGQ0FEY0NDQ0FBS0FJUUlnQkJFR29nQVNBQUtBSUVFUUFBQ3pBQkFYOGdBQ2dDT0NBQlFRSjBhaWdDQUNJQklBRW9BZ0FpQWtFQmF6WUNBQ0FDUVFGTUJFQWdBQ0FCRUtJREN3dkFBUUlCZndKK1FYOGhBd0pBSUFCQ0FGSWdBVUwvLy8vLy8vLy8vLzhBZ3lJRVFvQ0FnSUNBZ01ELy93QldJQVJDZ0lDQWdJQ0F3UC8vQUZFYkRRQWdBa0wvLy8vLy8vLy8vLzhBZ3lJRlFvQ0FnSUNBZ01ELy93QldJQVZDZ0lDQWdJQ0F3UC8vQUZKeERRQWdBQ0FFSUFXRWhGQUVRRUVBRHdzZ0FTQUNnMElBV1FSQUlBRWdBbElnQVNBQ1UzRU5BU0FBSUFFZ0FvV0VRZ0JTRHdzZ0FFSUFVaUFCSUFKVklBRWdBbEViRFFBZ0FDQUJJQUtGaEVJQVVpRURDeUFEQ3dvQUlBQkJmSEVRcEFNTFpRRUVmd05BSUFJZ0JVb0VRQ0FCSUFWcUlnWXRBQUFpQkVFUGFpQUVJQVJCc3dGTEd5QUVJQU1iUVFKMElnUkJnTGdCYWkwQUFDRUhJQVJCZzdnQmFpMEFBRUVYYTBIL0FYRkJCRTBFUUNBQUlBWW9BQUVRN0FFTElBVWdCMm9oQlF3QkN3c0xjQUFDUUFKQUFrQUNRQUpBSUFKQkJIWkJBM0ZCQVdzT0F3QUJBZ01MSUFFb0FnQWlBZ1JBSUFBZ0FxMUNnSUNBZ0hDRUVDTUxJQUVvQWdRaUFVVU5BeUFBSUFHdFFvQ0FnSUJ3aEJBakR3c2dBQ0FCS0FJQUVPc0JEd3NnQVNnQ0FCRHFCUThMSUFBZ0FTa0RBQkFqQ3d2SkJnRUZmd0pBQWtBQ1FBSkFBa0FDUUFKQUlBRXRBQVJCRDNFT0FnQUJCUXNnQVNBQkxRQUZRUUp5T2dBRklBRW9BaEFpQkVFd2FpRURBMEFnQVNnQ0ZDRUZJQUlnQkNnQ0lFNUZCRUFnQUNBRklBSkJBM1JxSUFNb0FnQkJHbllRN0FVZ0FrRUJhaUVDSUFOQkNHb2hBd3dCQ3dzZ0FFRVFhaUlHSUFVZ0FDZ0NCQkVBQUNBQUlBUVFrUUlnQVVJQU53TVFJQUVvQWhnaUFnUkFJQUloQXdOQUlBTUVRQ0FES0FJSUtBSUFSUTBGSUFNb0FnUU5CQ0FES0FJWUlnUWdBeWdDSENJRk5nSUVJQVVnQkRZQ0FDQURRZ0EzQWhnZ0F5Z0NFQ0lFSUFNb0FoUWlCVFlDQkNBRklBUTJBZ0FnQTBJQU53SVFJQU1vQWd3aEF3d0JDd3NEUUNBQ0JFQWdBaWdDRENFRElBQWdBaWtES0JBaklBWWdBaUFBS0FJRUVRQUFJQU1oQWd3QkN3c2dBVUVBTmdJWUN5QUFLQUpFSUFFdkFRWkJHR3hxS0FJSUlnSUVRQ0FBSUFHdFFvQ0FnSUJ3aENBQ0VRd0FDeUFCUWdBM0F5QWdBVUVBT3dFR0lBRkJBRFlDS0NBQktBSUlJZ0lnQVNnQ0RDSUROZ0lFSUFNZ0FqWUNBQ0FCUWdBM0FnZ2dBQzBBYUVFQ1J3MERJQUVvQWdCRkRRTU1CUXNnQUNBQktBSVVJQUVvQWhoQkFSRHJCUUpBSUFFb0FpQkZEUUFEUUNBQ0lBRXZBU29nQVM4QktHcFBEUUVnQUNBQktBSWdJQUpCQkhScUtBSUFFT3dCSUFKQkFXb2hBZ3dBQ3dBTFFRQWhBZ05BSUFFb0FqZ2dBa3dFUUVFQUlRSURRQ0FDSUFFb0FqeE9SUVJBSUFBZ0FTZ0NKQ0FDUVFOMGFpZ0NCQkRzQVNBQ1FRRnFJUUlNQVFzTElBRW9BakFpQWdSQUlBSVFwQU1MSUFBZ0FTZ0NIQkRzQVNBQkxRQVNRUVJ4QkVBZ0FDQUJLQUpBRU93QklBQkJFR29pQWlBQktBSlFJQUFvQWdRUkFBQWdBaUFCS0FKVUlBQW9BZ1FSQUFBTElBRW9BZ2dpQWlBQktBSU1JZ00yQWdRZ0F5QUNOZ0lBSUFGQ0FEY0NDQUpBSUFBdEFHaEJBa2NOQUNBQktBSUFSUTBBREFjTElBQkJFR29nQVNBQUtBSUVFUUFBRHdVZ0FDQUJLQUkwSUFKQkEzUnFLUU1BRUNNZ0FrRUJhaUVDREFFTEFBc0FDMEhoSEVHdS9BQkIxdVVDUVpiZUFCQUFBQXRCNGRjQVFhNzhBRUhWNVFKQmx0NEFFQUFBQ3lBR0lBRWdBQ2dDQkJFQUFBOExFQUVBQ3lBQUtBSllJZ0lnQVVFSWFpSUROZ0lFSUFFZ0FFSFlBR28yQWd3Z0FTQUNOZ0lJSUFBZ0F6WUNXQXRjQVFSL0lBRWhBd0pBQTBBZ0FpQURUU0FFUVFSTGNnMEJJQU1zQUFBaUJrSC9BSEVnQkVFSGJIUWdCWEloQlNBRVFRRnFJUVFnQTBFQmFpRURJQVpCQUVnTkFBc2dBQ0FGTmdJQUlBTWdBV3NQQ3lBQVFRQTJBZ0JCZnd2SEF3RUNmeUFBS0FJUUlnTW9BaFJCTUdvZ0F5Z0NiRXNFUUNBREVLSUZJQU1nQXlnQ0ZDSURRUUYySUFOcU5nSnNDd0pBSUFCQk1CQXBJZ01FUUNBRFFRQTJBaUFnQTBFQU5nSVlJQU5CQVRvQUJTQURJQUk3QVFZZ0F5QUJOZ0lRSUFNZ0FDQUJLQUljUVFOMEVDa2lCRFlDRkNBRURRRWdBQ2dDRUNJQ1FSQnFJQU1nQWlnQ0JCRUFBQXNnQUNnQ0VDQUJFSkVDUW9DQWdJRGdBQThMQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FDUVFGckRpUUhBQVlFQkFRRUFnWUVCZ0VHQmdZR0JnVUdCZ0lDQWdJQ0FnSUNBZ0lDQXdRRUJnUUdDeUFEUWdBM0F5QWdBMEVBTmdJb0lBTWdBeTBBQlVFTWNqb0FCU0FCSUFBb0FpUkhCSDhnQUNBRFFUQkJDaEI2QlNBRUMwSUFOd01BREFZTElBUkNnSUNBZ0RBM0F3QU1CUXNnQTBJQU53SWtJQU1nQXkwQUJVRU1jam9BQlF3RUN5QURRZ0EzQWlRTUF3c2dBMEtBZ0lDQU1EY0RJQXdCQ3lBRFFnQTNBeUFMSUFBb0FoQW9Ba1FnQWtFWWJHb29BaFJGRFFBZ0F5QURMUUFGUVFSeU9nQUZDeUFEUVFFMkFnQWdBQ2dDRUNFQUlBTkJBRG9BQkNBQUtBSlFJZ0VnQTBFSWFpSUNOZ0lFSUFNZ0FFSFFBR28yQWd3Z0F5QUJOZ0lJSUFBZ0FqWUNVQ0FEclVLQWdJQ0FjSVFMZ1FFQ0FYNEJmeU1BUVlBQ2F5SUdKQUFnQmtHQUFpQUNJQU1ReXdJYUFrQWdBQ0FBSUFGQkEzUnFLUU5ZUVFNUVNTSUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQkNnSUNBZ0NBaEJRd0JDeUFBSUFWQk15QUFJQVlRWWtFREVCa2FDeUFFQkVBZ0FDQUZRUUJCQUVFQUVNb0NDeUFBSUFVUWlnRWdCa0dBQW1va0FBc05BQ0FBSUFFZ0FSQS9FSUVEQzZvTEFRWi9JQUFnQVdvaEJRSkFBa0FnQUNnQ0JDSUNRUUZ4RFFBZ0FrRURjVVVOQVNBQUtBSUFJZ0lnQVdvaEFRSkFJQUFnQW1zaUFFSEUwQVFvQWdCSEJFQWdBa0gvQVUwRVFDQUNRUU4ySVFJZ0FDZ0NDQ0lFSUFBb0Fnd2lBMGNOQWtHdzBBUkJzTkFFS0FJQVFYNGdBbmR4TmdJQURBTUxJQUFvQWhnaEJnSkFJQUFnQUNnQ0RDSUNSd1JBUWNEUUJDZ0NBQm9nQUNnQ0NDSURJQUkyQWd3Z0FpQUROZ0lJREFFTEFrQWdBRUVVYWlJRUtBSUFJZ01OQUNBQVFSQnFJZ1FvQWdBaUF3MEFRUUFoQWd3QkN3TkFJQVFoQnlBRElnSkJGR29pQkNnQ0FDSUREUUFnQWtFUWFpRUVJQUlvQWhBaUF3MEFDeUFIUVFBMkFnQUxJQVpGRFFJQ1FDQUFLQUljSWdSQkFuUkI0TklFYWlJREtBSUFJQUJHQkVBZ0F5QUNOZ0lBSUFJTkFVRzAwQVJCdE5BRUtBSUFRWDRnQkhkeE5nSUFEQVFMSUFaQkVFRVVJQVlvQWhBZ0FFWWJhaUFDTmdJQUlBSkZEUU1MSUFJZ0JqWUNHQ0FBS0FJUUlnTUVRQ0FDSUFNMkFoQWdBeUFDTmdJWUN5QUFLQUlVSWdORkRRSWdBaUFETmdJVUlBTWdBallDR0F3Q0N5QUZLQUlFSWdKQkEzRkJBMGNOQVVHNDBBUWdBVFlDQUNBRklBSkJmbkUyQWdRZ0FDQUJRUUZ5TmdJRUlBVWdBVFlDQUE4TElBUWdBellDRENBRElBUTJBZ2dMQWtBZ0JTZ0NCQ0lDUVFKeFJRUkFRY2pRQkNnQ0FDQUZSZ1JBUWNqUUJDQUFOZ0lBUWJ6UUJFRzgwQVFvQWdBZ0FXb2lBVFlDQUNBQUlBRkJBWEkyQWdRZ0FFSEUwQVFvQWdCSERRTkJ1TkFFUVFBMkFnQkJ4TkFFUVFBMkFnQVBDMEhFMEFRb0FnQWdCVVlFUUVIRTBBUWdBRFlDQUVHNDBBUkJ1TkFFS0FJQUlBRnFJZ0UyQWdBZ0FDQUJRUUZ5TmdJRUlBQWdBV29nQVRZQ0FBOExJQUpCZUhFZ0FXb2hBUUpBSUFKQi93Rk5CRUFnQWtFRGRpRUNJQVVvQWd3aUF5QUZLQUlJSWdSR0JFQkJzTkFFUWJEUUJDZ0NBRUYrSUFKM2NUWUNBQXdDQ3lBRUlBTTJBZ3dnQXlBRU5nSUlEQUVMSUFVb0FoZ2hCZ0pBSUFVZ0JTZ0NEQ0lDUndSQVFjRFFCQ2dDQUJvZ0JTZ0NDQ0lESUFJMkFnd2dBaUFETmdJSURBRUxBa0FnQlVFVWFpSURLQUlBSWdRTkFDQUZRUkJxSWdNb0FnQWlCQTBBUVFBaEFnd0JDd05BSUFNaEJ5QUVJZ0pCRkdvaUF5Z0NBQ0lFRFFBZ0FrRVFhaUVESUFJb0FoQWlCQTBBQ3lBSFFRQTJBZ0FMSUFaRkRRQUNRQ0FGS0FJY0lnUkJBblJCNE5JRWFpSURLQUlBSUFWR0JFQWdBeUFDTmdJQUlBSU5BVUcwMEFSQnROQUVLQUlBUVg0Z0JIZHhOZ0lBREFJTElBWkJFRUVVSUFZb0FoQWdCVVliYWlBQ05nSUFJQUpGRFFFTElBSWdCallDR0NBRktBSVFJZ01FUUNBQ0lBTTJBaEFnQXlBQ05nSVlDeUFGS0FJVUlnTkZEUUFnQWlBRE5nSVVJQU1nQWpZQ0dBc2dBQ0FCUVFGeU5nSUVJQUFnQVdvZ0FUWUNBQ0FBUWNUUUJDZ0NBRWNOQVVHNDBBUWdBVFlDQUE4TElBVWdBa0YrY1RZQ0JDQUFJQUZCQVhJMkFnUWdBQ0FCYWlBQk5nSUFDeUFCUWY4QlRRUkFJQUZCZUhGQjJOQUVhaUVDQW45QnNOQUVLQUlBSWdOQkFTQUJRUU4yZENJQmNVVUVRRUd3MEFRZ0FTQURjallDQUNBQ0RBRUxJQUlvQWdnTElRRWdBaUFBTmdJSUlBRWdBRFlDRENBQUlBSTJBZ3dnQUNBQk5nSUlEd3RCSHlFRUlBRkIvLy8vQjAwRVFDQUJRU1lnQVVFSWRtY2lBbXQyUVFGeElBSkJBWFJyUVQ1cUlRUUxJQUFnQkRZQ0hDQUFRZ0EzQWhBZ0JFRUNkRUhnMGdScUlRY0NRQUpBUWJUUUJDZ0NBQ0lEUVFFZ0JIUWlBbkZGQkVCQnROQUVJQUlnQTNJMkFnQWdCeUFBTmdJQUlBQWdCellDR0F3QkN5QUJRUmtnQkVFQmRtdEJBQ0FFUVI5SEczUWhCQ0FIS0FJQUlRSURRQ0FDSWdNb0FnUkJlSEVnQVVZTkFpQUVRUjEySVFJZ0JFRUJkQ0VFSUFNZ0FrRUVjV29pQjBFUWFpZ0NBQ0lDRFFBTElBY2dBRFlDRUNBQUlBTTJBaGdMSUFBZ0FEWUNEQ0FBSUFBMkFnZ1BDeUFES0FJSUlnRWdBRFlDRENBRElBQTJBZ2dnQUVFQU5nSVlJQUFnQXpZQ0RDQUFJQUUyQWdnTEMvOEhBUXgvSUFCRkJFQWdBUkN4QVE4TEFrQWdBVUcvZjBzTkFBSi9RUkFnQVVFTGFrRjRjU0FCUVF0Skd5RUZJQUJCQ0dzaUJDZ0NCQ0lJUVhoeElRSUNRQ0FJUVFOeFJRUkFRUUFnQlVHQUFra05BaG9nQlVFRWFpQUNUUVJBSUFRaEF5QUNJQVZyUVpEVUJDZ0NBRUVCZEUwTkFndEJBQXdDQ3lBQ0lBUnFJUVlDUUNBQ0lBVlBCRUFnQWlBRmF5SURRUkJKRFFFZ0JDQUlRUUZ4SUFWeVFRSnlOZ0lFSUFRZ0JXb2lBaUFEUVFOeU5nSUVJQVlnQmlnQ0JFRUJjallDQkNBQ0lBTVE4Z1VNQVF0QnlOQUVLQUlBSUFaR0JFQkJ2TkFFS0FJQUlBSnFJZ0lnQlUwTkFpQUVJQWhCQVhFZ0JYSkJBbkkyQWdRZ0JDQUZhaUlESUFJZ0JXc2lBa0VCY2pZQ0JFRzgwQVFnQWpZQ0FFSEkwQVFnQXpZQ0FBd0JDMEhFMEFRb0FnQWdCa1lFUUVHNDBBUW9BZ0FnQW1vaUFpQUZTUTBDQWtBZ0FpQUZheUlEUVJCUEJFQWdCQ0FJUVFGeElBVnlRUUp5TmdJRUlBUWdCV29pQnlBRFFRRnlOZ0lFSUFJZ0JHb2lBaUFETmdJQUlBSWdBaWdDQkVGK2NUWUNCQXdCQ3lBRUlBaEJBWEVnQW5KQkFuSTJBZ1FnQWlBRWFpSURJQU1vQWdSQkFYSTJBZ1JCQUNFREMwSEUwQVFnQnpZQ0FFRzQwQVFnQXpZQ0FBd0JDeUFHS0FJRUlnZEJBbkVOQVNBSFFYaHhJQUpxSWdrZ0JVa05BU0FKSUFWcklRc0NRQ0FIUWY4QlRRUkFJQVlvQWd3aUF5QUdLQUlJSWdKR0JFQkJzTkFFUWJEUUJDZ0NBRUYrSUFkQkEzWjNjVFlDQUF3Q0N5QUNJQU0yQWd3Z0F5QUNOZ0lJREFFTElBWW9BaGdoQ2dKQUlBWWdCaWdDRENJQ1J3UkFRY0RRQkNnQ0FCb2dCaWdDQ0NJRElBSTJBZ3dnQWlBRE5nSUlEQUVMQWtBZ0JrRVVhaUlIS0FJQUlnTU5BQ0FHUVJCcUlnY29BZ0FpQXcwQVFRQWhBZ3dCQ3dOQUlBY2hEQ0FESWdKQkZHb2lCeWdDQUNJRERRQWdBa0VRYWlFSElBSW9BaEFpQXcwQUN5QU1RUUEyQWdBTElBcEZEUUFDUUNBR0tBSWNJZ05CQW5SQjROSUVhaUlIS0FJQUlBWkdCRUFnQnlBQ05nSUFJQUlOQVVHMDBBUkJ0TkFFS0FJQVFYNGdBM2R4TmdJQURBSUxJQXBCRUVFVUlBb29BaEFnQmtZYmFpQUNOZ0lBSUFKRkRRRUxJQUlnQ2pZQ0dDQUdLQUlRSWdNRVFDQUNJQU0yQWhBZ0F5QUNOZ0lZQ3lBR0tBSVVJZ05GRFFBZ0FpQUROZ0lVSUFNZ0FqWUNHQXNnQzBFUFRRUkFJQVFnQ0VFQmNTQUpja0VDY2pZQ0JDQUVJQWxxSWdNZ0F5Z0NCRUVCY2pZQ0JBd0JDeUFFSUFoQkFYRWdCWEpCQW5JMkFnUWdCQ0FGYWlJRElBdEJBM0kyQWdRZ0JDQUphaUlDSUFJb0FnUkJBWEkyQWdRZ0F5QUxFUElGQ3lBRUlRTUxJQU1MSWdNRVFDQURRUWhxRHdzZ0FSQ3hBU0lEUlEwQUlBTWdBRUY4UVhnZ0FFRUVheWdDQUNJRVFRTnhHeUFFUVhoeGFpSUVJQUVnQVNBRVN4c1FIeG9nQUJDYkFTQURJUTBMSUEwTE1RQWdCRUVDY1FSQVFiU0dBVUd1L0FCQnZJY0NRYU00RUFBQUN5QUFJQUFwQThBQklBRWdBaUFESUFSQmZ4REtCUXV2QVFJQmZ3RitJd0JCMEFCcklnUWtBQ0FFUVFCQjBBQVFLeUlFSUFNMkFnd2dCQ0FBTmdJQUlBUkJBVFlDQ0NBRVFxQ0FnSUFRTndNUUlBUWdBVFlDT0NBRUlBRWdBbW8yQWp4Q2dJQ0FnREFoQlFKQUFrQWdCQkNpQVEwQUlBUVEwZ01pQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFRb0FoQkJySDlHRFFFZ0JFR3c4d0JCQUJBV0N5QUFJQVVRRHlBRUlBUkJFR29RL3dGQ2dJQ0FnT0FBSVFVTElBUkIwQUJxSkFBZ0JRdGlBZ04rQVg4Z0FDa0R3QUVpQWtJZ2lLZEJkVThFUUNBQ3B5SUZJQVVvQWdCQkFXbzJBZ0FMSUFBZ0FrR0Qwd0FRc2dFaEF5QUFJQUlRRHlBQUlBQWdBMEhkd0FBUXNnRWlBaUFEUVFFZ0FSQWhJUVFnQUNBQ0VBOGdBQ0FERUE4Z0JBc01BQ0FBSUFFcEF3QVFzd0VMeWdZQ0JIOERmaU1BUVlBQmF5SUZKQUFDUUFKQUFrQWdBeUFFUWdCQ0FCRHRBVVVOQUFKL0lBUkMvLy8vLy8vL1A0TWhDZ0ovSUFSQ01JaW5RZi8vQVhFaUJrSC8vd0ZIQkVCQkJDQUdEUUVhUVFKQkF5QURJQXFFVUJzTUFnc2dBeUFLaEZBTEN5RUdJQUpDTUlpbklnaEIvLzhCY1NJSFFmLy9BVVlOQUNBR0RRRUxJQVZCRUdvZ0FTQUNJQU1nQkJBdUlBVWdCU2tERUNJQ0lBVXBBeGdpQVNBQ0lBRVE0d1VnQlNrRENDRUNJQVVwQXdBaEJBd0JDeUFCSUFKQy8vLy8vLy8vLy8vL0FJTWlDaUFESUFSQy8vLy8vLy8vLy8vL0FJTWlDUkR0QVVFQVRBUkFJQUVnQ2lBRElBa1E3UUVFUUNBQklRUU1BZ3NnQlVId0FHb2dBU0FDUWdCQ0FCQXVJQVVwQTNnaEFpQUZLUU53SVFRTUFRc2dCRUl3aUtkQi8vOEJjU0VHSUFjRWZpQUJCU0FGUWVBQWFpQUJJQXBDQUVLQWdJQ0FnSURBdThBQUVDNGdCU2tEYUNJS1FqQ0lwMEg0QUdzaEJ5QUZLUU5nQ3lFRUlBWkZCRUFnQlVIUUFHb2dBeUFKUWdCQ2dJQ0FnSUNBd0x2QUFCQXVJQVVwQTFnaUNVSXdpS2RCK0FCcklRWWdCU2tEVUNFREN5QUpRdi8vLy8vLy96K0RRb0NBZ0lDQWdNQUFoQ0VMSUFwQy8vLy8vLy8vUDROQ2dJQ0FnSUNBd0FDRUlRb2dCaUFIU0FSQUEwQUNmaUFLSUF0OUlBTWdCRmF0ZlNJSlFnQlpCRUFnQ1NBRUlBTjlJZ1NFVUFSQUlBVkJJR29nQVNBQ1FnQkNBQkF1SUFVcEF5Z2hBaUFGS1FNZ0lRUU1CUXNnQ1VJQmhpQUVRaitJaEF3QkN5QUtRZ0dHSUFSQ1A0aUVDeUVLSUFSQ0FZWWhCQ0FIUVFGcklnY2dCa29OQUFzZ0JpRUhDd0pBSUFvZ0MzMGdBeUFFVnExOUlnbENBRk1FUUNBS0lRa01BUXNnQ1NBRUlBTjlJZ1NFUWdCU0RRQWdCVUV3YWlBQklBSkNBRUlBRUM0Z0JTa0RPQ0VDSUFVcEF6QWhCQXdCQ3lBSlF2Ly8vLy8vL3o5WUJFQURRQ0FFUWorSUlRRWdCMEVCYXlFSElBUkNBWVloQkNBQklBbENBWWFFSWdsQ2dJQ0FnSUNBd0FCVURRQUxDeUFJUVlDQUFuRWhCaUFIUVFCTUJFQWdCVUZBYXlBRUlBbEMvLy8vLy8vL1A0TWdCMEg0QUdvZ0JuS3RRakNHaEVJQVFvQ0FnSUNBZ01ERFB4QXVJQVVwQTBnaEFpQUZLUU5BSVFRTUFRc2dDVUwvLy8vLy8vOC9neUFHSUFkeXJVSXdob1FoQWdzZ0FDQUVOd01BSUFBZ0FqY0RDQ0FGUVlBQmFpUUFDNHNEQWdKK0EzOGpBRUVnYXlJQ0pBQkNnSUNBZ09BQUlRUUNRQ0FBSUFNcEF3QWlCUkJnRFFBZ0FDQUJRVEVRWlNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FBSitBa0FnQUVFZ0VGOGlCa1VOQUVFQUlRTWdCa0VBTmdJVUlBWkJBRFlDQUFOQUlBTkJBa1pGQkVBZ0JpQURRUU4wYWlJSElBZEJCR29pQ0RZQ0NDQUhJQWcyQWdRZ0EwRUJhaUVEREFFTEN5QUdRb0NBZ0lBd053TVlJQUZDZ0lDQWdIQmFCRUFnQWFjZ0JqWUNJQXNnQUNBQ1FSQnFJQUVRcEFVTkFBSkFJQUFnQlVLQWdJQ0FNRUVDSUFKQkVHb1FJU0lGUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNnQ0VDSURLUU9BQVNFRUlBTkNnSUNBZ0NBM0E0QUJJQUlnQkRjRENDQUFJQUlwQXhoQ2dJQ0FnREJCQVNBQ1FRaHFFQ0VoQkNBQUlBSXBBd2dRRHlBRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FDQUVFQThMSUFBZ0JSQVBJQUFnQWlrREVCQVBJQUVoQkNBQ0tRTVlEQUlMSUFBZ0Fpa0RFQkFQSUFBZ0Fpa0RHQkFQUW9DQWdJRGdBQ0VFQ3lBQkN4QVBDeUFDUVNCcUpBQWdCQXVTQ3dJSGZnVi9Jd0JCRUdzaUFpUUFJQVJCNWFZQmFpMEFBQ0lOclNFSkFrQUNRQUpBSUFNcEF3QWlCa0wvLy8vL2IxZ0VRRUtBZ0lDQTRBQWhCU0FBSUFKQkNHb2dCaENtQVEwRElBQkNnSUNBZ0RBZ0Fpa0RDQ0lISUFtR0VQa0NJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5Bd3dCQ3dKQUFrQWdCcWNpREM4QkJpSU9RUk5yUWYvL0EzRkJBVTBFUUNBTUtBSWdJUXhDZ0lDQWdPQUFJUVVnQUNBQ0lBTXBBd2dRcGdFTkJTQU1MUUFFRFFJQ1FDQUNLUU1BSWdoQmZ5QU5kRUYvY3lJTnJJTlFCRUFnQ0NBTUtBSUFJZzZzSWdaWURRRUxJQUJCK0MxQkFCQlFEQVlMQWtBZ0F5a0RFQ0lIUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FOSUE1eERRRWdCaUFJZlNBSmlDRUhEQU1MSUFBZ0FrRUlhaUFIRUtZQkRRWWdEQzBBQkEwRElBdzBBZ0FnQWlrRENDSUhJQW1HSUFoOFdnMENDeUFBUVpMWkFFRUFFRkFNQlFzQ2ZnSkFBa0FnQUVLQWdJQ0FNQUorQWtBQ1FBSitBa0FDUUFKQUlBNUJGV3RCLy84RGNVRUtUUVJBSUFBZ0FTQUVFR1VpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBQQWtBQ1FDQU1LQUlnSWc4b0Fnd2lBeWdDSUNJTkxRQUVSUVJBSUF3b0FpZ2hEa0tBZ0lDQU1DRUJJQTB0QUFWRkJFQWdBQ0FEclVLQWdJQ0FjSVJDZ0lDQWdEQVE0d0VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBEQ3lBQUlBRWdEcTBpQ0NBSmhoRDVBaUVISUFBZ0FSQVBJQWRDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BaUFNS0FJZ0tBSU1LQUlnTFFBRVJRMEJJQUFnQnhBUEN5QUFFR3NNQVF0QkFDRURBa0FnQjBLQWdJQ0FjRlFOQUNBSHB5SVFMd0VHUVJOSERRQWdFQ2dDSUNFREN5QUFJQVVnQjBJQUlBZ1Eyd01OQUNBTUx3RUdJQVJHRFFKQkFDRUVBMEFnQkNBT1JnMFJJQUFnQmlBRUVMQUJJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFVZ0JDQUJFS1VCSVFNZ0JFRUJhaUVFSUFOQkFFNE5BQXNMSUFBZ0JSQVBEQTRMUW9DQWdJRGdBQ0VGSUFBZ0FTQUVFR1VpQ2tLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBPUW9DQWdJQXdJUVVnQUNBR1FkRUJJQVpCQUJBVUlndENnSUNBZ0hDRElnZENnSUNBZ0NCUklBZENnSUNBZ0RCUmNnMEJRb0NBZ0lEZ0FDRUJJQWRDZ0lDQWdPQUFVUTBJUVFBaEF5QUFFRDRpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBGSUFBZ0JpQUxFUG9ESWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0FNQXdFQ3lBQUlBVkI2Z0FnQlVFQUVCUWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMENRUUFoQkFOQUlBQWdCU0FHSUFKQkNHb1FyZ0VpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBESUFJb0FnZ0VRQ0FFSVFNZ0J5RUJEQVlMSUFBZ0J5QUVyU0FJUVlDQUFSRFNBVUVBU0FSQUlBWWhDQ0FGSVFZZ0J5RUZEQVlGSUFSQkFXb2hCQXdCQ3dBTEFBc2dBeWdDQ0NBTktBSUlJQThvQWhCcUlBTW9BZ0FRSHhvTURRc2dBQ0FDUVFocUlBWVFQQTBHSUF3Z0RDZ0NBRUVCYWpZQ0FDQUdJUUVnQWlrRENBd0VDeUFHQ3lFSUlBVWhCaUFISVFVTElBQWdDQkFQSUFBZ0JoQVBJQUFnQlJBUEN5QUFJQXNRRHlBQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0E2MExJZ1VnQ1lZUStRSWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQ2lBR1FnQWdCUkRiQXcwQVFRQWhCQU5BSUFvZ0JLMGdCVmtOQXhvZ0FDQUJJQVFRc0FFaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBQWdDaUFFSUFZUXBRRWhBeUFFUVFGcUlRUWdBMEVBVGcwQUN3c2dBU0VGQ3lBQUlBVVFEeUFLSVFGQ2dJQ0FnT0FBQ3lFRklBQWdBUkFQREFRTElBTXBBd0FpQmtJZ2lLZEJkVWtOQVNBR3B5SURJQU1vQWdCQkFXbzJBZ0FNQVFzZ0FCQnJEQUlMSUFBZ0FTQUVFR1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFBZ0JoQVBEQUlMSUFBZ0FTQUdJQWdnQnhEYkEwVUVRQ0FCSVFVTUFnc2dBQ0FCRUE4TFFvQ0FnSURnQUNFRkN5QUNRUkJxSkFBZ0JRc1BBQ0FBSUFFZ0FrRUFRUU1RbGdJTDlBRUNBMzRCZndKQUlBTXBBd0FpQkVLQWdJQ0FjRm9FUUNBREtRTUlJZ1ZDLy8vLy8yOVdEUUVMSUFBUUpFS0FnSUNBNEFBUEMwS0FnSUNBNEFBaEJpQUFRb0NBZ0lBZ1FUQVFTU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlNCSDRnQUVFWUVDa2lBa1VFUUNBQUlBRVFEMEtBZ0lDQTRBQVBDeUFFcHlJRElBTW9BZ0JCQVdvMkFnQWdBaUFFTndNQUlBV25JZ2NnQnlnQ0FFRUJhallDQUNBQ0lBVTNBd2dnQUNBRUVEZ2hBQ0FDUVFBNkFCRWdBaUFBT2dBUUlBRkNnSUNBZ0hCYUJFQWdBYWNpQUNBQ05nSWdJQUFnQUMwQUJVSHZBWEVnQXkwQUJVRVFjWEk2QUFVTElBRUZRb0NBZ0lEZ0FBc0xYZ0VCZndKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQkM4QkJpQURSdzBBSUFRb0FpQWlCRVVOQUNBRUtRTUFJZ0ZDZ0lDQWdHQmFCRUFnQUNBQnB5QUNFUUFBQ3lBRUtRTUlJZ0ZDZ0lDQWdHQlVEUUFnQUNBQnB5QUNFUUFBQ3d0S0FRRi9Ba0FnQVVLQWdJQ0FjRlFOQUNBQnB5SURMd0VHSUFKSERRQWdBeWdDSUNJRFJRMEFJQUFnQXlrREFCQWpJQUFnQXlrRENCQWpJQUJCRUdvZ0F5QUFLQUlFRVFBQUN3czRBUUYvSUFCQk1Hc2lCRUVLVHdSL0lBQkJ3UUJySUFOTkJFQWdBRUUzYXc4TElBSWdBRUhYQUdzZ0FFSGhBR3NnQVU4YkJTQUVDd3RMQVFGL0lBQkJHQkFwSWdKRkJFQkNnSUNBZ09BQUR3c2dBa0VCTmdJQUlBQW9BdGdCSVFBZ0FrSUFOd0lRSUFKQ2dJQ0FnSUNBZ0lDQWZ6Y0NDQ0FDSUFBMkFnUWdBcTBnQVlRTGtRSUFJQUJGQkVCQkFBOExBbjhDUUNBQlFmOEFUUTBBQWtCQmlOVUVLQUlBS0FJQVJRUkFJQUZCZ0g5eFFZQy9BMFlOQWd3QkN5QUJRZjhQVFFSQUlBQWdBVUUvY1VHQUFYSTZBQUVnQUNBQlFRWjJRY0FCY2pvQUFFRUNEQU1MSUFGQmdFQnhRWURBQTBjZ0FVR0FzQU5QY1VVRVFDQUFJQUZCUDNGQmdBRnlPZ0FDSUFBZ0FVRU1ka0hnQVhJNkFBQWdBQ0FCUVFaMlFUOXhRWUFCY2pvQUFVRUREQU1MSUFGQmdJQUVhMEgvL3o5TkJFQWdBQ0FCUVQ5eFFZQUJjam9BQXlBQUlBRkJFblpCOEFGeU9nQUFJQUFnQVVFR2RrRS9jVUdBQVhJNkFBSWdBQ0FCUVF4MlFUOXhRWUFCY2pvQUFVRUVEQU1MQzBHZzFBUkJHVFlDQUVGL0RBRUxJQUFnQVRvQUFFRUJDd3ZFQWdBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQlFRbHJEaElBQ2dzTUNnc0NBd1FGREFzTURBb0xCd2dKQ3lBQ0lBSW9BZ0FpQVVFRWFqWUNBQ0FBSUFFb0FnQTJBZ0FQQ3dBTElBSWdBaWdDQUNJQlFRUnFOZ0lBSUFBZ0FUSUJBRGNEQUE4TElBSWdBaWdDQUNJQlFRUnFOZ0lBSUFBZ0FUTUJBRGNEQUE4TElBSWdBaWdDQUNJQlFRUnFOZ0lBSUFBZ0FUQUFBRGNEQUE4TElBSWdBaWdDQUNJQlFRUnFOZ0lBSUFBZ0FURUFBRGNEQUE4TEFBc2dBaUFDS0FJQVFRZHFRWGh4SWdGQkNHbzJBZ0FnQUNBQkt3TUFPUU1BRHdzZ0FDQUNJQU1SQUFBTER3c2dBaUFDS0FJQUlnRkJCR28yQWdBZ0FDQUJOQUlBTndNQUR3c2dBaUFDS0FJQUlnRkJCR28yQWdBZ0FDQUJOUUlBTndNQUR3c2dBaUFDS0FJQVFRZHFRWGh4SWdGQkNHbzJBZ0FnQUNBQktRTUFOd01BQzE0QkJIOGdBQ2dDQUNFQ0EwQWdBaXdBQUNJREVORUNCRUJCZnlFRUlBQWdBa0VCYWlJQ05nSUFJQUZCekptejVnQk5CSDlCZnlBRFFUQnJJZ01nQVVFS2JDSUVhaUFESUFSQi8vLy8vd2R6U2hzRlFYOExJUUVNQVFzTElBRUwzQklDRW44QmZpTUFRZEFBYXlJSUpBQWdDQ0FCTmdKTUlBaEJOMm9oRnlBSVFUaHFJUklDUUFKQUFrQUNRQU5BSUFFaERDQUhJQTVCLy8vLy93ZHpTZzBCSUFjZ0Rtb2hEZ0pBQWtBQ1FDQU1JZ2N0QUFBaUNRUkFBMEFDUUFKQUlBbEIvd0Z4SWdGRkJFQWdCeUVCREFFTElBRkJKVWNOQVNBSElRa0RRQ0FKTFFBQlFTVkhCRUFnQ1NFQkRBSUxJQWRCQVdvaEJ5QUpMUUFDSVFvZ0NVRUNhaUlCSVFrZ0NrRWxSZzBBQ3dzZ0J5QU1heUlISUE1Qi8vLy8vd2R6SWhoS0RRY2dBQVJBSUFBZ0RDQUhFRnNMSUFjTkJpQUlJQUUyQWt3Z0FVRUJhaUVIUVg4aER3SkFJQUVzQUFFaUNoRFJBa1VOQUNBQkxRQUNRU1JIRFFBZ0FVRURhaUVISUFwQk1Hc2hEMEVCSVJNTElBZ2dCellDVEVFQUlRMENRQ0FITEFBQUlnbEJJR3NpQVVFZlN3UkFJQWNoQ2d3QkN5QUhJUXBCQVNBQmRDSUJRWW5SQkhGRkRRQURRQ0FJSUFkQkFXb2lDallDVENBQklBMXlJUTBnQnl3QUFTSUpRU0JySWdGQklFOE5BU0FLSVFkQkFTQUJkQ0lCUVluUkJIRU5BQXNMQWtBZ0NVRXFSZ1JBQW44Q1FDQUtMQUFCSWdFUTBRSkZEUUFnQ2kwQUFrRWtSdzBBSUFGQkFuUWdCR3BCd0FGclFRbzJBZ0FnQ2tFRGFpRUpRUUVoRXlBS0xBQUJRUU4wSUFOcVFZQURheWdDQUF3QkN5QVREUVlnQ2tFQmFpRUpJQUJGQkVBZ0NDQUpOZ0pNUVFBaEUwRUFJUkFNQXdzZ0FpQUNLQUlBSWdGQkJHbzJBZ0JCQUNFVElBRW9BZ0FMSVJBZ0NDQUpOZ0pNSUJCQkFFNE5BVUVBSUJCcklSQWdEVUdBd0FCeUlRME1BUXNnQ0VITUFHb1Fnd1lpRUVFQVNBMElJQWdvQWt3aENRdEJBQ0VIUVg4aEN3Si9JQWt0QUFCQkxrY0VRQ0FKSVFGQkFBd0JDeUFKTFFBQlFTcEdCRUFDZndKQUlBa3NBQUlpQVJEUkFrVU5BQ0FKTFFBRFFTUkhEUUFnQVVFQ2RDQUVha0hBQVd0QkNqWUNBQ0FKUVFScUlRRWdDU3dBQWtFRGRDQURha0dBQTJzb0FnQU1BUXNnRXcwR0lBbEJBbW9oQVVFQUlBQkZEUUFhSUFJZ0FpZ0NBQ0lLUVFScU5nSUFJQW9vQWdBTElRc2dDQ0FCTmdKTUlBdEJmM05CSDNZTUFRc2dDQ0FKUVFGcU5nSk1JQWhCekFCcUVJTUdJUXNnQ0NnQ1RDRUJRUUVMSVJRRFFDQUhJUlZCSENFS0lBRWlFU3dBQUNJSFFmc0FhMEZHU1EwSklCRkJBV29oQVNBSElCVkJPbXhxUVovQkJHb3RBQUFpQjBFQmEwRUlTUTBBQ3lBSUlBRTJBa3dDUUFKQUlBZEJHMGNFUUNBSFJRMExJQTlCQUU0RVFDQUVJQTlCQW5ScUlBYzJBZ0FnQ0NBRElBOUJBM1JxS1FNQU53TkFEQUlMSUFCRkRRZ2dDRUZBYXlBSElBSWdCaENDQmd3Q0N5QVBRUUJPRFFvTFFRQWhCeUFBUlEwSEN5QU5RZi8vZTNFaUNTQU5JQTFCZ01BQWNSc2hEVUVBSVE5QnJDRWhGaUFTSVFvQ1FBSkFBa0FDZndKQUFrQUNRQUpBQW44Q1FBSkFBa0FDUUFKQUFrQUNRQ0FSTEFBQUlnZEJYM0VnQnlBSFFROXhRUU5HR3lBSElCVWJJZ2RCMkFCckRpRUVGQlFVRkJRVUZCUU9GQThHRGc0T0ZBWVVGQlFVQWdVREZCUUpGQUVVRkFRQUN3SkFJQWRCd1FCckRnY09GQXNVRGc0T0FBc2dCMEhUQUVZTkNRd1RDeUFJS1FOQUlSbEJyQ0VNQlF0QkFDRUhBa0FDUUFKQUFrQUNRQUpBQWtBZ0ZVSC9BWEVPQ0FBQkFnTUVHZ1VHR2dzZ0NDZ0NRQ0FPTmdJQURCa0xJQWdvQWtBZ0RqWUNBQXdZQ3lBSUtBSkFJQTZzTndNQURCY0xJQWdvQWtBZ0Rqc0JBQXdXQ3lBSUtBSkFJQTQ2QUFBTUZRc2dDQ2dDUUNBT05nSUFEQlFMSUFnb0FrQWdEcXczQXdBTUV3dEJDQ0FMSUF0QkNFMGJJUXNnRFVFSWNpRU5RZmdBSVFjTElCSWhEQ0FIUVNCeElSRWdDQ2tEUUNJWlVFVUVRQU5BSUF4QkFXc2lEQ0FacDBFUGNVR3d4UVJxTFFBQUlCRnlPZ0FBSUJsQ0QxWWhDU0FaUWdTSUlSa2dDUTBBQ3dzZ0RVRUljVVVnQ0NrRFFGQnlEUU1nQjBFRWRrR3NJV29oRmtFQ0lROE1Bd3NnRWlFSElBZ3BBMEFpR1ZCRkJFQURRQ0FIUVFGcklnY2dHYWRCQjNGQk1ISTZBQUFnR1VJSFZpRU1JQmxDQTRnaEdTQU1EUUFMQ3lBSElRd2dEVUVJY1VVTkFpQUxJQklnREdzaUIwRUJhaUFISUF0SUd5RUxEQUlMSUFncEEwQWlHVUlBVXdSQUlBaENBQ0FaZlNJWk53TkFRUUVoRDBHc0lRd0JDeUFOUVlBUWNRUkFRUUVoRDBHdElRd0JDMEd1SVVHc0lTQU5RUUZ4SWc4YkN5RVdJQmtnRWhDVkFpRU1DeUFVUVFBZ0MwRUFTQnNORGlBTlFmLy9lM0VnRFNBVUd5RU5JQWdwQTBBaUdVSUFVaUFMY2tVRVFDQVNJUXhCQUNFTERBd0xJQXNnR1ZBZ0VpQU1hMm9pQnlBSElBdElHeUVMREFzTElBZ29Ba0FpQjBHZ2tnRWdCeHNpREVFQVFmLy8vLzhISUFzZ0MwSC8vLy8vQjA4Yklnb1Erd0VpQnlBTWF5QUtJQWNiSWdjZ0RHb2hDaUFMUVFCT0JFQWdDU0VOSUFjaEN3d0xDeUFKSVEwZ0J5RUxJQW90QUFBTkRRd0tDeUFMQkVBZ0NDZ0NRQXdDQzBFQUlRY2dBRUVnSUJCQkFDQU5FR01NQWdzZ0NFRUFOZ0lNSUFnZ0NDa0RRRDRDQ0NBSUlBaEJDR29pQnpZQ1FFRi9JUXNnQndzaENVRUFJUWNDUUFOQUlBa29BZ0FpREVVTkFTQUlRUVJxSUF3UWdRWWlDa0VBU0NJTUlBb2dDeUFIYTB0eVJRUkFJQWxCQkdvaENTQUxJQWNnQ21vaUIwc05BUXdDQ3dzZ0RBME5DMEU5SVFvZ0IwRUFTQTBMSUFCQklDQVFJQWNnRFJCaklBZEZCRUJCQUNFSERBRUxRUUFoQ2lBSUtBSkFJUWtEUUNBSktBSUFJZ3hGRFFFZ0NFRUVhaUFNRUlFR0lnd2dDbW9pQ2lBSFN3MEJJQUFnQ0VFRWFpQU1FRnNnQ1VFRWFpRUpJQWNnQ2tzTkFBc0xJQUJCSUNBUUlBY2dEVUdBd0FCekVHTWdFQ0FISUFjZ0VFZ2JJUWNNQ0FzZ0ZFRUFJQXRCQUVnYkRRaEJQU0VLSUFBZ0NDc0RRQ0FRSUFzZ0RTQUhJQVVSU1FBaUIwRUFUZzBIREFrTElBZ2dDQ2tEUUR3QU4wRUJJUXNnRnlFTUlBa2hEUXdFQ3lBSExRQUJJUWtnQjBFQmFpRUhEQUFMQUFzZ0FBMEhJQk5GRFFKQkFTRUhBMEFnQkNBSFFRSjBhaWdDQUNJQUJFQWdBeUFIUVFOMGFpQUFJQUlnQmhDQ0JrRUJJUTRnQjBFQmFpSUhRUXBIRFFFTUNRc0xRUUVoRGlBSFFRcFBEUWNEUUNBRUlBZEJBblJxS0FJQURRRWdCMEVCYWlJSFFRcEhEUUFMREFjTFFSd2hDZ3dFQ3lBTElBb2dER3NpRVNBTElCRktHeUlKSUE5Qi8vLy8vd2R6U2cwQ1FUMGhDaUFRSUFrZ0Qyb2lDeUFMSUJCSUd5SUhJQmhLRFFNZ0FFRWdJQWNnQ3lBTkVHTWdBQ0FXSUE4UVd5QUFRVEFnQnlBTElBMUJnSUFFY3hCaklBQkJNQ0FKSUJGQkFCQmpJQUFnRENBUkVGc2dBRUVnSUFjZ0N5QU5RWURBQUhNUVl3d0JDd3RCQUNFT0RBTUxRVDBoQ2d0Qm9OUUVJQW8yQWdBTFFYOGhEZ3NnQ0VIUUFHb2tBQ0FPQzM4Q0FYOEJmaUFBdlNJRFFqU0lwMEgvRDNFaUFrSC9EMGNFZkNBQ1JRUkFJQUVnQUVRQUFBQUFBQUFBQUdFRWYwRUFCU0FBUkFBQUFBQUFBUEJEb2lBQkVJVUdJUUFnQVNnQ0FFRkFhZ3MyQWdBZ0FBOExJQUVnQWtIK0IyczJBZ0FnQTBMLy8vLy8vLy8vaDRCL2cwS0FnSUNBZ0lDQThEK0V2d1VnQUFzTHFBTURBbndEZndGK0lBQzlJZ2hDSUlpbklnVkIrUC8vL3dkeFFhaW9sdjhEU1NJR1JRUkFSQmd0UkZUN0llay9JQUFnQUpvZ0NFSUFXU0lIRzZGRUIxd1VNeWFtZ1R3Z0FTQUJtaUFIRzZHZ0lRQWdCVUVmZGlFRlJBQUFBQUFBQUFBQUlRRUxJQUFnQUNBQUlBQ2lJZ1NpSWdORVkxVlZWVlZWMVQraUlBUWdBeUFFSUFTaUlnTWdBeUFESUFNZ0EwUnpVMkRieTNYenZxSkVwcEkzb0loK0ZEK2dva1FCWmZMeTJFUkRQNkNpUkNnRFZza2liVzAvb0tKRU45WUdoUFJrbGorZ29rUjYvaEFSRVJIQlA2QWdCQ0FESUFNZ0F5QURJQU5FMUhxL2RIQXErejZpUk9tbjhESVB1Qkkvb0tKRWFCQ05HdmNtTUQrZ29rUVZnK0QreU50WFA2Q2lSSk9FYnVuakpvSS9vS0pFL2tHekc3cWhxeitnb3FDaUlBR2dvaUFCb0tBaUE2QWhBU0FHUlFSQVFRRWdBa0VCZEd1M0lnUWdBQ0FESUFFZ0FhSWdBU0FFb0tPaG9DSUFJQUNnb1NJQW1pQUFJQVViRHdzZ0FnUjhSQUFBQUFBQUFQQy9JQUdqSWdRZ0JMMUNnSUNBZ0hDRHZ5SUVJQU1nQWIxQ2dJQ0FnSENEdnlJQklBQ2hvYUlnQkNBQm9rUUFBQUFBQUFEd1A2Q2dvaUFFb0FVZ0FRc0w5d01DQkg4QmZnSkFBa0FDUUFKQUFrQUNRQUpBQW44Z0FDZ0NCQ0lCSUFBb0FtaEhCRUFnQUNBQlFRRnFOZ0lFSUFFdEFBQU1BUXNnQUJCVkN5SUNRU3RyRGdNQUFRQUJDd0ovSUFBb0FnUWlBU0FBS0FKb1J3UkFJQUFnQVVFQmFqWUNCQ0FCTFFBQURBRUxJQUFRVlFzaUFVRTZhMEYxU3dSQUlBSkJMVVloQkNBQklRSU1BZ3NnQUNrRGNFSUFXUTBDREFVTElBSkJPbXRCZGtrTkFnc2dBa0V3YXlJRFFRcEpCRUJCQUNFQkEwQWdBaUFCUVFwc2FpRUJJQUZCTUdzaUFVSE1tYlBtQUVnQ2Z5QUFLQUlFSWdJZ0FDZ0NhRWNFUUNBQUlBSkJBV28yQWdRZ0FpMEFBQXdCQ3lBQUVGVUxJZ0pCTUdzaUEwRUpUWEVOQUFzZ0Fhd2hCUXNDUUNBRFFRcFBEUUFEUUNBQ3JTQUZRZ3ArZkVJd2ZTRUZBbjhnQUNnQ0JDSUJJQUFvQW1oSEJFQWdBQ0FCUVFGcU5nSUVJQUV0QUFBTUFRc2dBQkJWQ3lJQ1FUQnJJZ05CQ1VzTkFTQUZRcTZQaGRmSHd1dWpBVk1OQUFzTElBTkJDa2tFUUFOQUFuOGdBQ2dDQkNJQklBQW9BbWhIQkVBZ0FDQUJRUUZxTmdJRUlBRXRBQUFNQVFzZ0FCQlZDMEV3YTBFS1NRMEFDd3NnQUNrRGNFSUFXUVJBSUFBZ0FDZ0NCRUVCYXpZQ0JBdENBQ0FGZlNBRklBUWJEd3NnQUNBQUtBSUVRUUZyTmdJRURBRUxJQUFwQTNCQ0FGTU5BUXNnQUNBQUtBSUVRUUZyTmdJRUMwS0FnSUNBZ0lDQWdJQi9DNzhDQVFGL0l3QkIwQUJySWdRa0FBSkFJQU5CZ0lBQlRnUkFJQVJCSUdvZ0FTQUNRZ0JDZ0lDQWdJQ0FnUC8vQUJBdUlBUXBBeWdoQWlBRUtRTWdJUUVnQTBILy93RkpCRUFnQTBILy93QnJJUU1NQWdzZ0JFRVFhaUFCSUFKQ0FFS0FnSUNBZ0lDQS8vOEFFQzVCL2Y4Q0lBTWdBMEg5L3dKT0cwSCsvd0ZySVFNZ0JDa0RHQ0VDSUFRcEF4QWhBUXdCQ3lBRFFZR0FmMG9OQUNBRVFVQnJJQUVnQWtJQVFvQ0FnSUNBZ0lBNUVDNGdCQ2tEU0NFQ0lBUXBBMEFoQVNBRFFmU0Fma3NFUUNBRFFZMy9BR29oQXd3QkN5QUVRVEJxSUFFZ0FrSUFRb0NBZ0lDQWdJQTVFQzVCNklGOUlBTWdBMEhvZ1gxTUcwR2EvZ0ZxSVFNZ0JDa0RPQ0VDSUFRcEF6QWhBUXNnQkNBQklBSkNBQ0FEUWYvL0FHcXRRakNHRUM0Z0FDQUVLUU1JTndNSUlBQWdCQ2tEQURjREFDQUVRZEFBYWlRQUN6VUFJQUFnQVRjREFDQUFJQUpDLy8vLy8vLy9QNE1nQkVJd2lLZEJnSUFDY1NBQ1FqQ0lwMEgvL3dGeGNxMUNNSWFFTndNSUMwVUJBbndnQUNBQ0lBS2lJZ1E1QXdBZ0FTQUNJQUpFQUFBQUFnQUFvRUdpSWdNZ0FpQURvYUFpQXFFaUF5QURvaUFDSUFLZ0lBT2lJQUlnQXFJZ0JLR2dvRGtEQUF2YUFRRUVmeUFBS0FKVUlRTUNRQ0FBS0FJVUlnWWdBQ2dDSENJRlJ3UkFJQUFnQlRZQ0ZDQUFJQVVnQmlBRmF5SUZFSXNHSUFWSkRRRUxBa0FnQXlnQ0VFSGhBRWNFUUNBREtBSUFJUVFNQVFzZ0F5QURLQUlFSWdRMkFnQUxJQU1vQWd3Z0JHb2dBU0FES0FJSUlBUnJJZ0VnQWlBQklBSkpHeUlFRUI4YUlBTWdBeWdDQUNBRWFpSUJOZ0lBSUFFZ0F5Z0NCRTBOQUNBRElBRTJBZ1FDZnlBREtBSUlJZ0lnQVVzRVFDQURLQUlNSUFGcURBRUxJQUF0QUFCQkJIRkZJQUpGY2cwQklBSWdBeWdDREdwQkFXc0xRUUE2QUFBTElBUUxHQUVCZnlNQVFSQnJJZ0VnQURrRENDQUJLd01JSUFDaUN5Z0FJQUZFQUFBQUFBQUF3SCtpSUFCRWk5MGFGV1lnbHNDZ0VPc0Rva1FBQUFBQUFBREFmNklMRUFBZ0FFRWdSaUFBUVFsclFRVkpjZ3NXQUNBQVJRUkFRUUFQQzBHZzFBUWdBRFlDQUVGL0N5TUFBa0FDUUFKQUlBSU9BZ0FCQWdzZ0FDQUJjZzhMSUFBZ0FYTVBDeUFBSUFGeEM0NEVBUXAvSXdCQklHc2lDU1FBSUFBZ0FVY0VRQUpBQWtBQ1FDQUJLQUlNUlFSQUFrQUNRQ0FCS0FJSVFmNy8vLzhIYXc0Q0FBTUJDeUFCS0FJRURRSUxJQUFnQVJCRUdnd0RDeUFCS0FJRURRQWdBU2dDQUNFRklBQWdBa0VCZEVIREFHb2lERUVHZGlJSUVFRU5BQ0FGS0FJQVFRQWdDRUVEZENJRUlBVW9BZ1FSQVFBaUJrVU5BQ0FFSUFaQkFDQUlRUUYwSWdjZ0J5QUJLQUlNSWdRZ0JDQUhTaHNpQzJ0QkFuUVFLeUlHYWlBTFFRSjBJZ1JySUFFb0FoQWdBU2dDREVFQ2RHb2dCR3NnQkJBZkdpQUJMUUFJUVFGeEJFQWdCaUFHSUFkQkFCQ1NCaUVLQ3lBQUtBSVFJUTBnQ1NFRUFrQWdERUdBQ0U4RVFDQUZLQUlBUVFBZ0IwSDgvLzgvY1VFRWFpQUZLQUlFRVFFQUlnUkZEUUVMSUFVZ0RTQUdJQWdnQkNBR0lBaEJBblJxRUpNR0lRY2dCQ0FKUndSQUlBVW9BZ0FnQkVFQUlBVW9BZ1FSQVFBYUN5QUhSUTBDQ3lBRktBSUFJQVpCQUNBRktBSUVFUUVBR2dzZ0FCQTFEQUVMQWtBQ1FDQUtSUVJBSUFZZ0NFRUJhaENvQXlFRUlBVW9BZ0FnQmtFQUlBVW9BZ1FSQVFBYUlBUU5BU0FCS0FJUUlBRW9BZ3dnQzJzUXFBTU5BUXdDQ3lBRktBSUFJQVpCQUNBRktBSUVFUUVBR2dzZ0FDZ0NFQ0lFSUFRb0FnQkJBWEkyQWdBTElBQkJBRFlDQkNBQUlBRW9BZ2hCQVdwQkFYVTJBZ2dnQUNBQ0lBTVF6Z0VhQ3lBSlFTQnFKQUFQQzBIWS9RQkIxUHdBUWRNUVFZNG5FQUFBQ3p3QkFYOERRQ0FDUVFCTVJRUkFJQUFnQWtFQmF5SUNRUUowSWdScUlBTkJIM1FnQVNBRWFpZ0NBQ0lEUVFGMmNqWUNBQXdCQ3dzZ0EwRUJjUXVlQkFJTWZ3SitJd0JCRUdzaUNDUUFBa0FDUUNBRFFRRkdCRUFnQWlnQ0FDRUFJQWhCREdvZ0FpZ0NCQkNVQmlFRElBQkIvLzhEY2EwZ0FFRVFkcTBnQ0RVQ0RFSVFob1FpRWlBU0lBTkJBWFN0SWhPQUloSWdFMzU5UWhDR2hDRVRJQU5CRUhRaEFDQVNweUlEUVlDQUJFOEVmaUFUUW9DQWdJQVFmUVVnRXlBU0lCSitRdjMvLy84UGczMExJUklnQUNBRGFpRUdJQkpDQUZNRVFDQVNJQVpCQVdzaUJxMUNBWVo4UWdGOElSSUxJQUVnQmpZQ0FDQUNJQkkrQWdBZ0VrSWdpS2NoQmd3QkMwRi9JUTBnQUNBQklBTkJBWFlpQjBFQ2RHb2lDU0FDSUFOQmZuRWlEMEVDZEdvaURDQURJQWRySWdvZ0JDQUlRUWhxRUpNR0RRRWdDQ2dDQ0NJTEJFQWdEQ0FNSUFrZ0NoQ1lBaG9MSUFBZ0JDQUNJQWRCQW5RaUJtb2lEaUFESUFrZ0NoQ2xCQTBCSUFRZ0Jtb29BZ0FoRUVFQUlRWURRQ0FHSUFkR1JRUkFJQUVnQmtFQ2RDSVJhaUFFSUJGcUtBSUFOZ0lBSUFaQkFXb2hCZ3dCQ3dzZ0N5QVFhaUlMUVFGMklRWWdBU0FCSUFjZ0MwRUJjUkNTQmdSL0lBNGdEaUFKSUFvUXFnUUZRUUFMSVFRZ0NTQUdJQW9RcVFNYUlBUWdEQ0FMUVFGTkJIOGdBQ0FDSUFOQkFuUnFJZ0FnQVNBSElBRWdCeERYQWcwQ0lBSWdBaUFBSUE4UW1BSUZJQVlMSUFOQkFYRVEyQUpySWdaQkFFNE5BQ0FCUVFFZ0F4RFlBaG9nQWlBQklBTkJBaENjQmlBR2FpQUNRUUVnQXhDcEEyb2hCZ3NnQlNBR05nSUFRUUFoRFFzZ0NFRVFhaVFBSUEwTG1BRUJBbjhnQUNBQlFmOEJjU0FCUVFoMlFmOEJjU0FCUVJkMlFmNERjVUhncEFScUx3RUFJZ0JCQVhRaUFrRi9jMEVBSUFGQkVIWWdBQ0FBYkdzaUFTQUNTeUlDR3lBQmFrRUlkSElpQVNBQUlBSnFJZ0pCQVhRaUEyNGlBQ0FBYkdzZ0FTQUFJQU5zYTBFSWRHb2lBVUVmZFNBQ1FRaDBJQUJxSWdCQkFXc2lBa0VCZEVFQmNuRWdBV28yQWdBZ0FpQUFJQUZCQUVnYkN6a0JBWDhqQUVFUWF5SUJKQUFnQUFSL0lBRkJER29nQUNBQVp5SUFRUjV4ZEJDVUJpQUFRUUYyZGdWQkFBc2hBQ0FCUVJCcUpBQWdBQXZlQ0FFUWZ5QUNJQUVnQVNBQ0VOTUJJZ2xCQUVnaUJ4c2hDQUpBSUFrZ0FpZ0NCQ0FGY3lJRklBRW9BZ1FpQm5NaURrVnlEUUFnQ0NnQ0NFSDkvLy8vQjBvTkFDQUFJQVJCQjNGQkFrWVFpUUZCQUE4TElBVWdCaUFIR3lFRklBRWdBaUFIR3lFSkFrQUNRQUpBSUFnb0Fnd2lCZ1JBSUFrb0Fnd2lDdzBCQ3lBSUtBSUlJZ0ZCL3YvLy93ZE9CRUFnQVVILy8vLy9CMFlFUUNBQUVEVkJBQThMSUE1RklBa29BZ2hCL3YvLy93ZEhja1VFUUNBQUVEVkJBUThMSUFBZ0JSQ01BVUVBRHdzZ0FDQUlFRVFhSUFBZ0JUWUNCQXdCQ3lBQUlBVTJBZ1FnQUNBSUtBSUlOZ0lJSUFnb0FnZ2lBU0FKS0FJSUlnZHJJUW9DUUNBT1JRUkFRUUFoQlF3QkMwRUJJUVVnQ2tFQlNnMEFJQVpCQlhSQkFXc2hBaUFMSUFaclFRVjBJQUZxSUFkclFSOXJJUThnQ1NnQ0VDRVFRUUFoQlFOQVFRQWhBU0FDUVFWMUlnY2dCa2tFUUNBSUtBSVFJQWRCQW5ScUtBSUFJUUVMSUJBZ0N5QUNJQTlxRUdnaUJ5QUJSZ1JBSUFKQklHc2hBaUFGUVNCcUlRVU1BUXNMSUFFZ0IzTWlEV2NpRVVFQmFpRU1Ba0FnRFVFQ1NRUkFJQVVnREdvaEJRd0JDeUFGSUFGQmYwRWZJQkZySWcxMFFYOXpJZ1Z4WnlJQklBVWdCMEYvYzNGbklnVWdBU0FGU0JzaUFXb2hCU0FCSUF4cklBMUhEUUVMQTBBZ0JTRUhRUUFoQVNBQ1FTQnJJZ0pCQlhVaUJTQUdTUVJBSUFnb0FoQWdCVUVDZEdvb0FnQWhBUXNnRUNBTElBSWdEMm9RYUNFTUlBRkZCRUFnQjBFZ2FpRUZJQXhCZjBZTkFRc0xJQUZuSWdFZ0RFRi9jMmNpQWlBQklBSklHeUFIYWlFRkN5QUFJQU1nQldwQklXcEJCWFlpQWlBR0lBcEJIMnBCSUcwZ0Myb2lBU0FCSUFaSUd5SUJJQUVnQWtvYklnY1FRUTBCUVFBZ0NDZ0NEQ0lUSUFkcklnOXJJZ0pCSDNVZ0FuRWhGQ0FISUFGcklRSkJBQ0FPYXlFUUlBa29BZ3dpREVFRmRDRU5RUUFnRENBSGEwRUZkQ0FLYWlJUmEwRUZkU0VTSUE0aEFVRUFJUXNEUUNBQ1FRQk9CRUFDUUVFQUlRSURRQ0FDSUFkR0RRRkJBQ0VGSUFBb0FoQWdBa0VDZEdvZ0FTQUNJQTlxSWdZZ0NDZ0NERWtFZnlBSUtBSVFJQVpCQW5ScUtBSUFCVUVBQ3lBSktBSVFJQWtvQWd3Z0FrRUZkQ0FSYWhCb0lCQnpJZ1ZxSWdGcUlnWTJBZ0FnQVNBRlNTQUJJQVpMY2lFQklBSkJBV29oQWd3QUN3QUxCU0FDUVFWMElCRnFJUVlDUUFKL0FrQWdBaUFQYWlJS1FRQk9JQW9nRTBseFJRUkFJQVpCWVVnaUZVVUVRRUVBSVFVZ0JpQU5TQTBDQ3lBS1FSOTFJQlJ4SWdJZ0VpQUNJQkpJR3lBQ0lCVWJJUUpCQUNFRlFRQWhDZ3dEQ3lBSUtBSVFJQXBCQW5ScUtBSUFJUVZCQUNBR1FXRklJQVlnRFU1eURRRWFDeUFKS0FJUUlBd2dCaEJvQ3lFS0lBSkJBV29oQWdzZ0NpQVFjeUlHSUFWcUlnVWdCa2tnQlNBQklBVnFJZ1ZMY2lFQklBVWdDM0loQ3d3QkN3c2dBQ2dDRUNJQ0lBSW9BZ0FnQzBFQVIzSTJBZ0FnRGlBQlJYSU5BQ0FBSUFkQkFXb1FRUTBCSUFBb0FoQWdCMEVDZEdwQkFUWUNBQ0FBSUFBb0FnaEJJR28yQWdnTElBQWdBeUFFRUxNQ0R3c2dBQkExUVNBTDJnRUJBbjRDUUFKQUlBSkZCRUFnQVVLQWdJQ0FjSU1oQlNBQVFTOFFMU0VFREFFTEFuNGdBVUtBZ0lDQWNJTWlCVUtBZ0lDQU1GSWdBeWtEQUNJRVFvQ0FnSUJ3ZzBLQWdJQ0FnSDlTY2tVRVFDQUFRYnVVQVNBQUlBQW9BaEFnQktjUXdRSVFMVUd0bEFFUXZnRU1BUXNnQUNBRUVDZ0xJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BUXNnQlVLQWdJQ0FNRkVOQUNBQUlBRkJCUkJsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRklFUUNBQUlBRWdCQkRiQVNBQUlBRkJNQ0FFcHlrQ0JFTC8vLy8vQjROQkFCQVpHZ3NnQVNFRUN5QUVDMVVCQVg0Z0FDQURyU0FFclNBQklBSkJIM1VpQUd1dGZpQUFJQU54SUFKcXJYeENJSWluSUFGcUlnQ3RRbitGZmlBQ3JTQUJyVUlnaG9SOElnVkNJSWluSWdFZ0EzRWdCYWRxTmdJQUlBQWdBV3BCQVdvTHRnVUJDMzhDUUFKQUFrQUNRQUpBQWtBZ0EwRUNUUVJBSUFBb0FnQkJBQ0FEUVFGMElnZEJBWElpQ0VFQ2RDQUFLQUlFRVFFQUlRWWdBQ2dDQUVFQUlBTkJBblJCQ0dvZ0FDZ0NCQkVCQUNJRlJTQUdSWElOQWdOQUlBUWdCMFpGQkVBZ0JpQUVRUUowYWtFQU5nSUFJQVJCQVdvaEJBd0JDd3NnQmlBSFFRSjBha0VCTmdJQUlBQWdCU0FHSUFnZ0FpQURFS1VFRFFJZ0EwRUJhaUVDUVFBaEJBTkFJQUlnQkVaRkJFQWdBU0FFUVFKMElnZHFJQVVnQjJvb0FnQTJBZ0FnQkVFQmFpRUVEQUVMQ3lBR0lBTVFxQU1OQVNBQlFRRWdBaERZQWhvTUFRc2dBQ2dDQUVFQUlBTWdBMEVCYTBFQmRpSUhheUlJSUFOcUlnUkJBV29pREVFQ2RDQUFLQUlFRVFFQUlnVkZJQUFvQWdCQkFDQUlRUXhzUVFocUlBQW9BZ1FSQVFBaUJrVnlEUUVnQUNBQklBZEJBblFpQ1dvaUNpQUNJQWxxSUFnUW1RWU5BaUFBSUFVZ0FpQURJQW9nQ0VFQmFpSUpFTmNDRFFJZ0JTQURRUUowYWlFTElBVWdCRUVDZEdvaERRTkFJQTBvQWdBRVFDQUtRUUVnQ1JEWUFob2dDeUFGSUFVZ0FpQURFSmdDSUFrUTJBSWFEQUVMQ3lBTVFRQWdERUVBU2hzaEEwRUFJUUpCQUNFRUEwQWdBeUFFUmtVRVFDQUZJQVJCQW5ScUlndEJBQ0FMS0FJQUlndHJJZzRnQW1zMkFnQWdDMEVBUnlBQ0lBNUxjaUVDSUFSQkFXb2hCQXdCQ3dzZ0RTQU5LQUlBUVFGcU5nSUFJQUFnQmlBRklBZEJBblJxSUF3Z0Iyc2dDaUFKRU5jQ0RRSWdDRUVCZENJQ0lBZHJJUU5CQUNFRUEwQWdCQ0FIUmtVRVFDQUJJQVJCQW5ScUlBWWdBeUFFYWtFQ2RHb29BZ0EyQWdBZ0JFRUJhaUVFREFFTEN5QUtJQW9nQmlBQ1FRSjBhaUFJRUtvRUdndEJBQ0VFSUFBb0FnQWdCVUVBSUFBb0FnUVJBUUFhREFNTElBVkZEUUVMSUFBb0FnQWdCVUVBSUFBb0FnUVJBUUFhQzBGL0lRUWdCa1VOQVFzZ0FDZ0NBQ0FHUVFBZ0FDZ0NCQkVCQUJvTElBUUxid0lEZndGK0lBS3RRaUNHSUFPdGdFTC8vLy8vRDRNaENFRUJJUVVEUUNBQklBWkdSUVJBSUFBZ0JrRUNkR29pQnlBSEtBSUFJQVVnQXlBRUVOWUNOZ0lBSUFJZ0JXd2dDQ0FGclg1Q0lJaW5JQU5zYXlJRklBTkJBQ0FESUFWTkcyc2hCU0FHUVFGcUlRWU1BUXNMQzE4QkFuOGdBa0VmY1NFRUlBRWdBa0VGZFNJQ1N3UkFJQUFnQWtFQ2RHb2lCU0FGS0FJQUlBTWdCSFJ5TmdJQUN3SkFJQVJGRFFBZ0FTQUNRUUZxSWdGTkRRQWdBQ0FCUVFKMGFpSUFJQUFvQWdBZ0EwRWdJQVJyZG5JMkFnQUxDMVFDQTM4Q2ZpQURyU0VIUVFBaEF3TkFJQUlnQTBaRkJFQWdBQ0FEUVFKMElnVnFJZ1lnQmpVQ0FDQUVyU0FCSUFWcU5RSUFJQWQrZkh3aUNENENBQ0FJUWlDSXB5RUVJQU5CQVdvaEF3d0JDd3NnQkF2VkFnSUpmd0YrUVg4aEJnSkFJQUFnQVNBRFFSTWdBMEVCZGlJSElBZEJFMDhiSUFOQkZFZ2JJZ2NnQXlBSGF5SUlRUUVnQjNRaUNVRUJJQWgwSWd4QkFDQUZFS2NFRFFBZ0FDQUNJQWNnQ0NBSklBeEJBQ0FGRUtjRURRQUNRQ0FESUFkSEJFQkJBQ0VHQTBBZ0JpQUpSZzBDSUFBZ0FTQUdJQWgwUVFKMElnTnFJQUlnQTJvZ0NDQUVJQVVRblFZYUlBWkJBV29oQmd3QUN3QUxJQUFnQlVHb0FXeHFJQVJCQTNScUlnUkJ6Qk5xTlFJQUlROGdCRUhJRTJvb0FnQWhEU0FGUVFKMElnWkJrS2tFYWlnQ0FDRUVJQUFnQm1vb0FnUWhEa0VBSVFZRFFDQUdJQU4yRFFFZ0FTQUdRUUowSWdwcUlnc2dDeWdDQUNJTElBUkJBQ0FFSUF0Tkcyc2dBaUFLYWlnQ0FDQUVJQTRRMWdJaUNpQU5iQ0FFSUFxdElBOStRaUNJcDJ4ck5nSUFJQVpCQVdvaEJnd0FDd0FMUVg5QkFDQUFJQUVnQnlBSUlBa2dERUVCSUFVUXB3UWJJUVlMSUFZTG9RRUNBMzhDZmlBRE5RSUFJUWdEUUNBQ0lBVkdSUVJBSUFBZ0JVRUNkQ0lIYWlBR3JTQUJJQWRxTlFJQUlBaCtmQ0lKUGdJQUlBVkJBV29oQlNBSlFpQ0lweUVHREFFTEN5QUFJQUpCQW5ScUlBWTJBZ0JCQVNBRUlBUkJBVTBiSVFSQkFTRUZBMEFnQkNBRlJrVUVRQ0FBSUFJZ0JXcEJBblJxSUFBZ0JVRUNkQ0lHYWlBQklBSWdBeUFHYWlnQ0FCQ2NCallDQUNBRlFRRnFJUVVNQVFzTEM1VVNBaHAvQW40Q1FDQUFLQUk0SWdvTkFDQUFLQUlBUVFCQnVCb2dBQ2dDQkJFQkFDSUtSUVJBUVg4UEN5QUtRUVJxUVFCQnRCb1FLeG9nQUNBS05nSTRJQW9nQURZQ0FBTkFJQWxCQlVZRVFFRUFJUWRCQUNFSUEwQWdCMEVFUmcwRElBZEJBV29pQnlFQUEwQWdBRUVGUmcwQklBb2dDRUVDZENJTmFrR1FHbW9nRFVIZ3FRUnFOUUlBUWlDR0lBQkJBblJCa0trRWFqVUNBSUErQWdBZ0FFRUJhaUVBSUFoQkFXb2hDQXdBQ3dBTEFBc2dDaUFKUVFKMElndHFRb0NBZ0lDQWdJQ0FJQ0FMUVpDcEJHb29BZ0FpRGEwaUlZQ25JZzQyQWdSQkFTRUlJQTFCQVdwQkFYWWhERUVBSVFkQkFDRUFBMEFnQUVFVlJ3UkFJQW9nQ1VHb0FXeHFJQUJCQTNScUloQkJ6Qk5xSUFpdFFpQ0dJQ0dBUGdJQUlCQkJ5Qk5xSUFnMkFnQWdBRUVCYWlFQUlBZ2dEQ0FOSUE0UTFnSWhDQXdCQ3dzRFFBSkFJQWRCQWtjRVFDQUhRUlJzSUF0cVFiQ3BCR29vQWdBaEFFRUFJUWdEUUNBSVFSUkdEUUlnQ2lBSlFhZ0JiR29nQjBIVUFHeHFRUlFnQ0d0QkFuUnFJZ3dnQUsxQ0lJWWdJWUErQXVBR0lBd2dBRFlDR0NBSVFRRnFJUWdnQUNBQUlBMGdEaERXQWlFQURBQUxBQXNnQ1VFQmFpRUpEQUlMSUFkQkFXb2hCd3dBQ3dBTEFBc2dBeUFGYWlJUVFRVjBJUTlCQkNFTFFRTWhDVUVBSVFkQkFDRU9RWDhoRFFOQUlBbEJCa2NFUUVIY0FFRUFJQWxyUVFKMFFkU2xCR29vQWdBaUVVRUVhMEVDYlNJQUlBQkIzQUJPR3lFQUEwQUNRRUVnSUFCQkFXc2lDQ0FQYWlBQWJpSU1RUUZyWjJ0QkFDQU1RUUpQR3lJTVFSUkxEUUFnRVNBTUlBQkJBWFJxVGdSQUlBeEJBV29nREhRZ0NXd2lDQ0FOVHcwQklBQWhCeUFNSVE0Z0NTRUxJQWdoRFF3QkN5QUlJZ0FOQVFzTElBbEJBV29oQ1F3QkN3c2dCd1JBQWtBQ1FBSkFJQVpCQTNGRkJFQWdCa0VFY1EwQklBRkJBQkJCR2d3QkN5QUdRUUp4RFFFTElBVWhEQ0FFSVEwTUFRc2dBeUVNSUFJaERTQUZJUU1nQkNFQ0N5QUtLQUlBSWdBb0FnQkJBQ0FMUVFRZ0RuUWlDR3dpRVNBQUtBSUVFUUVBSWdRRWZ5QUtJQVJCQVNBT2RDSUZJQUlnQTBFOUlBZEJQU0FPZENBUFR4c2dCeUFIUVQxS0d5SUNRUVVnQzJzaUJ5QUxFS2tFSUFaQkIzRkJBVVlFUUNBQlFRQVFRUm9MSUFaQkJIRWhBeUFLS0FJQUlnQW9BZ0FoQmlBQUtBSUVJUWtDUUFKQUFrQUNRQ0FPUVExTkJFQkJBQ0VBSUFaQkFDQVJJQWtSQVFBaUNVVU5BaUFLSUFrZ0JTQU5JQXdnQWlBSElBc1FxUVFnQXcwQklBRkJBQkJCR2d3QkMwRUFJUUFnQmtFQUlBZ2dDUkVCQUNJSlJRMEJDeUFMUVFBZ0MwRUFTaHNoQnlBT1FRNUpJUThDUUFOQUlBQWdCMFlOQVFKL0lBOUZCRUFnQ2lBSklBVWdEU0FNSUFJZ0FDQUxhMEVGYWlJSVFRRVFxUVFnQUNBT2RDRUdJQWtNQVFzZ0FDQUxhMEVGYWlFSUlBa2dBQ0FPZENJR1FRSjBhZ3NoRVNBQVFRRnFJUUFnQ2lBRUlBWkJBblJxSUJFZ0RpQU9JQWdRblFaRkRRQUxJQWtoQUF3QkN5QUREUUZCQUNFQUlBRkJBQkJCR2lBS0lBa1ExUUlnQVNBUUVFRkZEUUlMSUFvb0FnQWlBU2dDQUNBRVFRQWdBU2dDQkJFQkFCb2dDaUFBRU5VQ1FYOFBDeUFLSUFrUTFRSUxJQUVvQWhBaEF5QVFJUVVnQkNFSlFRQWhBRUVBSVJBakFFSGdBR3NpQnlRQUlBSWlCa0VmY1NFSVFYOGdBblJCZjNNaEJDQUxRUUZySWdFZ0MyeEJmbTFCQ21vaEZBTkFJQUJCQlVZRVFBSkFJQVpCQVdzaEFrRUFJQXRySVE5QkFDRUFBMEFnQUVFRlJ3UkFJQWRCSUdvZ0FFRUNkR3BCQURZQ0FDQUFRUUZxSVFBTUFRc0xJQU5CQUNBRlFRSjBFQ3NoRVVFQklBNTBJZ0FnQWlBRlFRVjBhaUFHYmlJRElBQWdBMGdiSWdCQkFDQUFRUUJLR3lFVklBUkJmeUFJR3lFV0lBSkJCWFlpQXlBQklBRWdBMGdiSVJjZ0FVRUFJQUZCQUVvYklSZ2dDMEVBSUF0QkFFb2JJUmtnQzBFQ2F5RU1JQU5CQVdvaERTQVBRUUowUWFTcEJHb2hEeUFVUVFKMElnQkI0S2tFYWlFVUlBQWdDbXBCa0JwcUlSb2dBVUVDZENJQUlBZEJJR29pQW1vaEd5QUhRVUJySUFCcUlSd2dBMEVDZENBQ2FpRWRJQWNnQVNBRGEwRUNkR29oSGlBSVFSOXpJUjhEUUVFQUlRQWdFQ0FWUmcwQkEwQWdBQ0FaUmdSQVFRQWhBRUVBSVFFRFFDQUFJQmhIQkVBZ0IwRkFheUFBUVFKMGFpRVNJQUJCQVdvaUFpRUFBMEFnQUNBTFRnUkFJQUloQUF3REJTQUFRUUowSWdRZ0IwRkFhMm9pRXlBRUlBOXFLQUlBSWdRZ0V5Z0NBQ0FTS0FJQWEyb2lFeUFVSUFGQkFuUWlJR29vQWdCc0lBUWdHaUFnYWpVQ0FDQVRyWDVDSUlpbmJHc2lFeUFFUVFBZ0JDQVRUUnRyTmdJQUlBQkJBV29oQUNBQlFRRnFJUUVNQVFzQUN3QUxDeUFISUJ3b0FnQTJBaUJCQVNFQklBd2hCQU5BSUFSQkFFb0VRQ0FQSUFSQkFuUWlBR28xQWdBaElTQUhRVUJySUFCcUtBSUFJUUpCQUNFQUEwQWdBQ0FCUndSQUlBZEJJR29nQUVFQ2RHb2lFaUFDclNBaElCSTFBZ0IrZkNJaVBnSUFJQUJCQVdvaEFDQWlRaUNJcHlFQ0RBRUxDeUFIUVNCcUlBRkJBblJxSUFJMkFnQWdCRUVCYXlFRUlBRkJBV29oQVF3QkN3c2dEeUFFUVFKMGFqVUNBQ0VoUVFBaEFDQUhLQUpBSVFJRFFDQUFJQUZKQkVBZ0FFRUNkQ0lFSUFkQklHcHFJaElnQkNBSGFqVUNBQ0FDclNBaElCSTFBZ0IrZkh3aUlqNENBQ0FpUWlDSXB5RUNJQUJCQVdvaEFBd0JDd3NnQVVFQ2RDSUFJQWRCSUdwcUlBQWdCMm9vQWdBZ0FtbzJBZ0FnQmlBUWJDRUNRUUFoQUFOQUlBQWdBMGNFUUNBUklBVWdBaUFIUVNCcUlBQkJBblJxS0FJQUVKc0dJQUJCQVdvaEFDQUNRU0JxSVFJTUFRc0xJQkVnQlNBQ0lCMG9BZ0FpQVNBV2NSQ2JCaUFOSVFJZ0F5RUFBa0FnQ0VVRVFBTkFJQUlnQzA0TkFpQUhJQUlnRFd0QkFuUnFJQWRCSUdvZ0FrRUNkR29vQWdBMkFnQWdBa0VCYWlFQ0RBQUxBQXNEUUNBQUlCZEhCRUFnQnlBQUlBTnJRUUowYWlBSFFTQnFJQUJCQVdvaUFFRUNkR29vQWdBaUFrRUJkQ0FmZENBQklBaDJjallDQUNBQ0lRRU1BUXNMSUI0Z0d5Z0NBQ0FJZGpZQ0FBc2dFRUVCYWlFUURBSUZJQUJCQW5RaUFTQUhRVUJyYWlBSklBQWdEblFnRUdwQkFuUnFLQUlBSWdJZ0FTQVBhaWdDQUNJQlFRQWdBU0FDVFJ0ck5nSUFJQUJCQVdvaEFBd0JDd0FMQUFzQUN3VWdCeUFBUVFKMGFrRUFOZ0lBSUFCQkFXb2hBQXdCQ3dzZ0IwSGdBR29rQUNBS0tBSUFJZ0FvQWdBZ0NVRUFJQUFvQWdRUkFRQWFRUUFGUVg4TER3c1FBUUFMU3dFQ2Z5QUFJQUZIQkVBZ0FDZ0NFQ0lDQkVBZ0FDZ0NBQ0lES0FJQUlBSkJBQ0FES0FJRUVRRUFHZ3NnQUNBQktRSUFOd0lBSUFBZ0FTZ0NFRFlDRUNBQUlBRXBBZ2czQWdnTEM2UUNBUWwvSUFGQkJuRWhCaUFCUVFKMlFRRnhJUXBCNE9BRElRTUNRQU5BSUFOQnJ2NERUdzBCSUFJaEJDQURMUUFBSWdKQkgzRWhCUUovSUFOQkFXb2dBa0VGZGlJQ1FRZEhEUUFhSUFNc0FBRWlDRUgvQVhFaEFpQUlRUUJPQkVBZ0FrRUhhaUVDSUFOQkFtb01BUXNnQXkwQUFpRUpJQWhCdjM5TkJFQWdBa0VJZENBSmNrSDUvZ0ZySVFJZ0EwRURhZ3dCQ3lBRExRQURJQUpCRUhSeUlBbEJDSFJ5UWZuKy9nVnJJUUlnQTBFRWFnc2hBeUFDSUFScVFRRnFJUUlDUUFKQUlBVkJIMFlFUUNBR1JRMERJQVpCQmtZTkFTQUVJQXBxSVFRRFFDQUNJQVJORFFRZ0FDQUVJQVJCQVdvUWZpRUZJQVJCQW1vaEJDQUZSUTBBQ3d3Q0N5QUJJQVYyUVFGeFJRMENDeUFBSUFRZ0FoQitSUTBCQ3d0QmZ5RUhDeUFIQzdVQkFRZC9JQUFvQWdBaEJTQUFLQUlJSVFJRFFDQUJRUUZxSWdNZ0JVNUZCRUFDUUNBQ0lBRkJBblJxS0FJQUlnY2dBaUFEUVFKMGFpZ0NBRVlFUUNBQklRTU1BUXNEUUFKQUlBRWlBMEVCYWlFR0lBRkJBMm9nQlU0TkFDQUNJQVpCQW5ScUtBSUFJQUlnQTBFQ2FpSUJRUUowYWlnQ0FFWU5BUXNMSUFJZ0JFRUNkR29pQVNBSE5nSUFJQUVnQWlBR1FRSjBhaWdDQURZQ0JDQUVRUUpxSVFRTElBTkJBbW9oQVF3QkN3c2dBQ0FFTmdJQUN6TUFJQUVDZnlBQ0tBSk1RUUJJQkVBZ0FDQUJJQUlRdWdRTUFRc2dBQ0FCSUFJUXVnUUxJZ0JHQkVBUEN5QUFJQUZ1R2d2UEFRRURmeUFCSUFJdkFBQWdBaTBBQWtFUWRFR0FnUHdBY1hKSkJFQWdBRUVBTmdJQVFRQVBDMEYvSVFVZ0FTQUNJQU5CQVdzaUJFRURiR29pQXk4QUFDQURMUUFDUVJCMGNra0VmMEVBSVFNRFFDQUVJQU5yUVFKSVJRUkFJQU1nQkdwQkFtMGlCU0FFSUFJZ0JVRURiR29pQkM4QUFDQUVMUUFDUVJCMFFZQ0EvQUJ4Y2lBQlN5SUdHeUVFSUFNZ0JTQUdHeUVEREFFTEN5QUFJQUlnQTBFRGJHb2lBQzhBQUNBQUxRQUNJZ0JCRUhSQmdJRDhBSEZ5TmdJQUlBTkJCWFFnQUVFRmRuSkJJR29GUVg4TEM5b2FBUXAvSUFBb0FnUWhEU0FBS0FJSUlRd0RRQ0FGSVFjZ0JFRUJhaUVJQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKL0FrQUNRQUpBSUFRdEFBQWlDVUVCYXc0Y0FnRUlDUVlIQlJVVkFBb0tDdzRNRFJFUkVoSWFHUVFFRHhBWUZ4WUxRUUVoQ1NBR1JRMGZJQWNQQzBFRklRb2dDQ2dBQUF3QkMwRURJUW9nQ0M4QUFBc2hDQ0FISUExUERSc0NRQ0FNUlFSQUlBZEJBV29oQlNBSExRQUFJUWtNQVFzZ0J5OEJBQ0lKUVlENEEzRkJnTEFEUnlBTVFRSkhjaUFOSUFkQkFtb2lCVTF5RFFBZ0JTOEJBQ0lMUVlENEEzRkJnTGdEUncwQUlBbEJDblJCZ1BnL2NTQUxRZjhIY1hKQmdJQUVhaUVKSUFkQkJHb2hCUXNnQkNBS2FpRUVJQUFvQWhnRWZ5QUpJQUFvQWh3UTNRRUZJQWtMSUFoR0RTQU1Hd3NnQUNBQklBSWdBeUFFS0FBQklBUkJCV29pQkdvZ0J5QUpRUlpyUVFBUXJnUkJBRTROSHd3WkN5QUlLQUFBSUFocVFRUnFJUVFNRndzZ0NDRUVJQVVnQUNnQ0FDSUhSZzBkSUFBb0FoUkZEUmdDUUNBTVJRUkFJQVZCQVdzdEFBQWhDZ3dCQ3lBRlFRSnJMd0VBSWdwQmdQZ0RjVUdBdUFOSElBeEJBa2R5RFFBZ0J5QUZRUVJySWdkTERRQWdCeThCQUNJSFFZRDRBM0ZCZ0xBRFJ3MEFJQXBCL3dkeElBZEIvd2R4UVFwMGNrR0FnQVJxSVFvTElBb1FyUVFOSFF3WUN5QUlJUVFnQnlBTklnVkdEUndnQUNnQ0ZFVU5Gd0pBSUF4RkJFQWdCeTBBQUNFSkRBRUxJQWN2QVFBaUNVR0ErQU54UVlDd0EwY2dERUVDUjNJZ0IwRUNhaUFOVDNJTkFDQUhMd0VDSWdWQmdQZ0RjVUdBdUFOSERRQWdDVUVLZEVHQStEOXhJQVZCL3dkeGNrR0FnQVJxSVFrTElBY2hCU0FKRUswRURSd01Gd3NnQnlBTlJnMFdBa0FnREVVRVFDQUhRUUZxSVFVZ0J5MEFBQ0VKREFFTElBY3ZBUUFpQ1VHQStBTnhRWUN3QTBjZ0RFRUNSM0lnRFNBSFFRSnFJZ1ZOY2cwQUlBVXZBUUFpQkVHQStBTnhRWUM0QTBjTkFDQUpRUXAwUVlENFAzRWdCRUgvQjNGeVFZQ0FCR29oQ1NBSFFRUnFJUVVMSUFnaEJDQUpFSzBFUlEwYkRCWUxJQWNnRFVZTkZTQU1SUVJBSUFkQkFXb2hCU0FJSVFRTUd3c2dCMEVDYWlFRklBZ2hCQ0FITHdFQVFZRDRBM0ZCZ0xBRFJ5QU1RUUpIY2cwYUlBVWdEVThOR2lBSFFRUnFJQVVnQnk4QkFrR0ErQU54UVlDNEEwWWJJUVVNR2dzZ0NDMEFBQ0lGSUFBb0FneFBEUWtnQ1NBRlFRRjBha0VDZENBQmFrRXNheUFITmdJQUlBUkJBbW9oQkF3U0N5QUVMUUFDSWdrZ0FDZ0NERThOQnlBRVFRTnFJUVFnQ0MwQUFDRUZBMEFnQlNBSlN3MFNJQUVnQlVFRGRHcENBRGNDQUNBRlFRRnFJUVVNQUFzQUN5QUNJQU5CQW5ScUlBUW9BQUUyQWdBZ0EwRUJhaUVESUFSQkJXb2hCQXdRQ3lBRFFRRnJJUU1NRGdzZ0JDZ0FBU0VGSUFOQkFuUWdBbXBCQkdzaUNDQUlLQUlBUVFGcklnZzJBZ0FnQkNBRlFRQWdDQnRxUVFWcUlRUU1EZ3NnQWlBRFFRSjBhaUFITmdJQUlBTkJBV29oQXd3TUN5QUVJQVFvQUFGQkFDQUNJQU5CQVdzaUEwRUNkR29vQWdBZ0IwY2Jha0VGYWlFRURBd0xRUUFoQzBFQUlRb2dBQ2dDQUNJRUlBZEhCRUFDUUNBTVJRUkFJQWRCQVdzdEFBQWhCUXdCQ3lBSFFRSnJMd0VBSWdWQmdQZ0RjVUdBdUFOSElBeEJBa2R5RFFBZ0JDQUhRUVJySWdSTERRQWdCQzhCQUNJRVFZRDRBM0ZCZ0xBRFJ3MEFJQVZCL3dkeElBUkIvd2R4UVFwMGNrR0FnQVJxSVFVTElBVVFyd01oQ2dzZ0J5QU5TUVJBQWtBZ0RFVUVRQ0FITFFBQUlRVU1BUXNnQnk4QkFDSUZRWUQ0QTNGQmdMQURSeUFNUVFKSGNpQUhRUUpxSUExUGNnMEFJQWN2QVFJaUJFR0ErQU54UVlDNEEwY05BQ0FGUVFwMFFZRDRQM0VnQkVIL0IzRnlRWUNBQkdvaEJRc2dCUkN2QXlFTEN5QUhJUVVnQ0NFRVFSSWdDV3NnQ2lBTGMwWU5FZ3dOQ3lBRUxRQUJJZ2dnQUNnQ0RFOE5EQ0FFUVFKcUlRUWdBU0FJUVFOMGFpSUhLQUlBSWdoRkRSRWdCeWdDQkNJS1JRMFJJQWxCRTBZTkNBTkFJQWdnQ2s4TkVpQUZJQUFvQWdBaURrWU5EUUpBQWtBQ1FDQU1CRUFnQ2tFQ2F5SUhMd0VBSWdsQmdQZ0RjVUdBdUFOSElBeEJBa2R5SUFjZ0NFMXlEUUVnQ2tFRWF5SUtMd0VBSWd0QmdQZ0RjVUdBc0FOSERRRWdDVUgvQjNFZ0MwSC9CM0ZCQ25SeVFZQ0FCR29oQ1F3Q0N5QUZRUUZySWdVdEFBQWhDeUFLUVFGcklnb3RBQUFoQ1F3Q0N5QUhJUW9MQWtBZ0JVRUNheUlITHdFQUlndEJnUGdEY1VHQXVBTkhJQXhCQWtkeUlBY2dEazF5RFFBZ0JVRUVheUlGTHdFQUlnNUJnUGdEY1VHQXNBTkhEUUFnQzBIL0IzRWdEa0gvQjNGQkNuUnlRWUNBQkdvaEN3d0JDeUFISVFVTElBQW9BaGdFZnlBSklBQW9BaHdpQnhEZEFTRUpJQXNnQnhEZEFRVWdDd3NnQ1VZTkFBc01EQXRCN2lsQndQd0FRZDBSUWM3WEFCQUFBQXRCMXlsQndQd0FRZFFSUWM3WEFCQUFBQXNnQkVFRmFpSUlJQWdnQkNnQUFXb2lDaUFKUVFsR0lnc2JJUVJCZnlFSklBQWdBU0FDSUFNZ0NpQUlJQXNiSUFkQkFFRUFFSzRFUVFCT0RRNE1Dd3NRQVFBTElBUkJFV29pRUNBRUtBQUJhaUVMSUFRb0FBa2hEeUFFS0FBRklRNUJBQ0VLQTBBQ1FBSkFJQUFnQVNBQ0lBTWdFQ0FGUVFFUXBRWWlDVUVCYWc0Q0RBRUFDeUFLUVFGcUlRb2dDU0VGSUE5Qi8vLy8vd2RHSUFvZ0QwbHlEUUVMQ3lBS0lBNUpEUWNnQ3lFRUlBb2dEazBORENBQUlBRWdBaUFESUFnZ0JVRURJQW9nRG1zUXJnUkJBRTROREF3R0N5QUhJQUFvQWdBaUNVWU5CaUFNUlFSQUlBZEJBV3NoQlNBSUlRUU1EQXNnQjBFQ2F5RUZJQWdoQkNBTVFRSkhEUXNnQlM4QkFFR0ErQU54UVlDNEEwY2dCU0FKVFhJTkN5QUhRUVJySWdjZ0JTQUhMd0VBUVlENEEzRkJnTEFEUmhzaEJRd0xDeUFISUExUERRVUNRQ0FNUlFSQUlBZEJBV29oQlNBSExRQUFJUWdNQVFzZ0J5OEJBQ0lJUVlENEEzRkJnTEFEUnlBTVFRSkhjaUFOSUFkQkFtb2lCVTF5RFFBZ0JTOEJBQ0lKUVlENEEzRkJnTGdEUncwQUlBaEJDblJCZ1BnL2NTQUpRZjhIY1hKQmdJQUVhaUVJSUFkQkJHb2hCUXNnQkM4QUFTRUhJQUFvQWhnRVFDQUlJQUFvQWh3UTNRRWhDQXNnQ0NBRVFRTnFJZ29vQUFCSkRRVkJBQ0VMSUFnZ0JDQUhRUUZySWdsQkEzUnFLQUFIU3cwRkEwQWdDU0FMU1EwR0lBb2dDU0FMYWtFQmRpSUVRUU4wYWlJT0tBQUFJQWhMQkVBZ0JFRUJheUVKREFFTElBNG9BQVFnQ0VrRVFDQUVRUUZxSVFzTUFRc0xJQW9nQjBFRGRHb2hCQXdLQ3lBSElBMVBEUVFDUUNBTVJRUkFJQWRCQVdvaEJTQUhMUUFBSVFnTUFRc2dCeThCQUNJSVFZRDRBM0ZCZ0xBRFJ5QU1RUUpIY2lBTklBZEJBbW9pQlUxeURRQWdCUzhCQUNJSlFZRDRBM0ZCZ0xnRFJ3MEFJQWhCQ25SQmdQZy9jU0FKUWY4SGNYSkJnSUFFYWlFSUlBZEJCR29oQlFzZ0JDOEFBU0VISUFBb0FoZ0VRQ0FJSUFBb0Fod1EzUUVoQ0FzZ0NDQUVRUU5xSWdvdkFBQkpEUVFDUUNBRUlBZEJBV3NpQ1VFQ2RHb3ZBQVVpQkVILy93TkdJQWhCLy84RFQzRU5BQ0FFSUFoSkRRVkJBQ0VFQTBBZ0JDQUpTdzBHSUFoQi8vOERjU0lPSUFvZ0JDQUpha0VCZGlJTFFRSjBhaUlQTHdBQVNRUkFJQXRCQVdzaENRd0JDeUFQTHdBQ0lBNVBEUUVnQzBFQmFpRUVEQUFMQUFzZ0NpQUhRUUowYWlFRURBa0xBMEFnQ0NBS1R3MEpJQVVnRFU4TkJBSi9BbjhDUUNBTUJFQWdDQzhCQUNJSlFZRDRBM0ZCZ0xBRFJ5QU1RUUpIY2lBSVFRSnFJZ2NnQ2s5eURRRWdCeThCQUNJTFFZRDRBM0ZCZ0xnRFJ3MEJJQWxCQ25SQmdQZy9jU0FMUWY4SGNYSkJnSUFFYWlFSklBaEJCR29NQWdzZ0JTMEFBQ0VMSUFndEFBQWhDU0FJUVFGcUlRZ2dCVUVCYWd3Q0N5QUhDeUVJQWtBZ0JTOEJBQ0lMUVlENEEzRkJnTEFEUnlBTVFRSkhjaUFGUVFKcUlnY2dEVTl5RFFBZ0J5OEJBQ0lPUVlENEEzRkJnTGdEUncwQUlBdEJDblJCZ1BnL2NTQU9RZjhIY1hKQmdJQUVhaUVMSUFWQkJHb01BUXNnQndzaEJTQUFLQUlZQkg4Z0NTQUFLQUljSWdjUTNRRWhDU0FMSUFjUTNRRUZJQXNMSUFsR0RRQUxEQU1MSUFnaEJBd0hDeUFISVFVTUJndEJmdzhMUVFBaENTQUdEUUVMSUFBb0FqQWhCUU5BSUFraEF5QUZSUVJBSUFNUEN3SkFBa0FDUUFKQUlBQW9BaWdnQlVFQmF5SUZJQUFvQWlSc2FpSUlMUUFBSWdRT0JBQUNBZ0VDQzBFQklRa2dBdzBDREFVTFFRRWhDU0FERFFFZ0FTQUlRUkJxSWdNZ0FDZ0NERUVEZEJBZkdpQUNJQU1nQUNnQ0RFRURkR29nQ0MwQUFTSURRUUowRUI4YUlBZ29BZ2doQlNBSUtBSU1JZ2tvQUF3aENrRUFJUVFEUUFKL0FrQWdCQ0FLUndSQUlBVkJBV3NnREVVTkFob2dCVUVDYXlFSElBeEJBa2NOQVNBSEx3RUFRWUQ0QTNGQmdMZ0RSdzBCSUFjZ0FDZ0NBRTBOQVNBRlFRUnJJZ1VnQnlBRkx3RUFRWUQ0QTNGQmdMQURSaHNNQWdzZ0NTZ0FBQ0VFSUFnZ0JUWUNDQ0FJSUFnb0FnUkJBV3NpQnpZQ0JDQUVJQWxxUVJCcUlRUWdCdzBKSUFBZ0FDZ0NNRUVCYXpZQ01Bd0pDeUFIQ3lFRklBUkJBV29oQkF3QUN3QUxJQU5CQUNBRVFRRkdHdzBFUVFBaENTQUREUUFnQkVFQ1JnMERDeUFBSUFVMkFqQU1BQXNBQ3lBSkR3c2dBU0FJUVJCcUlBQW9BZ3hCQTNRUUh4b0xJQWdvQWdnaEJTQUlLQUlNSVFRZ0FpQUlJQUFvQWd4QkEzUnFRUkJxSUFndEFBRWlBMEVDZEJBZkdpQUFJQUFvQWpCQkFXczJBakFNQUFzQUM0c0NBUWQvSUFGQkFuUkJ3UDREYWlnQ0FDSUNJQUZCQVhSQmtJQUVhaThCQUdvaENFRUFJUUVDUUFOQUlBSWdDRThOQVNBQ1FRRnFJUVlDUUFKQUlBSXRBQUFpQkVFL1RRUkFJQU1nQkVFRGRtcEJBV29oQWlBQkJFQWdBQ0FESUFJUWZnMERDeUFCUVFGeklRRWdCRUVIY1NBQ2FrRUJhaUVGREFFTEFuOGdBeUFFYWtIL0FHc2dCTUJCQUVnTkFCb2dCaTBBQUNFRklBUkIzd0JOQkVBZ0FrRUNhaUVHSUFNZ0JFRUlkR29nQldwQi8vOEFhd3dCQ3lBQ1FRTnFJUVlnQWkwQUFpQURJQVJCRUhScUlBVkJDSFJxYWtILy8vOENhd3NoQlNBRElRSUxJQUVFUUNBQUlBSWdCUkIrRFFFTElBRkJBWE1oQVNBR0lRSWdCU0VEREFFTEMwRi9JUWNMSUFjTE9BQkJzTlFDSUFFUXJ3UWlBVUVBU0FSQVFYNFBDeUFBSUFGQkhVMEVmMElCSUFHdGhxY0ZJQUZCQW5SQjJOZ0NhaWdDQUFzUW9RWUxOUUVCZnlNQVFSQnJJZ01rQUNBRElBRTJBZ2dnQXlBQ1FRRnFOZ0lNSUFBZ0EwRUlha0VDRUxFRUlRQWdBMEVRYWlRQUlBQUxsd0lCQTM4Z0FTZ0NBQ0lDUWY3L0IwOEVRQ0FBUVlZN1FRQVFPa0YvRHdzQ1FDQUNRUUZOQkVBZ0FFRUNRWDhRdUFFYURBRUxJQUVvQWdnZ0FrRUNkR29pQkVFRWF5Z0NBQ0lEUVg5R0JFQWdCRUVJYXlnQ0FDRURDeUFDUVFGMklRSWdBMEgvL3dOTkJFQWdBRUVWSUFJUXNnUkJBQ0VDQTBBZ0FpQUJLQUlBVGcwQ0lBQWdBa0VDZENJRElBRW9BZ2hxTHdFQUVDb2dBRUYvSUFFb0FnZ2dBMEVFY21vb0FnQkJBV3NpQXlBRFFYNUdHMEgvL3dOeEVDb2dBa0VDYWlFQ0RBQUxBQXNnQUVFV0lBSVFzZ1JCQUNFQ0EwQWdBaUFCS0FJQVRnMEJJQUFnQWtFQ2RDSURJQUVvQWdocUtBSUFFQjBnQUNBQktBSUlJQU5CQkhKcUtBSUFRUUZyRUIwZ0FrRUNhaUVDREFBTEFBdEJBQXNtQVFGL0lBQW9BamdpQVVFQVNBUkFJQUFnQUNBQVFUeHFRUUFRcXdZaUFUWUNPQXNnQVF2Z0FnRUZmeU1BUVpBQmF5SUVKQUFnQVVFQU5nSUFJQUFvQWlBaEEwRUJJUVlEUUNBRUlBTTJBb3dCQWtBQ1FBSkFJQUFvQWh3aUJ5QURUUVJBSUFZaEJRd0JDd0pBQWtBQ1FBSkFJQU10QUFBaUJVSGJBR3NPQWdFQ0FBc2dCVUVvUncwRklBTXRBQUZCUDBjTkFpQURMUUFDUVR4SERRVWdBeTBBQXlJRlFTRkdJQVZCUFVaeURRVWdBVUVCTmdJQUFrQWdBa1VOQUNBRUlBTkJBMm8yQW93QklBUWdCRUdNQVdvZ0FDZ0NLQkMxQkEwQUlBUWdBaER5QTBVTkJRc2dCa0VCYWlFRklBWkIvUUZLRFFNZ0JDZ0NqQUVoQXlBRklRWU1CUXNEUUNBRUlBTWlCVUVCYWlJRE5nS01BU0FESUFkUERRVUNRQ0FETFFBQVFkd0FhdzRDQUFZQkN5QUVJQVZCQW1vaUF6WUNqQUVNQUFzQUN5QUVJQU5CQVdvaUF6WUNqQUVNQXdzZ0JrSDlBVW9oQnlBR1FRRnFJZ1VoQmlBSFJRMENDMEYvSUFVZ0Foc2hCZ3NnQkVHUUFXb2tBQ0FHRHdzZ0EwRUJhaUVEREFBTEFBdFZBUU4vSUFBZ0FXb2hCQ0FDRUQ4aEEwRUJJUUVEUUFKQUlBQWdCRThFUUVGL0lRRU1BUXNnQXlBQUVEOGlCVVlFUUNBQ0lBQWdBeEJoUlEwQkN5QUJRUUZxSVFFZ0FDQUZha0VCYWlFQURBRUxDeUFCQytRaEFSZC9Jd0JCNEFKcklnSWtBRUVNSUFGcklSWWdBVUVMYWlFWElBQkJ4QUJxSVJJZ0FVRVRhaUVZSUFCQjNBQnFJUThnQUNnQ0JDRVRBa0FDUUFKQUEwQWdBQ2dDR0NJRElBQW9BaHhQRFFNZ0F5MEFBQ0lFUVNsR0lBUkIvQUJHY2cwRElBQW9BZ1FoRUNBQ0lBTTJBaHdDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDZndKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBUkIyd0JyRGdRQ0FRTUlBQXNDUUFKQUFrQUNRQUpBSUFSQkpHc09Dd0VKQ1FrRUNSa1pDUWtDQUFzZ0JFSDdBR3NPQXdJSUJnY0xJQUlnQTBFQmFpSUlOZ0ljSUFCQkJoQVJEQlFMSUFJZ0EwRUJhallDSENBQUtBSTBJUW9nQVVVTkNDQUFRUnNRRVNBQVFRUkJBeUFBS0FJd0d4QVJEQXdMSUFBb0FpZ0VRQ0FBUWRVL1FRQVFPZ3dYQ3lBRExRQUJRVHByUVhaSkRRVWdBaUFEUVFGcU5nSWdJQUpCSUdwQkFSRGNBaG9DUUNBQ0tBSWdJZ010QUFBaUJVRXNSdzBBSUFJZ0EwRUJhallDSUNBRExRQUJJZ1ZCT210QmRra05BQ0FDUVNCcVFRRVEzQUlhSUFJb0FpQXRBQUFoQlFzZ0JVSC9BWEZCL1FCSERRVU1GUXNDUUNBRExRQUJRVDlHQkVCQkF5RUhRUUFoQ2tFQUlRVkJBQ0VHQWtBQ1FBSkFBa0FnQXkwQUFpSUVRVHByRGdRQUF3RVNBZ3NnQUNBRFFRTnFOZ0lZSUFBb0FqUWhDaUFBSUFFUThnSU5HaUFDSUFBb0FoZzJBaHdnRUNFRElBQWdBa0VjYWtFcEVMQURSUTBTREJvTFFRRWhCVUVFSVFjZ0F5MEFBeUlFUVQxR0JFQkJBU0VHREJFTFFRRWhCaUFFUVNGR0RSQWdBaUFEUVFOcU5nSWNJQThnQWtFY2FpQUFLQUlvRUxVRUJFQWdBRUdjNXdCQkFCQTZEQm9MSUJJb0FnQWdBQ2dDU0NBUEVLd0dRUUJLQkVBZ0FFR0g1d0JCQUJBNkRCb0xJQklnRHlBUEVEOUJBV29RY2lBQVFRRTJBandNQXdzZ0JFRWhSZzBQQ3lBQVFjSEpBRUVBRURvTUZ3c2dBaUFEUVFGcU5nSWNJQkpCQUJBUkN5QUFLQUkwSWdwQi93Rk9CRUFnQUVHcU9VRUFFRG9NRmdzZ0FDQUtRUUZxTmdJMElBQW9BZ1FoQXlBQUlCY2dDaENwQWlBQUlBSW9BaHcyQWhnZ0FDQUJFUElDRFJVZ0FpQUFLQUlZTmdJY0lBQWdGaUFLRUtrQ0lBQWdBa0VjYWtFcEVMQURSUTBOREJVTEFrQUNRQUpBQWtBQ1FBSkFBa0FnQXkwQUFTSUVRVEJyRGhNREJBUUVCQVFFQkFRRUNnb0tDZ29LQ2dvQkFBc2dCRUhyQUVZTkFTQUVRZUlBUncwSkN5QUFRUkZCRWlBRVFlSUFSaHNRRVNBRFFRSnFJUWdNRWdzQ1FDQURMUUFDUVR4SEJFQkI4dVlBSVFVZ0FDZ0NLQTBCSUFBUXRBUU5BUXdKQ3lBQ0lBTkJBMm8yQWlBZ0R5QUNRU0JxSUFBb0FpZ1F0UVFFUUVHYzV3QWhCU0FBS0FJb0RRRWdBQkMwQkEwQkRBa0xJQklvQWdBZ0FDZ0NTQ0FQRUt3R0lnUkJBRTROQXlBQUlBSkJ3QUpxSUE4UXF3WWlCRUVBVGcwRFFmdjVBQ0VGSUFBb0FpZ05BQ0FBRUxRRVJRMElDeUFBSUFWQkFCQTZEQmdMSUFJZ0EwRUNhallDSENBRExRQUNJUVlnQUNnQ0tBUkFRUUFoQkNBR1FUcHJRWFpKRFFnZ0FFSEl6UUJCQUJBNkRCZ0xRUUFoQkNBR1FmZ0JjVUV3UncwSElBSWdBMEVEYWpZQ0hDQUdRVEJySVFRZ0F5MEFBeUlHUWZnQmNVRXdSdzBISUFJZ0EwRUVhallDSENBRVFRTjBJQVpxUVRCcklRUU1Cd3NnQWlBRFFRRnFJZ1UyQWh3Z0FrRWNha0VBRU53Q0lnUkJBRTRFUUNBRUlBQW9BalJJRFFJZ0FCQ3FCaUFFU2cwQ0N5QUFLQUlvUlFSQUlBSWdCVFlDSENBRkxRQUFJZ1JCTjAwRVFFRUFJUVlnQkVFelRRUkFJQUlnQTBFQ2FpSUZOZ0ljSUFSQk1Hc2hCaUFETFFBQ0lRUUxJQVJCK0FGeFFUQkhCRUFnQmlFRURBa0xJQUlnQlVFQmFqWUNIQ0FFUWY4QmNTQUdRUU4wYWtFd2F5RUVJQVV0QUFFaUEwSDRBWEZCTUVjTkNDQUNJQVZCQW1vMkFod2dCRUVEZENBRGFrRXdheUVFREFnTElBSWdBMEVDYWpZQ0hBd0hDeUFBUWZYTkFFRUFFRG9NRmdzZ0FpQUNLQUlnTmdJY0N5QUFLQUkwSVFvZ0FDZ0NCQ0VESUFBZ0dDQUVFS2tDREF3TElBQW9BalFoQ2lBQkJFQWdBRUViRUJFTElBQW9Ba0FoQkNBQ1FUUTJBdEFDSUFJZ0JEWUN6QUlnQWtFQU5nTElBaUFDUWdBM0FzQUNJQUlnQTBFQmFpSUhOZ0xVQWlBRExRQUJJZ1JCM2dCSElnZ05CaUFDSUFOQkFtb2lCellDMUFKQkFBd0hDeUFBS0FJb1JRMEJJQUJCMVQ5QkFCQTZEQklMSUFSQlAwWU5FQXNnQUNBQ1FRaHFJQUpCSEdwQkFCQ3pCQ0lFUVFCSURSQUxJQUFvQWpRaENpQUFLQUlFSVFNZ0FRUkFJQUJCR3hBUkN3SkFJQVJCZ0lDQWdBUk9CRUFnQUNBQ1FRaHFFS2tHSVFRZ0FpZ0NGQ0FDS0FJUVFRQWdBaWdDR0JFQkFCb2dCRVVOQVF3UkN5QUFLQUlzQkVBZ0JDQUFLQUlvRU4wQklRUUxJQVJCLy84RFRBUkFJQUJCQVNBRUVMSUVEQUVMSUFCQkFpQUVFTGdCR2dzZ0FVVU5CeUFBUVJzUUVRd0hDeUFBUVFSQkF5QUFLQUl3R3hBUkRBUUxJQUlnQTBFQmFpSUlOZ0ljSUFCQkJSQVJEQWtMUVFFTElRVURRQ0FGUlFSQUlBY3RBQUFoQkVFQklRVU1BUXNDUUFKQUFrQUNRQ0FFUWY4QmNVSGRBRWNFUUNBQUlBSkJyQUpxSUFKQjFBSnFRUUVRc3dRaUEwRUFTQTBEQWtBQ1FBSkFBa0FnQWlnQzFBSWlCeTBBQUVFdFJ3MEFJQWN0QUFGQjNRQkdEUUFnQWlBSFFRRnFOZ0lnSUFOQmdJQ0FnQVJQQkVBZ0FDZ0NLRVVOQVNBQ0tBSzRBaUFDS0FLMEFrRUFJQUlvQXJ3Q0VRRUFHZ3dEQ3lBQUlBSkJyQUpxSUFKQklHcEJBUkN6QkNJR1FRQklEUWNnQmtHQWdJQ0FCRWtOQVNBQ0tBSzRBaUFDS0FLMEFrRUFJQUlvQXJ3Q0VRRUFHaUFBS0FJb0RRSUxJQU5CZ0lDQWdBUkpEUUlnQWtIQUFtb2dBaWdDdEFJaUF5QUNLQUtzQWhDeEJDRUdJQUlvQXJnQ0lBTkJBQ0FDS0FLOEFoRUJBQm9nQmtVTkJ3d0ZDeUFDSUFJb0FpQWlCellDMUFJZ0F5QUdUUTBEQ3lBQVFhYnJBRUVBRURvTUJBc2dBa0hBQW1vZ0F5QURFS2dHUlEwRURBSUxJQUFvQWl3RVFDQUNRVFEyQWpBZ0FpQUNLQUxNQWpZQ0xDQUNRUUEyQWlnZ0FrSUFOd0lnSUFKQzRZQ0FnTEFQTndMWUFrRUJJUVVnQWtFZ2FpQUNLQUxJQWlBQ0tBTEFBaUFDUWRnQ2FrRUNRUUVRMndJaEJDQUNLQUlvSVFNZ0JFVUVRRUVBSVFVZ0FpZ0NJQ0lFUVFBZ0JFRUFTaHNoQmdOQUlBVWdCa1pGQkVBZ0F5QUZRUUowYWlJSklBa29BZ0JCSUdzMkFnQWdCVUVCYWlFRkRBRUxDeUFDUWNBQ2FpQURJQVFRc1FRaEJRc2dBaWdDTENBRFFRQWdBaWdDTUJFQkFCb2dCUTBDQ3lBSVJRUkFJQUpCd0FKcUVOb0NEUUlMSUFBZ0FrSEFBbW9RcVFZTkFpQUNLQUxNQWlBQ0tBTElBa0VBSUFJb0F0QUNFUUVBR2lBQ0lBZEJBV28yQWh3Z0FVVU5CZ3dGQ3lBQ1FjQUNhaUFESUFZUXFBWkZEUUlMSUFBUXFBSUxJQUlvQXN3Q0lBSW9Bc2dDUVFBZ0FpZ0MwQUlSQVFBYURBMExRUUFoQlF3QUN3QUxJQUJCR3hBUkN5QVFJUU1NQVFzZ0F5QUhhaUVIUVg4aEF3SkFJQVVOQUNBQUtBSW9EUUFnQUNnQ05DRUtJQkFoQXdzZ0FFRVlRUmNnQkVFaFJodEJBQkM0QVNFRUlBQWdCellDR0NBQUlBWVE4Z0lOQ0NBQ0lBQW9BaGcyQWh3Z0FDQUNRUnhxUVNrUXNBTU5DQ0FBUVFvUUVTQUFLQUlNRFFnZ0FDZ0NBQ0FFYWlBQUtBSUVJQVJyUVFSck5nQUFDeUFDS0FJY0lRZ2dBMEVBU0EwREFrQUNRQUpBQWtBQ1FDQUlMUUFBSWdSQkttc09BZ0VDQUFzZ0JFRS9SZzBDSUFSQit3QkhEUWNnQ0MwQUFVRTZhMEYxU3cwRElBQW9BaWhGRFFjTUNBc2dDRUVCYWlFSVFRQWhDMEgvLy8vL0J5RUpEQVVMUVFFaEN5QUlRUUZxSVFoQi8vLy8vd2NoQ1F3RUMwRUJJUWtnQWlBSVFRRnFJZ2cyQWh4QkFDRUxEQU1MSUFJZ0NFRUJhallDSENBQ1FSeHFRUUVRM0FJaUN5RUpBa0FnQWlnQ0hDSUVMUUFBSWdWQkxFY05BQ0FDSUFSQkFXbzJBaHhCLy8vLy93Y2hDU0FFTFFBQklnVkJPbXRCZGtrTkFDQUNRUnhxUVFFUTNBSWlDU0FMU0EwRklBSW9BaHd0QUFBaEJRc2dCVUgvQVhGQi9RQkdEUUVnQUNnQ0tBMEJDeUFDSUFnMkFod01BZ3NnQUNBQ1FSeHFRZjBBRUxBRERRVWdBaWdDSENFSUN3SkFBbjhnQ0MwQUFFRS9SZ1JBSUFJZ0NFRUJhaUlJTmdJY0lBQW9BZ1FnQTJzaEIwRUFJUVZCQUF3QkN5QUFLQUlNSVFRQ1FDQUpRUUJLQkVBZ0JBMERJQUFvQWdRZ0Eyc2hCeUFBS0FJQUloRWdBMm9oRFVFQUlRVkJBQ0VNQTBBZ0JTQUhTQVJBSUFVZ0RXb2lEaTBBQUNJVVFmQ0JBbW90QUFBaEJFRUNJUVlDUUFKQUFrQUNRQ0FVUVFGckRoWUNBZ0lDQXdNSEJ3Y0hCd2NIQndjSEF3TUhCd0VBQnd0QkF5RUdDeUFPTHdBQklBWjBJQVJxSVFRTElBeEJBV29oREFzZ0JDQUZhaUVGREFFTEN5QU1RUUJNRFFFZ0FFRUtFQkVnQUNBRFFSRVE4QUVOQXlBQUtBSUFJQU5xUVJ3NkFBQWdBQ2dDQkNFR0lBTWdBQ2dDQUdvaUJDQU1OZ0FOSUFRZ0NUWUFDU0FFSUFzMkFBVWdCQ0FHSUFOclFSRnJOZ0FCREFRTElBUU5BaUFBS0FJRUlBTnJJUWNnQUNnQ0FDRVJDMEVBSVFRZ0FrRWdha0VBUWY4QkVDc2FJQU1nRVdvaEZFRitJUTFCQUNFUkEwQWdCQ0FIVGtVRVFDQUVJQlJxSWc0dEFBQWlCVUh3Z1FKcUxRQUFJUVpCQWlFTUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRlFRRnJEaHNDQWdJQ0J3Y0dCZ1lHQXdNRUJnY0hCd2NGQlFFQUJnWUhCZ2NHQzBFRElRd0xJQTR2QUFFZ0RIUWdCbW9oQmd0QkFTQU5JQTFCZmtZYklRME1CQXNnRGkwQUFTQUNRU0JxYWlJRklBVXRBQUJCQVhJNkFBQU1Bd3NnRGkwQUFTSUZJQTR0QUFJaURDQUZJQXhMR3lFTUEwQWdCU0FNUmcwRElBSkJJR29nQldvaURpQU9MUUFBUVFGeU9nQUFJQVZCQVdvaEJRd0FDd0FMUVFFaEVTQU9MUUFCSUFKQklHcHFJZ1VnQlMwQUFFRUNjam9BQUF3QkN5QU5RUUFnRFVGK1J4c2hEUXNnQkNBR2FpRUVEQUVMQzBFQUlRVUNmd0pBSUJGRkRRQURRQ0FGUWY4QlJnMEJJQUpCSUdvZ0JXb2hCQ0FGUVFGcUlRVWdCQzBBQUVFRFJ3MEFDMEYvREFFTElBMUJBQ0FOUVg1SEd3dEZJUVZCQVFzaEJBSkFJQXRGQkVBZ0FDZ0NOQ0FLUndSQUlBQWdBMEVERVBBQkRRTWdBQ2dDQUNBRGFrRU5PZ0FBSUFNZ0FDZ0NBR29nQ2pvQUFTQURJQUFvQWdCcUlBQXRBRFJCQVdzNkFBSWdBMEVEYWlFREN3SkFBa0FDUUNBSkRnSUFBUUlMSUFBZ0F6WUNCQXdGQ3lBQUlBTkJCUkR3QVEwRElBQW9BZ0FnQTJvZ0JFRUljam9BQUNBQUtBSUFJQU5xSUFjMkFBRU1CQXNnQ1VILy8vLy9CMFlOQVNBQUlBTkJDaER3QVEwQ0lBQW9BZ0FnQTJwQkR6b0FBQ0FBS0FJQUlnWWdBMEVGYWlJRmFpQUVRUWh5T2dBQUlBTWdCbW9nQ1RZQUFTQURJQUFvQWdCcUlBZEJCV28yQUFZZ0FFRU9JQVVRM0FFZ0FFRVFFQkVNQXdzZ0JTQUxRUUZISUFsQi8vLy8vd2RIY25KRkJFQWdBQ0FFUVFseklBTVEzQUVNQXdzZ0MwRUJSd1JBSUFBZ0EwRUZFUEFCRFFJZ0FDZ0NBQ0FEYWtFUE9nQUFJQUFvQWdBZ0Eyb2dDellBQVNBQVFRNGdBMEVGYWlJREVOd0JJQUJCRUJBUkN5QUpRZi8vLy84SFJnUkFJQUFvQWdRaEJpQUFJQVJCQ0hJZ0JTQUhha0VGYWhDNEFSb2dCUVJBSUFCQkdSQVJJQUFnQXlBSEVMQUVJQUJCR2lBR0VOd0JEQVFMSUFBZ0F5QUhFTEFFSUFCQkJ5QUdFTndCREFNTElBa2dDMHdOQWlBQVFROGdDU0FMYXhDNEFSb2dBQ2dDQkNFR0lBQWdCRUVJY2lBSFFRVnFFTGdCR2lBQUlBTWdCeEN3QkNBQVFRNGdCaERjQVNBQVFSQVFFUXdDQ3lBQUlBTWdCVUVGYWhEd0FRMEFJQUFvQWdBZ0Eyb2dCRUVJY2pvQUFDQUFLQUlBSUFOcUlnUWdCU0FIYWtFRmFqWUFBU0FGQkVBZ0JFRVpPZ0FGSUFCQkdpQURFTndCREFJTElBQkJCeUFERU53QkRBRUxJQUFRcUFJTUJBc2dBQ0FJTmdJWUlBRkZEUUVnQUNBQUtBSUVJZ01nRUdzaUVDQURhaERHQVEwRElBQW9BZ0FnRTJvaUJDQVFhaUFFSUFNZ0Uyc1FuQUVnQUNnQ0FDSUVJQk5xSUFNZ0JHb2dFQkFmR2d3QkN3c2dBRUgzS2tFQUVEb01BUXNnQUVIdU1VRUFFRG9MUVg4aEZRc2dBa0hnQW1va0FDQVZDNDRDQWdaL0FYNGpBRUVRYXlJREpBQUNRQ0FCUXYvLy8vOXZXQVJBSUFBUUpFRi9JUVFNQVF0QmZ5RUVJQUFnQWhBbElnbENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFBSkFJQUFnQTBFTWFpQURRUWhxSUFtblFSTVFqZ0ZCQUVnRVFFS0FnSUNBTUNFQ0lBTW9BZ2doQmlBREtBSU1JUWNNQVF0QkFDRUVRb0NBZ0lBd0lRSWdBeWdDRENFSElBTW9BZ2doQmdOQUlBVWdCa1lOQVNBQUlBSVFEeUFBSUFrZ0J5QUZRUU4wYWlJSUtBSUVJQWxCQUJBVUlnSkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUZRUUZxSVFVZ0FDQUJJQWdvQWdRZ0FrR0FnQUVReHdSQkFFNE5BUXNMUVg4aEJBc2dBQ0FISUFZUVdpQUFJQWtRRHlBQUlBSVFEd3NnQTBFUWFpUUFJQVFMMmdNQ0EzOEVmaU1BUVRCcklnZ2tBQUpBSUFBb0FoQW9BbmdnQ0UwRVFDQURRZ0FnQTBJQVZSc2hEU0FGUVFGcklRa2dCa0tBZ0lDQWNJTWhEaUFGUVFCTUlRcENBQ0VEQTBBZ0F5QU5VUVJBSUFRaERBd0RDMEovSVF3Z0FDQUNJQU1nQ0VFb2FoQ0ZBU0lGUVFCSURRSUNRQ0FGUlEwQUlBNUNnSUNBZ0RCU0JFQWdDQ0FJS1FNb053TUFJQU1oQ3lBSUlBSTNBeEFnQ0NBRFFvQ0FnSUFJV2dSK1FvQ0FnSURBZmlBRHViMGlDMEtBZ0lDQXdJR0EvUDhBZlNBTFF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dVZ0N3czNBd2dnQ0NBQUlBWWdCMEVESUFnUUlTSUxOd01vSUFBZ0NDa0RBQkFQSUFBZ0NDa0RDQkFQSUF0Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQkFzQ1FBSkFBa0FnQ2cwQUlBQWdDQ2tES0NJTEVNb0JJZ1ZCQUVnTkFTQUZSUTBBSUFBZ0NFRWdhaUFMRUR4QkFFZ05BU0FBSUFFZ0N5QUlLUU1nSUFRZ0NVS0FnSUNBTUVLQWdJQ0FNQkN2QmlJRVFnQlREUUVnQUNBTEVBOE1Bd3NnQkVMLy8vLy8vLy8vRDFNTkFTQUFRYkhhQUVFQUVCVWdDQ2tES0NFTEN5QUFJQXNRRHd3RUN5QUFJQUVnQkNBSUtRTW9FR3BCQUVnTkF5QUVRZ0Y4SVFRTElBTkNBWHdoQXd3QUN3QUxJQUFRNlFGQ2Z5RU1DeUFJUVRCcUpBQWdEQXVaQWdFQmZnSkFBa0FDUUNBQlFvQ0FnSUJ3Z3lJRVFvQ0FnSUF3VWdSQUlBUkNnSUNBZ0NCU0RRRWdBRUdwMUFBUVlpRUVEQUlMSUFCQnR2a0FFR0loQkF3QkN5QUFJQUVRSlNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FDQUJFTW9CSWdOQkFFZ0VRQ0FBSUFFUUQwS0FnSUNBNEFBUEN3Si9RWk1CSUFNTkFCcEJuUUVnQUNBQkVEZ05BQnBCa2dFZ0FhY3ZBUVlpQTBFU1MwRUJJQU4wUWZpT0VIRkZjZzBBR2lBQUtBSVFLQUpFSUFOQkdHeHFLQUlFQ3lFQ0lBQWdBVUhYQVNBQlFRQVFGQ0VFSUFBZ0FSQVBJQVJDZ0lDQWdIQ0RJZ0ZDZ0lDQWdKQi9VUTBBSUFGQ2dJQ0FnT0FBVVEwQklBQWdCQkFQSUFBZ0FoQXRJUVFMSUFCQnU1a0JJQVJCbklBQkVMNEJJUUVMSUFFTDBBSUNCbjhCZmlNQVFUQnJJZ0lrQUFKQUFrQWdBeWtEQUNJQlF2Ly8vLzl2V0FSQUlBRkNJSWluUVhWSkRRRWdBYWNpQUNBQUtBSUFRUUZxTmdJQURBRUxRb0NBZ0lEZ0FDRUxJQUFnQVJDMkF5SURRUUJJRFFFZ0EwVUVRQ0FBUWZqaUFFRUFFQlVNQWdzZ0FDQUNRU3hxSUFKQktHb2dBYWNpQmtFREVJNEJEUUVnQWlnQ0xDRUhJQUlvQWlnaENFRUFJUU1DUUFOQUlBTWdDRWNFUUNBSElBTkJBM1JxS0FJRUlRbEJnSUlCSVFVQ1FDQUVSUTBBSUFBZ0FrRUlhaUFHSUFrUVRDSUtRUUJJRFFNZ0NrVU5BQ0FDS0FJSUlRVWdBQ0FDUVFocUVFaEJnSVlCUVlDQ0FTQUZRUUp4R3lFRkN5QUFJQUVnQ1VLQWdJQ0FNRUtBZ0lDQU1FS0FnSUNBTUNBRkVHMUJBRWdOQWlBRFFRRnFJUU1NQVFzTElBQWdCeUFJRUZvZ0JpQUdLQUlBUVFGcU5nSUFEQUVMSUFBZ0J5QUlFRm9NQVFzZ0FTRUxDeUFDUVRCcUpBQWdDd3NRQUVHaW1RRWdBRUVMRVBzQlFRQkhDNGtCQWdOL0FYNUJsWmtCSVFNQ1FBSkFJQUVwQWdRaUJxZEIvLy8vL3dkeElnVWdBa3dOQUNBQlFSQnFJUVFDZnlBR1FvQ0FnSUFJZzFCRkJFQWdCQ0FDUVFGMGFpOEJBQXdCQ3lBQ0lBUnFMUUFBQzBFbFJ3MEFRYjB0SVFNZ0FrRUNhaUFGVGcwQUlBRWdBa0VCYWtFQ0VMZ0VJZ0pCQUU0TkFRc2dBQ0FERUxrRVFYOGhBZ3NnQWd1TEFnSUJmZ0Y4SXdCQkVHc2lBaVFBUW9DQWdJRGdBQ0VFQWtBZ0FDQUJFTjBDSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRUU1BUXNnQUNBQ0lBRVFiZzBBSUFBZ0FrRU1haUFES1FNQUVMb0JEUUFnQWlzREFDSUZ2U0lCUW9DQWdJQ0FnSUQ0L3dDRFFvQ0FnSUNBZ0lENC93QlJCRUFnQUVLQWdJQ0F3SDRnQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d4QTNJUVFNQVFzZ0F6VUNCRUlnaGtLQWdJQ0FNRkVFUUNBQUlBVkJDa0VBUVFRUWp3SWhCQXdCQ3lBQ0tBSU1JZ05CNVFCUEJFQWdBRUdLTkVFQUVGQU1BUXNnQUNBRlFRb2dBMEVCYWtFRkVJOENJUVFMSUFKQkVHb2tBQ0FFQzE4QUl3QkJFR3NpQWlRQUFuNGdBeWtEQUNJQlFpQ0lweUlEQkVCQ2dJQ0FnQkFnQTBFTGFrRVNTUTBCR2d0Q2dJQ0FnT0FBSUFBZ0FrRUlhaUFCRUVJTkFCb2dBaXNEQ0JDOUFxMUNnSUNBZ0JDRUN5RUJJQUpCRUdva0FDQUJDeVlBUW9DQWdJRGdBQ0FBSUFNcEF3QVF6QVVpQUVFQVI2MUNnSUNBZ0JDRUlBQkJBRWdiQ3k4QkFYNENmaUFES0FJRUlnSUVRRUtBZ0lDQUVDSUVJQUpCQzJwQkVra05BUm9MSUFBZ0JDQURJQU1RdkFRTEN5OEJBWDRDZmlBREtBSUVJZ0lFUUVLQWdJQ0FFQ0lFSUFKQkMycEJFa2tOQVJvTElBQWdCQ0FESUFNUXZRUUxDd2tBSUFBZ0FSQytCQXNzQUNBQUlBRVF2Z1FpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1IrSUFCQkEwRUNJQUduR3hBdEJTQUJDd3ZNQWdJQmZ3ZCtJd0JCSUdzaUJDUUFJQUFnQkVFSWFrRUFFRDBhUW9DQWdJRGdBQ0VJUW9DQWdJQXdJUVVDUUFKQUFrQWdBQ0FES1FNQUVDVWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQUNBR1FmQUFJQVpCQUJBVUVOd0ZJZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFRZ0JSQThRUUJJRFFCQ0FDRUJJQVFwQXdBaUIwSUFJQWRDQUZVYklRa2dCMElCZlNFSElBS3NJUW9EUUNBQklBbFJEUUlnQUNBQUlBVWdBUkJ6RURjaUMwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBUkJDR29nQ3hCL0dpQUJJQWRaSVFJZ0FVSUJmQ0VCSUFFZ0Nsa2dBbklOQUNBRVFRaHFJQU1nQWFkQkEzUnFLUU1BRUljQlJRMEFDd3NnQUNBR0VBOGdBQ0FGRUE4Z0JDZ0NDQ2dDRUNJQVFSQnFJQVFvQWd3Z0FDZ0NCQkVBQUF3QkN5QUFJQVlRRHlBQUlBVVFEeUFFUVFocUVEWWhDQXNnQkVFZ2FpUUFJQWdMZ3dJQ0EzOEJmQ01BUVNCcklnUWtBQUorQWtBZ0FDQUVJQUlRUFEwQUlBSkJBQ0FDUVFCS0d5RUdBa0FEUUNBRklBWkhCRUFDUUNBRElBVkJBM1JxS1FNQUlnRkMvLy8vL3c5WUJFQWdBYWNpQWtILy84TUFUUTBCREFRTElBQWdCRUVZYWlBQkVFSU5CQ0FFS3dNWUlnZEVBQUFBQUFBQUFBQmpJQWRFQUFBQUFQLy9NRUZrY2cwRElBY0NmeUFIbVVRQUFBQUFBQURnUVdNRVFDQUhxZ3dCQzBHQWdJQ0FlQXNpQXJkaURRTUxJQVZCQVdvaEJTQUVJQUlRdVFGRkRRRU1Bd3NMSUFRUU5nd0NDeUFBUVpVclFRQVFVQXNnQkNnQ0FDZ0NFQ0lBUVJCcUlBUW9BZ1FnQUNnQ0JCRUFBRUtBZ0lDQTRBQUxJUUVnQkVFZ2FpUUFJQUVMbkFFQkFuOGpBRUVnYXlJRUpBQWdBQ0FFUVFocUlBSVFQUm9nQWtFQUlBSkJBRW9iSVFJQ2ZnTkFJQUlnQlVjRVFBSkFJQUFnQkVFRWFpQURJQVZCQTNScUtRTUFFSGRGQkVBZ0JFRUlhaUFFTHdFRUVJc0JSUTBCQ3lBRUtBSUlLQUlRSWdCQkVHb2dCQ2dDRENBQUtBSUVFUUFBUW9DQWdJRGdBQXdEQ3lBRlFRRnFJUVVNQVFzTElBUkJDR29RTmdzaEFTQUVRU0JxSkFBZ0FRdWJBd0lEZndKK0l3QkJJR3NpQWlRQVFvQ0FnSURnQUNFSUFrQWdBQ0FCRUZraUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdBa0VJYWlJRlFRY1FQUm9nQlVFOEVEc2FJQVVnQkVFRGRDSUZRWURyQVdvb0FnQWlCaENJQVJwQm5qMGdCSFpCQVhGRkJFQWdBa0VJYWlJRVFTQVFPeG9nQkNBRlFZVHJBV29vQWdBUWlBRWFJQVJCcnBrQkVJZ0JHaUFBSUFNcEF3QVFXU0lKUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBQkVBOGdBaWdDQ0NnQ0VDSUFRUkJxSUFJb0Fnd2dBQ2dDQkJFQUFBd0NDeUFKcHlJSFFSQnFJUVZCQUNFRUEwQWdCQ0FIS1FJRUlnaW5RZi8vLy84SGNVOUZCRUFDUUFKL0lBaENnSUNBZ0FpRFVFVUVRQ0FGSUFSQkFYUnFMd0VBREFFTElBUWdCV290QUFBTElnTkJJa1lFUUNBQ1FRaHFRYUNKQVJDSUFSb01BUXNnQWtFSWFpQURFSXNCR2dzZ0JFRUJhaUVFREFFTEN5QUFJQWtRRHlBQ1FRaHFRU0lRT3hvTElBSkJDR29pQUVFK0VEc2FJQUFnQVJCL0dpQUFRYnFRQVJDSUFSb2dBQ0FHRUlnQkdpQUNRUWhxUVQ0UU94b2dBQkEySVFnTElBSkJJR29rQUNBSUM1TUVBZ2gvQVg0akFFRXdheUlGSkFBQ1FDQUFJQUVRV1NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FhY2lCeWdDQkVILy8vLy9CM0VpQWtVTkFBSkFJQUFnQlVFVWFpQUNFRDBOQUVFQUlRSWdCVUVBTmdJUUlBZEJFR29oQ0FOQUFrQWdCeWtDQkNJTnAwSC8vLy8vQjNFaUNTQUNTZ1JBQW44Q1FDQUVSU0FISUFWQkVHb1F5UUVpQ2tHakIwZHlEUUFnQlNnQ0VDSUxRUUZySVFJRFFBSkFJQUpCQUV3RVFFRUFJUVlNQVFzZ0FrRUJheUVEQWtBZ0RVS0FnSUNBQ0lOUVJRUkFJQWdnQTBFQmRHb3ZBUUFpQmtHQStBTnhRWUM0QTBjZ0FrRUNTWElOQVNBSUlBSkJBbXNpQWtFQmRHb3ZBUUFpREVHQTBBQnFRZi8vQTNGQmdBaExEUUVnQmtIL0IzRWdERUgvQjNGQkNuUnlRWUNBQkdvaEJnd0NDeUFESUFocUxRQUFJUVlMSUFNaEFnc2dCaERBQkEwQUN5QUdFTDhFUlEwQUlBVWdDellDTEFKQUEwQWdCU2dDTENBSlRnMEJJQWNnQlVFc2FoREpBU0lDRU1BRURRQUxJQUlRdndRTkFRc2dCVUhDQnpZQ0JFRUJEQUVMSUFWQkJHb2dDaUFFRUxJREN5RURRUUFoQWdOQUlBSWdBMFlOQWlBQ1FRSjBJUVlnQWtFQmFpRUNJQVZCRkdvZ0JpQUZRUVJxYWlnQ0FCQzVBVVVOQUFzTUF3c2dBQ0FCRUE4Z0JVRVVhaEEySVFFTUF3c2dCU2dDRUNFQ0RBQUxBQXNnQUNBQkVBOGdCU2dDRkNnQ0VDSUFRUkJxSUFVb0FoZ2dBQ2dDQkJFQUFFS0FnSUNBNEFBaEFRc2dCVUV3YWlRQUlBRUxkQUVCZmtLQWdJQ0E0QUFoQkNBQUlBRVFXU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlNCSDRnQUNBREtRTUFFQ2dpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFBZ0FSQVBRb0NBZ0lEZ0FBOExJQUduSUFTbkVJTUNJUUlnQUNBQkVBOGdBQ0FFRUE4Z0FxMEZRb0NBZ0lEZ0FBc0xDUUFnQUNBQkVQWUVDeElBSUFCQnNqUkJBQkFWUW9DQWdJRGdBQXRxQUFKQUFrQWdBVUlnaUtjaUFrRi9Sd1JBSUFKQmVVY05BUXdDQ3lBQnB5SUNMd0VHUVFWSERRQWdBaWtESUNJQlFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFBTUFRc2dBRUdpMndCQkFCQVZRb0NBZ0lEZ0FBOExJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FDQUJDNFFDQWdKL0FuNGdBQ0FCRUZraUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBRVBDeUFCcHlJR0tRSUVJZ2VuUWYvLy8vOEhjU0VDQWtBZ0JFRUJjVVVOQUNBR1FSQnFJUU1nQjBLQWdJQ0FDSU1oQ0FOQUlBSWdCVVlFUUNBQ0lRVU1BZ3NDZnlBSVVFVUVRQ0FESUFWQkFYUnFMd0VBREFFTElBTWdCV290QUFBTEVJY0RSUTBCSUFWQkFXb2hCUXdBQ3dBTEFrQWdCRUVDY1VVRVFDQUNJUU1NQVFzZ0JrRVFhaUVFSUFkQ2dJQ0FnQWlESVFjRFFDQUNJZ01nQlV3TkFTQURRUUZySVFJQ2Z5QUhVRVVFUUNBRUlBSkJBWFJxTHdFQURBRUxJQUlnQkdvdEFBQUxFSWNERFFBTEN5QUFJQVlnQlNBREVJUUJJUWNnQUNBQkVBOGdCd3ZxQXdJR2Z3TitJd0JCSUdzaUJTUUFRb0NBZ0lEZ0FDRU1Ba0FnQUNBQkVGa2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFBa0FDUUNBQUlBVkJCR29nQXlrREFCQzZBUTBBSUFVb0FnUWlCeUFCcHlJSktBSUVRZi8vLy84SGNTSUlUQTBCUVNBaENrS0FnSUNBTUNFTEFrQWdBa0VDU0EwQUlBTXBBd2dpRFVLQWdJQ0FjSU5DZ0lDQWdEQlJEUUFnQUNBTkVDZ2lDMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMEJBa0FDUUNBTHB5SUdLUUlFSWcyblFmLy8vLzhIY1E0Q0FBRUNDeUFBSUFzUUR3d0RDd0ovSUExQ2dJQ0FnQWlEVUVVRVFDQUdMd0VRREFFTElBWXRBQkFMSVFwQkFDRUdDeUFIUVlDQWdJQUVUZ1JBSUFCQndOb0FRUUFRUmd3QkN5QUFJQVZCQ0dvZ0J4QTlSUVJBQWtBZ0JBUkFJQVZCQ0dvZ0NVRUFJQWdRVVEwQkN5QUhJQWhySVFNQ1FDQUdCRUFEUUNBRFFRQk1EUUlnQXlBRElBWW9BZ1JCLy8vLy93ZHhJZ0lnQWlBRFNoc2lBbXNoQXlBRlFRaHFJQVpCQUNBQ0VGRkZEUUFNQXdzQUN5QUZRUWhxSUFvZ0F4REJCQTBCQ3lBRVJRUkFJQVZCQ0dvZ0NVRUFJQWdRVVEwQkN5QUFJQXNRRHlBQUlBRVFEeUFGUVFocUVEWWhEQXdFQ3lBRktBSUlLQUlRSWdKQkVHb2dCU2dDRENBQ0tBSUVFUUFBQ3lBQUlBc1FEd3NnQUNBQkVBOE1BUXNnQVNFTUN5QUZRU0JxSkFBZ0RBdUJCZ0lGZmdWL0l3QkIwQUJySWdJa0FBSkFBa0FDUUFKQUlBRkNnSUNBZ0JDRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQVFaVXdRUUFRRlF3QkN5QURLUU1JSVFrZ0F5a0RBQ0lGUW9DQWdJQVFoRUtBZ0lDQWNJTkNnSUNBZ0RCUkRRSWdCRVVOQVNBQUlBVVF4QVJCQUU0TkFRdENnSUNBZ09BQUlRWU1BZ3NnQUNBRlFkUUJJQVZCQUJBVUlnZENnSUNBZ0hDRElnWkNnSUNBZ0NCUklBWkNnSUNBZ0RCUmNnMEFJQVpDZ0lDQWdPQUFVUTBCSUFJZ0NUY0RLQ0FDSUFFM0F5QWdBQ0FISUFWQkFpQUNRU0JxRUM4aEJnd0JDeUFBSUFKQkNHcEJBQkE5R2tLQWdJQ0E0QUFoQmtLQWdJQ0FNQ0VJQWtBZ0FDQUJFQ2dpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBUW9DQWdJQXdJUVVNQVFzZ0FDQUZFQ2dpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0NSQTRJZzVGQkVBZ0FDQUpFQ2dpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCQ3lBSHB5RUxJQVduSWcwcEFnUWhBUU5BQWtBQ1FDQUJRdi8vLy84SGcxQUVRRUVBSVFNZ0RFVU5BU0FLSUFzb0FnUkIvLy8vL3dkeFR3MENJQXBCQVdvaEF3d0JDeUFMSUEwZ0NoRENCQ0lEUVFCT0RRQWdEQTBCSUFJb0FnZ29BaEFpQTBFUWFpQUNLQUlNSUFNb0FnUVJBQUFnQUNBRkVBOGdBQ0FJRUE4Z0J5RUdEQVFMSUFJZ0JUY0RJQUorSUE0RVFDQUNJQWMzQXpBZ0FpQURyVGNES0NBQUlBQWdDVUtBZ0lDQU1FRURJQUpCSUdvUUlSQTNEQUVMSUFJZ0NEY0RTQ0FDUW9DQWdJQXdOd05BSUFKQ2dJQ0FnREEzQXpnZ0FpQUhOd01vSUFJZ0E2MDNBekFnQUNBQ1FTQnFFTzBFQ3lJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJZ0FrRUlhaUlNSUFzZ0NpQURFRkVhSUF3Z0FSQi9HaUFOS1FJRUlnR25RZi8vLy84SGNTQURhaUVLUVFFaERDQUVEUUVMQ3lBQ1FRaHFJZ01nQ3lBS0lBc29BZ1JCLy8vLy93ZHhFRkVhSUFBZ0JSQVBJQUFnQ0JBUElBQWdCeEFQSUFNUU5pRUdEQUVMSUFJb0FnZ29BaEFpQTBFUWFpQUNLQUlNSUFNb0FnUVJBQUFnQUNBRkVBOGdBQ0FJRUE4Z0FDQUhFQThMSUFKQjBBQnFKQUFnQmd1NEFnSURmd04rSXdCQklHc2lBaVFBUW9DQWdJRGdBQ0VIQWtBQ1FBSkFJQUFnQVJCWklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQUlnQXlrREFCRGlBdzBBSUFJcEF3QWlDRUtBZ0lDQUNGb0VRQ0FBUWVJcVFRQVFVQXdCQ3lBQnB5SUVLUUlFSWdtbklnWkIvLy8vL3dkeElnVkZEUUVnQ0tjaUEwRUJSZzBCSUFsQy8vLy8vd2VESUFoK1FvQ0FnSUFFV2dSQUlBQkJ3Tm9BUVFBUVJnd0JDeUFBSUFKQkNHb2dBeUFGYkNBR1FSOTJFSW9ERFFBQ1FDQUZRUUZIQkVBRFFDQURRUUJNRFFJZ0FrRUlhaUFFUVFBZ0JSQlJHaUFEUVFGcklRTU1BQXNBQ3lBQ1FRaHFBbjhnQkMwQUIwR0FBWEVFUUNBRUx3RVFEQUVMSUFRdEFCQUxJQU1Rd1FRYUN5QUFJQUVRRHlBQ1FRaHFFRFloQnd3Q0N5QUFJQUVRRHd3QkN5QUJJUWNMSUFKQklHb2tBQ0FIQzhFQkFnSi9BbjRqQUVFUWF5SUVKQUJDZ0lDQWdPQUFJUVlDUUNBQUlBRVFXU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQVNFR0RBRUxBa0FnQUNBRVFReHFJQU1wQXdBZ0FhY2lCU2dDQkVILy8vLy9CM0VpQWlBQ0VGY05BQ0FFSUFJMkFnZ2dBeWtEQ0NJSFFvQ0FnSUJ3ZzBLQWdJQ0FNRklFUUNBQUlBUkJDR29nQnlBQ0lBSVFWdzBCSUFRb0FnZ2hBZ3NnQUNBRklBUW9BZ3dpQXlBQ0lBTWdBaUFEU2hzUWhBRWhCZ3NnQUNBQkVBOExJQVJCRUdva0FDQUdDOEFCQWdOL0FuNGpBRUVRYXlJQ0pBQkNnSUNBZ09BQUlRY0NRQ0FBSUFFUVdTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBU0VIREFFTEFrQWdBQ0FDUVF4cUlBTXBBd0FnQWFjaUJpZ0NCRUgvLy8vL0IzRWlCQ0FFRUZjTkFDQUNJQVFnQWlnQ0RDSUZheUlFTmdJSUlBQWdCaUFGSUFNcEF3Z2lDRUtBZ0lDQWNJTkNnSUNBZ0RCU0JIOGdBQ0FDUVFocUlBZ2dCRUVBRUZjTkFTQUNLQUlJQlNBRUN5QUZhaENFQVNFSEN5QUFJQUVRRHdzZ0FrRVFhaVFBSUFjTDB3RUNBbjhDZmlNQVFSQnJJZ0lrQUVLQWdJQ0E0QUFoQmdKQUlBQWdBUkJaSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRWU1BUXNDUUNBQUlBSkJER29nQXlrREFDQUJweUlGS0FJRVFmLy8vLzhIY1VFQUVGY05BQ0FDSUFVb0FnUkIvLy8vL3dkeElnUTJBZ2dnQXlrRENDSUhRb0NBZ0lCd2cwS0FnSUNBTUZJRVFDQUFJQUpCQ0dvZ0J5QUVRUUFRVncwQklBSW9BZ2doQkFzZ0FDQUZJQUlvQWd3aUF5QUVJQU1nQkVnYklBTWdCQ0FESUFSS0d4Q0VBU0VHQ3lBQUlBRVFEd3NnQWtFUWFpUUFJQVlMcUFVQ0MzNENmeU1BUVJCcklnSWtBQUpBSUFGQ2dJQ0FnQkNFUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FBUVpVd1FRQVFGVUtBZ0lDQTRBQWhCd3dCQ3lBREtRTUlJUVlDUUNBREtRTUFJZ1JDZ0lDQWdIQ0RJZ2xDZ0lDQWdCQ0VRb0NBZ0lBd1VRMEFJQUFnQkVIV0FTQUVRUUFRRkNJRlFvQ0FnSUJ3Z3lJSFFvQ0FnSUFnVVNBSFFvQ0FnSUF3VVhJTkFDQUhRb0NBZ0lEZ0FGRU5BU0FDSUFZM0F3Z2dBaUFCTndNQUlBQWdCU0FFUVFJZ0FoQXZJUWNNQVF0Q2dJQ0FnT0FBSVFkQ2dJQ0FnREFoQ0NBQUFuNUNnSUNBZ0RBZ0FDQUJFQ2dpQ2tLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2tLQWdJQ0E0QUFnQUJBK0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFCb0NRQUpBSUFaQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFKQmZ6WUNBQXdCQ3lBQUlBSWdCaEIzUVFCSURRRUxJQXFuSWdNcEFnUWhDeUFBSUFRUUtDSUlRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQUNRQ0FDS0FJQUlnOUZEUUJDQUNFRUFrQWdDVUtBZ0lDQU1GRUVRRUlBSVFVTUFRc2dDS2NpRUNrQ0JFTC8vLy8vQjRNaEJpQUxRdi8vLy84SGd5SUZVRVVFUUNBRklBWjlJQVpRclNJSmZTRU1JQSt0SVExQ0FDRUZBMEFDUUNBRUlBbDhJZzRnREZVTkFDQURJQkFnRHFjUXdnUWlEMEVBU0EwQUlBQWdBeUFFcHlBUEVJUUJJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CU0FBSUFFZ0JTQUVRUUFRMGdGQkFFZ05CU0FHSUErc2ZDRUVJQVZDQVh3aUJTQU5VZzBCREFRTEN5QUZRdi8vLy84UGd5RUZEQUVMUWdBaEJTQUdVQTBCQ3lBQUlBTWdCS2NnQzZkQi8vLy8vd2R4RUlRQklnUkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQUVnQlNBRVFRQVEwZ0ZCQUVnTkFRc2dBQ0FLRUE4Z0FDQUlFQThnQVNFSERBSUxJQUVMRUE4Z0FDQUtFQThnQUNBSUVBOExJQUpCRUdva0FDQUhDNkFEQVFSK0l3QkJNR3NpQWlRQUlBSWdBVGNES0FKQUlBRkNnSUNBZ0JDRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQVFaVXdRUUFRRlVLQWdJQ0E0QUFoQmd3QkN3SkFJQU1wQXdBaUJVS0FnSUNBRUlSQ2dJQ0FnSENEUW9DQWdJQXdVUTBBUW9DQWdJRGdBQ0VHSUFBZ0JTQUVJQVZCQUJBVUlnZENnSUNBZ0hDRElnaENnSUNBZ09BQVVRMEJBa0FnQkVIVEFVY05BQ0FBSUFVUXhBUkJBRTROQUNBQUlBY1FEd3dDQ3lBSVFvQ0FnSUFRaEVLQWdJQ0FNRkVOQUNBQUlBY2dCVUVCSUFKQktHb1FMeUVHREFFTElBSWdBQ0FCRUNnaUJ6Y0RDRUtBZ0lDQTRBQWhCaUFIUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQWlBRk53TVFBa0FDUUFKL0lBUkIwd0ZIQkVCQ2dJQ0FnREFoQVVFQkRBRUxJQUJCcDkwQUVHSWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEJJQUlnQVRjREdFRUNDeUVESUFBZ0FDa0RTQ0FESUFKQkVHb1Fwd0VoQlNBQUlBRVFEeUFGUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVMSUFBZ0J4QVBEQUVMSUFBZ0JTQUVRUUVnQWtFSWFoQ3RBaUVHSUFBZ0Fpa0RDQkFQQ3lBQ1FUQnFKQUFnQmd1WUF3SUZmd04rSXdCQkVHc2lCaVFBQWtBZ0FDQUJFRmtpQ2tLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFvaEFRd0JDd0pBSUFBZ0F5a0RBQkRRQXlJRkJFQkNnSUNBZ09BQUlRRkNnSUNBZ0RBaEN5QUZRUUJNRFFFZ0FFSDg5UUJCQUJBVkRBRUxRb0NBZ0lEZ0FDRUJJQUFnQXlrREFCQW9JZ3RDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FMcHlJSEtBSUVJUWdnQmlBS3B5SUpLQUlFUWYvLy8vOEhjU0lGUVFBZ0JFRUNSaHMyQWd3Q1FDQUNRUUpJRFFBZ0F5a0RDQ0lNUW9DQWdJQndnMEtBZ0lDQU1GRU5BQ0FBSUFaQkRHb2dEQ0FGUVFBUVZ3MEJDeUFGSUFoQi8vLy8vd2R4SWdWcklRSUNRQUpBQWtBQ1FDQUVEZ0lBQVFJTElBWW9BZ3doQXd3Q0N5QUdLQUlNSWdNZ0Frb2hCRUtBZ0lDQUVDRUJJQU1oQWlBRVJRMEJEQUlMSUFZb0Fnd2dCV3NpQXlFQ0MwS0FnSUNBRUNFQklBTkJBRWdnQWlBRFNISU5BQU5BSUFrZ0J5QURRUUFnQlJDekEwVUVRRUtCZ0lDQUVDRUJEQUlMSUFJZ0EwY2hCQ0FEUVFGcUlRTWdCQTBBQ3dzZ0FDQUtFQThnQUNBTEVBOExJQVpCRUdva0FDQUJDN0FEQXdkL0FYd0JmaU1BUVJCcklnVWtBQUpBSUFBZ0FSQlpJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQUpBQWtBZ0FDQURLUU1BRUNnaURVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBMm5JZ2tvQWdSQi8vLy8vd2R4SVFZZ0FhY2lDaWdDQkVILy8vLy9CM0VoQndKQUlBUUVRQ0FGSUFjZ0Jtc2lDellDREVGL0lRaEJBQ0VFSUFKQkFrZ05BU0FBSUFVZ0F5a0RDQkJDRFFJZ0JTc0RBQ0lNdlVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWZzBCSUF4RUFBQUFBQUFBQUFCbEJFQWdCVUVBTmdJTURBSUxJQXdnQzdkalJRMEJJQVVDZnlBTW1VUUFBQUFBQUFEZ1FXTUVRQ0FNcWd3QkMwR0FnSUNBZUFzMkFnd01BUXNnQlVFQU5nSU1JQUpCQWs0RVFDQUFJQVZCREdvZ0F5a0RDQ0FIUVFBUVZ3MENDeUFISUFacklRUkJBU0VJQzBGL0lRSWdCaUFIU3cwQklBUWdCU2dDRENJRGF5QUliRUVBU0EwQkEwQWdDaUFKSUFOQkFDQUdFTE1EUlFSQUlBTWhBZ3dEQ3lBRElBUkdEUUlnQXlBSWFpRUREQUFMQUFzZ0FDQUJFQThnQUNBTkVBOUNnSUNBZ09BQUlRRU1BUXNnQUNBQkVBOGdBQ0FORUE4Z0FxMGhBUXNnQlVFUWFpUUFJQUVMa3dFQ0FYNEJmeU1BUVJCcklnSWtBRUtBZ0lDQTRBQWhCQUpBSUFBZ0FSQlpJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FCSVFRTUFRc0NRQ0FBSUFKQkRHb2dBeWtEQUJDNkFRMEFRb0NBZ0lBd0lRUWdBaWdDRENJRFFRQklEUUFnQXlBQnB5SUZLQUlFUWYvLy8vOEhjVThOQUNBRklBSkJER29ReVFHdElRUUxJQUFnQVJBUEN5QUNRUkJxSkFBZ0JBdHBBZ0ovQVg0Z0FDQUJFRmtoQVFOQUlBSWdCRXdnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVWEpGQkVBZ0F5QUVRUU4wYWlrREFDSUdRaUNJcDBGMVR3UkFJQWFuSWdVZ0JTZ0NBRUVCYWpZQ0FBc2dCRUVCYWlFRUlBQWdBU0FHRU1RQ0lRRU1BUXNMSUFFTHlBRUNBWDRCZnlNQVFSQnJJZ0lrQUVLQWdJQ0E0QUFoQkFKQUlBQWdBUkJaSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRUU1BUXNDUUNBQUlBSkJER29nQXlrREFCQzZBUTBBQWtBZ0FpZ0NEQ0lEUVFCT0JFQWdBeUFCcHlJRktRSUVJZ1NuUWYvLy8vOEhjVWtOQVFzZ0FFRXZFQzBoQkF3QkN5QUZRUkJxSVFVZ0FBSi9JQVJDZ0lDQWdBaURVRVVFUUNBRklBTkJBWFJxTHdFQURBRUxJQU1nQldvdEFBQUxRZi8vQTNFUW53TWhCQXNnQUNBQkVBOExJQUpCRUdva0FDQUVDN2dCQWdKK0FYOGpBRUVRYXlJQ0pBQkNnSUNBZ09BQUlRUUNRQ0FBSUFFUVdTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBU0VFREFFTEFrQWdBQ0FDUVF4cUlBTXBBd0FRdWdFTkFFS0FnSUNBd0g0aEJDQUNLQUlNSWdOQkFFZ05BQ0FESUFHbklnWXBBZ1FpQmFkQi8vLy8vd2R4VHcwQUlBWkJFR29oQmlBRlFvQ0FnSUFJZzFCRkJFQWdCaUFEUVFGMGFqTUJBQ0VFREFFTElBTWdCbW94QUFBaEJBc2dBQ0FCRUE4TElBSkJFR29rQUNBRUMrTUJBZ0YrQW44akFFRVFheUlDSkFBQ1FDQUFJQUZCTFJCTElnTkZCRUFnQkVFQU5nSUFRb0NBZ0lEZ0FDRUJEQUVMUW9DQWdJQXdJUUVDUUNBREtRTUFJZ1pDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFJQUlnQXlnQ0RDSUZOZ0lNSUFVZ0JxY2lCeWdDQkVILy8vLy9CM0ZKRFFFZ0FDQUdFQThnQTBLQWdJQ0FNRGNEQUFzZ0JFRUJOZ0lBREFFTElBY2dBa0VNYWhESkFTRUlJQU1nQWlnQ0REWUNEQ0FFUVFBMkFnQWdDRUgvL3dOTkJFQWdBQ0FJUWYvL0EzRVFud01oQVF3QkN5QUFJQWNnQlVFQmRHcEJFR3BCQWhEdUF5RUJDeUFDUVJCcUpBQWdBUXMzQUNNQVFSQnJJZ0lrQUNBQUlBSkJER29nQXlrREFCQjNJUUFnQWlnQ0RDRURJQUpCRUdva0FFS0FnSUNBNEFBZ0EyZXRJQUFiQzA0QUl3QkJFR3NpQWlRQVFvQ0FnSURnQUNFQkFrQWdBQ0FDUVF4cUlBTXBBd0FRZHcwQUlBQWdBa0VJYWlBREtRTUlFSGNOQUNBQ0tBSUlJQUlvQWd4c3JTRUJDeUFDUVJCcUpBQWdBUXNHQUNBQXRyc0xmd0FnQUNBQUtRUFFBU0lCUWd5SUlBR0ZJZ0ZDR1lZZ0FZVWlBVUliaUNBQmhTSUJOd1BRQVVLQWdJQ0F3SDRnQVVLZHVyUDdsSkw5b2lWK1FneUlRb0NBZ0lDQWdJRDRQNFMvUkFBQUFBQUFBUEMvb0wwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3VqQkFNRGZBVi9BMzRqQUVFUWF5SUlKQUFnQ0VJQU53TUlBa0FDUUNBQ1FRQk1EUUJDZ0lDQWdPQUFJUUVnQUNBSVFRaHFJQU1wQXdBUVFnMEJRUUVoQ1NBSUt3TUlJUVFnQWtFQlJ3UkFBMEFnQWlBSlJnMENJQUFnQ0NBRElBbEJBM1JxS1FNQUVFSU5BeUFKUVFGcUlRa2dDQ3NEQUNFRkl3QkJJR3NpQnlRQUlBUzlRdi8vLy8vLy8vLy8vd0NESWcwZ0JiMUMvLy8vLy8vLy8vLy9BSU1pRENBTUlBMVdHeUlPdnlFRUFrQWdEa0kwaUtjaUNrSC9EMFlOQUNBTklBd2dEQ0FOVkJzaURMOGhCUUpBSUE1UURRQWdERUkwaUtjaUMwSC9EMFlOQUNBTElBcHJRY0VBVGdSQUlBVWdCS0FoQkF3Q0N3SjhJQXRCL2d0UEJFQWdCRVFBQUFBQUFBQXdGS0loQkNBRlJBQUFBQUFBQURBVW9pRUZSQUFBQUFBQUFMQnJEQUVMUkFBQUFBQUFBUEEvSUFwQnZBUkxEUUFhSUFSRUFBQUFBQUFBc0d1aUlRUWdCVVFBQUFBQUFBQ3dhNkloQlVRQUFBQUFBQUF3RkFzaEJpQUhRUmhxSUFkQkVHb2dCUkNLQmlBSFFRaHFJQWNnQkJDS0JpQUdJQWNyQXdBZ0J5c0RFS0FnQnlzRENLQWdCeXNER0tDZm9pRUVEQUVMSUFVaEJBc2dCMEVnYWlRQURBQUxBQXNnQkpraEJBc2dCTDBpQVFKL0lBU1pSQUFBQUFBQUFPQkJZd1JBSUFTcURBRUxRWUNBZ0lCNEN5SUF0NzFSQkVBZ0FLMGhBUXdCQzBLQWdJQ0F3SDRnQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d5RUJDeUFJUVJCcUpBQWdBUXRPQUNBQUlBQkVBQUFBQUFBQThMOUVBQUFBQUFBQThEOGdBRVFBQUFBQUFBQUFBR01iSUFDOVF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3lBQVJBQUFBQUFBQUFBQVlSc0xRd0FDZkNBQnZVS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVVFSQVJBQUFBQUFBQVBoL0lBQ1pSQUFBQUFBQUFQQS9ZUTBCR2dzZ0FDQUJFSThEQ3d1REFRSUNmZ0YvSUFDOUlnRkNOSWluUWY4UGNTSURRZjRIVFFSQUlBRkNnSUNBZ0lDQWdJQ0FmNE1oQWlBRFFmNEhSeUFCUW9DQWdJQ0FnSUR3djM5UmNrVUVRQ0FDUW9DQWdJQ0FnSUQ0UDRTL0R3c2dBcjhQQ3lBRFFiSUlUUVI4SUFGQ1A0Y2dBWHhDQVVHekNDQURhNjJHSWdGQ0FZaDhRZ0FnQVgyRHZ3VWdBQXNMZ2dVREFud0Zmd0YrSXdCQkVHc2lDU1FBQW41Q2dJQ0FnTUQrLy92L0FFS0FnSUNBd1A3L2V5QUVHeUFDUlEwQUdnSjhJQU1wQXdBaUFVTC8vLy8vRDFnRVFFRUJJQUlnQWtFQlRCc2hDaUFCcHlFSVFRRWhCd05BSUFjZ0NrY0VRQ0FJdHlBRElBZEJBM1JxS1FNQUlnRkNnSUNBZ0JCYURRTWFJQWdnQWFjaUN5QUlJQXRLR3lBSUlBc2dDQ0FMU0JzZ0JCc2hDQ0FIUVFGcUlRY01BUXNMSUFpdERBSUxRb0NBZ0lEZ0FDQUFJQWxCQ0dvZ0FSQkNEUUVhUVFFaEJ5QUpLd01JQ3lFRklBY2dBaUFDSUFkSUd5RUNBMEFnQWlBSFJ3UkFRb0NBZ0lEZ0FDQUFJQWtnQXlBSFFRTjBhaWtEQUJCQ0RRSWFBa0FnQmIwaURFTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmcwQUlBa3JBd0FpQnIwaUFVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmdSQUlBWWhCUXdCQ3lBRlJBQUFBQUFBQUFBQVlTQUdSQUFBQUFBQUFBQUFZWEVoQ2lBRUJFQWdDZ1JBSUFFZ0RJTy9JUVVNQWdzZ0JTQUZJQWFsSUFhOVF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3lBR0lBVzlRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCWUd5RUZEQUVMSUFvRVFDQUJJQXlFdnlFRkRBRUxJQVVnQlNBR3BDQUd2VUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2dCaUFGdlVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFXQnNoQlFzZ0IwRUJhaUVIREFFTEN5QUZ2U0lCQW44Z0JabEVBQUFBQUFBQTRFRmpCRUFnQmFvTUFRdEJnSUNBZ0hnTElnQzN2VkVFUUNBQXJRd0JDMEtBZ0lDQXdINGdBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzaEFTQUpRUkJxSkFBZ0FRc3RBRUtBZ0lDQTRBQWdBQ0FES1FNQUlBTXBBd2hCQUJDTEFpSUFRUUJIclVLQWdJQ0FFSVFnQUVFQVNCc0xvQUVCQTM0Z0F5a0RBQ0lGSVFRZ0FrRUVUZ1JBSUFNcEF4Z2hCQXNnQlVMLy8vLy9iMWdFUUNBQUVDUkNnSUNBZ09BQUR3c2dBeWtERUNFQlFvQ0FnSURnQUNFR0FrQWdBQ0FES1FNSUVERWlBa1VOQUNBQlFpQ0lwMEYxVHdSQUlBR25JZ01nQXlnQ0FFRUJhallDQUFzZ0FDQUZJQUlnQVNBRVFRQVFoZ1FoQXlBQUlBSVFFeUFEUVFCSURRQWdBMEVBUjYxQ2dJQ0FnQkNFSVFZTElBWUxqd0VBQWtBQ1FDQURLUU1BSWdGQy8vLy8vMjlZQkVBZ0JBUkFJQUFRSkF3REN5QUJRaUNJcDBGMVNRMEJJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FDQUJEd3NnQUNBQkVMWURJZ0pCQUVnTkFTQUVCRUFnQWtFQVI2MUNnSUNBZ0JDRUR3c2dBa1VFUUNBQVFmamlBRUVBRUJVTUFnc2dBYWNpQUNBQUtBSUFRUUZxTmdJQUN5QUJEd3RDZ0lDQWdPQUFDeW9BSUFNcEF3QWlBVUwvLy8vL2IxZ0VRQ0FBRUNSQ2dJQ0FnT0FBRHdzZ0FDQUJRUU5CQUJDcUFndFBBQUpBQWtBZ0F5a0RBQ0lCUXYvLy8vOXZXQVJBSUFSRkJFQkNnSUNBZ0JBUEN5QUFFQ1FNQVFzZ0FDQUJFSmtCSWdCQkFFNE5BUXRDZ0lDQWdPQUFEd3NnQUVFQVI2MUNnSUNBZ0JDRUMyTUJBWDRnQXlrREFDSUVRdi8vLy85dldBUkFJQUFRSkVLQWdJQ0E0QUFQQzBLQWdJQ0E0QUFoQVFKQUlBQWdBeWtEQ0JBeElnSkZEUUFnQUNBRUlBSVFjU0VESUFBZ0FoQVRJQU5CQUVnTkFDQURRUUJIclVLQWdJQ0FFSVFoQVFzZ0FRczJBQ0FES1FNQUlnRkNJSWluSWdKQmYwWWdCRVVnQWtGK2NVRUNSM0Z5UlFSQUlBQVFKRUtBZ0lDQTRBQVBDeUFBSUFFUTZBRUxZd0VDZmdKQUFrQWdBeWtEQUNJQlF2Ly8vLzl2V0FSQUlBQVFKQXdCQ3lBREtRTUlJUVVnQVNFRUlBSkJBMDRFUUNBREtRTVFJUVFMSUFBZ0JSQXhJZ0lOQVF0Q2dJQ0FnT0FBRHdzZ0FDQUJJQUlnQkVFQUVCUWhBU0FBSUFJUUV5QUJDMllCQVg0Z0F5a0RBQ0lFUXYvLy8vOXZXQVJBSUFBUUpFS0FnSUNBNEFBUEMwS0FnSUNBNEFBaEFRSkFJQUFnQXlrRENCQXhJZ0pGRFFBZ0FDQUVJQUpCQUJEVkFTRURJQUFnQWhBVElBTkJBRWdOQUNBRFFRQkhyVUtBZ0lDQUVJUWhBUXNnQVF1TEFRRUNmaUFES1FNQUlnRkMvLy8vLzI5WUJFQWdBQkFrUW9DQWdJRGdBQThMSUFNcEF4QWhCa0tBZ0lDQTRBQWhCUUpBSUFBZ0F5a0RDQkF4SWdKRkRRQWdBQ0FCSUFJZ0JpQUVSVUVPZEJESEJDRURJQUFnQWhBVElBTkJBRWdOQUNBRUJFQWdBMEVBUjYxQ2dJQ0FnQkNFRHdzZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBSUFFaEJRc2dCUXVhQVFJQmZ3SitJd0JCRUdzaUJDUUFJQU1wQXdnaEJTQURLUU1BSWdZaEFRSkFBa0FDUUFKQUlBSkJBMGdOQUNBREtRTVFJZ0ZDZ0lDQWdIQmFCRUFnQWFjdEFBVkJFSEVOQVFzZ0FFR2lQa0VBRUJVTUFRc2dBQ0FFUVF4cUlBVVFpUVFpQWcwQkMwS0FnSUNBNEFBaEFRd0JDeUFBSUFZZ0FTQUVLQUlNSWdNZ0FoQ1FBeUVCSUFBZ0FpQURFSnNEQ3lBRVFSQnFKQUFnQVFzVkFDQUFJQU1wQXdBZ0F5QURRUWhxUVFJUW5RTUxWZ0lCZmdGL0lBQWdBUkMwQXlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FROExRb0NBZ0lBd0lRSWdBYWNpQXlnQ0JFR0FnSUNBZUVjRVFDQUFJQUFvQWhBZ0F4REJBaEF0SVFJTElBQWdBUkFQSUFJTENRQWdBQ0FCRUxRREMxc0JBWDRqQUVFUWF5SUNKQUFnQWlBQUlBRVF0QU1pQVRjRENBSkFJQUZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FCSVFRTUFRc2dBRUtBZ0lDQU1FRUJJQUpCQ0dvUWx3WWhCQ0FBSUFFUUR3c2dBa0VRYWlRQUlBUUxmZ0VCZmlBREtRTUFJZ0ZDZ0lDQWdIQ0RRb0NBZ0lDQWYxSUVRQ0FBUWZiU0FFRUFFQlZDZ0lDQWdPQUFEd3RDZ0lDQWdEQWhCQ0FCcHlJQUtRSUVRb0NBZ0lDQWdJQ0FRSU5DZ0lDQWdJQ0FnSUNBZjFFRWZpQUFJQUFvQWdCQkFXbzJBZ0FnQVVMLy8vLy9ENE5DZ0lDQWdKQi9oQVZDZ0lDQWdEQUxDendCQVg1Q2dJQ0FnT0FBSVFFZ0FDQURLUU1BRUNnaUJFS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSK0lBQWdCS2RCQWhDQUJBVkNnSUNBZ09BQUN3dUJCQUlCZmdGL0FrQUNRQUpBQWtBQ1FDQUJRb0NBZ0lCd1dnUkFJQUduSWdJdkFRWkJMMFlOQVFzZ0JFRUJOZ0lBREFFTElBSW9BaUFoQWlBRVFRRTJBZ0FnQWcwQkN5QUFRYlkvUVFBUUZRd0JDd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBaWdDQUNJSFFRRnJEZ1FDQWdjQkFBc2dCVVVOQWlBQUtBSVFJQUlRdFFNTFFvQ0FnSUF3SVFFZ0JVRUJhdzRDQXdRSEN5QURLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lBeUFES0FJQVFRRnFOZ0lBQ3dKQUlBVkJBa2NOQUVFQklRTWdCMEVCUncwQUlBQWdBUkNLQVF3Q0N5QUNLQUpFSWdNZ0JhMDNBd0FnQTBFSWF5QUJOd01BSUFJZ0EwRUlhallDUkF0QkFDRURDeUFDUVFNMkFnQWdBaUFETmdJVUlBQWdBa0VJYWhDMEFpRUJJQUpCQVRZQ0FDQUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQ2dDRUNBQ0VMVURJQUVQQ3lBQ0tBSkVRUWhySWdNcEF3QWhCaUFEUW9DQWdJQXdOd01BSUFGQy8vLy8vdzlZQkVBZ0FVSUNVUVJBSUFKQkFqWUNBQ0FFUVFJMkFnQWdCZzhMSUFSQkFEWUNBQ0FHRHdzZ0FDQUJFQThnQUNnQ0VDQUNFTFVESUFZUEN5QURLUU1BSWdGQ0lJaW5RWFZKRFFNZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBSUFFUEN5QURLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQUlBRVFpZ0VNQVFzZ0FFR1VQMEVBRUJVTFFvQ0FnSURnQUNFQkN5QUJDKzhCQVFOK0l3QkJFR3NpQWlRQVFvQ0FnSURnQUNFRUFrQWdBQ0FBSUFFUUpTSUJRUUVRa0FJaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBVkNJSWluSWdOQkFDQURRUXRxUVJKSkcwVUVRQ0FBSUFKQkNHb2dCUkJDUVFCSURRRkNnSUNBZ0NBaEJDQUNLUU1JUW9DQWdJQ0FnSUQ0L3dDRFFvQ0FnSUNBZ0lENC93QlJEUUVMUW9DQWdJRGdBQ0VFSUFBZ0FVRy8zQUFRc2dFaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdCaEE0UlFSQUlBQkI3UEVBUVFBUUZTQUFJQVlRRHd3QkN5QUFJQVlnQVVFQVFRQVFMeUVFQ3lBQUlBRVFEeUFBSUFVUUR5QUNRUkJxSkFBZ0JBdU5BZ0lCZkFGK0l3QkJFR3NpQWlRQVFvQ0FnSURnQUNFRkFrQWdBQ0FDUVFocUlBRVFtd0lOQUNBQUlBSkJDR29nQXlrREFCQkNEUUFnQWdKK0lBSXJBd2dpQkwwaUJVS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVWdSQUlBU2RJZ1JFQUFBQUFBQ3duVUNnSUFRZ0JFUUFBQUFBQUFCWlFHTWJJQVFnQkVRQUFBQUFBQUFBQUdZYklnUzlJUVVMQW44Z0JKbEVBQUFBQUFBQTRFRmpCRUFnQktvTUFRdEJnSUNBZ0hnTElnTzN2U0FGVVFSQUlBT3REQUVMUW9DQWdJREFmaUFGUW9DQWdJREFnWUQ4L3dCOUlBVkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN6Y0RBQ0FBSUFGQkFTQUNRUkVReUFRaEJRc2dBa0VRYWlRQUlBVUxpUUVDQVg0QmZDTUFRUkJySWdJa0FFS0FnSUNBNEFBaEJBSkFJQUFnQWtFSWFpQUJFSnNDRFFBZ0FDQUNRUWhxSUFNcEF3QVFRZzBBSUFBZ0FTQUNLd01JSWdXZFJBQUFBQUFBQUFBQW9FUUFBQUFBQUFENGZ5QUZSQUFBM01JSXNqNURaUnRFQUFBQUFBQUErSDhnQlVRQUFOekNDTEkrdzJZYkVNa0VJUVFMSUFKQkVHb2tBQ0FFQzljQkFRRjhJd0JCMEFCcklnSWtBQUorUW9DQWdJRGdBQ0FBSUFFZ0FpQUVRUTl4UVFBUXR3TWlBRUVBU0EwQUdrS0FnSUNBd0g0Z0FFVU5BQm9nQkVHQUFuRUVRQ0FDSUFJckF3QkVBQUFBQUFDd25jQ2dPUU1BQ3lBQ0lBUkJCSFpCRDNGQkEzUnFLd01BSWdXOUlnRUNmeUFGbVVRQUFBQUFBQURnUVdNRVFDQUZxZ3dCQzBHQWdJQ0FlQXNpQkxlOVVRUkFJQVN0REFFTFFvQ0FnSURBZmlBQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeUVCSUFKQjBBQnFKQUFnQVF1RkFRRUJmQ01BUVJCcklnSWtBQUorUW9DQWdJRGdBQ0FBSUFKQkNHb2dBUkNiQWcwQUdrS0FnSUNBd0g0Z0Fpc0RDQ0lFdlVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWZzBBR2dKK0lBU2RJZ1NaUkFBQUFBQUFBT0JEWXdSQUlBU3dEQUVMUW9DQWdJQ0FnSUNBZ0g4TEVMZ0RyUXNoQVNBQ1FSQnFKQUFnQVF1R0FRRUJmZ0pBSUFGQy8vLy8vMjlZQkVBZ0FCQWtEQUVMQWtBZ0F5a0RBQ0lFUW9DQWdJQndnMEtBZ0lDQWtIOVNEUUFnQUNBRUVERWlBa1VOQVNBQUlBSVFFMEVSSVFNQ1FBSkFBa0FnQWtIR0FHc09CZ0lEQVFNREFnQUxJQUpCRmtjTkFndEJFQ0VEQ3lBQUlBRWdBeENRQWc4TElBQkJ0aXRCQUJBVkMwS0FnSUNBNEFBTGxnRUJBWHdqQUVFUWF5SUNKQUFDZmtLQWdJQ0E0QUFnQUNBQ1FRaHFJQUVRbXdJTkFCb2dBaXNEQ0NJRXZTSUJBbjhnQkpsRUFBQUFBQUFBNEVGakJFQWdCS29NQVF0QmdJQ0FnSGdMSWdDM3ZWRUVRQ0FBclF3QkMwS0FnSUNBd0g0Z0FVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NoQVNBQ1FSQnFKQUFnQVF2c0FnSURmd0Y4SXdCQjBBQnJJZ1FrQUNBRVFSQnFRUUJCT0JBckdpQUVRb0NBZ0lDQWdJRDRQemNESUVLQWdJQ0F3SDRoQVFKQUlBSkZEUUJCQnlBQ0lBSkJCMDRiSWdKQkFDQUNRUUJLR3lFQ0EwQWdBaUFGUndSQUlBQWdCRUVJYWlBRElBVkJBM1FpQm1vcEF3QVFRZ1JBUW9DQWdJRGdBQ0VCREFNTElBUXJBd2dpQjcxQ2dJQ0FnSUNBZ1BqL0FJTkNnSUNBZ0lDQWdQai9BRkVOQWlBRVFSQnFJQVpxSUFlZE9RTUFBa0FnQlEwQUlBUXJBeEFpQjBRQUFBQUFBQUFBQUdaRklBZEVBQUFBQUFBQVdVQmpSWElOQUNBRUlBZEVBQUFBQUFDd25VQ2dPUU1RQ3lBRlFRRnFJUVVNQVFzTElBUkJFR3BCQUJEZ0FpSUh2U0lCQW44Z0I1bEVBQUFBQUFBQTRFRmpCRUFnQjZvTUFRdEJnSUNBZ0hnTElnVzN2VkVFUUNBRnJTRUJEQUVMUW9DQWdJREFmaUFCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYklRRUxJQVJCMEFCcUpBQWdBUXRXQUJEUUJDSUJRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUJRdi8vLy84UGd3OExRb0NBZ0lEQWZpQUJ1YjBpQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c0lBRUtBZ0lDQU1BdXFIUUlHZndSK0l3QkIwQUJySWdZa0FBSkFBa0FnQUVFUWFpSURRWWdDSUFBb0FnQVJBd0FpQVVVTkFDQUJRUVZxUVFCQmd3SVFLeG9nQVVFRk9nQUVJQUZCQVRZQ0FDQUFLQUpRSWdRZ0FVRUlhaUlGTmdJRUlBRWdBRUhRQUdvMkFnd2dBU0FFTmdJSUlBQWdCVFlDVUNBQklBTWdBQ2dDUUVFRGRDQUFLQUlBRVFNQUlnUTJBaWdnQkVVRVFDQURJQUVnQUNnQ0JCRUFBQXdCQ3lBQklBQTJBaEFnQUNnQ1NDSURJQUZCRkdvaUJUWUNCQ0FCSUFCQnlBQnFOZ0lZSUFFZ0F6WUNGQ0FBSUFVMkFrZ2dBVUx4Z0lDQWdEazNBdHdCSUFFZ0FFSFlBV28yQXRnQklBQW9Ba0FpQUVFQUlBQkJBRW9iSVFBRFFDQUFJQUpHUlFSQUlBUWdBa0VEZEdwQ2dJQ0FnQ0EzQXdBZ0FrRUJhaUVDREFFTEN5QUJRb0NBZ0lBZ053TlFJQUZDZ0lDQWdDQTNBMGdnQVVLQWdJQ0FJRGNEUUNBQklBRkI5QUZxSWdBMkF2Z0JJQUVnQURZQzlBRWdBVUtBZ0lDQUlCQkhJUWNnQVNnQ0tDQUhOd01JUVFBaEFpQUJJQUZCRVVITW5nRkJBRUVBUVFBZ0J4RHhBU0lITndNd0lBZENJSWluUVhWUEJFQWdCNmNpQUNBQUtBSUFRUUZxTmdJQUN5QUJLQUlvSUFjM0EyZ2dBUkEwSVFjZ0FTZ0NLQ0FITndNWUlBRWdCMEdRMVFGQkF4QWlBMEFnQVNnQ0tDRUFJQUpCQ0VaRkJFQWdBa0VDZEVHUXBnRnFLQUlBSVFNZ0FTQUJJQUFwQXhnUVJ5SUhRVFlnQVNBREVNb0VRUU1RR1JvZ0FTQUhRVE1nQVVFdkVDMUJBeEFaR2lBQklBSkJBM1JxSUFjM0ExZ2dBa0VCYWlFQ0RBRUxDeUFCSUFBcEF3aEJBaEJKSVFjZ0FTZ0NLQ0FITndNUVFRQWhBaUFCSUFFZ0I2ZEJBQ0FIUXYvLy8vOXZWaHRCQVJERkJEWUNKQ0FCSUFGQkpHcEJBRUV3UVFvUXd3UWFJQUVnQVVFU1FRQkJBQkRlQWpjRHNBRWdBVUVUUVFCQkFCRGVBaUVISUFFZ0FTa0RNRUhQQUVLQWdJQ0FNQ0FISUFFcEE3QUJRWUV5RUcwYUlBRWdBU2tETUVITkFFS0FnSUNBTUNBSElBRXBBN0FCUVlFeUVHMGFJQUVnQnhBUElBRWdBU0FISUFFZ0FVR3dBV3BCQVJDeEJoQVBJQUVnQVJBME53UEFBU0FCSUFGQ2dJQ0FnQ0FRUnpjRHlBRWdBU0FCUWM0eFFSUkJBU0FCS0FJb0tRTUlFTDhCUWNEVkFVRVdFQ0lnQVNBQktBSW9LUU1JUWFEWUFVRUxFQ0lnQVNBQktRTXdRZERaQVVFSEVDSWdBU0FCUVJWQjM4d0FRUUZCQlVFQUVJSUJJZ2MzQXpnZ0IwSWdpS2RCZFU4RVFDQUhweUlBSUFBb0FnQkJBV28yQWdBTElBRWdCMEhmekFBZ0FTa0RNQkRlQVNBQklBRkJGa0c4d0FCQkFVRUZRWDhRZ2dFaUIwRzh3QUFnQVNnQ0tDa0RHQkRlQVFOQUlBSkJDRVpGQkVBZ0FTQUJRUllnQWtFQ2RFR1FwZ0ZxS0FJQUlnQkJBa0VCSUFKQkIwWWJRUVVnQWlBSEVQRUJJQUFnQVNBQ1FRTjBhaWtEV0JEZUFTQUNRUUZxSVFJTUFRc0xJQUVnQVJBMElnYzNBNWdCSUFFZ0IwSEEyZ0ZCQVJBaUlBRWdBU2dDS0NrREVFSFEyZ0ZCSUJBaUlBRkIxeDlCRjBFQklBRW9BaWdwQXhBUXZ3RWlCMElnaUtkQmRVOEVRQ0FIcHlJQUlBQW9BZ0JCQVdvMkFnQUxJQUVnQnpjRFFDQUJJQWRCME40QlFRUVFJaUFHUWJDbUFVSEtBQkFmSWdNaEFrSGpBQ0VBSUFGQ2dJQ0FnQ0FRUnlFSEEwQWdBRUgvQVhFRVFDQUJJQWNnQWtLQmdJQ0FFRUVIRU84QkdpQUNFRDhnQW1wQkFXb2lBaTBBQUNFQURBRUxDeUFCSUFFb0FpZ3BBeEJCMndFZ0IwRUJFQmthSUFFZ0FTQUJLQUlvS1FNUUlnZEI2d0FnQjBFQUVCUTNBNmdCSUFFZ0FTa0RtQUVRUnlFSElBRW9BaWdnQnpjRDRBSWdBU0FIUVpEZkFVRUNFQ0lnQVNBQktRUEFBVUd3M3dGQkRoQWlJQUVnQVNnQ0tDa0RDRUVFRUVraEJ5QUJLQUlvSUFjM0F5QWdBU0FIUWdBUTJ3RWdBU0FCS0FJb0tRTWdRZURoQVVFR0VDSWdBU0FCUVlmSUFFRVlRUUVnQVNnQ0tDa0RJQkMvQVVIQTRnRkJEaEFpSUFFZ0FTZ0NLQ2tEQ0VFR0VFa2hCeUFCS0FJb0lBYzNBekFnQVNBSFFvQ0FnSUFRRU5zQklBRWdBU2dDS0NrRE1FR2c1QUZCQWhBaUlBRkI4dEVBUVJsQkFTQUJLQUlvS1FNd0VMOEJHaUFCSUFFb0FpZ3BBd2hCQlJCSklRY2dBU2dDS0NBSE53TW9JQUVnQnlBQlFTOFFMUkRiQVNBQklBRkIwTndBUVJwQkFTQUJLQUlvS1FNb0VMOEJRY0RrQVVFREVDSWdBU0FCS0FJb0tRTW9RZkRrQVVFeEVDSWdBU0FCS1FPWUFSQkhJUWNnQVNnQ0tDQUhOd1BvQWlBQklBZEI4T3NCUVFJUUlpQURFS01FSUFGQ0FTQUROQUlJSUFNcEF3QkN3SVE5Zm53aUJ5QUhRZ0ZZR3pjRDBBRWdBU0FCS1FQQUFVR1E3QUZCQVJBaUlBRWdBU2tEd0FGQjRQRUJRUUVRSWlBQkVEUWhCeUFCS0FJb0lBYzNBemdnQVNBSFFkRHpBVUVGRUNJZ0FTQUJRWVBUQUVFYlFRQWdBU2dDS0NrRE9CQy9BU0lIUWFEMEFVRUNFQ0pCMEFFaEFpQUJJUUFEUUNBQ1FkNEJSa1VFUUNBQUlBY2dBQ2dDRUNBRElBSVFrQUVpQkVFdUVLWURJZ1ZCQVdvZ0JDQUZHeUFBSUFJUVhFRUFFTzhCR2lBQ1FRRnFJUUlNQVFzTElBQWdBQ2tEbUFFUVJ5RUhJQUFvQWlnZ0J6Y0QrQUlnQUNBSFFjRDBBVUVFRUNJZ0FDQUFLUU13RUVjaEJ5QUFLQUlvSUFjM0E0QUJJQUJCRlVISXpBQkJBVUVGUVFFUWdnRWhCeUFBSUFBb0FpZ3BBNEFCUVlEMUFVRUJFQ0lnQUNBQUtBSW9JZ0lwQTRBQklBSXBBL2dDUVFGQkFSQ1dBaUFBSUFjZ0FDZ0NLQ2tEZ0FGQkFFRUJFSllDSUFBZ0J4QVBJQUFnQUVFY1FiblZBRUVCRU40Q0lnYzNBN2dCSUFBcEE4QUJJUWdnQjBJZ2lLZEJkVThFUUNBSHB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFBZ0NFRTZJQWRCQXhBWkdpQUFLUVBBQVNJSFFpQ0lwMEYxVHdSQUlBZW5JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUhRWW9CSUFkQkF4QVpHaUFBRURRaEJ5QUFLQUlvSUFjM0ExQWdBQ0FIUWRETEFVRXZFQ0lnQUNBQVFlWGlBRUVkUVFjZ0FDZ0NLQ2tEVUJDL0FVSEEwZ0ZCQXhBaUlBQkJIallDZ0FJZ0FDQUFLQUlvS1FNb1FaREJBVUVCRUNJZ0FFRWZOZ0w4QVNBQUVEUWhCeUFBS0FJb0lBYzNBNUFCSUFBZ0IwR2d3UUZCRVJBaUlBQkJ0c2tBUVNCQkFpQUFLQUlvS1FPUUFSQy9BU0lIUWlDSXAwRjFUd1JBSUFlbklnSWdBaWdDQUVFQmFqWUNBQXNnQUNBSE53TklJQUFnQjBHd3d3RkJBUkFpSUFBZ0FDa0RtQUVRUnlFSElBQW9BaWdnQnpjRDhBSWdBQ0FIUWNEREFVRUNFQ0lnQUNBQUtRUEFBVUhnd3dGQkFSQWlBa0FnQUNnQ0VDSUNLQUpBUVRGUEJFQWdBaWdDUkNnQ2dBa05BUXNnQWtIWXBBRkJNRUVCRU0wREdpQUNLQUpFSWdKQmtBbHFRU0UyQWdBZ0FrR1VDV3BCNUtRQk5nSUFDeUFBUVNKQjBScEJBa0VDUVFBUWdnRWlCMEtBZ0lDQWNGb0VRQ0FIcHlJQ0lBSXRBQVZCRUhJNkFBVUxJQUFnQjBHZ3hBRkJBUkFpSUFBZ0FDa0R3QUZCMFJvZ0IwRURFTzhCR2tFQUlRSURRQUpBSUFKQkJFWUVRRUVBSVFJRFFDQUNRUUpHRFFJZ0FDQUFLUU9ZQVJCSElRY2dBQ2dDS0NBQ1FRTjBhaUFITndQUUFpQUFJQWNnQWtFQ2RFR1FwUUZxS0FJQUlBSkJuS1VCYWkwQUFCQWlJQUpCQVdvaEFnd0FDd0FMSUFBb0FoQWdBeUFDUWJVQmFoQ1FBU0VFSUFBUU5DRUhJQUpCSm1wQkEzUWlCU0FBS0FJb2FpQUhOd01BSUFBZ0J5QUNRUUowUVlDbEFXb29BZ0FnQWtHWXBRRnFMUUFBRUNJZ0FFRWpJQVJCQUVFRElBSVFnZ0VoQnlBQ1FRRk5CRUFnQUNBSFFmRElBVUVCRUNJTElBQWdCeUFFSUFBb0FpZ2dCV29wQXdBUTNnRWdBa0VCYWlFQ0RBRUxDeUFBRURRaEJ5QUFLQUlvSUFjM0E1Z0JJQUFnQjBHUTlRRkJBeEFpSUFBZ0FFSGt4Z0JCSkNBQUtBSW9LUU9ZQVJDWEJFSEE5UUZCQWhBaUlBQVFOQ0VISUFBb0FpZ2dCemNEb0FFZ0FDQUhRZUQxQVVFREVDSWdBQ0FBUWIzR0FFRWxJQUFvQWlncEE2QUJFSmNFUVpEMkFVRUJFQ0lnQUNBQUVEUWlCMEdnOWdGQkhoQWlJQUFnQjBFM0lBQWdBQ2dDS0NrREVDSUlRVGNnQ0VFQUVCUkJBeEFaR2lBQUlBQkJKa0hTSDBFQUVONENJZ2hCZ1BvQlFRTVFJaUFBSUFnZ0J4RDdCVUVWSVFJRFFDQUNRU0JHUlFSQUlBRWdCeEJISVFrZ0FrRURkQ0lBSUFFb0FpaHFJQWszQXdBZ0FTQUpRY1dCQVVFQklBSkI1YVlCYWkwQUFIU3RJZ2xCQUJEdkFSb2dBU0FCUVNjZ0FTZ0NFQ0FESUFKQmpnRnFFSkFCSWdSQkEwRURJQUlnQ0JEeEFTSUtJQVFnQVNnQ0tDQUFhaWtEQUJEZUFTQUJJQXBCeFlFQklBbEJBQkR2QVJvZ0FrRUJhaUVDREFFTEN5QUJJQWNRRHlBQklBZ1FEeUFCRURRaEJ5QUJLQUlvSUFjM0E0QUNJQUVnQjBHdytnRkJHQkFpSUFGQnV5SkJLQ0FCS0FJb0tRT0FBaENYQkJvQ1FDQUJLQUlRSWdBb0FrQkJNazhFUUNBQUtBSkVLQUtZQ1EwQkN5QUFRYUNsQVVFeFFRa1F6UU1hSUFBb0FrUWlBRUhRQ21wQktUWUNBQ0FBUWFBS2FrRXFOZ0lBSUFCQmlBcHFRU28yQWdBZ0FFSHdDV3BCS3pZQ0FDQUFRZGdKYWtFc05nSUFJQUJCd0FscVFTdzJBZ0FMSUFFUU5DRUhJQUVvQWlnZ0J6Y0RpQU1nQVNBSFFZREpBVUVFRUNJZ0FVRXRRYWZqQUVFQlFRSkJBQkNDQVNJSFFpQ0lwMEYxVHdSQUlBZW5JZ0FnQUNnQ0FFRUJhallDQUFzZ0FTQUhOd05RSUFFZ0IwSEF5UUZCQnhBaUlBRWdCMEduNHdBZ0FTZ0NLQ2tEaUFNUTNnRWdBU0FCS1FNd0VFY2hCeUFCS0FJb0lBYzNBNkFESUFGQkZVSGF6QUJCQVVFRlFRSWdBU2tET0JEeEFTRUhJQUVnQVNnQ0tDa0RvQU5Cc01vQlFRRVFJaUFCSUFjZ0FTZ0NLQ2tEb0FOQkFFRUJFSllDSUFFZ0J4QVBJQUVnQVJBMElnYzNBNkFCSUFFZ0IwSEF5Z0ZCQVJBaUlBRWdBU2tEb0FFUVJ5RUhJQUVvQWlnZ0J6Y0R1QU1nQVNBSFFkREtBVUVERUNJZ0FTQUJLUU9nQVJCSElRY2dBU2dDS0NBSE53UElBeUFCSUFkQmdNc0JRUVFRSWlBQklBRXBBekFRUnlFSElBRW9BaWdnQnpjRHdBTWdBVUVWUWNQTUFFRUJRUVZCQXlBQktRTTRFUEVCSVFjZ0FTQUJLQUlvS1FQQUEwSEF5d0ZCQVJBaUlBRWdBU2dDS0NJQUtRUEFBeUFBS1FQSUEwRUJRUUVRbGdJZ0FTQUhJQUVvQWlncEE4QURRUUJCQVJDV0FpQUJJQWNRRHlBQktBSVFJZ0JCTGpZQ2xBSWdBRUV2TmdLa0FpQUFRVEEyQXFBQ0lBQkJNVFlDbkFJZ0FFRXlOZ0tZQWlBQkVEUWhCeUFCS0FJb0lBYzNBNGdDSUFFZ0IwR0Ewd0ZCQXhBaUlBRWdBVUdJTFVFelFRRWdBU2dDS0NrRGlBSVF2d0ZCc05NQlFRNFFJZ3dCQzBFQUlRRUxJQVpCMEFCcUpBQWdBUXNIQUNBQUVOOEVDNGNDQVFoL0FuNGdBQ2dDRUNnQ2VDTUFJZ2NpRENBQnB5Z0NJQ0lJS0FJUUlna2dBMm9pQzBFRGRDSUthMHNFUUNBQUVPa0JRb0NBZ0lEZ0FBd0JDeUFKUVFBZ0NVRUFTaHNoRFNBSElBcEJEMnBCY0hGcklnY2tBQU4rSUFZZ0RVWUVma0VBSVFZZ0EwRUFJQU5CQUVvYklRTURRQ0FESUFaR1JRUkFJQWNnQmlBSmFrRURkR29nQkNBR1FRTjBhaWtEQURjREFDQUdRUUZxSVFZTUFRc0xJQVZCQVhFRVFDQUFJQUVnQWhCU0lRTWdBQ0FJS1FNQUlnRWdBU0FDSUFNYklBc2dCeENRQXd3REN5QUFJQWdwQXdBZ0NDa0RDQ0FMSUFjUUlRVWdCeUFHUVFOMElncHFJQWdnQ21vcEF4ZzNBd0FnQmtFQmFpRUdEQUVMQ3dzaEFTQU1KQUFnQVF1eEFRRUJmeUFBUWNnQUVGOGlCUVJBSUFWQkFEWUNBQUpBSUFBZ0JVRUlhaUlHSUFFZ0FpQURJQVFRN1FNRVFDQUZRUVEyQWdBTUFRc2dBQ0FHRUxRQ0lnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQUlRRHlBQUlBRkJMeEJsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQlFvQ0FnSUJ3V2dSQUlBR25JQVUyQWlBTElBRVBDeUFBS0FJUUlBVVE3QU1nQUNnQ0VDSUFRUkJxSUFVZ0FDZ0NCQkVBQUF0Q2dJQ0FnT0FBQzRnSEFnbC9BWHdqQUVGQWFpSUdKQUFDUUNBQUtBSVFJZ29vQW5nZ0JpQUJweUlJTFFBb0lndEJBM1FpREd0TEJFQWdBQkRwQVVLQWdJQ0E0QUFoQVF3QkN5QUlMUUFwSVEwZ0JpQUtLQUtNQVNJQU5nSVFJQW9nQmtFUWFqWUNqQUVnQUFSL0lBQW9BaWhCQkhFRlFRQUxJUUFnQ0NnQ0lDRUhJQVlnQVRjREdDQUdJQUEyQWpnZ0JpQUROZ0kwQWtBZ0F5QUxUZ1JBSUFRaEFBd0JDeUFEUVFBZ0EwRUFTaHNoRGlBR0lBeEJEMnBCOEI5eGF5SUFKQUFEUUNBSklBNUdCRUFnQXlFRUEwQWdCQ0FMUmtVRVFDQUFJQVJCQTNScVFvQ0FnSUF3TndNQUlBUkJBV29oQkF3QkN3c2dCaUFMTmdJMEJTQUFJQWxCQTNRaURHb2dCQ0FNYWlrREFEY0RBQ0FKUVFGcUlRa01BUXNMQ3lBR0lBQTJBaUFnQ0NnQ0pDRUVBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUEwT0RRc0NBQUVBQVFjSUF3UUZCZ2tLQ3lBRlFRRnhEUXBDZ0lDQWdEQWhBaUFOUVFKSERRb01Dd3NnQlVFQmNRMEFRb0NBZ0lBd0lRSWdEVUVEUmcwS0N5QUhJQUlnQXlBQUlBZ3VBU29nQkJFRkFDRUJEQXNMSUFjZ0FpQUVFUWdBSVFFTUNnc2dCeUFDSUFBcEF3QWdCQkVZQUNFQkRBa0xJQWNnQWlBSUxnRXFJQVFSRUFBaEFRd0lDeUFISUFJZ0FDa0RBQ0FJTGdFcUlBUVJOQUFoQVF3SEN5QUhJQVpCQ0dvZ0FDa0RBQkJDRFFVZ0Jpc0RDQ0FFRVFzQUlnKzlJZ0VDZnlBUG1VUUFBQUFBQUFEZ1FXTUVRQ0FQcWd3QkMwR0FnSUNBZUFzaUFMZTlVUVJBSUFDdElRRU1Cd3RDZ0lDQWdNQitJQUZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzaEFRd0dDMEtBZ0lDQTRBQWhBU0FISUFaQkNHb2dBQ2tEQUJCQ0RRVWdCeUFHSUFBcEF3Z1FRZzBGSUFZckF3Z2dCaXNEQUNBRUVTTUFJZys5SWdFQ2Z5QVBtVVFBQUFBQUFBRGdRV01FUUNBUHFnd0JDMEdBZ0lDQWVBc2lBTGU5VVFSQUlBQ3RJUUVNQmd0Q2dJQ0FnTUIrSUFGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2hBUXdGQ3lBSElBSWdBeUFBSUFaQkNHb2dDQzRCS2lBRUVSSUFJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQ0FHS0FJSUlnQkJBa1lOQkNBSElBRWdBQkQvQWlFQkRBUUxFQUVBQ3lBSElBSWdBeUFBSUFRUkFnQWhBUXdDQ3lBSFFad2lRUUFRRlF0Q2dJQ0FnT0FBSVFFTElBb2dCaWdDRURZQ2pBRUxJQVpCUUdza0FDQUJDOVVCQVFWL0l3QWlCU0VJQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlHTHdFR1FROUhEUUFnQmlnQ0lDRUhDeUFBSUFJZ0F5QURJQWN0QUFRaUFFZ0VmMEVBSVFZZ0EwRUFJQU5CQUVvYklRa2dCU0FBUVFOMFFROXFRZkFmY1dzaUJTUUFBMzhnQmlBSlJnUi9JQU1oQkFOL0lBQWdCRVlFZnlBRkJTQUZJQVJCQTNScVFvQ0FnSUF3TndNQUlBUkJBV29oQkF3QkN3c0ZJQVVnQmtFRGRDSUthaUFFSUFwcUtRTUFOd01BSUFaQkFXb2hCZ3dCQ3dzRklBUUxJQWN2QVFZZ0IwRUlhaUFIS0FJQUVSSUFJUUVnQ0NRQUlBRUwwd29DRDM4QmZpTUFRVEJySWdVa0FBSkFJQUFnQVJCWklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFBSkFJQUFnQVJBb0loTkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFRi9JUVFNQVFzQ1FDQUFRUUVnRTZjaURDZ0NCRUgvLy8vL0IzRWlCaUFHUVFGTkcwRUNkQkFwSWd0RkJFQkJmeUVFREFFTElBVkJBRFlDRUFOQUlBWWdCMHdOQVNBTElBUkJBblJxSUF3Z0JVRVFhaERKQVRZQ0FDQUVRUUZxSVFRZ0JTZ0NFQ0VIREFBTEFBc2dBQ0FURUE4TElBQWdBUkFQUW9DQWdJRGdBQ0VCSUFSQkFFZ05BQUpBQWtBZ0FrVU5BQ0FES1FNQUloTkNnSUNBZ0hDRFFvQ0FnSUF3VVEwQUFrQWdBQ0FGUVF4cUlCTVE1UUVpQWdSQUFrQWdBaTBBQUVIT0FFY05BQ0FDTFFBQlFjWUFSdzBBSUFKQkEwRUNJQUl0QUFKQnl3QkdJZ01iYWkwQUFDSUdRY01BYTBIL0FYRkJBVXNOQUNBRktBSU1JQUpCQTJvZ0FrRUNhaUFER3lBQ2EwRUJha1lOQWdzZ0FDQUNFRlFnQUVHQzBnQkJBQkJRQ3lBQVFSQnFJUkFnQ3lFR0RBSUxJQUFnQWhCVUlBWWdBMEVCZEdwQnd3QnJJUWdMSUFBb0FoQWhBaUFGUWdBM0F4Z2dCVUlBTndNUUlBVWdBallDSkNBRlFUczJBaUFnQUNJTVFSQnFJUkJCZnlFQUFrQWdCVUVRYWlBRVFRSjBJZ0lReGdFRVFFRUFJUVlNQVFzQ1FDQUlSUVJBUVFBaEJ5QUVRUUFnQkVFQVNoc2hBd05BSUFNZ0IwWU5BaUFIUVFKMElRWWdCMEVCYWlFSElBWWdDMm9vQWdCQi93Rk5EUUFMQ3lBRlFSQnFJQXNnQkNBSVFRRjJFT3dFUVFBaEJpQUZLQUljRFFFZ0JTZ0NGQ0lIUVFKMklnQkJBV3NoQ2tFQUlRSWdCU2dDRUNFR0EwQUNRQ0FBSUFKS0JFQWdCaUFDSWdSQkFuUnFLQUlBRUtZQ1JRMEJBMEFnQkNBS1JnUkFJQUFoQWd3REN5QUdJQVJCQVdvaUEwRUNkR29vQWdBaURSQ21BaUlKQkVBRFFBSkFJQUlnQkVvTkFDQUdJQVJCQW5ScUlnNG9BZ0FpRHhDbUFpQUpUQTBBSUE0Z0R6WUNCQ0FFUVFGcklRUU1BUXNMSUFSQkFuUWdCbW9nRFRZQ0JDQURJUVFNQVFVZ0F5RUNEQU1MQUFzQUN5QUlRUUZ4SUFkQkNFbHlEUU5CQVNBQUlBQkJBVTBiSVE1QkFTRUlRUUVoQUFOQUlBZ2dEa1lOQkNBR0lBaEJBblJxS0FJQUlnTVFwZ0loQnlBQUlRUUNRQUpBQTBBZ0JFRUFUQTBCSUFZZ0JFRUJheUlFUVFKMGFpSVBLQUlBSWdJUXBnSWlDZ1JBSUFjZ0Nrb2hBa0dBQWlFSElBSU5BUXdDQ3dzQ1FDQURRZUVpYTBFVVN5QUNRWUFpYTBFU1MzSkZCRUFnQTBFY2JDQUNRY3dFYkdwQm5JMmhBV3NoQnd3QkN3SkFJQUpCZ05nQ2F5SUVRYVBYQUVzTkFDQUVRZi8vQTNGQkhIQWdBMEduSTJzaUJFRWJTM0lOQUNBQ0lBUnFJUWNNQVF0QnNBY2hCRUVBSVFvRFFDQUVJQXBJRFFJZ0JVRW9haUFFSUFwcVFRSnRJZzFCQVhSQjhORURhaThCQUNJSFFRWjJJaEZCQW5SQmtPSUNhaWdDQUNJSlFRNTJJaElnQjBFL2NXb2lCeUFSSUJJZ0NVRUhka0gvQUhFZ0NVRUJka0UvY1JEckJCb2dBeUFGS0FJc2F5QUNJQVVvQWlnaUNXc2dBaUFKUmhzaUNVRUFTQVJBSUExQkFXc2hCQXdCQ3lBSkJFQWdEVUVCYWlFS0RBRUxDeUFIUlEwQkN5QVBJQWMyQWdBTUFRc2dCaUFBUVFKMGFpQUROZ0lBSUFCQkFXb2hBQXNnQ0VFQmFpRUlEQUFMQUFzZ0FrRUJhaUVDREFBTEFBc2dCU2dDRUNJR0lBc2dBaEFmR2lBRUlRQUxJQXdvQWhBaUFrRVFhaUFMSUFJb0FnUVJBQUFnQUVFQVNBMEJJQXdnQlVFUWFpQUFFRDBOQUVFQUlRUUNRQU5BSUFBZ0JFWU5BU0FFUVFKMElRSWdCRUVCYWlFRUlBVkJFR29nQWlBR2FpZ0NBQkM1QVVVTkFBc2dCU2dDRUNnQ0VDSUFRUkJxSUFVb0FoUWdBQ2dDQkJFQUFBd0JDeUFGUVJCcUVEWWhBUXNnRUNnQ0FDSUFRUkJxSUFZZ0FDZ0NCQkVBQUFzZ0JVRXdhaVFBSUFFTDdBY0NDMzRFZnlNQVFUQnJJZzhrQUFKQUlBRkMvLy8vLzI5WUJFQWdBQkFrUW9DQWdJRGdBQ0VCREFFTFFvQ0FnSUF3SVFZQ1FBSkFJQUFnQXlrREFCQW9JZ3RDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRUtBZ0lDQU1DRUhRb0NBZ0lBd0lRRkNnSUNBZ0RBaENVS0FnSUNBTUNFTURBRUxJQUFnQVNBQUtRTklFT01CSWd4Q2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0FNQ0VIUW9DQWdJQXdJUUZDZ0lDQWdEQWhDUXdCQ3dKQUFrQWdBQ0FBSUFGQjdRQWdBVUVBRUJRUU55SUpRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdDYWNpQWtIMUFFRUFFTWNCSVJJZ0FrSDVBRUVBRU1jQlFRQklCRUFnQUVITW5nRWdDVUhzSHhDK0FTSUpRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRUxJQThnQ1RjREtDQVBJQUUzQXlBZ0FDQU1RUUlnRDBFZ2FoQ25BU0lIUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQUJBK0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFS0FnSUNBNEFBaEFRd0RDMEYvSVFJQ1FDQURLUU1JSWdSQ2dJQ0FnSENEUW9DQWdJQXdVUTBBSUFBZ0QwRWNhaUFFRUhkQkFFZ05BeUFQS0FJY0lnSU5BQXdFQ3dKK0lBdW5JaEFwQWdRaUJLZEIvLy8vL3dkeEloRUVRQ0FTUVg5elFSOTJJUklnQkVMLy8vLy9CNE1oRFNBQ3JTRU9RUUFoQWdOQUlBS3RJUVFnQWlFREEwQWdBeUFSVHdSQUlBQWdFQ0FDSUJFZ0FpQVJTUnNnRVJDRUFRd0VDeUFBSUFkQjFRQWdBNjBpQ2hCRlFRQklEUVlnQUNBR0VBOENRQ0FBSUFjZ0N4RElBU0lHUW9DQWdJQndneUlGUW9DQWdJQWdVZ1JBSUFWQ2dJQ0FnT0FBVVEwSUlBQWdEMEVRYWlBQUlBZEIxUUFnQjBFQUVCUVFvd0VOQ0NBUElBOHBBeEFpQlNBTklBVWdEVk1iSWdVM0F4QWdCQ0FGVWcwQkN5QVFJQW9nRWhEeEFxY2hBd3dCQ3dzZ0FDQVFJQUlnQXhDRUFTSUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRVWdBQ0FCSUFnZ0JCQnFRUUJJRFFVZ0NFSUJmQ0lFSUE1UkRRWWdBQ0FQUVFocUlBWVFQQTBGSUFXbklRSkNBU0VGSUFoQ0FTQVBLUU1JSWdvZ0NrSUJWeHQ4SVFnRFFDQUVJQWhSQkVBZ0JDRUlEQUlMSUFBZ0FDQUdJQVVRY3hBM0lncENnSUNBZ0hDRFFvQ0FnSURnQUZFTkJpQUFJQUVnQkNBS0VHcEJBRWdOQmlBRlFnRjhJUVVnQkVJQmZDSUVJQTVTRFFBTEN3d0ZDeUFBSUFjZ0N4RElBU0lHUW9DQWdJQndneUlFUW9DQWdJRGdBRkVOQXlBRVFvQ0FnSUFnVWcwRUlBQWdFRUVBUVFBUWhBRUxJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BaUFBSUFFZ0NDQUVFR3BCQUU0TkF3d0NDMEtBZ0lDQU1DRUhDMEtBZ0lDQU1DRUJDeUFBSUFFUUQwS0FnSUNBNEFBaEFRc2dBQ0FMRUE4Z0FDQU1FQThnQUNBSEVBOGdBQ0FKRUE4Z0FDQUdFQThMSUE5Qk1Hb2tBQ0FCQytBQ0FRWitJQUZDLy8vLy8yOVlCRUFnQUJBa1FvQ0FnSURnQUE4TFFvQ0FnSURnQUNFSVFvQ0FnSUF3SVFZQ1FBSkFBa0FnQUNBREtRTUFFQ2dpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBUW9DQWdJQXdJUVFNQVFzZ0FDQUJRZFVBSUFGQkFCQVVJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFSQ0FCQlNSUVJBSUFBZ0FVSFZBRUlBRUVWQkFFZ05BUXNnQUNBQklBY1F5QUVpQlVLQWdJQ0FjSU1pQ1VLQWdJQ0E0QUJSRFFFZ0FDQUJRZFVBSUFGQkFCQVVJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BUUpBSUFBZ0JpQUVFRklFUUNBQUlBUVFEd3dCQ3lBQUlBRkIxUUFnQkJCRlFRQk9EUUJDZ0lDQWdEQWhCQXdDQ3lBQUlBY1FEeUFBSUFZUUQwTC8vLy8vRHlFSUlBbENnSUNBZ0NCUkRRSWdBQ0FGUWRjQUlBVkJBQkFVSVFFZ0FDQUZFQThnQVE4TFFvQ0FnSUF3SVFVTElBQWdCUkFQSUFBZ0J4QVBJQUFnQmhBUElBQWdCQkFQQ3lBSUM4MEVBZ1orQVg4akFFRWdheUlDSkFBQ1FDQUJRdi8vLy85dldBUkFJQUFRSkVLQWdJQ0E0QUFoQnd3QkMwS0FnSUNBNEFBaEIwS0FnSUNBTUNFSUFrQWdBQ0FES1FNQUVDZ2lDVUtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFRb0NBZ0lBd0lRUkNnSUNBZ0RBaEJVS0FnSUNBTUNFR0RBRUxBa0FDUUNBQUlBRWdBQ2tEU0JEakFTSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQkNnSUNBZ0RBaEJBd0JDeUFBSUFBZ0FVSHRBQ0FCUVFBUUZCQTNJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5BUXRDZ0lDQWdEQWhCUXdCQ3lBQ0lBUTNBeGdnQWlBQk53TVFJQUFnQmtFQ0lBSkJFR29RcHdFaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdBa0VJYWlBQUlBRkIxUUFnQVVFQUVCUVFvd0VOQUNBQUlBVkIxUUFDZmlBQ0tRTUlJZ0ZDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQUZDLy8vLy93K0REQUVMUW9DQWdJREFmaUFCdWIwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUlVFQVNBMEFRb0NBZ0lEZ0FDRUlJQUJCTGhCMklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFRU0FRS1NJRFJRUkFJQUVoQ0F3QkN5QURJQWszQXdnZ0F5QUZOd01BSUFNZ0JLY2lDa0huQUVFQUVNY0JRWDl6UVI5Mk5nSVFJQXBCOVFCQkFCREhBU0VLSUFOQkFEWUNHQ0FESUFwQmYzTkJIM1kyQWhRZ0FVS0FnSUNBY0ZvRVFDQUJweUFETmdJZ0N5QUFJQVlRRHlBQUlBUVFEeUFCSVFjTUFRc2dBQ0FKRUE4Z0FDQUdFQThnQUNBRUVBOGdBQ0FGRUE4Z0FDQUlFQThMSUFKQklHb2tBQ0FIQzc0RUFnZCtBbjhqQUVFUWF5SUNKQUFDUUNBQlF2Ly8vLzl2V0FSQUlBQVFKRUtBZ0lDQTRBQWhCZ3dCQzBLQWdJQ0E0QUFoQmtLQWdJQ0FNQ0VGQWtBZ0FBSitBa0FnQUNBREtRTUFFQ2dpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0FDQUJRZTRBSUFGQkFCQVVFQ1lpQTBFQVNBMEFJQU5GQkVBZ0FDQUJJQWNReUFFaEJnd0RDeUFBSUFBZ0FVSHZBQ0FCUVFBUUZCQW1JZ3RCQUVnTkFDQUFJQUZCMVFCQ0FCQkZRUUJJRFFCQ2dJQ0FnT0FBSUFBUVBpSUlRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWFJQWVuSVF3Q1FBTkFJQUFnQlJBUElBQWdBU0FIRU1nQklnVkNnSUNBZ0hDRElnUkNnSUNBZ0NCUkRRRUNRQ0FFUW9DQWdJRGdBRkVOQUFKL0lBQWdBQ0FGUWdBUVRSQTNJZ1JDZ0lDQWdIQ0RJZ3BDZ0lDQWdKQi9VZ1JBUVFBZ0NrS0FnSUNBNEFCU0RRRWFEQUlMSUFTbktBSUVRZi8vLy84SGNVVUxJUU1nQUNBSUlBa2dCQkNHQVVFQVNBMEFJQWxDQVh3aENTQURSUTBCSUFBZ0FrRUlhaUFBSUFGQjFRQWdBVUVBRUJRUW93RkJBRWdOQUNBQUlBRkIxUUFDZmlBTUlBSXBBd2dnQ3hEeEFpSUVRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUVRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdCTG05SWdSQ2dJQ0FnTUNCZ1B6L0FIMGdCRUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRVZCQUU0TkFRc0xJQWdNQWdzZ0NhY0VRQ0FJSVFZTUF3c2dBQ0FJRUE5Q2dJQ0FnQ0FoQmd3Q0MwS0FnSUNBTUFzUUR3c2dBQ0FGRUE4Z0FDQUhFQThMSUFKQkVHb2tBQ0FHQzQwVkFncC9EWDRqQUVHUUFXc2lCQ1FBQWtBZ0FVTC8vLy8vYjFnRVFDQUFFQ1JDZ0lDQWdPQUFJUkFNQVFzZ0F5a0RDQ0VaSUFBZ0JFRTRha0VBRUQwYUlBUkJBRFlDTUNBRVFvQ0FnSURBQURjREtDQUVJQUEyQWdBZ0JDQUVRUWhxSWdvMkFnUkNnSUNBZ09BQUlSQkNnSUNBZ0RBaEVRSkFBa0FnQUNBREtRTUFFQ2dpRkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBUW9DQWdJQXdJUk5DZ0lDQWdEQWhBVUtBZ0lDQU1DRVBRb0NBZ0lBd0lSY01BUXRDZ0lDQWdEQWhGd0pBSUFBZ0dSQTRJZ2hGQkVBZ0FDQVpFQ2dpRjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBREFJTElCZW5JUVVMSUFBZ0FDQUJRZTRBSUFGQkFCQVVFQ1lpREVFQVNBMEFJQXdFUUNBQUlBQWdBVUh2QUNBQlFRQVFGQkFtSWcxQkFFZ05BU0FBSUFGQjFRQkNBQkJGUVFCSURRRUxJQlNuSVFsQ2dJQ0FnREFoRHdKQUFrQUNRQUpBSUFWRkRRQWdERVVOQUNBRktRSUVRdi8vLy84SGcwSUFVZzBBQWtBZ0FDQUJRVHdnQVVFQUVCUWlEa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnRGlBQUtRTklFRkloQWlBQUlBNFFEeUFDUlEwQklBQWdBVUdHQVNBQlFRQVFGQ0lPUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnRGtIVkFFRUFFSVVFSVFJZ0FDQU9FQThnQWtVTkFRc2dBQ0FCRVBBQ0lnSkZEUU5CQUNFRElBQWdCRUhRQUdwQkFCQTlHaUFBSUJRUUtDSVNRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSUNRQ0FDS0FJRUlnY3RBQkFpQmtFaGNTSUtSUVJBSUFSQ0FEY0RnQUVNQVFzZ0FDQUJRZFVBSUFGQkFCQVVJZzVDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BeUFBSUFSQmdBRnFJQTRRb3dFTkF3dEJBQ0VJQWtBZ0J5MEFFU0lDUlEwQUlBQWdBa0VEZEJBcElnTU5BRUVBSVFNTUF3c2dCMEVRYWlFTUlBWkJFSEVoRFNBR1FRRnhJUWNnRXFjaUMwRVFhaUVGSUFzcEFnUWlENmRCSDNZaENTQUVLUU9BQVNFUkEwQWdFU0FQUXYvLy8vOEhnMVVOQWdKQUlBTWdEQ0FGSUJHbklBK25RZi8vLy84SGNTQUpJQUFROEFRaUFrRUJSd1JBSUFKQkFFZ05BU0FLUlNBQ1FRSkhjUTBFSUFBZ0FVSFZBRUlBRUVWQkFFZ05CUXdFQ3lBREtBSUFJUVlnQkNBREtBSUVJQVZySUFsMUlnSTJBb3dCSUFZZ0JXc2dDWFVpQmlBSVNnUkFJQVJCMEFCcUlBc2dDQ0FHRUZFTkJRc2dCMFVFUUNBQUlBRkIxUUFnQWlJSXJSQkZRUUJPRFFRTUJRc2dBaUVJQWtBZ0FpQUdSdzBBQWtBQ1FDQU5SUTBBSUFZZ0N5a0NCQ0lPcDBILy8vLy9CM0ZQRFFBZ0RrS0FnSUNBQ0lOQ0FGSU5BUXNnQkNBR1FRRnFJZ2cyQW93QkRBRUxJQXNnQkVHTUFXb1F5UUVhSUFRb0Fvd0JJUWdMSUFzcEFnUWhEeUFJckNFUklBSWhDQXdCQ3dzZ0FFR0x5d0JCQUJCR0RBSUxBa0FDUUFKQUEwQUNRQ0FBSUFFZ0ZCRElBU0lTUW9DQWdJQndneUlPUW9DQWdJQWdVZ1JBSUE1Q2dJQ0FnT0FBVVFSQUlBNGhFQXdGQ3lBRUtBSXdEUVFDUUNBRUtBSW9JZ01nQkNnQ0xFZ0VRQ0FFS0FJRUlRVU1BUXNnQXlBRFFRRjFha0VmYWtGdmNTSURRUU4wSVFjZ0JDZ0NBQ0VHQWtBQ1FDQUtJQVFvQWdRaUFrWUVRQ0FHUVFBZ0J5QUVRZEFBYWhDb0FTSUZSUTBCSUFVZ0Npa0RBRGNEQUNBRklBb3BBeGczQXhnZ0JTQUtLUU1RTndNUUlBVWdDaWtEQ0RjRENBd0NDeUFHSUFJZ0J5QUVRZEFBYWhDb0FTSUZEUUVMSUFRUTdnUWdCQ2dDQUNBU0VBOGdCRUYvTmdJd0RBWUxJQVFnQlRZQ0JDQUVJQVFvQWxCQkEzWWdBMm8yQWl3Z0JDZ0NLQ0VEQ3lBRUlBTkJBV28yQWlnZ0JTQURRUU4wYWlBU053TUFJQXdOQVVLQWdJQ0FNQ0VQQ3lBVVFpQ0lwMEYxU1NFRFFRQWhCMEVBSVFWQ2dJQ0FnREFoRTBLQWdJQ0FNQ0VCQTBBZ0JDZ0NLQ0FGU2dSQUlBQWdCRUdNQVdvZ0JDZ0NCQ0FGUVFOMGFpa0RBQ0lXRU5ZQlFRQklEUVFnQUNBUEVBOGdBQ0FBSUJaQ0FCQk5FRGNpRDBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBMSUFBZ0JFR0FBV29nQUNBV1FkY0FJQlpCQUJBVUVLTUJEUXNDUUNBRUtRT0FBU0lTSUFrcEFnUkMvLy8vL3dlREloQlZCRUFnQkNBUU53T0FBU0FRSVJJTUFRc2dFa0lBV1EwQVFnQWhFaUFFUWdBM0E0QUJDeUFBSUFFUUQwS0FnSUNBNEFBaEVDQUFFRDRpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBUW9DQWdJRGdBQ0VCREF3TElBOUNJSWluUVhWUEJFQWdENmNpQWlBQ0tBSUFRUUZxTmdJQUN5QUFJQUZDQUNBUFFZZUFBUkM5QVVFQVNBMExRUUVnQkNnQ2pBRWlBaUFDUVFGTkd5SUdyU0VhUWdFaEdBTkFJQmdnR2xJRVFDQUFJQllnR0JCekloVkNnSUNBZ0hDRElnNUNnSUNBZ0RCU0JFQWdEa0tBZ0lDQTRBQlJCRUFnRGlFUURBOExJQUFnRlJBM0loVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkJ3c2dBQ0FCSUJnZ0ZSQnFJUUlnR0VJQmZDRVlJQUpCQUU0TkFRd05Dd3NnQUNBUkVBOGdBQ0FXUVljQklCWkJBQkFVSWhGQ2dJQ0FnSENESWc1Q2dJQ0FnT0FBVVEwTEFrQWdDQVJBSUFBZ0FTQWFJQkpDLy8vLy93K0RFR3BCQUVnTkRTQURSUVJBSUFrZ0NTZ0NBRUVCYWpZQ0FBc2dBQ0FCSUFaQkFXcXRJQlFRYWtFQVNBME5JQTVDZ0lDQWdEQlNCRUFnRVVJZ2lLZEJkVThFUUNBUnB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFBZ0FTQUdRUUpxclNBUkVHcEJBRWdORGdzZ0JDQUJOd05ZSUFSQ2dJQ0FnREEzQTFBZ0FDQVRFQThnQUNBQUlCa2dCQ0FFUWRBQWFrRUFFSjBERURjaEV3d0JDMEtBZ0lDQU1DRVZJQTVDZ0lDQWdEQlNCRUFnQUNBUkVDVWlGVUtBZ0lDQWNJTkNnSUNBZ09BQVVRME5DeUFFSUJjM0EzZ2dCQ0FWTndOd0lBUWdBVGNEYUNBRUlCUTNBMWdnQkNBUE53TlFJQVFnRWtMLy8vLy9ENE0zQTJBZ0FDQVRFQThnQUNBRVFkQUFhaER0QkNFVElBQWdGUkFQQ3lBVFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFzZ0I2d2dFbGNFUUNBRVFUaHFJZ0lnQ1NBSElCS25FRkVhSUFJZ0V4Q0hBUm9nRDZjcEFnUkMvLy8vL3dlRElCSjhweUVIQ3lBRlFRRnFJUVVNQVFzTElBUkJPR29pQWlBSklBY2dDU2dDQkVILy8vLy9CM0VRVVJvZ0FoQTJJUkFNQ2dzZ0FDQVBFQTlDZ0lDQWdEQWhFd0pBQW44Q1FDQUFJQUFnRWtJQUVFMFFOeUlQUW9DQWdJQndneUlPUW9DQWdJQ1FmMUlFUUNBT1FvQ0FnSURnQUZJTkFTQU9JUkFNQXdzZ0Q2Y29BZ1JCLy8vLy93ZHhEUUFnQUNBRVFkQUFhaUFBSUFGQjFRQWdBVUVBRUJRUW93RkJBRWdOQWlBQUlBRkIxUUFDZmlBSklBUXBBMUFnRFJEeEFpSU9Rb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQU9Rdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdEcm05SWc1Q2dJQ0FnTUNCZ1B6L0FIMGdEa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRVVpQWtFQVRnMEFJQUpCSG5aQkFuRU1BUXRCQUF0RkRRRUxDd3dDQ3d3R0MwS0FnSUNBTUNFVEMwS0FnSUNBTUNFQkRBUUxJQVJCMEFCcUlBc2dDQ0FMS0FJRVFmLy8vLzhIY1JCUkRRQWdBQ0FTRUE4Z0FDZ0NFQ0lDUVJCcUlBTWdBaWdDQkJFQUFDQUVRZEFBYWhBMklSQU1BUXNnQUNBU0VBOGdBQ2dDRUNJQ1FSQnFJQU1nQWlnQ0JCRUFBQ0FFS0FKUUtBSVFJZ0pCRUdvZ0JDZ0NWQ0FDS0FJRUVRQUFDMEtBZ0lDQU1DRVJDMEtBZ0lDQU1DRVRRb0NBZ0lBd0lRRkNnSUNBZ0RBaER3c2dCQ2dDT0NnQ0VDSUNRUkJxSUFRb0Fqd2dBaWdDQkJFQUFBc2dCQkR1QkNBQUlCY1FEeUFBSUE4UUR5QUFJQUVRRHlBQUlCTVFEeUFBSUJFUUR5QUFJQlFRRHdzZ0JFR1FBV29rQUNBUUM2SUJBQ01BUVNCcklnSWtBQUorQWtBZ0FVTC8vLy8vYjFnRVFDQUFFQ1FNQVFzZ0FDQUNRUWhxSWdOQkFCQTlHaUFEUVM4UU94b0NRQ0FESUFBZ0FVSHNBQ0FCUVFBUUZCQi9EUUFnQWtFSWFpSURRUzhRT3hvZ0F5QUFJQUZCN1FBZ0FVRUFFQlFRZncwQUlBSkJDR29RTmd3Q0N5QUNLQUlJS0FJUUlnQkJFR29nQWlnQ0RDQUFLQUlFRVFBQUMwS0FnSUNBNEFBTElRRWdBa0VnYWlRQUlBRUxUZ0VDZmtLQWdJQ0E0QUFoQkNBQUlBRWdBeWtEQUJESUFTSUJRb0NBZ0lCd2d5SUZRb0NBZ0lEZ0FGSUVmaUFBSUFFUUR5QUZRb0NBZ0lBZ1VxMUNnSUNBZ0JDRUJVS0FnSUNBNEFBTEMvZ0NBZ04rQVg4Q1FBSkFJQUFnQVJEd0FpSUNSUTBBSUFNcEF3Z2hCZ0pBQWtBQ1FDQURLUU1BSWdSQ2dJQ0FnSEJVRFFBZ0JLY2lBeThCQmtFU1J3MEFJQVpDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFJQUJCbnZrQVFRQVFGVUtBZ0lDQTRBQVBDeUFES0FJZ0lnY2dCeWdDQUVFQmFqWUNBQ0FES0FJa0lnTWdBeWdDQUVFQmFqWUNBQ0FIclVLQWdJQ0FrSCtFSVFRZ0E2MUNnSUNBZ0pCL2hDRUZEQUVMUW9DQWdJQXdJUVVDZmlBRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQVFTOFFMUXdCQ3lBQUlBUVFLQXNpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCSUFBZ0JDQUdFSmdFSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVFzZ0FDQUNOUUlBUW9DQWdJQ1FmNFFRRHlBQUlBSTFBZ1JDZ0lDQWdKQi9oQkFQSUFJZ0JUNENCQ0FDSUFRK0FnQWdBQ0FCUWRVQVFnQVFSVUVBU0EwQklBRkNJSWluUVhWSkRRSWdBYWNpQUNBQUtBSUFRUUZxTmdJQURBSUxJQUFnQkJBUElBQWdCUkFQQzBLQWdJQ0E0QUFQQ3lBQkMyb0JBWDhnQVVMLy8vLy9iMWdFUUNBQUVDUkNnSUNBZ09BQUR3c0NmaUFCcHlJREx3RUdRUkpIQkVCQ2dJQ0FnREFnQUNBQklBQW9BaWdwQTVBQkVGSU5BUm9nQUVFU0VJWURRb0NBZ0lEZ0FBOExJQU1vQWlRdEFCQWdBbkZCQUVldFFvQ0FnSUFRaEFzTHZRUUJDWDhqQUVFZ2F5SUhKQUFDUUFKQUFrQUNRQUpBSUFGQy8vLy8vMjlZQkVBZ0FCQWtEQUVMSUFBZ0FTQUFLQUlvS1FPUUFSQlNEUUlnQUNBQkVQQUNJZ0lOQVF0Q2dJQ0FnT0FBSVFFTUF3c2dBaWdDQUNJSUtBSUVJZ0pCLy8vLy93ZHhJZ01OQVFzZ0FFSCtrd0VRWWlFQkRBRUxJQUFnQjBFSWFpQURJQUpCSDNZUWlnTWFJQWhCRUdvaEJpQUlLQUlFUWYvLy8vOEhjU0VKUVFBaEFBTkFBa0FDUUNBQUlBbElCRUFnQUVFQmFpRUNRWDhoQlFKQUFuOENRQUpBQWtBQ1FBSkFBa0FDUUFKL0lBZ3BBZ1JDZ0lDQWdBaURJZ0ZRSWdwRkJFQWdCaUFBUVFGMGFpOEJBQXdCQ3lBQUlBWnFMUUFBQ3lJRFFkc0FhdzREQXdFQ0FBc2dBaUVBQWtBZ0EwRUthdzRFQkFzTEJRQUxJQU5CTDBjTkJ5QUVSUTBGUVFFaEJFRXZJUU1NQnd0QjNBQWhBeUFDSUFsT0RRWWdBRUVDYWlFQUlBcEZCRUFnQmlBQ1FRRjBhaThCQUNFRkRBb0xJQUlnQm1vdEFBQWhCUXdKQzBFQUlRUkIzUUFoQXd3RkMwSGJBQ0VESUFRZ0FpQUpUbklOQmlBQVFRSnFJUUFnQVZBRVFFSGRBRUYvSUFJZ0Jtb3RBQUJCM1FCR0lnUWJJUVVnQUNBQ0lBUWJJUUJCQVNFRURBZ0xRUUVoQkVIZEFFRi9JQVlnQWtFQmRHb3ZBUUJCM1FCR0lnb2JJUVVnQUNBQ0lBb2JJUUFNQnd0QjdnQU1BZ3RCOGdBTUFRdEJBQ0VFUVM4TElRVkIzQUFoQXdzZ0FpRUFEQUlMSUFkQkNHb1FOaUVCREFNTElBSWhBRUVCSVFRTElBZEJDR29nQXhDTEFSb2dCVUVBU0EwQUlBZEJDR29nQlJDTEFSb01BQXNBQ3lBSFFTQnFKQUFnQVF2V0FnSURmd0YrSXdCQkVHc2lCQ1FBQWtBZ0FVTC8vLy8vYjFnRVFDQUFFQ1JDZ0lDQWdPQUFJUVVNQVF0Q2dJQ0FnT0FBSVFVZ0FDQUFJQUZCN2dBZ0FVRUFFQlFRSmlJQ1FRQklEUUFnQWdSL0lBUkI1d0E2QUFnZ0JFRUphZ1VnQkVFSWFnc2hBaUFBSUFBZ0FVSHI0d0FRc2dFUUppSURRUUJJRFFBZ0F3UkFJQUpCNlFBNkFBQWdBa0VCYWlFQ0N5QUFJQUFnQVVHTDVRQVFzZ0VRSmlJRFFRQklEUUFnQXdSQUlBSkI3UUE2QUFBZ0FrRUJhaUVDQ3lBQUlBQWdBVUgwMUFBUXNnRVFKaUlEUVFCSURRQWdBd1JBSUFKQjh3QTZBQUFnQWtFQmFpRUNDeUFBSUFBZ0FVSHZBQ0FCUVFBUUZCQW1JZ05CQUVnTkFDQURCRUFnQWtIMUFEb0FBQ0FDUVFGcUlRSUxJQUFnQUNBQlFmc2RFTElCRUNZaUEwRUFTQTBBSUFBZ0JFRUlhaUlBSUFNRWZ5QUNRZmtBT2dBQUlBSkJBV29GSUFJTElBQnJFSk1DSVFVTElBUkJFR29rQUNBRkM2VURBUVIrSXdCQkVHc2lBeVFBSUFRQ2Z3SkFBa0FDUUFKQUlBQWdBVUV1RUVzaUFrVUVRRUtBZ0lDQU1DRUJEQUVMSUFJb0FoZ0VRRUtBZ0lDQU1DRUJRUUVNQlFzZ0FDQUNLUU1BSWdnZ0Fpa0RDQ0lHRU1nQklnRkNnSUNBZ0hDRElnZENnSUNBZ09BQVVnMEJDMEtBZ0lDQU1DRUhEQUVMSUFkQ2dJQ0FnQ0JSQkVBZ0FrRUJOZ0lZUW9DQWdJQXdJUUZCQVF3REN5QUNLQUlRQkVBZ0FDQUFJQUZDQUJCTkVEY2lCMEtBZ0lDQWNJTWlDVUtBZ0lDQTRBQlJEUUVDUUNBSlFvQ0FnSUNRZjFJTkFDQUhweWdDQkVILy8vLy9CM0VOQUNBQUlBTkJDR29nQUNBSVFkVUFJQWhCQUJBVUVLTUJRUUJJRFFJZ0FDQUlRZFVBQW40Z0JxY2dBeWtEQ0NBQ0tBSVVFUEVDSWdaQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFaQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBR3ViMGlCa0tBZ0lDQXdJR0EvUDhBZlNBR1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVJVRUFTQTBDQ3lBQUlBY1FEd3dDQ3lBQ1FRRTJBaGdNQVFzZ0FDQUJFQThnQUNBSEVBOUNnSUNBZ09BQUlRRUxRUUFMTmdJQUlBTkJFR29rQUNBQkN3NEFJQUFRdFFKQ2dJQ0FnT0FBQ3drQVFvQ0FnSURBZmdzV0FDQUFJQU1wQXdBZ0F5a0RDQ0FES1FNUUVKUUVDOUVCQWdOK0FuOGpBRUVRYXlJSEpBQUNRQ0FBSUFkQkRHb2dBeWtEQUJEbEFTSUlSUVJBUW9DQWdJRGdBQ0VFREFFTElBQWdDQ0FIS0FJTVFkS0lBUkQxQlNFQklBQWdDQkJVQWtBZ0FrRUNTQ0FCUW9DQWdJQndnMEtBZ0lDQTRBQlJjZzBBSUFBZ0F5a0RDQ0lHRURoRkRRQkNnSUNBZ09BQUlRUUNRQ0FBRURRaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBRWhCUXdCQ3lBQUlBVkJMeUFCUVFjUUdVRUFTQTBBSUFBZ0JVRXZJQVlRK1FRaEJBc2dBQ0FGRUE4TUFRc2dBU0VFQ3lBSFFSQnFKQUFnQkFzTkFDQUFJQUVnQWtFd0VQMEZDd3NBSUFBZ0FVRXdFUDRGQzdRREFnTi9BbjRqQUVIUUFHc2lCaVFBUVg4aEJ3SkFJQUFnQmtISUFHb2dBVUhDQUJDQkFTSUlSUTBBSUFZcEEwZ2lBVUtBZ0lDQWNJTkNnSUNBZ0RCUkJFQWdDQ2tEQUNFQklBTkNJSWluUVhWUEJFQWdBNmNpQnlBSEtBSUFRUUZxTmdJQUN5QUFJQUVnQWlBRElBUWdCUkNHQkNFSERBRUxJQUFnQWhCY0lnbENnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUFJQUVRRHd3QkN5QUlLUU1BSVFvZ0JpQUVOd000SUFZZ0F6Y0RNQ0FHSUFrM0F5Z2dCaUFLTndNZ0lBQWdBU0FJS1FNSVFRUWdCa0VnYWhBdklRRWdBQ0FKRUE4Z0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUFrQUNRQ0FBSUFFUUppSUhCRUFnQUNBR0lBZ29BZ0FnQWhCTUlnSkJBRWdOQVNBQ1JRMERBa0FnQmlnQ0FDSUNRUk54UlFSQUlBQWdCaWtEQ0NBREVGSkZEUUVNQkFzZ0FrRVJjVUVRUncwRElBWTFBaHhDSUlaQ2dJQ0FnREJTRFFNTElBQWdCaEJJSUFCQnl5NUJBQkFWREFFTElBVkJnSUFCY1VVRVFFRUFJUWNnQlVHQWdBSnhSUTBESUFBb0FoQW9Bb3dCSWdKRkRRTWdBaTBBS0VFQmNVVU5Bd3NnQUVIa0drRUFFQlVMUVg4aEJ3d0JDeUFBSUFZUVNBc2dCa0hRQUdva0FDQUhDOVFDQWdKL0FuNGpBRUZBYWlJRUpBQUNRQUpBSUFBZ0JFRTRhaUFCUWNFQUVJRUJJZ1ZGRFFBZ0JDa0RPQ0lCUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FBSUFVcEF3QWdBaUFEUVFBUUZDRUJEQUlMSUFBZ0FoQmNJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FBSUFFUUR3d0JDeUFGS1FNQUlRY2dCQ0FETndNd0lBUWdCamNES0NBRUlBYzNBeUFnQUNBQklBVXBBd2hCQXlBRVFTQnFFQzhoQVNBQUlBWVFEeUFCUW9DQWdJQndneUlEUW9DQWdJRGdBRkVOQUNBQUlBUWdCU2dDQUNBQ0VFd2lBa0VBU0EwQUlBSkZEUUVDUUFKQUlBUW9BZ0FpQWtFVGNVVUVRQ0FBSUFRcEF3Z2dBUkJTUlEwQkRBSUxJQUpCRVhGQkVFY05BU0FEUW9DQWdJQXdVU0FFTlFJVVFpQ0dRb0NBZ0lBd1VuSU5BUXNnQUNBRUVFZ2dBQ0FCRUE4Z0FFR2lMMEVBRUJVTUFRc2dBQ0FFRUVnTUFRdENnSUNBZ09BQUlRRUxJQVJCUUdza0FDQUJDNWtDQWdOL0FuNGpBRUZBYWlJREpBQkJmeUVFQWtBZ0FDQURRVGhxSUFGQjR3QVFnUUVpQlVVTkFDQURLUU00SWdGQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFBZ0JTa0RBQ0FDRUhFaEJBd0JDeUFBSUFJUVhDSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQ0FCRUE4TUFRc2dCU2tEQUNFSElBTWdCamNES0NBRElBYzNBeUFnQUNBQklBVXBBd2hCQWlBRFFTQnFFQzhoQVNBQUlBWVFEeUFCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBQkVDWWlCQTBBQWtBZ0FDQURJQVVvQWdBaUJDQUNFRXdpQWtFQVRnUkFJQUpGRFFFZ0F5Z0NBQ0VDSUFBZ0F4QklJQUpCQVhFRVFDQUVMUUFGUVFGeERRSUxJQUJCb3p4QkFCQVZDMEYvSVFRTUFRdEJBQ0VFQ3lBRFFVQnJKQUFnQkF1ZUJnSUhmd04rSXdCQlFHb2lCeVFBUVg4aENBSkFJQUFnQjBFNGFpQUJRZVVBRUlFQklnbEZEUUFnQnlrRE9DSU9Rb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFJQWtwQXdBZ0FpQURJQVFnQlNBR0VHMGhDQXdCQ3lBQUlBSVFYQ0lQUW9DQWdJQndnMEtBZ0lDQTRBQlNCRUFnQUJBMElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUdRWUFRY1NJTkJFQWdCRUlnaUtkQmRVOEVRQ0FFcHlJS0lBb29BZ0JCQVdvMkFnQUxJQUFnQVVIQkFDQUVRUWNRR1JvTElBWkJnQ0J4SWdvRVFDQUZRaUNJcDBGMVR3UkFJQVduSWdzZ0N5Z0NBRUVCYWpZQ0FBc2dBQ0FCUWNJQUlBVkJCeEFaR2dzZ0JrR0F3QUJ4SWdzRVFDQURRaUNJcDBGMVR3UkFJQU9uSWd3Z0RDZ0NBRUVCYWpZQ0FBc2dBQ0FCUWNBQUlBTkJCeEFaR2dzZ0JrR0FCSEVpREFSQUlBQWdBVUUrSUFaQkFYWkJBWEd0UW9DQWdJQVFoRUVIRUJrYUN5QUdRWUFJY1FSQUlBQWdBVUUvSUFaQkFuWkJBWEd0UW9DQWdJQVFoRUVIRUJrYUN5QUdRWUFDY1FSQUlBQWdBVUU5SUFaQkFYR3RRb0NBZ0lBUWhFRUhFQmthQ3lBSktRTUFJUkFnQnlBQk53TXdJQWNnRHpjREtDQUhJQkEzQXlBZ0FDQU9JQWtwQXdoQkF5QUhRU0JxRUM4aERpQUFJQThRRHlBQUlBRVFEeUFPUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlnQUNBT0VDWkZCRUJCQUNFSUlBWkJnSUFCY1VVTkF5QUFRYm5MQUVFQUVCVkJmeUVJREFNTElBQWdCeUFKS0FJQUlna2dBaEJNSWdKQkFFZ05BaUFHUVlFQ2NTRUlBa0FDUUNBQ1JRUkFJQWhCZ0FKR0RRRkJBU0VJSUFrdEFBVkJBWEZGRFFFTUJRc0NRQ0FIS0FJQUlnSWdCaENUQTBVZ0FrRUJjU0FJUVlBQ1JuRnlEUUFDUUNBR1FZQXdjUVJBSUFKQkVYRkJFRWNOQVNBTkJFQWdBQ0FFSUFjcEF4QVFVa1VOQXdzZ0NrVU5BU0FBSUFVZ0J5a0RHQkJTRFFFTUFnc2dDMFVOQUNBR1FRSnhSU0FDUVFOeElnSkJBa1p4RFFFZ0FnMEFJQUFnQXlBSEtRTUlFRkpGRFFFTElBeEZEUUlnQnlnQ0FFRVRjVUVDUncwQ0N5QUFJQWNRU0FzZ0FFR3NIRUVBRUJWQmZ5RUlEQU1MSUFBZ0J4QklRUUVoQ0F3Q0N5QUFJQThRRHdzZ0FDQU9FQThMSUFkQlFHc2tBQ0FJQzY0Q0FnTi9BbjRqQUVGQWFpSURKQUJCZnlFRUFrQWdBQ0FEUVRocUlBRkI1QUFRZ1FFaUJVVU5BQ0FES1FNNElnRkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQWdCU2tEQUNBQ1FRQVExUUVoQkF3QkN5QUFJQUlRWENJR1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUJFQThNQVFzZ0JTa0RBQ0VISUFNZ0JqY0RLQ0FESUFjM0F5QWdBQ0FCSUFVcEF3aEJBaUFEUVNCcUVDOGhBU0FBSUFZUUR5QUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FCRUNZaUJFVUVRRUVBSVFRTUFRc0NRQ0FBSUFNZ0JTZ0NBQ0FDRUV3aUFrRUFUZ1JBSUFKRkRRSUNRQ0FETFFBQVFRRnhCRUFnQUNBRktRTUFFSmtCSWdKQkFFZ05BU0FDRFFNTElBQkJpUnhCQUJBVkN5QUFJQU1RU0F0QmZ5RUVEQUVMSUFBZ0F4QklDeUFEUVVCckpBQWdCQXNQQUNBQUlBTVFEeUFBRUxVQ1FYOExsQVlDQzM4Q2ZpTUFRVUJxSWdVa0FFRi9JUXNDUUNBQUlBVkJPR29nQTBIbkFCQ0JBU0lHUlEwQUlBVXBBemdpQTBLQWdJQ0FjSU5DZ0lDQWdEQlJCRUFnQUNBQklBSWdCaWdDQUVFREVJNEJJUXNNQVFzZ0FDQURJQVlwQXdoQkFTQUdFQzhpQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFWQkFEWUNMQ0FGUVFBMkFqUWdCVUVBTmdJd0lBQWdCVUUwYWlBREVOWUJJUWNnQlNnQ05DRUtBa0FnQncwQUFrQWdDa1VOQUNBQUlBcEJBM1FRWHlJSkRRQkJBQ0VKREFFTEFuOENRQU5BQWtBZ0JDQUtSZ1JBUVFFZ0NpQUtRUUZOR3lFSVFRRWhCQU5BSUFRZ0NFWU5BaUFKSUFRZ0NTQUVRUU4wYWlnQ0JCRDZCQ0VISUFSQkFXb2hCQ0FIUVFCSURRQUxJQUJCeGh0QkFCQVZRUUFNQkFzZ0FDQURJQVFRc0FFaUQwS0FnSUNBY0lNaUVFS0FnSUNBZ0g5UklCQkNnSUNBZ0pCL1VYSkZCRUJCQUNBUVFvQ0FnSURnQUZFTkJCb2dBQ0FQRUE4Z0FFSFJOMEVBRUJWQkFBd0VDeUFBSUE4UU1TRUlJQUFnRHhBUElBaEZEUUlnQ1NBRVFRTjBhaUlIUVFBMkFnQWdCeUFJTmdJRUlBUkJBV29oQkF3QkN3dEJBQ0FBSUFZcEF3QVFtUUVpREVFQVNBMEJHaUFHTFFBUkJFQWdBQkMyQWd3QkN5QUFJQVZCTEdvZ0JVRXdhaUFHS0FJQVFRTVFqZ0VFUUNBRktBSXdJUVFnQlNnQ0xDRUlEQU1MSUFVb0Fpd2hDQ0FGS0FJd0lRUkJBQ0VIQTBBZ0JDQUhSd1JBSUFZdEFCRUVRQ0FBRUxZQ0RBVUxJQUFnQlVFSWFpQUdLQUlBSUFnZ0IwRURkR29pRFNnQ0JCQk1JZzVCQUVnTkJBSkFJQTVGRFFBZ0FDQUZRUWhxRUVnZ0JTMEFDRUVCY1VFQUlBd2JEUUFnQ1NBS0lBMG9BZ1FRK2dRaURVRUFTQVJBSUFCQnFqSkJBQkFWREFZTElBd05BQ0FKSUExQkEzUnFRUUUyQWdBTElBZEJBV29oQnd3QkN3c0NRQ0FNRFFCQkFDRUdBMEFnQmlBS1JnMEJJQVpCQTNRaEJ5QUdRUUZxSVFZZ0J5QUphaWdDQUEwQUN5QUFRZmNaUVFBUUZRd0RDeUFBSUFnZ0JCQmFJQUFnQXhBUElBRWdDVFlDQUNBQ0lBbzJBZ0JCQUNFTERBTUxRUUFMSVFSQkFDRUlDeUFBSUFnZ0JCQmFJQUFnQ1NBS0VGb2dBQ0FERUE4TElBVkJRR3NrQUNBTEM2OEVBZ1IvQW40akFFSGdBR3NpQkNRQVFYOGhCUUpBSUFBZ0JFSFlBR29nQWtIbUFCQ0JBU0lHUlEwQUlBWW9BZ0FoQnlBRUtRTllJZ0pDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUFnQVNBSElBTVFUQ0VGREFFTElBQWdBeEJjSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUlBSVFEd3dCQ3lBR0tRTUFJUWtnQkNBSU53TklJQVFnQ1RjRFFDQUFJQUlnQmlrRENFRUNJQVJCUUdzUUx5RUNJQUFnQ0JBUElBSkNnSUNBZ0hDRElnaENnSUNBZ09BQVVRMEFBa0FDUUFKQUlBaENnSUNBZ0RCUklBSkMvLy8vLzI5V2NrVUVRQ0FBSUFJUUR3d0JDeUFBSUFRZ0J5QURFRXdpQTBFQVNBMENBa0FnQTBVRVFFRUFJUVVnQ0VLQWdJQ0FNRkVOQlF3QkN5QUFJQVFRU0NBSVFvQ0FnSUF3VWcwQUlBUXRBQUJCQVhGRkRRRkJBQ0VGSUFjdEFBVkJBWEZGRFFFTUJBdEJmeUVGSUFBZ0Jpa0RBQkNaQVNJR1FRQklEUUlnQUNBRVFTQnFJQUlRK3dRaEJ5QUFJQUlRRHlBSFFRQklEUU1DUUNBREJFQWdCQ2dDQUNJRlFZQTZRWURPQUNBRUtBSWdJZ05CRUhFYklBTnlFSk1EUlEwQklBTkJBWEVOQXlBRlFRRnhEUUVnQTBFU2NRMERJQVZCQW5FTkFRd0RDeUFHUlEwQUlBUXRBQ0JCQVhFTkFnc2dBQ0FFUVNCcUVFZ0xJQUJCbnoxQkFCQVZRWDhoQlF3Q0N3SkFJQUVFUUNBQklBUXBBeUEzQXdBZ0FTQUVLUU00TndNWUlBRWdCQ2tETURjREVDQUJJQVFwQXlnM0F3Z01BUXNnQUNBRVFTQnFFRWdMUVFFaEJRd0JDeUFBSUFJUUR3c2dCRUhnQUdva0FDQUZDMG9BQWtBZ0JTa0RBQ0lCUW9DQWdJQndWQTBBSUFHbklnSXZBUVpCTUVjTkFDQUNLQUlnSWdKRkRRQWdBa0VCT2dBUklBQWdBUkFQSUFWQ2dJQ0FnQ0EzQXdBTFFvQ0FnSUF3Qzg4QkFRTitJd0JCRUdzaUFpUUFRb0NBZ0lEZ0FDRUZBa0FDUUFKK1FvQ0FnSUF3SUFCQ2dJQ0FnREFnQUNBREVQd0ZJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQm9nQWlBRU53TUlRb0NBZ0lEZ0FDQUFRZFFBUVFCQkFFRUJJQUpCQ0dvUXp3RWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEFHaUFBRURRaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQklBWUxJUUVnQUNBRUVBOGdBQ0FCRUE4TUFRc2dBQ0FCUVlNQklBUkJCeEFaR2lBQUlBRkJoQUVnQmtFSEVCa2FJQUVoQlFzZ0FrRVFhaVFBSUFVTHNnRUJBbjRnQUNBQklBUkJBM0VpQWtFbWFoQkxSUVJBUW9DQWdJRGdBQThMUW9DQWdJRGdBQ0VHSUFBZ0FrRXFhaEIySWdWQ2dJQ0FnSENEUW9DQWdJRGdBRklFZmlBQVFSQVFLU0lDUlFSQUlBQWdCUkFQUW9DQWdJRGdBQThMSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBQ1FRQTJBZ3dnQWlBRVFRSjFOZ0lJSUFJZ0FUY0RBQ0FGUW9DQWdJQndXZ1JBSUFXbklBSTJBaUFMSUFVRlFvQ0FnSURnQUFzTDBnSUNBMzREZnlNQVFTQnJJZ2drQUVLQWdJQ0E0QUFoQlFKQUlBQWdBU0FFUVNacUVFc2lDVVVOQUNBREtRTUFJUWRDZ0lDQWdEQWhCaUFDUVFKT0JFQWdBeWtEQ0NFR0N5QUFJQWNRWUEwQUlBbEJCR29oQ2lBSktBSUlJUU1EUUNBRElBcEdCRUJDZ0lDQWdEQWhCUXdDQ3lBRFFReHJLQUlBQkVBZ0F5Z0NCQ0VEQlNBRFFSQnJJZ0lnQWlnQ0FFRUJhallDQUNBREtRTVFJZ1ZDSUlpblFYVlBCRUFnQmFjaUNTQUpLQUlBUVFGcU5nSUFDeUFJSUFVM0F3Z0NRQ0FFRFFBZ0F5a0RHQ0lGUWlDSXAwRjFTUTBBSUFXbklna2dDU2dDQUVFQmFqWUNBQXNnQ0NBQk53TVFJQWdnQlRjREFDQUFJQWNnQmtFRElBZ1FJU0VGSUFBZ0NDa0RBQkFQSUFSRkJFQWdBQ0FJS1FNSUVBOExJQU1vQWdRaEF5QUFLQUlRSUFJUTZnTWdCVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQUFnQlJBUEN3d0FDd0FMSUFoQklHb2tBQ0FGQzJBQUlBQWdBU0FDUVNacUVFc2lBRVVFUUVLQWdJQ0E0QUFQQ3lBQUtBSU1JZ0JCQUU0RVFDQUFyUThMUW9DQWdJREFmaUFBdUwwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3RaQVFGL0lBQWdBU0FFUVNacUVFc2lBa1VFUUVLQWdJQ0E0QUFQQ3lBQ1FRUnFJUU1nQWlnQ0NDRUVBMzRnQXlBRVJnUitRb0NBZ0lBd0JTQUVRUkJySVFVZ0JDZ0NCQ0VFSUFBb0FoQWdBaUFGRVB3RURBRUxDd3NWQUNBQUlBTVFEeUFBSUFRUUR5QUFFTFVDUVg4TGhnRUFJQUFnQVNBRVFTWnFFRXNpQWtVRVFFS0FnSUNBNEFBUEN5QUFJQUlnQXlrREFDSUJRZ0FnQVVJZ2lLZEJCMnRCYms4YklBRWdBVUtBZ0lDQXdJR0EvUDhBZkVMLy8vLy8vLy8vLy84QWcxQWJFUFVDSWdCRkJFQkNnSUNBZ0RBUEN5QUFLUU1vSWdGQ0lJaW5RWFZQQkVBZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBQkMzVUFJQUFnQVNBRVFTWnFFRXNpQWtVRVFFS0FnSUNBNEFBUEN5QUFJQUlnQXlrREFDSUJRZ0FnQVVJZ2lLZEJCMnRCYms4YklBRWdBVUtBZ0lDQXdJR0EvUDhBZkVMLy8vLy8vLy8vLy84QWcxQWJFUFVDSWdORkJFQkNnSUNBZ0JBUEN5QUFLQUlRSUFJZ0F4RDhCRUtCZ0lDQUVBdGhBQ0FBSUFFZ0JFRW1haEJMSWdKRkJFQkNnSUNBZ09BQUR3c2dBQ0FDSUFNcEF3QWlBVUlBSUFGQ0lJaW5RUWRyUVc1UEd5QUJJQUZDZ0lDQWdNQ0JnUHovQUh4Qy8vLy8vLy8vLy8vL0FJTlFHeEQxQWtFQVI2MUNnSUNBZ0JDRUM3c0ZBZ04rQjM4akFFRVFheUlMSkFCQ2dJQ0FnT0FBSVFjQ1FDQUFJQUVnQkVFbWFoQkxJZ0pGRFFBZ0FpZ0NBRVVnQXlrREFDSUZRZ0FnQlVJZ2lLZEJCMnRCYms4YklBVWdCVUtBZ0lDQXdJR0EvUDhBZkVMLy8vLy8vLy8vLy84QWcxQWJJZ1ZDLy8vLy8yOVdja1VFUUNBQUVDUU1BUXRDZ0lDQWdEQWhCaUFFUVFGeFJRUkFJQU1wQXdnaEJnc0NRQ0FBSUFJZ0JSRDFBaUlEQkVBZ0FDQURLUU1vRUE4TUFRc2dBRUV3RUNraUEwVU5BU0FESUFJMkFnZ2dBMElCTndNQUFrQWdBaWdDQUFSQUlBTWdCYWNpQkNnQ0dEWUNEQ0FFSUFNMkFoZ01BUXNnQlVJZ2lLZEJkVWtOQUNBRnB5SUVJQVFvQWdCQkFXbzJBZ0FMSUFNZ0JUY0RJQ0FDS0FJUUlna2dBaWdDRkNJRVFRRnJJQVVRMXdOeFFRTjBhaUlJS0FJQUlnb2dBMEVZYWlJTU5nSUVJQU1nQ0RZQ0hDQURJQW8yQWhnZ0NDQU1OZ0lBSUFJb0FnUWlDQ0FEUVJCcUlnbzJBZ1FnQXlBQ1FRUnFJZ3cyQWhRZ0F5QUlOZ0lRSUFJZ0NqWUNCQ0FDSUFJb0FneEJBV29pQ0RZQ0RDQUlJQUlvQWhoSkRRQWdBQ0FKUVFRZ0JFRUJkQ0FFUVFGR0d5SUFRUU4wSUF0QkRHb1FxQUVpQ0VVTkFDQUxLQUlNUVFOMklBQnFJUVJCQUNFQUEwQWdBQ0FFUmtVRVFDQUlJQUJCQTNScUlna2dDVFlDQkNBSklBazJBZ0FnQUVFQmFpRUFEQUVMQ3lBRVFRRnJJUW9nQWtFSWFpRUFBMEFnRENBQUtBSUFJZ0JIQkVBZ0FFRU1heWdDQUVVRVFDQUlJQUFwQXhBUTF3TWdDbkZCQTNScUlna29BZ0FpRFNBQVFRaHFJZzQyQWdRZ0FDQUpOZ0lNSUFBZ0RUWUNDQ0FKSUE0MkFnQUxJQUJCQkdvaEFBd0JDd3NnQWlBRU5nSVVJQUlnQ0RZQ0VDQUNJQVJCQVhRMkFoZ0xJQVpDSUlpblFYVlBCRUFnQnFjaUFDQUFLQUlBUVFGcU5nSUFDeUFESUFZM0F5Z2dBVUlnaUtkQmRVOEVRQ0FCcHlJQUlBQW9BZ0JCQVdvMkFnQUxJQUVoQndzZ0MwRVFhaVFBSUFjTHF3TUNBMzhCZmlNQVFSQnJJZ2NrQUFKQUlBQWdBU0FGUVNwcUVFc2lBMFVFUUNBRVFRQTJBZ0JDZ0lDQWdPQUFJUUVNQVF0Q2dJQ0FnREFoQVFKQUlBTXBBd0FpQ1VLQWdJQ0FjSU5DZ0lDQWdEQlJEUUFDUUNBSlFvQ0FnSUJ3VkEwQUlBbW5JZ0l2QVFZZ0JVRW1ha2NOQUNBQ0tBSWdJZ1pGRFFBQ1FDQURLQUlNSWdoRkJFQWdCaWdDQ0NFQ0RBRUxJQWdvQWhRaEFpQUFLQUlRSUFnUTZnTUxJQVpCQkdvaEJnTkFJQUlnQmtZRVFDQURRUUEyQWd3Z0FDQURLUU1BRUE4Z0EwS0FnSUNBTURjREFBd0RDeUFDUVF4cktBSUFCRUFnQWlnQ0JDRUNEQUVMQ3lBQ1FSQnJJZ1lnQmlnQ0FFRUJhallDQUNBRElBWTJBZ3dnQkVFQU5nSUFJQU1vQWdnaUEwVUVRQ0FDS1FNUUlnRkNJSWluUVhWSkRRTWdBYWNpQUNBQUtBSUFRUUZxTmdJQURBTUxJQWNnQWlrREVDSUJOd01BSUFWRkJFQWdBaWtER0NFQkN5QUhJQUUzQXdnZ0EwRUJSZ1JBSUFGQ0lJaW5RWFZKRFFNZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBREFNTElBQkJBaUFIRUlrRElRRU1BZ3RCK29NQlFhNzhBRUg5NXdKQnhpVVFBQUFMSUFSQkFUWUNBQXNnQjBFUWFpUUFJQUVMUFFFQmZrS0FnSUNBRUNFQklBTXBBd0FpQkVLQWdJQ0FjRm9FZmlBRXB5OEJCa0VWYTBILy93TnhRUXhKclVLQWdJQ0FFSVFGUW9DQWdJQVFDd3ZxQXdJRWZnRi9Jd0JCSUdzaUFpUUFRb0NBZ0lEZ0FDRUZBa0FnQUNBQklBUVFTeUlKUlEwQUlBa3RBQVFFUUNBQUVHc01BUXNnQUNBQ1FSaHFJQU1wQXdCQ0FDQUpOQUlBSWdZZ0JoQjBEUUFnQWlBR053TVFJQU1wQXdnaUIwS0FnSUNBY0lOQ2dJQ0FnREJTQkVBZ0FDQUNRUkJxSUFkQ0FDQUdJQVlRZEEwQklBSXBBeEFoQmdzZ0Fpa0RHQ0VJSUFBZ0FVS0FnSUNBTUJEakFTSUhRb0NBZ0lCd2d5SUZRb0NBZ0lEZ0FGRUVRQ0FISVFVTUFRc2dCaUFJZlNJR1FnQWdCa0lBVlJzaEJnSkFJQVZDZ0lDQWdEQlJCRUFnQUVLQWdJQ0FNQ0FHSUFRUTNBTWhCUXdCQ3lBQ0lBWWlCVUtBZ0lDQUNGb0Vma0tBZ0lDQXdINGdCcm05SWdWQ2dJQ0FnTUNCZ1B6L0FIMGdCVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0ZJQVVMTndNSUlBQWdCMEVCSUFKQkNHb1Fwd0VoQlNBQUlBY1FEeUFBSUFJcEF3Z1FEd3NnQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBQWtBZ0FDQUZJQVFRU3lJRFJRMEFJQUFnQlNBQkVGSUVRQ0FBUWMvR0FFRUFFQlVNQVFzQ1FDQURMUUFFRFFBZ0F6UUNBQ0FHVXdSQUlBQkJzOVFBUVFBUUZRd0NDeUFKTFFBRURRQWdBeWdDQ0NBSktBSUlJQWluYWlBR3B4QWZHZ3dDQ3lBQUVHc0xJQUFnQlJBUFFvQ0FnSURnQUNFRkN5QUNRU0JxSkFBZ0JRc09BQ0FBRUxVQ1FvQ0FnSURnQUF0ZEFDQUFJQUVnQWhCTElnQkZCRUJDZ0lDQWdPQUFEd3NnQUNnQ0FDSUFRUUJPQkVBZ0FLMFBDMEtBZ0lDQXdINGdBTGk5SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xPUUVCZmtLQWdJQ0F3SDRnQVNrREFDSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3pzQkFYNUNnSUNBZ01CK0lBRXFBZ0M3dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDd3dBSUFBZ0FTa0RBQkQ3QXdzTUFDQUFJQUVwQXdBUWh3SUxTUUVCZmlBQktBSUFJZ0JCQUU0RVFDQUFyUThMUW9DQWdJREFmaUFBdUwwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NIQUNBQk5RSUFDd2NBSUFFekFRQUxEZ0FnQVRJQkFFTC8vLy8vRDRNTENRQWdBQkMxQWtGL0N3NEFJQUV3QUFCQy8vLy8vdytEQ3djQUlBRXhBQUFMRHdBZ0FDc0RBQ0FCS3dNQUVQMEVDeEVBSUFBcUFnQzdJQUVxQWdDN0VQMEVDeGtCQW40Z0FTa0RBQ0lESUFBcEF3QWlCRlFnQXlBRVZtc0xHUUVDZmlBQktRTUFJZ01nQUNrREFDSUVVeUFESUFSVmF3c1hBQ0FCS0FJQUlnRWdBQ2dDQUNJQVNTQUFJQUZKYXdzWEFDQUJLQUlBSWdFZ0FDZ0NBQ0lBU0NBQUlBRklhd3NOQUNBQUx3RUFJQUV2QVFCckN3MEFJQUF1QVFBZ0FTNEJBR3NMRFFBZ0FDd0FBQ0FCTEFBQWF3c05BQ0FBTFFBQUlBRXRBQUJyQzh3TkJBZC9BWHdCZmdGOUl3QkJJR3NpQmlRQVFvQ0FnSURnQUNFTkFrQWdBQ0FCRUpJQklncEJBRWdOQUVGL0lRVUNRQUpBQWtBZ0NrVU5BRUVCSVFnQ1FBSkFJQVJCQVVZRVFFRi9JUWdnQmlBS1FRRnJJZ1UyQWh3Z0FrRUNTQTBCSUFBZ0JrRUlhaUFES1FNSUVFSU5CaUFHS3dNSUlneTlRdi8vLy8vLy8vLy8vd0NEUW9HQWdJQ0FnSUQ0L3dCYUJFQWdCa0VBTmdJY0RBSUxJQXhFQUFBQUFBQUFBQUJtQkVBZ0RDQUZ0Mk5GRFFJZ0JnSi9JQXlaUkFBQUFBQUFBT0JCWXdSQUlBeXFEQUVMUVlDQWdJQjRDellDSEF3Q0MwRi9JUVVnRENBS3Q2QWlERVFBQUFBQUFBQUFBR01OQkNBR0FuOGdESmxFQUFBQUFBQUE0RUZqQkVBZ0RLb01BUXRCZ0lDQWdIZ0xOZ0ljREFFTElBWkJBRFlDSENBQ1FRSklCRUFnQ2lFQ0RBSUxJQUFnQmtFY2FpQURLUU1JSUFvaUFpQUNFRmNOQlF3QkMwRi9JUUlMSUFHbklna29BaUFvQWd3b0FpQXRBQVFFUUVGL0lRVWdCRUYvUncwQ1FYOUJBQ0FETlFJRVFpQ0dRb0NBZ0lBd1Voc2hCUXdEQ3lBR1FnQTNBeEFDZjBFSElBTXBBd0FpQVVJZ2lLY2lBeUFEUVFkclFXNUpHeUlEUVhaSEJFQWdBMEVIUndSQVFYOGhCU0FERFFNZ0JpQUJ4Q0lCTndNUUlBRzVJUXhCQVNFSFFRRU1BZ3NnQmdKK0lBRkNnSUNBZ01DQmdQei9BSHkvSWd5WlJBQUFBQUFBQU9CRFl3UkFJQXl3REFFTFFvQ0FnSUNBZ0lDQWdIOExJZzAzQXhCQkFTRUhJQXdnRGJsaERBRUxJQUduSVFOQmZ5RUZBbjhDUUFKQUlBa3ZBUVpCSEdzT0FnQUJCQXRCQUNBR1FSQnFJQU5CQkdwQkFCQ0NBMFVOQVJvTUF3c2dBeWdDRENJSFFmLy8vLzhIUmcwQ0lBWUNma0lBSUFkQkFFd05BQm9nQXlnQ0NBMERJQWRCd0FCTERRTWdBeWdDRkNJTElBTW9BaEFpQTBFQ2RHcEJCR3NvQWdBaEJTQUZRU0FnQjJ0MnJTQUhRU0JORFFBYVFnQWhEU0FEUVFKUEJINGdBMEVDZENBTGFrRUlhelVDQUFWQ0FBc2dCYTFDSUlhRVFjQUFJQWRycllnTE53TVFRUUFMSVFkRUFBQUFBQUFBQUFBaERFRUFDeUVEUVg4aEJRSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FKTHdFR1FSVnJEZ3NCQUFFREJBWUhDd3dKQ2c4TElBTkZEUTRnQmlrREVDSU5Rb0FCZkVLQUFsb05EZ3dCQ3lBRFJRME5JQVlwQXhBaURVTC9BVllORFFzZ0NTZ0NKQ0VBSUFSQkFVWUVRQ0FOcDBILy93TnhJUU1nQmlnQ0hDRUZBMEFnQWlBRlJnME5JQU1nQUNBRmFpMEFBRVlORGlBRklBaHFJUVVNQUFzQUN5QUFJQVlvQWh3aUFtb2dEYWRCLy84RGNTQUtJQUpyRVBzQklnSkZEUXdnQWlBQWF5RUZEQXdMSUFORkRRc2dCaWtERUNJTlFvQ0FBbnhDZ0lBRVdnMExEQUVMSUFORkRRb2dCaWtERUNJTlF2Ly9BMVlOQ2dzZ0NTZ0NKQ0VBSUFZb0Fod2hCU0FOcDBILy93TnhJUU1EUUNBQ0lBVkdEUWtnQUNBRlFRRjBhaThCQUNBRFJnMEtJQVVnQ0dvaEJRd0FDd0FMSUFORkRRZ2dCaWtERUNJTlFvQ0FnSUFJZkVLQWdJQ0FFRm9OQ0F3QkN5QURSUTBISUFZcEF4QWlEVUwvLy8vL0QxWU5Cd3NnRGFjaEFDQUpLQUlrSVFNZ0JpZ0NIQ0VGQTBBZ0FpQUZSZzBHSUFNZ0JVRUNkR29vQWdBZ0FFWU5CeUFGSUFocUlRVU1BQXNBQ3lBSFJRMEZJQXk5UXYvLy8vLy8vLy8vL3dDRFFvR0FnSUNBZ0lENC93QmFCRUFnQkVGL1J3MEhJQWtvQWlRaEFDQUdLQUljSVFVRFFDQUNJQVZHRFFZZ0FDQUZRUUowYWlnQ0FFSC8vLy8vQjNGQmdJQ0EvQWRMRFFjZ0JTQUlhaUVGREFBTEFBc2dEQ0FNdGlJT3UySU5CU0FKS0FJa0lRQWdCaWdDSENFRkEwQWdBaUFGUmcwRklBQWdCVUVDZEdvcUFnQWdEbHNOQmlBRklBaHFJUVVNQUFzQUN5QUhSUTBFSUFrb0FpUWhBQ0FNdlVMLy8vLy8vLy8vLy84QWcwS0JnSUNBZ0lDQStQOEFXZ1JBSUFSQmYwY05CaUFHS0FJY0lRVURRQ0FDSUFWR0RRVWdBQ0FGUVFOMGFpa0RBRUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZnMEdJQVVnQ0dvaEJRd0FDd0FMSUFZb0Fod2hCUU5BSUFJZ0JVWU5CQ0FBSUFWQkEzUnFLd01BSUF4aERRVWdCU0FJYWlFRkRBQUxBQXNnQjBVTkFTQUFLQUlRS0FLTUFTSUFCSDhnQUMwQUtFRUVjVUVDZGdWQkFBdEZEUU1nQTBVTkF5QUdLUU1RSWdGQ2dZQ0FnSUNBZ0hCVERRTWdBVUtBZ0lDQWdJQ0FFRmtOQXd3QkN5QUhSUTBBSUFBb0FoQW9Bb3dCSWdBRWZ5QUFMUUFvUVFSeFFRSjJCVUVBQzBVTkFpQURSUTBDSUFZcEF4QWlBVUlBVXcwQ0lBRkMvLy8vLy8vLy93OVZEUUlMSUFrb0FpUWhBQ0FHS0FJY0lRVWdCaWtERUNFQkEwQWdBaUFGUmcwQklBQWdCVUVEZEdvcEF3QWdBVkVOQWlBRklBaHFJUVVNQUFzQUMwRi9JUVVMSUFSQmYwWU5BUXNnQmEwaERRd0JDeUFGUVFCT3JVS0FnSUNBRUlRaERRc2dCa0VnYWlRQUlBMExnZ01DQkg4RGZpTUFRU0JySWdVa0FBSitJQUFnQVJDU0FTSUlRUUJPQkVCQkxDRUhBa0FnQWtFQVRDQUVja1VFUUVLQWdJQ0FNQ0VKSUFNcEF3QWlDa0tBZ0lDQWNJTkNnSUNBZ0RCUkRRRkNnSUNBZ09BQUlBQWdDaEFvSWdsQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXhwQmZ5RUhJQW1uSWdZb0FnUkJBVWNOQVNBR0xRQVFJUWNNQVF0Q2dJQ0FnREFoQ1FzZ0FDQUZRUWhxUVFBUVBScEJBQ0VDQWtBRFFDQUNJQWhIQkVBQ1FDQUNSUTBBSUFkQkFFNEVRQ0FGUVFocUlBY1FPMFVOQVF3RUN5QUZRUWhxSUFaQkFDQUdLQUlFUWYvLy8vOEhjUkJSRFFNTElBQWdBU0FDRUxBQklndENnSUNBZ0hDRElncENnSUNBZ0NCUklBcENnSUNBZ0RCUmNrVUVRQ0FLUW9DQWdJRGdBRkVOQXlBRlFRaHFJQVFFZmlBQUlBc1EvZ1FGSUFzTEVIOE5Bd3NnQWtFQmFpRUNEQUVMQ3lBQUlBa1FEeUFGUVFocUVEWU1BZ3NnQlNnQ0NDZ0NFQ0lDUVJCcUlBVW9BZ3dnQWlnQ0JCRUFBQ0FBSUFrUUR3dENnSUNBZ09BQUN5RUxJQVZCSUdva0FDQUxDN2dDQXdOL0FYNEJmQ01BUVNCcklnTWtBQ0FDS0FJRVJRUkFJQUVvQWdBaEJTQURJQUlvQWdBaUFTQUNLQUljSUFBb0FnQWlBQ0FDS0FJZ2JHb2dBaWdDR0JFTkFEY0RFQ0FESUFFZ0FpZ0NIQ0FGSUFJb0FpQnNhaUFDS0FJWUVRMEFOd01ZQWtBZ0FTQUNLUU1RUW9DQWdJQXdRUUlnQTBFUWFoQWhJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FDUVFFMkFnUU1BUXNDUUFKL0lBWkMvLy8vL3c5WUJFQWdCcWNpQkVFZmRTQUVRUUJIY2d3QkN5QUJJQU5CQ0dvZ0JoQnVRUUJJRFFFZ0F5c0RDQ0lIUkFBQUFBQUFBQUFBWkNBSFJBQUFBQUFBQUFBQVkyc0xJZ1JGQkVBZ0FDQUZTeUFBSUFWSmF5RUVDeUFCSUFJcEF3Z1E5d0pCQUU0TkFTQUNRUUUyQWdRTUFRc2dBa0VCTmdJRUN5QUJJQU1wQXhBUUR5QUJJQU1wQXhnUUR3c2dBMEVnYWlRQUlBUUx0d1VDQlg4RGZpTUFRVEJySWdJa0FDQUNJQUUzQXhBZ0FpQUFOZ0lJSUFKQkFEWUNEQ0FDSUFNcEF3QWlDVGNER0VLQWdJQ0E0QUFoQ2dKQUFrQWdBQ0FCRUpJQklnVkJBRWdOQUNBSlFvQ0FnSUJ3Z3lJTFFvQ0FnSUF3VWdSQUlBQWdDUkJnRFFFTEFrQWdCVUVDU1EwQUlBR25JZ012QVFaQkZXc2lCRUgvL3dOeFFRdFBEUUlnQWlBRVFRSjBRZnovRDNFaUJFR0FnQUpxS0FJQU5nSWdRUUVnQXk4QkJrSGxwZ0ZxTFFBQUlnWjBJUWdnQXlnQ0pDRUhJQXRDZ0lDQWdEQlNCRUFnQUNBRlFRSjBFQ2tpQkVVTkFrRUFJUU1EUUNBRElBVkdSUVJBSUFRZ0EwRUNkR29nQXpZQ0FDQURRUUZxSVFNTUFRc0xJQUlnQ0RZQ0tDQUNJQWMyQWlRZ0JDQUZRUVJCMHdBZ0FrRUlhaEMrQWdKQUlBSW9BZ3hGQkVBZ0FDQUZJQVowSWdNUUtTSUdEUUVMSUFBb0FoQWlBRUVRYWlBRUlBQW9BZ1FSQUFBTUF3c2dCaUFISUFNUUh5RUdRUUFoQXdKQUFrQUNRQUpBQWtBZ0NFRUJhdzRJQUFFSUFnZ0lDQU1JQ3dOQUlBTWdCVVlOQkNBRElBZHFJQVlnQkNBRFFRSjBhaWdDQUdvdEFBQTZBQUFnQTBFQmFpRUREQUFMQUFzRFFDQURJQVZHRFFNZ0J5QURRUUYwYWlBR0lBUWdBMEVDZEdvb0FnQkJBWFJxTHdFQU93RUFJQU5CQVdvaEF3d0FDd0FMQTBBZ0F5QUZSZzBDSUFjZ0EwRUNkQ0lJYWlBR0lBUWdDR29vQWdCQkFuUnFLQUlBTmdJQUlBTkJBV29oQXd3QUN3QUxBMEFnQXlBRlJnMEJJQWNnQTBFRGRHb2dCaUFFSUFOQkFuUnFLQUlBUVFOMGFpa0RBRGNEQUNBRFFRRnFJUU1NQUFzQUN5QUFLQUlRSWdOQkVHb2dCaUFES0FJRUVRQUFJQUFvQWhBaUFFRVFhaUFFSUFBb0FnUVJBQUFNQVFzZ0J5QUZJQWdnQkVHc2dBSnFLQUlBSUFKQkNHb1F2Z0lnQWlnQ0RBMEJDeUFCUWlDSXAwRjFUd1JBSUFHbklnQWdBQ2dDQUVFQmFqWUNBQXNnQVNFS0N5QUNRVEJxSkFBZ0NnOExFQUVBQzZFQ0FnSi9BMzRqQUVFd2F5SUNKQUJDZ0lDQWdPQUFJUVlDUUNBQUlBRkJBQkNUQVNJRlJRMEFJQUFnQWtFTWFpQURLUU1BSUFVb0FpZ2lCQ0FFRUZjTkFDQUNJQVEyQWdnZ0F5a0RDQ0lIUW9DQWdJQndnMEtBZ0lDQU1GSUVRQ0FBSUFKQkNHb2dCeUFFSUFRUVZ3MEJJQUlvQWdnaEJBc2dBaWdDRENFRElBQWdBVUVBRUlBRklnZENnSUNBZ1BBQWcwS0FnSUNBNEFCUkRRQWdCUzhCQmlFRklBQWdCeEFQSUFBZ0FVRUFFSUVGSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBRlFlV21BV290QUFBaEJTQUNJQWczQXhnZ0FpQUJOd01RSUFJZ0JDQURheUlFUVFBZ0JFRUFTaHV0TndNb0lBSWdCNmNnQXlBRmRHcXROd01nSUFCQkJDQUNRUkJxRVBZQ0lRWWdBQ0FJRUE4TElBSkJNR29rQUNBR0M4SURBZ1YvQkg0akFFRWdheUlDSkFCQ2dJQ0FnREFoQ1FKQUFrQWdBQ0FCRUpJQklnUkJBRWdOQUNBQUlBSkJER29nQXlrREFDQUVJQVFRVncwQUlBSWdCRFlDQ0NBREtRTUlJZ3BDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFJQUFnQWtFSWFpQUtJQVFnQkJCWERRRWdBaWdDQ0NFRUN5QUNLQUlNSVFNZ0FDQUJRUUFRa3dFaUJrVU5BQ0FHTHdFR0lRY2dBaUFFSUFOcklnVkJBQ0FGUVFCS0d5SUVyU0lMTndNWUlBSWdBVGNERUNBQVFRSWdBa0VRYWhEMkFpSUpRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdCVUVBVEEwQklBZEI1YVlCYWkwQUFDRUhJQUFnQVJEM0FnMEFJQUFnQ1JEM0FnMEFRZ0FoQ2dKQUlBQWdDVUVBRUpNQklnVkZEUUFnQmk4QkJpSUlJQVV2QVFaSERRQWdCU2dDSUNnQ0ZDQUlRZVdtQVdvdEFBQWlDSFlnQkVrTkFDQURJQVJxSUFZb0FpQW9BaFFnQ0haTERRQWdCU2dDSkNBR0tBSWtJQU1nQjNScUlBUWdCM1FRSHhvTUFnc0RRQ0FLSUF0UkRRSWdBQ0FCSUFNZ0NxZHFyUkJOSWd4Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBa2dDaUFNUVlDQUFSRFhBU0VFSUFwQ0FYd2hDaUFFUVFCT0RRQUxDeUFBSUFrUUQwS0FnSUNBNEFBaENRc2dBa0VnYWlRQUlBa0w1d0lCQVg0Z0FDQUJFSklCSWdKQkFFZ0VRRUtBZ0lDQTRBQVBDd0pBSUFKRkRRQUNRQUpBQWtBQ1FBSkFJQUduSWdBdkFRWkI1YVlCYWkwQUFBNEVBQUVDQXdRTElBQW9BaVFpQUNBQ2FpRUNBMEFnQUNBQ1FRRnJJZ0pQRFFVZ0FDMEFBQ0VESUFBZ0FpMEFBRG9BQUNBQ0lBTTZBQUFnQUVFQmFpRUFEQUFMQUFzZ0FDZ0NKQ0lBSUFKQkFYUnFJUUlEUUNBQUlBSkJBbXNpQWs4TkJDQUFMd0VBSVFNZ0FDQUNMd0VBT3dFQUlBSWdBenNCQUNBQVFRSnFJUUFNQUFzQUN5QUFLQUlrSWdBZ0FrRUNkR29oQWdOQUlBQWdBa0VFYXlJQ1R3MERJQUFvQWdBaEF5QUFJQUlvQWdBMkFnQWdBaUFETmdJQUlBQkJCR29oQUF3QUN3QUxJQUFvQWlRaUFDQUNRUU4wYWlFQ0EwQWdBQ0FDUVFocklnSlBEUUlnQUNrREFDRUVJQUFnQWlrREFEY0RBQ0FDSUFRM0F3QWdBRUVJYWlFQURBQUxBQXNRQVFBTElBRkNJSWluUVhWUEJFQWdBYWNpQUNBQUtBSUFRUUZxTmdJQUN5QUJDNGNDQWdaK0FuOGpBRUVnYXlJTEpBQkNnSUNBZ0RBaEJnSkFBa0FnQUNBQkVKSUJJZ3hCQUVnTkFDQUFJQU1wQXdBaUNCQmdEUUJDZ0lDQWdEQWhCeUFDUVFKT0JFQWdBeWtEQ0NFSEN5QU1yU0VKQTBBZ0JTQUpVZ1JBSUFBZ0FTQUZFRTBpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFzZ0FUY0RFQ0FMSUFVM0F3Z2dDeUFHTndNQUlBQWdDQ0FIUVFNZ0N4QWhJZ3BDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BaUFBSUFvUUpnUkFJQVJGQkVBZ0JpRUZEQVVMSUFBZ0JoQVBEQVFGSUFBZ0JoQVBJQVZDQVh3aEJRd0NDd0FMQzBMLy8vLy9EMEtBZ0lDQU1DQUVHeUVGREFFTElBQWdCaEFQUW9DQWdJRGdBQ0VGQ3lBTFFTQnFKQUFnQlF1ZkJRSUVmd0orSXdCQklHc2lCQ1FBUW9DQWdJRGdBQ0VJQWtBZ0FDQUJFSklCSWdaQkFFZ05BQUpBSUFHbklnVXZBUVlpQjBFVlJnUkFJQU1wQXdBaUNVSWdpS2RCZFU4RVFDQUpweUlISUFjb0FnQkJBV28yQWdBTElBQWdCRUVJYWlBSkVNUUZEUUlnQkNBRU5BSUlOd01RREFFTElBZEJHMDBFUUNBQUlBUkJDR29nQXlrREFCQjNEUUlnQkNBRU5RSUlOd01RREFFTElBZEJIVTBFUUNBQUlBUkJFR29nQXlrREFCRC9CRVVOQVF3Q0N5QUFJQVJCQ0dvZ0F5a0RBQkJDRFFFZ0JBSitJQVV2QVFaQkhrWUVRQ0FFS3dNSXRyeXREQUVMSUFRcEF3Z0xOd01RQ3lBRVFRQTJBZ2dDUUNBQ1FRRk1CRUFnQkNBR05nSWNEQUVMSUFBZ0JFRUlhaUFES1FNSUlBWWdCaEJYRFFFZ0JDQUdOZ0ljSUFKQkEwa05BQ0FES1FNUUlnbENnSUNBZ0hDRFFvQ0FnSUF3VVEwQUlBQWdCRUVjYWlBSklBWWdCaEJYRFFFTElBVW9BaUFvQWd3b0FpQXRBQVFFUUNBQUVHc01BUXNDUUFKQUFrQUNRQUpBQWtBZ0JTOEJCa0hscGdGcUxRQUFEZ1FBQVFJREJBc2dCQ2dDSENJQ0lBUW9BZ2dpQUV3TkJDQUZLQUlrSUFCcUlBUXRBQkFnQWlBQWF4QXJHZ3dFQ3lBRUtBSUlJZ0FnQkNnQ0hDSUNJQUFnQWtvYklRSWdCQzhCRUNFREEwQWdBQ0FDUmcwRUlBVW9BaVFnQUVFQmRHb2dBenNCQUNBQVFRRnFJUUFNQUFzQUN5QUVLQUlJSWdBZ0JDZ0NIQ0lDSUFBZ0Frb2JJUUlnQkNnQ0VDRURBMEFnQUNBQ1JnMERJQVVvQWlRZ0FFRUNkR29nQXpZQ0FDQUFRUUZxSVFBTUFBc0FDeUFFS0FJSUlnQWdCQ2dDSENJQ0lBQWdBa29iSVFJZ0JDa0RFQ0VJQTBBZ0FDQUNSZzBDSUFVb0FpUWdBRUVEZEdvZ0NEY0RBQ0FBUVFGcUlRQU1BQXNBQ3hBQkFBc2dBVUlnaUtkQmRVOEVRQ0FGSUFVb0FnQkJBV28yQWdBTElBRWhDQXNnQkVFZ2FpUUFJQWdMMndVQ0EzOElmaU1BUVVCcUlnVWtBRUtBZ0lDQU1DRUxJQVZDZ0lDQWdEQTNBemdnQlVLQWdJQ0FNRGNETUFKQUFrQUNRQ0FFUVFoeElnY0VRQ0FCUWlDSXAwRjFUd1JBSUFHbklnWWdCaWdDQUVFQmFqWUNBQXNnQlNBQUlBRVFrZ0VpQnF3M0F3Z2dCa0VBVGcwQkRBSUxJQUFnQlVFSWFpQUFJQUVRSlNJQkVEd05BUXNnQUNBREtRTUFJZzBRWUEwQUFrQWdBa0VCVEFSQUlBVXBBd2dpREVJQUlBeENBRlViSVFvZ0JFRUJjU0VFQTBBZ0NDQUtVUVJBSUFCQnNoNUJBQkFWREFRTElBd2dDRUovaFh3Z0NDQUVHeUVKSUFoQ0FYd2hDQ0FIQkVBZ0JTQUFJQUVnQ1JCeklnazNBekFnQ1VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBFREFNTElBQWdBU0FKSUFWQk1Hb1FoUUVpQWtFQVNBMERJQUpGRFFBTElBVXBBekFoQ1F3QkN5QURLUU1JSWdsQ0lJaW5RWFZQQkVBZ0NhY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBRVFRRnhJUVFnQlNrRENDRU1DeUFJSUF3Z0NDQU1WUnNoRGdOQUlBZ2dEbEVOQWlBTUlBaENmNFY4SUFnZ0JCc2hDZ0pBQWtBQ1FDQUhCRUFnQlNBQUlBRWdDaEJ6SWdzM0F6Z2dDMEtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQU1MSUFBZ0FTQUtJQVZCT0dvUWhRRWlBa0VBU0EwQ0lBSkZEUUVMSUFwQ2dJQ0FnQWg4UXYvLy8vOFBXQVIrSUFwQy8vLy8vdytEQlVLQWdJQ0F3SDRnQ3JtOUlncENnSUNBZ01DQmdQei9BSDBnQ2tMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMSWd0Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBRklBazNBeEFnQlNBQk53TW9JQVVnQ3pjRElDQUZJQVVwQXpnaUR6Y0RHQ0FBSUExQ2dJQ0FnREJCQkNBRlFSQnFFQ0VoQ2lBQUlBc1FEeUFBSUE4UUR5QUZRb0NBZ0lBd053TTRJQXBDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFrUUR5QUtJUWtMSUFoQ0FYd2hDQXdCQ3dzZ0JTQUpOd013SUFVcEF6Z2hDd3NnQUNBRktRTXdFQThnQUNBTEVBOUNnSUNBZ09BQUlRa0xJQUFnQVJBUElBVkJRR3NrQUNBSkM2d0lBZ04vQ1g0akFFRXdheUlGSkFCQ2dJQ0FnREFoQ1NBRlFvQ0FnSUF3TndNb0FrQUNRQUpBQWtBZ0JFRUljU0lIQkVBZ0FVSWdpS2RCZFU4RVFDQUJweUlHSUFZb0FnQkJBV28yQWdBTElBVWdBQ0FCRUpJQklnYXNOd01JSUFaQkFFNE5BUXdDQ3lBQUlBVkJDR29nQUNBQkVDVWlBUkE4RFFFTElBTXBBd0FoRDBLQWdJQ0FNQ0VPSUFKQkFrNEVRQ0FES1FNSUlRNExJQUFnRHhCZ0RRQUNRQUpBQWtBQ1FBSkFBa0FDUUNBRURnMEZBQVlCQWdZR0JnVUFCZ01FQmd0Q2dJQ0FnQkFoQ1F3RkN5QUFJQUVDZmlBRktRTUlJZ2hDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQWhDLy8vLy93K0REQUVMUW9DQWdJREFmaUFJdWIwaUNFS0FnSUNBd0lHQS9QOEFmU0FJUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRcXdJaUNVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwRURBVUxJQUFnQVVJQUVLc0NJZ2xDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5Bd3dFQ3lBRklBRTNBeEFnQlNBRk5RSUlOd01ZSUFCQkFpQUZRUkJxRVBZQ0lnbENnSUNBZ0hDRFFvQ0FnSURnQUZJTkFnd0RDeUFBRUQ0aUNVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQlFvQ0FnSURnQUNFSkRBSUxRb0dBZ0lBUUlRa0xRZ0FoQ0NBRktRTUlJZ3BDQUNBS1FnQlZHeUVRQTBBZ0NDQVFVZ1JBQWtBQ1FDQUhCRUFnQlNBQUlBRWdDQkJ6SWdvM0F5Z2dDa0tBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQVVMSUFBZ0FTQUlJQVZCS0dvUWhRRWlBa0VBU0EwRUlBSkZEUUVMSUFnaENpQUlRb0NBZ0lBSVdnUkFRb0NBZ0lEQWZpQUl1YjBpQ2tLQWdJQ0F3SUdBL1A4QWZTQUtRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d5RUtDeUFLUW9DQWdJQndnMEtBZ0lDQTRBQlJEUU1nQlNBQk53TWdJQVVnQ2pjREdDQUZJQVVwQXlnaURUY0RFQ0FBSUE4Z0RrRURJQVZCRUdvUUlTRUxJQUFnQ2hBUElBdENnSUNBZ0hDRFFvQ0FnSURnQUZFTkF3SkFBa0FDUUFKQUFrQUNRQUpBSUFRT0RRQUJCUUlFQlFVRkFBRUZBd1FGQ3lBQUlBc1FKZzBGUW9DQWdJQVFJUWdNQ3dzZ0FDQUxFQ1pGRFFSQ2dZQ0FnQkFoQ0F3S0N5QUFJQWtnQ0NBTEVHcEJBRTROQXd3SEN5QUFJQWtnQ0VMLy8vLy9ENE1nQzBHQWdBRVExd0ZCQUU0TkFnd0dDeUFBSUFzUUprVU5BU0FOUWlDSXAwRjFUd1JBSUEybklnSWdBaWdDQUVFQmFqWUNBQXNnQUNBSklBd2dEUkJxUVFCSURRVWdERUlCZkNFTURBRUxJQUFnQ3hBUEN5QUFJQTBRRHlBRlFvQ0FnSUF3TndNb0N5QUlRZ0Y4SVFnTUFRc0xJQVJCREVjRVFDQUpJUWdNQXdzZ0JTQUJOd01RSUFVZ0RFTC8vLy8vRDRNM0F4Z2dBRUVDSUFWQkVHb1E5Z0lpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFVZ0NUY0RFQ0FBSUFBZ0NFSENBRUVCSUFWQkVHb1FyQUlRL0FGRkRRRUxRb0NBZ0lEZ0FDRUlDeUFBSUFrUUR3c2dBQ0FGS1FNb0VBOGdBQ0FCRUE4Z0JVRXdhaVFBSUFnTCtBVUNCMzhDZmlNQVFSQnJJZ0lrQUNBQ1FnQTNBd0FnQWtMLy8vLy9EemNEQ0FKQUlBSkI4QUlRMlFNaUFFVUVRQXdCQ3lBQVFTQnFRUUJCMEFJUUt4b2dBRUdncEFFcEFnQTNBZ2dnQUVHWXBBRXBBZ0EzQWdBZ0FFRUZOZ0lNSUFJcEF3Z2hCeUFDS1FNQUlRZ2dBRUdBZ0JBMkFtd2dBQ0FJTndNUUlBQWdCemNER0NBQVFlQUJha0VBUVRRUUt4b2dBRUVHTmdMa0FpQUFRUWMyQXVBQ0lBQkJDRFlDMkFJZ0FFRUpOZ0xVQWlBQVFRbzJBdEFDSUFCQkN6WUN6QUlnQUVFR05nTElBaUFBUVFjMkFzUUNJQUJCQ0RZQ3ZBSWdBRUVKTmdLNEFpQUFRUW8yQXJRQ0lBQkJDellDc0FJZ0FFRUdOZ0tzQWlBQVFRYzJBcWdDSUFCQkNEWUNvQUlnQUVFSk5nS2NBaUFBUVFvMkFwZ0NJQUJCQ3pZQ2xBSWdBRUVNTmdMY0FTQUFJQUEyQXRnQklBQWdBRUdnQVdvaUFUWUNwQUVnQUNBQk5nS2dBU0FBUVFBNkFHZ2dBQ0FBUWRnQWFpSUJOZ0pjSUFBZ0FUWUNXQ0FBSUFCQjBBQnFJZ0UyQWxRZ0FDQUJOZ0pRSUFBZ0FFSElBR29pQVRZQ1RDQUFJQUUyQWtnZ0FFRUFOZ0lrSUFCQkFEWUNOQ0FBUVFBMkFqd2dBRUlBTndNb0FrQUNRQ0FBUVlBQ0VQSUVEUUJCa0tjQklRUkJBU0VCQTBBZ0FVSGVBVWNFUUNBQUlBUVFQeUlGUVFBUTd3UWlCa1VOQWlBR1FSQnFJQVFnQlJBZklBVnFRUUE2QUFBZ0FDQUdRUVJCQTBFQklBRkJ6d0ZMR3lBQlFjOEJSaHNRcHdKRkRRSWdBVUVCYWlFQklBUWdCV3BCQVdvaEJBd0JDd3NnQUVHUW53RkJBVUV2RU0wRFFRQklEUUFnQUNnQ1JDSUJRUTAyQXZnQ0lBRkJEallDc0FJZ0FVSDhvd0UyQXB3Q0lBRkI0S01CTmdLTUFTQUJRY1NqQVRZQzFBRWdBVUVQTmdLUUF5QUJRUkEyQXVBQ0lBQkJBRFlDMEFFZ0FFS0VnSUNBZ0FJM0E4Z0JJQUJCRUdwQndBQWdBQ2dDQUJFREFDSUJEUUVnQUVFQU5nTFVBUXNnQUJEZkJBd0JDeUFCUVFCQndBQVFLeUVESUFCQ2dJQ0FnQ0EzQTRBQklBQWdBa0dBZ0JCck5nSjRJQUFnQWpZQ2RDQUFRWUNBRURZQ2NDQUFJQU0yQXRRQklBQWhBd3NnQWtFUWFpUUFJQU1McGdJQ0JIOENmaU1BUVJCcklnVWtBRUtBZ0lDQTRBQWhDQUpBSUFBZ0FSQ1NBU0lFUVFCSURRQWdBQ0FGUVF4cUlBTXBBd0FnQkNBRUVGY05BQ0FBSUFWQkNHb2dBeWtEQ0NBRUlBUVFWdzBBSUFVZ0JEWUNCQUovSUFRZ0FrRURTQTBBR2lBRUlBTXBBeEFpQ1VLQWdJQ0FjSU5DZ0lDQWdEQlJEUUFhSUFBZ0JVRUVhaUFKSUFRZ0JCQlhEUUVnQlNnQ0JBc2dCU2dDQ0NJSGF5SUdJQVFnQlNnQ0RDSURheUlDSUFJZ0Jrb2JJZ0pCQUVvRVFDQUJweUlHS0FJZ0tBSU1LQUlnTFFBRUJFQWdBQkJyREFJTElBWW9BaVFpQUNBRElBWXZBUVpCNWFZQmFpMEFBQ0lEZEdvZ0FDQUhJQU4wYWlBQ0lBTjBFSndCQ3lBQlFpQ0lwMEYxVHdSQUlBR25JZ0FnQUNnQ0FFRUJhallDQUFzZ0FTRUlDeUFGUVJCcUpBQWdDQXRLQWdGK0FYOUNnSUNBZ0RBaEFnSkFJQUZDZ0lDQWdIQlVEUUFnQWFjdkFRWWlBMEVWYTBILy93TnhRUXBMRFFBZ0FDQUFLQUlRS0FKRUlBTkJHR3hxS0FJRUVDMGhBZ3NnQWdzc0FRRitRb0NBZ0lEZ0FDRUZJQUFnQVJEM0FnUitRb0NBZ0lEZ0FBVWdBQ0FCSUFBZ0FDQUVFTlVGQ3d2Q0F3SUVmZ1IvSXdCQkVHc2lDQ1FBUW9DQWdJQXdJUVZDZ0lDQWdEQWhCQ0FDUVFKT0JFQWdBeWtEQ0NFRUN5QURLUU1BSVFaQ2dJQ0FnT0FBSVFjQ1FDQUFJQUZCQUJDVEFTSUNSUTBBSUFBZ0NDQUVFT0lERFFBQ1FBSkFBa0FDUUFKQUlBZ3BBd0FpQkVJQVV3UkFEQUVMSUFJb0FpQW9BZ3dvQWlBdEFBUU5CQ0FBSUFZUUpTSUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdCYWNpQXk4QkJpSUpRUlZyUWYvL0EzRkJDazBFUUNBREtBSWdJZ29vQWd3b0FpQWlDeTBBQkEwRklBUWdBalVDS0NBRE5RSW9JZ1o5VlEwQklBa2dBaThCQmlJRFJ3MENJQVFnQTBIbHBnRnFNUUFBSWdHR3B5QUNLQUlnSWdJb0Fnd29BaUFvQWdnZ0FpZ0NFR3BxSUFzb0FnZ2dDaWdDRUdvZ0JpQUJocWNRbkFFTUF3c2dBQ0FJUVFocUlBVVFQQTBESUFRZ0FqVUNLQ0FJS1FNSUlnWjlWdzBCQ3lBQVFlSFlBRUVBRUZBTUJBc2dCS2NoQWtFQUlRTURRQ0FHSUFPdFZ3MEJJQUFnQlNBREVMQUJJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQ0FDSUFOcUlRa2dBMEVCYWlFRElBQWdBU0FKSUFRUXBRRkJBRTROQUFzTUF3dENnSUNBZ0RBaEJ3d0NDd3dCQ3lBQUVHc0xJQUFnQlJBUElBaEJFR29rQUNBSEN4NEFJQUFnQVVFQUVKTUJJZ0JGQkVCQ2dJQ0FnT0FBRHdzZ0FEVUNLQXVyQVFJRGZ3RitJd0JCRUdzaUJTUUFJQVVnQXEwM0F3Z0NRQ0FBSUFGQkFTQUZRUWhxRU5vRElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUNRUUFnQWtFQVNoc2hBZ05BSUFJZ0JFWU5BU0FESUFSQkEzUnFLUU1BSWdkQ0lJaW5RWFZQQkVBZ0I2Y2lCaUFHS0FJQVFRRnFOZ0lBQ3lBQUlBRWdCQ0FIRUtVQklRWWdCRUVCYWlFRUlBWkJBRTROQUFzZ0FDQUJFQTlDZ0lDQWdPQUFJUUVMSUFWQkVHb2tBQ0FCQ3dZQVFmREdCQXVDQndJSmZnSi9Jd0JCTUdzaURTUUFJQU1wQXdBaEJDQU5Rb0NBZ0lBd053TVlRUUVoRGdKQUFrQUNmaUFDUVFKSUJFQkNnSUNBZ0RBaENrS0FnSUNBTUF3QkMwS0FnSUNBTUNBREtRTUlJZ3BDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFHa0tBZ0lDQU1DRUpRb0NBZ0lBd0lRWkNnSUNBZ0RBaEIwS0FnSUNBTUNFRklBQWdDaEJnRFFGQkFDRU9Rb0NBZ0lBd0lBSkJBMGtOQUJvZ0F5a0RFQXNoQ3dKQUFrQWdBQ0FFUWRFQklBUkJBQkFVSWdaQ2dJQ0FnSENESWdWQ2dJQ0FnREJTQkVBZ0JVS0FnSUNBNEFCUkJFQkNnSUNBZ0RBaENVS0FnSUNBTUNFR1FvQ0FnSUF3SVFjTUF3c2dBQ0FHRUE4Z0FCQStJZ2RDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRUtBZ0lDQU1DRUpRb0NBZ0lBd0lRWkNnSUNBZ09BQUlRY01Bd3NnQkVJZ2lLZEJkVThFUUNBRXB5SUNJQUlvQWdCQkFXbzJBZ0FMSUEwZ0JEY0RFQ0FBSUExQkVHcEJDSEpCQUJDWkF5RUNJQTBwQXhnaENTQU5LUU1RSVFZZ0FnMENRZ0FoQlFOQUlBQWdCaUFKSUExQkJHb1FyZ0VpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBSUEwb0FnUU5BeUFBSUFjZ0JTQUVFR29oQWlBRlFnRjhJUVVnQWtFQVRnMEJDd3RDZ0lDQWdEQWhCU0FHUW9DQWdJQndnMEtBZ0lDQU1GRU5BeUFBSUFaQkFSQ3RBUm9NQXd0Q2dJQ0FnREFoQ1VLQWdJQ0FNQ0VHUW9DQWdJQXdJUVVnQUNBRUVDVWlCMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMENDeUFBSUExQkNHb2dCeEE4UVFCSURRQWdEUUorSUEwcEF3Z2lCRUtBZ0lDQUNIeEMvLy8vL3c5WUJFQWdCRUwvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQVM1dlNJRlFvQ0FnSURBZ1lEOC93QjlJQVZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeUlJTndNZ0lBQWdBVUVCSUExQklHb1EyZ01oQlNBQUlBZ1FEd0pBSUFWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUVJQUlRZ2dCRUlBSUFSQ0FGVWJJUXdEUUNBSUlBeFJEUVFnQUNBSElBZ1FjeUlFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVDUUNBT0JFQWdCQ0VCREFFTElBMGdCRGNESUNBTklBaEMvLy8vL3crRE53TW9JQUFnQ2lBTFFRSWdEVUVnYWhBaElRRWdBQ0FFRUE4Z0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ0N5QUFJQVVnQ0NBQkVJWUJJUUlnQ0VJQmZDRUlJQUpCQUU0TkFBc0xEQUVMUW9DQWdJQXdJUVVMSUFBZ0JSQVBRb0NBZ0lEZ0FDRUZDeUFBSUFjUUR5QUFJQVlRRHlBQUlBa1FEeUFOUVRCcUpBQWdCUXNSQUNBQVFSQnFJQUlnQUNnQ0JCRUFBQXVuQkFJRWZ3RitJd0JCSUdzaUJTUUFRb0NBZ0lEZ0FDRUpBa0FnQUNBQlFTQVFTeUlIUlEwQUlBUkI1YVlCYWkwQUFDRUlJQUFnQlVFSWFpQURLUU1BRUtZQkRRQWdBeWtEQ0NFQklBVkNBRGNER0NBRlFRQTJBaFFDUUNBRVFSdE1CRUFnQUNBRlFSUnFJQUVRZDBVTkFRd0NDeUFFUVIxTkJFQWdBQ0FGUVJocUlBRVEvd1JGRFFFTUFnc2dBQ0FGSUFFUVFnMEJJQVJCSGtZRVFDQUZJQVVyQXdDMk9BSVVEQUVMSUFVZ0JTa0RBRGNER0F0QkFTRUdJQUpCQTA0RVFDQUFJQU1wQXhBUS9RRkJBWE1oQmdzZ0J5Z0NEQ2dDSUNJQ0xRQUVCRUFnQUJCckRBRUxJQWMxQWhRZ0JTa0RDQ0lCUVFFZ0NIU3NmRlFFUUNBQVFkL3lBRUVBRUZBTUFRc2dBYWNnQWlnQ0NDQUhLQUlRYW1vaEFBSkFBa0FDUUFKQUFrQWdCRUVXYXc0S0FBQUJBUUlDQXdNQ0F3UUxJQUFnQlNnQ0ZEb0FBRUtBZ0lDQU1DRUpEQVFMSUFBZ0JTOEJGQ0lBUVFoMElBQkJDSFp5SUFBZ0JoczdBQUJDZ0lDQWdEQWhDUXdEQ3lBQUlBVW9BaFFpQUVFWWRDQUFRWUQrQTNGQkNIUnlJQUJCQ0haQmdQNERjU0FBUVJoMmNuSWdBQ0FHR3pZQUFFS0FnSUNBTUNFSkRBSUxJQUFnQlNrREdDSUJRamlHSUFGQ2dQNERnMElvaG9RZ0FVS0FnUHdIZzBJWWhpQUJRb0NBZ1BnUGcwSUlob1NFSUFGQ0NJaENnSUNBK0ErRElBRkNHSWhDZ0lEOEI0T0VJQUZDS0loQ2dQNERneUFCUWppSWhJU0VJQUVnQmhzM0FBQkNnSUNBZ0RBaENRd0JDeEFCQUFzZ0JVRWdhaVFBSUFrTEJnQkI2TVlFQzZJSEFnRitCSDhqQUVFUWF5SUhKQUJDZ0lDQWdPQUFJUVVDUUNBQUlBRkJJQkJMSWdoRkRRQWdCRUhscGdGcUxRQUFJUWtnQUNBSFFRaHFJQU1wQXdBUXBnRU5BRUVCSVFZZ0FrRUNUZ1JBSUFBZ0F5a0RDQkQ5QVVFQmN5RUdDeUFJS0FJTUtBSWdJZ0l0QUFRRVFDQUFFR3NNQVFzZ0NEVUNGQ0FIS1FNSUlnRkJBU0FKZEt4OFZBUkFJQUJCMy9JQVFRQVFVQXdCQ3lBQnB5QUNLQUlJSUFnb0FoQnFhaUVDQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUVRUlpyRGdvS0FBRUNBd1FGQmdjSUNRc2dBakVBQUNFRkRBb0xJQUl2QUFBaUFFRUlkQ0FBUVFoMmNpQUFJQVlicmNOQy8vLy8vdytESVFVTUNRc2dBaThBQUNJQVFRaDBJQUJCQ0haeUlBQWdCaHV0UXYvL0E0TWhCUXdJQ3lBQ0tBQUFJZ0JCR0hRZ0FFR0EvZ054UVFoMGNpQUFRUWgyUVlEK0EzRWdBRUVZZG5KeUlBQWdCaHV0SVFVTUJ3c2dBaWdBQUNJQVFSaDBJQUJCZ1A0RGNVRUlkSElnQUVFSWRrR0EvZ054SUFCQkdIWnljaUFBSUFZYklnQkJBRTRFUUNBQXJTRUZEQWNMUW9DQWdJREFmaUFBdUwwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeUVGREFZTElBQWdBaWtBQUNJQlFqaUdJQUZDZ1A0RGcwSW9ob1FnQVVLQWdQd0hnMElZaGlBQlFvQ0FnUGdQZzBJSWhvU0VJQUZDQ0loQ2dJQ0ErQStESUFGQ0dJaENnSUQ4QjRPRUlBRkNLSWhDZ1A0RGd5QUJRamlJaElTRUlBRWdCaHNRaHdJaEJRd0ZDeUFBSUFJcEFBQWlBVUk0aGlBQlFvRCtBNE5DS0lhRUlBRkNnSUQ4QjROQ0dJWWdBVUtBZ0lENEQ0TkNDSWFFaENBQlFnaUlRb0NBZ1BnUGd5QUJRaGlJUW9DQS9BZURoQ0FCUWlpSVFvRCtBNE1nQVVJNGlJU0VoQ0FCSUFZYkVQc0RJUVVNQkF0Q2dJQ0FnTUIrSUFJb0FBQWlBRUVZZENBQVFZRCtBM0ZCQ0hSeUlBQkJDSFpCZ1A0RGNTQUFRUmgyY25JZ0FDQUdHNzY3dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJJUVVNQXd0Q2dJQ0FnTUIrSUFJcEFBQWlBVUk0aGlBQlFvRCtBNE5DS0lhRUlBRkNnSUQ4QjROQ0dJWWdBVUtBZ0lENEQ0TkNDSWFFaENBQlFnaUlRb0NBZ1BnUGd5QUJRaGlJUW9DQS9BZURoQ0FCUWlpSVFvRCtBNE1nQVVJNGlJU0VoQ0FCSUFZYklnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNoQlF3Q0N4QUJBQXNnQWpBQUFFTC8vLy8vRDRNaEJRc2dCMEVRYWlRQUlBVUxVZ0lCZndGK1FvQ0FnSURnQUNFRUlBQWdBU0FDRUpNQklnTUVmaUFES0FJZ0lnTW9BZ3dvQWlBdEFBUUVRQ0FDUlFSQVFnQVBDeUFBRUd0Q2dJQ0FnT0FBRHdzZ0F6VUNGQVZDZ0lDQWdPQUFDd3ZYQVFFRGZ3SkFJQUZDZ0lDQWdIQlVEUUFnQWFjaUF5OEJCa0U1UncwQUlBTW9BaUFpQkVVTkFDQUVRY3dBYWlFRElBUkJ5QUJxSVFVRFFDQUZJQU1vQWdBaUEwY0VRQ0FES1FNUUlnRkNnSUNBZ0dCYUJFQWdBQ0FCcHlBQ0VRQUFDeUFES1FNWUlnRkNnSUNBZ0dCYUJFQWdBQ0FCcHlBQ0VRQUFDeUFES1FNZ0lnRkNnSUNBZ0dCYUJFQWdBQ0FCcHlBQ0VRQUFDeUFES1FNb0lnRkNnSUNBZ0dCYUJFQWdBQ0FCcHlBQ0VRQUFDeUFEUVFScUlRTU1BUXNMSUFRb0FnUkJmbkZCQkVZTkFDQUFJQVJCQ0dvZ0FoRHZBd3NMQmdCQjRNWUVDekFCQVg4Q1FDQUJRb0NBZ0lCd1ZBMEFJQUduSWdJdkFRWkJPVWNOQUNBQ0tBSWdJZ0pGRFFBZ0FDQUNFSWNGQ3dzTkFDQUFJQUVnQWtFM0VQMEZDd3NBSUFBZ0FVRTNFUDRGQ3hZQkFYOGdBYWNvQWlBaUFnUkFJQUFnQWhDSUJRc0xNUUVCZnlBQnB5Z0NJQ0lDQkVBZ0FDQUNLQUlJRUtNRklBQWdBaWtEQUJBaklBQkJFR29nQWlBQUtBSUVFUUFBQ3d2Y0FRRUVmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lCQzhCQmtFeFJ3MEFJQVFvQWlBaUJrVU5BRUVBSVFRRFFDQUVRUUpHUlFSQUlBWWdCRUVEZEdvaUJVRUlhaUVESUFWQkJHb2hCUU5BSUFVZ0F5Z0NBQ0lEUndSQUlBTXBBd2dpQVVLQWdJQ0FZRm9FUUNBQUlBR25JQUlSQUFBTElBTXBBeEFpQVVLQWdJQ0FZRm9FUUNBQUlBR25JQUlSQUFBTElBTXBBeGdpQVVLQWdJQ0FZRm9FUUNBQUlBR25JQUlSQUFBTElBTkJCR29oQXd3QkN3c2dCRUVCYWlFRURBRUxDeUFHS1FNWUlnRkNnSUNBZ0dCVURRQWdBQ0FCcHlBQ0VRQUFDd3VNQVFFRmZ3SkFJQUZDZ0lDQWdIQlVEUUFnQWFjaUFpOEJCa0V4UncwQUlBSW9BaUFpQkVVTkFBTkFJQU5CQWtaRkJFQWdCQ0FEUVFOMGFpSUNRUVJxSVFVZ0FpZ0NDQ0VDQTBBZ0FpQUZSa1VFUUNBQ0tBSUVJUVlnQUNBQ0VLNENJQVloQWd3QkN3c2dBMEVCYWlFRERBRUxDeUFBSUFRcEF4Z1FJeUFBUVJCcUlBUWdBQ2dDQkJFQUFBc0xKUUFnQlNrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FBc2dBUXN4QUNBRktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUFpQUNLQUlBUVFGcU5nSUFDeUFBSUFFUWlnRkNnSUNBZ09BQUN3WUFRZGpHQkF2WUFRRUNmaU1BUVJCcklnSWtBQ0FGS1FNQUlRWWdBaUFBSUFVcEF3aENnSUNBZ0RCQkFFRUFFQ0VpQVRjRENBSkFJQUZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFZZ0FpQUNRUWhxUVFBUS9nRWhCaUFBSUFJcEF3Z1FEeUFHUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQmlFQkRBRUxJQUlnQUVIUUFFSFJBQ0FFRzBFQVFRQkJBU0FERU04QklnYzNBd0JDZ0lDQWdPQUFJUUVnQUNBSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkg0Z0FDQUdRZjhBUVFFZ0FoQ3RBaUVCSUFJcEF3QUZJQVlMRUE4TElBSkJFR29rQUNBQkM2SUNBUUorSXdCQklHc2lBaVFBSUFNcEF3QWhCQUpBSUFBZ0FVS0FnSUNBTUJEakFTSUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQUNRQ0FBSUFRUU9FVUVRQ0FFUWlDSXAwRjFUd1JBSUFTbklnTWdBeWdDQUVFQ2FqWUNBQXNnQWlBRU53TVlJQUlnQkRjREVBd0JDeUFDSUFRM0F3Z2dBaUFGTndNQVFRQWhBd05BSUFOQkFrWU5BU0FDUVJCcUlBTkJBM1JxSUFCQnp3QkJBU0FEUVFJZ0FoRFBBU0lFTndNQUlBUkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQURRUUZHQkVBZ0FDQUNLUU1RRUE4TElBQWdCUkFQUW9DQWdJRGdBQ0VGREFNRklBTkJBV29oQXd3QkN3QUxBQXNnQUNBRkVBOGdBQ0FCUWY4QVFRSWdBa0VRYWhDc0FpRUZJQUFnQWlrREVCQVBJQUFnQWlrREdCQVBDeUFDUVNCcUpBQWdCUXM1QUNNQVFSQnJJZ0lrQUNBQ1FvQ0FnSUF3TndNQUlBSWdBeWtEQURjRENDQUFJQUZCL3dCQkFpQUNFS3dDSVFFZ0FrRVFhaVFBSUFFTHVBRUNBbjRDZnlNQVFSQnJJZ1lrQUFKQUFrQWdBQ0FCUVRFUVN3UkFJQUFnQVVLQWdJQ0FNQkRqQVNJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJZ0FDQUdJQVFRdndJaEJTQUFJQVFRRHlBRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FDQUJJQU1nQmhDdkFpRUNBMEFnQjBFQ1JrVUVRQ0FBSUFZZ0IwRURkR29wQXdBUUR5QUhRUUZxSVFjTUFRc0xJQUpGRFFFZ0FDQUZFQThMUW9DQWdJRGdBQ0VFREFFTElBVWhCQXNnQmtFUWFpUUFJQVFMSUFBZ0FVSWdpS2RCZFU4RVFDQUJweUlBSUFBb0FnQkJBV28yQWdBTElBRUw1UU1CQlg0akFFRXdheUlDSkFBQ1FDQUJRdi8vLy85dldBUkFJQUFRSkVLQWdJQ0E0QUFoQlF3QkN5QUFJQUpCSUdvZ0FSQy9BaUlGUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUJDZ0lDQWdEQWhCa0tBZ0lDQU1DRUVBa0FDUUNBQUlBRkJnQUVnQVVFQUVCUWlDRUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQ0JCZ0RRQWdBQ0FES1FNQVFRQVE1d0VpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBREFFTElBQWdCRUhxQUNBRVFRQVFGQ0lHUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFEUUNBQ0lBQWdCQ0FHSUFKQkZHb1FyZ0VpQnpjREdDQUhRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBaWdDRkEwQ0lBQWdDQ0FCUVFFZ0FrRVlhaEFoSVFjZ0FDQUNLUU1ZRUE4Z0IwS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBQWdBQ0FIUWY4QVFRSWdBa0VnYWhDdEFoRDhBVVVOQVFzTElBQWdCRUVCRUswQkdnc2dBQ2dDRUNJREtRT0FBU0VCSUFOQ2dJQ0FnQ0EzQTRBQklBSWdBVGNEQ0NBQUlBSXBBeWhDZ0lDQWdEQkJBU0FDUVFocUVDRWhBU0FBSUFJcEF3Z1FEeUFBSUFVZ0FTQUJRb0NBZ0lCd2cwS0FnSUNBNEFCUklnTWJFQTlDZ0lDQWdPQUFJQVVnQXhzaEJRc2dBQ0FJRUE4Z0FDQUdFQThnQUNBRUVBOGdBQ0FDS1FNZ0VBOGdBQ0FDS1FNb0VBOExJQUpCTUdva0FDQUZDeDRBSUFBZ0FUWUNjQ0FBSUFFRWZ5QUFLQUowSUFGckJVRUFDellDZUF2ekF3SUZmZ0YvSXdCQklHc2lBaVFBSUFBZ0JTa0RBQkQ5QVNFTElBSWdCU2tERUNJSU53TVlJQVVwQXlBaENpQUZLUU1ZSVFrQ1FBSkFJQUFnQWtFVWFpQUZLUU1JRUhjTkFBSkFJQXNOQUNBRlFvR0FnSUFRTndNQUFrQWdCRUVEY1NJRlFRRkdCRUJDZ0lDQWdPQUFJUUVnQUJBMElnWkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkJBSkFJQUJCN3ZjQVFiNzZBQ0FFUVFSeElnUWJFR0lpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0JrR0lBU0FIUVFjUUdVRUFTQTBBSUFNcEF3QWlCMElnaUtkQmRVOEVRQ0FIcHlJRElBTW9BZ0JCQVdvMkFnQUxJQUFnQmtHSkFVSEFBQ0FFR3lBSFFRY1FHVUVBVGcwQ0N5QUFJQVlRRHd3RUN5QURLUU1BSWdaQ0lJaW5RWFZKRFFBZ0JxY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBZ2dBaWdDRkNBR1FRY1Fyd0ZCQUVnTkFVS0FnSUNBNEFBaEFTQUFJQXBCZnhEZUF5SURRUUJJRFFJZ0EwVU5BQUpBSUFWQkFrWUVRQ0FDSUFBZ0NCQ0NCU0lHTndNSUlBWkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkJDQUFJQWxDZ0lDQWdEQkJBU0FDUVFocUVDRWhBU0FBSUFJcEF3Z1FEd3dCQ3lBQUlBbENnSUNBZ0RCQkFTQUNRUmhxRUNFaEFRc2dBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQUFnQVJBUEMwS0FnSUNBTUNFQkRBRUxRb0NBZ0lEZ0FDRUJDeUFDUVNCcUpBQWdBUXVwQ0FJRGZ3MStJd0JCOEFCcklnVWtBQ0FGUW9DQWdJQXdOd05RQWtBZ0FVTC8vLy8vYjFnRVFDQUFFQ1JDZ0lDQWdPQUFJUXdNQVFzZ0FDQUZRZUFBYWlBQkVMOENJZ3hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BRUtBZ0lDQU1DRU5Rb0NBZ0lBd0lRaENnSUNBZ0RBaEN3SkFBa0FnQUNBQlFZQUJJQUZCQUJBVUloSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQklRWUEwQUFrQWdBQ0FES1FNQVFRQVE1d0VpQzBLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBREFFTElBQWdDMEhxQUNBTFFRQVFGQ0lOUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQlNBQUVENGlEamNEVUNBT1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FCQStJZ2hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRUtBZ0lDQTRBQWhDQXdDQ3lBQUlBaENBRUlCUVFjUXZRRkJBRWdOQVNBRlFlQUFhaUFFUVFKR1FRTjBjaUVHSUFVcEEyQWlFMElnaUtkQmRFc2hCeUFGS1FOb0loUkNJSWluUVhWSklRTUNRQUpBQWtBRFFDQUZJQUFnQ3lBTklBVkJER29RcmdFaUNUY0RXQ0FKUW9DQWdJQndnMEtBZ0lDQTRBQlJEUVVnQlNnQ0RFVUVRQ0FBSUJJZ0FVRUJJQVZCMkFCcUVDRWhFU0FBSUFVcEExZ1FEeUFSUW9DQWdJQndnMEtBZ0lDQTRBQlJEUVFnQlNBT053TWdJQVVnRURjREdDQUZRb0NBZ0lBUU53TVFJQVlwQXdBaENTQUZJQWczQXpBZ0JTQUpOd01vSUFCQnpnQkJBU0FFUVFVZ0JVRVFhaERQQVNJS1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJQ1FDQUVRUUZHQkVBZ0NpRVBJQUJCemdCQkFVRUZRUVVnQlVFUWFoRFBBU0lLUW9DQWdJQndnMEtBZ0lDQTRBQlJEUVFNQVFzQ1FDQUVRUUpHQkVBZ0FDQU9JQkNuUW9DQWdJQXdRUWNRcndGQkFFZ05CeUFUSWdraER5QUhEUUVNQWdzZ0NpRVBJQlFpQ1NFS0lBTU5BUXNnQ2FjaUFpQUNLQUlBUVFGcU5nSUFDeUFBSUFoQkFSRGVBMEVBU0FSQUlBQWdFUkFQSUFBZ0R4QVBEQVFMSUFVZ0NqY0RTQ0FGSUE4M0EwQWdBQ0FSUWY4QVFRSWdCVUZBYXhDdEFpRUpJQUFnRHhBUElBQWdDaEFQSUJCQ0FYd2hFQ0FBSUFrUS9BRkZEUUVNQkFzTElBQWdDRUYvRU40RElnSkJBRWdOQkNBQ1JRMEZJQVJCQWtZRVFDQUFJQTRRZ2dVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRklBQWdEaEFQSUFVZ0FUY0RVQXNnQUNBQUlBWXBBd0JDZ0lDQWdEQkJBU0FGUWRBQWFoQWhFUHdCRFFRTUJRc2dFU0VLQ3lBQUlBb1FEd3NnQUNBTFFRRVFyUUVhREFFTEN5QUFLQUlRSWdJcEE0QUJJUUVnQWtLQWdJQ0FJRGNEZ0FFZ0JTQUJOd01BSUFBZ0JTa0RhQ0lVUW9DQWdJQXdRUUVnQlJBaElRRWdBQ0FGS1FNQUVBOGdBQ0FNSUFFZ0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVNJQ0d4QVBRb0NBZ0lEZ0FDQU1JQUliSVF3Z0JTa0RZQ0VUQ3lBQUlCSVFEeUFBSUFnUUR5QUFJQVVwQTFBUUR5QUFJQTBRRHlBQUlBc1FEeUFBSUJNUUR5QUFJQlFRRHdzZ0JVSHdBR29rQUNBTUN5QUFJQUZDSUlpblFYVlBCRUFnQWFjaUFDQUFLQUlBUVFGcU5nSUFDeUFCQ3pRQUlBTXBBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFBZ0FTQUFJQVVwQXdBUS9RRVEvd0lMb0FZQ0FuOERmaU1BUVVCcUlnVWtBRUtBZ0lDQTRBQWhCd0pBSUFBZ0JVRWdhaEROQWlJSVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBQ1FDQUFJQVZCSUdvQ2Z3SkFBa0FDUUFKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQmk4QkJrRTNSdzBBSUFZb0FpQWlCZzBCQ3lBQVFmUStRUUFRRlF3QkN3SkFJQVJGQkVBZ0Jpa0RDQ0lIUWlDSXAwRjFTUTBCSUFlbklnUWdCQ2dDQUVFQmFqWUNBQXdCQ3lBQUlBWXBBd0FpQVVFR1FSY2dCRUVCUmhzZ0FVRUFFQlFpQjBLQWdJQ0FjSU1pQVVLQWdJQ0FJRklFUUNBQlFvQ0FnSURnQUZFTkFpQUJRb0NBZ0lBd1VnMEJDeUFES1FNQUlnRkNJSWluSVFJZ0JFRUJSZ1JBSUFKQmRVOEVRQ0FCcHlJQ0lBSW9BZ0JCQVdvMkFnQUxJQVVnQUNBQlFRRVEvd0kzQXdCQkFBd0VDeUFDUVhWUEJFQWdBYWNpQWlBQ0tBSUFRUUZxTmdJQUN3d0NDeUFGSUFBZ0Jpa0RBQ0FISUFKQkFFb2dBeUFGUVJScUVNY0ZJZ0UzQXhnZ0FDQUhFQThnQVVLQWdJQ0FjSU1pQjBLQWdJQ0E0QUJSRFFBZ0JTZ0NGRUVDUmdSQUlBVWdBQ0FCSUFWQkZHb1Eyd1VpQnpjREdDQUFJQUVRRHlBSFFvQ0FnSUJ3Z3lJSFFvQ0FnSURnQUZFTkFRc2dCMEtBZ0lDQTRBQlJEUUFnQUNBQUtRTlFJQVVnQlVFWWFrRUFFUDRCSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUlBVXBBeGdRRHd3QkN5QUZJQVVvQWhSQkFFZXRRb0NBZ0lBUWhEY0RPQ0FGSUFCQnpRQkJBVUVBUVFFZ0JVRTRhaERQQVNJSk53TUFRb0NBZ0lEZ0FDRUhJQWxDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FBSUFVcEF4Z1FEeUFGUW9DQWdJQXdOd01JSUFBZ0FTQUZJQVZCSUdvUXJ3SWhBaUFBSUFrUUR5QUFJQUVRRHlBQUlBVXBBeUFRRHlBQUlBVXBBeWdRRHlBQ1JRMEVJQUFnQ0JBUERBVUxJQUFnQVJBUElBQWdCU2tER0JBUElBQWdCU2tESUJBUElBQWdCU2tES0JBUElBQWdDQkFQREFRTElBQW9BaEFpQWlrRGdBRWhBU0FDUW9DQWdJQWdOd09BQVFzZ0JTQUJOd01BUVFFTFFRTjBjaWtEQUVLQWdJQ0FNRUVCSUFVUUlTRUJJQUFnQlNrREFCQVBJQUFnQVJBUElBQWdCU2tESUJBUElBQWdCU2tES0JBUEN5QUlJUWNMSUFWQlFHc2tBQ0FIQzlBQ0FnTitBbjhqQUVFUWF5SUdKQUFnQVVFRlJnUkFJQUlwQXhBaEJDQUFJQUlwQXhnUS9RRWhCeUFHSUFJcEF5QWlBemNEQ0FKL0FrQUNRQ0FFUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FEUWlDSXB5RUJJQWNFUUNBQlFYVlBCRUFnQTZjaUFTQUJLQUlBUVFGcU5nSUFDeUFBSUFNUWlnRU1Bd3NnQVVGMVNRMEJJQU9uSWdFZ0FTZ0NBRUVCYWpZQ0FBd0JDeUFBSUFSQ2dJQ0FnREJCQVNBR1FRaHFFQ0VoQXdzZ0JpQUROd01BUVFBZ0EwS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkdnc2dBQ2dDRUNJQktRT0FBU0VESUFGQ2dJQ0FnQ0EzQTRBQklBWWdBemNEQUVFQkN5RUJRb0NBZ0lBd0lRUWdBQ0FDSUFGQkEzUnFLUU1BSWdWQ2dJQ0FnSENEUW9DQWdJQXdVZ1IrSUFBZ0JVS0FnSUNBTUVFQklBWVFJU0VFSUFZcEF3QUZJQU1MRUE4Z0JrRVFhaVFBSUFRUEMwR2VpZ0ZCcnZ3QVFkZnBBa0g5L0FBUUFBQUxuZ0lCQVg5QkFDRUNBa0FnQlNrREFDSUJRb0NBZ0lCd1ZBMEFJQUduSWdVdkFRWkJPVWNOQUNBRktBSWdJUUlMSUFSQkFYRWhCU0FDS0FJRUlRWWdBeWtEQUNFQkFrQUNRQUpBSUFSQkFrNEVRQ0FHUVg1eFFRUkhEUUlnQWtFRk5nSUVJQVVFUUNBQUlBSW9Ba3dnQVJEZkF3d0NDeUFBSUFJZ0FVRUJFUG9DREFFTElBWkJBMGNOQWlBQ0lBVTJBaFFnQVVJZ2lLY2hBd0pBSUFVRVFDQURRWFZQQkVBZ0FhY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBRVFpZ0VNQVFzZ0EwRjFUd1JBSUFHbklnTWdBeWdDQUVFQmFqWUNBQXNnQWlnQ1JFRUlheUFCTndNQUN5QUFJQUlRaFFVTFFvQ0FnSUF3RHd0QjU0Y0JRYTc4QUVIVG1RRkIyY3NBRUFBQUMwSEJoUUZCcnZ3QVFkeVpBVUhaeXdBUUFBQUxqZ01DQW44Q2ZpTUFRU0JySWdJa0FBSkFJQUZDZ0lDQWdIQlVEUUFnQWFjaUJTOEJCa0U1UncwQUlBVW9BaUFoQmdzQ1FDQUFJQUpCRUdvUXpRSWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQVpGQkVBZ0FFSDRMMEVBRUJVZ0FDZ0NFQ0lES1FPQUFTRUhJQU5DZ0lDQWdDQTNBNEFCSUFJZ0J6Y0RDQ0FBSUFJcEF4Z2lCMEtBZ0lDQU1FRUJJQUpCQ0dvUUlTRUlJQUFnQWlrRENCQVBJQUFnQ0JBUElBQWdBaWtERUJBUElBQWdCeEFQREFJTElBQkJNQkJmSWdVRVFDQUZJQVEyQWdnZ0F5a0RBQ0lIUWlDSXAwRjFUd1JBSUFlbklnTWdBeWdDQUVFQmFqWUNBQXNnQlNBSE53TVFJQUZDSUlpblFYVlBCRUFnQWFjaUF5QURLQUlBUVFGcU5nSUFDeUFGSUFFM0F4Z2dCU0FDS1FNUU53TWdJQVVnQWlrREdEY0RLQ0FHS0FKSUlnTWdCVFlDQkNBRklBWkJ5QUJxTmdJRUlBVWdBellDQUNBR0lBVTJBa2dnQmlnQ0JFRURSZzBDSUFBZ0JoQ0ZCUXdDQ3lBQUlBSXBBeEFRRHlBQUlBSXBBeGdRRHlBQUlBRVFEd3RDZ0lDQWdPQUFJUUVMSUFKQklHb2tBQ0FCQzlzQkFnRi9BbjRqQUVFZ2F5SURKQUFnQVVFRFJnUkFJQUlwQXhBaEJDQUNLUU1JSVFVQ1FDQUFJQU5CRUdvZ0Fpa0RBQkNrQlVFQVNBUkFRb0NBZ0lEZ0FDRUVEQUVMSUFBZ0JDQUZRUUlnQTBFUWFoQWhJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FBS0FJUUlnRXBBNEFCSVFRZ0FVS0FnSUNBSURjRGdBRWdBeUFFTndNSUlBQWdBeWtER0VLQWdJQ0FNRUVCSUFOQkNHb1FJU0VFSUFBZ0F5a0RDQkFQQ3lBQUlBTXBBeEFRRHlBQUlBTXBBeGdRRHdzZ0EwRWdhaVFBSUFRUEMwSHdpZ0ZCcnZ3QVFidnFBa0dTL1FBUUFBQUxFd0FnQUNnQ0FDQUJJQUlnQUNnQ0JCRUJBQXNKQUNBQUlBRVFqd1VMZEFJQmZnRi9JQUFnQVJDUEJTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBUThMUVFvaEJRSitBa0FnQWtVTkFDQURLUU1BSWdSQ2dJQ0FnSENEUW9DQWdJQXdVUTBBSUFBZ0JCQ09CU0lGUVFCT0RRQkNnSUNBZ09BQURBRUxJQUFnQVNBRkVKb0ZDeUVFSUFBZ0FSQVBJQVFMelJBQ0NuOENmaU1BUWFBSWF5SUJKQUFDZjBHQUNCQ3hBU0lJSVFSQnhpSkJLeENtQXlFRkFrQUNRRUhVL1FCQjl3QVFwZ05GQkVCQm9OUUVRUncyQWdBTUFRdEJzQWxCc0JFZ0JCc1FzUUVpQWcwQkMwRUFEQUVMSUFKQkFFR2tBUkFyR2lBQ1FYODJBbEFnQWtGL05nSThJQUlnQWtHUUFXbzJBbFFnQWtHQUNEWUNNQ0FDSUFKQnJBRnFOZ0lzSUFSRkJFQWdBa0dzQ1dvaUJFRUFRWUFJRUNzYUN5QUNRZmNBTmdLZ0FTQUNRWUFJTmdLWUFTQUNJQVEyQXB3QkFrQWdCVVVFUUNBQ1FRUTJBZ0FNQVFzZ0JFRUFPZ0FBQ3lBQ1FRRTJBaWdnQWtFQ05nSWtJQUpCQXpZQ0lDQUNRUVEyQWd4QnJkVUVMUUFBUlFSQUlBSkJmellDVEFzZ0FrR2sxQVFvQWdBaUJEWUNPQ0FFQkVBZ0JDQUNOZ0kwQzBHazFBUWdBallDQUNBQ0N5RUNJQUFnQVVHZ0JHb1FtQVVnQVVFZ05nS1FCQ0FCSUFFMEFxZ0VOd09ZQkNBQ1FmMmRBU0FCUVpBRWFoQ1VBU0FBQkVBZ0FFRVFhaUVGQTBBZ0EwRUZSd1JBSUFVZ0EwRURkQ0lKUWJTa0FXb29BZ0FpQkNBQUtBSUFFUU1BSWdZRVFDQUVJQVlnQUNnQ0RCRUVBQ0lLVFFSQUlBRWdDVUd3cEFGcUtBSUFOZ0tJQkNBQklBUTJBb0FFSUFFZ0NpQUVhellDaEFRZ0FrRy9tZ0VnQVVHQUJHb1FsQUZCQVNFSEN5QUZJQVlnQUNnQ0JCRUFBQXNnQTBFQmFpRUREQUVMQ3lBSFJRUkFRZEdhQVVFaElBSVFvd1lMSUFGQnNBWnFRUUJCN0FFUUt4b2dBRUhVQUdvaEF5QUFRZEFBYWlFRUEwQWdCQ0FES0FJQUlnTkhCRUFnQTBFRWF5MEFBRUVQY1VVRVFDQUJRYkFHYWtFNklBTkJBbXN2QVFBaUJTQUZRVHBQRzBFQ2RHb2lCU0FGS0FJQVFRRnFOZ0lBQ3lBRFFRUnFJUU1NQVFzTFFRRWhBMEdNbWdGQkVpQUNFS01HSUFFb0FyQUdJZ1FFUUNBQlFlVGtBRFlDK0FNZ0FVRUFOZ0wwQXlBQklBUTJBdkFESUFKQnJwb0JJQUZCOEFOcUVKUUJDd05BSUFOQk9rY0VRQ0FCUWJBR2FpQURRUUowYWlnQ0FDSUVCRUFnQVNBQUlBRkI4QVZxSUFOQkRHeEJoSjhCYWlnQ0FCQ0dCVFlDNkFNZ0FTQUROZ0xrQXlBQklBUTJBdUFESUFKQnJwb0JJQUZCNEFOcUVKUUJDeUFEUVFGcUlRTU1BUXNMSUFFb0FwZ0lJZ0FFUUNBQlFjckZBRFlDMkFNZ0FVRUFOZ0xVQXlBQklBQTJBdEFESUFKQnJwb0JJQUZCMEFOcUVKUUJDd0pBQWtBZ0FpZ0NUQ0lBUVFCT0JFQWdBRVVOQVVIQTFBUW9BZ0FnQUVILy8vLy9lM0ZIRFFFTEFrQWdBaWdDVUVFS1JnMEFJQUlvQWhRaUFDQUNLQUlRUmcwQUlBSWdBRUVCYWpZQ0ZDQUFRUW82QUFBTUFnc2dBaERUQkF3QkN5QUNJQUlvQWt3aUFFSC8vLy8vQXlBQUd6WUNUQUpBQWtBZ0FpZ0NVRUVLUmcwQUlBSW9BaFFpQUNBQ0tBSVFSZzBBSUFJZ0FFRUJhallDRkNBQVFRbzZBQUFNQVFzZ0FoRFRCQXNnQWlnQ1RCb2dBa0VBTmdKTUN3c2dBVUdXaGdFMkFzZ0RJQUZCdjRFQk5nTEVBeUFCUWErR0FUWUN3QU1nQWtHZm1nRWdBVUhBQTJvUWxBRWdBU2tEdUFRaUMxQkZCRUFnQVNBQktRT2dCQ0lNTndPd0F5QUJJQXMzQTZnRElBRWdETGtnQzdtak9RTzRBeUFCUWZmM0FEWUNvQU1nQWtIVG5BRWdBVUdnQTJvUXBBRWdBVUVJTmdLSUF5QUJJQUVwQTdBRUlnczNBNEFESUFFZ0FTa0RvQVFnQzMyNUlBRXBBOEFFSWd1NW96a0RrQU1nQVVHSStBQTJBdkFDSUFFZ0N6Y0QrQUlnQWtINW5BRWdBVUh3QW1vUXBBRUxJQUVwQThnRUlndFFSUVJBSUFFZ0FTa0QwQVFpRERjRDRBSWdBU0FMTndQWUFpQUJJQXk1SUF1NW96a0Q2QUlnQVVITE56WUMwQUlnQWtHdW5BRWdBVUhRQW1vUXBBRUxJQUVwQTlnRUlndFFSUVJBSUFFZ0FTa0Q0QVFpRERjRHdBSWdBU0FMTndPNEFpQUJJQXk1SUF1NW96a0R5QUlnQVVHdk9EWUNzQUlnQWtHd25RRWdBVUd3QW1vUXBBRUxJQUVwQStnRUlndFFSUVJBSUFFZ0FTa0Q4QVFpRERjRG9BSWdBU0FMTndPWUFpQUJJQXk1SUF1NW96a0RxQUlnQVVHcU5EWUNrQUlnQWtIZW13RWdBVUdRQW1vUXBBRWdBU0FCS1FPQUJUY0RnQUlnQVNBQktRUDRCQ0lMdVNBQktRUG9CTG1qT1FPSUFpQUJRZFE2TmdMd0FTQUJJQXMzQS9nQklBSkIzcHNCSUFGQjhBRnFFS1FCSUFFZ0FTa0RrQVVpQ3pjRDRBRWdBU0FMdVNBQktRT0lCU0lMdWFNNUErZ0JJQUZCdkRrMkF0QUJJQUVnQ3pjRDJBRWdBa0hYblFFZ0FVSFFBV29RcEFFTEFrQWdBU2tEbUFVaUMxQU5BQ0FCSUFFcEE2QUZOd1BBQVNBQlFmUTJOZ0t3QVNBQklBczNBN2dCSUFKQmdKc0JJQUZCc0FGcUVKUUJJQUVnQVNrRHFBVWlDemNEb0FFZ0FTQUx1U0FCS1FPWUJTSUx1YU01QTZnQklBRkJzTzBBTmdLUUFTQUJJQXMzQTVnQklBSkJoWndCSUFGQmtBRnFFS1FCSUFFcEE3QUZJZ3RRRFFBZ0FTQUJLUU80QlNJTU53T0FBU0FCSUFzM0EzZ2dBU0FNdVNBTHVhTTVBNGdCSUFGQmxlVUFOZ0p3SUFKQmhad0JJQUZCOEFCcUVLUUJDeUFCS1FQQUJTSUxVRVVFUUNBQklBczNBMmdnQVVHSE56WUNZQ0FDUWZPYUFTQUJRZUFBYWhDVUFRc0NRQ0FCS1FQSUJTSUxVQTBBSUFFZ0N6Y0RXQ0FCUWVreU5nSlFJQUpCODVvQklBRkIwQUJxRUpRQklBRXBBOUFGSWd0UURRQWdBU0FMTndOSUlBRkI0akkyQWtBZ0FrSHptZ0VnQVVGQWF4Q1VBU0FCSUFFcEE5Z0ZJZ3RDQTRZM0F6QWdBU0FMdVNBQktRUFFCYm1qT1FNNElBRkIvek0yQWlBZ0FTQUxOd01vSUFKQnM1c0JJQUZCSUdvUXBBRUxJQUVwQStBRklndFFSUVJBSUFFZ0FTa0Q2QVUzQXhBZ0FVR2pORFlDQUNBQklBczNBd2dnQWtHQW13RWdBUkNVQVFzZ0FpZ0NUQm9nQWhDbEF4b2dBaUFDS0FJTUVRUUFHaUFDTFFBQVFRRnhSUVJBSUFJb0FqUWlBQVJBSUFBZ0FpZ0NPRFlDT0FzZ0FpZ0NPQ0lEQkVBZ0F5QUFOZ0kwQ3lBQ1FhVFVCQ2dDQUVZRVFFR2sxQVFnQXpZQ0FBc2dBaWdDWUJDYkFTQUNFSnNCQ3lBQlFhQUlhaVFBSUFnTG1BRUJBWDhqQUVFZ2F5SUZKQUFDUUNBQUlBVkJER29nQXlrREFCQzdBU0lDQkg0Q1FBSkFBa0FnQkE0Q0FBRUVDMEovSVFFZ0FpZ0NCQTBCSUFJb0FnZ2lBMEVBVEEwQklBTkJBV3V0SVFFTUFRdENmeUVCSUFJb0FnaEJnSUNBZ0hoR0RRQWdBaEN4QXF3aEFRc2dBQ0FDSUFWQkRHb1FYaUFBSUFFUWh3SUZRb0NBZ0lEZ0FBc2hBU0FGUVNCcUpBQWdBUThMRUFFQUMvb0JBZ04rQVg4akFFRWdheUlDSkFCQ2dJQ0FnT0FBSVFFQ1FDQUFFSmNCSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUVKY0JJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQUpBSUFBZ0FrRU1haUFES1FNQUVMc0JJZ05GRFFBZ0JhZEJCR29nQnFkQkJHb2dBeENSQlNFSUlBQWdBeUFDUVF4cUVGNGdDRUV2Y1FSQUlBQWdDQkNFQWd3QkN5QUFJQVVRelFFaEJTQUVCRUFnQUJBK0lnZENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQWRCQUNBRkVLVUJHaUFBSUFkQkFTQUFJQVlRelFFUXBRRWFJQWNoQVF3Q0N5QUFJQVlRRHlBRklRRU1BUXNnQUNBRkVBOGdBQ0FHRUE4TElBSkJJR29rQUNBQkM2NENBZ04rQW44akFFRXdheUlDSkFCQ2dJQ0FnT0FBSVFFQ1FDQUFFSmNCSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUFKQUlBQVFsd0VpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0FrRWNhaUFES1FNQUVMc0JJZ2hGRFFBZ0FDQUNRUWhxSUFNcEF3Z1F1d0VpQTBVRVFDQUFJQWdnQWtFY2FoQmVEQUVMSUFXblFRUnFJQWFuUVFScUlBZ2dBeUFFUVE5eEVPUURJUWtnQUNBSUlBSkJIR29RWGlBQUlBTWdBa0VJYWhCZUlBa0VRQ0FBSUFrUWhBSU1BUXNnQUNBRkVNMEJJUVVnQkVFUWNRUkFJQUFRUGlJSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FDQUhRUUFnQlJDbEFSb2dBQ0FIUVFFZ0FDQUdFTTBCRUtVQkdpQUhJUUVNQWdzZ0FDQUdFQThnQlNFQkRBRUxJQUFnQlJBUElBQWdCaEFQQ3lBQ1FUQnFKQUFnQVF2REFnSUJmZ0ovSXdCQk1Hc2lBaVFBUW9DQWdJRGdBQ0VCQWtBZ0FDQUNRU2hxSUFNcEF3QVFwZ0VOQUNBQUVKY0JJZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFKQkZHb2dBeWtEQ0JDN0FTSUdSUVJBSUFBZ0JSQVBEQUVMSUFBb0F0Z0JJUU1nQWtJQU53SU1JQUpDZ0lDQWdJQ0FnSUNBZnpjQ0JDQUNJQU0yQWdBZ0FrSUJFREFhSUFJZ0Fpa0RLQ0lCcHlJSFFmLy8vLzhEUVFFUXpBRWFJQUlnQWtKL1FmLy8vLzhEUVFFUWRSb2dCYWRCQkdvaUF5QUdJQUlRa3dVYUFrQWdCRVVnQVZCeURRQWdBa0lCRURBYUlBSWdCMEVCYTBILy8vLy9BMEVCRU13QkdpQURJQUlRMHdGQkFFZ05BQ0FDUWdFUU1Cb2dBaUFIUWYvLy8vOERRUUVRekFFYUlBTWdBeUFDUWYvLy8vOERRUUVRNUFFYUN5QUNFQnNnQUNBR0lBSkJGR29RWGlBQUlBVVF6UUVoQVFzZ0FrRXdhaVFBSUFFTDZoTUNBbjRCZnlNQVFkQUJheUlFSkFBZ0FDQUVFSmdGSUFFZ0FSQTBJZ05CcWkwQ2ZpQUVLUU1JSWdKQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFKQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBQ3ViMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVFDQUJJQU5CMytBQUFuNGdCQ2tERUNJQ1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBQ1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVFQWdBU0FEUWJvcUFuNGdCQ2tER0NJQ1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBQ1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVFQWdBU0FEUWFncUFuNGdCQ2tESUNJQ1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBQ1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVFQWdBU0FEUWZvb0FuNGdCQ2tES0NJQ1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBQ1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVFQWdBU0FEUWZyZkFBSitJQVFwQXpBaUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkFJQUVnQTBIWUtBSitJQVFwQXpnaUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkFJQUVnQTBHMjN3QUNmaUFFS1FOQUlnSkNnSUNBZ0FoOFF2Ly8vLzhQV0FSQUlBSkMvLy8vL3crRERBRUxRb0NBZ0lEQWZpQUN1YjBpQWtLQWdJQ0F3SUdBL1A4QWZTQUNRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c1FRQ0FCSUFOQnpTa0NmaUFFS1FOSUlnSkNnSUNBZ0FoOFF2Ly8vLzhQV0FSQUlBSkMvLy8vL3crRERBRUxRb0NBZ0lEQWZpQUN1YjBpQWtLQWdJQ0F3SUdBL1A4QWZTQUNRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c1FRQ0FCSUFOQmwrQUFBbjRnQkNrRFVDSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFlSW9BbjRnQkNrRFdDSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFjL2ZBQUorSUFRcEEyQWlBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFFZ0EwR0dLZ0orSUFRcEEyZ2lBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFFZ0EwR3Q0QUFDZmlBRUtRTndJZ0pDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQUpDLy8vLy93K0REQUVMUW9DQWdJREFmaUFDdWIwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUUNBQklBTkJ4eW9DZmlBRUtRTjRJZ0pDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQUpDLy8vLy93K0REQUVMUW9DQWdJREFmaUFDdWIwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUUNBQklBTkI4T0FBQW40Z0JDa0RnQUVpQWtLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQWtMLy8vLy9ENE1NQVF0Q2dJQ0FnTUIrSUFLNXZTSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCQUlBRWdBMEhONEFBQ2ZpQUVLUU9JQVNJQ1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBQ1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVFQWdBU0FEUVpJcUFuNGdCQ2tEa0FFaUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkFJQUVnQTBHNDRBQUNmaUFFS1FPWUFTSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFkVXFBbjRnQkNrRG9BRWlBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFFZ0EwSHZKd0orSUFRcEE2Z0JJZ0pDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQUpDLy8vLy93K0REQUVMUW9DQWdJREFmaUFDdWIwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUUNBQklBTkI2aWNDZmlBRUtRT3dBU0lDUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FDUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQXJtOUlnSkNnSUNBZ01DQmdQei9BSDBnQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUVBZ0FTQURRZXN6QW40Z0JDa0R1QUVpQWtLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQWtMLy8vLy9ENE1NQVF0Q2dJQ0FnTUIrSUFLNXZTSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCQUlBRWdBMEg3SndKK0lBUXBBOEFCSWdKQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFKQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBQ3ViMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVFDQUJJQU5Cbzk4QUFuNGdCQ2tEeUFFaUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkFJQU1RVXlFQUlBUkIwQUZxSkFBZ0FBdWZBZ0VEZmlBQlF2Ly8vLzl2V0FSQUlBQVFKRUtBZ0lDQTRBQVBDMEtBZ0lDQTRBQWhCUUorSUFBZ0FVRTJJQUZCQUJBVUlnUkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQkJsQUVRTFF3QkN5QUFJQVFRTndzaUJFS0FnSUNBY0lNaUJrS0FnSUNBNEFCU0JINENmaUFBSUFGQk15QUJRUUFRRkNJQlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQVFTOFFMUXdCQ3lBQUlBRVFOd3NpQVVLQWdJQ0FjSU1pQlVLQWdJQ0E0QUJSQkVBZ0FDQUVFQTlDZ0lDQWdPQUFEd3NDUUNBR1FvQ0FnSUNRZjFFRVFDQUVweWdDQkVILy8vLy9CM0ZGRFFFTElBVkNnSUNBZ0pCL1VRUkFJQUduS0FJRVFmLy8vLzhIY1VVTkFRc2dBRUhNbmdFZ0JFSDRtUUVRdmdFaEJBc2dBQ0FFSUFFUXhBSUZRb0NBZ0lEZ0FBc0xYd0VCZndKQUlBRkZCRUFnQWtVTkFTQUFJQUlRMlFNUEN5QUNSUVJBSUFBZ0FDZ0NBRUVCYXpZQ0FDQUFJQUFvQWdSQkNHczJBZ1FnQVJDYkFRd0JDeUFBS0FJSUlBQW9BZ1FnQW1wUEJIOGdBU0FDRVBNRkJVRUFDdzhMUVFBTEpnQWdBUVJBSUFBZ0FDZ0NBRUVCYXpZQ0FDQUFJQUFvQWdSQkNHczJBZ1FnQVJDYkFRc0xDUUFnQUNBQk5nSVlDeWdCQVg4Q1FDQUJweWdDSUNJRFJRMEFJQU1vQWdCQkJFWU5BQ0FBSUFOQkNHb2dBaER2QXdzTFB3RUJmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBaThCQmtFdlJ3MEFJQUlvQWlBaUFrVU5BQ0FBSUFJUTdBTWdBRUVRYWlBQ0lBQW9BZ1FSQUFBTEMwY0JBWDhDUUNBQnB5Z0NJQ0lEUlEwQUlBTXBBd0FpQVVLQWdJQ0FZRm9FUUNBQUlBR25JQUlSQUFBTElBTXBBd2dpQVVLQWdJQ0FZRlFOQUNBQUlBR25JQUlSQUFBTEN6QUJBWDhnQWFjb0FpQWlBZ1JBSUFBZ0Fpa0RBQkFqSUFBZ0Fpa0RDQkFqSUFCQkVHb2dBaUFBS0FJRUVRQUFDd3NuQVFGL0lBR25LQUlnSWdJRVFDQUFJQUlwQXdBUUl5QUFRUkJxSUFJZ0FDZ0NCQkVBQUFzTFdnRUNmeUFCcHlnQ0lDSUNCRUFDUUNBQ0tRTUFJZ0ZDZ0lDQWdIQlVEUUFnQWFjdEFBVkJBbkVOQUNBQ0tBSU1JZ05GRFFBZ0FDQURFT29ESUFJcEF3QWhBUXNnQUNBQkVDTWdBRUVRYWlBQ0lBQW9BZ1FSQUFBTEMzZ0JBMzhDUUNBQnB5Z0NJQ0lFUlEwQUlBUkJDR29oQXlBRVFRUnFJUVVEUUNBREtBSUFJZ01nQlVZTkFRSkFJQVFvQWdBTkFDQURLUU1RSWdGQ2dJQ0FnR0JVRFFBZ0FDQUJweUFDRVFBQUN5QURLUU1ZSWdGQ2dJQ0FnR0JhQkVBZ0FDQUJweUFDRVFBQUN5QURRUVJxSVFNTUFBc0FDd3VhQVFFR2Z5QUJweWdDSUNJREJFQWdBRUVRYWlFRUlBTkJCR29oQmlBREtBSUlJUUlEUUNBQ0lBWkhCRUFnQWlnQ0JDRUhJQUpCRUdzaEJTQUNRUXhyS0FJQVJRUkFBa0FnQXlnQ0FBUkFJQVVRbndVTUFRc2dBQ0FDS1FNUUVDTUxJQUFnQWlrREdCQWpDeUFFSUFVZ0FDZ0NCQkVBQUNBSElRSU1BUXNMSUFRZ0F5Z0NFQ0FBS0FJRUVRQUFJQVFnQXlBQUtBSUVFUUFBQ3d1VUFnRUZmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBeThCQmtFbFJ3MEFJQU1vQWlBaUJVVU5BRUVBSVFNRFFBSkFJQU5CRTBZRVFFRUFJUVFNQVFzZ0JTQURRUUowYWlnQ0NDSUVCRUFnQUNBRUlBSVJBQUFMSUFOQkFXb2hBd3dCQ3dzRFFDQUZLQUpVSUFSTUJFQkJBQ0VFQTBBZ0JDQUZLQUpjVGcwRElBVW9BbUFoQmtFQUlRTURRQ0FEUVE1SEJFQWdCaUFFUVR4c2FpQURRUUowYWlnQ0JDSUhCRUFnQUNBSElBSVJBQUFMSUFOQkFXb2hBd3dCQ3dzZ0JFRUJhaUVFREFBTEFBVWdCU2dDV0NFR1FRQWhBd05BSUFOQkRrY0VRQ0FHSUFSQlBHeHFJQU5CQW5ScUtBSUVJZ2NFUUNBQUlBY2dBaEVBQUFzZ0EwRUJhaUVEREFFTEN5QUVRUUZxSVFRTUFRc0FDd0FMQzgwQ0FRWi9Ba0FnQVVLQWdJQ0FjRlFOQUNBQnB5SUNMd0VHUVNWSERRQWdBaWdDSUNJRVJRMEFRUUFoQWdOQUlBSkJFMFlFUUVFQUlRTURRQ0FFS0FKWUlRVkJBQ0VDSUFRb0FsUWdBMHdFUUNBQVFSQnFJZ1lnQlNBQUtBSUVFUUFBUVFBaEF3TkFJQVFvQW1BaEJVRUFJUUlnQkNnQ1hDQURUQVJBSUFZZ0JTQUFLQUlFRVFBQUlBWWdCQ0FBS0FJRUVRQUFEQVlGQTBBZ0FrRU9Sd1JBSUFVZ0EwRThiR29nQWtFQ2RHb29BZ1FpQndSQUlBQWdCNjFDZ0lDQWdIQ0VFQ01MSUFKQkFXb2hBZ3dCQ3dzZ0EwRUJhaUVEREFFTEFBc0FCUU5BSUFKQkRrY0VRQ0FGSUFOQlBHeHFJQUpCQW5ScUtBSUVJZ1lFUUNBQUlBYXRRb0NBZ0lCd2hCQWpDeUFDUVFGcUlRSU1BUXNMSUFOQkFXb2hBd3dCQ3dBTEFBc2dCQ0FDUVFKMGFpZ0NDQ0lEQkVBZ0FDQURyVUtBZ0lDQWNJUVFJd3NnQWtFQmFpRUNEQUFMQUFzTE5RRUNmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBeThCQmtFalJ3MEFJQU1vQWlBaEFnc2dBRUVRYWlBQ0lBQW9BZ1FSQUFBTEd3RUJmeUFCcHlnQ0lDSURCRUFnQUNBREtBSU1JQUlSQUFBTEMyQUJBMzhnQWFjb0FpQWlBZ1JBSUFJb0Fnd2lBNjFDZ0lDQWdIQ0VJUUVnQXkwQUJVRUNjVVVFUUNBQ0tBSUFJZ01nQWlnQ0JDSUVOZ0lFSUFRZ0F6WUNBQ0FDUWdBM0FnQUxJQUFnQVJBaklBQkJFR29nQWlBQUtBSUVFUUFBQ3d0a0FRSi9JQUduS0FJZ0lnSUVRQUpBQWtBZ0FpMEFCVVVOQUNBQUtBSzhBU0lEUlEwQUlBQW9Bc1FCSUFJb0FnZ2dBeEVBQUF3QkN5QUNLQUlZSWdORkRRQWdBQ0FDS0FJVUlBSW9BZ2dnQXhFR0FBc2dBRUVRYWlBQ0lBQW9BZ1FSQUFBTEN5a0JBWDhnQUNBQnB5SUNOUUlrUW9DQWdJQ1FmNFFRSXlBQUlBSTFBaUJDZ0lDQWdKQi9oQkFqQ3lFQUlBR25LQUlnS1FNQUlnRkNnSUNBZ0dCYUJFQWdBQ0FCcHlBQ0VRQUFDd3NpQVFGL0lBQWdBYWNvQWlBaUFpa0RBQkFqSUFCQkVHb2dBaUFBS0FJRUVRQUFDd29BSUFCQkF4QjJFRk1MWlFFQ2Z3SkFJQUZDZ0lDQWdIQlVEUUFnQWFjaUF5OEJCa0VQUncwQUlBTW9BaUFpQkVVTkFFRUFJUU1EUUNBRElBUXRBQVZQRFFFZ0JDQURRUU4wYWlrRENDSUJRb0NBZ0lCZ1dnUkFJQUFnQWFjZ0FoRUFBQXNnQTBFQmFpRUREQUFMQUFzTFl3RUNmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBaThCQmtFUFJ3MEFJQUlvQWlBaUEwVU5BRUVBSVFJRFFDQUNJQU10QUFWUFJRUkFJQUFnQXlBQ1FRTjBhaWtEQ0JBaklBSkJBV29oQWd3QkN3c2dBRUVRYWlBRElBQW9BZ1FSQUFBTEMzZ0JBbjhnQWFjb0FpQWlCQ2tEQUNJQlFvQ0FnSUJnV2dSQUlBQWdBYWNnQWhFQUFBc2dCQ2tEQ0NJQlFvQ0FnSUJnV2dSQUlBQWdBYWNnQWhFQUFBc0RRQ0FFS0FJUUlBTktCRUFnQkNBRFFRTjBhaWtER0NJQlFvQ0FnSUJnV2dSQUlBQWdBYWNnQWhFQUFBc2dBMEVCYWlFRERBRUxDd3RTQVFKL0lBQWdBYWNvQWlBaUFpa0RBQkFqSUFBZ0Fpa0RDQkFqQTBBZ0F5QUNLQUlRVGtVRVFDQUFJQUlnQTBFRGRHb3BBeGdRSXlBRFFRRnFJUU1NQVFzTElBQkJFR29nQWlBQUtBSUVFUUFBQzRBQkFRUi9JQUduSWdNb0FpQWhCQ0FES0FJa0lRVWdBeWdDS0NJREJFQWdBQ0FESUFJUkFBQUxJQVFFUUFKQUlBVkZEUUJCQUNFREEwQWdBeUFFS0FJOFRnMEJBa0FnQlNBRFFRSjBhaWdDQUNJR1JRMEFJQVl0QUFWQkFYRkZEUUFnQUNBR0lBSVJBQUFMSUFOQkFXb2hBd3dBQ3dBTElBQWdCQ0FDRVFBQUN3dDhBUU4vSUFHbklnSW9BaWdpQXdSQUlBQWdBNjFDZ0lDQWdIQ0VFQ01MSUFJb0FpQWlBd1JBSUFJb0FpUWlCQVJBUVFBaEFnTkFJQUlnQXlnQ1BFNUZCRUFnQUNBRUlBSkJBblJxS0FJQUVPc0JJQUpCQVdvaEFnd0JDd3NnQUVFUWFpQUVJQUFvQWdRUkFBQUxJQUFnQTYxQ2dJQ0FnR0NFRUNNTEN4SUFJQUduS0FJZ0lnQUVRQ0FBRUtRREN3c2VBQ0FCcHlrRElDSUJRb0NBZ0lCZ1dnUkFJQUFnQWFjZ0FoRUFBQXNMR1FBZ0FDQUJweUlBS1FNZ0VDTWdBRUtBZ0lDQU1EY0RJQXRFQVFKL0lBR25JUVFEUUNBRUtBSW9JQU5MQkVBZ0JDZ0NKQ0FEUVFOMGFpa0RBQ0lCUW9DQWdJQmdXZ1JBSUFBZ0FhY2dBaEVBQUFzZ0EwRUJhaUVEREFFTEN3dEdBUU4vSUFHbklRTURRQ0FES0FJa0lRUWdBaUFES0FJb1QwVUVRQ0FBSUFRZ0FrRURkR29wQXdBUUl5QUNRUUZxSVFJTUFRc0xJQUJCRUdvZ0JDQUFLQUlFRVFBQUMya0JBbjhqQUVFUWF5SUhKQUFDZndKQUlBR25JZ2d0QUFWQkNIRkZEUUFnQUNBSFFReHFJQUlRckFGRkRRQWdCeWdDRENBSUtBSW9UdzBBUVg4Z0FDQUlFSklERFFFYUN5QUFJQUVnQWlBRElBUWdCU0FHUVlDQUNISVFiUXNoQUNBSFFSQnFKQUFnQUF1QkFnSURmd0YrQWtBQ1FDQUNRUUJPRFFBZ0FhY3BBeUFpQ2tLQWdJQ0FjSU5DZ0lDQWdKQi9VZzBBSUFKQi8vLy8vd2R4SWdnZ0NxY2lCeWtDQkNJS3AwSC8vLy8vQjNGUERRQUNRRUVFSUFZUWt3TkZEUUJCQVNFQ0lBWkJnTUFBY1VVTkFpQURRb0NBZ0lCd2cwS0FnSUNBa0g5U0RRQWdBNmNpQ1NrQ0JDSUJRdi8vLy84SGcwSUJVZzBBSUFkQkVHb2hCd0ovSUFwQ2dJQ0FnQWlEVUVVRVFDQUhJQWhCQVhScUx3RUFEQUVMSUFjZ0NHb3RBQUFMQW44Z0FVS0FnSUNBQ0lOUVJRUkFJQWt2QVJBTUFRc2dDUzBBRUF0R0RRSUxJQUFnQmtIaDZRQVFidzhMSUFBZ0FTQUNJQU1nQkNBRklBWkJnSUFJY2hCdElRSUxJQUlMUmdBQ2Z3SkFJQUpCQUU0TkFDQUJweWtESUNJQlFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFCQkFDQUNRZi8vLy84SGNTQUJweWdDQkVILy8vLy9CM0ZKRFFFYUMwRUJDd3V6QVFFQ2Z3SkFJQU5CQUU0TkFDQUNweWtESUNJQ1FvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFBZ0EwSC8vLy8vQjNFaUF5QUNweUlFS1FJRUlnS25RZi8vLy84SGNVOE5BRUVCSVFVZ0FVVU5BQ0FFUVJCcUlRUUNmeUFDUW9DQWdJQUlnMUJGQkVBZ0JDQURRUUYwYWk4QkFBd0JDeUFESUFScUxRQUFDeUVESUFGQkJEWUNBQ0FBSUFOQi8vOERjUkNmQXlFQ0lBRkNnSUNBZ0RBM0F4Z2dBVUtBZ0lDQU1EY0RFQ0FCSUFJM0F3Z0xJQVVMV3dFQ2Z5QUJweWdDRUNJQVFUQnFJUU1nQUNBQUtBSVlJQUp4UVg5elFRSjBhaWdDQUNFQUEwQUNRQ0FBUlEwQUlBTWdBRUVCYTBFRGRHb2lCQ2dDQkNBQ1JnMEFJQVFvQWdCQi8vLy9IM0VoQUF3QkN3c2dBRUVBUndzMUFRRitJQUVwQXdBaUFrSWdpS2RCZFU4RVFDQUNweUlCSUFFb0FnQkJBV28yQWdBTElBQWdBaENLQVVLQWdJQ0E0QUFRVXd1T0FRRUNmeUFCS0FJQUlnSkJBRW9FUUNBQklBSkJBV3NpQWpZQ0FBSkFJQUlOQUNBQkxRQUVRZkFCY1VFUVJ3MEFJQUVvQWdnaUFpQUJLQUlNSWdNMkFnUWdBeUFDTmdJQUlBRkJBRFlDQ0NBQUtBSmdJZ0lnQVVFSWFpSUROZ0lFSUFFZ0FFSGdBR28yQWd3Z0FTQUNOZ0lJSUFBZ0F6WUNZQXNQQzBIRmpRRkJydndBUWJBc1FjLzBBQkFBQUF0dkFRSi9JQUVnQVNnQ0FDSUNRUUZxTmdJQUlBSkZCRUFnQVNnQ0NDSUNJQUVvQWd3aUF6WUNCQ0FESUFJMkFnQWdBVUVBTmdJSUlBQW9BbEFpQWlBQlFRaHFJZ00yQWdRZ0FTQUFRZEFBYWpZQ0RDQUJJQUkyQWdnZ0FDQUROZ0pRSUFFZ0FTMEFCRUVQY1RvQUJBc0xEd0FnQVNBQktBSUFRUUZxTmdJQUM0Z0JBZ0YrQVg5QkFDRUNRb0NBZ0lBd0lRRURRQUpBSUFKQkFrY0VmaUFGSUFKQkEzUWlCR29pQnpVQ0JFSWdoa0tBZ0lDQU1GRU5BU0FBUWF3dVFRQVFGVUtBZ0lDQTRBQUZRb0NBZ0lBd0N3OExJQU1nQkdvcEF3QWlCa0lnaUtkQmRVOEVRQ0FHcHlJRUlBUW9BZ0JCQVdvMkFnQUxJQWNnQmpjREFDQUNRUUZxSVFJTUFBc0FDMXdCQW40Z0FpQUFLQUlBRUMwaEEwRUFJUUFnQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVU0FDSUFFb0FnQVFMU0lFUW9DQWdJQndnMEtBZ0lDQTRBQlJja1VFUUNBRHB5QUVweENEQWlFQUN5QUNJQU1RRHlBQ0lBUVFEeUFBQzJzQkFYNENRQUpBQWtBQ1FBSkFJQU10QUFVaUFRNEVBd0lDQUFFTElBQWdBeWdDQ0JES0JBOExJQUZCQ0VZTkFnc1FBUUFMSUFBZ0F5Z0NEQ0FES0FJQUlBTXRBQWdnQXkwQUNTQURMZ0VHRUlJQkR3c2dBQ0FBRURRaUJDQURLQUlJSUFNb0Fnd1FJaUFFQ3drQUlBQWdBeENOQXd0VEFRRitJQUFRTkNJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0FTQUJLQUlBUVFGcU5nSUFJQUFnQkVFOElBR3RRb0NBZ0lCd2hFRURFQmxCQUU0RVFDQUVEd3NnQUNBRUVBOExRb0NBZ0lEZ0FBc0RBQUVMYWdFQmZ5TUFRUkJySWdNa0FDQUJLQUlFSVFFZ0FpQURRUXhxSUFBb0FnUVFyQUZCQUNBQ0lBTkJDR29nQVJDc0FSdEZCRUJCME1VQVFhNzhBRUdET2tIOHlRQVFBQUFMSUFNb0FnZ2hBQ0FES0FJTUlRRWdBMEVRYWlRQVFYOGdBQ0FCUnlBQUlBRkxHd3ZhQXdJQ2ZnRi9Jd0JCSUdzaUJTUUFBa0FDUUNBQUlBRkJMQkJMSWdKRkRRQkNnSUNBZ0RBaEFRSkFJQUlwQXdBaUJrS0FnSUNBY0lOQ2dJQ0FnREJTQkVBQ2Z3SkFJQWFuSWdNdkFRWkJGV3RCLy84RGNVRUtUUVJBSUFNb0FpQW9BZ3dvQWlBdEFBUkZEUUVnQUJCckRBVUxJQUFnQlVFY2FpQUdFTllCRFFRZ0JVRWNhZ3dCQ3lBRFFTaHFDeUVJSUFJb0Fnd2lBeUFJS0FJQVNRMEJJQUFnQWlrREFCQVBJQUpDZ0lDQWdEQTNBd0FMSUFSQkFUWUNBQXdDQ3lBQ0lBTkJBV28yQWd3Z0JFRUFOZ0lBSUFJb0FnaEZCRUFnQTBFQVRnUkFJQU90SVFFTUF3dENnSUNBZ01CK0lBTzR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYklRRU1BZ3RDZ0lDQWdPQUFJUUVnQUNBQ0tRTUFJQU1Rc0FFaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBSW9BZ2hCQVVZRVFDQUdJUUVNQWdzZ0JTQUdOd01JSUFVZ0EwRUFUZ1IrSUFPdEJVS0FnSUNBd0g0Z0E3aTlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElnYzNBd0FnQUVFQ0lBVVFpUU1oQVNBQUlBWVFEeUFBSUFjUUR3d0JDeUFFUVFBMkFnQkNnSUNBZ09BQUlRRUxJQVZCSUdva0FDQUJDeEFBSXdBZ0FHdEJjSEVpQUNRQUlBQUxCZ0FnQUNRQUN3UUFJd0FMN2dJQ0JIOENmaU1BUVJCcklnTWtBQUpBQWtBZ0Fpa0RFQ0lIUW9DQWdJQndnMEtBZ0lDQWtIOVNCRUFnQUVHRGxBRkJBQkFWREFFTElBSXBBeGdoQ0NBQUlBY1Fzd0VpQkVVRVFFRUFJUVFNQVFzZ0FDQUlFTE1CSWdaRkRRQUNRQ0FBSUFRZ0JoREpCU0lCUlEwQUlBQWdBUkQrQTBFQVNBUkFJQUJCQVJDUEJBd0JDeUFCSUFFb0FnQkJBV28yQWdBZ0FDQUJyVUtBZ0lDQVVJUWdBQ2tEd0FGQkFFRUFFTWdGSWdkQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBY1FEeUFCSVFVTElBQWdCaEJVSUFWRkRRQWdBeUFBSUFVUWpRTWlCemNEQUNBSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUFJQUlwQXdCQ2dJQ0FnREJCQVNBREVDRVFEeUFBSUFNcEF3QVFEd3dCQ3lBQUtBSVFJZ0VwQTRBQklRY2dBVUtBZ0lDQUlEY0RnQUVnQXlBSE53TUlJQUFnQUNBQ0tRTUlRb0NBZ0lBd1FRRWdBMEVJYWhBaEVBOGdBQ0FES1FNSUVBOExJQUFnQkJCVUlBTkJFR29rQUVLQWdJQ0FNQXNTQUNBQVFRQTJBckFCSUFCQ0FEY0RxQUVMSHdBZ0FFRUFOZ0t3QVNBQVFUZzJBcXdCSUFCQk9VRUFJQUViTmdLb0FRc2ZBQ0FBSUFBb0FoQWdBQ0FCSUFJUUJpSUFFUEVGSVFFZ0FCQ2JBU0FCQzA4Q0FYOEJmaUFBS0FJUUlBQWdBUkFISWdKRkJFQkJBQThMSUFBZ0FpQUNFRDhnQVVFaEVQUUZJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FBSUFRUUR5QUVweUVEQ3lBQ0VKc0JJQU1MQ2dBZ0FFSUFOd09RQVFzU0FDQUFRUUEyQXBRQklBQkJOellDa0FFTEJnQWdBQkFOQ3dvQUlBQWdBVUVEZEdvTEV3QWdBRUUySUFKQkFFRUJJQUVRZ2dFUVV3dExBUUYvSXdCQkVHc2lCU1FBSUFVZ0FUY0RDQUpBSUFBZ0JVRUlhaUFDSUFNZ0JCQU9JZ0JGQkVCQ2dJQ0FnREFoQVF3QkN5QUFLUU1BSVFFZ0FCQ2JBUXNnQlVFUWFpUUFJQUVMUHdJQmZ3RitJd0JCRUdzaUFpUUFJQUFnQWhETkFpRURJQUVnQWlrREFCQlROZ0lBSUFFZ0Fpa0RDQkJUTmdJRUlBTVFVeUVBSUFKQkVHb2tBQ0FBQ3lvQkFYNGdBQ2tEd0FFaUFVSWdpS2RCZFU4RVFDQUJweUlBSUFBb0FnQkJBV28yQWdBTElBRVFVd3ZYQVFJQ2ZnRi9BbjlCL01jQUlBRXBBd0FpQWtJZ2lLY2lBVVVnQVVFTGFrRVJTM0lOQUJvQ1FBSkFJQUpDZ0lDQWdIQ0RJZ05DZ0lDQWdOQitVZ1JBUWFnc0lBTkNnSUNBZ09CK1VRMERHaUFEUW9DQWdJRHdmbElFUUVHNnpBQWdBQ0FDRURnTkJCb2dBMEtBZ0lDQWdBRjhRaUNJcHlJQVFRMUpEUUlNQXd0QjFURU1Bd3RCZ05jQURBSUxRWU04SUFCMlFRRnhSUTBBSUFCQkFuUkIwSjRCYWlnQ0FBd0JDMEhWeWdCQnhURWdBa0tBZ0lDQWNGUWJDeUlBRUQ5QkFXb2lBUkN4QVNJRUJIOGdCQ0FBSUFFUUh3VkJBQXNMZVFFQmZ5TUFRUkJySWdVa0FDQURCRUFnQlNBQk5nSU1RUUVoQXdKQUFrQUNRQ0FGUVF4cVFRQVFrd1JCTTJvT0F3SUJBQUVMSUFWQkRHcEJBQkNUQkNJRFFTNUhJQU5CS0VkeElRTU1BUXRCQUNFREN5QURJQVJ5SVFRTElBQWdBU0FCRUQ4Z0FpQUVFUFFGRUZNaEFDQUZRUkJxSkFBZ0FBdlVBUUlDZmdGL0FrQWdBQ0FCS1FNQVFvQ0FnSUF3UW9DQWdJQXdFSlFFSWdKQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBSVFzd0VoQkNBQUlBSVFEeUFFUlEwQUlBQWdCQ0FFRUQ5QjdJZ0JFUFVGSVFJZ0FDQUVFRlFnQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0FpQUJLUU1BUWVIb0FCRDRBeUFBSUFJZ0FTa0RBRUc2NndBUStBTWdBQ0FDSUFFcEF3QkJ5TmNBRVBnRElBQWdBa0tBZ0lDQU1FS0FnSUNBTUJDVUJDRURJQUFnQWhBUElBQWdBeEN6QVNFQklBQWdBeEFQSUFFUEN5QUFJQUVROXdVTE9RSUJmd0YrSUFFMUFnUkNJSVpDZ0lDQWdPQUFVUVIvSUFBb0FoQWlBQ2tEZ0FFaEF5QUFRb0NBZ0lBZ053T0FBU0FERUZNRlFRQUxDM0lCQkg4akFDSUdJUWNnQTBFQUlBTkJBRW9iSVFnZ0JpQURRUU4wUVE5cVFYQnhheUlHSkFBRFFDQUZJQWhHUlFSQUlBWWdCVUVEZEdvZ0JDQUZRUUowYWlnQ0FDa0RBRGNEQUNBRlFRRnFJUVVNQVFzTElBQWdBU2tEQUNBQ0tRTUFJQU1nQmhBaEVGTWhBQ0FISkFBZ0FBdU5BUUVDZmlBQUlBSXBBd0FRTVNFQ0lBQWdBU2tEQUNBQ0lBTXBBd0FnQkNrREFDSUpJQVVwQXdBaUNrR0JBa0VCSUFnYlFRQWdCaHRCaEFoQkJDQUlHMEVBSUFjYmNpSUJJQUZCZ0JCeUlBbENnSUNBZ0hDRFFvQ0FnSUF3VVJzaUFTQUJRWUFnY2lBS1FvQ0FnSUJ3ZzBLQWdJQ0FNRkViSWdGQmdNQUFjaUFCSUFnYkVHMGFJQUFnQWhBVEMwUUJBWDRnQUNBQ0tRTUFFREVoQWlBREtRTUFJZ1JDSUlpblFYVlBCRUFnQktjaUF5QURLQUlBUVFGcU5nSUFDeUFBSUFFcEF3QWdBaUFFRUxFRklBQWdBaEFUQ3l3QkFYNGdBQ0FDS1FNQUVERWhBaUFBSUFFcEF3QWlBeUFDSUFOQkFCQVVJUU1nQUNBQ0VCTWdBeEJUQy9RQkFnVi9BWDRnQUVHZ0FXb2hCd0pBQTBBQ1FDQUJJQVpHRFFBZ0FDZ0NwQUVpQXlBSFJnMEFJQU1vQWdBaUJTQURLQUlFSWdRMkFnUWdCQ0FGTmdJQUlBTkNBRGNDQUVFQUlRUWdBeWdDQ0NJRklBTW9BaEFnQTBFWWFpQURLQUlNRVJrQUlRZ0RRQ0FFSUFNb0FoQk9SUVJBSUFVZ0F5QUVRUU4wYWlrREdCQVBJQVJCQVdvaEJBd0JDd3NnQlNBSUVBOGdCU2dDRUNJRVFSQnFJQU1nQkNnQ0JCRUFBQ0FDSUFVMkFnQWdDRUtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQVVvQWhBaUFDa0RnQUVoQ0NBQVFvQ0FnSUFnTndPQUFRd0RCU0FHUVFGcUlRWU1BZ3NBQ3dzZ0JxMGhDQXNnQ0JCVEN3OEFJQUFvQXFRQklBQkJvQUZxUndzaEFRRitJQUFnQUNBQkVQWUZJZ0lRRHlBQ1FvQ0FnSUJ3ZzBLQWdJQ0FNRklMUHdFQmZpQUFJQUVROWdVaUFrS0FnSUNBY0lOQ2dJQ0FnREJSQkVBZ0FDQUJLUU1BUWEzTEFCQ3lBU0VDQ3lBQUlBSVFzd0VoQVNBQUlBSVFEeUFCQzdVQkFnSi9BMzRqQUVFUWF5SURKQUFnQUNrRHdBRWlCVUlnaUtkQmRVOEVRQ0FGcHlJRUlBUW9BZ0JCQVdvMkFnQUxJQUFnQlVHRDB3QVFzZ0VoQmlBQUlBVVFEeUFESUFBZ0FSQmlOd01JQWtBZ0FnUkFJQUFnQUNBR1FkbkFBQkN5QVNJRklBWkJBU0FEUVFocUVDRWhCeUFBSUFNcEF3Z1FEd3dCQ3lBQUlBWkNnSUNBZ0RCQkFTQURRUWhxRUNFaEJ5QURLUU1JSVFVTElBQWdCUkFQSUFBZ0JoQVBJQWNRVXlFQUlBTkJFR29rQUNBQUN3b0FJQUFnQVJCaUVGTUxQZ0lCZndGOEl3QkJFR3NpQWlRQUlBSkNnSUNBZ0lDQWdQei9BRGNEQ0NBQUlBSkJDR29nQVNrREFCQkNHaUFDS3dNSUlRTWdBa0VRYWlRQUlBTUxhUUVCZmdKK0lBRzlJZ0lDZnlBQm1VUUFBQUFBQUFEZ1FXTUVRQ0FCcWd3QkMwR0FnSUNBZUFzaUFMZTlVUVJBSUFDdERBRUxRb0NBZ0lEQWZpQUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCVEN3Z0FJQUFRUGhCVEN3MEFJQUFnQVNrREFCQkhFRk1MQ0FBZ0FCQTBFRk1MS1FFQmZpQUJLUU1BSWdKQ0lJaW5RWFZQQkVBZ0FxY2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBQ0VGTUxDQUFnQUNBQkVGUUxGZ0FnQUNnQ0VDSUFRUkJxSUFFZ0FDZ0NCQkVBQUFzK0FnRi9BWDRDUUNBQktRTUFJZ05DSUlpblFYVkpEUUFnQTZjaUFpQUNLQUlBSWdKQkFXczJBZ0FnQWtFQlNnMEFJQUFnQXhDV0JBc2dBUkNiQVFzUUFDQUFJQUVwQXdBUUR5QUJFSnNCQ3djQUlBQVFwQU1MMlFNQ0FuOEJmaU1BUVNCcklnSWtBQUpBQWtBZ0FVS0FnSUNBY0lOQ2dJQ0FnREJTQkVBZ0FFR2lQa0VBRUJVTUFRc2dBeWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ01nQXlnQ0FFRUJhallDQUFzRFFBSkFBa0FDUUFKQUFrQUNRRUVISUFGQ0lJaW5JZ01nQTBFSGEwRnVTUnRCQzJvT0V3SUlBUVVEQlFVRkJRVUVBQUFGQlFVRkJRRUZDeUFBSUFIRUVJY0NJUUVNQndzQ1FBSitJQUFnQWtFTWFpQUJFTHNDSWdNb0FnaEIvdi8vL3dkT0JFQWdBQ0FCRUE4Z0FFSERLMEVBRUZCQ2dJQ0FnT0FBREFFTElBQVFsd0VpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCSUFhblFRUnFJZ1FnQXhCRUlRVWdCRUVCRU5FQklRUWdBQ0FCRUE4Z0JDQUZjaUlFUVNCeEJFQWdBQ0FHRUE4Z0FCQjhRb0NBZ0lEZ0FBd0JDeUFFUVJCeEJFQWdBQ0FHRUE4Z0FFSDF4UUJCQUJCUVFvQ0FnSURnQUF3QkN5QUFJQVlRelFFTElRRWdBeUFDUVF4cVJ3MEhJQUpCREdvUUd3d0hDeUFBSUFFUUR3d0ZDeUFBSUFFUU55SUJRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRTU1CUXNnQUNBQkVLb0ZJUUVNQkFzZ0FDQUJRUUVRbWdFaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQkRBTUxDeUFBSUFFUUR5QUFRZXdyUVFBUUZRdENnSUNBZ09BQUlRRUxJQUpCSUdva0FDQUJDNTRPQWcxL0FuNGpBRUhRQUdzaUJTUUFRb0NBZ0lEZ0FDRVRBa0FnQUJDWEFTSVNRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdCU0FCTmdJNElCS25RUVJxSVFvQ1FBSkFBa0FDUUFKQUlBSkJFRXdFUUNBQlFlRFJBQ0FGUVRocUVKa0ZEUUVnQlNnQ09DRUJDd0pBQWtBQ1FDQUJMUUFBSWdSQksyc09Bd0VDQUFJTFFRRWhFQXNnQlNBQlFRRnFJZ3cyQWpnZ0FTMEFBU0VFSUF3aEFRc0NRQUpBQWtBQ1FDQUVRZjhCY1VFd1JnUkFBa0FDUUNBQkxRQUJJZ1JCK0FCSEJFQWdCRUh2QUVZTkJTQUVRZGdBUncwQkN5QUNRVzl4UlFSQUlBVWdBVUVDYWpZQ09FRVFJUUlnQVMwQUFoQ1dBVUVRU1EwSERBZ0xJQVJCN3dCR0RRWWdBa1VoQmd3QkN5QUNSU0VHSUFJTkFDQUVRYzhBUmcwRUN5QUVRZUlBUmcwQklBWWdCRUhDQUVaeERRTU1BZ3NnQWtFUVNnMERJQUZCck4wQUlBVkJPR29RbVFWRkRRRU1Cd3NnQmlBQ1JYSkZEUUlNQVFzZ0FnMEJDMEVLSVFJTEFuOGdBaUFDUVFGcklnUnhCRUFnQ2lnQ0FDRUVJQVZDQURjQ0xDQUZRb0NBZ0lDQWdJQ0FnSDgzQWlRZ0JTQUVOZ0lnSUFWQklHb01BUXRCSUNBRVoydEJBQ0FDUVFKUEd5RUpJQW9MSVEwZ0JTZ0NPQ0VFQTBBZ0JDMEFBRUV3UjBVRVFDQUZJQVJCQVdvaUJEWUNPQXdCQ3d0QklDRU1JQWxGQkVBZ0FrSGVxQVJxTFFBQUlRd0xJQTFCQVJCQkdpQUZRUUEyQWpRZ0RDRUVRUUFoQmdKQUFrQUNRQUpBQTBBQ1FBSkFJQVVvQWpnaUNDMEFBQ0lSUVM1SERRQWdBU0FJVHdSQVFTNGhFU0FJTEFBQkVKWUJJQUpPRFFFTElBNE5BMEVCSVE0Z0JTQUlRUUZxSWdjMkFqZ2dDQzBBQVNFUklBc2hEd3dCQ3lBSUlRY0xJQUlnRWNBUWxnRWlDRXNFUUNBRklBZEJBV28yQWpnZ0MwRUJhaUVMSUFrRVFDQUVJQWxySWdSQkFFd0VRQ0FOSUFWQk5Hb2dDRUVBSUFScmRpQUdjaERtQXcwR0lBUkJIM1VnQ0NBRVFTQnFJZ1IwY1NFR0RBTUxJQWdnQkhRZ0JuSWhCZ3dDQ3lBSUlBSWdCbXhxSVFZZ0JFRUJheUlFRFFFZ0RTQUZRVFJxSUFZUTVnTWhCeUFNSVFSQkFDRUdJQWRGRFFFTUF3c0xJQThnQ3lBT0d5RVBDeUFFSUF4R0RRSWdDU0FFUlhKRkJFQURRQ0FDSUFac0lRWWdCRUVCYXlJRURRQUxDeUFOSUFWQk5Hb2dCaERtQTBVTkFpQUpEUUVMSUEwUUd3c2dDaEExREFNTElBMG9BaEJCQUNBRktBSTBJZzVCQW5SQkJHb1FLeG9nQlNnQ09DSUlJQUZIRFFFZ0NRMEFJQTBRR3dzZ0NoQTFEQU1MSUFndEFBQWhCQUpBQWtBQ2Z3Si9Ba0FnQWtFS1JnUkFJQVFpQjBFZ2NrSGxBRVlOQVVFQUlRdEJBQXdDQzBIQUFDRUhJQVJCd0FCR0RRQWdDVVVFUUVFQUlRWU1CQXNnQkNJSFFTQnlRZkFBUmcwQVFRQWhCaUFKREFJTFFRQWhDMEVBSUFFZ0NFOE5BQm9nQlNBSVFRRnFJZ1kyQWpnZ0IwSGZBWEVoQVVFQklRY0NRQUpBQWtBZ0NDMEFBVUVyYXc0REFBSUJBZ3NnQlNBSVFRSnFJZ1kyQWpnTUFRc2dCU0FJUVFKcUlnWTJBamhCQUNFSEN5QUJRZEFBUmlFTFFRQWhCQU5BSUFZc0FBQVFsZ0VpQVVFSlRRUkFJQVJCekptejVnQk9CRUFnQncwSUlBb2dFQkNKQVF3SkJTQUZJQVpCQVdvaUJqWUNPQ0FCSUFSQkNteHFJUVFNQWdzQUN3c2dCRUVBSUFScklBY2JDeUVHSUFsRkRRRkJBU0FKSUFzYkN5RUVJQTBnRURZQ0JDQU5JQVFnQm13Z0NTQVBiR28yQWdnZ0RVSC8vLy8vQTBFQkVMTUNJUVFNQVFzQ1FDQU5LQUlNSWdjZ0RrRUJhaUlMUmdSQUlBb2dFQkNKQVVFQUlRUU1BUXNnQ2lnQ0FDRUJJQVZDQURjQ0dDQUZRb0NBZ0lDQWdJQ0FnSDgzQWhBZ0JTQUJOZ0lNSUEwb0FoQWhEaUFDRUpjRklSRkJBQ0VFQWtBQ1FDQUJLQUlBUVFCQkFrRWlJQWNnQzJzaUIwRUJhMmRySUFkQkFra2JJZ2hCRkd3Z0FTZ0NCQkVCQUNJSkJFQWdEaUFMUVFKMGFpRU9JQThnQnlBTWJHc2dCbW9oREFOQUlBUWdDRVpGQkVBZ0JTZ0NEQ0VQSUFrZ0JFRVViR29pQzBJQU53SU1JQXRDZ0lDQWdJQ0FnSUNBZnpjQ0JDQUxJQTgyQWdBZ0JFRUJhaUVFREFFTEMwRUFJUVFnQlVFTWFpQU9JQWRCQUNBSElCRWdDUkRsQXlFSEEwQWdCQ0FJUmtVRVFDQUpJQVJCRkd4cUVCc2dCRUVCYWlFRURBRUxDeUFCS0FJQUlBbEJBQ0FCS0FJRUVRRUFHaUFIUlEwQkN5QUtFRFZCSUNFRURBRUxJQVVnRURZQ0VDQUZLQUlZUlFSQUlBb2dCVUVNYWhCRUlRUU1BUXNnREVVRVFDQUtJQVZCREdvUVJDQUtRZi8vLy84RFFRRVF6Z0Z5SVFRTUFRc2dDaWdDQUNFQklBVkNBRGNDU0NBRlFvQ0FnSUNBZ0lDQWdIODNBa0FnQlNBQk5nSThJQVZCUEdvZ0FpQU1JQXhCSDNVaUFYTWdBV3RCLy8vLy93TkJBQkQ4QWlFQkFuOGdERUVBU0FSQUlBb2dCVUVNYWlBRlFUeHFJQVVvQWhoQkJYUkJBQkNWQVF3QkN5QUtJQVZCREdvZ0JVRThha0gvLy8vL0EwRUFFRU1MSUFGeUlRUWdCVUU4YWhBYkN5QUZRUXhxRUJzTElBMFFHd3NnQkVFZ2NVVU5BZ3NnQUNBU0VBOGdBQkI4REFJTElBb2dFQkNNQVFzZ0FDQVNJQU5CQ1haQkFYRVFsZ1VoRXdzZ0JVSFFBR29rQUNBVEM4VUNBZ1IvQVg0akFFRWdheUlISkFBQ2Z3SkFBa0FDUUNBQ1FZMEJSdzBBSUFBb0FoQW9Bb3dCSWdRRVFDQUVMUUFvUVFSeERRRUxJQUJCMjVBQlFRQVFGUXdCQ3lBQUVKY0JJZ2hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5BUXNnQUNBREVBOUJmd3dCQ3lBSXB5SUZRUVJxSVFZZ0FDQUhRUXhxSUFNUXV3RWhCQUpBQWtBQ1FBSkFBa0FDUUNBQ1FZd0JhdzRLQVFBRUJBTURBd01EQWdNTElBWWdCQkJFSVFJTUJBc2dCaUFFRUVRaEFpQUZJQVVvQWdoQkFYTTJBZ2dNQXdzZ0JpQUVRZ0ZCLy8vLy93TkJBUkIxSVFJZ0JTQUZLQUlJUVFGek5nSUlEQUlMRUFFQUN5QUdJQVFnQWtFQmRFR2RBbXVzUWYvLy8vOERRUUVRZFNFQ0N5QUFJQVFnQjBFTWFoQmVJQUFnQXhBUElBSUVRQ0FBSUFnUUR5QUFJQUlRaEFKQmZ3d0JDeUFCSUFBZ0NCRE5BVGNEQUVFQUN5RUFJQWRCSUdva0FDQUFDN1lKQWdaL0JINGpBRUZBYWlJR0pBQkNnSUNBZ09BQUlRd0Nmd0pBQWtBZ0FCQ1hBU0lMUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFDUUNBQUlBWkJMR29nQXhDN0FTSUhSUTBBSUFBZ0JrRVlhaUFFRUxzQklnaEZCRUFnQUNBSElBWkJMR29RWGd3QkN5QUxwMEVFYWlFSkFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQVVHYUFXc09HUUVDQkEwQUJRZ0lEQXdNREF3TURBd01EQXdKQ3dvTURBTU1DeUFKSUFjZ0NFSC8vLy8vQTBFQkVPUUJJUVVNRFFzZ0NTQUhJQWhCLy8vLy93TkJBUkJESVFVTURBc2dBQ2dDRUNnQ2pBRWlCUVJBSUFVdEFDaEJCSEVOQkFzZ0FDZ0MyQUVoQVNBR1FnQTNBZ3dnQmtLQWdJQ0FnSUNBZ0lCL053SUVJQVlnQVRZQ0FDQUpJQVlnQnlBSVFRRVE1QU1oQlNBR0VCc01Dd3NnQ1NBSElBaEJCaENWQlVFQmNTRUZEQW9MSUFrZ0J5QUlRUUVRbFFWQkFYRWhCUXdKQ3lBSUtBSUVSUTBCUVFFaEJTQUFLQUlRS0FLTUFTSUpSUTBJSUFrdEFDaEJCSEZGRFFnTElBQWdDeEFQQWtBQ2Z3SkFBa0FnQUNBQUtBSW9LUU9JQWlJTFFkMEJJQXRCQUJBVUlndENnSUNBZ0hDRElneENnSUNBZ0RCU0JFQWdERUtBZ0lDQTRBQlJEUUlnQUNBTFFTVVFTeUlGUlEwQ0lBVWdBUkQzQTBFQ2RHb29BZ2dpQlEwQklBQWdDeEFQQzBLQWdJQ0E0QUFoRENBQUVMWUZJZ3RDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5BeUFBSUFjZ0JrRXNhaEJlSUFBZ0NDQUdRUmhxRUY0TURnc2dBQ0FERUxrQ0lneENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQVFRdVFJaURrS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBQWdEQkFQREFFTElBVWdCU2dDQUVFQmFqWUNBQ0FHSUE0M0F3Z2dCaUFNTndNQUlBQWdCYTFDZ0lDQWdIQ0VRb0NBZ0lBd1FRSWdCaEF2SVEwZ0FDQU1FQThnQUNBT0VBOUJBQ0FOUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVhQzBLQWdJQ0FNQ0VOUVFFTElRRWdBQ0FMRUE4Z0FDQUhJQVpCTEdvUVhpQUFJQWdnQmtFWWFoQmVJQUFnQXhBUElBQWdCQkFQUVg4Z0FRME5HaUFDSUEwM0F3QU1DUXNnQzZkQkJHb2hCU0FBS0FMZ0FTRUpJQUFvQXR3QklRb0NmeUFCUVpzQlJnUkFJQVVnQnlBSUlBb2dDUkNWQVF3QkN5QUZJQWNnQ0NBS0lBbEJnSUFFY2hDVUJRc2hBU0FBSUFjZ0JrRXNhaEJlSUFBZ0NDQUdRUmhxRUY0Z0FDQURFQThnQUNBRUVBOGdBVUVnY1NJQkJFQWdBQ0FMRUE4Z0FDQUJFSVFDREF3TElBSWdDemNEQUF3SUN5QUpJQWNnQ0VILy8vLy9BMEdCZ0FRUWxBVWhCUXdHQ3lBR0lBaEJBQkNwQVNBR0tBSUFJUVVnQ1NBSEVFUWdDVUVBUVlHQWdJQjRJQVVnQlVHQmdJQ0FlRXdiSWdWcklBVWdBVUdoQVVZYklnRkIvLy8vL3dOQkFSRE1BWEloQlNBQlFRQk9EUVVnQ1VFQ0VORUJRU1J4SUFWeUlRVU1CUXNnQ1NBSElBZ1Frd1VoQlF3RUN5QUpJQWNnQ0VFQUVPTURJUVVNQXdzZ0NTQUhJQWhCQVJEakF5RUZEQUlMRUFFQUN5QUpJQWNnQ0VILy8vLy9BMEVCRU1zQklRVUxJQUFnQnlBR1FTeHFFRjRnQUNBSUlBWkJHR29RWGlBQUlBTVFEeUFBSUFRUUR5QUZCRUFnQUNBTEVBOGdBQ0FGRUlRQ0RBUUxJQUlnQUNBTEVNMEJOd01BQzBFQURBTUxJQXNoREFzZ0FDQU1FQThnQUNBREVBOGdBQ0FFRUE4TFFYOExJUUFnQmtGQWF5UUFJQUFMNFFFQkJIOGpBRUV3YXlJRUpBQkJmeUVIQWtBZ0FDQUVRUnhxSUFJUXV3SWlCVVVOQUFKQUlBQWdCRUVJYWlBREVMc0NJZ1pGQkVBZ0JTQUVRUnhxUncwQklBUkJIR29RR3d3QkN3Si9Ba0FDUUFKQUFrQUNRQUpBSUFGQm93RnJEZ2NGQUFFQ0JBUURCQXNnQlNBR0VKSUZEQVVMSUFZZ0JSQ3lBZ3dFQ3lBR0lBVVFrZ1VNQXdzZ0JTQUdFSUlDREFJTEVBRUFDeUFGSUFZUXNnSUxJUWNnQkVFY2FpQUZSZ1JBSUFSQkhHb1FHd3NnQkVFSWFpQUdSZ1JBSUFSQkNHb1FHd3NnQUNBQ0VBOE1BUXNnQWlFREN5QUFJQU1RRHlBRVFUQnFKQUFnQndzTEFDQUFJQUZCQ2hDYUJRdXVBZ0lEZndGK0l3QkJJR3NpQlNRQUFrQWdBYWNpQnlnQ0lDSUdSUTBBSUFZb0FnZ2lDQ2dDQkEwQUlBaEJBVFlDQkNBSEx3RUdRVEpySVFjQ1FBSkFJQU5CQUV3RVFFS0FnSUNBTUNFQkRBRUxJQWNnQkNrREFDSUJRb0NBZ0lCd1ZISU5BQUpBQWtBZ0FDQUJJQVlwQXdBUVVnUkFJQUJCODhvQVFRQVFGUXdCQ3lBQUlBRkIvd0FnQVVFQUVCUWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVnMEJDeUFBS0FJUUlnTXBBNEFCSVFFZ0EwS0FnSUNBSURjRGdBRWdBQ0FHS1FNQUlBRkJBUkNLQlNBQUlBRVFEd3dEQ3lBQUlBSVFPQTBCSUFBZ0FoQVBDeUFBSUFZcEF3QWdBU0FIRUlvRkRBRUxJQVlwQXdBaENTQUZJQUkzQXhBZ0JTQUJOd01JSUFVZ0NUY0RBQ0FBUVRWQkF5QUZFSm9ESUFBZ0FoQVBDeUFGUVNCcUpBQkNnSUNBZ0RBTDN3RUNBMzhDZmlBQVFlZ0FFRjhpQlVVRVFFS0FnSUNBNEFBUEN5QUZRUUUyQWdBZ0FDZ0NFQ0VHSUFWQkJEb0FCQ0FHS0FKUUlnY2dCVUVJYWlJSU5nSUVJQVVnQmtIUUFHbzJBZ3dnQlNBSE5nSUlJQVlnQ0RZQ1VDQUZRb0NBZ0lBd053TVlJQVZDZ0lDQWdEQTNBeEFnQlVFQU5nSWdRb0NBZ0lEZ0FDRUpBa0FDUUNBQUlBVkJFR29RelFJaUNrS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBQWdCVUVvYWlBQklBSWdBeUFFRU8wRFJRMEJDeUFBSUFvUUR3d0JDeUFGUVFFMkFpQWdBQ0FGRUlrRklBb2hDUXNnQUNnQ0VDQUZFSWdGSUFrTG1BRUJBWDhnQWFjaUJTOEJCa0UxYXlFR0lBVW9BaUFoQlNBRFFRQk1CSDVDZ0lDQWdEQUZJQVFwQXdBTElRRWdCU0FHTmdJMElBRkNJSWluSVFNQ1FDQUdCRUFnQTBGMVR3UkFJQUduSWdNZ0F5Z0NBRUVCYWpZQ0FBc2dBQ0FCRUlvQkRBRUxJQU5CZFU4RVFDQUJweUlESUFNb0FnQkJBV28yQWdBTElBVW9BbVJCQ0dzZ0FUY0RBQXNnQUNBRkVJa0ZRb0NBZ0lBd0M3b0JBUUYvSUFCQjBBQVFYeUlGQkVBZ0JVRUFOZ0lFSUFVZ0JVSElBR29pQmpZQ1RDQUZJQVkyQWtnQ1FDQUFJQVZCQ0dvaUJpQUJJQUlnQXlBRUVPMERCRUFnQlVFRk5nSUVEQUVMSUFBZ0JoQzBBaUlDUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBQ0VBOGdBQ0FCUVRrUVpTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdCU0FCcHlJQU5nSUFJQUZDZ0lDQWdIQmFCRUFnQUNBRk5nSWdDeUFCRHdzZ0FDZ0NFQ0FGRUljRkMwS0FnSUNBNEFBTHNnTUNCWDhEZmlNQVFSQnJJZ1FrQUFKQUFrQWdBeWtEQUNJTFFvQ0FnSUJ3V2dSQUlBdW5JZ2N2QVFaQkUydEIvLzhEY1VFQ1NRMEJDeUFBUVJNUWhnTkNnSUNBZ09BQUlRb01BUXRDZ0lDQWdPQUFJUW9nQnlnQ0lDSUZSUTBBSUFSQ0FEY0RDQ0FDUVFKT0JFQWdBQ0FFUVFocUlBTXBBd2dRcGdFTkFRc2dCUzBBQkFSQUlBQVFhd3dCQ3lBRUtRTUlJZ2tnQlNnQ0FDSUdyRllFUUNBQVFZY3VRUUFRVUF3QkN5QUdJQW1uSWdocklRWUNRQ0FDUVFOSURRQWdBeWtERUNJSlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQUNBQUlBUWdDUkNtQVEwQklBUXBBd0FpQ1NBR3JWWUVRQ0FBUWFIWkFFRUFFRkFNQWdzZ0NhY2hCZ3NnQUNBQlFTQVFaU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFDUUFKQUlBVXRBQVFFUUNBQUVHc01BUXNnQUVFWUVDa2lBZzBCQ3lBQUlBRVFEd3dCQ3lBQ0lBR25JZ0EyQWdnZ0MwSWdpS2RCZFU4RVFDQUhJQWNvQWdCQkFXbzJBZ0FMSUFJZ0JqWUNGQ0FDSUFnMkFoQWdBaUFITmdJTUlBVW9BZ3dpQXlBQ05nSUVJQUlnQlVFTWFqWUNCQ0FDSUFNMkFnQWdCU0FDTmdJTUlBQWdBallDSUNBQklRb0xJQVJCRUdva0FDQUtDeE1BSUFCQnlQb0FRUUFRRlVLQWdJQ0E0QUFMUWdFQmZpTUFRUkJySWdJa0FFS0FnSUNBNEFBaEJDQUFJQUpCQ0dvZ0F5a0RBQkNtQVVVRVFDQUFJQUVnQWlrRENFRVVFTndESVFRTElBSkJFR29rQUNBRUMwQUJBWDRqQUVFUWF5SUNKQUJDZ0lDQWdPQUFJUVFnQUNBQ1FRaHFJQU1wQXdBUXBnRkZCRUFnQUNBQklBSXBBd2dRK1FJaEJBc2dBa0VRYWlRQUlBUUxoQVlDQTM4SGZpTUFRU0JySWdVa0FFS0FnSUNBNEFBaERRSkFJQUFnQVNBRVFTWnFFR1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBUW9DQWdJQXdJUW9DUUFKQUFrQUNRQ0FBUVJ3UVh5SUdSUTBBSUFZZ0JFRUJka0VCY1RZQ0FDQUdJQVpCQkdvaUJ6WUNDQ0FHSUFjMkFnUWdBVUtBZ0lDQWNGb0VRQ0FCcHlBR05nSWdDeUFHUVFFMkFoUWdCaUFBUVFnUUtTSUhOZ0lRUW9DQWdJQXdJUXRDZ0lDQWdEQWhDQ0FIUlEwQ0lBY2dCellDQkNBSElBYzJBZ0FnQmtFRU5nSVlJQUpCQUV3TkF5QURLUU1BSWdoQ2dJQ0FnQkNFUW9DQWdJQndnMEtBZ0lDQU1GRU5BeUFBSUFGQjZBQkJ3Z0FnQkVFQmNTSUNHeUFCUVFBUUZDSUtRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FLRURnTkFTQUFRWkRNQUVFQUVCVUxRb0NBZ0lBd0lRdENnSUNBZ0RBaENBd0JDeUFBSUFoQkFCRG5BU0lJUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFNQVFzQ1FDQUFJQWhCNmdBZ0NFRUFFQlFpQzBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBQWtBRFFDQUZJQUFnQ0NBTElBVkJGR29RcmdFaUNUY0RHQ0FKUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlnQlNnQ0ZFVUVRQUpBSUFJRVFDQUFJQW9nQVVFQklBVkJHR29RSVNJT1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFZ0FDQUZLUU1ZRUE4TUJRc0NRQUpBSUFsQy8vLy8vMjlZQkVBZ0FCQWtRb0NBZ0lBd0lRa01BUXNnQUNBSlFnQVFUU0lKUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVMUW9DQWdJQXdJUXdNQkFzZ0FDQUZLUU1ZUWdFUVRTSU1Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdCU0FNTndNSUlBVWdDVGNEQUNBQUlBb2dBVUVDSUFVUUlTSU9Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdBQ0FKRUE4Z0FDQU1FQThMSUFBZ0RoQVBJQUFnQlNrREdCQVBEQUVMQ3lBQUlBa1FEeUFBSUFzUUR5QUFJQWdRRHlBQUlBb1FEd3dEQ3lBQUlBVXBBeGdRRHlBQUlBa1FEeUFBSUF3UUR3c2dDRUtBZ0lDQWNGUU5BQ0FBSUFoQkFSQ3RBUm9MSUFBZ0N4QVBJQUFnQ0JBUElBQWdDaEFQSUFBZ0FSQVBEQUVMSUFFaERRc2dCVUVnYWlRQUlBMEwxd01DQVg4RGZpTUFRU0JySWdZa0FBSkFBa0FDUUNBRlFRRnhCRUJDZ0lDQWdPQUFJUWNnQUNBR1FSaHFJQUZCM2dBUWdRRWlCVVVOQXdKQUlBVXBBd0FpQVVLQWdJQ0FjRm9FUUNBQnB5MEFCVUVRY1EwQkN5QUFRYUkrUVFBUUZRd0VDeUFHS1FNWUlnaENnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQWdBU0FDSUFNZ0JCQ1FBeUVIREFRTElBQWdBeUFFRUlrRElnbENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFpQUZLUU1BSVFFZ0JpQUNOd01RSUFZZ0NUY0RDQ0FHSUFFM0F3QWdBQ0FJSUFVcEF3aEJBeUFHRUNFaUFVTC8vLy8vYjFZTkFTQUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBQ0FCRUE4Z0FCQWtEQUlMUW9DQWdJRGdBQ0VISUFBZ0JrRVlhaUFCUWRvQUVJRUJJZ1ZGRFFJZ0Jpa0RHQ0VCSUFVdEFCQkZCRUFnQUNBQkVBOGdBRUdiekFCQkFCQVZEQU1MSUFGQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFBZ0JTa0RBQ0FDSUFNZ0JCQWhJUWNNQXdzZ0FDQURJQVFRaVFNaUNFS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBVXBBd0FoQnlBR0lBZzNBeEFnQmlBQ053TUlJQVlnQnpjREFDQUFJQUVnQlNrRENFRURJQVlRSVNFSEN5QUFJQUVRRHlBQUlBZ1FEd3dDQ3lBQklRY0xJQUFnQ0JBUElBQWdDUkFQQ3lBR1FTQnFKQUFnQnd1Q0JRRURmaUFES1FNSUlRWUNRQ0FBSUFNcEF3QWlCQkRRQXlJQ1FRQk9CRUFDUUNBQlFvQ0FnSUJ3ZzBLQWdJQ0FNRklOQUNBQUtBSVFLQUtNQVNrRENDRUJJQUpGSUFaQ2dJQ0FnSENEUW9DQWdJQXdVbklOQUNBQUlBUkJQQ0FFUVFBUUZDSUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdCUThMSUFBZ0JTQUJFRkloQXlBQUlBVVFEeUFEUlEwQUlBUkNJSWluUVhWSkRRSWdCS2NpQUNBQUtBSUFRUUZxTmdJQURBSUxBa0FDUUFKQUFrQUNRQ0FFUW9DQWdJQndWQTBBSUFTbklnTXZBUVpCRWtjTkFDQURLQUlnSWdJZ0FpZ0NBRUVCYWpZQ0FDQUNyVUtBZ0lDQWtIK0VJUVVnQmtLQWdJQ0FjSU5DZ0lDQWdEQlNEUUVnQXlnQ0pDSUNJQUlvQWdCQkFXbzJBZ0FnQXExQ2dJQ0FnSkIvaENFRURBTUxBa0FDUUFKQUlBSUVRQ0FBSUFSQjdBQWdCRUVBRUJRaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQVFvQ0FnSUF3SVFZTUNBc2dCa0tBZ0lDQWNJTkNnSUNBZ0RCUkJFQWdBQ0FFUWUwQUlBUkJBQkFVSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRklOQkF3SUN5QUZJUVFnQmtJZ2lLZEJkRXNOQVF3REN5QUVRaUNJcDBGMVR3UkFJQVNuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dCa0lnaUtkQmRVa05BUXNnQnFjaUFpQUNLQUlBUVFGcU5nSUFDeUFFSVFVTElBVkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQkJMeEF0SVFVTUFnc2dBQ0FGRUNnaEJDQUFJQVVRRHlBRUlnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF3d0JDeUFBSUFZUUtDSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSUxJQUFnQlNBR0VKZ0VJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFZUUR3c2dBQ0FCSUFVZ0JCRGVCUThMSUFBZ0JSQVBJQUFnQmhBUEMwS0FnSUNBNEFBUEN5QUVDNklPQWdkL0FYNGpBRUhnQUdzaUJ5UUFJQWRCQ0dwQkFFSFFBQkFyR2lBSElBUTJBaFFnQnlBQU5nSUlJQWNnQWlBRGFpSUROZ0pFSUFjZ0FqWUNRQ0FIUVFFMkFoQWdCMEtnZ0lDQUVEY0RHQUpBSUFJdEFBQkJJMGNOQUNBQ0xRQUJRU0ZIRFFBZ0J5QUNRUUpxSWdJMkFsd0RRQUpBQWtBQ1FDQUNJQU5QRFFBQ1FDQUNMUUFBSWdoQkNtc09CQUVBQUFFQUN5QUl3RUVBVGcwQ0lBSkJCaUFIUWR3QWFoQllJZ2hCZm5GQnFNQUFSdzBCSUFjb0Fsd2hBZ3NnQnlBQ05nSkFEQU1MSUFjb0Fsd2hBaUFJUVg5SERRRUxJQWNnQWtFQmFpSUNOZ0pjREFBTEFBc0NRQUpBQWtBQ1FBSkFBa0FDZndKQUFrQUNRQUpBQW44Z0JVRURjU0lLUVFKR0JFQWdBQ2dDRUNnQ2pBRWlDMFVOQkNBTEtRTUlJZzVDLy8vLy8yOVlEUU1nRHFjaUFpOEJCaER1QVVVTkFpQUNLQUlrSVF4QkFDRUlJQUlvQWlBaUF5MEFFQXdCQ3lBRlFRTjJJUUlnQ2tFQlJ3UkFRUUFoQTBFQUlRZ2dBa0VEY1F3QkMwS0FnSUNBNEFBaERpQUFJQVFRcWdFaUEwVU5DeUFBUWZBQUVGOGlDRVVFUUNBQUlBTVFFd3dNQ3lBSVFvQ0FnSUF3TndOb0lBaENnSUNBZ0RBM0EyQWdDRUtBZ0lDQU1EY0RTQ0FJUW9DQWdJQXdOd05BSUFnZ0F6WUNCQ0FJUVFFMkFnQWdBQ2dDOUFFaUF5QUlRUWhxSWdrMkFnUWdDQ0FBUWZRQmFqWUNEQ0FJSUFNMkFnZ2dBQ0FKTmdMMEFVRUFJUU1nQWtFQ2NVRUJjZ3NoQ1NBQVFRQkJBVUVBSUFSQkFSRG9BeUlDUlEwSElBY2dBallDU0NBQ0lBcEJBa2NpQkRZQ1RDQUNJQW8yQWlRZ0FpQUZRUVoyUVFGeE5nSm9Ba0FnQkVVRVFDQUNJQU12QUJGQkJuWkJBWEUyQWxBZ0FpQURMd0FSUVFkMlFRRnhOZ0pVSUFJZ0F5MEFFa0VCY1RZQ1dDQURMd0FSSVFRZ0FrSFFBRFlDY0NBQ0lBazZBRzRnQWlBRVFRbDJRUUZ4TmdKY0RBRUxJQUpCMEFBMkFuQWdBaUFKT2dCdUlBSkNnSUNBZ0JBM0FsZ2dBa0lBTndKUUlBSWdBMFVOQlJvTElBTW9BandoQkNBREx3RXFJUWtnQXk4QktDRUtJQUpCQURZQ3dBSWdBa0VBTmdMSUFpQUNJQVFnQ1NBS2Ftb2lDVFlDeEFJZ0FpQUpSUTBFR2lBQ0lBQWdDVUVEZEJBcElnUTJBc2dDSUFSRkRRVURRQ0FHUVFCT0JFQWdBeWdDSUNBR0lBTXZBU2hxUVFSMGFpSUVLQUlFUVFCS0JFQWdBaUFDS0FMQUFpSUpRUUZxTmdMQUFpQUFJQUlvQXNnQ0lBbEJBM1JxSUFRZ0JoRG5Bd3NnQkNnQ0NDRUdEQUVMQzBFQUlRUWdCa0YrUmdSQUEwQWdCQ0FETHdFcVR3MEZBa0FnQXlnQ0lDQUVJQU12QVNocVFRUjBhaUlHS0FJRURRQWdCaENlQlVVTkFDQUNJQUlvQXNBQ0lnbEJBV28yQXNBQ0lBQWdBaWdDeUFJZ0NVRURkR29nQmlBRUVPY0RDeUFFUVFGcUlRUU1BQXNBQ3dOQUlBTXZBU2dnQkUwRVFFRUFJUVFEUUNBRUlBTXZBU3BQRFFZQ1FDQURLQUlnSUFRZ0F5OEJLR3BCQkhScUlnWW9BZ1FOQUNBR0tBSUFRZEVBUmcwQUlBSWdBaWdDd0FJaUNVRUJhallDd0FJZ0FDQUNLQUxJQWlBSlFRTjBhaUFHSUFRUTV3TUxJQVJCQVdvaEJBd0FDd0FGSUFJZ0FpZ0N3QUlpQmtFQmFqWUN3QUlnQXlnQ0lDRUpJQUlvQXNnQ0lBWkJBM1JxSWdZZ0JEc0JBaUFHUVFNNkFBQWdCaUFBSUFrZ0JFRUVkR29vQWdBUUdEWUNCQ0FFUVFGcUlRUU1BUXNBQ3dBTFFiR1NBVUd1L0FCQndJWUNRZTdXQUJBQUFBdEI2b0VCUWE3OEFFRytoZ0pCN3RZQUVBQUFDMEdYaEFGQnJ2d0FRYjJHQWtIdTFnQVFBQUFMUVFBaEJnTkFJQVlnQXlnQ1BFNUZCRUFnQXlnQ0pDRUpJQUlnQWlnQ3dBSWlCRUVCYWpZQ3dBSWdBaWdDeUFJZ0JFRURkR29pQkNBRUxRQUFJZ3BCL2dGeE9nQUFJQVFnQ1NBR1FRTjBhaUlKTFFBQVFRSnhJQXBCL0FGeGNpSUtPZ0FBSUFRZ0NrSDZBWEVnQ1MwQUFFRUVjWElpQ2pvQUFDQUVJQXBCOWdGeElBa3RBQUJCQ0hGeUlnbzZBQUFnQ1MwQUFDRU5JQVFnQmpzQkFpQUVJQXBCRG5FZ0RVSHdBWEZ5T2dBQUlBUWdBQ0FKS0FJRUVCZzJBZ1FnQmtFQmFpRUdEQUVMQ3lBSEtBSklDeUVFSUFJZ0NEWUNsQU1nQnlBSVJUWUNVQ0FISUFoQkFFYzJBa3dnQjBFSWFpSURFSUFCR2lBQ0lBSW9BcndCTmdMd0FTQURFQklOQUNBSFFRaHFFSjBGRFFCQkFTRURJQVFnQkNnQ0pFRUNUd1IvSUFRdEFHNUJBWEVGUVFBTFJUWUNLQ0FIS0FKTVJRUkFJQVFnQnlnQ0NDQUVRZEVBRUU4aUF6WUNwQUVnQTBFQVNBMEJDd05BSUFjb0FoaEJySDlHRFFJZ0IwRUlhaENjQlVVTkFBc0xJQWRCQ0dvZ0IwRVlhaEQvQVNBQUlBSVEvUUlNQVF0QktTRURJQWRCQ0dvZ0J5Z0NUQVIvUVNrRklBZEJDR3BCMkFBUUVDQUhLQUpJUVlBQ2FpQUVMd0drQVJBcVFTZ0xFQkFnQUNBQ0VKc0ZJZzVDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FJQkVBZ0NDQU9Od05JSUFBZ0NCRCtBMEVBU0EwQ0lBZ2dDQ2dDQUVFQmFqWUNBQ0FJclVLQWdJQ0FVSVFoRGdzZ0JVRWdjUTBESUFBZ0RpQUJJQXdnQ3hESUJTRU9EQU1MSUFoRkRRRUxJQUFnQ0JEbkJRdENnSUNBZ09BQUlRNExJQWRCNEFCcUpBQWdEZ3ZiQlFNRmZ3TitBWHdqQUVGQWFpSUZKQUFDUUFKOEFrQUNRQUpBQWtBQ1FDQUNRUUFnQVVLQWdJQ0FjSU1pQzBLQWdJQ0FNRkliSWdJT0FnSUFBUXNDUUNBREtRTUFJZ2xDZ0lDQWdIQlVEUUFnQ2FjaUJDOEJCa0VLUncwQUlBUXBBeUFpQ2tJZ2lLY2lCRUVBSUFSQkMycEJFa2tiRFFBZ0FDQUZJQW9RUWcwRERBUUxJQVVnQUNBSlFRSVFrQUlpQ1RjRE9DQUpRb0NBZ0lCd2cwS0FnSUNBa0g5UkJFQWdBQ0FCSUFRZ0JVRTRhaERSQkNFS0lBQWdDUkFQSUFwQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQUlBVWdDaEJ1UlEwRURBTUxJQUFnQlNBSkVHNUZEUU1NQWdzZ0JVRUFRVGdRS3lJR1FvQ0FnSUNBZ0lENFB6Y0RFRUVISUFJZ0FrRUhUaHNpQjBFQUlBZEJBRW9iSVFJRFFBSkFJQUlnQkVjRVFDQUFJQVpCT0dvZ0F5QUVRUU4wSWdocUtRTUFFRUlOQkNBR0t3TTRJZ3k5UW9DQWdJQ0FnSUQ0L3dDRFFvQ0FnSUNBZ0lENC93QlNEUUVnQkNFQ0MwUUFBQUFBQUFENGZ5QUNJQWRIRFFVYUlBWkJBUkRnQWd3RkN5QUdJQWhxSUF5ZE9RTUFBa0FnQkEwQUlBWXJBd0FpREVRQUFBQUFBQUFBQUdaRklBeEVBQUFBQUFBQVdVQmpSWElOQUNBR0lBeEVBQUFBQUFDd25VQ2dPUU1BQ3lBRVFRRnFJUVFNQUFzQUN4RFFCTGtNQWd0Q2dJQ0FnT0FBSVFFTUFnc2dCU3NEQUNJTW5VUUFBQUFBQUFBQUFLQkVBQUFBQUFBQStIOGdERVFBQU56Q0NMSStRMlViUkFBQUFBQUFBUGgvSUF4RUFBRGN3Z2l5UHNObUd3c2hEQUpBSUFBZ0FVRUtFR1VpQ1VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0NRSitJQXk5SWdFQ2Z5QU1tVVFBQUFBQUFBRGdRV01FUUNBTXFnd0JDMEdBZ0lDQWVBc2lCTGU5VVFSQUlBU3REQUVMUW9DQWdJREFmaUFCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4RGJBU0FMUW9DQWdJQXdVZzBBSUFBZ0NTQUVJQVJCRXhEUEJDRUJJQUFnQ1JBUERBRUxJQWtoQVFzZ0JVRkFheVFBSUFFTHFBRUJCWDhnQUNnQ1ZDSURLQUlBSVFVZ0F5Z0NCQ0lFSUFBb0FoUWdBQ2dDSENJSGF5SUdJQVFnQmtrYklnWUVRQ0FGSUFjZ0JoQWZHaUFESUFNb0FnQWdCbW9pQlRZQ0FDQURJQU1vQWdRZ0Jtc2lCRFlDQkFzZ0JDQUNJQUlnQkVzYklnUUVRQ0FGSUFFZ0JCQWZHaUFESUFNb0FnQWdCR29pQlRZQ0FDQURJQU1vQWdRZ0JHczJBZ1FMSUFWQkFEb0FBQ0FBSUFBb0Fpd2lBVFlDSENBQUlBRTJBaFFnQWdzcEFDQUJJQUVvQWdCQkIycEJlSEVpQVVFUWFqWUNBQ0FBSUFFcEF3QWdBU2tEQ0JDL0JUa0RBQXVUR0FNU2Z3RjhBMzRqQUVHd0JHc2lEQ1FBSUF4QkFEWUNMQUpBSUFHOUlobENBRk1FUUVFQklSRkJ0aUVoRXlBQm1pSUJ2U0VaREFFTElBUkJnQkJ4QkVCQkFTRVJRYmtoSVJNTUFRdEJ2Q0ZCdHlFZ0JFRUJjU0lSR3lFVElCRkZJUlVMQWtBZ0dVS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVVFSQUlBQkJJQ0FDSUJGQkEyb2lBeUFFUWYvL2UzRVFZeUFBSUJNZ0VSQmJJQUJCNE5FQVFaU0RBU0FGUVNCeElnVWJRYXpkQUVHQmhnRWdCUnNnQVNBQllodEJBeEJiSUFCQklDQUNJQU1nQkVHQXdBQnpFR01nQXlBQ0lBSWdBMGdiSVFrTUFRc2dERUVRYWlFU0FrQUNmd0pBSUFFZ0RFRXNhaENGQmlJQklBR2dJZ0ZFQUFBQUFBQUFBQUJpQkVBZ0RDQU1LQUlzSWdaQkFXczJBaXdnQlVFZ2NpSU9RZUVBUncwQkRBTUxJQVZCSUhJaURrSGhBRVlOQWlBTUtBSXNJUXBCQmlBRElBTkJBRWdiREFFTElBd2dCa0VkYXlJS05nSXNJQUZFQUFBQUFBQUFzRUdpSVFGQkJpQURJQU5CQUVnYkN5RUxJQXhCTUdwQm9BSkJBQ0FLUVFCT0cyb2lEU0VIQTBBZ0J3Si9JQUZFQUFBQUFBQUE4RUZqSUFGRUFBQUFBQUFBQUFCbWNRUkFJQUdyREFFTFFRQUxJZ00yQWdBZ0IwRUVhaUVISUFFZ0E3aWhSQUFBQUFCbHpjMUJvaUlCUkFBQUFBQUFBQUFBWWcwQUN3SkFJQXBCQUV3RVFDQUtJUU1nQnlFR0lBMGhDQXdCQ3lBTklRZ2dDaUVEQTBCQkhTQURJQU5CSFU0YklRTUNRQ0FIUVFScklnWWdDRWtOQUNBRHJTRWFRZ0FoR1FOQUlBWWdHVUwvLy8vL0Q0TWdCalVDQUNBYWhud2lHMEtBbE92Y0E0QWlHVUtBN0pTakRINGdHM3crQWdBZ0JrRUVheUlHSUFoUERRQUxJQm1uSWdaRkRRQWdDRUVFYXlJSUlBWTJBZ0FMQTBBZ0NDQUhJZ1pKQkVBZ0JrRUVheUlIS0FJQVJRMEJDd3NnRENBTUtBSXNJQU5ySWdNMkFpd2dCaUVISUFOQkFFb05BQXNMSUFOQkFFZ0VRQ0FMUVJscVFRbHVRUUZxSVE4Z0RrSG1BRVloRUFOQVFRbEJBQ0FEYXlJRElBTkJDVTRiSVFrQ1FDQUdJQWhOQkVBZ0NDZ0NBQ0VIREFFTFFZQ1U2OXdESUFsMklSUkJmeUFKZEVGL2N5RVdRUUFoQXlBSUlRY0RRQ0FISUFNZ0J5Z0NBQ0lYSUFsMmFqWUNBQ0FXSUJkeElCUnNJUU1nQjBFRWFpSUhJQVpKRFFBTElBZ29BZ0FoQnlBRFJRMEFJQVlnQXpZQ0FDQUdRUVJxSVFZTElBd2dEQ2dDTENBSmFpSUROZ0lzSUEwZ0NDQUhSVUVDZEdvaUNDQVFHeUlISUE5QkFuUnFJQVlnQmlBSGEwRUNkU0FQU2hzaEJpQURRUUJJRFFBTEMwRUFJUU1DUUNBR0lBaE5EUUFnRFNBSWEwRUNkVUVKYkNFRFFRb2hCeUFJS0FJQUlnbEJDa2tOQUFOQUlBTkJBV29oQXlBSklBZEJDbXdpQjA4TkFBc0xJQXNnQTBFQUlBNUI1Z0JIRzJzZ0RrSG5BRVlnQzBFQVIzRnJJZ2NnQmlBTmEwRUNkVUVKYkVFSmEwZ0VRRUVFUWFRQ0lBcEJBRWdiSUF4cUlBZEJnTWdBYWlJSlFRbHRJZzlCQW5ScVFkQWZheUVLUVFvaEJ5QVBRWGRzSUFscUlnbEJCMHdFUUFOQUlBZEJDbXdoQnlBSlFRRnFJZ2xCQ0VjTkFBc0xBa0FnQ2lnQ0FDSVFJQkFnQjI0aUR5QUhiQ0lKUmlBS1FRUnFJaFFnQmtaeERRQWdFQ0FKYXlFUUFrQWdEMEVCY1VVRVFFUUFBQUFBQUFCQVF5RUJJQWRCZ0pUcjNBTkhJQWdnQ2s5eURRRWdDa0VFYXkwQUFFRUJjVVVOQVF0RUFRQUFBQUFBUUVNaEFRdEVBQUFBQUFBQTREOUVBQUFBQUFBQThEOUVBQUFBQUFBQStEOGdCaUFVUmh0RUFBQUFBQUFBK0Q4Z0VDQUhRUUYySWhSR0d5QVFJQlJKR3lFWUFrQWdGUTBBSUJNdEFBQkJMVWNOQUNBWW1pRVlJQUdhSVFFTElBb2dDVFlDQUNBQklCaWdJQUZoRFFBZ0NpQUhJQWxxSWdNMkFnQWdBMEdBbE92Y0EwOEVRQU5BSUFwQkFEWUNBQ0FJSUFwQkJHc2lDa3NFUUNBSVFRUnJJZ2hCQURZQ0FBc2dDaUFLS0FJQVFRRnFJZ00yQWdBZ0EwSC9rK3ZjQTBzTkFBc0xJQTBnQ0d0QkFuVkJDV3doQTBFS0lRY2dDQ2dDQUNJSlFRcEpEUUFEUUNBRFFRRnFJUU1nQ1NBSFFRcHNJZ2RQRFFBTEN5QUtRUVJxSWdjZ0JpQUdJQWRMR3lFR0N3TkFJQVlpQnlBSVRTSUpSUVJBSUFkQkJHc2lCaWdDQUVVTkFRc0xBa0FnRGtIbkFFY0VRQ0FFUVFoeElRb01BUXNnQTBGL2MwRi9JQXRCQVNBTEd5SUdJQU5LSUFOQmUwcHhJZ29iSUFacUlRdEJmMEYrSUFvYklBVnFJUVVnQkVFSWNTSUtEUUJCZHlFR0FrQWdDUTBBSUFkQkJHc29BZ0FpRGtVTkFFRUtJUWxCQUNFR0lBNUJDbkFOQUFOQUlBWWlDa0VCYWlFR0lBNGdDVUVLYkNJSmNFVU5BQXNnQ2tGL2N5RUdDeUFISUExclFRSjFRUWxzSVFrZ0JVRmZjVUhHQUVZRVFFRUFJUW9nQ3lBR0lBbHFRUWxySWdaQkFDQUdRUUJLR3lJR0lBWWdDMG9iSVFzTUFRdEJBQ0VLSUFzZ0F5QUphaUFHYWtFSmF5SUdRUUFnQmtFQVNoc2lCaUFHSUF0S0d5RUxDMEYvSVFrZ0MwSDkvLy8vQjBIKy8vLy9CeUFLSUF0eUloQWJTZzBCSUFzZ0VFRUFSMnBCQVdvaERnSkFJQVZCWDNFaUZVSEdBRVlFUUNBRElBNUIvLy8vL3dkelNnMERJQU5CQUNBRFFRQktHeUVHREFFTElCSWdBeUFEUVI5MUlnWnpJQVpyclNBU0VKVUNJZ1pyUVFGTUJFQURRQ0FHUVFGcklnWkJNRG9BQUNBU0lBWnJRUUpJRFFBTEN5QUdRUUpySWc4Z0JUb0FBQ0FHUVFGclFTMUJLeUFEUVFCSUd6b0FBQ0FTSUE5cklnWWdEa0gvLy8vL0IzTktEUUlMSUFZZ0Rtb2lBeUFSUWYvLy8vOEhjMG9OQVNBQVFTQWdBaUFESUJGcUlnVWdCQkJqSUFBZ0V5QVJFRnNnQUVFd0lBSWdCU0FFUVlDQUJITVFZd0pBQWtBQ1FDQVZRY1lBUmdSQUlBeEJFR29pQmtFSWNpRURJQVpCQ1hJaENpQU5JQWdnQ0NBTlN4c2lDU0VJQTBBZ0NEVUNBQ0FLRUpVQ0lRWUNRQ0FJSUFsSEJFQWdCaUFNUVJCcVRRMEJBMEFnQmtFQmF5SUdRVEE2QUFBZ0JpQU1RUkJxU3cwQUN3d0JDeUFHSUFwSERRQWdERUV3T2dBWUlBTWhCZ3NnQUNBR0lBb2dCbXNRV3lBSVFRUnFJZ2dnRFUwTkFBc2dFQVJBSUFCQjJaQUJRUUVRV3dzZ0MwRUFUQ0FISUFoTmNnMEJBMEFnQ0RVQ0FDQUtFSlVDSWdZZ0RFRVFha3NFUUFOQUlBWkJBV3NpQmtFd09nQUFJQVlnREVFUWFrc05BQXNMSUFBZ0JrRUpJQXNnQzBFSlRoc1FXeUFMUVFscklRWWdDRUVFYWlJSUlBZFBEUU1nQzBFSlNpRURJQVloQ3lBRERRQUxEQUlMQWtBZ0MwRUFTQTBBSUFjZ0NFRUVhaUFISUFoTEd5RUpJQXhCRUdvaUJrRUljaUVESUFaQkNYSWhEU0FJSVFjRFFDQU5JQWMxQWdBZ0RSQ1ZBaUlHUmdSQUlBeEJNRG9BR0NBRElRWUxBa0FnQnlBSVJ3UkFJQVlnREVFUWFrME5BUU5BSUFaQkFXc2lCa0V3T2dBQUlBWWdERUVRYWtzTkFBc01BUXNnQUNBR1FRRVFXeUFHUVFGcUlRWWdDaUFMY2tVTkFDQUFRZG1RQVVFQkVGc0xJQUFnQmlBTElBMGdCbXNpQmlBR0lBdEtHeEJiSUFzZ0Jtc2hDeUFIUVFScUlnY2dDVThOQVNBTFFRQk9EUUFMQ3lBQVFUQWdDMEVTYWtFU1FRQVFZeUFBSUE4Z0VpQVBheEJiREFJTElBc2hCZ3NnQUVFd0lBWkJDV3BCQ1VFQUVHTUxJQUJCSUNBQ0lBVWdCRUdBd0FCekVHTWdCU0FDSUFJZ0JVZ2JJUWtNQVFzZ0V5QUZRUnAwUVI5MVFRbHhhaUVJQWtBZ0EwRUxTdzBBUVF3Z0Eyc2hCa1FBQUFBQUFBQXdRQ0VZQTBBZ0dFUUFBQUFBQUFBd1FLSWhHQ0FHUVFGcklnWU5BQXNnQ0MwQUFFRXRSZ1JBSUJnZ0Fab2dHS0dnbWlFQkRBRUxJQUVnR0tBZ0dLRWhBUXNnRVVFQ2NpRUxJQVZCSUhFaERTQVNJQXdvQWl3aUJ5QUhRUjkxSWdaeklBWnJyU0FTRUpVQ0lnWkdCRUFnREVFd09nQVBJQXhCRDJvaEJnc2dCa0VDYXlJS0lBVkJEMm82QUFBZ0JrRUJhMEV0UVNzZ0IwRUFTQnM2QUFBZ0JFRUljU0VHSUF4QkVHb2hCd05BSUFjaUJRSi9JQUdaUkFBQUFBQUFBT0JCWXdSQUlBR3FEQUVMUVlDQWdJQjRDeUlIUWJERkJHb3RBQUFnRFhJNkFBQWdCaUFEUVFCS2NrVWdBU0FIdDZGRUFBQUFBQUFBTUVDaUlnRkVBQUFBQUFBQUFBQmhjU0FGUVFGcUlnY2dERUVRYW10QkFVZHlSUVJBSUFWQkxqb0FBU0FGUVFKcUlRY0xJQUZFQUFBQUFBQUFBQUJpRFFBTFFYOGhDVUg5Ly8vL0J5QUxJQklnQ21zaUJtb2lEV3NnQTBnTkFDQUFRU0FnQWlBTklBTkJBbW9nQnlBTVFSQnFJZ2RySWdVZ0JVRUNheUFEU0JzZ0JTQURHeUlKYWlJRElBUVFZeUFBSUFnZ0N4QmJJQUJCTUNBQ0lBTWdCRUdBZ0FSekVHTWdBQ0FISUFVUVd5QUFRVEFnQ1NBRmEwRUFRUUFRWXlBQUlBb2dCaEJiSUFCQklDQUNJQU1nQkVHQXdBQnpFR01nQXlBQ0lBSWdBMGdiSVFrTElBeEJzQVJxSkFBZ0NRc1dBQ0FBSUFBcEE4QUJJQU1wQXdCQkEwRi9FSndEQ3dVQUlBQ2RDOTRCQXdGOEFYOEJmaUFBbVNFQkFrQWdBTDBpQTBLQWdJQ0E4UC8vLy84QWcwSWdpS2NpQWtIcnA0Yi9BMDhFUUNBQ1FZR0EwSUVFVHdSQVJBQUFBQUFBQUFDQUlBR2pSQUFBQUFBQUFQQS9vQ0VCREFJTFJBQUFBQUFBQVBBL1JBQUFBQUFBQUFCQUlBRWdBYUFRbHdKRUFBQUFBQUFBQUVDZ282RWhBUXdCQ3lBQ1FhK3h3ZjREVHdSQUlBRWdBYUFRbHdJaUFDQUFSQUFBQUFBQUFBQkFvS01oQVF3QkN5QUNRWUNBd0FCSkRRQWdBVVFBQUFBQUFBQUF3S0lRbHdJaUFKb2dBRVFBQUFBQUFBQUFRS0NqSVFFTElBR2FJQUVnQTBJQVV4c0xoQUVCQW44akFFRVFheUlCSkFBQ1FDQUF2VUlnaUtkQi8vLy8vd2R4SWdKQis4T2svd05OQkVBZ0FrR0FnSUR5QTBrTkFTQUFSQUFBQUFBQUFBQUFRUUFRaGdZaEFBd0JDeUFDUVlDQXdQOEhUd1JBSUFBZ0FLRWhBQXdCQ3lBQUlBRVFuQVFoQWlBQkt3TUFJQUVyQXdnZ0FrRUJjUkNHQmlFQUN5QUJRUkJxSkFBZ0FBdm1Bd01HZkFGK0EzOENRQUpBQWtBQ1FDQUF2U0lIUWdCWkJFQWdCMElnaUtjaUNFSC8vejlMRFFFTElBZEMvLy8vLy8vLy8vLy9BSU5RQkVCRUFBQUFBQUFBOEw4Z0FDQUFvcU1QQ3lBSFFnQlpEUUVnQUNBQW9VUUFBQUFBQUFBQUFLTVBDeUFJUWYvL3YvOEhTdzBDUVlDQXdQOERJUWxCZ1hnaENpQUlRWUNBd1A4RFJ3UkFJQWdoQ1F3Q0N5QUhwdzBCUkFBQUFBQUFBQUFBRHdzZ0FFUUFBQUFBQUFCUVE2SzlJZ2RDSUlpbklRbEJ5M2NoQ2dzZ0NpQUpRZUsrSldvaUNFRVVkbXEzSWdWRUFHQ2ZVQk5FMHoraUlnRWdCMEwvLy8vL0Q0TWdDRUgvL3o5eFFaN0JtdjhEYXExQ0lJYUV2MFFBQUFBQUFBRHd2NkFpQUNBQUlBQkVBQUFBQUFBQTREK2lvaUlEb2IxQ2dJQ0FnSENEdnlJRVJBQUFJQlY3eTlzL29pSUNvQ0lHSUFJZ0FTQUdvYUFnQUNBQVJBQUFBQUFBQUFCQW9LTWlBU0FESUFFZ0FhSWlBaUFDb2lJQklBRWdBVVNmeG5qUUNackRQNkpFcjNpT0hjVnh6RCtnb2tRRStwZVptWm5aUDZDaUlBSWdBU0FCSUFGRVJGSSszeEx4d2oraVJONER5NVprUnNjL29LSkVXWk1pbENSSjBqK2dva1NUVlZWVlZWWGxQNkNpb0tDaUlBQWdCS0VnQTZHZ0lnQkVBQUFnRlh2TDJ6K2lJQVZFTml2eEVmUCtXVDJpSUFBZ0JLQkUxYTJheWppVXV6MmlvS0Nnb0NFQUN5QUFDd1FBUWdBTG1RRUNBbndCZjBRQUFBQUFBQURnUHlBQXBpRUNJQUNaSVFFQ1FDQUF2VUtBZ0lDQThQLy8vLzhBZzBJZ2lLY2lBMEhCM0ppRUJFMEVRQ0FCRUpjQ0lRRWdBMEgvLzcvL0EwMEVRQ0FEUVlDQXdQSURTUTBDSUFJZ0FTQUJvQ0FCSUFHaUlBRkVBQUFBQUFBQThEK2dvNkdpRHdzZ0FpQUJJQUVnQVVRQUFBQUFBQUR3UDZDam9LSVBDeUFCSUFJZ0FxQVFqUVloQUFzZ0FBdkxBUUVDZnlNQVFSQnJJZ0VrQUFKQUlBQzlRaUNJcDBILy8vLy9CM0VpQWtIN3c2VC9BMDBFUUNBQ1FZQ0F3UElEU1EwQklBQkVBQUFBQUFBQUFBQkJBQkRQQWlFQURBRUxJQUpCZ0lEQS93ZFBCRUFnQUNBQW9TRUFEQUVMQWtBQ1FBSkFBa0FnQUNBQkVKd0VRUU54RGdNQUFRSURDeUFCS3dNQUlBRXJBd2hCQVJEUEFpRUFEQU1MSUFFckF3QWdBU3NEQ0JEUUFpRUFEQUlMSUFFckF3QWdBU3NEQ0VFQkVNOENtaUVBREFFTElBRXJBd0FnQVNzRENCRFFBcG9oQUFzZ0FVRVFhaVFBSUFBTG9RRUJCSDhnQWlBQUtBSlVJZ01vQWdRaUJDQURLQUlBSWdWcklnWkJBQ0FFSUFaUEd5SUVTd1JBSUFBZ0FDZ0NBRUVRY2pZQ0FDQUVJUUlMSUFFZ0F5Z0NEQ0FGYWlBQ0VCOGFJQU1nQXlnQ0FDQUNhaUlGTmdJQUlBQWdBQ2dDTENJQk5nSUVJQUFnQVNBRUlBSnJJZ1FnQUNnQ01DSUFJQUFnQkVzYklnQnFOZ0lJSUFFZ0F5Z0NEQ0FGYWlBQUVCOGFJQU1nQXlnQ0FDQUFhallDQUNBQ0M0c0JBUUYvSXdCQkVHc2lBeVFBQW40Q1FDQUNRUU5QRFFBZ0FDZ0NWQ0VBSUFOQkFEWUNCQ0FESUFBb0FnQTJBZ2dnQXlBQUtBSUVOZ0lNUVFBZ0EwRUVhaUFDUVFKMGFpZ0NBQ0lDYTZ3Z0FWVU5BQ0FBS0FJSUlBSnJyQ0FCVXcwQUlBQWdBaUFCcDJvaUFEWUNBQ0FBclF3QkMwR2cxQVJCSERZQ0FFSi9DeUVCSUFOQkVHb2tBQ0FCQzZJQkFnRjhBWDhnQUpraEFRSjhJQUM5UW9DQWdJRHcvLy8vL3dDRFFpQ0lweUlDUWNIY21QOERUUVJBUkFBQUFBQUFBUEEvSUFKQmdJREE4Z05KRFFFYUlBRVFsd0lpQUNBQW9pQUFSQUFBQUFBQUFQQS9vQ0lBSUFDZ28wUUFBQUFBQUFEd1A2QVBDeUFDUWNIY21JUUVUUVJBSUFFUTZ3TWlBRVFBQUFBQUFBRHdQeUFBbzZCRUFBQUFBQUFBNEQraUR3c2dBVVFBQUFBQUFBRHdQeENOQmdzTHh3RUJBbjhqQUVFUWF5SUJKQUFDZkNBQXZVSWdpS2RCLy8vLy93ZHhJZ0pCKzhPay93Tk5CRUJFQUFBQUFBQUE4RDhnQWtHZXdacnlBMGtOQVJvZ0FFUUFBQUFBQUFBQUFCRFFBZ3dCQ3lBQUlBQ2hJQUpCZ0lEQS93ZFBEUUFhQWtBQ1FBSkFBa0FnQUNBQkVKd0VRUU54RGdNQUFRSURDeUFCS3dNQUlBRXJBd2dRMEFJTUF3c2dBU3NEQUNBQkt3TUlRUUVRendLYURBSUxJQUVyQXdBZ0FTc0RDQkRRQXBvTUFRc2dBU3NEQUNBQkt3TUlRUUVRendJTElRQWdBVUVRYWlRQUlBQUxCUUFnQUp3TEJRQWdBSnNMZ3dJREFud0Nmd0YrSUFDOUlnVkNJSWluUWYvLy8vOEhjU0lEUVlDQXdQOEhUd1JBSUFBZ0FLQVBDMEdUOGYzVUFpRUVBa0FnQTBILy96OU5CRUJCay9IOXl3SWhCQ0FBUkFBQUFBQUFBRkJEb3IwaUJVSWdpS2RCLy8vLy93ZHhJZ05GRFFFTElBVkNnSUNBZ0lDQWdJQ0FmNE1nQTBFRGJpQUVhcTFDSUlhRXZ5SUNJQUtpSUFJZ0FLT2lJZ0VnQVNBQm9xSWdBVVRYN2VUVUFMRENQNkpFMlZIbnZzdEU2TCtnb2lBQklBRkV3dFpKU21EeCtUK2lSQ0FrOEpMZ0tQNi9vS0pFa3VaaEQrWUQvaitnb0NBQ29yMUNnSUNBZ0h5RFFvQ0FnSUFJZkw4aUFTQUFJQUVnQWFLaklnQWdBYUVnQVNBQm9DQUFvS09pSUFHZ0lRQUxJQUFMZXdNQmZBRitBWDhnQUpraEFRSkFBbndnQUwwaUFrSTBpS2RCL3c5eElnTkIvUWROQkVBZ0EwSGZCMGtOQWlBQklBR2dJZ0FnQUNBQm9rUUFBQUFBQUFEd1B5QUJvYU9nREFFTElBRkVBQUFBQUFBQThEOGdBYUdqSWdBZ0FLQUxFS2NEUkFBQUFBQUFBT0Evb2lFQkN5QUJtaUFCSUFKQ0FGTWJDNmdEQWdWL0FYNGdBTDFDLy8vLy8vLy8vLy8vQUlOQ2dZQ0FnSUNBZ1BqL0FGUWdBYjFDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGaHhSUVJBSUFBZ0FhQVBDeUFCdlNJSFFpQ0lweUlDUVlDQXdQOERheUFIcHlJRmNrVUVRQ0FBRUowRUR3c2dBa0VlZGtFQ2NTSUdJQUM5SWdkQ1A0aW5jaUVEQWtBZ0IwSWdpS2RCLy8vLy93ZHhJZ1FnQjZkeVJRUkFBa0FDUUNBRFFRSnJEZ0lBQVFNTFJCZ3RSRlQ3SVFsQUR3dEVHQzFFVlBzaENjQVBDeUFDUWYvLy8vOEhjU0lDSUFWeVJRUkFSQmd0UkZUN0lmay9JQUNtRHdzQ1FDQUNRWUNBd1A4SFJnUkFJQVJCZ0lEQS93ZEhEUUVnQTBFRGRFSFFxZ1JxS3dNQUR3c2dCRUdBZ01EL0IwY2dBa0dBZ0lBZ2FpQUVUM0ZGQkVCRUdDMUVWUHNoK1Q4Z0FLWVBDd0o4SUFZRVFFUUFBQUFBQUFBQUFDQUVRWUNBZ0NCcUlBSkpEUUVhQ3lBQUlBR2ptUkNkQkFzaEFBSkFBa0FDUUNBRERnTUVBQUVDQ3lBQW1nOExSQmd0UkZUN0lRbEFJQUJFQjF3VU15YW1vYnlnb1E4TElBQkVCMXdVTXlhbW9ieWdSQmd0UkZUN0lRbkFvQThMSUFOQkEzUkI4S29FYWlzREFDRUFDeUFBQzZZQkF3RjhBWDhCZmlBQW1TRUJBa0FnQUwwaUEwSTBpS2RCL3c5eElnSkJtUWhQQkVBZ0FSRE1Ba1R2T2ZyK1FpN21QNkFoQVF3QkN5QUNRWUFJVHdSQUlBRWdBYUJFQUFBQUFBQUE4RDhnQVNBQm9rUUFBQUFBQUFEd1A2Q2ZJQUdnbzZBUXpBSWhBUXdCQ3lBQ1FlVUhTUTBBSUFFZ0FhSWlBQ0FBUkFBQUFBQUFBUEEvb0o5RUFBQUFBQUFBOEQrZ295QUJvQkNuQXlFQkN5QUJtaUFCSUFOQ0FGTWJDd1VBSUFDWkM3a0NBd0YvQTN3QmZpQUF2U0lGUWlDSXAwSC8vLy8vQjNFaUFVR0FnTUQvQTA4RVFDQUZweUFCUVlDQXdQOERhM0pGQkVBZ0FFUVlMVVJVK3lINVA2SkVBQUFBQUFBQWNEaWdEd3RFQUFBQUFBQUFBQUFnQUNBQW9hTVBDd0pBSUFGQi8vLy8vZ05OQkVBZ0FVR0FnRUJxUVlDQWdQSURTUTBCSUFBZ0FDQUFvaERTQXFJZ0FLQVBDMFFBQUFBQUFBRHdQeUFBbWFGRUFBQUFBQUFBNEQraUlnT2ZJUUFnQXhEU0FpRUVBbndnQVVHejVyei9BMDhFUUVRWUxVUlUreUg1UHlBQUlBU2lJQUNnSWdBZ0FLQkVCMXdVTXlhbWtieWdvUXdCQzBRWUxVUlUreUhwUHlBQXZVS0FnSUNBY0lPL0lnSWdBcUNoSUFBZ0FLQWdCS0pFQjF3VU15YW1rVHdnQXlBQ0lBS2lvU0FBSUFLZ295SUFJQUNnb2FHaFJCZ3RSRlQ3SWVrL29Bc2lBSm9nQUNBRlFnQlRHeUVBQ3lBQUMzWUJBWDhnQUwxQ05JaW5RZjhQY1NJQlFmOEhUUVJBSUFCRUFBQUFBQUFBOEwrZ0lnQWdBQ0FBb2lBQUlBQ2dvSitnRUtjRER3c2dBVUdZQ0UwRVFDQUFJQUNnUkFBQUFBQUFBUEMvSUFBZ0FLSkVBQUFBQUFBQThMK2dueUFBb0tPZ0VNd0NEd3NnQUJETUFrVHZPZnIrUWk3bVA2QUxCUUFnQUo4THJnSURBWHdCZmdGL0lBQzlJZ0pDSUlpblFmLy8vLzhIY1NJRFFZQ0F3UDhEVHdSQUlBS25JQU5CZ0lEQS93TnJja1VFUUVRQUFBQUFBQUFBQUVRWUxVUlUreUVKUUNBQ1FnQlpHdzhMUkFBQUFBQUFBQUFBSUFBZ0FLR2pEd3NDZkNBRFFmLy8vLzREVFFSQVJCZ3RSRlQ3SWZrL0lBTkJnWUNBNHdOSkRRRWFSQWRjRkRNbXBwRThJQUFnQUNBQW9oRFNBcUtoSUFDaFJCZ3RSRlQ3SWZrL29BOExJQUpDQUZNRVFFUVlMVVJVK3lINVB5QUFSQUFBQUFBQUFQQS9vRVFBQUFBQUFBRGdQNklpQUo4aUFTQUJJQUFRMGdLaVJBZGNGRE1tcHBHOG9LQ2hJZ0FnQUtBUEMwUUFBQUFBQUFEd1B5QUFvVVFBQUFBQUFBRGdQNklpQUo4aUFTQUFFTklDb2lBQUlBRzlRb0NBZ0lCd2c3OGlBQ0FBb3FFZ0FTQUFvS09nSUFDZ0lnQWdBS0FMQzc0Q0FRZC9Jd0JCSUdzaUF5UUFJQU1nQUNnQ0hDSUVOZ0lRSUFBb0FoUWhCU0FESUFJMkFod2dBeUFCTmdJWUlBTWdCU0FFYXlJQk5nSVVJQUVnQW1vaEJVRUNJUVlnQTBFUWFpRUJBbjhEUUFKQUFrQUNRQ0FBS0FJOElBRWdCaUFEUVF4cUVBSVFqd1pGQkVBZ0JTQURLQUlNSWdkR0RRRWdCMEVBVGcwQ0RBTUxJQVZCZjBjTkFnc2dBQ0FBS0FJc0lnRTJBaHdnQUNBQk5nSVVJQUFnQVNBQUtBSXdhallDRUNBQ0RBTUxJQUVnQnlBQktBSUVJZ2hMSWdsQkEzUnFJZ1FnQnlBSVFRQWdDUnRySWdnZ0JDZ0NBR28yQWdBZ0FVRU1RUVFnQ1J0cUlnRWdBU2dDQUNBSWF6WUNBQ0FGSUFkcklRVWdCaUFKYXlFR0lBUWhBUXdCQ3dzZ0FFRUFOZ0ljSUFCQ0FEY0RFQ0FBSUFBb0FnQkJJSEkyQWdCQkFDQUdRUUpHRFFBYUlBSWdBU2dDQkdzTElRUWdBMEVnYWlRQUlBUUxSZ0VCZnlBQUtBSThJUU1qQUVFUWF5SUFKQUFnQXlBQnB5QUJRaUNJcHlBQ1FmOEJjU0FBUVFocUVBZ1Fqd1loQWlBQUtRTUlJUUVnQUVFUWFpUUFRbjhnQVNBQ0d3c0pBQ0FBS0FJOEVBTUx2Z1FDQkg4QmZpTUFRVUJxSWdRa0FDQUFLQUlBSVFZZ0JFSUFOd0lNSUFSQ2dJQ0FnSUNBZ0lDQWZ6Y0NCQ0FFSUFZMkFnQWdCQ0FCSUFKQklHb2lBVUhtRHhDZkJDQUVJQVFnQXlBQlFlWVBFRU1hQWtBQ1FDQUVLQUlJSWdGQi8vLy8vd2RHQkVBZ0FCQTFEQUVMSUFBZ0JFWU5BU0FBS0FJQUlRY2dCRUlBTndJNElBUkNnSUNBZ0lDQWdJQ0FmemNDTUNBRUlBYzJBaXdDZnlBQlFRQklCRUJCZjBFQUlBUW9BZ1FiREFFTElBUkJMR29pQVVFZ1FRRVEwd0lnQVNBRUlBRkJJRUVDRUpVQkdpQUVRU2hxSUFGQkFCQ3BBU0FFS0FJSUlRRWdCQ2dDS0FzaEJpQUVRU3hxSWdVZ0FpQUJRUUFnQVVFQVNodHFJQUpCSDJvZ0FrRWhha0VCZGhDVkJpSURia0VCYWlJQklBTnFRUUYwYWtFNmFpSUNRUVlRMHdJZ0JTQUZJQWFzSUFKQkFCRFVBaUFGSUFRZ0JTQUNRUUFRNUFFYUlBVkJBQ0FEYTBILy8vLy9BMEVCRU13QkdpQUVRZ0EzQWlBZ0JFS0FnSUNBZ0lDQWdJQi9Od0lZSUFRZ0J6WUNGQ0FBUWdFUU1Cb2dBYTBoQ0FOQUlBaW5RUUJNUlFSQUlBUkJGR29pQVNBSUVEQWFJQUVnQkVFc2FpQUJJQUpCQUJDVkFSb2dBQ0FBSUFFZ0FrRUFFRU1hSUFBZ0FFSUJJQUpCQUJCMUdpQUlRZ0Y5SVFnTUFRc0xRUUFoQVNBRFFRQWdBMEVBU2hzaEF5QUVRUlJxRUJzZ0JFRXNhaEFiQTBBZ0FTQURSa1VFUUNBQUlBQWdBQ0FDUWVBUEVFTWFJQUZCQVdvaEFRd0JDd3NnQUNBR1FmLy8vLzhEUWVFUEVNd0JHZ3NnQkJBYklBUkJRR3NrQUVFUUR3dEIyUDBBUWRUOEFFRytJVUdZMWdBUUFBQUxlUUVCZnlBQlFvQ0FnSUJ3ZzBLQWdJQ0FNRklFUUNBQVFhSStRUUFRRlVLQWdJQ0E0QUFQQ3dKK0FrQWdBa1VOQUNBREtRTUFJZ0ZDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFRb0NBZ0lEZ0FDQUFJQUVRS0NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFYUlBR25JUVFMSUFBZ0JFRURFSUFFQ3d1dkFRRUNmeU1BUVNCcklnUWtBQ0FBS0FJQUlRVWdCRUVJYWlBRFFRQVFxUUVnQUNBQklBUW9BZ2dpQVNBQlFSOTFJZ0Z6SUFGcklnRWdBa0hBQUNBQlFRRnJaMEVCZEd0QkFDQUJRUUpQRzJwQkNHb2lBa0hnRHhDaUJDRUJJQU1vQWdRRVFDQUVRZ0EzQWhnZ0JFS0FnSUNBZ0lDQWdJQi9Od0lRSUFRZ0JUWUNEQ0FFUVF4cUlnTkNBUkF3R2lBQUlBTWdBQ0FDUWVBUEVKVUJJQUZ5SVFFZ0F4QWJDeUFFUVNCcUpBQWdBUXVRQmdJSWZ3RitJd0JCOEFCcklnTWtBQ0FBSUFGSEJFQWdBQ2dDQUNFRUlBTkNBRGNDYUNBRFFvQ0FnSUNBZ0lDQWdIODNBbUFnQXlBRU5nSmNJQU5CM0FCcUlnVWdBUkJFR2lBRFFnQTNBbFFnQTBLQWdJQ0FnSUNBZ0lCL053Sk1JQU1nQkRZQ1NDQURLQUprSVFZZ0EwRUFOZ0prSUFOQnlBQnFJZ0ZDcXRXcTFRb1FNQm9nQTBFQU5nSlFJQVVnQVJDeUFnUkFJQU1nQXlnQ1pFRUJhallDWkNBR1FRRnJJUVlMSUFOQnlBQnFFQnNnQWtFQmFrRUJkaENWQmlFRklBTkNBRGNDVkNBRFFvQ0FnSUNBZ0lDQWdIODNBa3dnQXlBRU5nSklJQU5DQURjQ1FDQURRb0NBZ0lDQWdJQ0FnSDgzQWpnZ0F5QUVOZ0kwSUFOQjNBQnFJZ0VnQVVKL1FmLy8vLzhEUVFBUWRSb2dCVUVBSUFWQkFFb2JJUWtnQWlBRmFpQUNJQVZCQVhSdVFRRnFJZ3BCQVhScVFTQnFJUUpCQUNFQkEwQWdBU0FKUmtVRVFDQURRY2dBYWlJSElBTkIzQUJxSWdoQ0FTQUNRUUFRZFJvZ0EwRTBhaUlMSUFjZ0FrRUdFSkVHSUFjZ0MwSUJJQUpCQUJCMUdpQUlJQWdnQnlBQ1FRQVFsUUVhSUFGQkFXb2hBUXdCQ3dzZ0EwSUFOd0lzSUFOQ2dJQ0FnSUNBZ0lDQWZ6Y0NKQ0FESUFRMkFpQWdBMElBTndJWUlBTkNnSUNBZ0lDQWdJQ0FmemNDRUNBRElBUTJBZ3dnQTBFZ2FpSUJJQU5CM0FCcUlnUkNBaUFDUVFBUWRSb2dBU0FFSUFFZ0FrRUFFSlVCR2lBRFFReHFJQUVnQVNBQ1FRQVFReG9nQUVJQUVEQWFJQXFzSVF3RFFDQU1RZ0JYUlFSQUlBTkJ5QUJxSWdGQ0FSQXdHaUFEUVRScUlnUWdES2RCQVhSQkFYS3NFREFhSUFFZ0FTQUVJQUpCQUJDVkFSb2dBQ0FBSUFFZ0FrRUFFTXNCR2lBQUlBQWdBMEVNYWlBQ1FRQVFReG9nREVJQmZTRU1EQUVMQ3lBQUlBQkNBU0FDUVFBUWRSb2dBQ0FBSUFOQklHb2lBU0FDUVFBUVF4b2dBUkFiSUFOQkRHb1FHeUFEUVRScUVCc2dBMEhJQUdvUUd5QUFJQVZCQVdwQi8vLy8vd05CQVJETUFSb2dBMEhjQUdvaUFTQUNRUVlRMHdJZ0FTQUJJQWFzSUFKQkFCRFVBaUFBSUFBZ0FTQUNRUUFReXdFYUlBRVFHeUFEUWZBQWFpUUFRUkFQQzBIWS9RQkIxUHdBUWRjaVFhaldBQkFBQUFzUkFDQUFJQUVnQWlBRElBUkJBQkNXQmdzUkFDQUFJQUVnQWlBRElBUkJBUkNXQmd2WUF3RUhmeUFDS0FJRUlBRW9BZ1J6SVFjQ1FBSkFBa0FDUUFKQUFrQUNRQ0FCS0FJSUlnWkIvZi8vL3dkTUJFQWdBaWdDQ0NJRlFmMy8vLzhIU2cwQklBWkJnSUNBZ0hoSERRWWdCVUdBZ0lDQWVFWU5CQXdIQ3lBR1FmLy8vLzhIUmcwQklBSW9BZ2doQlFzZ0JVSC8vLy8vQjBjTkFRc2dBQkExUVFBUEN5QUdRZjcvLy84SFJ5SUJJQVZCL3YvLy93ZEhjZzBCQ3lBQUVEVkJBUThMSUFFTkFTQUFJQWNRakFGQkFBOExJQVZCZ0lDQWdIaEdCRUFnQUNBSEVJd0JRUUlQQ3dKQUlBQW9BZ0FpQlNnQ0FFRUFJQUVvQWd3aUJpQURRU0ZxUVFWMklnZ2dCaUFJU2hzaUNpQUNLQUlNSWdocUlnbEJBblJCQkdvZ0JTZ0NCQkVCQUNJR0JFQWdCa0VBSUFrZ0FTZ0NER3RCQW5RaUN4QXJJZ1lnQzJvZ0FTZ0NFQ0FCS0FJTVFRSjBFQjhhSUFBZ0NrRUJhaEJCUlFSQUlBVWdBQ2dDRUNBR0lBa2dBaWdDRUNBSUVLVUVSUTBDQ3lBRktBSUFJQVpCQUNBRktBSUVFUUVBR2dzZ0FCQTFRU0FQQ3lBR0lBZ1FxQU1FUUNBQUtBSVFJZ1VnQlNnQ0FFRUJjallDQUFzZ0FDZ0NBQ0lGS0FJQUlBWkJBQ0FGS0FJRUVRRUFHaUFDS0FJSUlRSWdBU2dDQ0NFQklBQWdCellDQkNBQUlBRWdBbXRCSUdvMkFnZ2dBQ0FESUFRUXN3SVBDeUFBSUFjUWlRRkJBQXRZQVFGK0lBQWdBeWtEQUJEOUFVRUFSNjFDZ0lDQWdCQ0VJUVFnQVVLQWdJQ0FjSU5DZ0lDQWdEQlJCRUFnQkE4TElBQWdBVUVHRUdVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBQWdBU0FFRU5zQkN5QUJDNU1DQWdGK0FYOGpBRUVRYXlJRkpBQUNRQUpBSUFKRkJFQU1BUXNnQUNBREtRTUFFTGtDSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVFKQUFrQWdCRUlnaUtkQkMyb09Bd0VBQUFJTElBU25RUVJxSUFWQkNHb1F0UVVnQUNBRUVBOUNnSUNBZ01CK0lBVXBBd2dpQkVLQWdJQ0F3SUdBL1A4QWZTQUVRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d5RUVEQUVMSUFBZ0JCQTNJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFRUWpRRWlCRUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEJDeUFCUW9DQWdJQndnMEtBZ0lDQU1GRU5BQ0FBSUFGQkJCQmxJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FBSUFFZ0JCRGJBUXNnQVNFRUN5QUZRUkJxSkFBZ0JBczdBUUYvQTBBZ0FnUkFJQUF0QUFBaEF5QUFJQUV0QUFBNkFBQWdBU0FET2dBQUlBRkJBV29oQVNBQVFRRnFJUUFnQWtFQmF5RUNEQUVMQ3dzYUFDQUFMUUFBSVFJZ0FDQUJMUUFBT2dBQUlBRWdBam9BQUF0Q0FRRi9JQUpCQVhZaEFnTkFJQUlFUUNBQUx3RUFJUU1nQUNBQkx3RUFPd0VBSUFFZ0F6c0JBQ0FCUVFKcUlRRWdBRUVDYWlFQUlBSkJBV3NoQWd3QkN3c0xHZ0FnQUM4QkFDRUNJQUFnQVM4QkFEc0JBQ0FCSUFJN0FRQUxRZ0VCZnlBQ1FRSjJJUUlEUUNBQ0JFQWdBQ2dDQUNFRElBQWdBU2dDQURZQ0FDQUJJQU0yQWdBZ0FVRUVhaUVCSUFCQkJHb2hBQ0FDUVFGcklRSU1BUXNMQ3hvQUlBQW9BZ0FoQWlBQUlBRW9BZ0EyQWdBZ0FTQUNOZ0lBQzBJQkFYNGdBa0VEZGlFQ0EwQWdBZ1JBSUFBcEF3QWhBeUFBSUFFcEF3QTNBd0FnQVNBRE53TUFJQUZCQ0dvaEFTQUFRUWhxSVFBZ0FrRUJheUVDREFFTEN3c2NBUUYrSUFBcEF3QWhBeUFBSUFFcEF3QTNBd0FnQVNBRE53TUFDMW9CQW40Z0FrRUVkaUVDQTBBZ0FnUkFJQUFwQXdBaEF5QUFJQUVwQXdBM0F3QWdBQ2tEQ0NFRUlBQWdBU2tEQ0RjRENDQUJJQVEzQXdnZ0FTQUROd01BSUFGQkVHb2hBU0FBUVJCcUlRQWdBa0VCYXlFQ0RBRUxDd3MwQVFKK0lBQXBBd0FoQXlBQUlBRXBBd0EzQXdBZ0FDa0RDQ0VFSUFBZ0FTa0RDRGNEQ0NBQklBUTNBd2dnQVNBRE53TUFDd2tBSUFFZ0FoRHpCUXZrQkFJR2ZnRi9Jd0JCRUdzaUFpUUFJQUZDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUFvQWhBb0Fvd0JLUU1JSVFFTEFrQWdBQ0FCUVRzZ0FVRUFFQlFpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFVaEFRd0JDd0pBQWtBZ0JVTC8vLy8vYjFZTkFDQUFJQVVRRHlBQUlBRVFnQU1pQzBVTkFRSi9JQVJCQUVnRVFDQUxLQUlvUVJocURBRUxJQXNnQkVFRGRHcEIyQUJxQ3lrREFDSUZRaUNJcDBGMVNRMEFJQVduSWdzZ0N5Z0NBRUVCYWpZQ0FBc2dBQ0FGUVFNUVNTRUJJQUFnQlJBUElBRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFBSkFJQU1nQkVFSFJrRURkR29wQXdBaUJVS0FnSUNBY0lOQ2dJQ0FnREJTQkVBZ0FDQUZFQ2dpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCSUFBZ0FVRXpJQVZCQXhBWkdnc2dCRUVIUmdSQVFvQ0FnSURnQUNFSFFvQ0FnSUF3SVFVQ1FBSkFJQUFnQXlrREFFRUFFT2NCSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0FNQ0VJREFFTElBQWdCa0hxQUNBR1FRQVFGQ0lJUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUJBK0lnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFS0FnSUNBNEFBaEJRd0JDd05BSUFBZ0JpQUlJQUpCREdvUXJnRWlDa0tBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQUlvQWd3RVFDQUZJUWNNQkFzZ0FDQUZJQWtnQ2hCcUlRTWdDVUlCZkNFSklBTkJBRTROQVFzTElBQWdCa0VCRUswQkdnc2dBQ0FGRUE4TElBQWdDQkFQSUFBZ0JoQVBJQWRDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFGQk5DQUhRUU1RR1JvTElBQWdBVUVBUVFCQkFSREtBZ3dDQ3lBQUlBRVFEd3RDZ0lDQWdPQUFJUUVMSUFKQkVHb2tBQ0FCQytzQ0FRWitJd0JCRUdzaUFpUUFJQU1wQXdBaEFVS0FnSUNBNEFBaEJTQUFFRFFpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBUW9DQWdJQXdJUVFDUUNBQUlBRkJBQkRuQVNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBQ1FDQUFJQUZCNmdBZ0FVRUFFQlFpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBQTBBZ0FDQUJJQVlnQWtFTWFoQ3VBU0lFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQWlnQ0RBUkFJQWNoQlF3RUN3SkFBa0FnQkVMLy8vLy9iMWdFUUNBQUVDUU1BUXNnQUNBRVFnQVFUU0lJUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBRVFnRVFUU0lKUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBSUVBOE1BUXNnQUNBSElBZ2dDVUdIZ0FFUXZRRkJBRTROQVFzZ0FDQUVFQThNQWdzZ0FDQUVFQThNQUFzQUN5QUJRb0NBZ0lCd1dnUkFJQUFnQVVFQkVLMEJHZ3NnQmlFRUN5QUJJUVlnQnlFQkN5QUFJQVFRRHlBQUlBWVFEeUFBSUFFUUR3c2dBa0VRYWlRQUlBVUxTZ0JCTHlFQ0lBQWdBeWtEQUNJQlFvQ0FnSUJ3V2dSL0lBR25Md0VHSWdKQk1FWUVRRUVOUVRBZ0FDQUJFRGdiSVFJTElBQW9BaEFvQWtRZ0FrRVliR29vQWdRRlFTOExFQzBMOGdFQ0JIOEJmaU1BUVRCcklnSWtBRUtCZ0lDQUVDRUJBa0FnQXlrREFDSUpRb0NBZ0lCd1ZBMEFRb0NBZ0lEZ0FDRUJJQUFnQWtFc2FpQUNRU2hxSUFtbklnaEJBeENPQVEwQUlBSW9BaXdoQmlBQ0tBSW9JUWRCQUNFREFrQURRQ0FESUFkSEJFQWdBQ0FDUVFocUlBZ2dCaUFEUVFOMGFpZ0NCQkJNSWdWQkFFZ05BZ0pBSUFWRkRRQWdBQ0FDUVFocUVFZ2dBaWdDQ0NJRlFRRnhSU0FFUlNBRlFRSnhSWEp4RFFCQ2dJQ0FnQkFoQVF3REN5QURRUUZxSVFNTUFRc0xJQUFnQ1JDWkFTSURRUUJJRFFFZ0EwRUJSNjFDZ0lDQWdCQ0VJUUVMSUFBZ0JpQUhFRm9MSUFKQk1Hb2tBQ0FCQzc4QkFnRitBWDlDZ0lDQWdEQWhBUUpBSUFBZ0F5a0RBQkFsSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUVFQklBSWdBa0VCVEJzaEJVRUJJUUlEUUNBQ0lBVkdCRUFnQkE4TElBTWdBa0VEZEdvcEF3QWlBVUtBZ0lDQUVJUkNnSUNBZ0hDRFFvQ0FnSUF3VWdSQUlBQWdBUkFsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQWlBQUlBUWdBVUtBZ0lDQU1FRUJFTlFGRFFJZ0FDQUJFQThMSUFKQkFXb2hBZ3dBQ3dBTElBQWdCQkFQSUFBZ0FSQVBRb0NBZ0lEZ0FBc1lBQ0FBSUFNcEF3QWdBeWtEQ0JCU3JVS0FnSUNBRUlRTDRnSUNBMzREZnlNQVFTQnJJZ0lrQUVLQWdJQ0E0QUFoQkNBQUlBTXBBd0FRSlNJRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVCQ2dJQ0FnREFoQVFKQUFrQWdBQ0FDUVJ4cUlBSkJHR29nQmFkQkF4Q09BUTBBUW9DQWdJRGdBQ0VCSUFBUU5DSUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBaWdDSENFSElBSW9BaGdoQ0VFQUlRTURRQ0FESUFoSEJFQUNRQUpBSUFBZ0J5QURRUU4wYWlJSktBSUVFRndpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFJZ0FUY0RDQ0FDSUFVM0F3QWdBQ0FFSUFBZ0FrRUFFTVlFSVFZZ0FDQUJFQThnQmtLQWdJQ0FjSU1pQVVLQWdJQ0FNRkVOQVNBQlFvQ0FnSURnQUZFTkFDQUFJQVFnQ1NnQ0JDQUdRWWVBQVJBWlFRQk9EUUVMSUFRaEFRd0RDeUFEUVFGcUlRTU1BUXNMSUFBZ0J5QUlFRm9nQlNFQkRBRUxJQUFnQWlnQ0hDQUNLQUlZRUZvZ0FDQUZFQTlDZ0lDQWdPQUFJUVFMSUFBZ0FSQVBDeUFDUVNCcUpBQWdCQXNRQUNBQUlBTXBBd0JCRVNBRUVLb0NDeEFBSUFBZ0F5a0RBRUVDUVFBUXFnSUxFQUFnQUNBREtRTUFRUUZCQUJDcUFndEhBUUYrUW9DQWdJRGdBQ0VFSUFBZ0F5a0RBQ0lCSUFNcEF3Z1FyZ1lFZmtLQWdJQ0E0QUFGSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBQkN3dEJBQ0FBSUFNcEF3QWlBU0FES1FNSVFRRVFpd0pCQUVnRVFFS0FnSUNBNEFBUEN5QUJRaUNJcDBGMVR3UkFJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FBc2dBUXVKQVFFQmZpQURLUU1BSWdGQy8vLy8vMjlXSUFGQ2dJQ0FnSENEUW9DQWdJQWdVWEpGQkVBZ0FFRzM1QUJCQUJBVlFvQ0FnSURnQUE4TEFrQWdBQ0FCRUVjaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBTXBBd2dpQkVLQWdJQ0FjSU5DZ0lDQWdEQlJEUUVnQUNBQklBUVFyZ1pGRFFFZ0FDQUJFQThMUW9DQWdJRGdBQThMSUFFTHBRUUNCWDhDZmlNQVFTQnJJZ1VrQUNBQUlBVkJDR29pQmtFQUVEMGFJQVpCS0JBN0dpQUVRWDV4UVFKR0JFQWdCVUVJYWtIeG1RRVFpQUVhQ3lBRlFRaHFRYnJNQUJDSUFSb2dCRUY5Y1VFQlJnUkFJQVZCQ0dwQktoQTdHZ3NnQlVFSWFrR3ZsQUVRaUFFYVFRQWhCaUFDUVFGcklnZEJBQ0FIUVFCS0d5RUlBa0FDUUFKQUEwQWdCaUFJUndSQUlBWUVRQ0FGUVFocVFTd1FPeG9MSUFaQkEzUWhDU0FHUVFGcUlRWWdCVUVJYWlBRElBbHFLUU1BRUljQlJRMEJEQUlMQ3lBRlFRaHFRWWFhQVJDSUFSb2dBa0VBU2dSQUlBVkJDR29nQXlBSFFRTjBhaWtEQUJDSEFRMEJDeUFGUVFocUlnSkJpWkVCRUlnQkdrS0FnSUNBTUNFTElBSVFOaUlLUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQUNBQUtRUEFBU0FLUVFOQmZ4Q2NBeUVMSUFBZ0NoQVBJQXRDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FCUW9DQWdJQndnMEtBZ0lDQU1GRU5BaUFBSUFGQk95QUJRUUFRRkNJS1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFQ1FDQUtRdi8vLy85dlZnMEFJQUFnQ2hBUElBQWdBUkNBQXlJQ1JRMENJQUlvQWlnZ0JFRUJkRUd1d0FGcUx3RUFRUU4wYWlrREFDSUtRaUNJcDBGMVNRMEFJQXFuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dBQ0FMSUFwQkFSQ0xBaUVDSUFBZ0NoQVBJQUpCQUU0TkFnd0JDeUFGS0FJSUtBSVFJZ0pCRUdvZ0JTZ0NEQ0FDS0FJRUVRQUFRb0NBZ0lBd0lRc0xJQUFnQ3hBUFFvQ0FnSURnQUNFTEN5QUZRU0JxSkFBZ0N3dUFBZ0lDZmdGL0l3QkJJR3NpQnlRQVFvQ0FnSURnQUNFRkFrQUNRQ0FBSUFFUUpTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FES1FNQUVERWlBMFVOQUFOQUlBQWdCeUFCcHlBREVFd2lBa0VBU0EwQ0lBSUVRRUtBZ0lDQU1DRUZBa0FnQnkwQUFFRVFjVVVOQUNBSFFSaEJFQ0FFRzJvcEF3QWlCVUlnaUtkQmRVa05BQ0FGcHlJQ0lBSW9BZ0JCQVdvMkFnQUxJQUFnQnhCSURBTUxJQUFnQVJDTUFpSUJRb0NBZ0lCd2d5SUdRb0NBZ0lBZ1VnUkFJQVpDZ0lDQWdPQUFVUVJBSUFZaEJRd0VDeUFBRUh0RkRRRU1Bd3NMUW9DQWdJQXdJUVVNQVF0QkFDRURDeUFBSUFNUUV5QUFJQUVRRHlBSFFTQnFKQUFnQlF1eEFRRURmaUFES1FNSUlRVWdBeWtEQUNFR1FvQ0FnSURnQUNFSEFrQWdBQ0FCRUNVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSK0lBQWdCUkJnRFFFZ0FDQUdFREVpQWtVTkFTQUFJQUVnQWtLQWdJQ0FNRUtBZ0lDQU1DQUZJQVFiSUFWQ2dJQ0FnREFnQkJ0Qmhhb0JRWVdhQVNBRUd4QnRJUU1nQUNBQkVBOGdBQ0FDRUJOQ2dJQ0FnT0FBUW9DQWdJQXdJQU5CQUVnYkJVS0FnSUNBNEFBTER3c2dBQ0FCRUE5Q2dJQ0FnT0FBQzNJQkFYNUNnSUNBZ0RBaEF5QUJRb0NBZ0lBUWhFS0FnSUNBY0lOQ2dJQ0FnREJSQkVBZ0FCQWtRb0NBZ0lEZ0FBOExJQUpDZ0lDQWdIQ0RRb0NBZ0lBZ1VpQUNRdi8vLy85dldIRUVma0tBZ0lDQU1BVkNnSUNBZ09BQVFvQ0FnSUF3SUFBZ0FTQUNRUUVRaXdKQkFFZ2JDd3N5QVFGK0lBQWdBUkFsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQkR3c2dBQ0FCRU9nQklRSWdBQ0FCRUE4Z0FndWdBUUlCZmdGL0l3QkJJR3NpQWlRQVFvQ0FnSURnQUNFRUFrQUNRQ0FBSUFFUUpTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FES1FNQUVERWlBMFVOQUNBQUlBSWdBYWNnQXhCTUlnVkJBRWdOQVNBRlJRUkFRb0NBZ0lBUUlRUU1BZ3NnQWpVQ0FDRUVJQUFnQWhCSUlBUkNBb2hDQVlOQ2dJQ0FnQkNFSVFRTUFRdEJBQ0VEQ3lBQUlBTVFFeUFBSUFFUUR5QUNRU0JxSkFBZ0JBdkJBUUVDZmdKQUFuNUNnSUNBZ0JBZ0F5a0RBQ0lFUW9DQWdJQndWQTBBR2tLQWdJQ0E0QUFnQUNBQkVDVWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFHaUFFcHlJQ0lBSW9BZ0JCQVdvMkFnQWdBYWNoQWdOQUlBQWdCQkNNQWlJRVFvQ0FnSUJ3Z3lJRlFvQ0FnSURnQUZJRVFDQUNJQVNuUmlBRlFvQ0FnSUFnVVhJTkF5QUFFSHRGRFFFTEN5QUFJQVFRRHlBQUlBRVFEMEtBZ0lDQTRBQUxEd3NnQUNBRUVBOGdBQ0FCRUE4Z0JVS0FnSUNBSUZLdFFvQ0FnSUFRaEF0NkFRRitJQUFnQXlrREFCQXhJZ0pGQkVCQ2dJQ0FnT0FBRHd0Q2dJQ0FnT0FBSVFRZ0FDQUJFQ1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFBZ0FoQVRJQUVQQ3lBQVFRQWdBYWNnQWhCTUlRTWdBQ0FDRUJNZ0FDQUJFQTlDZ0lDQWdPQUFJQU5CQUVldFFvQ0FnSUFRaENBRFFRQklHd3NJQUNBQUlBRVFKUXNQQUNBQUlBRkJOMEVBUVFBUXJBSUxMUUVCZmtLQWdJQ0FNQ0VDQWtBZ0FSQ2pBeUlBUlEwQUlBQXRBQkpCQkhGRkRRQWdBRFVDUkNFQ0N5QUNDek1DQVg0QmYwS0FnSUNBTUNFQ0FrQWdBUkNqQXlJRFJRMEFJQU10QUJKQkJIRkZEUUFnQUNBREtBSkFFQzBoQWdzZ0Fnc29BRUtBZ0lDQTRBQWdBQ0FES1FNQUlBRVF2Z1VpQUVFQVI2MUNnSUNBZ0JDRUlBQkJBRWdiQzdjQkFnRitBbjlDZ0lDQWdPQUFJUVFnQUNBQkVHQUVma0tBZ0lDQTRBQUZRY3FaQVNFQ0FrQWdBYWNpQXk4QkJoRHVBVVVOQUFKQUlBTW9BaUFpQXk4QUVTSUZRWUFJY1VVTkFDQURLQUpVSWdaRkRRQWdBQ0FHSUFNb0FrZ1Frd0lQQ3lBRlFRUjJRUU54UVFGcklnTkJBa3NOQUNBRFFRSjBRZlQvQVdvb0FnQWhBZ3NnQUNBQ0lBQWdBVUUySUFGQkFCQVVJZ0ZDZ0lDQWdIQ0RRb0NBZ0lBd1VRUitJQUJCTHhBdEJTQUJDMEcrR1JDK0FRc0w2UVVEQTM0R2Z3TjhBa0FDZmtLQWdJQ0E0QUFnQUNBQkVHQU5BQnBDZ0lDQWdPQUFJQUFnQUNrRE1FRU9FRWtpQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2lBRnB5SUtJQUZDZ0lDQWdIQmFCSDhnQWFjdEFBVkJFSEVGUVFBTElBb3RBQVZCN3dGeGNqb0FCU0FBUVFFZ0FpQUNRUUZNR3lJTFFRRnJJZ2hCQTNSQkdHb1FLU0lIUlEwQklBRkNJSWluUVhWUEJFQWdBYWNpQWlBQ0tBSUFRUUZxTmdJQUN5QUhJQUUzQXdBZ0F5a0RBQ0lFUWlDSXAwRjFUd1JBSUFTbklnSWdBaWdDQUVFQmFqWUNBQXNnQnlBSU5nSVFJQWNnQkRjRENFRUFJUUlEUUNBQ0lBaEhCRUFnQXlBQ1FRRnFJZ2xCQTNScUtRTUFJZ1JDSUlpblFYVlBCRUFnQktjaURDQU1LQUlBUVFGcU5nSUFDeUFISUFKQkEzUnFJQVEzQXhnZ0NTRUNEQUVMQ3lBS0lBYzJBaUFnQVVMLy8vLy9iMWdFUUNBQUVDUU1BZ3NnQUVFQUlBR25RVEFRVENJQ1FRQklEUUZDQUNFRUFrQWdBa1VOQUNBQUlBRkJNQ0FCUVFBUUZDSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSWdCa0wvLy8vL0QxZ0VRQ0FHcHlJQ0lBaHJRUUFnQWlBTFRodXRJUVFNQVFzZ0JrSWdpS2RCQjJ0QmJVMEVRQUpBSUFaQ2dJQ0FnTUNCZ1B6L0FId2lCRUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZnMEFJQVMvblNJT0lBaTNJZzlsRFFBZ0RpQVBvU0VOQ3lBTnZTSUVBbjhnRFpsRUFBQUFBQUFBNEVGakJFQWdEYW9NQVF0QmdJQ0FnSGdMSWdLM3ZWRUVRQ0FDclNFRURBSUxRb0NBZ0lEQWZpQUVRb0NBZ0lEQWdZRDgvd0I5SUFSQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliSVFRTUFRc2dBQ0FHRUE4TElBQWdCVUV3SUFSQkFSQVpHaUFBUWRTWkFTQUFJQUZCTmlBQlFRQVFGQ0lFUW9DQWdJQndneUlCUW9DQWdJQ1FmMUlFZmlBQlFvQ0FnSURnQUZFTkFpQUFJQVFRRHlBQVFTOFFMUVVnQkF0QnpKNEJFTDRCSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBVkJOaUFCUVFFUUdSb2dCUXNQQ3lBQUlBVVFEMEtBZ0lDQTRBQUxNQUFnQWtFQVRBUkFJQUFnQVVLQWdJQ0FNRUVBUVFBUUlROExJQUFnQVNBREtRTUFJQUpCQVdzZ0EwRUlhaEFoQzZNQ0FnRi9CSDRqQUVFUWF5SUZKQUJDZ0lDQWdEQWhCZ0pBQWtBZ0FDQUZRUWhxSUFBZ0FSQWxJZ2tRUEEwQUlBVkJBVFlDQkFKQUlBUUVRQ0FES1FNQUlRaENnSUNBZ0RBaEJ5QUNRUUpPQkVBZ0F5a0RDQ0VIQ3lBQUlBZ1FZRVVOQVF3Q0N5QUNRUUJNQkVCQ2dJQ0FnREFoQ0VLQWdJQ0FNQ0VIREFFTFFvQ0FnSUF3SVFoQ2dJQ0FnREFoQnlBREtRTUFJZ0ZDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFJQUFnQlVFRWFpQUJFTG9CUVFCSURRRUxJQUFnQ1VJQUVLc0NJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FCSVFZTUFRc2dBU0VHSUFBZ0FTQUpJQVVwQXdoQ0FDQUZLQUlFSUFnZ0J4Q3ZCa0lBVXcwQUlBa2hCZ3dCQ3lBQUlBa1FEMEtBZ0lDQTRBQWhBUXNnQUNBR0VBOGdCVUVRYWlRQUlBRUwrUUVDQkg0QmZ5TUFRU0JySWdna0FBSkFBa0FnQUNBSVFSaHFJQUFnQVJBbElnRVFQQTBBSUFBZ0NFRUlhaUFES1FNQVFnQWdDQ2tER0NJRUlBUVFkQTBBSUFBZ0NFRVFhaUFES1FNSVFnQWdCQ0FFRUhRTkFDQUlJQVEzQXdBQ2ZpQUVJQUpCQTBnTkFCb2dCQ0FES1FNUUlnVkNnSUNBZ0hDRFFvQ0FnSUF3VVEwQUdpQUFJQWdnQlVJQUlBUWdCQkIwRFFFZ0NDa0RBQXNoQmlBQUlBRWdDQ2tEQ0NJRklBZ3BBeEFpQnlBR0lBZDlJZ1lnQkNBRmZTSUVJQVFnQmxVYklnUkJBVUYvUVFFZ0JTQUVJQWQ4VXhzZ0JTQUhWeHNROUFKRkRRRUxJQUFnQVJBUFFvQ0FnSURnQUNFQkN5QUlRU0JxSkFBZ0FRdXlDQUlKZmdOL0l3QkJNR3NpRGlRQVFvQ0FnSUF3SVFVQ1FBSkFJQUFnRGtFZ2FpQUFJQUVRSlNJS0VEd05BQ0FBSUE1QkdHb2dBeWtEQUVJQUlBNHBBeUFpQnlBSEVIUU5BQUpBSUFRRVFBSkFBa0FDUUNBQ0RnSUNBQUVMSUFjZ0Rpa0RHSDBoQ0VFQUlRSU1BUXNnQUNBT1FSQnFJQU1wQXdoQ0FDQUhJQTRwQXhoOVFnQVFkQTBESUFKQkFtc2hBaUFPS1FNUUlRZ0xJQWNnQXExOElBaDlRb0NBZ0lDQWdJQVFVdzBCSUFCQjBOb0FRUUFRRlF3Q0N5QU9JQWMzQXhBZ0J5RUJJQU1wQXdnaUMwS0FnSUNBY0lOQ2dJQ0FnREJTQkg0Z0FDQU9RUkJxSUF0Q0FDQUhJQWNRZEEwQ0lBNHBBeEFGSUFFTElBNHBBeGg5SWdGQ0FDQUJRZ0JWR3lFSVFRQWhBZ3NnQUNBS0lBaENnSUNBZ0FoOFF2Ly8vLzhQV0FSK0lBaEMvLy8vL3crREJVS0FnSUNBd0g0Z0NMbTlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElnVVFxd0loQVNBQUlBVVFEd0pBSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBT0tRTVlJZ3NnQ0h3aENRSkFBa0FnQ2lBT1FReHFJQTVCQ0dvUWlnSkZJQUZDLy8vLy8yOVljZzBBSUFHbklnOHZBUVpCQWtjTkFDQUxJUVVnRHkwQUJVRUljVVVOQVNBT0tBSU1JUThnRGpVQ0NDRU5BMEFnQlNBSldTQUZJQTFaY2cwQ0lBOGdCYWRCQTNScUtRTUFJZ3hDSUlpblFYVlBCRUFnREtjaUVDQVFLQUlBUVFGcU5nSUFDeUFBSUFFZ0JpQU1RWUNBQVJEU0FVRUFTQTBESUFaQ0FYd2hCaUFGUWdGOElRVU1BQXNBQ3lBTElRVUxJQVVnQ1NBRklBbFZHeUVKQTBBZ0JTQUpVZ1JBSUFBZ0NpQUZJQTVCS0dvUWhRRWlEMEVBU0EwQ0lBOEVRQ0FBSUFFZ0JpQU9LUU1vUVlDQUFSRFNBVUVBU0EwREN5QUdRZ0Y4SVFZZ0JVSUJmQ0VGREFFTEN5QUFJQUZCTUNBR1FvQ0FnSUFJV2dSK1FvQ0FnSURBZmlBR3ViMGlCVUtBZ0lDQXdJR0EvUDhBZlNBRlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dVZ0Jnc1FSVUVBU0EwQUlBUUVRQ0FISUFLdElnWjhJQWg5SVFsQ0FDRUZBa0FnQmlBSVVRMEFJQUFnQ2lBR0lBdDhJQWdnQzN3aURDQUhJQXg5UVg5QkFTQUdJQWhWR3hEMEFrRUFTQTBDQTBBZ0J5QUpWdzBCSUFBZ0NpQUhRZ0Y5SWdjUStnRkJBRTROQUFzTUFnc0RRQ0FGSUFaU0JFQWdCYWRCQTNRZ0Eyb3BBeEFpQjBJZ2lLZEJkVThFUUNBSHB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFVZ0Mzd2hDQ0FGUWdGOElRVWdBQ0FLSUFnZ0J4Q0dBVUVBVGcwQkRBTUxDeUFKUW9DQWdJQUlmRUwvLy8vL0QxZ0VmaUFKUXYvLy8vOFBnd1ZDZ0lDQWdNQitJQW01dlNJRlFvQ0FnSURBZ1lEOC93QjlJQVZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeUVHSUFFaEJTQUFJQXBCTUNBR0VFVkJBRWdOQWdzZ0NpRUZEQUlMSUFFaEJRc2dBQ0FLRUE5Q2dJQ0FnT0FBSVFFTElBQWdCUkFQSUE1Qk1Hb2tBQ0FCQytJQ0F3SitCWDhCZkNNQVFTQnJJZ1VrQUFKQUlBSW9BZ1FOQUNBQ0tBSUFJUVlDUUFKQUFuOGdBaWdDQ0FSQUlBQWdBVUVJRUdGRkRRSWdCU0FBS1FNQU53TVFJQVVnQVNrREFEY0RHQ0FHSUFJcEF4QkNnSUNBZ0RCQkFpQUZRUkJxRUNFaUEwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRElBTkMvLy8vL3c5WUJFQWdBNmNpQWtFZmRTQUNRUUJIY2d3Q0N5QUdJQVZCQ0dvZ0F4QnVRUUJJRFFNZ0JTc0RDQ0lLUkFBQUFBQUFBQUFBWkNBS1JBQUFBQUFBQUFBQVkyc01BUXNnQUNnQ0NDSUlSUVJBSUFZZ0FDa0RBQkFvSWdOQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQUlBT25JZ2cyQWdnTElBRW9BZ2dpQ1FSL0lBZ0ZJQVlnQVNrREFCQW9JZ05DZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BeUFCSUFPbklnazJBZ2dnQUNnQ0NBc2dDUkNEQWdzaUJ3MENDeUFBS1FNUUlnTWdBU2tERUNJRVZTQURJQVJUYXlFSERBRUxJQUpCQVRZQ0JBc2dCVUVnYWlRQUlBY0xYUUFDUUNBQlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQUNBQUtBSVFLQUtNQVNnQ0NDQUJwMFlOQUNBQUlBRkJBUkJsRHdzZ0F5a0RBQ0lCUWlDSXB5SUNRUXRxUVJGTElBSkJmbkZCQWtkeVJRUkFJQUFRTkE4TElBQWdBUkFsQzY0RkFnVitCSDhqQUVFd2F5SUxKQUFnQzBJQU53SWNJQXNnQURZQ0dDQUxJQU1wQXdBaUJEY0RLRUtBZ0lDQU1DRUdBa0FDUUFKL0lBUkNnSUNBZ0hDRFFvQ0FnSUF3VWdSQVFRQWhBa0VBSUFBZ0JCQmdEUUVhSUF0QkFUWUNJQXRCQUNFQ0FrQWdBQ0FMUVJCcUlBQWdBUkFsSWdZUVBBUkFEQUVMUWdBaEJBTkFJQXNwQXhBaUNDQUZWUVJBSUFrZ0NrOEVRQ0FBSUFJZ0NpQUtRUUYyYWtFZmFrRndjU0lLUVJoc0lBdEJER29RcUFFaUEwVU5BeUFMS0FJTVFSaHVJQXBxSVFvZ0F5RUNDMEVBSUFBZ0JpQUZJQUlnQ1VFWWJHb2lEQkNGQVNJRFFRQklEUU1hQWtBZ0EwVU5BQ0FNTlFJRVFpQ0dRb0NBZ0lBd1VRUkFJQVJDQVh3aEJBd0JDeUFNSUFVM0F4QWdERUVBTmdJSUlBbEJBV29oQ1FzZ0JVSUJmQ0VGREFFTEN5QUNJQWxCR0VIV0FDQUxRUmhxRUw0Q1FRQWdDeWdDSEEwQkdpQUVJQW10SWdGOElBUkNQNGNnQklOOUlRUkNBQ0VGQTBBQ1FDQUJJQVZTQkVBZ0FpQUZweUlLUVJoc2FpSURLQUlJSWd3RVFDQUFJQXl0UW9DQWdJQ1FmNFFRRHdzZ0F5a0RBQ0VISUFVZ0F5a0RFRkVFUUNBQUlBY1FEd3dDQ3lBQUlBWWdCU0FIRUlZQlFRQk9EUUVnQ2tFQmFnd0VDeUFBS0FJUUlnTkJFR29nQWlBREtBSUVFUUFBQTBBZ0FTQUVVUVJBQTBBZ0JDQUlXUTBJSUFBZ0JpQUVFUG9CSVFJZ0JFSUJmQ0VFSUFKQkFFNE5BQXdIQ3dBTElBQWdCaUFCUW9DQWdJQXdFSVlCSVFJZ0FVSUJmQ0VCSUFKQkFFNE5BQXNNQkFzZ0JVSUJmQ0VGREFBTEFBdEJBQXNoQXlBSklBTWdBeUFKU1JzaENRTkFJQU1nQ1VjRVFDQUFJQUlnQTBFWWJHb2lDaWtEQUJBUElBb29BZ2dpQ2dSQUlBQWdDcTFDZ0lDQWdKQi9oQkFQQ3lBRFFRRnFJUU1NQVFzTElBQW9BaEFpQTBFUWFpQUNJQU1vQWdRUkFBQUxJQUFnQmhBUFFvQ0FnSURnQUNFR0N5QUxRVEJxSkFBZ0JndXdBd0lEZmdKL0l3QkJNR3NpQWlRQVFvQ0FnSUF3SVFZZ0FrS0FnSUNBTURjREtBSkFBa0FnQUNBQ1FSQnFJQUFnQVJBbElnRVFQQTBBQWtBZ0FTQUNRUnhxSUFKQkRHb1FpZ0pGQkVBZ0Fpa0RFQ0VGREFFTElBSXBBeEFpQlNBQ0tBSU1JZ090VWcwQUlBTkJBa2tOQWtFQUlRQWdBaWdDSENFSEEwQWdBQ0FEUVFGcklnTlBEUU1nQnlBQVFRTjBhaUlJS1FNQUlRUWdDQ0FISUFOQkEzUnFJZ2dwQXdBM0F3QWdDQ0FFTndNQUlBQkJBV29oQUF3QUN3QUxBMEFnQkNBRlFnRjlJZ1ZaRFFJQ1FBSkFJQUFnQVNBRUlBSkJLR29RaFFFaUEwRUFTQTBBSUFBZ0FTQUZJQUpCSUdvUWhRRWlCMEVBU0EwQUFrQWdCd1JBSUFBZ0FTQUVJQUlwQXlBUWhnRkJBRWdOQWlBRFJRMEJJQUFnQVNBRklBSXBBeWdRaGdGQkFFZ05CU0FDUW9DQWdJQXdOd01vREFNTElBTkZEUUlnQUNBQklBUVErZ0ZCQUVnTkFTQUFJQUVnQlNBQ0tRTW9FSVlCUVFCSURRUWdBa0tBZ0lDQU1EY0RLQXdDQ3lBQUlBRWdCUkQ2QVVFQVRnMEJDeUFDS1FNb0lRWU1BZ3NnQkVJQmZDRUVEQUFMQUFzZ0FDQUdFQThnQUNBQkVBOUNnSUNBZ09BQUlRRUxJQUpCTUdva0FDQUJDNFVCQVFGK1FvQ0FnSURnQUNFRUlBQWdBUkFsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRklFUUFKK1FvQ0FnSURnQUNBQUlBRkIyd0FnQVVFQUVCUWlCRUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFHaUFBSUFRUU9FVUVRQ0FBSUFRUUR5QUFJQUVnQUNBQUVMQUdEQUVMSUFBZ0JDQUJRUUJCQUJBdkN5RUVJQUFnQVJBUEN5QUVDNkVEQWdKL0JYNGpBRUVnYXlJRkpBQUNmZ0pBSUFBZ0JTQUFJQUVRSlNJSkVEd05BRUVzSVFZQ1FDQUNRUUJNSUFSeVJRUkFRb0NBZ0lBd0lRZEJBQ0VDSUFNcEF3QWlBVUtBZ0lDQWNJTkNnSUNBZ0RCUkRRRWdBQ0FCRUNnaUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ1FYOGhCaUFIcHlJQ0tBSUVRUUZIRFFFZ0FpMEFFQ0VHREFFTFFvQ0FnSUF3SVFkQkFDRUNDeUFBSUFWQkNHcEJBQkE5R2tJQUlRRWdCU2tEQUNJSVFnQWdDRUlBVlJzaEN3SkFBMEFnQVNBTFVnUkFBa0FnQVZBTkFDQUdRUUJPQkVBZ0JVRUlhaUFHRURzYURBRUxJQVZCQ0dvZ0FrRUFJQUlvQWdSQi8vLy8vd2R4RUZFYUN5QUFJQWtnQWFjUXNBRWlDRUtBZ0lDQWNJTWlDa0tBZ0lDQUlGRWdDa0tBZ0lDQU1GRnlSUVJBSUFwQ2dJQ0FnT0FBVVEwRElBVkJDR29nQkFSK0lBQWdDQkQrQkFVZ0NBc1FmdzBEQ3lBQlFnRjhJUUVNQVFzTElBQWdCeEFQSUFBZ0NSQVBJQVZCQ0dvUU5nd0NDeUFGS0FJSUtBSVFJZ0pCRUdvZ0JTZ0NEQ0FDS0FJRUVRQUFJQUFnQnhBUEN5QUFJQWtRRDBLQWdJQ0E0QUFMSVFFZ0JVRWdhaVFBSUFFTHhRSUNBWDhEZmlNQVFTQnJJZ1FrQUFKK0FrQUNRQ0FBSUFSQkVHb2dBQ0FCRUNVaUJ4QThEUUJDZnlFR0lBUXBBeEFpQlVJQVZ3MEJJQVFnQlVJQmZTSUJOd01JSUFKQkFrNEVRQ0FBSUFSQkNHb2dBeWtEQ0VKL0lBRWdCUkIwRFFFZ0JDa0RDQ0VCQ3dOQUlBRkNBRk1OQWlBQUlBY2dBU0FFUVJocUVJVUJJZ0pCQUVnTkFRSkFJQUpGRFFBZ0F5a0RBQ0lGUWlDSXAwRjFUd1JBSUFXbklnSWdBaWdDQUVFQmFqWUNBQXNnQUNBRklBUXBBeGhCQUJDOEFVVU5BQ0FCSVFZTUF3c2dBVUlCZlNFQkRBQUxBQXNnQUNBSEVBOUNnSUNBZ09BQURBRUxJQUFnQnhBUElBWkMvLy8vL3crRElBWkNnSUNBZ0FoOFF2Ly8vLzhQV0EwQUdrS0FnSUNBd0g0Z0JybTlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElRRWdCRUVnYWlRQUlBRUw1UU1DQW44R2ZpTUFRU0JySWdRa0FBSitBa0FnQUNBRVFSQnFJQUFnQVJBbElnZ1FQQTBBUW44aENRSkFJQVFwQXhBaUJrSUFWdzBBSUFSQ0FEY0RDQ0FDUVFKT0JFQWdBQ0FFUVFocUlBTXBBd2hDQUNBR0lBWVFkQTBDQ3dKQUFrQWdDQ0FFUVFScUlBUVFpZ0pGQkVBZ0JDa0RDQ0VCREFFTElBUXBBd2dpQVNBRU5RSUFJZ2NnQVNBSFZSc2hDeUFFS0FJRUlRSURRQ0FCSUF0UkRRRWdBeWtEQUNJSFFpQ0lwMEYxVHdSQUlBZW5JZ1VnQlNnQ0FFRUJhallDQUFzZ0FpQUJwMEVEZEdvcEF3QWlDa0lnaUtkQmRVOEVRQ0FLcHlJRklBVW9BZ0JCQVdvMkFnQUxJQUFnQnlBS1FRQVF2QUVOQWlBQlFnRjhJUUVNQUFzQUN5QUJJQVlnQVNBR1ZSc2hCd05BSUFFZ0IxRU5BaUFBSUFnZ0FTQUVRUmhxRUlVQklnSkJBRWdOQXlBQ0JFQWdBeWtEQUNJR1FpQ0lwMEYxVHdSQUlBYW5JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUdJQVFwQXhoQkFCQzhBUTBDQ3lBQlFnRjhJUUVNQUFzQUN5QUJJUWtMSUFBZ0NCQVBJQWxDLy8vLy93K0RJQWxDZ0lDQWdBaDhRdi8vLy84UFdBMEJHa0tBZ0lDQXdINGdDYm05SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc01BUXNnQUNBSUVBOUNnSUNBZ09BQUN5RUJJQVJCSUdva0FDQUJDNjREQWdoK0FYOGpBRUV3YXlJTkpBQkNnSUNBZ0RBaEJnSkFBa0FnQUNBTlFRaHFJQUFnQVJBbElnY1FQQVJBUW9DQWdJQXdJUVVNQVF0Q2dJQ0FnREFoQlNBQUlBTXBBd0FpQ2hCZ0RRQkNnSUNBZ0RBaENTQUNRUUpPQkVBZ0F5a0RDQ0VKQ3lBTktRTUlJZ1ZDQUNBRlFnQlZHeUVMQTBBZ0NDQUxVZ1JBSUFnaUJVS0FnSUNBQ0ZvRVFFS0FnSUNBd0g0Z0NMbTlJZ1ZDZ0lDQWdNQ0JnUHovQUgwZ0JVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzaEJRc2dCVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQUFnQnlBRkVFMGlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQTBnQVRjRElDQU5JQVUzQXhnZ0RTQUdOd01RSUFBZ0NpQUpRUU1nRFVFUWFoQWhJZ3hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BaUFBSUF3UUpnUkFJQVFFUUNBQUlBWVFEeUFBSUFjUUR3d0ZDeUFBSUFVUUR5QUFJQWNRRHlBR0lRVU1CQVVnQUNBR0VBOGdBQ0FGRUE4Z0NFSUJmQ0VJREFJTEFBc0xJQUFnQnhBUFF2Ly8vLzhQUW9DQWdJQXdJQVFiSVFVTUFRc2dBQ0FGRUE4Z0FDQUdFQThnQUNBSEVBOUNnSUNBZ09BQUlRVUxJQTFCTUdva0FDQUZDNklDQWdOK0FYOGpBRUVnYXlJSEpBQUNRQUpBSUFBZ0IwRVlhaUFBSUFFUUpTSUZFRHdOQUNBSFFnQTNBeEFDUUNBQ1FRRk1CRUFnQnlrREdDRUVEQUVMSUFjcEF4Z2hCQ0FES1FNSUlnRkNnSUNBZ0hDRFFvQ0FnSUF3VWdSQUlBQWdCMEVRYWlBQlFnQWdCQ0FFRUhRTkFnc2dCeUFFTndNSUlBSkJBMGtOQUNBREtRTVFJZ0ZDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFJQUFnQjBFSWFpQUJRZ0FnQkNBRUVIUU5BU0FIS1FNSUlRUUxJQVFnQnlrREVDSUJJQUVnQkZNYklRWURRQ0FCSUFaUkRRSWdBeWtEQUNJRVFpQ0lwMEYxVHdSQUlBU25JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUZJQUVnQkJDR0FVRUFTQTBCSUFGQ0FYd2hBUXdBQ3dBTElBQWdCUkFQUW9DQWdJRGdBQ0VGQ3lBSFFTQnFKQUFnQlF1dUJBSUZmZ04vSXdCQkVHc2lDU1FBUW9DQWdJQXdJUVlDUUFKQUlBQWdBUkFsSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBaENBQkNyQWlJR1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFCQmZ5RUtRWDhnQWlBQ1FRQklHeUVMQWtBRFFDQUtJQXRIQkVBZ0NDRUZJQXBCQUU0RVFDQURJQXBCQTNScUtRTUFJUVVMQWtBQ1FDQUZRb0NBZ0lCd1ZBMEFBbjhnQUNBRlFkZ0JJQVZCQUJBVUlnRkNnSUNBZ0hDRElnZENnSUNBZ0RCU0JFQWdCMEtBZ0lDQTRBQlJEUWNnQUNBQkVDWU1BUXNnQUNBRkVNb0JDeUlDUVFCSURRVWdBa1VOQUNBQUlBa2dCUkE4RFFVZ0NTa0RBQ0lISUFSOFF2Ly8vLy8vLy84UFZRMEVRZ0FoQVNBSFFnQWdCMElBVlJzaEJ3TkFJQUVnQjFFTkFpQUFJQVVnQVNBSlFRaHFFSVVCSWdKQkFFZ05CaUFDQkVBZ0FDQUdJQVFnQ1NrRENCQnFRUUJJRFFjTElBUkNBWHdoQkNBQlFnRjhJUUVNQUFzQUN5QUVRdjcvLy8vLy8vOFBWUTBESUFWQ0lJaW5RWFZQQkVBZ0JhY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQUlBWWdCQ0FGRUdwQkFFZ05CQ0FFUWdGOElRUUxJQXBCQVdvaENnd0JDd3NnQUNBR1FUQWdCRUtBZ0lDQUNIeEMvLy8vL3c5WUJINGdCRUwvLy8vL0Q0TUZRb0NBZ0lEQWZpQUV1YjBpQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c1FSVUVBU0EwQkRBSUxJQUJCME5vQVFRQVFGUXNnQUNBR0VBOUNnSUNBZ09BQUlRWUxJQUFnQ0JBUElBbEJFR29rQUNBR0M3RUNBZ1IrQW44akFFRVFheUlJSkFCQ2dJQ0FnT0FBSVFVQ1FBSitBa0FnQVVLQWdJQ0FjRlFOQUNBQnB5MEFCVUVRY1VVTkFDQUlJQUt0TndNSUlBQWdBVUVCSUFoQkNHb1Fwd0VNQVFzZ0FCQStDeUlFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQWtFQUlBSkJBRW9iclNFSFFnQWhBUUpBQTBBZ0FTQUhVZ1JBSUFNZ0FhZEJBM1JxS1FNQUlnWkNJSWluUVhWUEJFQWdCcWNpQ1NBSktBSUFRUUZxTmdJQUN5QUFJQVFnQVNBR1FZQ0FBUkRTQVNFSklBRkNBWHdoQVNBSlFRQk9EUUVNQWdzTElBQWdCRUV3SUFKQkFFNEVmaUFDclFWQ2dJQ0FnTUIrSUFLNHZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCRlFRQklEUUFnQkNFRkRBRUxJQUFnQkJBUEN5QUlRUkJxSkFBZ0JRdTZDUUlDZndoK0l3QkJNR3NpQkNRQUlBTXBBd0FoQmlBRVFvQ0FnSUF3TndNWVFRRWhCUUpBQWtBQ2ZpQUNRUUpJQkVCQ2dJQ0FnREFoREVLQWdJQ0FNQXdCQzBLQWdJQ0FNQ0FES1FNSUlneENnSUNBZ0hDRFFvQ0FnSUF3VVEwQUdrS0FnSUNBTUNFS1FvQ0FnSUF3SVFsQ2dJQ0FnREFoQ0VLQWdJQ0FNQ0VMSUFBZ0RCQmdEUUZCQUNFRlFvQ0FnSUF3SUFKQkEwa05BQm9nQXlrREVBc2hEUUpBQWtBQ1FBSkFJQUFnQmtIUkFTQUdRUUFRRkNJSFFvQ0FnSUJ3Z3lJSVFvQ0FnSUF3VWdSQUFrQUNRQ0FJUW9DQWdJRGdBRkVFUUVLQWdJQ0FNQ0VLUW9DQWdJQXdJUWxDZ0lDQWdEQWhDQXdCQ3lBQUlBY1FEd0orQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweTBBQlVFUWNVVU5BQ0FBSUFGQkFFRUFFS2NCREFFTElBQVFQZ3NpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBUW9DQWdJQXdJUXBDZ0lDQWdEQWhDUXdCQ3lBR1FpQ0lwMEYxVHdSQUlBYW5JZ0lnQWlnQ0FFRUJhallDQUFzZ0JDQUdOd01RSUFBZ0JFRVFha0VJY2tFQUVKa0RJUUlnQkNrREdDRUtJQVFwQXhBaENTQUNSUTBCQzBLQWdJQ0FNQ0VMREFZTFFnQWhCd05BSUFBZ0NTQUtJQVJCQ0dvUXJnRWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQVFvQWdnRVFFS0FnSUNBTUNFTERBWUxBa0FnQlFSQUlBWWhBUXdCQ3lBRUlBWTNBeUFnQkNBSFF2Ly8vLzhQZ3pjREtDQUFJQXdnRFVFQ0lBUkJJR29RSVNFQklBQWdCaEFQSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXdzZ0FDQUlJQWNnQVJCcVFRQklEUUlnQjBJQmZDRUhEQUFMQUFzZ0FDQUdFQ1VpQzBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBZ0JFRUlhaUFMRUR4QkFFZ05BaUFFQW40Z0JDa0RDQ0lHUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FHUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQnJtOUlnZENnSUNBZ01DQmdQei9BSDBnQjBMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMSWdjM0F5QUNmZ0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY3RBQVZCRUhGRkRRQWdBQ0FCUVFFZ0JFRWdhaENuQVF3QkN5QUFRb0NBZ0lBd1FRRWdCRUVnYWhDdUF3c2hDQ0FBSUFjUUR5QUlRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQkNnSUNBZ0RBaENnd0NDMElBSVFjZ0JrSUFJQVpDQUZVYklRa0RRQ0FISUFsUkJFQkNnSUNBZ0RBaENrS0FnSUNBTUNFSkRBVUxRb0NBZ0lBd0lRb2dBQ0FMSUFjUWN5SUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSUNRQ0FGQkVBZ0JpRUJEQUVMSUFRZ0JqY0RJQ0FFSUFkQy8vLy8vdytETndNb0lBQWdEQ0FOUVFJZ0JFRWdhaEFoSVFFZ0FDQUdFQThnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBEQ3lBQUlBZ2dCeUFCRUdwQkFFZ05BaUFIUWdGOElRY01BQXNBQzBLQWdJQ0FNQ0VMSUFsQ2dJQ0FnSENEUW9DQWdJQXdVUTBESUFBZ0NVRUJFSzBCR2d3REMwS0FnSUNBTUNFSkRBSUxRb0NBZ0lBd0lRcENnSUNBZ0RBaENVS0FnSUNBTUNFSURBRUxJQUFnQ0VFd0lBZW5JZ0pCQUU0RWZpQUhRdi8vLy84UGd3VkNnSUNBZ01CK0lBSzR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkZRUUJPRFFFTElBQWdDQkFQUW9DQWdJRGdBQ0VJQ3lBQUlBc1FEeUFBSUFrUUR5QUFJQW9RRHlBRVFUQnFKQUFnQ0FzbUFFS0FnSUNBNEFBZ0FDQURLUU1BRU1vQklnQkJBRWV0UW9DQWdJQVFoQ0FBUVFCSUd3dUFBUUFqQUVFUWF5SUFKQUFnQUJDakJBSitJQUEwQWdnZ0FDa0RBRUxBaEQxK2ZDSUJRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUJRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBYm05SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xJUUVnQUVFUWFpUUFJQUVMeHdJQkJYOGpBRUVnYXlJRUpBQWdBQ0FES1FNQUVDZ2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQUFnQkVFSWFrRUFFRDBhSUFHbklnVkJFR29oQmlBRktBSUVRZi8vLy84SGNTRUhRUUFoQXdOQUlBTWdCMDVGQkVBQ1FBSi9JQVVwQWdSQ2dJQ0FnQWlEVUNJSVJRUkFJQVlnQTBFQmRHb3ZBUUFNQVFzZ0F5QUdhaTBBQUFzaUFrRWxSdzBBQWtBZ0EwRUdhaUFIU2cwQUlBTkJBV29oQWdKL0lBaEZCRUFnQmlBQ1FRRjBhaThCQUF3QkN5QUNJQVpxTFFBQUMwSDFBRWNOQUNBRklBTkJBbXBCQkJDNEJDSUNRUUJJRFFBZ0EwRUZhaUVEREFFTFFTVWhBaUFEUVFOcUlBZEtEUUFnQlNBRFFRRnFRUUlRdUFRaUFrRWxJQUpCQUU0aUNCc2hBaUFEUVFKcUlBTWdDQnNoQXdzZ0JFRUlhaUFDRUlzQkdpQURRUUZxSVFNTUFRc0xJQUFnQVJBUElBUkJDR29RTmlFQkN5QUVRU0JxSkFBZ0FRdmtBUUVFZnlNQVFTQnJJZ0lrQUNBQUlBTXBBd0FRS0NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0FDQUNRUWhxSUFHbklnVW9BZ1JCLy8vLy93ZHhFRDBhSUFWQkVHb2hCaUFGS0FJRVFmLy8vLzhIY1NFSFFRQWhBd05BSUFNZ0IwWkZCRUFDUUFKQUFrQWdCUzBBQjBHQUFYRkZCRUFnQXlBR2FpMEFBQ0VFREFFTElBWWdBMEVCZEdvdkFRQWlCRUgvQVVzTkFRdEJrT0VCSUFSQnhRQVErd0ZGRFFBZ0FrRUlhaUFFRUlzQkdnd0JDeUFDUVFocUlBUVFtZ0lMSUFOQkFXb2hBd3dCQ3dzZ0FDQUJFQThnQWtFSWFoQTJJUUVMSUFKQklHb2tBQ0FCQzg0RUFnWi9BWDRqQUVFZ2F5SUdKQUFDUUNBQUlBTXBBd0FRS0NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUdRUWhxSUFHbklna29BZ1JCLy8vLy93ZHhFRDBhSUFsQkVHb2hDRUVBSVFJQ1FBTkFJQWtwQWdRaUM2ZEIvLy8vL3dkeElnb2dBa29FUUNBQ1FRRnFJUVVDUUFKQUlBdENnSUNBZ0FpRElndFFCRUFnQWlBSWFpMEFBQ0VEREFFTElBZ2dBa0VCZEdvdkFRQWlBMEgvQVVzTkFRc0NRQ0FEUVRCclFRcEpJQU5CMy84RGNVSEJBR3RCR2tseURRQkJwWlFCSUFOQkNSRDdBUTBBSUFRTkFTQURFTElHUlEwQkN5QUdRUWhxSUFNUWl3RWFJQVVoQWd3Q0N3Si9BbjhDUUNBRFFZRDRBM0VpQjBHQXNBTkhCRUFnQjBHQXVBTkhEUUZCdjhNQUlRY01CZ3RCNU1BQUlRY2dCU0FLVGcwRkFuOGdDMUJGQkVBZ0NDQUZRUUYwYWk4QkFBd0JDeUFGSUFocUxRQUFDeUlGUVlEQUEydEJnSGhKRFFVZ0JrRUlhaUFGUWY4SGNTQURRUXAwUVlENFAzRnlRWUNBQkdvaUEwRVNka0h3QVhJUW1nSWdBMEVNZGtFL2NVR0FBWEloQnlBQ1FRSnFEQUVMSUFOQi93Qk5CRUFnQmtFSWFpQURFSm9DSUFVaEFnd0VDeUFEUWY4UFRRUkFJQVVoQWlBRFFRWjJRY0FCY2d3Q0N5QURRUXgyUWVBQmNpRUhJQVVMSVFJZ0JrRUlhaUFIRUpvQ0lBTkJCblpCUDNGQmdBRnlDeUVISUFaQkNHb2lCU0FIRUpvQ0lBVWdBMEUvY1VHQUFYSVFtZ0lNQVFzTElBQWdBUkFQSUFaQkNHb1FOaUVCREFFTElBQWdCeEM1QkNBQUlBRVFEeUFHS0FJSUtBSVFJZ0JCRUdvZ0JpZ0NEQ0FBS0FJRUVRQUFRb0NBZ0lEZ0FDRUJDeUFHUVNCcUpBQWdBUXVWQkFJR2Z3RitJd0JCSUdzaUJTUUFBa0FnQUNBREtRTUFFQ2dpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0JVRUlha0VBRUQwYUlBR25JZ2hCRUdvaENVRUFJUUlEUUFKQUFrQUNRQ0FJS1FJRUlndW5RZi8vLy84SGNTQUNTZ1JBQW44Z0MwS0FnSUNBQ0lOUVJRUkFJQWtnQWtFQmRHb3ZBUUFNQVFzZ0FpQUphaTBBQUFzaUEwRWxSZ1JBSUFBZ0NDQUNFTE1HSWdOQkFFZ05BeUFDUVFOcUlRWWdBMEgvQUUwRVFDQUVCRUFnQmlFQ0RBWUxRU1VnQXlBREVMSUdJZ2NiSVFNZ0FrRUJhaUFHSUFjYklRSU1CUXNDZnlBRFFXQnhRY0FCUmdSQUlBTkJIM0VoQTBHQUFTRUhRUUVNQVFzZ0EwRndjVUhnQVVZRVFDQURRUTl4SVFOQmdCQWhCMEVDREFFTElBTkJlSEZCOEFGSEJFQkJBU0VIUVFBaEEwRUFEQUVMSUFOQkIzRWhBMEdBZ0FRaEIwRURDeUVDQTBBZ0FrRUFUQTBESUFBZ0NDQUdFTE1HSWdwQkFFZ05CQ0FHUVFOcUlRWWdDa0hBQVhGQmdBRkhCRUJCQUNFRERBUUZJQUpCQVdzaEFpQUtRVDl4SUFOQkJuUnlJUU1NQVFzQUN3QUxJQUpCQVdvaEFnd0RDeUFBSUFFUUR5QUZRUWhxRURZaEFRd0VDeUFHSVFJZ0F5QUhTQ0FEUWYvL3d3Qktja1VnQTBHQWNIRkJnTEFEUjNFTkFTQUFRY21KQVJDNUJBc2dBQ0FCRUE4Z0JTZ0NDQ2dDRUNJQVFSQnFJQVVvQWd3Z0FDZ0NCQkVBQUVLQWdJQ0E0QUFoQVF3Q0N5QUZRUWhxSUFNUXVRRWFEQUFMQUFzZ0JVRWdhaVFBSUFFTE53QWdBQ0FES1FNQUVMTUJJZ0pGQkVCQ2dJQ0FnT0FBRHdzZ0FDQUNFSUVDSUFKcVFRQkJDa0VBRUxnQ0lRRWdBQ0FDRUZRZ0FRdUhBUUVCZnlNQVFSQnJJZ0lrQUFKQUlBQWdBeWtEQUJDekFTSUVSUVJBUW9DQWdJRGdBQ0VCREFFTEFuNUNnSUNBZ09BQUlBQWdBa0VNYWlBREtRTUlFSGNOQUJvZ0FpZ0NEQ0lEQkVCQ2dJQ0FnTUIrSUFOQkpXdEJYVWtOQVJvTElBQWdCQkNCQWlBRWFrRUFJQU5CZ1FnUXVBSUxJUUVnQUNBRUVGUUxJQUpCRUdva0FDQUJDd2tBSUFBZ0FSRGRBZ3VqQVFJQmZnRi9Jd0JCRUdzaUFpUUFBbjRnQUNBQkVOMENJZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FGREFFTFFRb2hCZ0pBQWtBZ0JBMEFJQU1wQXdBaUFVS0FnSUNBY0lOQ2dJQ0FnREJSRFFBZ0FDQUJFSTRGSWdaQkFFZ05BUXRDZ0lDQWdPQUFJQUFnQWtFSWFpQUZFRzROQVJvZ0FDQUNLd01JSUFaQkFFRUFFSThDREFFTElBQWdCUkFQUW9DQWdJRGdBQXNoQVNBQ1FSQnFKQUFnQVF1TUFnSUJmZ0Y4SXdCQkVHc2lBaVFBUW9DQWdJRGdBQ0VFQWtBZ0FDQUJFTjBDSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRUU1BUXNnQUNBQ0lBRVFiZzBBQWtBQ1FDQURLUU1BSWdGQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFJcEF3QWhBUXdCQ3lBQUlBSkJER29nQVJDNkFRMENJQUlyQXdBaUJiMGlBVUtBZ0lDQWdJQ0ErUDhBZzBLQWdJQ0FnSUNBK1A4QVVnMEJDeUFBUW9DQWdJREFmaUFCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkVEY2hCQXdCQ3lBQ0tBSU1JZ05CNVFCclFadC9UUVJBSUFCQmlqUkJBQkJRREFFTElBQWdCVUVLSUFOQkFSQ1BBaUVFQ3lBQ1FSQnFKQUFnQkF2WUFRSUJmZ0Y4SXdCQkVHc2lBaVFBUW9DQWdJRGdBQ0VFQWtBZ0FDQUJFTjBDSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRUU1BUXNnQUNBQ0lBRVFiZzBBSUFBZ0FrRU1haUFES1FNQUVMb0JEUUFnQWlnQ0RDSURRZVVBVHdSQUlBQkJpalJCQUJCUURBRUxJQUlyQXdBaUJabEVVTy9pMXVRYVMwUm1CRUFnQUVLQWdJQ0F3SDRnQmIwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeEEzSVFRTUFRc2dBQ0FGUVFvZ0EwRUNFSThDSVFRTElBSkJFR29rQUNBRUN6MEFBbjRDUUNBQkVLTURJZ0pGRFFBZ0FpMEFFRUVCY1EwQVFvQ0FnSUF3SUFJdEFCRkJBWEVOQVJvTElBQkJzalJCQUJBVlFvQ0FnSURnQUFzTHpRTURCWHdCZmdOL0FrQUNRQUpBQWtBZ0FMMGlCa0lBV1FSQUlBWkNJSWluSWdkQi8vOC9TdzBCQ3lBR1F2Ly8vLy8vLy8vLy93Q0RVQVJBUkFBQUFBQUFBUEMvSUFBZ0FLS2pEd3NnQmtJQVdRMEJJQUFnQUtGRUFBQUFBQUFBQUFDakR3c2dCMEgvLzcvL0Iwc05Ba0dBZ01EL0F5RUlRWUY0SVFrZ0IwR0FnTUQvQTBjRVFDQUhJUWdNQWdzZ0JxY05BVVFBQUFBQUFBQUFBQThMSUFCRUFBQUFBQUFBVUVPaXZTSUdRaUNJcHlFSVFjdDNJUWtMSUFaQy8vLy8vdytESUFoQjRyNGxhaUlIUWYvL1AzRkJuc0dhL3dOcXJVSWdob1MvUkFBQUFBQUFBUEMvb0NJQUlBQWdBRVFBQUFBQUFBRGdQNktpSWdPaHZVS0FnSUNBY0lPL0lnUkVBQUFnWlVjVjl6K2lJZ0VnQ1NBSFFSUjJhcmNpQXFBaUJTQUJJQUlnQmFHZ0lBQWdBRVFBQUFBQUFBQUFRS0NqSWdFZ0F5QUJJQUdpSWdJZ0FxSWlBU0FCSUFGRW44WjQwQW1hd3oraVJLOTRqaDNGY2N3L29LSkVCUHFYbVptWjJUK2dvaUFDSUFFZ0FTQUJSRVJTUHQ4UzhjSS9va1RlQTh1V1pFYkhQNkNpUkZtVElwUWtTZEkvb0tKRWsxVlZWVlZWNVQrZ29xQ2dvaUFBSUFTaElBT2hvQ0lBSUFTZ1JBQ2k3eTc4QmVjOW9pQUFSQUFBSUdWSEZmYy9vcUNnb0NFQUN5QUFDd3ZsdWdSbEFFR0FDQXR3L29JclpVY1ZaMEFBQUFBQUFBQTRRd0FBK3Y1Q0xuYS9PanVldkpyM0RMMjkvZi8vLy8vZlB6eFVWVlZWVmNVL2tTc1h6MVZWcFQ4WDBLUm5FUkdCUHdBQUFBQUFBTWhDN3puNi9rSXU1ajhreElML3ZiL09QN1gwRE5jSWE2dy96RkJHMHF1eWd6K0VPazZiNE5kVlB3QkIvZ2dMa2hEd1AyNi9pQnBQTzVzOE5UUDdxVDMyN3o5ZDNOaWNFMkJ4dkdHQWR6NmE3TzgvMFdhSEVIcGVrTHlGZjI3b0ZlUHZQeFAyWnpWUzBvdzhkSVVWMDdEWjd6LzZqdmtqZ002THZONzIzU2xyME84L1ljam1ZVTczWUR6SW0zVVlSY2Z2UDVuVE0xdmtvNUE4Zy9QR3lqNis3ejl0ZTROZHBwcVhQQStKK1d4WXRlOC8vTy85a2hxMWpqejNSM0lya3F6dlA5R2NMM0E5dmo0OG90SFRNdXlqN3o4TGJwQ0pOQU5xdkJ2VC9xOW1tKzgvRHIwdktsSldsYnhSV3hMUUFaUHZQMVhxVG96dmdGQzh6REZzd0wySzd6OFc5Tlc1SThtUnZPQXRxYTZhZ3U4L3IxVmM2ZVBUZ0R4UmpxWEltSHJ2UDBpVHBlb1ZHNEM4ZTFGOVBMaHk3ejg5TXQ1VjhCK1B2T3FOakRqNWF1OC92MU1UUDR5Sml6eDF5Mi9yVzJQdlB5YnJFWGFjMlphODFGd0VoT0JiN3o5Z0x6bys5K3lhUEtxNWFER0hWTzgvblRpR3k0TG5qN3dkMmZ3aVVFM3ZQNDNEcGtSQmI0bzgxb3hpaUR0Rzd6OTlCT1N3QlhxQVBKYmNmWkZKUCs4L2xLaW80LzJPbGp3NFluVnVlamp2UDMxSWRQSVlYb2M4UDZheVQ4NHg3ei95NXgrWUswZUFQTjE4NG1WRksrOC9YZ2h4UDN1NGxyeUJZL1hoM3lUdlB6R3JDVzNoOTRJODRkNGY5WjBlN3ovNnYyOGFteUU5dkpEWjJ0Qi9HTzgvdEFvTWNvSTNpendMQStTbWhSTHZQNC9Mem9tU0ZHNDhWaTgrcWE4TTd6KzJxN0JOZFUyRFBCVzNNUXIrQnU4L1RIU3M0Z0ZDaGp3eDJFejhjQUh2UDByNDAxMDUzWTg4L3haa3Nnajg3ajhFVzQ0N2dLT0d2UEdma2wvRjl1NC9hRkJMek8xS2tyekxxVG8zcC9IdVA0NHRVUnY0QjVtOFp0Z0ZiYTdzN2ovU05wUSs2TkZ4dlBlZjVUVGI1KzQvRlJ2T3N4a1ptYnpscUJQRExlUHVQMjFNS3FkSW40VThJalFTVEtiZTdqK0thU2g2WUJLVHZCeUFyQVJGMnU0L1c0a1hTSStuV0x3cUx2Y2hDdGJ1UHh1YVNXZWJMSHk4bDZoUTJmWFI3ajhSck1KZzdXTkRQQzJKWVdBSXp1NC83MlFHT3dsbWxqeFhBQjN0UWNydVAza0RvZHJoekc0ODBEekJ0YUxHN2o4d0VnOC9qditUUE43VDEvQXF3KzQvc0s5NnU4NlFkanduS2piVjJyL3VQM2ZnVk91OUhaTThEZDM5bWJLODdqK09vM0VBTkpTUHZLY3NuWGF5dWU0L1NhT1QzTXplaDd4Q1pzK2kycmJ1UDE4NEQ3M0czbmk4Z2srZFZpdTA3ai8yWEh2c1JoS0d2QStTWGNxa3NlNC9qdGY5R0FVMWt6emFKN1UyUjYvdVB3V2JpaSszbUhzOC9jZVgxQkt0N2o4SlZCemk0V09RUENsVVNOMEhxKzQvNnNZWlVJWEhORHkzUmxtS0pxbnVQelhBWkN2bU1wUThTQ0d0RlcrbjdqK2ZkcGxoU3VTTXZBbmNkcm5ocGU0L3FFM3ZPOFV6akx5RlZUcXdmcVR1UDY3cEs0bDRVNFM4SU1QTU5FYWo3ajlZV0ZaNDNjNlR2Q1VpVllJNG91NC9aQmwrZ0tvUVZ6eHpxVXpVVmFIdVB5Z2lYci92czVPOHpUdC9acDZnN2orQ3VUU0hyUkpxdkwvYUMzVVNvTzQvN3FsdHVPOW5ZN3d2R21VOHNwL3VQMUdJNEZROTNJQzhoSlJSK1gyZjdqL1BQbHArWkI5NHZIUmY3T2gxbis0L3NIMkx3RXJ1aHJ4MGdhVkltcC91UDRybVZSNHlHWWE4eVdkQ1Z1dWY3ai9UMUFsZXk1eVFQRDlkM2s5cG9PNC9IYVZOdWR3eWU3eUhBZXR6RktIdVAydkFaMVQ5N0pROE1zRXdBZTJoN2o5VmJOYXI0ZXRsUEdKT3p6YnpvdTQvUXMrekw4V2hpTHdTR2o1VUo2VHVQelEzTy9HMmFaTzhFODVNbVltbDdqOGUveGs2aEY2QXZLM0hJMFlhcCs0L2JsZHkyRkRVbEx6dGtrU2IyYWp1UHdDS0RsdG5yWkE4bVdhSzJjZXE3aiswNnZEQkw3ZU5QTnVnS2tMbHJPNC8vK2ZGbkdDMlpieU1STFVXTXEvdVAwUmY4MW1EOW5zOE5uY1ZtYTZ4N2orRFBSNm5Id21Udk1iL2tRdGJ0TzQvS1I1c2k3aXBYYnpseGMyd043ZnVQMW01a0h6NUkyeThEMUxJeTBTNjdqK3ErZlFpUTBPU3ZGQk8zcCtDdmU0L1M0NW0xMnpLaGJ5NkI4cHc4Y0R1UHlmT2tTdjhyM0U4a1BDamdwSEU3ais3Y3dyaE5kSnRQQ01qNHhsanlPNC9ZeUppSWdURmg3eGw1VjE3WnN6dVA5VXg0dU9HSElzOE15MUs3SnZRN2o4VnU3elQwYnVSdkYwbFBySUQxZTQvMGpIdW5ESE1rRHhZc3pBVG50bnVQN05hYzI2RWFZUTh2LzE1Vld2ZTdqKzBuWTZYemQrQ3ZIcnowNzlyNCs0L2h6UExrbmNhakR5dDAxcVpuK2p1UC9yWjBVcVBlNUM4WnJhTktRZnU3ais2cnR4VzJjTlZ2UHNWVDdpaTgrNC9RUGFtUFE2a2tMdzZXZVdOY3ZudVB6U1RyVGowMW1pOFIxNzc4bmIvN2o4MWlsaHI0dTZSdkVvR29UQ3dCZTgvemQxZkN0Zi9kRHpTd1V1UUhnenZQNnlZa3ZyN3ZaRzhDUjdYVzhJUzd6K3pESzh3cm01elBKeFNoZDJiR2U4L2xQMmZYRExqamp4NjBQOWZxeUR2UDZ4WkNkR1A0SVE4UzlGWEx2RW43ejluR2s0NHI4MWpQTFhuQnBSdEwrOC9hQm1TYkN4clp6eHBrTy9jSURmdlA5SzF6SU1ZaW9DOCtzTmRWUXMvN3o5dit2OC9YYTJQdkh5SkIwb3RSKzgvU2FsMU9LNE5rTHp5aVEwSWgwL3ZQNmNIUGFhRm8zUThoNlQ3M0JoWTd6OFBJa0FnbnBHQ3ZKaUR5UmJqWU84L3JKTEIxVkJhamp5Rk10c0Q1bW52UDB0ckFheFpPb1E4WUxRQjh5Rno3ejhmUHJRSElkV0N2RitiZXpPWGZPOC95UTFITzdrcWlid3BvZlVVUm9idlA5T0lPbUFFdG5RODlqK0w1eTZRN3o5eGNwMVI3TVdEUElOTXgvdFJtdTgvOEpIVGp4TDNqN3pha0tTaXI2VHZQMzEwSStLWXJvMjg4V2VPTFVpdjd6OElJS3BCdk1PT1BDZGFZZTRidXU4L011dXB3NVFyaER5WHVtczNLOFh2UCs2RjBUR3BaSW84UUVWdVczYlE3ei90NHp2a3VqZU92QlMrbkszOTIrOC9uYzJSVFR1SmR6ellrSjZCd2VmdlA0bk1ZRUhCQlZNODhYR1BLOEx6N3o4QUFBQUFBQUR3UHdBQUFBQUFBUGcvQUFBQUFBQUFBQUFHME05RDYvMU1QZ0JCbXhrTDU0VUJRQU80NGo4b0tYdDlBQ2dwZTNOMWNHVnlLQzR1TG1GeVozVnRaVzUwY3lrN2ZRQW9LU0I3Q2lBZ0lDQmJibUYwYVhabElHTnZaR1ZkQ24wQVkyRnVibTkwSUcxcGVDQS9QeUIzYVhSb0lDWW1JRzl5SUh4OEFHTjBlZ0J3Y205NGVUb2djSEp2Y0dWeWRIa2dibTkwSUhCeVpYTmxiblFnYVc0Z2RHRnlaMlYwSUhkbGNtVWdjbVYwZFhKdVpXUWdZbmtnYm05dUlHVjRkR1Z1YzJsaWJHVWdjSEp2ZUhrQWNtVjJiMnRsWkNCd2NtOTRlUUJRY205NGVRQmhaR1JmY0hKdmNHVnlkSGtBY0hKdmVIazZJR05oYm01dmRDQnpaWFFnY0hKdmNHVnlkSGtBYm04Z2MyVjBkR1Z5SUdadmNpQndjbTl3WlhKMGVRQjJZV3gxWlNCb1lYTWdibThnY0hKdmNHVnlkSGtBWTI5MWJHUWdibTkwSUdSbGJHVjBaU0J3Y205d1pYSjBlUUJ3Y205NGVUb2daSFZ3YkdsallYUmxJSEJ5YjNCbGNuUjVBRXBUWDBSbFptbHVaVUYxZEc5SmJtbDBVSEp2Y0dWeWRIa0FhR0Z6VDNkdVVISnZjR1Z5ZEhrQWNISnZlSGs2SUdsdVkyOXVjMmx6ZEdWdWRDQmtaV3hsZEdWUWNtOXdaWEowZVFCd2NtOTRlVG9nYVc1amIyNXphWE4wWlc1MElHUmxabWx1WlZCeWIzQmxjblI1QUVwVFgwUmxabWx1WlZCeWIzQmxjblI1QUNGdGNpMCtaVzF3ZEhrQWFXNW1hVzVwZEhrQVNXNW1hVzVwZEhrQWIzVjBJRzltSUcxbGJXOXllUUIxYm10dWIzZHVJSFZ1YVdOdlpHVWdaMlZ1WlhKaGJDQmpZWFJsWjI5eWVRQkhaVzVsY21Gc1gwTmhkR1ZuYjNKNUFHVjJaWEo1QUdGdWVRQmhjSEJzZVFBbkpYTW5JR2x6SUhKbFlXUXRiMjVzZVFCbGVIQmxZM1JwYm1jZ1kyRjBZMmdnYjNJZ1ptbHVZV3hzZVFCemRHbGphM2tBWW1sbmFXNTBJR0Z5WlNCbWIzSmlhV1JrWlc0Z2FXNGdTbE5QVGk1emRISnBibWRwWm5rQWMzVmlZWEp5WVhrQVpXMXdkSGtnWVhKeVlYa0FibTl1SUdsdWRHVm5aWElnYVc1a1pYZ2dhVzRnZEhsd1pXUWdZWEp5WVhrQWJtVm5ZWFJwZG1VZ2FXNWtaWGdnYVc0Z2RIbHdaV1FnWVhKeVlYa0FiM1YwTFc5bUxXSnZkVzVrSUdsdVpHVjRJR2x1SUhSNWNHVmtJR0Z5Y21GNUFHTmhibTV2ZENCamNtVmhkR1VnYm5WdFpYSnBZeUJwYm1SbGVDQnBiaUIwZVhCbFpDQmhjbkpoZVFCcGMwRnljbUY1QUZSNWNHVmtRWEp5WVhrQVoyVjBSR0Y1QUdkbGRGVlVRMFJoZVFCcWMxOW5aWFJmWVhSdmJWOXBibVJsZUFCcGJuWmhiR2xrSUdGeWNtRjVJR2x1WkdWNEFHOTFkQzF2WmkxaWIzVnVaQ0J1ZFcxbGNtbGpJR2x1WkdWNEFFcFRYMEYwYjIxSmMwRnljbUY1U1c1a1pYZ0FabWx1WkVsdVpHVjRBR2x1ZG1Gc2FXUWdaWGh3YjNKMElITjViblJoZUFCcGJuWmhiR2xrSUdGemMybG5ibTFsYm5RZ2MzbHVkR0Y0QUcxaGVBQmNkU1V3TkhnQWFXNTJZV3hwWkNCdmNHTnZaR1U2SUhCalBTVjFJRzl3WTI5a1pUMHdlQ1V3TW5nQUxTc2dJQ0F3V0RCNEFDMHdXQ3N3V0NBd1dDMHdlQ3N3ZUNBd2VBQnNhVzVsSUhSbGNtMXBibUYwYjNJZ2JtOTBJR0ZzYkc5M1pXUWdZV1owWlhJZ2RHaHliM2NBWW1aZmNHOTNBRzV2ZHdCcGJuUmxaMlZ5SUc5MlpYSm1iRzkzQUhOMFlXTnJJRzkyWlhKbWJHOTNBRzExYzNRZ1ltVWdZMkZzYkdWa0lIZHBkR2dnYm1WM0FHbHpWbWxsZHdCRVlYUmhWbWxsZHdCeVlYY0FkR1JwZGdCbVpHbDJBR1ZrYVhZQVkyUnBkZ0FsZFFCamJHRnpjeUJrWldOc1lYSmhkR2x2Ym5NZ1kyRnVKM1FnWVhCd1pXRnlJR2x1SUhOcGJtZHNaUzF6ZEdGMFpXMWxiblFnWTI5dWRHVjRkQUJtZFc1amRHbHZiaUJrWldOc1lYSmhkR2x2Ym5NZ1kyRnVKM1FnWVhCd1pXRnlJR2x1SUhOcGJtZHNaUzF6ZEdGMFpXMWxiblFnWTI5dWRHVjRkQUJzWlhocFkyRnNJR1JsWTJ4aGNtRjBhVzl1Y3lCallXNG5kQ0JoY0hCbFlYSWdhVzRnYzJsdVoyeGxMWE4wWVhSbGJXVnVkQ0JqYjI1MFpYaDBBR1IxY0d4cFkyRjBaU0JoY21kMWJXVnVkQ0J1WVcxbGN5QnViM1FnWVd4c2IzZGxaQ0JwYmlCMGFHbHpJR052Ym5SbGVIUUFaSFZ3YkdsallYUmxJSEJoY21GdFpYUmxjaUJ1WVcxbGN5QnViM1FnWVd4c2IzZGxaQ0JwYmlCMGFHbHpJR052Ym5SbGVIUUFhVzF3YjNKMExtMWxkR0VnYm05MElITjFjSEJ2Y25SbFpDQnBiaUIwYUdseklHTnZiblJsZUhRQVNsTmZSbkpsWlVOdmJuUmxlSFFBU2xORGIyNTBaWGgwQUdwelgyMWhjRjlwZEdWeVlYUnZjbDl1WlhoMEFHcHpYMkZ6ZVc1algyZGxibVZ5WVhSdmNsOXlaWE4xYldWZmJtVjRkQUIxYm1WNGNHVmpkR1ZrSUdWdVpDQnZaaUJwYm5CMWRBQjBkQUJsZUhCdmNuUmxaQ0IyWVhKcFlXSnNaU0FuSlhNbklHUnZaWE1nYm05MElHVjRhWE4wQUhCeWFYWmhkR1VnWTJ4aGMzTWdabWxsYkdRZ0p5VnpKeUJrYjJWeklHNXZkQ0JsZUdsemRBQjBaWE4wQUdGemMybG5ibTFsYm5RZ2NtVnpkQ0J3Y205d1pYSjBlU0J0ZFhOMElHSmxJR3hoYzNRQVltWmZjM0Z5ZEFCemIzSjBBR05pY25RQWRISnBiVk4wWVhKMEFIQmhaRk4wWVhKMEFIVnVhMjV2ZDI0Z2RXNXBZMjlrWlNCelkzSnBjSFFBVTJOeWFYQjBBR2g1Y0c5MEFHWnlaV1ZmZW1WeWIxOXlaV1pqYjNWdWRBQm1ZWE4wWDJGeWNtRjVYMk52ZFc1MEFHSnBibUZ5ZVY5dlltcGxZM1JmWTI5MWJuUUFjM1J5WDJsdVpHVjRJRDA5SUc1MWJWOXJaWGx6WDJOdmRXNTBJQ3NnYzNSeVgydGxlWE5mWTI5MWJuUUFiblZ0WDJsdVpHVjRJRDA5SUc1MWJWOXJaWGx6WDJOdmRXNTBBSE4wY2w5amIzVnVkQUJ3Y205d1gyTnZkVzUwQUhONWJWOXBibVJsZUNBOVBTQmhkRzl0WDJOdmRXNTBBR3hoWW1Wc0lENDlJREFnSmlZZ2JHRmlaV3dnUENCekxUNXNZV0psYkY5amIzVnVkQUJzWVdJeElENDlJREFnSmlZZ2JHRmlNU0E4SUhNdFBteGhZbVZzWDJOdmRXNTBBRzlpYWw5amIzVnVkQUIyWVd3Z1BDQnpMVDVqWVhCMGRYSmxYMk52ZFc1MEFIWmhiRElnUENCekxUNWpZWEIwZFhKbFgyTnZkVzUwQUhOb1lYQmxYMk52ZFc1MEFHcHpYMloxYm1OZmNHTXliR2x1WlY5amIzVnVkQUJ0WlcxdmNubGZkWE5sWkY5amIzVnVkQUJ0WVd4c2IyTmZZMjkxYm5RQWFuTmZablZ1WTE5amIzVnVkQUJqWDJaMWJtTmZZMjkxYm5RQWFXNTJZV3hwWkNCeVpYQmxZWFFnWTI5MWJuUUFhVzUyWVd4cFpDQnlaWEJsZEdsMGFXOXVJR052ZFc1MEFHWnZiblFBYVc1MllXeHBaQ0JqYjJSbElIQnZhVzUwQUdaeWIyMURiMlJsVUc5cGJuUUFhVzUyWVd4cFpDQm9hVzUwQUdOaGJtNXZkQ0JqYjI1MlpYSjBJRTVoVGlCdmNpQkpibVpwYm1sMGVTQjBieUJpYVdkcGJuUUFZMkZ1Ym05MElHTnZiblpsY25RZ2RHOGdZbWxuYVc1MEFHSnZkR2dnYjNCbGNtRnVaSE1nYlhWemRDQmlaU0JpYVdkcGJuUUFibTkwSUdFZ1ltbG5hVzUwQUdWdVkyOWtaVlZTU1VOdmJYQnZibVZ1ZEFCa1pXTnZaR1ZWVWtsRGIyMXdiMjVsYm5RQWRXNWxlSEJsWTNSbFpDQmxibVFnYjJZZ1kyOXRiV1Z1ZEFCcGJuWmhiR2xrSUhOM2FYUmphQ0J6ZEdGMFpXMWxiblFBUW1sblNXNTBBSEJoY25ObFNXNTBBR1IxY0d4cFkyRjBaU0JrWldaaGRXeDBBRzFoYkd4dlkxOXNhVzFwZEFCemNHeHBkQUJsZUhCbFkzUnBibWNnYUdWNElHUnBaMmwwQUhSeWFXMVNhV2RvZEFCeVpXUjFZMlZTYVdkb2RBQjFibk5vYVdaMEFIUnlhVzFNWldaMEFHbHVkbUZzYVdRZ2IyWm1jMlYwQUdsdWRtRnNhV1FnWW5sMFpVOW1abk5sZEFCblpYUlVhVzFsZW05dVpVOW1abk5sZEFCeVpYTnZiSFpwYm1jZ1puVnVZM1JwYjI0Z1lXeHlaV0ZrZVNCelpYUUFjSEp2ZUhrNklHbHVZMjl1YzJsemRHVnVkQ0J6WlhRQVptbHVaRjlxZFcxd1gzUmhjbWRsZEFCbGVIQmxZM1JwYm1jZ2RHRnlaMlYwQUdsdWRtRnNhV1FnWkdWemRISjFZM1IxY21sdVp5QjBZWEpuWlhRQWNISnZlSGs2SUdsdVkyOXVjMmx6ZEdWdWRDQm5aWFFBVjJWaGExTmxkQUJqYjI1emRISjFZM1FBU2xOZlJuSmxaVUYwYjIxVGRISjFZM1FBZFhObElITjBjbWxqZEFCU1pXWnNaV04wQUhKbGFtVmpkQUJ1YjNRZ1lXNGdRWE41Ym1OSFpXNWxjbUYwYjNJZ2IySnFaV04wQUdOaGJtNXZkQ0JqYjI1MlpYSjBJSFJ2SUc5aWFtVmpkQUJwYm5aaGJHbGtJR0p5WVc1a0lHOXVJRzlpYW1WamRBQnZjR1Z5WVc1a0lDZHdjbTkwYjNSNWNHVW5JSEJ5YjNCbGNuUjVJR2x6SUc1dmRDQmhiaUJ2WW1wbFkzUUFjbVZqWldsMlpYSWdhWE1nYm05MElHRnVJRzlpYW1WamRBQnBkR1Z5WVhSdmNpQnRkWE4wSUhKbGRIVnliaUJoYmlCdlltcGxZM1FBYm05MElHRWdSR0YwWlNCdlltcGxZM1FBYm05MElHRWdiMkpxWldOMEFFcFRUMkpxWldOMEFHSnBaMlpzYjJGMEFIQmhjbk5sUm14dllYUUFabXhoZEFCdWIzUm9hVzVuSUhSdklISmxjR1ZoZEFCamIyNWpZWFFBWTI5a1pWQnZhVzUwUVhRQVkyaGhja0YwQUdOb1lYSkRiMlJsUVhRQWEyVjVjd0J3Y205NGVUb2dkR0Z5WjJWMElIQnliM0JsY25SNUlHMTFjM1FnWW1VZ2NISmxjMlZ1ZENCcGJpQndjbTk0ZVNCdmQyNUxaWGx6QUNBZ1ptRnpkQ0JoY25KaGVYTUFaWGh3YjNKMElDY2xjeWNnYVc0Z2JXOWtkV3hsSUNjbGN5Y2dhWE1nWVcxaWFXZDFiM1Z6QUhCeWFYWmhkR1VnWTJ4aGMzTWdabWxsYkdRZ0p5VnpKeUJoYkhKbFlXUjVJR1Y0YVhOMGN3QjBiMjhnYldGdWVTQmhjbWQxYldWdWRITUFWRzl2SUcxaGJua2dZMkZzYkNCaGNtZDFiV1Z1ZEhNQVptRnpkRjloY25KaGVWOWxiR1Z0Wlc1MGN3QWdJR1ZzWlcxbGJuUnpBR2x1ZG1Gc2FXUWdiblZ0WW1WeUlHOW1JR1JwWjJsMGN3QmlhVzVoY25rZ2IySnFaV04wY3dCcGJuWmhiR2xrSUhCeWIzQmxjblI1SUdGalkyVnpjd0JxYzE5dmNGOWtaV1pwYm1WZlkyeGhjM01BWm1RdFBtSjVkR1ZmWTI5a1pTNWlkV1piWkdWbWFXNWxYMk5zWVhOelgzQnZjMTBnUFQwZ1QxQmZaR1ZtYVc1bFgyTnNZWE56QUY5ZloyVjBRMnhoYzNNQWMyVjBTRzkxY25NQVoyVjBTRzkxY25NQWMyVjBWVlJEU0c5MWNuTUFaMlYwVlZSRFNHOTFjbk1BWjJWMFQzZHVVSEp2Y0dWeWRIbEVaWE5qY21sd2RHOXljd0IwYjI4Z2JXRnVlU0JwYldKeWFXTmhkR1ZrSUhGMVlXNTBhV1pwWlhKekFIVnVhV052WkdWZmNISnZjRjl2Y0hNQVlXTnZjd0JtYjNJZ1lYZGhhWFFnYVhNZ2IyNXNlU0IyWVd4cFpDQnBiaUJoYzNsdVkyaHliMjV2ZFhNZ1puVnVZM1JwYjI1ekFHNWxkeTUwWVhKblpYUWdiMjVzZVNCaGJHeHZkMlZrSUhkcGRHaHBiaUJtZFc1amRHbHZibk1BWW5sMFpXTnZaR1VnWm5WdVkzUnBiMjV6QUVNZ1puVnVZM1JwYjI1ekFIQnliM2g1T2lCcGJtTnZibk5wYzNSbGJuUWdjSEpsZG1WdWRFVjRkR1Z1YzJsdmJuTUFVMk55YVhCMFgwVjRkR1Z1YzJsdmJuTUFZWFJ2YlhNQWNISnZlSGs2SUhCeWIzQmxjblJwWlhNZ2JYVnpkQ0JpWlNCemRISnBibWR6SUc5eUlITjViV0p2YkhNQVoyVjBUM2R1VUhKdmNHVnlkSGxUZVcxaWIyeHpBSEpsYzI5c2RtVmZiR0ZpWld4ekFFcFRYMFYyWVd4VWFHbHpBSE4wY21sdVozTUFhVzUyWVd4cFpDQmtaWE5qY21sd2RHOXlJR1pzWVdkekFHbHVkbUZzYVdRZ2NtVm5kV3hoY2lCbGVIQnlaWE56YVc5dUlHWnNZV2R6QUhaaGJIVmxjd0J6WlhSTmFXNTFkR1Z6QUdkbGRFMXBiblYwWlhNQWMyVjBWVlJEVFdsdWRYUmxjd0JuWlhSVlZFTk5hVzUxZEdWekFIUnZieUJ0WVc1NUlHTmhjSFIxY21WekFDQWdjMmhoY0dWekFHZGxkRTkzYmxCeWIzQmxjblI1VG1GdFpYTUFaMk5mWm5KbFpWOWplV05zWlhNQVlXUmtYMlYyWVd4ZmRtRnlhV0ZpYkdWekFISmxjMjlzZG1WZmRtRnlhV0ZpYkdWekFIUnZieUJ0WVc1NUlHeHZZMkZzSUhaaGNtbGhZbXhsY3dCMGIyOGdiV0Z1ZVNCamJHOXpkWEpsSUhaaGNtbGhZbXhsY3dCamIyMXdZV04wWDNCeWIzQmxjblJwWlhNQUlDQndjbTl3WlhKMGFXVnpBR1JsWm1sdVpWQnliM0JsY25ScFpYTUFaVzUwY21sbGN3Qm1jbTl0Ulc1MGNtbGxjd0IwYjI4Z2JXRnVlU0J5WVc1blpYTUFhVzVqYkhWa1pYTUFjMlYwVFdsc2JHbHpaV052Ym1SekFHZGxkRTFwYkd4cGMyVmpiMjVrY3dCelpYUlZWRU5OYVd4c2FYTmxZMjl1WkhNQVoyVjBWVlJEVFdsc2JHbHpaV052Ym1SekFITmxkRk5sWTI5dVpITUFaMlYwVTJWamIyNWtjd0J6WlhSVlZFTlRaV052Ym1SekFHZGxkRlZVUTFObFkyOXVaSE1BYVhSaGJHbGpjd0JoWW5NQWNISnZlSGs2SUdsdVkyOXVjMmx6ZEdWdWRDQm9ZWE1BSlM0cWN3QWdLQ1Z6QUhObGRDQWxjd0JuWlhRZ0pYTUFJQ0FnSUdGMElDVnpBRzV2SUc5MlpYSnNiMkZrWldRZ2IzQmxjbUYwYjNJZ0pYTUFibTkwSUdFZ0pYTUFkVzV6ZFhCd2IzSjBaV1FnYTJWNWQyOXlaRG9nSlhNQWMzVmljM1J5QUhCeWIzaDVPaUJwYm1OdmJuTnBjM1JsYm5RZ1oyVjBUM2R1VUhKdmNHVnlkSGxFWlhOamNtbHdkRzl5QUhOMWNHVnlLQ2tnYVhNZ2IyNXNlU0IyWVd4cFpDQnBiaUJoSUdSbGNtbDJaV1FnWTJ4aGMzTWdZMjl1YzNSeWRXTjBiM0lBY0dGeVpXNTBJR05zWVhOeklHMTFjM1FnWW1VZ1kyOXVjM1J5ZFdOMGIzSUFibTkwSUdFZ1kyOXVjM1J5ZFdOMGIzSUFRWEp5WVhrZ1NYUmxjbUYwYjNJQVUyVjBJRWwwWlhKaGRHOXlBRTFoY0NCSmRHVnlZWFJ2Y2dCU1pXZEZlSEFnVTNSeWFXNW5JRWwwWlhKaGRHOXlBRzV2ZENCaGJpQkJjM2x1WXkxbWNtOXRMVk41Ym1NZ1NYUmxjbUYwYjNJQVkyRnVibTkwSUdsdWRtOXJaU0JoSUhKMWJtNXBibWNnWjJWdVpYSmhkRzl5QUc1dmRDQmhJR2RsYm1WeVlYUnZjZ0JCYzNsdVkwZGxibVZ5WVhSdmNnQnplVzUwWVhnZ1pYSnliM0lBVTNsdWRHRjRSWEp5YjNJQVJYWmhiRVZ5Y205eUFFbHVkR1Z5Ym1Gc1JYSnliM0lBUVdkbmNtVm5ZWFJsUlhKeWIzSUFWSGx3WlVWeWNtOXlBRkpoYm1kbFJYSnliM0lBVW1WbVpYSmxibU5sUlhKeWIzSUFWVkpKUlhKeWIzSUFabXh2YjNJQVptOXVkR052Ykc5eUFHRnVZMmh2Y2dCbWIzSUFhMlY1Um05eUFHVjRjR1ZqZEdsdVp5QnpkWEp5YjJkaGRHVWdjR0ZwY2dCaElHUmxZMnhoY21GMGFXOXVJR2x1SUhSb1pTQm9aV0ZrSUc5bUlHRWdabTl5TFNWeklHeHZiM0FnWTJGdUozUWdhR0YyWlNCaGJpQnBibWwwYVdGc2FYcGxjZ0FuWVhKbmRXMWxiblJ6SnlCcFpHVnVkR2xtYVdWeUlHbHpJRzV2ZENCaGJHeHZkMlZrSUdsdUlHTnNZWE56SUdacFpXeGtJR2x1YVhScFlXeHBlbVZ5QUdsdWRtRnNhV1FnYm5WdFltVnlJRzltSUdGeVozVnRaVzUwY3lCbWIzSWdaMlYwZEdWeUlHOXlJSE5sZEhSbGNnQnBiblpoYkdsa0lITmxkSFJsY2dCcGJuWmhiR2xrSUdkbGRIUmxjZ0JtYVd4MFpYSUFiV2x6YzJsdVp5Qm1iM0p0WVd3Z2NHRnlZVzFsZEdWeUFDSjFjMlVnYzNSeWFXTjBJaUJ1YjNRZ1lXeHNiM2RsWkNCcGJpQm1kVzVqZEdsdmJpQjNhWFJvSUdSbFptRjFiSFFnYjNJZ1pHVnpkSEoxWTNSMWNtbHVaeUJ3WVhKaGJXVjBaWElBYVc1MllXeHBaQ0JqYUdGeVlXTjBaWElBZFc1bGVIQmxZM1JsWkNCamFHRnlZV04wWlhJQWNISnBkbUYwWlNCamJHRnpjeUJtYVdWc1pDQm1iM0ppYVdSa1pXNGdZV1owWlhJZ2MzVndaWElBYVc1MllXeHBaQ0J5WldSbFptbHVhWFJwYjI0Z2IyWWdiR1Y0YVdOaGJDQnBaR1Z1ZEdsbWFXVnlBQ2RzWlhRbklHbHpJRzV2ZENCaElIWmhiR2xrSUd4bGVHbGpZV3dnYVdSbGJuUnBabWxsY2dCcGJuWmhiR2xrSUhKbFpHVm1hVzVwZEdsdmJpQnZaaUJuYkc5aVlXd2dhV1JsYm5ScFptbGxjZ0I1YVdWc1pDQnBjeUJoSUhKbGMyVnlkbVZrSUdsa1pXNTBhV1pwWlhJQUp5VnpKeUJwY3lCaElISmxjMlZ5ZG1Wa0lHbGtaVzUwYVdacFpYSUFiM1JvWlhJQVlYUnZiVEZmYVhOZmFXNTBaV2RsY2lBbUppQmhkRzl0TWw5cGMxOXBiblJsWjJWeUFHTmhibTV2ZENCamIyNTJaWEowSUhSdklHSnBaMmx1ZERvZ2JtOTBJR0Z1SUdsdWRHVm5aWElBYVhOSmJuUmxaMlZ5QUdselUyRm1aVWx1ZEdWblpYSUFZblZtWm1WeUFGTm9ZWEpsWkVGeWNtRjVRblZtWm1WeUFHTmhibTV2ZENCMWMyVWdhV1JsYm5ScFkyRnNJRUZ5Y21GNVFuVm1abVZ5QUdOaGJtNXZkQ0JqYjI1MlpYSjBJR0pwWjJsdWRDQjBieUJ1ZFcxaVpYSUFZMkZ1Ym05MElHTnZiblpsY25RZ1ltbG5abXh2WVhRZ2RHOGdiblZ0WW1WeUFHTmhibTV2ZENCamIyNTJaWEowSUhONWJXSnZiQ0IwYnlCdWRXMWlaWElBWTJGdWJtOTBJR052Ym5abGNuUWdZbWxuWkdWamFXMWhiQ0IwYnlCdWRXMWlaWElBYm05MElHRWdiblZ0WW1WeUFHeHBibVZPZFcxaVpYSUFiV0ZzWm05eWJXVmtJSFZ1YVdOdlpHVWdZMmhoY2dCamJHVmhjZ0J6WlhSWlpXRnlBR2RsZEZsbFlYSUFjMlYwUm5Wc2JGbGxZWElBWjJWMFJuVnNiRmxsWVhJQWMyVjBWVlJEUm5Wc2JGbGxZWElBWjJWMFZWUkRSblZzYkZsbFlYSUFjU0FoUFNCeUFIVnVaWGh3WldOMFpXUWdiR2x1WlNCMFpYSnRhVzVoZEc5eUlHbHVJSEpsWjJWNGNBQjFibVY0Y0dWamRHVmtJR1Z1WkNCdlppQnlaV2RsZUhBQVVtVm5SWGh3QUhOMWNBQnBiblpoYkdsa0lHZHliM1Z3QUhCdmNBQmpiMjUwYVc1MVpTQnRkWE4wSUdKbElHbHVjMmxrWlNCc2IyOXdBR0ptWDJ4dloybGpYMjl3QUc1MWJWOXJaWGx6WDJOdGNBQjFjMlVnYzNSeWFYQUFiV0Z3QUdac1lYUk5ZWEFBVjJWaGEwMWhjQUJsZUhCbFkzUnBibWNnSjNzbklHRm1kR1Z5SUZ4d0FHeHZaekZ3QUdScGRtbHphVzl1SUdKNUlIcGxjbThBZFc1cmJtOTNiZ0JwZEdWeVlYUnZjbDlqYkc5elpWOXlaWFIxY200QWNISnZiV2x6WlNCelpXeG1JSEpsYzI5c2RYUnBiMjRBYjNWMElHOW1JRzFsYlc5eWVTQnBiaUJ5WldkbGVIQWdaWGhsWTNWMGFXOXVBR1JsYzJOeWFYQjBhVzl1QUhCeWIzaDVPaUJrWldacGJtVlFjbTl3WlhKMGVTQmxlR05sY0hScGIyNEFhbk5mWVhONWJtTmZaMlZ1WlhKaGRHOXlYM0psYzI5c2RtVmZablZ1WTNScGIyNEFhbk5mWTNKbFlYUmxYMloxYm1OMGFXOXVBSE5sZEM5aFpHUWdhWE1nYm05MElHRWdablZ1WTNScGIyNEFjbVYwZFhKdUlHNXZkQ0JwYmlCaElHWjFibU4wYVc5dUFFRnplVzVqUjJWdVpYSmhkRzl5Um5WdVkzUnBiMjRBUVhONWJtTkdkVzVqZEdsdmJnQnBiblpoYkdsa0lHOXdaWEpoZEdsdmJnQjFibk4xY0hCdmNuUmxaQ0J2Y0dWeVlYUnBiMjRBWVhkaGFYUWdhVzRnWkdWbVlYVnNkQ0JsZUhCeVpYTnphVzl1QUhscFpXeGtJR2x1SUdSbFptRjFiSFFnWlhod2NtVnpjMmx2YmdCcGJuWmhiR2xrSUdSbFkybHRZV3dnWlhOallYQmxJR2x1SUhKbFozVnNZWElnWlhod2NtVnpjMmx2YmdCaVlXTnJJSEpsWm1WeVpXNWpaU0J2ZFhRZ2IyWWdjbUZ1WjJVZ2FXNGdjbVZuZFd4aGNpQmxlSEJ5WlhOemFXOXVBR2x1ZG1Gc2FXUWdaWE5qWVhCbElITmxjWFZsYm1ObElHbHVJSEpsWjNWc1lYSWdaWGh3Y21WemMybHZiZ0JsZUhCbFkzUmxaQ0FuYjJZbklHOXlJQ2RwYmljZ2FXNGdabTl5SUdOdmJuUnliMndnWlhod2NtVnpjMmx2YmdCMGIyOGdZMjl0Y0d4cFkyRjBaV1FnWkdWemRISjFZM1IxY21sdVp5QmxlSEJ5WlhOemFXOXVBR1Y0Y0dWamRHVmtJQ2Q5SnlCaFpuUmxjaUIwWlcxd2JHRjBaU0JsZUhCeVpYTnphVzl1QUhSdlVISmxZMmx6YVc5dUFHRnphVzRBYW05cGJnQnRhVzRBWTI5d2VWZHBkR2hwYmdCMFpXMXdiR0YwWlNCc2FYUmxjbUZzSUdOaGJtNXZkQ0JoY0hCbFlYSWdhVzRnWVc0Z2IzQjBhVzl1WVd3Z1kyaGhhVzRBWTJseVkzVnNZWElnY0hKdmRHOTBlWEJsSUdOb1lXbHVBR0Z6YzJsbmJnQWhlUzArYzJsbmJnQnBjMFp5YjNwbGJnQnRZWEpyWDJOb2FXeGtjbVZ1QUNod2IzTWdLeUJzWlc0cElEdzlJR0pqWDJKMVpsOXNaVzRBZFc1bGVIQmxZM1JsWkNCbGJHeHBjSE5wY3lCMGIydGxiZ0IwYUdWdUFITmxkSFJsY2lCcGN5Qm1iM0ppYVdSa1pXNEFiblZzYkNCdmNpQjFibVJsWm1sdVpXUWdZWEpsSUdadmNtSnBaR1JsYmdCaGRHRnVBRzVoYmdCdWIzUWdZU0JpYjI5c1pXRnVBRUp2YjJ4bFlXNEFaMk5mYzJOaGJnQmlZV1FnYm05eWJXRnNhWHBoZEdsdmJpQm1iM0p0QUVwVFgwNWxkMU41YldKdmJFWnliMjFCZEc5dEFHWnliMjBBY21GdVpHOXRBSFJ5YVcwQWRHUnBkbkpsYlFCbVpHbDJjbVZ0QUdWa2FYWnlaVzBBWTJScGRuSmxiUUJpWmw5a2FYWnlaVzBBYzNGeWRISmxiUUJwYlhWc0FHNXZkQ0JoSUhONWJXSnZiQUJUZVcxaWIyd0FVbVZuUlhod0lHVjRaV01nYldWMGFHOWtJRzExYzNRZ2NtVjBkWEp1SUdGdUlHOWlhbVZqZENCdmNpQnVkV3hzQUhCaGNtVnVkQ0J3Y205MGIzUjVjR1VnYlhWemRDQmlaU0JoYmlCdlltcGxZM1FnYjNJZ2JuVnNiQUJqWVc1dWIzUWdjMlYwSUhCeWIzQmxjblI1SUNjbGN5Y2diMllnYm5Wc2JBQmpZVzV1YjNRZ2NtVmhaQ0J3Y205d1pYSjBlU0FuSlhNbklHOW1JRzUxYkd3QVRuVnNiQUJtYVd4c0FHNWxkeUJCY25KaGVVSjFabVpsY2lCcGN5QjBiMjhnYzIxaGJHd0FWSGx3WldSQmNuSmhlU0JzWlc1bmRHZ2dhWE1nZEc5dklITnRZV3hzQUdOaGJHd0FaRzkwUVd4c0FHMWhkR05vUVd4c0FISmxjR3hoWTJWQmJHd0FZMlZwYkFCMWNHUmhkR1ZmYkdGaVpXd0FZbU5mWW5WbVczQnZjMTBnUFQwZ1QxQmZiR0ZpWld3QVpYWmhiQUJwYm5aaGJHbGtJR0pwWjJsdWRDQnNhWFJsY21Gc0FHbHVkbUZzYVdRZ2JuVnRZbVZ5SUd4cGRHVnlZV3dBYldGc1ptOXliV1ZrSUdWelkyRndaU0J6WlhGMVpXNWpaU0JwYmlCemRISnBibWNnYkdsMFpYSmhiQUJpWmw5bGVIQmZhVzUwWlhKdVlXd0FZbVpmYkc5blgybHVkR1Z5Ym1Gc0FFcFRYMU5sZEZCeWIzQmxjblI1U1c1MFpYSnVZV3dBU2xOZlIyVjBUM2R1VUhKdmNHVnlkSGxPWVcxbGMwbHVkR1Z5Ym1Gc0FGOWZTbE5mUlhaaGJFbHVkR1Z5Ym1Gc0FHSnBaMlJsWTJsdFlXd0FiblIwWDJabWRGOXdZWEowYVdGc0FIUnZSWGh3YjI1bGJuUnBZV3dBYzJWaGJBQm5iRzlpWVd3QVlteHBibXNBWDE5a1lYUmxYMk5zYjJOckFITjBZV05yQUd4eVpWOWxlR1ZqWDJKaFkydDBjbUZqYXdCekxUNXBjMTkzWldGckFHSm1YM0J2ZDE5MWFRQnpaWFJOYjI1MGFBQm5aWFJOYjI1MGFBQnpaWFJWVkVOTmIyNTBhQUJuWlhSVlZFTk5iMjUwYUFCcGJuWmhiR2xrSUd0bGVYZHZjbVE2SUhkcGRHZ0FjM1JoY25SelYybDBhQUJsYm1SelYybDBhQUJ3Y205d0lEMDlJRXBUWDBGVVQwMWZiR1Z1WjNSb0FHbHVkbUZzYVdRZ1lYSnlZWGtnYkdWdVozUm9BR2x1ZG1Gc2FXUWdZWEp5WVhrZ1luVm1abVZ5SUd4bGJtZDBhQUJwYm5aaGJHbGtJR3hsYm1kMGFBQnBiblpoYkdsa0lHSjVkR1ZNWlc1bmRHZ0FkWE5sSUcxaGRHZ0FUV0YwYUFCd2RYTm9BR0ZqYjNOb0FFcFRYMUpsYzJsNlpVRjBiMjFJWVhOb0FHRnphVzVvQUdGMFlXNW9BR0p5WldGcklHMTFjM1FnWW1VZ2FXNXphV1JsSUd4dmIzQWdiM0lnYzNkcGRHTm9BRzFoZEdOb0FHTmhkR05vQUhObFlYSmphQUJtYjNKRllXTm9BR0ptWDJ4dlp3QkJjbkpoZVNCMGIyOGdiRzl1WndCemRISnBibWNnZEc5dklHeHZibWNBUVhKeVlYa2diRzl2SUd4dmJtY0FjM1ZpYzNSeWFXNW5BR05oYm01dmRDQmpiMjUyWlhKMElITjViV0p2YkNCMGJ5QnpkSEpwYm1jQWRXNWxlSEJsWTNSbFpDQmxibVFnYjJZZ2MzUnlhVzVuQUc1dmRDQmhJSE4wY21sdVp3QnBiblpoYkdsa0lHTm9ZWEpoWTNSbGNpQnBiaUJoSUVwVFQwNGdjM1J5YVc1bkFIUnZVM1J5YVc1bkFIUnZSR0YwWlZOMGNtbHVad0IwYjB4dlkyRnNaVVJoZEdWVGRISnBibWNBZEc5VWFXMWxVM1J5YVc1bkFIUnZURzlqWVd4bFZHbHRaVk4wY21sdVp3QjBiMHh2WTJGc1pWTjBjbWx1WndCMGIwZE5WRk4wY21sdVp3QktVMU4wY21sdVp3QjBiMGxUVDFOMGNtbHVad0IwYjFWVVExTjBjbWx1WndCa2RYQnNhV05oZEdVZ2FXMXdiM0owSUdKcGJtUnBibWNBYVc1MllXeHBaQ0JwYlhCdmNuUWdZbWx1WkdsdVp3QmlhV2NBY21WblpYaHdJRzExYzNRZ2FHRjJaU0IwYUdVZ0oyY25JR1pzWVdjQWIyWUFhVzVtQUdScFptWWdQVDBnS0dsdWREaGZkQ2xrYVdabUFHUnBabVlnUFQwZ0tHbHVkREUyWDNRcFpHbG1aZ0JvY21WbUFHZGpYMlJsWTNKbFpnQm1jbVZsWDNaaGNsOXlaV1lBYjNCMGFXMXBlbVZmYzJOdmNHVmZiV0ZyWlY5bmJHOWlZV3hmY21WbUFISmxjMlYwWDNkbFlXdGZjbVZtQUdSbGJHVjBaVjkzWldGclgzSmxaZ0J2Y0hScGJXbDZaVjl6WTI5d1pWOXRZV3RsWDNKbFpnQnBibVJsZUU5bUFHeGhjM1JKYm1SbGVFOW1BSFpoYkhWbFQyWUFjMlYwVUhKdmRHOTBlWEJsVDJZQVoyVjBVSEp2ZEc5MGVYQmxUMllBYVhOUWNtOTBiM1I1Y0dWUFpnQWxMaXBtQUdadmJuUnphWHBsQUdKcGJtRnllVjl2WW1wbFkzUmZjMmw2WlFCemRISmZjMmw2WlFCdVpYZGZjMmw2WlNBOFBTQnphQzArY0hKdmNGOXphWHBsQUdSbGMyTnlJRHdnY25RdFBtRjBiMjFmYzJsNlpRQmhkRzl0SUR3Z2NuUXRQbUYwYjIxZmMybDZaUUJqYjIxd2RYUmxYM04wWVdOclgzTnBlbVVBYjJKcVgzTnBlbVVBYmlBOElHSjFabDl6YVhwbEFITm9ZWEJsWDNOcGVtVUFhbk5mWm5WdVkxOXdZekpzYVc1bFgzTnBlbVVBYW5OZlpuVnVZMTlqYjJSbFgzTnBlbVVBYldWdGIzSjVYM1Z6WldSZmMybDZaUUJxYzE5bWRXNWpYM05wZW1VQWJtOXliV0ZzYVhwbEFHWnlaV1Y2WlFCeVpYTnZiSFpsQUhSdlVISnBiV2wwYVhabEFIQjFkRjlzZG1Gc2RXVUFkVzVyYm05M2JpQjFibWxqYjJSbElIQnliM0JsY25SNUlIWmhiSFZsQUhKbGMzUWdaV3hsYldWdWRDQmpZVzV1YjNRZ2FHRjJaU0JoSUdSbFptRjFiSFFnZG1Gc2RXVUFhVzUyWVd4cFpDQnlaWFFnZG1Gc2RXVUFYMTlLVTE5QmRHOXRWRzlXWVd4MVpRQmZYM0YxYjNSbEFHbHpSbWx1YVhSbEFHUmxiR1YwWlFCamNtVmhkR1VBYzJWMFJHRjBaUUJuWlhSRVlYUmxBSE5sZEZWVVEwUmhkR1VBWjJWMFZWUkRSR0YwWlFCSmJuWmhiR2xrSUVSaGRHVUFjbVYyWlhKelpRQndZWEp6WlFCd2NtOTRlU0J3Y21WMlpXNTBSWGgwWlc1emFXOXVjeUJvWVc1a2JHVnlJSEpsZEhWeWJtVmtJR1poYkhObEFGQnliMjFwYzJVQWRHOU1iM2RsY2tOaGMyVUFkRzlNYjJOaGJHVk1iM2RsY2tOaGMyVUFkRzlWY0hCbGNrTmhjMlVBZEc5TWIyTmhiR1ZWY0hCbGNrTmhjMlVBYVdkdWIzSmxRMkZ6WlFCc2IyTmhiR1ZEYjIxd1lYSmxBSEJ5YjNoNU9pQnBibU52Ym5OcGMzUmxiblFnY0hKdmRHOTBlWEJsQUhCeWIzaDVPaUJpWVdRZ2NISnZkRzkwZVhCbEFHNXZkQ0JoSUhCeWIzUnZkSGx3WlFCcGJuWmhiR2xrSUc5aWFtVmpkQ0IwZVhCbEFIVnVaWE5qWVhCbEFHNXZibVVBY21WemRDQmxiR1Z0Wlc1MElHMTFjM1FnWW1VZ2RHaGxJR3hoYzNRZ2IyNWxBRzExYkhScGJHbHVaUUFnSUhCak1teHBibVVBYzI5dFpRQktVMTlHY21WbFVuVnVkR2x0WlFCS1UxSjFiblJwYldVQWMyVjBWR2x0WlFCblpYUlVhVzFsQUhObGRGOXZZbXBsWTNSZmJtRnRaUUJsZUhCbFkzUnBibWNnY0hKdmNHVnlkSGtnYm1GdFpRQjFibXR1YjNkdUlIVnVhV052WkdVZ2NISnZjR1Z5ZEhrZ2JtRnRaUUJwYm5aaGJHbGtJSEJ5YjNCbGNuUjVJRzVoYldVQVpIVndiR2xqWVhSbElGOWZjSEp2ZEc5Zlh5QndjbTl3WlhKMGVTQnVZVzFsQUdsdWRtRnNhV1FnY21Wa1pXWnBibWwwYVc5dUlHOW1JSEJoY21GdFpYUmxjaUJ1WVcxbEFHVjRjR1ZqZEdsdVp5Qm5jbTkxY0NCdVlXMWxBR1IxY0d4cFkyRjBaU0JuY205MWNDQnVZVzFsQUdsdWRtRnNhV1FnWjNKdmRYQWdibUZ0WlFCa2RYQnNhV05oZEdVZ2JHRmlaV3dnYm1GdFpRQnBiblpoYkdsa0lHWnBjbk4wSUdOb1lYSmhZM1JsY2lCdlppQndjbWwyWVhSbElHNWhiV1VBYVc1MllXeHBaQ0JzWlhocFkyRnNJSFpoY21saFlteGxJRzVoYldVQWFXNTJZV3hwWkNCdFpYUm9iMlFnYm1GdFpRQmxlSEJsWTNScGJtY2dabWxsYkdRZ2JtRnRaUUJwYm5aaGJHbGtJR1pwWld4a0lHNWhiV1VBWTJ4aGMzTWdjM1JoZEdWdFpXNTBJSEpsY1hWcGNtVnpJR0VnYm1GdFpRQm1hV3hsVG1GdFpRQmpiMjF3YVd4bEFHOWlhbVZqZENCcGN5QnViM1FnWlhoMFpXNXphV0pzWlFCd2NtOTRlVG9nYVc1amIyNXphWE4wWlc1MElHbHpSWGgwWlc1emFXSnNaUUJqWVc1dWIzUWdhR0YyWlNCelpYUjBaWEl2WjJWMGRHVnlJR0Z1WkNCMllXeDFaU0J2Y2lCM2NtbDBZV0pzWlFCd2NtOXdaWEowZVNCcGN5QnViM1FnWTI5dVptbG5kWEpoWW14bEFIWmhiSFZsSUdseklHNXZkQ0JwZEdWeVlXSnNaUUJ3Y205d1pYSjBlVWx6Ulc1MWJXVnlZV0pzWlFCdGFYTnphVzVuSUdsdWFYUnBZV3hwZW1WeUlHWnZjaUJqYjI1emRDQjJZWEpwWVdKc1pRQnNaWGhwWTJGc0lIWmhjbWxoWW14bEFHbHVkbUZzYVdRZ2NtVmtaV1pwYm1sMGFXOXVJRzltSUdFZ2RtRnlhV0ZpYkdVQWNtVjJiMk5oWW14bEFITjBjbWxyWlFCdGNGOWthWFp1YjNKdFgyeGhjbWRsQUdsdWRtRnNhV1FnWTJ4aGMzTWdjbUZ1WjJVQWJXVnpjMkZuWlFCaGMzbHVZMTltZFc1algyWnlaV1VBYVc1MllXeHBaQ0JzZG1Gc2RXVWdhVzRnYzNSeWFXTjBJRzF2WkdVQWFXNTJZV3hwWkNCMllYSnBZV0pzWlNCdVlXMWxJR2x1SUhOMGNtbGpkQ0J0YjJSbEFHTmhibTV2ZENCa1pXeGxkR1VnWVNCa2FYSmxZM1FnY21WbVpYSmxibU5sSUdsdUlITjBjbWxqZENCdGIyUmxBRzlqZEdGc0lHVnpZMkZ3WlNCelpYRjFaVzVqWlhNZ1lYSmxJRzV2ZENCaGJHeHZkMlZrSUdsdUlITjBjbWxqZENCdGIyUmxBRzlqZEdGc0lHeHBkR1Z5WVd4eklHRnlaU0JrWlhCeVpXTmhkR1ZrSUdsdUlITjBjbWxqZENCdGIyUmxBSFZ1YVdOdlpHVUFJQ0JpZVhSbFkyOWtaUUJLVTBaMWJtTjBhVzl1UW5sMFpXTnZaR1VBYzJ0cGNGOWtaV0ZrWDJOdlpHVUFhVzUyWVd4cFpDQmhjbWQxYldWdWRDQnVZVzFsSUdsdUlITjBjbWxqZENCamIyUmxBR2x1ZG1Gc2FXUWdablZ1WTNScGIyNGdibUZ0WlNCcGJpQnpkSEpwWTNRZ1kyOWtaUUJwYm5aaGJHbGtJSEpsWkdWbWFXNXBkR2x2YmlCdlppQm5iRzlpWVd3Z2FXUmxiblJwWm1sbGNpQnBiaUJ0YjJSMWJHVWdZMjlrWlFCcGJYQnZjblF1YldWMFlTQnZibXg1SUhaaGJHbGtJR2x1SUcxdlpIVnNaU0JqYjJSbEFHWnliMjFEYUdGeVEyOWtaUUJwYm5aaGJHbGtJR1p2Y2lCcGJpOXZaaUJzWldaMElHaGhibVF0YzJsa1pRQnBiblpoYkdsa0lHRnpjMmxuYm0xbGJuUWdiR1ZtZEMxb1lXNWtJSE5wWkdVQWNtVmtkV05sQUhOdmRYSmpaUUFuZEdocGN5Y2dZMkZ1SUdKbElHbHVhWFJwWVd4cGVtVmtJRzl1YkhrZ2IyNWpaUUJ3Y205d1pYSjBlU0JqYjI1emRISjFZM1J2Y2lCaGNIQmxZWEp6SUcxdmNtVWdkR2hoYmlCdmJtTmxBR2x1ZG1Gc2FXUWdWVlJHTFRnZ2MyVnhkV1Z1WTJVQVkybHlZM1ZzWVhJZ2NtVm1aWEpsYm1ObEFITnNhV05sQUhOd2JHbGpaUUJ5WVdObEFISmxjR3hoWTJVQUpTc3VLbVVBZFc1bGVIQmxZM1JsWkNBbllYZGhhWFFuSUd0bGVYZHZjbVFBZFc1bGVIQmxZM1JsWkNBbmVXbGxiR1FuSUd0bGVYZHZjbVFBYldGd1gyUmxZM0psWmw5eVpXTnZjbVFBYVhSbGNtRjBiM0lnWkc5bGN5QnViM1FnYUdGMlpTQmhJSFJvY205M0lHMWxkR2h2WkFCdlltcGxZM1FnYm1WbFpITWdkRzlKVTA5VGRISnBibWNnYldWMGFHOWtBQ2R6ZFhCbGNpY2dhWE1nYjI1c2VTQjJZV3hwWkNCcGJpQmhJRzFsZEdodlpBQm1jbTkxYm1RQVgxOWlabDl5YjNWdVpBQmljbVZoYXk5amIyNTBhVzUxWlNCc1lXSmxiQ0J1YjNRZ1ptOTFibVFBYjNWMElHOW1JR0p2ZFc1a0FHWnBibVFBWW1sdVpBQnBiblpoYkdsa0lHbHVaR1Y0SUdadmNpQmhjSEJsYm1RQVpYaDBjbUZ1Wlc5MWN5QmphR0Z5WVdOMFpYSnpJR0YwSUhSb1pTQmxibVFBZFc1bGVIQmxZM1JsWkNCa1lYUmhJR0YwSUhSb1pTQmxibVFBZFc1bGVIQmxZM1JsWkNCbGJtUUFhVzUyWVd4cFpDQnBibU55WlcxbGJuUXZaR1ZqY21WdFpXNTBJRzl3WlhKaGJtUUFhVzUyWVd4cFpDQW5hVzV6ZEdGdVkyVnZaaWNnY21sbmFIUWdiM0JsY21GdVpBQnBiblpoYkdsa0lDZHBiaWNnYjNCbGNtRnVaQUIwY21sdFJXNWtBSEJoWkVWdVpBQmliMnhrQUNWc2JHUUFaMk5mWkdWamNtVm1YMk5vYVd4a0FISmxjMjlzZG1WZmMyTnZjR1ZmY0hKcGRtRjBaVjltYVdWc1pBQmpZVzV1YjNRZ1pHVnNaWFJsSUdFZ2NISnBkbUYwWlNCamJHRnpjeUJtYVdWc1pBQmxlSEJsWTNScGJtY2dQR0p5WVc1a1BpQndjbWwyWVhSbElHWnBaV3hrQUNWeklHbHpJRzV2ZENCcGJtbDBhV0ZzYVhwbFpBQm1hWGhsWkFCMGIwWnBlR1ZrQUhObGRGOXZZbXBsWTNSZmJtRnRaVjlqYjIxd2RYUmxaQUJ5WldkbGVDQnViM1FnYzNWd2NHOXlkR1ZrQUdWMllXd2dhWE1nYm05MElITjFjSEJ2Y25SbFpBQlNaV2RGZUhBZ1lYSmxJRzV2ZENCemRYQndiM0owWldRQWFXNTBaWEp5ZFhCMFpXUUFKWE1nYjJKcVpXTjBJR1Y0Y0dWamRHVmtBR2xrWlc1MGFXWnBaWElnWlhod1pXTjBaV1FBWW5sMFpXTnZaR1VnWm5WdVkzUnBiMjRnWlhod1pXTjBaV1FBYzNSeWFXNW5JR1Y0Y0dWamRHVmtBR1p5YjIwZ1kyeGhkWE5sSUdWNGNHVmpkR1ZrQUdaMWJtTjBhVzl1SUc1aGJXVWdaWGh3WldOMFpXUUFkbUZ5YVdGaWJHVWdibUZ0WlNCbGVIQmxZM1JsWkFCdFpYUmhJR1Y0Y0dWamRHVmtBSEpsYW1WamRHVmtBRzFsYlc5eWVTQmhiR3h2WTJGMFpXUUFiV1Z0YjNKNUlIVnpaV1FBWkdWeWFYWmxaQ0JqYkdGemN5QmpiMjV6ZEhKMVkzUnZjaUJ0ZFhOMElISmxkSFZ5YmlCaGJpQnZZbXBsWTNRZ2IzSWdkVzVrWldacGJtVmtBR05oYm01dmRDQnpaWFFnY0hKdmNHVnlkSGtnSnlWekp5QnZaaUIxYm1SbFptbHVaV1FBWTJGdWJtOTBJSEpsWVdRZ2NISnZjR1Z5ZEhrZ0p5VnpKeUJ2WmlCMWJtUmxabWx1WldRQVpteGhaM01nYlhWemRDQmlaU0IxYm1SbFptbHVaV1FBVlc1a1pXWnBibVZrQUhCeWFYWmhkR1VnWTJ4aGMzTWdabWxsYkdRZ2FYTWdZV3h5WldGa2VTQmtaV1pwYm1Wa0FDY2xjeWNnYVhNZ2JtOTBJR1JsWm1sdVpXUUFaM0p2ZFhBZ2JtRnRaU0J1YjNRZ1pHVm1hVzVsWkFCdmNHVnlZWFJ2Y2lBbGN6b2dibThnWm5WdVkzUnBiMjRnWkdWbWFXNWxaQUJoYkd4VFpYUjBiR1ZrQUdaMWJHWnBiR3hsWkFCallXNXViM1FnWW1VZ1kyRnNiR1ZrQUdselUyVmhiR1ZrQUNGemFDMCthWE5mYUdGemFHVmtBSFpoY2w5eVpXWXRQbWx6WDJSbGRHRmphR1ZrQUVGeWNtRjVRblZtWm1WeUlHbHpJR1JsZEdGamFHVmtBR0ZrWkFBbEt6QTNaQUFsTURSa0FDVXdNbVFsTURKa0FDVXdNbVF2SlRBeVpDOGxNQ3BrQUNVdU0zTWdKUzR6Y3lBbE1ESmtJQ1V3S21RQU9pVmtBR2x1ZG1Gc2FXUWdkR2h5YjNjZ2RtRnlJSFI1Y0dVZ0pXUUFjMk1BYW5OZlpHVm1YMjFoYkd4dll3QjBjblZ1WXdCbll3QmxlR1ZqQUdKbVgybHVkR1ZuWlhKZmRHOWZjbUZrYVhoZmNtVmpBSEYxYVdOcmFuTXZjWFZwWTJ0cWN5NWpBSEYxYVdOcmFuTXZiR2xpY21WblpYaHdMbU1BY1hWcFkydHFjeTlzYVdKaVppNWpBSEYxYVdOcmFuTXZiR2xpZFc1cFkyOWtaUzVqQUhOMVlnQndjbTl0YVhObFgzSmxZV04wYVc5dVgycHZZZ0JxYzE5d2NtOXRhWE5sWDNKbGMyOXNkbVZmZEdobGJtRmliR1ZmYW05aUFISWdJVDBnWVNBbUppQnlJQ0U5SUdJQWNTQWhQU0JoSUNZbUlIRWdJVDBnWWdCeWQyRUFjaUFoUFNCaEFGOWZiRzl2YTNWd1UyVjBkR1Z5WDE4QVgxOWtaV1pwYm1WVFpYUjBaWEpmWHdCZlgyeHZiMnQxY0VkbGRIUmxjbDlmQUY5ZlpHVm1hVzVsUjJWMGRHVnlYMThBWDE5d2NtOTBiMTlmQUZ0VGVXMWliMnd1YzNCc2FYUmRBRnRUZVcxaWIyd3VjM0JsWTJsbGMxMEFXMU41YldKdmJDNXBkR1Z5WVhSdmNsMEFXMU41YldKdmJDNWhjM2x1WTBsMFpYSmhkRzl5WFFCYlUzbHRZbTlzTG0xaGRHTm9RV3hzWFFCYlUzbHRZbTlzTG0xaGRHTm9YUUJiVTNsdFltOXNMbk5sWVhKamFGMEFXMU41YldKdmJDNTBiMU4wY21sdVoxUmhaMTBBVzFONWJXSnZiQzUwYjFCeWFXMXBkR2wyWlYwQVczVnVjM1Z3Y0c5eWRHVmtJSFI1Y0dWZEFGdG1kVzVqZEdsdmJpQmllWFJsWTI5a1pWMEFXMU41YldKdmJDNW9ZWE5KYm5OMFlXNWpaVjBBVzFONWJXSnZiQzV5WlhCc1lXTmxYUUJiQUNVd01tUTZKVEF5WkRvbE1ESmtMaVV3TTJSYUFGQlBVMGxVU1ZaRlgwbE9Sa2xPU1ZSWkFFNUZSMEZVU1ZaRlgwbE9Sa2xPU1ZSWkFIQXRQbU5zWVhOelgybGtJRDA5SUVwVFgwTk1RVk5UWDBGU1VrRlpBSE4wWVdOclgyeGxiaUE4SUZCUFVGOVRWRUZEUzE5TVJVNWZUVUZZQUMwbE1ESmtMU1V3TW1SVUFFcFRYMEYwYjIxSFpYUlRkSEpTVkFCdmNHTnZaR1VnUENCU1JVOVFYME5QVlU1VUFFSlpWRVZUWDFCRlVsOUZURVZOUlU1VUFDVXdNbVE2SlRBeVpEb2xNREprSUVkTlZBQktVMTlXUVV4VlJWOUhSVlJmVkVGSEtITm1MVDVqZFhKZlpuVnVZeWtnUFQwZ1NsTmZWRUZIWDA5Q1NrVkRWQUIyWVhKZmEybHVaQ0E5UFNCS1UxOVdRVkpmVUZKSlZrRlVSVjlUUlZSVVJWSUFUVUZZWDFOQlJrVmZTVTVVUlVkRlVnQk5TVTVmVTBGR1JWOUpUbFJGUjBWU0FHRnpWV2x1ZEU0QVlYTkpiblJPQUdselRtRk9BRVJoZEdVZ2RtRnNkV1VnYVhNZ1RtRk9BSFJ2U2xOUFRnQkZVRk5KVEU5T0FFNUJUZ0FsTURKa09pVXdNbVE2SlRBeVpDQWxZMDBBY3kwK2JHRmlaV3hmYzJ4dmRITmJiR0ZpWld4ZExtWnBjbk4wWDNKbGJHOWpJRDA5SUU1VlRFd0FiR0ZpWld4ZmMyeHZkSE5iYVYwdVptbHljM1JmY21Wc2IyTWdQVDBnVGxWTVRBQndjbk1nSVQwZ1RsVk1UQUJ6WmkwK1kzVnlYM053SUNFOUlFNVZURXdBYzJZZ0lUMGdUbFZNVEFCdGNqRWdJVDBnVGxWTVRBQjJZWEpmYTJsdVpDQWhQU0JLVTE5V1FWSmZUazlTVFVGTUFHSXRQbVoxYm1OZmEybHVaQ0E5UFNCS1UxOUdWVTVEWDA1UFVrMUJUQUJsYm1OdlpHVlZVa2tBWkdWamIyUmxWVkpKQUZCSkFITndaV05wWVd3Z1BUMGdVRlZVWDB4V1FVeFZSVjlPVDB0RlJWQWdmSHdnYzNCbFkybGhiQ0E5UFNCUVZWUmZURlpCVEZWRlgwNVBTMFZGVUY5RVJWQlVTQUJ6TFQ1emRHRjBaU0E5UFNCS1UxOUJVMWxPUTE5SFJVNUZVa0ZVVDFKZlUxUkJWRVZmUlZoRlExVlVTVTVIQUhCeVpXTXhJQ0U5SUVKR1gxQlNSVU5mU1U1R0FEQXhNak0wTlRZM09EbEJRa05FUlVZQVUwbGFSUUJOUVZoZlZrRk1WVVVBVFVsT1gxWkJURlZGQUU1QlRVVUFaWFpoYkY5MGVYQmxJRDA5SUVwVFgwVldRVXhmVkZsUVJWOUhURTlDUVV3Z2ZId2daWFpoYkY5MGVYQmxJRDA5SUVwVFgwVldRVXhmVkZsUVJWOU5UMFJWVEVVQWNDMCtaMk5mYjJKcVgzUjVjR1VnUFQwZ1NsTmZSME5mVDBKS1gxUlpVRVZmU2xOZlQwSktSVU5VSUh4OElIQXRQbWRqWDI5aWFsOTBlWEJsSUQwOUlFcFRYMGREWDA5Q1NsOVVXVkJGWDBaVlRrTlVTVTlPWDBKWlZFVkRUMFJGQUV4UFJ6SkZBRXhQUnpFd1JRQnpMVDV6ZEdGMFpTQTlQU0JLVTE5QlUxbE9RMTlIUlU1RlVrRlVUMUpmVTFSQlZFVmZRVmRCU1ZSSlRrZGZVa1ZVVlZKT0lIeDhJSE10UG5OMFlYUmxJRDA5SUVwVFgwRlRXVTVEWDBkRlRrVlNRVlJQVWw5VFZFRlVSVjlEVDAxUVRFVlVSVVFBVlZSREFEeHBibkIxZEQ0QVBITmxkRDRBUEdGdWIyNTViVzkxY3o0QVBHUjFiWEErQUR4dWRXeHNQZ0JpYVdkcGJuUWdiM0JsY21GdVpITWdZWEpsSUdadmNtSnBaR1JsYmlCbWIzSWdQajQrQUNaeGRXOTBPd0J6WlhSVmFXNTBPQUJuWlhSVmFXNTBPQUJ6WlhSSmJuUTRBR2RsZEVsdWREZ0FiV0ZzWm05eWJXVmtJRlZVUmkwNEFISmhaR2w0SUcxMWMzUWdZbVVnWW1WMGQyVmxiaUF5SUdGdVpDQXpOZ0J6WlhSVmFXNTBNVFlBWjJWMFZXbHVkREUyQUhObGRFbHVkREUyQUdkbGRFbHVkREUyQUdGeVoyTWdQVDBnTlFCelpYUkNhV2RWYVc1ME5qUUFaMlYwUW1sblZXbHVkRFkwQUhObGRFSnBaMGx1ZERZMEFHZGxkRUpwWjBsdWREWTBBSE5sZEVac2IyRjBOalFBWjJWMFJteHZZWFEyTkFCaGNtZGpJRDA5SURNQVlYUmhiaklBYkc5bk1nQm1iRzl2Y2t4dlp6SUFVMUZTVkRGZk1nQlRVVkpVTWdCTVRqSUFZMng2TXpJQWMyVjBWV2x1ZERNeUFHZGxkRlZwYm5Rek1nQnpaWFJKYm5Rek1nQm5aWFJKYm5Rek1nQnpaWFJHYkc5aGRETXlBR2RsZEVac2IyRjBNeklBYzNSaFkydGZiR1Z1SUQ0OUlESUFTbE5mUVhSdmJVbHpUblZ0WlhKcFkwbHVaR1Y0TVFCcWMxOW1ZM1owTVFCS1UxOURiMjF3WVdOMFFtbG5TVzUwTVFCbGVIQnRNUUJ5SUNFOUlHRXhJQ1ltSUhJZ0lUMGdZakVBYkhNdFBtRmtaSElnUFQwZ0xURUFibkVnUGowZ01RQnpkR0ZqYTE5c1pXNGdQajBnTVFCd0xUNW9aV0ZrWlhJdWNtVm1YMk52ZFc1MElEMDlJREVBY0MwK2MyaGhjR1V0UG1obFlXUmxjaTV5WldaZlkyOTFiblFnUFQwZ01RQnpkR0ZqYTE5c1pXNGdQVDBnTVFCcWMxOW1jbVZsWDNOb1lYQmxNQUJzYjJjeE1BQk1UakV3QUhBdFBuSmxabDlqYjNWdWRDQStJREFBZG1GeVgzSmxaaTArYUdWaFpHVnlMbkpsWmw5amIzVnVkQ0ErSURBQWMzUmhZMnRmYzJsNlpTQStJREFBWTNCdmIyeGZhV1I0SUQ0OUlEQUFjblF0UG1GMGIyMWZZMjkxYm5RZ1BqMGdNQUJzY3kwK2NtVm1YMk52ZFc1MElENDlJREFBY3kwK2FYTmZaWFpoYkNCOGZDQnpMVDVqYkc5emRYSmxYM1poY2w5amIzVnVkQ0E5UFNBd0FIQXRQbkpsWmw5amIzVnVkQ0E5UFNBd0FHTjBlQzArYUdWaFpHVnlMbkpsWmw5amIzVnVkQ0E5UFNBd0FITm9MVDVvWldGa1pYSXVjbVZtWDJOdmRXNTBJRDA5SURBQWNDMCtiV0Z5YXlBOVBTQXdBQ2h1TWlBbElITjBjbWx3WDJ4bGJpa2dQVDBnTUFBb2NISXRQblV1YVc1cGRDNXlaV0ZzYlY5aGJtUmZhV1FnSmlBektTQTlQU0F3QUNodVpYZGZhR0Z6YUY5emFYcGxJQ1lnS0c1bGQxOW9ZWE5vWDNOcGVtVWdMU0F4S1NrZ1BUMGdNQUJwSUNFOUlEQUFjMmw2WlNBaFBTQXdBRjRrWEM0cUt6OG9LVnRkZTMxOEx3QThMd0F3TGdCdGFYTnphVzVuSUdKcGJtUnBibWNnY0dGMGRHVnliaTR1TGdCaWFXZHBiblFnWVhKbmRXMWxiblFnZDJsMGFDQjFibUZ5ZVNBckFHRnplVzVqSUdaMWJtTjBhVzl1SUNvQUNuMHBBR3hwYzNSZlpXMXdkSGtvSm5KMExUNW5ZMTl2WW1wZmJHbHpkQ2tBYWlBOVBTQW9jMmd0UG5CeWIzQmZZMjkxYm5RZ0xTQnphQzArWkdWc1pYUmxaRjl3Y205d1gyTnZkVzUwS1FCS1UxOUpjMVZ1WkdWbWFXNWxaQ2htZFc1algzSmxkQ2tBSVY5ZlNsTmZRWFJ2YlVselZHRm5aMlZrU1c1MEtHUmxjMk55S1FBaFlYUnZiVjlwYzE5bWNtVmxLSEFwQUNodWRXeHNLUUFnS0c1aGRHbDJaU2tBYW5OZlkyeGhjM05mYUdGelgySjVkR1ZqYjJSbEtIQXRQbU5zWVhOelgybGtLUUIxYm1OdmJuTnBjM1JsYm5RZ2MzUmhZMnNnYzJsNlpUb2dKV1FnSldRZ0tIQmpQU1ZrS1FCaWVYUmxZMjlrWlNCaWRXWm1aWElnYjNabGNtWnNiM2NnS0c5d1BTVmtMQ0J3WXowbFpDa0FjM1JoWTJzZ2IzWmxjbVpzYjNjZ0tHOXdQU1ZrTENCd1l6MGxaQ2tBYzNSaFkyc2dkVzVrWlhKbWJHOTNJQ2h2Y0QwbFpDd2djR005SldRcEFHbHVkbUZzYVdRZ2IzQmpiMlJsSUNodmNEMGxaQ3dnY0dNOUpXUXBBQ2cvT2lrQWJtOGdablZ1WTNScGIyNGdabWxzWlc1aGJXVWdabTl5SUdsdGNHOXlkQ2dwQUMxZkxpRitLaWNvS1FBZ1lXNXZibmx0YjNWektBQlRlVzFpYjJ3b0FHVjRjR1ZqZEdsdVp5QW5mU2NBWTJ4aGMzTWdZMjl1YzNSeWRXTjBiM0p6SUcxMWMzUWdZbVVnYVc1MmIydGxaQ0IzYVhSb0lDZHVaWGNuQUdWNGNHVmpkR2x1WnlBbllYTW5BSFZ1Wlhod1pXTjBaV1FnZEc5clpXNGdhVzRnWlhod2NtVnpjMmx2YmpvZ0p5VXVLbk1uQUhWdVpYaHdaV04wWldRZ2RHOXJaVzQ2SUNjbExpcHpKd0J5WldSbFkyeGhjbUYwYVc5dUlHOW1JQ2NsY3ljQVpIVndiR2xqWVhSbElHVjRjRzl5ZEdWa0lHNWhiV1VnSnlWekp3QmphWEpqZFd4aGNpQnlaV1psY21WdVkyVWdkMmhsYmlCc2IyOXJhVzVuSUdadmNpQmxlSEJ2Y25RZ0p5VnpKeUJwYmlCdGIyUjFiR1VnSnlWekp3QkRiM1ZzWkNCdWIzUWdabWx1WkNCbGVIQnZjblFnSnlWekp5QnBiaUJ0YjJSMWJHVWdKeVZ6SndCamIzVnNaQ0J1YjNRZ2JHOWhaQ0J0YjJSMWJHVWdKeVZ6SndCallXNXViM1FnWkdWbWFXNWxJSFpoY21saFlteGxJQ2NsY3ljQWRXNWtaV1pwYm1Wa0lIQnlhWFpoZEdVZ1ptbGxiR1FnSnlWekp3QjFibk4xY0hCdmNuUmxaQ0J5WldabGNtVnVZMlVnZEc4Z0ozTjFjR1Z5SndCcGJuWmhiR2xrSUhWelpTQnZaaUFuYzNWd1pYSW5BQ2RtYjNJZ1lYZGhhWFFuSUd4dmIzQWdjMmh2ZFd4a0lHSmxJSFZ6WldRZ2QybDBhQ0FuYjJZbkFHVjRjR1ZqZEdsdVp5QW5KV01uQUhWdWNHRnlaVzUwYUdWemFYcGxaQ0IxYm1GeWVTQmxlSEJ5WlhOemFXOXVJR05oYmlkMElHRndjR1ZoY2lCdmJpQjBhR1VnYkdWbWRDMW9ZVzVrSUhOcFpHVWdiMllnSnlvcUp3QnBiblpoYkdsa0lIVnpaU0J2WmlBbmFXMXdiM0owS0NrbkFHVjRjR1ZqZEdsdVp5QWxKUUE3THo4NlFDWTlLeVFzSXdBOUlnQnpaWFFnQUdkbGRDQUFXMjlpYW1WamRDQUFZWE41Ym1NZ1puVnVZM1JwYjI0Z0FHSnZkVzVrSUFBbExqTnpMQ0FsTURKa0lDVXVNM01nSlRBcVpDQUFZWE41Ym1NZ0FEb2dBQ0FnSUNBZ0lDQWdJQ0FBQ2lrZ2V3b0FDa3BUVDJKcVpXTjBJR05zWVhOelpYTUtBQ1V0TWpCeklDVTRjeUFsT0hNS0FDQWdKVFZrSUNBbE1pNHdaQ0FsY3dvQUlDQWxNM1VnS3lBbExUSjFJQ0FsY3dvQUlDQnRZV3hzYjJOZmRYTmhZbXhsWDNOcGVtVWdkVzVoZG1GcGJHRmliR1VLQUNVdE1qQnpJQ1U0Ykd4a0NnQWxMVEl3Y3lBbE9HeHNaQ0FsT0d4c1pBb0FYMTlLVTE5R2NtVmxWbUZzZFdVNklIVnVhMjV2ZDI0Z2RHRm5QU1ZrQ2dBbExUSXdjeUFsT0d4c1pDQWxPR3hzWkNBZ0tDVXdMakZtSUhCbGNpQm1ZWE4wSUdGeWNtRjVLUW9BSlMweU1ITWdKVGhzYkdRZ0pUaHNiR1FnSUNnbE1DNHhaaUJ3WlhJZ2IySnFaV04wS1FvQUpTMHlNSE1nSlRoc2JHUWdKVGhzYkdRZ0lDZ2xNQzR4WmlCd1pYSWdablZ1WTNScGIyNHBDZ0FsTFRJd2N5QWxPR3hzWkNBbE9HeHNaQ0FnS0NVd0xqRm1JSEJsY2lCaGRHOXRLUW9BSlMweU1ITWdKVGhzYkdRZ0pUaHNiR1FnSUNnbE1DNHhaaUJ3WlhJZ1lteHZZMnNwQ2dBbExUSXdjeUFsT0d4c1pDQWxPR3hzWkNBZ0tDVmtJRzkyWlhKb1pXRmtMQ0FsTUM0eFppQmhkbVZ5WVdkbElITnNZV05yS1FvQUpTMHlNSE1nSlRoc2JHUWdKVGhzYkdRZ0lDZ2xNQzR4WmlCd1pYSWdjM1J5YVc1bktRb0FKUzB5TUhNZ0pUaHNiR1FnSlRoc2JHUWdJQ2dsTUM0eFppQndaWElnYzJoaGNHVXBDZ0JSZFdsamEwcFRJRzFsYlc5eWVTQjFjMkZuWlNBdExTQkNhV2RPZFcwZ01qQXlNUzB3TXkweU55QjJaWEp6YVc5dUxDQWxaQzFpYVhRc0lHMWhiR3h2WXlCc2FXMXBkRG9nSld4c1pBb0tBQUFBQUh3cEFBRExMUUFBNmlnQUFPb29BQURxS0FBQTZpZ0FBT29vQUFEcUtBQUE2aWdBQU9vb0FBREZHQUFBckR3QUFLdzhBRUdRbndFTEFaSUFRWnlmQVFzTmt3QUFBR1VBQUFCbUFBQUFsQUJCdEo4QkN6MlZBQUFBWndBQUFHZ0FBQUNXQUFBQVp3QUFBR2dBQUFDWEFBQUFad0FBQUdnQUFBQ1lBQUFBWndBQUFHZ0FBQUNaQUFBQVpRQUFBR1lBQUFDWkFFSDhud0VMRFp3QUFBQm5BQUFBYUFBQUFKSUFRWlNnQVF1dEE1MEFBQUJwQUFBQWFnQUFBSjBBQUFCckFBQUFiQUFBQUowQUFBQnRBQUFBYmdBQUFKMEFBQUJ2QUFBQWNBQUFBSjRBQUFCckFBQUFiQUFBQUo4QUFBQnhBQUFBY2dBQUFLQUFBQUJ6QUFBQUFBQUFBS0VBQUFCMEFBQUFBQUFBQUtJQUFBQjBBQUFBQUFBQUFLTUFBQUIxQUFBQWRnQUFBS1FBQUFCMUFBQUFkZ0FBQUtVQUFBQjFBQUFBZGdBQUFLWUFBQUIxQUFBQWRnQUFBS2NBQUFCMUFBQUFkZ0FBQUtnQUFBQjFBQUFBZGdBQUFLa0FBQUIxQUFBQWRnQUFBS29BQUFCMUFBQUFkZ0FBQUtzQUFBQjFBQUFBZGdBQUFLd0FBQUIxQUFBQWRnQUFBSzBBQUFCMUFBQUFkZ0FBQUs0QUFBQjFBQUFBZGdBQUFLOEFBQUJuQUFBQWFBQUFBTEFBQUFCbkFBQUFhQUFBQUxFQUFBQjNBQUFBQUFBQUFMSUFBQUJuQUFBQWFBQUFBTE1BQUFCNEFBQUFlUUFBQUxVQUFBQjZBQUFBZXdBQUFMWUFBQUI2QUFBQWV3QUFBTGNBQUFCNkFBQUFld0FBQUxnQUFBQjZBQUFBZXdBQUFMa0FBQUI4QUFBQWZRQUFBTG9BQUFCOEFBQUFmUUFBQUxzQUFBQitBQUFBZndBQUFMd0FBQUIrQUFBQWZ3QUFBTDBBQUFDQUFBQUFnUUFBQUw0QUFBQ0NBQUFBZ3dCQjBLTUJDd0dFQUVIZ293RUxEWVVBQUFBQUFBQUFoZ0FBQUljQVFZeWtBUXNCaUFCQm1LUUJDd21KQUFBQWlnQUFBSXNBUWJDa0FRdlZBck15QUFCd0FRQUF2QklBQUFnQkFBRE1HQUFBTUFBQUFEWXVBQUFRQUFBQXV6WUFBRmdBQUFDU0FBQUFqQUFBQUkwQUFBQ09BQUFBandBQUFKQUFBQUNSQUFBQWtnQUFBSk1BQUFDVUFBQUFNR0lBQVBCaUFBQ2dZd0FBOEdNQUFEQmtBQUJRWkFBQURBc0ZCQUlDQUFEQUFBQUFsUUFBQUpZQUFBREJBQUFBbHdBQUFKZ0FBQURDQUFBQWx3QUFBSmdBQUFEREFBQUFhd0FBQUd3QUFBREVBQUFBbVFBQUFKb0FBQURGQUFBQW1RQUFBSm9BQUFBdkFBQUFtd0FBQUp3QUFBREdBQUFBYXdBQUFHd0FBQURIQUFBQW5RQUFBSjRBQUFBQUFBQUE3aDhBQUI4Z0FBQXFJQUFBNGg4QUFCVWdBQUE1SUFBQStCOEFBQVlnQUFCamIzQjVWMmwwYUdsdUFHVnVkSEpwWlhNQVptbHNiQUJtYVc1a0FHWnBibVJKYm1SbGVBQm1iR0YwQUdac1lYUk5ZWEFBYVc1amJIVmtaWE1BYTJWNWN3QjJZV3gxWlhNQUFBQUFBQUVCQWdJREF3SURBRUdRcHdFTDN4QnVkV3hzQUdaaGJITmxBSFJ5ZFdVQWFXWUFaV3h6WlFCeVpYUjFjbTRBZG1GeUFIUm9hWE1BWkdWc1pYUmxBSFp2YVdRQWRIbHdaVzltQUc1bGR3QnBiZ0JwYm5OMFlXNWpaVzltQUdSdkFIZG9hV3hsQUdadmNnQmljbVZoYXdCamIyNTBhVzUxWlFCemQybDBZMmdBWTJGelpRQmtaV1poZFd4MEFIUm9jbTkzQUhSeWVRQmpZWFJqYUFCbWFXNWhiR3g1QUdaMWJtTjBhVzl1QUdSbFluVm5aMlZ5QUhkcGRHZ0FZMnhoYzNNQVkyOXVjM1FBWlc1MWJRQmxlSEJ2Y25RQVpYaDBaVzVrY3dCcGJYQnZjblFBYzNWd1pYSUFhVzF3YkdWdFpXNTBjd0JwYm5SbGNtWmhZMlVBYkdWMEFIQmhZMnRoWjJVQWNISnBkbUYwWlFCd2NtOTBaV04wWldRQWNIVmliR2xqQUhOMFlYUnBZd0I1YVdWc1pBQmhkMkZwZEFBQWJHVnVaM1JvQUdacGJHVk9ZVzFsQUd4cGJtVk9kVzFpWlhJQWJXVnpjMkZuWlFCbGNuSnZjbk1BYzNSaFkyc0FibUZ0WlFCMGIxTjBjbWx1WndCMGIweHZZMkZzWlZOMGNtbHVad0IyWVd4MVpVOW1BR1YyWVd3QWNISnZkRzkwZVhCbEFHTnZibk4wY25WamRHOXlBR052Ym1acFozVnlZV0pzWlFCM2NtbDBZV0pzWlFCbGJuVnRaWEpoWW14bEFIWmhiSFZsQUdkbGRBQnpaWFFBYjJZQVgxOXdjbTkwYjE5ZkFIVnVaR1ZtYVc1bFpBQnVkVzFpWlhJQVltOXZiR1ZoYmdCemRISnBibWNBYjJKcVpXTjBBSE41YldKdmJBQnBiblJsWjJWeUFIVnVhMjV2ZDI0QVlYSm5kVzFsYm5SekFHTmhiR3hsWlFCallXeHNaWElBUEdWMllXdytBRHh5WlhRK0FEeDJZWEkrQUR4aGNtZGZkbUZ5UGdBOGQybDBhRDRBYkdGemRFbHVaR1Y0QUhSaGNtZGxkQUJwYm1SbGVBQnBibkIxZEFCa1pXWnBibVZRY205d1pYSjBhV1Z6QUdGd2NHeDVBR3B2YVc0QVkyOXVZMkYwQUhOd2JHbDBBR052Ym5OMGNuVmpkQUJuWlhSUWNtOTBiM1I1Y0dWUFpnQnpaWFJRY205MGIzUjVjR1ZQWmdCcGMwVjRkR1Z1YzJsaWJHVUFjSEpsZG1WdWRFVjRkR1Z1YzJsdmJuTUFhR0Z6QUdSbGJHVjBaVkJ5YjNCbGNuUjVBR1JsWm1sdVpWQnliM0JsY25SNUFHZGxkRTkzYmxCeWIzQmxjblI1UkdWelkzSnBjSFJ2Y2dCdmQyNUxaWGx6QUdGa1pBQmtiMjVsQUc1bGVIUUFkbUZzZFdWekFITnZkWEpqWlFCbWJHRm5jd0JuYkc5aVlXd0FkVzVwWTI5a1pRQnlZWGNBYm1WM0xuUmhjbWRsZEFCMGFHbHpMbUZqZEdsMlpWOW1kVzVqQUR4b2IyMWxYMjlpYW1WamRENEFQR052YlhCMWRHVmtYMlpwWld4a1BnQThjM1JoZEdsalgyTnZiWEIxZEdWa1gyWnBaV3hrUGdBOFkyeGhjM05mWm1sbGJHUnpYMmx1YVhRK0FEeGljbUZ1WkQ0QUkyTnZibk4wY25WamRHOXlBR0Z6QUdaeWIyMEFiV1YwWVFBcVpHVm1ZWFZzZENvQUtnQk5iMlIxYkdVQWRHaGxiZ0J5WlhOdmJIWmxBSEpsYW1WamRBQndjbTl0YVhObEFIQnliM2g1QUhKbGRtOXJaUUJoYzNsdVl3QmxlR1ZqQUdkeWIzVndjd0J6ZEdGMGRYTUFjbVZoYzI5dUFHZHNiMkpoYkZSb2FYTUFZbWxuYVc1MEFHSnBaMlpzYjJGMEFHSnBaMlJsWTJsdFlXd0FjbTkxYm1ScGJtZE5iMlJsQUcxaGVHbHRkVzFUYVdkdWFXWnBZMkZ1ZEVScFoybDBjd0J0WVhocGJYVnRSbkpoWTNScGIyNUVhV2RwZEhNQWRHOUtVMDlPQUU5aWFtVmpkQUJCY25KaGVRQkZjbkp2Y2dCT2RXMWlaWElBVTNSeWFXNW5BRUp2YjJ4bFlXNEFVM2x0WW05c0FFRnlaM1Z0Wlc1MGN3Qk5ZWFJvQUVwVFQwNEFSR0YwWlFCR2RXNWpkR2x2YmdCSFpXNWxjbUYwYjNKR2RXNWpkR2x2YmdCR2IzSkpia2wwWlhKaGRHOXlBRkpsWjBWNGNBQkJjbkpoZVVKMVptWmxjZ0JUYUdGeVpXUkJjbkpoZVVKMVptWmxjZ0JWYVc1ME9FTnNZVzF3WldSQmNuSmhlUUJKYm5RNFFYSnlZWGtBVldsdWREaEJjbkpoZVFCSmJuUXhOa0Z5Y21GNUFGVnBiblF4TmtGeWNtRjVBRWx1ZERNeVFYSnlZWGtBVldsdWRETXlRWEp5WVhrQVFtbG5TVzUwTmpSQmNuSmhlUUJDYVdkVmFXNTBOalJCY25KaGVRQkdiRzloZERNeVFYSnlZWGtBUm14dllYUTJORUZ5Y21GNUFFUmhkR0ZXYVdWM0FFSnBaMGx1ZEFCQ2FXZEdiRzloZEFCQ2FXZEdiRzloZEVWdWRnQkNhV2RFWldOcGJXRnNBRTl3WlhKaGRHOXlVMlYwQUU5d1pYSmhkRzl5Y3dCTllYQUFVMlYwQUZkbFlXdE5ZWEFBVjJWaGExTmxkQUJOWVhBZ1NYUmxjbUYwYjNJQVUyVjBJRWwwWlhKaGRHOXlBRUZ5Y21GNUlFbDBaWEpoZEc5eUFGTjBjbWx1WnlCSmRHVnlZWFJ2Y2dCU1pXZEZlSEFnVTNSeWFXNW5JRWwwWlhKaGRHOXlBRWRsYm1WeVlYUnZjZ0JRY205NGVRQlFjbTl0YVhObEFGQnliMjFwYzJWU1pYTnZiSFpsUm5WdVkzUnBiMjRBVUhKdmJXbHpaVkpsYW1WamRFWjFibU4wYVc5dUFFRnplVzVqUm5WdVkzUnBiMjRBUVhONWJtTkdkVzVqZEdsdmJsSmxjMjlzZG1VQVFYTjVibU5HZFc1amRHbHZibEpsYW1WamRBQkJjM2x1WTBkbGJtVnlZWFJ2Y2taMWJtTjBhVzl1QUVGemVXNWpSMlZ1WlhKaGRHOXlBRVYyWVd4RmNuSnZjZ0JTWVc1blpVVnljbTl5QUZKbFptVnlaVzVqWlVWeWNtOXlBRk41Ym5SaGVFVnljbTl5QUZSNWNHVkZjbkp2Y2dCVlVrbEZjbkp2Y2dCSmJuUmxjbTVoYkVWeWNtOXlBRHhpY21GdVpENEFVM2x0WW05c0xuUnZVSEpwYldsMGFYWmxBRk41YldKdmJDNXBkR1Z5WVhSdmNnQlRlVzFpYjJ3dWJXRjBZMmdBVTNsdFltOXNMbTFoZEdOb1FXeHNBRk41YldKdmJDNXlaWEJzWVdObEFGTjViV0p2YkM1elpXRnlZMmdBVTNsdFltOXNMbk53YkdsMEFGTjViV0p2YkM1MGIxTjBjbWx1WjFSaFp3QlRlVzFpYjJ3dWFYTkRiMjVqWVhSVGNISmxZV1JoWW14bEFGTjViV0p2YkM1b1lYTkpibk4wWVc1alpRQlRlVzFpYjJ3dWMzQmxZMmxsY3dCVGVXMWliMnd1ZFc1elkyOXdZV0pzWlhNQVUzbHRZbTlzTG1GemVXNWpTWFJsY21GMGIzSUFVM2x0WW05c0xtOXdaWEpoZEc5eVUyVjBBRUdBdUFFTHRRZ0JBQUFBQlFBQkZBVUFBUlVGQUFFVkJRQUJGd1VBQVJjQkFBRUFBUUFCQUFFQUFRQUJBQUVBQVFBQkFBRUFBUUFDQUFFRkF3QUJDZ0VCQUFBQkFnRUFBUU1DQUFFQkFnQUJBZ01BQVFJRUFBRURCZ0FCQWdNQUFRTUVBQUVFQlFBQkF3TUFBUVFFQUFFRkJRQUJBZ0lBQVFRRUFBRURBd0FCQXdNQUFRUUVBQUVGQlFBREFnRU5Bd0VCRFFNQkFBMERBZ0VOQXdJQURRTUFBUTBEQXdFS0FRRUFBQUVBQUFBQkFRSUFBUUFBQUFFQ0FnQUJBZ0FBQVFFQUFBRUJBQUFHQUFBWUJRRUJEd01DQVFvQkFnRUFBUUVCQUFFQkFRQUZBQUVYQlFBQkZ3VUFBUmNGQVFBWEJRRUFGd1VDQUJjQkFnTUFBUU1BQUFZQUFCZ0dBQUFZQmdFQUdBVUJBUmNGQVFJWEJRSUFGd0VDQVFBQkF3QUFBUU1CQUFFQ0FRQUJBZ0lBQVFNQUFBRURBUUFCQkFBQUJRSUJGd1VCQVJjQkFnSUFBUUlCQUFFQ0FnQUJBd0lBQVFNQ0FBSURBd1VHQWdFWUFnTUJCUVlDQWhnR0F3TVlBd0FCRUFNQkFCQURBUUVRQXdBQkVRTUJBQkVEQVFFUkF3QUJFZ01CQUJJREFRRVNBd0FBRUFNQUFSQURBUUFRQXdFQUVBTUFBUklEQVFBU0F3RUFFZ01BQUJBRkFRQVdCUUVBRmdVQUFCWUZBQUVXQlFBQUZnRUJBQUFCQVFFQUFRRUJBQUVDQWdBS0FRQWFDZ0lCR2dvQkFCb0tBUUFhQ2dFQUdnb0JBQm9IQUFJWkJ3QUNHUWNBQWhrRkFBSVhBUUVCQUFFQkF3QUJBUU1BQVFFREFBSURCUVVCQVFFQUFRRUNBQUVEQUFBQkJBUUFBUVFFQUFJRUJRVUJBQUFBQVFFQ0FBRUJBZ0FCQVFJQUFRRUJBQUVCQVFBQkFRRUFBUUVCQUFFQkFRQUJBUUlBQVFFQ0FBSUFBQWNDQUFBSEFnRUFCd0VCQVFBQkFRRUFBUUVCQUFFQ0FRQUZBQUVYQVFJQkFBRUNBUUFCQWdFQUFRSUJBQUVDQVFBQkFnRUFBUUlCQUFFQ0FRQUJBZ0VBQVFJQkFBRUNBUUFCQWdFQUFRSUJBQUVDQVFBQkFnRUFBUUlCQUFFQ0FRQUJBZ0VBQVFJQkFBRUNBUUFCQWdFQUFRSUJBQUVCQVFBQkFnRUFBUUlCQUFFQUFBQURBQUFLQXdBQUNnVUFBQllIQUFFWkJ3QUJHUWNCQUJrSEFBRVpDd0FDR3djQUFoa0hBQUlaQndFQkdRY0JBaGtIQVFFWkJRRUJFd1VBQUJNQkFBRUJBUUFCQVFFQUFRRUJBQUVCQVFBQkFRRUFBUUVCQUFFQkFRQUJBUUVBQVFFQ0FBRUdBd0FCQ3dJQUFRZ0NBQUVJQVFBQkFBSUFBUWNDQVFBSEFnRUJCd0VBQVFJQkFBRUNBUUFCQWdFQUFRSUJBUUFDQVFFQUFnRUJBQUlCQVFBQ0FRRUJBZ0VCQVFJQkFRRUNBUUVCQWdFQUFRTUJBQUVEQVFBQkF3RUFBUU1CQVFBREFRRUFBd0VCQUFNQkFRQURBUUVCQXdFQkFRTUJBUUVEQVFFQkF3RUFBUVFCQUFFRUFRQUJCQUVBQVFRQkFRQUVBUUVBQkFFQkFBUUJBUUFFQVFFQkJBRUJBUVFCQVFFRUFRRUJCQUVCQVFBQ0FRQUpBZ0VBQ1FJQUFBa0RBQUFNQVFFQkRnRUJBUTRCQVFFT0FRRUJEZ0VCQVFBQkFRRUFBUUVCQUFFQkFRQ2ZBQUFBb0FBQUFLRUFBQUJ1QUdZQWFRQnVBR2tBZEFCNUFBMEFFQUEwQURnQVFjREFBUXVWRVNzQUFBQXRBQUFBS2dBQUFDOEFBQUFsQUFBQUtpb0FBSHdBQUFBbUFBQUFYZ0FBQUR3OEFBQStQZ0FBUGo0K0FEMDlBQUE4QUFBQWNHOXpBRzVsWndBckt3QUFMUzBBQUg0QUFBQUFBQUFBZlRBQUFBTUFBQUFBQUFBQW9nQUFBR3NjQUFBQkFRQUFvd0FBQUFBQUFBRGROd0FBQVFFQUFLUUFBQUFBQUFBQXJpc0FBQUVDQVFDbEFBQUFBQUFBQU9zeEFBQUJBZ0lBcFFBQUFBQUFBQUNMTWdBQUFRSUVBS1VBQUFBQUFBQUFkQ29BQUFFQ0NBQ2xBQUFBQUFBQUFLZzJBQUFCQWhBQXBRQUFBQUFBQUFEN0RnQUFBUUlnQUtVQUFBQUFBQUFBRVQ0QUFBTUFBQUFCQUFBQVZRQUFBRzgwQUFBREFBQUFBZ0FBQUtZQUFBQmpFd0FBQXdBQUFBRUFBQUNuQUFBQTBpMEFBQU1BQUFBQUFBQUFxQUFBQUExQUFBQURBQUFBQWdBQUFLa0FBQUNJUHdBQUF3QUFBQUVBQUFDcUFBQUFkajhBQUFNQUFBQUJBQUFBcXdBQUFKYy9BQUFEQUFBQUFRQUFBS3dBQUFBdFB3QUFBd0FBQUFJQUFBQ3RBQUFBUEQ4QUFBRUJBQUN1QUFBQUFBQUFBUFVTQUFBREFBQUFBQXdBQUs4QUFBQ25Qd0FBQVFNQUFGMGZBQUFBQUFBQWgwRUFBQU1JQUFEd1lRQUFBd0FBQUhJeEFBQURBQUFBQWdBQUFMQUFBQUFmRHdBQUF3QUFBQU1BQUFDeEFBQUFwejhBQUFFREFBQ0hRUUFBQUFBQUFJUTFBQUFEQUFBQUFnQUFBTElBQUFCZkZ3QUFBd0FBQUFJQkFBQ3pBQUFBdGhjQUFBTUFBQUFCQVFBQXRBQUFBRGNlQUFBREFBQUFBUUVBQUxVQUFBQXBNUUFBQXdBQUFBRUJBQUMyQUFBQUpTUUFBQU1BQUFBQUFRQUF0d0FBQUhnd0FBQUJBZ0FBdUFBQUFBQUFBQUFpTFFBQUF3QUFBQUVCQUFDNUFBQUFjUndBQUFNQUJBQUFBUUFBdWdBQUFDVVpBQUFEQUFBQUFBRUFBTG9BQUFCeUhRQUFBd0FJQUFBQkFBQzZBQUFBVFQ4QUFBTUpBQUJ5SFFBQS8vLy8vNmMvQUFBQkF3QUFJeVVBQUFBQUFBQ2VQUUFBQXdBQkFBRUJBQUN6QUFBQU54NEFBQU1BQVFBQkFRQUF0UUFBQUNreEFBQURBQUVBQVFFQUFMWUFBQUFsSkFBQUF3QUJBQUFCQUFDM0FBQUFlREFBQUFFQ0FRQzRBQUFBQUFBQUFDSXRBQUFEQUFFQUFRRUFBTGtBQUFCeEhBQUFBd0FCQUFBQkFBQzZBQUFBSlJrQUFBTUpBQUJ4SEFBQS8vLy8vMDAvQUFBRENRQUFjUndBQVAvLy8vOXlIUUFBQXdBSkFBQUJBQUM2QUFBQXB6OEFBQUVEQUFDK0Z3QUFBQUFBQUY4WEFBQURBQUlBQWdFQUFMTUFBQUMyRndBQUF3QUNBQUVCQUFDMEFBQUFOeDRBQUFNQUFnQUJBUUFBdFFBQUFDa3hBQUFEQUFJQUFRRUFBTFlBQUFDblB3QUFBUU1BQUI4bEFBQUFBQUFBbmowQUFBTUFBd0FCQVFBQXN3QUFBRGNlQUFBREFBTUFBUUVBQUxVQUFBQXBNUUFBQXdBREFBRUJBQUMyQUFBQXB6OEFBQUVEQUFDNkZ3QUFBQUFBQVBVU0FBQURBQUFBQUF3QUFMc0FBQUNuUHdBQUFRTUFBRkFmQUFBQUFBQUE5UklBQUFNQUFRQUFEQUFBdXdBQUFLYy9BQUFCQXdBQVF4OEFBQUFBQUFBOFB3QUFBUUVBQUs0QUFBQUFBQUFBb2lnQUFBTUFBQUFDQUFBQXZBQUFBQlV0QUFBREFBQUFBUUFBQUwwQUFBRHpEZ0FBQXdBQUFBRUFBQUMrQUFBQXB6OEFBQUVEQUFDbk1RQUFBQUFBQUk0d0FBQURBQUFBQVFFQUFMOEFBQUR4RndBQUF3QUJBQUVCQUFDL0FBQUFjQ29BQUFNQUFBQUJBUUFBd0FBQUFETTlBQUFEQUFFQUFRRUFBTUFBQUFERURnQUFBd0FDQUFFQkFBREFBQUFBYXpnQUFBTUFBQUFCQUFBQXdRQUFBRHcvQUFBQkFRQUFyZ0FBQUFBQUFBQ25Qd0FBQVFNQUFGb21BQUFBQUFBQVh6OEFBQU1BQUFBQUFBQUF3Z0FBQVBVU0FBQURBQUFBQVFFQUFNTUFBQUJzSlFBQUF3QUJBQUVCQUFEREFBQUE2eEFBQUFNQUFnQUJBUUFBd3dBQUFQVVNBQUFEQUFBQUFRRUFBTVFBQUFCc0pRQUFBd0FCQUFFQkFBREVBQUFBNnhBQUFBTUFBZ0FCQVFBQXhBQUFBS2MvQUFBQkF3QUF4aDhBQUFBQUFBQ25Qd0FBQVFNQUFFTW1BQUFBQUFBQVlTOEFBQU1BQUFBQUFBQUF4UUFBQU5JdEFBQURBQk1BQUFFQUFNWUFBQUM4UHdBQUF3QUFBQUVBQUFESEFBQUFTeTRBQUFNQUF3QUFBUUFBeGdBQUFDb3VBQUFEQ1FBQVN5NEFBUC8vLy84L0xnQUFBd0FqQUFBQkFBREdBQUFBMnkwQUFBTUFFUUFBQVFBQXhnQUFBUHN0QUFBREFCSUFBQUVBQU1ZQUFBQWJMZ0FBQXdBekFBQUJBQURHQUFBQTZDMEFBQU1BTVFBQUFRQUF4Z0FBQUFndUFBQURBRElBQUFFQUFNWUFBQUFhRndBQUF3QUFBQUFBQUFESUFBQUF4VElBQUFNQUFBQUFBQUFBeFFBQUFETWtBQUFEQUFFQkFBRUFBTWtBQUFCSEpBQUFBd0FCQUFBQkFBREpBQUFBWWlRQUFBTUFBQUFBQVFBQXlRQUFBUDhyQUFBREFCRUFBQUVBQU1rQUFBQVVMQUFBQXdBUUFBQUJBQURKQUFBQVB6RUFBQU1BSVFBQUFRQUF5UUFBQUZJeEFBQURBQ0FBQUFFQUFNa0FBQUNvR2dBQUF3QXhBQUFCQUFESkFBQUF2Um9BQUFNQU1BQUFBUUFBeVFBQUFJTWNBQUFEQUVFQUFBRUFBTWtBQUFDY0hBQUFBd0JBQUFBQkFBREpBQUFBOEIwQUFBTUFVUUFBQVFBQXlRQUFBQWtlQUFBREFGQUFBQUVBQU1rQUFBQ3ZIUUFBQXdCaEFBQUJBQURKQUFBQTBoMEFBQU1BWUFBQUFRQUF5UUFBQU4wUEFBQURBSEVBQUFFQUFNa0FBQURrRHdBQUF3QndBQUFCQUFESkFBQUF2VElBQUFNQUFBQUJBQUFBeWdBQUFKOGRBQUFEQUhFR0FRRUFBTXNBQUFDL0hRQUFBd0J3QmdFQkFBRExBQUFBNVIwQUFBTUFjUVVDQVFBQXl3QUFBUHNkQUFBREFIQUZBZ0VBQU1zQUFBQjRIQUFBQXdCeEJBTUJBQURMQUFBQWpod0FBQU1BY0FRREFRQUF5d0FBQUo4YUFBQURBSEVEQkFFQUFNc0FBQUN4R2dBQUF3QndBd1FCQUFETEFBQUFOekVBQUFNQU1RSUJBUUFBeXdBQUFFY3hBQUFEQURBQ0FRRUFBTXNBQUFEMkt3QUFBd0F4QVFJQkFBRExBQUFBQ0N3QUFBTUFNQUVDQVFBQXl3QUFBQ3NrQUFBREFBQUFBUUFBQU13QUFBQTdKQUFBQXdBeEFBTUJBQURMQUFBQVV5UUFBQU1BTUFBREFRQUF5d0FBQUlWQkFBQURBQUFBQVFBQUFNMEFBQUJUZFc1TmIyNVVkV1ZYWldSVWFIVkdjbWxUWVhRQVFlRFJBUXNrU21GdVJtVmlUV0Z5UVhCeVRXRjVTblZ1U25Wc1FYVm5VMlZ3VDJOMFRtOTJSR1ZqQUVHUTBnRUw1ZzRmQUFBQUhBQUFBQjhBQUFBZUFBQUFId0FBQUI0QUFBQWZBQUFBSHdBQUFCNEFBQUFmQUFBQUhnQUFBQjhBQUFENEVBQUFBd0FBQUFBQUFBRE9BQUFBY2pFQUFBTUFBQUFCQUFBQXp3QUFBRTVFQUFBREFBQUFCd0FBQU5BQUFBQ2FtNXlkbnFDaG9xMnVyNStmQUFBQTBpMEFBQU1BQUFBQUFBQUEwUUFBQUdFdkFBQURBQUFBQUFBQUFOSUFBQUNuUHdBQUFRTUFBSWdXQUFBQUFBQUFYa0VBQUFNQUFBQUNBUUFBMHdBQUFHWkJBQUFEQUFFQUFnRUFBTk1BQUFCSUVRQUFBd0FCQUFJQkFBRFVBQUFBVFJFQUFBTUFBZ0FDQVFBQTFBQUFBRmNSQUFBREFBTUFBZ0VBQU5RQUFBQlNFUUFBQXdBR0FBSUJBQURVQUFBQVB5a0FBQU1BRVFBQ0FRQUExQUFBQUVjcEFBQURBQklBQWdFQUFOUUFBQUJYS1FBQUF3QVRBQUlCQUFEVUFBQUFUeWtBQUFNQUZnQUNBUUFBMUFBQUFKRVRBQUFEQUFBQUFRRUFBTlVBQUFCcEtRQUFBd0FCQUFFQkFBRFZBQUFBaFVVQUFBTUFBQUFCQVFBQTFnQUFBUE1NQUFBREFBRUFBUUVBQU5ZQUFBRFNMUUFBQXdBQUFBQUFBQURYQUFBQVlUUUFBQU1EQUFBOElBQUFBQUFBQUxvMUFBQURBd0FBVEU4QUFBQUFBQUF3TVFBQUF3QUFBQUlBQUFEWUFBQUFlQzhBQUFNQUFBQUJBUUFBMlFBQUFHa3ZBQUFEQUFBQUFnQUFBTm9BQUFCQURnQUFBd0FBQUFNQkFBRGJBQUFBWVIwQUFBTUFBQUFDQUFBQTNBQUFBTVVjQUFBREFBQUFBUUFBQU4wQUFBRCtHd0FBQXdBQUFBRUFBQURlQUFBQUpSa0FBQU1BQUFBQkFRQUEzd0FBQUhFY0FBQURBQUVBQVFFQUFOOEFBQUJ5SFFBQUF3QUNBQUVCQUFEZkFBQUFwRFFBQUFNQUFBQUJBUUFBNEFBQUFLY2JBQUFEQUFBQUFRRUFBT0VBQUFDekhnQUFBd0FBQUFJQkFBRGlBQUFBeVJvQUFBTUFBQUFCQUFBQTR3QUFBQ3djQUFBREFBQUFBZ0FBQU9RQUFBQkhLQUFBQXdBQUFBSUFBQURsQUFBQXFTc0FBQU1BQUFBQkFRQUE1Z0FBQUljd0FBQURBQUVBQVFFQUFPWUFBQUJaUFFBQUF3QUFBQUVCQUFEbkFBQUFWeWdBQUFNQUFRQUJBUUFBNXdBQUFKUWFBQUFEQUFBQUFRQUFBT2dBQUFCNkhRQUFBd0FBQUFFQUFBRHBBQUFBMGkwQUFBTUFBQUFBQUFBQTZnQUFBQnN1QUFBREFBQUFBQUFBQU9zQUFBQmhMd0FBQXdBQUFBQUFBQURzQUFBQStnMEFBQU1BQUFBQkFBQUE3UUFBQUljdkFBQURBQUFBQVFBQUFPNEFBQUFVTlFBQUF3QUFBQUVBQUFEdkFBQUFJejhBQUFFQkFBRHdBQUFBOFFBQUFCSS9BQUFEQUFBQUFnRUFBUElBQUFEd1BnQUFBd0FCQUFJQkFBRHlBQUFBQVQ4QUFBTUFBQUFCQVFBQTh3QUFBTjgrQUFBREFBRUFBUUVBQVBNQUFBQnZLZ0FBQXdBQUFBRUFBQUQwQUFBQXlBNEFBQU1BQUFBQ0FRQUE5UUFBQUhFNUFBQURBQUFBQVFBQUFQWUFBQURTTFFBQUF3QUFBQUFBQUFEM0FBQUErRDhBQUFNQUFBQUJBQUFBK0FBQUFHWTBBQUFCQVFBQStRQUFBQUFBQUFBREpBQUFBUUVBQVBvQUFBQUFBQUFBVFQ4QUFBTUFBQUFBQUFBQXdnQUFBQUFaQUFBREFBQUFBUUFBQVBzQUFBQytEZ0FBQXdBQUFBRUJBQUQ4QUFBQW56SUFBQU1BQVFBQkFRQUEvQUFBQUNJdEFBQURBQUlBQVFFQUFQd0FBQUFUSlFBQUF3QURBQUVCQUFEOEFBQUFVaUVBQUFNQUJBQUJBUUFBL0FBQUFOWTNBQUFEQUFBQUFRRUFBUDBBQUFEYkZnQUFBd0FCQUFFQkFBRDlBQUFBTGlvQUFBTUFBQUFCQUFBQS9nQUFBR3c1QUFBREFBQUFBUUVBQVA4QUFBQkRFQUFBQXdBQkFBRUJBQUQvQUFBQVRTOEFBQU1BQUFBQkFBQUFBQUVBQUZVdkFBQURBQUFBQVFBQUFBRUJBQUNXSFFBQUF3QUFBQUVBQUFBQ0FRQUE1aWNBQUFNQUFBQUJBUUFBQXdFQUFOSXRBQUFEQUFBQUFBQUFBQVFCQUFBYkxnQUFBd0FCQUFBQkFBQURBUUFBenlRQUFBTUFBQUFBQVFBQUJRRUFBTUlzQUFBREFBQUFBUUVBQUFZQkFBRHBGZ0FBQXdBQkFBQUJBQUFGQVFBQTV4WUFBQU1BQVFBQkFRQUFCZ0VBQUdveEFBQURBQUFBQUFBQUFBY0JBQUNXRXdBQUF3QUFBQUVBQUFBSUFRQUFYamdBQUFNQUFBQUNBUUFBQ1FFQUFHUTRBQUFEQUFFQUFnRUFBQWtCQUFEdkp3QUFBd0FBQUFJQUFBQUtBUUFBRnlVQUFBTUFBUUFCQVFBQUN3RUFBT2tZQUFBREFBQUFBQUVBQUFzQkFBQnhIQUFBQXdBQkFBQUJBQUE5QUFBQVRUOEFBQU1KQUFCeEhBQUEvLy8vL3lVWkFBQURBQUFBQUFFQUFEMEFBQUJ5SFFBQUF3QUNBQUFCQUFBOUFBQUF5ZzhBQUFNQUFBQUJBQUFBREFFQUFDNHBBQUFEQUFBQUFRQUFBQTBCQUFDcExnQUFBd0FBQUFBQUFBQU9BUUFBUEQ4QUFBRUJBQUN1QUFBQUFBQUFBUFVTQUFBREFBQUFBQXdBQUQ0QUFBQ25Qd0FBQVFNQUFEUWZBQUFBQUFBQWp4WUFBQU1BQUFBQ0FBQUFEd0VBQU40WUFBQURBQUFBQVFBQUFCQUJBQUJ0UVFBQUF3QUFBQUVBQUFBUkFRQUFJREVBQUFNQUFBQUJBQUFBRWdFQUFIRkNBQUFEQUFBQUFRRUFBQk1CQUFCQ0ZnQUFBd0FCQUFFQkFBQVRBUUFBWjBJQUFBTUFBQUFCQVFBQUZBRUFBQzhXQUFBREFBRUFBUUVBQUJRQkFBQmRNZ0FBQXdBQUFBRUFBQUFWQVFBQVd6SUFBQU1BQUFBQkFBQUFGZ0VBQUhVT0FBQUFCZ0FBQUFBQUFBQUE4SCtCUVFBQUFBWUFBQUFBQUFBQUFQaC9yRHdBQUFBSEFFR0E0UUVMVmJzckFBQURBQUFBQUFBQUFCY0JBQUJCUWtORVJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXbUZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZNREV5TXpRMU5qYzRPVUFxWHlzdExpOEFRZURoQVF1V0E1c3JBQUFEQUFBQUFRQUFBQmdCQUFEYk9nQUFBd0FBQUFFQUFBQVpBUUFBMVNjQUFBTUFBQUFCQUFBQUdnRUFBTkl0QUFBREFBQUFBUUVBQUJzQkFBQWJMZ0FBQXdBQkFBQUJBQUFiQVFBQVlTOEFBQU1BQUFBQUFBQUFIQUVBQUk4V0FBQURDUUFBanhZQUFBQUFBQURlR0FBQUF3a0FBTjRZQUFBQUFBQUFiVUVBQUFNQUFBQUJBQUFBSFFFQUFDQXhBQUFEQUFBQUFRQUFBQjRCQUFBZUl3QUFBd0FBQUFFQUFBQWZBUUFBS0NNQUFBTUFBQUFCQUFBQUlBRUFBQnREQUFBQUJnQUEvLy8vLy8vLzczOGxRd0FBQUFZQUFBRUFBQUFBQUFBQWdVRUFBQUFHQUFBQUFBQUFBQUQ0ZjBkQUFBQUFCZ0FBQUFBQUFBQUE4UDgxUUFBQUFBWUFBQUFBQUFBQUFQQi9qRUVBQUFBR0FBQUFBQUFBQUFDd1BEeEJBQUFBQmdBQS8vLy8vLy8vUDBOTlFRQUFBQVlBQVAvLy8vLy8vei9EMGkwQUFBTUFBQUFBQUFBQUlRRUFBR0V2QUFBREFBQUFBQUFBQUNJQkFBQ0dOd0FBQXdBQUFBRUFBQUFqQVFBQXFCVUFBQU1BQUFBQkFBQUFKQUVBQUVRUkFBQURBQUFBQVFBQUFDVUJBQUNhTEFBQUFRUUFRWURsQVF2aUJob1pBQUFEQUFBQUFRQUFBQ1lCQUFBVEdRQUFBd0FBQUFFQUFBQW5BUUFBQUJrQUFBTUFBQUFCQUFBQUtBRUFBQWNaQUFBREFBQUFBUUFBQUNrQkFBQk5Md0FBQXdBQUFBRUJBQUFxQVFBQVZTOEFBQU1BQVFBQkFRQUFLZ0VBQUpZZEFBQURBQUFBQVFFQUFDc0JBQUJCTEFBQUF3QUNBQUVCQUFBckFRQUFOaXdBQUFNQUFRQUJBUUFBS3dFQUFBOHRBQUFEQU5JQUFRRUFBQ3dCQUFCN0tnQUFBd0RUQUFFQkFBQXNBUUFBR3kwQUFBTUExUUFCQVFBQUxBRUFBTGNXQUFBREFBQUFBZ0FBQUMwQkFBQmZMUUFBQXdBQUFBSUFBQUF1QVFBQW1CNEFBQU1BQUFBQ0FBQUFMd0VBQUY0NEFBQURBQUFBQWdBQUFEQUJBQUQ1R0FBQUF3QUFBQUVBQUFBeEFRQUFjRGdBQUFNQUFBQUNBUUFBTWdFQUFJUXFBQUFEQUFFQUFnRUFBRElCQUFBK09nQUFBd0FCQUFFQkFBQXpBUUFBcWhNQUFBTUFBQUFCQVFBQU13RUFBRG9wQUFBREFBTUFBQUVBQURRQkFBQTJPZ0FBQXdBQ0FBQUJBQUEwQVFBQTBSWUFBQU1KQUFBMk9nQUEvLy8vLzZBVEFBQURBQUVBQUFFQUFEUUJBQUR2RmdBQUF3a0FBS0FUQUFELy8vLy8waTBBQUFNQUFBQUFBQUFBTlFFQUFHRXZBQUFEQUFBQUFBQUFBRFVCQUFBWU1RQUFBd0FBQUFFQUFBQTJBUUFBOWpFQUFBTUFBQUFCQUFBQU53RUFBSzh4QUFBREFBRUFBQUVBQURnQkFBRE5NUUFBQXdBQUFBQUJBQUE0QVFBQXV6RUFBQU1BQVFBQUFRQUFPQUVBQU5reEFBQURBQUFBQUFFQUFEZ0JBQUJOUHdBQUF3QUZBQUFCQUFBOUFBQUFVaUFBQUFNQUFBQUJBUUFBT1FFQUFJY3VBQUFEQUFFQUFBRUFBRGtCQUFDMUt3QUFBd0FDQUFBQkFBQTVBUUFBUlRvQUFBTUFBd0FBQVFBQU9RRUFBTlU2QUFBREFBUUFBQUVBQURrQkFBQklJQUFBQXdBRkFBRUJBQUE1QVFBQW1pOEFBQU1BQmdBQkFRQUFPUUVBQUJjZUFBQURBQWNBQUFFQUFEa0JBQUMyS3dBQUF3QUlBQUVCQUFBNUFRQUFhU29BQUFNQUNRQUFBUUFBT1FFQUFJNDFBQUFEQUFvQUFBRUFBRGtCQUFCNVBnQUFBd0FMQUFBQkFBQTVBUUFBdlNRQUFBTUFEQUFBQVFBQU9RRUFBTjArQUFCaE5BQUFoeTRBQUFBQUFBQzFLd0FBQUFBQUFOSStBQUFBQUFBQUVoTUFBQUFBQUFDUUZRQUFUQ0FBQUpBVkFBQjRNQUFBOUNzQUFBQUFBQURkUGdBQTJ5NEFBR2txQUFBQUFBQUFqalVBQUFBQUFBQjVQZ0FBQUFBQUFMMGtBRUh3NndFTHNSTDFFZ0FBQXdBQUFBQU1BQUE2QVFBQXB6OEFBQUVEQUFCa0h3QUFBQUFBQUwwc0FBQURDQUFBSUhZQUFDd0FBQURySndBQUF3QUFBQUlCQUFBN0FRQUFmUkFBQUFNQUFRQUNBUUFBT3dFQUFCOGVBQUFEQUFBQUFRWUFBRHdCQUFCQ0lBQUFBd0FBQUFFR0FBQTlBUUFBanlvQUFBTUFBQUFCQmdBQVBnRUFBRG81QUFBREFBQUFBUVlBQUQ4QkFBQ1JFd0FBQXdBQUFBRUdBQUJBQVFBQUZCc0FBQU1BQUFBQkJnQUFRUUVBQU9FbkFBQURBQUFBQVFZQUFFSUJBQURiS0FBQUF3QUFBQUVHQUFCREFRQUFla1VBQUFNQUFBQUNCd0FBUkFFQUFCVWJBQUFEQUFBQUFRWUFBRVVCQUFDeUpBQUFBd0FBQUFFR0FBQkdBUUFBTFMwQUFBTUFBQUFCQmdBQVJ3RUFBUFFRQUFBREFBQUFBZ2NBQUVnQkFBRGlKd0FBQXdBQUFBRUdBQUJKQVFBQTNDZ0FBQU1BQUFBQkJnQUFTZ0VBQUFnK0FBQURBQUFBQVFZQUFFc0JBQUJTS0FBQUF3QUFBQUVHQUFCTUFRQUF5Q3dBQUFNQUFBQUJCZ0FBVFFFQUFPQXNBQUFEQUFBQUFRWUFBRTRCQUFEbUxBQUFBd0FBQUFFR0FBQlBBUUFBeHl3QUFBTUFBQUFCQmdBQVVBRUFBTjhzQUFBREFBQUFBUVlBQUZFQkFBRGxMQUFBQXdBQUFBRUdBQUJTQVFBQUpFWUFBQU1BQUFBQkJnQUFVd0VBQUQ0bEFBQURBQUFBQVFZQUFGUUJBQUNBUlFBQUF3QUFBQUVHQUFCVkFRQUF1a1lBQUFNQUFBQUJCZ0FBVmdFQUFKc1RBQUFEQUFBQUFRWUFBRmNCQUFEUkV3QUFBd0FBQUFJQUFBQllBUUFBTXlrQUFBTUFBQUFBQUFBQVdRRUFBQzQ1QUFBREFBQUFBUVlBQUZvQkFBQnhLUUFBQXdBQUFBSUFBQUJiQVFBQW9VVUFBQU1BQUFBQkFBQUFYQUVBQUtjL0FBQUJBd0FBdlN3QUFBQUFBQURsUXdBQUFBWUFBR2xYRklzS3Z3VkF3RVlBQUFBR0FBQVdWYlc3c1dzQ1FKMUZBQUFBQmdBQTd6bjYva0l1NWovYVF3QUFBQVlBQVA2Q0syVkhGZmMvNEVNQUFBQUdBQUFPNVNZVmU4dmJQM3RDQUFBQUJnQUFHQzFFVlBzaENVQ1BSUUFBQUFZQUFNMDdmMmFlb09ZL2wwVUFBQUFHQUFETk8zOW1ucUQyUCtrWEFBQURDQUFBOEhnQUFBNEFBQURJRGdBQUF3QUFBQU1BQUFCZEFRQUF3aGNBQUFNQUFBQUNBQUFBWGdFQUFFQU9BQUFEQUFFQUF3RUFBTnNBQUFBZERnQUFBd0FBQUFJQUFBQmZBUUFBdGhjQUFBTUFBQUFDQUFBQVlBRUFBTE1lQUFBREFBRUFBZ0VBQU9JQUFBQjRMd0FBQXdBQkFBRUJBQURaQUFBQU54NEFBQU1BQUFBQ0FBQUFZUUVBQUtRMEFBQURBQUVBQVFFQUFPQUFBQUJhR1FBQUF3QUFBQUVBQUFCaUFRQUFweHNBQUFNQUFRQUJBUUFBNFFBQUFGOFhBQUFEQUFBQUF3QUFBR01CQUFCcEx3QUFBd0FBQUFJQUFBQmtBUUFBcHo4QUFBRURBQURwRndBQUFBQUFBTkl0QUFBREFBQUFBQUFBQUdVQkFBQmhMd0FBQXdBQUFBQUFBQUJtQVFBQXZEOEFBQU1BQUFBQkFBQUFaZ0VBQUtjL0FBQUJBd0FBZ3lrQUFBQUFBQUN0SlFBQUFRRUFBR2NCQUFBQUFBQUFXU0FBQUFNQUFBQUJBQUFBYUFFQUFGMGdBQUFEQUFBQUFRQUFBR2tCQUFEMUVnQUFBd0FBQUFFTUFBQnFBUUFBYkNVQUFBTUFBUUFCREFBQWFnRUFBT3NRQUFBREFBSUFBUXdBQUdvQkFBQ25Qd0FBQVFNQUFNc2ZBQUFBQUFBQXB6OEFBQUVEQUFCSUpnQUFBQUFBQUtrc0FBQUJBaE1BYXdFQUFBQUFBQUJlT0FBQUF3QVRBQUlCQUFCc0FRQUFwejhBQUFFREFBQmtJd0FBQUFBQUFEUVJBQUFEQUFBQUFRQUFBRzBCQUFBOFB3QUFBUUVBQUs0QUFBQUFBQUFBcVN3QUFBRUNGQUJyQVFBQUFBQUFBRjQ0QUFBREFCUUFBZ0VBQUd3QkFBQ25Qd0FBQVFNQUFEMGpBQUFBQUFBQVBEOEFBQUVCQUFDdUFBQUFBQUFBQUpvc0FBQUJBUUFBYmdFQUFBQUFBQUEySXdBQUFRSUFBRzhCQUFBQUFBQUFxU3dBQUFFQ0FBQndBUUFBQUFBQUFBOFhBQUFCQWdBQWNRRUFBQUFBQUFCZkZ3QUFBd0FBQUFFQUFBQnlBUUFBY1J3QUFBTUFBUUFBQVFBQWN3RUFBRTAvQUFBRENRQUFjUndBQVAvLy8vOGxHUUFBQXdBQUFBQUJBQUJ6QVFBQWNoMEFBQU1BQWdBQUFRQUFjd0VBQUtjL0FBQUJBUUFBZEFFQUFBQUFBQUR2SndBQUF3QUFBQUlBQUFCMUFRQUF2ZzRBQUFNQUNBQUJBUUFBL0FBQUFKOHlBQUFEQUFrQUFRRUFBUHdBQUFBaUxRQUFBd0FLQUFFQkFBRDhBQUFBRXlVQUFBTUFDd0FCQVFBQS9BQUFBRkloQUFBREFBd0FBUUVBQVB3QUFBRFdOd0FBQXdBSUFBRUJBQUQ5QUFBQTJ4WUFBQU1BQ1FBQkFRQUEvUUFBQUM0cUFBQURBQUFBQVFBQUFIWUJBQUJzT1FBQUF3QUFBQUVCQUFCM0FRQUFReEFBQUFNQUFRQUJBUUFBZHdFQUFHb3hBQUFEQUFBQUFBQUFBSGdCQUFCZU9BQUFBd0FBQUFJQUFBQjVBUUFBS1E4QUFBTUFBQUFDQUFBQWVnRUFBSllUQUFBREFBQUFBUUFBQUhzQkFBRG1Kd0FBQXdBQUFBRUJBQUI4QVFBQUd5NEFBQU1BQVFBQUFRQUFmQUVBQUUwdkFBQURBQUFBQVFFQUFIMEJBQUJWTHdBQUF3QUJBQUVCQUFCOUFRQUFsaDBBQUFNQS8vOEJBUUFBZlFFQUFDNHBBQUFEQUFBQUFRQUFBSDRCQUFDcExnQUFBd0FBQUFBQUFBQi9BUUFBUEQ4QUFBRUJBQUN1QUFBQUFBQUFBRFlqQUFBQkFnRUFid0VBQUFBQUFBQ3BMQUFBQVFJQkFIQUJBQUFBQUFBQUR4Y0FBQUVDQVFCeEFRQUFBQUFBQU1GRUFBQURBQllBQVFFQUFJQUJBQUN3UkFBQUF3QVhBQUVCQUFDQUFRQUFGVVVBQUFNQUdBQUJBUUFBZ0FFQUFBSkZBQUFEQUJrQUFRRUFBSUFCQUFERVJRQUFBd0FhQUFFQkFBQ0FBUUFBc1VVQUFBTUFHd0FCQVFBQWdBRUFBRTVGQUFBREFCd0FBUUVBQUlBQkFBQTFSUUFBQXdBZEFBRUJBQUNBQVFBQTJFVUFBQU1BSGdBQkFRQUFnQUVBQUdWRkFBQURBQjhBQVFFQUFJQUJBQUM1UkFBQUF3QVdBQUlCQUFDQkFRQUFwMFFBQUFNQUZ3QUNBUUFBZ1FFQUFBeEZBQUFEQUJnQUFnRUFBSUVCQUFENFJBQUFBd0FaQUFJQkFBQ0JBUUFBdTBVQUFBTUFHZ0FDQVFBQWdRRUFBS2RGQUFBREFCc0FBZ0VBQUlFQkFBQkNSUUFBQXdBY0FBSUJBQUNCQVFBQUtFVUFBQU1BSFFBQ0FRQUFnUUVBQU0xRkFBQURBQjRBQWdFQUFJRUJBQUJhUlFBQUF3QWZBQUlCQUFDQkFRQUFwejhBQUFFREFBQTdFUUFBQUFBQUFDUUFBQUFoQUFBQUlnQUFBQWNBQUFBRkFBQUFJUUFBQUNFQUFBQWhBQUFBSVFBQUFDRUFBQUFoQUFBQUJBQUFBQVlBQUFBaEFBQUFJUUFBQUNFQUFBQWhBQUFBSVFBQUFBUUFBQUFCQUFBQUFnQUFBQUVBQUFBRUFBQUFBUUFBQUFFQUFBQUlBQUFBRUFBQUFBRUFBQUFnQUVHcy9nRUxJUUlBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBRHdBQUFBNEFBQUFSQUFBQUVBQkIrUDRCQ3pFQ0FBQUFBd0FBQUFRQUFBQUFBQUFBQVFBQUFBVUFBQUFKQUFBQUNnQUFBQXNBQUFBTkFBQUFEUUFBQUEwQUFBQU5BRUcwL3dFTEJRd0FBQUFNQUVIRS93RUxDUWNBQUFBSUFBQUFCZ0JCMlA4QkMzNEVBQUFBTFFBQUFDMEFBQUJVQUFBQU9nQUFBRG9BQUFBdUFBQUFma2dBQU1STUFBQjRTQUFBZ2dFQUFJTUJBQUNDQVFBQWhBRUFBSVVCQUFDR0FRQUFod0VBQUlnQkFBQ0pBUUFBaWdFQUFJc0JBQUNNQVFBQWpRRUFBSXdCQUFDT0FRQUFqd0VBQUpBQkFBQ1JBUUFBa2dFQUFKTUJBQUNVQVFBQWxRRUFRZUNBQWdzcUNnQUpBQTRBSUFBaEFLQUFvUUNBRm9FV0FDQUxJQ2dnS2lBdklEQWdYeUJnSUFBd0FURC8vZ0QvQUVHVWdRSUxMUkFBQUFEKy8vK0gvdi8vQndBQUFBQVFBUDhEL3YvL2gvNy8vd2U4Z0FBQVlJQUFBTkNBQUFBQkFEQUFPZ0JCMElFQ0N4RUVBREFBT2dCQkFGc0FYd0JnQUdFQWV3QkI4SUVDQzhRTEFRTUZBUUVCQVFVRkJRRUNBZ01GQlFFQkFRSUNBd01GQlFFRkFSRUFBQUF3bWlBQUFKb3dBSE9CV2dBd0YyQUFNQWRzQUxPQmJ3QUFGM0FBQUFkOEFBQ0Jmd0JBTUlBQXd3R1lBSkNCbUFCQUJwa0FRSkNjQUxTQnBBQkFMcVVBTUFHOEFFQ0d2QUJ3Z2I4QUFBSEFBRENCd0FCQUJNRUFNQUhEQUVDQ3d3QXdnc1FBUUlMRkFEQUJ4d0F3Z2NjQU1BSElBRUNDeUFBd2dja0FNQUhLQUFDQnlnQXdBY3NBTUlITEFFQUN6QUFBQWMwQU1BSE9BRENCemdBQUFjOEFNSUhQQUVBRzBBQXdBZE1BUUlMVEFEQ0IxQUJBQXRZQU1BSFhBRUNDMXdBd2d0Z0FRSVRaQURDQjJ3QkFBdHdBUUFMZUFBQ0Izd0JRQStJQVVJUGpBRkFENVFCQWtPWUFBSUh1QUVBUzd3QzBBZmdBVUlQNEFFQUMrZ0F3QWZzQU1JSDdBRUFvL0FBd0FSQUJRQklSQVRFQkhRRkFnaDBCTUlFZUFURUJId0VCZ2g4QlFJSWdBVENCSVFFd0FTSUJNSUVpQVVBS0l3RUJBU2dCQVlFb0FRRUJLUUVBZ1NrQkFBRXFBUUFDS3dFQWdTd0JBSUV0QVFFQkxnRUFBVEFCQVlFd0FRQ0JNUUVCZ1RJQkFRRXpBUUFCTkFFQWdUUUJBUUUxQVFHQk5RRUJBVFlCQUlFM0FRR0JPQUVBQVRrQkFJRTZBUUdCUGdFQUFVQUJBUUZCQVFDQlFRRUJnVU1CQUFGRUFRQ0JSQUVBQWtVQkFBRkdBUUFCU1FFQmdVNEJBUUZQQVhPQm9nRkFCTGdCUUFLN0FRQ0R2UUV3Z2I4Qk1BSERBVEFEeEFFd0FjWUJNQUxIQWRBQnlBRXdrY2dCTUluUkFRQUIxZ0VBZzlZQjB3SFlBUUNSMkFGekFlRUJBSW5oQVFBQjVnRUFndVlCTUlIbkFYTUI2QUZ6Z2VnQmM0SHFBWE1CNndFQWdlc0JRQmpzQVhNQitBRnpnZmdCQUFINUFRQ0IrUUdnQWZvQmM0SDZBVUNDK3dFd2dmd0JRQUw5QVRDRC9nRXdFQUFDTUNBSUFnQWdHQUlBRUNnQ1FDSXdBa0EyUlFJd0FXQUNRSTVnQWdDQlp3SkFZR2dDTUthWUFnQ21zQUsxZ2NNQ01TWlFDREdCWXdneGdXWUlBQ3RvQ0FDRGZnZ1JVTkFKRUFiNENTQUcvQWwwQVVBT2RJRkFEblFCUVE1MGdVRU9kQUZDRG5TQlFnNTBBVU1PZ0lGRERvQUJSQTR3SzBnT01JTmVEZ0dCdkE0QmdiNE9BUUhIRGtCK0FBOUFHRDhQdFFGTEQ3YUJTdysyQVV3UHRvRk1EN2NCVFErQWdVMFBNQUZQRDBCZ1VBOEFDSUFQTUFpRUR3QUdpQTh3Qm93UEFBaVFEekFJbEE4QUNKZ1BNQWljRHdBR29BOHdCcVFQc0FHb0R3Q0JxQS9UQWFrUEFJR3BEOU1CcWc4QWdhb1Awd0dyRHdDQnF3OHdnYXdQTUlHdER6Q0JyZzh3Z2E4UEFBaXdEekFJdEE4QUFyZ1BBQVM1RHdBQ3V3OEJBcndQQVFLOUR3RUN2ZyszQ01BUFp3akVEN2dJeUE5b0NNd1B1QWpRRDJnSTFBOEFBdGdQdVFIWkQ3R0IyUSs1QWRvUHNRSGJEOWVCMnc4d0F0d1BNQUxkRDJFQjNnOXpBZDhQdVFIaEQ3S0I0USs2QWVJUHNnSGpEOWlCNHc4d0JPUVBZZ0htRHdBQzZBL1FBZWtQMElIcEQ3QUI2dy9RZ2VzUE1BTHNEekFDN1E4QkF2QVAwd0h4RDlPQjhRKzZBZklQQVlIeUQ3QUI4dy9UZ2ZNUE1BTDBEekFDOVE4eEFmWVB1Z0g1RDdLQitRKzdBZm9Qc2dIN0Q5bUIrdzh3QXZ3UE1BTDlEMklCL2crZ0FaTVFvQUdWRUtDQmxSQXhBWmtRQVFHbkVERVFzQkFCRUxnUVFJTEJFREVhV3hJQkdtZ1NNUzhBRmdFdkdCWkFBakFXTUFFeEZqQ0JNUll3QVRJV0FJRXlGZ0FCTXhaQWhqTVdNSUUyRmpBQk54WXdnVGNXTUFFNEZrQUNPUlpBZ2pvV01BSS9Ga0JrUUJaQWhIVVdRQUo1RmdBbWdCWUFnWk1XQUlHV0ZrQXVJRk5BSEVCVFFBNlJVMEErbVZOQWhMeFRNSUcrVTBBS3YxTkFnc1ZUTUlIR1UwQUV5Rk1CQWNwVFFCVExVekFCMVZNd2dkVlRNQUhXVXpDQjFsTXdBZGRUTUFIWVV6Q0IyRk13QWRsVE1ZSFpVMEFNMmxOQUF1RlRNUUhpVXpDQjRsTXdBZU5UUUlUalUwQ0MrbE1CZ2FsVklGQzRWYklCZ0gyeWdZQjlzZ0dCZmRxQmdYM2FBWUo5czRHQ2ZiTUJnMzI3Z1lsOXV3R0tmYnVCaW4yOEFZdDl1NEdMZlRHYWtIOEJtcUIvTVNnQWdnRW9GSUl4SkZpQ0FTUnNnakV6UUlZQk0yQ0dNU0JRakFFZ1lJd3hJQ0MzQVNBd3R6RWlnUFFCSXBIMEFFSEFqUUlMNHdNQkFKd0dCMDBEQkJBQWp3c0FBQkVBQ0FCVFNsRUFVZ0JUQURwVVZRQlhXVDlkWEFCR1lXTkNaQUJtQUdnQWFnQnNBRzRBQUVBQUFBQUFHZ0NUQUFBZ05RQW5BQ0VBSkNJcUFCTnJiUUFtSkNjVUZoZ2JIRDRlUHg4NVBTSWhRUjVBSlNVbUtDQXFTU3hETGtzd1RESkVRcGtBQUpXUGZYNkRoQktBZ25aM0VudWpmSGg1aXBLWXBxQ0ZBSnFoazNVemxRQ09BSFNabUplV0FBQ2VBSndBb2FBVkxpOHd0TFZPcXFrU0ZCNGhJaUlxTkRXbXB6WWZTZ0FBbHdGYTJoMDJCUURFdzhiRnlNZkt5Y3pMeE5WRjFrTFhSdGpPME5MVTJ0bnU5djRPQncrQW53QWhnS1B0QU1CQXhtRG4yK2Fad0FBQUJtRGNLZjBWRWdZVytOMEdGUktFQ01ZVy85OER3RUFBUm1EZTRHMDNPRGtWRkJjV0FCb1pIQnNBWDdkbFJFY0FUMkpPVUFBQVNBQUFBS09rcFFBQUFBQUF0Z0FBV2dCSUFGdFdXR0JlY0dsdlRRQUFPMmU0QUFCRnFJcUxqS3VzV0ZpdmxMQnZzbHhiWGwxZ1gySmhaR05tWldobkFBQUFBQUFBQUprRENBTUJBNlVERXdNQUEwSURrUU9YQTZrRFJnQkpBRXdBVXdCcEFBY0R2QUpPQUVvQURBTTFCVklGU0FBeEExUUFWd0FLQTFrQVFRQytBZ2dmZ0I4b0g1QWZhQitnSDdvZmhnT3pIOG9maVFQREg2RUQraCtQQS9NZlJBVkdCVHNGVGdVOUJiZ0RZZ1JLcG1BZXlRTnJBT1VBUWJDUkFndkNBVUNwZ0k2QS9JRFRnSXlBallHTkFvRGhnSkdGbWdFQUFSRUFBUVFJQVFnd0NBRVZJQUE1bVRHZGhFQ1VnTmFDcG9CQllvQ21nRmQyK0FLQWo0Q3dRTnNJZ0VIUWdJeUFqNHprQXdHSkFCUW9FQkVDQVJnTEpFc21BUUdHNVlCZ2ViYUJRSkdCdllpVUJZQ1lnTWVDUXpTaUJvQ01ZU2lXMUlER0FRZ0pDNENMQUFhQXdBTVBCb0NiQXdRQUZvQkJVNEdZZ0ppQW5vQ1lnSjZBbUlDZWdKaUFub0NZQjFsam1ZV1poWmtBQUFBQXVRTGdvQjVBbnFaQXV0UUJpZGNCaXZFQkFFR0Frd0lMdEFXbUJZQ0tnS0lBZ01ZREFBTUJnVUgyUUw4WkdJZ0lnRUQ2aGtET0JJQ3dyQUFCQVFDcmdJcUZpWW9Bb29DSmxJK0E1RGlKQTZBQWdKMmEyb3E1aWhnSWw1ZXFndmF2dGdBRE93S0dpWUdNZ0k2QXVRTWZnSk9CbVFHQnVBTUxDUktBblFxQWlvRzRBeUFMZ0pPQmxTaUF1UUVBSHdhQmlvR2RnTHlBaTRDeEFvQzRGQkFlZ1lxQm5JQzVBUVVFZ1pPQm00RzRDeCtBazRHY2dNY0dFSURaQVlhS2lPRUJpSWdBaGNtQm1nQUFnTGFOQkFHRWlvQ2ppSURsR0NnSmdaZ0xnbytEakFFTmdJNkEzWUJDWDRKRHNZS2NncHlCbllHL0NEY0JpaEFncklPemdNQ0JvWUQxRTRHSUJZSkEyZ21BdVFBd0FBRTlpUWltQjVDK2c2OEFJQVNBcDRpTGdaOFpDSUszQUFvQWdyazVnYitGMFJDTUJoZ29FYkcraklDaDNnUkJ2QUNDaW9LTWdveUNqSUdMSjRHSkFRR0VzQ0NKQUl5QWo0eXlvRXVLZ2ZDQy9JQ09nTitmcm9CQjFJQ2pHaVNBM0lYY2dtQnZGWUJFNFlWQkRZRGhHSWtBbTRQUGdZMmh6WUNXZ3V3UEFnT0FtQXlBUUphQm1aR01nS1dIbUlxdGdxOEJHWUdRZ0pTQndTa0pnWXNIZ0tLQWlvQ3lBQkVNQ0lDYWdJME1DSURqaElpQytBRURnR0JQTDRCQWtvOUNQWThRaTQraEFZQkFxQVlGZ0lxQW9nQ0Fyb0NzZ2NLQWxJSkNBSUJBNFlCQWxJUkdoUkFNZzZjVGdFQ2tnVUk4ZzBHQ2dVQ1lpa0N2Z0xXT3Q0S3dHUW1Bam9DeGdxTWdoNzJBaTRHemlJa1pnTjRSQUEyQVFKOENoNVNCdUFxQXBES0VRTUk1RUlDV2dOTW9Bd2lCUU8wZENJR2FnZFE1QUlIcEFBRW9nT1FSR0lSQkFvZ0JRUDhJQTRCQWp4a0xnSitKcHlrZmdJZ3BncTJNQVVHVk1DaUEwWlVPQVFINUtnQUlNSURIQ2dDQVFWcUJWVHFJWURhMmhMcUdpSU5FQ29DK2tMOElnV0JNdHdpRFZNS0NpSThPbllOQWs0Skh1cmFEc1RpTmdKVWdqa1ZQTUpBT0FRUkJCSTFCcllORjM0YnNoMHF1aEd3TUFJQ2QzLzlBN3dCQndKZ0NDMEsrQlFEK0J3QlNDaUFGRENBN0RrQmhFRUFQR0NCREcyQjVIUUR4SUFBTnBrQXVxU0RlcWdBUC95RG5Da0dDRVNIRUZHRkVHUUZJSFNHa3ZBRSs0UUh3QVE0QVFaQ1pBZ3VWQ01DWmhabXVnSWtEQkphQW5vQkJ5WU9MalNZQWdFQ0FJQWtZQlFBUUFKT0Ewb0JBaW9kQXBZQ2xDSVdveHBvYnJLcWlDT0lBamc2QmlSR0Fqd0Nkbk5pS2dKZWdpQXNFbFJpSUFvQ1dtSWFLdEpTQWtidTFFSkVHaVk2UEh3bUJsUVlBRXhDUGdJd0lnbzJCaVFjckNaVUdBUUVCbmhpQWtvS1BpQUtBbFFZQkJCQ1JnSTZCbG9DS09RbVZCZ0VFRUowSWdvNkFrQUFxRUJvSUFBb0tFb3VWZ0xNNEVKYUFqeENaRklHZEF6Z1Fsb0NKQkJDZkFJR09nWkNJQW9Db0NJOEVGNEtYTEpHQ2w0Q0lBQTY1cndHTGhya0lBQ0NYQUlDSkFZZ0JJSUNVZzUrQXZqaWptb1R5cXBPQWp5c2FBZzRUakl1QWtLVUFJSUdxZ0VGTUF3NEFBNEdvQTRHZ0F3NEFBNEdPZ0xnRGdjS2tqNC9WRFlKQ2E0R1FnSm1FeW9LS2hvd0RqWkdOa1kyTUFvNnpvZ09Bd3RpR3FBQ0V4WW1lc0owTWlxdURtYldXaUxUUmdOeXVrSWEybll5QmlhdVpvNmlDaWFPQmlJYXFDcWdZS0FvRVFMKy9RUlVOZ2FVTkR3QUFBSUNlZ2JRR0FCSUdFdzJEakNJRzg0Q01nSStNNUFNQmlRQU5LQUFBZ0k4TEpCaVFxRXAycm9DdWdFQ0VLeEdMcFFBZ2diY3dqNWFJTURBd01EQXdNSVpDSllLWWlEUU1nOVVjZ05rRGhLcUEzWkNmcjQ5Qi8xbS92MkJSL0lKRWpNS3RnVUVNZ28rSmdaT3VqNTZCejZhSWdlYUJ0SUdJcVl3Q0E0Q1duTE9Oc2IwcUFJR0ttNG1XbUp5R3JwdUFqeUNKaVNDb2xoQ0hrNVlRZ3JFQUVRd0lBSmNSaWpLTEtTbUZpREF3cW9DTmhmS2NZQ3VqaTVhRHNHQWhBMEZ0Z2VtbGhvc2tBSW1BakFRQUFRR0E2NkJCYXBHL2diV25pL01nUUlham1ZV1ppdGdWRFEwS29vdUFtWUNTQVlDT2dZMmgrc1MwUVFxY2dyQ3VuNHlkaEtXSm5ZR2pId1NwUUoyUm80T2pnNmVIczBDYlFUYUlsWW1IUUpjcEFLc0JFSUdXaVphSW5zQ1NBWW1WaVpuRnR5bS9nSTRZRUp5cG5JS2NvamlibXJXSmxZbVNqSkh0eUxheWpMS01vMEZicVNuTm5Ja0hsZW1VbXBhTHRNcXNuNWlabzV3QkI2SVFpNitOZzVRQWdLS1JnSmpUTUFBWWpvQ0pocTZsT1FtVkJnRUVFSkdBaTRSQW5iU1JnNU9DbmErVENJQkF0NjZvZzZPdms0QzZxb3lBeHBwQTVLdnp2NTQ1QVRnSWw0NEFnTjA1cG84QWdKdUFpYWN3bElDS3JaS0FvYmhCQm9pQXBKQ0FzSjN2TUFpbGxJQ1lLQWlmallCQlJwSkF2SURPUTVubDdwQkF3MHE3UkM1UDBFSkdZQ0c0UWppR252Q2RrYStQZzU2VWhKSkNyNy8veWlEQmpMOElnSnRYOTRkRTFhbUlZQ0wyUVI2d2dwQWZRWXRKQStxRWpJS0lob2xYWmRTQXhnRUlDUXVBaXdBR2dNQUREd2FBbXdNRUFCYUFRVk9CbUlDWWdKNkFtSUNlZ0ppQW5vQ1lnSjZBbUFkSk02eUpobytBUVhDclJSTkF4THJETUVTekdKb0JBQWlBaVFNQUFDZ1lBQUFDQVFBSUFBQUFBQUVBQ3dZREF3Q0FpWUNRSWdTQWtGRkRZS2Jkb1ZBMGlrRGRnVmFCalYwd1RCNUNIVVhoVTBvQVFiQ2hBZ3RqOWdNZ3BnY0FxUWtBdEFvQXVnc0FQZzBBNEE0Z1Z4SUE2eFlBeWhrZ3dCMWdnQ0FBTGkwQXdERWdpYWNnOEtrQTQ2c0FQdjBBK3dBaE53ZGhBUW9CSFE4aExCSUJ5QlFoMFJraFJ4MEJPV29oQ1kwQnZOUUJxZGNoT3U0QjNxWWlTeE1EQUVHZ29nSUw4Z1N2aWFTQTFvQkNSKytXZ0VENmhFRUlyQUFCQVFESGlxK2VLT1F4S1FnWmlaYUFuWnJhaW82Sm9JaUlnSmNZaUFJRXFvTDJqb0NndFJDUkJva0ppWkNDdHdBeENZS0lnSWtKaVkwQmdyY0FJd2tTZ0pPTEVJcUN0d0E0RUlLVENZbUpLSUszQURFSkZvS0pDWW1SZ0xvaUVJT0lnSTJKajRTNE1CQWVnWW9KaVpDQ3R3QXdFQjZCaWdtSmo0TzJDREFRZzRpQWlRbUprSUxGQXlnQVBZa0p2QUdHaXppSjFnR0lpaW1KdlEySmlnQUFBNEd3a3dHRWlvQ2ppSURqazRDSml4c1FFVEtEakl1QWprSytnb2lJUTUrQ25JS2NnWjJCdjUrSUFZbWdFWWxBam9EMWk0T0xpWW4vaXJ1RXVJbUFuSUdLaFltVmpRRytoSzZRaW9tUWlJdUNuWXlCaWF1TnI1T0hpWVdKOVJDVUdDZ0tRTVc1QkVJK2daS0Erb3dZZ290TC9ZSkFqSURmbjBJcGhlaUJZSFdFaWNRRGlaK0J6NEZCRHdJRGdKWWpnTktCc1pHSmlZV1JqSXFiaDVpTXE0T3VqWTZKaW9DSmlhNk5pd2NKaWFDQ3NRQVJEQWlBcUNTQlFPczRDWWxnVHlPQVF1Q1BqNDhSbDRKQXY0bWtnRUs4Z0VEaGdFQ1VoRUVraVVWV0VBeURweE9BUUtTQlFqd2ZpVUZ3Z1VDWWlrQ3VnclNPbm9tT2c2eUt0SWtxbzQyQWlTR3JnSXVDcjQwN2dJdlJpeWhBbjR1RWlTdTJDREVKZ29pQWlRa3loRUMva1lpSkdOQ1RpNGxBMURHSW1vSFJrSTZKMEl5SGlkS09nNGxBOFk1QXBJbkZLQWtZQUlHTGlmWXhNb0NiaWFjd0g0Q0lpcTJQUVpRNGg0K0p0NVdBamZrcUFBZ3dCNG12SUFnbmlVRklnMkJMYUlsQWhZUzZocGlKUS9RQXRqUFFnSXFCWUV5cWdWVEZJaTg1aHAyRFFKT0NSWWl4UWYrMmc3RTRqWUNWSUk1RlR6Q1FEZ0VFUVFTR2lJbEJvWTFGMVlic05JbFNsWWxzQlFWQTd3QkJvS2NDQzZNUytnWUFoQWtBOEFvQWNBd0E5QTBBU2hBZ0doZ2dkQnNnM1NBQURLZ0FXcW9nR3Y4QXJRNEJPQklod1JVaDVSa2hxaDBoak5GQlN1RWg4QUVPQUFBQUFFRmtiR0Z0TEVGa2JHMEFRV2h2YlN4QmFHOXRBRUZ1WVhSdmJHbGhibDlJYVdWeWIyZHNlWEJvY3l4SWJIVjNBRUZ5WVdKcFl5eEJjbUZpQUVGeWJXVnVhV0Z1TEVGeWJXNEFRWFpsYzNSaGJpeEJkbk4wQUVKaGJHbHVaWE5sTEVKaGJHa0FRbUZ0ZFcwc1FtRnRkUUJDWVhOellWOVdZV2dzUW1GemN3QkNZWFJoYXl4Q1lYUnJBRUpsYm1kaGJHa3NRbVZ1WndCQ2FHRnBhM04xYTJrc1FtaHJjd0JDYjNCdmJXOW1ieXhDYjNCdkFFSnlZV2h0YVN4Q2NtRm9BRUp5WVdsc2JHVXNRbkpoYVFCQ2RXZHBibVZ6WlN4Q2RXZHBBRUoxYUdsa0xFSjFhR1FBUTJGdVlXUnBZVzVmUVdKdmNtbG5hVzVoYkN4RFlXNXpBRU5oY21saGJpeERZWEpwQUVOaGRXTmhjMmxoYmw5QmJHSmhibWxoYml4QloyaGlBRU5vWVd0dFlTeERZV3R0QUVOb1lXMHNRMmhoYlFCRGFHVnliMnRsWlN4RGFHVnlBRU5vYjNKaGMyMXBZVzRzUTJoeWN3QkRiMjF0YjI0c1dubDVlUUJEYjNCMGFXTXNRMjl3ZEN4UllXRmpBRU4xYm1WcFptOXliU3hZYzNWNEFFTjVjSEpwYjNRc1EzQnlkQUJEZVhKcGJHeHBZeXhEZVhKc0FFUmxjMlZ5WlhRc1JITnlkQUJFWlhaaGJtRm5ZWEpwTEVSbGRtRUFSR2wyWlhOZlFXdDFjblVzUkdsaGF3QkViMmR5WVN4RWIyZHlBRVIxY0d4dmVXRnVMRVIxY0d3QVJXZDVjSFJwWVc1ZlNHbGxjbTluYkhsd2FITXNSV2Q1Y0FCRmJHSmhjMkZ1TEVWc1ltRUFSV3g1YldGcFl5eEZiSGx0QUVWMGFHbHZjR2xqTEVWMGFHa0FSMlZ2Y21kcFlXNHNSMlZ2Y2dCSGJHRm5iMnhwZEdsakxFZHNZV2NBUjI5MGFHbGpMRWR2ZEdnQVIzSmhiblJvWVN4SGNtRnVBRWR5WldWckxFZHlaV3NBUjNWcVlYSmhkR2tzUjNWcWNnQkhkVzVxWVd4aFgwZHZibVJwTEVkdmJtY0FSM1Z5YlhWcmFHa3NSM1Z5ZFFCSVlXNHNTR0Z1YVFCSVlXNW5kV3dzU0dGdVp3QklZVzVwWm1sZlVtOW9hVzVuZVdFc1VtOW9ad0JJWVc1MWJtOXZMRWhoYm04QVNHRjBjbUZ1TEVoaGRISUFTR1ZpY21WM0xFaGxZbklBU0dseVlXZGhibUVzU0dseVlRQkpiWEJsY21saGJGOUJjbUZ0WVdsakxFRnliV2tBU1c1b1pYSnBkR1ZrTEZwcGJtZ3NVV0ZoYVFCSmJuTmpjbWx3ZEdsdmJtRnNYMUJoYUd4aGRta3NVR2hzYVFCSmJuTmpjbWx3ZEdsdmJtRnNYMUJoY25Sb2FXRnVMRkJ5ZEdrQVNtRjJZVzVsYzJVc1NtRjJZUUJMWVdsMGFHa3NTM1JvYVFCTFlXNXVZV1JoTEV0dVpHRUFTMkYwWVd0aGJtRXNTMkZ1WVFCTFlYbGhhRjlNYVN4TFlXeHBBRXRvWVhKdmMyaDBhR2tzUzJoaGNnQkxhRzFsY2l4TGFHMXlBRXRvYjJwcmFTeExhRzlxQUV0b2FYUmhibDlUYldGc2JGOVRZM0pwY0hRc1MybDBjd0JMYUhWa1lYZGhaR2tzVTJsdVpBQk1ZVzhzVEdGdmJ3Qk1ZWFJwYml4TVlYUnVBRXhsY0dOb1lTeE1aWEJqQUV4cGJXSjFMRXhwYldJQVRHbHVaV0Z5WDBFc1RHbHVZUUJNYVc1bFlYSmZRaXhNYVc1aUFFeHBjM1VzVEdsemRRQk1lV05wWVc0c1RIbGphUUJNZVdScFlXNHNUSGxrYVFCTllXdGhjMkZ5TEUxaGEyRUFUV0ZvWVdwaGJta3NUV0ZvYWdCTllXeGhlV0ZzWVcwc1RXeDViUUJOWVc1a1lXbGpMRTFoYm1RQVRXRnVhV05vWVdWaGJpeE5ZVzVwQUUxaGNtTm9aVzRzVFdGeVl3Qk5ZWE5oY21GdFgwZHZibVJwTEVkdmJtMEFUV1ZrWldaaGFXUnlhVzRzVFdWa1pnQk5aV1YwWldsZlRXRjVaV3NzVFhSbGFRQk5aVzVrWlY5TGFXdGhhM1ZwTEUxbGJtUUFUV1Z5YjJsMGFXTmZRM1Z5YzJsMlpTeE5aWEpqQUUxbGNtOXBkR2xqWDBocFpYSnZaMng1Y0doekxFMWxjbThBVFdsaGJ5eFFiSEprQUUxdlpHa3NUVzlrYVFCTmIyNW5iMnhwWVc0c1RXOXVad0JOY204c1RYSnZid0JOZFd4MFlXNXBMRTExYkhRQVRYbGhibTFoY2l4TmVXMXlBRTVoWW1GMFlXVmhiaXhPWW1GMEFFNWhibVJwYm1GbllYSnBMRTVoYm1RQVRtVjNYMVJoYVY5TWRXVXNWR0ZzZFFCT1pYZGhMRTVsZDJFQVRtdHZMRTVyYjI4QVRuVnphSFVzVG5Ob2RRQk9lV2xoYTJWdVoxOVFkV0ZqYUhWbFgwaHRiMjVuTEVodGJuQUFUMmRvWVcwc1QyZGhiUUJQYkY5RGFHbHJhU3hQYkdOckFFOXNaRjlJZFc1bllYSnBZVzRzU0hWdVp3QlBiR1JmU1hSaGJHbGpMRWwwWVd3QVQyeGtYMDV2Y25Sb1gwRnlZV0pwWVc0c1RtRnlZZ0JQYkdSZlVHVnliV2xqTEZCbGNtMEFUMnhrWDFCbGNuTnBZVzRzV0hCbGJ3QlBiR1JmVTI5blpHbGhiaXhUYjJkdkFFOXNaRjlUYjNWMGFGOUJjbUZpYVdGdUxGTmhjbUlBVDJ4a1gxUjFjbXRwWXl4UGNtdG9BRTl5YVhsaExFOXllV0VBVDNOaFoyVXNUM05uWlFCUGMyMWhibmxoTEU5emJXRUFVR0ZvWVhkb1gwaHRiMjVuTEVodGJtY0FVR0ZzYlhseVpXNWxMRkJoYkcwQVVHRjFYME5wYmw5SVlYVXNVR0YxWXdCUWFHRm5jMTlRWVN4UWFHRm5BRkJvYjJWdWFXTnBZVzRzVUdodWVBQlFjMkZzZEdWeVgxQmhhR3hoZG1rc1VHaHNjQUJTWldwaGJtY3NVbXB1WndCU2RXNXBZeXhTZFc1eUFGTmhiV0Z5YVhSaGJpeFRZVzF5QUZOaGRYSmhjMmgwY21Fc1UyRjFjZ0JUYUdGeVlXUmhMRk5vY21RQVUyaGhkbWxoYml4VGFHRjNBRk5wWkdSb1lXMHNVMmxrWkFCVGFXZHVWM0pwZEdsdVp5eFRaMjUzQUZOcGJtaGhiR0VzVTJsdWFBQlRiMmRrYVdGdUxGTnZaMlFBVTI5eVlWOVRiMjF3Wlc1bkxGTnZjbUVBVTI5NWIyMWlieXhUYjNsdkFGTjFibVJoYm1WelpTeFRkVzVrQUZONWJHOTBhVjlPWVdkeWFTeFRlV3h2QUZONWNtbGhZeXhUZVhKakFGUmhaMkZzYjJjc1ZHZHNad0JVWVdkaVlXNTNZU3hVWVdkaUFGUmhhVjlNWlN4VVlXeGxBRlJoYVY5VWFHRnRMRXhoYm1FQVZHRnBYMVpwWlhRc1ZHRjJkQUJVWVd0eWFTeFVZV3R5QUZSaGJXbHNMRlJoYld3QVZHRnVaM1YwTEZSaGJtY0FWR1ZzZFdkMUxGUmxiSFVBVkdoaFlXNWhMRlJvWVdFQVZHaGhhU3hVYUdGcEFGUnBZbVYwWVc0c1ZHbGlkQUJVYVdacGJtRm5hQ3hVWm01bkFGUnBjbWgxZEdFc1ZHbHlhQUJWWjJGeWFYUnBZeXhWWjJGeUFGWmhhU3hXWVdscEFGZGhibU5vYnl4WFkyaHZBRmRoY21GdVoxOURhWFJwTEZkaGNtRUFXV1Y2YVdScExGbGxlbWtBV1drc1dXbHBhUUJhWVc1aFltRjZZWEpmVTNGMVlYSmxMRnBoYm1JQVFkQzVBZ3V4Rk1BWm1VV0ZHWmxGcmhtQVJZNFpnRVdFR1paRmdCbWVSWUFaNFdCRnBobUVSWVFaZ1EyVEdlQVBONE1yZ0JtQ0t3R0RLNEFaZ0NzRGdDdUFHWUFyZ0JtQ0t3Q0FLd0NUS3dDK0s0MGFqeXZnSkIyQk4rQklIUUNsQlFHeEJRR0NCUUMyTkFlYU5BT0ZOQXFFQklBWmhRU0FHWTBFZ0JtQUJBQ0FCSUFabndTQUdZa0VpamVaQklBMzRBc0VnQm1oQkkySEFMdUhBWUtIcndTeGtRMjZZd0dDWTYxN0FZNTdBSnRRQVlCUUFJcUhOSlFFQUpFRUNvNEVnQm1jQk5BZmd6ZU9INEVabVIrREN3Q0hDd0dCQ3dHVkN3Q0dDd0NBQ3dLREN3R0lDd0dCQ3dHREN3ZUFDd09CQ3dDRUN3R1lDd0dDTGdDRkxnT0JMZ0dWTGdDR0xnQ0JMZ0NCTGdDQkxnR0FMZ0NFTGdPQkxnR0NMZ0tBTGdhRExnQ0FMZ2FRTGdtQ0xBQ0lMQUNDTEFDVkxBQ0dMQUNCTEFDRUxBR0pMQUNDTEFDQ0xBR0FMQTZETEFHTExBYUdMQUNDY0FDSGNBR0JjQUdWY0FDR2NBQ0JjQUNFY0FHSWNBR0JjQUdDY0FhQ2NBT0JjQUNFY0FHUmNBbUJqZ0NGamdLQ2pnQ0RqZ0tCamdDQWpnQ0JqZ0tCamdLQ2pnS0xqZ09FamdLQ2pnQ0RqZ0dBamdXQWpnMlVqZ1NNa0FDQ2tBQ1drQUNQa0FLSGtBQ0NrQUNEa0FhQmtBQ0NrQVNEa0FHSmtBYUlrSXc4QUlJOEFKWThBSWs4QUlROEFZZzhBSUk4QUlNOEJvRThCb0E4QUlNOEFZazhBSUU4REl4UEFJSlBBTEpQQUlKUEFJVlBBNDlQQVpsUEFJS0JBSkdCQXBlQkFJaUJBSUNCQVlhQkFvQ0JBNFdCQUlDQkFJZUJCWW1CQVlLQkM3bVNBNEFabTVJa2dVUUFnRVFBaEVRQWwwUUFnRVFBbGtRQmhFUUFnRVFBaFVRQmlVUUJnMFFmeDVNQW81TURwcE1BbzVNQWpwTUFocE9ER1lHVEpPQS9YcVVuQUlBbkJJQW5BYW9uZ0JtREorQ2ZNTWdtQUlNbUFZWW1BSUFtQUlNbUFhZ21BSU1tQWFBbUFJTW1BWVltQUlBbUFJTW1BWTRtQUxnbUFJTW1BY0ltQVo4bUFwa21CZFVYQVlVWEFlSWZFcHhtQXNwNmdobUtlZ2FNaUFDR2lBcVVNb0VaQ0pNUkM0eUpBSUtKQUlHSkM5MUFBWWxBQllsQUJZRmJnUm1BVzRBWmlGc0FpVnNGMkZzR3Fsc0V4UklKbmtjQWkwY0RpMGNEZ0VjQ2kwZWRpZ0dFaWdxcllRT1pZUVdLWVFLQllaOUFteEFCZ1JDK2l3Q2Npd0dLaXdXSml3V05pd0dRTno3TEJ3T3NCd0svaGJNS0I0TUt0MFlDamtZQ2drYXZaNGdkQnFvbkFZSW5oNFVIZ2plQUdZdzNnQm1HTjRNWmdEZUZHWUEzZ2htQk40QVpCS1ZGaEN1QUhiQkZoQ3VEUllRcmpFV0FIY1ZGZ0N1NU53Q0VOK0NmUlpVckFZVXJBYVVyQVlVckFZY3JBSUFyQUlBckFJQXJBSjRyQWJRckFJNHJBSTByQVlVckFKSXJBWUlyQUlnckFJc1pnVGZXR1FDS0dZQkZBWW9aZ0VXT0dRQ01SUUtmR1ErZ053NmxHWUFyZ2htQlJZVVpnRVdhR1lCRmtCbW9SWUlaQStJMkdSaUtHUlRqUHhuZ253L2lFeGtCbnhrQTRBZ1pyaWdBcmlnQW4wWGdFeG9FaGhxbEp3Q0FKd1NBSndHM2xBYUJsQTJBbEpZbUNJWW1BSVltQUlZbUFJWW1BSVltQUlZbUFJWW1BSVltQUo4ZDBoa3NtUzhBMkM4TDRIVXZHWXNaQTRRWmdDK0FHWUF2bUJtSUw0TTNnVENIR1lNdmd4a0ExVFVCZ1RlQkdZSTFnQm5aUFlFWmdqMEVxZzBBM1RBQWp4bWZEYU1aQzQ4OW5qQUF2eG1lTU5BWnJqMkFHZGM5NEVjWjhBbGZMNzhaOEVHY0x3TGtMSnNDdHBzSXIwcmd5NWNUM3gzWENBZWhHZUFGUllJWnRFVUJpRVVwaWtXc2hnS0pHUVczZGdmRmZBZUxmQVdmSDYwK2dCbUFQcU41Q29CNW5EQUN6VG9BZ0JtSk9nT0JPcDVlQUxZV0NJMFdBWWtXQVlNV24xN0NqQmVFakpaVkNZVW1BWVVtQVlVbUNJWW1BSVltQUtwRmdCbUlSWUFyZzBXQkdRUFBGNjFWQVlsVkJmQWJRekFMbGpBRHNEQndFS1BoRFM4QjRBa3ZKWVpGQzRRRkJKazBBSVEwQUlBMEFJRTBBSUUwQUlrMDRCRUVFT0VLQklFWkQ3OEVBYlVFSjQwRUFZODNpUmtGalRlQkhhSVpBSklaQUlNWkE0UUVBT0FtQkFHQUdRQ2ZHWmxGaFJtWlJZb1ppVDJBR2F3OWdSbWVNQUtGTUFHRk1BR0ZNQUdDTUFLR0dRQ0dHUW1FR1FHTFNRQ1pTUUNTU1FDQlNRQ09TUUdOU1NIZ0dra0VnaGtEckJrQ2lCbk9Ld0NNR1FLQUt5NnNHWUEzWUNHY1N3S3dFdzZBTjVvWkE2TnBDSUpwbWlrRXFtc0VuWllBZ0phamJBT05iQ25QSHE5K25YSUJpWElGbzNFRG8zRURweVFIc3hRS2dCUmdMK0RXU0FpVlNBbUhTR0EzaFJ3QmdCd0FxeHdBZ1J3Q2dCd0JnQnlWTmdDSU5wOTBubDhIaUY4dmtqTUFnVE1FaERPYmR3S0FkNWxNQklCTVA1OVlsMWNEazFjQnJWZURQd0NCUHdTSFB3Q0NQd0NjUHdHQ1B3T0pQd2FJUHdhZmJwOXFINlpSQTR0UkNMVUdBb1lHbFRrQmh6bVNPQVNIT0pGNEJvTjRDNFo0VDhodk5ySm9ETEpvQm9Wb3B6RUhpVEZneFo0RUFLbWFBSUthQVlHYVRhZHRCNm1DVlpzWUU1WWxDTTBPQTUwT0RvQU93VHNLZ0RzQm1JTUdpWU1GdEJVQWtSVUhwazRJMzMwQWs0RUtrVUVBcTBGQWhsMEFnRjBBZzEwQWpsMEFpbDBGdWtNRWlVTUZneW9BaHlvQmdTb0JsU29BaGlvQWdTb0FoQ29BZ0RlSUtnR0JLZ0dDS2dHQUtnV0FLZ1NHS2dHR0tnS0VLbUFxMjJJQWhHSWR4NVVIaVpWZ1JiVi9BYVYvSWNSYUNvbGFCWXhiRXJpTkJvbU5OWm9DQVk0Q0E0OENZRis3SVdBRDBwa0xnSm1HSUFHQUlBR0hJQUNCSUFDZElBQ0JJQUdMSUFpSklFV0hZQUd0WUFHS1lCckhuQWZTaEJ5NGRXQ21pQXdBckF3QWpRd0puQXdDbjFJQmxWSUFqVkpJaGxNQWdWTUFxMU1DZ0ZNQWdWTUFpRk1IaVZNRmhTMEFnUzBBcEMwQWdTMEFoUzBHaVMxZzFaaE5ZRmFBU2c2eGpneUFqdU01RzJBRjRBNGJBSVFiQ3VCakcycGI0ODRqQUlnamIyYmg1Z053RVZqaDJBZ0dubHdBaVZ3RGdWeGZuUWtCaFFrSnhYTUppWE1BaG5NQWxITUVrbk5pVDlwVVlBVEtXUU80V1FhUVdUK0FqNEJrZ1JtQVFncUJMdzN3QjVlUEIrS2ZqK0YxUWltSWozQVNsb0E5NEwwMU1JSTFFSU05QitFclpHaWo0QW9pQkl3aUFvZ2lCb2tpQVlNaWd4bHdBdnZnbFJrSnBoa0J2Um1DTjVBWmh6ZUJHWVkzblJtRE43b1pGc1VyWURtVEdRdldHUWlZR1dBbTFCa0F4aGtBZ1JrQmdCa0JnUmtCZ3hrQWl4a0FnQmtBaGhrQXdCa0FneGtCaHhrQWhoa0FteGtBZ3hrQWhCa0FnQmtDaGhrQTRQTVpBZURER1FHeEdlSXJnQTZFZ0FDT2dHVHZoaWdBa0NnQmhpZ0FnU2dBaENoZ2RLeGxBbzFsQVlsbEE0RmxZUSs1bUFTQW1HU2Y0R1JXQVk5V0tNc0JBNGtCQTRFQllyRERHVXU4R1dCaGd3UUFtZ1FBZ1FRQWdBUUJnQVFBaVFRQWd3UUFnQVFBZ0FRRmdBUURnQVFBZ0FRQWdBUUFnZ1FBZ1FRQWdBUUJnQVFBZ0FRQWdBUUFnQVFBZ0FRQWdRUUFnQVFCZ3dRQWhnUUFnd1FBZ3dRQWdBUUFpUVFBa0FRRWdnUUFoQVFBa0FRemdRUmdyYXNaQStBREdRdU9HUUdPR1FDT0dRQ2tHUW5nVFJrM21SbUFOWUVaREtzWkE0Z1pCb0VaRFlVWllEbmpkeGtIakJrQ2pCa0M0Qk1aQzlnWkJvc1pFNHNaQTdjWkI0a1pCYWNaQjUwWkFZRVpUZUFZR1FEUkdRRGdKaGtMalJrQmhCa0NnaGtFaGhrSW1Ca0doaGtJZ2hrTWhoa280RElaQUxZWkpJa1pZNlh3bG4wdkllL1VMd3JnZlM4QjhBWWhMdzN3RE5BdmE3N2h2UzlsZ2ZBQzZpOTYzRldBR1IzZkdXQWY0STgzQUVHUXpnSUxzZ3VDd1FBQUFTc0JBQUFCS3h3QURBRkZnSklBQUFJZGF3QUNIU2dCQWgxRkFBSWRLSUVEQUFBRkJER0hrWm9OQUFBRkJER0hrWm9BQXdTSGtRRUFBQVVFTVllUm1oOEFBQWdCQkZCUmVER0Nod2tBQ2dJRWh3a0FDUU1Fa1pvRkFBQUNCSWRpQUFBQ0JER0Ird0FBRFFzZktpd3VQRVZQY0gyT2tKVUFEQXNmS2l3dVBFVlBjSTZRbFJBQUFCUUxIeUV0VXlvc0xqeE9UMkJ3UTRHR2pZNlFsUUFWQ3g4aExWTXFMQzQ4UjA1UFlIQkRnWWFOanBDVkNRUWZJVHRPZFFBSkF3c1ZoblVBQ1FJdVhYVUFDUUlzUVlCMUFBMENLbzZBY1FBSkFqeGdnczhBQ1FNVlhvcUFNQUFBQWlkRmhiZ0FBUVFSTW9tSWdFb0FBUUpiZGdBQUFBSmJkb1JKQUFBRUN4OHFQQUFCSHdBRUN4OHFQQUFDSHlvQUFSOEJBZ3NmQUFJZmZRQUNDeDhBQWg5OUFBWWZQRTl3anBBQUFSOEJBaDk5QVFFZkFBSWZmUUFDQ3g4R0FSOEFBaDlnQUFJTEh3RUJId0FDQ3g4REFSOEFDQXNmS2p4Z2NKQ1ZBQUlmS2dBREh5bzhBUUlMSHdBQkN3RUNIeW9BQVdDQVJBQUJBU3MxQUFBQ0hZZUJ0UUFBQWtWYmdEOEFBQU1mS2tXTTBRQUFBaDBvZ1R3QUFRWU5NQzgxUFpzQUJRMHdMelU5QVFBQUFTOEFBQWtHRFRBdk5UMmJBQUFBQlEwd0x6VTlCd1lOTUM4MVBac0RCUTB3THpVOUNRQURBZzB2QVFBQUJRMHdMelU5QkFJMVBRQUFBQVVOTUM4MVBRTUFBUU12TlQwQkFTOVlBQU1DTlQwQ0FBQUNOVDFaQUFBR0RUQXZOVDJiQUFJMVBZQVNBQThCTHg4QUl3RXZPd0FuQVM4M0FEQUJMdzRBQ3dFdk1nQUFBUzlYQUJnQkx3a0FCQUV2WHdBZUFTL0FNZThBQUFJZEtJQVBBQWNDTDBXQXB3QUNEaDhoTEM1QlBEdE9UMXBnUTQyVkFnMGZJU3d1UVR3N1RscGdRNDJWQXdzZklTd3VRVHRPV2tPTmxZQTJBQUFDQ3g4QUFBQUNINDQ1QUFBRFBrVmVnQjhBQUFJUU9zQVRvUUFBQWdTUkNRQUFBZ1NSUmdBQkJRMHdMelU5Z0prQUJBWU5NQzgxUFpzSkFBQUNOVDBzQUFFQ05UMkEzd0FDQWh4SkF3QXNBeHhJU1FJQUNBSWNTWUVmQUJzQ0JCcVBoQUFBQWlxT0FBQUFBaXFPTmdBQkFpcU9qQklBQVFJcWpnQUFBQUlxanNCY1N3QURBU0tXT3dBUkFTK2VYUUFCQVMvT3pTMEFBRU51TEZWdVlYTnphV2R1WldRQVRIVXNWWEJ3WlhKallYTmxYMHhsZEhSbGNnQk1iQ3hNYjNkbGNtTmhjMlZmVEdWMGRHVnlBRXgwTEZScGRHeGxZMkZ6WlY5TVpYUjBaWElBVEcwc1RXOWthV1pwWlhKZlRHVjBkR1Z5QUV4dkxFOTBhR1Z5WDB4bGRIUmxjZ0JOYml4T2IyNXpjR0ZqYVc1blgwMWhjbXNBVFdNc1UzQmhZMmx1WjE5TllYSnJBRTFsTEVWdVkyeHZjMmx1WjE5TllYSnJBRTVrTEVSbFkybHRZV3hmVG5WdFltVnlMR1JwWjJsMEFFNXNMRXhsZEhSbGNsOU9kVzFpWlhJQVRtOHNUM1JvWlhKZlRuVnRZbVZ5QUZOdExFMWhkR2hmVTNsdFltOXNBRk5qTEVOMWNuSmxibU41WDFONWJXSnZiQUJUYXl4TmIyUnBabWxsY2w5VGVXMWliMndBVTI4c1QzUm9aWEpmVTNsdFltOXNBRkJqTEVOdmJtNWxZM1J2Y2w5UWRXNWpkSFZoZEdsdmJnQlFaQ3hFWVhOb1gxQjFibU4wZFdGMGFXOXVBRkJ6TEU5d1pXNWZVSFZ1WTNSMVlYUnBiMjRBVUdVc1EyeHZjMlZmVUhWdVkzUjFZWFJwYjI0QVVHa3NTVzVwZEdsaGJGOVFkVzVqZEhWaGRHbHZiZ0JRWml4R2FXNWhiRjlRZFc1amRIVmhkR2x2YmdCUWJ5eFBkR2hsY2w5UWRXNWpkSFZoZEdsdmJnQmFjeXhUY0dGalpWOVRaWEJoY21GMGIzSUFXbXdzVEdsdVpWOVRaWEJoY21GMGIzSUFXbkFzVUdGeVlXZHlZWEJvWDFObGNHRnlZWFJ2Y2dCRFl5eERiMjUwY205c0xHTnVkSEpzQUVObUxFWnZjbTFoZEFCRGN5eFRkWEp5YjJkaGRHVUFRMjhzVUhKcGRtRjBaVjlWYzJVQVRFTXNRMkZ6WldSZlRHVjBkR1Z5QUV3c1RHVjBkR1Z5QUUwc1RXRnlheXhEYjIxaWFXNXBibWRmVFdGeWF3Qk9MRTUxYldKbGNnQlRMRk41YldKdmJBQlFMRkIxYm1OMGRXRjBhVzl1TEhCMWJtTjBBRm9zVTJWd1lYSmhkRzl5QUVNc1QzUm9aWElBUWREWkFndXdDQTRBQUFBK0FBQUF3QUVBQUFBT0FBQUE4QUFBQUFCL0FBQUFnQU1CQUFBOFFWTkRTVWxmU0dWNFgwUnBaMmwwTEVGSVpYZ0FRbWxrYVY5RGIyNTBjbTlzTEVKcFpHbGZRd0JFWVhOb0FFUmxjSEpsWTJGMFpXUXNSR1Z3QUVScFlXTnlhWFJwWXl4RWFXRUFSWGgwWlc1a1pYSXNSWGgwQUVobGVGOUVhV2RwZEN4SVpYZ0FTVVJUWDBKcGJtRnllVjlQY0dWeVlYUnZjaXhKUkZOQ0FFbEVVMTlVY21sdVlYSjVYMDl3WlhKaGRHOXlMRWxFVTFRQVNXUmxiMmR5WVhCb2FXTXNTV1JsYndCS2IybHVYME52Ym5SeWIyd3NTbTlwYmw5REFFeHZaMmxqWVd4ZlQzSmtaWEpmUlhoalpYQjBhVzl1TEV4UFJRQk9iMjVqYUdGeVlXTjBaWEpmUTI5a1pWOVFiMmx1ZEN4T1EyaGhjZ0JRWVhSMFpYSnVYMU41Ym5SaGVDeFFZWFJmVTNsdUFGQmhkSFJsY201ZlYyaHBkR1ZmVTNCaFkyVXNVR0YwWDFkVEFGRjFiM1JoZEdsdmJsOU5ZWEpyTEZGTllYSnJBRkpoWkdsallXd0FVbVZuYVc5dVlXeGZTVzVrYVdOaGRHOXlMRkpKQUZObGJuUmxibU5sWDFSbGNtMXBibUZzTEZOVVpYSnRBRk52Wm5SZlJHOTBkR1ZrTEZORUFGUmxjbTFwYm1Gc1gxQjFibU4wZFdGMGFXOXVMRlJsY20wQVZXNXBabWxsWkY5SlpHVnZaM0poY0dnc1ZVbGtaVzhBVm1GeWFXRjBhVzl1WDFObGJHVmpkRzl5TEZaVEFGZG9hWFJsWDFOd1lXTmxMSE53WVdObEFFSnBaR2xmVFdseWNtOXlaV1FzUW1sa2FWOU5BRVZ0YjJwcEFFVnRiMnBwWDBOdmJYQnZibVZ1ZEN4RlEyOXRjQUJGYlc5cWFWOU5iMlJwWm1sbGNpeEZUVzlrQUVWdGIycHBYMDF2WkdsbWFXVnlYMEpoYzJVc1JVSmhjMlVBUlcxdmFtbGZVSEpsYzJWdWRHRjBhVzl1TEVWUWNtVnpBRVY0ZEdWdVpHVmtYMUJwWTNSdlozSmhjR2hwWXl4RmVIUlFhV04wQUVSbFptRjFiSFJmU1dkdWIzSmhZbXhsWDBOdlpHVmZVRzlwYm5Rc1JFa0FTVVJmVTNSaGNuUXNTVVJUQUVOaGMyVmZTV2R1YjNKaFlteGxMRU5KQUVGVFEwbEpBRUZzY0doaFltVjBhV01zUVd4d2FHRUFRVzU1QUVGemMybG5ibVZrQUVOaGMyVmtBRU5vWVc1blpYTmZWMmhsYmw5RFlYTmxabTlzWkdWa0xFTlhRMFlBUTJoaGJtZGxjMTlYYUdWdVgwTmhjMlZ0WVhCd1pXUXNRMWREVFFCRGFHRnVaMlZ6WDFkb1pXNWZURzkzWlhKallYTmxaQ3hEVjB3QVEyaGhibWRsYzE5WGFHVnVYMDVHUzBOZlEyRnpaV1p2YkdSbFpDeERWMHREUmdCRGFHRnVaMlZ6WDFkb1pXNWZWR2wwYkdWallYTmxaQ3hEVjFRQVEyaGhibWRsYzE5WGFHVnVYMVZ3Y0dWeVkyRnpaV1FzUTFkVkFFZHlZWEJvWlcxbFgwSmhjMlVzUjNKZlFtRnpaUUJIY21Gd2FHVnRaVjlGZUhSbGJtUXNSM0pmUlhoMEFFbEVYME52Ym5ScGJuVmxMRWxFUXdCTWIzZGxjbU5oYzJVc1RHOTNaWElBVFdGMGFBQlZjSEJsY21OaGMyVXNWWEJ3WlhJQVdFbEVYME52Ym5ScGJuVmxMRmhKUkVNQVdFbEVYMU4wWVhKMExGaEpSRk1BUVpEaUFndTBJSUVBS0FDWEFDb0FnWUFxQUpmQUt3QVZnU3dBbHdBdEFJRkFMUUNYQUM0QUZVRXVBSmtCTHdBV0lEQUFRZ2hBQUVLS1JBQkNCRW9BbGdCTUFCZUJUQUJDQWswQVFrTk9BQy9CVHdCQ3cxQUF2MEJTQUVJRFV3QkNDVlVBUWdoYUFKWUFYZ0JDUTE0QWdjQmZBRUlCYUFCQ3dXc0FoUUZ4QUJmRGNRQkVTSE1BUklOM0FFS0RlUUMrQW5zQWwwRjhBRUlCZlFCRUJINEFRZzZBQUVLQmh3QkVoNGtBZ3dTc0FCY0R0Z0NEQXJnQUZBTFFBSllBMFFDQUFOMEFsNERlQUlDQTN3Q1hBT0VBUGtIaEFJREE0UUMrQk9JQXJvUHFBSzZDOGdDdEFmUUFMc0gwQUFOQjlRQURBL3dBZ1VEK0FENENBQUcrd0FFQnZnRURBYjVBQmdHK1FBNEJQZ0lVQWI3QUZRRytBUmNCUklFZEFVUkJNQUZFQWpRQlJJRTFBVVNETmdGRWd6Z0JSSVk2QVVRQlBnR0Z3R0VCcm9LSUFTOUNuUUdFQWJBQmhNQzBBWVJBU2dLRVFFd0NoQUJOQWk0RVZnSXV3WElDSUFGM0FvVEFkd0tFd0l3Q2hJQ05BcTVCbGdLRWdKY0NoQURTQWk3QjBnSWdBZGNDaEFEbEFxNkI4Z0tFQUJJRGhBQXdBeUxCTVFNdWdUSURyb0ZTQTRTQWRnT3VBWGNEaGNDTUE0WEFyQU12QWJjRGdRRERBNFRBMEFPRVFOTURoSURVQTRUQTFRT0VBTmNEaEVEYUE0VEEzQU11UWQwRGhjRGRBNFFBM2dPRlFONERoRURnQTRUQTVBT0VRT2NEaElEb0E0VEE2UU9FQU9zRGhFRHVBNFNBQ1FTQkFEOEVoSVRCQm9TQXhBYUV3YzRHSUFIUUJvVEEwQWFEQTBzSEg4Uk1CNE1YVHdlQkFGNEhnOUptQjBRZGdBZENpWTRIUkJpVEIwSU5ud2NXZ3FVSGhZQ21CNzdBcGdkRURhZ0hSS0N1QnlJQndBZEVnOEFISWdIQ0IwU0R3Z2NpQWNRSFJJTEVCeUlCeGdkRWdzWUhQaEhJQjBTQzBBY2lBZElIUklMU0J5SUIxQWRFZzlRSFBreldCNEJBM0FlK2dOd0hnTURjQjc0QTNRZUFRTjBIdm9EZEI0REEzUWUrQU40SGdFRGVCNzZBM2dlQXdONEh2Z0RmQjRCQTN3Y2dDT0FISUFqa0J5QUk2QWUrQmV3SGdNRHVCNzRBN3dlWFFPOEhnSUR2QnhmQjd3YytSUEFIZ0VEeUI3NkE4Z2VBd1BJSHZnUHpCNERBOUFldWd2VUhnTUQyQno1RDl3ZUF3UGdIcmdQNUI0REErZ2MrQWZzSEFvSDdCNzZEL0FlQVFQNEh2b0QrQjREQS9nZStBUDhIZ0VEL0I1ZUEvd2NlQVFBSWxZUUFDSUZBQkFpWHdBVUlnUUFKQ0pkQUNRaVpnQWtJZ2NBTENJWEFEQWl4QUEwSWhZQU5DTEhBRFFpWEFROElsOEVSQ0xQQUZRaUJ3QmNJbFFVY0NJSEFIZ2dWQWg4SUh3VWdDSU9GSWdnVlJDVUlsd0FxQ0JrQlFBaUJnRUFJdjhCQUNCbEJRUWlCd0VFSXYwQkNDQzJGUWdpQlFFVUlsNEJGQ0pWQ1JnaVhBRWdJbVVCSUNKZUFTQWlCQUVrSWdJQkpDSUVBU2dnQ2dVb0lsUVJMQ0I5Q1RRaUJRRTRJbWNCT0NJTUNUd2lWUWxFSUdRRlVDSnVBVkFnWnhsUUlsOEJYQ0lFQVdBaVhRRmdJbVlCWUNKZkFXQWlCQUZrSWwwQlpDSm1BV1FpYndGa0lsd0JhQ0lGQVdnaVhnRm9JbWNCYUNKVUNXd2lYUUZ3SW1ZQmNDSmZBWEFpQkFGMElsMEJkQ0ptQVhRaWJ3RjBJbHdCZUNJRkFYZ2lYZ0Y0SW1jQmVDQlVDWHdpWlFHSUlQb0ZtQ0w2QWF3aStRWE1JdmdDQkNMNUFnZ2krQUlNSXZnR0pDSVVBaXdpeFFJc0loY0NMQ0xFQWpBaStRSkFJdmdDUkNMN0JrUWkrQVpnSXZrS2JDRVFCblFoRUFaNElSQUdnQ0VRQm9RaEVBYUlJUGdLckNFUUN1QWdnZ3JvSUhrSEtDSjhFR0FralJSb0psOEFjQ2FVRUhRa3JSUjhKbThBaENhRUVJZ2tsUlNRSm1jQW1DU1VOSndrZmpTMEpIdzAwQ1lHQU9nbXpBSU1LbVFDZENwZEFuUXFaZ0owS3ZnQzNDaFVCSHd1QndGc0xnY0NuQzRIQXZBdXRCTUFMclVUQ0M2MkV4QXVEODhZTExZWGdDd01kNHdzdGlQRUxnUUFBRElPQ0RReUVDeE1NaEVJWkRDSUJIQXdpd1J3TUlvRWREQ0pCSGd3aUFSOE1oQUFsRENQQkpneUVnQ2NNaGNBbkRJUUxLd3lFUWpFTUlnRTBEQ0xCTkF3aWdUVU1Ja0UyRENJQk53eUVBRDBNSU1JOURJU0FQd3lGd0Q4TUxVcE1EQjlGVVF5ZnlsTU1yUlZaREFPSFpBeEJCNEFNaVlDRERDbkJnd3lwUVlRTWlRQ0ZEQ2xCaFF5cHdvVU1pUUNIREk5QWh3eU5nSWNNUVJLSURBTUNrUXlaQUpRTW8wU1VEQ09EbGd3dEI1Z01yNFNiREtIQ25ReTFBSjhNczBDZkRJV0Fud3lER0tBTUkwS3NEQ05GclF5WHdLOE1vUVN3REtWQnNneVhBTE1NbVVDekRKZUFzd3lad0xNTXJSZTBESVhBdnd5ekFjQU1zY0RBRExNQXdRd3hRY0VNdGNEQkRMTUF3Z3l4UWNJTU13SEREREdCd3d5RkFNUU1zVURFRERPQnhBeUZBTVVNdFVERkRMZUF4UXkxd01VTXNRREdERFZCeGd5endNWU1zUUhIRExQQXh3eTFBTWdNczBESURMR0J5QXd2UXNrTU1VSEtETFhBeWd5eEFNc01zMERMRExXQXl3eXh3TXNNTHdITURMV0F6QXl6d013TXRRRE5ETEZBelF5MWdNME1oY0RORExFQ3pneXpRTThNc1lEUERJWEF6d3l4QWRBTXM4RFFETEVCMFF5MXdORU1zd0RTRElWQTBneTFnTklNaGNEU0RETUIwd3l4Z2RNTXMwRFVESVdBMUF5eHdOUU1zd0RWRElWQTFReTFnTlVNc2NEVkRDRUYxZ3dsaGRnTXBRTGJESmxBM0F3WGdkd01tUURkREpkQjNRd25BZDRNaFlMZURJbkEzd3cvQk9BTW1RRGlESnRBNGd5L2crSU1HVUxrREFWQzVRdy9RK1lNTWNIbkRJVkE2QXl4Z2VnTWhVRHBEQWVCNlF5SkFPb01sMERxREJtQzZneWRnT3NNamNEckREOEk3QXdGQWZBTW00RHdESmZCOEF5YmdQRU1tY0R4REJjRjhneVpnUFFNRjhIMERCbEI5UXlYd1BVTW13RDJESmxBOWd3WGd2WU1HWUgzREtFRStBd2xSZm9NSmNYOERDVkIvd3lad1A4TUF3R25LWUVBM0NrREFmNHBBd0xYS29GQTJpcUNGRUErZ245S1BvSS9hajRDb1lvK0VBR2JQb0l2bkQ2UXhiTStsd0hBUGhuQndENC9RY0UrcjhMRVBvUkJ4ejZ0Qk1nK2dVREtQZ1NEeWo2Z0E4dytvQUxPUG9TQXp6NGdBZEErSU1IUVBxNkUwVDZGd05NK0xUSFVQcTNMOUQ0dmlmbytMUUwvUGk4dkFEK2xnaGMvc2NBWVA2OEhHVCt2L3h3L3BZRThQNjlrUFQ4eElGUS9NWnRrUHpFQmZEK3pnM3cvc1VCK1A3MkFmais3d0g0L3N3Qi9Qd01GaEQrdEFZdy9GY09NUHkxR2pqOER6SkUvbGNhWFA2OEJuRCtGQUowL0w0V2RQNjA2b0Q4dlJMMC9IMi9BUHgvQjF6K3RYOWcvZ1FEb1B4OVA2RDhmZy9BL0g0UHlQeCtEOUQrZmdmWS9nd2Y0UDVLQkprU1N3Q3BFRW9GTFJCTEIwa1FTd2k1RkVvRnVSWklBVGthU2cxZDBFc051ZEI4TkFIVWZqUVoxSHcwTmRaK0RFM1VmaVJWMUh3MGFkUitOSUhVVkVDZDFuME12ZFo5Rk1YVWZEVFIxSDQwNmRaVURRWFVmUkVOMW40TkZkUitOUjNXVkIwNTFuNE5TZFIrTlZIVWZEVnQxSDQxaGRSOE5hSFVmalc1MUh3MTFkUitOZTNVZkRZSjFINDJJZFI4TmozVWZqWlYxSHcyY2RSK05vblVEQWFsMW53aXFkWUZBcm5XZmc2NTFnVUN3ZForTXNIV0J3TFoxTFFPM2RaK0l1SFdCd0x4MW53TzlkWUhBdm5XZkRMOTFnVURGZFMyRHhYV2ZDTWQxZ1VETGRaK0R5M1dCUU0xMW40ek5kWUhBMDNVdEE5UjFuNGpWZFlIQTJYV2ZBOXAxZ2NEYmRaOE0zSFdCUU9KMUxZUGlkWjhJNUhXQlFPaDFuNFBvZFlGQTZuV2ZqT3AxZ2NEd2RTMEU4WFVmaGZOMUh3WDJkUitGK0hVZkJmdDFINFg5ZFMwQ2dIdXRUWUY3QTBLSWU0SEFpWHN0UllwN0F3U05lNEdBa0hzRDNKRjdMUVdnZTYzSW9udURSS2g3cmNpcWU1Y0FRSHdoUlVCOEpRMUVmSWVBU253VndVcDhGMEZMZkI4TlRId1hnbEo4bVlCVGZKZkFVM3lYZ1ZwOGx3QmtmQzhCZ0h5QmdJQjhBeGFFZk1FRWtId0RBWlI4SHdYOGZxd0JBTDRRMFFDK3JFY0p2aEE1RGI0c2h5bStMQUl0dnBBM0xyNlEvMG0rRUx4cHZnQUFBQUFBQUFBQUlBQUFBR0VBQWdBRUFBWUF2QU1JQUFvQURBQVZBSlVBcFFDNUFNRUF3d0RIQU1zQTBRRFhBTjBBNEFEbUFQZ0FDQUVLQVhNQUVBRVNBUlFCSUFFc0FVUUJUUUZUQVdJQmFBRnFBWFlCa2dHVUFha0J1d0hIQWRFQjFRRzVBdGNCT3dEWkFkc0J0d0RoQWZ3QkRBSVlBaDBDSXdJbkFxTURNd0kvQWtJQ1N3Sk9BbEVDWFFKZ0Fta0NiQUp2QW5VQ2VBS0JBb29DbkFLZkFxTUNyd0s1QXNVQ3lRTE5BdEVDMVFMbkF1MEM4UUwxQXZrQy9RSUZBd2tERFFNVEF4Y0RHd01qQXljREt3TXZBelVEUFFOQkEwa0RUUU5SQXdzUFZ3TmJBMThEWXdObkEyc0Rid056QTNrRGZRT0JBNFVEaVFPTkE1RURsUU9aQTUwRG9RUGNFS1VEeVFQTkE5a0QzUVBoQSs4RDhRTTlCRThFbVFUd0JBSUZTZ1ZrQld3RmNBVnpCWm9GK2dYK0JRY0dDd1lVQmhnR0hnWWlCaWdHamdhVUJwZ0duZ2FpQnFzR3JBUHpCcTBEOWdhdUEva0dyd1A4QnN3RC93Yk5Bd0lIemdNRkJ3a0hEUWNSQjRZRE1nYzFCN2tETndjN0I0Z0RVd2VKQTFZSGtBTnJCNG9EZHdld0E0a0hqZ09aQjU4SG93ZU1BN2dIandPN0I3UUF2Z2ZBQjhJSEVDRExCeTRBelFmUEJ5QUEwZ2ZXQjlzSDN3ZmtCK29IOEFjZ0FQWUhFaUlCQ0FVSUJ3Z2RDQ1VJSndoREFDMElNQWlRQVRZSU9RaE9BRVVJUndoTUNFNElVUWhhQUtrRFdnQlRDRmNJWUFocEFHSUlaUWh2Q0hRSWVnaCtDS0lJU1FDa0NLWUlxUWhXQUtzSXJRaXdDTFFJV0FDMkNMZ0l1d2pBQ01JSXhRaDJBTWNJeVFqTUNOQUllQURTQ05RSTF3amJDTjRJNUFqbkNQQUk4d2oyQ1BrSUFna0dDUXNKRHdrVUNSY0pHZ2tqQ1N3Sk93aytDVUVKUkFsSENVb0pWZ2xjQ1dBSllnbGtDV2dKYWdsd0NYZ0pmQW1BQ1lZSmlRbVBDWkVKTUFDVENaa0puQW1lQ2FFSnBBbGhMYzFybjUrbUNiRUp2QW5IQ1pVS29Rb1ZDeUFBSndzeEM0MExvUXVsQzZrTHJRdXhDN1VMdVF1OUM4RUx4UXNoRERVTU9RdzlERUVNUlF4SkRFME1VUXhWREZrTWJ3eHhESE1Nb0F5OEROd001QXpzRFBRTS9Bd0VEUXdORkEwaURTNE5lZzJDRFlVTmlRMk5EWjBOc1EyMURid053ZzNHRFNnT0xBNHdEaklPTmc0OERqNE9RUTVERGtZT2R3NTdEb2tPamc2VURwd09vdzZwRHJRT3ZnN0dEc29Penc3WkR0ME81QTdzRHZNTytBNEVEd29QRlE4YkR5SVBLQTh6RHowUFJROU1EMUVQVnc5ZUQyTVBhUTl3RDNZUGZRK0NENGtQalErZUQ2UVBxUSt0RDdnUHZnL0pEOUFQMWcvYUQrRVA1US92RC9vUEFCQUVFQWtRRHhBVEVCb1FIeEFqRUNrUUx4QXlFRFlRT1JBL0VFVVFXUkJoRUhrUWZCQ0FFSlVRb1JDeEVNTVF5eERQRU5vUTNoRHFFUElROUJBQUVRVVJFUkZCRVVrUlRSRlRFVmNSV2hGdUVYRVJkUkY3RVgwUmdSR0VFWXdSa2hHV0Vad1JvaEdvRWFzUmI2ZXZFYk1SalFLN0VRMFNDeE1KRkkwVWtoUlFGV2tWYnhWMUZYc1ZoeFdURlNzQW5oVzJGYm9WdmhYQ0ZjWVZ5aFhlRmVJVlJoWmZGb1VXaXhaSkYwOFhWQmQwRjNRWWVoZ09HZEFaZEJwOEdwb2FueHF6R3IwYXd4clhHdHdhNGhyd0dpQWJMUnMxR3prYlR4dkdHOWdiMmh2Y0cyUXhIUndmSENFY0l4d2xIQ2NjUlJ4VEhGZ2NZUnhxSEh3Y2hSeUtIS29jeFJ6SEhNa2N5eHpOSE04YzBSelRIUE1jOVJ6M0hQa2MreHdDSFFRZEJoMElIUmNkR1IwYkhSMGRIeDBoSFNNZEpSMG5IU2tkS3gwdEhTOGRNUjB6SFRjZDlBTTVIUWNpT3gwQ0lqMGRSUjMwQTBjZEJ5SkpIUUlpU3gxVEhmUURWUjBISWxjZEFpSlpIV0VkOUFOakhRY2laUjBDSW1jZGJ4MzBBM0VkQnlKekhRSWlkUjEvSFlFZGd4MkZIWWNkaVIyUEhhd2RMUWEwSGNBZExBYlFIVUFlVEI1ZkhuRWVoQjZHSG9vZWtCNldIcGdlbkI2ZUhxWWVxUjZySHJFZXN4NjFNTGtlRVI4bkh5c2ZMUjh5SDM4ZmtCK1JJS0VncHlDaEliOGlBRUhRZ2dNTDBrY2dpQ0NFTWpNZ2dTQ25NVzh4MERReDBESXowRFJCZ0VHQlFZSkJnMEdJUVlvQUFFT25SWUJGZ1VXQ1JZaEpnRW1CU1lKSmlBQUFUb05QZ0UrQlQ0SlBnMCtJQUFBQUFGV0FWWUZWZ2xXSVdZRUFBQUFBWVlCaGdXR0NZWU5oaUdHS0FBQmpwMldBWllGbGdtV0lhWUJwZ1dtQ2FZZ0FBRzZEYjRCdmdXK0NiNE52aUFBQUFBQjFnSFdCZFlKMWlIbUJBQUI1aUVHRVFZWkJxRU9CUTRKRGgwT01SSXhGaEVXR1JZZEZxRVdNUjRKSGhrZUhSNmRJZ2ttRFNZUkpoa21vU1lkSlNtbHFTb0pMcDB5QlRLZE1qRXdBQUdzZ2EwNkJUcWRPakx3Q2JrK0VUNFpQaTFLQlVxZFNqRk9CVTRKVHAxT01WS2RVakZXRFZZUlZobFdLVll0VnFGZUNXWUpaaUZxQldvZGFqRStiVlp0RUFIMEJSQUIrQVdRQWZnRk1Ta3hxYkdwT1NrNXFibXBCQUl4SkFJeFBBSXhWQUl6Y0FJVGNBSUhjQUl6Y0FJREVBSVFtQW9UR0FJUkhqRXVNVDZqcUFZVHJBWVMzQVl5U0FveHFBSXhFV2tSNlpIcEhnVTRBZ01VQWdjWUFnZGdBZ1VHUFFaRkZqMFdSU1k5SmtVK1BUNUZTajFLUlZZOVZrVk9tVktaSWpFRUFoMFVBcDlZQWhOVUFoRThBaHk0Q2hGa0FoR2dBWmdKcUFISUFlUUo3QW9FQ2R3QjVBQ0NHSUljZ2lpQ29JSU1naTJNQ2JBQnpBSGdBbFFLQWdRQ1RpSUVneFNDQnFBQ0JrUU9CbFFPQmx3T0JtUU9CQUFBQW53T0JBQUFBcFFPQnFRT0J5Z09CQVFPWUI2UUhzQUMwQUxZQXVBREtBQUVEdUFmRUI3NEF4QURJQUtVRERSTUFBUVBSQU5FSHhnUEFBN29Ed1FQQ0F3QUFtQU8xQXhVRWdCVUVpQUFBQUJNRWdRWUVpQm9FZ1JnRWdDTUVoaGdFaGpnRWhqVUVnRFVFaUFBQUFETUVnVllFaURvRWdUZ0VnRU1FaG5RRWp4WUVoaEFFaGhBRWlCVUVodGdFaUJZRWlCY0VpQmdFaEJnRWlCNEVpT2dFaUMwRWlDTUVoQ01FaUNNRWl5Y0VpQ3NFaUdVRmdnVW5CZ0FzQUMwaExRQXVJeTBuQmdCTklVMmdUU05OMVFaVUJnQUFBQURCQmxRRzBnWlVCaWdKUEFrd0NUd0pNd2s4Q1JVSkFDY0JKd0luQnljTUp3MG5GaWNhSjc0SkNRQUpHYUVKdkFtdkNid0pNZ284Q2pnS1BBb1dDZ0FtQVNZR0ppc0tQQXBIQzFZTFBnc0pBQWtaSVFzOEM1SUwxd3UrQ3dnQUNRQUlHVVlNVmd5L0ROVU14Z3pWRE1JTUJBQUlFejROQ0FBSkFBZ1oyUTNLRGNvTkR3VVNBQThWVFE0eURzME9zZzZaRGhJQUVnaENEN2NQVEErM0QxRVB0dzlXRDdjUFd3KzNEMEFQdFE5eEQzSVBjUThBQTBFUHNnK0JEN01QZ0ErekQ0RVBjUStBRDVJUHR3K2NEN2NQb1ErM0Q2WVB0dytyRDdjUGtBKzFEeVVRTGhBRkd6VWJBQUFBQUFjYk5Sc0FBQUFBQ1JzMUd3QUFBQUFMR3pVYkFBQUFBQTBiTlJzUkd6VWJPaHMxR3dBQUFBQThHelViUGhzMUcwSWJOUnRCQU1ZQVFnQUFBRVFBUlFDT0FVY0FUd0FpQWxBQVVnQlVBRlVBVndCaEFGQUNVUUlDSFdJQVpBQmxBRmtDV3dKY0FtY0FBQUJyQUcwQVN3RnZBRlFDRmgwWEhYQUFkQUIxQUIwZGJ3SjJBQ1Vkc2dPekE3UUR4Z1BIQTJrQWNnQjFBSFlBc2dPekE4RUR4Z1BIQTFJQ1l3QlZBdkFBWEFKbUFGOENZUUpsQW1nQ2FRSnFBbnNkblFKdEFvVWRud0p4QW5BQ2NnSnpBblFDZFFKNEFvSUNnd0tyQVlrQ2lnSWNIWXNDakFKNkFKQUNrUUtTQXJnRFFRQ2xRZ0NIUWdDalFnQ3h4d0NCUkFDSFJBQ2pSQUN4UkFDblJBQ3RFZ0dBRWdHQlJRQ3RSUUN3S0FLR1JnQ0hSd0NFU0FDSFNBQ2pTQUNJU0FDblNBQ3VTUUN3endDQlN3Q0JTd0NqU3dDeFRBQ2pOaDZFVExGTXJVMkJUWWRObzA2SFRxTk9zVTZ0MVFDQjFRQ0lUQUdBVEFHQlVBQ0JVQUNIVWdDSFVnQ2pXaDZFVWdDeFV3Q0hVd0NqV2dHSFlBR0hZaDZIVkFDSFZBQ2pWQUN4VkFDdFZRQ2tWUUN3VlFDdGFBR0JhZ0dJVm9OV28xZUFWNEZYaUZlSFY2TlloMWlJV1lkYWdscWpXckZvc1hTSWQ0cDVpbUVBdmdKL0FZZEJBS05CQUluQ0FJSENBSURDQUluQ0FJT2dIb0lDQVlFQ0FZQUNBWWtDQVlPZ0hvWkZBS05GQUlsRkFJUEtBSUhLQUlES0FJbktBSU80SG9KSkFJbEpBS05QQUtOUEFJblVBSUhVQUlEVUFJblVBSVBNSG9LZ0FZR2dBWUNnQVltZ0FZT2dBYU5WQUtOVkFJbXZBWUd2QVlDdkFZbXZBWU92QWFOWkFJQlpBS05aQUlsWkFJT3hBeE1EQUIrQUFCK0JBQi9Da1FNVEF3Z2ZnQWdmZ1FnZndyVURFd01RSDRBUUg0R1ZBeE1ER0IrQUdCK0J0d09UdHdPVUlCK0FJUitBSUIrQklSK0JJQi9DSVIvQ2x3T1Rsd09VS0IrQUtSK0FLQitCS1IrQktCL0NLUi9DdVFPVHVRT1VNQitBTVIrQU1CK0JNUitCTUIvQ01SL0NtUU9UbVFPVU9CK0FPUitBT0IrQk9SK0JPQi9DT1IvQ3Z3T1R2d09VUUIrQVFCK0Jud01UQTBnZmdFZ2ZnY1VERXdOUUg0QlFINEZRSDhLbEE1UUFBQUJaSDRBQUFBQlpINEVBQUFCWkg4TEpBNVBKQTVSZ0g0QmhINEJnSDRGaEg0RmdIOEpoSDhLcEE1T3BBNVJvSDRCcEg0Qm9INEZwSDRGb0g4SnBIOEt4QTRDMUE0QzNBNEM1QTRDL0E0REZBNERKQTRBQUgwVURJQjlGQTJBZlJRT3hBNGF4QTRSd0g4V3hBOFdzQThVQUFBQ3hBOEsySDhXUkE0YVJBNFNSQTRDUkE4VWdreUNUSU1Lb0FNSjBIOFczQThXdUE4VUFBQUMzQThMR0g4V1ZBNENYQTRDWEE4Vy9INEMvSDRHL0g4SzVBNGE1QTRUS0E0QUFBN2xDeWtLWkJwa0VtUUQrSDREK0g0SCtIOExGQTRiRkE0VExBNEFBQThFVHdSVEZRc3RDcFFhbEJLVUFvUU9VcUFDQWhRTmdBSHdmeGNrRHhjNER4UUFBQU1rRHd2WWZ4WjhEZ0trRGdLa0R4U0NVQWlBZ0lDQWdJQ0FnSUNBZ3N5NHVMaTR1TWlBeUlESWdBQUFBTlNBMUlEVWdBQUFBSVNFQUFDQ0ZQejgvSVNFL01pQUFBQUFBTUdrQUFEUTFOamM0T1NzOUtDbHVNQUFyQUJJaVBRQW9BQ2tBQUFCaEFHVUFid0I0QUZrQ2FHdHNiVzV3YzNSU2MyRXZZMkV2YzdBQVEyTXZiMk12ZGJBQVJrZ0FId0FBQUNEZkFRRUVKRTV2VUZGU1VsSlRUVlJGVEZSTlN3REZBRUpEQUdWRlJnQk5iOUFGUmtGWXdBT3pBNU1Eb0FNUklrUmtaV2xxTWRBM01kQTVNZEF4TURIUU16TFFNekhRTlRMUU5UUFFOVFRRTlRIUU5qWFFOakhRT0RQUU9EWFFPRGZRT0RIUVNVbEpTVWxKVmxaSlZrbEpWa2xKU1VsWVdFbFlTVWxNUTBSTmFXbHBhV2xwYVhaMmFYWnBhWFpwYVdscGVIaHBlR2xwYkdOa2JURFFNNUFodUpJaHVKUWh1TkFodU5RaHVOSWh1QU1pdUFnaXVBc2l1Q01pdUFBQUFDVWl1Q3NpS3lJcklnQUFBQzRpTGlJdUlnQUFBRHdpdUVNaXVFVWl1QUFBQUVnaXVEMEF1QUFBQUdFaXVFMGl1RHdBdUQ0QXVHUWl1R1VpdUhJaXVIWWl1SG9pdUlJaXVJWWl1S0lpdUtnaXVLa2l1S3NpdUh3aXVKRWl1TElpT0FNSU1ERUFNUUF3QURJd0tBQXhBQ2tBS0FBeEFEQUFLUUFvTWpBcE1RQXVBREVBTUFBdUFESXdMaWdBWVFBcEFFRUFZUUFySWdBQUFBQTZPajA5UFQwOVBkMHF1R3BXQUU0QUtEWS9XWVdNb0xvL1VRQW1MRU5YYktHMndadFNBRjU2ZjUybXdjN250bFBJVStOVDExWWZWK3RZQWxrS1dSVlpKMWx6V1ZCYmdGdjRXdzljSWx3NFhHNWNjVnpiWGVWZDhWMytYWEplZWw1L1h2UmUvbDRMWHhOZlVGOWhYM05mdzE4SVlqWmlTMkl2WlRSbGgyV1haYVJsdVdYZ1plVmw4R1lJWnlobklHdGlhM2xyczJ2TGE5UnIyMnNQYkJSc05HeHJjQ3B5Tm5JN2NqOXlSM0paY2x0eXJIS0VjNGx6M0hUbWRCaDFIM1VvZFRCMWkzV1NkWFoyZlhhdWRyOTI3bmJiZCtKMzgzYzZlYmg1dm5sMGVzdDYrWHB6ZlBoOE5uOVJmNHAvdlg4QmdBeUFFb0F6Z0grQWlZRGpnUUFIRUJrcE9EeUxqNVZOaG11R1FJaE1pR09JZm9tTGlkS0pBSW8zakVhTVZZeDRqSjJNWkkxd2piT05xNDdLanB1UHNJKzFqNUdRU1pIR2tjeVIwWkYzbFlDVkhKYTJscm1XNkpaUmwxNlhZcGRwbDh1WDdaZnpsd0dZcUpqYm1OK1lscG1abWF5WnFKclltdCthSlpzdm16S2JQSnRhbStXY2RaNS9ucVdlQUJZZUtDeFVXR2x1ZTVhbHJlajMreEl3QUFCQlUwUlRSVk5MTUprd0FBQUFBRTB3bVRBQUFBQUFUekNaTUFBQUFBQlJNSmt3QUFBQUFGTXdtVEFBQUFBQVZUQ1pNQUFBQUFCWE1Ka3dBQUFBQUZrd21UQUFBQUFBV3pDWk1BQUFBQUJkTUprd0FBQUFBRjh3bVRBQUFBQUFZVENaTUdRd21UQUFBQUFBWmpDWk1BQUFBQUJvTUprd2J6Q1pNSEl3bVRCMU1Ka3dlRENaTUhzd21UQkdNSmt3SUFDWk1KMHdtVENJTUlvd3F6Q1pNQUFBQUFDdE1Ka3dBQUFBQUs4d21UQUFBQUFBc1RDWk1BQUFBQUN6TUprd0FBQUFBTFV3bVRBQUFBQUF0ekNaTUFBQUFBQzVNSmt3QUFBQUFMc3dtVEFBQUFBQXZUQ1pNQUFBQUFDL01Ka3dBQUFBQU1Fd21UREVNSmt3QUFBQUFNWXdtVEFBQUFBQXlEQ1pNTTh3bVREU01Ka3cxVENaTU5nd21URGJNSmt3cGpDWk1POHdtVEQ5TUprd3N6RElNQUFSQUFHcUFxeXRBd1FGc0xHeXM3UzFHZ1lIQ0NFSkVXRVJGQkZNQUFHenRMaTZ2OFBGQ01uTENRb01EZzhURlJjWUdSb2JIaUlzTXpqZDNrTkVSWEJ4ZEgxK2dJcU5BRTZNVGdsTzIxWUtUaTFPQzA0eWRWbE9HVTRCVGlsWk1GZTZUaWdBS1FBQUVRSVJBeEVGRVFZUkJ4RUpFUXNSREJFT0VROFJFQkVSRVJJUktBQUFFV0VSS1FBb0FBSVJZUkVwQUNnQUJSRmhFU2tBS0FBSkVXRVJLUUFvQUFzUllSRXBBQ2dBRGhGaEVTa0FLQUFNRVc0UktRQW9BQXNSYVJFTUVXVVJxeEVwQUNnQUN4RnBFUklSYmhFcEFDZ0FLUUFBVG94T0NVN2JWcFJPYlZFRFRtdFJYVTVCVXdobmEzQTBiQ2huMFpFZlYrVmxLbWdKWno1NURWUjVjcUdNWFhtMFV1Tk9mRlJtVytOMkFVL0hqRlJUYlhrUlQrcUI4NEZQVlh4ZWgyV1BlMUJVUlRJQU1RQXpBREFBQUJFQUFnTUZCZ2NKQ3d3T0R4QVJFZ0FSQUdFQ1lRTmhCV0VHWVFkaENXRUxZUXhoRGhGaEVRQVJEbUczQUdrTEVRRmpBR2tMRVc0UkFFNk1UZ2xPMjFhVVRtMVJBMDVyVVYxT1FWTUlaMnR3Tkd3b1o5R1JIMWZsWlNwb0NXYytlUTFVZVhLaGpGMTV0RkxZZVRkMWMxbHBrQ3BSY0ZQb2JBV1lFVStaVVdOckNrNHRUZ3RPNWwzelV6dFRsMXRtVytOMkFVL0hqRlJUSEZrekFEWUFOQUF3QURVd01RQUlaekVBTUFBSVowaG5aWEpuWlZaTVZFU2lNQUFDQkFZSUNRc05EeEVURlJjWkd4MGZJaVFtS0NrcUt5d3RNRE0yT1R3OVBqOUFRa1JHUjBoSlNrdE5UazlRNUU2TVZLRXdBVEJiSndGS05BQUJVamtCb2pBQVdrbWtNQUFuVHd5a01BQlBIUUlGVDZnd0FCRUhWQ0dvTUFCVUExU2tNQVpQRlFaWVBBY0FScXN3QUQ0WUhRQkNQMUdzTUFCQlJ3QkhNcTR3ckRDdU1BQWRUcTB3QURnOVR3RStFMCt0TU8wd3JUQUFRQU04TTYwd0FFQTBUeHMrclRBQVFFSVdHN0F3QURrd3BEQU1SVHdrVHd0SEdBQkpyekFBUGswZXNUQUFTd2dDT2hrQ1N5eWtNQkVBQzBlMU1BQStERWNyc0RBSE9rTUF1VEFDT2dnQ09nOEhRd0MzTUJBQUVqUVJQQk1YcERBcUh5UXJBQ0M3TUJaQkFEZ054REFOT0FEUU1BQXNIQnVpTURJQUZ5WkpyekFsQUR5ek1DRUFJRGloTURRQVNDSW9vekF5QUZrbHB6QXZIQkFBUk5Vd0FCUWVyekFwQUJCTlBOb3d2VEM0TUNJVEdpQXpEQ0k3QVNKRUFDRkVCNlF3T1FCUEpNZ3dGQ01BMnpEek1Na3dGQ29BRWpNaUVqTXFwREE2QUF0SnBEQTZBRWM2SHlzNlJ3dTNNQ2M4QURBOHJ6QXdBRDVFM3pEcU1OQXdEeG9BTEJ2aE1Ld3dyREExQUJ4SE5WQWNQNkl3UWxvblFscEpSQUJSd3pBbkFBVW82akRwTU5Rd0Z3QW8xakFWSmdBVjdERGdNTEl3T2tFV0FFSERNQ3dBQlRBQXVYQXhBREFBdVhBeUFEQUF1WEJvVUdGa1lVRlZZbUZ5YjFad1kyUnRaQUJ0QUxJQVNRQlZBSE5lRUdJdFpveFVKMWxqYXc1bXUyd3FhQTlmR2s4K2VYQUFRVzRBUWJ3RFFXMEFRV3NBUVVzQVFrMEFRa2NBUW1OaGJHdGpZV3h3QUVadUFFYThBMGE4QTJkdEFHZHJBR2RJQUhwclNIcE5TSHBIU0hwVVNIcThBeE1oYlFBVElXUUFFeUZyQUJNaFpnQnRiZ0J0dkFOdGJRQnRZd0J0YXdCdFl3QUtDazhBQ2s5dEFMSUFZd0FJQ2s4S0NsQUFDbEJ0QUxNQWF3QnRBTE1BYlFBVkluTUFiUUFWSW5NQXNnQlFZV3RRWVUxUVlVZFFZWEpoWkhKaFpORnpjZ0JoQUdRQUZTSnpBTElBY0FCemJnQnp2QU56YlFCemNBQldiZ0JXdkFOV2JRQldhd0JXVFFCV2NBQlhiZ0JYdkFOWGJRQlhhd0JYVFFCWGF3Q3BBMDBBcVFOaExtMHVRbkZqWTJOa1E5RnJaME52TG1SQ1IzbG9ZVWhRYVc1TFMwdE5hM1JzYld4dWJHOW5iSGh0WW0xcGJHMXZiRkJJY0M1dExsQlFUVkJTYzNKVGRsZGlWdEZ0UWRGdE1RRGxaVEVBTUFEbFpUSUFNQURsWlRNQU1BRGxaV2RoYkVvRVRBUW1BVk1CSjZjM3Eyc0NVcXRJalBSbXlvN0lqTkZ1TWs3bFU1eWZuSjlSV2RHUmgxVklXZlpoYVhhRmZ6K0d1b2Y0aUkrUUFtb2JiZGx3M25NOWhHcVI4Wm1DVG5WVEJHc2JjaTJHSHA1UVhldHZ6WVZraWNsaTJJRWZpTXBlRjJkcWJmeHl6cENHVDdkUjNsTEVaTk5xRUhMbmRnR0FCb1pjaHUrTk1wZHZtL3FkakhoL2VhQjl5WU1FazMrZTFvcmZXQVJmWUh4K2dHSnl5bmpDalBlVzJGaGlYQk5xMm0wUGJ5OTlOMzVMbHRKU2k0RGNVY3hSSEhxK2ZmR0RkWmFBaTg5aUFtcitpamxPNTFzU1lJZHpjSFVYVS90NHYwK3BYdzFPekd4NFpTSjl3MU5lV0FGM1NZU3FpcnByc0krSWJQNWk1WUtnWTJWMXJrNXBVY2xSZ1dqbmZHK0Mwb3JQa2ZWU1FsUnpXZXhleFdYK2J5cDVyWlZxbXBlZXpwNmJVc1ptZDJ0aWozUmVrR0VBWXBwa0kyOUpjWWwweW5uMGZXK0FKby91aENPUVNwTVhVcU5TdlZUSWNNS0lxb3JKWHZWZmUyT3VhejU4ZFhQa1R2bFc1MXU2WFJ4Z3NuTnBkSnAvUm9BMGt2YVdTSmNZbUl0UHJubTBrYmlXNFdDR1R0cFE3bHMvWEpsbEFtck9jVUoyL0lSOGtJMmZpR1l1bG9sU2UyZnpaMEZ0bkc0SmRGbDFhM2dRZlY2WWJWRXVZbmlXSzFBWlhlcHRLbytMWDBSaEYyaUhjNGFXS1ZJUFZHVmNFMlpPWjZobzVXd0dkT0oxZVgvUGlPR0l6SkhpbGo5VHVtNGRWTkJ4bUhUNmhhT1dWNXlmbnBkbnkyM29nY3Q2SUh1U2ZNQnltWEJZaThCT05vTTZVZ2RTcGw3VFl0WjhoVnNlYmJSbU80OU1pRTJXaTRuVFhrQlJ3RlVBQUFBQVdsZ0FBSFJtQUFBQUFONVJLblBLZGp4NVhubGxlWTk1VnBlK2ZMMS9BQUFTaGdBQStJb0FBQUFBT0pEOWtPK1kvSmdvbWJTZDNwQzNscTVQNTFCTlVjbFM1RkpSVTUxVkJsWm9Wa0JZcUZoa1hHNWNsR0JvWVk1aDhtRlBaZUpsa1dhRmFIZHRHbTRpYjI1eEszSWlkSkY0UG5sSmVVaDVVSGxXZVYxNWpYbU9lVUI2Z1hyQWUvUjlDWDVCZm5KL0JZRHRnWG1DZVlKWGhCQ0psb2tCaXptTDA0d0lqYmFQT0pEamx2K1hPNWgxWU81Q0dJSUNKazYxVVdoUmdFOUZVWUJSeDFMNlVwMVZWVldaVmVKVldsaXpXRVJaVkZsaVdpaGIwbDdaWG1sZnJWL1lZRTVoQ0dHT1lXQmg4bUUwWXNSakhHUlNaRlpsZEdZWFp4dG5WbWQ1YTdwclFXM2Jic3R1SW04ZWNHNXhwM2MxY3E5eUtuTnhkQVoxTzNVZGRoOTJ5bmJiZHZSMlNuZEFkOHg0c1hyQWUzdDhXMzMwZlQ1L0JZQlNnKytEZVlkQmlZYUpsb20vaXZpS3k0b0JpLzZLN1lvNWk0cUxDSTA0ajNLUW1aRjJrbnlXNDVaV2w5dVgvNWNMbUR1WUVwdWNuMG9vUkNqVk01MDdHRUE1UUVsUzBGelRma09manA4cW9BSm1abVpwWm14bVptbG1abXgvQVhSekFIUmxCUThSRHdBUEJoa1JEd2paQmJRRkFBQUFBUElGdHdYUUJSSUFBd1FMREEwWUd1a0Z3UVhwQmNJRlNmdkJCVW43d2dYUUJiY0YwQVc0QmRBRnZBWFlCYndGM2dXOEJlQUZ2QVhqQmJ3RnVRVXRBeTRETHdNd0F6RURIQUFZQmlJR0t3YlFCZHdGY1FZQUFBb0tDZ29ORFEwTkR3OFBEd2tKQ1FrT0RnNE9DQWdJQ0RNek16TTFOVFUxRXhNVEV4SVNFaElWRlJVVkZoWVdGaHdjR3hzZEhSY1hKeWNnSURnNE9EZytQajQrUWtKQ1FrQkFRRUJKU1VwS1NrcFBUMUJRVUZCTlRVMU5ZV0ZpWWtrR1pHUmtaSDUrZlgxL2Z5NkNnbng4Z0lDSGg0ZUhBQUFtQmdBQkFBRUFyd0N2QUNJQUlnQ2hBS0VBb0FDZ0FLSUFvZ0NxQUtvQXFnQWpBQ01BSTh3R0FBQUFBQ1lHQUFZQUJ3QWZBQ01BSkFJR0FnY0NDQUlmQWlNQ0pBUUdCQWNFQ0FRZkJDTUVKQVVHQlI4Rkl3VWtCZ2NHSHdjR0J4OElCZ2dIQ0I4TkJnMEhEUWdOSHc4SER4OFFCaEFIRUFnUUh4RUhFUjhTSHhNR0V4OFVCaFFmR3dZYkJ4c0lHeDhiSXhza0hBY2NIeHdqSENRZEFSMEdIUWNkQ0IwZUhSOGRJeDBrSGdZZUJ4NElIaDhlSXg0a0h3WWZCeDhJSHg4Zkl4OGtJQVlnQnlBSUlCOGdJeUFrSVFZaEh5RWpJU1FrQmlRSEpBZ2tIeVFqSkNRS1NndEtJMG9nQUV3R1VRWlJCdjhBSHlZR0FBc0FEQUFmQUNBQUl3QWtBZ3NDREFJZkFpQUNJd0lrQkFzRURBUWZKZ1lFSUFRakJDUUZDd1VNQlI4RklBVWpCU1FiSXhza0hDTWNKQjBCSFI0ZEh4MGpIU1FlSHg0akhpUWZBUjhmSUFzZ0RDQWZJQ0FnSXlBa0kwb2tDeVFNSkI4a0lDUWpKQ1FBQmdBSEFBZ0FId0FoQWdZQ0J3SUlBaDhDSVFRR0JBY0VDQVFmQkNFRkh3WUhCaDhIQmdjZkNBWUlIdzBHRFFjTkNBMGZEd2NQQ0E4ZkVBWVFCeEFJRUI4UkJ4SWZFd1lUSHhRR0ZCOGJCaHNIR3dnYkh4d0hIQjhkQmgwSEhRZ2RIaDBmSGdZZUJ4NElIaDhlSVI4R0h3Y2ZDQjhmSUFZZ0J5QUlJQjhnSVNFR0lSOGhTaVFHSkFja0NDUWZKQ0VBSHdBaEFoOENJUVFmQkNFRkh3VWhEUjhOSVE0ZkRpRWRIaDBmSGg4Z0h5QWhKQjhrSVVBR1RnWlJCaWNHRUNJUUl4SWlFaU1USWhNakRDSU1JdzBpRFNNR0lnWWpCU0lGSXdjaUJ5TU9JZzRqRHlJUEl3MEZEUVlOQncwZURRb01DZzRLRHdvUUloQWpFaUlTSXhNaUV5TU1JZ3dqRFNJTkl3WWlCaU1GSWdVakJ5SUhJdzRpRGlNUElnOGpEUVVOQmcwSERSNE5DZ3dLRGdvUENnMEZEUVlOQncwZURDQU5JQkFlREFVTUJnd0hEUVVOQmcwSEVCNFJIZ0FrQUNRcUJnQUNHd0FEQWdBREFnQURHd0FFR3dBYkFnQWJBd0FiQkFJYkF3SWJBd01iSUFNYkh3a0RBZ2tDQXdrQ0h3a2JBd2tiQXdrYkFna2JHd2tiR3dzREF3c0RBd3NiR3dvREd3b0RHd29DSUFvYkJBb2JCQW9iR3dvYkd3d0RId3dFR3d3RUd3MGJBdzBiQXcwYkd3MGJJQThDR3c4Ykd3OGJHdzhiSHhBYkd4QWJJQkFiSHhjRUd4Y0VHeGdiQXhnYkd4b0RHeG9ESUJvREh4b0NBaG9DQWhvRUd4b0VHeG9iQXhvYkF4c0RBaHNER3hzRElCc0NBeHNDR3hzRUFoc0VHeWdHSFFRR0h4MEVIeDBkSGdVZEhnVWhIZ1FkSGdRZEhnUWhIaDBpSGgwaEloMGRJaDBkQUFZaUFnUWlBZ1FoQWdZaUFnWWhBaDBpQWgwaEJCMGlCQVVoQkIwaEN3WWhEUVVpREFVaURnVWlIQVFpSEIwaUlnVWlJZ1FpSWgwaUhSMGlHaDBpSGdVaUdoMEZIQVVkRVIwaUd4MGlIZ1FGSFFZaUhBUWRHeDBkSEFRZEhnUUZCQVVpQlFRaUhRUWlHUjBpQUFVaUd4MGRFUVFkRFIwZEN3WWlIZ1FpTlFZQUQ1ME5ENTBuQmdBZEhTQUFIQUVLSGdZZUNBNGRFaDRLRENFZEVoMGpJQ0VNSFI0MUJnQVBGQ2NHRGgwaS93QWRIU0QvRWgwaklQOGhEQjBlSndZRkhmOEZIUUFkSUNjR0NxVUFIU3dBQVRBQ01Eb0FPd0FoQUQ4QUZqQVhNQ1lnRXlBU0FRQmZYeWdwZTMwSU1Bd05DQWtDQXdBQkJBVUdCMXNBWFFBK0lENGdQaUErSUY4QVh3QmZBQ3dBQVRBdUFBQUFPd0E2QUQ4QUlRQVVJQ2dBS1FCN0FIMEFGREFWTUNNbUtpc3RQRDQ5QUZ3a0pVQkFCdjhMQUF2L0RDQUFUUVpBQnY4T0FBNy9Ed0FQL3hBQUVQOFJBQkgvRWdBU0lRWUFBUUVDQWdNREJBUUZCUVVGQmdZSEJ3Y0hDQWdKQ1FrSkNnb0tDZ3NMQ3dzTURBd01EUTBORFE0T0R3OFFFQkVSRWhJU0VoTVRFeE1VRkJRVUZSVVZGUllXRmhZWEZ4Y1hHQmdZR0JrWkdSa2dJQ0FnSVNFaElTSWlJaUlqSXlNakpDUWtKQ1VsSlNVbUppWW1KeWNvS0NrcEtTa2lCaUlBSWdBaUFTSUJJZ01pQXlJRklnVWhBSVVwQVRBQkN3d0Erdkdnb3FTbXFPTGs1c0w3b2FPbHA2bXFySzZ3c3JTMnVMcTh2c0REeGNmSnlzdk16YzdSMU5mYTNkN2Y0T0hqNWVmbzZlcnI3Tzd5bUpreE1VOHhWVEZiTVdFeG9nQ2pBS3dBcndDbUFLVUFxU0FBQUFJbGtDR1JJWkloa3lHZ0pjc2xtUkM2RUFBQUFBQ2JFTG9RQlFXbEVMb1FCVEVSSnhFeUVTY1JWVWNUUGhOSEUxY1RWYmtVdWhTNUZMQVVBQUFBQUxrVXZSUlZVTGdWcnhXNUZhOFZWVFVaTUJrRlY5RmwwVmpSWmRGZjBXN1JYOUZ2MFYvUmNORmYwWEhSWDlGeTBWVlZWUVc1MFdYUnV0RmwwYnZSYnRHODBXN1J1OUZ2MGJ6UmI5RlZWVlZCQUdFQVFRQmhBR2tBUVFCaEFFRUFRMFFBQUVjQUFFcExBQUJPVDFCUkFGTlVWVlpYV0ZsYVlXSmpaQUJtYUFCd0FFRUFZUUJCUWdCRVJVWkhTZ0JUQUdFQVFVSUFSRVZHUndCSlNrdE1UUUJQVXdCaEFFRUFZUUJCQUdFQVFRQmhBRUVBWVFCQkFHRUFRUUJoQURFQk53S1JBNk1Ec1FQUkF5UUFId1FnQlpFRG93T3hBOUVESkFBZkJDQUZrUU9qQTdFRDBRTWtBQjhFSUFXUkE2TURzUVBSQXlRQUh3UWdCWkVEb3dPeEE5RURKQUFmQkNBRkN3d3dBREFBTUFBd0FEQUFKd1lBQVFVSUtnWWVDQU1OSUJrYUd4d0pEeGNMR0FjS0FBRUVCZ3dPRUVTUWQwVW9CaXdHQUFCSEJqTUdGeEFSRWhNQUJnNENEelFHS2dZckJpNEdBQUEyQmdBQU9nWXRCZ0FBU2dZQUFFUUdBQUJHQmpNR09RWUFBRFVHUWdZQUFEUUdBQUFBQUM0R0FBQTJCZ0FBT2dZQUFMb0dBQUJ2QmdBQUtBWXNCZ0FBUndZQUFBQUFMUVkzQmtvR1F3WUFBRVVHUmdZekJqa0dRUVkxQmtJR0FBQTBCaW9HS3dZdUJnQUFOZ1k0QmpvR2JnWUFBS0VHSndZQUFRVUlJQ0VMQmhBaktnWWFHeHdKRHhjTEdBY0tBQUVFQmd3T0VDZ0dMQVl2QmdBQVNBWXlCaTBHTndaS0Jpb0dHaHNjQ1E4WEN4Z0hDZ0FCQkFZTURoQXdMakFBTEFBb0FFRUFLUUFVTUZNQUZUQkRVa05FVjFwQkFFaFdUVlpUUkZOVFVGQldWME5OUTAxRVRWSkVTa3N3TUFCb2FFdGlWMXZNVThjd2pFNGFXZU9KS1Zta1RpQm1JWEdaWlUxU2pGK05VYkJsSFZKQ2ZSOTFxWXp3V0RsVUZHK1ZZbFZqQUU0SlRrcVE1bDB0VHZOVEIyTndqVk5pZ1hsNmVnaFVnRzRKWndobk0zVnlVclpWVFpFVU1CVXdMR2NKVG94T2lWdTVjRk5pMTNiZFVsZGxsMS92VXpBQU9FNEZBQWtpQVdCUHJrKzdUd0pRZWxDWlVPZFF6MUNlTkRvR1RWRlVVV1JSZDFFY0JiazBaMUdOVVVzRmwxR2tVY3hPckZHMVVkK1I5VkVEVXQ4ME8xSkdVbkpTZDFJVk5RSUFJSUNBQUFnQUFNZFNBQUlkTXo0L1VJS0trNnkydUxpNExBcHdjTXBUMzFOakMrdFQ4Vk1HVko1VU9GUklWR2hVb2xUMlZCQlZVMVZqVllSVmhGV1pWYXRWczFYQ1ZSWlhCbFlYVjFGV2RGWUhVdTVZemxmMFZ3MVlpMWN5V0RGWXJGamtGUEpZOTFnR1dScFpJbGxpV2FnVzZoYnNXUnRhSjFyWVdXWmE3amI4TmdoYlBscytXOGdadzF2WVcrZGI4MXNZRy85YkJseFRYeUpjZ1RkZ1hHNWN3RnlOWE9RZFExM21IVzVkYTExOFhlRmQ0bDB2T1AxZEtGNDlYbWxlWWppRElYdzRzRjZ6WHJaZXlsNlNvLzVlTVNNeEl3R0NJbDhpWDhjNHVETGFZV0pmYTEvak9KcGZ6Vi9YWC9sZmdXQTZPUnc1bEdEVUpzZGdBZ0lBQUFBQUFBQUFDQUFLQUFBQ0NBQ0FDQUFBQ0lBb2dBSUFBQUpJWVFBRUJnUXlSbXBjWjVhcXJzalRYV0lBVkhmekRDczlZL3hpYUdPRFkrUmo4U3NpWk1WanFXTXVPbWxrZm1TZFpIZGtiRHBQWld4bENqRGpaZmhtU1dZWk81Rm1DRHZrT3BKUmxWRUFaNXhtcllEWlF4ZG5HMmNoWjE1blUyZkRNMGs3K21lRloxSm9oV2h0Tkk1b0gyZ1VhWjA3UW1tamFlcHBxR3FqTnR0cUdEd2hhNmM0Vkd0T1BISnJuMnU2YTd0cmpUb0xIZm82VG15OFBMOXN6V3huYkJadFBtMTNiVUZ0YVcxNGJZVnRIajAwYlM5dWJtNHpQY3R1eDI3UlB2bHRibTllUDQ0L3htODVjQjV3RzNDV1BVcHdmWEIzY0sxd0pRVkZjV05DbkhHclF5aHlOWEpRY2doR2dIS1ZjalZIQWlBQUFDQUFBQUFBQ0lBQUFBSUNnSW9BQUNBQUNBb0FnSWlBSUJSSWVuT0xjNncrcFhPNFByZytSM1JjZEhGMGhYVEtkQnMvSkhVMlRENTFra3h3ZFo4aEVIYWhUN2hQUkZEOFB3aEE5SGJ6VVBKUUdWRXpVUjUzSDNjZmQwcDNPVUNMZDBaQWxrQWRWRTU0akhqTWVPTkFKbFpXZVpwV3hWYVBlZXQ1TDBGQWVrcDZUM3A4V2FkYXAxcnVlZ0pDcTF2R2U4bDdKMEtBWE5KOG9FTG9mT044QUgyR1gyTjlBVVBIZlFKK1JYNDBReWhpUjJKWlE5bGllbjgrWTVWLytuOEZnTnBrSTJWZ2dLaGxjSUJmTTlWRHNvQURnUXRFUG9HMVdxZG50V2VUTTV3ekFZSUVncDZQYTBTUmdvdUNuWUt6VXJHQ3M0SzlndWFDUEd2bGdoMkRZNE90Z3lPRHZZUG5nMWVFVTRQS2c4eUQzSU0yYkd0dEFnQUFJQ0lxb0FvQUlJQW9BS2dnSUFBQ2dDSUNpZ2dBcWdBQUFBSUFBQ2pWYkN0RjhZVHpoQmFGeW5Oa2hTeHZYVVZoUmJGdjBuQnJSVkNHWElabmhtbUdxWWFJaGc2SDRvWjVoeWlIYTRlR2g5ZEY0WWNCaVBsRllJaGppR2QyMTRqZWlEVkcrb2k3Tks1NFpubStSc2RHb0lydGlvcUxWWXlvZkt1TXdZd2JqWGVOTDM4RUNNdU52STN3amQ0STFJNDRqOUtGN1lXVWtQR1FFWkV1aHh1Uk9KTFhrdGlTZkpMNWt4V1Urb3VMbFpWSnQ1VjNqZVpKdzVheVhTT1hSWkVha201S2Rrcmdsd3FVc2txV2xBdVlDNWdwbUxhVjRwZ3pTeW1acDVuQ21mNlp6a3N3bXhLYlFKejluTTVNN1V4bm5jNmcrRXdGb1E2aWthSzdubFpOK1o3K25nV2ZENThXbnp1ZkFLWUNpS0FBQUFBQWdBQW9BQWlnZ0tDQUFJQ0FBQXFJZ0FDQUFDQXFBSUFBUkNBVklnQkJzTW9EQzFGTkF3Q1hCU0RHQlFEbkJnQkZCd0RpQ0FCVENRRE5DeUE0RGdCekR5QmRFeUJnR2lDcUd3RDBIQUQrSFNCL0xTRHdwZ0N5cWdEK0FRR3JEZ0Z6RVNGd0V3RzRGZ0dhR2dHZnZBRWk0QUZMNlFFQVFaRExBd3ZUQnJMUDFBRG9BOXdBNkFEWUJOd0J5Z1BjQWNvSzNBUUJBOXpIQVBEQUF0ekNBZHlBd2dQY3dBRG9BZHpBUWVrQTZrSHBBT29BNmN5dzRzU3cyQURjd3dEY3dnRGVBTnpGQmR6QkFOekJBTjRBNU1CSkNrTVRnQUFYZ0VFWWdNQUEzSUFBRXJBWHgwSWVyMGNid1FIY3hBRGN3UURjandBanNEVEdnY01BM01DQndZQUEzTUVBM0tJQUpKM0FBTnpCQU56QkF0ekFBZHpBQU56Q0FOekFBTnpBQU56QUFOekJzRy9HQU56QWlBRGNsOE9BeUlEQ2dNU3FBdHl3UmdEY3pZQUEzTUVBM01FQTNNSUMzRUlid2dEY3dRSGN4TEFMQUFlUEFBbUN3QURjd2JBMkFBZVBBQW12d0xBTUFBZVBBQW13UFFBSGp3QUpzRDBBQjQ4QUNiQk9BQW13VGdBSmhnQlVBRnV3TkFBSGp3QUpzRHdCQ1k4QUNiQkxBQW13UEFGbkFBbU1BMnV3T3dGMkFBbU1BM3F3R3dIY21nRGNnQURjZ0FEWXNBWkJnWUFBaElRRGdvRUFnb0RCQUFtQXdiQU5BTnl3UHdBSGdBRUpzQ0VBM0xLZXdyT0RBQW1lQUFtd2JBQUppY0N3bWdEa3NGNEEzc0FBM0xDcXdBRGNzQllBQ1pQSGdRRGNyOFFGM01FQTNJQUIzTEJDQUFlT0FBbWx3QURjeHJBRkFRbXdDUUFIaWdFSnNCSUFCN0Jud2tFQUJOekJBOXpBUVFBRkFZTUEzSVhBZ3NHd2xjRUEzTVlBM01FQTZnRFdBTndBeXVRQTZBSGtBTnlBd0FEcEFOekFBTnl5bjhFQkFjTUNBY0dEd0lJQkFjQUEzTUFCQVFQY3dMZ0R6Y0t3WEFBSnNDL2ZzZmtBMmdEa0FPZ0EzZ0hnc0RnQkNMaHRvOENEeVovQnNCL0JzT01BQ2FRQUNiQm1BQW1hMGJBSUF0eWtBQW13TGdBSGl3QUpzTDdBZ01FQTNJSEJoTUdBd0xBREFBbXd4UUFKdUViL0FCcXkwTVlHM01Hem5BRGNzTEVBM0xCa3hMWmhBTnlBd0tmQUFBRUEzSU1BQ2JCMHdBRGNzZ3pEc1ZMQnNHZ0IzTUlBM01BRDNMREVBQW13QndBSnNBZ0FDUUFIc0JUQ3J3RUpzQTBBQjdBYkFBbUlBQWV3T1FBSkFBZXdnUUFIQUFtd0h3RUhqd0FKbDhhQ3hMQ2NBQW1DQUFlV3dMQXlBQWtBQjdES0FBa0FCN0JOQUFtd1JRQUpBQWV3UWdBSnNOd0FDUUFIc05FQkNZTUFCN0JyQUFtd0lnQUprUUFKc0NBQUNiRjBBQW13MFFBSGdBRUpzQ0FBQ2JoRkp3UUJzQXJHdElnQkJyaEVld0FCdUF5VkFkZ0NBWUlBNGdUWWh3ZmNnY1FCM0ozRHNHUEN1QVdLeG9EUWdjYUF3WURFc05UR3NZVER0YThHM0xBOHhRQUhBRUh3MFFNTDRnNEJTc0JKQWtxQUFvRUNnZ0tEQXNBQ3dnSUFDb1FDUWlTRkFzQUhnQW1DQ1VBa2dDTEVBb0lpaENLR0lzWUN5QUxLQXN3Q2h3S0tJczRDakNLUUlwSWlqaUtJQW9rQ2lnS0NKQUFEQWdNRUE0c0NnQ1FJQTRRSmhnbFlKQUlLQmdPWUlwb2luaUlBQ1FvRG9DSU1BdzREUUFnUUF4SURvaUttSXNBSnBDS29JcW9pakFLTkFvNENRQU5DQTBRRGdBT1BBbzRrd2dlSUNZb0prQ1JHQTZ3aUFBU3dJa0lJc2lJQ0JMUWlRQVJFQkxZaVFnVENJc0FpeENMR0lzZ2lRQW5BQkpFQ3lpTEVCTXdpd2dUUUlzNGlrZ0tUQXBRQ2xRSkFCVUlGQ0FxV0FwUWtSQVhFQjR3SmpnbkFCcElrUkFnSUl3b2pnQVVNSTRRRmtBbVNDUTRqZ2dVU0k0WUZpQVVVSTR3RkZpT1lDWW9GSGlPUUJTQWptZ21PQlNRaklpT1pBcG9DbXdMQUJjSUZ4QVdjQXF3a3hnWElCY1lIbEFtV0NRQUhxaVFtSThvRktpTW9JMEFqUWlORUkwWWp6QVZLSTBnalRDTk9JMUFqdUNTZEFzNEZ2aVFNQ2xJakFBYThKTG9rUUFaVUkwSUdSQVpXSTFnam9BS2hBcUlDb3dMQkFzTUNBUXFrQWtNa3BRTEJCNEVKZ3dsQkpJRWl4UUtESW9VaWh5TEhBc2tDeXdMTkFxY0NpeUxQQW8waWtTS1RJbzhpcUFLcEFxb0NneVFCQXdNREJRT3JBb0VrQ1FPRkNZY0pXU1FEQ2djRG1TS2JJcDhpQVFrTEE2RWlEUU1QQTBFSUVRTVRBNk1pcHlMQkNhVWlxU0tySW9BanJBS3RBcTRDUVFOREEwVURyd0tQSk1NSGlRbUxDWkVrUndPdElnRUVoQWl4SWtNSXN5SURCTFVpUVFSRkJMY2lRd1RESXNFaXhTTEhJc2tpUVFuQkJMRUN5eUxGQk0waXd3VFJJczhpc2dLekFyUUN0UUpCQlVNRkNRcTJBcFVrUlFYRkI0MEpqd25CQnBNa1JRZ0pJd3NqZ1FVTkk0VUZrUW1UQ1E4amd3VVRJNGNGaVFVVkk0MEZGeU9aQ1lzRkh5T0JJNUVGSVNPYkNZOEZKU01qSTdrQ3VnSzdBc0VGd3dYRkJid0NyU1RIQmNrRnh3ZVZDWmNKQVFlckpDY2p5d1VySXlralFTTkRJMFVqUnlQTkJVc2pTU09DSTAwalR5TlJJN2trdlFMUEJiOGtEUXBUSTc4Q3ZTU0RJN3NrUVFaVkkwTUdSUVpYSTFrakFUR0FEQUF1UmlSRUpFb2tTQ1FBQ0VJSlJBa0VDSWdpaGlTRUpJb2tpQ1N1SXBna2xpU2NKSm9rQUNNR0NnSWpCQXBHQ2M0SHlnZklCOHdIUnlSRkpFc2tTU1FCQ0VNSlJRa0ZDSWtpaHlTRkpJc2tpU1N2SXBra2x5U2RKSnNrQVNNSENnTWpCUXBIQ2M4SHl3ZkpCODBIVUNST0pGUWtVaVJSSkU4a1ZTUlRKSlFpbGlLVklwY2lCQ01HSXdVakJ5TVlJeGtqR2lNYkl5d2pMU011SXk4akFDU2lKS0FrcGlTa0pLZ2tveVNoSktja3BTU3BKTEFrcmlTMEpMSWt0aVN4Sks4a3RTU3pKTGNrZ2dpQUNJRUlBZ2dEQ0p3aW5TSUtDZ3NLZ3doQUM0b3NnUXlKTElnc1FDVkJKUUF0Qnk0QURVQW1RU2FBTGdFTnlDYkpKZ0F2aEM4Q0RZTXZnaTlBRGRnbTJTYUdNUVFOUUNkQkp3QXhoakFHRFlVd2hEQkJEVUFvQURJSERVOG9VQ2lBTW9Rc0F5NVhLRUlOZ1N5QUxNQWt3U1NHTElNc3dDaEREY0Fsd1NWQUtVUU53Q2JCSmdVdUFpN0FLVVVOQlM4RUw0QU4wQ2JSSm9BdlFDcUNEZUFtNFNhQU1JRXd3Q3FERFFRd0F6Q0JEY0Fud1NlQ01FQXJoQTFIS0Vnb2hER0JNUVl2Q0EyQkx3VXdSZzJETUlJeEFBNEJEa0FQZ0JHQ0VRTVBBQS9BRVFFUFFCRUNFZ1FTZ1E5QUVzQVBRaEtBRDBRU2hCS0NENFlTaUJLS0VzQVNnaEtCRVlNUlF4QkFFTUVSUVJCQkVRTVNCUkxCRUVFU0FCQkRFc0FRUlJLRkVzSVFoeEtKRW9zU3dSS0RFb0FRQUJFQkVRQVNBUktBRW9FU1FCTkJFME1UUWhORUU4SVRBQlRBRTBBVWdCVEFGRUFWUVJWQUZ3QVhRUmZBRndBWUFoZ0JHRUFZZ0JnQUdjQVl3UmdCR1VBWlFobEJHWUFad0JuQ0djRVpnQnpBSE1BZGdCOEFJQUlnQkNBR0lBZ2dRQ0NBSUlJZ3dDREJJQUFodUNLNUloQWpFU01jSXgwalRDUldKRTBrVnlTTUpJMGtuaVNmSkFBbEFpVUVKY0FyQVNVREpRVWx3U3ZDSzhNcnhDdkZLOFlyeHl1QUpZSWxoQ1hJSzRFbGd5V0ZKY2tyeWl2TEs4d3J6U3ZPSzg4ckFDWUNKZ0VtQXlhQUpvSW1nU2FESnNJbXhDYkdKZ0Fzd3liRkpzY21BU3dDTEFNc0JDd0ZMQVlzQnl6S0pzd216aVlJTE1zbXpTYlBKZ2tzQ2l3TExBd3NEU3dPTEE4czBpYlVKdFltMHliVkp0Y20yaWJjSnQ0bTJ5YmRKdDhtQUNjQ0p3RW5BeWVBSjRJbmdTZURKd0FvQWlnRUtBRW9BeWdGS0VJb1JDaEdLRWtvU3loTktFQXNTaWhNS0U0b1FTeENMRU1zUkN4RkxFWXNSeXhSS0ZNb1ZTaElMRklvVkNoV0tFa3NTaXhMTEV3c1RTeE9MRThzZ2l3QkxvQXhoeXdCTHdJdkF5OEdMb1V4QURBQk1BSXdRRVpCUm9CR3dFYkNSc0ZHQUVkQVI0Qkh3RWZDUndCSlFFbUFTWUpKQUVyQ1NRTktCRXBBU2tGS2dFcUJTc0JLd1VyQVM4RkxBRXNCUzBCTFFVdkNTOE5MZ0V1QlM0SkxnMHNBVEFGTUFrd0RUQUJXUUZSQ1ZFUlVSbFJJVkVwVVRGUk9WRkJVVWxSVVZGWlVnRlNDVklSVXdGVEJWQUJWQVZWQVZVRlZnRldCVmNCVndWV0FWc0JZQUZjQ1Z3UlhCbGNJVndwWERGY09WeEJYRWxjVVZ4WlhRRmRDVjBSWGdGZUJWOEJYd1ZjQVdBRllRRmhCV0lCWWdWZ0FXUUZaQWxrRFdVQlpnSTZDanNDT0FJOEJqMENQUVkrQmo0Q1BnNC9BajhHUEFKQUFRZURnQXd1bUgvb1lGMVlOVmhJVEZnd1dFVGJwQWpaTU51RVNFaFlURGhBTzRoSVNEQk1NK2hrWEZtMFBGZzRQQlJRTUd3OE9Ed3dyRGdJMkRnc0ZGVXNXNFE4TXdlSVFET0lBL3pBQy93Z0MveWUvSWlFQ1gxOGhJbUVDSVFKQlFpRUNJUUtmZndKZlh5RUNYejhDQlQ4aVpRRURBZ0VEQWdFREF2OElBdjhLQWdFREFsOGhBdjh5b2lFQ0lTSmZRUUwvQU9JOEJlSVQ1QXB1NUFUdUJvVE9CQTRFN2dubWFIOEVEajhnQkVJV0FXQXVBUlpCQUFFQUlRTGhDUURoQWVJYlB3SkJRdjhRWWo4TVh6OEM0U3ZpS1A4YUQ0WW8veS8vQmdML1dBRGhIaUFFdHVJaEZoRWdMdzBBNWlVUkJoWW1GaVlXQnVBQTVSTmdaVGJnQTd0TU5nMDJMK1lERmhzQU51VVlCT1VDNWczcEFuWWxCdVZiRmdYR0d3K21KQ1lQWmlYcEFrVXZCZllHQUJzRkJ1VVc1aE1nNVZIbUF3WGdCdWtDNVJubUFTUVBWZ1FnQmkzbERtWUU1Z0VFUmdTR0lQWUhBT1VSUmlBV0FPVUQ0QzNsRFFEbEN1QUQ1Z2NiNWhnSDVTNEdCd1lGUitZQVp3WW5CY2JsQWlZMjZRSVdCT1VIQmljQTVRQWdKU0RsRGdERkFBVkFaU0FHQlVkbUlDY2dKd1lGNEFBSFlDVUFSU1lnNlFJbExhc1BEUVVXQmlBbUJ3Q2xZQ1VnNVE0QXhRQWxBQ1VBSlNBR0FFY21ZQ1lnUmtBR3dHVUFCY0RwQWlaRkJoYmdBaVlIQU9VQkFFVUE1UTRBeFFBbEFJVWdCZ1ZIaGdBbUJ3QW5CaUFGNEFjbEppRHBBaFlOd0FXbUFBWW5BT1VBSUNVZzVRNEF4UUFsQUlVZ0JnVUhCZ2RtSUNjZ0p3YkFKZ2RnSlFCRkppRHBBZzhGcStBQ0JnVUFwVUJGQUdWQUpRQUZBQ1ZBSlVCRlFPVUVZQ2NHSjBCSEFFY0dJQVdnQitBRzZRSkxydzBQZ0FaSEJ1VUFBRVVBNVE4QTVRaEFCVVpuQUVZQVpzQW1BRVdBSlNZZzZRTEFGc3NQQlFZbkZ1VUFBRVVBNVE4QTVRSUFoU0FHQlFjR2h3QUdKd0FuSnNBbndBVUFKU1lnNlFJQUplQUZKaWZsQVFCRkFPVWhKZ1ZIWmdCSEFFY0dCUTlnUlFmTFJTWWc2UUxyQVErbEFBWW5BT1VLUU9VUUFPVUJBQVVneFVBR1lFZEdBQVlBNXdDZzZRSWdKeGJnQk9Vb0JpWEdZQTJsQk9ZQUZ1a0NOdUFkSlFBRkFJVUE1UkFBQlFEbEFnWWw1Z0VGSUlVQUJBQ21JT2tDSUdYZ0dBVlA5Z2NQRms4bXIra0M2d0lQQmc4R0R3WVNFeElUSitVQUFPVWNZT1lHQjRZV0pvWG1Bd0RtSEFEdkFBYXZBQytXYnpiZ0hlVWpKMllIcGdjbUp5WUY2UUsycFNjbVpVWUZSeVhIUldibEJRWW5KcWNHQlFmcEFrY0dMK0VlQUFHQUFTRGlJeFlFUXVXQXdRQmxJTVVBQlFCbElPVWhBR1VnNVJrQVpTREZBQVVBWlNEbEJ3RGxNUUJsSU9VN0lFYjJBZXNNUU9VSTd3S2c0VTRnb2lBUjVZSGtEeGJsQ1JmbEVoSVRRT1ZEVmtybEFNRGxCUUJsUnVBRDVRcEdOdUFCNVFvbTRBVGxCUUJGQUNiZ0JPVXNKZ2ZHNXdBR0orWURWZ1JXRFFVR0lPa0NvT3NDb0xZUmRrWWJBT2tDb09VYkJPVXR3SVVtNVJvR0JZRGxQdUFDNVJjQVJtY21SMkFuQnFkR1lBOUFOdWtDNVJZZ2hlQUQ1U1JnNVJLZzZRSUxRTzhhNVE4bUp3WWdOdVV0QndZSHhnQUdCd1luNWdDbjVnSWdCdWtDb09rQ29OWUV0aURtQmdnbTREZG1CK1VuQmdlR0J3YUhCaWZGWU9rQzF1OEM1Z0h2QVVBbUIrVVdCMlluSmdkR0pla0M1U1FHQnlaSEJnZEdKK0FBZHVVYzV3RG1BQ2NtUUpicEFrQkY2UUxsRnFRMjRnSEE0U01nUWZZQTRBQkdGdVlGQjhabEJxVUdKUWNtQllEaUpPUTM0Z1VFNGhya0hlWXlBSWIvZ0E3aUFQOWE0Z0RoQUtJZ29TRGlBT0VBNGdEaEFLSWdvU0RpQUFBQkFBRUFBUUEvd3VFQTRnWWc0Z0RqQU9JQTR3RGlBT01BZ2dBaVlRTU9BazVDQUNKaEEwNWlJQ0poQUU3aUFJRk9JRUlBSW1FRExnRDNBNXV4TmhRVkVqUVZFaFQyQUJnWm14ZjJBUlFWZGpCV0RCSVQ5Z01NRmhEMkFoZWJBUHNDQ3dRZ3Ewd1NFd1RyQWt3U0V3RGtCVUR0R09BSTVnVm9Ca2ptQk9BSEx3RnZBUzhDUVNKQkFnOEJMd3lCcndFUEFROEJEMkVQQW1FQ1pRSXZJaUdNUDBJUERDOENEK3NJNmhzL2Fnc3ZZSXlQTEc4TUx3d3ZETThNN3hjc0x3d1BETzhYN0lDRTd3QVNFeElUN3d3c3p4SVQ3MGtNN3hic0VlOGdyTzg5NEJIdkErQU42elR2UnVzTzc0QXZETzhCRE84dTdBRHZad3p2Z0hBU0V4SVRFaE1TRXhJVEVoTVNFK3NXN3lTTUVoUHNGeElURWhNU0V4SVRFaFBzQ08rQWVPeDdFaE1TRXhJVEVoTVNFeElURWhNU0V4SVRFaE1TRSt3M0VoTVNFK3dZRWhQc2dIcnZLT3dOTDZ6dkh5RHZHQUR2WWVFbkFPSW5BRjhoSXQ5QkFqOENQNElrUVFML1dnS3ZmMFkvZ0hZTE51SWVBQUtBQWlEbE1NQUVGdUFHQnVVUDRBSEZBTVVBeFFERkFNVUF4UURGQU1VQTVoZzJGQlVVRlZZVUZSWVVGZllCRVRZUkZoUVZOaFFWRWhNU0V4SVRFaE9XQlBZQ01YWVJGaEwyQlM4VzRDWHZFZ0R2VWVBRTc0Qk80Qkx2QkdBWFZnOEVCUW9TRXhJVEVoTVNFeElUTHhJVEVoTVNFeElURVJJekQrb0JaaWNSaEM5S0JBVVdMd0RsVGlBbUxpUUZFZVZTRmtRRmdPVWpBT1ZXQUM5cjd3TGxHTzhjNEFUbENPOFhBT3NDN3hickFBL3JCKzhZNndMdkgrc0g3NEM0NVprNDd6amx3QkYxUU9VTkJPV0Q3MER2TCtBQjVTQ2tOdVdBaEFSVzVRanBBaVhnRFA4bUJRWklGdVlDRmdUL0ZDUW01VDdxQWlhMjRBRHVEK1FCTHY4R0l2ODJCT0lBbi84Q0JDNS9CWDhpL3cxaEFvRUMvd0lnWDBFQ1ArQWlQd1VrQXNVR1JRWmxCdVVQSnlZSGJ3WkFxeThORDZEbExIYmdBQ2ZsS3VjSUp1QUFOdWtDb09ZS3BWWUZGaVVHNlFMbEZPWUFOdVVQNWdNbjRBTVc1UlZBUmdmbEp3WW5aaWNtUi9ZRkFBVHBBbUEyaFFZRTVRSHBBb1VBNVNHbUp5WW5KdUFCUlFibEFBWUhJT2tDSUhibENBU2xUd1VIQmdmbEtnWUZSaVVtaFNZRkJnWGdFQ1VFTnVVREJ5WW5OZ1VrQndiZ0FxVWdwU0NsNEFIRkFNVUE0aU1PWk9JQkJDNWc0a2psR3ljR0p3WW5GZ2NHSU9rQ29PV3JIT0FFNVE5ZzVTbGcvSWQ0L1poNDVZRG1JT1ZpNEI3QzRBU0NnQVVHNVFJTTVRVUFoUUFGQUNVQUpRRGxaTzRJNEFubGdPTVRFdUFJNVRnZzVTN2dJT1VFRFE4ZzVnaldFaE1Xb09ZSUZqRXdFaE1TRXhJVEVoTVNFeElURWhNU0V6WVNFM1pRVmdCMkVSSVRFaE1TRTFZTUVVd0FGZzAyWUlVQTVYOGdHd0JXRFZZU0V4WU1GaEUyNlFJMlREYmhFaElXRXc0UUR1SVNFZ3dUREJJVEZoSVROdVVDQk9VbEpPVVhRS1VncFNDbElFVkFMUXdPRHkwQUQyd3Y0QUpiTHlEbEJBRGxFZ0RsQ3dBbEFPVUhJT1VHNEJybGM0QldZT3NsUU84QjZpMXI3d2tyVHdEdkJVQVA0Q2Z2SlFiZ2V1VVZRT1VwNEFjRzZ4Tmc1UmhyNEFIbERBcmxBQXFBNVI2R2dPVVdBQmJsSEdEbEFCYUs0Q0xoSU9JZzVVWWc2UUtnNFJ4ZzRoeGc1U0RnQU9VczRBTVc0SUFJNVlDdjRBSGxEdUFDNVFEZ2dCQ2xJQVVBNVNRQUpVQUZJT1VQQUJickFPVVBMOHZsRitBQTZ3SGdLT1VMQUNXQWkrVU9xMEFXNVJLQUZ1QTQ1VEJnS3lYckNDRHJKZ1ZHQUNhQVptVUFSUURsRlNCR1lBYnJBY0QyQWNEbEZTc1c1UlZMNEJqbEFBL2xGQ1pnaTliZ0FlVXVRTmJsRGlEckFPVUxnT3NBNVFyQWR1QUV5K0JJNVVIZ0wrRXI0QVhpSzhDcjVSeG00QURwQXVDQW51c1hBT1VpQUNZUklDWGdSdVVWNndJRjRBRGxEdVlEYTViZ1R1VU55K0FNNVEvZ0FRY0dCK1V0NWdmV1lPc002UUxnQjBZSDVTVkhaaWNtTmh0MjRBTWJJT1VSd09rQ29FYmxISVlINWdBQTZRSjJCU2NGNEFEbEd3WTJCZUFCSmdmbEtFZm1BU2RsZG1ZV0J3YnBBZ1VXQlZZQTZ3emdBK1VLQU9VUlIwWW5CZ2NtdGdiZ09jVUFCUUJsQU9VSEFPVUNGcURsSndaSDVnQ0E2UUtnSmljQTVRQWdKU0RsRGdERkFDVUFoUUFtQlNjR1p5QW5JRWNnQmFBSGdJVW5JTVpBaHVDQUErVXRSK1lBSjBZSEJtV1c2UUkyQUJZR1JlQVc1U2hIcGdjR1p5WUhKaVVXQmVBQTZRTGdnQjdsSjBkbUlHY21CeWIyRDJVbTRCcmxLRWZtQUNjR0J5WldCZUFENlFLZzlnWGdDK1VqQmdjR0o2WUhCZ1hBNlFMZ0x1VVRJRVluWmdlR1lPa0NLMVlQNElBNDVTUkg1Z0VISmhiZ1hPRVk0aGpwQXVzQjRBVGxBQ0FGSU9VQUFDVUE1UkNuQUNjZ0pnY0dCUWNGQndaVzRBSHBBdUErNVFBZzVSOUhaaUFtWndZRkZnVUg0Qk1GNWdMbElLWUhCV2IyQUFiZ0FBV21KMGJsSnVZRkJ5WldCWmJnRmVVeDRJQi81UUVBNVIwSHhnQ21Cd1lGbHVBQzZRTHJDMEEyNVJZZzVnNEFCOFlISmdjbTRFSEZBQ1VBNVI2bVFBWUFKZ0RHQlFiZ0FPa0NvS1VBSlFEbEdJY0FKZ0FuQmdjR0JjRHBBdUNBcnVVTEppYzI0SUF2QmVBSDZ3M3ZBRzN2Q2VBRkZ1V0RFdUJlNm1jQWx1QUQ1WUE4NElvMDVZT25BUHNCNEk4LzVZRy80S0V4NVlHeHdPVVhBT2tDWURiZ1dPVVdJSVlXNEFMbEtNYVdiMlFXRCtBQzZRSUF5d0RsRFlEbEMrQ0NLT0VZNGhqckQzYmdYZVZEWUFZRjV5L0FadVFGNERna0ZnUUc0QU1uNEFibGwzRGdBT1dFVHVBaTVRSGdvbS9sZ0pmZ0tVWGdDV1hnQU9XQkJPQ0lmT1ZqZ09VRlFPVUJ3T1VDSUE4bUZudmdrdFR2Z0c3Z0F1OGZJTzgwSjBaUHAvc0E1Z0F2eHU4V1p1OHo0QS92T2tZUDRJQVM2d3pnQk85UDRBSHJFZUIvNFJMaUV1RVN3Z0RpQ3VFUzRoSUJBQ0VnQVNBaElHRUE0UUJpQUFJQXdnRGlBK0VTNGhJaEFHRWc0UUFBd1FEaUVpRUFZUUNCQUFGQXdRRGlFdUVTNGhMaEV1SVM0UkxpRXVFUzRoTGhFdUlTNFJMaUZDRGhFUXppRVF5aTRSRU00aEVNb3VFUkRPSVJES0xoRVF6aUVReWk0UkVNNGhFTW9qOGc2U3J2Z1hqbUwyL21LdThBQnU4R0JpK1c0QWVHQU9ZSDRJVEl4Z0RtQ1NER0FDWUFodUNBVGVVbFFNYkVJT2tDWUFVUDRJRG81U1JtNlFLQURlQ0VlT1dBUFNEckFjYmdJZUVhNGhyR0JHRHBBbUEyNElLSjZ6TVBTdzFyNEVUckpRL3JCK0NBT21VQTVSTUFKUUFGSUFVQTVRSUFaUUFGQUFXZ0JXQUZBQVVBQlFCRkFDVUFCU0FGQUFVQUJRQUZBQVVBSlFBRklHVUF4UUJsQUdVQUJRRGxBZ0RsQ1lCRkFJVUE1UW5nTEN6Z2dJYnZKR0R2WE9BRTd3Y2c3d2NBN3djQTd4M2dBdXNGNzRBWjRERHZGZUFGN3lSZzd3SEFMK0FHcitDQUV1K0FjNDd2Z2xEZ0FPOEZRTzhGUU85czRBVHZVY0R2Qk9BTTd3Umc3ekRnQU84Q29POGc0QUR2RmlBdjRFYnZjUUR2U2dEdmYrQUU3d1lnajBCUGdNL2dBZThSd00vZ0FVL2dCYy9nSWUrQUN3RHZMK0FkNlFMZ2czN2x3R1pXNEJybGo2M2dBK1dBVmlEbGxmcmdCdVdjcWVDTGwrV0JsdUNGV3VXU3crREtyQzRiNEJiN1dPQjQ1b0JvNE1DOWlQM0F2M1lnL2NDL2RpQUFBUFVyQUFCNkZBQUEvQVVBQUFBQUFBQ0FBQUVBb0FBQkFIQUJBUUFRQXdFQVF3TUJBR0FEQVFDd0F3RUEwQU1CQU5zREFRRHdBd0VBSUpFQUFCQUVBUUF3QkFFQVVBUUJBSEFFQVFDZ0JBRUFXUVlCQUY0R0FRQndCZ0VBc0FZQkFOQUdBUUJBQ0FFQW1RZ0JBS1VJQVFDcUNBRUFzQWdCQVBJSUFRRDJDQUVBRUFrQkFHQUpBUUNhQ1FFQXNBa0JBTThKQVFEWUNRRUE0QWtCQUtBS0FRRHdDZ0VBOEFzQkFCb01BUUF3REFFQVVBd0JBQUFOQVFEd0RRRUFEQTRCQUJBT0FRQmdEZ0VBOEE0QkFKQVBBUUNRakFBQWdJa0FRWkNBQkF0a0hBRElBSnNCTXdBUEFFRUFJQUFMQUF3QUVRQnlBaDhBRndBV0FDRUF1UUVGQUFvQU5RQVhBR1lCV1FBTUFBVUFCQUJDQUFRQUR3QkhBRG9BQ3dBZkFBa0FCQUM4QUVjQThRQXFBQXdBRmdDckFPNEFIQUFFQUVJQWtBQ2NBRE1BRlFTMEFnQkJnSUVFQzlJRnJJRCtnRVRiZ0ZKNmdFZ0lnVTRFZ0VMaWdHRE5ab0JBcUlEV2dBQUFBQURkZ0VOd0VZQ1pDWUZjSDRDYWdvcUFuNE9YZ1kyQndJd1lFUnlSQXdHSkFCUW9FUWtDQlJNa3lpRVlDQWdBSVFzTGtRa0FCZ0FwUVNHRFFLY0lnSmVBa0lCQnZJR0xpQ1FoQ1JTTkFBR0ZsNEc0QUlDY2c0aUJRVldCbm9sQmtwVytnNStCWU5SaUFBT0FRTklBZ0dEVXdOU0F4Z0VJQ1F1QWl3QUdnTUFERHdhQW13TUVBQmFBUVZPQm1JQ1lnSjZBbUlDZWdKaUFub0NZZ0o2QW1BZUJzVlgvR0pvQkFBaUFpUU1BQUNnWUFBQUNBUUFJQUFBQUFBRUFDd1lEQXdDQWlZQ1FJZ1NBa0FBQUFBQUFBQUFBUTBTQVFtbU5BQUVCQU1lS3I0d0dqNERrTXhrTGdLS0FuWS9saXVRS2lBSURRS2FMRm9XVHRRbU9BU0tKZ1p5Q3VURUpnWW1BaVlHY2dya2pDUXVBblFxQWlvSzVPQkNCbElHVkU0SzVNUW1CaUlHSmdaMkF1aUlRZ29tQXA0TzVNQkFYZ1lxQm5JSzVNQkFYZ1lxQm00TzVNQkNDaVlDSmdaeUN5aWdBaDVHQnZBR0drWURpQVNpQmo0QkFvcENLaW9DajdZc0FDNVliRUJFeWc0eUxBSW1EUm5PQm5ZR2RnWjJCd1pKQXU0R2hnUFdMZzRoQTNZUzRpWUdUeVlHK2hLK091NEtkaUFtNGlyR1NRYStOUnNDelNQV2ZZSGh6aDZHQlFXRUhnSmFFMTRHeGp3QzRnS1dFbTR1c2c2K0xwSURDallzSGdheUNzUUFSRElDckpJQkE3SWRnVHpLQVNGYUVSb1VRRElOREU0TkJnb0ZCVW9LMGpidUFySWpHZ3FPTGtZRzRncStNallIYmlBZ29RSitKbG9PNU1RbUJpWUNKZ1VEUWpBTHBrVURzTVlhY2dkR09BT21LNW8xQkFJeEE5aWdKQ2dDQVFJMHhLNENiaWFrZ2c1R0tyWTFCbGppRzBwV0FqZmtxQUFnUUFvREJJQWlEUVZ1RFlGQlhBTFl6M0lGZ1RLdUFZQ05nTUpBT0FRUkpHNEJINTVtRm1ZV1pBQUFBQUFCQXFZQ09nRUgwaURHZGhOK0FzNEJac0w2TWdLR2tRckNBaklDUGpFRFNqME5QbVVlUmdXQjZIWUZBMFlCQWhvRkRZWU5nSVYrUFEwV1pZY3hmbVlXWmhaa0FRZUNHQkF0QlNiMkFsNEJCWllDWGdPV0FsNEJBNllDUmdlYUFsNEQyZ0k2QVRWU0FSTldBVUNDQllNOXRnVk9kZ0plQVFWZUFpNEJBOElCRGY0Qmd1RE1IaEd3dXJOOEFRYkNIQkFzM1EwNkFUZzZCUmxLQlNLNkFVUDJBWU00NmdNNkliUUFHQUozZi8wRHZUZzlZaElGSWtJQ1VnRTlyZ1VDMmdFTE9nRS9naUVabmdBQkI4SWNFQ3hGRi80VkExb0N3Z0VIUmdHRUgyWUNPZ0FCQmtJZ0VDemREZVlCS3Q0RCtnR0FoNW9GZ3k4Q0ZRWldCOHdBQUFBQUFBQUNBUVI2QkFFTjVnR0F0SDRGZ3k4Q0ZRWldCOHdBQUFBQUFBQUNBQUVIUWlBUUxGa0hEQ0FpQnBJRk8zS29LVG9jL1A0ZUxnSTZBcm9BQVFmQ0lCQXNoUU42QXo0Q1hnRVE4Z0ZrUmdFRGtQeitIaVJFRkFoR0FxUkdBWU5zSGhvdUVBRUdnaVFRTGhRUkFud1lBQVFBQkVoQ0NuNERQQVlDTEI0RDdBUUdBcFlCQXU0aWVLWVRhQ0lHSmdLTUVBZ1FJZ01tQ25JQkJrNEJBazREWGcwTGVoL3NJZ05JQmdLRVJnRUQ4Z1VMVWdQNkFwNEd0Z0xXQWlBTURBNENMZ0lnQUpvQ1FnSWdEQXdPQWk0QkJRWURoZ1VaU2dkU0RSUndRaW9DUmdKdU1nS0drUU5tQVFOVUFBQUFBQUFBQlB6K0hpUkVFQUNrRUVvQ0lFb0NJRVJFRUNJOEFJSXNTS2dnTEFBZUNqQWFTZ1pxQWpJcUExaGdRaWdFTUNnQVFFUUlHQlJ5Rmo0K1BpSUJBb1FpQlFQZUJRVFRWbVpwRklJRG1ndVNBUVo2QlFQQ0FRUzZBMG9DTFFOV3BnTFFBZ3Q4SmdONkFzTjJDamQrZWdLZUhyb0JCZjJCeW00RkEwWUJBaG9GRFlZT0lnR0JObFVFTkNBQ0JpUUFBQ1lMRGdlbWxob3NrQUpjRUFBRUJnT3VnUVdxUnY0RzFwNHlDbVpXVWdZdUFrZ01hQUlCQWhnaUFuNWxBZ3hVTkRRb1dCb0NJWUx5bWcxUzVobzJIdjRWQ1B0U0F4Z0VJQ1F1QWl3QUdnTUFERHdhQW13TUVBQmFBUVZPQlFTT0JzVlgvR0pvQkFBaUFpUU1BQUNnWUFBQUNBUUFJQUFBQUFBRUFDd1lEQXdDQWlZQ1FJZ1NBa0VKRGlvU2VnSitaZ3FLQTdvS01xNE9JTVVtZGlXRDhCVUlkYXdYaFQvK3ZpVFdaaFVZYmdGbndnWm1FdG9NQUFBQUFBQUFBQUt5QVJWdUFzb0JPUUlCRUJJQklDSVc4Z0thQWpvQkJoWUJNQXdHQW5ndUFRZHFBa29EdWdHRE5qNEdrZ0ltQVFLaUFUNTZBQUVHd2pRUUxGMEZJZ0VVb2dFa0NBSUJJS0lGSXhJVkN1SUZ0M05XQUFFSFFqUVFMNWdMZEFJREdCUU1CZ1VIMlFKNEhKWkFMZ0lpQlFQeUVRTkNBdHBDQW1nQUJBRUNGTzRGQWhRc0tnc0thMm9xNWlxR0JRTWlidklDUEFvT2JnTW1BajREdGdJK0E3WUNQZ0s2Q3U0Q1BCb0QyZ1A2QTdZQ1BnT3lCajREN2dQc29nT3FBaklUS2dab0FBQU9Cd1JDQnZZRHZBSUduQzRTWU1JQ0pnVUxBZ2tSb2lvaUFRVnFDUVRnNWdLK045WUNPZ0tXSXRZRkFpWUcvaGRHWUdDZ0tzYjdZaTZRaWdrRzhBSUtLZ295Q2pJS01nVXp2Z2tFOGdFSDVoZWlEM29CZ2RYR0Fpd2lBbTRIUmdZMmg1WUxzZ1VESmdKcVJ1SU9qZ042QWk0Q2pnRUNVZ3NDRHNvRGpoSWlDLzRGZ1R5K0FRd0NQUVEwQWdLNkFySUhDZ0VMN2dFZ0RnVUk2aFVJZGlrRm5nZmVCdllETGdJaUM1NEZBc1lIUWdJK0FsektFUU13Q2dQcUJRUHFCL1lEMWdmS0FRUXlCUVFFTGdFQ2JnTktBa1lEUWdFR2tnRUVCQUlIUWdHQk5WNFM2aGtSWGtNK0JZR0YwRWk4NWhwMkRUNEdHUWJTRFJkK0c3QkNDQUVIQWtBUUx4UUZBdG9CQ0Y0RkRiWUJCdUlCRFdZQkM3NEQrZ0VsQ2dMZUFRbUtBUVkyQXc0QlRpSUNxaE9hQjNJSmdieFdBUmZXQVE4R0FsWUJBaUlEcmdKU0JZRlI2Z0ZQcmdFSm5na1RPZ0dCUXFJRkVtd2lBWUhGWGdVZ0ZncStKTlptRllQNm9pVFdaaFdBdjd3bUhZQy94Z1FBQVlEQUZnWmlJallKRHhGbS92MkJSL0dCWkFrRnRnZWxnZFFtQW1sZjNoMFRWcVloZ0pHWkJpMkJOQTJDbTNhRlFOSXBBM1lGV2dZMWRNRXdlUWgxRjRWTktZQ0FMZ1U0L2hQcUVTdThSZ0dDUStRa0FnUUJCa0pJRUMwZGcvYytmUWcyQllQLzlnV0QvL1lGZy8vMkJZUC85Z1dELy9ZRmcvLzJCWVAvOWdXRC8vWUZnLy8yQllQLzlnV0QvL1lGZy8vMkJZUC85Z1dELy9ZRmcvLzJCWVAvOWdRQkI0SklFQzBXZ2pvbUdtUmlBbVlPaE1BQUlBQXNEQW9DV2dKNkFYeGVYaDQ2QmtvQ0pRVEJDejBDZlFuV2RSR3RCLy85QmdCT1lqb0JnelF5QlFRU0JpSVNSZ09PQVg0ZUJsNEVBUWJDVEJBdTNBcUVEZ0VDQ2dJNkFYMXVIbUlGT0JvQkJ5SU9NZ21ET0lJTkF2QU9BMllGZ0xuK1pnTmlMUU5WaDhlV1pBQUFBQUtDQWk0Q1BnRVZJZ0VDVGdVQ3pnS3FDUVBXQXZBQUNnVUVrZ1ViamdVTVZBNEZEQklCQXhZRkF5d1NBUVRtQlFXR0RRSzBKZ1VEYWdjQ0JRN3VCaUlKTjQ0Q01nRUhFZ0dCMCs0QkJEWUZBNGdLQVFYMkIxWUhlZ0VDWGdVQ1Nna0NQZ1VENGdHQlNaUUtCUUtpQWk0Q1BnTUNBU3ZPQlJQeUVRT3lCOUlQK2drQ0FEWUNQZ2RjSWdldUFRYUNCUVhRTWp1aUJRUGlDUWdRQWdFRDZnZGFCUWFPQlFyT0JZRXQwZ1VDRWdNQ0Jpb0JEVW9CZ1RnV0FYZWVBQUFBQUFPaUJRTU9BUVJpQW5ZQ3pnSk9BUVQrQTRRQ0FXUWlBc29DTUFvQkFnNEJBbklCQnBJQkExWUZMTVlCaHA2U0JzWUd4Z2JHQnNZR3hnYkdCc1lHeGdiR0JzWUd4Z2JHQkFFSHdsUVFMOFFHZ2dJa0FnSW9LZ0VNOUI0QkNBSUM0Z01lQWpRR0JRTE9BcW9vQVFPcUJ0WTZlZ0VFRWdVVHpnVUNyQTRWQk5vRkRGSWREQklEN2dzYUJRSndTZ0tZWmdVRTVnVUZoZzBDdENJSkEyb1M5Z1VPN2dZaUNUZU9BakFPQWlRQ0JRYkNCWUhUNmdVRU1na0RpaEVGOWdkV0Izb0JBbG9KQWtvTCtnSStCUVBpQVlGSmpFSU5BcUlDSkFJQ0tDb0RBQVlCRU9ZQ3ZnRVNGZ0VER2dFRTFnVUNYaGNPRjJJTkR0NFJBN0lidmcvNkNRSUFOZ0krQjE0VHJnRUdnZ291QlFXVWFqdWlCUVBpQ1FnUUFnRUQ2Z2RZTGdVR2RncXlBUW9TQlJYYUVZRVg0Z1VDRWdNQ0NpWUJEVVlGZ1RnV0FYZWFEQUVId2x3UUxObUF6LzFtL3YyQlIvR0JhRUFnQWdZa0FBQW1DWVFYVllLYmRvVkEwaWtEZGdWYUJqVjB3VkI1VFNsZ0tnbURsOFk5dEF1OUE3d0JCc0pnRUN4YUloSkdBNDRDWmdGWGVnRWwraXB3TWdLNkFUNStBQUVIUW1BUUxnZ1NuZ1pFQWdKc0FnSndBZ0t5QWpvQk9mWU5IWElGSm00R0pnYldCallGQXNJQkF2eG9xQWdvWUdBQURpQ0NBa1NPSUNBQTVuZ3NnaUFtU0lZZ2hDNWVCanp1VERvRkVQSTNKQVJnSUZCd1NqVUdTbFEyQWpUZzFFQndCREJnQ0NZa3BnWXVTQXdnQUNBTWhLcGVCaWdzWUNRdXFENENuSUFBVUloZ1VBRUQvZ0VJQ0dnaUJqUW1KUWQySkQyRE9QQ3lCUUtHQmtRQ0Ftd0NBbkFBQUNJRmcxM2FBdUlDNGdMaUF1SUFBQUFBQUFLSUZCSW51QTRCZmpJQ0xnRURYZ0pXQTJZV09nVUZ1Z1l1QVFLV0FtSW9hUU1hQVFPYUJpWUNJZ0xrWWhJZ0JBUWtEQVFBSkFnSVBGQUFFaTRvSkFBaUFrUUdCa1NnQUNnd0JDNEdLREFrRUNBQ0Jrd3dvR1FNQkFTZ0JBQUFGQWdXQWlZR09BUU1BQXhDQWlvR3Znb2lBallDTmdFRnpnVUhPZ3BLQnNnT0FSTm1BaTRCQ1dBQ0FZYjFwZ0VESmdFQ2ZnWXVCalFHSnlwa0Jsb0NUQVlpVWdVQ3RvWUh2Q1FLQjBncUFRUWFBdm9vb2x6RVBpd0VaQTRHTUNRZUJpQVNDaXhjUkFBTUZBZ1hWcjhVbkNqMFFBUkNCaVVEaWkwRWZyb0NKZ0xHQTBZQ3k3eUlVaG9pWU5vaUNqSVlBQUtJRkJJbGYwb0JBMUlCZzNTcUFZUFBWbVVINmhFV3ZnMndHYTk5aDgvcUVZQ1ljZ0VEYWdJK0RZY3gyZ0xzUkFZTDBDWXFVa2hBYUFqQUFsNEJBeUF1QWxBT0JRSzBTaE5LQWo0S0lnSXFBUWo0QkJ6MkFpSWtLdDRDOENBaUFrQkNNQUVIZ25BUUwrUVJnSXhtQlFNd2FBWUJDQ0lHVWdiR0xxb0NTZ0l3SGdaQU1Ed1NBbEFZSUF3RUdBNEdiZ0tJQUF4Q0F2SUtYZ0kyQVExcUJzZ09BWWNTdGdFREpnRUM5QVluS21RQ1hnSk1CSUlLVWdVQ3RvSXVJZ01XQWxZdXFISXVRRUlMR0FJQkF1b0crakJpWGtZQ1pnWXlBMWRTdnhTZ1NDcElPaUVEaWkwRWZyb0NKZ0xHQTBZQ3k3eUlVaG9pWU5vaUNqSVpBcUFPQVg0eUFpNEJBMTRDVmdObUZqb0ZCYm9HTGdONkF4WUNZaWhwQXhvQkE1b0dKZ0lpQXVSZ29pNER4aWZXQmlnQUFLQkFvaVlHT0FRTUFBeENBaW9Tc2dvaUFqWUNOZ0VGemdVSE9ncEtCc2dPQVJObUFpNEJDV0FDQVliMWxRUCtNZ3A2QXU0V0xnWTBCaVpHNG1vNkpnSk1CaUFPSVFiR0VRVDJIUVFtdi8vT0wxS3FMZzdlSGlZV25oNTNSaTY2QWlZQkJ1RUQvUS8wQUFBQUFRS3lBUXFDQVFzdUFTMEdCUmxLQjFJTkgrNFNaaExDUFVQT0FZTXlhajBEdWdFQ2ZnTTZJWUx5bWcxVE9oMnd1aEUvL0h3OEhBd0VBQUFBQUFBQUFBSUFBQUFBQUNBQUFBQUFCQUFBQUlBQUFBQUFFQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQ0FBQUFBZ0FBQUFJQUFBQUNBQUFBQWdBQUFBSUFBQUFDQUFBQUFnQUFBQUlBQUFBQ0FBQUFBZ0FBQUFJQUFBQUNBQUFBQWdBQUFBSUFBQUFDQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNQUFBQURBQUFBQXdBQUFBTUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCUUFBQUFVQVFlT2hCQXVWQW9BQUFBQUFZRTdDVUtmMDFOUUFBQUJBQUFBQUFOSm9JRGZLNVI0S2pXU0VNWG8rRmJoMU1wZ3R4R2xUbmFxcXFpcXJxcXFxTUNkaEtGUjZhbXFoSm9nbTV2M3pQb01UQUNWRXA4aTZCbWUwSXduSHdJTHhLWmNpN1QzSXN2MS9uaUVyVjYybGlEdkRJS3NwZk5vQUFBQWdBQUFBQUg2MVVCK3poRmlzeGl5eUhtL2lwb29ZNFNFZXNxcGREQ0hOblIza05KaERlRXdrSFdVTmVqYUpCYlFjREQ0WHJGdlpTeHdOSzllb2FOZnFHMHpPK0pocE5KQWI1WElQQlQ5RE94c1ZiN0F1ZFcvckdqajhScHpyT0tBYUYvMDdEbUl3V1JwV2pJMnp3L1FWR3VhaWxTdmNNTllaK2Q1OXpKbVptUm1hbVptWmdPeGZHVEdVWUlwNzdpZ1orU0pQQzg5cTlCZ1k0d2FNUmpMQ0dEMmZDdHdBUVlPa0JBdk9BU0JIQTdneUFBQUFRQ1k4VFVwSEE3aFMvZG5WV1FBQUFHQ09CbkJsSmp4TmF2Q3BzMjVIQTdoeWpnQnFkdjNaMVhsdFB3VjlBQUFBZ045K3pJS09CbkNGcmdYdmh5WThUWXBGM1kyTThLbXpqZ0VGd1pCSEE3aVNUSGlhbEk0QWFwYldDU2lZL2RuVm1ZK1VkSnR0UHdXZHM4YUluZ0FBQUtBM3JXdWgzMzdNb2lNV0k2U09CbkNsQUFBQUFBRUFBQUFLQUFBQVpBQUFBT2dEQUFBUUp3QUFvSVlCQUVCQ0R3Q0FscGdBQU9IMUJRREttanNBQUFBQUFBQUFBSlFBQUFCM0FBQUFXUUFBQURzQUFBQWRBRUhncFFRTG93T0FBSUFBZ1FDQ0FJTUFoQUNGQUlZQWh3Q0lBSWtBaWdDTEFJd0FqUUNPQUk4QWtBQ1FBSkVBa2dDVEFKUUFsUUNXQUpZQWx3Q1lBSmtBbWdDYkFKc0FuQUNkQUo0QW53Q2dBS0FBb1FDaUFLTUFvd0NrQUtVQXBnQ25BS2NBcUFDcEFLb0FxZ0NyQUt3QXJRQ3RBSzRBcndDd0FMQUFzUUN5QUxJQXN3QzBBTFVBdFFDMkFMY0F0d0M0QUxrQXVRQzZBTHNBdXdDOEFMMEF2UUMrQUw4QXdBREFBTUVBd1FEQ0FNTUF3d0RFQU1VQXhRREdBTWNBeHdESUFNa0F5UURLQU1zQXl3RE1BTXdBelFET0FNNEF6d0RRQU5BQTBRRFJBTklBMHdEVEFOUUExQURWQU5ZQTFnRFhBTmNBMkFEWkFOa0EyZ0RhQU5zQTJ3RGNBTjBBM1FEZUFONEEzd0RnQU9BQTRRRGhBT0lBNGdEakFPTUE1QURsQU9VQTVnRG1BT2NBNXdEb0FPZ0E2UURxQU9vQTZ3RHJBT3dBN0FEdEFPMEE3Z0R1QU84QThBRHdBUEVBOFFEeUFQSUE4d0R6QVBRQTlBRDFBUFVBOWdEMkFQY0E5d0Q0QVBnQStRRDVBUG9BK2dEN0FQc0EvQUQ4QVAwQS9RRCtBUDRBL3dBZ0ZCQU5EQXNLQ2drSkNBZ0lDQWdIQndjSEJ3Y0hCZ1lHQmdZR0JnWUdCZ1lHQmdCQmtLa0VDeFFCQUxBeUFRQndNd0VBMERZQkFEQTNBUUJRUGdCQnNLa0VDOEFCTVY5U01qYzc2d1dmMm00a0FWbnlOV2hYTHdJYXVoNEZEdUY3RU9CMDFSem1CamdGbUwvV0xBQUFBQUFBQUFBQW1sVkpCS2xzdWg1R2pzRXVDeFpnQ0FjVE1nMGdFZlVMT0NsbUR6NnJNZ240N2tBdkJRbDJMZ0FBQUFBQUFBQUFUN3RoQldlczNUOFlMVVJVK3lIcFA1djJnZElMYys4L0dDMUVWUHNoK1QvaVpTOGlmeXQ2UEFkY0ZETW1wb0U4dmN2d2VvZ0hjRHdIWEJRekpxYVJQQmd0UkZUN0llay9HQzFFVlBzaDZiL1NJVE4vZk5rQ1FOSWhNMzk4MlFMQUFFSC9xZ1FMNkJXQUdDMUVWUHNoQ1VBWUxVUlUreUVKd0FNQUFBQUVBQUFBQkFBQUFBWUFBQUNEK2FJQVJFNXVBUHdwRlFEUlZ5Y0EzVFQxQUdMYndBQThtWlVBUVpCREFHTlIvZ0M3M3FzQXQySEZBRHB1SkFEU1RVSUFTUWJnQUFucUxnQWNrdEVBNngzK0FDbXhIQURvUHFjQTlUV0NBRVM3TGdDYzZZUUF0Q1p3QUVGK1h3RFdrVGtBVTRNNUFKejBPUUNMWDRRQUtQbTlBUGdmT3dEZS81Y0FENWdGQUJFdjd3QUtXb3NBYlI5dEFNOStOZ0FKeXljQVJrKzNBSjVtUHdBdDZsOEF1aWQxQU9Ycnh3QTllL0VBOXprSEFKSlNpZ0Q3YStvQUg3RmZBQWhkalFBd0ExWUFlL3hHQVBDcmF3QWd2TThBTnZTYUFPT3BIUUJlWVpFQUNCdm1BSVdaWlFDZ0ZGOEFqVUJvQUlEWS93QW5jMDBBQmdZeEFNcFdGUURKcUhNQWUrSmdBR3VNd0FBWnhFY0F6V2ZEQUFubzNBQlpneW9BaTNiRUFLWWNsZ0JFcjkwQUdWZlJBS1UrQlFBRkIvOEFNMzQvQU1JeTZBQ1lUOTRBdTMweUFDWTl3d0FlYSs4QW4vaGVBRFVmT2dCLzhzb0E4WWNkQUh5UUlRQnFKSHdBMVc3NkFEQXRkd0FWTzBNQXRSVEdBTU1ablFDdHhNSUFMRTFCQUF3QVhRQ0dmVVlBNDNFdEFKdkdtZ0F6WWdBQXROSjhBTFNubHdBM1ZkVUExejcyQUtNUUdBQk5kdndBWkowcUFIRFhxd0JqZlBnQWVyQlhBQmNWNXdEQVNWWUFPOWJaQUtlRU9BQWtJOHNBMW9wM0FGcFVJd0FBSDdrQThRb2JBQm5PM3dDZk1mOEFaaDVxQUpsWFlRQ3MrMGNBZm4vWUFDSmx0d0F5NklrQTVyOWdBTy9FelFCc05na0FYVC9VQUJiZTF3QllPOTRBM3B1U0FOSWlLQUFvaHVnQTRsaE5BTWJLTWdBSTR4WUE0SDNMQUJmQVVBRHpIYWNBR09CYkFDNFROQUNERW1JQWcwZ0JBUFdPV3dDdHNIOEFIdW55QUVoS1F3QVFaOU1BcXQzWUFLNWZRZ0JxWWM0QUNpaWtBTk9adEFBR3B2SUFYSGQvQUtQQ2d3QmhQSWdBaW5ONEFLK01XZ0J2MTcwQUxhWmpBUFMveXdDTmdlOEFKc0ZuQUZYS1JRREsyVFlBS0tqU0FNSmhqUUFTeVhjQUJDWVVBQkpHbXdERVdjUUF5TVZFQUUyeWtRQUFGL01BMUVPdEFDbEo1UUQ5MVJBQUFMNzhBQjZVekFCd3p1NEFFejcxQU96eGdBQ3o1OE1BeC9nb0FKTUZsQURCY1Q0QUxnbXpBQXRGOHdDSUVwd0FxeUI3QUM2MW53Qkhrc0lBZXpJdkFBeFZiUUJ5cDVBQWErY2ZBREhMbGdCNUZrb0FRWG5pQVBUZmlRRG9sSmNBNHVhRUFKa3hsd0NJN1dzQVgxODJBTHY5RGdCSW1yUUFaNlJzQUhGeVFnQ05YVElBbnhXNEFMemxDUUNOTVNVQTkzUTVBREFGSEFBTkRBRUFTd2hvQUN6dVdBQkhxcEFBZE9jQ0FMM1dKQUQzZmFZQWJraHlBSjhXN3dDT2xLWUF0SkgyQU5GVFVRRFBDdklBSUpnekFQVkxmZ0N5WTJnQTNUNWZBRUJkQXdDRmlYOEFWVklwQURka3dBQnQyQkFBTWtneUFGdE1kUUJPY2RRQVJWUnVBQXNKd1FBcTlXa0FGR2JWQUNjSG5RQmRCRkFBdER2YkFPcDJ4UUNIK1JjQVNXdDlBQjBudWdDV2FTa0F4c3lzQUswVVZBQ1E0bW9BaU5tSkFDeHlVQUFFcEw0QWR3ZVVBUE13Y0FBQS9DY0E2bkdvQUdiQ1NRQms0RDBBbDkyREFLTS9sd0JEbFAwQURZYU1BREZCM2dDU09aMEEzWENNQUJlMzV3QUkzenNBRlRjckFGeUFvQUJhZ0pNQUVCR1NBQS9vMkFCc2dLOEEyLzlMQURpUUR3QlpHSFlBWXFVVkFHSEx1d0RIaWJrQUVFQzlBTkx5QkFCSmRTY0E2N2IyQU5zaXV3QUtGS29BaVNZdkFHU0RkZ0FKT3pNQURwUWFBRkU2cWdBZG84SUFyKzJ1QUZ3bUVnQnR3azBBTFhxY0FNQldsd0FEUDRNQUNmRDJBQ3RBakFCdE1aa0FPYlFIQUF3Z0ZRRFl3MXNBOVpMRUFNYXRTd0JPeXFVQXB6Zk5BT2FwTmdDcmtwUUEzVUpvQUJsajNnQjJqTzhBYUl0U0FQemJOd0N1b2FzQTN4VXhBQUN1b1FBTSs5b0FaRTFtQU8wRnR3QXBaVEFBVjFhL0FFZi9PZ0JxK2JrQWRiN3pBQ2lUM3dDcmdEQUFab3oyQUFUTEZRRDZJZ1lBMmVRZEFEMnpwQUJYRzQ4QU5zMEpBRTVDNlFBVHZxUUFNeU8xQVBDcUdnQlBaYWdBMHNHbEFBcy9Ed0JiZU0wQUkvbDJBSHVMQkFDSkYzSUF4cVpUQUc5dTRnRHY2d0FBbTBwWUFNVGF0d0NxWnJvQWRzL1BBTkVDSFFDeDhTMEFqSm5CQU1PdGR3Q0dTTm9BOTEyZ0FNYUE5QUNzOEM4QTNleWFBRDljdkFEUTNtMEFrTWNmQUNyYnRnQ2pKVG9BQUsrYUFLMVRrd0MyVndRQUtTMjBBRXVBZmdEYUI2Y0FkcW9PQUh0Wm9RQVdFaW9BM0xjdEFQcmwvUUNKMi80QWliNzlBT1IyYkFBR3Fmd0FQb0J3QUlWdUZRRDloLzhBS0Q0SEFHRm5Nd0FxR0lZQVRiM3FBTFBucndDUGJXNEFsV2M1QURHL1d3Q0UxMGdBTU44V0FNY3RRd0FsWVRVQXlYRE9BRERMdUFDL2JQMEFwQUNpQUFWczVBQmEzYUFBSVc5SEFHSVMwZ0M1WElRQWNHRkpBR3RXNEFDWlVnRUFVRlUzQUI3VnR3QXo4Y1FBRTI1ZkFGMHc1QUNGTHFrQUhiTERBS0V5TmdBSXQ2UUE2ckhVQUJiM0lRQ1BhZVFBSi85M0FBd0RnQUNOUUMwQVQ4MmdBQ0NsbVFDem90TUFMMTBLQUxUNVFnQVIyc3NBZmI3UUFKdmJ3UUNyRjcwQXlxS0JBQWhxWEFBdVZSY0FKd0JWQUg4VThBRGhCNFlBRkF0a0FKWkJqUUNIdnQ0QTJ2MHFBR3NsdGdCN2lUUUFCZlArQUxtL25nQm9hazhBU2lxb0FFL0VXZ0F0K0x3QTExcVlBUFRIbFFBTlRZMEFJRHFtQUtSWFh3QVVQN0VBZ0RpVkFNd2dBUUJ4M1lZQXlkNjJBTDlnOVFCTlpSRUFBUWRyQUl5d3JBQ3l3TkFBVVZWSUFCNzdEZ0NWY3NNQW93WTdBTUJBTlFBRzNIc0E0RVhNQUU0cCtnRFd5c2dBNlBOQkFIeGszZ0NiWk5nQTJiNHhBS1NYd3dCM1dOUUFhZVBGQVBEYUV3QzZPandBUmhoR0FGVjFYd0RTdmZVQWJwTEdBS3d1WFFBT1JPMEFIRDVDQUdIRWh3QXAvZWtBNTliekFDSjh5Z0J2a1RVQUNPREZBUC9YalFCdWF1SUFzUDNHQUpNSXdRQjhYWFFBYTYyeUFNMXVuUUErY25zQXhoRnFBUGZQcVFBcGM5OEF0Y202QUxjQVVRRGlzZzBBZExva0FPVjlZQUIwMklvQURSVXNBSUVZREFCK1pwUUFBU2tXQUo5NmRnRDkvYjRBVmtYdkFObCtOZ0RzMlJNQWk3cTVBTVNYL0FBeHFDY0E4VzdEQUpURk5nRFlxRllBdEtpMUFNL01EZ0FTaVMwQWIxYzBBQ3hXaVFDWnp1TUExaUM1QUd0ZXFnQStLcHdBRVYvTUFQMExTZ0RoOVBzQWpqdHRBT0tHTEFEcDFJUUEvTFNwQU8vdTBRQXVOY2tBTHpsaEFEZ2hSQUFiMmNnQWdmd0tBUHRLYWdBdkhOZ0FVN1NFQUU2WmpBQlVJc3dBS2xYY0FNREcxZ0FMR1pZQUduQzRBR21WWkFBbVdtQUFQMUx1QUg4UkR3RDB0UkVBL012MUFEUzhMUUEwdk80QTZGM01BTjFlWUFCbmpwc0FralB2QU1rWHVBQmhXSnNBNFZlOEFGR0R4Z0RZUGhBQTNYRklBQzBjM1FDdkdLRUFJU3hHQUZuejF3RFplcGdBbmxUQUFFK0crZ0JXQnZ3QTVYbXVBSWtpTmdBNHJTSUFaNVBjQUZYb3FnQ0NKamdBeXVlYkFGRU5wQUNaTTdFQXFkY09BR2tGU0FCbHN2QUFmNGluQUloTWx3RDUwVFlBSVpLekFIdUNTZ0NZenlFQVFKL2NBTnhIVlFEaGREb0FaK3RDQVA2ZDN3QmUxRjhBZTJla0FMcXNlZ0JWOXFJQUs0Z2pBRUc2VlFCWmJnZ0FJU3FHQURsSGd3Q0o0K1lBNVo3VUFFbjdRQUQvVnVrQUhBL0tBTVZaaWdDVStpc0EwOEhGQUEvRnp3RGJXcTRBUjhXR0FJVkRZZ0FoaGpzQUxIbVVBQkJoaHdBcVRIc0FnQ3dhQUVPL0VnQ0lKcEFBZUR5SkFLakU1QURsMjNzQXhEckNBQ2IwNmdEM1o0b0FEWksvQUdXakt3QTlrN0VBdlh3TEFLUlIzQUFuM1dNQWFlSGRBSnFVR1FDb0taVUFhTTRvQUFudHRBQkVueUFBVHBqS0FIQ0NZd0IrZkNNQUQ3a3lBS2YxamdBVVZ1Y0FJZkVJQUxXZEtnQnZmazBBcFJsUkFMWDVxd0NDMzlZQWx0MWhBQlkyQWdERU9wOEFnNktoQUhMdGJRQTVqWG9BZ3JpcEFHc3lYQUJHSjFzQUFEVHRBTklBZHdEODlGVUFBVmxOQU9CeGdBQkI4OEFFQzY0QlFQc2grVDhBQUFBQUxVUjBQZ0FBQUlDWVJ2ZzhBQUFBWUZITWVEc0FBQUNBZ3h2d09RQUFBRUFnSlhvNEFBQUFnQ0tDNHpZQUFBQUFIZk5wTmRGMG5nQlhuYjBxZ0hCU0QvLy9QaWNLQUFBQVpBQUFBT2dEQUFBUUp3QUFvSVlCQUVCQ0R3Q0FscGdBQU9IMUJSa0FDZ0FaR1JrQUFBQUFCUUFBQUFBQUFBa0FBQUFBQ3dBQUFBQUFBQUFBR1FBUkNoa1pHUU1LQndBQkFBa0xHQUFBQ1FZTEFBQUxBQVlaQUFBQUdSa1pBRUd4d2dRTElRNEFBQUFBQUFBQUFCa0FDZzBaR1JrQURRQUFBZ0FKRGdBQUFBa0FEZ0FBRGdCQjY4SUVDd0VNQUVIM3dnUUxGUk1BQUFBQUV3QUFBQUFKREFBQUFBQUFEQUFBREFCQnBjTUVDd0VRQUVHeHd3UUxGUThBQUFBRUR3QUFBQUFKRUFBQUFBQUFFQUFBRUFCQjM4TUVDd0VTQUVIcnd3UUxIaEVBQUFBQUVRQUFBQUFKRWdBQUFBQUFFZ0FBRWdBQUdnQUFBQm9hR2dCQm9zUUVDdzRhQUFBQUdob2FBQUFBQUFBQUNRQkIwOFFFQ3dFVUFFSGZ4QVFMRlJjQUFBQUFGd0FBQUFBSkZBQUFBQUFBRkFBQUZBQkJqY1VFQ3dFV0FFR1p4UVFMSnhVQUFBQUFGUUFBQUFBSkZnQUFBQUFBRmdBQUZnQUFNREV5TXpRMU5qYzRPVUZDUTBSRlJnQkI1TVVFQ3dFNkFFR014Z1FMQ1AvLy8vLy8vLy8vQUVIUXhnUUxBeEF2VVFCQjNNWUVDeDBEQUFBQUFBQUFBQUlBQUFBQUFBQUFBUUFBQUFFQUFBQUJBQUFBQlFCQmhNY0VDd0tXQVFCQm5NY0VDd3VYQVFBQW1BRUFBT3dxQVFCQnRNY0VDd0VDQUVIRXh3UUxDUC8vLy8vLy8vLy9BRUdJeUFRTENYZ2pBUUFBQUFBQUJRQkJuTWdFQ3dLWkFRQkJ0TWdFQ3c2WEFRQUFtZ0VBQVBncUFRQUFCQUJCek1nRUN3RUJBRUhjeUFRTEJmLy8vLzhLQUVHZ3lRUUxBeEFrQVE9PVwiO1xuICAgICAgICBpZiAoIVIuc3RhcnRzV2l0aChRKSkge1xuICAgICAgICAgICAgdmFyIGZhID0gUjtcbiAgICAgICAgICAgIFIgPSBhLmxvY2F0ZUZpbGUgPyBhLmxvY2F0ZUZpbGUoZmEsIHgpIDogeCArIGZhO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhKGIpIHsgdHJ5IHtcbiAgICAgICAgICAgIGlmIChiID09IFIgJiYgRSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoRSk7XG4gICAgICAgICAgICB2YXIgYyA9IEMoYik7XG4gICAgICAgICAgICBpZiAoYylcbiAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgIGlmIChBKVxuICAgICAgICAgICAgICAgIHJldHVybiBBKGIpO1xuICAgICAgICAgICAgdGhyb3cgXCJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZFwiO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChkKSB7XG4gICAgICAgICAgICBGKGQpO1xuICAgICAgICB9IH1cbiAgICAgICAgZnVuY3Rpb24gaWEoYikgeyBpZiAoIUUgJiYgKHUgfHwgdikpIHtcbiAgICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGZldGNoICYmICFiLnN0YXJ0c1dpdGgoXCJmaWxlOi8vXCIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaChiLCB7IGNyZWRlbnRpYWxzOiBcInNhbWUtb3JpZ2luXCIgfSkudGhlbihmdW5jdGlvbiAoYykgeyBpZiAoIWMub2spXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFwiZmFpbGVkIHRvIGxvYWQgd2FzbSBiaW5hcnkgZmlsZSBhdCAnXCIgKyBiICsgXCInXCI7IHJldHVybiBjLmFycmF5QnVmZmVyKCk7IH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGhhKGIpOyB9KTtcbiAgICAgICAgICAgIGlmICh6KVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYywgZCkgeyB6KGIsIGZ1bmN0aW9uIChlKSB7IGMobmV3IFVpbnQ4QXJyYXkoZSkpOyB9LCBkKTsgfSk7XG4gICAgICAgIH0gcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gaGEoYik7IH0pOyB9XG4gICAgICAgIGZ1bmN0aW9uIGphKGIsIGMsIGQpIHsgcmV0dXJuIGlhKGIpLnRoZW4oZnVuY3Rpb24gKGUpIHsgcmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGUsIGMpOyB9KS50aGVuKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlOyB9KS50aGVuKGQsIGZ1bmN0aW9uIChlKSB7IEQoXCJmYWlsZWQgdG8gYXN5bmNocm9ub3VzbHkgcHJlcGFyZSB3YXNtOiBcIiArIGUpOyBGKGUpOyB9KTsgfVxuICAgICAgICBmdW5jdGlvbiBrYShiLCBjKSB7IHZhciBkID0gUjsgcmV0dXJuIEUgfHwgXCJmdW5jdGlvblwiICE9IHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyB8fCBkLnN0YXJ0c1dpdGgoUSkgfHwgZC5zdGFydHNXaXRoKFwiZmlsZTovL1wiKSB8fCB3IHx8IFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgZmV0Y2ggPyBqYShkLCBiLCBjKSA6IGZldGNoKGQsIHsgY3JlZGVudGlhbHM6IFwic2FtZS1vcmlnaW5cIiB9KS50aGVuKGZ1bmN0aW9uIChlKSB7IHJldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhlLCBiKS50aGVuKGMsIGZ1bmN0aW9uIChmKSB7IEQoXCJ3YXNtIHN0cmVhbWluZyBjb21waWxlIGZhaWxlZDogXCIgKyBmKTsgRChcImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uXCIpOyByZXR1cm4gamEoZCwgYiwgYyk7IH0pOyB9KTsgfVxuICAgICAgICBmdW5jdGlvbiBTKGIpIHsgZm9yICg7IDAgPCBiLmxlbmd0aDspXG4gICAgICAgICAgICBiLnNoaWZ0KCkoYSk7IH1cbiAgICAgICAgdmFyIGxhID0gXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgVGV4dERlY29kZXIgPyBuZXcgVGV4dERlY29kZXIoXCJ1dGY4XCIpIDogdm9pZCAwO1xuICAgICAgICBmdW5jdGlvbiBuYShiLCBjLCBkKSB7IHZhciBlID0gYyArIGQ7IGZvciAoZCA9IGM7IGJbZF0gJiYgIShkID49IGUpOylcbiAgICAgICAgICAgICsrZDsgaWYgKDE2IDwgZCAtIGMgJiYgYi5idWZmZXIgJiYgbGEpXG4gICAgICAgICAgICByZXR1cm4gbGEuZGVjb2RlKGIuc3ViYXJyYXkoYywgZCkpOyBmb3IgKGUgPSBcIlwiOyBjIDwgZDspIHtcbiAgICAgICAgICAgIHZhciBmID0gYltjKytdO1xuICAgICAgICAgICAgaWYgKGYgJiAxMjgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZyA9IGJbYysrXSAmIDYzO1xuICAgICAgICAgICAgICAgIGlmICgxOTIgPT0gKGYgJiAyMjQpKVxuICAgICAgICAgICAgICAgICAgICBlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGYgJiAzMSkgPDwgNiB8IGcpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGJbYysrXSAmIDYzO1xuICAgICAgICAgICAgICAgICAgICBmID0gMjI0ID09IChmICYgMjQwKSA/IChmICYgMTUpIDw8IDEyIHwgZyA8PCA2IHwgaCA6IChmICYgNykgPDwgMTggfCBnIDw8IDEyIHwgaCA8PCA2IHwgYltjKytdICYgNjM7XG4gICAgICAgICAgICAgICAgICAgIDY1NTM2ID4gZiA/IGUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShmKSA6IChmIC09IDY1NTM2LCBlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTYgfCBmID4+IDEwLCA1NjMyMCB8IGYgJiAxMDIzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShmKTtcbiAgICAgICAgfSByZXR1cm4gZTsgfVxuICAgICAgICBmdW5jdGlvbiBUKGIsIGMpIHsgcmV0dXJuIGIgPyBuYShKLCBiLCBjKSA6IFwiXCI7IH1cbiAgICAgICAgdmFyIG9hID0gWzAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1XSwgcGEgPSBbMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzRdO1xuICAgICAgICBmdW5jdGlvbiBVKGIpIHsgZm9yICh2YXIgYyA9IDAsIGQgPSAwOyBkIDwgYi5sZW5ndGg7ICsrZCkge1xuICAgICAgICAgICAgdmFyIGUgPSBiLmNoYXJDb2RlQXQoZCk7XG4gICAgICAgICAgICAxMjcgPj0gZSA/IGMrKyA6IDIwNDcgPj0gZSA/IGMgKz0gMiA6IDU1Mjk2IDw9IGUgJiYgNTczNDMgPj0gZSA/IChjICs9IDQsICsrZCkgOiBjICs9IDM7XG4gICAgICAgIH0gcmV0dXJuIGM7IH1cbiAgICAgICAgZnVuY3Rpb24gVihiLCBjLCBkKSB7IHZhciBlID0gSjsgaWYgKCEoMCA8IGQpKVxuICAgICAgICAgICAgcmV0dXJuIDA7IHZhciBmID0gYzsgZCA9IGMgKyBkIC0gMTsgZm9yICh2YXIgZyA9IDA7IGcgPCBiLmxlbmd0aDsgKytnKSB7XG4gICAgICAgICAgICB2YXIgaCA9IGIuY2hhckNvZGVBdChnKTtcbiAgICAgICAgICAgIGlmICg1NTI5NiA8PSBoICYmIDU3MzQzID49IGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgayA9IGIuY2hhckNvZGVBdCgrK2cpO1xuICAgICAgICAgICAgICAgIGggPSA2NTUzNiArICgoaCAmIDEwMjMpIDw8IDEwKSB8IGsgJiAxMDIzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKDEyNyA+PSBoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPj0gZClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZVtjKytdID0gaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICgyMDQ3ID49IGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMgKyAxID49IGQpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZVtjKytdID0gMTkyIHwgaCA+PiA2O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKDY1NTM1ID49IGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICsgMiA+PSBkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZVtjKytdID0gMjI0IHwgaCA+PiAxMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICsgMyA+PSBkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZVtjKytdID0gMjQwIHwgaCA+PiAxODtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVbYysrXSA9IDEyOCB8IGggPj4gMTIgJiA2MztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlW2MrK10gPSAxMjggfCBoID4+IDYgJiA2MztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZVtjKytdID0gMTI4IHwgaCAmIDYzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVbY10gPSAwOyByZXR1cm4gYyAtIGY7IH1cbiAgICAgICAgZnVuY3Rpb24gcWEoYikgeyB2YXIgYyA9IFUoYikgKyAxLCBkID0gcmEoYyk7IGQgJiYgVihiLCBkLCBjKTsgcmV0dXJuIGQ7IH1cbiAgICAgICAgdmFyIFcgPSB7fTtcbiAgICAgICAgZnVuY3Rpb24gc2EoKSB7IGlmICghWCkge1xuICAgICAgICAgICAgdmFyIGIgPSB7IFVTRVI6IFwid2ViX3VzZXJcIiwgTE9HTkFNRTogXCJ3ZWJfdXNlclwiLCBQQVRIOiBcIi9cIiwgUFdEOiBcIi9cIiwgSE9NRTogXCIvaG9tZS93ZWJfdXNlclwiLCBMQU5HOiAoXCJvYmplY3RcIiA9PSB0eXBlb2YgbmF2aWdhdG9yICYmIG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlc1swXSB8fCBcIkNcIikucmVwbGFjZShcIi1cIiwgXCJfXCIpICsgXCIuVVRGLThcIiwgXzogdCB8fCBcIi4vdGhpcy5wcm9ncmFtXCIgfSwgYztcbiAgICAgICAgICAgIGZvciAoYyBpbiBXKVxuICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gV1tjXSA/IGRlbGV0ZSBiW2NdIDogYltjXSA9IFdbY107XG4gICAgICAgICAgICB2YXIgZCA9IFtdO1xuICAgICAgICAgICAgZm9yIChjIGluIGIpXG4gICAgICAgICAgICAgICAgZC5wdXNoKGMgKyBcIj1cIiArIGJbY10pO1xuICAgICAgICAgICAgWCA9IGQ7XG4gICAgICAgIH0gcmV0dXJuIFg7IH1cbiAgICAgICAgdmFyIFgsIHRhID0gW251bGwsIFtdLCBbXV07XG4gICAgICAgIGZ1bmN0aW9uIHVhKGIsIGMsIGQsIGUpIHsgdmFyIGYgPSB7IHN0cmluZzogbCA9PiB7IHZhciBxID0gMDsgaWYgKG51bGwgIT09IGwgJiYgdm9pZCAwICE9PSBsICYmIDAgIT09IGwpIHtcbiAgICAgICAgICAgICAgICBxID0gVShsKSArIDE7XG4gICAgICAgICAgICAgICAgdmFyIG1hID0gWShxKTtcbiAgICAgICAgICAgICAgICBWKGwsIG1hLCBxKTtcbiAgICAgICAgICAgICAgICBxID0gbWE7XG4gICAgICAgICAgICB9IHJldHVybiBxOyB9LCBhcnJheTogbCA9PiB7IHZhciBxID0gWShsLmxlbmd0aCk7IEkuc2V0KGwsIHEpOyByZXR1cm4gcTsgfSB9OyBiID0gYVtcIl9cIiArIGJdOyB2YXIgZyA9IFtdLCBoID0gMDsgaWYgKGUpXG4gICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGUubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgciA9IGZbZFtrXV07XG4gICAgICAgICAgICAgICAgciA/ICgwID09PSBoICYmIChoID0gdmEoKSksIGdba10gPSByKGVba10pKSA6IGdba10gPSBlW2tdO1xuICAgICAgICAgICAgfSBkID0gYi5hcHBseShudWxsLCBnKTsgcmV0dXJuIGQgPSBmdW5jdGlvbiAobCkgeyAwICE9PSBoICYmIHdhKGgpOyByZXR1cm4gXCJzdHJpbmdcIiA9PT0gYyA/IFQobCkgOiBcImJvb2xlYW5cIiA9PT0gYyA/ICEhbCA6IGw7IH0oZCk7IH1cbiAgICAgICAgdmFyIHhhID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBhdG9iID8gYXRvYiA6IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgICAgICB2YXIgYyA9IFwiXCIsIGQgPSAwO1xuICAgICAgICAgICAgYiA9IGIucmVwbGFjZSgvW15BLVphLXowLTlcXCtcXC89XS9nLCBcIlwiKTtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB2YXIgZSA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIi5pbmRleE9mKGIuY2hhckF0KGQrKykpO1xuICAgICAgICAgICAgICAgIHZhciBmID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiLmluZGV4T2YoYi5jaGFyQXQoZCsrKSk7XG4gICAgICAgICAgICAgICAgdmFyIGcgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCIuaW5kZXhPZihiLmNoYXJBdChkKyspKTtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIi5pbmRleE9mKGIuY2hhckF0KGQrKykpO1xuICAgICAgICAgICAgICAgIGUgPSBlIDw8IDIgfCBmID4+IDQ7XG4gICAgICAgICAgICAgICAgZiA9IChmICYgMTUpIDw8IDQgfCBnID4+IDI7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSAoZyAmIDMpIDw8IDYgfCBoO1xuICAgICAgICAgICAgICAgIGMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShlKTtcbiAgICAgICAgICAgICAgICA2NCAhPT0gZyAmJiAoYyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGYpKTtcbiAgICAgICAgICAgICAgICA2NCAhPT0gaCAmJiAoYyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGspKTtcbiAgICAgICAgICAgIH0gd2hpbGUgKGQgPCBiLmxlbmd0aCk7XG4gICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgfTtcbiAgICAgICAgZnVuY3Rpb24gQyhiKSB7IGlmIChiLnN0YXJ0c1dpdGgoUSkpIHtcbiAgICAgICAgICAgIGIgPSBiLnNsaWNlKFEubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChcImJvb2xlYW5cIiA9PSB0eXBlb2YgdyAmJiB3KSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBCdWZmZXIuZnJvbShiLCBcImJhc2U2NFwiKTtcbiAgICAgICAgICAgICAgICBjID0gbmV3IFVpbnQ4QXJyYXkoYy5idWZmZXIsIGMuYnl0ZU9mZnNldCwgYy5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHhhKGIpLCBlID0gbmV3IFVpbnQ4QXJyYXkoZC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGIgPSAwOyBiIDwgZC5sZW5ndGg7ICsrYilcbiAgICAgICAgICAgICAgICAgICAgICAgIGVbYl0gPSBkLmNoYXJDb2RlQXQoYik7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkNvbnZlcnRpbmcgYmFzZTY0IHN0cmluZyB0byBieXRlcyBmYWlsZWQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICB9IH1cbiAgICAgICAgdmFyIHlhID0geyBhOiBmdW5jdGlvbiAoYiwgYywgZCwgZSkgeyBGKFwiQXNzZXJ0aW9uIGZhaWxlZDogXCIgKyBUKGIpICsgXCIsIGF0OiBcIiArIFtjID8gVChjKSA6IFwidW5rbm93biBmaWxlbmFtZVwiLCBkLCBlID8gVChlKSA6IFwidW5rbm93biBmdW5jdGlvblwiXSk7IH0sIGw6IGZ1bmN0aW9uIChiLCBjKSB7XG4gICAgICAgICAgICAgICAgYiA9IG5ldyBEYXRlKDFFMyAqIChMW2IgPj4gMl0gKyA0Mjk0OTY3Mjk2ICogS1tiICsgNCA+PiAyXSkpO1xuICAgICAgICAgICAgICAgIEtbYyA+PiAyXSA9IGIuZ2V0U2Vjb25kcygpO1xuICAgICAgICAgICAgICAgIEtbYyArIDQgPj4gMl0gPSBiLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICAgICAgICBLW2MgKyA4ID4+IDJdID0gYi5nZXRIb3VycygpO1xuICAgICAgICAgICAgICAgIEtbYyArIDEyID4+IDJdID0gYi5nZXREYXRlKCk7XG4gICAgICAgICAgICAgICAgS1tjICsgMTYgPj4gMl0gPSBiLmdldE1vbnRoKCk7XG4gICAgICAgICAgICAgICAgS1tjICsgMjAgPj4gMl0gPSBiLmdldEZ1bGxZZWFyKCkgLSAxOTAwO1xuICAgICAgICAgICAgICAgIEtbYyArIDI0ID4+IDJdID0gYi5nZXREYXkoKTtcbiAgICAgICAgICAgICAgICB2YXIgZCA9IGIuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICBLW2MgKyAyOCA+PiAyXSA9ICgwICE9PSBkICUgNCB8fCAwID09PSBkICUgMTAwICYmIDAgIT09IGQgJSA0MDAgPyBwYSA6IG9hKVtiLmdldE1vbnRoKCldICsgYi5nZXREYXRlKCkgLSAxIHwgMDtcbiAgICAgICAgICAgICAgICBLW2MgKyAzNiA+PiAyXSA9IC0oNjAgKiBiLmdldFRpbWV6b25lT2Zmc2V0KCkpO1xuICAgICAgICAgICAgICAgIGQgPSAobmV3IERhdGUoYi5nZXRGdWxsWWVhcigpLCA2LCAxKSkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgICAgICAgICB2YXIgZSA9IChuZXcgRGF0ZShiLmdldEZ1bGxZZWFyKCksIDAsIDEpKS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgICAgICAgICAgICAgIEtbYyArIDMyID4+IDJdID0gKGQgIT0gZSAmJiBiLmdldFRpbWV6b25lT2Zmc2V0KCkgPT0gTWF0aC5taW4oZSwgZCkpIHwgMDtcbiAgICAgICAgICAgIH0sIGs6IGZ1bmN0aW9uIChiLCBjLCBkKSB7IGZ1bmN0aW9uIGUocikgeyByZXR1cm4gKHIgPSByLnRvVGltZVN0cmluZygpLm1hdGNoKC9cXCgoW0EtWmEteiBdKylcXCkkLykpID8gclsxXSA6IFwiR01UXCI7IH0gdmFyIGYgPSAobmV3IERhdGUpLmdldEZ1bGxZZWFyKCksIGcgPSBuZXcgRGF0ZShmLCAwLCAxKSwgaCA9IG5ldyBEYXRlKGYsIDYsIDEpOyBmID0gZy5nZXRUaW1lem9uZU9mZnNldCgpOyB2YXIgayA9IGguZ2V0VGltZXpvbmVPZmZzZXQoKTsgTFtiID4+IDJdID0gNjAgKiBNYXRoLm1heChmLCBrKTsgS1tjID4+IDJdID0gTnVtYmVyKGYgIT0gayk7IGIgPSBlKGcpOyBjID0gZShoKTsgYiA9IHFhKGIpOyBjID0gcWEoYyk7IGsgPCBmID8gKExbZCA+PiAyXSA9IGIsIExbZCArIDQgPj4gMl0gPSBjKSA6IChMW2QgPj4gMl0gPSBjLCBMW2QgKyA0ID4+IDJdID0gYik7IH0sIGI6IGZ1bmN0aW9uICgpIHsgRihcIlwiKTsgfSxcbiAgICAgICAgICAgIG06IGZ1bmN0aW9uICgpIHsgcmV0dXJuIERhdGUubm93KCk7IH0sIGo6IGZ1bmN0aW9uIChiKSB7IHZhciBjID0gSi5sZW5ndGg7IGIgPj4+PSAwOyBpZiAoMjE0NzQ4MzY0OCA8IGIpXG4gICAgICAgICAgICAgICAgcmV0dXJuICExOyBmb3IgKHZhciBkID0gMTsgNCA+PSBkOyBkICo9IDIpIHtcbiAgICAgICAgICAgICAgICB2YXIgZSA9IGMgKiAoMSArIC4yIC8gZCk7XG4gICAgICAgICAgICAgICAgZSA9IE1hdGgubWluKGUsIGIgKyAxMDA2NjMyOTYpO1xuICAgICAgICAgICAgICAgIHZhciBmID0gTWF0aCwgZyA9IGYubWluO1xuICAgICAgICAgICAgICAgIGUgPSBNYXRoLm1heChiLCBlKTtcbiAgICAgICAgICAgICAgICBlICs9ICg2NTUzNiAtIGUgJSA2NTUzNikgJSA2NTUzNjtcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBoID0gRy5idWZmZXI7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBHLmdyb3coZy5jYWxsKGYsIDIxNDc0ODM2NDgsIGUpIC0gaC5ieXRlTGVuZ3RoICsgNjU1MzUgPj4+IDE2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIE0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKHIpIHsgfVxuICAgICAgICAgICAgICAgICAgICBrID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICAgICAgfSByZXR1cm4gITE7IH0sIGU6IGZ1bmN0aW9uIChiLCBjKSB7XG4gICAgICAgICAgICAgICAgdmFyIGQgPSAwO1xuICAgICAgICAgICAgICAgIHNhKCkuZm9yRWFjaChmdW5jdGlvbiAoZSwgZikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGMgKyBkO1xuICAgICAgICAgICAgICAgICAgICBmID0gTFtiICsgNCAqIGYgPj4gMl0gPSBnO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGcgPSAwOyBnIDwgZS5sZW5ndGg7ICsrZylcbiAgICAgICAgICAgICAgICAgICAgICAgIElbZisrID4+IDBdID0gZS5jaGFyQ29kZUF0KGcpO1xuICAgICAgICAgICAgICAgICAgICBJW2YgPj4gMF0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBkICs9IGUubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIDE7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9LCBmOiBmdW5jdGlvbiAoYiwgYykgeyB2YXIgZCA9IHNhKCk7IExbYiA+PiAyXSA9IGQubGVuZ3RoOyB2YXIgZSA9IDA7IGQuZm9yRWFjaChmdW5jdGlvbiAoZikgeyBlICs9IGYubGVuZ3RoICsgMTsgfSk7IExbYyA+PiAyXSA9IGU7IHJldHVybiAwOyB9LCBkOiBmdW5jdGlvbiAoKSB7IHJldHVybiA1MjsgfSwgaTogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzA7IH0sIGM6IGZ1bmN0aW9uIChiLCBjLCBkLCBlKSB7IGZvciAodmFyIGYgPSAwLCBnID0gMDsgZyA8IGQ7IGcrKykge1xuICAgICAgICAgICAgICAgIHZhciBoID0gTFtjID4+IDJdLCBrID0gTFtjICsgNCA+PiAyXTtcbiAgICAgICAgICAgICAgICBjICs9IDg7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBrOyByKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBKW2ggKyByXSwgcSA9IHRhW2JdO1xuICAgICAgICAgICAgICAgICAgICAwID09PSBsIHx8IDEwID09PSBsID8gKCgxID09PSBiID8gYWEgOiBEKShuYShxLCAwKSksIHEubGVuZ3RoID0gMCkgOiBxLnB1c2gobCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGYgKz0gaztcbiAgICAgICAgICAgIH0gTFtlID4+IDJdID0gZjsgcmV0dXJuIDA7IH0sIG86IGZ1bmN0aW9uIChiLCBjLCBkLCBlLCBmKSB7IHJldHVybiBhLmNhbGxiYWNrcy5jYWxsRnVuY3Rpb24odm9pZCAwLCBiLCBjLCBkLCBlLCBmKTsgfSwgbjogZnVuY3Rpb24gKGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5jYWxsYmFja3Muc2hvdWxkSW50ZXJydXB0KHZvaWQgMCwgYik7XG4gICAgICAgICAgICB9LCBoOiBmdW5jdGlvbiAoYiwgYywgZCkgeyBkID0gVChkKTsgcmV0dXJuIGEuY2FsbGJhY2tzLmxvYWRNb2R1bGVTb3VyY2Uodm9pZCAwLCBiLCBjLCBkKTsgfSwgZzogZnVuY3Rpb24gKGIsIGMsIGQsIGUpIHsgZCA9IFQoZCk7IGUgPSBUKGUpOyByZXR1cm4gYS5jYWxsYmFja3Mubm9ybWFsaXplTW9kdWxlKHZvaWQgMCwgYiwgYywgZCwgZSk7IH0gfTtcbiAgICAgICAgKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gYihkKSB7IGQgPSBkLmV4cG9ydHM7IGEuYXNtID0gZDsgRyA9IGEuYXNtLnA7IE0oKTsgY2EudW5zaGlmdChhLmFzbS5xKTsgTi0tOyBhLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMgJiYgYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKE4pOyBpZiAoMCA9PSBOICYmIChudWxsICE9PSBPICYmIChjbGVhckludGVydmFsKE8pLCBPID0gbnVsbCksIFApKSB7XG4gICAgICAgICAgICB2YXIgZSA9IFA7XG4gICAgICAgICAgICBQID0gbnVsbDtcbiAgICAgICAgICAgIGUoKTtcbiAgICAgICAgfSByZXR1cm4gZDsgfSB2YXIgYyA9IHsgYTogeWEgfTsgTisrOyBhLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMgJiYgYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKE4pOyBpZiAoYS5pbnN0YW50aWF0ZVdhc20pXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLmluc3RhbnRpYXRlV2FzbShjLCBiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChkKSB7XG4gICAgICAgICAgICAgICAgRChcIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6IFwiICsgZCksIG4oZCk7XG4gICAgICAgICAgICB9IGthKGMsIGZ1bmN0aW9uIChkKSB7IGIoZC5pbnN0YW5jZSk7IH0pLmNhdGNoKG4pOyByZXR1cm4ge307IH0pKCk7XG4gICAgICAgIHZhciByYSA9IGEuX21hbGxvYyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChyYSA9IGEuX21hbGxvYyA9IGEuYXNtLnIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19UaHJvdyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfVGhyb3cgPSBhLmFzbS5zKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3RXJyb3IgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld0Vycm9yID0gYS5hc20udCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVTZXRNZW1vcnlMaW1pdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUnVudGltZVNldE1lbW9yeUxpbWl0ID0gYS5hc20udSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVDb21wdXRlTWVtb3J5VXNhZ2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1J1bnRpbWVDb21wdXRlTWVtb3J5VXNhZ2UgPSBhLmFzbS52KS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfUnVudGltZUR1bXBNZW1vcnlVc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUnVudGltZUR1bXBNZW1vcnlVc2FnZSA9IGEuYXNtLncpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SZWNvdmVyYWJsZUxlYWtDaGVjayA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUmVjb3ZlcmFibGVMZWFrQ2hlY2sgPSBhLmFzbS54KS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfQnVpbGRJc1Nhbml0aXplTGVhayA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfQnVpbGRJc1Nhbml0aXplTGVhayA9IGEuYXNtLnkpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SdW50aW1lU2V0TWF4U3RhY2tTaXplID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19SdW50aW1lU2V0TWF4U3RhY2tTaXplID0gYS5hc20ueikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldFVuZGVmaW5lZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfR2V0VW5kZWZpbmVkID0gYS5hc20uQSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldE51bGwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldE51bGwgPSBhLmFzbS5CKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfR2V0RmFsc2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldEZhbHNlID0gYS5hc20uQykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldFRydWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldFRydWUgPSBhLmFzbS5EKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3UnVudGltZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3UnVudGltZSA9IGEuYXNtLkUpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19GcmVlUnVudGltZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRnJlZVJ1bnRpbWUgPSBhLmFzbS5GKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3Q29udGV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3Q29udGV4dCA9IGEuYXNtLkcpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19GcmVlQ29udGV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRnJlZUNvbnRleHQgPSBhLmFzbS5IKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRnJlZVZhbHVlUG9pbnRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRnJlZVZhbHVlUG9pbnRlciA9IGEuYXNtLkkpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX2ZyZWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fZnJlZSA9IGEuYXNtLkopLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19GcmVlVmFsdWVQb2ludGVyUnVudGltZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRnJlZVZhbHVlUG9pbnRlclJ1bnRpbWUgPSBhLmFzbS5LKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRnJlZVZvaWRQb2ludGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19GcmVlVm9pZFBvaW50ZXIgPSBhLmFzbS5MKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRnJlZUNTdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0ZyZWVDU3RyaW5nID0gYS5hc20uTSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0R1cFZhbHVlUG9pbnRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRHVwVmFsdWVQb2ludGVyID0gYS5hc20uTikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld09iamVjdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3T2JqZWN0ID0gYS5hc20uTykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld09iamVjdFByb3RvID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19OZXdPYmplY3RQcm90byA9IGEuYXNtLlApLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19OZXdBcnJheSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3QXJyYXkgPSBhLmFzbS5RKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3RmxvYXQ2NCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3RmxvYXQ2NCA9IGEuYXNtLlIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRGbG9hdDY0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19HZXRGbG9hdDY0ID0gYS5hc20uUykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3U3RyaW5nID0gYS5hc20uVCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldFN0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfR2V0U3RyaW5nID0gYS5hc20uVSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld1N5bWJvbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3U3ltYm9sID0gYS5hc20uVikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldFN5bWJvbERlc2NyaXB0aW9uT3JLZXkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldFN5bWJvbERlc2NyaXB0aW9uT3JLZXkgPSBhLmFzbS5XKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfSXNHbG9iYWxTeW1ib2wgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0lzR2xvYmFsU3ltYm9sID0gYS5hc20uWCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0lzSm9iUGVuZGluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfSXNKb2JQZW5kaW5nID0gYS5hc20uWSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0V4ZWN1dGVQZW5kaW5nSm9iID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19FeGVjdXRlUGVuZGluZ0pvYiA9IGEuYXNtLlopLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRQcm9wID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19HZXRQcm9wID0gYS5hc20uXykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1NldFByb3AgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1NldFByb3AgPSBhLmFzbS4kKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRGVmaW5lUHJvcCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRGVmaW5lUHJvcCA9IGEuYXNtLmFhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfQ2FsbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfQ2FsbCA9IGEuYXNtLmJhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfUmVzb2x2ZUV4Y2VwdGlvbiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUmVzb2x2ZUV4Y2VwdGlvbiA9IGEuYXNtLmNhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRHVtcCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRHVtcCA9IGEuYXNtLmRhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRXZhbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRXZhbCA9IGEuYXNtLmVhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfVHlwZW9mID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19UeXBlb2YgPSBhLmFzbS5mYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldEdsb2JhbE9iamVjdCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfR2V0R2xvYmFsT2JqZWN0ID0gYS5hc20uZ2EpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19OZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBhLmFzbS5oYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1Rlc3RTdHJpbmdBcmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1Rlc3RTdHJpbmdBcmcgPSBhLmFzbS5pYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0J1aWxkSXNEZWJ1ZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfQnVpbGRJc0RlYnVnID0gYS5hc20uamEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19CdWlsZElzQXN5bmNpZnkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0J1aWxkSXNBc3luY2lmeSA9IGEuYXNtLmthKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3RnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld0Z1bmN0aW9uID0gYS5hc20ubGEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19Bcmd2R2V0SlNWYWx1ZUNvbnN0UG9pbnRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfQXJndkdldEpTVmFsdWVDb25zdFBvaW50ZXIgPSBhLmFzbS5tYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVFbmFibGVJbnRlcnJ1cHRIYW5kbGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19SdW50aW1lRW5hYmxlSW50ZXJydXB0SGFuZGxlciA9IGEuYXNtLm5hKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfUnVudGltZURpc2FibGVJbnRlcnJ1cHRIYW5kbGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19SdW50aW1lRGlzYWJsZUludGVycnVwdEhhbmRsZXIgPSBhLmFzbS5vYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVFbmFibGVNb2R1bGVMb2FkZXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1J1bnRpbWVFbmFibGVNb2R1bGVMb2FkZXIgPSBhLmFzbS5wYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVEaXNhYmxlTW9kdWxlTG9hZGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19SdW50aW1lRGlzYWJsZU1vZHVsZUxvYWRlciA9IGEuYXNtLnFhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBmdW5jdGlvbiB2YSgpIHsgcmV0dXJuICh2YSA9IGEuYXNtLnNhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG4gICAgICAgIGZ1bmN0aW9uIHdhKCkgeyByZXR1cm4gKHdhID0gYS5hc20udGEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbiAgICAgICAgZnVuY3Rpb24gWSgpIHsgcmV0dXJuIChZID0gYS5hc20udWEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbiAgICAgICAgYS5fX19zdGFydF9lbV9qcyA9IDc0OTE2O1xuICAgICAgICBhLl9fX3N0b3BfZW1fanMgPSA3NTgxODtcbiAgICAgICAgYS5jd3JhcCA9IGZ1bmN0aW9uIChiLCBjLCBkLCBlKSB7IHZhciBmID0gIWQgfHwgZC5ldmVyeShnID0+IFwibnVtYmVyXCIgPT09IGcgfHwgXCJib29sZWFuXCIgPT09IGcpOyByZXR1cm4gXCJzdHJpbmdcIiAhPT0gYyAmJiBmICYmICFlID8gYVtcIl9cIiArIGJdIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdWEoYiwgYywgZCwgYXJndW1lbnRzKTsgfTsgfTtcbiAgICAgICAgYS5VVEY4VG9TdHJpbmcgPSBUO1xuICAgICAgICBhLnN0cmluZ1RvVVRGOCA9IGZ1bmN0aW9uIChiLCBjLCBkKSB7IHJldHVybiBWKGIsIGMsIGQpOyB9O1xuICAgICAgICBhLmxlbmd0aEJ5dGVzVVRGOCA9IFU7XG4gICAgICAgIHZhciBaO1xuICAgICAgICBQID0gZnVuY3Rpb24gemEoKSB7IFogfHwgQWEoKTsgWiB8fCAoUCA9IHphKTsgfTtcbiAgICAgICAgZnVuY3Rpb24gQWEoKSB7IGZ1bmN0aW9uIGIoKSB7IGlmICghWiAmJiAoWiA9ICEwLCBhLmNhbGxlZFJ1biA9ICEwLCAhSCkpIHtcbiAgICAgICAgICAgIFMoY2EpO1xuICAgICAgICAgICAgbShhKTtcbiAgICAgICAgICAgIGlmIChhLm9uUnVudGltZUluaXRpYWxpemVkKVxuICAgICAgICAgICAgICAgIGEub25SdW50aW1lSW5pdGlhbGl6ZWQoKTtcbiAgICAgICAgICAgIGlmIChhLnBvc3RSdW4pXG4gICAgICAgICAgICAgICAgZm9yIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGEucG9zdFJ1biAmJiAoYS5wb3N0UnVuID0gW2EucG9zdFJ1bl0pOyBhLnBvc3RSdW4ubGVuZ3RoOykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEucG9zdFJ1bi5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICBkYS51bnNoaWZ0KGMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFMoZGEpO1xuICAgICAgICB9IH0gaWYgKCEoMCA8IE4pKSB7XG4gICAgICAgICAgICBpZiAoYS5wcmVSdW4pXG4gICAgICAgICAgICAgICAgZm9yIChcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGEucHJlUnVuICYmIChhLnByZVJ1biA9IFthLnByZVJ1bl0pOyBhLnByZVJ1bi5sZW5ndGg7KVxuICAgICAgICAgICAgICAgICAgICBlYSgpO1xuICAgICAgICAgICAgUyhiYSk7XG4gICAgICAgICAgICAwIDwgTiB8fCAoYS5zZXRTdGF0dXMgPyAoYS5zZXRTdGF0dXMoXCJSdW5uaW5nLi4uXCIpLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGEuc2V0U3RhdHVzKFwiXCIpOyB9LCAxKTsgYigpOyB9LCAxKSkgOiBiKCkpO1xuICAgICAgICB9IH1cbiAgICAgICAgaWYgKGEucHJlSW5pdClcbiAgICAgICAgICAgIGZvciAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBhLnByZUluaXQgJiYgKGEucHJlSW5pdCA9IFthLnByZUluaXRdKTsgMCA8IGEucHJlSW5pdC5sZW5ndGg7KVxuICAgICAgICAgICAgICAgIGEucHJlSW5pdC5wb3AoKSgpO1xuICAgICAgICBBYSgpO1xuICAgICAgICByZXR1cm4gUXVpY2tKU1Jhdy5yZWFkeTtcbiAgICB9KTtcbn0pKCk7XG5pZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuICAgIG1vZHVsZS5leHBvcnRzID0gUXVpY2tKU1JhdztcbmVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSlcbiAgICBkZWZpbmUoW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIFF1aWNrSlNSYXc7IH0pO1xuZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuICAgIGV4cG9ydHNbXCJRdWlja0pTUmF3XCJdID0gUXVpY2tKU1Jhdztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVtc2NyaXB0ZW4tbW9kdWxlLldBU01fUkVMRUFTRV9TWU5DLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWlja0pTRkZJID0gdm9pZCAwO1xuLyoqXG4gKiBMb3ctbGV2ZWwgRkZJIGJpbmRpbmdzIHRvIFF1aWNrSlMncyBFbXNjcmlwdGVuIG1vZHVsZS5cbiAqIFNlZSBpbnN0ZWFkIFtbUXVpY2tKU0NvbnRleHRdXSwgdGhlIHB1YmxpYyBKYXZhc2NyaXB0IGludGVyZmFjZSBleHBvc2VkIGJ5IHRoaXNcbiAqIGxpYnJhcnkuXG4gKlxuICogQHVuc3RhYmxlIFRoZSBGRkkgaW50ZXJmYWNlIGlzIGNvbnNpZGVyZWQgcHJpdmF0ZSBhbmQgbWF5IGNoYW5nZS5cbiAqL1xuY2xhc3MgUXVpY2tKU0ZGSSB7XG4gICAgY29uc3RydWN0b3IobW9kdWxlKSB7XG4gICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlO1xuICAgICAgICAvKiogU2V0IGF0IGNvbXBpbGUgdGltZS4gKi9cbiAgICAgICAgdGhpcy5ERUJVRyA9IGZhbHNlO1xuICAgICAgICB0aGlzLlFUU19UaHJvdyA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX1Rocm93XCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld0Vycm9yID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3RXJyb3JcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfUnVudGltZVNldE1lbW9yeUxpbWl0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZVNldE1lbW9yeUxpbWl0XCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVDb21wdXRlTWVtb3J5VXNhZ2UgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lQ29tcHV0ZU1lbW9yeVVzYWdlXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVEdW1wTWVtb3J5VXNhZ2UgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lRHVtcE1lbW9yeVVzYWdlXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1JlY292ZXJhYmxlTGVha0NoZWNrID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUmVjb3ZlcmFibGVMZWFrQ2hlY2tcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19CdWlsZElzU2FuaXRpemVMZWFrID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfQnVpbGRJc1Nhbml0aXplTGVha1wiLCBcIm51bWJlclwiLCBbXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVTZXRNYXhTdGFja1NpemUgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lU2V0TWF4U3RhY2tTaXplXCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0dldFVuZGVmaW5lZCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0dldFVuZGVmaW5lZFwiLCBcIm51bWJlclwiLCBbXSk7XG4gICAgICAgIHRoaXMuUVRTX0dldE51bGwgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19HZXROdWxsXCIsIFwibnVtYmVyXCIsIFtdKTtcbiAgICAgICAgdGhpcy5RVFNfR2V0RmFsc2UgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19HZXRGYWxzZVwiLCBcIm51bWJlclwiLCBbXSk7XG4gICAgICAgIHRoaXMuUVRTX0dldFRydWUgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19HZXRUcnVlXCIsIFwibnVtYmVyXCIsIFtdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3UnVudGltZSA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld1J1bnRpbWVcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19GcmVlUnVudGltZSA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0ZyZWVSdW50aW1lXCIsIG51bGwsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld0NvbnRleHQgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdDb250ZXh0XCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0ZyZWVDb250ZXh0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRnJlZUNvbnRleHRcIiwgbnVsbCwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfRnJlZVZhbHVlUG9pbnRlciA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0ZyZWVWYWx1ZVBvaW50ZXJcIiwgbnVsbCwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfRnJlZVZhbHVlUG9pbnRlclJ1bnRpbWUgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19GcmVlVmFsdWVQb2ludGVyUnVudGltZVwiLCBudWxsLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19GcmVlVm9pZFBvaW50ZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19GcmVlVm9pZFBvaW50ZXJcIiwgbnVsbCwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfRnJlZUNTdHJpbmcgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19GcmVlQ1N0cmluZ1wiLCBudWxsLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19EdXBWYWx1ZVBvaW50ZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19EdXBWYWx1ZVBvaW50ZXJcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3T2JqZWN0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3T2JqZWN0XCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld09iamVjdFByb3RvID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3T2JqZWN0UHJvdG9cIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3QXJyYXkgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdBcnJheVwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19OZXdGbG9hdDY0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3RmxvYXQ2NFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19HZXRGbG9hdDY0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0RmxvYXQ2NFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19OZXdTdHJpbmcgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdTdHJpbmdcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfR2V0U3RyaW5nID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0U3RyaW5nXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld1N5bWJvbCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld1N5bWJvbFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19HZXRTeW1ib2xEZXNjcmlwdGlvbk9yS2V5ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0U3ltYm9sRGVzY3JpcHRpb25PcktleVwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19Jc0dsb2JhbFN5bWJvbCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0lzR2xvYmFsU3ltYm9sXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0lzSm9iUGVuZGluZyA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0lzSm9iUGVuZGluZ1wiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19FeGVjdXRlUGVuZGluZ0pvYiA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0V4ZWN1dGVQZW5kaW5nSm9iXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0dldFByb3AgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19HZXRQcm9wXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1NldFByb3AgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19TZXRQcm9wXCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0RlZmluZVByb3AgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19EZWZpbmVQcm9wXCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcImJvb2xlYW5cIiwgXCJib29sZWFuXCIsIFwiYm9vbGVhblwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0NhbGwgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19DYWxsXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1Jlc29sdmVFeGNlcHRpb24gPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SZXNvbHZlRXhjZXB0aW9uXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0R1bXAgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19EdW1wXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0V2YWwgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19FdmFsXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1R5cGVvZiA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX1R5cGVvZlwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19HZXRHbG9iYWxPYmplY3QgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19HZXRHbG9iYWxPYmplY3RcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3UHJvbWlzZUNhcGFiaWxpdHkgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdQcm9taXNlQ2FwYWJpbGl0eVwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19UZXN0U3RyaW5nQXJnID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfVGVzdFN0cmluZ0FyZ1wiLCBudWxsLCBbXCJzdHJpbmdcIl0pO1xuICAgICAgICB0aGlzLlFUU19CdWlsZElzRGVidWcgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19CdWlsZElzRGVidWdcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19CdWlsZElzQXN5bmNpZnkgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19CdWlsZElzQXN5bmNpZnlcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19OZXdGdW5jdGlvbiA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld0Z1bmN0aW9uXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiLCBcInN0cmluZ1wiXSk7XG4gICAgICAgIHRoaXMuUVRTX0FyZ3ZHZXRKU1ZhbHVlQ29uc3RQb2ludGVyID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfQXJndkdldEpTVmFsdWVDb25zdFBvaW50ZXJcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfUnVudGltZUVuYWJsZUludGVycnVwdEhhbmRsZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lRW5hYmxlSW50ZXJydXB0SGFuZGxlclwiLCBudWxsLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19SdW50aW1lRGlzYWJsZUludGVycnVwdEhhbmRsZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lRGlzYWJsZUludGVycnVwdEhhbmRsZXJcIiwgbnVsbCwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfUnVudGltZUVuYWJsZU1vZHVsZUxvYWRlciA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX1J1bnRpbWVFbmFibGVNb2R1bGVMb2FkZXJcIiwgbnVsbCwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfUnVudGltZURpc2FibGVNb2R1bGVMb2FkZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lRGlzYWJsZU1vZHVsZUxvYWRlclwiLCBudWxsLCBbXCJudW1iZXJcIl0pO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU0ZGSSA9IFF1aWNrSlNGRkk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mZmkuV0FTTV9SRUxFQVNFX1NZTkMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnNob3VsZEludGVycnVwdEFmdGVyRGVhZGxpbmUgPSBleHBvcnRzLm5ld0FzeW5jQ29udGV4dCA9IGV4cG9ydHMubmV3QXN5bmNSdW50aW1lID0gZXhwb3J0cy5nZXRRdWlja0pTU3luYyA9IGV4cG9ydHMuZ2V0UXVpY2tKUyA9IGV4cG9ydHMuZXJyb3JzID0gZXhwb3J0cy5SRUxFQVNFX1NZTkMgPSBleHBvcnRzLlJFTEVBU0VfQVNZTkMgPSBleHBvcnRzLkRFQlVHX1NZTkMgPSBleHBvcnRzLkRFQlVHX0FTWU5DID0gZXhwb3J0cy5uZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlID0gZXhwb3J0cy5uZXdRdWlja0pTV0FTTU1vZHVsZSA9IHZvaWQgMDtcbi8vIEJ1aWxkIHZhcmlhbnRzXG5jb25zdCB2YXJpYW50c18xID0gcmVxdWlyZShcIi4vdmFyaWFudHNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJuZXdRdWlja0pTV0FTTU1vZHVsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFyaWFudHNfMS5uZXdRdWlja0pTV0FTTU1vZHVsZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm5ld1F1aWNrSlNBc3luY1dBU01Nb2R1bGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhcmlhbnRzXzEubmV3UXVpY2tKU0FzeW5jV0FTTU1vZHVsZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRFQlVHX0FTWU5DXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2YXJpYW50c18xLkRFQlVHX0FTWU5DOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiREVCVUdfU1lOQ1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFyaWFudHNfMS5ERUJVR19TWU5DOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUkVMRUFTRV9BU1lOQ1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFyaWFudHNfMS5SRUxFQVNFX0FTWU5DOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUkVMRUFTRV9TWU5DXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2YXJpYW50c18xLlJFTEVBU0VfU1lOQzsgfSB9KTtcbi8vIEV4cG9ydCBoZWxwZXJzXG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vdm0taW50ZXJmYWNlXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9saWZldGltZVwiKSwgZXhwb3J0cyk7XG4vKiogQ29sbGVjdHMgdGhlIGluZm9ybWF0aXZlIGVycm9ycyB0aGlzIGxpYnJhcnkgbWF5IHRocm93LiAqL1xuZXhwb3J0cy5lcnJvcnMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vZXJyb3JzXCIpKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9kZWZlcnJlZC1wcm9taXNlXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9tb2R1bGUtdGVzdFwiKSwgZXhwb3J0cyk7XG5sZXQgc2luZ2xldG9uID0gdW5kZWZpbmVkO1xubGV0IHNpbmdsZXRvblByb21pc2UgPSB1bmRlZmluZWQ7XG4vKipcbiAqIEdldCBhIHNoYXJlZCBzaW5nbGV0b24ge0BsaW5rIFF1aWNrSlNXQVNNTW9kdWxlfS4gVXNlIHRoaXMgdG8gZXZhbHVhdGUgY29kZVxuICogb3IgY3JlYXRlIEphdmFzY3JpcHQgZW52aXJvbm1lbnRzLlxuICpcbiAqIFRoaXMgaXMgdGhlIHRvcC1sZXZlbCBlbnRyeXBvaW50IGZvciB0aGUgcXVpY2tqcy1lbXNjcmlwdGVuIGxpYnJhcnkuXG4gKlxuICogSWYgeW91IG5lZWQgc3RyaWN0ZXN0IHBvc3NpYmxlIGlzb2xhdGlvbiBndWFyYW50ZWVzLCB5b3UgbWF5IGNyZWF0ZSBhXG4gKiBzZXBhcmF0ZSB7QGxpbmsgUXVpY2tKU1dBU01Nb2R1bGV9IHZpYSB7QGxpbmsgbmV3UXVpY2tKU1dBU01Nb2R1bGV9LlxuICpcbiAqIFRvIHdvcmsgd2l0aCB0aGUgYXN5bmNpZmllZCB2ZXJzaW9uIG9mIHRoaXMgbGlicmFyeSwgc2VlIHRoZXNlIGZ1bmN0aW9uczpcbiAqXG4gKiAtIHtAbGluayBuZXdBc3luY1J1bnRpbWV9LlxuICogLSB7QGxpbmsgbmV3QXN5bmNDb250ZXh0fS5cbiAqIC0ge0BsaW5rIG5ld1F1aWNrSlNBc3luY1dBU01Nb2R1bGV9LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRRdWlja0pTKCkge1xuICAgIHNpbmdsZXRvblByb21pc2UgPz8gKHNpbmdsZXRvblByb21pc2UgPSAoMCwgdmFyaWFudHNfMS5uZXdRdWlja0pTV0FTTU1vZHVsZSkoKS50aGVuKChpbnN0YW5jZSkgPT4ge1xuICAgICAgICBzaW5nbGV0b24gPSBpbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH0pKTtcbiAgICByZXR1cm4gYXdhaXQgc2luZ2xldG9uUHJvbWlzZTtcbn1cbmV4cG9ydHMuZ2V0UXVpY2tKUyA9IGdldFF1aWNrSlM7XG4vKipcbiAqIFByb3ZpZGVzIHN5bmNocm9ub3VzIGFjY2VzcyB0byB0aGUgc2hhcmVkIHtAbGluayBRdWlja0pTV0FTTU1vZHVsZX0gaW5zdGFuY2UgcmV0dXJuZWQgYnkge0BsaW5rIGdldFF1aWNrSlN9LCBhcyBsb25nIGFzXG4gKiBsZWFzdCBvbmNlLlxuICogQHRocm93cyBJZiBjYWxsZWQgYmVmb3JlIGBnZXRRdWlja0pTYCByZXNvbHZlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0UXVpY2tKU1N5bmMoKSB7XG4gICAgaWYgKCFzaW5nbGV0b24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUXVpY2tKUyBub3QgaW5pdGlhbGl6ZWQuIEF3YWl0IGdldFF1aWNrSlMoKSBhdCBsZWFzdCBvbmNlLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHNpbmdsZXRvbjtcbn1cbmV4cG9ydHMuZ2V0UXVpY2tKU1N5bmMgPSBnZXRRdWlja0pTU3luYztcbi8qKlxuICogQ3JlYXRlIGEgbmV3IFtbUXVpY2tKU0FzeW5jUnVudGltZV1dIGluIGEgc2VwYXJhdGUgV2ViQXNzZW1ibHkgbW9kdWxlLlxuICpcbiAqIEVhY2ggcnVudGltZSBpcyBpc29sYXRlZCBpbiBhIHNlcGFyYXRlIFdlYkFzc2VtYmx5IG1vZHVsZSwgc28gdGhhdCBlcnJvcnMgaW5cbiAqIG9uZSBydW50aW1lIGNhbm5vdCBjb250YW1pbmF0ZSBhbm90aGVyIHJ1bnRpbWUsIGFuZCBlYWNoIHJ1bnRpbWUgY2FuIGV4ZWN1dGVcbiAqIGFuIGFzeW5jaHJvbm91cyBhY3Rpb24gd2l0aG91dCBjb25mbGljdHMuXG4gKlxuICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgaGFyZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIFdlYkFzc2VtYmx5IG1vZHVsZXMgaW4gb2xkZXJcbiAqIHZlcnNpb25zIG9mIHY4OlxuICogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTIwNzZcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbmV3QXN5bmNSdW50aW1lKG9wdGlvbnMpIHtcbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCAoMCwgdmFyaWFudHNfMS5uZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlKSgpO1xuICAgIHJldHVybiBtb2R1bGUubmV3UnVudGltZShvcHRpb25zKTtcbn1cbmV4cG9ydHMubmV3QXN5bmNSdW50aW1lID0gbmV3QXN5bmNSdW50aW1lO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcgW1tRdWlja0pTQXN5bmNDb250ZXh0XV0gKHdpdGggYW4gYXNzb2NpYXRlZCBydW50aW1lKSBpbiBhblxuICogc2VwYXJhdGUgV2ViQXNzZW1ibHkgbW9kdWxlLlxuICpcbiAqIEVhY2ggY29udGV4dCBpcyBpc29sYXRlZCBpbiBhIHNlcGFyYXRlIFdlYkFzc2VtYmx5IG1vZHVsZSwgc28gdGhhdCBlcnJvcnMgaW5cbiAqIG9uZSBydW50aW1lIGNhbm5vdCBjb250YW1pbmF0ZSBhbm90aGVyIHJ1bnRpbWUsIGFuZCBlYWNoIHJ1bnRpbWUgY2FuIGV4ZWN1dGVcbiAqIGFuIGFzeW5jaHJvbm91cyBhY3Rpb24gd2l0aG91dCBjb25mbGljdHMuXG4gKlxuICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgaGFyZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIFdlYkFzc2VtYmx5IG1vZHVsZXMgaW4gb2xkZXJcbiAqIHZlcnNpb25zIG9mIHY4OlxuICogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTIwNzZcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbmV3QXN5bmNDb250ZXh0KG9wdGlvbnMpIHtcbiAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCAoMCwgdmFyaWFudHNfMS5uZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlKSgpO1xuICAgIHJldHVybiBtb2R1bGUubmV3Q29udGV4dChvcHRpb25zKTtcbn1cbmV4cG9ydHMubmV3QXN5bmNDb250ZXh0ID0gbmV3QXN5bmNDb250ZXh0O1xuLyoqXG4gKiBSZXR1cm5zIGFuIGludGVycnVwdCBoYW5kbGVyIHRoYXQgaW50ZXJydXB0cyBKYXZhc2NyaXB0IGV4ZWN1dGlvbiBhZnRlciBhIGRlYWRsaW5lIHRpbWUuXG4gKlxuICogQHBhcmFtIGRlYWRsaW5lIC0gSW50ZXJydXB0IGV4ZWN1dGlvbiBpZiBpdCdzIHN0aWxsIHJ1bm5pbmcgYWZ0ZXIgdGhpcyB0aW1lLlxuICogICBOdW1iZXIgdmFsdWVzIGFyZSBjb21wYXJlZCBhZ2FpbnN0IGBEYXRlLm5vdygpYFxuICovXG5mdW5jdGlvbiBzaG91bGRJbnRlcnJ1cHRBZnRlckRlYWRsaW5lKGRlYWRsaW5lKSB7XG4gICAgY29uc3QgZGVhZGxpbmVBc051bWJlciA9IHR5cGVvZiBkZWFkbGluZSA9PT0gXCJudW1iZXJcIiA/IGRlYWRsaW5lIDogZGVhZGxpbmUuZ2V0VGltZSgpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpID4gZGVhZGxpbmVBc051bWJlcjtcbiAgICB9O1xufVxuZXhwb3J0cy5zaG91bGRJbnRlcnJ1cHRBZnRlckRlYWRsaW5lID0gc2hvdWxkSW50ZXJydXB0QWZ0ZXJEZWFkbGluZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TY29wZSA9IGV4cG9ydHMuV2Vha0xpZmV0aW1lID0gZXhwb3J0cy5TdGF0aWNMaWZldGltZSA9IGV4cG9ydHMuTGlmZXRpbWUgPSB2b2lkIDA7XG5jb25zdCBhc3luY2lmeV9oZWxwZXJzXzEgPSByZXF1aXJlKFwiLi9hc3luY2lmeS1oZWxwZXJzXCIpO1xuY29uc3QgZGVidWdfMSA9IHJlcXVpcmUoXCIuL2RlYnVnXCIpO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi9lcnJvcnNcIik7XG4vKipcbiAqIEEgbGlmZXRpbWUgcHJldmVudHMgYWNjZXNzIHRvIGEgdmFsdWUgYWZ0ZXIgdGhlIGxpZmV0aW1lIGhhcyBiZWVuXG4gKiBbW2Rpc3Bvc2VdXWVkLlxuICpcbiAqIFR5cGljYWxseSwgcXVpY2tqcy1lbXNjcmlwdGVuIHVzZXMgTGlmZXRpbWVzIHRvIHByb3RlY3QgQyBtZW1vcnkgcG9pbnRlcnMuXG4gKi9cbmNsYXNzIExpZmV0aW1lIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBMaWZldGltZSBpcyBkaXNwb3NlZCwgaXQgd2lsbCBjYWxsIGBkaXNwb3NlcihfdmFsdWUpYC4gVXNlIHRoZVxuICAgICAqIGRpc3Bvc2VyIGZ1bmN0aW9uIHRvIGltcGxlbWVudCB3aGF0ZXZlciBjbGVhbnVwIG5lZWRzIHRvIGhhcHBlbiBhdCB0aGUgZW5kXG4gICAgICogb2YgYHZhbHVlYCdzIGxpZmV0aW1lLlxuICAgICAqXG4gICAgICogYF9vd25lcmAgaXMgbm90IHVzZWQgb3IgY29udHJvbGxlZCBieSB0aGUgbGlmZXRpbWUuIEl0J3MganVzdCBtZXRhZGF0YSBmb3JcbiAgICAgKiB0aGUgY3JlYXRvci5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihfdmFsdWUsIGNvcGllciwgZGlzcG9zZXIsIF9vd25lcikge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IF92YWx1ZTtcbiAgICAgICAgdGhpcy5jb3BpZXIgPSBjb3BpZXI7XG4gICAgICAgIHRoaXMuZGlzcG9zZXIgPSBkaXNwb3NlcjtcbiAgICAgICAgdGhpcy5fb3duZXIgPSBfb3duZXI7XG4gICAgICAgIHRoaXMuX2FsaXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY29uc3RydWN0b3JTdGFjayA9IGRlYnVnXzEuUVRTX0RFQlVHID8gbmV3IEVycm9yKFwiTGlmZXRpbWUgY29uc3RydWN0ZWRcIikuc3RhY2sgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCBhbGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsaXZlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgdGhpcyBMaWZldGltZSBwcm90ZWN0cy4gWW91IG11c3QgbmV2ZXIgcmV0YWluIHRoZSB2YWx1ZSAtIGl0XG4gICAgICogbWF5IGJlY29tZSBpbnZhbGlkLCBsZWFkaW5nIHRvIG1lbW9yeSBlcnJvcnMuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIElmIHRoZSBsaWZldGltZSBoYXMgYmVlbiBbW2Rpc3Bvc2VdXWQgYWxyZWFkeS5cbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0QWxpdmUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICBnZXQgb3duZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vd25lcjtcbiAgICB9XG4gICAgZ2V0IGR1cGFibGUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuY29waWVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgaGFuZGxlIHBvaW50aW5nIHRvIHRoZSBzYW1lIFtbdmFsdWVdXS5cbiAgICAgKi9cbiAgICBkdXAoKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0QWxpdmUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmNvcGllcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9uLWR1cGFibGUgbGlmZXRpbWVcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBMaWZldGltZSh0aGlzLmNvcGllcih0aGlzLl92YWx1ZSksIHRoaXMuY29waWVyLCB0aGlzLmRpc3Bvc2VyLCB0aGlzLl9vd25lcik7XG4gICAgfVxuICAgIGNvbnN1bWUobWFwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0QWxpdmUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbWFwKHRoaXMpO1xuICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZSBvZiBbW3ZhbHVlXV0gYW5kIHBlcmZvcm0gY2xlYW51cC5cbiAgICAgKi9cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmFzc2VydEFsaXZlKCk7XG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2VyKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VyKHRoaXMuX3ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hbGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgICBhc3NlcnRBbGl2ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFsaXZlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY29uc3RydWN0b3JTdGFjaykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTVXNlQWZ0ZXJGcmVlKGBMaWZldGltZSBub3QgYWxpdmVcXG4ke3RoaXMuX2NvbnN0cnVjdG9yU3RhY2t9XFxuTGlmZXRpbWUgdXNlZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNVc2VBZnRlckZyZWUoXCJMaWZldGltZSBub3QgYWxpdmVcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkxpZmV0aW1lID0gTGlmZXRpbWU7XG4vKipcbiAqIEEgTGlmZXRpbWUgdGhhdCBsaXZlcyBmb3JldmVyLiBVc2VkIGZvciBjb25zdGFudHMuXG4gKi9cbmNsYXNzIFN0YXRpY0xpZmV0aW1lIGV4dGVuZHMgTGlmZXRpbWUge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlLCBvd25lcikge1xuICAgICAgICBzdXBlcih2YWx1ZSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG93bmVyKTtcbiAgICB9XG4gICAgLy8gU3RhdGljIGxpZmV0aW1lIGRvZXNuJ3QgbmVlZCBhIGNvcGllciB0byBiZSBjb3BpYWJsZVxuICAgIGdldCBkdXBhYmxlKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQ29weSByZXR1cm5zIHRoZSBzYW1lIGluc3RhbmNlLlxuICAgIGR1cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8vIERpc3Bvc2UgZG9lcyBub3RoaW5nLlxuICAgIGRpc3Bvc2UoKSB7IH1cbn1cbmV4cG9ydHMuU3RhdGljTGlmZXRpbWUgPSBTdGF0aWNMaWZldGltZTtcbi8qKlxuICogQSBMaWZldGltZSB0aGF0IGRvZXMgbm90IG93biBpdHMgYHZhbHVlYC4gQSBXZWFrTGlmZXRpbWUgbmV2ZXIgY2FsbHMgaXRzXG4gKiBgZGlzcG9zZXJgIGZ1bmN0aW9uLCBidXQgY2FuIGJlIGBkdXBgZWQgdG8gcHJvZHVjZSByZWd1bGFyIGxpZmV0aW1lcyB0aGF0XG4gKiBkby5cbiAqXG4gKiBVc2VkIGZvciBmdW5jdGlvbiBhcmd1bWVudHMuXG4gKi9cbmNsYXNzIFdlYWtMaWZldGltZSBleHRlbmRzIExpZmV0aW1lIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSwgY29waWVyLCBkaXNwb3Nlciwgb3duZXIpIHtcbiAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZSBpZiB0aGUgZGlzcG9zZXIgZG9lc24ndCBzdXBwb3J0IGZyZWVpbmcgVFxuICAgICAgICBzdXBlcih2YWx1ZSwgY29waWVyLCBkaXNwb3Nlciwgb3duZXIpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLl9hbGl2ZSA9IGZhbHNlO1xuICAgIH1cbn1cbmV4cG9ydHMuV2Vha0xpZmV0aW1lID0gV2Vha0xpZmV0aW1lO1xuZnVuY3Rpb24gc2NvcGVGaW5hbGx5KHNjb3BlLCBibG9ja0Vycm9yKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ3Njb3BlRmluYWxseScsIHNjb3BlLCBibG9ja0Vycm9yKVxuICAgIGxldCBkaXNwb3NlRXJyb3I7XG4gICAgdHJ5IHtcbiAgICAgICAgc2NvcGUuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZGlzcG9zZUVycm9yID0gZXJyb3I7XG4gICAgfVxuICAgIGlmIChibG9ja0Vycm9yICYmIGRpc3Bvc2VFcnJvcikge1xuICAgICAgICBPYmplY3QuYXNzaWduKGJsb2NrRXJyb3IsIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke2Jsb2NrRXJyb3IubWVzc2FnZX1cXG4gVGhlbiwgZmFpbGVkIHRvIGRpc3Bvc2Ugc2NvcGU6ICR7ZGlzcG9zZUVycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgIGRpc3Bvc2VFcnJvcixcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IGJsb2NrRXJyb3I7XG4gICAgfVxuICAgIGlmIChibG9ja0Vycm9yIHx8IGRpc3Bvc2VFcnJvcikge1xuICAgICAgICB0aHJvdyBibG9ja0Vycm9yIHx8IGRpc3Bvc2VFcnJvcjtcbiAgICB9XG59XG4vKipcbiAqIFNjb3BlIGhlbHBzIHJlZHVjZSB0aGUgYnVyZGVuIG9mIG1hbnVhbGx5IHRyYWNraW5nIGFuZCBkaXNwb3Npbmcgb2ZcbiAqIExpZmV0aW1lcy4gU2VlIFtbd2l0aFNjb3BlXV0uIGFuZCBbW3dpdGhTY29wZUFzeW5jXV0uXG4gKi9cbmNsYXNzIFNjb3BlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fZGlzcG9zYWJsZXMgPSBuZXcgTGlmZXRpbWUobmV3IFNldCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVuIGBibG9ja2Agd2l0aCBhIG5ldyBTY29wZSBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgZGlzcG9zZWQgYWZ0ZXIgdGhlIGJsb2NrIHJldHVybnMuXG4gICAgICogSW5zaWRlIGBibG9ja2AsIGNhbGwgYHNjb3BlLm1hbmFnZWAgb24gZWFjaCBsaWZldGltZSB5b3UgY3JlYXRlIHRvIGhhdmUgdGhlIGxpZmV0aW1lXG4gICAgICogYXV0b21hdGljYWxseSBkaXNwb3NlZCBhZnRlciB0aGUgYmxvY2sgcmV0dXJucy5cbiAgICAgKlxuICAgICAqIEB3YXJuaW5nIERvIG5vdCB1c2Ugd2l0aCBhc3luYyBmdW5jdGlvbnMuIEluc3RlYWQsIHVzZSBbW3dpdGhTY29wZUFzeW5jXV0uXG4gICAgICovXG4gICAgc3RhdGljIHdpdGhTY29wZShibG9jaykge1xuICAgICAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZSgpO1xuICAgICAgICBsZXQgYmxvY2tFcnJvcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBibG9jayhzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBibG9ja0Vycm9yID0gZXJyb3I7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNjb3BlRmluYWxseShzY29wZSwgYmxvY2tFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIHdpdGhTY29wZU1heWJlQXN5bmMoX3RoaXMsIGJsb2NrKSB7XG4gICAgICAgIHJldHVybiAoMCwgYXN5bmNpZnlfaGVscGVyc18xLm1heWJlQXN5bmMpKHVuZGVmaW5lZCwgZnVuY3Rpb24qIChhd2FpdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZSgpO1xuICAgICAgICAgICAgbGV0IGJsb2NrRXJyb3I7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogYXdhaXRlZC5vZihibG9jay5jYWxsKF90aGlzLCBhd2FpdGVkLCBzY29wZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgYmxvY2tFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2NvcGVGaW5hbGx5KHNjb3BlLCBibG9ja0Vycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJ1biBgYmxvY2tgIHdpdGggYSBuZXcgU2NvcGUgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIGRpc3Bvc2VkIGFmdGVyIHRoZVxuICAgICAqIGJsb2NrJ3MgcmV0dXJuZWQgcHJvbWlzZSBzZXR0bGVzLiBJbnNpZGUgYGJsb2NrYCwgY2FsbCBgc2NvcGUubWFuYWdlYCBvbiBlYWNoXG4gICAgICogbGlmZXRpbWUgeW91IGNyZWF0ZSB0byBoYXZlIHRoZSBsaWZldGltZSBhdXRvbWF0aWNhbGx5IGRpc3Bvc2VkIGFmdGVyIHRoZVxuICAgICAqIGJsb2NrIHJldHVybnMuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHdpdGhTY29wZUFzeW5jKGJsb2NrKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKCk7XG4gICAgICAgIGxldCBibG9ja0Vycm9yO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGJsb2NrKHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGJsb2NrRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc2NvcGVGaW5hbGx5KHNjb3BlLCBibG9ja0Vycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmFjayBgbGlmZXRpbWVgIHNvIHRoYXQgaXQgaXMgZGlzcG9zZWQgd2hlbiB0aGlzIHNjb3BlIGlzIGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIG1hbmFnZShsaWZldGltZSkge1xuICAgICAgICB0aGlzLl9kaXNwb3NhYmxlcy52YWx1ZS5hZGQobGlmZXRpbWUpO1xuICAgICAgICByZXR1cm4gbGlmZXRpbWU7XG4gICAgfVxuICAgIGdldCBhbGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3Bvc2FibGVzLmFsaXZlO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICBjb25zdCBsaWZldGltZXMgPSBBcnJheS5mcm9tKHRoaXMuX2Rpc3Bvc2FibGVzLnZhbHVlLnZhbHVlcygpKS5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAoY29uc3QgbGlmZXRpbWUgb2YgbGlmZXRpbWVzKSB7XG4gICAgICAgICAgICBpZiAobGlmZXRpbWUuYWxpdmUpIHtcbiAgICAgICAgICAgICAgICBsaWZldGltZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlzcG9zYWJsZXMuZGlzcG9zZSgpO1xuICAgIH1cbn1cbmV4cG9ydHMuU2NvcGUgPSBTY29wZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxpZmV0aW1lLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Nb2R1bGVNZW1vcnkgPSB2b2lkIDA7XG5jb25zdCBsaWZldGltZV8xID0gcmVxdWlyZShcIi4vbGlmZXRpbWVcIik7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIE1vZHVsZU1lbW9yeSB7XG4gICAgY29uc3RydWN0b3IobW9kdWxlKSB7XG4gICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlO1xuICAgIH1cbiAgICB0b1BvaW50ZXJBcnJheShoYW5kbGVBcnJheSkge1xuICAgICAgICBjb25zdCB0eXBlZEFycmF5ID0gbmV3IEludDMyQXJyYXkoaGFuZGxlQXJyYXkubWFwKChoYW5kbGUpID0+IGhhbmRsZS52YWx1ZSkpO1xuICAgICAgICBjb25zdCBudW1CeXRlcyA9IHR5cGVkQXJyYXkubGVuZ3RoICogdHlwZWRBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5tb2R1bGUuX21hbGxvYyhudW1CeXRlcyk7XG4gICAgICAgIHZhciBoZWFwQnl0ZXMgPSBuZXcgVWludDhBcnJheSh0aGlzLm1vZHVsZS5IRUFQVTguYnVmZmVyLCBwdHIsIG51bUJ5dGVzKTtcbiAgICAgICAgaGVhcEJ5dGVzLnNldChuZXcgVWludDhBcnJheSh0eXBlZEFycmF5LmJ1ZmZlcikpO1xuICAgICAgICByZXR1cm4gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUocHRyLCB1bmRlZmluZWQsIChwdHIpID0+IHRoaXMubW9kdWxlLl9mcmVlKHB0cikpO1xuICAgIH1cbiAgICBuZXdNdXRhYmxlUG9pbnRlckFycmF5KGxlbmd0aCkge1xuICAgICAgICBjb25zdCB6ZXJvcyA9IG5ldyBJbnQzMkFycmF5KG5ldyBBcnJheShsZW5ndGgpLmZpbGwoMCkpO1xuICAgICAgICBjb25zdCBudW1CeXRlcyA9IHplcm9zLmxlbmd0aCAqIHplcm9zLkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLm1vZHVsZS5fbWFsbG9jKG51bUJ5dGVzKTtcbiAgICAgICAgY29uc3QgdHlwZWRBcnJheSA9IG5ldyBJbnQzMkFycmF5KHRoaXMubW9kdWxlLkhFQVBVOC5idWZmZXIsIHB0ciwgbGVuZ3RoKTtcbiAgICAgICAgdHlwZWRBcnJheS5zZXQoemVyb3MpO1xuICAgICAgICByZXR1cm4gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUoeyB0eXBlZEFycmF5LCBwdHIgfSwgdW5kZWZpbmVkLCAodmFsdWUpID0+IHRoaXMubW9kdWxlLl9mcmVlKHZhbHVlLnB0cikpO1xuICAgIH1cbiAgICBuZXdIZWFwQ2hhclBvaW50ZXIoc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG51bUJ5dGVzID0gdGhpcy5tb2R1bGUubGVuZ3RoQnl0ZXNVVEY4KHN0cmluZykgKyAxO1xuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLm1vZHVsZS5fbWFsbG9jKG51bUJ5dGVzKTtcbiAgICAgICAgdGhpcy5tb2R1bGUuc3RyaW5nVG9VVEY4KHN0cmluZywgcHRyLCBudW1CeXRlcyk7XG4gICAgICAgIHJldHVybiBuZXcgbGlmZXRpbWVfMS5MaWZldGltZShwdHIsIHVuZGVmaW5lZCwgKHZhbHVlKSA9PiB0aGlzLm1vZHVsZS5fZnJlZSh2YWx1ZSkpO1xuICAgIH1cbiAgICBjb25zdW1lSGVhcENoYXJQb2ludGVyKHB0cikge1xuICAgICAgICBjb25zdCBzdHIgPSB0aGlzLm1vZHVsZS5VVEY4VG9TdHJpbmcocHRyKTtcbiAgICAgICAgdGhpcy5tb2R1bGUuX2ZyZWUocHRyKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG59XG5leHBvcnRzLk1vZHVsZU1lbW9yeSA9IE1vZHVsZU1lbW9yeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9yeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU0FzeW5jV0FTTU1vZHVsZSA9IHZvaWQgMDtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuY29uc3QgbGlmZXRpbWVfMSA9IHJlcXVpcmUoXCIuL2xpZmV0aW1lXCIpO1xuY29uc3QgbW9kdWxlXzEgPSByZXF1aXJlKFwiLi9tb2R1bGVcIik7XG5jb25zdCBydW50aW1lX2FzeW5jaWZ5XzEgPSByZXF1aXJlKFwiLi9ydW50aW1lLWFzeW5jaWZ5XCIpO1xuLyoqXG4gKiBBc3luY2lmaWVkIHZlcnNpb24gb2YgW1tRdWlja0pTV0FTTU1vZHVsZV1dLlxuICpcbiAqIER1ZSB0byBsaW1pdGF0aW9ucyBvZiBFbXNjcmlwdGVuJ3MgQVNZTkNJRlkgcHJvY2Vzcywgb25seSBhIHNpbmdsZSBhc3luY1xuICogZnVuY3Rpb24gY2FsbCBjYW4gaGFwcGVuIGF0IGEgdGltZSBhY3Jvc3MgdGhlIGVudGlyZSBXZWJBc3NlbWJseSBtb2R1bGUuXG4gKlxuICogVGhhdCBtZWFucyB0aGF0IGFsbCBydW50aW1lcywgY29udGV4dHMsIGZ1bmN0aW9ucywgZXRjIGNyZWF0ZWQgaW5zaWRlIHRoaXNcbiAqIFdlYkFzc2VtYmx5IGFyZSBsaW1pdGVkIHRvIGEgc2luZ2xlIGNvbmN1cnJlbnQgYXN5bmMgYWN0aW9uLlxuICogKipNdWx0aXBsZSBjb25jdXJyZW50IGFzeW5jIGFjdGlvbnMgaXMgYW4gZXJyb3IuKipcbiAqXG4gKiBUbyBhbGxvdyBmb3IgbXVsdGlwbGUgY29uY3VycmVudCBhc3luYyBhY3Rpb25zLCB5b3UgbXVzdCBjcmVhdGUgbXVsdGlwbGUgV2ViQXNzZW1ibHlcbiAqIG1vZHVsZXMuXG4gKi9cbmNsYXNzIFF1aWNrSlNBc3luY1dBU01Nb2R1bGUgZXh0ZW5kcyBtb2R1bGVfMS5RdWlja0pTV0FTTU1vZHVsZSB7XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgY29uc3RydWN0b3IobW9kdWxlLCBmZmkpIHtcbiAgICAgICAgc3VwZXIobW9kdWxlLCBmZmkpO1xuICAgICAgICB0aGlzLmZmaSA9IGZmaTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBhc3luYyBydW50aW1lIGluc2lkZSB0aGlzIFdlYkFzc2VtYmx5IG1vZHVsZS4gQWxsIHJ1bnRpbWVzIGluc2lkZSBhXG4gICAgICogbW9kdWxlIGFyZSBsaW1pdGVkIHRvIGEgc2luZ2xlIGFzeW5jIGNhbGwgYXQgYSB0aW1lLiBGb3IgbXVsdGlwbGVcbiAgICAgKiBjb25jdXJyZW50IGFzeW5jIGFjdGlvbnMsIGNyZWF0ZSBtdWx0aXBsZSBXZWJBc3NlbWJseSBtb2R1bGVzLlxuICAgICAqL1xuICAgIG5ld1J1bnRpbWUob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHJ0ID0gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUodGhpcy5mZmkuUVRTX05ld1J1bnRpbWUoKSwgdW5kZWZpbmVkLCAocnRfcHRyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5kZWxldGVSdW50aW1lKHJ0X3B0cik7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZVJ1bnRpbWUocnRfcHRyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWUgPSBuZXcgcnVudGltZV9hc3luY2lmeV8xLlF1aWNrSlNBc3luY1J1bnRpbWUoe1xuICAgICAgICAgICAgbW9kdWxlOiB0aGlzLm1vZHVsZSxcbiAgICAgICAgICAgIGZmaTogdGhpcy5mZmksXG4gICAgICAgICAgICBydCxcbiAgICAgICAgICAgIGNhbGxiYWNrczogdGhpcy5jYWxsYmFja3MsXG4gICAgICAgIH0pO1xuICAgICAgICAoMCwgbW9kdWxlXzEuYXBwbHlCYXNlUnVudGltZU9wdGlvbnMpKHJ1bnRpbWUsIG9wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucy5tb2R1bGVMb2FkZXIpIHtcbiAgICAgICAgICAgIHJ1bnRpbWUuc2V0TW9kdWxlTG9hZGVyKG9wdGlvbnMubW9kdWxlTG9hZGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnVudGltZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzaW1wbGlmaWVkIEFQSSB0byBjcmVhdGUgYSBuZXcgW1tRdWlja0pTUnVudGltZV1dIGFuZCBhXG4gICAgICogW1tRdWlja0pTQ29udGV4dF1dIGluc2lkZSB0aGF0IHJ1bnRpbWUgYXQgdGhlIHNhbWUgdGltZS4gVGhlIHJ1bnRpbWUgd2lsbFxuICAgICAqIGJlIGRpc3Bvc2VkIHdoZW4gdGhlIGNvbnRleHQgaXMgZGlzcG9zZWQuXG4gICAgICovXG4gICAgbmV3Q29udGV4dChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgcnVudGltZSA9IHRoaXMubmV3UnVudGltZSgpO1xuICAgICAgICBjb25zdCBsaWZldGltZXMgPSBvcHRpb25zLm93bmVkTGlmZXRpbWVzID8gb3B0aW9ucy5vd25lZExpZmV0aW1lcy5jb25jYXQoW3J1bnRpbWVdKSA6IFtydW50aW1lXTtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHJ1bnRpbWUubmV3Q29udGV4dCh7IC4uLm9wdGlvbnMsIG93bmVkTGlmZXRpbWVzOiBsaWZldGltZXMgfSk7XG4gICAgICAgIHJ1bnRpbWUuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiAgICAvKiogU3luY2hyb25vdXMgZXZhbENvZGUgaXMgbm90IHN1cHBvcnRlZC4gKi9cbiAgICBldmFsQ29kZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNOb3RJbXBsZW1lbnRlZChcIlF1aWNrSlNXQVNNTW9kdWxlQXN5bmNpZnkuZXZhbENvZGU6IHVzZSBldmFsQ29kZUFzeW5jIGluc3RlYWRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9uZS1vZmYgZXZhbHVhdGUgY29kZSB3aXRob3V0IG5lZWRpbmcgdG8gY3JlYXRlIGEgW1tRdWlja0pTUnVudGltZUFzeW5jXV0gb3JcbiAgICAgKiBbW1F1aWNrSlNDb250ZXh0U3luY11dIGV4cGxpY2l0bHkuXG4gICAgICpcbiAgICAgKiBUaGlzIHZlcnNpb24gYWxsb3dzIGZvciBhc3luY2hyb25vdXMgRWNtYXNjcmlwdCBtb2R1bGUgbG9hZGluZy5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBvbmx5IGEgc2luZ2xlIGFzeW5jIGFjdGlvbiBjYW4gb2NjdXIgYXQgYSB0aW1lIGluc2lkZSB0aGUgZW50aXJlIFdlYkFzc2VtYmx5IG1vZHVsZS5cbiAgICAgKiAqKk11bHRpcGxlIGNvbmN1cnJlbnQgYXN5bmMgYWN0aW9ucyBpcyBhbiBlcnJvci4qKlxuICAgICAqXG4gICAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBbW1F1aWNrSlNXQVNNTW9kdWxlLmV2YWxDb2RlXV0gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKi9cbiAgICBldmFsQ29kZUFzeW5jKGNvZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIHJlYWxseSBmaWd1cmUgb3V0IGdlbmVyYXRvciBmb3IgdGhlIFByb21pc2UgbW9uYWQuLi5cbiAgICAgICAgcmV0dXJuIGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlQXN5bmMoYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2bSA9IHNjb3BlLm1hbmFnZSh0aGlzLm5ld0NvbnRleHQoKSk7XG4gICAgICAgICAgICAoMCwgbW9kdWxlXzEuYXBwbHlNb2R1bGVFdmFsUnVudGltZU9wdGlvbnMpKHZtLnJ1bnRpbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdm0uZXZhbENvZGVBc3luYyhjb2RlLCBcImV2YWwuanNcIik7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tZW1vcnlMaW1pdEJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbWVtb3J5IGxpbWl0IHNvIHdlIGNhbiBkdW1wIHRoZSByZXN1bHQgd2l0aG91dCBleGNlZWRpbmcgaXQuXG4gICAgICAgICAgICAgICAgdm0ucnVudGltZS5zZXRNZW1vcnlMaW1pdCgtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB2bS5kdW1wKHNjb3BlLm1hbmFnZShyZXN1bHQuZXJyb3IpKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdm0uZHVtcChzY29wZS5tYW5hZ2UocmVzdWx0LnZhbHVlKSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU0FzeW5jV0FTTU1vZHVsZSA9IFF1aWNrSlNBc3luY1dBU01Nb2R1bGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2R1bGUtYXN5bmNpZnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlRlc3RRdWlja0pTV0FTTU1vZHVsZSA9IHZvaWQgMDtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuY29uc3QgbGlmZXRpbWVfMSA9IHJlcXVpcmUoXCIuL2xpZmV0aW1lXCIpO1xuLyoqXG4gKiBBIHRlc3Qgd3JhcHBlciBvZiBbW1F1aWNrSlNXQVNNTW9kdWxlXV0gdGhhdCBrZWVwcyBhIHJlZmVyZW5jZSB0byBlYWNoXG4gKiBjb250ZXh0IG9yIHJ1bnRpbWUgY3JlYXRlZC5cbiAqXG4gKiBDYWxsIFtbZGlzcG9zZUFsbF1dIHRvIHJlc2V0IHRoZXNlIHNldHMgYW5kIGNhbGxzIGBkaXNwb3NlYCBvbiBhbnkgbGVmdCBhbGl2ZVxuICogKHdoaWNoIG1heSB0aHJvdyBhbiBlcnJvcikuXG4gKlxuICogQ2FsbCBbW2Fzc2VydE5vTWVtb3J5QWxsb2NhdGVkXV0gYXQgdGhlIGVuZCBvZiBhIHRlc3QsIHdoZW4geW91IGV4cGVjdCB0aGF0IHlvdSd2ZVxuICogZnJlZWQgYWxsIHRoZSBtZW1vcnkgeW91J3ZlIGV2ZXIgYWxsb2NhdGVkLlxuICovXG5jbGFzcyBUZXN0UXVpY2tKU1dBU01Nb2R1bGUge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5jb250ZXh0cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgdGhpcy5ydW50aW1lcyA9IG5ldyBTZXQoKTtcbiAgICB9XG4gICAgbmV3UnVudGltZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnBhcmVudC5uZXdSdW50aW1lKHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBvd25lZExpZmV0aW1lczogW1xuICAgICAgICAgICAgICAgIG5ldyBsaWZldGltZV8xLkxpZmV0aW1lKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoKSA9PiB0aGlzLnJ1bnRpbWVzLmRlbGV0ZShydW50aW1lKSksXG4gICAgICAgICAgICAgICAgLi4uKG9wdGlvbnM/Lm93bmVkTGlmZXRpbWVzID8/IFtdKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJ1bnRpbWVzLmFkZChydW50aW1lKTtcbiAgICAgICAgcmV0dXJuIHJ1bnRpbWU7XG4gICAgfVxuICAgIG5ld0NvbnRleHQob3B0aW9ucykge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wYXJlbnQubmV3Q29udGV4dCh7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgb3duZWRMaWZldGltZXM6IFtcbiAgICAgICAgICAgICAgICBuZXcgbGlmZXRpbWVfMS5MaWZldGltZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgKCkgPT4gdGhpcy5jb250ZXh0cy5kZWxldGUoY29udGV4dCkpLFxuICAgICAgICAgICAgICAgIC4uLihvcHRpb25zPy5vd25lZExpZmV0aW1lcyA/PyBbXSksXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb250ZXh0cy5hZGQoY29udGV4dCk7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiAgICBldmFsQ29kZShjb2RlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5ldmFsQ29kZShjb2RlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgZGlzcG9zZUFsbCgpIHtcbiAgICAgICAgY29uc3QgYWxsRGlzcG9zYWJsZXMgPSBbLi4udGhpcy5jb250ZXh0cywgLi4udGhpcy5ydW50aW1lc107XG4gICAgICAgIHRoaXMucnVudGltZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0cy5jbGVhcigpO1xuICAgICAgICBhbGxEaXNwb3NhYmxlcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICAgICAgICBpZiAoZC5hbGl2ZSkge1xuICAgICAgICAgICAgICAgIGQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXNzZXJ0Tm9NZW1vcnlBbGxvY2F0ZWQoKSB7XG4gICAgICAgIGNvbnN0IGxlYWtzRGV0ZWN0ZWQgPSB0aGlzLmdldEZGSSgpLlFUU19SZWNvdmVyYWJsZUxlYWtDaGVjaygpO1xuICAgICAgICBpZiAobGVha3NEZXRlY3RlZCkge1xuICAgICAgICAgICAgLy8gTm90ZTogdGhpcyBpcyBjdXJyZW50bHkgb25seSBhdmFpbGFibGUgd2hlbiBidWlsZGluZyBmcm9tIHNvdXJjZVxuICAgICAgICAgICAgLy8gd2l0aCBkZWJ1ZyBidWlsZHMuXG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuUXVpY2tKU01lbW9yeUxlYWtEZXRlY3RlZChcIkxlYWsgc2FuaXRpemVyIGRldGVjdGVkIHVuLWZyZWVkIG1lbW9yeVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb250ZXh0cy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQoYCR7dGhpcy5jb250ZXh0cy5zaXplfSBjb250ZXh0cyBsZWFrZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ydW50aW1lcy5zaXplID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQoYCR7dGhpcy5ydW50aW1lcy5zaXplfSBydW50aW1lcyBsZWFrZWRgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXRGRkkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5nZXRGRkkoKTtcbiAgICB9XG59XG5leHBvcnRzLlRlc3RRdWlja0pTV0FTTU1vZHVsZSA9IFRlc3RRdWlja0pTV0FTTU1vZHVsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZHVsZS10ZXN0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWlja0pTV0FTTU1vZHVsZSA9IGV4cG9ydHMuYXBwbHlNb2R1bGVFdmFsUnVudGltZU9wdGlvbnMgPSBleHBvcnRzLmFwcGx5QmFzZVJ1bnRpbWVPcHRpb25zID0gZXhwb3J0cy5RdWlja0pTTW9kdWxlQ2FsbGJhY2tzID0gdm9pZCAwO1xuY29uc3QgZGVidWdfMSA9IHJlcXVpcmUoXCIuL2RlYnVnXCIpO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi9lcnJvcnNcIik7XG5jb25zdCBsaWZldGltZV8xID0gcmVxdWlyZShcIi4vbGlmZXRpbWVcIik7XG5jb25zdCBydW50aW1lXzEgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuY29uc3QgdHlwZXNfMSA9IHJlcXVpcmUoXCIuL3R5cGVzXCIpO1xuY2xhc3MgUXVpY2tKU0Vtc2NyaXB0ZW5Nb2R1bGVDYWxsYmFja3Mge1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MpIHtcbiAgICAgICAgdGhpcy5jYWxsRnVuY3Rpb24gPSBhcmdzLmNhbGxGdW5jdGlvbjtcbiAgICAgICAgdGhpcy5zaG91bGRJbnRlcnJ1cHQgPSBhcmdzLnNob3VsZEludGVycnVwdDtcbiAgICAgICAgdGhpcy5sb2FkTW9kdWxlU291cmNlID0gYXJncy5sb2FkTW9kdWxlU291cmNlO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZU1vZHVsZSA9IGFyZ3Mubm9ybWFsaXplTW9kdWxlO1xuICAgIH1cbn1cbi8qKlxuICogV2UgdXNlIHN0YXRpYyBmdW5jdGlvbnMgcGVyIG1vZHVsZSB0byBkaXNwYXRjaCBydW50aW1lIG9yIGNvbnRleHQgY2FsbHMgZnJvbVxuICogQyB0byB0aGUgaG9zdC4gIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgaW5kaXJlY3Rpb24gZnJvbSBhIHNwZWNpZmljIHJ1bnRpbWUgb3JcbiAqIGNvbnRleHQgcG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2sgaGFuZGxlci5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBRdWlja0pTTW9kdWxlQ2FsbGJhY2tzIHtcbiAgICBjb25zdHJ1Y3Rvcihtb2R1bGUpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0Q2FsbGJhY2tzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnJ1bnRpbWVDYWxsYmFja3MgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuc3VzcGVuZGVkQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmNUb0hvc3RDYWxsYmFja3MgPSBuZXcgUXVpY2tKU0Vtc2NyaXB0ZW5Nb2R1bGVDYWxsYmFja3Moe1xuICAgICAgICAgICAgY2FsbEZ1bmN0aW9uOiAoYXN5bmNpZnksIGN0eCwgdGhpc19wdHIsIGFyZ2MsIGFyZ3YsIGZuX2lkKSA9PiB0aGlzLmhhbmRsZUFzeW5jaWZ5KGFzeW5jaWZ5LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm0gPSB0aGlzLmNvbnRleHRDYWxsYmFja3MuZ2V0KGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVpY2tKU0NvbnRleHQoY3R4ID0gJHtjdHh9KSBub3QgZm91bmQgZm9yIEMgZnVuY3Rpb24gY2FsbCBcIiR7Zm5faWR9XCJgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm0uY2FsbEZ1bmN0aW9uKGN0eCwgdGhpc19wdHIsIGFyZ2MsIGFyZ3YsIGZuX2lkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQyB0byBob3N0IGVycm9yOiByZXR1cm5pbmcgbnVsbF1cIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNob3VsZEludGVycnVwdDogKGFzeW5jaWZ5LCBydCkgPT4gdGhpcy5oYW5kbGVBc3luY2lmeShhc3luY2lmeSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZtID0gdGhpcy5ydW50aW1lQ2FsbGJhY2tzLmdldChydCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVpY2tKU1J1bnRpbWUocnQgPSAke3J0fSkgbm90IGZvdW5kIGZvciBDIGludGVycnVwdGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2bS5zaG91bGRJbnRlcnJ1cHQocnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltDIHRvIGhvc3QgaW50ZXJydXB0OiByZXR1cm5pbmcgZXJyb3JdXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBsb2FkTW9kdWxlU291cmNlOiAoYXN5bmNpZnksIHJ0LCBjdHgsIG1vZHVsZU5hbWUpID0+IHRoaXMuaGFuZGxlQXN5bmNpZnkoYXN5bmNpZnksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBydW50aW1lQ2FsbGJhY2tzID0gdGhpcy5ydW50aW1lQ2FsbGJhY2tzLmdldChydCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcnVudGltZUNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWlja0pTUnVudGltZShydCA9ICR7cnR9KSBub3QgZm91bmQgZm9yIEMgbW9kdWxlIGxvYWRlcmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRNb2R1bGUgPSBydW50aW1lQ2FsbGJhY2tzLmxvYWRNb2R1bGVTb3VyY2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbG9hZE1vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWlja0pTUnVudGltZShydCA9ICR7cnR9KSBkb2VzIG5vdCBzdXBwb3J0IG1vZHVsZSBsb2FkaW5nYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRNb2R1bGUocnQsIGN0eCwgbW9kdWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0MgdG8gaG9zdCBtb2R1bGUgbG9hZGVyIGVycm9yOiByZXR1cm5pbmcgbnVsbF1cIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZU1vZHVsZTogKGFzeW5jaWZ5LCBydCwgY3R4LCBtb2R1bGVCYXNlTmFtZSwgbW9kdWxlTmFtZSkgPT4gdGhpcy5oYW5kbGVBc3luY2lmeShhc3luY2lmeSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bnRpbWVDYWxsYmFja3MgPSB0aGlzLnJ1bnRpbWVDYWxsYmFja3MuZ2V0KHJ0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFydW50aW1lQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1aWNrSlNSdW50aW1lKHJ0ID0gJHtydH0pIG5vdCBmb3VuZCBmb3IgQyBtb2R1bGUgbG9hZGVyYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplTW9kdWxlID0gcnVudGltZUNhbGxiYWNrcy5ub3JtYWxpemVNb2R1bGU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9ybWFsaXplTW9kdWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1aWNrSlNSdW50aW1lKHJ0ID0gJHtydH0pIGRvZXMgbm90IHN1cHBvcnQgbW9kdWxlIGxvYWRpbmdgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplTW9kdWxlKHJ0LCBjdHgsIG1vZHVsZUJhc2VOYW1lLCBtb2R1bGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQyB0byBob3N0IG1vZHVsZSBsb2FkZXIgZXJyb3I6IHJldHVybmluZyBudWxsXVwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGU7XG4gICAgICAgIHRoaXMubW9kdWxlLmNhbGxiYWNrcyA9IHRoaXMuY1RvSG9zdENhbGxiYWNrcztcbiAgICB9XG4gICAgc2V0UnVudGltZUNhbGxiYWNrcyhydCwgY2FsbGJhY2tzKSB7XG4gICAgICAgIHRoaXMucnVudGltZUNhbGxiYWNrcy5zZXQocnQsIGNhbGxiYWNrcyk7XG4gICAgfVxuICAgIGRlbGV0ZVJ1bnRpbWUocnQpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lQ2FsbGJhY2tzLmRlbGV0ZShydCk7XG4gICAgfVxuICAgIHNldENvbnRleHRDYWxsYmFja3MoY3R4LCBjYWxsYmFja3MpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0Q2FsbGJhY2tzLnNldChjdHgsIGNhbGxiYWNrcyk7XG4gICAgfVxuICAgIGRlbGV0ZUNvbnRleHQoY3R4KSB7XG4gICAgICAgIHRoaXMuY29udGV4dENhbGxiYWNrcy5kZWxldGUoY3R4KTtcbiAgICB9XG4gICAgaGFuZGxlQXN5bmNpZnkoYXN5bmNpZnksIGZuKSB7XG4gICAgICAgIGlmIChhc3luY2lmeSkge1xuICAgICAgICAgICAgLy8gV2UgbXVzdCBhbHdheXMgY2FsbCBhc3luY2lmeS5oYW5kbGVTeW5jIGFyb3VuZCBvdXIgZnVuY3Rpb24uXG4gICAgICAgICAgICAvLyBUaGlzIGFsbG93cyBhc3luY2lmeSB0byByZXN1bWUgc3VzcGVuZGVkIGV4ZWN1dGlvbiBvbiB0aGUgc2Vjb25kIGNhbGwuXG4gICAgICAgICAgICAvLyBBc3luY2lmeSBpbnRlcm5hbGx5IGNhbiBkZXRlY3Qgc3luYyBiZWhhdmlvciwgYW5kIGF2b2lkIHN1c3BlbmRpbmcuXG4gICAgICAgICAgICByZXR1cm4gYXN5bmNpZnkuaGFuZGxlU2xlZXAoKGRvbmUpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBmbigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwiYXN5bmNpZnkuaGFuZGxlU2xlZXA6IG5vdCBzdXNwZW5kaW5nOlwiLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIElzIHByb21pc2UsIHdlIGludGVuZCB0byBzdXNwZW5kLlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdXNwZW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTQXN5bmNpZnlFcnJvcihgQWxyZWFkeSBzdXNwZW5kZWQgYXQ6ICR7dGhpcy5zdXNwZW5kZWQuc3RhY2t9XFxuQXR0ZW1wdGVkIHRvIHN1c3BlbmQgYXQ6YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1c3BlbmRlZCA9IG5ldyBlcnJvcnNfMS5RdWlja0pTQXN5bmNpZnlTdXNwZW5kZWQoYCgke3RoaXMuc3VzcGVuZGVkQ291bnQrK30pYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJhc3luY2lmeS5oYW5kbGVTbGVlcDogc3VzcGVuZGluZzpcIiwgdGhpcy5zdXNwZW5kZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKChyZXNvbHZlZFJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJhc3luY2lmeS5oYW5kbGVTbGVlcDogcmVzb2x2ZWQ6XCIsIHJlc29sdmVkUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUocmVzb2x2ZWRSZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICgwLCBkZWJ1Z18xLmRlYnVnTG9nKShcImFzeW5jaWZ5LmhhbmRsZVNsZWVwOiByZWplY3RlZDpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlF1aWNrSlM6IGNhbm5vdCBoYW5kbGUgZXJyb3IgaW4gc3VzcGVuZGVkIGZ1bmN0aW9uXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VzcGVuZGVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICgwLCBkZWJ1Z18xLmRlYnVnTG9nKShcImFzeW5jaWZ5LmhhbmRsZVNsZWVwOiBlcnJvcjpcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1c3BlbmRlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gYXN5bmNpZnkgLSB3ZSBzaG91bGQgbmV2ZXIgcmV0dXJuIGEgcHJvbWlzZS5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBmbigpO1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcm9taXNlIHJldHVybiB2YWx1ZSBub3Qgc3VwcG9ydGVkIGluIG5vbi1hc3luY2lmeSBjb250ZXh0LlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTTW9kdWxlQ2FsbGJhY2tzID0gUXVpY2tKU01vZHVsZUNhbGxiYWNrcztcbi8qKlxuICogUHJvY2VzcyBSdW50aW1lT3B0aW9ucyBhbmQgYXBwbHkgdGhlbSB0byBhIFF1aWNrSlNSdW50aW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYXBwbHlCYXNlUnVudGltZU9wdGlvbnMocnVudGltZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmludGVycnVwdEhhbmRsZXIpIHtcbiAgICAgICAgcnVudGltZS5zZXRJbnRlcnJ1cHRIYW5kbGVyKG9wdGlvbnMuaW50ZXJydXB0SGFuZGxlcik7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm1heFN0YWNrU2l6ZUJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcnVudGltZS5zZXRNYXhTdGFja1NpemUob3B0aW9ucy5tYXhTdGFja1NpemVCeXRlcyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm1lbW9yeUxpbWl0Qnl0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBydW50aW1lLnNldE1lbW9yeUxpbWl0KG9wdGlvbnMubWVtb3J5TGltaXRCeXRlcyk7XG4gICAgfVxufVxuZXhwb3J0cy5hcHBseUJhc2VSdW50aW1lT3B0aW9ucyA9IGFwcGx5QmFzZVJ1bnRpbWVPcHRpb25zO1xuLyoqXG4gKiBQcm9jZXNzIE1vZHVsZUV2YWxPcHRpb25zIGFuZCBhcHBseSB0aGVtIHRvIGEgUXVpY2tKU1J1bnRpbWUuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhcHBseU1vZHVsZUV2YWxSdW50aW1lT3B0aW9ucyhydW50aW1lLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMubW9kdWxlTG9hZGVyKSB7XG4gICAgICAgIHJ1bnRpbWUuc2V0TW9kdWxlTG9hZGVyKG9wdGlvbnMubW9kdWxlTG9hZGVyKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2hvdWxkSW50ZXJydXB0KSB7XG4gICAgICAgIHJ1bnRpbWUuc2V0SW50ZXJydXB0SGFuZGxlcihvcHRpb25zLnNob3VsZEludGVycnVwdCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm1lbW9yeUxpbWl0Qnl0ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBydW50aW1lLnNldE1lbW9yeUxpbWl0KG9wdGlvbnMubWVtb3J5TGltaXRCeXRlcyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLm1heFN0YWNrU2l6ZUJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcnVudGltZS5zZXRNYXhTdGFja1NpemUob3B0aW9ucy5tYXhTdGFja1NpemVCeXRlcyk7XG4gICAgfVxufVxuZXhwb3J0cy5hcHBseU1vZHVsZUV2YWxSdW50aW1lT3B0aW9ucyA9IGFwcGx5TW9kdWxlRXZhbFJ1bnRpbWVPcHRpb25zO1xuLyoqXG4gKiBUaGlzIGNsYXNzIHByZXNlbnRzIGEgSmF2YXNjcmlwdCBpbnRlcmZhY2UgdG8gUXVpY2tKUywgYSBKYXZhc2NyaXB0IGludGVycHJldGVyXG4gKiB0aGF0IHN1cHBvcnRzIEVjbWFTY3JpcHQgMjAyMCAoRVMyMDIwKS5cbiAqXG4gKiBJdCB3cmFwcyBhIHNpbmdsZSBXZWJBc3NlbWJseSBtb2R1bGUgY29udGFpbmluZyB0aGUgUXVpY2tKUyBsaWJyYXJ5IGFuZFxuICogYXNzb2NpYXRlZCBoZWxwZXIgQyBjb2RlLiBXZWJBc3NlbWJseSBtb2R1bGVzIGFyZSBjb21wbGV0ZWx5IGlzb2xhdGVkIGZyb21cbiAqIGVhY2ggb3RoZXIgYnkgdGhlIGhvc3QncyBXZWJBc3NlbWJseSBydW50aW1lLiBTZXBhcmF0ZSBXZWJBc3NlbWJseSBtb2R1bGVzXG4gKiBoYXZlIHRoZSBtb3N0IGlzb2xhdGlvbiBndWFyYW50ZWVzIHBvc3NpYmxlIHdpdGggdGhpcyBsaWJyYXJ5LlxuICpcbiAqIFRoZSBzaW1wbGVzdCB3YXkgdG8gc3RhcnQgcnVubmluZyBjb2RlIGlzIHtAbGluayBldmFsQ29kZX0uIFRoaXMgc2hvcnRjdXRcbiAqIG1ldGhvZCB3aWxsIGV2YWx1YXRlIEphdmFzY3JpcHQgc2FmZWx5IGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhIG5hdGl2ZVxuICogSmF2YXNjcmlwdCB2YWx1ZS5cbiAqXG4gKiBGb3IgbW9yZSBjb250cm9sIG92ZXIgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCwgb3IgdG8gaW50ZXJhY3Qgd2l0aCB2YWx1ZXNcbiAqIGluc2lkZSBRdWlja0pTLCBjcmVhdGUgYSBjb250ZXh0IHdpdGgge0BsaW5rIG5ld0NvbnRleHR9IG9yIGEgcnVudGltZSB3aXRoXG4gKiB7QGxpbmsgbmV3UnVudGltZX0uXG4gKi9cbmNsYXNzIFF1aWNrSlNXQVNNTW9kdWxlIHtcbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBjb25zdHJ1Y3Rvcihtb2R1bGUsIGZmaSkge1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTtcbiAgICAgICAgdGhpcy5mZmkgPSBmZmk7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IFF1aWNrSlNNb2R1bGVDYWxsYmFja3MobW9kdWxlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcnVudGltZS5cbiAgICAgKiBVc2UgdGhlIHJ1bnRpbWUgdG8gc2V0IGxpbWl0cyBvbiBDUFUgYW5kIG1lbW9yeSB1c2FnZSBhbmQgY29uZmlndXJlIG1vZHVsZVxuICAgICAqIGxvYWRpbmcgZm9yIG9uZSBvciBtb3JlIFtbUXVpY2tKU0NvbnRleHRdXXMgaW5zaWRlIHRoZSBydW50aW1lLlxuICAgICAqL1xuICAgIG5ld1J1bnRpbWUob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHJ0ID0gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUodGhpcy5mZmkuUVRTX05ld1J1bnRpbWUoKSwgdW5kZWZpbmVkLCAocnRfcHRyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5kZWxldGVSdW50aW1lKHJ0X3B0cik7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZVJ1bnRpbWUocnRfcHRyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWUgPSBuZXcgcnVudGltZV8xLlF1aWNrSlNSdW50aW1lKHtcbiAgICAgICAgICAgIG1vZHVsZTogdGhpcy5tb2R1bGUsXG4gICAgICAgICAgICBjYWxsYmFja3M6IHRoaXMuY2FsbGJhY2tzLFxuICAgICAgICAgICAgZmZpOiB0aGlzLmZmaSxcbiAgICAgICAgICAgIHJ0LFxuICAgICAgICB9KTtcbiAgICAgICAgYXBwbHlCYXNlUnVudGltZU9wdGlvbnMocnVudGltZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChvcHRpb25zLm1vZHVsZUxvYWRlcikge1xuICAgICAgICAgICAgcnVudGltZS5zZXRNb2R1bGVMb2FkZXIob3B0aW9ucy5tb2R1bGVMb2FkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBydW50aW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHNpbXBsaWZpZWQgQVBJIHRvIGNyZWF0ZSBhIG5ldyBbW1F1aWNrSlNSdW50aW1lXV0gYW5kIGFcbiAgICAgKiBbW1F1aWNrSlNDb250ZXh0XV0gaW5zaWRlIHRoYXQgcnVudGltZSBhdCB0aGUgc2FtZSB0aW1lLiBUaGUgcnVudGltZSB3aWxsXG4gICAgICogYmUgZGlzcG9zZWQgd2hlbiB0aGUgY29udGV4dCBpcyBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBuZXdDb250ZXh0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBydW50aW1lID0gdGhpcy5uZXdSdW50aW1lKCk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBydW50aW1lLm5ld0NvbnRleHQoe1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIG93bmVkTGlmZXRpbWVzOiAoMCwgdHlwZXNfMS5jb25jYXQpKHJ1bnRpbWUsIG9wdGlvbnMub3duZWRMaWZldGltZXMpLFxuICAgICAgICB9KTtcbiAgICAgICAgcnVudGltZS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9uZS1vZmYgZXZhbHVhdGUgY29kZSB3aXRob3V0IG5lZWRpbmcgdG8gY3JlYXRlIGEgW1tRdWlja0pTUnVudGltZV1dIG9yXG4gICAgICogW1tRdWlja0pTQ29udGV4dF1dIGV4cGxpY2l0bHkuXG4gICAgICpcbiAgICAgKiBUbyBwcm90ZWN0IGFnYWluc3QgaW5maW5pdGUgbG9vcHMsIHVzZSB0aGUgYHNob3VsZEludGVycnVwdGAgb3B0aW9uLiBUaGVcbiAgICAgKiBbW3Nob3VsZEludGVycnVwdEFmdGVyRGVhZGxpbmVdXSBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBhIHRpbWUtYmFzZWQgZGVhZGxpbmUuXG4gICAgICpcbiAgICAgKiBJZiB5b3UgbmVlZCBtb3JlIGNvbnRyb2wgb3ZlciBob3cgdGhlIGNvZGUgZXhlY3V0ZXMsIGNyZWF0ZSBhXG4gICAgICogW1tRdWlja0pTUnVudGltZV1dICh3aXRoIFtbbmV3UnVudGltZV1dKSBvciBhIFtbUXVpY2tKU0NvbnRleHRdXSAod2l0aFxuICAgICAqIFtbbmV3Q29udGV4dF1dIG9yIFtbUXVpY2tKU1J1bnRpbWUubmV3Q29udGV4dF1dKSwgYW5kIHVzZSBpdHNcbiAgICAgKiBbW1F1aWNrSlNDb250ZXh0LmV2YWxDb2RlXV0gbWV0aG9kLlxuICAgICAqXG4gICAgICogQXN5bmNocm9ub3VzIGNhbGxiYWNrcyBtYXkgbm90IHJ1biBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgdG8gYGV2YWxDb2RlYC4gSWZcbiAgICAgKiB5b3UgbmVlZCB0byB3b3JrIHdpdGggYXN5bmMgY29kZSBpbnNpZGUgUXVpY2tKUywgY3JlYXRlIGEgcnVudGltZSBhbmQgdXNlXG4gICAgICogW1tRdWlja0pTUnVudGltZS5leGVjdXRlUGVuZGluZ0pvYnNdXS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgaXMgY29lcmNlZCB0byBhIG5hdGl2ZSBKYXZhc2NyaXB0IHZhbHVlIHVzaW5nIEpTT05cbiAgICAgKiBzZXJpYWxpemF0aW9uLCBzbyBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgdW5zdXBwb3J0ZWQgYnkgSlNPTiB3aWxsIGJlIGRyb3BwZWQuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIElmIGBjb2RlYCB0aHJvd3MgZHVyaW5nIGV2YWx1YXRpb24sIHRoZSBleGNlcHRpb24gd2lsbCBiZVxuICAgICAqIGNvbnZlcnRlZCBpbnRvIGEgbmF0aXZlIEphdmFzY3JpcHQgdmFsdWUgYW5kIHRocm93bi5cbiAgICAgKlxuICAgICAqIEB0aHJvd3MgaWYgYG9wdGlvbnMuc2hvdWxkSW50ZXJydXB0YCBpbnRlcnJ1cHRlZCBleGVjdXRpb24sIHdpbGwgdGhyb3cgYSBFcnJvclxuICAgICAqIHdpdGggbmFtZSBgXCJJbnRlcm5hbEVycm9yXCJgIGFuZCAgbWVzc2FnZSBgXCJpbnRlcnJ1cHRlZFwiYC5cbiAgICAgKi9cbiAgICBldmFsQ29kZShjb2RlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlKChzY29wZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgdm0gPSBzY29wZS5tYW5hZ2UodGhpcy5uZXdDb250ZXh0KCkpO1xuICAgICAgICAgICAgYXBwbHlNb2R1bGVFdmFsUnVudGltZU9wdGlvbnModm0ucnVudGltZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB2bS5ldmFsQ29kZShjb2RlLCBcImV2YWwuanNcIik7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tZW1vcnlMaW1pdEJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbWVtb3J5IGxpbWl0IHNvIHdlIGNhbiBkdW1wIHRoZSByZXN1bHQgd2l0aG91dCBleGNlZWRpbmcgaXQuXG4gICAgICAgICAgICAgICAgdm0ucnVudGltZS5zZXRNZW1vcnlMaW1pdCgtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB2bS5kdW1wKHNjb3BlLm1hbmFnZShyZXN1bHQuZXJyb3IpKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdm0uZHVtcChzY29wZS5tYW5hZ2UocmVzdWx0LnZhbHVlKSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsb3ctbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBRdWlja0pTIGZ1bmN0aW9ucyBpbiB0aGlzIFdlYkFzc2VtYmx5XG4gICAgICogbW9kdWxlLlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKiBAdW5zdGFibGUgTm8gd2FycmFudHkgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIEFQSS4gSXQgY291bGQgY2hhbmdlIGF0IGFueSB0aW1lLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0RkZJKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZmk7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTV0FTTU1vZHVsZSA9IFF1aWNrSlNXQVNNTW9kdWxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW9kdWxlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWlja0pTQXN5bmNSdW50aW1lID0gdm9pZCAwO1xuY29uc3QgXzEgPSByZXF1aXJlKFwiLlwiKTtcbmNvbnN0IGNvbnRleHRfYXN5bmNpZnlfMSA9IHJlcXVpcmUoXCIuL2NvbnRleHQtYXN5bmNpZnlcIik7XG5jb25zdCBydW50aW1lXzEgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuY29uc3QgdHlwZXNfMSA9IHJlcXVpcmUoXCIuL3R5cGVzXCIpO1xuY2xhc3MgUXVpY2tKU0FzeW5jUnVudGltZSBleHRlbmRzIHJ1bnRpbWVfMS5RdWlja0pTUnVudGltZSB7XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgY29uc3RydWN0b3IoYXJncykge1xuICAgICAgICBzdXBlcihhcmdzKTtcbiAgICB9XG4gICAgbmV3Q29udGV4dChvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaW50cmluc2ljcyAmJiBvcHRpb25zLmludHJpbnNpY3MgIT09IHR5cGVzXzEuRGVmYXVsdEludHJpbnNpY3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRPRE86IEN1c3RvbSBpbnRyaW5zaWNzIGFyZSBub3Qgc3VwcG9ydGVkIHlldFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdHggPSBuZXcgXzEuTGlmZXRpbWUodGhpcy5mZmkuUVRTX05ld0NvbnRleHQodGhpcy5ydC52YWx1ZSksIHVuZGVmaW5lZCwgKGN0eF9wdHIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dE1hcC5kZWxldGUoY3R4X3B0cik7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5kZWxldGVDb250ZXh0KGN0eF9wdHIpO1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX0ZyZWVDb250ZXh0KGN0eF9wdHIpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBjb250ZXh0X2FzeW5jaWZ5XzEuUXVpY2tKU0FzeW5jQ29udGV4dCh7XG4gICAgICAgICAgICBtb2R1bGU6IHRoaXMubW9kdWxlLFxuICAgICAgICAgICAgY3R4LFxuICAgICAgICAgICAgZmZpOiB0aGlzLmZmaSxcbiAgICAgICAgICAgIHJ0OiB0aGlzLnJ0LFxuICAgICAgICAgICAgb3duZWRMaWZldGltZXM6IFtdLFxuICAgICAgICAgICAgcnVudGltZTogdGhpcyxcbiAgICAgICAgICAgIGNhbGxiYWNrczogdGhpcy5jYWxsYmFja3MsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnRleHRNYXAuc2V0KGN0eC52YWx1ZSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiAgICBzZXRNb2R1bGVMb2FkZXIobW9kdWxlTG9hZGVyLCBtb2R1bGVOb3JtYWxpemVyKSB7XG4gICAgICAgIHN1cGVyLnNldE1vZHVsZUxvYWRlcihtb2R1bGVMb2FkZXIsIG1vZHVsZU5vcm1hbGl6ZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG1heCBzdGFjayBzaXplIGZvciB0aGlzIHJ1bnRpbWUgaW4gYnl0ZXMuXG4gICAgICogVG8gcmVtb3ZlIHRoZSBsaW1pdCwgc2V0IHRvIGAwYC5cbiAgICAgKlxuICAgICAqIFNldHRpbmcgdGhpcyBsaW1pdCBhbHNvIGFkanVzdHMgdGhlIGdsb2JhbCBgQVNZTkNJRllfU1RBQ0tfU0laRWAgZm9yIHRoZSBlbnRpcmUge0BsaW5rIFF1aWNrSlNBc3luY1dBU01Nb2R1bGV9LlxuICAgICAqIFNlZSB0aGUgW3B1bGwgcmVxdWVzdF0oaHR0cHM6Ly9naXRodWIuY29tL2p1c3RqYWtlL3F1aWNranMtZW1zY3JpcHRlbi9wdWxsLzExNCkgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKi9cbiAgICBzZXRNYXhTdGFja1NpemUoc3RhY2tTaXplKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5zZXRNYXhTdGFja1NpemUoc3RhY2tTaXplKTtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNBc3luY1J1bnRpbWUgPSBRdWlja0pTQXN5bmNSdW50aW1lO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnVudGltZS1hc3luY2lmeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU1J1bnRpbWUgPSB2b2lkIDA7XG5jb25zdCBhc3luY2lmeV9oZWxwZXJzXzEgPSByZXF1aXJlKFwiLi9hc3luY2lmeS1oZWxwZXJzXCIpO1xuY29uc3QgY29udGV4dF8xID0gcmVxdWlyZShcIi4vY29udGV4dFwiKTtcbmNvbnN0IGRlYnVnXzEgPSByZXF1aXJlKFwiLi9kZWJ1Z1wiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuY29uc3QgbGlmZXRpbWVfMSA9IHJlcXVpcmUoXCIuL2xpZmV0aW1lXCIpO1xuY29uc3QgbWVtb3J5XzEgPSByZXF1aXJlKFwiLi9tZW1vcnlcIik7XG5jb25zdCB0eXBlc18xID0gcmVxdWlyZShcIi4vdHlwZXNcIik7XG4vKipcbiAqIEEgcnVudGltZSByZXByZXNlbnRzIGEgSmF2YXNjcmlwdCBydW50aW1lIGNvcnJlc3BvbmRpbmcgdG8gYW4gb2JqZWN0IGhlYXAuXG4gKiBTZXZlcmFsIHJ1bnRpbWVzIGNhbiBleGlzdCBhdCB0aGUgc2FtZSB0aW1lIGJ1dCB0aGV5IGNhbm5vdCBleGNoYW5nZSBvYmplY3RzLlxuICogSW5zaWRlIGEgZ2l2ZW4gcnVudGltZSwgbm8gbXVsdGktdGhyZWFkaW5nIGlzIHN1cHBvcnRlZC5cbiAqXG4gKiBZb3UgY2FuIHRoaW5rIG9mIHNlcGFyYXRlIHJ1bnRpbWVzIGxpa2UgZGlmZmVyZW50IGRvbWFpbnMgaW4gYSBicm93c2VyLCBhbmRcbiAqIHRoZSBjb250ZXh0cyB3aXRoaW4gYSBydW50aW1lIGxpa2UgdGhlIGRpZmZlcmVudCB3aW5kb3dzIG9wZW4gdG8gdGhlIHNhbWVcbiAqIGRvbWFpbi5cbiAqXG4gKiBDcmVhdGUgYSBydW50aW1lIHZpYSB7QGxpbmsgUXVpY2tKU1dBU01Nb2R1bGUubmV3UnVudGltZX0uXG4gKlxuICogWW91IHNob3VsZCBjcmVhdGUgc2VwYXJhdGUgcnVudGltZSBpbnN0YW5jZXMgZm9yIHVudHJ1c3RlZCBjb2RlIGZyb21cbiAqIGRpZmZlcmVudCBzb3VyY2VzIGZvciBpc29sYXRpb24uIEhvd2V2ZXIsIHN0cm9uZ2VyIGlzb2xhdGlvbiBpcyBhbHNvXG4gKiBhdmFpbGFibGUgKGF0IHRoZSBjb3N0IG9mIG1lbW9yeSB1c2FnZSksIGJ5IGNyZWF0aW5nIHNlcGFyYXRlIFdlYkFzc2VtYmx5XG4gKiBtb2R1bGVzIHRvIGZ1cnRoZXIgaXNvbGF0ZSB1bnRydXN0ZWQgY29kZS5cbiAqIFNlZSB7QGxpbmsgbmV3UXVpY2tKU1dBU01Nb2R1bGV9LlxuICpcbiAqIEltcGxlbWVudCBtZW1vcnkgYW5kIENQVSBjb25zdHJhaW50cyB3aXRoIFtbc2V0SW50ZXJydXB0SGFuZGxlcl1dXG4gKiAoY2FsbGVkIHJlZ3VsYXJseSB3aGlsZSB0aGUgaW50ZXJwcmV0ZXIgcnVucyksIFtbc2V0TWVtb3J5TGltaXRdXSwgYW5kXG4gKiBbW3NldE1heFN0YWNrU2l6ZV1dLlxuICogVXNlIFtbY29tcHV0ZU1lbW9yeVVzYWdlXV0gb3IgW1tkdW1wTWVtb3J5VXNhZ2VdXSB0byBndWlkZSBtZW1vcnkgbGltaXRcbiAqIHR1bmluZy5cbiAqXG4gKiBDb25maWd1cmUgRVMgbW9kdWxlIGxvYWRpbmcgd2l0aCBbW3NldE1vZHVsZUxvYWRlcl1dLlxuICovXG5jbGFzcyBRdWlja0pTUnVudGltZSB7XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgY29uc3RydWN0b3IoYXJncykge1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5zY29wZSA9IG5ldyBsaWZldGltZV8xLlNjb3BlKCk7XG4gICAgICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgICAgICB0aGlzLmNvbnRleHRNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuY1RvSG9zdENhbGxiYWNrcyA9IHtcbiAgICAgICAgICAgIHNob3VsZEludGVycnVwdDogKHJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJ0ICE9PSB0aGlzLnJ0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlF1aWNrSlNDb250ZXh0IGluc3RhbmNlIHJlY2VpdmVkIEMgLT4gSlMgaW50ZXJydXB0IHdpdGggbWlzbWF0Y2hlZCBydFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZm4gPSB0aGlzLmludGVycnVwdEhhbmRsZXI7XG4gICAgICAgICAgICAgICAgaWYgKCFmbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJRdWlja0pTQ29udGV4dCBoYWQgbm8gaW50ZXJydXB0IGhhbmRsZXJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmbih0aGlzKSA/IDEgOiAwO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxvYWRNb2R1bGVTb3VyY2U6ICgwLCBhc3luY2lmeV9oZWxwZXJzXzEubWF5YmVBc3luY0ZuKSh0aGlzLCBmdW5jdGlvbiogKGF3YWl0ZWQsIHJ0LCBjdHgsIG1vZHVsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVMb2FkZXIgPSB0aGlzLm1vZHVsZUxvYWRlcjtcbiAgICAgICAgICAgICAgICBpZiAoIW1vZHVsZUxvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdW50aW1lIGhhcyBubyBtb2R1bGUgbG9hZGVyXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocnQgIT09IHRoaXMucnQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVudGltZSBwb2ludGVyIG1pc21hdGNoXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0TWFwLmdldChjdHgpID8/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV3Q29udGV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0UG9pbnRlcjogY3R4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCogYXdhaXRlZChtb2R1bGVMb2FkZXIobW9kdWxlTmFtZSwgY29udGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiBcImVycm9yXCIgaW4gcmVzdWx0ICYmIHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwiY1RvSG9zdExvYWRNb2R1bGU6IGxvYWRlciByZXR1cm5lZCBlcnJvclwiLCByZXN1bHQuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZVNvdXJjZSA9IHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIgPyByZXN1bHQgOiBcInZhbHVlXCIgaW4gcmVzdWx0ID8gcmVzdWx0LnZhbHVlIDogcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkubmV3SGVhcENoYXJQb2ludGVyKG1vZHVsZVNvdXJjZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJjVG9Ib3N0TG9hZE1vZHVsZTogY2F1Z2h0IGVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC50aHJvdyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbm9ybWFsaXplTW9kdWxlOiAoMCwgYXN5bmNpZnlfaGVscGVyc18xLm1heWJlQXN5bmNGbikodGhpcywgZnVuY3Rpb24qIChhd2FpdGVkLCBydCwgY3R4LCBiYXNlTW9kdWxlTmFtZSwgbW9kdWxlTmFtZVJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVOb3JtYWxpemVyID0gdGhpcy5tb2R1bGVOb3JtYWxpemVyO1xuICAgICAgICAgICAgICAgIGlmICghbW9kdWxlTm9ybWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdW50aW1lIGhhcyBubyBtb2R1bGUgbm9ybWFsaXplclwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ0ICE9PSB0aGlzLnJ0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bnRpbWUgcG9pbnRlciBtaXNtYXRjaFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dE1hcC5nZXQoY3R4KSA/P1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0NvbnRleHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogRG9lcyB0aGlzIGhhcHBlbj8gQXJlIHdlIHJlc3BvbnNpYmxlIGZvciBkaXNwb3Npbmc/IEkgZG9uJ3QgdGhpbmsgc28gKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRQb2ludGVyOiBjdHgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkKiBhd2FpdGVkKG1vZHVsZU5vcm1hbGl6ZXIoYmFzZU1vZHVsZU5hbWUsIG1vZHVsZU5hbWVSZXF1ZXN0LCBjb250ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmIFwiZXJyb3JcIiBpbiByZXN1bHQgJiYgcmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJjVG9Ib3N0Tm9ybWFsaXplTW9kdWxlOiBub3JtYWxpemVyIHJldHVybmVkIGVycm9yXCIsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIgPyByZXN1bHQgOiByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldE1lbW9yeSh0aGlzLnJ0LnZhbHVlKS5uZXdIZWFwQ2hhclBvaW50ZXIobmFtZSkudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJub3JtYWxpemVNb2R1bGU6IGNhdWdodCBlcnJvclwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudGhyb3coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICAgICAgYXJncy5vd25lZExpZmV0aW1lcz8uZm9yRWFjaCgobGlmZXRpbWUpID0+IHRoaXMuc2NvcGUubWFuYWdlKGxpZmV0aW1lKSk7XG4gICAgICAgIHRoaXMubW9kdWxlID0gYXJncy5tb2R1bGU7XG4gICAgICAgIHRoaXMubWVtb3J5ID0gbmV3IG1lbW9yeV8xLk1vZHVsZU1lbW9yeSh0aGlzLm1vZHVsZSk7XG4gICAgICAgIHRoaXMuZmZpID0gYXJncy5mZmk7XG4gICAgICAgIHRoaXMucnQgPSBhcmdzLnJ0O1xuICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IGFyZ3MuY2FsbGJhY2tzO1xuICAgICAgICB0aGlzLnNjb3BlLm1hbmFnZSh0aGlzLnJ0KTtcbiAgICAgICAgdGhpcy5jYWxsYmFja3Muc2V0UnVudGltZUNhbGxiYWNrcyh0aGlzLnJ0LnZhbHVlLCB0aGlzLmNUb0hvc3RDYWxsYmFja3MpO1xuICAgICAgICB0aGlzLmV4ZWN1dGVQZW5kaW5nSm9icyA9IHRoaXMuZXhlY3V0ZVBlbmRpbmdKb2JzLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGdldCBhbGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGUuYWxpdmU7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgbmV3Q29udGV4dChvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaW50cmluc2ljcyAmJiBvcHRpb25zLmludHJpbnNpY3MgIT09IHR5cGVzXzEuRGVmYXVsdEludHJpbnNpY3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRPRE86IEN1c3RvbSBpbnRyaW5zaWNzIGFyZSBub3Qgc3VwcG9ydGVkIHlldFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdHggPSBuZXcgbGlmZXRpbWVfMS5MaWZldGltZShvcHRpb25zLmNvbnRleHRQb2ludGVyIHx8IHRoaXMuZmZpLlFUU19OZXdDb250ZXh0KHRoaXMucnQudmFsdWUpLCB1bmRlZmluZWQsIChjdHhfcHRyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNYXAuZGVsZXRlKGN0eF9wdHIpO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3MuZGVsZXRlQ29udGV4dChjdHhfcHRyKTtcbiAgICAgICAgICAgIHRoaXMuZmZpLlFUU19GcmVlQ29udGV4dChjdHhfcHRyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgY29udGV4dF8xLlF1aWNrSlNDb250ZXh0KHtcbiAgICAgICAgICAgIG1vZHVsZTogdGhpcy5tb2R1bGUsXG4gICAgICAgICAgICBjdHgsXG4gICAgICAgICAgICBmZmk6IHRoaXMuZmZpLFxuICAgICAgICAgICAgcnQ6IHRoaXMucnQsXG4gICAgICAgICAgICBvd25lZExpZmV0aW1lczogb3B0aW9ucy5vd25lZExpZmV0aW1lcyxcbiAgICAgICAgICAgIHJ1bnRpbWU6IHRoaXMsXG4gICAgICAgICAgICBjYWxsYmFja3M6IHRoaXMuY2FsbGJhY2tzLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb250ZXh0TWFwLnNldChjdHgudmFsdWUsIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsb2FkZXIgZm9yIEVjbWFTY3JpcHQgbW9kdWxlcyByZXF1ZXN0ZWQgYnkgYW55IGNvbnRleHQgaW4gdGhpc1xuICAgICAqIHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBUaGUgbG9hZGVyIGNhbiBiZSByZW1vdmVkIHdpdGggW1tyZW1vdmVNb2R1bGVMb2FkZXJdXS5cbiAgICAgKi9cbiAgICBzZXRNb2R1bGVMb2FkZXIobW9kdWxlTG9hZGVyLCBtb2R1bGVOb3JtYWxpemVyKSB7XG4gICAgICAgIHRoaXMubW9kdWxlTG9hZGVyID0gbW9kdWxlTG9hZGVyO1xuICAgICAgICB0aGlzLm1vZHVsZU5vcm1hbGl6ZXIgPSBtb2R1bGVOb3JtYWxpemVyO1xuICAgICAgICB0aGlzLmZmaS5RVFNfUnVudGltZUVuYWJsZU1vZHVsZUxvYWRlcih0aGlzLnJ0LnZhbHVlLCB0aGlzLm1vZHVsZU5vcm1hbGl6ZXIgPyAxIDogMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgdGhlIGxvYWRlciBzZXQgYnkgW1tzZXRNb2R1bGVMb2FkZXJdXS4gVGhpcyBkaXNhYmxlcyBtb2R1bGUgbG9hZGluZy5cbiAgICAgKi9cbiAgICByZW1vdmVNb2R1bGVMb2FkZXIoKSB7XG4gICAgICAgIHRoaXMubW9kdWxlTG9hZGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmZmaS5RVFNfUnVudGltZURpc2FibGVNb2R1bGVMb2FkZXIodGhpcy5ydC52YWx1ZSk7XG4gICAgfVxuICAgIC8vIFJ1bnRpbWUgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogSW4gUXVpY2tKUywgcHJvbWlzZXMgYW5kIGFzeW5jIGZ1bmN0aW9ucyBjcmVhdGUgcGVuZGluZ0pvYnMuIFRoZXNlIGRvIG5vdCBleGVjdXRlXG4gICAgICogaW1tZWRpYXRlbHkgYW5kIG5lZWQgdG8gYmUgcnVuIGJ5IGNhbGxpbmcgW1tleGVjdXRlUGVuZGluZ0pvYnNdXS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcGVuZGluZ0pvYiBxdWV1ZWQgdXAuXG4gICAgICovXG4gICAgaGFzUGVuZGluZ0pvYigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5mZmkuUVRTX0lzSm9iUGVuZGluZyh0aGlzLnJ0LnZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBhIGNhbGxiYWNrIHdoaWNoIGlzIHJlZ3VsYXJseSBjYWxsZWQgYnkgdGhlIFF1aWNrSlMgZW5naW5lIHdoZW4gaXQgaXNcbiAgICAgKiBleGVjdXRpbmcgY29kZS4gVGhpcyBjYWxsYmFjayBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYW4gZXhlY3V0aW9uXG4gICAgICogdGltZW91dC5cbiAgICAgKlxuICAgICAqIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBjYW4gYmUgcmVtb3ZlZCB3aXRoIFtbcmVtb3ZlSW50ZXJydXB0SGFuZGxlcl1dLlxuICAgICAqL1xuICAgIHNldEludGVycnVwdEhhbmRsZXIoY2IpIHtcbiAgICAgICAgY29uc3QgcHJldkludGVycnVwdEhhbmRsZXIgPSB0aGlzLmludGVycnVwdEhhbmRsZXI7XG4gICAgICAgIHRoaXMuaW50ZXJydXB0SGFuZGxlciA9IGNiO1xuICAgICAgICBpZiAoIXByZXZJbnRlcnJ1cHRIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfUnVudGltZUVuYWJsZUludGVycnVwdEhhbmRsZXIodGhpcy5ydC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgaWYgYW55LlxuICAgICAqIFNlZSBbW3NldEludGVycnVwdEhhbmRsZXJdXS5cbiAgICAgKi9cbiAgICByZW1vdmVJbnRlcnJ1cHRIYW5kbGVyKCkge1xuICAgICAgICBpZiAodGhpcy5pbnRlcnJ1cHRIYW5kbGVyKSB7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfUnVudGltZURpc2FibGVJbnRlcnJ1cHRIYW5kbGVyKHRoaXMucnQudmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5pbnRlcnJ1cHRIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgcGVuZGluZ0pvYnMgb24gdGhlIHJ1bnRpbWUgdW50aWwgYG1heEpvYnNUb0V4ZWN1dGVgIGpvYnMgYXJlXG4gICAgICogZXhlY3V0ZWQgKGRlZmF1bHQgYWxsIHBlbmRpbmdKb2JzKSwgdGhlIHF1ZXVlIGlzIGV4aGF1c3RlZCwgb3IgdGhlIHJ1bnRpbWVcbiAgICAgKiBlbmNvdW50ZXJzIGFuIGV4Y2VwdGlvbi5cbiAgICAgKlxuICAgICAqIEluIFF1aWNrSlMsIHByb21pc2VzIGFuZCBhc3luYyBmdW5jdGlvbnMgKmluc2lkZSB0aGUgcnVudGltZSogY3JlYXRlXG4gICAgICogcGVuZGluZ0pvYnMuIFRoZXNlIGRvIG5vdCBleGVjdXRlIGltbWVkaWF0ZWx5IGFuZCBuZWVkIHRvIHRyaWdnZXJlZCB0byBydW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWF4Sm9ic1RvRXhlY3V0ZSAtIFdoZW4gbmVnYXRpdmUsIHJ1biBhbGwgcGVuZGluZyBqb2JzLiBPdGhlcndpc2UgZXhlY3V0ZVxuICAgICAqIGF0IG1vc3QgYG1heEpvYnNUb0V4ZWN1dGVgIGJlZm9yZSByZXR1cm5pbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIE9uIHN1Y2Nlc3MsIHRoZSBudW1iZXIgb2YgZXhlY3V0ZWQgam9icy4gT24gZXJyb3IsIHRoZSBleGNlcHRpb25cbiAgICAgKiB0aGF0IHN0b3BwZWQgZXhlY3V0aW9uLCBhbmQgdGhlIGNvbnRleHQgaXQgb2NjdXJyZWQgaW4uIE5vdGUgdGhhdFxuICAgICAqIGV4ZWN1dGVQZW5kaW5nSm9icyB3aWxsIG5vdCBub3JtYWxseSByZXR1cm4gZXJyb3JzIHRocm93biBpbnNpZGUgYXN5bmNcbiAgICAgKiBmdW5jdGlvbnMgb3IgcmVqZWN0ZWQgcHJvbWlzZXMuIFRob3NlIGVycm9ycyBhcmUgYXZhaWxhYmxlIGJ5IGNhbGxpbmdcbiAgICAgKiBbW3Jlc29sdmVQcm9taXNlXV0gb24gdGhlIHByb21pc2UgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBhc3luYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBleGVjdXRlUGVuZGluZ0pvYnMobWF4Sm9ic1RvRXhlY3V0ZSA9IC0xKSB7XG4gICAgICAgIGNvbnN0IGN0eFB0ck91dCA9IHRoaXMubWVtb3J5Lm5ld011dGFibGVQb2ludGVyQXJyYXkoMSk7XG4gICAgICAgIGNvbnN0IHZhbHVlUHRyID0gdGhpcy5mZmkuUVRTX0V4ZWN1dGVQZW5kaW5nSm9iKHRoaXMucnQudmFsdWUsIG1heEpvYnNUb0V4ZWN1dGUgPz8gLTEsIGN0eFB0ck91dC52YWx1ZS5wdHIpO1xuICAgICAgICBjb25zdCBjdHhQdHIgPSBjdHhQdHJPdXQudmFsdWUudHlwZWRBcnJheVswXTtcbiAgICAgICAgY3R4UHRyT3V0LmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKGN0eFB0ciA9PT0gMCkge1xuICAgICAgICAgICAgLy8gTm8gam9icyBleGVjdXRlZC5cbiAgICAgICAgICAgIHRoaXMuZmZpLlFUU19GcmVlVmFsdWVQb2ludGVyUnVudGltZSh0aGlzLnJ0LnZhbHVlLCB2YWx1ZVB0cik7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogMCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHRNYXAuZ2V0KGN0eFB0cikgPz9cbiAgICAgICAgICAgIHRoaXMubmV3Q29udGV4dCh7XG4gICAgICAgICAgICAgICAgY29udGV4dFBvaW50ZXI6IGN0eFB0cixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHRWYWx1ZSA9IGNvbnRleHQuZ2V0TWVtb3J5KHRoaXMucnQudmFsdWUpLmhlYXBWYWx1ZUhhbmRsZSh2YWx1ZVB0cik7XG4gICAgICAgIGNvbnN0IHR5cGVPZlJldCA9IGNvbnRleHQudHlwZW9mKHJlc3VsdFZhbHVlKTtcbiAgICAgICAgaWYgKHR5cGVPZlJldCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWRKb2JzID0gY29udGV4dC5nZXROdW1iZXIocmVzdWx0VmFsdWUpO1xuICAgICAgICAgICAgcmVzdWx0VmFsdWUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IGV4ZWN1dGVkSm9icyB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBPYmplY3QuYXNzaWduKHJlc3VsdFZhbHVlLCB7IGNvbnRleHQgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG1heCBtZW1vcnkgdGhpcyBydW50aW1lIGNhbiBhbGxvY2F0ZS5cbiAgICAgKiBUbyByZW1vdmUgdGhlIGxpbWl0LCBzZXQgdG8gYC0xYC5cbiAgICAgKi9cbiAgICBzZXRNZW1vcnlMaW1pdChsaW1pdEJ5dGVzKSB7XG4gICAgICAgIGlmIChsaW1pdEJ5dGVzIDwgMCAmJiBsaW1pdEJ5dGVzICE9PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBtZW1vcnkgbGltaXQgdG8gbmVnYXRpdmUgbnVtYmVyLiBUbyB1bnNldCwgcGFzcyAtMVwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZmaS5RVFNfUnVudGltZVNldE1lbW9yeUxpbWl0KHRoaXMucnQudmFsdWUsIGxpbWl0Qnl0ZXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIG1lbW9yeSB1c2FnZSBmb3IgdGhpcyBydW50aW1lLiBSZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBoYW5kbGUgdG8gYVxuICAgICAqIEpTVmFsdWUgb2JqZWN0LiBVc2UgW1tRdWlja0pTQ29udGV4dC5kdW1wXV0gdG8gY29udmVydCB0byBhIG5hdGl2ZSBvYmplY3QuXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGFsbG9jYXRlIG1vcmUgbWVtb3J5IGluc2lkZSB0aGUgcnVudGltZS4gVGhlIGluZm9ybWF0aW9uXG4gICAgICogaXMgYWNjdXJhdGUgYXMgb2YganVzdCBiZWZvcmUgdGhlIGNhbGwgdG8gYGNvbXB1dGVNZW1vcnlVc2FnZWAuXG4gICAgICogRm9yIGEgaHVtYW4tZGlnZXN0aWJsZSByZXByZXNlbnRhdGlvbiwgc2VlIFtbZHVtcE1lbW9yeVVzYWdlXV0uXG4gICAgICovXG4gICAgY29tcHV0ZU1lbW9yeVVzYWdlKCkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlQ29udGV4dE1lbW9yeSA9IHRoaXMuZ2V0U3lzdGVtQ29udGV4dCgpLmdldE1lbW9yeSh0aGlzLnJ0LnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHNlcnZpY2VDb250ZXh0TWVtb3J5LmhlYXBWYWx1ZUhhbmRsZSh0aGlzLmZmaS5RVFNfUnVudGltZUNvbXB1dGVNZW1vcnlVc2FnZSh0aGlzLnJ0LnZhbHVlLCBzZXJ2aWNlQ29udGV4dE1lbW9yeS5jdHgudmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiBtZW1vcnkgdXNhZ2UgaW4gdGhpcyBydW50aW1lLlxuICAgICAqIEZvciBwcm9ncmFtbWF0aWMgYWNjZXNzIHRvIHRoaXMgaW5mb3JtYXRpb24sIHNlZSBbW2NvbXB1dGVNZW1vcnlVc2FnZV1dLlxuICAgICAqL1xuICAgIGR1bXBNZW1vcnlVc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmNvbnN1bWVIZWFwQ2hhclBvaW50ZXIodGhpcy5mZmkuUVRTX1J1bnRpbWVEdW1wTWVtb3J5VXNhZ2UodGhpcy5ydC52YWx1ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG1heCBzdGFjayBzaXplIGZvciB0aGlzIHJ1bnRpbWUsIGluIGJ5dGVzLlxuICAgICAqIFRvIHJlbW92ZSB0aGUgbGltaXQsIHNldCB0byBgMGAuXG4gICAgICovXG4gICAgc2V0TWF4U3RhY2tTaXplKHN0YWNrU2l6ZSkge1xuICAgICAgICBpZiAoc3RhY2tTaXplIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCBtZW1vcnkgbGltaXQgdG8gbmVnYXRpdmUgbnVtYmVyLiBUbyB1bnNldCwgcGFzcyAwLlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZmaS5RVFNfUnVudGltZVNldE1heFN0YWNrU2l6ZSh0aGlzLnJ0LnZhbHVlLCBzdGFja1NpemUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBc3NlcnQgdGhhdCBgaGFuZGxlYCBpcyBvd25lZCBieSB0aGlzIHJ1bnRpbWUuXG4gICAgICogQHRocm93cyBRdWlja0pTV3JvbmdPd25lciBpZiBvd25lZCBieSBhIGRpZmZlcmVudCBydW50aW1lLlxuICAgICAqL1xuICAgIGFzc2VydE93bmVkKGhhbmRsZSkge1xuICAgICAgICBpZiAoaGFuZGxlLm93bmVyICYmIGhhbmRsZS5vd25lci5ydCAhPT0gdGhpcy5ydCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNXcm9uZ093bmVyKGBIYW5kbGUgaXMgbm90IG93bmVkIGJ5IHRoaXMgcnVudGltZTogJHtoYW5kbGUub3duZXIucnQudmFsdWV9ICE9ICR7dGhpcy5ydC52YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRTeXN0ZW1Db250ZXh0KCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dCkge1xuICAgICAgICAgICAgLy8gV2Ugb3duIHRoaXMgY29udGV4dCBhbmQgc2hvdWxkIGRpc3Bvc2Ugb2YgaXQuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQgPSB0aGlzLnNjb3BlLm1hbmFnZSh0aGlzLm5ld0NvbnRleHQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dDtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNSdW50aW1lID0gUXVpY2tKU1J1bnRpbWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ydW50aW1lLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5FdmFsRmxhZ3MgPSBleHBvcnRzLmFzc2VydFN5bmMgPSB2b2lkIDA7XG5mdW5jdGlvbiBhc3NlcnRTeW5jKGZuKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG11c3RCZVN5bmMoLi4uYXJncykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBmbiguLi5hcmdzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiICYmIHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZ1bmN0aW9uIHVuZXhwZWN0ZWRseSByZXR1cm5lZCBhIFByb21pc2VcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xufVxuZXhwb3J0cy5hc3NlcnRTeW5jID0gYXNzZXJ0U3luYztcbi8qKiBCaXRmaWVsZCBvcHRpb25zIGZvciBKU19FdmFsKCkgQyBmdW5jdGlvbi4gKi9cbmV4cG9ydHMuRXZhbEZsYWdzID0ge1xuICAgIC8qKiBnbG9iYWwgY29kZSAoZGVmYXVsdCkgKi9cbiAgICBKU19FVkFMX1RZUEVfR0xPQkFMOiAwIDw8IDAsXG4gICAgLyoqIG1vZHVsZSBjb2RlICovXG4gICAgSlNfRVZBTF9UWVBFX01PRFVMRTogMSA8PCAwLFxuICAgIC8qKiBkaXJlY3QgY2FsbCAoaW50ZXJuYWwgdXNlKSAqL1xuICAgIEpTX0VWQUxfVFlQRV9ESVJFQ1Q6IDIgPDwgMCxcbiAgICAvKiogaW5kaXJlY3QgY2FsbCAoaW50ZXJuYWwgdXNlKSAqL1xuICAgIEpTX0VWQUxfVFlQRV9JTkRJUkVDVDogMyA8PCAwLFxuICAgIEpTX0VWQUxfVFlQRV9NQVNLOiAzIDw8IDAsXG4gICAgLyoqIGZvcmNlICdzdHJpY3QnIG1vZGUgKi9cbiAgICBKU19FVkFMX0ZMQUdfU1RSSUNUOiAxIDw8IDMsXG4gICAgLyoqIGZvcmNlICdzdHJpcCcgbW9kZSAqL1xuICAgIEpTX0VWQUxfRkxBR19TVFJJUDogMSA8PCA0LFxuICAgIC8qKlxuICAgICAqIGNvbXBpbGUgYnV0IGRvIG5vdCBydW4uIFRoZSByZXN1bHQgaXMgYW4gb2JqZWN0IHdpdGggYVxuICAgICAqIEpTX1RBR19GVU5DVElPTl9CWVRFQ09ERSBvciBKU19UQUdfTU9EVUxFIHRhZy4gSXQgY2FuIGJlIGV4ZWN1dGVkXG4gICAgICogd2l0aCBKU19FdmFsRnVuY3Rpb24oKS5cbiAgICAgKi9cbiAgICBKU19FVkFMX0ZMQUdfQ09NUElMRV9PTkxZOiAxIDw8IDUsXG4gICAgLyoqIGRvbid0IGluY2x1ZGUgdGhlIHN0YWNrIGZyYW1lcyBiZWZvcmUgdGhpcyBldmFsIGluIHRoZSBFcnJvcigpIGJhY2t0cmFjZXMgKi9cbiAgICBKU19FVkFMX0ZMQUdfQkFDS1RSQUNFX0JBUlJJRVI6IDEgPDwgNixcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy1mZmkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbmNhdCA9IGV4cG9ydHMuZXZhbE9wdGlvbnNUb0ZsYWdzID0gZXhwb3J0cy5EZWZhdWx0SW50cmluc2ljcyA9IHZvaWQgMDtcbmNvbnN0IHR5cGVzX2ZmaV8xID0gcmVxdWlyZShcIi4vdHlwZXMtZmZpXCIpO1xuY29uc3QgVW5zdGFibGVTeW1ib2wgPSBTeW1ib2woXCJVbnN0YWJsZVwiKTtcbi8vIEZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzXG5jb25zdCBEZWZhdWx0SW50cmluc2ljc0xpc3QgPSBbXG4gICAgXCJCYXNlT2JqZWN0c1wiLFxuICAgIFwiRGF0ZVwiLFxuICAgIFwiRXZhbFwiLFxuICAgIFwiU3RyaW5nTm9ybWFsaXplXCIsXG4gICAgXCJSZWdFeHBcIixcbiAgICBcIkpTT05cIixcbiAgICBcIlByb3h5XCIsXG4gICAgXCJNYXBTZXRcIixcbiAgICBcIlR5cGVkQXJyYXlzXCIsXG4gICAgXCJQcm9taXNlXCIsXG5dO1xuLyoqXG4gKiBXb3JrIGluIHByb2dyZXNzLlxuICovXG5leHBvcnRzLkRlZmF1bHRJbnRyaW5zaWNzID0gU3ltYm9sKFwiRGVmYXVsdEludHJpbnNpY3NcIik7XG4vKiogQ29udmVydCBbW0NvbnRleHRFdmFsT3B0aW9uc11dIHRvIGEgYml0ZmllbGQgZmxhZ3MgKi9cbmZ1bmN0aW9uIGV2YWxPcHRpb25zVG9GbGFncyhldmFsT3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgZXZhbE9wdGlvbnMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGV2YWxPcHRpb25zO1xuICAgIH1cbiAgICBpZiAoZXZhbE9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgeyB0eXBlLCBzdHJpY3QsIHN0cmlwLCBjb21waWxlT25seSwgYmFja3RyYWNlQmFycmllciB9ID0gZXZhbE9wdGlvbnM7XG4gICAgbGV0IGZsYWdzID0gMDtcbiAgICBpZiAodHlwZSA9PT0gXCJnbG9iYWxcIilcbiAgICAgICAgZmxhZ3MgfD0gdHlwZXNfZmZpXzEuRXZhbEZsYWdzLkpTX0VWQUxfVFlQRV9HTE9CQUw7XG4gICAgaWYgKHR5cGUgPT09IFwibW9kdWxlXCIpXG4gICAgICAgIGZsYWdzIHw9IHR5cGVzX2ZmaV8xLkV2YWxGbGFncy5KU19FVkFMX1RZUEVfTU9EVUxFO1xuICAgIGlmIChzdHJpY3QpXG4gICAgICAgIGZsYWdzIHw9IHR5cGVzX2ZmaV8xLkV2YWxGbGFncy5KU19FVkFMX0ZMQUdfU1RSSUNUO1xuICAgIGlmIChzdHJpcClcbiAgICAgICAgZmxhZ3MgfD0gdHlwZXNfZmZpXzEuRXZhbEZsYWdzLkpTX0VWQUxfRkxBR19TVFJJUDtcbiAgICBpZiAoY29tcGlsZU9ubHkpXG4gICAgICAgIGZsYWdzIHw9IHR5cGVzX2ZmaV8xLkV2YWxGbGFncy5KU19FVkFMX0ZMQUdfQ09NUElMRV9PTkxZO1xuICAgIGlmIChiYWNrdHJhY2VCYXJyaWVyKVxuICAgICAgICBmbGFncyB8PSB0eXBlc19mZmlfMS5FdmFsRmxhZ3MuSlNfRVZBTF9GTEFHX0JBQ0tUUkFDRV9CQVJSSUVSO1xuICAgIHJldHVybiBmbGFncztcbn1cbmV4cG9ydHMuZXZhbE9wdGlvbnNUb0ZsYWdzID0gZXZhbE9wdGlvbnNUb0ZsYWdzO1xuZnVuY3Rpb24gY29uY2F0KC4uLnZhbHVlcykge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydHMuY29uY2F0ID0gY29uY2F0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUkVMRUFTRV9BU1lOQyA9IGV4cG9ydHMuREVCVUdfQVNZTkMgPSBleHBvcnRzLlJFTEVBU0VfU1lOQyA9IGV4cG9ydHMuREVCVUdfU1lOQyA9IGV4cG9ydHMubWVtb2l6ZVByb21pc2VGYWN0b3J5ID0gZXhwb3J0cy5uZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlID0gZXhwb3J0cy5uZXdRdWlja0pTV0FTTU1vZHVsZSA9IHZvaWQgMDtcbmNvbnN0IGVzbUhlbHBlcnNfMSA9IHJlcXVpcmUoXCIuL2VzbUhlbHBlcnNcIik7XG4vKipcbiAqIENyZWF0ZSBhIG5ldywgY29tcGxldGVseSBpc29sYXRlZCBXZWJBc3NlbWJseSBtb2R1bGUgY29udGFpbmluZyB0aGUgUXVpY2tKUyBsaWJyYXJ5LlxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIFtbUXVpY2tKU1dBU01Nb2R1bGVdXS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlcmUgaXMgYSBoYXJkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgV2ViQXNzZW1ibHkgbW9kdWxlcyBpbiBvbGRlclxuICogdmVyc2lvbnMgb2Ygdjg6XG4gKiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMjA3NlxuICovXG5hc3luYyBmdW5jdGlvbiBuZXdRdWlja0pTV0FTTU1vZHVsZShcbi8qKlxuICogT3B0aW9uYWxseSwgcGFzcyBhIHtAbGluayBTeW5jQnVpbGRWYXJpYW50fSB0byBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgV2ViQXNzZW1ibHkgbW9kdWxlLlxuICovXG52YXJpYW50ID0gZXhwb3J0cy5SRUxFQVNFX1NZTkMpIHtcbiAgICBjb25zdCBbd2FzbU1vZHVsZUxvYWRlciwgUXVpY2tKU0ZGSSwgeyBRdWlja0pTV0FTTU1vZHVsZSB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdmFyaWFudC5pbXBvcnRNb2R1bGVMb2FkZXIoKSxcbiAgICAgICAgdmFyaWFudC5pbXBvcnRGRkkoKSxcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vbW9kdWxlLmpzXCIpKSkudGhlbihlc21IZWxwZXJzXzEudW53cmFwVHlwZXNjcmlwdCksXG4gICAgXSk7XG4gICAgY29uc3Qgd2FzbU1vZHVsZSA9IGF3YWl0IHdhc21Nb2R1bGVMb2FkZXIoKTtcbiAgICB3YXNtTW9kdWxlLnR5cGUgPSBcInN5bmNcIjtcbiAgICBjb25zdCBmZmkgPSBuZXcgUXVpY2tKU0ZGSSh3YXNtTW9kdWxlKTtcbiAgICByZXR1cm4gbmV3IFF1aWNrSlNXQVNNTW9kdWxlKHdhc21Nb2R1bGUsIGZmaSk7XG59XG5leHBvcnRzLm5ld1F1aWNrSlNXQVNNTW9kdWxlID0gbmV3UXVpY2tKU1dBU01Nb2R1bGU7XG4vKipcbiAqIENyZWF0ZSBhIG5ldywgY29tcGxldGVseSBpc29sYXRlZCBXZWJBc3NlbWJseSBtb2R1bGUgY29udGFpbmluZyBhIHZlcnNpb24gb2YgdGhlIFF1aWNrSlMgbGlicmFyeVxuICogY29tcGlsZWQgd2l0aCBFbXNjcmlwdGVuJ3MgW0FTWU5DSUZZXShodHRwczovL2Vtc2NyaXB0ZW4ub3JnL2RvY3MvcG9ydGluZy9hc3luY2lmeS5odG1sKSB0cmFuc2Zvcm0uXG4gKlxuICogVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG9mZmVycyBmZWF0dXJlcyB0aGF0IGVuYWJsZSBzeW5jaHJvbm91cyBjb2RlXG4gKiBpbnNpZGUgdGhlIFZNIHRvIGludGVyYWN0IHdpdGggYXN5bmNocm9ub3VzIGNvZGUgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQuXG4gKiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gW1tRdWlja0pTQXN5bmNXQVNNTW9kdWxlXV0sIFtbUXVpY2tKU0FzeW5jUnVudGltZV1dLFxuICogYW5kIFtbUXVpY2tKU0FzeW5jQ29udGV4dF1dLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBhIGhhcmQgbGltaXQgb24gdGhlIG51bWJlciBvZiBXZWJBc3NlbWJseSBtb2R1bGVzIGluIG9sZGVyXG4gKiB2ZXJzaW9ucyBvZiB2ODpcbiAqIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTEyMDc2XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5ld1F1aWNrSlNBc3luY1dBU01Nb2R1bGUoXG4vKipcbiAqIE9wdGlvbmFsbHksIHBhc3MgYSB7QGxpbmsgQXN5bmNCdWlsZFZhcmlhbnR9IHRvIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBXZWJBc3NlbWJseSBtb2R1bGUuXG4gKi9cbnZhcmlhbnQgPSBleHBvcnRzLlJFTEVBU0VfQVNZTkMpIHtcbiAgICBjb25zdCBbd2FzbU1vZHVsZUxvYWRlciwgUXVpY2tKU0FzeW5jRkZJLCB7IFF1aWNrSlNBc3luY1dBU01Nb2R1bGUgfV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHZhcmlhbnQuaW1wb3J0TW9kdWxlTG9hZGVyKCksXG4gICAgICAgIHZhcmlhbnQuaW1wb3J0RkZJKCksXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL21vZHVsZS1hc3luY2lmeS5qc1wiKSkpLnRoZW4oZXNtSGVscGVyc18xLnVud3JhcFR5cGVzY3JpcHQpLFxuICAgIF0pO1xuICAgIGNvbnN0IHdhc21Nb2R1bGUgPSBhd2FpdCB3YXNtTW9kdWxlTG9hZGVyKCk7XG4gICAgd2FzbU1vZHVsZS50eXBlID0gXCJhc3luY1wiO1xuICAgIGNvbnN0IGZmaSA9IG5ldyBRdWlja0pTQXN5bmNGRkkod2FzbU1vZHVsZSk7XG4gICAgcmV0dXJuIG5ldyBRdWlja0pTQXN5bmNXQVNNTW9kdWxlKHdhc21Nb2R1bGUsIGZmaSk7XG59XG5leHBvcnRzLm5ld1F1aWNrSlNBc3luY1dBU01Nb2R1bGUgPSBuZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlO1xuLyoqXG4gKiBIZWxwZXIgaW50ZW5kZWQgdG8gbWVtb2l6ZSB0aGUgY3JlYXRpb24gb2YgYSBXZWJBc3NlbWJseSBtb2R1bGUuXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBnZXREZWJ1Z01vZHVsZSA9IG1lbW9pemVQcm9taXNlRmFjdG9yeSgoKSA9PiBuZXdRdWlja0pTV0FTTU1vZHVsZShERUJVR19TWU5DKSlcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBtZW1vaXplUHJvbWlzZUZhY3RvcnkoZm4pIHtcbiAgICBsZXQgcHJvbWlzZTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHByb21pc2UgPz8gKHByb21pc2UgPSBmbigpKSk7XG4gICAgfTtcbn1cbmV4cG9ydHMubWVtb2l6ZVByb21pc2VGYWN0b3J5ID0gbWVtb2l6ZVByb21pc2VGYWN0b3J5O1xuLyoqXG4gKiBUaGlzIGJ1aWxkIHZhcmlhbnQgaXMgY29tcGlsZWQgd2l0aCBgLWZzYW5pdGl6ZT1sZWFrYC4gSXQgaW5zdHJ1bWVudHMgYWxsXG4gKiBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIHdoZW4gY29tYmluZWQgd2l0aCBzb3VyY2VtYXBzLCBjYW4gcHJlc2VudCBzdGFjayB0cmFjZVxuICogbG9jYXRpb25zIHdoZXJlIG1lbW9yeSBsZWFrcyBvY2N1ci5cbiAqXG4gKiBTZWUgW1tUZXN0UXVpY2tKU1dBU01Nb2R1bGVdXSB3aGljaCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxlYWsgc2FuaXRpemVyIHZpYVxuICoge0BsaW5rIFRlc3RRdWlja0pTV0FTTU1vZHVsZS5hc3NlcnROb01lbW9yeUFsbG9jYXRlZH0uXG4gKlxuICogVGhlIGRvd25zaWRlIGlzIHRoYXQgaXQncyAxMDAtMTAwMHggc2xvd2VyIHRoYW4gdGhlIG90aGVyIHZhcmlhbnRzLlxuICogU3VnZ2VzdGVkIHVzZSBjYXNlOiBhdXRvbWF0ZWQgdGVzdGluZywgcmVncmVzc2lvbiB0ZXN0aW5nLCBhbmQgaW50ZXJhY3RpdmVcbiAqIGRlYnVnZ2luZy5cbiAqL1xuZXhwb3J0cy5ERUJVR19TWU5DID0ge1xuICAgIHR5cGU6IFwic3luY1wiLFxuICAgIGFzeW5jIGltcG9ydEZGSSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICAvLyBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoXCIuL2dlbmVyYXRlZC9mZmkuV0FTTV9ERUJVR19TWU5DLmpzXCIpXG4gICAgICAgIC8vIHJldHVybiB1bndyYXBUeXBlc2NyaXB0KG1vZCkuUXVpY2tKU0ZGSVxuICAgIH0sXG4gICAgYXN5bmMgaW1wb3J0TW9kdWxlTG9hZGVyKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgIC8vIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChcIi4vZ2VuZXJhdGVkL2Vtc2NyaXB0ZW4tbW9kdWxlLldBU01fREVCVUdfU1lOQy5qc1wiKVxuICAgICAgICAvLyByZXR1cm4gdW53cmFwSmF2YXNjcmlwdChtb2QpLmRlZmF1bHRcbiAgICB9LFxufTtcbi8qKlxuICogVGhpcyBpcyB0aGUgZGVmYXVsdCAoc3luY2hyb25vdXMpIGJ1aWxkIHZhcmlhbnQuXG4gKiB7QGxpbmsgZ2V0UXVpY2tKU30gcmV0dXJucyBhIG1lbW9pemVkIGluc3RhbmNlIG9mIHRoaXMgYnVpbGQgdmFyaWFudC5cbiAqL1xuZXhwb3J0cy5SRUxFQVNFX1NZTkMgPSB7XG4gICAgdHlwZTogXCJzeW5jXCIsXG4gICAgYXN5bmMgaW1wb3J0RkZJKCkge1xuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9nZW5lcmF0ZWQvZmZpLldBU01fUkVMRUFTRV9TWU5DLmpzXCIpKSk7XG4gICAgICAgIHJldHVybiAoMCwgZXNtSGVscGVyc18xLnVud3JhcFR5cGVzY3JpcHQpKG1vZCkuUXVpY2tKU0ZGSTtcbiAgICB9LFxuICAgIGFzeW5jIGltcG9ydE1vZHVsZUxvYWRlcigpIHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vZ2VuZXJhdGVkL2Vtc2NyaXB0ZW4tbW9kdWxlLldBU01fUkVMRUFTRV9TWU5DLmpzXCIpKSk7XG4gICAgICAgIHJldHVybiAoMCwgZXNtSGVscGVyc18xLnVud3JhcEphdmFzY3JpcHQpKG1vZCk7XG4gICAgfSxcbn07XG4vKipcbiAqIFRoZSBhc3luYyBkZWJ1ZyBidWlsZCB2YXJpYW50IG1heSBvciBtYXkgbm90IGhhdmUgdGhlIHNhbml0aXplciBlbmFibGVkLlxuICogSXQgZG9lcyBwcmludCBhIGxvdCBvZiBkZWJ1ZyBsb2dzLlxuICpcbiAqIFN1Z2dlc3RlZCB1c2UgY2FzZTogaW50ZXJhY3RpdmUgZGVidWdnaW5nIG9ubHkuXG4gKi9cbmV4cG9ydHMuREVCVUdfQVNZTkMgPSB7XG4gICAgdHlwZTogXCJhc3luY1wiLFxuICAgIGFzeW5jIGltcG9ydEZGSSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICAvLyBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoXCIuL2dlbmVyYXRlZC9mZmkuV0FTTV9ERUJVR19BU1lOQ0lGWS5qc1wiKVxuICAgICAgICAvLyByZXR1cm4gdW53cmFwVHlwZXNjcmlwdChtb2QpLlF1aWNrSlNBc3luY0ZGSVxuICAgIH0sXG4gICAgYXN5bmMgaW1wb3J0TW9kdWxlTG9hZGVyKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgIC8vIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChcIi4vZ2VuZXJhdGVkL2Vtc2NyaXB0ZW4tbW9kdWxlLldBU01fREVCVUdfQVNZTkNJRlkuanNcIilcbiAgICAgICAgLy8gcmV0dXJuIHVud3JhcEphdmFzY3JpcHQobW9kKS5kZWZhdWx0XG4gICAgfSxcbn07XG4vKipcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgYXN5bmNpZmllZCBidWlsZCB2YXJpYW50LlxuICovXG5leHBvcnRzLlJFTEVBU0VfQVNZTkMgPSB7XG4gICAgdHlwZTogXCJhc3luY1wiLFxuICAgIGFzeW5jIGltcG9ydEZGSSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICAvLyBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoXCIuL2dlbmVyYXRlZC9mZmkuV0FTTV9SRUxFQVNFX0FTWU5DSUZZLmpzXCIpXG4gICAgICAgIC8vIHJldHVybiB1bndyYXBUeXBlc2NyaXB0KG1vZCkuUXVpY2tKU0FzeW5jRkZJXG4gICAgfSxcbiAgICBhc3luYyBpbXBvcnRNb2R1bGVMb2FkZXIoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgLy8gY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KFwiLi9nZW5lcmF0ZWQvZW1zY3JpcHRlbi1tb2R1bGUuV0FTTV9SRUxFQVNFX0FTWU5DSUZZLmpzXCIpXG4gICAgICAgIC8vIHJldHVybiB1bndyYXBKYXZhc2NyaXB0KG1vZCkuZGVmYXVsdFxuICAgIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmFyaWFudHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzRmFpbCA9IGV4cG9ydHMuaXNTdWNjZXNzID0gdm9pZCAwO1xuZnVuY3Rpb24gaXNTdWNjZXNzKHN1Y2Nlc3NPckZhaWwpIHtcbiAgICByZXR1cm4gXCJlcnJvclwiIGluIHN1Y2Nlc3NPckZhaWwgPT09IGZhbHNlO1xufVxuZXhwb3J0cy5pc1N1Y2Nlc3MgPSBpc1N1Y2Nlc3M7XG5mdW5jdGlvbiBpc0ZhaWwoc3VjY2Vzc09yRmFpbCkge1xuICAgIHJldHVybiBcImVycm9yXCIgaW4gc3VjY2Vzc09yRmFpbCA9PT0gdHJ1ZTtcbn1cbmV4cG9ydHMuaXNGYWlsID0gaXNGYWlsO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dm0taW50ZXJmYWNlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlcSA9IGV4cG9ydHMuanNvbiA9IGV4cG9ydHMudG9CdWZmZXIgPSB2b2lkIDA7XG5jb25zdCBodHRwID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwXCIpKTtcbmNvbnN0IGh0dHBzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwc1wiKSk7XG5hc3luYyBmdW5jdGlvbiB0b0J1ZmZlcihzdHJlYW0pIHtcbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHN0cmVhbSkge1xuICAgICAgICBsZW5ndGggKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcywgbGVuZ3RoKTtcbn1cbmV4cG9ydHMudG9CdWZmZXIgPSB0b0J1ZmZlcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5hc3luYyBmdW5jdGlvbiBqc29uKHN0cmVhbSkge1xuICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHRvQnVmZmVyKHN0cmVhbSk7XG4gICAgY29uc3Qgc3RyID0gYnVmLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbiAgICB9XG4gICAgY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgY29uc3QgZXJyID0gX2VycjtcbiAgICAgICAgZXJyLm1lc3NhZ2UgKz0gYCAoaW5wdXQ6ICR7c3RyfSlgO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufVxuZXhwb3J0cy5qc29uID0ganNvbjtcbmZ1bmN0aW9uIHJlcSh1cmwsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGhyZWYgPSB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyA/IHVybCA6IHVybC5ocmVmO1xuICAgIGNvbnN0IHJlcSA9IChocmVmLnN0YXJ0c1dpdGgoJ2h0dHBzOicpID8gaHR0cHMgOiBodHRwKS5yZXF1ZXN0KHVybCwgb3B0cyk7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcmVxXG4gICAgICAgICAgICAub25jZSgncmVzcG9uc2UnLCByZXNvbHZlKVxuICAgICAgICAgICAgLm9uY2UoJ2Vycm9yJywgcmVqZWN0KVxuICAgICAgICAgICAgLmVuZCgpO1xuICAgIH0pO1xuICAgIHJlcS50aGVuID0gcHJvbWlzZS50aGVuLmJpbmQocHJvbWlzZSk7XG4gICAgcmV0dXJuIHJlcTtcbn1cbmV4cG9ydHMucmVxID0gcmVxO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGVscGVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQWdlbnQgPSB2b2lkIDA7XG5jb25zdCBuZXQgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm5ldFwiKSk7XG5jb25zdCBodHRwID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwXCIpKTtcbmNvbnN0IGh0dHBzXzEgPSByZXF1aXJlKFwiaHR0cHNcIik7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vaGVscGVyc1wiKSwgZXhwb3J0cyk7XG5jb25zdCBJTlRFUk5BTCA9IFN5bWJvbCgnQWdlbnRCYXNlSW50ZXJuYWxTdGF0ZScpO1xuY2xhc3MgQWdlbnQgZXh0ZW5kcyBodHRwLkFnZW50IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzW0lOVEVSTkFMXSA9IHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGFuIGBodHRwYCBvciBgaHR0cHNgIHJlcXVlc3QuXG4gICAgICovXG4gICAgaXNTZWN1cmVFbmRwb2ludChvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBjaGVjayB0aGUgYHNlY3VyZUVuZHBvaW50YCBwcm9wZXJ0eSBleHBsaWNpdGx5LCBzaW5jZSB0aGlzXG4gICAgICAgICAgICAvLyBtZWFucyB0aGF0IGEgcGFyZW50IGBBZ2VudGAgaXMgXCJwYXNzaW5nIHRocm91Z2hcIiB0byB0aGlzIGluc3RhbmNlLlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zZWN1cmVFbmRwb2ludCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc2VjdXJlRW5kcG9pbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBubyBleHBsaWNpdCBgc2VjdXJlYCBlbmRwb2ludCwgY2hlY2sgaWYgYHByb3RvY29sYCBwcm9wZXJ0eSBpc1xuICAgICAgICAgICAgLy8gc2V0LiBUaGlzIHdpbGwgdXN1YWxseSBiZSB0aGUgY2FzZSBzaW5jZSB1c2luZyBhIGZ1bGwgc3RyaW5nIFVSTFxuICAgICAgICAgICAgLy8gb3IgYFVSTGAgaW5zdGFuY2Ugc2hvdWxkIGJlIHRoZSBtb3N0IGNvbW1vbiB1c2FnZS5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5wcm90b2NvbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmluYWxseSwgaWYgbm8gYHByb3RvY29sYCBwcm9wZXJ0eSB3YXMgc2V0LCB0aGVuIGZhbGwgYmFjayB0b1xuICAgICAgICAvLyBjaGVja2luZyB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlIGN1cnJlbnQgY2FsbCBzdGFjaywgYW5kIHRyeSB0b1xuICAgICAgICAvLyBkZXRlY3QgdGhlIFwiaHR0cHNcIiBtb2R1bGUuXG4gICAgICAgIGNvbnN0IHsgc3RhY2sgfSA9IG5ldyBFcnJvcigpO1xuICAgICAgICBpZiAodHlwZW9mIHN0YWNrICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHN0YWNrXG4gICAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAuc29tZSgobCkgPT4gbC5pbmRleE9mKCcoaHR0cHMuanM6JykgIT09IC0xIHx8XG4gICAgICAgICAgICBsLmluZGV4T2YoJ25vZGU6aHR0cHM6JykgIT09IC0xKTtcbiAgICB9XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCBhc3luYyBzaWduYXR1cmVzIGluIGBjb25uZWN0KClgIGFuZCBOb2RlJ3MgbmF0aXZlXG4gICAgLy8gY29ubmVjdGlvbiBwb29saW5nIGluIGBodHRwLkFnZW50YCwgdGhlIGFycmF5IG9mIHNvY2tldHMgZm9yIGVhY2ggb3JpZ2luXG4gICAgLy8gaGFzIHRvIGJlIHVwZGF0ZWQgc3luY2hyb25vdXNseS4gVGhpcyBpcyBzbyB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBpc1xuICAgIC8vIGFjY3VyYXRlIHdoZW4gYGFkZFJlcXVlc3QoKWAgaXMgbmV4dCBjYWxsZWQuIFdlIGFjaGlldmUgdGhpcyBieSBjcmVhdGluZyBhXG4gICAgLy8gZmFrZSBzb2NrZXQgYW5kIGFkZGluZyBpdCB0byBgc29ja2V0c1tvcmlnaW5dYCBhbmQgaW5jcmVtZW50aW5nXG4gICAgLy8gYHRvdGFsU29ja2V0Q291bnRgLlxuICAgIGluY3JlbWVudFNvY2tldHMobmFtZSkge1xuICAgICAgICAvLyBJZiBgbWF4U29ja2V0c2AgYW5kIGBtYXhUb3RhbFNvY2tldHNgIGFyZSBib3RoIEluZmluaXR5IHRoZW4gdGhlcmUgaXMgbm9cbiAgICAgICAgLy8gbmVlZCB0byBjcmVhdGUgYSBmYWtlIHNvY2tldCBiZWNhdXNlIE5vZGUuanMgbmF0aXZlIGNvbm5lY3Rpb24gcG9vbGluZ1xuICAgICAgICAvLyB3aWxsIG5ldmVyIGJlIGludm9rZWQuXG4gICAgICAgIGlmICh0aGlzLm1heFNvY2tldHMgPT09IEluZmluaXR5ICYmIHRoaXMubWF4VG90YWxTb2NrZXRzID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxsIGluc3RhbmNlcyBvZiBgc29ja2V0c2AgYXJlIGV4cGVjdGVkIFR5cGVTY3JpcHQgZXJyb3JzLiBUaGVcbiAgICAgICAgLy8gYWx0ZXJuYXRpdmUgaXMgdG8gYWRkIGl0IGFzIGEgcHJpdmF0ZSBwcm9wZXJ0eSBvZiB0aGlzIGNsYXNzIGJ1dCB0aGF0XG4gICAgICAgIC8vIHdpbGwgYnJlYWsgVHlwZVNjcmlwdCBzdWJjbGFzc2luZy5cbiAgICAgICAgaWYgKCF0aGlzLnNvY2tldHNbbmFtZV0pIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYHNvY2tldHNgIGlzIHJlYWRvbmx5IGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgICAgIHRoaXMuc29ja2V0c1tuYW1lXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZha2VTb2NrZXQgPSBuZXcgbmV0LlNvY2tldCh7IHdyaXRhYmxlOiBmYWxzZSB9KTtcbiAgICAgICAgdGhpcy5zb2NrZXRzW25hbWVdLnB1c2goZmFrZVNvY2tldCk7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYHRvdGFsU29ja2V0Q291bnRgIGlzbid0IGRlZmluZWQgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICB0aGlzLnRvdGFsU29ja2V0Q291bnQrKztcbiAgICAgICAgcmV0dXJuIGZha2VTb2NrZXQ7XG4gICAgfVxuICAgIGRlY3JlbWVudFNvY2tldHMobmFtZSwgc29ja2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5zb2NrZXRzW25hbWVdIHx8IHNvY2tldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvY2tldHMgPSB0aGlzLnNvY2tldHNbbmFtZV07XG4gICAgICAgIGNvbnN0IGluZGV4ID0gc29ja2V0cy5pbmRleE9mKHNvY2tldCk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHNvY2tldHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgIGB0b3RhbFNvY2tldENvdW50YCBpc24ndCBkZWZpbmVkIGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgICAgIHRoaXMudG90YWxTb2NrZXRDb3VudC0tO1xuICAgICAgICAgICAgaWYgKHNvY2tldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgc29ja2V0c2AgaXMgcmVhZG9ubHkgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNvY2tldHNbbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSW4gb3JkZXIgdG8gcHJvcGVybHkgdXBkYXRlIHRoZSBzb2NrZXQgcG9vbCwgd2UgbmVlZCB0byBjYWxsIGBnZXROYW1lKClgIG9uXG4gICAgLy8gdGhlIGNvcmUgYGh0dHBzLkFnZW50YCBpZiBpdCBpcyBhIHNlY3VyZUVuZHBvaW50LlxuICAgIGdldE5hbWUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBzZWN1cmVFbmRwb2ludCA9IHR5cGVvZiBvcHRpb25zLnNlY3VyZUVuZHBvaW50ID09PSAnYm9vbGVhbidcbiAgICAgICAgICAgID8gb3B0aW9ucy5zZWN1cmVFbmRwb2ludFxuICAgICAgICAgICAgOiB0aGlzLmlzU2VjdXJlRW5kcG9pbnQob3B0aW9ucyk7XG4gICAgICAgIGlmIChzZWN1cmVFbmRwb2ludCkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgZ2V0TmFtZSgpYCBpc24ndCBkZWZpbmVkIGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgICAgIHJldHVybiBodHRwc18xLkFnZW50LnByb3RvdHlwZS5nZXROYW1lLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgZ2V0TmFtZSgpYCBpc24ndCBkZWZpbmVkIGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5hbWUob3B0aW9ucyk7XG4gICAgfVxuICAgIGNyZWF0ZVNvY2tldChyZXEsIG9wdGlvbnMsIGNiKSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3RPcHRzID0ge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHNlY3VyZUVuZHBvaW50OiB0aGlzLmlzU2VjdXJlRW5kcG9pbnQob3B0aW9ucyksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldE5hbWUoY29ubmVjdE9wdHMpO1xuICAgICAgICBjb25zdCBmYWtlU29ja2V0ID0gdGhpcy5pbmNyZW1lbnRTb2NrZXRzKG5hbWUpO1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5jb25uZWN0KHJlcSwgY29ubmVjdE9wdHMpKVxuICAgICAgICAgICAgLnRoZW4oKHNvY2tldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRTb2NrZXRzKG5hbWUsIGZha2VTb2NrZXQpO1xuICAgICAgICAgICAgaWYgKHNvY2tldCBpbnN0YW5jZW9mIGh0dHAuQWdlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBhZGRSZXF1ZXN0KClgIGlzbid0IGRlZmluZWQgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICAgICAgICAgIHJldHVybiBzb2NrZXQuYWRkUmVxdWVzdChyZXEsIGNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXNbSU5URVJOQUxdLmN1cnJlbnRTb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBjcmVhdGVTb2NrZXQoKWAgaXNuJ3QgZGVmaW5lZCBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgICAgICBzdXBlci5jcmVhdGVTb2NrZXQocmVxLCBvcHRpb25zLCBjYik7XG4gICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50U29ja2V0cyhuYW1lLCBmYWtlU29ja2V0KTtcbiAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjcmVhdGVDb25uZWN0aW9uKCkge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSB0aGlzW0lOVEVSTkFMXS5jdXJyZW50U29ja2V0O1xuICAgICAgICB0aGlzW0lOVEVSTkFMXS5jdXJyZW50U29ja2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIXNvY2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzb2NrZXQgd2FzIHJldHVybmVkIGluIHRoZSBgY29ubmVjdCgpYCBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb2NrZXQ7XG4gICAgfVxuICAgIGdldCBkZWZhdWx0UG9ydCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzW0lOVEVSTkFMXS5kZWZhdWx0UG9ydCA/P1xuICAgICAgICAgICAgKHRoaXMucHJvdG9jb2wgPT09ICdodHRwczonID8gNDQzIDogODApKTtcbiAgICB9XG4gICAgc2V0IGRlZmF1bHRQb3J0KHYpIHtcbiAgICAgICAgaWYgKHRoaXNbSU5URVJOQUxdKSB7XG4gICAgICAgICAgICB0aGlzW0lOVEVSTkFMXS5kZWZhdWx0UG9ydCA9IHY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHByb3RvY29sKCkge1xuICAgICAgICByZXR1cm4gKHRoaXNbSU5URVJOQUxdLnByb3RvY29sID8/XG4gICAgICAgICAgICAodGhpcy5pc1NlY3VyZUVuZHBvaW50KCkgPyAnaHR0cHM6JyA6ICdodHRwOicpKTtcbiAgICB9XG4gICAgc2V0IHByb3RvY29sKHYpIHtcbiAgICAgICAgaWYgKHRoaXNbSU5URVJOQUxdKSB7XG4gICAgICAgICAgICB0aGlzW0lOVEVSTkFMXS5wcm90b2NvbCA9IHY7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFnZW50ID0gQWdlbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gKHtvbmx5Rmlyc3QgPSBmYWxzZX0gPSB7fSkgPT4ge1xuXHRjb25zdCBwYXR0ZXJuID0gW1xuXHRcdCdbXFxcXHUwMDFCXFxcXHUwMDlCXVtbXFxcXF0oKSM7P10qKD86KD86KD86KD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKykqfFthLXpBLVpcXFxcZF0rKD86O1stYS16QS1aXFxcXGRcXFxcLyMmLjo9PyVAfl9dKikqKT9cXFxcdTAwMDcpJyxcblx0XHQnKD86KD86XFxcXGR7MSw0fSg/OjtcXFxcZHswLDR9KSopP1tcXFxcZEEtUFItVFpjZi1udHFyeT0+PH5dKSknXG5cdF0uam9pbignfCcpO1xuXG5cdHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4sIG9ubHlGaXJzdCA/IHVuZGVmaW5lZCA6ICdnJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB3cmFwQW5zaTE2ID0gKGZuLCBvZmZzZXQpID0+ICguLi5hcmdzKSA9PiB7XG5cdGNvbnN0IGNvZGUgPSBmbiguLi5hcmdzKTtcblx0cmV0dXJuIGBcXHUwMDFCWyR7Y29kZSArIG9mZnNldH1tYDtcbn07XG5cbmNvbnN0IHdyYXBBbnNpMjU2ID0gKGZuLCBvZmZzZXQpID0+ICguLi5hcmdzKSA9PiB7XG5cdGNvbnN0IGNvZGUgPSBmbiguLi5hcmdzKTtcblx0cmV0dXJuIGBcXHUwMDFCWyR7MzggKyBvZmZzZXR9OzU7JHtjb2RlfW1gO1xufTtcblxuY29uc3Qgd3JhcEFuc2kxNm0gPSAoZm4sIG9mZnNldCkgPT4gKC4uLmFyZ3MpID0+IHtcblx0Y29uc3QgcmdiID0gZm4oLi4uYXJncyk7XG5cdHJldHVybiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTsyOyR7cmdiWzBdfTske3JnYlsxXX07JHtyZ2JbMl19bWA7XG59O1xuXG5jb25zdCBhbnNpMmFuc2kgPSBuID0+IG47XG5jb25zdCByZ2IycmdiID0gKHIsIGcsIGIpID0+IFtyLCBnLCBiXTtcblxuY29uc3Qgc2V0TGF6eVByb3BlcnR5ID0gKG9iamVjdCwgcHJvcGVydHksIGdldCkgPT4ge1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwge1xuXHRcdGdldDogKCkgPT4ge1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBnZXQoKTtcblxuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHtcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9LFxuXHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdH0pO1xufTtcblxuLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KCdjb2xvci1jb252ZXJ0Jyl9ICovXG5sZXQgY29sb3JDb252ZXJ0O1xuY29uc3QgbWFrZUR5bmFtaWNTdHlsZXMgPSAod3JhcCwgdGFyZ2V0U3BhY2UsIGlkZW50aXR5LCBpc0JhY2tncm91bmQpID0+IHtcblx0aWYgKGNvbG9yQ29udmVydCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Y29sb3JDb252ZXJ0ID0gcmVxdWlyZSgnY29sb3ItY29udmVydCcpO1xuXHR9XG5cblx0Y29uc3Qgb2Zmc2V0ID0gaXNCYWNrZ3JvdW5kID8gMTAgOiAwO1xuXHRjb25zdCBzdHlsZXMgPSB7fTtcblxuXHRmb3IgKGNvbnN0IFtzb3VyY2VTcGFjZSwgc3VpdGVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbG9yQ29udmVydCkpIHtcblx0XHRjb25zdCBuYW1lID0gc291cmNlU3BhY2UgPT09ICdhbnNpMTYnID8gJ2Fuc2knIDogc291cmNlU3BhY2U7XG5cdFx0aWYgKHNvdXJjZVNwYWNlID09PSB0YXJnZXRTcGFjZSkge1xuXHRcdFx0c3R5bGVzW25hbWVdID0gd3JhcChpZGVudGl0eSwgb2Zmc2V0KTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzdWl0ZSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdHN0eWxlc1tuYW1lXSA9IHdyYXAoc3VpdGVbdGFyZ2V0U3BhY2VdLCBvZmZzZXQpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBzdHlsZXM7XG59O1xuXG5mdW5jdGlvbiBhc3NlbWJsZVN0eWxlcygpIHtcblx0Y29uc3QgY29kZXMgPSBuZXcgTWFwKCk7XG5cdGNvbnN0IHN0eWxlcyA9IHtcblx0XHRtb2RpZmllcjoge1xuXHRcdFx0cmVzZXQ6IFswLCAwXSxcblx0XHRcdC8vIDIxIGlzbid0IHdpZGVseSBzdXBwb3J0ZWQgYW5kIDIyIGRvZXMgdGhlIHNhbWUgdGhpbmdcblx0XHRcdGJvbGQ6IFsxLCAyMl0sXG5cdFx0XHRkaW06IFsyLCAyMl0sXG5cdFx0XHRpdGFsaWM6IFszLCAyM10sXG5cdFx0XHR1bmRlcmxpbmU6IFs0LCAyNF0sXG5cdFx0XHRpbnZlcnNlOiBbNywgMjddLFxuXHRcdFx0aGlkZGVuOiBbOCwgMjhdLFxuXHRcdFx0c3RyaWtldGhyb3VnaDogWzksIDI5XVxuXHRcdH0sXG5cdFx0Y29sb3I6IHtcblx0XHRcdGJsYWNrOiBbMzAsIDM5XSxcblx0XHRcdHJlZDogWzMxLCAzOV0sXG5cdFx0XHRncmVlbjogWzMyLCAzOV0sXG5cdFx0XHR5ZWxsb3c6IFszMywgMzldLFxuXHRcdFx0Ymx1ZTogWzM0LCAzOV0sXG5cdFx0XHRtYWdlbnRhOiBbMzUsIDM5XSxcblx0XHRcdGN5YW46IFszNiwgMzldLFxuXHRcdFx0d2hpdGU6IFszNywgMzldLFxuXG5cdFx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRcdGJsYWNrQnJpZ2h0OiBbOTAsIDM5XSxcblx0XHRcdHJlZEJyaWdodDogWzkxLCAzOV0sXG5cdFx0XHRncmVlbkJyaWdodDogWzkyLCAzOV0sXG5cdFx0XHR5ZWxsb3dCcmlnaHQ6IFs5MywgMzldLFxuXHRcdFx0Ymx1ZUJyaWdodDogWzk0LCAzOV0sXG5cdFx0XHRtYWdlbnRhQnJpZ2h0OiBbOTUsIDM5XSxcblx0XHRcdGN5YW5CcmlnaHQ6IFs5NiwgMzldLFxuXHRcdFx0d2hpdGVCcmlnaHQ6IFs5NywgMzldXG5cdFx0fSxcblx0XHRiZ0NvbG9yOiB7XG5cdFx0XHRiZ0JsYWNrOiBbNDAsIDQ5XSxcblx0XHRcdGJnUmVkOiBbNDEsIDQ5XSxcblx0XHRcdGJnR3JlZW46IFs0MiwgNDldLFxuXHRcdFx0YmdZZWxsb3c6IFs0MywgNDldLFxuXHRcdFx0YmdCbHVlOiBbNDQsIDQ5XSxcblx0XHRcdGJnTWFnZW50YTogWzQ1LCA0OV0sXG5cdFx0XHRiZ0N5YW46IFs0NiwgNDldLFxuXHRcdFx0YmdXaGl0ZTogWzQ3LCA0OV0sXG5cblx0XHRcdC8vIEJyaWdodCBjb2xvclxuXHRcdFx0YmdCbGFja0JyaWdodDogWzEwMCwgNDldLFxuXHRcdFx0YmdSZWRCcmlnaHQ6IFsxMDEsIDQ5XSxcblx0XHRcdGJnR3JlZW5CcmlnaHQ6IFsxMDIsIDQ5XSxcblx0XHRcdGJnWWVsbG93QnJpZ2h0OiBbMTAzLCA0OV0sXG5cdFx0XHRiZ0JsdWVCcmlnaHQ6IFsxMDQsIDQ5XSxcblx0XHRcdGJnTWFnZW50YUJyaWdodDogWzEwNSwgNDldLFxuXHRcdFx0YmdDeWFuQnJpZ2h0OiBbMTA2LCA0OV0sXG5cdFx0XHRiZ1doaXRlQnJpZ2h0OiBbMTA3LCA0OV1cblx0XHR9XG5cdH07XG5cblx0Ly8gQWxpYXMgYnJpZ2h0IGJsYWNrIGFzIGdyYXkgKGFuZCBncmV5KVxuXHRzdHlsZXMuY29sb3IuZ3JheSA9IHN0eWxlcy5jb2xvci5ibGFja0JyaWdodDtcblx0c3R5bGVzLmJnQ29sb3IuYmdHcmF5ID0gc3R5bGVzLmJnQ29sb3IuYmdCbGFja0JyaWdodDtcblx0c3R5bGVzLmNvbG9yLmdyZXkgPSBzdHlsZXMuY29sb3IuYmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5iZ0NvbG9yLmJnR3JleSA9IHN0eWxlcy5iZ0NvbG9yLmJnQmxhY2tCcmlnaHQ7XG5cblx0Zm9yIChjb25zdCBbZ3JvdXBOYW1lLCBncm91cF0gb2YgT2JqZWN0LmVudHJpZXMoc3R5bGVzKSkge1xuXHRcdGZvciAoY29uc3QgW3N0eWxlTmFtZSwgc3R5bGVdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwKSkge1xuXHRcdFx0c3R5bGVzW3N0eWxlTmFtZV0gPSB7XG5cdFx0XHRcdG9wZW46IGBcXHUwMDFCWyR7c3R5bGVbMF19bWAsXG5cdFx0XHRcdGNsb3NlOiBgXFx1MDAxQlske3N0eWxlWzFdfW1gXG5cdFx0XHR9O1xuXG5cdFx0XHRncm91cFtzdHlsZU5hbWVdID0gc3R5bGVzW3N0eWxlTmFtZV07XG5cblx0XHRcdGNvZGVzLnNldChzdHlsZVswXSwgc3R5bGVbMV0pO1xuXHRcdH1cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsIGdyb3VwTmFtZSwge1xuXHRcdFx0dmFsdWU6IGdyb3VwLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2Vcblx0XHR9KTtcblx0fVxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdHlsZXMsICdjb2RlcycsIHtcblx0XHR2YWx1ZTogY29kZXMsXG5cdFx0ZW51bWVyYWJsZTogZmFsc2Vcblx0fSk7XG5cblx0c3R5bGVzLmNvbG9yLmNsb3NlID0gJ1xcdTAwMUJbMzltJztcblx0c3R5bGVzLmJnQ29sb3IuY2xvc2UgPSAnXFx1MDAxQls0OW0nO1xuXG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuY29sb3IsICdhbnNpJywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kxNiwgJ2Fuc2kxNicsIGFuc2kyYW5zaSwgZmFsc2UpKTtcblx0c2V0TGF6eVByb3BlcnR5KHN0eWxlcy5jb2xvciwgJ2Fuc2kyNTYnLCAoKSA9PiBtYWtlRHluYW1pY1N0eWxlcyh3cmFwQW5zaTI1NiwgJ2Fuc2kyNTYnLCBhbnNpMmFuc2ksIGZhbHNlKSk7XG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuY29sb3IsICdhbnNpMTZtJywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kxNm0sICdyZ2InLCByZ2IycmdiLCBmYWxzZSkpO1xuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmJnQ29sb3IsICdhbnNpJywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kxNiwgJ2Fuc2kxNicsIGFuc2kyYW5zaSwgdHJ1ZSkpO1xuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmJnQ29sb3IsICdhbnNpMjU2JywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kyNTYsICdhbnNpMjU2JywgYW5zaTJhbnNpLCB0cnVlKSk7XG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuYmdDb2xvciwgJ2Fuc2kxNm0nLCAoKSA9PiBtYWtlRHluYW1pY1N0eWxlcyh3cmFwQW5zaTE2bSwgJ3JnYicsIHJnYjJyZ2IsIHRydWUpKTtcblxuXHRyZXR1cm4gc3R5bGVzO1xufVxuXG4vLyBNYWtlIHRoZSBleHBvcnQgaW1tdXRhYmxlXG5PYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCAnZXhwb3J0cycsIHtcblx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0Z2V0OiBhc3NlbWJsZVN0eWxlc1xufSk7XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG52YXIgZXM3XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9lczdcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICBmb3JrLnVzZShlczdfMS5kZWZhdWx0KTtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBkZWZhdWx0cyA9IGZvcmsudXNlKHNoYXJlZF8xLmRlZmF1bHQpLmRlZmF1bHRzO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICB2YXIgb3IgPSB0eXBlcy5UeXBlLm9yO1xuICAgIGRlZihcIk5vb3BcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIkRvRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbZGVmKFwiU3RhdGVtZW50XCIpXSk7XG4gICAgZGVmKFwiU3VwZXJcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJCaW5kRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9iamVjdFwiLCBcImNhbGxlZVwiKVxuICAgICAgICAuZmllbGQoXCJvYmplY3RcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcImNhbGxlZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJEZWNvcmF0b3JcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25cIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiUHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwiZGVjb3JhdG9yc1wiLCBvcihbZGVmKFwiRGVjb3JhdG9yXCIpXSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiTWV0aG9kRGVmaW5pdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJkZWNvcmF0b3JzXCIsIG9yKFtkZWYoXCJEZWNvcmF0b3JcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJNZXRhUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJtZXRhXCIsIFwicHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwibWV0YVwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJwcm9wZXJ0eVwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKTtcbiAgICBkZWYoXCJQYXJlbnRoZXNpemVkRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJJbXBvcnRTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTW9kdWxlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5idWlsZChcImltcG9ydGVkXCIsIFwibG9jYWxcIilcbiAgICAgICAgLmZpZWxkKFwiaW1wb3J0ZWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJNb2R1bGVTcGVjaWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwibG9jYWxcIik7XG4gICAgZGVmKFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJsb2NhbFwiKTtcbiAgICBkZWYoXCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZGVjbGFyYXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyYXRpb25cIiwgb3IoZGVmKFwiRGVjbGFyYXRpb25cIiksIGRlZihcIkV4cHJlc3Npb25cIikpKTtcbiAgICBkZWYoXCJFeHBvcnROYW1lZERlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImRlY2xhcmF0aW9uXCIsIFwic3BlY2lmaWVyc1wiLCBcInNvdXJjZVwiKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJhdGlvblwiLCBvcihkZWYoXCJEZWNsYXJhdGlvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInNwZWNpZmllcnNcIiwgW2RlZihcIkV4cG9ydFNwZWNpZmllclwiKV0sIGRlZmF1bHRzLmVtcHR5QXJyYXkpXG4gICAgICAgIC5maWVsZChcInNvdXJjZVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJFeHBvcnRTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTW9kdWxlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5idWlsZChcImxvY2FsXCIsIFwiZXhwb3J0ZWRcIilcbiAgICAgICAgLmZpZWxkKFwiZXhwb3J0ZWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIlNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJleHBvcnRlZFwiKVxuICAgICAgICAuZmllbGQoXCJleHBvcnRlZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKTtcbiAgICBkZWYoXCJFeHBvcnREZWZhdWx0U3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIlNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJleHBvcnRlZFwiKVxuICAgICAgICAuZmllbGQoXCJleHBvcnRlZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKTtcbiAgICBkZWYoXCJFeHBvcnRBbGxEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJleHBvcnRlZFwiLCBcInNvdXJjZVwiKVxuICAgICAgICAuZmllbGQoXCJleHBvcnRlZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwic291cmNlXCIsIGRlZihcIkxpdGVyYWxcIikpO1xuICAgIGRlZihcIkNvbW1lbnRCbG9ja1wiKVxuICAgICAgICAuYmFzZXMoXCJDb21tZW50XCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIsIC8qb3B0aW9uYWw6Ki8gXCJsZWFkaW5nXCIsIFwidHJhaWxpbmdcIik7XG4gICAgZGVmKFwiQ29tbWVudExpbmVcIilcbiAgICAgICAgLmJhc2VzKFwiQ29tbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCAvKm9wdGlvbmFsOiovIFwibGVhZGluZ1wiLCBcInRyYWlsaW5nXCIpO1xuICAgIGRlZihcIkRpcmVjdGl2ZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIGRlZihcIkRpcmVjdGl2ZUxpdGVyYWxcIikpO1xuICAgIGRlZihcIkRpcmVjdGl2ZUxpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiLCBcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgU3RyaW5nLCBkZWZhdWx0c1tcInVzZSBzdHJpY3RcIl0pO1xuICAgIGRlZihcIkludGVycHJldGVyRGlyZWN0aXZlXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJCbG9ja1N0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIFtkZWYoXCJTdGF0ZW1lbnRcIildKVxuICAgICAgICAuZmllbGQoXCJkaXJlY3RpdmVzXCIsIFtkZWYoXCJEaXJlY3RpdmVcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KTtcbiAgICBkZWYoXCJQcm9ncmFtXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIFtkZWYoXCJTdGF0ZW1lbnRcIildKVxuICAgICAgICAuZmllbGQoXCJkaXJlY3RpdmVzXCIsIFtkZWYoXCJEaXJlY3RpdmVcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJpbnRlcnByZXRlclwiLCBvcihkZWYoXCJJbnRlcnByZXRlckRpcmVjdGl2ZVwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgLy8gU3BsaXQgTGl0ZXJhbFxuICAgIGRlZihcIlN0cmluZ0xpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiTGl0ZXJhbFwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBTdHJpbmcpO1xuICAgIGRlZihcIk51bWVyaWNMaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIkxpdGVyYWxcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgTnVtYmVyKVxuICAgICAgICAuZmllbGQoXCJyYXdcIiwgb3IoU3RyaW5nLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJleHRyYVwiLCB7XG4gICAgICAgIHJhd1ZhbHVlOiBOdW1iZXIsXG4gICAgICAgIHJhdzogU3RyaW5nXG4gICAgfSwgZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhd1ZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgICAgICAgcmF3OiB0aGlzLnZhbHVlICsgXCJcIlxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGRlZihcIkJpZ0ludExpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiTGl0ZXJhbFwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiKVxuICAgICAgICAvLyBPbmx5IFN0cmluZyByZWFsbHkgc2VlbXMgYXBwcm9wcmlhdGUgaGVyZSwgc2luY2UgQmlnSW50IHZhbHVlc1xuICAgICAgICAvLyBvZnRlbiBleGNlZWQgdGhlIGxpbWl0cyBvZiBKUyBudW1iZXJzLlxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBvcihTdHJpbmcsIE51bWJlcikpXG4gICAgICAgIC5maWVsZChcImV4dHJhXCIsIHtcbiAgICAgICAgcmF3VmFsdWU6IFN0cmluZyxcbiAgICAgICAgcmF3OiBTdHJpbmdcbiAgICB9LCBmdW5jdGlvbiBnZXREZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmF3VmFsdWU6IFN0cmluZyh0aGlzLnZhbHVlKSxcbiAgICAgICAgICAgIHJhdzogdGhpcy52YWx1ZSArIFwiblwiXG4gICAgICAgIH07XG4gICAgfSk7XG4gICAgZGVmKFwiTnVsbExpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiTGl0ZXJhbFwiKVxuICAgICAgICAuYnVpbGQoKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBudWxsLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkJvb2xlYW5MaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIkxpdGVyYWxcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgQm9vbGVhbik7XG4gICAgZGVmKFwiUmVnRXhwTGl0ZXJhbFwiKVxuICAgICAgICAuYmFzZXMoXCJMaXRlcmFsXCIpXG4gICAgICAgIC5idWlsZChcInBhdHRlcm5cIiwgXCJmbGFnc1wiKVxuICAgICAgICAuZmllbGQoXCJwYXR0ZXJuXCIsIFN0cmluZylcbiAgICAgICAgLmZpZWxkKFwiZmxhZ3NcIiwgU3RyaW5nKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBSZWdFeHAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodGhpcy5wYXR0ZXJuLCB0aGlzLmZsYWdzKTtcbiAgICB9KTtcbiAgICB2YXIgT2JqZWN0RXhwcmVzc2lvblByb3BlcnR5ID0gb3IoZGVmKFwiUHJvcGVydHlcIiksIGRlZihcIk9iamVjdE1ldGhvZFwiKSwgZGVmKFwiT2JqZWN0UHJvcGVydHlcIiksIGRlZihcIlNwcmVhZFByb3BlcnR5XCIpLCBkZWYoXCJTcHJlYWRFbGVtZW50XCIpKTtcbiAgICAvLyBTcGxpdCBQcm9wZXJ0eSAtPiBPYmplY3RQcm9wZXJ0eSBhbmQgT2JqZWN0TWV0aG9kXG4gICAgZGVmKFwiT2JqZWN0RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInByb3BlcnRpZXNcIilcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydGllc1wiLCBbT2JqZWN0RXhwcmVzc2lvblByb3BlcnR5XSk7XG4gICAgLy8gT2JqZWN0TWV0aG9kIGhvaXN0IC52YWx1ZSBwcm9wZXJ0aWVzIHRvIG93biBwcm9wZXJ0aWVzXG4gICAgZGVmKFwiT2JqZWN0TWV0aG9kXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIiwgXCJGdW5jdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJraW5kXCIsIFwia2V5XCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcImNvbXB1dGVkXCIpXG4gICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJtZXRob2RcIiwgXCJnZXRcIiwgXCJzZXRcIikpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJQYXR0ZXJuXCIpXSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJCbG9ja1N0YXRlbWVudFwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiZ2VuZXJhdG9yXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImFzeW5jXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImFjY2Vzc2liaWxpdHlcIiwgLy8gVHlwZVNjcmlwdFxuICAgIG9yKGRlZihcIkxpdGVyYWxcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcImRlY29yYXRvcnNcIiwgb3IoW2RlZihcIkRlY29yYXRvclwiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIk9iamVjdFByb3BlcnR5XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIsIFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIkV4cHJlc3Npb25cIikpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBkZWYoXCJQYXR0ZXJuXCIpKSlcbiAgICAgICAgLmZpZWxkKFwiYWNjZXNzaWJpbGl0eVwiLCAvLyBUeXBlU2NyaXB0XG4gICAgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgdmFyIENsYXNzQm9keUVsZW1lbnQgPSBvcihkZWYoXCJNZXRob2REZWZpbml0aW9uXCIpLCBkZWYoXCJWYXJpYWJsZURlY2xhcmF0b3JcIiksIGRlZihcIkNsYXNzUHJvcGVydHlEZWZpbml0aW9uXCIpLCBkZWYoXCJDbGFzc1Byb3BlcnR5XCIpLCBkZWYoXCJDbGFzc1ByaXZhdGVQcm9wZXJ0eVwiKSwgZGVmKFwiQ2xhc3NNZXRob2RcIiksIGRlZihcIkNsYXNzUHJpdmF0ZU1ldGhvZFwiKSk7XG4gICAgLy8gTWV0aG9kRGVmaW5pdGlvbiAtPiBDbGFzc01ldGhvZFxuICAgIGRlZihcIkNsYXNzQm9keVwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgW0NsYXNzQm9keUVsZW1lbnRdKTtcbiAgICBkZWYoXCJDbGFzc01ldGhvZFwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiLCBcIkZ1bmN0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImtpbmRcIiwgXCJrZXlcIiwgXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwiY29tcHV0ZWRcIiwgXCJzdGF0aWNcIilcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIkV4cHJlc3Npb25cIikpKTtcbiAgICBkZWYoXCJDbGFzc1ByaXZhdGVNZXRob2RcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJGdW5jdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJrZXlcIiwgXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwia2luZFwiLCBcImNvbXB1dGVkXCIsIFwic3RhdGljXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBkZWYoXCJQcml2YXRlTmFtZVwiKSk7XG4gICAgW1wiQ2xhc3NNZXRob2RcIixcbiAgICAgICAgXCJDbGFzc1ByaXZhdGVNZXRob2RcIixcbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKHR5cGVOYW1lKSB7XG4gICAgICAgIGRlZih0eXBlTmFtZSlcbiAgICAgICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJnZXRcIiwgXCJzZXRcIiwgXCJtZXRob2RcIiwgXCJjb25zdHJ1Y3RvclwiKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJtZXRob2RcIjsgfSlcbiAgICAgICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIikpXG4gICAgICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwic3RhdGljXCIsIG9yKEJvb2xlYW4sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgICAgICAuZmllbGQoXCJhYnN0cmFjdFwiLCBvcihCb29sZWFuLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwiYWNjZXNzXCIsIG9yKFwicHVibGljXCIsIFwicHJpdmF0ZVwiLCBcInByb3RlY3RlZFwiLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwiYWNjZXNzaWJpbGl0eVwiLCBvcihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgICAgIC5maWVsZChcImRlY29yYXRvcnNcIiwgb3IoW2RlZihcIkRlY29yYXRvclwiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBvcihCb29sZWFuLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICB9KTtcbiAgICBkZWYoXCJDbGFzc1ByaXZhdGVQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJDbGFzc1Byb3BlcnR5XCIpXG4gICAgICAgIC5idWlsZChcImtleVwiLCBcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBkZWYoXCJQcml2YXRlTmFtZVwiKSlcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiUHJpdmF0ZU5hbWVcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiLCBcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgdmFyIE9iamVjdFBhdHRlcm5Qcm9wZXJ0eSA9IG9yKGRlZihcIlByb3BlcnR5XCIpLCBkZWYoXCJQcm9wZXJ0eVBhdHRlcm5cIiksIGRlZihcIlNwcmVhZFByb3BlcnR5UGF0dGVyblwiKSwgZGVmKFwiU3ByZWFkUHJvcGVydHlcIiksIC8vIFVzZWQgYnkgRXNwcmltYVxuICAgIGRlZihcIk9iamVjdFByb3BlcnR5XCIpLCAvLyBCYWJlbCA2XG4gICAgZGVmKFwiUmVzdFByb3BlcnR5XCIpIC8vIEJhYmVsIDZcbiAgICApO1xuICAgIC8vIFNwbGl0IGludG8gUmVzdFByb3BlcnR5IGFuZCBTcHJlYWRQcm9wZXJ0eVxuICAgIGRlZihcIk9iamVjdFBhdHRlcm5cIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJwcm9wZXJ0aWVzXCIpXG4gICAgICAgIC5maWVsZChcInByb3BlcnRpZXNcIiwgW09iamVjdFBhdHRlcm5Qcm9wZXJ0eV0pXG4gICAgICAgIC5maWVsZChcImRlY29yYXRvcnNcIiwgb3IoW2RlZihcIkRlY29yYXRvclwiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlNwcmVhZFByb3BlcnR5XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYXJndW1lbnRcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiUmVzdFByb3BlcnR5XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYXJndW1lbnRcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiRm9yQXdhaXRTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImxlZnRcIiwgXCJyaWdodFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwibGVmdFwiLCBvcihkZWYoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIC8vIFRoZSBjYWxsZWUgbm9kZSBvZiBhIGR5bmFtaWMgaW1wb3J0KC4uLikgZXhwcmVzc2lvbi5cbiAgICBkZWYoXCJJbXBvcnRcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciBiYWJlbF9jb3JlXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9iYWJlbC1jb3JlXCIpKTtcbnZhciBmbG93XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9mbG93XCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoYmFiZWxfY29yZV8xLmRlZmF1bHQpO1xuICAgIGZvcmsudXNlKGZsb3dfMS5kZWZhdWx0KTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIFR5cGUgPSB0eXBlcy5UeXBlO1xuICAgIHZhciBkZWYgPSBUeXBlLmRlZjtcbiAgICB2YXIgb3IgPSBUeXBlLm9yO1xuICAgIHZhciBzaGFyZWQgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmYXVsdHMgPSBzaGFyZWQuZGVmYXVsdHM7XG4gICAgdmFyIGdlcSA9IHNoYXJlZC5nZXE7XG4gICAgLy8gQWJzdHJhY3Qgc3VwZXJ0eXBlIG9mIGFsbCBzeW50YWN0aWMgZW50aXRpZXMgdGhhdCBhcmUgYWxsb3dlZCB0byBoYXZlIGFcbiAgICAvLyAubG9jIGZpZWxkLlxuICAgIGRlZihcIlByaW50YWJsZVwiKVxuICAgICAgICAuZmllbGQoXCJsb2NcIiwgb3IoZGVmKFwiU291cmNlTG9jYXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0sIHRydWUpO1xuICAgIGRlZihcIk5vZGVcIilcbiAgICAgICAgLmJhc2VzKFwiUHJpbnRhYmxlXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVcIiwgU3RyaW5nKVxuICAgICAgICAuZmllbGQoXCJjb21tZW50c1wiLCBvcihbZGVmKFwiQ29tbWVudFwiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0sIHRydWUpO1xuICAgIGRlZihcIlNvdXJjZUxvY2F0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInN0YXJ0XCIsIGRlZihcIlBvc2l0aW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJlbmRcIiwgZGVmKFwiUG9zaXRpb25cIikpXG4gICAgICAgIC5maWVsZChcInNvdXJjZVwiLCBvcihTdHJpbmcsIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlBvc2l0aW9uXCIpXG4gICAgICAgIC5maWVsZChcImxpbmVcIiwgZ2VxKDEpKVxuICAgICAgICAuZmllbGQoXCJjb2x1bW5cIiwgZ2VxKDApKTtcbiAgICBkZWYoXCJGaWxlXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwicHJvZ3JhbVwiLCBcIm5hbWVcIilcbiAgICAgICAgLmZpZWxkKFwicHJvZ3JhbVwiLCBkZWYoXCJQcm9ncmFtXCIpKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIG9yKFN0cmluZywgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiUHJvZ3JhbVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbZGVmKFwiU3RhdGVtZW50XCIpXSk7XG4gICAgZGVmKFwiRnVuY3Rpb25cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIlBhdHRlcm5cIildKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkJsb2NrU3RhdGVtZW50XCIpKVxuICAgICAgICAuZmllbGQoXCJnZW5lcmF0b3JcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiYXN5bmNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiU3RhdGVtZW50XCIpLmJhc2VzKFwiTm9kZVwiKTtcbiAgICAvLyBUaGUgZW1wdHkgLmJ1aWxkKCkgaGVyZSBtZWFucyB0aGF0IGFuIEVtcHR5U3RhdGVtZW50IGNhbiBiZSBjb25zdHJ1Y3RlZFxuICAgIC8vIChpLmUuIGl0J3Mgbm90IGFic3RyYWN0KSBidXQgdGhhdCBpdCBuZWVkcyBubyBhcmd1bWVudHMuXG4gICAgZGVmKFwiRW1wdHlTdGF0ZW1lbnRcIikuYmFzZXMoXCJTdGF0ZW1lbnRcIikuYnVpbGQoKTtcbiAgICBkZWYoXCJCbG9ja1N0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIFtkZWYoXCJTdGF0ZW1lbnRcIildKTtcbiAgICAvLyBUT0RPIEZpZ3VyZSBvdXQgaG93IHRvIHNpbGVudGx5IGNvZXJjZSBFeHByZXNzaW9ucyB0b1xuICAgIC8vIEV4cHJlc3Npb25TdGF0ZW1lbnRzIHdoZXJlIGEgU3RhdGVtZW50IHdhcyBleHBlY3RlZC5cbiAgICBkZWYoXCJFeHByZXNzaW9uU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25cIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiSWZTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcInRlc3RcIiwgXCJjb25zZXF1ZW50XCIsIFwiYWx0ZXJuYXRlXCIpXG4gICAgICAgIC5maWVsZChcInRlc3RcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29uc2VxdWVudFwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpXG4gICAgICAgIC5maWVsZChcImFsdGVybmF0ZVwiLCBvcihkZWYoXCJTdGF0ZW1lbnRcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkxhYmVsZWRTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImxhYmVsXCIsIFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJsYWJlbFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIlN0YXRlbWVudFwiKSk7XG4gICAgZGVmKFwiQnJlYWtTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImxhYmVsXCIpXG4gICAgICAgIC5maWVsZChcImxhYmVsXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkNvbnRpbnVlU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJsYWJlbFwiKVxuICAgICAgICAuZmllbGQoXCJsYWJlbFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJXaXRoU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJvYmplY3RcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcIm9iamVjdFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIlN0YXRlbWVudFwiKSk7XG4gICAgZGVmKFwiU3dpdGNoU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJkaXNjcmltaW5hbnRcIiwgXCJjYXNlc1wiLCBcImxleGljYWxcIilcbiAgICAgICAgLmZpZWxkKFwiZGlzY3JpbWluYW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImNhc2VzXCIsIFtkZWYoXCJTd2l0Y2hDYXNlXCIpXSlcbiAgICAgICAgLmZpZWxkKFwibGV4aWNhbFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJSZXR1cm5TdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKTtcbiAgICBkZWYoXCJUaHJvd1N0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiYXJndW1lbnRcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiVHJ5U3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJibG9ja1wiLCBcImhhbmRsZXJcIiwgXCJmaW5hbGl6ZXJcIilcbiAgICAgICAgLmZpZWxkKFwiYmxvY2tcIiwgZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIikpXG4gICAgICAgIC5maWVsZChcImhhbmRsZXJcIiwgb3IoZGVmKFwiQ2F0Y2hDbGF1c2VcIiksIG51bGwpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzICYmIHRoaXMuaGFuZGxlcnNbMF0gfHwgbnVsbDtcbiAgICB9KVxuICAgICAgICAuZmllbGQoXCJoYW5kbGVyc1wiLCBbZGVmKFwiQ2F0Y2hDbGF1c2VcIildLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIgPyBbdGhpcy5oYW5kbGVyXSA6IFtdO1xuICAgIH0sIHRydWUpIC8vIEluZGljYXRlcyB0aGlzIGZpZWxkIGlzIGhpZGRlbiBmcm9tIGVhY2hGaWVsZCBpdGVyYXRpb24uXG4gICAgICAgIC5maWVsZChcImd1YXJkZWRIYW5kbGVyc1wiLCBbZGVmKFwiQ2F0Y2hDbGF1c2VcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJmaW5hbGl6ZXJcIiwgb3IoZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkNhdGNoQ2xhdXNlXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwicGFyYW1cIiwgXCJndWFyZFwiLCBcImJvZHlcIilcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb3B0aW9uYWwtY2F0Y2gtYmluZGluZ1xuICAgICAgICAuZmllbGQoXCJwYXJhbVwiLCBvcihkZWYoXCJQYXR0ZXJuXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJndWFyZFwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkJsb2NrU3RhdGVtZW50XCIpKTtcbiAgICBkZWYoXCJXaGlsZVN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwidGVzdFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwidGVzdFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIlN0YXRlbWVudFwiKSk7XG4gICAgZGVmKFwiRG9XaGlsZVN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiLCBcInRlc3RcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpXG4gICAgICAgIC5maWVsZChcInRlc3RcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiRm9yU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJpbml0XCIsIFwidGVzdFwiLCBcInVwZGF0ZVwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiaW5pdFwiLCBvcihkZWYoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwidGVzdFwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwidXBkYXRlXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIlN0YXRlbWVudFwiKSk7XG4gICAgZGVmKFwiRm9ySW5TdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImxlZnRcIiwgXCJyaWdodFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwibGVmdFwiLCBvcihkZWYoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIGRlZihcIkRlYnVnZ2VyU3RhdGVtZW50XCIpLmJhc2VzKFwiU3RhdGVtZW50XCIpLmJ1aWxkKCk7XG4gICAgZGVmKFwiRGVjbGFyYXRpb25cIikuYmFzZXMoXCJTdGF0ZW1lbnRcIik7XG4gICAgZGVmKFwiRnVuY3Rpb25EZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGdW5jdGlvblwiLCBcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwicGFyYW1zXCIsIFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKTtcbiAgICBkZWYoXCJGdW5jdGlvbkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRnVuY3Rpb25cIiwgXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwicGFyYW1zXCIsIFwiYm9keVwiKTtcbiAgICBkZWYoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImtpbmRcIiwgXCJkZWNsYXJhdGlvbnNcIilcbiAgICAgICAgLmZpZWxkKFwia2luZFwiLCBvcihcInZhclwiLCBcImxldFwiLCBcImNvbnN0XCIpKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJhdGlvbnNcIiwgW2RlZihcIlZhcmlhYmxlRGVjbGFyYXRvclwiKV0pO1xuICAgIGRlZihcIlZhcmlhYmxlRGVjbGFyYXRvclwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwiaW5pdFwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJQYXR0ZXJuXCIpKVxuICAgICAgICAuZmllbGQoXCJpbml0XCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkV4cHJlc3Npb25cIikuYmFzZXMoXCJOb2RlXCIpO1xuICAgIGRlZihcIlRoaXNFeHByZXNzaW9uXCIpLmJhc2VzKFwiRXhwcmVzc2lvblwiKS5idWlsZCgpO1xuICAgIGRlZihcIkFycmF5RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImVsZW1lbnRzXCIpXG4gICAgICAgIC5maWVsZChcImVsZW1lbnRzXCIsIFtvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKV0pO1xuICAgIGRlZihcIk9iamVjdEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJwcm9wZXJ0aWVzXCIpXG4gICAgICAgIC5maWVsZChcInByb3BlcnRpZXNcIiwgW2RlZihcIlByb3BlcnR5XCIpXSk7XG4gICAgLy8gVE9ETyBOb3QgaW4gdGhlIE1vemlsbGEgUGFyc2VyIEFQSSwgYnV0IHVzZWQgYnkgRXNwcmltYS5cbiAgICBkZWYoXCJQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpIC8vIFdhbnQgdG8gYmUgYWJsZSB0byB2aXNpdCBQcm9wZXJ0eSBOb2Rlcy5cbiAgICAgICAgLmJ1aWxkKFwia2luZFwiLCBcImtleVwiLCBcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJpbml0XCIsIFwiZ2V0XCIsIFwic2V0XCIpKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgZGVmKFwiSWRlbnRpZmllclwiKSkpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIlNlcXVlbmNlRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25zXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25zXCIsIFtkZWYoXCJFeHByZXNzaW9uXCIpXSk7XG4gICAgdmFyIFVuYXJ5T3BlcmF0b3IgPSBvcihcIi1cIiwgXCIrXCIsIFwiIVwiLCBcIn5cIiwgXCJ0eXBlb2ZcIiwgXCJ2b2lkXCIsIFwiZGVsZXRlXCIpO1xuICAgIGRlZihcIlVuYXJ5RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9wZXJhdG9yXCIsIFwiYXJndW1lbnRcIiwgXCJwcmVmaXhcIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgVW5hcnlPcGVyYXRvcilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLy8gRXNwcmltYSBkb2Vzbid0IGJvdGhlciB3aXRoIHRoaXMgZmllbGQsIHByZXN1bWFibHkgYmVjYXVzZSBpdCdzXG4gICAgICAgIC8vIGFsd2F5cyB0cnVlIGZvciB1bmFyeSBvcGVyYXRvcnMuXG4gICAgICAgIC5maWVsZChcInByZWZpeFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcInRydWVcIl0pO1xuICAgIHZhciBCaW5hcnlPcGVyYXRvciA9IG9yKFwiPT1cIiwgXCIhPVwiLCBcIj09PVwiLCBcIiE9PVwiLCBcIjxcIiwgXCI8PVwiLCBcIj5cIiwgXCI+PVwiLCBcIjw8XCIsIFwiPj5cIiwgXCI+Pj5cIiwgXCIrXCIsIFwiLVwiLCBcIipcIiwgXCIvXCIsIFwiJVwiLCBcIioqXCIsIFwiJlwiLCAvLyBUT0RPIE1pc3NpbmcgZnJvbSB0aGUgUGFyc2VyIEFQSS5cbiAgICBcInxcIiwgXCJeXCIsIFwiaW5cIiwgXCJpbnN0YW5jZW9mXCIpO1xuICAgIGRlZihcIkJpbmFyeUV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvcGVyYXRvclwiLCBcImxlZnRcIiwgXCJyaWdodFwiKVxuICAgICAgICAuZmllbGQoXCJvcGVyYXRvclwiLCBCaW5hcnlPcGVyYXRvcilcbiAgICAgICAgLmZpZWxkKFwibGVmdFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJyaWdodFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICB2YXIgQXNzaWdubWVudE9wZXJhdG9yID0gb3IoXCI9XCIsIFwiKz1cIiwgXCItPVwiLCBcIio9XCIsIFwiLz1cIiwgXCIlPVwiLCBcIjw8PVwiLCBcIj4+PVwiLCBcIj4+Pj1cIiwgXCJ8PVwiLCBcIl49XCIsIFwiJj1cIik7XG4gICAgZGVmKFwiQXNzaWdubWVudEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvcGVyYXRvclwiLCBcImxlZnRcIiwgXCJyaWdodFwiKVxuICAgICAgICAuZmllbGQoXCJvcGVyYXRvclwiLCBBc3NpZ25tZW50T3BlcmF0b3IpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgb3IoZGVmKFwiUGF0dGVyblwiKSwgZGVmKFwiTWVtYmVyRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInJpZ2h0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIHZhciBVcGRhdGVPcGVyYXRvciA9IG9yKFwiKytcIiwgXCItLVwiKTtcbiAgICBkZWYoXCJVcGRhdGVFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwib3BlcmF0b3JcIiwgXCJhcmd1bWVudFwiLCBcInByZWZpeFwiKVxuICAgICAgICAuZmllbGQoXCJvcGVyYXRvclwiLCBVcGRhdGVPcGVyYXRvcilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwicHJlZml4XCIsIEJvb2xlYW4pO1xuICAgIHZhciBMb2dpY2FsT3BlcmF0b3IgPSBvcihcInx8XCIsIFwiJiZcIik7XG4gICAgZGVmKFwiTG9naWNhbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvcGVyYXRvclwiLCBcImxlZnRcIiwgXCJyaWdodFwiKVxuICAgICAgICAuZmllbGQoXCJvcGVyYXRvclwiLCBMb2dpY2FsT3BlcmF0b3IpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwidGVzdFwiLCBcImNvbnNlcXVlbnRcIiwgXCJhbHRlcm5hdGVcIilcbiAgICAgICAgLmZpZWxkKFwidGVzdFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJjb25zZXF1ZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImFsdGVybmF0ZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJOZXdFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiY2FsbGVlXCIsIFwiYXJndW1lbnRzXCIpXG4gICAgICAgIC5maWVsZChcImNhbGxlZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAvLyBUaGUgTW96aWxsYSBQYXJzZXIgQVBJIGdpdmVzIHRoaXMgdHlwZSBhcyBbb3IoZGVmKFwiRXhwcmVzc2lvblwiKSxcbiAgICAgICAgLy8gbnVsbCldLCBidXQgbnVsbCB2YWx1ZXMgZG9uJ3QgcmVhbGx5IG1ha2Ugc2Vuc2UgYXQgdGhlIGNhbGwgc2l0ZS5cbiAgICAgICAgLy8gVE9ETyBSZXBvcnQgdGhpcyBub25zZW5zZS5cbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRzXCIsIFtkZWYoXCJFeHByZXNzaW9uXCIpXSk7XG4gICAgZGVmKFwiQ2FsbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJjYWxsZWVcIiwgXCJhcmd1bWVudHNcIilcbiAgICAgICAgLmZpZWxkKFwiY2FsbGVlXCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC8vIFNlZSBjb21tZW50IGZvciBOZXdFeHByZXNzaW9uIGFib3ZlLlxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudHNcIiwgW2RlZihcIkV4cHJlc3Npb25cIildKTtcbiAgICBkZWYoXCJNZW1iZXJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwib2JqZWN0XCIsIFwicHJvcGVydHlcIiwgXCJjb21wdXRlZFwiKVxuICAgICAgICAuZmllbGQoXCJvYmplY3RcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydHlcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB0aGlzLnByb3BlcnR5LnR5cGU7XG4gICAgICAgIGlmICh0eXBlID09PSAnTGl0ZXJhbCcgfHxcbiAgICAgICAgICAgIHR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJyB8fFxuICAgICAgICAgICAgdHlwZSA9PT0gJ0JpbmFyeUV4cHJlc3Npb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgZGVmKFwiUGF0dGVyblwiKS5iYXNlcyhcIk5vZGVcIik7XG4gICAgZGVmKFwiU3dpdGNoQ2FzZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInRlc3RcIiwgXCJjb25zZXF1ZW50XCIpXG4gICAgICAgIC5maWVsZChcInRlc3RcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcImNvbnNlcXVlbnRcIiwgW2RlZihcIlN0YXRlbWVudFwiKV0pO1xuICAgIGRlZihcIklkZW50aWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiLCBcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwibmFtZVwiKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIFN0cmluZylcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiTGl0ZXJhbFwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIG9yKFN0cmluZywgQm9vbGVhbiwgbnVsbCwgTnVtYmVyLCBSZWdFeHApKVxuICAgICAgICAuZmllbGQoXCJyZWdleFwiLCBvcih7XG4gICAgICAgIHBhdHRlcm46IFN0cmluZyxcbiAgICAgICAgZmxhZ3M6IFN0cmluZ1xuICAgIH0sIG51bGwpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgICB2YXIgZmxhZ3MgPSBcIlwiO1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUuaWdub3JlQ2FzZSlcbiAgICAgICAgICAgICAgICBmbGFncyArPSBcImlcIjtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLm11bHRpbGluZSlcbiAgICAgICAgICAgICAgICBmbGFncyArPSBcIm1cIjtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLmdsb2JhbClcbiAgICAgICAgICAgICAgICBmbGFncyArPSBcImdcIjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGF0dGVybjogdGhpcy52YWx1ZS5zb3VyY2UsXG4gICAgICAgICAgICAgICAgZmxhZ3M6IGZsYWdzXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICAgIC8vIEFic3RyYWN0IChub24tYnVpbGRhYmxlKSBjb21tZW50IHN1cGVydHlwZS4gTm90IGEgTm9kZS5cbiAgICBkZWYoXCJDb21tZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlByaW50YWJsZVwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBTdHJpbmcpXG4gICAgICAgIC8vIEEgLmxlYWRpbmcgY29tbWVudCBjb21lcyBiZWZvcmUgdGhlIG5vZGUsIHdoZXJlYXMgYSAudHJhaWxpbmdcbiAgICAgICAgLy8gY29tbWVudCBjb21lcyBhZnRlciBpdC4gVGhlc2UgdHdvIGZpZWxkcyBzaG91bGQgbm90IGJvdGggYmUgdHJ1ZSxcbiAgICAgICAgLy8gYnV0IHRoZXkgbWlnaHQgYm90aCBiZSBmYWxzZSB3aGVuIHRoZSBjb21tZW50IGZhbGxzIGluc2lkZSBhIG5vZGVcbiAgICAgICAgLy8gYW5kIHRoZSBub2RlIGhhcyBubyBjaGlsZHJlbiBmb3IgdGhlIGNvbW1lbnQgdG8gbGVhZCBvciB0cmFpbCxcbiAgICAgICAgLy8gZS5nLiB7IC8qZGFuZ2xpbmcqLyB9LlxuICAgICAgICAuZmllbGQoXCJsZWFkaW5nXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1widHJ1ZVwiXSlcbiAgICAgICAgLmZpZWxkKFwidHJhaWxpbmdcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xudmFyIHNoYXJlZF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi9zaGFyZWRcIikpO1xudmFyIGNvcmVfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2NvcmVcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICBmb3JrLnVzZShjb3JlXzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgVHlwZSA9IHR5cGVzLlR5cGU7XG4gICAgdmFyIGRlZiA9IHR5cGVzLlR5cGUuZGVmO1xuICAgIHZhciBvciA9IFR5cGUub3I7XG4gICAgdmFyIHNoYXJlZCA9IGZvcmsudXNlKHNoYXJlZF8xLmRlZmF1bHQpO1xuICAgIHZhciBkZWZhdWx0cyA9IHNoYXJlZC5kZWZhdWx0cztcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vcHRpb25hbC1jaGFpbmluZ1xuICAgIC8vIGBhPy5iYCBhcyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2VzdHJlZS9lc3RyZWUvaXNzdWVzLzE0NlxuICAgIGRlZihcIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJNZW1iZXJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9iamVjdFwiLCBcInByb3BlcnR5XCIsIFwiY29tcHV0ZWRcIiwgXCJvcHRpb25hbFwiKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcInRydWVcIl0pO1xuICAgIC8vIGE/LmIoKVxuICAgIGRlZihcIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiQ2FsbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiY2FsbGVlXCIsIFwiYXJndW1lbnRzXCIsIFwib3B0aW9uYWxcIilcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJ0cnVlXCJdKTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICAvLyBgYSA/PyBiYCBhcyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYnlsb24vcHVsbC83NjEvZmlsZXNcbiAgICB2YXIgTG9naWNhbE9wZXJhdG9yID0gb3IoXCJ8fFwiLCBcIiYmXCIsIFwiPz9cIik7XG4gICAgZGVmKFwiTG9naWNhbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgTG9naWNhbE9wZXJhdG9yKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciBlczdfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2VzN1wiKSk7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICBmb3JrLnVzZShlczdfMS5kZWZhdWx0KTtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICBkZWYoXCJJbXBvcnRFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwic291cmNlXCIpXG4gICAgICAgIC5maWVsZChcInNvdXJjZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciBjb3JlXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9jb3JlXCIpKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIGZvcmsudXNlKGNvcmVfMS5kZWZhdWx0KTtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICB2YXIgb3IgPSB0eXBlcy5UeXBlLm9yO1xuICAgIHZhciBkZWZhdWx0cyA9IGZvcmsudXNlKHNoYXJlZF8xLmRlZmF1bHQpLmRlZmF1bHRzO1xuICAgIGRlZihcIkZ1bmN0aW9uXCIpXG4gICAgICAgIC5maWVsZChcImdlbmVyYXRvclwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImRlZmF1bHRzXCIsIFtvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKV0sIGRlZmF1bHRzLmVtcHR5QXJyYXkpXG4gICAgICAgIC8vIFRPRE8gVGhpcyBjb3VsZCBiZSByZXByZXNlbnRlZCBhcyBhIFJlc3RFbGVtZW50IGluIC5wYXJhbXMuXG4gICAgICAgIC5maWVsZChcInJlc3RcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgLy8gVGhlIEVTVHJlZSB3YXkgb2YgcmVwcmVzZW50aW5nIGEgLi4ucmVzdCBwYXJhbWV0ZXIuXG4gICAgZGVmKFwiUmVzdEVsZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJQYXR0ZXJuXCIpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCAvLyBmb3IgQmFieWxvbi4gRmxvdyBwYXJzZXIgcHV0cyBpdCBvbiB0aGUgaWRlbnRpZmllclxuICAgIG9yKGRlZihcIlR5cGVBbm5vdGF0aW9uXCIpLCBkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJTcHJlYWRFbGVtZW50UGF0dGVyblwiKVxuICAgICAgICAuYmFzZXMoXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIlBhdHRlcm5cIikpO1xuICAgIGRlZihcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwiZ2VuZXJhdG9yXCIsIFwiZXhwcmVzc2lvblwiKTtcbiAgICBkZWYoXCJGdW5jdGlvbkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJwYXJhbXNcIiwgXCJib2R5XCIsIFwiZ2VuZXJhdG9yXCIsIFwiZXhwcmVzc2lvblwiKTtcbiAgICAvLyBUaGUgUGFyc2VyIEFQSSBjYWxscyB0aGlzIEFycm93RXhwcmVzc2lvbiwgYnV0IEVzcHJpbWEgYW5kIGFsbCBvdGhlclxuICAgIC8vIGFjdHVhbCBwYXJzZXJzIHVzZSBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbi5cbiAgICBkZWYoXCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJGdW5jdGlvblwiLCBcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwicGFyYW1zXCIsIFwiYm9keVwiLCBcImV4cHJlc3Npb25cIilcbiAgICAgICAgLy8gVGhlIGZvcmNlZCBudWxsIHZhbHVlIGhlcmUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvdmVycmlkZGVuXG4gICAgICAgIC8vIGRlZmluaXRpb24gb2YgdGhlIFwiaWRcIiBmaWVsZCBpbiB0aGUgRnVuY3Rpb24gaW50ZXJmYWNlLlxuICAgICAgICAuZmllbGQoXCJpZFwiLCBudWxsLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC8vIEFycm93IGZ1bmN0aW9uIGJvZGllcyBhcmUgYWxsb3dlZCB0byBiZSBleHByZXNzaW9ucy5cbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBvcihkZWYoXCJCbG9ja1N0YXRlbWVudFwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC8vIFRoZSBjdXJyZW50IHNwZWMgZm9yYmlkcyBhcnJvdyBnZW5lcmF0b3JzLCBzbyBJIGhhdmUgdGFrZW4gdGhlXG4gICAgICAgIC8vIGxpYmVydHkgb2YgZW5mb3JjaW5nIHRoYXQuIFRPRE8gUmVwb3J0IHRoaXMuXG4gICAgICAgIC5maWVsZChcImdlbmVyYXRvclwiLCBmYWxzZSwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiRm9yT2ZTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImxlZnRcIiwgXCJyaWdodFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwibGVmdFwiLCBvcihkZWYoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpLCBkZWYoXCJQYXR0ZXJuXCIpKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIGRlZihcIllpZWxkRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIsIFwiZGVsZWdhdGVcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcImRlbGVnYXRlXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIkdlbmVyYXRvckV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJib2R5XCIsIFwiYmxvY2tzXCIsIFwiZmlsdGVyXCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiYmxvY2tzXCIsIFtkZWYoXCJDb21wcmVoZW5zaW9uQmxvY2tcIildKVxuICAgICAgICAuZmllbGQoXCJmaWx0ZXJcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpO1xuICAgIGRlZihcIkNvbXByZWhlbnNpb25FeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiLCBcImJsb2Nrc1wiLCBcImZpbHRlclwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImJsb2Nrc1wiLCBbZGVmKFwiQ29tcHJlaGVuc2lvbkJsb2NrXCIpXSlcbiAgICAgICAgLmZpZWxkKFwiZmlsdGVyXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKTtcbiAgICBkZWYoXCJDb21wcmVoZW5zaW9uQmxvY2tcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJlYWNoXCIpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgZGVmKFwiUGF0dGVyblwiKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiZWFjaFwiLCBCb29sZWFuKTtcbiAgICBkZWYoXCJQcm9wZXJ0eVwiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIGRlZihcIlBhdHRlcm5cIikpKVxuICAgICAgICAuZmllbGQoXCJtZXRob2RcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwic2hvcnRoYW5kXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIk9iamVjdFByb3BlcnR5XCIpXG4gICAgICAgIC5maWVsZChcInNob3J0aGFuZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJQcm9wZXJ0eVBhdHRlcm5cIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJrZXlcIiwgXCJwYXR0ZXJuXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwicGF0dGVyblwiLCBkZWYoXCJQYXR0ZXJuXCIpKVxuICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJPYmplY3RQYXR0ZXJuXCIpXG4gICAgICAgIC5iYXNlcyhcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwicHJvcGVydGllc1wiKVxuICAgICAgICAuZmllbGQoXCJwcm9wZXJ0aWVzXCIsIFtvcihkZWYoXCJQcm9wZXJ0eVBhdHRlcm5cIiksIGRlZihcIlByb3BlcnR5XCIpKV0pO1xuICAgIGRlZihcIkFycmF5UGF0dGVyblwiKVxuICAgICAgICAuYmFzZXMoXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcImVsZW1lbnRzXCIpXG4gICAgICAgIC5maWVsZChcImVsZW1lbnRzXCIsIFtvcihkZWYoXCJQYXR0ZXJuXCIpLCBudWxsKV0pO1xuICAgIGRlZihcIk1ldGhvZERlZmluaXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwia2luZFwiLCBcImtleVwiLCBcInZhbHVlXCIsIFwic3RhdGljXCIpXG4gICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJjb25zdHJ1Y3RvclwiLCBcIm1ldGhvZFwiLCBcImdldFwiLCBcInNldFwiKSlcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIGRlZihcIkZ1bmN0aW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJzdGF0aWNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiU3ByZWFkRWxlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIkFycmF5RXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJlbGVtZW50c1wiLCBbb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgZGVmKFwiU3ByZWFkRWxlbWVudFwiKSwgZGVmKFwiUmVzdEVsZW1lbnRcIiksIG51bGwpXSk7XG4gICAgZGVmKFwiTmV3RXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudHNcIiwgW29yKGRlZihcIkV4cHJlc3Npb25cIiksIGRlZihcIlNwcmVhZEVsZW1lbnRcIikpXSk7XG4gICAgZGVmKFwiQ2FsbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRzXCIsIFtvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBkZWYoXCJTcHJlYWRFbGVtZW50XCIpKV0pO1xuICAgIC8vIE5vdGU6IHRoaXMgbm9kZSB0eXBlIGlzICpub3QqIGFuIEFzc2lnbm1lbnRFeHByZXNzaW9uIHdpdGggYSBQYXR0ZXJuIG9uXG4gICAgLy8gdGhlIGxlZnQtaGFuZCBzaWRlISBUaGUgZXhpc3RpbmcgQXNzaWdubWVudEV4cHJlc3Npb24gdHlwZSBhbHJlYWR5XG4gICAgLy8gc3VwcG9ydHMgZGVzdHJ1Y3R1cmluZyBhc3NpZ25tZW50cy4gQXNzaWdubWVudFBhdHRlcm4gbm9kZXMgbWF5IGFwcGVhclxuICAgIC8vIHdoZXJldmVyIGEgUGF0dGVybiBpcyBhbGxvd2VkLCBhbmQgdGhlIHJpZ2h0LWhhbmQgc2lkZSByZXByZXNlbnRzIGFcbiAgICAvLyBkZWZhdWx0IHZhbHVlIHRvIGJlIGRlc3RydWN0dXJlZCBhZ2FpbnN0IHRoZSBsZWZ0LWhhbmQgc2lkZSwgaWYgbm9cbiAgICAvLyB2YWx1ZSBpcyBvdGhlcndpc2UgcHJvdmlkZWQuIEZvciBleGFtcGxlOiBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMuXG4gICAgZGVmKFwiQXNzaWdubWVudFBhdHRlcm5cIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJsZWZ0XCIsIFwicmlnaHRcIilcbiAgICAgICAgLmZpZWxkKFwibGVmdFwiLCBkZWYoXCJQYXR0ZXJuXCIpKVxuICAgICAgICAuZmllbGQoXCJyaWdodFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICB2YXIgQ2xhc3NCb2R5RWxlbWVudCA9IG9yKGRlZihcIk1ldGhvZERlZmluaXRpb25cIiksIGRlZihcIlZhcmlhYmxlRGVjbGFyYXRvclwiKSwgZGVmKFwiQ2xhc3NQcm9wZXJ0eURlZmluaXRpb25cIiksIGRlZihcIkNsYXNzUHJvcGVydHlcIikpO1xuICAgIGRlZihcIkNsYXNzUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiQ2xhc3NQcm9wZXJ0eURlZmluaXRpb25cIikgLy8gc3RhdGljIHByb3BlcnR5XG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImRlZmluaXRpb25cIilcbiAgICAgICAgLy8gWWVzLCBWaXJnaW5pYSwgY2lyY3VsYXIgZGVmaW5pdGlvbnMgYXJlIHBlcm1pdHRlZC5cbiAgICAgICAgLmZpZWxkKFwiZGVmaW5pdGlvblwiLCBDbGFzc0JvZHlFbGVtZW50KTtcbiAgICBkZWYoXCJDbGFzc0JvZHlcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIFtDbGFzc0JvZHlFbGVtZW50XSk7XG4gICAgZGVmKFwiQ2xhc3NEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImJvZHlcIiwgXCJzdXBlckNsYXNzXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkNsYXNzQm9keVwiKSlcbiAgICAgICAgLmZpZWxkKFwic3VwZXJDbGFzc1wiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJDbGFzc0V4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImJvZHlcIiwgXCJzdXBlckNsYXNzXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiQ2xhc3NCb2R5XCIpKVxuICAgICAgICAuZmllbGQoXCJzdXBlckNsYXNzXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIC8vIFNwZWNpZmllciBhbmQgTW9kdWxlU3BlY2lmaWVyIGFyZSBhYnN0cmFjdCBub24tc3RhbmRhcmQgdHlwZXNcbiAgICAvLyBpbnRyb2R1Y2VkIGZvciBkZWZpbml0aW9uYWwgY29udmVuaWVuY2UuXG4gICAgZGVmKFwiU3BlY2lmaWVyXCIpLmJhc2VzKFwiTm9kZVwiKTtcbiAgICAvLyBUaGlzIHN1cGVydHlwZSBpcyBzaGFyZWQvYWJ1c2VkIGJ5IGJvdGggZGVmL2JhYmVsLmpzIGFuZFxuICAgIC8vIGRlZi9lc3ByaW1hLmpzLiBJbiB0aGUgZnV0dXJlLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIGxvYWQgb25seSBvbmUgc2V0XG4gICAgLy8gb2YgZGVmaW5pdGlvbnMgYXBwcm9wcmlhdGUgZm9yIGEgZ2l2ZW4gcGFyc2VyLCBidXQgdW50aWwgdGhlbiB3ZSBtdXN0XG4gICAgLy8gcmVseSBvbiBkZWZhdWx0IGZ1bmN0aW9ucyB0byByZWNvbmNpbGUgdGhlIGNvbmZsaWN0aW5nIEFTVCBmb3JtYXRzLlxuICAgIGRlZihcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJTcGVjaWZpZXJcIilcbiAgICAgICAgLy8gVGhpcyBsb2NhbCBmaWVsZCBpcyB1c2VkIGJ5IEJhYmVsL0Fjb3JuLiBJdCBzaG91bGQgbm90IHRlY2huaWNhbGx5XG4gICAgICAgIC8vIGJlIG9wdGlvbmFsIGluIHRoZSBCYWJlbC9BY29ybiBBU1QgZm9ybWF0LCBidXQgaXQgbXVzdCBiZSBvcHRpb25hbFxuICAgICAgICAvLyBpbiB0aGUgRXNwcmltYSBBU1QgZm9ybWF0LlxuICAgICAgICAuZmllbGQoXCJsb2NhbFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAvLyBUaGUgaWQgYW5kIG5hbWUgZmllbGRzIGFyZSB1c2VkIGJ5IEVzcHJpbWEuIFRoZSBpZCBmaWVsZCBzaG91bGQgbm90XG4gICAgICAgIC8vIHRlY2huaWNhbGx5IGJlIG9wdGlvbmFsIGluIHRoZSBFc3ByaW1hIEFTVCBmb3JtYXQsIGJ1dCBpdCBtdXN0IGJlXG4gICAgICAgIC8vIG9wdGlvbmFsIGluIHRoZSBCYWJlbC9BY29ybiBBU1QgZm9ybWF0LlxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIC8vIExpa2UgTW9kdWxlU3BlY2lmaWVyLCBleGNlcHQgdHlwZTpcIkltcG9ydFNwZWNpZmllclwiIGFuZCBidWlsZGFibGUuXG4gICAgLy8gaW1wb3J0IHs8aWQgW2FzIG5hbWVdPn0gZnJvbSAuLi47XG4gICAgZGVmKFwiSW1wb3J0U3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcIm5hbWVcIik7XG4gICAgLy8gaW1wb3J0IDwqIGFzIGlkPiBmcm9tIC4uLjtcbiAgICBkZWYoXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTW9kdWxlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpO1xuICAgIC8vIGltcG9ydCA8aWQ+IGZyb20gLi4uO1xuICAgIGRlZihcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTW9kdWxlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpO1xuICAgIGRlZihcIkltcG9ydERlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcInNwZWNpZmllcnNcIiwgXCJzb3VyY2VcIiwgXCJpbXBvcnRLaW5kXCIpXG4gICAgICAgIC5maWVsZChcInNwZWNpZmllcnNcIiwgW29yKGRlZihcIkltcG9ydFNwZWNpZmllclwiKSwgZGVmKFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpLCBkZWYoXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIpKV0sIGRlZmF1bHRzLmVtcHR5QXJyYXkpXG4gICAgICAgIC5maWVsZChcInNvdXJjZVwiLCBkZWYoXCJMaXRlcmFsXCIpKVxuICAgICAgICAuZmllbGQoXCJpbXBvcnRLaW5kXCIsIG9yKFwidmFsdWVcIiwgXCJ0eXBlXCIpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcInZhbHVlXCI7XG4gICAgfSk7XG4gICAgZGVmKFwiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwidGFnXCIsIFwicXVhc2lcIilcbiAgICAgICAgLmZpZWxkKFwidGFnXCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInF1YXNpXCIsIGRlZihcIlRlbXBsYXRlTGl0ZXJhbFwiKSk7XG4gICAgZGVmKFwiVGVtcGxhdGVMaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwicXVhc2lzXCIsIFwiZXhwcmVzc2lvbnNcIilcbiAgICAgICAgLmZpZWxkKFwicXVhc2lzXCIsIFtkZWYoXCJUZW1wbGF0ZUVsZW1lbnRcIildKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uc1wiLCBbZGVmKFwiRXhwcmVzc2lvblwiKV0pO1xuICAgIGRlZihcIlRlbXBsYXRlRWxlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIsIFwidGFpbFwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCB7IFwiY29va2VkXCI6IFN0cmluZywgXCJyYXdcIjogU3RyaW5nIH0pXG4gICAgICAgIC5maWVsZChcInRhaWxcIiwgQm9vbGVhbik7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgZXM2XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9lczZcIikpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3R5cGVzXCIpKTtcbnZhciBzaGFyZWRfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvc2hhcmVkXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoZXM2XzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICBkZWYoXCJGdW5jdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJhc3luY1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJTcHJlYWRQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIk9iamVjdEV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydGllc1wiLCBbb3IoZGVmKFwiUHJvcGVydHlcIiksIGRlZihcIlNwcmVhZFByb3BlcnR5XCIpLCBkZWYoXCJTcHJlYWRFbGVtZW50XCIpKV0pO1xuICAgIGRlZihcIlNwcmVhZFByb3BlcnR5UGF0dGVyblwiKVxuICAgICAgICAuYmFzZXMoXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIlBhdHRlcm5cIikpO1xuICAgIGRlZihcIk9iamVjdFBhdHRlcm5cIilcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydGllc1wiLCBbb3IoZGVmKFwiUHJvcGVydHlcIiksIGRlZihcIlByb3BlcnR5UGF0dGVyblwiKSwgZGVmKFwiU3ByZWFkUHJvcGVydHlQYXR0ZXJuXCIpKV0pO1xuICAgIGRlZihcIkF3YWl0RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIsIFwiYWxsXCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJhbGxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgZXM3XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9lczdcIikpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3R5cGVzXCIpKTtcbnZhciBzaGFyZWRfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvc2hhcmVkXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoZXM3XzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICBkZWYoXCJWYXJpYWJsZURlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcImRlY2xhcmF0aW9uc1wiLCBbb3IoZGVmKFwiVmFyaWFibGVEZWNsYXJhdG9yXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpIC8vIEVzcHJpbWEgZGV2aWF0aW9uLlxuICAgICAgICApXSk7XG4gICAgZGVmKFwiUHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgZGVmKFwiUGF0dGVyblwiKSAvLyBFc3ByaW1hIGRldmlhdGlvbi5cbiAgICApKTtcbiAgICBkZWYoXCJBcnJheVBhdHRlcm5cIilcbiAgICAgICAgLmZpZWxkKFwiZWxlbWVudHNcIiwgW29yKGRlZihcIlBhdHRlcm5cIiksIGRlZihcIlNwcmVhZEVsZW1lbnRcIiksIG51bGwpXSk7XG4gICAgZGVmKFwiT2JqZWN0UGF0dGVyblwiKVxuICAgICAgICAuZmllbGQoXCJwcm9wZXJ0aWVzXCIsIFtvcihkZWYoXCJQcm9wZXJ0eVwiKSwgZGVmKFwiUHJvcGVydHlQYXR0ZXJuXCIpLCBkZWYoXCJTcHJlYWRQcm9wZXJ0eVBhdHRlcm5cIiksIGRlZihcIlNwcmVhZFByb3BlcnR5XCIpIC8vIFVzZWQgYnkgRXNwcmltYS5cbiAgICAgICAgKV0pO1xuICAgIC8vIExpa2UgTW9kdWxlU3BlY2lmaWVyLCBleGNlcHQgdHlwZTpcIkV4cG9ydFNwZWNpZmllclwiIGFuZCBidWlsZGFibGUuXG4gICAgLy8gZXhwb3J0IHs8aWQgW2FzIG5hbWVdPn0gW2Zyb20gLi4uXTtcbiAgICBkZWYoXCJFeHBvcnRTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTW9kdWxlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwibmFtZVwiKTtcbiAgICAvLyBleHBvcnQgPCo+IGZyb20gLi4uO1xuICAgIGRlZihcIkV4cG9ydEJhdGNoU3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIlNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJFeHBvcnREZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJkZWZhdWx0XCIsIFwiZGVjbGFyYXRpb25cIiwgXCJzcGVjaWZpZXJzXCIsIFwic291cmNlXCIpXG4gICAgICAgIC5maWVsZChcImRlZmF1bHRcIiwgQm9vbGVhbilcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyYXRpb25cIiwgb3IoZGVmKFwiRGVjbGFyYXRpb25cIiksIGRlZihcIkV4cHJlc3Npb25cIiksIC8vIEltcGxpZXMgZGVmYXVsdC5cbiAgICBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwic3BlY2lmaWVyc1wiLCBbb3IoZGVmKFwiRXhwb3J0U3BlY2lmaWVyXCIpLCBkZWYoXCJFeHBvcnRCYXRjaFNwZWNpZmllclwiKSldLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiQmxvY2tcIilcbiAgICAgICAgLmJhc2VzKFwiQ29tbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCAvKm9wdGlvbmFsOiovIFwibGVhZGluZ1wiLCBcInRyYWlsaW5nXCIpO1xuICAgIGRlZihcIkxpbmVcIilcbiAgICAgICAgLmJhc2VzKFwiQ29tbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCAvKm9wdGlvbmFsOiovIFwibGVhZGluZ1wiLCBcInRyYWlsaW5nXCIpO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIGVzN18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZXM3XCIpKTtcbnZhciB0eXBlX2Fubm90YXRpb25zXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90eXBlLWFubm90YXRpb25zXCIpKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIGZvcmsudXNlKGVzN18xLmRlZmF1bHQpO1xuICAgIGZvcmsudXNlKHR5cGVfYW5ub3RhdGlvbnNfMS5kZWZhdWx0KTtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICB2YXIgb3IgPSB0eXBlcy5UeXBlLm9yO1xuICAgIHZhciBkZWZhdWx0cyA9IGZvcmsudXNlKHNoYXJlZF8xLmRlZmF1bHQpLmRlZmF1bHRzO1xuICAgIC8vIEJhc2UgdHlwZXNcbiAgICBkZWYoXCJGbG93XCIpLmJhc2VzKFwiTm9kZVwiKTtcbiAgICBkZWYoXCJGbG93VHlwZVwiKS5iYXNlcyhcIkZsb3dcIik7XG4gICAgLy8gVHlwZSBhbm5vdGF0aW9uc1xuICAgIGRlZihcIkFueVR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIkVtcHR5VHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiTWl4ZWRUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJWb2lkVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiTnVtYmVyVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiTnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIsIFwicmF3XCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIE51bWJlcilcbiAgICAgICAgLmZpZWxkKFwicmF3XCIsIFN0cmluZyk7XG4gICAgLy8gQmFieWxvbiA2IGRpZmZlcnMgaW4gQVNUIGZyb20gRmxvd1xuICAgIC8vIHNhbWUgYXMgTnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXG4gICAgZGVmKFwiTnVtZXJpY0xpdGVyYWxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCBcInJhd1wiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBOdW1iZXIpXG4gICAgICAgIC5maWVsZChcInJhd1wiLCBTdHJpbmcpO1xuICAgIGRlZihcIlN0cmluZ1R5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIlN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCBcInJhd1wiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBTdHJpbmcpXG4gICAgICAgIC5maWVsZChcInJhd1wiLCBTdHJpbmcpO1xuICAgIGRlZihcIkJvb2xlYW5UeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIsIFwicmF3XCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIEJvb2xlYW4pXG4gICAgICAgIC5maWVsZChcInJhd1wiLCBTdHJpbmcpO1xuICAgIGRlZihcIlR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiRmxvd1R5cGVcIikpO1xuICAgIGRlZihcIk51bGxhYmxlVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiRmxvd1R5cGVcIikpO1xuICAgIGRlZihcIk51bGxMaXRlcmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiTnVsbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIlRoaXNUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJFeGlzdHNUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJFeGlzdGVudGlhbFR5cGVQYXJhbVwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtc1wiLCBcInJldHVyblR5cGVcIiwgXCJyZXN0XCIsIFwidHlwZVBhcmFtZXRlcnNcIilcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJGdW5jdGlvblR5cGVQYXJhbVwiKV0pXG4gICAgICAgIC5maWVsZChcInJldHVyblR5cGVcIiwgZGVmKFwiRmxvd1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcInJlc3RcIiwgb3IoZGVmKFwiRnVuY3Rpb25UeXBlUGFyYW1cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiksIG51bGwpKTtcbiAgICBkZWYoXCJGdW5jdGlvblR5cGVQYXJhbVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcIm5hbWVcIiwgXCJ0eXBlQW5ub3RhdGlvblwiLCBcIm9wdGlvbmFsXCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiRmxvd1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIEJvb2xlYW4pO1xuICAgIGRlZihcIkFycmF5VHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiZWxlbWVudFR5cGVcIilcbiAgICAgICAgLmZpZWxkKFwiZWxlbWVudFR5cGVcIiwgZGVmKFwiRmxvd1R5cGVcIikpO1xuICAgIGRlZihcIk9iamVjdFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInByb3BlcnRpZXNcIiwgXCJpbmRleGVyc1wiLCBcImNhbGxQcm9wZXJ0aWVzXCIpXG4gICAgICAgIC5maWVsZChcInByb3BlcnRpZXNcIiwgW1xuICAgICAgICBvcihkZWYoXCJPYmplY3RUeXBlUHJvcGVydHlcIiksIGRlZihcIk9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eVwiKSlcbiAgICBdKVxuICAgICAgICAuZmllbGQoXCJpbmRleGVyc1wiLCBbZGVmKFwiT2JqZWN0VHlwZUluZGV4ZXJcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJjYWxsUHJvcGVydGllc1wiLCBbZGVmKFwiT2JqZWN0VHlwZUNhbGxQcm9wZXJ0eVwiKV0sIGRlZmF1bHRzLmVtcHR5QXJyYXkpXG4gICAgICAgIC5maWVsZChcImluZXhhY3RcIiwgb3IoQm9vbGVhbiwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pXG4gICAgICAgIC5maWVsZChcImV4YWN0XCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImludGVybmFsU2xvdHNcIiwgW2RlZihcIk9iamVjdFR5cGVJbnRlcm5hbFNsb3RcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KTtcbiAgICBkZWYoXCJWYXJpYW5jZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImtpbmRcIilcbiAgICAgICAgLmZpZWxkKFwia2luZFwiLCBvcihcInBsdXNcIiwgXCJtaW51c1wiKSk7XG4gICAgdmFyIExlZ2FjeVZhcmlhbmNlID0gb3IoZGVmKFwiVmFyaWFuY2VcIiksIFwicGx1c1wiLCBcIm1pbnVzXCIsIG51bGwpO1xuICAgIGRlZihcIk9iamVjdFR5cGVQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImtleVwiLCBcInZhbHVlXCIsIFwib3B0aW9uYWxcIilcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIGRlZihcIklkZW50aWZpZXJcIikpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJGbG93VHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbilcbiAgICAgICAgLmZpZWxkKFwidmFyaWFuY2VcIiwgTGVnYWN5VmFyaWFuY2UsIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiT2JqZWN0VHlwZUluZGV4ZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImtleVwiLCBcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBkZWYoXCJGbG93VHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgZGVmKFwiRmxvd1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcInZhcmlhbmNlXCIsIExlZ2FjeVZhcmlhbmNlLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIk9iamVjdFR5cGVDYWxsUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJGdW5jdGlvblR5cGVBbm5vdGF0aW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJzdGF0aWNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiUXVhbGlmaWVkVHlwZUlkZW50aWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJxdWFsaWZpY2F0aW9uXCIsIFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwicXVhbGlmaWNhdGlvblwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJRdWFsaWZpZWRUeXBlSWRlbnRpZmllclwiKSkpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpO1xuICAgIGRlZihcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCIpKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksIG51bGwpKTtcbiAgICBkZWYoXCJNZW1iZXJUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJvYmplY3RcIiwgXCJwcm9wZXJ0eVwiKVxuICAgICAgICAuZmllbGQoXCJvYmplY3RcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydHlcIiwgb3IoZGVmKFwiTWVtYmVyVHlwZUFubm90YXRpb25cIiksIGRlZihcIkdlbmVyaWNUeXBlQW5ub3RhdGlvblwiKSkpO1xuICAgIGRlZihcIlVuaW9uVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZXNcIilcbiAgICAgICAgLmZpZWxkKFwidHlwZXNcIiwgW2RlZihcIkZsb3dUeXBlXCIpXSk7XG4gICAgZGVmKFwiSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZXNcIilcbiAgICAgICAgLmZpZWxkKFwidHlwZXNcIiwgW2RlZihcIkZsb3dUeXBlXCIpXSk7XG4gICAgZGVmKFwiVHlwZW9mVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYXJndW1lbnRcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRmxvd1R5cGVcIikpO1xuICAgIGRlZihcIk9iamVjdFR5cGVTcHJlYWRQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkZsb3dUeXBlXCIpKTtcbiAgICBkZWYoXCJPYmplY3RUeXBlSW50ZXJuYWxTbG90XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJ2YWx1ZVwiLCBcIm9wdGlvbmFsXCIsIFwic3RhdGljXCIsIFwibWV0aG9kXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIGRlZihcIkZsb3dUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBCb29sZWFuKVxuICAgICAgICAuZmllbGQoXCJzdGF0aWNcIiwgQm9vbGVhbilcbiAgICAgICAgLmZpZWxkKFwibWV0aG9kXCIsIEJvb2xlYW4pO1xuICAgIGRlZihcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtc1wiKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIlR5cGVQYXJhbWV0ZXJcIildKTtcbiAgICBkZWYoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtc1wiKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIkZsb3dUeXBlXCIpXSk7XG4gICAgZGVmKFwiVHlwZVBhcmFtZXRlclwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIsIFwidmFyaWFuY2VcIiwgXCJib3VuZFwiKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIFN0cmluZylcbiAgICAgICAgLmZpZWxkKFwidmFyaWFuY2VcIiwgTGVnYWN5VmFyaWFuY2UsIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiYm91bmRcIiwgb3IoZGVmKFwiVHlwZUFubm90YXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkNsYXNzUHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwidmFyaWFuY2VcIiwgTGVnYWN5VmFyaWFuY2UsIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiQ2xhc3NJbXBsZW1lbnRzXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwic3VwZXJDbGFzc1wiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiSW50ZXJmYWNlVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiLCBcImV4dGVuZHNcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJPYmplY3RUeXBlQW5ub3RhdGlvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiZXh0ZW5kc1wiLCBvcihbZGVmKFwiSW50ZXJmYWNlRXh0ZW5kc1wiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkludGVyZmFjZURlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwiYm9keVwiLCBcImV4dGVuZHNcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIk9iamVjdFR5cGVBbm5vdGF0aW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJleHRlbmRzXCIsIFtkZWYoXCJJbnRlcmZhY2VFeHRlbmRzXCIpXSk7XG4gICAgZGVmKFwiRGVjbGFyZUludGVyZmFjZVwiKVxuICAgICAgICAuYmFzZXMoXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImJvZHlcIiwgXCJleHRlbmRzXCIpO1xuICAgIGRlZihcIkludGVyZmFjZUV4dGVuZHNcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVHlwZUFsaWFzXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJyaWdodFwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJyaWdodFwiLCBkZWYoXCJGbG93VHlwZVwiKSk7XG4gICAgZGVmKFwiT3BhcXVlVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInR5cGVQYXJhbWV0ZXJzXCIsIFwiaW1wbHR5cGVcIiwgXCJzdXBlcnR5cGVcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwiaW1wbHR5cGVcIiwgZGVmKFwiRmxvd1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcInN1cGVydHlwZVwiLCBkZWYoXCJGbG93VHlwZVwiKSk7XG4gICAgZGVmKFwiRGVjbGFyZVR5cGVBbGlhc1wiKVxuICAgICAgICAuYmFzZXMoXCJUeXBlQWxpYXNcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInJpZ2h0XCIpO1xuICAgIGRlZihcIkRlY2xhcmVPcGFxdWVUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlR5cGVBbGlhc1wiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInR5cGVQYXJhbWV0ZXJzXCIsIFwic3VwZXJ0eXBlXCIpO1xuICAgIGRlZihcIlR5cGVDYXN0RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIiwgXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlR5cGVBbm5vdGF0aW9uXCIpKTtcbiAgICBkZWYoXCJUdXBsZVR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVzXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVzXCIsIFtkZWYoXCJGbG93VHlwZVwiKV0pO1xuICAgIGRlZihcIkRlY2xhcmVWYXJpYWJsZVwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiRGVjbGFyZUZ1bmN0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKTtcbiAgICBkZWYoXCJEZWNsYXJlQ2xhc3NcIilcbiAgICAgICAgLmJhc2VzKFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIik7XG4gICAgZGVmKFwiRGVjbGFyZU1vZHVsZVwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIkxpdGVyYWxcIikpKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkJsb2NrU3RhdGVtZW50XCIpKTtcbiAgICBkZWYoXCJEZWNsYXJlTW9kdWxlRXhwb3J0c1wiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiVHlwZUFubm90YXRpb25cIikpO1xuICAgIGRlZihcIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJkZWZhdWx0XCIsIFwiZGVjbGFyYXRpb25cIiwgXCJzcGVjaWZpZXJzXCIsIFwic291cmNlXCIpXG4gICAgICAgIC5maWVsZChcImRlZmF1bHRcIiwgQm9vbGVhbilcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyYXRpb25cIiwgb3IoZGVmKFwiRGVjbGFyZVZhcmlhYmxlXCIpLCBkZWYoXCJEZWNsYXJlRnVuY3Rpb25cIiksIGRlZihcIkRlY2xhcmVDbGFzc1wiKSwgZGVmKFwiRmxvd1R5cGVcIiksIC8vIEltcGxpZXMgZGVmYXVsdC5cbiAgICBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwic3BlY2lmaWVyc1wiLCBbb3IoZGVmKFwiRXhwb3J0U3BlY2lmaWVyXCIpLCBkZWYoXCJFeHBvcnRCYXRjaFNwZWNpZmllclwiKSldLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiRGVjbGFyZUV4cG9ydEFsbERlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcInNvdXJjZVwiKVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiRmxvd1ByZWRpY2F0ZVwiKS5iYXNlcyhcIkZsb3dcIik7XG4gICAgZGVmKFwiSW5mZXJyZWRQcmVkaWNhdGVcIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1ByZWRpY2F0ZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJEZWNsYXJlZFByZWRpY2F0ZVwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93UHJlZGljYXRlXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIkNhbGxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBcmd1bWVudHNcIiwgb3IobnVsbCwgZGVmKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIikpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIk5ld0V4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFyZ3VtZW50c1wiLCBvcihudWxsLCBkZWYoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgZXM3XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9lczdcIikpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3R5cGVzXCIpKTtcbnZhciBzaGFyZWRfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvc2hhcmVkXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoZXM3XzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICBkZWYoXCJKU1hBdHRyaWJ1dGVcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIsIFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBvcihkZWYoXCJKU1hJZGVudGlmaWVyXCIpLCBkZWYoXCJKU1hOYW1lc3BhY2VkTmFtZVwiKSkpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIC8vIGF0dHI9XCJ2YWx1ZVwiXG4gICAgZGVmKFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiKSwgLy8gYXR0cj17dmFsdWV9XG4gICAgbnVsbCAvLyBhdHRyPSBvciBqdXN0IGF0dHJcbiAgICApLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkpTWElkZW50aWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiSWRlbnRpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJKU1hOYW1lc3BhY2VkTmFtZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcIm5hbWVzcGFjZVwiLCBcIm5hbWVcIilcbiAgICAgICAgLmZpZWxkKFwibmFtZXNwYWNlXCIsIGRlZihcIkpTWElkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgZGVmKFwiSlNYSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJNZW1iZXJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9iamVjdFwiLCBcInByb3BlcnR5XCIpXG4gICAgICAgIC5maWVsZChcIm9iamVjdFwiLCBvcihkZWYoXCJKU1hJZGVudGlmaWVyXCIpLCBkZWYoXCJKU1hNZW1iZXJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydHlcIiwgZGVmKFwiSlNYSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHMuZmFsc2UpO1xuICAgIHZhciBKU1hFbGVtZW50TmFtZSA9IG9yKGRlZihcIkpTWElkZW50aWZpZXJcIiksIGRlZihcIkpTWE5hbWVzcGFjZWROYW1lXCIpLCBkZWYoXCJKU1hNZW1iZXJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICB2YXIgSlNYQXR0cmlidXRlcyA9IFtvcihkZWYoXCJKU1hBdHRyaWJ1dGVcIiksIGRlZihcIkpTWFNwcmVhZEF0dHJpYnV0ZVwiKSldO1xuICAgIGRlZihcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25cIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiSlNYRWxlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9wZW5pbmdFbGVtZW50XCIsIFwiY2xvc2luZ0VsZW1lbnRcIiwgXCJjaGlsZHJlblwiKVxuICAgICAgICAuZmllbGQoXCJvcGVuaW5nRWxlbWVudFwiLCBkZWYoXCJKU1hPcGVuaW5nRWxlbWVudFwiKSlcbiAgICAgICAgLmZpZWxkKFwiY2xvc2luZ0VsZW1lbnRcIiwgb3IoZGVmKFwiSlNYQ2xvc2luZ0VsZW1lbnRcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcImNoaWxkcmVuXCIsIFtvcihkZWYoXCJKU1hFbGVtZW50XCIpLCBkZWYoXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCIpLCBkZWYoXCJKU1hGcmFnbWVudFwiKSwgZGVmKFwiSlNYVGV4dFwiKSwgZGVmKFwiTGl0ZXJhbFwiKSAvLyBUT0RPIEVzcHJpbWEgc2hvdWxkIHJldHVybiBKU1hUZXh0IGluc3RlYWQuXG4gICAgICAgICldLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIEpTWEVsZW1lbnROYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIExpdHRsZS1rbm93biBmYWN0OiB0aGUgYHRoaXNgIG9iamVjdCBpbnNpZGUgYSBkZWZhdWx0IGZ1bmN0aW9uXG4gICAgICAgIC8vIGlzIG5vbmUgb3RoZXIgdGhhbiB0aGUgcGFydGlhbGx5LWJ1aWx0IG9iamVjdCBpdHNlbGYsIGFuZCBhbnlcbiAgICAgICAgLy8gZmllbGRzIGluaXRpYWxpemVkIGRpcmVjdGx5IGZyb20gYnVpbGRlciBmdW5jdGlvbiBhcmd1bWVudHNcbiAgICAgICAgLy8gKGxpa2Ugb3BlbmluZ0VsZW1lbnQsIGNsb3NpbmdFbGVtZW50LCBhbmQgY2hpbGRyZW4pIGFyZVxuICAgICAgICAvLyBndWFyYW50ZWVkIHRvIGJlIGF2YWlsYWJsZS5cbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0VsZW1lbnQubmFtZTtcbiAgICB9LCB0cnVlKSAvLyBoaWRkZW4gZnJvbSB0cmF2ZXJzYWxcbiAgICAgICAgLmZpZWxkKFwic2VsZkNsb3NpbmdcIiwgQm9vbGVhbiwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nRWxlbWVudC5zZWxmQ2xvc2luZztcbiAgICB9LCB0cnVlKSAvLyBoaWRkZW4gZnJvbSB0cmF2ZXJzYWxcbiAgICAgICAgLmZpZWxkKFwiYXR0cmlidXRlc1wiLCBKU1hBdHRyaWJ1dGVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdFbGVtZW50LmF0dHJpYnV0ZXM7XG4gICAgfSwgdHJ1ZSk7IC8vIGhpZGRlbiBmcm9tIHRyYXZlcnNhbFxuICAgIGRlZihcIkpTWE9wZW5pbmdFbGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIikgLy8gVE9ETyBEb2VzIHRoaXMgbWFrZSBzZW5zZT8gQ2FuJ3QgcmVhbGx5IGJlIGFuIEpTWEVsZW1lbnQuXG4gICAgICAgIC5idWlsZChcIm5hbWVcIiwgXCJhdHRyaWJ1dGVzXCIsIFwic2VsZkNsb3NpbmdcIilcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBKU1hFbGVtZW50TmFtZSlcbiAgICAgICAgLmZpZWxkKFwiYXR0cmlidXRlc1wiLCBKU1hBdHRyaWJ1dGVzLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJzZWxmQ2xvc2luZ1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJKU1hDbG9zaW5nRWxlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpIC8vIFRPRE8gU2FtZSBjb25jZXJuLlxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgSlNYRWxlbWVudE5hbWUpO1xuICAgIGRlZihcIkpTWEZyYWdtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwib3BlbmluZ0VsZW1lbnRcIiwgXCJjbG9zaW5nRWxlbWVudFwiLCBcImNoaWxkcmVuXCIpXG4gICAgICAgIC5maWVsZChcIm9wZW5pbmdFbGVtZW50XCIsIGRlZihcIkpTWE9wZW5pbmdGcmFnbWVudFwiKSlcbiAgICAgICAgLmZpZWxkKFwiY2xvc2luZ0VsZW1lbnRcIiwgZGVmKFwiSlNYQ2xvc2luZ0ZyYWdtZW50XCIpKVxuICAgICAgICAuZmllbGQoXCJjaGlsZHJlblwiLCBbb3IoZGVmKFwiSlNYRWxlbWVudFwiKSwgZGVmKFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiKSwgZGVmKFwiSlNYRnJhZ21lbnRcIiksIGRlZihcIkpTWFRleHRcIiksIGRlZihcIkxpdGVyYWxcIikgLy8gVE9ETyBFc3ByaW1hIHNob3VsZCByZXR1cm4gSlNYVGV4dCBpbnN0ZWFkLlxuICAgICAgICApXSwgZGVmYXVsdHMuZW1wdHlBcnJheSk7XG4gICAgZGVmKFwiSlNYT3BlbmluZ0ZyYWdtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIikgLy8gVE9ETyBTYW1lIGNvbmNlcm4uXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIkpTWENsb3NpbmdGcmFnbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpIC8vIFRPRE8gU2FtZSBjb25jZXJuLlxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJKU1hUZXh0XCIpXG4gICAgICAgIC5iYXNlcyhcIkxpdGVyYWxcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJKU1hFbXB0eUV4cHJlc3Npb25cIikuYmFzZXMoXCJFeHByZXNzaW9uXCIpLmJ1aWxkKCk7XG4gICAgLy8gVGhpcyBQUiBoYXMgY2F1c2VkIG1hbnkgcGVvcGxlIGlzc3VlcywgYnV0IHN1cHBvcnRpbmcgaXQgc2VlbXMgbGlrZSBhXG4gICAgLy8gZ29vZCBpZGVhIGFueXdheTogaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYmVsL3B1bGwvNDk4OFxuICAgIGRlZihcIkpTWFNwcmVhZENoaWxkXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbi8qKlxuICogVHlwZSBhbm5vdGF0aW9uIGRlZnMgc2hhcmVkIGJldHdlZW4gRmxvdyBhbmQgVHlwZVNjcmlwdC5cbiAqIFRoZXNlIGRlZnMgY291bGQgbm90IGJlIGRlZmluZWQgaW4gLi9mbG93LnRzIG9yIC4vdHlwZXNjcmlwdC50cyBkaXJlY3RseVxuICogYmVjYXVzZSB0aGV5IHVzZSB0aGUgc2FtZSBuYW1lLlxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIGRlZiA9IHR5cGVzLlR5cGUuZGVmO1xuICAgIHZhciBvciA9IHR5cGVzLlR5cGUub3I7XG4gICAgdmFyIGRlZmF1bHRzID0gZm9yay51c2Uoc2hhcmVkXzEuZGVmYXVsdCkuZGVmYXVsdHM7XG4gICAgdmFyIFR5cGVBbm5vdGF0aW9uID0gb3IoZGVmKFwiVHlwZUFubm90YXRpb25cIiksIGRlZihcIlRTVHlwZUFubm90YXRpb25cIiksIG51bGwpO1xuICAgIHZhciBUeXBlUGFyYW1EZWNsID0gb3IoZGVmKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLCBkZWYoXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSwgbnVsbCk7XG4gICAgZGVmKFwiSWRlbnRpZmllclwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBUeXBlQW5ub3RhdGlvbiwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJPYmplY3RQYXR0ZXJuXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIFR5cGVBbm5vdGF0aW9uLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkZ1bmN0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInJldHVyblR5cGVcIiwgVHlwZUFubm90YXRpb24sIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgVHlwZVBhcmFtRGVjbCwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJDbGFzc1Byb3BlcnR5XCIpXG4gICAgICAgIC5idWlsZChcImtleVwiLCBcInZhbHVlXCIsIFwidHlwZUFubm90YXRpb25cIiwgXCJzdGF0aWNcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInN0YXRpY1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBUeXBlQW5ub3RhdGlvbiwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBbXCJDbGFzc0RlY2xhcmF0aW9uXCIsXG4gICAgICAgIFwiQ2xhc3NFeHByZXNzaW9uXCIsXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlTmFtZSkge1xuICAgICAgICBkZWYodHlwZU5hbWUpXG4gICAgICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBUeXBlUGFyYW1EZWNsLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgICAgICAuZmllbGQoXCJzdXBlclR5cGVQYXJhbWV0ZXJzXCIsIG9yKGRlZihcIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLCBkZWYoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwiaW1wbGVtZW50c1wiLCBvcihbZGVmKFwiQ2xhc3NJbXBsZW1lbnRzXCIpXSwgW2RlZihcIlRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXCIpXSksIGRlZmF1bHRzLmVtcHR5QXJyYXkpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIGJhYmVsX2NvcmVfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2JhYmVsLWNvcmVcIikpO1xudmFyIHR5cGVfYW5ub3RhdGlvbnNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3R5cGUtYW5ub3RhdGlvbnNcIikpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3R5cGVzXCIpKTtcbnZhciBzaGFyZWRfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvc2hhcmVkXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgLy8gU2luY2UgVHlwZVNjcmlwdCBpcyBwYXJzZWQgYnkgQmFieWxvbiwgaW5jbHVkZSB0aGUgY29yZSBCYWJ5bG9uIHR5cGVzXG4gICAgLy8gYnV0IG9taXQgdGhlIEZsb3ctcmVsYXRlZCB0eXBlcy5cbiAgICBmb3JrLnVzZShiYWJlbF9jb3JlXzEuZGVmYXVsdCk7XG4gICAgZm9yay51c2UodHlwZV9hbm5vdGF0aW9uc18xLmRlZmF1bHQpO1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIG4gPSB0eXBlcy5uYW1lZFR5cGVzO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICB2YXIgb3IgPSB0eXBlcy5UeXBlLm9yO1xuICAgIHZhciBkZWZhdWx0cyA9IGZvcmsudXNlKHNoYXJlZF8xLmRlZmF1bHQpLmRlZmF1bHRzO1xuICAgIHZhciBTdHJpbmdMaXRlcmFsID0gdHlwZXMuVHlwZS5mcm9tKGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkge1xuICAgICAgICBpZiAobi5TdHJpbmdMaXRlcmFsICYmXG4gICAgICAgICAgICBuLlN0cmluZ0xpdGVyYWwuY2hlY2sodmFsdWUsIGRlZXApKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobi5MaXRlcmFsICYmXG4gICAgICAgICAgICBuLkxpdGVyYWwuY2hlY2sodmFsdWUsIGRlZXApICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUudmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LCBcIlN0cmluZ0xpdGVyYWxcIik7XG4gICAgZGVmKFwiVFNUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIik7XG4gICAgdmFyIFRTRW50aXR5TmFtZSA9IG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIlRTUXVhbGlmaWVkTmFtZVwiKSk7XG4gICAgZGVmKFwiVFNUeXBlUmVmZXJlbmNlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJ0eXBlTmFtZVwiLCBcInR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVOYW1lXCIsIFRTRW50aXR5TmFtZSk7XG4gICAgLy8gQW4gYWJzdHJhY3QgKG5vbi1idWlsZGFibGUpIGJhc2UgdHlwZSB0aGF0IHByb3ZpZGUgYSBjb21tb25seS1uZWVkZWRcbiAgICAvLyBvcHRpb25hbCAudHlwZVBhcmFtZXRlcnMgZmllbGQuXG4gICAgZGVmKFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJzXCIsIG9yKGRlZihcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIC8vIEFuIGFic3RyYWN0IChub24tYnVpbGRhYmxlKSBiYXNlIHR5cGUgdGhhdCBwcm92aWRlIGEgY29tbW9ubHktbmVlZGVkXG4gICAgLy8gb3B0aW9uYWwgLnR5cGVQYXJhbWV0ZXJzIGZpZWxkLlxuICAgIGRlZihcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUU1R5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSwgbnVsbCwgdm9pZCAwKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICAvLyBBbiBhYnN0cmFjdCAobm9uLWJ1aWxkYWJsZSkgYmFzZSB0eXBlIHRoYXQgcHJvdmlkZSBhIGNvbW1vbmx5LW5lZWRlZFxuICAgIC8vIG9wdGlvbmFsIC50eXBlQW5ub3RhdGlvbiBmaWVsZC5cbiAgICBkZWYoXCJUU0hhc09wdGlvbmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgb3IoZGVmKFwiVFNUeXBlQW5ub3RhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNRdWFsaWZpZWROYW1lXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwibGVmdFwiLCBcInJpZ2h0XCIpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgVFNFbnRpdHlOYW1lKVxuICAgICAgICAuZmllbGQoXCJyaWdodFwiLCBUU0VudGl0eU5hbWUpO1xuICAgIGRlZihcIlRTQXNFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIiwgXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIiwgXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlRTVHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwiZXh0cmFcIiwgb3IoeyBwYXJlbnRoZXNpemVkOiBCb29sZWFuIH0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTTm9uTnVsbEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiLCBcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIFtcbiAgICAgICAgXCJUU0FueUtleXdvcmRcIixcbiAgICAgICAgXCJUU0JpZ0ludEtleXdvcmRcIixcbiAgICAgICAgXCJUU0Jvb2xlYW5LZXl3b3JkXCIsXG4gICAgICAgIFwiVFNOZXZlcktleXdvcmRcIixcbiAgICAgICAgXCJUU051bGxLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNOdW1iZXJLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNPYmplY3RLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNTdHJpbmdLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNTeW1ib2xLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNVbmRlZmluZWRLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNVbmtub3duS2V5d29yZFwiLFxuICAgICAgICBcIlRTVm9pZEtleXdvcmRcIixcbiAgICAgICAgXCJUU1RoaXNUeXBlXCIsXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXl3b3JkVHlwZSkge1xuICAgICAgICBkZWYoa2V5d29yZFR5cGUpXG4gICAgICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgICAgIC5idWlsZCgpO1xuICAgIH0pO1xuICAgIGRlZihcIlRTQXJyYXlUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJlbGVtZW50VHlwZVwiKVxuICAgICAgICAuZmllbGQoXCJlbGVtZW50VHlwZVwiLCBkZWYoXCJUU1R5cGVcIikpO1xuICAgIGRlZihcIlRTTGl0ZXJhbFR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImxpdGVyYWxcIilcbiAgICAgICAgLmZpZWxkKFwibGl0ZXJhbFwiLCBvcihkZWYoXCJOdW1lcmljTGl0ZXJhbFwiKSwgZGVmKFwiU3RyaW5nTGl0ZXJhbFwiKSwgZGVmKFwiQm9vbGVhbkxpdGVyYWxcIiksIGRlZihcIlRlbXBsYXRlTGl0ZXJhbFwiKSwgZGVmKFwiVW5hcnlFeHByZXNzaW9uXCIpKSk7XG4gICAgW1wiVFNVbmlvblR5cGVcIixcbiAgICAgICAgXCJUU0ludGVyc2VjdGlvblR5cGVcIixcbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKHR5cGVOYW1lKSB7XG4gICAgICAgIGRlZih0eXBlTmFtZSlcbiAgICAgICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAgICAgLmJ1aWxkKFwidHlwZXNcIilcbiAgICAgICAgICAgIC5maWVsZChcInR5cGVzXCIsIFtkZWYoXCJUU1R5cGVcIildKTtcbiAgICB9KTtcbiAgICBkZWYoXCJUU0NvbmRpdGlvbmFsVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiY2hlY2tUeXBlXCIsIFwiZXh0ZW5kc1R5cGVcIiwgXCJ0cnVlVHlwZVwiLCBcImZhbHNlVHlwZVwiKVxuICAgICAgICAuZmllbGQoXCJjaGVja1R5cGVcIiwgZGVmKFwiVFNUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJleHRlbmRzVHlwZVwiLCBkZWYoXCJUU1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcInRydWVUeXBlXCIsIGRlZihcIlRTVHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwiZmFsc2VUeXBlXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgZGVmKFwiVFNJbmZlclR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVQYXJhbWV0ZXJcIilcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlclwiLCBkZWYoXCJUU1R5cGVQYXJhbWV0ZXJcIikpO1xuICAgIGRlZihcIlRTUGFyZW50aGVzaXplZFR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgdmFyIFBhcmFtZXRlcnNUeXBlID0gW29yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIlJlc3RFbGVtZW50XCIpLCBkZWYoXCJBcnJheVBhdHRlcm5cIiksIGRlZihcIk9iamVjdFBhdHRlcm5cIikpXTtcbiAgICBbXCJUU0Z1bmN0aW9uVHlwZVwiLFxuICAgICAgICBcIlRTQ29uc3RydWN0b3JUeXBlXCIsXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlTmFtZSkge1xuICAgICAgICBkZWYodHlwZU5hbWUpXG4gICAgICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlcnNcIiwgXCJUU0hhc09wdGlvbmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgICAgIC5idWlsZChcInBhcmFtZXRlcnNcIilcbiAgICAgICAgICAgIC5maWVsZChcInBhcmFtZXRlcnNcIiwgUGFyYW1ldGVyc1R5cGUpO1xuICAgIH0pO1xuICAgIGRlZihcIlRTRGVjbGFyZUZ1bmN0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwicGFyYW1zXCIsIFwicmV0dXJuVHlwZVwiKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJlXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImFzeW5jXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImdlbmVyYXRvclwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIlBhdHRlcm5cIildKVxuICAgICAgICAvLyB0U0Z1bmN0aW9uVHlwZUFubm90YXRpb25Db21tb25cbiAgICAgICAgLmZpZWxkKFwicmV0dXJuVHlwZVwiLCBvcihkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLCBkZWYoXCJOb29wXCIpLCAvLyBTdGlsbCB1c2VkP1xuICAgIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTRGVjbGFyZU1ldGhvZFwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuYnVpbGQoXCJrZXlcIiwgXCJwYXJhbXNcIiwgXCJyZXR1cm5UeXBlXCIpXG4gICAgICAgIC5maWVsZChcImFzeW5jXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImdlbmVyYXRvclwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIlBhdHRlcm5cIildKVxuICAgICAgICAvLyBjbGFzc01ldGhvZE9yUHJvcGVydHlDb21tb25cbiAgICAgICAgLmZpZWxkKFwiYWJzdHJhY3RcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiYWNjZXNzaWJpbGl0eVwiLCBvcihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pXG4gICAgICAgIC5maWVsZChcInN0YXRpY1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiU3RyaW5nTGl0ZXJhbFwiKSwgZGVmKFwiTnVtZXJpY0xpdGVyYWxcIiksIFxuICAgIC8vIE9ubHkgYWxsb3dlZCBpZiAuY29tcHV0ZWQgaXMgdHJ1ZS5cbiAgICBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLy8gY2xhc3NNZXRob2RPckRlY2xhcmVNZXRob2RDb21tb25cbiAgICAgICAgLmZpZWxkKFwia2luZFwiLCBvcihcImdldFwiLCBcInNldFwiLCBcIm1ldGhvZFwiLCBcImNvbnN0cnVjdG9yXCIpLCBmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gXCJtZXRob2RcIjsgfSlcbiAgICAgICAgLmZpZWxkKFwiYWNjZXNzXCIsIC8vIE5vdCBcImFjY2Vzc2liaWxpdHlcIj9cbiAgICBvcihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pXG4gICAgICAgIC5maWVsZChcImRlY29yYXRvcnNcIiwgb3IoW2RlZihcIkRlY29yYXRvclwiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC8vIHRTRnVuY3Rpb25UeXBlQW5ub3RhdGlvbkNvbW1vblxuICAgICAgICAuZmllbGQoXCJyZXR1cm5UeXBlXCIsIG9yKGRlZihcIlRTVHlwZUFubm90YXRpb25cIiksIGRlZihcIk5vb3BcIiksIC8vIFN0aWxsIHVzZWQ/XG4gICAgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNNYXBwZWRUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ0eXBlUGFyYW1ldGVyXCIsIFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwicmVhZG9ubHlcIiwgb3IoQm9vbGVhbiwgXCIrXCIsIFwiLVwiKSwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlclwiLCBkZWYoXCJUU1R5cGVQYXJhbWV0ZXJcIikpXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIG9yKEJvb2xlYW4sIFwiK1wiLCBcIi1cIiksIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIG9yKGRlZihcIlRTVHlwZVwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNUdXBsZVR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImVsZW1lbnRUeXBlc1wiKVxuICAgICAgICAuZmllbGQoXCJlbGVtZW50VHlwZXNcIiwgW29yKGRlZihcIlRTVHlwZVwiKSwgZGVmKFwiVFNOYW1lZFR1cGxlTWVtYmVyXCIpKV0pO1xuICAgIGRlZihcIlRTTmFtZWRUdXBsZU1lbWJlclwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwibGFiZWxcIiwgXCJlbGVtZW50VHlwZVwiLCBcIm9wdGlvbmFsXCIpXG4gICAgICAgIC5maWVsZChcImxhYmVsXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImVsZW1lbnRUeXBlXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgZGVmKFwiVFNSZXN0VHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiVFNUeXBlXCIpKTtcbiAgICBkZWYoXCJUU09wdGlvbmFsVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiVFNUeXBlXCIpKTtcbiAgICBkZWYoXCJUU0luZGV4ZWRBY2Nlc3NUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJvYmplY3RUeXBlXCIsIFwiaW5kZXhUeXBlXCIpXG4gICAgICAgIC5maWVsZChcIm9iamVjdFR5cGVcIiwgZGVmKFwiVFNUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJpbmRleFR5cGVcIiwgZGVmKFwiVFNUeXBlXCIpKTtcbiAgICBkZWYoXCJUU1R5cGVPcGVyYXRvclwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwib3BlcmF0b3JcIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgU3RyaW5nKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBkZWYoXCJUU1R5cGVcIikpO1xuICAgIGRlZihcIlRTVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBvcihkZWYoXCJUU1R5cGVcIiksIGRlZihcIlRTVHlwZUFubm90YXRpb25cIikpKTtcbiAgICBkZWYoXCJUU0luZGV4U2lnbmF0dXJlXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtZXRlcnNcIiwgXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJwYXJhbWV0ZXJzXCIsIFtkZWYoXCJJZGVudGlmaWVyXCIpXSkgLy8gTGVuZ3RoID09PSAxXG4gICAgICAgIC5maWVsZChcInJlYWRvbmx5XCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIlRTUHJvcGVydHlTaWduYXR1cmVcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJUU0hhc09wdGlvbmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIsIFwidHlwZUFubm90YXRpb25cIiwgXCJvcHRpb25hbFwiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwicmVhZG9ubHlcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiaW5pdGlhbGl6ZXJcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNNZXRob2RTaWduYXR1cmVcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlcnNcIiwgXCJUU0hhc09wdGlvbmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIsIFwicGFyYW1ldGVyc1wiLCBcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJwYXJhbWV0ZXJzXCIsIFBhcmFtZXRlcnNUeXBlKTtcbiAgICBkZWYoXCJUU1R5cGVQcmVkaWNhdGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlQW5ub3RhdGlvblwiLCBcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbWV0ZXJOYW1lXCIsIFwidHlwZUFubm90YXRpb25cIiwgXCJhc3NlcnRzXCIpXG4gICAgICAgIC5maWVsZChcInBhcmFtZXRlck5hbWVcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiVFNUaGlzVHlwZVwiKSkpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIG9yKGRlZihcIlRTVHlwZUFubm90YXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcImFzc2VydHNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgW1wiVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb25cIixcbiAgICAgICAgXCJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlTmFtZSkge1xuICAgICAgICBkZWYodHlwZU5hbWUpXG4gICAgICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVyc1wiLCBcIlRTSGFzT3B0aW9uYWxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAgICAgLmJ1aWxkKFwicGFyYW1ldGVyc1wiLCBcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgICAgICAuZmllbGQoXCJwYXJhbWV0ZXJzXCIsIFBhcmFtZXRlcnNUeXBlKTtcbiAgICB9KTtcbiAgICBkZWYoXCJUU0VudW1NZW1iZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImluaXRpYWxpemVyXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIFN0cmluZ0xpdGVyYWwpKVxuICAgICAgICAuZmllbGQoXCJpbml0aWFsaXplclwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJUU1R5cGVRdWVyeVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwck5hbWVcIilcbiAgICAgICAgLmZpZWxkKFwiZXhwck5hbWVcIiwgb3IoVFNFbnRpdHlOYW1lLCBkZWYoXCJUU0ltcG9ydFR5cGVcIikpKTtcbiAgICAvLyBJbmZlcnJlZCBmcm9tIEJhYnlsb24ncyB0c1BhcnNlVHlwZU1lbWJlciBtZXRob2QuXG4gICAgdmFyIFRTVHlwZU1lbWJlciA9IG9yKGRlZihcIlRTQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uXCIpLCBkZWYoXCJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXCIpLCBkZWYoXCJUU0luZGV4U2lnbmF0dXJlXCIpLCBkZWYoXCJUU01ldGhvZFNpZ25hdHVyZVwiKSwgZGVmKFwiVFNQcm9wZXJ0eVNpZ25hdHVyZVwiKSk7XG4gICAgZGVmKFwiVFNUeXBlTGl0ZXJhbFwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwibWVtYmVyc1wiKVxuICAgICAgICAuZmllbGQoXCJtZW1iZXJzXCIsIFtUU1R5cGVNZW1iZXJdKTtcbiAgICBkZWYoXCJUU1R5cGVQYXJhbWV0ZXJcIilcbiAgICAgICAgLmJhc2VzKFwiSWRlbnRpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIsIFwiY29uc3RyYWludFwiLCBcImRlZmF1bHRcIilcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBTdHJpbmcpXG4gICAgICAgIC5maWVsZChcImNvbnN0cmFpbnRcIiwgb3IoZGVmKFwiVFNUeXBlXCIpLCB2b2lkIDApLCBkZWZhdWx0c1tcInVuZGVmaW5lZFwiXSlcbiAgICAgICAgLmZpZWxkKFwiZGVmYXVsdFwiLCBvcihkZWYoXCJUU1R5cGVcIiksIHZvaWQgMCksIGRlZmF1bHRzW1widW5kZWZpbmVkXCJdKTtcbiAgICBkZWYoXCJUU1R5cGVBc3NlcnRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiLCBcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIiwgXCJleHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlRTVHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJleHRyYVwiLCBvcih7IHBhcmVudGhlc2l6ZWQ6IEJvb2xlYW4gfSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwicGFyYW1zXCIpXG4gICAgICAgIC5maWVsZChcInBhcmFtc1wiLCBbZGVmKFwiVFNUeXBlUGFyYW1ldGVyXCIpXSk7XG4gICAgZGVmKFwiVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtc1wiKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIlRTVHlwZVwiKV0pO1xuICAgIGRlZihcIlRTRW51bURlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwibWVtYmVyc1wiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJjb25zdFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJlXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcIm1lbWJlcnNcIiwgW2RlZihcIlRTRW51bU1lbWJlclwiKV0pXG4gICAgICAgIC5maWVsZChcImluaXRpYWxpemVyXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTVHlwZUFsaWFzRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlcnNcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJlXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgZGVmKFwiVFNNb2R1bGVCbG9ja1wiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbZGVmKFwiU3RhdGVtZW50XCIpXSk7XG4gICAgZGVmKFwiVFNNb2R1bGVEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgb3IoU3RyaW5nTGl0ZXJhbCwgVFNFbnRpdHlOYW1lKSlcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyZVwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJnbG9iYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBvcihkZWYoXCJUU01vZHVsZUJsb2NrXCIpLCBkZWYoXCJUU01vZHVsZURlY2xhcmF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJUU0ltcG9ydFR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIsIFwicXVhbGlmaWVyXCIsIFwidHlwZVBhcmFtZXRlcnNcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgU3RyaW5nTGl0ZXJhbClcbiAgICAgICAgLmZpZWxkKFwicXVhbGlmaWVyXCIsIG9yKFRTRW50aXR5TmFtZSwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pO1xuICAgIGRlZihcIlRTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJtb2R1bGVSZWZlcmVuY2VcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwiaXNFeHBvcnRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwibW9kdWxlUmVmZXJlbmNlXCIsIG9yKFRTRW50aXR5TmFtZSwgZGVmKFwiVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZVwiKSkpO1xuICAgIGRlZihcIlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2VcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIFN0cmluZ0xpdGVyYWwpO1xuICAgIGRlZihcIlRTRXhwb3J0QXNzaWdubWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiVFNJbnRlcmZhY2VCb2R5XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIFtUU1R5cGVNZW1iZXJdKTtcbiAgICBkZWYoXCJUU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50c1wiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiLCBcInR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25cIiwgVFNFbnRpdHlOYW1lKTtcbiAgICBkZWYoXCJUU0ludGVyZmFjZURlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBUU0VudGl0eU5hbWUpXG4gICAgICAgIC5maWVsZChcImRlY2xhcmVcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiZXh0ZW5kc1wiLCBvcihbZGVmKFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIlRTSW50ZXJmYWNlQm9keVwiKSk7XG4gICAgZGVmKFwiVFNQYXJhbWV0ZXJQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtZXRlclwiKVxuICAgICAgICAuZmllbGQoXCJhY2Nlc3NpYmlsaXR5XCIsIG9yKFwicHVibGljXCIsIFwicHJpdmF0ZVwiLCBcInByb3RlY3RlZFwiLCB2b2lkIDApLCBkZWZhdWx0c1tcInVuZGVmaW5lZFwiXSlcbiAgICAgICAgLmZpZWxkKFwicmVhZG9ubHlcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwicGFyYW1ldGVyXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpKSk7XG4gICAgZGVmKFwiQ2xhc3NQcm9wZXJ0eVwiKVxuICAgICAgICAuZmllbGQoXCJhY2Nlc3NcIiwgLy8gTm90IFwiYWNjZXNzaWJpbGl0eVwiP1xuICAgIG9yKFwicHVibGljXCIsIFwicHJpdmF0ZVwiLCBcInByb3RlY3RlZFwiLCB2b2lkIDApLCBkZWZhdWx0c1tcInVuZGVmaW5lZFwiXSk7XG4gICAgLy8gRGVmaW5lZCBhbHJlYWR5IGluIGVzNiBhbmQgYmFiZWwtY29yZS5cbiAgICBkZWYoXCJDbGFzc0JvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbb3IoZGVmKFwiTWV0aG9kRGVmaW5pdGlvblwiKSwgZGVmKFwiVmFyaWFibGVEZWNsYXJhdG9yXCIpLCBkZWYoXCJDbGFzc1Byb3BlcnR5RGVmaW5pdGlvblwiKSwgZGVmKFwiQ2xhc3NQcm9wZXJ0eVwiKSwgZGVmKFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIiksIGRlZihcIkNsYXNzTWV0aG9kXCIpLCBkZWYoXCJDbGFzc1ByaXZhdGVNZXRob2RcIiksIFxuICAgICAgICAvLyBKdXN0IG5lZWQgdG8gYWRkIHRoZXNlIHR5cGVzOlxuICAgICAgICBkZWYoXCJUU0RlY2xhcmVNZXRob2RcIiksIFRTVHlwZU1lbWJlcildKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbGliL3R5cGVzXCIpKTtcbnZhciBwYXRoX3Zpc2l0b3JfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2xpYi9wYXRoLXZpc2l0b3JcIikpO1xudmFyIGVxdWl2XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9saWIvZXF1aXZcIikpO1xudmFyIHBhdGhfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2xpYi9wYXRoXCIpKTtcbnZhciBub2RlX3BhdGhfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2xpYi9ub2RlLXBhdGhcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGRlZnMpIHtcbiAgICB2YXIgZm9yayA9IGNyZWF0ZUZvcmsoKTtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIGRlZnMuZm9yRWFjaChmb3JrLnVzZSk7XG4gICAgdHlwZXMuZmluYWxpemUoKTtcbiAgICB2YXIgUGF0aFZpc2l0b3IgPSBmb3JrLnVzZShwYXRoX3Zpc2l0b3JfMS5kZWZhdWx0KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBUeXBlOiB0eXBlcy5UeXBlLFxuICAgICAgICBidWlsdEluVHlwZXM6IHR5cGVzLmJ1aWx0SW5UeXBlcyxcbiAgICAgICAgbmFtZWRUeXBlczogdHlwZXMubmFtZWRUeXBlcyxcbiAgICAgICAgYnVpbGRlcnM6IHR5cGVzLmJ1aWxkZXJzLFxuICAgICAgICBkZWZpbmVNZXRob2Q6IHR5cGVzLmRlZmluZU1ldGhvZCxcbiAgICAgICAgZ2V0RmllbGROYW1lczogdHlwZXMuZ2V0RmllbGROYW1lcyxcbiAgICAgICAgZ2V0RmllbGRWYWx1ZTogdHlwZXMuZ2V0RmllbGRWYWx1ZSxcbiAgICAgICAgZWFjaEZpZWxkOiB0eXBlcy5lYWNoRmllbGQsXG4gICAgICAgIHNvbWVGaWVsZDogdHlwZXMuc29tZUZpZWxkLFxuICAgICAgICBnZXRTdXBlcnR5cGVOYW1lczogdHlwZXMuZ2V0U3VwZXJ0eXBlTmFtZXMsXG4gICAgICAgIGdldEJ1aWxkZXJOYW1lOiB0eXBlcy5nZXRCdWlsZGVyTmFtZSxcbiAgICAgICAgYXN0Tm9kZXNBcmVFcXVpdmFsZW50OiBmb3JrLnVzZShlcXVpdl8xLmRlZmF1bHQpLFxuICAgICAgICBmaW5hbGl6ZTogdHlwZXMuZmluYWxpemUsXG4gICAgICAgIFBhdGg6IGZvcmsudXNlKHBhdGhfMS5kZWZhdWx0KSxcbiAgICAgICAgTm9kZVBhdGg6IGZvcmsudXNlKG5vZGVfcGF0aF8xLmRlZmF1bHQpLFxuICAgICAgICBQYXRoVmlzaXRvcjogUGF0aFZpc2l0b3IsXG4gICAgICAgIHVzZTogZm9yay51c2UsXG4gICAgICAgIHZpc2l0OiBQYXRoVmlzaXRvci52aXNpdCxcbiAgICB9O1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xuZnVuY3Rpb24gY3JlYXRlRm9yaygpIHtcbiAgICB2YXIgdXNlZCA9IFtdO1xuICAgIHZhciB1c2VkUmVzdWx0ID0gW107XG4gICAgZnVuY3Rpb24gdXNlKHBsdWdpbikge1xuICAgICAgICB2YXIgaWR4ID0gdXNlZC5pbmRleE9mKHBsdWdpbik7XG4gICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICBpZHggPSB1c2VkLmxlbmd0aDtcbiAgICAgICAgICAgIHVzZWQucHVzaChwbHVnaW4pO1xuICAgICAgICAgICAgdXNlZFJlc3VsdFtpZHhdID0gcGx1Z2luKGZvcmspO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1c2VkUmVzdWx0W2lkeF07XG4gICAgfVxuICAgIHZhciBmb3JrID0geyB1c2U6IHVzZSB9O1xuICAgIHJldHVybiBmb3JrO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5uYW1lZFR5cGVzID0gdm9pZCAwO1xudmFyIG5hbWVkVHlwZXM7XG4oZnVuY3Rpb24gKG5hbWVkVHlwZXMpIHtcbn0pKG5hbWVkVHlwZXMgPSBleHBvcnRzLm5hbWVkVHlwZXMgfHwgKGV4cG9ydHMubmFtZWRUeXBlcyA9IHt9KSk7XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdHlwZXNcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBnZXRGaWVsZE5hbWVzID0gdHlwZXMuZ2V0RmllbGROYW1lcztcbiAgICB2YXIgZ2V0RmllbGRWYWx1ZSA9IHR5cGVzLmdldEZpZWxkVmFsdWU7XG4gICAgdmFyIGlzQXJyYXkgPSB0eXBlcy5idWlsdEluVHlwZXMuYXJyYXk7XG4gICAgdmFyIGlzT2JqZWN0ID0gdHlwZXMuYnVpbHRJblR5cGVzLm9iamVjdDtcbiAgICB2YXIgaXNEYXRlID0gdHlwZXMuYnVpbHRJblR5cGVzLkRhdGU7XG4gICAgdmFyIGlzUmVnRXhwID0gdHlwZXMuYnVpbHRJblR5cGVzLlJlZ0V4cDtcbiAgICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgICBmdW5jdGlvbiBhc3ROb2Rlc0FyZUVxdWl2YWxlbnQoYSwgYiwgcHJvYmxlbVBhdGgpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkuY2hlY2socHJvYmxlbVBhdGgpKSB7XG4gICAgICAgICAgICBwcm9ibGVtUGF0aC5sZW5ndGggPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJvYmxlbVBhdGggPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmVFcXVpdmFsZW50KGEsIGIsIHByb2JsZW1QYXRoKTtcbiAgICB9XG4gICAgYXN0Tm9kZXNBcmVFcXVpdmFsZW50LmFzc2VydCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHZhciBwcm9ibGVtUGF0aCA9IFtdO1xuICAgICAgICBpZiAoIWFzdE5vZGVzQXJlRXF1aXZhbGVudChhLCBiLCBwcm9ibGVtUGF0aCkpIHtcbiAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoYSAhPT0gYikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVzIGRpZmZlciBpbiB0aGUgZm9sbG93aW5nIHBhdGg6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgcHJvYmxlbVBhdGgubWFwKHN1YnNjcmlwdEZvclByb3BlcnR5KS5qb2luKFwiXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgZnVuY3Rpb24gc3Vic2NyaXB0Rm9yUHJvcGVydHkocHJvcGVydHkpIHtcbiAgICAgICAgaWYgKC9bXyRhLXpdW18kYS16MC05XSovaS50ZXN0KHByb3BlcnR5KSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiLlwiICsgcHJvcGVydHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiW1wiICsgSlNPTi5zdHJpbmdpZnkocHJvcGVydHkpICsgXCJdXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFyZUVxdWl2YWxlbnQoYSwgYiwgcHJvYmxlbVBhdGgpIHtcbiAgICAgICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FycmF5LmNoZWNrKGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyYXlzQXJlRXF1aXZhbGVudChhLCBiLCBwcm9ibGVtUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT2JqZWN0LmNoZWNrKGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0c0FyZUVxdWl2YWxlbnQoYSwgYiwgcHJvYmxlbVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RhdGUuY2hlY2soYSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpc0RhdGUuY2hlY2soYikgJiYgKCthID09PSArYik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUmVnRXhwLmNoZWNrKGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNSZWdFeHAuY2hlY2soYikgJiYgKGEuc291cmNlID09PSBiLnNvdXJjZSAmJlxuICAgICAgICAgICAgICAgIGEuZ2xvYmFsID09PSBiLmdsb2JhbCAmJlxuICAgICAgICAgICAgICAgIGEubXVsdGlsaW5lID09PSBiLm11bHRpbGluZSAmJlxuICAgICAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYSA9PSBiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhcnJheXNBcmVFcXVpdmFsZW50KGEsIGIsIHByb2JsZW1QYXRoKSB7XG4gICAgICAgIGlzQXJyYXkuYXNzZXJ0KGEpO1xuICAgICAgICB2YXIgYUxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgICBpZiAoIWlzQXJyYXkuY2hlY2soYikgfHwgYi5sZW5ndGggIT09IGFMZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgICAgIHByb2JsZW1QYXRoLnB1c2goXCJsZW5ndGhcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhTGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgICAgIHByb2JsZW1QYXRoLnB1c2goaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSBpbiBhICE9PSBpIGluIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFyZUVxdWl2YWxlbnQoYVtpXSwgYltpXSwgcHJvYmxlbVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb2JsZW1QYXRoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb2JsZW1QYXRoVGFpbCA9IHByb2JsZW1QYXRoLnBvcCgpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aFRhaWwgIT09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIgKyBwcm9ibGVtUGF0aFRhaWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb2JqZWN0c0FyZUVxdWl2YWxlbnQoYSwgYiwgcHJvYmxlbVBhdGgpIHtcbiAgICAgICAgaXNPYmplY3QuYXNzZXJ0KGEpO1xuICAgICAgICBpZiAoIWlzT2JqZWN0LmNoZWNrKGIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFzdCBwYXRoIGZvciBhIGNvbW1vbiBwcm9wZXJ0eSBvZiBBU1Qgbm9kZXMuXG4gICAgICAgIGlmIChhLnR5cGUgIT09IGIudHlwZSkge1xuICAgICAgICAgICAgaWYgKHByb2JsZW1QYXRoKSB7XG4gICAgICAgICAgICAgICAgcHJvYmxlbVBhdGgucHVzaChcInR5cGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFOYW1lcyA9IGdldEZpZWxkTmFtZXMoYSk7XG4gICAgICAgIHZhciBhTmFtZUNvdW50ID0gYU5hbWVzLmxlbmd0aDtcbiAgICAgICAgdmFyIGJOYW1lcyA9IGdldEZpZWxkTmFtZXMoYik7XG4gICAgICAgIHZhciBiTmFtZUNvdW50ID0gYk5hbWVzLmxlbmd0aDtcbiAgICAgICAgaWYgKGFOYW1lQ291bnQgPT09IGJOYW1lQ291bnQpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYU5hbWVDb3VudDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBhTmFtZXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGFDaGlsZCA9IGdldEZpZWxkVmFsdWUoYSwgbmFtZSk7XG4gICAgICAgICAgICAgICAgdmFyIGJDaGlsZCA9IGdldEZpZWxkVmFsdWUoYiwgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHByb2JsZW1QYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2JsZW1QYXRoLnB1c2gobmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghYXJlRXF1aXZhbGVudChhQ2hpbGQsIGJDaGlsZCwgcHJvYmxlbVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb2JsZW1QYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9ibGVtUGF0aFRhaWwgPSBwcm9ibGVtUGF0aC5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2JsZW1QYXRoVGFpbCAhPT0gbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIgKyBwcm9ibGVtUGF0aFRhaWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmNlIGFOYW1lQ291bnQgIT09IGJOYW1lQ291bnQsIHdlIG5lZWQgdG8gZmluZCBzb21lIG5hbWUgdGhhdCdzXG4gICAgICAgIC8vIG1pc3NpbmcgaW4gYU5hbWVzIGJ1dCBwcmVzZW50IGluIGJOYW1lcywgb3IgdmljZS12ZXJzYS5cbiAgICAgICAgdmFyIHNlZW5OYW1lcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhTmFtZUNvdW50OyArK2kpIHtcbiAgICAgICAgICAgIHNlZW5OYW1lc1thTmFtZXNbaV1dID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYk5hbWVDb3VudDsgKytpKSB7XG4gICAgICAgICAgICBuYW1lID0gYk5hbWVzW2ldO1xuICAgICAgICAgICAgaWYgKCFoYXNPd24uY2FsbChzZWVuTmFtZXMsIG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcHJvYmxlbVBhdGgucHVzaChuYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgc2Vlbk5hbWVzW25hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobmFtZSBpbiBzZWVuTmFtZXMpIHtcbiAgICAgICAgICAgIHByb2JsZW1QYXRoLnB1c2gobmFtZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBhc3ROb2Rlc0FyZUVxdWl2YWxlbnQ7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3R5cGVzXCIpKTtcbnZhciBwYXRoXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXRoXCIpKTtcbnZhciBzY29wZV8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vc2NvcGVcIikpO1xuZnVuY3Rpb24gbm9kZVBhdGhQbHVnaW4oZm9yaykge1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIG4gPSB0eXBlcy5uYW1lZFR5cGVzO1xuICAgIHZhciBiID0gdHlwZXMuYnVpbGRlcnM7XG4gICAgdmFyIGlzTnVtYmVyID0gdHlwZXMuYnVpbHRJblR5cGVzLm51bWJlcjtcbiAgICB2YXIgaXNBcnJheSA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5hcnJheTtcbiAgICB2YXIgUGF0aCA9IGZvcmsudXNlKHBhdGhfMS5kZWZhdWx0KTtcbiAgICB2YXIgU2NvcGUgPSBmb3JrLnVzZShzY29wZV8xLmRlZmF1bHQpO1xuICAgIHZhciBOb2RlUGF0aCA9IGZ1bmN0aW9uIE5vZGVQYXRoKHZhbHVlLCBwYXJlbnRQYXRoLCBuYW1lKSB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVQYXRoIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBpbnZva2VkIHdpdGhvdXQgJ25ldydcIik7XG4gICAgICAgIH1cbiAgICAgICAgUGF0aC5jYWxsKHRoaXMsIHZhbHVlLCBwYXJlbnRQYXRoLCBuYW1lKTtcbiAgICB9O1xuICAgIHZhciBOUHAgPSBOb2RlUGF0aC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFBhdGgucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgICB2YWx1ZTogTm9kZVBhdGgsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhOUHAsIHtcbiAgICAgICAgbm9kZToge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibm9kZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2NvbXB1dGVOb2RlKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInBhcmVudFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2NvbXB1dGVQYXJlbnQoKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2NvcGU6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNjb3BlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5fY29tcHV0ZVNjb3BlKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY29wZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIE5QcC5yZXBsYWNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBkZWxldGUgdGhpcy5ub2RlO1xuICAgICAgICBkZWxldGUgdGhpcy5wYXJlbnQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNjb3BlO1xuICAgICAgICByZXR1cm4gUGF0aC5wcm90b3R5cGUucmVwbGFjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgTlBwLnBydW5lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVtYWluaW5nTm9kZVBhdGggPSB0aGlzLnBhcmVudDtcbiAgICAgICAgdGhpcy5yZXBsYWNlKCk7XG4gICAgICAgIHJldHVybiBjbGVhblVwTm9kZXNBZnRlclBydW5lKHJlbWFpbmluZ05vZGVQYXRoKTtcbiAgICB9O1xuICAgIC8vIFRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgYW5jZXN0b3IgUGF0aCB3aG9zZSB2YWx1ZSBpcyBhIE5vZGUuXG4gICAgTlBwLl9jb21wdXRlTm9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKG4uTm9kZS5jaGVjayh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHAgPSB0aGlzLnBhcmVudFBhdGg7XG4gICAgICAgIHJldHVybiBwcCAmJiBwcC5ub2RlIHx8IG51bGw7XG4gICAgfTtcbiAgICAvLyBUaGUgZmlyc3QgYW5jZXN0b3IgUGF0aCB3aG9zZSB2YWx1ZSBpcyBhIE5vZGUgZGlzdGluY3QgZnJvbSB0aGlzLm5vZGUuXG4gICAgTlBwLl9jb21wdXRlUGFyZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICB2YXIgcHAgPSB0aGlzLnBhcmVudFBhdGg7XG4gICAgICAgIGlmICghbi5Ob2RlLmNoZWNrKHZhbHVlKSkge1xuICAgICAgICAgICAgd2hpbGUgKHBwICYmICFuLk5vZGUuY2hlY2socHAudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcHAgPSBwcC5wYXJlbnRQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBwKSB7XG4gICAgICAgICAgICAgICAgcHAgPSBwcC5wYXJlbnRQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChwcCAmJiAhbi5Ob2RlLmNoZWNrKHBwLnZhbHVlKSkge1xuICAgICAgICAgICAgcHAgPSBwcC5wYXJlbnRQYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcCB8fCBudWxsO1xuICAgIH07XG4gICAgLy8gVGhlIGNsb3Nlc3QgZW5jbG9zaW5nIHNjb3BlIHRoYXQgZ292ZXJucyB0aGlzIG5vZGUuXG4gICAgTlBwLl9jb21wdXRlU2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIHZhciBwcCA9IHRoaXMucGFyZW50UGF0aDtcbiAgICAgICAgdmFyIHNjb3BlID0gcHAgJiYgcHAuc2NvcGU7XG4gICAgICAgIGlmIChuLk5vZGUuY2hlY2sodmFsdWUpICYmXG4gICAgICAgICAgICBTY29wZS5pc0VzdGFibGlzaGVkQnkodmFsdWUpKSB7XG4gICAgICAgICAgICBzY29wZSA9IG5ldyBTY29wZSh0aGlzLCBzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjb3BlIHx8IG51bGw7XG4gICAgfTtcbiAgICBOUHAuZ2V0VmFsdWVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0eXBlcy5nZXRGaWVsZFZhbHVlKHRoaXMudmFsdWUsIG5hbWUpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcy5ub2RlIG5lZWRzIHRvIGJlIHdyYXBwZWQgaW4gcGFyZW50aGVzZXMgaW4gb3JkZXJcbiAgICAgKiBmb3IgYSBwYXJzZXIgdG8gcmVwcm9kdWNlIHRoZSBzYW1lIGxvY2FsIEFTVCBzdHJ1Y3R1cmUuXG4gICAgICpcbiAgICAgKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBleHByZXNzaW9uIGAoMSArIDIpICogM2AsIHRoZSBCaW5hcnlFeHByZXNzaW9uXG4gICAgICogd2hvc2Ugb3BlcmF0b3IgaXMgXCIrXCIgbmVlZHMgcGFyZW50aGVzZXMsIGJlY2F1c2UgYDEgKyAyICogM2Agd291bGRcbiAgICAgKiBwYXJzZSBkaWZmZXJlbnRseS5cbiAgICAgKlxuICAgICAqIElmIGFzc3VtZUV4cHJlc3Npb25Db250ZXh0ID09PSB0cnVlLCB3ZSBkb24ndCB3b3JyeSBhYm91dCBlZGdlIGNhc2VzXG4gICAgICogbGlrZSBhbiBhbm9ueW1vdXMgRnVuY3Rpb25FeHByZXNzaW9uIGFwcGVhcmluZyBsZXhpY2FsbHkgZmlyc3QgaW4gaXRzXG4gICAgICogZW5jbG9zaW5nIHN0YXRlbWVudCBhbmQgdGh1cyBuZWVkaW5nIHBhcmVudGhlc2VzIHRvIGF2b2lkIGJlaW5nIHBhcnNlZFxuICAgICAqIGFzIGEgRnVuY3Rpb25EZWNsYXJhdGlvbiB3aXRoIGEgbWlzc2luZyBuYW1lLlxuICAgICAqL1xuICAgIE5QcC5uZWVkc1BhcmVucyA9IGZ1bmN0aW9uIChhc3N1bWVFeHByZXNzaW9uQ29udGV4dCkge1xuICAgICAgICB2YXIgcHAgPSB0aGlzLnBhcmVudFBhdGg7XG4gICAgICAgIGlmICghcHApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbm9kZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIC8vIE9ubHkgZXhwcmVzc2lvbnMgbmVlZCBwYXJlbnRoZXNlcy5cbiAgICAgICAgaWYgKCFuLkV4cHJlc3Npb24uY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZGVudGlmaWVycyBuZXZlciBuZWVkIHBhcmVudGhlc2VzLlxuICAgICAgICBpZiAobm9kZS50eXBlID09PSBcIklkZW50aWZpZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICghbi5Ob2RlLmNoZWNrKHBwLnZhbHVlKSkge1xuICAgICAgICAgICAgcHAgPSBwcC5wYXJlbnRQYXRoO1xuICAgICAgICAgICAgaWYgKCFwcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50ID0gcHAudmFsdWU7XG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwiU3ByZWFkRWxlbWVudFwiOlxuICAgICAgICAgICAgY2FzZSBcIlNwcmVhZFByb3BlcnR5XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIlxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5hbWUgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgcGFyZW50Lm9iamVjdCA9PT0gbm9kZTtcbiAgICAgICAgICAgIGNhc2UgXCJCaW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwiTG9naWNhbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA9PT0gXCJjYWxsZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBhcmVudC5jYWxsZWUgPT09IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNwcmVhZFByb3BlcnR5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWUgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXJlbnQub2JqZWN0ID09PSBub2RlO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQmluYXJ5RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTG9naWNhbEV4cHJlc3Npb25cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5fMSA9IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG8gPSBwYXJlbnQub3BlcmF0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHBfMSA9IFBSRUNFREVOQ0VbcG9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vID0gbl8xLm9wZXJhdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5wID0gUFJFQ0VERU5DRVtub107XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHBfMSA+IG5wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHBfMSA9PT0gbnAgJiYgdGhpcy5uYW1lID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50LnJpZ2h0ICE9PSBuXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZXMgbXVzdCBiZSBlcXVhbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiU2VxdWVuY2VFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiRm9yU3RhdGVtZW50XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHRob3VnaCBwYXJlbnRoZXNlcyB3b3VsZG4ndCBodXJ0IGFyb3VuZCBzZXF1ZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwcmVzc2lvbnMgaW4gdGhlIGhlYWQgb2YgZm9yIGxvb3BzLCB0cmFkaXRpb25hbCBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGljdGF0ZXMgdGhhdCBlLmcuIGkrKywgaisrIHNob3VsZCBub3QgYmUgd3JhcHBlZCB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnRoZXNlcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWUgIT09IFwiZXhwcmVzc2lvblwiO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGVyciBvbiB0aGUgc2lkZSBvZiBvdmVycGFyZW50aGVzaXphdGlvbiwgYWRkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBleGNlcHRpb25zIGFib3ZlIGlmIHRoaXMgcHJvdmVzIG92ZXJ6ZWFsb3VzLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcIllpZWxkRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkJpbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNwcmVhZFByb3BlcnR5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTWVtYmVyRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiTmV3RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQ29uZGl0aW9uYWxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJZaWVsZEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJMaXRlcmFsXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC50eXBlID09PSBcIk1lbWJlckV4cHJlc3Npb25cIlxuICAgICAgICAgICAgICAgICAgICAmJiBpc051bWJlci5jaGVjayhub2RlLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5hbWUgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgJiYgcGFyZW50Lm9iamVjdCA9PT0gbm9kZTtcbiAgICAgICAgICAgIGNhc2UgXCJBc3NpZ25tZW50RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgY2FzZSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlVuYXJ5RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiU3ByZWFkRWxlbWVudFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiU3ByZWFkUHJvcGVydHlcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkJpbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNhbGxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lID09PSBcImNhbGxlZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGFyZW50LmNhbGxlZSA9PT0gbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA9PT0gXCJ0ZXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXJlbnQudGVzdCA9PT0gbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWUgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXJlbnQub2JqZWN0ID09PSBub2RlO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSBcIk5ld0V4cHJlc3Npb25cIiAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPT09IFwiY2FsbGVlXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmNhbGxlZSA9PT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNDYWxsRXhwcmVzc2lvbihub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzc3VtZUV4cHJlc3Npb25Db250ZXh0ICE9PSB0cnVlICYmXG4gICAgICAgICAgICAhdGhpcy5jYW5CZUZpcnN0SW5TdGF0ZW1lbnQoKSAmJlxuICAgICAgICAgICAgdGhpcy5maXJzdEluU3RhdGVtZW50KCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgZnVuY3Rpb24gaXNCaW5hcnkobm9kZSkge1xuICAgICAgICByZXR1cm4gbi5CaW5hcnlFeHByZXNzaW9uLmNoZWNrKG5vZGUpXG4gICAgICAgICAgICB8fCBuLkxvZ2ljYWxFeHByZXNzaW9uLmNoZWNrKG5vZGUpO1xuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlICdpc1VuYXJ5TGlrZScgaXMgZGVjbGFyZWQgYnV0IGl0cyB2YWx1ZSBpcyBuZXZlciByZWFkLiBbNjEzM11cbiAgICBmdW5jdGlvbiBpc1VuYXJ5TGlrZShub2RlKSB7XG4gICAgICAgIHJldHVybiBuLlVuYXJ5RXhwcmVzc2lvbi5jaGVjayhub2RlKVxuICAgICAgICAgICAgLy8gSSBjb25zaWRlcmVkIG1ha2luZyBTcHJlYWRFbGVtZW50IGFuZCBTcHJlYWRQcm9wZXJ0eSBzdWJ0eXBlc1xuICAgICAgICAgICAgLy8gb2YgVW5hcnlFeHByZXNzaW9uLCBidXQgdGhleSdyZSBub3QgcmVhbGx5IEV4cHJlc3Npb24gbm9kZXMuXG4gICAgICAgICAgICB8fCAobi5TcHJlYWRFbGVtZW50ICYmIG4uU3ByZWFkRWxlbWVudC5jaGVjayhub2RlKSlcbiAgICAgICAgICAgIHx8IChuLlNwcmVhZFByb3BlcnR5ICYmIG4uU3ByZWFkUHJvcGVydHkuY2hlY2sobm9kZSkpO1xuICAgIH1cbiAgICB2YXIgUFJFQ0VERU5DRSA9IHt9O1xuICAgIFtbXCJ8fFwiXSxcbiAgICAgICAgW1wiJiZcIl0sXG4gICAgICAgIFtcInxcIl0sXG4gICAgICAgIFtcIl5cIl0sXG4gICAgICAgIFtcIiZcIl0sXG4gICAgICAgIFtcIj09XCIsIFwiPT09XCIsIFwiIT1cIiwgXCIhPT1cIl0sXG4gICAgICAgIFtcIjxcIiwgXCI+XCIsIFwiPD1cIiwgXCI+PVwiLCBcImluXCIsIFwiaW5zdGFuY2VvZlwiXSxcbiAgICAgICAgW1wiPj5cIiwgXCI8PFwiLCBcIj4+PlwiXSxcbiAgICAgICAgW1wiK1wiLCBcIi1cIl0sXG4gICAgICAgIFtcIipcIiwgXCIvXCIsIFwiJVwiXVxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAodGllciwgaSkge1xuICAgICAgICB0aWVyLmZvckVhY2goZnVuY3Rpb24gKG9wKSB7XG4gICAgICAgICAgICBQUkVDRURFTkNFW29wXSA9IGk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGNvbnRhaW5zQ2FsbEV4cHJlc3Npb24obm9kZSkge1xuICAgICAgICBpZiAobi5DYWxsRXhwcmVzc2lvbi5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQXJyYXkuY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLnNvbWUoY29udGFpbnNDYWxsRXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4uTm9kZS5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVzLnNvbWVGaWVsZChub2RlLCBmdW5jdGlvbiAoX25hbWUsIGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zQ2FsbEV4cHJlc3Npb24oY2hpbGQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBOUHAuY2FuQmVGaXJzdEluU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZTtcbiAgICAgICAgcmV0dXJuICFuLkZ1bmN0aW9uRXhwcmVzc2lvbi5jaGVjayhub2RlKVxuICAgICAgICAgICAgJiYgIW4uT2JqZWN0RXhwcmVzc2lvbi5jaGVjayhub2RlKTtcbiAgICB9O1xuICAgIE5QcC5maXJzdEluU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZmlyc3RJblN0YXRlbWVudCh0aGlzKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGZpcnN0SW5TdGF0ZW1lbnQocGF0aCkge1xuICAgICAgICBmb3IgKHZhciBub2RlLCBwYXJlbnQ7IHBhdGgucGFyZW50OyBwYXRoID0gcGF0aC5wYXJlbnQpIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXRoLm5vZGU7XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXRoLnBhcmVudC5ub2RlO1xuICAgICAgICAgICAgaWYgKG4uQmxvY2tTdGF0ZW1lbnQuY2hlY2socGFyZW50KSAmJlxuICAgICAgICAgICAgICAgIHBhdGgucGFyZW50Lm5hbWUgPT09IFwiYm9keVwiICYmXG4gICAgICAgICAgICAgICAgcGF0aC5uYW1lID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5ib2R5WzBdICE9PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVzIG11c3QgYmUgZXF1YWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG4uRXhwcmVzc2lvblN0YXRlbWVudC5jaGVjayhwYXJlbnQpICYmXG4gICAgICAgICAgICAgICAgcGF0aC5uYW1lID09PSBcImV4cHJlc3Npb25cIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuZXhwcmVzc2lvbiAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLlNlcXVlbmNlRXhwcmVzc2lvbi5jaGVjayhwYXJlbnQpICYmXG4gICAgICAgICAgICAgICAgcGF0aC5wYXJlbnQubmFtZSA9PT0gXCJleHByZXNzaW9uc1wiICYmXG4gICAgICAgICAgICAgICAgcGF0aC5uYW1lID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5leHByZXNzaW9uc1swXSAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLkNhbGxFeHByZXNzaW9uLmNoZWNrKHBhcmVudCkgJiZcbiAgICAgICAgICAgICAgICBwYXRoLm5hbWUgPT09IFwiY2FsbGVlXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNhbGxlZSAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLk1lbWJlckV4cHJlc3Npb24uY2hlY2socGFyZW50KSAmJlxuICAgICAgICAgICAgICAgIHBhdGgubmFtZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQub2JqZWN0ICE9PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVzIG11c3QgYmUgZXF1YWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG4uQ29uZGl0aW9uYWxFeHByZXNzaW9uLmNoZWNrKHBhcmVudCkgJiZcbiAgICAgICAgICAgICAgICBwYXRoLm5hbWUgPT09IFwidGVzdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC50ZXN0ICE9PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVzIG11c3QgYmUgZXF1YWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQmluYXJ5KHBhcmVudCkgJiZcbiAgICAgICAgICAgICAgICBwYXRoLm5hbWUgPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5sZWZ0ICE9PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVzIG11c3QgYmUgZXF1YWxcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG4uVW5hcnlFeHByZXNzaW9uLmNoZWNrKHBhcmVudCkgJiZcbiAgICAgICAgICAgICAgICAhcGFyZW50LnByZWZpeCAmJlxuICAgICAgICAgICAgICAgIHBhdGgubmFtZSA9PT0gXCJhcmd1bWVudFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5hcmd1bWVudCAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJ1bmluZyBjZXJ0YWluIG5vZGVzIHdpbGwgcmVzdWx0IGluIGVtcHR5IG9yIGluY29tcGxldGUgbm9kZXMsIGhlcmUgd2UgY2xlYW4gdGhvc2Ugbm9kZXMgdXAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xlYW5VcE5vZGVzQWZ0ZXJQcnVuZShyZW1haW5pbmdOb2RlUGF0aCkge1xuICAgICAgICBpZiAobi5WYXJpYWJsZURlY2xhcmF0aW9uLmNoZWNrKHJlbWFpbmluZ05vZGVQYXRoLm5vZGUpKSB7XG4gICAgICAgICAgICB2YXIgZGVjbGFyYXRpb25zID0gcmVtYWluaW5nTm9kZVBhdGguZ2V0KCdkZWNsYXJhdGlvbnMnKS52YWx1ZTtcbiAgICAgICAgICAgIGlmICghZGVjbGFyYXRpb25zIHx8IGRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVtYWluaW5nTm9kZVBhdGgucHJ1bmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuLkV4cHJlc3Npb25TdGF0ZW1lbnQuY2hlY2socmVtYWluaW5nTm9kZVBhdGgubm9kZSkpIHtcbiAgICAgICAgICAgIGlmICghcmVtYWluaW5nTm9kZVBhdGguZ2V0KCdleHByZXNzaW9uJykudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVtYWluaW5nTm9kZVBhdGgucHJ1bmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuLklmU3RhdGVtZW50LmNoZWNrKHJlbWFpbmluZ05vZGVQYXRoLm5vZGUpKSB7XG4gICAgICAgICAgICBjbGVhblVwSWZTdGF0ZW1lbnRBZnRlclBydW5lKHJlbWFpbmluZ05vZGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVtYWluaW5nTm9kZVBhdGg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsZWFuVXBJZlN0YXRlbWVudEFmdGVyUHJ1bmUoaWZTdGF0ZW1lbnQpIHtcbiAgICAgICAgdmFyIHRlc3RFeHByZXNzaW9uID0gaWZTdGF0ZW1lbnQuZ2V0KCd0ZXN0JykudmFsdWU7XG4gICAgICAgIHZhciBhbHRlcm5hdGUgPSBpZlN0YXRlbWVudC5nZXQoJ2FsdGVybmF0ZScpLnZhbHVlO1xuICAgICAgICB2YXIgY29uc2VxdWVudCA9IGlmU3RhdGVtZW50LmdldCgnY29uc2VxdWVudCcpLnZhbHVlO1xuICAgICAgICBpZiAoIWNvbnNlcXVlbnQgJiYgIWFsdGVybmF0ZSkge1xuICAgICAgICAgICAgdmFyIHRlc3RFeHByZXNzaW9uU3RhdGVtZW50ID0gYi5leHByZXNzaW9uU3RhdGVtZW50KHRlc3RFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIGlmU3RhdGVtZW50LnJlcGxhY2UodGVzdEV4cHJlc3Npb25TdGF0ZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFjb25zZXF1ZW50ICYmIGFsdGVybmF0ZSkge1xuICAgICAgICAgICAgdmFyIG5lZ2F0ZWRUZXN0RXhwcmVzc2lvbiA9IGIudW5hcnlFeHByZXNzaW9uKCchJywgdGVzdEV4cHJlc3Npb24sIHRydWUpO1xuICAgICAgICAgICAgaWYgKG4uVW5hcnlFeHByZXNzaW9uLmNoZWNrKHRlc3RFeHByZXNzaW9uKSAmJiB0ZXN0RXhwcmVzc2lvbi5vcGVyYXRvciA9PT0gJyEnKSB7XG4gICAgICAgICAgICAgICAgbmVnYXRlZFRlc3RFeHByZXNzaW9uID0gdGVzdEV4cHJlc3Npb24uYXJndW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZlN0YXRlbWVudC5nZXQoXCJ0ZXN0XCIpLnJlcGxhY2UobmVnYXRlZFRlc3RFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIGlmU3RhdGVtZW50LmdldChcImNvbnNlcXVlbnRcIikucmVwbGFjZShhbHRlcm5hdGUpO1xuICAgICAgICAgICAgaWZTdGF0ZW1lbnQuZ2V0KFwiYWx0ZXJuYXRlXCIpLnJlcGxhY2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTm9kZVBhdGg7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBub2RlUGF0aFBsdWdpbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdHlwZXNcIikpO1xudmFyIG5vZGVfcGF0aF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbm9kZS1wYXRoXCIpKTtcbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuZnVuY3Rpb24gcGF0aFZpc2l0b3JQbHVnaW4oZm9yaykge1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIE5vZGVQYXRoID0gZm9yay51c2Uobm9kZV9wYXRoXzEuZGVmYXVsdCk7XG4gICAgdmFyIGlzQXJyYXkgPSB0eXBlcy5idWlsdEluVHlwZXMuYXJyYXk7XG4gICAgdmFyIGlzT2JqZWN0ID0gdHlwZXMuYnVpbHRJblR5cGVzLm9iamVjdDtcbiAgICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5mdW5jdGlvbjtcbiAgICB2YXIgdW5kZWZpbmVkO1xuICAgIHZhciBQYXRoVmlzaXRvciA9IGZ1bmN0aW9uIFBhdGhWaXNpdG9yKCkge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGF0aFZpc2l0b3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoVmlzaXRvciBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgaW52b2tlZCB3aXRob3V0ICduZXcnXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBlcm1hbmVudCBzdGF0ZS5cbiAgICAgICAgdGhpcy5fcmV1c2FibGVDb250ZXh0U3RhY2sgPSBbXTtcbiAgICAgICAgdGhpcy5fbWV0aG9kTmFtZVRhYmxlID0gY29tcHV0ZU1ldGhvZE5hbWVUYWJsZSh0aGlzKTtcbiAgICAgICAgdGhpcy5fc2hvdWxkVmlzaXRDb21tZW50cyA9XG4gICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLl9tZXRob2ROYW1lVGFibGUsIFwiQmxvY2tcIikgfHxcbiAgICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLl9tZXRob2ROYW1lVGFibGUsIFwiTGluZVwiKTtcbiAgICAgICAgdGhpcy5Db250ZXh0ID0gbWFrZUNvbnRleHRDb25zdHJ1Y3Rvcih0aGlzKTtcbiAgICAgICAgLy8gU3RhdGUgcmVzZXQgZXZlcnkgdGltZSBQYXRoVmlzaXRvci5wcm90b3R5cGUudmlzaXQgaXMgY2FsbGVkLlxuICAgICAgICB0aGlzLl92aXNpdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jaGFuZ2VSZXBvcnRlZCA9IGZhbHNlO1xuICAgIH07XG4gICAgZnVuY3Rpb24gY29tcHV0ZU1ldGhvZE5hbWVUYWJsZSh2aXNpdG9yKSB7XG4gICAgICAgIHZhciB0eXBlTmFtZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKHZhciBtZXRob2ROYW1lIGluIHZpc2l0b3IpIHtcbiAgICAgICAgICAgIGlmICgvXnZpc2l0W0EtWl0vLnRlc3QobWV0aG9kTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0eXBlTmFtZXNbbWV0aG9kTmFtZS5zbGljZShcInZpc2l0XCIubGVuZ3RoKV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBzdXBlcnR5cGVUYWJsZSA9IHR5cGVzLmNvbXB1dGVTdXBlcnR5cGVMb29rdXBUYWJsZSh0eXBlTmFtZXMpO1xuICAgICAgICB2YXIgbWV0aG9kTmFtZVRhYmxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdmFyIHR5cGVOYW1lS2V5cyA9IE9iamVjdC5rZXlzKHN1cGVydHlwZVRhYmxlKTtcbiAgICAgICAgdmFyIHR5cGVOYW1lQ291bnQgPSB0eXBlTmFtZUtleXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVOYW1lQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgdmFyIHR5cGVOYW1lID0gdHlwZU5hbWVLZXlzW2ldO1xuICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFwidmlzaXRcIiArIHN1cGVydHlwZVRhYmxlW3R5cGVOYW1lXTtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uLmNoZWNrKHZpc2l0b3JbbWV0aG9kTmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kTmFtZVRhYmxlW3R5cGVOYW1lXSA9IG1ldGhvZE5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWVUYWJsZTtcbiAgICB9XG4gICAgUGF0aFZpc2l0b3IuZnJvbU1ldGhvZHNPYmplY3QgPSBmdW5jdGlvbiBmcm9tTWV0aG9kc09iamVjdChtZXRob2RzKSB7XG4gICAgICAgIGlmIChtZXRob2RzIGluc3RhbmNlb2YgUGF0aFZpc2l0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBtZXRob2RzO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNPYmplY3QuY2hlY2sobWV0aG9kcykpIHtcbiAgICAgICAgICAgIC8vIEFuIGVtcHR5IHZpc2l0b3I/XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhdGhWaXNpdG9yO1xuICAgICAgICB9XG4gICAgICAgIHZhciBWaXNpdG9yID0gZnVuY3Rpb24gVmlzaXRvcigpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBWaXNpdG9yKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlZpc2l0b3IgY29uc3RydWN0b3IgY2Fubm90IGJlIGludm9rZWQgd2l0aG91dCAnbmV3J1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFBhdGhWaXNpdG9yLmNhbGwodGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBWcCA9IFZpc2l0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShQVnApO1xuICAgICAgICBWcC5jb25zdHJ1Y3RvciA9IFZpc2l0b3I7XG4gICAgICAgIGV4dGVuZChWcCwgbWV0aG9kcyk7XG4gICAgICAgIGV4dGVuZChWaXNpdG9yLCBQYXRoVmlzaXRvcik7XG4gICAgICAgIGlzRnVuY3Rpb24uYXNzZXJ0KFZpc2l0b3IuZnJvbU1ldGhvZHNPYmplY3QpO1xuICAgICAgICBpc0Z1bmN0aW9uLmFzc2VydChWaXNpdG9yLnZpc2l0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBWaXNpdG9yO1xuICAgIH07XG4gICAgZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG4gICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKHNvdXJjZSwgcHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BlcnR5XSA9IHNvdXJjZVtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgUGF0aFZpc2l0b3IudmlzaXQgPSBmdW5jdGlvbiB2aXNpdChub2RlLCBtZXRob2RzKSB7XG4gICAgICAgIHJldHVybiBQYXRoVmlzaXRvci5mcm9tTWV0aG9kc09iamVjdChtZXRob2RzKS52aXNpdChub2RlKTtcbiAgICB9O1xuICAgIHZhciBQVnAgPSBQYXRoVmlzaXRvci5wcm90b3R5cGU7XG4gICAgUFZwLnZpc2l0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fdmlzaXRpbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlY3Vyc2l2ZWx5IGNhbGxpbmcgdmlzaXRvci52aXNpdChwYXRoKSByZXNldHMgdmlzaXRvciBzdGF0ZS4gXCIgK1xuICAgICAgICAgICAgICAgIFwiVHJ5IHRoaXMudmlzaXQocGF0aCkgb3IgdGhpcy50cmF2ZXJzZShwYXRoKSBpbnN0ZWFkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcml2YXRlIHN0YXRlIHRoYXQgbmVlZHMgdG8gYmUgcmVzZXQgYmVmb3JlIGV2ZXJ5IHRyYXZlcnNhbC5cbiAgICAgICAgdGhpcy5fdmlzaXRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jaGFuZ2VSZXBvcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9hYm9ydFJlcXVlc3RlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgYXJnYyA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ2MpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ2M7ICsraSkge1xuICAgICAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShhcmdzWzBdIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICBhcmdzWzBdID0gbmV3IE5vZGVQYXRoKHsgcm9vdDogYXJnc1swXSB9KS5nZXQoXCJyb290XCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENhbGxlZCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyAudmlzaXQuXG4gICAgICAgIHRoaXMucmVzZXQuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIHZhciBkaWROb3RUaHJvdztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciByb290ID0gdGhpcy52aXNpdFdpdGhvdXRSZXNldChhcmdzWzBdKTtcbiAgICAgICAgICAgIGRpZE5vdFRocm93ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX3Zpc2l0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIWRpZE5vdFRocm93ICYmIHRoaXMuX2Fib3J0UmVxdWVzdGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcy52aXNpdFdpdGhvdXRSZXNldCB0aHJldyBhbiBleGNlcHRpb24gYW5kXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5fYWJvcnRSZXF1ZXN0ZWQgd2FzIHNldCB0byB0cnVlLCByZXR1cm4gdGhlIHJvb3Qgb2ZcbiAgICAgICAgICAgICAgICAvLyB0aGUgQVNUIGluc3RlYWQgb2YgbGV0dGluZyB0aGUgZXhjZXB0aW9uIHByb3BhZ2F0ZSwgc28gdGhhdFxuICAgICAgICAgICAgICAgIC8vIGNsaWVudCBjb2RlIGRvZXMgbm90IGhhdmUgdG8gcHJvdmlkZSBhIHRyeS1jYXRjaCBibG9jayB0b1xuICAgICAgICAgICAgICAgIC8vIGludGVyY2VwdCB0aGUgQWJvcnRSZXF1ZXN0IGV4Y2VwdGlvbi4gIE90aGVyIGtpbmRzIG9mXG4gICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9ucyB3aWxsIHByb3BhZ2F0ZSB3aXRob3V0IGJlaW5nIGludGVyY2VwdGVkIGFuZFxuICAgICAgICAgICAgICAgIC8vIHJldGhyb3duIGJ5IGEgY2F0Y2ggYmxvY2ssIHNvIHRoZWlyIHN0YWNrcyB3aWxsIGFjY3VyYXRlbHlcbiAgICAgICAgICAgICAgICAvLyByZWZsZWN0IHRoZSBvcmlnaW5hbCB0aHJvd2luZyBjb250ZXh0LlxuICAgICAgICAgICAgICAgIHJldHVybiBhcmdzWzBdLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH07XG4gICAgUFZwLkFib3J0UmVxdWVzdCA9IGZ1bmN0aW9uIEFib3J0UmVxdWVzdCgpIHsgfTtcbiAgICBQVnAuYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2aXNpdG9yID0gdGhpcztcbiAgICAgICAgdmlzaXRvci5fYWJvcnRSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyB2aXNpdG9yLkFib3J0UmVxdWVzdCgpO1xuICAgICAgICAvLyBJZiB5b3UgZGVjaWRlIHRvIGNhdGNoIHRoaXMgZXhjZXB0aW9uIGFuZCBzdG9wIGl0IGZyb20gcHJvcGFnYXRpbmcsXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0byBjYWxsIGl0cyBjYW5jZWwgbWV0aG9kIHRvIGF2b2lkIHNpbGVuY2luZyBvdGhlclxuICAgICAgICAvLyBleGNlcHRpb25zIHRoYXQgbWlnaHQgYmUgdGhyb3duIGxhdGVyIGluIHRoZSB0cmF2ZXJzYWwuXG4gICAgICAgIHJlcXVlc3QuY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmlzaXRvci5fYWJvcnRSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhyb3cgcmVxdWVzdDtcbiAgICB9O1xuICAgIFBWcC5yZXNldCA9IGZ1bmN0aW9uIChfcGF0aCAvKiwgYWRkaXRpb25hbCBhcmd1bWVudHMgKi8pIHtcbiAgICAgICAgLy8gRW1wdHkgc3R1YjsgbWF5IGJlIHJlYXNzaWduZWQgb3Igb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLlxuICAgIH07XG4gICAgUFZwLnZpc2l0V2l0aG91dFJlc2V0ID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiB0aGlzLkNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMuQ29udGV4dC5wcm90b3R5cGUgPT09IHRoaXMsIHRoZXJlJ3MgYSBjaGFuY2Ugd2VcbiAgICAgICAgICAgIC8vIG1pZ2h0IGFjY2lkZW50YWxseSBjYWxsIGNvbnRleHQudmlzaXRXaXRob3V0UmVzZXQuIElmIHRoYXRcbiAgICAgICAgICAgIC8vIGhhcHBlbnMsIHJlLWludm9rZSB0aGUgbWV0aG9kIGFnYWluc3QgY29udGV4dC52aXNpdG9yLlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRvci52aXNpdFdpdGhvdXRSZXNldChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShwYXRoIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlID0gcGF0aC52YWx1ZTtcbiAgICAgICAgdmFyIG1ldGhvZE5hbWUgPSB2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUudHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgdGhpcy5fbWV0aG9kTmFtZVRhYmxlW3ZhbHVlLnR5cGVdO1xuICAgICAgICBpZiAobWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLmFjcXVpcmVDb250ZXh0KHBhdGgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5pbnZva2VWaXNpdG9yTWV0aG9kKG1ldGhvZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxlYXNlQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBubyB2aXNpdG9yIG1ldGhvZCB0byBjYWxsLCB2aXNpdCB0aGUgY2hpbGRyZW4gb2ZcbiAgICAgICAgICAgIC8vIHRoaXMgbm9kZSBnZW5lcmljYWxseS5cbiAgICAgICAgICAgIHJldHVybiB2aXNpdENoaWxkcmVuKHBhdGgsIHRoaXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBmdW5jdGlvbiB2aXNpdENoaWxkcmVuKHBhdGgsIHZpc2l0b3IpIHtcbiAgICAgICAgaWYgKCEocGF0aCBpbnN0YW5jZW9mIE5vZGVQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHZpc2l0b3IgaW5zdGFuY2VvZiBQYXRoVmlzaXRvcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdmFsdWUgPSBwYXRoLnZhbHVlO1xuICAgICAgICBpZiAoaXNBcnJheS5jaGVjayh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHBhdGguZWFjaCh2aXNpdG9yLnZpc2l0V2l0aG91dFJlc2V0LCB2aXNpdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaXNPYmplY3QuY2hlY2sodmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBObyBjaGlsZHJlbiB0byB2aXNpdC5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBjaGlsZE5hbWVzID0gdHlwZXMuZ2V0RmllbGROYW1lcyh2YWx1ZSk7XG4gICAgICAgICAgICAvLyBUaGUgLmNvbW1lbnRzIGZpZWxkIG9mIHRoZSBOb2RlIHR5cGUgaXMgaGlkZGVuLCBzbyB3ZSBvbmx5XG4gICAgICAgICAgICAvLyB2aXNpdCBpdCBpZiB0aGUgdmlzaXRvciBkZWZpbmVzIHZpc2l0QmxvY2sgb3IgdmlzaXRMaW5lLCBhbmRcbiAgICAgICAgICAgIC8vIHZhbHVlLmNvbW1lbnRzIGlzIGRlZmluZWQuXG4gICAgICAgICAgICBpZiAodmlzaXRvci5fc2hvdWxkVmlzaXRDb21tZW50cyAmJlxuICAgICAgICAgICAgICAgIHZhbHVlLmNvbW1lbnRzICYmXG4gICAgICAgICAgICAgICAgY2hpbGROYW1lcy5pbmRleE9mKFwiY29tbWVudHNcIikgPCAwKSB7XG4gICAgICAgICAgICAgICAgY2hpbGROYW1lcy5wdXNoKFwiY29tbWVudHNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgY2hpbGRDb3VudCA9IGNoaWxkTmFtZXMubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGNoaWxkUGF0aHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkTmFtZSA9IGNoaWxkTmFtZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPd24uY2FsbCh2YWx1ZSwgY2hpbGROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZVtjaGlsZE5hbWVdID0gdHlwZXMuZ2V0RmllbGRWYWx1ZSh2YWx1ZSwgY2hpbGROYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hpbGRQYXRocy5wdXNoKHBhdGguZ2V0KGNoaWxkTmFtZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyArK2kpIHtcbiAgICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0V2l0aG91dFJlc2V0KGNoaWxkUGF0aHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoLnZhbHVlO1xuICAgIH1cbiAgICBQVnAuYWNxdWlyZUNvbnRleHQgPSBmdW5jdGlvbiAocGF0aCkge1xuICAgICAgICBpZiAodGhpcy5fcmV1c2FibGVDb250ZXh0U3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcmV1c2FibGVDb250ZXh0U3RhY2sucG9wKCkucmVzZXQocGF0aCk7XG4gICAgfTtcbiAgICBQVnAucmVsZWFzZUNvbnRleHQgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICBpZiAoIShjb250ZXh0IGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JldXNhYmxlQ29udGV4dFN0YWNrLnB1c2goY29udGV4dCk7XG4gICAgICAgIGNvbnRleHQuY3VycmVudFBhdGggPSBudWxsO1xuICAgIH07XG4gICAgUFZwLnJlcG9ydENoYW5nZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2NoYW5nZVJlcG9ydGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIFBWcC53YXNDaGFuZ2VSZXBvcnRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoYW5nZVJlcG9ydGVkO1xuICAgIH07XG4gICAgZnVuY3Rpb24gbWFrZUNvbnRleHRDb25zdHJ1Y3Rvcih2aXNpdG9yKSB7XG4gICAgICAgIGZ1bmN0aW9uIENvbnRleHQocGF0aCkge1xuICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhdGhWaXNpdG9yKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJ2aXNpdG9yXCIsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmlzaXRvcixcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhdGggPSBwYXRoO1xuICAgICAgICAgICAgdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgPSB0cnVlO1xuICAgICAgICAgICAgT2JqZWN0LnNlYWwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEodmlzaXRvciBpbnN0YW5jZW9mIFBhdGhWaXNpdG9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgdmlzaXRvciBvYmplY3QgaXMgdGhlIHByb3RvdHlwZSBvZiBDb250ZXh0LnByb3RvdHlwZSxcbiAgICAgICAgLy8gc28gYWxsIHZpc2l0b3IgbWV0aG9kcyBhcmUgaW5oZXJpdGVkIGJ5IGNvbnRleHQgb2JqZWN0cy5cbiAgICAgICAgdmFyIENwID0gQ29udGV4dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHZpc2l0b3IpO1xuICAgICAgICBDcC5jb25zdHJ1Y3RvciA9IENvbnRleHQ7XG4gICAgICAgIGV4dGVuZChDcCwgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcyk7XG4gICAgICAgIHJldHVybiBDb250ZXh0O1xuICAgIH1cbiAgICAvLyBFdmVyeSBQYXRoVmlzaXRvciBoYXMgYSBkaWZmZXJlbnQgdGhpcy5Db250ZXh0IGNvbnN0cnVjdG9yIGFuZFxuICAgIC8vIHRoaXMuQ29udGV4dC5wcm90b3R5cGUgb2JqZWN0LCBidXQgdGhvc2UgcHJvdG90eXBlcyBjYW4gYWxsIHVzZSB0aGVcbiAgICAvLyBzYW1lIHJlc2V0LCBpbnZva2VWaXNpdG9yTWV0aG9kLCBhbmQgdHJhdmVyc2UgZnVuY3Rpb24gb2JqZWN0cy5cbiAgICB2YXIgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcy5yZXNldCA9XG4gICAgICAgIGZ1bmN0aW9uIHJlc2V0KHBhdGgpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiB0aGlzLkNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEocGF0aCBpbnN0YW5jZW9mIE5vZGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhdGggPSBwYXRoO1xuICAgICAgICAgICAgdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcy5pbnZva2VWaXNpdG9yTWV0aG9kID1cbiAgICAgICAgZnVuY3Rpb24gaW52b2tlVmlzaXRvck1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHRoaXMuY3VycmVudFBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy52aXNpdG9yW21ldGhvZE5hbWVdLmNhbGwodGhpcywgdGhpcy5jdXJyZW50UGF0aCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIC8vIFZpc2l0b3IgbWV0aG9kcyByZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGV5IGhhdmUgaGFuZGxlZFxuICAgICAgICAgICAgICAgIC8vIHRoZWlyIG93biB0cmF2ZXJzYWwgbmVlZHMsIGFuZCB3ZSBzaG91bGQgbm90IGNvbXBsYWluIGlmXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgaXMgc3RpbGwgdHJ1ZS5cbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRUb0NhbGxUcmF2ZXJzZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBBbnkgb3RoZXIgbm9uLXVuZGVmaW5lZCB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSB2aXNpdG9yIG1ldGhvZFxuICAgICAgICAgICAgICAgIC8vIGlzIGludGVycHJldGVkIGFzIGEgcmVwbGFjZW1lbnQgdmFsdWUuXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGF0aCA9IHRoaXMuY3VycmVudFBhdGgucmVwbGFjZShyZXN1bHQpWzBdO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5lZWRUb0NhbGxUcmF2ZXJzZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzLnRyYXZlcnNlIHN0aWxsIGhhc24ndCBiZWVuIGNhbGxlZCwgdmlzaXQgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoaWxkcmVuIG9mIHRoZSByZXBsYWNlbWVudCBub2RlLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYXZlcnNlKHRoaXMuY3VycmVudFBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm5lZWRUb0NhbGxUcmF2ZXJzZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IGVpdGhlciBjYWxsIHRoaXMudHJhdmVyc2Ugb3IgcmV0dXJuIGZhbHNlIGluIFwiICsgbWV0aG9kTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcGF0aCA9IHRoaXMuY3VycmVudFBhdGg7XG4gICAgICAgICAgICByZXR1cm4gcGF0aCAmJiBwYXRoLnZhbHVlO1xuICAgICAgICB9O1xuICAgIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMudHJhdmVyc2UgPVxuICAgICAgICBmdW5jdGlvbiB0cmF2ZXJzZShwYXRoLCBuZXdWaXNpdG9yKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISh0aGlzLmN1cnJlbnRQYXRoIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB2aXNpdENoaWxkcmVuKHBhdGgsIFBhdGhWaXNpdG9yLmZyb21NZXRob2RzT2JqZWN0KG5ld1Zpc2l0b3IgfHwgdGhpcy52aXNpdG9yKSk7XG4gICAgICAgIH07XG4gICAgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcy52aXNpdCA9XG4gICAgICAgIGZ1bmN0aW9uIHZpc2l0KHBhdGgsIG5ld1Zpc2l0b3IpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiB0aGlzLkNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEocGF0aCBpbnN0YW5jZW9mIE5vZGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHRoaXMuY3VycmVudFBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5lZWRUb0NhbGxUcmF2ZXJzZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIFBhdGhWaXNpdG9yLmZyb21NZXRob2RzT2JqZWN0KG5ld1Zpc2l0b3IgfHwgdGhpcy52aXNpdG9yKS52aXNpdFdpdGhvdXRSZXNldChwYXRoKTtcbiAgICAgICAgfTtcbiAgICBzaGFyZWRDb250ZXh0UHJvdG9NZXRob2RzLnJlcG9ydENoYW5nZWQgPSBmdW5jdGlvbiByZXBvcnRDaGFuZ2VkKCkge1xuICAgICAgICB0aGlzLnZpc2l0b3IucmVwb3J0Q2hhbmdlZCgpO1xuICAgIH07XG4gICAgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcy5hYm9ydCA9IGZ1bmN0aW9uIGFib3J0KCkge1xuICAgICAgICB0aGlzLm5lZWRUb0NhbGxUcmF2ZXJzZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZpc2l0b3IuYWJvcnQoKTtcbiAgICB9O1xuICAgIHJldHVybiBQYXRoVmlzaXRvcjtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IHBhdGhWaXNpdG9yUGx1Z2luO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90eXBlc1wiKSk7XG52YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xudmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuZnVuY3Rpb24gcGF0aFBsdWdpbihmb3JrKSB7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgaXNBcnJheSA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5hcnJheTtcbiAgICB2YXIgaXNOdW1iZXIgPSB0eXBlcy5idWlsdEluVHlwZXMubnVtYmVyO1xuICAgIHZhciBQYXRoID0gZnVuY3Rpb24gUGF0aCh2YWx1ZSwgcGFyZW50UGF0aCwgbmFtZSkge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGF0aCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggY29uc3RydWN0b3IgY2Fubm90IGJlIGludm9rZWQgd2l0aG91dCAnbmV3J1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50UGF0aCkge1xuICAgICAgICAgICAgaWYgKCEocGFyZW50UGF0aCBpbnN0YW5jZW9mIFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50UGF0aCA9IG51bGw7XG4gICAgICAgICAgICBuYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgdmFsdWUgZW5jYXBzdWxhdGVkIGJ5IHRoaXMgUGF0aCwgZ2VuZXJhbGx5IGVxdWFsIHRvXG4gICAgICAgIC8vIHBhcmVudFBhdGgudmFsdWVbbmFtZV0gaWYgd2UgaGF2ZSBhIHBhcmVudFBhdGguXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgLy8gVGhlIGltbWVkaWF0ZSBwYXJlbnQgUGF0aCBvZiB0aGlzIFBhdGguXG4gICAgICAgIHRoaXMucGFyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvZiBwYXJlbnRQYXRoLnZhbHVlIHRocm91Z2ggd2hpY2ggdGhpc1xuICAgICAgICAvLyBQYXRoJ3MgdmFsdWUgd2FzIHJlYWNoZWQuXG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIC8vIENhbGxpbmcgcGF0aC5nZXQoXCJjaGlsZFwiKSBtdWx0aXBsZSB0aW1lcyBhbHdheXMgcmV0dXJucyB0aGUgc2FtZVxuICAgICAgICAvLyBjaGlsZCBQYXRoIG9iamVjdCwgZm9yIGJvdGggcGVyZm9ybWFuY2UgYW5kIGNvbnNpc3RlbmN5IHJlYXNvbnMuXG4gICAgICAgIHRoaXMuX19jaGlsZENhY2hlID0gbnVsbDtcbiAgICB9O1xuICAgIHZhciBQcCA9IFBhdGgucHJvdG90eXBlO1xuICAgIGZ1bmN0aW9uIGdldENoaWxkQ2FjaGUocGF0aCkge1xuICAgICAgICAvLyBMYXppbHkgY3JlYXRlIHRoZSBjaGlsZCBjYWNoZS4gVGhpcyBhbHNvIGNoZWFwZW5zIGNhY2hlXG4gICAgICAgIC8vIGludmFsaWRhdGlvbiwgc2luY2UgeW91IGNhbiBqdXN0IHJlc2V0IHBhdGguX19jaGlsZENhY2hlIHRvIG51bGwuXG4gICAgICAgIHJldHVybiBwYXRoLl9fY2hpbGRDYWNoZSB8fCAocGF0aC5fX2NoaWxkQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q2hpbGRQYXRoKHBhdGgsIG5hbWUpIHtcbiAgICAgICAgdmFyIGNhY2hlID0gZ2V0Q2hpbGRDYWNoZShwYXRoKTtcbiAgICAgICAgdmFyIGFjdHVhbENoaWxkVmFsdWUgPSBwYXRoLmdldFZhbHVlUHJvcGVydHkobmFtZSk7XG4gICAgICAgIHZhciBjaGlsZFBhdGggPSBjYWNoZVtuYW1lXTtcbiAgICAgICAgaWYgKCFoYXNPd24uY2FsbChjYWNoZSwgbmFtZSkgfHxcbiAgICAgICAgICAgIC8vIEVuc3VyZSBjb25zaXN0ZW5jeSBiZXR3ZWVuIGNhY2hlIGFuZCByZWFsaXR5LlxuICAgICAgICAgICAgY2hpbGRQYXRoLnZhbHVlICE9PSBhY3R1YWxDaGlsZFZhbHVlKSB7XG4gICAgICAgICAgICBjaGlsZFBhdGggPSBjYWNoZVtuYW1lXSA9IG5ldyBwYXRoLmNvbnN0cnVjdG9yKGFjdHVhbENoaWxkVmFsdWUsIHBhdGgsIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGlsZFBhdGg7XG4gICAgfVxuICAgIC8vIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0aGF0IG5lZWQgdG9cbiAgICAvLyBoYW5kbGUgbWlzc2luZyBwcm9wZXJ0aWVzLCBldGMuXG4gICAgUHAuZ2V0VmFsdWVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGdldFZhbHVlUHJvcGVydHkobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZVtuYW1lXTtcbiAgICB9O1xuICAgIFBwLmdldCA9IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgdmFyIG5hbWVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBuYW1lc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXRoID0gdGhpcztcbiAgICAgICAgdmFyIGNvdW50ID0gbmFtZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgICAgIHBhdGggPSBnZXRDaGlsZFBhdGgocGF0aCwgbmFtZXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH07XG4gICAgUHAuZWFjaCA9IGZ1bmN0aW9uIGVhY2goY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNoaWxkUGF0aHMgPSBbXTtcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMudmFsdWUubGVuZ3RoO1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIC8vIENvbGxlY3QgYWxsIHRoZSBvcmlnaW5hbCBjaGlsZCBwYXRocyBiZWZvcmUgaW52b2tpbmcgdGhlIGNhbGxiYWNrLlxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwodGhpcy52YWx1ZSwgaSkpIHtcbiAgICAgICAgICAgICAgICBjaGlsZFBhdGhzW2ldID0gdGhpcy5nZXQoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW52b2tlIHRoZSBjYWxsYmFjayBvbiBqdXN0IHRoZSBvcmlnaW5hbCBjaGlsZCBwYXRocywgcmVnYXJkbGVzcyBvZlxuICAgICAgICAvLyBhbnkgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIHRoZSBhcnJheSBieSB0aGUgY2FsbGJhY2suIEkgY2hvc2UgdGhlc2VcbiAgICAgICAgLy8gc2VtYW50aWNzIG92ZXIgY2xldmVybHkgaW52b2tpbmcgdGhlIGNhbGxiYWNrIG9uIG5ldyBlbGVtZW50cyBiZWNhdXNlXG4gICAgICAgIC8vIHRoaXMgd2F5IGlzIG11Y2ggZWFzaWVyIHRvIHJlYXNvbiBhYm91dC5cbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgdGhpcztcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoY2hpbGRQYXRocywgaSkpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGNvbnRleHQsIGNoaWxkUGF0aHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBQcC5tYXAgPSBmdW5jdGlvbiBtYXAoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGNoaWxkUGF0aCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goY2FsbGJhY2suY2FsbCh0aGlzLCBjaGlsZFBhdGgpKTtcbiAgICAgICAgfSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBQcC5maWx0ZXIgPSBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24gKGNoaWxkUGF0aCkge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmNhbGwodGhpcywgY2hpbGRQYXRoKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgZnVuY3Rpb24gZW1wdHlNb3ZlcygpIHsgfVxuICAgIGZ1bmN0aW9uIGdldE1vdmVzKHBhdGgsIG9mZnNldCwgc3RhcnQsIGVuZCkge1xuICAgICAgICBpc0FycmF5LmFzc2VydChwYXRoLnZhbHVlKTtcbiAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtcHR5TW92ZXM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlbmd0aCA9IHBhdGgudmFsdWUubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIGVtcHR5TW92ZXM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFyZ2MgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICBpZiAoYXJnYyA9PT0gMikge1xuICAgICAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFyZ2MgPT09IDMpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoc3RhcnQsIDApO1xuICAgICAgICAgICAgZW5kID0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhcnQgPSBNYXRoLm1heChzdGFydCwgMCk7XG4gICAgICAgICAgICBlbmQgPSBNYXRoLm1pbihlbmQsIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNOdW1iZXIuYXNzZXJ0KHN0YXJ0KTtcbiAgICAgICAgaXNOdW1iZXIuYXNzZXJ0KGVuZCk7XG4gICAgICAgIHZhciBtb3ZlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHZhciBjYWNoZSA9IGdldENoaWxkQ2FjaGUocGF0aCk7XG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwocGF0aC52YWx1ZSwgaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRQYXRoID0gcGF0aC5nZXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkUGF0aC5uYW1lICE9PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG5ld0luZGV4ID0gaSArIG9mZnNldDtcbiAgICAgICAgICAgICAgICBjaGlsZFBhdGgubmFtZSA9IG5ld0luZGV4O1xuICAgICAgICAgICAgICAgIG1vdmVzW25ld0luZGV4XSA9IGNoaWxkUGF0aDtcbiAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIGNhY2hlLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZvciAodmFyIG5ld0luZGV4IGluIG1vdmVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkUGF0aCA9IG1vdmVzW25ld0luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRQYXRoLm5hbWUgIT09ICtuZXdJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhY2hlW25ld0luZGV4XSA9IGNoaWxkUGF0aDtcbiAgICAgICAgICAgICAgICBwYXRoLnZhbHVlW25ld0luZGV4XSA9IGNoaWxkUGF0aC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgUHAuc2hpZnQgPSBmdW5jdGlvbiBzaGlmdCgpIHtcbiAgICAgICAgdmFyIG1vdmUgPSBnZXRNb3Zlcyh0aGlzLCAtMSk7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnZhbHVlLnNoaWZ0KCk7XG4gICAgICAgIG1vdmUoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIFBwLnVuc2hpZnQgPSBmdW5jdGlvbiB1bnNoaWZ0KCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtb3ZlID0gZ2V0TW92ZXModGhpcywgYXJncy5sZW5ndGgpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy52YWx1ZS51bnNoaWZ0LmFwcGx5KHRoaXMudmFsdWUsIGFyZ3MpO1xuICAgICAgICBtb3ZlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBQcC5wdXNoID0gZnVuY3Rpb24gcHVzaCgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpc0FycmF5LmFzc2VydCh0aGlzLnZhbHVlKTtcbiAgICAgICAgZGVsZXRlIGdldENoaWxkQ2FjaGUodGhpcykubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5wdXNoLmFwcGx5KHRoaXMudmFsdWUsIGFyZ3MpO1xuICAgIH07XG4gICAgUHAucG9wID0gZnVuY3Rpb24gcG9wKCkge1xuICAgICAgICBpc0FycmF5LmFzc2VydCh0aGlzLnZhbHVlKTtcbiAgICAgICAgdmFyIGNhY2hlID0gZ2V0Q2hpbGRDYWNoZSh0aGlzKTtcbiAgICAgICAgZGVsZXRlIGNhY2hlW3RoaXMudmFsdWUubGVuZ3RoIC0gMV07XG4gICAgICAgIGRlbGV0ZSBjYWNoZS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLnBvcCgpO1xuICAgIH07XG4gICAgUHAuaW5zZXJ0QXQgPSBmdW5jdGlvbiBpbnNlcnRBdChpbmRleCkge1xuICAgICAgICB2YXIgYXJnYyA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIHZhciBtb3ZlID0gZ2V0TW92ZXModGhpcywgYXJnYyAtIDEsIGluZGV4KTtcbiAgICAgICAgaWYgKG1vdmUgPT09IGVtcHR5TW92ZXMgJiYgYXJnYyA8PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IE1hdGgubWF4KGluZGV4LCAwKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmdjOyArK2kpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVbaW5kZXggKyBpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgbW92ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFBwLmluc2VydEJlZm9yZSA9IGZ1bmN0aW9uIGluc2VydEJlZm9yZSgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHAgPSB0aGlzLnBhcmVudFBhdGg7XG4gICAgICAgIHZhciBhcmdjID0gYXJncy5sZW5ndGg7XG4gICAgICAgIHZhciBpbnNlcnRBdEFyZ3MgPSBbdGhpcy5uYW1lXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdjOyArK2kpIHtcbiAgICAgICAgICAgIGluc2VydEF0QXJncy5wdXNoKGFyZ3NbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcC5pbnNlcnRBdC5hcHBseShwcCwgaW5zZXJ0QXRBcmdzKTtcbiAgICB9O1xuICAgIFBwLmluc2VydEFmdGVyID0gZnVuY3Rpb24gaW5zZXJ0QWZ0ZXIoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBwID0gdGhpcy5wYXJlbnRQYXRoO1xuICAgICAgICB2YXIgYXJnYyA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICB2YXIgaW5zZXJ0QXRBcmdzID0gW3RoaXMubmFtZSArIDFdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ2M7ICsraSkge1xuICAgICAgICAgICAgaW5zZXJ0QXRBcmdzLnB1c2goYXJnc1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBwLmluc2VydEF0LmFwcGx5KHBwLCBpbnNlcnRBdEFyZ3MpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gcmVwYWlyUmVsYXRpb25zaGlwV2l0aFBhcmVudChwYXRoKSB7XG4gICAgICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcCA9IHBhdGgucGFyZW50UGF0aDtcbiAgICAgICAgaWYgKCFwcCkge1xuICAgICAgICAgICAgLy8gT3JwaGFuIHBhdGhzIGhhdmUgbm8gcmVsYXRpb25zaGlwIHRvIHJlcGFpci5cbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRWYWx1ZSA9IHBwLnZhbHVlO1xuICAgICAgICB2YXIgcGFyZW50Q2FjaGUgPSBnZXRDaGlsZENhY2hlKHBwKTtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHBhcmVudENhY2hlW3BhdGgubmFtZV0gaXMgcG9wdWxhdGVkLlxuICAgICAgICBpZiAocGFyZW50VmFsdWVbcGF0aC5uYW1lXSA9PT0gcGF0aC52YWx1ZSkge1xuICAgICAgICAgICAgcGFyZW50Q2FjaGVbcGF0aC5uYW1lXSA9IHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNBcnJheS5jaGVjayhwYXJlbnRWYWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIFNvbWV0aGluZyBjYXVzZWQgcGF0aC5uYW1lIHRvIGJlY29tZSBvdXQgb2YgZGF0ZSwgc28gYXR0ZW1wdCB0b1xuICAgICAgICAgICAgLy8gcmVjb3ZlciBieSBzZWFyY2hpbmcgZm9yIHBhdGgudmFsdWUgaW4gcGFyZW50VmFsdWUuXG4gICAgICAgICAgICB2YXIgaSA9IHBhcmVudFZhbHVlLmluZGV4T2YocGF0aC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoaSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Q2FjaGVbcGF0aC5uYW1lID0gaV0gPSBwYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgcGF0aC52YWx1ZSBkaXNhZ3JlZXMgd2l0aCBwYXJlbnRWYWx1ZVtwYXRoLm5hbWVdLCBhbmRcbiAgICAgICAgICAgIC8vIHBhdGgubmFtZSBpcyBub3QgYW4gYXJyYXkgaW5kZXgsIGxldCBwYXRoLnZhbHVlIGJlY29tZSB0aGUgbmV3XG4gICAgICAgICAgICAvLyBwYXJlbnRWYWx1ZVtwYXRoLm5hbWVdIGFuZCB1cGRhdGUgcGFyZW50Q2FjaGUgYWNjb3JkaW5nbHkuXG4gICAgICAgICAgICBwYXJlbnRWYWx1ZVtwYXRoLm5hbWVdID0gcGF0aC52YWx1ZTtcbiAgICAgICAgICAgIHBhcmVudENhY2hlW3BhdGgubmFtZV0gPSBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJlbnRWYWx1ZVtwYXRoLm5hbWVdICE9PSBwYXRoLnZhbHVlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGgucGFyZW50UGF0aC5nZXQocGF0aC5uYW1lKSAhPT0gcGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbiAgICBQcC5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShyZXBsYWNlbWVudCkge1xuICAgICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgICB2YXIgcGFyZW50VmFsdWUgPSB0aGlzLnBhcmVudFBhdGgudmFsdWU7XG4gICAgICAgIHZhciBwYXJlbnRDYWNoZSA9IGdldENoaWxkQ2FjaGUodGhpcy5wYXJlbnRQYXRoKTtcbiAgICAgICAgdmFyIGNvdW50ID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgcmVwYWlyUmVsYXRpb25zaGlwV2l0aFBhcmVudCh0aGlzKTtcbiAgICAgICAgaWYgKGlzQXJyYXkuY2hlY2socGFyZW50VmFsdWUpKSB7XG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxMZW5ndGggPSBwYXJlbnRWYWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgbW92ZSA9IGdldE1vdmVzKHRoaXMucGFyZW50UGF0aCwgY291bnQgLSAxLCB0aGlzLm5hbWUgKyAxKTtcbiAgICAgICAgICAgIHZhciBzcGxpY2VBcmdzID0gW3RoaXMubmFtZSwgMV07XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgICAgICAgICBzcGxpY2VBcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBzcGxpY2VkT3V0ID0gcGFyZW50VmFsdWUuc3BsaWNlLmFwcGx5KHBhcmVudFZhbHVlLCBzcGxpY2VBcmdzKTtcbiAgICAgICAgICAgIGlmIChzcGxpY2VkT3V0WzBdICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmVudFZhbHVlLmxlbmd0aCAhPT0gKG9yaWdpbmFsTGVuZ3RoIC0gMSArIGNvdW50KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vdmUoKTtcbiAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJlbnRDYWNoZVt0aGlzLm5hbWVdO1xuICAgICAgICAgICAgICAgIHRoaXMuX19jaGlsZENhY2hlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRWYWx1ZVt0aGlzLm5hbWVdICE9PSByZXBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICE9PSByZXBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gcmVwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX19jaGlsZENhY2hlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMucGFyZW50UGF0aC5nZXQodGhpcy5uYW1lICsgaSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0c1swXSAhPT0gdGhpcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAhPT0gcmVwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9fY2hpbGRDYWNoZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gcGFyZW50VmFsdWVbdGhpcy5uYW1lXSA9IHJlcGxhY2VtZW50O1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgcGFyZW50VmFsdWVbdGhpcy5uYW1lXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fX2NoaWxkQ2FjaGUgPSBudWxsO1xuICAgICAgICAgICAgLy8gTGVhdmUgdGhpcyBwYXRoIGNhY2hlZCBhcyBwYXJlbnRDYWNoZVt0aGlzLm5hbWVdLCBldmVuIHRob3VnaFxuICAgICAgICAgICAgLy8gaXQgbm8gbG9uZ2VyIGhhcyBhIHZhbHVlIGRlZmluZWQuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgcmVwbGFjZSBwYXRoXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH07XG4gICAgcmV0dXJuIFBhdGg7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBwYXRoUGx1Z2luO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90eXBlc1wiKSk7XG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIHNjb3BlUGx1Z2luKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBUeXBlID0gdHlwZXMuVHlwZTtcbiAgICB2YXIgbmFtZWRUeXBlcyA9IHR5cGVzLm5hbWVkVHlwZXM7XG4gICAgdmFyIE5vZGUgPSBuYW1lZFR5cGVzLk5vZGU7XG4gICAgdmFyIEV4cHJlc3Npb24gPSBuYW1lZFR5cGVzLkV4cHJlc3Npb247XG4gICAgdmFyIGlzQXJyYXkgPSB0eXBlcy5idWlsdEluVHlwZXMuYXJyYXk7XG4gICAgdmFyIGIgPSB0eXBlcy5idWlsZGVycztcbiAgICB2YXIgU2NvcGUgPSBmdW5jdGlvbiBTY29wZShwYXRoLCBwYXJlbnRTY29wZSkge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU2NvcGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTY29wZSBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgaW52b2tlZCB3aXRob3V0ICduZXcnXCIpO1xuICAgICAgICB9XG4gICAgICAgIFNjb3BlVHlwZS5hc3NlcnQocGF0aC52YWx1ZSk7XG4gICAgICAgIHZhciBkZXB0aDtcbiAgICAgICAgaWYgKHBhcmVudFNjb3BlKSB7XG4gICAgICAgICAgICBpZiAoIShwYXJlbnRTY29wZSBpbnN0YW5jZW9mIFNjb3BlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlcHRoID0gcGFyZW50U2NvcGUuZGVwdGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50U2NvcGUgPSBudWxsO1xuICAgICAgICAgICAgZGVwdGggPSAwO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgICAgIHBhdGg6IHsgdmFsdWU6IHBhdGggfSxcbiAgICAgICAgICAgIG5vZGU6IHsgdmFsdWU6IHBhdGgudmFsdWUgfSxcbiAgICAgICAgICAgIGlzR2xvYmFsOiB7IHZhbHVlOiAhcGFyZW50U2NvcGUsIGVudW1lcmFibGU6IHRydWUgfSxcbiAgICAgICAgICAgIGRlcHRoOiB7IHZhbHVlOiBkZXB0aCB9LFxuICAgICAgICAgICAgcGFyZW50OiB7IHZhbHVlOiBwYXJlbnRTY29wZSB9LFxuICAgICAgICAgICAgYmluZGluZ3M6IHsgdmFsdWU6IHt9IH0sXG4gICAgICAgICAgICB0eXBlczogeyB2YWx1ZToge30gfSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB2YXIgc2NvcGVUeXBlcyA9IFtcbiAgICAgICAgLy8gUHJvZ3JhbSBub2RlcyBpbnRyb2R1Y2UgZ2xvYmFsIHNjb3Blcy5cbiAgICAgICAgbmFtZWRUeXBlcy5Qcm9ncmFtLFxuICAgICAgICAvLyBGdW5jdGlvbiBpcyB0aGUgc3VwZXJ0eXBlIG9mIEZ1bmN0aW9uRXhwcmVzc2lvbixcbiAgICAgICAgLy8gRnVuY3Rpb25EZWNsYXJhdGlvbiwgQXJyb3dFeHByZXNzaW9uLCBldGMuXG4gICAgICAgIG5hbWVkVHlwZXMuRnVuY3Rpb24sXG4gICAgICAgIC8vIEluIGNhc2UgeW91IGRpZG4ndCBrbm93LCB0aGUgY2F1Z2h0IHBhcmFtZXRlciBzaGFkb3dzIGFueSB2YXJpYWJsZVxuICAgICAgICAvLyBvZiB0aGUgc2FtZSBuYW1lIGluIGFuIG91dGVyIHNjb3BlLlxuICAgICAgICBuYW1lZFR5cGVzLkNhdGNoQ2xhdXNlXG4gICAgXTtcbiAgICB2YXIgU2NvcGVUeXBlID0gVHlwZS5vci5hcHBseShUeXBlLCBzY29wZVR5cGVzKTtcbiAgICBTY29wZS5pc0VzdGFibGlzaGVkQnkgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICByZXR1cm4gU2NvcGVUeXBlLmNoZWNrKG5vZGUpO1xuICAgIH07XG4gICAgdmFyIFNwID0gU2NvcGUucHJvdG90eXBlO1xuICAgIC8vIFdpbGwgYmUgb3ZlcnJpZGRlbiBhZnRlciBhbiBpbnN0YW5jZSBsYXppbHkgY2FsbHMgc2NhblNjb3BlLlxuICAgIFNwLmRpZFNjYW4gPSBmYWxzZTtcbiAgICBTcC5kZWNsYXJlcyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHRoaXMuc2NhbigpO1xuICAgICAgICByZXR1cm4gaGFzT3duLmNhbGwodGhpcy5iaW5kaW5ncywgbmFtZSk7XG4gICAgfTtcbiAgICBTcC5kZWNsYXJlc1R5cGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB0aGlzLnNjYW4oKTtcbiAgICAgICAgcmV0dXJuIGhhc093bi5jYWxsKHRoaXMudHlwZXMsIG5hbWUpO1xuICAgIH07XG4gICAgU3AuZGVjbGFyZVRlbXBvcmFyeSA9IGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICAgICAgaWYgKCEvXlthLXokX10vaS50ZXN0KHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmVmaXggPSBcInQkXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5jbHVkZSB0aGlzLmRlcHRoIGluIHRoZSBuYW1lIHRvIG1ha2Ugc3VyZSB0aGUgbmFtZSBkb2VzIG5vdFxuICAgICAgICAvLyBjb2xsaWRlIHdpdGggYW55IHZhcmlhYmxlcyBpbiBuZXN0ZWQvZW5jbG9zaW5nIHNjb3Blcy5cbiAgICAgICAgcHJlZml4ICs9IHRoaXMuZGVwdGgudG9TdHJpbmcoMzYpICsgXCIkXCI7XG4gICAgICAgIHRoaXMuc2NhbigpO1xuICAgICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAodGhpcy5kZWNsYXJlcyhwcmVmaXggKyBpbmRleCkpIHtcbiAgICAgICAgICAgICsraW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWUgPSBwcmVmaXggKyBpbmRleDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluZGluZ3NbbmFtZV0gPSB0eXBlcy5idWlsZGVycy5pZGVudGlmaWVyKG5hbWUpO1xuICAgIH07XG4gICAgU3AuaW5qZWN0VGVtcG9yYXJ5ID0gZnVuY3Rpb24gKGlkZW50aWZpZXIsIGluaXQpIHtcbiAgICAgICAgaWRlbnRpZmllciB8fCAoaWRlbnRpZmllciA9IHRoaXMuZGVjbGFyZVRlbXBvcmFyeSgpKTtcbiAgICAgICAgdmFyIGJvZHlQYXRoID0gdGhpcy5wYXRoLmdldChcImJvZHlcIik7XG4gICAgICAgIGlmIChuYW1lZFR5cGVzLkJsb2NrU3RhdGVtZW50LmNoZWNrKGJvZHlQYXRoLnZhbHVlKSkge1xuICAgICAgICAgICAgYm9keVBhdGggPSBib2R5UGF0aC5nZXQoXCJib2R5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGJvZHlQYXRoLnVuc2hpZnQoYi52YXJpYWJsZURlY2xhcmF0aW9uKFwidmFyXCIsIFtiLnZhcmlhYmxlRGVjbGFyYXRvcihpZGVudGlmaWVyLCBpbml0IHx8IG51bGwpXSkpO1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgICB9O1xuICAgIFNwLnNjYW4gPSBmdW5jdGlvbiAoZm9yY2UpIHtcbiAgICAgICAgaWYgKGZvcmNlIHx8ICF0aGlzLmRpZFNjYW4pIHtcbiAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcy5iaW5kaW5ncykge1xuICAgICAgICAgICAgICAgIC8vIEVtcHR5IG91dCB0aGlzLmJpbmRpbmdzLCBqdXN0IGluIGNhc2VzLlxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJpbmRpbmdzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NhblNjb3BlKHRoaXMucGF0aCwgdGhpcy5iaW5kaW5ncywgdGhpcy50eXBlcyk7XG4gICAgICAgICAgICB0aGlzLmRpZFNjYW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTcC5nZXRCaW5kaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5zY2FuKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzO1xuICAgIH07XG4gICAgU3AuZ2V0VHlwZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2NhbigpO1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlcztcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHNjYW5TY29wZShwYXRoLCBiaW5kaW5ncywgc2NvcGVUeXBlcykge1xuICAgICAgICB2YXIgbm9kZSA9IHBhdGgudmFsdWU7XG4gICAgICAgIFNjb3BlVHlwZS5hc3NlcnQobm9kZSk7XG4gICAgICAgIGlmIChuYW1lZFR5cGVzLkNhdGNoQ2xhdXNlLmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBBIGNhdGNoIGNsYXVzZSBlc3RhYmxpc2hlcyBhIG5ldyBzY29wZSBidXQgdGhlIG9ubHkgdmFyaWFibGVcbiAgICAgICAgICAgIC8vIGJvdW5kIGluIHRoYXQgc2NvcGUgaXMgdGhlIGNhdGNoIHBhcmFtZXRlci4gQW55IG90aGVyXG4gICAgICAgICAgICAvLyBkZWNsYXJhdGlvbnMgY3JlYXRlIGJpbmRpbmdzIGluIHRoZSBvdXRlciBzY29wZS5cbiAgICAgICAgICAgIHZhciBwYXJhbSA9IHBhdGguZ2V0KFwicGFyYW1cIik7XG4gICAgICAgICAgICBpZiAocGFyYW0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuKHBhcmFtLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZWN1cnNpdmVTY2FuU2NvcGUocGF0aCwgYmluZGluZ3MsIHNjb3BlVHlwZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZVNjYW5TY29wZShwYXRoLCBiaW5kaW5ncywgc2NvcGVUeXBlcykge1xuICAgICAgICB2YXIgbm9kZSA9IHBhdGgudmFsdWU7XG4gICAgICAgIGlmIChwYXRoLnBhcmVudCAmJlxuICAgICAgICAgICAgbmFtZWRUeXBlcy5GdW5jdGlvbkV4cHJlc3Npb24uY2hlY2socGF0aC5wYXJlbnQubm9kZSkgJiZcbiAgICAgICAgICAgIHBhdGgucGFyZW50Lm5vZGUuaWQpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocGF0aC5wYXJlbnQuZ2V0KFwiaWRcIiksIGJpbmRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgIC8vIE5vbmUgb2YgdGhlIHJlbWFpbmluZyBjYXNlcyBtYXR0ZXIgaWYgbm9kZSBpcyBmYWxzeS5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0FycmF5LmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoLmVhY2goZnVuY3Rpb24gKGNoaWxkUGF0aCkge1xuICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5DaGlsZChjaGlsZFBhdGgsIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuRnVuY3Rpb24uY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGguZ2V0KFwicGFyYW1zXCIpLmVhY2goZnVuY3Rpb24gKHBhcmFtUGF0aCkge1xuICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocGFyYW1QYXRoLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5DaGlsZChwYXRoLmdldChcImJvZHlcIiksIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgobmFtZWRUeXBlcy5UeXBlQWxpYXMgJiYgbmFtZWRUeXBlcy5UeXBlQWxpYXMuY2hlY2sobm9kZSkpIHx8XG4gICAgICAgICAgICAobmFtZWRUeXBlcy5JbnRlcmZhY2VEZWNsYXJhdGlvbiAmJiBuYW1lZFR5cGVzLkludGVyZmFjZURlY2xhcmF0aW9uLmNoZWNrKG5vZGUpKSB8fFxuICAgICAgICAgICAgKG5hbWVkVHlwZXMuVFNUeXBlQWxpYXNEZWNsYXJhdGlvbiAmJiBuYW1lZFR5cGVzLlRTVHlwZUFsaWFzRGVjbGFyYXRpb24uY2hlY2sobm9kZSkpIHx8XG4gICAgICAgICAgICAobmFtZWRUeXBlcy5UU0ludGVyZmFjZURlY2xhcmF0aW9uICYmIG5hbWVkVHlwZXMuVFNJbnRlcmZhY2VEZWNsYXJhdGlvbi5jaGVjayhub2RlKSkpIHtcbiAgICAgICAgICAgIGFkZFR5cGVQYXR0ZXJuKHBhdGguZ2V0KFwiaWRcIiksIHNjb3BlVHlwZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuVmFyaWFibGVEZWNsYXJhdG9yLmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICBhZGRQYXR0ZXJuKHBhdGguZ2V0KFwiaWRcIiksIGJpbmRpbmdzKTtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5DaGlsZChwYXRoLmdldChcImluaXRcIiksIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnR5cGUgPT09IFwiSW1wb3J0U3BlY2lmaWVyXCIgfHxcbiAgICAgICAgICAgIG5vZGUudHlwZSA9PT0gXCJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXJcIiB8fFxuICAgICAgICAgICAgbm9kZS50eXBlID09PSBcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIikge1xuICAgICAgICAgICAgYWRkUGF0dGVybihcbiAgICAgICAgICAgIC8vIEVzcHJpbWEgdXNlZCB0byB1c2UgdGhlIC5uYW1lIGZpZWxkIHRvIHJlZmVyIHRvIHRoZSBsb2NhbFxuICAgICAgICAgICAgLy8gYmluZGluZyBpZGVudGlmaWVyIGZvciBJbXBvcnRTcGVjaWZpZXIgbm9kZXMsIGJ1dCAuaWQgZm9yXG4gICAgICAgICAgICAvLyBJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIgYW5kIEltcG9ydERlZmF1bHRTcGVjaWZpZXIgbm9kZXMuXG4gICAgICAgICAgICAvLyBFU1RyZWUvQWNvcm4vRVNwcmVlIHVzZSAubG9jYWwgZm9yIGFsbCB0aHJlZSBub2RlIHR5cGVzLlxuICAgICAgICAgICAgcGF0aC5nZXQobm9kZS5sb2NhbCA/IFwibG9jYWxcIiA6XG4gICAgICAgICAgICAgICAgbm9kZS5uYW1lID8gXCJuYW1lXCIgOiBcImlkXCIpLCBiaW5kaW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoTm9kZS5jaGVjayhub2RlKSAmJiAhRXhwcmVzc2lvbi5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgdHlwZXMuZWFjaEZpZWxkKG5vZGUsIGZ1bmN0aW9uIChuYW1lLCBjaGlsZCkge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZFBhdGggPSBwYXRoLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhdGhIYXNWYWx1ZShjaGlsZFBhdGgsIGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5DaGlsZChjaGlsZFBhdGgsIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBhdGhIYXNWYWx1ZShwYXRoLCB2YWx1ZSkge1xuICAgICAgICBpZiAocGF0aC52YWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVtcHR5IGFycmF5cyBhcmUgcHJvYmFibHkgcHJvZHVjZWQgYnkgZGVmYXVsdHMuZW1wdHlBcnJheSwgaW4gd2hpY2hcbiAgICAgICAgLy8gY2FzZSBpcyBtYWtlcyBzZW5zZSB0byByZWdhcmQgdGhlbSBhcyBlcXVpdmFsZW50LCBpZiBub3QgPT09LlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoLnZhbHVlKSAmJlxuICAgICAgICAgICAgcGF0aC52YWx1ZS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgICB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVjdXJzaXZlU2NhbkNoaWxkKHBhdGgsIGJpbmRpbmdzLCBzY29wZVR5cGVzKSB7XG4gICAgICAgIHZhciBub2RlID0gcGF0aC52YWx1ZTtcbiAgICAgICAgaWYgKCFub2RlIHx8IEV4cHJlc3Npb24uY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBmYWxzeSB2YWx1ZXMgYW5kIEV4cHJlc3Npb25zLlxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuRnVuY3Rpb25EZWNsYXJhdGlvbi5jaGVjayhub2RlKSAmJlxuICAgICAgICAgICAgbm9kZS5pZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgYWRkUGF0dGVybihwYXRoLmdldChcImlkXCIpLCBiaW5kaW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZWRUeXBlcy5DbGFzc0RlY2xhcmF0aW9uICYmXG4gICAgICAgICAgICBuYW1lZFR5cGVzLkNsYXNzRGVjbGFyYXRpb24uY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocGF0aC5nZXQoXCJpZFwiKSwgYmluZGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFNjb3BlVHlwZS5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgaWYgKG5hbWVkVHlwZXMuQ2F0Y2hDbGF1c2UuY2hlY2sobm9kZSkgJiZcbiAgICAgICAgICAgICAgICAvLyBUT0RPIEJyb2FkZW4gdGhpcyB0byBhY2NlcHQgYW55IHBhdHRlcm4uXG4gICAgICAgICAgICAgICAgbmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKG5vZGUucGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhdGNoUGFyYW1OYW1lID0gbm9kZS5wYXJhbS5uYW1lO1xuICAgICAgICAgICAgICAgIHZhciBoYWRCaW5kaW5nID0gaGFzT3duLmNhbGwoYmluZGluZ3MsIGNhdGNoUGFyYW1OYW1lKTtcbiAgICAgICAgICAgICAgICAvLyBBbnkgZGVjbGFyYXRpb25zIHRoYXQgb2NjdXIgaW5zaWRlIHRoZSBjYXRjaCBib2R5IHRoYXQgZG9cbiAgICAgICAgICAgICAgICAvLyBub3QgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjYXRjaCBwYXJhbWV0ZXIgc2hvdWxkIGNvdW50XG4gICAgICAgICAgICAgICAgLy8gYXMgYmluZGluZ3MgaW4gdGhlIG91dGVyIHNjb3BlLlxuICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5TY29wZShwYXRoLmdldChcImJvZHlcIiksIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgICAgICAgICAvLyBJZiBhIG5ldyBiaW5kaW5nIG1hdGNoaW5nIHRoZSBjYXRjaCBwYXJhbWV0ZXIgbmFtZSB3YXNcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGVkIHdoaWxlIHNjYW5uaW5nIHRoZSBjYXRjaCBib2R5LCBpZ25vcmUgaXQgYmVjYXVzZSBpdFxuICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IHJlZmVycyB0byB0aGUgY2F0Y2ggcGFyYW1ldGVyIGFuZCBub3QgdGhlIG91dGVyXG4gICAgICAgICAgICAgICAgLy8gc2NvcGUgdGhhdCB3ZSdyZSBjdXJyZW50bHkgc2Nhbm5pbmcuXG4gICAgICAgICAgICAgICAgaWYgKCFoYWRCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBiaW5kaW5nc1tjYXRjaFBhcmFtTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdXJzaXZlU2NhblNjb3BlKHBhdGgsIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRQYXR0ZXJuKHBhdHRlcm5QYXRoLCBiaW5kaW5ncykge1xuICAgICAgICB2YXIgcGF0dGVybiA9IHBhdHRlcm5QYXRoLnZhbHVlO1xuICAgICAgICBuYW1lZFR5cGVzLlBhdHRlcm4uYXNzZXJ0KHBhdHRlcm4pO1xuICAgICAgICBpZiAobmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoYmluZGluZ3MsIHBhdHRlcm4ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICBiaW5kaW5nc1twYXR0ZXJuLm5hbWVdLnB1c2gocGF0dGVyblBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYmluZGluZ3NbcGF0dGVybi5uYW1lXSA9IFtwYXR0ZXJuUGF0aF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZWRUeXBlcy5Bc3NpZ25tZW50UGF0dGVybiAmJlxuICAgICAgICAgICAgbmFtZWRUeXBlcy5Bc3NpZ25tZW50UGF0dGVybi5jaGVjayhwYXR0ZXJuKSkge1xuICAgICAgICAgICAgYWRkUGF0dGVybihwYXR0ZXJuUGF0aC5nZXQoJ2xlZnQnKSwgYmluZGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuT2JqZWN0UGF0dGVybiAmJlxuICAgICAgICAgICAgbmFtZWRUeXBlcy5PYmplY3RQYXR0ZXJuLmNoZWNrKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICBwYXR0ZXJuUGF0aC5nZXQoJ3Byb3BlcnRpZXMnKS5lYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eVBhdGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBwcm9wZXJ0eVBhdGgudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWVkVHlwZXMuUGF0dGVybi5jaGVjayhwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihwcm9wZXJ0eVBhdGgsIGJpbmRpbmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZWRUeXBlcy5Qcm9wZXJ0eS5jaGVjayhwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihwcm9wZXJ0eVBhdGguZ2V0KCd2YWx1ZScpLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuU3ByZWFkUHJvcGVydHkgJiZcbiAgICAgICAgICAgICAgICAgICAgbmFtZWRUeXBlcy5TcHJlYWRQcm9wZXJ0eS5jaGVjayhwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihwcm9wZXJ0eVBhdGguZ2V0KCdhcmd1bWVudCcpLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZWRUeXBlcy5BcnJheVBhdHRlcm4gJiZcbiAgICAgICAgICAgIG5hbWVkVHlwZXMuQXJyYXlQYXR0ZXJuLmNoZWNrKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICBwYXR0ZXJuUGF0aC5nZXQoJ2VsZW1lbnRzJykuZWFjaChmdW5jdGlvbiAoZWxlbWVudFBhdGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGVsZW1lbnRQYXRoLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lZFR5cGVzLlBhdHRlcm4uY2hlY2soZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybihlbGVtZW50UGF0aCwgYmluZGluZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLlNwcmVhZEVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgbmFtZWRUeXBlcy5TcHJlYWRFbGVtZW50LmNoZWNrKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4oZWxlbWVudFBhdGguZ2V0KFwiYXJndW1lbnRcIiksIGJpbmRpbmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLlByb3BlcnR5UGF0dGVybiAmJlxuICAgICAgICAgICAgbmFtZWRUeXBlcy5Qcm9wZXJ0eVBhdHRlcm4uY2hlY2socGF0dGVybikpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocGF0dGVyblBhdGguZ2V0KCdwYXR0ZXJuJyksIGJpbmRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgobmFtZWRUeXBlcy5TcHJlYWRFbGVtZW50UGF0dGVybiAmJlxuICAgICAgICAgICAgbmFtZWRUeXBlcy5TcHJlYWRFbGVtZW50UGF0dGVybi5jaGVjayhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICAgIChuYW1lZFR5cGVzLlNwcmVhZFByb3BlcnR5UGF0dGVybiAmJlxuICAgICAgICAgICAgICAgIG5hbWVkVHlwZXMuU3ByZWFkUHJvcGVydHlQYXR0ZXJuLmNoZWNrKHBhdHRlcm4pKSkge1xuICAgICAgICAgICAgYWRkUGF0dGVybihwYXR0ZXJuUGF0aC5nZXQoJ2FyZ3VtZW50JyksIGJpbmRpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRUeXBlUGF0dGVybihwYXR0ZXJuUGF0aCwgdHlwZXMpIHtcbiAgICAgICAgdmFyIHBhdHRlcm4gPSBwYXR0ZXJuUGF0aC52YWx1ZTtcbiAgICAgICAgbmFtZWRUeXBlcy5QYXR0ZXJuLmFzc2VydChwYXR0ZXJuKTtcbiAgICAgICAgaWYgKG5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhwYXR0ZXJuKSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKHR5cGVzLCBwYXR0ZXJuLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdHlwZXNbcGF0dGVybi5uYW1lXS5wdXNoKHBhdHRlcm5QYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHR5cGVzW3BhdHRlcm4ubmFtZV0gPSBbcGF0dGVyblBhdGhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIFNwLmxvb2t1cCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGZvciAodmFyIHNjb3BlID0gdGhpczsgc2NvcGU7IHNjb3BlID0gc2NvcGUucGFyZW50KVxuICAgICAgICAgICAgaWYgKHNjb3BlLmRlY2xhcmVzKG5hbWUpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfTtcbiAgICBTcC5sb29rdXBUeXBlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgZm9yICh2YXIgc2NvcGUgPSB0aGlzOyBzY29wZTsgc2NvcGUgPSBzY29wZS5wYXJlbnQpXG4gICAgICAgICAgICBpZiAoc2NvcGUuZGVjbGFyZXNUeXBlKG5hbWUpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfTtcbiAgICBTcC5nZXRHbG9iYWxTY29wZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcztcbiAgICAgICAgd2hpbGUgKCFzY29wZS5pc0dsb2JhbClcbiAgICAgICAgICAgIHNjb3BlID0gc2NvcGUucGFyZW50O1xuICAgICAgICByZXR1cm4gc2NvcGU7XG4gICAgfTtcbiAgICByZXR1cm4gU2NvcGU7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBzY29wZVBsdWdpbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdHlwZXNcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBUeXBlID0gdHlwZXMuVHlwZTtcbiAgICB2YXIgYnVpbHRpbiA9IHR5cGVzLmJ1aWx0SW5UeXBlcztcbiAgICB2YXIgaXNOdW1iZXIgPSBidWlsdGluLm51bWJlcjtcbiAgICAvLyBBbiBleGFtcGxlIG9mIGNvbnN0cnVjdGluZyBhIG5ldyB0eXBlIHdpdGggYXJiaXRyYXJ5IGNvbnN0cmFpbnRzIGZyb21cbiAgICAvLyBhbiBleGlzdGluZyB0eXBlLlxuICAgIGZ1bmN0aW9uIGdlcSh0aGFuKSB7XG4gICAgICAgIHJldHVybiBUeXBlLmZyb20oZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBpc051bWJlci5jaGVjayh2YWx1ZSkgJiYgdmFsdWUgPj0gdGhhbjsgfSwgaXNOdW1iZXIgKyBcIiA+PSBcIiArIHRoYW4pO1xuICAgIH1cbiAgICA7XG4gICAgLy8gRGVmYXVsdCB2YWx1ZS1yZXR1cm5pbmcgZnVuY3Rpb25zIHRoYXQgbWF5IG9wdGlvbmFsbHkgYmUgcGFzc2VkIGFzIGFcbiAgICAvLyB0aGlyZCBhcmd1bWVudCB0byBEZWYucHJvdG90eXBlLmZpZWxkLlxuICAgIHZhciBkZWZhdWx0cyA9IHtcbiAgICAgICAgLy8gRnVuY3Rpb25zIHdlcmUgdXNlZCBiZWNhdXNlIChhbW9uZyBvdGhlciByZWFzb25zKSB0aGF0J3MgdGhlIG1vc3RcbiAgICAgICAgLy8gZWxlZ2FudCB3YXkgdG8gYWxsb3cgZm9yIHRoZSBlbXB0eUFycmF5IG9uZSBhbHdheXMgdG8gZ2l2ZSBhIG5ld1xuICAgICAgICAvLyBhcnJheSBpbnN0YW5jZS5cbiAgICAgICAgXCJudWxsXCI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgIFwiZW1wdHlBcnJheVwiOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfSxcbiAgICAgICAgXCJmYWxzZVwiOiBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfSxcbiAgICAgICAgXCJ0cnVlXCI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH0sXG4gICAgICAgIFwidW5kZWZpbmVkXCI6IGZ1bmN0aW9uICgpIHsgfSxcbiAgICAgICAgXCJ1c2Ugc3RyaWN0XCI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwidXNlIHN0cmljdFwiOyB9XG4gICAgfTtcbiAgICB2YXIgbmFpdmVJc1ByaW1pdGl2ZSA9IFR5cGUub3IoYnVpbHRpbi5zdHJpbmcsIGJ1aWx0aW4ubnVtYmVyLCBidWlsdGluLmJvb2xlYW4sIGJ1aWx0aW4ubnVsbCwgYnVpbHRpbi51bmRlZmluZWQpO1xuICAgIHZhciBpc1ByaW1pdGl2ZSA9IFR5cGUuZnJvbShmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgICBpZiAodHlwZSA9PT0gXCJvYmplY3RcIiB8fFxuICAgICAgICAgICAgdHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSwgbmFpdmVJc1ByaW1pdGl2ZS50b1N0cmluZygpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXE6IGdlcSxcbiAgICAgICAgZGVmYXVsdHM6IGRlZmF1bHRzLFxuICAgICAgICBpc1ByaW1pdGl2ZTogaXNQcmltaXRpdmUsXG4gICAgfTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRGVmID0gdm9pZCAwO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xudmFyIG9ialRvU3RyID0gT3AudG9TdHJpbmc7XG52YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG52YXIgQmFzZVR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmFzZVR5cGUoKSB7XG4gICAgfVxuICAgIEJhc2VUeXBlLnByb3RvdHlwZS5hc3NlcnQgPSBmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrKHZhbHVlLCBkZWVwKSkge1xuICAgICAgICAgICAgdmFyIHN0ciA9IHNoYWxsb3dTdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHN0ciArIFwiIGRvZXMgbm90IG1hdGNoIHR5cGUgXCIgKyB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIEJhc2VUeXBlLnByb3RvdHlwZS5hcnJheU9mID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZWxlbVR5cGUgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IEFycmF5VHlwZShlbGVtVHlwZSk7XG4gICAgfTtcbiAgICByZXR1cm4gQmFzZVR5cGU7XG59KCkpO1xudmFyIEFycmF5VHlwZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhBcnJheVR5cGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQXJyYXlUeXBlKGVsZW1UeXBlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmVsZW1UeXBlID0gZWxlbVR5cGU7XG4gICAgICAgIF90aGlzLmtpbmQgPSBcIkFycmF5VHlwZVwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEFycmF5VHlwZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIltcIiArIHRoaXMuZWxlbVR5cGUgKyBcIl1cIjtcbiAgICB9O1xuICAgIEFycmF5VHlwZS5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KGZ1bmN0aW9uIChlbGVtKSB7IHJldHVybiBfdGhpcy5lbGVtVHlwZS5jaGVjayhlbGVtLCBkZWVwKTsgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQXJyYXlUeXBlO1xufShCYXNlVHlwZSkpO1xudmFyIElkZW50aXR5VHlwZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhJZGVudGl0eVR5cGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gSWRlbnRpdHlUeXBlKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIF90aGlzLmtpbmQgPSBcIklkZW50aXR5VHlwZVwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIElkZW50aXR5VHlwZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodGhpcy52YWx1ZSk7XG4gICAgfTtcbiAgICBJZGVudGl0eVR5cGUucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24gKHZhbHVlLCBkZWVwKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZSA9PT0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKCFyZXN1bHQgJiYgdHlwZW9mIGRlZXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZGVlcCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHJldHVybiBJZGVudGl0eVR5cGU7XG59KEJhc2VUeXBlKSk7XG52YXIgT2JqZWN0VHlwZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhPYmplY3RUeXBlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE9iamVjdFR5cGUoZmllbGRzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICAgICAgX3RoaXMua2luZCA9IFwiT2JqZWN0VHlwZVwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE9iamVjdFR5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJ7IFwiICsgdGhpcy5maWVsZHMuam9pbihcIiwgXCIpICsgXCIgfVwiO1xuICAgIH07XG4gICAgT2JqZWN0VHlwZS5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgcmV0dXJuIChvYmpUb1N0ci5jYWxsKHZhbHVlKSA9PT0gb2JqVG9TdHIuY2FsbCh7fSkgJiZcbiAgICAgICAgICAgIHRoaXMuZmllbGRzLmV2ZXJ5KGZ1bmN0aW9uIChmaWVsZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZC50eXBlLmNoZWNrKHZhbHVlW2ZpZWxkLm5hbWVdLCBkZWVwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICB9O1xuICAgIHJldHVybiBPYmplY3RUeXBlO1xufShCYXNlVHlwZSkpO1xudmFyIE9yVHlwZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICB0c2xpYl8xLl9fZXh0ZW5kcyhPclR5cGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gT3JUeXBlKHR5cGVzKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnR5cGVzID0gdHlwZXM7XG4gICAgICAgIF90aGlzLmtpbmQgPSBcIk9yVHlwZVwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE9yVHlwZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVzLmpvaW4oXCIgfCBcIik7XG4gICAgfTtcbiAgICBPclR5cGUucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24gKHZhbHVlLCBkZWVwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVzLnNvbWUoZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlLmNoZWNrKHZhbHVlLCBkZWVwKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gT3JUeXBlO1xufShCYXNlVHlwZSkpO1xudmFyIFByZWRpY2F0ZVR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoUHJlZGljYXRlVHlwZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBQcmVkaWNhdGVUeXBlKG5hbWUsIHByZWRpY2F0ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgX3RoaXMucHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgICAgICBfdGhpcy5raW5kID0gXCJQcmVkaWNhdGVUeXBlXCI7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgUHJlZGljYXRlVHlwZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfTtcbiAgICBQcmVkaWNhdGVUeXBlLnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5wcmVkaWNhdGUodmFsdWUsIGRlZXApO1xuICAgICAgICBpZiAoIXJlc3VsdCAmJiB0eXBlb2YgZGVlcCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBkZWVwKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgcmV0dXJuIFByZWRpY2F0ZVR5cGU7XG59KEJhc2VUeXBlKSk7XG52YXIgRGVmID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZih0eXBlLCB0eXBlTmFtZSkge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7XG4gICAgICAgIHRoaXMuYmFzZU5hbWVzID0gW107XG4gICAgICAgIHRoaXMub3duRmllbGRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgLy8gSW5jbHVkZXMgb3duIHR5cGVOYW1lLiBQb3B1bGF0ZWQgZHVyaW5nIGZpbmFsaXphdGlvbi5cbiAgICAgICAgdGhpcy5hbGxTdXBlcnR5cGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgLy8gTGluZWFyIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gUG9wdWxhdGVkIGR1cmluZyBmaW5hbGl6YXRpb24uXG4gICAgICAgIHRoaXMuc3VwZXJ0eXBlTGlzdCA9IFtdO1xuICAgICAgICAvLyBJbmNsdWRlcyBpbmhlcml0ZWQgZmllbGRzLlxuICAgICAgICB0aGlzLmFsbEZpZWxkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIE5vbi1oaWRkZW4ga2V5cyBvZiBhbGxGaWVsZHMuXG4gICAgICAgIHRoaXMuZmllbGROYW1lcyA9IFtdO1xuICAgICAgICAvLyBUaGlzIHByb3BlcnR5IHdpbGwgYmUgb3ZlcnJpZGRlbiBhcyB0cnVlIGJ5IGluZGl2aWR1YWwgRGVmIGluc3RhbmNlc1xuICAgICAgICAvLyB3aGVuIHRoZXkgYXJlIGZpbmFsaXplZC5cbiAgICAgICAgdGhpcy5maW5hbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gRmFsc2UgYnkgZGVmYXVsdCB1bnRpbCAuYnVpbGQoLi4uKSBpcyBjYWxsZWQgb24gYW4gaW5zdGFuY2UuXG4gICAgICAgIHRoaXMuYnVpbGRhYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnVpbGRQYXJhbXMgPSBbXTtcbiAgICB9XG4gICAgRGVmLnByb3RvdHlwZS5pc1N1cGVydHlwZU9mID0gZnVuY3Rpb24gKHRoYXQpIHtcbiAgICAgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBEZWYpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmFsaXplZCAhPT0gdHJ1ZSB8fFxuICAgICAgICAgICAgICAgIHRoYXQuZmluYWxpemVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhc093bi5jYWxsKHRoYXQuYWxsU3VwZXJ0eXBlcywgdGhpcy50eXBlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhhdCArIFwiIGlzIG5vdCBhIERlZlwiKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRGVmLnByb3RvdHlwZS5jaGVja0FsbEZpZWxkcyA9IGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkge1xuICAgICAgICB2YXIgYWxsRmllbGRzID0gdGhpcy5hbGxGaWVsZHM7XG4gICAgICAgIGlmICh0aGlzLmZpbmFsaXplZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIgKyB0aGlzLnR5cGVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBjaGVja0ZpZWxkQnlOYW1lKG5hbWUpIHtcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IGFsbEZpZWxkc1tuYW1lXTtcbiAgICAgICAgICAgIHZhciB0eXBlID0gZmllbGQudHlwZTtcbiAgICAgICAgICAgIHZhciBjaGlsZCA9IGZpZWxkLmdldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlLmNoZWNrKGNoaWxkLCBkZWVwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgT2JqZWN0LmtleXMoYWxsRmllbGRzKS5ldmVyeShjaGVja0ZpZWxkQnlOYW1lKTtcbiAgICB9O1xuICAgIERlZi5wcm90b3R5cGUuYmFzZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzdXBlcnR5cGVOYW1lcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgc3VwZXJ0eXBlTmFtZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmFzZXMgPSB0aGlzLmJhc2VOYW1lcztcbiAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XG4gICAgICAgICAgICBpZiAoc3VwZXJ0eXBlTmFtZXMubGVuZ3RoICE9PSBiYXNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1cGVydHlwZU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1cGVydHlwZU5hbWVzW2ldICE9PSBiYXNlc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXJ0eXBlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoYmFzZU5hbWUpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaW5kZXhPZiBsb29rdXAgbWF5IGJlIE8obiksIGJ1dCB0aGUgdHlwaWNhbCBudW1iZXIgb2YgYmFzZVxuICAgICAgICAgICAgLy8gbmFtZXMgaXMgdmVyeSBzbWFsbCwgYW5kIGluZGV4T2YgaXMgYSBuYXRpdmUgQXJyYXkgbWV0aG9kLlxuICAgICAgICAgICAgaWYgKGJhc2VzLmluZGV4T2YoYmFzZU5hbWUpIDwgMCkge1xuICAgICAgICAgICAgICAgIGJhc2VzLnB1c2goYmFzZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7IC8vIEZvciBjaGFpbmluZy5cbiAgICB9O1xuICAgIHJldHVybiBEZWY7XG59KCkpO1xuZXhwb3J0cy5EZWYgPSBEZWY7XG52YXIgRmllbGQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRmllbGQobmFtZSwgdHlwZSwgZGVmYXVsdEZuLCBoaWRkZW4pIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0Rm4gPSBkZWZhdWx0Rm47XG4gICAgICAgIHRoaXMuaGlkZGVuID0gISFoaWRkZW47XG4gICAgfVxuICAgIEZpZWxkLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMubmFtZSkgKyBcIjogXCIgKyB0aGlzLnR5cGU7XG4gICAgfTtcbiAgICBGaWVsZC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IG9ialt0aGlzLm5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRlZmF1bHRGbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZGVmYXVsdEZuLmNhbGwob2JqKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICByZXR1cm4gRmllbGQ7XG59KCkpO1xuZnVuY3Rpb24gc2hhbGxvd1N0cmluZ2lmeSh2YWx1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gXCJbXCIgKyB2YWx1ZS5tYXAoc2hhbGxvd1N0cmluZ2lmeSkuam9pbihcIiwgXCIpICsgXCJdXCI7XG4gICAgfVxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIFwieyBcIiArIE9iamVjdC5rZXlzKHZhbHVlKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGtleSArIFwiOiBcIiArIHZhbHVlW2tleV07XG4gICAgICAgIH0pLmpvaW4oXCIsIFwiKSArIFwiIH1cIjtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHR5cGVzUGx1Z2luKF9mb3JrKSB7XG4gICAgdmFyIFR5cGUgPSB7XG4gICAgICAgIG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdHlwZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgT3JUeXBlKHR5cGVzLm1hcChmdW5jdGlvbiAodHlwZSkgeyByZXR1cm4gVHlwZS5mcm9tKHR5cGUpOyB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZyb206IGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlUeXBlIHx8XG4gICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBJZGVudGl0eVR5cGUgfHxcbiAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdFR5cGUgfHxcbiAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE9yVHlwZSB8fFxuICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgUHJlZGljYXRlVHlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBEZWYgdHlwZSBpcyB1c2VkIGFzIGEgaGVscGVyIGZvciBjb25zdHJ1Y3RpbmcgY29tcG91bmRcbiAgICAgICAgICAgIC8vIGludGVyZmFjZSB0eXBlcyBmb3IgQVNUIG5vZGVzLlxuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGVmKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTdXBwb3J0IFtFbGVtVHlwZV0gc3ludGF4LlxuICAgICAgICAgICAgaWYgKGlzQXJyYXkuY2hlY2sodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvbmx5IG9uZSBlbGVtZW50IHR5cGUgaXMgcGVybWl0dGVkIGZvciB0eXBlZCBhcnJheXNcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlUeXBlKFR5cGUuZnJvbSh2YWx1ZVswXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3VwcG9ydCB7IHNvbWVGaWVsZDogRmllbGRUeXBlLCAuLi4gfSBzeW50YXguXG4gICAgICAgICAgICBpZiAoaXNPYmplY3QuY2hlY2sodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RUeXBlKE9iamVjdC5rZXlzKHZhbHVlKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZChuYW1lLCBUeXBlLmZyb20odmFsdWVbbmFtZV0sIG5hbWUpKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmljZkluZGV4ID0gYnVpbHRJbkN0b3JGbnMuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGJpY2ZJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsdEluQ3RvclR5cGVzW2JpY2ZJbmRleF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIG5hbWVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlVHlwZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBcyBhIGxhc3QgcmVzb3J0LCB0b1R5cGUgcmV0dXJucyBhIHR5cGUgdGhhdCBtYXRjaGVzIGFueSB2YWx1ZSB0aGF0XG4gICAgICAgICAgICAvLyBpcyA9PT0gZnJvbS4gVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBsaXRlcmFsIHZhbHVlcyBsaWtlXG4gICAgICAgICAgICAvLyB0b1R5cGUobnVsbCksIGJ1dCBpdCBoYXMgdGhlIGFkZGl0aW9uYWwgYWR2YW50YWdlIG9mIGFsbG93aW5nXG4gICAgICAgICAgICAvLyB0b1R5cGUgdG8gYmUgYSB0b3RhbCBmdW5jdGlvbi5cbiAgICAgICAgICAgIHJldHVybiBuZXcgSWRlbnRpdHlUeXBlKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gRGVmaW5lIGEgdHlwZSB3aG9zZSBuYW1lIGlzIHJlZ2lzdGVyZWQgaW4gYSBuYW1lc3BhY2UgKHRoZSBkZWZDYWNoZSkgc29cbiAgICAgICAgLy8gdGhhdCBmdXR1cmUgZGVmaW5pdGlvbnMgd2lsbCByZXR1cm4gdGhlIHNhbWUgdHlwZSBnaXZlbiB0aGUgc2FtZSBuYW1lLlxuICAgICAgICAvLyBJbiBwYXJ0aWN1bGFyLCB0aGlzIHN5c3RlbSBhbGxvd3MgZm9yIGNpcmN1bGFyIGFuZCBmb3J3YXJkIGRlZmluaXRpb25zLlxuICAgICAgICAvLyBUaGUgRGVmIG9iamVjdCBkIHJldHVybmVkIGZyb20gVHlwZS5kZWYgbWF5IGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZVxuICAgICAgICAvLyB0eXBlIGQudHlwZSBieSBjYWxsaW5nIG1ldGhvZHMgc3VjaCBhcyBkLmJhc2VzLCBkLmJ1aWxkLCBhbmQgZC5maWVsZC5cbiAgICAgICAgZGVmOiBmdW5jdGlvbiAodHlwZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNPd24uY2FsbChkZWZDYWNoZSwgdHlwZU5hbWUpXG4gICAgICAgICAgICAgICAgPyBkZWZDYWNoZVt0eXBlTmFtZV1cbiAgICAgICAgICAgICAgICA6IGRlZkNhY2hlW3R5cGVOYW1lXSA9IG5ldyBEZWZJbXBsKHR5cGVOYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzRGVmOiBmdW5jdGlvbiAodHlwZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNPd24uY2FsbChkZWZDYWNoZSwgdHlwZU5hbWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgYnVpbHRJbkN0b3JGbnMgPSBbXTtcbiAgICB2YXIgYnVpbHRJbkN0b3JUeXBlcyA9IFtdO1xuICAgIGZ1bmN0aW9uIGRlZkJ1aWx0SW5UeXBlKG5hbWUsIGV4YW1wbGUpIHtcbiAgICAgICAgdmFyIG9ialN0ciA9IG9ialRvU3RyLmNhbGwoZXhhbXBsZSk7XG4gICAgICAgIHZhciB0eXBlID0gbmV3IFByZWRpY2F0ZVR5cGUobmFtZSwgZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBvYmpUb1N0ci5jYWxsKHZhbHVlKSA9PT0gb2JqU3RyOyB9KTtcbiAgICAgICAgaWYgKGV4YW1wbGUgJiYgdHlwZW9mIGV4YW1wbGUuY29uc3RydWN0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgYnVpbHRJbkN0b3JGbnMucHVzaChleGFtcGxlLmNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIGJ1aWx0SW5DdG9yVHlwZXMucHVzaCh0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gICAgLy8gVGhlc2UgdHlwZXMgY2hlY2sgdGhlIHVuZGVybHlpbmcgW1tDbGFzc11dIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW5cbiAgICAvLyB2YWx1ZSwgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIHByb2JsZW1hdGljIHR5cGVvZiBvcGVyYXRvci4gTm90ZSBob3dldmVyXG4gICAgLy8gdGhhdCBubyBzdWJ0eXBpbmcgaXMgY29uc2lkZXJlZDsgc28sIGZvciBpbnN0YW5jZSwgaXNPYmplY3QuY2hlY2tcbiAgICAvLyByZXR1cm5zIGZhbHNlIGZvciBbXSwgLy4vLCBuZXcgRGF0ZSwgYW5kIG51bGwuXG4gICAgdmFyIGlzU3RyaW5nID0gZGVmQnVpbHRJblR5cGUoXCJzdHJpbmdcIiwgXCJ0cnV0aHlcIik7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSBkZWZCdWlsdEluVHlwZShcImZ1bmN0aW9uXCIsIGZ1bmN0aW9uICgpIHsgfSk7XG4gICAgdmFyIGlzQXJyYXkgPSBkZWZCdWlsdEluVHlwZShcImFycmF5XCIsIFtdKTtcbiAgICB2YXIgaXNPYmplY3QgPSBkZWZCdWlsdEluVHlwZShcIm9iamVjdFwiLCB7fSk7XG4gICAgdmFyIGlzUmVnRXhwID0gZGVmQnVpbHRJblR5cGUoXCJSZWdFeHBcIiwgLy4vKTtcbiAgICB2YXIgaXNEYXRlID0gZGVmQnVpbHRJblR5cGUoXCJEYXRlXCIsIG5ldyBEYXRlKCkpO1xuICAgIHZhciBpc051bWJlciA9IGRlZkJ1aWx0SW5UeXBlKFwibnVtYmVyXCIsIDMpO1xuICAgIHZhciBpc0Jvb2xlYW4gPSBkZWZCdWlsdEluVHlwZShcImJvb2xlYW5cIiwgdHJ1ZSk7XG4gICAgdmFyIGlzTnVsbCA9IGRlZkJ1aWx0SW5UeXBlKFwibnVsbFwiLCBudWxsKTtcbiAgICB2YXIgaXNVbmRlZmluZWQgPSBkZWZCdWlsdEluVHlwZShcInVuZGVmaW5lZFwiLCB1bmRlZmluZWQpO1xuICAgIHZhciBidWlsdEluVHlwZXMgPSB7XG4gICAgICAgIHN0cmluZzogaXNTdHJpbmcsXG4gICAgICAgIGZ1bmN0aW9uOiBpc0Z1bmN0aW9uLFxuICAgICAgICBhcnJheTogaXNBcnJheSxcbiAgICAgICAgb2JqZWN0OiBpc09iamVjdCxcbiAgICAgICAgUmVnRXhwOiBpc1JlZ0V4cCxcbiAgICAgICAgRGF0ZTogaXNEYXRlLFxuICAgICAgICBudW1iZXI6IGlzTnVtYmVyLFxuICAgICAgICBib29sZWFuOiBpc0Jvb2xlYW4sXG4gICAgICAgIG51bGw6IGlzTnVsbCxcbiAgICAgICAgdW5kZWZpbmVkOiBpc1VuZGVmaW5lZCxcbiAgICB9O1xuICAgIC8vIEluIG9yZGVyIHRvIHJldHVybiB0aGUgc2FtZSBEZWYgaW5zdGFuY2UgZXZlcnkgdGltZSBUeXBlLmRlZiBpcyBjYWxsZWRcbiAgICAvLyB3aXRoIGEgcGFydGljdWxhciBuYW1lLCB0aG9zZSBpbnN0YW5jZXMgbmVlZCB0byBiZSBzdG9yZWQgaW4gYSBjYWNoZS5cbiAgICB2YXIgZGVmQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZ1bmN0aW9uIGRlZkZyb21WYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB2YXIgdHlwZSA9IHZhbHVlLnR5cGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBoYXNPd24uY2FsbChkZWZDYWNoZSwgdHlwZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZCA9IGRlZkNhY2hlW3R5cGVdO1xuICAgICAgICAgICAgICAgIGlmIChkLmZpbmFsaXplZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBEZWZJbXBsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgICAgICB0c2xpYl8xLl9fZXh0ZW5kcyhEZWZJbXBsLCBfc3VwZXIpO1xuICAgICAgICBmdW5jdGlvbiBEZWZJbXBsKHR5cGVOYW1lKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBuZXcgUHJlZGljYXRlVHlwZSh0eXBlTmFtZSwgZnVuY3Rpb24gKHZhbHVlLCBkZWVwKSB7IHJldHVybiBfdGhpcy5jaGVjayh2YWx1ZSwgZGVlcCk7IH0pLCB0eXBlTmFtZSkgfHwgdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfdGhpcztcbiAgICAgICAgfVxuICAgICAgICBEZWZJbXBsLnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicHJlbWF0dXJlbHkgY2hlY2tpbmcgdW5maW5hbGl6ZWQgdHlwZSBcIiArIHRoaXMudHlwZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQSBEZWYgdHlwZSBjYW4gb25seSBtYXRjaCBhbiBvYmplY3QgdmFsdWUuXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHZEZWYgPSBkZWZGcm9tVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgaWYgKCF2RGVmKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgY291bGRuJ3QgaW5mZXIgdGhlIERlZiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHZhbHVlLFxuICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBleHBlY3RlZCBpdCB0byBiZSBhIFNvdXJjZUxvY2F0aW9uIG9yIGEgUG9zaXRpb24sIGl0IHdhc1xuICAgICAgICAgICAgICAgIC8vIHByb2JhYmx5IGp1c3QgbWlzc2luZyBhIFwidHlwZVwiIGZpZWxkIChiZWNhdXNlIEVzcHJpbWEgZG9lcyBub3RcbiAgICAgICAgICAgICAgICAvLyBhc3NpZ24gYSB0eXBlIHByb3BlcnR5IHRvIHN1Y2ggbm9kZXMpLiBCZSBvcHRpbWlzdGljIGFuZCBsZXRcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmNoZWNrQWxsRmllbGRzIG1ha2UgdGhlIGZpbmFsIGRlY2lzaW9uLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnR5cGVOYW1lID09PSBcIlNvdXJjZUxvY2F0aW9uXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlTmFtZSA9PT0gXCJQb3NpdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrQWxsRmllbGRzKHZhbHVlLCBkZWVwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ2FsbGluZyB0aGlzLmNoZWNrQWxsRmllbGRzIGZvciBhbnkgb3RoZXIgdHlwZSBvZiBub2RlIGlzIGJvdGhcbiAgICAgICAgICAgICAgICAvLyBiYWQgZm9yIHBlcmZvcm1hbmNlIGFuZCB3YXkgdG9vIGZvcmdpdmluZy5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBjaGVja2luZyBkZWVwbHkgYW5kIHZEZWYgPT09IHRoaXMsIHRoZW4gd2Ugb25seSBuZWVkIHRvIGNhbGxcbiAgICAgICAgICAgIC8vIGNoZWNrQWxsRmllbGRzIG9uY2UuIENhbGxpbmcgY2hlY2tBbGxGaWVsZHMgaXMgdG9vIHN0cmljdCB3aGVuIGRlZXBcbiAgICAgICAgICAgIC8vIGlzIGZhbHNlLCBiZWNhdXNlIHRoZW4gd2Ugb25seSBjYXJlIGFib3V0IHRoaXMuaXNTdXBlcnR5cGVPZih2RGVmKS5cbiAgICAgICAgICAgIGlmIChkZWVwICYmIHZEZWYgPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGVja0FsbEZpZWxkcyh2YWx1ZSwgZGVlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbiBtb3N0IGNhc2VzIHdlIHJlbHkgZXhjbHVzaXZlbHkgb24gaXNTdXBlcnR5cGVPZiB0byBtYWtlIE8oMSlcbiAgICAgICAgICAgIC8vIHN1YnR5cGluZyBkZXRlcm1pbmF0aW9ucy4gVGhpcyBzdWZmaWNlcyBpbiBtb3N0IHNpdHVhdGlvbnMgb3V0c2lkZVxuICAgICAgICAgICAgLy8gb2YgdW5pdCB0ZXN0cywgc2luY2UgaW50ZXJmYWNlIGNvbmZvcm1hbmNlIGlzIGNoZWNrZWQgd2hlbmV2ZXIgbmV3XG4gICAgICAgICAgICAvLyBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgdXNpbmcgYnVpbGRlciBmdW5jdGlvbnMuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTdXBlcnR5cGVPZih2RGVmKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBleGNlcHRpb24gaXMgd2hlbiBkZWVwIGlzIHRydWU7IHRoZW4sIHdlIHJlY3Vyc2l2ZWx5IGNoZWNrIGFsbFxuICAgICAgICAgICAgLy8gZmllbGRzLlxuICAgICAgICAgICAgaWYgKCFkZWVwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBVc2UgdGhlIG1vcmUgc3BlY2lmaWMgRGVmICh2RGVmKSB0byBwZXJmb3JtIHRoZSBkZWVwIGNoZWNrLCBidXRcbiAgICAgICAgICAgIC8vIHNoYWxsb3ctY2hlY2sgZmllbGRzIGRlZmluZWQgYnkgdGhlIGxlc3Mgc3BlY2lmaWMgRGVmICh0aGlzKS5cbiAgICAgICAgICAgIHJldHVybiB2RGVmLmNoZWNrQWxsRmllbGRzKHZhbHVlLCBkZWVwKVxuICAgICAgICAgICAgICAgICYmIHRoaXMuY2hlY2tBbGxGaWVsZHModmFsdWUsIGZhbHNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgRGVmSW1wbC5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGJ1aWxkUGFyYW1zID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGJ1aWxkUGFyYW1zW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDYWxsaW5nIERlZi5wcm90b3R5cGUuYnVpbGQgbXVsdGlwbGUgdGltZXMgaGFzIHRoZSBlZmZlY3Qgb2YgbWVyZWx5XG4gICAgICAgICAgICAvLyByZWRlZmluaW5nIHRoaXMgcHJvcGVydHkuXG4gICAgICAgICAgICB0aGlzLmJ1aWxkUGFyYW1zID0gYnVpbGRQYXJhbXM7XG4gICAgICAgICAgICBpZiAodGhpcy5idWlsZGFibGUpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIERlZiBpcyBhbHJlYWR5IGJ1aWxkYWJsZSwgdXBkYXRlIHNlbGYuYnVpbGRQYXJhbXMgYW5kXG4gICAgICAgICAgICAgICAgLy8gY29udGludWUgdXNpbmcgdGhlIG9sZCBidWlsZGVyIGZ1bmN0aW9uLlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRXZlcnkgYnVpbGRhYmxlIHR5cGUgd2lsbCBoYXZlIGl0cyBcInR5cGVcIiBmaWVsZCBmaWxsZWQgaW5cbiAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkuIFRoaXMgaW5jbHVkZXMgdHlwZXMgdGhhdCBhcmUgbm90IHN1YnR5cGVzIG9mIE5vZGUsXG4gICAgICAgICAgICAvLyBsaWtlIFNvdXJjZUxvY2F0aW9uLCBidXQgdGhhdCBzZWVtcyBoYXJtbGVzcyAoVE9ETz8pLlxuICAgICAgICAgICAgdGhpcy5maWVsZChcInR5cGVcIiwgU3RyaW5nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy50eXBlTmFtZTsgfSk7XG4gICAgICAgICAgICAvLyBPdmVycmlkZSBEcC5idWlsZGFibGUgZm9yIHRoaXMgRGVmIGluc3RhbmNlLlxuICAgICAgICAgICAgdGhpcy5idWlsZGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIGFkZFBhcmFtID0gZnVuY3Rpb24gKGJ1aWx0LCBwYXJhbSwgYXJnLCBpc0FyZ0F2YWlsYWJsZSkge1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChidWlsdCwgcGFyYW0pKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgdmFyIGFsbCA9IF90aGlzLmFsbEZpZWxkcztcbiAgICAgICAgICAgICAgICBpZiAoIWhhc093bi5jYWxsKGFsbCwgcGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiICsgcGFyYW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBhbGxbcGFyYW1dO1xuICAgICAgICAgICAgICAgIHZhciB0eXBlID0gZmllbGQudHlwZTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJnQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZC5kZWZhdWx0Rm4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXhwb3NlIHRoZSBwYXJ0aWFsbHktYnVpbHQgb2JqZWN0IHRvIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGFzIGl0cyBgdGhpc2Agb2JqZWN0LlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRGbi5jYWxsKGJ1aWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gXCJubyB2YWx1ZSBvciBkZWZhdWx0IGZ1bmN0aW9uIGdpdmVuIGZvciBmaWVsZCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShwYXJhbSkgKyBcIiBvZiBcIiArIF90aGlzLnR5cGVOYW1lICsgXCIoXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuYnVpbGRQYXJhbXMubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbFtuYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oXCIsIFwiKSArIFwiKVwiO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdHlwZS5jaGVjayh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNoYWxsb3dTdHJpbmdpZnkodmFsdWUpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGRvZXMgbm90IG1hdGNoIGZpZWxkIFwiICsgZmllbGQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIgb2YgdHlwZSBcIiArIF90aGlzLnR5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVpbHRbcGFyYW1dID0gdmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ2FsbGluZyB0aGUgYnVpbGRlciBmdW5jdGlvbiB3aWxsIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgRGVmLFxuICAgICAgICAgICAgLy8gd2l0aCBwb3NpdGlvbmFsIGFyZ3VtZW50cyBtYXBwZWQgdG8gdGhlIGZpZWxkcyBvcmlnaW5hbCBwYXNzZWQgdG8gLmJ1aWxkLlxuICAgICAgICAgICAgLy8gSWYgbm90IGVub3VnaCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHJlbWFpbmluZyBmaWVsZHNcbiAgICAgICAgICAgIC8vIHdpbGwgYmUgdXNlZC5cbiAgICAgICAgICAgIHZhciBidWlsZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYXJnYyA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmICghX3RoaXMuZmluYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImF0dGVtcHRpbmcgdG8gaW5zdGFudGlhdGUgdW5maW5hbGl6ZWQgdHlwZSBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy50eXBlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBidWlsdCA9IE9iamVjdC5jcmVhdGUobm9kZVByb3RvdHlwZSk7XG4gICAgICAgICAgICAgICAgX3RoaXMuYnVpbGRQYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0sIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBhcmdjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbShidWlsdCwgcGFyYW0sIGFyZ3NbaV0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW0oYnVpbHQsIHBhcmFtLCBudWxsLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhfdGhpcy5hbGxGaWVsZHMpLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW0oYnVpbHQsIHBhcmFtLCBudWxsLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIFwidHlwZVwiIGZpZWxkIHdhcyBmaWxsZWQgYXV0b21hdGljYWxseS5cbiAgICAgICAgICAgICAgICBpZiAoYnVpbHQudHlwZSAhPT0gX3RoaXMudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYnVpbHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gQ2FsbGluZyAuZnJvbSBvbiB0aGUgYnVpbGRlciBmdW5jdGlvbiB3aWxsIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgRGVmLFxuICAgICAgICAgICAgLy8gdXNpbmcgZmllbGQgdmFsdWVzIGZyb20gdGhlIHBhc3NlZCBvYmplY3QuIEZvciBmaWVsZHMgbWlzc2luZyBmcm9tIHRoZSBwYXNzZWQgb2JqZWN0LFxuICAgICAgICAgICAgLy8gdGhlaXIgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHVzZWQuXG4gICAgICAgICAgICBidWlsZGVyLmZyb20gPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfdGhpcy5maW5hbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXR0ZW1wdGluZyB0byBpbnN0YW50aWF0ZSB1bmZpbmFsaXplZCB0eXBlIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnR5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGJ1aWx0ID0gT2JqZWN0LmNyZWF0ZShub2RlUHJvdG90eXBlKTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhfdGhpcy5hbGxGaWVsZHMpLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChvYmosIHBhcmFtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW0oYnVpbHQsIHBhcmFtLCBvYmpbcGFyYW1dLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtKGJ1aWx0LCBwYXJhbSwgbnVsbCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIFwidHlwZVwiIGZpZWxkIHdhcyBmaWxsZWQgYXV0b21hdGljYWxseS5cbiAgICAgICAgICAgICAgICBpZiAoYnVpbHQudHlwZSAhPT0gX3RoaXMudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYnVpbHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGJ1aWxkZXJzLCBnZXRCdWlsZGVyTmFtZSh0aGlzLnR5cGVOYW1lKSwge1xuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGJ1aWxkZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFRoZSByZWFzb24gZmllbGRzIGFyZSBzcGVjaWZpZWQgdXNpbmcgLmZpZWxkKC4uLikgaW5zdGVhZCBvZiBhbiBvYmplY3RcbiAgICAgICAgLy8gbGl0ZXJhbCBzeW50YXggaXMgc29tZXdoYXQgc3VidGxlOiB0aGUgb2JqZWN0IGxpdGVyYWwgc3ludGF4IHdvdWxkXG4gICAgICAgIC8vIHN1cHBvcnQgb25seSBvbmUga2V5IGFuZCBvbmUgdmFsdWUsIGJ1dCB3aXRoIC5maWVsZCguLi4pIHdlIGNhbiBwYXNzXG4gICAgICAgIC8vIGFueSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGZpZWxkLlxuICAgICAgICBEZWZJbXBsLnByb3RvdHlwZS5maWVsZCA9IGZ1bmN0aW9uIChuYW1lLCB0eXBlLCBkZWZhdWx0Rm4sIGhpZGRlbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIklnbm9yaW5nIGF0dGVtcHQgdG8gcmVkZWZpbmUgZmllbGQgXCIgK1xuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuYW1lKSArIFwiIG9mIGZpbmFsaXplZCB0eXBlIFwiICtcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy50eXBlTmFtZSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vd25GaWVsZHNbbmFtZV0gPSBuZXcgRmllbGQobmFtZSwgVHlwZS5mcm9tKHR5cGUpLCBkZWZhdWx0Rm4sIGhpZGRlbik7XG4gICAgICAgICAgICByZXR1cm4gdGhpczsgLy8gRm9yIGNoYWluaW5nLlxuICAgICAgICB9O1xuICAgICAgICBEZWZJbXBsLnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAvLyBJdCdzIG5vdCBhbiBlcnJvciB0byBmaW5hbGl6ZSBhIHR5cGUgbW9yZSB0aGFuIG9uY2UsIGJ1dCBvbmx5IHRoZVxuICAgICAgICAgICAgLy8gZmlyc3QgY2FsbCB0byAuZmluYWxpemUgZG9lcyBhbnl0aGluZy5cbiAgICAgICAgICAgIGlmICghdGhpcy5maW5hbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYWxsRmllbGRzID0gdGhpcy5hbGxGaWVsZHM7XG4gICAgICAgICAgICAgICAgdmFyIGFsbFN1cGVydHlwZXMgPSB0aGlzLmFsbFN1cGVydHlwZXM7XG4gICAgICAgICAgICAgICAgdGhpcy5iYXNlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGVmID0gZGVmQ2FjaGVbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWYgaW5zdGFuY2VvZiBEZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZi5maW5hbGl6ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKGFsbEZpZWxkcywgZGVmLmFsbEZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQoYWxsU3VwZXJ0eXBlcywgZGVmLmFsbFN1cGVydHlwZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBcInVua25vd24gc3VwZXJ0eXBlIG5hbWUgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBmb3Igc3VidHlwZSBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoX3RoaXMudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyBXYXJuIGlmIGZpZWxkcyBhcmUgb3ZlcnJpZGRlbiB3aXRoIGluY29tcGF0aWJsZSB0eXBlcy5cbiAgICAgICAgICAgICAgICBleHRlbmQoYWxsRmllbGRzLCB0aGlzLm93bkZpZWxkcyk7XG4gICAgICAgICAgICAgICAgYWxsU3VwZXJ0eXBlc1t0aGlzLnR5cGVOYW1lXSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgdGhpcy5maWVsZE5hbWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgZmllbGROYW1lIGluIGFsbEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoYWxsRmllbGRzLCBmaWVsZE5hbWUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhYWxsRmllbGRzW2ZpZWxkTmFtZV0uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpZWxkTmFtZXMucHVzaChmaWVsZE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFR5cGVzIGFyZSBleHBvcnRlZCBvbmx5IG9uY2UgdGhleSBoYXZlIGJlZW4gZmluYWxpemVkLlxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuYW1lZFR5cGVzLCB0aGlzLnR5cGVOYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnR5cGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gQSBsaW5lYXJpemF0aW9uIG9mIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkuXG4gICAgICAgICAgICAgICAgcG9wdWxhdGVTdXBlcnR5cGVMaXN0KHRoaXMudHlwZU5hbWUsIHRoaXMuc3VwZXJ0eXBlTGlzdCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRhYmxlICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJ0eXBlTGlzdC5sYXN0SW5kZXhPZihcIkV4cHJlc3Npb25cIikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICB3cmFwRXhwcmVzc2lvbkJ1aWxkZXJXaXRoU3RhdGVtZW50KHRoaXMudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIERlZkltcGw7XG4gICAgfShEZWYpKTtcbiAgICAvLyBOb3RlIHRoYXQgdGhlIGxpc3QgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBhIGNvcHkgb2YgdGhlIGludGVybmFsXG4gICAgLy8gc3VwZXJ0eXBlTGlzdCwgKndpdGhvdXQqIHRoZSB0eXBlTmFtZSBpdHNlbGYgYXMgdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAgZnVuY3Rpb24gZ2V0U3VwZXJ0eXBlTmFtZXModHlwZU5hbWUpIHtcbiAgICAgICAgaWYgKCFoYXNPd24uY2FsbChkZWZDYWNoZSwgdHlwZU5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGQgPSBkZWZDYWNoZVt0eXBlTmFtZV07XG4gICAgICAgIGlmIChkLmZpbmFsaXplZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkLnN1cGVydHlwZUxpc3Quc2xpY2UoMSk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IG1hcHBpbmcgZnJvbSBldmVyeSBrbm93biB0eXBlIGluIHRoZSBkZWZDYWNoZSB0byB0aGVcbiAgICAvLyBtb3N0IHNwZWNpZmljIHN1cGVydHlwZSB3aG9zZSBuYW1lIGlzIGFuIG93biBwcm9wZXJ0eSBvZiB0aGUgY2FuZGlkYXRlc1xuICAgIC8vIG9iamVjdC5cbiAgICBmdW5jdGlvbiBjb21wdXRlU3VwZXJ0eXBlTG9va3VwVGFibGUoY2FuZGlkYXRlcykge1xuICAgICAgICB2YXIgdGFibGUgPSB7fTtcbiAgICAgICAgdmFyIHR5cGVOYW1lcyA9IE9iamVjdC5rZXlzKGRlZkNhY2hlKTtcbiAgICAgICAgdmFyIHR5cGVOYW1lQ291bnQgPSB0eXBlTmFtZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVOYW1lQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgdmFyIHR5cGVOYW1lID0gdHlwZU5hbWVzW2ldO1xuICAgICAgICAgICAgdmFyIGQgPSBkZWZDYWNoZVt0eXBlTmFtZV07XG4gICAgICAgICAgICBpZiAoZC5maW5hbGl6ZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIiArIHR5cGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZC5zdXBlcnR5cGVMaXN0Lmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1cGVyVHlwZU5hbWUgPSBkLnN1cGVydHlwZUxpc3Rbal07XG4gICAgICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGNhbmRpZGF0ZXMsIHN1cGVyVHlwZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlW3R5cGVOYW1lXSA9IHN1cGVyVHlwZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuICAgIHZhciBidWlsZGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgLy8gVGhpcyBvYmplY3QgaXMgdXNlZCBhcyBwcm90b3R5cGUgZm9yIGFueSBub2RlIGNyZWF0ZWQgYnkgYSBidWlsZGVyLlxuICAgIHZhciBub2RlUHJvdG90eXBlID0ge307XG4gICAgLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGRlZmluZSBhIG5ldyBtZXRob2QgdG8gYmUgc2hhcmVkIGJ5IGFsbCBBU1RcbiAgICAvLyBub2Rlcy4gVGhlIHJlcGxhY2VkIG1ldGhvZCAoaWYgYW55KSBpcyByZXR1cm5lZCBmb3IgZWFzeSB3cmFwcGluZy5cbiAgICBmdW5jdGlvbiBkZWZpbmVNZXRob2QobmFtZSwgZnVuYykge1xuICAgICAgICB2YXIgb2xkID0gbm9kZVByb3RvdHlwZVtuYW1lXTtcbiAgICAgICAgLy8gUGFzcyB1bmRlZmluZWQgYXMgZnVuYyB0byBkZWxldGUgbm9kZVByb3RvdHlwZVtuYW1lXS5cbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkLmNoZWNrKGZ1bmMpKSB7XG4gICAgICAgICAgICBkZWxldGUgbm9kZVByb3RvdHlwZVtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlzRnVuY3Rpb24uYXNzZXJ0KGZ1bmMpO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGVQcm90b3R5cGUsIG5hbWUsIHtcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9sZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0QnVpbGRlck5hbWUodHlwZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVOYW1lLnJlcGxhY2UoL15bQS1aXSsvLCBmdW5jdGlvbiAodXBwZXJDYXNlUHJlZml4KSB7XG4gICAgICAgICAgICB2YXIgbGVuID0gdXBwZXJDYXNlUHJlZml4Lmxlbmd0aDtcbiAgICAgICAgICAgIHN3aXRjaCAobGVuKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIGluaXRpYWwgY2FwaXRhbCBsZXR0ZXIsIGp1c3QgbG93ZXItY2FzZSBpdC5cbiAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiB1cHBlckNhc2VQcmVmaXgudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgaW5pdGlhbCBjYXBpdGFsIGxldHRlciwgbG93ZXItY2FzZVxuICAgICAgICAgICAgICAgICAgICAvLyBhbGwgYnV0IHRoZSBsYXN0IG9uZSwgc28gdGhhdCBYTUxEZWZhdWx0RGVjbGFyYXRpb24gKGZvclxuICAgICAgICAgICAgICAgICAgICAvLyBleGFtcGxlKSBiZWNvbWVzIHhtbERlZmF1bHREZWNsYXJhdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVwcGVyQ2FzZVByZWZpeC5zbGljZSgwLCBsZW4gLSAxKS50b0xvd2VyQ2FzZSgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyQ2FzZVByZWZpeC5jaGFyQXQobGVuIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTdGF0ZW1lbnRCdWlsZGVyTmFtZSh0eXBlTmFtZSkge1xuICAgICAgICB0eXBlTmFtZSA9IGdldEJ1aWxkZXJOYW1lKHR5cGVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHR5cGVOYW1lLnJlcGxhY2UoLyhFeHByZXNzaW9uKT8kLywgXCJTdGF0ZW1lbnRcIik7XG4gICAgfVxuICAgIHZhciBuYW1lZFR5cGVzID0ge307XG4gICAgLy8gTGlrZSBPYmplY3Qua2V5cywgYnV0IGF3YXJlIG9mIHdoYXQgZmllbGRzIGVhY2ggQVNUIHR5cGUgc2hvdWxkIGhhdmUuXG4gICAgZnVuY3Rpb24gZ2V0RmllbGROYW1lcyhvYmplY3QpIHtcbiAgICAgICAgdmFyIGQgPSBkZWZGcm9tVmFsdWUob2JqZWN0KTtcbiAgICAgICAgaWYgKGQpIHtcbiAgICAgICAgICAgIHJldHVybiBkLmZpZWxkTmFtZXMuc2xpY2UoMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwidHlwZVwiIGluIG9iamVjdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGlkIG5vdCByZWNvZ25pemUgb2JqZWN0IG9mIHR5cGUgXCIgK1xuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9iamVjdC50eXBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCk7XG4gICAgfVxuICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IHByb3BlcnR5LCB0YWtpbmcgb2JqZWN0LnR5cGUgYW5kIGRlZmF1bHRcbiAgICAvLyBmdW5jdGlvbnMgaW50byBhY2NvdW50LlxuICAgIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUob2JqZWN0LCBmaWVsZE5hbWUpIHtcbiAgICAgICAgdmFyIGQgPSBkZWZGcm9tVmFsdWUob2JqZWN0KTtcbiAgICAgICAgaWYgKGQpIHtcbiAgICAgICAgICAgIHZhciBmaWVsZCA9IGQuYWxsRmllbGRzW2ZpZWxkTmFtZV07XG4gICAgICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQuZ2V0VmFsdWUob2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdFtmaWVsZE5hbWVdO1xuICAgIH1cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGRlZmluZWQgZmllbGRzIG9mIGFuIG9iamVjdCwgaW5jbHVkaW5nIHRob3NlIG1pc3NpbmdcbiAgICAvLyBvciB1bmRlZmluZWQsIHBhc3NpbmcgZWFjaCBmaWVsZCBuYW1lIGFuZCBlZmZlY3RpdmUgdmFsdWUgKGFzIHJldHVybmVkXG4gICAgLy8gYnkgZ2V0RmllbGRWYWx1ZSkgdG8gdGhlIGNhbGxiYWNrLiBJZiB0aGUgb2JqZWN0IGhhcyBubyBjb3JyZXNwb25kaW5nXG4gICAgLy8gRGVmLCB0aGUgY2FsbGJhY2sgd2lsbCBuZXZlciBiZSBjYWxsZWQuXG4gICAgZnVuY3Rpb24gZWFjaEZpZWxkKG9iamVjdCwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgZ2V0RmllbGROYW1lcyhvYmplY3QpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcywgbmFtZSwgZ2V0RmllbGRWYWx1ZShvYmplY3QsIG5hbWUpKTtcbiAgICAgICAgfSwgY29udGV4dCk7XG4gICAgfVxuICAgIC8vIFNpbWlsYXIgdG8gZWFjaEZpZWxkLCBleGNlcHQgdGhhdCBpdGVyYXRpb24gc3RvcHMgYXMgc29vbiBhcyB0aGVcbiAgICAvLyBjYWxsYmFjayByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLiBMaWtlIEFycmF5LnByb3RvdHlwZS5zb21lLCB0aGUgZmluYWxcbiAgICAvLyByZXN1bHQgaXMgZWl0aGVyIHRydWUgb3IgZmFsc2UgdG8gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNhbGxiYWNrXG4gICAgLy8gcmV0dXJuZWQgdHJ1ZSBmb3IgYW55IGVsZW1lbnQgb3Igbm90LlxuICAgIGZ1bmN0aW9uIHNvbWVGaWVsZChvYmplY3QsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBnZXRGaWVsZE5hbWVzKG9iamVjdCkuc29tZShmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwodGhpcywgbmFtZSwgZ2V0RmllbGRWYWx1ZShvYmplY3QsIG5hbWUpKTtcbiAgICAgICAgfSwgY29udGV4dCk7XG4gICAgfVxuICAgIC8vIEFkZHMgYW4gYWRkaXRpb25hbCBidWlsZGVyIGZvciBFeHByZXNzaW9uIHN1YnR5cGVzXG4gICAgLy8gdGhhdCB3cmFwcyB0aGUgYnVpbHQgRXhwcmVzc2lvbiBpbiBhbiBFeHByZXNzaW9uU3RhdGVtZW50cy5cbiAgICBmdW5jdGlvbiB3cmFwRXhwcmVzc2lvbkJ1aWxkZXJXaXRoU3RhdGVtZW50KHR5cGVOYW1lKSB7XG4gICAgICAgIHZhciB3cmFwcGVyTmFtZSA9IGdldFN0YXRlbWVudEJ1aWxkZXJOYW1lKHR5cGVOYW1lKTtcbiAgICAgICAgLy8gc2tpcCBpZiB0aGUgYnVpbGRlciBhbHJlYWR5IGV4aXN0c1xuICAgICAgICBpZiAoYnVpbGRlcnNbd3JhcHBlck5hbWVdKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyB0aGUgYnVpbGRlciBmdW5jdGlvbiB0byB3cmFwIHdpdGggYnVpbGRlcnMuRXhwcmVzc2lvblN0YXRlbWVudFxuICAgICAgICB2YXIgd3JhcHBlZCA9IGJ1aWxkZXJzW2dldEJ1aWxkZXJOYW1lKHR5cGVOYW1lKV07XG4gICAgICAgIC8vIHNraXAgaWYgdGhlcmUgaXMgbm90aGluZyB0byB3cmFwXG4gICAgICAgIGlmICghd3JhcHBlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGJ1aWxkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlcnMuZXhwcmVzc2lvblN0YXRlbWVudCh3cmFwcGVkLmFwcGx5KGJ1aWxkZXJzLCBhcmdzKSk7XG4gICAgICAgIH07XG4gICAgICAgIGJ1aWxkZXIuZnJvbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBidWlsZGVycy5leHByZXNzaW9uU3RhdGVtZW50KHdyYXBwZWQuZnJvbS5hcHBseShidWlsZGVycywgYXJncykpO1xuICAgICAgICB9O1xuICAgICAgICBidWlsZGVyc1t3cmFwcGVyTmFtZV0gPSBidWlsZGVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3B1bGF0ZVN1cGVydHlwZUxpc3QodHlwZU5hbWUsIGxpc3QpIHtcbiAgICAgICAgbGlzdC5sZW5ndGggPSAwO1xuICAgICAgICBsaXN0LnB1c2godHlwZU5hbWUpO1xuICAgICAgICB2YXIgbGFzdFNlZW4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKHZhciBwb3MgPSAwOyBwb3MgPCBsaXN0Lmxlbmd0aDsgKytwb3MpIHtcbiAgICAgICAgICAgIHR5cGVOYW1lID0gbGlzdFtwb3NdO1xuICAgICAgICAgICAgdmFyIGQgPSBkZWZDYWNoZVt0eXBlTmFtZV07XG4gICAgICAgICAgICBpZiAoZC5maW5hbGl6ZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB3ZSBzYXcgdHlwZU5hbWUgZWFybGllciBpbiB0aGUgYnJlYWR0aC1maXJzdCB0cmF2ZXJzYWwsXG4gICAgICAgICAgICAvLyBkZWxldGUgdGhlIGxhc3Qtc2VlbiBvY2N1cnJlbmNlLlxuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGxhc3RTZWVuLCB0eXBlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbGlzdFtsYXN0U2Vlblt0eXBlTmFtZV1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVjb3JkIHRoZSBuZXcgaW5kZXggb2YgdGhlIGxhc3Qtc2VlbiBvY2N1cnJlbmNlIG9mIHR5cGVOYW1lLlxuICAgICAgICAgICAgbGFzdFNlZW5bdHlwZU5hbWVdID0gcG9zO1xuICAgICAgICAgICAgLy8gRW5xdWV1ZSB0aGUgYmFzZSBuYW1lcyBvZiB0aGlzIHR5cGUuXG4gICAgICAgICAgICBsaXN0LnB1c2guYXBwbHkobGlzdCwgZC5iYXNlTmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvbXBhY3Rpb24gbG9vcCB0byByZW1vdmUgYXJyYXkgaG9sZXMuXG4gICAgICAgIGZvciAodmFyIHRvID0gMCwgZnJvbSA9IHRvLCBsZW4gPSBsaXN0Lmxlbmd0aDsgZnJvbSA8IGxlbjsgKytmcm9tKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwobGlzdCwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICBsaXN0W3RvKytdID0gbGlzdFtmcm9tXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsaXN0Lmxlbmd0aCA9IHRvO1xuICAgIH1cbiAgICBmdW5jdGlvbiBleHRlbmQoaW50bywgZnJvbSkge1xuICAgICAgICBPYmplY3Qua2V5cyhmcm9tKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICBpbnRvW25hbWVdID0gZnJvbVtuYW1lXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBpbnRvO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5hbGl6ZSgpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZGVmQ2FjaGUpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIGRlZkNhY2hlW25hbWVdLmZpbmFsaXplKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBUeXBlOiBUeXBlLFxuICAgICAgICBidWlsdEluVHlwZXM6IGJ1aWx0SW5UeXBlcyxcbiAgICAgICAgZ2V0U3VwZXJ0eXBlTmFtZXM6IGdldFN1cGVydHlwZU5hbWVzLFxuICAgICAgICBjb21wdXRlU3VwZXJ0eXBlTG9va3VwVGFibGU6IGNvbXB1dGVTdXBlcnR5cGVMb29rdXBUYWJsZSxcbiAgICAgICAgYnVpbGRlcnM6IGJ1aWxkZXJzLFxuICAgICAgICBkZWZpbmVNZXRob2Q6IGRlZmluZU1ldGhvZCxcbiAgICAgICAgZ2V0QnVpbGRlck5hbWU6IGdldEJ1aWxkZXJOYW1lLFxuICAgICAgICBnZXRTdGF0ZW1lbnRCdWlsZGVyTmFtZTogZ2V0U3RhdGVtZW50QnVpbGRlck5hbWUsXG4gICAgICAgIG5hbWVkVHlwZXM6IG5hbWVkVHlwZXMsXG4gICAgICAgIGdldEZpZWxkTmFtZXM6IGdldEZpZWxkTmFtZXMsXG4gICAgICAgIGdldEZpZWxkVmFsdWU6IGdldEZpZWxkVmFsdWUsXG4gICAgICAgIGVhY2hGaWVsZDogZWFjaEZpZWxkLFxuICAgICAgICBzb21lRmllbGQ6IHNvbWVGaWVsZCxcbiAgICAgICAgZmluYWxpemU6IGZpbmFsaXplLFxuICAgIH07XG59XG5leHBvcnRzLmRlZmF1bHQgPSB0eXBlc1BsdWdpbjtcbjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy52aXNpdCA9IGV4cG9ydHMudXNlID0gZXhwb3J0cy5UeXBlID0gZXhwb3J0cy5zb21lRmllbGQgPSBleHBvcnRzLlBhdGhWaXNpdG9yID0gZXhwb3J0cy5QYXRoID0gZXhwb3J0cy5Ob2RlUGF0aCA9IGV4cG9ydHMubmFtZWRUeXBlcyA9IGV4cG9ydHMuZ2V0U3VwZXJ0eXBlTmFtZXMgPSBleHBvcnRzLmdldEZpZWxkVmFsdWUgPSBleHBvcnRzLmdldEZpZWxkTmFtZXMgPSBleHBvcnRzLmdldEJ1aWxkZXJOYW1lID0gZXhwb3J0cy5maW5hbGl6ZSA9IGV4cG9ydHMuZWFjaEZpZWxkID0gZXhwb3J0cy5kZWZpbmVNZXRob2QgPSBleHBvcnRzLmJ1aWx0SW5UeXBlcyA9IGV4cG9ydHMuYnVpbGRlcnMgPSBleHBvcnRzLmFzdE5vZGVzQXJlRXF1aXZhbGVudCA9IHZvaWQgMDtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIGZvcmtfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2ZvcmtcIikpO1xudmFyIGNvcmVfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9jb3JlXCIpKTtcbnZhciBlczZfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9lczZcIikpO1xudmFyIGVzN18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZGVmL2VzN1wiKSk7XG52YXIgZXMyMDIwXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvZXMyMDIwXCIpKTtcbnZhciBqc3hfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9qc3hcIikpO1xudmFyIGZsb3dfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9mbG93XCIpKTtcbnZhciBlc3ByaW1hXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvZXNwcmltYVwiKSk7XG52YXIgYmFiZWxfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9iYWJlbFwiKSk7XG52YXIgdHlwZXNjcmlwdF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZGVmL3R5cGVzY3JpcHRcIikpO1xudmFyIGVzX3Byb3Bvc2Fsc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZGVmL2VzLXByb3Bvc2Fsc1wiKSk7XG52YXIgbmFtZWRUeXBlc18xID0gcmVxdWlyZShcIi4vZ2VuL25hbWVkVHlwZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJuYW1lZFR5cGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuYW1lZFR5cGVzXzEubmFtZWRUeXBlczsgfSB9KTtcbnZhciBfYSA9IGZvcmtfMS5kZWZhdWx0KFtcbiAgICAvLyBUaGlzIGNvcmUgbW9kdWxlIG9mIEFTVCB0eXBlcyBjYXB0dXJlcyBFUzUgYXMgaXQgaXMgcGFyc2VkIHRvZGF5IGJ5XG4gICAgLy8gZ2l0Oi8vZ2l0aHViLmNvbS9hcml5YS9lc3ByaW1hLmdpdCNtYXN0ZXIuXG4gICAgY29yZV8xLmRlZmF1bHQsXG4gICAgLy8gRmVlbCBmcmVlIHRvIGFkZCB0byBvciByZW1vdmUgZnJvbSB0aGlzIGxpc3Qgb2YgZXh0ZW5zaW9uIG1vZHVsZXMgdG9cbiAgICAvLyBjb25maWd1cmUgdGhlIHByZWNpc2UgdHlwZSBoaWVyYXJjaHkgdGhhdCB5b3UgbmVlZC5cbiAgICBlczZfMS5kZWZhdWx0LFxuICAgIGVzN18xLmRlZmF1bHQsXG4gICAgZXMyMDIwXzEuZGVmYXVsdCxcbiAgICBqc3hfMS5kZWZhdWx0LFxuICAgIGZsb3dfMS5kZWZhdWx0LFxuICAgIGVzcHJpbWFfMS5kZWZhdWx0LFxuICAgIGJhYmVsXzEuZGVmYXVsdCxcbiAgICB0eXBlc2NyaXB0XzEuZGVmYXVsdCxcbiAgICBlc19wcm9wb3NhbHNfMS5kZWZhdWx0LFxuXSksIGFzdE5vZGVzQXJlRXF1aXZhbGVudCA9IF9hLmFzdE5vZGVzQXJlRXF1aXZhbGVudCwgYnVpbGRlcnMgPSBfYS5idWlsZGVycywgYnVpbHRJblR5cGVzID0gX2EuYnVpbHRJblR5cGVzLCBkZWZpbmVNZXRob2QgPSBfYS5kZWZpbmVNZXRob2QsIGVhY2hGaWVsZCA9IF9hLmVhY2hGaWVsZCwgZmluYWxpemUgPSBfYS5maW5hbGl6ZSwgZ2V0QnVpbGRlck5hbWUgPSBfYS5nZXRCdWlsZGVyTmFtZSwgZ2V0RmllbGROYW1lcyA9IF9hLmdldEZpZWxkTmFtZXMsIGdldEZpZWxkVmFsdWUgPSBfYS5nZXRGaWVsZFZhbHVlLCBnZXRTdXBlcnR5cGVOYW1lcyA9IF9hLmdldFN1cGVydHlwZU5hbWVzLCBuID0gX2EubmFtZWRUeXBlcywgTm9kZVBhdGggPSBfYS5Ob2RlUGF0aCwgUGF0aCA9IF9hLlBhdGgsIFBhdGhWaXNpdG9yID0gX2EuUGF0aFZpc2l0b3IsIHNvbWVGaWVsZCA9IF9hLnNvbWVGaWVsZCwgVHlwZSA9IF9hLlR5cGUsIHVzZSA9IF9hLnVzZSwgdmlzaXQgPSBfYS52aXNpdDtcbmV4cG9ydHMuYXN0Tm9kZXNBcmVFcXVpdmFsZW50ID0gYXN0Tm9kZXNBcmVFcXVpdmFsZW50O1xuZXhwb3J0cy5idWlsZGVycyA9IGJ1aWxkZXJzO1xuZXhwb3J0cy5idWlsdEluVHlwZXMgPSBidWlsdEluVHlwZXM7XG5leHBvcnRzLmRlZmluZU1ldGhvZCA9IGRlZmluZU1ldGhvZDtcbmV4cG9ydHMuZWFjaEZpZWxkID0gZWFjaEZpZWxkO1xuZXhwb3J0cy5maW5hbGl6ZSA9IGZpbmFsaXplO1xuZXhwb3J0cy5nZXRCdWlsZGVyTmFtZSA9IGdldEJ1aWxkZXJOYW1lO1xuZXhwb3J0cy5nZXRGaWVsZE5hbWVzID0gZ2V0RmllbGROYW1lcztcbmV4cG9ydHMuZ2V0RmllbGRWYWx1ZSA9IGdldEZpZWxkVmFsdWU7XG5leHBvcnRzLmdldFN1cGVydHlwZU5hbWVzID0gZ2V0U3VwZXJ0eXBlTmFtZXM7XG5leHBvcnRzLk5vZGVQYXRoID0gTm9kZVBhdGg7XG5leHBvcnRzLlBhdGggPSBQYXRoO1xuZXhwb3J0cy5QYXRoVmlzaXRvciA9IFBhdGhWaXNpdG9yO1xuZXhwb3J0cy5zb21lRmllbGQgPSBzb21lRmllbGQ7XG5leHBvcnRzLlR5cGUgPSBUeXBlO1xuZXhwb3J0cy51c2UgPSB1c2U7XG5leHBvcnRzLnZpc2l0ID0gdmlzaXQ7XG4vLyBQb3B1bGF0ZSB0aGUgZXhwb3J0ZWQgZmllbGRzIG9mIHRoZSBuYW1lZFR5cGVzIG5hbWVzcGFjZSwgd2hpbGUgc3RpbGxcbi8vIHJldGFpbmluZyBpdHMgbWVtYmVyIHR5cGVzLlxuT2JqZWN0LmFzc2lnbihuYW1lZFR5cGVzXzEubmFtZWRUeXBlcywgbik7XG4iLCJmdW5jdGlvbiBpc0J1ZmZlciAodmFsdWUpIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5XG59XG5cbmZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHJldHVybiBCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2MgKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBCdWZmZXIuYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlIChzaXplKSB7XG4gIHJldHVybiBCdWZmZXIuYWxsb2NVbnNhZmUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmVTbG93IChzaXplKSB7XG4gIHJldHVybiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KHNpemUpXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKGEsIGIpXG59XG5cbmZ1bmN0aW9uIGNvbmNhdCAoYnVmZmVycywgdG90YWxMZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycywgdG90YWxMZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGNvcHkgKHNvdXJjZSwgdGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gdG9CdWZmZXIoc291cmNlKS5jb3B5KHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpXG59XG5cbmZ1bmN0aW9uIGVxdWFscyAoYSwgYikge1xuICByZXR1cm4gdG9CdWZmZXIoYSkuZXF1YWxzKGIpXG59XG5cbmZ1bmN0aW9uIGZpbGwgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgZW5kLCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5maWxsKHZhbHVlLCBvZmZzZXQsIGVuZCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGZyb20gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGluY2x1ZGVzIChidWZmZXIsIHZhbHVlLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5pbmNsdWRlcyh2YWx1ZSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGluZGV4T2YgKGJ1ZmZlciwgdmFsdWUsIGJ5ZmVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLmluZGV4T2YodmFsdWUsIGJ5ZmVPZmZzZXQsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBsYXN0SW5kZXhPZiAoYnVmZmVyLCB2YWx1ZSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikubGFzdEluZGV4T2YodmFsdWUsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBzd2FwMTYgKGJ1ZmZlcikge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5zd2FwMTYoKVxufVxuXG5mdW5jdGlvbiBzd2FwMzIgKGJ1ZmZlcikge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5zd2FwMzIoKVxufVxuXG5mdW5jdGlvbiBzd2FwNjQgKGJ1ZmZlcikge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5zd2FwNjQoKVxufVxuXG5mdW5jdGlvbiB0b0J1ZmZlciAoYnVmZmVyKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoYnVmZmVyKSkgcmV0dXJuIGJ1ZmZlclxuICByZXR1cm4gQnVmZmVyLmZyb20oYnVmZmVyLmJ1ZmZlciwgYnVmZmVyLmJ5dGVPZmZzZXQsIGJ1ZmZlci5ieXRlTGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB0b1N0cmluZyAoYnVmZmVyLCBlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS50b1N0cmluZyhlbmNvZGluZywgc3RhcnQsIGVuZClcbn1cblxuZnVuY3Rpb24gd3JpdGUgKGJ1ZmZlciwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGUoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZURvdWJsZUxFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlRmxvYXRMRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiB3cml0ZVVJbnQzMkxFIChidWZmZXIsIHZhbHVlLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGVVSW50MzJMRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiB3cml0ZUludDMyTEUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZUludDMyTEUodmFsdWUsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gcmVhZERvdWJsZUxFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkRG91YmxlTEUob2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkRmxvYXRMRSAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikucmVhZEZsb2F0TEUob2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkVUludDMyTEUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWRVSW50MzJMRShvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWRJbnQzMkxFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkSW50MzJMRShvZmZzZXQpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0J1ZmZlcixcbiAgaXNFbmNvZGluZyxcbiAgYWxsb2MsXG4gIGFsbG9jVW5zYWZlLFxuICBhbGxvY1Vuc2FmZVNsb3csXG4gIGJ5dGVMZW5ndGgsXG4gIGNvbXBhcmUsXG4gIGNvbmNhdCxcbiAgY29weSxcbiAgZXF1YWxzLFxuICBmaWxsLFxuICBmcm9tLFxuICBpbmNsdWRlcyxcbiAgaW5kZXhPZixcbiAgbGFzdEluZGV4T2YsXG4gIHN3YXAxNixcbiAgc3dhcDMyLFxuICBzd2FwNjQsXG4gIHRvQnVmZmVyLFxuICB0b1N0cmluZyxcbiAgd3JpdGUsXG4gIHdyaXRlRG91YmxlTEUsXG4gIHdyaXRlRmxvYXRMRSxcbiAgd3JpdGVVSW50MzJMRSxcbiAgd3JpdGVJbnQzMkxFLFxuICByZWFkRG91YmxlTEUsXG4gIHJlYWRGbG9hdExFLFxuICByZWFkVUludDMyTEUsXG4gIHJlYWRJbnQzMkxFXG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ2xpZW50ID0gdm9pZCAwO1xuY29uc3QgZnNfMSA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IHBhdGhfMSA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgdGxzXzEgPSByZXF1aXJlKFwidGxzXCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcInV0aWxcIik7XG5jb25zdCBGdHBDb250ZXh0XzEgPSByZXF1aXJlKFwiLi9GdHBDb250ZXh0XCIpO1xuY29uc3QgcGFyc2VMaXN0XzEgPSByZXF1aXJlKFwiLi9wYXJzZUxpc3RcIik7XG5jb25zdCBQcm9ncmVzc1RyYWNrZXJfMSA9IHJlcXVpcmUoXCIuL1Byb2dyZXNzVHJhY2tlclwiKTtcbmNvbnN0IFN0cmluZ1dyaXRlcl8xID0gcmVxdWlyZShcIi4vU3RyaW5nV3JpdGVyXCIpO1xuY29uc3QgcGFyc2VMaXN0TUxTRF8xID0gcmVxdWlyZShcIi4vcGFyc2VMaXN0TUxTRFwiKTtcbmNvbnN0IG5ldFV0aWxzXzEgPSByZXF1aXJlKFwiLi9uZXRVdGlsc1wiKTtcbmNvbnN0IHRyYW5zZmVyXzEgPSByZXF1aXJlKFwiLi90cmFuc2ZlclwiKTtcbmNvbnN0IHBhcnNlQ29udHJvbFJlc3BvbnNlXzEgPSByZXF1aXJlKFwiLi9wYXJzZUNvbnRyb2xSZXNwb25zZVwiKTtcbi8vIFVzZSBwcm9taXNpZnkgdG8ga2VlcCB0aGUgbGlicmFyeSBjb21wYXRpYmxlIHdpdGggTm9kZSA4LlxuY29uc3QgZnNSZWFkRGlyID0gKDAsIHV0aWxfMS5wcm9taXNpZnkpKGZzXzEucmVhZGRpcik7XG5jb25zdCBmc01rRGlyID0gKDAsIHV0aWxfMS5wcm9taXNpZnkpKGZzXzEubWtkaXIpO1xuY29uc3QgZnNTdGF0ID0gKDAsIHV0aWxfMS5wcm9taXNpZnkpKGZzXzEuc3RhdCk7XG5jb25zdCBmc09wZW4gPSAoMCwgdXRpbF8xLnByb21pc2lmeSkoZnNfMS5vcGVuKTtcbmNvbnN0IGZzQ2xvc2UgPSAoMCwgdXRpbF8xLnByb21pc2lmeSkoZnNfMS5jbG9zZSk7XG5jb25zdCBmc1VubGluayA9ICgwLCB1dGlsXzEucHJvbWlzaWZ5KShmc18xLnVubGluayk7XG5jb25zdCBMSVNUX0NPTU1BTkRTX0RFRkFVTFQgPSAoKSA9PiBbXCJMSVNUIC1hXCIsIFwiTElTVFwiXTtcbmNvbnN0IExJU1RfQ09NTUFORFNfTUxTRCA9ICgpID0+IFtcIk1MU0RcIiwgXCJMSVNUIC1hXCIsIFwiTElTVFwiXTtcbi8qKlxuICogSGlnaC1sZXZlbCBBUEkgdG8gaW50ZXJhY3Qgd2l0aCBhbiBGVFAgc2VydmVyLlxuICovXG5jbGFzcyBDbGllbnQge1xuICAgIC8qKlxuICAgICAqIEluc3RhbnRpYXRlIGFuIEZUUCBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGltZW91dCAgVGltZW91dCBpbiBtaWxsaXNlY29uZHMsIHVzZSAwIGZvciBubyB0aW1lb3V0LiBPcHRpb25hbCwgZGVmYXVsdCBpcyAzMCBzZWNvbmRzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHRpbWVvdXQgPSAzMDAwMCkge1xuICAgICAgICB0aGlzLmF2YWlsYWJsZUxpc3RDb21tYW5kcyA9IExJU1RfQ09NTUFORFNfREVGQVVMVCgpO1xuICAgICAgICB0aGlzLmZ0cCA9IG5ldyBGdHBDb250ZXh0XzEuRlRQQ29udGV4dCh0aW1lb3V0KTtcbiAgICAgICAgdGhpcy5wcmVwYXJlVHJhbnNmZXIgPSB0aGlzLl9lbnRlckZpcnN0Q29tcGF0aWJsZU1vZGUoW3RyYW5zZmVyXzEuZW50ZXJQYXNzaXZlTW9kZUlQdjYsIHRyYW5zZmVyXzEuZW50ZXJQYXNzaXZlTW9kZUlQdjRdKTtcbiAgICAgICAgdGhpcy5wYXJzZUxpc3QgPSBwYXJzZUxpc3RfMS5wYXJzZUxpc3Q7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzVHJhY2tlciA9IG5ldyBQcm9ncmVzc1RyYWNrZXJfMS5Qcm9ncmVzc1RyYWNrZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIGNsaWVudCBhbmQgYWxsIG9wZW4gc29ja2V0IGNvbm5lY3Rpb25zLlxuICAgICAqXG4gICAgICogQ2xvc2UgdGhlIGNsaWVudCBhbmQgYWxsIG9wZW4gc29ja2V0IGNvbm5lY3Rpb25zLiBUaGUgY2xpZW50IGNhbuKAmXQgYmUgdXNlZCBhbnltb3JlIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsXG4gICAgICogeW91IGhhdmUgdG8gZWl0aGVyIHJlY29ubmVjdCB3aXRoIGBhY2Nlc3NgIG9yIGBjb25uZWN0YCBvciBpbnN0YW50aWF0ZSBhIG5ldyBpbnN0YW5jZSB0byBjb250aW51ZSBhbnkgd29yay5cbiAgICAgKiBBIGNsaWVudCBpcyBhbHNvIGNsb3NlZCBhdXRvbWF0aWNhbGx5IGlmIGFueSB0aW1lb3V0IG9yIGNvbm5lY3Rpb24gZXJyb3Igb2NjdXJzLlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLmZ0cC5jbG9zZSgpO1xuICAgICAgICB0aGlzLl9wcm9ncmVzc1RyYWNrZXIuc3RvcCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaWVudCBpcyBjbG9zZWQgYW5kIGNhbid0IGJlIHVzZWQgYW55bW9yZS5cbiAgICAgKi9cbiAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mdHAuY2xvc2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IChvciByZWNvbm5lY3QpIHRvIGFuIEZUUCBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGFuIGluc3RhbmNlIG1ldGhvZCBhbmQgdGh1cyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyB0aGUgbGlmZWN5Y2xlIG9mIGEgYENsaWVudGBcbiAgICAgKiBpbnN0YW5jZS4gV2hlbmV2ZXIgeW91IGRvLCB0aGUgY2xpZW50IGlzIHJlc2V0IHdpdGggYSBuZXcgY29udHJvbCBjb25uZWN0aW9uLiBUaGlzIGFsc28gaW1wbGllcyB0aGF0XG4gICAgICogeW91IGNhbiByZW9wZW4gYSBgQ2xpZW50YCBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3Igd2hlbiByZWNvbm5lY3Rpbmcgd2l0aCB0aGlzXG4gICAgICogbWV0aG9kLiBJbiBmYWN0LCByZWNvbm5lY3RpbmcgaXMgdGhlIG9ubHkgd2F5IHRvIGNvbnRpbnVlIHVzaW5nIGEgY2xvc2VkIGBDbGllbnRgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGhvc3QgIEhvc3QgdGhlIGNsaWVudCBzaG91bGQgY29ubmVjdCB0by4gT3B0aW9uYWwsIGRlZmF1bHQgaXMgXCJsb2NhbGhvc3RcIi5cbiAgICAgKiBAcGFyYW0gcG9ydCAgUG9ydCB0aGUgY2xpZW50IHNob3VsZCBjb25uZWN0IHRvLiBPcHRpb25hbCwgZGVmYXVsdCBpcyAyMS5cbiAgICAgKi9cbiAgICBjb25uZWN0KGhvc3QgPSBcImxvY2FsaG9zdFwiLCBwb3J0ID0gMjEpIHtcbiAgICAgICAgdGhpcy5mdHAucmVzZXQoKTtcbiAgICAgICAgdGhpcy5mdHAuc29ja2V0LmNvbm5lY3Qoe1xuICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgICBmYW1pbHk6IHRoaXMuZnRwLmlwRmFtaWx5XG4gICAgICAgIH0sICgpID0+IHRoaXMuZnRwLmxvZyhgQ29ubmVjdGVkIHRvICR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVBZGRyZXNzKSh0aGlzLmZ0cC5zb2NrZXQpfSAoJHsoMCwgbmV0VXRpbHNfMS5kZXNjcmliZVRMUykodGhpcy5mdHAuc29ja2V0KX0pYCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlQ29ubmVjdFJlc3BvbnNlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzIGBjb25uZWN0YCBidXQgdXNpbmcgaW1wbGljaXQgVExTLiBJbXBsaWNpdCBUTFMgaXMgbm90IGFuIEZUUCBzdGFuZGFyZCBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgYnlcbiAgICAgKiBleHBsaWNpdCBUTFMuIFRoZXJlIGFyZSBzdGlsbCBGVFAgc2VydmVycyB0aGF0IHN1cHBvcnQgb25seSBpbXBsaWNpdCBUTFMsIHRob3VnaC5cbiAgICAgKi9cbiAgICBjb25uZWN0SW1wbGljaXRUTFMoaG9zdCA9IFwibG9jYWxob3N0XCIsIHBvcnQgPSAyMSwgdGxzT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZnRwLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZnRwLnNvY2tldCA9ICgwLCB0bHNfMS5jb25uZWN0KShwb3J0LCBob3N0LCB0bHNPcHRpb25zLCAoKSA9PiB0aGlzLmZ0cC5sb2coYENvbm5lY3RlZCB0byAkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlQWRkcmVzcykodGhpcy5mdHAuc29ja2V0KX0gKCR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVUTFMpKHRoaXMuZnRwLnNvY2tldCl9KWApKTtcbiAgICAgICAgdGhpcy5mdHAudGxzT3B0aW9ucyA9IHRsc09wdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVDb25uZWN0UmVzcG9uc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB0aGUgZmlyc3QgcmVwb25zZSBieSBhbiBGVFAgc2VydmVyIGFmdGVyIHRoZSBzb2NrZXQgY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZC5cbiAgICAgKi9cbiAgICBfaGFuZGxlQ29ubmVjdFJlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mdHAuaGFuZGxlKHVuZGVmaW5lZCwgKHJlcywgdGFzaykgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkIGJ5IHRoZSBGVFBDb250ZXh0IGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgdGFzay5yZWplY3QocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCgwLCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xLnBvc2l0aXZlQ29tcGxldGlvbikocmVzLmNvZGUpKSB7XG4gICAgICAgICAgICAgICAgdGFzay5yZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZWplY3QgYWxsIG90aGVyIGNvZGVzLCBpbmNsdWRpbmcgMTIwIFwiU2VydmljZSByZWFkeSBpbiBubm4gbWludXRlc1wiLlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc3RheSBjb25uZWN0ZWQgYnV0IGRvbid0IHJlcGxhY2UgdGhlIHNvY2tldCB5ZXQgYnkgdXNpbmcgcmVzZXQoKVxuICAgICAgICAgICAgICAgIC8vIHNvIHRoZSB1c2VyIGNhbiBpbnNwZWN0IHByb3BlcnRpZXMgb2YgdGhpcyBpbnN0YW5jZS5cbiAgICAgICAgICAgICAgICB0YXNrLnJlamVjdChuZXcgRnRwQ29udGV4dF8xLkZUUEVycm9yKHJlcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhbiBGVFAgY29tbWFuZCBhbmQgaGFuZGxlIHRoZSBmaXJzdCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBzZW5kKGNvbW1hbmQsIGlnbm9yZUVycm9yQ29kZXNERVBSRUNBVEVEID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGlnbm9yZUVycm9yQ29kZXNERVBSRUNBVEVEKSB7IC8vIERlcHJlY2F0ZWQgc3RhcnRpbmcgZnJvbSAzLjkuMFxuICAgICAgICAgICAgdGhpcy5mdHAubG9nKFwiRGVwcmVjYXRlZCBjYWxsIHVzaW5nIHNlbmQoY29tbWFuZCwgZmxhZykgd2l0aCBib29sZWFuIGZsYWcgdG8gaWdub3JlIGVycm9ycy4gVXNlIHNlbmRJZ25vcmluZ0Vycm9yKGNvbW1hbmQpLlwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKGNvbW1hbmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZ0cC5yZXF1ZXN0KGNvbW1hbmQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGFuIEZUUCBjb21tYW5kIGFuZCBpZ25vcmUgYW4gRlRQIGVycm9yIHJlc3BvbnNlLiBBbnkgb3RoZXIga2luZCBvZiBlcnJvciBvciB0aW1lb3V0IHdpbGwgc3RpbGwgcmVqZWN0IHRoZSBQcm9taXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbW1hbmRcbiAgICAgKi9cbiAgICBzZW5kSWdub3JpbmdFcnJvcihjb21tYW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ0cC5oYW5kbGUoY29tbWFuZCwgKHJlcywgdGFzaykgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEZ0cENvbnRleHRfMS5GVFBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRhc2sucmVzb2x2ZSh7IGNvZGU6IHJlcy5jb2RlLCBtZXNzYWdlOiByZXMubWVzc2FnZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGFzay5yZWplY3QocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhc2sucmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBncmFkZSB0aGUgY3VycmVudCBzb2NrZXQgY29ubmVjdGlvbiB0byBUTFMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAgVExTIG9wdGlvbnMgYXMgaW4gYHRscy5jb25uZWN0KG9wdGlvbnMpYCwgb3B0aW9uYWwuXG4gICAgICogQHBhcmFtIGNvbW1hbmQgIFNldCB0aGUgYXV0aGVudGljYXRpb24gY29tbWFuZC4gT3B0aW9uYWwsIGRlZmF1bHQgaXMgXCJBVVRIIFRMU1wiLlxuICAgICAqL1xuICAgIGFzeW5jIHVzZVRMUyhvcHRpb25zID0ge30sIGNvbW1hbmQgPSBcIkFVVEggVExTXCIpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgdGhpcy5zZW5kKGNvbW1hbmQpO1xuICAgICAgICB0aGlzLmZ0cC5zb2NrZXQgPSBhd2FpdCAoMCwgbmV0VXRpbHNfMS51cGdyYWRlU29ja2V0KSh0aGlzLmZ0cC5zb2NrZXQsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmZ0cC50bHNPcHRpb25zID0gb3B0aW9uczsgLy8gS2VlcCB0aGUgVExTIG9wdGlvbnMgZm9yIGxhdGVyIGRhdGEgY29ubmVjdGlvbnMgdGhhdCBzaG91bGQgdXNlIHRoZSBzYW1lIG9wdGlvbnMuXG4gICAgICAgIHRoaXMuZnRwLmxvZyhgQ29udHJvbCBzb2NrZXQgaXMgdXNpbmc6ICR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVUTFMpKHRoaXMuZnRwLnNvY2tldCl9YCk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZ2luIGEgdXNlciB3aXRoIGEgcGFzc3dvcmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXNlciAgVXNlcm5hbWUgdG8gdXNlIGZvciBsb2dpbi4gT3B0aW9uYWwsIGRlZmF1bHQgaXMgXCJhbm9ueW1vdXNcIi5cbiAgICAgKiBAcGFyYW0gcGFzc3dvcmQgIFBhc3N3b3JkIHRvIHVzZSBmb3IgbG9naW4uIE9wdGlvbmFsLCBkZWZhdWx0IGlzIFwiZ3Vlc3RcIi5cbiAgICAgKi9cbiAgICBsb2dpbih1c2VyID0gXCJhbm9ueW1vdXNcIiwgcGFzc3dvcmQgPSBcImd1ZXN0XCIpIHtcbiAgICAgICAgdGhpcy5mdHAubG9nKGBMb2dpbiBzZWN1cml0eTogJHsoMCwgbmV0VXRpbHNfMS5kZXNjcmliZVRMUykodGhpcy5mdHAuc29ja2V0KX1gKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnRwLmhhbmRsZShcIlVTRVIgXCIgKyB1c2VyLCAocmVzLCB0YXNrKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0YXNrLnJlamVjdChyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKDAsIHBhcnNlQ29udHJvbFJlc3BvbnNlXzEucG9zaXRpdmVDb21wbGV0aW9uKShyZXMuY29kZSkpIHsgLy8gVXNlciBsb2dnZWQgaW4gcHJvY2VlZCBPUiBDb21tYW5kIHN1cGVyZmx1b3VzXG4gICAgICAgICAgICAgICAgdGFzay5yZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXMuY29kZSA9PT0gMzMxKSB7IC8vIFVzZXIgbmFtZSBva2F5LCBuZWVkIHBhc3N3b3JkXG4gICAgICAgICAgICAgICAgdGhpcy5mdHAuc2VuZChcIlBBU1MgXCIgKyBwYXNzd29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gQWxzbyByZXBvcnQgZXJyb3Igb24gMzMyIChOZWVkIGFjY291bnQpXG4gICAgICAgICAgICAgICAgdGFzay5yZWplY3QobmV3IEZ0cENvbnRleHRfMS5GVFBFcnJvcihyZXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgdXN1YWwgZGVmYXVsdCBzZXR0aW5ncy5cbiAgICAgKlxuICAgICAqIFNldHRpbmdzIHVzZWQ6XG4gICAgICogKiBCaW5hcnkgbW9kZSAoVFlQRSBJKVxuICAgICAqICogRmlsZSBzdHJ1Y3R1cmUgKFNUUlUgRilcbiAgICAgKiAqIEFkZGl0aW9uYWwgc2V0dGluZ3MgZm9yIEZUUFMgKFBCU1ogMCwgUFJPVCBQKVxuICAgICAqL1xuICAgIGFzeW5jIHVzZURlZmF1bHRTZXR0aW5ncygpIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZXMgPSBhd2FpdCB0aGlzLmZlYXR1cmVzKCk7XG4gICAgICAgIC8vIFVzZSBNTFNEIGRpcmVjdG9yeSBsaXN0aW5nIGlmIHBvc3NpYmxlLiBTZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM2NTkjc2VjdGlvbi03Ljg6XG4gICAgICAgIC8vIFwiVGhlIHByZXNlbmNlIG9mIHRoZSBNTFNUIGZlYXR1cmUgaW5kaWNhdGVzIHRoYXQgYm90aCBNTFNUIGFuZCBNTFNEIGFyZSBzdXBwb3J0ZWQuXCJcbiAgICAgICAgY29uc3Qgc3VwcG9ydHNNTFNEID0gZmVhdHVyZXMuaGFzKFwiTUxTVFwiKTtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVMaXN0Q29tbWFuZHMgPSBzdXBwb3J0c01MU0QgPyBMSVNUX0NPTU1BTkRTX01MU0QoKSA6IExJU1RfQ09NTUFORFNfREVGQVVMVCgpO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmQoXCJUWVBFIElcIik7IC8vIEJpbmFyeSBtb2RlXG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZElnbm9yaW5nRXJyb3IoXCJTVFJVIEZcIik7IC8vIFVzZSBmaWxlIHN0cnVjdHVyZVxuICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiT1BUUyBVVEY4IE9OXCIpOyAvLyBTb21lIHNlcnZlcnMgZXhwZWN0IFVURi04IHRvIGJlIGVuYWJsZWQgZXhwbGljaXRseSBhbmQgc2V0dGluZyBiZWZvcmUgbG9naW4gbWlnaHQgbm90IGhhdmUgd29ya2VkLlxuICAgICAgICBpZiAoc3VwcG9ydHNNTFNEKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiT1BUUyBNTFNUIHR5cGU7c2l6ZTttb2RpZnk7dW5pcXVlO3VuaXgubW9kZTt1bml4Lm93bmVyO3VuaXguZ3JvdXA7dW5peC5vd25lcm5hbWU7dW5peC5ncm91cG5hbWU7XCIpOyAvLyBNYWtlIHN1cmUgTUxTRCBsaXN0aW5ncyBpbmNsdWRlIGFsbCB3ZSBjYW4gcGFyc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mdHAuaGFzVExTKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiUEJTWiAwXCIpOyAvLyBTZXQgdG8gMCBmb3IgVExTXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiUFJPVCBQXCIpOyAvLyBQcm90ZWN0IGNoYW5uZWwgKGFsc28gZm9yIGRhdGEgY29ubmVjdGlvbnMpXG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY2FsbHMgYGNvbm5lY3RgLCBgdXNlVExTYCwgYGxvZ2luYCBhbmQgYHVzZURlZmF1bHRTZXR0aW5nc2AuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGFuIGluc3RhbmNlIG1ldGhvZCBhbmQgdGh1cyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyB0aGUgbGlmZWN5Y2xlIG9mIGEgYENsaWVudGBcbiAgICAgKiBpbnN0YW5jZS4gV2hlbmV2ZXIgeW91IGRvLCB0aGUgY2xpZW50IGlzIHJlc2V0IHdpdGggYSBuZXcgY29udHJvbCBjb25uZWN0aW9uLiBUaGlzIGFsc28gaW1wbGllcyB0aGF0XG4gICAgICogeW91IGNhbiByZW9wZW4gYSBgQ2xpZW50YCBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3Igd2hlbiByZWNvbm5lY3Rpbmcgd2l0aCB0aGlzXG4gICAgICogbWV0aG9kLiBJbiBmYWN0LCByZWNvbm5lY3RpbmcgaXMgdGhlIG9ubHkgd2F5IHRvIGNvbnRpbnVlIHVzaW5nIGEgY2xvc2VkIGBDbGllbnRgLlxuICAgICAqL1xuICAgIGFzeW5jIGFjY2VzcyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgY29uc3QgdXNlRXhwbGljaXRUTFMgPSBvcHRpb25zLnNlY3VyZSA9PT0gdHJ1ZTtcbiAgICAgICAgY29uc3QgdXNlSW1wbGljaXRUTFMgPSBvcHRpb25zLnNlY3VyZSA9PT0gXCJpbXBsaWNpdFwiO1xuICAgICAgICBsZXQgd2VsY29tZTtcbiAgICAgICAgaWYgKHVzZUltcGxpY2l0VExTKSB7XG4gICAgICAgICAgICB3ZWxjb21lID0gYXdhaXQgdGhpcy5jb25uZWN0SW1wbGljaXRUTFMob3B0aW9ucy5ob3N0LCBvcHRpb25zLnBvcnQsIG9wdGlvbnMuc2VjdXJlT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3ZWxjb21lID0gYXdhaXQgdGhpcy5jb25uZWN0KG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlRXhwbGljaXRUTFMpIHtcbiAgICAgICAgICAgIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wYXRyaWNranVjaGxpL2Jhc2ljLWZ0cC9pc3N1ZXMvMTY2IGJ5IG1ha2luZyBzdXJlXG4gICAgICAgICAgICAvLyBob3N0IGlzIHNldCBmb3IgYW55IGZ1dHVyZSBkYXRhIGNvbm5lY3Rpb24gYXMgd2VsbC5cbiAgICAgICAgICAgIGNvbnN0IHNlY3VyZU9wdGlvbnMgPSAoX2EgPSBvcHRpb25zLnNlY3VyZU9wdGlvbnMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9O1xuICAgICAgICAgICAgc2VjdXJlT3B0aW9ucy5ob3N0ID0gKF9iID0gc2VjdXJlT3B0aW9ucy5ob3N0KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBvcHRpb25zLmhvc3Q7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVzZVRMUyhzZWN1cmVPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgVVRGLTggb24gYmVmb3JlIGxvZ2luIGluIGNhc2UgdGhlcmUgYXJlIG5vbi1hc2NpaSBjaGFyYWN0ZXJzIGluIHVzZXIgb3IgcGFzc3dvcmQuXG4gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IG5vdCB3b3JrIGJlZm9yZSBsb2dpbiBkZXBlbmRpbmcgb24gc2VydmVyLlxuICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiT1BUUyBVVEY4IE9OXCIpO1xuICAgICAgICBhd2FpdCB0aGlzLmxvZ2luKG9wdGlvbnMudXNlciwgb3B0aW9ucy5wYXNzd29yZCk7XG4gICAgICAgIGF3YWl0IHRoaXMudXNlRGVmYXVsdFNldHRpbmdzKCk7XG4gICAgICAgIHJldHVybiB3ZWxjb21lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgYXN5bmMgcHdkKCkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlbmQoXCJQV0RcIik7XG4gICAgICAgIC8vIFRoZSBkaXJlY3RvcnkgaXMgcGFydCBvZiB0aGUgcmV0dXJuIG1lc3NhZ2UsIGZvciBleGFtcGxlOlxuICAgICAgICAvLyAyNTcgXCIvdGhpcy90aGF0XCIgaXMgY3VycmVudCBkaXJlY3RvcnkuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHJlcy5tZXNzYWdlLm1hdGNoKC9cIiguKylcIi8pO1xuICAgICAgICBpZiAocGFyc2VkID09PSBudWxsIHx8IHBhcnNlZFsxXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHBhcnNlIHJlc3BvbnNlIHRvIGNvbW1hbmQgJ1BXRCc6ICR7cmVzLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlZFsxXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEgZGVzY3JpcHRpb24gb2Ygc3VwcG9ydGVkIGZlYXR1cmVzLlxuICAgICAqXG4gICAgICogVGhpcyBzZW5kcyB0aGUgRkVBVCBjb21tYW5kIGFuZCBwYXJzZXMgdGhlIHJlc3VsdCBpbnRvIGEgTWFwIHdoZXJlIGtleXMgY29ycmVzcG9uZCB0byBhdmFpbGFibGUgY29tbWFuZHNcbiAgICAgKiBhbmQgdmFsdWVzIGhvbGQgZnVydGhlciBpbmZvcm1hdGlvbi4gQmUgYXdhcmUgdGhhdCB5b3VyIEZUUCBzZXJ2ZXJzIG1pZ2h0IG5vdCBzdXBwb3J0IHRoaXNcbiAgICAgKiBjb21tYW5kIGluIHdoaWNoIGNhc2UgdGhpcyBtZXRob2Qgd2lsbCBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGJ1dCBqdXN0IHJldHVybiBhbiBlbXB0eSBNYXAuXG4gICAgICovXG4gICAgYXN5bmMgZmVhdHVyZXMoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VuZElnbm9yaW5nRXJyb3IoXCJGRUFUXCIpO1xuICAgICAgICBjb25zdCBmZWF0dXJlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgLy8gTm90IHN1cHBvcnRpbmcgYW55IHNwZWNpYWwgZmVhdHVyZXMgd2lsbCBiZSByZXBvcnRlZCB3aXRoIGEgc2luZ2xlIGxpbmUuXG4gICAgICAgIGlmIChyZXMuY29kZSA8IDQwMCAmJiAoMCwgcGFyc2VDb250cm9sUmVzcG9uc2VfMS5pc011bHRpbGluZSkocmVzLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAvLyBUaGUgZmlyc3QgYW5kIGxhc3QgbGluZSB3cmFwIHRoZSBtdWx0aWxpbmUgcmVzcG9uc2UsIGlnbm9yZSB0aGVtLlxuICAgICAgICAgICAgcmVzLm1lc3NhZ2Uuc3BsaXQoXCJcXG5cIikuc2xpY2UoMSwgLTEpLmZvckVhY2gobGluZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQSB0eXBpY2FsIGxpbmVzIGxvb2tzIGxpa2U6IFwiIFJFU1QgU1RSRUFNXCIgb3IgXCIgTURUTVwiLlxuICAgICAgICAgICAgICAgIC8vIFNlcnZlcnMgbWlnaHQgbm90IHVzZSBhbiBpbmRlbnRhdGlvbiB0aG91Z2guXG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBsaW5lLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSB8fCBcIlwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmZWF0dXJlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICBhc3luYyBjZChwYXRoKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkUGF0aCA9IGF3YWl0IHRoaXMucHJvdGVjdFdoaXRlc3BhY2UocGF0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoXCJDV0QgXCIgKyB2YWxpZFBhdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTd2l0Y2ggdG8gdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIGFzeW5jIGNkdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoXCJDRFVQXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvZiBhIGZpbGUuIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBldmVyeSBGVFAgc2VydmVyLCBpbiB3aGljaCBjYXNlXG4gICAgICogY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBsYXN0TW9kKHBhdGgpIHtcbiAgICAgICAgY29uc3QgdmFsaWRQYXRoID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShwYXRoKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZW5kKGBNRFRNICR7dmFsaWRQYXRofWApO1xuICAgICAgICBjb25zdCBkYXRlID0gcmVzLm1lc3NhZ2Uuc2xpY2UoNCk7XG4gICAgICAgIHJldHVybiAoMCwgcGFyc2VMaXN0TUxTRF8xLnBhcnNlTUxTeERhdGUpKGRhdGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNpemUgb2YgYSBmaWxlLlxuICAgICAqL1xuICAgIGFzeW5jIHNpemUocGF0aCkge1xuICAgICAgICBjb25zdCB2YWxpZFBhdGggPSBhd2FpdCB0aGlzLnByb3RlY3RXaGl0ZXNwYWNlKHBhdGgpO1xuICAgICAgICBjb25zdCBjb21tYW5kID0gYFNJWkUgJHt2YWxpZFBhdGh9YDtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZW5kKGNvbW1hbmQpO1xuICAgICAgICAvLyBUaGUgc2l6ZSBpcyBwYXJ0IG9mIHRoZSByZXNwb25zZSBtZXNzYWdlLCBmb3IgZXhhbXBsZTogXCIyMTMgNTU1NTU1XCIuIEl0J3NcbiAgICAgICAgLy8gcG9zc2libGUgdGhhdCB0aGVyZSBpcyBhIGNvbW1tZW50YXJ5IGFwcGVuZGVkIGxpa2UgXCIyMTMgNTU1NSwgc29tZSBjb21tZW50YXJ5XCIuXG4gICAgICAgIGNvbnN0IHNpemUgPSBwYXJzZUludChyZXMubWVzc2FnZS5zbGljZSg0KSwgMTApO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHNpemUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHBhcnNlIHJlc3BvbnNlIHRvIGNvbW1hbmQgJyR7Y29tbWFuZH0nIGFzIGEgbnVtZXJpY2FsIHZhbHVlOiAke3Jlcy5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW5hbWUgYSBmaWxlLlxuICAgICAqXG4gICAgICogRGVwZW5kaW5nIG9uIHRoZSBGVFAgc2VydmVyIHRoaXMgbWlnaHQgYWxzbyBiZSB1c2VkIHRvIG1vdmUgYSBmaWxlIGZyb20gb25lXG4gICAgICogZGlyZWN0b3J5IHRvIGFub3RoZXIgYnkgcHJvdmlkaW5nIGZ1bGwgcGF0aHMuXG4gICAgICovXG4gICAgYXN5bmMgcmVuYW1lKHNyY1BhdGgsIGRlc3RQYXRoKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkU3JjID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShzcmNQYXRoKTtcbiAgICAgICAgY29uc3QgdmFsaWREZXN0ID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShkZXN0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZChcIlJORlIgXCIgKyB2YWxpZFNyYyk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoXCJSTlRPIFwiICsgdmFsaWREZXN0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZmlsZSBmcm9tIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgICAqXG4gICAgICogWW91IGNhbiBpZ25vcmUgRlRQIGVycm9yIHJldHVybiBjb2RlcyB3aGljaCB3b24ndCB0aHJvdyBhbiBleGNlcHRpb24gaWYgZS5nLlxuICAgICAqIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG4gICAgYXN5bmMgcmVtb3ZlKHBhdGgsIGlnbm9yZUVycm9yQ29kZXMgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCB2YWxpZFBhdGggPSBhd2FpdCB0aGlzLnByb3RlY3RXaGl0ZXNwYWNlKHBhdGgpO1xuICAgICAgICBpZiAoaWdub3JlRXJyb3JDb2Rlcykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZElnbm9yaW5nRXJyb3IoYERFTEUgJHt2YWxpZFBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZChgREVMRSAke3ZhbGlkUGF0aH1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVwb3J0IHRyYW5zZmVyIHByb2dyZXNzIGZvciBhbnkgdXBsb2FkIG9yIGRvd25sb2FkIHRvIGEgZ2l2ZW4gaGFuZGxlci5cbiAgICAgKlxuICAgICAqIFRoaXMgd2lsbCBhbHNvIHJlc2V0IHRoZSBvdmVyYWxsIHRyYW5zZmVyIGNvdW50ZXIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbXVsdGlwbGUgdHJhbnNmZXJzLiBZb3UgY2FuXG4gICAgICogYWxzbyBjYWxsIHRoZSBmdW5jdGlvbiB3aXRob3V0IGEgaGFuZGxlciB0byBzdG9wIHJlcG9ydGluZyB0byBhbiBlYXJsaWVyIG9uZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBoYW5kbGVyICBIYW5kbGVyIGZ1bmN0aW9uIHRvIGNhbGwgb24gdHJhbnNmZXIgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgdHJhY2tQcm9ncmVzcyhoYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzVHJhY2tlci5ieXRlc092ZXJhbGwgPSAwO1xuICAgICAgICB0aGlzLl9wcm9ncmVzc1RyYWNrZXIucmVwb3J0VG8oaGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwbG9hZCBkYXRhIGZyb20gYSByZWFkYWJsZSBzdHJlYW0gb3IgYSBsb2NhbCBmaWxlIHRvIGEgcmVtb3RlIGZpbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc291cmNlICBSZWFkYWJsZSBzdHJlYW0gb3IgcGF0aCB0byBhIGxvY2FsIGZpbGUuXG4gICAgICogQHBhcmFtIHRvUmVtb3RlUGF0aCAgUGF0aCB0byBhIHJlbW90ZSBmaWxlIHRvIHdyaXRlIHRvLlxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZEZyb20oc291cmNlLCB0b1JlbW90ZVBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBsb2FkV2l0aENvbW1hbmQoc291cmNlLCB0b1JlbW90ZVBhdGgsIFwiU1RPUlwiLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBsb2FkIGRhdGEgZnJvbSBhIHJlYWRhYmxlIHN0cmVhbSBvciBhIGxvY2FsIGZpbGUgYnkgYXBwZW5kaW5nIGl0IHRvIGFuIGV4aXN0aW5nIGZpbGUuIElmIHRoZSBmaWxlIGRvZXNuJ3RcbiAgICAgKiBleGlzdCB0aGUgRlRQIHNlcnZlciBzaG91bGQgY3JlYXRlIGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZSAgUmVhZGFibGUgc3RyZWFtIG9yIHBhdGggdG8gYSBsb2NhbCBmaWxlLlxuICAgICAqIEBwYXJhbSB0b1JlbW90ZVBhdGggIFBhdGggdG8gYSByZW1vdGUgZmlsZSB0byB3cml0ZSB0by5cbiAgICAgKi9cbiAgICBhc3luYyBhcHBlbmRGcm9tKHNvdXJjZSwgdG9SZW1vdGVQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwbG9hZFdpdGhDb21tYW5kKHNvdXJjZSwgdG9SZW1vdGVQYXRoLCBcIkFQUEVcIiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBfdXBsb2FkV2l0aENvbW1hbmQoc291cmNlLCByZW1vdGVQYXRoLCBjb21tYW5kLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXBsb2FkTG9jYWxGaWxlKHNvdXJjZSwgcmVtb3RlUGF0aCwgY29tbWFuZCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwbG9hZEZyb21TdHJlYW0oc291cmNlLCByZW1vdGVQYXRoLCBjb21tYW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGFzeW5jIF91cGxvYWRMb2NhbEZpbGUobG9jYWxQYXRoLCByZW1vdGVQYXRoLCBjb21tYW5kLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGZkID0gYXdhaXQgZnNPcGVuKGxvY2FsUGF0aCwgXCJyXCIpO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSAoMCwgZnNfMS5jcmVhdGVSZWFkU3RyZWFtKShcIlwiLCB7XG4gICAgICAgICAgICBmZCxcbiAgICAgICAgICAgIHN0YXJ0OiBvcHRpb25zLmxvY2FsU3RhcnQsXG4gICAgICAgICAgICBlbmQ6IG9wdGlvbnMubG9jYWxFbmRJbmNsdXNpdmUsXG4gICAgICAgICAgICBhdXRvQ2xvc2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3VwbG9hZEZyb21TdHJlYW0oc291cmNlLCByZW1vdGVQYXRoLCBjb21tYW5kKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGF3YWl0IGlnbm9yZUVycm9yKCgpID0+IGZzQ2xvc2UoZmQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX3VwbG9hZEZyb21TdHJlYW0oc291cmNlLCByZW1vdGVQYXRoLCBjb21tYW5kKSB7XG4gICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyKSA9PiB0aGlzLmZ0cC5jbG9zZVdpdGhFcnJvcihlcnIpO1xuICAgICAgICBzb3VyY2Uub25jZShcImVycm9yXCIsIG9uRXJyb3IpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRQYXRoID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShyZW1vdGVQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVRyYW5zZmVyKHRoaXMuZnRwKTtcbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIGtleXdvcmQgYGF3YWl0YCBvciB0aGUgYGZpbmFsbHlgIGNsYXVzZSBiZWxvdyBydW5zIHRvbyBlYXJseVxuICAgICAgICAgICAgLy8gYW5kIHJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgc291cmNlIHN0cmVhbSB0b28gZWFybHkuXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgKDAsIHRyYW5zZmVyXzEudXBsb2FkRnJvbSkoc291cmNlLCB7XG4gICAgICAgICAgICAgICAgZnRwOiB0aGlzLmZ0cCxcbiAgICAgICAgICAgICAgICB0cmFja2VyOiB0aGlzLl9wcm9ncmVzc1RyYWNrZXIsXG4gICAgICAgICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICAgICAgICByZW1vdGVQYXRoOiB2YWxpZFBhdGgsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJ1cGxvYWRcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEb3dubG9hZCBhIHJlbW90ZSBmaWxlIGFuZCBwaXBlIGl0cyBkYXRhIHRvIGEgd3JpdGFibGUgc3RyZWFtIG9yIHRvIGEgbG9jYWwgZmlsZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gb3B0aW9uYWxseSBkZWZpbmUgYXQgd2hpY2ggcG9zaXRpb24gb2YgdGhlIHJlbW90ZSBmaWxlIHlvdSdkIGxpa2UgdG8gc3RhcnRcbiAgICAgKiBkb3dubG9hZGluZy4gSWYgdGhlIGRlc3RpbmF0aW9uIHlvdSBwcm92aWRlIGlzIGEgZmlsZSwgdGhlIG9mZnNldCB3aWxsIGJlIGFwcGxpZWRcbiAgICAgKiB0byBpdCBhcyB3ZWxsLiBGb3IgZXhhbXBsZTogVG8gcmVzdW1lIGEgZmFpbGVkIGRvd25sb2FkLCB5b3UnZCByZXF1ZXN0IHRoZSBzaXplIG9mXG4gICAgICogdGhlIGxvY2FsLCBwYXJ0aWFsbHkgZG93bmxvYWRlZCBmaWxlIGFuZCB1c2UgdGhhdCBhcyB0aGUgb2Zmc2V0LiBBc3N1bWluZyB0aGUgc2l6ZVxuICAgICAqIGlzIDIzLCB5b3UnZCBkb3dubG9hZCB0aGUgcmVzdCB1c2luZyBgZG93bmxvYWRUbyhcImxvY2FsLnR4dFwiLCBcInJlbW90ZS50eHRcIiwgMjMpYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiAgU3RyZWFtIG9yIHBhdGggZm9yIGEgbG9jYWwgZmlsZSB0byB3cml0ZSB0by5cbiAgICAgKiBAcGFyYW0gZnJvbVJlbW90ZVBhdGggIFBhdGggb2YgdGhlIHJlbW90ZSBmaWxlIHRvIHJlYWQgZnJvbS5cbiAgICAgKiBAcGFyYW0gc3RhcnRBdCAgUG9zaXRpb24gd2l0aGluIHRoZSByZW1vdGUgZmlsZSB0byBzdGFydCBkb3dubG9hZGluZyBhdC4gSWYgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZmlsZSwgdGhpcyBvZmZzZXQgaXMgYWxzbyBhcHBsaWVkIHRvIGl0LlxuICAgICAqL1xuICAgIGFzeW5jIGRvd25sb2FkVG8oZGVzdGluYXRpb24sIGZyb21SZW1vdGVQYXRoLCBzdGFydEF0ID0gMCkge1xuICAgICAgICBpZiAodHlwZW9mIGRlc3RpbmF0aW9uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZG93bmxvYWRUb0ZpbGUoZGVzdGluYXRpb24sIGZyb21SZW1vdGVQYXRoLCBzdGFydEF0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZG93bmxvYWRUb1N0cmVhbShkZXN0aW5hdGlvbiwgZnJvbVJlbW90ZVBhdGgsIHN0YXJ0QXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX2Rvd25sb2FkVG9GaWxlKGxvY2FsUGF0aCwgcmVtb3RlUGF0aCwgc3RhcnRBdCkge1xuICAgICAgICBjb25zdCBhcHBlbmRpbmdUb0xvY2FsRmlsZSA9IHN0YXJ0QXQgPiAwO1xuICAgICAgICBjb25zdCBmaWxlU3lzdGVtRmxhZ3MgPSBhcHBlbmRpbmdUb0xvY2FsRmlsZSA/IFwicitcIiA6IFwid1wiO1xuICAgICAgICBjb25zdCBmZCA9IGF3YWl0IGZzT3Blbihsb2NhbFBhdGgsIGZpbGVTeXN0ZW1GbGFncyk7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gKDAsIGZzXzEuY3JlYXRlV3JpdGVTdHJlYW0pKFwiXCIsIHtcbiAgICAgICAgICAgIGZkLFxuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0QXQsXG4gICAgICAgICAgICBhdXRvQ2xvc2U6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2Rvd25sb2FkVG9TdHJlYW0oZGVzdGluYXRpb24sIHJlbW90ZVBhdGgsIHN0YXJ0QXQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsRmlsZVN0YXRzID0gYXdhaXQgaWdub3JlRXJyb3IoKCkgPT4gZnNTdGF0KGxvY2FsUGF0aCkpO1xuICAgICAgICAgICAgY29uc3QgaGFzRG93bmxvYWRlZERhdGEgPSBsb2NhbEZpbGVTdGF0cyAmJiBsb2NhbEZpbGVTdGF0cy5zaXplID4gMDtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlbW92ZUxvY2FsRmlsZSA9ICFhcHBlbmRpbmdUb0xvY2FsRmlsZSAmJiAhaGFzRG93bmxvYWRlZERhdGE7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmVtb3ZlTG9jYWxGaWxlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaWdub3JlRXJyb3IoKCkgPT4gZnNVbmxpbmsobG9jYWxQYXRoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBpZ25vcmVFcnJvcigoKSA9PiBmc0Nsb3NlKGZkKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGFzeW5jIF9kb3dubG9hZFRvU3RyZWFtKGRlc3RpbmF0aW9uLCByZW1vdGVQYXRoLCBzdGFydEF0KSB7XG4gICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyKSA9PiB0aGlzLmZ0cC5jbG9zZVdpdGhFcnJvcihlcnIpO1xuICAgICAgICBkZXN0aW5hdGlvbi5vbmNlKFwiZXJyb3JcIiwgb25FcnJvcik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZFBhdGggPSBhd2FpdCB0aGlzLnByb3RlY3RXaGl0ZXNwYWNlKHJlbW90ZVBhdGgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlVHJhbnNmZXIodGhpcy5mdHApO1xuICAgICAgICAgICAgLy8gS2VlcCB0aGUga2V5d29yZCBgYXdhaXRgIG9yIHRoZSBgZmluYWxseWAgY2xhdXNlIGJlbG93IHJ1bnMgdG9vIGVhcmx5XG4gICAgICAgICAgICAvLyBhbmQgcmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBzb3VyY2Ugc3RyZWFtIHRvbyBlYXJseS5cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCAoMCwgdHJhbnNmZXJfMS5kb3dubG9hZFRvKShkZXN0aW5hdGlvbiwge1xuICAgICAgICAgICAgICAgIGZ0cDogdGhpcy5mdHAsXG4gICAgICAgICAgICAgICAgdHJhY2tlcjogdGhpcy5fcHJvZ3Jlc3NUcmFja2VyLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IHN0YXJ0QXQgPiAwID8gYFJFU1QgJHtzdGFydEF0fWAgOiBgUkVUUiAke3ZhbGlkUGF0aH1gLFxuICAgICAgICAgICAgICAgIHJlbW90ZVBhdGg6IHZhbGlkUGF0aCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImRvd25sb2FkXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgZGVzdGluYXRpb24ucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3QgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBvciBmcm9tIGBwYXRoYCBpZiBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gW3BhdGhdICBQYXRoIHRvIHJlbW90ZSBmaWxlIG9yIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0KHBhdGggPSBcIlwiKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkUGF0aCA9IGF3YWl0IHRoaXMucHJvdGVjdFdoaXRlc3BhY2UocGF0aCk7XG4gICAgICAgIGxldCBsYXN0RXJyb3I7XG4gICAgICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIHRoaXMuYXZhaWxhYmxlTGlzdENvbW1hbmRzKSB7XG4gICAgICAgICAgICBjb25zdCBjb21tYW5kID0gdmFsaWRQYXRoID09PSBcIlwiID8gY2FuZGlkYXRlIDogYCR7Y2FuZGlkYXRlfSAke3ZhbGlkUGF0aH1gO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wcmVwYXJlVHJhbnNmZXIodGhpcy5mdHApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRMaXN0ID0gYXdhaXQgdGhpcy5fcmVxdWVzdExpc3RXaXRoQ29tbWFuZChjb21tYW5kKTtcbiAgICAgICAgICAgICAgICAvLyBVc2Ugc3VjY2Vzc2Z1bCBjYW5kaWRhdGUgZm9yIGFsbCBzdWJzZXF1ZW50IHJlcXVlc3RzLlxuICAgICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGlzdENvbW1hbmRzID0gW2NhbmRpZGF0ZV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZExpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkVHJ5TmV4dCA9IGVyciBpbnN0YW5jZW9mIEZ0cENvbnRleHRfMS5GVFBFcnJvcjtcbiAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFRyeU5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbGFzdEVycm9yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX3JlcXVlc3RMaXN0V2l0aENvbW1hbmQoY29tbWFuZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBuZXcgU3RyaW5nV3JpdGVyXzEuU3RyaW5nV3JpdGVyKCk7XG4gICAgICAgIGF3YWl0ICgwLCB0cmFuc2Zlcl8xLmRvd25sb2FkVG8pKGJ1ZmZlciwge1xuICAgICAgICAgICAgZnRwOiB0aGlzLmZ0cCxcbiAgICAgICAgICAgIHRyYWNrZXI6IHRoaXMuX3Byb2dyZXNzVHJhY2tlcixcbiAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICByZW1vdGVQYXRoOiBcIlwiLFxuICAgICAgICAgICAgdHlwZTogXCJsaXN0XCJcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBidWZmZXIuZ2V0VGV4dCh0aGlzLmZ0cC5lbmNvZGluZyk7XG4gICAgICAgIHRoaXMuZnRwLmxvZyh0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VMaXN0KHRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBkaXJlY3RvcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZW1vdGVEaXJQYXRoICBUaGUgcGF0aCBvZiB0aGUgcmVtb3RlIGRpcmVjdG9yeSB0byBkZWxldGUuXG4gICAgICogQGV4YW1wbGUgY2xpZW50LnJlbW92ZURpcihcImZvb1wiKSAvLyBSZW1vdmUgZGlyZWN0b3J5ICdmb28nIHVzaW5nIGEgcmVsYXRpdmUgcGF0aC5cbiAgICAgKiBAZXhhbXBsZSBjbGllbnQucmVtb3ZlRGlyKFwiZm9vL2JhclwiKSAvLyBSZW1vdmUgZGlyZWN0b3J5ICdiYXInIHVzaW5nIGEgcmVsYXRpdmUgcGF0aC5cbiAgICAgKiBAZXhhbXBsZSBjbGllbnQucmVtb3ZlRGlyKFwiL2Zvby9iYXJcIikgLy8gUmVtb3ZlIGRpcmVjdG9yeSAnYmFyJyB1c2luZyBhbiBhYnNvbHV0ZSBwYXRoLlxuICAgICAqIEBleGFtcGxlIGNsaWVudC5yZW1vdmVEaXIoXCIvXCIpIC8vIFJlbW92ZSBldmVyeXRoaW5nLlxuICAgICAqL1xuICAgIGFzeW5jIHJlbW92ZURpcihyZW1vdGVEaXJQYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGl0QXRDdXJyZW50RGlyZWN0b3J5KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2QocmVtb3RlRGlyUGF0aCk7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHRhcmdldCBiZWNhdXNlIHJlbW90ZURpclBhdGggbWlnaHQgYmUgYSByZWxhdGl2ZSBwYXRoLCBldmVuIGAuLi9gIGlzIHBvc3NpYmxlLlxuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVEaXJQYXRoID0gYXdhaXQgdGhpcy5wd2QoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYXJXb3JraW5nRGlyKCk7XG4gICAgICAgICAgICBjb25zdCBkaXJJc1Jvb3QgPSBhYnNvbHV0ZURpclBhdGggPT09IFwiL1wiO1xuICAgICAgICAgICAgaWYgKCFkaXJJc1Jvb3QpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNkdXAoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUVtcHR5RGlyKGFic29sdXRlRGlyUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBpbiB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2l0aG91dCByZW1vdmluZ1xuICAgICAqIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBpdHNlbGYuXG4gICAgICovXG4gICAgYXN5bmMgY2xlYXJXb3JraW5nRGlyKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgdGhpcy5saXN0KCkpIHtcbiAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZChmaWxlLm5hbWUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYXJXb3JraW5nRGlyKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZHVwKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVFbXB0eURpcihmaWxlLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmUoZmlsZS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGxvYWQgdGhlIGNvbnRlbnRzIG9mIGEgbG9jYWwgZGlyZWN0b3J5IHRvIHRoZSByZW1vdGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZXMgYW5kIHJldXNlIGV4aXN0aW5nIGRpcmVjdG9yaWVzLlxuICAgICAqIFVucmVsYXRlZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgd2lsbCByZW1haW4gdW50b3VjaGVkLiBZb3UgY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhIGByZW1vdGVEaXJQYXRoYFxuICAgICAqIHRvIHB1dCB0aGUgY29udGVudHMgaW5zaWRlIGEgZGlyZWN0b3J5IHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBpZiBuZWNlc3NhcnkgaW5jbHVkaW5nIGFsbFxuICAgICAqIGludGVybWVkaWF0ZSBkaXJlY3Rvcmllcy4gSWYgeW91IGRpZCBwcm92aWRlIGEgcmVtb3RlRGlyUGF0aCB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2lsbCBzdGF5XG4gICAgICogdGhlIHNhbWUgYXMgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9jYWxEaXJQYXRoICBMb2NhbCBwYXRoLCBlLmcuIFwiZm9vL2JhclwiIG9yIFwiLi4vdGVzdFwiXG4gICAgICogQHBhcmFtIFtyZW1vdGVEaXJQYXRoXSAgUmVtb3RlIHBhdGggb2YgYSBkaXJlY3RvcnkgdG8gdXBsb2FkIHRvLiBXb3JraW5nIGRpcmVjdG9yeSBpZiB1bmRlZmluZWQuXG4gICAgICovXG4gICAgYXN5bmMgdXBsb2FkRnJvbURpcihsb2NhbERpclBhdGgsIHJlbW90ZURpclBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4aXRBdEN1cnJlbnREaXJlY3RvcnkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlbW90ZURpclBhdGgpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZURpcihyZW1vdGVEaXJQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91cGxvYWRUb1dvcmtpbmdEaXIobG9jYWxEaXJQYXRoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBfdXBsb2FkVG9Xb3JraW5nRGlyKGxvY2FsRGlyUGF0aCkge1xuICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzUmVhZERpcihsb2NhbERpclBhdGgpO1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gKDAsIHBhdGhfMS5qb2luKShsb2NhbERpclBhdGgsIGZpbGUpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmc1N0YXQoZnVsbFBhdGgpO1xuICAgICAgICAgICAgaWYgKHN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGxvYWRGcm9tKGZ1bGxQYXRoLCBmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9vcGVuRGlyKGZpbGUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3VwbG9hZFRvV29ya2luZ0RpcihmdWxsUGF0aCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZHVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRG93bmxvYWQgYWxsIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBvZiB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gYSBsb2NhbCBkaXJlY3RvcnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbG9jYWxEaXJQYXRoICBUaGUgbG9jYWwgZGlyZWN0b3J5IHRvIGRvd25sb2FkIHRvLlxuICAgICAqIEBwYXJhbSByZW1vdGVEaXJQYXRoICBSZW1vdGUgZGlyZWN0b3J5IHRvIGRvd25sb2FkLiBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlmIG5vdCBzcGVjaWZpZWQuXG4gICAgICovXG4gICAgYXN5bmMgZG93bmxvYWRUb0Rpcihsb2NhbERpclBhdGgsIHJlbW90ZURpclBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4aXRBdEN1cnJlbnREaXJlY3RvcnkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlbW90ZURpclBhdGgpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNkKHJlbW90ZURpclBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2Rvd25sb2FkRnJvbVdvcmtpbmdEaXIobG9jYWxEaXJQYXRoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBfZG93bmxvYWRGcm9tV29ya2luZ0Rpcihsb2NhbERpclBhdGgpIHtcbiAgICAgICAgYXdhaXQgZW5zdXJlTG9jYWxEaXJlY3RvcnkobG9jYWxEaXJQYXRoKTtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHRoaXMubGlzdCgpKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFBhdGggPSAoMCwgcGF0aF8xLmpvaW4pKGxvY2FsRGlyUGF0aCwgZmlsZS5uYW1lKTtcbiAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZChmaWxlLm5hbWUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Rvd25sb2FkRnJvbVdvcmtpbmdEaXIobG9jYWxQYXRoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNkdXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZpbGUuaXNGaWxlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kb3dubG9hZFRvKGxvY2FsUGF0aCwgZmlsZS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlIHN1cmUgYSBnaXZlbiByZW1vdGUgcGF0aCBleGlzdHMsIGNyZWF0aW5nIGFsbCBkaXJlY3RvcmllcyBhcyBuZWNlc3NhcnkuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoYW5nZXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIGdpdmVuIHBhdGguXG4gICAgICovXG4gICAgYXN5bmMgZW5zdXJlRGlyKHJlbW90ZURpclBhdGgpIHtcbiAgICAgICAgLy8gSWYgdGhlIHJlbW90ZURpclBhdGggd2FzIGFic29sdXRlIGdvIHRvIHJvb3QgZGlyZWN0b3J5LlxuICAgICAgICBpZiAocmVtb3RlRGlyUGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jZChcIi9cIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZXMgPSByZW1vdGVEaXJQYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIobmFtZSA9PiBuYW1lICE9PSBcIlwiKTtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9vcGVuRGlyKG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRyeSB0byBjcmVhdGUgYSBkaXJlY3RvcnkgYW5kIGVudGVyIGl0LiBUaGlzIHdpbGwgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZGlyZWN0b3J5XG4gICAgICogY291bGRuJ3QgYmUgY3JlYXRlZCBpZiBmb3IgZXhhbXBsZSBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX29wZW5EaXIoZGlyTmFtZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiTUtEIFwiICsgZGlyTmFtZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuY2QoZGlyTmFtZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBlbXB0eSBkaXJlY3RvcnksIHdpbGwgZmFpbCBpZiBub3QgZW1wdHkuXG4gICAgICovXG4gICAgYXN5bmMgcmVtb3ZlRW1wdHlEaXIocGF0aCkge1xuICAgICAgICBjb25zdCB2YWxpZFBhdGggPSBhd2FpdCB0aGlzLnByb3RlY3RXaGl0ZXNwYWNlKHBhdGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKGBSTUQgJHt2YWxpZFBhdGh9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZUUCBzZXJ2ZXJzIGNhbid0IGhhbmRsZSBmaWxlbmFtZXMgdGhhdCBoYXZlIGxlYWRpbmcgd2hpdGVzcGFjZS4gVGhpcyBtZXRob2QgdHJhbnNmb3Jtc1xuICAgICAqIGEgZ2l2ZW4gcGF0aCB0byBmaXggdGhhdCBpc3N1ZSBmb3IgbW9zdCBjYXNlcy5cbiAgICAgKi9cbiAgICBhc3luYyBwcm90ZWN0V2hpdGVzcGFjZShwYXRoKSB7XG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKFwiIFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFuZGxlIGxlYWRpbmcgd2hpdGVzcGFjZSBieSBwcmVwZW5kaW5nIHRoZSBhYnNvbHV0ZSBwYXRoOlxuICAgICAgICAvLyBcIiB0ZXN0LnR4dFwiIHdoaWxlIGJlaW5nIGluIHRoZSByb290IGRpcmVjdG9yeSBiZWNvbWVzIFwiLyB0ZXN0LnR4dFwiLlxuICAgICAgICBjb25zdCBwd2QgPSBhd2FpdCB0aGlzLnB3ZCgpO1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGhQcmVmaXggPSBwd2QuZW5kc1dpdGgoXCIvXCIpID8gcHdkIDogcHdkICsgXCIvXCI7XG4gICAgICAgIHJldHVybiBhYnNvbHV0ZVBhdGhQcmVmaXggKyBwYXRoO1xuICAgIH1cbiAgICBhc3luYyBfZXhpdEF0Q3VycmVudERpcmVjdG9yeShmdW5jKSB7XG4gICAgICAgIGNvbnN0IHVzZXJEaXIgPSBhd2FpdCB0aGlzLnB3ZCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpZ25vcmVFcnJvcigoKSA9PiB0aGlzLmNkKHVzZXJEaXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcnkgYWxsIGF2YWlsYWJsZSB0cmFuc2ZlciBzdHJhdGVnaWVzIGFuZCBwaWNrIHRoZSBmaXJzdCBvbmUgdGhhdCB3b3Jrcy4gVXBkYXRlIGBjbGllbnRgIHRvXG4gICAgICogdXNlIHRoZSB3b3JraW5nIHN0cmF0ZWd5IGZvciBhbGwgc3VjY2Vzc2l2ZSB0cmFuc2ZlciByZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHRyeSB0aGUgcHJvdmlkZWQgc3RyYXRlZ2llcy5cbiAgICAgKi9cbiAgICBfZW50ZXJGaXJzdENvbXBhdGlibGVNb2RlKHN0cmF0ZWdpZXMpIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jIChmdHApID0+IHtcbiAgICAgICAgICAgIGZ0cC5sb2coXCJUcnlpbmcgdG8gZmluZCBvcHRpbWFsIHRyYW5zZmVyIHN0cmF0ZWd5Li4uXCIpO1xuICAgICAgICAgICAgbGV0IGxhc3RFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RyYXRlZ3kgb2Ygc3RyYXRlZ2llcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHN0cmF0ZWd5KGZ0cCk7XG4gICAgICAgICAgICAgICAgICAgIGZ0cC5sb2coXCJPcHRpbWFsIHRyYW5zZmVyIHN0cmF0ZWd5IGZvdW5kLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlVHJhbnNmZXIgPSBzdHJhdGVneTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRoZSBuZXh0IGNhbmRpZGF0ZSBubyBtYXR0ZXIgdGhlIGV4YWN0IGVycm9yLiBJdCdzIHBvc3NpYmxlIHRoYXQgYSBzZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5zd2VyZWQgaW5jb3JyZWN0bHkgdG8gYSBzdHJhdGVneSwgZm9yIGV4YW1wbGUgYSBQQVNWIGFuc3dlciB0byBhbiBFUFNWLlxuICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb25lIG9mIHRoZSBhdmFpbGFibGUgdHJhbnNmZXIgc3RyYXRlZ2llcyB3b3JrLiBMYXN0IGVycm9yIHJlc3BvbnNlIHdhcyAnJHtsYXN0RXJyb3J9Jy5gKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRCwgdXNlIGB1cGxvYWRGcm9tYC5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZChzb3VyY2UsIHRvUmVtb3RlUGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZnRwLmxvZyhcIldhcm5pbmc6IHVwbG9hZCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHVzZSB1cGxvYWRGcm9tKCkuXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRGcm9tKHNvdXJjZSwgdG9SZW1vdGVQYXRoLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRCwgdXNlIGBhcHBlbmRGcm9tYC5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFzeW5jIGFwcGVuZChzb3VyY2UsIHRvUmVtb3RlUGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZnRwLmxvZyhcIldhcm5pbmc6IGFwcGVuZCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHVzZSBhcHBlbmRGcm9tKCkuXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBlbmRGcm9tKHNvdXJjZSwgdG9SZW1vdGVQYXRoLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRCwgdXNlIGBkb3dubG9hZFRvYC5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFzeW5jIGRvd25sb2FkKGRlc3RpbmF0aW9uLCBmcm9tUmVtb3RlUGF0aCwgc3RhcnRBdCA9IDApIHtcbiAgICAgICAgdGhpcy5mdHAubG9nKFwiV2FybmluZzogZG93bmxvYWQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCB1c2UgZG93bmxvYWRUbygpLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG93bmxvYWRUbyhkZXN0aW5hdGlvbiwgZnJvbVJlbW90ZVBhdGgsIHN0YXJ0QXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBERVBSRUNBVEVELCB1c2UgYHVwbG9hZEZyb21EaXJgLlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYXN5bmMgdXBsb2FkRGlyKGxvY2FsRGlyUGF0aCwgcmVtb3RlRGlyUGF0aCkge1xuICAgICAgICB0aGlzLmZ0cC5sb2coXCJXYXJuaW5nOiB1cGxvYWREaXIoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCB1c2UgdXBsb2FkRnJvbURpcigpLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkRnJvbURpcihsb2NhbERpclBhdGgsIHJlbW90ZURpclBhdGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBERVBSRUNBVEVELCB1c2UgYGRvd25sb2FkVG9EaXJgLlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYXN5bmMgZG93bmxvYWREaXIobG9jYWxEaXJQYXRoKSB7XG4gICAgICAgIHRoaXMuZnRwLmxvZyhcIldhcm5pbmc6IGRvd25sb2FkRGlyKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgdXNlIGRvd25sb2FkVG9EaXIoKS5cIik7XG4gICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkVG9EaXIobG9jYWxEaXJQYXRoKTtcbiAgICB9XG59XG5leHBvcnRzLkNsaWVudCA9IENsaWVudDtcbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZUxvY2FsRGlyZWN0b3J5KHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBmc1N0YXQocGF0aCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgYXdhaXQgZnNNa0RpcihwYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG59XG5hc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcihmdW5jKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBJZ25vcmVcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRmlsZUluZm8gPSBleHBvcnRzLkZpbGVUeXBlID0gdm9pZCAwO1xudmFyIEZpbGVUeXBlO1xuKGZ1bmN0aW9uIChGaWxlVHlwZSkge1xuICAgIEZpbGVUeXBlW0ZpbGVUeXBlW1wiVW5rbm93blwiXSA9IDBdID0gXCJVbmtub3duXCI7XG4gICAgRmlsZVR5cGVbRmlsZVR5cGVbXCJGaWxlXCJdID0gMV0gPSBcIkZpbGVcIjtcbiAgICBGaWxlVHlwZVtGaWxlVHlwZVtcIkRpcmVjdG9yeVwiXSA9IDJdID0gXCJEaXJlY3RvcnlcIjtcbiAgICBGaWxlVHlwZVtGaWxlVHlwZVtcIlN5bWJvbGljTGlua1wiXSA9IDNdID0gXCJTeW1ib2xpY0xpbmtcIjtcbn0pKEZpbGVUeXBlIHx8IChleHBvcnRzLkZpbGVUeXBlID0gRmlsZVR5cGUgPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgYSBmaWxlLCBkaXJlY3Rvcnkgb3Igc3ltYm9saWMgbGluay5cbiAqL1xuY2xhc3MgRmlsZUluZm8ge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy50eXBlID0gRmlsZVR5cGUuVW5rbm93bjtcbiAgICAgICAgdGhpcy5zaXplID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVucGFyc2VkLCByYXcgbW9kaWZpY2F0aW9uIGRhdGUgYXMgYSBzdHJpbmcuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIGBtb2RpZmllZEF0YCBpcyB1bmRlZmluZWQsIHRoZSBGVFAgc2VydmVyIHlvdSdyZSBjb25uZWN0ZWQgdG8gZG9lc24ndCBzdXBwb3J0IHRoZSBtb3JlIG1vZGVyblxuICAgICAgICAgKiBNTFNEIGNvbW1hbmQgZm9yIG1hY2hpbmUtcmVhZGFibGUgZGlyZWN0b3J5IGxpc3RpbmdzLiBUaGUgb2xkZXIgY29tbWFuZCBMSVNUIGlzIHRoZW4gdXNlZCByZXR1cm5pbmdcbiAgICAgICAgICogcmVzdWx0cyB0aGF0IHZhcnkgYSBsb3QgYmV0d2VlbiBzZXJ2ZXJzIGFzIHRoZSBmb3JtYXQgaGFzbid0IGJlZW4gc3RhbmRhcmRpemVkLiBIZXJlLCBkaXJlY3RvcnkgbGlzdGluZ3NcbiAgICAgICAgICogYW5kIGVzcGVjaWFsbHkgbW9kaWZpY2F0aW9uIGRhdGVzIHdlcmUgbWVhbnQgdG8gYmUgaHVtYW4tcmVhZGFibGUgZmlyc3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEJlIGNhcmVmdWwgd2hlbiBzdGlsbCB0cnlpbmcgdG8gcGFyc2UgdGhpcyBieSB5b3Vyc2VsZi4gUGFyc2luZyBkYXRlcyBmcm9tIGxpc3RpbmdzIHVzaW5nIExJU1QgaXNcbiAgICAgICAgICogdW5yZWxpYWJsZS4gVGhpcyBsaWJyYXJ5IGRlY2lkZXMgdG8gb2ZmZXIgcGFyc2VkIGRhdGVzIG9ubHkgd2hlbiB0aGV5J3JlIGFic29sdXRlbHkgcmVsaWFibGUgYW5kIHNhZmUgdG9cbiAgICAgICAgICogdXNlIGUuZy4gZm9yIGNvbXBhcmlzb25zLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yYXdNb2RpZmllZEF0ID0gXCJcIjtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBhcnNlZCBtb2RpZmljYXRpb24gZGF0ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQXZhaWxhYmxlIGlmIHRoZSBGVFAgc2VydmVyIHN1cHBvcnRzIHRoZSBNTFNEIGNvbW1hbmQuIE9ubHkgTUxTRCBndWFyYW50ZWVzIGRhdGVzIHRoYW4gY2FuIGJlIHJlbGlhYmx5XG4gICAgICAgICAqIHBhcnNlZCB3aXRoIHRoZSBjb3JyZWN0IHRpbWV6b25lIGFuZCBhIHJlc29sdXRpb24gZG93biB0byBzZWNvbmRzLiBTZWUgYHJhd01vZGlmaWVkQXRgIHByb3BlcnR5IGZvciB0aGUgdW5wYXJzZWRcbiAgICAgICAgICogZGF0ZSB0aGF0IGlzIGFsd2F5cyBhdmFpbGFibGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1vZGlmaWVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbml4IHBlcm1pc3Npb25zIGlmIHByZXNlbnQuIElmIHRoZSB1bmRlcmx5aW5nIEZUUCBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcgb24gVW5peCB0aGlzIHdpbGwgYmUgdW5kZWZpbmVkLlxuICAgICAgICAgKiBJZiBzZXQsIHlvdSBtaWdodCBiZSBhYmxlIHRvIGVkaXQgcGVybWlzc2lvbnMgd2l0aCB0aGUgRlRQIGNvbW1hbmQgYFNJVEUgQ0hNT0RgLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhhcmQgbGluayBjb3VudCBpZiBhdmFpbGFibGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmhhcmRMaW5rQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaW5rIG5hbWUgZm9yIHN5bWJvbGljIGxpbmtzIGlmIGF2YWlsYWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGluayA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVuaXggZ3JvdXAgaWYgYXZhaWxhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ncm91cCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVuaXggdXNlciBpZiBhdmFpbGFibGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVzZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmlxdWUgSUQgaWYgYXZhaWxhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51bmlxdWVJRCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB9XG4gICAgZ2V0IGlzRGlyZWN0b3J5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSBGaWxlVHlwZS5EaXJlY3Rvcnk7XG4gICAgfVxuICAgIGdldCBpc1N5bWJvbGljTGluaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gRmlsZVR5cGUuU3ltYm9saWNMaW5rO1xuICAgIH1cbiAgICBnZXQgaXNGaWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSBGaWxlVHlwZS5GaWxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLCBsZWdhY3kgQVBJLiBVc2UgYHJhd01vZGlmaWVkQXRgIGluc3RlYWQuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBnZXQgZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3TW9kaWZpZWRBdDtcbiAgICB9XG4gICAgc2V0IGRhdGUocmF3TW9kaWZpZWRBdCkge1xuICAgICAgICB0aGlzLnJhd01vZGlmaWVkQXQgPSByYXdNb2RpZmllZEF0O1xuICAgIH1cbn1cbmV4cG9ydHMuRmlsZUluZm8gPSBGaWxlSW5mbztcbkZpbGVJbmZvLlVuaXhQZXJtaXNzaW9uID0ge1xuICAgIFJlYWQ6IDQsXG4gICAgV3JpdGU6IDIsXG4gICAgRXhlY3V0ZTogMVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5GVFBDb250ZXh0ID0gZXhwb3J0cy5GVFBFcnJvciA9IHZvaWQgMDtcbmNvbnN0IG5ldF8xID0gcmVxdWlyZShcIm5ldFwiKTtcbmNvbnN0IHBhcnNlQ29udHJvbFJlc3BvbnNlXzEgPSByZXF1aXJlKFwiLi9wYXJzZUNvbnRyb2xSZXNwb25zZVwiKTtcbi8qKlxuICogRGVzY3JpYmVzIGFuIEZUUCBzZXJ2ZXIgZXJyb3IgcmVzcG9uc2UgaW5jbHVkaW5nIHRoZSBGVFAgcmVzcG9uc2UgY29kZS5cbiAqL1xuY2xhc3MgRlRQRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IocmVzKSB7XG4gICAgICAgIHN1cGVyKHJlcy5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICB0aGlzLmNvZGUgPSByZXMuY29kZTtcbiAgICB9XG59XG5leHBvcnRzLkZUUEVycm9yID0gRlRQRXJyb3I7XG5mdW5jdGlvbiBkb05vdGhpbmcoKSB7XG4gICAgLyoqIERvIG5vdGhpbmcgKi9cbn1cbi8qKlxuICogRlRQQ29udGV4dCBob2xkcyB0aGUgY29udHJvbCBhbmQgZGF0YSBzb2NrZXRzIG9mIGFuIEZUUCBjb25uZWN0aW9uIGFuZCBwcm92aWRlcyBhXG4gKiBzaW1wbGlmaWVkIHdheSB0byBpbnRlcmFjdCB3aXRoIGFuIEZUUCBzZXJ2ZXIsIGhhbmRsZSByZXNwb25zZXMsIGVycm9ycyBhbmQgdGltZW91dHMuXG4gKlxuICogSXQgZG9lc24ndCBpbXBsZW1lbnQgb3IgdXNlIGFueSBGVFAgY29tbWFuZHMuIEl0J3Mgb25seSBhIGZvdW5kYXRpb24gdG8gbWFrZSB3cml0aW5nIGFuIEZUUFxuICogY2xpZW50IGFzIGVhc3kgYXMgcG9zc2libGUuIFlvdSB3b24ndCB1c3VhbGx5IGluc3RhbnRpYXRlIHRoaXMsIGJ1dCB1c2UgYENsaWVudGAuXG4gKi9cbmNsYXNzIEZUUENvbnRleHQge1xuICAgIC8qKlxuICAgICAqIEluc3RhbnRpYXRlIGFuIEZUUCBjb250ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHRpbWVvdXQgLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhcHBseSB0byBjb250cm9sIGFuZCBkYXRhIGNvbm5lY3Rpb25zLiBVc2UgMCBmb3Igbm8gdGltZW91dC5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgLSBFbmNvZGluZyB0byB1c2UgZm9yIGNvbnRyb2wgY29ubmVjdGlvbi4gVVRGLTggYnkgZGVmYXVsdC4gVXNlIFwibGF0aW4xXCIgZm9yIG9sZGVyIHNlcnZlcnMuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodGltZW91dCA9IDAsIGVuY29kaW5nID0gXCJ1dGY4XCIpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgLyoqIERlYnVnLWxldmVsIGxvZ2dpbmcgb2YgYWxsIHNvY2tldCBjb21tdW5pY2F0aW9uLiAqL1xuICAgICAgICB0aGlzLnZlcmJvc2UgPSBmYWxzZTtcbiAgICAgICAgLyoqIElQIHZlcnNpb24gdG8gcHJlZmVyICg0OiBJUHY0LCA2OiBJUHY2LCB1bmRlZmluZWQ6IGF1dG9tYXRpYykuICovXG4gICAgICAgIHRoaXMuaXBGYW1pbHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKiBPcHRpb25zIGZvciBUTFMgY29ubmVjdGlvbnMuICovXG4gICAgICAgIHRoaXMudGxzT3B0aW9ucyA9IHt9O1xuICAgICAgICAvKiogQSBtdWx0aWxpbmUgcmVzcG9uc2UgbWlnaHQgYmUgcmVjZWl2ZWQgYXMgbXVsdGlwbGUgY2h1bmtzLiAqL1xuICAgICAgICB0aGlzLl9wYXJ0aWFsUmVzcG9uc2UgPSBcIlwiO1xuICAgICAgICB0aGlzLl9lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgICAgICAvLyBIZWxwIFR5cGVzY3JpcHQgdW5kZXJzdGFuZCB0aGF0IHdlIGRvIGluZGVlZCBzZXQgX3NvY2tldCBpbiB0aGUgY29uc3RydWN0b3IgYnV0IHVzZSB0aGUgc2V0dGVyIG1ldGhvZCB0byBkbyBzby5cbiAgICAgICAgdGhpcy5fc29ja2V0ID0gdGhpcy5zb2NrZXQgPSB0aGlzLl9uZXdTb2NrZXQoKTtcbiAgICAgICAgdGhpcy5fZGF0YVNvY2tldCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIGNvbnRleHQuXG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIC8vIEludGVybmFsbHksIGNsb3NpbmcgYSBjb250ZXh0IGlzIGFsd2F5cyBkZXNjcmliZWQgd2l0aCBhbiBlcnJvci4gSWYgdGhlcmUgaXMgc3RpbGwgYSB0YXNrIHJ1bm5pbmcsIGl0IHdpbGxcbiAgICAgICAgLy8gYWJvcnQgd2l0aCBhbiBleGNlcHRpb24gdGhhdCB0aGUgdXNlciBjbG9zZWQgdGhlIGNsaWVudCBkdXJpbmcgYSB0YXNrLiBJZiBubyB0YXNrIGlzIHJ1bm5pbmcsIG5vIGV4Y2VwdGlvbiBpc1xuICAgICAgICAvLyB0aHJvd24gYnV0IGFsbCBuZXdseSBzdWJtaXR0ZWQgdGFza3MgYWZ0ZXIgdGhhdCB3aWxsIGFib3J0IHRoZSBleGNlcHRpb24gdGhhdCB0aGUgY2xpZW50IGhhcyBiZWVuIGNsb3NlZC5cbiAgICAgICAgLy8gSW4gYWRkaXRpb24gdGhlIHVzZXIgd2lsbCBnZXQgYSBzdGFjayB0cmFjZSBwb2ludGluZyB0byB3aGVyZSBleGFjdGx5IHRoZSBjbGllbnQgaGFzIGJlZW4gY2xvc2VkLiBTbyBpbiBhbnlcbiAgICAgICAgLy8gY2FzZSB1c2UgX2Nsb3NpbmdFcnJvciB0byBkZXRlcm1pbmUgd2hldGhlciBhIGNvbnRleHQgaXMgY2xvc2VkLiBUaGlzIGFsc28gYWxsb3dzIHVzIHRvIGhhdmUgYSBzaW5nbGUgY29kZS1wYXRoXG4gICAgICAgIC8vIGZvciBjbG9zaW5nIGEgY29udGV4dCBtYWtpbmcgdGhlIGltcGxlbWVudGF0aW9uIGVhc2llci5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuX3Rhc2sgPyBcIlVzZXIgY2xvc2VkIGNsaWVudCBkdXJpbmcgdGFza1wiIDogXCJVc2VyIGNsb3NlZCBjbGllbnRcIjtcbiAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKGVycik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjb250ZXh0IHdpdGggYW4gZXJyb3IuXG4gICAgICovXG4gICAgY2xvc2VXaXRoRXJyb3IoZXJyKSB7XG4gICAgICAgIC8vIElmIHRoaXMgY29udGV4dCBhbHJlYWR5IGhhcyBiZWVuIGNsb3NlZCwgZG9uJ3Qgb3ZlcndyaXRlIHRoZSByZWFzb24uXG4gICAgICAgIGlmICh0aGlzLl9jbG9zaW5nRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jbG9zaW5nRXJyb3IgPSBlcnI7XG4gICAgICAgIC8vIENsb3NlIHRoZSBzb2NrZXRzIGJ1dCBkb24ndCBmdWxseSByZXNldCB0aGlzIGNvbnRleHQgdG8gcHJlc2VydmUgYHRoaXMuX2Nsb3NpbmdFcnJvcmAuXG4gICAgICAgIHRoaXMuX2Nsb3NlQ29udHJvbFNvY2tldCgpO1xuICAgICAgICB0aGlzLl9jbG9zZVNvY2tldCh0aGlzLl9kYXRhU29ja2V0KTtcbiAgICAgICAgLy8gR2l2ZSB0aGUgdXNlcidzIHRhc2sgYSBjaGFuY2UgdG8gcmVhY3QsIG1heWJlIGNsZWFudXAgcmVzb3VyY2VzLlxuICAgICAgICB0aGlzLl9wYXNzVG9IYW5kbGVyKGVycik7XG4gICAgICAgIC8vIFRoZSB0YXNrIG1pZ2h0IG5vdCBoYXZlIGJlZW4gcmVqZWN0ZWQgYnkgdGhlIHVzZXIgYWZ0ZXIgcmVjZWl2aW5nIHRoZSBlcnJvci5cbiAgICAgICAgdGhpcy5fc3RvcFRyYWNraW5nVGFzaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb250ZXh0IGhhcyBiZWVuIGNsb3NlZCBvciBoYXNuJ3QgYmVlbiBjb25uZWN0ZWQgeWV0LiBZb3UgY2FuIHJlb3BlbiBpdCB3aXRoIGBhY2Nlc3NgLlxuICAgICAqL1xuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5yZW1vdGVBZGRyZXNzID09PSB1bmRlZmluZWQgfHwgdGhpcy5fY2xvc2luZ0Vycm9yICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0IHRoaXMgY29udGV4IGFuZCBhbGwgb2YgaXRzIHN0YXRlLlxuICAgICAqL1xuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHRoaXMuX25ld1NvY2tldCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEZUUCBjb250cm9sIHNvY2tldC5cbiAgICAgKi9cbiAgICBnZXQgc29ja2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ja2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHNvY2tldCBmb3IgdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4gVGhpcyB3aWxsIG9ubHkgY2xvc2UgdGhlIGN1cnJlbnQgY29udHJvbCBzb2NrZXRcbiAgICAgKiBpZiB0aGUgbmV3IG9uZSBpcyBub3QgYW4gdXBncmFkZSB0byB0aGUgY3VycmVudCBvbmUuXG4gICAgICovXG4gICAgc2V0IHNvY2tldChzb2NrZXQpIHtcbiAgICAgICAgLy8gTm8gZGF0YSBzb2NrZXQgc2hvdWxkIGJlIG9wZW4gaW4gYW55IGNhc2Ugd2hlcmUgdGhlIGNvbnRyb2wgc29ja2V0IGlzIHNldCBvciB1cGdyYWRlZC5cbiAgICAgICAgdGhpcy5kYXRhU29ja2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBUaGlzIGJlaW5nIGEgcmVzZXQsIHJlc2V0IGFueSBvdGhlciBzdGF0ZSBhcGFydCBmcm9tIHRoZSBzb2NrZXQuXG4gICAgICAgIHRoaXMudGxzT3B0aW9ucyA9IHt9O1xuICAgICAgICB0aGlzLl9wYXJ0aWFsUmVzcG9uc2UgPSBcIlwiO1xuICAgICAgICBpZiAodGhpcy5fc29ja2V0KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdTb2NrZXRVcGdyYWRlc0V4aXN0aW5nID0gc29ja2V0LmxvY2FsUG9ydCA9PT0gdGhpcy5fc29ja2V0LmxvY2FsUG9ydDtcbiAgICAgICAgICAgIGlmIChuZXdTb2NrZXRVcGdyYWRlc0V4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlU29ja2V0TGlzdGVuZXJzKHRoaXMuc29ja2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlQ29udHJvbFNvY2tldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzb2NrZXQpIHtcbiAgICAgICAgICAgIC8vIFNldHRpbmcgYSBjb21wbGV0ZWx5IG5ldyBjb250cm9sIHNvY2tldCBpcyBpbiBlc3NlbmNlIHNvbWV0aGluZyBsaWtlIGEgcmVzZXQuIFRoYXQnc1xuICAgICAgICAgICAgLy8gd2h5IHdlIGFsc28gY2xvc2UgYW55IG9wZW4gZGF0YSBjb25uZWN0aW9uIGFib3ZlLiBXZSBjYW4gZ28gb25lIHN0ZXAgZnVydGhlciBhbmQgcmVzZXRcbiAgICAgICAgICAgIC8vIGEgcG9zc2libGUgY2xvc2luZyBlcnJvci4gVGhhdCBtZWFucyB0aGF0IGEgY2xvc2VkIEZUUENvbnRleHQgY2FuIGJlIFwicmVvcGVuZWRcIiBieVxuICAgICAgICAgICAgLy8gc2V0dGluZyBhIG5ldyBjb250cm9sIHNvY2tldC5cbiAgICAgICAgICAgIHRoaXMuX2Nsb3NpbmdFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIC8vIERvbid0IHNldCBhIHRpbWVvdXQgeWV0LiBUaW1lb3V0IGZvciBjb250cm9sIHNvY2tldHMgaXMgb25seSBhY3RpdmUgZHVyaW5nIGEgdGFzaywgc2VlIGhhbmRsZSgpIGJlbG93LlxuICAgICAgICAgICAgc29ja2V0LnNldFRpbWVvdXQoMCk7XG4gICAgICAgICAgICBzb2NrZXQuc2V0RW5jb2RpbmcodGhpcy5fZW5jb2RpbmcpO1xuICAgICAgICAgICAgc29ja2V0LnNldEtlZXBBbGl2ZSh0cnVlKTtcbiAgICAgICAgICAgIHNvY2tldC5vbihcImRhdGFcIiwgZGF0YSA9PiB0aGlzLl9vbkNvbnRyb2xTb2NrZXREYXRhKGRhdGEpKTtcbiAgICAgICAgICAgIC8vIFNlcnZlciBzZW5kaW5nIGEgRklOIHBhY2tldCBpcyB0cmVhdGVkIGFzIGFuIGVycm9yLlxuICAgICAgICAgICAgc29ja2V0Lm9uKFwiZW5kXCIsICgpID0+IHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IEVycm9yKFwiU2VydmVyIHNlbnQgRklOIHBhY2tldCB1bmV4cGVjdGVkbHksIGNsb3NpbmcgY29ubmVjdGlvbi5cIikpKTtcbiAgICAgICAgICAgIC8vIENvbnRyb2wgYmVpbmcgY2xvc2VkIHdpdGhvdXQgZXJyb3IgYnkgc2VydmVyIGlzIHRyZWF0ZWQgYXMgYW4gZXJyb3IuXG4gICAgICAgICAgICBzb2NrZXQub24oXCJjbG9zZVwiLCBoYWRFcnJvciA9PiB7IGlmICghaGFkRXJyb3IpXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihuZXcgRXJyb3IoXCJTZXJ2ZXIgY2xvc2VkIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5LlwiKSk7IH0pO1xuICAgICAgICAgICAgdGhpcy5fc2V0dXBEZWZhdWx0RXJyb3JIYW5kbGVycyhzb2NrZXQsIFwiY29udHJvbCBzb2NrZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc29ja2V0ID0gc29ja2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgRlRQIGRhdGEgY29ubmVjdGlvbiBpZiBwcmVzZW50LlxuICAgICAqL1xuICAgIGdldCBkYXRhU29ja2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVNvY2tldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzb2NrZXQgZm9yIHRoZSBkYXRhIGNvbm5lY3Rpb24uIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGNsb3NlIHRoZSBmb3JtZXIgZGF0YSBzb2NrZXQuXG4gICAgICovXG4gICAgc2V0IGRhdGFTb2NrZXQoc29ja2V0KSB7XG4gICAgICAgIHRoaXMuX2Nsb3NlU29ja2V0KHRoaXMuX2RhdGFTb2NrZXQpO1xuICAgICAgICBpZiAoc29ja2V0KSB7XG4gICAgICAgICAgICAvLyBEb24ndCBzZXQgYSB0aW1lb3V0IHlldC4gVGltZW91dCBkYXRhIHNvY2tldCBzaG91bGQgYmUgYWN0aXZhdGVkIHdoZW4gZGF0YSB0cmFuc21pc3Npb24gc3RhcnRzXG4gICAgICAgICAgICAvLyBhbmQgdGltZW91dCBvbiBjb250cm9sIHNvY2tldCBpcyBkZWFjdGl2YXRlZC5cbiAgICAgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgICAgICAgICAgdGhpcy5fc2V0dXBEZWZhdWx0RXJyb3JIYW5kbGVycyhzb2NrZXQsIFwiZGF0YSBzb2NrZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGF0YVNvY2tldCA9IHNvY2tldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50bHkgdXNlZCBlbmNvZGluZy5cbiAgICAgKi9cbiAgICBnZXQgZW5jb2RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBlbmNvZGluZyB1c2VkIGZvciB0aGUgY29udHJvbCBzb2NrZXQuXG4gICAgICpcbiAgICAgKiBTZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9idWZmZXIuaHRtbCNidWZmZXJfYnVmZmVyc19hbmRfY2hhcmFjdGVyX2VuY29kaW5ncyBmb3Igd2hhdCBlbmNvZGluZ3NcbiAgICAgKiBhcmUgc3VwcG9ydGVkIGJ5IE5vZGUuXG4gICAgICovXG4gICAgc2V0IGVuY29kaW5nKGVuY29kaW5nKSB7XG4gICAgICAgIHRoaXMuX2VuY29kaW5nID0gZW5jb2Rpbmc7XG4gICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2V0RW5jb2RpbmcoZW5jb2RpbmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYW4gRlRQIGNvbW1hbmQgd2l0aG91dCB3YWl0aW5nIGZvciBvciBoYW5kbGluZyB0aGUgcmVzdWx0LlxuICAgICAqL1xuICAgIHNlbmQoY29tbWFuZCkge1xuICAgICAgICBjb25zdCBjb250YWluc1Bhc3N3b3JkID0gY29tbWFuZC5zdGFydHNXaXRoKFwiUEFTU1wiKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGNvbnRhaW5zUGFzc3dvcmQgPyBcIj4gUEFTUyAjIyNcIiA6IGA+ICR7Y29tbWFuZH1gO1xuICAgICAgICB0aGlzLmxvZyhtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5fc29ja2V0LndyaXRlKGNvbW1hbmQgKyBcIlxcclxcblwiLCB0aGlzLmVuY29kaW5nKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhbiBGVFAgY29tbWFuZCBhbmQgaGFuZGxlIHRoZSBmaXJzdCByZXNwb25zZS4gVXNlIHRoaXMgaWYgeW91IGhhdmUgYSBzaW1wbGVcbiAgICAgKiByZXF1ZXN0LXJlc3BvbnNlIHNpdHVhdGlvbi5cbiAgICAgKi9cbiAgICByZXF1ZXN0KGNvbW1hbmQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlKGNvbW1hbmQsIChyZXMsIHRhc2spID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRhc2sucmVqZWN0KHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXNrLnJlc29sdmUocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYW4gRlRQIGNvbW1hbmQgYW5kIGhhbmRsZSBhbnkgcmVzcG9uc2UgdW50aWwgeW91IHJlc29sdmUvcmVqZWN0LiBVc2UgdGhpcyBpZiB5b3UgZXhwZWN0IG11bHRpcGxlIHJlc3BvbnNlc1xuICAgICAqIHRvIGEgcmVxdWVzdC4gVGhpcyByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHdpbGwgaG9sZCB3aGF0ZXZlciB0aGUgcmVzcG9uc2UgaGFuZGxlciBwYXNzZWQgb24gd2hlbiByZXNvbHZpbmcvcmVqZWN0aW5nIGl0cyB0YXNrLlxuICAgICAqL1xuICAgIGhhbmRsZShjb21tYW5kLCByZXNwb25zZUhhbmRsZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Rhc2spIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcIlVzZXIgbGF1bmNoZWQgYSB0YXNrIHdoaWxlIGFub3RoZXIgb25lIGlzIHN0aWxsIHJ1bm5pbmcuIEZvcmdvdCB0byB1c2UgJ2F3YWl0JyBvciAnLnRoZW4oKSc/XCIpO1xuICAgICAgICAgICAgZXJyLnN0YWNrICs9IGBcXG5SdW5uaW5nIHRhc2sgbGF1bmNoZWQgYXQ6ICR7dGhpcy5fdGFzay5zdGFja31gO1xuICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihlcnIpO1xuICAgICAgICAgICAgLy8gRG9uJ3QgcmV0dXJuIGhlcmUsIGNvbnRpbnVlIHdpdGggcmV0dXJuaW5nIHRoZSBQcm9taXNlIHRoYXQgd2lsbCB0aGVuIGJlIHJlamVjdGVkXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBjb250ZXh0IGNsb3NlZCBhbHJlYWR5LiBUaGF0IHdheSwgdXNlcnMgd2lsbCByZWNlaXZlIGFuIGV4Y2VwdGlvbiB3aGVyZVxuICAgICAgICAgICAgLy8gdGhleSBjYWxsZWQgdGhpcyBtZXRob2QgYnkgbWlzdGFrZS5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmVUYXNrLCByZWplY3RUYXNrKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90YXNrID0ge1xuICAgICAgICAgICAgICAgIHN0YWNrOiBuZXcgRXJyb3IoKS5zdGFjayB8fCBcIlVua25vd24gY2FsbCBzdGFja1wiLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlSGFuZGxlcixcbiAgICAgICAgICAgICAgICByZXNvbHZlcjoge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiBhcmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RvcFRyYWNraW5nVGFzaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVRhc2soYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0OiBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RvcFRyYWNraW5nVGFzaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0VGFzayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jbG9zaW5nRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGNsaWVudCBoYXMgYmVlbiBjbG9zZWQuIFByb3ZpZGUgYW4gZXJyb3IgdGhhdCBkZXNjcmliZXMgdGhpcyBvbmUgYXMgYmVpbmcgY2F1c2VkXG4gICAgICAgICAgICAgICAgLy8gYnkgYF9jbG9zaW5nRXJyb3JgLCBpbmNsdWRlIHN0YWNrIHRyYWNlcyBmb3IgYm90aC5cbiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYENsaWVudCBpcyBjbG9zZWQgYmVjYXVzZSAke3RoaXMuX2Nsb3NpbmdFcnJvci5tZXNzYWdlfWApOyAvLyBUeXBlICdFcnJvcicgaXMgbm90IGNvcnJlY3RseSBkZWZpbmVkLCBkb2Vzbid0IGhhdmUgJ2NvZGUnLlxuICAgICAgICAgICAgICAgIGVyci5zdGFjayArPSBgXFxuQ2xvc2luZyByZWFzb246ICR7dGhpcy5fY2xvc2luZ0Vycm9yLnN0YWNrfWA7XG4gICAgICAgICAgICAgICAgZXJyLmNvZGUgPSB0aGlzLl9jbG9zaW5nRXJyb3IuY29kZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5fY2xvc2luZ0Vycm9yLmNvZGUgOiBcIjBcIjtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXNzVG9IYW5kbGVyKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT25seSB0cmFjayBjb250cm9sIHNvY2tldCB0aW1lb3V0IGR1cmluZyB0aGUgbGlmZWN5Y2xlIG9mIGEgdGFzay4gVGhpcyBhdm9pZHMgdGltZW91dHMgb24gaWRsZSBzb2NrZXRzLFxuICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgc29ja2V0IGJlaGF2aW91ciB3aGljaCBpcyBub3QgZXhwZWN0ZWQgYnkgbW9zdCB1c2Vycy5cbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNldFRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICAgICAgICAgIGlmIChjb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kKGNvbW1hbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIG1lc3NhZ2UgaWYgc2V0IHRvIGJlIHZlcmJvc2UuXG4gICAgICovXG4gICAgbG9nKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMudmVyYm9zZSkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBjb250cm9sIHNvY2tldCBpcyB1c2luZyBUTFMuIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IGEgc2Vzc2lvblxuICAgICAqIGhhcyBhbHJlYWR5IGJlZW4gbmVnb3RpYXRlZC5cbiAgICAgKi9cbiAgICBnZXQgaGFzVExTKCkge1xuICAgICAgICByZXR1cm4gXCJlbmNyeXB0ZWRcIiBpbiB0aGlzLl9zb2NrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgcmVmZXJlbmNlIHRvIGN1cnJlbnQgdGFzayBhbmQgaGFuZGxlci4gVGhpcyB3b24ndCByZXNvbHZlIG9yIHJlamVjdCB0aGUgdGFzay5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgX3N0b3BUcmFja2luZ1Rhc2soKSB7XG4gICAgICAgIC8vIERpc2FibGUgdGltZW91dCBvbiBjb250cm9sIHNvY2tldCBpZiB0aGVyZSBpcyBubyB0YXNrIGFjdGl2ZS5cbiAgICAgICAgdGhpcy5zb2NrZXQuc2V0VGltZW91dCgwKTtcbiAgICAgICAgdGhpcy5fdGFzayA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlIGluY29taW5nIGRhdGEgb24gdGhlIGNvbnRyb2wgc29ja2V0LiBUaGUgY2h1bmsgaXMgZ29pbmcgdG8gYmUgb2YgdHlwZSBgc3RyaW5nYFxuICAgICAqIGJlY2F1c2Ugd2UgbGV0IGBzb2NrZXRgIGhhbmRsZSBlbmNvZGluZyB3aXRoIGBzZXRFbmNvZGluZ2AuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIF9vbkNvbnRyb2xTb2NrZXREYXRhKGNodW5rKSB7XG4gICAgICAgIHRoaXMubG9nKGA8ICR7Y2h1bmt9YCk7XG4gICAgICAgIC8vIFRoaXMgY2h1bmsgbWlnaHQgY29tcGxldGUgYW4gZWFybGllciBwYXJ0aWFsIHJlc3BvbnNlLlxuICAgICAgICBjb25zdCBjb21wbGV0ZVJlc3BvbnNlID0gdGhpcy5fcGFydGlhbFJlc3BvbnNlICsgY2h1bms7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9ICgwLCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xLnBhcnNlQ29udHJvbFJlc3BvbnNlKShjb21wbGV0ZVJlc3BvbnNlKTtcbiAgICAgICAgLy8gUmVtZW1iZXIgYW55IGluY29tcGxldGUgcmVtYWluZGVyLlxuICAgICAgICB0aGlzLl9wYXJ0aWFsUmVzcG9uc2UgPSBwYXJzZWQucmVzdDtcbiAgICAgICAgLy8gRWFjaCByZXNwb25zZSBncm91cCBpcyBwYXNzZWQgYWxvbmcgaW5kaXZpZHVhbGx5LlxuICAgICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgcGFyc2VkLm1lc3NhZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gcGFyc2VJbnQobWVzc2FnZS5zdWJzdHIoMCwgMyksIDEwKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geyBjb2RlLCBtZXNzYWdlIH07XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBjb2RlID49IDQwMCA/IG5ldyBGVFBFcnJvcihyZXNwb25zZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl9wYXNzVG9IYW5kbGVyKGVyciA/IGVyciA6IHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBjdXJyZW50IGhhbmRsZXIgYSByZXNwb25zZS4gVGhpcyBpcyB1c3VhbGx5IGEgY29udHJvbCBzb2NrZXQgcmVzcG9uc2VcbiAgICAgKiBvciBhIHNvY2tldCBldmVudCwgbGlrZSBhbiBlcnJvciBvciB0aW1lb3V0LlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBfcGFzc1RvSGFuZGxlcihyZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy5fdGFzaykge1xuICAgICAgICAgICAgdGhpcy5fdGFzay5yZXNwb25zZUhhbmRsZXIocmVzcG9uc2UsIHRoaXMuX3Rhc2sucmVzb2x2ZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVycm9ycyBvdGhlciB0aGFuIEZUUEVycm9yIGFsd2F5cyBjbG9zZSB0aGUgY2xpZW50LiBJZiB0aGVyZSBpc24ndCBhbiBhY3RpdmUgdGFzayB0byBoYW5kbGUgdGhlIGVycm9yLFxuICAgICAgICAvLyB0aGUgbmV4dCBvbmUgc3VibWl0dGVkIHdpbGwgcmVjZWl2ZSBpdCB1c2luZyBgX2Nsb3NpbmdFcnJvcmAuXG4gICAgICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIGVkZ2UtY2FzZTogSWYgdGhlcmUgaXMgYW4gRlRQRXJyb3Igd2hpbGUgbm8gdGFzayBpcyBhY3RpdmUsIHRoZSBlcnJvciB3aWxsIGJlIGRyb3BwZWQuXG4gICAgICAgIC8vIEJ1dCB0aGF0IG1lYW5zIHRoYXQgdGhlIHVzZXIgc2VudCBhbiBGVFAgY29tbWFuZCB3aXRoIG5vIGludGVudGlvbiBvZiBoYW5kbGluZyB0aGUgcmVzdWx0LiBTbyB3aHkgc2hvdWxkIHRoZVxuICAgICAgICAvLyBlcnJvciBiZSBoYW5kbGVkPyBNYXliZSBsb2cgaXQgYXQgbGVhc3Q/IERlYnVnIGxvZ2dpbmcgd2lsbCBhbHJlYWR5IGRvIHRoYXQgYW5kIHRoZSBjbGllbnQgc3RheXMgdXNlYWJsZSBhZnRlclxuICAgICAgICAvLyBGVFBFcnJvci4gU28gbWF5YmUgbm8gbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLlxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXR1cCBhbGwgZXJyb3IgaGFuZGxlcnMgZm9yIGEgc29ja2V0LlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBfc2V0dXBEZWZhdWx0RXJyb3JIYW5kbGVycyhzb2NrZXQsIGlkZW50aWZpZXIpIHtcbiAgICAgICAgc29ja2V0Lm9uY2UoXCJlcnJvclwiLCBlcnJvciA9PiB7XG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlICs9IGAgKCR7aWRlbnRpZmllcn0pYDtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgc29ja2V0Lm9uY2UoXCJjbG9zZVwiLCBoYWRFcnJvciA9PiB7XG4gICAgICAgICAgICBpZiAoaGFkRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKG5ldyBFcnJvcihgU29ja2V0IGNsb3NlZCBkdWUgdG8gdHJhbnNtaXNzaW9uIGVycm9yICgke2lkZW50aWZpZXJ9KWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNvY2tldC5vbmNlKFwidGltZW91dFwiLCAoKSA9PiB7XG4gICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihuZXcgRXJyb3IoYFRpbWVvdXQgKCR7aWRlbnRpZmllcn0pYCkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIGNvbnRyb2wgc29ja2V0LiBTZW5kcyBRVUlULCB0aGVuIEZJTiwgYW5kIGlnbm9yZXMgYW55IHJlc3BvbnNlIG9yIGVycm9yLlxuICAgICAqL1xuICAgIF9jbG9zZUNvbnRyb2xTb2NrZXQoKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZVNvY2tldExpc3RlbmVycyh0aGlzLl9zb2NrZXQpO1xuICAgICAgICB0aGlzLl9zb2NrZXQub24oXCJlcnJvclwiLCBkb05vdGhpbmcpO1xuICAgICAgICB0aGlzLnNlbmQoXCJRVUlUXCIpO1xuICAgICAgICB0aGlzLl9jbG9zZVNvY2tldCh0aGlzLl9zb2NrZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZSBhIHNvY2tldCwgaWdub3JlcyBhbnkgZXJyb3IuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIF9jbG9zZVNvY2tldChzb2NrZXQpIHtcbiAgICAgICAgaWYgKHNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlU29ja2V0TGlzdGVuZXJzKHNvY2tldCk7XG4gICAgICAgICAgICBzb2NrZXQub24oXCJlcnJvclwiLCBkb05vdGhpbmcpO1xuICAgICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIGRlZmF1bHQgbGlzdGVuZXJzIGZvciBzb2NrZXQuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIF9yZW1vdmVTb2NrZXRMaXN0ZW5lcnMoc29ja2V0KSB7XG4gICAgICAgIHNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgLy8gQmVmb3JlIE5vZGUuanMgMTAuMy4wLCB1c2luZyBgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycygpYCB3aXRob3V0IGFueSBuYW1lIGRpZCBub3Qgd29yazogaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8yMDkyMy5cbiAgICAgICAgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycyhcInRpbWVvdXRcIik7XG4gICAgICAgIHNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJkYXRhXCIpO1xuICAgICAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKFwiZW5kXCIpO1xuICAgICAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKFwiZXJyb3JcIik7XG4gICAgICAgIHNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJjbG9zZVwiKTtcbiAgICAgICAgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycyhcImNvbm5lY3RcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb3ZpZGUgYSBuZXcgc29ja2V0IGluc3RhbmNlLlxuICAgICAqXG4gICAgICogSW50ZXJuYWwgdXNlIG9ubHksIHJlcGxhY2VkIGZvciB1bml0IHRlc3RzLlxuICAgICAqL1xuICAgIF9uZXdTb2NrZXQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgbmV0XzEuU29ja2V0KCk7XG4gICAgfVxufVxuZXhwb3J0cy5GVFBDb250ZXh0ID0gRlRQQ29udGV4dDtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Qcm9ncmVzc1RyYWNrZXIgPSB2b2lkIDA7XG4vKipcbiAqIFRyYWNrcyBwcm9ncmVzcyBvZiBvbmUgc29ja2V0IGRhdGEgdHJhbnNmZXIgYXQgYSB0aW1lLlxuICovXG5jbGFzcyBQcm9ncmVzc1RyYWNrZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJ5dGVzT3ZlcmFsbCA9IDA7XG4gICAgICAgIHRoaXMuaW50ZXJ2YWxNcyA9IDUwMDtcbiAgICAgICAgdGhpcy5vblN0b3AgPSBub29wO1xuICAgICAgICB0aGlzLm9uSGFuZGxlID0gbm9vcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBuZXcgaGFuZGxlciBmb3IgcHJvZ3Jlc3MgaW5mby4gVXNlIGB1bmRlZmluZWRgIHRvIGRpc2FibGUgcmVwb3J0aW5nLlxuICAgICAqL1xuICAgIHJlcG9ydFRvKG9uSGFuZGxlID0gbm9vcCkge1xuICAgICAgICB0aGlzLm9uSGFuZGxlID0gb25IYW5kbGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0IHRyYWNraW5nIHRyYW5zZmVyIHByb2dyZXNzIG9mIGEgc29ja2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvY2tldCAgVGhlIHNvY2tldCB0byBvYnNlcnZlLlxuICAgICAqIEBwYXJhbSBuYW1lICBBIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvZ3Jlc3MgdHJhY2tpbmcsIGUuZy4gYSBmaWxlbmFtZS5cbiAgICAgKiBAcGFyYW0gdHlwZSAgVGhlIHR5cGUgb2YgdGhlIHRyYW5zZmVyLCB0eXBpY2FsbHkgXCJ1cGxvYWRcIiBvciBcImRvd25sb2FkXCIuXG4gICAgICovXG4gICAgc3RhcnQoc29ja2V0LCBuYW1lLCB0eXBlKSB7XG4gICAgICAgIGxldCBsYXN0Qnl0ZXMgPSAwO1xuICAgICAgICB0aGlzLm9uU3RvcCA9IHBvbGwodGhpcy5pbnRlcnZhbE1zLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBieXRlcyA9IHNvY2tldC5ieXRlc1JlYWQgKyBzb2NrZXQuYnl0ZXNXcml0dGVuO1xuICAgICAgICAgICAgdGhpcy5ieXRlc092ZXJhbGwgKz0gYnl0ZXMgLSBsYXN0Qnl0ZXM7XG4gICAgICAgICAgICBsYXN0Qnl0ZXMgPSBieXRlcztcbiAgICAgICAgICAgIHRoaXMub25IYW5kbGUoe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBieXRlcyxcbiAgICAgICAgICAgICAgICBieXRlc092ZXJhbGw6IHRoaXMuYnl0ZXNPdmVyYWxsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3AgdHJhY2tpbmcgdHJhbnNmZXIgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgc3RvcCgpIHtcbiAgICAgICAgdGhpcy5vblN0b3AoZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBwcm9ncmVzcyBoYW5kbGVyIG9uZSBtb3JlIHRpbWUsIHRoZW4gc3RvcCB0cmFja2luZy5cbiAgICAgKi9cbiAgICB1cGRhdGVBbmRTdG9wKCkge1xuICAgICAgICB0aGlzLm9uU3RvcCh0cnVlKTtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHJhY2tlciA9IFByb2dyZXNzVHJhY2tlcjtcbi8qKlxuICogU3RhcnRzIGNhbGxpbmcgYSBjYWxsYmFjayBmdW5jdGlvbiBhdCBhIHJlZ3VsYXIgaW50ZXJ2YWwuIFRoZSBmaXJzdCBjYWxsIHdpbGwgZ28gb3V0XG4gKiBpbW1lZGlhdGVseS4gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBmdW5jdGlvbiB0byBzdG9wIHRoZSBwb2xsaW5nLlxuICovXG5mdW5jdGlvbiBwb2xsKGludGVydmFsTXMsIHVwZGF0ZUZ1bmMpIHtcbiAgICBjb25zdCBpZCA9IHNldEludGVydmFsKHVwZGF0ZUZ1bmMsIGludGVydmFsTXMpO1xuICAgIGNvbnN0IHN0b3BGdW5jID0gKHN0b3BXaXRoVXBkYXRlKSA9PiB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaWQpO1xuICAgICAgICBpZiAoc3RvcFdpdGhVcGRhdGUpIHtcbiAgICAgICAgICAgIHVwZGF0ZUZ1bmMoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50IHJlcGVhdGVkIGNhbGxzIHRvIHN0b3AgY2FsbGluZyBoYW5kbGVyLlxuICAgICAgICB1cGRhdGVGdW5jID0gbm9vcDtcbiAgICB9O1xuICAgIHVwZGF0ZUZ1bmMoKTtcbiAgICByZXR1cm4gc3RvcEZ1bmM7XG59XG5mdW5jdGlvbiBub29wKCkgeyB9XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TdHJpbmdXcml0ZXIgPSB2b2lkIDA7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jbGFzcyBTdHJpbmdXcml0ZXIgZXh0ZW5kcyBzdHJlYW1fMS5Xcml0YWJsZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuYnVmID0gQnVmZmVyLmFsbG9jKDApO1xuICAgIH1cbiAgICBfd3JpdGUoY2h1bmssIF8sIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5idWYgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmJ1ZiwgY2h1bmtdKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKFwiU3RyaW5nV3JpdGVyIGV4cGVjdHMgY2h1bmtzIG9mIHR5cGUgJ0J1ZmZlcicuXCIpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRUZXh0KGVuY29kaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1Zi50b1N0cmluZyhlbmNvZGluZyk7XG4gICAgfVxufVxuZXhwb3J0cy5TdHJpbmdXcml0ZXIgPSBTdHJpbmdXcml0ZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5lbnRlclBhc3NpdmVNb2RlSVB2NiA9IGV4cG9ydHMuZW50ZXJQYXNzaXZlTW9kZUlQdjQgPSB2b2lkIDA7XG4vKipcbiAqIFB1YmxpYyBBUElcbiAqL1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0NsaWVudFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRnRwQ29udGV4dFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRmlsZUluZm9cIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3BhcnNlTGlzdFwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vU3RyaW5nRW5jb2RpbmdcIiksIGV4cG9ydHMpO1xudmFyIHRyYW5zZmVyXzEgPSByZXF1aXJlKFwiLi90cmFuc2ZlclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImVudGVyUGFzc2l2ZU1vZGVJUHY0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cmFuc2Zlcl8xLmVudGVyUGFzc2l2ZU1vZGVJUHY0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZW50ZXJQYXNzaXZlTW9kZUlQdjZcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRyYW5zZmVyXzEuZW50ZXJQYXNzaXZlTW9kZUlQdjY7IH0gfSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXBJc1ByaXZhdGVWNEFkZHJlc3MgPSBleHBvcnRzLnVwZ3JhZGVTb2NrZXQgPSBleHBvcnRzLmRlc2NyaWJlQWRkcmVzcyA9IGV4cG9ydHMuZGVzY3JpYmVUTFMgPSB2b2lkIDA7XG5jb25zdCB0bHNfMSA9IHJlcXVpcmUoXCJ0bHNcIik7XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZW5jcnlwdGlvbiBvbiBhIGdpdmVuIHNvY2tldCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gZGVzY3JpYmVUTFMoc29ja2V0KSB7XG4gICAgaWYgKHNvY2tldCBpbnN0YW5jZW9mIHRsc18xLlRMU1NvY2tldCkge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNvY2tldC5nZXRQcm90b2NvbCgpO1xuICAgICAgICByZXR1cm4gcHJvdG9jb2wgPyBwcm90b2NvbCA6IFwiU2VydmVyIHNvY2tldCBvciBkaXNjb25uZWN0ZWQgY2xpZW50IHNvY2tldFwiO1xuICAgIH1cbiAgICByZXR1cm4gXCJObyBlbmNyeXB0aW9uXCI7XG59XG5leHBvcnRzLmRlc2NyaWJlVExTID0gZGVzY3JpYmVUTFM7XG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcmVtb3RlIGFkZHJlc3Mgb2YgYSBzb2NrZXQuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQWRkcmVzcyhzb2NrZXQpIHtcbiAgICBpZiAoc29ja2V0LnJlbW90ZUZhbWlseSA9PT0gXCJJUHY2XCIpIHtcbiAgICAgICAgcmV0dXJuIGBbJHtzb2NrZXQucmVtb3RlQWRkcmVzc31dOiR7c29ja2V0LnJlbW90ZVBvcnR9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3NvY2tldC5yZW1vdGVBZGRyZXNzfToke3NvY2tldC5yZW1vdGVQb3J0fWA7XG59XG5leHBvcnRzLmRlc2NyaWJlQWRkcmVzcyA9IGRlc2NyaWJlQWRkcmVzcztcbi8qKlxuICogVXBncmFkZSBhIHNvY2tldCBjb25uZWN0aW9uIHdpdGggVExTLlxuICovXG5mdW5jdGlvbiB1cGdyYWRlU29ja2V0KHNvY2tldCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHRsc09wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICBzb2NrZXRcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHRsc1NvY2tldCA9ICgwLCB0bHNfMS5jb25uZWN0KSh0bHNPcHRpb25zLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RDZXJ0aWZpY2F0ZSA9IHRsc09wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkICE9PSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChleHBlY3RDZXJ0aWZpY2F0ZSAmJiAhdGxzU29ja2V0LmF1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgICAgICByZWplY3QodGxzU29ja2V0LmF1dGhvcml6YXRpb25FcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZXJyb3IgbGlzdGVuZXIgYWRkZWQgYmVsb3cuXG4gICAgICAgICAgICAgICAgdGxzU29ja2V0LnJlbW92ZUFsbExpc3RlbmVycyhcImVycm9yXCIpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGxzU29ja2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkub25jZShcImVycm9yXCIsIGVycm9yID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy51cGdyYWRlU29ja2V0ID0gdXBncmFkZVNvY2tldDtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFuIElQIGlzIGEgcHJpdmF0ZSBhZGRyZXNzIGFjY29yZGluZyB0byBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTkxOCNzZWN0aW9uLTMuXG4gKiBUaGlzIHdpbGwgaGFuZGxlIElQdjQtbWFwcGVkIElQdjYgYWRkcmVzc2VzIGNvcnJlY3RseSBidXQgcmV0dXJuIGZhbHNlIGZvciBhbGwgb3RoZXIgSVB2NiBhZGRyZXNzZXMuXG4gKlxuICogQHBhcmFtIGlwICBUaGUgSVAgYXMgYSBzdHJpbmcsIGUuZy4gXCIxOTIuMTY4LjAuMVwiXG4gKi9cbmZ1bmN0aW9uIGlwSXNQcml2YXRlVjRBZGRyZXNzKGlwID0gXCJcIikge1xuICAgIC8vIEhhbmRsZSBJUHY0LW1hcHBlZCBJUHY2IGFkZHJlc3NlcyBsaWtlIDo6ZmZmZjoxOTIuMTY4LjAuMVxuICAgIGlmIChpcC5zdGFydHNXaXRoKFwiOjpmZmZmOlwiKSkge1xuICAgICAgICBpcCA9IGlwLnN1YnN0cig3KTsgLy8gU3RyaXAgOjpmZmZmOiBwcmVmaXhcbiAgICB9XG4gICAgY29uc3Qgb2N0ZXRzID0gaXAuc3BsaXQoXCIuXCIpLm1hcChvID0+IHBhcnNlSW50KG8sIDEwKSk7XG4gICAgcmV0dXJuIG9jdGV0c1swXSA9PT0gMTAgLy8gMTAuMC4wLjAgLSAxMC4yNTUuMjU1LjI1NVxuICAgICAgICB8fCAob2N0ZXRzWzBdID09PSAxNzIgJiYgb2N0ZXRzWzFdID49IDE2ICYmIG9jdGV0c1sxXSA8PSAzMSkgLy8gMTcyLjE2LjAuMCAtIDE3Mi4zMS4yNTUuMjU1XG4gICAgICAgIHx8IChvY3RldHNbMF0gPT09IDE5MiAmJiBvY3RldHNbMV0gPT09IDE2OCkgLy8gMTkyLjE2OC4wLjAgLSAxOTIuMTY4LjI1NS4yNTVcbiAgICAgICAgfHwgaXAgPT09IFwiMTI3LjAuMC4xXCI7XG59XG5leHBvcnRzLmlwSXNQcml2YXRlVjRBZGRyZXNzID0gaXBJc1ByaXZhdGVWNEFkZHJlc3M7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucG9zaXRpdmVJbnRlcm1lZGlhdGUgPSBleHBvcnRzLnBvc2l0aXZlQ29tcGxldGlvbiA9IGV4cG9ydHMuaXNNdWx0aWxpbmUgPSBleHBvcnRzLmlzU2luZ2xlTGluZSA9IGV4cG9ydHMucGFyc2VDb250cm9sUmVzcG9uc2UgPSB2b2lkIDA7XG5jb25zdCBMRiA9IFwiXFxuXCI7XG4vKipcbiAqIFBhcnNlIGFuIEZUUCBjb250cm9sIHJlc3BvbnNlIGFzIGEgY29sbGVjdGlvbiBvZiBtZXNzYWdlcy4gQSBtZXNzYWdlIGlzIGEgY29tcGxldGVcbiAqIHNpbmdsZS0gb3IgbXVsdGlsaW5lIHJlc3BvbnNlLiBBIHJlc3BvbnNlIGNhbiBhbHNvIGNvbnRhaW4gbXVsdGlwbGUgbXVsdGlsaW5lIHJlc3BvbnNlc1xuICogdGhhdCB3aWxsIGVhY2ggYmUgcmVwcmVzZW50ZWQgYnkgYSBtZXNzYWdlLiBBIHJlc3BvbnNlIGNhbiBhbHNvIGJlIGluY29tcGxldGVcbiAqIGFuZCBiZSBjb21wbGV0ZWQgb24gdGhlIG5leHQgaW5jb21pbmcgZGF0YSBjaHVuayBmb3Igd2hpY2ggY2FzZSB0aGlzIGZ1bmN0aW9uIGFsc29cbiAqIGRlc2NyaWJlcyBhIGByZXN0YC4gVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbGwgQ1JMRiB0byBMRi5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb250cm9sUmVzcG9uc2UodGV4dCkge1xuICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgvXFxyP1xcbi8pLmZpbHRlcihpc05vdEJsYW5rKTtcbiAgICBjb25zdCBtZXNzYWdlcyA9IFtdO1xuICAgIGxldCBzdGFydEF0ID0gMDtcbiAgICBsZXQgdG9rZW5SZWdleDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgLy8gTm8gZ3JvdXAgaGFzIGJlZW4gb3BlbmVkLlxuICAgICAgICBpZiAoIXRva2VuUmVnZXgpIHtcbiAgICAgICAgICAgIGlmIChpc011bHRpbGluZShsaW5lKSkge1xuICAgICAgICAgICAgICAgIC8vIE9wZW4gYSBncm91cCBieSBzZXR0aW5nIGFuIGV4cGVjdGVkIHRva2VuLlxuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gbGluZS5zdWJzdHIoMCwgMyk7XG4gICAgICAgICAgICAgICAgdG9rZW5SZWdleCA9IG5ldyBSZWdFeHAoYF4ke3Rva2VufSg/OiR8IClgKTtcbiAgICAgICAgICAgICAgICBzdGFydEF0ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzU2luZ2xlTGluZShsaW5lKSkge1xuICAgICAgICAgICAgICAgIC8vIFNpbmdsZSBsaW5lcyBjYW4gYmUgZ3JvdXBlZCBpbW1lZGlhdGVseS5cbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEdyb3VwIGhhcyBiZWVuIG9wZW5lZCwgZXhwZWN0IGNsb3NpbmcgdG9rZW4uXG4gICAgICAgIGVsc2UgaWYgKHRva2VuUmVnZXgudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgdG9rZW5SZWdleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2gobGluZXMuc2xpY2Uoc3RhcnRBdCwgaSArIDEpLmpvaW4oTEYpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUaGUgbGFzdCBncm91cCBtaWdodCBub3QgaGF2ZSBiZWVuIGNsb3NlZCwgcmVwb3J0IGl0IGFzIGEgcmVzdC5cbiAgICBjb25zdCByZXN0ID0gdG9rZW5SZWdleCA/IGxpbmVzLnNsaWNlKHN0YXJ0QXQpLmpvaW4oTEYpICsgTEYgOiBcIlwiO1xuICAgIHJldHVybiB7IG1lc3NhZ2VzLCByZXN0IH07XG59XG5leHBvcnRzLnBhcnNlQ29udHJvbFJlc3BvbnNlID0gcGFyc2VDb250cm9sUmVzcG9uc2U7XG5mdW5jdGlvbiBpc1NpbmdsZUxpbmUobGluZSkge1xuICAgIHJldHVybiAvXlxcZFxcZFxcZCg/OiR8ICkvLnRlc3QobGluZSk7XG59XG5leHBvcnRzLmlzU2luZ2xlTGluZSA9IGlzU2luZ2xlTGluZTtcbmZ1bmN0aW9uIGlzTXVsdGlsaW5lKGxpbmUpIHtcbiAgICByZXR1cm4gL15cXGRcXGRcXGQtLy50ZXN0KGxpbmUpO1xufVxuZXhwb3J0cy5pc011bHRpbGluZSA9IGlzTXVsdGlsaW5lO1xuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiBhbiBGVFAgcmV0dXJuIGNvZGUgZGVzY3JpYmVzIGEgcG9zaXRpdmUgY29tcGxldGlvbi5cbiAqL1xuZnVuY3Rpb24gcG9zaXRpdmVDb21wbGV0aW9uKGNvZGUpIHtcbiAgICByZXR1cm4gY29kZSA+PSAyMDAgJiYgY29kZSA8IDMwMDtcbn1cbmV4cG9ydHMucG9zaXRpdmVDb21wbGV0aW9uID0gcG9zaXRpdmVDb21wbGV0aW9uO1xuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiBhbiBGVFAgcmV0dXJuIGNvZGUgZGVzY3JpYmVzIGEgcG9zaXRpdmUgaW50ZXJtZWRpYXRlIHJlc3BvbnNlLlxuICovXG5mdW5jdGlvbiBwb3NpdGl2ZUludGVybWVkaWF0ZShjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPj0gMzAwICYmIGNvZGUgPCA0MDA7XG59XG5leHBvcnRzLnBvc2l0aXZlSW50ZXJtZWRpYXRlID0gcG9zaXRpdmVJbnRlcm1lZGlhdGU7XG5mdW5jdGlvbiBpc05vdEJsYW5rKHN0cikge1xuICAgIHJldHVybiBzdHIudHJpbSgpICE9PSBcIlwiO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGFyc2VMaXN0ID0gdm9pZCAwO1xuY29uc3QgZG9zUGFyc2VyID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3BhcnNlTGlzdERPU1wiKSk7XG5jb25zdCB1bml4UGFyc2VyID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3BhcnNlTGlzdFVuaXhcIikpO1xuY29uc3QgbWxzZFBhcnNlciA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wYXJzZUxpc3RNTFNEXCIpKTtcbi8qKlxuICogQXZhaWxhYmxlIGRpcmVjdG9yeSBsaXN0aW5nIHBhcnNlcnMuIFRoZXNlIGFyZSBjYW5kaWRhdGVzIHRoYXQgd2lsbCBiZSB0ZXN0ZWRcbiAqIGluIHRoZSBvcmRlciBwcmVzZW50ZWQuIFRoZSBmaXJzdCBjYW5kaWRhdGUgd2lsbCBiZSB1c2VkIHRvIHBhcnNlIHRoZSB3aG9sZSBsaXN0LlxuICovXG5jb25zdCBhdmFpbGFibGVQYXJzZXJzID0gW1xuICAgIGRvc1BhcnNlcixcbiAgICB1bml4UGFyc2VyLFxuICAgIG1sc2RQYXJzZXIgLy8gS2VlcCBNTFNEIGxhc3QsIG1heSBhY2NlcHQgZmlsZW5hbWUgb25seVxuXTtcbmZ1bmN0aW9uIGZpcnN0Q29tcGF0aWJsZVBhcnNlcihsaW5lLCBwYXJzZXJzKSB7XG4gICAgcmV0dXJuIHBhcnNlcnMuZmluZChwYXJzZXIgPT4gcGFyc2VyLnRlc3RMaW5lKGxpbmUpID09PSB0cnVlKTtcbn1cbmZ1bmN0aW9uIGlzTm90Qmxhbmsoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci50cmltKCkgIT09IFwiXCI7XG59XG5mdW5jdGlvbiBpc05vdE1ldGEoc3RyKSB7XG4gICAgcmV0dXJuICFzdHIuc3RhcnRzV2l0aChcInRvdGFsXCIpO1xufVxuY29uc3QgUkVHRVhfTkVXTElORSA9IC9cXHI/XFxuLztcbi8qKlxuICogUGFyc2UgcmF3IGRpcmVjdG9yeSBsaXN0aW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZUxpc3QocmF3TGlzdCkge1xuICAgIGNvbnN0IGxpbmVzID0gcmF3TGlzdFxuICAgICAgICAuc3BsaXQoUkVHRVhfTkVXTElORSlcbiAgICAgICAgLmZpbHRlcihpc05vdEJsYW5rKVxuICAgICAgICAuZmlsdGVyKGlzTm90TWV0YSk7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHRlc3RMaW5lID0gbGluZXNbbGluZXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgcGFyc2VyID0gZmlyc3RDb21wYXRpYmxlUGFyc2VyKHRlc3RMaW5lLCBhdmFpbGFibGVQYXJzZXJzKTtcbiAgICBpZiAoIXBhcnNlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGxpYnJhcnkgb25seSBzdXBwb3J0cyBNTFNELCBVbml4LSBvciBET1Mtc3R5bGUgZGlyZWN0b3J5IGxpc3RpbmcuIFlvdXIgRlRQIHNlcnZlciBzZWVtcyB0byBiZSB1c2luZyBhbm90aGVyIGZvcm1hdC4gWW91IGNhbiBzZWUgdGhlIHRyYW5zbWl0dGVkIGxpc3Rpbmcgd2hlbiBzZXR0aW5nIGBjbGllbnQuZnRwLnZlcmJvc2UgPSB0cnVlYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgYSBjdXN0b20gcGFyc2VyIHRvIGBjbGllbnQucGFyc2VMaXN0YCwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLlwiKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZXMgPSBsaW5lc1xuICAgICAgICAubWFwKHBhcnNlci5wYXJzZUxpbmUpXG4gICAgICAgIC5maWx0ZXIoKGluZm8pID0+IGluZm8gIT09IHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIHBhcnNlci50cmFuc2Zvcm1MaXN0KGZpbGVzKTtcbn1cbmV4cG9ydHMucGFyc2VMaXN0ID0gcGFyc2VMaXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnRyYW5zZm9ybUxpc3QgPSBleHBvcnRzLnBhcnNlTGluZSA9IGV4cG9ydHMudGVzdExpbmUgPSB2b2lkIDA7XG5jb25zdCBGaWxlSW5mb18xID0gcmVxdWlyZShcIi4vRmlsZUluZm9cIik7XG4vKipcbiAqIFRoaXMgcGFyc2VyIGlzIGJhc2VkIG9uIHRoZSBGVFAgY2xpZW50IGxpYnJhcnkgc291cmNlIGNvZGUgaW4gQXBhY2hlIENvbW1vbnMgTmV0IHByb3ZpZGVkXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlLiBJdCBoYXMgYmVlbiBzaW1wbGlmaWVkIGFuZCByZXdyaXR0ZW4gdG8gYmV0dGVyIGZpdCB0aGUgSmF2YXNjcmlwdCBsYW5ndWFnZS5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvbW1vbnMtbmV0L2Jsb2IvbWFzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL25ldC9mdHAvcGFyc2VyL05URlRQRW50cnlQYXJzZXIuamF2YVxuICovXG5jb25zdCBSRV9MSU5FID0gbmV3IFJlZ0V4cChcIihcXFxcUyspXFxcXHMrKFxcXFxTKylcXFxccytcIiAvLyBNTS1kZC15eSB3aGl0ZXNwYWNlIGhoOm1tYXxrazptbSBzd2FsbG93IHRyYWlsaW5nIHNwYWNlc1xuICAgICsgXCIoPzooPERJUj4pfChbMC05XSspKVxcXFxzK1wiIC8vIDxESVI+IG9yIGRkZGRkIHN3YWxsb3cgdHJhaWxpbmcgc3BhY2VzXG4gICAgKyBcIihcXFxcUy4qKVwiIC8vIEZpcnN0IG5vbi1zcGFjZSBmb2xsb3dlZCBieSByZXN0IG9mIGxpbmUgKG5hbWUpXG4pO1xuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBnaXZlbiBsaW5lIG1pZ2h0IGJlIGEgRE9TLXN0eWxlIGxpc3RpbmcuXG4gKlxuICogLSBFeGFtcGxlOiBgMTItMDUtOTYgIDA1OjAzUE0gICAgICAgPERJUj4gICAgICAgICAgbXlEaXJgXG4gKi9cbmZ1bmN0aW9uIHRlc3RMaW5lKGxpbmUpIHtcbiAgICByZXR1cm4gL15cXGR7Mn0vLnRlc3QobGluZSkgJiYgUkVfTElORS50ZXN0KGxpbmUpO1xufVxuZXhwb3J0cy50ZXN0TGluZSA9IHRlc3RMaW5lO1xuLyoqXG4gKiBQYXJzZSBhIHNpbmdsZSBsaW5lIG9mIGEgRE9TLXN0eWxlIGRpcmVjdG9yeSBsaXN0aW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZUxpbmUobGluZSkge1xuICAgIGNvbnN0IGdyb3VwcyA9IGxpbmUubWF0Y2goUkVfTElORSk7XG4gICAgaWYgKGdyb3VwcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gZ3JvdXBzWzVdO1xuICAgIGlmIChuYW1lID09PSBcIi5cIiB8fCBuYW1lID09PSBcIi4uXCIpIHsgLy8gSWdub3JlIHBhcmVudCBkaXJlY3RvcnkgbGlua3NcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlSW5mb18xLkZpbGVJbmZvKG5hbWUpO1xuICAgIGNvbnN0IGZpbGVUeXBlID0gZ3JvdXBzWzNdO1xuICAgIGlmIChmaWxlVHlwZSA9PT0gXCI8RElSPlwiKSB7XG4gICAgICAgIGZpbGUudHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuRGlyZWN0b3J5O1xuICAgICAgICBmaWxlLnNpemUgPSAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZmlsZS50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5GaWxlO1xuICAgICAgICBmaWxlLnNpemUgPSBwYXJzZUludChncm91cHNbNF0sIDEwKTtcbiAgICB9XG4gICAgZmlsZS5yYXdNb2RpZmllZEF0ID0gZ3JvdXBzWzFdICsgXCIgXCIgKyBncm91cHNbMl07XG4gICAgcmV0dXJuIGZpbGU7XG59XG5leHBvcnRzLnBhcnNlTGluZSA9IHBhcnNlTGluZTtcbmZ1bmN0aW9uIHRyYW5zZm9ybUxpc3QoZmlsZXMpIHtcbiAgICByZXR1cm4gZmlsZXM7XG59XG5leHBvcnRzLnRyYW5zZm9ybUxpc3QgPSB0cmFuc2Zvcm1MaXN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlTUxTeERhdGUgPSBleHBvcnRzLnRyYW5zZm9ybUxpc3QgPSBleHBvcnRzLnBhcnNlTGluZSA9IGV4cG9ydHMudGVzdExpbmUgPSB2b2lkIDA7XG5jb25zdCBGaWxlSW5mb18xID0gcmVxdWlyZShcIi4vRmlsZUluZm9cIik7XG5mdW5jdGlvbiBwYXJzZVNpemUodmFsdWUsIGluZm8pIHtcbiAgICBpbmZvLnNpemUgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xufVxuLyoqXG4gKiBQYXJzZXJzIGZvciBNTFNEIGZhY3RzLlxuICovXG5jb25zdCBmYWN0SGFuZGxlcnNCeU5hbWUgPSB7XG4gICAgXCJzaXplXCI6IHBhcnNlU2l6ZSwgLy8gRmlsZSBzaXplXG4gICAgXCJzaXpkXCI6IHBhcnNlU2l6ZSwgLy8gRGlyZWN0b3J5IHNpemVcbiAgICBcInVuaXF1ZVwiOiAodmFsdWUsIGluZm8pID0+IHtcbiAgICAgICAgaW5mby51bmlxdWVJRCA9IHZhbHVlO1xuICAgIH0sXG4gICAgXCJtb2RpZnlcIjogKHZhbHVlLCBpbmZvKSA9PiB7XG4gICAgICAgIGluZm8ubW9kaWZpZWRBdCA9IHBhcnNlTUxTeERhdGUodmFsdWUpO1xuICAgICAgICBpbmZvLnJhd01vZGlmaWVkQXQgPSBpbmZvLm1vZGlmaWVkQXQudG9JU09TdHJpbmcoKTtcbiAgICB9LFxuICAgIFwidHlwZVwiOiAodmFsdWUsIGluZm8pID0+IHtcbiAgICAgICAgLy8gVGhlcmUgc2VlbXMgdG8gYmUgY29uZnVzaW9uIG9uIGhvdyB0byBoYW5kbGUgc3ltYm9saWMgbGlua3MgZm9yIFVuaXguIFJGQyAzNjU5IGRvZXNuJ3QgZGVzY3JpYmVcbiAgICAgICAgLy8gdGhpcyBidXQgbWVudGlvbnMgc29tZSBleGFtcGxlcyB1c2luZyB0aGUgc3ludGF4IGB0eXBlPU9TLnVuaXg9c2xpbms6PHRhcmdldD5gLiBCdXQgYWNjb3JkaW5nIHRvXG4gICAgICAgIC8vIGFuIGVudHJ5IGluIHRoZSBFcnJhdGEgKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL2VycmF0YS9laWQxNTAwKSB0aGlzIHN5bnRheCBjYW4ndCBiZSB2YWxpZC5cbiAgICAgICAgLy8gSW5zdGVhZCBpdCBwcm9wb3NlcyB0byB1c2UgYHR5cGU9T1MudW5peD1zeW1saW5rYCBhbmQgdG8gdGhlbiBsaXN0IHRoZSBhY3R1YWwgdGFyZ2V0IG9mIHRoZVxuICAgICAgICAvLyBzeW1ib2xpYyBsaW5rIGFzIGFub3RoZXIgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSBsaXN0aW5nLiBUaGUgdW5pcXVlIGlkZW50aWZpZXJzIGNhbiB0aGVuIGJlIHVzZWRcbiAgICAgICAgLy8gdG8gZGVyaXZlIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gbGluayhzKSBhbmQgdGFyZ2V0LiBXZSdsbCBoYXZlIHRvIGhhbmRsZSBib3RoIGNhc2VzIGFzIHRoZXJlXG4gICAgICAgIC8vIGFyZSBkaWZmZXJpbmcgb3BpbmlvbnMgb24gaG93IHRvIGRlYWwgd2l0aCB0aGlzLiBIZXJlIGFyZSBzb21lIGxpbmtzIG9uIHRoaXMgdG9waWM6XG4gICAgICAgIC8vIC0gUHJvRlRQRCBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9mdHBkL3Byb2Z0cGQvYmxvYi81NmU2ZGZhNTk4Y2JkNGVmNWM2Y2JhNDM5YmNiY2Q1M2E2M2UzYjIxL21vZHVsZXMvbW9kX2ZhY3RzLmMjTDUzMVxuICAgICAgICAvLyAtIFByb0ZUUEQgYnVnOiBodHRwOi8vYnVncy5wcm9mdHBkLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzMxOFxuICAgICAgICAvLyAtIFByb0ZUUEQgc3RhdGVtZW50OiBodHRwOi8vd3d3LnByb2Z0cGQub3JnL2RvY3MvbW9kdWxlcy9tb2RfZmFjdHMuaHRtbFxuICAgICAgICAvLyDigJMgRmlsZVppbGxhIGJ1ZzogaHR0cHM6Ly90cmFjLmZpbGV6aWxsYS1wcm9qZWN0Lm9yZy90aWNrZXQvOTMxMFxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcIk9TLnVuaXg9c2xpbmtcIikpIHtcbiAgICAgICAgICAgIGluZm8udHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuU3ltYm9saWNMaW5rO1xuICAgICAgICAgICAgaW5mby5saW5rID0gdmFsdWUuc3Vic3RyKHZhbHVlLmluZGV4T2YoXCI6XCIpICsgMSk7XG4gICAgICAgICAgICByZXR1cm4gMSAvKiBGYWN0SGFuZGxlclJlc3VsdC5Db250aW51ZSAqLztcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgICAgICAgICAgIGluZm8udHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuRmlsZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkaXJcIjpcbiAgICAgICAgICAgICAgICBpbmZvLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLkRpcmVjdG9yeTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJPUy51bml4PXN5bWxpbmtcIjpcbiAgICAgICAgICAgICAgICBpbmZvLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLlN5bWJvbGljTGluaztcbiAgICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG9mIHRoZSBzeW1ib2xpYyBsaW5rIG1pZ2h0IGJlIGRlZmluZWQgaW4gYW5vdGhlciBsaW5lIGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZy5cbiAgICAgICAgICAgICAgICAvLyBXZSdsbCBoYW5kbGUgdGhpcyBpbiBgdHJhbnNmb3JtTGlzdCgpYCBiZWxvdy5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjZGlyXCI6IC8vIEN1cnJlbnQgZGlyZWN0b3J5IGJlaW5nIGxpc3RlZFxuICAgICAgICAgICAgY2FzZSBcInBkaXJcIjogLy8gUGFyZW50IGRpcmVjdG9yeVxuICAgICAgICAgICAgICAgIHJldHVybiAyIC8qIEZhY3RIYW5kbGVyUmVzdWx0Lklnbm9yZUZpbGUgKi87IC8vIERvbid0IGluY2x1ZGUgdGhlc2UgZW50cmllcyBpbiB0aGUgbGlzdGluZ1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpbmZvLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLlVua25vd247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDEgLyogRmFjdEhhbmRsZXJSZXN1bHQuQ29udGludWUgKi87XG4gICAgfSxcbiAgICBcInVuaXgubW9kZVwiOiAodmFsdWUsIGluZm8pID0+IHtcbiAgICAgICAgY29uc3QgZGlnaXRzID0gdmFsdWUuc3Vic3RyKC0zKTtcbiAgICAgICAgaW5mby5wZXJtaXNzaW9ucyA9IHtcbiAgICAgICAgICAgIHVzZXI6IHBhcnNlSW50KGRpZ2l0c1swXSwgMTApLFxuICAgICAgICAgICAgZ3JvdXA6IHBhcnNlSW50KGRpZ2l0c1sxXSwgMTApLFxuICAgICAgICAgICAgd29ybGQ6IHBhcnNlSW50KGRpZ2l0c1syXSwgMTApXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBcInVuaXgub3duZXJuYW1lXCI6ICh2YWx1ZSwgaW5mbykgPT4ge1xuICAgICAgICBpbmZvLnVzZXIgPSB2YWx1ZTtcbiAgICB9LFxuICAgIFwidW5peC5vd25lclwiOiAodmFsdWUsIGluZm8pID0+IHtcbiAgICAgICAgaWYgKGluZm8udXNlciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgaW5mby51c2VyID0gdmFsdWU7XG4gICAgfSxcbiAgICBnZXQgXCJ1bml4LnVpZFwiKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tcInVuaXgub3duZXJcIl07XG4gICAgfSxcbiAgICBcInVuaXguZ3JvdXBuYW1lXCI6ICh2YWx1ZSwgaW5mbykgPT4ge1xuICAgICAgICBpbmZvLmdyb3VwID0gdmFsdWU7XG4gICAgfSxcbiAgICBcInVuaXguZ3JvdXBcIjogKHZhbHVlLCBpbmZvKSA9PiB7XG4gICAgICAgIGlmIChpbmZvLmdyb3VwID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBpbmZvLmdyb3VwID0gdmFsdWU7XG4gICAgfSxcbiAgICBnZXQgXCJ1bml4LmdpZFwiKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tcInVuaXguZ3JvdXBcIl07XG4gICAgfVxuICAgIC8vIFJlZ2FyZGluZyB0aGUgZmFjdCBcInBlcm1cIjpcbiAgICAvLyBXZSBkb24ndCBoYW5kbGUgcGVybWlzc2lvbiBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gXCJwZXJtXCIgYmVjYXVzZSBpdHMgaW5mb3JtYXRpb24gaXMgY29uY2VwdHVhbGx5XG4gICAgLy8gZGlmZmVyZW50IGZyb20gd2hhdCB1c2VycyBvZiBGVFAgY2xpZW50cyB1c3VhbGx5IGFzc29jaWF0ZSB3aXRoIFwicGVybWlzc2lvbnNcIi4gVGhvc2UgdGhhdCBoYXZlXG4gICAgLy8gc29tZSBleHBlY3RhdGlvbnMgKGFuZCBwcm9iYWJseSB3YW50IHRvIGVkaXQgdGhlbSB3aXRoIGEgU0lURSBjb21tYW5kKSBvZnRlbiB1bmtub3dpbmdseSBleHBlY3RcbiAgICAvLyB0aGUgVW5peCBwZXJtaXNzaW9uIHN5c3RlbS4gVGhlIGluZm9ybWF0aW9uIHBhc3NlZCBieSBcInBlcm1cIiBkZXNjcmliZXMgd2hhdCBGVFAgY29tbWFuZHMgY2FuIGJlXG4gICAgLy8gZXhlY3V0ZWQgd2l0aCBhIGZpbGUvZGlyZWN0b3J5LiBCdXQgZXZlbiB0aGlzIGNhbiBiZSBlaXRoZXIgaW5jb21wbGV0ZSBvciBqdXN0IG1lYW50IGFzIGEgXCJndWlkZVwiXG4gICAgLy8gYXMgdGhlIHNwZWMgbWVudGlvbnMuIEZyb20gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM2NTkjc2VjdGlvbi03LjUuNTogXCJUaGUgcGVybWlzc2lvbnMgYXJlXG4gICAgLy8gZGVzY3JpYmVkIGhlcmUgYXMgdGhleSBhcHBseSB0byBGVFAgY29tbWFuZHMuIFRoZXkgbWF5IG5vdCBtYXAgZWFzaWx5IGludG8gcGFydGljdWxhciBwZXJtaXNzaW9uc1xuICAgIC8vIGF2YWlsYWJsZSBvbiB0aGUgc2VydmVyJ3Mgb3BlcmF0aW5nIHN5c3RlbS5cIiBUaGUgcGFyc2VyIGJ5IEFwYWNoZSBDb21tb25zIHRyaWVzIHRvIHRyYW5zbGF0ZSB0aGVzZVxuICAgIC8vIHRvIFVuaXggcGVybWlzc2lvbnMg4oCTIHRoaXMgaXMgbWlzbGVhZGluZyB1c2VycyBhbmQgbWlnaHQgbm90IGV2ZW4gYmUgY29ycmVjdC5cbn07XG4vKipcbiAqIFNwbGl0IGEgc3RyaW5nIG9uY2UgYXQgdGhlIGZpcnN0IHBvc2l0aW9uIG9mIGEgZGVsaW1pdGVyLiBGb3IgZXhhbXBsZVxuICogYHNwbGl0U3RyaW5nT25jZShcImEgYiBjIGRcIiwgXCIgXCIpYCByZXR1cm5zIGBbXCJhXCIsIFwiYiBjIGRcIl1gLlxuICovXG5mdW5jdGlvbiBzcGxpdFN0cmluZ09uY2Uoc3RyLCBkZWxpbWl0ZXIpIHtcbiAgICBjb25zdCBwb3MgPSBzdHIuaW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgIGNvbnN0IGEgPSBzdHIuc3Vic3RyKDAsIHBvcyk7XG4gICAgY29uc3QgYiA9IHN0ci5zdWJzdHIocG9zICsgZGVsaW1pdGVyLmxlbmd0aCk7XG4gICAgcmV0dXJuIFthLCBiXTtcbn1cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgZ2l2ZW4gbGluZSBtaWdodCBiZSBwYXJ0IG9mIGFuIE1MU0QgbGlzdGluZy5cbiAqXG4gKiAtIEV4YW1wbGUgMTogYHNpemU9MTUyMjc7dHlwZT1kaXI7cGVybT1lbDttb2RpZnk9MjAxOTA0MTkwNjU3MzA7IHRlc3Qgb25lYFxuICogLSBFeGFtcGxlIDI6IGAgZmlsZSBuYW1lYCAobGVhZGluZyBzcGFjZSlcbiAqL1xuZnVuY3Rpb24gdGVzdExpbmUobGluZSkge1xuICAgIHJldHVybiAvXlxcUys9XFxTKzsvLnRlc3QobGluZSkgfHwgbGluZS5zdGFydHNXaXRoKFwiIFwiKTtcbn1cbmV4cG9ydHMudGVzdExpbmUgPSB0ZXN0TGluZTtcbi8qKlxuICogUGFyc2Ugc2luZ2xlIGxpbmUgYXMgTUxTRCBsaXN0aW5nLCBzZWUgc3BlY2lmaWNhdGlvbiBhdCBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzY1OSNzZWN0aW9uLTcuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTGluZShsaW5lKSB7XG4gICAgY29uc3QgW3BhY2tlZEZhY3RzLCBuYW1lXSA9IHNwbGl0U3RyaW5nT25jZShsaW5lLCBcIiBcIik7XG4gICAgaWYgKG5hbWUgPT09IFwiXCIgfHwgbmFtZSA9PT0gXCIuXCIgfHwgbmFtZSA9PT0gXCIuLlwiKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGluZm8gPSBuZXcgRmlsZUluZm9fMS5GaWxlSW5mbyhuYW1lKTtcbiAgICBjb25zdCBmYWN0cyA9IHBhY2tlZEZhY3RzLnNwbGl0KFwiO1wiKTtcbiAgICBmb3IgKGNvbnN0IGZhY3Qgb2YgZmFjdHMpIHtcbiAgICAgICAgY29uc3QgW2ZhY3ROYW1lLCBmYWN0VmFsdWVdID0gc3BsaXRTdHJpbmdPbmNlKGZhY3QsIFwiPVwiKTtcbiAgICAgICAgaWYgKCFmYWN0VmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZhY3RIYW5kbGVyID0gZmFjdEhhbmRsZXJzQnlOYW1lW2ZhY3ROYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBpZiAoIWZhY3RIYW5kbGVyKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBmYWN0SGFuZGxlcihmYWN0VmFsdWUsIGluZm8pO1xuICAgICAgICBpZiAocmVzdWx0ID09PSAyIC8qIEZhY3RIYW5kbGVyUmVzdWx0Lklnbm9yZUZpbGUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG59XG5leHBvcnRzLnBhcnNlTGluZSA9IHBhcnNlTGluZTtcbmZ1bmN0aW9uIHRyYW5zZm9ybUxpc3QoZmlsZXMpIHtcbiAgICAvLyBDcmVhdGUgYSBtYXAgb2YgYWxsIGZpbGVzIHRoYXQgYXJlIG5vdCBzeW1ib2xpYyBsaW5rcyBieSB0aGVpciB1bmlxdWUgSURcbiAgICBjb25zdCBub25MaW5rc0J5SUQgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmICghZmlsZS5pc1N5bWJvbGljTGluayAmJiBmaWxlLnVuaXF1ZUlEICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5vbkxpbmtzQnlJRC5zZXQoZmlsZS51bmlxdWVJRCwgZmlsZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzb2x2ZWRGaWxlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAvLyBUcnkgdG8gYXNzb2NpYXRlIHVucmVzb2x2ZWQgc3ltYm9saWMgbGlua3Mgd2l0aCBhIHRhcmdldCBmaWxlL2RpcmVjdG9yeS5cbiAgICAgICAgaWYgKGZpbGUuaXNTeW1ib2xpY0xpbmsgJiYgZmlsZS51bmlxdWVJRCAhPT0gdW5kZWZpbmVkICYmIGZpbGUubGluayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBub25MaW5rc0J5SUQuZ2V0KGZpbGUudW5pcXVlSUQpO1xuICAgICAgICAgICAgaWYgKHRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZmlsZS5saW5rID0gdGFyZ2V0Lm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHRhcmdldCBvZiBhIHN5bWJvbGljIGxpbmsgaXMgbGlzdGVkIGFzIGFuIGVudHJ5IGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZyBidXQgbWlnaHRcbiAgICAgICAgLy8gaGF2ZSBhIHBhdGggcG9pbnRpbmcgb3V0c2lkZSBvZiB0aGlzIGRpcmVjdG9yeS4gSW4gdGhhdCBjYXNlIHdlIGRvbid0IHdhbnQgdGhpcyBlbnRyeVxuICAgICAgICAvLyB0byBiZSBwYXJ0IG9mIHRoZSBsaXN0aW5nLiBXZSBnZW5lcmFsbHkgZG9uJ3Qgd2FudCB0aGVzZSBraW5kIG9mIGVudHJpZXMgYXQgYWxsLlxuICAgICAgICBjb25zdCBpc1BhcnRPZkRpcmVjdG9yeSA9ICFmaWxlLm5hbWUuaW5jbHVkZXMoXCIvXCIpO1xuICAgICAgICBpZiAoaXNQYXJ0T2ZEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgIHJlc29sdmVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzb2x2ZWRGaWxlcztcbn1cbmV4cG9ydHMudHJhbnNmb3JtTGlzdCA9IHRyYW5zZm9ybUxpc3Q7XG4vKipcbiAqIFBhcnNlIGRhdGUgYXMgc3BlY2lmaWVkIGluIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNjU5I3NlY3Rpb24tMi4zLlxuICpcbiAqIE1lc3NhZ2UgY29udGFpbnMgcmVzcG9uc2UgY29kZSBhbmQgbW9kaWZpZWQgdGltZSBpbiB0aGUgZm9ybWF0OiBZWVlZTU1EREhITU1TU1suc3NzXVxuICogRm9yIGV4YW1wbGUgYDE5OTkxMDA1MjEzMTAyYCBvciBgMTk5ODA2MTUxMDAwNDUuMDE0YC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VNTFN4RGF0ZShmYWN0KSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKCtmYWN0LnNsaWNlKDAsIDQpLCAvLyBZZWFyXG4gICAgK2ZhY3Quc2xpY2UoNCwgNikgLSAxLCAvLyBNb250aFxuICAgICtmYWN0LnNsaWNlKDYsIDgpLCAvLyBEYXRlXG4gICAgK2ZhY3Quc2xpY2UoOCwgMTApLCAvLyBIb3Vyc1xuICAgICtmYWN0LnNsaWNlKDEwLCAxMiksIC8vIE1pbnV0ZXNcbiAgICArZmFjdC5zbGljZSgxMiwgMTQpLCAvLyBTZWNvbmRzXG4gICAgK2ZhY3Quc2xpY2UoMTUsIDE4KSAvLyBNaWxsaXNlY29uZHNcbiAgICApKTtcbn1cbmV4cG9ydHMucGFyc2VNTFN4RGF0ZSA9IHBhcnNlTUxTeERhdGU7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudHJhbnNmb3JtTGlzdCA9IGV4cG9ydHMucGFyc2VMaW5lID0gZXhwb3J0cy50ZXN0TGluZSA9IHZvaWQgMDtcbmNvbnN0IEZpbGVJbmZvXzEgPSByZXF1aXJlKFwiLi9GaWxlSW5mb1wiKTtcbmNvbnN0IEpBX01PTlRIID0gXCJcXHU2NzA4XCI7XG5jb25zdCBKQV9EQVkgPSBcIlxcdTY1ZTVcIjtcbmNvbnN0IEpBX1lFQVIgPSBcIlxcdTVlNzRcIjtcbi8qKlxuICogVGhpcyBwYXJzZXIgaXMgYmFzZWQgb24gdGhlIEZUUCBjbGllbnQgbGlicmFyeSBzb3VyY2UgY29kZSBpbiBBcGFjaGUgQ29tbW9ucyBOZXQgcHJvdmlkZWRcbiAqIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UuIEl0IGhhcyBiZWVuIHNpbXBsaWZpZWQgYW5kIHJld3JpdHRlbiB0byBiZXR0ZXIgZml0IHRoZSBKYXZhc2NyaXB0IGxhbmd1YWdlLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY29tbW9ucy1uZXQvYmxvYi9tYXN0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NvbW1vbnMvbmV0L2Z0cC9wYXJzZXIvVW5peEZUUEVudHJ5UGFyc2VyLmphdmFcbiAqXG4gKiBCZWxvdyBpcyB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZWQgYnkgdGhpcyBwYXJzZXIuXG4gKlxuICogUGVybWlzc2lvbnM6XG4gKiAgICByICAgdGhlIGZpbGUgaXMgcmVhZGFibGVcbiAqICAgIHcgICB0aGUgZmlsZSBpcyB3cml0YWJsZVxuICogICAgeCAgIHRoZSBmaWxlIGlzIGV4ZWN1dGFibGVcbiAqICAgIC0gICB0aGUgaW5kaWNhdGVkIHBlcm1pc3Npb24gaXMgbm90IGdyYW50ZWRcbiAqICAgIEwgICBtYW5kYXRvcnkgbG9ja2luZyBvY2N1cnMgZHVyaW5nIGFjY2VzcyAodGhlIHNldC1ncm91cC1JRCBiaXQgaXNcbiAqICAgICAgICBvbiBhbmQgdGhlIGdyb3VwIGV4ZWN1dGlvbiBiaXQgaXMgb2ZmKVxuICogICAgcyAgIHRoZSBzZXQtdXNlci1JRCBvciBzZXQtZ3JvdXAtSUQgYml0IGlzIG9uLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgICB1c2VyIG9yIGdyb3VwIGV4ZWN1dGlvbiBiaXQgaXMgYWxzbyBvblxuICogICAgUyAgIHVuZGVmaW5lZCBiaXQtc3RhdGUgKHRoZSBzZXQtdXNlci1JRCBiaXQgaXMgb24gYW5kIHRoZSB1c2VyXG4gKiAgICAgICAgZXhlY3V0aW9uIGJpdCBpcyBvZmYpXG4gKiAgICB0ICAgdGhlIDEwMDAgKG9jdGFsKSBiaXQsIG9yIHN0aWNreSBiaXQsIGlzIG9uIFtzZWUgY2htb2QoMSldLCBhbmRcbiAqICAgICAgICBleGVjdXRpb24gaXMgb25cbiAqICAgIFQgICB0aGUgMTAwMCBiaXQgaXMgdHVybmVkIG9uLCBhbmQgZXhlY3V0aW9uIGlzIG9mZiAodW5kZWZpbmVkIGJpdC1cbiAqICAgICAgICBzdGF0ZSlcbiAqICAgIGUgICB6L09TIGV4dGVybmFsIGxpbmsgYml0XG4gKiAgICBGaW5hbCBsZXR0ZXIgbWF5IGJlIGFwcGVuZGVkOlxuICogICAgKyAgIGZpbGUgaGFzIGV4dGVuZGVkIHNlY3VyaXR5IGF0dHJpYnV0ZXMgKGUuZy4gQUNMKVxuICogICAgTm90ZTogbG9jYWwgbGlzdGluZ3Mgb24gTWFjT1NYIGFsc28gdXNlICdAJ1xuICogICAgdGhpcyBpcyBub3QgYWxsb3dlZCBmb3IgaGVyZSBhcyBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgc2hvd24gYnkgRlRQIHNlcnZlcnNcbiAqICAgIHtAY29kZSBAfSAgIGZpbGUgaGFzIGV4dGVuZGVkIGF0dHJpYnV0ZXNcbiAqL1xuY29uc3QgUkVfTElORSA9IG5ldyBSZWdFeHAoXCIoW2JjZGVsZm1wU3MtXSlcIiAvLyBmaWxlIHR5cGVcbiAgICArIFwiKCgocnwtKSh3fC0pKFt4c1N0VEwtXSkpKChyfC0pKHd8LSkoW3hzU3RUTC1dKSkoKHJ8LSkod3wtKShbeHNTdFRMLV0/KSkpXFxcXCs/XCIgLy8gcGVybWlzc2lvbnNcbiAgICArIFwiXFxcXHMqXCIgLy8gc2VwYXJhdG9yIFRPRE8gd2h5IGFsbG93IGl0IHRvIGJlIG9taXR0ZWQ/P1xuICAgICsgXCIoXFxcXGQrKVwiIC8vIGxpbmsgY291bnRcbiAgICArIFwiXFxcXHMrXCIgLy8gc2VwYXJhdG9yXG4gICAgKyBcIig/OihcXFxcUysoPzpcXFxcc1xcXFxTKykqPylcXFxccyspP1wiIC8vIG93bmVyIG5hbWUgKG9wdGlvbmFsIHNwYWNlcylcbiAgICArIFwiKD86KFxcXFxTKyg/OlxcXFxzXFxcXFMrKSopXFxcXHMrKT9cIiAvLyBncm91cCBuYW1lIChvcHRpb25hbCBzcGFjZXMpXG4gICAgKyBcIihcXFxcZCsoPzosXFxcXHMqXFxcXGQrKT8pXCIgLy8gc2l6ZSBvciBuLG1cbiAgICArIFwiXFxcXHMrXCIgLy8gc2VwYXJhdG9yXG4gICAgLyoqXG4gICAgICogbnVtZXJpYyBvciBzdGFuZGFyZCBmb3JtYXQgZGF0ZTpcbiAgICAgKiAgIHl5eXktbW0tZGQgKGV4cGVjdGluZyBoaDptbSB0byBmb2xsb3cpXG4gICAgICogICBNTU0gW2RdZFxuICAgICAqICAgW2RdZCBNTU1cbiAgICAgKiAgIE4uQi4gdXNlIG5vbi1zcGFjZSBmb3IgTU1NIHRvIGFsbG93IGZvciBsYW5ndWFnZXMgc3VjaCBhcyBHZXJtYW4gd2hpY2ggdXNlXG4gICAgICogICBkaWFjcml0aWNzIChlLmcuIHVtbGF1dCkgaW4gc29tZSBhYmJyZXZpYXRpb25zLlxuICAgICAqICAgSmFwYW5lc2UgdXNlcyBudW1lcmljIGRheSBhbmQgbW9udGggd2l0aCBzdWZmaXhlcyB0byBkaXN0aW5ndWlzaCB0aGVtXG4gICAgICogICBbZF1kWFggW2RdZFpaXG4gICAgICovXG4gICAgKyBcIihcIiArXG4gICAgXCIoPzpcXFxcZCtbLS9dXFxcXGQrWy0vXVxcXFxkKylcIiArIC8vIHl5eXktbW0tZGRcbiAgICBcInwoPzpcXFxcU3szfVxcXFxzK1xcXFxkezEsMn0pXCIgKyAvLyBNTU0gW2RdZFxuICAgIFwifCg/OlxcXFxkezEsMn1cXFxccytcXFxcU3szfSlcIiArIC8vIFtkXWQgTU1NXG4gICAgXCJ8KD86XFxcXGR7MSwyfVwiICsgSkFfTU9OVEggKyBcIlxcXFxzK1xcXFxkezEsMn1cIiArIEpBX0RBWSArIFwiKVwiICtcbiAgICBcIilcIlxuICAgICsgXCJcXFxccytcIiAvLyBzZXBhcmF0b3JcbiAgICAvKipcbiAgICAgKiB5ZWFyIChmb3Igbm9uLXJlY2VudCBzdGFuZGFyZCBmb3JtYXQpIC0geXl5eVxuICAgICAqIG9yIHRpbWUgKGZvciBudW1lcmljIG9yIHJlY2VudCBzdGFuZGFyZCBmb3JtYXQpIFtoXWg6bW1cbiAgICAgKiBvciBKYXBhbmVzZSB5ZWFyIC0geXl5eVhYXG4gICAgICovXG4gICAgKyBcIigoPzpcXFxcZCsoPzo6XFxcXGQrKT8pfCg/OlxcXFxkezR9XCIgKyBKQV9ZRUFSICsgXCIpKVwiIC8vICgyMClcbiAgICArIFwiXFxcXHNcIiAvLyBzZXBhcmF0b3JcbiAgICArIFwiKC4qKVwiKTsgLy8gdGhlIHJlc3QgKDIxKVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYSBnaXZlbiBsaW5lIG1pZ2h0IGJlIGEgVW5peC1zdHlsZSBsaXN0aW5nLlxuICpcbiAqIC0gRXhhbXBsZTogYC1ydy1yLS1yLS0rICAgMSBwYXRyaWNrICBzdGFmZiAgIDEwNTcgRGVjIDExIDE0OjM1IHRlc3QudHh0YFxuICovXG5mdW5jdGlvbiB0ZXN0TGluZShsaW5lKSB7XG4gICAgcmV0dXJuIFJFX0xJTkUudGVzdChsaW5lKTtcbn1cbmV4cG9ydHMudGVzdExpbmUgPSB0ZXN0TGluZTtcbi8qKlxuICogUGFyc2UgYSBzaW5nbGUgbGluZSBvZiBhIFVuaXgtc3R5bGUgZGlyZWN0b3J5IGxpc3RpbmcuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTGluZShsaW5lKSB7XG4gICAgY29uc3QgZ3JvdXBzID0gbGluZS5tYXRjaChSRV9MSU5FKTtcbiAgICBpZiAoZ3JvdXBzID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBncm91cHNbMjFdO1xuICAgIGlmIChuYW1lID09PSBcIi5cIiB8fCBuYW1lID09PSBcIi4uXCIpIHsgLy8gSWdub3JlIHBhcmVudCBkaXJlY3RvcnkgbGlua3NcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlSW5mb18xLkZpbGVJbmZvKG5hbWUpO1xuICAgIGZpbGUuc2l6ZSA9IHBhcnNlSW50KGdyb3Vwc1sxOF0sIDEwKTtcbiAgICBmaWxlLnVzZXIgPSBncm91cHNbMTZdO1xuICAgIGZpbGUuZ3JvdXAgPSBncm91cHNbMTddO1xuICAgIGZpbGUuaGFyZExpbmtDb3VudCA9IHBhcnNlSW50KGdyb3Vwc1sxNV0sIDEwKTtcbiAgICBmaWxlLnJhd01vZGlmaWVkQXQgPSBncm91cHNbMTldICsgXCIgXCIgKyBncm91cHNbMjBdO1xuICAgIGZpbGUucGVybWlzc2lvbnMgPSB7XG4gICAgICAgIHVzZXI6IHBhcnNlTW9kZShncm91cHNbNF0sIGdyb3Vwc1s1XSwgZ3JvdXBzWzZdKSxcbiAgICAgICAgZ3JvdXA6IHBhcnNlTW9kZShncm91cHNbOF0sIGdyb3Vwc1s5XSwgZ3JvdXBzWzEwXSksXG4gICAgICAgIHdvcmxkOiBwYXJzZU1vZGUoZ3JvdXBzWzEyXSwgZ3JvdXBzWzEzXSwgZ3JvdXBzWzE0XSksXG4gICAgfTtcbiAgICAvLyBTZXQgZmlsZSB0eXBlXG4gICAgc3dpdGNoIChncm91cHNbMV0uY2hhckF0KDApKSB7XG4gICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgICBmaWxlLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLkRpcmVjdG9yeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZVwiOiAvLyBORVQtMzkgPT4gei9PUyBleHRlcm5hbCBsaW5rXG4gICAgICAgICAgICBmaWxlLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLlN5bWJvbGljTGluaztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibFwiOlxuICAgICAgICAgICAgZmlsZS50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5TeW1ib2xpY0xpbms7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImJcIjpcbiAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICAgIGZpbGUudHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuRmlsZTsgLy8gVE9ETyBjaGFuZ2UgdGhpcyBpZiBERVZJQ0VfVFlQRSBpbXBsZW1lbnRlZFxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgIGNhc2UgXCItXCI6XG4gICAgICAgICAgICBmaWxlLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLkZpbGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIEEgJ3doaXRlb3V0JyBmaWxlIGlzIGFuIEFSVElGSUNJQUwgZW50cnkgaW4gYW55IG9mIHNldmVyYWwgdHlwZXMgb2ZcbiAgICAgICAgICAgIC8vICd0cmFuc2x1Y2VudCcgZmlsZXN5c3RlbXMsIG9mIHdoaWNoIGEgJ3VuaW9uJyBmaWxlc3lzdGVtIGlzIG9uZS5cbiAgICAgICAgICAgIGZpbGUudHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuVW5rbm93bjtcbiAgICB9XG4gICAgLy8gU2VwYXJhdGUgb3V0IHRoZSBsaW5rIG5hbWUgZm9yIHN5bWJvbGljIGxpbmtzXG4gICAgaWYgKGZpbGUuaXNTeW1ib2xpY0xpbmspIHtcbiAgICAgICAgY29uc3QgZW5kID0gbmFtZS5pbmRleE9mKFwiIC0+IFwiKTtcbiAgICAgICAgaWYgKGVuZCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGZpbGUubmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGVuZCk7XG4gICAgICAgICAgICBmaWxlLmxpbmsgPSBuYW1lLnN1YnN0cmluZyhlbmQgKyA0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmlsZTtcbn1cbmV4cG9ydHMucGFyc2VMaW5lID0gcGFyc2VMaW5lO1xuZnVuY3Rpb24gdHJhbnNmb3JtTGlzdChmaWxlcykge1xuICAgIHJldHVybiBmaWxlcztcbn1cbmV4cG9ydHMudHJhbnNmb3JtTGlzdCA9IHRyYW5zZm9ybUxpc3Q7XG5mdW5jdGlvbiBwYXJzZU1vZGUociwgdywgeCkge1xuICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgaWYgKHIgIT09IFwiLVwiKSB7XG4gICAgICAgIHZhbHVlICs9IEZpbGVJbmZvXzEuRmlsZUluZm8uVW5peFBlcm1pc3Npb24uUmVhZDtcbiAgICB9XG4gICAgaWYgKHcgIT09IFwiLVwiKSB7XG4gICAgICAgIHZhbHVlICs9IEZpbGVJbmZvXzEuRmlsZUluZm8uVW5peFBlcm1pc3Npb24uV3JpdGU7XG4gICAgfVxuICAgIGNvbnN0IGV4ZWNUb2tlbiA9IHguY2hhckF0KDApO1xuICAgIGlmIChleGVjVG9rZW4gIT09IFwiLVwiICYmIGV4ZWNUb2tlbi50b1VwcGVyQ2FzZSgpICE9PSBleGVjVG9rZW4pIHtcbiAgICAgICAgdmFsdWUgKz0gRmlsZUluZm9fMS5GaWxlSW5mby5Vbml4UGVybWlzc2lvbi5FeGVjdXRlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZG93bmxvYWRUbyA9IGV4cG9ydHMudXBsb2FkRnJvbSA9IGV4cG9ydHMuY29ubmVjdEZvclBhc3NpdmVUcmFuc2ZlciA9IGV4cG9ydHMucGFyc2VQYXN2UmVzcG9uc2UgPSBleHBvcnRzLmVudGVyUGFzc2l2ZU1vZGVJUHY0ID0gZXhwb3J0cy5wYXJzZUVwc3ZSZXNwb25zZSA9IGV4cG9ydHMuZW50ZXJQYXNzaXZlTW9kZUlQdjYgPSB2b2lkIDA7XG5jb25zdCBuZXRVdGlsc18xID0gcmVxdWlyZShcIi4vbmV0VXRpbHNcIik7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jb25zdCB0bHNfMSA9IHJlcXVpcmUoXCJ0bHNcIik7XG5jb25zdCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xID0gcmVxdWlyZShcIi4vcGFyc2VDb250cm9sUmVzcG9uc2VcIik7XG4vKipcbiAqIFByZXBhcmUgYSBkYXRhIHNvY2tldCB1c2luZyBwYXNzaXZlIG1vZGUgb3ZlciBJUHY2LlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnRlclBhc3NpdmVNb2RlSVB2NihmdHApIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmdHAucmVxdWVzdChcIkVQU1ZcIik7XG4gICAgY29uc3QgcG9ydCA9IHBhcnNlRXBzdlJlc3BvbnNlKHJlcy5tZXNzYWdlKTtcbiAgICBpZiAoIXBvcnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgcGFyc2UgRVBTViByZXNwb25zZTogXCIgKyByZXMubWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRyb2xIb3N0ID0gZnRwLnNvY2tldC5yZW1vdGVBZGRyZXNzO1xuICAgIGlmIChjb250cm9sSG9zdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRyb2wgc29ja2V0IGlzIGRpc2Nvbm5lY3RlZCwgY2FuJ3QgZ2V0IHJlbW90ZSBhZGRyZXNzLlwiKTtcbiAgICB9XG4gICAgYXdhaXQgY29ubmVjdEZvclBhc3NpdmVUcmFuc2Zlcihjb250cm9sSG9zdCwgcG9ydCwgZnRwKTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5lbnRlclBhc3NpdmVNb2RlSVB2NiA9IGVudGVyUGFzc2l2ZU1vZGVJUHY2O1xuLyoqXG4gKiBQYXJzZSBhbiBFUFNWIHJlc3BvbnNlLiBSZXR1cm5zIG9ubHkgdGhlIHBvcnQgYXMgaW4gRVBTViB0aGUgaG9zdCBvZiB0aGUgY29udHJvbCBjb25uZWN0aW9uIGlzIHVzZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRXBzdlJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgICAvLyBHZXQgcG9ydCBmcm9tIEVQU1YgcmVzcG9uc2UsIGUuZy4gXCIyMjkgRW50ZXJpbmcgRXh0ZW5kZWQgUGFzc2l2ZSBNb2RlICh8fHw2NDQ2fClcIlxuICAgIC8vIFNvbWUgRlRQIFNlcnZlcnMgc3VjaCBhcyB0aGUgb25lIG9uIElCTSBpIChPUy80MDApIHVzZSAhIGluc3RlYWQgb2YgfCBpbiB0aGVpciBFUFNWIHJlc3BvbnNlLlxuICAgIGNvbnN0IGdyb3VwcyA9IG1lc3NhZ2UubWF0Y2goL1t8IV17M30oLispW3whXS8pO1xuICAgIGlmIChncm91cHMgPT09IG51bGwgfHwgZ3JvdXBzWzFdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBwYXJzZSByZXNwb25zZSB0byAnRVBTVic6ICR7bWVzc2FnZX1gKTtcbiAgICB9XG4gICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KGdyb3Vwc1sxXSwgMTApO1xuICAgIGlmIChOdW1iZXIuaXNOYU4ocG9ydCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBwYXJzZSByZXNwb25zZSB0byAnRVBTVicsIHBvcnQgaXMgbm90IGEgbnVtYmVyOiAke21lc3NhZ2V9YCk7XG4gICAgfVxuICAgIHJldHVybiBwb3J0O1xufVxuZXhwb3J0cy5wYXJzZUVwc3ZSZXNwb25zZSA9IHBhcnNlRXBzdlJlc3BvbnNlO1xuLyoqXG4gKiBQcmVwYXJlIGEgZGF0YSBzb2NrZXQgdXNpbmcgcGFzc2l2ZSBtb2RlIG92ZXIgSVB2NC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW50ZXJQYXNzaXZlTW9kZUlQdjQoZnRwKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZnRwLnJlcXVlc3QoXCJQQVNWXCIpO1xuICAgIGNvbnN0IHRhcmdldCA9IHBhcnNlUGFzdlJlc3BvbnNlKHJlcy5tZXNzYWdlKTtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBwYXJzZSBQQVNWIHJlc3BvbnNlOiBcIiArIHJlcy5tZXNzYWdlKTtcbiAgICB9XG4gICAgLy8gSWYgdGhlIGhvc3QgaW4gdGhlIFBBU1YgcmVzcG9uc2UgaGFzIGEgbG9jYWwgYWRkcmVzcyB3aGlsZSB0aGUgY29udHJvbCBjb25uZWN0aW9uIGhhc24ndCxcbiAgICAvLyB3ZSBhc3N1bWUgYSBOQVQgaXNzdWUgYW5kIHVzZSB0aGUgSVAgb2YgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBhcyB0aGUgdGFyZ2V0IGZvciB0aGUgZGF0YSBjb25uZWN0aW9uLlxuICAgIC8vIFdlIGNhbid0IGFsd2F5cyBwZXJmb3JtIHRoaXMgcmVwbGFjZW1lbnQgYmVjYXVzZSBpdCdzIHBvc3NpYmxlIChhbHRob3VnaCB1bmxpa2VseSkgdGhhdCB0aGUgRlRQIHNlcnZlclxuICAgIC8vIGluZGVlZCB1c2VzIGEgZGlmZmVyZW50IGhvc3QgZm9yIGRhdGEgY29ubmVjdGlvbnMuXG4gICAgY29uc3QgY29udHJvbEhvc3QgPSBmdHAuc29ja2V0LnJlbW90ZUFkZHJlc3M7XG4gICAgaWYgKCgwLCBuZXRVdGlsc18xLmlwSXNQcml2YXRlVjRBZGRyZXNzKSh0YXJnZXQuaG9zdCkgJiYgY29udHJvbEhvc3QgJiYgISgwLCBuZXRVdGlsc18xLmlwSXNQcml2YXRlVjRBZGRyZXNzKShjb250cm9sSG9zdCkpIHtcbiAgICAgICAgdGFyZ2V0Lmhvc3QgPSBjb250cm9sSG9zdDtcbiAgICB9XG4gICAgYXdhaXQgY29ubmVjdEZvclBhc3NpdmVUcmFuc2Zlcih0YXJnZXQuaG9zdCwgdGFyZ2V0LnBvcnQsIGZ0cCk7XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuZW50ZXJQYXNzaXZlTW9kZUlQdjQgPSBlbnRlclBhc3NpdmVNb2RlSVB2NDtcbi8qKlxuICogUGFyc2UgYSBQQVNWIHJlc3BvbnNlLlxuICovXG5mdW5jdGlvbiBwYXJzZVBhc3ZSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgLy8gR2V0IGhvc3QgYW5kIHBvcnQgZnJvbSBQQVNWIHJlc3BvbnNlLCBlLmcuIFwiMjI3IEVudGVyaW5nIFBhc3NpdmUgTW9kZSAoMTkyLDE2OCwxLDEwMCwxMCwyMjkpXCJcbiAgICBjb25zdCBncm91cHMgPSBtZXNzYWdlLm1hdGNoKC8oWy1cXGRdKyxbLVxcZF0rLFstXFxkXSssWy1cXGRdKyksKFstXFxkXSspLChbLVxcZF0rKS8pO1xuICAgIGlmIChncm91cHMgPT09IG51bGwgfHwgZ3JvdXBzLmxlbmd0aCAhPT0gNCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHBhcnNlIHJlc3BvbnNlIHRvICdQQVNWJzogJHttZXNzYWdlfWApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBob3N0OiBncm91cHNbMV0ucmVwbGFjZSgvLC9nLCBcIi5cIiksXG4gICAgICAgIHBvcnQ6IChwYXJzZUludChncm91cHNbMl0sIDEwKSAmIDI1NSkgKiAyNTYgKyAocGFyc2VJbnQoZ3JvdXBzWzNdLCAxMCkgJiAyNTUpXG4gICAgfTtcbn1cbmV4cG9ydHMucGFyc2VQYXN2UmVzcG9uc2UgPSBwYXJzZVBhc3ZSZXNwb25zZTtcbmZ1bmN0aW9uIGNvbm5lY3RGb3JQYXNzaXZlVHJhbnNmZXIoaG9zdCwgcG9ydCwgZnRwKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHNvY2tldCA9IGZ0cC5fbmV3U29ja2V0KCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZUNvbm5FcnIgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBlcnIubWVzc2FnZSA9IFwiQ2FuJ3Qgb3BlbiBkYXRhIGNvbm5lY3Rpb24gaW4gcGFzc2l2ZSBtb2RlOiBcIiArIGVyci5tZXNzYWdlO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGhhbmRsZVRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVGltZW91dCB3aGVuIHRyeWluZyB0byBvcGVuIGRhdGEgY29ubmVjdGlvbiB0byAke2hvc3R9OiR7cG9ydH1gKSk7XG4gICAgICAgIH07XG4gICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KGZ0cC50aW1lb3V0KTtcbiAgICAgICAgc29ja2V0Lm9uKFwiZXJyb3JcIiwgaGFuZGxlQ29ubkVycik7XG4gICAgICAgIHNvY2tldC5vbihcInRpbWVvdXRcIiwgaGFuZGxlVGltZW91dCk7XG4gICAgICAgIHNvY2tldC5jb25uZWN0KHsgcG9ydCwgaG9zdCwgZmFtaWx5OiBmdHAuaXBGYW1pbHkgfSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZ0cC5zb2NrZXQgaW5zdGFuY2VvZiB0bHNfMS5UTFNTb2NrZXQpIHtcbiAgICAgICAgICAgICAgICBzb2NrZXQgPSAoMCwgdGxzXzEuY29ubmVjdCkoT2JqZWN0LmFzc2lnbih7fSwgZnRwLnRsc09wdGlvbnMsIHtcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0LFxuICAgICAgICAgICAgICAgICAgICAvLyBSZXVzZSB0aGUgVExTIHNlc3Npb24gbmVnb3RpYXRlZCBlYXJsaWVyIHdoZW4gdGhlIGNvbnRyb2wgY29ubmVjdGlvblxuICAgICAgICAgICAgICAgICAgICAvLyB3YXMgdXBncmFkZWQuIFNlcnZlcnMgZXhwZWN0IHRoaXMgYmVjYXVzZSBpdCBwcm92aWRlcyBhZGRpdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgIC8vIHNlY3VyaXR5OiBJZiBhIGNvbXBsZXRlbHkgbmV3IHNlc3Npb24gd291bGQgYmUgbmVnb3RpYXRlZCwgYSBoYWNrZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gY291bGQgZ3Vlc3MgdGhlIHBvcnQgYW5kIGNvbm5lY3QgdG8gdGhlIG5ldyBkYXRhIGNvbm5lY3Rpb24gYmVmb3JlIHdlIGRvXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ5IGp1c3Qgc3RhcnRpbmcgaGlzL2hlciBvd24gVExTIHNlc3Npb24uXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb246IGZ0cC5zb2NrZXQuZ2V0U2Vzc2lvbigpXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIC8vIEl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB0cmFuc2ZlciB0YXNrIHRvIHdhaXQgdW50aWwgdGhlXG4gICAgICAgICAgICAgICAgLy8gVExTIHNvY2tldCBpc3N1ZWQgdGhlIGV2ZW50ICdzZWN1cmVDb25uZWN0Jy4gV2UgY2FuJ3QgZG8gdGhpc1xuICAgICAgICAgICAgICAgIC8vIGhlcmUgYmVjYXVzZSBzb21lIHNlcnZlcnMgd2lsbCBzdGFydCB1cGdyYWRpbmcgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gc3BlY2lmaWMgdHJhbnNmZXIgcmVxdWVzdCBoYXMgYmVlbiBtYWRlLiBMaXN0IGFuZCBkb3dubG9hZCBkb24ndFxuICAgICAgICAgICAgICAgIC8vIGhhdmUgdG8gd2FpdCBmb3IgdGhpcyBldmVudCBiZWNhdXNlIHRoZSBzZXJ2ZXIgc2VuZHMgd2hlbmV2ZXIgaXRcbiAgICAgICAgICAgICAgICAvLyBpcyByZWFkeS4gQnV0IGZvciB1cGxvYWQgdGhpcyBoYXMgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50LFxuICAgICAgICAgICAgICAgIC8vIHNlZSB0aGUgZGV0YWlscyBpbiB0aGUgdXBsb2FkKCkgZnVuY3Rpb24gYmVsb3cuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMZXQgdGhlIEZUUENvbnRleHQgbGlzdGVuIHRvIGVycm9ycyBmcm9tIG5vdyBvbiwgcmVtb3ZlIGxvY2FsIGhhbmRsZXIuXG4gICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCBoYW5kbGVDb25uRXJyKTtcbiAgICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcihcInRpbWVvdXRcIiwgaGFuZGxlVGltZW91dCk7XG4gICAgICAgICAgICBmdHAuZGF0YVNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLmNvbm5lY3RGb3JQYXNzaXZlVHJhbnNmZXIgPSBjb25uZWN0Rm9yUGFzc2l2ZVRyYW5zZmVyO1xuLyoqXG4gKiBIZWxwcyByZXNvbHZpbmcvcmVqZWN0aW5nIHRyYW5zZmVycy5cbiAqXG4gKiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBmb3IgYWxsIEZUUCB0cmFuc2ZlcnMuIEZvciBleGFtcGxlIHdoZW4gZG93bmxvYWRpbmcsIHRoZSBzZXJ2ZXIgbWlnaHQgY29uZmlybVxuICogd2l0aCBcIjIyNiBUcmFuc2ZlciBjb21wbGV0ZVwiIHdoZW4gaW4gZmFjdCB0aGUgZG93bmxvYWQgb24gdGhlIGRhdGEgY29ubmVjdGlvbiBoYXMgbm90IGZpbmlzaGVkXG4gKiB5ZXQuIFdpdGggYWxsIHRyYW5zZmVycyB3ZSBtYWtlIHN1cmUgdGhhdCBhKSB0aGUgcmVzdWx0IGFycml2ZWQgYW5kIGIpIGhhcyBiZWVuIGNvbmZpcm1lZCBieVxuICogZS5nLiB0aGUgY29udHJvbCBjb25uZWN0aW9uLiBXZSBqdXN0IGRvbid0IGtub3cgaW4gd2hpY2ggb3JkZXIgdGhpcyB3aWxsIGhhcHBlbi5cbiAqL1xuY2xhc3MgVHJhbnNmZXJSZXNvbHZlciB7XG4gICAgLyoqXG4gICAgICogSW5zdGFudGlhdGUgYSBUcmFuc2ZlclJlc29sdmVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZnRwLCBwcm9ncmVzcykge1xuICAgICAgICB0aGlzLmZ0cCA9IGZ0cDtcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmRhdGFUcmFuc2ZlckRvbmUgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFyayB0aGUgYmVnaW5uaW5nIG9mIGEgdHJhbnNmZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgb2YgdGhlIHRyYW5zZmVyLCB1c3VhbGx5IHRoZSBmaWxlbmFtZS5cbiAgICAgKiBAcGFyYW0gdHlwZSAtIFR5cGUgb2YgdHJhbnNmZXIsIHVzdWFsbHkgXCJ1cGxvYWRcIiBvciBcImRvd25sb2FkXCIuXG4gICAgICovXG4gICAgb25EYXRhU3RhcnQobmFtZSwgdHlwZSkge1xuICAgICAgICAvLyBMZXQgdGhlIGRhdGEgc29ja2V0IGJlIGluIGNoYXJnZSBvZiB0cmFja2luZyB0aW1lb3V0cyBkdXJpbmcgdHJhbnNmZXIuXG4gICAgICAgIC8vIFRoZSBjb250cm9sIHNvY2tldCBzaXRzIGlkbGUgZHVyaW5nIHRoaXMgdGltZSBhbnl3YXkgYW5kIG1pZ2h0IHByb3Zva2VcbiAgICAgICAgLy8gYSB0aW1lb3V0IHVubmVjZXNzYXJpbHkuIFRoZSBjb250cm9sIGNvbm5lY3Rpb24gd2lsbCB0YWtlIGNhcmVcbiAgICAgICAgLy8gb2YgdGltZW91dHMgYWdhaW4gb25jZSBkYXRhIHRyYW5zZmVyIGlzIGNvbXBsZXRlIG9yIGZhaWxlZC5cbiAgICAgICAgaWYgKHRoaXMuZnRwLmRhdGFTb2NrZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YSB0cmFuc2ZlciBzaG91bGQgc3RhcnQgYnV0IHRoZXJlIGlzIG5vIGRhdGEgY29ubmVjdGlvbi5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mdHAuc29ja2V0LnNldFRpbWVvdXQoMCk7XG4gICAgICAgIHRoaXMuZnRwLmRhdGFTb2NrZXQuc2V0VGltZW91dCh0aGlzLmZ0cC50aW1lb3V0KTtcbiAgICAgICAgdGhpcy5wcm9ncmVzcy5zdGFydCh0aGlzLmZ0cC5kYXRhU29ja2V0LCBuYW1lLCB0eXBlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGEgY29ubmVjdGlvbiBoYXMgZmluaXNoZWQgdGhlIHRyYW5zZmVyLlxuICAgICAqL1xuICAgIG9uRGF0YURvbmUodGFzaykge1xuICAgICAgICB0aGlzLnByb2dyZXNzLnVwZGF0ZUFuZFN0b3AoKTtcbiAgICAgICAgLy8gSGFuZC1vdmVyIHRpbWVvdXQgdHJhY2tpbmcgYmFjayB0byB0aGUgY29udHJvbCBjb25uZWN0aW9uLiBJdCdzIHBvc3NpYmxlIHRoYXRcbiAgICAgICAgLy8gd2UgZG9uJ3QgcmVjZWl2ZSB0aGUgcmVzcG9uc2Ugb3ZlciB0aGUgY29udHJvbCBjb25uZWN0aW9uIHRoYXQgdGhlIHRyYW5zZmVyIGlzXG4gICAgICAgIC8vIGRvbmUuIEluIHRoaXMgY2FzZSwgd2Ugd2FudCB0byBjb3JyZWN0bHkgYXNzb2NpYXRlIHRoZSByZXN1bHRpbmcgdGltZW91dCB3aXRoXG4gICAgICAgIC8vIHRoZSBjb250cm9sIGNvbm5lY3Rpb24uXG4gICAgICAgIHRoaXMuZnRwLnNvY2tldC5zZXRUaW1lb3V0KHRoaXMuZnRwLnRpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5mdHAuZGF0YVNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5mdHAuZGF0YVNvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVRyYW5zZmVyRG9uZSA9IHRydWU7XG4gICAgICAgIHRoaXMudHJ5UmVzb2x2ZSh0YXNrKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRyb2wgY29ubmVjdGlvbiByZXBvcnRzIHRoZSB0cmFuc2ZlciBhcyBmaW5pc2hlZC5cbiAgICAgKi9cbiAgICBvbkNvbnRyb2xEb25lKHRhc2ssIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy50cnlSZXNvbHZlKHRhc2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBoYXMgYmVlbiByZXBvcnRlZCBhbmQgdGhlIHRhc2sgc2hvdWxkIGJlIHJlamVjdGVkLlxuICAgICAqL1xuICAgIG9uRXJyb3IodGFzaywgZXJyKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MudXBkYXRlQW5kU3RvcCgpO1xuICAgICAgICB0aGlzLmZ0cC5zb2NrZXQuc2V0VGltZW91dCh0aGlzLmZ0cC50aW1lb3V0KTtcbiAgICAgICAgdGhpcy5mdHAuZGF0YVNvY2tldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGFzay5yZWplY3QoZXJyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udHJvbCBjb25uZWN0aW9uIHNlbnQgYW4gdW5leHBlY3RlZCByZXF1ZXN0IHJlcXVpcmluZyBhIHJlc3BvbnNlIGZyb20gb3VyIHBhcnQuIFdlXG4gICAgICogY2FuJ3QgcHJvdmlkZSB0aGF0IChiZWNhdXNlIHVua25vd24pIGFuZCBoYXZlIHRvIGNsb3NlIHRoZSBjb250cmV4dCB3aXRoIGFuIGVycm9yIGJlY2F1c2VcbiAgICAgKiB0aGUgRlRQIHNlcnZlciBpcyBub3cgY2F1Z2h0IHVwIGluIGEgc3RhdGUgd2UgY2FuJ3QgcmVzb2x2ZS5cbiAgICAgKi9cbiAgICBvblVuZXhwZWN0ZWRSZXF1ZXN0KHJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBGVFAgcmVzcG9uc2UgaXMgcmVxdWVzdGluZyBhbiBhbnN3ZXI6ICR7cmVzcG9uc2UubWVzc2FnZX1gKTtcbiAgICAgICAgdGhpcy5mdHAuY2xvc2VXaXRoRXJyb3IoZXJyKTtcbiAgICB9XG4gICAgdHJ5UmVzb2x2ZSh0YXNrKSB7XG4gICAgICAgIC8vIFRvIHJlc29sdmUsIHdlIG5lZWQgYm90aCBjb250cm9sIGFuZCBkYXRhIGNvbm5lY3Rpb24gdG8gcmVwb3J0IHRoYXQgdGhlIHRyYW5zZmVyIGlzIGRvbmUuXG4gICAgICAgIGNvbnN0IGNhblJlc29sdmUgPSB0aGlzLmRhdGFUcmFuc2ZlckRvbmUgJiYgdGhpcy5yZXNwb25zZSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoY2FuUmVzb2x2ZSkge1xuICAgICAgICAgICAgdGhpcy5mdHAuZGF0YVNvY2tldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRhc2sucmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHVwbG9hZEZyb20oc291cmNlLCBjb25maWcpIHtcbiAgICBjb25zdCByZXNvbHZlciA9IG5ldyBUcmFuc2ZlclJlc29sdmVyKGNvbmZpZy5mdHAsIGNvbmZpZy50cmFja2VyKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IGAke2NvbmZpZy5jb21tYW5kfSAke2NvbmZpZy5yZW1vdGVQYXRofWA7XG4gICAgcmV0dXJuIGNvbmZpZy5mdHAuaGFuZGxlKGZ1bGxDb21tYW5kLCAocmVzLCB0YXNrKSA9PiB7XG4gICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmVzb2x2ZXIub25FcnJvcih0YXNrLCByZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJlcy5jb2RlID09PSAxNTAgfHwgcmVzLmNvZGUgPT09IDEyNSkgeyAvLyBSZWFkeSB0byB1cGxvYWRcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTb2NrZXQgPSBjb25maWcuZnRwLmRhdGFTb2NrZXQ7XG4gICAgICAgICAgICBpZiAoIWRhdGFTb2NrZXQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlci5vbkVycm9yKHRhc2ssIG5ldyBFcnJvcihcIlVwbG9hZCBzaG91bGQgYmVnaW4gYnV0IG5vIGRhdGEgY29ubmVjdGlvbiBpcyBhdmFpbGFibGUuXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgdXNpbmcgVExTLCB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgdGhlIGRhdGFTb2NrZXQgaXNzdWVkXG4gICAgICAgICAgICAvLyAnc2VjdXJlQ29ubmVjdCcuIElmIHRoaXMgaGFzbid0IGhhcHBlbmVkIHlldCwgZ2V0Q2lwaGVyKCkgcmV0dXJucyB1bmRlZmluZWQuXG4gICAgICAgICAgICBjb25zdCBjYW5VcGxvYWQgPSBcImdldENpcGhlclwiIGluIGRhdGFTb2NrZXQgPyBkYXRhU29ja2V0LmdldENpcGhlcigpICE9PSB1bmRlZmluZWQgOiB0cnVlO1xuICAgICAgICAgICAgb25Db25kaXRpb25PckV2ZW50KGNhblVwbG9hZCwgZGF0YVNvY2tldCwgXCJzZWN1cmVDb25uZWN0XCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25maWcuZnRwLmxvZyhgVXBsb2FkaW5nIHRvICR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVBZGRyZXNzKShkYXRhU29ja2V0KX0gKCR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVUTFMpKGRhdGFTb2NrZXQpfSlgKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlci5vbkRhdGFTdGFydChjb25maWcucmVtb3RlUGF0aCwgY29uZmlnLnR5cGUpO1xuICAgICAgICAgICAgICAgICgwLCBzdHJlYW1fMS5waXBlbGluZSkoc291cmNlLCBkYXRhU29ja2V0LCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5vbkVycm9yKHRhc2ssIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5vbkRhdGFEb25lKHRhc2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoMCwgcGFyc2VDb250cm9sUmVzcG9uc2VfMS5wb3NpdGl2ZUNvbXBsZXRpb24pKHJlcy5jb2RlKSkgeyAvLyBUcmFuc2ZlciBjb21wbGV0ZVxuICAgICAgICAgICAgcmVzb2x2ZXIub25Db250cm9sRG9uZSh0YXNrLCByZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCgwLCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xLnBvc2l0aXZlSW50ZXJtZWRpYXRlKShyZXMuY29kZSkpIHtcbiAgICAgICAgICAgIHJlc29sdmVyLm9uVW5leHBlY3RlZFJlcXVlc3QocmVzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZ25vcmUgYWxsIG90aGVyIHBvc2l0aXZlIHByZWxpbWluYXJ5IHJlc3BvbnNlIGNvZGVzICg8IDIwMClcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBsb2FkRnJvbSA9IHVwbG9hZEZyb207XG5mdW5jdGlvbiBkb3dubG9hZFRvKGRlc3RpbmF0aW9uLCBjb25maWcpIHtcbiAgICBpZiAoIWNvbmZpZy5mdHAuZGF0YVNvY2tldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEb3dubG9hZCB3aWxsIGJlIGluaXRpYXRlZCBidXQgbm8gZGF0YSBjb25uZWN0aW9uIGlzIGF2YWlsYWJsZS5cIik7XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVyID0gbmV3IFRyYW5zZmVyUmVzb2x2ZXIoY29uZmlnLmZ0cCwgY29uZmlnLnRyYWNrZXIpO1xuICAgIHJldHVybiBjb25maWcuZnRwLmhhbmRsZShjb25maWcuY29tbWFuZCwgKHJlcywgdGFzaykgPT4ge1xuICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJlc29sdmVyLm9uRXJyb3IodGFzaywgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZXMuY29kZSA9PT0gMTUwIHx8IHJlcy5jb2RlID09PSAxMjUpIHsgLy8gUmVhZHkgdG8gZG93bmxvYWRcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTb2NrZXQgPSBjb25maWcuZnRwLmRhdGFTb2NrZXQ7XG4gICAgICAgICAgICBpZiAoIWRhdGFTb2NrZXQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlci5vbkVycm9yKHRhc2ssIG5ldyBFcnJvcihcIkRvd25sb2FkIHNob3VsZCBiZWdpbiBidXQgbm8gZGF0YSBjb25uZWN0aW9uIGlzIGF2YWlsYWJsZS5cIikpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZy5mdHAubG9nKGBEb3dubG9hZGluZyBmcm9tICR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVBZGRyZXNzKShkYXRhU29ja2V0KX0gKCR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVUTFMpKGRhdGFTb2NrZXQpfSlgKTtcbiAgICAgICAgICAgIHJlc29sdmVyLm9uRGF0YVN0YXJ0KGNvbmZpZy5yZW1vdGVQYXRoLCBjb25maWcudHlwZSk7XG4gICAgICAgICAgICAoMCwgc3RyZWFtXzEucGlwZWxpbmUpKGRhdGFTb2NrZXQsIGRlc3RpbmF0aW9uLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIub25FcnJvcih0YXNrLCBlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIub25EYXRhRG9uZSh0YXNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZXMuY29kZSA9PT0gMzUwKSB7IC8vIFJlc3RhcnRpbmcgYXQgc3RhcnRBdC5cbiAgICAgICAgICAgIGNvbmZpZy5mdHAuc2VuZChcIlJFVFIgXCIgKyBjb25maWcucmVtb3RlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKDAsIHBhcnNlQ29udHJvbFJlc3BvbnNlXzEucG9zaXRpdmVDb21wbGV0aW9uKShyZXMuY29kZSkpIHsgLy8gVHJhbnNmZXIgY29tcGxldGVcbiAgICAgICAgICAgIHJlc29sdmVyLm9uQ29udHJvbERvbmUodGFzaywgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoMCwgcGFyc2VDb250cm9sUmVzcG9uc2VfMS5wb3NpdGl2ZUludGVybWVkaWF0ZSkocmVzLmNvZGUpKSB7XG4gICAgICAgICAgICByZXNvbHZlci5vblVuZXhwZWN0ZWRSZXF1ZXN0KHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWdub3JlIGFsbCBvdGhlciBwb3NpdGl2ZSBwcmVsaW1pbmFyeSByZXNwb25zZSBjb2RlcyAoPCAyMDApXG4gICAgfSk7XG59XG5leHBvcnRzLmRvd25sb2FkVG8gPSBkb3dubG9hZFRvO1xuLyoqXG4gKiBDYWxscyBhIGZ1bmN0aW9uIGltbWVkaWF0ZWx5IGlmIGEgY29uZGl0aW9uIGlzIG1ldCBvciBzdWJzY3JpYmVzIHRvIGFuIGV2ZW50IGFuZCBjYWxsc1xuICogaXQgb25jZSB0aGUgZXZlbnQgaXMgZW1pdHRlZC5cbiAqXG4gKiBAcGFyYW0gY29uZGl0aW9uICBUaGUgY29uZGl0aW9uIHRvIHRlc3QuXG4gKiBAcGFyYW0gZW1pdHRlciAgVGhlIGVtaXR0ZXIgdG8gdXNlIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIEBwYXJhbSBldmVudE5hbWUgIFRoZSBldmVudCB0byBzdWJzY3JpYmUgdG8gaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogQHBhcmFtIGFjdGlvbiAgVGhlIGZ1bmN0aW9uIHRvIGNhbGwuXG4gKi9cbmZ1bmN0aW9uIG9uQ29uZGl0aW9uT3JFdmVudChjb25kaXRpb24sIGVtaXR0ZXIsIGV2ZW50TmFtZSwgYWN0aW9uKSB7XG4gICAgaWYgKGNvbmRpdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBhY3Rpb24oKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVtaXR0ZXIub25jZShldmVudE5hbWUsICgpID0+IGFjdGlvbigpKTtcbiAgICB9XG59XG4iLCJ2YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgQ1JDX1RBQkxFID0gW1xuICAweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweGVlMGU2MTJjLCAweDk5MDk1MWJhLCAweDA3NmRjNDE5LFxuICAweDcwNmFmNDhmLCAweGU5NjNhNTM1LCAweDllNjQ5NWEzLCAweDBlZGI4ODMyLCAweDc5ZGNiOGE0LFxuICAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LCAweDA5YjY0YzJiLCAweDdlYjE3Y2JkLCAweGU3YjgyZDA3LFxuICAweDkwYmYxZDkxLCAweDFkYjcxMDY0LCAweDZhYjAyMGYyLCAweGYzYjk3MTQ4LCAweDg0YmU0MWRlLFxuICAweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LCAweDEzNmM5ODU2LFxuICAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLCAweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LFxuICAweGZhMGYzZDYzLCAweDhkMDgwZGY1LCAweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LFxuICAweGEyNjc3MTcyLCAweDNjMDNlNGQxLCAweDRiMDRkNDQ3LCAweGQyMGQ4NWZkLCAweGE1MGFiNTZiLFxuICAweDM1YjVhOGZhLCAweDQyYjI5ODZjLCAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLCAweDMyZDg2Y2UzLFxuICAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LCAweDI2ZDkzMGFjLCAweDUxZGUwMDNhLFxuICAweGM4ZDc1MTgwLCAweGJmZDA2MTE2LCAweDIxYjRmNGI1LCAweDU2YjNjNDIzLCAweGNmYmE5NTk5LFxuICAweGI4YmRhNTBmLCAweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LFxuICAweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLCAweGI2NjYyZDNkLCAweDc2ZGM0MTkwLFxuICAweDAxZGI3MTA2LCAweDk4ZDIyMGJjLCAweGVmZDUxMDJhLCAweDcxYjE4NTg5LCAweDA2YjZiNTFmLFxuICAweDlmYmZlNGE1LCAweGU4YjhkNDMzLCAweDc4MDdjOWEyLCAweDBmMDBmOTM0LCAweDk2MDlhODhlLFxuICAweGUxMGU5ODE4LCAweDdmNmEwZGJiLCAweDA4NmQzZDJkLCAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxLFxuICAweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLCAweDZjMDY5NWVkLFxuICAweDFiMDFhNTdiLCAweDgyMDhmNGMxLCAweGY1MGZjNDU3LCAweDY1YjBkOWM2LCAweDEyYjdlOTUwLFxuICAweDhiYmViOGVhLCAweGZjYjk4ODdjLCAweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLFxuICAweGZiZDQ0YzY1LCAweDRkYjI2MTU4LCAweDNhYjU1MWNlLCAweGEzYmMwMDc0LCAweGQ0YmIzMGUyLFxuICAweDRhZGZhNTQxLCAweDNkZDg5NWQ3LCAweGE0ZDFjNDZkLCAweGQzZDZmNGZiLCAweDQzNjllOTZhLFxuICAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLCAweDQ0MDQyZDczLCAweDMzMDMxZGU1LFxuICAweGFhMGE0YzVmLCAweGRkMGQ3Y2M5LCAweDUwMDU3MTNjLCAweDI3MDI0MWFhLCAweGJlMGIxMDEwLFxuICAweGM5MGMyMDg2LCAweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLFxuICAweDVlZGVmOTBlLCAweDI5ZDljOTk4LCAweGIwZDA5ODIyLCAweGM3ZDdhOGI0LCAweDU5YjMzZDE3LFxuICAweDJlYjQwZDgxLCAweGI3YmQ1YzNiLCAweGMwYmE2Y2FkLCAweGVkYjg4MzIwLCAweDlhYmZiM2I2LFxuICAweDAzYjZlMjBjLCAweDc0YjFkMjlhLCAweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1LFxuICAweDczZGMxNjgzLCAweGUzNjMwYjEyLCAweDk0NjQzYjg0LCAweDBkNmQ2YTNlLCAweDdhNmE1YWE4LFxuICAweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLCAweGYwMGY5MzQ0LFxuICAweDg3MDhhM2QyLCAweDFlMDFmMjY4LCAweDY5MDZjMmZlLCAweGY3NjI1NzVkLCAweDgwNjU2N2NiLFxuICAweDE5NmMzNjcxLCAweDZlNmIwNmU3LCAweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLFxuICAweDY3ZGQ0YWNjLCAweGY5YjlkZjZmLCAweDhlYmVlZmY5LCAweDE3YjdiZTQzLCAweDYwYjA4ZWQ1LFxuICAweGQ2ZDZhM2U4LCAweGExZDE5MzdlLCAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLCAweGQxYmI2N2YxLFxuICAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLCAweGQ4MGQyYmRhLCAweGFmMGExYjRjLFxuICAweDM2MDM0YWY2LCAweDQxMDQ3YTYwLCAweGRmNjBlZmMzLCAweGE4NjdkZjU1LCAweDMxNmU4ZWVmLFxuICAweDQ2NjliZTc5LCAweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LFxuICAweGNjMGM3Nzk1LCAweGJiMGI0NzAzLCAweDIyMDIxNmI5LCAweDU1MDUyNjJmLCAweGM1YmEzYmJlLFxuICAweGIyYmQwYjI4LCAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LCAweGMyZDdmZmE3LCAweGI1ZDBjZjMxLFxuICAweDJjZDk5ZThiLCAweDViZGVhZTFkLCAweDliNjRjMmIwLCAweGVjNjNmMjI2LCAweDc1NmFhMzljLFxuICAweDAyNmQ5MzBhLCAweDljMDkwNmE5LCAweGViMGUzNjNmLCAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLFxuICAweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LCAweDkyZDI4ZTliLFxuICAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLCAweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLFxuICAweDY4ZGRiM2Y4LCAweDFmZGE4MzZlLCAweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLFxuICAweDE4Yjc0Nzc3LCAweDg4MDg1YWU2LCAweGZmMGY2YTcwLCAweDY2MDYzYmNhLCAweDExMDEwYjVjLFxuICAweDhmNjU5ZWZmLCAweGY4NjJhZTY5LCAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LCAweGEwMGFlMjc4LFxuICAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLCAweGE3NjcyNjYxLCAweGQwNjAxNmY3LFxuICAweDQ5Njk0NzRkLCAweDNlNmU3N2RiLCAweGFlZDE2YTRhLCAweGQ5ZDY1YWRjLCAweDQwZGYwYjY2LFxuICAweDM3ZDgzYmYwLCAweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LFxuICAweGJkYmRmMjFjLCAweGNhYmFjMjhhLCAweDUzYjM5MzMwLCAweDI0YjRhM2E2LCAweGJhZDAzNjA1LFxuICAweGNkZDcwNjkzLCAweDU0ZGU1NzI5LCAweDIzZDk2N2JmLCAweGIzNjY3YTJlLCAweGM0NjE0YWI4LFxuICAweDVkNjgxYjAyLCAweDJhNmYyYjk0LCAweGI0MGJiZTM3LCAweGMzMGM4ZWExLCAweDVhMDVkZjFiLFxuICAweDJkMDJlZjhkXG5dO1xuXG5pZiAodHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gIENSQ19UQUJMRSA9IG5ldyBJbnQzMkFycmF5KENSQ19UQUJMRSk7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZUJ1ZmZlcihpbnB1dCkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGlucHV0KSkge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIHZhciBoYXNOZXdCdWZmZXJBUEkgPVxuICAgICAgdHlwZW9mIEJ1ZmZlci5hbGxvYyA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICB0eXBlb2YgQnVmZmVyLmZyb20gPT09IFwiZnVuY3Rpb25cIjtcblxuICBpZiAodHlwZW9mIGlucHV0ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIGhhc05ld0J1ZmZlckFQSSA/IEJ1ZmZlci5hbGxvYyhpbnB1dCkgOiBuZXcgQnVmZmVyKGlucHV0KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gaGFzTmV3QnVmZmVyQVBJID8gQnVmZmVyLmZyb20oaW5wdXQpIDogbmV3IEJ1ZmZlcihpbnB1dCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW5wdXQgbXVzdCBiZSBidWZmZXIsIG51bWJlciwgb3Igc3RyaW5nLCByZWNlaXZlZCBcIiArXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBpbnB1dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVmZmVyaXplSW50KG51bSkge1xuICB2YXIgdG1wID0gZW5zdXJlQnVmZmVyKDQpO1xuICB0bXAud3JpdGVJbnQzMkJFKG51bSwgMCk7XG4gIHJldHVybiB0bXA7XG59XG5cbmZ1bmN0aW9uIF9jcmMzMihidWYsIHByZXZpb3VzKSB7XG4gIGJ1ZiA9IGVuc3VyZUJ1ZmZlcihidWYpO1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHByZXZpb3VzKSkge1xuICAgIHByZXZpb3VzID0gcHJldmlvdXMucmVhZFVJbnQzMkJFKDApO1xuICB9XG4gIHZhciBjcmMgPSB+fnByZXZpb3VzIF4gLTE7XG4gIGZvciAodmFyIG4gPSAwOyBuIDwgYnVmLmxlbmd0aDsgbisrKSB7XG4gICAgY3JjID0gQ1JDX1RBQkxFWyhjcmMgXiBidWZbbl0pICYgMHhmZl0gXiAoY3JjID4+PiA4KTtcbiAgfVxuICByZXR1cm4gKGNyYyBeIC0xKTtcbn1cblxuZnVuY3Rpb24gY3JjMzIoKSB7XG4gIHJldHVybiBidWZmZXJpemVJbnQoX2NyYzMyLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xufVxuY3JjMzIuc2lnbmVkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2NyYzMyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59O1xuY3JjMzIudW5zaWduZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfY3JjMzIuYXBwbHkobnVsbCwgYXJndW1lbnRzKSA+Pj4gMDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JjMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTWFza3MgYSBidWZmZXIgdXNpbmcgdGhlIGdpdmVuIG1hc2suXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IHNvdXJjZSBUaGUgYnVmZmVyIHRvIG1hc2tcbiAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIFRoZSBtYXNrIHRvIHVzZVxuICogQHBhcmFtIHtCdWZmZXJ9IG91dHB1dCBUaGUgYnVmZmVyIHdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgVGhlIG9mZnNldCBhdCB3aGljaCB0byBzdGFydCB3cml0aW5nXG4gKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbWFzay5cbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgbWFzayA9IChzb3VyY2UsIG1hc2ssIG91dHB1dCwgb2Zmc2V0LCBsZW5ndGgpID0+IHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFtvZmZzZXQgKyBpXSA9IHNvdXJjZVtpXSBeIG1hc2tbaSAmIDNdO1xuICB9XG59O1xuXG4vKipcbiAqIFVubWFza3MgYSBidWZmZXIgdXNpbmcgdGhlIGdpdmVuIG1hc2suXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIHVubWFza1xuICogQHBhcmFtIHtCdWZmZXJ9IG1hc2sgVGhlIG1hc2sgdG8gdXNlXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IHVubWFzayA9IChidWZmZXIsIG1hc2spID0+IHtcbiAgLy8gUmVxdWlyZWQgdW50aWwgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy85MDA2IGlzIHJlc29sdmVkLlxuICBjb25zdCBsZW5ndGggPSBidWZmZXIubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgYnVmZmVyW2ldIF49IG1hc2tbaSAmIDNdO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHsgbWFzaywgdW5tYXNrIH07XG4iLCIndXNlIHN0cmljdCc7XG5cbnRyeSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnbm9kZS1neXAtYnVpbGQnKShfX2Rpcm5hbWUpO1xufSBjYXRjaCAoZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFsbGJhY2snKTtcbn1cbiIsIi8qIE1JVCBsaWNlbnNlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1taXhlZC1vcGVyYXRvcnMgKi9cbmNvbnN0IGNzc0tleXdvcmRzID0gcmVxdWlyZSgnY29sb3ItbmFtZScpO1xuXG4vLyBOT1RFOiBjb252ZXJzaW9ucyBzaG91bGQgb25seSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlcyAoaS5lLiBhcnJheXMsIG9yXG4vLyAgICAgICB2YWx1ZXMgdGhhdCBnaXZlIGNvcnJlY3QgYHR5cGVvZmAgcmVzdWx0cykuXG4vLyAgICAgICBkbyBub3QgdXNlIGJveCB2YWx1ZXMgdHlwZXMgKGkuZS4gTnVtYmVyKCksIFN0cmluZygpLCBldGMuKVxuXG5jb25zdCByZXZlcnNlS2V5d29yZHMgPSB7fTtcbmZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNzc0tleXdvcmRzKSkge1xuXHRyZXZlcnNlS2V5d29yZHNbY3NzS2V5d29yZHNba2V5XV0gPSBrZXk7XG59XG5cbmNvbnN0IGNvbnZlcnQgPSB7XG5cdHJnYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdyZ2InfSxcblx0aHNsOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzbCd9LFxuXHRoc3Y6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHN2J30sXG5cdGh3Yjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdod2InfSxcblx0Y215azoge2NoYW5uZWxzOiA0LCBsYWJlbHM6ICdjbXlrJ30sXG5cdHh5ejoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICd4eXonfSxcblx0bGFiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xhYid9LFxuXHRsY2g6IHtjaGFubmVsczogMywgbGFiZWxzOiAnbGNoJ30sXG5cdGhleDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnaGV4J119LFxuXHRrZXl3b3JkOiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydrZXl3b3JkJ119LFxuXHRhbnNpMTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kxNiddfSxcblx0YW5zaTI1Njoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnYW5zaTI1NiddfSxcblx0aGNnOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydoJywgJ2MnLCAnZyddfSxcblx0YXBwbGU6IHtjaGFubmVsczogMywgbGFiZWxzOiBbJ3IxNicsICdnMTYnLCAnYjE2J119LFxuXHRncmF5OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydncmF5J119XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG5cbi8vIEhpZGUgLmNoYW5uZWxzIGFuZCAubGFiZWxzIHByb3BlcnRpZXNcbmZvciAoY29uc3QgbW9kZWwgb2YgT2JqZWN0LmtleXMoY29udmVydCkpIHtcblx0aWYgKCEoJ2NoYW5uZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHRpZiAoISgnbGFiZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbCBsYWJlbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHRpZiAoY29udmVydFttb2RlbF0ubGFiZWxzLmxlbmd0aCAhPT0gY29udmVydFttb2RlbF0uY2hhbm5lbHMpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ2NoYW5uZWwgYW5kIGxhYmVsIGNvdW50cyBtaXNtYXRjaDogJyArIG1vZGVsKTtcblx0fVxuXG5cdGNvbnN0IHtjaGFubmVscywgbGFiZWxzfSA9IGNvbnZlcnRbbW9kZWxdO1xuXHRkZWxldGUgY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cdGRlbGV0ZSBjb252ZXJ0W21vZGVsXS5sYWJlbHM7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W21vZGVsXSwgJ2NoYW5uZWxzJywge3ZhbHVlOiBjaGFubmVsc30pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGxhYmVsc30pO1xufVxuXG5jb252ZXJ0LnJnYi5oc2wgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cdGNvbnN0IG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuXHRjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcblx0Y29uc3QgZGVsdGEgPSBtYXggLSBtaW47XG5cdGxldCBoO1xuXHRsZXQgcztcblxuXHRpZiAobWF4ID09PSBtaW4pIHtcblx0XHRoID0gMDtcblx0fSBlbHNlIGlmIChyID09PSBtYXgpIHtcblx0XHRoID0gKGcgLSBiKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGcgPT09IG1heCkge1xuXHRcdGggPSAyICsgKGIgLSByKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGIgPT09IG1heCkge1xuXHRcdGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuXHR9XG5cblx0aCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGNvbnN0IGwgPSAobWluICsgbWF4KSAvIDI7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSBpZiAobCA8PSAwLjUpIHtcblx0XHRzID0gZGVsdGEgLyAobWF4ICsgbWluKTtcblx0fSBlbHNlIHtcblx0XHRzID0gZGVsdGEgLyAoMiAtIG1heCAtIG1pbik7XG5cdH1cblxuXHRyZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuaHN2ID0gZnVuY3Rpb24gKHJnYikge1xuXHRsZXQgcmRpZjtcblx0bGV0IGdkaWY7XG5cdGxldCBiZGlmO1xuXHRsZXQgaDtcblx0bGV0IHM7XG5cblx0Y29uc3QgciA9IHJnYlswXSAvIDI1NTtcblx0Y29uc3QgZyA9IHJnYlsxXSAvIDI1NTtcblx0Y29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcblx0Y29uc3QgdiA9IE1hdGgubWF4KHIsIGcsIGIpO1xuXHRjb25zdCBkaWZmID0gdiAtIE1hdGgubWluKHIsIGcsIGIpO1xuXHRjb25zdCBkaWZmYyA9IGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuICh2IC0gYykgLyA2IC8gZGlmZiArIDEgLyAyO1xuXHR9O1xuXG5cdGlmIChkaWZmID09PSAwKSB7XG5cdFx0aCA9IDA7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0cyA9IGRpZmYgLyB2O1xuXHRcdHJkaWYgPSBkaWZmYyhyKTtcblx0XHRnZGlmID0gZGlmZmMoZyk7XG5cdFx0YmRpZiA9IGRpZmZjKGIpO1xuXG5cdFx0aWYgKHIgPT09IHYpIHtcblx0XHRcdGggPSBiZGlmIC0gZ2RpZjtcblx0XHR9IGVsc2UgaWYgKGcgPT09IHYpIHtcblx0XHRcdGggPSAoMSAvIDMpICsgcmRpZiAtIGJkaWY7XG5cdFx0fSBlbHNlIGlmIChiID09PSB2KSB7XG5cdFx0XHRoID0gKDIgLyAzKSArIGdkaWYgLSByZGlmO1xuXHRcdH1cblxuXHRcdGlmIChoIDwgMCkge1xuXHRcdFx0aCArPSAxO1xuXHRcdH0gZWxzZSBpZiAoaCA+IDEpIHtcblx0XHRcdGggLT0gMTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gW1xuXHRcdGggKiAzNjAsXG5cdFx0cyAqIDEwMCxcblx0XHR2ICogMTAwXG5cdF07XG59O1xuXG5jb252ZXJ0LnJnYi5od2IgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF07XG5cdGNvbnN0IGcgPSByZ2JbMV07XG5cdGxldCBiID0gcmdiWzJdO1xuXHRjb25zdCBoID0gY29udmVydC5yZ2IuaHNsKHJnYilbMF07XG5cdGNvbnN0IHcgPSAxIC8gMjU1ICogTWF0aC5taW4ociwgTWF0aC5taW4oZywgYikpO1xuXG5cdGIgPSAxIC0gMSAvIDI1NSAqIE1hdGgubWF4KHIsIE1hdGgubWF4KGcsIGIpKTtcblxuXHRyZXR1cm4gW2gsIHcgKiAxMDAsIGIgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuY215ayA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgciA9IHJnYlswXSAvIDI1NTtcblx0Y29uc3QgZyA9IHJnYlsxXSAvIDI1NTtcblx0Y29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcblxuXHRjb25zdCBrID0gTWF0aC5taW4oMSAtIHIsIDEgLSBnLCAxIC0gYik7XG5cdGNvbnN0IGMgPSAoMSAtIHIgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0Y29uc3QgbSA9ICgxIC0gZyAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXHRjb25zdCB5ID0gKDEgLSBiIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cblx0cmV0dXJuIFtjICogMTAwLCBtICogMTAwLCB5ICogMTAwLCBrICogMTAwXTtcbn07XG5cbmZ1bmN0aW9uIGNvbXBhcmF0aXZlRGlzdGFuY2UoeCwgeSkge1xuXHQvKlxuXHRcdFNlZSBodHRwczovL2VuLm0ud2lraXBlZGlhLm9yZy93aWtpL0V1Y2xpZGVhbl9kaXN0YW5jZSNTcXVhcmVkX0V1Y2xpZGVhbl9kaXN0YW5jZVxuXHQqL1xuXHRyZXR1cm4gKFxuXHRcdCgoeFswXSAtIHlbMF0pICoqIDIpICtcblx0XHQoKHhbMV0gLSB5WzFdKSAqKiAyKSArXG5cdFx0KCh4WzJdIC0geVsyXSkgKiogMilcblx0KTtcbn1cblxuY29udmVydC5yZ2Iua2V5d29yZCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgcmV2ZXJzZWQgPSByZXZlcnNlS2V5d29yZHNbcmdiXTtcblx0aWYgKHJldmVyc2VkKSB7XG5cdFx0cmV0dXJuIHJldmVyc2VkO1xuXHR9XG5cblx0bGV0IGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcblx0bGV0IGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcblxuXHRmb3IgKGNvbnN0IGtleXdvcmQgb2YgT2JqZWN0LmtleXMoY3NzS2V5d29yZHMpKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcblxuXHRcdC8vIENvbXB1dGUgY29tcGFyYXRpdmUgZGlzdGFuY2Vcblx0XHRjb25zdCBkaXN0YW5jZSA9IGNvbXBhcmF0aXZlRGlzdGFuY2UocmdiLCB2YWx1ZSk7XG5cblx0XHQvLyBDaGVjayBpZiBpdHMgbGVzcywgaWYgc28gc2V0IGFzIGNsb3Nlc3Rcblx0XHRpZiAoZGlzdGFuY2UgPCBjdXJyZW50Q2xvc2VzdERpc3RhbmNlKSB7XG5cdFx0XHRjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7XG5cdFx0XHRjdXJyZW50Q2xvc2VzdEtleXdvcmQgPSBrZXl3b3JkO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG59O1xuXG5jb252ZXJ0LmtleXdvcmQucmdiID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcblx0cmV0dXJuIGNzc0tleXdvcmRzW2tleXdvcmRdO1xufTtcblxuY29udmVydC5yZ2IueHl6ID0gZnVuY3Rpb24gKHJnYikge1xuXHRsZXQgciA9IHJnYlswXSAvIDI1NTtcblx0bGV0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGxldCBiID0gcmdiWzJdIC8gMjU1O1xuXG5cdC8vIEFzc3VtZSBzUkdCXG5cdHIgPSByID4gMC4wNDA0NSA/ICgoKHIgKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40KSA6IChyIC8gMTIuOTIpO1xuXHRnID0gZyA+IDAuMDQwNDUgPyAoKChnICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNCkgOiAoZyAvIDEyLjkyKTtcblx0YiA9IGIgPiAwLjA0MDQ1ID8gKCgoYiArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQpIDogKGIgLyAxMi45Mik7XG5cblx0Y29uc3QgeCA9IChyICogMC40MTI0KSArIChnICogMC4zNTc2KSArIChiICogMC4xODA1KTtcblx0Y29uc3QgeSA9IChyICogMC4yMTI2KSArIChnICogMC43MTUyKSArIChiICogMC4wNzIyKTtcblx0Y29uc3QgeiA9IChyICogMC4wMTkzKSArIChnICogMC4xMTkyKSArIChiICogMC45NTA1KTtcblxuXHRyZXR1cm4gW3ggKiAxMDAsIHkgKiAxMDAsIHogKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IubGFiID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCB4eXogPSBjb252ZXJ0LnJnYi54eXoocmdiKTtcblx0bGV0IHggPSB4eXpbMF07XG5cdGxldCB5ID0geHl6WzFdO1xuXHRsZXQgeiA9IHh5elsyXTtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gKHggKiogKDEgLyAzKSkgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG5cdHkgPSB5ID4gMC4wMDg4NTYgPyAoeSAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/ICh6ICoqICgxIC8gMykpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGNvbnN0IGwgPSAoMTE2ICogeSkgLSAxNjtcblx0Y29uc3QgYSA9IDUwMCAqICh4IC0geSk7XG5cdGNvbnN0IGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmhzbC5yZ2IgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IGggPSBoc2xbMF0gLyAzNjA7XG5cdGNvbnN0IHMgPSBoc2xbMV0gLyAxMDA7XG5cdGNvbnN0IGwgPSBoc2xbMl0gLyAxMDA7XG5cdGxldCB0Mjtcblx0bGV0IHQzO1xuXHRsZXQgdmFsO1xuXG5cdGlmIChzID09PSAwKSB7XG5cdFx0dmFsID0gbCAqIDI1NTtcblx0XHRyZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xuXHR9XG5cblx0aWYgKGwgPCAwLjUpIHtcblx0XHR0MiA9IGwgKiAoMSArIHMpO1xuXHR9IGVsc2Uge1xuXHRcdHQyID0gbCArIHMgLSBsICogcztcblx0fVxuXG5cdGNvbnN0IHQxID0gMiAqIGwgLSB0MjtcblxuXHRjb25zdCByZ2IgPSBbMCwgMCwgMF07XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0dDMgPSBoICsgMSAvIDMgKiAtKGkgLSAxKTtcblx0XHRpZiAodDMgPCAwKSB7XG5cdFx0XHR0MysrO1xuXHRcdH1cblxuXHRcdGlmICh0MyA+IDEpIHtcblx0XHRcdHQzLS07XG5cdFx0fVxuXG5cdFx0aWYgKDYgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQxICsgKHQyIC0gdDEpICogNiAqIHQzO1xuXHRcdH0gZWxzZSBpZiAoMiAqIHQzIDwgMSkge1xuXHRcdFx0dmFsID0gdDI7XG5cdFx0fSBlbHNlIGlmICgzICogdDMgPCAyKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbCA9IHQxO1xuXHRcdH1cblxuXHRcdHJnYltpXSA9IHZhbCAqIDI1NTtcblx0fVxuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jb252ZXJ0LmhzbC5oc3YgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IGggPSBoc2xbMF07XG5cdGxldCBzID0gaHNsWzFdIC8gMTAwO1xuXHRsZXQgbCA9IGhzbFsyXSAvIDEwMDtcblx0bGV0IHNtaW4gPSBzO1xuXHRjb25zdCBsbWluID0gTWF0aC5tYXgobCwgMC4wMSk7XG5cblx0bCAqPSAyO1xuXHRzICo9IChsIDw9IDEpID8gbCA6IDIgLSBsO1xuXHRzbWluICo9IGxtaW4gPD0gMSA/IGxtaW4gOiAyIC0gbG1pbjtcblx0Y29uc3QgdiA9IChsICsgcykgLyAyO1xuXHRjb25zdCBzdiA9IGwgPT09IDAgPyAoMiAqIHNtaW4pIC8gKGxtaW4gKyBzbWluKSA6ICgyICogcykgLyAobCArIHMpO1xuXG5cdHJldHVybiBbaCwgc3YgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oc3YucmdiID0gZnVuY3Rpb24gKGhzdikge1xuXHRjb25zdCBoID0gaHN2WzBdIC8gNjA7XG5cdGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG5cdGxldCB2ID0gaHN2WzJdIC8gMTAwO1xuXHRjb25zdCBoaSA9IE1hdGguZmxvb3IoaCkgJSA2O1xuXG5cdGNvbnN0IGYgPSBoIC0gTWF0aC5mbG9vcihoKTtcblx0Y29uc3QgcCA9IDI1NSAqIHYgKiAoMSAtIHMpO1xuXHRjb25zdCBxID0gMjU1ICogdiAqICgxIC0gKHMgKiBmKSk7XG5cdGNvbnN0IHQgPSAyNTUgKiB2ICogKDEgLSAocyAqICgxIC0gZikpKTtcblx0diAqPSAyNTU7XG5cblx0c3dpdGNoIChoaSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHJldHVybiBbdiwgdCwgcF07XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cmV0dXJuIFtxLCB2LCBwXTtcblx0XHRjYXNlIDI6XG5cdFx0XHRyZXR1cm4gW3AsIHYsIHRdO1xuXHRcdGNhc2UgMzpcblx0XHRcdHJldHVybiBbcCwgcSwgdl07XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cmV0dXJuIFt0LCBwLCB2XTtcblx0XHRjYXNlIDU6XG5cdFx0XHRyZXR1cm4gW3YsIHAsIHFdO1xuXHR9XG59O1xuXG5jb252ZXJ0Lmhzdi5oc2wgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdGNvbnN0IGggPSBoc3ZbMF07XG5cdGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG5cdGNvbnN0IHYgPSBoc3ZbMl0gLyAxMDA7XG5cdGNvbnN0IHZtaW4gPSBNYXRoLm1heCh2LCAwLjAxKTtcblx0bGV0IHNsO1xuXHRsZXQgbDtcblxuXHRsID0gKDIgLSBzKSAqIHY7XG5cdGNvbnN0IGxtaW4gPSAoMiAtIHMpICogdm1pbjtcblx0c2wgPSBzICogdm1pbjtcblx0c2wgLz0gKGxtaW4gPD0gMSkgPyBsbWluIDogMiAtIGxtaW47XG5cdHNsID0gc2wgfHwgMDtcblx0bCAvPSAyO1xuXG5cdHJldHVybiBbaCwgc2wgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLWNvbG9yLyNod2ItdG8tcmdiXG5jb252ZXJ0Lmh3Yi5yZ2IgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdGNvbnN0IGggPSBod2JbMF0gLyAzNjA7XG5cdGxldCB3aCA9IGh3YlsxXSAvIDEwMDtcblx0bGV0IGJsID0gaHdiWzJdIC8gMTAwO1xuXHRjb25zdCByYXRpbyA9IHdoICsgYmw7XG5cdGxldCBmO1xuXG5cdC8vIFdoICsgYmwgY2FudCBiZSA+IDFcblx0aWYgKHJhdGlvID4gMSkge1xuXHRcdHdoIC89IHJhdGlvO1xuXHRcdGJsIC89IHJhdGlvO1xuXHR9XG5cblx0Y29uc3QgaSA9IE1hdGguZmxvb3IoNiAqIGgpO1xuXHRjb25zdCB2ID0gMSAtIGJsO1xuXHRmID0gNiAqIGggLSBpO1xuXG5cdGlmICgoaSAmIDB4MDEpICE9PSAwKSB7XG5cdFx0ZiA9IDEgLSBmO1xuXHR9XG5cblx0Y29uc3QgbiA9IHdoICsgZiAqICh2IC0gd2gpOyAvLyBMaW5lYXIgaW50ZXJwb2xhdGlvblxuXG5cdGxldCByO1xuXHRsZXQgZztcblx0bGV0IGI7XG5cdC8qIGVzbGludC1kaXNhYmxlIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lLG5vLW11bHRpLXNwYWNlcyAqL1xuXHRzd2l0Y2ggKGkpIHtcblx0XHRkZWZhdWx0OlxuXHRcdGNhc2UgNjpcblx0XHRjYXNlIDA6IHIgPSB2OyAgZyA9IG47ICBiID0gd2g7IGJyZWFrO1xuXHRcdGNhc2UgMTogciA9IG47ICBnID0gdjsgIGIgPSB3aDsgYnJlYWs7XG5cdFx0Y2FzZSAyOiByID0gd2g7IGcgPSB2OyAgYiA9IG47IGJyZWFrO1xuXHRcdGNhc2UgMzogciA9IHdoOyBnID0gbjsgIGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDQ6IHIgPSBuOyAgZyA9IHdoOyBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA1OiByID0gdjsgIGcgPSB3aDsgYiA9IG47IGJyZWFrO1xuXHR9XG5cdC8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUsbm8tbXVsdGktc3BhY2VzICovXG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQuY215ay5yZ2IgPSBmdW5jdGlvbiAoY215aykge1xuXHRjb25zdCBjID0gY215a1swXSAvIDEwMDtcblx0Y29uc3QgbSA9IGNteWtbMV0gLyAxMDA7XG5cdGNvbnN0IHkgPSBjbXlrWzJdIC8gMTAwO1xuXHRjb25zdCBrID0gY215a1szXSAvIDEwMDtcblxuXHRjb25zdCByID0gMSAtIE1hdGgubWluKDEsIGMgKiAoMSAtIGspICsgayk7XG5cdGNvbnN0IGcgPSAxIC0gTWF0aC5taW4oMSwgbSAqICgxIC0gaykgKyBrKTtcblx0Y29uc3QgYiA9IDEgLSBNYXRoLm1pbigxLCB5ICogKDEgLSBrKSArIGspO1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0Lnh5ei5yZ2IgPSBmdW5jdGlvbiAoeHl6KSB7XG5cdGNvbnN0IHggPSB4eXpbMF0gLyAxMDA7XG5cdGNvbnN0IHkgPSB4eXpbMV0gLyAxMDA7XG5cdGNvbnN0IHogPSB4eXpbMl0gLyAxMDA7XG5cdGxldCByO1xuXHRsZXQgZztcblx0bGV0IGI7XG5cblx0ciA9ICh4ICogMy4yNDA2KSArICh5ICogLTEuNTM3MikgKyAoeiAqIC0wLjQ5ODYpO1xuXHRnID0gKHggKiAtMC45Njg5KSArICh5ICogMS44NzU4KSArICh6ICogMC4wNDE1KTtcblx0YiA9ICh4ICogMC4wNTU3KSArICh5ICogLTAuMjA0MCkgKyAoeiAqIDEuMDU3MCk7XG5cblx0Ly8gQXNzdW1lIHNSR0Jcblx0ciA9IHIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAociAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiByICogMTIuOTI7XG5cblx0ZyA9IGcgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAoZyAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiBnICogMTIuOTI7XG5cblx0YiA9IGIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAoYiAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiBiICogMTIuOTI7XG5cblx0ciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcblx0ZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcblx0YiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC54eXoubGFiID0gZnVuY3Rpb24gKHh5eikge1xuXHRsZXQgeCA9IHh5elswXTtcblx0bGV0IHkgPSB4eXpbMV07XG5cdGxldCB6ID0geHl6WzJdO1xuXG5cdHggLz0gOTUuMDQ3O1xuXHR5IC89IDEwMDtcblx0eiAvPSAxMDguODgzO1xuXG5cdHggPSB4ID4gMC4wMDg4NTYgPyAoeCAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcblx0eSA9IHkgPiAwLjAwODg1NiA/ICh5ICoqICgxIC8gMykpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuXHR6ID0geiA+IDAuMDA4ODU2ID8gKHogKiogKDEgLyAzKSkgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cblx0Y29uc3QgbCA9ICgxMTYgKiB5KSAtIDE2O1xuXHRjb25zdCBhID0gNTAwICogKHggLSB5KTtcblx0Y29uc3QgYiA9IDIwMCAqICh5IC0geik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQubGFiLnh5eiA9IGZ1bmN0aW9uIChsYWIpIHtcblx0Y29uc3QgbCA9IGxhYlswXTtcblx0Y29uc3QgYSA9IGxhYlsxXTtcblx0Y29uc3QgYiA9IGxhYlsyXTtcblx0bGV0IHg7XG5cdGxldCB5O1xuXHRsZXQgejtcblxuXHR5ID0gKGwgKyAxNikgLyAxMTY7XG5cdHggPSBhIC8gNTAwICsgeTtcblx0eiA9IHkgLSBiIC8gMjAwO1xuXG5cdGNvbnN0IHkyID0geSAqKiAzO1xuXHRjb25zdCB4MiA9IHggKiogMztcblx0Y29uc3QgejIgPSB6ICoqIDM7XG5cdHkgPSB5MiA+IDAuMDA4ODU2ID8geTIgOiAoeSAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXHR4ID0geDIgPiAwLjAwODg1NiA/IHgyIDogKHggLSAxNiAvIDExNikgLyA3Ljc4Nztcblx0eiA9IHoyID4gMC4wMDg4NTYgPyB6MiA6ICh6IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cblx0eCAqPSA5NS4wNDc7XG5cdHkgKj0gMTAwO1xuXHR6ICo9IDEwOC44ODM7XG5cblx0cmV0dXJuIFt4LCB5LCB6XTtcbn07XG5cbmNvbnZlcnQubGFiLmxjaCA9IGZ1bmN0aW9uIChsYWIpIHtcblx0Y29uc3QgbCA9IGxhYlswXTtcblx0Y29uc3QgYSA9IGxhYlsxXTtcblx0Y29uc3QgYiA9IGxhYlsyXTtcblx0bGV0IGg7XG5cblx0Y29uc3QgaHIgPSBNYXRoLmF0YW4yKGIsIGEpO1xuXHRoID0gaHIgKiAzNjAgLyAyIC8gTWF0aC5QSTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGNvbnN0IGMgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG5cblx0cmV0dXJuIFtsLCBjLCBoXTtcbn07XG5cbmNvbnZlcnQubGNoLmxhYiA9IGZ1bmN0aW9uIChsY2gpIHtcblx0Y29uc3QgbCA9IGxjaFswXTtcblx0Y29uc3QgYyA9IGxjaFsxXTtcblx0Y29uc3QgaCA9IGxjaFsyXTtcblxuXHRjb25zdCBociA9IGggLyAzNjAgKiAyICogTWF0aC5QSTtcblx0Y29uc3QgYSA9IGMgKiBNYXRoLmNvcyhocik7XG5cdGNvbnN0IGIgPSBjICogTWF0aC5zaW4oaHIpO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncywgc2F0dXJhdGlvbiA9IG51bGwpIHtcblx0Y29uc3QgW3IsIGcsIGJdID0gYXJncztcblx0bGV0IHZhbHVlID0gc2F0dXJhdGlvbiA9PT0gbnVsbCA/IGNvbnZlcnQucmdiLmhzdihhcmdzKVsyXSA6IHNhdHVyYXRpb247IC8vIEhzdiAtPiBhbnNpMTYgb3B0aW1pemF0aW9uXG5cblx0dmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gNTApO1xuXG5cdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdHJldHVybiAzMDtcblx0fVxuXG5cdGxldCBhbnNpID0gMzBcblx0XHQrICgoTWF0aC5yb3VuZChiIC8gMjU1KSA8PCAyKVxuXHRcdHwgKE1hdGgucm91bmQoZyAvIDI1NSkgPDwgMSlcblx0XHR8IE1hdGgucm91bmQociAvIDI1NSkpO1xuXG5cdGlmICh2YWx1ZSA9PT0gMikge1xuXHRcdGFuc2kgKz0gNjA7XG5cdH1cblxuXHRyZXR1cm4gYW5zaTtcbn07XG5cbmNvbnZlcnQuaHN2LmFuc2kxNiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIE9wdGltaXphdGlvbiBoZXJlOyB3ZSBhbHJlYWR5IGtub3cgdGhlIHZhbHVlIGFuZCBkb24ndCBuZWVkIHRvIGdldFxuXHQvLyBpdCBjb252ZXJ0ZWQgZm9yIHVzLlxuXHRyZXR1cm4gY29udmVydC5yZ2IuYW5zaTE2KGNvbnZlcnQuaHN2LnJnYihhcmdzKSwgYXJnc1syXSk7XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMjU2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Y29uc3QgciA9IGFyZ3NbMF07XG5cdGNvbnN0IGcgPSBhcmdzWzFdO1xuXHRjb25zdCBiID0gYXJnc1syXTtcblxuXHQvLyBXZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0aWYgKHIgPT09IGcgJiYgZyA9PT0gYikge1xuXHRcdGlmIChyIDwgOCkge1xuXHRcdFx0cmV0dXJuIDE2O1xuXHRcdH1cblxuXHRcdGlmIChyID4gMjQ4KSB7XG5cdFx0XHRyZXR1cm4gMjMxO1xuXHRcdH1cblxuXHRcdHJldHVybiBNYXRoLnJvdW5kKCgociAtIDgpIC8gMjQ3KSAqIDI0KSArIDIzMjtcblx0fVxuXG5cdGNvbnN0IGFuc2kgPSAxNlxuXHRcdCsgKDM2ICogTWF0aC5yb3VuZChyIC8gMjU1ICogNSkpXG5cdFx0KyAoNiAqIE1hdGgucm91bmQoZyAvIDI1NSAqIDUpKVxuXHRcdCsgTWF0aC5yb3VuZChiIC8gMjU1ICogNSk7XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0LmFuc2kxNi5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHRsZXQgY29sb3IgPSBhcmdzICUgMTA7XG5cblx0Ly8gSGFuZGxlIGdyZXlzY2FsZVxuXHRpZiAoY29sb3IgPT09IDAgfHwgY29sb3IgPT09IDcpIHtcblx0XHRpZiAoYXJncyA+IDUwKSB7XG5cdFx0XHRjb2xvciArPSAzLjU7XG5cdFx0fVxuXG5cdFx0Y29sb3IgPSBjb2xvciAvIDEwLjUgKiAyNTU7XG5cblx0XHRyZXR1cm4gW2NvbG9yLCBjb2xvciwgY29sb3JdO1xuXHR9XG5cblx0Y29uc3QgbXVsdCA9ICh+fihhcmdzID4gNTApICsgMSkgKiAwLjU7XG5cdGNvbnN0IHIgPSAoKGNvbG9yICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0Y29uc3QgZyA9ICgoKGNvbG9yID4+IDEpICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0Y29uc3QgYiA9ICgoKGNvbG9yID4+IDIpICYgMSkgKiBtdWx0KSAqIDI1NTtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5hbnNpMjU2LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIEhhbmRsZSBncmV5c2NhbGVcblx0aWYgKGFyZ3MgPj0gMjMyKSB7XG5cdFx0Y29uc3QgYyA9IChhcmdzIC0gMjMyKSAqIDEwICsgODtcblx0XHRyZXR1cm4gW2MsIGMsIGNdO1xuXHR9XG5cblx0YXJncyAtPSAxNjtcblxuXHRsZXQgcmVtO1xuXHRjb25zdCByID0gTWF0aC5mbG9vcihhcmdzIC8gMzYpIC8gNSAqIDI1NTtcblx0Y29uc3QgZyA9IE1hdGguZmxvb3IoKHJlbSA9IGFyZ3MgJSAzNikgLyA2KSAvIDUgKiAyNTU7XG5cdGNvbnN0IGIgPSAocmVtICUgNikgLyA1ICogMjU1O1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oZXggPSBmdW5jdGlvbiAoYXJncykge1xuXHRjb25zdCBpbnRlZ2VyID0gKChNYXRoLnJvdW5kKGFyZ3NbMF0pICYgMHhGRikgPDwgMTYpXG5cdFx0KyAoKE1hdGgucm91bmQoYXJnc1sxXSkgJiAweEZGKSA8PCA4KVxuXHRcdCsgKE1hdGgucm91bmQoYXJnc1syXSkgJiAweEZGKTtcblxuXHRjb25zdCBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5oZXgucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Y29uc3QgbWF0Y2ggPSBhcmdzLnRvU3RyaW5nKDE2KS5tYXRjaCgvW2EtZjAtOV17Nn18W2EtZjAtOV17M30vaSk7XG5cdGlmICghbWF0Y2gpIHtcblx0XHRyZXR1cm4gWzAsIDAsIDBdO1xuXHR9XG5cblx0bGV0IGNvbG9yU3RyaW5nID0gbWF0Y2hbMF07XG5cblx0aWYgKG1hdGNoWzBdLmxlbmd0aCA9PT0gMykge1xuXHRcdGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcuc3BsaXQoJycpLm1hcChjaGFyID0+IHtcblx0XHRcdHJldHVybiBjaGFyICsgY2hhcjtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdGNvbnN0IGludGVnZXIgPSBwYXJzZUludChjb2xvclN0cmluZywgMTYpO1xuXHRjb25zdCByID0gKGludGVnZXIgPj4gMTYpICYgMHhGRjtcblx0Y29uc3QgZyA9IChpbnRlZ2VyID4+IDgpICYgMHhGRjtcblx0Y29uc3QgYiA9IGludGVnZXIgJiAweEZGO1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oY2cgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cdGNvbnN0IG1heCA9IE1hdGgubWF4KE1hdGgubWF4KHIsIGcpLCBiKTtcblx0Y29uc3QgbWluID0gTWF0aC5taW4oTWF0aC5taW4ociwgZyksIGIpO1xuXHRjb25zdCBjaHJvbWEgPSAobWF4IC0gbWluKTtcblx0bGV0IGdyYXlzY2FsZTtcblx0bGV0IGh1ZTtcblxuXHRpZiAoY2hyb21hIDwgMSkge1xuXHRcdGdyYXlzY2FsZSA9IG1pbiAvICgxIC0gY2hyb21hKTtcblx0fSBlbHNlIHtcblx0XHRncmF5c2NhbGUgPSAwO1xuXHR9XG5cblx0aWYgKGNocm9tYSA8PSAwKSB7XG5cdFx0aHVlID0gMDtcblx0fSBlbHNlXG5cdGlmIChtYXggPT09IHIpIHtcblx0XHRodWUgPSAoKGcgLSBiKSAvIGNocm9tYSkgJSA2O1xuXHR9IGVsc2Vcblx0aWYgKG1heCA9PT0gZykge1xuXHRcdGh1ZSA9IDIgKyAoYiAtIHIpIC8gY2hyb21hO1xuXHR9IGVsc2Uge1xuXHRcdGh1ZSA9IDQgKyAociAtIGcpIC8gY2hyb21hO1xuXHR9XG5cblx0aHVlIC89IDY7XG5cdGh1ZSAlPSAxO1xuXG5cdHJldHVybiBbaHVlICogMzYwLCBjaHJvbWEgKiAxMDAsIGdyYXlzY2FsZSAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhzbC5oY2cgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IHMgPSBoc2xbMV0gLyAxMDA7XG5cdGNvbnN0IGwgPSBoc2xbMl0gLyAxMDA7XG5cblx0Y29uc3QgYyA9IGwgPCAwLjUgPyAoMi4wICogcyAqIGwpIDogKDIuMCAqIHMgKiAoMS4wIC0gbCkpO1xuXG5cdGxldCBmID0gMDtcblx0aWYgKGMgPCAxLjApIHtcblx0XHRmID0gKGwgLSAwLjUgKiBjKSAvICgxLjAgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHNsWzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHN2LmhjZyA9IGZ1bmN0aW9uIChoc3YpIHtcblx0Y29uc3QgcyA9IGhzdlsxXSAvIDEwMDtcblx0Y29uc3QgdiA9IGhzdlsyXSAvIDEwMDtcblxuXHRjb25zdCBjID0gcyAqIHY7XG5cdGxldCBmID0gMDtcblxuXHRpZiAoYyA8IDEuMCkge1xuXHRcdGYgPSAodiAtIGMpIC8gKDEgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHN2WzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLnJnYiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0Y29uc3QgaCA9IGhjZ1swXSAvIDM2MDtcblx0Y29uc3QgYyA9IGhjZ1sxXSAvIDEwMDtcblx0Y29uc3QgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHRpZiAoYyA9PT0gMC4wKSB7XG5cdFx0cmV0dXJuIFtnICogMjU1LCBnICogMjU1LCBnICogMjU1XTtcblx0fVxuXG5cdGNvbnN0IHB1cmUgPSBbMCwgMCwgMF07XG5cdGNvbnN0IGhpID0gKGggJSAxKSAqIDY7XG5cdGNvbnN0IHYgPSBoaSAlIDE7XG5cdGNvbnN0IHcgPSAxIC0gdjtcblx0bGV0IG1nID0gMDtcblxuXHQvKiBlc2xpbnQtZGlzYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXHRzd2l0Y2ggKE1hdGguZmxvb3IoaGkpKSB7XG5cdFx0Y2FzZSAwOlxuXHRcdFx0cHVyZVswXSA9IDE7IHB1cmVbMV0gPSB2OyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cHVyZVswXSA9IHc7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSB3OyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cHVyZVswXSA9IHY7IHB1cmVbMV0gPSAwOyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IHc7XG5cdH1cblx0LyogZXNsaW50LWVuYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXG5cdG1nID0gKDEuMCAtIGMpICogZztcblxuXHRyZXR1cm4gW1xuXHRcdChjICogcHVyZVswXSArIG1nKSAqIDI1NSxcblx0XHQoYyAqIHB1cmVbMV0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzJdICsgbWcpICogMjU1XG5cdF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc3YgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0Y29uc3QgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHRsZXQgZiA9IDA7XG5cblx0aWYgKHYgPiAwLjApIHtcblx0XHRmID0gYyAvIHY7XG5cdH1cblxuXHRyZXR1cm4gW2hjZ1swXSwgZiAqIDEwMCwgdiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc2wgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0Y29uc3QgbCA9IGcgKiAoMS4wIC0gYykgKyAwLjUgKiBjO1xuXHRsZXQgcyA9IDA7XG5cblx0aWYgKGwgPiAwLjAgJiYgbCA8IDAuNSkge1xuXHRcdHMgPSBjIC8gKDIgKiBsKTtcblx0fSBlbHNlXG5cdGlmIChsID49IDAuNSAmJiBsIDwgMS4wKSB7XG5cdFx0cyA9IGMgLyAoMiAqICgxIC0gbCkpO1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHdiID0gZnVuY3Rpb24gKGhjZykge1xuXHRjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuXHRjb25zdCBnID0gaGNnWzJdIC8gMTAwO1xuXHRjb25zdCB2ID0gYyArIGcgKiAoMS4wIC0gYyk7XG5cdHJldHVybiBbaGNnWzBdLCAodiAtIGMpICogMTAwLCAoMSAtIHYpICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHdiLmhjZyA9IGZ1bmN0aW9uIChod2IpIHtcblx0Y29uc3QgdyA9IGh3YlsxXSAvIDEwMDtcblx0Y29uc3QgYiA9IGh3YlsyXSAvIDEwMDtcblx0Y29uc3QgdiA9IDEgLSBiO1xuXHRjb25zdCBjID0gdiAtIHc7XG5cdGxldCBnID0gMDtcblxuXHRpZiAoYyA8IDEpIHtcblx0XHRnID0gKHYgLSBjKSAvICgxIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2h3YlswXSwgYyAqIDEwMCwgZyAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmFwcGxlLnJnYiA9IGZ1bmN0aW9uIChhcHBsZSkge1xuXHRyZXR1cm4gWyhhcHBsZVswXSAvIDY1NTM1KSAqIDI1NSwgKGFwcGxlWzFdIC8gNjU1MzUpICogMjU1LCAoYXBwbGVbMl0gLyA2NTUzNSkgKiAyNTVdO1xufTtcblxuY29udmVydC5yZ2IuYXBwbGUgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHJldHVybiBbKHJnYlswXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsxXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsyXSAvIDI1NSkgKiA2NTUzNV07XG59O1xuXG5jb252ZXJ0LmdyYXkucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFthcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1XTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oc2wgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gWzAsIDAsIGFyZ3NbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmhzdiA9IGNvbnZlcnQuZ3JheS5oc2w7XG5cbmNvbnZlcnQuZ3JheS5od2IgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gWzAsIDEwMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkuY215ayA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbMCwgMCwgMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkubGFiID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFtncmF5WzBdLCAwLCAwXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oZXggPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRjb25zdCB2YWwgPSBNYXRoLnJvdW5kKGdyYXlbMF0gLyAxMDAgKiAyNTUpICYgMHhGRjtcblx0Y29uc3QgaW50ZWdlciA9ICh2YWwgPDwgMTYpICsgKHZhbCA8PCA4KSArIHZhbDtcblxuXHRjb25zdCBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5yZ2IuZ3JheSA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgdmFsID0gKHJnYlswXSArIHJnYlsxXSArIHJnYlsyXSkgLyAzO1xuXHRyZXR1cm4gW3ZhbCAvIDI1NSAqIDEwMF07XG59O1xuIiwiY29uc3QgY29udmVyc2lvbnMgPSByZXF1aXJlKCcuL2NvbnZlcnNpb25zJyk7XG5jb25zdCByb3V0ZSA9IHJlcXVpcmUoJy4vcm91dGUnKTtcblxuY29uc3QgY29udmVydCA9IHt9O1xuXG5jb25zdCBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cbmZ1bmN0aW9uIHdyYXBSYXcoZm4pIHtcblx0Y29uc3Qgd3JhcHBlZEZuID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcblx0XHRjb25zdCBhcmcwID0gYXJnc1swXTtcblx0XHRpZiAoYXJnMCA9PT0gdW5kZWZpbmVkIHx8IGFyZzAgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmcwO1xuXHRcdH1cblxuXHRcdGlmIChhcmcwLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBhcmcwO1xuXHRcdH1cblxuXHRcdHJldHVybiBmbihhcmdzKTtcblx0fTtcblxuXHQvLyBQcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblx0aWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuXHRcdHdyYXBwZWRGbi5jb252ZXJzaW9uID0gZm4uY29udmVyc2lvbjtcblx0fVxuXG5cdHJldHVybiB3cmFwcGVkRm47XG59XG5cbmZ1bmN0aW9uIHdyYXBSb3VuZGVkKGZuKSB7XG5cdGNvbnN0IHdyYXBwZWRGbiA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG5cdFx0Y29uc3QgYXJnMCA9IGFyZ3NbMF07XG5cblx0XHRpZiAoYXJnMCA9PT0gdW5kZWZpbmVkIHx8IGFyZzAgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmcwO1xuXHRcdH1cblxuXHRcdGlmIChhcmcwLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBhcmcwO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdCA9IGZuKGFyZ3MpO1xuXG5cdFx0Ly8gV2UncmUgYXNzdW1pbmcgdGhlIHJlc3VsdCBpcyBhbiBhcnJheSBoZXJlLlxuXHRcdC8vIHNlZSBub3RpY2UgaW4gY29udmVyc2lvbnMuanM7IGRvbid0IHVzZSBib3ggdHlwZXNcblx0XHQvLyBpbiBjb252ZXJzaW9uIGZ1bmN0aW9ucy5cblx0XHRpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAobGV0IGxlbiA9IHJlc3VsdC5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gTWF0aC5yb3VuZChyZXN1bHRbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Ly8gUHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5tb2RlbHMuZm9yRWFjaChmcm9tTW9kZWwgPT4ge1xuXHRjb252ZXJ0W2Zyb21Nb2RlbF0gPSB7fTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFtmcm9tTW9kZWxdLCAnY2hhbm5lbHMnLCB7dmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0uY2hhbm5lbHN9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbZnJvbU1vZGVsXSwgJ2xhYmVscycsIHt2YWx1ZTogY29udmVyc2lvbnNbZnJvbU1vZGVsXS5sYWJlbHN9KTtcblxuXHRjb25zdCByb3V0ZXMgPSByb3V0ZShmcm9tTW9kZWwpO1xuXHRjb25zdCByb3V0ZU1vZGVscyA9IE9iamVjdC5rZXlzKHJvdXRlcyk7XG5cblx0cm91dGVNb2RlbHMuZm9yRWFjaCh0b01vZGVsID0+IHtcblx0XHRjb25zdCBmbiA9IHJvdXRlc1t0b01vZGVsXTtcblxuXHRcdGNvbnZlcnRbZnJvbU1vZGVsXVt0b01vZGVsXSA9IHdyYXBSb3VuZGVkKGZuKTtcblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0ucmF3ID0gd3JhcFJhdyhmbik7XG5cdH0pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcbiIsImNvbnN0IGNvbnZlcnNpb25zID0gcmVxdWlyZSgnLi9jb252ZXJzaW9ucycpO1xuXG4vKlxuXHRUaGlzIGZ1bmN0aW9uIHJvdXRlcyBhIG1vZGVsIHRvIGFsbCBvdGhlciBtb2RlbHMuXG5cblx0YWxsIGZ1bmN0aW9ucyB0aGF0IGFyZSByb3V0ZWQgaGF2ZSBhIHByb3BlcnR5IGAuY29udmVyc2lvbmAgYXR0YWNoZWRcblx0dG8gdGhlIHJldHVybmVkIHN5bnRoZXRpYyBmdW5jdGlvbi4gVGhpcyBwcm9wZXJ0eSBpcyBhbiBhcnJheVxuXHRvZiBzdHJpbmdzLCBlYWNoIHdpdGggdGhlIHN0ZXBzIGluIGJldHdlZW4gdGhlICdmcm9tJyBhbmQgJ3RvJ1xuXHRjb2xvciBtb2RlbHMgKGluY2x1c2l2ZSkuXG5cblx0Y29udmVyc2lvbnMgdGhhdCBhcmUgbm90IHBvc3NpYmxlIHNpbXBseSBhcmUgbm90IGluY2x1ZGVkLlxuKi9cblxuZnVuY3Rpb24gYnVpbGRHcmFwaCgpIHtcblx0Y29uc3QgZ3JhcGggPSB7fTtcblx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL29iamVjdC1rZXlzLXZzLWZvci1pbi13aXRoLWNsb3N1cmUvM1xuXHRjb25zdCBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cblx0Zm9yIChsZXQgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdGdyYXBoW21vZGVsc1tpXV0gPSB7XG5cdFx0XHQvLyBodHRwOi8vanNwZXJmLmNvbS8xLXZzLWluZmluaXR5XG5cdFx0XHQvLyBtaWNyby1vcHQsIGJ1dCB0aGlzIGlzIHNpbXBsZS5cblx0XHRcdGRpc3RhbmNlOiAtMSxcblx0XHRcdHBhcmVudDogbnVsbFxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JyZWFkdGgtZmlyc3Rfc2VhcmNoXG5mdW5jdGlvbiBkZXJpdmVCRlMoZnJvbU1vZGVsKSB7XG5cdGNvbnN0IGdyYXBoID0gYnVpbGRHcmFwaCgpO1xuXHRjb25zdCBxdWV1ZSA9IFtmcm9tTW9kZWxdOyAvLyBVbnNoaWZ0IC0+IHF1ZXVlIC0+IHBvcFxuXG5cdGdyYXBoW2Zyb21Nb2RlbF0uZGlzdGFuY2UgPSAwO1xuXG5cdHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcblx0XHRjb25zdCBjdXJyZW50ID0gcXVldWUucG9wKCk7XG5cdFx0Y29uc3QgYWRqYWNlbnRzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnNbY3VycmVudF0pO1xuXG5cdFx0Zm9yIChsZXQgbGVuID0gYWRqYWNlbnRzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0Y29uc3QgYWRqYWNlbnQgPSBhZGphY2VudHNbaV07XG5cdFx0XHRjb25zdCBub2RlID0gZ3JhcGhbYWRqYWNlbnRdO1xuXG5cdFx0XHRpZiAobm9kZS5kaXN0YW5jZSA9PT0gLTEpIHtcblx0XHRcdFx0bm9kZS5kaXN0YW5jZSA9IGdyYXBoW2N1cnJlbnRdLmRpc3RhbmNlICsgMTtcblx0XHRcdFx0bm9kZS5wYXJlbnQgPSBjdXJyZW50O1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KGFkamFjZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZ3JhcGg7XG59XG5cbmZ1bmN0aW9uIGxpbmsoZnJvbSwgdG8pIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChhcmdzKSB7XG5cdFx0cmV0dXJuIHRvKGZyb20oYXJncykpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCkge1xuXHRjb25zdCBwYXRoID0gW2dyYXBoW3RvTW9kZWxdLnBhcmVudCwgdG9Nb2RlbF07XG5cdGxldCBmbiA9IGNvbnZlcnNpb25zW2dyYXBoW3RvTW9kZWxdLnBhcmVudF1bdG9Nb2RlbF07XG5cblx0bGV0IGN1ciA9IGdyYXBoW3RvTW9kZWxdLnBhcmVudDtcblx0d2hpbGUgKGdyYXBoW2N1cl0ucGFyZW50KSB7XG5cdFx0cGF0aC51bnNoaWZ0KGdyYXBoW2N1cl0ucGFyZW50KTtcblx0XHRmbiA9IGxpbmsoY29udmVyc2lvbnNbZ3JhcGhbY3VyXS5wYXJlbnRdW2N1cl0sIGZuKTtcblx0XHRjdXIgPSBncmFwaFtjdXJdLnBhcmVudDtcblx0fVxuXG5cdGZuLmNvbnZlcnNpb24gPSBwYXRoO1xuXHRyZXR1cm4gZm47XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZyb21Nb2RlbCkge1xuXHRjb25zdCBncmFwaCA9IGRlcml2ZUJGUyhmcm9tTW9kZWwpO1xuXHRjb25zdCBjb252ZXJzaW9uID0ge307XG5cblx0Y29uc3QgbW9kZWxzID0gT2JqZWN0LmtleXMoZ3JhcGgpO1xuXHRmb3IgKGxldCBsZW4gPSBtb2RlbHMubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0Y29uc3QgdG9Nb2RlbCA9IG1vZGVsc1tpXTtcblx0XHRjb25zdCBub2RlID0gZ3JhcGhbdG9Nb2RlbF07XG5cblx0XHRpZiAobm9kZS5wYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdC8vIE5vIHBvc3NpYmxlIGNvbnZlcnNpb24sIG9yIHRoaXMgbm9kZSBpcyB0aGUgc291cmNlIG1vZGVsLlxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29udmVyc2lvblt0b01vZGVsXSA9IHdyYXBDb252ZXJzaW9uKHRvTW9kZWwsIGdyYXBoKTtcblx0fVxuXG5cdHJldHVybiBjb252ZXJzaW9uO1xufTtcblxuIiwiJ3VzZSBzdHJpY3QnXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHRcImFsaWNlYmx1ZVwiOiBbMjQwLCAyNDgsIDI1NV0sXHJcblx0XCJhbnRpcXVld2hpdGVcIjogWzI1MCwgMjM1LCAyMTVdLFxyXG5cdFwiYXF1YVwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiYXF1YW1hcmluZVwiOiBbMTI3LCAyNTUsIDIxMl0sXHJcblx0XCJhenVyZVwiOiBbMjQwLCAyNTUsIDI1NV0sXHJcblx0XCJiZWlnZVwiOiBbMjQ1LCAyNDUsIDIyMF0sXHJcblx0XCJiaXNxdWVcIjogWzI1NSwgMjI4LCAxOTZdLFxyXG5cdFwiYmxhY2tcIjogWzAsIDAsIDBdLFxyXG5cdFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwgMjM1LCAyMDVdLFxyXG5cdFwiYmx1ZVwiOiBbMCwgMCwgMjU1XSxcclxuXHRcImJsdWV2aW9sZXRcIjogWzEzOCwgNDMsIDIyNl0sXHJcblx0XCJicm93blwiOiBbMTY1LCA0MiwgNDJdLFxyXG5cdFwiYnVybHl3b29kXCI6IFsyMjIsIDE4NCwgMTM1XSxcclxuXHRcImNhZGV0Ymx1ZVwiOiBbOTUsIDE1OCwgMTYwXSxcclxuXHRcImNoYXJ0cmV1c2VcIjogWzEyNywgMjU1LCAwXSxcclxuXHRcImNob2NvbGF0ZVwiOiBbMjEwLCAxMDUsIDMwXSxcclxuXHRcImNvcmFsXCI6IFsyNTUsIDEyNywgODBdLFxyXG5cdFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwgMTQ5LCAyMzddLFxyXG5cdFwiY29ybnNpbGtcIjogWzI1NSwgMjQ4LCAyMjBdLFxyXG5cdFwiY3JpbXNvblwiOiBbMjIwLCAyMCwgNjBdLFxyXG5cdFwiY3lhblwiOiBbMCwgMjU1LCAyNTVdLFxyXG5cdFwiZGFya2JsdWVcIjogWzAsIDAsIDEzOV0sXHJcblx0XCJkYXJrY3lhblwiOiBbMCwgMTM5LCAxMzldLFxyXG5cdFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LCAxMzQsIDExXSxcclxuXHRcImRhcmtncmF5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtncmVlblwiOiBbMCwgMTAwLCAwXSxcclxuXHRcImRhcmtncmV5XCI6IFsxNjksIDE2OSwgMTY5XSxcclxuXHRcImRhcmtraGFraVwiOiBbMTg5LCAxODMsIDEwN10sXHJcblx0XCJkYXJrbWFnZW50YVwiOiBbMTM5LCAwLCAxMzldLFxyXG5cdFwiZGFya29saXZlZ3JlZW5cIjogWzg1LCAxMDcsIDQ3XSxcclxuXHRcImRhcmtvcmFuZ2VcIjogWzI1NSwgMTQwLCAwXSxcclxuXHRcImRhcmtvcmNoaWRcIjogWzE1MywgNTAsIDIwNF0sXHJcblx0XCJkYXJrcmVkXCI6IFsxMzksIDAsIDBdLFxyXG5cdFwiZGFya3NhbG1vblwiOiBbMjMzLCAxNTAsIDEyMl0sXHJcblx0XCJkYXJrc2VhZ3JlZW5cIjogWzE0MywgMTg4LCAxNDNdLFxyXG5cdFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsIDYxLCAxMzldLFxyXG5cdFwiZGFya3NsYXRlZ3JheVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrc2xhdGVncmV5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmt0dXJxdW9pc2VcIjogWzAsIDIwNiwgMjA5XSxcclxuXHRcImRhcmt2aW9sZXRcIjogWzE0OCwgMCwgMjExXSxcclxuXHRcImRlZXBwaW5rXCI6IFsyNTUsIDIwLCAxNDddLFxyXG5cdFwiZGVlcHNreWJsdWVcIjogWzAsIDE5MSwgMjU1XSxcclxuXHRcImRpbWdyYXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZGltZ3JleVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkb2RnZXJibHVlXCI6IFszMCwgMTQ0LCAyNTVdLFxyXG5cdFwiZmlyZWJyaWNrXCI6IFsxNzgsIDM0LCAzNF0sXHJcblx0XCJmbG9yYWx3aGl0ZVwiOiBbMjU1LCAyNTAsIDI0MF0sXHJcblx0XCJmb3Jlc3RncmVlblwiOiBbMzQsIDEzOSwgMzRdLFxyXG5cdFwiZnVjaHNpYVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwiZ2FpbnNib3JvXCI6IFsyMjAsIDIyMCwgMjIwXSxcclxuXHRcImdob3N0d2hpdGVcIjogWzI0OCwgMjQ4LCAyNTVdLFxyXG5cdFwiZ29sZFwiOiBbMjU1LCAyMTUsIDBdLFxyXG5cdFwiZ29sZGVucm9kXCI6IFsyMTgsIDE2NSwgMzJdLFxyXG5cdFwiZ3JheVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJncmVlblwiOiBbMCwgMTI4LCAwXSxcclxuXHRcImdyZWVueWVsbG93XCI6IFsxNzMsIDI1NSwgNDddLFxyXG5cdFwiZ3JleVwiOiBbMTI4LCAxMjgsIDEyOF0sXHJcblx0XCJob25leWRld1wiOiBbMjQwLCAyNTUsIDI0MF0sXHJcblx0XCJob3RwaW5rXCI6IFsyNTUsIDEwNSwgMTgwXSxcclxuXHRcImluZGlhbnJlZFwiOiBbMjA1LCA5MiwgOTJdLFxyXG5cdFwiaW5kaWdvXCI6IFs3NSwgMCwgMTMwXSxcclxuXHRcIml2b3J5XCI6IFsyNTUsIDI1NSwgMjQwXSxcclxuXHRcImtoYWtpXCI6IFsyNDAsIDIzMCwgMTQwXSxcclxuXHRcImxhdmVuZGVyXCI6IFsyMzAsIDIzMCwgMjUwXSxcclxuXHRcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwgMjQwLCAyNDVdLFxyXG5cdFwibGF3bmdyZWVuXCI6IFsxMjQsIDI1MiwgMF0sXHJcblx0XCJsZW1vbmNoaWZmb25cIjogWzI1NSwgMjUwLCAyMDVdLFxyXG5cdFwibGlnaHRibHVlXCI6IFsxNzMsIDIxNiwgMjMwXSxcclxuXHRcImxpZ2h0Y29yYWxcIjogWzI0MCwgMTI4LCAxMjhdLFxyXG5cdFwibGlnaHRjeWFuXCI6IFsyMjQsIDI1NSwgMjU1XSxcclxuXHRcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsIDI1MCwgMjEwXSxcclxuXHRcImxpZ2h0Z3JheVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodGdyZWVuXCI6IFsxNDQsIDIzOCwgMTQ0XSxcclxuXHRcImxpZ2h0Z3JleVwiOiBbMjExLCAyMTEsIDIxMV0sXHJcblx0XCJsaWdodHBpbmtcIjogWzI1NSwgMTgyLCAxOTNdLFxyXG5cdFwibGlnaHRzYWxtb25cIjogWzI1NSwgMTYwLCAxMjJdLFxyXG5cdFwibGlnaHRzZWFncmVlblwiOiBbMzIsIDE3OCwgMTcwXSxcclxuXHRcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDI1MF0sXHJcblx0XCJsaWdodHNsYXRlZ3JheVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LCAxMzYsIDE1M10sXHJcblx0XCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LCAxOTYsIDIyMl0sXHJcblx0XCJsaWdodHllbGxvd1wiOiBbMjU1LCAyNTUsIDIyNF0sXHJcblx0XCJsaW1lXCI6IFswLCAyNTUsIDBdLFxyXG5cdFwibGltZWdyZWVuXCI6IFs1MCwgMjA1LCA1MF0sXHJcblx0XCJsaW5lblwiOiBbMjUwLCAyNDAsIDIzMF0sXHJcblx0XCJtYWdlbnRhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJtYXJvb25cIjogWzEyOCwgMCwgMF0sXHJcblx0XCJtZWRpdW1hcXVhbWFyaW5lXCI6IFsxMDIsIDIwNSwgMTcwXSxcclxuXHRcIm1lZGl1bWJsdWVcIjogWzAsIDAsIDIwNV0sXHJcblx0XCJtZWRpdW1vcmNoaWRcIjogWzE4NiwgODUsIDIxMV0sXHJcblx0XCJtZWRpdW1wdXJwbGVcIjogWzE0NywgMTEyLCAyMTldLFxyXG5cdFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLCAxNzksIDExM10sXHJcblx0XCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywgMTA0LCAyMzhdLFxyXG5cdFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogWzAsIDI1MCwgMTU0XSxcclxuXHRcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsIDIwOSwgMjA0XSxcclxuXHRcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LCAyMSwgMTMzXSxcclxuXHRcIm1pZG5pZ2h0Ymx1ZVwiOiBbMjUsIDI1LCAxMTJdLFxyXG5cdFwibWludGNyZWFtXCI6IFsyNDUsIDI1NSwgMjUwXSxcclxuXHRcIm1pc3R5cm9zZVwiOiBbMjU1LCAyMjgsIDIyNV0sXHJcblx0XCJtb2NjYXNpblwiOiBbMjU1LCAyMjgsIDE4MV0sXHJcblx0XCJuYXZham93aGl0ZVwiOiBbMjU1LCAyMjIsIDE3M10sXHJcblx0XCJuYXZ5XCI6IFswLCAwLCAxMjhdLFxyXG5cdFwib2xkbGFjZVwiOiBbMjUzLCAyNDUsIDIzMF0sXHJcblx0XCJvbGl2ZVwiOiBbMTI4LCAxMjgsIDBdLFxyXG5cdFwib2xpdmVkcmFiXCI6IFsxMDcsIDE0MiwgMzVdLFxyXG5cdFwib3JhbmdlXCI6IFsyNTUsIDE2NSwgMF0sXHJcblx0XCJvcmFuZ2VyZWRcIjogWzI1NSwgNjksIDBdLFxyXG5cdFwib3JjaGlkXCI6IFsyMTgsIDExMiwgMjE0XSxcclxuXHRcInBhbGVnb2xkZW5yb2RcIjogWzIzOCwgMjMyLCAxNzBdLFxyXG5cdFwicGFsZWdyZWVuXCI6IFsxNTIsIDI1MSwgMTUyXSxcclxuXHRcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwgMjM4LCAyMzhdLFxyXG5cdFwicGFsZXZpb2xldHJlZFwiOiBbMjE5LCAxMTIsIDE0N10sXHJcblx0XCJwYXBheWF3aGlwXCI6IFsyNTUsIDIzOSwgMjEzXSxcclxuXHRcInBlYWNocHVmZlwiOiBbMjU1LCAyMTgsIDE4NV0sXHJcblx0XCJwZXJ1XCI6IFsyMDUsIDEzMywgNjNdLFxyXG5cdFwicGlua1wiOiBbMjU1LCAxOTIsIDIwM10sXHJcblx0XCJwbHVtXCI6IFsyMjEsIDE2MCwgMjIxXSxcclxuXHRcInBvd2RlcmJsdWVcIjogWzE3NiwgMjI0LCAyMzBdLFxyXG5cdFwicHVycGxlXCI6IFsxMjgsIDAsIDEyOF0sXHJcblx0XCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsIDUxLCAxNTNdLFxyXG5cdFwicmVkXCI6IFsyNTUsIDAsIDBdLFxyXG5cdFwicm9zeWJyb3duXCI6IFsxODgsIDE0MywgMTQzXSxcclxuXHRcInJveWFsYmx1ZVwiOiBbNjUsIDEwNSwgMjI1XSxcclxuXHRcInNhZGRsZWJyb3duXCI6IFsxMzksIDY5LCAxOV0sXHJcblx0XCJzYWxtb25cIjogWzI1MCwgMTI4LCAxMTRdLFxyXG5cdFwic2FuZHlicm93blwiOiBbMjQ0LCAxNjQsIDk2XSxcclxuXHRcInNlYWdyZWVuXCI6IFs0NiwgMTM5LCA4N10sXHJcblx0XCJzZWFzaGVsbFwiOiBbMjU1LCAyNDUsIDIzOF0sXHJcblx0XCJzaWVubmFcIjogWzE2MCwgODIsIDQ1XSxcclxuXHRcInNpbHZlclwiOiBbMTkyLCAxOTIsIDE5Ml0sXHJcblx0XCJza3libHVlXCI6IFsxMzUsIDIwNiwgMjM1XSxcclxuXHRcInNsYXRlYmx1ZVwiOiBbMTA2LCA5MCwgMjA1XSxcclxuXHRcInNsYXRlZ3JheVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbGF0ZWdyZXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic25vd1wiOiBbMjU1LCAyNTAsIDI1MF0sXHJcblx0XCJzcHJpbmdncmVlblwiOiBbMCwgMjU1LCAxMjddLFxyXG5cdFwic3RlZWxibHVlXCI6IFs3MCwgMTMwLCAxODBdLFxyXG5cdFwidGFuXCI6IFsyMTAsIDE4MCwgMTQwXSxcclxuXHRcInRlYWxcIjogWzAsIDEyOCwgMTI4XSxcclxuXHRcInRoaXN0bGVcIjogWzIxNiwgMTkxLCAyMTZdLFxyXG5cdFwidG9tYXRvXCI6IFsyNTUsIDk5LCA3MV0sXHJcblx0XCJ0dXJxdW9pc2VcIjogWzY0LCAyMjQsIDIwOF0sXHJcblx0XCJ2aW9sZXRcIjogWzIzOCwgMTMwLCAyMzhdLFxyXG5cdFwid2hlYXRcIjogWzI0NSwgMjIyLCAxNzldLFxyXG5cdFwid2hpdGVcIjogWzI1NSwgMjU1LCAyNTVdLFxyXG5cdFwid2hpdGVzbW9rZVwiOiBbMjQ1LCAyNDUsIDI0NV0sXHJcblx0XCJ5ZWxsb3dcIjogWzI1NSwgMjU1LCAwXSxcclxuXHRcInllbGxvd2dyZWVuXCI6IFsxNTQsIDIwNSwgNTBdXHJcbn07XHJcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5tYWtlRGF0YVVyaVRvQnVmZmVyID0gdm9pZCAwO1xuLyoqXG4gKiBSZXR1cm5zIGEgYEJ1ZmZlcmAgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gZGF0YSBVUkkgYHVyaWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVyaSBEYXRhIFVSSSB0byB0dXJuIGludG8gYSBCdWZmZXIgaW5zdGFuY2VcbiAqL1xuY29uc3QgbWFrZURhdGFVcmlUb0J1ZmZlciA9IChjb252ZXJ0KSA9PiAodXJpKSA9PiB7XG4gICAgdXJpID0gU3RyaW5nKHVyaSk7XG4gICAgaWYgKCEvXmRhdGE6L2kudGVzdCh1cmkpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2B1cmlgIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIERhdGEgVVJJIChtdXN0IGJlZ2luIHdpdGggXCJkYXRhOlwiKScpO1xuICAgIH1cbiAgICAvLyBzdHJpcCBuZXdsaW5lc1xuICAgIHVyaSA9IHVyaS5yZXBsYWNlKC9cXHI/XFxuL2csICcnKTtcbiAgICAvLyBzcGxpdCB0aGUgVVJJIHVwIGludG8gdGhlIFwibWV0YWRhdGFcIiBhbmQgdGhlIFwiZGF0YVwiIHBvcnRpb25zXG4gICAgY29uc3QgZmlyc3RDb21tYSA9IHVyaS5pbmRleE9mKCcsJyk7XG4gICAgaWYgKGZpcnN0Q29tbWEgPT09IC0xIHx8IGZpcnN0Q29tbWEgPD0gNCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYWxmb3JtZWQgZGF0YTogVVJJJyk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSB0aGUgXCJkYXRhOlwiIHNjaGVtZSBhbmQgcGFyc2UgdGhlIG1ldGFkYXRhXG4gICAgY29uc3QgbWV0YSA9IHVyaS5zdWJzdHJpbmcoNSwgZmlyc3RDb21tYSkuc3BsaXQoJzsnKTtcbiAgICBsZXQgY2hhcnNldCA9ICcnO1xuICAgIGxldCBiYXNlNjQgPSBmYWxzZTtcbiAgICBjb25zdCB0eXBlID0gbWV0YVswXSB8fCAndGV4dC9wbGFpbic7XG4gICAgbGV0IHR5cGVGdWxsID0gdHlwZTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG1ldGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKG1ldGFbaV0gPT09ICdiYXNlNjQnKSB7XG4gICAgICAgICAgICBiYXNlNjQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1ldGFbaV0pIHtcbiAgICAgICAgICAgIHR5cGVGdWxsICs9IGA7JHttZXRhW2ldfWA7XG4gICAgICAgICAgICBpZiAobWV0YVtpXS5pbmRleE9mKCdjaGFyc2V0PScpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY2hhcnNldCA9IG1ldGFbaV0uc3Vic3RyaW5nKDgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGRlZmF1bHRzIHRvIFVTLUFTQ0lJIG9ubHkgaWYgdHlwZSBpcyBub3QgcHJvdmlkZWRcbiAgICBpZiAoIW1ldGFbMF0gJiYgIWNoYXJzZXQubGVuZ3RoKSB7XG4gICAgICAgIHR5cGVGdWxsICs9ICc7Y2hhcnNldD1VUy1BU0NJSSc7XG4gICAgICAgIGNoYXJzZXQgPSAnVVMtQVNDSUknO1xuICAgIH1cbiAgICAvLyBnZXQgdGhlIGVuY29kZWQgZGF0YSBwb3J0aW9uIGFuZCBkZWNvZGUgVVJJLWVuY29kZWQgY2hhcnNcbiAgICBjb25zdCBkYXRhID0gdW5lc2NhcGUodXJpLnN1YnN0cmluZyhmaXJzdENvbW1hICsgMSkpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IGJhc2U2NCA/IGNvbnZlcnQuYmFzZTY0VG9BcnJheUJ1ZmZlcihkYXRhKSA6IGNvbnZlcnQuc3RyaW5nVG9CdWZmZXIoZGF0YSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdHlwZUZ1bGwsXG4gICAgICAgIGNoYXJzZXQsXG4gICAgICAgIGJ1ZmZlcixcbiAgICB9O1xufTtcbmV4cG9ydHMubWFrZURhdGFVcmlUb0J1ZmZlciA9IG1ha2VEYXRhVXJpVG9CdWZmZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21tb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRhdGFVcmlUb0J1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IGNvbW1vbl8xID0gcmVxdWlyZShcIi4vY29tbW9uXCIpO1xuZnVuY3Rpb24gbm9kZUJ1ZmZlcnRvQXJyYXlCdWZmZXIobm9kZUJ1Zikge1xuICAgIGlmIChub2RlQnVmLmJ5dGVMZW5ndGggPT09IG5vZGVCdWYuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVCdWYuYnVmZmVyOyAvLyBsYXJnZSBzdHJpbmdzIG1heSBnZXQgdGhlaXIgb3duIG1lbW9yeSBhbGxvY2F0aW9uXG4gICAgfVxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihub2RlQnVmLmJ5dGVMZW5ndGgpO1xuICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIHZpZXcuc2V0KG5vZGVCdWYpO1xuICAgIHJldHVybiBidWZmZXI7XG59XG5mdW5jdGlvbiBiYXNlNjRUb0FycmF5QnVmZmVyKGJhc2U2NCkge1xuICAgIHJldHVybiBub2RlQnVmZmVydG9BcnJheUJ1ZmZlcihCdWZmZXIuZnJvbShiYXNlNjQsICdiYXNlNjQnKSk7XG59XG5mdW5jdGlvbiBzdHJpbmdUb0J1ZmZlcihzdHIpIHtcbiAgICByZXR1cm4gbm9kZUJ1ZmZlcnRvQXJyYXlCdWZmZXIoQnVmZmVyLmZyb20oc3RyLCAnYXNjaWknKSk7XG59XG4vKipcbiAqIFJldHVybnMgYSBgQnVmZmVyYCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBkYXRhIFVSSSBgdXJpYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJpIERhdGEgVVJJIHRvIHR1cm4gaW50byBhIEJ1ZmZlciBpbnN0YW5jZVxuICovXG5leHBvcnRzLmRhdGFVcmlUb0J1ZmZlciA9ICgwLCBjb21tb25fMS5tYWtlRGF0YVVyaVRvQnVmZmVyKSh7IHN0cmluZ1RvQnVmZmVyLCBiYXNlNjRUb0FycmF5QnVmZmVyIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9kZS5qcy5tYXAiLCIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSBsb2NhbHN0b3JhZ2UoKTtcbmV4cG9ydHMuZGVzdHJveSA9ICgoKSA9PiB7XG5cdGxldCB3YXJuZWQgPSBmYWxzZTtcblxuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGlmICghd2FybmVkKSB7XG5cdFx0XHR3YXJuZWQgPSB0cnVlO1xuXHRcdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdFx0fVxuXHR9O1xufSkoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG5cdCcjMDAwMENDJyxcblx0JyMwMDAwRkYnLFxuXHQnIzAwMzNDQycsXG5cdCcjMDAzM0ZGJyxcblx0JyMwMDY2Q0MnLFxuXHQnIzAwNjZGRicsXG5cdCcjMDA5OUNDJyxcblx0JyMwMDk5RkYnLFxuXHQnIzAwQ0MwMCcsXG5cdCcjMDBDQzMzJyxcblx0JyMwMENDNjYnLFxuXHQnIzAwQ0M5OScsXG5cdCcjMDBDQ0NDJyxcblx0JyMwMENDRkYnLFxuXHQnIzMzMDBDQycsXG5cdCcjMzMwMEZGJyxcblx0JyMzMzMzQ0MnLFxuXHQnIzMzMzNGRicsXG5cdCcjMzM2NkNDJyxcblx0JyMzMzY2RkYnLFxuXHQnIzMzOTlDQycsXG5cdCcjMzM5OUZGJyxcblx0JyMzM0NDMDAnLFxuXHQnIzMzQ0MzMycsXG5cdCcjMzNDQzY2Jyxcblx0JyMzM0NDOTknLFxuXHQnIzMzQ0NDQycsXG5cdCcjMzNDQ0ZGJyxcblx0JyM2NjAwQ0MnLFxuXHQnIzY2MDBGRicsXG5cdCcjNjYzM0NDJyxcblx0JyM2NjMzRkYnLFxuXHQnIzY2Q0MwMCcsXG5cdCcjNjZDQzMzJyxcblx0JyM5OTAwQ0MnLFxuXHQnIzk5MDBGRicsXG5cdCcjOTkzM0NDJyxcblx0JyM5OTMzRkYnLFxuXHQnIzk5Q0MwMCcsXG5cdCcjOTlDQzMzJyxcblx0JyNDQzAwMDAnLFxuXHQnI0NDMDAzMycsXG5cdCcjQ0MwMDY2Jyxcblx0JyNDQzAwOTknLFxuXHQnI0NDMDBDQycsXG5cdCcjQ0MwMEZGJyxcblx0JyNDQzMzMDAnLFxuXHQnI0NDMzMzMycsXG5cdCcjQ0MzMzY2Jyxcblx0JyNDQzMzOTknLFxuXHQnI0NDMzNDQycsXG5cdCcjQ0MzM0ZGJyxcblx0JyNDQzY2MDAnLFxuXHQnI0NDNjYzMycsXG5cdCcjQ0M5OTAwJyxcblx0JyNDQzk5MzMnLFxuXHQnI0NDQ0MwMCcsXG5cdCcjQ0NDQzMzJyxcblx0JyNGRjAwMDAnLFxuXHQnI0ZGMDAzMycsXG5cdCcjRkYwMDY2Jyxcblx0JyNGRjAwOTknLFxuXHQnI0ZGMDBDQycsXG5cdCcjRkYwMEZGJyxcblx0JyNGRjMzMDAnLFxuXHQnI0ZGMzMzMycsXG5cdCcjRkYzMzY2Jyxcblx0JyNGRjMzOTknLFxuXHQnI0ZGMzNDQycsXG5cdCcjRkYzM0ZGJyxcblx0JyNGRjY2MDAnLFxuXHQnI0ZGNjYzMycsXG5cdCcjRkY5OTAwJyxcblx0JyNGRjk5MzMnLFxuXHQnI0ZGQ0MwMCcsXG5cdCcjRkZDQzMzJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHQvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG5cdC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG5cdC8vIGV4cGxpY2l0bHlcblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmICh3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHdpbmRvdy5wcm9jZXNzLl9fbndqcykpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0IGNvbG9ycy5cblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVxcLyhcXGQrKS8pKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0bGV0IG07XG5cblx0Ly8gSXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcblx0Ly8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcblx0cmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG5cdFx0Ly8gSXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuXHRcdCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG5cdFx0Ly8gSXMgZmlyZWZveCA+PSB2MzE/XG5cdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgKG0gPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSkgJiYgcGFyc2VJbnQobVsxXSwgMTApID49IDMxKSB8fFxuXHRcdC8vIERvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuXHRhcmdzWzBdID0gKHRoaXMudXNlQ29sb3JzID8gJyVjJyA6ICcnKSArXG5cdFx0dGhpcy5uYW1lc3BhY2UgK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKSArXG5cdFx0YXJnc1swXSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyVjICcgOiAnICcpICtcblx0XHQnKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG5cdGlmICghdGhpcy51c2VDb2xvcnMpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjID0gJ2NvbG9yOiAnICsgdGhpcy5jb2xvcjtcblx0YXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0Jyk7XG5cblx0Ly8gVGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcblx0Ly8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuXHQvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cblx0bGV0IGluZGV4ID0gMDtcblx0bGV0IGxhc3RDID0gMDtcblx0YXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIG1hdGNoID0+IHtcblx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aW5kZXgrKztcblx0XHRpZiAobWF0Y2ggPT09ICclYycpIHtcblx0XHRcdC8vIFdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuXHRcdFx0Ly8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcblx0XHRcdGxhc3RDID0gaW5kZXg7XG5cdFx0fVxuXHR9KTtcblxuXHRhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG59XG5cbi8qKlxuICogSW52b2tlcyBgY29uc29sZS5kZWJ1ZygpYCB3aGVuIGF2YWlsYWJsZS5cbiAqIE5vLW9wIHdoZW4gYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqIElmIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYXZhaWxhYmxlLCBmYWxscyBiYWNrXG4gKiB0byBgY29uc29sZS5sb2dgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbmV4cG9ydHMubG9nID0gY29uc29sZS5kZWJ1ZyB8fCBjb25zb2xlLmxvZyB8fCAoKCkgPT4ge30pO1xuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdHRyeSB7XG5cdFx0aWYgKG5hbWVzcGFjZXMpIHtcblx0XHRcdGV4cG9ydHMuc3RvcmFnZS5zZXRJdGVtKCdkZWJ1ZycsIG5hbWVzcGFjZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcblx0XHR9XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGxvYWQoKSB7XG5cdGxldCByO1xuXHR0cnkge1xuXHRcdHIgPSBleHBvcnRzLnN0b3JhZ2UuZ2V0SXRlbSgnZGVidWcnKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cblxuXHQvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG5cdGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuXHRcdHIgPSBwcm9jZXNzLmVudi5ERUJVRztcblx0fVxuXG5cdHJldHVybiByO1xufVxuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpIHtcblx0dHJ5IHtcblx0XHQvLyBUVk1MS2l0IChBcHBsZSBUViBKUyBSdW50aW1lKSBkb2VzIG5vdCBoYXZlIGEgd2luZG93IG9iamVjdCwganVzdCBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0XG5cdFx0Ly8gVGhlIEJyb3dzZXIgYWxzbyBoYXMgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dC5cblx0XHRyZXR1cm4gbG9jYWxTdG9yYWdlO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5mb3JtYXR0ZXJzLmogPSBmdW5jdGlvbiAodikge1xuXHR0cnkge1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRyZXR1cm4gJ1tVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAnICsgZXJyb3IubWVzc2FnZTtcblx0fVxufTtcbiIsIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICovXG5cbmZ1bmN0aW9uIHNldHVwKGVudikge1xuXHRjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5kZWZhdWx0ID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmNvZXJjZSA9IGNvZXJjZTtcblx0Y3JlYXRlRGVidWcuZGlzYWJsZSA9IGRpc2FibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZSA9IGVuYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdGNyZWF0ZURlYnVnLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblx0Y3JlYXRlRGVidWcuZGVzdHJveSA9IGRlc3Ryb3k7XG5cblx0T2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0Y3JlYXRlRGVidWdba2V5XSA9IGVudltrZXldO1xuXHR9KTtcblxuXHQvKipcblx0KiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cblx0Ki9cblxuXHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdC8qKlxuXHQqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cblx0KlxuXHQqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cblx0Ki9cblx0Y3JlYXRlRGVidWcuZm9ybWF0dGVycyA9IHt9O1xuXG5cdC8qKlxuXHQqIFNlbGVjdHMgYSBjb2xvciBmb3IgYSBkZWJ1ZyBuYW1lc3BhY2Vcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugc3RyaW5nIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXHRcdGxldCBuYW1lc3BhY2VzQ2FjaGU7XG5cdFx0bGV0IGVuYWJsZWRDYWNoZTtcblxuXHRcdGZ1bmN0aW9uIGRlYnVnKC4uLmFyZ3MpIHtcblx0XHRcdC8vIERpc2FibGVkP1xuXHRcdFx0aWYgKCFkZWJ1Zy5lbmFibGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2VsZiA9IGRlYnVnO1xuXG5cdFx0XHQvLyBTZXQgYGRpZmZgIHRpbWVzdGFtcFxuXHRcdFx0Y29uc3QgY3VyciA9IE51bWJlcihuZXcgRGF0ZSgpKTtcblx0XHRcdGNvbnN0IG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcblx0XHRcdHNlbGYuZGlmZiA9IG1zO1xuXHRcdFx0c2VsZi5wcmV2ID0gcHJldlRpbWU7XG5cdFx0XHRzZWxmLmN1cnIgPSBjdXJyO1xuXHRcdFx0cHJldlRpbWUgPSBjdXJyO1xuXG5cdFx0XHRhcmdzWzBdID0gY3JlYXRlRGVidWcuY29lcmNlKGFyZ3NbMF0pO1xuXG5cdFx0XHRpZiAodHlwZW9mIGFyZ3NbMF0gIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdC8vIEFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG5cdFx0XHRcdGFyZ3MudW5zaGlmdCgnJU8nKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgKG1hdGNoLCBmb3JtYXQpID0+IHtcblx0XHRcdFx0Ly8gSWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuXHRcdFx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdFx0XHRyZXR1cm4gJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlciA9IGNyZWF0ZURlYnVnLmZvcm1hdHRlcnNbZm9ybWF0XTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRjb25zdCB2YWwgPSBhcmdzW2luZGV4XTtcblx0XHRcdFx0XHRtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cblx0XHRcdFx0XHQvLyBOb3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG5cdFx0XHRcdFx0YXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHRcdGluZGV4LS07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG5cdFx0XHRjcmVhdGVEZWJ1Zy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cblx0XHRcdGNvbnN0IGxvZ0ZuID0gc2VsZi5sb2cgfHwgY3JlYXRlRGVidWcubG9nO1xuXHRcdFx0bG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cdFx0fVxuXG5cdFx0ZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXHRcdGRlYnVnLnVzZUNvbG9ycyA9IGNyZWF0ZURlYnVnLnVzZUNvbG9ycygpO1xuXHRcdGRlYnVnLmNvbG9yID0gY3JlYXRlRGVidWcuc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblx0XHRkZWJ1Zy5leHRlbmQgPSBleHRlbmQ7XG5cdFx0ZGVidWcuZGVzdHJveSA9IGNyZWF0ZURlYnVnLmRlc3Ryb3k7IC8vIFhYWCBUZW1wb3JhcnkuIFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGRlYnVnLCAnZW5hYmxlZCcsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdGlmIChlbmFibGVPdmVycmlkZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiBlbmFibGVPdmVycmlkZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobmFtZXNwYWNlc0NhY2hlICE9PSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzKSB7XG5cdFx0XHRcdFx0bmFtZXNwYWNlc0NhY2hlID0gY3JlYXRlRGVidWcubmFtZXNwYWNlcztcblx0XHRcdFx0XHRlbmFibGVkQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5lbmFibGVkKG5hbWVzcGFjZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZW5hYmxlZENhY2hlO1xuXHRcdFx0fSxcblx0XHRcdHNldDogdiA9PiB7XG5cdFx0XHRcdGVuYWJsZU92ZXJyaWRlID0gdjtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG5cdFx0aWYgKHR5cGVvZiBjcmVhdGVEZWJ1Zy5pbml0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjcmVhdGVEZWJ1Zy5pbml0KGRlYnVnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVidWc7XG5cdH1cblxuXHRmdW5jdGlvbiBleHRlbmQobmFtZXNwYWNlLCBkZWxpbWl0ZXIpIHtcblx0XHRjb25zdCBuZXdEZWJ1ZyA9IGNyZWF0ZURlYnVnKHRoaXMubmFtZXNwYWNlICsgKHR5cGVvZiBkZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gJzonIDogZGVsaW1pdGVyKSArIG5hbWVzcGFjZSk7XG5cdFx0bmV3RGVidWcubG9nID0gdGhpcy5sb2c7XG5cdFx0cmV0dXJuIG5ld0RlYnVnO1xuXHR9XG5cblx0LyoqXG5cdCogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuXHQqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG5cdFx0Y3JlYXRlRGVidWcuc2F2ZShuYW1lc3BhY2VzKTtcblx0XHRjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlcztcblxuXHRcdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdFx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHRcdGxldCBpO1xuXHRcdGNvbnN0IHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcblx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmICghc3BsaXRbaV0pIHtcblx0XHRcdFx0Ly8gaWdub3JlIGVtcHR5IHN0cmluZ3Ncblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuXG5cdFx0XHRpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnNsaWNlKDEpICsgJyQnKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcyArICckJykpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuXHQqXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZGlzYWJsZSgpIHtcblx0XHRjb25zdCBuYW1lc3BhY2VzID0gW1xuXHRcdFx0Li4uY3JlYXRlRGVidWcubmFtZXMubWFwKHRvTmFtZXNwYWNlKSxcblx0XHRcdC4uLmNyZWF0ZURlYnVnLnNraXBzLm1hcCh0b05hbWVzcGFjZSkubWFwKG5hbWVzcGFjZSA9PiAnLScgKyBuYW1lc3BhY2UpXG5cdFx0XS5qb2luKCcsJyk7XG5cdFx0Y3JlYXRlRGVidWcuZW5hYmxlKCcnKTtcblx0XHRyZXR1cm4gbmFtZXNwYWNlcztcblx0fVxuXG5cdC8qKlxuXHQqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdCogQHJldHVybiB7Qm9vbGVhbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcblx0XHRpZiAobmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnKicpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGxldCBpO1xuXHRcdGxldCBsZW47XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLm5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcubmFtZXNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0KiBDb252ZXJ0IHJlZ2V4cCB0byBuYW1lc3BhY2Vcblx0KlxuXHQqIEBwYXJhbSB7UmVnRXhwfSByZWd4ZXBcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiB0b05hbWVzcGFjZShyZWdleHApIHtcblx0XHRyZXR1cm4gcmVnZXhwLnRvU3RyaW5nKClcblx0XHRcdC5zdWJzdHJpbmcoMiwgcmVnZXhwLnRvU3RyaW5nKCkubGVuZ3RoIC0gMilcblx0XHRcdC5yZXBsYWNlKC9cXC5cXCpcXD8kLywgJyonKTtcblx0fVxuXG5cdC8qKlxuXHQqIENvZXJjZSBgdmFsYC5cblx0KlxuXHQqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuXHQqIEByZXR1cm4ge01peGVkfVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBjb2VyY2UodmFsKSB7XG5cdFx0aWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHRyZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCogWFhYIERPIE5PVCBVU0UuIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc3R1YiBmdW5jdGlvbi5cblx0KiBYWFggSXQgV0lMTCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cdCovXG5cdGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG5cdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdH1cblxuXHRjcmVhdGVEZWJ1Zy5lbmFibGUoY3JlYXRlRGVidWcubG9hZCgpKTtcblxuXHRyZXR1cm4gY3JlYXRlRGVidWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0dXA7XG4iLCIvKipcbiAqIERldGVjdCBFbGVjdHJvbiByZW5kZXJlciAvIG53anMgcHJvY2Vzcywgd2hpY2ggaXMgbm9kZSwgYnV0IHdlIHNob3VsZFxuICogdHJlYXQgYXMgYSBicm93c2VyLlxuICovXG5cbmlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHByb2Nlc3MuYnJvd3NlciA9PT0gdHJ1ZSB8fCBwcm9jZXNzLl9fbndqcykge1xuXHRtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYnJvd3Nlci5qcycpO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL25vZGUuanMnKTtcbn1cbiIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLmRlc3Ryb3kgPSB1dGlsLmRlcHJlY2F0ZShcblx0KCkgPT4ge30sXG5cdCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJ1xuKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbNiwgMiwgMywgNCwgNSwgMV07XG5cbnRyeSB7XG5cdC8vIE9wdGlvbmFsIGRlcGVuZGVuY3kgKGFzIGluLCBkb2Vzbid0IG5lZWQgdG8gYmUgaW5zdGFsbGVkLCBOT1QgbGlrZSBvcHRpb25hbERlcGVuZGVuY2llcyBpbiBwYWNrYWdlLmpzb24pXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcblx0Y29uc3Qgc3VwcG9ydHNDb2xvciA9IHJlcXVpcmUoJ3N1cHBvcnRzLWNvbG9yJyk7XG5cblx0aWYgKHN1cHBvcnRzQ29sb3IgJiYgKHN1cHBvcnRzQ29sb3Iuc3RkZXJyIHx8IHN1cHBvcnRzQ29sb3IpLmxldmVsID49IDIpIHtcblx0XHRleHBvcnRzLmNvbG9ycyA9IFtcblx0XHRcdDIwLFxuXHRcdFx0MjEsXG5cdFx0XHQyNixcblx0XHRcdDI3LFxuXHRcdFx0MzIsXG5cdFx0XHQzMyxcblx0XHRcdDM4LFxuXHRcdFx0MzksXG5cdFx0XHQ0MCxcblx0XHRcdDQxLFxuXHRcdFx0NDIsXG5cdFx0XHQ0Myxcblx0XHRcdDQ0LFxuXHRcdFx0NDUsXG5cdFx0XHQ1Nixcblx0XHRcdDU3LFxuXHRcdFx0NjIsXG5cdFx0XHQ2Myxcblx0XHRcdDY4LFxuXHRcdFx0NjksXG5cdFx0XHQ3NCxcblx0XHRcdDc1LFxuXHRcdFx0NzYsXG5cdFx0XHQ3Nyxcblx0XHRcdDc4LFxuXHRcdFx0NzksXG5cdFx0XHQ4MCxcblx0XHRcdDgxLFxuXHRcdFx0OTIsXG5cdFx0XHQ5Myxcblx0XHRcdDk4LFxuXHRcdFx0OTksXG5cdFx0XHQxMTIsXG5cdFx0XHQxMTMsXG5cdFx0XHQxMjgsXG5cdFx0XHQxMjksXG5cdFx0XHQxMzQsXG5cdFx0XHQxMzUsXG5cdFx0XHQxNDgsXG5cdFx0XHQxNDksXG5cdFx0XHQxNjAsXG5cdFx0XHQxNjEsXG5cdFx0XHQxNjIsXG5cdFx0XHQxNjMsXG5cdFx0XHQxNjQsXG5cdFx0XHQxNjUsXG5cdFx0XHQxNjYsXG5cdFx0XHQxNjcsXG5cdFx0XHQxNjgsXG5cdFx0XHQxNjksXG5cdFx0XHQxNzAsXG5cdFx0XHQxNzEsXG5cdFx0XHQxNzIsXG5cdFx0XHQxNzMsXG5cdFx0XHQxNzgsXG5cdFx0XHQxNzksXG5cdFx0XHQxODQsXG5cdFx0XHQxODUsXG5cdFx0XHQxOTYsXG5cdFx0XHQxOTcsXG5cdFx0XHQxOTgsXG5cdFx0XHQxOTksXG5cdFx0XHQyMDAsXG5cdFx0XHQyMDEsXG5cdFx0XHQyMDIsXG5cdFx0XHQyMDMsXG5cdFx0XHQyMDQsXG5cdFx0XHQyMDUsXG5cdFx0XHQyMDYsXG5cdFx0XHQyMDcsXG5cdFx0XHQyMDgsXG5cdFx0XHQyMDksXG5cdFx0XHQyMTQsXG5cdFx0XHQyMTUsXG5cdFx0XHQyMjAsXG5cdFx0XHQyMjFcblx0XHRdO1xuXHR9XG59IGNhdGNoIChlcnJvcikge1xuXHQvLyBTd2FsbG93IC0gd2Ugb25seSBjYXJlIGlmIGBzdXBwb3J0cy1jb2xvcmAgaXMgYXZhaWxhYmxlOyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUuXG59XG5cbi8qKlxuICogQnVpbGQgdXAgdGhlIGRlZmF1bHQgYGluc3BlY3RPcHRzYCBvYmplY3QgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqICAgJCBERUJVR19DT0xPUlM9bm8gREVCVUdfREVQVEg9MTAgREVCVUdfU0hPV19ISURERU49ZW5hYmxlZCBub2RlIHNjcmlwdC5qc1xuICovXG5cbmV4cG9ydHMuaW5zcGVjdE9wdHMgPSBPYmplY3Qua2V5cyhwcm9jZXNzLmVudikuZmlsdGVyKGtleSA9PiB7XG5cdHJldHVybiAvXmRlYnVnXy9pLnRlc3Qoa2V5KTtcbn0pLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcblx0Ly8gQ2FtZWwtY2FzZVxuXHRjb25zdCBwcm9wID0ga2V5XG5cdFx0LnN1YnN0cmluZyg2KVxuXHRcdC50b0xvd2VyQ2FzZSgpXG5cdFx0LnJlcGxhY2UoL18oW2Etel0pL2csIChfLCBrKSA9PiB7XG5cdFx0XHRyZXR1cm4gay50b1VwcGVyQ2FzZSgpO1xuXHRcdH0pO1xuXG5cdC8vIENvZXJjZSBzdHJpbmcgdmFsdWUgaW50byBKUyB2YWx1ZVxuXHRsZXQgdmFsID0gcHJvY2Vzcy5lbnZba2V5XTtcblx0aWYgKC9eKHllc3xvbnx0cnVlfGVuYWJsZWQpJC9pLnRlc3QodmFsKSkge1xuXHRcdHZhbCA9IHRydWU7XG5cdH0gZWxzZSBpZiAoL14obm98b2ZmfGZhbHNlfGRpc2FibGVkKSQvaS50ZXN0KHZhbCkpIHtcblx0XHR2YWwgPSBmYWxzZTtcblx0fSBlbHNlIGlmICh2YWwgPT09ICdudWxsJykge1xuXHRcdHZhbCA9IG51bGw7XG5cdH0gZWxzZSB7XG5cdFx0dmFsID0gTnVtYmVyKHZhbCk7XG5cdH1cblxuXHRvYmpbcHJvcF0gPSB2YWw7XG5cdHJldHVybiBvYmo7XG59LCB7fSk7XG5cbi8qKlxuICogSXMgc3Rkb3V0IGEgVFRZPyBDb2xvcmVkIG91dHB1dCBpcyBlbmFibGVkIHdoZW4gYHRydWVgLlxuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0cmV0dXJuICdjb2xvcnMnIGluIGV4cG9ydHMuaW5zcGVjdE9wdHMgP1xuXHRcdEJvb2xlYW4oZXhwb3J0cy5pbnNwZWN0T3B0cy5jb2xvcnMpIDpcblx0XHR0dHkuaXNhdHR5KHByb2Nlc3Muc3RkZXJyLmZkKTtcbn1cblxuLyoqXG4gKiBBZGRzIEFOU0kgY29sb3IgZXNjYXBlIGNvZGVzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0Y29uc3Qge25hbWVzcGFjZTogbmFtZSwgdXNlQ29sb3JzfSA9IHRoaXM7XG5cblx0aWYgKHVzZUNvbG9ycykge1xuXHRcdGNvbnN0IGMgPSB0aGlzLmNvbG9yO1xuXHRcdGNvbnN0IGNvbG9yQ29kZSA9ICdcXHUwMDFCWzMnICsgKGMgPCA4ID8gYyA6ICc4OzU7JyArIGMpO1xuXHRcdGNvbnN0IHByZWZpeCA9IGAgICR7Y29sb3JDb2RlfTsxbSR7bmFtZX0gXFx1MDAxQlswbWA7XG5cblx0XHRhcmdzWzBdID0gcHJlZml4ICsgYXJnc1swXS5zcGxpdCgnXFxuJykuam9pbignXFxuJyArIHByZWZpeCk7XG5cdFx0YXJncy5wdXNoKGNvbG9yQ29kZSArICdtKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpICsgJ1xcdTAwMUJbMG0nKTtcblx0fSBlbHNlIHtcblx0XHRhcmdzWzBdID0gZ2V0RGF0ZSgpICsgbmFtZSArICcgJyArIGFyZ3NbMF07XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZSgpIHtcblx0aWYgKGV4cG9ydHMuaW5zcGVjdE9wdHMuaGlkZURhdGUpIHtcblx0XHRyZXR1cm4gJyc7XG5cdH1cblx0cmV0dXJuIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSArICcgJztcbn1cblxuLyoqXG4gKiBJbnZva2VzIGB1dGlsLmZvcm1hdFdpdGhPcHRpb25zKClgIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIHdyaXRlcyB0byBzdGRlcnIuXG4gKi9cblxuZnVuY3Rpb24gbG9nKC4uLmFyZ3MpIHtcblx0cmV0dXJuIHByb2Nlc3Muc3RkZXJyLndyaXRlKHV0aWwuZm9ybWF0V2l0aE9wdGlvbnMoZXhwb3J0cy5pbnNwZWN0T3B0cywgLi4uYXJncykgKyAnXFxuJyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcblx0aWYgKG5hbWVzcGFjZXMpIHtcblx0XHRwcm9jZXNzLmVudi5ERUJVRyA9IG5hbWVzcGFjZXM7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSWYgeW91IHNldCBhIHByb2Nlc3MuZW52IGZpZWxkIHRvIG51bGwgb3IgdW5kZWZpbmVkLCBpdCBnZXRzIGNhc3QgdG8gdGhlXG5cdFx0Ly8gc3RyaW5nICdudWxsJyBvciAndW5kZWZpbmVkJy4gSnVzdCBkZWxldGUgaW5zdGVhZC5cblx0XHRkZWxldGUgcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRyZXR1cm4gcHJvY2Vzcy5lbnYuREVCVUc7XG59XG5cbi8qKlxuICogSW5pdCBsb2dpYyBmb3IgYGRlYnVnYCBpbnN0YW5jZXMuXG4gKlxuICogQ3JlYXRlIGEgbmV3IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGluIGNhc2UgYHVzZUNvbG9yc2AgaXMgc2V0XG4gKiBkaWZmZXJlbnRseSBmb3IgYSBwYXJ0aWN1bGFyIGBkZWJ1Z2AgaW5zdGFuY2UuXG4gKi9cblxuZnVuY3Rpb24gaW5pdChkZWJ1Zykge1xuXHRkZWJ1Zy5pbnNwZWN0T3B0cyA9IHt9O1xuXG5cdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhleHBvcnRzLmluc3BlY3RPcHRzKTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0ZGVidWcuaW5zcGVjdE9wdHNba2V5c1tpXV0gPSBleHBvcnRzLmluc3BlY3RPcHRzW2tleXNbaV1dO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9jb21tb24nKShleHBvcnRzKTtcblxuY29uc3Qge2Zvcm1hdHRlcnN9ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogTWFwICVvIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbCBvbiBhIHNpbmdsZSBsaW5lLlxuICovXG5cbmZvcm1hdHRlcnMubyA9IGZ1bmN0aW9uICh2KSB7XG5cdHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cdHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cylcblx0XHQuc3BsaXQoJ1xcbicpXG5cdFx0Lm1hcChzdHIgPT4gc3RyLnRyaW0oKSlcblx0XHQuam9pbignICcpO1xufTtcblxuLyoqXG4gKiBNYXAgJU8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsb3dpbmcgbXVsdGlwbGUgbGluZXMgaWYgbmVlZGVkLlxuICovXG5cbmZvcm1hdHRlcnMuTyA9IGZ1bmN0aW9uICh2KSB7XG5cdHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cdHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cyk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbXBpbGUgPSB2b2lkIDA7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwidXRpbFwiKTtcbmNvbnN0IGRlZ2VuZXJhdG9yXzEgPSByZXF1aXJlKFwiLi9kZWdlbmVyYXRvclwiKTtcbmZ1bmN0aW9uIGNvbXBpbGUocWpzLCBjb2RlLCByZXR1cm5OYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBjb21waWxlZCA9ICgwLCBkZWdlbmVyYXRvcl8xLmRlZ2VuZXJhdG9yKShjb2RlLCBvcHRpb25zLm5hbWVzID8/IFtdKTtcbiAgICBjb25zdCB2bSA9IHFqcy5uZXdDb250ZXh0KCk7XG4gICAgLy8gQWRkIGZ1bmN0aW9ucyB0byBnbG9iYWxcbiAgICBpZiAob3B0aW9ucy5zYW5kYm94KSB7XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvcHRpb25zLnNhbmRib3gpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIFwiZnVuY3Rpb25cIiBmb3Igc2FuZGJveCBwcm9wZXJ0eSBcXGAke25hbWV9XFxgLCBidXQgZ290IFwiJHt0eXBlb2YgdmFsdWV9XCJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZuSGFuZGxlID0gdm0ubmV3RnVuY3Rpb24obmFtZSwgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZSguLi5hcmdzLm1hcCgoYXJnKSA9PiBxdWlja0pTSGFuZGxlVG9Ib3N0KHZtLCBhcmcpKSk7XG4gICAgICAgICAgICAgICAgdm0ucnVudGltZS5leGVjdXRlUGVuZGluZ0pvYnMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaG9zdFRvUXVpY2tKU0hhbmRsZSh2bSwgcmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZm5IYW5kbGUuY29uc3VtZSgoaGFuZGxlKSA9PiB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgbmFtZSwgaGFuZGxlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZm5SZXN1bHQgPSB2bS5ldmFsQ29kZShgJHtjb21waWxlZH07JHtyZXR1cm5OYW1lfWAsIG9wdGlvbnMuZmlsZW5hbWUpO1xuICAgIGNvbnN0IGZuID0gdm0udW53cmFwUmVzdWx0KGZuUmVzdWx0KTtcbiAgICBjb25zdCB0ID0gdm0udHlwZW9mKGZuKTtcbiAgICBpZiAodCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgXCJmdW5jdGlvblwiIG5hbWVkIFxcYCR7cmV0dXJuTmFtZX1cXGAgdG8gYmUgZGVmaW5lZCwgYnV0IGdvdCBcIiR7dH1cImApO1xuICAgIH1cbiAgICBjb25zdCByID0gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IHByb21pc2VIYW5kbGU7XG4gICAgICAgIGxldCByZXNvbHZlZEhhbmRsZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHZtLmNhbGxGdW5jdGlvbihmbiwgdm0udW5kZWZpbmVkLCAuLi5hcmdzLm1hcCgoYXJnKSA9PiBob3N0VG9RdWlja0pTSGFuZGxlKHZtLCBhcmcpKSk7XG4gICAgICAgICAgICBwcm9taXNlSGFuZGxlID0gdm0udW53cmFwUmVzdWx0KHJlc3VsdCk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZFJlc3VsdFAgPSB2bS5yZXNvbHZlUHJvbWlzZShwcm9taXNlSGFuZGxlKTtcbiAgICAgICAgICAgIHZtLnJ1bnRpbWUuZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZFJlc3VsdCA9IGF3YWl0IHJlc29sdmVkUmVzdWx0UDtcbiAgICAgICAgICAgIHJlc29sdmVkSGFuZGxlID0gdm0udW53cmFwUmVzdWx0KHJlc29sdmVkUmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybiBxdWlja0pTSGFuZGxlVG9Ib3N0KHZtLCByZXNvbHZlZEhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciAmJiB0eXBlb2YgZXJyID09PSAnb2JqZWN0JyAmJiAnY2F1c2UnIGluIGVyciAmJiBlcnIuY2F1c2UpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVyci5jYXVzZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgJ3N0YWNrJyBpbiBlcnIuY2F1c2UgJiZcbiAgICAgICAgICAgICAgICAgICAgJ25hbWUnIGluIGVyci5jYXVzZSAmJlxuICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScgaW4gZXJyLmNhdXNlICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBlcnIuY2F1c2Uuc3RhY2sgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBlcnIuY2F1c2UubmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGVyci5jYXVzZS5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBRdWlja0pTIEVycm9yIGBzdGFja2AgZG9lcyBub3QgaW5jbHVkZSB0aGUgbmFtZSArXG4gICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UsIHNvIHBhdGNoIHRob3NlIGluIHRvIGJlaGF2ZSBtb3JlIGxpa2UgVjhcbiAgICAgICAgICAgICAgICAgICAgZXJyLmNhdXNlLnN0YWNrID0gYCR7ZXJyLmNhdXNlLm5hbWV9OiAke2Vyci5jYXVzZS5tZXNzYWdlfVxcbiR7ZXJyLmNhdXNlLnN0YWNrfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVyci5jYXVzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHByb21pc2VIYW5kbGU/LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJlc29sdmVkSGFuZGxlPy5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCAndG9TdHJpbmcnLCB7XG4gICAgICAgIHZhbHVlOiAoKSA9PiBjb21waWxlZCxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHI7XG59XG5leHBvcnRzLmNvbXBpbGUgPSBjb21waWxlO1xuZnVuY3Rpb24gcXVpY2tKU0hhbmRsZVRvSG9zdCh2bSwgdmFsKSB7XG4gICAgcmV0dXJuIHZtLmR1bXAodmFsKTtcbn1cbmZ1bmN0aW9uIGhvc3RUb1F1aWNrSlNIYW5kbGUodm0sIHZhbCkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdm0udW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHZtLm51bGw7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2bS5uZXdTdHJpbmcodmFsKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZtLm5ld051bWJlcih2YWwpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnYmlnaW50Jykge1xuICAgICAgICByZXR1cm4gdm0ubmV3QmlnSW50KHZhbCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gdmFsID8gdm0udHJ1ZSA6IHZtLmZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmICh1dGlsXzEudHlwZXMuaXNQcm9taXNlKHZhbCkpIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHZtLm5ld1Byb21pc2UoKTtcbiAgICAgICAgcHJvbWlzZS5zZXR0bGVkLnRoZW4odm0ucnVudGltZS5leGVjdXRlUGVuZGluZ0pvYnMpO1xuICAgICAgICB2YWwudGhlbigocikgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKGhvc3RUb1F1aWNrSlNIYW5kbGUodm0sIHIpKTtcbiAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoaG9zdFRvUXVpY2tKU0hhbmRsZSh2bSwgZXJyKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS5oYW5kbGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHV0aWxfMS50eXBlcy5pc05hdGl2ZUVycm9yKHZhbCkpIHtcbiAgICAgICAgcmV0dXJuIHZtLm5ld0Vycm9yKHZhbCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdmFsdWU6ICR7dmFsfWApO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcGlsZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVnZW5lcmF0b3IgPSB2b2lkIDA7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwidXRpbFwiKTtcbmNvbnN0IGVzY29kZWdlbl8xID0gcmVxdWlyZShcImVzY29kZWdlblwiKTtcbmNvbnN0IGVzcHJpbWFfMSA9IHJlcXVpcmUoXCJlc3ByaW1hXCIpO1xuY29uc3QgYXN0X3R5cGVzXzEgPSByZXF1aXJlKFwiYXN0LXR5cGVzXCIpO1xuLyoqXG4gKiBDb21waWxlcyBzeW5jIEphdmFTY3JpcHQgY29kZSBpbnRvIEphdmFTY3JpcHQgd2l0aCBhc3luYyBGdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGNvZGUgSmF2YVNjcmlwdCBzdHJpbmcgdG8gY29udmVydFxuICogQHBhcmFtIHtBcnJheX0gbmFtZXMgQXJyYXkgb2YgZnVuY3Rpb24gbmFtZXMgdG8gYWRkIGBhd2FpdGAgb3BlcmF0b3JzIHRvXG4gKiBAcmV0dXJuIHtTdHJpbmd9IENvbnZlcnRlZCBKYXZhU2NyaXB0IHN0cmluZyB3aXRoIGFzeW5jL2F3YWl0IGluamVjdGVkXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiBkZWdlbmVyYXRvcihjb2RlLCBfbmFtZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoX25hbWVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhbiBhcnJheSBvZiBhc3luYyBmdW5jdGlvbiBcIm5hbWVzXCIgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgLy8gRHVwbGljYXRlIHRoZSBgbmFtZXNgIGFycmF5IHNpbmNlIGl0J3MgcnVkZSB0byBhdWdtZW50IHRoZSB1c2VyIGFyZ3NcbiAgICBjb25zdCBuYW1lcyA9IF9uYW1lcy5zbGljZSgwKTtcbiAgICBjb25zdCBhc3QgPSAoMCwgZXNwcmltYV8xLnBhcnNlU2NyaXB0KShjb2RlKTtcbiAgICAvLyBGaXJzdCBwYXNzIGlzIHRvIGZpbmQgdGhlIGBmdW5jdGlvbmAgbm9kZXMgYW5kIHR1cm4gdGhlbSBpbnRvIGFzeW5jIG9yXG4gICAgLy8gZ2VuZXJhdG9yIGZ1bmN0aW9ucyBvbmx5IGlmIHRoZWlyIGJvZHkgaW5jbHVkZXMgYENhbGxFeHByZXNzaW9uc2AgdG9cbiAgICAvLyBmdW5jdGlvbiBpbiBgbmFtZXNgLiBXZSBhbHNvIGFkZCB0aGUgbmFtZXMgb2YgdGhlIGZ1bmN0aW9ucyB0byB0aGUgYG5hbWVzYFxuICAgIC8vIGFycmF5LiBXZSdsbCBpdGVyYXRlIHNldmVyYWwgdGltZSwgYXMgZXZlcnkgaXRlcmF0aW9uIG1pZ2h0IGFkZCBuZXcgaXRlbXNcbiAgICAvLyB0byB0aGUgYG5hbWVzYCBhcnJheSwgdW50aWwgbm8gbmV3IG5hbWVzIHdlcmUgYWRkZWQgaW4gdGhlIGl0ZXJhdGlvbi5cbiAgICBsZXQgbGFzdE5hbWVzTGVuZ3RoID0gMDtcbiAgICBkbyB7XG4gICAgICAgIGxhc3ROYW1lc0xlbmd0aCA9IG5hbWVzLmxlbmd0aDtcbiAgICAgICAgKDAsIGFzdF90eXBlc18xLnZpc2l0KShhc3QsIHtcbiAgICAgICAgICAgIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihwYXRoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhdGgubm9kZS5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLm5vZGUuZGVjbGFyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHBhdGgubm9kZS5kZWNsYXJhdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5WYXJpYWJsZURlY2xhcmF0b3IuY2hlY2soZGVjbGFyYXRpb24pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKGRlY2xhcmF0aW9uLmluaXQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKGRlY2xhcmF0aW9uLmlkKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTmFtZShkZWNsYXJhdGlvbi5pbml0Lm5hbWUsIG5hbWVzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja05hbWUoZGVjbGFyYXRpb24uaWQubmFtZSwgbmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMucHVzaChkZWNsYXJhdGlvbi5pZC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmlzaXRBc3NpZ25tZW50RXhwcmVzc2lvbihwYXRoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFzdF90eXBlc18xLm5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhwYXRoLm5vZGUubGVmdCkgJiZcbiAgICAgICAgICAgICAgICAgICAgYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKHBhdGgubm9kZS5yaWdodCkgJiZcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tOYW1lKHBhdGgubm9kZS5yaWdodC5uYW1lLCBuYW1lcykgJiZcbiAgICAgICAgICAgICAgICAgICAgIWNoZWNrTmFtZShwYXRoLm5vZGUubGVmdC5uYW1lLCBuYW1lcykpIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZXMucHVzaChwYXRoLm5vZGUubGVmdC5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpc2l0RnVuY3Rpb24ocGF0aCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoLm5vZGUuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNob3VsZERlZ2VuZXJhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIGFzdF90eXBlc18xLnZpc2l0KShwYXRoLm5vZGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0Q2FsbEV4cHJlc3Npb24ocGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja05hbWVzKHBhdGgubm9kZSwgbmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZERlZ2VuZXJhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGREZWdlbmVyYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gR290IGEgXCJmdW5jdGlvblwiIGV4cHJlc3Npb24vc3RhdGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IGl0IGludG8gYW4gYXN5bmMgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgcGF0aC5ub2RlLmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGZ1bmN0aW9uIG5hbWUgdG8gYG5hbWVzYCBhcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrTmFtZShwYXRoLm5vZGUuaWQubmFtZSwgbmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5wdXNoKHBhdGgubm9kZS5pZC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnRyYXZlcnNlKHBhdGgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSB3aGlsZSAobGFzdE5hbWVzTGVuZ3RoICE9PSBuYW1lcy5sZW5ndGgpO1xuICAgIC8vIFNlY29uZCBwYXNzIGlzIGZvciBhZGRpbmcgYGF3YWl0YCBzdGF0ZW1lbnRzIHRvIGFueSBmdW5jdGlvblxuICAgIC8vIGludm9jYXRpb25zIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIGBuYW1lc2AgYXJyYXkuXG4gICAgKDAsIGFzdF90eXBlc18xLnZpc2l0KShhc3QsIHtcbiAgICAgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihwYXRoKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tOYW1lcyhwYXRoLm5vZGUsIG5hbWVzKSkge1xuICAgICAgICAgICAgICAgIC8vIEEgXCJmdW5jdGlvbiBpbnZvY2F0aW9uXCIgZXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGluamVjdCBhbiBgQXdhaXRFeHByZXNzaW9uYFxuICAgICAgICAgICAgICAgIGNvbnN0IGRlbGVnYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBuYW1lLCBwYXJlbnQ6IHsgbm9kZTogcE5vZGUgfSwgfSA9IHBhdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwciA9IGFzdF90eXBlc18xLmJ1aWxkZXJzLmF3YWl0RXhwcmVzc2lvbihwYXRoLm5vZGUsIGRlbGVnYXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5DYWxsRXhwcmVzc2lvbi5jaGVjayhwTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXJndW1lbnRzW25hbWVdID0gZXhwcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBOb2RlW25hbWVdID0gZXhwcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRyYXZlcnNlKHBhdGgpO1xuICAgICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiAoMCwgZXNjb2RlZ2VuXzEuZ2VuZXJhdGUpKGFzdCk7XG59XG5leHBvcnRzLmRlZ2VuZXJhdG9yID0gZGVnZW5lcmF0b3I7XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIGBub2RlYCBoYXMgYSBtYXRjaGluZyBuYW1lIHRvIG9uZSBvZiB0aGUgZW50cmllcyBpbiB0aGVcbiAqIGBuYW1lc2AgYXJyYXkuXG4gKlxuICogQHBhcmFtIHt0eXBlcy5Ob2RlfSBub2RlXG4gKiBAcGFyYW0ge0FycmF5fSBuYW1lcyBBcnJheSBvZiBmdW5jdGlvbiBuYW1lcyB0byByZXR1cm4gdHJ1ZSBmb3JcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tOYW1lcyh7IGNhbGxlZSB9LCBuYW1lcykge1xuICAgIGxldCBuYW1lO1xuICAgIGlmIChhc3RfdHlwZXNfMS5uYW1lZFR5cGVzLklkZW50aWZpZXIuY2hlY2soY2FsbGVlKSkge1xuICAgICAgICBuYW1lID0gY2FsbGVlLm5hbWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzdF90eXBlc18xLm5hbWVkVHlwZXMuTWVtYmVyRXhwcmVzc2lvbi5jaGVjayhjYWxsZWUpKSB7XG4gICAgICAgIGlmIChhc3RfdHlwZXNfMS5uYW1lZFR5cGVzLklkZW50aWZpZXIuY2hlY2soY2FsbGVlLm9iamVjdCkgJiZcbiAgICAgICAgICAgIGFzdF90eXBlc18xLm5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhjYWxsZWUucHJvcGVydHkpKSB7XG4gICAgICAgICAgICBuYW1lID0gYCR7Y2FsbGVlLm9iamVjdC5uYW1lfS4ke2NhbGxlZS5wcm9wZXJ0eS5uYW1lfWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5GdW5jdGlvbkV4cHJlc3Npb24uY2hlY2soY2FsbGVlKSkge1xuICAgICAgICBpZiAoY2FsbGVlLmlkKSB7XG4gICAgICAgICAgICBuYW1lID0gY2FsbGVlLmlkLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gZ2V0IG5hbWUgZm9yOiAke2NhbGxlZS50eXBlfWApO1xuICAgIH1cbiAgICByZXR1cm4gY2hlY2tOYW1lKG5hbWUsIG5hbWVzKTtcbn1cbmZ1bmN0aW9uIGNoZWNrTmFtZShuYW1lLCBuYW1lcykge1xuICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlIGBuYW1lYCwgY2hlY2sgaWYgYW55IGVudHJpZXMgbWF0Y2ggaW4gdGhlIGBuYW1lc2AgYXJyYXlcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG4gPSBuYW1lc1tpXTtcbiAgICAgICAgaWYgKHV0aWxfMS50eXBlcy5pc1JlZ0V4cChuKSkge1xuICAgICAgICAgICAgaWYgKG4udGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWUgPT09IG4pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlZ2VuZXJhdG9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZGVnZW5lcmF0b3JcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbXBpbGVcIiksIGV4cG9ydHMpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICAvLyBodHRwczovL210aHMuYmUvZW1vamlcbiAgcmV0dXJuIC9cXHVEODNDXFx1REZGNFxcdURCNDBcXHVEQzY3XFx1REI0MFxcdURDNjIoPzpcXHVEQjQwXFx1REM2NVxcdURCNDBcXHVEQzZFXFx1REI0MFxcdURDNjd8XFx1REI0MFxcdURDNzNcXHVEQjQwXFx1REM2M1xcdURCNDBcXHVEQzc0fFxcdURCNDBcXHVEQzc3XFx1REI0MFxcdURDNkNcXHVEQjQwXFx1REM3MylcXHVEQjQwXFx1REM3RnxcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NcXHVERkZDXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4XFx1RDgzQ1xcdURGRkJ8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZGXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkVdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkVcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRF0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRFxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQlxcdURGRkNdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1MjAwRCg/OlxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCk/XFx1RDgzRFxcdURDNjh8KD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzY2XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY3XFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKSl8XFx1RDgzRFxcdURDNjZcXHUyMDBEXFx1RDgzRFxcdURDNjZ8XFx1RDgzRFxcdURDNjdcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pfCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKVxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8W1xcdTI2OTVcXHUyNjk2XFx1MjcwOF1cXHVGRTBGfFxcdUQ4M0RbXFx1REM2NlxcdURDNjddfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXwoPzpcXHVEODNDXFx1REZGQlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRVxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQ1xcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XSlcXHVGRTBGfFxcdUQ4M0NcXHVERkZCXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkJcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGQ1xcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OSlcXHVEODNDXFx1REZGQnxcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NcXHVERkZGXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXxcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDEpfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkVcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGRlxcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSkpKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkVdKXwoPzpcXHVEODNFXFx1REREMVxcdUQ4M0NcXHVERkZDXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkRcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjkpKD86XFx1RDgzQ1tcXHVERkZCXFx1REZGQ10pfFxcdUQ4M0RcXHVEQzY5KD86XFx1RDgzQ1xcdURGRkVcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRFxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkNcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkJcXHVERkZELVxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkJcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkMtXFx1REZGRl0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRFxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQlxcdURGRkNcXHVERkZFXFx1REZGRl0pfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHUyMDBEKD86XFx1Mjc2NFxcdUZFMEZcXHUyMDBEKD86XFx1RDgzRFxcdURDOEJcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pfFxcdUQ4M0RbXFx1REM2OFxcdURDNjldKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkZcXHUyMDBEKD86XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pKXxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2OVxcdTIwMEQoPzpcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSkpfCg/OlxcdUQ4M0VcXHVEREQxXFx1RDgzQ1xcdURGRkRcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRVxcdURERDF8XFx1RDgzRFxcdURDNjlcXHVEODNDXFx1REZGRVxcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRF0pfFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY2XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY5XFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKXwoPzpcXHVEODNEXFx1REM0MVxcdUZFMEZcXHUyMDBEXFx1RDgzRFxcdURERTh8XFx1RDgzRFxcdURDNjkoPzpcXHVEODNDXFx1REZGRlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRVxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQ1xcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGQlxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHVEODNDXFx1REZGRFxcdTIwMERbXFx1MjY5NVxcdTI2OTZcXHUyNzA4XXxcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF0pfCg/Oig/OlxcdTI2Rjl8XFx1RDgzQ1tcXHVERkNCXFx1REZDQ118XFx1RDgzRFxcdURENzUpXFx1RkUwRnxcXHVEODNEXFx1REM2RnxcXHVEODNFW1xcdUREM0NcXHVERERFXFx1RERERl0pXFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml18KD86XFx1MjZGOXxcXHVEODNDW1xcdURGQ0JcXHVERkNDXXxcXHVEODNEXFx1REQ3NSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pXFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml18KD86XFx1RDgzQ1tcXHVERkMzXFx1REZDNFxcdURGQ0FdfFxcdUQ4M0RbXFx1REM2RVxcdURDNzFcXHVEQzczXFx1REM3N1xcdURDODFcXHVEQzgyXFx1REM4NlxcdURDODdcXHVERTQ1LVxcdURFNDdcXHVERTRCXFx1REU0RFxcdURFNEVcXHVERUEzXFx1REVCNC1cXHVERUI2XXxcXHVEODNFW1xcdUREMjZcXHVERDM3LVxcdUREMzlcXHVERDNEXFx1REQzRVxcdUREQjhcXHVEREI5XFx1RERDRC1cXHVERENGXFx1RERENi1cXHVEREREXSkoPzooPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pXFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml18XFx1MjAwRFtcXHUyNjQwXFx1MjY0Ml0pfFxcdUQ4M0NcXHVERkY0XFx1MjAwRFxcdTI2MjApXFx1RkUwRnxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8XFx1RDgzQ1xcdURGRjNcXHVGRTBGXFx1MjAwRFxcdUQ4M0NcXHVERjA4fFxcdUQ4M0RcXHVEQzE1XFx1MjAwRFxcdUQ4M0VcXHVEREJBfFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY5XFx1MjAwRFxcdUQ4M0RcXHVEQzY3fFxcdUQ4M0NcXHVEREZEXFx1RDgzQ1xcdURERjB8XFx1RDgzQ1xcdURERjRcXHVEODNDXFx1RERGMnxcXHVEODNDXFx1RERGNlxcdUQ4M0NcXHVEREU2fFsjXFwqMC05XVxcdUZFMEZcXHUyMEUzfFxcdUQ4M0NcXHVEREU3KD86XFx1RDgzQ1tcXHVEREU2XFx1RERFN1xcdURERTktXFx1RERFRlxcdURERjEtXFx1RERGNFxcdURERjYtXFx1RERGOVxcdURERkJcXHVEREZDXFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERGOSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREU5XFx1RERFQi1cXHVEREVEXFx1RERFRi1cXHVEREY0XFx1RERGN1xcdURERjlcXHVEREZCXFx1RERGQ1xcdURERkZdKXxcXHVEODNDXFx1RERFQSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREVBXFx1RERFQ1xcdURERURcXHVEREY3LVxcdURERkFdKXxcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8XFx1RDgzQ1xcdURERjcoPzpcXHVEODNDW1xcdURERUFcXHVEREY0XFx1RERGOFxcdURERkFcXHVEREZDXSl8XFx1RDgzRFxcdURDNjkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfFxcdUQ4M0NcXHVEREYyKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOC1cXHVEREVEXFx1RERGMC1cXHVEREZGXSl8XFx1RDgzQ1xcdURERTYoPzpcXHVEODNDW1xcdURERTgtXFx1RERFQ1xcdURERUVcXHVEREYxXFx1RERGMlxcdURERjRcXHVEREY2LVxcdURERkFcXHVEREZDXFx1RERGRFxcdURERkZdKXxcXHVEODNDXFx1RERGMCg/OlxcdUQ4M0NbXFx1RERFQVxcdURERUMtXFx1RERFRVxcdURERjJcXHVEREYzXFx1RERGNVxcdURERjdcXHVEREZDXFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERFRCg/OlxcdUQ4M0NbXFx1RERGMFxcdURERjJcXHVEREYzXFx1RERGN1xcdURERjlcXHVEREZBXSl8XFx1RDgzQ1xcdURERTkoPzpcXHVEODNDW1xcdURERUFcXHVEREVDXFx1RERFRlxcdURERjBcXHVEREYyXFx1RERGNFxcdURERkZdKXxcXHVEODNDXFx1RERGRSg/OlxcdUQ4M0NbXFx1RERFQVxcdURERjldKXxcXHVEODNDXFx1RERFQyg/OlxcdUQ4M0NbXFx1RERFNlxcdURERTdcXHVEREU5LVxcdURERUVcXHVEREYxLVxcdURERjNcXHVEREY1LVxcdURERkFcXHVEREZDXFx1RERGRV0pfFxcdUQ4M0NcXHVEREY4KD86XFx1RDgzQ1tcXHVEREU2LVxcdURERUFcXHVEREVDLVxcdURERjRcXHVEREY3LVxcdURERjlcXHVEREZCXFx1RERGRC1cXHVEREZGXSl8XFx1RDgzQ1xcdURERUIoPzpcXHVEODNDW1xcdURERUUtXFx1RERGMFxcdURERjJcXHVEREY0XFx1RERGN10pfFxcdUQ4M0NcXHVEREY1KD86XFx1RDgzQ1tcXHVEREU2XFx1RERFQS1cXHVEREVEXFx1RERGMC1cXHVEREYzXFx1RERGNy1cXHVEREY5XFx1RERGQ1xcdURERkVdKXxcXHVEODNDXFx1RERGQig/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREVBXFx1RERFQ1xcdURERUVcXHVEREYzXFx1RERGQV0pfFxcdUQ4M0NcXHVEREYzKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFOFxcdURERUEtXFx1RERFQ1xcdURERUVcXHVEREYxXFx1RERGNFxcdURERjVcXHVEREY3XFx1RERGQVxcdURERkZdKXxcXHVEODNDXFx1RERFOCg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREU5XFx1RERFQi1cXHVEREVFXFx1RERGMC1cXHVEREY1XFx1RERGN1xcdURERkEtXFx1RERGRl0pfFxcdUQ4M0NcXHVEREYxKD86XFx1RDgzQ1tcXHVEREU2LVxcdURERThcXHVEREVFXFx1RERGMFxcdURERjctXFx1RERGQlxcdURERkVdKXxcXHVEODNDXFx1RERGRig/OlxcdUQ4M0NbXFx1RERFNlxcdURERjJcXHVEREZDXSl8XFx1RDgzQ1xcdURERkMoPzpcXHVEODNDW1xcdURERUJcXHVEREY4XSl8XFx1RDgzQ1xcdURERkEoPzpcXHVEODNDW1xcdURERTZcXHVEREVDXFx1RERGMlxcdURERjNcXHVEREY4XFx1RERGRVxcdURERkZdKXxcXHVEODNDXFx1RERFRSg/OlxcdUQ4M0NbXFx1RERFOC1cXHVEREVBXFx1RERGMS1cXHVEREY0XFx1RERGNi1cXHVEREY5XSl8XFx1RDgzQ1xcdURERUYoPzpcXHVEODNDW1xcdURERUFcXHVEREYyXFx1RERGNFxcdURERjVdKXwoPzpcXHVEODNDW1xcdURGQzNcXHVERkM0XFx1REZDQV18XFx1RDgzRFtcXHVEQzZFXFx1REM3MVxcdURDNzNcXHVEQzc3XFx1REM4MVxcdURDODJcXHVEQzg2XFx1REM4N1xcdURFNDUtXFx1REU0N1xcdURFNEJcXHVERTREXFx1REU0RVxcdURFQTNcXHVERUI0LVxcdURFQjZdfFxcdUQ4M0VbXFx1REQyNlxcdUREMzctXFx1REQzOVxcdUREM0RcXHVERDNFXFx1RERCOFxcdUREQjlcXHVERENELVxcdUREQ0ZcXHVEREQ2LVxcdURERERdKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8KD86XFx1MjZGOXxcXHVEODNDW1xcdURGQ0JcXHVERkNDXXxcXHVEODNEXFx1REQ3NSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OltcXHUyNjFEXFx1MjcwQS1cXHUyNzBEXXxcXHVEODNDW1xcdURGODVcXHVERkMyXFx1REZDN118XFx1RDgzRFtcXHVEQzQyXFx1REM0M1xcdURDNDYtXFx1REM1MFxcdURDNjZcXHVEQzY3XFx1REM2Qi1cXHVEQzZEXFx1REM3MFxcdURDNzJcXHVEQzc0LVxcdURDNzZcXHVEQzc4XFx1REM3Q1xcdURDODNcXHVEQzg1XFx1RENBQVxcdURENzRcXHVERDdBXFx1REQ5MFxcdUREOTVcXHVERDk2XFx1REU0Q1xcdURFNEZcXHVERUMwXFx1REVDQ118XFx1RDgzRVtcXHVERDBGXFx1REQxOC1cXHVERDFDXFx1REQxRVxcdUREMUZcXHVERDMwLVxcdUREMzZcXHVEREI1XFx1RERCNlxcdUREQkJcXHVEREQyLVxcdURERDVdKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8KD86W1xcdTIzMUFcXHUyMzFCXFx1MjNFOS1cXHUyM0VDXFx1MjNGMFxcdTIzRjNcXHUyNUZEXFx1MjVGRVxcdTI2MTRcXHUyNjE1XFx1MjY0OC1cXHUyNjUzXFx1MjY3RlxcdTI2OTNcXHUyNkExXFx1MjZBQVxcdTI2QUJcXHUyNkJEXFx1MjZCRVxcdTI2QzRcXHUyNkM1XFx1MjZDRVxcdTI2RDRcXHUyNkVBXFx1MjZGMlxcdTI2RjNcXHUyNkY1XFx1MjZGQVxcdTI2RkRcXHUyNzA1XFx1MjcwQVxcdTI3MEJcXHUyNzI4XFx1Mjc0Q1xcdTI3NEVcXHUyNzUzLVxcdTI3NTVcXHUyNzU3XFx1Mjc5NS1cXHUyNzk3XFx1MjdCMFxcdTI3QkZcXHUyQjFCXFx1MkIxQ1xcdTJCNTBcXHUyQjU1XXxcXHVEODNDW1xcdURDMDRcXHVEQ0NGXFx1REQ4RVxcdUREOTEtXFx1REQ5QVxcdURERTYtXFx1RERGRlxcdURFMDFcXHVERTFBXFx1REUyRlxcdURFMzItXFx1REUzNlxcdURFMzgtXFx1REUzQVxcdURFNTBcXHVERTUxXFx1REYwMC1cXHVERjIwXFx1REYyRC1cXHVERjM1XFx1REYzNy1cXHVERjdDXFx1REY3RS1cXHVERjkzXFx1REZBMC1cXHVERkNBXFx1REZDRi1cXHVERkQzXFx1REZFMC1cXHVERkYwXFx1REZGNFxcdURGRjgtXFx1REZGRl18XFx1RDgzRFtcXHVEQzAwLVxcdURDM0VcXHVEQzQwXFx1REM0Mi1cXHVEQ0ZDXFx1RENGRi1cXHVERDNEXFx1REQ0Qi1cXHVERDRFXFx1REQ1MC1cXHVERDY3XFx1REQ3QVxcdUREOTVcXHVERDk2XFx1RERBNFxcdURERkItXFx1REU0RlxcdURFODAtXFx1REVDNVxcdURFQ0NcXHVERUQwLVxcdURFRDJcXHVERUQ1XFx1REVFQlxcdURFRUNcXHVERUY0LVxcdURFRkFcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwRC1cXHVERDNBXFx1REQzQy1cXHVERDQ1XFx1REQ0Ny1cXHVERDcxXFx1REQ3My1cXHVERDc2XFx1REQ3QS1cXHVEREEyXFx1RERBNS1cXHVEREFBXFx1RERBRS1cXHVERENBXFx1RERDRC1cXHVEREZGXFx1REU3MC1cXHVERTczXFx1REU3OC1cXHVERTdBXFx1REU4MC1cXHVERTgyXFx1REU5MC1cXHVERTk1XSl8KD86WyNcXCowLTlcXHhBOVxceEFFXFx1MjAzQ1xcdTIwNDlcXHUyMTIyXFx1MjEzOVxcdTIxOTQtXFx1MjE5OVxcdTIxQTlcXHUyMUFBXFx1MjMxQVxcdTIzMUJcXHUyMzI4XFx1MjNDRlxcdTIzRTktXFx1MjNGM1xcdTIzRjgtXFx1MjNGQVxcdTI0QzJcXHUyNUFBXFx1MjVBQlxcdTI1QjZcXHUyNUMwXFx1MjVGQi1cXHUyNUZFXFx1MjYwMC1cXHUyNjA0XFx1MjYwRVxcdTI2MTFcXHUyNjE0XFx1MjYxNVxcdTI2MThcXHUyNjFEXFx1MjYyMFxcdTI2MjJcXHUyNjIzXFx1MjYyNlxcdTI2MkFcXHUyNjJFXFx1MjYyRlxcdTI2MzgtXFx1MjYzQVxcdTI2NDBcXHUyNjQyXFx1MjY0OC1cXHUyNjUzXFx1MjY1RlxcdTI2NjBcXHUyNjYzXFx1MjY2NVxcdTI2NjZcXHUyNjY4XFx1MjY3QlxcdTI2N0VcXHUyNjdGXFx1MjY5Mi1cXHUyNjk3XFx1MjY5OVxcdTI2OUJcXHUyNjlDXFx1MjZBMFxcdTI2QTFcXHUyNkFBXFx1MjZBQlxcdTI2QjBcXHUyNkIxXFx1MjZCRFxcdTI2QkVcXHUyNkM0XFx1MjZDNVxcdTI2QzhcXHUyNkNFXFx1MjZDRlxcdTI2RDFcXHUyNkQzXFx1MjZENFxcdTI2RTlcXHUyNkVBXFx1MjZGMC1cXHUyNkY1XFx1MjZGNy1cXHUyNkZBXFx1MjZGRFxcdTI3MDJcXHUyNzA1XFx1MjcwOC1cXHUyNzBEXFx1MjcwRlxcdTI3MTJcXHUyNzE0XFx1MjcxNlxcdTI3MURcXHUyNzIxXFx1MjcyOFxcdTI3MzNcXHUyNzM0XFx1Mjc0NFxcdTI3NDdcXHUyNzRDXFx1Mjc0RVxcdTI3NTMtXFx1Mjc1NVxcdTI3NTdcXHUyNzYzXFx1Mjc2NFxcdTI3OTUtXFx1Mjc5N1xcdTI3QTFcXHUyN0IwXFx1MjdCRlxcdTI5MzRcXHUyOTM1XFx1MkIwNS1cXHUyQjA3XFx1MkIxQlxcdTJCMUNcXHUyQjUwXFx1MkI1NVxcdTMwMzBcXHUzMDNEXFx1MzI5N1xcdTMyOTldfFxcdUQ4M0NbXFx1REMwNFxcdURDQ0ZcXHVERDcwXFx1REQ3MVxcdUREN0VcXHVERDdGXFx1REQ4RVxcdUREOTEtXFx1REQ5QVxcdURERTYtXFx1RERGRlxcdURFMDFcXHVERTAyXFx1REUxQVxcdURFMkZcXHVERTMyLVxcdURFM0FcXHVERTUwXFx1REU1MVxcdURGMDAtXFx1REYyMVxcdURGMjQtXFx1REY5M1xcdURGOTZcXHVERjk3XFx1REY5OS1cXHVERjlCXFx1REY5RS1cXHVERkYwXFx1REZGMy1cXHVERkY1XFx1REZGNy1cXHVERkZGXXxcXHVEODNEW1xcdURDMDAtXFx1RENGRFxcdURDRkYtXFx1REQzRFxcdURENDktXFx1REQ0RVxcdURENTAtXFx1REQ2N1xcdURENkZcXHVERDcwXFx1REQ3My1cXHVERDdBXFx1REQ4N1xcdUREOEEtXFx1REQ4RFxcdUREOTBcXHVERDk1XFx1REQ5NlxcdUREQTRcXHVEREE1XFx1RERBOFxcdUREQjFcXHVEREIyXFx1RERCQ1xcdUREQzItXFx1RERDNFxcdURERDEtXFx1REREM1xcdUREREMtXFx1RERERVxcdURERTFcXHVEREUzXFx1RERFOFxcdURERUZcXHVEREYzXFx1RERGQS1cXHVERTRGXFx1REU4MC1cXHVERUM1XFx1REVDQi1cXHVERUQyXFx1REVENVxcdURFRTAtXFx1REVFNVxcdURFRTlcXHVERUVCXFx1REVFQ1xcdURFRjBcXHVERUYzLVxcdURFRkFcXHVERkUwLVxcdURGRUJdfFxcdUQ4M0VbXFx1REQwRC1cXHVERDNBXFx1REQzQy1cXHVERDQ1XFx1REQ0Ny1cXHVERDcxXFx1REQ3My1cXHVERDc2XFx1REQ3QS1cXHVEREEyXFx1RERBNS1cXHVEREFBXFx1RERBRS1cXHVERENBXFx1RERDRC1cXHVEREZGXFx1REU3MC1cXHVERTczXFx1REU3OC1cXHVERTdBXFx1REU4MC1cXHVERTgyXFx1REU5MC1cXHVERTk1XSlcXHVGRTBGfCg/OltcXHUyNjFEXFx1MjZGOVxcdTI3MEEtXFx1MjcwRF18XFx1RDgzQ1tcXHVERjg1XFx1REZDMi1cXHVERkM0XFx1REZDN1xcdURGQ0EtXFx1REZDQ118XFx1RDgzRFtcXHVEQzQyXFx1REM0M1xcdURDNDYtXFx1REM1MFxcdURDNjYtXFx1REM3OFxcdURDN0NcXHVEQzgxLVxcdURDODNcXHVEQzg1LVxcdURDODdcXHVEQzhGXFx1REM5MVxcdURDQUFcXHVERDc0XFx1REQ3NVxcdUREN0FcXHVERDkwXFx1REQ5NVxcdUREOTZcXHVERTQ1LVxcdURFNDdcXHVERTRCLVxcdURFNEZcXHVERUEzXFx1REVCNC1cXHVERUI2XFx1REVDMFxcdURFQ0NdfFxcdUQ4M0VbXFx1REQwRlxcdUREMTgtXFx1REQxRlxcdUREMjZcXHVERDMwLVxcdUREMzlcXHVERDNDLVxcdUREM0VcXHVEREI1XFx1RERCNlxcdUREQjhcXHVEREI5XFx1RERCQlxcdUREQ0QtXFx1RERDRlxcdURERDEtXFx1RERERF0pL2c7XG59O1xuIiwidmFyIG9uY2UgPSByZXF1aXJlKCdvbmNlJyk7XG5cbnZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcblxudmFyIGlzUmVxdWVzdCA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuXHRyZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiB0eXBlb2Ygc3RyZWFtLmFib3J0ID09PSAnZnVuY3Rpb24nO1xufTtcblxudmFyIGlzQ2hpbGRQcm9jZXNzID0gZnVuY3Rpb24oc3RyZWFtKSB7XG5cdHJldHVybiBzdHJlYW0uc3RkaW8gJiYgQXJyYXkuaXNBcnJheShzdHJlYW0uc3RkaW8pICYmIHN0cmVhbS5zdGRpby5sZW5ndGggPT09IDNcbn07XG5cbnZhciBlb3MgPSBmdW5jdGlvbihzdHJlYW0sIG9wdHMsIGNhbGxiYWNrKSB7XG5cdGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVvcyhzdHJlYW0sIG51bGwsIG9wdHMpO1xuXHRpZiAoIW9wdHMpIG9wdHMgPSB7fTtcblxuXHRjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2sgfHwgbm9vcCk7XG5cblx0dmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuXHR2YXIgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cdHZhciByZWFkYWJsZSA9IG9wdHMucmVhZGFibGUgfHwgKG9wdHMucmVhZGFibGUgIT09IGZhbHNlICYmIHN0cmVhbS5yZWFkYWJsZSk7XG5cdHZhciB3cml0YWJsZSA9IG9wdHMud3JpdGFibGUgfHwgKG9wdHMud3JpdGFibGUgIT09IGZhbHNlICYmIHN0cmVhbS53cml0YWJsZSk7XG5cdHZhciBjYW5jZWxsZWQgPSBmYWxzZTtcblxuXHR2YXIgb25sZWdhY3lmaW5pc2ggPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXN0cmVhbS53cml0YWJsZSkgb25maW5pc2goKTtcblx0fTtcblxuXHR2YXIgb25maW5pc2ggPSBmdW5jdGlvbigpIHtcblx0XHR3cml0YWJsZSA9IGZhbHNlO1xuXHRcdGlmICghcmVhZGFibGUpIGNhbGxiYWNrLmNhbGwoc3RyZWFtKTtcblx0fTtcblxuXHR2YXIgb25lbmQgPSBmdW5jdGlvbigpIHtcblx0XHRyZWFkYWJsZSA9IGZhbHNlO1xuXHRcdGlmICghd3JpdGFibGUpIGNhbGxiYWNrLmNhbGwoc3RyZWFtKTtcblx0fTtcblxuXHR2YXIgb25leGl0ID0gZnVuY3Rpb24oZXhpdENvZGUpIHtcblx0XHRjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXhpdENvZGUgPyBuZXcgRXJyb3IoJ2V4aXRlZCB3aXRoIGVycm9yIGNvZGU6ICcgKyBleGl0Q29kZSkgOiBudWxsKTtcblx0fTtcblxuXHR2YXIgb25lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuXHRcdGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBlcnIpO1xuXHR9O1xuXG5cdHZhciBvbmNsb3NlID0gZnVuY3Rpb24oKSB7XG5cdFx0cHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlbmV4dHRpY2spO1xuXHR9O1xuXG5cdHZhciBvbmNsb3NlbmV4dHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoY2FuY2VsbGVkKSByZXR1cm47XG5cdFx0aWYgKHJlYWRhYmxlICYmICEocnMgJiYgKHJzLmVuZGVkICYmICFycy5kZXN0cm95ZWQpKSkgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBuZXcgRXJyb3IoJ3ByZW1hdHVyZSBjbG9zZScpKTtcblx0XHRpZiAod3JpdGFibGUgJiYgISh3cyAmJiAod3MuZW5kZWQgJiYgIXdzLmRlc3Ryb3llZCkpKSByZXR1cm4gY2FsbGJhY2suY2FsbChzdHJlYW0sIG5ldyBFcnJvcigncHJlbWF0dXJlIGNsb3NlJykpO1xuXHR9O1xuXG5cdHZhciBvbnJlcXVlc3QgPSBmdW5jdGlvbigpIHtcblx0XHRzdHJlYW0ucmVxLm9uKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cdH07XG5cblx0aWYgKGlzUmVxdWVzdChzdHJlYW0pKSB7XG5cdFx0c3RyZWFtLm9uKCdjb21wbGV0ZScsIG9uZmluaXNoKTtcblx0XHRzdHJlYW0ub24oJ2Fib3J0Jywgb25jbG9zZSk7XG5cdFx0aWYgKHN0cmVhbS5yZXEpIG9ucmVxdWVzdCgpO1xuXHRcdGVsc2Ugc3RyZWFtLm9uKCdyZXF1ZXN0Jywgb25yZXF1ZXN0KTtcblx0fSBlbHNlIGlmICh3cml0YWJsZSAmJiAhd3MpIHsgLy8gbGVnYWN5IHN0cmVhbXNcblx0XHRzdHJlYW0ub24oJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKTtcblx0XHRzdHJlYW0ub24oJ2Nsb3NlJywgb25sZWdhY3lmaW5pc2gpO1xuXHR9XG5cblx0aWYgKGlzQ2hpbGRQcm9jZXNzKHN0cmVhbSkpIHN0cmVhbS5vbignZXhpdCcsIG9uZXhpdCk7XG5cblx0c3RyZWFtLm9uKCdlbmQnLCBvbmVuZCk7XG5cdHN0cmVhbS5vbignZmluaXNoJywgb25maW5pc2gpO1xuXHRpZiAob3B0cy5lcnJvciAhPT0gZmFsc2UpIHN0cmVhbS5vbignZXJyb3InLCBvbmVycm9yKTtcblx0c3RyZWFtLm9uKCdjbG9zZScsIG9uY2xvc2UpO1xuXG5cdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRjYW5jZWxsZWQgPSB0cnVlO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY29tcGxldGUnLCBvbmZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdhYm9ydCcsIG9uY2xvc2UpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigncmVxdWVzdCcsIG9ucmVxdWVzdCk7XG5cdFx0aWYgKHN0cmVhbS5yZXEpIHN0cmVhbS5yZXEucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9ubGVnYWN5ZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25sZWdhY3lmaW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXhpdCcsIG9uZXhpdCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcblx0fTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZW9zO1xuIiwiY29uc3QgeyBkaXJuYW1lLCByZXNvbHZlIH0gPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCB7IHJlYWRkaXJTeW5jLCBzdGF0U3luYyB9ID0gcmVxdWlyZSgnZnMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RhcnQsIGNhbGxiYWNrKSB7XG5cdGxldCBkaXIgPSByZXNvbHZlKCcuJywgc3RhcnQpO1xuXHRsZXQgdG1wLCBzdGF0cyA9IHN0YXRTeW5jKGRpcik7XG5cblx0aWYgKCFzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG5cdFx0ZGlyID0gZGlybmFtZShkaXIpO1xuXHR9XG5cblx0d2hpbGUgKHRydWUpIHtcblx0XHR0bXAgPSBjYWxsYmFjayhkaXIsIHJlYWRkaXJTeW5jKGRpcikpO1xuXHRcdGlmICh0bXApIHJldHVybiByZXNvbHZlKGRpciwgdG1wKTtcblx0XHRkaXIgPSBkaXJuYW1lKHRtcCA9IGRpcik7XG5cdFx0aWYgKHRtcCA9PT0gZGlyKSBicmVhaztcblx0fVxufVxuIiwiLypcbiAgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTQgWXVzdWtlIFN1enVraSA8dXRhdGFuZS50ZWFAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTUgSW5ndmFyIFN0ZXBhbnlhbiA8bWVAcnJldmVyc2VyLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDE0IEl2YW4gTmlrdWxpbiA8aWZhYWFuQGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgTWljaGFlbCBGaWNhcnJhIDxlc2NvZGVnZW4uY29weXJpZ2h0QG1pY2hhZWwuZmljYXJyYS5tZT5cbiAgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTMgTWF0aGlhcyBCeW5lbnMgPG1hdGhpYXNAcWl3aS5iZT5cbiAgQ29weXJpZ2h0IChDKSAyMDEzIElyYWtsaSBHb3phbGlzaHZpbGkgPHJmb2JpY0BnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMiBSb2JlcnQgR3VzdC1CYXJkb24gPGRvbmF0ZUByb2JlcnQuZ3VzdC1iYXJkb24ub3JnPlxuICBDb3B5cmlnaHQgKEMpIDIwMTIgSm9obiBGcmVlbWFuIDxqZnJlZW1hbjA4QGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgQXJpeWEgSGlkYXlhdCA8YXJpeWEuaGlkYXlhdEBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMiBKb29zdC1XaW0gQm9la2VzdGVpam4gPGpvb3N0LXdpbUBib2VrZXN0ZWlqbi5ubD5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIEtyaXMgS293YWwgPGtyaXMua293YWxAY2l4YXIuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTIgQXJwYWQgQm9yc29zIDxhcnBhZC5ib3Jzb3NAZ29vZ2xlbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuLypnbG9iYWwgZXhwb3J0czp0cnVlLCByZXF1aXJlOnRydWUsIGdsb2JhbDp0cnVlKi9cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIFN5bnRheCxcbiAgICAgICAgUHJlY2VkZW5jZSxcbiAgICAgICAgQmluYXJ5UHJlY2VkZW5jZSxcbiAgICAgICAgU291cmNlTm9kZSxcbiAgICAgICAgZXN0cmF2ZXJzZSxcbiAgICAgICAgZXN1dGlscyxcbiAgICAgICAgYmFzZSxcbiAgICAgICAgaW5kZW50LFxuICAgICAgICBqc29uLFxuICAgICAgICByZW51bWJlcixcbiAgICAgICAgaGV4YWRlY2ltYWwsXG4gICAgICAgIHF1b3RlcyxcbiAgICAgICAgZXNjYXBlbGVzcyxcbiAgICAgICAgbmV3bGluZSxcbiAgICAgICAgc3BhY2UsXG4gICAgICAgIHBhcmVudGhlc2VzLFxuICAgICAgICBzZW1pY29sb25zLFxuICAgICAgICBzYWZlQ29uY2F0ZW5hdGlvbixcbiAgICAgICAgZGlyZWN0aXZlLFxuICAgICAgICBleHRyYSxcbiAgICAgICAgcGFyc2UsXG4gICAgICAgIHNvdXJjZU1hcCxcbiAgICAgICAgc291cmNlQ29kZSxcbiAgICAgICAgcHJlc2VydmVCbGFua0xpbmVzLFxuICAgICAgICBGT1JNQVRfTUlOSUZZLFxuICAgICAgICBGT1JNQVRfREVGQVVMVFM7XG5cbiAgICBlc3RyYXZlcnNlID0gcmVxdWlyZSgnZXN0cmF2ZXJzZScpO1xuICAgIGVzdXRpbHMgPSByZXF1aXJlKCdlc3V0aWxzJyk7XG5cbiAgICBTeW50YXggPSBlc3RyYXZlcnNlLlN5bnRheDtcblxuICAgIC8vIEdlbmVyYXRpb24gaXMgZG9uZSBieSBnZW5lcmF0ZUV4cHJlc3Npb24uXG4gICAgZnVuY3Rpb24gaXNFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIENvZGVHZW5lcmF0b3IuRXhwcmVzc2lvbi5oYXNPd25Qcm9wZXJ0eShub2RlLnR5cGUpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRpb24gaXMgZG9uZSBieSBnZW5lcmF0ZVN0YXRlbWVudC5cbiAgICBmdW5jdGlvbiBpc1N0YXRlbWVudChub2RlKSB7XG4gICAgICAgIHJldHVybiBDb2RlR2VuZXJhdG9yLlN0YXRlbWVudC5oYXNPd25Qcm9wZXJ0eShub2RlLnR5cGUpO1xuICAgIH1cblxuICAgIFByZWNlZGVuY2UgPSB7XG4gICAgICAgIFNlcXVlbmNlOiAwLFxuICAgICAgICBZaWVsZDogMSxcbiAgICAgICAgQXNzaWdubWVudDogMSxcbiAgICAgICAgQ29uZGl0aW9uYWw6IDIsXG4gICAgICAgIEFycm93RnVuY3Rpb246IDIsXG4gICAgICAgIENvYWxlc2NlOiAzLFxuICAgICAgICBMb2dpY2FsT1I6IDQsXG4gICAgICAgIExvZ2ljYWxBTkQ6IDUsXG4gICAgICAgIEJpdHdpc2VPUjogNixcbiAgICAgICAgQml0d2lzZVhPUjogNyxcbiAgICAgICAgQml0d2lzZUFORDogOCxcbiAgICAgICAgRXF1YWxpdHk6IDksXG4gICAgICAgIFJlbGF0aW9uYWw6IDEwLFxuICAgICAgICBCaXR3aXNlU0hJRlQ6IDExLFxuICAgICAgICBBZGRpdGl2ZTogMTIsXG4gICAgICAgIE11bHRpcGxpY2F0aXZlOiAxMyxcbiAgICAgICAgRXhwb25lbnRpYXRpb246IDE0LFxuICAgICAgICBBd2FpdDogMTUsXG4gICAgICAgIFVuYXJ5OiAxNSxcbiAgICAgICAgUG9zdGZpeDogMTYsXG4gICAgICAgIE9wdGlvbmFsQ2hhaW5pbmc6IDE3LFxuICAgICAgICBDYWxsOiAxOCxcbiAgICAgICAgTmV3OiAxOSxcbiAgICAgICAgVGFnZ2VkVGVtcGxhdGU6IDIwLFxuICAgICAgICBNZW1iZXI6IDIxLFxuICAgICAgICBQcmltYXJ5OiAyMlxuICAgIH07XG5cbiAgICBCaW5hcnlQcmVjZWRlbmNlID0ge1xuICAgICAgICAnPz8nOiBQcmVjZWRlbmNlLkNvYWxlc2NlLFxuICAgICAgICAnfHwnOiBQcmVjZWRlbmNlLkxvZ2ljYWxPUixcbiAgICAgICAgJyYmJzogUHJlY2VkZW5jZS5Mb2dpY2FsQU5ELFxuICAgICAgICAnfCc6IFByZWNlZGVuY2UuQml0d2lzZU9SLFxuICAgICAgICAnXic6IFByZWNlZGVuY2UuQml0d2lzZVhPUixcbiAgICAgICAgJyYnOiBQcmVjZWRlbmNlLkJpdHdpc2VBTkQsXG4gICAgICAgICc9PSc6IFByZWNlZGVuY2UuRXF1YWxpdHksXG4gICAgICAgICchPSc6IFByZWNlZGVuY2UuRXF1YWxpdHksXG4gICAgICAgICc9PT0nOiBQcmVjZWRlbmNlLkVxdWFsaXR5LFxuICAgICAgICAnIT09JzogUHJlY2VkZW5jZS5FcXVhbGl0eSxcbiAgICAgICAgJ2lzJzogUHJlY2VkZW5jZS5FcXVhbGl0eSxcbiAgICAgICAgJ2lzbnQnOiBQcmVjZWRlbmNlLkVxdWFsaXR5LFxuICAgICAgICAnPCc6IFByZWNlZGVuY2UuUmVsYXRpb25hbCxcbiAgICAgICAgJz4nOiBQcmVjZWRlbmNlLlJlbGF0aW9uYWwsXG4gICAgICAgICc8PSc6IFByZWNlZGVuY2UuUmVsYXRpb25hbCxcbiAgICAgICAgJz49JzogUHJlY2VkZW5jZS5SZWxhdGlvbmFsLFxuICAgICAgICAnaW4nOiBQcmVjZWRlbmNlLlJlbGF0aW9uYWwsXG4gICAgICAgICdpbnN0YW5jZW9mJzogUHJlY2VkZW5jZS5SZWxhdGlvbmFsLFxuICAgICAgICAnPDwnOiBQcmVjZWRlbmNlLkJpdHdpc2VTSElGVCxcbiAgICAgICAgJz4+JzogUHJlY2VkZW5jZS5CaXR3aXNlU0hJRlQsXG4gICAgICAgICc+Pj4nOiBQcmVjZWRlbmNlLkJpdHdpc2VTSElGVCxcbiAgICAgICAgJysnOiBQcmVjZWRlbmNlLkFkZGl0aXZlLFxuICAgICAgICAnLSc6IFByZWNlZGVuY2UuQWRkaXRpdmUsXG4gICAgICAgICcqJzogUHJlY2VkZW5jZS5NdWx0aXBsaWNhdGl2ZSxcbiAgICAgICAgJyUnOiBQcmVjZWRlbmNlLk11bHRpcGxpY2F0aXZlLFxuICAgICAgICAnLyc6IFByZWNlZGVuY2UuTXVsdGlwbGljYXRpdmUsXG4gICAgICAgICcqKic6IFByZWNlZGVuY2UuRXhwb25lbnRpYXRpb25cbiAgICB9O1xuXG4gICAgLy9GbGFnc1xuICAgIHZhciBGX0FMTE9XX0lOID0gMSxcbiAgICAgICAgRl9BTExPV19DQUxMID0gMSA8PCAxLFxuICAgICAgICBGX0FMTE9XX1VOUEFSQVRIX05FVyA9IDEgPDwgMixcbiAgICAgICAgRl9GVU5DX0JPRFkgPSAxIDw8IDMsXG4gICAgICAgIEZfRElSRUNUSVZFX0NUWCA9IDEgPDwgNCxcbiAgICAgICAgRl9TRU1JQ09MT05fT1BUID0gMSA8PCA1LFxuICAgICAgICBGX0ZPVU5EX0NPQUxFU0NFID0gMSA8PCA2O1xuXG4gICAgLy9FeHByZXNzaW9uIGZsYWcgc2V0c1xuICAgIC8vTk9URTogRmxhZyBvcmRlcjpcbiAgICAvLyBGX0FMTE9XX0lOXG4gICAgLy8gRl9BTExPV19DQUxMXG4gICAgLy8gRl9BTExPV19VTlBBUkFUSF9ORVdcbiAgICB2YXIgRV9GVFQgPSBGX0FMTE9XX0NBTEwgfCBGX0FMTE9XX1VOUEFSQVRIX05FVyxcbiAgICAgICAgRV9UVEYgPSBGX0FMTE9XX0lOIHwgRl9BTExPV19DQUxMLFxuICAgICAgICBFX1RUVCA9IEZfQUxMT1dfSU4gfCBGX0FMTE9XX0NBTEwgfCBGX0FMTE9XX1VOUEFSQVRIX05FVyxcbiAgICAgICAgRV9URkYgPSBGX0FMTE9XX0lOLFxuICAgICAgICBFX0ZGVCA9IEZfQUxMT1dfVU5QQVJBVEhfTkVXLFxuICAgICAgICBFX1RGVCA9IEZfQUxMT1dfSU4gfCBGX0FMTE9XX1VOUEFSQVRIX05FVztcblxuICAgIC8vU3RhdGVtZW50IGZsYWcgc2V0c1xuICAgIC8vTk9URTogRmxhZyBvcmRlcjpcbiAgICAvLyBGX0FMTE9XX0lOXG4gICAgLy8gRl9GVU5DX0JPRFlcbiAgICAvLyBGX0RJUkVDVElWRV9DVFhcbiAgICAvLyBGX1NFTUlDT0xPTl9PUFRcbiAgICB2YXIgU19URkZGID0gRl9BTExPV19JTixcbiAgICAgICAgU19URkZUID0gRl9BTExPV19JTiB8IEZfU0VNSUNPTE9OX09QVCxcbiAgICAgICAgU19GRkZGID0gMHgwMCxcbiAgICAgICAgU19URlRGID0gRl9BTExPV19JTiB8IEZfRElSRUNUSVZFX0NUWCxcbiAgICAgICAgU19UVEZGID0gRl9BTExPV19JTiB8IEZfRlVOQ19CT0RZO1xuXG4gICAgZnVuY3Rpb24gZ2V0RGVmYXVsdE9wdGlvbnMoKSB7XG4gICAgICAgIC8vIGRlZmF1bHQgb3B0aW9uc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5kZW50OiBudWxsLFxuICAgICAgICAgICAgYmFzZTogbnVsbCxcbiAgICAgICAgICAgIHBhcnNlOiBudWxsLFxuICAgICAgICAgICAgY29tbWVudDogZmFsc2UsXG4gICAgICAgICAgICBmb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICBpbmRlbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICcgICAgJyxcbiAgICAgICAgICAgICAgICAgICAgYmFzZTogMCxcbiAgICAgICAgICAgICAgICAgICAgYWRqdXN0TXVsdGlsaW5lQ29tbWVudDogZmFsc2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5ld2xpbmU6ICdcXG4nLFxuICAgICAgICAgICAgICAgIHNwYWNlOiAnICcsXG4gICAgICAgICAgICAgICAganNvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVudW1iZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGhleGFkZWNpbWFsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBxdW90ZXM6ICdzaW5nbGUnLFxuICAgICAgICAgICAgICAgIGVzY2FwZWxlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbXBhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHBhcmVudGhlc2VzOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNlbWljb2xvbnM6IHRydWUsXG4gICAgICAgICAgICAgICAgc2FmZUNvbmNhdGVuYXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIHByZXNlcnZlQmxhbmtMaW5lczogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3o6IHtcbiAgICAgICAgICAgICAgICBjb21wcmVoZW5zaW9uRXhwcmVzc2lvblN0YXJ0c1dpdGhBc3NpZ25tZW50OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdGFybGVzc0dlbmVyYXRvcjogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzb3VyY2VNYXA6IG51bGwsXG4gICAgICAgICAgICBzb3VyY2VNYXBSb290OiBudWxsLFxuICAgICAgICAgICAgc291cmNlTWFwV2l0aENvZGU6IGZhbHNlLFxuICAgICAgICAgICAgZGlyZWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgIHJhdzogdHJ1ZSxcbiAgICAgICAgICAgIHZlcmJhdGltOiBudWxsLFxuICAgICAgICAgICAgc291cmNlQ29kZTogbnVsbFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0cmluZ1JlcGVhdChzdHIsIG51bSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XG5cbiAgICAgICAgZm9yIChudW0gfD0gMDsgbnVtID4gMDsgbnVtID4+Pj0gMSwgc3RyICs9IHN0cikge1xuICAgICAgICAgICAgaWYgKG51bSAmIDEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gc3RyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNMaW5lVGVybWluYXRvcihzdHIpIHtcbiAgICAgICAgcmV0dXJuICgvW1xcclxcbl0vZykudGVzdChzdHIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZHNXaXRoTGluZVRlcm1pbmF0b3Ioc3RyKSB7XG4gICAgICAgIHZhciBsZW4gPSBzdHIubGVuZ3RoO1xuICAgICAgICByZXR1cm4gbGVuICYmIGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKHN0ci5jaGFyQ29kZUF0KGxlbiAtIDEpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZSh0YXJnZXQsIG92ZXJyaWRlKSB7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoa2V5IGluIG92ZXJyaWRlKSB7XG4gICAgICAgICAgICBpZiAob3ZlcnJpZGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gb3ZlcnJpZGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZURlZXBseSh0YXJnZXQsIG92ZXJyaWRlKSB7XG4gICAgICAgIHZhciBrZXksIHZhbDtcblxuICAgICAgICBmdW5jdGlvbiBpc0hhc2hPYmplY3QodGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcgJiYgdGFyZ2V0IGluc3RhbmNlb2YgT2JqZWN0ICYmICEodGFyZ2V0IGluc3RhbmNlb2YgUmVnRXhwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoa2V5IGluIG92ZXJyaWRlKSB7XG4gICAgICAgICAgICBpZiAob3ZlcnJpZGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIHZhbCA9IG92ZXJyaWRlW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGlzSGFzaE9iamVjdCh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0hhc2hPYmplY3QodGFyZ2V0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVEZWVwbHkodGFyZ2V0W2tleV0sIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHVwZGF0ZURlZXBseSh7fSwgdmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlTnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQsIHBvaW50LCB0ZW1wLCBleHBvbmVudCwgcG9zO1xuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTnVtZXJpYyBsaXRlcmFsIHdob3NlIHZhbHVlIGlzIE5hTicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ051bWVyaWMgbGl0ZXJhbCB3aG9zZSB2YWx1ZSBpcyBuZWdhdGl2ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSAxIC8gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGpzb24gPyAnbnVsbCcgOiByZW51bWJlciA/ICcxZTQwMCcgOiAnMWUrNDAwJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9ICcnICsgdmFsdWU7XG4gICAgICAgIGlmICghcmVudW1iZXIgfHwgcmVzdWx0Lmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBwb2ludCA9IHJlc3VsdC5pbmRleE9mKCcuJyk7XG4gICAgICAgIGlmICghanNvbiAmJiByZXN1bHQuY2hhckNvZGVBdCgwKSA9PT0gMHgzMCAgLyogMCAqLyAmJiBwb2ludCA9PT0gMSkge1xuICAgICAgICAgICAgcG9pbnQgPSAwO1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXAgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKCdlKycsICdlJyk7XG4gICAgICAgIGV4cG9uZW50ID0gMDtcbiAgICAgICAgaWYgKChwb3MgPSB0ZW1wLmluZGV4T2YoJ2UnKSkgPiAwKSB7XG4gICAgICAgICAgICBleHBvbmVudCA9ICt0ZW1wLnNsaWNlKHBvcyArIDEpO1xuICAgICAgICAgICAgdGVtcCA9IHRlbXAuc2xpY2UoMCwgcG9zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9pbnQgPj0gMCkge1xuICAgICAgICAgICAgZXhwb25lbnQgLT0gdGVtcC5sZW5ndGggLSBwb2ludCAtIDE7XG4gICAgICAgICAgICB0ZW1wID0gKyh0ZW1wLnNsaWNlKDAsIHBvaW50KSArIHRlbXAuc2xpY2UocG9pbnQgKyAxKSkgKyAnJztcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSAwO1xuICAgICAgICB3aGlsZSAodGVtcC5jaGFyQ29kZUF0KHRlbXAubGVuZ3RoICsgcG9zIC0gMSkgPT09IDB4MzAgIC8qIDAgKi8pIHtcbiAgICAgICAgICAgIC0tcG9zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3MgIT09IDApIHtcbiAgICAgICAgICAgIGV4cG9uZW50IC09IHBvcztcbiAgICAgICAgICAgIHRlbXAgPSB0ZW1wLnNsaWNlKDAsIHBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cG9uZW50ICE9PSAwKSB7XG4gICAgICAgICAgICB0ZW1wICs9ICdlJyArIGV4cG9uZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICgodGVtcC5sZW5ndGggPCByZXN1bHQubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgIChoZXhhZGVjaW1hbCAmJiB2YWx1ZSA+IDFlMTIgJiYgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlICYmICh0ZW1wID0gJzB4JyArIHZhbHVlLnRvU3RyaW5nKDE2KSkubGVuZ3RoIDwgcmVzdWx0Lmxlbmd0aCkpICYmXG4gICAgICAgICAgICAgICAgK3RlbXAgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0ZW1wO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSB2YWxpZCBSZWdFeHAgZXhwcmVzc2lvbi5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9Db25zdGVsbGF0aW9uL2l2IEVuZ2luZVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwQ2hhcmFjdGVyKGNoLCBwcmV2aW91c0lzQmFja3NsYXNoKSB7XG4gICAgICAgIC8vIG5vdCBoYW5kbGluZyAnXFwnIGFuZCBoYW5kbGluZyBcXHUyMDI4IG9yIFxcdTIwMjkgdG8gdW5pY29kZSBlc2NhcGUgc2VxdWVuY2VcbiAgICAgICAgaWYgKChjaCAmIH4xKSA9PT0gMHgyMDI4KSB7XG4gICAgICAgICAgICByZXR1cm4gKHByZXZpb3VzSXNCYWNrc2xhc2ggPyAndScgOiAnXFxcXHUnKSArICgoY2ggPT09IDB4MjAyOCkgPyAnMjAyOCcgOiAnMjAyOScpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAxMCB8fCBjaCA9PT0gMTMpIHsgIC8vIFxcbiwgXFxyXG4gICAgICAgICAgICByZXR1cm4gKHByZXZpb3VzSXNCYWNrc2xhc2ggPyAnJyA6ICdcXFxcJykgKyAoKGNoID09PSAxMCkgPyAnbicgOiAncicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVJlZ0V4cChyZWcpIHtcbiAgICAgICAgdmFyIG1hdGNoLCByZXN1bHQsIGZsYWdzLCBpLCBpeiwgY2gsIGNoYXJhY3RlckluQnJhY2ssIHByZXZpb3VzSXNCYWNrc2xhc2g7XG5cbiAgICAgICAgcmVzdWx0ID0gcmVnLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgaWYgKHJlZy5zb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgZmxhZyBmcm9tIHRvU3RyaW5nIHJlc3VsdFxuICAgICAgICAgICAgbWF0Y2ggPSByZXN1bHQubWF0Y2goL1xcLyhbXi9dKikkLyk7XG4gICAgICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmxhZ3MgPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIHJlc3VsdCA9ICcnO1xuXG4gICAgICAgICAgICBjaGFyYWN0ZXJJbkJyYWNrID0gZmFsc2U7XG4gICAgICAgICAgICBwcmV2aW91c0lzQmFja3NsYXNoID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHJlZy5zb3VyY2UubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIGNoID0gcmVnLnNvdXJjZS5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c0lzQmFja3NsYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJJbkJyYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09IDkzKSB7ICAvLyBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVySW5CcmFjayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSA0NykgeyAgLy8gL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSA5MSkgeyAgLy8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckluQnJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBlc2NhcGVSZWdFeHBDaGFyYWN0ZXIoY2gsIHByZXZpb3VzSXNCYWNrc2xhc2gpO1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0lzQmFja3NsYXNoID0gY2ggPT09IDkyOyAgLy8gXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBuZXcgUmVnRXhwKFwiXFxcXFxcbicpIGlzIHByb3ZpZGVkLCBjcmVhdGUgL1xcbi9cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGVzY2FwZVJlZ0V4cENoYXJhY3RlcihjaCwgcHJldmlvdXNJc0JhY2tzbGFzaCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgbGlrZSAvXFxcXFsvXS9cbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNJc0JhY2tzbGFzaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICcvJyArIHJlc3VsdCArICcvJyArIGZsYWdzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlc2NhcGVBbGxvd2VkQ2hhcmFjdGVyKGNvZGUsIG5leHQpIHtcbiAgICAgICAgdmFyIGhleDtcblxuICAgICAgICBpZiAoY29kZSA9PT0gMHgwOCAgLyogXFxiICovKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxiJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDBDICAvKiBcXGYgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXGYnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MDkgIC8qIFxcdCAqLykge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcdCc7XG4gICAgICAgIH1cblxuICAgICAgICBoZXggPSBjb2RlLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAoanNvbiB8fCBjb2RlID4gMHhGRikge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcdScgKyAnMDAwMCcuc2xpY2UoaGV4Lmxlbmd0aCkgKyBoZXg7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgwMDAwICYmICFlc3V0aWxzLmNvZGUuaXNEZWNpbWFsRGlnaXQobmV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXDAnO1xuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MDAwQiAgLyogXFx2ICovKSB7IC8vICdcXHYnXG4gICAgICAgICAgICByZXR1cm4gJ1xcXFx4MEInO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxceCcgKyAnMDAnLnNsaWNlKGhleC5sZW5ndGgpICsgaGV4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlRGlzYWxsb3dlZENoYXJhY3Rlcihjb2RlKSB7XG4gICAgICAgIGlmIChjb2RlID09PSAweDVDICAvKiBcXCAqLykge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcXFxcXCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gMHgwQSAgLyogXFxuICovKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxuJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDBEICAvKiBcXHIgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHInO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MjAyOCkge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcdTIwMjgnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MjAyOSkge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcdTIwMjknO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3RseSBjbGFzc2lmaWVkIGNoYXJhY3RlcicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVzY2FwZURpcmVjdGl2ZShzdHIpIHtcbiAgICAgICAgdmFyIGksIGl6LCBjb2RlLCBxdW90ZTtcblxuICAgICAgICBxdW90ZSA9IHF1b3RlcyA9PT0gJ2RvdWJsZScgPyAnXCInIDogJ1xcJyc7XG4gICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RyLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSAweDI3ICAvKiAnICovKSB7XG4gICAgICAgICAgICAgICAgcXVvdGUgPSAnXCInO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDIyICAvKiBcIiAqLykge1xuICAgICAgICAgICAgICAgIHF1b3RlID0gJ1xcJyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4NUMgIC8qIFxcICovKSB7XG4gICAgICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1b3RlICsgc3RyICsgcXVvdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHN0cikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gJycsIGksIGxlbiwgY29kZSwgc2luZ2xlUXVvdGVzID0gMCwgZG91YmxlUXVvdGVzID0gMCwgc2luZ2xlLCBxdW90ZTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSAweDI3ICAvKiAnICovKSB7XG4gICAgICAgICAgICAgICAgKytzaW5nbGVRdW90ZXM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MjIgIC8qIFwiICovKSB7XG4gICAgICAgICAgICAgICAgKytkb3VibGVRdW90ZXM7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MkYgIC8qIC8gKi8gJiYganNvbikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGNvZGUpIHx8IGNvZGUgPT09IDB4NUMgIC8qIFxcICovKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGVzY2FwZURpc2FsbG93ZWRDaGFyYWN0ZXIoY29kZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFlc3V0aWxzLmNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShjb2RlKSAmJiAoanNvbiAmJiBjb2RlIDwgMHgyMCAgLyogU1AgKi8gfHwgIWpzb24gJiYgIWVzY2FwZWxlc3MgJiYgKGNvZGUgPCAweDIwICAvKiBTUCAqLyB8fCBjb2RlID4gMHg3RSAgLyogfiAqLykpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGVzY2FwZUFsbG93ZWRDaGFyYWN0ZXIoY29kZSwgc3RyLmNoYXJDb2RlQXQoaSArIDEpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2luZ2xlID0gIShxdW90ZXMgPT09ICdkb3VibGUnIHx8IChxdW90ZXMgPT09ICdhdXRvJyAmJiBkb3VibGVRdW90ZXMgPCBzaW5nbGVRdW90ZXMpKTtcbiAgICAgICAgcXVvdGUgPSBzaW5nbGUgPyAnXFwnJyA6ICdcIic7XG5cbiAgICAgICAgaWYgKCEoc2luZ2xlID8gc2luZ2xlUXVvdGVzIDogZG91YmxlUXVvdGVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHF1b3RlICsgcmVzdWx0ICsgcXVvdGU7XG4gICAgICAgIH1cblxuICAgICAgICBzdHIgPSByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IHF1b3RlO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKChjb2RlID09PSAweDI3ICAvKiAnICovICYmIHNpbmdsZSkgfHwgKGNvZGUgPT09IDB4MjIgIC8qIFwiICovICYmICFzaW5nbGUpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdcXFxcJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCArIHF1b3RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGZsYXR0ZW4gYW4gYXJyYXkgdG8gYSBzdHJpbmcsIHdoZXJlIHRoZSBhcnJheSBjYW4gY29udGFpblxuICAgICAqIGVpdGhlciBzdHJpbmdzIG9yIG5lc3RlZCBhcnJheXNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuVG9TdHJpbmcoYXJyKSB7XG4gICAgICAgIHZhciBpLCBpeiwgZWxlbSwgcmVzdWx0ID0gJyc7XG4gICAgICAgIGZvciAoaSA9IDAsIGl6ID0gYXJyLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIGVsZW0gPSBhcnJbaV07XG4gICAgICAgICAgICByZXN1bHQgKz0gQXJyYXkuaXNBcnJheShlbGVtKSA/IGZsYXR0ZW5Ub1N0cmluZyhlbGVtKSA6IGVsZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjb252ZXJ0IGdlbmVyYXRlZCB0byBhIFNvdXJjZU5vZGUgd2hlbiBzb3VyY2UgbWFwcyBhcmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGdlbmVyYXRlZCwgbm9kZSkge1xuICAgICAgICBpZiAoIXNvdXJjZU1hcCkge1xuICAgICAgICAgICAgLy8gd2l0aCBubyBzb3VyY2UgbWFwcywgZ2VuZXJhdGVkIGlzIGVpdGhlciBhblxuICAgICAgICAgICAgLy8gYXJyYXkgb3IgYSBzdHJpbmcuICBpZiBhbiBhcnJheSwgZmxhdHRlbiBpdC5cbiAgICAgICAgICAgIC8vIGlmIGEgc3RyaW5nLCBqdXN0IHJldHVybiBpdFxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZ2VuZXJhdGVkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmbGF0dGVuVG9TdHJpbmcoZ2VuZXJhdGVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVkIGluc3RhbmNlb2YgU291cmNlTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5sb2MgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKG51bGwsIG51bGwsIHNvdXJjZU1hcCwgZ2VuZXJhdGVkLCBub2RlLm5hbWUgfHwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VOb2RlKG5vZGUubG9jLnN0YXJ0LmxpbmUsIG5vZGUubG9jLnN0YXJ0LmNvbHVtbiwgKHNvdXJjZU1hcCA9PT0gdHJ1ZSA/IG5vZGUubG9jLnNvdXJjZSB8fCBudWxsIDogc291cmNlTWFwKSwgZ2VuZXJhdGVkLCBub2RlLm5hbWUgfHwgbnVsbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9FbXB0eVNwYWNlKCkge1xuICAgICAgICByZXR1cm4gKHNwYWNlKSA/IHNwYWNlIDogJyAnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGpvaW4obGVmdCwgcmlnaHQpIHtcbiAgICAgICAgdmFyIGxlZnRTb3VyY2UsXG4gICAgICAgICAgICByaWdodFNvdXJjZSxcbiAgICAgICAgICAgIGxlZnRDaGFyQ29kZSxcbiAgICAgICAgICAgIHJpZ2h0Q2hhckNvZGU7XG5cbiAgICAgICAgbGVmdFNvdXJjZSA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQobGVmdCkudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKGxlZnRTb3VyY2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW3JpZ2h0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJpZ2h0U291cmNlID0gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyaWdodCkudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHJpZ2h0U291cmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtsZWZ0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxlZnRDaGFyQ29kZSA9IGxlZnRTb3VyY2UuY2hhckNvZGVBdChsZWZ0U291cmNlLmxlbmd0aCAtIDEpO1xuICAgICAgICByaWdodENoYXJDb2RlID0gcmlnaHRTb3VyY2UuY2hhckNvZGVBdCgwKTtcblxuICAgICAgICBpZiAoKGxlZnRDaGFyQ29kZSA9PT0gMHgyQiAgLyogKyAqLyB8fCBsZWZ0Q2hhckNvZGUgPT09IDB4MkQgIC8qIC0gKi8pICYmIGxlZnRDaGFyQ29kZSA9PT0gcmlnaHRDaGFyQ29kZSB8fFxuICAgICAgICAgICAgZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUobGVmdENoYXJDb2RlKSAmJiBlc3V0aWxzLmNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShyaWdodENoYXJDb2RlKSB8fFxuICAgICAgICAgICAgbGVmdENoYXJDb2RlID09PSAweDJGICAvKiAvICovICYmIHJpZ2h0Q2hhckNvZGUgPT09IDB4NjkgIC8qIGkgKi8pIHsgLy8gaW5maXggd29yZCBvcGVyYXRvcnMgYWxsIHN0YXJ0IHdpdGggYGlgXG4gICAgICAgICAgICByZXR1cm4gW2xlZnQsIG5vRW1wdHlTcGFjZSgpLCByaWdodF07XG4gICAgICAgIH0gZWxzZSBpZiAoZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShsZWZ0Q2hhckNvZGUpIHx8IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGxlZnRDaGFyQ29kZSkgfHxcbiAgICAgICAgICAgICAgICBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKHJpZ2h0Q2hhckNvZGUpIHx8IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKHJpZ2h0Q2hhckNvZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gW2xlZnQsIHJpZ2h0XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2xlZnQsIHNwYWNlLCByaWdodF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkSW5kZW50KHN0bXQpIHtcbiAgICAgICAgcmV0dXJuIFtiYXNlLCBzdG10XTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3aXRoSW5kZW50KGZuKSB7XG4gICAgICAgIHZhciBwcmV2aW91c0Jhc2U7XG4gICAgICAgIHByZXZpb3VzQmFzZSA9IGJhc2U7XG4gICAgICAgIGJhc2UgKz0gaW5kZW50O1xuICAgICAgICBmbihiYXNlKTtcbiAgICAgICAgYmFzZSA9IHByZXZpb3VzQmFzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVTcGFjZXMoc3RyKSB7XG4gICAgICAgIHZhciBpO1xuICAgICAgICBmb3IgKGkgPSBzdHIubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGlmIChlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihzdHIuY2hhckNvZGVBdChpKSkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHN0ci5sZW5ndGggLSAxKSAtIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRqdXN0TXVsdGlsaW5lQ29tbWVudCh2YWx1ZSwgc3BlY2lhbEJhc2UpIHtcbiAgICAgICAgdmFyIGFycmF5LCBpLCBsZW4sIGxpbmUsIGosIHNwYWNlcywgcHJldmlvdXNCYXNlLCBzbjtcblxuICAgICAgICBhcnJheSA9IHZhbHVlLnNwbGl0KC9cXHJcXG58W1xcclxcbl0vKTtcbiAgICAgICAgc3BhY2VzID0gTnVtYmVyLk1BWF9WQUxVRTtcblxuICAgICAgICAvLyBmaXJzdCBsaW5lIGRvZXNuJ3QgaGF2ZSBpbmRlbnRhdGlvblxuICAgICAgICBmb3IgKGkgPSAxLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgbGluZSA9IGFycmF5W2ldO1xuICAgICAgICAgICAgaiA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoaiA8IGxpbmUubGVuZ3RoICYmIGVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UobGluZS5jaGFyQ29kZUF0KGopKSkge1xuICAgICAgICAgICAgICAgICsrajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzcGFjZXMgPiBqKSB7XG4gICAgICAgICAgICAgICAgc3BhY2VzID0gajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygc3BlY2lhbEJhc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBwYXR0ZXJuIGxpa2VcbiAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgIC8vICAgdmFyIHQgPSAyMDsgIC8qXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgKiB0aGlzIGlzIGNvbW1lbnRcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcHJldmlvdXNCYXNlID0gYmFzZTtcbiAgICAgICAgICAgIGlmIChhcnJheVsxXVtzcGFjZXNdID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICBzcGVjaWFsQmFzZSArPSAnICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiYXNlID0gc3BlY2lhbEJhc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3BhY2VzICYgMSkge1xuICAgICAgICAgICAgICAgIC8vIC8qXG4gICAgICAgICAgICAgICAgLy8gICpcbiAgICAgICAgICAgICAgICAvLyAgKi9cbiAgICAgICAgICAgICAgICAvLyBJZiBzcGFjZXMgYXJlIG9kZCBudW1iZXIsIGFib3ZlIHBhdHRlcm4gaXMgY29uc2lkZXJlZC5cbiAgICAgICAgICAgICAgICAvLyBXZSB3YXN0ZSAxIHNwYWNlLlxuICAgICAgICAgICAgICAgIC0tc3BhY2VzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldmlvdXNCYXNlID0gYmFzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDEsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBzbiA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQoYWRkSW5kZW50KGFycmF5W2ldLnNsaWNlKHNwYWNlcykpKTtcbiAgICAgICAgICAgIGFycmF5W2ldID0gc291cmNlTWFwID8gc24uam9pbignJykgOiBzbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJhc2UgPSBwcmV2aW91c0Jhc2U7XG5cbiAgICAgICAgcmV0dXJuIGFycmF5LmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlQ29tbWVudChjb21tZW50LCBzcGVjaWFsQmFzZSkge1xuICAgICAgICBpZiAoY29tbWVudC50eXBlID09PSAnTGluZScpIHtcbiAgICAgICAgICAgIGlmIChlbmRzV2l0aExpbmVUZXJtaW5hdG9yKGNvbW1lbnQudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcvLycgKyBjb21tZW50LnZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBbHdheXMgdXNlIExpbmVUZXJtaW5hdG9yXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICcvLycgKyBjb21tZW50LnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghcHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxuJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0cmEuZm9ybWF0LmluZGVudC5hZGp1c3RNdWx0aWxpbmVDb21tZW50ICYmIC9bXFxuXFxyXS8udGVzdChjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFkanVzdE11bHRpbGluZUNvbW1lbnQoJy8qJyArIGNvbW1lbnQudmFsdWUgKyAnKi8nLCBzcGVjaWFsQmFzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcvKicgKyBjb21tZW50LnZhbHVlICsgJyovJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRDb21tZW50cyhzdG10LCByZXN1bHQpIHtcbiAgICAgICAgdmFyIGksIGxlbiwgY29tbWVudCwgc2F2ZSwgdGFpbGluZ1RvU3RhdGVtZW50LCBzcGVjaWFsQmFzZSwgZnJhZ21lbnQsXG4gICAgICAgICAgICBleHRSYW5nZSwgcmFuZ2UsIHByZXZSYW5nZSwgcHJlZml4LCBpbmZpeCwgc3VmZml4LCBjb3VudDtcblxuICAgICAgICBpZiAoc3RtdC5sZWFkaW5nQ29tbWVudHMgJiYgc3RtdC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2F2ZSA9IHJlc3VsdDtcblxuICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdG10LmxlYWRpbmdDb21tZW50c1swXTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgICAgICAgICAgIGV4dFJhbmdlID0gY29tbWVudC5leHRlbmRlZFJhbmdlO1xuICAgICAgICAgICAgICAgIHJhbmdlID0gY29tbWVudC5yYW5nZTtcblxuICAgICAgICAgICAgICAgIHByZWZpeCA9IHNvdXJjZUNvZGUuc3Vic3RyaW5nKGV4dFJhbmdlWzBdLCByYW5nZVswXSk7XG4gICAgICAgICAgICAgICAgY291bnQgPSAocHJlZml4Lm1hdGNoKC9cXG4vZykgfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0cmluZ1JlcGVhdCgnXFxuJywgY291bnQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KGdlbmVyYXRlQ29tbWVudChjb21tZW50KSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHByZWZpeCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlQ29tbWVudChjb21tZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJldlJhbmdlID0gcmFuZ2U7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAxLCBsZW4gPSBzdG10LmxlYWRpbmdDb21tZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC5sZWFkaW5nQ29tbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gY29tbWVudC5yYW5nZTtcblxuICAgICAgICAgICAgICAgICAgICBpbmZpeCA9IHNvdXJjZUNvZGUuc3Vic3RyaW5nKHByZXZSYW5nZVsxXSwgcmFuZ2VbMF0pO1xuICAgICAgICAgICAgICAgICAgICBjb3VudCA9IChpbmZpeC5tYXRjaCgvXFxuL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0cmluZ1JlcGVhdCgnXFxuJywgY291bnQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KGdlbmVyYXRlQ29tbWVudChjb21tZW50KSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHByZXZSYW5nZSA9IHJhbmdlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHNvdXJjZUNvZGUuc3Vic3RyaW5nKHJhbmdlWzFdLCBleHRSYW5nZVsxXSk7XG4gICAgICAgICAgICAgICAgY291bnQgPSAoc3VmZml4Lm1hdGNoKC9cXG4vZykgfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdHJpbmdSZXBlYXQoJ1xcbicsIGNvdW50KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdG10LmxlYWRpbmdDb21tZW50c1swXTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoc2FmZUNvbmNhdGVuYXRpb24gJiYgc3RtdC50eXBlID09PSBTeW50YXguUHJvZ3JhbSAmJiBzdG10LmJvZHkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCdcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVDb21tZW50KGNvbW1lbnQpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCdcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAxLCBsZW4gPSBzdG10LmxlYWRpbmdDb21tZW50cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC5sZWFkaW5nQ29tbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gW2dlbmVyYXRlQ29tbWVudChjb21tZW50KV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGZyYWdtZW50KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQucHVzaCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KGZyYWdtZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQucHVzaChhZGRJbmRlbnQoc2F2ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0bXQudHJhaWxpbmdDb21tZW50cykge1xuXG4gICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgY29tbWVudCA9IHN0bXQudHJhaWxpbmdDb21tZW50c1swXTtcbiAgICAgICAgICAgICAgICBleHRSYW5nZSA9IGNvbW1lbnQuZXh0ZW5kZWRSYW5nZTtcbiAgICAgICAgICAgICAgICByYW5nZSA9IGNvbW1lbnQucmFuZ2U7XG5cbiAgICAgICAgICAgICAgICBwcmVmaXggPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhleHRSYW5nZVswXSwgcmFuZ2VbMF0pO1xuICAgICAgICAgICAgICAgIGNvdW50ID0gKHByZWZpeC5tYXRjaCgvXFxuL2cpIHx8IFtdKS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0cmluZ1JlcGVhdCgnXFxuJywgY291bnQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KGdlbmVyYXRlQ29tbWVudChjb21tZW50KSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHByZWZpeCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlQ29tbWVudChjb21tZW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWlsaW5nVG9TdGF0ZW1lbnQgPSAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgc3BlY2lhbEJhc2UgPSBzdHJpbmdSZXBlYXQoJyAnLCBjYWxjdWxhdGVTcGFjZXModG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChbYmFzZSwgcmVzdWx0LCBpbmRlbnRdKS50b1N0cmluZygpKSk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gc3RtdC50cmFpbGluZ0NvbW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdG10LnRyYWlsaW5nQ29tbWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWlsaW5nVG9TdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0YXJnZXQgbGlrZSBmb2xsb3dpbmcgc2NyaXB0XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyIHQgPSAyMDsgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAqIFRoaXMgaXMgY29tbWVudCBvZiB0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbcmVzdWx0LCBpbmRlbnRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbcmVzdWx0LCBzcGVjaWFsQmFzZV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCwgc3BlY2lhbEJhc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtyZXN1bHQsIGFkZEluZGVudChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gbGVuIC0gMSAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtyZXN1bHQsICdcXG4nXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVCbGFua0xpbmVzKHN0YXJ0LCBlbmQsIHJlc3VsdCkge1xuICAgICAgICB2YXIgaiwgbmV3bGluZUNvdW50ID0gMDtcblxuICAgICAgICBmb3IgKGogPSBzdGFydDsgaiA8IGVuZDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlQ29kZVtqXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICBuZXdsaW5lQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaiA9IDE7IGogPCBuZXdsaW5lQ291bnQ7IGorKykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJlbnRoZXNpemUodGV4dCwgY3VycmVudCwgc2hvdWxkKSB7XG4gICAgICAgIGlmIChjdXJyZW50IDwgc2hvdWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gWycoJywgdGV4dCwgJyknXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVZlcmJhdGltU3RyaW5nKHN0cmluZykge1xuICAgICAgICB2YXIgaSwgaXosIHJlc3VsdDtcbiAgICAgICAgcmVzdWx0ID0gc3RyaW5nLnNwbGl0KC9cXHJcXG58XFxuLyk7XG4gICAgICAgIGZvciAoaSA9IDEsIGl6ID0gcmVzdWx0Lmxlbmd0aDsgaSA8IGl6OyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IG5ld2xpbmUgKyBiYXNlICsgcmVzdWx0W2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVWZXJiYXRpbShleHByLCBwcmVjZWRlbmNlKSB7XG4gICAgICAgIHZhciB2ZXJiYXRpbSwgcmVzdWx0LCBwcmVjO1xuICAgICAgICB2ZXJiYXRpbSA9IGV4cHJbZXh0cmEudmVyYmF0aW1dO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmVyYmF0aW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBwYXJlbnRoZXNpemUoZ2VuZXJhdGVWZXJiYXRpbVN0cmluZyh2ZXJiYXRpbSksIFByZWNlZGVuY2UuU2VxdWVuY2UsIHByZWNlZGVuY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdmVyYmF0aW0gaXMgb2JqZWN0XG4gICAgICAgICAgICByZXN1bHQgPSBnZW5lcmF0ZVZlcmJhdGltU3RyaW5nKHZlcmJhdGltLmNvbnRlbnQpO1xuICAgICAgICAgICAgcHJlYyA9ICh2ZXJiYXRpbS5wcmVjZWRlbmNlICE9IG51bGwpID8gdmVyYmF0aW0ucHJlY2VkZW5jZSA6IFByZWNlZGVuY2UuU2VxdWVuY2U7XG4gICAgICAgICAgICByZXN1bHQgPSBwYXJlbnRoZXNpemUocmVzdWx0LCBwcmVjLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCwgZXhwcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gQ29kZUdlbmVyYXRvcigpIHtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXJzLlxuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUubWF5YmVCbG9jayA9IGZ1bmN0aW9uKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgIHZhciByZXN1bHQsIG5vTGVhZGluZ0NvbW1lbnQsIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgIG5vTGVhZGluZ0NvbW1lbnQgPSAhZXh0cmEuY29tbWVudCB8fCAhc3RtdC5sZWFkaW5nQ29tbWVudHM7XG5cbiAgICAgICAgaWYgKHN0bXQudHlwZSA9PT0gU3ludGF4LkJsb2NrU3RhdGVtZW50ICYmIG5vTGVhZGluZ0NvbW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbc3BhY2UsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdCwgZmxhZ3MpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdG10LnR5cGUgPT09IFN5bnRheC5FbXB0eVN0YXRlbWVudCAmJiBub0xlYWRpbmdDb21tZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gJzsnO1xuICAgICAgICB9XG5cbiAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgbmV3bGluZSxcbiAgICAgICAgICAgICAgICBhZGRJbmRlbnQodGhhdC5nZW5lcmF0ZVN0YXRlbWVudChzdG10LCBmbGFncykpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5tYXliZUJsb2NrU3VmZml4ID0gZnVuY3Rpb24gKHN0bXQsIHJlc3VsdCkge1xuICAgICAgICB2YXIgZW5kcyA9IGVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoc3RtdC50eXBlID09PSBTeW50YXguQmxvY2tTdGF0ZW1lbnQgJiYgKCFleHRyYS5jb21tZW50IHx8ICFzdG10LmxlYWRpbmdDb21tZW50cykgJiYgIWVuZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBbcmVzdWx0LCBzcGFjZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBbcmVzdWx0LCBiYXNlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3Jlc3VsdCwgbmV3bGluZSwgYmFzZV07XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlSWRlbnRpZmllcihub2RlKSB7XG4gICAgICAgIHJldHVybiB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKG5vZGUubmFtZSwgbm9kZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVBc3luY1ByZWZpeChub2RlLCBzcGFjZVJlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybiBub2RlLmFzeW5jID8gJ2FzeW5jJyArIChzcGFjZVJlcXVpcmVkID8gbm9FbXB0eVNwYWNlKCkgOiBzcGFjZSkgOiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVN0YXJTdWZmaXgobm9kZSkge1xuICAgICAgICB2YXIgaXNHZW5lcmF0b3IgPSBub2RlLmdlbmVyYXRvciAmJiAhZXh0cmEubW96LnN0YXJsZXNzR2VuZXJhdG9yO1xuICAgICAgICByZXR1cm4gaXNHZW5lcmF0b3IgPyAnKicgKyBzcGFjZSA6ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlTWV0aG9kUHJlZml4KHByb3ApIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBwcm9wLnZhbHVlLCBwcmVmaXggPSAnJztcbiAgICAgICAgaWYgKGZ1bmMuYXN5bmMpIHtcbiAgICAgICAgICAgIHByZWZpeCArPSBnZW5lcmF0ZUFzeW5jUHJlZml4KGZ1bmMsICFwcm9wLmNvbXB1dGVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZnVuYy5nZW5lcmF0b3IpIHtcbiAgICAgICAgICAgIC8vIGF2b2lkIHNwYWNlIGJlZm9yZSBtZXRob2QgbmFtZVxuICAgICAgICAgICAgcHJlZml4ICs9IGdlbmVyYXRlU3RhclN1ZmZpeChmdW5jKSA/ICcqJyA6ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmVmaXg7XG4gICAgfVxuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVQYXR0ZXJuID0gZnVuY3Rpb24gKG5vZGUsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IFN5bnRheC5JZGVudGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVJZGVudGlmaWVyKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihub2RlLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlRnVuY3Rpb25QYXJhbXMgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgaSwgaXosIHJlc3VsdCwgaGFzRGVmYXVsdDtcblxuICAgICAgICBoYXNEZWZhdWx0ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gU3ludGF4LkFycm93RnVuY3Rpb25FeHByZXNzaW9uICYmXG4gICAgICAgICAgICAgICAgIW5vZGUucmVzdCAmJiAoIW5vZGUuZGVmYXVsdHMgfHwgbm9kZS5kZWZhdWx0cy5sZW5ndGggPT09IDApICYmXG4gICAgICAgICAgICAgICAgbm9kZS5wYXJhbXMubGVuZ3RoID09PSAxICYmIG5vZGUucGFyYW1zWzBdLnR5cGUgPT09IFN5bnRheC5JZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAvLyBhcmcgPT4geyB9IGNhc2VcbiAgICAgICAgICAgIHJlc3VsdCA9IFtnZW5lcmF0ZUFzeW5jUHJlZml4KG5vZGUsIHRydWUpLCBnZW5lcmF0ZUlkZW50aWZpZXIobm9kZS5wYXJhbXNbMF0pXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUudHlwZSA9PT0gU3ludGF4LkFycm93RnVuY3Rpb25FeHByZXNzaW9uID8gW2dlbmVyYXRlQXN5bmNQcmVmaXgobm9kZSwgZmFsc2UpXSA6IFtdO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJygnKTtcbiAgICAgICAgICAgIGlmIChub2RlLmRlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgaGFzRGVmYXVsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IG5vZGUucGFyYW1zLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzRGVmYXVsdCAmJiBub2RlLmRlZmF1bHRzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBkZWZhdWx0IHZhbHVlcy5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUFzc2lnbm1lbnQobm9kZS5wYXJhbXNbaV0sIG5vZGUuZGVmYXVsdHNbaV0sICc9JywgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVQYXR0ZXJuKG5vZGUucGFyYW1zW2ldLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlLnJlc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJy4uLicpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlSWRlbnRpZmllcihub2RlLnJlc3QpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goJyknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlRnVuY3Rpb25Cb2R5ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCwgZXhwcjtcblxuICAgICAgICByZXN1bHQgPSB0aGlzLmdlbmVyYXRlRnVuY3Rpb25QYXJhbXMobm9kZSk7XG5cbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gU3ludGF4LkFycm93RnVuY3Rpb25FeHByZXNzaW9uKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnPT4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgIGV4cHIgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihub2RlLmJvZHksIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpO1xuICAgICAgICAgICAgaWYgKGV4cHIudG9TdHJpbmcoKS5jaGFyQXQoMCkgPT09ICd7Jykge1xuICAgICAgICAgICAgICAgIGV4cHIgPSBbJygnLCBleHByLCAnKSddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZXhwcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2sobm9kZS5ib2R5LCBTX1RURkYpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlSXRlcmF0aW9uRm9yU3RhdGVtZW50ID0gZnVuY3Rpb24gKG9wZXJhdG9yLCBzdG10LCBmbGFncykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gWydmb3InICsgKHN0bXQuYXdhaXQgPyBub0VtcHR5U3BhY2UoKSArICdhd2FpdCcgOiAnJykgKyBzcGFjZSArICcoJ10sIHRoYXQgPSB0aGlzO1xuICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChzdG10LmxlZnQudHlwZSA9PT0gU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3RtdC5sZWZ0LmtpbmQgKyBub0VtcHR5U3BhY2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5sZWZ0LmRlY2xhcmF0aW9uc1swXSwgU19GRkZGKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQubGVmdCwgUHJlY2VkZW5jZS5DYWxsLCBFX1RUVCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgb3BlcmF0b3IpO1xuICAgICAgICAgICAgcmVzdWx0ID0gW2pvaW4oXG4gICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQucmlnaHQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpXG4gICAgICAgICAgICApLCAnKSddO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKHN0bXQuYm9keSwgZmxhZ3MpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVQcm9wZXJ0eUtleSA9IGZ1bmN0aW9uIChleHByLCBjb21wdXRlZCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG5cbiAgICAgICAgaWYgKGNvbXB1dGVkKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnWycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwciwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuXG4gICAgICAgIGlmIChjb21wdXRlZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ10nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlQXNzaWdubWVudCA9IGZ1bmN0aW9uIChsZWZ0LCByaWdodCwgb3BlcmF0b3IsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgIGlmIChQcmVjZWRlbmNlLkFzc2lnbm1lbnQgPCBwcmVjZWRlbmNlKSB7XG4gICAgICAgICAgICBmbGFncyB8PSBGX0FMTE9XX0lOO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihsZWZ0LCBQcmVjZWRlbmNlLkNhbGwsIGZsYWdzKSxcbiAgICAgICAgICAgICAgICBzcGFjZSArIG9wZXJhdG9yICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24ocmlnaHQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgZmxhZ3MpXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LFxuICAgICAgICAgICAgcHJlY2VkZW5jZVxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5zZW1pY29sb24gPSBmdW5jdGlvbiAoZmxhZ3MpIHtcbiAgICAgICAgaWYgKCFzZW1pY29sb25zICYmIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICc7JztcbiAgICB9O1xuXG4gICAgLy8gU3RhdGVtZW50cy5cblxuICAgIENvZGVHZW5lcmF0b3IuU3RhdGVtZW50ID0ge1xuXG4gICAgICAgIEJsb2NrU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByYW5nZSwgY29udGVudCwgcmVzdWx0ID0gWyd7JywgbmV3bGluZV0sIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgZnVuY3Rpb25zIHdpdGhvdXQgYW55IGNvZGVcbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5ib2R5Lmxlbmd0aCA9PT0gMCAmJiBwcmVzZXJ2ZUJsYW5rTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBzdG10LnJhbmdlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VbMV0gLSByYW5nZVswXSA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhyYW5nZVswXSArIDEsIHJhbmdlWzFdIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFswXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ3snXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGksIGl6LCBmcmFnbWVudCwgYm9keUZsYWdzO1xuICAgICAgICAgICAgICAgIGJvZHlGbGFncyA9IFNfVEZGRjtcbiAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGX0ZVTkNfQk9EWSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5RmxhZ3MgfD0gRl9ESVJFQ1RJVkVfQ1RYO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5ib2R5Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBiZWZvcmUgdGhlIGZpcnN0IGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuYm9keVswXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBzdG10LmJvZHlbMF0ubGVhZGluZ0NvbW1lbnRzWzBdLmV4dGVuZGVkUmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhyYW5nZVswXSwgcmFuZ2VbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudFswXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsneyddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RtdC5ib2R5WzBdLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUJsYW5rTGluZXMoc3RtdC5yYW5nZVswXSwgc3RtdC5ib2R5WzBdLnJhbmdlWzBdLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBiZXR3ZWVuIGxpbmVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpIC0gMV0udHJhaWxpbmdDb21tZW50cyAgJiYgIXN0bXQuYm9keVtpXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQuYm9keVtpIC0gMV0ucmFuZ2VbMV0sIHN0bXQuYm9keVtpXS5yYW5nZVswXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5RmxhZ3MgfD0gRl9TRU1JQ09MT05fT1BUO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuYm9keVtpXS5sZWFkaW5nQ29tbWVudHMgJiYgcHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5ib2R5W2ldLCBib2R5RmxhZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBhZGRJbmRlbnQodGhhdC5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmJvZHlbaV0sIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJsYW5rTGluZXMgJiYgaSA8IGl6IC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGFkZCBhIG5ldyBsaW5lIGlmIHRoZXJlIGFyZSBsZWFkaW5nIGNvbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbmV4dCBzdGF0ZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpICsgMV0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgc3BhY2VzIGFmdGVyIHRoZSBsYXN0IGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBpeiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpXS50cmFpbGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlQmxhbmtMaW5lcyhzdG10LmJvZHlbaV0ucmFuZ2VbMV0sIHN0bXQucmFuZ2VbMV0sIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudCgnfScpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQnJlYWtTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgaWYgKHN0bXQubGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2JyZWFrICcgKyBzdG10LmxhYmVsLm5hbWUgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ2JyZWFrJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDb250aW51ZVN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoc3RtdC5sYWJlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnY29udGludWUgJyArIHN0bXQubGFiZWwubmFtZSArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAnY29udGludWUnICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIENsYXNzQm9keTogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gWyAneycsIG5ld2xpbmVdLCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBzdG10LmJvZHkubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmJvZHlbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChiYXNlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCd9Jyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIENsYXNzRGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQ7XG4gICAgICAgICAgICByZXN1bHQgID0gWydjbGFzcyddO1xuICAgICAgICAgICAgaWYgKHN0bXQuaWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5pZCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdG10LnN1cGVyQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IGpvaW4oJ2V4dGVuZHMnLCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnN1cGVyQ2xhc3MsIFByZWNlZGVuY2UuVW5hcnksIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGZyYWdtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5ib2R5LCBTX1RGRlQpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRGlyZWN0aXZlU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChleHRyYS5yYXcgJiYgc3RtdC5yYXcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RtdC5yYXcgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXNjYXBlRGlyZWN0aXZlKHN0bXQuZGlyZWN0aXZlKSArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBEb1doaWxlU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIC8vIEJlY2F1c2UgYGRvIDQyIHdoaWxlIChjb25kKWAgaXMgU3ludGF4IEVycm9yLiBXZSBuZWVkIHNlbWljb2xvbi5cbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBqb2luKCdkbycsIHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIFNfVEZGRikpO1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KHN0bXQuYm9keSwgcmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybiBqb2luKHJlc3VsdCwgW1xuICAgICAgICAgICAgICAgICd3aGlsZScgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnRlc3QsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAnKScgKyB0aGlzLnNlbWljb2xvbihmbGFncylcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIENhdGNoQ2xhdXNlOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGd1YXJkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQucGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2NhdGNoJyArIHNwYWNlICsgJygnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5wYXJhbSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuZ3VhcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGd1YXJkID0gdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5ndWFyZCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNwbGljZSgyLCAwLCAnIGlmICcsIGd1YXJkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsnY2F0Y2gnXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIFNfVEZGRikpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBEZWJ1Z2dlclN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2RlYnVnZ2VyJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBFbXB0eVN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gJzsnO1xuICAgICAgICB9LFxuXG4gICAgICAgIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gWyAnZXhwb3J0JyBdLCBib2R5RmxhZ3M7XG5cbiAgICAgICAgICAgIGJvZHlGbGFncyA9IChmbGFncyAmIEZfU0VNSUNPTE9OX09QVCkgPyBTX1RGRlQgOiBTX1RGRkY7XG5cbiAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IEhvaXN0YWJsZURlY2xhcmF0aW9uW0RlZmF1bHRdXG4gICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBBc3NpZ25tZW50RXhwcmVzc2lvbltJbl0gO1xuICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsICdkZWZhdWx0Jyk7XG4gICAgICAgICAgICBpZiAoaXNTdGF0ZW1lbnQoc3RtdC5kZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmRlY2xhcmF0aW9uLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuZGVjbGFyYXRpb24sIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRXhwb3J0TmFtZWREZWNsYXJhdGlvbjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gWyAnZXhwb3J0JyBdLCBib2R5RmxhZ3MsIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgICAgICBib2R5RmxhZ3MgPSAoZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQpID8gU19URkZUIDogU19URkZGO1xuXG4gICAgICAgICAgICAvLyBleHBvcnQgVmFyaWFibGVTdGF0ZW1lbnRcbiAgICAgICAgICAgIC8vIGV4cG9ydCBEZWNsYXJhdGlvbltEZWZhdWx0XVxuICAgICAgICAgICAgaWYgKHN0bXQuZGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5kZWNsYXJhdGlvbiwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGV4cG9ydCBFeHBvcnRDbGF1c2VbTm9SZWZlcmVuY2VdIEZyb21DbGF1c2UgO1xuICAgICAgICAgICAgLy8gZXhwb3J0IEV4cG9ydENsYXVzZSA7XG4gICAgICAgICAgICBpZiAoc3RtdC5zcGVjaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuc3BlY2lmaWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsICd7JyArIHNwYWNlICsgJ30nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0bXQuc3BlY2lmaWVyc1swXS50eXBlID09PSBTeW50YXguRXhwb3J0QmF0Y2hTcGVjaWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc3BlY2lmaWVyc1swXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgJ3snKTtcbiAgICAgICAgICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgaXo7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5zcGVjaWZpZXJzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc3BlY2lmaWVyc1tpXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChiYXNlICsgJ30nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tJyArIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNvdXJjZSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW1pY29sb24oZmxhZ3MpXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuc2VtaWNvbG9uKGZsYWdzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBFeHBvcnRBbGxEZWNsYXJhdGlvbjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICAvLyBleHBvcnQgKiBGcm9tQ2xhdXNlIDtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgJ2V4cG9ydCcgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICAnKicgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICAnZnJvbScgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICAvLyBNb2R1bGVTcGVjaWZpZXJcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNvdXJjZSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VtaWNvbG9uKGZsYWdzKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSxcblxuICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50O1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBpc0NsYXNzUHJlZml4ZWQoZnJhZ21lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZTtcbiAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuc2xpY2UoMCwgNSkgIT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2RlID0gZnJhZ21lbnQuY2hhckNvZGVBdCg1KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZSA9PT0gMHg3QiAgLyogJ3snICovIHx8IGVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UoY29kZSkgfHwgZXN1dGlscy5jb2RlLmlzTGluZVRlcm1pbmF0b3IoY29kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb25QcmVmaXhlZChmcmFnbWVudCkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlO1xuICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudC5zbGljZSgwLCA4KSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvZGUgPSBmcmFnbWVudC5jaGFyQ29kZUF0KDgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlID09PSAweDI4IC8qICcoJyAqLyB8fCBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGNvZGUpIHx8IGNvZGUgPT09IDB4MkEgIC8qICcqJyAqLyB8fCBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihjb2RlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gaXNBc3luY1ByZWZpeGVkKGZyYWdtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZGUsIGksIGl6O1xuICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudC5zbGljZSgwLCA1KSAhPT0gJ2FzeW5jJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShmcmFnbWVudC5jaGFyQ29kZUF0KDUpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDYsIGl6ID0gZnJhZ21lbnQubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UoZnJhZ21lbnQuY2hhckNvZGVBdChpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpID09PSBpeikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudC5zbGljZShpLCBpICsgOCkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2RlID0gZnJhZ21lbnQuY2hhckNvZGVBdChpICsgOCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUgPT09IDB4MjggLyogJygnICovIHx8IGVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UoY29kZSkgfHwgY29kZSA9PT0gMHgyQSAgLyogJyonICovIHx8IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGNvZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQgPSBbdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5leHByZXNzaW9uLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCldO1xuICAgICAgICAgICAgLy8gMTIuNCAneycsICdmdW5jdGlvbicsICdjbGFzcycgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBwb3NpdGlvbi5cbiAgICAgICAgICAgIC8vIHdyYXAgZXhwcmVzc2lvbiB3aXRoIHBhcmVudGhlc2VzXG4gICAgICAgICAgICBmcmFnbWVudCA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKGZyYWdtZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4N0IgIC8qICd7JyAqLyB8fCAgLy8gT2JqZWN0RXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICBpc0NsYXNzUHJlZml4ZWQoZnJhZ21lbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgIGlzRnVuY3Rpb25QcmVmaXhlZChmcmFnbWVudCkgfHxcbiAgICAgICAgICAgICAgICAgICAgaXNBc3luY1ByZWZpeGVkKGZyYWdtZW50KSB8fFxuICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aXZlICYmIChmbGFncyAmIEZfRElSRUNUSVZFX0NUWCkgJiYgc3RtdC5leHByZXNzaW9uLnR5cGUgPT09IFN5bnRheC5MaXRlcmFsICYmIHR5cGVvZiBzdG10LmV4cHJlc3Npb24udmFsdWUgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsnKCcsIHJlc3VsdCwgJyknICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5zZW1pY29sb24oZmxhZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgSW1wb3J0RGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgLy8gRVM2OiAxNS4yLjEgdmFsaWQgaW1wb3J0IGRlY2xhcmF0aW9uczpcbiAgICAgICAgICAgIC8vICAgICAtIGltcG9ydCBJbXBvcnRDbGF1c2UgRnJvbUNsYXVzZSA7XG4gICAgICAgICAgICAvLyAgICAgLSBpbXBvcnQgTW9kdWxlU3BlY2lmaWVyIDtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGN1cnNvciwgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIElmIG5vIEltcG9ydENsYXVzZSBpcyBwcmVzZW50LFxuICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgYmUgYGltcG9ydCBNb2R1bGVTcGVjaWZpZXJgIHNvIHNraXAgYGZyb21gXG4gICAgICAgICAgICAvLyBNb2R1bGVTcGVjaWZpZXIgaXMgU3RyaW5nTGl0ZXJhbC5cbiAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gaW1wb3J0IE1vZHVsZVNwZWNpZmllciA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAvLyBNb2R1bGVTcGVjaWZpZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zb3VyY2UsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW1pY29sb24oZmxhZ3MpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW1wb3J0IEltcG9ydENsYXVzZSBGcm9tQ2xhdXNlIDtcbiAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAnaW1wb3J0J1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGN1cnNvciA9IDA7XG5cbiAgICAgICAgICAgIC8vIEltcG9ydGVkQmluZGluZ1xuICAgICAgICAgICAgaWYgKHN0bXQuc3BlY2lmaWVyc1tjdXJzb3JdLnR5cGUgPT09IFN5bnRheC5JbXBvcnREZWZhdWx0U3BlY2lmaWVyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc3BlY2lmaWVyc1tjdXJzb3JdLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVClcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICArK2N1cnNvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0bXQuc3BlY2lmaWVyc1tjdXJzb3JdKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnNbY3Vyc29yXS50eXBlID09PSBTeW50YXguSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5hbWVTcGFjZUltcG9ydFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc3BlY2lmaWVyc1tjdXJzb3JdLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVClcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTmFtZWRJbXBvcnRzXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlICsgJ3snKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKHN0bXQuc3BlY2lmaWVycy5sZW5ndGggLSBjdXJzb3IpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBvcnQgeyAuLi4gfSBmcm9tIFwiLi4uXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbY3Vyc29yXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlICsgJ30nICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIC4uLixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIC4uLixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0gZnJvbSBcIi4uLlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGN1cnNvciwgaXogPSBzdG10LnNwZWNpZmllcnMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYmFzZSArICd9JyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFtcbiAgICAgICAgICAgICAgICAnZnJvbScgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICAvLyBNb2R1bGVTcGVjaWZpZXJcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNvdXJjZSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2VtaWNvbG9uKGZsYWdzKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRvcjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgaXRlbUZsYWdzID0gKGZsYWdzICYgRl9BTExPV19JTikgPyBFX1RUVCA6IEVfRlRUO1xuICAgICAgICAgICAgaWYgKHN0bXQuaW5pdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuaWQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgaXRlbUZsYWdzKSxcbiAgICAgICAgICAgICAgICAgICAgc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgICc9JyxcbiAgICAgICAgICAgICAgICAgICAgc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuaW5pdCwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBpdGVtRmxhZ3MpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlUGF0dGVybihzdG10LmlkLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGl0ZW1GbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICAvLyBWYXJpYWJsZURlY2xhcmF0b3IgaXMgdHlwZWQgYXMgU3RhdGVtZW50LFxuICAgICAgICAgICAgLy8gYnV0IGpvaW5lZCB3aXRoIGNvbW1hIChub3QgTGluZVRlcm1pbmF0b3IpLlxuICAgICAgICAgICAgLy8gU28gaWYgY29tbWVudCBpcyBhdHRhY2hlZCB0byB0YXJnZXQgbm9kZSwgd2Ugc2hvdWxkIHNwZWNpYWxpemUuXG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpeiwgbm9kZSwgYm9keUZsYWdzLCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgcmVzdWx0ID0gWyBzdG10LmtpbmQgXTtcblxuICAgICAgICAgICAgYm9keUZsYWdzID0gKGZsYWdzICYgRl9BTExPV19JTikgPyBTX1RGRkYgOiBTX0ZGRkY7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGJsb2NrKCkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBzdG10LmRlY2xhcmF0aW9uc1swXTtcbiAgICAgICAgICAgICAgICBpZiAoZXh0cmEuY29tbWVudCAmJiBub2RlLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KG5vZGUsIGJvZHlGbGFncykpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub0VtcHR5U3BhY2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQobm9kZSwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMSwgaXogPSBzdG10LmRlY2xhcmF0aW9ucy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzdG10LmRlY2xhcmF0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnQgJiYgbm9kZS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQobm9kZSwgYm9keUZsYWdzKSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZVN0YXRlbWVudChub2RlLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN0bXQuZGVjbGFyYXRpb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB3aXRoSW5kZW50KGJsb2NrKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYmxvY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5zZW1pY29sb24oZmxhZ3MpKTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBUaHJvd1N0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gW2pvaW4oXG4gICAgICAgICAgICAgICAgJ3Rocm93JyxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmFyZ3VtZW50LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVClcbiAgICAgICAgICAgICksIHRoaXMuc2VtaWNvbG9uKGZsYWdzKV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgVHJ5U3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGksIGl6LCBndWFyZGVkSGFuZGxlcnM7XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IFsndHJ5JywgdGhpcy5tYXliZUJsb2NrKHN0bXQuYmxvY2ssIFNfVEZGRildO1xuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KHN0bXQuYmxvY2ssIHJlc3VsdCk7XG5cbiAgICAgICAgICAgIGlmIChzdG10LmhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgLy8gb2xkIGludGVyZmFjZVxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5oYW5kbGVycy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuaGFuZGxlcnNbaV0sIFNfVEZGRikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RtdC5maW5hbGl6ZXIgfHwgaSArIDEgIT09IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1heWJlQmxvY2tTdWZmaXgoc3RtdC5oYW5kbGVyc1tpXS5ib2R5LCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBndWFyZGVkSGFuZGxlcnMgPSBzdG10Lmd1YXJkZWRIYW5kbGVycyB8fCBbXTtcblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZ3VhcmRlZEhhbmRsZXJzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoZ3VhcmRlZEhhbmRsZXJzW2ldLCBTX1RGRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuZmluYWxpemVyIHx8IGkgKyAxICE9PSBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KGd1YXJkZWRIYW5kbGVyc1tpXS5ib2R5LCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gbmV3IGludGVyZmFjZVxuICAgICAgICAgICAgICAgIGlmIChzdG10LmhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3RtdC5oYW5kbGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBzdG10LmhhbmRsZXIubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuaGFuZGxlcltpXSwgU19URkZGKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuZmluYWxpemVyIHx8IGkgKyAxICE9PSBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1heWJlQmxvY2tTdWZmaXgoc3RtdC5oYW5kbGVyW2ldLmJvZHksIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5oYW5kbGVyLCBTX1RGRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmZpbmFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChzdG10LmhhbmRsZXIuYm9keSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdG10LmZpbmFsaXplcikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbJ2ZpbmFsbHknLCB0aGlzLm1heWJlQmxvY2soc3RtdC5maW5hbGl6ZXIsIFNfVEZGRildKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgU3dpdGNoU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50LCBpLCBpeiwgYm9keUZsYWdzLCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ3N3aXRjaCcgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5kaXNjcmltaW5hbnQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgJyknICsgc3BhY2UgKyAneycgKyBuZXdsaW5lXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHN0bXQuY2FzZXMpIHtcbiAgICAgICAgICAgICAgICBib2R5RmxhZ3MgPSBTX1RGRkY7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBzdG10LmNhc2VzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGl6IC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUZsYWdzIHw9IEZfU0VNSUNPTE9OX09QVDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IGFkZEluZGVudCh0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuY2FzZXNbaV0sIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGZyYWdtZW50KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChhZGRJbmRlbnQoJ30nKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFN3aXRjaENhc2U6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQsIGksIGl6LCBib2R5RmxhZ3MsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0bXQudGVzdCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICBqb2luKCdjYXNlJywgdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC50ZXN0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgJzonXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gWydkZWZhdWx0OiddO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgICAgIGl6ID0gc3RtdC5jb25zZXF1ZW50Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoaXogJiYgc3RtdC5jb25zZXF1ZW50WzBdLnR5cGUgPT09IFN5bnRheC5CbG9ja1N0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoYXQubWF5YmVCbG9jayhzdG10LmNvbnNlcXVlbnRbMF0sIFNfVEZGRik7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IGl6ICYmICFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBib2R5RmxhZ3MgPSBTX1RGRkY7XG4gICAgICAgICAgICAgICAgZm9yICg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBpeiAtIDEgJiYgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlGbGFncyB8PSBGX1NFTUlDT0xPTl9PUFQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBhZGRJbmRlbnQodGhhdC5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmNvbnNlcXVlbnRbaV0sIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSAhPT0gaXogJiYgIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIElmU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGJvZHlGbGFncywgc2VtaWNvbG9uT3B0aW9uYWwsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAnaWYnICsgc3BhY2UgKyAnKCcsXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQudGVzdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZW1pY29sb25PcHRpb25hbCA9IGZsYWdzICYgRl9TRU1JQ09MT05fT1BUO1xuICAgICAgICAgICAgYm9keUZsYWdzID0gU19URkZGO1xuICAgICAgICAgICAgaWYgKHNlbWljb2xvbk9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgYm9keUZsYWdzIHw9IEZfU0VNSUNPTE9OX09QVDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdG10LmFsdGVybmF0ZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmNvbnNlcXVlbnQsIFNfVEZGRikpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChzdG10LmNvbnNlcXVlbnQsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuYWx0ZXJuYXRlLnR5cGUgPT09IFN5bnRheC5JZlN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgWydlbHNlICcsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5hbHRlcm5hdGUsIGJvZHlGbGFncyldKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgam9pbignZWxzZScsIHRoaXMubWF5YmVCbG9jayhzdG10LmFsdGVybmF0ZSwgYm9keUZsYWdzKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKHN0bXQuY29uc2VxdWVudCwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEZvclN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsnZm9yJyArIHNwYWNlICsgJygnXTtcbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5pbml0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmluaXQudHlwZSA9PT0gU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5pbml0LCBTX0ZGRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZfQUxMT1dfSU4gYmVjb21lcyBmYWxzZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuaW5pdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9GVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc7Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnOycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzdG10LnRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnRlc3QsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc7Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzsnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RtdC51cGRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnVwZGF0ZSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJyknKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnKScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCA/IFNfVEZGVCA6IFNfVEZGRikpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBGb3JJblN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUl0ZXJhdGlvbkZvclN0YXRlbWVudCgnaW4nLCBzdG10LCBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCA/IFNfVEZGVCA6IFNfVEZGRik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRm9yT2ZTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJdGVyYXRpb25Gb3JTdGF0ZW1lbnQoJ29mJywgc3RtdCwgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQgPyBTX1RGRlQgOiBTX1RGRkYpO1xuICAgICAgICB9LFxuXG4gICAgICAgIExhYmVsZWRTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIFtzdG10LmxhYmVsLm5hbWUgKyAnOicsIHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUID8gU19URkZUIDogU19URkZGKV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgUHJvZ3JhbTogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBmcmFnbWVudCwgaSwgaXosIGJvZHlGbGFncztcbiAgICAgICAgICAgIGl6ID0gc3RtdC5ib2R5Lmxlbmd0aDtcbiAgICAgICAgICAgIHJlc3VsdCA9IFtzYWZlQ29uY2F0ZW5hdGlvbiAmJiBpeiA+IDAgPyAnXFxuJyA6ICcnXTtcbiAgICAgICAgICAgIGJvZHlGbGFncyA9IFNfVEZURjtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzYWZlQ29uY2F0ZW5hdGlvbiAmJiBpID09PSBpeiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keUZsYWdzIHw9IEZfU0VNSUNPTE9OX09QVDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYmVmb3JlIHRoZSBmaXJzdCBsaW5lXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVswXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUJsYW5rTGluZXMoc3RtdC5yYW5nZVswXSwgc3RtdC5ib2R5W2ldLnJhbmdlWzBdLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBiZXR3ZWVuIGxpbmVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaSAtIDFdLnRyYWlsaW5nQ29tbWVudHMgJiYgIXN0bXQuYm9keVtpXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUJsYW5rTGluZXMoc3RtdC5ib2R5W2kgLSAxXS5yYW5nZVsxXSwgc3RtdC5ib2R5W2ldLnJhbmdlWzBdLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBhZGRJbmRlbnQodGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmJvZHlbaV0sIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeiAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGZyYWdtZW50KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpICsgMV0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJsYW5rTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBhZnRlciB0aGUgbGFzdCBsaW5lXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBpeiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RtdC5ib2R5W2ldLnRyYWlsaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUJsYW5rTGluZXMoc3RtdC5ib2R5W2ldLnJhbmdlWzFdLCBzdG10LnJhbmdlWzFdLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVBc3luY1ByZWZpeChzdG10LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAnZnVuY3Rpb24nLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlU3RhclN1ZmZpeChzdG10KSB8fCBub0VtcHR5U3BhY2UoKSxcbiAgICAgICAgICAgICAgICBzdG10LmlkID8gZ2VuZXJhdGVJZGVudGlmaWVyKHN0bXQuaWQpIDogJycsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUZ1bmN0aW9uQm9keShzdG10KVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSxcblxuICAgICAgICBSZXR1cm5TdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgaWYgKHN0bXQuYXJndW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2pvaW4oXG4gICAgICAgICAgICAgICAgICAgICdyZXR1cm4nLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmFyZ3VtZW50LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVClcbiAgICAgICAgICAgICAgICApLCB0aGlzLnNlbWljb2xvbihmbGFncyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFsncmV0dXJuJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgV2hpbGVTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICd3aGlsZScgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC50ZXN0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgICcpJ1xuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUID8gU19URkZUIDogU19URkZGKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFdpdGhTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICd3aXRoJyArIHNwYWNlICsgJygnLFxuICAgICAgICAgICAgICAgICAgICB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10Lm9iamVjdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCA/IFNfVEZGVCA6IFNfVEZGRikpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgfTtcblxuICAgIG1lcmdlKENvZGVHZW5lcmF0b3IucHJvdG90eXBlLCBDb2RlR2VuZXJhdG9yLlN0YXRlbWVudCk7XG5cbiAgICAvLyBFeHByZXNzaW9ucy5cblxuICAgIENvZGVHZW5lcmF0b3IuRXhwcmVzc2lvbiA9IHtcblxuICAgICAgICBTZXF1ZW5jZUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXo7XG4gICAgICAgICAgICBpZiAoUHJlY2VkZW5jZS5TZXF1ZW5jZSA8IHByZWNlZGVuY2UpIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSBGX0FMTE9XX0lOO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHIuZXhwcmVzc2lvbnMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuZXhwcmVzc2lvbnNbaV0sIFByZWNlZGVuY2UuQXNzaWdubWVudCwgZmxhZ3MpKTtcbiAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQXNzaWdubWVudChleHByLmxlZnQsIGV4cHIucmlnaHQsIGV4cHIub3BlcmF0b3IsIHByZWNlZGVuY2UsIGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwciksIFByZWNlZGVuY2UuQXJyb3dGdW5jdGlvbiwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChQcmVjZWRlbmNlLkNvbmRpdGlvbmFsIDwgcHJlY2VkZW5jZSkge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZfQUxMT1dfSU47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci50ZXN0LCBQcmVjZWRlbmNlLkNvYWxlc2NlLCBmbGFncyksXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlICsgJz8nICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuY29uc2VxdWVudCwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBmbGFncyksXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlICsgJzonICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYWx0ZXJuYXRlLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGZsYWdzKVxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgUHJlY2VkZW5jZS5Db25kaXRpb25hbCxcbiAgICAgICAgICAgICAgICBwcmVjZWRlbmNlXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIExvZ2ljYWxFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChleHByLm9wZXJhdG9yID09PSAnPz8nKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRl9GT1VORF9DT0FMRVNDRTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLkJpbmFyeUV4cHJlc3Npb24oZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEJpbmFyeUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgbGVmdFByZWNlZGVuY2UsIHJpZ2h0UHJlY2VkZW5jZSwgY3VycmVudFByZWNlZGVuY2UsIGZyYWdtZW50LCBsZWZ0U291cmNlO1xuICAgICAgICAgICAgY3VycmVudFByZWNlZGVuY2UgPSBCaW5hcnlQcmVjZWRlbmNlW2V4cHIub3BlcmF0b3JdO1xuICAgICAgICAgICAgbGVmdFByZWNlZGVuY2UgPSBleHByLm9wZXJhdG9yID09PSAnKionID8gUHJlY2VkZW5jZS5Qb3N0Zml4IDogY3VycmVudFByZWNlZGVuY2U7XG4gICAgICAgICAgICByaWdodFByZWNlZGVuY2UgPSBleHByLm9wZXJhdG9yID09PSAnKionID8gY3VycmVudFByZWNlZGVuY2UgOiBjdXJyZW50UHJlY2VkZW5jZSArIDE7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50UHJlY2VkZW5jZSA8IHByZWNlZGVuY2UpIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSBGX0FMTE9XX0lOO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIubGVmdCwgbGVmdFByZWNlZGVuY2UsIGZsYWdzKTtcblxuICAgICAgICAgICAgbGVmdFNvdXJjZSA9IGZyYWdtZW50LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIGlmIChsZWZ0U291cmNlLmNoYXJDb2RlQXQobGVmdFNvdXJjZS5sZW5ndGggLSAxKSA9PT0gMHgyRiAvKiAvICovICYmIGVzdXRpbHMuY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1KGV4cHIub3BlcmF0b3IuY2hhckNvZGVBdCgwKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbZnJhZ21lbnQsIG5vRW1wdHlTcGFjZSgpLCBleHByLm9wZXJhdG9yXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihmcmFnbWVudCwgZXhwci5vcGVyYXRvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5yaWdodCwgcmlnaHRQcmVjZWRlbmNlLCBmbGFncyk7XG5cbiAgICAgICAgICAgIGlmIChleHByLm9wZXJhdG9yID09PSAnLycgJiYgZnJhZ21lbnQudG9TdHJpbmcoKS5jaGFyQXQoMCkgPT09ICcvJyB8fFxuICAgICAgICAgICAgZXhwci5vcGVyYXRvci5zbGljZSgtMSkgPT09ICc8JyAmJiBmcmFnbWVudC50b1N0cmluZygpLnNsaWNlKDAsIDMpID09PSAnIS0tJykge1xuICAgICAgICAgICAgICAgIC8vIElmICcvJyBjb25jYXRzIHdpdGggJy8nIG9yIGA8YCBjb25jYXRzIHdpdGggYCEtLWAsIGl0IGlzIGludGVycHJldGVkIGFzIGNvbW1lbnQgc3RhcnRcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub0VtcHR5U3BhY2UoKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci5vcGVyYXRvciA9PT0gJ2luJyAmJiAhKGZsYWdzICYgRl9BTExPV19JTikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWycoJywgcmVzdWx0LCAnKSddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChleHByLm9wZXJhdG9yID09PSAnfHwnIHx8IGV4cHIub3BlcmF0b3IgPT09ICcmJicpICYmIChmbGFncyAmIEZfRk9VTkRfQ09BTEVTQ0UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnKCcsIHJlc3VsdCwgJyknXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBjdXJyZW50UHJlY2VkZW5jZSwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ2FsbEV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXo7XG5cbiAgICAgICAgICAgIC8vIEZfQUxMT1dfVU5QQVJBVEhfTkVXIGJlY29tZXMgZmFsc2UuXG4gICAgICAgICAgICByZXN1bHQgPSBbdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5jYWxsZWUsIFByZWNlZGVuY2UuQ2FsbCwgRV9UVEYpXTtcblxuICAgICAgICAgICAgaWYgKGV4cHIub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPy4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goJygnKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZXhwclsnYXJndW1lbnRzJ10ubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHJbJ2FyZ3VtZW50cyddW2ldLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcpJyk7XG5cbiAgICAgICAgICAgIGlmICghKGZsYWdzICYgRl9BTExPV19DQUxMKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbJygnLCByZXN1bHQsICcpJ107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLkNhbGwsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIENoYWluRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoUHJlY2VkZW5jZS5PcHRpb25hbENoYWluaW5nIDwgcHJlY2VkZW5jZSkge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZfQUxMT1dfQ0FMTDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuZXhwcmVzc2lvbiwgUHJlY2VkZW5jZS5PcHRpb25hbENoYWluaW5nLCBmbGFncyk7XG5cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLk9wdGlvbmFsQ2hhaW5pbmcsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIE5ld0V4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgbGVuZ3RoLCBpLCBpeiwgaXRlbUZsYWdzO1xuICAgICAgICAgICAgbGVuZ3RoID0gZXhwclsnYXJndW1lbnRzJ10ubGVuZ3RoO1xuXG4gICAgICAgICAgICAvLyBGX0FMTE9XX0NBTEwgYmVjb21lcyBmYWxzZS5cbiAgICAgICAgICAgIC8vIEZfQUxMT1dfVU5QQVJBVEhfTkVXIG1heSBiZWNvbWUgZmFsc2UuXG4gICAgICAgICAgICBpdGVtRmxhZ3MgPSAoZmxhZ3MgJiBGX0FMTE9XX1VOUEFSQVRIX05FVyAmJiAhcGFyZW50aGVzZXMgJiYgbGVuZ3RoID09PSAwKSA/IEVfVEZUIDogRV9URkY7XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4oXG4gICAgICAgICAgICAgICAgJ25ldycsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5jYWxsZWUsIFByZWNlZGVuY2UuTmV3LCBpdGVtRmxhZ3MpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoIShmbGFncyAmIEZfQUxMT1dfVU5QQVJBVEhfTkVXKSB8fCBwYXJlbnRoZXNlcyB8fCBsZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJygnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwclsnYXJndW1lbnRzJ11baV0sIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnKScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5OZXcsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIE1lbWJlckV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQ7XG5cbiAgICAgICAgICAgIC8vIEZfQUxMT1dfVU5QQVJBVEhfTkVXIGJlY29tZXMgZmFsc2UuXG4gICAgICAgICAgICByZXN1bHQgPSBbdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5vYmplY3QsIFByZWNlZGVuY2UuQ2FsbCwgKGZsYWdzICYgRl9BTExPV19DQUxMKSA/IEVfVFRGIDogRV9URkYpXTtcblxuICAgICAgICAgICAgaWYgKGV4cHIuY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwci5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPy4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnWycpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucHJvcGVydHksIFByZWNlZGVuY2UuU2VxdWVuY2UsIGZsYWdzICYgRl9BTExPV19DQUxMID8gRV9UVFQgOiBFX1RGVCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCddJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghZXhwci5vcHRpb25hbCAmJiBleHByLm9iamVjdC50eXBlID09PSBTeW50YXguTGl0ZXJhbCAmJiB0eXBlb2YgZXhwci5vYmplY3QudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhbGwgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAxLiBObyBmbG9hdGluZyBwb2ludFxuICAgICAgICAgICAgICAgICAgICAvLyAgIDIuIERvbid0IGhhdmUgZXhwb25lbnRzXG4gICAgICAgICAgICAgICAgICAgIC8vICAgMy4gVGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgZGVjaW1hbCBkaWdpdFxuICAgICAgICAgICAgICAgICAgICAvLyAgIDQuIE5vdCBoZXhhZGVjaW1hbCBPUiBvY3RhbCBudW1iZXIgbGl0ZXJhbFxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgYWRkIGEgZmxvYXRpbmcgcG9pbnQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC5pbmRleE9mKCcuJykgPCAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIS9bZUV4WF0vLnRlc3QoZnJhZ21lbnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN1dGlscy5jb2RlLmlzRGVjaW1hbERpZ2l0KGZyYWdtZW50LmNoYXJDb2RlQXQoZnJhZ21lbnQubGVuZ3RoIC0gMSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShmcmFnbWVudC5sZW5ndGggPj0gMiAmJiBmcmFnbWVudC5jaGFyQ29kZUF0KDApID09PSA0OCkgIC8vICcwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChleHByLm9wdGlvbmFsID8gJz8uJyA6ICcuJyk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVJZGVudGlmaWVyKGV4cHIucHJvcGVydHkpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuTWVtYmVyLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBNZXRhUHJvcGVydHk6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godHlwZW9mIGV4cHIubWV0YSA9PT0gXCJzdHJpbmdcIiA/IGV4cHIubWV0YSA6IGdlbmVyYXRlSWRlbnRpZmllcihleHByLm1ldGEpKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcuJyk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0eXBlb2YgZXhwci5wcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIiA/IGV4cHIucHJvcGVydHkgOiBnZW5lcmF0ZUlkZW50aWZpZXIoZXhwci5wcm9wZXJ0eSkpO1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuTWVtYmVyLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBVbmFyeUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQsIHJpZ2h0Q2hhckNvZGUsIGxlZnRTb3VyY2UsIGxlZnRDaGFyQ29kZTtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5hcmd1bWVudCwgUHJlY2VkZW5jZS5VbmFyeSwgRV9UVFQpO1xuXG4gICAgICAgICAgICBpZiAoc3BhY2UgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihleHByLm9wZXJhdG9yLCBmcmFnbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtleHByLm9wZXJhdG9yXTtcbiAgICAgICAgICAgICAgICBpZiAoZXhwci5vcGVyYXRvci5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSwgdm9pZCwgdHlwZW9mXG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBgdHlwZW9mIFtdYCwgbm90IGB0eXBlb2ZbXWBcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGluc2VydGluZyBzcGFjZXMgYmV0d2VlbiBvcGVyYXRvciBhbmQgYXJndW1lbnQgaWYgaXQgaXMgdW5uZWNlc3NhcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gbGlrZSwgYCFjb25kYFxuICAgICAgICAgICAgICAgICAgICBsZWZ0U291cmNlID0gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxlZnRDaGFyQ29kZSA9IGxlZnRTb3VyY2UuY2hhckNvZGVBdChsZWZ0U291cmNlLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICByaWdodENoYXJDb2RlID0gZnJhZ21lbnQudG9TdHJpbmcoKS5jaGFyQ29kZUF0KDApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgoKGxlZnRDaGFyQ29kZSA9PT0gMHgyQiAgLyogKyAqLyB8fCBsZWZ0Q2hhckNvZGUgPT09IDB4MkQgIC8qIC0gKi8pICYmIGxlZnRDaGFyQ29kZSA9PT0gcmlnaHRDaGFyQ29kZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUobGVmdENoYXJDb2RlKSAmJiBlc3V0aWxzLmNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShyaWdodENoYXJDb2RlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vRW1wdHlTcGFjZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLlVuYXJ5LCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBZaWVsZEV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgIGlmIChleHByLmRlbGVnYXRlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gJ3lpZWxkKic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICd5aWVsZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhwci5hcmd1bWVudCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4oXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5hcmd1bWVudCwgUHJlY2VkZW5jZS5ZaWVsZCwgRV9UVFQpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLllpZWxkLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBBd2FpdEV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGpvaW4oXG4gICAgICAgICAgICAgICAgZXhwci5hbGwgPyAnYXdhaXQqJyA6ICdhd2FpdCcsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5hcmd1bWVudCwgUHJlY2VkZW5jZS5Bd2FpdCwgRV9UVFQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuQXdhaXQsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFVwZGF0ZUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgaWYgKGV4cHIucHJlZml4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5vcGVyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYXJndW1lbnQsIFByZWNlZGVuY2UuVW5hcnksIEVfVFRUKVxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBQcmVjZWRlbmNlLlVuYXJ5LFxuICAgICAgICAgICAgICAgICAgICBwcmVjZWRlbmNlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmFyZ3VtZW50LCBQcmVjZWRlbmNlLlBvc3RmaXgsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgZXhwci5vcGVyYXRvclxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgUHJlY2VkZW5jZS5Qb3N0Zml4LFxuICAgICAgICAgICAgICAgIHByZWNlZGVuY2VcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRnVuY3Rpb25FeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVBc3luY1ByZWZpeChleHByLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAnZnVuY3Rpb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKGV4cHIuaWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZVN0YXJTdWZmaXgoZXhwcikgfHwgbm9FbXB0eVNwYWNlKCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlSWRlbnRpZmllcihleHByLmlkKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlU3RhclN1ZmZpeChleHByKSB8fCBzcGFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXJyYXlQYXR0ZXJuOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkFycmF5RXhwcmVzc2lvbihleHByLCBwcmVjZWRlbmNlLCBmbGFncywgdHJ1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXJyYXlFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MsIGlzUGF0dGVybikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgbXVsdGlsaW5lLCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIGlmICghZXhwci5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tdJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG11bHRpbGluZSA9IGlzUGF0dGVybiA/IGZhbHNlIDogZXhwci5lbGVtZW50cy5sZW5ndGggPiAxO1xuICAgICAgICAgICAgcmVzdWx0ID0gWydbJywgbXVsdGlsaW5lID8gbmV3bGluZSA6ICcnXTtcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKGluZGVudCkge1xuICAgICAgICAgICAgICAgIHZhciBpLCBpejtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHIuZWxlbWVudHMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cHIuZWxlbWVudHNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxID09PSBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChtdWx0aWxpbmUgPyBpbmRlbnQgOiAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmVsZW1lbnRzW2ldLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIChtdWx0aWxpbmUgPyBuZXdsaW5lIDogc3BhY2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG11bHRpbGluZSAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG11bHRpbGluZSA/IGJhc2UgOiAnJyk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnXScpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBSZXN0RWxlbWVudDogZnVuY3Rpb24oZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiAnLi4uJyArIHRoaXMuZ2VuZXJhdGVQYXR0ZXJuKGV4cHIuYXJndW1lbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIENsYXNzRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBmcmFnbWVudDtcbiAgICAgICAgICAgIHJlc3VsdCA9IFsnY2xhc3MnXTtcbiAgICAgICAgICAgIGlmIChleHByLmlkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuaWQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhwci5zdXBlckNsYXNzKSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBqb2luKCdleHRlbmRzJywgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5zdXBlckNsYXNzLCBQcmVjZWRlbmNlLlVuYXJ5LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlU3RhdGVtZW50KGV4cHIuYm9keSwgU19URkZUKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIE1ldGhvZERlZmluaXRpb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQ7XG4gICAgICAgICAgICBpZiAoZXhwclsnc3RhdGljJ10pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ3N0YXRpYycgKyBzcGFjZV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHIua2luZCA9PT0gJ2dldCcgfHwgZXhwci5raW5kID09PSAnc2V0Jykge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gW1xuICAgICAgICAgICAgICAgICAgICBqb2luKGV4cHIua2luZCwgdGhpcy5nZW5lcmF0ZVByb3BlcnR5S2V5KGV4cHIua2V5LCBleHByLmNvbXB1dGVkKSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwci52YWx1ZSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IFtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVNZXRob2RQcmVmaXgoZXhwciksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwci52YWx1ZSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgUHJvcGVydHk6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgaWYgKGV4cHIua2luZCA9PT0gJ2dldCcgfHwgZXhwci5raW5kID09PSAnc2V0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIGV4cHIua2luZCwgbm9FbXB0eVNwYWNlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwci52YWx1ZSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci5zaG9ydGhhbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwci52YWx1ZS50eXBlID09PSBcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQXNzaWdubWVudFBhdHRlcm4oZXhwci52YWx1ZSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVByb3BlcnR5S2V5KGV4cHIua2V5LCBleHByLmNvbXB1dGVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIubWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVNZXRob2RQcmVmaXgoZXhwciksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoZXhwci52YWx1ZSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCksXG4gICAgICAgICAgICAgICAgJzonICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci52YWx1ZSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVClcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgT2JqZWN0RXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgbXVsdGlsaW5lLCByZXN1bHQsIGZyYWdtZW50LCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgaWYgKCFleHByLnByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICd7fSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtdWx0aWxpbmUgPSBleHByLnByb3BlcnRpZXMubGVuZ3RoID4gMTtcblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnByb3BlcnRpZXNbMF0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIW11bHRpbGluZSkge1xuICAgICAgICAgICAgICAgIC8vIGlzc3VlcyA0XG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHRyYW5zZm9ybSBmcm9tXG4gICAgICAgICAgICAgICAgLy8gICBkZWphdnUuQ2xhc3MuZGVjbGFyZSh7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgbWV0aG9kMjogZnVuY3Rpb24gKCkge31cbiAgICAgICAgICAgICAgICAvLyAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIHRvXG4gICAgICAgICAgICAgICAgLy8gICBkZWphdnUuQ2xhc3MuZGVjbGFyZSh7bWV0aG9kMjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIH19KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0xpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoZnJhZ21lbnQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbICd7Jywgc3BhY2UsIGZyYWdtZW50LCBzcGFjZSwgJ30nIF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uIChpbmRlbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSwgaXo7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gWyAneycsIG5ld2xpbmUsIGluZGVudCwgZnJhZ21lbnQgXTtcblxuICAgICAgICAgICAgICAgIGlmIChtdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgbmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDEsIGl6ID0gZXhwci5wcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGluZGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnByb3BlcnRpZXNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJhc2UpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ30nKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXNzaWdubWVudFBhdHRlcm46IGZ1bmN0aW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUFzc2lnbm1lbnQoZXhwci5sZWZ0LCBleHByLnJpZ2h0LCAnPScsIHByZWNlZGVuY2UsIGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBPYmplY3RQYXR0ZXJuOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGksIGl6LCBtdWx0aWxpbmUsIHByb3BlcnR5LCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIGlmICghZXhwci5wcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAne30nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtdWx0aWxpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChleHByLnByb3BlcnRpZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHkgPSBleHByLnByb3BlcnRpZXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS50eXBlID09PSBTeW50YXguUHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgJiYgcHJvcGVydHkudmFsdWUudHlwZSAhPT0gU3ludGF4LklkZW50aWZpZXJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZXhwci5wcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBleHByLnByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LnR5cGUgPT09IFN5bnRheC5Qcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXByb3BlcnR5LnNob3J0aGFuZFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpbGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IFsneycsIG11bHRpbGluZSA/IG5ld2xpbmUgOiAnJyBdO1xuXG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uIChpbmRlbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSwgaXo7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLnByb3BlcnRpZXMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChtdWx0aWxpbmUgPyBpbmRlbnQgOiAnJyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucHJvcGVydGllc1tpXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIChtdWx0aWxpbmUgPyBuZXdsaW5lIDogc3BhY2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAobXVsdGlsaW5lICYmICFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobXVsdGlsaW5lID8gYmFzZSA6ICcnKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCd9Jyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFRoaXNFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiAndGhpcyc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgU3VwZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuICdzdXBlcic7XG4gICAgICAgIH0sXG5cbiAgICAgICAgSWRlbnRpZmllcjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVJZGVudGlmaWVyKGV4cHIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEltcG9ydERlZmF1bHRTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlSWRlbnRpZmllcihleHByLmlkIHx8IGV4cHIubG9jYWwpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gWycqJ107XG4gICAgICAgICAgICB2YXIgaWQgPSBleHByLmlkIHx8IGV4cHIubG9jYWw7XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSArICdhcycgKyBub0VtcHR5U3BhY2UoKSArIGdlbmVyYXRlSWRlbnRpZmllcihpZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBJbXBvcnRTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIGltcG9ydGVkID0gZXhwci5pbXBvcnRlZDtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbIGltcG9ydGVkLm5hbWUgXTtcbiAgICAgICAgICAgIHZhciBsb2NhbCA9IGV4cHIubG9jYWw7XG4gICAgICAgICAgICBpZiAobG9jYWwgJiYgbG9jYWwubmFtZSAhPT0gaW1wb3J0ZWQubmFtZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vRW1wdHlTcGFjZSgpICsgJ2FzJyArIG5vRW1wdHlTcGFjZSgpICsgZ2VuZXJhdGVJZGVudGlmaWVyKGxvY2FsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEV4cG9ydFNwZWNpZmllcjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgbG9jYWwgPSBleHByLmxvY2FsO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsgbG9jYWwubmFtZSBdO1xuICAgICAgICAgICAgdmFyIGV4cG9ydGVkID0gZXhwci5leHBvcnRlZDtcbiAgICAgICAgICAgIGlmIChleHBvcnRlZCAmJiBleHBvcnRlZC5uYW1lICE9PSBsb2NhbC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9FbXB0eVNwYWNlKCkgKyAnYXMnICsgbm9FbXB0eVNwYWNlKCkgKyBnZW5lcmF0ZUlkZW50aWZpZXIoZXhwb3J0ZWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgTGl0ZXJhbDogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmF3O1xuICAgICAgICAgICAgaWYgKGV4cHIuaGFzT3duUHJvcGVydHkoJ3JhdycpICYmIHBhcnNlICYmIGV4dHJhLnJhdykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJhdyA9IHBhcnNlKGV4cHIucmF3KS5ib2R5WzBdLmV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYXcudHlwZSA9PT0gU3ludGF4LkxpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXcudmFsdWUgPT09IGV4cHIudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhwci5yYXc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdCB1c2UgcmF3IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci5yZWdleCkge1xuICAgICAgICAgICAgICByZXR1cm4gJy8nICsgZXhwci5yZWdleC5wYXR0ZXJuICsgJy8nICsgZXhwci5yZWdleC5mbGFncztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHByLnZhbHVlID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHByLnZhbHVlLnRvU3RyaW5nKCkgKyAnbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGBleHByLnZhbHVlYCBjYW4gYmUgbnVsbCBpZiBgZXhwci5iaWdpbnRgIGV4aXN0cy4gV2UgbmVlZCB0byBjaGVja1xuICAgICAgICAgICAgLy8gYGV4cHIuYmlnaW50YCBmaXJzdC5cbiAgICAgICAgICAgIGlmIChleHByLmJpZ2ludCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHByLmJpZ2ludCArICduJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIudmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4cHIudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZVN0cmluZyhleHByLnZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHByLnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZU51bWJlcihleHByLnZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHByLnZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwci52YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVJlZ0V4cChleHByLnZhbHVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBHZW5lcmF0b3JFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkNvbXByZWhlbnNpb25FeHByZXNzaW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDb21wcmVoZW5zaW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICAvLyBHZW5lcmF0b3JFeHByZXNzaW9uIHNob3VsZCBiZSBwYXJlbnRoZXNpemVkIHdpdGggKC4uLiksIENvbXByZWhlbnNpb25FeHByZXNzaW9uIHdpdGggWy4uLl1cbiAgICAgICAgICAgIC8vIER1ZSB0byBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODM0NjggcG9zaXRpb24gb2YgZXhwci5ib2R5IGNhbiBkaWZmZXIgaW4gU3BpZGVybW9ua2V5IGFuZCBFUzZcblxuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXosIGZyYWdtZW50LCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHJlc3VsdCA9IChleHByLnR5cGUgPT09IFN5bnRheC5HZW5lcmF0b3JFeHByZXNzaW9uKSA/IFsnKCddIDogWydbJ107XG5cbiAgICAgICAgICAgIGlmIChleHRyYS5tb3ouY29tcHJlaGVuc2lvbkV4cHJlc3Npb25TdGFydHNXaXRoQXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5ib2R5LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleHByLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHIuYmxvY2tzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5ibG9ja3NbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCB8fCBleHRyYS5tb3ouY29tcHJlaGVuc2lvbkV4cHJlc3Npb25TdGFydHNXaXRoQXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci5maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgJ2lmJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuZmlsdGVyLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFsgJygnLCBmcmFnbWVudCwgJyknIF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWV4dHJhLm1vei5jb21wcmVoZW5zaW9uRXhwcmVzc2lvblN0YXJ0c1dpdGhBc3NpZ25tZW50KSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmJvZHksIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpO1xuXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGZyYWdtZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goKGV4cHIudHlwZSA9PT0gU3ludGF4LkdlbmVyYXRvckV4cHJlc3Npb24pID8gJyknIDogJ10nKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ29tcHJlaGVuc2lvbkJsb2NrOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciBmcmFnbWVudDtcbiAgICAgICAgICAgIGlmIChleHByLmxlZnQudHlwZSA9PT0gU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IFtcbiAgICAgICAgICAgICAgICAgICAgZXhwci5sZWZ0LmtpbmQsIG5vRW1wdHlTcGFjZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KGV4cHIubGVmdC5kZWNsYXJhdGlvbnNbMF0sIFNfRkZGRilcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIubGVmdCwgUHJlY2VkZW5jZS5DYWxsLCBFX1RUVCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZyYWdtZW50ID0gam9pbihmcmFnbWVudCwgZXhwci5vZiA/ICdvZicgOiAnaW4nKTtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gam9pbihmcmFnbWVudCwgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5yaWdodCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKTtcblxuICAgICAgICAgICAgcmV0dXJuIFsgJ2ZvcicgKyBzcGFjZSArICcoJywgZnJhZ21lbnQsICcpJyBdO1xuICAgICAgICB9LFxuXG4gICAgICAgIFNwcmVhZEVsZW1lbnQ6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAnLi4uJyxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmFyZ3VtZW50LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSxcblxuICAgICAgICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIGl0ZW1GbGFncyA9IEVfVFRGO1xuICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBGX0FMTE9XX0NBTEwpKSB7XG4gICAgICAgICAgICAgICAgaXRlbUZsYWdzID0gRV9URkY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIudGFnLCBQcmVjZWRlbmNlLkNhbGwsIGl0ZW1GbGFncyksXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5xdWFzaSwgUHJlY2VkZW5jZS5QcmltYXJ5LCBFX0ZGVClcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5UYWdnZWRUZW1wbGF0ZSwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVGVtcGxhdGVFbGVtZW50OiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHVzZSBcImNvb2tlZFwiLiBTaW5jZSB0YWdnZWQgdGVtcGxhdGUgY2FuIHVzZSByYXcgdGVtcGxhdGVcbiAgICAgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uLiBTbyBpZiB3ZSBkbyBzbywgaXQgYnJlYWtzIHRoZSBzY3JpcHQgc2VtYW50aWNzLlxuICAgICAgICAgICAgcmV0dXJuIGV4cHIudmFsdWUucmF3O1xuICAgICAgICB9LFxuXG4gICAgICAgIFRlbXBsYXRlTGl0ZXJhbDogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpejtcbiAgICAgICAgICAgIHJlc3VsdCA9IFsgJ2AnIF07XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHIucXVhc2lzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnF1YXNpc1tpXSwgUHJlY2VkZW5jZS5QcmltYXJ5LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCckeycgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuZXhwcmVzc2lvbnNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlICsgJ30nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnYCcpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBNb2R1bGVTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuTGl0ZXJhbChleHByLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgSW1wb3J0RXhwcmVzc2lvbjogZnVuY3Rpb24oZXhwciwgcHJlY2VkZW5jZSwgZmxhZykge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShbXG4gICAgICAgICAgICAgICAgJ2ltcG9ydCgnLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuc291cmNlLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgIF0sIFByZWNlZGVuY2UuQ2FsbCwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbWVyZ2UoQ29kZUdlbmVyYXRvci5wcm90b3R5cGUsIENvZGVHZW5lcmF0b3IuRXhwcmVzc2lvbik7XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgdmFyIHJlc3VsdCwgdHlwZTtcblxuICAgICAgICB0eXBlID0gZXhwci50eXBlIHx8IFN5bnRheC5Qcm9wZXJ0eTtcblxuICAgICAgICBpZiAoZXh0cmEudmVyYmF0aW0gJiYgZXhwci5oYXNPd25Qcm9wZXJ0eShleHRyYS52ZXJiYXRpbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVZlcmJhdGltKGV4cHIsIHByZWNlZGVuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0gdGhpc1t0eXBlXShleHByLCBwcmVjZWRlbmNlLCBmbGFncyk7XG5cblxuICAgICAgICBpZiAoZXh0cmEuY29tbWVudCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYWRkQ29tbWVudHMoZXhwciwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQsIGV4cHIpO1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZVN0YXRlbWVudCA9IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICB2YXIgcmVzdWx0LFxuICAgICAgICAgICAgZnJhZ21lbnQ7XG5cbiAgICAgICAgcmVzdWx0ID0gdGhpc1tzdG10LnR5cGVdKHN0bXQsIGZsYWdzKTtcblxuICAgICAgICAvLyBBdHRhY2ggY29tbWVudHNcblxuICAgICAgICBpZiAoZXh0cmEuY29tbWVudCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYWRkQ29tbWVudHMoc3RtdCwgcmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZyYWdtZW50ID0gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChzdG10LnR5cGUgPT09IFN5bnRheC5Qcm9ncmFtICYmICFzYWZlQ29uY2F0ZW5hdGlvbiAmJiBuZXdsaW5lID09PSAnJyAmJiAgZnJhZ21lbnQuY2hhckF0KGZyYWdtZW50Lmxlbmd0aCAtIDEpID09PSAnXFxuJykge1xuICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlTWFwID8gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnJlcGxhY2VSaWdodCgvXFxzKyQvLCAnJykgOiBmcmFnbWVudC5yZXBsYWNlKC9cXHMrJC8sICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCwgc3RtdCk7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlSW50ZXJuYWwobm9kZSkge1xuICAgICAgICB2YXIgY29kZWdlbjtcblxuICAgICAgICBjb2RlZ2VuID0gbmV3IENvZGVHZW5lcmF0b3IoKTtcbiAgICAgICAgaWYgKGlzU3RhdGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29kZWdlbi5nZW5lcmF0ZVN0YXRlbWVudChub2RlLCBTX1RGRkYpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRXhwcmVzc2lvbihub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVnZW4uZ2VuZXJhdGVFeHByZXNzaW9uKG5vZGUsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBub2RlIHR5cGU6ICcgKyBub2RlLnR5cGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlKG5vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKSwgcmVzdWx0LCBwYWlyO1xuXG4gICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIE9ic29sZXRlIG9wdGlvbnNcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgIGBvcHRpb25zLmluZGVudGBcbiAgICAgICAgICAgIC8vICAgYG9wdGlvbnMuYmFzZWBcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIHRoZW0sIHdlIGNhbiB1c2UgYG9wdGlvbi5mb3JtYXQuaW5kZW50YC5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5pbmRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMuZm9ybWF0LmluZGVudC5zdHlsZSA9IG9wdGlvbnMuaW5kZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJhc2UgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMuZm9ybWF0LmluZGVudC5iYXNlID0gb3B0aW9ucy5iYXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3B0aW9ucyA9IHVwZGF0ZURlZXBseShkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgICAgICBpbmRlbnQgPSBvcHRpb25zLmZvcm1hdC5pbmRlbnQuc3R5bGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYmFzZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBiYXNlID0gb3B0aW9ucy5iYXNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBiYXNlID0gc3RyaW5nUmVwZWF0KGluZGVudCwgb3B0aW9ucy5mb3JtYXQuaW5kZW50LmJhc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgICAgICAgICAgaW5kZW50ID0gb3B0aW9ucy5mb3JtYXQuaW5kZW50LnN0eWxlO1xuICAgICAgICAgICAgYmFzZSA9IHN0cmluZ1JlcGVhdChpbmRlbnQsIG9wdGlvbnMuZm9ybWF0LmluZGVudC5iYXNlKTtcbiAgICAgICAgfVxuICAgICAgICBqc29uID0gb3B0aW9ucy5mb3JtYXQuanNvbjtcbiAgICAgICAgcmVudW1iZXIgPSBvcHRpb25zLmZvcm1hdC5yZW51bWJlcjtcbiAgICAgICAgaGV4YWRlY2ltYWwgPSBqc29uID8gZmFsc2UgOiBvcHRpb25zLmZvcm1hdC5oZXhhZGVjaW1hbDtcbiAgICAgICAgcXVvdGVzID0ganNvbiA/ICdkb3VibGUnIDogb3B0aW9ucy5mb3JtYXQucXVvdGVzO1xuICAgICAgICBlc2NhcGVsZXNzID0gb3B0aW9ucy5mb3JtYXQuZXNjYXBlbGVzcztcbiAgICAgICAgbmV3bGluZSA9IG9wdGlvbnMuZm9ybWF0Lm5ld2xpbmU7XG4gICAgICAgIHNwYWNlID0gb3B0aW9ucy5mb3JtYXQuc3BhY2U7XG4gICAgICAgIGlmIChvcHRpb25zLmZvcm1hdC5jb21wYWN0KSB7XG4gICAgICAgICAgICBuZXdsaW5lID0gc3BhY2UgPSBpbmRlbnQgPSBiYXNlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50aGVzZXMgPSBvcHRpb25zLmZvcm1hdC5wYXJlbnRoZXNlcztcbiAgICAgICAgc2VtaWNvbG9ucyA9IG9wdGlvbnMuZm9ybWF0LnNlbWljb2xvbnM7XG4gICAgICAgIHNhZmVDb25jYXRlbmF0aW9uID0gb3B0aW9ucy5mb3JtYXQuc2FmZUNvbmNhdGVuYXRpb247XG4gICAgICAgIGRpcmVjdGl2ZSA9IG9wdGlvbnMuZGlyZWN0aXZlO1xuICAgICAgICBwYXJzZSA9IGpzb24gPyBudWxsIDogb3B0aW9ucy5wYXJzZTtcbiAgICAgICAgc291cmNlTWFwID0gb3B0aW9ucy5zb3VyY2VNYXA7XG4gICAgICAgIHNvdXJjZUNvZGUgPSBvcHRpb25zLnNvdXJjZUNvZGU7XG4gICAgICAgIHByZXNlcnZlQmxhbmtMaW5lcyA9IG9wdGlvbnMuZm9ybWF0LnByZXNlcnZlQmxhbmtMaW5lcyAmJiBzb3VyY2VDb2RlICE9PSBudWxsO1xuICAgICAgICBleHRyYSA9IG9wdGlvbnM7XG5cbiAgICAgICAgaWYgKHNvdXJjZU1hcCkge1xuICAgICAgICAgICAgaWYgKCFleHBvcnRzLmJyb3dzZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBhc3N1bWUgZW52aXJvbm1lbnQgaXMgbm9kZS5qc1xuICAgICAgICAgICAgICAgIC8vIEFuZCBwcmV2ZW50IGZyb20gaW5jbHVkaW5nIHNvdXJjZS1tYXAgYnkgYnJvd3NlcmlmeVxuICAgICAgICAgICAgICAgIFNvdXJjZU5vZGUgPSByZXF1aXJlKCdzb3VyY2UtbWFwJykuU291cmNlTm9kZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgU291cmNlTm9kZSA9IGdsb2JhbC5zb3VyY2VNYXAuU291cmNlTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IGdlbmVyYXRlSW50ZXJuYWwobm9kZSk7XG5cbiAgICAgICAgaWYgKCFzb3VyY2VNYXApIHtcbiAgICAgICAgICAgIHBhaXIgPSB7Y29kZTogcmVzdWx0LnRvU3RyaW5nKCksIG1hcDogbnVsbH07XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5zb3VyY2VNYXBXaXRoQ29kZSA/IHBhaXIgOiBwYWlyLmNvZGU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIHBhaXIgPSByZXN1bHQudG9TdHJpbmdXaXRoU291cmNlTWFwKHtcbiAgICAgICAgICAgIGZpbGU6IG9wdGlvbnMuZmlsZSxcbiAgICAgICAgICAgIHNvdXJjZVJvb3Q6IG9wdGlvbnMuc291cmNlTWFwUm9vdFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAob3B0aW9ucy5zb3VyY2VDb250ZW50KSB7XG4gICAgICAgICAgICBwYWlyLm1hcC5zZXRTb3VyY2VDb250ZW50KG9wdGlvbnMuc291cmNlTWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNvdXJjZUNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc291cmNlTWFwV2l0aENvZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWlyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhaXIubWFwLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgRk9STUFUX01JTklGWSA9IHtcbiAgICAgICAgaW5kZW50OiB7XG4gICAgICAgICAgICBzdHlsZTogJycsXG4gICAgICAgICAgICBiYXNlOiAwXG4gICAgICAgIH0sXG4gICAgICAgIHJlbnVtYmVyOiB0cnVlLFxuICAgICAgICBoZXhhZGVjaW1hbDogdHJ1ZSxcbiAgICAgICAgcXVvdGVzOiAnYXV0bycsXG4gICAgICAgIGVzY2FwZWxlc3M6IHRydWUsXG4gICAgICAgIGNvbXBhY3Q6IHRydWUsXG4gICAgICAgIHBhcmVudGhlc2VzOiBmYWxzZSxcbiAgICAgICAgc2VtaWNvbG9uczogZmFsc2VcbiAgICB9O1xuXG4gICAgRk9STUFUX0RFRkFVTFRTID0gZ2V0RGVmYXVsdE9wdGlvbnMoKS5mb3JtYXQ7XG5cbiAgICBleHBvcnRzLnZlcnNpb24gPSByZXF1aXJlKCcuL3BhY2thZ2UuanNvbicpLnZlcnNpb247XG4gICAgZXhwb3J0cy5nZW5lcmF0ZSA9IGdlbmVyYXRlO1xuICAgIGV4cG9ydHMuYXR0YWNoQ29tbWVudHMgPSBlc3RyYXZlcnNlLmF0dGFjaENvbW1lbnRzO1xuICAgIGV4cG9ydHMuUHJlY2VkZW5jZSA9IHVwZGF0ZURlZXBseSh7fSwgUHJlY2VkZW5jZSk7XG4gICAgZXhwb3J0cy5icm93c2VyID0gZmFsc2U7XG4gICAgZXhwb3J0cy5GT1JNQVRfTUlOSUZZID0gRk9STUFUX01JTklGWTtcbiAgICBleHBvcnRzLkZPUk1BVF9ERUZBVUxUUyA9IEZPUk1BVF9ERUZBVUxUUztcbn0oKSk7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJlc3ByaW1hXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImVzcHJpbWFcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9LFxuLyoqKioqKi8gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bG9hZGVkOiBmYWxzZVxuLyoqKioqKi8gXHRcdH07XG5cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG5cblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0Lypcblx0ICBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzLCBodHRwczovL2pzLmZvdW5kYXRpb24vXG5cblx0ICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcblx0ICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuXHQgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuXHQgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG5cdCAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG5cdCAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcblx0ICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuXHQgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG5cdCAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuXHQgIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG5cdCAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuXHQgIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG5cdCAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuXHQgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuXHQgIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG5cdCAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG5cdCAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblx0Ki9cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHR2YXIgY29tbWVudF9oYW5kbGVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXHR2YXIganN4X3BhcnNlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblx0dmFyIHBhcnNlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblx0dmFyIHRva2VuaXplcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNSk7XG5cdGZ1bmN0aW9uIHBhcnNlKGNvZGUsIG9wdGlvbnMsIGRlbGVnYXRlKSB7XG5cdCAgICB2YXIgY29tbWVudEhhbmRsZXIgPSBudWxsO1xuXHQgICAgdmFyIHByb3h5RGVsZWdhdGUgPSBmdW5jdGlvbiAobm9kZSwgbWV0YWRhdGEpIHtcblx0ICAgICAgICBpZiAoZGVsZWdhdGUpIHtcblx0ICAgICAgICAgICAgZGVsZWdhdGUobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoY29tbWVudEhhbmRsZXIpIHtcblx0ICAgICAgICAgICAgY29tbWVudEhhbmRsZXIudmlzaXQobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICB2YXIgcGFyc2VyRGVsZWdhdGUgPSAodHlwZW9mIGRlbGVnYXRlID09PSAnZnVuY3Rpb24nKSA/IHByb3h5RGVsZWdhdGUgOiBudWxsO1xuXHQgICAgdmFyIGNvbGxlY3RDb21tZW50ID0gZmFsc2U7XG5cdCAgICBpZiAob3B0aW9ucykge1xuXHQgICAgICAgIGNvbGxlY3RDb21tZW50ID0gKHR5cGVvZiBvcHRpb25zLmNvbW1lbnQgPT09ICdib29sZWFuJyAmJiBvcHRpb25zLmNvbW1lbnQpO1xuXHQgICAgICAgIHZhciBhdHRhY2hDb21tZW50ID0gKHR5cGVvZiBvcHRpb25zLmF0dGFjaENvbW1lbnQgPT09ICdib29sZWFuJyAmJiBvcHRpb25zLmF0dGFjaENvbW1lbnQpO1xuXHQgICAgICAgIGlmIChjb2xsZWN0Q29tbWVudCB8fCBhdHRhY2hDb21tZW50KSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnRIYW5kbGVyID0gbmV3IGNvbW1lbnRfaGFuZGxlcl8xLkNvbW1lbnRIYW5kbGVyKCk7XG5cdCAgICAgICAgICAgIGNvbW1lbnRIYW5kbGVyLmF0dGFjaCA9IGF0dGFjaENvbW1lbnQ7XG5cdCAgICAgICAgICAgIG9wdGlvbnMuY29tbWVudCA9IHRydWU7XG5cdCAgICAgICAgICAgIHBhcnNlckRlbGVnYXRlID0gcHJveHlEZWxlZ2F0ZTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICB2YXIgaXNNb2R1bGUgPSBmYWxzZTtcblx0ICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnNvdXJjZVR5cGUgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgaXNNb2R1bGUgPSAob3B0aW9ucy5zb3VyY2VUeXBlID09PSAnbW9kdWxlJyk7XG5cdCAgICB9XG5cdCAgICB2YXIgcGFyc2VyO1xuXHQgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMuanN4ID09PSAnYm9vbGVhbicgJiYgb3B0aW9ucy5qc3gpIHtcblx0ICAgICAgICBwYXJzZXIgPSBuZXcganN4X3BhcnNlcl8xLkpTWFBhcnNlcihjb2RlLCBvcHRpb25zLCBwYXJzZXJEZWxlZ2F0ZSk7XG5cdCAgICB9XG5cdCAgICBlbHNlIHtcblx0ICAgICAgICBwYXJzZXIgPSBuZXcgcGFyc2VyXzEuUGFyc2VyKGNvZGUsIG9wdGlvbnMsIHBhcnNlckRlbGVnYXRlKTtcblx0ICAgIH1cblx0ICAgIHZhciBwcm9ncmFtID0gaXNNb2R1bGUgPyBwYXJzZXIucGFyc2VNb2R1bGUoKSA6IHBhcnNlci5wYXJzZVNjcmlwdCgpO1xuXHQgICAgdmFyIGFzdCA9IHByb2dyYW07XG5cdCAgICBpZiAoY29sbGVjdENvbW1lbnQgJiYgY29tbWVudEhhbmRsZXIpIHtcblx0ICAgICAgICBhc3QuY29tbWVudHMgPSBjb21tZW50SGFuZGxlci5jb21tZW50cztcblx0ICAgIH1cblx0ICAgIGlmIChwYXJzZXIuY29uZmlnLnRva2Vucykge1xuXHQgICAgICAgIGFzdC50b2tlbnMgPSBwYXJzZXIudG9rZW5zO1xuXHQgICAgfVxuXHQgICAgaWYgKHBhcnNlci5jb25maWcudG9sZXJhbnQpIHtcblx0ICAgICAgICBhc3QuZXJyb3JzID0gcGFyc2VyLmVycm9ySGFuZGxlci5lcnJvcnM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gYXN0O1xuXHR9XG5cdGV4cG9ydHMucGFyc2UgPSBwYXJzZTtcblx0ZnVuY3Rpb24gcGFyc2VNb2R1bGUoY29kZSwgb3B0aW9ucywgZGVsZWdhdGUpIHtcblx0ICAgIHZhciBwYXJzaW5nT3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdCAgICBwYXJzaW5nT3B0aW9ucy5zb3VyY2VUeXBlID0gJ21vZHVsZSc7XG5cdCAgICByZXR1cm4gcGFyc2UoY29kZSwgcGFyc2luZ09wdGlvbnMsIGRlbGVnYXRlKTtcblx0fVxuXHRleHBvcnRzLnBhcnNlTW9kdWxlID0gcGFyc2VNb2R1bGU7XG5cdGZ1bmN0aW9uIHBhcnNlU2NyaXB0KGNvZGUsIG9wdGlvbnMsIGRlbGVnYXRlKSB7XG5cdCAgICB2YXIgcGFyc2luZ09wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHQgICAgcGFyc2luZ09wdGlvbnMuc291cmNlVHlwZSA9ICdzY3JpcHQnO1xuXHQgICAgcmV0dXJuIHBhcnNlKGNvZGUsIHBhcnNpbmdPcHRpb25zLCBkZWxlZ2F0ZSk7XG5cdH1cblx0ZXhwb3J0cy5wYXJzZVNjcmlwdCA9IHBhcnNlU2NyaXB0O1xuXHRmdW5jdGlvbiB0b2tlbml6ZShjb2RlLCBvcHRpb25zLCBkZWxlZ2F0ZSkge1xuXHQgICAgdmFyIHRva2VuaXplciA9IG5ldyB0b2tlbml6ZXJfMS5Ub2tlbml6ZXIoY29kZSwgb3B0aW9ucyk7XG5cdCAgICB2YXIgdG9rZW5zO1xuXHQgICAgdG9rZW5zID0gW107XG5cdCAgICB0cnkge1xuXHQgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgaWYgKCF0b2tlbikge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IGRlbGVnYXRlKHRva2VuKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgY2F0Y2ggKGUpIHtcblx0ICAgICAgICB0b2tlbml6ZXIuZXJyb3JIYW5kbGVyLnRvbGVyYXRlKGUpO1xuXHQgICAgfVxuXHQgICAgaWYgKHRva2VuaXplci5lcnJvckhhbmRsZXIudG9sZXJhbnQpIHtcblx0ICAgICAgICB0b2tlbnMuZXJyb3JzID0gdG9rZW5pemVyLmVycm9ycygpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHRva2Vucztcblx0fVxuXHRleHBvcnRzLnRva2VuaXplID0gdG9rZW5pemU7XG5cdHZhciBzeW50YXhfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdGV4cG9ydHMuU3ludGF4ID0gc3ludGF4XzEuU3ludGF4O1xuXHQvLyBTeW5jIHdpdGggKi5qc29uIG1hbmlmZXN0cy5cblx0ZXhwb3J0cy52ZXJzaW9uID0gJzQuMC4xJztcblxuXG4vKioqLyB9LFxuLyogMSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIHN5bnRheF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0dmFyIENvbW1lbnRIYW5kbGVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENvbW1lbnRIYW5kbGVyKCkge1xuXHQgICAgICAgIHRoaXMuYXR0YWNoID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5jb21tZW50cyA9IFtdO1xuXHQgICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcblx0ICAgICAgICB0aGlzLmxlYWRpbmcgPSBbXTtcblx0ICAgICAgICB0aGlzLnRyYWlsaW5nID0gW107XG5cdCAgICB9XG5cdCAgICBDb21tZW50SGFuZGxlci5wcm90b3R5cGUuaW5zZXJ0SW5uZXJDb21tZW50cyA9IGZ1bmN0aW9uIChub2RlLCBtZXRhZGF0YSkge1xuXHQgICAgICAgIC8vICBpbm5uZXJDb21tZW50cyBmb3IgcHJvcGVydGllcyBlbXB0eSBibG9ja1xuXHQgICAgICAgIC8vICBgZnVuY3Rpb24gYSgpIHsvKiogY29tbWVudHMgKipcXC99YFxuXHQgICAgICAgIGlmIChub2RlLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5CbG9ja1N0YXRlbWVudCAmJiBub2RlLmJvZHkubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgIHZhciBpbm5lckNvbW1lbnRzID0gW107XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmxlYWRpbmcubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMubGVhZGluZ1tpXTtcblx0ICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5lbmQub2Zmc2V0ID49IGVudHJ5LnN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5uZXJDb21tZW50cy51bnNoaWZ0KGVudHJ5LmNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubGVhZGluZy5zcGxpY2UoaSwgMSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFpbGluZy5zcGxpY2UoaSwgMSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGlubmVyQ29tbWVudHMubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICBub2RlLmlubmVyQ29tbWVudHMgPSBpbm5lckNvbW1lbnRzO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIENvbW1lbnRIYW5kbGVyLnByb3RvdHlwZS5maW5kVHJhaWxpbmdDb21tZW50cyA9IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuXHQgICAgICAgIHZhciB0cmFpbGluZ0NvbW1lbnRzID0gW107XG5cdCAgICAgICAgaWYgKHRoaXMudHJhaWxpbmcubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy50cmFpbGluZy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGVudHJ5XzEgPSB0aGlzLnRyYWlsaW5nW2ldO1xuXHQgICAgICAgICAgICAgICAgaWYgKGVudHJ5XzEuc3RhcnQgPj0gbWV0YWRhdGEuZW5kLm9mZnNldCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nQ29tbWVudHMudW5zaGlmdChlbnRyeV8xLmNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMudHJhaWxpbmcubGVuZ3RoID0gMDtcblx0ICAgICAgICAgICAgcmV0dXJuIHRyYWlsaW5nQ29tbWVudHM7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBlbnRyeSA9IHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXTtcblx0ICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkubm9kZS50cmFpbGluZ0NvbW1lbnRzKSB7XG5cdCAgICAgICAgICAgIHZhciBmaXJzdENvbW1lbnQgPSBlbnRyeS5ub2RlLnRyYWlsaW5nQ29tbWVudHNbMF07XG5cdCAgICAgICAgICAgIGlmIChmaXJzdENvbW1lbnQgJiYgZmlyc3RDb21tZW50LnJhbmdlWzBdID49IG1ldGFkYXRhLmVuZC5vZmZzZXQpIHtcblx0ICAgICAgICAgICAgICAgIHRyYWlsaW5nQ29tbWVudHMgPSBlbnRyeS5ub2RlLnRyYWlsaW5nQ29tbWVudHM7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgZW50cnkubm9kZS50cmFpbGluZ0NvbW1lbnRzO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0cmFpbGluZ0NvbW1lbnRzO1xuXHQgICAgfTtcblx0ICAgIENvbW1lbnRIYW5kbGVyLnByb3RvdHlwZS5maW5kTGVhZGluZ0NvbW1lbnRzID0gZnVuY3Rpb24gKG1ldGFkYXRhKSB7XG5cdCAgICAgICAgdmFyIGxlYWRpbmdDb21tZW50cyA9IFtdO1xuXHQgICAgICAgIHZhciB0YXJnZXQ7XG5cdCAgICAgICAgd2hpbGUgKHRoaXMuc3RhY2subGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG5cdCAgICAgICAgICAgIGlmIChlbnRyeSAmJiBlbnRyeS5zdGFydCA+PSBtZXRhZGF0YS5zdGFydC5vZmZzZXQpIHtcblx0ICAgICAgICAgICAgICAgIHRhcmdldCA9IGVudHJ5Lm5vZGU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRhcmdldCkge1xuXHQgICAgICAgICAgICB2YXIgY291bnQgPSB0YXJnZXQubGVhZGluZ0NvbW1lbnRzID8gdGFyZ2V0LmxlYWRpbmdDb21tZW50cy5sZW5ndGggOiAwO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gY291bnQgLSAxOyBpID49IDA7IC0taSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSB0YXJnZXQubGVhZGluZ0NvbW1lbnRzW2ldO1xuXHQgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQucmFuZ2VbMV0gPD0gbWV0YWRhdGEuc3RhcnQub2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVhZGluZ0NvbW1lbnRzLnVuc2hpZnQoY29tbWVudCk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmxlYWRpbmdDb21tZW50cy5zcGxpY2UoaSwgMSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKHRhcmdldC5sZWFkaW5nQ29tbWVudHMgJiYgdGFyZ2V0LmxlYWRpbmdDb21tZW50cy5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXJnZXQubGVhZGluZ0NvbW1lbnRzO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBsZWFkaW5nQ29tbWVudHM7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmxlYWRpbmcubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcblx0ICAgICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5sZWFkaW5nW2ldO1xuXHQgICAgICAgICAgICBpZiAoZW50cnkuc3RhcnQgPD0gbWV0YWRhdGEuc3RhcnQub2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICBsZWFkaW5nQ29tbWVudHMudW5zaGlmdChlbnRyeS5jb21tZW50KTtcblx0ICAgICAgICAgICAgICAgIHRoaXMubGVhZGluZy5zcGxpY2UoaSwgMSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGxlYWRpbmdDb21tZW50cztcblx0ICAgIH07XG5cdCAgICBDb21tZW50SGFuZGxlci5wcm90b3R5cGUudmlzaXROb2RlID0gZnVuY3Rpb24gKG5vZGUsIG1ldGFkYXRhKSB7XG5cdCAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LlByb2dyYW0gJiYgbm9kZS5ib2R5Lmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmluc2VydElubmVyQ29tbWVudHMobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgIHZhciB0cmFpbGluZ0NvbW1lbnRzID0gdGhpcy5maW5kVHJhaWxpbmdDb21tZW50cyhtZXRhZGF0YSk7XG5cdCAgICAgICAgdmFyIGxlYWRpbmdDb21tZW50cyA9IHRoaXMuZmluZExlYWRpbmdDb21tZW50cyhtZXRhZGF0YSk7XG5cdCAgICAgICAgaWYgKGxlYWRpbmdDb21tZW50cy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIG5vZGUubGVhZGluZ0NvbW1lbnRzID0gbGVhZGluZ0NvbW1lbnRzO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodHJhaWxpbmdDb21tZW50cy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIG5vZGUudHJhaWxpbmdDb21tZW50cyA9IHRyYWlsaW5nQ29tbWVudHM7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG5cdCAgICAgICAgICAgIG5vZGU6IG5vZGUsXG5cdCAgICAgICAgICAgIHN0YXJ0OiBtZXRhZGF0YS5zdGFydC5vZmZzZXRcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICBDb21tZW50SGFuZGxlci5wcm90b3R5cGUudmlzaXRDb21tZW50ID0gZnVuY3Rpb24gKG5vZGUsIG1ldGFkYXRhKSB7XG5cdCAgICAgICAgdmFyIHR5cGUgPSAobm9kZS50eXBlWzBdID09PSAnTCcpID8gJ0xpbmUnIDogJ0Jsb2NrJztcblx0ICAgICAgICB2YXIgY29tbWVudCA9IHtcblx0ICAgICAgICAgICAgdHlwZTogdHlwZSxcblx0ICAgICAgICAgICAgdmFsdWU6IG5vZGUudmFsdWVcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGlmIChub2RlLnJhbmdlKSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnQucmFuZ2UgPSBub2RlLnJhbmdlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAobm9kZS5sb2MpIHtcblx0ICAgICAgICAgICAgY29tbWVudC5sb2MgPSBub2RlLmxvYztcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuXHQgICAgICAgIGlmICh0aGlzLmF0dGFjaCkge1xuXHQgICAgICAgICAgICB2YXIgZW50cnkgPSB7XG5cdCAgICAgICAgICAgICAgICBjb21tZW50OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbm9kZS52YWx1ZSxcblx0ICAgICAgICAgICAgICAgICAgICByYW5nZTogW21ldGFkYXRhLnN0YXJ0Lm9mZnNldCwgbWV0YWRhdGEuZW5kLm9mZnNldF1cblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBzdGFydDogbWV0YWRhdGEuc3RhcnQub2Zmc2V0XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIGlmIChub2RlLmxvYykge1xuXHQgICAgICAgICAgICAgICAgZW50cnkuY29tbWVudC5sb2MgPSBub2RlLmxvYztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBub2RlLnR5cGUgPSB0eXBlO1xuXHQgICAgICAgICAgICB0aGlzLmxlYWRpbmcucHVzaChlbnRyeSk7XG5cdCAgICAgICAgICAgIHRoaXMudHJhaWxpbmcucHVzaChlbnRyeSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIENvbW1lbnRIYW5kbGVyLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uIChub2RlLCBtZXRhZGF0YSkge1xuXHQgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdMaW5lQ29tbWVudCcpIHtcblx0ICAgICAgICAgICAgdGhpcy52aXNpdENvbW1lbnQobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdCbG9ja0NvbW1lbnQnKSB7XG5cdCAgICAgICAgICAgIHRoaXMudmlzaXRDb21tZW50KG5vZGUsIG1ldGFkYXRhKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodGhpcy5hdHRhY2gpIHtcblx0ICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICByZXR1cm4gQ29tbWVudEhhbmRsZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuQ29tbWVudEhhbmRsZXIgPSBDb21tZW50SGFuZGxlcjtcblxuXG4vKioqLyB9LFxuLyogMiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0ZXhwb3J0cy5TeW50YXggPSB7XG5cdCAgICBBc3NpZ25tZW50RXhwcmVzc2lvbjogJ0Fzc2lnbm1lbnRFeHByZXNzaW9uJyxcblx0ICAgIEFzc2lnbm1lbnRQYXR0ZXJuOiAnQXNzaWdubWVudFBhdHRlcm4nLFxuXHQgICAgQXJyYXlFeHByZXNzaW9uOiAnQXJyYXlFeHByZXNzaW9uJyxcblx0ICAgIEFycmF5UGF0dGVybjogJ0FycmF5UGF0dGVybicsXG5cdCAgICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJyxcblx0ICAgIEF3YWl0RXhwcmVzc2lvbjogJ0F3YWl0RXhwcmVzc2lvbicsXG5cdCAgICBCbG9ja1N0YXRlbWVudDogJ0Jsb2NrU3RhdGVtZW50Jyxcblx0ICAgIEJpbmFyeUV4cHJlc3Npb246ICdCaW5hcnlFeHByZXNzaW9uJyxcblx0ICAgIEJyZWFrU3RhdGVtZW50OiAnQnJlYWtTdGF0ZW1lbnQnLFxuXHQgICAgQ2FsbEV4cHJlc3Npb246ICdDYWxsRXhwcmVzc2lvbicsXG5cdCAgICBDYXRjaENsYXVzZTogJ0NhdGNoQ2xhdXNlJyxcblx0ICAgIENsYXNzQm9keTogJ0NsYXNzQm9keScsXG5cdCAgICBDbGFzc0RlY2xhcmF0aW9uOiAnQ2xhc3NEZWNsYXJhdGlvbicsXG5cdCAgICBDbGFzc0V4cHJlc3Npb246ICdDbGFzc0V4cHJlc3Npb24nLFxuXHQgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uOiAnQ29uZGl0aW9uYWxFeHByZXNzaW9uJyxcblx0ICAgIENvbnRpbnVlU3RhdGVtZW50OiAnQ29udGludWVTdGF0ZW1lbnQnLFxuXHQgICAgRG9XaGlsZVN0YXRlbWVudDogJ0RvV2hpbGVTdGF0ZW1lbnQnLFxuXHQgICAgRGVidWdnZXJTdGF0ZW1lbnQ6ICdEZWJ1Z2dlclN0YXRlbWVudCcsXG5cdCAgICBFbXB0eVN0YXRlbWVudDogJ0VtcHR5U3RhdGVtZW50Jyxcblx0ICAgIEV4cG9ydEFsbERlY2xhcmF0aW9uOiAnRXhwb3J0QWxsRGVjbGFyYXRpb24nLFxuXHQgICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uOiAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJyxcblx0ICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb246ICdFeHBvcnROYW1lZERlY2xhcmF0aW9uJyxcblx0ICAgIEV4cG9ydFNwZWNpZmllcjogJ0V4cG9ydFNwZWNpZmllcicsXG5cdCAgICBFeHByZXNzaW9uU3RhdGVtZW50OiAnRXhwcmVzc2lvblN0YXRlbWVudCcsXG5cdCAgICBGb3JTdGF0ZW1lbnQ6ICdGb3JTdGF0ZW1lbnQnLFxuXHQgICAgRm9yT2ZTdGF0ZW1lbnQ6ICdGb3JPZlN0YXRlbWVudCcsXG5cdCAgICBGb3JJblN0YXRlbWVudDogJ0ZvckluU3RhdGVtZW50Jyxcblx0ICAgIEZ1bmN0aW9uRGVjbGFyYXRpb246ICdGdW5jdGlvbkRlY2xhcmF0aW9uJyxcblx0ICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogJ0Z1bmN0aW9uRXhwcmVzc2lvbicsXG5cdCAgICBJZGVudGlmaWVyOiAnSWRlbnRpZmllcicsXG5cdCAgICBJZlN0YXRlbWVudDogJ0lmU3RhdGVtZW50Jyxcblx0ICAgIEltcG9ydERlY2xhcmF0aW9uOiAnSW1wb3J0RGVjbGFyYXRpb24nLFxuXHQgICAgSW1wb3J0RGVmYXVsdFNwZWNpZmllcjogJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInLFxuXHQgICAgSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyOiAnSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyJyxcblx0ICAgIEltcG9ydFNwZWNpZmllcjogJ0ltcG9ydFNwZWNpZmllcicsXG5cdCAgICBMaXRlcmFsOiAnTGl0ZXJhbCcsXG5cdCAgICBMYWJlbGVkU3RhdGVtZW50OiAnTGFiZWxlZFN0YXRlbWVudCcsXG5cdCAgICBMb2dpY2FsRXhwcmVzc2lvbjogJ0xvZ2ljYWxFeHByZXNzaW9uJyxcblx0ICAgIE1lbWJlckV4cHJlc3Npb246ICdNZW1iZXJFeHByZXNzaW9uJyxcblx0ICAgIE1ldGFQcm9wZXJ0eTogJ01ldGFQcm9wZXJ0eScsXG5cdCAgICBNZXRob2REZWZpbml0aW9uOiAnTWV0aG9kRGVmaW5pdGlvbicsXG5cdCAgICBOZXdFeHByZXNzaW9uOiAnTmV3RXhwcmVzc2lvbicsXG5cdCAgICBPYmplY3RFeHByZXNzaW9uOiAnT2JqZWN0RXhwcmVzc2lvbicsXG5cdCAgICBPYmplY3RQYXR0ZXJuOiAnT2JqZWN0UGF0dGVybicsXG5cdCAgICBQcm9ncmFtOiAnUHJvZ3JhbScsXG5cdCAgICBQcm9wZXJ0eTogJ1Byb3BlcnR5Jyxcblx0ICAgIFJlc3RFbGVtZW50OiAnUmVzdEVsZW1lbnQnLFxuXHQgICAgUmV0dXJuU3RhdGVtZW50OiAnUmV0dXJuU3RhdGVtZW50Jyxcblx0ICAgIFNlcXVlbmNlRXhwcmVzc2lvbjogJ1NlcXVlbmNlRXhwcmVzc2lvbicsXG5cdCAgICBTcHJlYWRFbGVtZW50OiAnU3ByZWFkRWxlbWVudCcsXG5cdCAgICBTdXBlcjogJ1N1cGVyJyxcblx0ICAgIFN3aXRjaENhc2U6ICdTd2l0Y2hDYXNlJyxcblx0ICAgIFN3aXRjaFN0YXRlbWVudDogJ1N3aXRjaFN0YXRlbWVudCcsXG5cdCAgICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246ICdUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24nLFxuXHQgICAgVGVtcGxhdGVFbGVtZW50OiAnVGVtcGxhdGVFbGVtZW50Jyxcblx0ICAgIFRlbXBsYXRlTGl0ZXJhbDogJ1RlbXBsYXRlTGl0ZXJhbCcsXG5cdCAgICBUaGlzRXhwcmVzc2lvbjogJ1RoaXNFeHByZXNzaW9uJyxcblx0ICAgIFRocm93U3RhdGVtZW50OiAnVGhyb3dTdGF0ZW1lbnQnLFxuXHQgICAgVHJ5U3RhdGVtZW50OiAnVHJ5U3RhdGVtZW50Jyxcblx0ICAgIFVuYXJ5RXhwcmVzc2lvbjogJ1VuYXJ5RXhwcmVzc2lvbicsXG5cdCAgICBVcGRhdGVFeHByZXNzaW9uOiAnVXBkYXRlRXhwcmVzc2lvbicsXG5cdCAgICBWYXJpYWJsZURlY2xhcmF0aW9uOiAnVmFyaWFibGVEZWNsYXJhdGlvbicsXG5cdCAgICBWYXJpYWJsZURlY2xhcmF0b3I6ICdWYXJpYWJsZURlY2xhcmF0b3InLFxuXHQgICAgV2hpbGVTdGF0ZW1lbnQ6ICdXaGlsZVN0YXRlbWVudCcsXG5cdCAgICBXaXRoU3RhdGVtZW50OiAnV2l0aFN0YXRlbWVudCcsXG5cdCAgICBZaWVsZEV4cHJlc3Npb246ICdZaWVsZEV4cHJlc3Npb24nXG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0dmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcblx0ICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG5cdCAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XG5cdCAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcblx0ICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuXHQgICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuXHQgICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcblx0ICAgIH07XG5cdH0pKCk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIGNoYXJhY3Rlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0dmFyIEpTWE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHR2YXIganN4X3N5bnRheF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblx0dmFyIE5vZGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXHR2YXIgcGFyc2VyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDgpO1xuXHR2YXIgdG9rZW5fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHR2YXIgeGh0bWxfZW50aXRpZXNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTQpO1xuXHR0b2tlbl8xLlRva2VuTmFtZVsxMDAgLyogSWRlbnRpZmllciAqL10gPSAnSlNYSWRlbnRpZmllcic7XG5cdHRva2VuXzEuVG9rZW5OYW1lWzEwMSAvKiBUZXh0ICovXSA9ICdKU1hUZXh0Jztcblx0Ly8gRnVsbHkgcXVhbGlmaWVkIGVsZW1lbnQgbmFtZSwgZS5nLiA8c3ZnOnBhdGg+IHJldHVybnMgXCJzdmc6cGF0aFwiXG5cdGZ1bmN0aW9uIGdldFF1YWxpZmllZEVsZW1lbnROYW1lKGVsZW1lbnROYW1lKSB7XG5cdCAgICB2YXIgcXVhbGlmaWVkTmFtZTtcblx0ICAgIHN3aXRjaCAoZWxlbWVudE5hbWUudHlwZSkge1xuXHQgICAgICAgIGNhc2UganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hJZGVudGlmaWVyOlxuXHQgICAgICAgICAgICB2YXIgaWQgPSBlbGVtZW50TmFtZTtcblx0ICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSA9IGlkLm5hbWU7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIGNhc2UganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hOYW1lc3BhY2VkTmFtZTpcblx0ICAgICAgICAgICAgdmFyIG5zID0gZWxlbWVudE5hbWU7XG5cdCAgICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSBnZXRRdWFsaWZpZWRFbGVtZW50TmFtZShucy5uYW1lc3BhY2UpICsgJzonICtcblx0ICAgICAgICAgICAgICAgIGdldFF1YWxpZmllZEVsZW1lbnROYW1lKG5zLm5hbWUpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYTWVtYmVyRXhwcmVzc2lvbjpcblx0ICAgICAgICAgICAgdmFyIGV4cHIgPSBlbGVtZW50TmFtZTtcblx0ICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSA9IGdldFF1YWxpZmllZEVsZW1lbnROYW1lKGV4cHIub2JqZWN0KSArICcuJyArXG5cdCAgICAgICAgICAgICAgICBnZXRRdWFsaWZpZWRFbGVtZW50TmFtZShleHByLnByb3BlcnR5KTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0ICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgIH1cblx0ICAgIHJldHVybiBxdWFsaWZpZWROYW1lO1xuXHR9XG5cdHZhciBKU1hQYXJzZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuXHQgICAgX19leHRlbmRzKEpTWFBhcnNlciwgX3N1cGVyKTtcblx0ICAgIGZ1bmN0aW9uIEpTWFBhcnNlcihjb2RlLCBvcHRpb25zLCBkZWxlZ2F0ZSkge1xuXHQgICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBjb2RlLCBvcHRpb25zLCBkZWxlZ2F0ZSkgfHwgdGhpcztcblx0ICAgIH1cblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VQcmltYXJ5RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5tYXRjaCgnPCcpID8gdGhpcy5wYXJzZUpTWFJvb3QoKSA6IF9zdXBlci5wcm90b3R5cGUucGFyc2VQcmltYXJ5RXhwcmVzc2lvbi5jYWxsKHRoaXMpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUuc3RhcnRKU1ggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy8gVW53aW5kIHRoZSBzY2FubmVyIGJlZm9yZSB0aGUgbG9va2FoZWFkIHRva2VuLlxuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5pbmRleCA9IHRoaXMuc3RhcnRNYXJrZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIgPSB0aGlzLnN0YXJ0TWFya2VyLmxpbmU7XG5cdCAgICAgICAgdGhpcy5zY2FubmVyLmxpbmVTdGFydCA9IHRoaXMuc3RhcnRNYXJrZXIuaW5kZXggLSB0aGlzLnN0YXJ0TWFya2VyLmNvbHVtbjtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLmZpbmlzaEpTWCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAvLyBQcmltZSB0aGUgbmV4dCBsb29rYWhlYWQuXG5cdCAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnJlZW50ZXJKU1ggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5zdGFydEpTWCgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0SlNYKCd9Jyk7XG5cdCAgICAgICAgLy8gUG9wIHRoZSBjbG9zaW5nICd9JyBhZGRlZCBmcm9tIHRoZSBsb29rYWhlYWQuXG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLnRva2Vucykge1xuXHQgICAgICAgICAgICB0aGlzLnRva2Vucy5wb3AoKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVKU1hOb2RlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuY29sbGVjdENvbW1lbnRzKCk7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgaW5kZXg6IHRoaXMuc2Nhbm5lci5pbmRleCxcblx0ICAgICAgICAgICAgbGluZTogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVKU1hDaGlsZE5vZGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgaW5kZXg6IHRoaXMuc2Nhbm5lci5pbmRleCxcblx0ICAgICAgICAgICAgbGluZTogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5zY2FuWEhUTUxFbnRpdHkgPSBmdW5jdGlvbiAocXVvdGUpIHtcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gJyYnO1xuXHQgICAgICAgIHZhciB2YWxpZCA9IHRydWU7XG5cdCAgICAgICAgdmFyIHRlcm1pbmF0ZWQgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgbnVtZXJpYyA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBoZXggPSBmYWxzZTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuc2Nhbm5lci5lb2YoKSAmJiB2YWxpZCAmJiAhdGVybWluYXRlZCkge1xuXHQgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleF07XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gcXVvdGUpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRlcm1pbmF0ZWQgPSAoY2ggPT09ICc7Jyk7XG5cdCAgICAgICAgICAgIHJlc3VsdCArPSBjaDtcblx0ICAgICAgICAgICAgKyt0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIGlmICghdGVybWluYXRlZCkge1xuXHQgICAgICAgICAgICAgICAgc3dpdGNoIChyZXN1bHQubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuICcmIzEyMzsnXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWMgPSAoY2ggPT09ICcjJyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bWVyaWMpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gJyYjeDQxOydcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleCA9IChjaCA9PT0gJ3gnKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gaGV4IHx8IGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWMgPSBudW1lcmljICYmICFoZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB2YWxpZCAmJiAhKG51bWVyaWMgJiYgIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgIShoZXggJiYgIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0hleERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHZhbGlkICYmIHRlcm1pbmF0ZWQgJiYgcmVzdWx0Lmxlbmd0aCA+IDIpIHtcblx0ICAgICAgICAgICAgLy8gZS5nLiAnJiN4NDE7JyBiZWNvbWVzIGp1c3QgJyN4NDEnXG5cdCAgICAgICAgICAgIHZhciBzdHIgPSByZXN1bHQuc3Vic3RyKDEsIHJlc3VsdC5sZW5ndGggLSAyKTtcblx0ICAgICAgICAgICAgaWYgKG51bWVyaWMgJiYgc3RyLmxlbmd0aCA+IDEpIHtcblx0ICAgICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTApKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChoZXggJiYgc3RyLmxlbmd0aCA+IDIpIHtcblx0ICAgICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoJzAnICsgc3RyLnN1YnN0cigxKSwgMTYpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICghbnVtZXJpYyAmJiAhaGV4ICYmIHhodG1sX2VudGl0aWVzXzEuWEhUTUxFbnRpdGllc1tzdHJdKSB7XG5cdCAgICAgICAgICAgICAgICByZXN1bHQgPSB4aHRtbF9lbnRpdGllc18xLlhIVE1MRW50aXRpZXNbc3RyXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmVzdWx0O1xuXHQgICAgfTtcblx0ICAgIC8vIFNjYW4gdGhlIG5leHQgSlNYIHRva2VuLiBUaGlzIHJlcGxhY2VzIFNjYW5uZXIjbGV4IHdoZW4gaW4gSlNYIG1vZGUuXG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLmxleEpTWCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgY3AgPSB0aGlzLnNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQodGhpcy5zY2FubmVyLmluZGV4KTtcblx0ICAgICAgICAvLyA8ID4gLyA6ID0geyB9XG5cdCAgICAgICAgaWYgKGNwID09PSA2MCB8fCBjcCA9PT0gNjIgfHwgY3AgPT09IDQ3IHx8IGNwID09PSA1OCB8fCBjcCA9PT0gNjEgfHwgY3AgPT09IDEyMyB8fCBjcCA9PT0gMTI1KSB7XG5cdCAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4KytdO1xuXHQgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogNyAvKiBQdW5jdHVhdG9yICovLFxuXHQgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuXHQgICAgICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMuc2Nhbm5lci5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5zY2FubmVyLmluZGV4IC0gMSxcblx0ICAgICAgICAgICAgICAgIGVuZDogdGhpcy5zY2FubmVyLmluZGV4XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFwiICdcblx0ICAgICAgICBpZiAoY3AgPT09IDM0IHx8IGNwID09PSAzOSkge1xuXHQgICAgICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIHZhciBxdW90ZSA9IHRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4KytdO1xuXHQgICAgICAgICAgICB2YXIgc3RyID0gJyc7XG5cdCAgICAgICAgICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZigpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleCsrXTtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gcXVvdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAnJicpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdHIgKz0gdGhpcy5zY2FuWEhUTUxFbnRpdHkocXVvdGUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RyICs9IGNoO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiA4IC8qIFN0cmluZ0xpdGVyYWwgKi8sXG5cdCAgICAgICAgICAgICAgICB2YWx1ZTogc3RyLFxuXHQgICAgICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMuc2Nhbm5lci5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuc2Nhbm5lci5pbmRleFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyAuLi4gb3IgLlxuXHQgICAgICAgIGlmIChjcCA9PT0gNDYpIHtcblx0ICAgICAgICAgICAgdmFyIG4xID0gdGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuc2Nhbm5lci5pbmRleCArIDEpO1xuXHQgICAgICAgICAgICB2YXIgbjIgPSB0aGlzLnNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQodGhpcy5zY2FubmVyLmluZGV4ICsgMik7XG5cdCAgICAgICAgICAgIHZhciB2YWx1ZSA9IChuMSA9PT0gNDYgJiYgbjIgPT09IDQ2KSA/ICcuLi4nIDogJy4nO1xuXHQgICAgICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5pbmRleCArPSB2YWx1ZS5sZW5ndGg7XG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiA3IC8qIFB1bmN0dWF0b3IgKi8sXG5cdCAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG5cdCAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5zY2FubmVyLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcblx0ICAgICAgICAgICAgICAgIGVuZDogdGhpcy5zY2FubmVyLmluZGV4XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIGBcblx0ICAgICAgICBpZiAoY3AgPT09IDk2KSB7XG5cdCAgICAgICAgICAgIC8vIE9ubHkgcGxhY2Vob2xkZXIsIHNpbmNlIGl0IHdpbGwgYmUgcmVzY2FubmVkIGFzIGEgcmVhbCBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiAxMCAvKiBUZW1wbGF0ZSAqLyxcblx0ICAgICAgICAgICAgICAgIHZhbHVlOiAnJyxcblx0ICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLnNjYW5uZXIubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuc2Nhbm5lci5pbmRleCxcblx0ICAgICAgICAgICAgICAgIGVuZDogdGhpcy5zY2FubmVyLmluZGV4XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIElkZW50aWZlciBjYW4gbm90IGNvbnRhaW4gYmFja3NsYXNoIChjaGFyIGNvZGUgOTIpLlxuXHQgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyU3RhcnQoY3ApICYmIChjcCAhPT0gOTIpKSB7XG5cdCAgICAgICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICAgICAgKyt0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZigpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNjYW5uZXIuc291cmNlLmNoYXJDb2RlQXQodGhpcy5zY2FubmVyLmluZGV4KTtcblx0ICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyUGFydChjaCkgJiYgKGNoICE9PSA5MikpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSA0NSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIEh5cGhlbiAoY2hhciBjb2RlIDQ1KSBjYW4gYmUgcGFydCBvZiBhbiBpZGVudGlmaWVyLlxuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5zY2FubmVyLnNvdXJjZS5zbGljZShzdGFydCwgdGhpcy5zY2FubmVyLmluZGV4KTtcblx0ICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgIHR5cGU6IDEwMCAvKiBJZGVudGlmaWVyICovLFxuXHQgICAgICAgICAgICAgICAgdmFsdWU6IGlkLFxuXHQgICAgICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMuc2Nhbm5lci5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuc2Nhbm5lci5pbmRleFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5zY2FubmVyLmxleCgpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUubmV4dEpTWFRva2VuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuY29sbGVjdENvbW1lbnRzKCk7XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlci5pbmRleCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICB0aGlzLnN0YXJ0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLnN0YXJ0TWFya2VyLmNvbHVtbiA9IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnQ7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sZXhKU1goKTtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuaW5kZXggPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuY29sdW1uID0gdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydDtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcudG9rZW5zKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy5jb252ZXJ0VG9rZW4odG9rZW4pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRva2VuO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUubmV4dEpTWFRleHQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlci5pbmRleCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICB0aGlzLnN0YXJ0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLnN0YXJ0TWFya2VyLmNvbHVtbiA9IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnQ7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgIHZhciB0ZXh0ID0gJyc7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKCkpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zY2FubmVyLnNvdXJjZVt0aGlzLnNjYW5uZXIuaW5kZXhdO1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09ICd7JyB8fCBjaCA9PT0gJzwnKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICArK3RoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICAgICAgdGV4dCArPSBjaDtcblx0ICAgICAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuc2Nhbm5lci5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiB0aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleF0gPT09ICdcXG4nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIubGluZVN0YXJ0ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlci5pbmRleCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIubGluZSA9IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyO1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlci5jb2x1bW4gPSB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0O1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHtcblx0ICAgICAgICAgICAgdHlwZTogMTAxIC8qIFRleHQgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiB0ZXh0LFxuXHQgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLnNjYW5uZXIubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5zY2FubmVyLmluZGV4XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBpZiAoKHRleHQubGVuZ3RoID4gMCkgJiYgdGhpcy5jb25maWcudG9rZW5zKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy5jb252ZXJ0VG9rZW4odG9rZW4pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRva2VuO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGVla0pTWFRva2VuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuc2Nhbm5lci5zYXZlU3RhdGUoKTtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIuc2NhbkNvbW1lbnRzKCk7XG5cdCAgICAgICAgdmFyIG5leHQgPSB0aGlzLmxleEpTWCgpO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5yZXN0b3JlU3RhdGUoc3RhdGUpO1xuXHQgICAgICAgIHJldHVybiBuZXh0O1xuXHQgICAgfTtcblx0ICAgIC8vIEV4cGVjdCB0aGUgbmV4dCBKU1ggdG9rZW4gdG8gbWF0Y2ggdGhlIHNwZWNpZmllZCBwdW5jdHVhdG9yLlxuXHQgICAgLy8gSWYgbm90LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uXG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLmV4cGVjdEpTWCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dEpTWFRva2VuKCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09IDcgLyogUHVuY3R1YXRvciAqLyB8fCB0b2tlbi52YWx1ZSAhPT0gdmFsdWUpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBuZXh0IEpTWCB0b2tlbiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcHVuY3R1YXRvci5cblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUubWF0Y2hKU1ggPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICB2YXIgbmV4dCA9IHRoaXMucGVla0pTWFRva2VuKCk7XG5cdCAgICAgICAgcmV0dXJuIG5leHQudHlwZSA9PT0gNyAvKiBQdW5jdHVhdG9yICovICYmIG5leHQudmFsdWUgPT09IHZhbHVlO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hJZGVudGlmaWVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0SlNYVG9rZW4oKTtcblx0ICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gMTAwIC8qIElkZW50aWZpZXIgKi8pIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWElkZW50aWZpZXIodG9rZW4udmFsdWUpKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYRWxlbWVudE5hbWUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB2YXIgZWxlbWVudE5hbWUgPSB0aGlzLnBhcnNlSlNYSWRlbnRpZmllcigpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoSlNYKCc6JykpIHtcblx0ICAgICAgICAgICAgdmFyIG5hbWVzcGFjZSA9IGVsZW1lbnROYW1lO1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdEpTWCgnOicpO1xuXHQgICAgICAgICAgICB2YXIgbmFtZV8xID0gdGhpcy5wYXJzZUpTWElkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgZWxlbWVudE5hbWUgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWE5hbWVzcGFjZWROYW1lKG5hbWVzcGFjZSwgbmFtZV8xKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hKU1goJy4nKSkge1xuXHQgICAgICAgICAgICB3aGlsZSAodGhpcy5tYXRjaEpTWCgnLicpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgb2JqZWN0ID0gZWxlbWVudE5hbWU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdEpTWCgnLicpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5wYXJzZUpTWElkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hNZW1iZXJFeHByZXNzaW9uKG9iamVjdCwgcHJvcGVydHkpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZWxlbWVudE5hbWU7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEF0dHJpYnV0ZU5hbWUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB2YXIgYXR0cmlidXRlTmFtZTtcblx0ICAgICAgICB2YXIgaWRlbnRpZmllciA9IHRoaXMucGFyc2VKU1hJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2hKU1goJzonKSkge1xuXHQgICAgICAgICAgICB2YXIgbmFtZXNwYWNlID0gaWRlbnRpZmllcjtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJzonKTtcblx0ICAgICAgICAgICAgdmFyIG5hbWVfMiA9IHRoaXMucGFyc2VKU1hJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWE5hbWVzcGFjZWROYW1lKG5hbWVzcGFjZSwgbmFtZV8yKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0gaWRlbnRpZmllcjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWU7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWFN0cmluZ0xpdGVyYWxBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRKU1hUb2tlbigpO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlICE9PSA4IC8qIFN0cmluZ0xpdGVyYWwgKi8pIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciByYXcgPSB0aGlzLmdldFRva2VuUmF3KHRva2VuKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5MaXRlcmFsKHRva2VuLnZhbHVlLCByYXcpKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYRXhwcmVzc2lvbkF0dHJpYnV0ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0SlNYKCd7Jyk7XG5cdCAgICAgICAgdGhpcy5maW5pc2hKU1goKTtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcignSlNYIGF0dHJpYnV0ZXMgbXVzdCBvbmx5IGJlIGFzc2lnbmVkIGEgbm9uLWVtcHR5IGV4cHJlc3Npb24nKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGV4cHJlc3Npb24gPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICB0aGlzLnJlZW50ZXJKU1goKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hFeHByZXNzaW9uQ29udGFpbmVyKGV4cHJlc3Npb24pKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYQXR0cmlidXRlVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hKU1goJ3snKSA/IHRoaXMucGFyc2VKU1hFeHByZXNzaW9uQXR0cmlidXRlKCkgOlxuXHQgICAgICAgICAgICB0aGlzLm1hdGNoSlNYKCc8JykgPyB0aGlzLnBhcnNlSlNYRWxlbWVudCgpIDogdGhpcy5wYXJzZUpTWFN0cmluZ0xpdGVyYWxBdHRyaWJ1dGUoKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYTmFtZVZhbHVlQXR0cmlidXRlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdmFyIG5hbWUgPSB0aGlzLnBhcnNlSlNYQXR0cmlidXRlTmFtZSgpO1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IG51bGw7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2hKU1goJz0nKSkge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdEpTWCgnPScpO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VKU1hBdHRyaWJ1dGVWYWx1ZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hBdHRyaWJ1dGUobmFtZSwgdmFsdWUpKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYU3ByZWFkQXR0cmlidXRlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJ3snKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgnLi4uJyk7XG5cdCAgICAgICAgdGhpcy5maW5pc2hKU1goKTtcblx0ICAgICAgICB2YXIgYXJndW1lbnQgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICB0aGlzLnJlZW50ZXJKU1goKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hTcHJlYWRBdHRyaWJ1dGUoYXJndW1lbnQpKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYQXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgYXR0cmlidXRlcyA9IFtdO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5tYXRjaEpTWCgnLycpICYmICF0aGlzLm1hdGNoSlNYKCc+JykpIHtcblx0ICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IHRoaXMubWF0Y2hKU1goJ3snKSA/IHRoaXMucGFyc2VKU1hTcHJlYWRBdHRyaWJ1dGUoKSA6XG5cdCAgICAgICAgICAgICAgICB0aGlzLnBhcnNlSlNYTmFtZVZhbHVlQXR0cmlidXRlKCk7XG5cdCAgICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaChhdHRyaWJ1dGUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYT3BlbmluZ0VsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgnPCcpO1xuXHQgICAgICAgIHZhciBuYW1lID0gdGhpcy5wYXJzZUpTWEVsZW1lbnROYW1lKCk7XG5cdCAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLnBhcnNlSlNYQXR0cmlidXRlcygpO1xuXHQgICAgICAgIHZhciBzZWxmQ2xvc2luZyA9IHRoaXMubWF0Y2hKU1goJy8nKTtcblx0ICAgICAgICBpZiAoc2VsZkNsb3NpbmcpIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJy8nKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJz4nKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hPcGVuaW5nRWxlbWVudChuYW1lLCBzZWxmQ2xvc2luZywgYXR0cmlidXRlcykpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hCb3VuZGFyeUVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgnPCcpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoSlNYKCcvJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJy8nKTtcblx0ICAgICAgICAgICAgdmFyIG5hbWVfMyA9IHRoaXMucGFyc2VKU1hFbGVtZW50TmFtZSgpO1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdEpTWCgnPicpO1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hDbG9zaW5nRWxlbWVudChuYW1lXzMpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG5hbWUgPSB0aGlzLnBhcnNlSlNYRWxlbWVudE5hbWUoKTtcblx0ICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMucGFyc2VKU1hBdHRyaWJ1dGVzKCk7XG5cdCAgICAgICAgdmFyIHNlbGZDbG9zaW5nID0gdGhpcy5tYXRjaEpTWCgnLycpO1xuXHQgICAgICAgIGlmIChzZWxmQ2xvc2luZykge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdEpTWCgnLycpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgnPicpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWE9wZW5pbmdFbGVtZW50KG5hbWUsIHNlbGZDbG9zaW5nLCBhdHRyaWJ1dGVzKSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEVtcHR5RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYQ2hpbGROb2RlKCk7XG5cdCAgICAgICAgdGhpcy5jb2xsZWN0Q29tbWVudHMoKTtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuaW5kZXggPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuY29sdW1uID0gdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hFbXB0eUV4cHJlc3Npb24oKSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEV4cHJlc3Npb25Db250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgneycpO1xuXHQgICAgICAgIHZhciBleHByZXNzaW9uO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoSlNYKCd9JykpIHtcblx0ICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHRoaXMucGFyc2VKU1hFbXB0eUV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJ30nKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuZmluaXNoSlNYKCk7XG5cdCAgICAgICAgICAgIGV4cHJlc3Npb24gPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgdGhpcy5yZWVudGVySlNYKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWEV4cHJlc3Npb25Db250YWluZXIoZXhwcmVzc2lvbikpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hDaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgY2hpbGRyZW4gPSBbXTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuc2Nhbm5lci5lb2YoKSkge1xuXHQgICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYQ2hpbGROb2RlKCk7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dEpTWFRleHQoKTtcblx0ICAgICAgICAgICAgaWYgKHRva2VuLnN0YXJ0IDwgdG9rZW4uZW5kKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcmF3ID0gdGhpcy5nZXRUb2tlblJhdyh0b2tlbik7XG5cdCAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWFRleHQodG9rZW4udmFsdWUsIHJhdykpO1xuXHQgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4XSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5wYXJzZUpTWEV4cHJlc3Npb25Db250YWluZXIoKTtcblx0ICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY29udGFpbmVyKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBjaGlsZHJlbjtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlQ29tcGxleEpTWEVsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICB2YXIgc3RhY2sgPSBbXTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuc2Nhbm5lci5lb2YoKSkge1xuXHQgICAgICAgICAgICBlbC5jaGlsZHJlbiA9IGVsLmNoaWxkcmVuLmNvbmNhdCh0aGlzLnBhcnNlSlNYQ2hpbGRyZW4oKSk7XG5cdCAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hDaGlsZE5vZGUoKTtcblx0ICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLnBhcnNlSlNYQm91bmRhcnlFbGVtZW50KCk7XG5cdCAgICAgICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYT3BlbmluZ0VsZW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBvcGVuaW5nID0gZWxlbWVudDtcblx0ICAgICAgICAgICAgICAgIGlmIChvcGVuaW5nLnNlbGZDbG9zaW5nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hFbGVtZW50KG9wZW5pbmcsIFtdLCBudWxsKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgZWwuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGVsKTtcblx0ICAgICAgICAgICAgICAgICAgICBlbCA9IHsgbm9kZTogbm9kZSwgb3BlbmluZzogb3BlbmluZywgY2xvc2luZzogbnVsbCwgY2hpbGRyZW46IFtdIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hDbG9zaW5nRWxlbWVudCkge1xuXHQgICAgICAgICAgICAgICAgZWwuY2xvc2luZyA9IGVsZW1lbnQ7XG5cdCAgICAgICAgICAgICAgICB2YXIgb3Blbl8xID0gZ2V0UXVhbGlmaWVkRWxlbWVudE5hbWUoZWwub3BlbmluZy5uYW1lKTtcblx0ICAgICAgICAgICAgICAgIHZhciBjbG9zZV8xID0gZ2V0UXVhbGlmaWVkRWxlbWVudE5hbWUoZWwuY2xvc2luZy5uYW1lKTtcblx0ICAgICAgICAgICAgICAgIGlmIChvcGVuXzEgIT09IGNsb3NlXzEpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IoJ0V4cGVjdGVkIGNvcnJlc3BvbmRpbmcgSlNYIGNsb3NpbmcgdGFnIGZvciAlMCcsIG9wZW5fMSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuZmluYWxpemUoZWwubm9kZSwgbmV3IEpTWE5vZGUuSlNYRWxlbWVudChlbC5vcGVuaW5nLCBlbC5jaGlsZHJlbiwgZWwuY2xvc2luZykpO1xuXHQgICAgICAgICAgICAgICAgICAgIGVsID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG5cdCAgICAgICAgICAgICAgICAgICAgZWwuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZWw7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB2YXIgb3BlbmluZyA9IHRoaXMucGFyc2VKU1hPcGVuaW5nRWxlbWVudCgpO1xuXHQgICAgICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuXHQgICAgICAgIHZhciBjbG9zaW5nID0gbnVsbDtcblx0ICAgICAgICBpZiAoIW9wZW5pbmcuc2VsZkNsb3NpbmcpIHtcblx0ICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5wYXJzZUNvbXBsZXhKU1hFbGVtZW50KHsgbm9kZTogbm9kZSwgb3BlbmluZzogb3BlbmluZywgY2xvc2luZzogY2xvc2luZywgY2hpbGRyZW46IGNoaWxkcmVuIH0pO1xuXHQgICAgICAgICAgICBjaGlsZHJlbiA9IGVsLmNoaWxkcmVuO1xuXHQgICAgICAgICAgICBjbG9zaW5nID0gZWwuY2xvc2luZztcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYRWxlbWVudChvcGVuaW5nLCBjaGlsZHJlbiwgY2xvc2luZykpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hSb290ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIC8vIFBvcCB0aGUgb3BlbmluZyAnPCcgYWRkZWQgZnJvbSB0aGUgbG9va2FoZWFkLlxuXHQgICAgICAgIGlmICh0aGlzLmNvbmZpZy50b2tlbnMpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2tlbnMucG9wKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuc3RhcnRKU1goKTtcblx0ICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMucGFyc2VKU1hFbGVtZW50KCk7XG5cdCAgICAgICAgdGhpcy5maW5pc2hKU1goKTtcblx0ICAgICAgICByZXR1cm4gZWxlbWVudDtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLmlzU3RhcnRPZkV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuaXNTdGFydE9mRXhwcmVzc2lvbi5jYWxsKHRoaXMpIHx8IHRoaXMubWF0Y2goJzwnKTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gSlNYUGFyc2VyO1xuXHR9KHBhcnNlcl8xLlBhcnNlcikpO1xuXHRleHBvcnRzLkpTWFBhcnNlciA9IEpTWFBhcnNlcjtcblxuXG4vKioqLyB9LFxuLyogNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0Ly8gU2VlIGFsc28gdG9vbHMvZ2VuZXJhdGUtdW5pY29kZS1yZWdleC5qcy5cblx0dmFyIFJlZ2V4ID0ge1xuXHQgICAgLy8gVW5pY29kZSB2OC4wLjAgTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQ6XG5cdCAgICBOb25Bc2NpaUlkZW50aWZpZXJTdGFydDogL1tcXHhBQVxceEI1XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYyMC1cXHUwNjRBXFx1MDY2RVxcdTA2NkZcXHUwNjcxLVxcdTA2RDNcXHUwNkQ1XFx1MDZFNVxcdTA2RTZcXHUwNkVFXFx1MDZFRlxcdTA2RkEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwXFx1MDcxMi1cXHUwNzJGXFx1MDc0RC1cXHUwN0E1XFx1MDdCMVxcdTA3Q0EtXFx1MDdFQVxcdTA3RjRcXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgxNVxcdTA4MUFcXHUwODI0XFx1MDgyOFxcdTA4NDAtXFx1MDg1OFxcdTA4QTAtXFx1MDhCNFxcdTA5MDQtXFx1MDkzOVxcdTA5M0RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTgwXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCRFxcdTA5Q0VcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFMVxcdTA5RjBcXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE3Mi1cXHUwQTc0XFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFEMFxcdTBBRTBcXHUwQUUxXFx1MEFGOVxcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNEXFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjFcXHUwQjcxXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkQwXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRFxcdTBDNTgtXFx1MEM1QVxcdTBDNjBcXHUwQzYxXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCRFxcdTBDREVcXHUwQ0UwXFx1MENFMVxcdTBDRjFcXHUwQ0YyXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRFxcdTBENEVcXHUwRDVGLVxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFFXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlCMC1cXHUxOUM5XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE4LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0VFXFx1MkNGMlxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDgwLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMjlcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM0NcXHUzMDQxLVxcdTMwOTZcXHUzMDlCLVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGRDVcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MUZcXHVBNjJBXFx1QTYyQlxcdUE2NDAtXFx1QTY2RVxcdUE2N0YtXFx1QTY5RFxcdUE2QTAtXFx1QTZFRlxcdUE3MTctXFx1QTcxRlxcdUE3MjItXFx1QTc4OFxcdUE3OEItXFx1QTdBRFxcdUE3QjAtXFx1QTdCN1xcdUE3RjctXFx1QTgwMVxcdUE4MDMtXFx1QTgwNVxcdUE4MDctXFx1QTgwQVxcdUE4MEMtXFx1QTgyMlxcdUE4NDAtXFx1QTg3M1xcdUE4ODItXFx1QThCM1xcdUE4RjItXFx1QThGN1xcdUE4RkJcXHVBOEZEXFx1QTkwQS1cXHVBOTI1XFx1QTkzMC1cXHVBOTQ2XFx1QTk2MC1cXHVBOTdDXFx1QTk4NC1cXHVBOUIyXFx1QTlDRlxcdUE5RTAtXFx1QTlFNFxcdUE5RTYtXFx1QTlFRlxcdUE5RkEtXFx1QTlGRVxcdUFBMDAtXFx1QUEyOFxcdUFBNDAtXFx1QUE0MlxcdUFBNDQtXFx1QUE0QlxcdUFBNjAtXFx1QUE3NlxcdUFBN0FcXHVBQTdFLVxcdUFBQUZcXHVBQUIxXFx1QUFCNVxcdUFBQjZcXHVBQUI5LVxcdUFBQkRcXHVBQUMwXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFQVxcdUFBRjItXFx1QUFGNFxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCMzAtXFx1QUI1QVxcdUFCNUMtXFx1QUI2NVxcdUFCNzAtXFx1QUJFMlxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMURcXHVGQjFGLVxcdUZCMjhcXHVGQjJBLVxcdUZCMzZcXHVGQjM4LVxcdUZCM0NcXHVGQjNFXFx1RkI0MFxcdUZCNDFcXHVGQjQzXFx1RkI0NFxcdUZCNDYtXFx1RkJCMVxcdUZCRDMtXFx1RkQzRFxcdUZENTAtXFx1RkQ4RlxcdUZEOTItXFx1RkRDN1xcdUZERjAtXFx1RkRGQlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMjEtXFx1RkYzQVxcdUZGNDEtXFx1RkY1QVxcdUZGNjYtXFx1RkZCRVxcdUZGQzItXFx1RkZDN1xcdUZGQ0EtXFx1RkZDRlxcdUZGRDItXFx1RkZEN1xcdUZGREEtXFx1RkZEQ118XFx1RDgwMFtcXHVEQzAwLVxcdURDMEJcXHVEQzBELVxcdURDMjZcXHVEQzI4LVxcdURDM0FcXHVEQzNDXFx1REMzRFxcdURDM0YtXFx1REM0RFxcdURDNTAtXFx1REM1RFxcdURDODAtXFx1RENGQVxcdURENDAtXFx1REQ3NFxcdURFODAtXFx1REU5Q1xcdURFQTAtXFx1REVEMFxcdURGMDAtXFx1REYxRlxcdURGMzAtXFx1REY0QVxcdURGNTAtXFx1REY3NVxcdURGODAtXFx1REY5RFxcdURGQTAtXFx1REZDM1xcdURGQzgtXFx1REZDRlxcdURGRDEtXFx1REZENV18XFx1RDgwMVtcXHVEQzAwLVxcdURDOURcXHVERDAwLVxcdUREMjdcXHVERDMwLVxcdURENjNcXHVERTAwLVxcdURGMzZcXHVERjQwLVxcdURGNTVcXHVERjYwLVxcdURGNjddfFxcdUQ4MDJbXFx1REMwMC1cXHVEQzA1XFx1REMwOFxcdURDMEEtXFx1REMzNVxcdURDMzdcXHVEQzM4XFx1REMzQ1xcdURDM0YtXFx1REM1NVxcdURDNjAtXFx1REM3NlxcdURDODAtXFx1REM5RVxcdURDRTAtXFx1RENGMlxcdURDRjRcXHVEQ0Y1XFx1REQwMC1cXHVERDE1XFx1REQyMC1cXHVERDM5XFx1REQ4MC1cXHVEREI3XFx1RERCRVxcdUREQkZcXHVERTAwXFx1REUxMC1cXHVERTEzXFx1REUxNS1cXHVERTE3XFx1REUxOS1cXHVERTMzXFx1REU2MC1cXHVERTdDXFx1REU4MC1cXHVERTlDXFx1REVDMC1cXHVERUM3XFx1REVDOS1cXHVERUU0XFx1REYwMC1cXHVERjM1XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjcyXFx1REY4MC1cXHVERjkxXXxcXHVEODAzW1xcdURDMDAtXFx1REM0OFxcdURDODAtXFx1RENCMlxcdURDQzAtXFx1RENGMl18XFx1RDgwNFtcXHVEQzAzLVxcdURDMzdcXHVEQzgzLVxcdURDQUZcXHVEQ0QwLVxcdURDRThcXHVERDAzLVxcdUREMjZcXHVERDUwLVxcdURENzJcXHVERDc2XFx1REQ4My1cXHVEREIyXFx1RERDMS1cXHVEREM0XFx1REREQVxcdURERENcXHVERTAwLVxcdURFMTFcXHVERTEzLVxcdURFMkJcXHVERTgwLVxcdURFODZcXHVERTg4XFx1REU4QS1cXHVERThEXFx1REU4Ri1cXHVERTlEXFx1REU5Ri1cXHVERUE4XFx1REVCMC1cXHVERURFXFx1REYwNS1cXHVERjBDXFx1REYwRlxcdURGMTBcXHVERjEzLVxcdURGMjhcXHVERjJBLVxcdURGMzBcXHVERjMyXFx1REYzM1xcdURGMzUtXFx1REYzOVxcdURGM0RcXHVERjUwXFx1REY1RC1cXHVERjYxXXxcXHVEODA1W1xcdURDODAtXFx1RENBRlxcdURDQzRcXHVEQ0M1XFx1RENDN1xcdUREODAtXFx1RERBRVxcdURERDgtXFx1REREQlxcdURFMDAtXFx1REUyRlxcdURFNDRcXHVERTgwLVxcdURFQUFcXHVERjAwLVxcdURGMTldfFxcdUQ4MDZbXFx1RENBMC1cXHVEQ0RGXFx1RENGRlxcdURFQzAtXFx1REVGOF18XFx1RDgwOFtcXHVEQzAwLVxcdURGOTldfFxcdUQ4MDlbXFx1REMwMC1cXHVEQzZFXFx1REM4MC1cXHVERDQzXXxbXFx1RDgwQ1xcdUQ4NDAtXFx1RDg2OFxcdUQ4NkEtXFx1RDg2Q1xcdUQ4NkYtXFx1RDg3Ml1bXFx1REMwMC1cXHVERkZGXXxcXHVEODBEW1xcdURDMDAtXFx1REMyRV18XFx1RDgxMVtcXHVEQzAwLVxcdURFNDZdfFxcdUQ4MUFbXFx1REMwMC1cXHVERTM4XFx1REU0MC1cXHVERTVFXFx1REVEMC1cXHVERUVEXFx1REYwMC1cXHVERjJGXFx1REY0MC1cXHVERjQzXFx1REY2My1cXHVERjc3XFx1REY3RC1cXHVERjhGXXxcXHVEODFCW1xcdURGMDAtXFx1REY0NFxcdURGNTBcXHVERjkzLVxcdURGOUZdfFxcdUQ4MkNbXFx1REMwMFxcdURDMDFdfFxcdUQ4MkZbXFx1REMwMC1cXHVEQzZBXFx1REM3MC1cXHVEQzdDXFx1REM4MC1cXHVEQzg4XFx1REM5MC1cXHVEQzk5XXxcXHVEODM1W1xcdURDMDAtXFx1REM1NFxcdURDNTYtXFx1REM5Q1xcdURDOUVcXHVEQzlGXFx1RENBMlxcdURDQTVcXHVEQ0E2XFx1RENBOS1cXHVEQ0FDXFx1RENBRS1cXHVEQ0I5XFx1RENCQlxcdURDQkQtXFx1RENDM1xcdURDQzUtXFx1REQwNVxcdUREMDctXFx1REQwQVxcdUREMEQtXFx1REQxNFxcdUREMTYtXFx1REQxQ1xcdUREMUUtXFx1REQzOVxcdUREM0ItXFx1REQzRVxcdURENDAtXFx1REQ0NFxcdURENDZcXHVERDRBLVxcdURENTBcXHVERDUyLVxcdURFQTVcXHVERUE4LVxcdURFQzBcXHVERUMyLVxcdURFREFcXHVERURDLVxcdURFRkFcXHVERUZDLVxcdURGMTRcXHVERjE2LVxcdURGMzRcXHVERjM2LVxcdURGNEVcXHVERjUwLVxcdURGNkVcXHVERjcwLVxcdURGODhcXHVERjhBLVxcdURGQThcXHVERkFBLVxcdURGQzJcXHVERkM0LVxcdURGQ0JdfFxcdUQ4M0FbXFx1REMwMC1cXHVEQ0M0XXxcXHVEODNCW1xcdURFMDAtXFx1REUwM1xcdURFMDUtXFx1REUxRlxcdURFMjFcXHVERTIyXFx1REUyNFxcdURFMjdcXHVERTI5LVxcdURFMzJcXHVERTM0LVxcdURFMzdcXHVERTM5XFx1REUzQlxcdURFNDJcXHVERTQ3XFx1REU0OVxcdURFNEJcXHVERTRELVxcdURFNEZcXHVERTUxXFx1REU1MlxcdURFNTRcXHVERTU3XFx1REU1OVxcdURFNUJcXHVERTVEXFx1REU1RlxcdURFNjFcXHVERTYyXFx1REU2NFxcdURFNjctXFx1REU2QVxcdURFNkMtXFx1REU3MlxcdURFNzQtXFx1REU3N1xcdURFNzktXFx1REU3Q1xcdURFN0VcXHVERTgwLVxcdURFODlcXHVERThCLVxcdURFOUJcXHVERUExLVxcdURFQTNcXHVERUE1LVxcdURFQTlcXHVERUFCLVxcdURFQkJdfFxcdUQ4NjlbXFx1REMwMC1cXHVERUQ2XFx1REYwMC1cXHVERkZGXXxcXHVEODZEW1xcdURDMDAtXFx1REYzNFxcdURGNDAtXFx1REZGRl18XFx1RDg2RVtcXHVEQzAwLVxcdURDMURcXHVEQzIwLVxcdURGRkZdfFxcdUQ4NzNbXFx1REMwMC1cXHVERUExXXxcXHVEODdFW1xcdURDMDAtXFx1REUxRF0vLFxuXHQgICAgLy8gVW5pY29kZSB2OC4wLjAgTm9uQXNjaWlJZGVudGlmaWVyUGFydDpcblx0ICAgIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6IC9bXFx4QUFcXHhCNVxceEI3XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDMwMC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4Ni1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNGNVxcdTAzRjctXFx1MDQ4MVxcdTA0ODMtXFx1MDQ4N1xcdTA0OEEtXFx1MDUyRlxcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNTkxLVxcdTA1QkRcXHUwNUJGXFx1MDVDMVxcdTA1QzJcXHUwNUM0XFx1MDVDNVxcdTA1QzdcXHUwNUQwLVxcdTA1RUFcXHUwNUYwLVxcdTA1RjJcXHUwNjEwLVxcdTA2MUFcXHUwNjIwLVxcdTA2NjlcXHUwNjZFLVxcdTA2RDNcXHUwNkQ1LVxcdTA2RENcXHUwNkRGLVxcdTA2RThcXHUwNkVBLVxcdTA2RkNcXHUwNkZGXFx1MDcxMC1cXHUwNzRBXFx1MDc0RC1cXHUwN0IxXFx1MDdDMC1cXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgyRFxcdTA4NDAtXFx1MDg1QlxcdTA4QTAtXFx1MDhCNFxcdTA4RTMtXFx1MDk2M1xcdTA5NjYtXFx1MDk2RlxcdTA5NzEtXFx1MDk4M1xcdTA5ODUtXFx1MDk4Q1xcdTA5OEZcXHUwOTkwXFx1MDk5My1cXHUwOUE4XFx1MDlBQS1cXHUwOUIwXFx1MDlCMlxcdTA5QjYtXFx1MDlCOVxcdTA5QkMtXFx1MDlDNFxcdTA5QzdcXHUwOUM4XFx1MDlDQi1cXHUwOUNFXFx1MDlEN1xcdTA5RENcXHUwOUREXFx1MDlERi1cXHUwOUUzXFx1MDlFNi1cXHUwOUYxXFx1MEEwMS1cXHUwQTAzXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTNDXFx1MEEzRS1cXHUwQTQyXFx1MEE0N1xcdTBBNDhcXHUwQTRCLVxcdTBBNERcXHUwQTUxXFx1MEE1OS1cXHUwQTVDXFx1MEE1RVxcdTBBNjYtXFx1MEE3NVxcdTBBODEtXFx1MEE4M1xcdTBBODUtXFx1MEE4RFxcdTBBOEYtXFx1MEE5MVxcdTBBOTMtXFx1MEFBOFxcdTBBQUEtXFx1MEFCMFxcdTBBQjJcXHUwQUIzXFx1MEFCNS1cXHUwQUI5XFx1MEFCQy1cXHUwQUM1XFx1MEFDNy1cXHUwQUM5XFx1MEFDQi1cXHUwQUNEXFx1MEFEMFxcdTBBRTAtXFx1MEFFM1xcdTBBRTYtXFx1MEFFRlxcdTBBRjlcXHUwQjAxLVxcdTBCMDNcXHUwQjA1LVxcdTBCMENcXHUwQjBGXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzJcXHUwQjMzXFx1MEIzNS1cXHUwQjM5XFx1MEIzQy1cXHUwQjQ0XFx1MEI0N1xcdTBCNDhcXHUwQjRCLVxcdTBCNERcXHUwQjU2XFx1MEI1N1xcdTBCNUNcXHUwQjVEXFx1MEI1Ri1cXHUwQjYzXFx1MEI2Ni1cXHUwQjZGXFx1MEI3MVxcdTBCODJcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCQkUtXFx1MEJDMlxcdTBCQzYtXFx1MEJDOFxcdTBCQ0EtXFx1MEJDRFxcdTBCRDBcXHUwQkQ3XFx1MEJFNi1cXHUwQkVGXFx1MEMwMC1cXHUwQzAzXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRC1cXHUwQzQ0XFx1MEM0Ni1cXHUwQzQ4XFx1MEM0QS1cXHUwQzREXFx1MEM1NVxcdTBDNTZcXHUwQzU4LVxcdTBDNUFcXHUwQzYwLVxcdTBDNjNcXHUwQzY2LVxcdTBDNkZcXHUwQzgxLVxcdTBDODNcXHUwQzg1LVxcdTBDOENcXHUwQzhFLVxcdTBDOTBcXHUwQzkyLVxcdTBDQThcXHUwQ0FBLVxcdTBDQjNcXHUwQ0I1LVxcdTBDQjlcXHUwQ0JDLVxcdTBDQzRcXHUwQ0M2LVxcdTBDQzhcXHUwQ0NBLVxcdTBDQ0RcXHUwQ0Q1XFx1MENENlxcdTBDREVcXHUwQ0UwLVxcdTBDRTNcXHUwQ0U2LVxcdTBDRUZcXHUwQ0YxXFx1MENGMlxcdTBEMDEtXFx1MEQwM1xcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0QtXFx1MEQ0NFxcdTBENDYtXFx1MEQ0OFxcdTBENEEtXFx1MEQ0RVxcdTBENTdcXHUwRDVGLVxcdTBENjNcXHUwRDY2LVxcdTBENkZcXHUwRDdBLVxcdTBEN0ZcXHUwRDgyXFx1MEQ4M1xcdTBEODUtXFx1MEQ5NlxcdTBEOUEtXFx1MERCMVxcdTBEQjMtXFx1MERCQlxcdTBEQkRcXHUwREMwLVxcdTBEQzZcXHUwRENBXFx1MERDRi1cXHUwREQ0XFx1MERENlxcdTBERDgtXFx1MERERlxcdTBERTYtXFx1MERFRlxcdTBERjJcXHUwREYzXFx1MEUwMS1cXHUwRTNBXFx1MEU0MC1cXHUwRTRFXFx1MEU1MC1cXHUwRTU5XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjlcXHUwRUJCLVxcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVDOC1cXHUwRUNEXFx1MEVEMC1cXHUwRUQ5XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGMThcXHUwRjE5XFx1MEYyMC1cXHUwRjI5XFx1MEYzNVxcdTBGMzdcXHUwRjM5XFx1MEYzRS1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY3MS1cXHUwRjg0XFx1MEY4Ni1cXHUwRjk3XFx1MEY5OS1cXHUwRkJDXFx1MEZDNlxcdTEwMDAtXFx1MTA0OVxcdTEwNTAtXFx1MTA5RFxcdTEwQTAtXFx1MTBDNVxcdTEwQzdcXHUxMENEXFx1MTBEMC1cXHUxMEZBXFx1MTBGQy1cXHUxMjQ4XFx1MTI0QS1cXHUxMjREXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNUEtXFx1MTI1RFxcdTEyNjAtXFx1MTI4OFxcdTEyOEEtXFx1MTI4RFxcdTEyOTAtXFx1MTJCMFxcdTEyQjItXFx1MTJCNVxcdTEyQjgtXFx1MTJCRVxcdTEyQzBcXHUxMkMyLVxcdTEyQzVcXHUxMkM4LVxcdTEyRDZcXHUxMkQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNUFcXHUxMzVELVxcdTEzNUZcXHUxMzY5LVxcdTEzNzFcXHUxMzgwLVxcdTEzOEZcXHUxM0EwLVxcdTEzRjVcXHUxM0Y4LVxcdTEzRkRcXHUxNDAxLVxcdTE2NkNcXHUxNjZGLVxcdTE2N0ZcXHUxNjgxLVxcdTE2OUFcXHUxNkEwLVxcdTE2RUFcXHUxNkVFLVxcdTE2RjhcXHUxNzAwLVxcdTE3MENcXHUxNzBFLVxcdTE3MTRcXHUxNzIwLVxcdTE3MzRcXHUxNzQwLVxcdTE3NTNcXHUxNzYwLVxcdTE3NkNcXHUxNzZFLVxcdTE3NzBcXHUxNzcyXFx1MTc3M1xcdTE3ODAtXFx1MTdEM1xcdTE3RDdcXHUxN0RDXFx1MTdERFxcdTE3RTAtXFx1MTdFOVxcdTE4MEItXFx1MTgwRFxcdTE4MTAtXFx1MTgxOVxcdTE4MjAtXFx1MTg3N1xcdTE4ODAtXFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5MjAtXFx1MTkyQlxcdTE5MzAtXFx1MTkzQlxcdTE5NDYtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QjAtXFx1MTlDOVxcdTE5RDAtXFx1MTlEQVxcdTFBMDAtXFx1MUExQlxcdTFBMjAtXFx1MUE1RVxcdTFBNjAtXFx1MUE3Q1xcdTFBN0YtXFx1MUE4OVxcdTFBOTAtXFx1MUE5OVxcdTFBQTdcXHUxQUIwLVxcdTFBQkRcXHUxQjAwLVxcdTFCNEJcXHUxQjUwLVxcdTFCNTlcXHUxQjZCLVxcdTFCNzNcXHUxQjgwLVxcdTFCRjNcXHUxQzAwLVxcdTFDMzdcXHUxQzQwLVxcdTFDNDlcXHUxQzRELVxcdTFDN0RcXHUxQ0QwLVxcdTFDRDJcXHUxQ0Q0LVxcdTFDRjZcXHUxQ0Y4XFx1MUNGOVxcdTFEMDAtXFx1MURGNVxcdTFERkMtXFx1MUYxNVxcdTFGMTgtXFx1MUYxRFxcdTFGMjAtXFx1MUY0NVxcdTFGNDgtXFx1MUY0RFxcdTFGNTAtXFx1MUY1N1xcdTFGNTlcXHUxRjVCXFx1MUY1RFxcdTFGNUYtXFx1MUY3RFxcdTFGODAtXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQwLVxcdTFGRDNcXHUxRkQ2LVxcdTFGREJcXHUxRkUwLVxcdTFGRUNcXHUxRkYyLVxcdTFGRjRcXHUxRkY2LVxcdTFGRkNcXHUyMDBDXFx1MjAwRFxcdTIwM0ZcXHUyMDQwXFx1MjA1NFxcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjBEMC1cXHUyMERDXFx1MjBFMVxcdTIwRTUtXFx1MjBGMFxcdTIxMDJcXHUyMTA3XFx1MjEwQS1cXHUyMTEzXFx1MjExNVxcdTIxMTgtXFx1MjExRFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMkEtXFx1MjEzOVxcdTIxM0MtXFx1MjEzRlxcdTIxNDUtXFx1MjE0OVxcdTIxNEVcXHUyMTYwLVxcdTIxODhcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDdGLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyREUwLVxcdTJERkZcXHUzMDA1LVxcdTMwMDdcXHUzMDIxLVxcdTMwMkZcXHUzMDMxLVxcdTMwMzVcXHUzMDM4LVxcdTMwM0NcXHUzMDQxLVxcdTMwOTZcXHUzMDk5LVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGRDVcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MkJcXHVBNjQwLVxcdUE2NkZcXHVBNjc0LVxcdUE2N0RcXHVBNjdGLVxcdUE2RjFcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QURcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MjdcXHVBODQwLVxcdUE4NzNcXHVBODgwLVxcdUE4QzRcXHVBOEQwLVxcdUE4RDlcXHVBOEUwLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MDAtXFx1QTkyRFxcdUE5MzAtXFx1QTk1M1xcdUE5NjAtXFx1QTk3Q1xcdUE5ODAtXFx1QTlDMFxcdUE5Q0YtXFx1QTlEOVxcdUE5RTAtXFx1QTlGRVxcdUFBMDAtXFx1QUEzNlxcdUFBNDAtXFx1QUE0RFxcdUFBNTAtXFx1QUE1OVxcdUFBNjAtXFx1QUE3NlxcdUFBN0EtXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFRlxcdUFBRjItXFx1QUFGNlxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCMzAtXFx1QUI1QVxcdUFCNUMtXFx1QUI2NVxcdUFCNzAtXFx1QUJFQVxcdUFCRUNcXHVBQkVEXFx1QUJGMC1cXHVBQkY5XFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRC1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTAwLVxcdUZFMEZcXHVGRTIwLVxcdUZFMkZcXHVGRTMzXFx1RkUzNFxcdUZFNEQtXFx1RkU0RlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMTAtXFx1RkYxOVxcdUZGMjEtXFx1RkYzQVxcdUZGM0ZcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdfFxcdUQ4MDBbXFx1REMwMC1cXHVEQzBCXFx1REMwRC1cXHVEQzI2XFx1REMyOC1cXHVEQzNBXFx1REMzQ1xcdURDM0RcXHVEQzNGLVxcdURDNERcXHVEQzUwLVxcdURDNURcXHVEQzgwLVxcdURDRkFcXHVERDQwLVxcdURENzRcXHVEREZEXFx1REU4MC1cXHVERTlDXFx1REVBMC1cXHVERUQwXFx1REVFMFxcdURGMDAtXFx1REYxRlxcdURGMzAtXFx1REY0QVxcdURGNTAtXFx1REY3QVxcdURGODAtXFx1REY5RFxcdURGQTAtXFx1REZDM1xcdURGQzgtXFx1REZDRlxcdURGRDEtXFx1REZENV18XFx1RDgwMVtcXHVEQzAwLVxcdURDOURcXHVEQ0EwLVxcdURDQTlcXHVERDAwLVxcdUREMjdcXHVERDMwLVxcdURENjNcXHVERTAwLVxcdURGMzZcXHVERjQwLVxcdURGNTVcXHVERjYwLVxcdURGNjddfFxcdUQ4MDJbXFx1REMwMC1cXHVEQzA1XFx1REMwOFxcdURDMEEtXFx1REMzNVxcdURDMzdcXHVEQzM4XFx1REMzQ1xcdURDM0YtXFx1REM1NVxcdURDNjAtXFx1REM3NlxcdURDODAtXFx1REM5RVxcdURDRTAtXFx1RENGMlxcdURDRjRcXHVEQ0Y1XFx1REQwMC1cXHVERDE1XFx1REQyMC1cXHVERDM5XFx1REQ4MC1cXHVEREI3XFx1RERCRVxcdUREQkZcXHVERTAwLVxcdURFMDNcXHVERTA1XFx1REUwNlxcdURFMEMtXFx1REUxM1xcdURFMTUtXFx1REUxN1xcdURFMTktXFx1REUzM1xcdURFMzgtXFx1REUzQVxcdURFM0ZcXHVERTYwLVxcdURFN0NcXHVERTgwLVxcdURFOUNcXHVERUMwLVxcdURFQzdcXHVERUM5LVxcdURFRTZcXHVERjAwLVxcdURGMzVcXHVERjQwLVxcdURGNTVcXHVERjYwLVxcdURGNzJcXHVERjgwLVxcdURGOTFdfFxcdUQ4MDNbXFx1REMwMC1cXHVEQzQ4XFx1REM4MC1cXHVEQ0IyXFx1RENDMC1cXHVEQ0YyXXxcXHVEODA0W1xcdURDMDAtXFx1REM0NlxcdURDNjYtXFx1REM2RlxcdURDN0YtXFx1RENCQVxcdURDRDAtXFx1RENFOFxcdURDRjAtXFx1RENGOVxcdUREMDAtXFx1REQzNFxcdUREMzYtXFx1REQzRlxcdURENTAtXFx1REQ3M1xcdURENzZcXHVERDgwLVxcdUREQzRcXHVERENBLVxcdUREQ0NcXHVEREQwLVxcdUREREFcXHVERERDXFx1REUwMC1cXHVERTExXFx1REUxMy1cXHVERTM3XFx1REU4MC1cXHVERTg2XFx1REU4OFxcdURFOEEtXFx1REU4RFxcdURFOEYtXFx1REU5RFxcdURFOUYtXFx1REVBOFxcdURFQjAtXFx1REVFQVxcdURFRjAtXFx1REVGOVxcdURGMDAtXFx1REYwM1xcdURGMDUtXFx1REYwQ1xcdURGMEZcXHVERjEwXFx1REYxMy1cXHVERjI4XFx1REYyQS1cXHVERjMwXFx1REYzMlxcdURGMzNcXHVERjM1LVxcdURGMzlcXHVERjNDLVxcdURGNDRcXHVERjQ3XFx1REY0OFxcdURGNEItXFx1REY0RFxcdURGNTBcXHVERjU3XFx1REY1RC1cXHVERjYzXFx1REY2Ni1cXHVERjZDXFx1REY3MC1cXHVERjc0XXxcXHVEODA1W1xcdURDODAtXFx1RENDNVxcdURDQzdcXHVEQ0QwLVxcdURDRDlcXHVERDgwLVxcdUREQjVcXHVEREI4LVxcdUREQzBcXHVEREQ4LVxcdURERERcXHVERTAwLVxcdURFNDBcXHVERTQ0XFx1REU1MC1cXHVERTU5XFx1REU4MC1cXHVERUI3XFx1REVDMC1cXHVERUM5XFx1REYwMC1cXHVERjE5XFx1REYxRC1cXHVERjJCXFx1REYzMC1cXHVERjM5XXxcXHVEODA2W1xcdURDQTAtXFx1RENFOVxcdURDRkZcXHVERUMwLVxcdURFRjhdfFxcdUQ4MDhbXFx1REMwMC1cXHVERjk5XXxcXHVEODA5W1xcdURDMDAtXFx1REM2RVxcdURDODAtXFx1REQ0M118W1xcdUQ4MENcXHVEODQwLVxcdUQ4NjhcXHVEODZBLVxcdUQ4NkNcXHVEODZGLVxcdUQ4NzJdW1xcdURDMDAtXFx1REZGRl18XFx1RDgwRFtcXHVEQzAwLVxcdURDMkVdfFxcdUQ4MTFbXFx1REMwMC1cXHVERTQ2XXxcXHVEODFBW1xcdURDMDAtXFx1REUzOFxcdURFNDAtXFx1REU1RVxcdURFNjAtXFx1REU2OVxcdURFRDAtXFx1REVFRFxcdURFRjAtXFx1REVGNFxcdURGMDAtXFx1REYzNlxcdURGNDAtXFx1REY0M1xcdURGNTAtXFx1REY1OVxcdURGNjMtXFx1REY3N1xcdURGN0QtXFx1REY4Rl18XFx1RDgxQltcXHVERjAwLVxcdURGNDRcXHVERjUwLVxcdURGN0VcXHVERjhGLVxcdURGOUZdfFxcdUQ4MkNbXFx1REMwMFxcdURDMDFdfFxcdUQ4MkZbXFx1REMwMC1cXHVEQzZBXFx1REM3MC1cXHVEQzdDXFx1REM4MC1cXHVEQzg4XFx1REM5MC1cXHVEQzk5XFx1REM5RFxcdURDOUVdfFxcdUQ4MzRbXFx1REQ2NS1cXHVERDY5XFx1REQ2RC1cXHVERDcyXFx1REQ3Qi1cXHVERDgyXFx1REQ4NS1cXHVERDhCXFx1RERBQS1cXHVEREFEXFx1REU0Mi1cXHVERTQ0XXxcXHVEODM1W1xcdURDMDAtXFx1REM1NFxcdURDNTYtXFx1REM5Q1xcdURDOUVcXHVEQzlGXFx1RENBMlxcdURDQTVcXHVEQ0E2XFx1RENBOS1cXHVEQ0FDXFx1RENBRS1cXHVEQ0I5XFx1RENCQlxcdURDQkQtXFx1RENDM1xcdURDQzUtXFx1REQwNVxcdUREMDctXFx1REQwQVxcdUREMEQtXFx1REQxNFxcdUREMTYtXFx1REQxQ1xcdUREMUUtXFx1REQzOVxcdUREM0ItXFx1REQzRVxcdURENDAtXFx1REQ0NFxcdURENDZcXHVERDRBLVxcdURENTBcXHVERDUyLVxcdURFQTVcXHVERUE4LVxcdURFQzBcXHVERUMyLVxcdURFREFcXHVERURDLVxcdURFRkFcXHVERUZDLVxcdURGMTRcXHVERjE2LVxcdURGMzRcXHVERjM2LVxcdURGNEVcXHVERjUwLVxcdURGNkVcXHVERjcwLVxcdURGODhcXHVERjhBLVxcdURGQThcXHVERkFBLVxcdURGQzJcXHVERkM0LVxcdURGQ0JcXHVERkNFLVxcdURGRkZdfFxcdUQ4MzZbXFx1REUwMC1cXHVERTM2XFx1REUzQi1cXHVERTZDXFx1REU3NVxcdURFODRcXHVERTlCLVxcdURFOUZcXHVERUExLVxcdURFQUZdfFxcdUQ4M0FbXFx1REMwMC1cXHVEQ0M0XFx1RENEMC1cXHVEQ0Q2XXxcXHVEODNCW1xcdURFMDAtXFx1REUwM1xcdURFMDUtXFx1REUxRlxcdURFMjFcXHVERTIyXFx1REUyNFxcdURFMjdcXHVERTI5LVxcdURFMzJcXHVERTM0LVxcdURFMzdcXHVERTM5XFx1REUzQlxcdURFNDJcXHVERTQ3XFx1REU0OVxcdURFNEJcXHVERTRELVxcdURFNEZcXHVERTUxXFx1REU1MlxcdURFNTRcXHVERTU3XFx1REU1OVxcdURFNUJcXHVERTVEXFx1REU1RlxcdURFNjFcXHVERTYyXFx1REU2NFxcdURFNjctXFx1REU2QVxcdURFNkMtXFx1REU3MlxcdURFNzQtXFx1REU3N1xcdURFNzktXFx1REU3Q1xcdURFN0VcXHVERTgwLVxcdURFODlcXHVERThCLVxcdURFOUJcXHVERUExLVxcdURFQTNcXHVERUE1LVxcdURFQTlcXHVERUFCLVxcdURFQkJdfFxcdUQ4NjlbXFx1REMwMC1cXHVERUQ2XFx1REYwMC1cXHVERkZGXXxcXHVEODZEW1xcdURDMDAtXFx1REYzNFxcdURGNDAtXFx1REZGRl18XFx1RDg2RVtcXHVEQzAwLVxcdURDMURcXHVEQzIwLVxcdURGRkZdfFxcdUQ4NzNbXFx1REMwMC1cXHVERUExXXxcXHVEODdFW1xcdURDMDAtXFx1REUxRF18XFx1REI0MFtcXHVERDAwLVxcdURERUZdL1xuXHR9O1xuXHRleHBvcnRzLkNoYXJhY3RlciA9IHtcblx0ICAgIC8qIHRzbGludDpkaXNhYmxlOm5vLWJpdHdpc2UgKi9cblx0ICAgIGZyb21Db2RlUG9pbnQ6IGZ1bmN0aW9uIChjcCkge1xuXHQgICAgICAgIHJldHVybiAoY3AgPCAweDEwMDAwKSA/IFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApIDpcblx0ICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSgweEQ4MDAgKyAoKGNwIC0gMHgxMDAwMCkgPj4gMTApKSArXG5cdCAgICAgICAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4REMwMCArICgoY3AgLSAweDEwMDAwKSAmIDEwMjMpKTtcblx0ICAgIH0sXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy13aGl0ZS1zcGFjZVxuXHQgICAgaXNXaGl0ZVNwYWNlOiBmdW5jdGlvbiAoY3ApIHtcblx0ICAgICAgICByZXR1cm4gKGNwID09PSAweDIwKSB8fCAoY3AgPT09IDB4MDkpIHx8IChjcCA9PT0gMHgwQikgfHwgKGNwID09PSAweDBDKSB8fCAoY3AgPT09IDB4QTApIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDE2ODAgJiYgWzB4MTY4MCwgMHgyMDAwLCAweDIwMDEsIDB4MjAwMiwgMHgyMDAzLCAweDIwMDQsIDB4MjAwNSwgMHgyMDA2LCAweDIwMDcsIDB4MjAwOCwgMHgyMDA5LCAweDIwMEEsIDB4MjAyRiwgMHgyMDVGLCAweDMwMDAsIDB4RkVGRl0uaW5kZXhPZihjcCkgPj0gMCk7XG5cdCAgICB9LFxuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbGluZS10ZXJtaW5hdG9yc1xuXHQgICAgaXNMaW5lVGVybWluYXRvcjogZnVuY3Rpb24gKGNwKSB7XG5cdCAgICAgICAgcmV0dXJuIChjcCA9PT0gMHgwQSkgfHwgKGNwID09PSAweDBEKSB8fCAoY3AgPT09IDB4MjAyOCkgfHwgKGNwID09PSAweDIwMjkpO1xuXHQgICAgfSxcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW5hbWVzLWFuZC1rZXl3b3Jkc1xuXHQgICAgaXNJZGVudGlmaWVyU3RhcnQ6IGZ1bmN0aW9uIChjcCkge1xuXHQgICAgICAgIHJldHVybiAoY3AgPT09IDB4MjQpIHx8IChjcCA9PT0gMHg1RikgfHxcblx0ICAgICAgICAgICAgKGNwID49IDB4NDEgJiYgY3AgPD0gMHg1QSkgfHxcblx0ICAgICAgICAgICAgKGNwID49IDB4NjEgJiYgY3AgPD0gMHg3QSkgfHxcblx0ICAgICAgICAgICAgKGNwID09PSAweDVDKSB8fFxuXHQgICAgICAgICAgICAoKGNwID49IDB4ODApICYmIFJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclN0YXJ0LnRlc3QoZXhwb3J0cy5DaGFyYWN0ZXIuZnJvbUNvZGVQb2ludChjcCkpKTtcblx0ICAgIH0sXG5cdCAgICBpc0lkZW50aWZpZXJQYXJ0OiBmdW5jdGlvbiAoY3ApIHtcblx0ICAgICAgICByZXR1cm4gKGNwID09PSAweDI0KSB8fCAoY3AgPT09IDB4NUYpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDQxICYmIGNwIDw9IDB4NUEpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDYxICYmIGNwIDw9IDB4N0EpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDMwICYmIGNwIDw9IDB4MzkpIHx8XG5cdCAgICAgICAgICAgIChjcCA9PT0gMHg1QykgfHxcblx0ICAgICAgICAgICAgKChjcCA+PSAweDgwKSAmJiBSZWdleC5Ob25Bc2NpaUlkZW50aWZpZXJQYXJ0LnRlc3QoZXhwb3J0cy5DaGFyYWN0ZXIuZnJvbUNvZGVQb2ludChjcCkpKTtcblx0ICAgIH0sXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1saXRlcmFscy1udW1lcmljLWxpdGVyYWxzXG5cdCAgICBpc0RlY2ltYWxEaWdpdDogZnVuY3Rpb24gKGNwKSB7XG5cdCAgICAgICAgcmV0dXJuIChjcCA+PSAweDMwICYmIGNwIDw9IDB4MzkpOyAvLyAwLi45XG5cdCAgICB9LFxuXHQgICAgaXNIZXhEaWdpdDogZnVuY3Rpb24gKGNwKSB7XG5cdCAgICAgICAgcmV0dXJuIChjcCA+PSAweDMwICYmIGNwIDw9IDB4MzkpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDQxICYmIGNwIDw9IDB4NDYpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDYxICYmIGNwIDw9IDB4NjYpOyAvLyBhLi5mXG5cdCAgICB9LFxuXHQgICAgaXNPY3RhbERpZ2l0OiBmdW5jdGlvbiAoY3ApIHtcblx0ICAgICAgICByZXR1cm4gKGNwID49IDB4MzAgJiYgY3AgPD0gMHgzNyk7IC8vIDAuLjdcblx0ICAgIH1cblx0fTtcblxuXG4vKioqLyB9LFxuLyogNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIGpzeF9zeW50YXhfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cdC8qIHRzbGludDpkaXNhYmxlOm1heC1jbGFzc2VzLXBlci1maWxlICovXG5cdHZhciBKU1hDbG9zaW5nRWxlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hDbG9zaW5nRWxlbWVudChuYW1lKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hDbG9zaW5nRWxlbWVudDtcblx0ICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEpTWENsb3NpbmdFbGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWENsb3NpbmdFbGVtZW50ID0gSlNYQ2xvc2luZ0VsZW1lbnQ7XG5cdHZhciBKU1hFbGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEpTWEVsZW1lbnQob3BlbmluZ0VsZW1lbnQsIGNoaWxkcmVuLCBjbG9zaW5nRWxlbWVudCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYRWxlbWVudDtcblx0ICAgICAgICB0aGlzLm9wZW5pbmdFbGVtZW50ID0gb3BlbmluZ0VsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXHQgICAgICAgIHRoaXMuY2xvc2luZ0VsZW1lbnQgPSBjbG9zaW5nRWxlbWVudDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hFbGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWEVsZW1lbnQgPSBKU1hFbGVtZW50O1xuXHR2YXIgSlNYRW1wdHlFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEpTWEVtcHR5RXhwcmVzc2lvbigpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWEVtcHR5RXhwcmVzc2lvbjtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hFbXB0eUV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuSlNYRW1wdHlFeHByZXNzaW9uID0gSlNYRW1wdHlFeHByZXNzaW9uO1xuXHR2YXIgSlNYRXhwcmVzc2lvbkNvbnRhaW5lciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hFeHByZXNzaW9uQ29udGFpbmVyKGV4cHJlc3Npb24pIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWEV4cHJlc3Npb25Db250YWluZXI7XG5cdCAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hFeHByZXNzaW9uQ29udGFpbmVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWEV4cHJlc3Npb25Db250YWluZXIgPSBKU1hFeHByZXNzaW9uQ29udGFpbmVyO1xuXHR2YXIgSlNYSWRlbnRpZmllciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hJZGVudGlmaWVyKG5hbWUpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWElkZW50aWZpZXI7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hJZGVudGlmaWVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWElkZW50aWZpZXIgPSBKU1hJZGVudGlmaWVyO1xuXHR2YXIgSlNYTWVtYmVyRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hNZW1iZXJFeHByZXNzaW9uKG9iamVjdCwgcHJvcGVydHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWE1lbWJlckV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cdCAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEpTWE1lbWJlckV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuSlNYTWVtYmVyRXhwcmVzc2lvbiA9IEpTWE1lbWJlckV4cHJlc3Npb247XG5cdHZhciBKU1hBdHRyaWJ1dGUgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYQXR0cmlidXRlKG5hbWUsIHZhbHVlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hBdHRyaWJ1dGU7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYQXR0cmlidXRlO1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWEF0dHJpYnV0ZSA9IEpTWEF0dHJpYnV0ZTtcblx0dmFyIEpTWE5hbWVzcGFjZWROYW1lID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEpTWE5hbWVzcGFjZWROYW1lKG5hbWVzcGFjZSwgbmFtZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYTmFtZXNwYWNlZE5hbWU7XG5cdCAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hOYW1lc3BhY2VkTmFtZTtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hOYW1lc3BhY2VkTmFtZSA9IEpTWE5hbWVzcGFjZWROYW1lO1xuXHR2YXIgSlNYT3BlbmluZ0VsZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYT3BlbmluZ0VsZW1lbnQobmFtZSwgc2VsZkNsb3NpbmcsIGF0dHJpYnV0ZXMpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWE9wZW5pbmdFbGVtZW50O1xuXHQgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG5cdCAgICAgICAgdGhpcy5zZWxmQ2xvc2luZyA9IHNlbGZDbG9zaW5nO1xuXHQgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYT3BlbmluZ0VsZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuSlNYT3BlbmluZ0VsZW1lbnQgPSBKU1hPcGVuaW5nRWxlbWVudDtcblx0dmFyIEpTWFNwcmVhZEF0dHJpYnV0ZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hTcHJlYWRBdHRyaWJ1dGUoYXJndW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWFNwcmVhZEF0dHJpYnV0ZTtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYU3ByZWFkQXR0cmlidXRlO1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWFNwcmVhZEF0dHJpYnV0ZSA9IEpTWFNwcmVhZEF0dHJpYnV0ZTtcblx0dmFyIEpTWFRleHQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYVGV4dCh2YWx1ZSwgcmF3KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hUZXh0O1xuXHQgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICB0aGlzLnJhdyA9IHJhdztcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hUZXh0O1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWFRleHQgPSBKU1hUZXh0O1xuXG5cbi8qKiovIH0sXG4vKiA2ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHRleHBvcnRzLkpTWFN5bnRheCA9IHtcblx0ICAgIEpTWEF0dHJpYnV0ZTogJ0pTWEF0dHJpYnV0ZScsXG5cdCAgICBKU1hDbG9zaW5nRWxlbWVudDogJ0pTWENsb3NpbmdFbGVtZW50Jyxcblx0ICAgIEpTWEVsZW1lbnQ6ICdKU1hFbGVtZW50Jyxcblx0ICAgIEpTWEVtcHR5RXhwcmVzc2lvbjogJ0pTWEVtcHR5RXhwcmVzc2lvbicsXG5cdCAgICBKU1hFeHByZXNzaW9uQ29udGFpbmVyOiAnSlNYRXhwcmVzc2lvbkNvbnRhaW5lcicsXG5cdCAgICBKU1hJZGVudGlmaWVyOiAnSlNYSWRlbnRpZmllcicsXG5cdCAgICBKU1hNZW1iZXJFeHByZXNzaW9uOiAnSlNYTWVtYmVyRXhwcmVzc2lvbicsXG5cdCAgICBKU1hOYW1lc3BhY2VkTmFtZTogJ0pTWE5hbWVzcGFjZWROYW1lJyxcblx0ICAgIEpTWE9wZW5pbmdFbGVtZW50OiAnSlNYT3BlbmluZ0VsZW1lbnQnLFxuXHQgICAgSlNYU3ByZWFkQXR0cmlidXRlOiAnSlNYU3ByZWFkQXR0cmlidXRlJyxcblx0ICAgIEpTWFRleHQ6ICdKU1hUZXh0J1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiA3ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHR2YXIgc3ludGF4XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHQvKiB0c2xpbnQ6ZGlzYWJsZTptYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuXHR2YXIgQXJyYXlFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFycmF5RXhwcmVzc2lvbihlbGVtZW50cykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5BcnJheUV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFycmF5RXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5BcnJheUV4cHJlc3Npb24gPSBBcnJheUV4cHJlc3Npb247XG5cdHZhciBBcnJheVBhdHRlcm4gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQXJyYXlQYXR0ZXJuKGVsZW1lbnRzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkFycmF5UGF0dGVybjtcblx0ICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQXJyYXlQYXR0ZXJuO1xuXHR9KCkpO1xuXHRleHBvcnRzLkFycmF5UGF0dGVybiA9IEFycmF5UGF0dGVybjtcblx0dmFyIEFycm93RnVuY3Rpb25FeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFycm93RnVuY3Rpb25FeHByZXNzaW9uKHBhcmFtcywgYm9keSwgZXhwcmVzc2lvbikge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmlkID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMuZ2VuZXJhdG9yID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmFzeW5jID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQXJyb3dGdW5jdGlvbkV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gPSBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjtcblx0dmFyIEFzc2lnbm1lbnRFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFzc2lnbm1lbnRFeHByZXNzaW9uKG9wZXJhdG9yLCBsZWZ0LCByaWdodCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Bc3NpZ25tZW50RXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG5cdCAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcblx0ICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQXNzaWdubWVudEV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQXNzaWdubWVudEV4cHJlc3Npb24gPSBBc3NpZ25tZW50RXhwcmVzc2lvbjtcblx0dmFyIEFzc2lnbm1lbnRQYXR0ZXJuID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFzc2lnbm1lbnRQYXR0ZXJuKGxlZnQsIHJpZ2h0KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRQYXR0ZXJuO1xuXHQgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7XG5cdCAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFzc2lnbm1lbnRQYXR0ZXJuO1xuXHR9KCkpO1xuXHRleHBvcnRzLkFzc2lnbm1lbnRQYXR0ZXJuID0gQXNzaWdubWVudFBhdHRlcm47XG5cdHZhciBBc3luY0Fycm93RnVuY3Rpb25FeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFzeW5jQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ocGFyYW1zLCBib2R5LCBleHByZXNzaW9uKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkFycm93RnVuY3Rpb25FeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuaWQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuYXN5bmMgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFzeW5jQXJyb3dGdW5jdGlvbkV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQXN5bmNBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiA9IEFzeW5jQXJyb3dGdW5jdGlvbkV4cHJlc3Npb247XG5cdHZhciBBc3luY0Z1bmN0aW9uRGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uKGlkLCBwYXJhbXMsIGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRnVuY3Rpb25EZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuYXN5bmMgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5Bc3luY0Z1bmN0aW9uRGVjbGFyYXRpb24gPSBBc3luY0Z1bmN0aW9uRGVjbGFyYXRpb247XG5cdHZhciBBc3luY0Z1bmN0aW9uRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBBc3luY0Z1bmN0aW9uRXhwcmVzc2lvbihpZCwgcGFyYW1zLCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkZ1bmN0aW9uRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuYXN5bmMgPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFzeW5jRnVuY3Rpb25FeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkFzeW5jRnVuY3Rpb25FeHByZXNzaW9uID0gQXN5bmNGdW5jdGlvbkV4cHJlc3Npb247XG5cdHZhciBBd2FpdEV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQXdhaXRFeHByZXNzaW9uKGFyZ3VtZW50KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkF3YWl0RXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQXdhaXRFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkF3YWl0RXhwcmVzc2lvbiA9IEF3YWl0RXhwcmVzc2lvbjtcblx0dmFyIEJpbmFyeUV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQmluYXJ5RXhwcmVzc2lvbihvcGVyYXRvciwgbGVmdCwgcmlnaHQpIHtcblx0ICAgICAgICB2YXIgbG9naWNhbCA9IChvcGVyYXRvciA9PT0gJ3x8JyB8fCBvcGVyYXRvciA9PT0gJyYmJyk7XG5cdCAgICAgICAgdGhpcy50eXBlID0gbG9naWNhbCA/IHN5bnRheF8xLlN5bnRheC5Mb2dpY2FsRXhwcmVzc2lvbiA6IHN5bnRheF8xLlN5bnRheC5CaW5hcnlFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcblx0ICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuXHQgICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBCaW5hcnlFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkJpbmFyeUV4cHJlc3Npb24gPSBCaW5hcnlFeHByZXNzaW9uO1xuXHR2YXIgQmxvY2tTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQmxvY2tTdGF0ZW1lbnQoYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5CbG9ja1N0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEJsb2NrU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkJsb2NrU3RhdGVtZW50ID0gQmxvY2tTdGF0ZW1lbnQ7XG5cdHZhciBCcmVha1N0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBCcmVha1N0YXRlbWVudChsYWJlbCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5CcmVha1N0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQnJlYWtTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuQnJlYWtTdGF0ZW1lbnQgPSBCcmVha1N0YXRlbWVudDtcblx0dmFyIENhbGxFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENhbGxFeHByZXNzaW9uKGNhbGxlZSwgYXJncykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5DYWxsRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmNhbGxlZSA9IGNhbGxlZTtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3M7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQ2FsbEV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQ2FsbEV4cHJlc3Npb24gPSBDYWxsRXhwcmVzc2lvbjtcblx0dmFyIENhdGNoQ2xhdXNlID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENhdGNoQ2xhdXNlKHBhcmFtLCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkNhdGNoQ2xhdXNlO1xuXHQgICAgICAgIHRoaXMucGFyYW0gPSBwYXJhbTtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIENhdGNoQ2xhdXNlO1xuXHR9KCkpO1xuXHRleHBvcnRzLkNhdGNoQ2xhdXNlID0gQ2F0Y2hDbGF1c2U7XG5cdHZhciBDbGFzc0JvZHkgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQ2xhc3NCb2R5KGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQ2xhc3NCb2R5O1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQ2xhc3NCb2R5O1xuXHR9KCkpO1xuXHRleHBvcnRzLkNsYXNzQm9keSA9IENsYXNzQm9keTtcblx0dmFyIENsYXNzRGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQ2xhc3NEZWNsYXJhdGlvbihpZCwgc3VwZXJDbGFzcywgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5DbGFzc0RlY2xhcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuaWQgPSBpZDtcblx0ICAgICAgICB0aGlzLnN1cGVyQ2xhc3MgPSBzdXBlckNsYXNzO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQ2xhc3NEZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5DbGFzc0RlY2xhcmF0aW9uID0gQ2xhc3NEZWNsYXJhdGlvbjtcblx0dmFyIENsYXNzRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDbGFzc0V4cHJlc3Npb24oaWQsIHN1cGVyQ2xhc3MsIGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQ2xhc3NFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuaWQgPSBpZDtcblx0ICAgICAgICB0aGlzLnN1cGVyQ2xhc3MgPSBzdXBlckNsYXNzO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQ2xhc3NFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkNsYXNzRXhwcmVzc2lvbiA9IENsYXNzRXhwcmVzc2lvbjtcblx0dmFyIENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDb21wdXRlZE1lbWJlckV4cHJlc3Npb24ob2JqZWN0LCBwcm9wZXJ0eSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5NZW1iZXJFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuY29tcHV0ZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXHQgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBDb21wdXRlZE1lbWJlckV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uID0gQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uO1xuXHR2YXIgQ29uZGl0aW9uYWxFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENvbmRpdGlvbmFsRXhwcmVzc2lvbih0ZXN0LCBjb25zZXF1ZW50LCBhbHRlcm5hdGUpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQ29uZGl0aW9uYWxFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7XG5cdCAgICAgICAgdGhpcy5jb25zZXF1ZW50ID0gY29uc2VxdWVudDtcblx0ICAgICAgICB0aGlzLmFsdGVybmF0ZSA9IGFsdGVybmF0ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBDb25kaXRpb25hbEV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQ29uZGl0aW9uYWxFeHByZXNzaW9uID0gQ29uZGl0aW9uYWxFeHByZXNzaW9uO1xuXHR2YXIgQ29udGludWVTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQ29udGludWVTdGF0ZW1lbnQobGFiZWwpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQ29udGludWVTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIENvbnRpbnVlU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkNvbnRpbnVlU3RhdGVtZW50ID0gQ29udGludWVTdGF0ZW1lbnQ7XG5cdHZhciBEZWJ1Z2dlclN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBEZWJ1Z2dlclN0YXRlbWVudCgpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRGVidWdnZXJTdGF0ZW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRGVidWdnZXJTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRGVidWdnZXJTdGF0ZW1lbnQgPSBEZWJ1Z2dlclN0YXRlbWVudDtcblx0dmFyIERpcmVjdGl2ZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBEaXJlY3RpdmUoZXhwcmVzc2lvbiwgZGlyZWN0aXZlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkV4cHJlc3Npb25TdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmRpcmVjdGl2ZSA9IGRpcmVjdGl2ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBEaXJlY3RpdmU7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRGlyZWN0aXZlID0gRGlyZWN0aXZlO1xuXHR2YXIgRG9XaGlsZVN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBEb1doaWxlU3RhdGVtZW50KGJvZHksIHRlc3QpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRG9XaGlsZVN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRG9XaGlsZVN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5Eb1doaWxlU3RhdGVtZW50ID0gRG9XaGlsZVN0YXRlbWVudDtcblx0dmFyIEVtcHR5U3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEVtcHR5U3RhdGVtZW50KCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FbXB0eVN0YXRlbWVudDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBFbXB0eVN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5FbXB0eVN0YXRlbWVudCA9IEVtcHR5U3RhdGVtZW50O1xuXHR2YXIgRXhwb3J0QWxsRGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRXhwb3J0QWxsRGVjbGFyYXRpb24oc291cmNlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkV4cG9ydEFsbERlY2xhcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEV4cG9ydEFsbERlY2xhcmF0aW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkV4cG9ydEFsbERlY2xhcmF0aW9uID0gRXhwb3J0QWxsRGVjbGFyYXRpb247XG5cdHZhciBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiA9IEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjtcblx0dmFyIEV4cG9ydE5hbWVkRGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRXhwb3J0TmFtZWREZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgc3BlY2lmaWVycywgc291cmNlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkV4cG9ydE5hbWVkRGVjbGFyYXRpb247XG5cdCAgICAgICAgdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuc3BlY2lmaWVycyA9IHNwZWNpZmllcnM7XG5cdCAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRXhwb3J0TmFtZWREZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5FeHBvcnROYW1lZERlY2xhcmF0aW9uID0gRXhwb3J0TmFtZWREZWNsYXJhdGlvbjtcblx0dmFyIEV4cG9ydFNwZWNpZmllciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBFeHBvcnRTcGVjaWZpZXIobG9jYWwsIGV4cG9ydGVkKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkV4cG9ydFNwZWNpZmllcjtcblx0ICAgICAgICB0aGlzLmV4cG9ydGVkID0gZXhwb3J0ZWQ7XG5cdCAgICAgICAgdGhpcy5sb2NhbCA9IGxvY2FsO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEV4cG9ydFNwZWNpZmllcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5FeHBvcnRTcGVjaWZpZXIgPSBFeHBvcnRTcGVjaWZpZXI7XG5cdHZhciBFeHByZXNzaW9uU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEV4cHJlc3Npb25TdGF0ZW1lbnQoZXhwcmVzc2lvbikge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FeHByZXNzaW9uU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRXhwcmVzc2lvblN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5FeHByZXNzaW9uU3RhdGVtZW50ID0gRXhwcmVzc2lvblN0YXRlbWVudDtcblx0dmFyIEZvckluU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEZvckluU3RhdGVtZW50KGxlZnQsIHJpZ2h0LCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkZvckluU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7XG5cdCAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICAgICAgdGhpcy5lYWNoID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRm9ySW5TdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRm9ySW5TdGF0ZW1lbnQgPSBGb3JJblN0YXRlbWVudDtcblx0dmFyIEZvck9mU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEZvck9mU3RhdGVtZW50KGxlZnQsIHJpZ2h0LCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkZvck9mU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7XG5cdCAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRm9yT2ZTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRm9yT2ZTdGF0ZW1lbnQgPSBGb3JPZlN0YXRlbWVudDtcblx0dmFyIEZvclN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBGb3JTdGF0ZW1lbnQoaW5pdCwgdGVzdCwgdXBkYXRlLCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkZvclN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmluaXQgPSBpbml0O1xuXHQgICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7XG5cdCAgICAgICAgdGhpcy51cGRhdGUgPSB1cGRhdGU7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBGb3JTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRm9yU3RhdGVtZW50ID0gRm9yU3RhdGVtZW50O1xuXHR2YXIgRnVuY3Rpb25EZWNsYXJhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBGdW5jdGlvbkRlY2xhcmF0aW9uKGlkLCBwYXJhbXMsIGJvZHksIGdlbmVyYXRvcikge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5GdW5jdGlvbkRlY2xhcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuaWQgPSBpZDtcblx0ICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuYXN5bmMgPSBmYWxzZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBGdW5jdGlvbkRlY2xhcmF0aW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkZ1bmN0aW9uRGVjbGFyYXRpb24gPSBGdW5jdGlvbkRlY2xhcmF0aW9uO1xuXHR2YXIgRnVuY3Rpb25FeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEZ1bmN0aW9uRXhwcmVzc2lvbihpZCwgcGFyYW1zLCBib2R5LCBnZW5lcmF0b3IpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRnVuY3Rpb25FeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuaWQgPSBpZDtcblx0ICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuYXN5bmMgPSBmYWxzZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBGdW5jdGlvbkV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuRnVuY3Rpb25FeHByZXNzaW9uID0gRnVuY3Rpb25FeHByZXNzaW9uO1xuXHR2YXIgSWRlbnRpZmllciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBJZGVudGlmaWVyKG5hbWUpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcjtcblx0ICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIElkZW50aWZpZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuSWRlbnRpZmllciA9IElkZW50aWZpZXI7XG5cdHZhciBJZlN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBJZlN0YXRlbWVudCh0ZXN0LCBjb25zZXF1ZW50LCBhbHRlcm5hdGUpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguSWZTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy50ZXN0ID0gdGVzdDtcblx0ICAgICAgICB0aGlzLmNvbnNlcXVlbnQgPSBjb25zZXF1ZW50O1xuXHQgICAgICAgIHRoaXMuYWx0ZXJuYXRlID0gYWx0ZXJuYXRlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIElmU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLklmU3RhdGVtZW50ID0gSWZTdGF0ZW1lbnQ7XG5cdHZhciBJbXBvcnREZWNsYXJhdGlvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBJbXBvcnREZWNsYXJhdGlvbihzcGVjaWZpZXJzLCBzb3VyY2UpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguSW1wb3J0RGVjbGFyYXRpb247XG5cdCAgICAgICAgdGhpcy5zcGVjaWZpZXJzID0gc3BlY2lmaWVycztcblx0ICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBJbXBvcnREZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5JbXBvcnREZWNsYXJhdGlvbiA9IEltcG9ydERlY2xhcmF0aW9uO1xuXHR2YXIgSW1wb3J0RGVmYXVsdFNwZWNpZmllciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBJbXBvcnREZWZhdWx0U3BlY2lmaWVyKGxvY2FsKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkltcG9ydERlZmF1bHRTcGVjaWZpZXI7XG5cdCAgICAgICAgdGhpcy5sb2NhbCA9IGxvY2FsO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEltcG9ydERlZmF1bHRTcGVjaWZpZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuSW1wb3J0RGVmYXVsdFNwZWNpZmllciA9IEltcG9ydERlZmF1bHRTcGVjaWZpZXI7XG5cdHZhciBJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKGxvY2FsKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjtcblx0ICAgICAgICB0aGlzLmxvY2FsID0gbG9jYWw7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLkltcG9ydE5hbWVzcGFjZVNwZWNpZmllciA9IEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjtcblx0dmFyIEltcG9ydFNwZWNpZmllciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBJbXBvcnRTcGVjaWZpZXIobG9jYWwsIGltcG9ydGVkKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkltcG9ydFNwZWNpZmllcjtcblx0ICAgICAgICB0aGlzLmxvY2FsID0gbG9jYWw7XG5cdCAgICAgICAgdGhpcy5pbXBvcnRlZCA9IGltcG9ydGVkO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEltcG9ydFNwZWNpZmllcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5JbXBvcnRTcGVjaWZpZXIgPSBJbXBvcnRTcGVjaWZpZXI7XG5cdHZhciBMYWJlbGVkU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIExhYmVsZWRTdGF0ZW1lbnQobGFiZWwsIGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguTGFiZWxlZFN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBMYWJlbGVkU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkxhYmVsZWRTdGF0ZW1lbnQgPSBMYWJlbGVkU3RhdGVtZW50O1xuXHR2YXIgTGl0ZXJhbCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBMaXRlcmFsKHZhbHVlLCByYXcpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguTGl0ZXJhbDtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgICAgdGhpcy5yYXcgPSByYXc7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gTGl0ZXJhbDtcblx0fSgpKTtcblx0ZXhwb3J0cy5MaXRlcmFsID0gTGl0ZXJhbDtcblx0dmFyIE1ldGFQcm9wZXJ0eSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBNZXRhUHJvcGVydHkobWV0YSwgcHJvcGVydHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguTWV0YVByb3BlcnR5O1xuXHQgICAgICAgIHRoaXMubWV0YSA9IG1ldGE7XG5cdCAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIE1ldGFQcm9wZXJ0eTtcblx0fSgpKTtcblx0ZXhwb3J0cy5NZXRhUHJvcGVydHkgPSBNZXRhUHJvcGVydHk7XG5cdHZhciBNZXRob2REZWZpbml0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIE1ldGhvZERlZmluaXRpb24oa2V5LCBjb21wdXRlZCwgdmFsdWUsIGtpbmQsIGlzU3RhdGljKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4Lk1ldGhvZERlZmluaXRpb247XG5cdCAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG5cdCAgICAgICAgdGhpcy5jb21wdXRlZCA9IGNvbXB1dGVkO1xuXHQgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuXHQgICAgICAgIHRoaXMuc3RhdGljID0gaXNTdGF0aWM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gTWV0aG9kRGVmaW5pdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5NZXRob2REZWZpbml0aW9uID0gTWV0aG9kRGVmaW5pdGlvbjtcblx0dmFyIE1vZHVsZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBNb2R1bGUoYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Qcm9ncmFtO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICAgICAgdGhpcy5zb3VyY2VUeXBlID0gJ21vZHVsZSc7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gTW9kdWxlO1xuXHR9KCkpO1xuXHRleHBvcnRzLk1vZHVsZSA9IE1vZHVsZTtcblx0dmFyIE5ld0V4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gTmV3RXhwcmVzc2lvbihjYWxsZWUsIGFyZ3MpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguTmV3RXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmNhbGxlZSA9IGNhbGxlZTtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50cyA9IGFyZ3M7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gTmV3RXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5OZXdFeHByZXNzaW9uID0gTmV3RXhwcmVzc2lvbjtcblx0dmFyIE9iamVjdEV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gT2JqZWN0RXhwcmVzc2lvbihwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4Lk9iamVjdEV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcblx0ICAgIH1cblx0ICAgIHJldHVybiBPYmplY3RFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLk9iamVjdEV4cHJlc3Npb24gPSBPYmplY3RFeHByZXNzaW9uO1xuXHR2YXIgT2JqZWN0UGF0dGVybiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBPYmplY3RQYXR0ZXJuKHByb3BlcnRpZXMpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguT2JqZWN0UGF0dGVybjtcblx0ICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIE9iamVjdFBhdHRlcm47XG5cdH0oKSk7XG5cdGV4cG9ydHMuT2JqZWN0UGF0dGVybiA9IE9iamVjdFBhdHRlcm47XG5cdHZhciBQcm9wZXJ0eSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBQcm9wZXJ0eShraW5kLCBrZXksIGNvbXB1dGVkLCB2YWx1ZSwgbWV0aG9kLCBzaG9ydGhhbmQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguUHJvcGVydHk7XG5cdCAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG5cdCAgICAgICAgdGhpcy5jb21wdXRlZCA9IGNvbXB1dGVkO1xuXHQgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuXHQgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuXHQgICAgICAgIHRoaXMuc2hvcnRoYW5kID0gc2hvcnRoYW5kO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFByb3BlcnR5O1xuXHR9KCkpO1xuXHRleHBvcnRzLlByb3BlcnR5ID0gUHJvcGVydHk7XG5cdHZhciBSZWdleExpdGVyYWwgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gUmVnZXhMaXRlcmFsKHZhbHVlLCByYXcsIHBhdHRlcm4sIGZsYWdzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkxpdGVyYWw7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgICAgICAgIHRoaXMucmF3ID0gcmF3O1xuXHQgICAgICAgIHRoaXMucmVnZXggPSB7IHBhdHRlcm46IHBhdHRlcm4sIGZsYWdzOiBmbGFncyB9O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFJlZ2V4TGl0ZXJhbDtcblx0fSgpKTtcblx0ZXhwb3J0cy5SZWdleExpdGVyYWwgPSBSZWdleExpdGVyYWw7XG5cdHZhciBSZXN0RWxlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBSZXN0RWxlbWVudChhcmd1bWVudCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5SZXN0RWxlbWVudDtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gUmVzdEVsZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuUmVzdEVsZW1lbnQgPSBSZXN0RWxlbWVudDtcblx0dmFyIFJldHVyblN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBSZXR1cm5TdGF0ZW1lbnQoYXJndW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguUmV0dXJuU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMuYXJndW1lbnQgPSBhcmd1bWVudDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBSZXR1cm5TdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuUmV0dXJuU3RhdGVtZW50ID0gUmV0dXJuU3RhdGVtZW50O1xuXHR2YXIgU2NyaXB0ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFNjcmlwdChib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlByb2dyYW07XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLnNvdXJjZVR5cGUgPSAnc2NyaXB0Jztcblx0ICAgIH1cblx0ICAgIHJldHVybiBTY3JpcHQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuU2NyaXB0ID0gU2NyaXB0O1xuXHR2YXIgU2VxdWVuY2VFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFNlcXVlbmNlRXhwcmVzc2lvbihleHByZXNzaW9ucykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5TZXF1ZW5jZUV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5leHByZXNzaW9ucyA9IGV4cHJlc3Npb25zO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFNlcXVlbmNlRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5TZXF1ZW5jZUV4cHJlc3Npb24gPSBTZXF1ZW5jZUV4cHJlc3Npb247XG5cdHZhciBTcHJlYWRFbGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFNwcmVhZEVsZW1lbnQoYXJndW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguU3ByZWFkRWxlbWVudDtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gU3ByZWFkRWxlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5TcHJlYWRFbGVtZW50ID0gU3ByZWFkRWxlbWVudDtcblx0dmFyIFN0YXRpY01lbWJlckV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gU3RhdGljTWVtYmVyRXhwcmVzc2lvbihvYmplY3QsIHByb3BlcnR5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4Lk1lbWJlckV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5jb21wdXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXHQgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBTdGF0aWNNZW1iZXJFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLlN0YXRpY01lbWJlckV4cHJlc3Npb24gPSBTdGF0aWNNZW1iZXJFeHByZXNzaW9uO1xuXHR2YXIgU3VwZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gU3VwZXIoKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlN1cGVyO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFN1cGVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLlN1cGVyID0gU3VwZXI7XG5cdHZhciBTd2l0Y2hDYXNlID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFN3aXRjaENhc2UodGVzdCwgY29uc2VxdWVudCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Td2l0Y2hDYXNlO1xuXHQgICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7XG5cdCAgICAgICAgdGhpcy5jb25zZXF1ZW50ID0gY29uc2VxdWVudDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBTd2l0Y2hDYXNlO1xuXHR9KCkpO1xuXHRleHBvcnRzLlN3aXRjaENhc2UgPSBTd2l0Y2hDYXNlO1xuXHR2YXIgU3dpdGNoU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFN3aXRjaFN0YXRlbWVudChkaXNjcmltaW5hbnQsIGNhc2VzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlN3aXRjaFN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmRpc2NyaW1pbmFudCA9IGRpc2NyaW1pbmFudDtcblx0ICAgICAgICB0aGlzLmNhc2VzID0gY2FzZXM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gU3dpdGNoU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLlN3aXRjaFN0YXRlbWVudCA9IFN3aXRjaFN0YXRlbWVudDtcblx0dmFyIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24odGFnLCBxdWFzaSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5UYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy50YWcgPSB0YWc7XG5cdCAgICAgICAgdGhpcy5xdWFzaSA9IHF1YXNpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5UYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24gPSBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb247XG5cdHZhciBUZW1wbGF0ZUVsZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVGVtcGxhdGVFbGVtZW50KHZhbHVlLCB0YWlsKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlRlbXBsYXRlRWxlbWVudDtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgICAgdGhpcy50YWlsID0gdGFpbDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBUZW1wbGF0ZUVsZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuVGVtcGxhdGVFbGVtZW50ID0gVGVtcGxhdGVFbGVtZW50O1xuXHR2YXIgVGVtcGxhdGVMaXRlcmFsID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRlbXBsYXRlTGl0ZXJhbChxdWFzaXMsIGV4cHJlc3Npb25zKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlRlbXBsYXRlTGl0ZXJhbDtcblx0ICAgICAgICB0aGlzLnF1YXNpcyA9IHF1YXNpcztcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gVGVtcGxhdGVMaXRlcmFsO1xuXHR9KCkpO1xuXHRleHBvcnRzLlRlbXBsYXRlTGl0ZXJhbCA9IFRlbXBsYXRlTGl0ZXJhbDtcblx0dmFyIFRoaXNFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRoaXNFeHByZXNzaW9uKCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5UaGlzRXhwcmVzc2lvbjtcblx0ICAgIH1cblx0ICAgIHJldHVybiBUaGlzRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5UaGlzRXhwcmVzc2lvbiA9IFRoaXNFeHByZXNzaW9uO1xuXHR2YXIgVGhyb3dTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVGhyb3dTdGF0ZW1lbnQoYXJndW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVGhyb3dTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFRocm93U3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLlRocm93U3RhdGVtZW50ID0gVGhyb3dTdGF0ZW1lbnQ7XG5cdHZhciBUcnlTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVHJ5U3RhdGVtZW50KGJsb2NrLCBoYW5kbGVyLCBmaW5hbGl6ZXIpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVHJ5U3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMuYmxvY2sgPSBibG9jaztcblx0ICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuXHQgICAgICAgIHRoaXMuZmluYWxpemVyID0gZmluYWxpemVyO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFRyeVN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5UcnlTdGF0ZW1lbnQgPSBUcnlTdGF0ZW1lbnQ7XG5cdHZhciBVbmFyeUV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVW5hcnlFeHByZXNzaW9uKG9wZXJhdG9yLCBhcmd1bWVudCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5VbmFyeUV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuXHQgICAgICAgIHRoaXMuYXJndW1lbnQgPSBhcmd1bWVudDtcblx0ICAgICAgICB0aGlzLnByZWZpeCA9IHRydWU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gVW5hcnlFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLlVuYXJ5RXhwcmVzc2lvbiA9IFVuYXJ5RXhwcmVzc2lvbjtcblx0dmFyIFVwZGF0ZUV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVXBkYXRlRXhwcmVzc2lvbihvcGVyYXRvciwgYXJndW1lbnQsIHByZWZpeCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5VcGRhdGVFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gVXBkYXRlRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5VcGRhdGVFeHByZXNzaW9uID0gVXBkYXRlRXhwcmVzc2lvbjtcblx0dmFyIFZhcmlhYmxlRGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsIGtpbmQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVmFyaWFibGVEZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmRlY2xhcmF0aW9ucyA9IGRlY2xhcmF0aW9ucztcblx0ICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFZhcmlhYmxlRGVjbGFyYXRpb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuVmFyaWFibGVEZWNsYXJhdGlvbiA9IFZhcmlhYmxlRGVjbGFyYXRpb247XG5cdHZhciBWYXJpYWJsZURlY2xhcmF0b3IgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVmFyaWFibGVEZWNsYXJhdG9yKGlkLCBpbml0KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRvcjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5pbml0ID0gaW5pdDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBWYXJpYWJsZURlY2xhcmF0b3I7XG5cdH0oKSk7XG5cdGV4cG9ydHMuVmFyaWFibGVEZWNsYXJhdG9yID0gVmFyaWFibGVEZWNsYXJhdG9yO1xuXHR2YXIgV2hpbGVTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gV2hpbGVTdGF0ZW1lbnQodGVzdCwgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5XaGlsZVN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0O1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gV2hpbGVTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuV2hpbGVTdGF0ZW1lbnQgPSBXaGlsZVN0YXRlbWVudDtcblx0dmFyIFdpdGhTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gV2l0aFN0YXRlbWVudChvYmplY3QsIGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguV2l0aFN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFdpdGhTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuV2l0aFN0YXRlbWVudCA9IFdpdGhTdGF0ZW1lbnQ7XG5cdHZhciBZaWVsZEV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gWWllbGRFeHByZXNzaW9uKGFyZ3VtZW50LCBkZWxlZ2F0ZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5ZaWVsZEV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBZaWVsZEV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuWWllbGRFeHByZXNzaW9uID0gWWllbGRFeHByZXNzaW9uO1xuXG5cbi8qKiovIH0sXG4vKiA4ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHR2YXIgYXNzZXJ0XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHR2YXIgZXJyb3JfaGFuZGxlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XG5cdHZhciBtZXNzYWdlc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cdHZhciBOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcblx0dmFyIHNjYW5uZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuXHR2YXIgc3ludGF4XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHR2YXIgdG9rZW5fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHR2YXIgQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlciA9ICdBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyJztcblx0dmFyIFBhcnNlciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBQYXJzZXIoY29kZSwgb3B0aW9ucywgZGVsZWdhdGUpIHtcblx0ICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuXHQgICAgICAgIHRoaXMuY29uZmlnID0ge1xuXHQgICAgICAgICAgICByYW5nZTogKHR5cGVvZiBvcHRpb25zLnJhbmdlID09PSAnYm9vbGVhbicpICYmIG9wdGlvbnMucmFuZ2UsXG5cdCAgICAgICAgICAgIGxvYzogKHR5cGVvZiBvcHRpb25zLmxvYyA9PT0gJ2Jvb2xlYW4nKSAmJiBvcHRpb25zLmxvYyxcblx0ICAgICAgICAgICAgc291cmNlOiBudWxsLFxuXHQgICAgICAgICAgICB0b2tlbnM6ICh0eXBlb2Ygb3B0aW9ucy50b2tlbnMgPT09ICdib29sZWFuJykgJiYgb3B0aW9ucy50b2tlbnMsXG5cdCAgICAgICAgICAgIGNvbW1lbnQ6ICh0eXBlb2Ygb3B0aW9ucy5jb21tZW50ID09PSAnYm9vbGVhbicpICYmIG9wdGlvbnMuY29tbWVudCxcblx0ICAgICAgICAgICAgdG9sZXJhbnQ6ICh0eXBlb2Ygb3B0aW9ucy50b2xlcmFudCA9PT0gJ2Jvb2xlYW4nKSAmJiBvcHRpb25zLnRvbGVyYW50XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcubG9jICYmIG9wdGlvbnMuc291cmNlICYmIG9wdGlvbnMuc291cmNlICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMuY29uZmlnLnNvdXJjZSA9IFN0cmluZyhvcHRpb25zLnNvdXJjZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcblx0ICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IG5ldyBlcnJvcl9oYW5kbGVyXzEuRXJyb3JIYW5kbGVyKCk7XG5cdCAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIudG9sZXJhbnQgPSB0aGlzLmNvbmZpZy50b2xlcmFudDtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIgPSBuZXcgc2Nhbm5lcl8xLlNjYW5uZXIoY29kZSwgdGhpcy5lcnJvckhhbmRsZXIpO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci50cmFja0NvbW1lbnQgPSB0aGlzLmNvbmZpZy5jb21tZW50O1xuXHQgICAgICAgIHRoaXMub3BlcmF0b3JQcmVjZWRlbmNlID0ge1xuXHQgICAgICAgICAgICAnKSc6IDAsXG5cdCAgICAgICAgICAgICc7JzogMCxcblx0ICAgICAgICAgICAgJywnOiAwLFxuXHQgICAgICAgICAgICAnPSc6IDAsXG5cdCAgICAgICAgICAgICddJzogMCxcblx0ICAgICAgICAgICAgJ3x8JzogMSxcblx0ICAgICAgICAgICAgJyYmJzogMixcblx0ICAgICAgICAgICAgJ3wnOiAzLFxuXHQgICAgICAgICAgICAnXic6IDQsXG5cdCAgICAgICAgICAgICcmJzogNSxcblx0ICAgICAgICAgICAgJz09JzogNixcblx0ICAgICAgICAgICAgJyE9JzogNixcblx0ICAgICAgICAgICAgJz09PSc6IDYsXG5cdCAgICAgICAgICAgICchPT0nOiA2LFxuXHQgICAgICAgICAgICAnPCc6IDcsXG5cdCAgICAgICAgICAgICc+JzogNyxcblx0ICAgICAgICAgICAgJzw9JzogNyxcblx0ICAgICAgICAgICAgJz49JzogNyxcblx0ICAgICAgICAgICAgJzw8JzogOCxcblx0ICAgICAgICAgICAgJz4+JzogOCxcblx0ICAgICAgICAgICAgJz4+Pic6IDgsXG5cdCAgICAgICAgICAgICcrJzogOSxcblx0ICAgICAgICAgICAgJy0nOiA5LFxuXHQgICAgICAgICAgICAnKic6IDExLFxuXHQgICAgICAgICAgICAnLyc6IDExLFxuXHQgICAgICAgICAgICAnJSc6IDExXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLmxvb2thaGVhZCA9IHtcblx0ICAgICAgICAgICAgdHlwZTogMiAvKiBFT0YgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiAnJyxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogMCxcblx0ICAgICAgICAgICAgc3RhcnQ6IDAsXG5cdCAgICAgICAgICAgIGVuZDogMFxuXHQgICAgICAgIH07XG5cdCAgICAgICAgdGhpcy5oYXNMaW5lVGVybWluYXRvciA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dCA9IHtcblx0ICAgICAgICAgICAgaXNNb2R1bGU6IGZhbHNlLFxuXHQgICAgICAgICAgICBhd2FpdDogZmFsc2UsXG5cdCAgICAgICAgICAgIGFsbG93SW46IHRydWUsXG5cdCAgICAgICAgICAgIGFsbG93U3RyaWN0RGlyZWN0aXZlOiB0cnVlLFxuXHQgICAgICAgICAgICBhbGxvd1lpZWxkOiB0cnVlLFxuXHQgICAgICAgICAgICBmaXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3I6IG51bGwsXG5cdCAgICAgICAgICAgIGlzQXNzaWdubWVudFRhcmdldDogZmFsc2UsXG5cdCAgICAgICAgICAgIGlzQmluZGluZ0VsZW1lbnQ6IGZhbHNlLFxuXHQgICAgICAgICAgICBpbkZ1bmN0aW9uQm9keTogZmFsc2UsXG5cdCAgICAgICAgICAgIGluSXRlcmF0aW9uOiBmYWxzZSxcblx0ICAgICAgICAgICAgaW5Td2l0Y2g6IGZhbHNlLFxuXHQgICAgICAgICAgICBsYWJlbFNldDoge30sXG5cdCAgICAgICAgICAgIHN0cmljdDogZmFsc2Vcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMudG9rZW5zID0gW107XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlciA9IHtcblx0ICAgICAgICAgICAgaW5kZXg6IDAsXG5cdCAgICAgICAgICAgIGxpbmU6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBjb2x1bW46IDBcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlciA9IHtcblx0ICAgICAgICAgICAgaW5kZXg6IDAsXG5cdCAgICAgICAgICAgIGxpbmU6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBjb2x1bW46IDBcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyID0ge1xuXHQgICAgICAgICAgICBpbmRleDogdGhpcy5zY2FubmVyLmluZGV4LFxuXHQgICAgICAgICAgICBsaW5lOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgY29sdW1uOiB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0XG5cdCAgICAgICAgfTtcblx0ICAgIH1cblx0ICAgIFBhcnNlci5wcm90b3R5cGUudGhyb3dFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlRm9ybWF0KSB7XG5cdCAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuXHQgICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG5cdCAgICAgICAgICAgIHZhbHVlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXHQgICAgICAgIHZhciBtc2cgPSBtZXNzYWdlRm9ybWF0LnJlcGxhY2UoLyUoXFxkKS9nLCBmdW5jdGlvbiAod2hvbGUsIGlkeCkge1xuXHQgICAgICAgICAgICBhc3NlcnRfMS5hc3NlcnQoaWR4IDwgYXJncy5sZW5ndGgsICdNZXNzYWdlIHJlZmVyZW5jZSBtdXN0IGJlIGluIHJhbmdlJyk7XG5cdCAgICAgICAgICAgIHJldHVybiBhcmdzW2lkeF07XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5sYXN0TWFya2VyLmluZGV4O1xuXHQgICAgICAgIHZhciBsaW5lID0gdGhpcy5sYXN0TWFya2VyLmxpbmU7XG5cdCAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMubGFzdE1hcmtlci5jb2x1bW4gKyAxO1xuXHQgICAgICAgIHRocm93IHRoaXMuZXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGluZGV4LCBsaW5lLCBjb2x1bW4sIG1zZyk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS50b2xlcmF0ZUVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2VGb3JtYXQpIHtcblx0ICAgICAgICB2YXIgdmFsdWVzID0gW107XG5cdCAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcblx0ICAgICAgICAgICAgdmFsdWVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cdCAgICAgICAgdmFyIG1zZyA9IG1lc3NhZ2VGb3JtYXQucmVwbGFjZSgvJShcXGQpL2csIGZ1bmN0aW9uICh3aG9sZSwgaWR4KSB7XG5cdCAgICAgICAgICAgIGFzc2VydF8xLmFzc2VydChpZHggPCBhcmdzLmxlbmd0aCwgJ01lc3NhZ2UgcmVmZXJlbmNlIG11c3QgYmUgaW4gcmFuZ2UnKTtcblx0ICAgICAgICAgICAgcmV0dXJuIGFyZ3NbaWR4XTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmxhc3RNYXJrZXIuaW5kZXg7XG5cdCAgICAgICAgdmFyIGxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5sYXN0TWFya2VyLmNvbHVtbiArIDE7XG5cdCAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIudG9sZXJhdGVFcnJvcihpbmRleCwgbGluZSwgY29sdW1uLCBtc2cpO1xuXHQgICAgfTtcblx0ICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbiBiZWNhdXNlIG9mIHRoZSB0b2tlbi5cblx0ICAgIFBhcnNlci5wcm90b3R5cGUudW5leHBlY3RlZFRva2VuRXJyb3IgPSBmdW5jdGlvbiAodG9rZW4sIG1lc3NhZ2UpIHtcblx0ICAgICAgICB2YXIgbXNnID0gbWVzc2FnZSB8fCBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbjtcblx0ICAgICAgICB2YXIgdmFsdWU7XG5cdCAgICAgICAgaWYgKHRva2VuKSB7XG5cdCAgICAgICAgICAgIGlmICghbWVzc2FnZSkge1xuXHQgICAgICAgICAgICAgICAgbXNnID0gKHRva2VuLnR5cGUgPT09IDIgLyogRU9GICovKSA/IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZEVPUyA6XG5cdCAgICAgICAgICAgICAgICAgICAgKHRva2VuLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLykgPyBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRJZGVudGlmaWVyIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgKHRva2VuLnR5cGUgPT09IDYgLyogTnVtZXJpY0xpdGVyYWwgKi8pID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkTnVtYmVyIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2tlbi50eXBlID09PSA4IC8qIFN0cmluZ0xpdGVyYWwgKi8pID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkU3RyaW5nIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9rZW4udHlwZSA9PT0gMTAgLyogVGVtcGxhdGUgKi8pID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVGVtcGxhdGUgOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbjtcblx0ICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA0IC8qIEtleXdvcmQgKi8pIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzRnV0dXJlUmVzZXJ2ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRSZXNlcnZlZDtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiB0aGlzLnNjYW5uZXIuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFJlc2VydmVkV29yZDtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdmFsdWUgPSB0b2tlbi52YWx1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhbHVlID0gJ0lMTEVHQUwnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBtc2cgPSBtc2cucmVwbGFjZSgnJTAnLCB2YWx1ZSk7XG5cdCAgICAgICAgaWYgKHRva2VuICYmIHR5cGVvZiB0b2tlbi5saW5lTnVtYmVyID09PSAnbnVtYmVyJykge1xuXHQgICAgICAgICAgICB2YXIgaW5kZXggPSB0b2tlbi5zdGFydDtcblx0ICAgICAgICAgICAgdmFyIGxpbmUgPSB0b2tlbi5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICB2YXIgbGFzdE1hcmtlckxpbmVTdGFydCA9IHRoaXMubGFzdE1hcmtlci5pbmRleCAtIHRoaXMubGFzdE1hcmtlci5jb2x1bW47XG5cdCAgICAgICAgICAgIHZhciBjb2x1bW4gPSB0b2tlbi5zdGFydCAtIGxhc3RNYXJrZXJMaW5lU3RhcnQgKyAxO1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoaW5kZXgsIGxpbmUsIGNvbHVtbiwgbXNnKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMubGFzdE1hcmtlci5pbmRleDtcblx0ICAgICAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmxhc3RNYXJrZXIubGluZTtcblx0ICAgICAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMubGFzdE1hcmtlci5jb2x1bW4gKyAxO1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoaW5kZXgsIGxpbmUsIGNvbHVtbiwgbXNnKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS50aHJvd1VuZXhwZWN0ZWRUb2tlbiA9IGZ1bmN0aW9uICh0b2tlbiwgbWVzc2FnZSkge1xuXHQgICAgICAgIHRocm93IHRoaXMudW5leHBlY3RlZFRva2VuRXJyb3IodG9rZW4sIG1lc3NhZ2UpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4gPSBmdW5jdGlvbiAodG9rZW4sIG1lc3NhZ2UpIHtcblx0ICAgICAgICB0aGlzLmVycm9ySGFuZGxlci50b2xlcmF0ZSh0aGlzLnVuZXhwZWN0ZWRUb2tlbkVycm9yKHRva2VuLCBtZXNzYWdlKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5jb2xsZWN0Q29tbWVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5jb21tZW50KSB7XG5cdCAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBjb21tZW50cyA9IHRoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTtcblx0ICAgICAgICAgICAgaWYgKGNvbW1lbnRzLmxlbmd0aCA+IDAgJiYgdGhpcy5kZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50cy5sZW5ndGg7ICsraSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBlID0gY29tbWVudHNbaV07XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB2b2lkIDA7XG5cdCAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZS5tdWx0aUxpbmUgPyAnQmxvY2tDb21tZW50JyA6ICdMaW5lQ29tbWVudCcsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNjYW5uZXIuc291cmNlLnNsaWNlKGUuc2xpY2VbMF0sIGUuc2xpY2VbMV0pXG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcucmFuZ2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yYW5nZSA9IGUucmFuZ2U7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb2MpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5sb2MgPSBlLmxvYztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDoge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogZS5sb2Muc3RhcnQubGluZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogZS5sb2Muc3RhcnQuY29sdW1uLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBlLnJhbmdlWzBdXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVuZDoge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogZS5sb2MuZW5kLmxpbmUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGUubG9jLmVuZC5jb2x1bW4sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IGUucmFuZ2VbMV1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZShub2RlLCBtZXRhZGF0YSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLy8gRnJvbSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0byBhbiBleHRlcm5hbCBzdHJ1Y3R1cmVcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuZ2V0VG9rZW5SYXcgPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5zY2FubmVyLnNvdXJjZS5zbGljZSh0b2tlbi5zdGFydCwgdG9rZW4uZW5kKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmNvbnZlcnRUb2tlbiA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgIHZhciB0ID0ge1xuXHQgICAgICAgICAgICB0eXBlOiB0b2tlbl8xLlRva2VuTmFtZVt0b2tlbi50eXBlXSxcblx0ICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pXG5cdCAgICAgICAgfTtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcucmFuZ2UpIHtcblx0ICAgICAgICAgICAgdC5yYW5nZSA9IFt0b2tlbi5zdGFydCwgdG9rZW4uZW5kXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxvYykge1xuXHQgICAgICAgICAgICB0LmxvYyA9IHtcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5zdGFydE1hcmtlci5saW5lLFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zdGFydE1hcmtlci5jb2x1bW5cblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnRcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDkgLyogUmVndWxhckV4cHJlc3Npb24gKi8pIHtcblx0ICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSB0b2tlbi5wYXR0ZXJuO1xuXHQgICAgICAgICAgICB2YXIgZmxhZ3MgPSB0b2tlbi5mbGFncztcblx0ICAgICAgICAgICAgdC5yZWdleCA9IHsgcGF0dGVybjogcGF0dGVybiwgZmxhZ3M6IGZsYWdzIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0O1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUubmV4dFRva2VuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlci5pbmRleCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIubGluZSA9IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyO1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlci5jb2x1bW4gPSB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0O1xuXHQgICAgICAgIHRoaXMuY29sbGVjdENvbW1lbnRzKCk7XG5cdCAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pbmRleCAhPT0gdGhpcy5zdGFydE1hcmtlci5pbmRleCkge1xuXHQgICAgICAgICAgICB0aGlzLnN0YXJ0TWFya2VyLmluZGV4ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICB0aGlzLnN0YXJ0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgdGhpcy5zdGFydE1hcmtlci5jb2x1bW4gPSB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbmV4dCA9IHRoaXMuc2Nhbm5lci5sZXgoKTtcblx0ICAgICAgICB0aGlzLmhhc0xpbmVUZXJtaW5hdG9yID0gKHRva2VuLmxpbmVOdW1iZXIgIT09IG5leHQubGluZU51bWJlcik7XG5cdCAgICAgICAgaWYgKG5leHQgJiYgdGhpcy5jb250ZXh0LnN0cmljdCAmJiBuZXh0LnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLykge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZChuZXh0LnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgbmV4dC50eXBlID0gNCAvKiBLZXl3b3JkICovO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMubG9va2FoZWFkID0gbmV4dDtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcudG9rZW5zICYmIG5leHQudHlwZSAhPT0gMiAvKiBFT0YgKi8pIHtcblx0ICAgICAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLmNvbnZlcnRUb2tlbihuZXh0KSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLm5leHRSZWdleFRva2VuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuY29sbGVjdENvbW1lbnRzKCk7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5zY2FubmVyLnNjYW5SZWdFeHAoKTtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcudG9rZW5zKSB7XG5cdCAgICAgICAgICAgIC8vIFBvcCB0aGUgcHJldmlvdXMgdG9rZW4sICcvJyBvciAnLz0nXG5cdCAgICAgICAgICAgIC8vIFRoaXMgaXMgYWRkZWQgZnJvbSB0aGUgbG9va2FoZWFkIHRva2VuLlxuXHQgICAgICAgICAgICB0aGlzLnRva2Vucy5wb3AoKTtcblx0ICAgICAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0aGlzLmNvbnZlcnRUb2tlbih0b2tlbikpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBQcmltZSB0aGUgbmV4dCBsb29rYWhlYWQuXG5cdCAgICAgICAgdGhpcy5sb29rYWhlYWQgPSB0b2tlbjtcblx0ICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmNyZWF0ZU5vZGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgaW5kZXg6IHRoaXMuc3RhcnRNYXJrZXIuaW5kZXgsXG5cdCAgICAgICAgICAgIGxpbmU6IHRoaXMuc3RhcnRNYXJrZXIubGluZSxcblx0ICAgICAgICAgICAgY29sdW1uOiB0aGlzLnN0YXJ0TWFya2VyLmNvbHVtblxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5zdGFydE5vZGUgPSBmdW5jdGlvbiAodG9rZW4sIGxhc3RMaW5lU3RhcnQpIHtcblx0ICAgICAgICBpZiAobGFzdExpbmVTdGFydCA9PT0gdm9pZCAwKSB7IGxhc3RMaW5lU3RhcnQgPSAwOyB9XG5cdCAgICAgICAgdmFyIGNvbHVtbiA9IHRva2VuLnN0YXJ0IC0gdG9rZW4ubGluZVN0YXJ0O1xuXHQgICAgICAgIHZhciBsaW5lID0gdG9rZW4ubGluZU51bWJlcjtcblx0ICAgICAgICBpZiAoY29sdW1uIDwgMCkge1xuXHQgICAgICAgICAgICBjb2x1bW4gKz0gbGFzdExpbmVTdGFydDtcblx0ICAgICAgICAgICAgbGluZS0tO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICBpbmRleDogdG9rZW4uc3RhcnQsXG5cdCAgICAgICAgICAgIGxpbmU6IGxpbmUsXG5cdCAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24gKG1hcmtlciwgbm9kZSkge1xuXHQgICAgICAgIGlmICh0aGlzLmNvbmZpZy5yYW5nZSkge1xuXHQgICAgICAgICAgICBub2RlLnJhbmdlID0gW21hcmtlci5pbmRleCwgdGhpcy5sYXN0TWFya2VyLmluZGV4XTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxvYykge1xuXHQgICAgICAgICAgICBub2RlLmxvYyA9IHtcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogbWFya2VyLmxpbmUsXG5cdCAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBtYXJrZXIuY29sdW1uLFxuXHQgICAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgICAgIGVuZDoge1xuXHQgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMubGFzdE1hcmtlci5saW5lLFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5sYXN0TWFya2VyLmNvbHVtblxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBpZiAodGhpcy5jb25maWcuc291cmNlKSB7XG5cdCAgICAgICAgICAgICAgICBub2RlLmxvYy5zb3VyY2UgPSB0aGlzLmNvbmZpZy5zb3VyY2U7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuZGVsZWdhdGUpIHtcblx0ICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0ge1xuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICBsaW5lOiBtYXJrZXIubGluZSxcblx0ICAgICAgICAgICAgICAgICAgICBjb2x1bW46IG1hcmtlci5jb2x1bW4sXG5cdCAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBtYXJrZXIuaW5kZXhcblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxhc3RNYXJrZXIubGluZSxcblx0ICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMubGFzdE1hcmtlci5jb2x1bW4sXG5cdCAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLmxhc3RNYXJrZXIuaW5kZXhcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZShub2RlLCBtZXRhZGF0YSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBub2RlO1xuXHQgICAgfTtcblx0ICAgIC8vIEV4cGVjdCB0aGUgbmV4dCB0b2tlbiB0byBtYXRjaCB0aGUgc3BlY2lmaWVkIHB1bmN0dWF0b3IuXG5cdCAgICAvLyBJZiBub3QsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi5cblx0ICAgIFBhcnNlci5wcm90b3R5cGUuZXhwZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gNyAvKiBQdW5jdHVhdG9yICovIHx8IHRva2VuLnZhbHVlICE9PSB2YWx1ZSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLy8gUXVpZXRseSBleHBlY3QgYSBjb21tYSB3aGVuIGluIHRvbGVyYW50IG1vZGUsIG90aGVyd2lzZSBkZWxlZ2F0ZXMgdG8gZXhwZWN0KCkuXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmV4cGVjdENvbW1hU2VwYXJhdG9yID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmNvbmZpZy50b2xlcmFudCkge1xuXHQgICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiB0b2tlbi52YWx1ZSA9PT0gJywnKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiB0b2tlbi52YWx1ZSA9PT0gJzsnKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLCBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcsJyk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8vIEV4cGVjdCB0aGUgbmV4dCB0b2tlbiB0byBtYXRjaCB0aGUgc3BlY2lmaWVkIGtleXdvcmQuXG5cdCAgICAvLyBJZiBub3QsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi5cblx0ICAgIFBhcnNlci5wcm90b3R5cGUuZXhwZWN0S2V5d29yZCA9IGZ1bmN0aW9uIChrZXl3b3JkKSB7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gNCAvKiBLZXl3b3JkICovIHx8IHRva2VuLnZhbHVlICE9PSBrZXl3b3JkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcHVuY3R1YXRvci5cblx0ICAgIFBhcnNlci5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5sb29rYWhlYWQudHlwZSA9PT0gNyAvKiBQdW5jdHVhdG9yICovICYmIHRoaXMubG9va2FoZWFkLnZhbHVlID09PSB2YWx1ZTtcblx0ICAgIH07XG5cdCAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQga2V5d29yZFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5tYXRjaEtleXdvcmQgPSBmdW5jdGlvbiAoa2V5d29yZCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmxvb2thaGVhZC50eXBlID09PSA0IC8qIEtleXdvcmQgKi8gJiYgdGhpcy5sb29rYWhlYWQudmFsdWUgPT09IGtleXdvcmQ7XG5cdCAgICB9O1xuXHQgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGNvbnRleHR1YWwga2V5d29yZFxuXHQgICAgLy8gKHdoZXJlIGFuIGlkZW50aWZpZXIgaXMgc29tZXRpbWVzIGEga2V5d29yZCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQpXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLm1hdGNoQ29udGV4dHVhbEtleXdvcmQgPSBmdW5jdGlvbiAoa2V5d29yZCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmxvb2thaGVhZC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgdGhpcy5sb29rYWhlYWQudmFsdWUgPT09IGtleXdvcmQ7XG5cdCAgICB9O1xuXHQgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIG5leHQgdG9rZW4gaXMgYW4gYXNzaWdubWVudCBvcGVyYXRvclxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5tYXRjaEFzc2lnbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gNyAvKiBQdW5jdHVhdG9yICovKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG9wID0gdGhpcy5sb29rYWhlYWQudmFsdWU7XG5cdCAgICAgICAgcmV0dXJuIG9wID09PSAnPScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICcqPScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICcqKj0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnLz0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnJT0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnKz0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnLT0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnPDw9JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJz4+PScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICc+Pj49JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJyY9JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJ149JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJ3w9Jztcblx0ICAgIH07XG5cdCAgICAvLyBDb3ZlciBncmFtbWFyIHN1cHBvcnQuXG5cdCAgICAvL1xuXHQgICAgLy8gV2hlbiBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gcG9zaXRpb24gc3RhcnRzIHdpdGggYW4gbGVmdCBwYXJlbnRoZXNpcywgdGhlIGRldGVybWluYXRpb24gb2YgdGhlIHR5cGVcblx0ICAgIC8vIG9mIHRoZSBzeW50YXggaXMgdG8gYmUgZGVmZXJyZWQgYXJiaXRyYXJpbHkgbG9uZyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBwYXJlbnRoZXNlcyBwYWlyIChwbHVzIGEgbG9va2FoZWFkKVxuXHQgICAgLy8gb3IgdGhlIGZpcnN0IGNvbW1hLiBUaGlzIHNpdHVhdGlvbiBhbHNvIGRlZmVycyB0aGUgZGV0ZXJtaW5hdGlvbiBvZiBhbGwgdGhlIGV4cHJlc3Npb25zIG5lc3RlZCBpbiB0aGUgcGFpci5cblx0ICAgIC8vXG5cdCAgICAvLyBUaGVyZSBhcmUgdGhyZWUgcHJvZHVjdGlvbnMgdGhhdCBjYW4gYmUgcGFyc2VkIGluIGEgcGFyZW50aGVzZXMgcGFpciB0aGF0IG5lZWRzIHRvIGJlIGRldGVybWluZWRcblx0ICAgIC8vIGFmdGVyIHRoZSBvdXRlcm1vc3QgcGFpciBpcyBjbG9zZWQuIFRoZXkgYXJlOlxuXHQgICAgLy9cblx0ICAgIC8vICAgMS4gQXNzaWdubWVudEV4cHJlc3Npb25cblx0ICAgIC8vICAgMi4gQmluZGluZ0VsZW1lbnRzXG5cdCAgICAvLyAgIDMuIEFzc2lnbm1lbnRUYXJnZXRzXG5cdCAgICAvL1xuXHQgICAgLy8gSW4gb3JkZXIgdG8gYXZvaWQgZXhwb25lbnRpYWwgYmFja3RyYWNraW5nLCB3ZSB1c2UgdHdvIGZsYWdzIHRvIGRlbm90ZSBpZiB0aGUgcHJvZHVjdGlvbiBjYW4gYmVcblx0ICAgIC8vIGJpbmRpbmcgZWxlbWVudCBvciBhc3NpZ25tZW50IHRhcmdldC5cblx0ICAgIC8vXG5cdCAgICAvLyBUaGUgdGhyZWUgcHJvZHVjdGlvbnMgaGF2ZSB0aGUgcmVsYXRpb25zaGlwOlxuXHQgICAgLy9cblx0ICAgIC8vICAgQmluZGluZ0VsZW1lbnRzIOKKhiBBc3NpZ25tZW50VGFyZ2V0cyDiioYgQXNzaWdubWVudEV4cHJlc3Npb25cblx0ICAgIC8vXG5cdCAgICAvLyB3aXRoIGEgc2luZ2xlIGV4Y2VwdGlvbiB0aGF0IENvdmVySW5pdGlhbGl6ZWROYW1lIHdoZW4gdXNlZCBkaXJlY3RseSBpbiBhbiBFeHByZXNzaW9uLCBnZW5lcmF0ZXNcblx0ICAgIC8vIGFuIGVhcmx5IGVycm9yLiBUaGVyZWZvcmUsIHdlIG5lZWQgdGhlIHRoaXJkIHN0YXRlLCBmaXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IsIHRvIHRyYWNrIHRoZVxuXHQgICAgLy8gZmlyc3QgdXNhZ2Ugb2YgQ292ZXJJbml0aWFsaXplZE5hbWUgYW5kIHJlcG9ydCBpdCB3aGVuIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgcGFyZW50aGVzZXMgcGFpci5cblx0ICAgIC8vXG5cdCAgICAvLyBpc29sYXRlQ292ZXJHcmFtbWFyIGZ1bmN0aW9uIHJ1bnMgdGhlIGdpdmVuIHBhcnNlciBmdW5jdGlvbiB3aXRoIGEgbmV3IGNvdmVyIGdyYW1tYXIgY29udGV4dCwgYW5kIGl0IGRvZXMgbm90XG5cdCAgICAvLyBlZmZlY3QgdGhlIGN1cnJlbnQgZmxhZ3MuIFRoaXMgbWVhbnMgdGhlIHByb2R1Y3Rpb24gdGhlIHBhcnNlciBwYXJzZXMgaXMgb25seSB1c2VkIGFzIGFuIGV4cHJlc3Npb24uIFRoZXJlZm9yZVxuXHQgICAgLy8gdGhlIENvdmVySW5pdGlhbGl6ZWROYW1lIGNoZWNrIGlzIGNvbmR1Y3RlZC5cblx0ICAgIC8vXG5cdCAgICAvLyBpbmhlcml0Q292ZXJHcmFtbWFyIGZ1bmN0aW9uIHJ1bnMgdGhlIGdpdmVuIHBhcnNlIGZ1bmN0aW9uIHdpdGggYSBuZXcgY292ZXIgZ3JhbW1hciBjb250ZXh0LCBhbmQgaXQgcHJvcGFnYXRlc1xuXHQgICAgLy8gdGhlIGZsYWdzIG91dHNpZGUgb2YgdGhlIHBhcnNlci4gVGhpcyBtZWFucyB0aGUgcHJvZHVjdGlvbiB0aGUgcGFyc2VyIHBhcnNlcyBpcyB1c2VkIGFzIGEgcGFydCBvZiBhIHBvdGVudGlhbFxuXHQgICAgLy8gcGF0dGVybi4gVGhlIENvdmVySW5pdGlhbGl6ZWROYW1lIGNoZWNrIGlzIGRlZmVycmVkLlxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5pc29sYXRlQ292ZXJHcmFtbWFyID0gZnVuY3Rpb24gKHBhcnNlRnVuY3Rpb24pIHtcblx0ICAgICAgICB2YXIgcHJldmlvdXNJc0JpbmRpbmdFbGVtZW50ID0gdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzSXNBc3NpZ25tZW50VGFyZ2V0ID0gdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNGaXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gbnVsbDtcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gcGFyc2VGdW5jdGlvbi5jYWxsKHRoaXMpO1xuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gcHJldmlvdXNJc0JpbmRpbmdFbGVtZW50O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBwcmV2aW91c0lzQXNzaWdubWVudFRhcmdldDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gcHJldmlvdXNGaXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3I7XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdDtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmluaGVyaXRDb3ZlckdyYW1tYXIgPSBmdW5jdGlvbiAocGFyc2VGdW5jdGlvbikge1xuXHQgICAgICAgIHZhciBwcmV2aW91c0lzQmluZGluZ0VsZW1lbnQgPSB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNJc0Fzc2lnbm1lbnRUYXJnZXQgPSB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0ZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciA9IHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3I7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSBudWxsO1xuXHQgICAgICAgIHZhciByZXN1bHQgPSBwYXJzZUZ1bmN0aW9uLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCAmJiBwcmV2aW91c0lzQmluZGluZ0VsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgJiYgcHJldmlvdXNJc0Fzc2lnbm1lbnRUYXJnZXQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciA9IHByZXZpb3VzRmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yIHx8IHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3I7XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdDtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmNvbnN1bWVTZW1pY29sb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJzsnKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICghdGhpcy5oYXNMaW5lVGVybWluYXRvcikge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMiAvKiBFT0YgKi8gJiYgIXRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5sYXN0TWFya2VyLmluZGV4ID0gdGhpcy5zdGFydE1hcmtlci5pbmRleDtcblx0ICAgICAgICAgICAgdGhpcy5sYXN0TWFya2VyLmxpbmUgPSB0aGlzLnN0YXJ0TWFya2VyLmxpbmU7XG5cdCAgICAgICAgICAgIHRoaXMubGFzdE1hcmtlci5jb2x1bW4gPSB0aGlzLnN0YXJ0TWFya2VyLmNvbHVtbjtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJpbWFyeS1leHByZXNzaW9uXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlUHJpbWFyeUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgZXhwcjtcblx0ICAgICAgICB2YXIgdG9rZW4sIHJhdztcblx0ICAgICAgICBzd2l0Y2ggKHRoaXMubG9va2FoZWFkLnR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSAzIC8qIElkZW50aWZpZXIgKi86XG5cdCAgICAgICAgICAgICAgICBpZiAoKHRoaXMuY29udGV4dC5pc01vZHVsZSB8fCB0aGlzLmNvbnRleHQuYXdhaXQpICYmIHRoaXMubG9va2FoZWFkLnZhbHVlID09PSAnYXdhaXQnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5tYXRjaEFzeW5jRnVuY3Rpb24oKSA/IHRoaXMucGFyc2VGdW5jdGlvbkV4cHJlc3Npb24oKSA6IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWRlbnRpZmllcih0aGlzLm5leHRUb2tlbigpLnZhbHVlKSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSA2IC8qIE51bWVyaWNMaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDggLyogU3RyaW5nTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHRoaXMubG9va2FoZWFkLm9jdGFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RPY3RhbExpdGVyYWwpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuTGl0ZXJhbCh0b2tlbi52YWx1ZSwgcmF3KSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAxIC8qIEJvb2xlYW5MaXRlcmFsICovOlxuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuTGl0ZXJhbCh0b2tlbi52YWx1ZSA9PT0gJ3RydWUnLCByYXcpKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDUgLyogTnVsbExpdGVyYWwgKi86XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgcmF3ID0gdGhpcy5nZXRUb2tlblJhdyh0b2tlbik7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5MaXRlcmFsKG51bGwsIHJhdykpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgMTAgLyogVGVtcGxhdGUgKi86XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZVRlbXBsYXRlTGl0ZXJhbCgpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgNyAvKiBQdW5jdHVhdG9yICovOlxuXHQgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmxvb2thaGVhZC52YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJygnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VHcm91cEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdbJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXJyYXlJbml0aWFsaXplcik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VPYmplY3RJbml0aWFsaXplcik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJy8nOlxuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJy89Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYW5uZXIuaW5kZXggPSB0aGlzLnN0YXJ0TWFya2VyLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubmV4dFJlZ2V4VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmF3ID0gdGhpcy5nZXRUb2tlblJhdyh0b2tlbik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlJlZ2V4TGl0ZXJhbCh0b2tlbi5yZWdleCwgcmF3LCB0b2tlbi5wYXR0ZXJuLCB0b2tlbi5mbGFncykpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDQgLyogS2V5d29yZCAqLzpcblx0ICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LnN0cmljdCAmJiB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCAmJiB0aGlzLm1hdGNoS2V5d29yZCgneWllbGQnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHRoaXMubWF0Y2hLZXl3b3JkKCdsZXQnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIodGhpcy5uZXh0VG9rZW4oKS52YWx1ZSkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdmdW5jdGlvbicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCd0aGlzJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVGhpc0V4cHJlc3Npb24oKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdjbGFzcycpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlQ2xhc3NFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZXhwcjtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS1pbml0aWFsaXplclxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVNwcmVhZEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnLi4uJyk7XG5cdCAgICAgICAgdmFyIGFyZyA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlNwcmVhZEVsZW1lbnQoYXJnKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUFycmF5SW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgZWxlbWVudHMgPSBbXTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnWycpO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5tYXRjaCgnXScpKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKG51bGwpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJy4uLicpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMucGFyc2VTcHJlYWRFbGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJ10nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcsJyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaCh0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKSk7XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJ10nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcsJyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ10nKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5BcnJheUV4cHJlc3Npb24oZWxlbWVudHMpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QtaW5pdGlhbGl6ZXJcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VQcm9wZXJ0eU1ldGhvZCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNTdHJpY3QgPSB0aGlzLmNvbnRleHQuc3RyaWN0O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlID0gdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZSA9IHBhcmFtcy5zaW1wbGU7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUZ1bmN0aW9uU291cmNlRWxlbWVudHMpO1xuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHBhcmFtcy5maXJzdFJlc3RyaWN0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbihwYXJhbXMuZmlyc3RSZXN0cmljdGVkLCBwYXJhbXMubWVzc2FnZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHBhcmFtcy5zdHJpY3RlZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHBhcmFtcy5zdHJpY3RlZCwgcGFyYW1zLm1lc3NhZ2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gcHJldmlvdXNTdHJpY3Q7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZTtcblx0ICAgICAgICByZXR1cm4gYm9keTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlUHJvcGVydHlNZXRob2RGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgaXNHZW5lcmF0b3IgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHRydWU7XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IHRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKCk7XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IHRoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZChwYXJhbXMpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkZ1bmN0aW9uRXhwcmVzc2lvbihudWxsLCBwYXJhbXMucGFyYW1zLCBtZXRob2QsIGlzR2VuZXJhdG9yKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVByb3BlcnR5TWV0aG9kQXN5bmNGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBd2FpdCA9IHRoaXMuY29udGV4dC5hd2FpdDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hd2FpdCA9IHRydWU7XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IHRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKCk7XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IHRoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZChwYXJhbXMpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hd2FpdCA9IHByZXZpb3VzQXdhaXQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXN5bmNGdW5jdGlvbkV4cHJlc3Npb24obnVsbCwgcGFyYW1zLnBhcmFtcywgbWV0aG9kKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU9iamVjdFByb3BlcnR5S2V5ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB2YXIga2V5O1xuXHQgICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuXHQgICAgICAgICAgICBjYXNlIDggLyogU3RyaW5nTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA2IC8qIE51bWVyaWNMaXRlcmFsICovOlxuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgdG9rZW4ub2N0YWwpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLCBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdE9jdGFsTGl0ZXJhbCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB2YXIgcmF3ID0gdGhpcy5nZXRUb2tlblJhdyh0b2tlbik7XG5cdCAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkxpdGVyYWwodG9rZW4udmFsdWUsIHJhdykpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgMyAvKiBJZGVudGlmaWVyICovOlxuXHQgICAgICAgICAgICBjYXNlIDEgLyogQm9vbGVhbkxpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgNSAvKiBOdWxsTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA0IC8qIEtleXdvcmQgKi86XG5cdCAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIodG9rZW4udmFsdWUpKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDcgLyogUHVuY3R1YXRvciAqLzpcblx0ICAgICAgICAgICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PT0gJ1snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJ10nKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGtleTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmlzUHJvcGVydHlLZXkgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHQgICAgICAgIHJldHVybiAoa2V5LnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyICYmIGtleS5uYW1lID09PSB2YWx1ZSkgfHxcblx0ICAgICAgICAgICAgKGtleS50eXBlID09PSBzeW50YXhfMS5TeW50YXguTGl0ZXJhbCAmJiBrZXkudmFsdWUgPT09IHZhbHVlKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlT2JqZWN0UHJvcGVydHkgPSBmdW5jdGlvbiAoaGFzUHJvdG8pIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHZhciBraW5kO1xuXHQgICAgICAgIHZhciBrZXkgPSBudWxsO1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IG51bGw7XG5cdCAgICAgICAgdmFyIGNvbXB1dGVkID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBzaG9ydGhhbmQgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgaXNBc3luYyA9IGZhbHNlO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pIHtcblx0ICAgICAgICAgICAgdmFyIGlkID0gdG9rZW4udmFsdWU7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBpc0FzeW5jID0gIXRoaXMuaGFzTGluZVRlcm1pbmF0b3IgJiYgKGlkID09PSAnYXN5bmMnKSAmJlxuXHQgICAgICAgICAgICAgICAgIXRoaXMubWF0Y2goJzonKSAmJiAhdGhpcy5tYXRjaCgnKCcpICYmICF0aGlzLm1hdGNoKCcqJykgJiYgIXRoaXMubWF0Y2goJywnKTtcblx0ICAgICAgICAgICAga2V5ID0gaXNBc3luYyA/IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpIDogdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5JZGVudGlmaWVyKGlkKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJyonKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbG9va2FoZWFkUHJvcGVydHlLZXkgPSB0aGlzLnF1YWxpZmllZFByb3BlcnR5TmFtZSh0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLyAmJiAhaXNBc3luYyAmJiB0b2tlbi52YWx1ZSA9PT0gJ2dldCcgJiYgbG9va2FoZWFkUHJvcGVydHlLZXkpIHtcblx0ICAgICAgICAgICAga2luZCA9ICdnZXQnO1xuXHQgICAgICAgICAgICBjb21wdXRlZCA9IHRoaXMubWF0Y2goJ1snKTtcblx0ICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wYXJzZUdldHRlck1ldGhvZCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgIWlzQXN5bmMgJiYgdG9rZW4udmFsdWUgPT09ICdzZXQnICYmIGxvb2thaGVhZFByb3BlcnR5S2V5KSB7XG5cdCAgICAgICAgICAgIGtpbmQgPSAnc2V0Jztcblx0ICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VTZXR0ZXJNZXRob2QoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gNyAvKiBQdW5jdHVhdG9yICovICYmIHRva2VuLnZhbHVlID09PSAnKicgJiYgbG9va2FoZWFkUHJvcGVydHlLZXkpIHtcblx0ICAgICAgICAgICAga2luZCA9ICdpbml0Jztcblx0ICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VHZW5lcmF0b3JNZXRob2QoKTtcblx0ICAgICAgICAgICAgbWV0aG9kID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGlmICgha2V5KSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBraW5kID0gJ2luaXQnO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnOicpICYmICFpc0FzeW5jKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoIWNvbXB1dGVkICYmIHRoaXMuaXNQcm9wZXJ0eUtleShrZXksICdfX3Byb3RvX18nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQcm90by52YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5EdXBsaWNhdGVQcm90b1Byb3BlcnR5KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaGFzUHJvdG8udmFsdWUgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaCgnKCcpKSB7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IGlzQXN5bmMgPyB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2RBc3luY0Z1bmN0aW9uKCkgOiB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2RGdW5jdGlvbigpO1xuXHQgICAgICAgICAgICAgICAgbWV0aG9kID0gdHJ1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pIHtcblx0ICAgICAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWRlbnRpZmllcih0b2tlbi52YWx1ZSkpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJz0nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIHNob3J0aGFuZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGluaXQgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXNzaWdubWVudFBhdHRlcm4oaWQsIGluaXQpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHNob3J0aGFuZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpZDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuUHJvcGVydHkoa2luZCwga2V5LCBjb21wdXRlZCwgdmFsdWUsIG1ldGhvZCwgc2hvcnRoYW5kKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU9iamVjdEluaXRpYWxpemVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ3snKTtcblx0ICAgICAgICB2YXIgcHJvcGVydGllcyA9IFtdO1xuXHQgICAgICAgIHZhciBoYXNQcm90byA9IHsgdmFsdWU6IGZhbHNlIH07XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eShoYXNQcm90bykpO1xuXHQgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5leHBlY3RDb21tYVNlcGFyYXRvcigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuT2JqZWN0RXhwcmVzc2lvbihwcm9wZXJ0aWVzKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdGVtcGxhdGUtbGl0ZXJhbHNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VUZW1wbGF0ZUhlYWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KHRoaXMubG9va2FoZWFkLmhlYWQsICdUZW1wbGF0ZSBsaXRlcmFsIG11c3Qgc3RhcnQgd2l0aCBhIHRlbXBsYXRlIGhlYWQnKTtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdmFyIHJhdyA9IHRva2VuLnZhbHVlO1xuXHQgICAgICAgIHZhciBjb29rZWQgPSB0b2tlbi5jb29rZWQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVGVtcGxhdGVFbGVtZW50KHsgcmF3OiByYXcsIGNvb2tlZDogY29va2VkIH0sIHRva2VuLnRhaWwpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVGVtcGxhdGVFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmxvb2thaGVhZC50eXBlICE9PSAxMCAvKiBUZW1wbGF0ZSAqLykge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB2YXIgcmF3ID0gdG9rZW4udmFsdWU7XG5cdCAgICAgICAgdmFyIGNvb2tlZCA9IHRva2VuLmNvb2tlZDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5UZW1wbGF0ZUVsZW1lbnQoeyByYXc6IHJhdywgY29va2VkOiBjb29rZWQgfSwgdG9rZW4udGFpbCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VUZW1wbGF0ZUxpdGVyYWwgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTtcblx0ICAgICAgICB2YXIgcXVhc2lzID0gW107XG5cdCAgICAgICAgdmFyIHF1YXNpID0gdGhpcy5wYXJzZVRlbXBsYXRlSGVhZCgpO1xuXHQgICAgICAgIHF1YXNpcy5wdXNoKHF1YXNpKTtcblx0ICAgICAgICB3aGlsZSAoIXF1YXNpLnRhaWwpIHtcblx0ICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaCh0aGlzLnBhcnNlRXhwcmVzc2lvbigpKTtcblx0ICAgICAgICAgICAgcXVhc2kgPSB0aGlzLnBhcnNlVGVtcGxhdGVFbGVtZW50KCk7XG5cdCAgICAgICAgICAgIHF1YXNpcy5wdXNoKHF1YXNpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVGVtcGxhdGVMaXRlcmFsKHF1YXNpcywgZXhwcmVzc2lvbnMpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1ncm91cGluZy1vcGVyYXRvclxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4gPSBmdW5jdGlvbiAoZXhwcikge1xuXHQgICAgICAgIHN3aXRjaCAoZXhwci50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXI6XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4Lk1lbWJlckV4cHJlc3Npb246XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LlJlc3RFbGVtZW50OlxuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5Bc3NpZ25tZW50UGF0dGVybjpcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5TcHJlYWRFbGVtZW50OlxuXHQgICAgICAgICAgICAgICAgZXhwci50eXBlID0gc3ludGF4XzEuU3ludGF4LlJlc3RFbGVtZW50O1xuXHQgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwci5hcmd1bWVudCk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguQXJyYXlFeHByZXNzaW9uOlxuXHQgICAgICAgICAgICAgICAgZXhwci50eXBlID0gc3ludGF4XzEuU3ludGF4LkFycmF5UGF0dGVybjtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwci5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChleHByLmVsZW1lbnRzW2ldICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHIuZWxlbWVudHNbaV0pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5PYmplY3RFeHByZXNzaW9uOlxuXHQgICAgICAgICAgICAgICAgZXhwci50eXBlID0gc3ludGF4XzEuU3ludGF4Lk9iamVjdFBhdHRlcm47XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHIucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHIucHJvcGVydGllc1tpXS52YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudEV4cHJlc3Npb246XG5cdCAgICAgICAgICAgICAgICBleHByLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudFBhdHRlcm47XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgZXhwci5vcGVyYXRvcjtcblx0ICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHIubGVmdCk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIC8vIEFsbG93IG90aGVyIG5vZGUgdHlwZSBmb3IgdG9sZXJhbnQgcGFyc2luZy5cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlR3JvdXBFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBleHByO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJz0+JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCc9PicpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiBBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyLFxuXHQgICAgICAgICAgICAgICAgcGFyYW1zOiBbXSxcblx0ICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgdmFyIHBhcmFtcyA9IFtdO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnLi4uJykpIHtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlUmVzdEVsZW1lbnQocGFyYW1zKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJz0+JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnPT4nKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IFtleHByXSxcblx0ICAgICAgICAgICAgICAgICAgICBhc3luYzogZmFsc2Vcblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYXJyb3cgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaChleHByKTtcblx0ICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMiAvKiBFT0YgKi8pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwcmVzc2lvbnNbaV0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3cgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogZXhwcmVzc2lvbnMsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJy4uLicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKHRoaXMucGFyc2VSZXN0RWxlbWVudChwYXJhbXMpKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJz0+JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnPT4nKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHJlc3Npb25zLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwcmVzc2lvbnNbaV0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3cgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogZXhwcmVzc2lvbnMsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaCh0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFycm93KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWFycm93KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5TZXF1ZW5jZUV4cHJlc3Npb24oZXhwcmVzc2lvbnMpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoIWFycm93KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJyknKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnPT4nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwci50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllciAmJiBleHByLm5hbWUgPT09ICd5aWVsZCcpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IFtleHByXSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogZmFsc2Vcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJvdykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHIudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LlNlcXVlbmNlRXhwcmVzc2lvbikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwci5leHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByLmV4cHJlc3Npb25zW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJhbWV0ZXJzID0gKGV4cHIudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LlNlcXVlbmNlRXhwcmVzc2lvbiA/IGV4cHIuZXhwcmVzc2lvbnMgOiBbZXhwcl0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1ldGVycyxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogZmFsc2Vcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZXhwcjtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1sZWZ0LWhhbmQtc2lkZS1leHByZXNzaW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUFyZ3VtZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKCcpO1xuXHQgICAgICAgIHZhciBhcmdzID0gW107XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBleHByID0gdGhpcy5tYXRjaCgnLi4uJykgPyB0aGlzLnBhcnNlU3ByZWFkRWxlbWVudCgpIDpcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgIGFyZ3MucHVzaChleHByKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0Q29tbWFTZXBhcmF0b3IoKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgIHJldHVybiBhcmdzO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuaXNJZGVudGlmaWVyTmFtZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgIHJldHVybiB0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gfHxcblx0ICAgICAgICAgICAgdG9rZW4udHlwZSA9PT0gNCAvKiBLZXl3b3JkICovIHx8XG5cdCAgICAgICAgICAgIHRva2VuLnR5cGUgPT09IDEgLyogQm9vbGVhbkxpdGVyYWwgKi8gfHxcblx0ICAgICAgICAgICAgdG9rZW4udHlwZSA9PT0gNSAvKiBOdWxsTGl0ZXJhbCAqLztcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlSWRlbnRpZmllck5hbWUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIGlmICghdGhpcy5pc0lkZW50aWZpZXJOYW1lKHRva2VuKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWRlbnRpZmllcih0b2tlbi52YWx1ZSkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VOZXdFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KGlkLm5hbWUgPT09ICduZXcnLCAnTmV3IGV4cHJlc3Npb24gbXVzdCBzdGFydCB3aXRoIGBuZXdgJyk7XG5cdCAgICAgICAgdmFyIGV4cHI7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJy4nKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovICYmIHRoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keSAmJiB0aGlzLmxvb2thaGVhZC52YWx1ZSA9PT0gJ3RhcmdldCcpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IHRoaXMucGFyc2VJZGVudGlmaWVyTmFtZSgpO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IG5ldyBOb2RlLk1ldGFQcm9wZXJ0eShpZCwgcHJvcGVydHkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBjYWxsZWUgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUxlZnRIYW5kU2lkZUV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICB2YXIgYXJncyA9IHRoaXMubWF0Y2goJygnKSA/IHRoaXMucGFyc2VBcmd1bWVudHMoKSA6IFtdO1xuXHQgICAgICAgICAgICBleHByID0gbmV3IE5vZGUuTmV3RXhwcmVzc2lvbihjYWxsZWUsIGFyZ3MpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIGV4cHIpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VBc3luY0FyZ3VtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBhcmcgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gYXJnO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VBc3luY0FyZ3VtZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKCcpO1xuXHQgICAgICAgIHZhciBhcmdzID0gW107XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBleHByID0gdGhpcy5tYXRjaCgnLi4uJykgPyB0aGlzLnBhcnNlU3ByZWFkRWxlbWVudCgpIDpcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzeW5jQXJndW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgYXJncy5wdXNoKGV4cHIpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5leHBlY3RDb21tYVNlcGFyYXRvcigpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgcmV0dXJuIGFyZ3M7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUxlZnRIYW5kU2lkZUV4cHJlc3Npb25BbGxvd0NhbGwgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIgbWF5YmVBc3luYyA9IHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnYXN5bmMnKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd0luID0gdGhpcy5jb250ZXh0LmFsbG93SW47XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSB0cnVlO1xuXHQgICAgICAgIHZhciBleHByO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnc3VwZXInKSAmJiB0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkpIHtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShleHByLCBuZXcgTm9kZS5TdXBlcigpKTtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcoJykgJiYgIXRoaXMubWF0Y2goJy4nKSAmJiAhdGhpcy5tYXRjaCgnWycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLm1hdGNoS2V5d29yZCgnbmV3JykgPyB0aGlzLnBhcnNlTmV3RXhwcmVzc2lvbiA6IHRoaXMucGFyc2VQcmltYXJ5RXhwcmVzc2lvbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcuJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcuJyk7XG5cdCAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5TdGF0aWNNZW1iZXJFeHByZXNzaW9uKGV4cHIsIHByb3BlcnR5KSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaCgnKCcpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYXN5bmNBcnJvdyA9IG1heWJlQXN5bmMgJiYgKHN0YXJ0VG9rZW4ubGluZU51bWJlciA9PT0gdGhpcy5sb29rYWhlYWQubGluZU51bWJlcik7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBhc3luY0Fycm93ID8gdGhpcy5wYXJzZUFzeW5jQXJndW1lbnRzKCkgOiB0aGlzLnBhcnNlQXJndW1lbnRzKCk7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuQ2FsbEV4cHJlc3Npb24oZXhwciwgYXJncykpO1xuXHQgICAgICAgICAgICAgICAgaWYgKGFzeW5jQXJyb3cgJiYgdGhpcy5tYXRjaCgnPT4nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihhcmdzW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZXhwciA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBhcmdzLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogdHJ1ZVxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaCgnWycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnWycpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCddJyk7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uKGV4cHIsIHByb3BlcnR5KSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMTAgLyogVGVtcGxhdGUgKi8gJiYgdGhpcy5sb29rYWhlYWQuaGVhZCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIHF1YXNpID0gdGhpcy5wYXJzZVRlbXBsYXRlTGl0ZXJhbCgpO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbihleHByLCBxdWFzaSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSBwcmV2aW91c0FsbG93SW47XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVN1cGVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdzdXBlcicpO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnWycpICYmICF0aGlzLm1hdGNoKCcuJykpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlN1cGVyKCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VMZWZ0SGFuZFNpZGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGFzc2VydF8xLmFzc2VydCh0aGlzLmNvbnRleHQuYWxsb3dJbiwgJ2NhbGxlZSBvZiBuZXcgZXhwcmVzc2lvbiBhbHdheXMgYWxsb3cgaW4ga2V5d29yZC4nKTtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICB2YXIgZXhwciA9ICh0aGlzLm1hdGNoS2V5d29yZCgnc3VwZXInKSAmJiB0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkpID8gdGhpcy5wYXJzZVN1cGVyKCkgOlxuXHQgICAgICAgICAgICB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5tYXRjaEtleXdvcmQoJ25ldycpID8gdGhpcy5wYXJzZU5ld0V4cHJlc3Npb24gOiB0aGlzLnBhcnNlUHJpbWFyeUV4cHJlc3Npb24pO1xuXHQgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCdbJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCdbJyk7XG5cdCAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJ10nKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkNvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbihleHByLCBwcm9wZXJ0eSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJy4nKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJy4nKTtcblx0ICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IHRoaXMucGFyc2VJZGVudGlmaWVyTmFtZSgpO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuU3RhdGljTWVtYmVyRXhwcmVzc2lvbihleHByLCBwcm9wZXJ0eSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDEwIC8qIFRlbXBsYXRlICovICYmIHRoaXMubG9va2FoZWFkLmhlYWQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBxdWFzaSA9IHRoaXMucGFyc2VUZW1wbGF0ZUxpdGVyYWwoKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbihleHByLCBxdWFzaSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdXBkYXRlLWV4cHJlc3Npb25zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVXBkYXRlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgZXhwcjtcblx0ICAgICAgICB2YXIgc3RhcnRUb2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCcrKycpIHx8IHRoaXMubWF0Y2goJy0tJykpIHtcblx0ICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKTtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlVW5hcnlFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgZXhwci50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllciAmJiB0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZChleHByLm5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RMSFNQcmVmaXgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZExIU0luQXNzaWdubWVudCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdmFyIHByZWZpeCA9IHRydWU7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlVwZGF0ZUV4cHJlc3Npb24odG9rZW4udmFsdWUsIGV4cHIsIHByZWZpeCkpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VMZWZ0SGFuZFNpZGVFeHByZXNzaW9uQWxsb3dDYWxsKTtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yICYmIHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLykge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJysrJykgfHwgdGhpcy5tYXRjaCgnLS0nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGV4cHIudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIgJiYgdGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQoZXhwci5uYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RMSFNQb3N0Zml4KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRMSFNJbkFzc2lnbm1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgb3BlcmF0b3IgPSB0aGlzLm5leHRUb2tlbigpLnZhbHVlO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBwcmVmaXggPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuVXBkYXRlRXhwcmVzc2lvbihvcGVyYXRvciwgZXhwciwgcHJlZml4KSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdW5hcnktb3BlcmF0b3JzXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQXdhaXRFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB2YXIgYXJndW1lbnQgPSB0aGlzLnBhcnNlVW5hcnlFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXdhaXRFeHByZXNzaW9uKGFyZ3VtZW50KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVVuYXJ5RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgZXhwcjtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnKycpIHx8IHRoaXMubWF0Y2goJy0nKSB8fCB0aGlzLm1hdGNoKCd+JykgfHwgdGhpcy5tYXRjaCgnIScpIHx8XG5cdCAgICAgICAgICAgIHRoaXMubWF0Y2hLZXl3b3JkKCdkZWxldGUnKSB8fCB0aGlzLm1hdGNoS2V5d29yZCgndm9pZCcpIHx8IHRoaXMubWF0Y2hLZXl3b3JkKCd0eXBlb2YnKSkge1xuXHQgICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlVW5hcnlFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVW5hcnlFeHByZXNzaW9uKHRva2VuLnZhbHVlLCBleHByKSk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGV4cHIub3BlcmF0b3IgPT09ICdkZWxldGUnICYmIGV4cHIuYXJndW1lbnQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdERlbGV0ZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0aGlzLmNvbnRleHQuYXdhaXQgJiYgdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhd2FpdCcpKSB7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlQXdhaXRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZVVwZGF0ZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnRUb2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHZhciBleHByID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VVbmFyeUV4cHJlc3Npb24pO1xuXHQgICAgICAgIGlmIChleHByLnR5cGUgIT09IHN5bnRheF8xLlN5bnRheC5VbmFyeUV4cHJlc3Npb24gJiYgdGhpcy5tYXRjaCgnKionKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHZhciBsZWZ0ID0gZXhwcjtcblx0ICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuQmluYXJ5RXhwcmVzc2lvbignKionLCBsZWZ0LCByaWdodCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZXhwcjtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1leHAtb3BlcmF0b3Jcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW11bHRpcGxpY2F0aXZlLW9wZXJhdG9yc1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYWRkaXRpdmUtb3BlcmF0b3JzXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1iaXR3aXNlLXNoaWZ0LW9wZXJhdG9yc1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVsYXRpb25hbC1vcGVyYXRvcnNcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVxdWFsaXR5LW9wZXJhdG9yc1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYmluYXJ5LWJpdHdpc2Utb3BlcmF0b3JzXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1iaW5hcnktbG9naWNhbC1vcGVyYXRvcnNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuYmluYXJ5UHJlY2VkZW5jZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgIHZhciBvcCA9IHRva2VuLnZhbHVlO1xuXHQgICAgICAgIHZhciBwcmVjZWRlbmNlO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8pIHtcblx0ICAgICAgICAgICAgcHJlY2VkZW5jZSA9IHRoaXMub3BlcmF0b3JQcmVjZWRlbmNlW29wXSB8fCAwO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSA0IC8qIEtleXdvcmQgKi8pIHtcblx0ICAgICAgICAgICAgcHJlY2VkZW5jZSA9IChvcCA9PT0gJ2luc3RhbmNlb2YnIHx8ICh0aGlzLmNvbnRleHQuYWxsb3dJbiAmJiBvcCA9PT0gJ2luJykpID8gNyA6IDA7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBwcmVjZWRlbmNlID0gMDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHByZWNlZGVuY2U7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUJpbmFyeUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlRXhwb25lbnRpYXRpb25FeHByZXNzaW9uKTtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIgcHJlYyA9IHRoaXMuYmluYXJ5UHJlY2VkZW5jZSh0b2tlbik7XG5cdCAgICAgICAgaWYgKHByZWMgPiAwKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdmFyIG1hcmtlcnMgPSBbc3RhcnRUb2tlbiwgdGhpcy5sb29rYWhlYWRdO1xuXHQgICAgICAgICAgICB2YXIgbGVmdCA9IGV4cHI7XG5cdCAgICAgICAgICAgIHZhciByaWdodCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlRXhwb25lbnRpYXRpb25FeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgdmFyIHN0YWNrID0gW2xlZnQsIHRva2VuLnZhbHVlLCByaWdodF07XG5cdCAgICAgICAgICAgIHZhciBwcmVjZWRlbmNlcyA9IFtwcmVjXTtcblx0ICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgICAgIHByZWMgPSB0aGlzLmJpbmFyeVByZWNlZGVuY2UodGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHByZWMgPD0gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy8gUmVkdWNlOiBtYWtlIGEgYmluYXJ5IGV4cHJlc3Npb24gZnJvbSB0aGUgdGhyZWUgdG9wbW9zdCBlbnRyaWVzLlxuXHQgICAgICAgICAgICAgICAgd2hpbGUgKChzdGFjay5sZW5ndGggPiAyKSAmJiAocHJlYyA8PSBwcmVjZWRlbmNlc1twcmVjZWRlbmNlcy5sZW5ndGggLSAxXSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICByaWdodCA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBvcGVyYXRvciA9IHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHByZWNlZGVuY2VzLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICBtYXJrZXJzLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUobWFya2Vyc1ttYXJrZXJzLmxlbmd0aCAtIDFdKTtcblx0ICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQmluYXJ5RXhwcmVzc2lvbihvcGVyYXRvciwgbGVmdCwgcmlnaHQpKSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyBTaGlmdC5cblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGhpcy5uZXh0VG9rZW4oKS52YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICBwcmVjZWRlbmNlcy5wdXNoKHByZWMpO1xuXHQgICAgICAgICAgICAgICAgbWFya2Vycy5wdXNoKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgIHN0YWNrLnB1c2godGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24pKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyBGaW5hbCByZWR1Y2UgdG8gY2xlYW4tdXAgdGhlIHN0YWNrLlxuXHQgICAgICAgICAgICB2YXIgaSA9IHN0YWNrLmxlbmd0aCAtIDE7XG5cdCAgICAgICAgICAgIGV4cHIgPSBzdGFja1tpXTtcblx0ICAgICAgICAgICAgdmFyIGxhc3RNYXJrZXIgPSBtYXJrZXJzLnBvcCgpO1xuXHQgICAgICAgICAgICB3aGlsZSAoaSA+IDEpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBtYXJrZXJzLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgdmFyIGxhc3RMaW5lU3RhcnQgPSBsYXN0TWFya2VyICYmIGxhc3RNYXJrZXIubGluZVN0YXJ0O1xuXHQgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZShtYXJrZXIsIGxhc3RMaW5lU3RhcnQpO1xuXHQgICAgICAgICAgICAgICAgdmFyIG9wZXJhdG9yID0gc3RhY2tbaSAtIDFdO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQmluYXJ5RXhwcmVzc2lvbihvcGVyYXRvciwgc3RhY2tbaSAtIDJdLCBleHByKSk7XG5cdCAgICAgICAgICAgICAgICBpIC09IDI7XG5cdCAgICAgICAgICAgICAgICBsYXN0TWFya2VyID0gbWFya2VyO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNvbmRpdGlvbmFsLW9wZXJhdG9yXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQ29uZGl0aW9uYWxFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGFydFRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUJpbmFyeUV4cHJlc3Npb24pO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCc/JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dJbiA9IHRoaXMuY29udGV4dC5hbGxvd0luO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IHRydWU7XG5cdCAgICAgICAgICAgIHZhciBjb25zZXF1ZW50ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gcHJldmlvdXNBbGxvd0luO1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnOicpO1xuXHQgICAgICAgICAgICB2YXIgYWx0ZXJuYXRlID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5Db25kaXRpb25hbEV4cHJlc3Npb24oZXhwciwgY29uc2VxdWVudCwgYWx0ZXJuYXRlKSk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXNzaWdubWVudC1vcGVyYXRvcnNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuY2hlY2tQYXR0ZXJuUGFyYW0gPSBmdW5jdGlvbiAob3B0aW9ucywgcGFyYW0pIHtcblx0ICAgICAgICBzd2l0Y2ggKHBhcmFtLnR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcjpcblx0ICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVQYXJhbShvcHRpb25zLCBwYXJhbSwgcGFyYW0ubmFtZSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguUmVzdEVsZW1lbnQ6XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUGF0dGVyblBhcmFtKG9wdGlvbnMsIHBhcmFtLmFyZ3VtZW50KTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5Bc3NpZ25tZW50UGF0dGVybjpcblx0ICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tQYXR0ZXJuUGFyYW0ob3B0aW9ucywgcGFyYW0ubGVmdCk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguQXJyYXlQYXR0ZXJuOlxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbS5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5lbGVtZW50c1tpXSAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUGF0dGVyblBhcmFtKG9wdGlvbnMsIHBhcmFtLmVsZW1lbnRzW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguT2JqZWN0UGF0dGVybjpcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW0ucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tQYXR0ZXJuUGFyYW0ob3B0aW9ucywgcGFyYW0ucHJvcGVydGllc1tpXS52YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBvcHRpb25zLnNpbXBsZSA9IG9wdGlvbnMuc2ltcGxlICYmIChwYXJhbSBpbnN0YW5jZW9mIE5vZGUuSWRlbnRpZmllcik7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5yZWludGVycHJldEFzQ292ZXJGb3JtYWxzTGlzdCA9IGZ1bmN0aW9uIChleHByKSB7XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IFtleHByXTtcblx0ICAgICAgICB2YXIgb3B0aW9ucztcblx0ICAgICAgICB2YXIgYXN5bmNBcnJvdyA9IGZhbHNlO1xuXHQgICAgICAgIHN3aXRjaCAoZXhwci50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXI6XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyOlxuXHQgICAgICAgICAgICAgICAgcGFyYW1zID0gZXhwci5wYXJhbXM7XG5cdCAgICAgICAgICAgICAgICBhc3luY0Fycm93ID0gZXhwci5hc3luYztcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIG9wdGlvbnMgPSB7XG5cdCAgICAgICAgICAgIHNpbXBsZTogdHJ1ZSxcblx0ICAgICAgICAgICAgcGFyYW1TZXQ6IHt9XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7ICsraSkge1xuXHQgICAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbaV07XG5cdCAgICAgICAgICAgIGlmIChwYXJhbS50eXBlID09PSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudFBhdHRlcm4pIHtcblx0ICAgICAgICAgICAgICAgIGlmIChwYXJhbS5yaWdodC50eXBlID09PSBzeW50YXhfMS5TeW50YXguWWllbGRFeHByZXNzaW9uKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnJpZ2h0LmFyZ3VtZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBwYXJhbS5yaWdodC50eXBlID0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXI7XG5cdCAgICAgICAgICAgICAgICAgICAgcGFyYW0ucmlnaHQubmFtZSA9ICd5aWVsZCc7XG5cdCAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBhcmFtLnJpZ2h0LmFyZ3VtZW50O1xuXHQgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJhbS5yaWdodC5kZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChhc3luY0Fycm93ICYmIHBhcmFtLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyICYmIHBhcmFtLm5hbWUgPT09ICdhd2FpdCcpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuY2hlY2tQYXR0ZXJuUGFyYW0ob3B0aW9ucywgcGFyYW0pO1xuXHQgICAgICAgICAgICBwYXJhbXNbaV0gPSBwYXJhbTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgfHwgIXRoaXMuY29udGV4dC5hbGxvd1lpZWxkKSB7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgKytpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbaV07XG5cdCAgICAgICAgICAgICAgICBpZiAocGFyYW0udHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LllpZWxkRXhwcmVzc2lvbikge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChvcHRpb25zLm1lc3NhZ2UgPT09IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UGFyYW1EdXBlKSB7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMuY29udGV4dC5zdHJpY3QgPyBvcHRpb25zLnN0cmljdGVkIDogb3B0aW9ucy5maXJzdFJlc3RyaWN0ZWQ7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG9wdGlvbnMubWVzc2FnZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHNpbXBsZTogb3B0aW9ucy5zaW1wbGUsXG5cdCAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuXHQgICAgICAgICAgICBzdHJpY3RlZDogb3B0aW9ucy5zdHJpY3RlZCxcblx0ICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkOiBvcHRpb25zLmZpcnN0UmVzdHJpY3RlZCxcblx0ICAgICAgICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlXG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGV4cHI7XG5cdCAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCAmJiB0aGlzLm1hdGNoS2V5d29yZCgneWllbGQnKSkge1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZVlpZWxkRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gc3RhcnRUb2tlbjtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMucGFyc2VDb25kaXRpb25hbEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLyAmJiAodG9rZW4ubGluZU51bWJlciA9PT0gdGhpcy5sb29rYWhlYWQubGluZU51bWJlcikgJiYgdG9rZW4udmFsdWUgPT09ICdhc3luYycpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvb2thaGVhZC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gfHwgdGhpcy5tYXRjaEtleXdvcmQoJ3lpZWxkJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgYXJnID0gdGhpcy5wYXJzZVByaW1hcnlFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oYXJnKTtcblx0ICAgICAgICAgICAgICAgICAgICBleHByID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBcnJvd1BhcmFtZXRlclBsYWNlSG9sZGVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IFthcmddLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogdHJ1ZVxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGV4cHIudHlwZSA9PT0gQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlciB8fCB0aGlzLm1hdGNoKCc9PicpKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJvdy1mdW5jdGlvbi1kZWZpbml0aW9uc1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHZhciBpc0FzeW5jID0gZXhwci5hc3luYztcblx0ICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gdGhpcy5yZWludGVycHJldEFzQ292ZXJGb3JtYWxzTGlzdChleHByKTtcblx0ICAgICAgICAgICAgICAgIGlmIChsaXN0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzTGluZVRlcm1pbmF0b3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c1N0cmljdCA9IHRoaXMuY29udGV4dC5zdHJpY3Q7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dTdHJpY3REaXJlY3RpdmUgPSB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmU7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gbGlzdC5zaW1wbGU7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dZaWVsZCA9IHRoaXMuY29udGV4dC5hbGxvd1lpZWxkO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c0F3YWl0ID0gdGhpcy5jb250ZXh0LmF3YWl0O1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBpc0FzeW5jO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbik7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJz0+Jyk7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGJvZHkgPSB2b2lkIDA7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJ3snKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNBbGxvd0luID0gdGhpcy5jb250ZXh0LmFsbG93SW47XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IHRoaXMucGFyc2VGdW5jdGlvblNvdXJjZUVsZW1lbnRzKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gcHJldmlvdXNBbGxvd0luO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IGJvZHkudHlwZSAhPT0gc3ludGF4XzEuU3ludGF4LkJsb2NrU3RhdGVtZW50O1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGxpc3QuZmlyc3RSZXN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obGlzdC5maXJzdFJlc3RyaWN0ZWQsIGxpc3QubWVzc2FnZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGxpc3Quc3RyaWN0ZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbihsaXN0LnN0cmljdGVkLCBsaXN0Lm1lc3NhZ2UpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBleHByID0gaXNBc3luYyA/IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXN5bmNBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihsaXN0LnBhcmFtcywgYm9keSwgZXhwcmVzc2lvbikpIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihsaXN0LnBhcmFtcywgYm9keSwgZXhwcmVzc2lvbikpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJpY3QgPSBwcmV2aW91c1N0cmljdDtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmUgPSBwcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hd2FpdCA9IHByZXZpb3VzQXdhaXQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaEFzc2lnbigpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRMSFNJbkFzc2lnbm1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBleHByLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGV4cHI7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZChpZC5uYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RMSFNBc3NpZ25tZW50KTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZChpZC5uYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnPScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHIpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG9wZXJhdG9yID0gdG9rZW4udmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLkFzc2lnbm1lbnRFeHByZXNzaW9uKG9wZXJhdG9yLCBleHByLCByaWdodCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNvbW1hLW9wZXJhdG9yXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnRUb2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHZhciBleHByID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJywnKSkge1xuXHQgICAgICAgICAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTtcblx0ICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaChleHByKTtcblx0ICAgICAgICAgICAgd2hpbGUgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJywnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2godGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbikpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5TZXF1ZW5jZUV4cHJlc3Npb24oZXhwcmVzc2lvbnMpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYmxvY2tcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gdHJ1ZTtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gNCAvKiBLZXl3b3JkICovKSB7XG5cdCAgICAgICAgICAgIHN3aXRjaCAodGhpcy5sb29rYWhlYWQudmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2V4cG9ydCc6XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNNb2R1bGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCwgbWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsRXhwb3J0RGVjbGFyYXRpb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRXhwb3J0RGVjbGFyYXRpb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2ltcG9ydCc6XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNNb2R1bGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCwgbWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsSW1wb3J0RGVjbGFyYXRpb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlSW1wb3J0RGVjbGFyYXRpb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnN0Jzpcblx0ICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlTGV4aWNhbERlY2xhcmF0aW9uKHsgaW5Gb3I6IGZhbHNlIH0pO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdjbGFzcyc6XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUNsYXNzRGVjbGFyYXRpb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2xldCc6XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5pc0xleGljYWxEZWNsYXJhdGlvbigpID8gdGhpcy5wYXJzZUxleGljYWxEZWNsYXJhdGlvbih7IGluRm9yOiBmYWxzZSB9KSA6IHRoaXMucGFyc2VTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUJsb2NrID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ3snKTtcblx0ICAgICAgICB2YXIgYmxvY2sgPSBbXTtcblx0ICAgICAgICB3aGlsZSAodHJ1ZSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBibG9jay5wdXNoKHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ30nKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5CbG9ja1N0YXRlbWVudChibG9jaykpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxldC1hbmQtY29uc3QtZGVjbGFyYXRpb25zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlTGV4aWNhbEJpbmRpbmcgPSBmdW5jdGlvbiAoa2luZCwgb3B0aW9ucykge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IFtdO1xuXHQgICAgICAgIHZhciBpZCA9IHRoaXMucGFyc2VQYXR0ZXJuKHBhcmFtcywga2luZCk7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgaWQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKGlkLm5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RWYXJOYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgaWYgKGtpbmQgPT09ICdjb25zdCcpIHtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoS2V5d29yZCgnaW4nKSAmJiAhdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdvZicpKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnPScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICBpbml0ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5EZWNsYXJhdGlvbk1pc3NpbmdJbml0aWFsaXplciwgJ2NvbnN0Jyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAoKCFvcHRpb25zLmluRm9yICYmIGlkLnR5cGUgIT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyKSB8fCB0aGlzLm1hdGNoKCc9JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJz0nKTtcblx0ICAgICAgICAgICAgaW5pdCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5WYXJpYWJsZURlY2xhcmF0b3IoaWQsIGluaXQpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQmluZGluZ0xpc3QgPSBmdW5jdGlvbiAoa2luZCwgb3B0aW9ucykge1xuXHQgICAgICAgIHZhciBsaXN0ID0gW3RoaXMucGFyc2VMZXhpY2FsQmluZGluZyhraW5kLCBvcHRpb25zKV07XG5cdCAgICAgICAgd2hpbGUgKHRoaXMubWF0Y2goJywnKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBsaXN0LnB1c2godGhpcy5wYXJzZUxleGljYWxCaW5kaW5nKGtpbmQsIG9wdGlvbnMpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGxpc3Q7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5pc0xleGljYWxEZWNsYXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnNjYW5uZXIuc2F2ZVN0YXRlKCk7XG5cdCAgICAgICAgdGhpcy5zY2FubmVyLnNjYW5Db21tZW50cygpO1xuXHQgICAgICAgIHZhciBuZXh0ID0gdGhpcy5zY2FubmVyLmxleCgpO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5yZXN0b3JlU3RhdGUoc3RhdGUpO1xuXHQgICAgICAgIHJldHVybiAobmV4dC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pIHx8XG5cdCAgICAgICAgICAgIChuZXh0LnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiBuZXh0LnZhbHVlID09PSAnWycpIHx8XG5cdCAgICAgICAgICAgIChuZXh0LnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiBuZXh0LnZhbHVlID09PSAneycpIHx8XG5cdCAgICAgICAgICAgIChuZXh0LnR5cGUgPT09IDQgLyogS2V5d29yZCAqLyAmJiBuZXh0LnZhbHVlID09PSAnbGV0JykgfHxcblx0ICAgICAgICAgICAgKG5leHQudHlwZSA9PT0gNCAvKiBLZXl3b3JkICovICYmIG5leHQudmFsdWUgPT09ICd5aWVsZCcpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VMZXhpY2FsRGVjbGFyYXRpb24gPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGtpbmQgPSB0aGlzLm5leHRUb2tlbigpLnZhbHVlO1xuXHQgICAgICAgIGFzc2VydF8xLmFzc2VydChraW5kID09PSAnbGV0JyB8fCBraW5kID09PSAnY29uc3QnLCAnTGV4aWNhbCBkZWNsYXJhdGlvbiBtdXN0IGJlIGVpdGhlciBsZXQgb3IgY29uc3QnKTtcblx0ICAgICAgICB2YXIgZGVjbGFyYXRpb25zID0gdGhpcy5wYXJzZUJpbmRpbmdMaXN0KGtpbmQsIG9wdGlvbnMpO1xuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCBraW5kKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGVzdHJ1Y3R1cmluZy1iaW5kaW5nLXBhdHRlcm5zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQmluZGluZ1Jlc3RFbGVtZW50ID0gZnVuY3Rpb24gKHBhcmFtcywga2luZCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJy4uLicpO1xuXHQgICAgICAgIHZhciBhcmcgPSB0aGlzLnBhcnNlUGF0dGVybihwYXJhbXMsIGtpbmQpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlJlc3RFbGVtZW50KGFyZykpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VBcnJheVBhdHRlcm4gPSBmdW5jdGlvbiAocGFyYW1zLCBraW5kKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnWycpO1xuXHQgICAgICAgIHZhciBlbGVtZW50cyA9IFtdO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5tYXRjaCgnXScpKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKG51bGwpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJy4uLicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaCh0aGlzLnBhcnNlQmluZGluZ1Jlc3RFbGVtZW50KHBhcmFtcywga2luZCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaCh0aGlzLnBhcnNlUGF0dGVybldpdGhEZWZhdWx0KHBhcmFtcywga2luZCkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCddJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCddJyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXJyYXlQYXR0ZXJuKGVsZW1lbnRzKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVByb3BlcnR5UGF0dGVybiA9IGZ1bmN0aW9uIChwYXJhbXMsIGtpbmQpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBjb21wdXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBzaG9ydGhhbmQgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgbWV0aG9kID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIGtleTtcblx0ICAgICAgICB2YXIgdmFsdWU7XG5cdCAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLykge1xuXHQgICAgICAgICAgICB2YXIga2V5VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICB2YXIgaW5pdCA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWRlbnRpZmllcihrZXlUb2tlbi52YWx1ZSkpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnPScpKSB7XG5cdCAgICAgICAgICAgICAgICBwYXJhbXMucHVzaChrZXlUb2tlbik7XG5cdCAgICAgICAgICAgICAgICBzaG9ydGhhbmQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHZhciBleHByID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoa2V5VG9rZW4pLCBuZXcgTm9kZS5Bc3NpZ25tZW50UGF0dGVybihpbml0LCBleHByKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMubWF0Y2goJzonKSkge1xuXHQgICAgICAgICAgICAgICAgcGFyYW1zLnB1c2goa2V5VG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgc2hvcnRoYW5kID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gaW5pdDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCc6Jyk7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VQYXR0ZXJuV2l0aERlZmF1bHQocGFyYW1zLCBraW5kKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnOicpO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VQYXR0ZXJuV2l0aERlZmF1bHQocGFyYW1zLCBraW5kKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuUHJvcGVydHkoJ2luaXQnLCBrZXksIGNvbXB1dGVkLCB2YWx1ZSwgbWV0aG9kLCBzaG9ydGhhbmQpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlT2JqZWN0UGF0dGVybiA9IGZ1bmN0aW9uIChwYXJhbXMsIGtpbmQpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwcm9wZXJ0aWVzID0gW107XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ3snKTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2godGhpcy5wYXJzZVByb3BlcnR5UGF0dGVybihwYXJhbXMsIGtpbmQpKTtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcsJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ30nKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5PYmplY3RQYXR0ZXJuKHByb3BlcnRpZXMpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlUGF0dGVybiA9IGZ1bmN0aW9uIChwYXJhbXMsIGtpbmQpIHtcblx0ICAgICAgICB2YXIgcGF0dGVybjtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnWycpKSB7XG5cdCAgICAgICAgICAgIHBhdHRlcm4gPSB0aGlzLnBhcnNlQXJyYXlQYXR0ZXJuKHBhcmFtcywga2luZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJ3snKSkge1xuXHQgICAgICAgICAgICBwYXR0ZXJuID0gdGhpcy5wYXJzZU9iamVjdFBhdHRlcm4ocGFyYW1zLCBraW5kKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnbGV0JykgJiYgKGtpbmQgPT09ICdjb25zdCcgfHwga2luZCA9PT0gJ2xldCcpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkLCBtZXNzYWdlc18xLk1lc3NhZ2VzLkxldEluTGV4aWNhbEJpbmRpbmcpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHBhcmFtcy5wdXNoKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgcGF0dGVybiA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoa2luZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBwYXR0ZXJuO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VQYXR0ZXJuV2l0aERlZmF1bHQgPSBmdW5jdGlvbiAocGFyYW1zLCBraW5kKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIgcGF0dGVybiA9IHRoaXMucGFyc2VQYXR0ZXJuKHBhcmFtcywga2luZCk7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJz0nKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1lpZWxkID0gdGhpcy5jb250ZXh0LmFsbG93WWllbGQ7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgICAgICBwYXR0ZXJuID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuQXNzaWdubWVudFBhdHRlcm4ocGF0dGVybiwgcmlnaHQpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHBhdHRlcm47XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdmFyaWFibGUtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyID0gZnVuY3Rpb24gKGtpbmQpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDQgLyogS2V5d29yZCAqLyAmJiB0b2tlbi52YWx1ZSA9PT0gJ3lpZWxkJykge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSAhPT0gMyAvKiBJZGVudGlmaWVyICovKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHRva2VuLnR5cGUgPT09IDQgLyogS2V5d29yZCAqLyAmJiB0aGlzLnNjYW5uZXIuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgfHwgdG9rZW4udmFsdWUgIT09ICdsZXQnIHx8IGtpbmQgIT09ICd2YXInKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAoKHRoaXMuY29udGV4dC5pc01vZHVsZSB8fCB0aGlzLmNvbnRleHQuYXdhaXQpICYmIHRva2VuLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLyAmJiB0b2tlbi52YWx1ZSA9PT0gJ2F3YWl0Jykge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWRlbnRpZmllcih0b2tlbi52YWx1ZSkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSBbXTtcblx0ICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcnNlUGF0dGVybihwYXJhbXMsICd2YXInKTtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBpZC50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcikge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQoaWQubmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFZhck5hbWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBpbml0ID0gbnVsbDtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnPScpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGluaXQgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAoaWQudHlwZSAhPT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIgJiYgIW9wdGlvbnMuaW5Gb3IpIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJz0nKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdG9yKGlkLCBpbml0KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgb3B0ID0geyBpbkZvcjogb3B0aW9ucy5pbkZvciB9O1xuXHQgICAgICAgIHZhciBsaXN0ID0gW107XG5cdCAgICAgICAgbGlzdC5wdXNoKHRoaXMucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uKG9wdCkpO1xuXHQgICAgICAgIHdoaWxlICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgbGlzdC5wdXNoKHRoaXMucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uKG9wdCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gbGlzdDtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVmFyaWFibGVTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3ZhcicpO1xuXHQgICAgICAgIHZhciBkZWNsYXJhdGlvbnMgPSB0aGlzLnBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoeyBpbkZvcjogZmFsc2UgfSk7XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsICd2YXInKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZW1wdHktc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRW1wdHlTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnOycpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkVtcHR5U3RhdGVtZW50KCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWV4cHJlc3Npb24tc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBleHByID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5FeHByZXNzaW9uU3RhdGVtZW50KGV4cHIpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pZi1zdGF0ZW1lbnRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VJZkNsYXVzZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiB0aGlzLm1hdGNoS2V5d29yZCgnZnVuY3Rpb24nKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RGdW5jdGlvbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUlmU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGNvbnNlcXVlbnQ7XG5cdCAgICAgICAgdmFyIGFsdGVybmF0ZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdpZicpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgdmFyIHRlc3QgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpICYmIHRoaXMuY29uZmlnLnRvbGVyYW50KSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgIGNvbnNlcXVlbnQgPSB0aGlzLmZpbmFsaXplKHRoaXMuY3JlYXRlTm9kZSgpLCBuZXcgTm9kZS5FbXB0eVN0YXRlbWVudCgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgIGNvbnNlcXVlbnQgPSB0aGlzLnBhcnNlSWZDbGF1c2UoKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdlbHNlJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICBhbHRlcm5hdGUgPSB0aGlzLnBhcnNlSWZDbGF1c2UoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5JZlN0YXRlbWVudCh0ZXN0LCBjb25zZXF1ZW50LCBhbHRlcm5hdGUpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1kby13aGlsZS1zdGF0ZW1lbnRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VEb1doaWxlU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdkbycpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0luSXRlcmF0aW9uID0gdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiA9IHRydWU7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uID0gcHJldmlvdXNJbkl0ZXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3doaWxlJyk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICB2YXIgdGVzdCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykgJiYgdGhpcy5jb25maWcudG9sZXJhbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCc7JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRG9XaGlsZVN0YXRlbWVudChib2R5LCB0ZXN0KSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtd2hpbGUtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlV2hpbGVTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgYm9keTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3doaWxlJyk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICB2YXIgdGVzdCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykgJiYgdGhpcy5jb25maWcudG9sZXJhbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICAgICAgYm9keSA9IHRoaXMuZmluYWxpemUodGhpcy5jcmVhdGVOb2RlKCksIG5ldyBOb2RlLkVtcHR5U3RhdGVtZW50KCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJyknKTtcblx0ICAgICAgICAgICAgdmFyIHByZXZpb3VzSW5JdGVyYXRpb24gPSB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb247XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiA9IHRydWU7XG5cdCAgICAgICAgICAgIGJvZHkgPSB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiA9IHByZXZpb3VzSW5JdGVyYXRpb247XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLldoaWxlU3RhdGVtZW50KHRlc3QsIGJvZHkpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1mb3Itc3RhdGVtZW50XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1mb3ItaW4tYW5kLWZvci1vZi1zdGF0ZW1lbnRzXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRm9yU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBpbml0ID0gbnVsbDtcblx0ICAgICAgICB2YXIgdGVzdCA9IG51bGw7XG5cdCAgICAgICAgdmFyIHVwZGF0ZSA9IG51bGw7XG5cdCAgICAgICAgdmFyIGZvckluID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgbGVmdCwgcmlnaHQ7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2ZvcicpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJzsnKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCd2YXInKSkge1xuXHQgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c0FsbG93SW4gPSB0aGlzLmNvbnRleHQuYWxsb3dJbjtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB2YXIgZGVjbGFyYXRpb25zID0gdGhpcy5wYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KHsgaW5Gb3I6IHRydWUgfSk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IHByZXZpb3VzQWxsb3dJbjtcblx0ICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxICYmIHRoaXMubWF0Y2hLZXl3b3JkKCdpbicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGRlY2wgPSBkZWNsYXJhdGlvbnNbMF07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2wuaW5pdCAmJiAoZGVjbC5pZC50eXBlID09PSBzeW50YXhfMS5TeW50YXguQXJyYXlQYXR0ZXJuIHx8IGRlY2wuaWQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4Lk9iamVjdFBhdHRlcm4gfHwgdGhpcy5jb250ZXh0LnN0cmljdCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuRm9ySW5PZkxvb3BJbml0aWFsaXplciwgJ2Zvci1pbicpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpbml0ID0gdGhpcy5maW5hbGl6ZShpbml0LCBuZXcgTm9kZS5WYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9ucywgJ3ZhcicpKTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBpbml0O1xuXHQgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICBpbml0ID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDEgJiYgZGVjbGFyYXRpb25zWzBdLmluaXQgPT09IG51bGwgJiYgdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdvZicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUoaW5pdCwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsICd2YXInKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gaW5pdDtcblx0ICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIGluaXQgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgIGZvckluID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBpbml0ID0gdGhpcy5maW5hbGl6ZShpbml0LCBuZXcgTm9kZS5WYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9ucywgJ3ZhcicpKTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnOycpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdjb25zdCcpIHx8IHRoaXMubWF0Y2hLZXl3b3JkKCdsZXQnKSkge1xuXHQgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgICAgICAgICAgdmFyIGtpbmQgPSB0aGlzLm5leHRUb2tlbigpLnZhbHVlO1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHRoaXMubG9va2FoZWFkLnZhbHVlID09PSAnaW4nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUoaW5pdCwgbmV3IE5vZGUuSWRlbnRpZmllcihraW5kKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gaW5pdDtcblx0ICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNBbGxvd0luID0gdGhpcy5jb250ZXh0LmFsbG93SW47XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZGVjbGFyYXRpb25zID0gdGhpcy5wYXJzZUJpbmRpbmdMaXN0KGtpbmQsIHsgaW5Gb3I6IHRydWUgfSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSBwcmV2aW91c0FsbG93SW47XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDEgJiYgZGVjbGFyYXRpb25zWzBdLmluaXQgPT09IG51bGwgJiYgdGhpcy5tYXRjaEtleXdvcmQoJ2luJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUoaW5pdCwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsIGtpbmQpKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGluaXQ7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlY2xhcmF0aW9ucy5sZW5ndGggPT09IDEgJiYgZGVjbGFyYXRpb25zWzBdLmluaXQgPT09IG51bGwgJiYgdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdvZicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmZpbmFsaXplKGluaXQsIG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCBraW5kKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBpbml0O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9ySW4gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gdGhpcy5maW5hbGl6ZShpbml0LCBuZXcgTm9kZS5WYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9ucywga2luZCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHZhciBpbml0U3RhcnRUb2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dJbiA9IHRoaXMuY29udGV4dC5hbGxvd0luO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gcHJldmlvdXNBbGxvd0luO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdpbicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0IHx8IGluaXQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRFeHByZXNzaW9uKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRMSFNJbkZvckluKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihpbml0KTtcblx0ICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gaW5pdDtcblx0ICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ29mJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgfHwgaW5pdC50eXBlID09PSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudEV4cHJlc3Npb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZExIU0luRm9yTG9vcCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oaW5pdCk7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGluaXQ7XG5cdCAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICBpbml0ID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgICAgICBmb3JJbiA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJywnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5pdFNlcSA9IFtpbml0XTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMubWF0Y2goJywnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTZXEucHVzaCh0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoaW5pdFN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5TZXF1ZW5jZUV4cHJlc3Npb24oaW5pdFNlcSkpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnOycpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0eXBlb2YgbGVmdCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCc7JykpIHtcblx0ICAgICAgICAgICAgICAgIHRlc3QgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCc7Jyk7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgICAgICB1cGRhdGUgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBib2R5O1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpICYmIHRoaXMuY29uZmlnLnRvbGVyYW50KSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgIGJvZHkgPSB0aGlzLmZpbmFsaXplKHRoaXMuY3JlYXRlTm9kZSgpLCBuZXcgTm9kZS5FbXB0eVN0YXRlbWVudCgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgIHZhciBwcmV2aW91c0luSXRlcmF0aW9uID0gdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gPSB0cnVlO1xuXHQgICAgICAgICAgICBib2R5ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VTdGF0ZW1lbnQpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gPSBwcmV2aW91c0luSXRlcmF0aW9uO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gKHR5cGVvZiBsZWZ0ID09PSAndW5kZWZpbmVkJykgP1xuXHQgICAgICAgICAgICB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkZvclN0YXRlbWVudChpbml0LCB0ZXN0LCB1cGRhdGUsIGJvZHkpKSA6XG5cdCAgICAgICAgICAgIGZvckluID8gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5Gb3JJblN0YXRlbWVudChsZWZ0LCByaWdodCwgYm9keSkpIDpcblx0ICAgICAgICAgICAgICAgIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRm9yT2ZTdGF0ZW1lbnQobGVmdCwgcmlnaHQsIGJvZHkpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jb250aW51ZS1zdGF0ZW1lbnRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VDb250aW51ZVN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnY29udGludWUnKTtcblx0ICAgICAgICB2YXIgbGFiZWwgPSBudWxsO1xuXHQgICAgICAgIGlmICh0aGlzLmxvb2thaGVhZC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgIXRoaXMuaGFzTGluZVRlcm1pbmF0b3IpIHtcblx0ICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICBsYWJlbCA9IGlkO1xuXHQgICAgICAgICAgICB2YXIga2V5ID0gJyQnICsgaWQubmFtZTtcblx0ICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb250ZXh0LmxhYmVsU2V0LCBrZXkpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5Vbmtub3duTGFiZWwsIGlkLm5hbWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIGlmIChsYWJlbCA9PT0gbnVsbCAmJiAhdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLklsbGVnYWxDb250aW51ZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkNvbnRpbnVlU3RhdGVtZW50KGxhYmVsKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYnJlYWstc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQnJlYWtTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2JyZWFrJyk7XG5cdCAgICAgICAgdmFyIGxhYmVsID0gbnVsbDtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovICYmICF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yKSB7XG5cdCAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgdmFyIGtleSA9ICckJyArIGlkLm5hbWU7XG5cdCAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29udGV4dC5sYWJlbFNldCwga2V5KSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5rbm93bkxhYmVsLCBpZC5uYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBsYWJlbCA9IGlkO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICBpZiAobGFiZWwgPT09IG51bGwgJiYgIXRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiAmJiAhdGhpcy5jb250ZXh0LmluU3dpdGNoKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLklsbGVnYWxCcmVhayk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkJyZWFrU3RhdGVtZW50KGxhYmVsKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmV0dXJuLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVJldHVyblN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keSkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsUmV0dXJuKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3JldHVybicpO1xuXHQgICAgICAgIHZhciBoYXNBcmd1bWVudCA9ICghdGhpcy5tYXRjaCgnOycpICYmICF0aGlzLm1hdGNoKCd9JykgJiZcblx0ICAgICAgICAgICAgIXRoaXMuaGFzTGluZVRlcm1pbmF0b3IgJiYgdGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMiAvKiBFT0YgKi8pIHx8XG5cdCAgICAgICAgICAgIHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDggLyogU3RyaW5nTGl0ZXJhbCAqLyB8fFxuXHQgICAgICAgICAgICB0aGlzLmxvb2thaGVhZC50eXBlID09PSAxMCAvKiBUZW1wbGF0ZSAqLztcblx0ICAgICAgICB2YXIgYXJndW1lbnQgPSBoYXNBcmd1bWVudCA/IHRoaXMucGFyc2VFeHByZXNzaW9uKCkgOiBudWxsO1xuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlJldHVyblN0YXRlbWVudChhcmd1bWVudCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXdpdGgtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlV2l0aFN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RNb2RlV2l0aCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGJvZHk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCd3aXRoJyk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2goJyknKSAmJiB0aGlzLmNvbmZpZy50b2xlcmFudCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgICAgICBib2R5ID0gdGhpcy5maW5hbGl6ZSh0aGlzLmNyZWF0ZU5vZGUoKSwgbmV3IE5vZGUuRW1wdHlTdGF0ZW1lbnQoKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgICAgICBib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5XaXRoU3RhdGVtZW50KG9iamVjdCwgYm9keSkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN3aXRjaC1zdGF0ZW1lbnRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTd2l0Y2hDYXNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIHRlc3Q7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdkZWZhdWx0JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgdGVzdCA9IG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2Nhc2UnKTtcblx0ICAgICAgICAgICAgdGVzdCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCc6Jyk7XG5cdCAgICAgICAgdmFyIGNvbnNlcXVlbnQgPSBbXTtcblx0ICAgICAgICB3aGlsZSAodHJ1ZSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnfScpIHx8IHRoaXMubWF0Y2hLZXl3b3JkKCdkZWZhdWx0JykgfHwgdGhpcy5tYXRjaEtleXdvcmQoJ2Nhc2UnKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY29uc2VxdWVudC5wdXNoKHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuU3dpdGNoQ2FzZSh0ZXN0LCBjb25zZXF1ZW50KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVN3aXRjaFN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnc3dpdGNoJyk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICB2YXIgZGlzY3JpbWluYW50ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0luU3dpdGNoID0gdGhpcy5jb250ZXh0LmluU3dpdGNoO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pblN3aXRjaCA9IHRydWU7XG5cdCAgICAgICAgdmFyIGNhc2VzID0gW107XG5cdCAgICAgICAgdmFyIGRlZmF1bHRGb3VuZCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG5cdCAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdmFyIGNsYXVzZSA9IHRoaXMucGFyc2VTd2l0Y2hDYXNlKCk7XG5cdCAgICAgICAgICAgIGlmIChjbGF1c2UudGVzdCA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRGb3VuZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLk11bHRpcGxlRGVmYXVsdHNJblN3aXRjaCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBkZWZhdWx0Rm91bmQgPSB0cnVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNhc2VzLnB1c2goY2xhdXNlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ30nKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaW5Td2l0Y2ggPSBwcmV2aW91c0luU3dpdGNoO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlN3aXRjaFN0YXRlbWVudChkaXNjcmltaW5hbnQsIGNhc2VzKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbGFiZWxsZWQtc3RhdGVtZW50c1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUxhYmVsbGVkU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGV4cHIgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIHZhciBzdGF0ZW1lbnQ7XG5cdCAgICAgICAgaWYgKChleHByLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyKSAmJiB0aGlzLm1hdGNoKCc6JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgdmFyIGlkID0gZXhwcjtcblx0ICAgICAgICAgICAgdmFyIGtleSA9ICckJyArIGlkLm5hbWU7XG5cdCAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb250ZXh0LmxhYmVsU2V0LCBrZXkpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5SZWRlY2xhcmF0aW9uLCAnTGFiZWwnLCBpZC5uYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQubGFiZWxTZXRba2V5XSA9IHRydWU7XG5cdCAgICAgICAgICAgIHZhciBib2R5ID0gdm9pZCAwO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ2NsYXNzJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgYm9keSA9IHRoaXMucGFyc2VDbGFzc0RlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ2Z1bmN0aW9uJykpIHtcblx0ICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24oKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RGdW5jdGlvbik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWNsYXJhdGlvbi5nZW5lcmF0b3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLCBtZXNzYWdlc18xLk1lc3NhZ2VzLkdlbmVyYXRvckluTGVnYWN5Q29udGV4dCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBib2R5ID0gZGVjbGFyYXRpb247XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbnRleHQubGFiZWxTZXRba2V5XTtcblx0ICAgICAgICAgICAgc3RhdGVtZW50ID0gbmV3IE5vZGUuTGFiZWxlZFN0YXRlbWVudChpZCwgYm9keSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICAgICAgc3RhdGVtZW50ID0gbmV3IE5vZGUuRXhwcmVzc2lvblN0YXRlbWVudChleHByKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgc3RhdGVtZW50KTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10aHJvdy1zdGF0ZW1lbnRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VUaHJvd1N0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgndGhyb3cnKTtcblx0ICAgICAgICBpZiAodGhpcy5oYXNMaW5lVGVybWluYXRvcikge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5OZXdsaW5lQWZ0ZXJUaHJvdyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBhcmd1bWVudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVGhyb3dTdGF0ZW1lbnQoYXJndW1lbnQpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10cnktc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQ2F0Y2hDbGF1c2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2NhdGNoJyk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcGFyYW1zID0gW107XG5cdCAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJzZVBhdHRlcm4ocGFyYW1zKTtcblx0ICAgICAgICB2YXIgcGFyYW1NYXAgPSB7fTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICB2YXIga2V5ID0gJyQnICsgcGFyYW1zW2ldLnZhbHVlO1xuXHQgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmFtTWFwLCBrZXkpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5EdXBsaWNhdGVCaW5kaW5nLCBwYXJhbXNbaV0udmFsdWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHBhcmFtTWFwW2tleV0gPSB0cnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBwYXJhbS50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcikge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQocGFyYW0ubmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdENhdGNoVmFyaWFibGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlQmxvY2soKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5DYXRjaENsYXVzZShwYXJhbSwgYm9keSkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VGaW5hbGx5Q2xhdXNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnZmluYWxseScpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLnBhcnNlQmxvY2soKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVHJ5U3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCd0cnknKTtcblx0ICAgICAgICB2YXIgYmxvY2sgPSB0aGlzLnBhcnNlQmxvY2soKTtcblx0ICAgICAgICB2YXIgaGFuZGxlciA9IHRoaXMubWF0Y2hLZXl3b3JkKCdjYXRjaCcpID8gdGhpcy5wYXJzZUNhdGNoQ2xhdXNlKCkgOiBudWxsO1xuXHQgICAgICAgIHZhciBmaW5hbGl6ZXIgPSB0aGlzLm1hdGNoS2V5d29yZCgnZmluYWxseScpID8gdGhpcy5wYXJzZUZpbmFsbHlDbGF1c2UoKSA6IG51bGw7XG5cdCAgICAgICAgaWYgKCFoYW5kbGVyICYmICFmaW5hbGl6ZXIpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuTm9DYXRjaE9yRmluYWxseSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlRyeVN0YXRlbWVudChibG9jaywgaGFuZGxlciwgZmluYWxpemVyKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGVidWdnZXItc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRGVidWdnZXJTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2RlYnVnZ2VyJyk7XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRGVidWdnZXJTdGF0ZW1lbnQoKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS1zdGF0ZW1lbnRzLWFuZC1kZWNsYXJhdGlvbnNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXRlbWVudDtcblx0ICAgICAgICBzd2l0Y2ggKHRoaXMubG9va2FoZWFkLnR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSAxIC8qIEJvb2xlYW5MaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDUgLyogTnVsbExpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgNiAvKiBOdW1lcmljTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA4IC8qIFN0cmluZ0xpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgMTAgLyogVGVtcGxhdGUgKi86XG5cdCAgICAgICAgICAgIGNhc2UgOSAvKiBSZWd1bGFyRXhwcmVzc2lvbiAqLzpcblx0ICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSA3IC8qIFB1bmN0dWF0b3IgKi86XG5cdCAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmxvb2thaGVhZC52YWx1ZTtcblx0ICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUJsb2NrKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gJygnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSAnOycpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRW1wdHlTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAzIC8qIElkZW50aWZpZXIgKi86XG5cdCAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLm1hdGNoQXN5bmNGdW5jdGlvbigpID8gdGhpcy5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24oKSA6IHRoaXMucGFyc2VMYWJlbGxlZFN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgNCAvKiBLZXl3b3JkICovOlxuXHQgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmxvb2thaGVhZC52YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JyZWFrJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUJyZWFrU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnRpbnVlJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUNvbnRpbnVlU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlYnVnZ2VyJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZURlYnVnZ2VyU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RvJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZURvV2hpbGVTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnZm9yJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUZvclN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2lmJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUlmU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JldHVybic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VSZXR1cm5TdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3dpdGNoJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZVN3aXRjaFN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICd0aHJvdyc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VUaHJvd1N0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICd0cnknOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlVHJ5U3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Zhcic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VWYXJpYWJsZVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICd3aGlsZSc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VXaGlsZVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICd3aXRoJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZVdpdGhTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gc3RhdGVtZW50O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZ1bmN0aW9uLWRlZmluaXRpb25zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRnVuY3Rpb25Tb3VyY2VFbGVtZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlRGlyZWN0aXZlUHJvbG9ndWVzKCk7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzTGFiZWxTZXQgPSB0aGlzLmNvbnRleHQubGFiZWxTZXQ7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzSW5JdGVyYXRpb24gPSB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb247XG5cdCAgICAgICAgdmFyIHByZXZpb3VzSW5Td2l0Y2ggPSB0aGlzLmNvbnRleHQuaW5Td2l0Y2g7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzSW5GdW5jdGlvbkJvZHkgPSB0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmxhYmVsU2V0ID0ge307XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluU3dpdGNoID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluRnVuY3Rpb25Cb2R5ID0gdHJ1ZTtcblx0ICAgICAgICB3aGlsZSAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMiAvKiBFT0YgKi8pIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgYm9keS5wdXNoKHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ30nKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQubGFiZWxTZXQgPSBwcmV2aW91c0xhYmVsU2V0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiA9IHByZXZpb3VzSW5JdGVyYXRpb247XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluU3dpdGNoID0gcHJldmlvdXNJblN3aXRjaDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkgPSBwcmV2aW91c0luRnVuY3Rpb25Cb2R5O1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkJsb2NrU3RhdGVtZW50KGJvZHkpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnZhbGlkYXRlUGFyYW0gPSBmdW5jdGlvbiAob3B0aW9ucywgcGFyYW0sIG5hbWUpIHtcblx0ICAgICAgICB2YXIga2V5ID0gJyQnICsgbmFtZTtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQobmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RyaWN0ZWQgPSBwYXJhbTtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMubWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UGFyYW1OYW1lO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucy5wYXJhbVNldCwga2V5KSkge1xuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5zdHJpY3RlZCA9IHBhcmFtO1xuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5tZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RQYXJhbUR1cGU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAoIW9wdGlvbnMuZmlyc3RSZXN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZChuYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5maXJzdFJlc3RyaWN0ZWQgPSBwYXJhbTtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMubWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UGFyYW1OYW1lO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc2Nhbm5lci5pc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQobmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlyc3RSZXN0cmljdGVkID0gcGFyYW07XG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLm1lc3NhZ2UgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFJlc2VydmVkV29yZDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucy5wYXJhbVNldCwga2V5KSkge1xuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5zdHJpY3RlZCA9IHBhcmFtO1xuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5tZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RQYXJhbUR1cGU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0ICAgICAgICBpZiAodHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0aW9ucy5wYXJhbVNldCwga2V5LCB7IHZhbHVlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgb3B0aW9ucy5wYXJhbVNldFtrZXldID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVJlc3RFbGVtZW50ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJy4uLicpO1xuXHQgICAgICAgIHZhciBhcmcgPSB0aGlzLnBhcnNlUGF0dGVybihwYXJhbXMpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCc9JykpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuRGVmYXVsdFJlc3RQYXJhbWV0ZXIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5QYXJhbWV0ZXJBZnRlclJlc3RQYXJhbWV0ZXIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5SZXN0RWxlbWVudChhcmcpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRm9ybWFsUGFyYW1ldGVyID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgcGFyYW1zID0gW107XG5cdCAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5tYXRjaCgnLi4uJykgPyB0aGlzLnBhcnNlUmVzdEVsZW1lbnQocGFyYW1zKSA6IHRoaXMucGFyc2VQYXR0ZXJuV2l0aERlZmF1bHQocGFyYW1zKTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGFyYW0ob3B0aW9ucywgcGFyYW1zW2ldLCBwYXJhbXNbaV0udmFsdWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBvcHRpb25zLnNpbXBsZSA9IG9wdGlvbnMuc2ltcGxlICYmIChwYXJhbSBpbnN0YW5jZW9mIE5vZGUuSWRlbnRpZmllcik7XG5cdCAgICAgICAgb3B0aW9ucy5wYXJhbXMucHVzaChwYXJhbSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZvcm1hbFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoZmlyc3RSZXN0cmljdGVkKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnM7XG5cdCAgICAgICAgb3B0aW9ucyA9IHtcblx0ICAgICAgICAgICAgc2ltcGxlOiB0cnVlLFxuXHQgICAgICAgICAgICBwYXJhbXM6IFtdLFxuXHQgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQ6IGZpcnN0UmVzdHJpY3RlZFxuXHQgICAgICAgIH07XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICBvcHRpb25zLnBhcmFtU2V0ID0ge307XG5cdCAgICAgICAgICAgIHdoaWxlICh0aGlzLmxvb2thaGVhZC50eXBlICE9PSAyIC8qIEVPRiAqLykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUZvcm1hbFBhcmFtZXRlcihvcHRpb25zKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcsJyk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJyknKTtcblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICBzaW1wbGU6IG9wdGlvbnMuc2ltcGxlLFxuXHQgICAgICAgICAgICBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLFxuXHQgICAgICAgICAgICBzdHJpY3RlZDogb3B0aW9ucy5zdHJpY3RlZCxcblx0ICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkOiBvcHRpb25zLmZpcnN0UmVzdHJpY3RlZCxcblx0ICAgICAgICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlXG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLm1hdGNoQXN5bmNGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbWF0Y2ggPSB0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzeW5jJyk7XG5cdCAgICAgICAgaWYgKG1hdGNoKSB7XG5cdCAgICAgICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuc2Nhbm5lci5zYXZlU3RhdGUoKTtcblx0ICAgICAgICAgICAgdGhpcy5zY2FubmVyLnNjYW5Db21tZW50cygpO1xuXHQgICAgICAgICAgICB2YXIgbmV4dCA9IHRoaXMuc2Nhbm5lci5sZXgoKTtcblx0ICAgICAgICAgICAgdGhpcy5zY2FubmVyLnJlc3RvcmVTdGF0ZShzdGF0ZSk7XG5cdCAgICAgICAgICAgIG1hdGNoID0gKHN0YXRlLmxpbmVOdW1iZXIgPT09IG5leHQubGluZU51bWJlcikgJiYgKG5leHQudHlwZSA9PT0gNCAvKiBLZXl3b3JkICovKSAmJiAobmV4dC52YWx1ZSA9PT0gJ2Z1bmN0aW9uJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBtYXRjaDtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbiA9IGZ1bmN0aW9uIChpZGVudGlmaWVySXNPcHRpb25hbCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGlzQXN5bmMgPSB0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzeW5jJyk7XG5cdCAgICAgICAgaWYgKGlzQXN5bmMpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdmdW5jdGlvbicpO1xuXHQgICAgICAgIHZhciBpc0dlbmVyYXRvciA9IGlzQXN5bmMgPyBmYWxzZSA6IHRoaXMubWF0Y2goJyonKTtcblx0ICAgICAgICBpZiAoaXNHZW5lcmF0b3IpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG1lc3NhZ2U7XG5cdCAgICAgICAgdmFyIGlkID0gbnVsbDtcblx0ICAgICAgICB2YXIgZmlyc3RSZXN0cmljdGVkID0gbnVsbDtcblx0ICAgICAgICBpZiAoIWlkZW50aWZpZXJJc09wdGlvbmFsIHx8ICF0aGlzLm1hdGNoKCcoJykpIHtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIGlkID0gdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0RnVuY3Rpb25OYW1lKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSB0b2tlbjtcblx0ICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RGdW5jdGlvbk5hbWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNjYW5uZXIuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGZpcnN0UmVzdHJpY3RlZCA9IHRva2VuO1xuXHQgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFJlc2VydmVkV29yZDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd0F3YWl0ID0gdGhpcy5jb250ZXh0LmF3YWl0O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBpc0FzeW5jO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gIWlzR2VuZXJhdG9yO1xuXHQgICAgICAgIHZhciBmb3JtYWxQYXJhbWV0ZXJzID0gdGhpcy5wYXJzZUZvcm1hbFBhcmFtZXRlcnMoZmlyc3RSZXN0cmljdGVkKTtcblx0ICAgICAgICB2YXIgcGFyYW1zID0gZm9ybWFsUGFyYW1ldGVycy5wYXJhbXM7XG5cdCAgICAgICAgdmFyIHN0cmljdGVkID0gZm9ybWFsUGFyYW1ldGVycy5zdHJpY3RlZDtcblx0ICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSBmb3JtYWxQYXJhbWV0ZXJzLmZpcnN0UmVzdHJpY3RlZDtcblx0ICAgICAgICBpZiAoZm9ybWFsUGFyYW1ldGVycy5tZXNzYWdlKSB7XG5cdCAgICAgICAgICAgIG1lc3NhZ2UgPSBmb3JtYWxQYXJhbWV0ZXJzLm1lc3NhZ2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBwcmV2aW91c1N0cmljdCA9IHRoaXMuY29udGV4dC5zdHJpY3Q7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dTdHJpY3REaXJlY3RpdmUgPSB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmU7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gZm9ybWFsUGFyYW1ldGVycy5zaW1wbGU7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlRnVuY3Rpb25Tb3VyY2VFbGVtZW50cygpO1xuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGZpcnN0UmVzdHJpY3RlZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKGZpcnN0UmVzdHJpY3RlZCwgbWVzc2FnZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4oc3RyaWN0ZWQsIG1lc3NhZ2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gcHJldmlvdXNTdHJpY3Q7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBwcmV2aW91c0FsbG93QXdhaXQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBwcmV2aW91c0FsbG93WWllbGQ7XG5cdCAgICAgICAgcmV0dXJuIGlzQXN5bmMgPyB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvbihpZCwgcGFyYW1zLCBib2R5KSkgOlxuXHQgICAgICAgICAgICB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkZ1bmN0aW9uRGVjbGFyYXRpb24oaWQsIHBhcmFtcywgYm9keSwgaXNHZW5lcmF0b3IpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRnVuY3Rpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGlzQXN5bmMgPSB0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzeW5jJyk7XG5cdCAgICAgICAgaWYgKGlzQXN5bmMpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdmdW5jdGlvbicpO1xuXHQgICAgICAgIHZhciBpc0dlbmVyYXRvciA9IGlzQXN5bmMgPyBmYWxzZSA6IHRoaXMubWF0Y2goJyonKTtcblx0ICAgICAgICBpZiAoaXNHZW5lcmF0b3IpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG1lc3NhZ2U7XG5cdCAgICAgICAgdmFyIGlkID0gbnVsbDtcblx0ICAgICAgICB2YXIgZmlyc3RSZXN0cmljdGVkO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93QXdhaXQgPSB0aGlzLmNvbnRleHQuYXdhaXQ7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dZaWVsZCA9IHRoaXMuY29udGV4dC5hbGxvd1lpZWxkO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hd2FpdCA9IGlzQXN5bmM7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSAhaXNHZW5lcmF0b3I7XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcoJykpIHtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIGlkID0gKCF0aGlzLmNvbnRleHQuc3RyaWN0ICYmICFpc0dlbmVyYXRvciAmJiB0aGlzLm1hdGNoS2V5d29yZCgneWllbGQnKSkgPyB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKSA6IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLCBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdEZ1bmN0aW9uTmFtZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQodG9rZW4udmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkID0gdG9rZW47XG5cdCAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0RnVuY3Rpb25OYW1lO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSB0b2tlbjtcblx0ICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGZvcm1hbFBhcmFtZXRlcnMgPSB0aGlzLnBhcnNlRm9ybWFsUGFyYW1ldGVycyhmaXJzdFJlc3RyaWN0ZWQpO1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSBmb3JtYWxQYXJhbWV0ZXJzLnBhcmFtcztcblx0ICAgICAgICB2YXIgc3RyaWN0ZWQgPSBmb3JtYWxQYXJhbWV0ZXJzLnN0cmljdGVkO1xuXHQgICAgICAgIGZpcnN0UmVzdHJpY3RlZCA9IGZvcm1hbFBhcmFtZXRlcnMuZmlyc3RSZXN0cmljdGVkO1xuXHQgICAgICAgIGlmIChmb3JtYWxQYXJhbWV0ZXJzLm1lc3NhZ2UpIHtcblx0ICAgICAgICAgICAgbWVzc2FnZSA9IGZvcm1hbFBhcmFtZXRlcnMubWVzc2FnZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHByZXZpb3VzU3RyaWN0ID0gdGhpcy5jb250ZXh0LnN0cmljdDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZSA9IHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmUgPSBmb3JtYWxQYXJhbWV0ZXJzLnNpbXBsZTtcblx0ICAgICAgICB2YXIgYm9keSA9IHRoaXMucGFyc2VGdW5jdGlvblNvdXJjZUVsZW1lbnRzKCk7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgZmlyc3RSZXN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oZmlyc3RSZXN0cmljdGVkLCBtZXNzYWdlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgc3RyaWN0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbihzdHJpY3RlZCwgbWVzc2FnZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY29udGV4dC5zdHJpY3QgPSBwcmV2aW91c1N0cmljdDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmUgPSBwcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hd2FpdCA9IHByZXZpb3VzQWxsb3dBd2FpdDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICByZXR1cm4gaXNBc3luYyA/IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXN5bmNGdW5jdGlvbkV4cHJlc3Npb24oaWQsIHBhcmFtcywgYm9keSkpIDpcblx0ICAgICAgICAgICAgdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5GdW5jdGlvbkV4cHJlc3Npb24oaWQsIHBhcmFtcywgYm9keSwgaXNHZW5lcmF0b3IpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1kaXJlY3RpdmUtcHJvbG9ndWVzLWFuZC10aGUtdXNlLXN0cmljdC1kaXJlY3RpdmVcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VEaXJlY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IChleHByLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5MaXRlcmFsKSA/IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pLnNsaWNlKDEsIC0xKSA6IG51bGw7XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgZGlyZWN0aXZlID8gbmV3IE5vZGUuRGlyZWN0aXZlKGV4cHIsIGRpcmVjdGl2ZSkgOiBuZXcgTm9kZS5FeHByZXNzaW9uU3RhdGVtZW50KGV4cHIpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRGlyZWN0aXZlUHJvbG9ndWVzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBmaXJzdFJlc3RyaWN0ZWQgPSBudWxsO1xuXHQgICAgICAgIHZhciBib2R5ID0gW107XG5cdCAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIGlmICh0b2tlbi50eXBlICE9PSA4IC8qIFN0cmluZ0xpdGVyYWwgKi8pIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRGlyZWN0aXZlKCk7XG5cdCAgICAgICAgICAgIGJvZHkucHVzaChzdGF0ZW1lbnQpO1xuXHQgICAgICAgICAgICB2YXIgZGlyZWN0aXZlID0gc3RhdGVtZW50LmRpcmVjdGl2ZTtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBkaXJlY3RpdmUgIT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoZGlyZWN0aXZlID09PSAndXNlIHN0cmljdCcpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJpY3QgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgaWYgKGZpcnN0UmVzdHJpY3RlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4oZmlyc3RSZXN0cmljdGVkLCBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdE9jdGFsTGl0ZXJhbCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbExhbmd1YWdlTW9kZURpcmVjdGl2ZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoIWZpcnN0UmVzdHJpY3RlZCAmJiB0b2tlbi5vY3RhbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGZpcnN0UmVzdHJpY3RlZCA9IHRva2VuO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBib2R5O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1ldGhvZC1kZWZpbml0aW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5xdWFsaWZpZWRQcm9wZXJ0eU5hbWUgPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSAzIC8qIElkZW50aWZpZXIgKi86XG5cdCAgICAgICAgICAgIGNhc2UgOCAvKiBTdHJpbmdMaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDEgLyogQm9vbGVhbkxpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgNSAvKiBOdWxsTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA2IC8qIE51bWVyaWNMaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDQgLyogS2V5d29yZCAqLzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgICBjYXNlIDcgLyogUHVuY3R1YXRvciAqLzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbi52YWx1ZSA9PT0gJ1snO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlR2V0dGVyTWV0aG9kID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGlzR2VuZXJhdG9yID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dZaWVsZCA9IHRoaXMuY29udGV4dC5hbGxvd1lpZWxkO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gIWlzR2VuZXJhdG9yO1xuXHQgICAgICAgIHZhciBmb3JtYWxQYXJhbWV0ZXJzID0gdGhpcy5wYXJzZUZvcm1hbFBhcmFtZXRlcnMoKTtcblx0ICAgICAgICBpZiAoZm9ybWFsUGFyYW1ldGVycy5wYXJhbXMubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5CYWRHZXR0ZXJBcml0eSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBtZXRob2QgPSB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2QoZm9ybWFsUGFyYW1ldGVycyk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBwcmV2aW91c0FsbG93WWllbGQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRnVuY3Rpb25FeHByZXNzaW9uKG51bGwsIGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zLCBtZXRob2QsIGlzR2VuZXJhdG9yKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVNldHRlck1ldGhvZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpc0dlbmVyYXRvciA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9ICFpc0dlbmVyYXRvcjtcblx0ICAgICAgICB2YXIgZm9ybWFsUGFyYW1ldGVycyA9IHRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKCk7XG5cdCAgICAgICAgaWYgKGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zLmxlbmd0aCAhPT0gMSkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5CYWRTZXR0ZXJBcml0eSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zWzBdIGluc3RhbmNlb2YgTm9kZS5SZXN0RWxlbWVudCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5CYWRTZXR0ZXJSZXN0UGFyYW1ldGVyKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IHRoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZChmb3JtYWxQYXJhbWV0ZXJzKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5GdW5jdGlvbkV4cHJlc3Npb24obnVsbCwgZm9ybWFsUGFyYW1ldGVycy5wYXJhbXMsIG1ldGhvZCwgaXNHZW5lcmF0b3IpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlR2VuZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGlzR2VuZXJhdG9yID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1lpZWxkID0gdGhpcy5jb250ZXh0LmFsbG93WWllbGQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSB0cnVlO1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSB0aGlzLnBhcnNlRm9ybWFsUGFyYW1ldGVycygpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IHRoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZChwYXJhbXMpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkZ1bmN0aW9uRXhwcmVzc2lvbihudWxsLCBwYXJhbXMucGFyYW1zLCBtZXRob2QsIGlzR2VuZXJhdG9yKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2VuZXJhdG9yLWZ1bmN0aW9uLWRlZmluaXRpb25zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmlzU3RhcnRPZkV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmxvb2thaGVhZC52YWx1ZTtcblx0ICAgICAgICBzd2l0Y2ggKHRoaXMubG9va2FoZWFkLnR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSA3IC8qIFB1bmN0dWF0b3IgKi86XG5cdCAgICAgICAgICAgICAgICBzdGFydCA9ICh2YWx1ZSA9PT0gJ1snKSB8fCAodmFsdWUgPT09ICcoJykgfHwgKHZhbHVlID09PSAneycpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKHZhbHVlID09PSAnKycpIHx8ICh2YWx1ZSA9PT0gJy0nKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PT0gJyEnKSB8fCAodmFsdWUgPT09ICd+JykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT09ICcrKycpIHx8ICh2YWx1ZSA9PT0gJy0tJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT09ICcvJykgfHwgKHZhbHVlID09PSAnLz0nKTsgLy8gcmVndWxhciBleHByZXNzaW9uIGxpdGVyYWxcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDQgLyogS2V5d29yZCAqLzpcblx0ICAgICAgICAgICAgICAgIHN0YXJ0ID0gKHZhbHVlID09PSAnY2xhc3MnKSB8fCAodmFsdWUgPT09ICdkZWxldGUnKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykgfHwgKHZhbHVlID09PSAnbGV0JykgfHwgKHZhbHVlID09PSAnbmV3JykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT09ICdzdXBlcicpIHx8ICh2YWx1ZSA9PT0gJ3RoaXMnKSB8fCAodmFsdWUgPT09ICd0eXBlb2YnKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PT0gJ3ZvaWQnKSB8fCAodmFsdWUgPT09ICd5aWVsZCcpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHN0YXJ0O1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VZaWVsZEV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3lpZWxkJyk7XG5cdCAgICAgICAgdmFyIGFyZ3VtZW50ID0gbnVsbDtcblx0ICAgICAgICB2YXIgZGVsZWdhdGUgPSBmYWxzZTtcblx0ICAgICAgICBpZiAoIXRoaXMuaGFzTGluZVRlcm1pbmF0b3IpIHtcblx0ICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dZaWVsZCA9IHRoaXMuY29udGV4dC5hbGxvd1lpZWxkO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IGZhbHNlO1xuXHQgICAgICAgICAgICBkZWxlZ2F0ZSA9IHRoaXMubWF0Y2goJyonKTtcblx0ICAgICAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgYXJndW1lbnQgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzU3RhcnRPZkV4cHJlc3Npb24oKSkge1xuXHQgICAgICAgICAgICAgICAgYXJndW1lbnQgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuWWllbGRFeHByZXNzaW9uKGFyZ3VtZW50LCBkZWxlZ2F0ZSkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNsYXNzLWRlZmluaXRpb25zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQ2xhc3NFbGVtZW50ID0gZnVuY3Rpb24gKGhhc0NvbnN0cnVjdG9yKSB7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIga2luZCA9ICcnO1xuXHQgICAgICAgIHZhciBrZXkgPSBudWxsO1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IG51bGw7XG5cdCAgICAgICAgdmFyIGNvbXB1dGVkID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBpc1N0YXRpYyA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBpc0FzeW5jID0gZmFsc2U7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJyonKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICB2YXIgaWQgPSBrZXk7XG5cdCAgICAgICAgICAgIGlmIChpZC5uYW1lID09PSAnc3RhdGljJyAmJiAodGhpcy5xdWFsaWZpZWRQcm9wZXJ0eU5hbWUodGhpcy5sb29rYWhlYWQpIHx8IHRoaXMubWF0Y2goJyonKSkpIHtcblx0ICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgICAgICBpc1N0YXRpYyA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICBjb21wdXRlZCA9IHRoaXMubWF0Y2goJ1snKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcqJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKCh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pICYmICF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yICYmICh0b2tlbi52YWx1ZSA9PT0gJ2FzeW5jJykpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBwdW5jdHVhdG9yID0gdGhpcy5sb29rYWhlYWQudmFsdWU7XG5cdCAgICAgICAgICAgICAgICBpZiAocHVuY3R1YXRvciAhPT0gJzonICYmIHB1bmN0dWF0b3IgIT09ICcoJyAmJiBwdW5jdHVhdG9yICE9PSAnKicpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpc0FzeW5jID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgdG9rZW4udmFsdWUgPT09ICdjb25zdHJ1Y3RvcicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5Db25zdHJ1Y3RvcklzQXN5bmMpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbG9va2FoZWFkUHJvcGVydHlLZXkgPSB0aGlzLnF1YWxpZmllZFByb3BlcnR5TmFtZSh0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLykge1xuXHQgICAgICAgICAgICBpZiAodG9rZW4udmFsdWUgPT09ICdnZXQnICYmIGxvb2thaGVhZFByb3BlcnR5S2V5KSB7XG5cdCAgICAgICAgICAgICAgICBraW5kID0gJ2dldCc7XG5cdCAgICAgICAgICAgICAgICBjb21wdXRlZCA9IHRoaXMubWF0Y2goJ1snKTtcblx0ICAgICAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wYXJzZUdldHRlck1ldGhvZCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnc2V0JyAmJiBsb29rYWhlYWRQcm9wZXJ0eUtleSkge1xuXHQgICAgICAgICAgICAgICAga2luZCA9ICdzZXQnO1xuXHQgICAgICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wYXJzZVNldHRlck1ldGhvZCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiB0b2tlbi52YWx1ZSA9PT0gJyonICYmIGxvb2thaGVhZFByb3BlcnR5S2V5KSB7XG5cdCAgICAgICAgICAgIGtpbmQgPSAnaW5pdCc7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlR2VuZXJhdG9yTWV0aG9kKCk7XG5cdCAgICAgICAgICAgIG1ldGhvZCA9IHRydWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICgha2luZCAmJiBrZXkgJiYgdGhpcy5tYXRjaCgnKCcpKSB7XG5cdCAgICAgICAgICAgIGtpbmQgPSAnaW5pdCc7XG5cdCAgICAgICAgICAgIHZhbHVlID0gaXNBc3luYyA/IHRoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZEFzeW5jRnVuY3Rpb24oKSA6IHRoaXMucGFyc2VQcm9wZXJ0eU1ldGhvZEZ1bmN0aW9uKCk7XG5cdCAgICAgICAgICAgIG1ldGhvZCA9IHRydWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICgha2luZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGtpbmQgPT09ICdpbml0Jykge1xuXHQgICAgICAgICAgICBraW5kID0gJ21ldGhvZCc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICghY29tcHV0ZWQpIHtcblx0ICAgICAgICAgICAgaWYgKGlzU3RhdGljICYmIHRoaXMuaXNQcm9wZXJ0eUtleShrZXksICdwcm90b3R5cGUnKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdGF0aWNQcm90b3R5cGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICghaXNTdGF0aWMgJiYgdGhpcy5pc1Byb3BlcnR5S2V5KGtleSwgJ2NvbnN0cnVjdG9yJykpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChraW5kICE9PSAnbWV0aG9kJyB8fCAhbWV0aG9kIHx8ICh2YWx1ZSAmJiB2YWx1ZS5nZW5lcmF0b3IpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5Db25zdHJ1Y3RvclNwZWNpYWxNZXRob2QpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGhhc0NvbnN0cnVjdG9yLnZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5EdXBsaWNhdGVDb25zdHJ1Y3Rvcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBoYXNDb25zdHJ1Y3Rvci52YWx1ZSA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBraW5kID0gJ2NvbnN0cnVjdG9yJztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5NZXRob2REZWZpbml0aW9uKGtleSwgY29tcHV0ZWQsIHZhbHVlLCBraW5kLCBpc1N0YXRpYykpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VDbGFzc0VsZW1lbnRMaXN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBib2R5ID0gW107XG5cdCAgICAgICAgdmFyIGhhc0NvbnN0cnVjdG9yID0geyB2YWx1ZTogZmFsc2UgfTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgneycpO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCc7JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBib2R5LnB1c2godGhpcy5wYXJzZUNsYXNzRWxlbWVudChoYXNDb25zdHJ1Y3RvcikpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgcmV0dXJuIGJvZHk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNsYXNzQm9keSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBlbGVtZW50TGlzdCA9IHRoaXMucGFyc2VDbGFzc0VsZW1lbnRMaXN0KCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQ2xhc3NCb2R5KGVsZW1lbnRMaXN0KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNsYXNzRGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoaWRlbnRpZmllcklzT3B0aW9uYWwpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c1N0cmljdCA9IHRoaXMuY29udGV4dC5zdHJpY3Q7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdjbGFzcycpO1xuXHQgICAgICAgIHZhciBpZCA9IChpZGVudGlmaWVySXNPcHRpb25hbCAmJiAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMyAvKiBJZGVudGlmaWVyICovKSkgPyBudWxsIDogdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuXHQgICAgICAgIHZhciBzdXBlckNsYXNzID0gbnVsbDtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ2V4dGVuZHMnKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBzdXBlckNsYXNzID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VMZWZ0SGFuZFNpZGVFeHByZXNzaW9uQWxsb3dDYWxsKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGNsYXNzQm9keSA9IHRoaXMucGFyc2VDbGFzc0JvZHkoKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gcHJldmlvdXNTdHJpY3Q7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQ2xhc3NEZWNsYXJhdGlvbihpZCwgc3VwZXJDbGFzcywgY2xhc3NCb2R5KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNsYXNzRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c1N0cmljdCA9IHRoaXMuY29udGV4dC5zdHJpY3Q7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdjbGFzcycpO1xuXHQgICAgICAgIHZhciBpZCA9ICh0aGlzLmxvb2thaGVhZC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pID8gdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpIDogbnVsbDtcblx0ICAgICAgICB2YXIgc3VwZXJDbGFzcyA9IG51bGw7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdleHRlbmRzJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgc3VwZXJDbGFzcyA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlTGVmdEhhbmRTaWRlRXhwcmVzc2lvbkFsbG93Q2FsbCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBjbGFzc0JvZHkgPSB0aGlzLnBhcnNlQ2xhc3NCb2R5KCk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHByZXZpb3VzU3RyaWN0O1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkNsYXNzRXhwcmVzc2lvbihpZCwgc3VwZXJDbGFzcywgY2xhc3NCb2R5KSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc2NyaXB0c1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbW9kdWxlc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU1vZHVsZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNNb2R1bGUgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5pc01vZHVsZSA9IHRydWU7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgYm9keSA9IHRoaXMucGFyc2VEaXJlY3RpdmVQcm9sb2d1ZXMoKTtcblx0ICAgICAgICB3aGlsZSAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMiAvKiBFT0YgKi8pIHtcblx0ICAgICAgICAgICAgYm9keS5wdXNoKHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuTW9kdWxlKGJvZHkpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlU2NyaXB0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlRGlyZWN0aXZlUHJvbG9ndWVzKCk7XG5cdCAgICAgICAgd2hpbGUgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovKSB7XG5cdCAgICAgICAgICAgIGJvZHkucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlNjcmlwdChib2R5KSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaW1wb3J0c1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU1vZHVsZVNwZWNpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIGlmICh0aGlzLmxvb2thaGVhZC50eXBlICE9PSA4IC8qIFN0cmluZ0xpdGVyYWwgKi8pIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZE1vZHVsZVNwZWNpZmllcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdmFyIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkxpdGVyYWwodG9rZW4udmFsdWUsIHJhdykpO1xuXHQgICAgfTtcblx0ICAgIC8vIGltcG9ydCB7PGZvbyBhcyBiYXI+fSAuLi47XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlSW1wb3J0U3BlY2lmaWVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGltcG9ydGVkO1xuXHQgICAgICAgIHZhciBsb2NhbDtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovKSB7XG5cdCAgICAgICAgICAgIGltcG9ydGVkID0gdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICBsb2NhbCA9IGltcG9ydGVkO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhcycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgbG9jYWwgPSB0aGlzLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGltcG9ydGVkID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgICAgIGxvY2FsID0gaW1wb3J0ZWQ7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICBsb2NhbCA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSW1wb3J0U3BlY2lmaWVyKGxvY2FsLCBpbXBvcnRlZCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIHtmb28sIGJhciBhcyBiYXN9XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlTmFtZWRJbXBvcnRzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG5cdCAgICAgICAgdmFyIHNwZWNpZmllcnMgPSBbXTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICBzcGVjaWZpZXJzLnB1c2godGhpcy5wYXJzZUltcG9ydFNwZWNpZmllcigpKTtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcsJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ30nKTtcblx0ICAgICAgICByZXR1cm4gc3BlY2lmaWVycztcblx0ICAgIH07XG5cdCAgICAvLyBpbXBvcnQgPGZvbz4gLi4uO1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUltcG9ydERlZmF1bHRTcGVjaWZpZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgbG9jYWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5JbXBvcnREZWZhdWx0U3BlY2lmaWVyKGxvY2FsKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaW1wb3J0IDwqIGFzIGZvbz4gLi4uO1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUltcG9ydE5hbWVzcGFjZVNwZWNpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcqJyk7XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzJykpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuTm9Bc0FmdGVySW1wb3J0TmFtZXNwYWNlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB2YXIgbG9jYWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIobG9jYWwpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlSW1wb3J0RGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsSW1wb3J0RGVjbGFyYXRpb24pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnaW1wb3J0Jyk7XG5cdCAgICAgICAgdmFyIHNyYztcblx0ICAgICAgICB2YXIgc3BlY2lmaWVycyA9IFtdO1xuXHQgICAgICAgIGlmICh0aGlzLmxvb2thaGVhZC50eXBlID09PSA4IC8qIFN0cmluZ0xpdGVyYWwgKi8pIHtcblx0ICAgICAgICAgICAgLy8gaW1wb3J0ICdmb28nO1xuXHQgICAgICAgICAgICBzcmMgPSB0aGlzLnBhcnNlTW9kdWxlU3BlY2lmaWVyKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgneycpKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBpbXBvcnQge2Jhcn1cblx0ICAgICAgICAgICAgICAgIHNwZWNpZmllcnMgPSBzcGVjaWZpZXJzLmNvbmNhdCh0aGlzLnBhcnNlTmFtZWRJbXBvcnRzKCkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJyonKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gaW1wb3J0ICogYXMgZm9vXG5cdCAgICAgICAgICAgICAgICBzcGVjaWZpZXJzLnB1c2godGhpcy5wYXJzZUltcG9ydE5hbWVzcGFjZVNwZWNpZmllcigpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzSWRlbnRpZmllck5hbWUodGhpcy5sb29rYWhlYWQpICYmICF0aGlzLm1hdGNoS2V5d29yZCgnZGVmYXVsdCcpKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBpbXBvcnQgZm9vXG5cdCAgICAgICAgICAgICAgICBzcGVjaWZpZXJzLnB1c2godGhpcy5wYXJzZUltcG9ydERlZmF1bHRTcGVjaWZpZXIoKSk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnLCcpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcG9ydCBmb28sICogYXMgZm9vXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcnMucHVzaCh0aGlzLnBhcnNlSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCd7JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0IGZvbywge2Jhcn1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVycyA9IHNwZWNpZmllcnMuY29uY2F0KHRoaXMucGFyc2VOYW1lZEltcG9ydHMoKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdmcm9tJykpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5sb29rYWhlYWQudmFsdWUgPyBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiA6IG1lc3NhZ2VzXzEuTWVzc2FnZXMuTWlzc2luZ0Zyb21DbGF1c2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZSwgdGhpcy5sb29rYWhlYWQudmFsdWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHNyYyA9IHRoaXMucGFyc2VNb2R1bGVTcGVjaWZpZXIoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSW1wb3J0RGVjbGFyYXRpb24oc3BlY2lmaWVycywgc3JjKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZXhwb3J0c1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUV4cG9ydFNwZWNpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBsb2NhbCA9IHRoaXMucGFyc2VJZGVudGlmaWVyTmFtZSgpO1xuXHQgICAgICAgIHZhciBleHBvcnRlZCA9IGxvY2FsO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgZXhwb3J0ZWQgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0U3BlY2lmaWVyKGxvY2FsLCBleHBvcnRlZCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VFeHBvcnREZWNsYXJhdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LmluRnVuY3Rpb25Cb2R5KSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLklsbGVnYWxFeHBvcnREZWNsYXJhdGlvbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdleHBvcnQnKTtcblx0ICAgICAgICB2YXIgZXhwb3J0RGVjbGFyYXRpb247XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdkZWZhdWx0JykpIHtcblx0ICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgLi4uXG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnZnVuY3Rpb24nKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9vICgpIHt9XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKSB7fVxuXHQgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24odHJ1ZSk7XG5cdCAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ2NsYXNzJykpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IGNsYXNzIGZvbyB7fVxuXHQgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUNsYXNzRGVjbGFyYXRpb24odHJ1ZSk7XG5cdCAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhc3luYycpKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBmICgpIHt9XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiAoKSB7fVxuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgYXN5bmMgeCA9PiB4XG5cdCAgICAgICAgICAgICAgICB2YXIgZGVjbGFyYXRpb24gPSB0aGlzLm1hdGNoQXN5bmNGdW5jdGlvbigpID8gdGhpcy5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24odHJ1ZSkgOiB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgIGV4cG9ydERlY2xhcmF0aW9uID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb24oZGVjbGFyYXRpb24pKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2Zyb20nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiwgdGhpcy5sb29rYWhlYWQudmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQge307XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBbXTtcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0ICgxICsgMik7XG5cdCAgICAgICAgICAgICAgICB2YXIgZGVjbGFyYXRpb24gPSB0aGlzLm1hdGNoKCd7JykgPyB0aGlzLnBhcnNlT2JqZWN0SW5pdGlhbGl6ZXIoKSA6XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaCgnWycpID8gdGhpcy5wYXJzZUFycmF5SW5pdGlhbGl6ZXIoKSA6IHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaCgnKicpKSB7XG5cdCAgICAgICAgICAgIC8vIGV4cG9ydCAqIGZyb20gJ2Zvbyc7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdmcm9tJykpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5sb29rYWhlYWQudmFsdWUgPyBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRUb2tlbiA6IG1lc3NhZ2VzXzEuTWVzc2FnZXMuTWlzc2luZ0Zyb21DbGF1c2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZSwgdGhpcy5sb29rYWhlYWQudmFsdWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHZhciBzcmMgPSB0aGlzLnBhcnNlTW9kdWxlU3BlY2lmaWVyKCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0QWxsRGVjbGFyYXRpb24oc3JjKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDQgLyogS2V5d29yZCAqLykge1xuXHQgICAgICAgICAgICAvLyBleHBvcnQgdmFyIGYgPSAxO1xuXHQgICAgICAgICAgICB2YXIgZGVjbGFyYXRpb24gPSB2b2lkIDA7XG5cdCAgICAgICAgICAgIHN3aXRjaCAodGhpcy5sb29rYWhlYWQudmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2xldCc6XG5cdCAgICAgICAgICAgICAgICBjYXNlICdjb25zdCc6XG5cdCAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24gPSB0aGlzLnBhcnNlTGV4aWNhbERlY2xhcmF0aW9uKHsgaW5Gb3I6IGZhbHNlIH0pO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgY2FzZSAndmFyJzpcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2NsYXNzJzpcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcblx0ICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbiA9IHRoaXMucGFyc2VTdGF0ZW1lbnRMaXN0SXRlbSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0TmFtZWREZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgW10sIG51bGwpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaEFzeW5jRnVuY3Rpb24oKSkge1xuXHQgICAgICAgICAgICB2YXIgZGVjbGFyYXRpb24gPSB0aGlzLnBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbigpO1xuXHQgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0TmFtZWREZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgW10sIG51bGwpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBzcGVjaWZpZXJzID0gW107XG5cdCAgICAgICAgICAgIHZhciBzb3VyY2UgPSBudWxsO1xuXHQgICAgICAgICAgICB2YXIgaXNFeHBvcnRGcm9tSWRlbnRpZmllciA9IGZhbHNlO1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgneycpO1xuXHQgICAgICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICAgICAgaXNFeHBvcnRGcm9tSWRlbnRpZmllciA9IGlzRXhwb3J0RnJvbUlkZW50aWZpZXIgfHwgdGhpcy5tYXRjaEtleXdvcmQoJ2RlZmF1bHQnKTtcblx0ICAgICAgICAgICAgICAgIHNwZWNpZmllcnMucHVzaCh0aGlzLnBhcnNlRXhwb3J0U3BlY2lmaWVyKCkpO1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2Zyb20nKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IHtkZWZhdWx0fSBmcm9tICdmb28nO1xuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IHtmb299IGZyb20gJ2Zvbyc7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgc291cmNlID0gdGhpcy5wYXJzZU1vZHVsZVNwZWNpZmllcigpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoaXNFeHBvcnRGcm9tSWRlbnRpZmllcikge1xuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IHtkZWZhdWx0fTsgLy8gbWlzc2luZyBmcm9tQ2xhdXNlXG5cdCAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IHRoaXMubG9va2FoZWFkLnZhbHVlID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW4gOiBtZXNzYWdlc18xLk1lc3NhZ2VzLk1pc3NpbmdGcm9tQ2xhdXNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2UsIHRoaXMubG9va2FoZWFkLnZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCB7Zm9vfTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGV4cG9ydERlY2xhcmF0aW9uID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5FeHBvcnROYW1lZERlY2xhcmF0aW9uKG51bGwsIHNwZWNpZmllcnMsIHNvdXJjZSkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZXhwb3J0RGVjbGFyYXRpb247XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFBhcnNlcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5QYXJzZXIgPSBQYXJzZXI7XG5cblxuLyoqKi8gfSxcbi8qIDkgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHQvLyBFbnN1cmUgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLCBvdGhlcndpc2UgdGhyb3cgYW4gZXJyb3IuXG5cdC8vIFRoaXMgaXMgb25seSB0byBoYXZlIGEgYmV0dGVyIGNvbnRyYWN0IHNlbWFudGljLCBpLmUuIGFub3RoZXIgc2FmZXR5IG5ldFxuXHQvLyB0byBjYXRjaCBhIGxvZ2ljIGVycm9yLiBUaGUgY29uZGl0aW9uIHNoYWxsIGJlIGZ1bGZpbGxlZCBpbiBub3JtYWwgY2FzZS5cblx0Ly8gRG8gTk9UIHVzZSB0aGlzIHRvIGVuZm9yY2UgYSBjZXJ0YWluIGNvbmRpdGlvbiBvbiBhbnkgdXNlciBpbnB1dC5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHRmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCBtZXNzYWdlKSB7XG5cdCAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cblx0ICAgIGlmICghY29uZGl0aW9uKSB7XG5cdCAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBU1NFUlQ6ICcgKyBtZXNzYWdlKTtcblx0ICAgIH1cblx0fVxuXHRleHBvcnRzLmFzc2VydCA9IGFzc2VydDtcblxuXG4vKioqLyB9LFxuLyogMTAgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHQvKiB0c2xpbnQ6ZGlzYWJsZTptYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdHZhciBFcnJvckhhbmRsZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRXJyb3JIYW5kbGVyKCkge1xuXHQgICAgICAgIHRoaXMuZXJyb3JzID0gW107XG5cdCAgICAgICAgdGhpcy50b2xlcmFudCA9IGZhbHNlO1xuXHQgICAgfVxuXHQgICAgRXJyb3JIYW5kbGVyLnByb3RvdHlwZS5yZWNvcmRFcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xuXHQgICAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuXHQgICAgfTtcblx0ICAgIEVycm9ySGFuZGxlci5wcm90b3R5cGUudG9sZXJhdGUgPSBmdW5jdGlvbiAoZXJyb3IpIHtcblx0ICAgICAgICBpZiAodGhpcy50b2xlcmFudCkge1xuXHQgICAgICAgICAgICB0aGlzLnJlY29yZEVycm9yKGVycm9yKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRocm93IGVycm9yO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBFcnJvckhhbmRsZXIucHJvdG90eXBlLmNvbnN0cnVjdEVycm9yID0gZnVuY3Rpb24gKG1zZywgY29sdW1uKSB7XG5cdCAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1zZyk7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNhdGNoIChiYXNlKSB7XG5cdCAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdCAgICAgICAgICAgIGlmIChPYmplY3QuY3JlYXRlICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuXHQgICAgICAgICAgICAgICAgZXJyb3IgPSBPYmplY3QuY3JlYXRlKGJhc2UpO1xuXHQgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCAnY29sdW1uJywgeyB2YWx1ZTogY29sdW1uIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdCAgICAgICAgcmV0dXJuIGVycm9yO1xuXHQgICAgfTtcblx0ICAgIEVycm9ySGFuZGxlci5wcm90b3R5cGUuY3JlYXRlRXJyb3IgPSBmdW5jdGlvbiAoaW5kZXgsIGxpbmUsIGNvbCwgZGVzY3JpcHRpb24pIHtcblx0ICAgICAgICB2YXIgbXNnID0gJ0xpbmUgJyArIGxpbmUgKyAnOiAnICsgZGVzY3JpcHRpb247XG5cdCAgICAgICAgdmFyIGVycm9yID0gdGhpcy5jb25zdHJ1Y3RFcnJvcihtc2csIGNvbCk7XG5cdCAgICAgICAgZXJyb3IuaW5kZXggPSBpbmRleDtcblx0ICAgICAgICBlcnJvci5saW5lTnVtYmVyID0gbGluZTtcblx0ICAgICAgICBlcnJvci5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuXHQgICAgICAgIHJldHVybiBlcnJvcjtcblx0ICAgIH07XG5cdCAgICBFcnJvckhhbmRsZXIucHJvdG90eXBlLnRocm93RXJyb3IgPSBmdW5jdGlvbiAoaW5kZXgsIGxpbmUsIGNvbCwgZGVzY3JpcHRpb24pIHtcblx0ICAgICAgICB0aHJvdyB0aGlzLmNyZWF0ZUVycm9yKGluZGV4LCBsaW5lLCBjb2wsIGRlc2NyaXB0aW9uKTtcblx0ICAgIH07XG5cdCAgICBFcnJvckhhbmRsZXIucHJvdG90eXBlLnRvbGVyYXRlRXJyb3IgPSBmdW5jdGlvbiAoaW5kZXgsIGxpbmUsIGNvbCwgZGVzY3JpcHRpb24pIHtcblx0ICAgICAgICB2YXIgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKGluZGV4LCBsaW5lLCBjb2wsIGRlc2NyaXB0aW9uKTtcblx0ICAgICAgICBpZiAodGhpcy50b2xlcmFudCkge1xuXHQgICAgICAgICAgICB0aGlzLnJlY29yZEVycm9yKGVycm9yKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRocm93IGVycm9yO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICByZXR1cm4gRXJyb3JIYW5kbGVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLkVycm9ySGFuZGxlciA9IEVycm9ySGFuZGxlcjtcblxuXG4vKioqLyB9LFxuLyogMTEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdC8vIEVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gVjguXG5cdGV4cG9ydHMuTWVzc2FnZXMgPSB7XG5cdCAgICBCYWRHZXR0ZXJBcml0eTogJ0dldHRlciBtdXN0IG5vdCBoYXZlIGFueSBmb3JtYWwgcGFyYW1ldGVycycsXG5cdCAgICBCYWRTZXR0ZXJBcml0eTogJ1NldHRlciBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZm9ybWFsIHBhcmFtZXRlcicsXG5cdCAgICBCYWRTZXR0ZXJSZXN0UGFyYW1ldGVyOiAnU2V0dGVyIGZ1bmN0aW9uIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgcmVzdCBwYXJhbWV0ZXInLFxuXHQgICAgQ29uc3RydWN0b3JJc0FzeW5jOiAnQ2xhc3MgY29uc3RydWN0b3IgbWF5IG5vdCBiZSBhbiBhc3luYyBtZXRob2QnLFxuXHQgICAgQ29uc3RydWN0b3JTcGVjaWFsTWV0aG9kOiAnQ2xhc3MgY29uc3RydWN0b3IgbWF5IG5vdCBiZSBhbiBhY2Nlc3NvcicsXG5cdCAgICBEZWNsYXJhdGlvbk1pc3NpbmdJbml0aWFsaXplcjogJ01pc3NpbmcgaW5pdGlhbGl6ZXIgaW4gJTAgZGVjbGFyYXRpb24nLFxuXHQgICAgRGVmYXVsdFJlc3RQYXJhbWV0ZXI6ICdVbmV4cGVjdGVkIHRva2VuID0nLFxuXHQgICAgRHVwbGljYXRlQmluZGluZzogJ0R1cGxpY2F0ZSBiaW5kaW5nICUwJyxcblx0ICAgIER1cGxpY2F0ZUNvbnN0cnVjdG9yOiAnQSBjbGFzcyBtYXkgb25seSBoYXZlIG9uZSBjb25zdHJ1Y3RvcicsXG5cdCAgICBEdXBsaWNhdGVQcm90b1Byb3BlcnR5OiAnRHVwbGljYXRlIF9fcHJvdG9fXyBmaWVsZHMgYXJlIG5vdCBhbGxvd2VkIGluIG9iamVjdCBsaXRlcmFscycsXG5cdCAgICBGb3JJbk9mTG9vcEluaXRpYWxpemVyOiAnJTAgbG9vcCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBtYXkgbm90IGhhdmUgYW4gaW5pdGlhbGl6ZXInLFxuXHQgICAgR2VuZXJhdG9ySW5MZWdhY3lDb250ZXh0OiAnR2VuZXJhdG9yIGRlY2xhcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gbGVnYWN5IGNvbnRleHRzJyxcblx0ICAgIElsbGVnYWxCcmVhazogJ0lsbGVnYWwgYnJlYWsgc3RhdGVtZW50Jyxcblx0ICAgIElsbGVnYWxDb250aW51ZTogJ0lsbGVnYWwgY29udGludWUgc3RhdGVtZW50Jyxcblx0ICAgIElsbGVnYWxFeHBvcnREZWNsYXJhdGlvbjogJ1VuZXhwZWN0ZWQgdG9rZW4nLFxuXHQgICAgSWxsZWdhbEltcG9ydERlY2xhcmF0aW9uOiAnVW5leHBlY3RlZCB0b2tlbicsXG5cdCAgICBJbGxlZ2FsTGFuZ3VhZ2VNb2RlRGlyZWN0aXZlOiAnSWxsZWdhbCBcXCd1c2Ugc3RyaWN0XFwnIGRpcmVjdGl2ZSBpbiBmdW5jdGlvbiB3aXRoIG5vbi1zaW1wbGUgcGFyYW1ldGVyIGxpc3QnLFxuXHQgICAgSWxsZWdhbFJldHVybjogJ0lsbGVnYWwgcmV0dXJuIHN0YXRlbWVudCcsXG5cdCAgICBJbnZhbGlkRXNjYXBlZFJlc2VydmVkV29yZDogJ0tleXdvcmQgbXVzdCBub3QgY29udGFpbiBlc2NhcGVkIGNoYXJhY3RlcnMnLFxuXHQgICAgSW52YWxpZEhleEVzY2FwZVNlcXVlbmNlOiAnSW52YWxpZCBoZXhhZGVjaW1hbCBlc2NhcGUgc2VxdWVuY2UnLFxuXHQgICAgSW52YWxpZExIU0luQXNzaWdubWVudDogJ0ludmFsaWQgbGVmdC1oYW5kIHNpZGUgaW4gYXNzaWdubWVudCcsXG5cdCAgICBJbnZhbGlkTEhTSW5Gb3JJbjogJ0ludmFsaWQgbGVmdC1oYW5kIHNpZGUgaW4gZm9yLWluJyxcblx0ICAgIEludmFsaWRMSFNJbkZvckxvb3A6ICdJbnZhbGlkIGxlZnQtaGFuZCBzaWRlIGluIGZvci1sb29wJyxcblx0ICAgIEludmFsaWRNb2R1bGVTcGVjaWZpZXI6ICdVbmV4cGVjdGVkIHRva2VuJyxcblx0ICAgIEludmFsaWRSZWdFeHA6ICdJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbicsXG5cdCAgICBMZXRJbkxleGljYWxCaW5kaW5nOiAnbGV0IGlzIGRpc2FsbG93ZWQgYXMgYSBsZXhpY2FsbHkgYm91bmQgbmFtZScsXG5cdCAgICBNaXNzaW5nRnJvbUNsYXVzZTogJ1VuZXhwZWN0ZWQgdG9rZW4nLFxuXHQgICAgTXVsdGlwbGVEZWZhdWx0c0luU3dpdGNoOiAnTW9yZSB0aGFuIG9uZSBkZWZhdWx0IGNsYXVzZSBpbiBzd2l0Y2ggc3RhdGVtZW50Jyxcblx0ICAgIE5ld2xpbmVBZnRlclRocm93OiAnSWxsZWdhbCBuZXdsaW5lIGFmdGVyIHRocm93Jyxcblx0ICAgIE5vQXNBZnRlckltcG9ydE5hbWVzcGFjZTogJ1VuZXhwZWN0ZWQgdG9rZW4nLFxuXHQgICAgTm9DYXRjaE9yRmluYWxseTogJ01pc3NpbmcgY2F0Y2ggb3IgZmluYWxseSBhZnRlciB0cnknLFxuXHQgICAgUGFyYW1ldGVyQWZ0ZXJSZXN0UGFyYW1ldGVyOiAnUmVzdCBwYXJhbWV0ZXIgbXVzdCBiZSBsYXN0IGZvcm1hbCBwYXJhbWV0ZXInLFxuXHQgICAgUmVkZWNsYXJhdGlvbjogJyUwIFxcJyUxXFwnIGhhcyBhbHJlYWR5IGJlZW4gZGVjbGFyZWQnLFxuXHQgICAgU3RhdGljUHJvdG90eXBlOiAnQ2xhc3NlcyBtYXkgbm90IGhhdmUgc3RhdGljIHByb3BlcnR5IG5hbWVkIHByb3RvdHlwZScsXG5cdCAgICBTdHJpY3RDYXRjaFZhcmlhYmxlOiAnQ2F0Y2ggdmFyaWFibGUgbWF5IG5vdCBiZSBldmFsIG9yIGFyZ3VtZW50cyBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3REZWxldGU6ICdEZWxldGUgb2YgYW4gdW5xdWFsaWZpZWQgaWRlbnRpZmllciBpbiBzdHJpY3QgbW9kZS4nLFxuXHQgICAgU3RyaWN0RnVuY3Rpb246ICdJbiBzdHJpY3QgbW9kZSBjb2RlLCBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgZGVjbGFyZWQgYXQgdG9wIGxldmVsIG9yIGluc2lkZSBhIGJsb2NrJyxcblx0ICAgIFN0cmljdEZ1bmN0aW9uTmFtZTogJ0Z1bmN0aW9uIG5hbWUgbWF5IG5vdCBiZSBldmFsIG9yIGFyZ3VtZW50cyBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3RMSFNBc3NpZ25tZW50OiAnQXNzaWdubWVudCB0byBldmFsIG9yIGFyZ3VtZW50cyBpcyBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3RMSFNQb3N0Zml4OiAnUG9zdGZpeCBpbmNyZW1lbnQvZGVjcmVtZW50IG1heSBub3QgaGF2ZSBldmFsIG9yIGFyZ3VtZW50cyBvcGVyYW5kIGluIHN0cmljdCBtb2RlJyxcblx0ICAgIFN0cmljdExIU1ByZWZpeDogJ1ByZWZpeCBpbmNyZW1lbnQvZGVjcmVtZW50IG1heSBub3QgaGF2ZSBldmFsIG9yIGFyZ3VtZW50cyBvcGVyYW5kIGluIHN0cmljdCBtb2RlJyxcblx0ICAgIFN0cmljdE1vZGVXaXRoOiAnU3RyaWN0IG1vZGUgY29kZSBtYXkgbm90IGluY2x1ZGUgYSB3aXRoIHN0YXRlbWVudCcsXG5cdCAgICBTdHJpY3RPY3RhbExpdGVyYWw6ICdPY3RhbCBsaXRlcmFscyBhcmUgbm90IGFsbG93ZWQgaW4gc3RyaWN0IG1vZGUuJyxcblx0ICAgIFN0cmljdFBhcmFtRHVwZTogJ1N0cmljdCBtb2RlIGZ1bmN0aW9uIG1heSBub3QgaGF2ZSBkdXBsaWNhdGUgcGFyYW1ldGVyIG5hbWVzJyxcblx0ICAgIFN0cmljdFBhcmFtTmFtZTogJ1BhcmFtZXRlciBuYW1lIGV2YWwgb3IgYXJndW1lbnRzIGlzIG5vdCBhbGxvd2VkIGluIHN0cmljdCBtb2RlJyxcblx0ICAgIFN0cmljdFJlc2VydmVkV29yZDogJ1VzZSBvZiBmdXR1cmUgcmVzZXJ2ZWQgd29yZCBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3RWYXJOYW1lOiAnVmFyaWFibGUgbmFtZSBtYXkgbm90IGJlIGV2YWwgb3IgYXJndW1lbnRzIGluIHN0cmljdCBtb2RlJyxcblx0ICAgIFRlbXBsYXRlT2N0YWxMaXRlcmFsOiAnT2N0YWwgbGl0ZXJhbHMgYXJlIG5vdCBhbGxvd2VkIGluIHRlbXBsYXRlIHN0cmluZ3MuJyxcblx0ICAgIFVuZXhwZWN0ZWRFT1M6ICdVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCcsXG5cdCAgICBVbmV4cGVjdGVkSWRlbnRpZmllcjogJ1VuZXhwZWN0ZWQgaWRlbnRpZmllcicsXG5cdCAgICBVbmV4cGVjdGVkTnVtYmVyOiAnVW5leHBlY3RlZCBudW1iZXInLFxuXHQgICAgVW5leHBlY3RlZFJlc2VydmVkOiAnVW5leHBlY3RlZCByZXNlcnZlZCB3b3JkJyxcblx0ICAgIFVuZXhwZWN0ZWRTdHJpbmc6ICdVbmV4cGVjdGVkIHN0cmluZycsXG5cdCAgICBVbmV4cGVjdGVkVGVtcGxhdGU6ICdVbmV4cGVjdGVkIHF1YXNpICUwJyxcblx0ICAgIFVuZXhwZWN0ZWRUb2tlbjogJ1VuZXhwZWN0ZWQgdG9rZW4gJTAnLFxuXHQgICAgVW5leHBlY3RlZFRva2VuSWxsZWdhbDogJ1VuZXhwZWN0ZWQgdG9rZW4gSUxMRUdBTCcsXG5cdCAgICBVbmtub3duTGFiZWw6ICdVbmRlZmluZWQgbGFiZWwgXFwnJTBcXCcnLFxuXHQgICAgVW50ZXJtaW5hdGVkUmVnRXhwOiAnSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb246IG1pc3NpbmcgLydcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMTIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdHZhciBhc3NlcnRfMSA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdHZhciBjaGFyYWN0ZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cdHZhciBtZXNzYWdlc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cdGZ1bmN0aW9uIGhleFZhbHVlKGNoKSB7XG5cdCAgICByZXR1cm4gJzAxMjM0NTY3ODlhYmNkZWYnLmluZGV4T2YoY2gudG9Mb3dlckNhc2UoKSk7XG5cdH1cblx0ZnVuY3Rpb24gb2N0YWxWYWx1ZShjaCkge1xuXHQgICAgcmV0dXJuICcwMTIzNDU2NycuaW5kZXhPZihjaCk7XG5cdH1cblx0dmFyIFNjYW5uZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gU2Nhbm5lcihjb2RlLCBoYW5kbGVyKSB7XG5cdCAgICAgICAgdGhpcy5zb3VyY2UgPSBjb2RlO1xuXHQgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gaGFuZGxlcjtcblx0ICAgICAgICB0aGlzLnRyYWNrQ29tbWVudCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuaXNNb2R1bGUgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmxlbmd0aCA9IGNvZGUubGVuZ3RoO1xuXHQgICAgICAgIHRoaXMuaW5kZXggPSAwO1xuXHQgICAgICAgIHRoaXMubGluZU51bWJlciA9IChjb2RlLmxlbmd0aCA+IDApID8gMSA6IDA7XG5cdCAgICAgICAgdGhpcy5saW5lU3RhcnQgPSAwO1xuXHQgICAgICAgIHRoaXMuY3VybHlTdGFjayA9IFtdO1xuXHQgICAgfVxuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2F2ZVN0YXRlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIGluZGV4OiB0aGlzLmluZGV4LFxuXHQgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5saW5lU3RhcnRcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnJlc3RvcmVTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuXHQgICAgICAgIHRoaXMuaW5kZXggPSBzdGF0ZS5pbmRleDtcblx0ICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBzdGF0ZS5saW5lTnVtYmVyO1xuXHQgICAgICAgIHRoaXMubGluZVN0YXJ0ID0gc3RhdGUubGluZVN0YXJ0O1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLmVvZiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA+PSB0aGlzLmxlbmd0aDtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS50aHJvd1VuZXhwZWN0ZWRUb2tlbiA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG5cdCAgICAgICAgaWYgKG1lc3NhZ2UgPT09IHZvaWQgMCkgeyBtZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW5JbGxlZ2FsOyB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnRocm93RXJyb3IodGhpcy5pbmRleCwgdGhpcy5saW5lTnVtYmVyLCB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnQgKyAxLCBtZXNzYWdlKTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbiA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG5cdCAgICAgICAgaWYgKG1lc3NhZ2UgPT09IHZvaWQgMCkgeyBtZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW5JbGxlZ2FsOyB9XG5cdCAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIudG9sZXJhdGVFcnJvcih0aGlzLmluZGV4LCB0aGlzLmxpbmVOdW1iZXIsIHRoaXMuaW5kZXggLSB0aGlzLmxpbmVTdGFydCArIDEsIG1lc3NhZ2UpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNvbW1lbnRzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5za2lwU2luZ2xlTGluZUNvbW1lbnQgPSBmdW5jdGlvbiAob2Zmc2V0KSB7XG5cdCAgICAgICAgdmFyIGNvbW1lbnRzID0gW107XG5cdCAgICAgICAgdmFyIHN0YXJ0LCBsb2M7XG5cdCAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnRzID0gW107XG5cdCAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5pbmRleCAtIG9mZnNldDtcblx0ICAgICAgICAgICAgbG9jID0ge1xuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnQgLSBvZmZzZXRcblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHt9XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuXHQgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaCkpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGxvYy5lbmQgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnQgLSAxXG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpTGluZTogZmFsc2UsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlOiBbc3RhcnQgKyBvZmZzZXQsIHRoaXMuaW5kZXggLSAxXSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IFtzdGFydCwgdGhpcy5pbmRleCAtIDFdLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBsb2M6IGxvY1xuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgY29tbWVudHMucHVzaChlbnRyeSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09IDEzICYmIHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkgPT09IDEwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gY29tbWVudHM7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgIGxvYy5lbmQgPSB7XG5cdCAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuaW5kZXggLSB0aGlzLmxpbmVTdGFydFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB2YXIgZW50cnkgPSB7XG5cdCAgICAgICAgICAgICAgICBtdWx0aUxpbmU6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgc2xpY2U6IFtzdGFydCArIG9mZnNldCwgdGhpcy5pbmRleF0sXG5cdCAgICAgICAgICAgICAgICByYW5nZTogW3N0YXJ0LCB0aGlzLmluZGV4XSxcblx0ICAgICAgICAgICAgICAgIGxvYzogbG9jXG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goZW50cnkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gY29tbWVudHM7XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2tpcE11bHRpTGluZUNvbW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNvbW1lbnRzID0gW107XG5cdCAgICAgICAgdmFyIHN0YXJ0LCBsb2M7XG5cdCAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnRzID0gW107XG5cdCAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5pbmRleCAtIDI7XG5cdCAgICAgICAgICAgIGxvYyA9IHtcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5pbmRleCAtIHRoaXMubGluZVN0YXJ0IC0gMlxuXHQgICAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgICAgIGVuZDoge31cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaCkpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gMHgwRCAmJiB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXggKyAxKSA9PT0gMHgwQSkge1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICsrdGhpcy5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAweDJBKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBCbG9jayBjb21tZW50IGVuZHMgd2l0aCAnKi8nLlxuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCArIDEpID09PSAweDJGKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCArPSAyO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBsb2MuZW5kID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlMaW5lOiB0cnVlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2U6IFtzdGFydCArIDIsIHRoaXMuaW5kZXggLSAyXSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlOiBbc3RhcnQsIHRoaXMuaW5kZXhdLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiBsb2Ncblx0ICAgICAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMucHVzaChlbnRyeSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21tZW50cztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBSYW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGZpbGUgLSB0aGUgd2hvbGUgdGhpbmcgaXMgYSBjb21tZW50XG5cdCAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgIGxvYy5lbmQgPSB7XG5cdCAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuaW5kZXggLSB0aGlzLmxpbmVTdGFydFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB2YXIgZW50cnkgPSB7XG5cdCAgICAgICAgICAgICAgICBtdWx0aUxpbmU6IHRydWUsXG5cdCAgICAgICAgICAgICAgICBzbGljZTogW3N0YXJ0ICsgMiwgdGhpcy5pbmRleF0sXG5cdCAgICAgICAgICAgICAgICByYW5nZTogW3N0YXJ0LCB0aGlzLmluZGV4XSxcblx0ICAgICAgICAgICAgICAgIGxvYzogbG9jXG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goZW50cnkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgcmV0dXJuIGNvbW1lbnRzO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5Db21tZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgY29tbWVudHM7XG5cdCAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnRzID0gW107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBzdGFydCA9ICh0aGlzLmluZGV4ID09PSAwKTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KTtcblx0ICAgICAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc1doaXRlU3BhY2UoY2gpKSB7XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2gpKSB7XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09IDB4MEQgJiYgdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSA9PT0gMHgwQSkge1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICsrdGhpcy5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgc3RhcnQgPSB0cnVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAweDJGKSB7XG5cdCAgICAgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCArIDEpO1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAweDJGKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCArPSAyO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0gdGhpcy5za2lwU2luZ2xlTGluZUNvbW1lbnQoMik7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzID0gY29tbWVudHMuY29uY2F0KGNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gMHgyQSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gMjtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY29tbWVudCA9IHRoaXMuc2tpcE11bHRpTGluZUNvbW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0NvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMgPSBjb21tZW50cy5jb25jYXQoY29tbWVudCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnQgJiYgY2ggPT09IDB4MkQpIHtcblx0ICAgICAgICAgICAgICAgIC8vIFUrMDAzRSBpcyAnPidcblx0ICAgICAgICAgICAgICAgIGlmICgodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4ICsgMSkgPT09IDB4MkQpICYmICh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXggKyAyKSA9PT0gMHgzRSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyAnLS0+JyBpcyBhIHNpbmdsZS1saW5lIGNvbW1lbnRcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDM7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSB0aGlzLnNraXBTaW5nbGVMaW5lQ29tbWVudCgzKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0NvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMgPSBjb21tZW50cy5jb25jYXQoY29tbWVudCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT09IDB4M0MgJiYgIXRoaXMuaXNNb2R1bGUpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZS5zbGljZSh0aGlzLmluZGV4ICsgMSwgdGhpcy5pbmRleCArIDQpID09PSAnIS0tJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gNDsgLy8gYDwhLS1gXG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSB0aGlzLnNraXBTaW5nbGVMaW5lQ29tbWVudCg0KTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0NvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMgPSBjb21tZW50cy5jb25jYXQoY29tbWVudCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gY29tbWVudHM7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZnV0dXJlLXJlc2VydmVkLXdvcmRzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5pc0Z1dHVyZVJlc2VydmVkV29yZCA9IGZ1bmN0aW9uIChpZCkge1xuXHQgICAgICAgIHN3aXRjaCAoaWQpIHtcblx0ICAgICAgICAgICAgY2FzZSAnZW51bSc6XG5cdCAgICAgICAgICAgIGNhc2UgJ2V4cG9ydCc6XG5cdCAgICAgICAgICAgIGNhc2UgJ2ltcG9ydCc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3N1cGVyJzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5pc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQgPSBmdW5jdGlvbiAoaWQpIHtcblx0ICAgICAgICBzd2l0Y2ggKGlkKSB7XG5cdCAgICAgICAgICAgIGNhc2UgJ2ltcGxlbWVudHMnOlxuXHQgICAgICAgICAgICBjYXNlICdpbnRlcmZhY2UnOlxuXHQgICAgICAgICAgICBjYXNlICdwYWNrYWdlJzpcblx0ICAgICAgICAgICAgY2FzZSAncHJpdmF0ZSc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3Byb3RlY3RlZCc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3B1YmxpYyc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3N0YXRpYyc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3lpZWxkJzpcblx0ICAgICAgICAgICAgY2FzZSAnbGV0Jzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5pc1Jlc3RyaWN0ZWRXb3JkID0gZnVuY3Rpb24gKGlkKSB7XG5cdCAgICAgICAgcmV0dXJuIGlkID09PSAnZXZhbCcgfHwgaWQgPT09ICdhcmd1bWVudHMnO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWtleXdvcmRzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5pc0tleXdvcmQgPSBmdW5jdGlvbiAoaWQpIHtcblx0ICAgICAgICBzd2l0Y2ggKGlkLmxlbmd0aCkge1xuXHQgICAgICAgICAgICBjYXNlIDI6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAnaWYnKSB8fCAoaWQgPT09ICdpbicpIHx8IChpZCA9PT0gJ2RvJyk7XG5cdCAgICAgICAgICAgIGNhc2UgMzpcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICd2YXInKSB8fCAoaWQgPT09ICdmb3InKSB8fCAoaWQgPT09ICduZXcnKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgIChpZCA9PT0gJ3RyeScpIHx8IChpZCA9PT0gJ2xldCcpO1xuXHQgICAgICAgICAgICBjYXNlIDQ6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAndGhpcycpIHx8IChpZCA9PT0gJ2Vsc2UnKSB8fCAoaWQgPT09ICdjYXNlJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAoaWQgPT09ICd2b2lkJykgfHwgKGlkID09PSAnd2l0aCcpIHx8IChpZCA9PT0gJ2VudW0nKTtcblx0ICAgICAgICAgICAgY2FzZSA1OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3doaWxlJykgfHwgKGlkID09PSAnYnJlYWsnKSB8fCAoaWQgPT09ICdjYXRjaCcpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKGlkID09PSAndGhyb3cnKSB8fCAoaWQgPT09ICdjb25zdCcpIHx8IChpZCA9PT0gJ3lpZWxkJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAoaWQgPT09ICdjbGFzcycpIHx8IChpZCA9PT0gJ3N1cGVyJyk7XG5cdCAgICAgICAgICAgIGNhc2UgNjpcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdyZXR1cm4nKSB8fCAoaWQgPT09ICd0eXBlb2YnKSB8fCAoaWQgPT09ICdkZWxldGUnKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgIChpZCA9PT0gJ3N3aXRjaCcpIHx8IChpZCA9PT0gJ2V4cG9ydCcpIHx8IChpZCA9PT0gJ2ltcG9ydCcpO1xuXHQgICAgICAgICAgICBjYXNlIDc6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAnZGVmYXVsdCcpIHx8IChpZCA9PT0gJ2ZpbmFsbHknKSB8fCAoaWQgPT09ICdleHRlbmRzJyk7XG5cdCAgICAgICAgICAgIGNhc2UgODpcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdmdW5jdGlvbicpIHx8IChpZCA9PT0gJ2NvbnRpbnVlJykgfHwgKGlkID09PSAnZGVidWdnZXInKTtcblx0ICAgICAgICAgICAgY2FzZSAxMDpcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdpbnN0YW5jZW9mJyk7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLmNvZGVQb2ludEF0ID0gZnVuY3Rpb24gKGkpIHtcblx0ICAgICAgICB2YXIgY3AgPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KGkpO1xuXHQgICAgICAgIGlmIChjcCA+PSAweEQ4MDAgJiYgY3AgPD0gMHhEQkZGKSB7XG5cdCAgICAgICAgICAgIHZhciBzZWNvbmQgPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KGkgKyAxKTtcblx0ICAgICAgICAgICAgaWYgKHNlY29uZCA+PSAweERDMDAgJiYgc2Vjb25kIDw9IDB4REZGRikge1xuXHQgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gY3A7XG5cdCAgICAgICAgICAgICAgICBjcCA9IChmaXJzdCAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDA7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGNwO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5IZXhFc2NhcGUgPSBmdW5jdGlvbiAocHJlZml4KSB7XG5cdCAgICAgICAgdmFyIGxlbiA9IChwcmVmaXggPT09ICd1JykgPyA0IDogMjtcblx0ICAgICAgICB2YXIgY29kZSA9IDA7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuXHQgICAgICAgICAgICBpZiAoIXRoaXMuZW9mKCkgJiYgY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSGV4RGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlICogMTYgKyBoZXhWYWx1ZSh0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5Vbmljb2RlQ29kZVBvaW50RXNjYXBlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgIHZhciBjb2RlID0gMDtcblx0ICAgICAgICAvLyBBdCBsZWFzdCwgb25lIGhleCBkaWdpdCBpcyByZXF1aXJlZC5cblx0ICAgICAgICBpZiAoY2ggPT09ICd9Jykge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgIGlmICghY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSGV4RGlnaXQoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNvZGUgPSBjb2RlICogMTYgKyBoZXhWYWx1ZShjaCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChjb2RlID4gMHgxMEZGRkYgfHwgY2ggIT09ICd9Jykge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuZnJvbUNvZGVQb2ludChjb2RlKTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5nZXRJZGVudGlmaWVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXgrKztcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KTtcblx0ICAgICAgICAgICAgaWYgKGNoID09PSAweDVDKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBCbGFja3NsYXNoIChVKzAwNUMpIG1hcmtzIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlLlxuXHQgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29tcGxleElkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjaCA+PSAweEQ4MDAgJiYgY2ggPCAweERGRkYpIHtcblx0ICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gaGFuZGxlIHN1cnJvZ2F0ZSBwYWlycy5cblx0ICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbXBsZXhJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJQYXJ0KGNoKSkge1xuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnNsaWNlKHN0YXJ0LCB0aGlzLmluZGV4KTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5nZXRDb21wbGV4SWRlbnRpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgY3AgPSB0aGlzLmNvZGVQb2ludEF0KHRoaXMuaW5kZXgpO1xuXHQgICAgICAgIHZhciBpZCA9IGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5mcm9tQ29kZVBvaW50KGNwKTtcblx0ICAgICAgICB0aGlzLmluZGV4ICs9IGlkLmxlbmd0aDtcblx0ICAgICAgICAvLyAnXFx1JyAoVSswMDVDLCBVKzAwNzUpIGRlbm90ZXMgYW4gZXNjYXBlZCBjaGFyYWN0ZXIuXG5cdCAgICAgICAgdmFyIGNoO1xuXHQgICAgICAgIGlmIChjcCA9PT0gMHg1Qykge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSAhPT0gMHg3NSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09PSAneycpIHtcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIGNoID0gdGhpcy5zY2FuVW5pY29kZUNvZGVQb2ludEVzY2FwZSgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnNjYW5IZXhFc2NhcGUoJ3UnKTtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gbnVsbCB8fCBjaCA9PT0gJ1xcXFwnIHx8ICFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyU3RhcnQoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWQgPSBjaDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIGNwID0gdGhpcy5jb2RlUG9pbnRBdCh0aGlzLmluZGV4KTtcblx0ICAgICAgICAgICAgaWYgKCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyUGFydChjcCkpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNoID0gY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmZyb21Db2RlUG9pbnQoY3ApO1xuXHQgICAgICAgICAgICBpZCArPSBjaDtcblx0ICAgICAgICAgICAgdGhpcy5pbmRleCArPSBjaC5sZW5ndGg7XG5cdCAgICAgICAgICAgIC8vICdcXHUnIChVKzAwNUMsIFUrMDA3NSkgZGVub3RlcyBhbiBlc2NhcGVkIGNoYXJhY3Rlci5cblx0ICAgICAgICAgICAgaWYgKGNwID09PSAweDVDKSB7XG5cdCAgICAgICAgICAgICAgICBpZCA9IGlkLnN1YnN0cigwLCBpZC5sZW5ndGggLSAxKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpICE9PSAweDc1KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09PSAneycpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnNjYW5Vbmljb2RlQ29kZVBvaW50RXNjYXBlKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBjaCA9IHRoaXMuc2NhbkhleEVzY2FwZSgndScpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gbnVsbCB8fCBjaCA9PT0gJ1xcXFwnIHx8ICFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyUGFydChjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWQgKz0gY2g7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGlkO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLm9jdGFsVG9EZWNpbWFsID0gZnVuY3Rpb24gKGNoKSB7XG5cdCAgICAgICAgLy8gXFwwIGlzIG5vdCBvY3RhbCBlc2NhcGUgc2VxdWVuY2Vcblx0ICAgICAgICB2YXIgb2N0YWwgPSAoY2ggIT09ICcwJyk7XG5cdCAgICAgICAgdmFyIGNvZGUgPSBvY3RhbFZhbHVlKGNoKTtcblx0ICAgICAgICBpZiAoIXRoaXMuZW9mKCkgJiYgY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzT2N0YWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICBvY3RhbCA9IHRydWU7XG5cdCAgICAgICAgICAgIGNvZGUgPSBjb2RlICogOCArIG9jdGFsVmFsdWUodGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXSk7XG5cdCAgICAgICAgICAgIC8vIDMgZGlnaXRzIGFyZSBvbmx5IGFsbG93ZWQgd2hlbiBzdHJpbmcgc3RhcnRzXG5cdCAgICAgICAgICAgIC8vIHdpdGggMCwgMSwgMiwgM1xuXHQgICAgICAgICAgICBpZiAoJzAxMjMnLmluZGV4T2YoY2gpID49IDAgJiYgIXRoaXMuZW9mKCkgJiYgY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzT2N0YWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICAgICAgY29kZSA9IGNvZGUgKiA4ICsgb2N0YWxWYWx1ZSh0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICBjb2RlOiBjb2RlLFxuXHQgICAgICAgICAgICBvY3RhbDogb2N0YWxcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW5hbWVzLWFuZC1rZXl3b3Jkc1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2NhbklkZW50aWZpZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHR5cGU7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAvLyBCYWNrc2xhc2ggKFUrMDA1Qykgc3RhcnRzIGFuIGVzY2FwZWQgY2hhcmFjdGVyLlxuXHQgICAgICAgIHZhciBpZCA9ICh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHN0YXJ0KSA9PT0gMHg1QykgPyB0aGlzLmdldENvbXBsZXhJZGVudGlmaWVyKCkgOiB0aGlzLmdldElkZW50aWZpZXIoKTtcblx0ICAgICAgICAvLyBUaGVyZSBpcyBubyBrZXl3b3JkIG9yIGxpdGVyYWwgd2l0aCBvbmx5IG9uZSBjaGFyYWN0ZXIuXG5cdCAgICAgICAgLy8gVGh1cywgaXQgbXVzdCBiZSBhbiBpZGVudGlmaWVyLlxuXHQgICAgICAgIGlmIChpZC5sZW5ndGggPT09IDEpIHtcblx0ICAgICAgICAgICAgdHlwZSA9IDMgLyogSWRlbnRpZmllciAqLztcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodGhpcy5pc0tleXdvcmQoaWQpKSB7XG5cdCAgICAgICAgICAgIHR5cGUgPSA0IC8qIEtleXdvcmQgKi87XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKGlkID09PSAnbnVsbCcpIHtcblx0ICAgICAgICAgICAgdHlwZSA9IDUgLyogTnVsbExpdGVyYWwgKi87XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKGlkID09PSAndHJ1ZScgfHwgaWQgPT09ICdmYWxzZScpIHtcblx0ICAgICAgICAgICAgdHlwZSA9IDEgLyogQm9vbGVhbkxpdGVyYWwgKi87XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0eXBlID0gMyAvKiBJZGVudGlmaWVyICovO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodHlwZSAhPT0gMyAvKiBJZGVudGlmaWVyICovICYmIChzdGFydCArIGlkLmxlbmd0aCAhPT0gdGhpcy5pbmRleCkpIHtcblx0ICAgICAgICAgICAgdmFyIHJlc3RvcmUgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkRXNjYXBlZFJlc2VydmVkV29yZCk7XG5cdCAgICAgICAgICAgIHRoaXMuaW5kZXggPSByZXN0b3JlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICB0eXBlOiB0eXBlLFxuXHQgICAgICAgICAgICB2YWx1ZTogaWQsXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXB1bmN0dWF0b3JzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuUHVuY3R1YXRvciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgIC8vIENoZWNrIGZvciBtb3N0IGNvbW1vbiBzaW5nbGUtY2hhcmFjdGVyIHB1bmN0dWF0b3JzLlxuXHQgICAgICAgIHZhciBzdHIgPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICBzd2l0Y2ggKHN0cikge1xuXHQgICAgICAgICAgICBjYXNlICcoJzpcblx0ICAgICAgICAgICAgY2FzZSAneyc6XG5cdCAgICAgICAgICAgICAgICBpZiAoc3RyID09PSAneycpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cmx5U3RhY2sucHVzaCgneycpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgJy4nOlxuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09PSAnLicgJiYgdGhpcy5zb3VyY2VbdGhpcy5pbmRleCArIDFdID09PSAnLicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBTcHJlYWQgb3BlcmF0b3I6IC4uLlxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gMjtcblx0ICAgICAgICAgICAgICAgICAgICBzdHIgPSAnLi4uJztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlICd9Jzpcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY3VybHlTdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlICcpJzpcblx0ICAgICAgICAgICAgY2FzZSAnOyc6XG5cdCAgICAgICAgICAgIGNhc2UgJywnOlxuXHQgICAgICAgICAgICBjYXNlICdbJzpcblx0ICAgICAgICAgICAgY2FzZSAnXSc6XG5cdCAgICAgICAgICAgIGNhc2UgJzonOlxuXHQgICAgICAgICAgICBjYXNlICc/Jzpcblx0ICAgICAgICAgICAgY2FzZSAnfic6XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIC8vIDQtY2hhcmFjdGVyIHB1bmN0dWF0b3IuXG5cdCAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLnNvdXJjZS5zdWJzdHIodGhpcy5pbmRleCwgNCk7XG5cdCAgICAgICAgICAgICAgICBpZiAoc3RyID09PSAnPj4+PScpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyAzLWNoYXJhY3RlciBwdW5jdHVhdG9ycy5cblx0ICAgICAgICAgICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDAsIDMpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChzdHIgPT09ICc9PT0nIHx8IHN0ciA9PT0gJyE9PScgfHwgc3RyID09PSAnPj4+JyB8fFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPT09ICc8PD0nIHx8IHN0ciA9PT0gJz4+PScgfHwgc3RyID09PSAnKio9Jykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDM7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLWNoYXJhY3RlciBwdW5jdHVhdG9ycy5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cigwLCAyKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ciA9PT0gJyYmJyB8fCBzdHIgPT09ICd8fCcgfHwgc3RyID09PSAnPT0nIHx8IHN0ciA9PT0gJyE9JyB8fFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSAnKz0nIHx8IHN0ciA9PT0gJy09JyB8fCBzdHIgPT09ICcqPScgfHwgc3RyID09PSAnLz0nIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPT09ICcrKycgfHwgc3RyID09PSAnLS0nIHx8IHN0ciA9PT0gJzw8JyB8fCBzdHIgPT09ICc+PicgfHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9PT0gJyY9JyB8fCBzdHIgPT09ICd8PScgfHwgc3RyID09PSAnXj0nIHx8IHN0ciA9PT0gJyU9JyB8fFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSAnPD0nIHx8IHN0ciA9PT0gJz49JyB8fCBzdHIgPT09ICc9PicgfHwgc3RyID09PSAnKionKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDI7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLWNoYXJhY3RlciBwdW5jdHVhdG9ycy5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCc8Pj0hKy0qJSZ8Xi8nLmluZGV4T2Yoc3RyKSA+PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5pbmRleCA9PT0gc3RhcnQpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICB0eXBlOiA3IC8qIFB1bmN0dWF0b3IgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiBzdHIsXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxpdGVyYWxzLW51bWVyaWMtbGl0ZXJhbHNcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5IZXhMaXRlcmFsID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG5cdCAgICAgICAgdmFyIG51bSA9ICcnO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBpZiAoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0hleERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBudW0gKz0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKG51bS5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogNiAvKiBOdW1lcmljTGl0ZXJhbCAqLyxcblx0ICAgICAgICAgICAgdmFsdWU6IHBhcnNlSW50KCcweCcgKyBudW0sIDE2KSxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2NhbkJpbmFyeUxpdGVyYWwgPSBmdW5jdGlvbiAoc3RhcnQpIHtcblx0ICAgICAgICB2YXIgbnVtID0gJyc7XG5cdCAgICAgICAgdmFyIGNoO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgICAgICBpZiAoY2ggIT09ICcwJyAmJiBjaCAhPT0gJzEnKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBudW0gKz0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKG51bS5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgLy8gb25seSAwYiBvciAwQlxuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG5cdCAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyU3RhcnQoY2gpIHx8IGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdChjaCkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICB0eXBlOiA2IC8qIE51bWVyaWNMaXRlcmFsICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogcGFyc2VJbnQobnVtLCAyKSxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2Nhbk9jdGFsTGl0ZXJhbCA9IGZ1bmN0aW9uIChwcmVmaXgsIHN0YXJ0KSB7XG5cdCAgICAgICAgdmFyIG51bSA9ICcnO1xuXHQgICAgICAgIHZhciBvY3RhbCA9IGZhbHNlO1xuXHQgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNPY3RhbERpZ2l0KHByZWZpeC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICBvY3RhbCA9IHRydWU7XG5cdCAgICAgICAgICAgIG51bSA9ICcwJyArIHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBpZiAoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIG51bSArPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIW9jdGFsICYmIG51bS5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgLy8gb25seSAwbyBvciAwT1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyU3RhcnQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkgfHwgY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogNiAvKiBOdW1lcmljTGl0ZXJhbCAqLyxcblx0ICAgICAgICAgICAgdmFsdWU6IHBhcnNlSW50KG51bSwgOCksXG5cdCAgICAgICAgICAgIG9jdGFsOiBvY3RhbCxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuaXNJbXBsaWNpdE9jdGFsTGl0ZXJhbCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAvLyBJbXBsaWNpdCBvY3RhbCwgdW5sZXNzIHRoZXJlIGlzIGEgbm9uLW9jdGFsIGRpZ2l0LlxuXHQgICAgICAgIC8vIChBbm5leCBCLjEuMSBvbiBOdW1lcmljIExpdGVyYWxzKVxuXHQgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmluZGV4ICsgMTsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zb3VyY2VbaV07XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gJzgnIHx8IGNoID09PSAnOScpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5OdW1lcmljTGl0ZXJhbCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlW3N0YXJ0XTtcblx0ICAgICAgICBhc3NlcnRfMS5hc3NlcnQoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpIHx8IChjaCA9PT0gJy4nKSwgJ051bWVyaWMgbGl0ZXJhbCBtdXN0IHN0YXJ0IHdpdGggYSBkZWNpbWFsIGRpZ2l0IG9yIGEgZGVjaW1hbCBwb2ludCcpO1xuXHQgICAgICAgIHZhciBudW0gPSAnJztcblx0ICAgICAgICBpZiAoY2ggIT09ICcuJykge1xuXHQgICAgICAgICAgICBudW0gPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgICAgICAvLyBIZXggbnVtYmVyIHN0YXJ0cyB3aXRoICcweCcuXG5cdCAgICAgICAgICAgIC8vIE9jdGFsIG51bWJlciBzdGFydHMgd2l0aCAnMCcuXG5cdCAgICAgICAgICAgIC8vIE9jdGFsIG51bWJlciBpbiBFUzYgc3RhcnRzIHdpdGggJzBvJy5cblx0ICAgICAgICAgICAgLy8gQmluYXJ5IG51bWJlciBpbiBFUzYgc3RhcnRzIHdpdGggJzBiJy5cblx0ICAgICAgICAgICAgaWYgKG51bSA9PT0gJzAnKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd4JyB8fCBjaCA9PT0gJ1gnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5IZXhMaXRlcmFsKHN0YXJ0KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ2InIHx8IGNoID09PSAnQicpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbkJpbmFyeUxpdGVyYWwoc3RhcnQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnbycgfHwgY2ggPT09ICdPJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5PY3RhbExpdGVyYWwoY2gsIHN0YXJ0KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChjaCAmJiBjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNPY3RhbERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbXBsaWNpdE9jdGFsTGl0ZXJhbCgpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5PY3RhbExpdGVyYWwoY2gsIHN0YXJ0KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgd2hpbGUgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICAgICAgbnVtICs9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGNoID09PSAnLicpIHtcblx0ICAgICAgICAgICAgbnVtICs9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgIHdoaWxlIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIG51bSArPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChjaCA9PT0gJ2UnIHx8IGNoID09PSAnRScpIHtcblx0ICAgICAgICAgICAgbnVtICs9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleF07XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gJysnIHx8IGNoID09PSAnLScpIHtcblx0ICAgICAgICAgICAgICAgIG51bSArPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIHdoaWxlIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBudW0gKz0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogNiAvKiBOdW1lcmljTGl0ZXJhbCAqLyxcblx0ICAgICAgICAgICAgdmFsdWU6IHBhcnNlRmxvYXQobnVtKSxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbGl0ZXJhbHMtc3RyaW5nLWxpdGVyYWxzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuU3RyaW5nTGl0ZXJhbCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgIHZhciBxdW90ZSA9IHRoaXMuc291cmNlW3N0YXJ0XTtcblx0ICAgICAgICBhc3NlcnRfMS5hc3NlcnQoKHF1b3RlID09PSAnXFwnJyB8fCBxdW90ZSA9PT0gJ1wiJyksICdTdHJpbmcgbGl0ZXJhbCBtdXN0IHN0YXJ0cyB3aXRoIGEgcXVvdGUnKTtcblx0ICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgdmFyIG9jdGFsID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIHN0ciA9ICcnO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09IHF1b3RlKSB7XG5cdCAgICAgICAgICAgICAgICBxdW90ZSA9ICcnO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT09ICdcXFxcJykge1xuXHQgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFjaCB8fCAhY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09PSAneycpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IHRoaXMuc2NhblVuaWNvZGVDb2RlUG9pbnRFc2NhcGUoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmVzY2FwZWRfMSA9IHRoaXMuc2NhbkhleEVzY2FwZShjaCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuZXNjYXBlZF8xID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IHVuZXNjYXBlZF8xO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVuZXNjYXBlZCA9IHRoaXMuc2NhbkhleEVzY2FwZShjaCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5lc2NhcGVkID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRIZXhFc2NhcGVTZXF1ZW5jZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gdW5lc2NhcGVkO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXG4nO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXHInO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXHQnO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXGInO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXGYnO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3YnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXHgwQic7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOCc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzknOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGNoO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggJiYgY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzT2N0YWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvY3RUb0RlYyA9IHRoaXMub2N0YWxUb0RlY2ltYWwoY2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jdGFsID0gb2N0VG9EZWMub2N0YWwgfHwgb2N0YWw7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUob2N0VG9EZWMuY29kZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gY2g7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09PSAnXFxuJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZVN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBzdHIgKz0gY2g7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHF1b3RlICE9PSAnJykge1xuXHQgICAgICAgICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogOCAvKiBTdHJpbmdMaXRlcmFsICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogc3RyLFxuXHQgICAgICAgICAgICBvY3RhbDogb2N0YWwsXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRlbXBsYXRlLWxpdGVyYWwtbGV4aWNhbC1jb21wb25lbnRzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuVGVtcGxhdGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNvb2tlZCA9ICcnO1xuXHQgICAgICAgIHZhciB0ZXJtaW5hdGVkID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICB2YXIgaGVhZCA9ICh0aGlzLnNvdXJjZVtzdGFydF0gPT09ICdgJyk7XG5cdCAgICAgICAgdmFyIHRhaWwgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgcmF3T2Zmc2V0ID0gMjtcblx0ICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gJ2AnKSB7XG5cdCAgICAgICAgICAgICAgICByYXdPZmZzZXQgPSAxO1xuXHQgICAgICAgICAgICAgICAgdGFpbCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAnJCcpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJseVN0YWNrLnB1c2goJyR7Jyk7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29va2VkICs9IGNoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAnXFxcXCcpIHtcblx0ICAgICAgICAgICAgICAgIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgICAgIGlmICghY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9ICdcXG4nO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9ICdcXHInO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9ICdcXHQnO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3UnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlW3RoaXMuaW5kZXhdID09PSAneycpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9IHRoaXMuc2NhblVuaWNvZGVDb2RlUG9pbnRFc2NhcGUoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN0b3JlID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5lc2NhcGVkXzIgPSB0aGlzLnNjYW5IZXhFc2NhcGUoY2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmVzY2FwZWRfMiAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29rZWQgKz0gdW5lc2NhcGVkXzI7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gcmVzdG9yZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9IGNoO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmVzY2FwZWQgPSB0aGlzLnNjYW5IZXhFc2NhcGUoY2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuZXNjYXBlZCA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkSGV4RXNjYXBlU2VxdWVuY2UpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9IHVuZXNjYXBlZDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFxiJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFxmJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFx2Jztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnMCcpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElsbGVnYWw6IFxcMDEgXFwwMiBhbmQgc28gb25cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLlRlbXBsYXRlT2N0YWxMaXRlcmFsKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9ICdcXDAnO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzT2N0YWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElsbGVnYWw6IFxcMSBcXDJcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKG1lc3NhZ2VzXzEuTWVzc2FnZXMuVGVtcGxhdGVPY3RhbExpdGVyYWwpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9IGNoO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ1xcbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ1xcbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICBjb29rZWQgKz0gJ1xcbic7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBjb29rZWQgKz0gY2g7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCF0ZXJtaW5hdGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCFoZWFkKSB7XG5cdCAgICAgICAgICAgIHRoaXMuY3VybHlTdGFjay5wb3AoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogMTAgLyogVGVtcGxhdGUgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNvdXJjZS5zbGljZShzdGFydCArIDEsIHRoaXMuaW5kZXggLSByYXdPZmZzZXQpLFxuXHQgICAgICAgICAgICBjb29rZWQ6IGNvb2tlZCxcblx0ICAgICAgICAgICAgaGVhZDogaGVhZCxcblx0ICAgICAgICAgICAgdGFpbDogdGFpbCxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbGl0ZXJhbHMtcmVndWxhci1leHByZXNzaW9uLWxpdGVyYWxzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS50ZXN0UmVnRXhwID0gZnVuY3Rpb24gKHBhdHRlcm4sIGZsYWdzKSB7XG5cdCAgICAgICAgLy8gVGhlIEJNUCBjaGFyYWN0ZXIgdG8gdXNlIGFzIGEgcmVwbGFjZW1lbnQgZm9yIGFzdHJhbCBzeW1ib2xzIHdoZW5cblx0ICAgICAgICAvLyB0cmFuc2xhdGluZyBhbiBFUzYgXCJ1XCItZmxhZ2dlZCBwYXR0ZXJuIHRvIGFuIEVTNS1jb21wYXRpYmxlXG5cdCAgICAgICAgLy8gYXBwcm94aW1hdGlvbi5cblx0ICAgICAgICAvLyBOb3RlOiByZXBsYWNpbmcgd2l0aCAnXFx1RkZGRicgZW5hYmxlcyBmYWxzZSBwb3NpdGl2ZXMgaW4gdW5saWtlbHlcblx0ICAgICAgICAvLyBzY2VuYXJpb3MuIEZvciBleGFtcGxlLCBgW1xcdXsxMDQ0Zn0tXFx1ezEwNDQwfV1gIGlzIGFuIGludmFsaWRcblx0ICAgICAgICAvLyBwYXR0ZXJuIHRoYXQgd291bGQgbm90IGJlIGRldGVjdGVkIGJ5IHRoaXMgc3Vic3RpdHV0aW9uLlxuXHQgICAgICAgIHZhciBhc3RyYWxTdWJzdGl0dXRlID0gJ1xcdUZGRkYnO1xuXHQgICAgICAgIHZhciB0bXAgPSBwYXR0ZXJuO1xuXHQgICAgICAgIHZhciBzZWxmID0gdGhpcztcblx0ICAgICAgICBpZiAoZmxhZ3MuaW5kZXhPZigndScpID49IDApIHtcblx0ICAgICAgICAgICAgdG1wID0gdG1wXG5cdCAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXHVcXHsoWzAtOWEtZkEtRl0rKVxcfXxcXFxcdShbYS1mQS1GMC05XXs0fSkvZywgZnVuY3Rpb24gKCQwLCAkMSwgJDIpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBjb2RlUG9pbnQgPSBwYXJzZUludCgkMSB8fCAkMiwgMTYpO1xuXHQgICAgICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4MTBGRkZGKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc2VsZi50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRSZWdFeHApO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8PSAweEZGRkYpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGFzdHJhbFN1YnN0aXR1dGU7XG5cdCAgICAgICAgICAgIH0pXG5cdCAgICAgICAgICAgICAgICAucmVwbGFjZSgvW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXS9nLCBhc3RyYWxTdWJzdGl0dXRlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gRmlyc3QsIGRldGVjdCBpbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgUmVnRXhwKHRtcCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkUmVnRXhwKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gUmV0dXJuIGEgcmVndWxhciBleHByZXNzaW9uIG9iamVjdCBmb3IgdGhpcyBwYXR0ZXJuLWZsYWcgcGFpciwgb3Jcblx0ICAgICAgICAvLyBgbnVsbGAgaW4gY2FzZSB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2Vzbid0IHN1cHBvcnQgdGhlIGZsYWdzIGl0XG5cdCAgICAgICAgLy8gdXNlcy5cblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuLCBmbGFncyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcblx0ICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblx0ICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5SZWdFeHBCb2R5ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgIGFzc2VydF8xLmFzc2VydChjaCA9PT0gJy8nLCAnUmVndWxhciBleHByZXNzaW9uIGxpdGVyYWwgbXVzdCBzdGFydCB3aXRoIGEgc2xhc2gnKTtcblx0ICAgICAgICB2YXIgc3RyID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICB2YXIgY2xhc3NNYXJrZXIgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgdGVybWluYXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgIHN0ciArPSBjaDtcblx0ICAgICAgICAgICAgaWYgKGNoID09PSAnXFxcXCcpIHtcblx0ICAgICAgICAgICAgICAgIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxpdGVyYWxzLXJlZ3VsYXItZXhwcmVzc2lvbi1saXRlcmFsc1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLlVudGVybWluYXRlZFJlZ0V4cCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBzdHIgKz0gY2g7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5VbnRlcm1pbmF0ZWRSZWdFeHApO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNsYXNzTWFya2VyKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNsYXNzTWFya2VyID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcvJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT09ICdbJykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNsYXNzTWFya2VyID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXRlcm1pbmF0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLlVudGVybWluYXRlZFJlZ0V4cCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIEV4Y2x1ZGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2guXG5cdCAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoMSwgc3RyLmxlbmd0aCAtIDIpO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5SZWdFeHBGbGFncyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RyID0gJyc7XG5cdCAgICAgICAgdmFyIGZsYWdzID0gJyc7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgICAgICBpZiAoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJQYXJ0KGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcXFwnICYmICF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAndScpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3RvcmUgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjaGFyID0gdGhpcy5zY2FuSGV4RXNjYXBlKCd1Jyk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXIgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgKz0gY2hhcjtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzdHIgKz0gJ1xcXFx1JzsgcmVzdG9yZSA8IHRoaXMuaW5kZXg7ICsrcmVzdG9yZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IHRoaXMuc291cmNlW3Jlc3RvcmVdO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gcmVzdG9yZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgKz0gJ3UnO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFx1Jztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcJztcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBmbGFncyArPSBjaDtcblx0ICAgICAgICAgICAgICAgIHN0ciArPSBjaDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZmxhZ3M7XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2NhblJlZ0V4cCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgIHZhciBwYXR0ZXJuID0gdGhpcy5zY2FuUmVnRXhwQm9keSgpO1xuXHQgICAgICAgIHZhciBmbGFncyA9IHRoaXMuc2NhblJlZ0V4cEZsYWdzKCk7XG5cdCAgICAgICAgdmFyIHZhbHVlID0gdGhpcy50ZXN0UmVnRXhwKHBhdHRlcm4sIGZsYWdzKTtcblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICB0eXBlOiA5IC8qIFJlZ3VsYXJFeHByZXNzaW9uICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogJycsXG5cdCAgICAgICAgICAgIHBhdHRlcm46IHBhdHRlcm4sXG5cdCAgICAgICAgICAgIGZsYWdzOiBmbGFncyxcblx0ICAgICAgICAgICAgcmVnZXg6IHZhbHVlLFxuXHQgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcblx0ICAgICAgICAgICAgZW5kOiB0aGlzLmluZGV4XG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5sZXggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgIHR5cGU6IDIgLyogRU9GICovLFxuXHQgICAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuXHQgICAgICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmluZGV4LFxuXHQgICAgICAgICAgICAgICAgZW5kOiB0aGlzLmluZGV4XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBjcCA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG5cdCAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJTdGFydChjcCkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbklkZW50aWZpZXIoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gVmVyeSBjb21tb246ICggYW5kICkgYW5kIDtcblx0ICAgICAgICBpZiAoY3AgPT09IDB4MjggfHwgY3AgPT09IDB4MjkgfHwgY3AgPT09IDB4M0IpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhblB1bmN0dWF0b3IoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gU3RyaW5nIGxpdGVyYWwgc3RhcnRzIHdpdGggc2luZ2xlIHF1b3RlIChVKzAwMjcpIG9yIGRvdWJsZSBxdW90ZSAoVSswMDIyKS5cblx0ICAgICAgICBpZiAoY3AgPT09IDB4MjcgfHwgY3AgPT09IDB4MjIpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhblN0cmluZ0xpdGVyYWwoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gRG90ICguKSBVKzAwMkUgY2FuIGFsc28gc3RhcnQgYSBmbG9hdGluZy1wb2ludCBudW1iZXIsIGhlbmNlIHRoZSBuZWVkXG5cdCAgICAgICAgLy8gdG8gY2hlY2sgdGhlIG5leHQgY2hhcmFjdGVyLlxuXHQgICAgICAgIGlmIChjcCA9PT0gMHgyRSkge1xuXHQgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCArIDEpKSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Nhbk51bWVyaWNMaXRlcmFsKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhblB1bmN0dWF0b3IoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdChjcCkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Nhbk51bWVyaWNMaXRlcmFsKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFRlbXBsYXRlIGxpdGVyYWxzIHN0YXJ0IHdpdGggYCAoVSswMDYwKSBmb3IgdGVtcGxhdGUgaGVhZFxuXHQgICAgICAgIC8vIG9yIH0gKFUrMDA3RCkgZm9yIHRlbXBsYXRlIG1pZGRsZSBvciB0ZW1wbGF0ZSB0YWlsLlxuXHQgICAgICAgIGlmIChjcCA9PT0gMHg2MCB8fCAoY3AgPT09IDB4N0QgJiYgdGhpcy5jdXJseVN0YWNrW3RoaXMuY3VybHlTdGFjay5sZW5ndGggLSAxXSA9PT0gJyR7JykpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhblRlbXBsYXRlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFBvc3NpYmxlIGlkZW50aWZpZXIgc3RhcnQgaW4gYSBzdXJyb2dhdGUgcGFpci5cblx0ICAgICAgICBpZiAoY3AgPj0gMHhEODAwICYmIGNwIDwgMHhERkZGKSB7XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyU3RhcnQodGhpcy5jb2RlUG9pbnRBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5JZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuc2NhblB1bmN0dWF0b3IoKTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gU2Nhbm5lcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5TY2FubmVyID0gU2Nhbm5lcjtcblxuXG4vKioqLyB9LFxuLyogMTMgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdGV4cG9ydHMuVG9rZW5OYW1lID0ge307XG5cdGV4cG9ydHMuVG9rZW5OYW1lWzEgLyogQm9vbGVhbkxpdGVyYWwgKi9dID0gJ0Jvb2xlYW4nO1xuXHRleHBvcnRzLlRva2VuTmFtZVsyIC8qIEVPRiAqL10gPSAnPGVuZD4nO1xuXHRleHBvcnRzLlRva2VuTmFtZVszIC8qIElkZW50aWZpZXIgKi9dID0gJ0lkZW50aWZpZXInO1xuXHRleHBvcnRzLlRva2VuTmFtZVs0IC8qIEtleXdvcmQgKi9dID0gJ0tleXdvcmQnO1xuXHRleHBvcnRzLlRva2VuTmFtZVs1IC8qIE51bGxMaXRlcmFsICovXSA9ICdOdWxsJztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbNiAvKiBOdW1lcmljTGl0ZXJhbCAqL10gPSAnTnVtZXJpYyc7XG5cdGV4cG9ydHMuVG9rZW5OYW1lWzcgLyogUHVuY3R1YXRvciAqL10gPSAnUHVuY3R1YXRvcic7XG5cdGV4cG9ydHMuVG9rZW5OYW1lWzggLyogU3RyaW5nTGl0ZXJhbCAqL10gPSAnU3RyaW5nJztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbOSAvKiBSZWd1bGFyRXhwcmVzc2lvbiAqL10gPSAnUmVndWxhckV4cHJlc3Npb24nO1xuXHRleHBvcnRzLlRva2VuTmFtZVsxMCAvKiBUZW1wbGF0ZSAqL10gPSAnVGVtcGxhdGUnO1xuXG5cbi8qKiovIH0sXG4vKiAxNCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdC8vIEdlbmVyYXRlZCBieSBnZW5lcmF0ZS14aHRtbC1lbnRpdGllcy5qcy4gRE8gTk9UIE1PRElGWSFcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHRleHBvcnRzLlhIVE1MRW50aXRpZXMgPSB7XG5cdCAgICBxdW90OiAnXFx1MDAyMicsXG5cdCAgICBhbXA6ICdcXHUwMDI2Jyxcblx0ICAgIGFwb3M6ICdcXHUwMDI3Jyxcblx0ICAgIGd0OiAnXFx1MDAzRScsXG5cdCAgICBuYnNwOiAnXFx1MDBBMCcsXG5cdCAgICBpZXhjbDogJ1xcdTAwQTEnLFxuXHQgICAgY2VudDogJ1xcdTAwQTInLFxuXHQgICAgcG91bmQ6ICdcXHUwMEEzJyxcblx0ICAgIGN1cnJlbjogJ1xcdTAwQTQnLFxuXHQgICAgeWVuOiAnXFx1MDBBNScsXG5cdCAgICBicnZiYXI6ICdcXHUwMEE2Jyxcblx0ICAgIHNlY3Q6ICdcXHUwMEE3Jyxcblx0ICAgIHVtbDogJ1xcdTAwQTgnLFxuXHQgICAgY29weTogJ1xcdTAwQTknLFxuXHQgICAgb3JkZjogJ1xcdTAwQUEnLFxuXHQgICAgbGFxdW86ICdcXHUwMEFCJyxcblx0ICAgIG5vdDogJ1xcdTAwQUMnLFxuXHQgICAgc2h5OiAnXFx1MDBBRCcsXG5cdCAgICByZWc6ICdcXHUwMEFFJyxcblx0ICAgIG1hY3I6ICdcXHUwMEFGJyxcblx0ICAgIGRlZzogJ1xcdTAwQjAnLFxuXHQgICAgcGx1c21uOiAnXFx1MDBCMScsXG5cdCAgICBzdXAyOiAnXFx1MDBCMicsXG5cdCAgICBzdXAzOiAnXFx1MDBCMycsXG5cdCAgICBhY3V0ZTogJ1xcdTAwQjQnLFxuXHQgICAgbWljcm86ICdcXHUwMEI1Jyxcblx0ICAgIHBhcmE6ICdcXHUwMEI2Jyxcblx0ICAgIG1pZGRvdDogJ1xcdTAwQjcnLFxuXHQgICAgY2VkaWw6ICdcXHUwMEI4Jyxcblx0ICAgIHN1cDE6ICdcXHUwMEI5Jyxcblx0ICAgIG9yZG06ICdcXHUwMEJBJyxcblx0ICAgIHJhcXVvOiAnXFx1MDBCQicsXG5cdCAgICBmcmFjMTQ6ICdcXHUwMEJDJyxcblx0ICAgIGZyYWMxMjogJ1xcdTAwQkQnLFxuXHQgICAgZnJhYzM0OiAnXFx1MDBCRScsXG5cdCAgICBpcXVlc3Q6ICdcXHUwMEJGJyxcblx0ICAgIEFncmF2ZTogJ1xcdTAwQzAnLFxuXHQgICAgQWFjdXRlOiAnXFx1MDBDMScsXG5cdCAgICBBY2lyYzogJ1xcdTAwQzInLFxuXHQgICAgQXRpbGRlOiAnXFx1MDBDMycsXG5cdCAgICBBdW1sOiAnXFx1MDBDNCcsXG5cdCAgICBBcmluZzogJ1xcdTAwQzUnLFxuXHQgICAgQUVsaWc6ICdcXHUwMEM2Jyxcblx0ICAgIENjZWRpbDogJ1xcdTAwQzcnLFxuXHQgICAgRWdyYXZlOiAnXFx1MDBDOCcsXG5cdCAgICBFYWN1dGU6ICdcXHUwMEM5Jyxcblx0ICAgIEVjaXJjOiAnXFx1MDBDQScsXG5cdCAgICBFdW1sOiAnXFx1MDBDQicsXG5cdCAgICBJZ3JhdmU6ICdcXHUwMENDJyxcblx0ICAgIElhY3V0ZTogJ1xcdTAwQ0QnLFxuXHQgICAgSWNpcmM6ICdcXHUwMENFJyxcblx0ICAgIEl1bWw6ICdcXHUwMENGJyxcblx0ICAgIEVUSDogJ1xcdTAwRDAnLFxuXHQgICAgTnRpbGRlOiAnXFx1MDBEMScsXG5cdCAgICBPZ3JhdmU6ICdcXHUwMEQyJyxcblx0ICAgIE9hY3V0ZTogJ1xcdTAwRDMnLFxuXHQgICAgT2NpcmM6ICdcXHUwMEQ0Jyxcblx0ICAgIE90aWxkZTogJ1xcdTAwRDUnLFxuXHQgICAgT3VtbDogJ1xcdTAwRDYnLFxuXHQgICAgdGltZXM6ICdcXHUwMEQ3Jyxcblx0ICAgIE9zbGFzaDogJ1xcdTAwRDgnLFxuXHQgICAgVWdyYXZlOiAnXFx1MDBEOScsXG5cdCAgICBVYWN1dGU6ICdcXHUwMERBJyxcblx0ICAgIFVjaXJjOiAnXFx1MDBEQicsXG5cdCAgICBVdW1sOiAnXFx1MDBEQycsXG5cdCAgICBZYWN1dGU6ICdcXHUwMEREJyxcblx0ICAgIFRIT1JOOiAnXFx1MDBERScsXG5cdCAgICBzemxpZzogJ1xcdTAwREYnLFxuXHQgICAgYWdyYXZlOiAnXFx1MDBFMCcsXG5cdCAgICBhYWN1dGU6ICdcXHUwMEUxJyxcblx0ICAgIGFjaXJjOiAnXFx1MDBFMicsXG5cdCAgICBhdGlsZGU6ICdcXHUwMEUzJyxcblx0ICAgIGF1bWw6ICdcXHUwMEU0Jyxcblx0ICAgIGFyaW5nOiAnXFx1MDBFNScsXG5cdCAgICBhZWxpZzogJ1xcdTAwRTYnLFxuXHQgICAgY2NlZGlsOiAnXFx1MDBFNycsXG5cdCAgICBlZ3JhdmU6ICdcXHUwMEU4Jyxcblx0ICAgIGVhY3V0ZTogJ1xcdTAwRTknLFxuXHQgICAgZWNpcmM6ICdcXHUwMEVBJyxcblx0ICAgIGV1bWw6ICdcXHUwMEVCJyxcblx0ICAgIGlncmF2ZTogJ1xcdTAwRUMnLFxuXHQgICAgaWFjdXRlOiAnXFx1MDBFRCcsXG5cdCAgICBpY2lyYzogJ1xcdTAwRUUnLFxuXHQgICAgaXVtbDogJ1xcdTAwRUYnLFxuXHQgICAgZXRoOiAnXFx1MDBGMCcsXG5cdCAgICBudGlsZGU6ICdcXHUwMEYxJyxcblx0ICAgIG9ncmF2ZTogJ1xcdTAwRjInLFxuXHQgICAgb2FjdXRlOiAnXFx1MDBGMycsXG5cdCAgICBvY2lyYzogJ1xcdTAwRjQnLFxuXHQgICAgb3RpbGRlOiAnXFx1MDBGNScsXG5cdCAgICBvdW1sOiAnXFx1MDBGNicsXG5cdCAgICBkaXZpZGU6ICdcXHUwMEY3Jyxcblx0ICAgIG9zbGFzaDogJ1xcdTAwRjgnLFxuXHQgICAgdWdyYXZlOiAnXFx1MDBGOScsXG5cdCAgICB1YWN1dGU6ICdcXHUwMEZBJyxcblx0ICAgIHVjaXJjOiAnXFx1MDBGQicsXG5cdCAgICB1dW1sOiAnXFx1MDBGQycsXG5cdCAgICB5YWN1dGU6ICdcXHUwMEZEJyxcblx0ICAgIHRob3JuOiAnXFx1MDBGRScsXG5cdCAgICB5dW1sOiAnXFx1MDBGRicsXG5cdCAgICBPRWxpZzogJ1xcdTAxNTInLFxuXHQgICAgb2VsaWc6ICdcXHUwMTUzJyxcblx0ICAgIFNjYXJvbjogJ1xcdTAxNjAnLFxuXHQgICAgc2Nhcm9uOiAnXFx1MDE2MScsXG5cdCAgICBZdW1sOiAnXFx1MDE3OCcsXG5cdCAgICBmbm9mOiAnXFx1MDE5MicsXG5cdCAgICBjaXJjOiAnXFx1MDJDNicsXG5cdCAgICB0aWxkZTogJ1xcdTAyREMnLFxuXHQgICAgQWxwaGE6ICdcXHUwMzkxJyxcblx0ICAgIEJldGE6ICdcXHUwMzkyJyxcblx0ICAgIEdhbW1hOiAnXFx1MDM5MycsXG5cdCAgICBEZWx0YTogJ1xcdTAzOTQnLFxuXHQgICAgRXBzaWxvbjogJ1xcdTAzOTUnLFxuXHQgICAgWmV0YTogJ1xcdTAzOTYnLFxuXHQgICAgRXRhOiAnXFx1MDM5NycsXG5cdCAgICBUaGV0YTogJ1xcdTAzOTgnLFxuXHQgICAgSW90YTogJ1xcdTAzOTknLFxuXHQgICAgS2FwcGE6ICdcXHUwMzlBJyxcblx0ICAgIExhbWJkYTogJ1xcdTAzOUInLFxuXHQgICAgTXU6ICdcXHUwMzlDJyxcblx0ICAgIE51OiAnXFx1MDM5RCcsXG5cdCAgICBYaTogJ1xcdTAzOUUnLFxuXHQgICAgT21pY3JvbjogJ1xcdTAzOUYnLFxuXHQgICAgUGk6ICdcXHUwM0EwJyxcblx0ICAgIFJobzogJ1xcdTAzQTEnLFxuXHQgICAgU2lnbWE6ICdcXHUwM0EzJyxcblx0ICAgIFRhdTogJ1xcdTAzQTQnLFxuXHQgICAgVXBzaWxvbjogJ1xcdTAzQTUnLFxuXHQgICAgUGhpOiAnXFx1MDNBNicsXG5cdCAgICBDaGk6ICdcXHUwM0E3Jyxcblx0ICAgIFBzaTogJ1xcdTAzQTgnLFxuXHQgICAgT21lZ2E6ICdcXHUwM0E5Jyxcblx0ICAgIGFscGhhOiAnXFx1MDNCMScsXG5cdCAgICBiZXRhOiAnXFx1MDNCMicsXG5cdCAgICBnYW1tYTogJ1xcdTAzQjMnLFxuXHQgICAgZGVsdGE6ICdcXHUwM0I0Jyxcblx0ICAgIGVwc2lsb246ICdcXHUwM0I1Jyxcblx0ICAgIHpldGE6ICdcXHUwM0I2Jyxcblx0ICAgIGV0YTogJ1xcdTAzQjcnLFxuXHQgICAgdGhldGE6ICdcXHUwM0I4Jyxcblx0ICAgIGlvdGE6ICdcXHUwM0I5Jyxcblx0ICAgIGthcHBhOiAnXFx1MDNCQScsXG5cdCAgICBsYW1iZGE6ICdcXHUwM0JCJyxcblx0ICAgIG11OiAnXFx1MDNCQycsXG5cdCAgICBudTogJ1xcdTAzQkQnLFxuXHQgICAgeGk6ICdcXHUwM0JFJyxcblx0ICAgIG9taWNyb246ICdcXHUwM0JGJyxcblx0ICAgIHBpOiAnXFx1MDNDMCcsXG5cdCAgICByaG86ICdcXHUwM0MxJyxcblx0ICAgIHNpZ21hZjogJ1xcdTAzQzInLFxuXHQgICAgc2lnbWE6ICdcXHUwM0MzJyxcblx0ICAgIHRhdTogJ1xcdTAzQzQnLFxuXHQgICAgdXBzaWxvbjogJ1xcdTAzQzUnLFxuXHQgICAgcGhpOiAnXFx1MDNDNicsXG5cdCAgICBjaGk6ICdcXHUwM0M3Jyxcblx0ICAgIHBzaTogJ1xcdTAzQzgnLFxuXHQgICAgb21lZ2E6ICdcXHUwM0M5Jyxcblx0ICAgIHRoZXRhc3ltOiAnXFx1MDNEMScsXG5cdCAgICB1cHNpaDogJ1xcdTAzRDInLFxuXHQgICAgcGl2OiAnXFx1MDNENicsXG5cdCAgICBlbnNwOiAnXFx1MjAwMicsXG5cdCAgICBlbXNwOiAnXFx1MjAwMycsXG5cdCAgICB0aGluc3A6ICdcXHUyMDA5Jyxcblx0ICAgIHp3bmo6ICdcXHUyMDBDJyxcblx0ICAgIHp3ajogJ1xcdTIwMEQnLFxuXHQgICAgbHJtOiAnXFx1MjAwRScsXG5cdCAgICBybG06ICdcXHUyMDBGJyxcblx0ICAgIG5kYXNoOiAnXFx1MjAxMycsXG5cdCAgICBtZGFzaDogJ1xcdTIwMTQnLFxuXHQgICAgbHNxdW86ICdcXHUyMDE4Jyxcblx0ICAgIHJzcXVvOiAnXFx1MjAxOScsXG5cdCAgICBzYnF1bzogJ1xcdTIwMUEnLFxuXHQgICAgbGRxdW86ICdcXHUyMDFDJyxcblx0ICAgIHJkcXVvOiAnXFx1MjAxRCcsXG5cdCAgICBiZHF1bzogJ1xcdTIwMUUnLFxuXHQgICAgZGFnZ2VyOiAnXFx1MjAyMCcsXG5cdCAgICBEYWdnZXI6ICdcXHUyMDIxJyxcblx0ICAgIGJ1bGw6ICdcXHUyMDIyJyxcblx0ICAgIGhlbGxpcDogJ1xcdTIwMjYnLFxuXHQgICAgcGVybWlsOiAnXFx1MjAzMCcsXG5cdCAgICBwcmltZTogJ1xcdTIwMzInLFxuXHQgICAgUHJpbWU6ICdcXHUyMDMzJyxcblx0ICAgIGxzYXF1bzogJ1xcdTIwMzknLFxuXHQgICAgcnNhcXVvOiAnXFx1MjAzQScsXG5cdCAgICBvbGluZTogJ1xcdTIwM0UnLFxuXHQgICAgZnJhc2w6ICdcXHUyMDQ0Jyxcblx0ICAgIGV1cm86ICdcXHUyMEFDJyxcblx0ICAgIGltYWdlOiAnXFx1MjExMScsXG5cdCAgICB3ZWllcnA6ICdcXHUyMTE4Jyxcblx0ICAgIHJlYWw6ICdcXHUyMTFDJyxcblx0ICAgIHRyYWRlOiAnXFx1MjEyMicsXG5cdCAgICBhbGVmc3ltOiAnXFx1MjEzNScsXG5cdCAgICBsYXJyOiAnXFx1MjE5MCcsXG5cdCAgICB1YXJyOiAnXFx1MjE5MScsXG5cdCAgICByYXJyOiAnXFx1MjE5MicsXG5cdCAgICBkYXJyOiAnXFx1MjE5MycsXG5cdCAgICBoYXJyOiAnXFx1MjE5NCcsXG5cdCAgICBjcmFycjogJ1xcdTIxQjUnLFxuXHQgICAgbEFycjogJ1xcdTIxRDAnLFxuXHQgICAgdUFycjogJ1xcdTIxRDEnLFxuXHQgICAgckFycjogJ1xcdTIxRDInLFxuXHQgICAgZEFycjogJ1xcdTIxRDMnLFxuXHQgICAgaEFycjogJ1xcdTIxRDQnLFxuXHQgICAgZm9yYWxsOiAnXFx1MjIwMCcsXG5cdCAgICBwYXJ0OiAnXFx1MjIwMicsXG5cdCAgICBleGlzdDogJ1xcdTIyMDMnLFxuXHQgICAgZW1wdHk6ICdcXHUyMjA1Jyxcblx0ICAgIG5hYmxhOiAnXFx1MjIwNycsXG5cdCAgICBpc2luOiAnXFx1MjIwOCcsXG5cdCAgICBub3RpbjogJ1xcdTIyMDknLFxuXHQgICAgbmk6ICdcXHUyMjBCJyxcblx0ICAgIHByb2Q6ICdcXHUyMjBGJyxcblx0ICAgIHN1bTogJ1xcdTIyMTEnLFxuXHQgICAgbWludXM6ICdcXHUyMjEyJyxcblx0ICAgIGxvd2FzdDogJ1xcdTIyMTcnLFxuXHQgICAgcmFkaWM6ICdcXHUyMjFBJyxcblx0ICAgIHByb3A6ICdcXHUyMjFEJyxcblx0ICAgIGluZmluOiAnXFx1MjIxRScsXG5cdCAgICBhbmc6ICdcXHUyMjIwJyxcblx0ICAgIGFuZDogJ1xcdTIyMjcnLFxuXHQgICAgb3I6ICdcXHUyMjI4Jyxcblx0ICAgIGNhcDogJ1xcdTIyMjknLFxuXHQgICAgY3VwOiAnXFx1MjIyQScsXG5cdCAgICBpbnQ6ICdcXHUyMjJCJyxcblx0ICAgIHRoZXJlNDogJ1xcdTIyMzQnLFxuXHQgICAgc2ltOiAnXFx1MjIzQycsXG5cdCAgICBjb25nOiAnXFx1MjI0NScsXG5cdCAgICBhc3ltcDogJ1xcdTIyNDgnLFxuXHQgICAgbmU6ICdcXHUyMjYwJyxcblx0ICAgIGVxdWl2OiAnXFx1MjI2MScsXG5cdCAgICBsZTogJ1xcdTIyNjQnLFxuXHQgICAgZ2U6ICdcXHUyMjY1Jyxcblx0ICAgIHN1YjogJ1xcdTIyODInLFxuXHQgICAgc3VwOiAnXFx1MjI4MycsXG5cdCAgICBuc3ViOiAnXFx1MjI4NCcsXG5cdCAgICBzdWJlOiAnXFx1MjI4NicsXG5cdCAgICBzdXBlOiAnXFx1MjI4NycsXG5cdCAgICBvcGx1czogJ1xcdTIyOTUnLFxuXHQgICAgb3RpbWVzOiAnXFx1MjI5NycsXG5cdCAgICBwZXJwOiAnXFx1MjJBNScsXG5cdCAgICBzZG90OiAnXFx1MjJDNScsXG5cdCAgICBsY2VpbDogJ1xcdTIzMDgnLFxuXHQgICAgcmNlaWw6ICdcXHUyMzA5Jyxcblx0ICAgIGxmbG9vcjogJ1xcdTIzMEEnLFxuXHQgICAgcmZsb29yOiAnXFx1MjMwQicsXG5cdCAgICBsb3o6ICdcXHUyNUNBJyxcblx0ICAgIHNwYWRlczogJ1xcdTI2NjAnLFxuXHQgICAgY2x1YnM6ICdcXHUyNjYzJyxcblx0ICAgIGhlYXJ0czogJ1xcdTI2NjUnLFxuXHQgICAgZGlhbXM6ICdcXHUyNjY2Jyxcblx0ICAgIGxhbmc6ICdcXHUyN0U4Jyxcblx0ICAgIHJhbmc6ICdcXHUyN0U5J1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAxNSAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIGVycm9yX2hhbmRsZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXHR2YXIgc2Nhbm5lcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cdHZhciB0b2tlbl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMyk7XG5cdHZhciBSZWFkZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gUmVhZGVyKCkge1xuXHQgICAgICAgIHRoaXMudmFsdWVzID0gW107XG5cdCAgICAgICAgdGhpcy5jdXJseSA9IHRoaXMucGFyZW4gPSAtMTtcblx0ICAgIH1cblx0ICAgIC8vIEEgZnVuY3Rpb24gZm9sbG93aW5nIG9uZSBvZiB0aG9zZSB0b2tlbnMgaXMgYW4gZXhwcmVzc2lvbi5cblx0ICAgIFJlYWRlci5wcm90b3R5cGUuYmVmb3JlRnVuY3Rpb25FeHByZXNzaW9uID0gZnVuY3Rpb24gKHQpIHtcblx0ICAgICAgICByZXR1cm4gWycoJywgJ3snLCAnWycsICdpbicsICd0eXBlb2YnLCAnaW5zdGFuY2VvZicsICduZXcnLFxuXHQgICAgICAgICAgICAncmV0dXJuJywgJ2Nhc2UnLCAnZGVsZXRlJywgJ3Rocm93JywgJ3ZvaWQnLFxuXHQgICAgICAgICAgICAvLyBhc3NpZ25tZW50IG9wZXJhdG9yc1xuXHQgICAgICAgICAgICAnPScsICcrPScsICctPScsICcqPScsICcqKj0nLCAnLz0nLCAnJT0nLCAnPDw9JywgJz4+PScsICc+Pj49Jyxcblx0ICAgICAgICAgICAgJyY9JywgJ3w9JywgJ149JywgJywnLFxuXHQgICAgICAgICAgICAvLyBiaW5hcnkvdW5hcnkgb3BlcmF0b3JzXG5cdCAgICAgICAgICAgICcrJywgJy0nLCAnKicsICcqKicsICcvJywgJyUnLCAnKysnLCAnLS0nLCAnPDwnLCAnPj4nLCAnPj4+JywgJyYnLFxuXHQgICAgICAgICAgICAnfCcsICdeJywgJyEnLCAnficsICcmJicsICd8fCcsICc/JywgJzonLCAnPT09JywgJz09JywgJz49Jyxcblx0ICAgICAgICAgICAgJzw9JywgJzwnLCAnPicsICchPScsICchPT0nXS5pbmRleE9mKHQpID49IDA7XG5cdCAgICB9O1xuXHQgICAgLy8gRGV0ZXJtaW5lIGlmIGZvcndhcmQgc2xhc2ggKC8pIGlzIGFuIG9wZXJhdG9yIG9yIHBhcnQgb2YgYSByZWd1bGFyIGV4cHJlc3Npb25cblx0ICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3N3ZWV0LmpzL3dpa2kvZGVzaWduXG5cdCAgICBSZWFkZXIucHJvdG90eXBlLmlzUmVnZXhTdGFydCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgcHJldmlvdXMgPSB0aGlzLnZhbHVlc1t0aGlzLnZhbHVlcy5sZW5ndGggLSAxXTtcblx0ICAgICAgICB2YXIgcmVnZXggPSAocHJldmlvdXMgIT09IG51bGwpO1xuXHQgICAgICAgIHN3aXRjaCAocHJldmlvdXMpIHtcblx0ICAgICAgICAgICAgY2FzZSAndGhpcyc6XG5cdCAgICAgICAgICAgIGNhc2UgJ10nOlxuXHQgICAgICAgICAgICAgICAgcmVnZXggPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlICcpJzpcblx0ICAgICAgICAgICAgICAgIHZhciBrZXl3b3JkID0gdGhpcy52YWx1ZXNbdGhpcy5wYXJlbiAtIDFdO1xuXHQgICAgICAgICAgICAgICAgcmVnZXggPSAoa2V5d29yZCA9PT0gJ2lmJyB8fCBrZXl3b3JkID09PSAnd2hpbGUnIHx8IGtleXdvcmQgPT09ICdmb3InIHx8IGtleXdvcmQgPT09ICd3aXRoJyk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAnfSc6XG5cdCAgICAgICAgICAgICAgICAvLyBEaXZpZGluZyBhIGZ1bmN0aW9uIGJ5IGFueXRoaW5nIG1ha2VzIGxpdHRsZSBzZW5zZSxcblx0ICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIHRvIGNoZWNrIGZvciB0aGF0LlxuXHQgICAgICAgICAgICAgICAgcmVnZXggPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlc1t0aGlzLmN1cmx5IC0gM10gPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBBbm9ueW1vdXMgZnVuY3Rpb24sIGUuZy4gZnVuY3Rpb24oKXt9IC80MlxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjaGVjayA9IHRoaXMudmFsdWVzW3RoaXMuY3VybHkgLSA0XTtcblx0ICAgICAgICAgICAgICAgICAgICByZWdleCA9IGNoZWNrID8gIXRoaXMuYmVmb3JlRnVuY3Rpb25FeHByZXNzaW9uKGNoZWNrKSA6IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52YWx1ZXNbdGhpcy5jdXJseSAtIDRdID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gTmFtZWQgZnVuY3Rpb24sIGUuZy4gZnVuY3Rpb24gZigpe30gLzQyL1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjaGVjayA9IHRoaXMudmFsdWVzW3RoaXMuY3VybHkgLSA1XTtcblx0ICAgICAgICAgICAgICAgICAgICByZWdleCA9IGNoZWNrID8gIXRoaXMuYmVmb3JlRnVuY3Rpb25FeHByZXNzaW9uKGNoZWNrKSA6IHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmVnZXg7XG5cdCAgICB9O1xuXHQgICAgUmVhZGVyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyB8fCB0b2tlbi50eXBlID09PSA0IC8qIEtleXdvcmQgKi8pIHtcblx0ICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlID09PSAneycpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY3VybHkgPSB0aGlzLnZhbHVlcy5sZW5ndGg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udmFsdWUgPT09ICcoJykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5wYXJlbiA9IHRoaXMudmFsdWVzLmxlbmd0aDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLnZhbHVlcy5wdXNoKHRva2VuLnZhbHVlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMudmFsdWVzLnB1c2gobnVsbCk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIHJldHVybiBSZWFkZXI7XG5cdH0oKSk7XG5cdHZhciBUb2tlbml6ZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVG9rZW5pemVyKGNvZGUsIGNvbmZpZykge1xuXHQgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gbmV3IGVycm9yX2hhbmRsZXJfMS5FcnJvckhhbmRsZXIoKTtcblx0ICAgICAgICB0aGlzLmVycm9ySGFuZGxlci50b2xlcmFudCA9IGNvbmZpZyA/ICh0eXBlb2YgY29uZmlnLnRvbGVyYW50ID09PSAnYm9vbGVhbicgJiYgY29uZmlnLnRvbGVyYW50KSA6IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lciA9IG5ldyBzY2FubmVyXzEuU2Nhbm5lcihjb2RlLCB0aGlzLmVycm9ySGFuZGxlcik7XG5cdCAgICAgICAgdGhpcy5zY2FubmVyLnRyYWNrQ29tbWVudCA9IGNvbmZpZyA/ICh0eXBlb2YgY29uZmlnLmNvbW1lbnQgPT09ICdib29sZWFuJyAmJiBjb25maWcuY29tbWVudCkgOiBmYWxzZTtcblx0ICAgICAgICB0aGlzLnRyYWNrUmFuZ2UgPSBjb25maWcgPyAodHlwZW9mIGNvbmZpZy5yYW5nZSA9PT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5yYW5nZSkgOiBmYWxzZTtcblx0ICAgICAgICB0aGlzLnRyYWNrTG9jID0gY29uZmlnID8gKHR5cGVvZiBjb25maWcubG9jID09PSAnYm9vbGVhbicgJiYgY29uZmlnLmxvYykgOiBmYWxzZTtcblx0ICAgICAgICB0aGlzLmJ1ZmZlciA9IFtdO1xuXHQgICAgICAgIHRoaXMucmVhZGVyID0gbmV3IFJlYWRlcigpO1xuXHQgICAgfVxuXHQgICAgVG9rZW5pemVyLnByb3RvdHlwZS5lcnJvcnMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLmVycm9ycztcblx0ICAgIH07XG5cdCAgICBUb2tlbml6ZXIucHJvdG90eXBlLmdldE5leHRUb2tlbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgIHZhciBjb21tZW50cyA9IHRoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci50cmFja0NvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyArK2kpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGNvbW1lbnRzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuc2Nhbm5lci5zb3VyY2Uuc2xpY2UoZS5zbGljZVswXSwgZS5zbGljZVsxXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGUubXVsdGlMaW5lID8gJ0Jsb2NrQ29tbWVudCcgOiAnTGluZUNvbW1lbnQnLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrUmFuZ2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudC5yYW5nZSA9IGUucmFuZ2U7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrTG9jKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQubG9jID0gZS5sb2M7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2goY29tbWVudCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKCF0aGlzLnNjYW5uZXIuZW9mKCkpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBsb2MgPSB2b2lkIDA7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0xvYykge1xuXHQgICAgICAgICAgICAgICAgICAgIGxvYyA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVuZDoge31cblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdmFyIHN0YXJ0UmVnZXggPSAodGhpcy5zY2FubmVyLnNvdXJjZVt0aGlzLnNjYW5uZXIuaW5kZXhdID09PSAnLycpICYmIHRoaXMucmVhZGVyLmlzUmVnZXhTdGFydCgpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gc3RhcnRSZWdleCA/IHRoaXMuc2Nhbm5lci5zY2FuUmVnRXhwKCkgOiB0aGlzLnNjYW5uZXIubGV4KCk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnJlYWRlci5wdXNoKHRva2VuKTtcblx0ICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHtcblx0ICAgICAgICAgICAgICAgICAgICB0eXBlOiB0b2tlbl8xLlRva2VuTmFtZVt0b2tlbi50eXBlXSxcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5zY2FubmVyLnNvdXJjZS5zbGljZSh0b2tlbi5zdGFydCwgdG9rZW4uZW5kKVxuXHQgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrUmFuZ2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICBlbnRyeS5yYW5nZSA9IFt0b2tlbi5zdGFydCwgdG9rZW4uZW5kXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrTG9jKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbG9jLmVuZCA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydFxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgZW50cnkubG9jID0gbG9jO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09IDkgLyogUmVndWxhckV4cHJlc3Npb24gKi8pIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcGF0dGVybiA9IHRva2VuLnBhdHRlcm47XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGZsYWdzID0gdG9rZW4uZmxhZ3M7XG5cdCAgICAgICAgICAgICAgICAgICAgZW50cnkucmVnZXggPSB7IHBhdHRlcm46IHBhdHRlcm4sIGZsYWdzOiBmbGFncyB9O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5idWZmZXIucHVzaChlbnRyeSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLnNoaWZ0KCk7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRva2VuaXplcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5Ub2tlbml6ZXIgPSBUb2tlbml6ZXI7XG5cblxuLyoqKi8gfVxuLyoqKioqKi8gXSlcbn0pO1xuOyIsIi8qXG4gIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIEFyaXlhIEhpZGF5YXQgPGFyaXlhLmhpZGF5YXRAZ21haWwuY29tPlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG4vKmpzbGludCB2YXJzOmZhbHNlLCBiaXR3aXNlOnRydWUqL1xuLypqc2hpbnQgaW5kZW50OjQqL1xuLypnbG9iYWwgZXhwb3J0czp0cnVlKi9cbihmdW5jdGlvbiBjbG9uZShleHBvcnRzKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIFN5bnRheCxcbiAgICAgICAgVmlzaXRvck9wdGlvbixcbiAgICAgICAgVmlzaXRvcktleXMsXG4gICAgICAgIEJSRUFLLFxuICAgICAgICBTS0lQLFxuICAgICAgICBSRU1PVkU7XG5cbiAgICBmdW5jdGlvbiBkZWVwQ29weShvYmopIHtcbiAgICAgICAgdmFyIHJldCA9IHt9LCBrZXksIHZhbDtcbiAgICAgICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBvYmpba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFtrZXldID0gZGVlcENvcHkodmFsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvLyBiYXNlZCBvbiBMTFZNIGxpYmMrKyB1cHBlcl9ib3VuZCAvIGxvd2VyX2JvdW5kXG4gICAgLy8gTUlUIExpY2Vuc2VcblxuICAgIGZ1bmN0aW9uIHVwcGVyQm91bmQoYXJyYXksIGZ1bmMpIHtcbiAgICAgICAgdmFyIGRpZmYsIGxlbiwgaSwgY3VycmVudDtcblxuICAgICAgICBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIGkgPSAwO1xuXG4gICAgICAgIHdoaWxlIChsZW4pIHtcbiAgICAgICAgICAgIGRpZmYgPSBsZW4gPj4+IDE7XG4gICAgICAgICAgICBjdXJyZW50ID0gaSArIGRpZmY7XG4gICAgICAgICAgICBpZiAoZnVuYyhhcnJheVtjdXJyZW50XSkpIHtcbiAgICAgICAgICAgICAgICBsZW4gPSBkaWZmO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpID0gY3VycmVudCArIDE7XG4gICAgICAgICAgICAgICAgbGVuIC09IGRpZmYgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIFN5bnRheCA9IHtcbiAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb246ICdBc3NpZ25tZW50RXhwcmVzc2lvbicsXG4gICAgICAgIEFzc2lnbm1lbnRQYXR0ZXJuOiAnQXNzaWdubWVudFBhdHRlcm4nLFxuICAgICAgICBBcnJheUV4cHJlc3Npb246ICdBcnJheUV4cHJlc3Npb24nLFxuICAgICAgICBBcnJheVBhdHRlcm46ICdBcnJheVBhdHRlcm4nLFxuICAgICAgICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJyxcbiAgICAgICAgQXdhaXRFeHByZXNzaW9uOiAnQXdhaXRFeHByZXNzaW9uJywgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIEJsb2NrU3RhdGVtZW50OiAnQmxvY2tTdGF0ZW1lbnQnLFxuICAgICAgICBCaW5hcnlFeHByZXNzaW9uOiAnQmluYXJ5RXhwcmVzc2lvbicsXG4gICAgICAgIEJyZWFrU3RhdGVtZW50OiAnQnJlYWtTdGF0ZW1lbnQnLFxuICAgICAgICBDYWxsRXhwcmVzc2lvbjogJ0NhbGxFeHByZXNzaW9uJyxcbiAgICAgICAgQ2F0Y2hDbGF1c2U6ICdDYXRjaENsYXVzZScsXG4gICAgICAgIENoYWluRXhwcmVzc2lvbjogJ0NoYWluRXhwcmVzc2lvbicsXG4gICAgICAgIENsYXNzQm9keTogJ0NsYXNzQm9keScsXG4gICAgICAgIENsYXNzRGVjbGFyYXRpb246ICdDbGFzc0RlY2xhcmF0aW9uJyxcbiAgICAgICAgQ2xhc3NFeHByZXNzaW9uOiAnQ2xhc3NFeHByZXNzaW9uJyxcbiAgICAgICAgQ29tcHJlaGVuc2lvbkJsb2NrOiAnQ29tcHJlaGVuc2lvbkJsb2NrJywgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBDb21wcmVoZW5zaW9uRXhwcmVzc2lvbjogJ0NvbXByZWhlbnNpb25FeHByZXNzaW9uJywgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb246ICdDb25kaXRpb25hbEV4cHJlc3Npb24nLFxuICAgICAgICBDb250aW51ZVN0YXRlbWVudDogJ0NvbnRpbnVlU3RhdGVtZW50JyxcbiAgICAgICAgRGVidWdnZXJTdGF0ZW1lbnQ6ICdEZWJ1Z2dlclN0YXRlbWVudCcsXG4gICAgICAgIERpcmVjdGl2ZVN0YXRlbWVudDogJ0RpcmVjdGl2ZVN0YXRlbWVudCcsXG4gICAgICAgIERvV2hpbGVTdGF0ZW1lbnQ6ICdEb1doaWxlU3RhdGVtZW50JyxcbiAgICAgICAgRW1wdHlTdGF0ZW1lbnQ6ICdFbXB0eVN0YXRlbWVudCcsXG4gICAgICAgIEV4cG9ydEFsbERlY2xhcmF0aW9uOiAnRXhwb3J0QWxsRGVjbGFyYXRpb24nLFxuICAgICAgICBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb246ICdFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24nLFxuICAgICAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uOiAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbicsXG4gICAgICAgIEV4cG9ydFNwZWNpZmllcjogJ0V4cG9ydFNwZWNpZmllcicsXG4gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQ6ICdFeHByZXNzaW9uU3RhdGVtZW50JyxcbiAgICAgICAgRm9yU3RhdGVtZW50OiAnRm9yU3RhdGVtZW50JyxcbiAgICAgICAgRm9ySW5TdGF0ZW1lbnQ6ICdGb3JJblN0YXRlbWVudCcsXG4gICAgICAgIEZvck9mU3RhdGVtZW50OiAnRm9yT2ZTdGF0ZW1lbnQnLFxuICAgICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiAnRnVuY3Rpb25EZWNsYXJhdGlvbicsXG4gICAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogJ0Z1bmN0aW9uRXhwcmVzc2lvbicsXG4gICAgICAgIEdlbmVyYXRvckV4cHJlc3Npb246ICdHZW5lcmF0b3JFeHByZXNzaW9uJywgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBJZGVudGlmaWVyOiAnSWRlbnRpZmllcicsXG4gICAgICAgIElmU3RhdGVtZW50OiAnSWZTdGF0ZW1lbnQnLFxuICAgICAgICBJbXBvcnRFeHByZXNzaW9uOiAnSW1wb3J0RXhwcmVzc2lvbicsXG4gICAgICAgIEltcG9ydERlY2xhcmF0aW9uOiAnSW1wb3J0RGVjbGFyYXRpb24nLFxuICAgICAgICBJbXBvcnREZWZhdWx0U3BlY2lmaWVyOiAnSW1wb3J0RGVmYXVsdFNwZWNpZmllcicsXG4gICAgICAgIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogJ0ltcG9ydE5hbWVzcGFjZVNwZWNpZmllcicsXG4gICAgICAgIEltcG9ydFNwZWNpZmllcjogJ0ltcG9ydFNwZWNpZmllcicsXG4gICAgICAgIExpdGVyYWw6ICdMaXRlcmFsJyxcbiAgICAgICAgTGFiZWxlZFN0YXRlbWVudDogJ0xhYmVsZWRTdGF0ZW1lbnQnLFxuICAgICAgICBMb2dpY2FsRXhwcmVzc2lvbjogJ0xvZ2ljYWxFeHByZXNzaW9uJyxcbiAgICAgICAgTWVtYmVyRXhwcmVzc2lvbjogJ01lbWJlckV4cHJlc3Npb24nLFxuICAgICAgICBNZXRhUHJvcGVydHk6ICdNZXRhUHJvcGVydHknLFxuICAgICAgICBNZXRob2REZWZpbml0aW9uOiAnTWV0aG9kRGVmaW5pdGlvbicsXG4gICAgICAgIE1vZHVsZVNwZWNpZmllcjogJ01vZHVsZVNwZWNpZmllcicsXG4gICAgICAgIE5ld0V4cHJlc3Npb246ICdOZXdFeHByZXNzaW9uJyxcbiAgICAgICAgT2JqZWN0RXhwcmVzc2lvbjogJ09iamVjdEV4cHJlc3Npb24nLFxuICAgICAgICBPYmplY3RQYXR0ZXJuOiAnT2JqZWN0UGF0dGVybicsXG4gICAgICAgIFByaXZhdGVJZGVudGlmaWVyOiAnUHJpdmF0ZUlkZW50aWZpZXInLFxuICAgICAgICBQcm9ncmFtOiAnUHJvZ3JhbScsXG4gICAgICAgIFByb3BlcnR5OiAnUHJvcGVydHknLFxuICAgICAgICBQcm9wZXJ0eURlZmluaXRpb246ICdQcm9wZXJ0eURlZmluaXRpb24nLFxuICAgICAgICBSZXN0RWxlbWVudDogJ1Jlc3RFbGVtZW50JyxcbiAgICAgICAgUmV0dXJuU3RhdGVtZW50OiAnUmV0dXJuU3RhdGVtZW50JyxcbiAgICAgICAgU2VxdWVuY2VFeHByZXNzaW9uOiAnU2VxdWVuY2VFeHByZXNzaW9uJyxcbiAgICAgICAgU3ByZWFkRWxlbWVudDogJ1NwcmVhZEVsZW1lbnQnLFxuICAgICAgICBTdXBlcjogJ1N1cGVyJyxcbiAgICAgICAgU3dpdGNoU3RhdGVtZW50OiAnU3dpdGNoU3RhdGVtZW50JyxcbiAgICAgICAgU3dpdGNoQ2FzZTogJ1N3aXRjaENhc2UnLFxuICAgICAgICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246ICdUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24nLFxuICAgICAgICBUZW1wbGF0ZUVsZW1lbnQ6ICdUZW1wbGF0ZUVsZW1lbnQnLFxuICAgICAgICBUZW1wbGF0ZUxpdGVyYWw6ICdUZW1wbGF0ZUxpdGVyYWwnLFxuICAgICAgICBUaGlzRXhwcmVzc2lvbjogJ1RoaXNFeHByZXNzaW9uJyxcbiAgICAgICAgVGhyb3dTdGF0ZW1lbnQ6ICdUaHJvd1N0YXRlbWVudCcsXG4gICAgICAgIFRyeVN0YXRlbWVudDogJ1RyeVN0YXRlbWVudCcsXG4gICAgICAgIFVuYXJ5RXhwcmVzc2lvbjogJ1VuYXJ5RXhwcmVzc2lvbicsXG4gICAgICAgIFVwZGF0ZUV4cHJlc3Npb246ICdVcGRhdGVFeHByZXNzaW9uJyxcbiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbjogJ1ZhcmlhYmxlRGVjbGFyYXRpb24nLFxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3I6ICdWYXJpYWJsZURlY2xhcmF0b3InLFxuICAgICAgICBXaGlsZVN0YXRlbWVudDogJ1doaWxlU3RhdGVtZW50JyxcbiAgICAgICAgV2l0aFN0YXRlbWVudDogJ1dpdGhTdGF0ZW1lbnQnLFxuICAgICAgICBZaWVsZEV4cHJlc3Npb246ICdZaWVsZEV4cHJlc3Npb24nXG4gICAgfTtcblxuICAgIFZpc2l0b3JLZXlzID0ge1xuICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbjogWydsZWZ0JywgJ3JpZ2h0J10sXG4gICAgICAgIEFzc2lnbm1lbnRQYXR0ZXJuOiBbJ2xlZnQnLCAncmlnaHQnXSxcbiAgICAgICAgQXJyYXlFeHByZXNzaW9uOiBbJ2VsZW1lbnRzJ10sXG4gICAgICAgIEFycmF5UGF0dGVybjogWydlbGVtZW50cyddLFxuICAgICAgICBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjogWydwYXJhbXMnLCAnYm9keSddLFxuICAgICAgICBBd2FpdEV4cHJlc3Npb246IFsnYXJndW1lbnQnXSwgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIEJsb2NrU3RhdGVtZW50OiBbJ2JvZHknXSxcbiAgICAgICAgQmluYXJ5RXhwcmVzc2lvbjogWydsZWZ0JywgJ3JpZ2h0J10sXG4gICAgICAgIEJyZWFrU3RhdGVtZW50OiBbJ2xhYmVsJ10sXG4gICAgICAgIENhbGxFeHByZXNzaW9uOiBbJ2NhbGxlZScsICdhcmd1bWVudHMnXSxcbiAgICAgICAgQ2F0Y2hDbGF1c2U6IFsncGFyYW0nLCAnYm9keSddLFxuICAgICAgICBDaGFpbkV4cHJlc3Npb246IFsnZXhwcmVzc2lvbiddLFxuICAgICAgICBDbGFzc0JvZHk6IFsnYm9keSddLFxuICAgICAgICBDbGFzc0RlY2xhcmF0aW9uOiBbJ2lkJywgJ3N1cGVyQ2xhc3MnLCAnYm9keSddLFxuICAgICAgICBDbGFzc0V4cHJlc3Npb246IFsnaWQnLCAnc3VwZXJDbGFzcycsICdib2R5J10sXG4gICAgICAgIENvbXByZWhlbnNpb25CbG9jazogWydsZWZ0JywgJ3JpZ2h0J10sICAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgQ29tcHJlaGVuc2lvbkV4cHJlc3Npb246IFsnYmxvY2tzJywgJ2ZpbHRlcicsICdib2R5J10sICAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uOiBbJ3Rlc3QnLCAnY29uc2VxdWVudCcsICdhbHRlcm5hdGUnXSxcbiAgICAgICAgQ29udGludWVTdGF0ZW1lbnQ6IFsnbGFiZWwnXSxcbiAgICAgICAgRGVidWdnZXJTdGF0ZW1lbnQ6IFtdLFxuICAgICAgICBEaXJlY3RpdmVTdGF0ZW1lbnQ6IFtdLFxuICAgICAgICBEb1doaWxlU3RhdGVtZW50OiBbJ2JvZHknLCAndGVzdCddLFxuICAgICAgICBFbXB0eVN0YXRlbWVudDogW10sXG4gICAgICAgIEV4cG9ydEFsbERlY2xhcmF0aW9uOiBbJ3NvdXJjZSddLFxuICAgICAgICBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb246IFsnZGVjbGFyYXRpb24nXSxcbiAgICAgICAgRXhwb3J0TmFtZWREZWNsYXJhdGlvbjogWydkZWNsYXJhdGlvbicsICdzcGVjaWZpZXJzJywgJ3NvdXJjZSddLFxuICAgICAgICBFeHBvcnRTcGVjaWZpZXI6IFsnZXhwb3J0ZWQnLCAnbG9jYWwnXSxcbiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudDogWydleHByZXNzaW9uJ10sXG4gICAgICAgIEZvclN0YXRlbWVudDogWydpbml0JywgJ3Rlc3QnLCAndXBkYXRlJywgJ2JvZHknXSxcbiAgICAgICAgRm9ySW5TdGF0ZW1lbnQ6IFsnbGVmdCcsICdyaWdodCcsICdib2R5J10sXG4gICAgICAgIEZvck9mU3RhdGVtZW50OiBbJ2xlZnQnLCAncmlnaHQnLCAnYm9keSddLFxuICAgICAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiBbJ2lkJywgJ3BhcmFtcycsICdib2R5J10sXG4gICAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogWydpZCcsICdwYXJhbXMnLCAnYm9keSddLFxuICAgICAgICBHZW5lcmF0b3JFeHByZXNzaW9uOiBbJ2Jsb2NrcycsICdmaWx0ZXInLCAnYm9keSddLCAgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIElkZW50aWZpZXI6IFtdLFxuICAgICAgICBJZlN0YXRlbWVudDogWyd0ZXN0JywgJ2NvbnNlcXVlbnQnLCAnYWx0ZXJuYXRlJ10sXG4gICAgICAgIEltcG9ydEV4cHJlc3Npb246IFsnc291cmNlJ10sXG4gICAgICAgIEltcG9ydERlY2xhcmF0aW9uOiBbJ3NwZWNpZmllcnMnLCAnc291cmNlJ10sXG4gICAgICAgIEltcG9ydERlZmF1bHRTcGVjaWZpZXI6IFsnbG9jYWwnXSxcbiAgICAgICAgSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyOiBbJ2xvY2FsJ10sXG4gICAgICAgIEltcG9ydFNwZWNpZmllcjogWydpbXBvcnRlZCcsICdsb2NhbCddLFxuICAgICAgICBMaXRlcmFsOiBbXSxcbiAgICAgICAgTGFiZWxlZFN0YXRlbWVudDogWydsYWJlbCcsICdib2R5J10sXG4gICAgICAgIExvZ2ljYWxFeHByZXNzaW9uOiBbJ2xlZnQnLCAncmlnaHQnXSxcbiAgICAgICAgTWVtYmVyRXhwcmVzc2lvbjogWydvYmplY3QnLCAncHJvcGVydHknXSxcbiAgICAgICAgTWV0YVByb3BlcnR5OiBbJ21ldGEnLCAncHJvcGVydHknXSxcbiAgICAgICAgTWV0aG9kRGVmaW5pdGlvbjogWydrZXknLCAndmFsdWUnXSxcbiAgICAgICAgTW9kdWxlU3BlY2lmaWVyOiBbXSxcbiAgICAgICAgTmV3RXhwcmVzc2lvbjogWydjYWxsZWUnLCAnYXJndW1lbnRzJ10sXG4gICAgICAgIE9iamVjdEV4cHJlc3Npb246IFsncHJvcGVydGllcyddLFxuICAgICAgICBPYmplY3RQYXR0ZXJuOiBbJ3Byb3BlcnRpZXMnXSxcbiAgICAgICAgUHJpdmF0ZUlkZW50aWZpZXI6IFtdLFxuICAgICAgICBQcm9ncmFtOiBbJ2JvZHknXSxcbiAgICAgICAgUHJvcGVydHk6IFsna2V5JywgJ3ZhbHVlJ10sXG4gICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjogWydrZXknLCAndmFsdWUnXSxcbiAgICAgICAgUmVzdEVsZW1lbnQ6IFsgJ2FyZ3VtZW50JyBdLFxuICAgICAgICBSZXR1cm5TdGF0ZW1lbnQ6IFsnYXJndW1lbnQnXSxcbiAgICAgICAgU2VxdWVuY2VFeHByZXNzaW9uOiBbJ2V4cHJlc3Npb25zJ10sXG4gICAgICAgIFNwcmVhZEVsZW1lbnQ6IFsnYXJndW1lbnQnXSxcbiAgICAgICAgU3VwZXI6IFtdLFxuICAgICAgICBTd2l0Y2hTdGF0ZW1lbnQ6IFsnZGlzY3JpbWluYW50JywgJ2Nhc2VzJ10sXG4gICAgICAgIFN3aXRjaENhc2U6IFsndGVzdCcsICdjb25zZXF1ZW50J10sXG4gICAgICAgIFRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbjogWyd0YWcnLCAncXVhc2knXSxcbiAgICAgICAgVGVtcGxhdGVFbGVtZW50OiBbXSxcbiAgICAgICAgVGVtcGxhdGVMaXRlcmFsOiBbJ3F1YXNpcycsICdleHByZXNzaW9ucyddLFxuICAgICAgICBUaGlzRXhwcmVzc2lvbjogW10sXG4gICAgICAgIFRocm93U3RhdGVtZW50OiBbJ2FyZ3VtZW50J10sXG4gICAgICAgIFRyeVN0YXRlbWVudDogWydibG9jaycsICdoYW5kbGVyJywgJ2ZpbmFsaXplciddLFxuICAgICAgICBVbmFyeUV4cHJlc3Npb246IFsnYXJndW1lbnQnXSxcbiAgICAgICAgVXBkYXRlRXhwcmVzc2lvbjogWydhcmd1bWVudCddLFxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0aW9uOiBbJ2RlY2xhcmF0aW9ucyddLFxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3I6IFsnaWQnLCAnaW5pdCddLFxuICAgICAgICBXaGlsZVN0YXRlbWVudDogWyd0ZXN0JywgJ2JvZHknXSxcbiAgICAgICAgV2l0aFN0YXRlbWVudDogWydvYmplY3QnLCAnYm9keSddLFxuICAgICAgICBZaWVsZEV4cHJlc3Npb246IFsnYXJndW1lbnQnXVxuICAgIH07XG5cbiAgICAvLyB1bmlxdWUgaWRcbiAgICBCUkVBSyA9IHt9O1xuICAgIFNLSVAgPSB7fTtcbiAgICBSRU1PVkUgPSB7fTtcblxuICAgIFZpc2l0b3JPcHRpb24gPSB7XG4gICAgICAgIEJyZWFrOiBCUkVBSyxcbiAgICAgICAgU2tpcDogU0tJUCxcbiAgICAgICAgUmVtb3ZlOiBSRU1PVkVcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gUmVmZXJlbmNlKHBhcmVudCwga2V5KSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICB9XG5cbiAgICBSZWZlcmVuY2UucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbiByZXBsYWNlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRbdGhpcy5rZXldID0gbm9kZTtcbiAgICB9O1xuXG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMucGFyZW50KSkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuc3BsaWNlKHRoaXMua2V5LCAxKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlKG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIEVsZW1lbnQobm9kZSwgcGF0aCwgd3JhcCwgcmVmKSB7XG4gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMud3JhcCA9IHdyYXA7XG4gICAgICAgIHRoaXMucmVmID0gcmVmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIENvbnRyb2xsZXIoKSB7IH1cblxuICAgIC8vIEFQSTpcbiAgICAvLyByZXR1cm4gcHJvcGVydHkgcGF0aCBhcnJheSBmcm9tIHJvb3QgdG8gY3VycmVudCBub2RlXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUucGF0aCA9IGZ1bmN0aW9uIHBhdGgoKSB7XG4gICAgICAgIHZhciBpLCBpeiwgaiwganosIHJlc3VsdCwgZWxlbWVudDtcblxuICAgICAgICBmdW5jdGlvbiBhZGRUb1BhdGgocmVzdWx0LCBwYXRoKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IDAsIGp6ID0gcGF0aC5sZW5ndGg7IGogPCBqejsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhdGhbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyByb290IG5vZGVcbiAgICAgICAgaWYgKCF0aGlzLl9fY3VycmVudC5wYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpcnN0IG5vZGUgaXMgc2VudGluZWwsIHNlY29uZCBub2RlIGlzIHJvb3QgZWxlbWVudFxuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMiwgaXogPSB0aGlzLl9fbGVhdmVsaXN0Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzLl9fbGVhdmVsaXN0W2ldO1xuICAgICAgICAgICAgYWRkVG9QYXRoKHJlc3VsdCwgZWxlbWVudC5wYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRUb1BhdGgocmVzdWx0LCB0aGlzLl9fY3VycmVudC5wYXRoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHJldHVybiB0eXBlIG9mIGN1cnJlbnQgbm9kZVxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5jdXJyZW50KCk7XG4gICAgICAgIHJldHVybiBub2RlLnR5cGUgfHwgdGhpcy5fX2N1cnJlbnQud3JhcDtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHJldHVybiBhcnJheSBvZiBwYXJlbnQgZWxlbWVudHNcbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5wYXJlbnRzID0gZnVuY3Rpb24gcGFyZW50cygpIHtcbiAgICAgICAgdmFyIGksIGl6LCByZXN1bHQ7XG5cbiAgICAgICAgLy8gZmlyc3Qgbm9kZSBpcyBzZW50aW5lbFxuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMSwgaXogPSB0aGlzLl9fbGVhdmVsaXN0Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuX19sZWF2ZWxpc3RbaV0ubm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gcmV0dXJuIGN1cnJlbnQgbm9kZVxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLmN1cnJlbnQgPSBmdW5jdGlvbiBjdXJyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fX2N1cnJlbnQubm9kZTtcbiAgICB9O1xuXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUuX19leGVjdXRlID0gZnVuY3Rpb24gX19leGVjdXRlKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgICAgIHZhciBwcmV2aW91cywgcmVzdWx0O1xuXG4gICAgICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcblxuICAgICAgICBwcmV2aW91cyAgPSB0aGlzLl9fY3VycmVudDtcbiAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLl9fc3RhdGUgPSBudWxsO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNhbGxiYWNrLmNhbGwodGhpcywgZWxlbWVudC5ub2RlLCB0aGlzLl9fbGVhdmVsaXN0W3RoaXMuX19sZWF2ZWxpc3QubGVuZ3RoIC0gMV0ubm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSBwcmV2aW91cztcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gbm90aWZ5IGNvbnRyb2wgc2tpcCAvIGJyZWFrXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUubm90aWZ5ID0gZnVuY3Rpb24gbm90aWZ5KGZsYWcpIHtcbiAgICAgICAgdGhpcy5fX3N0YXRlID0gZmxhZztcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHNraXAgY2hpbGQgbm9kZXMgb2YgY3VycmVudCBub2RlXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ub3RpZnkoU0tJUCk7XG4gICAgfTtcblxuICAgIC8vIEFQSTpcbiAgICAvLyBicmVhayB0cmF2ZXJzYWxzXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGVbJ2JyZWFrJ10gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubm90aWZ5KEJSRUFLKTtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHJlbW92ZSBub2RlXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm5vdGlmeShSRU1PVkUpO1xuICAgIH07XG5cbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5fX2luaXRpYWxpemUgPSBmdW5jdGlvbihyb290LCB2aXNpdG9yKSB7XG4gICAgICAgIHRoaXMudmlzaXRvciA9IHZpc2l0b3I7XG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgICAgIHRoaXMuX193b3JrbGlzdCA9IFtdO1xuICAgICAgICB0aGlzLl9fbGVhdmVsaXN0ID0gW107XG4gICAgICAgIHRoaXMuX19jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fX3N0YXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fX2ZhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgaWYgKHZpc2l0b3IuZmFsbGJhY2sgPT09ICdpdGVyYXRpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9fZmFsbGJhY2sgPSBPYmplY3Qua2V5cztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmlzaXRvci5mYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fX2ZhbGxiYWNrID0gdmlzaXRvci5mYWxsYmFjaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX19rZXlzID0gVmlzaXRvcktleXM7XG4gICAgICAgIGlmICh2aXNpdG9yLmtleXMpIHtcbiAgICAgICAgICAgIHRoaXMuX19rZXlzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHRoaXMuX19rZXlzKSwgdmlzaXRvci5rZXlzKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBpc05vZGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiB0eXBlb2Ygbm9kZS50eXBlID09PSAnc3RyaW5nJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Byb3BlcnR5KG5vZGVUeXBlLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIChub2RlVHlwZSA9PT0gU3ludGF4Lk9iamVjdEV4cHJlc3Npb24gfHwgbm9kZVR5cGUgPT09IFN5bnRheC5PYmplY3RQYXR0ZXJuKSAmJiAncHJvcGVydGllcycgPT09IGtleTtcbiAgICB9XG4gIFxuICAgIGZ1bmN0aW9uIGNhbmRpZGF0ZUV4aXN0c0luTGVhdmVMaXN0KGxlYXZlbGlzdCwgY2FuZGlkYXRlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBsZWF2ZWxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGlmIChsZWF2ZWxpc3RbaV0ubm9kZSA9PT0gY2FuZGlkYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnRyYXZlcnNlID0gZnVuY3Rpb24gdHJhdmVyc2Uocm9vdCwgdmlzaXRvcikge1xuICAgICAgICB2YXIgd29ya2xpc3QsXG4gICAgICAgICAgICBsZWF2ZWxpc3QsXG4gICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG5vZGVUeXBlLFxuICAgICAgICAgICAgcmV0LFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIGN1cnJlbnQyLFxuICAgICAgICAgICAgY2FuZGlkYXRlcyxcbiAgICAgICAgICAgIGNhbmRpZGF0ZSxcbiAgICAgICAgICAgIHNlbnRpbmVsO1xuXG4gICAgICAgIHRoaXMuX19pbml0aWFsaXplKHJvb3QsIHZpc2l0b3IpO1xuXG4gICAgICAgIHNlbnRpbmVsID0ge307XG5cbiAgICAgICAgLy8gcmVmZXJlbmNlXG4gICAgICAgIHdvcmtsaXN0ID0gdGhpcy5fX3dvcmtsaXN0O1xuICAgICAgICBsZWF2ZWxpc3QgPSB0aGlzLl9fbGVhdmVsaXN0O1xuXG4gICAgICAgIC8vIGluaXRpYWxpemVcbiAgICAgICAgd29ya2xpc3QucHVzaChuZXcgRWxlbWVudChyb290LCBudWxsLCBudWxsLCBudWxsKSk7XG4gICAgICAgIGxlYXZlbGlzdC5wdXNoKG5ldyBFbGVtZW50KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTtcblxuICAgICAgICB3aGlsZSAod29ya2xpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gd29ya2xpc3QucG9wKCk7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09PSBzZW50aW5lbCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBsZWF2ZWxpc3QucG9wKCk7XG5cbiAgICAgICAgICAgICAgICByZXQgPSB0aGlzLl9fZXhlY3V0ZSh2aXNpdG9yLmxlYXZlLCBlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IEJSRUFLIHx8IHJldCA9PT0gQlJFQUspIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZSkge1xuXG4gICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5fX2V4ZWN1dGUodmlzaXRvci5lbnRlciwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBCUkVBSyB8fCByZXQgPT09IEJSRUFLKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB3b3JrbGlzdC5wdXNoKHNlbnRpbmVsKTtcbiAgICAgICAgICAgICAgICBsZWF2ZWxpc3QucHVzaChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IFNLSVAgfHwgcmV0ID09PSBTS0lQKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG5vZGUgPSBlbGVtZW50Lm5vZGU7XG4gICAgICAgICAgICAgICAgbm9kZVR5cGUgPSBub2RlLnR5cGUgfHwgZWxlbWVudC53cmFwO1xuICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSB0aGlzLl9fa2V5c1tub2RlVHlwZV07XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fZmFsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSB0aGlzLl9fZmFsbGJhY2sobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlICcgKyBub2RlVHlwZSArICcuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50IC09IDEpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gY2FuZGlkYXRlc1tjdXJyZW50XTtcbiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gbm9kZVtrZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50MiA9IGNhbmRpZGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnQyIC09IDEpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbmRpZGF0ZVtjdXJyZW50Ml0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZUV4aXN0c0luTGVhdmVMaXN0KGxlYXZlbGlzdCwgY2FuZGlkYXRlW2N1cnJlbnQyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1Byb3BlcnR5KG5vZGVUeXBlLCBjYW5kaWRhdGVzW2N1cnJlbnRdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoY2FuZGlkYXRlW2N1cnJlbnQyXSwgW2tleSwgY3VycmVudDJdLCAnUHJvcGVydHknLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZShjYW5kaWRhdGVbY3VycmVudDJdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoY2FuZGlkYXRlW2N1cnJlbnQyXSwgW2tleSwgY3VycmVudDJdLCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc05vZGUoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZUV4aXN0c0luTGVhdmVMaXN0KGxlYXZlbGlzdCwgY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChuZXcgRWxlbWVudChjYW5kaWRhdGUsIGtleSwgbnVsbCwgbnVsbCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbiByZXBsYWNlKHJvb3QsIHZpc2l0b3IpIHtcbiAgICAgICAgdmFyIHdvcmtsaXN0LFxuICAgICAgICAgICAgbGVhdmVsaXN0LFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIG5vZGVUeXBlLFxuICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICBjdXJyZW50MixcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMsXG4gICAgICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgICAgICBzZW50aW5lbCxcbiAgICAgICAgICAgIG91dGVyLFxuICAgICAgICAgICAga2V5O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlbW92ZUVsZW0oZWxlbWVudCkge1xuICAgICAgICAgICAgdmFyIGksXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIG5leHRFbGVtLFxuICAgICAgICAgICAgICAgIHBhcmVudDtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQucmVmLnJlbW92ZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgcmVmZXJlbmNlIGlzIGFuIGVsZW1lbnQgb2YgYW4gYXJyYXkuXG4gICAgICAgICAgICAgICAga2V5ID0gZWxlbWVudC5yZWYua2V5O1xuICAgICAgICAgICAgICAgIHBhcmVudCA9IGVsZW1lbnQucmVmLnBhcmVudDtcblxuICAgICAgICAgICAgICAgIC8vIElmIHJlbW92ZWQgZnJvbSBhcnJheSwgdGhlbiBkZWNyZWFzZSBmb2xsb3dpbmcgaXRlbXMnIGtleXMuXG4gICAgICAgICAgICAgICAgaSA9IHdvcmtsaXN0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRFbGVtID0gd29ya2xpc3RbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0RWxlbS5yZWYgJiYgbmV4dEVsZW0ucmVmLnBhcmVudCA9PT0gcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAgKG5leHRFbGVtLnJlZi5rZXkgPCBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC0tbmV4dEVsZW0ucmVmLmtleTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX19pbml0aWFsaXplKHJvb3QsIHZpc2l0b3IpO1xuXG4gICAgICAgIHNlbnRpbmVsID0ge307XG5cbiAgICAgICAgLy8gcmVmZXJlbmNlXG4gICAgICAgIHdvcmtsaXN0ID0gdGhpcy5fX3dvcmtsaXN0O1xuICAgICAgICBsZWF2ZWxpc3QgPSB0aGlzLl9fbGVhdmVsaXN0O1xuXG4gICAgICAgIC8vIGluaXRpYWxpemVcbiAgICAgICAgb3V0ZXIgPSB7XG4gICAgICAgICAgICByb290OiByb290XG4gICAgICAgIH07XG4gICAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudChyb290LCBudWxsLCBudWxsLCBuZXcgUmVmZXJlbmNlKG91dGVyLCAncm9vdCcpKTtcbiAgICAgICAgd29ya2xpc3QucHVzaChlbGVtZW50KTtcbiAgICAgICAgbGVhdmVsaXN0LnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgd2hpbGUgKHdvcmtsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHdvcmtsaXN0LnBvcCgpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gc2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gbGVhdmVsaXN0LnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy5fX2V4ZWN1dGUodmlzaXRvci5sZWF2ZSwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAvLyBub2RlIG1heSBiZSByZXBsYWNlZCB3aXRoIG51bGwsXG4gICAgICAgICAgICAgICAgLy8gc28gZGlzdGluZ3Vpc2ggYmV0d2VlbiB1bmRlZmluZWQgYW5kIG51bGwgaW4gdGhpcyBwbGFjZVxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQgIT09IEJSRUFLICYmIHRhcmdldCAhPT0gU0tJUCAmJiB0YXJnZXQgIT09IFJFTU9WRSkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVmLnJlcGxhY2UodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBSRU1PVkUgfHwgdGFyZ2V0ID09PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRWxlbShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBCUkVBSyB8fCB0YXJnZXQgPT09IEJSRUFLKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRlci5yb290O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFyZ2V0ID0gdGhpcy5fX2V4ZWN1dGUodmlzaXRvci5lbnRlciwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIG5vZGUgbWF5IGJlIHJlcGxhY2VkIHdpdGggbnVsbCxcbiAgICAgICAgICAgIC8vIHNvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdW5kZWZpbmVkIGFuZCBudWxsIGluIHRoaXMgcGxhY2VcbiAgICAgICAgICAgIGlmICh0YXJnZXQgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQgIT09IEJSRUFLICYmIHRhcmdldCAhPT0gU0tJUCAmJiB0YXJnZXQgIT09IFJFTU9WRSkge1xuICAgICAgICAgICAgICAgIC8vIHJlcGxhY2VcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlZi5yZXBsYWNlKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5ub2RlID0gdGFyZ2V0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBSRU1PVkUgfHwgdGFyZ2V0ID09PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVFbGVtKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQubm9kZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IEJSRUFLIHx8IHRhcmdldCA9PT0gQlJFQUspIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0ZXIucm9vdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbm9kZSBtYXkgYmUgbnVsbFxuICAgICAgICAgICAgbm9kZSA9IGVsZW1lbnQubm9kZTtcbiAgICAgICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3b3JrbGlzdC5wdXNoKHNlbnRpbmVsKTtcbiAgICAgICAgICAgIGxlYXZlbGlzdC5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBTS0lQIHx8IHRhcmdldCA9PT0gU0tJUCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBub2RlVHlwZSA9IG5vZGUudHlwZSB8fCBlbGVtZW50LndyYXA7XG4gICAgICAgICAgICBjYW5kaWRhdGVzID0gdGhpcy5fX2tleXNbbm9kZVR5cGVdO1xuICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19mYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gdGhpcy5fX2ZhbGxiYWNrKG5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBub2RlIHR5cGUgJyArIG5vZGVUeXBlICsgJy4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjYW5kaWRhdGVzLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlICgoY3VycmVudCAtPSAxKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gY2FuZGlkYXRlc1tjdXJyZW50XTtcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBub2RlW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50MiA9IGNhbmRpZGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoY3VycmVudDIgLT0gMSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGVbY3VycmVudDJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcm9wZXJ0eShub2RlVHlwZSwgY2FuZGlkYXRlc1tjdXJyZW50XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoY2FuZGlkYXRlW2N1cnJlbnQyXSwgW2tleSwgY3VycmVudDJdLCAnUHJvcGVydHknLCBuZXcgUmVmZXJlbmNlKGNhbmRpZGF0ZSwgY3VycmVudDIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlKGNhbmRpZGF0ZVtjdXJyZW50Ml0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGNhbmRpZGF0ZVtjdXJyZW50Ml0sIFtrZXksIGN1cnJlbnQyXSwgbnVsbCwgbmV3IFJlZmVyZW5jZShjYW5kaWRhdGUsIGN1cnJlbnQyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChuZXcgRWxlbWVudChjYW5kaWRhdGUsIGtleSwgbnVsbCwgbmV3IFJlZmVyZW5jZShub2RlLCBrZXkpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dGVyLnJvb3Q7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIHRyYXZlcnNlKHJvb3QsIHZpc2l0b3IpIHtcbiAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcigpO1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci50cmF2ZXJzZShyb290LCB2aXNpdG9yKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJvb3QsIHZpc2l0b3IpIHtcbiAgICAgICAgdmFyIGNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcigpO1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5yZXBsYWNlKHJvb3QsIHZpc2l0b3IpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dGVuZENvbW1lbnRSYW5nZShjb21tZW50LCB0b2tlbnMpIHtcbiAgICAgICAgdmFyIHRhcmdldDtcblxuICAgICAgICB0YXJnZXQgPSB1cHBlckJvdW5kKHRva2VucywgZnVuY3Rpb24gc2VhcmNoKHRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9rZW4ucmFuZ2VbMF0gPiBjb21tZW50LnJhbmdlWzBdO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb21tZW50LmV4dGVuZGVkUmFuZ2UgPSBbY29tbWVudC5yYW5nZVswXSwgY29tbWVudC5yYW5nZVsxXV07XG5cbiAgICAgICAgaWYgKHRhcmdldCAhPT0gdG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgY29tbWVudC5leHRlbmRlZFJhbmdlWzFdID0gdG9rZW5zW3RhcmdldF0ucmFuZ2VbMF07XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXQgLT0gMTtcbiAgICAgICAgaWYgKHRhcmdldCA+PSAwKSB7XG4gICAgICAgICAgICBjb21tZW50LmV4dGVuZGVkUmFuZ2VbMF0gPSB0b2tlbnNbdGFyZ2V0XS5yYW5nZVsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21tZW50O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGF0dGFjaENvbW1lbnRzKHRyZWUsIHByb3ZpZGVkQ29tbWVudHMsIHRva2Vucykge1xuICAgICAgICAvLyBBdCBmaXJzdCwgd2Ugc2hvdWxkIGNhbGN1bGF0ZSBleHRlbmRlZCBjb21tZW50IHJhbmdlcy5cbiAgICAgICAgdmFyIGNvbW1lbnRzID0gW10sIGNvbW1lbnQsIGxlbiwgaSwgY3Vyc29yO1xuXG4gICAgICAgIGlmICghdHJlZS5yYW5nZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdHRhY2hDb21tZW50cyBuZWVkcyByYW5nZSBpbmZvcm1hdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG9rZW5zIGFycmF5IGlzIGVtcHR5LCB3ZSBhdHRhY2ggY29tbWVudHMgdG8gdHJlZSBhcyAnbGVhZGluZ0NvbW1lbnRzJ1xuICAgICAgICBpZiAoIXRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChwcm92aWRlZENvbW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHByb3ZpZGVkQ29tbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGRlZXBDb3B5KHByb3ZpZGVkQ29tbWVudHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50LmV4dGVuZGVkUmFuZ2UgPSBbMCwgdHJlZS5yYW5nZVswXV07XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyZWUubGVhZGluZ0NvbW1lbnRzID0gY29tbWVudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJlZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHByb3ZpZGVkQ29tbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goZXh0ZW5kQ29tbWVudFJhbmdlKGRlZXBDb3B5KHByb3ZpZGVkQ29tbWVudHNbaV0pLCB0b2tlbnMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgaXMgYmFzZWQgb24gSm9obiBGcmVlbWFuJ3MgaW1wbGVtZW50YXRpb24uXG4gICAgICAgIGN1cnNvciA9IDA7XG4gICAgICAgIHRyYXZlcnNlKHRyZWUsIHtcbiAgICAgICAgICAgIGVudGVyOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb21tZW50O1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvciA8IGNvbW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudHNbY3Vyc29yXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQuZXh0ZW5kZWRSYW5nZVsxXSA+IG5vZGUucmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQuZXh0ZW5kZWRSYW5nZVsxXSA9PT0gbm9kZS5yYW5nZVswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubGVhZGluZ0NvbW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlYWRpbmdDb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMuc3BsaWNlKGN1cnNvciwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgb3V0IG9mIG93bmVkIG5vZGVcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID09PSBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2l0b3JPcHRpb24uQnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzW2N1cnNvcl0uZXh0ZW5kZWRSYW5nZVswXSA+IG5vZGUucmFuZ2VbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2l0b3JPcHRpb24uU2tpcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGN1cnNvciA9IDA7XG4gICAgICAgIHRyYXZlcnNlKHRyZWUsIHtcbiAgICAgICAgICAgIGxlYXZlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb21tZW50O1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvciA8IGNvbW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudHNbY3Vyc29yXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUucmFuZ2VbMV0gPCBjb21tZW50LmV4dGVuZGVkUmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUucmFuZ2VbMV0gPT09IGNvbW1lbnQuZXh0ZW5kZWRSYW5nZVswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLnRyYWlsaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnRyYWlsaW5nQ29tbWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudHJhaWxpbmdDb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMuc3BsaWNlKGN1cnNvciwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgb3V0IG9mIG93bmVkIG5vZGVcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID09PSBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2l0b3JPcHRpb24uQnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzW2N1cnNvcl0uZXh0ZW5kZWRSYW5nZVswXSA+IG5vZGUucmFuZ2VbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2l0b3JPcHRpb24uU2tpcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0cmVlO1xuICAgIH1cblxuICAgIGV4cG9ydHMuU3ludGF4ID0gU3ludGF4O1xuICAgIGV4cG9ydHMudHJhdmVyc2UgPSB0cmF2ZXJzZTtcbiAgICBleHBvcnRzLnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIGV4cG9ydHMuYXR0YWNoQ29tbWVudHMgPSBhdHRhY2hDb21tZW50cztcbiAgICBleHBvcnRzLlZpc2l0b3JLZXlzID0gVmlzaXRvcktleXM7XG4gICAgZXhwb3J0cy5WaXNpdG9yT3B0aW9uID0gVmlzaXRvck9wdGlvbjtcbiAgICBleHBvcnRzLkNvbnRyb2xsZXIgPSBDb250cm9sbGVyO1xuICAgIGV4cG9ydHMuY2xvbmVFbnZpcm9ubWVudCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNsb25lKHt9KTsgfTtcblxuICAgIHJldHVybiBleHBvcnRzO1xufShleHBvcnRzKSk7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiLypcbiAgQ29weXJpZ2h0IChDKSAyMDEzIFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICdBUyBJUydcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBmdW5jdGlvbiBpc0V4cHJlc3Npb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyYXlFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ0Fzc2lnbm1lbnRFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ0JpbmFyeUV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnQ2FsbEV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnQ29uZGl0aW9uYWxFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ0Z1bmN0aW9uRXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdJZGVudGlmaWVyJzpcbiAgICAgICAgICAgIGNhc2UgJ0xpdGVyYWwnOlxuICAgICAgICAgICAgY2FzZSAnTG9naWNhbEV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnTWVtYmVyRXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdOZXdFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ09iamVjdEV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnU2VxdWVuY2VFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ1RoaXNFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ1VuYXJ5RXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdVcGRhdGVFeHByZXNzaW9uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJdGVyYXRpb25TdGF0ZW1lbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnRG9XaGlsZVN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdGb3JJblN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdGb3JTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnV2hpbGVTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1N0YXRlbWVudChub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09IG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdCbG9ja1N0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdCcmVha1N0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdDb250aW51ZVN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdEZWJ1Z2dlclN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdEb1doaWxlU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0VtcHR5U3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0V4cHJlc3Npb25TdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRm9ySW5TdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRm9yU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0lmU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0xhYmVsZWRTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnUmV0dXJuU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ1N3aXRjaFN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdUaHJvd1N0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdUcnlTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnVmFyaWFibGVEZWNsYXJhdGlvbic6XG4gICAgICAgICAgICBjYXNlICdXaGlsZVN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdXaXRoU3RhdGVtZW50JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTb3VyY2VFbGVtZW50KG5vZGUpIHtcbiAgICAgIHJldHVybiBpc1N0YXRlbWVudChub2RlKSB8fCBub2RlICE9IG51bGwgJiYgbm9kZS50eXBlID09PSAnRnVuY3Rpb25EZWNsYXJhdGlvbic7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdHJhaWxpbmdTdGF0ZW1lbnQobm9kZSkge1xuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICBjYXNlICdJZlN0YXRlbWVudCc6XG4gICAgICAgICAgICBpZiAobm9kZS5hbHRlcm5hdGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmFsdGVybmF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlLmNvbnNlcXVlbnQ7XG5cbiAgICAgICAgY2FzZSAnTGFiZWxlZFN0YXRlbWVudCc6XG4gICAgICAgIGNhc2UgJ0ZvclN0YXRlbWVudCc6XG4gICAgICAgIGNhc2UgJ0ZvckluU3RhdGVtZW50JzpcbiAgICAgICAgY2FzZSAnV2hpbGVTdGF0ZW1lbnQnOlxuICAgICAgICBjYXNlICdXaXRoU3RhdGVtZW50JzpcbiAgICAgICAgICAgIHJldHVybiBub2RlLmJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNQcm9ibGVtYXRpY0lmU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKG5vZGUudHlwZSAhPT0gJ0lmU3RhdGVtZW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmFsdGVybmF0ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IG5vZGUuY29uc2VxdWVudDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQudHlwZSA9PT0gJ0lmU3RhdGVtZW50Jykge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmFsdGVybmF0ZSA9PSBudWxsKSAge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50ID0gdHJhaWxpbmdTdGF0ZW1lbnQoY3VycmVudCk7XG4gICAgICAgIH0gd2hpbGUgKGN1cnJlbnQpO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAgICAgaXNFeHByZXNzaW9uOiBpc0V4cHJlc3Npb24sXG4gICAgICAgIGlzU3RhdGVtZW50OiBpc1N0YXRlbWVudCxcbiAgICAgICAgaXNJdGVyYXRpb25TdGF0ZW1lbnQ6IGlzSXRlcmF0aW9uU3RhdGVtZW50LFxuICAgICAgICBpc1NvdXJjZUVsZW1lbnQ6IGlzU291cmNlRWxlbWVudCxcbiAgICAgICAgaXNQcm9ibGVtYXRpY0lmU3RhdGVtZW50OiBpc1Byb2JsZW1hdGljSWZTdGF0ZW1lbnQsXG5cbiAgICAgICAgdHJhaWxpbmdTdGF0ZW1lbnQ6IHRyYWlsaW5nU3RhdGVtZW50XG4gICAgfTtcbn0oKSk7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiLypcbiAgQ29weXJpZ2h0IChDKSAyMDEzLTIwMTQgWXVzdWtlIFN1enVraSA8dXRhdGFuZS50ZWFAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTQgSXZhbiBOaWt1bGluIDxpZmFhYW5AZ21haWwuY29tPlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIEVTNlJlZ2V4LCBFUzVSZWdleCwgTk9OX0FTQ0lJX1dISVRFU1BBQ0VTLCBJREVOVElGSUVSX1NUQVJULCBJREVOVElGSUVSX1BBUlQsIGNoO1xuXG4gICAgLy8gU2VlIGB0b29scy9nZW5lcmF0ZS1pZGVudGlmaWVyLXJlZ2V4LmpzYC5cbiAgICBFUzVSZWdleCA9IHtcbiAgICAgICAgLy8gRUNNQVNjcmlwdCA1LjEvVW5pY29kZSB2OS4wLjAgTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQ6XG4gICAgICAgIE5vbkFzY2lpSWRlbnRpZmllclN0YXJ0OiAvW1xceEFBXFx4QjVcXHhCQVxceEMwLVxceEQ2XFx4RDgtXFx4RjZcXHhGOC1cXHUwMkMxXFx1MDJDNi1cXHUwMkQxXFx1MDJFMC1cXHUwMkU0XFx1MDJFQ1xcdTAyRUVcXHUwMzcwLVxcdTAzNzRcXHUwMzc2XFx1MDM3N1xcdTAzN0EtXFx1MDM3RFxcdTAzN0ZcXHUwMzg2XFx1MDM4OC1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNGNVxcdTAzRjctXFx1MDQ4MVxcdTA0OEEtXFx1MDUyRlxcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNUQwLVxcdTA1RUFcXHUwNUYwLVxcdTA1RjJcXHUwNjIwLVxcdTA2NEFcXHUwNjZFXFx1MDY2RlxcdTA2NzEtXFx1MDZEM1xcdTA2RDVcXHUwNkU1XFx1MDZFNlxcdTA2RUVcXHUwNkVGXFx1MDZGQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTBcXHUwNzEyLVxcdTA3MkZcXHUwNzRELVxcdTA3QTVcXHUwN0IxXFx1MDdDQS1cXHUwN0VBXFx1MDdGNFxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODE1XFx1MDgxQVxcdTA4MjRcXHUwODI4XFx1MDg0MC1cXHUwODU4XFx1MDhBMC1cXHUwOEI0XFx1MDhCNi1cXHUwOEJEXFx1MDkwNC1cXHUwOTM5XFx1MDkzRFxcdTA5NTBcXHUwOTU4LVxcdTA5NjFcXHUwOTcxLVxcdTA5ODBcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJEXFx1MDlDRVxcdTA5RENcXHUwOUREXFx1MDlERi1cXHUwOUUxXFx1MDlGMFxcdTA5RjFcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTcyLVxcdTBBNzRcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkRcXHUwQUQwXFx1MEFFMFxcdTBBRTFcXHUwQUY5XFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0RcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2MVxcdTBCNzFcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCRDBcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzlcXHUwQzNEXFx1MEM1OC1cXHUwQzVBXFx1MEM2MFxcdTBDNjFcXHUwQzgwXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCRFxcdTBDREVcXHUwQ0UwXFx1MENFMVxcdTBDRjFcXHUwQ0YyXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRFxcdTBENEVcXHUwRDU0LVxcdTBENTZcXHUwRDVGLVxcdTBENjFcXHUwRDdBLVxcdTBEN0ZcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MEUwMS1cXHUwRTMwXFx1MEUzMlxcdTBFMzNcXHUwRTQwLVxcdTBFNDZcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCMFxcdTBFQjJcXHUwRUIzXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEY0MC1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY4OC1cXHUwRjhDXFx1MTAwMC1cXHUxMDJBXFx1MTAzRlxcdTEwNTAtXFx1MTA1NVxcdTEwNUEtXFx1MTA1RFxcdTEwNjFcXHUxMDY1XFx1MTA2NlxcdTEwNkUtXFx1MTA3MFxcdTEwNzUtXFx1MTA4MVxcdTEwOEVcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzExXFx1MTcyMC1cXHUxNzMxXFx1MTc0MC1cXHUxNzUxXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc4MC1cXHUxN0IzXFx1MTdEN1xcdTE3RENcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4ODRcXHUxODg3LVxcdTE4QThcXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFFXFx1MTk1MC1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlCMC1cXHUxOUM5XFx1MUEwMC1cXHUxQTE2XFx1MUEyMC1cXHUxQTU0XFx1MUFBN1xcdTFCMDUtXFx1MUIzM1xcdTFCNDUtXFx1MUI0QlxcdTFCODMtXFx1MUJBMFxcdTFCQUVcXHUxQkFGXFx1MUJCQS1cXHUxQkU1XFx1MUMwMC1cXHUxQzIzXFx1MUM0RC1cXHUxQzRGXFx1MUM1QS1cXHUxQzdEXFx1MUM4MC1cXHUxQzg4XFx1MUNFOS1cXHUxQ0VDXFx1MUNFRS1cXHUxQ0YxXFx1MUNGNVxcdTFDRjZcXHUxRDAwLVxcdTFEQkZcXHUxRTAwLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMkRcXHUyMTJGLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0VFXFx1MkNGMlxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDgwLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyRTJGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDI5XFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5RC1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OURcXHVBNkEwLVxcdUE2RUZcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QUVcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MEEtXFx1QTkyNVxcdUE5MzAtXFx1QTk0NlxcdUE5NjAtXFx1QTk3Q1xcdUE5ODQtXFx1QTlCMlxcdUE5Q0ZcXHVBOUUwLVxcdUE5RTRcXHVBOUU2LVxcdUE5RUZcXHVBOUZBLVxcdUE5RkVcXHVBQTAwLVxcdUFBMjhcXHVBQTQwLVxcdUFBNDJcXHVBQTQ0LVxcdUFBNEJcXHVBQTYwLVxcdUFBNzZcXHVBQTdBXFx1QUE3RS1cXHVBQUFGXFx1QUFCMVxcdUFBQjVcXHVBQUI2XFx1QUFCOS1cXHVBQUJEXFx1QUFDMFxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUFcXHVBQUYyLVxcdUFBRjRcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRTJcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFEXFx1RkIxRi1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjIxLVxcdUZGM0FcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdLyxcbiAgICAgICAgLy8gRUNNQVNjcmlwdCA1LjEvVW5pY29kZSB2OS4wLjAgTm9uQXNjaWlJZGVudGlmaWVyUGFydDpcbiAgICAgICAgTm9uQXNjaWlJZGVudGlmaWVyUGFydDogL1tcXHhBQVxceEI1XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDMwMC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDgzLVxcdTA0ODdcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDU5MS1cXHUwNUJEXFx1MDVCRlxcdTA1QzFcXHUwNUMyXFx1MDVDNFxcdTA1QzVcXHUwNUM3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYxMC1cXHUwNjFBXFx1MDYyMC1cXHUwNjY5XFx1MDY2RS1cXHUwNkQzXFx1MDZENS1cXHUwNkRDXFx1MDZERi1cXHUwNkU4XFx1MDZFQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTAtXFx1MDc0QVxcdTA3NEQtXFx1MDdCMVxcdTA3QzAtXFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MkRcXHUwODQwLVxcdTA4NUJcXHUwOEEwLVxcdTA4QjRcXHUwOEI2LVxcdTA4QkRcXHUwOEQ0LVxcdTA4RTFcXHUwOEUzLVxcdTA5NjNcXHUwOTY2LVxcdTA5NkZcXHUwOTcxLVxcdTA5ODNcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJDLVxcdTA5QzRcXHUwOUM3XFx1MDlDOFxcdTA5Q0ItXFx1MDlDRVxcdTA5RDdcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFM1xcdTA5RTYtXFx1MDlGMVxcdTBBMDEtXFx1MEEwM1xcdTBBMDUtXFx1MEEwQVxcdTBBMEZcXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMlxcdTBBMzNcXHUwQTM1XFx1MEEzNlxcdTBBMzhcXHUwQTM5XFx1MEEzQ1xcdTBBM0UtXFx1MEE0MlxcdTBBNDdcXHUwQTQ4XFx1MEE0Qi1cXHUwQTREXFx1MEE1MVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTY2LVxcdTBBNzVcXHUwQTgxLVxcdTBBODNcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkMtXFx1MEFDNVxcdTBBQzctXFx1MEFDOVxcdTBBQ0ItXFx1MEFDRFxcdTBBRDBcXHUwQUUwLVxcdTBBRTNcXHUwQUU2LVxcdTBBRUZcXHUwQUY5XFx1MEIwMS1cXHUwQjAzXFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0MtXFx1MEI0NFxcdTBCNDdcXHUwQjQ4XFx1MEI0Qi1cXHUwQjREXFx1MEI1NlxcdTBCNTdcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2M1xcdTBCNjYtXFx1MEI2RlxcdTBCNzFcXHUwQjgyXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkJFLVxcdTBCQzJcXHUwQkM2LVxcdTBCQzhcXHUwQkNBLVxcdTBCQ0RcXHUwQkQwXFx1MEJEN1xcdTBCRTYtXFx1MEJFRlxcdTBDMDAtXFx1MEMwM1xcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzOVxcdTBDM0QtXFx1MEM0NFxcdTBDNDYtXFx1MEM0OFxcdTBDNEEtXFx1MEM0RFxcdTBDNTVcXHUwQzU2XFx1MEM1OC1cXHUwQzVBXFx1MEM2MC1cXHUwQzYzXFx1MEM2Ni1cXHUwQzZGXFx1MEM4MC1cXHUwQzgzXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCQy1cXHUwQ0M0XFx1MENDNi1cXHUwQ0M4XFx1MENDQS1cXHUwQ0NEXFx1MENENVxcdTBDRDZcXHUwQ0RFXFx1MENFMC1cXHUwQ0UzXFx1MENFNi1cXHUwQ0VGXFx1MENGMVxcdTBDRjJcXHUwRDAxLVxcdTBEMDNcXHUwRDA1LVxcdTBEMENcXHUwRDBFLVxcdTBEMTBcXHUwRDEyLVxcdTBEM0FcXHUwRDNELVxcdTBENDRcXHUwRDQ2LVxcdTBENDhcXHUwRDRBLVxcdTBENEVcXHUwRDU0LVxcdTBENTdcXHUwRDVGLVxcdTBENjNcXHUwRDY2LVxcdTBENkZcXHUwRDdBLVxcdTBEN0ZcXHUwRDgyXFx1MEQ4M1xcdTBEODUtXFx1MEQ5NlxcdTBEOUEtXFx1MERCMVxcdTBEQjMtXFx1MERCQlxcdTBEQkRcXHUwREMwLVxcdTBEQzZcXHUwRENBXFx1MERDRi1cXHUwREQ0XFx1MERENlxcdTBERDgtXFx1MERERlxcdTBERTYtXFx1MERFRlxcdTBERjJcXHUwREYzXFx1MEUwMS1cXHUwRTNBXFx1MEU0MC1cXHUwRTRFXFx1MEU1MC1cXHUwRTU5XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjlcXHUwRUJCLVxcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVDOC1cXHUwRUNEXFx1MEVEMC1cXHUwRUQ5XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGMThcXHUwRjE5XFx1MEYyMC1cXHUwRjI5XFx1MEYzNVxcdTBGMzdcXHUwRjM5XFx1MEYzRS1cXHUwRjQ3XFx1MEY0OS1cXHUwRjZDXFx1MEY3MS1cXHUwRjg0XFx1MEY4Ni1cXHUwRjk3XFx1MEY5OS1cXHUwRkJDXFx1MEZDNlxcdTEwMDAtXFx1MTA0OVxcdTEwNTAtXFx1MTA5RFxcdTEwQTAtXFx1MTBDNVxcdTEwQzdcXHUxMENEXFx1MTBEMC1cXHUxMEZBXFx1MTBGQy1cXHUxMjQ4XFx1MTI0QS1cXHUxMjREXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNUEtXFx1MTI1RFxcdTEyNjAtXFx1MTI4OFxcdTEyOEEtXFx1MTI4RFxcdTEyOTAtXFx1MTJCMFxcdTEyQjItXFx1MTJCNVxcdTEyQjgtXFx1MTJCRVxcdTEyQzBcXHUxMkMyLVxcdTEyQzVcXHUxMkM4LVxcdTEyRDZcXHUxMkQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNUFcXHUxMzVELVxcdTEzNUZcXHUxMzgwLVxcdTEzOEZcXHUxM0EwLVxcdTEzRjVcXHUxM0Y4LVxcdTEzRkRcXHUxNDAxLVxcdTE2NkNcXHUxNjZGLVxcdTE2N0ZcXHUxNjgxLVxcdTE2OUFcXHUxNkEwLVxcdTE2RUFcXHUxNkVFLVxcdTE2RjhcXHUxNzAwLVxcdTE3MENcXHUxNzBFLVxcdTE3MTRcXHUxNzIwLVxcdTE3MzRcXHUxNzQwLVxcdTE3NTNcXHUxNzYwLVxcdTE3NkNcXHUxNzZFLVxcdTE3NzBcXHUxNzcyXFx1MTc3M1xcdTE3ODAtXFx1MTdEM1xcdTE3RDdcXHUxN0RDXFx1MTdERFxcdTE3RTAtXFx1MTdFOVxcdTE4MEItXFx1MTgwRFxcdTE4MTAtXFx1MTgxOVxcdTE4MjAtXFx1MTg3N1xcdTE4ODAtXFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5MjAtXFx1MTkyQlxcdTE5MzAtXFx1MTkzQlxcdTE5NDYtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QjAtXFx1MTlDOVxcdTE5RDAtXFx1MTlEOVxcdTFBMDAtXFx1MUExQlxcdTFBMjAtXFx1MUE1RVxcdTFBNjAtXFx1MUE3Q1xcdTFBN0YtXFx1MUE4OVxcdTFBOTAtXFx1MUE5OVxcdTFBQTdcXHUxQUIwLVxcdTFBQkRcXHUxQjAwLVxcdTFCNEJcXHUxQjUwLVxcdTFCNTlcXHUxQjZCLVxcdTFCNzNcXHUxQjgwLVxcdTFCRjNcXHUxQzAwLVxcdTFDMzdcXHUxQzQwLVxcdTFDNDlcXHUxQzRELVxcdTFDN0RcXHUxQzgwLVxcdTFDODhcXHUxQ0QwLVxcdTFDRDJcXHUxQ0Q0LVxcdTFDRjZcXHUxQ0Y4XFx1MUNGOVxcdTFEMDAtXFx1MURGNVxcdTFERkItXFx1MUYxNVxcdTFGMTgtXFx1MUYxRFxcdTFGMjAtXFx1MUY0NVxcdTFGNDgtXFx1MUY0RFxcdTFGNTAtXFx1MUY1N1xcdTFGNTlcXHUxRjVCXFx1MUY1RFxcdTFGNUYtXFx1MUY3RFxcdTFGODAtXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQwLVxcdTFGRDNcXHUxRkQ2LVxcdTFGREJcXHUxRkUwLVxcdTFGRUNcXHUxRkYyLVxcdTFGRjRcXHUxRkY2LVxcdTFGRkNcXHUyMDBDXFx1MjAwRFxcdTIwM0ZcXHUyMDQwXFx1MjA1NFxcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjBEMC1cXHUyMERDXFx1MjBFMVxcdTIwRTUtXFx1MjBGMFxcdTIxMDJcXHUyMTA3XFx1MjEwQS1cXHUyMTEzXFx1MjExNVxcdTIxMTktXFx1MjExRFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMkEtXFx1MjEyRFxcdTIxMkYtXFx1MjEzOVxcdTIxM0MtXFx1MjEzRlxcdTIxNDUtXFx1MjE0OVxcdTIxNEVcXHUyMTYwLVxcdTIxODhcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRjNcXHUyRDAwLVxcdTJEMjVcXHUyRDI3XFx1MkQyRFxcdTJEMzAtXFx1MkQ2N1xcdTJENkZcXHUyRDdGLVxcdTJEOTZcXHUyREEwLVxcdTJEQTZcXHUyREE4LVxcdTJEQUVcXHUyREIwLVxcdTJEQjZcXHUyREI4LVxcdTJEQkVcXHUyREMwLVxcdTJEQzZcXHUyREM4LVxcdTJEQ0VcXHUyREQwLVxcdTJERDZcXHUyREQ4LVxcdTJEREVcXHUyREUwLVxcdTJERkZcXHUyRTJGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDJGXFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5OVxcdTMwOUFcXHUzMDlELVxcdTMwOUZcXHUzMEExLVxcdTMwRkFcXHUzMEZDLVxcdTMwRkZcXHUzMTA1LVxcdTMxMkRcXHUzMTMxLVxcdTMxOEVcXHUzMUEwLVxcdTMxQkFcXHUzMUYwLVxcdTMxRkZcXHUzNDAwLVxcdTREQjVcXHU0RTAwLVxcdTlGRDVcXHVBMDAwLVxcdUE0OENcXHVBNEQwLVxcdUE0RkRcXHVBNTAwLVxcdUE2MENcXHVBNjEwLVxcdUE2MkJcXHVBNjQwLVxcdUE2NkZcXHVBNjc0LVxcdUE2N0RcXHVBNjdGLVxcdUE2RjFcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QUVcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MjdcXHVBODQwLVxcdUE4NzNcXHVBODgwLVxcdUE4QzVcXHVBOEQwLVxcdUE4RDlcXHVBOEUwLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MDAtXFx1QTkyRFxcdUE5MzAtXFx1QTk1M1xcdUE5NjAtXFx1QTk3Q1xcdUE5ODAtXFx1QTlDMFxcdUE5Q0YtXFx1QTlEOVxcdUE5RTAtXFx1QTlGRVxcdUFBMDAtXFx1QUEzNlxcdUFBNDAtXFx1QUE0RFxcdUFBNTAtXFx1QUE1OVxcdUFBNjAtXFx1QUE3NlxcdUFBN0EtXFx1QUFDMlxcdUFBREItXFx1QUFERFxcdUFBRTAtXFx1QUFFRlxcdUFBRjItXFx1QUFGNlxcdUFCMDEtXFx1QUIwNlxcdUFCMDktXFx1QUIwRVxcdUFCMTEtXFx1QUIxNlxcdUFCMjAtXFx1QUIyNlxcdUFCMjgtXFx1QUIyRVxcdUFCMzAtXFx1QUI1QVxcdUFCNUMtXFx1QUI2NVxcdUFCNzAtXFx1QUJFQVxcdUFCRUNcXHVBQkVEXFx1QUJGMC1cXHVBQkY5XFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRC1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTAwLVxcdUZFMEZcXHVGRTIwLVxcdUZFMkZcXHVGRTMzXFx1RkUzNFxcdUZFNEQtXFx1RkU0RlxcdUZFNzAtXFx1RkU3NFxcdUZFNzYtXFx1RkVGQ1xcdUZGMTAtXFx1RkYxOVxcdUZGMjEtXFx1RkYzQVxcdUZGM0ZcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdL1xuICAgIH07XG5cbiAgICBFUzZSZWdleCA9IHtcbiAgICAgICAgLy8gRUNNQVNjcmlwdCA2L1VuaWNvZGUgdjkuMC4wIE5vbkFzY2lpSWRlbnRpZmllclN0YXJ0OlxuICAgICAgICBOb25Bc2NpaUlkZW50aWZpZXJTdGFydDogL1tcXHhBQVxceEI1XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYyMC1cXHUwNjRBXFx1MDY2RVxcdTA2NkZcXHUwNjcxLVxcdTA2RDNcXHUwNkQ1XFx1MDZFNVxcdTA2RTZcXHUwNkVFXFx1MDZFRlxcdTA2RkEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwXFx1MDcxMi1cXHUwNzJGXFx1MDc0RC1cXHUwN0E1XFx1MDdCMVxcdTA3Q0EtXFx1MDdFQVxcdTA3RjRcXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgxNVxcdTA4MUFcXHUwODI0XFx1MDgyOFxcdTA4NDAtXFx1MDg1OFxcdTA4QTAtXFx1MDhCNFxcdTA4QjYtXFx1MDhCRFxcdTA5MDQtXFx1MDkzOVxcdTA5M0RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTgwXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCRFxcdTA5Q0VcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFMVxcdTA5RjBcXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE3Mi1cXHUwQTc0XFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFEMFxcdTBBRTBcXHUwQUUxXFx1MEFGOVxcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNEXFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjFcXHUwQjcxXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkQwXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRFxcdTBDNTgtXFx1MEM1QVxcdTBDNjBcXHUwQzYxXFx1MEM4MFxcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkRcXHUwQ0RFXFx1MENFMFxcdTBDRTFcXHUwQ0YxXFx1MENGMlxcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0RcXHUwRDRFXFx1MEQ1NC1cXHUwRDU2XFx1MEQ1Ri1cXHUwRDYxXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4NS1cXHUwRDk2XFx1MEQ5QS1cXHUwREIxXFx1MERCMy1cXHUwREJCXFx1MERCRFxcdTBEQzAtXFx1MERDNlxcdTBFMDEtXFx1MEUzMFxcdTBFMzJcXHUwRTMzXFx1MEU0MC1cXHUwRTQ2XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjBcXHUwRUIyXFx1MEVCM1xcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGNDAtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGODgtXFx1MEY4Q1xcdTEwMDAtXFx1MTAyQVxcdTEwM0ZcXHUxMDUwLVxcdTEwNTVcXHUxMDVBLVxcdTEwNURcXHUxMDYxXFx1MTA2NVxcdTEwNjZcXHUxMDZFLVxcdTEwNzBcXHUxMDc1LVxcdTEwODFcXHUxMDhFXFx1MTBBMC1cXHUxMEM1XFx1MTBDN1xcdTEwQ0RcXHUxMEQwLVxcdTEwRkFcXHUxMEZDLVxcdTEyNDhcXHUxMjRBLVxcdTEyNERcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1QS1cXHUxMjVEXFx1MTI2MC1cXHUxMjg4XFx1MTI4QS1cXHUxMjhEXFx1MTI5MC1cXHUxMkIwXFx1MTJCMi1cXHUxMkI1XFx1MTJCOC1cXHUxMkJFXFx1MTJDMFxcdTEyQzItXFx1MTJDNVxcdTEyQzgtXFx1MTJENlxcdTEyRDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1QVxcdTEzODAtXFx1MTM4RlxcdTEzQTAtXFx1MTNGNVxcdTEzRjgtXFx1MTNGRFxcdTE0MDEtXFx1MTY2Q1xcdTE2NkYtXFx1MTY3RlxcdTE2ODEtXFx1MTY5QVxcdTE2QTAtXFx1MTZFQVxcdTE2RUUtXFx1MTZGOFxcdTE3MDAtXFx1MTcwQ1xcdTE3MEUtXFx1MTcxMVxcdTE3MjAtXFx1MTczMVxcdTE3NDAtXFx1MTc1MVxcdTE3NjAtXFx1MTc2Q1xcdTE3NkUtXFx1MTc3MFxcdTE3ODAtXFx1MTdCM1xcdTE3RDdcXHUxN0RDXFx1MTgyMC1cXHUxODc3XFx1MTg4MC1cXHUxOEE4XFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5NTAtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QjAtXFx1MTlDOVxcdTFBMDAtXFx1MUExNlxcdTFBMjAtXFx1MUE1NFxcdTFBQTdcXHUxQjA1LVxcdTFCMzNcXHUxQjQ1LVxcdTFCNEJcXHUxQjgzLVxcdTFCQTBcXHUxQkFFXFx1MUJBRlxcdTFCQkEtXFx1MUJFNVxcdTFDMDAtXFx1MUMyM1xcdTFDNEQtXFx1MUM0RlxcdTFDNUEtXFx1MUM3RFxcdTFDODAtXFx1MUM4OFxcdTFDRTktXFx1MUNFQ1xcdTFDRUUtXFx1MUNGMVxcdTFDRjVcXHUxQ0Y2XFx1MUQwMC1cXHUxREJGXFx1MUUwMC1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjEwMlxcdTIxMDdcXHUyMTBBLVxcdTIxMTNcXHUyMTE1XFx1MjExOC1cXHUyMTFEXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyQS1cXHUyMTM5XFx1MjEzQy1cXHUyMTNGXFx1MjE0NS1cXHUyMTQ5XFx1MjE0RVxcdTIxNjAtXFx1MjE4OFxcdTJDMDAtXFx1MkMyRVxcdTJDMzAtXFx1MkM1RVxcdTJDNjAtXFx1MkNFNFxcdTJDRUItXFx1MkNFRVxcdTJDRjJcXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ4MC1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDI5XFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5Qi1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OURcXHVBNkEwLVxcdUE2RUZcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QUVcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MEEtXFx1QTkyNVxcdUE5MzAtXFx1QTk0NlxcdUE5NjAtXFx1QTk3Q1xcdUE5ODQtXFx1QTlCMlxcdUE5Q0ZcXHVBOUUwLVxcdUE5RTRcXHVBOUU2LVxcdUE5RUZcXHVBOUZBLVxcdUE5RkVcXHVBQTAwLVxcdUFBMjhcXHVBQTQwLVxcdUFBNDJcXHVBQTQ0LVxcdUFBNEJcXHVBQTYwLVxcdUFBNzZcXHVBQTdBXFx1QUE3RS1cXHVBQUFGXFx1QUFCMVxcdUFBQjVcXHVBQUI2XFx1QUFCOS1cXHVBQUJEXFx1QUFDMFxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUFcXHVBQUYyLVxcdUFBRjRcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRTJcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFEXFx1RkIxRi1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjIxLVxcdUZGM0FcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdfFxcdUQ4MDBbXFx1REMwMC1cXHVEQzBCXFx1REMwRC1cXHVEQzI2XFx1REMyOC1cXHVEQzNBXFx1REMzQ1xcdURDM0RcXHVEQzNGLVxcdURDNERcXHVEQzUwLVxcdURDNURcXHVEQzgwLVxcdURDRkFcXHVERDQwLVxcdURENzRcXHVERTgwLVxcdURFOUNcXHVERUEwLVxcdURFRDBcXHVERjAwLVxcdURGMUZcXHVERjMwLVxcdURGNEFcXHVERjUwLVxcdURGNzVcXHVERjgwLVxcdURGOURcXHVERkEwLVxcdURGQzNcXHVERkM4LVxcdURGQ0ZcXHVERkQxLVxcdURGRDVdfFxcdUQ4MDFbXFx1REMwMC1cXHVEQzlEXFx1RENCMC1cXHVEQ0QzXFx1RENEOC1cXHVEQ0ZCXFx1REQwMC1cXHVERDI3XFx1REQzMC1cXHVERDYzXFx1REUwMC1cXHVERjM2XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjY3XXxcXHVEODAyW1xcdURDMDAtXFx1REMwNVxcdURDMDhcXHVEQzBBLVxcdURDMzVcXHVEQzM3XFx1REMzOFxcdURDM0NcXHVEQzNGLVxcdURDNTVcXHVEQzYwLVxcdURDNzZcXHVEQzgwLVxcdURDOUVcXHVEQ0UwLVxcdURDRjJcXHVEQ0Y0XFx1RENGNVxcdUREMDAtXFx1REQxNVxcdUREMjAtXFx1REQzOVxcdUREODAtXFx1RERCN1xcdUREQkVcXHVEREJGXFx1REUwMFxcdURFMTAtXFx1REUxM1xcdURFMTUtXFx1REUxN1xcdURFMTktXFx1REUzM1xcdURFNjAtXFx1REU3Q1xcdURFODAtXFx1REU5Q1xcdURFQzAtXFx1REVDN1xcdURFQzktXFx1REVFNFxcdURGMDAtXFx1REYzNVxcdURGNDAtXFx1REY1NVxcdURGNjAtXFx1REY3MlxcdURGODAtXFx1REY5MV18XFx1RDgwM1tcXHVEQzAwLVxcdURDNDhcXHVEQzgwLVxcdURDQjJcXHVEQ0MwLVxcdURDRjJdfFxcdUQ4MDRbXFx1REMwMy1cXHVEQzM3XFx1REM4My1cXHVEQ0FGXFx1RENEMC1cXHVEQ0U4XFx1REQwMy1cXHVERDI2XFx1REQ1MC1cXHVERDcyXFx1REQ3NlxcdUREODMtXFx1RERCMlxcdUREQzEtXFx1RERDNFxcdUREREFcXHVERERDXFx1REUwMC1cXHVERTExXFx1REUxMy1cXHVERTJCXFx1REU4MC1cXHVERTg2XFx1REU4OFxcdURFOEEtXFx1REU4RFxcdURFOEYtXFx1REU5RFxcdURFOUYtXFx1REVBOFxcdURFQjAtXFx1REVERVxcdURGMDUtXFx1REYwQ1xcdURGMEZcXHVERjEwXFx1REYxMy1cXHVERjI4XFx1REYyQS1cXHVERjMwXFx1REYzMlxcdURGMzNcXHVERjM1LVxcdURGMzlcXHVERjNEXFx1REY1MFxcdURGNUQtXFx1REY2MV18XFx1RDgwNVtcXHVEQzAwLVxcdURDMzRcXHVEQzQ3LVxcdURDNEFcXHVEQzgwLVxcdURDQUZcXHVEQ0M0XFx1RENDNVxcdURDQzdcXHVERDgwLVxcdUREQUVcXHVEREQ4LVxcdUREREJcXHVERTAwLVxcdURFMkZcXHVERTQ0XFx1REU4MC1cXHVERUFBXFx1REYwMC1cXHVERjE5XXxcXHVEODA2W1xcdURDQTAtXFx1RENERlxcdURDRkZcXHVERUMwLVxcdURFRjhdfFxcdUQ4MDdbXFx1REMwMC1cXHVEQzA4XFx1REMwQS1cXHVEQzJFXFx1REM0MFxcdURDNzItXFx1REM4Rl18XFx1RDgwOFtcXHVEQzAwLVxcdURGOTldfFxcdUQ4MDlbXFx1REMwMC1cXHVEQzZFXFx1REM4MC1cXHVERDQzXXxbXFx1RDgwQ1xcdUQ4MUMtXFx1RDgyMFxcdUQ4NDAtXFx1RDg2OFxcdUQ4NkEtXFx1RDg2Q1xcdUQ4NkYtXFx1RDg3Ml1bXFx1REMwMC1cXHVERkZGXXxcXHVEODBEW1xcdURDMDAtXFx1REMyRV18XFx1RDgxMVtcXHVEQzAwLVxcdURFNDZdfFxcdUQ4MUFbXFx1REMwMC1cXHVERTM4XFx1REU0MC1cXHVERTVFXFx1REVEMC1cXHVERUVEXFx1REYwMC1cXHVERjJGXFx1REY0MC1cXHVERjQzXFx1REY2My1cXHVERjc3XFx1REY3RC1cXHVERjhGXXxcXHVEODFCW1xcdURGMDAtXFx1REY0NFxcdURGNTBcXHVERjkzLVxcdURGOUZcXHVERkUwXXxcXHVEODIxW1xcdURDMDAtXFx1REZFQ118XFx1RDgyMltcXHVEQzAwLVxcdURFRjJdfFxcdUQ4MkNbXFx1REMwMFxcdURDMDFdfFxcdUQ4MkZbXFx1REMwMC1cXHVEQzZBXFx1REM3MC1cXHVEQzdDXFx1REM4MC1cXHVEQzg4XFx1REM5MC1cXHVEQzk5XXxcXHVEODM1W1xcdURDMDAtXFx1REM1NFxcdURDNTYtXFx1REM5Q1xcdURDOUVcXHVEQzlGXFx1RENBMlxcdURDQTVcXHVEQ0E2XFx1RENBOS1cXHVEQ0FDXFx1RENBRS1cXHVEQ0I5XFx1RENCQlxcdURDQkQtXFx1RENDM1xcdURDQzUtXFx1REQwNVxcdUREMDctXFx1REQwQVxcdUREMEQtXFx1REQxNFxcdUREMTYtXFx1REQxQ1xcdUREMUUtXFx1REQzOVxcdUREM0ItXFx1REQzRVxcdURENDAtXFx1REQ0NFxcdURENDZcXHVERDRBLVxcdURENTBcXHVERDUyLVxcdURFQTVcXHVERUE4LVxcdURFQzBcXHVERUMyLVxcdURFREFcXHVERURDLVxcdURFRkFcXHVERUZDLVxcdURGMTRcXHVERjE2LVxcdURGMzRcXHVERjM2LVxcdURGNEVcXHVERjUwLVxcdURGNkVcXHVERjcwLVxcdURGODhcXHVERjhBLVxcdURGQThcXHVERkFBLVxcdURGQzJcXHVERkM0LVxcdURGQ0JdfFxcdUQ4M0FbXFx1REMwMC1cXHVEQ0M0XFx1REQwMC1cXHVERDQzXXxcXHVEODNCW1xcdURFMDAtXFx1REUwM1xcdURFMDUtXFx1REUxRlxcdURFMjFcXHVERTIyXFx1REUyNFxcdURFMjdcXHVERTI5LVxcdURFMzJcXHVERTM0LVxcdURFMzdcXHVERTM5XFx1REUzQlxcdURFNDJcXHVERTQ3XFx1REU0OVxcdURFNEJcXHVERTRELVxcdURFNEZcXHVERTUxXFx1REU1MlxcdURFNTRcXHVERTU3XFx1REU1OVxcdURFNUJcXHVERTVEXFx1REU1RlxcdURFNjFcXHVERTYyXFx1REU2NFxcdURFNjctXFx1REU2QVxcdURFNkMtXFx1REU3MlxcdURFNzQtXFx1REU3N1xcdURFNzktXFx1REU3Q1xcdURFN0VcXHVERTgwLVxcdURFODlcXHVERThCLVxcdURFOUJcXHVERUExLVxcdURFQTNcXHVERUE1LVxcdURFQTlcXHVERUFCLVxcdURFQkJdfFxcdUQ4NjlbXFx1REMwMC1cXHVERUQ2XFx1REYwMC1cXHVERkZGXXxcXHVEODZEW1xcdURDMDAtXFx1REYzNFxcdURGNDAtXFx1REZGRl18XFx1RDg2RVtcXHVEQzAwLVxcdURDMURcXHVEQzIwLVxcdURGRkZdfFxcdUQ4NzNbXFx1REMwMC1cXHVERUExXXxcXHVEODdFW1xcdURDMDAtXFx1REUxRF0vLFxuICAgICAgICAvLyBFQ01BU2NyaXB0IDYvVW5pY29kZSB2OS4wLjAgTm9uQXNjaWlJZGVudGlmaWVyUGFydDpcbiAgICAgICAgTm9uQXNjaWlJZGVudGlmaWVyUGFydDogL1tcXHhBQVxceEI1XFx4QjdcXHhCQVxceEMwLVxceEQ2XFx4RDgtXFx4RjZcXHhGOC1cXHUwMkMxXFx1MDJDNi1cXHUwMkQxXFx1MDJFMC1cXHUwMkU0XFx1MDJFQ1xcdTAyRUVcXHUwMzAwLVxcdTAzNzRcXHUwMzc2XFx1MDM3N1xcdTAzN0EtXFx1MDM3RFxcdTAzN0ZcXHUwMzg2LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4My1cXHUwNDg3XFx1MDQ4QS1cXHUwNTJGXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1OTEtXFx1MDVCRFxcdTA1QkZcXHUwNUMxXFx1MDVDMlxcdTA1QzRcXHUwNUM1XFx1MDVDN1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MTAtXFx1MDYxQVxcdTA2MjAtXFx1MDY2OVxcdTA2NkUtXFx1MDZEM1xcdTA2RDUtXFx1MDZEQ1xcdTA2REYtXFx1MDZFOFxcdTA2RUEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwLVxcdTA3NEFcXHUwNzRELVxcdTA3QjFcXHUwN0MwLVxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODJEXFx1MDg0MC1cXHUwODVCXFx1MDhBMC1cXHUwOEI0XFx1MDhCNi1cXHUwOEJEXFx1MDhENC1cXHUwOEUxXFx1MDhFMy1cXHUwOTYzXFx1MDk2Ni1cXHUwOTZGXFx1MDk3MS1cXHUwOTgzXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCQy1cXHUwOUM0XFx1MDlDN1xcdTA5QzhcXHUwOUNCLVxcdTA5Q0VcXHUwOUQ3XFx1MDlEQ1xcdTA5RERcXHUwOURGLVxcdTA5RTNcXHUwOUU2LVxcdTA5RjFcXHUwQTAxLVxcdTBBMDNcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBM0NcXHUwQTNFLVxcdTBBNDJcXHUwQTQ3XFx1MEE0OFxcdTBBNEItXFx1MEE0RFxcdTBBNTFcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE2Ni1cXHUwQTc1XFx1MEE4MS1cXHUwQTgzXFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJDLVxcdTBBQzVcXHUwQUM3LVxcdTBBQzlcXHUwQUNCLVxcdTBBQ0RcXHUwQUQwXFx1MEFFMC1cXHUwQUUzXFx1MEFFNi1cXHUwQUVGXFx1MEFGOVxcdTBCMDEtXFx1MEIwM1xcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNDLVxcdTBCNDRcXHUwQjQ3XFx1MEI0OFxcdTBCNEItXFx1MEI0RFxcdTBCNTZcXHUwQjU3XFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjNcXHUwQjY2LVxcdTBCNkZcXHUwQjcxXFx1MEI4MlxcdTBCODNcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5XFx1MEI5QVxcdTBCOUNcXHUwQjlFXFx1MEI5RlxcdTBCQTNcXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI5XFx1MEJCRS1cXHUwQkMyXFx1MEJDNi1cXHUwQkM4XFx1MEJDQS1cXHUwQkNEXFx1MEJEMFxcdTBCRDdcXHUwQkU2LVxcdTBCRUZcXHUwQzAwLVxcdTBDMDNcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzlcXHUwQzNELVxcdTBDNDRcXHUwQzQ2LVxcdTBDNDhcXHUwQzRBLVxcdTBDNERcXHUwQzU1XFx1MEM1NlxcdTBDNTgtXFx1MEM1QVxcdTBDNjAtXFx1MEM2M1xcdTBDNjYtXFx1MEM2RlxcdTBDODAtXFx1MEM4M1xcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkMtXFx1MENDNFxcdTBDQzYtXFx1MENDOFxcdTBDQ0EtXFx1MENDRFxcdTBDRDVcXHUwQ0Q2XFx1MENERVxcdTBDRTAtXFx1MENFM1xcdTBDRTYtXFx1MENFRlxcdTBDRjFcXHUwQ0YyXFx1MEQwMS1cXHUwRDAzXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRC1cXHUwRDQ0XFx1MEQ0Ni1cXHUwRDQ4XFx1MEQ0QS1cXHUwRDRFXFx1MEQ1NC1cXHUwRDU3XFx1MEQ1Ri1cXHUwRDYzXFx1MEQ2Ni1cXHUwRDZGXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4MlxcdTBEODNcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MERDQVxcdTBEQ0YtXFx1MERENFxcdTBERDZcXHUwREQ4LVxcdTBEREZcXHUwREU2LVxcdTBERUZcXHUwREYyXFx1MERGM1xcdTBFMDEtXFx1MEUzQVxcdTBFNDAtXFx1MEU0RVxcdTBFNTAtXFx1MEU1OVxcdTBFODFcXHUwRTgyXFx1MEU4NFxcdTBFODdcXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUFcXHUwRUFCXFx1MEVBRC1cXHUwRUI5XFx1MEVCQi1cXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEVDNlxcdTBFQzgtXFx1MEVDRFxcdTBFRDAtXFx1MEVEOVxcdTBFREMtXFx1MEVERlxcdTBGMDBcXHUwRjE4XFx1MEYxOVxcdTBGMjAtXFx1MEYyOVxcdTBGMzVcXHUwRjM3XFx1MEYzOVxcdTBGM0UtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGNzEtXFx1MEY4NFxcdTBGODYtXFx1MEY5N1xcdTBGOTktXFx1MEZCQ1xcdTBGQzZcXHUxMDAwLVxcdTEwNDlcXHUxMDUwLVxcdTEwOURcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM1RC1cXHUxMzVGXFx1MTM2OS1cXHUxMzcxXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzE0XFx1MTcyMC1cXHUxNzM0XFx1MTc0MC1cXHUxNzUzXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc3MlxcdTE3NzNcXHUxNzgwLVxcdTE3RDNcXHUxN0Q3XFx1MTdEQ1xcdTE3RERcXHUxN0UwLVxcdTE3RTlcXHUxODBCLVxcdTE4MERcXHUxODEwLVxcdTE4MTlcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QUFcXHUxOEIwLVxcdTE4RjVcXHUxOTAwLVxcdTE5MUVcXHUxOTIwLVxcdTE5MkJcXHUxOTMwLVxcdTE5M0JcXHUxOTQ2LVxcdTE5NkRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5QUJcXHUxOUIwLVxcdTE5QzlcXHUxOUQwLVxcdTE5REFcXHUxQTAwLVxcdTFBMUJcXHUxQTIwLVxcdTFBNUVcXHUxQTYwLVxcdTFBN0NcXHUxQTdGLVxcdTFBODlcXHUxQTkwLVxcdTFBOTlcXHUxQUE3XFx1MUFCMC1cXHUxQUJEXFx1MUIwMC1cXHUxQjRCXFx1MUI1MC1cXHUxQjU5XFx1MUI2Qi1cXHUxQjczXFx1MUI4MC1cXHUxQkYzXFx1MUMwMC1cXHUxQzM3XFx1MUM0MC1cXHUxQzQ5XFx1MUM0RC1cXHUxQzdEXFx1MUM4MC1cXHUxQzg4XFx1MUNEMC1cXHUxQ0QyXFx1MUNENC1cXHUxQ0Y2XFx1MUNGOFxcdTFDRjlcXHUxRDAwLVxcdTFERjVcXHUxREZCLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjAwQ1xcdTIwMERcXHUyMDNGXFx1MjA0MFxcdTIwNTRcXHUyMDcxXFx1MjA3RlxcdTIwOTAtXFx1MjA5Q1xcdTIwRDAtXFx1MjBEQ1xcdTIwRTFcXHUyMEU1LVxcdTIwRjBcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE4LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ3Ri1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MkRFMC1cXHUyREZGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDJGXFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5OS1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjJCXFx1QTY0MC1cXHVBNjZGXFx1QTY3NC1cXHVBNjdEXFx1QTY3Ri1cXHVBNkYxXFx1QTcxNy1cXHVBNzFGXFx1QTcyMi1cXHVBNzg4XFx1QTc4Qi1cXHVBN0FFXFx1QTdCMC1cXHVBN0I3XFx1QTdGNy1cXHVBODI3XFx1QTg0MC1cXHVBODczXFx1QTg4MC1cXHVBOEM1XFx1QThEMC1cXHVBOEQ5XFx1QThFMC1cXHVBOEY3XFx1QThGQlxcdUE4RkRcXHVBOTAwLVxcdUE5MkRcXHVBOTMwLVxcdUE5NTNcXHVBOTYwLVxcdUE5N0NcXHVBOTgwLVxcdUE5QzBcXHVBOUNGLVxcdUE5RDlcXHVBOUUwLVxcdUE5RkVcXHVBQTAwLVxcdUFBMzZcXHVBQTQwLVxcdUFBNERcXHVBQTUwLVxcdUFBNTlcXHVBQTYwLVxcdUFBNzZcXHVBQTdBLVxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUZcXHVBQUYyLVxcdUFBRjZcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRUFcXHVBQkVDXFx1QUJFRFxcdUFCRjAtXFx1QUJGOVxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMUQtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkUwMC1cXHVGRTBGXFx1RkUyMC1cXHVGRTJGXFx1RkUzM1xcdUZFMzRcXHVGRTRELVxcdUZFNEZcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjEwLVxcdUZGMTlcXHVGRjIxLVxcdUZGM0FcXHVGRjNGXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXXxcXHVEODAwW1xcdURDMDAtXFx1REMwQlxcdURDMEQtXFx1REMyNlxcdURDMjgtXFx1REMzQVxcdURDM0NcXHVEQzNEXFx1REMzRi1cXHVEQzREXFx1REM1MC1cXHVEQzVEXFx1REM4MC1cXHVEQ0ZBXFx1REQ0MC1cXHVERDc0XFx1RERGRFxcdURFODAtXFx1REU5Q1xcdURFQTAtXFx1REVEMFxcdURFRTBcXHVERjAwLVxcdURGMUZcXHVERjMwLVxcdURGNEFcXHVERjUwLVxcdURGN0FcXHVERjgwLVxcdURGOURcXHVERkEwLVxcdURGQzNcXHVERkM4LVxcdURGQ0ZcXHVERkQxLVxcdURGRDVdfFxcdUQ4MDFbXFx1REMwMC1cXHVEQzlEXFx1RENBMC1cXHVEQ0E5XFx1RENCMC1cXHVEQ0QzXFx1RENEOC1cXHVEQ0ZCXFx1REQwMC1cXHVERDI3XFx1REQzMC1cXHVERDYzXFx1REUwMC1cXHVERjM2XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjY3XXxcXHVEODAyW1xcdURDMDAtXFx1REMwNVxcdURDMDhcXHVEQzBBLVxcdURDMzVcXHVEQzM3XFx1REMzOFxcdURDM0NcXHVEQzNGLVxcdURDNTVcXHVEQzYwLVxcdURDNzZcXHVEQzgwLVxcdURDOUVcXHVEQ0UwLVxcdURDRjJcXHVEQ0Y0XFx1RENGNVxcdUREMDAtXFx1REQxNVxcdUREMjAtXFx1REQzOVxcdUREODAtXFx1RERCN1xcdUREQkVcXHVEREJGXFx1REUwMC1cXHVERTAzXFx1REUwNVxcdURFMDZcXHVERTBDLVxcdURFMTNcXHVERTE1LVxcdURFMTdcXHVERTE5LVxcdURFMzNcXHVERTM4LVxcdURFM0FcXHVERTNGXFx1REU2MC1cXHVERTdDXFx1REU4MC1cXHVERTlDXFx1REVDMC1cXHVERUM3XFx1REVDOS1cXHVERUU2XFx1REYwMC1cXHVERjM1XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjcyXFx1REY4MC1cXHVERjkxXXxcXHVEODAzW1xcdURDMDAtXFx1REM0OFxcdURDODAtXFx1RENCMlxcdURDQzAtXFx1RENGMl18XFx1RDgwNFtcXHVEQzAwLVxcdURDNDZcXHVEQzY2LVxcdURDNkZcXHVEQzdGLVxcdURDQkFcXHVEQ0QwLVxcdURDRThcXHVEQ0YwLVxcdURDRjlcXHVERDAwLVxcdUREMzRcXHVERDM2LVxcdUREM0ZcXHVERDUwLVxcdURENzNcXHVERDc2XFx1REQ4MC1cXHVEREM0XFx1RERDQS1cXHVERENDXFx1REREMC1cXHVERERBXFx1REREQ1xcdURFMDAtXFx1REUxMVxcdURFMTMtXFx1REUzN1xcdURFM0VcXHVERTgwLVxcdURFODZcXHVERTg4XFx1REU4QS1cXHVERThEXFx1REU4Ri1cXHVERTlEXFx1REU5Ri1cXHVERUE4XFx1REVCMC1cXHVERUVBXFx1REVGMC1cXHVERUY5XFx1REYwMC1cXHVERjAzXFx1REYwNS1cXHVERjBDXFx1REYwRlxcdURGMTBcXHVERjEzLVxcdURGMjhcXHVERjJBLVxcdURGMzBcXHVERjMyXFx1REYzM1xcdURGMzUtXFx1REYzOVxcdURGM0MtXFx1REY0NFxcdURGNDdcXHVERjQ4XFx1REY0Qi1cXHVERjREXFx1REY1MFxcdURGNTdcXHVERjVELVxcdURGNjNcXHVERjY2LVxcdURGNkNcXHVERjcwLVxcdURGNzRdfFxcdUQ4MDVbXFx1REMwMC1cXHVEQzRBXFx1REM1MC1cXHVEQzU5XFx1REM4MC1cXHVEQ0M1XFx1RENDN1xcdURDRDAtXFx1RENEOVxcdUREODAtXFx1RERCNVxcdUREQjgtXFx1RERDMFxcdURERDgtXFx1RERERFxcdURFMDAtXFx1REU0MFxcdURFNDRcXHVERTUwLVxcdURFNTlcXHVERTgwLVxcdURFQjdcXHVERUMwLVxcdURFQzlcXHVERjAwLVxcdURGMTlcXHVERjFELVxcdURGMkJcXHVERjMwLVxcdURGMzldfFxcdUQ4MDZbXFx1RENBMC1cXHVEQ0U5XFx1RENGRlxcdURFQzAtXFx1REVGOF18XFx1RDgwN1tcXHVEQzAwLVxcdURDMDhcXHVEQzBBLVxcdURDMzZcXHVEQzM4LVxcdURDNDBcXHVEQzUwLVxcdURDNTlcXHVEQzcyLVxcdURDOEZcXHVEQzkyLVxcdURDQTdcXHVEQ0E5LVxcdURDQjZdfFxcdUQ4MDhbXFx1REMwMC1cXHVERjk5XXxcXHVEODA5W1xcdURDMDAtXFx1REM2RVxcdURDODAtXFx1REQ0M118W1xcdUQ4MENcXHVEODFDLVxcdUQ4MjBcXHVEODQwLVxcdUQ4NjhcXHVEODZBLVxcdUQ4NkNcXHVEODZGLVxcdUQ4NzJdW1xcdURDMDAtXFx1REZGRl18XFx1RDgwRFtcXHVEQzAwLVxcdURDMkVdfFxcdUQ4MTFbXFx1REMwMC1cXHVERTQ2XXxcXHVEODFBW1xcdURDMDAtXFx1REUzOFxcdURFNDAtXFx1REU1RVxcdURFNjAtXFx1REU2OVxcdURFRDAtXFx1REVFRFxcdURFRjAtXFx1REVGNFxcdURGMDAtXFx1REYzNlxcdURGNDAtXFx1REY0M1xcdURGNTAtXFx1REY1OVxcdURGNjMtXFx1REY3N1xcdURGN0QtXFx1REY4Rl18XFx1RDgxQltcXHVERjAwLVxcdURGNDRcXHVERjUwLVxcdURGN0VcXHVERjhGLVxcdURGOUZcXHVERkUwXXxcXHVEODIxW1xcdURDMDAtXFx1REZFQ118XFx1RDgyMltcXHVEQzAwLVxcdURFRjJdfFxcdUQ4MkNbXFx1REMwMFxcdURDMDFdfFxcdUQ4MkZbXFx1REMwMC1cXHVEQzZBXFx1REM3MC1cXHVEQzdDXFx1REM4MC1cXHVEQzg4XFx1REM5MC1cXHVEQzk5XFx1REM5RFxcdURDOUVdfFxcdUQ4MzRbXFx1REQ2NS1cXHVERDY5XFx1REQ2RC1cXHVERDcyXFx1REQ3Qi1cXHVERDgyXFx1REQ4NS1cXHVERDhCXFx1RERBQS1cXHVEREFEXFx1REU0Mi1cXHVERTQ0XXxcXHVEODM1W1xcdURDMDAtXFx1REM1NFxcdURDNTYtXFx1REM5Q1xcdURDOUVcXHVEQzlGXFx1RENBMlxcdURDQTVcXHVEQ0E2XFx1RENBOS1cXHVEQ0FDXFx1RENBRS1cXHVEQ0I5XFx1RENCQlxcdURDQkQtXFx1RENDM1xcdURDQzUtXFx1REQwNVxcdUREMDctXFx1REQwQVxcdUREMEQtXFx1REQxNFxcdUREMTYtXFx1REQxQ1xcdUREMUUtXFx1REQzOVxcdUREM0ItXFx1REQzRVxcdURENDAtXFx1REQ0NFxcdURENDZcXHVERDRBLVxcdURENTBcXHVERDUyLVxcdURFQTVcXHVERUE4LVxcdURFQzBcXHVERUMyLVxcdURFREFcXHVERURDLVxcdURFRkFcXHVERUZDLVxcdURGMTRcXHVERjE2LVxcdURGMzRcXHVERjM2LVxcdURGNEVcXHVERjUwLVxcdURGNkVcXHVERjcwLVxcdURGODhcXHVERjhBLVxcdURGQThcXHVERkFBLVxcdURGQzJcXHVERkM0LVxcdURGQ0JcXHVERkNFLVxcdURGRkZdfFxcdUQ4MzZbXFx1REUwMC1cXHVERTM2XFx1REUzQi1cXHVERTZDXFx1REU3NVxcdURFODRcXHVERTlCLVxcdURFOUZcXHVERUExLVxcdURFQUZdfFxcdUQ4MzhbXFx1REMwMC1cXHVEQzA2XFx1REMwOC1cXHVEQzE4XFx1REMxQi1cXHVEQzIxXFx1REMyM1xcdURDMjRcXHVEQzI2LVxcdURDMkFdfFxcdUQ4M0FbXFx1REMwMC1cXHVEQ0M0XFx1RENEMC1cXHVEQ0Q2XFx1REQwMC1cXHVERDRBXFx1REQ1MC1cXHVERDU5XXxcXHVEODNCW1xcdURFMDAtXFx1REUwM1xcdURFMDUtXFx1REUxRlxcdURFMjFcXHVERTIyXFx1REUyNFxcdURFMjdcXHVERTI5LVxcdURFMzJcXHVERTM0LVxcdURFMzdcXHVERTM5XFx1REUzQlxcdURFNDJcXHVERTQ3XFx1REU0OVxcdURFNEJcXHVERTRELVxcdURFNEZcXHVERTUxXFx1REU1MlxcdURFNTRcXHVERTU3XFx1REU1OVxcdURFNUJcXHVERTVEXFx1REU1RlxcdURFNjFcXHVERTYyXFx1REU2NFxcdURFNjctXFx1REU2QVxcdURFNkMtXFx1REU3MlxcdURFNzQtXFx1REU3N1xcdURFNzktXFx1REU3Q1xcdURFN0VcXHVERTgwLVxcdURFODlcXHVERThCLVxcdURFOUJcXHVERUExLVxcdURFQTNcXHVERUE1LVxcdURFQTlcXHVERUFCLVxcdURFQkJdfFxcdUQ4NjlbXFx1REMwMC1cXHVERUQ2XFx1REYwMC1cXHVERkZGXXxcXHVEODZEW1xcdURDMDAtXFx1REYzNFxcdURGNDAtXFx1REZGRl18XFx1RDg2RVtcXHVEQzAwLVxcdURDMURcXHVEQzIwLVxcdURGRkZdfFxcdUQ4NzNbXFx1REMwMC1cXHVERUExXXxcXHVEODdFW1xcdURDMDAtXFx1REUxRF18XFx1REI0MFtcXHVERDAwLVxcdURERUZdL1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBpc0RlY2ltYWxEaWdpdChjaCkge1xuICAgICAgICByZXR1cm4gMHgzMCA8PSBjaCAmJiBjaCA8PSAweDM5OyAgLy8gMC4uOVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSGV4RGlnaXQoY2gpIHtcbiAgICAgICAgcmV0dXJuIDB4MzAgPD0gY2ggJiYgY2ggPD0gMHgzOSB8fCAgLy8gMC4uOVxuICAgICAgICAgICAgMHg2MSA8PSBjaCAmJiBjaCA8PSAweDY2IHx8ICAgICAvLyBhLi5mXG4gICAgICAgICAgICAweDQxIDw9IGNoICYmIGNoIDw9IDB4NDY7ICAgICAgIC8vIEEuLkZcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09jdGFsRGlnaXQoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoID49IDB4MzAgJiYgY2ggPD0gMHgzNzsgIC8vIDAuLjdcbiAgICB9XG5cbiAgICAvLyA3LjIgV2hpdGUgU3BhY2VcblxuICAgIE5PTl9BU0NJSV9XSElURVNQQUNFUyA9IFtcbiAgICAgICAgMHgxNjgwLFxuICAgICAgICAweDIwMDAsIDB4MjAwMSwgMHgyMDAyLCAweDIwMDMsIDB4MjAwNCwgMHgyMDA1LCAweDIwMDYsIDB4MjAwNywgMHgyMDA4LCAweDIwMDksIDB4MjAwQSxcbiAgICAgICAgMHgyMDJGLCAweDIwNUYsXG4gICAgICAgIDB4MzAwMCxcbiAgICAgICAgMHhGRUZGXG4gICAgXTtcblxuICAgIGZ1bmN0aW9uIGlzV2hpdGVTcGFjZShjaCkge1xuICAgICAgICByZXR1cm4gY2ggPT09IDB4MjAgfHwgY2ggPT09IDB4MDkgfHwgY2ggPT09IDB4MEIgfHwgY2ggPT09IDB4MEMgfHwgY2ggPT09IDB4QTAgfHxcbiAgICAgICAgICAgIGNoID49IDB4MTY4MCAmJiBOT05fQVNDSUlfV0hJVEVTUEFDRVMuaW5kZXhPZihjaCkgPj0gMDtcbiAgICB9XG5cbiAgICAvLyA3LjMgTGluZSBUZXJtaW5hdG9yc1xuXG4gICAgZnVuY3Rpb24gaXNMaW5lVGVybWluYXRvcihjaCkge1xuICAgICAgICByZXR1cm4gY2ggPT09IDB4MEEgfHwgY2ggPT09IDB4MEQgfHwgY2ggPT09IDB4MjAyOCB8fCBjaCA9PT0gMHgyMDI5O1xuICAgIH1cblxuICAgIC8vIDcuNiBJZGVudGlmaWVyIE5hbWVzIGFuZCBJZGVudGlmaWVyc1xuXG4gICAgZnVuY3Rpb24gZnJvbUNvZGVQb2ludChjcCkge1xuICAgICAgICBpZiAoY3AgPD0gMHhGRkZGKSB7IHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKTsgfVxuICAgICAgICB2YXIgY3UxID0gU3RyaW5nLmZyb21DaGFyQ29kZShNYXRoLmZsb29yKChjcCAtIDB4MTAwMDApIC8gMHg0MDApICsgMHhEODAwKTtcbiAgICAgICAgdmFyIGN1MiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjcCAtIDB4MTAwMDApICUgMHg0MDApICsgMHhEQzAwKTtcbiAgICAgICAgcmV0dXJuIGN1MSArIGN1MjtcbiAgICB9XG5cbiAgICBJREVOVElGSUVSX1NUQVJUID0gbmV3IEFycmF5KDB4ODApO1xuICAgIGZvcihjaCA9IDA7IGNoIDwgMHg4MDsgKytjaCkge1xuICAgICAgICBJREVOVElGSUVSX1NUQVJUW2NoXSA9XG4gICAgICAgICAgICBjaCA+PSAweDYxICYmIGNoIDw9IDB4N0EgfHwgIC8vIGEuLnpcbiAgICAgICAgICAgIGNoID49IDB4NDEgJiYgY2ggPD0gMHg1QSB8fCAgLy8gQS4uWlxuICAgICAgICAgICAgY2ggPT09IDB4MjQgfHwgY2ggPT09IDB4NUY7ICAvLyAkIChkb2xsYXIpIGFuZCBfICh1bmRlcnNjb3JlKVxuICAgIH1cblxuICAgIElERU5USUZJRVJfUEFSVCA9IG5ldyBBcnJheSgweDgwKTtcbiAgICBmb3IoY2ggPSAwOyBjaCA8IDB4ODA7ICsrY2gpIHtcbiAgICAgICAgSURFTlRJRklFUl9QQVJUW2NoXSA9XG4gICAgICAgICAgICBjaCA+PSAweDYxICYmIGNoIDw9IDB4N0EgfHwgIC8vIGEuLnpcbiAgICAgICAgICAgIGNoID49IDB4NDEgJiYgY2ggPD0gMHg1QSB8fCAgLy8gQS4uWlxuICAgICAgICAgICAgY2ggPj0gMHgzMCAmJiBjaCA8PSAweDM5IHx8ICAvLyAwLi45XG4gICAgICAgICAgICBjaCA9PT0gMHgyNCB8fCBjaCA9PT0gMHg1RjsgIC8vICQgKGRvbGxhcikgYW5kIF8gKHVuZGVyc2NvcmUpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnRFUzUoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoIDwgMHg4MCA/IElERU5USUZJRVJfU1RBUlRbY2hdIDogRVM1UmVnZXguTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyUGFydEVTNShjaCkge1xuICAgICAgICByZXR1cm4gY2ggPCAweDgwID8gSURFTlRJRklFUl9QQVJUW2NoXSA6IEVTNVJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclBhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnRFUzYoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoIDwgMHg4MCA/IElERU5USUZJRVJfU1RBUlRbY2hdIDogRVM2UmVnZXguTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyUGFydEVTNihjaCkge1xuICAgICAgICByZXR1cm4gY2ggPCAweDgwID8gSURFTlRJRklFUl9QQVJUW2NoXSA6IEVTNlJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclBhcnQudGVzdChmcm9tQ29kZVBvaW50KGNoKSk7XG4gICAgfVxuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgICAgIGlzRGVjaW1hbERpZ2l0OiBpc0RlY2ltYWxEaWdpdCxcbiAgICAgICAgaXNIZXhEaWdpdDogaXNIZXhEaWdpdCxcbiAgICAgICAgaXNPY3RhbERpZ2l0OiBpc09jdGFsRGlnaXQsXG4gICAgICAgIGlzV2hpdGVTcGFjZTogaXNXaGl0ZVNwYWNlLFxuICAgICAgICBpc0xpbmVUZXJtaW5hdG9yOiBpc0xpbmVUZXJtaW5hdG9yLFxuICAgICAgICBpc0lkZW50aWZpZXJTdGFydEVTNTogaXNJZGVudGlmaWVyU3RhcnRFUzUsXG4gICAgICAgIGlzSWRlbnRpZmllclBhcnRFUzU6IGlzSWRlbnRpZmllclBhcnRFUzUsXG4gICAgICAgIGlzSWRlbnRpZmllclN0YXJ0RVM2OiBpc0lkZW50aWZpZXJTdGFydEVTNixcbiAgICAgICAgaXNJZGVudGlmaWVyUGFydEVTNjogaXNJZGVudGlmaWVyUGFydEVTNlxuICAgIH07XG59KCkpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbiIsIi8qXG4gIENvcHlyaWdodCAoQykgMjAxMyBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgY29kZSA9IHJlcXVpcmUoJy4vY29kZScpO1xuXG4gICAgZnVuY3Rpb24gaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkRVM2KGlkKSB7XG4gICAgICAgIHN3aXRjaCAoaWQpIHtcbiAgICAgICAgY2FzZSAnaW1wbGVtZW50cyc6XG4gICAgICAgIGNhc2UgJ2ludGVyZmFjZSc6XG4gICAgICAgIGNhc2UgJ3BhY2thZ2UnOlxuICAgICAgICBjYXNlICdwcml2YXRlJzpcbiAgICAgICAgY2FzZSAncHJvdGVjdGVkJzpcbiAgICAgICAgY2FzZSAncHVibGljJzpcbiAgICAgICAgY2FzZSAnc3RhdGljJzpcbiAgICAgICAgY2FzZSAnbGV0JzpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNLZXl3b3JkRVM1KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgLy8geWllbGQgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIGFzIGtleXdvcmQgdW5kZXIgbm9uLXN0cmljdCBtb2RlLlxuICAgICAgICBpZiAoIXN0cmljdCAmJiBpZCA9PT0gJ3lpZWxkJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0tleXdvcmRFUzYoaWQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNLZXl3b3JkRVM2KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgaWYgKHN0cmljdCAmJiBpc1N0cmljdE1vZGVSZXNlcnZlZFdvcmRFUzYoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoaWQubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdpZicpIHx8IChpZCA9PT0gJ2luJykgfHwgKGlkID09PSAnZG8nKTtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3ZhcicpIHx8IChpZCA9PT0gJ2ZvcicpIHx8IChpZCA9PT0gJ25ldycpIHx8IChpZCA9PT0gJ3RyeScpO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAndGhpcycpIHx8IChpZCA9PT0gJ2Vsc2UnKSB8fCAoaWQgPT09ICdjYXNlJykgfHxcbiAgICAgICAgICAgICAgICAoaWQgPT09ICd2b2lkJykgfHwgKGlkID09PSAnd2l0aCcpIHx8IChpZCA9PT0gJ2VudW0nKTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3doaWxlJykgfHwgKGlkID09PSAnYnJlYWsnKSB8fCAoaWQgPT09ICdjYXRjaCcpIHx8XG4gICAgICAgICAgICAgICAgKGlkID09PSAndGhyb3cnKSB8fCAoaWQgPT09ICdjb25zdCcpIHx8IChpZCA9PT0gJ3lpZWxkJykgfHxcbiAgICAgICAgICAgICAgICAoaWQgPT09ICdjbGFzcycpIHx8IChpZCA9PT0gJ3N1cGVyJyk7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdyZXR1cm4nKSB8fCAoaWQgPT09ICd0eXBlb2YnKSB8fCAoaWQgPT09ICdkZWxldGUnKSB8fFxuICAgICAgICAgICAgICAgIChpZCA9PT0gJ3N3aXRjaCcpIHx8IChpZCA9PT0gJ2V4cG9ydCcpIHx8IChpZCA9PT0gJ2ltcG9ydCcpO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAnZGVmYXVsdCcpIHx8IChpZCA9PT0gJ2ZpbmFsbHknKSB8fCAoaWQgPT09ICdleHRlbmRzJyk7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdmdW5jdGlvbicpIHx8IChpZCA9PT0gJ2NvbnRpbnVlJykgfHwgKGlkID09PSAnZGVidWdnZXInKTtcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICdpbnN0YW5jZW9mJyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Jlc2VydmVkV29yZEVTNShpZCwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBpZCA9PT0gJ251bGwnIHx8IGlkID09PSAndHJ1ZScgfHwgaWQgPT09ICdmYWxzZScgfHwgaXNLZXl3b3JkRVM1KGlkLCBzdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUmVzZXJ2ZWRXb3JkRVM2KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGlkID09PSAnbnVsbCcgfHwgaWQgPT09ICd0cnVlJyB8fCBpZCA9PT0gJ2ZhbHNlJyB8fCBpc0tleXdvcmRFUzYoaWQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNSZXN0cmljdGVkV29yZChpZCkge1xuICAgICAgICByZXR1cm4gaWQgPT09ICdldmFsJyB8fCBpZCA9PT0gJ2FyZ3VtZW50cyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyTmFtZUVTNShpZCkge1xuICAgICAgICB2YXIgaSwgaXosIGNoO1xuXG4gICAgICAgIGlmIChpZC5sZW5ndGggPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgY2ggPSBpZC5jaGFyQ29kZUF0KDApO1xuICAgICAgICBpZiAoIWNvZGUuaXNJZGVudGlmaWVyU3RhcnRFUzUoY2gpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAxLCBpeiA9IGlkLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgIGNoID0gaWQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmICghY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1KGNoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWNvZGVVdGYxNihsZWFkLCB0cmFpbCkge1xuICAgICAgICByZXR1cm4gKGxlYWQgLSAweEQ4MDApICogMHg0MDAgKyAodHJhaWwgLSAweERDMDApICsgMHgxMDAwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0lkZW50aWZpZXJOYW1lRVM2KGlkKSB7XG4gICAgICAgIHZhciBpLCBpeiwgY2gsIGxvd0NoLCBjaGVjaztcblxuICAgICAgICBpZiAoaWQubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgIGNoZWNrID0gY29kZS5pc0lkZW50aWZpZXJTdGFydEVTNjtcbiAgICAgICAgZm9yIChpID0gMCwgaXogPSBpZC5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICBjaCA9IGlkLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoMHhEODAwIDw9IGNoICYmIGNoIDw9IDB4REJGRikge1xuICAgICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgICAgICBpZiAoaSA+PSBpeikgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgICAgICBsb3dDaCA9IGlkLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKCEoMHhEQzAwIDw9IGxvd0NoICYmIGxvd0NoIDw9IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaCA9IGRlY29kZVV0ZjE2KGNoLCBsb3dDaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNoZWNrKGNoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoZWNrID0gY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM2O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllckVTNShpZCwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBpc0lkZW50aWZpZXJOYW1lRVM1KGlkKSAmJiAhaXNSZXNlcnZlZFdvcmRFUzUoaWQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyRVM2KGlkLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGlzSWRlbnRpZmllck5hbWVFUzYoaWQpICYmICFpc1Jlc2VydmVkV29yZEVTNihpZCwgc3RyaWN0KTtcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAgICAgaXNLZXl3b3JkRVM1OiBpc0tleXdvcmRFUzUsXG4gICAgICAgIGlzS2V5d29yZEVTNjogaXNLZXl3b3JkRVM2LFxuICAgICAgICBpc1Jlc2VydmVkV29yZEVTNTogaXNSZXNlcnZlZFdvcmRFUzUsXG4gICAgICAgIGlzUmVzZXJ2ZWRXb3JkRVM2OiBpc1Jlc2VydmVkV29yZEVTNixcbiAgICAgICAgaXNSZXN0cmljdGVkV29yZDogaXNSZXN0cmljdGVkV29yZCxcbiAgICAgICAgaXNJZGVudGlmaWVyTmFtZUVTNTogaXNJZGVudGlmaWVyTmFtZUVTNSxcbiAgICAgICAgaXNJZGVudGlmaWVyTmFtZUVTNjogaXNJZGVudGlmaWVyTmFtZUVTNixcbiAgICAgICAgaXNJZGVudGlmaWVyRVM1OiBpc0lkZW50aWZpZXJFUzUsXG4gICAgICAgIGlzSWRlbnRpZmllckVTNjogaXNJZGVudGlmaWVyRVM2XG4gICAgfTtcbn0oKSk7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiLypcbiAgQ29weXJpZ2h0IChDKSAyMDEzIFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgZXhwb3J0cy5hc3QgPSByZXF1aXJlKCcuL2FzdCcpO1xuICAgIGV4cG9ydHMuY29kZSA9IHJlcXVpcmUoJy4vY29kZScpO1xuICAgIGV4cG9ydHMua2V5d29yZCA9IHJlcXVpcmUoJy4va2V5d29yZCcpO1xufSgpKTtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG4iLCJjb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2V4dHJhY3QtemlwJylcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBub2RlL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnNcbmNvbnN0IHsgY3JlYXRlV3JpdGVTdHJlYW0sIHByb21pc2VzOiBmcyB9ID0gcmVxdWlyZSgnZnMnKVxuY29uc3QgZ2V0U3RyZWFtID0gcmVxdWlyZSgnZ2V0LXN0cmVhbScpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCB7IHByb21pc2lmeSB9ID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgeWF1emwgPSByZXF1aXJlKCd5YXV6bCcpXG5cbmNvbnN0IG9wZW5aaXAgPSBwcm9taXNpZnkoeWF1emwub3BlbilcbmNvbnN0IHBpcGVsaW5lID0gcHJvbWlzaWZ5KHN0cmVhbS5waXBlbGluZSlcblxuY2xhc3MgRXh0cmFjdG9yIHtcbiAgY29uc3RydWN0b3IgKHppcFBhdGgsIG9wdHMpIHtcbiAgICB0aGlzLnppcFBhdGggPSB6aXBQYXRoXG4gICAgdGhpcy5vcHRzID0gb3B0c1xuICB9XG5cbiAgYXN5bmMgZXh0cmFjdCAoKSB7XG4gICAgZGVidWcoJ29wZW5pbmcnLCB0aGlzLnppcFBhdGgsICd3aXRoIG9wdHMnLCB0aGlzLm9wdHMpXG5cbiAgICB0aGlzLnppcGZpbGUgPSBhd2FpdCBvcGVuWmlwKHRoaXMuemlwUGF0aCwgeyBsYXp5RW50cmllczogdHJ1ZSB9KVxuICAgIHRoaXMuY2FuY2VsZWQgPSBmYWxzZVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuemlwZmlsZS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZVxuICAgICAgICByZWplY3QoZXJyKVxuICAgICAgfSlcbiAgICAgIHRoaXMuemlwZmlsZS5yZWFkRW50cnkoKVxuXG4gICAgICB0aGlzLnppcGZpbGUub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2FuY2VsZWQpIHtcbiAgICAgICAgICBkZWJ1ZygnemlwIGV4dHJhY3Rpb24gY29tcGxldGUnKVxuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICB0aGlzLnppcGZpbGUub24oJ2VudHJ5JywgYXN5bmMgZW50cnkgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsZWQpIHtcbiAgICAgICAgICBkZWJ1Zygnc2tpcHBpbmcgZW50cnknLCBlbnRyeS5maWxlTmFtZSwgeyBjYW5jZWxsZWQ6IHRoaXMuY2FuY2VsZWQgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGRlYnVnKCd6aXBmaWxlIGVudHJ5JywgZW50cnkuZmlsZU5hbWUpXG5cbiAgICAgICAgaWYgKGVudHJ5LmZpbGVOYW1lLnN0YXJ0c1dpdGgoJ19fTUFDT1NYLycpKSB7XG4gICAgICAgICAgdGhpcy56aXBmaWxlLnJlYWRFbnRyeSgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXN0RGlyID0gcGF0aC5kaXJuYW1lKHBhdGguam9pbih0aGlzLm9wdHMuZGlyLCBlbnRyeS5maWxlTmFtZSkpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihkZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuXG4gICAgICAgICAgY29uc3QgY2Fub25pY2FsRGVzdERpciA9IGF3YWl0IGZzLnJlYWxwYXRoKGRlc3REaXIpXG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVEZXN0RGlyID0gcGF0aC5yZWxhdGl2ZSh0aGlzLm9wdHMuZGlyLCBjYW5vbmljYWxEZXN0RGlyKVxuXG4gICAgICAgICAgaWYgKHJlbGF0aXZlRGVzdERpci5zcGxpdChwYXRoLnNlcCkuaW5jbHVkZXMoJy4uJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3V0IG9mIGJvdW5kIHBhdGggXCIke2Nhbm9uaWNhbERlc3REaXJ9XCIgZm91bmQgd2hpbGUgcHJvY2Vzc2luZyBmaWxlICR7ZW50cnkuZmlsZU5hbWV9YClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLmV4dHJhY3RFbnRyeShlbnRyeSlcbiAgICAgICAgICBkZWJ1ZygnZmluaXNoZWQgcHJvY2Vzc2luZycsIGVudHJ5LmZpbGVOYW1lKVxuICAgICAgICAgIHRoaXMuemlwZmlsZS5yZWFkRW50cnkoKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuemlwZmlsZS5jbG9zZSgpXG4gICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgZXh0cmFjdEVudHJ5IChlbnRyeSkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICh0aGlzLmNhbmNlbGVkKSB7XG4gICAgICBkZWJ1Zygnc2tpcHBpbmcgZW50cnkgZXh0cmFjdGlvbicsIGVudHJ5LmZpbGVOYW1lLCB7IGNhbmNlbGxlZDogdGhpcy5jYW5jZWxlZCB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0cy5vbkVudHJ5KSB7XG4gICAgICB0aGlzLm9wdHMub25FbnRyeShlbnRyeSwgdGhpcy56aXBmaWxlKVxuICAgIH1cblxuICAgIGNvbnN0IGRlc3QgPSBwYXRoLmpvaW4odGhpcy5vcHRzLmRpciwgZW50cnkuZmlsZU5hbWUpXG5cbiAgICAvLyBjb252ZXJ0IGV4dGVybmFsIGZpbGUgYXR0ciBpbnQgaW50byBhIGZzIHN0YXQgbW9kZSBpbnRcbiAgICBjb25zdCBtb2RlID0gKGVudHJ5LmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPj4gMTYpICYgMHhGRkZGXG4gICAgLy8gY2hlY2sgaWYgaXQncyBhIHN5bWxpbmsgb3IgZGlyICh1c2luZyBzdGF0IG1vZGUgY29uc3RhbnRzKVxuICAgIGNvbnN0IElGTVQgPSA2MTQ0MFxuICAgIGNvbnN0IElGRElSID0gMTYzODRcbiAgICBjb25zdCBJRkxOSyA9IDQwOTYwXG4gICAgY29uc3Qgc3ltbGluayA9IChtb2RlICYgSUZNVCkgPT09IElGTE5LXG4gICAgbGV0IGlzRGlyID0gKG1vZGUgJiBJRk1UKSA9PT0gSUZESVJcblxuICAgIC8vIEZhaWxzYWZlLCBib3Jyb3dlZCBmcm9tIGpzWmlwXG4gICAgaWYgKCFpc0RpciAmJiBlbnRyeS5maWxlTmFtZS5lbmRzV2l0aCgnLycpKSB7XG4gICAgICBpc0RpciA9IHRydWVcbiAgICB9XG5cbiAgICAvLyBjaGVjayBmb3Igd2luZG93cyB3ZWlyZCB3YXkgb2Ygc3BlY2lmeWluZyBhIGRpcmVjdG9yeVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXhvZ2Rlbi9leHRyYWN0LXppcC9pc3N1ZXMvMTMjaXNzdWVjb21tZW50LTE1NDQ5NDU2NlxuICAgIGNvbnN0IG1hZGVCeSA9IGVudHJ5LnZlcnNpb25NYWRlQnkgPj4gOFxuICAgIGlmICghaXNEaXIpIGlzRGlyID0gKG1hZGVCeSA9PT0gMCAmJiBlbnRyeS5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID09PSAxNilcblxuICAgIGRlYnVnKCdleHRyYWN0aW5nIGVudHJ5JywgeyBmaWxlbmFtZTogZW50cnkuZmlsZU5hbWUsIGlzRGlyOiBpc0RpciwgaXNTeW1saW5rOiBzeW1saW5rIH0pXG5cbiAgICBjb25zdCBwcm9jTW9kZSA9IHRoaXMuZ2V0RXh0cmFjdGVkTW9kZShtb2RlLCBpc0RpcikgJiAwbzc3N1xuXG4gICAgLy8gYWx3YXlzIGVuc3VyZSBmb2xkZXJzIGFyZSBjcmVhdGVkXG4gICAgY29uc3QgZGVzdERpciA9IGlzRGlyID8gZGVzdCA6IHBhdGguZGlybmFtZShkZXN0KVxuXG4gICAgY29uc3QgbWtkaXJPcHRpb25zID0geyByZWN1cnNpdmU6IHRydWUgfVxuICAgIGlmIChpc0Rpcikge1xuICAgICAgbWtkaXJPcHRpb25zLm1vZGUgPSBwcm9jTW9kZVxuICAgIH1cbiAgICBkZWJ1ZygnbWtkaXInLCB7IGRpcjogZGVzdERpciwgLi4ubWtkaXJPcHRpb25zIH0pXG4gICAgYXdhaXQgZnMubWtkaXIoZGVzdERpciwgbWtkaXJPcHRpb25zKVxuICAgIGlmIChpc0RpcikgcmV0dXJuXG5cbiAgICBkZWJ1Zygnb3BlbmluZyByZWFkIHN0cmVhbScsIGRlc3QpXG4gICAgY29uc3QgcmVhZFN0cmVhbSA9IGF3YWl0IHByb21pc2lmeSh0aGlzLnppcGZpbGUub3BlblJlYWRTdHJlYW0uYmluZCh0aGlzLnppcGZpbGUpKShlbnRyeSlcblxuICAgIGlmIChzeW1saW5rKSB7XG4gICAgICBjb25zdCBsaW5rID0gYXdhaXQgZ2V0U3RyZWFtKHJlYWRTdHJlYW0pXG4gICAgICBkZWJ1ZygnY3JlYXRpbmcgc3ltbGluaycsIGxpbmssIGRlc3QpXG4gICAgICBhd2FpdCBmcy5zeW1saW5rKGxpbmssIGRlc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHBpcGVsaW5lKHJlYWRTdHJlYW0sIGNyZWF0ZVdyaXRlU3RyZWFtKGRlc3QsIHsgbW9kZTogcHJvY01vZGUgfSkpXG4gICAgfVxuICB9XG5cbiAgZ2V0RXh0cmFjdGVkTW9kZSAoZW50cnlNb2RlLCBpc0Rpcikge1xuICAgIGxldCBtb2RlID0gZW50cnlNb2RlXG4gICAgLy8gU2V0IGRlZmF1bHRzLCBpZiBuZWNlc3NhcnlcbiAgICBpZiAobW9kZSA9PT0gMCkge1xuICAgICAgaWYgKGlzRGlyKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZGVmYXVsdERpck1vZGUpIHtcbiAgICAgICAgICBtb2RlID0gcGFyc2VJbnQodGhpcy5vcHRzLmRlZmF1bHREaXJNb2RlLCAxMClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbW9kZSkge1xuICAgICAgICAgIG1vZGUgPSAwbzc1NVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5vcHRzLmRlZmF1bHRGaWxlTW9kZSkge1xuICAgICAgICAgIG1vZGUgPSBwYXJzZUludCh0aGlzLm9wdHMuZGVmYXVsdEZpbGVNb2RlLCAxMClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbW9kZSkge1xuICAgICAgICAgIG1vZGUgPSAwbzY0NFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIGZ1bmN0aW9uICh6aXBQYXRoLCBvcHRzKSB7XG4gIGRlYnVnKCdjcmVhdGluZyB0YXJnZXQgZGlyZWN0b3J5Jywgb3B0cy5kaXIpXG5cbiAgaWYgKCFwYXRoLmlzQWJzb2x1dGUob3B0cy5kaXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgZGlyZWN0b3J5IGlzIGV4cGVjdGVkIHRvIGJlIGFic29sdXRlJylcbiAgfVxuXG4gIGF3YWl0IGZzLm1rZGlyKG9wdHMuZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICBvcHRzLmRpciA9IGF3YWl0IGZzLnJlYWxwYXRoKG9wdHMuZGlyKVxuICByZXR1cm4gbmV3IEV4dHJhY3Rvcih6aXBQYXRoLCBvcHRzKS5leHRyYWN0KClcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRml4ZWRGSUZPIHtcbiAgY29uc3RydWN0b3IgKGh3bSkge1xuICAgIGlmICghKGh3bSA+IDApIHx8ICgoaHdtIC0gMSkgJiBod20pICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ01heCBzaXplIGZvciBhIEZpeGVkRklGTyBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28nKVxuICAgIHRoaXMuYnVmZmVyID0gbmV3IEFycmF5KGh3bSlcbiAgICB0aGlzLm1hc2sgPSBod20gLSAxXG4gICAgdGhpcy50b3AgPSAwXG4gICAgdGhpcy5idG0gPSAwXG4gICAgdGhpcy5uZXh0ID0gbnVsbFxuICB9XG5cbiAgY2xlYXIgKCkge1xuICAgIHRoaXMudG9wID0gdGhpcy5idG0gPSAwXG4gICAgdGhpcy5uZXh0ID0gbnVsbFxuICAgIHRoaXMuYnVmZmVyLmZpbGwodW5kZWZpbmVkKVxuICB9XG5cbiAgcHVzaCAoZGF0YSkge1xuICAgIGlmICh0aGlzLmJ1ZmZlclt0aGlzLnRvcF0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlXG4gICAgdGhpcy5idWZmZXJbdGhpcy50b3BdID0gZGF0YVxuICAgIHRoaXMudG9wID0gKHRoaXMudG9wICsgMSkgJiB0aGlzLm1hc2tcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgc2hpZnQgKCkge1xuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmJ1ZmZlclt0aGlzLmJ0bV1cbiAgICBpZiAobGFzdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgdGhpcy5idWZmZXJbdGhpcy5idG1dID0gdW5kZWZpbmVkXG4gICAgdGhpcy5idG0gPSAodGhpcy5idG0gKyAxKSAmIHRoaXMubWFza1xuICAgIHJldHVybiBsYXN0XG4gIH1cblxuICBwZWVrICgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5idG1dXG4gIH1cblxuICBpc0VtcHR5ICgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5idG1dID09PSB1bmRlZmluZWRcbiAgfVxufVxuIiwiY29uc3QgRml4ZWRGSUZPID0gcmVxdWlyZSgnLi9maXhlZC1zaXplJylcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBGYXN0RklGTyB7XG4gIGNvbnN0cnVjdG9yIChod20pIHtcbiAgICB0aGlzLmh3bSA9IGh3bSB8fCAxNlxuICAgIHRoaXMuaGVhZCA9IG5ldyBGaXhlZEZJRk8odGhpcy5od20pXG4gICAgdGhpcy50YWlsID0gdGhpcy5oZWFkXG4gICAgdGhpcy5sZW5ndGggPSAwXG4gIH1cblxuICBjbGVhciAoKSB7XG4gICAgdGhpcy5oZWFkID0gdGhpcy50YWlsXG4gICAgdGhpcy5oZWFkLmNsZWFyKClcbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgfVxuXG4gIHB1c2ggKHZhbCkge1xuICAgIHRoaXMubGVuZ3RoKytcbiAgICBpZiAoIXRoaXMuaGVhZC5wdXNoKHZhbCkpIHtcbiAgICAgIGNvbnN0IHByZXYgPSB0aGlzLmhlYWRcbiAgICAgIHRoaXMuaGVhZCA9IHByZXYubmV4dCA9IG5ldyBGaXhlZEZJRk8oMiAqIHRoaXMuaGVhZC5idWZmZXIubGVuZ3RoKVxuICAgICAgdGhpcy5oZWFkLnB1c2godmFsKVxuICAgIH1cbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggIT09IDApIHRoaXMubGVuZ3RoLS1cbiAgICBjb25zdCB2YWwgPSB0aGlzLnRhaWwuc2hpZnQoKVxuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnRhaWwubmV4dCkge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMudGFpbC5uZXh0XG4gICAgICB0aGlzLnRhaWwubmV4dCA9IG51bGxcbiAgICAgIHRoaXMudGFpbCA9IG5leHRcbiAgICAgIHJldHVybiB0aGlzLnRhaWwuc2hpZnQoKVxuICAgIH1cblxuICAgIHJldHVybiB2YWxcbiAgfVxuXG4gIHBlZWsgKCkge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMudGFpbC5wZWVrKClcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgJiYgdGhpcy50YWlsLm5leHQpIHJldHVybiB0aGlzLnRhaWwubmV4dC5wZWVrKClcbiAgICByZXR1cm4gdmFsXG4gIH1cblxuICBpc0VtcHR5ICgpIHtcbiAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDBcbiAgfVxufVxuIiwidmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xudmFyIFJlYWRhYmxlID0gc3RyZWFtLlJlYWRhYmxlO1xudmFyIFdyaXRhYmxlID0gc3RyZWFtLldyaXRhYmxlO1xudmFyIFBhc3NUaHJvdWdoID0gc3RyZWFtLlBhc3NUaHJvdWdoO1xudmFyIFBlbmQgPSByZXF1aXJlKCdwZW5kJyk7XG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG5leHBvcnRzLmNyZWF0ZUZyb21CdWZmZXIgPSBjcmVhdGVGcm9tQnVmZmVyO1xuZXhwb3J0cy5jcmVhdGVGcm9tRmQgPSBjcmVhdGVGcm9tRmQ7XG5leHBvcnRzLkJ1ZmZlclNsaWNlciA9IEJ1ZmZlclNsaWNlcjtcbmV4cG9ydHMuRmRTbGljZXIgPSBGZFNsaWNlcjtcblxudXRpbC5pbmhlcml0cyhGZFNsaWNlciwgRXZlbnRFbWl0dGVyKTtcbmZ1bmN0aW9uIEZkU2xpY2VyKGZkLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcblxuICB0aGlzLmZkID0gZmQ7XG4gIHRoaXMucGVuZCA9IG5ldyBQZW5kKCk7XG4gIHRoaXMucGVuZC5tYXggPSAxO1xuICB0aGlzLnJlZkNvdW50ID0gMDtcbiAgdGhpcy5hdXRvQ2xvc2UgPSAhIW9wdGlvbnMuYXV0b0Nsb3NlO1xufVxuXG5GZFNsaWNlci5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYucGVuZC5nbyhmdW5jdGlvbihjYikge1xuICAgIGZzLnJlYWQoc2VsZi5mZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGZ1bmN0aW9uKGVyciwgYnl0ZXNSZWFkLCBidWZmZXIpIHtcbiAgICAgIGNiKCk7XG4gICAgICBjYWxsYmFjayhlcnIsIGJ5dGVzUmVhZCwgYnVmZmVyKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5GZFNsaWNlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLnBlbmQuZ28oZnVuY3Rpb24oY2IpIHtcbiAgICBmcy53cml0ZShzZWxmLmZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgZnVuY3Rpb24oZXJyLCB3cml0dGVuLCBidWZmZXIpIHtcbiAgICAgIGNiKCk7XG4gICAgICBjYWxsYmFjayhlcnIsIHdyaXR0ZW4sIGJ1ZmZlcik7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuRmRTbGljZXIucHJvdG90eXBlLmNyZWF0ZVJlYWRTdHJlYW0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUmVhZFN0cmVhbSh0aGlzLCBvcHRpb25zKTtcbn07XG5cbkZkU2xpY2VyLnByb3RvdHlwZS5jcmVhdGVXcml0ZVN0cmVhbSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBXcml0ZVN0cmVhbSh0aGlzLCBvcHRpb25zKTtcbn07XG5cbkZkU2xpY2VyLnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZWZDb3VudCArPSAxO1xufTtcblxuRmRTbGljZXIucHJvdG90eXBlLnVucmVmID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5yZWZDb3VudCAtPSAxO1xuXG4gIGlmIChzZWxmLnJlZkNvdW50ID4gMCkgcmV0dXJuO1xuICBpZiAoc2VsZi5yZWZDb3VudCA8IDApIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgdW5yZWZcIik7XG5cbiAgaWYgKHNlbGYuYXV0b0Nsb3NlKSB7XG4gICAgZnMuY2xvc2Uoc2VsZi5mZCwgb25DbG9zZURvbmUpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25DbG9zZURvbmUoZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuZW1pdCgnY2xvc2UnKTtcbiAgICB9XG4gIH1cbn07XG5cbnV0aWwuaW5oZXJpdHMoUmVhZFN0cmVhbSwgUmVhZGFibGUpO1xuZnVuY3Rpb24gUmVhZFN0cmVhbShjb250ZXh0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuY29udGV4dC5yZWYoKTtcblxuICB0aGlzLnN0YXJ0ID0gb3B0aW9ucy5zdGFydCB8fCAwO1xuICB0aGlzLmVuZE9mZnNldCA9IG9wdGlvbnMuZW5kO1xuICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG59XG5cblJlYWRTdHJlYW0ucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24obikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gIHZhciB0b1JlYWQgPSBNYXRoLm1pbihzZWxmLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmssIG4pO1xuICBpZiAoc2VsZi5lbmRPZmZzZXQgIT0gbnVsbCkge1xuICAgIHRvUmVhZCA9IE1hdGgubWluKHRvUmVhZCwgc2VsZi5lbmRPZmZzZXQgLSBzZWxmLnBvcyk7XG4gIH1cbiAgaWYgKHRvUmVhZCA8PSAwKSB7XG4gICAgc2VsZi5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHNlbGYucHVzaChudWxsKTtcbiAgICBzZWxmLmNvbnRleHQudW5yZWYoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgc2VsZi5jb250ZXh0LnBlbmQuZ28oZnVuY3Rpb24oY2IpIHtcbiAgICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVybiBjYigpO1xuICAgIHZhciBidWZmZXIgPSBuZXcgQnVmZmVyKHRvUmVhZCk7XG4gICAgZnMucmVhZChzZWxmLmNvbnRleHQuZmQsIGJ1ZmZlciwgMCwgdG9SZWFkLCBzZWxmLnBvcywgZnVuY3Rpb24oZXJyLCBieXRlc1JlYWQpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgc2VsZi5kZXN0cm95KGVycik7XG4gICAgICB9IGVsc2UgaWYgKGJ5dGVzUmVhZCA9PT0gMCkge1xuICAgICAgICBzZWxmLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgIHNlbGYucHVzaChudWxsKTtcbiAgICAgICAgc2VsZi5jb250ZXh0LnVucmVmKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLnBvcyArPSBieXRlc1JlYWQ7XG4gICAgICAgIHNlbGYucHVzaChidWZmZXIuc2xpY2UoMCwgYnl0ZXNSZWFkKSk7XG4gICAgICB9XG4gICAgICBjYigpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cblJlYWRTdHJlYW0ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbihlcnIpIHtcbiAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gIGVyciA9IGVyciB8fCBuZXcgRXJyb3IoXCJzdHJlYW0gZGVzdHJveWVkXCIpO1xuICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICB0aGlzLmNvbnRleHQudW5yZWYoKTtcbn07XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGVTdHJlYW0sIFdyaXRhYmxlKTtcbmZ1bmN0aW9uIFdyaXRlU3RyZWFtKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5jb250ZXh0LnJlZigpO1xuXG4gIHRoaXMuc3RhcnQgPSBvcHRpb25zLnN0YXJ0IHx8IDA7XG4gIHRoaXMuZW5kT2Zmc2V0ID0gKG9wdGlvbnMuZW5kID09IG51bGwpID8gSW5maW5pdHkgOiArb3B0aW9ucy5lbmQ7XG4gIHRoaXMuYnl0ZXNXcml0dGVuID0gMDtcbiAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIHRoaXMub24oJ2ZpbmlzaCcsIHRoaXMuZGVzdHJveS5iaW5kKHRoaXMpKTtcbn1cblxuV3JpdGVTdHJlYW0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlciwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm47XG5cbiAgaWYgKHNlbGYucG9zICsgYnVmZmVyLmxlbmd0aCA+IHNlbGYuZW5kT2Zmc2V0KSB7XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIm1heGltdW0gZmlsZSBsZW5ndGggZXhjZWVkZWRcIik7XG4gICAgZXJyLmNvZGUgPSAnRVRPT0JJRyc7XG4gICAgc2VsZi5kZXN0cm95KCk7XG4gICAgY2FsbGJhY2soZXJyKTtcbiAgICByZXR1cm47XG4gIH1cbiAgc2VsZi5jb250ZXh0LnBlbmQuZ28oZnVuY3Rpb24oY2IpIHtcbiAgICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVybiBjYigpO1xuICAgIGZzLndyaXRlKHNlbGYuY29udGV4dC5mZCwgYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCBzZWxmLnBvcywgZnVuY3Rpb24oZXJyLCBieXRlcykge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBzZWxmLmRlc3Ryb3koKTtcbiAgICAgICAgY2IoKTtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYuYnl0ZXNXcml0dGVuICs9IGJ5dGVzO1xuICAgICAgICBzZWxmLnBvcyArPSBieXRlcztcbiAgICAgICAgc2VsZi5lbWl0KCdwcm9ncmVzcycpO1xuICAgICAgICBjYigpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbldyaXRlU3RyZWFtLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gIHRoaXMuY29udGV4dC51bnJlZigpO1xufTtcblxudXRpbC5pbmhlcml0cyhCdWZmZXJTbGljZXIsIEV2ZW50RW1pdHRlcik7XG5mdW5jdGlvbiBCdWZmZXJTbGljZXIoYnVmZmVyLCBvcHRpb25zKSB7XG4gIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB0aGlzLnJlZkNvdW50ID0gMDtcbiAgdGhpcy5idWZmZXIgPSBidWZmZXI7XG4gIHRoaXMubWF4Q2h1bmtTaXplID0gb3B0aW9ucy5tYXhDaHVua1NpemUgfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbkJ1ZmZlclNsaWNlci5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaykge1xuICB2YXIgZW5kID0gcG9zaXRpb24gKyBsZW5ndGg7XG4gIHZhciBkZWx0YSA9IGVuZCAtIHRoaXMuYnVmZmVyLmxlbmd0aDtcbiAgdmFyIHdyaXR0ZW4gPSAoZGVsdGEgPiAwKSA/IGRlbHRhIDogbGVuZ3RoO1xuICB0aGlzLmJ1ZmZlci5jb3B5KGJ1ZmZlciwgb2Zmc2V0LCBwb3NpdGlvbiwgZW5kKTtcbiAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgIGNhbGxiYWNrKG51bGwsIHdyaXR0ZW4pO1xuICB9KTtcbn07XG5cbkJ1ZmZlclNsaWNlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spIHtcbiAgYnVmZmVyLmNvcHkodGhpcy5idWZmZXIsIHBvc2l0aW9uLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7XG4gIHNldEltbWVkaWF0ZShmdW5jdGlvbigpIHtcbiAgICBjYWxsYmFjayhudWxsLCBsZW5ndGgsIGJ1ZmZlcik7XG4gIH0pO1xufTtcblxuQnVmZmVyU2xpY2VyLnByb3RvdHlwZS5jcmVhdGVSZWFkU3RyZWFtID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJlYWRTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2gob3B0aW9ucyk7XG4gIHJlYWRTdHJlYW0uZGVzdHJveWVkID0gZmFsc2U7XG4gIHJlYWRTdHJlYW0uc3RhcnQgPSBvcHRpb25zLnN0YXJ0IHx8IDA7XG4gIHJlYWRTdHJlYW0uZW5kT2Zmc2V0ID0gb3B0aW9ucy5lbmQ7XG4gIC8vIGJ5IHRoZSB0aW1lIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgd2UnbGwgYmUgZG9uZS5cbiAgcmVhZFN0cmVhbS5wb3MgPSByZWFkU3RyZWFtLmVuZE9mZnNldCB8fCB0aGlzLmJ1ZmZlci5sZW5ndGg7XG5cbiAgLy8gcmVzcGVjdCB0aGUgbWF4Q2h1bmtTaXplIG9wdGlvbiB0byBzbGljZSB1cCB0aGUgY2h1bmsgaW50byBzbWFsbGVyIHBpZWNlcy5cbiAgdmFyIGVudGlyZVNsaWNlID0gdGhpcy5idWZmZXIuc2xpY2UocmVhZFN0cmVhbS5zdGFydCwgcmVhZFN0cmVhbS5wb3MpO1xuICB2YXIgb2Zmc2V0ID0gMDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgbmV4dE9mZnNldCA9IG9mZnNldCArIHRoaXMubWF4Q2h1bmtTaXplO1xuICAgIGlmIChuZXh0T2Zmc2V0ID49IGVudGlyZVNsaWNlLmxlbmd0aCkge1xuICAgICAgLy8gbGFzdCBjaHVua1xuICAgICAgaWYgKG9mZnNldCA8IGVudGlyZVNsaWNlLmxlbmd0aCkge1xuICAgICAgICByZWFkU3RyZWFtLndyaXRlKGVudGlyZVNsaWNlLnNsaWNlKG9mZnNldCwgZW50aXJlU2xpY2UubGVuZ3RoKSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcmVhZFN0cmVhbS53cml0ZShlbnRpcmVTbGljZS5zbGljZShvZmZzZXQsIG5leHRPZmZzZXQpKTtcbiAgICBvZmZzZXQgPSBuZXh0T2Zmc2V0O1xuICB9XG5cbiAgcmVhZFN0cmVhbS5lbmQoKTtcbiAgcmVhZFN0cmVhbS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgcmVhZFN0cmVhbS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9O1xuICByZXR1cm4gcmVhZFN0cmVhbTtcbn07XG5cbkJ1ZmZlclNsaWNlci5wcm90b3R5cGUuY3JlYXRlV3JpdGVTdHJlYW0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHZhciBidWZmZXJTbGljZXIgPSB0aGlzO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHdyaXRlU3RyZWFtID0gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO1xuICB3cml0ZVN0cmVhbS5zdGFydCA9IG9wdGlvbnMuc3RhcnQgfHwgMDtcbiAgd3JpdGVTdHJlYW0uZW5kT2Zmc2V0ID0gKG9wdGlvbnMuZW5kID09IG51bGwpID8gdGhpcy5idWZmZXIubGVuZ3RoIDogK29wdGlvbnMuZW5kO1xuICB3cml0ZVN0cmVhbS5ieXRlc1dyaXR0ZW4gPSAwO1xuICB3cml0ZVN0cmVhbS5wb3MgPSB3cml0ZVN0cmVhbS5zdGFydDtcbiAgd3JpdGVTdHJlYW0uZGVzdHJveWVkID0gZmFsc2U7XG4gIHdyaXRlU3RyZWFtLl93cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlciwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHdyaXRlU3RyZWFtLmRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgdmFyIGVuZCA9IHdyaXRlU3RyZWFtLnBvcyArIGJ1ZmZlci5sZW5ndGg7XG4gICAgaWYgKGVuZCA+IHdyaXRlU3RyZWFtLmVuZE9mZnNldCkge1xuICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIm1heGltdW0gZmlsZSBsZW5ndGggZXhjZWVkZWRcIik7XG4gICAgICBlcnIuY29kZSA9ICdFVE9PQklHJztcbiAgICAgIHdyaXRlU3RyZWFtLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBidWZmZXIuY29weShidWZmZXJTbGljZXIuYnVmZmVyLCB3cml0ZVN0cmVhbS5wb3MsIDAsIGJ1ZmZlci5sZW5ndGgpO1xuXG4gICAgd3JpdGVTdHJlYW0uYnl0ZXNXcml0dGVuICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgd3JpdGVTdHJlYW0ucG9zID0gZW5kO1xuICAgIHdyaXRlU3RyZWFtLmVtaXQoJ3Byb2dyZXNzJyk7XG4gICAgY2FsbGJhY2soKTtcbiAgfTtcbiAgd3JpdGVTdHJlYW0uZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIHdyaXRlU3RyZWFtLmRlc3Ryb3llZCA9IHRydWU7XG4gIH07XG4gIHJldHVybiB3cml0ZVN0cmVhbTtcbn07XG5cbkJ1ZmZlclNsaWNlci5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVmQ291bnQgKz0gMTtcbn07XG5cbkJ1ZmZlclNsaWNlci5wcm90b3R5cGUudW5yZWYgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZWZDb3VudCAtPSAxO1xuXG4gIGlmICh0aGlzLnJlZkNvdW50IDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgdW5yZWZcIik7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyb21CdWZmZXIoYnVmZmVyLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgQnVmZmVyU2xpY2VyKGJ1ZmZlciwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyb21GZChmZCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEZkU2xpY2VyKGZkLCBvcHRpb25zKTtcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2dyYWNlZnVsLWZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IG1rZGlyc1N5bmMgPSByZXF1aXJlKCcuLi9ta2RpcnMnKS5ta2RpcnNTeW5jXG5jb25zdCB1dGltZXNNaWxsaXNTeW5jID0gcmVxdWlyZSgnLi4vdXRpbC91dGltZXMnKS51dGltZXNNaWxsaXNTeW5jXG5jb25zdCBzdGF0ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuZnVuY3Rpb24gY29weVN5bmMgKHNyYywgZGVzdCwgb3B0cykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRzID0geyBmaWx0ZXI6IG9wdHMgfVxuICB9XG5cbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgb3B0cy5jbG9iYmVyID0gJ2Nsb2JiZXInIGluIG9wdHMgPyAhIW9wdHMuY2xvYmJlciA6IHRydWUgLy8gZGVmYXVsdCB0byB0cnVlIGZvciBub3dcbiAgb3B0cy5vdmVyd3JpdGUgPSAnb3ZlcndyaXRlJyBpbiBvcHRzID8gISFvcHRzLm92ZXJ3cml0ZSA6IG9wdHMuY2xvYmJlciAvLyBvdmVyd3JpdGUgZmFsbHMgYmFjayB0byBjbG9iYmVyXG5cbiAgLy8gV2FybiBhYm91dCB1c2luZyBwcmVzZXJ2ZVRpbWVzdGFtcHMgb24gMzItYml0IG5vZGVcbiAgaWYgKG9wdHMucHJlc2VydmVUaW1lc3RhbXBzICYmIHByb2Nlc3MuYXJjaCA9PT0gJ2lhMzInKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhcbiAgICAgICdVc2luZyB0aGUgcHJlc2VydmVUaW1lc3RhbXBzIG9wdGlvbiBpbiAzMi1iaXQgbm9kZSBpcyBub3QgcmVjb21tZW5kZWQ7XFxuXFxuJyArXG4gICAgICAnXFx0c2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcHJpY2hhcmRzb24vbm9kZS1mcy1leHRyYS9pc3N1ZXMvMjY5JyxcbiAgICAgICdXYXJuaW5nJywgJ2ZzLWV4dHJhLVdBUk4wMDAyJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IHsgc3JjU3RhdCwgZGVzdFN0YXQgfSA9IHN0YXQuY2hlY2tQYXRoc1N5bmMoc3JjLCBkZXN0LCAnY29weScsIG9wdHMpXG4gIHN0YXQuY2hlY2tQYXJlbnRQYXRoc1N5bmMoc3JjLCBzcmNTdGF0LCBkZXN0LCAnY29weScpXG4gIGlmIChvcHRzLmZpbHRlciAmJiAhb3B0cy5maWx0ZXIoc3JjLCBkZXN0KSkgcmV0dXJuXG4gIGNvbnN0IGRlc3RQYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGVzdClcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGRlc3RQYXJlbnQpKSBta2RpcnNTeW5jKGRlc3RQYXJlbnQpXG4gIHJldHVybiBnZXRTdGF0cyhkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxufVxuXG5mdW5jdGlvbiBnZXRTdGF0cyAoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBjb25zdCBzdGF0U3luYyA9IG9wdHMuZGVyZWZlcmVuY2UgPyBmcy5zdGF0U3luYyA6IGZzLmxzdGF0U3luY1xuICBjb25zdCBzcmNTdGF0ID0gc3RhdFN5bmMoc3JjKVxuXG4gIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkpIHJldHVybiBvbkRpcihzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuICBlbHNlIGlmIChzcmNTdGF0LmlzRmlsZSgpIHx8XG4gICAgICAgICAgIHNyY1N0YXQuaXNDaGFyYWN0ZXJEZXZpY2UoKSB8fFxuICAgICAgICAgICBzcmNTdGF0LmlzQmxvY2tEZXZpY2UoKSkgcmV0dXJuIG9uRmlsZShzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuICBlbHNlIGlmIChzcmNTdGF0LmlzU3ltYm9saWNMaW5rKCkpIHJldHVybiBvbkxpbmsoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgZWxzZSBpZiAoc3JjU3RhdC5pc1NvY2tldCgpKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb3B5IGEgc29ja2V0IGZpbGU6ICR7c3JjfWApXG4gIGVsc2UgaWYgKHNyY1N0YXQuaXNGSUZPKCkpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgYSBGSUZPIHBpcGU6ICR7c3JjfWApXG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWxlOiAke3NyY31gKVxufVxuXG5mdW5jdGlvbiBvbkZpbGUgKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKCFkZXN0U3RhdCkgcmV0dXJuIGNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgcmV0dXJuIG1heUNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbn1cblxuZnVuY3Rpb24gbWF5Q29weUZpbGUgKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBpZiAob3B0cy5vdmVyd3JpdGUpIHtcbiAgICBmcy51bmxpbmtTeW5jKGRlc3QpXG4gICAgcmV0dXJuIGNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgfSBlbHNlIGlmIChvcHRzLmVycm9yT25FeGlzdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7ZGVzdH0nIGFscmVhZHkgZXhpc3RzYClcbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5RmlsZSAoc3JjU3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGZzLmNvcHlGaWxlU3luYyhzcmMsIGRlc3QpXG4gIGlmIChvcHRzLnByZXNlcnZlVGltZXN0YW1wcykgaGFuZGxlVGltZXN0YW1wcyhzcmNTdGF0Lm1vZGUsIHNyYywgZGVzdClcbiAgcmV0dXJuIHNldERlc3RNb2RlKGRlc3QsIHNyY1N0YXQubW9kZSlcbn1cblxuZnVuY3Rpb24gaGFuZGxlVGltZXN0YW1wcyAoc3JjTW9kZSwgc3JjLCBkZXN0KSB7XG4gIC8vIE1ha2Ugc3VyZSB0aGUgZmlsZSBpcyB3cml0YWJsZSBiZWZvcmUgc2V0dGluZyB0aGUgdGltZXN0YW1wXG4gIC8vIG90aGVyd2lzZSBvcGVuIGZhaWxzIHdpdGggRVBFUk0gd2hlbiBpbnZva2VkIHdpdGggJ3IrJ1xuICAvLyAodGhyb3VnaCB1dGltZXMgY2FsbClcbiAgaWYgKGZpbGVJc05vdFdyaXRhYmxlKHNyY01vZGUpKSBtYWtlRmlsZVdyaXRhYmxlKGRlc3QsIHNyY01vZGUpXG4gIHJldHVybiBzZXREZXN0VGltZXN0YW1wcyhzcmMsIGRlc3QpXG59XG5cbmZ1bmN0aW9uIGZpbGVJc05vdFdyaXRhYmxlIChzcmNNb2RlKSB7XG4gIHJldHVybiAoc3JjTW9kZSAmIDBvMjAwKSA9PT0gMFxufVxuXG5mdW5jdGlvbiBtYWtlRmlsZVdyaXRhYmxlIChkZXN0LCBzcmNNb2RlKSB7XG4gIHJldHVybiBzZXREZXN0TW9kZShkZXN0LCBzcmNNb2RlIHwgMG8yMDApXG59XG5cbmZ1bmN0aW9uIHNldERlc3RNb2RlIChkZXN0LCBzcmNNb2RlKSB7XG4gIHJldHVybiBmcy5jaG1vZFN5bmMoZGVzdCwgc3JjTW9kZSlcbn1cblxuZnVuY3Rpb24gc2V0RGVzdFRpbWVzdGFtcHMgKHNyYywgZGVzdCkge1xuICAvLyBUaGUgaW5pdGlhbCBzcmNTdGF0LmF0aW1lIGNhbm5vdCBiZSB0cnVzdGVkXG4gIC8vIGJlY2F1c2UgaXQgaXMgbW9kaWZpZWQgYnkgdGhlIHJlYWQoMikgc3lzdGVtIGNhbGxcbiAgLy8gKFNlZSBodHRwczovL25vZGVqcy5vcmcvYXBpL2ZzLmh0bWwjZnNfc3RhdF90aW1lX3ZhbHVlcylcbiAgY29uc3QgdXBkYXRlZFNyY1N0YXQgPSBmcy5zdGF0U3luYyhzcmMpXG4gIHJldHVybiB1dGltZXNNaWxsaXNTeW5jKGRlc3QsIHVwZGF0ZWRTcmNTdGF0LmF0aW1lLCB1cGRhdGVkU3JjU3RhdC5tdGltZSlcbn1cblxuZnVuY3Rpb24gb25EaXIgKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKCFkZXN0U3RhdCkgcmV0dXJuIG1rRGlyQW5kQ29weShzcmNTdGF0Lm1vZGUsIHNyYywgZGVzdCwgb3B0cylcbiAgcmV0dXJuIGNvcHlEaXIoc3JjLCBkZXN0LCBvcHRzKVxufVxuXG5mdW5jdGlvbiBta0RpckFuZENvcHkgKHNyY01vZGUsIHNyYywgZGVzdCwgb3B0cykge1xuICBmcy5ta2RpclN5bmMoZGVzdClcbiAgY29weURpcihzcmMsIGRlc3QsIG9wdHMpXG4gIHJldHVybiBzZXREZXN0TW9kZShkZXN0LCBzcmNNb2RlKVxufVxuXG5mdW5jdGlvbiBjb3B5RGlyIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgZnMucmVhZGRpclN5bmMoc3JjKS5mb3JFYWNoKGl0ZW0gPT4gY29weURpckl0ZW0oaXRlbSwgc3JjLCBkZXN0LCBvcHRzKSlcbn1cblxuZnVuY3Rpb24gY29weURpckl0ZW0gKGl0ZW0sIHNyYywgZGVzdCwgb3B0cykge1xuICBjb25zdCBzcmNJdGVtID0gcGF0aC5qb2luKHNyYywgaXRlbSlcbiAgY29uc3QgZGVzdEl0ZW0gPSBwYXRoLmpvaW4oZGVzdCwgaXRlbSlcbiAgaWYgKG9wdHMuZmlsdGVyICYmICFvcHRzLmZpbHRlcihzcmNJdGVtLCBkZXN0SXRlbSkpIHJldHVyblxuICBjb25zdCB7IGRlc3RTdGF0IH0gPSBzdGF0LmNoZWNrUGF0aHNTeW5jKHNyY0l0ZW0sIGRlc3RJdGVtLCAnY29weScsIG9wdHMpXG4gIHJldHVybiBnZXRTdGF0cyhkZXN0U3RhdCwgc3JjSXRlbSwgZGVzdEl0ZW0sIG9wdHMpXG59XG5cbmZ1bmN0aW9uIG9uTGluayAoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBsZXQgcmVzb2x2ZWRTcmMgPSBmcy5yZWFkbGlua1N5bmMoc3JjKVxuICBpZiAob3B0cy5kZXJlZmVyZW5jZSkge1xuICAgIHJlc29sdmVkU3JjID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkU3JjKVxuICB9XG5cbiAgaWYgKCFkZXN0U3RhdCkge1xuICAgIHJldHVybiBmcy5zeW1saW5rU3luYyhyZXNvbHZlZFNyYywgZGVzdClcbiAgfSBlbHNlIHtcbiAgICBsZXQgcmVzb2x2ZWREZXN0XG4gICAgdHJ5IHtcbiAgICAgIHJlc29sdmVkRGVzdCA9IGZzLnJlYWRsaW5rU3luYyhkZXN0KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gZGVzdCBleGlzdHMgYW5kIGlzIGEgcmVndWxhciBmaWxlIG9yIGRpcmVjdG9yeSxcbiAgICAgIC8vIFdpbmRvd3MgbWF5IHRocm93IFVOS05PV04gZXJyb3IuIElmIGRlc3QgYWxyZWFkeSBleGlzdHMsXG4gICAgICAvLyBmcyB0aHJvd3MgZXJyb3IgYW55d2F5LCBzbyBubyBuZWVkIHRvIGd1YXJkIGFnYWluc3QgaXQgaGVyZS5cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VJTlZBTCcgfHwgZXJyLmNvZGUgPT09ICdVTktOT1dOJykgcmV0dXJuIGZzLnN5bWxpbmtTeW5jKHJlc29sdmVkU3JjLCBkZXN0KVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICAgIGlmIChvcHRzLmRlcmVmZXJlbmNlKSB7XG4gICAgICByZXNvbHZlZERlc3QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZWREZXN0KVxuICAgIH1cbiAgICBpZiAoc3RhdC5pc1NyY1N1YmRpcihyZXNvbHZlZFNyYywgcmVzb2x2ZWREZXN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29weSAnJHtyZXNvbHZlZFNyY30nIHRvIGEgc3ViZGlyZWN0b3J5IG9mIGl0c2VsZiwgJyR7cmVzb2x2ZWREZXN0fScuYClcbiAgICB9XG5cbiAgICAvLyBwcmV2ZW50IGNvcHkgaWYgc3JjIGlzIGEgc3ViZGlyIG9mIGRlc3Qgc2luY2UgdW5saW5raW5nXG4gICAgLy8gZGVzdCBpbiB0aGlzIGNhc2Ugd291bGQgcmVzdWx0IGluIHJlbW92aW5nIHNyYyBjb250ZW50c1xuICAgIC8vIGFuZCB0aGVyZWZvcmUgYSBicm9rZW4gc3ltbGluayB3b3VsZCBiZSBjcmVhdGVkLlxuICAgIGlmIChzdGF0LmlzU3JjU3ViZGlyKHJlc29sdmVkRGVzdCwgcmVzb2x2ZWRTcmMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgJyR7cmVzb2x2ZWREZXN0fScgd2l0aCAnJHtyZXNvbHZlZFNyY30nLmApXG4gICAgfVxuICAgIHJldHVybiBjb3B5TGluayhyZXNvbHZlZFNyYywgZGVzdClcbiAgfVxufVxuXG5mdW5jdGlvbiBjb3B5TGluayAocmVzb2x2ZWRTcmMsIGRlc3QpIHtcbiAgZnMudW5saW5rU3luYyhkZXN0KVxuICByZXR1cm4gZnMuc3ltbGlua1N5bmMocmVzb2x2ZWRTcmMsIGRlc3QpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29weVN5bmNcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IHsgbWtkaXJzIH0gPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuY29uc3QgeyBwYXRoRXhpc3RzIH0gPSByZXF1aXJlKCcuLi9wYXRoLWV4aXN0cycpXG5jb25zdCB7IHV0aW1lc01pbGxpcyB9ID0gcmVxdWlyZSgnLi4vdXRpbC91dGltZXMnKVxuY29uc3Qgc3RhdCA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmFzeW5jIGZ1bmN0aW9uIGNvcHkgKHNyYywgZGVzdCwgb3B0cyA9IHt9KSB7XG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9wdHMgPSB7IGZpbHRlcjogb3B0cyB9XG4gIH1cblxuICBvcHRzLmNsb2JiZXIgPSAnY2xvYmJlcicgaW4gb3B0cyA/ICEhb3B0cy5jbG9iYmVyIDogdHJ1ZSAvLyBkZWZhdWx0IHRvIHRydWUgZm9yIG5vd1xuICBvcHRzLm92ZXJ3cml0ZSA9ICdvdmVyd3JpdGUnIGluIG9wdHMgPyAhIW9wdHMub3ZlcndyaXRlIDogb3B0cy5jbG9iYmVyIC8vIG92ZXJ3cml0ZSBmYWxscyBiYWNrIHRvIGNsb2JiZXJcblxuICAvLyBXYXJuIGFib3V0IHVzaW5nIHByZXNlcnZlVGltZXN0YW1wcyBvbiAzMi1iaXQgbm9kZVxuICBpZiAob3B0cy5wcmVzZXJ2ZVRpbWVzdGFtcHMgJiYgcHJvY2Vzcy5hcmNoID09PSAnaWEzMicpIHtcbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKFxuICAgICAgJ1VzaW5nIHRoZSBwcmVzZXJ2ZVRpbWVzdGFtcHMgb3B0aW9uIGluIDMyLWJpdCBub2RlIGlzIG5vdCByZWNvbW1lbmRlZDtcXG5cXG4nICtcbiAgICAgICdcXHRzZWUgaHR0cHM6Ly9naXRodWIuY29tL2pwcmljaGFyZHNvbi9ub2RlLWZzLWV4dHJhL2lzc3Vlcy8yNjknLFxuICAgICAgJ1dhcm5pbmcnLCAnZnMtZXh0cmEtV0FSTjAwMDEnXG4gICAgKVxuICB9XG5cbiAgY29uc3QgeyBzcmNTdGF0LCBkZXN0U3RhdCB9ID0gYXdhaXQgc3RhdC5jaGVja1BhdGhzKHNyYywgZGVzdCwgJ2NvcHknLCBvcHRzKVxuXG4gIGF3YWl0IHN0YXQuY2hlY2tQYXJlbnRQYXRocyhzcmMsIHNyY1N0YXQsIGRlc3QsICdjb3B5JylcblxuICBjb25zdCBpbmNsdWRlID0gYXdhaXQgcnVuRmlsdGVyKHNyYywgZGVzdCwgb3B0cylcblxuICBpZiAoIWluY2x1ZGUpIHJldHVyblxuXG4gIC8vIGNoZWNrIGlmIHRoZSBwYXJlbnQgb2YgZGVzdCBleGlzdHMsIGFuZCBjcmVhdGUgaXQgaWYgaXQgZG9lc24ndCBleGlzdFxuICBjb25zdCBkZXN0UGFyZW50ID0gcGF0aC5kaXJuYW1lKGRlc3QpXG4gIGNvbnN0IGRpckV4aXN0cyA9IGF3YWl0IHBhdGhFeGlzdHMoZGVzdFBhcmVudClcbiAgaWYgKCFkaXJFeGlzdHMpIHtcbiAgICBhd2FpdCBta2RpcnMoZGVzdFBhcmVudClcbiAgfVxuXG4gIGF3YWl0IGdldFN0YXRzQW5kUGVyZm9ybUNvcHkoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuRmlsdGVyIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKCFvcHRzLmZpbHRlcikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIG9wdHMuZmlsdGVyKHNyYywgZGVzdClcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0U3RhdHNBbmRQZXJmb3JtQ29weSAoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBjb25zdCBzdGF0Rm4gPSBvcHRzLmRlcmVmZXJlbmNlID8gZnMuc3RhdCA6IGZzLmxzdGF0XG4gIGNvbnN0IHNyY1N0YXQgPSBhd2FpdCBzdGF0Rm4oc3JjKVxuXG4gIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkpIHJldHVybiBvbkRpcihzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuXG4gIGlmIChcbiAgICBzcmNTdGF0LmlzRmlsZSgpIHx8XG4gICAgc3JjU3RhdC5pc0NoYXJhY3RlckRldmljZSgpIHx8XG4gICAgc3JjU3RhdC5pc0Jsb2NrRGV2aWNlKClcbiAgKSByZXR1cm4gb25GaWxlKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG5cbiAgaWYgKHNyY1N0YXQuaXNTeW1ib2xpY0xpbmsoKSkgcmV0dXJuIG9uTGluayhkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuICBpZiAoc3JjU3RhdC5pc1NvY2tldCgpKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb3B5IGEgc29ja2V0IGZpbGU6ICR7c3JjfWApXG4gIGlmIChzcmNTdGF0LmlzRklGTygpKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb3B5IGEgRklGTyBwaXBlOiAke3NyY31gKVxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZmlsZTogJHtzcmN9YClcbn1cblxuYXN5bmMgZnVuY3Rpb24gb25GaWxlIChzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGlmICghZGVzdFN0YXQpIHJldHVybiBjb3B5RmlsZShzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG5cbiAgaWYgKG9wdHMub3ZlcndyaXRlKSB7XG4gICAgYXdhaXQgZnMudW5saW5rKGRlc3QpXG4gICAgcmV0dXJuIGNvcHlGaWxlKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgfVxuICBpZiAob3B0cy5lcnJvck9uRXhpc3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2Rlc3R9JyBhbHJlYWR5IGV4aXN0c2ApXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weUZpbGUgKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBhd2FpdCBmcy5jb3B5RmlsZShzcmMsIGRlc3QpXG4gIGlmIChvcHRzLnByZXNlcnZlVGltZXN0YW1wcykge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgZmlsZSBpcyB3cml0YWJsZSBiZWZvcmUgc2V0dGluZyB0aGUgdGltZXN0YW1wXG4gICAgLy8gb3RoZXJ3aXNlIG9wZW4gZmFpbHMgd2l0aCBFUEVSTSB3aGVuIGludm9rZWQgd2l0aCAncisnXG4gICAgLy8gKHRocm91Z2ggdXRpbWVzIGNhbGwpXG4gICAgaWYgKGZpbGVJc05vdFdyaXRhYmxlKHNyY1N0YXQubW9kZSkpIHtcbiAgICAgIGF3YWl0IG1ha2VGaWxlV3JpdGFibGUoZGVzdCwgc3JjU3RhdC5tb2RlKVxuICAgIH1cblxuICAgIC8vIFNldCB0aW1lc3RhbXBzIGFuZCBtb2RlIGNvcnJlc3BvbmRpbmdseVxuXG4gICAgLy8gTm90ZSB0aGF0IFRoZSBpbml0aWFsIHNyY1N0YXQuYXRpbWUgY2Fubm90IGJlIHRydXN0ZWRcbiAgICAvLyBiZWNhdXNlIGl0IGlzIG1vZGlmaWVkIGJ5IHRoZSByZWFkKDIpIHN5c3RlbSBjYWxsXG4gICAgLy8gKFNlZSBodHRwczovL25vZGVqcy5vcmcvYXBpL2ZzLmh0bWwjZnNfc3RhdF90aW1lX3ZhbHVlcylcbiAgICBjb25zdCB1cGRhdGVkU3JjU3RhdCA9IGF3YWl0IGZzLnN0YXQoc3JjKVxuICAgIGF3YWl0IHV0aW1lc01pbGxpcyhkZXN0LCB1cGRhdGVkU3JjU3RhdC5hdGltZSwgdXBkYXRlZFNyY1N0YXQubXRpbWUpXG4gIH1cblxuICByZXR1cm4gZnMuY2htb2QoZGVzdCwgc3JjU3RhdC5tb2RlKVxufVxuXG5mdW5jdGlvbiBmaWxlSXNOb3RXcml0YWJsZSAoc3JjTW9kZSkge1xuICByZXR1cm4gKHNyY01vZGUgJiAwbzIwMCkgPT09IDBcbn1cblxuZnVuY3Rpb24gbWFrZUZpbGVXcml0YWJsZSAoZGVzdCwgc3JjTW9kZSkge1xuICByZXR1cm4gZnMuY2htb2QoZGVzdCwgc3JjTW9kZSB8IDBvMjAwKVxufVxuXG5hc3luYyBmdW5jdGlvbiBvbkRpciAoc3JjU3RhdCwgZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICAvLyB0aGUgZGVzdCBkaXJlY3RvcnkgbWlnaHQgbm90IGV4aXN0LCBjcmVhdGUgaXRcbiAgaWYgKCFkZXN0U3RhdCkge1xuICAgIGF3YWl0IGZzLm1rZGlyKGRlc3QpXG4gIH1cblxuICBjb25zdCBpdGVtcyA9IGF3YWl0IGZzLnJlYWRkaXIoc3JjKVxuXG4gIC8vIGxvb3AgdGhyb3VnaCB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRvIGNvcHkgZXZlcnl0aGluZ1xuICBhd2FpdCBQcm9taXNlLmFsbChpdGVtcy5tYXAoYXN5bmMgaXRlbSA9PiB7XG4gICAgY29uc3Qgc3JjSXRlbSA9IHBhdGguam9pbihzcmMsIGl0ZW0pXG4gICAgY29uc3QgZGVzdEl0ZW0gPSBwYXRoLmpvaW4oZGVzdCwgaXRlbSlcblxuICAgIC8vIHNraXAgdGhlIGl0ZW0gaWYgaXQgaXMgbWF0Y2hlcyBieSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG4gICAgY29uc3QgaW5jbHVkZSA9IGF3YWl0IHJ1bkZpbHRlcihzcmNJdGVtLCBkZXN0SXRlbSwgb3B0cylcbiAgICBpZiAoIWluY2x1ZGUpIHJldHVyblxuXG4gICAgY29uc3QgeyBkZXN0U3RhdCB9ID0gYXdhaXQgc3RhdC5jaGVja1BhdGhzKHNyY0l0ZW0sIGRlc3RJdGVtLCAnY29weScsIG9wdHMpXG5cbiAgICAvLyBJZiB0aGUgaXRlbSBpcyBhIGNvcHlhYmxlIGZpbGUsIGBnZXRTdGF0c0FuZFBlcmZvcm1Db3B5YCB3aWxsIGNvcHkgaXRcbiAgICAvLyBJZiB0aGUgaXRlbSBpcyBhIGRpcmVjdG9yeSwgYGdldFN0YXRzQW5kUGVyZm9ybUNvcHlgIHdpbGwgY2FsbCBgb25EaXJgIHJlY3Vyc2l2ZWx5XG4gICAgcmV0dXJuIGdldFN0YXRzQW5kUGVyZm9ybUNvcHkoZGVzdFN0YXQsIHNyY0l0ZW0sIGRlc3RJdGVtLCBvcHRzKVxuICB9KSlcblxuICBpZiAoIWRlc3RTdGF0KSB7XG4gICAgYXdhaXQgZnMuY2htb2QoZGVzdCwgc3JjU3RhdC5tb2RlKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9uTGluayAoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBsZXQgcmVzb2x2ZWRTcmMgPSBhd2FpdCBmcy5yZWFkbGluayhzcmMpXG4gIGlmIChvcHRzLmRlcmVmZXJlbmNlKSB7XG4gICAgcmVzb2x2ZWRTcmMgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZWRTcmMpXG4gIH1cbiAgaWYgKCFkZXN0U3RhdCkge1xuICAgIHJldHVybiBmcy5zeW1saW5rKHJlc29sdmVkU3JjLCBkZXN0KVxuICB9XG5cbiAgbGV0IHJlc29sdmVkRGVzdCA9IG51bGxcbiAgdHJ5IHtcbiAgICByZXNvbHZlZERlc3QgPSBhd2FpdCBmcy5yZWFkbGluayhkZXN0KVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gZGVzdCBleGlzdHMgYW5kIGlzIGEgcmVndWxhciBmaWxlIG9yIGRpcmVjdG9yeSxcbiAgICAvLyBXaW5kb3dzIG1heSB0aHJvdyBVTktOT1dOIGVycm9yLiBJZiBkZXN0IGFscmVhZHkgZXhpc3RzLFxuICAgIC8vIGZzIHRocm93cyBlcnJvciBhbnl3YXksIHNvIG5vIG5lZWQgdG8gZ3VhcmQgYWdhaW5zdCBpdCBoZXJlLlxuICAgIGlmIChlLmNvZGUgPT09ICdFSU5WQUwnIHx8IGUuY29kZSA9PT0gJ1VOS05PV04nKSByZXR1cm4gZnMuc3ltbGluayhyZXNvbHZlZFNyYywgZGVzdClcbiAgICB0aHJvdyBlXG4gIH1cbiAgaWYgKG9wdHMuZGVyZWZlcmVuY2UpIHtcbiAgICByZXNvbHZlZERlc3QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZWREZXN0KVxuICB9XG4gIGlmIChzdGF0LmlzU3JjU3ViZGlyKHJlc29sdmVkU3JjLCByZXNvbHZlZERlc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29weSAnJHtyZXNvbHZlZFNyY30nIHRvIGEgc3ViZGlyZWN0b3J5IG9mIGl0c2VsZiwgJyR7cmVzb2x2ZWREZXN0fScuYClcbiAgfVxuXG4gIC8vIGRvIG5vdCBjb3B5IGlmIHNyYyBpcyBhIHN1YmRpciBvZiBkZXN0IHNpbmNlIHVubGlua2luZ1xuICAvLyBkZXN0IGluIHRoaXMgY2FzZSB3b3VsZCByZXN1bHQgaW4gcmVtb3Zpbmcgc3JjIGNvbnRlbnRzXG4gIC8vIGFuZCB0aGVyZWZvcmUgYSBicm9rZW4gc3ltbGluayB3b3VsZCBiZSBjcmVhdGVkLlxuICBpZiAoc3RhdC5pc1NyY1N1YmRpcihyZXNvbHZlZERlc3QsIHJlc29sdmVkU3JjKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG92ZXJ3cml0ZSAnJHtyZXNvbHZlZERlc3R9JyB3aXRoICcke3Jlc29sdmVkU3JjfScuYClcbiAgfVxuXG4gIC8vIGNvcHkgdGhlIGxpbmtcbiAgYXdhaXQgZnMudW5saW5rKGRlc3QpXG4gIHJldHVybiBmcy5zeW1saW5rKHJlc29sdmVkU3JjLCBkZXN0KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2Vcbm1vZHVsZS5leHBvcnRzID0ge1xuICBjb3B5OiB1KHJlcXVpcmUoJy4vY29weScpKSxcbiAgY29weVN5bmM6IHJlcXVpcmUoJy4vY29weS1zeW5jJylcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgbWtkaXIgPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuY29uc3QgcmVtb3ZlID0gcmVxdWlyZSgnLi4vcmVtb3ZlJylcblxuY29uc3QgZW1wdHlEaXIgPSB1KGFzeW5jIGZ1bmN0aW9uIGVtcHR5RGlyIChkaXIpIHtcbiAgbGV0IGl0ZW1zXG4gIHRyeSB7XG4gICAgaXRlbXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG1rZGlyLm1rZGlycyhkaXIpXG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoaXRlbXMubWFwKGl0ZW0gPT4gcmVtb3ZlLnJlbW92ZShwYXRoLmpvaW4oZGlyLCBpdGVtKSkpKVxufSlcblxuZnVuY3Rpb24gZW1wdHlEaXJTeW5jIChkaXIpIHtcbiAgbGV0IGl0ZW1zXG4gIHRyeSB7XG4gICAgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBta2Rpci5ta2RpcnNTeW5jKGRpcilcbiAgfVxuXG4gIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgaXRlbSA9IHBhdGguam9pbihkaXIsIGl0ZW0pXG4gICAgcmVtb3ZlLnJlbW92ZVN5bmMoaXRlbSlcbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGVtcHR5RGlyU3luYyxcbiAgZW1wdHlkaXJTeW5jOiBlbXB0eURpclN5bmMsXG4gIGVtcHR5RGlyLFxuICBlbXB0eWRpcjogZW1wdHlEaXJcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgbWtkaXIgPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVGaWxlIChmaWxlKSB7XG4gIGxldCBzdGF0c1xuICB0cnkge1xuICAgIHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlKVxuICB9IGNhdGNoIHsgfVxuICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNGaWxlKCkpIHJldHVyblxuXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShmaWxlKVxuXG4gIGxldCBkaXJTdGF0cyA9IG51bGxcbiAgdHJ5IHtcbiAgICBkaXJTdGF0cyA9IGF3YWl0IGZzLnN0YXQoZGlyKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpZiB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIG1ha2UgaXRcbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICBhd2FpdCBta2Rpci5ta2RpcnMoZGlyKVxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGUsICcnKVxuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJTdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGZpbGUsICcnKVxuICB9IGVsc2Uge1xuICAgIC8vIHBhcmVudCBpcyBub3QgYSBkaXJlY3RvcnlcbiAgICAvLyBUaGlzIGlzIGp1c3QgdG8gY2F1c2UgYW4gaW50ZXJuYWwgRU5PVERJUiBlcnJvciB0byBiZSB0aHJvd25cbiAgICBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWxlU3luYyAoZmlsZSkge1xuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGUpXG4gIH0gY2F0Y2ggeyB9XG4gIGlmIChzdGF0cyAmJiBzdGF0cy5pc0ZpbGUoKSkgcmV0dXJuXG5cbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGZpbGUpXG4gIHRyeSB7XG4gICAgaWYgKCFmcy5zdGF0U3luYyhkaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIC8vIHBhcmVudCBpcyBub3QgYSBkaXJlY3RvcnlcbiAgICAgIC8vIFRoaXMgaXMganVzdCB0byBjYXVzZSBhbiBpbnRlcm5hbCBFTk9URElSIGVycm9yIHRvIGJlIHRocm93blxuICAgICAgZnMucmVhZGRpclN5bmMoZGlyKVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gSWYgdGhlIHN0YXQgY2FsbCBhYm92ZSBmYWlsZWQgYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBpdFxuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdFTk9FTlQnKSBta2Rpci5ta2RpcnNTeW5jKGRpcilcbiAgICBlbHNlIHRocm93IGVyclxuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCAnJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZUZpbGU6IHUoY3JlYXRlRmlsZSksXG4gIGNyZWF0ZUZpbGVTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBjcmVhdGVGaWxlLCBjcmVhdGVGaWxlU3luYyB9ID0gcmVxdWlyZSgnLi9maWxlJylcbmNvbnN0IHsgY3JlYXRlTGluaywgY3JlYXRlTGlua1N5bmMgfSA9IHJlcXVpcmUoJy4vbGluaycpXG5jb25zdCB7IGNyZWF0ZVN5bWxpbmssIGNyZWF0ZVN5bWxpbmtTeW5jIH0gPSByZXF1aXJlKCcuL3N5bWxpbmsnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gZmlsZVxuICBjcmVhdGVGaWxlLFxuICBjcmVhdGVGaWxlU3luYyxcbiAgZW5zdXJlRmlsZTogY3JlYXRlRmlsZSxcbiAgZW5zdXJlRmlsZVN5bmM6IGNyZWF0ZUZpbGVTeW5jLFxuICAvLyBsaW5rXG4gIGNyZWF0ZUxpbmssXG4gIGNyZWF0ZUxpbmtTeW5jLFxuICBlbnN1cmVMaW5rOiBjcmVhdGVMaW5rLFxuICBlbnN1cmVMaW5rU3luYzogY3JlYXRlTGlua1N5bmMsXG4gIC8vIHN5bWxpbmtcbiAgY3JlYXRlU3ltbGluayxcbiAgY3JlYXRlU3ltbGlua1N5bmMsXG4gIGVuc3VyZVN5bWxpbms6IGNyZWF0ZVN5bWxpbmssXG4gIGVuc3VyZVN5bWxpbmtTeW5jOiBjcmVhdGVTeW1saW5rU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCBta2RpciA9IHJlcXVpcmUoJy4uL21rZGlycycpXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcbmNvbnN0IHsgYXJlSWRlbnRpY2FsIH0gPSByZXF1aXJlKCcuLi91dGlsL3N0YXQnKVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVMaW5rIChzcmNwYXRoLCBkc3RwYXRoKSB7XG4gIGxldCBkc3RTdGF0XG4gIHRyeSB7XG4gICAgZHN0U3RhdCA9IGF3YWl0IGZzLmxzdGF0KGRzdHBhdGgpXG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZSBlcnJvclxuICB9XG5cbiAgbGV0IHNyY1N0YXRcbiAgdHJ5IHtcbiAgICBzcmNTdGF0ID0gYXdhaXQgZnMubHN0YXQoc3JjcGF0aClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyLm1lc3NhZ2UgPSBlcnIubWVzc2FnZS5yZXBsYWNlKCdsc3RhdCcsICdlbnN1cmVMaW5rJylcbiAgICB0aHJvdyBlcnJcbiAgfVxuXG4gIGlmIChkc3RTdGF0ICYmIGFyZUlkZW50aWNhbChzcmNTdGF0LCBkc3RTdGF0KSkgcmV0dXJuXG5cbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGRzdHBhdGgpXG5cbiAgY29uc3QgZGlyRXhpc3RzID0gYXdhaXQgcGF0aEV4aXN0cyhkaXIpXG5cbiAgaWYgKCFkaXJFeGlzdHMpIHtcbiAgICBhd2FpdCBta2Rpci5ta2RpcnMoZGlyKVxuICB9XG5cbiAgYXdhaXQgZnMubGluayhzcmNwYXRoLCBkc3RwYXRoKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVMaW5rU3luYyAoc3JjcGF0aCwgZHN0cGF0aCkge1xuICBsZXQgZHN0U3RhdFxuICB0cnkge1xuICAgIGRzdFN0YXQgPSBmcy5sc3RhdFN5bmMoZHN0cGF0aClcbiAgfSBjYXRjaCB7fVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgc3JjU3RhdCA9IGZzLmxzdGF0U3luYyhzcmNwYXRoKVxuICAgIGlmIChkc3RTdGF0ICYmIGFyZUlkZW50aWNhbChzcmNTdGF0LCBkc3RTdGF0KSkgcmV0dXJuXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UucmVwbGFjZSgnbHN0YXQnLCAnZW5zdXJlTGluaycpXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgZGlyRXhpc3RzID0gZnMuZXhpc3RzU3luYyhkaXIpXG4gIGlmIChkaXJFeGlzdHMpIHJldHVybiBmcy5saW5rU3luYyhzcmNwYXRoLCBkc3RwYXRoKVxuICBta2Rpci5ta2RpcnNTeW5jKGRpcilcblxuICByZXR1cm4gZnMubGlua1N5bmMoc3JjcGF0aCwgZHN0cGF0aClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZUxpbms6IHUoY3JlYXRlTGluayksXG4gIGNyZWF0ZUxpbmtTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5cbi8qKlxuICogRnVuY3Rpb24gdGhhdCByZXR1cm5zIHR3byB0eXBlcyBvZiBwYXRocywgb25lIHJlbGF0aXZlIHRvIHN5bWxpbmssIGFuZCBvbmVcbiAqIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBDaGVja3MgaWYgcGF0aCBpcyBhYnNvbHV0ZSBvclxuICogcmVsYXRpdmUuIElmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLCB0aGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgcGF0aCBpc1xuICogcmVsYXRpdmUgdG8gc3ltbGluayBvciByZWxhdGl2ZSB0byBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBUaGlzIGlzIGFuXG4gKiBpbml0aWF0aXZlIHRvIGZpbmQgYSBzbWFydGVyIGBzcmNwYXRoYCB0byBzdXBwbHkgd2hlbiBidWlsZGluZyBzeW1saW5rcy5cbiAqIFRoaXMgYWxsb3dzIHlvdSB0byBkZXRlcm1pbmUgd2hpY2ggcGF0aCB0byB1c2Ugb3V0IG9mIG9uZSBvZiB0aHJlZSBwb3NzaWJsZVxuICogdHlwZXMgb2Ygc291cmNlIHBhdGhzLiBUaGUgZmlyc3QgaXMgYW4gYWJzb2x1dGUgcGF0aC4gVGhpcyBpcyBkZXRlY3RlZCBieVxuICogYHBhdGguaXNBYnNvbHV0ZSgpYC4gV2hlbiBhbiBhYnNvbHV0ZSBwYXRoIGlzIHByb3ZpZGVkLCBpdCBpcyBjaGVja2VkIHRvXG4gKiBzZWUgaWYgaXQgZXhpc3RzLiBJZiBpdCBkb2VzIGl0J3MgdXNlZCwgaWYgbm90IGFuIGVycm9yIGlzIHJldHVybmVkXG4gKiAoY2FsbGJhY2spLyB0aHJvd24gKHN5bmMpLiBUaGUgb3RoZXIgdHdvIG9wdGlvbnMgZm9yIGBzcmNwYXRoYCBhcmUgYVxuICogcmVsYXRpdmUgdXJsLiBCeSBkZWZhdWx0IE5vZGUncyBgZnMuc3ltbGlua2Agd29ya3MgYnkgY3JlYXRpbmcgYSBzeW1saW5rXG4gKiB1c2luZyBgZHN0cGF0aGAgYW5kIGV4cGVjdHMgdGhlIGBzcmNwYXRoYCB0byBiZSByZWxhdGl2ZSB0byB0aGUgbmV3bHlcbiAqIGNyZWF0ZWQgc3ltbGluay4gSWYgeW91IHByb3ZpZGUgYSBgc3JjcGF0aGAgdGhhdCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgZmlsZVxuICogc3lzdGVtIGl0IHJlc3VsdHMgaW4gYSBicm9rZW4gc3ltbGluay4gVG8gbWluaW1pemUgdGhpcywgdGhlIGZ1bmN0aW9uXG4gKiBjaGVja3MgdG8gc2VlIGlmIHRoZSAncmVsYXRpdmUgdG8gc3ltbGluaycgc291cmNlIGZpbGUgZXhpc3RzLCBhbmQgaWYgaXRcbiAqIGRvZXMgaXQgd2lsbCB1c2UgaXQuIElmIGl0IGRvZXMgbm90LCBpdCBjaGVja3MgaWYgdGhlcmUncyBhIGZpbGUgdGhhdFxuICogZXhpc3RzIHRoYXQgaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGlmIGRvZXMgaXRzIHVzZWQuXG4gKiBUaGlzIHByZXNlcnZlcyB0aGUgZXhwZWN0YXRpb25zIG9mIHRoZSBvcmlnaW5hbCBmcy5zeW1saW5rIHNwZWMgYW5kIGFkZHNcbiAqIHRoZSBhYmlsaXR5IHRvIHBhc3MgaW4gYHJlbGF0aXZlIHRvIGN1cnJlbnQgd29ya2luZyBkaXJlY290cnlgIHBhdGhzLlxuICovXG5cbmFzeW5jIGZ1bmN0aW9uIHN5bWxpbmtQYXRocyAoc3JjcGF0aCwgZHN0cGF0aCkge1xuICBpZiAocGF0aC5pc0Fic29sdXRlKHNyY3BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlLnJlcGxhY2UoJ2xzdGF0JywgJ2Vuc3VyZVN5bWxpbmsnKVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvQ3dkOiBzcmNwYXRoLFxuICAgICAgdG9Ec3Q6IHNyY3BhdGhcbiAgICB9XG4gIH1cblxuICBjb25zdCBkc3RkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgcmVsYXRpdmVUb0RzdCA9IHBhdGguam9pbihkc3RkaXIsIHNyY3BhdGgpXG5cbiAgY29uc3QgZXhpc3RzID0gYXdhaXQgcGF0aEV4aXN0cyhyZWxhdGl2ZVRvRHN0KVxuICBpZiAoZXhpc3RzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvQ3dkOiByZWxhdGl2ZVRvRHN0LFxuICAgICAgdG9Ec3Q6IHNyY3BhdGhcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UucmVwbGFjZSgnbHN0YXQnLCAnZW5zdXJlU3ltbGluaycpXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvQ3dkOiBzcmNwYXRoLFxuICAgIHRvRHN0OiBwYXRoLnJlbGF0aXZlKGRzdGRpciwgc3JjcGF0aClcbiAgfVxufVxuXG5mdW5jdGlvbiBzeW1saW5rUGF0aHNTeW5jIChzcmNwYXRoLCBkc3RwYXRoKSB7XG4gIGlmIChwYXRoLmlzQWJzb2x1dGUoc3JjcGF0aCkpIHtcbiAgICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKHNyY3BhdGgpXG4gICAgaWYgKCFleGlzdHMpIHRocm93IG5ldyBFcnJvcignYWJzb2x1dGUgc3JjcGF0aCBkb2VzIG5vdCBleGlzdCcpXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvQ3dkOiBzcmNwYXRoLFxuICAgICAgdG9Ec3Q6IHNyY3BhdGhcbiAgICB9XG4gIH1cblxuICBjb25zdCBkc3RkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgcmVsYXRpdmVUb0RzdCA9IHBhdGguam9pbihkc3RkaXIsIHNyY3BhdGgpXG4gIGNvbnN0IGV4aXN0cyA9IGZzLmV4aXN0c1N5bmMocmVsYXRpdmVUb0RzdClcbiAgaWYgKGV4aXN0cykge1xuICAgIHJldHVybiB7XG4gICAgICB0b0N3ZDogcmVsYXRpdmVUb0RzdCxcbiAgICAgIHRvRHN0OiBzcmNwYXRoXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3JjRXhpc3RzID0gZnMuZXhpc3RzU3luYyhzcmNwYXRoKVxuICBpZiAoIXNyY0V4aXN0cykgdGhyb3cgbmV3IEVycm9yKCdyZWxhdGl2ZSBzcmNwYXRoIGRvZXMgbm90IGV4aXN0JylcbiAgcmV0dXJuIHtcbiAgICB0b0N3ZDogc3JjcGF0aCxcbiAgICB0b0RzdDogcGF0aC5yZWxhdGl2ZShkc3RkaXIsIHNyY3BhdGgpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHN5bWxpbmtQYXRoczogdShzeW1saW5rUGF0aHMpLFxuICBzeW1saW5rUGF0aHNTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcblxuYXN5bmMgZnVuY3Rpb24gc3ltbGlua1R5cGUgKHNyY3BhdGgsIHR5cGUpIHtcbiAgaWYgKHR5cGUpIHJldHVybiB0eXBlXG5cbiAgbGV0IHN0YXRzXG4gIHRyeSB7XG4gICAgc3RhdHMgPSBhd2FpdCBmcy5sc3RhdChzcmNwYXRoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ2ZpbGUnXG4gIH1cblxuICByZXR1cm4gKHN0YXRzICYmIHN0YXRzLmlzRGlyZWN0b3J5KCkpID8gJ2RpcicgOiAnZmlsZSdcbn1cblxuZnVuY3Rpb24gc3ltbGlua1R5cGVTeW5jIChzcmNwYXRoLCB0eXBlKSB7XG4gIGlmICh0eXBlKSByZXR1cm4gdHlwZVxuXG4gIGxldCBzdGF0c1xuICB0cnkge1xuICAgIHN0YXRzID0gZnMubHN0YXRTeW5jKHNyY3BhdGgpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnZmlsZSdcbiAgfVxuICByZXR1cm4gKHN0YXRzICYmIHN0YXRzLmlzRGlyZWN0b3J5KCkpID8gJ2RpcicgOiAnZmlsZSdcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHN5bWxpbmtUeXBlOiB1KHN5bWxpbmtUeXBlKSxcbiAgc3ltbGlua1R5cGVTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcblxuY29uc3QgeyBta2RpcnMsIG1rZGlyc1N5bmMgfSA9IHJlcXVpcmUoJy4uL21rZGlycycpXG5cbmNvbnN0IHsgc3ltbGlua1BhdGhzLCBzeW1saW5rUGF0aHNTeW5jIH0gPSByZXF1aXJlKCcuL3N5bWxpbmstcGF0aHMnKVxuY29uc3QgeyBzeW1saW5rVHlwZSwgc3ltbGlua1R5cGVTeW5jIH0gPSByZXF1aXJlKCcuL3N5bWxpbmstdHlwZScpXG5cbmNvbnN0IHsgcGF0aEV4aXN0cyB9ID0gcmVxdWlyZSgnLi4vcGF0aC1leGlzdHMnKVxuXG5jb25zdCB7IGFyZUlkZW50aWNhbCB9ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlU3ltbGluayAoc3JjcGF0aCwgZHN0cGF0aCwgdHlwZSkge1xuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGF3YWl0IGZzLmxzdGF0KGRzdHBhdGgpXG4gIH0gY2F0Y2ggeyB9XG5cbiAgaWYgKHN0YXRzICYmIHN0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICBjb25zdCBbc3JjU3RhdCwgZHN0U3RhdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5zdGF0KHNyY3BhdGgpLFxuICAgICAgZnMuc3RhdChkc3RwYXRoKVxuICAgIF0pXG5cbiAgICBpZiAoYXJlSWRlbnRpY2FsKHNyY1N0YXQsIGRzdFN0YXQpKSByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHJlbGF0aXZlID0gYXdhaXQgc3ltbGlua1BhdGhzKHNyY3BhdGgsIGRzdHBhdGgpXG4gIHNyY3BhdGggPSByZWxhdGl2ZS50b0RzdFxuICBjb25zdCB0b1R5cGUgPSBhd2FpdCBzeW1saW5rVHlwZShyZWxhdGl2ZS50b0N3ZCwgdHlwZSlcbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGRzdHBhdGgpXG5cbiAgaWYgKCEoYXdhaXQgcGF0aEV4aXN0cyhkaXIpKSkge1xuICAgIGF3YWl0IG1rZGlycyhkaXIpXG4gIH1cblxuICByZXR1cm4gZnMuc3ltbGluayhzcmNwYXRoLCBkc3RwYXRoLCB0b1R5cGUpXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN5bWxpbmtTeW5jIChzcmNwYXRoLCBkc3RwYXRoLCB0eXBlKSB7XG4gIGxldCBzdGF0c1xuICB0cnkge1xuICAgIHN0YXRzID0gZnMubHN0YXRTeW5jKGRzdHBhdGgpXG4gIH0gY2F0Y2ggeyB9XG4gIGlmIChzdGF0cyAmJiBzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgY29uc3Qgc3JjU3RhdCA9IGZzLnN0YXRTeW5jKHNyY3BhdGgpXG4gICAgY29uc3QgZHN0U3RhdCA9IGZzLnN0YXRTeW5jKGRzdHBhdGgpXG4gICAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkc3RTdGF0KSkgcmV0dXJuXG4gIH1cblxuICBjb25zdCByZWxhdGl2ZSA9IHN5bWxpbmtQYXRoc1N5bmMoc3JjcGF0aCwgZHN0cGF0aClcbiAgc3JjcGF0aCA9IHJlbGF0aXZlLnRvRHN0XG4gIHR5cGUgPSBzeW1saW5rVHlwZVN5bmMocmVsYXRpdmUudG9Dd2QsIHR5cGUpXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShkc3RwYXRoKVxuICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKGRpcilcbiAgaWYgKGV4aXN0cykgcmV0dXJuIGZzLnN5bWxpbmtTeW5jKHNyY3BhdGgsIGRzdHBhdGgsIHR5cGUpXG4gIG1rZGlyc1N5bmMoZGlyKVxuICByZXR1cm4gZnMuc3ltbGlua1N5bmMoc3JjcGF0aCwgZHN0cGF0aCwgdHlwZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZVN5bWxpbms6IHUoY3JlYXRlU3ltbGluayksXG4gIGNyZWF0ZVN5bWxpbmtTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcbi8vIFRoaXMgaXMgYWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ub3JtYWxpemUvbXpcbi8vIENvcHlyaWdodCAoYykgMjAxNC0yMDE2IEpvbmF0aGFuIE9uZyBtZUBqb25nbGViZXJyeS5jb20gYW5kIENvbnRyaWJ1dG9yc1xuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21DYWxsYmFja1xuY29uc3QgZnMgPSByZXF1aXJlKCdncmFjZWZ1bC1mcycpXG5cbmNvbnN0IGFwaSA9IFtcbiAgJ2FjY2VzcycsXG4gICdhcHBlbmRGaWxlJyxcbiAgJ2NobW9kJyxcbiAgJ2Nob3duJyxcbiAgJ2Nsb3NlJyxcbiAgJ2NvcHlGaWxlJyxcbiAgJ2ZjaG1vZCcsXG4gICdmY2hvd24nLFxuICAnZmRhdGFzeW5jJyxcbiAgJ2ZzdGF0JyxcbiAgJ2ZzeW5jJyxcbiAgJ2Z0cnVuY2F0ZScsXG4gICdmdXRpbWVzJyxcbiAgJ2xjaG1vZCcsXG4gICdsY2hvd24nLFxuICAnbGluaycsXG4gICdsc3RhdCcsXG4gICdta2RpcicsXG4gICdta2R0ZW1wJyxcbiAgJ29wZW4nLFxuICAnb3BlbmRpcicsXG4gICdyZWFkZGlyJyxcbiAgJ3JlYWRGaWxlJyxcbiAgJ3JlYWRsaW5rJyxcbiAgJ3JlYWxwYXRoJyxcbiAgJ3JlbmFtZScsXG4gICdybScsXG4gICdybWRpcicsXG4gICdzdGF0JyxcbiAgJ3N5bWxpbmsnLFxuICAndHJ1bmNhdGUnLFxuICAndW5saW5rJyxcbiAgJ3V0aW1lcycsXG4gICd3cml0ZUZpbGUnXG5dLmZpbHRlcihrZXkgPT4ge1xuICAvLyBTb21lIGNvbW1hbmRzIGFyZSBub3QgYXZhaWxhYmxlIG9uIHNvbWUgc3lzdGVtcy4gRXg6XG4gIC8vIGZzLmNwIHdhcyBhZGRlZCBpbiBOb2RlLmpzIHYxNi43LjBcbiAgLy8gZnMubGNob3duIGlzIG5vdCBhdmFpbGFibGUgb24gYXQgbGVhc3Qgc29tZSBMaW51eFxuICByZXR1cm4gdHlwZW9mIGZzW2tleV0gPT09ICdmdW5jdGlvbidcbn0pXG5cbi8vIEV4cG9ydCBjbG9uZWQgZnM6XG5PYmplY3QuYXNzaWduKGV4cG9ydHMsIGZzKVxuXG4vLyBVbml2ZXJzYWxpZnkgYXN5bmMgbWV0aG9kczpcbmFwaS5mb3JFYWNoKG1ldGhvZCA9PiB7XG4gIGV4cG9ydHNbbWV0aG9kXSA9IHUoZnNbbWV0aG9kXSlcbn0pXG5cbi8vIFdlIGRpZmZlciBmcm9tIG16L2ZzIGluIHRoYXQgd2Ugc3RpbGwgc2hpcCB0aGUgb2xkLCBicm9rZW4sIGZzLmV4aXN0cygpXG4vLyBzaW5jZSB3ZSBhcmUgYSBkcm9wLWluIHJlcGxhY2VtZW50IGZvciB0aGUgbmF0aXZlIG1vZHVsZVxuZXhwb3J0cy5leGlzdHMgPSBmdW5jdGlvbiAoZmlsZW5hbWUsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZnMuZXhpc3RzKGZpbGVuYW1lLCBjYWxsYmFjaylcbiAgfVxuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0cyhmaWxlbmFtZSwgcmVzb2x2ZSlcbiAgfSlcbn1cblxuLy8gZnMucmVhZCgpLCBmcy53cml0ZSgpLCBmcy5yZWFkdigpLCAmIGZzLndyaXRldigpIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQgZHVlIHRvIG11bHRpcGxlIGNhbGxiYWNrIGFyZ3NcblxuZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmcy5yZWFkKGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spXG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBmcy5yZWFkKGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgKGVyciwgYnl0ZXNSZWFkLCBidWZmZXIpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgcmVzb2x2ZSh7IGJ5dGVzUmVhZCwgYnVmZmVyIH0pXG4gICAgfSlcbiAgfSlcbn1cblxuLy8gRnVuY3Rpb24gc2lnbmF0dXJlIGNhbiBiZVxuLy8gZnMud3JpdGUoZmQsIGJ1ZmZlclssIG9mZnNldFssIGxlbmd0aFssIHBvc2l0aW9uXV1dLCBjYWxsYmFjaylcbi8vIE9SXG4vLyBmcy53cml0ZShmZCwgc3RyaW5nWywgcG9zaXRpb25bLCBlbmNvZGluZ11dLCBjYWxsYmFjaylcbi8vIFdlIG5lZWQgdG8gaGFuZGxlIGJvdGggY2FzZXMsIHNvIHdlIHVzZSAuLi5hcmdzXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGZkLCBidWZmZXIsIC4uLmFyZ3MpIHtcbiAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZnMud3JpdGUoZmQsIGJ1ZmZlciwgLi4uYXJncylcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZnMud3JpdGUoZmQsIGJ1ZmZlciwgLi4uYXJncywgKGVyciwgYnl0ZXNXcml0dGVuLCBidWZmZXIpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgcmVzb2x2ZSh7IGJ5dGVzV3JpdHRlbiwgYnVmZmVyIH0pXG4gICAgfSlcbiAgfSlcbn1cblxuLy8gRnVuY3Rpb24gc2lnbmF0dXJlIGlzXG4vLyBzLnJlYWR2KGZkLCBidWZmZXJzWywgcG9zaXRpb25dLCBjYWxsYmFjaylcbi8vIFdlIG5lZWQgdG8gaGFuZGxlIHRoZSBvcHRpb25hbCBhcmcsIHNvIHdlIHVzZSAuLi5hcmdzXG5leHBvcnRzLnJlYWR2ID0gZnVuY3Rpb24gKGZkLCBidWZmZXJzLCAuLi5hcmdzKSB7XG4gIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZzLnJlYWR2KGZkLCBidWZmZXJzLCAuLi5hcmdzKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBmcy5yZWFkdihmZCwgYnVmZmVycywgLi4uYXJncywgKGVyciwgYnl0ZXNSZWFkLCBidWZmZXJzKSA9PiB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgIHJlc29sdmUoeyBieXRlc1JlYWQsIGJ1ZmZlcnMgfSlcbiAgICB9KVxuICB9KVxufVxuXG4vLyBGdW5jdGlvbiBzaWduYXR1cmUgaXNcbi8vIHMud3JpdGV2KGZkLCBidWZmZXJzWywgcG9zaXRpb25dLCBjYWxsYmFjaylcbi8vIFdlIG5lZWQgdG8gaGFuZGxlIHRoZSBvcHRpb25hbCBhcmcsIHNvIHdlIHVzZSAuLi5hcmdzXG5leHBvcnRzLndyaXRldiA9IGZ1bmN0aW9uIChmZCwgYnVmZmVycywgLi4uYXJncykge1xuICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmcy53cml0ZXYoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MpXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGZzLndyaXRldihmZCwgYnVmZmVycywgLi4uYXJncywgKGVyciwgYnl0ZXNXcml0dGVuLCBidWZmZXJzKSA9PiB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgIHJlc29sdmUoeyBieXRlc1dyaXR0ZW4sIGJ1ZmZlcnMgfSlcbiAgICB9KVxuICB9KVxufVxuXG4vLyBmcy5yZWFscGF0aC5uYXRpdmUgc29tZXRpbWVzIG5vdCBhdmFpbGFibGUgaWYgZnMgaXMgbW9ua2V5LXBhdGNoZWRcbmlmICh0eXBlb2YgZnMucmVhbHBhdGgubmF0aXZlID09PSAnZnVuY3Rpb24nKSB7XG4gIGV4cG9ydHMucmVhbHBhdGgubmF0aXZlID0gdShmcy5yZWFscGF0aC5uYXRpdmUpXG59IGVsc2Uge1xuICBwcm9jZXNzLmVtaXRXYXJuaW5nKFxuICAgICdmcy5yZWFscGF0aC5uYXRpdmUgaXMgbm90IGEgZnVuY3Rpb24uIElzIGZzIGJlaW5nIG1vbmtleS1wYXRjaGVkPycsXG4gICAgJ1dhcm5pbmcnLCAnZnMtZXh0cmEtV0FSTjAwMDMnXG4gIClcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gRXhwb3J0IHByb21pc2VpZmllZCBncmFjZWZ1bC1mczpcbiAgLi4ucmVxdWlyZSgnLi9mcycpLFxuICAvLyBFeHBvcnQgZXh0cmEgbWV0aG9kczpcbiAgLi4ucmVxdWlyZSgnLi9jb3B5JyksXG4gIC4uLnJlcXVpcmUoJy4vZW1wdHknKSxcbiAgLi4ucmVxdWlyZSgnLi9lbnN1cmUnKSxcbiAgLi4ucmVxdWlyZSgnLi9qc29uJyksXG4gIC4uLnJlcXVpcmUoJy4vbWtkaXJzJyksXG4gIC4uLnJlcXVpcmUoJy4vbW92ZScpLFxuICAuLi5yZXF1aXJlKCcuL291dHB1dC1maWxlJyksXG4gIC4uLnJlcXVpcmUoJy4vcGF0aC1leGlzdHMnKSxcbiAgLi4ucmVxdWlyZSgnLi9yZW1vdmUnKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QganNvbkZpbGUgPSByZXF1aXJlKCcuL2pzb25maWxlJylcblxuanNvbkZpbGUub3V0cHV0SnNvbiA9IHUocmVxdWlyZSgnLi9vdXRwdXQtanNvbicpKVxuanNvbkZpbGUub3V0cHV0SnNvblN5bmMgPSByZXF1aXJlKCcuL291dHB1dC1qc29uLXN5bmMnKVxuLy8gYWxpYXNlc1xuanNvbkZpbGUub3V0cHV0SlNPTiA9IGpzb25GaWxlLm91dHB1dEpzb25cbmpzb25GaWxlLm91dHB1dEpTT05TeW5jID0ganNvbkZpbGUub3V0cHV0SnNvblN5bmNcbmpzb25GaWxlLndyaXRlSlNPTiA9IGpzb25GaWxlLndyaXRlSnNvblxuanNvbkZpbGUud3JpdGVKU09OU3luYyA9IGpzb25GaWxlLndyaXRlSnNvblN5bmNcbmpzb25GaWxlLnJlYWRKU09OID0ganNvbkZpbGUucmVhZEpzb25cbmpzb25GaWxlLnJlYWRKU09OU3luYyA9IGpzb25GaWxlLnJlYWRKc29uU3luY1xuXG5tb2R1bGUuZXhwb3J0cyA9IGpzb25GaWxlXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QganNvbkZpbGUgPSByZXF1aXJlKCdqc29uZmlsZScpXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBqc29uZmlsZSBleHBvcnRzXG4gIHJlYWRKc29uOiBqc29uRmlsZS5yZWFkRmlsZSxcbiAgcmVhZEpzb25TeW5jOiBqc29uRmlsZS5yZWFkRmlsZVN5bmMsXG4gIHdyaXRlSnNvbjoganNvbkZpbGUud3JpdGVGaWxlLFxuICB3cml0ZUpzb25TeW5jOiBqc29uRmlsZS53cml0ZUZpbGVTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBzdHJpbmdpZnkgfSA9IHJlcXVpcmUoJ2pzb25maWxlL3V0aWxzJylcbmNvbnN0IHsgb3V0cHV0RmlsZVN5bmMgfSA9IHJlcXVpcmUoJy4uL291dHB1dC1maWxlJylcblxuZnVuY3Rpb24gb3V0cHV0SnNvblN5bmMgKGZpbGUsIGRhdGEsIG9wdGlvbnMpIHtcbiAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KGRhdGEsIG9wdGlvbnMpXG5cbiAgb3V0cHV0RmlsZVN5bmMoZmlsZSwgc3RyLCBvcHRpb25zKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG91dHB1dEpzb25TeW5jXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgeyBzdHJpbmdpZnkgfSA9IHJlcXVpcmUoJ2pzb25maWxlL3V0aWxzJylcbmNvbnN0IHsgb3V0cHV0RmlsZSB9ID0gcmVxdWlyZSgnLi4vb3V0cHV0LWZpbGUnKVxuXG5hc3luYyBmdW5jdGlvbiBvdXRwdXRKc29uIChmaWxlLCBkYXRhLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KGRhdGEsIG9wdGlvbnMpXG5cbiAgYXdhaXQgb3V0cHV0RmlsZShmaWxlLCBzdHIsIG9wdGlvbnMpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3V0cHV0SnNvblxuIiwiJ3VzZSBzdHJpY3QnXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IHsgbWFrZURpcjogX21ha2VEaXIsIG1ha2VEaXJTeW5jIH0gPSByZXF1aXJlKCcuL21ha2UtZGlyJylcbmNvbnN0IG1ha2VEaXIgPSB1KF9tYWtlRGlyKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWtkaXJzOiBtYWtlRGlyLFxuICBta2RpcnNTeW5jOiBtYWtlRGlyU3luYyxcbiAgLy8gYWxpYXNcbiAgbWtkaXJwOiBtYWtlRGlyLFxuICBta2RpcnBTeW5jOiBtYWtlRGlyU3luYyxcbiAgZW5zdXJlRGlyOiBtYWtlRGlyLFxuICBlbnN1cmVEaXJTeW5jOiBtYWtlRGlyU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHsgY2hlY2tQYXRoIH0gPSByZXF1aXJlKCcuL3V0aWxzJylcblxuY29uc3QgZ2V0TW9kZSA9IG9wdGlvbnMgPT4ge1xuICBjb25zdCBkZWZhdWx0cyA9IHsgbW9kZTogMG83NzcgfVxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdudW1iZXInKSByZXR1cm4gb3B0aW9uc1xuICByZXR1cm4gKHsgLi4uZGVmYXVsdHMsIC4uLm9wdGlvbnMgfSkubW9kZVxufVxuXG5tb2R1bGUuZXhwb3J0cy5tYWtlRGlyID0gYXN5bmMgKGRpciwgb3B0aW9ucykgPT4ge1xuICBjaGVja1BhdGgoZGlyKVxuXG4gIHJldHVybiBmcy5ta2RpcihkaXIsIHtcbiAgICBtb2RlOiBnZXRNb2RlKG9wdGlvbnMpLFxuICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cy5tYWtlRGlyU3luYyA9IChkaXIsIG9wdGlvbnMpID0+IHtcbiAgY2hlY2tQYXRoKGRpcilcblxuICByZXR1cm4gZnMubWtkaXJTeW5jKGRpciwge1xuICAgIG1vZGU6IGdldE1vZGUob3B0aW9ucyksXG4gICAgcmVjdXJzaXZlOiB0cnVlXG4gIH0pXG59XG4iLCIvLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9tYWtlLWRpclxuLy8gQ29weXJpZ2h0IChjKSBTaW5kcmUgU29yaHVzIDxzaW5kcmVzb3JodXNAZ21haWwuY29tPiAoc2luZHJlc29yaHVzLmNvbSlcbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuJ3VzZSBzdHJpY3QnXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvODk4N1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2xpYnV2L2xpYnV2L3B1bGwvMTA4OFxubW9kdWxlLmV4cG9ydHMuY2hlY2tQYXRoID0gZnVuY3Rpb24gY2hlY2tQYXRoIChwdGgpIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBjb25zdCBwYXRoSGFzSW52YWxpZFdpbkNoYXJhY3RlcnMgPSAvWzw+OlwifD8qXS8udGVzdChwdGgucmVwbGFjZShwYXRoLnBhcnNlKHB0aCkucm9vdCwgJycpKVxuXG4gICAgaWYgKHBhdGhIYXNJbnZhbGlkV2luQ2hhcmFjdGVycykge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYFBhdGggY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzOiAke3B0aH1gKVxuICAgICAgZXJyb3IuY29kZSA9ICdFSU5WQUwnXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1vdmU6IHUocmVxdWlyZSgnLi9tb3ZlJykpLFxuICBtb3ZlU3luYzogcmVxdWlyZSgnLi9tb3ZlLXN5bmMnKVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgY29weVN5bmMgPSByZXF1aXJlKCcuLi9jb3B5JykuY29weVN5bmNcbmNvbnN0IHJlbW92ZVN5bmMgPSByZXF1aXJlKCcuLi9yZW1vdmUnKS5yZW1vdmVTeW5jXG5jb25zdCBta2RpcnBTeW5jID0gcmVxdWlyZSgnLi4vbWtkaXJzJykubWtkaXJwU3luY1xuY29uc3Qgc3RhdCA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmZ1bmN0aW9uIG1vdmVTeW5jIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgY29uc3Qgb3ZlcndyaXRlID0gb3B0cy5vdmVyd3JpdGUgfHwgb3B0cy5jbG9iYmVyIHx8IGZhbHNlXG5cbiAgY29uc3QgeyBzcmNTdGF0LCBpc0NoYW5naW5nQ2FzZSA9IGZhbHNlIH0gPSBzdGF0LmNoZWNrUGF0aHNTeW5jKHNyYywgZGVzdCwgJ21vdmUnLCBvcHRzKVxuICBzdGF0LmNoZWNrUGFyZW50UGF0aHNTeW5jKHNyYywgc3JjU3RhdCwgZGVzdCwgJ21vdmUnKVxuICBpZiAoIWlzUGFyZW50Um9vdChkZXN0KSkgbWtkaXJwU3luYyhwYXRoLmRpcm5hbWUoZGVzdCkpXG4gIHJldHVybiBkb1JlbmFtZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSwgaXNDaGFuZ2luZ0Nhc2UpXG59XG5cbmZ1bmN0aW9uIGlzUGFyZW50Um9vdCAoZGVzdCkge1xuICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGVzdClcbiAgY29uc3QgcGFyc2VkUGF0aCA9IHBhdGgucGFyc2UocGFyZW50KVxuICByZXR1cm4gcGFyc2VkUGF0aC5yb290ID09PSBwYXJlbnRcbn1cblxuZnVuY3Rpb24gZG9SZW5hbWUgKHNyYywgZGVzdCwgb3ZlcndyaXRlLCBpc0NoYW5naW5nQ2FzZSkge1xuICBpZiAoaXNDaGFuZ2luZ0Nhc2UpIHJldHVybiByZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG4gIGlmIChvdmVyd3JpdGUpIHtcbiAgICByZW1vdmVTeW5jKGRlc3QpXG4gICAgcmV0dXJuIHJlbmFtZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSlcbiAgfVxuICBpZiAoZnMuZXhpc3RzU3luYyhkZXN0KSkgdGhyb3cgbmV3IEVycm9yKCdkZXN0IGFscmVhZHkgZXhpc3RzLicpXG4gIHJldHVybiByZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG59XG5cbmZ1bmN0aW9uIHJlbmFtZSAoc3JjLCBkZXN0LCBvdmVyd3JpdGUpIHtcbiAgdHJ5IHtcbiAgICBmcy5yZW5hbWVTeW5jKHNyYywgZGVzdClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlICE9PSAnRVhERVYnKSB0aHJvdyBlcnJcbiAgICByZXR1cm4gbW92ZUFjcm9zc0RldmljZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3ZlQWNyb3NzRGV2aWNlIChzcmMsIGRlc3QsIG92ZXJ3cml0ZSkge1xuICBjb25zdCBvcHRzID0ge1xuICAgIG92ZXJ3cml0ZSxcbiAgICBlcnJvck9uRXhpc3Q6IHRydWUsXG4gICAgcHJlc2VydmVUaW1lc3RhbXBzOiB0cnVlXG4gIH1cbiAgY29weVN5bmMoc3JjLCBkZXN0LCBvcHRzKVxuICByZXR1cm4gcmVtb3ZlU3luYyhzcmMpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbW92ZVN5bmNcbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IHsgY29weSB9ID0gcmVxdWlyZSgnLi4vY29weScpXG5jb25zdCB7IHJlbW92ZSB9ID0gcmVxdWlyZSgnLi4vcmVtb3ZlJylcbmNvbnN0IHsgbWtkaXJwIH0gPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuY29uc3QgeyBwYXRoRXhpc3RzIH0gPSByZXF1aXJlKCcuLi9wYXRoLWV4aXN0cycpXG5jb25zdCBzdGF0ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuYXN5bmMgZnVuY3Rpb24gbW92ZSAoc3JjLCBkZXN0LCBvcHRzID0ge30pIHtcbiAgY29uc3Qgb3ZlcndyaXRlID0gb3B0cy5vdmVyd3JpdGUgfHwgb3B0cy5jbG9iYmVyIHx8IGZhbHNlXG5cbiAgY29uc3QgeyBzcmNTdGF0LCBpc0NoYW5naW5nQ2FzZSA9IGZhbHNlIH0gPSBhd2FpdCBzdGF0LmNoZWNrUGF0aHMoc3JjLCBkZXN0LCAnbW92ZScsIG9wdHMpXG5cbiAgYXdhaXQgc3RhdC5jaGVja1BhcmVudFBhdGhzKHNyYywgc3JjU3RhdCwgZGVzdCwgJ21vdmUnKVxuXG4gIC8vIElmIHRoZSBwYXJlbnQgb2YgZGVzdCBpcyBub3Qgcm9vdCwgbWFrZSBzdXJlIGl0IGV4aXN0cyBiZWZvcmUgcHJvY2VlZGluZ1xuICBjb25zdCBkZXN0UGFyZW50ID0gcGF0aC5kaXJuYW1lKGRlc3QpXG4gIGNvbnN0IHBhcnNlZFBhcmVudFBhdGggPSBwYXRoLnBhcnNlKGRlc3RQYXJlbnQpXG4gIGlmIChwYXJzZWRQYXJlbnRQYXRoLnJvb3QgIT09IGRlc3RQYXJlbnQpIHtcbiAgICBhd2FpdCBta2RpcnAoZGVzdFBhcmVudClcbiAgfVxuXG4gIHJldHVybiBkb1JlbmFtZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSwgaXNDaGFuZ2luZ0Nhc2UpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvUmVuYW1lIChzcmMsIGRlc3QsIG92ZXJ3cml0ZSwgaXNDaGFuZ2luZ0Nhc2UpIHtcbiAgaWYgKCFpc0NoYW5naW5nQ2FzZSkge1xuICAgIGlmIChvdmVyd3JpdGUpIHtcbiAgICAgIGF3YWl0IHJlbW92ZShkZXN0KVxuICAgIH0gZWxzZSBpZiAoYXdhaXQgcGF0aEV4aXN0cyhkZXN0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXN0IGFscmVhZHkgZXhpc3RzLicpXG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUcnkgdy8gcmVuYW1lIGZpcnN0LCBhbmQgdHJ5IGNvcHkgKyByZW1vdmUgaWYgRVhERVZcbiAgICBhd2FpdCBmcy5yZW5hbWUoc3JjLCBkZXN0KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLmNvZGUgIT09ICdFWERFVicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBhd2FpdCBtb3ZlQWNyb3NzRGV2aWNlKHNyYywgZGVzdCwgb3ZlcndyaXRlKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1vdmVBY3Jvc3NEZXZpY2UgKHNyYywgZGVzdCwgb3ZlcndyaXRlKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgb3ZlcndyaXRlLFxuICAgIGVycm9yT25FeGlzdDogdHJ1ZSxcbiAgICBwcmVzZXJ2ZVRpbWVzdGFtcHM6IHRydWVcbiAgfVxuXG4gIGF3YWl0IGNvcHkoc3JjLCBkZXN0LCBvcHRzKVxuICByZXR1cm4gcmVtb3ZlKHNyYylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtb3ZlXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IG1rZGlyID0gcmVxdWlyZSgnLi4vbWtkaXJzJylcbmNvbnN0IHBhdGhFeGlzdHMgPSByZXF1aXJlKCcuLi9wYXRoLWV4aXN0cycpLnBhdGhFeGlzdHNcblxuYXN5bmMgZnVuY3Rpb24gb3V0cHV0RmlsZSAoZmlsZSwgZGF0YSwgZW5jb2RpbmcgPSAndXRmLTgnKSB7XG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShmaWxlKVxuXG4gIGlmICghKGF3YWl0IHBhdGhFeGlzdHMoZGlyKSkpIHtcbiAgICBhd2FpdCBta2Rpci5ta2RpcnMoZGlyKVxuICB9XG5cbiAgcmV0dXJuIGZzLndyaXRlRmlsZShmaWxlLCBkYXRhLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gb3V0cHV0RmlsZVN5bmMgKGZpbGUsIC4uLmFyZ3MpIHtcbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGZpbGUpXG4gIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSB7XG4gICAgbWtkaXIubWtkaXJzU3luYyhkaXIpXG4gIH1cblxuICBmcy53cml0ZUZpbGVTeW5jKGZpbGUsIC4uLmFyZ3MpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBvdXRwdXRGaWxlOiB1KG91dHB1dEZpbGUpLFxuICBvdXRwdXRGaWxlU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuXG5mdW5jdGlvbiBwYXRoRXhpc3RzIChwYXRoKSB7XG4gIHJldHVybiBmcy5hY2Nlc3MocGF0aCkudGhlbigoKSA9PiB0cnVlKS5jYXRjaCgoKSA9PiBmYWxzZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBhdGhFeGlzdHM6IHUocGF0aEV4aXN0cyksXG4gIHBhdGhFeGlzdHNTeW5jOiBmcy5leGlzdHNTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCdncmFjZWZ1bC1mcycpXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbUNhbGxiYWNrXG5cbmZ1bmN0aW9uIHJlbW92ZSAocGF0aCwgY2FsbGJhY2spIHtcbiAgZnMucm0ocGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0sIGNhbGxiYWNrKVxufVxuXG5mdW5jdGlvbiByZW1vdmVTeW5jIChwYXRoKSB7XG4gIGZzLnJtU3luYyhwYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJlbW92ZTogdShyZW1vdmUpLFxuICByZW1vdmVTeW5jXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcblxuZnVuY3Rpb24gZ2V0U3RhdHMgKHNyYywgZGVzdCwgb3B0cykge1xuICBjb25zdCBzdGF0RnVuYyA9IG9wdHMuZGVyZWZlcmVuY2VcbiAgICA/IChmaWxlKSA9PiBmcy5zdGF0KGZpbGUsIHsgYmlnaW50OiB0cnVlIH0pXG4gICAgOiAoZmlsZSkgPT4gZnMubHN0YXQoZmlsZSwgeyBiaWdpbnQ6IHRydWUgfSlcbiAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICBzdGF0RnVuYyhzcmMpLFxuICAgIHN0YXRGdW5jKGRlc3QpLmNhdGNoKGVyciA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gbnVsbFxuICAgICAgdGhyb3cgZXJyXG4gICAgfSlcbiAgXSkudGhlbigoW3NyY1N0YXQsIGRlc3RTdGF0XSkgPT4gKHsgc3JjU3RhdCwgZGVzdFN0YXQgfSkpXG59XG5cbmZ1bmN0aW9uIGdldFN0YXRzU3luYyAoc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGxldCBkZXN0U3RhdFxuICBjb25zdCBzdGF0RnVuYyA9IG9wdHMuZGVyZWZlcmVuY2VcbiAgICA/IChmaWxlKSA9PiBmcy5zdGF0U3luYyhmaWxlLCB7IGJpZ2ludDogdHJ1ZSB9KVxuICAgIDogKGZpbGUpID0+IGZzLmxzdGF0U3luYyhmaWxlLCB7IGJpZ2ludDogdHJ1ZSB9KVxuICBjb25zdCBzcmNTdGF0ID0gc3RhdEZ1bmMoc3JjKVxuICB0cnkge1xuICAgIGRlc3RTdGF0ID0gc3RhdEZ1bmMoZGVzdClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIHsgc3JjU3RhdCwgZGVzdFN0YXQ6IG51bGwgfVxuICAgIHRocm93IGVyclxuICB9XG4gIHJldHVybiB7IHNyY1N0YXQsIGRlc3RTdGF0IH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tQYXRocyAoc3JjLCBkZXN0LCBmdW5jTmFtZSwgb3B0cykge1xuICBjb25zdCB7IHNyY1N0YXQsIGRlc3RTdGF0IH0gPSBhd2FpdCBnZXRTdGF0cyhzcmMsIGRlc3QsIG9wdHMpXG4gIGlmIChkZXN0U3RhdCkge1xuICAgIGlmIChhcmVJZGVudGljYWwoc3JjU3RhdCwgZGVzdFN0YXQpKSB7XG4gICAgICBjb25zdCBzcmNCYXNlTmFtZSA9IHBhdGguYmFzZW5hbWUoc3JjKVxuICAgICAgY29uc3QgZGVzdEJhc2VOYW1lID0gcGF0aC5iYXNlbmFtZShkZXN0KVxuICAgICAgaWYgKGZ1bmNOYW1lID09PSAnbW92ZScgJiZcbiAgICAgICAgc3JjQmFzZU5hbWUgIT09IGRlc3RCYXNlTmFtZSAmJlxuICAgICAgICBzcmNCYXNlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBkZXN0QmFzZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICByZXR1cm4geyBzcmNTdGF0LCBkZXN0U3RhdCwgaXNDaGFuZ2luZ0Nhc2U6IHRydWUgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG11c3Qgbm90IGJlIHRoZSBzYW1lLicpXG4gICAgfVxuICAgIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkgJiYgIWRlc3RTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG92ZXJ3cml0ZSBub24tZGlyZWN0b3J5ICcke2Rlc3R9JyB3aXRoIGRpcmVjdG9yeSAnJHtzcmN9Jy5gKVxuICAgIH1cbiAgICBpZiAoIXNyY1N0YXQuaXNEaXJlY3RvcnkoKSAmJiBkZXN0U3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgZGlyZWN0b3J5ICcke2Rlc3R9JyB3aXRoIG5vbi1kaXJlY3RvcnkgJyR7c3JjfScuYClcbiAgICB9XG4gIH1cblxuICBpZiAoc3JjU3RhdC5pc0RpcmVjdG9yeSgpICYmIGlzU3JjU3ViZGlyKHNyYywgZGVzdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKHNyYywgZGVzdCwgZnVuY05hbWUpKVxuICB9XG5cbiAgcmV0dXJuIHsgc3JjU3RhdCwgZGVzdFN0YXQgfVxufVxuXG5mdW5jdGlvbiBjaGVja1BhdGhzU3luYyAoc3JjLCBkZXN0LCBmdW5jTmFtZSwgb3B0cykge1xuICBjb25zdCB7IHNyY1N0YXQsIGRlc3RTdGF0IH0gPSBnZXRTdGF0c1N5bmMoc3JjLCBkZXN0LCBvcHRzKVxuXG4gIGlmIChkZXN0U3RhdCkge1xuICAgIGlmIChhcmVJZGVudGljYWwoc3JjU3RhdCwgZGVzdFN0YXQpKSB7XG4gICAgICBjb25zdCBzcmNCYXNlTmFtZSA9IHBhdGguYmFzZW5hbWUoc3JjKVxuICAgICAgY29uc3QgZGVzdEJhc2VOYW1lID0gcGF0aC5iYXNlbmFtZShkZXN0KVxuICAgICAgaWYgKGZ1bmNOYW1lID09PSAnbW92ZScgJiZcbiAgICAgICAgc3JjQmFzZU5hbWUgIT09IGRlc3RCYXNlTmFtZSAmJlxuICAgICAgICBzcmNCYXNlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBkZXN0QmFzZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICByZXR1cm4geyBzcmNTdGF0LCBkZXN0U3RhdCwgaXNDaGFuZ2luZ0Nhc2U6IHRydWUgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG11c3Qgbm90IGJlIHRoZSBzYW1lLicpXG4gICAgfVxuICAgIGlmIChzcmNTdGF0LmlzRGlyZWN0b3J5KCkgJiYgIWRlc3RTdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG92ZXJ3cml0ZSBub24tZGlyZWN0b3J5ICcke2Rlc3R9JyB3aXRoIGRpcmVjdG9yeSAnJHtzcmN9Jy5gKVxuICAgIH1cbiAgICBpZiAoIXNyY1N0YXQuaXNEaXJlY3RvcnkoKSAmJiBkZXN0U3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgZGlyZWN0b3J5ICcke2Rlc3R9JyB3aXRoIG5vbi1kaXJlY3RvcnkgJyR7c3JjfScuYClcbiAgICB9XG4gIH1cblxuICBpZiAoc3JjU3RhdC5pc0RpcmVjdG9yeSgpICYmIGlzU3JjU3ViZGlyKHNyYywgZGVzdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKHNyYywgZGVzdCwgZnVuY05hbWUpKVxuICB9XG4gIHJldHVybiB7IHNyY1N0YXQsIGRlc3RTdGF0IH1cbn1cblxuLy8gcmVjdXJzaXZlbHkgY2hlY2sgaWYgZGVzdCBwYXJlbnQgaXMgYSBzdWJkaXJlY3Rvcnkgb2Ygc3JjLlxuLy8gSXQgd29ya3MgZm9yIGFsbCBmaWxlIHR5cGVzIGluY2x1ZGluZyBzeW1saW5rcyBzaW5jZSBpdFxuLy8gY2hlY2tzIHRoZSBzcmMgYW5kIGRlc3QgaW5vZGVzLiBJdCBzdGFydHMgZnJvbSB0aGUgZGVlcGVzdFxuLy8gcGFyZW50IGFuZCBzdG9wcyBvbmNlIGl0IHJlYWNoZXMgdGhlIHNyYyBwYXJlbnQgb3IgdGhlIHJvb3QgcGF0aC5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUGFyZW50UGF0aHMgKHNyYywgc3JjU3RhdCwgZGVzdCwgZnVuY05hbWUpIHtcbiAgY29uc3Qgc3JjUGFyZW50ID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShzcmMpKVxuICBjb25zdCBkZXN0UGFyZW50ID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShkZXN0KSlcbiAgaWYgKGRlc3RQYXJlbnQgPT09IHNyY1BhcmVudCB8fCBkZXN0UGFyZW50ID09PSBwYXRoLnBhcnNlKGRlc3RQYXJlbnQpLnJvb3QpIHJldHVyblxuXG4gIGxldCBkZXN0U3RhdFxuICB0cnkge1xuICAgIGRlc3RTdGF0ID0gYXdhaXQgZnMuc3RhdChkZXN0UGFyZW50LCB7IGJpZ2ludDogdHJ1ZSB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm5cbiAgICB0aHJvdyBlcnJcbiAgfVxuXG4gIGlmIChhcmVJZGVudGljYWwoc3JjU3RhdCwgZGVzdFN0YXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyhzcmMsIGRlc3QsIGZ1bmNOYW1lKSlcbiAgfVxuXG4gIHJldHVybiBjaGVja1BhcmVudFBhdGhzKHNyYywgc3JjU3RhdCwgZGVzdFBhcmVudCwgZnVuY05hbWUpXG59XG5cbmZ1bmN0aW9uIGNoZWNrUGFyZW50UGF0aHNTeW5jIChzcmMsIHNyY1N0YXQsIGRlc3QsIGZ1bmNOYW1lKSB7XG4gIGNvbnN0IHNyY1BhcmVudCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUoc3JjKSlcbiAgY29uc3QgZGVzdFBhcmVudCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUoZGVzdCkpXG4gIGlmIChkZXN0UGFyZW50ID09PSBzcmNQYXJlbnQgfHwgZGVzdFBhcmVudCA9PT0gcGF0aC5wYXJzZShkZXN0UGFyZW50KS5yb290KSByZXR1cm5cbiAgbGV0IGRlc3RTdGF0XG4gIHRyeSB7XG4gICAgZGVzdFN0YXQgPSBmcy5zdGF0U3luYyhkZXN0UGFyZW50LCB7IGJpZ2ludDogdHJ1ZSB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm5cbiAgICB0aHJvdyBlcnJcbiAgfVxuICBpZiAoYXJlSWRlbnRpY2FsKHNyY1N0YXQsIGRlc3RTdGF0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2coc3JjLCBkZXN0LCBmdW5jTmFtZSkpXG4gIH1cbiAgcmV0dXJuIGNoZWNrUGFyZW50UGF0aHNTeW5jKHNyYywgc3JjU3RhdCwgZGVzdFBhcmVudCwgZnVuY05hbWUpXG59XG5cbmZ1bmN0aW9uIGFyZUlkZW50aWNhbCAoc3JjU3RhdCwgZGVzdFN0YXQpIHtcbiAgcmV0dXJuIGRlc3RTdGF0LmlubyAmJiBkZXN0U3RhdC5kZXYgJiYgZGVzdFN0YXQuaW5vID09PSBzcmNTdGF0LmlubyAmJiBkZXN0U3RhdC5kZXYgPT09IHNyY1N0YXQuZGV2XG59XG5cbi8vIHJldHVybiB0cnVlIGlmIGRlc3QgaXMgYSBzdWJkaXIgb2Ygc3JjLCBvdGhlcndpc2UgZmFsc2UuXG4vLyBJdCBvbmx5IGNoZWNrcyB0aGUgcGF0aCBzdHJpbmdzLlxuZnVuY3Rpb24gaXNTcmNTdWJkaXIgKHNyYywgZGVzdCkge1xuICBjb25zdCBzcmNBcnIgPSBwYXRoLnJlc29sdmUoc3JjKS5zcGxpdChwYXRoLnNlcCkuZmlsdGVyKGkgPT4gaSlcbiAgY29uc3QgZGVzdEFyciA9IHBhdGgucmVzb2x2ZShkZXN0KS5zcGxpdChwYXRoLnNlcCkuZmlsdGVyKGkgPT4gaSlcbiAgcmV0dXJuIHNyY0Fyci5ldmVyeSgoY3VyLCBpKSA9PiBkZXN0QXJyW2ldID09PSBjdXIpXG59XG5cbmZ1bmN0aW9uIGVyck1zZyAoc3JjLCBkZXN0LCBmdW5jTmFtZSkge1xuICByZXR1cm4gYENhbm5vdCAke2Z1bmNOYW1lfSAnJHtzcmN9JyB0byBhIHN1YmRpcmVjdG9yeSBvZiBpdHNlbGYsICcke2Rlc3R9Jy5gXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAvLyBjaGVja1BhdGhzXG4gIGNoZWNrUGF0aHM6IHUoY2hlY2tQYXRocyksXG4gIGNoZWNrUGF0aHNTeW5jLFxuICAvLyBjaGVja1BhcmVudFxuICBjaGVja1BhcmVudFBhdGhzOiB1KGNoZWNrUGFyZW50UGF0aHMpLFxuICBjaGVja1BhcmVudFBhdGhzU3luYyxcbiAgLy8gTWlzY1xuICBpc1NyY1N1YmRpcixcbiAgYXJlSWRlbnRpY2FsXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcblxuYXN5bmMgZnVuY3Rpb24gdXRpbWVzTWlsbGlzIChwYXRoLCBhdGltZSwgbXRpbWUpIHtcbiAgLy8gaWYgKCFIQVNfTUlMTElTX1JFUykgcmV0dXJuIGZzLnV0aW1lcyhwYXRoLCBhdGltZSwgbXRpbWUsIGNhbGxiYWNrKVxuICBjb25zdCBmZCA9IGF3YWl0IGZzLm9wZW4ocGF0aCwgJ3IrJylcblxuICBsZXQgY2xvc2VFcnIgPSBudWxsXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5mdXRpbWVzKGZkLCBhdGltZSwgbXRpbWUpXG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmNsb3NlKGZkKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNsb3NlRXJyID0gZVxuICAgIH1cbiAgfVxuXG4gIGlmIChjbG9zZUVycikge1xuICAgIHRocm93IGNsb3NlRXJyXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRpbWVzTWlsbGlzU3luYyAocGF0aCwgYXRpbWUsIG10aW1lKSB7XG4gIGNvbnN0IGZkID0gZnMub3BlblN5bmMocGF0aCwgJ3IrJylcbiAgZnMuZnV0aW1lc1N5bmMoZmQsIGF0aW1lLCBtdGltZSlcbiAgcmV0dXJuIGZzLmNsb3NlU3luYyhmZClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHV0aW1lc01pbGxpczogdSh1dGltZXNNaWxsaXMpLFxuICB1dGltZXNNaWxsaXNTeW5jXG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8vIENhbGwgdGhpcyBmdW5jdGlvbiBpbiBhIGFub3RoZXIgZnVuY3Rpb24gdG8gZmluZCBvdXQgdGhlIGZpbGUgZnJvbVxuLy8gd2hpY2ggdGhhdCBmdW5jdGlvbiB3YXMgY2FsbGVkIGZyb20uIChJbnNwZWN0cyB0aGUgdjggc3RhY2sgdHJhY2UpXG4vL1xuLy8gSW5zcGlyZWQgYnkgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMzIyNzQ4OVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRDYWxsZXJGaWxlKHBvc2l0aW9uKSB7XG4gICAgaWYgKHBvc2l0aW9uID09PSB2b2lkIDApIHsgcG9zaXRpb24gPSAyOyB9XG4gICAgaWYgKHBvc2l0aW9uID49IEVycm9yLnN0YWNrVHJhY2VMaW1pdCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdnZXRDYWxsZXJGaWxlKHBvc2l0aW9uKSByZXF1aXJlcyBwb3NpdGlvbiBiZSBsZXNzIHRoZW4gRXJyb3Iuc3RhY2tUcmFjZUxpbWl0IGJ1dCBwb3NpdGlvbiB3YXM6IGAnICsgcG9zaXRpb24gKyAnYCBhbmQgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0IHdhczogYCcgKyBFcnJvci5zdGFja1RyYWNlTGltaXQgKyAnYCcpO1xuICAgIH1cbiAgICB2YXIgb2xkUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtcbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IGZ1bmN0aW9uIChfLCBzdGFjaykgeyByZXR1cm4gc3RhY2s7IH07XG4gICAgdmFyIHN0YWNrID0gbmV3IEVycm9yKCkuc3RhY2s7XG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBvbGRQcmVwYXJlU3RhY2tUcmFjZTtcbiAgICBpZiAoc3RhY2sgIT09IG51bGwgJiYgdHlwZW9mIHN0YWNrID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBzdGFja1swXSBob2xkcyB0aGlzIGZpbGVcbiAgICAgICAgLy8gc3RhY2tbMV0gaG9sZHMgd2hlcmUgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkXG4gICAgICAgIC8vIHN0YWNrWzJdIGhvbGRzIHRoZSBmaWxlIHdlJ3JlIGludGVyZXN0ZWQgaW5cbiAgICAgICAgcmV0dXJuIHN0YWNrW3Bvc2l0aW9uXSA/IHN0YWNrW3Bvc2l0aW9uXS5nZXRGaWxlTmFtZSgpIDogdW5kZWZpbmVkO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5jb25zdCB7UGFzc1Rocm91Z2g6IFBhc3NUaHJvdWdoU3RyZWFtfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG9wdGlvbnMgPT4ge1xuXHRvcHRpb25zID0gey4uLm9wdGlvbnN9O1xuXG5cdGNvbnN0IHthcnJheX0gPSBvcHRpb25zO1xuXHRsZXQge2VuY29kaW5nfSA9IG9wdGlvbnM7XG5cdGNvbnN0IGlzQnVmZmVyID0gZW5jb2RpbmcgPT09ICdidWZmZXInO1xuXHRsZXQgb2JqZWN0TW9kZSA9IGZhbHNlO1xuXG5cdGlmIChhcnJheSkge1xuXHRcdG9iamVjdE1vZGUgPSAhKGVuY29kaW5nIHx8IGlzQnVmZmVyKTtcblx0fSBlbHNlIHtcblx0XHRlbmNvZGluZyA9IGVuY29kaW5nIHx8ICd1dGY4Jztcblx0fVxuXG5cdGlmIChpc0J1ZmZlcikge1xuXHRcdGVuY29kaW5nID0gbnVsbDtcblx0fVxuXG5cdGNvbnN0IHN0cmVhbSA9IG5ldyBQYXNzVGhyb3VnaFN0cmVhbSh7b2JqZWN0TW9kZX0pO1xuXG5cdGlmIChlbmNvZGluZykge1xuXHRcdHN0cmVhbS5zZXRFbmNvZGluZyhlbmNvZGluZyk7XG5cdH1cblxuXHRsZXQgbGVuZ3RoID0gMDtcblx0Y29uc3QgY2h1bmtzID0gW107XG5cblx0c3RyZWFtLm9uKCdkYXRhJywgY2h1bmsgPT4ge1xuXHRcdGNodW5rcy5wdXNoKGNodW5rKTtcblxuXHRcdGlmIChvYmplY3RNb2RlKSB7XG5cdFx0XHRsZW5ndGggPSBjaHVua3MubGVuZ3RoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZW5ndGggKz0gY2h1bmsubGVuZ3RoO1xuXHRcdH1cblx0fSk7XG5cblx0c3RyZWFtLmdldEJ1ZmZlcmVkVmFsdWUgPSAoKSA9PiB7XG5cdFx0aWYgKGFycmF5KSB7XG5cdFx0XHRyZXR1cm4gY2h1bmtzO1xuXHRcdH1cblxuXHRcdHJldHVybiBpc0J1ZmZlciA/IEJ1ZmZlci5jb25jYXQoY2h1bmtzLCBsZW5ndGgpIDogY2h1bmtzLmpvaW4oJycpO1xuXHR9O1xuXG5cdHN0cmVhbS5nZXRCdWZmZXJlZExlbmd0aCA9ICgpID0+IGxlbmd0aDtcblxuXHRyZXR1cm4gc3RyZWFtO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IHtjb25zdGFudHM6IEJ1ZmZlckNvbnN0YW50c30gPSByZXF1aXJlKCdidWZmZXInKTtcbmNvbnN0IHB1bXAgPSByZXF1aXJlKCdwdW1wJyk7XG5jb25zdCBidWZmZXJTdHJlYW0gPSByZXF1aXJlKCcuL2J1ZmZlci1zdHJlYW0nKTtcblxuY2xhc3MgTWF4QnVmZmVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCdtYXhCdWZmZXIgZXhjZWVkZWQnKTtcblx0XHR0aGlzLm5hbWUgPSAnTWF4QnVmZmVyRXJyb3InO1xuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFN0cmVhbShpbnB1dFN0cmVhbSwgb3B0aW9ucykge1xuXHRpZiAoIWlucHV0U3RyZWFtKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignRXhwZWN0ZWQgYSBzdHJlYW0nKSk7XG5cdH1cblxuXHRvcHRpb25zID0ge1xuXHRcdG1heEJ1ZmZlcjogSW5maW5pdHksXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXG5cdGNvbnN0IHttYXhCdWZmZXJ9ID0gb3B0aW9ucztcblxuXHRsZXQgc3RyZWFtO1xuXHRhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0Y29uc3QgcmVqZWN0UHJvbWlzZSA9IGVycm9yID0+IHtcblx0XHRcdC8vIERvbid0IHJldHJpZXZlIGFuIG92ZXJzaXplZCBidWZmZXIuXG5cdFx0XHRpZiAoZXJyb3IgJiYgc3RyZWFtLmdldEJ1ZmZlcmVkTGVuZ3RoKCkgPD0gQnVmZmVyQ29uc3RhbnRzLk1BWF9MRU5HVEgpIHtcblx0XHRcdFx0ZXJyb3IuYnVmZmVyZWREYXRhID0gc3RyZWFtLmdldEJ1ZmZlcmVkVmFsdWUoKTtcblx0XHRcdH1cblxuXHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHR9O1xuXG5cdFx0c3RyZWFtID0gcHVtcChpbnB1dFN0cmVhbSwgYnVmZmVyU3RyZWFtKG9wdGlvbnMpLCBlcnJvciA9PiB7XG5cdFx0XHRpZiAoZXJyb3IpIHtcblx0XHRcdFx0cmVqZWN0UHJvbWlzZShlcnJvcik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0cmVzb2x2ZSgpO1xuXHRcdH0pO1xuXG5cdFx0c3RyZWFtLm9uKCdkYXRhJywgKCkgPT4ge1xuXHRcdFx0aWYgKHN0cmVhbS5nZXRCdWZmZXJlZExlbmd0aCgpID4gbWF4QnVmZmVyKSB7XG5cdFx0XHRcdHJlamVjdFByb21pc2UobmV3IE1heEJ1ZmZlckVycm9yKCkpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblxuXHRyZXR1cm4gc3RyZWFtLmdldEJ1ZmZlcmVkVmFsdWUoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRTdHJlYW07XG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBmb3IgdGhlIG5leHQgbWFqb3IgcmVsZWFzZVxubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IGdldFN0cmVhbTtcbm1vZHVsZS5leHBvcnRzLmJ1ZmZlciA9IChzdHJlYW0sIG9wdGlvbnMpID0+IGdldFN0cmVhbShzdHJlYW0sIHsuLi5vcHRpb25zLCBlbmNvZGluZzogJ2J1ZmZlcid9KTtcbm1vZHVsZS5leHBvcnRzLmFycmF5ID0gKHN0cmVhbSwgb3B0aW9ucykgPT4gZ2V0U3RyZWFtKHN0cmVhbSwgey4uLm9wdGlvbnMsIGFycmF5OiB0cnVlfSk7XG5tb2R1bGUuZXhwb3J0cy5NYXhCdWZmZXJFcnJvciA9IE1heEJ1ZmZlckVycm9yO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRhdGEgPSB2b2lkIDA7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jb25zdCBjcnlwdG9fMSA9IHJlcXVpcmUoXCJjcnlwdG9cIik7XG5jb25zdCBkYXRhX3VyaV90b19idWZmZXJfMSA9IHJlcXVpcmUoXCJkYXRhLXVyaS10by1idWZmZXJcIik7XG5jb25zdCBub3Rtb2RpZmllZF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL25vdG1vZGlmaWVkXCIpKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2dldC11cmk6ZGF0YScpO1xuY2xhc3MgRGF0YVJlYWRhYmxlIGV4dGVuZHMgc3RyZWFtXzEuUmVhZGFibGUge1xuICAgIGNvbnN0cnVjdG9yKGhhc2gsIGJ1Zikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnB1c2goYnVmKTtcbiAgICAgICAgdGhpcy5wdXNoKG51bGwpO1xuICAgICAgICB0aGlzLmhhc2ggPSBoYXNoO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyBhIFJlYWRhYmxlIHN0cmVhbSBmcm9tIGEgXCJkYXRhOlwiIFVSSS5cbiAqL1xuY29uc3QgZGF0YSA9IGFzeW5jICh7IGhyZWY6IHVyaSB9LCB7IGNhY2hlIH0gPSB7fSkgPT4ge1xuICAgIC8vIG5lZWQgdG8gY3JlYXRlIGEgU0hBMSBoYXNoIG9mIHRoZSBVUkkgc3RyaW5nLCBmb3IgY2FjaGVhYmlsaXR5IGNoZWNrc1xuICAgIC8vIGluIGZ1dHVyZSBgZ2V0VXJpKClgIGNhbGxzIHdpdGggdGhlIHNhbWUgZGF0YSBVUkkgcGFzc2VkIGluLlxuICAgIGNvbnN0IHNoYXN1bSA9ICgwLCBjcnlwdG9fMS5jcmVhdGVIYXNoKSgnc2hhMScpO1xuICAgIHNoYXN1bS51cGRhdGUodXJpKTtcbiAgICBjb25zdCBoYXNoID0gc2hhc3VtLmRpZ2VzdCgnaGV4Jyk7XG4gICAgZGVidWcoJ2dlbmVyYXRlZCBTSEExIGhhc2ggZm9yIFwiZGF0YTpcIiBVUkk6ICVvJywgaGFzaCk7XG4gICAgLy8gY2hlY2sgaWYgdGhlIGNhY2hlIGlzIHRoZSBzYW1lIFwiZGF0YTpcIiBVUkkgdGhhdCB3YXMgcHJldmlvdXNseSBwYXNzZWQgaW4uXG4gICAgaWYgKGNhY2hlPy5oYXNoID09PSBoYXNoKSB7XG4gICAgICAgIGRlYnVnKCdnb3QgbWF0Y2hpbmcgY2FjaGUgU0hBMSBoYXNoOiAlbycsIGhhc2gpO1xuICAgICAgICB0aHJvdyBuZXcgbm90bW9kaWZpZWRfMS5kZWZhdWx0KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkZWJ1ZygnY3JlYXRpbmcgUmVhZGFibGUgc3RyZWFtIGZyb20gXCJkYXRhOlwiIFVSSSBidWZmZXInKTtcbiAgICAgICAgY29uc3QgeyBidWZmZXIgfSA9ICgwLCBkYXRhX3VyaV90b19idWZmZXJfMS5kYXRhVXJpVG9CdWZmZXIpKHVyaSk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YVJlYWRhYmxlKGhhc2gsIEJ1ZmZlci5mcm9tKGJ1ZmZlcikpO1xuICAgIH1cbn07XG5leHBvcnRzLmRhdGEgPSBkYXRhO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZmlsZSA9IHZvaWQgMDtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IGZzXzEgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCBmc19leHRyYV8xID0gcmVxdWlyZShcImZzLWV4dHJhXCIpO1xuY29uc3Qgbm90Zm91bmRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9ub3Rmb3VuZFwiKSk7XG5jb25zdCBub3Rtb2RpZmllZF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL25vdG1vZGlmaWVkXCIpKTtcbmNvbnN0IHVybF8xID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2dldC11cmk6ZmlsZScpO1xuLyoqXG4gKiBSZXR1cm5zIGEgYGZzLlJlYWRTdHJlYW1gIGluc3RhbmNlIGZyb20gYSBcImZpbGU6XCIgVVJJLlxuICovXG5jb25zdCBmaWxlID0gYXN5bmMgKHsgaHJlZjogdXJpIH0sIG9wdHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgY2FjaGUsIGZsYWdzID0gJ3InLCBtb2RlID0gNDM4LCAvLyA9MDY2NlxuICAgICB9ID0gb3B0cztcbiAgICB0cnkge1xuICAgICAgICAvLyBDb252ZXJ0IFVSSSDihpIgUGF0aFxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9ICgwLCB1cmxfMS5maWxlVVJMVG9QYXRoKSh1cmkpO1xuICAgICAgICBkZWJ1ZygnTm9ybWFsaXplZCBwYXRobmFtZTogJW8nLCBmaWxlcGF0aCk7XG4gICAgICAgIC8vIGBvcGVuKClgIGZpcnN0IHRvIGdldCBhIGZpbGUgZGVzY3JpcHRvciBhbmQgZW5zdXJlIHRoYXQgdGhlIGZpbGVcbiAgICAgICAgLy8gZXhpc3RzLlxuICAgICAgICBjb25zdCBmZCA9IGF3YWl0ICgwLCBmc19leHRyYV8xLm9wZW4pKGZpbGVwYXRoLCBmbGFncywgbW9kZSk7XG4gICAgICAgIC8vIE5vdyBgZnN0YXQoKWAgdG8gY2hlY2sgdGhlIGBtdGltZWAgYW5kIHN0b3JlIHRoZSBzdGF0IG9iamVjdCBmb3JcbiAgICAgICAgLy8gdGhlIGNhY2hlLlxuICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgKDAsIGZzX2V4dHJhXzEuZnN0YXQpKGZkKTtcbiAgICAgICAgLy8gaWYgYSBgY2FjaGVgIHdhcyBwcm92aWRlZCwgY2hlY2sgaWYgdGhlIGZpbGUgaGFzIG5vdCBiZWVuIG1vZGlmaWVkXG4gICAgICAgIGlmIChjYWNoZSAmJiBjYWNoZS5zdGF0ICYmIHN0YXQgJiYgaXNOb3RNb2RpZmllZChjYWNoZS5zdGF0LCBzdGF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IG5vdG1vZGlmaWVkXzEuZGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGBmcy5SZWFkU3RyZWFtYCB0YWtlcyBjYXJlIG9mIGNhbGxpbmcgYGZzLmNsb3NlKClgIG9uIHRoZVxuICAgICAgICAvLyBmZCBhZnRlciBpdCdzIGRvbmUgcmVhZGluZ1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBAdHlwZXMvbm9kZWAgZG9lc24ndCBhbGxvdyBgbnVsbGAgYXMgZmlsZSBwYXRoIDovXG4gICAgICAgIGNvbnN0IHJzID0gKDAsIGZzXzEuY3JlYXRlUmVhZFN0cmVhbSkobnVsbCwge1xuICAgICAgICAgICAgYXV0b0Nsb3NlOiB0cnVlLFxuICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICAgIGZkLFxuICAgICAgICB9KTtcbiAgICAgICAgcnMuc3RhdCA9IHN0YXQ7XG4gICAgICAgIHJldHVybiBycztcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgbm90Zm91bmRfMS5kZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn07XG5leHBvcnRzLmZpbGUgPSBmaWxlO1xuLy8gcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGBtdGltZWAgb2YgdGhlIDIgc3RhdCBvYmplY3RzIGFyZSBlcXVhbFxuZnVuY3Rpb24gaXNOb3RNb2RpZmllZChwcmV2LCBjdXJyKSB7XG4gICAgcmV0dXJuICtwcmV2Lm10aW1lID09PSArY3Vyci5tdGltZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmZ0cCA9IHZvaWQgMDtcbmNvbnN0IGJhc2ljX2Z0cF8xID0gcmVxdWlyZShcImJhc2ljLWZ0cFwiKTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcInN0cmVhbVwiKTtcbmNvbnN0IHBhdGhfMSA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpO1xuY29uc3Qgbm90Zm91bmRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9ub3Rmb3VuZFwiKSk7XG5jb25zdCBub3Rtb2RpZmllZF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL25vdG1vZGlmaWVkXCIpKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2dldC11cmk6ZnRwJyk7XG4vKipcbiAqIFJldHVybnMgYSBSZWFkYWJsZSBzdHJlYW0gZnJvbSBhbiBcImZ0cDpcIiBVUkkuXG4gKi9cbmNvbnN0IGZ0cCA9IGFzeW5jICh1cmwsIG9wdHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgY2FjaGUgfSA9IG9wdHM7XG4gICAgY29uc3QgZmlsZXBhdGggPSBkZWNvZGVVUklDb21wb25lbnQodXJsLnBhdGhuYW1lKTtcbiAgICBsZXQgbGFzdE1vZGlmaWVkO1xuICAgIGlmICghZmlsZXBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gXCJwYXRobmFtZVwiIScpO1xuICAgIH1cbiAgICBjb25zdCBjbGllbnQgPSBuZXcgYmFzaWNfZnRwXzEuQ2xpZW50KCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaG9zdCA9IHVybC5ob3N0bmFtZSB8fCB1cmwuaG9zdCB8fCAnbG9jYWxob3N0JztcbiAgICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHVybC5wb3J0IHx8ICcwJywgMTApIHx8IDIxO1xuICAgICAgICBjb25zdCB1c2VyID0gdXJsLnVzZXJuYW1lXG4gICAgICAgICAgICA/IGRlY29kZVVSSUNvbXBvbmVudCh1cmwudXNlcm5hbWUpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcGFzc3dvcmQgPSB1cmwucGFzc3dvcmRcbiAgICAgICAgICAgID8gZGVjb2RlVVJJQ29tcG9uZW50KHVybC5wYXNzd29yZClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBhd2FpdCBjbGllbnQuYWNjZXNzKHtcbiAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICBwb3J0LFxuICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGZpcnN0IHdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUgTGFzdCBNb2RpZmllZCBkYXRlLlxuICAgICAgICAvLyB0cnkgdGhlIE1EVE0gY29tbWFuZCBmaXJzdCwgd2hpY2ggaXMgYW4gb3B0aW9uYWwgZXh0ZW5zaW9uIGNvbW1hbmQuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQgPSBhd2FpdCBjbGllbnQubGFzdE1vZChmaWxlcGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBcImZpbGUgbm90IGZvdW5kXCIgZXJyb3IgY29kZVxuICAgICAgICAgICAgaWYgKGVyci5jb2RlID09PSA1NTApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgbm90Zm91bmRfMS5kZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSB2aWEgdGhlIExJU1QgY29tbWFuZCAodXNlc1xuICAgICAgICAgICAgLy8gbW9yZSBiYW5kd2lkdGgsIGJ1dCBpcyBtb3JlIGNvbXBhdGlibGUgd2l0aCBvbGRlciBGVFAgc2VydmVyc1xuICAgICAgICAgICAgY29uc3QgbGlzdCA9IGF3YWl0IGNsaWVudC5saXN0KCgwLCBwYXRoXzEuZGlybmFtZSkoZmlsZXBhdGgpKTtcbiAgICAgICAgICAgIC8vIGF0dGVtcHQgdG8gZmluZCB0aGUgXCJlbnRyeVwiIHdpdGggYSBtYXRjaGluZyBcIm5hbWVcIlxuICAgICAgICAgICAgY29uc3QgbmFtZSA9ICgwLCBwYXRoXzEuYmFzZW5hbWUpKGZpbGVwYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gbGlzdC5maW5kKChlKSA9PiBlLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkID0gZW50cnkubW9kaWZpZWRBdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICBpZiAoaXNOb3RNb2RpZmllZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IG5vdG1vZGlmaWVkXzEuZGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IG5vdGZvdW5kXzEuZGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBzdHJlYW1fMS5QYXNzVGhyb3VnaCgpO1xuICAgICAgICBjb25zdCBycyA9IHN0cmVhbTtcbiAgICAgICAgY2xpZW50LmRvd25sb2FkVG8oc3RyZWFtLCBmaWxlcGF0aCkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBkZWJ1ZyhyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICBjbGllbnQuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJzLmxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDtcbiAgICAgICAgcmV0dXJuIHJzO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNsaWVudC5jbG9zZSgpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIC8vIGNhbGxlZCB3aGVuIGBsYXN0TW9kaWZpZWRgIGlzIHNldCwgYW5kIGEgXCJjYWNoZVwiIHN0cmVhbSB3YXMgcHJvdmlkZWRcbiAgICBmdW5jdGlvbiBpc05vdE1vZGlmaWVkKCkge1xuICAgICAgICBpZiAoY2FjaGU/Lmxhc3RNb2RpZmllZCAmJiBsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIHJldHVybiArY2FjaGUubGFzdE1vZGlmaWVkID09PSArbGFzdE1vZGlmaWVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuZXhwb3J0cy5mdHAgPSBmdHA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mdHAuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBodHRwXzEgPSByZXF1aXJlKFwiaHR0cFwiKTtcbi8qKlxuICogRXJyb3Igc3ViY2xhc3MgdG8gdXNlIHdoZW4gYW4gSFRUUCBhcHBsaWNhdGlvbiBlcnJvciBoYXMgb2NjdXJyZWQuXG4gKi9cbmNsYXNzIEhUVFBFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihzdGF0dXNDb2RlLCBtZXNzYWdlID0gaHR0cF8xLlNUQVRVU19DT0RFU1tzdGF0dXNDb2RlXSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgICAgICAgdGhpcy5jb2RlID0gYEUke1N0cmluZyhtZXNzYWdlKS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJycpfWA7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gSFRUUEVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cC1lcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaHR0cCA9IHZvaWQgMDtcbmNvbnN0IGh0dHBfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiaHR0cFwiKSk7XG5jb25zdCBodHRwc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJodHRwc1wiKSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBodHRwX2Vycm9yXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vaHR0cC1lcnJvclwiKSk7XG5jb25zdCBub3Rmb3VuZF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL25vdGZvdW5kXCIpKTtcbmNvbnN0IG5vdG1vZGlmaWVkXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbm90bW9kaWZpZWRcIikpO1xuY29uc3QgZGVidWcgPSAoMCwgZGVidWdfMS5kZWZhdWx0KSgnZ2V0LXVyaTpodHRwJyk7XG4vKipcbiAqIFJldHVybnMgYSBSZWFkYWJsZSBzdHJlYW0gZnJvbSBhbiBcImh0dHA6XCIgVVJJLlxuICovXG5jb25zdCBodHRwID0gYXN5bmMgKHVybCwgb3B0cyA9IHt9KSA9PiB7XG4gICAgZGVidWcoJ0dFVCAlbycsIHVybC5ocmVmKTtcbiAgICBjb25zdCBjYWNoZSA9IGdldENhY2hlKHVybCwgb3B0cy5jYWNoZSk7XG4gICAgLy8gZmlyc3QgY2hlY2sgdGhlIHByZXZpb3VzIEV4cGlyZXMgYW5kL29yIENhY2hlLUNvbnRyb2wgaGVhZGVyc1xuICAgIC8vIG9mIGEgcHJldmlvdXMgcmVzcG9uc2UgaWYgYSBgY2FjaGVgIHdhcyBwcm92aWRlZFxuICAgIGlmIChjYWNoZSAmJiBpc0ZyZXNoKGNhY2hlKSAmJiB0eXBlb2YgY2FjaGUuc3RhdHVzQ29kZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gY2hlY2sgZm9yIGEgM3h4IFwicmVkaXJlY3RcIiBzdGF0dXMgY29kZSBvbiB0aGUgcHJldmlvdXMgY2FjaGVcbiAgICAgICAgY29uc3QgdHlwZSA9IChjYWNoZS5zdGF0dXNDb2RlIC8gMTAwKSB8IDA7XG4gICAgICAgIGlmICh0eXBlID09PSAzICYmIGNhY2hlLmhlYWRlcnMubG9jYXRpb24pIHtcbiAgICAgICAgICAgIGRlYnVnKCdjYWNoZWQgcmVkaXJlY3QnKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVE9ETzogaW1wbGVtZW50IGNhY2hlZCByZWRpcmVjdHMhJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGRlc3RpbmF0aW9uIGVuZHBvaW50LFxuICAgICAgICAvLyBzaW5jZSB0aGVyZSdzIG5vd2hlcmUgZWxzZSB0byByZWRpcmVjdCB0b1xuICAgICAgICB0aHJvdyBuZXcgbm90bW9kaWZpZWRfMS5kZWZhdWx0KCk7XG4gICAgfVxuICAgIC8vIDUgcmVkaXJlY3RzIGFsbG93ZWQgYnkgZGVmYXVsdFxuICAgIGNvbnN0IG1heFJlZGlyZWN0cyA9IHR5cGVvZiBvcHRzLm1heFJlZGlyZWN0cyA9PT0gJ251bWJlcicgPyBvcHRzLm1heFJlZGlyZWN0cyA6IDU7XG4gICAgZGVidWcoJ2FsbG93aW5nICVvIG1heCByZWRpcmVjdHMnLCBtYXhSZWRpcmVjdHMpO1xuICAgIGxldCBtb2Q7XG4gICAgaWYgKG9wdHMuaHR0cCkge1xuICAgICAgICAvLyB0aGUgYGh0dHBzYCBtb2R1bGUgcGFzc2VkIGluIGZyb20gdGhlIFwiaHR0cC5qc1wiIGZpbGVcbiAgICAgICAgbW9kID0gb3B0cy5odHRwO1xuICAgICAgICBkZWJ1ZygndXNpbmcgc2VjdXJlIGBodHRwc2AgY29yZSBtb2R1bGUnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG1vZCA9IGh0dHBfMS5kZWZhdWx0O1xuICAgICAgICBkZWJ1ZygndXNpbmcgYGh0dHBgIGNvcmUgbW9kdWxlJyk7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLm9wdHMgfTtcbiAgICAvLyBhZGQgXCJjYWNoZSB2YWxpZGF0aW9uXCIgaGVhZGVycyBpZiBhIGBjYWNoZWAgd2FzIHByb3ZpZGVkXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXN0TW9kaWZpZWQgPSBjYWNoZS5oZWFkZXJzWydsYXN0LW1vZGlmaWVkJ107XG4gICAgICAgIGlmIChsYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1snSWYtTW9kaWZpZWQtU2luY2UnXSA9IGxhc3RNb2RpZmllZDtcbiAgICAgICAgICAgIGRlYnVnKCdhZGRlZCBcIklmLU1vZGlmaWVkLVNpbmNlXCIgcmVxdWVzdCBoZWFkZXI6ICVvJywgbGFzdE1vZGlmaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldGFnID0gY2FjaGUuaGVhZGVycy5ldGFnO1xuICAgICAgICBpZiAoZXRhZykge1xuICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydJZi1Ob25lLU1hdGNoJ10gPSBldGFnO1xuICAgICAgICAgICAgZGVidWcoJ2FkZGVkIFwiSWYtTm9uZS1NYXRjaFwiIHJlcXVlc3QgaGVhZGVyOiAlbycsIGV0YWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcSA9IG1vZC5nZXQodXJsLCBvcHRpb25zKTtcbiAgICBjb25zdCBbcmVzXSA9IGF3YWl0ICgwLCBldmVudHNfMS5vbmNlKShyZXEsICdyZXNwb25zZScpO1xuICAgIGNvbnN0IGNvZGUgPSByZXMuc3RhdHVzQ29kZSB8fCAwO1xuICAgIC8vIGFzc2lnbiBhIERhdGUgdG8gdGhpcyByZXNwb25zZSBmb3IgdGhlIFwiQ2FjaGUtQ29udHJvbFwiIGRlbHRhIGNhbGN1bGF0aW9uXG4gICAgcmVzLmRhdGUgPSBEYXRlLm5vdygpO1xuICAgIHJlcy5wYXJzZWQgPSB1cmw7XG4gICAgZGVidWcoJ2dvdCAlbyByZXNwb25zZSBzdGF0dXMgY29kZScsIGNvZGUpO1xuICAgIC8vIGFueSAyeHggcmVzcG9uc2UgaXMgYSBcInN1Y2Nlc3NcIiBjb2RlXG4gICAgY29uc3QgdHlwZSA9IChjb2RlIC8gMTAwKSB8IDA7XG4gICAgLy8gY2hlY2sgZm9yIGEgM3h4IFwicmVkaXJlY3RcIiBzdGF0dXMgY29kZVxuICAgIGNvbnN0IGxvY2F0aW9uID0gcmVzLmhlYWRlcnMubG9jYXRpb247XG4gICAgaWYgKHR5cGUgPT09IDMgJiYgbG9jYXRpb24pIHtcbiAgICAgICAgaWYgKCFvcHRzLnJlZGlyZWN0cylcbiAgICAgICAgICAgIG9wdHMucmVkaXJlY3RzID0gW107XG4gICAgICAgIGNvbnN0IHJlZGlyZWN0cyA9IG9wdHMucmVkaXJlY3RzO1xuICAgICAgICBpZiAocmVkaXJlY3RzLmxlbmd0aCA8IG1heFJlZGlyZWN0cykge1xuICAgICAgICAgICAgZGVidWcoJ2dvdCBhIFwicmVkaXJlY3RcIiBzdGF0dXMgY29kZSB3aXRoIExvY2F0aW9uOiAlbycsIGxvY2F0aW9uKTtcbiAgICAgICAgICAgIC8vIGZsdXNoIHRoaXMgcmVzcG9uc2UgLSB3ZSdyZSBub3QgZ29pbmcgdG8gdXNlIGl0XG4gICAgICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgICAgICAvLyBoYW5nIG9uIHRvIHRoaXMgUmVzcG9uc2Ugb2JqZWN0IGZvciB0aGUgXCJyZWRpcmVjdHNcIiBBcnJheVxuICAgICAgICAgICAgcmVkaXJlY3RzLnB1c2gocmVzKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1VyaSA9IG5ldyBVUkwobG9jYXRpb24sIHVybC5ocmVmKTtcbiAgICAgICAgICAgIGRlYnVnKCdyZXNvbHZlZCByZWRpcmVjdCBVUkw6ICVvJywgbmV3VXJpLmhyZWYpO1xuICAgICAgICAgICAgY29uc3QgbGVmdCA9IG1heFJlZGlyZWN0cyAtIHJlZGlyZWN0cy5sZW5ndGg7XG4gICAgICAgICAgICBkZWJ1ZygnJW8gbW9yZSByZWRpcmVjdHMgYWxsb3dlZCBhZnRlciB0aGlzIG9uZScsIGxlZnQpO1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgcmVkaXJlY3RpbmcgdG8gYSBkaWZmZXJlbnQgcHJvdG9jb2xcbiAgICAgICAgICAgIGlmIChuZXdVcmkucHJvdG9jb2wgIT09IHVybC5wcm90b2NvbCkge1xuICAgICAgICAgICAgICAgIG9wdHMuaHR0cCA9IG5ld1VyaS5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyBodHRwc18xLmRlZmF1bHQgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKDAsIGV4cG9ydHMuaHR0cCkobmV3VXJpLCBvcHRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBpZiB3ZSBkaWRuJ3QgZ2V0IGEgMnh4IFwic3VjY2Vzc1wiIHN0YXR1cyBjb2RlLCB0aGVuIGNyZWF0ZSBhbiBFcnJvciBvYmplY3RcbiAgICBpZiAodHlwZSAhPT0gMikge1xuICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgIGlmIChjb2RlID09PSAzMDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBub3Rtb2RpZmllZF8xLmRlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb2RlID09PSA0MDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBub3Rmb3VuZF8xLmRlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBvdGhlciBIVFRQLWxldmVsIGVycm9yXG4gICAgICAgIHRocm93IG5ldyBodHRwX2Vycm9yXzEuZGVmYXVsdChjb2RlKTtcbiAgICB9XG4gICAgaWYgKG9wdHMucmVkaXJlY3RzKSB7XG4gICAgICAgIC8vIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSBcInJlZGlyZWN0c1wiIEFycmF5IG9uIHRoZSBSZXNwb25zZSBvYmplY3Qgc28gdGhhdFxuICAgICAgICAvLyB0aGV5IGNhbiBiZSBpbnNwZWN0ZWQgZHVyaW5nIGEgc3Vic2VxdWVudCBjYWxsIHRvIEdFVCB0aGUgc2FtZSBVUklcbiAgICAgICAgcmVzLnJlZGlyZWN0cyA9IG9wdHMucmVkaXJlY3RzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufTtcbmV4cG9ydHMuaHR0cCA9IGh0dHA7XG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm92aWRlZCBjYWNoZSdzIFwiZnJlc2huZXNzXCIgaXMgdmFsaWQuIFRoYXQgaXMsIGVpdGhlclxuICogdGhlIENhY2hlLUNvbnRyb2wgaGVhZGVyIG9yIEV4cGlyZXMgaGVhZGVyIHZhbHVlcyBhcmUgc3RpbGwgd2l0aGluIHRoZSBhbGxvd2VkXG4gKiB0aW1lIHBlcmlvZC5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzRnJlc2goY2FjaGUpIHtcbiAgICBsZXQgZnJlc2ggPSBmYWxzZTtcbiAgICBsZXQgZXhwaXJlcyA9IHBhcnNlSW50KGNhY2hlLmhlYWRlcnMuZXhwaXJlcyB8fCAnJywgMTApO1xuICAgIGNvbnN0IGNhY2hlQ29udHJvbCA9IGNhY2hlLmhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXTtcbiAgICBpZiAoY2FjaGVDb250cm9sKSB7XG4gICAgICAgIC8vIGZvciBDYWNoZS1Db250cm9sIHJ1bGVzLCBzZWU6IGh0dHA6Ly93d3cubW5vdC5uZXQvY2FjaGVfZG9jcy8jQ0FDSEUtQ09OVFJPTFxuICAgICAgICBkZWJ1ZygnQ2FjaGUtQ29udHJvbDogJW8nLCBjYWNoZUNvbnRyb2wpO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IGNhY2hlQ29udHJvbC5zcGxpdCgvLFxccyo/XFxiLyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHN1YnBhcnRzID0gcGFydC5zcGxpdCgnPScpO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHN1YnBhcnRzWzBdO1xuICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWF4LWFnZSc6XG4gICAgICAgICAgICAgICAgICAgIGV4cGlyZXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgKGNhY2hlLmRhdGUgfHwgMCkgKyBwYXJzZUludChzdWJwYXJ0c1sxXSwgMTApICogMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgZnJlc2ggPSBEYXRlLm5vdygpIDwgZXhwaXJlcztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZygnY2FjaGUgaXMgXCJmcmVzaFwiIGR1ZSB0byBwcmV2aW91cyAlbyBDYWNoZS1Db250cm9sIHBhcmFtJywgcGFydCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyZXNoO1xuICAgICAgICAgICAgICAgIGNhc2UgJ211c3QtcmV2YWxpZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIC8vIFhYWDogd2hhdCB3ZSBzdXBwb3NlZCB0byBkbyBoZXJlP1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICduby1jYWNoZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnbm8tc3RvcmUnOlxuICAgICAgICAgICAgICAgICAgICBkZWJ1ZygnY2FjaGUgaXMgXCJzdGFsZVwiIGR1ZSB0byBleHBsaWNpdCAlbyBDYWNoZS1Db250cm9sIHBhcmFtJywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdW5rbm93biBjYWNoZSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChleHBpcmVzKSB7XG4gICAgICAgIC8vIGZvciBFeHBpcmVzIHJ1bGVzLCBzZWU6IGh0dHA6Ly93d3cubW5vdC5uZXQvY2FjaGVfZG9jcy8jRVhQSVJFU1xuICAgICAgICBkZWJ1ZygnRXhwaXJlczogJW8nLCBleHBpcmVzKTtcbiAgICAgICAgZnJlc2ggPSBEYXRlLm5vdygpIDwgZXhwaXJlcztcbiAgICAgICAgaWYgKGZyZXNoKSB7XG4gICAgICAgICAgICBkZWJ1ZygnY2FjaGUgaXMgXCJmcmVzaFwiIGR1ZSB0byBwcmV2aW91cyBFeHBpcmVzIHJlc3BvbnNlIGhlYWRlcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcmVzaDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBBdHRlbXB0cyB0byByZXR1cm4gYSBwcmV2aW91cyBSZXNwb25zZSBvYmplY3QgZnJvbSBhIHByZXZpb3VzIEdFVCBjYWxsIHRvIHRoZVxuICogc2FtZSBVUkkuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldENhY2hlKHVybCwgY2FjaGUpIHtcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgaWYgKGNhY2hlLnBhcnNlZCAmJiBjYWNoZS5wYXJzZWQuaHJlZiA9PT0gdXJsLmhyZWYpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FjaGUucmVkaXJlY3RzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlLnJlZGlyZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBnZXRDYWNoZSh1cmwsIGNhY2hlLnJlZGlyZWN0c1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaHR0cHMgPSB2b2lkIDA7XG5jb25zdCBodHRwc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJodHRwc1wiKSk7XG5jb25zdCBodHRwXzEgPSByZXF1aXJlKFwiLi9odHRwXCIpO1xuLyoqXG4gKiBSZXR1cm5zIGEgUmVhZGFibGUgc3RyZWFtIGZyb20gYW4gXCJodHRwczpcIiBVUkkuXG4gKi9cbmNvbnN0IGh0dHBzID0gKHVybCwgb3B0cykgPT4ge1xuICAgIHJldHVybiAoMCwgaHR0cF8xLmh0dHApKHVybCwgeyAuLi5vcHRzLCBodHRwOiBodHRwc18xLmRlZmF1bHQgfSk7XG59O1xuZXhwb3J0cy5odHRwcyA9IGh0dHBzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldFVyaSA9IGV4cG9ydHMuaXNWYWxpZFByb3RvY29sID0gZXhwb3J0cy5wcm90b2NvbHMgPSB2b2lkIDA7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG4vLyBCdWlsdC1pbiBwcm90b2NvbHNcbmNvbnN0IGRhdGFfMSA9IHJlcXVpcmUoXCIuL2RhdGFcIik7XG5jb25zdCBmaWxlXzEgPSByZXF1aXJlKFwiLi9maWxlXCIpO1xuY29uc3QgZnRwXzEgPSByZXF1aXJlKFwiLi9mdHBcIik7XG5jb25zdCBodHRwXzEgPSByZXF1aXJlKFwiLi9odHRwXCIpO1xuY29uc3QgaHR0cHNfMSA9IHJlcXVpcmUoXCIuL2h0dHBzXCIpO1xuY29uc3QgZGVidWcgPSAoMCwgZGVidWdfMS5kZWZhdWx0KSgnZ2V0LXVyaScpO1xuZXhwb3J0cy5wcm90b2NvbHMgPSB7XG4gICAgZGF0YTogZGF0YV8xLmRhdGEsXG4gICAgZmlsZTogZmlsZV8xLmZpbGUsXG4gICAgZnRwOiBmdHBfMS5mdHAsXG4gICAgaHR0cDogaHR0cF8xLmh0dHAsXG4gICAgaHR0cHM6IGh0dHBzXzEuaHR0cHMsXG59O1xuY29uc3QgVkFMSURfUFJPVE9DT0xTID0gbmV3IFNldChPYmplY3Qua2V5cyhleHBvcnRzLnByb3RvY29scykpO1xuZnVuY3Rpb24gaXNWYWxpZFByb3RvY29sKHApIHtcbiAgICByZXR1cm4gVkFMSURfUFJPVE9DT0xTLmhhcyhwKTtcbn1cbmV4cG9ydHMuaXNWYWxpZFByb3RvY29sID0gaXNWYWxpZFByb3RvY29sO1xuLyoqXG4gKiBBc3luYyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBgc3RyZWFtLlJlYWRhYmxlYCBpbnN0YW5jZSB0aGF0IHdpbGwgb3V0cHV0XG4gKiB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIFVSSS5cbiAqXG4gKiBGb3IgY2FjaGluZyBwdXJwb3NlcywgeW91IGNhbiBwYXNzIGluIGEgYHN0cmVhbWAgaW5zdGFuY2UgZnJvbSBhIHByZXZpb3VzXG4gKiBgZ2V0VXJpKClgIGNhbGwgYXMgYSBgY2FjaGU6IHN0cmVhbWAgb3B0aW9uLCBhbmQgaWYgdGhlIGRlc3RpbmF0aW9uIGhhc1xuICogbm90IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZW5kcG9pbnQgd2FzIHJldHJlaXZlZCB0aGVuIHRoZSBjYWxsYmFja1xuICogd2lsbCBiZSBpbnZva2VkIHdpdGggYW4gRXJyb3Igb2JqZWN0IHdpdGggYGNvZGVgIHNldCB0byBcIkVOT1RNT0RJRklFRFwiIGFuZFxuICogYG51bGxgIGZvciB0aGUgXCJzdHJlYW1cIiBpbnN0YW5jZSBhcmd1bWVudC4gSW4gdGhpcyBjYXNlLCB5b3UgY2FuIHNraXBcbiAqIHJldHJlaXZpbmcgdGhlIGZpbGUgYWdhaW4gYW5kIGNvbnRpbnVlIHRvIHVzZSB0aGUgcHJldmlvdXMgcGF5bG9hZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJpIFVSSSB0byByZXRyaWV2ZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgb3B0aW9uYWwgXCJvcHRpb25zXCIgb2JqZWN0XG4gKiBAYXBpIHB1YmxpY1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXRVcmkodXJpLCBvcHRzKSB7XG4gICAgZGVidWcoJ2dldFVyaSglbyknLCB1cmkpO1xuICAgIGlmICghdXJpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ011c3QgcGFzcyBpbiBhIFVSSSB0byBcImdldFVyaSgpXCInKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdHlwZW9mIHVyaSA9PT0gJ3N0cmluZycgPyBuZXcgVVJMKHVyaSkgOiB1cmk7XG4gICAgLy8gU3RyaXAgdHJhaWxpbmcgYDpgXG4gICAgY29uc3QgcHJvdG9jb2wgPSB1cmwucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJyk7XG4gICAgaWYgKCFpc1ZhbGlkUHJvdG9jb2wocHJvdG9jb2wpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHByb3RvY29sIFwiJHtwcm90b2NvbH1cIiBzcGVjaWZpZWQgaW4gVVJJOiBcIiR7dXJpfVwiYCk7XG4gICAgfVxuICAgIGNvbnN0IGdldHRlciA9IGV4cG9ydHMucHJvdG9jb2xzW3Byb3RvY29sXTtcbiAgICByZXR1cm4gZ2V0dGVyKHVybCwgb3B0cyk7XG59XG5leHBvcnRzLmdldFVyaSA9IGdldFVyaTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBFcnJvciBzdWJjbGFzcyB0byB1c2Ugd2hlbiB0aGUgc291cmNlIGRvZXMgbm90IGV4aXN0IGF0IHRoZSBzcGVjaWZpZWQgZW5kcG9pbnQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2Ugb3B0aW9uYWwgXCJtZXNzYWdlXCIgcHJvcGVydHkgdG8gc2V0XG4gKiBAYXBpIHByb3RlY3RlZFxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jbGFzcyBOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSB8fCAnRmlsZSBkb2VzIG5vdCBleGlzdCBhdCB0aGUgc3BlY2lmaWVkIGVuZHBvaW50Jyk7XG4gICAgICAgIHRoaXMuY29kZSA9ICdFTk9URk9VTkQnO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IE5vdEZvdW5kRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub3Rmb3VuZC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICogRXJyb3Igc3ViY2xhc3MgdG8gdXNlIHdoZW4gdGhlIHNvdXJjZSBoYXMgbm90IGJlZW4gbW9kaWZpZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2Ugb3B0aW9uYWwgXCJtZXNzYWdlXCIgcHJvcGVydHkgdG8gc2V0XG4gKiBAYXBpIHByb3RlY3RlZFxuICovXG5jbGFzcyBOb3RNb2RpZmllZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSB8fFxuICAgICAgICAgICAgJ1NvdXJjZSBoYXMgbm90IGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIHByb3ZpZWQgXCJjYWNoZVwiLCByZS11c2UgcHJldmlvdXMgcmVzdWx0cycpO1xuICAgICAgICB0aGlzLmNvZGUgPSAnRU5PVE1PRElGSUVEJztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOb3RNb2RpZmllZEVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm90bW9kaWZpZWQuanMubWFwIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVcblxudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iai5fX3Byb3RvX19cbn1cblxuZnVuY3Rpb24gY2xvbmUgKG9iaikge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKVxuICAgIHJldHVybiBvYmpcblxuICBpZiAob2JqIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgIHZhciBjb3B5ID0geyBfX3Byb3RvX186IGdldFByb3RvdHlwZU9mKG9iaikgfVxuICBlbHNlXG4gICAgdmFyIGNvcHkgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29weSwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSlcbiAgfSlcblxuICByZXR1cm4gY29weVxufVxuIiwidmFyIGZzID0gcmVxdWlyZSgnZnMnKVxudmFyIHBvbHlmaWxscyA9IHJlcXVpcmUoJy4vcG9seWZpbGxzLmpzJylcbnZhciBsZWdhY3kgPSByZXF1aXJlKCcuL2xlZ2FjeS1zdHJlYW1zLmpzJylcbnZhciBjbG9uZSA9IHJlcXVpcmUoJy4vY2xvbmUuanMnKVxuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIG5vZGUgMC54IHBvbHlmaWxsICovXG52YXIgZ3JhY2VmdWxRdWV1ZVxudmFyIHByZXZpb3VzU3ltYm9sXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlIC0gbm9kZSAwLnggcG9seWZpbGwgKi9cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBTeW1ib2wuZm9yID09PSAnZnVuY3Rpb24nKSB7XG4gIGdyYWNlZnVsUXVldWUgPSBTeW1ib2wuZm9yKCdncmFjZWZ1bC1mcy5xdWV1ZScpXG4gIC8vIFRoaXMgaXMgdXNlZCBpbiB0ZXN0aW5nIGJ5IGZ1dHVyZSB2ZXJzaW9uc1xuICBwcmV2aW91c1N5bWJvbCA9IFN5bWJvbC5mb3IoJ2dyYWNlZnVsLWZzLnByZXZpb3VzJylcbn0gZWxzZSB7XG4gIGdyYWNlZnVsUXVldWUgPSAnX19fZ3JhY2VmdWwtZnMucXVldWUnXG4gIHByZXZpb3VzU3ltYm9sID0gJ19fX2dyYWNlZnVsLWZzLnByZXZpb3VzJ1xufVxuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIHB1Ymxpc2hRdWV1ZShjb250ZXh0LCBxdWV1ZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udGV4dCwgZ3JhY2VmdWxRdWV1ZSwge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcXVldWVcbiAgICB9XG4gIH0pXG59XG5cbnZhciBkZWJ1ZyA9IG5vb3BcbmlmICh1dGlsLmRlYnVnbG9nKVxuICBkZWJ1ZyA9IHV0aWwuZGVidWdsb2coJ2dmczQnKVxuZWxzZSBpZiAoL1xcYmdmczRcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJycpKVxuICBkZWJ1ZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBtID0gdXRpbC5mb3JtYXQuYXBwbHkodXRpbCwgYXJndW1lbnRzKVxuICAgIG0gPSAnR0ZTNDogJyArIG0uc3BsaXQoL1xcbi8pLmpvaW4oJ1xcbkdGUzQ6ICcpXG4gICAgY29uc29sZS5lcnJvcihtKVxuICB9XG5cbi8vIE9uY2UgdGltZSBpbml0aWFsaXphdGlvblxuaWYgKCFmc1tncmFjZWZ1bFF1ZXVlXSkge1xuICAvLyBUaGlzIHF1ZXVlIGNhbiBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgbG9hZGVkIGluc3RhbmNlc1xuICB2YXIgcXVldWUgPSBnbG9iYWxbZ3JhY2VmdWxRdWV1ZV0gfHwgW11cbiAgcHVibGlzaFF1ZXVlKGZzLCBxdWV1ZSlcblxuICAvLyBQYXRjaCBmcy5jbG9zZS9jbG9zZVN5bmMgdG8gc2hhcmVkIHF1ZXVlIHZlcnNpb24sIGJlY2F1c2Ugd2UgbmVlZFxuICAvLyB0byByZXRyeSgpIHdoZW5ldmVyIGEgY2xvc2UgaGFwcGVucyAqYW55d2hlcmUqIGluIHRoZSBwcm9ncmFtLlxuICAvLyBUaGlzIGlzIGVzc2VudGlhbCB3aGVuIG11bHRpcGxlIGdyYWNlZnVsLWZzIGluc3RhbmNlcyBhcmVcbiAgLy8gaW4gcGxheSBhdCB0aGUgc2FtZSB0aW1lLlxuICBmcy5jbG9zZSA9IChmdW5jdGlvbiAoZnMkY2xvc2UpIHtcbiAgICBmdW5jdGlvbiBjbG9zZSAoZmQsIGNiKSB7XG4gICAgICByZXR1cm4gZnMkY2xvc2UuY2FsbChmcywgZmQsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBncmFjZWZ1bC1mcyBzaGFyZWQgcXVldWVcbiAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICByZXNldFF1ZXVlKClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xvc2UsIHByZXZpb3VzU3ltYm9sLCB7XG4gICAgICB2YWx1ZTogZnMkY2xvc2VcbiAgICB9KVxuICAgIHJldHVybiBjbG9zZVxuICB9KShmcy5jbG9zZSlcblxuICBmcy5jbG9zZVN5bmMgPSAoZnVuY3Rpb24gKGZzJGNsb3NlU3luYykge1xuICAgIGZ1bmN0aW9uIGNsb3NlU3luYyAoZmQpIHtcbiAgICAgIC8vIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZ3JhY2VmdWwtZnMgc2hhcmVkIHF1ZXVlXG4gICAgICBmcyRjbG9zZVN5bmMuYXBwbHkoZnMsIGFyZ3VtZW50cylcbiAgICAgIHJlc2V0UXVldWUoKVxuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbG9zZVN5bmMsIHByZXZpb3VzU3ltYm9sLCB7XG4gICAgICB2YWx1ZTogZnMkY2xvc2VTeW5jXG4gICAgfSlcbiAgICByZXR1cm4gY2xvc2VTeW5jXG4gIH0pKGZzLmNsb3NlU3luYylcblxuICBpZiAoL1xcYmdmczRcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJycpKSB7XG4gICAgcHJvY2Vzcy5vbignZXhpdCcsIGZ1bmN0aW9uKCkge1xuICAgICAgZGVidWcoZnNbZ3JhY2VmdWxRdWV1ZV0pXG4gICAgICByZXF1aXJlKCdhc3NlcnQnKS5lcXVhbChmc1tncmFjZWZ1bFF1ZXVlXS5sZW5ndGgsIDApXG4gICAgfSlcbiAgfVxufVxuXG5pZiAoIWdsb2JhbFtncmFjZWZ1bFF1ZXVlXSkge1xuICBwdWJsaXNoUXVldWUoZ2xvYmFsLCBmc1tncmFjZWZ1bFF1ZXVlXSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2goY2xvbmUoZnMpKVxuaWYgKHByb2Nlc3MuZW52LlRFU1RfR1JBQ0VGVUxfRlNfR0xPQkFMX1BBVENIICYmICFmcy5fX3BhdGNoZWQpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHBhdGNoKGZzKVxuICAgIGZzLl9fcGF0Y2hlZCA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHBhdGNoIChmcykge1xuICAvLyBFdmVyeXRoaW5nIHRoYXQgcmVmZXJlbmNlcyB0aGUgb3BlbigpIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGluIGhlcmVcbiAgcG9seWZpbGxzKGZzKVxuICBmcy5ncmFjZWZ1bGlmeSA9IHBhdGNoXG5cbiAgZnMuY3JlYXRlUmVhZFN0cmVhbSA9IGNyZWF0ZVJlYWRTdHJlYW1cbiAgZnMuY3JlYXRlV3JpdGVTdHJlYW0gPSBjcmVhdGVXcml0ZVN0cmVhbVxuICB2YXIgZnMkcmVhZEZpbGUgPSBmcy5yZWFkRmlsZVxuICBmcy5yZWFkRmlsZSA9IHJlYWRGaWxlXG4gIGZ1bmN0aW9uIHJlYWRGaWxlIChwYXRoLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IG51bGxcblxuICAgIHJldHVybiBnbyRyZWFkRmlsZShwYXRoLCBvcHRpb25zLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJHJlYWRGaWxlIChwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkcmVhZEZpbGUocGF0aCwgb3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyRyZWFkRmlsZSwgW3BhdGgsIG9wdGlvbnMsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmFyIGZzJHdyaXRlRmlsZSA9IGZzLndyaXRlRmlsZVxuICBmcy53cml0ZUZpbGUgPSB3cml0ZUZpbGVcbiAgZnVuY3Rpb24gd3JpdGVGaWxlIChwYXRoLCBkYXRhLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IG51bGxcblxuICAgIHJldHVybiBnbyR3cml0ZUZpbGUocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyR3cml0ZUZpbGUgKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyR3cml0ZUZpbGUocGF0aCwgZGF0YSwgb3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyR3cml0ZUZpbGUsIFtwYXRoLCBkYXRhLCBvcHRpb25zLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHZhciBmcyRhcHBlbmRGaWxlID0gZnMuYXBwZW5kRmlsZVxuICBpZiAoZnMkYXBwZW5kRmlsZSlcbiAgICBmcy5hcHBlbmRGaWxlID0gYXBwZW5kRmlsZVxuICBmdW5jdGlvbiBhcHBlbmRGaWxlIChwYXRoLCBkYXRhLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IG51bGxcblxuICAgIHJldHVybiBnbyRhcHBlbmRGaWxlKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kYXBwZW5kRmlsZSAocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJGFwcGVuZEZpbGUocGF0aCwgZGF0YSwgb3B0aW9ucywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyRhcHBlbmRGaWxlLCBbcGF0aCwgZGF0YSwgb3B0aW9ucywgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgZnMkY29weUZpbGUgPSBmcy5jb3B5RmlsZVxuICBpZiAoZnMkY29weUZpbGUpXG4gICAgZnMuY29weUZpbGUgPSBjb3B5RmlsZVxuICBmdW5jdGlvbiBjb3B5RmlsZSAoc3JjLCBkZXN0LCBmbGFncywgY2IpIHtcbiAgICBpZiAodHlwZW9mIGZsYWdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IGZsYWdzXG4gICAgICBmbGFncyA9IDBcbiAgICB9XG4gICAgcmV0dXJuIGdvJGNvcHlGaWxlKHNyYywgZGVzdCwgZmxhZ3MsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kY29weUZpbGUgKHNyYywgZGVzdCwgZmxhZ3MsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyRjb3B5RmlsZShzcmMsIGRlc3QsIGZsYWdzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJGNvcHlGaWxlLCBbc3JjLCBkZXN0LCBmbGFncywgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgZnMkcmVhZGRpciA9IGZzLnJlYWRkaXJcbiAgZnMucmVhZGRpciA9IHJlYWRkaXJcbiAgdmFyIG5vUmVhZGRpck9wdGlvblZlcnNpb25zID0gL152WzAtNV1cXC4vXG4gIGZ1bmN0aW9uIHJlYWRkaXIgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBvcHRpb25zLCBvcHRpb25zID0gbnVsbFxuXG4gICAgdmFyIGdvJHJlYWRkaXIgPSBub1JlYWRkaXJPcHRpb25WZXJzaW9ucy50ZXN0KHByb2Nlc3MudmVyc2lvbilcbiAgICAgID8gZnVuY3Rpb24gZ28kcmVhZGRpciAocGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgICByZXR1cm4gZnMkcmVhZGRpcihwYXRoLCBmcyRyZWFkZGlyQ2FsbGJhY2soXG4gICAgICAgICAgcGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZVxuICAgICAgICApKVxuICAgICAgfVxuICAgICAgOiBmdW5jdGlvbiBnbyRyZWFkZGlyIChwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICAgIHJldHVybiBmcyRyZWFkZGlyKHBhdGgsIG9wdGlvbnMsIGZzJHJlYWRkaXJDYWxsYmFjayhcbiAgICAgICAgICBwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lXG4gICAgICAgICkpXG4gICAgICB9XG5cbiAgICByZXR1cm4gZ28kcmVhZGRpcihwYXRoLCBvcHRpb25zLCBjYilcblxuICAgIGZ1bmN0aW9uIGZzJHJlYWRkaXJDYWxsYmFjayAocGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlcnIsIGZpbGVzKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW1xuICAgICAgICAgICAgZ28kcmVhZGRpcixcbiAgICAgICAgICAgIFtwYXRoLCBvcHRpb25zLCBjYl0sXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIERhdGUubm93KClcbiAgICAgICAgICBdKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoZmlsZXMgJiYgZmlsZXMuc29ydClcbiAgICAgICAgICAgIGZpbGVzLnNvcnQoKVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmNhbGwodGhpcywgZXJyLCBmaWxlcylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLnZlcnNpb24uc3Vic3RyKDAsIDQpID09PSAndjAuOCcpIHtcbiAgICB2YXIgbGVnU3RyZWFtcyA9IGxlZ2FjeShmcylcbiAgICBSZWFkU3RyZWFtID0gbGVnU3RyZWFtcy5SZWFkU3RyZWFtXG4gICAgV3JpdGVTdHJlYW0gPSBsZWdTdHJlYW1zLldyaXRlU3RyZWFtXG4gIH1cblxuICB2YXIgZnMkUmVhZFN0cmVhbSA9IGZzLlJlYWRTdHJlYW1cbiAgaWYgKGZzJFJlYWRTdHJlYW0pIHtcbiAgICBSZWFkU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZnMkUmVhZFN0cmVhbS5wcm90b3R5cGUpXG4gICAgUmVhZFN0cmVhbS5wcm90b3R5cGUub3BlbiA9IFJlYWRTdHJlYW0kb3BlblxuICB9XG5cbiAgdmFyIGZzJFdyaXRlU3RyZWFtID0gZnMuV3JpdGVTdHJlYW1cbiAgaWYgKGZzJFdyaXRlU3RyZWFtKSB7XG4gICAgV3JpdGVTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShmcyRXcml0ZVN0cmVhbS5wcm90b3R5cGUpXG4gICAgV3JpdGVTdHJlYW0ucHJvdG90eXBlLm9wZW4gPSBXcml0ZVN0cmVhbSRvcGVuXG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnMsICdSZWFkU3RyZWFtJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFJlYWRTdHJlYW1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgUmVhZFN0cmVhbSA9IHZhbFxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCAnV3JpdGVTdHJlYW0nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gV3JpdGVTdHJlYW1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgV3JpdGVTdHJlYW0gPSB2YWxcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG5cbiAgLy8gbGVnYWN5IG5hbWVzXG4gIHZhciBGaWxlUmVhZFN0cmVhbSA9IFJlYWRTdHJlYW1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCAnRmlsZVJlYWRTdHJlYW0nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gRmlsZVJlYWRTdHJlYW1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgRmlsZVJlYWRTdHJlYW0gPSB2YWxcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG4gIHZhciBGaWxlV3JpdGVTdHJlYW0gPSBXcml0ZVN0cmVhbVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnMsICdGaWxlV3JpdGVTdHJlYW0nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gRmlsZVdyaXRlU3RyZWFtXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIEZpbGVXcml0ZVN0cmVhbSA9IHZhbFxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcblxuICBmdW5jdGlvbiBSZWFkU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBSZWFkU3RyZWFtKVxuICAgICAgcmV0dXJuIGZzJFJlYWRTdHJlYW0uYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdGhpc1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBSZWFkU3RyZWFtLmFwcGx5KE9iamVjdC5jcmVhdGUoUmVhZFN0cmVhbS5wcm90b3R5cGUpLCBhcmd1bWVudHMpXG4gIH1cblxuICBmdW5jdGlvbiBSZWFkU3RyZWFtJG9wZW4gKCkge1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgIG9wZW4odGhhdC5wYXRoLCB0aGF0LmZsYWdzLCB0aGF0Lm1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGlmICh0aGF0LmF1dG9DbG9zZSlcbiAgICAgICAgICB0aGF0LmRlc3Ryb3koKVxuXG4gICAgICAgIHRoYXQuZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGF0LmZkID0gZmRcbiAgICAgICAgdGhhdC5lbWl0KCdvcGVuJywgZmQpXG4gICAgICAgIHRoYXQucmVhZCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIFdyaXRlU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBXcml0ZVN0cmVhbSlcbiAgICAgIHJldHVybiBmcyRXcml0ZVN0cmVhbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0aGlzXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIFdyaXRlU3RyZWFtLmFwcGx5KE9iamVjdC5jcmVhdGUoV3JpdGVTdHJlYW0ucHJvdG90eXBlKSwgYXJndW1lbnRzKVxuICB9XG5cbiAgZnVuY3Rpb24gV3JpdGVTdHJlYW0kb3BlbiAoKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgb3Blbih0aGF0LnBhdGgsIHRoYXQuZmxhZ3MsIHRoYXQubW9kZSwgZnVuY3Rpb24gKGVyciwgZmQpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgdGhhdC5kZXN0cm95KClcbiAgICAgICAgdGhhdC5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoYXQuZmQgPSBmZFxuICAgICAgICB0aGF0LmVtaXQoJ29wZW4nLCBmZClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVhZFN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgZnMuUmVhZFN0cmVhbShwYXRoLCBvcHRpb25zKVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlV3JpdGVTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IGZzLldyaXRlU3RyZWFtKHBhdGgsIG9wdGlvbnMpXG4gIH1cblxuICB2YXIgZnMkb3BlbiA9IGZzLm9wZW5cbiAgZnMub3BlbiA9IG9wZW5cbiAgZnVuY3Rpb24gb3BlbiAocGF0aCwgZmxhZ3MsIG1vZGUsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBtb2RlID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBtb2RlLCBtb2RlID0gbnVsbFxuXG4gICAgcmV0dXJuIGdvJG9wZW4ocGF0aCwgZmxhZ3MsIG1vZGUsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kb3BlbiAocGF0aCwgZmxhZ3MsIG1vZGUsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyRvcGVuKHBhdGgsIGZsYWdzLCBtb2RlLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyRvcGVuLCBbcGF0aCwgZmxhZ3MsIG1vZGUsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZzXG59XG5cbmZ1bmN0aW9uIGVucXVldWUgKGVsZW0pIHtcbiAgZGVidWcoJ0VOUVVFVUUnLCBlbGVtWzBdLm5hbWUsIGVsZW1bMV0pXG4gIGZzW2dyYWNlZnVsUXVldWVdLnB1c2goZWxlbSlcbiAgcmV0cnkoKVxufVxuXG4vLyBrZWVwIHRyYWNrIG9mIHRoZSB0aW1lb3V0IGJldHdlZW4gcmV0cnkoKSBjYWxsc1xudmFyIHJldHJ5VGltZXJcblxuLy8gcmVzZXQgdGhlIHN0YXJ0VGltZSBhbmQgbGFzdFRpbWUgdG8gbm93XG4vLyB0aGlzIHJlc2V0cyB0aGUgc3RhcnQgb2YgdGhlIDYwIHNlY29uZCBvdmVyYWxsIHRpbWVvdXQgYXMgd2VsbCBhcyB0aGVcbi8vIGRlbGF5IGJldHdlZW4gYXR0ZW1wdHMgc28gdGhhdCB3ZSdsbCByZXRyeSB0aGVzZSBqb2JzIHNvb25lclxuZnVuY3Rpb24gcmVzZXRRdWV1ZSAoKSB7XG4gIHZhciBub3cgPSBEYXRlLm5vdygpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZnNbZ3JhY2VmdWxRdWV1ZV0ubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBlbnRyaWVzIHRoYXQgYXJlIG9ubHkgYSBsZW5ndGggb2YgMiBhcmUgZnJvbSBhbiBvbGRlciB2ZXJzaW9uLCBkb24ndFxuICAgIC8vIGJvdGhlciBtb2RpZnlpbmcgdGhvc2Ugc2luY2UgdGhleSdsbCBiZSByZXRyaWVkIGFueXdheS5cbiAgICBpZiAoZnNbZ3JhY2VmdWxRdWV1ZV1baV0ubGVuZ3RoID4gMikge1xuICAgICAgZnNbZ3JhY2VmdWxRdWV1ZV1baV1bM10gPSBub3cgLy8gc3RhcnRUaW1lXG4gICAgICBmc1tncmFjZWZ1bFF1ZXVlXVtpXVs0XSA9IG5vdyAvLyBsYXN0VGltZVxuICAgIH1cbiAgfVxuICAvLyBjYWxsIHJldHJ5IHRvIG1ha2Ugc3VyZSB3ZSdyZSBhY3RpdmVseSBwcm9jZXNzaW5nIHRoZSBxdWV1ZVxuICByZXRyeSgpXG59XG5cbmZ1bmN0aW9uIHJldHJ5ICgpIHtcbiAgLy8gY2xlYXIgdGhlIHRpbWVyIGFuZCByZW1vdmUgaXQgdG8gaGVscCBwcmV2ZW50IHVuaW50ZW5kZWQgY29uY3VycmVuY3lcbiAgY2xlYXJUaW1lb3V0KHJldHJ5VGltZXIpXG4gIHJldHJ5VGltZXIgPSB1bmRlZmluZWRcblxuICBpZiAoZnNbZ3JhY2VmdWxRdWV1ZV0ubGVuZ3RoID09PSAwKVxuICAgIHJldHVyblxuXG4gIHZhciBlbGVtID0gZnNbZ3JhY2VmdWxRdWV1ZV0uc2hpZnQoKVxuICB2YXIgZm4gPSBlbGVtWzBdXG4gIHZhciBhcmdzID0gZWxlbVsxXVxuICAvLyB0aGVzZSBpdGVtcyBtYXkgYmUgdW5zZXQgaWYgdGhleSB3ZXJlIGFkZGVkIGJ5IGFuIG9sZGVyIGdyYWNlZnVsLWZzXG4gIHZhciBlcnIgPSBlbGVtWzJdXG4gIHZhciBzdGFydFRpbWUgPSBlbGVtWzNdXG4gIHZhciBsYXN0VGltZSA9IGVsZW1bNF1cblxuICAvLyBpZiB3ZSBkb24ndCBoYXZlIGEgc3RhcnRUaW1lIHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgaWYgd2UndmUgd2FpdGVkXG4gIC8vIGxvbmcgZW5vdWdoLCBzbyBnbyBhaGVhZCBhbmQgcmV0cnkgdGhpcyBpdGVtIG5vd1xuICBpZiAoc3RhcnRUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBkZWJ1ZygnUkVUUlknLCBmbi5uYW1lLCBhcmdzKVxuICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpXG4gIH0gZWxzZSBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSA2MDAwMCkge1xuICAgIC8vIGl0J3MgYmVlbiBtb3JlIHRoYW4gNjAgc2Vjb25kcyB0b3RhbCwgYmFpbCBub3dcbiAgICBkZWJ1ZygnVElNRU9VVCcsIGZuLm5hbWUsIGFyZ3MpXG4gICAgdmFyIGNiID0gYXJncy5wb3AoKVxuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYi5jYWxsKG51bGwsIGVycilcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBhdHRlbXB0IGFuZCByaWdodCBub3dcbiAgICB2YXIgc2luY2VBdHRlbXB0ID0gRGF0ZS5ub3coKSAtIGxhc3RUaW1lXG4gICAgLy8gdGhlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gd2hlbiB3ZSBmaXJzdCB0cmllZCwgYW5kIHdoZW4gd2UgbGFzdCB0cmllZFxuICAgIC8vIHJvdW5kZWQgdXAgdG8gYXQgbGVhc3QgMVxuICAgIHZhciBzaW5jZVN0YXJ0ID0gTWF0aC5tYXgobGFzdFRpbWUgLSBzdGFydFRpbWUsIDEpXG4gICAgLy8gYmFja29mZi4gd2FpdCBsb25nZXIgdGhhbiB0aGUgdG90YWwgdGltZSB3ZSd2ZSBiZWVuIHJldHJ5aW5nLCBidXQgb25seVxuICAgIC8vIHVwIHRvIGEgbWF4aW11bSBvZiAxMDBtc1xuICAgIHZhciBkZXNpcmVkRGVsYXkgPSBNYXRoLm1pbihzaW5jZVN0YXJ0ICogMS4yLCAxMDApXG4gICAgLy8gaXQncyBiZWVuIGxvbmcgZW5vdWdoIHNpbmNlIHRoZSBsYXN0IHJldHJ5LCBkbyBpdCBhZ2FpblxuICAgIGlmIChzaW5jZUF0dGVtcHQgPj0gZGVzaXJlZERlbGF5KSB7XG4gICAgICBkZWJ1ZygnUkVUUlknLCBmbi5uYW1lLCBhcmdzKVxuICAgICAgZm4uYXBwbHkobnVsbCwgYXJncy5jb25jYXQoW3N0YXJ0VGltZV0pKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiB3ZSBjYW4ndCBkbyB0aGlzIGpvYiB5ZXQsIHB1c2ggaXQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWVcbiAgICAgIC8vIGFuZCBsZXQgdGhlIG5leHQgaXRlcmF0aW9uIGNoZWNrIGFnYWluXG4gICAgICBmc1tncmFjZWZ1bFF1ZXVlXS5wdXNoKGVsZW0pXG4gICAgfVxuICB9XG5cbiAgLy8gc2NoZWR1bGUgb3VyIG5leHQgcnVuIGlmIG9uZSBpc24ndCBhbHJlYWR5IHNjaGVkdWxlZFxuICBpZiAocmV0cnlUaW1lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0cnlUaW1lciA9IHNldFRpbWVvdXQocmV0cnksIDApXG4gIH1cbn1cbiIsInZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKS5TdHJlYW1cblxubW9kdWxlLmV4cG9ydHMgPSBsZWdhY3lcblxuZnVuY3Rpb24gbGVnYWN5IChmcykge1xuICByZXR1cm4ge1xuICAgIFJlYWRTdHJlYW06IFJlYWRTdHJlYW0sXG4gICAgV3JpdGVTdHJlYW06IFdyaXRlU3RyZWFtXG4gIH1cblxuICBmdW5jdGlvbiBSZWFkU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRTdHJlYW0pKSByZXR1cm4gbmV3IFJlYWRTdHJlYW0ocGF0aCwgb3B0aW9ucyk7XG5cbiAgICBTdHJlYW0uY2FsbCh0aGlzKTtcblxuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5mZCA9IG51bGw7XG4gICAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG4gICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuZmxhZ3MgPSAncic7XG4gICAgdGhpcy5tb2RlID0gNDM4OyAvKj0wNjY2Ki9cbiAgICB0aGlzLmJ1ZmZlclNpemUgPSA2NCAqIDEwMjQ7XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIE1peGluIG9wdGlvbnMgaW50byB0aGlzXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgICBmb3IgKHZhciBpbmRleCA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaW5kZXhdO1xuICAgICAgdGhpc1trZXldID0gb3B0aW9uc1trZXldO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVuY29kaW5nKSB0aGlzLnNldEVuY29kaW5nKHRoaXMuZW5jb2RpbmcpO1xuXG4gICAgaWYgKHRoaXMuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCdudW1iZXInICE9PSB0eXBlb2YgdGhpcy5zdGFydCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ3N0YXJ0IG11c3QgYmUgYSBOdW1iZXInKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuZW5kID0gSW5maW5pdHk7XG4gICAgICB9IGVsc2UgaWYgKCdudW1iZXInICE9PSB0eXBlb2YgdGhpcy5lbmQpIHtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdlbmQgbXVzdCBiZSBhIE51bWJlcicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGFydCA+IHRoaXMuZW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc3RhcnQgbXVzdCBiZSA8PSBlbmQnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZkICE9PSBudWxsKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLl9yZWFkKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmcy5vcGVuKHRoaXMucGF0aCwgdGhpcy5mbGFncywgdGhpcy5tb2RlLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgc2VsZi5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYuZmQgPSBmZDtcbiAgICAgIHNlbGYuZW1pdCgnb3BlbicsIGZkKTtcbiAgICAgIHNlbGYuX3JlYWQoKTtcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gV3JpdGVTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV3JpdGVTdHJlYW0pKSByZXR1cm4gbmV3IFdyaXRlU3RyZWFtKHBhdGgsIG9wdGlvbnMpO1xuXG4gICAgU3RyZWFtLmNhbGwodGhpcyk7XG5cbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMuZmQgPSBudWxsO1xuICAgIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuXG4gICAgdGhpcy5mbGFncyA9ICd3JztcbiAgICB0aGlzLmVuY29kaW5nID0gJ2JpbmFyeSc7XG4gICAgdGhpcy5tb2RlID0gNDM4OyAvKj0wNjY2Ki9cbiAgICB0aGlzLmJ5dGVzV3JpdHRlbiA9IDA7XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIE1peGluIG9wdGlvbnMgaW50byB0aGlzXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgICBmb3IgKHZhciBpbmRleCA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaW5kZXhdO1xuICAgICAgdGhpc1trZXldID0gb3B0aW9uc1trZXldO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICgnbnVtYmVyJyAhPT0gdHlwZW9mIHRoaXMuc3RhcnQpIHtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdzdGFydCBtdXN0IGJlIGEgTnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdGFydCA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdGFydCBtdXN0IGJlID49IHplcm8nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICAgIH1cblxuICAgIHRoaXMuYnVzeSA9IGZhbHNlO1xuICAgIHRoaXMuX3F1ZXVlID0gW107XG5cbiAgICBpZiAodGhpcy5mZCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fb3BlbiA9IGZzLm9wZW47XG4gICAgICB0aGlzLl9xdWV1ZS5wdXNoKFt0aGlzLl9vcGVuLCB0aGlzLnBhdGgsIHRoaXMuZmxhZ3MsIHRoaXMubW9kZSwgdW5kZWZpbmVkXSk7XG4gICAgICB0aGlzLmZsdXNoKCk7XG4gICAgfVxuICB9XG59XG4iLCJ2YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnY29uc3RhbnRzJylcblxudmFyIG9yaWdDd2QgPSBwcm9jZXNzLmN3ZFxudmFyIGN3ZCA9IG51bGxcblxudmFyIHBsYXRmb3JtID0gcHJvY2Vzcy5lbnYuR1JBQ0VGVUxfRlNfUExBVEZPUk0gfHwgcHJvY2Vzcy5wbGF0Zm9ybVxuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIWN3ZClcbiAgICBjd2QgPSBvcmlnQ3dkLmNhbGwocHJvY2VzcylcbiAgcmV0dXJuIGN3ZFxufVxudHJ5IHtcbiAgcHJvY2Vzcy5jd2QoKVxufSBjYXRjaCAoZXIpIHt9XG5cbi8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIHVudGlsIG5vZGUuanMgMTIgaXMgcmVxdWlyZWRcbmlmICh0eXBlb2YgcHJvY2Vzcy5jaGRpciA9PT0gJ2Z1bmN0aW9uJykge1xuICB2YXIgY2hkaXIgPSBwcm9jZXNzLmNoZGlyXG4gIHByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZCkge1xuICAgIGN3ZCA9IG51bGxcbiAgICBjaGRpci5jYWxsKHByb2Nlc3MsIGQpXG4gIH1cbiAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikgT2JqZWN0LnNldFByb3RvdHlwZU9mKHByb2Nlc3MuY2hkaXIsIGNoZGlyKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoXG5cbmZ1bmN0aW9uIHBhdGNoIChmcykge1xuICAvLyAocmUtKWltcGxlbWVudCBzb21lIHRoaW5ncyB0aGF0IGFyZSBrbm93biBidXN0ZWQgb3IgbWlzc2luZy5cblxuICAvLyBsY2htb2QsIGJyb2tlbiBwcmlvciB0byAwLjYuMlxuICAvLyBiYWNrLXBvcnQgdGhlIGZpeCBoZXJlLlxuICBpZiAoY29uc3RhbnRzLmhhc093blByb3BlcnR5KCdPX1NZTUxJTksnKSAmJlxuICAgICAgcHJvY2Vzcy52ZXJzaW9uLm1hdGNoKC9edjBcXC42XFwuWzAtMl18XnYwXFwuNVxcLi8pKSB7XG4gICAgcGF0Y2hMY2htb2QoZnMpXG4gIH1cblxuICAvLyBsdXRpbWVzIGltcGxlbWVudGF0aW9uLCBvciBuby1vcFxuICBpZiAoIWZzLmx1dGltZXMpIHtcbiAgICBwYXRjaEx1dGltZXMoZnMpXG4gIH1cblxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vaXNhYWNzL25vZGUtZ3JhY2VmdWwtZnMvaXNzdWVzLzRcbiAgLy8gQ2hvd24gc2hvdWxkIG5vdCBmYWlsIG9uIGVpbnZhbCBvciBlcGVybSBpZiBub24tcm9vdC5cbiAgLy8gSXQgc2hvdWxkIG5vdCBmYWlsIG9uIGVub3N5cyBldmVyLCBhcyB0aGlzIGp1c3QgaW5kaWNhdGVzXG4gIC8vIHRoYXQgYSBmcyBkb2Vzbid0IHN1cHBvcnQgdGhlIGludGVuZGVkIG9wZXJhdGlvbi5cblxuICBmcy5jaG93biA9IGNob3duRml4KGZzLmNob3duKVxuICBmcy5mY2hvd24gPSBjaG93bkZpeChmcy5mY2hvd24pXG4gIGZzLmxjaG93biA9IGNob3duRml4KGZzLmxjaG93bilcblxuICBmcy5jaG1vZCA9IGNobW9kRml4KGZzLmNobW9kKVxuICBmcy5mY2htb2QgPSBjaG1vZEZpeChmcy5mY2htb2QpXG4gIGZzLmxjaG1vZCA9IGNobW9kRml4KGZzLmxjaG1vZClcblxuICBmcy5jaG93blN5bmMgPSBjaG93bkZpeFN5bmMoZnMuY2hvd25TeW5jKVxuICBmcy5mY2hvd25TeW5jID0gY2hvd25GaXhTeW5jKGZzLmZjaG93blN5bmMpXG4gIGZzLmxjaG93blN5bmMgPSBjaG93bkZpeFN5bmMoZnMubGNob3duU3luYylcblxuICBmcy5jaG1vZFN5bmMgPSBjaG1vZEZpeFN5bmMoZnMuY2htb2RTeW5jKVxuICBmcy5mY2htb2RTeW5jID0gY2htb2RGaXhTeW5jKGZzLmZjaG1vZFN5bmMpXG4gIGZzLmxjaG1vZFN5bmMgPSBjaG1vZEZpeFN5bmMoZnMubGNobW9kU3luYylcblxuICBmcy5zdGF0ID0gc3RhdEZpeChmcy5zdGF0KVxuICBmcy5mc3RhdCA9IHN0YXRGaXgoZnMuZnN0YXQpXG4gIGZzLmxzdGF0ID0gc3RhdEZpeChmcy5sc3RhdClcblxuICBmcy5zdGF0U3luYyA9IHN0YXRGaXhTeW5jKGZzLnN0YXRTeW5jKVxuICBmcy5mc3RhdFN5bmMgPSBzdGF0Rml4U3luYyhmcy5mc3RhdFN5bmMpXG4gIGZzLmxzdGF0U3luYyA9IHN0YXRGaXhTeW5jKGZzLmxzdGF0U3luYylcblxuICAvLyBpZiBsY2htb2QvbGNob3duIGRvIG5vdCBleGlzdCwgdGhlbiBtYWtlIHRoZW0gbm8tb3BzXG4gIGlmIChmcy5jaG1vZCAmJiAhZnMubGNobW9kKSB7XG4gICAgZnMubGNobW9kID0gZnVuY3Rpb24gKHBhdGgsIG1vZGUsIGNiKSB7XG4gICAgICBpZiAoY2IpIHByb2Nlc3MubmV4dFRpY2soY2IpXG4gICAgfVxuICAgIGZzLmxjaG1vZFN5bmMgPSBmdW5jdGlvbiAoKSB7fVxuICB9XG4gIGlmIChmcy5jaG93biAmJiAhZnMubGNob3duKSB7XG4gICAgZnMubGNob3duID0gZnVuY3Rpb24gKHBhdGgsIHVpZCwgZ2lkLCBjYikge1xuICAgICAgaWYgKGNiKSBwcm9jZXNzLm5leHRUaWNrKGNiKVxuICAgIH1cbiAgICBmcy5sY2hvd25TeW5jID0gZnVuY3Rpb24gKCkge31cbiAgfVxuXG4gIC8vIG9uIFdpbmRvd3MsIEEvViBzb2Z0d2FyZSBjYW4gbG9jayB0aGUgZGlyZWN0b3J5LCBjYXVzaW5nIHRoaXNcbiAgLy8gdG8gZmFpbCB3aXRoIGFuIEVBQ0NFUyBvciBFUEVSTSBpZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5zIG5ld2x5XG4gIC8vIGNyZWF0ZWQgZmlsZXMuICBUcnkgYWdhaW4gb24gZmFpbHVyZSwgZm9yIHVwIHRvIDYwIHNlY29uZHMuXG5cbiAgLy8gU2V0IHRoZSB0aW1lb3V0IHRoaXMgbG9uZyBiZWNhdXNlIHNvbWUgV2luZG93cyBBbnRpLVZpcnVzLCBzdWNoIGFzIFBhcml0eVxuICAvLyBiaXQ5LCBtYXkgbG9jayBmaWxlcyBmb3IgdXAgdG8gYSBtaW51dGUsIGNhdXNpbmcgbnBtIHBhY2thZ2UgaW5zdGFsbFxuICAvLyBmYWlsdXJlcy4gQWxzbywgdGFrZSBjYXJlIHRvIHlpZWxkIHRoZSBzY2hlZHVsZXIuIFdpbmRvd3Mgc2NoZWR1bGluZyBnaXZlc1xuICAvLyBDUFUgdG8gYSBidXN5IGxvb3BpbmcgcHJvY2Vzcywgd2hpY2ggY2FuIGNhdXNlIHRoZSBwcm9ncmFtIGNhdXNpbmcgdGhlIGxvY2tcbiAgLy8gY29udGVudGlvbiB0byBiZSBzdGFydmVkIG9mIENQVSBieSBub2RlLCBzbyB0aGUgY29udGVudGlvbiBkb2Vzbid0IHJlc29sdmUuXG4gIGlmIChwbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiKSB7XG4gICAgZnMucmVuYW1lID0gdHlwZW9mIGZzLnJlbmFtZSAhPT0gJ2Z1bmN0aW9uJyA/IGZzLnJlbmFtZVxuICAgIDogKGZ1bmN0aW9uIChmcyRyZW5hbWUpIHtcbiAgICAgIGZ1bmN0aW9uIHJlbmFtZSAoZnJvbSwgdG8sIGNiKSB7XG4gICAgICAgIHZhciBzdGFydCA9IERhdGUubm93KClcbiAgICAgICAgdmFyIGJhY2tvZmYgPSAwO1xuICAgICAgICBmcyRyZW5hbWUoZnJvbSwgdG8sIGZ1bmN0aW9uIENCIChlcikge1xuICAgICAgICAgIGlmIChlclxuICAgICAgICAgICAgICAmJiAoZXIuY29kZSA9PT0gXCJFQUNDRVNcIiB8fCBlci5jb2RlID09PSBcIkVQRVJNXCIgfHwgZXIuY29kZSA9PT0gXCJFQlVTWVwiKVxuICAgICAgICAgICAgICAmJiBEYXRlLm5vdygpIC0gc3RhcnQgPCA2MDAwMCkge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgZnMuc3RhdCh0bywgZnVuY3Rpb24gKHN0YXRlciwgc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGVyICYmIHN0YXRlci5jb2RlID09PSBcIkVOT0VOVFwiKVxuICAgICAgICAgICAgICAgICAgZnMkcmVuYW1lKGZyb20sIHRvLCBDQik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgY2IoZXIpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LCBiYWNrb2ZmKVxuICAgICAgICAgICAgaWYgKGJhY2tvZmYgPCAxMDApXG4gICAgICAgICAgICAgIGJhY2tvZmYgKz0gMTA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjYikgY2IoZXIpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSBPYmplY3Quc2V0UHJvdG90eXBlT2YocmVuYW1lLCBmcyRyZW5hbWUpXG4gICAgICByZXR1cm4gcmVuYW1lXG4gICAgfSkoZnMucmVuYW1lKVxuICB9XG5cbiAgLy8gaWYgcmVhZCgpIHJldHVybnMgRUFHQUlOLCB0aGVuIGp1c3QgdHJ5IGl0IGFnYWluLlxuICBmcy5yZWFkID0gdHlwZW9mIGZzLnJlYWQgIT09ICdmdW5jdGlvbicgPyBmcy5yZWFkXG4gIDogKGZ1bmN0aW9uIChmcyRyZWFkKSB7XG4gICAgZnVuY3Rpb24gcmVhZCAoZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFja18pIHtcbiAgICAgIHZhciBjYWxsYmFja1xuICAgICAgaWYgKGNhbGxiYWNrXyAmJiB0eXBlb2YgY2FsbGJhY2tfID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhciBlYWdDb3VudGVyID0gMFxuICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uIChlciwgXywgX18pIHtcbiAgICAgICAgICBpZiAoZXIgJiYgZXIuY29kZSA9PT0gJ0VBR0FJTicgJiYgZWFnQ291bnRlciA8IDEwKSB7XG4gICAgICAgICAgICBlYWdDb3VudGVyICsrXG4gICAgICAgICAgICByZXR1cm4gZnMkcmVhZC5jYWxsKGZzLCBmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYWxsYmFja18uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZnMkcmVhZC5jYWxsKGZzLCBmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIC8vIFRoaXMgZW5zdXJlcyBgdXRpbC5wcm9taXNpZnlgIHdvcmtzIGFzIGl0IGRvZXMgZm9yIG5hdGl2ZSBgZnMucmVhZGAuXG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlYWQsIGZzJHJlYWQpXG4gICAgcmV0dXJuIHJlYWRcbiAgfSkoZnMucmVhZClcblxuICBmcy5yZWFkU3luYyA9IHR5cGVvZiBmcy5yZWFkU3luYyAhPT0gJ2Z1bmN0aW9uJyA/IGZzLnJlYWRTeW5jXG4gIDogKGZ1bmN0aW9uIChmcyRyZWFkU3luYykgeyByZXR1cm4gZnVuY3Rpb24gKGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbikge1xuICAgIHZhciBlYWdDb3VudGVyID0gMFxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZnMkcmVhZFN5bmMuY2FsbChmcywgZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgaWYgKGVyLmNvZGUgPT09ICdFQUdBSU4nICYmIGVhZ0NvdW50ZXIgPCAxMCkge1xuICAgICAgICAgIGVhZ0NvdW50ZXIgKytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIHRocm93IGVyXG4gICAgICB9XG4gICAgfVxuICB9fSkoZnMucmVhZFN5bmMpXG5cbiAgZnVuY3Rpb24gcGF0Y2hMY2htb2QgKGZzKSB7XG4gICAgZnMubGNobW9kID0gZnVuY3Rpb24gKHBhdGgsIG1vZGUsIGNhbGxiYWNrKSB7XG4gICAgICBmcy5vcGVuKCBwYXRoXG4gICAgICAgICAgICAgLCBjb25zdGFudHMuT19XUk9OTFkgfCBjb25zdGFudHMuT19TWU1MSU5LXG4gICAgICAgICAgICAgLCBtb2RlXG4gICAgICAgICAgICAgLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8gcHJlZmVyIHRvIHJldHVybiB0aGUgY2htb2QgZXJyb3IsIGlmIG9uZSBvY2N1cnMsXG4gICAgICAgIC8vIGJ1dCBzdGlsbCB0cnkgdG8gY2xvc2UsIGFuZCByZXBvcnQgY2xvc2luZyBlcnJvcnMgaWYgdGhleSBvY2N1ci5cbiAgICAgICAgZnMuZmNobW9kKGZkLCBtb2RlLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgZnMuY2xvc2UoZmQsIGZ1bmN0aW9uKGVycjIpIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZXJyIHx8IGVycjIpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZnMubGNobW9kU3luYyA9IGZ1bmN0aW9uIChwYXRoLCBtb2RlKSB7XG4gICAgICB2YXIgZmQgPSBmcy5vcGVuU3luYyhwYXRoLCBjb25zdGFudHMuT19XUk9OTFkgfCBjb25zdGFudHMuT19TWU1MSU5LLCBtb2RlKVxuXG4gICAgICAvLyBwcmVmZXIgdG8gcmV0dXJuIHRoZSBjaG1vZCBlcnJvciwgaWYgb25lIG9jY3VycyxcbiAgICAgIC8vIGJ1dCBzdGlsbCB0cnkgdG8gY2xvc2UsIGFuZCByZXBvcnQgY2xvc2luZyBlcnJvcnMgaWYgdGhleSBvY2N1ci5cbiAgICAgIHZhciB0aHJldyA9IHRydWVcbiAgICAgIHZhciByZXRcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldCA9IGZzLmZjaG1vZFN5bmMoZmQsIG1vZGUpXG4gICAgICAgIHRocmV3ID0gZmFsc2VcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmICh0aHJldykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgICAgfSBjYXRjaCAoZXIpIHt9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGF0Y2hMdXRpbWVzIChmcykge1xuICAgIGlmIChjb25zdGFudHMuaGFzT3duUHJvcGVydHkoXCJPX1NZTUxJTktcIikgJiYgZnMuZnV0aW1lcykge1xuICAgICAgZnMubHV0aW1lcyA9IGZ1bmN0aW9uIChwYXRoLCBhdCwgbXQsIGNiKSB7XG4gICAgICAgIGZzLm9wZW4ocGF0aCwgY29uc3RhbnRzLk9fU1lNTElOSywgZnVuY3Rpb24gKGVyLCBmZCkge1xuICAgICAgICAgIGlmIChlcikge1xuICAgICAgICAgICAgaWYgKGNiKSBjYihlcilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBmcy5mdXRpbWVzKGZkLCBhdCwgbXQsIGZ1bmN0aW9uIChlcikge1xuICAgICAgICAgICAgZnMuY2xvc2UoZmQsIGZ1bmN0aW9uIChlcjIpIHtcbiAgICAgICAgICAgICAgaWYgKGNiKSBjYihlciB8fCBlcjIpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGZzLmx1dGltZXNTeW5jID0gZnVuY3Rpb24gKHBhdGgsIGF0LCBtdCkge1xuICAgICAgICB2YXIgZmQgPSBmcy5vcGVuU3luYyhwYXRoLCBjb25zdGFudHMuT19TWU1MSU5LKVxuICAgICAgICB2YXIgcmV0XG4gICAgICAgIHZhciB0aHJldyA9IHRydWVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXQgPSBmcy5mdXRpbWVzU3luYyhmZCwgYXQsIG10KVxuICAgICAgICAgIHRocmV3ID0gZmFsc2VcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBpZiAodGhyZXcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVyKSB7fVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoZnMuZnV0aW1lcykge1xuICAgICAgZnMubHV0aW1lcyA9IGZ1bmN0aW9uIChfYSwgX2IsIF9jLCBjYikgeyBpZiAoY2IpIHByb2Nlc3MubmV4dFRpY2soY2IpIH1cbiAgICAgIGZzLmx1dGltZXNTeW5jID0gZnVuY3Rpb24gKCkge31cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaG1vZEZpeCAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgbW9kZSwgY2IpIHtcbiAgICAgIHJldHVybiBvcmlnLmNhbGwoZnMsIHRhcmdldCwgbW9kZSwgZnVuY3Rpb24gKGVyKSB7XG4gICAgICAgIGlmIChjaG93bkVyT2soZXIpKSBlciA9IG51bGxcbiAgICAgICAgaWYgKGNiKSBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNobW9kRml4U3luYyAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgbW9kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCBtb2RlKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgaWYgKCFjaG93bkVyT2soZXIpKSB0aHJvdyBlclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgZnVuY3Rpb24gY2hvd25GaXggKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHVpZCwgZ2lkLCBjYikge1xuICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCB1aWQsIGdpZCwgZnVuY3Rpb24gKGVyKSB7XG4gICAgICAgIGlmIChjaG93bkVyT2soZXIpKSBlciA9IG51bGxcbiAgICAgICAgaWYgKGNiKSBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNob3duRml4U3luYyAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgdWlkLCBnaWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBvcmlnLmNhbGwoZnMsIHRhcmdldCwgdWlkLCBnaWQpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICBpZiAoIWNob3duRXJPayhlcikpIHRocm93IGVyXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RhdEZpeCAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBvZiBOb2RlIGVycm9uZW91c2x5IHJldHVybmVkIHNpZ25lZCBpbnRlZ2VycyBmb3JcbiAgICAvLyB1aWQgKyBnaWQuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIG9wdGlvbnMsIGNiKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2IgPSBvcHRpb25zXG4gICAgICAgIG9wdGlvbnMgPSBudWxsXG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBjYWxsYmFjayAoZXIsIHN0YXRzKSB7XG4gICAgICAgIGlmIChzdGF0cykge1xuICAgICAgICAgIGlmIChzdGF0cy51aWQgPCAwKSBzdGF0cy51aWQgKz0gMHgxMDAwMDAwMDBcbiAgICAgICAgICBpZiAoc3RhdHMuZ2lkIDwgMCkgc3RhdHMuZ2lkICs9IDB4MTAwMDAwMDAwXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNiKSBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9ucyA/IG9yaWcuY2FsbChmcywgdGFyZ2V0LCBvcHRpb25zLCBjYWxsYmFjaylcbiAgICAgICAgOiBvcmlnLmNhbGwoZnMsIHRhcmdldCwgY2FsbGJhY2spXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RhdEZpeFN5bmMgKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgLy8gT2xkZXIgdmVyc2lvbnMgb2YgTm9kZSBlcnJvbmVvdXNseSByZXR1cm5lZCBzaWduZWQgaW50ZWdlcnMgZm9yXG4gICAgLy8gdWlkICsgZ2lkLlxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgICB2YXIgc3RhdHMgPSBvcHRpb25zID8gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIG9wdGlvbnMpXG4gICAgICAgIDogb3JpZy5jYWxsKGZzLCB0YXJnZXQpXG4gICAgICBpZiAoc3RhdHMpIHtcbiAgICAgICAgaWYgKHN0YXRzLnVpZCA8IDApIHN0YXRzLnVpZCArPSAweDEwMDAwMDAwMFxuICAgICAgICBpZiAoc3RhdHMuZ2lkIDwgMCkgc3RhdHMuZ2lkICs9IDB4MTAwMDAwMDAwXG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdHM7XG4gICAgfVxuICB9XG5cbiAgLy8gRU5PU1lTIG1lYW5zIHRoYXQgdGhlIGZzIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgb3AuIEp1c3QgaWdub3JlXG4gIC8vIHRoYXQsIGJlY2F1c2UgaXQgZG9lc24ndCBtYXR0ZXIuXG4gIC8vXG4gIC8vIGlmIHRoZXJlJ3Mgbm8gZ2V0dWlkLCBvciBpZiBnZXR1aWQoKSBpcyBzb21ldGhpbmcgb3RoZXJcbiAgLy8gdGhhbiAwLCBhbmQgdGhlIGVycm9yIGlzIEVJTlZBTCBvciBFUEVSTSwgdGhlbiBqdXN0IGlnbm9yZVxuICAvLyBpdC5cbiAgLy9cbiAgLy8gVGhpcyBzcGVjaWZpYyBjYXNlIGlzIGEgc2lsZW50IGZhaWx1cmUgaW4gY3AsIGluc3RhbGwsIHRhcixcbiAgLy8gYW5kIG1vc3Qgb3RoZXIgdW5peCB0b29scyB0aGF0IG1hbmFnZSBwZXJtaXNzaW9ucy5cbiAgLy9cbiAgLy8gV2hlbiBydW5uaW5nIGFzIHJvb3QsIG9yIGlmIG90aGVyIHR5cGVzIG9mIGVycm9ycyBhcmVcbiAgLy8gZW5jb3VudGVyZWQsIHRoZW4gaXQncyBzdHJpY3QuXG4gIGZ1bmN0aW9uIGNob3duRXJPayAoZXIpIHtcbiAgICBpZiAoIWVyKVxuICAgICAgcmV0dXJuIHRydWVcblxuICAgIGlmIChlci5jb2RlID09PSBcIkVOT1NZU1wiKVxuICAgICAgcmV0dXJuIHRydWVcblxuICAgIHZhciBub25yb290ID0gIXByb2Nlc3MuZ2V0dWlkIHx8IHByb2Nlc3MuZ2V0dWlkKCkgIT09IDBcbiAgICBpZiAobm9ucm9vdCkge1xuICAgICAgaWYgKGVyLmNvZGUgPT09IFwiRUlOVkFMXCIgfHwgZXIuY29kZSA9PT0gXCJFUEVSTVwiKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gKGZsYWcsIGFyZ3YgPSBwcm9jZXNzLmFyZ3YpID0+IHtcblx0Y29uc3QgcHJlZml4ID0gZmxhZy5zdGFydHNXaXRoKCctJykgPyAnJyA6IChmbGFnLmxlbmd0aCA9PT0gMSA/ICctJyA6ICctLScpO1xuXHRjb25zdCBwb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZihwcmVmaXggKyBmbGFnKTtcblx0Y29uc3QgdGVybWluYXRvclBvc2l0aW9uID0gYXJndi5pbmRleE9mKCctLScpO1xuXHRyZXR1cm4gcG9zaXRpb24gIT09IC0xICYmICh0ZXJtaW5hdG9yUG9zaXRpb24gPT09IC0xIHx8IHBvc2l0aW9uIDwgdGVybWluYXRvclBvc2l0aW9uKTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IdHRwUHJveHlBZ2VudCA9IHZvaWQgMDtcbmNvbnN0IG5ldCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwibmV0XCIpKTtcbmNvbnN0IHRscyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidGxzXCIpKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcImV2ZW50c1wiKTtcbmNvbnN0IGFnZW50X2Jhc2VfMSA9IHJlcXVpcmUoXCJhZ2VudC1iYXNlXCIpO1xuY29uc3QgdXJsXzEgPSByZXF1aXJlKFwidXJsXCIpO1xuY29uc3QgZGVidWcgPSAoMCwgZGVidWdfMS5kZWZhdWx0KSgnaHR0cC1wcm94eS1hZ2VudCcpO1xuLyoqXG4gKiBUaGUgYEh0dHBQcm94eUFnZW50YCBpbXBsZW1lbnRzIGFuIEhUVFAgQWdlbnQgc3ViY2xhc3MgdGhhdCBjb25uZWN0c1xuICogdG8gdGhlIHNwZWNpZmllZCBcIkhUVFAgcHJveHkgc2VydmVyXCIgaW4gb3JkZXIgdG8gcHJveHkgSFRUUCByZXF1ZXN0cy5cbiAqL1xuY2xhc3MgSHR0cFByb3h5QWdlbnQgZXh0ZW5kcyBhZ2VudF9iYXNlXzEuQWdlbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3h5LCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLnByb3h5ID0gdHlwZW9mIHByb3h5ID09PSAnc3RyaW5nJyA/IG5ldyB1cmxfMS5VUkwocHJveHkpIDogcHJveHk7XG4gICAgICAgIHRoaXMucHJveHlIZWFkZXJzID0gb3B0cz8uaGVhZGVycyA/PyB7fTtcbiAgICAgICAgZGVidWcoJ0NyZWF0aW5nIG5ldyBIdHRwUHJveHlBZ2VudCBpbnN0YW5jZTogJW8nLCB0aGlzLnByb3h5LmhyZWYpO1xuICAgICAgICAvLyBUcmltIG9mZiB0aGUgYnJhY2tldHMgZnJvbSBJUHY2IGFkZHJlc3Nlc1xuICAgICAgICBjb25zdCBob3N0ID0gKHRoaXMucHJveHkuaG9zdG5hbWUgfHwgdGhpcy5wcm94eS5ob3N0KS5yZXBsYWNlKC9eXFxbfFxcXSQvZywgJycpO1xuICAgICAgICBjb25zdCBwb3J0ID0gdGhpcy5wcm94eS5wb3J0XG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMucHJveHkucG9ydCwgMTApXG4gICAgICAgICAgICA6IHRoaXMucHJveHkucHJvdG9jb2wgPT09ICdodHRwczonXG4gICAgICAgICAgICAgICAgPyA0NDNcbiAgICAgICAgICAgICAgICA6IDgwO1xuICAgICAgICB0aGlzLmNvbm5lY3RPcHRzID0ge1xuICAgICAgICAgICAgLi4uKG9wdHMgPyBvbWl0KG9wdHMsICdoZWFkZXJzJykgOiBudWxsKSxcbiAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICBwb3J0LFxuICAgICAgICB9O1xuICAgIH1cbiAgICBhZGRSZXF1ZXN0KHJlcSwgb3B0cykge1xuICAgICAgICByZXEuX2hlYWRlciA9IG51bGw7XG4gICAgICAgIHRoaXMuc2V0UmVxdWVzdFByb3BzKHJlcSwgb3B0cyk7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYGFkZFJlcXVlc3QoKWAgaXNuJ3QgZGVmaW5lZCBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgIHN1cGVyLmFkZFJlcXVlc3QocmVxLCBvcHRzKTtcbiAgICB9XG4gICAgc2V0UmVxdWVzdFByb3BzKHJlcSwgb3B0cykge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IG9wdHMuc2VjdXJlRW5kcG9pbnQgPyAnaHR0cHM6JyA6ICdodHRwOic7XG4gICAgICAgIGNvbnN0IGhvc3RuYW1lID0gcmVxLmdldEhlYWRlcignaG9zdCcpIHx8ICdsb2NhbGhvc3QnO1xuICAgICAgICBjb25zdCBiYXNlID0gYCR7cHJvdG9jb2x9Ly8ke2hvc3RuYW1lfWA7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyB1cmxfMS5VUkwocmVxLnBhdGgsIGJhc2UpO1xuICAgICAgICBpZiAob3B0cy5wb3J0ICE9PSA4MCkge1xuICAgICAgICAgICAgdXJsLnBvcnQgPSBTdHJpbmcob3B0cy5wb3J0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGFuZ2UgdGhlIGBodHRwLkNsaWVudFJlcXVlc3RgIGluc3RhbmNlJ3MgXCJwYXRoXCIgZmllbGRcbiAgICAgICAgLy8gdG8gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIFVSTCB0aGF0IHdpbGwgYmUgcmVxdWVzdGVkLlxuICAgICAgICByZXEucGF0aCA9IFN0cmluZyh1cmwpO1xuICAgICAgICAvLyBJbmplY3QgdGhlIGBQcm94eS1BdXRob3JpemF0aW9uYCBoZWFkZXIgaWYgbmVjZXNzYXJ5LlxuICAgICAgICBjb25zdCBoZWFkZXJzID0gdHlwZW9mIHRoaXMucHJveHlIZWFkZXJzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHRoaXMucHJveHlIZWFkZXJzKClcbiAgICAgICAgICAgIDogeyAuLi50aGlzLnByb3h5SGVhZGVycyB9O1xuICAgICAgICBpZiAocHJveHkudXNlcm5hbWUgfHwgcHJveHkucGFzc3dvcmQpIHtcbiAgICAgICAgICAgIGNvbnN0IGF1dGggPSBgJHtkZWNvZGVVUklDb21wb25lbnQocHJveHkudXNlcm5hbWUpfToke2RlY29kZVVSSUNvbXBvbmVudChwcm94eS5wYXNzd29yZCl9YDtcbiAgICAgICAgICAgIGhlYWRlcnNbJ1Byb3h5LUF1dGhvcml6YXRpb24nXSA9IGBCYXNpYyAke0J1ZmZlci5mcm9tKGF1dGgpLnRvU3RyaW5nKCdiYXNlNjQnKX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGVhZGVyc1snUHJveHktQ29ubmVjdGlvbiddKSB7XG4gICAgICAgICAgICBoZWFkZXJzWydQcm94eS1Db25uZWN0aW9uJ10gPSB0aGlzLmtlZXBBbGl2ZVxuICAgICAgICAgICAgICAgID8gJ0tlZXAtQWxpdmUnXG4gICAgICAgICAgICAgICAgOiAnY2xvc2UnO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhoZWFkZXJzKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXJzW25hbWVdO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmVxLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgY29ubmVjdChyZXEsIG9wdHMpIHtcbiAgICAgICAgcmVxLl9oZWFkZXIgPSBudWxsO1xuICAgICAgICBpZiAoIXJlcS5wYXRoLmluY2x1ZGVzKCc6Ly8nKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRSZXF1ZXN0UHJvcHMocmVxLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgaHR0cCBDbGllbnRSZXF1ZXN0J3MgaW50ZXJuYWwgYF9oZWFkZXJgIGZpZWxkXG4gICAgICAgIC8vIG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIHNldC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHdlJ2xsIG5lZWRcbiAgICAgICAgLy8gdG8gcmUtZ2VuZXJhdGUgdGhlIHN0cmluZyBzaW5jZSB3ZSBqdXN0IGNoYW5nZWQgdGhlIGByZXEucGF0aGAuXG4gICAgICAgIGxldCBmaXJzdDtcbiAgICAgICAgbGV0IGVuZE9mSGVhZGVycztcbiAgICAgICAgZGVidWcoJ1JlZ2VuZXJhdGluZyBzdG9yZWQgSFRUUCBoZWFkZXIgc3RyaW5nIGZvciByZXF1ZXN0Jyk7XG4gICAgICAgIHJlcS5faW1wbGljaXRIZWFkZXIoKTtcbiAgICAgICAgaWYgKHJlcS5vdXRwdXREYXRhICYmIHJlcS5vdXRwdXREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRlYnVnKCdQYXRjaGluZyBjb25uZWN0aW9uIHdyaXRlKCkgb3V0cHV0IGJ1ZmZlciB3aXRoIHVwZGF0ZWQgaGVhZGVyJyk7XG4gICAgICAgICAgICBmaXJzdCA9IHJlcS5vdXRwdXREYXRhWzBdLmRhdGE7XG4gICAgICAgICAgICBlbmRPZkhlYWRlcnMgPSBmaXJzdC5pbmRleE9mKCdcXHJcXG5cXHJcXG4nKSArIDQ7XG4gICAgICAgICAgICByZXEub3V0cHV0RGF0YVswXS5kYXRhID1cbiAgICAgICAgICAgICAgICByZXEuX2hlYWRlciArIGZpcnN0LnN1YnN0cmluZyhlbmRPZkhlYWRlcnMpO1xuICAgICAgICAgICAgZGVidWcoJ091dHB1dCBidWZmZXI6ICVvJywgcmVxLm91dHB1dERhdGFbMF0uZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ3JlYXRlIGEgc29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIHByb3h5IHNlcnZlci5cbiAgICAgICAgbGV0IHNvY2tldDtcbiAgICAgICAgaWYgKHRoaXMucHJveHkucHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgICAgICAgICBkZWJ1ZygnQ3JlYXRpbmcgYHRscy5Tb2NrZXRgOiAlbycsIHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICAgICAgc29ja2V0ID0gdGxzLmNvbm5lY3QodGhpcy5jb25uZWN0T3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWJ1ZygnQ3JlYXRpbmcgYG5ldC5Tb2NrZXRgOiAlbycsIHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICAgICAgc29ja2V0ID0gbmV0LmNvbm5lY3QodGhpcy5jb25uZWN0T3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHNvY2tldCdzIGBjb25uZWN0YCBldmVudCwgc28gdGhhdCB0aGlzIGBjYWxsYmFjaygpYFxuICAgICAgICAvLyBmdW5jdGlvbiB0aHJvd3MgaW5zdGVhZCBvZiB0aGUgYGh0dHBgIHJlcXVlc3QgbWFjaGluZXJ5LiBUaGlzIGlzXG4gICAgICAgIC8vIGltcG9ydGFudCBmb3IgaS5lLiBgUGFjUHJveHlBZ2VudGAgd2hpY2ggZGV0ZXJtaW5lcyBhIGZhaWxlZCBwcm94eVxuICAgICAgICAvLyBjb25uZWN0aW9uIHZpYSB0aGUgYGNhbGxiYWNrKClgIGZ1bmN0aW9uIHRocm93aW5nLlxuICAgICAgICBhd2FpdCAoMCwgZXZlbnRzXzEub25jZSkoc29ja2V0LCAnY29ubmVjdCcpO1xuICAgICAgICByZXR1cm4gc29ja2V0O1xuICAgIH1cbn1cbkh0dHBQcm94eUFnZW50LnByb3RvY29scyA9IFsnaHR0cCcsICdodHRwcyddO1xuZXhwb3J0cy5IdHRwUHJveHlBZ2VudCA9IEh0dHBQcm94eUFnZW50O1xuZnVuY3Rpb24gb21pdChvYmosIC4uLmtleXMpIHtcbiAgICBjb25zdCByZXQgPSB7fTtcbiAgICBsZXQga2V5O1xuICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0W2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSHR0cHNQcm94eUFnZW50ID0gdm9pZCAwO1xuY29uc3QgbmV0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJuZXRcIikpO1xuY29uc3QgdGxzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJ0bHNcIikpO1xuY29uc3QgYXNzZXJ0XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImFzc2VydFwiKSk7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBhZ2VudF9iYXNlXzEgPSByZXF1aXJlKFwiYWdlbnQtYmFzZVwiKTtcbmNvbnN0IHVybF8xID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IHBhcnNlX3Byb3h5X3Jlc3BvbnNlXzEgPSByZXF1aXJlKFwiLi9wYXJzZS1wcm94eS1yZXNwb25zZVwiKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2h0dHBzLXByb3h5LWFnZW50Jyk7XG4vKipcbiAqIFRoZSBgSHR0cHNQcm94eUFnZW50YCBpbXBsZW1lbnRzIGFuIEhUVFAgQWdlbnQgc3ViY2xhc3MgdGhhdCBjb25uZWN0cyB0b1xuICogdGhlIHNwZWNpZmllZCBcIkhUVFAocykgcHJveHkgc2VydmVyXCIgaW4gb3JkZXIgdG8gcHJveHkgSFRUUFMgcmVxdWVzdHMuXG4gKlxuICogT3V0Z29pbmcgSFRUUCByZXF1ZXN0cyBhcmUgZmlyc3QgdHVubmVsZWQgdGhyb3VnaCB0aGUgcHJveHkgc2VydmVyIHVzaW5nIHRoZVxuICogYENPTk5FQ1RgIEhUVFAgcmVxdWVzdCBtZXRob2QgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB0byB0aGUgcHJveHkgc2VydmVyLFxuICogYW5kIHRoZW4gdGhlIHByb3h5IHNlcnZlciBjb25uZWN0cyB0byB0aGUgZGVzdGluYXRpb24gdGFyZ2V0IGFuZCBpc3N1ZXMgdGhlXG4gKiBIVFRQIHJlcXVlc3QgZnJvbSB0aGUgcHJveHkgc2VydmVyLlxuICpcbiAqIGBodHRwczpgIHJlcXVlc3RzIGhhdmUgdGhlaXIgc29ja2V0IGNvbm5lY3Rpb24gdXBncmFkZWQgdG8gVExTIG9uY2VcbiAqIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBwcm94eSBzZXJ2ZXIgaGFzIGJlZW4gZXN0YWJsaXNoZWQuXG4gKi9cbmNsYXNzIEh0dHBzUHJveHlBZ2VudCBleHRlbmRzIGFnZW50X2Jhc2VfMS5BZ2VudCB7XG4gICAgY29uc3RydWN0b3IocHJveHksIG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHsgcGF0aDogdW5kZWZpbmVkIH07XG4gICAgICAgIHRoaXMucHJveHkgPSB0eXBlb2YgcHJveHkgPT09ICdzdHJpbmcnID8gbmV3IHVybF8xLlVSTChwcm94eSkgOiBwcm94eTtcbiAgICAgICAgdGhpcy5wcm94eUhlYWRlcnMgPSBvcHRzPy5oZWFkZXJzID8/IHt9O1xuICAgICAgICBkZWJ1ZygnQ3JlYXRpbmcgbmV3IEh0dHBzUHJveHlBZ2VudCBpbnN0YW5jZTogJW8nLCB0aGlzLnByb3h5LmhyZWYpO1xuICAgICAgICAvLyBUcmltIG9mZiB0aGUgYnJhY2tldHMgZnJvbSBJUHY2IGFkZHJlc3Nlc1xuICAgICAgICBjb25zdCBob3N0ID0gKHRoaXMucHJveHkuaG9zdG5hbWUgfHwgdGhpcy5wcm94eS5ob3N0KS5yZXBsYWNlKC9eXFxbfFxcXSQvZywgJycpO1xuICAgICAgICBjb25zdCBwb3J0ID0gdGhpcy5wcm94eS5wb3J0XG4gICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMucHJveHkucG9ydCwgMTApXG4gICAgICAgICAgICA6IHRoaXMucHJveHkucHJvdG9jb2wgPT09ICdodHRwczonXG4gICAgICAgICAgICAgICAgPyA0NDNcbiAgICAgICAgICAgICAgICA6IDgwO1xuICAgICAgICB0aGlzLmNvbm5lY3RPcHRzID0ge1xuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBuZWdvdGlhdGUgaHR0cC8xLjEgZm9yIHByb3h5IHNlcnZlcnMgdGhhdCBzdXBwb3J0IGh0dHAvMlxuICAgICAgICAgICAgQUxQTlByb3RvY29sczogWydodHRwLzEuMSddLFxuICAgICAgICAgICAgLi4uKG9wdHMgPyBvbWl0KG9wdHMsICdoZWFkZXJzJykgOiBudWxsKSxcbiAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICBwb3J0LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbm9kZS1jb3JlIEhUVFAgY2xpZW50IGxpYnJhcnkgaXMgY3JlYXRpbmcgYVxuICAgICAqIG5ldyBIVFRQIHJlcXVlc3QuXG4gICAgICovXG4gICAgYXN5bmMgY29ubmVjdChyZXEsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFvcHRzLmhvc3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ05vIFwiaG9zdFwiIHByb3ZpZGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ3JlYXRlIGEgc29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIHByb3h5IHNlcnZlci5cbiAgICAgICAgbGV0IHNvY2tldDtcbiAgICAgICAgaWYgKHByb3h5LnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgICAgICAgZGVidWcoJ0NyZWF0aW5nIGB0bHMuU29ja2V0YDogJW8nLCB0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZlcm5hbWUgPSB0aGlzLmNvbm5lY3RPcHRzLnNlcnZlcm5hbWUgfHwgdGhpcy5jb25uZWN0T3B0cy5ob3N0O1xuICAgICAgICAgICAgc29ja2V0ID0gdGxzLmNvbm5lY3Qoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuY29ubmVjdE9wdHMsXG4gICAgICAgICAgICAgICAgc2VydmVybmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVidWcoJ0NyZWF0aW5nIGBuZXQuU29ja2V0YDogJW8nLCB0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIHNvY2tldCA9IG5ldC5jb25uZWN0KHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0eXBlb2YgdGhpcy5wcm94eUhlYWRlcnMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gdGhpcy5wcm94eUhlYWRlcnMoKVxuICAgICAgICAgICAgOiB7IC4uLnRoaXMucHJveHlIZWFkZXJzIH07XG4gICAgICAgIGNvbnN0IGhvc3QgPSBuZXQuaXNJUHY2KG9wdHMuaG9zdCkgPyBgWyR7b3B0cy5ob3N0fV1gIDogb3B0cy5ob3N0O1xuICAgICAgICBsZXQgcGF5bG9hZCA9IGBDT05ORUNUICR7aG9zdH06JHtvcHRzLnBvcnR9IEhUVFAvMS4xXFxyXFxuYDtcbiAgICAgICAgLy8gSW5qZWN0IHRoZSBgUHJveHktQXV0aG9yaXphdGlvbmAgaGVhZGVyIGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgaWYgKHByb3h5LnVzZXJuYW1lIHx8IHByb3h5LnBhc3N3b3JkKSB7XG4gICAgICAgICAgICBjb25zdCBhdXRoID0gYCR7ZGVjb2RlVVJJQ29tcG9uZW50KHByb3h5LnVzZXJuYW1lKX06JHtkZWNvZGVVUklDb21wb25lbnQocHJveHkucGFzc3dvcmQpfWA7XG4gICAgICAgICAgICBoZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtCdWZmZXIuZnJvbShhdXRoKS50b1N0cmluZygnYmFzZTY0Jyl9YDtcbiAgICAgICAgfVxuICAgICAgICBoZWFkZXJzLkhvc3QgPSBgJHtob3N0fToke29wdHMucG9ydH1gO1xuICAgICAgICBpZiAoIWhlYWRlcnNbJ1Byb3h5LUNvbm5lY3Rpb24nXSkge1xuICAgICAgICAgICAgaGVhZGVyc1snUHJveHktQ29ubmVjdGlvbiddID0gdGhpcy5rZWVwQWxpdmVcbiAgICAgICAgICAgICAgICA/ICdLZWVwLUFsaXZlJ1xuICAgICAgICAgICAgICAgIDogJ2Nsb3NlJztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoaGVhZGVycykpIHtcbiAgICAgICAgICAgIHBheWxvYWQgKz0gYCR7bmFtZX06ICR7aGVhZGVyc1tuYW1lXX1cXHJcXG5gO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3h5UmVzcG9uc2VQcm9taXNlID0gKDAsIHBhcnNlX3Byb3h5X3Jlc3BvbnNlXzEucGFyc2VQcm94eVJlc3BvbnNlKShzb2NrZXQpO1xuICAgICAgICBzb2NrZXQud3JpdGUoYCR7cGF5bG9hZH1cXHJcXG5gKTtcbiAgICAgICAgY29uc3QgeyBjb25uZWN0LCBidWZmZXJlZCB9ID0gYXdhaXQgcHJveHlSZXNwb25zZVByb21pc2U7XG4gICAgICAgIHJlcS5lbWl0KCdwcm94eUNvbm5lY3QnLCBjb25uZWN0KTtcbiAgICAgICAgdGhpcy5lbWl0KCdwcm94eUNvbm5lY3QnLCBjb25uZWN0LCByZXEpO1xuICAgICAgICBpZiAoY29ubmVjdC5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgICAgICAgIHJlcS5vbmNlKCdzb2NrZXQnLCByZXN1bWUpO1xuICAgICAgICAgICAgaWYgKG9wdHMuc2VjdXJlRW5kcG9pbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcHJveHkgaXMgY29ubmVjdGluZyB0byBhIFRMUyBzZXJ2ZXIsIHNvIHVwZ3JhZGVcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHNvY2tldCBjb25uZWN0aW9uIHRvIGEgVExTIGNvbm5lY3Rpb24uXG4gICAgICAgICAgICAgICAgZGVidWcoJ1VwZ3JhZGluZyBzb2NrZXQgY29ubmVjdGlvbiB0byBUTFMnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJ2ZXJuYW1lID0gb3B0cy5zZXJ2ZXJuYW1lIHx8IG9wdHMuaG9zdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGxzLmNvbm5lY3Qoe1xuICAgICAgICAgICAgICAgICAgICAuLi5vbWl0KG9wdHMsICdob3N0JywgJ3BhdGgnLCAncG9ydCcpLFxuICAgICAgICAgICAgICAgICAgICBzb2NrZXQsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlcm5hbWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc29ja2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvbWUgb3RoZXIgc3RhdHVzIGNvZGUgdGhhdCdzIG5vdCAyMDAuLi4gbmVlZCB0byByZS1wbGF5IHRoZSBIVFRQXG4gICAgICAgIC8vIGhlYWRlciBcImRhdGFcIiBldmVudHMgb250byB0aGUgc29ja2V0IG9uY2UgdGhlIEhUVFAgbWFjaGluZXJ5IGlzXG4gICAgICAgIC8vIGF0dGFjaGVkIHNvIHRoYXQgdGhlIG5vZGUgY29yZSBgaHR0cGAgY2FuIHBhcnNlIGFuZCBoYW5kbGUgdGhlXG4gICAgICAgIC8vIGVycm9yIHN0YXR1cyBjb2RlLlxuICAgICAgICAvLyBDbG9zZSB0aGUgb3JpZ2luYWwgc29ja2V0LCBhbmQgYSBuZXcgXCJmYWtlXCIgc29ja2V0IGlzIHJldHVybmVkXG4gICAgICAgIC8vIGluc3RlYWQsIHNvIHRoYXQgdGhlIHByb3h5IGRvZXNuJ3QgZ2V0IHRoZSBIVFRQIHJlcXVlc3RcbiAgICAgICAgLy8gd3JpdHRlbiB0byBpdCAod2hpY2ggbWF5IGNvbnRhaW4gYEF1dGhvcml6YXRpb25gIGhlYWRlcnMgb3Igb3RoZXJcbiAgICAgICAgLy8gc2Vuc2l0aXZlIGRhdGEpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTZWU6IGh0dHBzOi8vaGFja2Vyb25lLmNvbS9yZXBvcnRzLzU0MTUwMlxuICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICBjb25zdCBmYWtlU29ja2V0ID0gbmV3IG5ldC5Tb2NrZXQoeyB3cml0YWJsZTogZmFsc2UgfSk7XG4gICAgICAgIGZha2VTb2NrZXQucmVhZGFibGUgPSB0cnVlO1xuICAgICAgICAvLyBOZWVkIHRvIHdhaXQgZm9yIHRoZSBcInNvY2tldFwiIGV2ZW50IHRvIHJlLXBsYXkgdGhlIFwiZGF0YVwiIGV2ZW50cy5cbiAgICAgICAgcmVxLm9uY2UoJ3NvY2tldCcsIChzKSA9PiB7XG4gICAgICAgICAgICBkZWJ1ZygnUmVwbGF5aW5nIHByb3h5IGJ1ZmZlciBmb3IgZmFpbGVkIHJlcXVlc3QnKTtcbiAgICAgICAgICAgICgwLCBhc3NlcnRfMS5kZWZhdWx0KShzLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA+IDApO1xuICAgICAgICAgICAgLy8gUmVwbGF5IHRoZSBcImJ1ZmZlcmVkXCIgQnVmZmVyIG9udG8gdGhlIGZha2UgYHNvY2tldGAsIHNpbmNlIGF0XG4gICAgICAgICAgICAvLyB0aGlzIHBvaW50IHRoZSBIVFRQIG1vZHVsZSBtYWNoaW5lcnkgaGFzIGJlZW4gaG9va2VkIHVwIGZvclxuICAgICAgICAgICAgLy8gdGhlIHVzZXIuXG4gICAgICAgICAgICBzLnB1c2goYnVmZmVyZWQpO1xuICAgICAgICAgICAgcy5wdXNoKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZha2VTb2NrZXQ7XG4gICAgfVxufVxuSHR0cHNQcm94eUFnZW50LnByb3RvY29scyA9IFsnaHR0cCcsICdodHRwcyddO1xuZXhwb3J0cy5IdHRwc1Byb3h5QWdlbnQgPSBIdHRwc1Byb3h5QWdlbnQ7XG5mdW5jdGlvbiByZXN1bWUoc29ja2V0KSB7XG4gICAgc29ja2V0LnJlc3VtZSgpO1xufVxuZnVuY3Rpb24gb21pdChvYmosIC4uLmtleXMpIHtcbiAgICBjb25zdCByZXQgPSB7fTtcbiAgICBsZXQga2V5O1xuICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0W2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlUHJveHlSZXNwb25zZSA9IHZvaWQgMDtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2h0dHBzLXByb3h5LWFnZW50OnBhcnNlLXByb3h5LXJlc3BvbnNlJyk7XG5mdW5jdGlvbiBwYXJzZVByb3h5UmVzcG9uc2Uoc29ja2V0KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gd2UgbmVlZCB0byBidWZmZXIgYW55IEhUVFAgdHJhZmZpYyB0aGF0IGhhcHBlbnMgd2l0aCB0aGUgcHJveHkgYmVmb3JlIHdlIGdldFxuICAgICAgICAvLyB0aGUgQ09OTkVDVCByZXNwb25zZSwgc28gdGhhdCBpZiB0aGUgcmVzcG9uc2UgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBhbiBcIjIwMFwiXG4gICAgICAgIC8vIHJlc3BvbnNlIGNvZGUsIHRoZW4gd2UgY2FuIHJlLXBsYXkgdGhlIFwiZGF0YVwiIGV2ZW50cyBvbiB0aGUgc29ja2V0IG9uY2UgdGhlXG4gICAgICAgIC8vIEhUVFAgcGFyc2VyIGlzIGhvb2tlZCB1cC4uLlxuICAgICAgICBsZXQgYnVmZmVyc0xlbmd0aCA9IDA7XG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gcmVhZCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGIgPSBzb2NrZXQucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGIpXG4gICAgICAgICAgICAgICAgb25kYXRhKGIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNvY2tldC5vbmNlKCdyZWFkYWJsZScsIHJlYWQpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcigncmVhZGFibGUnLCByZWFkKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJveHkgY29ubmVjdGlvbiBlbmRlZCBiZWZvcmUgcmVjZWl2aW5nIENPTk5FQ1QgcmVzcG9uc2UnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb25lcnJvcihlcnIpIHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIGRlYnVnKCdvbmVycm9yICVvJywgZXJyKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG9uZGF0YShiKSB7XG4gICAgICAgICAgICBidWZmZXJzLnB1c2goYik7XG4gICAgICAgICAgICBidWZmZXJzTGVuZ3RoICs9IGIubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyZWQgPSBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMsIGJ1ZmZlcnNMZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgZW5kT2ZIZWFkZXJzID0gYnVmZmVyZWQuaW5kZXhPZignXFxyXFxuXFxyXFxuJyk7XG4gICAgICAgICAgICBpZiAoZW5kT2ZIZWFkZXJzID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgYnVmZmVyaW5nXG4gICAgICAgICAgICAgICAgZGVidWcoJ2hhdmUgbm90IHJlY2VpdmVkIGVuZCBvZiBIVFRQIGhlYWRlcnMgeWV0Li4uJyk7XG4gICAgICAgICAgICAgICAgcmVhZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclBhcnRzID0gYnVmZmVyZWRcbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgZW5kT2ZIZWFkZXJzKVxuICAgICAgICAgICAgICAgIC50b1N0cmluZygnYXNjaWknKVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnXFxyXFxuJyk7XG4gICAgICAgICAgICBjb25zdCBmaXJzdExpbmUgPSBoZWFkZXJQYXJ0cy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKCFmaXJzdExpbmUpIHtcbiAgICAgICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdObyBoZWFkZXIgcmVjZWl2ZWQgZnJvbSBwcm94eSBDT05ORUNUIHJlc3BvbnNlJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmlyc3RMaW5lUGFydHMgPSBmaXJzdExpbmUuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSArZmlyc3RMaW5lUGFydHNbMV07XG4gICAgICAgICAgICBjb25zdCBzdGF0dXNUZXh0ID0gZmlyc3RMaW5lUGFydHMuc2xpY2UoMikuam9pbignICcpO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgb2YgaGVhZGVyUGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcilcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDb2xvbiA9IGhlYWRlci5pbmRleE9mKCc6Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29sb24gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBJbnZhbGlkIGhlYWRlciBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2U6IFwiJHtoZWFkZXJ9XCJgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zbGljZSgwLCBmaXJzdENvbG9uKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZGVyLnNsaWNlKGZpcnN0Q29sb24gKyAxKS50cmltU3RhcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gaGVhZGVyc1trZXldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gW2N1cnJlbnQsIHZhbHVlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVidWcoJ2dvdCBwcm94eSBzZXJ2ZXIgcmVzcG9uc2U6ICVvICVvJywgZmlyc3RMaW5lLCBoZWFkZXJzKTtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgIGNvbm5lY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJ1ZmZlcmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ja2V0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgICAgICBzb2NrZXQub24oJ2VuZCcsIG9uZW5kKTtcbiAgICAgICAgcmVhZCgpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5wYXJzZVByb3h5UmVzcG9uc2UgPSBwYXJzZVByb3h5UmVzcG9uc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1wcm94eS1yZXNwb25zZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQWRkcmVzc0Vycm9yID0gdm9pZCAwO1xuY2xhc3MgQWRkcmVzc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHBhcnNlTWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0FkZHJlc3NFcnJvcic7XG4gICAgICAgIGlmIChwYXJzZU1lc3NhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VNZXNzYWdlID0gcGFyc2VNZXNzYWdlO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BZGRyZXNzRXJyb3IgPSBBZGRyZXNzRXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hZGRyZXNzLWVycm9yLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0NvcnJlY3QgPSBleHBvcnRzLmlzSW5TdWJuZXQgPSB2b2lkIDA7XG5mdW5jdGlvbiBpc0luU3VibmV0KGFkZHJlc3MpIHtcbiAgICBpZiAodGhpcy5zdWJuZXRNYXNrIDwgYWRkcmVzcy5zdWJuZXRNYXNrKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWFzayhhZGRyZXNzLnN1Ym5ldE1hc2spID09PSBhZGRyZXNzLm1hc2soKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0cy5pc0luU3VibmV0ID0gaXNJblN1Ym5ldDtcbmZ1bmN0aW9uIGlzQ29ycmVjdChkZWZhdWx0Qml0cykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmFkZHJlc3NNaW51c1N1ZmZpeCAhPT0gdGhpcy5jb3JyZWN0Rm9ybSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3VibmV0TWFzayA9PT0gZGVmYXVsdEJpdHMgJiYgIXRoaXMucGFyc2VkU3VibmV0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZWRTdWJuZXQgPT09IFN0cmluZyh0aGlzLnN1Ym5ldE1hc2spO1xuICAgIH07XG59XG5leHBvcnRzLmlzQ29ycmVjdCA9IGlzQ29ycmVjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbW1vbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy52NiA9IGV4cG9ydHMuQWRkcmVzc0Vycm9yID0gZXhwb3J0cy5BZGRyZXNzNiA9IGV4cG9ydHMuQWRkcmVzczQgPSB2b2lkIDA7XG5jb25zdCBpcHY0XzEgPSByZXF1aXJlKFwiLi9pcHY0XCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQWRkcmVzczRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGlwdjRfMS5BZGRyZXNzNDsgfSB9KTtcbmNvbnN0IGlwdjZfMSA9IHJlcXVpcmUoXCIuL2lwdjZcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBZGRyZXNzNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gaXB2Nl8xLkFkZHJlc3M2OyB9IH0pO1xuY29uc3QgYWRkcmVzc19lcnJvcl8xID0gcmVxdWlyZShcIi4vYWRkcmVzcy1lcnJvclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkFkZHJlc3NFcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcjsgfSB9KTtcbmNvbnN0IGhlbHBlcnMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vdjYvaGVscGVyc1wiKSk7XG5leHBvcnRzLnY2ID0geyBoZWxwZXJzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcC1hZGRyZXNzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BZGRyZXNzNCA9IHZvaWQgMDtcbmNvbnN0IGNvbW1vbiA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb21tb25cIikpO1xuY29uc3QgY29uc3RhbnRzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Y0L2NvbnN0YW50c1wiKSk7XG5jb25zdCBhZGRyZXNzX2Vycm9yXzEgPSByZXF1aXJlKFwiLi9hZGRyZXNzLWVycm9yXCIpO1xuY29uc3QganNibl8xID0gcmVxdWlyZShcImpzYm5cIik7XG5jb25zdCBzcHJpbnRmX2pzXzEgPSByZXF1aXJlKFwic3ByaW50Zi1qc1wiKTtcbi8qKlxuICogUmVwcmVzZW50cyBhbiBJUHY0IGFkZHJlc3NcbiAqIEBjbGFzcyBBZGRyZXNzNFxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSBBbiBJUHY0IGFkZHJlc3Mgc3RyaW5nXG4gKi9cbmNsYXNzIEFkZHJlc3M0IHtcbiAgICBjb25zdHJ1Y3RvcihhZGRyZXNzKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gY29uc3RhbnRzLkdST1VQUztcbiAgICAgICAgdGhpcy5wYXJzZWRBZGRyZXNzID0gW107XG4gICAgICAgIHRoaXMucGFyc2VkU3VibmV0ID0gJyc7XG4gICAgICAgIHRoaXMuc3VibmV0ID0gJy8zMic7XG4gICAgICAgIHRoaXMuc3VibmV0TWFzayA9IDMyO1xuICAgICAgICB0aGlzLnY0ID0gdHJ1ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBjb3JyZWN0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNDb3JyZWN0ID0gY29tbW9uLmlzQ29ycmVjdChjb25zdGFudHMuQklUUyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGFkZHJlc3MgaXMgaW4gdGhlIHN1Ym5ldCBvZiB0aGUgY3VycmVudCBhZGRyZXNzXG4gICAgICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzSW5TdWJuZXQgPSBjb21tb24uaXNJblN1Ym5ldDtcbiAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgICAgICAgY29uc3Qgc3VibmV0ID0gY29uc3RhbnRzLlJFX1NVQk5FVF9TVFJJTkcuZXhlYyhhZGRyZXNzKTtcbiAgICAgICAgaWYgKHN1Ym5ldCkge1xuICAgICAgICAgICAgdGhpcy5wYXJzZWRTdWJuZXQgPSBzdWJuZXRbMF0ucmVwbGFjZSgnLycsICcnKTtcbiAgICAgICAgICAgIHRoaXMuc3VibmV0TWFzayA9IHBhcnNlSW50KHRoaXMucGFyc2VkU3VibmV0LCAxMCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym5ldCA9IGAvJHt0aGlzLnN1Ym5ldE1hc2t9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLnN1Ym5ldE1hc2sgPCAwIHx8IHRoaXMuc3VibmV0TWFzayA+IGNvbnN0YW50cy5CSVRTKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoJ0ludmFsaWQgc3VibmV0IG1hc2suJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5yZXBsYWNlKGNvbnN0YW50cy5SRV9TVUJORVRfU1RSSU5HLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRyZXNzTWludXNTdWZmaXggPSBhZGRyZXNzO1xuICAgICAgICB0aGlzLnBhcnNlZEFkZHJlc3MgPSB0aGlzLnBhcnNlKGFkZHJlc3MpO1xuICAgIH1cbiAgICBzdGF0aWMgaXNWYWxpZChhZGRyZXNzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgICAgICAgICBuZXcgQWRkcmVzczQoYWRkcmVzcyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qXG4gICAgICogUGFyc2VzIGEgdjQgYWRkcmVzc1xuICAgICAqL1xuICAgIHBhcnNlKGFkZHJlc3MpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gYWRkcmVzcy5zcGxpdCgnLicpO1xuICAgICAgICBpZiAoIWFkZHJlc3MubWF0Y2goY29uc3RhbnRzLlJFX0FERFJFU1MpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcignSW52YWxpZCBJUHY0IGFkZHJlc3MuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdyb3VwcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29ycmVjdCBmb3JtIG9mIGFuIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGNvcnJlY3RGb3JtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZWRBZGRyZXNzLm1hcCgocGFydCkgPT4gcGFyc2VJbnQocGFydCwgMTApKS5qb2luKCcuJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgaGV4IHN0cmluZyB0byBhbiBJUHY0IGFkZHJlc3Mgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBoZXggLSBhIGhleCBzdHJpbmcgdG8gY29udmVydFxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUhleChoZXgpIHtcbiAgICAgICAgY29uc3QgcGFkZGVkID0gaGV4LnJlcGxhY2UoLzovZywgJycpLnBhZFN0YXJ0KDgsICcwJyk7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IFtdO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgaCA9IHBhZGRlZC5zbGljZShpLCBpICsgMik7XG4gICAgICAgICAgICBncm91cHMucHVzaChwYXJzZUludChoLCAxNikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQWRkcmVzczQoZ3JvdXBzLmpvaW4oJy4nKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIGludGVnZXIgaW50byBhIElQdjQgYWRkcmVzcyBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtpbnRlZ2VyfSBpbnRlZ2VyIC0gYSBudW1iZXIgdG8gY29udmVydFxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUludGVnZXIoaW50ZWdlcikge1xuICAgICAgICByZXR1cm4gQWRkcmVzczQuZnJvbUhleChpbnRlZ2VyLnRvU3RyaW5nKDE2KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBhZGRyZXNzIGZyb20gaW4tYWRkci5hcnBhIGZvcm1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFycGFGb3JtQWRkcmVzcyAtIGFuICdpbi1hZGRyLmFycGEnIGZvcm0gaXB2NCBhZGRyZXNzXG4gICAgICogQHJldHVybnMge0FkcmVzczR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgYWRkcmVzcyA9IEFkZHJlc3M0LmZyb21BcnBhKDQyLjIuMC4xOTIuaW4tYWRkci5hcnBhLilcbiAgICAgKiBhZGRyZXNzLmNvcnJlY3RGb3JtKCk7IC8vICcxOTIuMC4yLjQyJ1xuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tQXJwYShhcnBhRm9ybUFkZHJlc3MpIHtcbiAgICAgICAgLy8gcmVtb3ZlIGVuZGluZyBcIi5pbi1hZGRyLmFycGEuXCIgb3IganVzdCBcIi5cIlxuICAgICAgICBjb25zdCBsZWFkZXIgPSBhcnBhRm9ybUFkZHJlc3MucmVwbGFjZSgvKFxcLmluLWFkZHJcXC5hcnBhKT9cXC4kLywgJycpO1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gbGVhZGVyLnNwbGl0KCcuJykucmV2ZXJzZSgpLmpvaW4oJy4nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRyZXNzNChhZGRyZXNzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gSVB2NCBhZGRyZXNzIG9iamVjdCB0byBhIGhleCBzdHJpbmdcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRvSGV4KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZWRBZGRyZXNzLm1hcCgocGFydCkgPT4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJTAyeCcsIHBhcnNlSW50KHBhcnQsIDEwKSkpLmpvaW4oJzonKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gSVB2NCBhZGRyZXNzIG9iamVjdCB0byBhbiBhcnJheSBvZiBieXRlc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZWRBZGRyZXNzLm1hcCgocGFydCkgPT4gcGFyc2VJbnQocGFydCwgMTApKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gSVB2NCBhZGRyZXNzIG9iamVjdCB0byBhbiBJUHY2IGFkZHJlc3MgZ3JvdXBcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRvR3JvdXA2KCkge1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBbXTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25zdGFudHMuR1JPVVBTOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGhleCA9ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyUwMnglMDJ4JywgcGFyc2VJbnQodGhpcy5wYXJzZWRBZGRyZXNzW2ldLCAxMCksIHBhcnNlSW50KHRoaXMucGFyc2VkQWRkcmVzc1tpICsgMV0sIDEwKSk7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCgoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCcleCcsIHBhcnNlSW50KGhleCwgMTYpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dC5qb2luKCc6Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFkZHJlc3MgYXMgYSBCaWdJbnRlZ2VyXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0JpZ0ludGVnZXJ9XG4gICAgICovXG4gICAgYmlnSW50ZWdlcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBqc2JuXzEuQmlnSW50ZWdlcih0aGlzLnBhcnNlZEFkZHJlc3MubWFwKChuKSA9PiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclMDJ4JywgcGFyc2VJbnQobiwgMTApKSkuam9pbignJyksIDE2KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIGdldHRpbmcgc3RhcnQgYWRkcmVzcy5cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QmlnSW50ZWdlcn1cbiAgICAgKi9cbiAgICBfc3RhcnRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKHRoaXMubWFzaygpICsgJzAnLnJlcGVhdChjb25zdGFudHMuQklUUyAtIHRoaXMuc3VibmV0TWFzayksIDIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZmlyc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJyBzdWJuZXQuXG4gICAgICogT2Z0ZW4gcmVmZXJyZWQgdG8gYXMgdGhlIE5ldHdvcmsgQWRkcmVzcy5cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczR9XG4gICAgICovXG4gICAgc3RhcnRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gQWRkcmVzczQuZnJvbUJpZ0ludGVnZXIodGhpcy5fc3RhcnRBZGRyZXNzKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZmlyc3QgaG9zdCBhZGRyZXNzIGluIHRoZSByYW5nZSBnaXZlbiBieSB0aGlzIGFkZHJlc3MncyBzdWJuZXQgaWVcbiAgICAgKiB0aGUgZmlyc3QgYWRkcmVzcyBhZnRlciB0aGUgTmV0d29yayBBZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M0fVxuICAgICAqL1xuICAgIHN0YXJ0QWRkcmVzc0V4Y2x1c2l2ZSgpIHtcbiAgICAgICAgY29uc3QgYWRqdXN0ID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcxJyk7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNC5mcm9tQmlnSW50ZWdlcih0aGlzLl9zdGFydEFkZHJlc3MoKS5hZGQoYWRqdXN0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiBnZXR0aW5nIGVuZCBhZGRyZXNzLlxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtCaWdJbnRlZ2VyfVxuICAgICAqL1xuICAgIF9lbmRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKHRoaXMubWFzaygpICsgJzEnLnJlcGVhdChjb25zdGFudHMuQklUUyAtIHRoaXMuc3VibmV0TWFzayksIDIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBhZGRyZXNzIGluIHRoZSByYW5nZSBnaXZlbiBieSB0aGlzIGFkZHJlc3MnIHN1Ym5ldFxuICAgICAqIE9mdGVuIHJlZmVycmVkIHRvIGFzIHRoZSBCcm9hZGNhc3RcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczR9XG4gICAgICovXG4gICAgZW5kQWRkcmVzcygpIHtcbiAgICAgICAgcmV0dXJuIEFkZHJlc3M0LmZyb21CaWdJbnRlZ2VyKHRoaXMuX2VuZEFkZHJlc3MoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IGhvc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJ3Mgc3VibmV0IGllXG4gICAgICogdGhlIGxhc3QgYWRkcmVzcyBwcmlvciB0byB0aGUgQnJvYWRjYXN0IEFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczR9XG4gICAgICovXG4gICAgZW5kQWRkcmVzc0V4Y2x1c2l2ZSgpIHtcbiAgICAgICAgY29uc3QgYWRqdXN0ID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcxJyk7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNC5mcm9tQmlnSW50ZWdlcih0aGlzLl9lbmRBZGRyZXNzKCkuc3VidHJhY3QoYWRqdXN0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgQmlnSW50ZWdlciB0byBhIHY0IGFkZHJlc3Mgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7QmlnSW50ZWdlcn0gYmlnSW50ZWdlciAtIGEgQmlnSW50ZWdlciB0byBjb252ZXJ0XG4gICAgICogQHJldHVybnMge0FkZHJlc3M0fVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tQmlnSW50ZWdlcihiaWdJbnRlZ2VyKSB7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNC5mcm9tSW50ZWdlcihwYXJzZUludChiaWdJbnRlZ2VyLnRvU3RyaW5nKCksIDEwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IG4gYml0cyBvZiB0aGUgYWRkcmVzcywgZGVmYXVsdGluZyB0byB0aGVcbiAgICAgKiBzdWJuZXQgbWFza1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgbWFzayhtYXNrKSB7XG4gICAgICAgIGlmIChtYXNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1hc2sgPSB0aGlzLnN1Ym5ldE1hc2s7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qml0c0Jhc2UyKDAsIG1hc2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBiaXRzIGluIHRoZSBnaXZlbiByYW5nZSBhcyBhIGJhc2UtMiBzdHJpbmdcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldEJpdHNCYXNlMihzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmFyeVplcm9QYWQoKS5zbGljZShzdGFydCwgZW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSByZXZlcnNlZCBpcDYuYXJwYSBmb3JtIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMub21pdFN1ZmZpeCAtIG9taXQgdGhlIFwiaW4tYWRkci5hcnBhXCIgc3VmZml4XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICByZXZlcnNlRm9ybShvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldmVyc2VkID0gdGhpcy5jb3JyZWN0Rm9ybSgpLnNwbGl0KCcuJykucmV2ZXJzZSgpLmpvaW4oJy4nKTtcbiAgICAgICAgaWYgKG9wdGlvbnMub21pdFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldmVyc2VkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclcy5pbi1hZGRyLmFycGEuJywgcmV2ZXJzZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGFkZHJlc3MgaXMgYSBtdWx0aWNhc3QgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzTXVsdGljYXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0luU3VibmV0KG5ldyBBZGRyZXNzNCgnMjI0LjAuMC4wLzQnKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB6ZXJvLXBhZGRlZCBiYXNlLTIgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBiaW5hcnlaZXJvUGFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWdJbnRlZ2VyKCkudG9TdHJpbmcoMikucGFkU3RhcnQoY29uc3RhbnRzLkJJVFMsICcwJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdyb3VwcyBhbiBJUHY0IGFkZHJlc3MgZm9yIGluY2x1c2lvbiBhdCB0aGUgZW5kIG9mIGFuIElQdjYgYWRkcmVzc1xuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ3JvdXBGb3JWNigpIHtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSB0aGlzLnBhcnNlZEFkZHJlc3M7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3MucmVwbGFjZShjb25zdGFudHMuUkVfQUREUkVTUywgKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnPHNwYW4gY2xhc3M9XCJob3Zlci1ncm91cCBncm91cC12NCBncm91cC02XCI+JXM8L3NwYW4+LjxzcGFuIGNsYXNzPVwiaG92ZXItZ3JvdXAgZ3JvdXAtdjQgZ3JvdXAtN1wiPiVzPC9zcGFuPicsIHNlZ21lbnRzLnNsaWNlKDAsIDIpLmpvaW4oJy4nKSwgc2VnbWVudHMuc2xpY2UoMiwgNCkuam9pbignLicpKSk7XG4gICAgfVxufVxuZXhwb3J0cy5BZGRyZXNzNCA9IEFkZHJlc3M0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXB2NC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qIGVzbGludC1kaXNhYmxlIHByZWZlci1kZXN0cnVjdHVyaW5nICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFkZHJlc3M2ID0gdm9pZCAwO1xuY29uc3QgY29tbW9uID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbW1vblwiKSk7XG5jb25zdCBjb25zdGFudHM0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Y0L2NvbnN0YW50c1wiKSk7XG5jb25zdCBjb25zdGFudHM2ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Y2L2NvbnN0YW50c1wiKSk7XG5jb25zdCBoZWxwZXJzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Y2L2hlbHBlcnNcIikpO1xuY29uc3QgaXB2NF8xID0gcmVxdWlyZShcIi4vaXB2NFwiKTtcbmNvbnN0IHJlZ3VsYXJfZXhwcmVzc2lvbnNfMSA9IHJlcXVpcmUoXCIuL3Y2L3JlZ3VsYXItZXhwcmVzc2lvbnNcIik7XG5jb25zdCBhZGRyZXNzX2Vycm9yXzEgPSByZXF1aXJlKFwiLi9hZGRyZXNzLWVycm9yXCIpO1xuY29uc3QganNibl8xID0gcmVxdWlyZShcImpzYm5cIik7XG5jb25zdCBzcHJpbnRmX2pzXzEgPSByZXF1aXJlKFwic3ByaW50Zi1qc1wiKTtcbmZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24pIHtcbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fzc2VydGlvbiBmYWlsZWQuJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkQ29tbWFzKG51bWJlcikge1xuICAgIGNvbnN0IHIgPSAvKFxcZCspKFxcZHszfSkvO1xuICAgIHdoaWxlIChyLnRlc3QobnVtYmVyKSkge1xuICAgICAgICBudW1iZXIgPSBudW1iZXIucmVwbGFjZShyLCAnJDEsJDInKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bWJlcjtcbn1cbmZ1bmN0aW9uIHNwYW5MZWFkaW5nWmVyb2VzNChuKSB7XG4gICAgbiA9IG4ucmVwbGFjZSgvXigwezEsfSkoWzEtOV0rKSQvLCAnPHNwYW4gY2xhc3M9XCJwYXJzZS1lcnJvclwiPiQxPC9zcGFuPiQyJyk7XG4gICAgbiA9IG4ucmVwbGFjZSgvXigwezEsfSkoMCkkLywgJzxzcGFuIGNsYXNzPVwicGFyc2UtZXJyb3JcIj4kMTwvc3Bhbj4kMicpO1xuICAgIHJldHVybiBuO1xufVxuLypcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNvbXBhY3QgYW4gYXJyYXlcbiAqL1xuZnVuY3Rpb24gY29tcGFjdChhZGRyZXNzLCBzbGljZSkge1xuICAgIGNvbnN0IHMxID0gW107XG4gICAgY29uc3QgczIgPSBbXTtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgYWRkcmVzcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSA8IHNsaWNlWzBdKSB7XG4gICAgICAgICAgICBzMS5wdXNoKGFkZHJlc3NbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGkgPiBzbGljZVsxXSkge1xuICAgICAgICAgICAgczIucHVzaChhZGRyZXNzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gczEuY29uY2F0KFsnY29tcGFjdCddKS5jb25jYXQoczIpO1xufVxuZnVuY3Rpb24gcGFkZGVkSGV4KG9jdGV0KSB7XG4gICAgcmV0dXJuICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyUwNHgnLCBwYXJzZUludChvY3RldCwgMTYpKTtcbn1cbmZ1bmN0aW9uIHVuc2lnbkJ5dGUoYikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgcmV0dXJuIGIgJiAweGZmO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIElQdjYgYWRkcmVzc1xuICogQGNsYXNzIEFkZHJlc3M2XG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIEFuIElQdjYgYWRkcmVzcyBzdHJpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZ3JvdXBzPThdIC0gSG93IG1hbnkgb2N0ZXRzIHRvIHBhcnNlXG4gKiBAZXhhbXBsZVxuICogdmFyIGFkZHJlc3MgPSBuZXcgQWRkcmVzczYoJzIwMDE6Oi8zMicpO1xuICovXG5jbGFzcyBBZGRyZXNzNiB7XG4gICAgY29uc3RydWN0b3IoYWRkcmVzcywgb3B0aW9uYWxHcm91cHMpIHtcbiAgICAgICAgdGhpcy5hZGRyZXNzTWludXNTdWZmaXggPSAnJztcbiAgICAgICAgdGhpcy5wYXJzZWRTdWJuZXQgPSAnJztcbiAgICAgICAgdGhpcy5zdWJuZXQgPSAnLzEyOCc7XG4gICAgICAgIHRoaXMuc3VibmV0TWFzayA9IDEyODtcbiAgICAgICAgdGhpcy52NCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnpvbmUgPSAnJztcbiAgICAgICAgLy8gI3JlZ2lvbiBBdHRyaWJ1dGVzXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGFkZHJlc3MgaXMgaW4gdGhlIHN1Ym5ldCBvZiB0aGUgY3VycmVudCBhZGRyZXNzXG4gICAgICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzSW5TdWJuZXQgPSBjb21tb24uaXNJblN1Ym5ldDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBjb3JyZWN0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNDb3JyZWN0ID0gY29tbW9uLmlzQ29ycmVjdChjb25zdGFudHM2LkJJVFMpO1xuICAgICAgICBpZiAob3B0aW9uYWxHcm91cHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5ncm91cHMgPSBjb25zdGFudHM2LkdST1VQUztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzID0gb3B0aW9uYWxHcm91cHM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgICAgICAgY29uc3Qgc3VibmV0ID0gY29uc3RhbnRzNi5SRV9TVUJORVRfU1RSSU5HLmV4ZWMoYWRkcmVzcyk7XG4gICAgICAgIGlmIChzdWJuZXQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkU3VibmV0ID0gc3VibmV0WzBdLnJlcGxhY2UoJy8nLCAnJyk7XG4gICAgICAgICAgICB0aGlzLnN1Ym5ldE1hc2sgPSBwYXJzZUludCh0aGlzLnBhcnNlZFN1Ym5ldCwgMTApO1xuICAgICAgICAgICAgdGhpcy5zdWJuZXQgPSBgLyR7dGhpcy5zdWJuZXRNYXNrfWA7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHRoaXMuc3VibmV0TWFzaykgfHxcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym5ldE1hc2sgPCAwIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJuZXRNYXNrID4gY29uc3RhbnRzNi5CSVRTKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoJ0ludmFsaWQgc3VibmV0IG1hc2suJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5yZXBsYWNlKGNvbnN0YW50czYuUkVfU1VCTkVUX1NUUklORywgJycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKC9cXC8vLnRlc3QoYWRkcmVzcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKCdJbnZhbGlkIHN1Ym5ldCBtYXNrLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHpvbmUgPSBjb25zdGFudHM2LlJFX1pPTkVfU1RSSU5HLmV4ZWMoYWRkcmVzcyk7XG4gICAgICAgIGlmICh6b25lKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUgPSB6b25lWzBdO1xuICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MucmVwbGFjZShjb25zdGFudHM2LlJFX1pPTkVfU1RSSU5HLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRyZXNzTWludXNTdWZmaXggPSBhZGRyZXNzO1xuICAgICAgICB0aGlzLnBhcnNlZEFkZHJlc3MgPSB0aGlzLnBhcnNlKHRoaXMuYWRkcmVzc01pbnVzU3VmZml4KTtcbiAgICB9XG4gICAgc3RhdGljIGlzVmFsaWQoYWRkcmVzcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgICAgICAgICAgbmV3IEFkZHJlc3M2KGFkZHJlc3MpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGEgQmlnSW50ZWdlciB0byBhIHY2IGFkZHJlc3Mgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7QmlnSW50ZWdlcn0gYmlnSW50ZWdlciAtIGEgQmlnSW50ZWdlciB0byBjb252ZXJ0XG4gICAgICogQHJldHVybnMge0FkZHJlc3M2fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGJpZ0ludGVnZXIgPSBuZXcgQmlnSW50ZWdlcignMTAwMDAwMDAwMDAwMCcpO1xuICAgICAqIHZhciBhZGRyZXNzID0gQWRkcmVzczYuZnJvbUJpZ0ludGVnZXIoYmlnSW50ZWdlcik7XG4gICAgICogYWRkcmVzcy5jb3JyZWN0Rm9ybSgpOyAvLyAnOjplODpkNGE1OjEwMDAnXG4gICAgICovXG4gICAgc3RhdGljIGZyb21CaWdJbnRlZ2VyKGJpZ0ludGVnZXIpIHtcbiAgICAgICAgY29uc3QgaGV4ID0gYmlnSW50ZWdlci50b1N0cmluZygxNikucGFkU3RhcnQoMzIsICcwJyk7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IFtdO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnN0YW50czYuR1JPVVBTOyBpKyspIHtcbiAgICAgICAgICAgIGdyb3Vwcy5wdXNoKGhleC5zbGljZShpICogNCwgKGkgKyAxKSAqIDQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFkZHJlc3M2KGdyb3Vwcy5qb2luKCc6JykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGEgVVJMICh3aXRoIG9wdGlvbmFsIHBvcnQgbnVtYmVyKSB0byBhbiBhZGRyZXNzIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gYSBVUkwgd2l0aCBvcHRpb25hbCBwb3J0IG51bWJlclxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFkZHJlc3NBbmRQb3J0ID0gQWRkcmVzczYuZnJvbVVSTCgnaHR0cDovL1tmZmZmOjpdOjgwODAvZm9vLycpO1xuICAgICAqIGFkZHJlc3NBbmRQb3J0LmFkZHJlc3MuY29ycmVjdEZvcm0oKTsgLy8gJ2ZmZmY6OidcbiAgICAgKiBhZGRyZXNzQW5kUG9ydC5wb3J0OyAvLyA4MDgwXG4gICAgICovXG4gICAgc3RhdGljIGZyb21VUkwodXJsKSB7XG4gICAgICAgIGxldCBob3N0O1xuICAgICAgICBsZXQgcG9ydCA9IG51bGw7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYnJhY2tldHMgcGFyc2UgdGhlbSBhbmQgZmluZCBhIHBvcnRcbiAgICAgICAgaWYgKHVybC5pbmRleE9mKCdbJykgIT09IC0xICYmIHVybC5pbmRleE9mKCddOicpICE9PSAtMSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gY29uc3RhbnRzNi5SRV9VUkxfV0lUSF9QT1JULmV4ZWModXJsKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcjogJ2ZhaWxlZCB0byBwYXJzZSBhZGRyZXNzIHdpdGggcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhvc3QgPSByZXN1bHRbMV07XG4gICAgICAgICAgICBwb3J0ID0gcmVzdWx0WzJdO1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIFVSTCBleHRyYWN0IHRoZSBhZGRyZXNzXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodXJsLmluZGV4T2YoJy8nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcHJvdG9jb2wgcHJlZml4XG4gICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgvXlthLXowLTldKzpcXC9cXC8vLCAnJyk7XG4gICAgICAgICAgICAvLyBQYXJzZSB0aGUgYWRkcmVzc1xuICAgICAgICAgICAgcmVzdWx0ID0gY29uc3RhbnRzNi5SRV9VUkwuZXhlYyh1cmwpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAnZmFpbGVkIHRvIHBhcnNlIGFkZHJlc3MgZnJvbSBVUkwnLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBob3N0ID0gcmVzdWx0WzFdO1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGp1c3QgYXNzaWduIHRoZSBVUkwgdG8gdGhlIGhvc3QgYW5kIGxldCB0aGUgbGlicmFyeSBwYXJzZSBpdFxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaG9zdCA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGVyZSdzIGEgcG9ydCBjb252ZXJ0IGl0IHRvIGFuIGludGVnZXJcbiAgICAgICAgaWYgKHBvcnQpIHtcbiAgICAgICAgICAgIHBvcnQgPSBwYXJzZUludChwb3J0LCAxMCk7XG4gICAgICAgICAgICAvLyBzcXVlbGNoIG91dCBvZiByYW5nZSBwb3J0c1xuICAgICAgICAgICAgaWYgKHBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNikge1xuICAgICAgICAgICAgICAgIHBvcnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gU3RhbmRhcmRpemUgYHVuZGVmaW5lZGAgdG8gYG51bGxgXG4gICAgICAgICAgICBwb3J0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWRkcmVzczogbmV3IEFkZHJlc3M2KGhvc3QpLFxuICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIElQdjYtbWFwcGVkIGFkZHJlc3MgZ2l2ZW4gYW4gSVB2NCBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gQW4gSVB2NCBhZGRyZXNzIHN0cmluZ1xuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNn1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBhZGRyZXNzID0gQWRkcmVzczYuZnJvbUFkZHJlc3M0KCcxOTIuMTY4LjAuMScpO1xuICAgICAqIGFkZHJlc3MuY29ycmVjdEZvcm0oKTsgLy8gJzo6ZmZmZjpjMGE4OjEnXG4gICAgICogYWRkcmVzcy50bzRpbjYoKTsgLy8gJzo6ZmZmZjoxOTIuMTY4LjAuMSdcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUFkZHJlc3M0KGFkZHJlc3MpIHtcbiAgICAgICAgY29uc3QgYWRkcmVzczQgPSBuZXcgaXB2NF8xLkFkZHJlc3M0KGFkZHJlc3MpO1xuICAgICAgICBjb25zdCBtYXNrNiA9IGNvbnN0YW50czYuQklUUyAtIChjb25zdGFudHM0LkJJVFMgLSBhZGRyZXNzNC5zdWJuZXRNYXNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBZGRyZXNzNihgOjpmZmZmOiR7YWRkcmVzczQuY29ycmVjdEZvcm0oKX0vJHttYXNrNn1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuIGFkZHJlc3MgZnJvbSBpcDYuYXJwYSBmb3JtXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcnBhRm9ybUFkZHJlc3MgLSBhbiAnaXA2LmFycGEnIGZvcm0gYWRkcmVzc1xuICAgICAqIEByZXR1cm5zIHtBZHJlc3M2fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFkZHJlc3MgPSBBZGRyZXNzNi5mcm9tQXJwYShlLmYuZi5mLjMuYy4yLjYuZi5mLmYuZS42LjYuOC5lLjEuMC42LjcuOS40LmUuYy4wLjAuMC4wLjEuMC4wLjIuaXA2LmFycGEuKVxuICAgICAqIGFkZHJlc3MuY29ycmVjdEZvcm0oKTsgLy8gJzIwMDE6MDpjZTQ5Ojc2MDE6ZTg2NjplZmZmOjYyYzM6ZmZmZSdcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUFycGEoYXJwYUZvcm1BZGRyZXNzKSB7XG4gICAgICAgIC8vIHJlbW92ZSBlbmRpbmcgXCIuaXA2LmFycGEuXCIgb3IganVzdCBcIi5cIlxuICAgICAgICBsZXQgYWRkcmVzcyA9IGFycGFGb3JtQWRkcmVzcy5yZXBsYWNlKC8oXFwuaXA2XFwuYXJwYSk/XFwuJC8sICcnKTtcbiAgICAgICAgY29uc3Qgc2VtaWNvbG9uQW1vdW50ID0gNztcbiAgICAgICAgLy8gY29ycmVjdCBpcDYuYXJwYSBmb3JtIHdpdGggZW5kaW5nIHJlbW92ZWQgd2lsbCBiZSA2MyBjaGFyYWN0ZXJzXG4gICAgICAgIGlmIChhZGRyZXNzLmxlbmd0aCAhPT0gNjMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKFwiSW52YWxpZCAnaXA2LmFycGEnIGZvcm0uXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnRzID0gYWRkcmVzcy5zcGxpdCgnLicpLnJldmVyc2UoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNlbWljb2xvbkFtb3VudDsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBpICogNDtcbiAgICAgICAgICAgIHBhcnRzLnNwbGljZShpbnNlcnRJbmRleCwgMCwgJzonKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRyZXNzID0gcGFydHMuam9pbignJyk7XG4gICAgICAgIHJldHVybiBuZXcgQWRkcmVzczYoYWRkcmVzcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgTWljcm9zb2Z0IFVOQyB0cmFuc2NyaXB0aW9uIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIE1pY3Jvc29mdCBVTkMgdHJhbnNjcmlwdGlvbiBvZiB0aGUgYWRkcmVzc1xuICAgICAqL1xuICAgIG1pY3Jvc29mdFRyYW5zY3JpcHRpb24oKSB7XG4gICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclcy5pcHY2LWxpdGVyYWwubmV0JywgdGhpcy5jb3JyZWN0Rm9ybSgpLnJlcGxhY2UoLzovZywgJy0nKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgZmlyc3QgbiBiaXRzIG9mIHRoZSBhZGRyZXNzLCBkZWZhdWx0aW5nIHRvIHRoZSBzdWJuZXQgbWFza1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbWFzaz1zdWJuZXRdIC0gdGhlIG51bWJlciBvZiBiaXRzIHRvIG1hc2tcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgZmlyc3QgbiBiaXRzIG9mIHRoZSBhZGRyZXNzIGFzIGEgc3RyaW5nXG4gICAgICovXG4gICAgbWFzayhtYXNrID0gdGhpcy5zdWJuZXRNYXNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJpdHNCYXNlMigwLCBtYXNrKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcG9zc2libGUgc3VibmV0cyBvZiBhIGdpdmVuIHNpemUgaW4gdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9MTI4XSAtIHRoZSBzdWJuZXQgc2l6ZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgLy8gVE9ETzogcHJvYmFibHkgdXNlZnVsIHRvIGhhdmUgYSBudW1lcmljIHZlcnNpb24gb2YgdGhpcyB0b29cbiAgICBwb3NzaWJsZVN1Ym5ldHMoc3VibmV0U2l6ZSA9IDEyOCkge1xuICAgICAgICBjb25zdCBhdmFpbGFibGVCaXRzID0gY29uc3RhbnRzNi5CSVRTIC0gdGhpcy5zdWJuZXRNYXNrO1xuICAgICAgICBjb25zdCBzdWJuZXRCaXRzID0gTWF0aC5hYnMoc3VibmV0U2l6ZSAtIGNvbnN0YW50czYuQklUUyk7XG4gICAgICAgIGNvbnN0IHN1Ym5ldFBvd2VycyA9IGF2YWlsYWJsZUJpdHMgLSBzdWJuZXRCaXRzO1xuICAgICAgICBpZiAoc3VibmV0UG93ZXJzIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuICcwJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkQ29tbWFzKG5ldyBqc2JuXzEuQmlnSW50ZWdlcignMicsIDEwKS5wb3coc3VibmV0UG93ZXJzKS50b1N0cmluZygxMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZ2V0dGluZyBzdGFydCBhZGRyZXNzLlxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtCaWdJbnRlZ2VyfVxuICAgICAqL1xuICAgIF9zdGFydEFkZHJlc3MoKSB7XG4gICAgICAgIHJldHVybiBuZXcganNibl8xLkJpZ0ludGVnZXIodGhpcy5tYXNrKCkgKyAnMCcucmVwZWF0KGNvbnN0YW50czYuQklUUyAtIHRoaXMuc3VibmV0TWFzayksIDIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZmlyc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJyBzdWJuZXRcbiAgICAgKiBPZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgTmV0d29yayBBZGRyZXNzLlxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNn1cbiAgICAgKi9cbiAgICBzdGFydEFkZHJlc3MoKSB7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNi5mcm9tQmlnSW50ZWdlcih0aGlzLl9zdGFydEFkZHJlc3MoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBob3N0IGFkZHJlc3MgaW4gdGhlIHJhbmdlIGdpdmVuIGJ5IHRoaXMgYWRkcmVzcydzIHN1Ym5ldCBpZVxuICAgICAqIHRoZSBmaXJzdCBhZGRyZXNzIGFmdGVyIHRoZSBOZXR3b3JrIEFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICovXG4gICAgc3RhcnRBZGRyZXNzRXhjbHVzaXZlKCkge1xuICAgICAgICBjb25zdCBhZGp1c3QgPSBuZXcganNibl8xLkJpZ0ludGVnZXIoJzEnKTtcbiAgICAgICAgcmV0dXJuIEFkZHJlc3M2LmZyb21CaWdJbnRlZ2VyKHRoaXMuX3N0YXJ0QWRkcmVzcygpLmFkZChhZGp1c3QpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIGdldHRpbmcgZW5kIGFkZHJlc3MuXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0JpZ0ludGVnZXJ9XG4gICAgICovXG4gICAgX2VuZEFkZHJlc3MoKSB7XG4gICAgICAgIHJldHVybiBuZXcganNibl8xLkJpZ0ludGVnZXIodGhpcy5tYXNrKCkgKyAnMScucmVwZWF0KGNvbnN0YW50czYuQklUUyAtIHRoaXMuc3VibmV0TWFzayksIDIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBhZGRyZXNzIGluIHRoZSByYW5nZSBnaXZlbiBieSB0aGlzIGFkZHJlc3MnIHN1Ym5ldFxuICAgICAqIE9mdGVuIHJlZmVycmVkIHRvIGFzIHRoZSBCcm9hZGNhc3RcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICovXG4gICAgZW5kQWRkcmVzcygpIHtcbiAgICAgICAgcmV0dXJuIEFkZHJlc3M2LmZyb21CaWdJbnRlZ2VyKHRoaXMuX2VuZEFkZHJlc3MoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IGhvc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJ3Mgc3VibmV0IGllXG4gICAgICogdGhlIGxhc3QgYWRkcmVzcyBwcmlvciB0byB0aGUgQnJvYWRjYXN0IEFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICovXG4gICAgZW5kQWRkcmVzc0V4Y2x1c2l2ZSgpIHtcbiAgICAgICAgY29uc3QgYWRqdXN0ID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcxJyk7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNi5mcm9tQmlnSW50ZWdlcih0aGlzLl9lbmRBZGRyZXNzKCkuc3VidHJhY3QoYWRqdXN0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgc2NvcGUgb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldFNjb3BlKCkge1xuICAgICAgICBsZXQgc2NvcGUgPSBjb25zdGFudHM2LlNDT1BFU1t0aGlzLmdldEJpdHMoMTIsIDE2KS5pbnRWYWx1ZSgpXTtcbiAgICAgICAgaWYgKHRoaXMuZ2V0VHlwZSgpID09PSAnR2xvYmFsIHVuaWNhc3QnICYmIHNjb3BlICE9PSAnTGluayBsb2NhbCcpIHtcbiAgICAgICAgICAgIHNjb3BlID0gJ0dsb2JhbCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjb3BlIHx8ICdVbmtub3duJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRUeXBlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHN1Ym5ldCBvZiBPYmplY3Qua2V5cyhjb25zdGFudHM2LlRZUEVTKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNJblN1Ym5ldChuZXcgQWRkcmVzczYoc3VibmV0KSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RhbnRzNi5UWVBFU1tzdWJuZXRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnR2xvYmFsIHVuaWNhc3QnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGJpdHMgaW4gdGhlIGdpdmVuIHJhbmdlIGFzIGEgQmlnSW50ZWdlclxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtCaWdJbnRlZ2VyfVxuICAgICAqL1xuICAgIGdldEJpdHMoc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKHRoaXMuZ2V0Qml0c0Jhc2UyKHN0YXJ0LCBlbmQpLCAyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBiaXRzIGluIHRoZSBnaXZlbiByYW5nZSBhcyBhIGJhc2UtMiBzdHJpbmdcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldEJpdHNCYXNlMihzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmFyeVplcm9QYWQoKS5zbGljZShzdGFydCwgZW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBiaXRzIGluIHRoZSBnaXZlbiByYW5nZSBhcyBhIGJhc2UtMTYgc3RyaW5nXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRCaXRzQmFzZTE2KHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7XG4gICAgICAgIGlmIChsZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xlbmd0aCBvZiBiaXRzIHRvIHJldHJpZXZlIG11c3QgYmUgZGl2aXNpYmxlIGJ5IGZvdXInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZXRCaXRzKHN0YXJ0LCBlbmQpXG4gICAgICAgICAgICAudG9TdHJpbmcoMTYpXG4gICAgICAgICAgICAucGFkU3RhcnQobGVuZ3RoIC8gNCwgJzAnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBiaXRzIHRoYXQgYXJlIHNldCBwYXN0IHRoZSBzdWJuZXQgbWFzayBsZW5ndGhcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdldEJpdHNQYXN0U3VibmV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCaXRzQmFzZTIodGhpcy5zdWJuZXRNYXNrLCBjb25zdGFudHM2LkJJVFMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHJldmVyc2VkIGlwNi5hcnBhIGZvcm0gb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5vbWl0U3VmZml4IC0gb21pdCB0aGUgXCJpcDYuYXJwYVwiIHN1ZmZpeFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgcmV2ZXJzZUZvcm0ob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGFyYWN0ZXJzID0gTWF0aC5mbG9vcih0aGlzLnN1Ym5ldE1hc2sgLyA0KTtcbiAgICAgICAgY29uc3QgcmV2ZXJzZWQgPSB0aGlzLmNhbm9uaWNhbEZvcm0oKVxuICAgICAgICAgICAgLnJlcGxhY2UoLzovZywgJycpXG4gICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAuc2xpY2UoMCwgY2hhcmFjdGVycylcbiAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgIC5qb2luKCcuJyk7XG4gICAgICAgIGlmIChjaGFyYWN0ZXJzID4gMCkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMub21pdFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXZlcnNlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclcy5pcDYuYXJwYS4nLCByZXZlcnNlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMub21pdFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnaXA2LmFycGEuJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBjb3JyZWN0IGZvcm0gb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGNvcnJlY3RGb3JtKCkge1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgbGV0IGdyb3VwcyA9IFtdO1xuICAgICAgICBsZXQgemVyb0NvdW50ZXIgPSAwO1xuICAgICAgICBjb25zdCB6ZXJvZXMgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMucGFyc2VkQWRkcmVzcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUludCh0aGlzLnBhcnNlZEFkZHJlc3NbaV0sIDE2KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHplcm9Db3VudGVyKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IDAgJiYgemVyb0NvdW50ZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHplcm9Db3VudGVyID4gMSkge1xuICAgICAgICAgICAgICAgICAgICB6ZXJvZXMucHVzaChbaSAtIHplcm9Db3VudGVyLCBpIC0gMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB6ZXJvQ291bnRlciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG8gd2UgZW5kIHdpdGggYSBzdHJpbmcgb2YgemVyb2VzP1xuICAgICAgICBpZiAoemVyb0NvdW50ZXIgPiAxKSB7XG4gICAgICAgICAgICB6ZXJvZXMucHVzaChbdGhpcy5wYXJzZWRBZGRyZXNzLmxlbmd0aCAtIHplcm9Db3VudGVyLCB0aGlzLnBhcnNlZEFkZHJlc3MubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHplcm9MZW5ndGhzID0gemVyb2VzLm1hcCgobikgPT4gblsxXSAtIG5bMF0gKyAxKTtcbiAgICAgICAgaWYgKHplcm9lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHplcm9MZW5ndGhzLmluZGV4T2YoTWF0aC5tYXgoLi4uemVyb0xlbmd0aHMpKTtcbiAgICAgICAgICAgIGdyb3VwcyA9IGNvbXBhY3QodGhpcy5wYXJzZWRBZGRyZXNzLCB6ZXJvZXNbaW5kZXhdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGdyb3VwcyA9IHRoaXMucGFyc2VkQWRkcmVzcztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZ3JvdXBzW2ldICE9PSAnY29tcGFjdCcpIHtcbiAgICAgICAgICAgICAgICBncm91cHNbaV0gPSBwYXJzZUludChncm91cHNbaV0sIDE2KS50b1N0cmluZygxNik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvcnJlY3QgPSBncm91cHMuam9pbignOicpO1xuICAgICAgICBjb3JyZWN0ID0gY29ycmVjdC5yZXBsYWNlKC9eY29tcGFjdCQvLCAnOjonKTtcbiAgICAgICAgY29ycmVjdCA9IGNvcnJlY3QucmVwbGFjZSgvXmNvbXBhY3R8Y29tcGFjdCQvLCAnOicpO1xuICAgICAgICBjb3JyZWN0ID0gY29ycmVjdC5yZXBsYWNlKC9jb21wYWN0LywgJycpO1xuICAgICAgICByZXR1cm4gY29ycmVjdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgemVyby1wYWRkZWQgYmFzZS0yIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgYWRkcmVzcyA9IG5ldyBBZGRyZXNzNignMjAwMTo0ODYwOjQwMDE6ODAzOjoxMDExJyk7XG4gICAgICogYWRkcmVzcy5iaW5hcnlaZXJvUGFkKCk7XG4gICAgICogLy8gJzAwMTAwMDAwMDAwMDAwMDEwMTAwMTAwMDAxMTAwMDAwMDEwMDAwMDAwMDAwMDAwMTAwMDAxMDAwMDAwMDAwMTFcbiAgICAgKiAvLyAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAxMDAwMSdcbiAgICAgKi9cbiAgICBiaW5hcnlaZXJvUGFkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaWdJbnRlZ2VyKCkudG9TdHJpbmcoMikucGFkU3RhcnQoY29uc3RhbnRzNi5CSVRTLCAnMCcpO1xuICAgIH1cbiAgICAvLyBUT0RPOiBJbXByb3ZlIHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyBoZWxwZXIgZnVuY3Rpb25cbiAgICBwYXJzZTRpbjYoYWRkcmVzcykge1xuICAgICAgICBjb25zdCBncm91cHMgPSBhZGRyZXNzLnNwbGl0KCc6Jyk7XG4gICAgICAgIGNvbnN0IGxhc3RHcm91cCA9IGdyb3Vwcy5zbGljZSgtMSlbMF07XG4gICAgICAgIGNvbnN0IGFkZHJlc3M0ID0gbGFzdEdyb3VwLm1hdGNoKGNvbnN0YW50czQuUkVfQUREUkVTUyk7XG4gICAgICAgIGlmIChhZGRyZXNzNCkge1xuICAgICAgICAgICAgdGhpcy5wYXJzZWRBZGRyZXNzNCA9IGFkZHJlc3M0WzBdO1xuICAgICAgICAgICAgdGhpcy5hZGRyZXNzNCA9IG5ldyBpcHY0XzEuQWRkcmVzczQodGhpcy5wYXJzZWRBZGRyZXNzNCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYWRkcmVzczQuZ3JvdXBzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoL14wWzAtOV0rLy50ZXN0KHRoaXMuYWRkcmVzczQucGFyc2VkQWRkcmVzc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoXCJJUHY0IGFkZHJlc3NlcyBjYW4ndCBoYXZlIGxlYWRpbmcgemVyb2VzLlwiLCBhZGRyZXNzLnJlcGxhY2UoY29uc3RhbnRzNC5SRV9BRERSRVNTLCB0aGlzLmFkZHJlc3M0LnBhcnNlZEFkZHJlc3MubWFwKHNwYW5MZWFkaW5nWmVyb2VzNCkuam9pbignLicpKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52NCA9IHRydWU7XG4gICAgICAgICAgICBncm91cHNbZ3JvdXBzLmxlbmd0aCAtIDFdID0gdGhpcy5hZGRyZXNzNC50b0dyb3VwNigpO1xuICAgICAgICAgICAgYWRkcmVzcyA9IGdyb3Vwcy5qb2luKCc6Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZHJlc3M7XG4gICAgfVxuICAgIC8vIFRPRE86IE1ha2UgcHJpdmF0ZT9cbiAgICBwYXJzZShhZGRyZXNzKSB7XG4gICAgICAgIGFkZHJlc3MgPSB0aGlzLnBhcnNlNGluNihhZGRyZXNzKTtcbiAgICAgICAgY29uc3QgYmFkQ2hhcmFjdGVycyA9IGFkZHJlc3MubWF0Y2goY29uc3RhbnRzNi5SRV9CQURfQ0hBUkFDVEVSUyk7XG4gICAgICAgIGlmIChiYWRDaGFyYWN0ZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcigoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCdCYWQgY2hhcmFjdGVyJXMgZGV0ZWN0ZWQgaW4gYWRkcmVzczogJXMnLCBiYWRDaGFyYWN0ZXJzLmxlbmd0aCA+IDEgPyAncycgOiAnJywgYmFkQ2hhcmFjdGVycy5qb2luKCcnKSksIGFkZHJlc3MucmVwbGFjZShjb25zdGFudHM2LlJFX0JBRF9DSEFSQUNURVJTLCAnPHNwYW4gY2xhc3M9XCJwYXJzZS1lcnJvclwiPiQxPC9zcGFuPicpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYWRBZGRyZXNzID0gYWRkcmVzcy5tYXRjaChjb25zdGFudHM2LlJFX0JBRF9BRERSRVNTKTtcbiAgICAgICAgaWYgKGJhZEFkZHJlc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKCgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJ0FkZHJlc3MgZmFpbGVkIHJlZ2V4OiAlcycsIGJhZEFkZHJlc3Muam9pbignJykpLCBhZGRyZXNzLnJlcGxhY2UoY29uc3RhbnRzNi5SRV9CQURfQUREUkVTUywgJzxzcGFuIGNsYXNzPVwicGFyc2UtZXJyb3JcIj4kMTwvc3Bhbj4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGdyb3VwcyA9IFtdO1xuICAgICAgICBjb25zdCBoYWx2ZXMgPSBhZGRyZXNzLnNwbGl0KCc6OicpO1xuICAgICAgICBpZiAoaGFsdmVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gaGFsdmVzWzBdLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IGhhbHZlc1sxXS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgaWYgKGZpcnN0Lmxlbmd0aCA9PT0gMSAmJiBmaXJzdFswXSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICBmaXJzdCA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhc3QubGVuZ3RoID09PSAxICYmIGxhc3RbMF0gPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgbGFzdCA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nID0gdGhpcy5ncm91cHMgLSAoZmlyc3QubGVuZ3RoICsgbGFzdC5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKCFyZW1haW5pbmcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcignRXJyb3IgcGFyc2luZyBncm91cHMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZWxpZGVkR3JvdXBzID0gcmVtYWluaW5nO1xuICAgICAgICAgICAgdGhpcy5lbGlzaW9uQmVnaW4gPSBmaXJzdC5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmVsaXNpb25FbmQgPSBmaXJzdC5sZW5ndGggKyB0aGlzLmVsaWRlZEdyb3VwcztcbiAgICAgICAgICAgIGdyb3VwcyA9IGdyb3Vwcy5jb25jYXQoZmlyc3QpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1haW5pbmc7IGkrKykge1xuICAgICAgICAgICAgICAgIGdyb3Vwcy5wdXNoKCcwJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cHMgPSBncm91cHMuY29uY2F0KGxhc3QpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGhhbHZlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGdyb3VwcyA9IGFkZHJlc3Muc3BsaXQoJzonKTtcbiAgICAgICAgICAgIHRoaXMuZWxpZGVkR3JvdXBzID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKCdUb28gbWFueSA6OiBncm91cHMgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBncm91cHMgPSBncm91cHMubWFwKChncm91cCkgPT4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXgnLCBwYXJzZUludChncm91cCwgMTYpKSk7XG4gICAgICAgIGlmIChncm91cHMubGVuZ3RoICE9PSB0aGlzLmdyb3Vwcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoJ0luY29ycmVjdCBudW1iZXIgb2YgZ3JvdXBzIGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdyb3VwcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBjYW5vbmljYWwgZm9ybSBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgY2Fub25pY2FsRm9ybSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkQWRkcmVzcy5tYXAocGFkZGVkSGV4KS5qb2luKCc6Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgZGVjaW1hbCBmb3JtIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBkZWNpbWFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZWRBZGRyZXNzLm1hcCgobikgPT4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJTA1ZCcsIHBhcnNlSW50KG4sIDE2KSkpLmpvaW4oJzonKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBhZGRyZXNzIGFzIGEgQmlnSW50ZWdlclxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtCaWdJbnRlZ2VyfVxuICAgICAqL1xuICAgIGJpZ0ludGVnZXIoKSB7XG4gICAgICAgIHJldHVybiBuZXcganNibl8xLkJpZ0ludGVnZXIodGhpcy5wYXJzZWRBZGRyZXNzLm1hcChwYWRkZWRIZXgpLmpvaW4oJycpLCAxNik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgbGFzdCB0d28gZ3JvdXBzIG9mIHRoaXMgYWRkcmVzcyBhcyBhbiBJUHY0IGFkZHJlc3Mgc3RyaW5nXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M0fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFkZHJlc3MgPSBuZXcgQWRkcmVzczYoJzIwMDE6NDg2MDo0MDAxOjoxODI1OmJmMTEnKTtcbiAgICAgKiBhZGRyZXNzLnRvNCgpLmNvcnJlY3RGb3JtKCk7IC8vICcyNC4zNy4xOTEuMTcnXG4gICAgICovXG4gICAgdG80KCkge1xuICAgICAgICBjb25zdCBiaW5hcnkgPSB0aGlzLmJpbmFyeVplcm9QYWQoKS5zcGxpdCgnJyk7XG4gICAgICAgIHJldHVybiBpcHY0XzEuQWRkcmVzczQuZnJvbUhleChuZXcganNibl8xLkJpZ0ludGVnZXIoYmluYXJ5LnNsaWNlKDk2LCAxMjgpLmpvaW4oJycpLCAyKS50b1N0cmluZygxNikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHY0LWluLXY2IGZvcm0gb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHRvNGluNigpIHtcbiAgICAgICAgY29uc3QgYWRkcmVzczQgPSB0aGlzLnRvNCgpO1xuICAgICAgICBjb25zdCBhZGRyZXNzNiA9IG5ldyBBZGRyZXNzNih0aGlzLnBhcnNlZEFkZHJlc3Muc2xpY2UoMCwgNikuam9pbignOicpLCA2KTtcbiAgICAgICAgY29uc3QgY29ycmVjdCA9IGFkZHJlc3M2LmNvcnJlY3RGb3JtKCk7XG4gICAgICAgIGxldCBpbmZpeCA9ICcnO1xuICAgICAgICBpZiAoIS86JC8udGVzdChjb3JyZWN0KSkge1xuICAgICAgICAgICAgaW5maXggPSAnOic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvcnJlY3QgKyBpbmZpeCArIGFkZHJlc3M0LmFkZHJlc3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgVGVyZWRvIHByb3BlcnRpZXMgb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGluc3BlY3RUZXJlZG8oKSB7XG4gICAgICAgIC8qXG4gICAgICAgIC0gQml0cyAwIHRvIDMxIGFyZSBzZXQgdG8gdGhlIFRlcmVkbyBwcmVmaXggKG5vcm1hbGx5IDIwMDE6MDAwMDo6LzMyKS5cbiAgICAgICAgLSBCaXRzIDMyIHRvIDYzIGVtYmVkIHRoZSBwcmltYXJ5IElQdjQgYWRkcmVzcyBvZiB0aGUgVGVyZWRvIHNlcnZlciB0aGF0XG4gICAgICAgICAgaXMgdXNlZC5cbiAgICAgICAgLSBCaXRzIDY0IHRvIDc5IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBzb21lIGZsYWdzLiBDdXJyZW50bHkgb25seSB0aGVcbiAgICAgICAgICBoaWdoZXIgb3JkZXIgYml0IGlzIHVzZWQ7IGl0IGlzIHNldCB0byAxIGlmIHRoZSBUZXJlZG8gY2xpZW50IGlzXG4gICAgICAgICAgbG9jYXRlZCBiZWhpbmQgYSBjb25lIE5BVCwgMCBvdGhlcndpc2UuIEZvciBNaWNyb3NvZnQncyBXaW5kb3dzIFZpc3RhXG4gICAgICAgICAgYW5kIFdpbmRvd3MgU2VydmVyIDIwMDggaW1wbGVtZW50YXRpb25zLCBtb3JlIGJpdHMgYXJlIHVzZWQuIEluIHRob3NlXG4gICAgICAgICAgaW1wbGVtZW50YXRpb25zLCB0aGUgZm9ybWF0IGZvciB0aGVzZSAxNiBiaXRzIGlzIFwiQ1JBQUFBVUcgQUFBQUFBQUFcIixcbiAgICAgICAgICB3aGVyZSBcIkNcIiByZW1haW5zIHRoZSBcIkNvbmVcIiBmbGFnLiBUaGUgXCJSXCIgYml0IGlzIHJlc2VydmVkIGZvciBmdXR1cmVcbiAgICAgICAgICB1c2UuIFRoZSBcIlVcIiBiaXQgaXMgZm9yIHRoZSBVbml2ZXJzYWwvTG9jYWwgZmxhZyAoc2V0IHRvIDApLiBUaGUgXCJHXCIgYml0XG4gICAgICAgICAgaXMgSW5kaXZpZHVhbC9Hcm91cCBmbGFnIChzZXQgdG8gMCkuIFRoZSBBIGJpdHMgYXJlIHNldCB0byBhIDEyLWJpdFxuICAgICAgICAgIHJhbmRvbWx5IGdlbmVyYXRlZCBudW1iZXIgY2hvc2VuIGJ5IHRoZSBUZXJlZG8gY2xpZW50IHRvIGludHJvZHVjZVxuICAgICAgICAgIGFkZGl0aW9uYWwgcHJvdGVjdGlvbiBmb3IgdGhlIFRlcmVkbyBub2RlIGFnYWluc3QgSVB2Ni1iYXNlZCBzY2FubmluZ1xuICAgICAgICAgIGF0dGFja3MuXG4gICAgICAgIC0gQml0cyA4MCB0byA5NSBjb250YWlucyB0aGUgb2JmdXNjYXRlZCBVRFAgcG9ydCBudW1iZXIuIFRoaXMgaXMgdGhlXG4gICAgICAgICAgcG9ydCBudW1iZXIgdGhhdCBpcyBtYXBwZWQgYnkgdGhlIE5BVCB0byB0aGUgVGVyZWRvIGNsaWVudCB3aXRoIGFsbFxuICAgICAgICAgIGJpdHMgaW52ZXJ0ZWQuXG4gICAgICAgIC0gQml0cyA5NiB0byAxMjcgY29udGFpbnMgdGhlIG9iZnVzY2F0ZWQgSVB2NCBhZGRyZXNzLiBUaGlzIGlzIHRoZVxuICAgICAgICAgIHB1YmxpYyBJUHY0IGFkZHJlc3Mgb2YgdGhlIE5BVCB3aXRoIGFsbCBiaXRzIGludmVydGVkLlxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLmdldEJpdHNCYXNlMTYoMCwgMzIpO1xuICAgICAgICBjb25zdCB1ZHBQb3J0ID0gdGhpcy5nZXRCaXRzKDgwLCA5NikueG9yKG5ldyBqc2JuXzEuQmlnSW50ZWdlcignZmZmZicsIDE2KSkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3Qgc2VydmVyNCA9IGlwdjRfMS5BZGRyZXNzNC5mcm9tSGV4KHRoaXMuZ2V0Qml0c0Jhc2UxNigzMiwgNjQpKTtcbiAgICAgICAgY29uc3QgY2xpZW50NCA9IGlwdjRfMS5BZGRyZXNzNC5mcm9tSGV4KHRoaXMuZ2V0Qml0cyg5NiwgMTI4KS54b3IobmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCdmZmZmZmZmZicsIDE2KSkudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgY29uc3QgZmxhZ3MgPSB0aGlzLmdldEJpdHMoNjQsIDgwKTtcbiAgICAgICAgY29uc3QgZmxhZ3NCYXNlMiA9IHRoaXMuZ2V0Qml0c0Jhc2UyKDY0LCA4MCk7XG4gICAgICAgIGNvbnN0IGNvbmVOYXQgPSBmbGFncy50ZXN0Qml0KDE1KTtcbiAgICAgICAgY29uc3QgcmVzZXJ2ZWQgPSBmbGFncy50ZXN0Qml0KDE0KTtcbiAgICAgICAgY29uc3QgZ3JvdXBJbmRpdmlkdWFsID0gZmxhZ3MudGVzdEJpdCg4KTtcbiAgICAgICAgY29uc3QgdW5pdmVyc2FsTG9jYWwgPSBmbGFncy50ZXN0Qml0KDkpO1xuICAgICAgICBjb25zdCBub25jZSA9IG5ldyBqc2JuXzEuQmlnSW50ZWdlcihmbGFnc0Jhc2UyLnNsaWNlKDIsIDYpICsgZmxhZ3NCYXNlMi5zbGljZSg4LCAxNiksIDIpLnRvU3RyaW5nKDEwKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByZWZpeDogKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXM6JXMnLCBwcmVmaXguc2xpY2UoMCwgNCksIHByZWZpeC5zbGljZSg0LCA4KSksXG4gICAgICAgICAgICBzZXJ2ZXI0OiBzZXJ2ZXI0LmFkZHJlc3MsXG4gICAgICAgICAgICBjbGllbnQ0OiBjbGllbnQ0LmFkZHJlc3MsXG4gICAgICAgICAgICBmbGFnczogZmxhZ3NCYXNlMixcbiAgICAgICAgICAgIGNvbmVOYXQsXG4gICAgICAgICAgICBtaWNyb3NvZnQ6IHtcbiAgICAgICAgICAgICAgICByZXNlcnZlZCxcbiAgICAgICAgICAgICAgICB1bml2ZXJzYWxMb2NhbCxcbiAgICAgICAgICAgICAgICBncm91cEluZGl2aWR1YWwsXG4gICAgICAgICAgICAgICAgbm9uY2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdWRwUG9ydCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSA2dG80IHByb3BlcnRpZXMgb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIGluc3BlY3Q2dG80KCkge1xuICAgICAgICAvKlxuICAgICAgICAtIEJpdHMgMCB0byAxNSBhcmUgc2V0IHRvIHRoZSA2dG80IHByZWZpeCAoMjAwMjo6LzE2KS5cbiAgICAgICAgLSBCaXRzIDE2IHRvIDQ4IGVtYmVkIHRoZSBJUHY0IGFkZHJlc3Mgb2YgdGhlIDZ0bzQgZ2F0ZXdheSB0aGF0IGlzIHVzZWQuXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuZ2V0Qml0c0Jhc2UxNigwLCAxNik7XG4gICAgICAgIGNvbnN0IGdhdGV3YXkgPSBpcHY0XzEuQWRkcmVzczQuZnJvbUhleCh0aGlzLmdldEJpdHNCYXNlMTYoMTYsIDQ4KSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcmVmaXg6ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyVzJywgcHJlZml4LnNsaWNlKDAsIDQpKSxcbiAgICAgICAgICAgIGdhdGV3YXk6IGdhdGV3YXkuYWRkcmVzcyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgdjYgNnRvNCBhZGRyZXNzIGZyb20gYSB2NiB2NGludjYgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNn1cbiAgICAgKi9cbiAgICB0bzZ0bzQoKSB7XG4gICAgICAgIGlmICghdGhpcy5pczQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRkcjZ0bzQgPSBbXG4gICAgICAgICAgICAnMjAwMicsXG4gICAgICAgICAgICB0aGlzLmdldEJpdHNCYXNlMTYoOTYsIDExMiksXG4gICAgICAgICAgICB0aGlzLmdldEJpdHNCYXNlMTYoMTEyLCAxMjgpLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAnLzE2JyxcbiAgICAgICAgXS5qb2luKCc6Jyk7XG4gICAgICAgIHJldHVybiBuZXcgQWRkcmVzczYoYWRkcjZ0bzQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBieXRlIGFycmF5XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIHRvQnl0ZUFycmF5KCkge1xuICAgICAgICBjb25zdCBieXRlQXJyYXkgPSB0aGlzLmJpZ0ludGVnZXIoKS50b0J5dGVBcnJheSgpO1xuICAgICAgICAvLyB3b3JrIGFyb3VuZCBpc3N1ZSB3aGVyZSBgdG9CeXRlQXJyYXlgIHJldHVybnMgYSBsZWFkaW5nIDAgZWxlbWVudFxuICAgICAgICBpZiAoYnl0ZUFycmF5Lmxlbmd0aCA9PT0gMTcgJiYgYnl0ZUFycmF5WzBdID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYnl0ZUFycmF5LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBieXRlQXJyYXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiB1bnNpZ25lZCBieXRlIGFycmF5XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIHRvVW5zaWduZWRCeXRlQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvQnl0ZUFycmF5KCkubWFwKHVuc2lnbkJ5dGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGEgYnl0ZSBhcnJheSB0byBhbiBBZGRyZXNzNiBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHJldHVybnMge0FkZHJlc3M2fVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tQnl0ZUFycmF5KGJ5dGVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb21VbnNpZ25lZEJ5dGVBcnJheShieXRlcy5tYXAodW5zaWduQnl0ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGFuIHVuc2lnbmVkIGJ5dGUgYXJyYXkgdG8gYW4gQWRkcmVzczYgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQHN0YXRpY1xuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVVuc2lnbmVkQnl0ZUFycmF5KGJ5dGVzKSB7XG4gICAgICAgIGNvbnN0IEJZVEVfTUFYID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcyNTYnLCAxMCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcganNibl8xLkJpZ0ludGVnZXIoJzAnLCAxMCk7XG4gICAgICAgIGxldCBtdWx0aXBsaWVyID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcxJywgMTApO1xuICAgICAgICBmb3IgKGxldCBpID0gYnl0ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGQobXVsdGlwbGllci5tdWx0aXBseShuZXcganNibl8xLkJpZ0ludGVnZXIoYnl0ZXNbaV0udG9TdHJpbmcoMTApLCAxMCkpKTtcbiAgICAgICAgICAgIG11bHRpcGxpZXIgPSBtdWx0aXBsaWVyLm11bHRpcGx5KEJZVEVfTUFYKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQWRkcmVzczYuZnJvbUJpZ0ludGVnZXIocmVzdWx0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGluIHRoZSBjYW5vbmljYWwgZm9ybSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNDYW5vbmljYWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NNaW51c1N1ZmZpeCA9PT0gdGhpcy5jYW5vbmljYWxGb3JtKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIGxpbmsgbG9jYWwgYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNMaW5rTG9jYWwoKSB7XG4gICAgICAgIC8vIFplcm9lcyBhcmUgcmVxdWlyZWQsIGkuZS4gd2UgY2FuJ3QgY2hlY2sgaXNJblN1Ym5ldCB3aXRoICdmZTgwOjovMTAnXG4gICAgICAgIGlmICh0aGlzLmdldEJpdHNCYXNlMigwLCA2NCkgPT09XG4gICAgICAgICAgICAnMTExMTExMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbXVsdGljYXN0IGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzTXVsdGljYXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUeXBlKCkgPT09ICdNdWx0aWNhc3QnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSB2NC1pbi12NiBhZGRyZXNzLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpczQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnY0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBUZXJlZG8gYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNUZXJlZG8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5TdWJuZXQobmV3IEFkZHJlc3M2KCcyMDAxOjovMzInKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIDZ0bzQgYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXM2dG80KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0luU3VibmV0KG5ldyBBZGRyZXNzNignMjAwMjo6LzE2JykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBsb29wYmFjayBhZGRyZXNzLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0xvb3BiYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUeXBlKCkgPT09ICdMb29wYmFjayc7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb25cbiAgICAvLyAjcmVnaW9uIEhUTUxcbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgYWRkcmVzcyBpbiBsaW5rIGZvcm0gd2l0aCBhIGRlZmF1bHQgcG9ydCBvZiA4MFxuICAgICAqL1xuICAgIGhyZWYob3B0aW9uYWxQb3J0KSB7XG4gICAgICAgIGlmIChvcHRpb25hbFBvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9uYWxQb3J0ID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25hbFBvcnQgPSAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCc6JXMnLCBvcHRpb25hbFBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCdodHRwOi8vWyVzXSVzLycsIHRoaXMuY29ycmVjdEZvcm0oKSwgb3B0aW9uYWxQb3J0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gYSBsaW5rIHN1aXRhYmxlIGZvciBjb252ZXlpbmcgdGhlIGFkZHJlc3MgdmlhIGEgVVJMIGhhc2hcbiAgICAgKi9cbiAgICBsaW5rKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY2xhc3NOYW1lID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMucHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucHJlZml4ID0gJy8jYWRkcmVzcz0nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnY0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMudjQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm9ybUZ1bmN0aW9uID0gdGhpcy5jb3JyZWN0Rm9ybTtcbiAgICAgICAgaWYgKG9wdGlvbnMudjQpIHtcbiAgICAgICAgICAgIGZvcm1GdW5jdGlvbiA9IHRoaXMudG80aW42O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJzxhIGhyZWY9XCIlMSRzJTIkc1wiIGNsYXNzPVwiJTMkc1wiPiUyJHM8L2E+Jywgb3B0aW9ucy5wcmVmaXgsIGZvcm1GdW5jdGlvbi5jYWxsKHRoaXMpLCBvcHRpb25zLmNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJzxhIGhyZWY9XCIlMSRzJTIkc1wiPiUyJHM8L2E+Jywgb3B0aW9ucy5wcmVmaXgsIGZvcm1GdW5jdGlvbi5jYWxsKHRoaXMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR3JvdXBzIGFuIGFkZHJlc3NcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdyb3VwKCkge1xuICAgICAgICBpZiAodGhpcy5lbGlkZWRHcm91cHMgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoZSBzaW1wbGUgY2FzZVxuICAgICAgICAgICAgcmV0dXJuIGhlbHBlcnMuc2ltcGxlR3JvdXAodGhpcy5hZGRyZXNzKS5qb2luKCc6Jyk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHR5cGVvZiB0aGlzLmVsaWRlZEdyb3VwcyA9PT0gJ251bWJlcicpO1xuICAgICAgICBhc3NlcnQodHlwZW9mIHRoaXMuZWxpc2lvbkJlZ2luID09PSAnbnVtYmVyJyk7XG4gICAgICAgIC8vIFRoZSBlbGlkZWQgY2FzZVxuICAgICAgICBjb25zdCBvdXRwdXQgPSBbXTtcbiAgICAgICAgY29uc3QgW2xlZnQsIHJpZ2h0XSA9IHRoaXMuYWRkcmVzcy5zcGxpdCgnOjonKTtcbiAgICAgICAgaWYgKGxlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCguLi5oZWxwZXJzLnNpbXBsZUdyb3VwKGxlZnQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbGFzc2VzID0gWydob3Zlci1ncm91cCddO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5lbGlzaW9uQmVnaW47IGkgPCB0aGlzLmVsaXNpb25CZWdpbiArIHRoaXMuZWxpZGVkR3JvdXBzOyBpKyspIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCdncm91cC0lZCcsIGkpKTtcbiAgICAgICAgfVxuICAgICAgICBvdXRwdXQucHVzaCgoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCc8c3BhbiBjbGFzcz1cIiVzXCI+PC9zcGFuPicsIGNsYXNzZXMuam9pbignICcpKSk7XG4gICAgICAgIGlmIChyaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKC4uLmhlbHBlcnMuc2ltcGxlR3JvdXAocmlnaHQsIHRoaXMuZWxpc2lvbkVuZCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzNCgpKSB7XG4gICAgICAgICAgICBhc3NlcnQodGhpcy5hZGRyZXNzNCBpbnN0YW5jZW9mIGlwdjRfMS5BZGRyZXNzNCk7XG4gICAgICAgICAgICBvdXRwdXQucG9wKCk7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCh0aGlzLmFkZHJlc3M0Lmdyb3VwRm9yVjYoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dC5qb2luKCc6Jyk7XG4gICAgfVxuICAgIC8vICNlbmRyZWdpb25cbiAgICAvLyAjcmVnaW9uIFJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byBmaW5kIG9yIHZhbGlkYXRlXG4gICAgICogYWxsIHZhcmlhdGlvbnMgb2YgdGhpcyBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzdWJzdHJpbmdTZWFyY2hcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIHJlZ3VsYXJFeHByZXNzaW9uU3RyaW5nKHN1YnN0cmluZ1NlYXJjaCA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBvdXRwdXQgPSBbXTtcbiAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB3aHkgdGhpcyBpcyBuZWNlc3NhcnlcbiAgICAgICAgY29uc3QgYWRkcmVzczYgPSBuZXcgQWRkcmVzczYodGhpcy5jb3JyZWN0Rm9ybSgpKTtcbiAgICAgICAgaWYgKGFkZHJlc3M2LmVsaWRlZEdyb3VwcyA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhlIHNpbXBsZSBjYXNlXG4gICAgICAgICAgICBvdXRwdXQucHVzaCgoMCwgcmVndWxhcl9leHByZXNzaW9uc18xLnNpbXBsZVJlZ3VsYXJFeHByZXNzaW9uKShhZGRyZXNzNi5wYXJzZWRBZGRyZXNzKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWRkcmVzczYuZWxpZGVkR3JvdXBzID09PSBjb25zdGFudHM2LkdST1VQUykge1xuICAgICAgICAgICAgLy8gQSBjb21wbGV0ZWx5IGVsaWRlZCBhZGRyZXNzXG4gICAgICAgICAgICBvdXRwdXQucHVzaCgoMCwgcmVndWxhcl9leHByZXNzaW9uc18xLnBvc3NpYmxlRWxpc2lvbnMpKGNvbnN0YW50czYuR1JPVVBTKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBBIHBhcnRpYWxseSBlbGlkZWQgYWRkcmVzc1xuICAgICAgICAgICAgY29uc3QgaGFsdmVzID0gYWRkcmVzczYuYWRkcmVzcy5zcGxpdCgnOjonKTtcbiAgICAgICAgICAgIGlmIChoYWx2ZXNbMF0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goKDAsIHJlZ3VsYXJfZXhwcmVzc2lvbnNfMS5zaW1wbGVSZWd1bGFyRXhwcmVzc2lvbikoaGFsdmVzWzBdLnNwbGl0KCc6JykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgYWRkcmVzczYuZWxpZGVkR3JvdXBzID09PSAnbnVtYmVyJyk7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCgoMCwgcmVndWxhcl9leHByZXNzaW9uc18xLnBvc3NpYmxlRWxpc2lvbnMpKGFkZHJlc3M2LmVsaWRlZEdyb3VwcywgaGFsdmVzWzBdLmxlbmd0aCAhPT0gMCwgaGFsdmVzWzFdLmxlbmd0aCAhPT0gMCkpO1xuICAgICAgICAgICAgaWYgKGhhbHZlc1sxXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgoMCwgcmVndWxhcl9leHByZXNzaW9uc18xLnNpbXBsZVJlZ3VsYXJFeHByZXNzaW9uKShoYWx2ZXNbMV0uc3BsaXQoJzonKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0cHV0ID0gW291dHB1dC5qb2luKCc6JyldO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3Vic3RyaW5nU2VhcmNoKSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBbXG4gICAgICAgICAgICAgICAgJyg/PV58JyxcbiAgICAgICAgICAgICAgICByZWd1bGFyX2V4cHJlc3Npb25zXzEuQUREUkVTU19CT1VOREFSWSxcbiAgICAgICAgICAgICAgICAnfFteXFxcXHdcXFxcOl0pKCcsXG4gICAgICAgICAgICAgICAgLi4ub3V0cHV0LFxuICAgICAgICAgICAgICAgICcpKD89W15cXFxcd1xcXFw6XXwnLFxuICAgICAgICAgICAgICAgIHJlZ3VsYXJfZXhwcmVzc2lvbnNfMS5BRERSRVNTX0JPVU5EQVJZLFxuICAgICAgICAgICAgICAgICd8JCknLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbmQgb3IgdmFsaWRhdGUgYWxsXG4gICAgICogdmFyaWF0aW9ucyBvZiB0aGlzIGFkZHJlc3MuXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzdWJzdHJpbmdTZWFyY2hcbiAgICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgICAqL1xuICAgIHJlZ3VsYXJFeHByZXNzaW9uKHN1YnN0cmluZ1NlYXJjaCA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHRoaXMucmVndWxhckV4cHJlc3Npb25TdHJpbmcoc3Vic3RyaW5nU2VhcmNoKSwgJ2knKTtcbiAgICB9XG59XG5leHBvcnRzLkFkZHJlc3M2ID0gQWRkcmVzczY7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcHY2LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SRV9TVUJORVRfU1RSSU5HID0gZXhwb3J0cy5SRV9BRERSRVNTID0gZXhwb3J0cy5HUk9VUFMgPSBleHBvcnRzLkJJVFMgPSB2b2lkIDA7XG5leHBvcnRzLkJJVFMgPSAzMjtcbmV4cG9ydHMuR1JPVVBTID0gNDtcbmV4cG9ydHMuUkVfQUREUkVTUyA9IC9eKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPykkL2c7XG5leHBvcnRzLlJFX1NVQk5FVF9TVFJJTkcgPSAvXFwvXFxkezEsMn0kLztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0YW50cy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUkVfVVJMX1dJVEhfUE9SVCA9IGV4cG9ydHMuUkVfVVJMID0gZXhwb3J0cy5SRV9aT05FX1NUUklORyA9IGV4cG9ydHMuUkVfU1VCTkVUX1NUUklORyA9IGV4cG9ydHMuUkVfQkFEX0FERFJFU1MgPSBleHBvcnRzLlJFX0JBRF9DSEFSQUNURVJTID0gZXhwb3J0cy5UWVBFUyA9IGV4cG9ydHMuU0NPUEVTID0gZXhwb3J0cy5HUk9VUFMgPSBleHBvcnRzLkJJVFMgPSB2b2lkIDA7XG5leHBvcnRzLkJJVFMgPSAxMjg7XG5leHBvcnRzLkdST1VQUyA9IDg7XG4vKipcbiAqIFJlcHJlc2VudHMgSVB2NiBhZGRyZXNzIHNjb3Blc1xuICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gKiBAc3RhdGljXG4gKi9cbmV4cG9ydHMuU0NPUEVTID0ge1xuICAgIDA6ICdSZXNlcnZlZCcsXG4gICAgMTogJ0ludGVyZmFjZSBsb2NhbCcsXG4gICAgMjogJ0xpbmsgbG9jYWwnLFxuICAgIDQ6ICdBZG1pbiBsb2NhbCcsXG4gICAgNTogJ1NpdGUgbG9jYWwnLFxuICAgIDg6ICdPcmdhbml6YXRpb24gbG9jYWwnLFxuICAgIDE0OiAnR2xvYmFsJyxcbiAgICAxNTogJ1Jlc2VydmVkJyxcbn07XG4vKipcbiAqIFJlcHJlc2VudHMgSVB2NiBhZGRyZXNzIHR5cGVzXG4gKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0cy5UWVBFUyA9IHtcbiAgICAnZmYwMTo6MS8xMjgnOiAnTXVsdGljYXN0IChBbGwgbm9kZXMgb24gdGhpcyBpbnRlcmZhY2UpJyxcbiAgICAnZmYwMTo6Mi8xMjgnOiAnTXVsdGljYXN0IChBbGwgcm91dGVycyBvbiB0aGlzIGludGVyZmFjZSknLFxuICAgICdmZjAyOjoxLzEyOCc6ICdNdWx0aWNhc3QgKEFsbCBub2RlcyBvbiB0aGlzIGxpbmspJyxcbiAgICAnZmYwMjo6Mi8xMjgnOiAnTXVsdGljYXN0IChBbGwgcm91dGVycyBvbiB0aGlzIGxpbmspJyxcbiAgICAnZmYwNTo6Mi8xMjgnOiAnTXVsdGljYXN0IChBbGwgcm91dGVycyBpbiB0aGlzIHNpdGUpJyxcbiAgICAnZmYwMjo6NS8xMjgnOiAnTXVsdGljYXN0IChPU1BGdjMgQWxsU1BGIHJvdXRlcnMpJyxcbiAgICAnZmYwMjo6Ni8xMjgnOiAnTXVsdGljYXN0IChPU1BGdjMgQWxsRFIgcm91dGVycyknLFxuICAgICdmZjAyOjo5LzEyOCc6ICdNdWx0aWNhc3QgKFJJUCByb3V0ZXJzKScsXG4gICAgJ2ZmMDI6OmEvMTI4JzogJ011bHRpY2FzdCAoRUlHUlAgcm91dGVycyknLFxuICAgICdmZjAyOjpkLzEyOCc6ICdNdWx0aWNhc3QgKFBJTSByb3V0ZXJzKScsXG4gICAgJ2ZmMDI6OjE2LzEyOCc6ICdNdWx0aWNhc3QgKE1MRHYyIHJlcG9ydHMpJyxcbiAgICAnZmYwMTo6ZmIvMTI4JzogJ011bHRpY2FzdCAobUROU3Y2KScsXG4gICAgJ2ZmMDI6OmZiLzEyOCc6ICdNdWx0aWNhc3QgKG1ETlN2NiknLFxuICAgICdmZjA1OjpmYi8xMjgnOiAnTXVsdGljYXN0IChtRE5TdjYpJyxcbiAgICAnZmYwMjo6MToyLzEyOCc6ICdNdWx0aWNhc3QgKEFsbCBESENQIHNlcnZlcnMgYW5kIHJlbGF5IGFnZW50cyBvbiB0aGlzIGxpbmspJyxcbiAgICAnZmYwNTo6MToyLzEyOCc6ICdNdWx0aWNhc3QgKEFsbCBESENQIHNlcnZlcnMgYW5kIHJlbGF5IGFnZW50cyBpbiB0aGlzIHNpdGUpJyxcbiAgICAnZmYwMjo6MTozLzEyOCc6ICdNdWx0aWNhc3QgKEFsbCBESENQIHNlcnZlcnMgb24gdGhpcyBsaW5rKScsXG4gICAgJ2ZmMDU6OjE6My8xMjgnOiAnTXVsdGljYXN0IChBbGwgREhDUCBzZXJ2ZXJzIGluIHRoaXMgc2l0ZSknLFxuICAgICc6Oi8xMjgnOiAnVW5zcGVjaWZpZWQnLFxuICAgICc6OjEvMTI4JzogJ0xvb3BiYWNrJyxcbiAgICAnZmYwMDo6LzgnOiAnTXVsdGljYXN0JyxcbiAgICAnZmU4MDo6LzEwJzogJ0xpbmstbG9jYWwgdW5pY2FzdCcsXG59O1xuLyoqXG4gKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgYmFkIGNoYXJhY3RlcnMgaW4gYW4gSVB2NiBhZGRyZXNzXG4gKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0cy5SRV9CQURfQ0hBUkFDVEVSUyA9IC8oW14wLTlhLWY6LyVdKS9naTtcbi8qKlxuICogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIGFuIGluY29ycmVjdCBJUHY2IGFkZHJlc3NcbiAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICogQHN0YXRpY1xuICovXG5leHBvcnRzLlJFX0JBRF9BRERSRVNTID0gLyhbMC05YS1mXXs1LH18OnszLH18W146XTokfF46W146XXxcXC8kKS9naTtcbi8qKlxuICogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIGFuIElQdjYgc3VibmV0XG4gKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0cy5SRV9TVUJORVRfU1RSSU5HID0gL1xcL1xcZHsxLDN9KD89JXwkKS87XG4vKipcbiAqIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBhbiBJUHY2IHpvbmVcbiAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICogQHN0YXRpY1xuICovXG5leHBvcnRzLlJFX1pPTkVfU1RSSU5HID0gLyUuKiQvO1xuZXhwb3J0cy5SRV9VUkwgPSBuZXcgUmVnRXhwKC9eXFxbezAsMX0oWzAtOWEtZjpdKylcXF17MCwxfS8pO1xuZXhwb3J0cy5SRV9VUkxfV0lUSF9QT1JUID0gbmV3IFJlZ0V4cCgvXFxbKFswLTlhLWY6XSspXFxdOihbMC05XXsxLDV9KS8pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zaW1wbGVHcm91cCA9IGV4cG9ydHMuc3BhbkxlYWRpbmdaZXJvZXMgPSBleHBvcnRzLnNwYW5BbGwgPSBleHBvcnRzLnNwYW5BbGxaZXJvZXMgPSB2b2lkIDA7XG5jb25zdCBzcHJpbnRmX2pzXzEgPSByZXF1aXJlKFwic3ByaW50Zi1qc1wiKTtcbi8qKlxuICogQHJldHVybnMge1N0cmluZ30gdGhlIHN0cmluZyB3aXRoIGFsbCB6ZXJvZXMgY29udGFpbmVkIGluIGEgPHNwYW4+XG4gKi9cbmZ1bmN0aW9uIHNwYW5BbGxaZXJvZXMocykge1xuICAgIHJldHVybiBzLnJlcGxhY2UoLygwKykvZywgJzxzcGFuIGNsYXNzPVwiemVyb1wiPiQxPC9zcGFuPicpO1xufVxuZXhwb3J0cy5zcGFuQWxsWmVyb2VzID0gc3BhbkFsbFplcm9lcztcbi8qKlxuICogQHJldHVybnMge1N0cmluZ30gdGhlIHN0cmluZyB3aXRoIGVhY2ggY2hhcmFjdGVyIGNvbnRhaW5lZCBpbiBhIDxzcGFuPlxuICovXG5mdW5jdGlvbiBzcGFuQWxsKHMsIG9mZnNldCA9IDApIHtcbiAgICBjb25zdCBsZXR0ZXJzID0gcy5zcGxpdCgnJyk7XG4gICAgcmV0dXJuIGxldHRlcnNcbiAgICAgICAgLm1hcCgobiwgaSkgPT4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnPHNwYW4gY2xhc3M9XCJkaWdpdCB2YWx1ZS0lcyBwb3NpdGlvbi0lZFwiPiVzPC9zcGFuPicsIG4sIGkgKyBvZmZzZXQsIHNwYW5BbGxaZXJvZXMobikpIC8vIFhYWCBVc2UgI2Jhc2UtMiAudmFsdWUtMCBpbnN0ZWFkP1xuICAgIClcbiAgICAgICAgLmpvaW4oJycpO1xufVxuZXhwb3J0cy5zcGFuQWxsID0gc3BhbkFsbDtcbmZ1bmN0aW9uIHNwYW5MZWFkaW5nWmVyb2VzU2ltcGxlKGdyb3VwKSB7XG4gICAgcmV0dXJuIGdyb3VwLnJlcGxhY2UoL14oMCspLywgJzxzcGFuIGNsYXNzPVwiemVyb1wiPiQxPC9zcGFuPicpO1xufVxuLyoqXG4gKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyB6ZXJvZXMgY29udGFpbmVkIGluIGEgPHNwYW4+XG4gKi9cbmZ1bmN0aW9uIHNwYW5MZWFkaW5nWmVyb2VzKGFkZHJlc3MpIHtcbiAgICBjb25zdCBncm91cHMgPSBhZGRyZXNzLnNwbGl0KCc6Jyk7XG4gICAgcmV0dXJuIGdyb3Vwcy5tYXAoKGcpID0+IHNwYW5MZWFkaW5nWmVyb2VzU2ltcGxlKGcpKS5qb2luKCc6Jyk7XG59XG5leHBvcnRzLnNwYW5MZWFkaW5nWmVyb2VzID0gc3BhbkxlYWRpbmdaZXJvZXM7XG4vKipcbiAqIEdyb3VwcyBhbiBhZGRyZXNzXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBhIGdyb3VwZWQgYWRkcmVzc1xuICovXG5mdW5jdGlvbiBzaW1wbGVHcm91cChhZGRyZXNzU3RyaW5nLCBvZmZzZXQgPSAwKSB7XG4gICAgY29uc3QgZ3JvdXBzID0gYWRkcmVzc1N0cmluZy5zcGxpdCgnOicpO1xuICAgIHJldHVybiBncm91cHMubWFwKChnLCBpKSA9PiB7XG4gICAgICAgIGlmICgvZ3JvdXAtdjQvLnRlc3QoZykpIHtcbiAgICAgICAgICAgIHJldHVybiBnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCc8c3BhbiBjbGFzcz1cImhvdmVyLWdyb3VwIGdyb3VwLSVkXCI+JXM8L3NwYW4+JywgaSArIG9mZnNldCwgc3BhbkxlYWRpbmdaZXJvZXNTaW1wbGUoZykpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5zaW1wbGVHcm91cCA9IHNpbXBsZUdyb3VwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGVscGVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wb3NzaWJsZUVsaXNpb25zID0gZXhwb3J0cy5zaW1wbGVSZWd1bGFyRXhwcmVzc2lvbiA9IGV4cG9ydHMuQUREUkVTU19CT1VOREFSWSA9IGV4cG9ydHMucGFkR3JvdXAgPSBleHBvcnRzLmdyb3VwUG9zc2liaWxpdGllcyA9IHZvaWQgMDtcbmNvbnN0IHY2ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbnN0YW50c1wiKSk7XG5jb25zdCBzcHJpbnRmX2pzXzEgPSByZXF1aXJlKFwic3ByaW50Zi1qc1wiKTtcbmZ1bmN0aW9uIGdyb3VwUG9zc2liaWxpdGllcyhwb3NzaWJpbGl0aWVzKSB7XG4gICAgcmV0dXJuICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyglcyknLCBwb3NzaWJpbGl0aWVzLmpvaW4oJ3wnKSk7XG59XG5leHBvcnRzLmdyb3VwUG9zc2liaWxpdGllcyA9IGdyb3VwUG9zc2liaWxpdGllcztcbmZ1bmN0aW9uIHBhZEdyb3VwKGdyb3VwKSB7XG4gICAgaWYgKGdyb3VwLmxlbmd0aCA8IDQpIHtcbiAgICAgICAgcmV0dXJuICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJzB7MCwlZH0lcycsIDQgLSBncm91cC5sZW5ndGgsIGdyb3VwKTtcbiAgICB9XG4gICAgcmV0dXJuIGdyb3VwO1xufVxuZXhwb3J0cy5wYWRHcm91cCA9IHBhZEdyb3VwO1xuZXhwb3J0cy5BRERSRVNTX0JPVU5EQVJZID0gJ1teQS1GYS1mMC05Ol0nO1xuZnVuY3Rpb24gc2ltcGxlUmVndWxhckV4cHJlc3Npb24oZ3JvdXBzKSB7XG4gICAgY29uc3QgemVyb0luZGV4ZXMgPSBbXTtcbiAgICBncm91cHMuZm9yRWFjaCgoZ3JvdXAsIGkpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBJbnRlZ2VyID0gcGFyc2VJbnQoZ3JvdXAsIDE2KTtcbiAgICAgICAgaWYgKGdyb3VwSW50ZWdlciA9PT0gMCkge1xuICAgICAgICAgICAgemVyb0luZGV4ZXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFlvdSBjYW4gdGVjaG5pY2FsbHkgZWxpZGUgYSBzaW5nbGUgMCwgdGhpcyBjcmVhdGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zXG4gICAgLy8gdG8gbWF0Y2ggdGhhdCBldmVudHVhbGl0eVxuICAgIGNvbnN0IHBvc3NpYmlsaXRpZXMgPSB6ZXJvSW5kZXhlcy5tYXAoKHplcm9JbmRleCkgPT4gZ3JvdXBzXG4gICAgICAgIC5tYXAoKGdyb3VwLCBpKSA9PiB7XG4gICAgICAgIGlmIChpID09PSB6ZXJvSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsaXNpb24gPSBpID09PSAwIHx8IGkgPT09IHY2LkdST1VQUyAtIDEgPyAnOicgOiAnJztcbiAgICAgICAgICAgIHJldHVybiBncm91cFBvc3NpYmlsaXRpZXMoW3BhZEdyb3VwKGdyb3VwKSwgZWxpc2lvbl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWRHcm91cChncm91cCk7XG4gICAgfSlcbiAgICAgICAgLmpvaW4oJzonKSk7XG4gICAgLy8gVGhlIHNpbXBsZXN0IGNhc2VcbiAgICBwb3NzaWJpbGl0aWVzLnB1c2goZ3JvdXBzLm1hcChwYWRHcm91cCkuam9pbignOicpKTtcbiAgICByZXR1cm4gZ3JvdXBQb3NzaWJpbGl0aWVzKHBvc3NpYmlsaXRpZXMpO1xufVxuZXhwb3J0cy5zaW1wbGVSZWd1bGFyRXhwcmVzc2lvbiA9IHNpbXBsZVJlZ3VsYXJFeHByZXNzaW9uO1xuZnVuY3Rpb24gcG9zc2libGVFbGlzaW9ucyhlbGlkZWRHcm91cHMsIG1vcmVMZWZ0LCBtb3JlUmlnaHQpIHtcbiAgICBjb25zdCBsZWZ0ID0gbW9yZUxlZnQgPyAnJyA6ICc6JztcbiAgICBjb25zdCByaWdodCA9IG1vcmVSaWdodCA/ICcnIDogJzonO1xuICAgIGNvbnN0IHBvc3NpYmlsaXRpZXMgPSBbXTtcbiAgICAvLyAxLiBlbGlzaW9uIG9mIGV2ZXJ5dGhpbmcgKDo6KVxuICAgIGlmICghbW9yZUxlZnQgJiYgIW1vcmVSaWdodCkge1xuICAgICAgICBwb3NzaWJpbGl0aWVzLnB1c2goJzo6Jyk7XG4gICAgfVxuICAgIC8vIDIuIGNvbXBsZXRlIGVsaXNpb24gb2YgdGhlIG1pZGRsZVxuICAgIGlmIChtb3JlTGVmdCAmJiBtb3JlUmlnaHQpIHtcbiAgICAgICAgcG9zc2liaWxpdGllcy5wdXNoKCcnKTtcbiAgICB9XG4gICAgaWYgKChtb3JlUmlnaHQgJiYgIW1vcmVMZWZ0KSB8fCAoIW1vcmVSaWdodCAmJiBtb3JlTGVmdCkpIHtcbiAgICAgICAgLy8gMy4gY29tcGxldGUgZWxpc2lvbiBvZiBvbmUgc2lkZVxuICAgICAgICBwb3NzaWJpbGl0aWVzLnB1c2goJzonKTtcbiAgICB9XG4gICAgLy8gNC4gZWxpc2lvbiBmcm9tIHRoZSBsZWZ0IHNpZGVcbiAgICBwb3NzaWJpbGl0aWVzLnB1c2goKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXMoOjB7MSw0fSl7MSwlZH0nLCBsZWZ0LCBlbGlkZWRHcm91cHMgLSAxKSk7XG4gICAgLy8gNS4gZWxpc2lvbiBmcm9tIHRoZSByaWdodCBzaWRlXG4gICAgcG9zc2liaWxpdGllcy5wdXNoKCgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJygwezEsNH06KXsxLCVkfSVzJywgZWxpZGVkR3JvdXBzIC0gMSwgcmlnaHQpKTtcbiAgICAvLyA2LiBubyBlbGlzaW9uXG4gICAgcG9zc2liaWxpdGllcy5wdXNoKCgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJygwezEsNH06KXslZH0wezEsNH0nLCBlbGlkZWRHcm91cHMgLSAxKSk7XG4gICAgLy8gNy4gZWxpc2lvbiAoaW5jbHVkaW5nIHNsb3BweSBlbGlzaW9uKSBmcm9tIHRoZSBtaWRkbGVcbiAgICBmb3IgKGxldCBncm91cHMgPSAxOyBncm91cHMgPCBlbGlkZWRHcm91cHMgLSAxOyBncm91cHMrKykge1xuICAgICAgICBmb3IgKGxldCBwb3NpdGlvbiA9IDE7IHBvc2l0aW9uIDwgZWxpZGVkR3JvdXBzIC0gZ3JvdXBzOyBwb3NpdGlvbisrKSB7XG4gICAgICAgICAgICBwb3NzaWJpbGl0aWVzLnB1c2goKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnKDB7MSw0fTopeyVkfTooMHsxLDR9Oil7JWR9MHsxLDR9JywgcG9zaXRpb24sIGVsaWRlZEdyb3VwcyAtIHBvc2l0aW9uIC0gZ3JvdXBzIC0gMSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBncm91cFBvc3NpYmlsaXRpZXMocG9zc2liaWxpdGllcyk7XG59XG5leHBvcnRzLnBvc3NpYmxlRWxpc2lvbnMgPSBwb3NzaWJsZUVsaXNpb25zO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVndWxhci1leHByZXNzaW9ucy5qcy5tYXAiLCIvKiBlc2xpbnQtZGlzYWJsZSB5b2RhICovXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzRnVsbHdpZHRoQ29kZVBvaW50ID0gY29kZVBvaW50ID0+IHtcblx0aWYgKE51bWJlci5pc05hTihjb2RlUG9pbnQpKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gQ29kZSBwb2ludHMgYXJlIGRlcml2ZWQgZnJvbTpcblx0Ly8gaHR0cDovL3d3dy51bml4Lm9yZy9QdWJsaWMvVU5JREFUQS9FYXN0QXNpYW5XaWR0aC50eHRcblx0aWYgKFxuXHRcdGNvZGVQb2ludCA+PSAweDExMDAgJiYgKFxuXHRcdFx0Y29kZVBvaW50IDw9IDB4MTE1RiB8fCAvLyBIYW5ndWwgSmFtb1xuXHRcdFx0Y29kZVBvaW50ID09PSAweDIzMjkgfHwgLy8gTEVGVC1QT0lOVElORyBBTkdMRSBCUkFDS0VUXG5cdFx0XHRjb2RlUG9pbnQgPT09IDB4MjMyQSB8fCAvLyBSSUdIVC1QT0lOVElORyBBTkdMRSBCUkFDS0VUXG5cdFx0XHQvLyBDSksgUmFkaWNhbHMgU3VwcGxlbWVudCAuLiBFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzXG5cdFx0XHQoMHgyRTgwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgzMjQ3ICYmIGNvZGVQb2ludCAhPT0gMHgzMDNGKSB8fFxuXHRcdFx0Ly8gRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocyAuLiBDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBBXG5cdFx0XHQoMHgzMjUwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHg0REJGKSB8fFxuXHRcdFx0Ly8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyAuLiBZaSBSYWRpY2Fsc1xuXHRcdFx0KDB4NEUwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4QTRDNikgfHxcblx0XHRcdC8vIEhhbmd1bCBKYW1vIEV4dGVuZGVkLUFcblx0XHRcdCgweEE5NjAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEE5N0MpIHx8XG5cdFx0XHQvLyBIYW5ndWwgU3lsbGFibGVzXG5cdFx0XHQoMHhBQzAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhEN0EzKSB8fFxuXHRcdFx0Ly8gQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBoc1xuXHRcdFx0KDB4RjkwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkFGRikgfHxcblx0XHRcdC8vIFZlcnRpY2FsIEZvcm1zXG5cdFx0XHQoMHhGRTEwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhGRTE5KSB8fFxuXHRcdFx0Ly8gQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMgLi4gU21hbGwgRm9ybSBWYXJpYW50c1xuXHRcdFx0KDB4RkUzMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkU2QikgfHxcblx0XHRcdC8vIEhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zXG5cdFx0XHQoMHhGRjAxIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhGRjYwKSB8fFxuXHRcdFx0KDB4RkZFMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkZFNikgfHxcblx0XHRcdC8vIEthbmEgU3VwcGxlbWVudFxuXHRcdFx0KDB4MUIwMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDFCMDAxKSB8fFxuXHRcdFx0Ly8gRW5jbG9zZWQgSWRlb2dyYXBoaWMgU3VwcGxlbWVudFxuXHRcdFx0KDB4MUYyMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDFGMjUxKSB8fFxuXHRcdFx0Ly8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQiAuLiBUZXJ0aWFyeSBJZGVvZ3JhcGhpYyBQbGFuZVxuXHRcdFx0KDB4MjAwMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweDNGRkZEKVxuXHRcdClcblx0KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRnVsbHdpZHRoQ29kZVBvaW50O1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IGlzRnVsbHdpZHRoQ29kZVBvaW50O1xuIiwiKGZ1bmN0aW9uKCl7XG5cbiAgICAvLyBDb3B5cmlnaHQgKGMpIDIwMDUgIFRvbSBXdVxuICAgIC8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgLy8gU2VlIFwiTElDRU5TRVwiIGZvciBkZXRhaWxzLlxuXG4gICAgLy8gQmFzaWMgSmF2YVNjcmlwdCBCTiBsaWJyYXJ5IC0gc3Vic2V0IHVzZWZ1bCBmb3IgUlNBIGVuY3J5cHRpb24uXG5cbiAgICAvLyBCaXRzIHBlciBkaWdpdFxuICAgIHZhciBkYml0cztcblxuICAgIC8vIEphdmFTY3JpcHQgZW5naW5lIGFuYWx5c2lzXG4gICAgdmFyIGNhbmFyeSA9IDB4ZGVhZGJlZWZjYWZlO1xuICAgIHZhciBqX2xtID0gKChjYW5hcnkmMHhmZmZmZmYpPT0weGVmY2FmZSk7XG5cbiAgICAvLyAocHVibGljKSBDb25zdHJ1Y3RvclxuICAgIGZ1bmN0aW9uIEJpZ0ludGVnZXIoYSxiLGMpIHtcbiAgICAgIGlmKGEgIT0gbnVsbClcbiAgICAgICAgaWYoXCJudW1iZXJcIiA9PSB0eXBlb2YgYSkgdGhpcy5mcm9tTnVtYmVyKGEsYixjKTtcbiAgICAgICAgZWxzZSBpZihiID09IG51bGwgJiYgXCJzdHJpbmdcIiAhPSB0eXBlb2YgYSkgdGhpcy5mcm9tU3RyaW5nKGEsMjU2KTtcbiAgICAgICAgZWxzZSB0aGlzLmZyb21TdHJpbmcoYSxiKTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gbmV3LCB1bnNldCBCaWdJbnRlZ2VyXG4gICAgZnVuY3Rpb24gbmJpKCkgeyByZXR1cm4gbmV3IEJpZ0ludGVnZXIobnVsbCk7IH1cblxuICAgIC8vIGFtOiBDb21wdXRlIHdfaiArPSAoeCp0aGlzX2kpLCBwcm9wYWdhdGUgY2FycmllcyxcbiAgICAvLyBjIGlzIGluaXRpYWwgY2FycnksIHJldHVybnMgZmluYWwgY2FycnkuXG4gICAgLy8gYyA8IDMqZHZhbHVlLCB4IDwgMipkdmFsdWUsIHRoaXNfaSA8IGR2YWx1ZVxuICAgIC8vIFdlIG5lZWQgdG8gc2VsZWN0IHRoZSBmYXN0ZXN0IG9uZSB0aGF0IHdvcmtzIGluIHRoaXMgZW52aXJvbm1lbnQuXG5cbiAgICAvLyBhbTE6IHVzZSBhIHNpbmdsZSBtdWx0IGFuZCBkaXZpZGUgdG8gZ2V0IHRoZSBoaWdoIGJpdHMsXG4gICAgLy8gbWF4IGRpZ2l0IGJpdHMgc2hvdWxkIGJlIDI2IGJlY2F1c2VcbiAgICAvLyBtYXggaW50ZXJuYWwgdmFsdWUgPSAyKmR2YWx1ZV4yLTIqZHZhbHVlICg8IDJeNTMpXG4gICAgZnVuY3Rpb24gYW0xKGkseCx3LGosYyxuKSB7XG4gICAgICB3aGlsZSgtLW4gPj0gMCkge1xuICAgICAgICB2YXIgdiA9IHgqdGhpc1tpKytdK3dbal0rYztcbiAgICAgICAgYyA9IE1hdGguZmxvb3Iodi8weDQwMDAwMDApO1xuICAgICAgICB3W2orK10gPSB2JjB4M2ZmZmZmZjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH1cbiAgICAvLyBhbTIgYXZvaWRzIGEgYmlnIG11bHQtYW5kLWV4dHJhY3QgY29tcGxldGVseS5cbiAgICAvLyBNYXggZGlnaXQgYml0cyBzaG91bGQgYmUgPD0gMzAgYmVjYXVzZSB3ZSBkbyBiaXR3aXNlIG9wc1xuICAgIC8vIG9uIHZhbHVlcyB1cCB0byAyKmhkdmFsdWVeMi1oZHZhbHVlLTEgKDwgMl4zMSlcbiAgICBmdW5jdGlvbiBhbTIoaSx4LHcsaixjLG4pIHtcbiAgICAgIHZhciB4bCA9IHgmMHg3ZmZmLCB4aCA9IHg+PjE1O1xuICAgICAgd2hpbGUoLS1uID49IDApIHtcbiAgICAgICAgdmFyIGwgPSB0aGlzW2ldJjB4N2ZmZjtcbiAgICAgICAgdmFyIGggPSB0aGlzW2krK10+PjE1O1xuICAgICAgICB2YXIgbSA9IHhoKmwraCp4bDtcbiAgICAgICAgbCA9IHhsKmwrKChtJjB4N2ZmZik8PDE1KSt3W2pdKyhjJjB4M2ZmZmZmZmYpO1xuICAgICAgICBjID0gKGw+Pj4zMCkrKG0+Pj4xNSkreGgqaCsoYz4+PjMwKTtcbiAgICAgICAgd1tqKytdID0gbCYweDNmZmZmZmZmO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfVxuICAgIC8vIEFsdGVybmF0ZWx5LCBzZXQgbWF4IGRpZ2l0IGJpdHMgdG8gMjggc2luY2Ugc29tZVxuICAgIC8vIGJyb3dzZXJzIHNsb3cgZG93biB3aGVuIGRlYWxpbmcgd2l0aCAzMi1iaXQgbnVtYmVycy5cbiAgICBmdW5jdGlvbiBhbTMoaSx4LHcsaixjLG4pIHtcbiAgICAgIHZhciB4bCA9IHgmMHgzZmZmLCB4aCA9IHg+PjE0O1xuICAgICAgd2hpbGUoLS1uID49IDApIHtcbiAgICAgICAgdmFyIGwgPSB0aGlzW2ldJjB4M2ZmZjtcbiAgICAgICAgdmFyIGggPSB0aGlzW2krK10+PjE0O1xuICAgICAgICB2YXIgbSA9IHhoKmwraCp4bDtcbiAgICAgICAgbCA9IHhsKmwrKChtJjB4M2ZmZik8PDE0KSt3W2pdK2M7XG4gICAgICAgIGMgPSAobD4+MjgpKyhtPj4xNCkreGgqaDtcbiAgICAgICAgd1tqKytdID0gbCYweGZmZmZmZmY7XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9XG4gICAgdmFyIGluQnJvd3NlciA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCI7XG4gICAgaWYoaW5Ccm93c2VyICYmIGpfbG0gJiYgKG5hdmlnYXRvci5hcHBOYW1lID09IFwiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyXCIpKSB7XG4gICAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbSA9IGFtMjtcbiAgICAgIGRiaXRzID0gMzA7XG4gICAgfVxuICAgIGVsc2UgaWYoaW5Ccm93c2VyICYmIGpfbG0gJiYgKG5hdmlnYXRvci5hcHBOYW1lICE9IFwiTmV0c2NhcGVcIikpIHtcbiAgICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFtID0gYW0xO1xuICAgICAgZGJpdHMgPSAyNjtcbiAgICB9XG4gICAgZWxzZSB7IC8vIE1vemlsbGEvTmV0c2NhcGUgc2VlbXMgdG8gcHJlZmVyIGFtM1xuICAgICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYW0gPSBhbTM7XG4gICAgICBkYml0cyA9IDI4O1xuICAgIH1cblxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkRCID0gZGJpdHM7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuRE0gPSAoKDE8PGRiaXRzKS0xKTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5EViA9ICgxPDxkYml0cyk7XG5cbiAgICB2YXIgQklfRlAgPSA1MjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5GViA9IE1hdGgucG93KDIsQklfRlApO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkYxID0gQklfRlAtZGJpdHM7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuRjIgPSAyKmRiaXRzLUJJX0ZQO1xuXG4gICAgLy8gRGlnaXQgY29udmVyc2lvbnNcbiAgICB2YXIgQklfUk0gPSBcIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO1xuICAgIHZhciBCSV9SQyA9IG5ldyBBcnJheSgpO1xuICAgIHZhciBycix2djtcbiAgICByciA9IFwiMFwiLmNoYXJDb2RlQXQoMCk7XG4gICAgZm9yKHZ2ID0gMDsgdnYgPD0gOTsgKyt2dikgQklfUkNbcnIrK10gPSB2djtcbiAgICByciA9IFwiYVwiLmNoYXJDb2RlQXQoMCk7XG4gICAgZm9yKHZ2ID0gMTA7IHZ2IDwgMzY7ICsrdnYpIEJJX1JDW3JyKytdID0gdnY7XG4gICAgcnIgPSBcIkFcIi5jaGFyQ29kZUF0KDApO1xuICAgIGZvcih2diA9IDEwOyB2diA8IDM2OyArK3Z2KSBCSV9SQ1tycisrXSA9IHZ2O1xuXG4gICAgZnVuY3Rpb24gaW50MmNoYXIobikgeyByZXR1cm4gQklfUk0uY2hhckF0KG4pOyB9XG4gICAgZnVuY3Rpb24gaW50QXQocyxpKSB7XG4gICAgICB2YXIgYyA9IEJJX1JDW3MuY2hhckNvZGVBdChpKV07XG4gICAgICByZXR1cm4gKGM9PW51bGwpPy0xOmM7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgY29weSB0aGlzIHRvIHJcbiAgICBmdW5jdGlvbiBibnBDb3B5VG8ocikge1xuICAgICAgZm9yKHZhciBpID0gdGhpcy50LTE7IGkgPj0gMDsgLS1pKSByW2ldID0gdGhpc1tpXTtcbiAgICAgIHIudCA9IHRoaXMudDtcbiAgICAgIHIucyA9IHRoaXMucztcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBzZXQgZnJvbSBpbnRlZ2VyIHZhbHVlIHgsIC1EViA8PSB4IDwgRFZcbiAgICBmdW5jdGlvbiBibnBGcm9tSW50KHgpIHtcbiAgICAgIHRoaXMudCA9IDE7XG4gICAgICB0aGlzLnMgPSAoeDwwKT8tMTowO1xuICAgICAgaWYoeCA+IDApIHRoaXNbMF0gPSB4O1xuICAgICAgZWxzZSBpZih4IDwgLTEpIHRoaXNbMF0gPSB4K3RoaXMuRFY7XG4gICAgICBlbHNlIHRoaXMudCA9IDA7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGJpZ2ludCBpbml0aWFsaXplZCB0byB2YWx1ZVxuICAgIGZ1bmN0aW9uIG5idihpKSB7IHZhciByID0gbmJpKCk7IHIuZnJvbUludChpKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHNldCBmcm9tIHN0cmluZyBhbmQgcmFkaXhcbiAgICBmdW5jdGlvbiBibnBGcm9tU3RyaW5nKHMsYikge1xuICAgICAgdmFyIGs7XG4gICAgICBpZihiID09IDE2KSBrID0gNDtcbiAgICAgIGVsc2UgaWYoYiA9PSA4KSBrID0gMztcbiAgICAgIGVsc2UgaWYoYiA9PSAyNTYpIGsgPSA4OyAvLyBieXRlIGFycmF5XG4gICAgICBlbHNlIGlmKGIgPT0gMikgayA9IDE7XG4gICAgICBlbHNlIGlmKGIgPT0gMzIpIGsgPSA1O1xuICAgICAgZWxzZSBpZihiID09IDQpIGsgPSAyO1xuICAgICAgZWxzZSB7IHRoaXMuZnJvbVJhZGl4KHMsYik7IHJldHVybjsgfVxuICAgICAgdGhpcy50ID0gMDtcbiAgICAgIHRoaXMucyA9IDA7XG4gICAgICB2YXIgaSA9IHMubGVuZ3RoLCBtaSA9IGZhbHNlLCBzaCA9IDA7XG4gICAgICB3aGlsZSgtLWkgPj0gMCkge1xuICAgICAgICB2YXIgeCA9IChrPT04KT9zW2ldJjB4ZmY6aW50QXQocyxpKTtcbiAgICAgICAgaWYoeCA8IDApIHtcbiAgICAgICAgICBpZihzLmNoYXJBdChpKSA9PSBcIi1cIikgbWkgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1pID0gZmFsc2U7XG4gICAgICAgIGlmKHNoID09IDApXG4gICAgICAgICAgdGhpc1t0aGlzLnQrK10gPSB4O1xuICAgICAgICBlbHNlIGlmKHNoK2sgPiB0aGlzLkRCKSB7XG4gICAgICAgICAgdGhpc1t0aGlzLnQtMV0gfD0gKHgmKCgxPDwodGhpcy5EQi1zaCkpLTEpKTw8c2g7XG4gICAgICAgICAgdGhpc1t0aGlzLnQrK10gPSAoeD4+KHRoaXMuREItc2gpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpc1t0aGlzLnQtMV0gfD0geDw8c2g7XG4gICAgICAgIHNoICs9IGs7XG4gICAgICAgIGlmKHNoID49IHRoaXMuREIpIHNoIC09IHRoaXMuREI7XG4gICAgICB9XG4gICAgICBpZihrID09IDggJiYgKHNbMF0mMHg4MCkgIT0gMCkge1xuICAgICAgICB0aGlzLnMgPSAtMTtcbiAgICAgICAgaWYoc2ggPiAwKSB0aGlzW3RoaXMudC0xXSB8PSAoKDE8PCh0aGlzLkRCLXNoKSktMSk8PHNoO1xuICAgICAgfVxuICAgICAgdGhpcy5jbGFtcCgpO1xuICAgICAgaWYobWkpIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHRoaXMpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIGNsYW1wIG9mZiBleGNlc3MgaGlnaCB3b3Jkc1xuICAgIGZ1bmN0aW9uIGJucENsYW1wKCkge1xuICAgICAgdmFyIGMgPSB0aGlzLnMmdGhpcy5ETTtcbiAgICAgIHdoaWxlKHRoaXMudCA+IDAgJiYgdGhpc1t0aGlzLnQtMV0gPT0gYykgLS10aGlzLnQ7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBpbiBnaXZlbiByYWRpeFxuICAgIGZ1bmN0aW9uIGJuVG9TdHJpbmcoYikge1xuICAgICAgaWYodGhpcy5zIDwgMCkgcmV0dXJuIFwiLVwiK3RoaXMubmVnYXRlKCkudG9TdHJpbmcoYik7XG4gICAgICB2YXIgaztcbiAgICAgIGlmKGIgPT0gMTYpIGsgPSA0O1xuICAgICAgZWxzZSBpZihiID09IDgpIGsgPSAzO1xuICAgICAgZWxzZSBpZihiID09IDIpIGsgPSAxO1xuICAgICAgZWxzZSBpZihiID09IDMyKSBrID0gNTtcbiAgICAgIGVsc2UgaWYoYiA9PSA0KSBrID0gMjtcbiAgICAgIGVsc2UgcmV0dXJuIHRoaXMudG9SYWRpeChiKTtcbiAgICAgIHZhciBrbSA9ICgxPDxrKS0xLCBkLCBtID0gZmFsc2UsIHIgPSBcIlwiLCBpID0gdGhpcy50O1xuICAgICAgdmFyIHAgPSB0aGlzLkRCLShpKnRoaXMuREIpJWs7XG4gICAgICBpZihpLS0gPiAwKSB7XG4gICAgICAgIGlmKHAgPCB0aGlzLkRCICYmIChkID0gdGhpc1tpXT4+cCkgPiAwKSB7IG0gPSB0cnVlOyByID0gaW50MmNoYXIoZCk7IH1cbiAgICAgICAgd2hpbGUoaSA+PSAwKSB7XG4gICAgICAgICAgaWYocCA8IGspIHtcbiAgICAgICAgICAgIGQgPSAodGhpc1tpXSYoKDE8PHApLTEpKTw8KGstcCk7XG4gICAgICAgICAgICBkIHw9IHRoaXNbLS1pXT4+KHArPXRoaXMuREItayk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZCA9ICh0aGlzW2ldPj4ocC09aykpJmttO1xuICAgICAgICAgICAgaWYocCA8PSAwKSB7IHAgKz0gdGhpcy5EQjsgLS1pOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGQgPiAwKSBtID0gdHJ1ZTtcbiAgICAgICAgICBpZihtKSByICs9IGludDJjaGFyKGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbT9yOlwiMFwiO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIC10aGlzXG4gICAgZnVuY3Rpb24gYm5OZWdhdGUoKSB7IHZhciByID0gbmJpKCk7IEJpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgfHRoaXN8XG4gICAgZnVuY3Rpb24gYm5BYnMoKSB7IHJldHVybiAodGhpcy5zPDApP3RoaXMubmVnYXRlKCk6dGhpczsgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuICsgaWYgdGhpcyA+IGEsIC0gaWYgdGhpcyA8IGEsIDAgaWYgZXF1YWxcbiAgICBmdW5jdGlvbiBibkNvbXBhcmVUbyhhKSB7XG4gICAgICB2YXIgciA9IHRoaXMucy1hLnM7XG4gICAgICBpZihyICE9IDApIHJldHVybiByO1xuICAgICAgdmFyIGkgPSB0aGlzLnQ7XG4gICAgICByID0gaS1hLnQ7XG4gICAgICBpZihyICE9IDApIHJldHVybiAodGhpcy5zPDApPy1yOnI7XG4gICAgICB3aGlsZSgtLWkgPj0gMCkgaWYoKHI9dGhpc1tpXS1hW2ldKSAhPSAwKSByZXR1cm4gcjtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIHJldHVybnMgYml0IGxlbmd0aCBvZiB0aGUgaW50ZWdlciB4XG4gICAgZnVuY3Rpb24gbmJpdHMoeCkge1xuICAgICAgdmFyIHIgPSAxLCB0O1xuICAgICAgaWYoKHQ9eD4+PjE2KSAhPSAwKSB7IHggPSB0OyByICs9IDE2OyB9XG4gICAgICBpZigodD14Pj44KSAhPSAwKSB7IHggPSB0OyByICs9IDg7IH1cbiAgICAgIGlmKCh0PXg+PjQpICE9IDApIHsgeCA9IHQ7IHIgKz0gNDsgfVxuICAgICAgaWYoKHQ9eD4+MikgIT0gMCkgeyB4ID0gdDsgciArPSAyOyB9XG4gICAgICBpZigodD14Pj4xKSAhPSAwKSB7IHggPSB0OyByICs9IDE7IH1cbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gXCJ0aGlzXCJcbiAgICBmdW5jdGlvbiBibkJpdExlbmd0aCgpIHtcbiAgICAgIGlmKHRoaXMudCA8PSAwKSByZXR1cm4gMDtcbiAgICAgIHJldHVybiB0aGlzLkRCKih0aGlzLnQtMSkrbmJpdHModGhpc1t0aGlzLnQtMV1eKHRoaXMucyZ0aGlzLkRNKSk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgPDwgbipEQlxuICAgIGZ1bmN0aW9uIGJucERMU2hpZnRUbyhuLHIpIHtcbiAgICAgIHZhciBpO1xuICAgICAgZm9yKGkgPSB0aGlzLnQtMTsgaSA+PSAwOyAtLWkpIHJbaStuXSA9IHRoaXNbaV07XG4gICAgICBmb3IoaSA9IG4tMTsgaSA+PSAwOyAtLWkpIHJbaV0gPSAwO1xuICAgICAgci50ID0gdGhpcy50K247XG4gICAgICByLnMgPSB0aGlzLnM7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgPj4gbipEQlxuICAgIGZ1bmN0aW9uIGJucERSU2hpZnRUbyhuLHIpIHtcbiAgICAgIGZvcih2YXIgaSA9IG47IGkgPCB0aGlzLnQ7ICsraSkgcltpLW5dID0gdGhpc1tpXTtcbiAgICAgIHIudCA9IE1hdGgubWF4KHRoaXMudC1uLDApO1xuICAgICAgci5zID0gdGhpcy5zO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIDw8IG5cbiAgICBmdW5jdGlvbiBibnBMU2hpZnRUbyhuLHIpIHtcbiAgICAgIHZhciBicyA9IG4ldGhpcy5EQjtcbiAgICAgIHZhciBjYnMgPSB0aGlzLkRCLWJzO1xuICAgICAgdmFyIGJtID0gKDE8PGNicyktMTtcbiAgICAgIHZhciBkcyA9IE1hdGguZmxvb3Iobi90aGlzLkRCKSwgYyA9ICh0aGlzLnM8PGJzKSZ0aGlzLkRNLCBpO1xuICAgICAgZm9yKGkgPSB0aGlzLnQtMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgcltpK2RzKzFdID0gKHRoaXNbaV0+PmNicyl8YztcbiAgICAgICAgYyA9ICh0aGlzW2ldJmJtKTw8YnM7XG4gICAgICB9XG4gICAgICBmb3IoaSA9IGRzLTE7IGkgPj0gMDsgLS1pKSByW2ldID0gMDtcbiAgICAgIHJbZHNdID0gYztcbiAgICAgIHIudCA9IHRoaXMudCtkcysxO1xuICAgICAgci5zID0gdGhpcy5zO1xuICAgICAgci5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzID4+IG5cbiAgICBmdW5jdGlvbiBibnBSU2hpZnRUbyhuLHIpIHtcbiAgICAgIHIucyA9IHRoaXMucztcbiAgICAgIHZhciBkcyA9IE1hdGguZmxvb3Iobi90aGlzLkRCKTtcbiAgICAgIGlmKGRzID49IHRoaXMudCkgeyByLnQgPSAwOyByZXR1cm47IH1cbiAgICAgIHZhciBicyA9IG4ldGhpcy5EQjtcbiAgICAgIHZhciBjYnMgPSB0aGlzLkRCLWJzO1xuICAgICAgdmFyIGJtID0gKDE8PGJzKS0xO1xuICAgICAgclswXSA9IHRoaXNbZHNdPj5icztcbiAgICAgIGZvcih2YXIgaSA9IGRzKzE7IGkgPCB0aGlzLnQ7ICsraSkge1xuICAgICAgICByW2ktZHMtMV0gfD0gKHRoaXNbaV0mYm0pPDxjYnM7XG4gICAgICAgIHJbaS1kc10gPSB0aGlzW2ldPj5icztcbiAgICAgIH1cbiAgICAgIGlmKGJzID4gMCkgclt0aGlzLnQtZHMtMV0gfD0gKHRoaXMucyZibSk8PGNicztcbiAgICAgIHIudCA9IHRoaXMudC1kcztcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyAtIGFcbiAgICBmdW5jdGlvbiBibnBTdWJUbyhhLHIpIHtcbiAgICAgIHZhciBpID0gMCwgYyA9IDAsIG0gPSBNYXRoLm1pbihhLnQsdGhpcy50KTtcbiAgICAgIHdoaWxlKGkgPCBtKSB7XG4gICAgICAgIGMgKz0gdGhpc1tpXS1hW2ldO1xuICAgICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICB9XG4gICAgICBpZihhLnQgPCB0aGlzLnQpIHtcbiAgICAgICAgYyAtPSBhLnM7XG4gICAgICAgIHdoaWxlKGkgPCB0aGlzLnQpIHtcbiAgICAgICAgICBjICs9IHRoaXNbaV07XG4gICAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICAgIH1cbiAgICAgICAgYyArPSB0aGlzLnM7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgYyArPSB0aGlzLnM7XG4gICAgICAgIHdoaWxlKGkgPCBhLnQpIHtcbiAgICAgICAgICBjIC09IGFbaV07XG4gICAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICAgIH1cbiAgICAgICAgYyAtPSBhLnM7XG4gICAgICB9XG4gICAgICByLnMgPSAoYzwwKT8tMTowO1xuICAgICAgaWYoYyA8IC0xKSByW2krK10gPSB0aGlzLkRWK2M7XG4gICAgICBlbHNlIGlmKGMgPiAwKSByW2krK10gPSBjO1xuICAgICAgci50ID0gaTtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyAqIGEsIHIgIT0gdGhpcyxhIChIQUMgMTQuMTIpXG4gICAgLy8gXCJ0aGlzXCIgc2hvdWxkIGJlIHRoZSBsYXJnZXIgb25lIGlmIGFwcHJvcHJpYXRlLlxuICAgIGZ1bmN0aW9uIGJucE11bHRpcGx5VG8oYSxyKSB7XG4gICAgICB2YXIgeCA9IHRoaXMuYWJzKCksIHkgPSBhLmFicygpO1xuICAgICAgdmFyIGkgPSB4LnQ7XG4gICAgICByLnQgPSBpK3kudDtcbiAgICAgIHdoaWxlKC0taSA+PSAwKSByW2ldID0gMDtcbiAgICAgIGZvcihpID0gMDsgaSA8IHkudDsgKytpKSByW2kreC50XSA9IHguYW0oMCx5W2ldLHIsaSwwLHgudCk7XG4gICAgICByLnMgPSAwO1xuICAgICAgci5jbGFtcCgpO1xuICAgICAgaWYodGhpcy5zICE9IGEucykgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHIscik7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXNeMiwgciAhPSB0aGlzIChIQUMgMTQuMTYpXG4gICAgZnVuY3Rpb24gYm5wU3F1YXJlVG8ocikge1xuICAgICAgdmFyIHggPSB0aGlzLmFicygpO1xuICAgICAgdmFyIGkgPSByLnQgPSAyKngudDtcbiAgICAgIHdoaWxlKC0taSA+PSAwKSByW2ldID0gMDtcbiAgICAgIGZvcihpID0gMDsgaSA8IHgudC0xOyArK2kpIHtcbiAgICAgICAgdmFyIGMgPSB4LmFtKGkseFtpXSxyLDIqaSwwLDEpO1xuICAgICAgICBpZigocltpK3gudF0rPXguYW0oaSsxLDIqeFtpXSxyLDIqaSsxLGMseC50LWktMSkpID49IHguRFYpIHtcbiAgICAgICAgICByW2kreC50XSAtPSB4LkRWO1xuICAgICAgICAgIHJbaSt4LnQrMV0gPSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZihyLnQgPiAwKSByW3IudC0xXSArPSB4LmFtKGkseFtpXSxyLDIqaSwwLDEpO1xuICAgICAgci5zID0gMDtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBkaXZpZGUgdGhpcyBieSBtLCBxdW90aWVudCBhbmQgcmVtYWluZGVyIHRvIHEsIHIgKEhBQyAxNC4yMClcbiAgICAvLyByICE9IHEsIHRoaXMgIT0gbS4gIHEgb3IgciBtYXkgYmUgbnVsbC5cbiAgICBmdW5jdGlvbiBibnBEaXZSZW1UbyhtLHEscikge1xuICAgICAgdmFyIHBtID0gbS5hYnMoKTtcbiAgICAgIGlmKHBtLnQgPD0gMCkgcmV0dXJuO1xuICAgICAgdmFyIHB0ID0gdGhpcy5hYnMoKTtcbiAgICAgIGlmKHB0LnQgPCBwbS50KSB7XG4gICAgICAgIGlmKHEgIT0gbnVsbCkgcS5mcm9tSW50KDApO1xuICAgICAgICBpZihyICE9IG51bGwpIHRoaXMuY29weVRvKHIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZihyID09IG51bGwpIHIgPSBuYmkoKTtcbiAgICAgIHZhciB5ID0gbmJpKCksIHRzID0gdGhpcy5zLCBtcyA9IG0ucztcbiAgICAgIHZhciBuc2ggPSB0aGlzLkRCLW5iaXRzKHBtW3BtLnQtMV0pOyAgIC8vIG5vcm1hbGl6ZSBtb2R1bHVzXG4gICAgICBpZihuc2ggPiAwKSB7IHBtLmxTaGlmdFRvKG5zaCx5KTsgcHQubFNoaWZ0VG8obnNoLHIpOyB9XG4gICAgICBlbHNlIHsgcG0uY29weVRvKHkpOyBwdC5jb3B5VG8ocik7IH1cbiAgICAgIHZhciB5cyA9IHkudDtcbiAgICAgIHZhciB5MCA9IHlbeXMtMV07XG4gICAgICBpZih5MCA9PSAwKSByZXR1cm47XG4gICAgICB2YXIgeXQgPSB5MCooMTw8dGhpcy5GMSkrKCh5cz4xKT95W3lzLTJdPj50aGlzLkYyOjApO1xuICAgICAgdmFyIGQxID0gdGhpcy5GVi95dCwgZDIgPSAoMTw8dGhpcy5GMSkveXQsIGUgPSAxPDx0aGlzLkYyO1xuICAgICAgdmFyIGkgPSByLnQsIGogPSBpLXlzLCB0ID0gKHE9PW51bGwpP25iaSgpOnE7XG4gICAgICB5LmRsU2hpZnRUbyhqLHQpO1xuICAgICAgaWYoci5jb21wYXJlVG8odCkgPj0gMCkge1xuICAgICAgICByW3IudCsrXSA9IDE7XG4gICAgICAgIHIuc3ViVG8odCxyKTtcbiAgICAgIH1cbiAgICAgIEJpZ0ludGVnZXIuT05FLmRsU2hpZnRUbyh5cyx0KTtcbiAgICAgIHQuc3ViVG8oeSx5KTsgIC8vIFwibmVnYXRpdmVcIiB5IHNvIHdlIGNhbiByZXBsYWNlIHN1YiB3aXRoIGFtIGxhdGVyXG4gICAgICB3aGlsZSh5LnQgPCB5cykgeVt5LnQrK10gPSAwO1xuICAgICAgd2hpbGUoLS1qID49IDApIHtcbiAgICAgICAgLy8gRXN0aW1hdGUgcXVvdGllbnQgZGlnaXRcbiAgICAgICAgdmFyIHFkID0gKHJbLS1pXT09eTApP3RoaXMuRE06TWF0aC5mbG9vcihyW2ldKmQxKyhyW2ktMV0rZSkqZDIpO1xuICAgICAgICBpZigocltpXSs9eS5hbSgwLHFkLHIsaiwwLHlzKSkgPCBxZCkgeyAgIC8vIFRyeSBpdCBvdXRcbiAgICAgICAgICB5LmRsU2hpZnRUbyhqLHQpO1xuICAgICAgICAgIHIuc3ViVG8odCxyKTtcbiAgICAgICAgICB3aGlsZShyW2ldIDwgLS1xZCkgci5zdWJUbyh0LHIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZihxICE9IG51bGwpIHtcbiAgICAgICAgci5kclNoaWZ0VG8oeXMscSk7XG4gICAgICAgIGlmKHRzICE9IG1zKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8ocSxxKTtcbiAgICAgIH1cbiAgICAgIHIudCA9IHlzO1xuICAgICAgci5jbGFtcCgpO1xuICAgICAgaWYobnNoID4gMCkgci5yU2hpZnRUbyhuc2gscik7IC8vIERlbm9ybWFsaXplIHJlbWFpbmRlclxuICAgICAgaWYodHMgPCAwKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8ocixyKTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzIG1vZCBhXG4gICAgZnVuY3Rpb24gYm5Nb2QoYSkge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIHRoaXMuYWJzKCkuZGl2UmVtVG8oYSxudWxsLHIpO1xuICAgICAgaWYodGhpcy5zIDwgMCAmJiByLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pID4gMCkgYS5zdWJUbyhyLHIpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gTW9kdWxhciByZWR1Y3Rpb24gdXNpbmcgXCJjbGFzc2ljXCIgYWxnb3JpdGhtXG4gICAgZnVuY3Rpb24gQ2xhc3NpYyhtKSB7IHRoaXMubSA9IG07IH1cbiAgICBmdW5jdGlvbiBjQ29udmVydCh4KSB7XG4gICAgICBpZih4LnMgPCAwIHx8IHguY29tcGFyZVRvKHRoaXMubSkgPj0gMCkgcmV0dXJuIHgubW9kKHRoaXMubSk7XG4gICAgICBlbHNlIHJldHVybiB4O1xuICAgIH1cbiAgICBmdW5jdGlvbiBjUmV2ZXJ0KHgpIHsgcmV0dXJuIHg7IH1cbiAgICBmdW5jdGlvbiBjUmVkdWNlKHgpIHsgeC5kaXZSZW1Ubyh0aGlzLm0sbnVsbCx4KTsgfVxuICAgIGZ1bmN0aW9uIGNNdWxUbyh4LHkscikgeyB4Lm11bHRpcGx5VG8oeSxyKTsgdGhpcy5yZWR1Y2Uocik7IH1cbiAgICBmdW5jdGlvbiBjU3FyVG8oeCxyKSB7IHguc3F1YXJlVG8ocik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbiAgICBDbGFzc2ljLnByb3RvdHlwZS5jb252ZXJ0ID0gY0NvbnZlcnQ7XG4gICAgQ2xhc3NpYy5wcm90b3R5cGUucmV2ZXJ0ID0gY1JldmVydDtcbiAgICBDbGFzc2ljLnByb3RvdHlwZS5yZWR1Y2UgPSBjUmVkdWNlO1xuICAgIENsYXNzaWMucHJvdG90eXBlLm11bFRvID0gY011bFRvO1xuICAgIENsYXNzaWMucHJvdG90eXBlLnNxclRvID0gY1NxclRvO1xuXG4gICAgLy8gKHByb3RlY3RlZCkgcmV0dXJuIFwiLTEvdGhpcyAlIDJeREJcIjsgdXNlZnVsIGZvciBNb250LiByZWR1Y3Rpb25cbiAgICAvLyBqdXN0aWZpY2F0aW9uOlxuICAgIC8vICAgICAgICAgeHkgPT0gMSAobW9kIG0pXG4gICAgLy8gICAgICAgICB4eSA9ICAxK2ttXG4gICAgLy8gICB4eSgyLXh5KSA9ICgxK2ttKSgxLWttKVxuICAgIC8vIHhbeSgyLXh5KV0gPSAxLWteMm1eMlxuICAgIC8vIHhbeSgyLXh5KV0gPT0gMSAobW9kIG1eMilcbiAgICAvLyBpZiB5IGlzIDEveCBtb2QgbSwgdGhlbiB5KDIteHkpIGlzIDEveCBtb2QgbV4yXG4gICAgLy8gc2hvdWxkIHJlZHVjZSB4IGFuZCB5KDIteHkpIGJ5IG1eMiBhdCBlYWNoIHN0ZXAgdG8ga2VlcCBzaXplIGJvdW5kZWQuXG4gICAgLy8gSlMgbXVsdGlwbHkgXCJvdmVyZmxvd3NcIiBkaWZmZXJlbnRseSBmcm9tIEMvQysrLCBzbyBjYXJlIGlzIG5lZWRlZCBoZXJlLlxuICAgIGZ1bmN0aW9uIGJucEludkRpZ2l0KCkge1xuICAgICAgaWYodGhpcy50IDwgMSkgcmV0dXJuIDA7XG4gICAgICB2YXIgeCA9IHRoaXNbMF07XG4gICAgICBpZigoeCYxKSA9PSAwKSByZXR1cm4gMDtcbiAgICAgIHZhciB5ID0geCYzOyAgICAgICAvLyB5ID09IDEveCBtb2QgMl4yXG4gICAgICB5ID0gKHkqKDItKHgmMHhmKSp5KSkmMHhmOyAvLyB5ID09IDEveCBtb2QgMl40XG4gICAgICB5ID0gKHkqKDItKHgmMHhmZikqeSkpJjB4ZmY7ICAgLy8geSA9PSAxL3ggbW9kIDJeOFxuICAgICAgeSA9ICh5KigyLSgoKHgmMHhmZmZmKSp5KSYweGZmZmYpKSkmMHhmZmZmOyAgICAvLyB5ID09IDEveCBtb2QgMl4xNlxuICAgICAgLy8gbGFzdCBzdGVwIC0gY2FsY3VsYXRlIGludmVyc2UgbW9kIERWIGRpcmVjdGx5O1xuICAgICAgLy8gYXNzdW1lcyAxNiA8IERCIDw9IDMyIGFuZCBhc3N1bWVzIGFiaWxpdHkgdG8gaGFuZGxlIDQ4LWJpdCBpbnRzXG4gICAgICB5ID0gKHkqKDIteCp5JXRoaXMuRFYpKSV0aGlzLkRWOyAgICAgICAvLyB5ID09IDEveCBtb2QgMl5kYml0c1xuICAgICAgLy8gd2UgcmVhbGx5IHdhbnQgdGhlIG5lZ2F0aXZlIGludmVyc2UsIGFuZCAtRFYgPCB5IDwgRFZcbiAgICAgIHJldHVybiAoeT4wKT90aGlzLkRWLXk6LXk7XG4gICAgfVxuXG4gICAgLy8gTW9udGdvbWVyeSByZWR1Y3Rpb25cbiAgICBmdW5jdGlvbiBNb250Z29tZXJ5KG0pIHtcbiAgICAgIHRoaXMubSA9IG07XG4gICAgICB0aGlzLm1wID0gbS5pbnZEaWdpdCgpO1xuICAgICAgdGhpcy5tcGwgPSB0aGlzLm1wJjB4N2ZmZjtcbiAgICAgIHRoaXMubXBoID0gdGhpcy5tcD4+MTU7XG4gICAgICB0aGlzLnVtID0gKDE8PChtLkRCLTE1KSktMTtcbiAgICAgIHRoaXMubXQyID0gMiptLnQ7XG4gICAgfVxuXG4gICAgLy8geFIgbW9kIG1cbiAgICBmdW5jdGlvbiBtb250Q29udmVydCh4KSB7XG4gICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgeC5hYnMoKS5kbFNoaWZ0VG8odGhpcy5tLnQscik7XG4gICAgICByLmRpdlJlbVRvKHRoaXMubSxudWxsLHIpO1xuICAgICAgaWYoeC5zIDwgMCAmJiByLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pID4gMCkgdGhpcy5tLnN1YlRvKHIscik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyB4L1IgbW9kIG1cbiAgICBmdW5jdGlvbiBtb250UmV2ZXJ0KHgpIHtcbiAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICB4LmNvcHlUbyhyKTtcbiAgICAgIHRoaXMucmVkdWNlKHIpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8geCA9IHgvUiBtb2QgbSAoSEFDIDE0LjMyKVxuICAgIGZ1bmN0aW9uIG1vbnRSZWR1Y2UoeCkge1xuICAgICAgd2hpbGUoeC50IDw9IHRoaXMubXQyKSAvLyBwYWQgeCBzbyBhbSBoYXMgZW5vdWdoIHJvb20gbGF0ZXJcbiAgICAgICAgeFt4LnQrK10gPSAwO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMubS50OyArK2kpIHtcbiAgICAgICAgLy8gZmFzdGVyIHdheSBvZiBjYWxjdWxhdGluZyB1MCA9IHhbaV0qbXAgbW9kIERWXG4gICAgICAgIHZhciBqID0geFtpXSYweDdmZmY7XG4gICAgICAgIHZhciB1MCA9IChqKnRoaXMubXBsKygoKGoqdGhpcy5tcGgrKHhbaV0+PjE1KSp0aGlzLm1wbCkmdGhpcy51bSk8PDE1KSkmeC5ETTtcbiAgICAgICAgLy8gdXNlIGFtIHRvIGNvbWJpbmUgdGhlIG11bHRpcGx5LXNoaWZ0LWFkZCBpbnRvIG9uZSBjYWxsXG4gICAgICAgIGogPSBpK3RoaXMubS50O1xuICAgICAgICB4W2pdICs9IHRoaXMubS5hbSgwLHUwLHgsaSwwLHRoaXMubS50KTtcbiAgICAgICAgLy8gcHJvcGFnYXRlIGNhcnJ5XG4gICAgICAgIHdoaWxlKHhbal0gPj0geC5EVikgeyB4W2pdIC09IHguRFY7IHhbKytqXSsrOyB9XG4gICAgICB9XG4gICAgICB4LmNsYW1wKCk7XG4gICAgICB4LmRyU2hpZnRUbyh0aGlzLm0udCx4KTtcbiAgICAgIGlmKHguY29tcGFyZVRvKHRoaXMubSkgPj0gMCkgeC5zdWJUbyh0aGlzLm0seCk7XG4gICAgfVxuXG4gICAgLy8gciA9IFwieF4yL1IgbW9kIG1cIjsgeCAhPSByXG4gICAgZnVuY3Rpb24gbW9udFNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG4gICAgLy8gciA9IFwieHkvUiBtb2QgbVwiOyB4LHkgIT0gclxuICAgIGZ1bmN0aW9uIG1vbnRNdWxUbyh4LHkscikgeyB4Lm11bHRpcGx5VG8oeSxyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuICAgIE1vbnRnb21lcnkucHJvdG90eXBlLmNvbnZlcnQgPSBtb250Q29udmVydDtcbiAgICBNb250Z29tZXJ5LnByb3RvdHlwZS5yZXZlcnQgPSBtb250UmV2ZXJ0O1xuICAgIE1vbnRnb21lcnkucHJvdG90eXBlLnJlZHVjZSA9IG1vbnRSZWR1Y2U7XG4gICAgTW9udGdvbWVyeS5wcm90b3R5cGUubXVsVG8gPSBtb250TXVsVG87XG4gICAgTW9udGdvbWVyeS5wcm90b3R5cGUuc3FyVG8gPSBtb250U3FyVG87XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0cnVlIGlmZiB0aGlzIGlzIGV2ZW5cbiAgICBmdW5jdGlvbiBibnBJc0V2ZW4oKSB7IHJldHVybiAoKHRoaXMudD4wKT8odGhpc1swXSYxKTp0aGlzLnMpID09IDA7IH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXNeZSwgZSA8IDJeMzIsIGRvaW5nIHNxciBhbmQgbXVsIHdpdGggXCJyXCIgKEhBQyAxNC43OSlcbiAgICBmdW5jdGlvbiBibnBFeHAoZSx6KSB7XG4gICAgICBpZihlID4gMHhmZmZmZmZmZiB8fCBlIDwgMSkgcmV0dXJuIEJpZ0ludGVnZXIuT05FO1xuICAgICAgdmFyIHIgPSBuYmkoKSwgcjIgPSBuYmkoKSwgZyA9IHouY29udmVydCh0aGlzKSwgaSA9IG5iaXRzKGUpLTE7XG4gICAgICBnLmNvcHlUbyhyKTtcbiAgICAgIHdoaWxlKC0taSA+PSAwKSB7XG4gICAgICAgIHouc3FyVG8ocixyMik7XG4gICAgICAgIGlmKChlJigxPDxpKSkgPiAwKSB6Lm11bFRvKHIyLGcscik7XG4gICAgICAgIGVsc2UgeyB2YXIgdCA9IHI7IHIgPSByMjsgcjIgPSB0OyB9XG4gICAgICB9XG4gICAgICByZXR1cm4gei5yZXZlcnQocik7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpc15lICUgbSwgMCA8PSBlIDwgMl4zMlxuICAgIGZ1bmN0aW9uIGJuTW9kUG93SW50KGUsbSkge1xuICAgICAgdmFyIHo7XG4gICAgICBpZihlIDwgMjU2IHx8IG0uaXNFdmVuKCkpIHogPSBuZXcgQ2xhc3NpYyhtKTsgZWxzZSB6ID0gbmV3IE1vbnRnb21lcnkobSk7XG4gICAgICByZXR1cm4gdGhpcy5leHAoZSx6KTtcbiAgICB9XG5cbiAgICAvLyBwcm90ZWN0ZWRcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jb3B5VG8gPSBibnBDb3B5VG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbUludCA9IGJucEZyb21JbnQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVN0cmluZyA9IGJucEZyb21TdHJpbmc7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2xhbXAgPSBibnBDbGFtcDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kbFNoaWZ0VG8gPSBibnBETFNoaWZ0VG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvID0gYm5wRFJTaGlmdFRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmxTaGlmdFRvID0gYm5wTFNoaWZ0VG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuclNoaWZ0VG8gPSBibnBSU2hpZnRUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbyA9IGJucFN1YlRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5VG8gPSBibnBNdWx0aXBseVRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNxdWFyZVRvID0gYm5wU3F1YXJlVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2UmVtVG8gPSBibnBEaXZSZW1UbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pbnZEaWdpdCA9IGJucEludkRpZ2l0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmlzRXZlbiA9IGJucElzRXZlbjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5leHAgPSBibnBFeHA7XG5cbiAgICAvLyBwdWJsaWNcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS50b1N0cmluZyA9IGJuVG9TdHJpbmc7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlID0gYm5OZWdhdGU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYWJzID0gYm5BYnM7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY29tcGFyZVRvID0gYm5Db21wYXJlVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYml0TGVuZ3RoID0gYm5CaXRMZW5ndGg7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kID0gYm5Nb2Q7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93SW50ID0gYm5Nb2RQb3dJbnQ7XG5cbiAgICAvLyBcImNvbnN0YW50c1wiXG4gICAgQmlnSW50ZWdlci5aRVJPID0gbmJ2KDApO1xuICAgIEJpZ0ludGVnZXIuT05FID0gbmJ2KDEpO1xuXG4gICAgLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgIFRvbSBXdVxuICAgIC8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gICAgLy8gU2VlIFwiTElDRU5TRVwiIGZvciBkZXRhaWxzLlxuXG4gICAgLy8gRXh0ZW5kZWQgSmF2YVNjcmlwdCBCTiBmdW5jdGlvbnMsIHJlcXVpcmVkIGZvciBSU0EgcHJpdmF0ZSBvcHMuXG5cbiAgICAvLyBWZXJzaW9uIDEuMTogbmV3IEJpZ0ludGVnZXIoXCIwXCIsIDEwKSByZXR1cm5zIFwicHJvcGVyXCIgemVyb1xuICAgIC8vIFZlcnNpb24gMS4yOiBzcXVhcmUoKSBBUEksIGlzUHJvYmFibGVQcmltZSBmaXhcblxuICAgIC8vIChwdWJsaWMpXG4gICAgZnVuY3Rpb24gYm5DbG9uZSgpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5jb3B5VG8ocik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gdmFsdWUgYXMgaW50ZWdlclxuICAgIGZ1bmN0aW9uIGJuSW50VmFsdWUoKSB7XG4gICAgICBpZih0aGlzLnMgPCAwKSB7XG4gICAgICAgIGlmKHRoaXMudCA9PSAxKSByZXR1cm4gdGhpc1swXS10aGlzLkRWO1xuICAgICAgICBlbHNlIGlmKHRoaXMudCA9PSAwKSByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBlbHNlIGlmKHRoaXMudCA9PSAxKSByZXR1cm4gdGhpc1swXTtcbiAgICAgIGVsc2UgaWYodGhpcy50ID09IDApIHJldHVybiAwO1xuICAgICAgLy8gYXNzdW1lcyAxNiA8IERCIDwgMzJcbiAgICAgIHJldHVybiAoKHRoaXNbMV0mKCgxPDwoMzItdGhpcy5EQikpLTEpKTw8dGhpcy5EQil8dGhpc1swXTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gdmFsdWUgYXMgYnl0ZVxuICAgIGZ1bmN0aW9uIGJuQnl0ZVZhbHVlKCkgeyByZXR1cm4gKHRoaXMudD09MCk/dGhpcy5zOih0aGlzWzBdPDwyNCk+PjI0OyB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gdmFsdWUgYXMgc2hvcnQgKGFzc3VtZXMgREI+PTE2KVxuICAgIGZ1bmN0aW9uIGJuU2hvcnRWYWx1ZSgpIHsgcmV0dXJuICh0aGlzLnQ9PTApP3RoaXMuczoodGhpc1swXTw8MTYpPj4xNjsgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgcmV0dXJuIHggcy50LiByXnggPCBEVlxuICAgIGZ1bmN0aW9uIGJucENodW5rU2l6ZShyKSB7IHJldHVybiBNYXRoLmZsb29yKE1hdGguTE4yKnRoaXMuREIvTWF0aC5sb2cocikpOyB9XG5cbiAgICAvLyAocHVibGljKSAwIGlmIHRoaXMgPT0gMCwgMSBpZiB0aGlzID4gMFxuICAgIGZ1bmN0aW9uIGJuU2lnTnVtKCkge1xuICAgICAgaWYodGhpcy5zIDwgMCkgcmV0dXJuIC0xO1xuICAgICAgZWxzZSBpZih0aGlzLnQgPD0gMCB8fCAodGhpcy50ID09IDEgJiYgdGhpc1swXSA8PSAwKSkgcmV0dXJuIDA7XG4gICAgICBlbHNlIHJldHVybiAxO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIGNvbnZlcnQgdG8gcmFkaXggc3RyaW5nXG4gICAgZnVuY3Rpb24gYm5wVG9SYWRpeChiKSB7XG4gICAgICBpZihiID09IG51bGwpIGIgPSAxMDtcbiAgICAgIGlmKHRoaXMuc2lnbnVtKCkgPT0gMCB8fCBiIDwgMiB8fCBiID4gMzYpIHJldHVybiBcIjBcIjtcbiAgICAgIHZhciBjcyA9IHRoaXMuY2h1bmtTaXplKGIpO1xuICAgICAgdmFyIGEgPSBNYXRoLnBvdyhiLGNzKTtcbiAgICAgIHZhciBkID0gbmJ2KGEpLCB5ID0gbmJpKCksIHogPSBuYmkoKSwgciA9IFwiXCI7XG4gICAgICB0aGlzLmRpdlJlbVRvKGQseSx6KTtcbiAgICAgIHdoaWxlKHkuc2lnbnVtKCkgPiAwKSB7XG4gICAgICAgIHIgPSAoYSt6LmludFZhbHVlKCkpLnRvU3RyaW5nKGIpLnN1YnN0cigxKSArIHI7XG4gICAgICAgIHkuZGl2UmVtVG8oZCx5LHopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHouaW50VmFsdWUoKS50b1N0cmluZyhiKSArIHI7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgY29udmVydCBmcm9tIHJhZGl4IHN0cmluZ1xuICAgIGZ1bmN0aW9uIGJucEZyb21SYWRpeChzLGIpIHtcbiAgICAgIHRoaXMuZnJvbUludCgwKTtcbiAgICAgIGlmKGIgPT0gbnVsbCkgYiA9IDEwO1xuICAgICAgdmFyIGNzID0gdGhpcy5jaHVua1NpemUoYik7XG4gICAgICB2YXIgZCA9IE1hdGgucG93KGIsY3MpLCBtaSA9IGZhbHNlLCBqID0gMCwgdyA9IDA7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgeCA9IGludEF0KHMsaSk7XG4gICAgICAgIGlmKHggPCAwKSB7XG4gICAgICAgICAgaWYocy5jaGFyQXQoaSkgPT0gXCItXCIgJiYgdGhpcy5zaWdudW0oKSA9PSAwKSBtaSA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdyA9IGIqdyt4O1xuICAgICAgICBpZigrK2ogPj0gY3MpIHtcbiAgICAgICAgICB0aGlzLmRNdWx0aXBseShkKTtcbiAgICAgICAgICB0aGlzLmRBZGRPZmZzZXQodywwKTtcbiAgICAgICAgICBqID0gMDtcbiAgICAgICAgICB3ID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYoaiA+IDApIHtcbiAgICAgICAgdGhpcy5kTXVsdGlwbHkoTWF0aC5wb3coYixqKSk7XG4gICAgICAgIHRoaXMuZEFkZE9mZnNldCh3LDApO1xuICAgICAgfVxuICAgICAgaWYobWkpIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHRoaXMpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIGFsdGVybmF0ZSBjb25zdHJ1Y3RvclxuICAgIGZ1bmN0aW9uIGJucEZyb21OdW1iZXIoYSxiLGMpIHtcbiAgICAgIGlmKFwibnVtYmVyXCIgPT0gdHlwZW9mIGIpIHtcbiAgICAgICAgLy8gbmV3IEJpZ0ludGVnZXIoaW50LGludCxSTkcpXG4gICAgICAgIGlmKGEgPCAyKSB0aGlzLmZyb21JbnQoMSk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuZnJvbU51bWJlcihhLGMpO1xuICAgICAgICAgIGlmKCF0aGlzLnRlc3RCaXQoYS0xKSkgICAgLy8gZm9yY2UgTVNCIHNldFxuICAgICAgICAgICAgdGhpcy5iaXR3aXNlVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGEtMSksb3Bfb3IsdGhpcyk7XG4gICAgICAgICAgaWYodGhpcy5pc0V2ZW4oKSkgdGhpcy5kQWRkT2Zmc2V0KDEsMCk7IC8vIGZvcmNlIG9kZFxuICAgICAgICAgIHdoaWxlKCF0aGlzLmlzUHJvYmFibGVQcmltZShiKSkge1xuICAgICAgICAgICAgdGhpcy5kQWRkT2Zmc2V0KDIsMCk7XG4gICAgICAgICAgICBpZih0aGlzLmJpdExlbmd0aCgpID4gYSkgdGhpcy5zdWJUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoYS0xKSx0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBuZXcgQmlnSW50ZWdlcihpbnQsUk5HKVxuICAgICAgICB2YXIgeCA9IG5ldyBBcnJheSgpLCB0ID0gYSY3O1xuICAgICAgICB4Lmxlbmd0aCA9IChhPj4zKSsxO1xuICAgICAgICBiLm5leHRCeXRlcyh4KTtcbiAgICAgICAgaWYodCA+IDApIHhbMF0gJj0gKCgxPDx0KS0xKTsgZWxzZSB4WzBdID0gMDtcbiAgICAgICAgdGhpcy5mcm9tU3RyaW5nKHgsMjU2KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAocHVibGljKSBjb252ZXJ0IHRvIGJpZ2VuZGlhbiBieXRlIGFycmF5XG4gICAgZnVuY3Rpb24gYm5Ub0J5dGVBcnJheSgpIHtcbiAgICAgIHZhciBpID0gdGhpcy50LCByID0gbmV3IEFycmF5KCk7XG4gICAgICByWzBdID0gdGhpcy5zO1xuICAgICAgdmFyIHAgPSB0aGlzLkRCLShpKnRoaXMuREIpJTgsIGQsIGsgPSAwO1xuICAgICAgaWYoaS0tID4gMCkge1xuICAgICAgICBpZihwIDwgdGhpcy5EQiAmJiAoZCA9IHRoaXNbaV0+PnApICE9ICh0aGlzLnMmdGhpcy5ETSk+PnApXG4gICAgICAgICAgcltrKytdID0gZHwodGhpcy5zPDwodGhpcy5EQi1wKSk7XG4gICAgICAgIHdoaWxlKGkgPj0gMCkge1xuICAgICAgICAgIGlmKHAgPCA4KSB7XG4gICAgICAgICAgICBkID0gKHRoaXNbaV0mKCgxPDxwKS0xKSk8PCg4LXApO1xuICAgICAgICAgICAgZCB8PSB0aGlzWy0taV0+PihwKz10aGlzLkRCLTgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGQgPSAodGhpc1tpXT4+KHAtPTgpKSYweGZmO1xuICAgICAgICAgICAgaWYocCA8PSAwKSB7IHAgKz0gdGhpcy5EQjsgLS1pOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKChkJjB4ODApICE9IDApIGQgfD0gLTI1NjtcbiAgICAgICAgICBpZihrID09IDAgJiYgKHRoaXMucyYweDgwKSAhPSAoZCYweDgwKSkgKytrO1xuICAgICAgICAgIGlmKGsgPiAwIHx8IGQgIT0gdGhpcy5zKSByW2srK10gPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBibkVxdWFscyhhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKT09MCk7IH1cbiAgICBmdW5jdGlvbiBibk1pbihhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKTwwKT90aGlzOmE7IH1cbiAgICBmdW5jdGlvbiBibk1heChhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKT4wKT90aGlzOmE7IH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIG9wIGEgKGJpdHdpc2UpXG4gICAgZnVuY3Rpb24gYm5wQml0d2lzZVRvKGEsb3Ascikge1xuICAgICAgdmFyIGksIGYsIG0gPSBNYXRoLm1pbihhLnQsdGhpcy50KTtcbiAgICAgIGZvcihpID0gMDsgaSA8IG07ICsraSkgcltpXSA9IG9wKHRoaXNbaV0sYVtpXSk7XG4gICAgICBpZihhLnQgPCB0aGlzLnQpIHtcbiAgICAgICAgZiA9IGEucyZ0aGlzLkRNO1xuICAgICAgICBmb3IoaSA9IG07IGkgPCB0aGlzLnQ7ICsraSkgcltpXSA9IG9wKHRoaXNbaV0sZik7XG4gICAgICAgIHIudCA9IHRoaXMudDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBmID0gdGhpcy5zJnRoaXMuRE07XG4gICAgICAgIGZvcihpID0gbTsgaSA8IGEudDsgKytpKSByW2ldID0gb3AoZixhW2ldKTtcbiAgICAgICAgci50ID0gYS50O1xuICAgICAgfVxuICAgICAgci5zID0gb3AodGhpcy5zLGEucyk7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAmIGFcbiAgICBmdW5jdGlvbiBvcF9hbmQoeCx5KSB7IHJldHVybiB4Jnk7IH1cbiAgICBmdW5jdGlvbiBibkFuZChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfYW5kLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyB8IGFcbiAgICBmdW5jdGlvbiBvcF9vcih4LHkpIHsgcmV0dXJuIHh8eTsgfVxuICAgIGZ1bmN0aW9uIGJuT3IoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmJpdHdpc2VUbyhhLG9wX29yLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyBeIGFcbiAgICBmdW5jdGlvbiBvcF94b3IoeCx5KSB7IHJldHVybiB4Xnk7IH1cbiAgICBmdW5jdGlvbiBiblhvcihhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfeG9yLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAmIH5hXG4gICAgZnVuY3Rpb24gb3BfYW5kbm90KHgseSkgeyByZXR1cm4geCZ+eTsgfVxuICAgIGZ1bmN0aW9uIGJuQW5kTm90KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5iaXR3aXNlVG8oYSxvcF9hbmRub3Qscik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB+dGhpc1xuICAgIGZ1bmN0aW9uIGJuTm90KCkge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnQ7ICsraSkgcltpXSA9IHRoaXMuRE0mfnRoaXNbaV07XG4gICAgICByLnQgPSB0aGlzLnQ7XG4gICAgICByLnMgPSB+dGhpcy5zO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyA8PCBuXG4gICAgZnVuY3Rpb24gYm5TaGlmdExlZnQobikge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIGlmKG4gPCAwKSB0aGlzLnJTaGlmdFRvKC1uLHIpOyBlbHNlIHRoaXMubFNoaWZ0VG8obixyKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgPj4gblxuICAgIGZ1bmN0aW9uIGJuU2hpZnRSaWdodChuKSB7XG4gICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgaWYobiA8IDApIHRoaXMubFNoaWZ0VG8oLW4scik7IGVsc2UgdGhpcy5yU2hpZnRUbyhuLHIpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIGluZGV4IG9mIGxvd2VzdCAxLWJpdCBpbiB4LCB4IDwgMl4zMVxuICAgIGZ1bmN0aW9uIGxiaXQoeCkge1xuICAgICAgaWYoeCA9PSAwKSByZXR1cm4gLTE7XG4gICAgICB2YXIgciA9IDA7XG4gICAgICBpZigoeCYweGZmZmYpID09IDApIHsgeCA+Pj0gMTY7IHIgKz0gMTY7IH1cbiAgICAgIGlmKCh4JjB4ZmYpID09IDApIHsgeCA+Pj0gODsgciArPSA4OyB9XG4gICAgICBpZigoeCYweGYpID09IDApIHsgeCA+Pj0gNDsgciArPSA0OyB9XG4gICAgICBpZigoeCYzKSA9PSAwKSB7IHggPj49IDI7IHIgKz0gMjsgfVxuICAgICAgaWYoKHgmMSkgPT0gMCkgKytyO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJucyBpbmRleCBvZiBsb3dlc3QgMS1iaXQgKG9yIC0xIGlmIG5vbmUpXG4gICAgZnVuY3Rpb24gYm5HZXRMb3dlc3RTZXRCaXQoKSB7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy50OyArK2kpXG4gICAgICAgIGlmKHRoaXNbaV0gIT0gMCkgcmV0dXJuIGkqdGhpcy5EQitsYml0KHRoaXNbaV0pO1xuICAgICAgaWYodGhpcy5zIDwgMCkgcmV0dXJuIHRoaXMudCp0aGlzLkRCO1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8vIHJldHVybiBudW1iZXIgb2YgMSBiaXRzIGluIHhcbiAgICBmdW5jdGlvbiBjYml0KHgpIHtcbiAgICAgIHZhciByID0gMDtcbiAgICAgIHdoaWxlKHggIT0gMCkgeyB4ICY9IHgtMTsgKytyOyB9XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gbnVtYmVyIG9mIHNldCBiaXRzXG4gICAgZnVuY3Rpb24gYm5CaXRDb3VudCgpIHtcbiAgICAgIHZhciByID0gMCwgeCA9IHRoaXMucyZ0aGlzLkRNO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMudDsgKytpKSByICs9IGNiaXQodGhpc1tpXV54KTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRydWUgaWZmIG50aCBiaXQgaXMgc2V0XG4gICAgZnVuY3Rpb24gYm5UZXN0Qml0KG4pIHtcbiAgICAgIHZhciBqID0gTWF0aC5mbG9vcihuL3RoaXMuREIpO1xuICAgICAgaWYoaiA+PSB0aGlzLnQpIHJldHVybih0aGlzLnMhPTApO1xuICAgICAgcmV0dXJuKCh0aGlzW2pdJigxPDwobiV0aGlzLkRCKSkpIT0wKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0aGlzIG9wICgxPDxuKVxuICAgIGZ1bmN0aW9uIGJucENoYW5nZUJpdChuLG9wKSB7XG4gICAgICB2YXIgciA9IEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChuKTtcbiAgICAgIHRoaXMuYml0d2lzZVRvKHIsb3Ascik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzIHwgKDE8PG4pXG4gICAgZnVuY3Rpb24gYm5TZXRCaXQobikgeyByZXR1cm4gdGhpcy5jaGFuZ2VCaXQobixvcF9vcik7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgJiB+KDE8PG4pXG4gICAgZnVuY3Rpb24gYm5DbGVhckJpdChuKSB7IHJldHVybiB0aGlzLmNoYW5nZUJpdChuLG9wX2FuZG5vdCk7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgXiAoMTw8bilcbiAgICBmdW5jdGlvbiBibkZsaXBCaXQobikgeyByZXR1cm4gdGhpcy5jaGFuZ2VCaXQobixvcF94b3IpOyB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyArIGFcbiAgICBmdW5jdGlvbiBibnBBZGRUbyhhLHIpIHtcbiAgICAgIHZhciBpID0gMCwgYyA9IDAsIG0gPSBNYXRoLm1pbihhLnQsdGhpcy50KTtcbiAgICAgIHdoaWxlKGkgPCBtKSB7XG4gICAgICAgIGMgKz0gdGhpc1tpXSthW2ldO1xuICAgICAgICByW2krK10gPSBjJnRoaXMuRE07XG4gICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICB9XG4gICAgICBpZihhLnQgPCB0aGlzLnQpIHtcbiAgICAgICAgYyArPSBhLnM7XG4gICAgICAgIHdoaWxlKGkgPCB0aGlzLnQpIHtcbiAgICAgICAgICBjICs9IHRoaXNbaV07XG4gICAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICAgIH1cbiAgICAgICAgYyArPSB0aGlzLnM7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgYyArPSB0aGlzLnM7XG4gICAgICAgIHdoaWxlKGkgPCBhLnQpIHtcbiAgICAgICAgICBjICs9IGFbaV07XG4gICAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgICAgIH1cbiAgICAgICAgYyArPSBhLnM7XG4gICAgICB9XG4gICAgICByLnMgPSAoYzwwKT8tMTowO1xuICAgICAgaWYoYyA+IDApIHJbaSsrXSA9IGM7XG4gICAgICBlbHNlIGlmKGMgPCAtMSkgcltpKytdID0gdGhpcy5EVitjO1xuICAgICAgci50ID0gaTtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzICsgYVxuICAgIGZ1bmN0aW9uIGJuQWRkKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5hZGRUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAtIGFcbiAgICBmdW5jdGlvbiBiblN1YnRyYWN0KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5zdWJUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyAqIGFcbiAgICBmdW5jdGlvbiBibk11bHRpcGx5KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5tdWx0aXBseVRvKGEscik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzXjJcbiAgICBmdW5jdGlvbiBiblNxdWFyZSgpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5zcXVhcmVUbyhyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgLyBhXG4gICAgZnVuY3Rpb24gYm5EaXZpZGUoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmRpdlJlbVRvKGEscixudWxsKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgJSBhXG4gICAgZnVuY3Rpb24gYm5SZW1haW5kZXIoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmRpdlJlbVRvKGEsbnVsbCxyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIFt0aGlzL2EsdGhpcyVhXVxuICAgIGZ1bmN0aW9uIGJuRGl2aWRlQW5kUmVtYWluZGVyKGEpIHtcbiAgICAgIHZhciBxID0gbmJpKCksIHIgPSBuYmkoKTtcbiAgICAgIHRoaXMuZGl2UmVtVG8oYSxxLHIpO1xuICAgICAgcmV0dXJuIG5ldyBBcnJheShxLHIpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXMgKj0gbiwgdGhpcyA+PSAwLCAxIDwgbiA8IERWXG4gICAgZnVuY3Rpb24gYm5wRE11bHRpcGx5KG4pIHtcbiAgICAgIHRoaXNbdGhpcy50XSA9IHRoaXMuYW0oMCxuLTEsdGhpcywwLDAsdGhpcy50KTtcbiAgICAgICsrdGhpcy50O1xuICAgICAgdGhpcy5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXMgKz0gbiA8PCB3IHdvcmRzLCB0aGlzID49IDBcbiAgICBmdW5jdGlvbiBibnBEQWRkT2Zmc2V0KG4sdykge1xuICAgICAgaWYobiA9PSAwKSByZXR1cm47XG4gICAgICB3aGlsZSh0aGlzLnQgPD0gdykgdGhpc1t0aGlzLnQrK10gPSAwO1xuICAgICAgdGhpc1t3XSArPSBuO1xuICAgICAgd2hpbGUodGhpc1t3XSA+PSB0aGlzLkRWKSB7XG4gICAgICAgIHRoaXNbd10gLT0gdGhpcy5EVjtcbiAgICAgICAgaWYoKyt3ID49IHRoaXMudCkgdGhpc1t0aGlzLnQrK10gPSAwO1xuICAgICAgICArK3RoaXNbd107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQSBcIm51bGxcIiByZWR1Y2VyXG4gICAgZnVuY3Rpb24gTnVsbEV4cCgpIHt9XG4gICAgZnVuY3Rpb24gbk5vcCh4KSB7IHJldHVybiB4OyB9XG4gICAgZnVuY3Rpb24gbk11bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB9XG4gICAgZnVuY3Rpb24gblNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB9XG5cbiAgICBOdWxsRXhwLnByb3RvdHlwZS5jb252ZXJ0ID0gbk5vcDtcbiAgICBOdWxsRXhwLnByb3RvdHlwZS5yZXZlcnQgPSBuTm9wO1xuICAgIE51bGxFeHAucHJvdG90eXBlLm11bFRvID0gbk11bFRvO1xuICAgIE51bGxFeHAucHJvdG90eXBlLnNxclRvID0gblNxclRvO1xuXG4gICAgLy8gKHB1YmxpYykgdGhpc15lXG4gICAgZnVuY3Rpb24gYm5Qb3coZSkgeyByZXR1cm4gdGhpcy5leHAoZSxuZXcgTnVsbEV4cCgpKTsgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IGxvd2VyIG4gd29yZHMgb2YgXCJ0aGlzICogYVwiLCBhLnQgPD0gblxuICAgIC8vIFwidGhpc1wiIHNob3VsZCBiZSB0aGUgbGFyZ2VyIG9uZSBpZiBhcHByb3ByaWF0ZS5cbiAgICBmdW5jdGlvbiBibnBNdWx0aXBseUxvd2VyVG8oYSxuLHIpIHtcbiAgICAgIHZhciBpID0gTWF0aC5taW4odGhpcy50K2EudCxuKTtcbiAgICAgIHIucyA9IDA7IC8vIGFzc3VtZXMgYSx0aGlzID49IDBcbiAgICAgIHIudCA9IGk7XG4gICAgICB3aGlsZShpID4gMCkgclstLWldID0gMDtcbiAgICAgIHZhciBqO1xuICAgICAgZm9yKGogPSByLnQtdGhpcy50OyBpIDwgajsgKytpKSByW2krdGhpcy50XSA9IHRoaXMuYW0oMCxhW2ldLHIsaSwwLHRoaXMudCk7XG4gICAgICBmb3IoaiA9IE1hdGgubWluKGEudCxuKTsgaSA8IGo7ICsraSkgdGhpcy5hbSgwLGFbaV0scixpLDAsbi1pKTtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gXCJ0aGlzICogYVwiIHdpdGhvdXQgbG93ZXIgbiB3b3JkcywgbiA+IDBcbiAgICAvLyBcInRoaXNcIiBzaG91bGQgYmUgdGhlIGxhcmdlciBvbmUgaWYgYXBwcm9wcmlhdGUuXG4gICAgZnVuY3Rpb24gYm5wTXVsdGlwbHlVcHBlclRvKGEsbixyKSB7XG4gICAgICAtLW47XG4gICAgICB2YXIgaSA9IHIudCA9IHRoaXMudCthLnQtbjtcbiAgICAgIHIucyA9IDA7IC8vIGFzc3VtZXMgYSx0aGlzID49IDBcbiAgICAgIHdoaWxlKC0taSA+PSAwKSByW2ldID0gMDtcbiAgICAgIGZvcihpID0gTWF0aC5tYXgobi10aGlzLnQsMCk7IGkgPCBhLnQ7ICsraSlcbiAgICAgICAgclt0aGlzLnQraS1uXSA9IHRoaXMuYW0obi1pLGFbaV0sciwwLDAsdGhpcy50K2ktbik7XG4gICAgICByLmNsYW1wKCk7XG4gICAgICByLmRyU2hpZnRUbygxLHIpO1xuICAgIH1cblxuICAgIC8vIEJhcnJldHQgbW9kdWxhciByZWR1Y3Rpb25cbiAgICBmdW5jdGlvbiBCYXJyZXR0KG0pIHtcbiAgICAgIC8vIHNldHVwIEJhcnJldHRcbiAgICAgIHRoaXMucjIgPSBuYmkoKTtcbiAgICAgIHRoaXMucTMgPSBuYmkoKTtcbiAgICAgIEJpZ0ludGVnZXIuT05FLmRsU2hpZnRUbygyKm0udCx0aGlzLnIyKTtcbiAgICAgIHRoaXMubXUgPSB0aGlzLnIyLmRpdmlkZShtKTtcbiAgICAgIHRoaXMubSA9IG07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYmFycmV0dENvbnZlcnQoeCkge1xuICAgICAgaWYoeC5zIDwgMCB8fCB4LnQgPiAyKnRoaXMubS50KSByZXR1cm4geC5tb2QodGhpcy5tKTtcbiAgICAgIGVsc2UgaWYoeC5jb21wYXJlVG8odGhpcy5tKSA8IDApIHJldHVybiB4O1xuICAgICAgZWxzZSB7IHZhciByID0gbmJpKCk7IHguY29weVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgcmV0dXJuIHI7IH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBiYXJyZXR0UmV2ZXJ0KHgpIHsgcmV0dXJuIHg7IH1cblxuICAgIC8vIHggPSB4IG1vZCBtIChIQUMgMTQuNDIpXG4gICAgZnVuY3Rpb24gYmFycmV0dFJlZHVjZSh4KSB7XG4gICAgICB4LmRyU2hpZnRUbyh0aGlzLm0udC0xLHRoaXMucjIpO1xuICAgICAgaWYoeC50ID4gdGhpcy5tLnQrMSkgeyB4LnQgPSB0aGlzLm0udCsxOyB4LmNsYW1wKCk7IH1cbiAgICAgIHRoaXMubXUubXVsdGlwbHlVcHBlclRvKHRoaXMucjIsdGhpcy5tLnQrMSx0aGlzLnEzKTtcbiAgICAgIHRoaXMubS5tdWx0aXBseUxvd2VyVG8odGhpcy5xMyx0aGlzLm0udCsxLHRoaXMucjIpO1xuICAgICAgd2hpbGUoeC5jb21wYXJlVG8odGhpcy5yMikgPCAwKSB4LmRBZGRPZmZzZXQoMSx0aGlzLm0udCsxKTtcbiAgICAgIHguc3ViVG8odGhpcy5yMix4KTtcbiAgICAgIHdoaWxlKHguY29tcGFyZVRvKHRoaXMubSkgPj0gMCkgeC5zdWJUbyh0aGlzLm0seCk7XG4gICAgfVxuXG4gICAgLy8gciA9IHheMiBtb2QgbTsgeCAhPSByXG4gICAgZnVuY3Rpb24gYmFycmV0dFNxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG4gICAgLy8gciA9IHgqeSBtb2QgbTsgeCx5ICE9IHJcbiAgICBmdW5jdGlvbiBiYXJyZXR0TXVsVG8oeCx5LHIpIHsgeC5tdWx0aXBseVRvKHkscik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbiAgICBCYXJyZXR0LnByb3RvdHlwZS5jb252ZXJ0ID0gYmFycmV0dENvbnZlcnQ7XG4gICAgQmFycmV0dC5wcm90b3R5cGUucmV2ZXJ0ID0gYmFycmV0dFJldmVydDtcbiAgICBCYXJyZXR0LnByb3RvdHlwZS5yZWR1Y2UgPSBiYXJyZXR0UmVkdWNlO1xuICAgIEJhcnJldHQucHJvdG90eXBlLm11bFRvID0gYmFycmV0dE11bFRvO1xuICAgIEJhcnJldHQucHJvdG90eXBlLnNxclRvID0gYmFycmV0dFNxclRvO1xuXG4gICAgLy8gKHB1YmxpYykgdGhpc15lICUgbSAoSEFDIDE0Ljg1KVxuICAgIGZ1bmN0aW9uIGJuTW9kUG93KGUsbSkge1xuICAgICAgdmFyIGkgPSBlLmJpdExlbmd0aCgpLCBrLCByID0gbmJ2KDEpLCB6O1xuICAgICAgaWYoaSA8PSAwKSByZXR1cm4gcjtcbiAgICAgIGVsc2UgaWYoaSA8IDE4KSBrID0gMTtcbiAgICAgIGVsc2UgaWYoaSA8IDQ4KSBrID0gMztcbiAgICAgIGVsc2UgaWYoaSA8IDE0NCkgayA9IDQ7XG4gICAgICBlbHNlIGlmKGkgPCA3NjgpIGsgPSA1O1xuICAgICAgZWxzZSBrID0gNjtcbiAgICAgIGlmKGkgPCA4KVxuICAgICAgICB6ID0gbmV3IENsYXNzaWMobSk7XG4gICAgICBlbHNlIGlmKG0uaXNFdmVuKCkpXG4gICAgICAgIHogPSBuZXcgQmFycmV0dChtKTtcbiAgICAgIGVsc2VcbiAgICAgICAgeiA9IG5ldyBNb250Z29tZXJ5KG0pO1xuXG4gICAgICAvLyBwcmVjb21wdXRhdGlvblxuICAgICAgdmFyIGcgPSBuZXcgQXJyYXkoKSwgbiA9IDMsIGsxID0gay0xLCBrbSA9ICgxPDxrKS0xO1xuICAgICAgZ1sxXSA9IHouY29udmVydCh0aGlzKTtcbiAgICAgIGlmKGsgPiAxKSB7XG4gICAgICAgIHZhciBnMiA9IG5iaSgpO1xuICAgICAgICB6LnNxclRvKGdbMV0sZzIpO1xuICAgICAgICB3aGlsZShuIDw9IGttKSB7XG4gICAgICAgICAgZ1tuXSA9IG5iaSgpO1xuICAgICAgICAgIHoubXVsVG8oZzIsZ1tuLTJdLGdbbl0pO1xuICAgICAgICAgIG4gKz0gMjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaiA9IGUudC0xLCB3LCBpczEgPSB0cnVlLCByMiA9IG5iaSgpLCB0O1xuICAgICAgaSA9IG5iaXRzKGVbal0pLTE7XG4gICAgICB3aGlsZShqID49IDApIHtcbiAgICAgICAgaWYoaSA+PSBrMSkgdyA9IChlW2pdPj4oaS1rMSkpJmttO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB3ID0gKGVbal0mKCgxPDwoaSsxKSktMSkpPDwoazEtaSk7XG4gICAgICAgICAgaWYoaiA+IDApIHcgfD0gZVtqLTFdPj4odGhpcy5EQitpLWsxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG4gPSBrO1xuICAgICAgICB3aGlsZSgodyYxKSA9PSAwKSB7IHcgPj49IDE7IC0tbjsgfVxuICAgICAgICBpZigoaSAtPSBuKSA8IDApIHsgaSArPSB0aGlzLkRCOyAtLWo7IH1cbiAgICAgICAgaWYoaXMxKSB7ICAgIC8vIHJldCA9PSAxLCBkb24ndCBib3RoZXIgc3F1YXJpbmcgb3IgbXVsdGlwbHlpbmcgaXRcbiAgICAgICAgICBnW3ddLmNvcHlUbyhyKTtcbiAgICAgICAgICBpczEgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB3aGlsZShuID4gMSkgeyB6LnNxclRvKHIscjIpOyB6LnNxclRvKHIyLHIpOyBuIC09IDI7IH1cbiAgICAgICAgICBpZihuID4gMCkgei5zcXJUbyhyLHIyKTsgZWxzZSB7IHQgPSByOyByID0gcjI7IHIyID0gdDsgfVxuICAgICAgICAgIHoubXVsVG8ocjIsZ1t3XSxyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlKGogPj0gMCAmJiAoZVtqXSYoMTw8aSkpID09IDApIHtcbiAgICAgICAgICB6LnNxclRvKHIscjIpOyB0ID0gcjsgciA9IHIyOyByMiA9IHQ7XG4gICAgICAgICAgaWYoLS1pIDwgMCkgeyBpID0gdGhpcy5EQi0xOyAtLWo7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHoucmV2ZXJ0KHIpO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIGdjZCh0aGlzLGEpIChIQUMgMTQuNTQpXG4gICAgZnVuY3Rpb24gYm5HQ0QoYSkge1xuICAgICAgdmFyIHggPSAodGhpcy5zPDApP3RoaXMubmVnYXRlKCk6dGhpcy5jbG9uZSgpO1xuICAgICAgdmFyIHkgPSAoYS5zPDApP2EubmVnYXRlKCk6YS5jbG9uZSgpO1xuICAgICAgaWYoeC5jb21wYXJlVG8oeSkgPCAwKSB7IHZhciB0ID0geDsgeCA9IHk7IHkgPSB0OyB9XG4gICAgICB2YXIgaSA9IHguZ2V0TG93ZXN0U2V0Qml0KCksIGcgPSB5LmdldExvd2VzdFNldEJpdCgpO1xuICAgICAgaWYoZyA8IDApIHJldHVybiB4O1xuICAgICAgaWYoaSA8IGcpIGcgPSBpO1xuICAgICAgaWYoZyA+IDApIHtcbiAgICAgICAgeC5yU2hpZnRUbyhnLHgpO1xuICAgICAgICB5LnJTaGlmdFRvKGcseSk7XG4gICAgICB9XG4gICAgICB3aGlsZSh4LnNpZ251bSgpID4gMCkge1xuICAgICAgICBpZigoaSA9IHguZ2V0TG93ZXN0U2V0Qml0KCkpID4gMCkgeC5yU2hpZnRUbyhpLHgpO1xuICAgICAgICBpZigoaSA9IHkuZ2V0TG93ZXN0U2V0Qml0KCkpID4gMCkgeS5yU2hpZnRUbyhpLHkpO1xuICAgICAgICBpZih4LmNvbXBhcmVUbyh5KSA+PSAwKSB7XG4gICAgICAgICAgeC5zdWJUbyh5LHgpO1xuICAgICAgICAgIHguclNoaWZ0VG8oMSx4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB5LnN1YlRvKHgseSk7XG4gICAgICAgICAgeS5yU2hpZnRUbygxLHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZihnID4gMCkgeS5sU2hpZnRUbyhnLHkpO1xuICAgICAgcmV0dXJuIHk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgdGhpcyAlIG4sIG4gPCAyXjI2XG4gICAgZnVuY3Rpb24gYm5wTW9kSW50KG4pIHtcbiAgICAgIGlmKG4gPD0gMCkgcmV0dXJuIDA7XG4gICAgICB2YXIgZCA9IHRoaXMuRFYlbiwgciA9ICh0aGlzLnM8MCk/bi0xOjA7XG4gICAgICBpZih0aGlzLnQgPiAwKVxuICAgICAgICBpZihkID09IDApIHIgPSB0aGlzWzBdJW47XG4gICAgICAgIGVsc2UgZm9yKHZhciBpID0gdGhpcy50LTE7IGkgPj0gMDsgLS1pKSByID0gKGQqcit0aGlzW2ldKSVuO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgMS90aGlzICUgbSAoSEFDIDE0LjYxKVxuICAgIGZ1bmN0aW9uIGJuTW9kSW52ZXJzZShtKSB7XG4gICAgICB2YXIgYWMgPSBtLmlzRXZlbigpO1xuICAgICAgaWYoKHRoaXMuaXNFdmVuKCkgJiYgYWMpIHx8IG0uc2lnbnVtKCkgPT0gMCkgcmV0dXJuIEJpZ0ludGVnZXIuWkVSTztcbiAgICAgIHZhciB1ID0gbS5jbG9uZSgpLCB2ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgdmFyIGEgPSBuYnYoMSksIGIgPSBuYnYoMCksIGMgPSBuYnYoMCksIGQgPSBuYnYoMSk7XG4gICAgICB3aGlsZSh1LnNpZ251bSgpICE9IDApIHtcbiAgICAgICAgd2hpbGUodS5pc0V2ZW4oKSkge1xuICAgICAgICAgIHUuclNoaWZ0VG8oMSx1KTtcbiAgICAgICAgICBpZihhYykge1xuICAgICAgICAgICAgaWYoIWEuaXNFdmVuKCkgfHwgIWIuaXNFdmVuKCkpIHsgYS5hZGRUbyh0aGlzLGEpOyBiLnN1YlRvKG0sYik7IH1cbiAgICAgICAgICAgIGEuclNoaWZ0VG8oMSxhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZighYi5pc0V2ZW4oKSkgYi5zdWJUbyhtLGIpO1xuICAgICAgICAgIGIuclNoaWZ0VG8oMSxiKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSh2LmlzRXZlbigpKSB7XG4gICAgICAgICAgdi5yU2hpZnRUbygxLHYpO1xuICAgICAgICAgIGlmKGFjKSB7XG4gICAgICAgICAgICBpZighYy5pc0V2ZW4oKSB8fCAhZC5pc0V2ZW4oKSkgeyBjLmFkZFRvKHRoaXMsYyk7IGQuc3ViVG8obSxkKTsgfVxuICAgICAgICAgICAgYy5yU2hpZnRUbygxLGMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmKCFkLmlzRXZlbigpKSBkLnN1YlRvKG0sZCk7XG4gICAgICAgICAgZC5yU2hpZnRUbygxLGQpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHUuY29tcGFyZVRvKHYpID49IDApIHtcbiAgICAgICAgICB1LnN1YlRvKHYsdSk7XG4gICAgICAgICAgaWYoYWMpIGEuc3ViVG8oYyxhKTtcbiAgICAgICAgICBiLnN1YlRvKGQsYik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdi5zdWJUbyh1LHYpO1xuICAgICAgICAgIGlmKGFjKSBjLnN1YlRvKGEsYyk7XG4gICAgICAgICAgZC5zdWJUbyhiLGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZih2LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgIT0gMCkgcmV0dXJuIEJpZ0ludGVnZXIuWkVSTztcbiAgICAgIGlmKGQuY29tcGFyZVRvKG0pID49IDApIHJldHVybiBkLnN1YnRyYWN0KG0pO1xuICAgICAgaWYoZC5zaWdudW0oKSA8IDApIGQuYWRkVG8obSxkKTsgZWxzZSByZXR1cm4gZDtcbiAgICAgIGlmKGQuc2lnbnVtKCkgPCAwKSByZXR1cm4gZC5hZGQobSk7IGVsc2UgcmV0dXJuIGQ7XG4gICAgfVxuXG4gICAgdmFyIGxvd3ByaW1lcyA9IFsyLDMsNSw3LDExLDEzLDE3LDE5LDIzLDI5LDMxLDM3LDQxLDQzLDQ3LDUzLDU5LDYxLDY3LDcxLDczLDc5LDgzLDg5LDk3LDEwMSwxMDMsMTA3LDEwOSwxMTMsMTI3LDEzMSwxMzcsMTM5LDE0OSwxNTEsMTU3LDE2MywxNjcsMTczLDE3OSwxODEsMTkxLDE5MywxOTcsMTk5LDIxMSwyMjMsMjI3LDIyOSwyMzMsMjM5LDI0MSwyNTEsMjU3LDI2MywyNjksMjcxLDI3NywyODEsMjgzLDI5MywzMDcsMzExLDMxMywzMTcsMzMxLDMzNywzNDcsMzQ5LDM1MywzNTksMzY3LDM3MywzNzksMzgzLDM4OSwzOTcsNDAxLDQwOSw0MTksNDIxLDQzMSw0MzMsNDM5LDQ0Myw0NDksNDU3LDQ2MSw0NjMsNDY3LDQ3OSw0ODcsNDkxLDQ5OSw1MDMsNTA5LDUyMSw1MjMsNTQxLDU0Nyw1NTcsNTYzLDU2OSw1NzEsNTc3LDU4Nyw1OTMsNTk5LDYwMSw2MDcsNjEzLDYxNyw2MTksNjMxLDY0MSw2NDMsNjQ3LDY1Myw2NTksNjYxLDY3Myw2NzcsNjgzLDY5MSw3MDEsNzA5LDcxOSw3MjcsNzMzLDczOSw3NDMsNzUxLDc1Nyw3NjEsNzY5LDc3Myw3ODcsNzk3LDgwOSw4MTEsODIxLDgyMyw4MjcsODI5LDgzOSw4NTMsODU3LDg1OSw4NjMsODc3LDg4MSw4ODMsODg3LDkwNyw5MTEsOTE5LDkyOSw5MzcsOTQxLDk0Nyw5NTMsOTY3LDk3MSw5NzcsOTgzLDk5MSw5OTddO1xuICAgIHZhciBscGxpbSA9ICgxPDwyNikvbG93cHJpbWVzW2xvd3ByaW1lcy5sZW5ndGgtMV07XG5cbiAgICAvLyAocHVibGljKSB0ZXN0IHByaW1hbGl0eSB3aXRoIGNlcnRhaW50eSA+PSAxLS41XnRcbiAgICBmdW5jdGlvbiBibklzUHJvYmFibGVQcmltZSh0KSB7XG4gICAgICB2YXIgaSwgeCA9IHRoaXMuYWJzKCk7XG4gICAgICBpZih4LnQgPT0gMSAmJiB4WzBdIDw9IGxvd3ByaW1lc1tsb3dwcmltZXMubGVuZ3RoLTFdKSB7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGxvd3ByaW1lcy5sZW5ndGg7ICsraSlcbiAgICAgICAgICBpZih4WzBdID09IGxvd3ByaW1lc1tpXSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmKHguaXNFdmVuKCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGkgPSAxO1xuICAgICAgd2hpbGUoaSA8IGxvd3ByaW1lcy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG0gPSBsb3dwcmltZXNbaV0sIGogPSBpKzE7XG4gICAgICAgIHdoaWxlKGogPCBsb3dwcmltZXMubGVuZ3RoICYmIG0gPCBscGxpbSkgbSAqPSBsb3dwcmltZXNbaisrXTtcbiAgICAgICAgbSA9IHgubW9kSW50KG0pO1xuICAgICAgICB3aGlsZShpIDwgaikgaWYobSVsb3dwcmltZXNbaSsrXSA9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4geC5taWxsZXJSYWJpbih0KTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0cnVlIGlmIHByb2JhYmx5IHByaW1lIChIQUMgNC4yNCwgTWlsbGVyLVJhYmluKVxuICAgIGZ1bmN0aW9uIGJucE1pbGxlclJhYmluKHQpIHtcbiAgICAgIHZhciBuMSA9IHRoaXMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO1xuICAgICAgdmFyIGsgPSBuMS5nZXRMb3dlc3RTZXRCaXQoKTtcbiAgICAgIGlmKGsgPD0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIHIgPSBuMS5zaGlmdFJpZ2h0KGspO1xuICAgICAgdCA9ICh0KzEpPj4xO1xuICAgICAgaWYodCA+IGxvd3ByaW1lcy5sZW5ndGgpIHQgPSBsb3dwcmltZXMubGVuZ3RoO1xuICAgICAgdmFyIGEgPSBuYmkoKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0OyArK2kpIHtcbiAgICAgICAgLy9QaWNrIGJhc2VzIGF0IHJhbmRvbSwgaW5zdGVhZCBvZiBzdGFydGluZyBhdCAyXG4gICAgICAgIGEuZnJvbUludChsb3dwcmltZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmxvd3ByaW1lcy5sZW5ndGgpXSk7XG4gICAgICAgIHZhciB5ID0gYS5tb2RQb3cocix0aGlzKTtcbiAgICAgICAgaWYoeS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpICE9IDAgJiYgeS5jb21wYXJlVG8objEpICE9IDApIHtcbiAgICAgICAgICB2YXIgaiA9IDE7XG4gICAgICAgICAgd2hpbGUoaisrIDwgayAmJiB5LmNvbXBhcmVUbyhuMSkgIT0gMCkge1xuICAgICAgICAgICAgeSA9IHkubW9kUG93SW50KDIsdGhpcyk7XG4gICAgICAgICAgICBpZih5LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih5LmNvbXBhcmVUbyhuMSkgIT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBwcm90ZWN0ZWRcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jaHVua1NpemUgPSBibnBDaHVua1NpemU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUudG9SYWRpeCA9IGJucFRvUmFkaXg7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVJhZGl4ID0gYm5wRnJvbVJhZGl4O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21OdW1iZXIgPSBibnBGcm9tTnVtYmVyO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJpdHdpc2VUbyA9IGJucEJpdHdpc2VUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jaGFuZ2VCaXQgPSBibnBDaGFuZ2VCaXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYWRkVG8gPSBibnBBZGRUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kTXVsdGlwbHkgPSBibnBETXVsdGlwbHk7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZEFkZE9mZnNldCA9IGJucERBZGRPZmZzZXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlMb3dlclRvID0gYm5wTXVsdGlwbHlMb3dlclRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5VXBwZXJUbyA9IGJucE11bHRpcGx5VXBwZXJUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnQgPSBibnBNb2RJbnQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubWlsbGVyUmFiaW4gPSBibnBNaWxsZXJSYWJpbjtcblxuICAgIC8vIHB1YmxpY1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNsb25lID0gYm5DbG9uZTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pbnRWYWx1ZSA9IGJuSW50VmFsdWU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYnl0ZVZhbHVlID0gYm5CeXRlVmFsdWU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc2hvcnRWYWx1ZSA9IGJuU2hvcnRWYWx1ZTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaWdudW0gPSBiblNpZ051bTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS50b0J5dGVBcnJheSA9IGJuVG9CeXRlQXJyYXk7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZXF1YWxzID0gYm5FcXVhbHM7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubWluID0gYm5NaW47XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubWF4ID0gYm5NYXg7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYW5kID0gYm5BbmQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUub3IgPSBibk9yO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnhvciA9IGJuWG9yO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFuZE5vdCA9IGJuQW5kTm90O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm5vdCA9IGJuTm90O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0TGVmdCA9IGJuU2hpZnRMZWZ0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0UmlnaHQgPSBiblNoaWZ0UmlnaHQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZ2V0TG93ZXN0U2V0Qml0ID0gYm5HZXRMb3dlc3RTZXRCaXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYml0Q291bnQgPSBibkJpdENvdW50O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnRlc3RCaXQgPSBiblRlc3RCaXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc2V0Qml0ID0gYm5TZXRCaXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2xlYXJCaXQgPSBibkNsZWFyQml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmZsaXBCaXQgPSBibkZsaXBCaXQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYWRkID0gYm5BZGQ7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc3VidHJhY3QgPSBiblN1YnRyYWN0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5ID0gYm5NdWx0aXBseTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGUgPSBibkRpdmlkZTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5yZW1haW5kZXIgPSBiblJlbWFpbmRlcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5kaXZpZGVBbmRSZW1haW5kZXIgPSBibkRpdmlkZUFuZFJlbWFpbmRlcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RQb3cgPSBibk1vZFBvdztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnZlcnNlID0gYm5Nb2RJbnZlcnNlO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnBvdyA9IGJuUG93O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmdjZCA9IGJuR0NEO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmlzUHJvYmFibGVQcmltZSA9IGJuSXNQcm9iYWJsZVByaW1lO1xuXG4gICAgLy8gSlNCTi1zcGVjaWZpYyBleHRlbnNpb25cbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmUgPSBiblNxdWFyZTtcblxuICAgIC8vIEV4cG9zZSB0aGUgQmFycmV0dCBmdW5jdGlvblxuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkJhcnJldHQgPSBCYXJyZXR0XG5cbiAgICAvLyBCaWdJbnRlZ2VyIGludGVyZmFjZXMgbm90IGltcGxlbWVudGVkIGluIGpzYm46XG5cbiAgICAvLyBCaWdJbnRlZ2VyKGludCBzaWdudW0sIGJ5dGVbXSBtYWduaXR1ZGUpXG4gICAgLy8gZG91YmxlIGRvdWJsZVZhbHVlKClcbiAgICAvLyBmbG9hdCBmbG9hdFZhbHVlKClcbiAgICAvLyBpbnQgaGFzaENvZGUoKVxuICAgIC8vIGxvbmcgbG9uZ1ZhbHVlKClcbiAgICAvLyBzdGF0aWMgQmlnSW50ZWdlciB2YWx1ZU9mKGxvbmcgdmFsKVxuXG4gICAgLy8gUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgLSByZXF1aXJlcyBhIFBSTkcgYmFja2VuZCwgZS5nLiBwcm5nNC5qc1xuXG4gICAgLy8gRm9yIGJlc3QgcmVzdWx0cywgcHV0IGNvZGUgbGlrZVxuICAgIC8vIDxib2R5IG9uQ2xpY2s9J3JuZ19zZWVkX3RpbWUoKTsnIG9uS2V5UHJlc3M9J3JuZ19zZWVkX3RpbWUoKTsnPlxuICAgIC8vIGluIHlvdXIgbWFpbiBIVE1MIGRvY3VtZW50LlxuXG4gICAgdmFyIHJuZ19zdGF0ZTtcbiAgICB2YXIgcm5nX3Bvb2w7XG4gICAgdmFyIHJuZ19wcHRyO1xuXG4gICAgLy8gTWl4IGluIGEgMzItYml0IGludGVnZXIgaW50byB0aGUgcG9vbFxuICAgIGZ1bmN0aW9uIHJuZ19zZWVkX2ludCh4KSB7XG4gICAgICBybmdfcG9vbFtybmdfcHB0cisrXSBePSB4ICYgMjU1O1xuICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gXj0gKHggPj4gOCkgJiAyNTU7XG4gICAgICBybmdfcG9vbFtybmdfcHB0cisrXSBePSAoeCA+PiAxNikgJiAyNTU7XG4gICAgICBybmdfcG9vbFtybmdfcHB0cisrXSBePSAoeCA+PiAyNCkgJiAyNTU7XG4gICAgICBpZihybmdfcHB0ciA+PSBybmdfcHNpemUpIHJuZ19wcHRyIC09IHJuZ19wc2l6ZTtcbiAgICB9XG5cbiAgICAvLyBNaXggaW4gdGhlIGN1cnJlbnQgdGltZSAody9taWxsaXNlY29uZHMpIGludG8gdGhlIHBvb2xcbiAgICBmdW5jdGlvbiBybmdfc2VlZF90aW1lKCkge1xuICAgICAgcm5nX3NlZWRfaW50KG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBwb29sIHdpdGgganVuayBpZiBuZWVkZWQuXG4gICAgaWYocm5nX3Bvb2wgPT0gbnVsbCkge1xuICAgICAgcm5nX3Bvb2wgPSBuZXcgQXJyYXkoKTtcbiAgICAgIHJuZ19wcHRyID0gMDtcbiAgICAgIHZhciB0O1xuICAgICAgaWYodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuY3J5cHRvKSB7XG4gICAgICAgIGlmICh3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcykge1xuICAgICAgICAgIC8vIFVzZSB3ZWJjcnlwdG8gaWYgYXZhaWxhYmxlXG4gICAgICAgICAgdmFyIHVhID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICAgICAgICAgIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHVhKTtcbiAgICAgICAgICBmb3IodCA9IDA7IHQgPCAzMjsgKyt0KVxuICAgICAgICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gPSB1YVt0XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKG5hdmlnYXRvci5hcHBOYW1lID09IFwiTmV0c2NhcGVcIiAmJiBuYXZpZ2F0b3IuYXBwVmVyc2lvbiA8IFwiNVwiKSB7XG4gICAgICAgICAgLy8gRXh0cmFjdCBlbnRyb3B5ICgyNTYgYml0cykgZnJvbSBOUzQgUk5HIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHZhciB6ID0gd2luZG93LmNyeXB0by5yYW5kb20oMzIpO1xuICAgICAgICAgIGZvcih0ID0gMDsgdCA8IHoubGVuZ3RoOyArK3QpXG4gICAgICAgICAgICBybmdfcG9vbFtybmdfcHB0cisrXSA9IHouY2hhckNvZGVBdCh0KSAmIDI1NTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUocm5nX3BwdHIgPCBybmdfcHNpemUpIHsgIC8vIGV4dHJhY3Qgc29tZSByYW5kb21uZXNzIGZyb20gTWF0aC5yYW5kb20oKVxuICAgICAgICB0ID0gTWF0aC5mbG9vcig2NTUzNiAqIE1hdGgucmFuZG9tKCkpO1xuICAgICAgICBybmdfcG9vbFtybmdfcHB0cisrXSA9IHQgPj4+IDg7XG4gICAgICAgIHJuZ19wb29sW3JuZ19wcHRyKytdID0gdCAmIDI1NTtcbiAgICAgIH1cbiAgICAgIHJuZ19wcHRyID0gMDtcbiAgICAgIHJuZ19zZWVkX3RpbWUoKTtcbiAgICAgIC8vcm5nX3NlZWRfaW50KHdpbmRvdy5zY3JlZW5YKTtcbiAgICAgIC8vcm5nX3NlZWRfaW50KHdpbmRvdy5zY3JlZW5ZKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBybmdfZ2V0X2J5dGUoKSB7XG4gICAgICBpZihybmdfc3RhdGUgPT0gbnVsbCkge1xuICAgICAgICBybmdfc2VlZF90aW1lKCk7XG4gICAgICAgIHJuZ19zdGF0ZSA9IHBybmdfbmV3c3RhdGUoKTtcbiAgICAgICAgcm5nX3N0YXRlLmluaXQocm5nX3Bvb2wpO1xuICAgICAgICBmb3Iocm5nX3BwdHIgPSAwOyBybmdfcHB0ciA8IHJuZ19wb29sLmxlbmd0aDsgKytybmdfcHB0cilcbiAgICAgICAgICBybmdfcG9vbFtybmdfcHB0cl0gPSAwO1xuICAgICAgICBybmdfcHB0ciA9IDA7XG4gICAgICAgIC8vcm5nX3Bvb2wgPSBudWxsO1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogYWxsb3cgcmVzZWVkaW5nIGFmdGVyIGZpcnN0IHJlcXVlc3RcbiAgICAgIHJldHVybiBybmdfc3RhdGUubmV4dCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJuZ19nZXRfYnl0ZXMoYmEpIHtcbiAgICAgIHZhciBpO1xuICAgICAgZm9yKGkgPSAwOyBpIDwgYmEubGVuZ3RoOyArK2kpIGJhW2ldID0gcm5nX2dldF9ieXRlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gU2VjdXJlUmFuZG9tKCkge31cblxuICAgIFNlY3VyZVJhbmRvbS5wcm90b3R5cGUubmV4dEJ5dGVzID0gcm5nX2dldF9ieXRlcztcblxuICAgIC8vIHBybmc0LmpzIC0gdXNlcyBBcmNmb3VyIGFzIGEgUFJOR1xuXG4gICAgZnVuY3Rpb24gQXJjZm91cigpIHtcbiAgICAgIHRoaXMuaSA9IDA7XG4gICAgICB0aGlzLmogPSAwO1xuICAgICAgdGhpcy5TID0gbmV3IEFycmF5KCk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhcmNmb3VyIGNvbnRleHQgZnJvbSBrZXksIGFuIGFycmF5IG9mIGludHMsIGVhY2ggZnJvbSBbMC4uMjU1XVxuICAgIGZ1bmN0aW9uIEFSQzRpbml0KGtleSkge1xuICAgICAgdmFyIGksIGosIHQ7XG4gICAgICBmb3IoaSA9IDA7IGkgPCAyNTY7ICsraSlcbiAgICAgICAgdGhpcy5TW2ldID0gaTtcbiAgICAgIGogPSAwO1xuICAgICAgZm9yKGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgaiA9IChqICsgdGhpcy5TW2ldICsga2V5W2kgJSBrZXkubGVuZ3RoXSkgJiAyNTU7XG4gICAgICAgIHQgPSB0aGlzLlNbaV07XG4gICAgICAgIHRoaXMuU1tpXSA9IHRoaXMuU1tqXTtcbiAgICAgICAgdGhpcy5TW2pdID0gdDtcbiAgICAgIH1cbiAgICAgIHRoaXMuaSA9IDA7XG4gICAgICB0aGlzLmogPSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIEFSQzRuZXh0KCkge1xuICAgICAgdmFyIHQ7XG4gICAgICB0aGlzLmkgPSAodGhpcy5pICsgMSkgJiAyNTU7XG4gICAgICB0aGlzLmogPSAodGhpcy5qICsgdGhpcy5TW3RoaXMuaV0pICYgMjU1O1xuICAgICAgdCA9IHRoaXMuU1t0aGlzLmldO1xuICAgICAgdGhpcy5TW3RoaXMuaV0gPSB0aGlzLlNbdGhpcy5qXTtcbiAgICAgIHRoaXMuU1t0aGlzLmpdID0gdDtcbiAgICAgIHJldHVybiB0aGlzLlNbKHQgKyB0aGlzLlNbdGhpcy5pXSkgJiAyNTVdO1xuICAgIH1cblxuICAgIEFyY2ZvdXIucHJvdG90eXBlLmluaXQgPSBBUkM0aW5pdDtcbiAgICBBcmNmb3VyLnByb3RvdHlwZS5uZXh0ID0gQVJDNG5leHQ7XG5cbiAgICAvLyBQbHVnIGluIHlvdXIgUk5HIGNvbnN0cnVjdG9yIGhlcmVcbiAgICBmdW5jdGlvbiBwcm5nX25ld3N0YXRlKCkge1xuICAgICAgcmV0dXJuIG5ldyBBcmNmb3VyKCk7XG4gICAgfVxuXG4gICAgLy8gUG9vbCBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IGFuZCBncmVhdGVyIHRoYW4gMzIuXG4gICAgLy8gQW4gYXJyYXkgb2YgYnl0ZXMgdGhlIHNpemUgb2YgdGhlIHBvb2wgd2lsbCBiZSBwYXNzZWQgdG8gaW5pdCgpXG4gICAgdmFyIHJuZ19wc2l6ZSA9IDI1NjtcblxuICAgIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0ge1xuICAgICAgICAgICAgZGVmYXVsdDogQmlnSW50ZWdlcixcbiAgICAgICAgICAgIEJpZ0ludGVnZXI6IEJpZ0ludGVnZXIsXG4gICAgICAgICAgICBTZWN1cmVSYW5kb206IFNlY3VyZVJhbmRvbSxcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmpzYm4gPSB7XG4gICAgICAgICAgQmlnSW50ZWdlcjogQmlnSW50ZWdlcixcbiAgICAgICAgICBTZWN1cmVSYW5kb206IFNlY3VyZVJhbmRvbVxuICAgICAgICB9O1xuICAgIH1cblxufSkuY2FsbCh0aGlzKTtcbiIsImxldCBfZnNcbnRyeSB7XG4gIF9mcyA9IHJlcXVpcmUoJ2dyYWNlZnVsLWZzJylcbn0gY2F0Y2ggKF8pIHtcbiAgX2ZzID0gcmVxdWlyZSgnZnMnKVxufVxuY29uc3QgdW5pdmVyc2FsaWZ5ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JylcbmNvbnN0IHsgc3RyaW5naWZ5LCBzdHJpcEJvbSB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5cbmFzeW5jIGZ1bmN0aW9uIF9yZWFkRmlsZSAoZmlsZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zID0geyBlbmNvZGluZzogb3B0aW9ucyB9XG4gIH1cblxuICBjb25zdCBmcyA9IG9wdGlvbnMuZnMgfHwgX2ZzXG5cbiAgY29uc3Qgc2hvdWxkVGhyb3cgPSAndGhyb3dzJyBpbiBvcHRpb25zID8gb3B0aW9ucy50aHJvd3MgOiB0cnVlXG5cbiAgbGV0IGRhdGEgPSBhd2FpdCB1bml2ZXJzYWxpZnkuZnJvbUNhbGxiYWNrKGZzLnJlYWRGaWxlKShmaWxlLCBvcHRpb25zKVxuXG4gIGRhdGEgPSBzdHJpcEJvbShkYXRhKVxuXG4gIGxldCBvYmpcbiAgdHJ5IHtcbiAgICBvYmogPSBKU09OLnBhcnNlKGRhdGEsIG9wdGlvbnMgPyBvcHRpb25zLnJldml2ZXIgOiBudWxsKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoc2hvdWxkVGhyb3cpIHtcbiAgICAgIGVyci5tZXNzYWdlID0gYCR7ZmlsZX06ICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgdGhyb3cgZXJyXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG5jb25zdCByZWFkRmlsZSA9IHVuaXZlcnNhbGlmeS5mcm9tUHJvbWlzZShfcmVhZEZpbGUpXG5cbmZ1bmN0aW9uIHJlYWRGaWxlU3luYyAoZmlsZSwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zID0geyBlbmNvZGluZzogb3B0aW9ucyB9XG4gIH1cblxuICBjb25zdCBmcyA9IG9wdGlvbnMuZnMgfHwgX2ZzXG5cbiAgY29uc3Qgc2hvdWxkVGhyb3cgPSAndGhyb3dzJyBpbiBvcHRpb25zID8gb3B0aW9ucy50aHJvd3MgOiB0cnVlXG5cbiAgdHJ5IHtcbiAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCBvcHRpb25zKVxuICAgIGNvbnRlbnQgPSBzdHJpcEJvbShjb250ZW50KVxuICAgIHJldHVybiBKU09OLnBhcnNlKGNvbnRlbnQsIG9wdGlvbnMucmV2aXZlcilcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGAke2ZpbGV9OiAke2Vyci5tZXNzYWdlfWBcbiAgICAgIHRocm93IGVyclxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBfd3JpdGVGaWxlIChmaWxlLCBvYmosIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBmcyA9IG9wdGlvbnMuZnMgfHwgX2ZzXG5cbiAgY29uc3Qgc3RyID0gc3RyaW5naWZ5KG9iaiwgb3B0aW9ucylcblxuICBhd2FpdCB1bml2ZXJzYWxpZnkuZnJvbUNhbGxiYWNrKGZzLndyaXRlRmlsZSkoZmlsZSwgc3RyLCBvcHRpb25zKVxufVxuXG5jb25zdCB3cml0ZUZpbGUgPSB1bml2ZXJzYWxpZnkuZnJvbVByb21pc2UoX3dyaXRlRmlsZSlcblxuZnVuY3Rpb24gd3JpdGVGaWxlU3luYyAoZmlsZSwgb2JqLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgZnMgPSBvcHRpb25zLmZzIHx8IF9mc1xuXG4gIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShvYmosIG9wdGlvbnMpXG4gIC8vIG5vdCBzdXJlIGlmIGZzLndyaXRlRmlsZVN5bmMgcmV0dXJucyBhbnl0aGluZywgYnV0IGp1c3QgaW4gY2FzZVxuICByZXR1cm4gZnMud3JpdGVGaWxlU3luYyhmaWxlLCBzdHIsIG9wdGlvbnMpXG59XG5cbmNvbnN0IGpzb25maWxlID0ge1xuICByZWFkRmlsZSxcbiAgcmVhZEZpbGVTeW5jLFxuICB3cml0ZUZpbGUsXG4gIHdyaXRlRmlsZVN5bmNcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBqc29uZmlsZVxuIiwiZnVuY3Rpb24gc3RyaW5naWZ5IChvYmosIHsgRU9MID0gJ1xcbicsIGZpbmFsRU9MID0gdHJ1ZSwgcmVwbGFjZXIgPSBudWxsLCBzcGFjZXMgfSA9IHt9KSB7XG4gIGNvbnN0IEVPRiA9IGZpbmFsRU9MID8gRU9MIDogJydcbiAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkob2JqLCByZXBsYWNlciwgc3BhY2VzKVxuXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxuL2csIEVPTCkgKyBFT0Zcbn1cblxuZnVuY3Rpb24gc3RyaXBCb20gKGNvbnRlbnQpIHtcbiAgLy8gd2UgZG8gdGhpcyBiZWNhdXNlIEpTT04ucGFyc2Ugd291bGQgY29udmVydCBpdCB0byBhIHV0Zjggc3RyaW5nIGlmIGVuY29kaW5nIHdhc24ndCBzcGVjaWZpZWRcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250ZW50KSkgY29udGVudCA9IGNvbnRlbnQudG9TdHJpbmcoJ3V0ZjgnKVxuICByZXR1cm4gY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgc3RyaW5naWZ5LCBzdHJpcEJvbSB9XG4iLCIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICd3ZWVrcyc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndyc6XG4gICAgICByZXR1cm4gbiAqIHc7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gIH1cbiAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS4xMi43XG4oZnVuY3Rpb24oKSB7XG4gIHZhciBOZXRtYXNrLCBhdG9iLCBjaHIsIGNocjAsIGNockEsIGNocmEsIGlwMmxvbmcsIGxvbmcyaXA7XG5cbiAgbG9uZzJpcCA9IGZ1bmN0aW9uKGxvbmcpIHtcbiAgICB2YXIgYSwgYiwgYywgZDtcbiAgICBhID0gKGxvbmcgJiAoMHhmZiA8PCAyNCkpID4+PiAyNDtcbiAgICBiID0gKGxvbmcgJiAoMHhmZiA8PCAxNikpID4+PiAxNjtcbiAgICBjID0gKGxvbmcgJiAoMHhmZiA8PCA4KSkgPj4+IDg7XG4gICAgZCA9IGxvbmcgJiAweGZmO1xuICAgIHJldHVybiBbYSwgYiwgYywgZF0uam9pbignLicpO1xuICB9O1xuXG4gIGlwMmxvbmcgPSBmdW5jdGlvbihpcCkge1xuICAgIHZhciBiLCBjLCBpLCBqLCBuLCByZWY7XG4gICAgYiA9IFtdO1xuICAgIGZvciAoaSA9IGogPSAwOyBqIDw9IDM7IGkgPSArK2opIHtcbiAgICAgIGlmIChpcC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgaWYgKGlwWzBdICE9PSAnLicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVAnKTtcbiAgICAgICAgfVxuICAgICAgICBpcCA9IGlwLnN1YnN0cmluZygxKTtcbiAgICAgIH1cbiAgICAgIHJlZiA9IGF0b2IoaXApLCBuID0gcmVmWzBdLCBjID0gcmVmWzFdO1xuICAgICAgaXAgPSBpcC5zdWJzdHJpbmcoYyk7XG4gICAgICBiLnB1c2gobik7XG4gICAgfVxuICAgIGlmIChpcC5sZW5ndGggIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBJUCcpO1xuICAgIH1cbiAgICBzd2l0Y2ggKGIubGVuZ3RoKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGlmIChiWzBdID4gMHhGRkZGRkZGRikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBJUCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiWzBdID4+PiAwO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBpZiAoYlswXSA+IDB4RkYgfHwgYlsxXSA+IDB4RkZGRkZGKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElQJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChiWzBdIDw8IDI0IHwgYlsxXSkgPj4+IDA7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGlmIChiWzBdID4gMHhGRiB8fCBiWzFdID4gMHhGRiB8fCBiWzJdID4gMHhGRkZGKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElQJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChiWzBdIDw8IDI0IHwgYlsxXSA8PCAxNiB8IGJbMl0pID4+PiAwO1xuICAgICAgY2FzZSA0OlxuICAgICAgICBpZiAoYlswXSA+IDB4RkYgfHwgYlsxXSA+IDB4RkYgfHwgYlsyXSA+IDB4RkYgfHwgYlszXSA+IDB4RkYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGJbMF0gPDwgMjQgfCBiWzFdIDw8IDE2IHwgYlsyXSA8PCA4IHwgYlszXSkgPj4+IDA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVAnKTtcbiAgICB9XG4gIH07XG5cbiAgY2hyID0gZnVuY3Rpb24oYikge1xuICAgIHJldHVybiBiLmNoYXJDb2RlQXQoMCk7XG4gIH07XG5cbiAgY2hyMCA9IGNocignMCcpO1xuXG4gIGNocmEgPSBjaHIoJ2EnKTtcblxuICBjaHJBID0gY2hyKCdBJyk7XG5cbiAgYXRvYiA9IGZ1bmN0aW9uKHMpIHtcbiAgICB2YXIgYmFzZSwgZG1heCwgaSwgbiwgc3RhcnQ7XG4gICAgbiA9IDA7XG4gICAgYmFzZSA9IDEwO1xuICAgIGRtYXggPSAnOSc7XG4gICAgaSA9IDA7XG4gICAgaWYgKHMubGVuZ3RoID4gMSAmJiBzW2ldID09PSAnMCcpIHtcbiAgICAgIGlmIChzW2kgKyAxXSA9PT0gJ3gnIHx8IHNbaSArIDFdID09PSAnWCcpIHtcbiAgICAgICAgaSArPSAyO1xuICAgICAgICBiYXNlID0gMTY7XG4gICAgICB9IGVsc2UgaWYgKCcwJyA8PSBzW2kgKyAxXSAmJiBzW2kgKyAxXSA8PSAnOScpIHtcbiAgICAgICAgaSsrO1xuICAgICAgICBiYXNlID0gODtcbiAgICAgICAgZG1heCA9ICc3JztcbiAgICAgIH1cbiAgICB9XG4gICAgc3RhcnQgPSBpO1xuICAgIHdoaWxlIChpIDwgcy5sZW5ndGgpIHtcbiAgICAgIGlmICgnMCcgPD0gc1tpXSAmJiBzW2ldIDw9IGRtYXgpIHtcbiAgICAgICAgbiA9IChuICogYmFzZSArIChjaHIoc1tpXSkgLSBjaHIwKSkgPj4+IDA7XG4gICAgICB9IGVsc2UgaWYgKGJhc2UgPT09IDE2KSB7XG4gICAgICAgIGlmICgnYScgPD0gc1tpXSAmJiBzW2ldIDw9ICdmJykge1xuICAgICAgICAgIG4gPSAobiAqIGJhc2UgKyAoMTAgKyBjaHIoc1tpXSkgLSBjaHJhKSkgPj4+IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoJ0EnIDw9IHNbaV0gJiYgc1tpXSA8PSAnRicpIHtcbiAgICAgICAgICBuID0gKG4gKiBiYXNlICsgKDEwICsgY2hyKHNbaV0pIC0gY2hyQSkpID4+PiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChuID4gMHhGRkZGRkZGRikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RvbyBsYXJnZScpO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgICBpZiAoaSA9PT0gc3RhcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgb2N0ZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIFtuLCBpXTtcbiAgfTtcblxuICBOZXRtYXNrID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIE5ldG1hc2sobmV0LCBtYXNrKSB7XG4gICAgICB2YXIgZXJyb3IsIGksIGosIHJlZjtcbiAgICAgIGlmICh0eXBlb2YgbmV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGBuZXQnIHBhcmFtZXRlclwiKTtcbiAgICAgIH1cbiAgICAgIGlmICghbWFzaykge1xuICAgICAgICByZWYgPSBuZXQuc3BsaXQoJy8nLCAyKSwgbmV0ID0gcmVmWzBdLCBtYXNrID0gcmVmWzFdO1xuICAgICAgfVxuICAgICAgaWYgKCFtYXNrKSB7XG4gICAgICAgIG1hc2sgPSAzMjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbWFzayA9PT0gJ3N0cmluZycgJiYgbWFzay5pbmRleE9mKCcuJykgPiAtMSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMubWFza0xvbmcgPSBpcDJsb25nKG1hc2spO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG1hc2s6IFwiICsgbWFzayk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gaiA9IDMyOyBqID49IDA7IGkgPSAtLWopIHtcbiAgICAgICAgICBpZiAodGhpcy5tYXNrTG9uZyA9PT0gKDB4ZmZmZmZmZmYgPDwgKDMyIC0gaSkpID4+PiAwKSB7XG4gICAgICAgICAgICB0aGlzLmJpdG1hc2sgPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1hc2sgfHwgbWFzayA9PT0gMCkge1xuICAgICAgICB0aGlzLmJpdG1hc2sgPSBwYXJzZUludChtYXNrLCAxMCk7XG4gICAgICAgIHRoaXMubWFza0xvbmcgPSAwO1xuICAgICAgICBpZiAodGhpcy5iaXRtYXNrID4gMCkge1xuICAgICAgICAgIHRoaXMubWFza0xvbmcgPSAoMHhmZmZmZmZmZiA8PCAoMzIgLSB0aGlzLmJpdG1hc2spKSA+Pj4gMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBtYXNrOiBlbXB0eVwiKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMubmV0TG9uZyA9IChpcDJsb25nKG5ldCkgJiB0aGlzLm1hc2tMb25nKSA+Pj4gMDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBuZXQgYWRkcmVzczogXCIgKyBuZXQpO1xuICAgICAgfVxuICAgICAgaWYgKCEodGhpcy5iaXRtYXNrIDw9IDMyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG1hc2sgZm9yIGlwNDogXCIgKyBtYXNrKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2l6ZSA9IE1hdGgucG93KDIsIDMyIC0gdGhpcy5iaXRtYXNrKTtcbiAgICAgIHRoaXMuYmFzZSA9IGxvbmcyaXAodGhpcy5uZXRMb25nKTtcbiAgICAgIHRoaXMubWFzayA9IGxvbmcyaXAodGhpcy5tYXNrTG9uZyk7XG4gICAgICB0aGlzLmhvc3RtYXNrID0gbG9uZzJpcCh+dGhpcy5tYXNrTG9uZyk7XG4gICAgICB0aGlzLmZpcnN0ID0gdGhpcy5iaXRtYXNrIDw9IDMwID8gbG9uZzJpcCh0aGlzLm5ldExvbmcgKyAxKSA6IHRoaXMuYmFzZTtcbiAgICAgIHRoaXMubGFzdCA9IHRoaXMuYml0bWFzayA8PSAzMCA/IGxvbmcyaXAodGhpcy5uZXRMb25nICsgdGhpcy5zaXplIC0gMikgOiBsb25nMmlwKHRoaXMubmV0TG9uZyArIHRoaXMuc2l6ZSAtIDEpO1xuICAgICAgdGhpcy5icm9hZGNhc3QgPSB0aGlzLmJpdG1hc2sgPD0gMzAgPyBsb25nMmlwKHRoaXMubmV0TG9uZyArIHRoaXMuc2l6ZSAtIDEpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIE5ldG1hc2sucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24oaXApIHtcbiAgICAgIGlmICh0eXBlb2YgaXAgPT09ICdzdHJpbmcnICYmIChpcC5pbmRleE9mKCcvJykgPiAwIHx8IGlwLnNwbGl0KCcuJykubGVuZ3RoICE9PSA0KSkge1xuICAgICAgICBpcCA9IG5ldyBOZXRtYXNrKGlwKTtcbiAgICAgIH1cbiAgICAgIGlmIChpcCBpbnN0YW5jZW9mIE5ldG1hc2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbnMoaXAuYmFzZSkgJiYgdGhpcy5jb250YWlucyhpcC5icm9hZGNhc3QgfHwgaXAubGFzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKGlwMmxvbmcoaXApICYgdGhpcy5tYXNrTG9uZykgPj4+IDAgPT09ICh0aGlzLm5ldExvbmcgJiB0aGlzLm1hc2tMb25nKSA+Pj4gMDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgTmV0bWFzay5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgICBpZiAoY291bnQgPT0gbnVsbCkge1xuICAgICAgICBjb3VudCA9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IE5ldG1hc2sobG9uZzJpcCh0aGlzLm5ldExvbmcgKyAodGhpcy5zaXplICogY291bnQpKSwgdGhpcy5tYXNrKTtcbiAgICB9O1xuXG4gICAgTmV0bWFzay5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICB2YXIgaW5kZXgsIGxhc3RMb25nLCBsb25nO1xuICAgICAgbG9uZyA9IGlwMmxvbmcodGhpcy5maXJzdCk7XG4gICAgICBsYXN0TG9uZyA9IGlwMmxvbmcodGhpcy5sYXN0KTtcbiAgICAgIGluZGV4ID0gMDtcbiAgICAgIHdoaWxlIChsb25nIDw9IGxhc3RMb25nKSB7XG4gICAgICAgIGZuKGxvbmcyaXAobG9uZyksIGxvbmcsIGluZGV4KTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgbG9uZysrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBOZXRtYXNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuYmFzZSArIFwiL1wiICsgdGhpcy5iaXRtYXNrO1xuICAgIH07XG5cbiAgICByZXR1cm4gTmV0bWFzaztcblxuICB9KSgpO1xuXG4gIGV4cG9ydHMuaXAybG9uZyA9IGlwMmxvbmc7XG5cbiAgZXhwb3J0cy5sb25nMmlwID0gbG9uZzJpcDtcblxuICBleHBvcnRzLk5ldG1hc2sgPSBOZXRtYXNrO1xuXG59KS5jYWxsKHRoaXMpO1xuIiwiY29uc3QgcnVudGltZVJlcXVpcmUgPSB0eXBlb2YgX193ZWJwYWNrX3JlcXVpcmVfXyA9PT0gJ2Z1bmN0aW9uJyA/IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fIDogcmVxdWlyZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5pZiAodHlwZW9mIHJ1bnRpbWVSZXF1aXJlLmFkZG9uID09PSAnZnVuY3Rpb24nKSB7IC8vIGlmIHRoZSBwbGF0Zm9ybSBzdXBwb3J0cyBuYXRpdmUgcmVzb2x2aW5nIHByZWZlciB0aGF0XG4gIG1vZHVsZS5leHBvcnRzID0gcnVudGltZVJlcXVpcmUuYWRkb24uYmluZChydW50aW1lUmVxdWlyZSlcbn0gZWxzZSB7IC8vIGVsc2UgdXNlIHRoZSBydW50aW1lIHZlcnNpb24gaGVyZVxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbm9kZS1neXAtYnVpbGQuanMnKVxufVxuIiwidmFyIGZzID0gcmVxdWlyZSgnZnMnKVxudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJylcbnZhciBvcyA9IHJlcXVpcmUoJ29zJylcblxuLy8gV29ya2Fyb3VuZCB0byBmaXggd2VicGFjaydzIGJ1aWxkIHdhcm5pbmdzOiAndGhlIHJlcXVlc3Qgb2YgYSBkZXBlbmRlbmN5IGlzIGFuIGV4cHJlc3Npb24nXG52YXIgcnVudGltZVJlcXVpcmUgPSB0eXBlb2YgX193ZWJwYWNrX3JlcXVpcmVfXyA9PT0gJ2Z1bmN0aW9uJyA/IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fIDogcmVxdWlyZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbnZhciB2YXJzID0gKHByb2Nlc3MuY29uZmlnICYmIHByb2Nlc3MuY29uZmlnLnZhcmlhYmxlcykgfHwge31cbnZhciBwcmVidWlsZHNPbmx5ID0gISFwcm9jZXNzLmVudi5QUkVCVUlMRFNfT05MWVxudmFyIGFiaSA9IHByb2Nlc3MudmVyc2lvbnMubW9kdWxlcyAvLyBUT0RPOiBzdXBwb3J0IG9sZCBub2RlIHdoZXJlIHRoaXMgaXMgdW5kZWZcbnZhciBydW50aW1lID0gaXNFbGVjdHJvbigpID8gJ2VsZWN0cm9uJyA6IChpc053anMoKSA/ICdub2RlLXdlYmtpdCcgOiAnbm9kZScpXG5cbnZhciBhcmNoID0gcHJvY2Vzcy5lbnYubnBtX2NvbmZpZ19hcmNoIHx8IG9zLmFyY2goKVxudmFyIHBsYXRmb3JtID0gcHJvY2Vzcy5lbnYubnBtX2NvbmZpZ19wbGF0Zm9ybSB8fCBvcy5wbGF0Zm9ybSgpXG52YXIgbGliYyA9IHByb2Nlc3MuZW52LkxJQkMgfHwgKGlzQWxwaW5lKHBsYXRmb3JtKSA/ICdtdXNsJyA6ICdnbGliYycpXG52YXIgYXJtdiA9IHByb2Nlc3MuZW52LkFSTV9WRVJTSU9OIHx8IChhcmNoID09PSAnYXJtNjQnID8gJzgnIDogdmFycy5hcm1fdmVyc2lvbikgfHwgJydcbnZhciB1diA9IChwcm9jZXNzLnZlcnNpb25zLnV2IHx8ICcnKS5zcGxpdCgnLicpWzBdXG5cbm1vZHVsZS5leHBvcnRzID0gbG9hZFxuXG5mdW5jdGlvbiBsb2FkIChkaXIpIHtcbiAgcmV0dXJuIHJ1bnRpbWVSZXF1aXJlKGxvYWQucmVzb2x2ZShkaXIpKVxufVxuXG5sb2FkLnJlc29sdmUgPSBsb2FkLnBhdGggPSBmdW5jdGlvbiAoZGlyKSB7XG4gIGRpciA9IHBhdGgucmVzb2x2ZShkaXIgfHwgJy4nKVxuXG4gIHRyeSB7XG4gICAgdmFyIG5hbWUgPSBydW50aW1lUmVxdWlyZShwYXRoLmpvaW4oZGlyLCAncGFja2FnZS5qc29uJykpLm5hbWUudG9VcHBlckNhc2UoKS5yZXBsYWNlKC8tL2csICdfJylcbiAgICBpZiAocHJvY2Vzcy5lbnZbbmFtZSArICdfUFJFQlVJTEQnXSkgZGlyID0gcHJvY2Vzcy5lbnZbbmFtZSArICdfUFJFQlVJTEQnXVxuICB9IGNhdGNoIChlcnIpIHt9XG5cbiAgaWYgKCFwcmVidWlsZHNPbmx5KSB7XG4gICAgdmFyIHJlbGVhc2UgPSBnZXRGaXJzdChwYXRoLmpvaW4oZGlyLCAnYnVpbGQvUmVsZWFzZScpLCBtYXRjaEJ1aWxkKVxuICAgIGlmIChyZWxlYXNlKSByZXR1cm4gcmVsZWFzZVxuXG4gICAgdmFyIGRlYnVnID0gZ2V0Rmlyc3QocGF0aC5qb2luKGRpciwgJ2J1aWxkL0RlYnVnJyksIG1hdGNoQnVpbGQpXG4gICAgaWYgKGRlYnVnKSByZXR1cm4gZGVidWdcbiAgfVxuXG4gIHZhciBwcmVidWlsZCA9IHJlc29sdmUoZGlyKVxuICBpZiAocHJlYnVpbGQpIHJldHVybiBwcmVidWlsZFxuXG4gIHZhciBuZWFyYnkgPSByZXNvbHZlKHBhdGguZGlybmFtZShwcm9jZXNzLmV4ZWNQYXRoKSlcbiAgaWYgKG5lYXJieSkgcmV0dXJuIG5lYXJieVxuXG4gIHZhciB0YXJnZXQgPSBbXG4gICAgJ3BsYXRmb3JtPScgKyBwbGF0Zm9ybSxcbiAgICAnYXJjaD0nICsgYXJjaCxcbiAgICAncnVudGltZT0nICsgcnVudGltZSxcbiAgICAnYWJpPScgKyBhYmksXG4gICAgJ3V2PScgKyB1dixcbiAgICBhcm12ID8gJ2FybXY9JyArIGFybXYgOiAnJyxcbiAgICAnbGliYz0nICsgbGliYyxcbiAgICAnbm9kZT0nICsgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLFxuICAgIHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24gPyAnZWxlY3Ryb249JyArIHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24gOiAnJyxcbiAgICB0eXBlb2YgX193ZWJwYWNrX3JlcXVpcmVfXyA9PT0gJ2Z1bmN0aW9uJyA/ICd3ZWJwYWNrPXRydWUnIDogJycgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJylcblxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIG5hdGl2ZSBidWlsZCB3YXMgZm91bmQgZm9yICcgKyB0YXJnZXQgKyAnXFxuICAgIGxvYWRlZCBmcm9tOiAnICsgZGlyICsgJ1xcbicpXG5cbiAgZnVuY3Rpb24gcmVzb2x2ZSAoZGlyKSB7XG4gICAgLy8gRmluZCBtYXRjaGluZyBcInByZWJ1aWxkcy88cGxhdGZvcm0+LTxhcmNoPlwiIGRpcmVjdG9yeVxuICAgIHZhciB0dXBsZXMgPSByZWFkZGlyU3luYyhwYXRoLmpvaW4oZGlyLCAncHJlYnVpbGRzJykpLm1hcChwYXJzZVR1cGxlKVxuICAgIHZhciB0dXBsZSA9IHR1cGxlcy5maWx0ZXIobWF0Y2hUdXBsZShwbGF0Zm9ybSwgYXJjaCkpLnNvcnQoY29tcGFyZVR1cGxlcylbMF1cbiAgICBpZiAoIXR1cGxlKSByZXR1cm5cblxuICAgIC8vIEZpbmQgbW9zdCBzcGVjaWZpYyBmbGF2b3IgZmlyc3RcbiAgICB2YXIgcHJlYnVpbGRzID0gcGF0aC5qb2luKGRpciwgJ3ByZWJ1aWxkcycsIHR1cGxlLm5hbWUpXG4gICAgdmFyIHBhcnNlZCA9IHJlYWRkaXJTeW5jKHByZWJ1aWxkcykubWFwKHBhcnNlVGFncylcbiAgICB2YXIgY2FuZGlkYXRlcyA9IHBhcnNlZC5maWx0ZXIobWF0Y2hUYWdzKHJ1bnRpbWUsIGFiaSkpXG4gICAgdmFyIHdpbm5lciA9IGNhbmRpZGF0ZXMuc29ydChjb21wYXJlVGFncyhydW50aW1lKSlbMF1cbiAgICBpZiAod2lubmVyKSByZXR1cm4gcGF0aC5qb2luKHByZWJ1aWxkcywgd2lubmVyLmZpbGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZGRpclN5bmMgKGRpcikge1xuICB0cnkge1xuICAgIHJldHVybiBmcy5yZWFkZGlyU3luYyhkaXIpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBbXVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEZpcnN0IChkaXIsIGZpbHRlcikge1xuICB2YXIgZmlsZXMgPSByZWFkZGlyU3luYyhkaXIpLmZpbHRlcihmaWx0ZXIpXG4gIHJldHVybiBmaWxlc1swXSAmJiBwYXRoLmpvaW4oZGlyLCBmaWxlc1swXSlcbn1cblxuZnVuY3Rpb24gbWF0Y2hCdWlsZCAobmFtZSkge1xuICByZXR1cm4gL1xcLm5vZGUkLy50ZXN0KG5hbWUpXG59XG5cbmZ1bmN0aW9uIHBhcnNlVHVwbGUgKG5hbWUpIHtcbiAgLy8gRXhhbXBsZTogZGFyd2luLXg2NCthcm02NFxuICB2YXIgYXJyID0gbmFtZS5zcGxpdCgnLScpXG4gIGlmIChhcnIubGVuZ3RoICE9PSAyKSByZXR1cm5cblxuICB2YXIgcGxhdGZvcm0gPSBhcnJbMF1cbiAgdmFyIGFyY2hpdGVjdHVyZXMgPSBhcnJbMV0uc3BsaXQoJysnKVxuXG4gIGlmICghcGxhdGZvcm0pIHJldHVyblxuICBpZiAoIWFyY2hpdGVjdHVyZXMubGVuZ3RoKSByZXR1cm5cbiAgaWYgKCFhcmNoaXRlY3R1cmVzLmV2ZXJ5KEJvb2xlYW4pKSByZXR1cm5cblxuICByZXR1cm4geyBuYW1lLCBwbGF0Zm9ybSwgYXJjaGl0ZWN0dXJlcyB9XG59XG5cbmZ1bmN0aW9uIG1hdGNoVHVwbGUgKHBsYXRmb3JtLCBhcmNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodHVwbGUpIHtcbiAgICBpZiAodHVwbGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHR1cGxlLnBsYXRmb3JtICE9PSBwbGF0Zm9ybSkgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIHR1cGxlLmFyY2hpdGVjdHVyZXMuaW5jbHVkZXMoYXJjaClcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlVHVwbGVzIChhLCBiKSB7XG4gIC8vIFByZWZlciBzaW5nbGUtYXJjaCBwcmVidWlsZHMgb3ZlciBtdWx0aS1hcmNoXG4gIHJldHVybiBhLmFyY2hpdGVjdHVyZXMubGVuZ3RoIC0gYi5hcmNoaXRlY3R1cmVzLmxlbmd0aFxufVxuXG5mdW5jdGlvbiBwYXJzZVRhZ3MgKGZpbGUpIHtcbiAgdmFyIGFyciA9IGZpbGUuc3BsaXQoJy4nKVxuICB2YXIgZXh0ZW5zaW9uID0gYXJyLnBvcCgpXG4gIHZhciB0YWdzID0geyBmaWxlOiBmaWxlLCBzcGVjaWZpY2l0eTogMCB9XG5cbiAgaWYgKGV4dGVuc2lvbiAhPT0gJ25vZGUnKSByZXR1cm5cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0YWcgPSBhcnJbaV1cblxuICAgIGlmICh0YWcgPT09ICdub2RlJyB8fCB0YWcgPT09ICdlbGVjdHJvbicgfHwgdGFnID09PSAnbm9kZS13ZWJraXQnKSB7XG4gICAgICB0YWdzLnJ1bnRpbWUgPSB0YWdcbiAgICB9IGVsc2UgaWYgKHRhZyA9PT0gJ25hcGknKSB7XG4gICAgICB0YWdzLm5hcGkgPSB0cnVlXG4gICAgfSBlbHNlIGlmICh0YWcuc2xpY2UoMCwgMykgPT09ICdhYmknKSB7XG4gICAgICB0YWdzLmFiaSA9IHRhZy5zbGljZSgzKVxuICAgIH0gZWxzZSBpZiAodGFnLnNsaWNlKDAsIDIpID09PSAndXYnKSB7XG4gICAgICB0YWdzLnV2ID0gdGFnLnNsaWNlKDIpXG4gICAgfSBlbHNlIGlmICh0YWcuc2xpY2UoMCwgNCkgPT09ICdhcm12Jykge1xuICAgICAgdGFncy5hcm12ID0gdGFnLnNsaWNlKDQpXG4gICAgfSBlbHNlIGlmICh0YWcgPT09ICdnbGliYycgfHwgdGFnID09PSAnbXVzbCcpIHtcbiAgICAgIHRhZ3MubGliYyA9IHRhZ1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHRhZ3Muc3BlY2lmaWNpdHkrK1xuICB9XG5cbiAgcmV0dXJuIHRhZ3Ncbn1cblxuZnVuY3Rpb24gbWF0Y2hUYWdzIChydW50aW1lLCBhYmkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YWdzKSB7XG4gICAgaWYgKHRhZ3MgPT0gbnVsbCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHRhZ3MucnVudGltZSAmJiB0YWdzLnJ1bnRpbWUgIT09IHJ1bnRpbWUgJiYgIXJ1bnRpbWVBZ25vc3RpYyh0YWdzKSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHRhZ3MuYWJpICYmIHRhZ3MuYWJpICE9PSBhYmkgJiYgIXRhZ3MubmFwaSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHRhZ3MudXYgJiYgdGFncy51diAhPT0gdXYpIHJldHVybiBmYWxzZVxuICAgIGlmICh0YWdzLmFybXYgJiYgdGFncy5hcm12ICE9PSBhcm12KSByZXR1cm4gZmFsc2VcbiAgICBpZiAodGFncy5saWJjICYmIHRhZ3MubGliYyAhPT0gbGliYykgcmV0dXJuIGZhbHNlXG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIHJ1bnRpbWVBZ25vc3RpYyAodGFncykge1xuICByZXR1cm4gdGFncy5ydW50aW1lID09PSAnbm9kZScgJiYgdGFncy5uYXBpXG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVUYWdzIChydW50aW1lKSB7XG4gIC8vIFByZWNlZGVuY2U6IG5vbi1hZ25vc3RpYyBydW50aW1lLCBhYmkgb3ZlciBuYXBpLCB0aGVuIGJ5IHNwZWNpZmljaXR5LlxuICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICBpZiAoYS5ydW50aW1lICE9PSBiLnJ1bnRpbWUpIHtcbiAgICAgIHJldHVybiBhLnJ1bnRpbWUgPT09IHJ1bnRpbWUgPyAtMSA6IDFcbiAgICB9IGVsc2UgaWYgKGEuYWJpICE9PSBiLmFiaSkge1xuICAgICAgcmV0dXJuIGEuYWJpID8gLTEgOiAxXG4gICAgfSBlbHNlIGlmIChhLnNwZWNpZmljaXR5ICE9PSBiLnNwZWNpZmljaXR5KSB7XG4gICAgICByZXR1cm4gYS5zcGVjaWZpY2l0eSA+IGIuc3BlY2lmaWNpdHkgPyAtMSA6IDFcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOd2pzICgpIHtcbiAgcmV0dXJuICEhKHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5udylcbn1cblxuZnVuY3Rpb24gaXNFbGVjdHJvbiAoKSB7XG4gIGlmIChwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24pIHJldHVybiB0cnVlXG4gIGlmIChwcm9jZXNzLmVudi5FTEVDVFJPTl9SVU5fQVNfTk9ERSkgcmV0dXJuIHRydWVcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmIHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcidcbn1cblxuZnVuY3Rpb24gaXNBbHBpbmUgKHBsYXRmb3JtKSB7XG4gIHJldHVybiBwbGF0Zm9ybSA9PT0gJ2xpbnV4JyAmJiBmcy5leGlzdHNTeW5jKCcvZXRjL2FscGluZS1yZWxlYXNlJylcbn1cblxuLy8gRXhwb3NlZCBmb3IgdW5pdCB0ZXN0c1xuLy8gVE9ETzogbW92ZSB0byBsaWJcbmxvYWQucGFyc2VUYWdzID0gcGFyc2VUYWdzXG5sb2FkLm1hdGNoVGFncyA9IG1hdGNoVGFnc1xubG9hZC5jb21wYXJlVGFncyA9IGNvbXBhcmVUYWdzXG5sb2FkLnBhcnNlVHVwbGUgPSBwYXJzZVR1cGxlXG5sb2FkLm1hdGNoVHVwbGUgPSBtYXRjaFR1cGxlXG5sb2FkLmNvbXBhcmVUdXBsZXMgPSBjb21wYXJlVHVwbGVzXG4iLCJ2YXIgd3JhcHB5ID0gcmVxdWlyZSgnd3JhcHB5Jylcbm1vZHVsZS5leHBvcnRzID0gd3JhcHB5KG9uY2UpXG5tb2R1bGUuZXhwb3J0cy5zdHJpY3QgPSB3cmFwcHkob25jZVN0cmljdClcblxub25jZS5wcm90byA9IG9uY2UoZnVuY3Rpb24gKCkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCAnb25jZScsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG9uY2UodGhpcylcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsICdvbmNlU3RyaWN0Jywge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25jZVN0cmljdCh0aGlzKVxuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG59KVxuXG5mdW5jdGlvbiBvbmNlIChmbikge1xuICB2YXIgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZi5jYWxsZWQpIHJldHVybiBmLnZhbHVlXG4gICAgZi5jYWxsZWQgPSB0cnVlXG4gICAgcmV0dXJuIGYudmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH1cbiAgZi5jYWxsZWQgPSBmYWxzZVxuICByZXR1cm4gZlxufVxuXG5mdW5jdGlvbiBvbmNlU3RyaWN0IChmbikge1xuICB2YXIgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZi5jYWxsZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZi5vbmNlRXJyb3IpXG4gICAgZi5jYWxsZWQgPSB0cnVlXG4gICAgcmV0dXJuIGYudmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH1cbiAgdmFyIG5hbWUgPSBmbi5uYW1lIHx8ICdGdW5jdGlvbiB3cmFwcGVkIHdpdGggYG9uY2VgJ1xuICBmLm9uY2VFcnJvciA9IG5hbWUgKyBcIiBzaG91bGRuJ3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlXCJcbiAgZi5jYWxsZWQgPSBmYWxzZVxuICByZXR1cm4gZlxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUGFjUHJveHlBZ2VudCA9IHZvaWQgMDtcbmNvbnN0IG5ldCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwibmV0XCIpKTtcbmNvbnN0IHRscyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidGxzXCIpKTtcbmNvbnN0IGNyeXB0byA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiY3J5cHRvXCIpKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcImV2ZW50c1wiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IHVybF8xID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IGFnZW50X2Jhc2VfMSA9IHJlcXVpcmUoXCJhZ2VudC1iYXNlXCIpO1xuY29uc3QgaHR0cF9wcm94eV9hZ2VudF8xID0gcmVxdWlyZShcImh0dHAtcHJveHktYWdlbnRcIik7XG5jb25zdCBodHRwc19wcm94eV9hZ2VudF8xID0gcmVxdWlyZShcImh0dHBzLXByb3h5LWFnZW50XCIpO1xuY29uc3Qgc29ja3NfcHJveHlfYWdlbnRfMSA9IHJlcXVpcmUoXCJzb2Nrcy1wcm94eS1hZ2VudFwiKTtcbmNvbnN0IGdldF91cmlfMSA9IHJlcXVpcmUoXCJnZXQtdXJpXCIpO1xuY29uc3QgcGFjX3Jlc29sdmVyXzEgPSByZXF1aXJlKFwicGFjLXJlc29sdmVyXCIpO1xuY29uc3QgcXVpY2tqc19lbXNjcmlwdGVuXzEgPSByZXF1aXJlKFwiQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlblwiKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ3BhYy1wcm94eS1hZ2VudCcpO1xuLyoqXG4gKiBUaGUgYFBhY1Byb3h5QWdlbnRgIGNsYXNzLlxuICpcbiAqIEEgZmV3IGRpZmZlcmVudCBcInByb3RvY29sXCIgbW9kZXMgYXJlIHN1cHBvcnRlZCAoc3VwcG9ydGVkIHByb3RvY29scyBhcmVcbiAqIGJhY2tlZCBieSB0aGUgYGdldC11cmlgIG1vZHVsZSk6XG4gKlxuICogICAtIFwicGFjK2RhdGFcIiwgXCJkYXRhXCIgLSByZWZlcnMgdG8gYW4gZW1iZWRkZWQgXCJkYXRhOlwiIFVSSVxuICogICAtIFwicGFjK2ZpbGVcIiwgXCJmaWxlXCIgLSByZWZlcnMgdG8gYSBsb2NhbCBmaWxlXG4gKiAgIC0gXCJwYWMrZnRwXCIsIFwiZnRwXCIgLSByZWZlcnMgdG8gYSBmaWxlIGxvY2F0ZWQgb24gYW4gRlRQIHNlcnZlclxuICogICAtIFwicGFjK2h0dHBcIiwgXCJodHRwXCIgLSByZWZlcnMgdG8gYW4gSFRUUCBlbmRwb2ludFxuICogICAtIFwicGFjK2h0dHBzXCIsIFwiaHR0cHNcIiAtIHJlZmVycyB0byBhbiBIVFRQUyBlbmRwb2ludFxuICovXG5jbGFzcyBQYWNQcm94eUFnZW50IGV4dGVuZHMgYWdlbnRfYmFzZV8xLkFnZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmksIG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXMuY2xlYXJSZXNvbHZlclByb21pc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVyUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gU3RyaXAgdGhlIFwicGFjK1wiIHByZWZpeFxuICAgICAgICBjb25zdCB1cmlTdHIgPSB0eXBlb2YgdXJpID09PSAnc3RyaW5nJyA/IHVyaSA6IHVyaS5ocmVmO1xuICAgICAgICB0aGlzLnVyaSA9IG5ldyB1cmxfMS5VUkwodXJpU3RyLnJlcGxhY2UoL15wYWNcXCsvaSwgJycpKTtcbiAgICAgICAgZGVidWcoJ0NyZWF0aW5nIFBhY1Byb3h5QWdlbnQgd2l0aCBVUkkgJW8nLCB0aGlzLnVyaS5ocmVmKTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb3Qgc3VyZSB3aHkgVFMgaXMgY29tcGxhaW5pbmcgaGVyZeKAplxuICAgICAgICB0aGlzLm9wdHMgPSB7IC4uLm9wdHMgfTtcbiAgICAgICAgdGhpcy5jYWNoZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5yZXNvbHZlckhhc2ggPSAnJztcbiAgICAgICAgdGhpcy5yZXNvbHZlclByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIEZvciBgUGFjUmVzb2x2ZXJgXG4gICAgICAgIGlmICghdGhpcy5vcHRzLmZpbGVuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLm9wdHMuZmlsZW5hbWUgPSB0aGlzLnVyaS5ocmVmO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBQQUMgcHJveHkgZmlsZSBmcm9tIHRoZSBzb3VyY2UgaWYgbmVjZXNzYXJ5LCBhbmQgcmV0dXJuc1xuICAgICAqIGEgZ2VuZXJhdGVkIGBGaW5kUHJveHlGb3JVUkwoKWAgcmVzb2x2ZXIgZnVuY3Rpb24gdG8gdXNlLlxuICAgICAqXG4gICAgICogQGFwaSBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0UmVzb2x2ZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXNvbHZlclByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZXJQcm9taXNlID0gdGhpcy5sb2FkUmVzb2x2ZXIoKTtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZXJQcm9taXNlLnRoZW4odGhpcy5jbGVhclJlc29sdmVyUHJvbWlzZSwgdGhpcy5jbGVhclJlc29sdmVyUHJvbWlzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZXJQcm9taXNlO1xuICAgIH1cbiAgICBhc3luYyBsb2FkUmVzb2x2ZXIoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyAoUmUpbG9hZCB0aGUgY29udGVudHMgb2YgdGhlIFBBQyBmaWxlIFVSSVxuICAgICAgICAgICAgY29uc3QgW3FqcywgY29kZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgKDAsIHF1aWNranNfZW1zY3JpcHRlbl8xLmdldFF1aWNrSlMpKCksXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUGFjRmlsZSgpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBzaGExIGhhc2ggb2YgdGhlIEpTIGNvZGVcbiAgICAgICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpLnVwZGF0ZShjb2RlKS5kaWdlc3QoJ2hleCcpO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzb2x2ZXIgJiYgdGhpcy5yZXNvbHZlckhhc2ggPT09IGhhc2gpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnU2FtZSBzaGExIGhhc2ggZm9yIGNvZGUgLSBjb250ZW50cyBoYXZlIG5vdCBjaGFuZ2VkLCByZXVzaW5nIHByZXZpb3VzIHByb3h5IHJlc29sdmVyJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDYWNoZSB0aGUgcmVzb2x2ZXJcbiAgICAgICAgICAgIGRlYnVnKCdDcmVhdGluZyBuZXcgcHJveHkgcmVzb2x2ZXIgaW5zdGFuY2UnKTtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZXIgPSAoMCwgcGFjX3Jlc29sdmVyXzEuY3JlYXRlUGFjUmVzb2x2ZXIpKHFqcywgY29kZSwgdGhpcy5vcHRzKTtcbiAgICAgICAgICAgIC8vIFN0b3JlIHRoYXQgc2hhMSBoYXNoIGZvciBmdXR1cmUgY29tcGFyaXNvbiBwdXJwb3Nlc1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlckhhc2ggPSBoYXNoO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZXI7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzb2x2ZXIgJiZcbiAgICAgICAgICAgICAgICBlcnIuY29kZSA9PT0gJ0VOT1RNT0RJRklFRCcpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnR290IEVOT1RNT0RJRklFRCByZXNwb25zZSwgcmV1c2luZyBwcmV2aW91cyBwcm94eSByZXNvbHZlcicpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBjb250ZW50cyBvZiB0aGUgUEFDIHByb3h5IGZpbGUuXG4gICAgICpcbiAgICAgKiBAYXBpIHByaXZhdGVcbiAgICAgKi9cbiAgICBhc3luYyBsb2FkUGFjRmlsZSgpIHtcbiAgICAgICAgZGVidWcoJ0xvYWRpbmcgUEFDIGZpbGU6ICVvJywgdGhpcy51cmkpO1xuICAgICAgICBjb25zdCBycyA9IGF3YWl0ICgwLCBnZXRfdXJpXzEuZ2V0VXJpKSh0aGlzLnVyaSwgeyAuLi50aGlzLm9wdHMsIGNhY2hlOiB0aGlzLmNhY2hlIH0pO1xuICAgICAgICBkZWJ1ZygnR290IGBSZWFkYWJsZWAgaW5zdGFuY2UgZm9yIFVSSScpO1xuICAgICAgICB0aGlzLmNhY2hlID0gcnM7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0ICgwLCBhZ2VudF9iYXNlXzEudG9CdWZmZXIpKHJzKTtcbiAgICAgICAgZGVidWcoJ1JlYWQgJW8gYnl0ZSBQQUMgZmlsZSBmcm9tIFVSSScsIGJ1Zi5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSBub2RlLWNvcmUgSFRUUCBjbGllbnQgbGlicmFyeSBpcyBjcmVhdGluZyBhIG5ldyBIVFRQIHJlcXVlc3QuXG4gICAgICovXG4gICAgYXN5bmMgY29ubmVjdChyZXEsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgeyBzZWN1cmVFbmRwb2ludCB9ID0gb3B0cztcbiAgICAgICAgLy8gRmlyc3QsIGdldCBhIGdlbmVyYXRlZCBgRmluZFByb3h5Rm9yVVJMKClgIGZ1bmN0aW9uLFxuICAgICAgICAvLyBlaXRoZXIgY2FjaGVkIG9yIHJldHJpZXZlZCBmcm9tIHRoZSBzb3VyY2VcbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSBhd2FpdCB0aGlzLmdldFJlc29sdmVyKCk7XG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgYHVybGAgcGFyYW1ldGVyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gc2VjdXJlRW5kcG9pbnQgPyA0NDMgOiA4MDtcbiAgICAgICAgbGV0IHBhdGggPSByZXEucGF0aDtcbiAgICAgICAgbGV0IHNlYXJjaCA9IG51bGw7XG4gICAgICAgIGNvbnN0IGZpcnN0UXVlc3Rpb24gPSBwYXRoLmluZGV4T2YoJz8nKTtcbiAgICAgICAgaWYgKGZpcnN0UXVlc3Rpb24gIT09IC0xKSB7XG4gICAgICAgICAgICBzZWFyY2ggPSBwYXRoLnN1YnN0cmluZyhmaXJzdFF1ZXN0aW9uKTtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBmaXJzdFF1ZXN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmxPcHRzID0ge1xuICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICAgIHByb3RvY29sOiBzZWN1cmVFbmRwb2ludCA/ICdodHRwczonIDogJ2h0dHA6JyxcbiAgICAgICAgICAgIHBhdGhuYW1lOiBwYXRoLFxuICAgICAgICAgICAgc2VhcmNoLFxuICAgICAgICAgICAgLy8gbmVlZCB0byB1c2UgYGhvc3RuYW1lYCBpbnN0ZWFkIG9mIGBob3N0YCBvdGhlcndpc2UgYHBvcnRgIGlzIGlnbm9yZWRcbiAgICAgICAgICAgIGhvc3RuYW1lOiBvcHRzLmhvc3QsXG4gICAgICAgICAgICBob3N0OiBudWxsLFxuICAgICAgICAgICAgaHJlZjogbnVsbCxcbiAgICAgICAgICAgIC8vIHNldCBgcG9ydGAgdG8gbnVsbCB3aGVuIGl0IGlzIHRoZSBwcm90b2NvbCBkZWZhdWx0IHBvcnQgKDgwIC8gNDQzKVxuICAgICAgICAgICAgcG9ydDogZGVmYXVsdFBvcnQgPT09IG9wdHMucG9ydCA/IG51bGwgOiBvcHRzLnBvcnQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHVybCA9ICgwLCB1cmxfMS5mb3JtYXQpKHVybE9wdHMpO1xuICAgICAgICBkZWJ1ZygndXJsOiAlbycsIHVybCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCByZXNvbHZlcih1cmwpO1xuICAgICAgICAvLyBEZWZhdWx0IHRvIFwiRElSRUNUXCIgaWYgYSBmYWxzZXkgdmFsdWUgd2FzIHJldHVybmVkIChvciBub3RoaW5nKVxuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gJ0RJUkVDVCc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJveGllcyA9IFN0cmluZyhyZXN1bHQpXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAuc3BsaXQoL1xccyo7XFxzKi9nKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5mYWxsYmFja1RvRGlyZWN0ICYmICFwcm94aWVzLmluY2x1ZGVzKCdESVJFQ1QnKSkge1xuICAgICAgICAgICAgcHJveGllcy5wdXNoKCdESVJFQ1QnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHByb3h5IG9mIHByb3hpZXMpIHtcbiAgICAgICAgICAgIGxldCBhZ2VudCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgc29ja2V0ID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IFt0eXBlLCB0YXJnZXRdID0gcHJveHkuc3BsaXQoL1xccysvKTtcbiAgICAgICAgICAgIGRlYnVnKCdBdHRlbXB0aW5nIHRvIHVzZSBwcm94eTogJW8nLCBwcm94eSk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ0RJUkVDVCcpIHtcbiAgICAgICAgICAgICAgICAvLyBEaXJlY3QgY29ubmVjdGlvbiB0byB0aGUgZGVzdGluYXRpb24gZW5kcG9pbnRcbiAgICAgICAgICAgICAgICBpZiAoc2VjdXJlRW5kcG9pbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmVybmFtZSA9IG9wdHMuc2VydmVybmFtZSB8fCBvcHRzLmhvc3Q7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldCA9IHRscy5jb25uZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJuYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldCA9IG5ldC5jb25uZWN0KG9wdHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdTT0NLUycgfHwgdHlwZSA9PT0gJ1NPQ0tTNScpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgYSBTT0NLU3Y1aCBwcm94eVxuICAgICAgICAgICAgICAgIGFnZW50ID0gbmV3IHNvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50KGBzb2NrczovLyR7dGFyZ2V0fWAsIHRoaXMub3B0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnU09DS1M0Jykge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBhIFNPQ0tTdjRhIHByb3h5XG4gICAgICAgICAgICAgICAgYWdlbnQgPSBuZXcgc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnQoYHNvY2tzNGE6Ly8ke3RhcmdldH1gLCB0aGlzLm9wdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ1BST1hZJyB8fFxuICAgICAgICAgICAgICAgIHR5cGUgPT09ICdIVFRQJyB8fFxuICAgICAgICAgICAgICAgIHR5cGUgPT09ICdIVFRQUycpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgYW4gSFRUUCBvciBIVFRQUyBwcm94eVxuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9kZXYuY2hyb21pdW0ub3JnL2RldmVsb3BlcnMvZGVzaWduLWRvY3VtZW50cy9zZWN1cmUtd2ViLXByb3h5XG4gICAgICAgICAgICAgICAgY29uc3QgcHJveHlVUkwgPSBgJHt0eXBlID09PSAnSFRUUFMnID8gJ2h0dHBzJyA6ICdodHRwJ306Ly8ke3RhcmdldH1gO1xuICAgICAgICAgICAgICAgIGlmIChzZWN1cmVFbmRwb2ludCkge1xuICAgICAgICAgICAgICAgICAgICBhZ2VudCA9IG5ldyBodHRwc19wcm94eV9hZ2VudF8xLkh0dHBzUHJveHlBZ2VudChwcm94eVVSTCwgdGhpcy5vcHRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFnZW50ID0gbmV3IGh0dHBfcHJveHlfYWdlbnRfMS5IdHRwUHJveHlBZ2VudChwcm94eVVSTCwgdGhpcy5vcHRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzb2NrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gXCJESVJFQ1RcIiBjb25uZWN0aW9uLCB3YWl0IGZvciBjb25uZWN0aW9uIGNvbmZpcm1hdGlvblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCAoMCwgZXZlbnRzXzEub25jZSkoc29ja2V0LCAnY29ubmVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXEuZW1pdCgncHJveHknLCB7IHByb3h5LCBzb2NrZXQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb2NrZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhZ2VudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gYXdhaXQgYWdlbnQuY29ubmVjdChyZXEsIG9wdHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShzIGluc3RhbmNlb2YgbmV0LlNvY2tldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSBgbmV0LlNvY2tldGAgdG8gYmUgcmV0dXJuZWQgZnJvbSBhZ2VudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlcS5lbWl0KCdwcm94eScsIHsgcHJveHksIHNvY2tldDogcyB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVybWluZSBwcm94eSB0eXBlIGZvcjogJHtwcm94eX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnR290IGVycm9yIGZvciBwcm94eSAlbzogJW8nLCBwcm94eSwgZXJyKTtcbiAgICAgICAgICAgICAgICByZXEuZW1pdCgncHJveHknLCB7IHByb3h5LCBlcnJvcjogZXJyIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGVzdGFibGlzaCBhIHNvY2tldCBjb25uZWN0aW9uIHRvIHByb3hpZXM6ICR7SlNPTi5zdHJpbmdpZnkocHJveGllcyl9YCk7XG4gICAgfVxufVxuUGFjUHJveHlBZ2VudC5wcm90b2NvbHMgPSBbXG4gICAgJ3BhYytkYXRhJyxcbiAgICAncGFjK2ZpbGUnLFxuICAgICdwYWMrZnRwJyxcbiAgICAncGFjK2h0dHAnLFxuICAgICdwYWMraHR0cHMnLFxuXTtcbmV4cG9ydHMuUGFjUHJveHlBZ2VudCA9IFBhY1Byb3h5QWdlbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogSWYgb25seSBhIHNpbmdsZSB2YWx1ZSBpcyBzcGVjaWZpZWQgKGZyb20gZWFjaCBjYXRlZ29yeTogZGF5LCBtb250aCwgeWVhciksIHRoZVxuICogZnVuY3Rpb24gcmV0dXJucyBhIHRydWUgdmFsdWUgb25seSBvbiBkYXlzIHRoYXQgbWF0Y2ggdGhhdCBzcGVjaWZpY2F0aW9uLiBJZlxuICogYm90aCB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIHJlc3VsdCBpcyB0cnVlIGJldHdlZW4gdGhvc2UgdGltZXMsIGluY2x1ZGluZ1xuICogYm91bmRzLlxuICpcbiAqIEV2ZW4gdGhvdWdoIHRoZSBleGFtcGxlcyBkb24ndCBzaG93LCB0aGUgXCJHTVRcIiBwYXJhbWV0ZXIgY2FuIGJlIHNwZWNpZmllZFxuICogaW4gYW55IG9mIHRoZSA5IGRpZmZlcmVudCBjYWxsIHByb2ZpbGVzLCBhbHdheXMgYXMgdGhlIGxhc3QgcGFyYW1ldGVyLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYCBqc1xuICogZGF0ZVJhbmdlKDEpXG4gKiB0cnVlIG9uIHRoZSBmaXJzdCBkYXkgb2YgZWFjaCBtb250aCwgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogZGF0ZVJhbmdlKDEsIFwiR01UXCIpXG4gKiB0cnVlIG9uIHRoZSBmaXJzdCBkYXkgb2YgZWFjaCBtb250aCwgR01UIHRpbWV6b25lLlxuICpcbiAqIGRhdGVSYW5nZSgxLCAxNSlcbiAqIHRydWUgb24gdGhlIGZpcnN0IGhhbGYgb2YgZWFjaCBtb250aC5cbiAqXG4gKiBkYXRlUmFuZ2UoMjQsIFwiREVDXCIpXG4gKiB0cnVlIG9uIDI0dGggb2YgRGVjZW1iZXIgZWFjaCB5ZWFyLlxuICpcbiAqIGRhdGVSYW5nZSgyNCwgXCJERUNcIiwgMTk5NSlcbiAqIHRydWUgb24gMjR0aCBvZiBEZWNlbWJlciwgMTk5NS5cbiAqXG4gKiBkYXRlUmFuZ2UoXCJKQU5cIiwgXCJNQVJcIilcbiAqIHRydWUgb24gdGhlIGZpcnN0IHF1YXJ0ZXIgb2YgdGhlIHllYXIuXG4gKlxuICogZGF0ZVJhbmdlKDEsIFwiSlVOXCIsIDE1LCBcIkFVR1wiKVxuICogdHJ1ZSBmcm9tIEp1bmUgMXN0IHVudGlsIEF1Z3VzdCAxNXRoLCBlYWNoIHllYXIgKGluY2x1ZGluZyBKdW5lIDFzdCBhbmQgQXVndXN0XG4gKiAxNXRoKS5cbiAqXG4gKiBkYXRlUmFuZ2UoMSwgXCJKVU5cIiwgMTUsIDE5OTUsIFwiQVVHXCIsIDE5OTUpXG4gKiB0cnVlIGZyb20gSnVuZSAxc3QsIDE5OTUsIHVudGlsIEF1Z3VzdCAxNXRoLCBzYW1lIHllYXIuXG4gKlxuICogZGF0ZVJhbmdlKFwiT0NUXCIsIDE5OTUsIFwiTUFSXCIsIDE5OTYpXG4gKiB0cnVlIGZyb20gT2N0b2JlciAxOTk1IHVudGlsIE1hcmNoIDE5OTYgKGluY2x1ZGluZyB0aGUgZW50aXJlIG1vbnRoIG9mIE9jdG9iZXJcbiAqIDE5OTUgYW5kIE1hcmNoIDE5OTYpLlxuICpcbiAqIGRhdGVSYW5nZSgxOTk1KVxuICogdHJ1ZSBkdXJpbmcgdGhlIGVudGlyZSB5ZWFyIDE5OTUuXG4gKlxuICogZGF0ZVJhbmdlKDE5OTUsIDE5OTcpXG4gKiB0cnVlIGZyb20gYmVnaW5uaW5nIG9mIHllYXIgMTk5NSB1bnRpbCB0aGUgZW5kIG9mIHllYXIgMTk5Ny5cbiAqIGBgYFxuICpcbiAqIGRhdGVSYW5nZShkYXkpXG4gKiBkYXRlUmFuZ2UoZGF5MSwgZGF5MilcbiAqIGRhdGVSYW5nZShtb24pXG4gKiBkYXRlUmFuZ2UobW9udGgxLCBtb250aDIpXG4gKiBkYXRlUmFuZ2UoeWVhcilcbiAqIGRhdGVSYW5nZSh5ZWFyMSwgeWVhcjIpXG4gKiBkYXRlUmFuZ2UoZGF5MSwgbW9udGgxLCBkYXkyLCBtb250aDIpXG4gKiBkYXRlUmFuZ2UobW9udGgxLCB5ZWFyMSwgbW9udGgyLCB5ZWFyMilcbiAqIGRhdGVSYW5nZShkYXkxLCBtb250aDEsIHllYXIxLCBkYXkyLCBtb250aDIsIHllYXIyKVxuICogZGF0ZVJhbmdlKGRheTEsIG1vbnRoMSwgeWVhcjEsIGRheTIsIG1vbnRoMiwgeWVhcjIsIGdtdClcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF5IGlzIHRoZSBkYXkgb2YgbW9udGggYmV0d2VlbiAxIGFuZCAzMSAoYXMgYW4gaW50ZWdlcikuXG4gKiBAcGFyYW0ge1N0cmluZ30gbW9udGggaXMgb25lIG9mIHRoZSBtb250aCBzdHJpbmdzOiBKQU4gRkVCIE1BUiBBUFIgTUFZIEpVTiBKVUwgQVVHIFNFUCBPQ1QgTk9WIERFQ1xuICogQHBhcmFtIHtTdHJpbmd9IHllYXIgaXMgdGhlIGZ1bGwgeWVhciBudW1iZXIsIGZvciBleGFtcGxlIDE5OTUgKGJ1dCBub3QgOTUpLiBJbnRlZ2VyLlxuICogQHBhcmFtIHtTdHJpbmd9IGdtdCBpcyBlaXRoZXIgdGhlIHN0cmluZyBcIkdNVFwiLCB3aGljaCBtYWtlcyB0aW1lIGNvbXBhcmlzb24gb2NjdXIgaW4gR01UIHRpbWV6b25lOyBpZiBsZWZ0IHVuc3BlY2lmaWVkLCB0aW1lcyBhcmUgdGFrZW4gdG8gYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZnVuY3Rpb24gZGF0ZVJhbmdlKCkge1xuICAgIC8vIFRPRE86IGltcGxlbWVudCBtZSFcbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkYXRlUmFuZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRlUmFuZ2UuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZmYgdGhlIGRvbWFpbiBvZiBob3N0bmFtZSBtYXRjaGVzLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYCBqc1xuICogZG5zRG9tYWluSXMoXCJ3d3cubmV0c2NhcGUuY29tXCIsIFwiLm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyBpcyB0cnVlLlxuICpcbiAqIGRuc0RvbWFpbklzKFwid3d3XCIsIFwiLm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyBpcyBmYWxzZS5cbiAqXG4gKiBkbnNEb21haW5JcyhcInd3dy5tY29tLmNvbVwiLCBcIi5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgZmFsc2UuXG4gKiBgYGBcbiAqXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhvc3QgaXMgdGhlIGhvc3RuYW1lIGZyb20gdGhlIFVSTC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBkb21haW4gaXMgdGhlIGRvbWFpbiBuYW1lIHRvIHRlc3QgdGhlIGhvc3RuYW1lIGFnYWluc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmZiB0aGUgZG9tYWluIG9mIHRoZSBob3N0bmFtZSBtYXRjaGVzLlxuICovXG5mdW5jdGlvbiBkbnNEb21haW5Jcyhob3N0LCBkb21haW4pIHtcbiAgICBob3N0ID0gU3RyaW5nKGhvc3QpO1xuICAgIGRvbWFpbiA9IFN0cmluZyhkb21haW4pO1xuICAgIHJldHVybiBob3N0LnN1YnN0cihkb21haW4ubGVuZ3RoICogLTEpID09PSBkb21haW47XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkbnNEb21haW5Jcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRuc0RvbWFpbklzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgKGludGVnZXIpIG9mIEROUyBkb21haW4gbGV2ZWxzIChudW1iZXIgb2YgZG90cykgaW4gdGhlXG4gKiBob3N0bmFtZS5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIGRuc0RvbWFpbkxldmVscyhcInd3d1wiKVxuICogICAvLyByZXR1cm5zIDAuXG4gKiBkbnNEb21haW5MZXZlbHMoXCJ3d3cubmV0c2NhcGUuY29tXCIpXG4gKiAgIC8vIHJldHVybnMgMi5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3N0IGlzIHRoZSBob3N0bmFtZSBmcm9tIHRoZSBVUkwuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IG51bWJlciBvZiBkb21haW4gbGV2ZWxzXG4gKi9cbmZ1bmN0aW9uIGRuc0RvbWFpbkxldmVscyhob3N0KSB7XG4gICAgY29uc3QgbWF0Y2ggPSBTdHJpbmcoaG9zdCkubWF0Y2goL1xcLi9nKTtcbiAgICBsZXQgbGV2ZWxzID0gMDtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgbGV2ZWxzID0gbWF0Y2gubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gbGV2ZWxzO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZG5zRG9tYWluTGV2ZWxzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG5zRG9tYWluTGV2ZWxzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbi8qKlxuICogUmVzb2x2ZXMgdGhlIGdpdmVuIEROUyBob3N0bmFtZSBpbnRvIGFuIElQIGFkZHJlc3MsIGFuZCByZXR1cm5zIGl0IGluIHRoZSBkb3RcbiAqIHNlcGFyYXRlZCBmb3JtYXQgYXMgYSBzdHJpbmcuXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBgYGAganNcbiAqIGRuc1Jlc29sdmUoXCJob21lLm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyByZXR1cm5zIHRoZSBzdHJpbmcgXCIxOTguOTUuMjQ5Ljc5XCIuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdCBob3N0bmFtZSB0byByZXNvbHZlXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJlc29sdmVkIElQIGFkZHJlc3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZG5zUmVzb2x2ZShob3N0KSB7XG4gICAgY29uc3QgZmFtaWx5ID0gNDtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByID0gYXdhaXQgKDAsIHV0aWxfMS5kbnNMb29rdXApKGhvc3QsIHsgZmFtaWx5IH0pO1xuICAgICAgICBpZiAodHlwZW9mIHIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIEBpZ25vcmVcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkbnNSZXNvbHZlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG5zUmVzb2x2ZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc2FuZGJveCA9IGV4cG9ydHMuY3JlYXRlUGFjUmVzb2x2ZXIgPSB2b2lkIDA7XG5jb25zdCBkZWdlbmVyYXRvcl8xID0gcmVxdWlyZShcImRlZ2VuZXJhdG9yXCIpO1xuLyoqXG4gKiBCdWlsdC1pbiBQQUMgZnVuY3Rpb25zLlxuICovXG5jb25zdCBkYXRlUmFuZ2VfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kYXRlUmFuZ2VcIikpO1xuY29uc3QgZG5zRG9tYWluSXNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kbnNEb21haW5Jc1wiKSk7XG5jb25zdCBkbnNEb21haW5MZXZlbHNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kbnNEb21haW5MZXZlbHNcIikpO1xuY29uc3QgZG5zUmVzb2x2ZV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2Ruc1Jlc29sdmVcIikpO1xuY29uc3QgaXNJbk5ldF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2lzSW5OZXRcIikpO1xuY29uc3QgaXNQbGFpbkhvc3ROYW1lXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vaXNQbGFpbkhvc3ROYW1lXCIpKTtcbmNvbnN0IGlzUmVzb2x2YWJsZV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2lzUmVzb2x2YWJsZVwiKSk7XG5jb25zdCBsb2NhbEhvc3RPckRvbWFpbklzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbG9jYWxIb3N0T3JEb21haW5Jc1wiKSk7XG5jb25zdCBteUlwQWRkcmVzc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL215SXBBZGRyZXNzXCIpKTtcbmNvbnN0IHNoRXhwTWF0Y2hfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9zaEV4cE1hdGNoXCIpKTtcbmNvbnN0IHRpbWVSYW5nZV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3RpbWVSYW5nZVwiKSk7XG5jb25zdCB3ZWVrZGF5UmFuZ2VfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi93ZWVrZGF5UmFuZ2VcIikpO1xuLyoqXG4gKiBSZXR1cm5zIGFuIGFzeW5jaHJvbm91cyBgRmluZFByb3h5Rm9yVVJMKClgIGZ1bmN0aW9uXG4gKiBmcm9tIHRoZSBnaXZlbiBKUyBzdHJpbmcgKGZyb20gYSBQQUMgZmlsZSkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBhY1Jlc29sdmVyKHFqcywgX3N0ciwgX29wdHMgPSB7fSkge1xuICAgIGNvbnN0IHN0ciA9IEJ1ZmZlci5pc0J1ZmZlcihfc3RyKSA/IF9zdHIudG9TdHJpbmcoJ3V0ZjgnKSA6IF9zdHI7XG4gICAgLy8gVGhlIHNhbmRib3ggdG8gdXNlIGZvciB0aGUgYHZtYCBjb250ZXh0LlxuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgIC4uLmV4cG9ydHMuc2FuZGJveCxcbiAgICAgICAgLi4uX29wdHMuc2FuZGJveCxcbiAgICB9O1xuICAgIC8vIENvbnN0cnVjdCB0aGUgYXJyYXkgb2YgYXN5bmMgZnVuY3Rpb24gbmFtZXMgdG8gYWRkIGBhd2FpdGAgY2FsbHMgdG8uXG4gICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhjb250ZXh0KS5maWx0ZXIoKGspID0+IGlzQXN5bmNGdW5jdGlvbihjb250ZXh0W2tdKSk7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgZmlsZW5hbWU6ICdwcm94eS5wYWMnLFxuICAgICAgICBuYW1lcyxcbiAgICAgICAgLi4uX29wdHMsXG4gICAgICAgIHNhbmRib3g6IGNvbnRleHQsXG4gICAgfTtcbiAgICAvLyBDb21waWxlIHRoZSBKUyBgRmluZFByb3h5Rm9yVVJMKClgIGZ1bmN0aW9uIGludG8gYW4gYXN5bmMgZnVuY3Rpb24uXG4gICAgY29uc3QgcmVzb2x2ZXIgPSAoMCwgZGVnZW5lcmF0b3JfMS5jb21waWxlKShxanMsIHN0ciwgJ0ZpbmRQcm94eUZvclVSTCcsIG9wdHMpO1xuICAgIGZ1bmN0aW9uIEZpbmRQcm94eUZvclVSTCh1cmwsIF9ob3N0KSB7XG4gICAgICAgIGNvbnN0IHVybE9iaiA9IHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnID8gbmV3IFVSTCh1cmwpIDogdXJsO1xuICAgICAgICBjb25zdCBob3N0ID0gX2hvc3QgfHwgdXJsT2JqLmhvc3RuYW1lO1xuICAgICAgICBpZiAoIWhvc3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBkZXRlcm1pbmUgYGhvc3RgJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKHVybE9iai5ocmVmLCBob3N0KTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZpbmRQcm94eUZvclVSTCwgJ3RvU3RyaW5nJywge1xuICAgICAgICB2YWx1ZTogKCkgPT4gcmVzb2x2ZXIudG9TdHJpbmcoKSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIEZpbmRQcm94eUZvclVSTDtcbn1cbmV4cG9ydHMuY3JlYXRlUGFjUmVzb2x2ZXIgPSBjcmVhdGVQYWNSZXNvbHZlcjtcbmV4cG9ydHMuc2FuZGJveCA9IE9iamVjdC5mcmVlemUoe1xuICAgIGFsZXJ0OiAobWVzc2FnZSA9ICcnKSA9PiBjb25zb2xlLmxvZygnJXMnLCBtZXNzYWdlKSxcbiAgICBkYXRlUmFuZ2U6IGRhdGVSYW5nZV8xLmRlZmF1bHQsXG4gICAgZG5zRG9tYWluSXM6IGRuc0RvbWFpbklzXzEuZGVmYXVsdCxcbiAgICBkbnNEb21haW5MZXZlbHM6IGRuc0RvbWFpbkxldmVsc18xLmRlZmF1bHQsXG4gICAgZG5zUmVzb2x2ZTogZG5zUmVzb2x2ZV8xLmRlZmF1bHQsXG4gICAgaXNJbk5ldDogaXNJbk5ldF8xLmRlZmF1bHQsXG4gICAgaXNQbGFpbkhvc3ROYW1lOiBpc1BsYWluSG9zdE5hbWVfMS5kZWZhdWx0LFxuICAgIGlzUmVzb2x2YWJsZTogaXNSZXNvbHZhYmxlXzEuZGVmYXVsdCxcbiAgICBsb2NhbEhvc3RPckRvbWFpbklzOiBsb2NhbEhvc3RPckRvbWFpbklzXzEuZGVmYXVsdCxcbiAgICBteUlwQWRkcmVzczogbXlJcEFkZHJlc3NfMS5kZWZhdWx0LFxuICAgIHNoRXhwTWF0Y2g6IHNoRXhwTWF0Y2hfMS5kZWZhdWx0LFxuICAgIHRpbWVSYW5nZTogdGltZVJhbmdlXzEuZGVmYXVsdCxcbiAgICB3ZWVrZGF5UmFuZ2U6IHdlZWtkYXlSYW5nZV8xLmRlZmF1bHQsXG59KTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiBpc0FzeW5jRnVuY3Rpb24odikge1xuICAgIGlmICh0eXBlb2YgdiAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIE5hdGl2ZSBgQXN5bmNGdW5jdGlvbmBcbiAgICBpZiAodi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQXN5bmNGdW5jdGlvbicpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIFR5cGVTY3JpcHQgY29tcGlsZWRcbiAgICBpZiAoU3RyaW5nKHYpLmluZGV4T2YoJ19fYXdhaXRlcignKSAhPT0gLTEpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIExlZ2FjeSBiZWhhdmlvciAtIHNldCBgYXN5bmNgIHByb3BlcnR5IG9uIHRoZSBmdW5jdGlvblxuICAgIHJldHVybiBCb29sZWFuKHYuYXN5bmMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlwID0gdm9pZCAwO1xuY29uc3Qgb3NfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwib3NcIikpO1xuZXhwb3J0cy5pcCA9IHtcbiAgICBhZGRyZXNzKCkge1xuICAgICAgICBjb25zdCBpbnRlcmZhY2VzID0gb3NfMS5kZWZhdWx0Lm5ldHdvcmtJbnRlcmZhY2VzKCk7XG4gICAgICAgIC8vIERlZmF1bHQgdG8gYGlwdjRgXG4gICAgICAgIGNvbnN0IGZhbWlseSA9IG5vcm1hbGl6ZUZhbWlseSgpO1xuICAgICAgICBjb25zdCBhbGwgPSBPYmplY3QudmFsdWVzKGludGVyZmFjZXMpLm1hcCgoYWRkcnMgPSBbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzc2VzID0gYWRkcnMuZmlsdGVyKChkZXRhaWxzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGV0YWlsc0ZhbWlseSA9IG5vcm1hbGl6ZUZhbWlseShkZXRhaWxzLmZhbWlseSk7XG4gICAgICAgICAgICAgICAgaWYgKGRldGFpbHNGYW1pbHkgIT09IGZhbWlseSB8fCBleHBvcnRzLmlwLmlzTG9vcGJhY2soZGV0YWlscy5hZGRyZXNzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gYWRkcmVzc2VzLmxlbmd0aCA/IGFkZHJlc3Nlc1swXS5hZGRyZXNzIDogdW5kZWZpbmVkO1xuICAgICAgICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIHJldHVybiAhYWxsLmxlbmd0aCA/IGV4cG9ydHMuaXAubG9vcGJhY2soZmFtaWx5KSA6IGFsbFswXTtcbiAgICB9LFxuICAgIGlzTG9vcGJhY2soYWRkcikge1xuICAgICAgICByZXR1cm4gL14oOjpmezR9Oik/MTI3XFwuKFswLTldezEsM30pXFwuKFswLTldezEsM30pXFwuKFswLTldezEsM30pL1xuICAgICAgICAgICAgLnRlc3QoYWRkcilcbiAgICAgICAgICAgIHx8IC9eZmU4MDo6MSQvLnRlc3QoYWRkcilcbiAgICAgICAgICAgIHx8IC9eOjoxJC8udGVzdChhZGRyKVxuICAgICAgICAgICAgfHwgL146OiQvLnRlc3QoYWRkcik7XG4gICAgfSxcbiAgICBsb29wYmFjayhmYW1pbHkpIHtcbiAgICAgICAgLy8gRGVmYXVsdCB0byBgaXB2NGBcbiAgICAgICAgZmFtaWx5ID0gbm9ybWFsaXplRmFtaWx5KGZhbWlseSk7XG4gICAgICAgIGlmIChmYW1pbHkgIT09ICdpcHY0JyAmJiBmYW1pbHkgIT09ICdpcHY2Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYW1pbHkgbXVzdCBiZSBpcHY0IG9yIGlwdjYnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFtaWx5ID09PSAnaXB2NCcgPyAnMTI3LjAuMC4xJyA6ICdmZTgwOjoxJztcbiAgICB9XG59O1xuZnVuY3Rpb24gbm9ybWFsaXplRmFtaWx5KGZhbWlseSkge1xuICAgIGlmIChmYW1pbHkgPT09IDQpIHtcbiAgICAgICAgcmV0dXJuICdpcHY0JztcbiAgICB9XG4gICAgaWYgKGZhbWlseSA9PT0gNikge1xuICAgICAgICByZXR1cm4gJ2lwdjYnO1xuICAgIH1cbiAgICByZXR1cm4gZmFtaWx5ID8gZmFtaWx5LnRvTG93ZXJDYXNlKCkgOiAnaXB2NCc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IG5ldG1hc2tfMSA9IHJlcXVpcmUoXCJuZXRtYXNrXCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbi8qKlxuICogVHJ1ZSBpZmYgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIElQIGFkZHJlc3MgcGF0dGVybi5cbiAqXG4gKiBQYXR0ZXJuIGFuZCBtYXNrIHNwZWNpZmljYXRpb24gaXMgZG9uZSB0aGUgc2FtZSB3YXkgYXMgZm9yIFNPQ0tTIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBgIGpzXG4gKiBpc0luTmV0KGhvc3QsIFwiMTk4Ljk1LjI0OS43OVwiLCBcIjI1NS4yNTUuMjU1LjI1NVwiKVxuICogICAvLyBpcyB0cnVlIGlmZiB0aGUgSVAgYWRkcmVzcyBvZiBob3N0IG1hdGNoZXMgZXhhY3RseSAxOTguOTUuMjQ5Ljc5LlxuICpcbiAqIGlzSW5OZXQoaG9zdCwgXCIxOTguOTUuMC4wXCIsIFwiMjU1LjI1NS4wLjBcIilcbiAqICAgLy8gaXMgdHJ1ZSBpZmYgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgbWF0Y2hlcyAxOTguOTUuKi4qLlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhvc3QgYSBETlMgaG9zdG5hbWUsIG9yIElQIGFkZHJlc3MuIElmIGEgaG9zdG5hbWUgaXMgcGFzc2VkLFxuICogICBpdCB3aWxsIGJlIHJlc292ZWQgaW50byBhbiBJUCBhZGRyZXNzIGJ5IHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0dGVybiBhbiBJUCBhZGRyZXNzIHBhdHRlcm4gaW4gdGhlIGRvdC1zZXBhcmF0ZWQgZm9ybWF0IG1hc2suXG4gKiBAcGFyYW0ge1N0cmluZ30gbWFzayBmb3IgdGhlIElQIGFkZHJlc3MgcGF0dGVybiBpbmZvcm1pbmcgd2hpY2ggcGFydHMgb2YgdGhlXG4gKiAgIElQIGFkZHJlc3Mgc2hvdWxkIGJlIG1hdGNoZWQgYWdhaW5zdC4gMCBtZWFucyBpZ25vcmUsIDI1NSBtZWFucyBtYXRjaC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzSW5OZXQoaG9zdCwgcGF0dGVybiwgbWFzaykge1xuICAgIGNvbnN0IGZhbWlseSA9IDQ7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaXAgPSBhd2FpdCAoMCwgdXRpbF8xLmRuc0xvb2t1cCkoaG9zdCwgeyBmYW1pbHkgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgaXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXRtYXNrID0gbmV3IG5ldG1hc2tfMS5OZXRtYXNrKHBhdHRlcm4sIG1hc2spO1xuICAgICAgICAgICAgcmV0dXJuIG5ldG1hc2suY29udGFpbnMoaXApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGlzSW5OZXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc0luTmV0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBUcnVlIGlmZiB0aGVyZSBpcyBubyBkb21haW4gbmFtZSBpbiB0aGUgaG9zdG5hbWUgKG5vIGRvdHMpLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYCBqc1xuICogaXNQbGFpbkhvc3ROYW1lKFwid3d3XCIpXG4gKiAgIC8vIGlzIHRydWUuXG4gKlxuICogaXNQbGFpbkhvc3ROYW1lKFwid3d3Lm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyBpcyBmYWxzZS5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3N0IFRoZSBob3N0bmFtZSBmcm9tIHRoZSBVUkwgKGV4Y2x1ZGluZyBwb3J0IG51bWJlcikuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiBpc1BsYWluSG9zdE5hbWUoaG9zdCkge1xuICAgIHJldHVybiAhL1xcLi8udGVzdChob3N0KTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGlzUGxhaW5Ib3N0TmFtZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzUGxhaW5Ib3N0TmFtZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG4vKipcbiAqIFRyaWVzIHRvIHJlc29sdmUgdGhlIGhvc3RuYW1lLiBSZXR1cm5zIHRydWUgaWYgc3VjY2VlZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhvc3QgaXMgdGhlIGhvc3RuYW1lIGZyb20gdGhlIFVSTC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzUmVzb2x2YWJsZShob3N0KSB7XG4gICAgY29uc3QgZmFtaWx5ID0gNDtcbiAgICB0cnkge1xuICAgICAgICBpZiAoYXdhaXQgKDAsIHV0aWxfMS5kbnNMb29rdXApKGhvc3QsIHsgZmFtaWx5IH0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBpc1Jlc29sdmFibGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc1Jlc29sdmFibGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIElzIHRydWUgaWYgdGhlIGhvc3RuYW1lIG1hdGNoZXMgZXhhY3RseSB0aGUgc3BlY2lmaWVkIGhvc3RuYW1lLCBvciBpZiB0aGVyZSBpc1xuICogbm8gZG9tYWluIG5hbWUgcGFydCBpbiB0aGUgaG9zdG5hbWUsIGJ1dCB0aGUgdW5xdWFsaWZpZWQgaG9zdG5hbWUgbWF0Y2hlcy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIGxvY2FsSG9zdE9yRG9tYWluSXMoXCJ3d3cubmV0c2NhcGUuY29tXCIsIFwid3d3Lm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyBpcyB0cnVlIChleGFjdCBtYXRjaCkuXG4gKlxuICogbG9jYWxIb3N0T3JEb21haW5JcyhcInd3d1wiLCBcInd3dy5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgdHJ1ZSAoaG9zdG5hbWUgbWF0Y2gsIGRvbWFpbiBub3Qgc3BlY2lmaWVkKS5cbiAqXG4gKiBsb2NhbEhvc3RPckRvbWFpbklzKFwid3d3Lm1jb20uY29tXCIsIFwid3d3Lm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyBpcyBmYWxzZSAoZG9tYWluIG5hbWUgbWlzbWF0Y2gpLlxuICpcbiAqIGxvY2FsSG9zdE9yRG9tYWluSXMoXCJob21lLm5ldHNjYXBlLmNvbVwiLCBcInd3dy5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgZmFsc2UgKGhvc3RuYW1lIG1pc21hdGNoKS5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3N0IHRoZSBob3N0bmFtZSBmcm9tIHRoZSBVUkwuXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdGRvbSBmdWxseSBxdWFsaWZpZWQgaG9zdG5hbWUgdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGxvY2FsSG9zdE9yRG9tYWluSXMoaG9zdCwgaG9zdGRvbSkge1xuICAgIGNvbnN0IHBhcnRzID0gaG9zdC5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGRvbXBhcnRzID0gaG9zdGRvbS5zcGxpdCgnLicpO1xuICAgIGxldCBtYXRjaGVzID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXJ0c1tpXSAhPT0gZG9tcGFydHNbaV0pIHtcbiAgICAgICAgICAgIG1hdGNoZXMgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gbG9jYWxIb3N0T3JEb21haW5Jcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvY2FsSG9zdE9yRG9tYWluSXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBpcF8xID0gcmVxdWlyZShcIi4vaXBcIik7XG5jb25zdCBuZXRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwibmV0XCIpKTtcbi8qKlxuICogUmV0dXJucyB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCB0aGF0IHRoZSBOYXZpZ2F0b3IgaXMgcnVubmluZyBvbiwgYXNcbiAqIGEgc3RyaW5nIGluIHRoZSBkb3Qtc2VwYXJhdGVkIGludGVnZXIgZm9ybWF0LlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgIGpzXG4gKiBteUlwQWRkcmVzcygpXG4gKiAgIC8vIHdvdWxkIHJldHVybiB0aGUgc3RyaW5nIFwiMTk4Ljk1LjI0OS43OVwiIGlmIHlvdSB3ZXJlIHJ1bm5pbmcgdGhlXG4gKiAgIC8vIE5hdmlnYXRvciBvbiB0aGF0IGhvc3QuXG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IGV4dGVybmFsIElQIGFkZHJlc3NcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbXlJcEFkZHJlc3MoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gOC44LjguODo1MyBpcyBcIkdvb2dsZSBQdWJsaWMgRE5TXCI6XG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3B1YmxpYy1kbnMvXG4gICAgICAgIGNvbnN0IHNvY2tldCA9IG5ldF8xLmRlZmF1bHQuY29ubmVjdCh7IGhvc3Q6ICc4LjguOC44JywgcG9ydDogNTMgfSk7XG4gICAgICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAvLyBpZiB3ZSBmYWlsIHRvIGFjY2VzcyBHb29nbGUgRE5TIChhcyBpbiBmaXJld2FsbCBibG9ja3MgYWNjZXNzKSxcbiAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIHF1ZXJ5aW5nIElQIGxvY2FsbHlcbiAgICAgICAgICAgIHJlc29sdmUoaXBfMS5pcC5hZGRyZXNzKCkpO1xuICAgICAgICB9O1xuICAgICAgICBzb2NrZXQub25jZSgnZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgc29ja2V0Lm9uY2UoJ2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgICBjb25zdCBhZGRyID0gc29ja2V0LmFkZHJlc3MoKTtcbiAgICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFkZHIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShhZGRyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFkZHIuYWRkcmVzcykge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoYWRkci5hZGRyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgYHN0cmluZ2AnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gbXlJcEFkZHJlc3M7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1teUlwQWRkcmVzcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHNoZWxsXG4gKiBleHByZXNzaW9uLlxuICpcbiAqIEFjdHVhbGx5LCBjdXJyZW50bHkgdGhlIHBhdHRlcm5zIGFyZSBzaGVsbCBleHByZXNzaW9ucyxcbiAqIG5vdCByZWd1bGFyIGV4cHJlc3Npb25zLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYCBqc1xuICogc2hFeHBNYXRjaChcImh0dHA6Ly9ob21lLm5ldHNjYXBlLmNvbS9wZW9wbGUvYXJpL2luZGV4Lmh0bWxcIiwgXCIqXFwvYXJpLypcIilcbiAqICAgLy8gaXMgdHJ1ZS5cbiAqXG4gKiBzaEV4cE1hdGNoKFwiaHR0cDovL2hvbWUubmV0c2NhcGUuY29tL3Blb3BsZS9tb250dWxsaS9pbmRleC5odG1sXCIsIFwiKlxcL2FyaS8qXCIpXG4gKiAgIC8vIGlzIGZhbHNlLlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBpcyBhbnkgc3RyaW5nIHRvIGNvbXBhcmUgKGUuZy4gdGhlIFVSTCwgb3IgdGhlIGhvc3RuYW1lKS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzaGV4cCBpcyBhIHNoZWxsIGV4cHJlc3Npb24gdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgdGhlIHNoZWxsIGV4cHJlc3Npb24uXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIHNoRXhwTWF0Y2goc3RyLCBzaGV4cCkge1xuICAgIGNvbnN0IHJlID0gdG9SZWdFeHAoc2hleHApO1xuICAgIHJldHVybiByZS50ZXN0KHN0cik7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBzaEV4cE1hdGNoO1xuLyoqXG4gKiBDb252ZXJ0cyBhIFwic2hlbGwgZXhwcmVzc2lvblwiIHRvIGEgSmF2YVNjcmlwdCBSZWdFeHAuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHRvUmVnRXhwKHN0cikge1xuICAgIHN0ciA9IFN0cmluZyhzdHIpXG4gICAgICAgIC5yZXBsYWNlKC9cXC4vZywgJ1xcXFwuJylcbiAgICAgICAgLnJlcGxhY2UoL1xcPy9nLCAnLicpXG4gICAgICAgIC5yZXBsYWNlKC9cXCovZywgJy4qJyk7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3N0cn0kYCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaEV4cE1hdGNoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBUcnVlIGR1cmluZyAob3IgYmV0d2VlbikgdGhlIHNwZWNpZmllZCB0aW1lKHMpLlxuICpcbiAqIEV2ZW4gdGhvdWdoIHRoZSBleGFtcGxlcyBkb24ndCBzaG93IGl0LCB0aGlzIHBhcmFtZXRlciBtYXkgYmUgcHJlc2VudCBpblxuICogZWFjaCBvZiB0aGUgZGlmZmVyZW50IHBhcmFtZXRlciBwcm9maWxlcywgYWx3YXlzIGFzIHRoZSBsYXN0IHBhcmFtZXRlci5cbiAqXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBgIGpzXG4gKiB0aW1lcmFuZ2UoMTIpXG4gKiB0cnVlIGZyb20gbm9vbiB0byAxcG0uXG4gKlxuICogdGltZXJhbmdlKDEyLCAxMylcbiAqIHNhbWUgYXMgYWJvdmUuXG4gKlxuICogdGltZXJhbmdlKDEyLCBcIkdNVFwiKVxuICogdHJ1ZSBmcm9tIG5vb24gdG8gMXBtLCBpbiBHTVQgdGltZXpvbmUuXG4gKlxuICogdGltZXJhbmdlKDksIDE3KVxuICogdHJ1ZSBmcm9tIDlhbSB0byA1cG0uXG4gKlxuICogdGltZXJhbmdlKDgsIDMwLCAxNywgMDApXG4gKiB0cnVlIGZyb20gODozMGFtIHRvIDU6MDBwbS5cbiAqXG4gKiB0aW1lcmFuZ2UoMCwgMCwgMCwgMCwgMCwgMzApXG4gKiB0cnVlIGJldHdlZW4gbWlkbmlnaHQgYW5kIDMwIHNlY29uZHMgcGFzdCBtaWRuaWdodC5cbiAqIGBgYFxuICpcbiAqIHRpbWVSYW5nZShob3VyKVxuICogdGltZVJhbmdlKGhvdXIxLCBob3VyMilcbiAqIHRpbWVSYW5nZShob3VyMSwgbWluMSwgaG91cjIsIG1pbjIpXG4gKiB0aW1lUmFuZ2UoaG91cjEsIG1pbjEsIHNlYzEsIGhvdXIyLCBtaW4yLCBzZWMyKVxuICogdGltZVJhbmdlKGhvdXIxLCBtaW4xLCBzZWMxLCBob3VyMiwgbWluMiwgc2VjMiwgZ210KVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3VyIGlzIHRoZSBob3VyIGZyb20gMCB0byAyMy4gKDAgaXMgbWlkbmlnaHQsIDIzIGlzIDExIHBtLilcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW4gbWludXRlcyBmcm9tIDAgdG8gNTkuXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VjIHNlY29uZHMgZnJvbSAwIHRvIDU5LlxuICogQHBhcmFtIHtTdHJpbmd9IGdtdCBlaXRoZXIgdGhlIHN0cmluZyBcIkdNVFwiIGZvciBHTVQgdGltZXpvbmUsIG9yIG5vdCBzcGVjaWZpZWQsIGZvciBsb2NhbCB0aW1lem9uZS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIHRpbWVSYW5nZSgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgY29uc3QgbGFzdEFyZyA9IGFyZ3MucG9wKCk7XG4gICAgY29uc3QgdXNlR01Uem9uZSA9IGxhc3RBcmcgPT09ICdHTVQnO1xuICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcbiAgICBpZiAoIXVzZUdNVHpvbmUpIHtcbiAgICAgICAgYXJncy5wdXNoKGxhc3RBcmcpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgY29uc3Qgbm9PZkFyZ3MgPSBhcmdzLmxlbmd0aDtcbiAgICBjb25zdCBudW1lcmljQXJncyA9IGFyZ3MubWFwKChuKSA9PiBwYXJzZUludChuLCAxMCkpO1xuICAgIC8vIHRpbWVSYW5nZShob3VyKVxuICAgIGlmIChub09mQXJncyA9PT0gMSkge1xuICAgICAgICByZXN1bHQgPSBnZXRDdXJyZW50SG91cih1c2VHTVR6b25lLCBjdXJyZW50RGF0ZSkgPT09IG51bWVyaWNBcmdzWzBdO1xuICAgICAgICAvLyB0aW1lUmFuZ2UoaG91cjEsIGhvdXIyKVxuICAgIH1cbiAgICBlbHNlIGlmIChub09mQXJncyA9PT0gMikge1xuICAgICAgICBjb25zdCBjdXJyZW50SG91ciA9IGdldEN1cnJlbnRIb3VyKHVzZUdNVHpvbmUsIGN1cnJlbnREYXRlKTtcbiAgICAgICAgcmVzdWx0ID0gbnVtZXJpY0FyZ3NbMF0gPD0gY3VycmVudEhvdXIgJiYgY3VycmVudEhvdXIgPCBudW1lcmljQXJnc1sxXTtcbiAgICAgICAgLy8gdGltZVJhbmdlKGhvdXIxLCBtaW4xLCBob3VyMiwgbWluMilcbiAgICB9XG4gICAgZWxzZSBpZiAobm9PZkFyZ3MgPT09IDQpIHtcbiAgICAgICAgcmVzdWx0ID0gdmFsdWVJblJhbmdlKHNlY29uZHNFbGFwc2VkVG9kYXkobnVtZXJpY0FyZ3NbMF0sIG51bWVyaWNBcmdzWzFdLCAwKSwgc2Vjb25kc0VsYXBzZWRUb2RheShnZXRDdXJyZW50SG91cih1c2VHTVR6b25lLCBjdXJyZW50RGF0ZSksIGdldEN1cnJlbnRNaW51dGUodXNlR01Uem9uZSwgY3VycmVudERhdGUpLCAwKSwgc2Vjb25kc0VsYXBzZWRUb2RheShudW1lcmljQXJnc1syXSwgbnVtZXJpY0FyZ3NbM10sIDU5KSk7XG4gICAgICAgIC8vIHRpbWVSYW5nZShob3VyMSwgbWluMSwgc2VjMSwgaG91cjIsIG1pbjIsIHNlYzIpXG4gICAgfVxuICAgIGVsc2UgaWYgKG5vT2ZBcmdzID09PSA2KSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlSW5SYW5nZShzZWNvbmRzRWxhcHNlZFRvZGF5KG51bWVyaWNBcmdzWzBdLCBudW1lcmljQXJnc1sxXSwgbnVtZXJpY0FyZ3NbMl0pLCBzZWNvbmRzRWxhcHNlZFRvZGF5KGdldEN1cnJlbnRIb3VyKHVzZUdNVHpvbmUsIGN1cnJlbnREYXRlKSwgZ2V0Q3VycmVudE1pbnV0ZSh1c2VHTVR6b25lLCBjdXJyZW50RGF0ZSksIGdldEN1cnJlbnRTZWNvbmQodXNlR01Uem9uZSwgY3VycmVudERhdGUpKSwgc2Vjb25kc0VsYXBzZWRUb2RheShudW1lcmljQXJnc1szXSwgbnVtZXJpY0FyZ3NbNF0sIG51bWVyaWNBcmdzWzVdKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnRzLmRlZmF1bHQgPSB0aW1lUmFuZ2U7XG5mdW5jdGlvbiBzZWNvbmRzRWxhcHNlZFRvZGF5KGhoLCBtbSwgc3MpIHtcbiAgICByZXR1cm4gaGggKiAzNjAwICsgbW0gKiA2MCArIHNzO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudEhvdXIoZ210LCBjdXJyZW50RGF0ZSkge1xuICAgIHJldHVybiBnbXQgPyBjdXJyZW50RGF0ZS5nZXRVVENIb3VycygpIDogY3VycmVudERhdGUuZ2V0SG91cnMoKTtcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRNaW51dGUoZ210LCBjdXJyZW50RGF0ZSkge1xuICAgIHJldHVybiBnbXQgPyBjdXJyZW50RGF0ZS5nZXRVVENNaW51dGVzKCkgOiBjdXJyZW50RGF0ZS5nZXRNaW51dGVzKCk7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50U2Vjb25kKGdtdCwgY3VycmVudERhdGUpIHtcbiAgICByZXR1cm4gZ210ID8gY3VycmVudERhdGUuZ2V0VVRDU2Vjb25kcygpIDogY3VycmVudERhdGUuZ2V0U2Vjb25kcygpO1xufVxuLy8gc3RhcnQgPD0gdmFsdWUgPD0gZmluaXNoXG5mdW5jdGlvbiB2YWx1ZUluUmFuZ2Uoc3RhcnQsIHZhbHVlLCBmaW5pc2gpIHtcbiAgICByZXR1cm4gc3RhcnQgPD0gdmFsdWUgJiYgdmFsdWUgPD0gZmluaXNoO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltZVJhbmdlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0dNVCA9IGV4cG9ydHMuZG5zTG9va3VwID0gdm9pZCAwO1xuY29uc3QgZG5zXzEgPSByZXF1aXJlKFwiZG5zXCIpO1xuZnVuY3Rpb24gZG5zTG9va3VwKGhvc3QsIG9wdHMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAoMCwgZG5zXzEubG9va3VwKShob3N0LCBvcHRzLCAoZXJyLCByZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLmRuc0xvb2t1cCA9IGRuc0xvb2t1cDtcbmZ1bmN0aW9uIGlzR01UKHYpIHtcbiAgICByZXR1cm4gdiA9PT0gJ0dNVCc7XG59XG5leHBvcnRzLmlzR01UID0gaXNHTVQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbmNvbnN0IHdlZWtkYXlzID0gWydTVU4nLCAnTU9OJywgJ1RVRScsICdXRUQnLCAnVEhVJywgJ0ZSSScsICdTQVQnXTtcbi8qKlxuICogT25seSB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIG1hbmRhdG9yeS4gRWl0aGVyIHRoZSBzZWNvbmQsIHRoZSB0aGlyZCwgb3IgYm90aFxuICogbWF5IGJlIGxlZnQgb3V0LlxuICpcbiAqIElmIG9ubHkgb25lIHBhcmFtZXRlciBpcyBwcmVzZW50LCB0aGUgZnVuY3Rpb24geWVpbGRzIGEgdHJ1ZSB2YWx1ZSBvbiB0aGVcbiAqIHdlZWtkYXkgdGhhdCB0aGUgcGFyYW1ldGVyIHJlcHJlc2VudHMuIElmIHRoZSBzdHJpbmcgXCJHTVRcIiBpcyBzcGVjaWZpZWQgYXNcbiAqIGEgc2Vjb25kIHBhcmFtZXRlciwgdGltZXMgYXJlIHRha2VuIHRvIGJlIGluIEdNVCwgb3RoZXJ3aXNlIGluIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIElmIGJvdGggd2QxIGFuZCB3ZDEgYXJlIGRlZmluZWQsIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBpZiB0aGUgY3VycmVudCB3ZWVrZGF5XG4gKiBpcyBpbiBiZXR3ZWVuIHRob3NlIHR3byB3ZWVrZGF5cy4gQm91bmRzIGFyZSBpbmNsdXNpdmUuIElmIHRoZSBcIkdNVFwiIHBhcmFtZXRlclxuICogaXMgc3BlY2lmaWVkLCB0aW1lcyBhcmUgdGFrZW4gdG8gYmUgaW4gR01ULCBvdGhlcndpc2UgdGhlIGxvY2FsIHRpbWV6b25lIGlzXG4gKiB1c2VkLlxuICpcbiAqIFZhbGlkIFwid2Vla2RheSBzdHJpbmdzXCIgYXJlOlxuICpcbiAqICAgICBTVU4gTU9OIFRVRSBXRUQgVEhVIEZSSSBTQVRcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIHdlZWtkYXlSYW5nZShcIk1PTlwiLCBcIkZSSVwiKVxuICogdHJ1ZSBNb25kYXkgdHJob3VnaCBGcmlkYXkgKGxvY2FsIHRpbWV6b25lKS5cbiAqXG4gKiB3ZWVrZGF5UmFuZ2UoXCJNT05cIiwgXCJGUklcIiwgXCJHTVRcIilcbiAqIHNhbWUgYXMgYWJvdmUsIGJ1dCBHTVQgdGltZXpvbmUuXG4gKlxuICogd2Vla2RheVJhbmdlKFwiU0FUXCIpXG4gKiB0cnVlIG9uIFNhdHVyZGF5cyBsb2NhbCB0aW1lLlxuICpcbiAqIHdlZWtkYXlSYW5nZShcIlNBVFwiLCBcIkdNVFwiKVxuICogdHJ1ZSBvbiBTYXR1cmRheXMgR01UIHRpbWUuXG4gKlxuICogd2Vla2RheVJhbmdlKFwiRlJJXCIsIFwiTU9OXCIpXG4gKiB0cnVlIEZyaWRheSB0aHJvdWdoIE1vbmRheSAobm90ZSwgb3JkZXIgZG9lcyBtYXR0ZXIhKS5cbiAqIGBgYFxuICpcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gd2QxIG9uZSBvZiB0aGUgd2Vla2RheSBzdHJpbmdzLlxuICogQHBhcmFtIHtTdHJpbmd9IHdkMiBvbmUgb2YgdGhlIHdlZWtkYXkgc3RyaW5ncy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBnbXQgaXMgZWl0aGVyIHRoZSBzdHJpbmc6IEdNVCBvciBpcyBsZWZ0IG91dC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHdlZWtkYXlSYW5nZSh3ZDEsIHdkMiwgZ210KSB7XG4gICAgbGV0IHVzZUdNVHpvbmUgPSBmYWxzZTtcbiAgICBsZXQgd2QxSW5kZXggPSAtMTtcbiAgICBsZXQgd2QySW5kZXggPSAtMTtcbiAgICBsZXQgd2QySXNHbXQgPSBmYWxzZTtcbiAgICBpZiAoKDAsIHV0aWxfMS5pc0dNVCkoZ210KSkge1xuICAgICAgICB1c2VHTVR6b25lID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKDAsIHV0aWxfMS5pc0dNVCkod2QyKSkge1xuICAgICAgICB1c2VHTVR6b25lID0gdHJ1ZTtcbiAgICAgICAgd2QySXNHbXQgPSB0cnVlO1xuICAgIH1cbiAgICB3ZDFJbmRleCA9IHdlZWtkYXlzLmluZGV4T2Yod2QxKTtcbiAgICBpZiAoIXdkMklzR210ICYmIGlzV2Vla2RheSh3ZDIpKSB7XG4gICAgICAgIHdkMkluZGV4ID0gd2Vla2RheXMuaW5kZXhPZih3ZDIpO1xuICAgIH1cbiAgICBjb25zdCB0b2RheXNEYXkgPSBnZXRUb2RheXNEYXkodXNlR01Uem9uZSk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAod2QySW5kZXggPCAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHRvZGF5c0RheSA9PT0gd2QxSW5kZXg7XG4gICAgfVxuICAgIGVsc2UgaWYgKHdkMUluZGV4IDw9IHdkMkluZGV4KSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlSW5SYW5nZSh3ZDFJbmRleCwgdG9kYXlzRGF5LCB3ZDJJbmRleCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPVxuICAgICAgICAgICAgdmFsdWVJblJhbmdlKHdkMUluZGV4LCB0b2RheXNEYXksIDYpIHx8XG4gICAgICAgICAgICAgICAgdmFsdWVJblJhbmdlKDAsIHRvZGF5c0RheSwgd2QySW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gd2Vla2RheVJhbmdlO1xuZnVuY3Rpb24gZ2V0VG9kYXlzRGF5KGdtdCkge1xuICAgIHJldHVybiBnbXQgPyBuZXcgRGF0ZSgpLmdldFVUQ0RheSgpIDogbmV3IERhdGUoKS5nZXREYXkoKTtcbn1cbi8vIHN0YXJ0IDw9IHZhbHVlIDw9IGZpbmlzaFxuZnVuY3Rpb24gdmFsdWVJblJhbmdlKHN0YXJ0LCB2YWx1ZSwgZmluaXNoKSB7XG4gICAgcmV0dXJuIHN0YXJ0IDw9IHZhbHVlICYmIHZhbHVlIDw9IGZpbmlzaDtcbn1cbmZ1bmN0aW9uIGlzV2Vla2RheSh2KSB7XG4gICAgaWYgKCF2KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHdlZWtkYXlzLmluY2x1ZGVzKHYpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2Vla2RheVJhbmdlLmpzLm1hcCIsIm1vZHVsZS5leHBvcnRzID0gUGVuZDtcblxuZnVuY3Rpb24gUGVuZCgpIHtcbiAgdGhpcy5wZW5kaW5nID0gMDtcbiAgdGhpcy5tYXggPSBJbmZpbml0eTtcbiAgdGhpcy5saXN0ZW5lcnMgPSBbXTtcbiAgdGhpcy53YWl0aW5nID0gW107XG4gIHRoaXMuZXJyb3IgPSBudWxsO1xufVxuXG5QZW5kLnByb3RvdHlwZS5nbyA9IGZ1bmN0aW9uKGZuKSB7XG4gIGlmICh0aGlzLnBlbmRpbmcgPCB0aGlzLm1heCkge1xuICAgIHBlbmRHbyh0aGlzLCBmbik7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy53YWl0aW5nLnB1c2goZm4pO1xuICB9XG59O1xuXG5QZW5kLnByb3RvdHlwZS53YWl0ID0gZnVuY3Rpb24oY2IpIHtcbiAgaWYgKHRoaXMucGVuZGluZyA9PT0gMCkge1xuICAgIGNiKHRoaXMuZXJyb3IpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2goY2IpO1xuICB9XG59O1xuXG5QZW5kLnByb3RvdHlwZS5ob2xkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBwZW5kSG9sZCh0aGlzKTtcbn07XG5cbmZ1bmN0aW9uIHBlbmRIb2xkKHNlbGYpIHtcbiAgc2VsZi5wZW5kaW5nICs9IDE7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIG9uQ2I7XG4gIGZ1bmN0aW9uIG9uQ2IoZXJyKSB7XG4gICAgaWYgKGNhbGxlZCkgdGhyb3cgbmV3IEVycm9yKFwiY2FsbGJhY2sgY2FsbGVkIHR3aWNlXCIpO1xuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgc2VsZi5lcnJvciA9IHNlbGYuZXJyb3IgfHwgZXJyO1xuICAgIHNlbGYucGVuZGluZyAtPSAxO1xuICAgIGlmIChzZWxmLndhaXRpbmcubGVuZ3RoID4gMCAmJiBzZWxmLnBlbmRpbmcgPCBzZWxmLm1heCkge1xuICAgICAgcGVuZEdvKHNlbGYsIHNlbGYud2FpdGluZy5zaGlmdCgpKTtcbiAgICB9IGVsc2UgaWYgKHNlbGYucGVuZGluZyA9PT0gMCkge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IHNlbGYubGlzdGVuZXJzO1xuICAgICAgc2VsZi5saXN0ZW5lcnMgPSBbXTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGNiTGlzdGVuZXIpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBjYkxpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgbGlzdGVuZXIoc2VsZi5lcnJvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGVuZEdvKHNlbGYsIGZuKSB7XG4gIGZuKHBlbmRIb2xkKHNlbGYpKTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvbm9kZS1wcm9ncmVzcycpO1xuIiwiLyohXG4gKiBub2RlLXByb2dyZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAxMSBUSiBIb2xvd2F5Y2h1ayA8dGpAdmlzaW9uLW1lZGlhLmNhPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiBFeHBvc2UgYFByb2dyZXNzQmFyYC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBQcm9ncmVzc0JhcjtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgYFByb2dyZXNzQmFyYCB3aXRoIHRoZSBnaXZlbiBgZm10YCBzdHJpbmcgYW5kIGBvcHRpb25zYCBvclxuICogYHRvdGFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAgLSBgY3VycmAgY3VycmVudCBjb21wbGV0ZWQgaW5kZXhcbiAqICAgLSBgdG90YWxgIHRvdGFsIG51bWJlciBvZiB0aWNrcyB0byBjb21wbGV0ZVxuICogICAtIGB3aWR0aGAgdGhlIGRpc3BsYXllZCB3aWR0aCBvZiB0aGUgcHJvZ3Jlc3MgYmFyIGRlZmF1bHRpbmcgdG8gdG90YWxcbiAqICAgLSBgc3RyZWFtYCB0aGUgb3V0cHV0IHN0cmVhbSBkZWZhdWx0aW5nIHRvIHN0ZGVyclxuICogICAtIGBoZWFkYCBoZWFkIGNoYXJhY3RlciBkZWZhdWx0aW5nIHRvIGNvbXBsZXRlIGNoYXJhY3RlclxuICogICAtIGBjb21wbGV0ZWAgY29tcGxldGlvbiBjaGFyYWN0ZXIgZGVmYXVsdGluZyB0byBcIj1cIlxuICogICAtIGBpbmNvbXBsZXRlYCBpbmNvbXBsZXRlIGNoYXJhY3RlciBkZWZhdWx0aW5nIHRvIFwiLVwiXG4gKiAgIC0gYHJlbmRlclRocm90dGxlYCBtaW5pbXVtIHRpbWUgYmV0d2VlbiB1cGRhdGVzIGluIG1pbGxpc2Vjb25kcyBkZWZhdWx0aW5nIHRvIDE2XG4gKiAgIC0gYGNhbGxiYWNrYCBvcHRpb25hbCBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHByb2dyZXNzIGJhciBjb21wbGV0ZXNcbiAqICAgLSBgY2xlYXJgIHdpbGwgY2xlYXIgdGhlIHByb2dyZXNzIGJhciB1cG9uIHRlcm1pbmF0aW9uXG4gKlxuICogVG9rZW5zOlxuICpcbiAqICAgLSBgOmJhcmAgdGhlIHByb2dyZXNzIGJhciBpdHNlbGZcbiAqICAgLSBgOmN1cnJlbnRgIGN1cnJlbnQgdGljayBudW1iZXJcbiAqICAgLSBgOnRvdGFsYCB0b3RhbCB0aWNrc1xuICogICAtIGA6ZWxhcHNlZGAgdGltZSBlbGFwc2VkIGluIHNlY29uZHNcbiAqICAgLSBgOnBlcmNlbnRgIGNvbXBsZXRpb24gcGVyY2VudGFnZVxuICogICAtIGA6ZXRhYCBldGEgaW4gc2Vjb25kc1xuICogICAtIGA6cmF0ZWAgcmF0ZSBvZiB0aWNrcyBwZXIgc2Vjb25kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZtdFxuICogQHBhcmFtIHtvYmplY3R8bnVtYmVyfSBvcHRpb25zIG9yIHRvdGFsXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFByb2dyZXNzQmFyKGZtdCwgb3B0aW9ucykge1xuICB0aGlzLnN0cmVhbSA9IG9wdGlvbnMuc3RyZWFtIHx8IHByb2Nlc3Muc3RkZXJyO1xuXG4gIGlmICh0eXBlb2Yob3B0aW9ucykgPT0gJ251bWJlcicpIHtcbiAgICB2YXIgdG90YWwgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgICBvcHRpb25zLnRvdGFsID0gdG90YWw7XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKCdzdHJpbmcnICE9IHR5cGVvZiBmbXQpIHRocm93IG5ldyBFcnJvcignZm9ybWF0IHJlcXVpcmVkJyk7XG4gICAgaWYgKCdudW1iZXInICE9IHR5cGVvZiBvcHRpb25zLnRvdGFsKSB0aHJvdyBuZXcgRXJyb3IoJ3RvdGFsIHJlcXVpcmVkJyk7XG4gIH1cblxuICB0aGlzLmZtdCA9IGZtdDtcbiAgdGhpcy5jdXJyID0gb3B0aW9ucy5jdXJyIHx8IDA7XG4gIHRoaXMudG90YWwgPSBvcHRpb25zLnRvdGFsO1xuICB0aGlzLndpZHRoID0gb3B0aW9ucy53aWR0aCB8fCB0aGlzLnRvdGFsO1xuICB0aGlzLmNsZWFyID0gb3B0aW9ucy5jbGVhclxuICB0aGlzLmNoYXJzID0ge1xuICAgIGNvbXBsZXRlICAgOiBvcHRpb25zLmNvbXBsZXRlIHx8ICc9JyxcbiAgICBpbmNvbXBsZXRlIDogb3B0aW9ucy5pbmNvbXBsZXRlIHx8ICctJyxcbiAgICBoZWFkICAgICAgIDogb3B0aW9ucy5oZWFkIHx8IChvcHRpb25zLmNvbXBsZXRlIHx8ICc9JylcbiAgfTtcbiAgdGhpcy5yZW5kZXJUaHJvdHRsZSA9IG9wdGlvbnMucmVuZGVyVGhyb3R0bGUgIT09IDAgPyAob3B0aW9ucy5yZW5kZXJUaHJvdHRsZSB8fCAxNikgOiAwO1xuICB0aGlzLmxhc3RSZW5kZXIgPSAtSW5maW5pdHk7XG4gIHRoaXMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8IGZ1bmN0aW9uICgpIHt9O1xuICB0aGlzLnRva2VucyA9IHt9O1xuICB0aGlzLmxhc3REcmF3ID0gJyc7XG59XG5cbi8qKlxuICogXCJ0aWNrXCIgdGhlIHByb2dyZXNzIGJhciB3aXRoIG9wdGlvbmFsIGBsZW5gIGFuZCBvcHRpb25hbCBgdG9rZW5zYC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcnxvYmplY3R9IGxlbiBvciB0b2tlbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSB0b2tlbnNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUHJvZ3Jlc3NCYXIucHJvdG90eXBlLnRpY2sgPSBmdW5jdGlvbihsZW4sIHRva2Vucyl7XG4gIGlmIChsZW4gIT09IDApXG4gICAgbGVuID0gbGVuIHx8IDE7XG5cbiAgLy8gc3dhcCB0b2tlbnNcbiAgaWYgKCdvYmplY3QnID09IHR5cGVvZiBsZW4pIHRva2VucyA9IGxlbiwgbGVuID0gMTtcbiAgaWYgKHRva2VucykgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG5cbiAgLy8gc3RhcnQgdGltZSBmb3IgZXRhXG4gIGlmICgwID09IHRoaXMuY3VycikgdGhpcy5zdGFydCA9IG5ldyBEYXRlO1xuXG4gIHRoaXMuY3VyciArPSBsZW5cblxuICAvLyB0cnkgdG8gcmVuZGVyXG4gIHRoaXMucmVuZGVyKCk7XG5cbiAgLy8gcHJvZ3Jlc3MgY29tcGxldGVcbiAgaWYgKHRoaXMuY3VyciA+PSB0aGlzLnRvdGFsKSB7XG4gICAgdGhpcy5yZW5kZXIodW5kZWZpbmVkLCB0cnVlKTtcbiAgICB0aGlzLmNvbXBsZXRlID0gdHJ1ZTtcbiAgICB0aGlzLnRlcm1pbmF0ZSgpO1xuICAgIHRoaXMuY2FsbGJhY2sodGhpcyk7XG4gICAgcmV0dXJuO1xuICB9XG59O1xuXG4vKipcbiAqIE1ldGhvZCB0byByZW5kZXIgdGhlIHByb2dyZXNzIGJhciB3aXRoIG9wdGlvbmFsIGB0b2tlbnNgIHRvIHBsYWNlIGluIHRoZVxuICogcHJvZ3Jlc3MgYmFyJ3MgYGZtdGAgZmllbGQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRva2Vuc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Qcm9ncmVzc0Jhci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKHRva2VucywgZm9yY2UpIHtcbiAgZm9yY2UgPSBmb3JjZSAhPT0gdW5kZWZpbmVkID8gZm9yY2UgOiBmYWxzZTtcbiAgaWYgKHRva2VucykgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG5cbiAgaWYgKCF0aGlzLnN0cmVhbS5pc1RUWSkgcmV0dXJuO1xuXG4gIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICB2YXIgZGVsdGEgPSBub3cgLSB0aGlzLmxhc3RSZW5kZXI7XG4gIGlmICghZm9yY2UgJiYgKGRlbHRhIDwgdGhpcy5yZW5kZXJUaHJvdHRsZSkpIHtcbiAgICByZXR1cm47XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sYXN0UmVuZGVyID0gbm93O1xuICB9XG5cbiAgdmFyIHJhdGlvID0gdGhpcy5jdXJyIC8gdGhpcy50b3RhbDtcbiAgcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heChyYXRpbywgMCksIDEpO1xuXG4gIHZhciBwZXJjZW50ID0gTWF0aC5mbG9vcihyYXRpbyAqIDEwMCk7XG4gIHZhciBpbmNvbXBsZXRlLCBjb21wbGV0ZSwgY29tcGxldGVMZW5ndGg7XG4gIHZhciBlbGFwc2VkID0gbmV3IERhdGUgLSB0aGlzLnN0YXJ0O1xuICB2YXIgZXRhID0gKHBlcmNlbnQgPT0gMTAwKSA/IDAgOiBlbGFwc2VkICogKHRoaXMudG90YWwgLyB0aGlzLmN1cnIgLSAxKTtcbiAgdmFyIHJhdGUgPSB0aGlzLmN1cnIgLyAoZWxhcHNlZCAvIDEwMDApO1xuXG4gIC8qIHBvcHVsYXRlIHRoZSBiYXIgdGVtcGxhdGUgd2l0aCBwZXJjZW50YWdlcyBhbmQgdGltZXN0YW1wcyAqL1xuICB2YXIgc3RyID0gdGhpcy5mbXRcbiAgICAucmVwbGFjZSgnOmN1cnJlbnQnLCB0aGlzLmN1cnIpXG4gICAgLnJlcGxhY2UoJzp0b3RhbCcsIHRoaXMudG90YWwpXG4gICAgLnJlcGxhY2UoJzplbGFwc2VkJywgaXNOYU4oZWxhcHNlZCkgPyAnMC4wJyA6IChlbGFwc2VkIC8gMTAwMCkudG9GaXhlZCgxKSlcbiAgICAucmVwbGFjZSgnOmV0YScsIChpc05hTihldGEpIHx8ICFpc0Zpbml0ZShldGEpKSA/ICcwLjAnIDogKGV0YSAvIDEwMDApXG4gICAgICAudG9GaXhlZCgxKSlcbiAgICAucmVwbGFjZSgnOnBlcmNlbnQnLCBwZXJjZW50LnRvRml4ZWQoMCkgKyAnJScpXG4gICAgLnJlcGxhY2UoJzpyYXRlJywgTWF0aC5yb3VuZChyYXRlKSk7XG5cbiAgLyogY29tcHV0ZSB0aGUgYXZhaWxhYmxlIHNwYWNlIChub24temVybykgZm9yIHRoZSBiYXIgKi9cbiAgdmFyIGF2YWlsYWJsZVNwYWNlID0gTWF0aC5tYXgoMCwgdGhpcy5zdHJlYW0uY29sdW1ucyAtIHN0ci5yZXBsYWNlKCc6YmFyJywgJycpLmxlbmd0aCk7XG4gIGlmKGF2YWlsYWJsZVNwYWNlICYmIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpe1xuICAgIGF2YWlsYWJsZVNwYWNlID0gYXZhaWxhYmxlU3BhY2UgLSAxO1xuICB9XG5cbiAgdmFyIHdpZHRoID0gTWF0aC5taW4odGhpcy53aWR0aCwgYXZhaWxhYmxlU3BhY2UpO1xuXG4gIC8qIFRPRE86IHRoZSBmb2xsb3dpbmcgYXNzdW1lcyB0aGUgdXNlciBoYXMgb25lICc6YmFyJyB0b2tlbiAqL1xuICBjb21wbGV0ZUxlbmd0aCA9IE1hdGgucm91bmQod2lkdGggKiByYXRpbyk7XG4gIGNvbXBsZXRlID0gQXJyYXkoTWF0aC5tYXgoMCwgY29tcGxldGVMZW5ndGggKyAxKSkuam9pbih0aGlzLmNoYXJzLmNvbXBsZXRlKTtcbiAgaW5jb21wbGV0ZSA9IEFycmF5KE1hdGgubWF4KDAsIHdpZHRoIC0gY29tcGxldGVMZW5ndGggKyAxKSkuam9pbih0aGlzLmNoYXJzLmluY29tcGxldGUpO1xuXG4gIC8qIGFkZCBoZWFkIHRvIHRoZSBjb21wbGV0ZSBzdHJpbmcgKi9cbiAgaWYoY29tcGxldGVMZW5ndGggPiAwKVxuICAgIGNvbXBsZXRlID0gY29tcGxldGUuc2xpY2UoMCwgLTEpICsgdGhpcy5jaGFycy5oZWFkO1xuXG4gIC8qIGZpbGwgaW4gdGhlIGFjdHVhbCBwcm9ncmVzcyBiYXIgKi9cbiAgc3RyID0gc3RyLnJlcGxhY2UoJzpiYXInLCBjb21wbGV0ZSArIGluY29tcGxldGUpO1xuXG4gIC8qIHJlcGxhY2UgdGhlIGV4dHJhIHRva2VucyAqL1xuICBpZiAodGhpcy50b2tlbnMpIGZvciAodmFyIGtleSBpbiB0aGlzLnRva2Vucykgc3RyID0gc3RyLnJlcGxhY2UoJzonICsga2V5LCB0aGlzLnRva2Vuc1trZXldKTtcblxuICBpZiAodGhpcy5sYXN0RHJhdyAhPT0gc3RyKSB7XG4gICAgdGhpcy5zdHJlYW0uY3Vyc29yVG8oMCk7XG4gICAgdGhpcy5zdHJlYW0ud3JpdGUoc3RyKTtcbiAgICB0aGlzLnN0cmVhbS5jbGVhckxpbmUoMSk7XG4gICAgdGhpcy5sYXN0RHJhdyA9IHN0cjtcbiAgfVxufTtcblxuLyoqXG4gKiBcInVwZGF0ZVwiIHRoZSBwcm9ncmVzcyBiYXIgdG8gcmVwcmVzZW50IGFuIGV4YWN0IHBlcmNlbnRhZ2UuXG4gKiBUaGUgcmF0aW8gKGJldHdlZW4gMCBhbmQgMSkgc3BlY2lmaWVkIHdpbGwgYmUgbXVsdGlwbGllZCBieSBgdG90YWxgIGFuZFxuICogZmxvb3JlZCwgcmVwcmVzZW50aW5nIHRoZSBjbG9zZXN0IGF2YWlsYWJsZSBcInRpY2suXCIgRm9yIGV4YW1wbGUsIGlmIGFcbiAqIHByb2dyZXNzIGJhciBoYXMgYSBsZW5ndGggb2YgMyBhbmQgYHVwZGF0ZSgwLjUpYCBpcyBjYWxsZWQsIHRoZSBwcm9ncmVzc1xuICogd2lsbCBiZSBzZXQgdG8gMS5cbiAqXG4gKiBBIHJhdGlvIG9mIDAuNSB3aWxsIGF0dGVtcHQgdG8gc2V0IHRoZSBwcm9ncmVzcyB0byBoYWxmd2F5LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSByYXRpbyBUaGUgcmF0aW8gKGJldHdlZW4gMCBhbmQgMSBpbmNsdXNpdmUpIHRvIHNldCB0aGVcbiAqICAgb3ZlcmFsbCBjb21wbGV0aW9uIHRvLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Qcm9ncmVzc0Jhci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHJhdGlvLCB0b2tlbnMpIHtcbiAgdmFyIGdvYWwgPSBNYXRoLmZsb29yKHJhdGlvICogdGhpcy50b3RhbCk7XG4gIHZhciBkZWx0YSA9IGdvYWwgLSB0aGlzLmN1cnI7XG5cbiAgdGhpcy50aWNrKGRlbHRhLCB0b2tlbnMpO1xufTtcblxuLyoqXG4gKiBcImludGVycnVwdFwiIHRoZSBwcm9ncmVzcyBiYXIgYW5kIHdyaXRlIGEgbWVzc2FnZSBhYm92ZSBpdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHdyaXRlLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Qcm9ncmVzc0Jhci5wcm90b3R5cGUuaW50ZXJydXB0ID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgLy8gY2xlYXIgdGhlIGN1cnJlbnQgbGluZVxuICB0aGlzLnN0cmVhbS5jbGVhckxpbmUoKTtcbiAgLy8gbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZVxuICB0aGlzLnN0cmVhbS5jdXJzb3JUbygwKTtcbiAgLy8gd3JpdGUgdGhlIG1lc3NhZ2UgdGV4dFxuICB0aGlzLnN0cmVhbS53cml0ZShtZXNzYWdlKTtcbiAgLy8gdGVybWluYXRlIHRoZSBsaW5lIGFmdGVyIHdyaXRpbmcgdGhlIG1lc3NhZ2VcbiAgdGhpcy5zdHJlYW0ud3JpdGUoJ1xcbicpO1xuICAvLyByZS1kaXNwbGF5IHRoZSBwcm9ncmVzcyBiYXIgd2l0aCBpdHMgbGFzdERyYXdcbiAgdGhpcy5zdHJlYW0ud3JpdGUodGhpcy5sYXN0RHJhdyk7XG59O1xuXG4vKipcbiAqIFRlcm1pbmF0ZXMgYSBwcm9ncmVzcyBiYXIuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Qcm9ncmVzc0Jhci5wcm90b3R5cGUudGVybWluYXRlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGVhcikge1xuICAgIGlmICh0aGlzLnN0cmVhbS5jbGVhckxpbmUpIHtcbiAgICAgIHRoaXMuc3RyZWFtLmNsZWFyTGluZSgpO1xuICAgICAgdGhpcy5zdHJlYW0uY3Vyc29yVG8oMCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMuc3RyZWFtLndyaXRlKCdcXG4nKTtcbiAgfVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlByb3h5QWdlbnQgPSBleHBvcnRzLnByb3hpZXMgPSB2b2lkIDA7XG5jb25zdCBodHRwID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwXCIpKTtcbmNvbnN0IGh0dHBzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwc1wiKSk7XG5jb25zdCB1cmxfMSA9IHJlcXVpcmUoXCJ1cmxcIik7XG5jb25zdCBscnVfY2FjaGVfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwibHJ1LWNhY2hlXCIpKTtcbmNvbnN0IGFnZW50X2Jhc2VfMSA9IHJlcXVpcmUoXCJhZ2VudC1iYXNlXCIpO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpO1xuY29uc3QgcHJveHlfZnJvbV9lbnZfMSA9IHJlcXVpcmUoXCJwcm94eS1mcm9tLWVudlwiKTtcbmNvbnN0IHBhY19wcm94eV9hZ2VudF8xID0gcmVxdWlyZShcInBhYy1wcm94eS1hZ2VudFwiKTtcbmNvbnN0IGh0dHBfcHJveHlfYWdlbnRfMSA9IHJlcXVpcmUoXCJodHRwLXByb3h5LWFnZW50XCIpO1xuY29uc3QgaHR0cHNfcHJveHlfYWdlbnRfMSA9IHJlcXVpcmUoXCJodHRwcy1wcm94eS1hZ2VudFwiKTtcbmNvbnN0IHNvY2tzX3Byb3h5X2FnZW50XzEgPSByZXF1aXJlKFwic29ja3MtcHJveHktYWdlbnRcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdwcm94eS1hZ2VudCcpO1xuY29uc3QgUFJPVE9DT0xTID0gW1xuICAgIC4uLmh0dHBfcHJveHlfYWdlbnRfMS5IdHRwUHJveHlBZ2VudC5wcm90b2NvbHMsXG4gICAgLi4uc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnQucHJvdG9jb2xzLFxuICAgIC4uLnBhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnQucHJvdG9jb2xzLFxuXTtcbi8qKlxuICogU3VwcG9ydGVkIHByb3h5IHR5cGVzLlxuICovXG5leHBvcnRzLnByb3hpZXMgPSB7XG4gICAgaHR0cDogW2h0dHBfcHJveHlfYWdlbnRfMS5IdHRwUHJveHlBZ2VudCwgaHR0cHNfcHJveHlfYWdlbnRfMS5IdHRwc1Byb3h5QWdlbnRdLFxuICAgIGh0dHBzOiBbaHR0cF9wcm94eV9hZ2VudF8xLkh0dHBQcm94eUFnZW50LCBodHRwc19wcm94eV9hZ2VudF8xLkh0dHBzUHJveHlBZ2VudF0sXG4gICAgc29ja3M6IFtzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudCwgc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnRdLFxuICAgIHNvY2tzNDogW3NvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50LCBzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudF0sXG4gICAgc29ja3M0YTogW3NvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50LCBzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudF0sXG4gICAgc29ja3M1OiBbc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnQsIHNvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50XSxcbiAgICBzb2NrczVoOiBbc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnQsIHNvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50XSxcbiAgICAncGFjK2RhdGEnOiBbcGFjX3Byb3h5X2FnZW50XzEuUGFjUHJveHlBZ2VudCwgcGFjX3Byb3h5X2FnZW50XzEuUGFjUHJveHlBZ2VudF0sXG4gICAgJ3BhYytmaWxlJzogW3BhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnQsIHBhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnRdLFxuICAgICdwYWMrZnRwJzogW3BhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnQsIHBhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnRdLFxuICAgICdwYWMraHR0cCc6IFtwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50LCBwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50XSxcbiAgICAncGFjK2h0dHBzJzogW3BhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnQsIHBhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnRdLFxufTtcbmZ1bmN0aW9uIGlzVmFsaWRQcm90b2NvbCh2KSB7XG4gICAgcmV0dXJuIFBST1RPQ09MUy5pbmNsdWRlcyh2KTtcbn1cbi8qKlxuICogVXNlcyB0aGUgYXBwcm9wcmlhdGUgYEFnZW50YCBzdWJjbGFzcyBiYXNlZCBvZmYgb2YgdGhlIFwicHJveHlcIlxuICogZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgYXJlIGN1cnJlbnRseSBzZXQuXG4gKlxuICogQW4gTFJVIGNhY2hlIGlzIHVzZWQsIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgY3JlYXRpb24gb2YgcHJveHlcbiAqIGBodHRwLkFnZW50YCBpbnN0YW5jZXMuXG4gKi9cbmNsYXNzIFByb3h5QWdlbnQgZXh0ZW5kcyBhZ2VudF9iYXNlXzEuQWdlbnQge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWNoZSBmb3IgYEFnZW50YCBpbnN0YW5jZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNhY2hlID0gbmV3IGxydV9jYWNoZV8xLmRlZmF1bHQoeyBtYXg6IDIwIH0pO1xuICAgICAgICBkZWJ1ZygnQ3JlYXRpbmcgbmV3IFByb3h5QWdlbnQgaW5zdGFuY2U6ICVvJywgb3B0cyk7XG4gICAgICAgIHRoaXMuY29ubmVjdE9wdHMgPSBvcHRzO1xuICAgICAgICB0aGlzLmh0dHBBZ2VudCA9IG9wdHM/Lmh0dHBBZ2VudCB8fCBuZXcgaHR0cC5BZ2VudChvcHRzKTtcbiAgICAgICAgdGhpcy5odHRwc0FnZW50ID1cbiAgICAgICAgICAgIG9wdHM/Lmh0dHBzQWdlbnQgfHwgbmV3IGh0dHBzLkFnZW50KG9wdHMpO1xuICAgICAgICB0aGlzLmdldFByb3h5Rm9yVXJsID0gb3B0cz8uZ2V0UHJveHlGb3JVcmwgfHwgcHJveHlfZnJvbV9lbnZfMS5nZXRQcm94eUZvclVybDtcbiAgICB9XG4gICAgYXN5bmMgY29ubmVjdChyZXEsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgeyBzZWN1cmVFbmRwb2ludCB9ID0gb3B0cztcbiAgICAgICAgY29uc3QgaXNXZWJTb2NrZXQgPSByZXEuZ2V0SGVhZGVyKCd1cGdyYWRlJykgPT09ICd3ZWJzb2NrZXQnO1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNlY3VyZUVuZHBvaW50XG4gICAgICAgICAgICA/IGlzV2ViU29ja2V0XG4gICAgICAgICAgICAgICAgPyAnd3NzOidcbiAgICAgICAgICAgICAgICA6ICdodHRwczonXG4gICAgICAgICAgICA6IGlzV2ViU29ja2V0XG4gICAgICAgICAgICAgICAgPyAnd3M6J1xuICAgICAgICAgICAgICAgIDogJ2h0dHA6JztcbiAgICAgICAgY29uc3QgaG9zdCA9IHJlcS5nZXRIZWFkZXIoJ2hvc3QnKTtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IHVybF8xLlVSTChyZXEucGF0aCwgYCR7cHJvdG9jb2x9Ly8ke2hvc3R9YCkuaHJlZjtcbiAgICAgICAgY29uc3QgcHJveHkgPSBhd2FpdCB0aGlzLmdldFByb3h5Rm9yVXJsKHVybCk7XG4gICAgICAgIGlmICghcHJveHkpIHtcbiAgICAgICAgICAgIGRlYnVnKCdQcm94eSBub3QgZW5hYmxlZCBmb3IgVVJMOiAlbycsIHVybCk7XG4gICAgICAgICAgICByZXR1cm4gc2VjdXJlRW5kcG9pbnQgPyB0aGlzLmh0dHBzQWdlbnQgOiB0aGlzLmh0dHBBZ2VudDtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1ZygnUmVxdWVzdCBVUkw6ICVvJywgdXJsKTtcbiAgICAgICAgZGVidWcoJ1Byb3h5IFVSTDogJW8nLCBwcm94eSk7XG4gICAgICAgIC8vIGF0dGVtcHQgdG8gZ2V0IGEgY2FjaGVkIGBodHRwLkFnZW50YCBpbnN0YW5jZSBmaXJzdFxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke3Byb3RvY29sfSske3Byb3h5fWA7XG4gICAgICAgIGxldCBhZ2VudCA9IHRoaXMuY2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAgICAgY29uc3QgcHJveHlVcmwgPSBuZXcgdXJsXzEuVVJMKHByb3h5KTtcbiAgICAgICAgICAgIGNvbnN0IHByb3h5UHJvdG8gPSBwcm94eVVybC5wcm90b2NvbC5yZXBsYWNlKCc6JywgJycpO1xuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkUHJvdG9jb2wocHJveHlQcm90bykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHByb3RvY29sIGZvciBwcm94eSBVUkw6ICR7cHJveHl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjdG9yID0gZXhwb3J0cy5wcm94aWVzW3Byb3h5UHJvdG9dW3NlY3VyZUVuZHBvaW50IHx8IGlzV2ViU29ja2V0ID8gMSA6IDBdO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtZWjigKZcbiAgICAgICAgICAgIGFnZW50ID0gbmV3IGN0b3IocHJveHksIHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICAgICAgdGhpcy5jYWNoZS5zZXQoY2FjaGVLZXksIGFnZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnKCdDYWNoZSBoaXQgZm9yIHByb3h5IFVSTDogJW8nLCBwcm94eSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFnZW50O1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IGFnZW50IG9mIHRoaXMuY2FjaGUudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIGFnZW50LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxufVxuZXhwb3J0cy5Qcm94eUFnZW50ID0gUHJveHlBZ2VudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxudmFyIHBhcnNlVXJsID0gcmVxdWlyZSgndXJsJykucGFyc2U7XG5cbnZhciBERUZBVUxUX1BPUlRTID0ge1xuICBmdHA6IDIxLFxuICBnb3BoZXI6IDcwLFxuICBodHRwOiA4MCxcbiAgaHR0cHM6IDQ0MyxcbiAgd3M6IDgwLFxuICB3c3M6IDQ0Myxcbn07XG5cbnZhciBzdHJpbmdFbmRzV2l0aCA9IFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGggfHwgZnVuY3Rpb24ocykge1xuICByZXR1cm4gcy5sZW5ndGggPD0gdGhpcy5sZW5ndGggJiZcbiAgICB0aGlzLmluZGV4T2YocywgdGhpcy5sZW5ndGggLSBzLmxlbmd0aCkgIT09IC0xO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHVybCAtIFRoZSBVUkwsIG9yIHRoZSByZXN1bHQgZnJvbSB1cmwucGFyc2UuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBVUkwgb2YgdGhlIHByb3h5IHRoYXQgc2hvdWxkIGhhbmRsZSB0aGUgcmVxdWVzdCB0byB0aGVcbiAqICBnaXZlbiBVUkwuIElmIG5vIHByb3h5IGlzIHNldCwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJveHlGb3JVcmwodXJsKSB7XG4gIHZhciBwYXJzZWRVcmwgPSB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyA/IHBhcnNlVXJsKHVybCkgOiB1cmwgfHwge307XG4gIHZhciBwcm90byA9IHBhcnNlZFVybC5wcm90b2NvbDtcbiAgdmFyIGhvc3RuYW1lID0gcGFyc2VkVXJsLmhvc3Q7XG4gIHZhciBwb3J0ID0gcGFyc2VkVXJsLnBvcnQ7XG4gIGlmICh0eXBlb2YgaG9zdG5hbWUgIT09ICdzdHJpbmcnIHx8ICFob3N0bmFtZSB8fCB0eXBlb2YgcHJvdG8gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuICcnOyAgLy8gRG9uJ3QgcHJveHkgVVJMcyB3aXRob3V0IGEgdmFsaWQgc2NoZW1lIG9yIGhvc3QuXG4gIH1cblxuICBwcm90byA9IHByb3RvLnNwbGl0KCc6JywgMSlbMF07XG4gIC8vIFN0cmlwcGluZyBwb3J0cyBpbiB0aGlzIHdheSBpbnN0ZWFkIG9mIHVzaW5nIHBhcnNlZFVybC5ob3N0bmFtZSB0byBtYWtlXG4gIC8vIHN1cmUgdGhhdCB0aGUgYnJhY2tldHMgYXJvdW5kIElQdjYgYWRkcmVzc2VzIGFyZSBrZXB0LlxuICBob3N0bmFtZSA9IGhvc3RuYW1lLnJlcGxhY2UoLzpcXGQqJC8sICcnKTtcbiAgcG9ydCA9IHBhcnNlSW50KHBvcnQpIHx8IERFRkFVTFRfUE9SVFNbcHJvdG9dIHx8IDA7XG4gIGlmICghc2hvdWxkUHJveHkoaG9zdG5hbWUsIHBvcnQpKSB7XG4gICAgcmV0dXJuICcnOyAgLy8gRG9uJ3QgcHJveHkgVVJMcyB0aGF0IG1hdGNoIE5PX1BST1hZLlxuICB9XG5cbiAgdmFyIHByb3h5ID1cbiAgICBnZXRFbnYoJ25wbV9jb25maWdfJyArIHByb3RvICsgJ19wcm94eScpIHx8XG4gICAgZ2V0RW52KHByb3RvICsgJ19wcm94eScpIHx8XG4gICAgZ2V0RW52KCducG1fY29uZmlnX3Byb3h5JykgfHxcbiAgICBnZXRFbnYoJ2FsbF9wcm94eScpO1xuICBpZiAocHJveHkgJiYgcHJveHkuaW5kZXhPZignOi8vJykgPT09IC0xKSB7XG4gICAgLy8gTWlzc2luZyBzY2hlbWUgaW4gcHJveHksIGRlZmF1bHQgdG8gdGhlIHJlcXVlc3RlZCBVUkwncyBzY2hlbWUuXG4gICAgcHJveHkgPSBwcm90byArICc6Ly8nICsgcHJveHk7XG4gIH1cbiAgcmV0dXJuIHByb3h5O1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIGdpdmVuIFVSTCBzaG91bGQgYmUgcHJveGllZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaG9zdG5hbWUgLSBUaGUgaG9zdCBuYW1lIG9mIHRoZSBVUkwuXG4gKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFRoZSBlZmZlY3RpdmUgcG9ydCBvZiB0aGUgVVJMLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGdpdmVuIFVSTCBzaG91bGQgYmUgcHJveGllZC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFByb3h5KGhvc3RuYW1lLCBwb3J0KSB7XG4gIHZhciBOT19QUk9YWSA9XG4gICAgKGdldEVudignbnBtX2NvbmZpZ19ub19wcm94eScpIHx8IGdldEVudignbm9fcHJveHknKSkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCFOT19QUk9YWSkge1xuICAgIHJldHVybiB0cnVlOyAgLy8gQWx3YXlzIHByb3h5IGlmIE5PX1BST1hZIGlzIG5vdCBzZXQuXG4gIH1cbiAgaWYgKE5PX1BST1hZID09PSAnKicpIHtcbiAgICByZXR1cm4gZmFsc2U7ICAvLyBOZXZlciBwcm94eSBpZiB3aWxkY2FyZCBpcyBzZXQuXG4gIH1cblxuICByZXR1cm4gTk9fUFJPWFkuc3BsaXQoL1ssXFxzXS8pLmV2ZXJ5KGZ1bmN0aW9uKHByb3h5KSB7XG4gICAgaWYgKCFwcm94eSkge1xuICAgICAgcmV0dXJuIHRydWU7ICAvLyBTa2lwIHplcm8tbGVuZ3RoIGhvc3RzLlxuICAgIH1cbiAgICB2YXIgcGFyc2VkUHJveHkgPSBwcm94eS5tYXRjaCgvXiguKyk6KFxcZCspJC8pO1xuICAgIHZhciBwYXJzZWRQcm94eUhvc3RuYW1lID0gcGFyc2VkUHJveHkgPyBwYXJzZWRQcm94eVsxXSA6IHByb3h5O1xuICAgIHZhciBwYXJzZWRQcm94eVBvcnQgPSBwYXJzZWRQcm94eSA/IHBhcnNlSW50KHBhcnNlZFByb3h5WzJdKSA6IDA7XG4gICAgaWYgKHBhcnNlZFByb3h5UG9ydCAmJiBwYXJzZWRQcm94eVBvcnQgIT09IHBvcnQpIHtcbiAgICAgIHJldHVybiB0cnVlOyAgLy8gU2tpcCBpZiBwb3J0cyBkb24ndCBtYXRjaC5cbiAgICB9XG5cbiAgICBpZiAoIS9eWy4qXS8udGVzdChwYXJzZWRQcm94eUhvc3RuYW1lKSkge1xuICAgICAgLy8gTm8gd2lsZGNhcmRzLCBzbyBzdG9wIHByb3h5aW5nIGlmIHRoZXJlIGlzIGFuIGV4YWN0IG1hdGNoLlxuICAgICAgcmV0dXJuIGhvc3RuYW1lICE9PSBwYXJzZWRQcm94eUhvc3RuYW1lO1xuICAgIH1cblxuICAgIGlmIChwYXJzZWRQcm94eUhvc3RuYW1lLmNoYXJBdCgwKSA9PT0gJyonKSB7XG4gICAgICAvLyBSZW1vdmUgbGVhZGluZyB3aWxkY2FyZC5cbiAgICAgIHBhcnNlZFByb3h5SG9zdG5hbWUgPSBwYXJzZWRQcm94eUhvc3RuYW1lLnNsaWNlKDEpO1xuICAgIH1cbiAgICAvLyBTdG9wIHByb3h5aW5nIGlmIHRoZSBob3N0bmFtZSBlbmRzIHdpdGggdGhlIG5vX3Byb3h5IGhvc3QuXG4gICAgcmV0dXJuICFzdHJpbmdFbmRzV2l0aC5jYWxsKGhvc3RuYW1lLCBwYXJzZWRQcm94eUhvc3RuYW1lKTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBmb3IgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldEVudihrZXkpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52W2tleS50b0xvd2VyQ2FzZSgpXSB8fCBwcm9jZXNzLmVudltrZXkudG9VcHBlckNhc2UoKV0gfHwgJyc7XG59XG5cbmV4cG9ydHMuZ2V0UHJveHlGb3JVcmwgPSBnZXRQcm94eUZvclVybDtcbiIsInZhciBvbmNlID0gcmVxdWlyZSgnb25jZScpXG52YXIgZW9zID0gcmVxdWlyZSgnZW5kLW9mLXN0cmVhbScpXG52YXIgZnMgPSByZXF1aXJlKCdmcycpIC8vIHdlIG9ubHkgbmVlZCBmcyB0byBnZXQgdGhlIFJlYWRTdHJlYW0gYW5kIFdyaXRlU3RyZWFtIHByb3RvdHlwZXNcblxudmFyIG5vb3AgPSBmdW5jdGlvbiAoKSB7fVxudmFyIGFuY2llbnQgPSAvXnY/XFwuMC8udGVzdChwcm9jZXNzLnZlcnNpb24pXG5cbnZhciBpc0ZuID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbidcbn1cblxudmFyIGlzRlMgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIGlmICghYW5jaWVudCkgcmV0dXJuIGZhbHNlIC8vIG5ld2VyIG5vZGUgdmVyc2lvbiBkbyBub3QgbmVlZCB0byBjYXJlIGFib3V0IGZzIGlzIGEgc3BlY2lhbCB3YXlcbiAgaWYgKCFmcykgcmV0dXJuIGZhbHNlIC8vIGJyb3dzZXJcbiAgcmV0dXJuIChzdHJlYW0gaW5zdGFuY2VvZiAoZnMuUmVhZFN0cmVhbSB8fCBub29wKSB8fCBzdHJlYW0gaW5zdGFuY2VvZiAoZnMuV3JpdGVTdHJlYW0gfHwgbm9vcCkpICYmIGlzRm4oc3RyZWFtLmNsb3NlKVxufVxuXG52YXIgaXNSZXF1ZXN0ID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICByZXR1cm4gc3RyZWFtLnNldEhlYWRlciAmJiBpc0ZuKHN0cmVhbS5hYm9ydClcbn1cblxudmFyIGRlc3Ryb3llciA9IGZ1bmN0aW9uIChzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcsIGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrID0gb25jZShjYWxsYmFjaylcblxuICB2YXIgY2xvc2VkID0gZmFsc2VcbiAgc3RyZWFtLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjbG9zZWQgPSB0cnVlXG4gIH0pXG5cbiAgZW9zKHN0cmVhbSwge3JlYWRhYmxlOiByZWFkaW5nLCB3cml0YWJsZTogd3JpdGluZ30sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKVxuICAgIGNsb3NlZCA9IHRydWVcbiAgICBjYWxsYmFjaygpXG4gIH0pXG5cbiAgdmFyIGRlc3Ryb3llZCA9IGZhbHNlXG4gIHJldHVybiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGNsb3NlZCkgcmV0dXJuXG4gICAgaWYgKGRlc3Ryb3llZCkgcmV0dXJuXG4gICAgZGVzdHJveWVkID0gdHJ1ZVxuXG4gICAgaWYgKGlzRlMoc3RyZWFtKSkgcmV0dXJuIHN0cmVhbS5jbG9zZShub29wKSAvLyB1c2UgY2xvc2UgZm9yIGZzIHN0cmVhbXMgdG8gYXZvaWQgZmQgbGVha3NcbiAgICBpZiAoaXNSZXF1ZXN0KHN0cmVhbSkpIHJldHVybiBzdHJlYW0uYWJvcnQoKSAvLyByZXF1ZXN0LmRlc3Ryb3kganVzdCBkbyAuZW5kIC0gLmFib3J0IGlzIHdoYXQgd2Ugd2FudFxuXG4gICAgaWYgKGlzRm4oc3RyZWFtLmRlc3Ryb3kpKSByZXR1cm4gc3RyZWFtLmRlc3Ryb3koKVxuXG4gICAgY2FsbGJhY2soZXJyIHx8IG5ldyBFcnJvcignc3RyZWFtIHdhcyBkZXN0cm95ZWQnKSlcbiAgfVxufVxuXG52YXIgY2FsbCA9IGZ1bmN0aW9uIChmbikge1xuICBmbigpXG59XG5cbnZhciBwaXBlID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gIHJldHVybiBmcm9tLnBpcGUodG8pXG59XG5cbnZhciBwdW1wID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RyZWFtcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgdmFyIGNhbGxiYWNrID0gaXNGbihzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV0gfHwgbm9vcCkgJiYgc3RyZWFtcy5wb3AoKSB8fCBub29wXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RyZWFtc1swXSkpIHN0cmVhbXMgPSBzdHJlYW1zWzBdXG4gIGlmIChzdHJlYW1zLmxlbmd0aCA8IDIpIHRocm93IG5ldyBFcnJvcigncHVtcCByZXF1aXJlcyB0d28gc3RyZWFtcyBwZXIgbWluaW11bScpXG5cbiAgdmFyIGVycm9yXG4gIHZhciBkZXN0cm95cyA9IHN0cmVhbXMubWFwKGZ1bmN0aW9uIChzdHJlYW0sIGkpIHtcbiAgICB2YXIgcmVhZGluZyA9IGkgPCBzdHJlYW1zLmxlbmd0aCAtIDFcbiAgICB2YXIgd3JpdGluZyA9IGkgPiAwXG4gICAgcmV0dXJuIGRlc3Ryb3llcihzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmICghZXJyb3IpIGVycm9yID0gZXJyXG4gICAgICBpZiAoZXJyKSBkZXN0cm95cy5mb3JFYWNoKGNhbGwpXG4gICAgICBpZiAocmVhZGluZykgcmV0dXJuXG4gICAgICBkZXN0cm95cy5mb3JFYWNoKGNhbGwpXG4gICAgICBjYWxsYmFjayhlcnJvcilcbiAgICB9KVxuICB9KVxuXG4gIHJldHVybiBzdHJlYW1zLnJlZHVjZShwaXBlKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHB1bXBcbiIsIm1vZHVsZS5leHBvcnRzID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcHJvY2Vzcy5uZXh0VGljayA9PT0gJ2Z1bmN0aW9uJylcbiAgPyBwcm9jZXNzLm5leHRUaWNrLmJpbmQocHJvY2VzcylcbiAgOiByZXF1aXJlKCcuL3F1ZXVlLW1pY3JvdGFzaycpXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayA9PT0gJ2Z1bmN0aW9uJyA/IHF1ZXVlTWljcm90YXNrIDogKGZuKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZuKVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZnMgPSByZXF1aXJlKCdmcycpLFxuICBqb2luID0gcmVxdWlyZSgncGF0aCcpLmpvaW4sXG4gIHJlc29sdmUgPSByZXF1aXJlKCdwYXRoJykucmVzb2x2ZSxcbiAgZGlybmFtZSA9IHJlcXVpcmUoJ3BhdGgnKS5kaXJuYW1lLFxuICBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBleHRlbnNpb25zOiBbJ2pzJywgJ2pzb24nLCAnY29mZmVlJ10sXG4gICAgcmVjdXJzZTogdHJ1ZSxcbiAgICByZW5hbWU6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIHZpc2l0OiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cbiAgfTtcblxuZnVuY3Rpb24gY2hlY2tGaWxlSW5jbHVzaW9uKHBhdGgsIGZpbGVuYW1lLCBvcHRpb25zKSB7XG4gIHJldHVybiAoXG4gICAgLy8gdmVyaWZ5IGZpbGUgaGFzIHZhbGlkIGV4dGVuc2lvblxuICAgIChuZXcgUmVnRXhwKCdcXFxcLignICsgb3B0aW9ucy5leHRlbnNpb25zLmpvaW4oJ3wnKSArICcpJCcsICdpJykudGVzdChmaWxlbmFtZSkpICYmXG5cbiAgICAvLyBpZiBvcHRpb25zLmluY2x1ZGUgaXMgYSBSZWdFeHAsIGV2YWx1YXRlIGl0IGFuZCBtYWtlIHN1cmUgdGhlIHBhdGggcGFzc2VzXG4gICAgIShvcHRpb25zLmluY2x1ZGUgJiYgb3B0aW9ucy5pbmNsdWRlIGluc3RhbmNlb2YgUmVnRXhwICYmICFvcHRpb25zLmluY2x1ZGUudGVzdChwYXRoKSkgJiZcblxuICAgIC8vIGlmIG9wdGlvbnMuaW5jbHVkZSBpcyBhIGZ1bmN0aW9uLCBldmFsdWF0ZSBpdCBhbmQgbWFrZSBzdXJlIHRoZSBwYXRoIHBhc3Nlc1xuICAgICEob3B0aW9ucy5pbmNsdWRlICYmIHR5cGVvZiBvcHRpb25zLmluY2x1ZGUgPT09ICdmdW5jdGlvbicgJiYgIW9wdGlvbnMuaW5jbHVkZShwYXRoLCBmaWxlbmFtZSkpICYmXG5cbiAgICAvLyBpZiBvcHRpb25zLmV4Y2x1ZGUgaXMgYSBSZWdFeHAsIGV2YWx1YXRlIGl0IGFuZCBtYWtlIHN1cmUgdGhlIHBhdGggZG9lc24ndCBwYXNzXG4gICAgIShvcHRpb25zLmV4Y2x1ZGUgJiYgb3B0aW9ucy5leGNsdWRlIGluc3RhbmNlb2YgUmVnRXhwICYmIG9wdGlvbnMuZXhjbHVkZS50ZXN0KHBhdGgpKSAmJlxuXG4gICAgLy8gaWYgb3B0aW9ucy5leGNsdWRlIGlzIGEgZnVuY3Rpb24sIGV2YWx1YXRlIGl0IGFuZCBtYWtlIHN1cmUgdGhlIHBhdGggZG9lc24ndCBwYXNzXG4gICAgIShvcHRpb25zLmV4Y2x1ZGUgJiYgdHlwZW9mIG9wdGlvbnMuZXhjbHVkZSA9PT0gJ2Z1bmN0aW9uJyAmJiBvcHRpb25zLmV4Y2x1ZGUocGF0aCwgZmlsZW5hbWUpKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXF1aXJlRGlyZWN0b3J5KG0sIHBhdGgsIG9wdGlvbnMpIHtcbiAgdmFyIHJldHZhbCA9IHt9O1xuXG4gIC8vIHBhdGggaXMgb3B0aW9uYWxcbiAgaWYgKHBhdGggJiYgIW9wdGlvbnMgJiYgdHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucyA9IHBhdGg7XG4gICAgcGF0aCA9IG51bGw7XG4gIH1cblxuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGZvciAodmFyIHByb3AgaW4gZGVmYXVsdE9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnNbcHJvcF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvcHRpb25zW3Byb3BdID0gZGVmYXVsdE9wdGlvbnNbcHJvcF07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgbm8gcGF0aCB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhlIGVxdWl2ZWxhbnQgb2YgX19kaXJuYW1lIGZyb20gY2FsbGVyXG4gIC8vIG90aGVyd2lzZSwgcmVzb2x2ZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBlcXVpdmFsZW50IG9mIF9fZGlybmFtZVxuICBwYXRoID0gIXBhdGggPyBkaXJuYW1lKG0uZmlsZW5hbWUpIDogcmVzb2x2ZShkaXJuYW1lKG0uZmlsZW5hbWUpLCBwYXRoKTtcblxuICAvLyBnZXQgdGhlIHBhdGggb2YgZWFjaCBmaWxlIGluIHNwZWNpZmllZCBkaXJlY3RvcnksIGFwcGVuZCB0byBjdXJyZW50IHRyZWUgbm9kZSwgcmVjdXJzZVxuICBmcy5yZWFkZGlyU3luYyhwYXRoKS5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlbmFtZSkge1xuICAgIHZhciBqb2luZWQgPSBqb2luKHBhdGgsIGZpbGVuYW1lKSxcbiAgICAgIGZpbGVzLFxuICAgICAga2V5LFxuICAgICAgb2JqO1xuXG4gICAgaWYgKGZzLnN0YXRTeW5jKGpvaW5lZCkuaXNEaXJlY3RvcnkoKSAmJiBvcHRpb25zLnJlY3Vyc2UpIHtcbiAgICAgIC8vIHRoaXMgbm9kZSBpcyBhIGRpcmVjdG9yeTsgcmVjdXJzZVxuICAgICAgZmlsZXMgPSByZXF1aXJlRGlyZWN0b3J5KG0sIGpvaW5lZCwgb3B0aW9ucyk7XG4gICAgICAvLyBleGNsdWRlIGVtcHR5IGRpcmVjdG9yaWVzXG4gICAgICBpZiAoT2JqZWN0LmtleXMoZmlsZXMpLmxlbmd0aCkge1xuICAgICAgICByZXR2YWxbb3B0aW9ucy5yZW5hbWUoZmlsZW5hbWUsIGpvaW5lZCwgZmlsZW5hbWUpXSA9IGZpbGVzO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoam9pbmVkICE9PSBtLmZpbGVuYW1lICYmIGNoZWNrRmlsZUluY2x1c2lvbihqb2luZWQsIGZpbGVuYW1lLCBvcHRpb25zKSkge1xuICAgICAgICAvLyBoYXNoIG5vZGUga2V5IHNob3VsZG4ndCBpbmNsdWRlIGZpbGUgZXh0ZW5zaW9uXG4gICAgICAgIGtleSA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgICAgb2JqID0gbS5yZXF1aXJlKGpvaW5lZCk7XG4gICAgICAgIHJldHZhbFtvcHRpb25zLnJlbmFtZShrZXksIGpvaW5lZCwgZmlsZW5hbWUpXSA9IG9wdGlvbnMudmlzaXQob2JqLCBqb2luZWQsIGZpbGVuYW1lKSB8fCBvYmo7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmV0dmFsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmVEaXJlY3Rvcnk7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0cyA9IGRlZmF1bHRPcHRpb25zO1xuIiwiY29uc3QgQU5ZID0gU3ltYm9sKCdTZW1WZXIgQU5ZJylcbi8vIGhvaXN0ZWQgY2xhc3MgZm9yIGN5Y2xpYyBkZXBlbmRlbmN5XG5jbGFzcyBDb21wYXJhdG9yIHtcbiAgc3RhdGljIGdldCBBTlkgKCkge1xuICAgIHJldHVybiBBTllcbiAgfVxuXG4gIGNvbnN0cnVjdG9yIChjb21wLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgICBpZiAoY29tcC5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlKSB7XG4gICAgICAgIHJldHVybiBjb21wXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wID0gY29tcC52YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXAgPSBjb21wLnRyaW0oKS5zcGxpdCgvXFxzKy8pLmpvaW4oJyAnKVxuICAgIGRlYnVnKCdjb21wYXJhdG9yJywgY29tcCwgb3B0aW9ucylcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIHRoaXMucGFyc2UoY29tcClcblxuICAgIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICB0aGlzLnZhbHVlID0gJydcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMub3BlcmF0b3IgKyB0aGlzLnNlbXZlci52ZXJzaW9uXG4gICAgfVxuXG4gICAgZGVidWcoJ2NvbXAnLCB0aGlzKVxuICB9XG5cbiAgcGFyc2UgKGNvbXApIHtcbiAgICBjb25zdCByID0gdGhpcy5vcHRpb25zLmxvb3NlID8gcmVbdC5DT01QQVJBVE9STE9PU0VdIDogcmVbdC5DT01QQVJBVE9SXVxuICAgIGNvbnN0IG0gPSBjb21wLm1hdGNoKHIpXG5cbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgY29tcGFyYXRvcjogJHtjb21wfWApXG4gICAgfVxuXG4gICAgdGhpcy5vcGVyYXRvciA9IG1bMV0gIT09IHVuZGVmaW5lZCA/IG1bMV0gOiAnJ1xuICAgIGlmICh0aGlzLm9wZXJhdG9yID09PSAnPScpIHtcbiAgICAgIHRoaXMub3BlcmF0b3IgPSAnJ1xuICAgIH1cblxuICAgIC8vIGlmIGl0IGxpdGVyYWxseSBpcyBqdXN0ICc+JyBvciAnJyB0aGVuIGFsbG93IGFueXRoaW5nLlxuICAgIGlmICghbVsyXSkge1xuICAgICAgdGhpcy5zZW12ZXIgPSBBTllcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW12ZXIgPSBuZXcgU2VtVmVyKG1bMl0sIHRoaXMub3B0aW9ucy5sb29zZSlcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVcbiAgfVxuXG4gIHRlc3QgKHZlcnNpb24pIHtcbiAgICBkZWJ1ZygnQ29tcGFyYXRvci50ZXN0JywgdmVyc2lvbiwgdGhpcy5vcHRpb25zLmxvb3NlKVxuXG4gICAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkgfHwgdmVyc2lvbiA9PT0gQU5ZKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIHRoaXMub3B0aW9ucylcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbXAodmVyc2lvbiwgdGhpcy5vcGVyYXRvciwgdGhpcy5zZW12ZXIsIHRoaXMub3B0aW9ucylcbiAgfVxuXG4gIGludGVyc2VjdHMgKGNvbXAsIG9wdGlvbnMpIHtcbiAgICBpZiAoIShjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgQ29tcGFyYXRvciBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmFuZ2UoY29tcC52YWx1ZSwgb3B0aW9ucykudGVzdCh0aGlzLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAoY29tcC5vcGVyYXRvciA9PT0gJycpIHtcbiAgICAgIGlmIChjb21wLnZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnZhbHVlLCBvcHRpb25zKS50ZXN0KGNvbXAuc2VtdmVyKVxuICAgIH1cblxuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIFNwZWNpYWwgY2FzZXMgd2hlcmUgbm90aGluZyBjYW4gcG9zc2libHkgYmUgbG93ZXJcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgICAgKHRoaXMudmFsdWUgPT09ICc8MC4wLjAtMCcgfHwgY29tcC52YWx1ZSA9PT0gJzwwLjAuMC0wJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICAgICh0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoJzwwLjAuMCcpIHx8IGNvbXAudmFsdWUuc3RhcnRzV2l0aCgnPDAuMC4wJykpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBTYW1lIGRpcmVjdGlvbiBpbmNyZWFzaW5nICg+IG9yID49KVxuICAgIGlmICh0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gU2FtZSBkaXJlY3Rpb24gZGVjcmVhc2luZyAoPCBvciA8PSlcbiAgICBpZiAodGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIHNhbWUgU2VtVmVyIGFuZCBib3RoIHNpZGVzIGFyZSBpbmNsdXNpdmUgKDw9IG9yID49KVxuICAgIGlmIChcbiAgICAgICh0aGlzLnNlbXZlci52ZXJzaW9uID09PSBjb21wLnNlbXZlci52ZXJzaW9uKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5pbmNsdWRlcygnPScpICYmIGNvbXAub3BlcmF0b3IuaW5jbHVkZXMoJz0nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gb3Bwb3NpdGUgZGlyZWN0aW9ucyBsZXNzIHRoYW5cbiAgICBpZiAoY21wKHRoaXMuc2VtdmVyLCAnPCcsIGNvbXAuc2VtdmVyLCBvcHRpb25zKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIG9wcG9zaXRlIGRpcmVjdGlvbnMgZ3JlYXRlciB0aGFuXG4gICAgaWYgKGNtcCh0aGlzLnNlbXZlciwgJz4nLCBjb21wLnNlbXZlciwgb3B0aW9ucykgJiZcbiAgICAgIHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBhcmF0b3JcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jbXAnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2UnKVxuIiwiLy8gaG9pc3RlZCBjbGFzcyBmb3IgY3ljbGljIGRlcGVuZGVuY3lcbmNsYXNzIFJhbmdlIHtcbiAgY29uc3RydWN0b3IgKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcmFuZ2UubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSAmJlxuICAgICAgICByYW5nZS5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLnJhdywgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgICAvLyBqdXN0IHB1dCBpdCBpbiB0aGUgc2V0IGFuZCByZXR1cm5cbiAgICAgIHRoaXMucmF3ID0gcmFuZ2UudmFsdWVcbiAgICAgIHRoaXMuc2V0ID0gW1tyYW5nZV1dXG4gICAgICB0aGlzLmZvcm1hdCgpXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgdGhpcy5pbmNsdWRlUHJlcmVsZWFzZSA9ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuXG4gICAgLy8gRmlyc3QgcmVkdWNlIGFsbCB3aGl0ZXNwYWNlIGFzIG11Y2ggYXMgcG9zc2libGUgc28gd2UgZG8gbm90IGhhdmUgdG8gcmVseVxuICAgIC8vIG9uIHBvdGVudGlhbGx5IHNsb3cgcmVnZXhlcyBsaWtlIFxccyouIFRoaXMgaXMgdGhlbiBzdG9yZWQgYW5kIHVzZWQgZm9yXG4gICAgLy8gZnV0dXJlIGVycm9yIG1lc3NhZ2VzIGFzIHdlbGwuXG4gICAgdGhpcy5yYXcgPSByYW5nZVxuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC5qb2luKCcgJylcblxuICAgIC8vIEZpcnN0LCBzcGxpdCBvbiB8fFxuICAgIHRoaXMuc2V0ID0gdGhpcy5yYXdcbiAgICAgIC5zcGxpdCgnfHwnKVxuICAgICAgLy8gbWFwIHRoZSByYW5nZSB0byBhIDJkIGFycmF5IG9mIGNvbXBhcmF0b3JzXG4gICAgICAubWFwKHIgPT4gdGhpcy5wYXJzZVJhbmdlKHIudHJpbSgpKSlcbiAgICAgIC8vIHRocm93IG91dCBhbnkgY29tcGFyYXRvciBsaXN0cyB0aGF0IGFyZSBlbXB0eVxuICAgICAgLy8gdGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCBpdCB3YXMgbm90IGEgdmFsaWQgcmFuZ2UsIHdoaWNoIGlzIGFsbG93ZWRcbiAgICAgIC8vIGluIGxvb3NlIG1vZGUsIGJ1dCB3aWxsIHN0aWxsIHRocm93IGlmIHRoZSBXSE9MRSByYW5nZSBpcyBpbnZhbGlkLlxuICAgICAgLmZpbHRlcihjID0+IGMubGVuZ3RoKVxuXG4gICAgaWYgKCF0aGlzLnNldC5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgU2VtVmVyIFJhbmdlOiAke3RoaXMucmF3fWApXG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGF2ZSBhbnkgdGhhdCBhcmUgbm90IHRoZSBudWxsIHNldCwgdGhyb3cgb3V0IG51bGwgc2V0cy5cbiAgICBpZiAodGhpcy5zZXQubGVuZ3RoID4gMSkge1xuICAgICAgLy8ga2VlcCB0aGUgZmlyc3Qgb25lLCBpbiBjYXNlIHRoZXkncmUgYWxsIG51bGwgc2V0c1xuICAgICAgY29uc3QgZmlyc3QgPSB0aGlzLnNldFswXVxuICAgICAgdGhpcy5zZXQgPSB0aGlzLnNldC5maWx0ZXIoYyA9PiAhaXNOdWxsU2V0KGNbMF0pKVxuICAgICAgaWYgKHRoaXMuc2V0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnNldCA9IFtmaXJzdF1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXQubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSB0aGF0IGFyZSAqLCB0aGVuIHRoZSByYW5nZSBpcyBqdXN0ICpcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuc2V0KSB7XG4gICAgICAgICAgaWYgKGMubGVuZ3RoID09PSAxICYmIGlzQW55KGNbMF0pKSB7XG4gICAgICAgICAgICB0aGlzLnNldCA9IFtjXVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZvcm1hdCgpXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHRoaXMucmFuZ2UgPSB0aGlzLnNldFxuICAgICAgLm1hcCgoY29tcHMpID0+IGNvbXBzLmpvaW4oJyAnKS50cmltKCkpXG4gICAgICAuam9pbignfHwnKVxuICAgICAgLnRyaW0oKVxuICAgIHJldHVybiB0aGlzLnJhbmdlXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VcbiAgfVxuXG4gIHBhcnNlUmFuZ2UgKHJhbmdlKSB7XG4gICAgLy8gbWVtb2l6ZSByYW5nZSBwYXJzaW5nIGZvciBwZXJmb3JtYW5jZS5cbiAgICAvLyB0aGlzIGlzIGEgdmVyeSBob3QgcGF0aCwgYW5kIGZ1bGx5IGRldGVybWluaXN0aWMuXG4gICAgY29uc3QgbWVtb09wdHMgPVxuICAgICAgKHRoaXMub3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRSkgfFxuICAgICAgKHRoaXMub3B0aW9ucy5sb29zZSAmJiBGTEFHX0xPT1NFKVxuICAgIGNvbnN0IG1lbW9LZXkgPSBtZW1vT3B0cyArICc6JyArIHJhbmdlXG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KG1lbW9LZXkpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFxuICAgIH1cblxuICAgIGNvbnN0IGxvb3NlID0gdGhpcy5vcHRpb25zLmxvb3NlXG4gICAgLy8gYDEuMi4zIC0gMS4yLjRgID0+IGA+PTEuMi4zIDw9MS4yLjRgXG4gICAgY29uc3QgaHIgPSBsb29zZSA/IHJlW3QuSFlQSEVOUkFOR0VMT09TRV0gOiByZVt0LkhZUEhFTlJBTkdFXVxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShociwgaHlwaGVuUmVwbGFjZSh0aGlzLm9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpKVxuICAgIGRlYnVnKCdoeXBoZW4gcmVwbGFjZScsIHJhbmdlKVxuXG4gICAgLy8gYD4gMS4yLjMgPCAxLjIuNWAgPT4gYD4xLjIuMyA8MS4yLjVgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ09NUEFSQVRPUlRSSU1dLCBjb21wYXJhdG9yVHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ2NvbXBhcmF0b3IgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYH4gMS4yLjNgID0+IGB+MS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuVElMREVUUklNXSwgdGlsZGVUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygndGlsZGUgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYF4gMS4yLjNgID0+IGBeMS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ0FSRVRUUklNXSwgY2FyZXRUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygnY2FyZXQgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJhbmdlIGlzIGNvbXBsZXRlbHkgdHJpbW1lZCBhbmRcbiAgICAvLyByZWFkeSB0byBiZSBzcGxpdCBpbnRvIGNvbXBhcmF0b3JzLlxuXG4gICAgbGV0IHJhbmdlTGlzdCA9IHJhbmdlXG4gICAgICAuc3BsaXQoJyAnKVxuICAgICAgLm1hcChjb21wID0+IHBhcnNlQ29tcGFyYXRvcihjb21wLCB0aGlzLm9wdGlvbnMpKVxuICAgICAgLmpvaW4oJyAnKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC8vID49MC4wLjAgaXMgZXF1aXZhbGVudCB0byAqXG4gICAgICAubWFwKGNvbXAgPT4gcmVwbGFjZUdURTAoY29tcCwgdGhpcy5vcHRpb25zKSlcblxuICAgIGlmIChsb29zZSkge1xuICAgICAgLy8gaW4gbG9vc2UgbW9kZSwgdGhyb3cgb3V0IGFueSB0aGF0IGFyZSBub3QgdmFsaWQgY29tcGFyYXRvcnNcbiAgICAgIHJhbmdlTGlzdCA9IHJhbmdlTGlzdC5maWx0ZXIoY29tcCA9PiB7XG4gICAgICAgIGRlYnVnKCdsb29zZSBpbnZhbGlkIGZpbHRlcicsIGNvbXAsIHRoaXMub3B0aW9ucylcbiAgICAgICAgcmV0dXJuICEhY29tcC5tYXRjaChyZVt0LkNPTVBBUkFUT1JMT09TRV0pXG4gICAgICB9KVxuICAgIH1cbiAgICBkZWJ1ZygncmFuZ2UgbGlzdCcsIHJhbmdlTGlzdClcblxuICAgIC8vIGlmIGFueSBjb21wYXJhdG9ycyBhcmUgdGhlIG51bGwgc2V0LCB0aGVuIHJlcGxhY2Ugd2l0aCBKVVNUIG51bGwgc2V0XG4gICAgLy8gaWYgbW9yZSB0aGFuIG9uZSBjb21wYXJhdG9yLCByZW1vdmUgYW55ICogY29tcGFyYXRvcnNcbiAgICAvLyBhbHNvLCBkb24ndCBpbmNsdWRlIHRoZSBzYW1lIGNvbXBhcmF0b3IgbW9yZSB0aGFuIG9uY2VcbiAgICBjb25zdCByYW5nZU1hcCA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gcmFuZ2VMaXN0Lm1hcChjb21wID0+IG5ldyBDb21wYXJhdG9yKGNvbXAsIHRoaXMub3B0aW9ucykpXG4gICAgZm9yIChjb25zdCBjb21wIG9mIGNvbXBhcmF0b3JzKSB7XG4gICAgICBpZiAoaXNOdWxsU2V0KGNvbXApKSB7XG4gICAgICAgIHJldHVybiBbY29tcF1cbiAgICAgIH1cbiAgICAgIHJhbmdlTWFwLnNldChjb21wLnZhbHVlLCBjb21wKVxuICAgIH1cbiAgICBpZiAocmFuZ2VNYXAuc2l6ZSA+IDEgJiYgcmFuZ2VNYXAuaGFzKCcnKSkge1xuICAgICAgcmFuZ2VNYXAuZGVsZXRlKCcnKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5yYW5nZU1hcC52YWx1ZXMoKV1cbiAgICBjYWNoZS5zZXQobWVtb0tleSwgcmVzdWx0KVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGludGVyc2VjdHMgKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgaWYgKCEocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgUmFuZ2UgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldC5zb21lKCh0aGlzQ29tcGFyYXRvcnMpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGlzU2F0aXNmaWFibGUodGhpc0NvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgICByYW5nZS5zZXQuc29tZSgocmFuZ2VDb21wYXJhdG9ycykgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc1NhdGlzZmlhYmxlKHJhbmdlQ29tcGFyYXRvcnMsIG9wdGlvbnMpICYmXG4gICAgICAgICAgICB0aGlzQ29tcGFyYXRvcnMuZXZlcnkoKHRoaXNDb21wYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByYW5nZUNvbXBhcmF0b3JzLmV2ZXJ5KChyYW5nZUNvbXBhcmF0b3IpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc0NvbXBhcmF0b3IuaW50ZXJzZWN0cyhyYW5nZUNvbXBhcmF0b3IsIG9wdGlvbnMpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KVxuICB9XG5cbiAgLy8gaWYgQU5ZIG9mIHRoZSBzZXRzIG1hdGNoIEFMTCBvZiBpdHMgY29tcGFyYXRvcnMsIHRoZW4gcGFzc1xuICB0ZXN0ICh2ZXJzaW9uKSB7XG4gICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGVzdFNldCh0aGlzLnNldFtpXSwgdmVyc2lvbiwgdGhpcy5vcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlXG5cbmNvbnN0IExSVSA9IHJlcXVpcmUoJ2xydS1jYWNoZScpXG5jb25zdCBjYWNoZSA9IG5ldyBMUlUoeyBtYXg6IDEwMDAgfSlcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi9jb21wYXJhdG9yJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZGVidWcnKVxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi9zZW12ZXInKVxuY29uc3Qge1xuICBzYWZlUmU6IHJlLFxuICB0LFxuICBjb21wYXJhdG9yVHJpbVJlcGxhY2UsXG4gIHRpbGRlVHJpbVJlcGxhY2UsXG4gIGNhcmV0VHJpbVJlcGxhY2UsXG59ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuY29uc3QgeyBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRSwgRkxBR19MT09TRSB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY29uc3RhbnRzJylcblxuY29uc3QgaXNOdWxsU2V0ID0gYyA9PiBjLnZhbHVlID09PSAnPDAuMC4wLTAnXG5jb25zdCBpc0FueSA9IGMgPT4gYy52YWx1ZSA9PT0gJydcblxuLy8gdGFrZSBhIHNldCBvZiBjb21wYXJhdG9ycyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmVcbi8vIGV4aXN0cyBhIHZlcnNpb24gd2hpY2ggY2FuIHNhdGlzZnkgaXRcbmNvbnN0IGlzU2F0aXNmaWFibGUgPSAoY29tcGFyYXRvcnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHJlc3VsdCA9IHRydWVcbiAgY29uc3QgcmVtYWluaW5nQ29tcGFyYXRvcnMgPSBjb21wYXJhdG9ycy5zbGljZSgpXG4gIGxldCB0ZXN0Q29tcGFyYXRvciA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLnBvcCgpXG5cbiAgd2hpbGUgKHJlc3VsdCAmJiByZW1haW5pbmdDb21wYXJhdG9ycy5sZW5ndGgpIHtcbiAgICByZXN1bHQgPSByZW1haW5pbmdDb21wYXJhdG9ycy5ldmVyeSgob3RoZXJDb21wYXJhdG9yKSA9PiB7XG4gICAgICByZXR1cm4gdGVzdENvbXBhcmF0b3IuaW50ZXJzZWN0cyhvdGhlckNvbXBhcmF0b3IsIG9wdGlvbnMpXG4gICAgfSlcblxuICAgIHRlc3RDb21wYXJhdG9yID0gcmVtYWluaW5nQ29tcGFyYXRvcnMucG9wKClcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLy8gY29tcHJpc2VkIG9mIHhyYW5nZXMsIHRpbGRlcywgc3RhcnMsIGFuZCBndGx0J3MgYXQgdGhpcyBwb2ludC5cbi8vIGFscmVhZHkgcmVwbGFjZWQgdGhlIGh5cGhlbiByYW5nZXNcbi8vIHR1cm4gaW50byBhIHNldCBvZiBKVVNUIGNvbXBhcmF0b3JzLlxuY29uc3QgcGFyc2VDb21wYXJhdG9yID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ2NvbXAnLCBjb21wLCBvcHRpb25zKVxuICBjb21wID0gcmVwbGFjZUNhcmV0cyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygnY2FyZXQnLCBjb21wKVxuICBjb21wID0gcmVwbGFjZVRpbGRlcyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygndGlsZGVzJywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VYUmFuZ2VzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCd4cmFuZ2UnLCBjb21wKVxuICBjb21wID0gcmVwbGFjZVN0YXJzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCdzdGFycycsIGNvbXApXG4gIHJldHVybiBjb21wXG59XG5cbmNvbnN0IGlzWCA9IGlkID0+ICFpZCB8fCBpZC50b0xvd2VyQ2FzZSgpID09PSAneCcgfHwgaWQgPT09ICcqJ1xuXG4vLyB+LCB+PiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIH4yLCB+Mi54LCB+Mi54LngsIH4+Miwgfj4yLnggfj4yLngueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gfjIuMCwgfjIuMC54LCB+PjIuMCwgfj4yLjAueCAtLT4gPj0yLjAuMCA8Mi4xLjAtMFxuLy8gfjEuMiwgfjEuMi54LCB+PjEuMiwgfj4xLjIueCAtLT4gPj0xLjIuMCA8MS4zLjAtMFxuLy8gfjEuMi4zLCB+PjEuMi4zIC0tPiA+PTEuMi4zIDwxLjMuMC0wXG4vLyB+MS4yLjAsIH4+MS4yLjAgLS0+ID49MS4yLjAgPDEuMy4wLTBcbi8vIH4wLjAuMSAtLT4gPj0wLjAuMSA8MC4xLjAtMFxuY29uc3QgcmVwbGFjZVRpbGRlcyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoYykgPT4gcmVwbGFjZVRpbGRlKGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZVRpbGRlID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgciA9IG9wdGlvbnMubG9vc2UgPyByZVt0LlRJTERFTE9PU0VdIDogcmVbdC5USUxERV1cbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCAoXywgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygndGlsZGUnLCBjb21wLCBfLCBNLCBtLCBwLCBwcilcbiAgICBsZXQgcmV0XG5cbiAgICBpZiAoaXNYKE0pKSB7XG4gICAgICByZXQgPSAnJ1xuICAgIH0gZWxzZSBpZiAoaXNYKG0pKSB7XG4gICAgICByZXQgPSBgPj0ke019LjAuMCA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoaXNYKHApKSB7XG4gICAgICAvLyB+MS4yID09ID49MS4yLjAgPDEuMy4wLTBcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wIDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfSBlbHNlIGlmIChwcikge1xuICAgICAgZGVidWcoJ3JlcGxhY2VUaWxkZSBwcicsIHByKVxuICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB+MS4yLjMgPT0gPj0xLjIuMyA8MS4zLjAtMFxuICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH1cblxuICAgIGRlYnVnKCd0aWxkZSByZXR1cm4nLCByZXQpXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG4vLyBeIC0tPiAqIChhbnksIGtpbmRhIHNpbGx5KVxuLy8gXjIsIF4yLngsIF4yLngueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gXjIuMCwgXjIuMC54IC0tPiA+PTIuMC4wIDwzLjAuMC0wXG4vLyBeMS4yLCBeMS4yLnggLS0+ID49MS4yLjAgPDIuMC4wLTBcbi8vIF4xLjIuMyAtLT4gPj0xLjIuMyA8Mi4wLjAtMFxuLy8gXjEuMi4wIC0tPiA+PTEuMi4wIDwyLjAuMC0wXG4vLyBeMC4wLjEgLS0+ID49MC4wLjEgPDAuMC4yLTBcbi8vIF4wLjEuMCAtLT4gPj0wLjEuMCA8MC4yLjAtMFxuY29uc3QgcmVwbGFjZUNhcmV0cyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoYykgPT4gcmVwbGFjZUNhcmV0KGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZUNhcmV0ID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ2NhcmV0JywgY29tcCwgb3B0aW9ucylcbiAgY29uc3QgciA9IG9wdGlvbnMubG9vc2UgPyByZVt0LkNBUkVUTE9PU0VdIDogcmVbdC5DQVJFVF1cbiAgY29uc3QgeiA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyAnLTAnIDogJydcbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCAoXywgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygnY2FyZXQnLCBjb21wLCBfLCBNLCBtLCBwLCBwcilcbiAgICBsZXQgcmV0XG5cbiAgICBpZiAoaXNYKE0pKSB7XG4gICAgICByZXQgPSAnJ1xuICAgIH0gZWxzZSBpZiAoaXNYKG0pKSB7XG4gICAgICByZXQgPSBgPj0ke019LjAuMCR7en0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7en0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHt6fSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlQ2FyZXQgcHInLCBwcilcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgaWYgKG0gPT09ICcwJykge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgICB9IDwke019LiR7bX0uJHsrcCArIDF9LTBgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgICB9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCdubyBwcicpXG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICAgICAgfSR7en0gPCR7TX0uJHttfS4keytwICsgMX0tMGBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICAgICAgfSR7en0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICB9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVidWcoJ2NhcmV0IHJldHVybicsIHJldClcbiAgICByZXR1cm4gcmV0XG4gIH0pXG59XG5cbmNvbnN0IHJlcGxhY2VYUmFuZ2VzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VYUmFuZ2VzJywgY29tcCwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXBcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VYUmFuZ2UoYywgb3B0aW9ucykpXG4gICAgLmpvaW4oJyAnKVxufVxuXG5jb25zdCByZXBsYWNlWFJhbmdlID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgY29tcCA9IGNvbXAudHJpbSgpXG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5YUkFOR0VMT09TRV0gOiByZVt0LlhSQU5HRV1cbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCAocmV0LCBndGx0LCBNLCBtLCBwLCBwcikgPT4ge1xuICAgIGRlYnVnKCd4UmFuZ2UnLCBjb21wLCByZXQsIGd0bHQsIE0sIG0sIHAsIHByKVxuICAgIGNvbnN0IHhNID0gaXNYKE0pXG4gICAgY29uc3QgeG0gPSB4TSB8fCBpc1gobSlcbiAgICBjb25zdCB4cCA9IHhtIHx8IGlzWChwKVxuICAgIGNvbnN0IGFueVggPSB4cFxuXG4gICAgaWYgKGd0bHQgPT09ICc9JyAmJiBhbnlYKSB7XG4gICAgICBndGx0ID0gJydcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSdyZSBpbmNsdWRpbmcgcHJlcmVsZWFzZXMgaW4gdGhlIG1hdGNoLCB0aGVuIHdlIG5lZWRcbiAgICAvLyB0byBmaXggdGhpcyB0byAtMCwgdGhlIGxvd2VzdCBwb3NzaWJsZSBwcmVyZWxlYXNlIHZhbHVlXG4gICAgcHIgPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gJy0wJyA6ICcnXG5cbiAgICBpZiAoeE0pIHtcbiAgICAgIGlmIChndGx0ID09PSAnPicgfHwgZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgaXMgYWxsb3dlZFxuICAgICAgICByZXQgPSAnPDAuMC4wLTAnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGZvcmJpZGRlblxuICAgICAgICByZXQgPSAnKidcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGd0bHQgJiYgYW55WCkge1xuICAgICAgLy8gd2Uga25vdyBwYXRjaCBpcyBhbiB4LCBiZWNhdXNlIHdlIGhhdmUgYW55IHggYXQgYWxsLlxuICAgICAgLy8gcmVwbGFjZSBYIHdpdGggMFxuICAgICAgaWYgKHhtKSB7XG4gICAgICAgIG0gPSAwXG4gICAgICB9XG4gICAgICBwID0gMFxuXG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nKSB7XG4gICAgICAgIC8vID4xID0+ID49Mi4wLjBcbiAgICAgICAgLy8gPjEuMiA9PiA+PTEuMy4wXG4gICAgICAgIGd0bHQgPSAnPj0nXG4gICAgICAgIGlmICh4bSkge1xuICAgICAgICAgIE0gPSArTSArIDFcbiAgICAgICAgICBtID0gMFxuICAgICAgICAgIHAgPSAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbSA9ICttICsgMVxuICAgICAgICAgIHAgPSAwXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZ3RsdCA9PT0gJzw9Jykge1xuICAgICAgICAvLyA8PTAuNy54IGlzIGFjdHVhbGx5IDwwLjguMCwgc2luY2UgYW55IDAuNy54IHNob3VsZFxuICAgICAgICAvLyBwYXNzLiAgU2ltaWxhcmx5LCA8PTcueCBpcyBhY3R1YWxseSA8OC4wLjAsIGV0Yy5cbiAgICAgICAgZ3RsdCA9ICc8J1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbSA9ICttICsgMVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChndGx0ID09PSAnPCcpIHtcbiAgICAgICAgcHIgPSAnLTAnXG4gICAgICB9XG5cbiAgICAgIHJldCA9IGAke2d0bHQgKyBNfS4ke219LiR7cH0ke3ByfWBcbiAgICB9IGVsc2UgaWYgKHhtKSB7XG4gICAgICByZXQgPSBgPj0ke019LjAuMCR7cHJ9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmICh4cCkge1xuICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3ByXG4gICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfVxuXG4gICAgZGVidWcoJ3hSYW5nZSByZXR1cm4nLCByZXQpXG5cbiAgICByZXR1cm4gcmV0XG4gIH0pXG59XG5cbi8vIEJlY2F1c2UgKiBpcyBBTkQtZWQgd2l0aCBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIGNvbXBhcmF0b3IsXG4vLyBhbmQgJycgbWVhbnMgXCJhbnkgdmVyc2lvblwiLCBqdXN0IHJlbW92ZSB0aGUgKnMgZW50aXJlbHkuXG5jb25zdCByZXBsYWNlU3RhcnMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZVN0YXJzJywgY29tcCwgb3B0aW9ucylcbiAgLy8gTG9vc2VuZXNzIGlzIGlnbm9yZWQgaGVyZS4gIHN0YXIgaXMgYWx3YXlzIGFzIGxvb3NlIGFzIGl0IGdldHMhXG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKHJlW3QuU1RBUl0sICcnKVxufVxuXG5jb25zdCByZXBsYWNlR1RFMCA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlR1RFMCcsIGNvbXAsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKHJlW29wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyB0LkdURTBQUkUgOiB0LkdURTBdLCAnJylcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gc3RyaW5nLnJlcGxhY2UocmVbdC5IWVBIRU5SQU5HRV0pXG4vLyBNLCBtLCBwYXRjaCwgcHJlcmVsZWFzZSwgYnVpbGRcbi8vIDEuMiAtIDMuNC41ID0+ID49MS4yLjAgPD0zLjQuNVxuLy8gMS4yLjMgLSAzLjQgPT4gPj0xLjIuMCA8My41LjAtMCBBbnkgMy40Lnggd2lsbCBkb1xuLy8gMS4yIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wLTBcbmNvbnN0IGh5cGhlblJlcGxhY2UgPSBpbmNQciA9PiAoJDAsXG4gIGZyb20sIGZNLCBmbSwgZnAsIGZwciwgZmIsXG4gIHRvLCB0TSwgdG0sIHRwLCB0cHIsIHRiKSA9PiB7XG4gIGlmIChpc1goZk0pKSB7XG4gICAgZnJvbSA9ICcnXG4gIH0gZWxzZSBpZiAoaXNYKGZtKSkge1xuICAgIGZyb20gPSBgPj0ke2ZNfS4wLjAke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfSBlbHNlIGlmIChpc1goZnApKSB7XG4gICAgZnJvbSA9IGA+PSR7Zk19LiR7Zm19LjAke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfSBlbHNlIGlmIChmcHIpIHtcbiAgICBmcm9tID0gYD49JHtmcm9tfWBcbiAgfSBlbHNlIHtcbiAgICBmcm9tID0gYD49JHtmcm9tfSR7aW5jUHIgPyAnLTAnIDogJyd9YFxuICB9XG5cbiAgaWYgKGlzWCh0TSkpIHtcbiAgICB0byA9ICcnXG4gIH0gZWxzZSBpZiAoaXNYKHRtKSkge1xuICAgIHRvID0gYDwkeyt0TSArIDF9LjAuMC0wYFxuICB9IGVsc2UgaWYgKGlzWCh0cCkpIHtcbiAgICB0byA9IGA8JHt0TX0uJHsrdG0gKyAxfS4wLTBgXG4gIH0gZWxzZSBpZiAodHByKSB7XG4gICAgdG8gPSBgPD0ke3RNfS4ke3RtfS4ke3RwfS0ke3Rwcn1gXG4gIH0gZWxzZSBpZiAoaW5jUHIpIHtcbiAgICB0byA9IGA8JHt0TX0uJHt0bX0uJHsrdHAgKyAxfS0wYFxuICB9IGVsc2Uge1xuICAgIHRvID0gYDw9JHt0b31gXG4gIH1cblxuICByZXR1cm4gYCR7ZnJvbX0gJHt0b31gLnRyaW0oKVxufVxuXG5jb25zdCB0ZXN0U2V0ID0gKHNldCwgdmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgIGlmICghc2V0W2ldLnRlc3QodmVyc2lvbikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGlmICh2ZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoICYmICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgLy8gRmluZCB0aGUgc2V0IG9mIHZlcnNpb25zIHRoYXQgYXJlIGFsbG93ZWQgdG8gaGF2ZSBwcmVyZWxlYXNlc1xuICAgIC8vIEZvciBleGFtcGxlLCBeMS4yLjMtcHIuMSBkZXN1Z2FycyB0byA+PTEuMi4zLXByLjEgPDIuMC4wXG4gICAgLy8gVGhhdCBzaG91bGQgYWxsb3cgYDEuMi4zLXByLjJgIHRvIHBhc3MuXG4gICAgLy8gSG93ZXZlciwgYDEuMi40LWFscGhhLm5vdHJlYWR5YCBzaG91bGQgTk9UIGJlIGFsbG93ZWQsXG4gICAgLy8gZXZlbiB0aG91Z2ggaXQncyB3aXRoaW4gdGhlIHJhbmdlIHNldCBieSB0aGUgY29tcGFyYXRvcnMuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlYnVnKHNldFtpXS5zZW12ZXIpXG4gICAgICBpZiAoc2V0W2ldLnNlbXZlciA9PT0gQ29tcGFyYXRvci5BTlkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWQgPSBzZXRbaV0uc2VtdmVyXG4gICAgICAgIGlmIChhbGxvd2VkLm1ham9yID09PSB2ZXJzaW9uLm1ham9yICYmXG4gICAgICAgICAgICBhbGxvd2VkLm1pbm9yID09PSB2ZXJzaW9uLm1pbm9yICYmXG4gICAgICAgICAgICBhbGxvd2VkLnBhdGNoID09PSB2ZXJzaW9uLnBhdGNoKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZlcnNpb24gaGFzIGEgLXByZSwgYnV0IGl0J3Mgbm90IG9uZSBvZiB0aGUgb25lcyB3ZSBsaWtlLlxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cbiIsImNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZGVidWcnKVxuY29uc3QgeyBNQVhfTEVOR1RILCBNQVhfU0FGRV9JTlRFR0VSIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9jb25zdGFudHMnKVxuY29uc3QgeyBzYWZlUmU6IHJlLCB0IH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgeyBjb21wYXJlSWRlbnRpZmllcnMgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lkZW50aWZpZXJzJylcbmNsYXNzIFNlbVZlciB7XG4gIGNvbnN0cnVjdG9yICh2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICAgIGlmICh2ZXJzaW9uLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UgJiZcbiAgICAgICAgICB2ZXJzaW9uLmluY2x1ZGVQcmVyZWxlYXNlID09PSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnZlcnNpb25cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB2ZXJzaW9uLiBNdXN0IGJlIGEgc3RyaW5nLiBHb3QgdHlwZSBcIiR7dHlwZW9mIHZlcnNpb259XCIuYClcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbi5sZW5ndGggPiBNQVhfTEVOR1RIKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgdmVyc2lvbiBpcyBsb25nZXIgdGhhbiAke01BWF9MRU5HVEh9IGNoYXJhY3RlcnNgXG4gICAgICApXG4gICAgfVxuXG4gICAgZGVidWcoJ1NlbVZlcicsIHZlcnNpb24sIG9wdGlvbnMpXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2VcbiAgICAvLyB0aGlzIGlzbid0IGFjdHVhbGx5IHJlbGV2YW50IGZvciB2ZXJzaW9ucywgYnV0IGtlZXAgaXQgc28gdGhhdCB3ZVxuICAgIC8vIGRvbid0IHJ1biBpbnRvIHRyb3VibGUgcGFzc2luZyB0aGlzLm9wdGlvbnMgYXJvdW5kLlxuICAgIHRoaXMuaW5jbHVkZVByZXJlbGVhc2UgPSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcblxuICAgIGNvbnN0IG0gPSB2ZXJzaW9uLnRyaW0oKS5tYXRjaChvcHRpb25zLmxvb3NlID8gcmVbdC5MT09TRV0gOiByZVt0LkZVTExdKVxuXG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFZlcnNpb246ICR7dmVyc2lvbn1gKVxuICAgIH1cblxuICAgIHRoaXMucmF3ID0gdmVyc2lvblxuXG4gICAgLy8gdGhlc2UgYXJlIGFjdHVhbGx5IG51bWJlcnNcbiAgICB0aGlzLm1ham9yID0gK21bMV1cbiAgICB0aGlzLm1pbm9yID0gK21bMl1cbiAgICB0aGlzLnBhdGNoID0gK21bM11cblxuICAgIGlmICh0aGlzLm1ham9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1ham9yIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtYWpvciB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICBpZiAodGhpcy5taW5vciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5taW5vciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWlub3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGF0Y2ggPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMucGF0Y2ggPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHBhdGNoIHZlcnNpb24nKVxuICAgIH1cblxuICAgIC8vIG51bWJlcmlmeSBhbnkgcHJlcmVsZWFzZSBudW1lcmljIGlkc1xuICAgIGlmICghbVs0XSkge1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gbVs0XS5zcGxpdCgnLicpLm1hcCgoaWQpID0+IHtcbiAgICAgICAgaWYgKC9eWzAtOV0rJC8udGVzdChpZCkpIHtcbiAgICAgICAgICBjb25zdCBudW0gPSAraWRcbiAgICAgICAgICBpZiAobnVtID49IDAgJiYgbnVtIDwgTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgcmV0dXJuIG51bVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5idWlsZCA9IG1bNV0gPyBtWzVdLnNwbGl0KCcuJykgOiBbXVxuICAgIHRoaXMuZm9ybWF0KClcbiAgfVxuXG4gIGZvcm1hdCAoKSB7XG4gICAgdGhpcy52ZXJzaW9uID0gYCR7dGhpcy5tYWpvcn0uJHt0aGlzLm1pbm9yfS4ke3RoaXMucGF0Y2h9YFxuICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICB0aGlzLnZlcnNpb24gKz0gYC0ke3RoaXMucHJlcmVsZWFzZS5qb2luKCcuJyl9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52ZXJzaW9uXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgY29tcGFyZSAob3RoZXIpIHtcbiAgICBkZWJ1ZygnU2VtVmVyLmNvbXBhcmUnLCB0aGlzLnZlcnNpb24sIHRoaXMub3B0aW9ucywgb3RoZXIpXG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBpZiAodHlwZW9mIG90aGVyID09PSAnc3RyaW5nJyAmJiBvdGhlciA9PT0gdGhpcy52ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICBpZiAob3RoZXIudmVyc2lvbiA9PT0gdGhpcy52ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gMFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbXBhcmVNYWluKG90aGVyKSB8fCB0aGlzLmNvbXBhcmVQcmUob3RoZXIpXG4gIH1cblxuICBjb21wYXJlTWFpbiAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5tYWpvciwgb3RoZXIubWFqb3IpIHx8XG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5taW5vciwgb3RoZXIubWlub3IpIHx8XG4gICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5wYXRjaCwgb3RoZXIucGF0Y2gpXG4gICAgKVxuICB9XG5cbiAgY29tcGFyZVByZSAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIC8vIE5PVCBoYXZpbmcgYSBwcmVyZWxlYXNlIGlzID4gaGF2aW5nIG9uZVxuICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiBvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDFcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICBsZXQgaSA9IDBcbiAgICBkbyB7XG4gICAgICBjb25zdCBhID0gdGhpcy5wcmVyZWxlYXNlW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIucHJlcmVsZWFzZVtpXVxuICAgICAgZGVidWcoJ3ByZXJlbGVhc2UgY29tcGFyZScsIGksIGEsIGIpXG4gICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSBlbHNlIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpXG4gICAgICB9XG4gICAgfSB3aGlsZSAoKytpKVxuICB9XG5cbiAgY29tcGFyZUJ1aWxkIChvdGhlcikge1xuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMuYnVpbGRbaV1cbiAgICAgIGNvbnN0IGIgPSBvdGhlci5idWlsZFtpXVxuICAgICAgZGVidWcoJ3ByZXJlbGVhc2UgY29tcGFyZScsIGksIGEsIGIpXG4gICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSBlbHNlIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpXG4gICAgICB9XG4gICAgfSB3aGlsZSAoKytpKVxuICB9XG5cbiAgLy8gcHJlbWlub3Igd2lsbCBidW1wIHRoZSB2ZXJzaW9uIHVwIHRvIHRoZSBuZXh0IG1pbm9yIHJlbGVhc2UsIGFuZCBpbW1lZGlhdGVseVxuICAvLyBkb3duIHRvIHByZS1yZWxlYXNlLiBwcmVtYWpvciBhbmQgcHJlcGF0Y2ggd29yayB0aGUgc2FtZSB3YXkuXG4gIGluYyAocmVsZWFzZSwgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpIHtcbiAgICBzd2l0Y2ggKHJlbGVhc2UpIHtcbiAgICAgIGNhc2UgJ3ByZW1ham9yJzpcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5taW5vciA9IDBcbiAgICAgICAgdGhpcy5tYWpvcisrXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3ByZW1pbm9yJzpcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5taW5vcisrXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3ByZXBhdGNoJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbHJlYWR5IGEgcHJlcmVsZWFzZSwgaXQgd2lsbCBidW1wIHRvIHRoZSBuZXh0IHZlcnNpb25cbiAgICAgICAgLy8gZHJvcCBhbnkgcHJlcmVsZWFzZXMgdGhhdCBtaWdodCBhbHJlYWR5IGV4aXN0LCBzaW5jZSB0aGV5IGFyZSBub3RcbiAgICAgICAgLy8gcmVsZXZhbnQgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIG5vbi1wcmVyZWxlYXNlIHZlcnNpb24sIHRoaXMgYWN0cyB0aGUgc2FtZSBhc1xuICAgICAgLy8gcHJlcGF0Y2guXG4gICAgICBjYXNlICdwcmVyZWxlYXNlJzpcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgJ21ham9yJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1tYWpvciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1ham9yIHZlcnNpb24uXG4gICAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgbWFqb3IuXG4gICAgICAgIC8vIDEuMC4wLTUgYnVtcHMgdG8gMS4wLjBcbiAgICAgICAgLy8gMS4xLjAgYnVtcHMgdG8gMi4wLjBcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMubWlub3IgIT09IDAgfHxcbiAgICAgICAgICB0aGlzLnBhdGNoICE9PSAwIHx8XG4gICAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLm1ham9yKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1pbm9yID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnbWlub3InOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1pbm9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWlub3IgdmVyc2lvbi5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtaW5vci5cbiAgICAgICAgLy8gMS4yLjAtNSBidW1wcyB0byAxLjIuMFxuICAgICAgICAvLyAxLjIuMSBidW1wcyB0byAxLjMuMFxuICAgICAgICBpZiAodGhpcy5wYXRjaCAhPT0gMCB8fCB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5taW5vcisrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3BhdGNoJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCBpdCB3aWxsIGluY3JlbWVudCB0aGUgcGF0Y2guXG4gICAgICAgIC8vIElmIGl0IGlzIGEgcHJlLXJlbGVhc2UgaXQgd2lsbCBidW1wIHVwIHRvIHRoZSBzYW1lIHBhdGNoIHZlcnNpb24uXG4gICAgICAgIC8vIDEuMi4wLTUgcGF0Y2hlcyB0byAxLjIuMFxuICAgICAgICAvLyAxLjIuMCBwYXRjaGVzIHRvIDEuMi4xXG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5wYXRjaCsrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIC8vIFRoaXMgcHJvYmFibHkgc2hvdWxkbid0IGJlIHVzZWQgcHVibGljbHkuXG4gICAgICAvLyAxLjAuMCAncHJlJyB3b3VsZCBiZWNvbWUgMS4wLjAtMCB3aGljaCBpcyB0aGUgd3JvbmcgZGlyZWN0aW9uLlxuICAgICAgY2FzZSAncHJlJzoge1xuICAgICAgICBjb25zdCBiYXNlID0gTnVtYmVyKGlkZW50aWZpZXJCYXNlKSA/IDEgOiAwXG5cbiAgICAgICAgaWYgKCFpZGVudGlmaWVyICYmIGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6IGlkZW50aWZpZXIgaXMgZW1wdHknKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbYmFzZV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgaSA9IHRoaXMucHJlcmVsZWFzZS5sZW5ndGhcbiAgICAgICAgICB3aGlsZSAoLS1pID49IDApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmVyZWxlYXNlW2ldID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICB0aGlzLnByZXJlbGVhc2VbaV0rK1xuICAgICAgICAgICAgICBpID0gLTJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBkaWRuJ3QgaW5jcmVtZW50IGFueXRoaW5nXG4gICAgICAgICAgICBpZiAoaWRlbnRpZmllciA9PT0gdGhpcy5wcmVyZWxlYXNlLmpvaW4oJy4nKSAmJiBpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogaWRlbnRpZmllciBhbHJlYWR5IGV4aXN0cycpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UucHVzaChiYXNlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICAgIC8vIDEuMi4wLWJldGEuMSBidW1wcyB0byAxLjIuMC1iZXRhLjIsXG4gICAgICAgICAgLy8gMS4yLjAtYmV0YS5mb29ibHogb3IgMS4yLjAtYmV0YSBidW1wcyB0byAxLjIuMC1iZXRhLjBcbiAgICAgICAgICBsZXQgcHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyLCBiYXNlXVxuICAgICAgICAgIGlmIChpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHByZXJlbGVhc2UgPSBbaWRlbnRpZmllcl1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLnByZXJlbGVhc2VbMF0sIGlkZW50aWZpZXIpID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoaXNOYU4odGhpcy5wcmVyZWxlYXNlWzFdKSkge1xuICAgICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IHByZXJlbGVhc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6ICR7cmVsZWFzZX1gKVxuICAgIH1cbiAgICB0aGlzLnJhdyA9IHRoaXMuZm9ybWF0KClcbiAgICBpZiAodGhpcy5idWlsZC5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmF3ICs9IGArJHt0aGlzLmJ1aWxkLmpvaW4oJy4nKX1gXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTZW1WZXJcbiIsImNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCBjbGVhbiA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHMgPSBwYXJzZSh2ZXJzaW9uLnRyaW0oKS5yZXBsYWNlKC9eWz12XSsvLCAnJyksIG9wdGlvbnMpXG4gIHJldHVybiBzID8gcy52ZXJzaW9uIDogbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSBjbGVhblxuIiwiY29uc3QgZXEgPSByZXF1aXJlKCcuL2VxJylcbmNvbnN0IG5lcSA9IHJlcXVpcmUoJy4vbmVxJylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi9ndCcpXG5jb25zdCBndGUgPSByZXF1aXJlKCcuL2d0ZScpXG5jb25zdCBsdCA9IHJlcXVpcmUoJy4vbHQnKVxuY29uc3QgbHRlID0gcmVxdWlyZSgnLi9sdGUnKVxuXG5jb25zdCBjbXAgPSAoYSwgb3AsIGIsIGxvb3NlKSA9PiB7XG4gIHN3aXRjaCAob3ApIHtcbiAgICBjYXNlICc9PT0nOlxuICAgICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0Jykge1xuICAgICAgICBhID0gYS52ZXJzaW9uXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGIgPSBiLnZlcnNpb25cbiAgICAgIH1cbiAgICAgIHJldHVybiBhID09PSBiXG5cbiAgICBjYXNlICchPT0nOlxuICAgICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0Jykge1xuICAgICAgICBhID0gYS52ZXJzaW9uXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGIgPSBiLnZlcnNpb25cbiAgICAgIH1cbiAgICAgIHJldHVybiBhICE9PSBiXG5cbiAgICBjYXNlICcnOlxuICAgIGNhc2UgJz0nOlxuICAgIGNhc2UgJz09JzpcbiAgICAgIHJldHVybiBlcShhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJyE9JzpcbiAgICAgIHJldHVybiBuZXEoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc+JzpcbiAgICAgIHJldHVybiBndChhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJz49JzpcbiAgICAgIHJldHVybiBndGUoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc8JzpcbiAgICAgIHJldHVybiBsdChhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJzw9JzpcbiAgICAgIHJldHVybiBsdGUoYSwgYiwgbG9vc2UpXG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBvcGVyYXRvcjogJHtvcH1gKVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IGNtcFxuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuXG5jb25zdCBjb2VyY2UgPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgIHJldHVybiB2ZXJzaW9uXG4gIH1cblxuICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdudW1iZXInKSB7XG4gICAgdmVyc2lvbiA9IFN0cmluZyh2ZXJzaW9uKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIGxldCBtYXRjaCA9IG51bGxcbiAgaWYgKCFvcHRpb25zLnJ0bCkge1xuICAgIG1hdGNoID0gdmVyc2lvbi5tYXRjaChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gcmVbdC5DT0VSQ0VGVUxMXSA6IHJlW3QuQ09FUkNFXSlcbiAgfSBlbHNlIHtcbiAgICAvLyBGaW5kIHRoZSByaWdodC1tb3N0IGNvZXJjaWJsZSBzdHJpbmcgdGhhdCBkb2VzIG5vdCBzaGFyZVxuICAgIC8vIGEgdGVybWludXMgd2l0aCBhIG1vcmUgbGVmdC13YXJkIGNvZXJjaWJsZSBzdHJpbmcuXG4gICAgLy8gRWcsICcxLjIuMy40JyB3YW50cyB0byBjb2VyY2UgJzIuMy40Jywgbm90ICczLjQnIG9yICc0J1xuICAgIC8vIFdpdGggaW5jbHVkZVByZXJlbGVhc2Ugb3B0aW9uIHNldCwgJzEuMi4zLjQtcmMnIHdhbnRzIHRvIGNvZXJjZSAnMi4zLjQtcmMnLCBub3QgJzIuMy40J1xuICAgIC8vXG4gICAgLy8gV2FsayB0aHJvdWdoIHRoZSBzdHJpbmcgY2hlY2tpbmcgd2l0aCBhIC9nIHJlZ2V4cFxuICAgIC8vIE1hbnVhbGx5IHNldCB0aGUgaW5kZXggc28gYXMgdG8gcGljayB1cCBvdmVybGFwcGluZyBtYXRjaGVzLlxuICAgIC8vIFN0b3Agd2hlbiB3ZSBnZXQgYSBtYXRjaCB0aGF0IGVuZHMgYXQgdGhlIHN0cmluZyBlbmQsIHNpbmNlIG5vXG4gICAgLy8gY29lcmNpYmxlIHN0cmluZyBjYW4gYmUgbW9yZSByaWdodC13YXJkIHdpdGhvdXQgdGhlIHNhbWUgdGVybWludXMuXG4gICAgY29uc3QgY29lcmNlUnRsUmVnZXggPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gcmVbdC5DT0VSQ0VSVExGVUxMXSA6IHJlW3QuQ09FUkNFUlRMXVxuICAgIGxldCBuZXh0XG4gICAgd2hpbGUgKChuZXh0ID0gY29lcmNlUnRsUmVnZXguZXhlYyh2ZXJzaW9uKSkgJiZcbiAgICAgICAgKCFtYXRjaCB8fCBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCAhPT0gdmVyc2lvbi5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBpZiAoIW1hdGNoIHx8XG4gICAgICAgICAgICBuZXh0LmluZGV4ICsgbmV4dFswXS5sZW5ndGggIT09IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKSB7XG4gICAgICAgIG1hdGNoID0gbmV4dFxuICAgICAgfVxuICAgICAgY29lcmNlUnRsUmVnZXgubGFzdEluZGV4ID0gbmV4dC5pbmRleCArIG5leHRbMV0ubGVuZ3RoICsgbmV4dFsyXS5sZW5ndGhcbiAgICB9XG4gICAgLy8gbGVhdmUgaXQgaW4gYSBjbGVhbiBzdGF0ZVxuICAgIGNvZXJjZVJ0bFJlZ2V4Lmxhc3RJbmRleCA9IC0xXG4gIH1cblxuICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgbWFqb3IgPSBtYXRjaFsyXVxuICBjb25zdCBtaW5vciA9IG1hdGNoWzNdIHx8ICcwJ1xuICBjb25zdCBwYXRjaCA9IG1hdGNoWzRdIHx8ICcwJ1xuICBjb25zdCBwcmVyZWxlYXNlID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBtYXRjaFs1XSA/IGAtJHttYXRjaFs1XX1gIDogJydcbiAgY29uc3QgYnVpbGQgPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmIG1hdGNoWzZdID8gYCske21hdGNoWzZdfWAgOiAnJ1xuXG4gIHJldHVybiBwYXJzZShgJHttYWpvcn0uJHttaW5vcn0uJHtwYXRjaH0ke3ByZXJlbGVhc2V9JHtidWlsZH1gLCBvcHRpb25zKVxufVxubW9kdWxlLmV4cG9ydHMgPSBjb2VyY2VcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGNvbXBhcmVCdWlsZCA9IChhLCBiLCBsb29zZSkgPT4ge1xuICBjb25zdCB2ZXJzaW9uQSA9IG5ldyBTZW1WZXIoYSwgbG9vc2UpXG4gIGNvbnN0IHZlcnNpb25CID0gbmV3IFNlbVZlcihiLCBsb29zZSlcbiAgcmV0dXJuIHZlcnNpb25BLmNvbXBhcmUodmVyc2lvbkIpIHx8IHZlcnNpb25BLmNvbXBhcmVCdWlsZCh2ZXJzaW9uQilcbn1cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZUJ1aWxkXG4iLCJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGNvbXBhcmVMb29zZSA9IChhLCBiKSA9PiBjb21wYXJlKGEsIGIsIHRydWUpXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVMb29zZVxuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgY29tcGFyZSA9IChhLCBiLCBsb29zZSkgPT5cbiAgbmV3IFNlbVZlcihhLCBsb29zZSkuY29tcGFyZShuZXcgU2VtVmVyKGIsIGxvb3NlKSlcblxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlXG4iLCJjb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UuanMnKVxuXG5jb25zdCBkaWZmID0gKHZlcnNpb24xLCB2ZXJzaW9uMikgPT4ge1xuICBjb25zdCB2MSA9IHBhcnNlKHZlcnNpb24xLCBudWxsLCB0cnVlKVxuICBjb25zdCB2MiA9IHBhcnNlKHZlcnNpb24yLCBudWxsLCB0cnVlKVxuICBjb25zdCBjb21wYXJpc29uID0gdjEuY29tcGFyZSh2MilcblxuICBpZiAoY29tcGFyaXNvbiA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCB2MUhpZ2hlciA9IGNvbXBhcmlzb24gPiAwXG4gIGNvbnN0IGhpZ2hWZXJzaW9uID0gdjFIaWdoZXIgPyB2MSA6IHYyXG4gIGNvbnN0IGxvd1ZlcnNpb24gPSB2MUhpZ2hlciA/IHYyIDogdjFcbiAgY29uc3QgaGlnaEhhc1ByZSA9ICEhaGlnaFZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGhcbiAgY29uc3QgbG93SGFzUHJlID0gISFsb3dWZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoXG5cbiAgaWYgKGxvd0hhc1ByZSAmJiAhaGlnaEhhc1ByZSkge1xuICAgIC8vIEdvaW5nIGZyb20gcHJlcmVsZWFzZSAtPiBubyBwcmVyZWxlYXNlIHJlcXVpcmVzIHNvbWUgc3BlY2lhbCBjYXNpbmdcblxuICAgIC8vIElmIHRoZSBsb3cgdmVyc2lvbiBoYXMgb25seSBhIG1ham9yLCB0aGVuIGl0IHdpbGwgYWx3YXlzIGJlIGEgbWFqb3JcbiAgICAvLyBTb21lIGV4YW1wbGVzOlxuICAgIC8vIDEuMC4wLTEgLT4gMS4wLjBcbiAgICAvLyAxLjAuMC0xIC0+IDEuMS4xXG4gICAgLy8gMS4wLjAtMSAtPiAyLjAuMFxuICAgIGlmICghbG93VmVyc2lvbi5wYXRjaCAmJiAhbG93VmVyc2lvbi5taW5vcikge1xuICAgICAgcmV0dXJuICdtYWpvcidcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgaXQgY2FuIGJlIGRldGVybWluZWQgYnkgY2hlY2tpbmcgdGhlIGhpZ2ggdmVyc2lvblxuXG4gICAgaWYgKGhpZ2hWZXJzaW9uLnBhdGNoKSB7XG4gICAgICAvLyBhbnl0aGluZyBoaWdoZXIgdGhhbiBhIHBhdGNoIGJ1bXAgd291bGQgcmVzdWx0IGluIHRoZSB3cm9uZyB2ZXJzaW9uXG4gICAgICByZXR1cm4gJ3BhdGNoJ1xuICAgIH1cblxuICAgIGlmIChoaWdoVmVyc2lvbi5taW5vcikge1xuICAgICAgLy8gYW55dGhpbmcgaGlnaGVyIHRoYW4gYSBtaW5vciBidW1wIHdvdWxkIHJlc3VsdCBpbiB0aGUgd3JvbmcgdmVyc2lvblxuICAgICAgcmV0dXJuICdtaW5vcidcbiAgICB9XG5cbiAgICAvLyBidW1waW5nIG1ham9yL21pbm9yL3BhdGNoIGFsbCBoYXZlIHNhbWUgcmVzdWx0XG4gICAgcmV0dXJuICdtYWpvcidcbiAgfVxuXG4gIC8vIGFkZCB0aGUgYHByZWAgcHJlZml4IGlmIHdlIGFyZSBnb2luZyB0byBhIHByZXJlbGVhc2UgdmVyc2lvblxuICBjb25zdCBwcmVmaXggPSBoaWdoSGFzUHJlID8gJ3ByZScgOiAnJ1xuXG4gIGlmICh2MS5tYWpvciAhPT0gdjIubWFqb3IpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJ21ham9yJ1xuICB9XG5cbiAgaWYgKHYxLm1pbm9yICE9PSB2Mi5taW5vcikge1xuICAgIHJldHVybiBwcmVmaXggKyAnbWlub3InXG4gIH1cblxuICBpZiAodjEucGF0Y2ggIT09IHYyLnBhdGNoKSB7XG4gICAgcmV0dXJuIHByZWZpeCArICdwYXRjaCdcbiAgfVxuXG4gIC8vIGhpZ2ggYW5kIGxvdyBhcmUgcHJlbGVhc2VzXG4gIHJldHVybiAncHJlcmVsZWFzZSdcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkaWZmXG4iLCJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA9PT0gMFxubW9kdWxlLmV4cG9ydHMgPSBlcVxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBndCA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPiAwXG5tb2R1bGUuZXhwb3J0cyA9IGd0XG4iLCJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGd0ZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPj0gMFxubW9kdWxlLmV4cG9ydHMgPSBndGVcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcblxuY29uc3QgaW5jID0gKHZlcnNpb24sIHJlbGVhc2UsIG9wdGlvbnMsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKSA9PiB7XG4gIGlmICh0eXBlb2YgKG9wdGlvbnMpID09PSAnc3RyaW5nJykge1xuICAgIGlkZW50aWZpZXJCYXNlID0gaWRlbnRpZmllclxuICAgIGlkZW50aWZpZXIgPSBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZFxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcihcbiAgICAgIHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIgPyB2ZXJzaW9uLnZlcnNpb24gOiB2ZXJzaW9uLFxuICAgICAgb3B0aW9uc1xuICAgICkuaW5jKHJlbGVhc2UsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKS52ZXJzaW9uXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBpbmNcbiIsImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbHQgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpIDwgMFxubW9kdWxlLmV4cG9ydHMgPSBsdFxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBsdGUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpIDw9IDBcbm1vZHVsZS5leHBvcnRzID0gbHRlXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBtYWpvciA9IChhLCBsb29zZSkgPT4gbmV3IFNlbVZlcihhLCBsb29zZSkubWFqb3Jcbm1vZHVsZS5leHBvcnRzID0gbWFqb3JcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IG1pbm9yID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5taW5vclxubW9kdWxlLmV4cG9ydHMgPSBtaW5vclxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBuZXEgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpICE9PSAwXG5tb2R1bGUuZXhwb3J0cyA9IG5lcVxuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGFyc2UgPSAodmVyc2lvbiwgb3B0aW9ucywgdGhyb3dFcnJvcnMgPSBmYWxzZSkgPT4ge1xuICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgIHJldHVybiB2ZXJzaW9uXG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcih2ZXJzaW9uLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIGlmICghdGhyb3dFcnJvcnMpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHRocm93IGVyXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVxuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGF0Y2ggPSAoYSwgbG9vc2UpID0+IG5ldyBTZW1WZXIoYSwgbG9vc2UpLnBhdGNoXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoXG4iLCJjb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgcHJlcmVsZWFzZSA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJldHVybiAocGFyc2VkICYmIHBhcnNlZC5wcmVyZWxlYXNlLmxlbmd0aCkgPyBwYXJzZWQucHJlcmVsZWFzZSA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gcHJlcmVsZWFzZVxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCByY29tcGFyZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShiLCBhLCBsb29zZSlcbm1vZHVsZS5leHBvcnRzID0gcmNvbXBhcmVcbiIsImNvbnN0IGNvbXBhcmVCdWlsZCA9IHJlcXVpcmUoJy4vY29tcGFyZS1idWlsZCcpXG5jb25zdCByc29ydCA9IChsaXN0LCBsb29zZSkgPT4gbGlzdC5zb3J0KChhLCBiKSA9PiBjb21wYXJlQnVpbGQoYiwgYSwgbG9vc2UpKVxubW9kdWxlLmV4cG9ydHMgPSByc29ydFxuIiwiY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHNhdGlzZmllcyA9ICh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiByYW5nZS50ZXN0KHZlcnNpb24pXG59XG5tb2R1bGUuZXhwb3J0cyA9IHNhdGlzZmllc1xuIiwiY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9jb21wYXJlLWJ1aWxkJylcbmNvbnN0IHNvcnQgPSAobGlzdCwgbG9vc2UpID0+IGxpc3Quc29ydCgoYSwgYikgPT4gY29tcGFyZUJ1aWxkKGEsIGIsIGxvb3NlKSlcbm1vZHVsZS5leHBvcnRzID0gc29ydFxuIiwiY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHZhbGlkID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgdiA9IHBhcnNlKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJldHVybiB2ID8gdi52ZXJzaW9uIDogbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSB2YWxpZFxuIiwiLy8ganVzdCBwcmUtbG9hZCBhbGwgdGhlIHN0dWZmIHRoYXQgaW5kZXguanMgbGF6aWx5IGV4cG9ydHNcbmNvbnN0IGludGVybmFsUmUgPSByZXF1aXJlKCcuL2ludGVybmFsL3JlJylcbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgaWRlbnRpZmllcnMgPSByZXF1aXJlKCcuL2ludGVybmFsL2lkZW50aWZpZXJzJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcGFyc2UnKVxuY29uc3QgdmFsaWQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy92YWxpZCcpXG5jb25zdCBjbGVhbiA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NsZWFuJylcbmNvbnN0IGluYyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2luYycpXG5jb25zdCBkaWZmID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZGlmZicpXG5jb25zdCBtYWpvciA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL21ham9yJylcbmNvbnN0IG1pbm9yID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbWlub3InKVxuY29uc3QgcGF0Y2ggPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9wYXRjaCcpXG5jb25zdCBwcmVyZWxlYXNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcHJlcmVsZWFzZScpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZScpXG5jb25zdCByY29tcGFyZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jjb21wYXJlJylcbmNvbnN0IGNvbXBhcmVMb29zZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUtbG9vc2UnKVxuY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZS1idWlsZCcpXG5jb25zdCBzb3J0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvc29ydCcpXG5jb25zdCByc29ydCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jzb3J0JylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZ3QnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9sdCcpXG5jb25zdCBlcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2VxJylcbmNvbnN0IG5lcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL25lcScpXG5jb25zdCBndGUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9ndGUnKVxuY29uc3QgbHRlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbHRlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NtcCcpXG5jb25zdCBjb2VyY2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb2VyY2UnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9jb21wYXJhdG9yJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3NhdGlzZmllcycpXG5jb25zdCB0b0NvbXBhcmF0b3JzID0gcmVxdWlyZSgnLi9yYW5nZXMvdG8tY29tcGFyYXRvcnMnKVxuY29uc3QgbWF4U2F0aXNmeWluZyA9IHJlcXVpcmUoJy4vcmFuZ2VzL21heC1zYXRpc2Z5aW5nJylcbmNvbnN0IG1pblNhdGlzZnlpbmcgPSByZXF1aXJlKCcuL3Jhbmdlcy9taW4tc2F0aXNmeWluZycpXG5jb25zdCBtaW5WZXJzaW9uID0gcmVxdWlyZSgnLi9yYW5nZXMvbWluLXZlcnNpb24nKVxuY29uc3QgdmFsaWRSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3ZhbGlkJylcbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL3Jhbmdlcy9vdXRzaWRlJylcbmNvbnN0IGd0ciA9IHJlcXVpcmUoJy4vcmFuZ2VzL2d0cicpXG5jb25zdCBsdHIgPSByZXF1aXJlKCcuL3Jhbmdlcy9sdHInKVxuY29uc3QgaW50ZXJzZWN0cyA9IHJlcXVpcmUoJy4vcmFuZ2VzL2ludGVyc2VjdHMnKVxuY29uc3Qgc2ltcGxpZnlSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3NpbXBsaWZ5JylcbmNvbnN0IHN1YnNldCA9IHJlcXVpcmUoJy4vcmFuZ2VzL3N1YnNldCcpXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGFyc2UsXG4gIHZhbGlkLFxuICBjbGVhbixcbiAgaW5jLFxuICBkaWZmLFxuICBtYWpvcixcbiAgbWlub3IsXG4gIHBhdGNoLFxuICBwcmVyZWxlYXNlLFxuICBjb21wYXJlLFxuICByY29tcGFyZSxcbiAgY29tcGFyZUxvb3NlLFxuICBjb21wYXJlQnVpbGQsXG4gIHNvcnQsXG4gIHJzb3J0LFxuICBndCxcbiAgbHQsXG4gIGVxLFxuICBuZXEsXG4gIGd0ZSxcbiAgbHRlLFxuICBjbXAsXG4gIGNvZXJjZSxcbiAgQ29tcGFyYXRvcixcbiAgUmFuZ2UsXG4gIHNhdGlzZmllcyxcbiAgdG9Db21wYXJhdG9ycyxcbiAgbWF4U2F0aXNmeWluZyxcbiAgbWluU2F0aXNmeWluZyxcbiAgbWluVmVyc2lvbixcbiAgdmFsaWRSYW5nZSxcbiAgb3V0c2lkZSxcbiAgZ3RyLFxuICBsdHIsXG4gIGludGVyc2VjdHMsXG4gIHNpbXBsaWZ5UmFuZ2UsXG4gIHN1YnNldCxcbiAgU2VtVmVyLFxuICByZTogaW50ZXJuYWxSZS5yZSxcbiAgc3JjOiBpbnRlcm5hbFJlLnNyYyxcbiAgdG9rZW5zOiBpbnRlcm5hbFJlLnQsXG4gIFNFTVZFUl9TUEVDX1ZFUlNJT046IGNvbnN0YW50cy5TRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBSRUxFQVNFX1RZUEVTOiBjb25zdGFudHMuUkVMRUFTRV9UWVBFUyxcbiAgY29tcGFyZUlkZW50aWZpZXJzOiBpZGVudGlmaWVycy5jb21wYXJlSWRlbnRpZmllcnMsXG4gIHJjb21wYXJlSWRlbnRpZmllcnM6IGlkZW50aWZpZXJzLnJjb21wYXJlSWRlbnRpZmllcnMsXG59XG4iLCIvLyBOb3RlOiB0aGlzIGlzIHRoZSBzZW12ZXIub3JnIHZlcnNpb24gb2YgdGhlIHNwZWMgdGhhdCBpdCBpbXBsZW1lbnRzXG4vLyBOb3QgbmVjZXNzYXJpbHkgdGhlIHBhY2thZ2UgdmVyc2lvbiBvZiB0aGlzIGNvZGUuXG5jb25zdCBTRU1WRVJfU1BFQ19WRVJTSU9OID0gJzIuMC4wJ1xuXG5jb25zdCBNQVhfTEVOR1RIID0gMjU2XG5jb25zdCBNQVhfU0FGRV9JTlRFR0VSID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHxcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIDkwMDcxOTkyNTQ3NDA5OTFcblxuLy8gTWF4IHNhZmUgc2VnbWVudCBsZW5ndGggZm9yIGNvZXJjaW9uLlxuY29uc3QgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCA9IDE2XG5cbi8vIE1heCBzYWZlIGxlbmd0aCBmb3IgYSBidWlsZCBpZGVudGlmaWVyLiBUaGUgbWF4IGxlbmd0aCBtaW51cyA2IGNoYXJhY3RlcnMgZm9yXG4vLyB0aGUgc2hvcnRlc3QgdmVyc2lvbiB3aXRoIGEgYnVpbGQgMC4wLjArQlVJTEQuXG5jb25zdCBNQVhfU0FGRV9CVUlMRF9MRU5HVEggPSBNQVhfTEVOR1RIIC0gNlxuXG5jb25zdCBSRUxFQVNFX1RZUEVTID0gW1xuICAnbWFqb3InLFxuICAncHJlbWFqb3InLFxuICAnbWlub3InLFxuICAncHJlbWlub3InLFxuICAncGF0Y2gnLFxuICAncHJlcGF0Y2gnLFxuICAncHJlcmVsZWFzZScsXG5dXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNQVhfTEVOR1RILFxuICBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RILFxuICBNQVhfU0FGRV9CVUlMRF9MRU5HVEgsXG4gIE1BWF9TQUZFX0lOVEVHRVIsXG4gIFJFTEVBU0VfVFlQRVMsXG4gIFNFTVZFUl9TUEVDX1ZFUlNJT04sXG4gIEZMQUdfSU5DTFVERV9QUkVSRUxFQVNFOiAwYjAwMSxcbiAgRkxBR19MT09TRTogMGIwMTAsXG59XG4iLCJjb25zdCBkZWJ1ZyA9IChcbiAgdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmXG4gIHByb2Nlc3MuZW52ICYmXG4gIHByb2Nlc3MuZW52Lk5PREVfREVCVUcgJiZcbiAgL1xcYnNlbXZlclxcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRylcbikgPyAoLi4uYXJncykgPT4gY29uc29sZS5lcnJvcignU0VNVkVSJywgLi4uYXJncylcbiAgOiAoKSA9PiB7fVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYnVnXG4iLCJjb25zdCBudW1lcmljID0gL15bMC05XSskL1xuY29uc3QgY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IHtcbiAgY29uc3QgYW51bSA9IG51bWVyaWMudGVzdChhKVxuICBjb25zdCBibnVtID0gbnVtZXJpYy50ZXN0KGIpXG5cbiAgaWYgKGFudW0gJiYgYm51bSkge1xuICAgIGEgPSArYVxuICAgIGIgPSArYlxuICB9XG5cbiAgcmV0dXJuIGEgPT09IGIgPyAwXG4gICAgOiAoYW51bSAmJiAhYm51bSkgPyAtMVxuICAgIDogKGJudW0gJiYgIWFudW0pID8gMVxuICAgIDogYSA8IGIgPyAtMVxuICAgIDogMVxufVxuXG5jb25zdCByY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IGNvbXBhcmVJZGVudGlmaWVycyhiLCBhKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIiwiLy8gcGFyc2Ugb3V0IGp1c3QgdGhlIG9wdGlvbnMgd2UgY2FyZSBhYm91dFxuY29uc3QgbG9vc2VPcHRpb24gPSBPYmplY3QuZnJlZXplKHsgbG9vc2U6IHRydWUgfSlcbmNvbnN0IGVtcHR5T3B0cyA9IE9iamVjdC5mcmVlemUoeyB9KVxuY29uc3QgcGFyc2VPcHRpb25zID0gb3B0aW9ucyA9PiB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIHJldHVybiBlbXB0eU9wdHNcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbG9vc2VPcHRpb25cbiAgfVxuXG4gIHJldHVybiBvcHRpb25zXG59XG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlT3B0aW9uc1xuIiwiY29uc3Qge1xuICBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RILFxuICBNQVhfU0FGRV9CVUlMRF9MRU5HVEgsXG4gIE1BWF9MRU5HVEgsXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuL2RlYnVnJylcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9XG5cbi8vIFRoZSBhY3R1YWwgcmVnZXhwcyBnbyBvbiBleHBvcnRzLnJlXG5jb25zdCByZSA9IGV4cG9ydHMucmUgPSBbXVxuY29uc3Qgc2FmZVJlID0gZXhwb3J0cy5zYWZlUmUgPSBbXVxuY29uc3Qgc3JjID0gZXhwb3J0cy5zcmMgPSBbXVxuY29uc3QgdCA9IGV4cG9ydHMudCA9IHt9XG5sZXQgUiA9IDBcblxuY29uc3QgTEVUVEVSREFTSE5VTUJFUiA9ICdbYS16QS1aMC05LV0nXG5cbi8vIFJlcGxhY2Ugc29tZSBncmVlZHkgcmVnZXggdG9rZW5zIHRvIHByZXZlbnQgcmVnZXggZG9zIGlzc3Vlcy4gVGhlc2UgcmVnZXggYXJlXG4vLyB1c2VkIGludGVybmFsbHkgdmlhIHRoZSBzYWZlUmUgb2JqZWN0IHNpbmNlIGFsbCBpbnB1dHMgaW4gdGhpcyBsaWJyYXJ5IGdldFxuLy8gbm9ybWFsaXplZCBmaXJzdCB0byB0cmltIGFuZCBjb2xsYXBzZSBhbGwgZXh0cmEgd2hpdGVzcGFjZS4gVGhlIG9yaWdpbmFsXG4vLyByZWdleGVzIGFyZSBleHBvcnRlZCBmb3IgdXNlcmxhbmQgY29uc3VtcHRpb24gYW5kIGxvd2VyIGxldmVsIHVzYWdlLiBBXG4vLyBmdXR1cmUgYnJlYWtpbmcgY2hhbmdlIGNvdWxkIGV4cG9ydCB0aGUgc2FmZXIgcmVnZXggb25seSB3aXRoIGEgbm90ZSB0aGF0XG4vLyBhbGwgaW5wdXQgc2hvdWxkIGhhdmUgZXh0cmEgd2hpdGVzcGFjZSByZW1vdmVkLlxuY29uc3Qgc2FmZVJlZ2V4UmVwbGFjZW1lbnRzID0gW1xuICBbJ1xcXFxzJywgMV0sXG4gIFsnXFxcXGQnLCBNQVhfTEVOR1RIXSxcbiAgW0xFVFRFUkRBU0hOVU1CRVIsIE1BWF9TQUZFX0JVSUxEX0xFTkdUSF0sXG5dXG5cbmNvbnN0IG1ha2VTYWZlUmVnZXggPSAodmFsdWUpID0+IHtcbiAgZm9yIChjb25zdCBbdG9rZW4sIG1heF0gb2Ygc2FmZVJlZ2V4UmVwbGFjZW1lbnRzKSB7XG4gICAgdmFsdWUgPSB2YWx1ZVxuICAgICAgLnNwbGl0KGAke3Rva2VufSpgKS5qb2luKGAke3Rva2VufXswLCR7bWF4fX1gKVxuICAgICAgLnNwbGl0KGAke3Rva2VufStgKS5qb2luKGAke3Rva2VufXsxLCR7bWF4fX1gKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG5jb25zdCBjcmVhdGVUb2tlbiA9IChuYW1lLCB2YWx1ZSwgaXNHbG9iYWwpID0+IHtcbiAgY29uc3Qgc2FmZSA9IG1ha2VTYWZlUmVnZXgodmFsdWUpXG4gIGNvbnN0IGluZGV4ID0gUisrXG4gIGRlYnVnKG5hbWUsIGluZGV4LCB2YWx1ZSlcbiAgdFtuYW1lXSA9IGluZGV4XG4gIHNyY1tpbmRleF0gPSB2YWx1ZVxuICByZVtpbmRleF0gPSBuZXcgUmVnRXhwKHZhbHVlLCBpc0dsb2JhbCA/ICdnJyA6IHVuZGVmaW5lZClcbiAgc2FmZVJlW2luZGV4XSA9IG5ldyBSZWdFeHAoc2FmZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpXG59XG5cbi8vIFRoZSBmb2xsb3dpbmcgUmVndWxhciBFeHByZXNzaW9ucyBjYW4gYmUgdXNlZCBmb3IgdG9rZW5pemluZyxcbi8vIHZhbGlkYXRpbmcsIGFuZCBwYXJzaW5nIFNlbVZlciB2ZXJzaW9uIHN0cmluZ3MuXG5cbi8vICMjIE51bWVyaWMgSWRlbnRpZmllclxuLy8gQSBzaW5nbGUgYDBgLCBvciBhIG5vbi16ZXJvIGRpZ2l0IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBkaWdpdHMuXG5cbmNyZWF0ZVRva2VuKCdOVU1FUklDSURFTlRJRklFUicsICcwfFsxLTldXFxcXGQqJylcbmNyZWF0ZVRva2VuKCdOVU1FUklDSURFTlRJRklFUkxPT1NFJywgJ1xcXFxkKycpXG5cbi8vICMjIE5vbi1udW1lcmljIElkZW50aWZpZXJcbi8vIFplcm8gb3IgbW9yZSBkaWdpdHMsIGZvbGxvd2VkIGJ5IGEgbGV0dGVyIG9yIGh5cGhlbiwgYW5kIHRoZW4gemVybyBvclxuLy8gbW9yZSBsZXR0ZXJzLCBkaWdpdHMsIG9yIGh5cGhlbnMuXG5cbmNyZWF0ZVRva2VuKCdOT05OVU1FUklDSURFTlRJRklFUicsIGBcXFxcZCpbYS16QS1aLV0ke0xFVFRFUkRBU0hOVU1CRVJ9KmApXG5cbi8vICMjIE1haW4gVmVyc2lvblxuLy8gVGhyZWUgZG90LXNlcGFyYXRlZCBudW1lcmljIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignTUFJTlZFUlNJT04nLCBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuY3JlYXRlVG9rZW4oJ01BSU5WRVJTSU9OTE9PU0UnLCBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19KWApXG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb24gSWRlbnRpZmllclxuLy8gQSBudW1lcmljIGlkZW50aWZpZXIsIG9yIGEgbm9uLW51bWVyaWMgaWRlbnRpZmllci5cblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VJREVOVElGSUVSJywgYCg/OiR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdXG59fCR7c3JjW3QuTk9OTlVNRVJJQ0lERU5USUZJRVJdfSlgKVxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRScsIGAoPzoke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdXG59fCR7c3JjW3QuTk9OTlVNRVJJQ0lERU5USUZJRVJdfSlgKVxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uXG4vLyBIeXBoZW4sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGRvdC1zZXBhcmF0ZWQgcHJlLXJlbGVhc2UgdmVyc2lvblxuLy8gaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFJywgYCg/Oi0oJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUl1cbn0oPzpcXFxcLiR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdfSkqKSlgKVxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUxPT1NFJywgYCg/Oi0/KCR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV1cbn0oPzpcXFxcLiR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV19KSopKWApXG5cbi8vICMjIEJ1aWxkIE1ldGFkYXRhIElkZW50aWZpZXJcbi8vIEFueSBjb21iaW5hdGlvbiBvZiBkaWdpdHMsIGxldHRlcnMsIG9yIGh5cGhlbnMuXG5cbmNyZWF0ZVRva2VuKCdCVUlMRElERU5USUZJRVInLCBgJHtMRVRURVJEQVNITlVNQkVSfStgKVxuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YVxuLy8gUGx1cyBzaWduLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwZXJpb2Qtc2VwYXJhdGVkIGJ1aWxkIG1ldGFkYXRhXG4vLyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ0JVSUxEJywgYCg/OlxcXFwrKCR7c3JjW3QuQlVJTERJREVOVElGSUVSXVxufSg/OlxcXFwuJHtzcmNbdC5CVUlMRElERU5USUZJRVJdfSkqKSlgKVxuXG4vLyAjIyBGdWxsIFZlcnNpb24gU3RyaW5nXG4vLyBBIG1haW4gdmVyc2lvbiwgZm9sbG93ZWQgb3B0aW9uYWxseSBieSBhIHByZS1yZWxlYXNlIHZlcnNpb24gYW5kXG4vLyBidWlsZCBtZXRhZGF0YS5cblxuLy8gTm90ZSB0aGF0IHRoZSBvbmx5IG1ham9yLCBtaW5vciwgcGF0Y2gsIGFuZCBwcmUtcmVsZWFzZSBzZWN0aW9ucyBvZlxuLy8gdGhlIHZlcnNpb24gc3RyaW5nIGFyZSBjYXB0dXJpbmcgZ3JvdXBzLiAgVGhlIGJ1aWxkIG1ldGFkYXRhIGlzIG5vdCBhXG4vLyBjYXB0dXJpbmcgZ3JvdXAsIGJlY2F1c2UgaXQgc2hvdWxkIG5vdCBldmVyIGJlIHVzZWQgaW4gdmVyc2lvblxuLy8gY29tcGFyaXNvbi5cblxuY3JlYXRlVG9rZW4oJ0ZVTExQTEFJTicsIGB2PyR7c3JjW3QuTUFJTlZFUlNJT05dXG59JHtzcmNbdC5QUkVSRUxFQVNFXX0/JHtcbiAgc3JjW3QuQlVJTERdfT9gKVxuXG5jcmVhdGVUb2tlbignRlVMTCcsIGBeJHtzcmNbdC5GVUxMUExBSU5dfSRgKVxuXG4vLyBsaWtlIGZ1bGwsIGJ1dCBhbGxvd3MgdjEuMi4zIGFuZCA9MS4yLjMsIHdoaWNoIHBlb3BsZSBkbyBzb21ldGltZXMuXG4vLyBhbHNvLCAxLjAuMGFscGhhMSAocHJlcmVsZWFzZSB3aXRob3V0IHRoZSBoeXBoZW4pIHdoaWNoIGlzIHByZXR0eVxuLy8gY29tbW9uIGluIHRoZSBucG0gcmVnaXN0cnkuXG5jcmVhdGVUb2tlbignTE9PU0VQTEFJTicsIGBbdj1cXFxcc10qJHtzcmNbdC5NQUlOVkVSU0lPTkxPT1NFXVxufSR7c3JjW3QuUFJFUkVMRUFTRUxPT1NFXX0/JHtcbiAgc3JjW3QuQlVJTERdfT9gKVxuXG5jcmVhdGVUb2tlbignTE9PU0UnLCBgXiR7c3JjW3QuTE9PU0VQTEFJTl19JGApXG5cbmNyZWF0ZVRva2VuKCdHVExUJywgJygoPzo8fD4pPz0/KScpXG5cbi8vIFNvbWV0aGluZyBsaWtlIFwiMi4qXCIgb3IgXCIxLjIueFwiLlxuLy8gTm90ZSB0aGF0IFwieC54XCIgaXMgYSB2YWxpZCB4UmFuZ2UgaWRlbnRpZmVyLCBtZWFuaW5nIFwiYW55IHZlcnNpb25cIlxuLy8gT25seSB0aGUgZmlyc3QgaXRlbSBpcyBzdHJpY3RseSByZXF1aXJlZC5cbmNyZWF0ZVRva2VuKCdYUkFOR0VJREVOVElGSUVSTE9PU0UnLCBgJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX18eHxYfFxcXFwqYClcbmNyZWF0ZVRva2VuKCdYUkFOR0VJREVOVElGSUVSJywgYCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfXx4fFh8XFxcXCpgKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFUExBSU4nLCBgW3Y9XFxcXHNdKigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VdfSk/JHtcbiAgICAgICAgICAgICAgICAgICAgIHNyY1t0LkJVSUxEXX0/YCArXG4gICAgICAgICAgICAgICAgICAgYCk/KT9gKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFUExBSU5MT09TRScsIGBbdj1cXFxcc10qKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRUxPT1NFXX0pPyR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1t0LkJVSUxEXX0/YCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKT8pP2ApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqJHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignWFJBTkdFTE9PU0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQ29lcmNpb24uXG4vLyBFeHRyYWN0IGFueXRoaW5nIHRoYXQgY291bGQgY29uY2VpdmFibHkgYmUgYSBwYXJ0IG9mIGEgdmFsaWQgc2VtdmVyXG5jcmVhdGVUb2tlbignQ09FUkNFUExBSU4nLCBgJHsnKF58W15cXFxcZF0pJyArXG4gICAgICAgICAgICAgICcoXFxcXGR7MSwnfSR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KWAgK1xuICAgICAgICAgICAgICBgKD86XFxcXC4oXFxcXGR7MSwke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSkpP2AgK1xuICAgICAgICAgICAgICBgKD86XFxcXC4oXFxcXGR7MSwke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSkpP2ApXG5jcmVhdGVUb2tlbignQ09FUkNFJywgYCR7c3JjW3QuQ09FUkNFUExBSU5dfSg/OiR8W15cXFxcZF0pYClcbmNyZWF0ZVRva2VuKCdDT0VSQ0VGVUxMJywgc3JjW3QuQ09FUkNFUExBSU5dICtcbiAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRV19KT9gICtcbiAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuQlVJTERdfSk/YCArXG4gICAgICAgICAgICAgIGAoPzokfFteXFxcXGRdKWApXG5jcmVhdGVUb2tlbignQ09FUkNFUlRMJywgc3JjW3QuQ09FUkNFXSwgdHJ1ZSlcbmNyZWF0ZVRva2VuKCdDT0VSQ0VSVExGVUxMJywgc3JjW3QuQ09FUkNFRlVMTF0sIHRydWUpXG5cbi8vIFRpbGRlIHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJyZWFzb25hYmx5IGF0IG9yIGdyZWF0ZXIgdGhhblwiXG5jcmVhdGVUb2tlbignTE9ORVRJTERFJywgJyg/On4+PyknKVxuXG5jcmVhdGVUb2tlbignVElMREVUUklNJywgYChcXFxccyopJHtzcmNbdC5MT05FVElMREVdfVxcXFxzK2AsIHRydWUpXG5leHBvcnRzLnRpbGRlVHJpbVJlcGxhY2UgPSAnJDF+J1xuXG5jcmVhdGVUb2tlbignVElMREUnLCBgXiR7c3JjW3QuTE9ORVRJTERFXX0ke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdUSUxERUxPT1NFJywgYF4ke3NyY1t0LkxPTkVUSUxERV19JHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQ2FyZXQgcmFuZ2VzLlxuLy8gTWVhbmluZyBpcyBcImF0IGxlYXN0IGFuZCBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoXCJcbmNyZWF0ZVRva2VuKCdMT05FQ0FSRVQnLCAnKD86XFxcXF4pJylcblxuY3JlYXRlVG9rZW4oJ0NBUkVUVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuTE9ORUNBUkVUXX1cXFxccytgLCB0cnVlKVxuZXhwb3J0cy5jYXJldFRyaW1SZXBsYWNlID0gJyQxXidcblxuY3JlYXRlVG9rZW4oJ0NBUkVUJywgYF4ke3NyY1t0LkxPTkVDQVJFVF19JHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignQ0FSRVRMT09TRScsIGBeJHtzcmNbdC5MT05FQ0FSRVRdfSR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIEEgc2ltcGxlIGd0L2x0L2VxIHRoaW5nLCBvciBqdXN0IFwiXCIgdG8gaW5kaWNhdGUgXCJhbnkgdmVyc2lvblwiXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUkxPT1NFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKigke3NyY1t0LkxPT1NFUExBSU5dfSkkfF4kYClcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9SJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKigke3NyY1t0LkZVTExQTEFJTl19KSR8XiRgKVxuXG4vLyBBbiBleHByZXNzaW9uIHRvIHN0cmlwIGFueSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIGd0bHQgYW5kIHRoZSB0aGluZ1xuLy8gaXQgbW9kaWZpZXMsIHNvIHRoYXQgYD4gMS4yLjNgID09PiBgPjEuMi4zYFxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JUUklNJywgYChcXFxccyopJHtzcmNbdC5HVExUXVxufVxcXFxzKigke3NyY1t0LkxPT1NFUExBSU5dfXwke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCwgdHJ1ZSlcbmV4cG9ydHMuY29tcGFyYXRvclRyaW1SZXBsYWNlID0gJyQxJDIkMydcblxuLy8gU29tZXRoaW5nIGxpa2UgYDEuMi4zIC0gMS4yLjRgXG4vLyBOb3RlIHRoYXQgdGhlc2UgYWxsIHVzZSB0aGUgbG9vc2UgZm9ybSwgYmVjYXVzZSB0aGV5J2xsIGJlXG4vLyBjaGVja2VkIGFnYWluc3QgZWl0aGVyIHRoZSBzdHJpY3Qgb3IgbG9vc2UgY29tcGFyYXRvciBmb3JtXG4vLyBsYXRlci5cbmNyZWF0ZVRva2VuKCdIWVBIRU5SQU5HRScsIGBeXFxcXHMqKCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgICtcbiAgICAgICAgICAgICAgICAgICBgXFxcXHMrLVxcXFxzK2AgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5YUkFOR0VQTEFJTl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGBcXFxccyokYClcblxuY3JlYXRlVG9rZW4oJ0hZUEhFTlJBTkdFTE9PU0UnLCBgXlxcXFxzKigke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBcXFxccystXFxcXHMrYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYFxcXFxzKiRgKVxuXG4vLyBTdGFyIHJhbmdlcyBiYXNpY2FsbHkganVzdCBhbGxvdyBhbnl0aGluZyBhdCBhbGwuXG5jcmVhdGVUb2tlbignU1RBUicsICcoPHw+KT89P1xcXFxzKlxcXFwqJylcbi8vID49MC4wLjAgaXMgbGlrZSBhIHN0YXJcbmNyZWF0ZVRva2VuKCdHVEUwJywgJ15cXFxccyo+PVxcXFxzKjBcXFxcLjBcXFxcLjBcXFxccyokJylcbmNyZWF0ZVRva2VuKCdHVEUwUFJFJywgJ15cXFxccyo+PVxcXFxzKjBcXFxcLjBcXFxcLjAtMFxcXFxzKiQnKVxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8vIEEgbGlua2VkIGxpc3QgdG8ga2VlcCB0cmFjayBvZiByZWNlbnRseS11c2VkLW5lc3NcbmNvbnN0IFlhbGxpc3QgPSByZXF1aXJlKCd5YWxsaXN0JylcblxuY29uc3QgTUFYID0gU3ltYm9sKCdtYXgnKVxuY29uc3QgTEVOR1RIID0gU3ltYm9sKCdsZW5ndGgnKVxuY29uc3QgTEVOR1RIX0NBTENVTEFUT1IgPSBTeW1ib2woJ2xlbmd0aENhbGN1bGF0b3InKVxuY29uc3QgQUxMT1dfU1RBTEUgPSBTeW1ib2woJ2FsbG93U3RhbGUnKVxuY29uc3QgTUFYX0FHRSA9IFN5bWJvbCgnbWF4QWdlJylcbmNvbnN0IERJU1BPU0UgPSBTeW1ib2woJ2Rpc3Bvc2UnKVxuY29uc3QgTk9fRElTUE9TRV9PTl9TRVQgPSBTeW1ib2woJ25vRGlzcG9zZU9uU2V0JylcbmNvbnN0IExSVV9MSVNUID0gU3ltYm9sKCdscnVMaXN0JylcbmNvbnN0IENBQ0hFID0gU3ltYm9sKCdjYWNoZScpXG5jb25zdCBVUERBVEVfQUdFX09OX0dFVCA9IFN5bWJvbCgndXBkYXRlQWdlT25HZXQnKVxuXG5jb25zdCBuYWl2ZUxlbmd0aCA9ICgpID0+IDFcblxuLy8gbHJ1TGlzdCBpcyBhIHlhbGxpc3Qgd2hlcmUgdGhlIGhlYWQgaXMgdGhlIHlvdW5nZXN0XG4vLyBpdGVtLCBhbmQgdGhlIHRhaWwgaXMgdGhlIG9sZGVzdC4gIHRoZSBsaXN0IGNvbnRhaW5zIHRoZSBIaXRcbi8vIG9iamVjdHMgYXMgdGhlIGVudHJpZXMuXG4vLyBFYWNoIEhpdCBvYmplY3QgaGFzIGEgcmVmZXJlbmNlIHRvIGl0cyBZYWxsaXN0Lk5vZGUuICBUaGlzXG4vLyBuZXZlciBjaGFuZ2VzLlxuLy9cbi8vIGNhY2hlIGlzIGEgTWFwIChvciBQc2V1ZG9NYXApIHRoYXQgbWF0Y2hlcyB0aGUga2V5cyB0b1xuLy8gdGhlIFlhbGxpc3QuTm9kZSBvYmplY3QuXG5jbGFzcyBMUlVDYWNoZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJylcbiAgICAgIG9wdGlvbnMgPSB7IG1heDogb3B0aW9ucyB9XG5cbiAgICBpZiAoIW9wdGlvbnMpXG4gICAgICBvcHRpb25zID0ge31cblxuICAgIGlmIChvcHRpb25zLm1heCAmJiAodHlwZW9mIG9wdGlvbnMubWF4ICE9PSAnbnVtYmVyJyB8fCBvcHRpb25zLm1heCA8IDApKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJylcbiAgICAvLyBLaW5kIG9mIHdlaXJkIHRvIGhhdmUgYSBkZWZhdWx0IG1heCBvZiBJbmZpbml0eSwgYnV0IG9oIHdlbGwuXG4gICAgY29uc3QgbWF4ID0gdGhpc1tNQVhdID0gb3B0aW9ucy5tYXggfHwgSW5maW5pdHlcblxuICAgIGNvbnN0IGxjID0gb3B0aW9ucy5sZW5ndGggfHwgbmFpdmVMZW5ndGhcbiAgICB0aGlzW0xFTkdUSF9DQUxDVUxBVE9SXSA9ICh0eXBlb2YgbGMgIT09ICdmdW5jdGlvbicpID8gbmFpdmVMZW5ndGggOiBsY1xuICAgIHRoaXNbQUxMT1dfU1RBTEVdID0gb3B0aW9ucy5zdGFsZSB8fCBmYWxzZVxuICAgIGlmIChvcHRpb25zLm1heEFnZSAmJiB0eXBlb2Ygb3B0aW9ucy5tYXhBZ2UgIT09ICdudW1iZXInKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4QWdlIG11c3QgYmUgYSBudW1iZXInKVxuICAgIHRoaXNbTUFYX0FHRV0gPSBvcHRpb25zLm1heEFnZSB8fCAwXG4gICAgdGhpc1tESVNQT1NFXSA9IG9wdGlvbnMuZGlzcG9zZVxuICAgIHRoaXNbTk9fRElTUE9TRV9PTl9TRVRdID0gb3B0aW9ucy5ub0Rpc3Bvc2VPblNldCB8fCBmYWxzZVxuICAgIHRoaXNbVVBEQVRFX0FHRV9PTl9HRVRdID0gb3B0aW9ucy51cGRhdGVBZ2VPbkdldCB8fCBmYWxzZVxuICAgIHRoaXMucmVzZXQoKVxuICB9XG5cbiAgLy8gcmVzaXplIHRoZSBjYWNoZSB3aGVuIHRoZSBtYXggY2hhbmdlcy5cbiAgc2V0IG1heCAobUwpIHtcbiAgICBpZiAodHlwZW9mIG1MICE9PSAnbnVtYmVyJyB8fCBtTCA8IDApXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXggbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKVxuXG4gICAgdGhpc1tNQVhdID0gbUwgfHwgSW5maW5pdHlcbiAgICB0cmltKHRoaXMpXG4gIH1cbiAgZ2V0IG1heCAoKSB7XG4gICAgcmV0dXJuIHRoaXNbTUFYXVxuICB9XG5cbiAgc2V0IGFsbG93U3RhbGUgKGFsbG93U3RhbGUpIHtcbiAgICB0aGlzW0FMTE9XX1NUQUxFXSA9ICEhYWxsb3dTdGFsZVxuICB9XG4gIGdldCBhbGxvd1N0YWxlICgpIHtcbiAgICByZXR1cm4gdGhpc1tBTExPV19TVEFMRV1cbiAgfVxuXG4gIHNldCBtYXhBZ2UgKG1BKSB7XG4gICAgaWYgKHR5cGVvZiBtQSAhPT0gJ251bWJlcicpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXhBZ2UgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKVxuXG4gICAgdGhpc1tNQVhfQUdFXSA9IG1BXG4gICAgdHJpbSh0aGlzKVxuICB9XG4gIGdldCBtYXhBZ2UgKCkge1xuICAgIHJldHVybiB0aGlzW01BWF9BR0VdXG4gIH1cblxuICAvLyByZXNpemUgdGhlIGNhY2hlIHdoZW4gdGhlIGxlbmd0aENhbGN1bGF0b3IgY2hhbmdlcy5cbiAgc2V0IGxlbmd0aENhbGN1bGF0b3IgKGxDKSB7XG4gICAgaWYgKHR5cGVvZiBsQyAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgIGxDID0gbmFpdmVMZW5ndGhcblxuICAgIGlmIChsQyAhPT0gdGhpc1tMRU5HVEhfQ0FMQ1VMQVRPUl0pIHtcbiAgICAgIHRoaXNbTEVOR1RIX0NBTENVTEFUT1JdID0gbENcbiAgICAgIHRoaXNbTEVOR1RIXSA9IDBcbiAgICAgIHRoaXNbTFJVX0xJU1RdLmZvckVhY2goaGl0ID0+IHtcbiAgICAgICAgaGl0Lmxlbmd0aCA9IHRoaXNbTEVOR1RIX0NBTENVTEFUT1JdKGhpdC52YWx1ZSwgaGl0LmtleSlcbiAgICAgICAgdGhpc1tMRU5HVEhdICs9IGhpdC5sZW5ndGhcbiAgICAgIH0pXG4gICAgfVxuICAgIHRyaW0odGhpcylcbiAgfVxuICBnZXQgbGVuZ3RoQ2FsY3VsYXRvciAoKSB7IHJldHVybiB0aGlzW0xFTkdUSF9DQUxDVUxBVE9SXSB9XG5cbiAgZ2V0IGxlbmd0aCAoKSB7IHJldHVybiB0aGlzW0xFTkdUSF0gfVxuICBnZXQgaXRlbUNvdW50ICgpIHsgcmV0dXJuIHRoaXNbTFJVX0xJU1RdLmxlbmd0aCB9XG5cbiAgcmZvckVhY2ggKGZuLCB0aGlzcCkge1xuICAgIHRoaXNwID0gdGhpc3AgfHwgdGhpc1xuICAgIGZvciAobGV0IHdhbGtlciA9IHRoaXNbTFJVX0xJU1RdLnRhaWw7IHdhbGtlciAhPT0gbnVsbDspIHtcbiAgICAgIGNvbnN0IHByZXYgPSB3YWxrZXIucHJldlxuICAgICAgZm9yRWFjaFN0ZXAodGhpcywgZm4sIHdhbGtlciwgdGhpc3ApXG4gICAgICB3YWxrZXIgPSBwcmV2XG4gICAgfVxuICB9XG5cbiAgZm9yRWFjaCAoZm4sIHRoaXNwKSB7XG4gICAgdGhpc3AgPSB0aGlzcCB8fCB0aGlzXG4gICAgZm9yIChsZXQgd2Fsa2VyID0gdGhpc1tMUlVfTElTVF0uaGVhZDsgd2Fsa2VyICE9PSBudWxsOykge1xuICAgICAgY29uc3QgbmV4dCA9IHdhbGtlci5uZXh0XG4gICAgICBmb3JFYWNoU3RlcCh0aGlzLCBmbiwgd2Fsa2VyLCB0aGlzcClcbiAgICAgIHdhbGtlciA9IG5leHRcbiAgICB9XG4gIH1cblxuICBrZXlzICgpIHtcbiAgICByZXR1cm4gdGhpc1tMUlVfTElTVF0udG9BcnJheSgpLm1hcChrID0+IGsua2V5KVxuICB9XG5cbiAgdmFsdWVzICgpIHtcbiAgICByZXR1cm4gdGhpc1tMUlVfTElTVF0udG9BcnJheSgpLm1hcChrID0+IGsudmFsdWUpXG4gIH1cblxuICByZXNldCAoKSB7XG4gICAgaWYgKHRoaXNbRElTUE9TRV0gJiZcbiAgICAgICAgdGhpc1tMUlVfTElTVF0gJiZcbiAgICAgICAgdGhpc1tMUlVfTElTVF0ubGVuZ3RoKSB7XG4gICAgICB0aGlzW0xSVV9MSVNUXS5mb3JFYWNoKGhpdCA9PiB0aGlzW0RJU1BPU0VdKGhpdC5rZXksIGhpdC52YWx1ZSkpXG4gICAgfVxuXG4gICAgdGhpc1tDQUNIRV0gPSBuZXcgTWFwKCkgLy8gaGFzaCBvZiBpdGVtcyBieSBrZXlcbiAgICB0aGlzW0xSVV9MSVNUXSA9IG5ldyBZYWxsaXN0KCkgLy8gbGlzdCBvZiBpdGVtcyBpbiBvcmRlciBvZiB1c2UgcmVjZW5jeVxuICAgIHRoaXNbTEVOR1RIXSA9IDAgLy8gbGVuZ3RoIG9mIGl0ZW1zIGluIHRoZSBsaXN0XG4gIH1cblxuICBkdW1wICgpIHtcbiAgICByZXR1cm4gdGhpc1tMUlVfTElTVF0ubWFwKGhpdCA9PlxuICAgICAgaXNTdGFsZSh0aGlzLCBoaXQpID8gZmFsc2UgOiB7XG4gICAgICAgIGs6IGhpdC5rZXksXG4gICAgICAgIHY6IGhpdC52YWx1ZSxcbiAgICAgICAgZTogaGl0Lm5vdyArIChoaXQubWF4QWdlIHx8IDApXG4gICAgICB9KS50b0FycmF5KCkuZmlsdGVyKGggPT4gaClcbiAgfVxuXG4gIGR1bXBMcnUgKCkge1xuICAgIHJldHVybiB0aGlzW0xSVV9MSVNUXVxuICB9XG5cbiAgc2V0IChrZXksIHZhbHVlLCBtYXhBZ2UpIHtcbiAgICBtYXhBZ2UgPSBtYXhBZ2UgfHwgdGhpc1tNQVhfQUdFXVxuXG4gICAgaWYgKG1heEFnZSAmJiB0eXBlb2YgbWF4QWdlICE9PSAnbnVtYmVyJylcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heEFnZSBtdXN0IGJlIGEgbnVtYmVyJylcblxuICAgIGNvbnN0IG5vdyA9IG1heEFnZSA/IERhdGUubm93KCkgOiAwXG4gICAgY29uc3QgbGVuID0gdGhpc1tMRU5HVEhfQ0FMQ1VMQVRPUl0odmFsdWUsIGtleSlcblxuICAgIGlmICh0aGlzW0NBQ0hFXS5oYXMoa2V5KSkge1xuICAgICAgaWYgKGxlbiA+IHRoaXNbTUFYXSkge1xuICAgICAgICBkZWwodGhpcywgdGhpc1tDQUNIRV0uZ2V0KGtleSkpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBub2RlID0gdGhpc1tDQUNIRV0uZ2V0KGtleSlcbiAgICAgIGNvbnN0IGl0ZW0gPSBub2RlLnZhbHVlXG5cbiAgICAgIC8vIGRpc3Bvc2Ugb2YgdGhlIG9sZCBvbmUgYmVmb3JlIG92ZXJ3cml0aW5nXG4gICAgICAvLyBzcGxpdCBvdXQgaW50byAyIGlmcyBmb3IgYmV0dGVyIGNvdmVyYWdlIHRyYWNraW5nXG4gICAgICBpZiAodGhpc1tESVNQT1NFXSkge1xuICAgICAgICBpZiAoIXRoaXNbTk9fRElTUE9TRV9PTl9TRVRdKVxuICAgICAgICAgIHRoaXNbRElTUE9TRV0oa2V5LCBpdGVtLnZhbHVlKVxuICAgICAgfVxuXG4gICAgICBpdGVtLm5vdyA9IG5vd1xuICAgICAgaXRlbS5tYXhBZ2UgPSBtYXhBZ2VcbiAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZVxuICAgICAgdGhpc1tMRU5HVEhdICs9IGxlbiAtIGl0ZW0ubGVuZ3RoXG4gICAgICBpdGVtLmxlbmd0aCA9IGxlblxuICAgICAgdGhpcy5nZXQoa2V5KVxuICAgICAgdHJpbSh0aGlzKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBoaXQgPSBuZXcgRW50cnkoa2V5LCB2YWx1ZSwgbGVuLCBub3csIG1heEFnZSlcblxuICAgIC8vIG92ZXJzaXplZCBvYmplY3RzIGZhbGwgb3V0IG9mIGNhY2hlIGF1dG9tYXRpY2FsbHkuXG4gICAgaWYgKGhpdC5sZW5ndGggPiB0aGlzW01BWF0pIHtcbiAgICAgIGlmICh0aGlzW0RJU1BPU0VdKVxuICAgICAgICB0aGlzW0RJU1BPU0VdKGtleSwgdmFsdWUpXG5cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHRoaXNbTEVOR1RIXSArPSBoaXQubGVuZ3RoXG4gICAgdGhpc1tMUlVfTElTVF0udW5zaGlmdChoaXQpXG4gICAgdGhpc1tDQUNIRV0uc2V0KGtleSwgdGhpc1tMUlVfTElTVF0uaGVhZClcbiAgICB0cmltKHRoaXMpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGhhcyAoa2V5KSB7XG4gICAgaWYgKCF0aGlzW0NBQ0hFXS5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlXG4gICAgY29uc3QgaGl0ID0gdGhpc1tDQUNIRV0uZ2V0KGtleSkudmFsdWVcbiAgICByZXR1cm4gIWlzU3RhbGUodGhpcywgaGl0KVxuICB9XG5cbiAgZ2V0IChrZXkpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSwgdHJ1ZSlcbiAgfVxuXG4gIHBlZWsgKGtleSkge1xuICAgIHJldHVybiBnZXQodGhpcywga2V5LCBmYWxzZSlcbiAgfVxuXG4gIHBvcCAoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXNbTFJVX0xJU1RdLnRhaWxcbiAgICBpZiAoIW5vZGUpXG4gICAgICByZXR1cm4gbnVsbFxuXG4gICAgZGVsKHRoaXMsIG5vZGUpXG4gICAgcmV0dXJuIG5vZGUudmFsdWVcbiAgfVxuXG4gIGRlbCAoa2V5KSB7XG4gICAgZGVsKHRoaXMsIHRoaXNbQ0FDSEVdLmdldChrZXkpKVxuICB9XG5cbiAgbG9hZCAoYXJyKSB7XG4gICAgLy8gcmVzZXQgdGhlIGNhY2hlXG4gICAgdGhpcy5yZXNldCgpXG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgLy8gQSBwcmV2aW91cyBzZXJpYWxpemVkIGNhY2hlIGhhcyB0aGUgbW9zdCByZWNlbnQgaXRlbXMgZmlyc3RcbiAgICBmb3IgKGxldCBsID0gYXJyLmxlbmd0aCAtIDE7IGwgPj0gMDsgbC0tKSB7XG4gICAgICBjb25zdCBoaXQgPSBhcnJbbF1cbiAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IGhpdC5lIHx8IDBcbiAgICAgIGlmIChleHBpcmVzQXQgPT09IDApXG4gICAgICAgIC8vIHRoZSBpdGVtIHdhcyBjcmVhdGVkIHdpdGhvdXQgZXhwaXJhdGlvbiBpbiBhIG5vbiBhZ2VkIGNhY2hlXG4gICAgICAgIHRoaXMuc2V0KGhpdC5rLCBoaXQudilcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBtYXhBZ2UgPSBleHBpcmVzQXQgLSBub3dcbiAgICAgICAgLy8gZG9udCBhZGQgYWxyZWFkeSBleHBpcmVkIGl0ZW1zXG4gICAgICAgIGlmIChtYXhBZ2UgPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXQoaGl0LmssIGhpdC52LCBtYXhBZ2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcnVuZSAoKSB7XG4gICAgdGhpc1tDQUNIRV0uZm9yRWFjaCgodmFsdWUsIGtleSkgPT4gZ2V0KHRoaXMsIGtleSwgZmFsc2UpKVxuICB9XG59XG5cbmNvbnN0IGdldCA9IChzZWxmLCBrZXksIGRvVXNlKSA9PiB7XG4gIGNvbnN0IG5vZGUgPSBzZWxmW0NBQ0hFXS5nZXQoa2V5KVxuICBpZiAobm9kZSkge1xuICAgIGNvbnN0IGhpdCA9IG5vZGUudmFsdWVcbiAgICBpZiAoaXNTdGFsZShzZWxmLCBoaXQpKSB7XG4gICAgICBkZWwoc2VsZiwgbm9kZSlcbiAgICAgIGlmICghc2VsZltBTExPV19TVEFMRV0pXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRvVXNlKSB7XG4gICAgICAgIGlmIChzZWxmW1VQREFURV9BR0VfT05fR0VUXSlcbiAgICAgICAgICBub2RlLnZhbHVlLm5vdyA9IERhdGUubm93KClcbiAgICAgICAgc2VsZltMUlVfTElTVF0udW5zaGlmdE5vZGUobm9kZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhpdC52YWx1ZVxuICB9XG59XG5cbmNvbnN0IGlzU3RhbGUgPSAoc2VsZiwgaGl0KSA9PiB7XG4gIGlmICghaGl0IHx8ICghaGl0Lm1heEFnZSAmJiAhc2VsZltNQVhfQUdFXSkpXG4gICAgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgZGlmZiA9IERhdGUubm93KCkgLSBoaXQubm93XG4gIHJldHVybiBoaXQubWF4QWdlID8gZGlmZiA+IGhpdC5tYXhBZ2VcbiAgICA6IHNlbGZbTUFYX0FHRV0gJiYgKGRpZmYgPiBzZWxmW01BWF9BR0VdKVxufVxuXG5jb25zdCB0cmltID0gc2VsZiA9PiB7XG4gIGlmIChzZWxmW0xFTkdUSF0gPiBzZWxmW01BWF0pIHtcbiAgICBmb3IgKGxldCB3YWxrZXIgPSBzZWxmW0xSVV9MSVNUXS50YWlsO1xuICAgICAgc2VsZltMRU5HVEhdID4gc2VsZltNQVhdICYmIHdhbGtlciAhPT0gbnVsbDspIHtcbiAgICAgIC8vIFdlIGtub3cgdGhhdCB3ZSdyZSBhYm91dCB0byBkZWxldGUgdGhpcyBvbmUsIGFuZCBhbHNvXG4gICAgICAvLyB3aGF0IHRoZSBuZXh0IGxlYXN0IHJlY2VudGx5IHVzZWQga2V5IHdpbGwgYmUsIHNvIGp1c3RcbiAgICAgIC8vIGdvIGFoZWFkIGFuZCBzZXQgaXQgbm93LlxuICAgICAgY29uc3QgcHJldiA9IHdhbGtlci5wcmV2XG4gICAgICBkZWwoc2VsZiwgd2Fsa2VyKVxuICAgICAgd2Fsa2VyID0gcHJldlxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBkZWwgPSAoc2VsZiwgbm9kZSkgPT4ge1xuICBpZiAobm9kZSkge1xuICAgIGNvbnN0IGhpdCA9IG5vZGUudmFsdWVcbiAgICBpZiAoc2VsZltESVNQT1NFXSlcbiAgICAgIHNlbGZbRElTUE9TRV0oaGl0LmtleSwgaGl0LnZhbHVlKVxuXG4gICAgc2VsZltMRU5HVEhdIC09IGhpdC5sZW5ndGhcbiAgICBzZWxmW0NBQ0hFXS5kZWxldGUoaGl0LmtleSlcbiAgICBzZWxmW0xSVV9MSVNUXS5yZW1vdmVOb2RlKG5vZGUpXG4gIH1cbn1cblxuY2xhc3MgRW50cnkge1xuICBjb25zdHJ1Y3RvciAoa2V5LCB2YWx1ZSwgbGVuZ3RoLCBub3csIG1heEFnZSkge1xuICAgIHRoaXMua2V5ID0ga2V5XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgdGhpcy5sZW5ndGggPSBsZW5ndGhcbiAgICB0aGlzLm5vdyA9IG5vd1xuICAgIHRoaXMubWF4QWdlID0gbWF4QWdlIHx8IDBcbiAgfVxufVxuXG5jb25zdCBmb3JFYWNoU3RlcCA9IChzZWxmLCBmbiwgbm9kZSwgdGhpc3ApID0+IHtcbiAgbGV0IGhpdCA9IG5vZGUudmFsdWVcbiAgaWYgKGlzU3RhbGUoc2VsZiwgaGl0KSkge1xuICAgIGRlbChzZWxmLCBub2RlKVxuICAgIGlmICghc2VsZltBTExPV19TVEFMRV0pXG4gICAgICBoaXQgPSB1bmRlZmluZWRcbiAgfVxuICBpZiAoaGl0KVxuICAgIGZuLmNhbGwodGhpc3AsIGhpdC52YWx1ZSwgaGl0LmtleSwgc2VsZilcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMUlVDYWNoZVxuIiwiLy8gRGV0ZXJtaW5lIGlmIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIGFsbCB0aGUgdmVyc2lvbnMgcG9zc2libGUgaW4gdGhlIHJhbmdlLlxuY29uc3Qgb3V0c2lkZSA9IHJlcXVpcmUoJy4vb3V0c2lkZScpXG5jb25zdCBndHIgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsICc+Jywgb3B0aW9ucylcbm1vZHVsZS5leHBvcnRzID0gZ3RyXG4iLCJjb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgaW50ZXJzZWN0cyA9IChyMSwgcjIsIG9wdGlvbnMpID0+IHtcbiAgcjEgPSBuZXcgUmFuZ2UocjEsIG9wdGlvbnMpXG4gIHIyID0gbmV3IFJhbmdlKHIyLCBvcHRpb25zKVxuICByZXR1cm4gcjEuaW50ZXJzZWN0cyhyMiwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gaW50ZXJzZWN0c1xuIiwiY29uc3Qgb3V0c2lkZSA9IHJlcXVpcmUoJy4vb3V0c2lkZScpXG4vLyBEZXRlcm1pbmUgaWYgdmVyc2lvbiBpcyBsZXNzIHRoYW4gYWxsIHRoZSB2ZXJzaW9ucyBwb3NzaWJsZSBpbiB0aGUgcmFuZ2VcbmNvbnN0IGx0ciA9ICh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykgPT4gb3V0c2lkZSh2ZXJzaW9uLCByYW5nZSwgJzwnLCBvcHRpb25zKVxubW9kdWxlLmV4cG9ydHMgPSBsdHJcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5cbmNvbnN0IG1heFNhdGlzZnlpbmcgPSAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIGxldCBtYXggPSBudWxsXG4gIGxldCBtYXhTViA9IG51bGxcbiAgbGV0IHJhbmdlT2JqID0gbnVsbFxuICB0cnkge1xuICAgIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaCgodikgPT4ge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7XG4gICAgICAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgICBpZiAoIW1heCB8fCBtYXhTVi5jb21wYXJlKHYpID09PSAtMSkge1xuICAgICAgICAvLyBjb21wYXJlKG1heCwgdiwgdHJ1ZSlcbiAgICAgICAgbWF4ID0gdlxuICAgICAgICBtYXhTViA9IG5ldyBTZW1WZXIobWF4LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1heFxufVxubW9kdWxlLmV4cG9ydHMgPSBtYXhTYXRpc2Z5aW5nXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgbWluU2F0aXNmeWluZyA9ICh2ZXJzaW9ucywgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgbGV0IG1pbiA9IG51bGxcbiAgbGV0IG1pblNWID0gbnVsbFxuICBsZXQgcmFuZ2VPYmogPSBudWxsXG4gIHRyeSB7XG4gICAgcmFuZ2VPYmogPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICB2ZXJzaW9ucy5mb3JFYWNoKCh2KSA9PiB7XG4gICAgaWYgKHJhbmdlT2JqLnRlc3QodikpIHtcbiAgICAgIC8vIHNhdGlzZmllcyh2LCByYW5nZSwgb3B0aW9ucylcbiAgICAgIGlmICghbWluIHx8IG1pblNWLmNvbXBhcmUodikgPT09IDEpIHtcbiAgICAgICAgLy8gY29tcGFyZShtaW4sIHYsIHRydWUpXG4gICAgICAgIG1pbiA9IHZcbiAgICAgICAgbWluU1YgPSBuZXcgU2VtVmVyKG1pbiwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBtaW5cbn1cbm1vZHVsZS5leHBvcnRzID0gbWluU2F0aXNmeWluZ1xuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0JylcblxuY29uc3QgbWluVmVyc2lvbiA9IChyYW5nZSwgbG9vc2UpID0+IHtcbiAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIGxvb3NlKVxuXG4gIGxldCBtaW52ZXIgPSBuZXcgU2VtVmVyKCcwLjAuMCcpXG4gIGlmIChyYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICBtaW52ZXIgPSBuZXcgU2VtVmVyKCcwLjAuMC0wJylcbiAgaWYgKHJhbmdlLnRlc3QobWludmVyKSkge1xuICAgIHJldHVybiBtaW52ZXJcbiAgfVxuXG4gIG1pbnZlciA9IG51bGxcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZS5zZXQubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlLnNldFtpXVxuXG4gICAgbGV0IHNldE1pbiA9IG51bGxcbiAgICBjb21wYXJhdG9ycy5mb3JFYWNoKChjb21wYXJhdG9yKSA9PiB7XG4gICAgICAvLyBDbG9uZSB0byBhdm9pZCBtYW5pcHVsYXRpbmcgdGhlIGNvbXBhcmF0b3IncyBzZW12ZXIgb2JqZWN0LlxuICAgICAgY29uc3QgY29tcHZlciA9IG5ldyBTZW1WZXIoY29tcGFyYXRvci5zZW12ZXIudmVyc2lvbilcbiAgICAgIHN3aXRjaCAoY29tcGFyYXRvci5vcGVyYXRvcikge1xuICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICBpZiAoY29tcHZlci5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29tcHZlci5wYXRjaCsrXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXB2ZXIucHJlcmVsZWFzZS5wdXNoKDApXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbXB2ZXIucmF3ID0gY29tcHZlci5mb3JtYXQoKVxuICAgICAgICAgIC8qIGZhbGx0aHJvdWdoICovXG4gICAgICAgIGNhc2UgJyc6XG4gICAgICAgIGNhc2UgJz49JzpcbiAgICAgICAgICBpZiAoIXNldE1pbiB8fCBndChjb21wdmVyLCBzZXRNaW4pKSB7XG4gICAgICAgICAgICBzZXRNaW4gPSBjb21wdmVyXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJzwnOlxuICAgICAgICBjYXNlICc8PSc6XG4gICAgICAgICAgLyogSWdub3JlIG1heGltdW0gdmVyc2lvbnMgKi9cbiAgICAgICAgICBicmVha1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBvcGVyYXRpb246ICR7Y29tcGFyYXRvci5vcGVyYXRvcn1gKVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKHNldE1pbiAmJiAoIW1pbnZlciB8fCBndChtaW52ZXIsIHNldE1pbikpKSB7XG4gICAgICBtaW52ZXIgPSBzZXRNaW5cbiAgICB9XG4gIH1cblxuICBpZiAobWludmVyICYmIHJhbmdlLnRlc3QobWludmVyKSkge1xuICAgIHJldHVybiBtaW52ZXJcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IG1pblZlcnNpb25cbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuLi9jbGFzc2VzL2NvbXBhcmF0b3InKVxuY29uc3QgeyBBTlkgfSA9IENvbXBhcmF0b3JcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzJylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0JylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9sdGUnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2d0ZScpXG5cbmNvbnN0IG91dHNpZGUgPSAodmVyc2lvbiwgcmFuZ2UsIGhpbG8sIG9wdGlvbnMpID0+IHtcbiAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgb3B0aW9ucylcbiAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG5cbiAgbGV0IGd0Zm4sIGx0ZWZuLCBsdGZuLCBjb21wLCBlY29tcFxuICBzd2l0Y2ggKGhpbG8pIHtcbiAgICBjYXNlICc+JzpcbiAgICAgIGd0Zm4gPSBndFxuICAgICAgbHRlZm4gPSBsdGVcbiAgICAgIGx0Zm4gPSBsdFxuICAgICAgY29tcCA9ICc+J1xuICAgICAgZWNvbXAgPSAnPj0nXG4gICAgICBicmVha1xuICAgIGNhc2UgJzwnOlxuICAgICAgZ3RmbiA9IGx0XG4gICAgICBsdGVmbiA9IGd0ZVxuICAgICAgbHRmbiA9IGd0XG4gICAgICBjb21wID0gJzwnXG4gICAgICBlY29tcCA9ICc8PSdcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ011c3QgcHJvdmlkZSBhIGhpbG8gdmFsIG9mIFwiPFwiIG9yIFwiPlwiJylcbiAgfVxuXG4gIC8vIElmIGl0IHNhdGlzZmllcyB0aGUgcmFuZ2UgaXQgaXMgbm90IG91dHNpZGVcbiAgaWYgKHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIEZyb20gbm93IG9uLCB2YXJpYWJsZSB0ZXJtcyBhcmUgYXMgaWYgd2UncmUgaW4gXCJndHJcIiBtb2RlLlxuICAvLyBidXQgbm90ZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgZmxpcHBlZCBmb3IgdGhlIFwibHRyXCIgZnVuY3Rpb24uXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZS5zZXQubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlLnNldFtpXVxuXG4gICAgbGV0IGhpZ2ggPSBudWxsXG4gICAgbGV0IGxvdyA9IG51bGxcblxuICAgIGNvbXBhcmF0b3JzLmZvckVhY2goKGNvbXBhcmF0b3IpID0+IHtcbiAgICAgIGlmIChjb21wYXJhdG9yLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICAgIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcignPj0wLjAuMCcpXG4gICAgICB9XG4gICAgICBoaWdoID0gaGlnaCB8fCBjb21wYXJhdG9yXG4gICAgICBsb3cgPSBsb3cgfHwgY29tcGFyYXRvclxuICAgICAgaWYgKGd0Zm4oY29tcGFyYXRvci5zZW12ZXIsIGhpZ2guc2VtdmVyLCBvcHRpb25zKSkge1xuICAgICAgICBoaWdoID0gY29tcGFyYXRvclxuICAgICAgfSBlbHNlIGlmIChsdGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBsb3cuc2VtdmVyLCBvcHRpb25zKSkge1xuICAgICAgICBsb3cgPSBjb21wYXJhdG9yXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIElmIHRoZSBlZGdlIHZlcnNpb24gY29tcGFyYXRvciBoYXMgYSBvcGVyYXRvciB0aGVuIG91ciB2ZXJzaW9uXG4gICAgLy8gaXNuJ3Qgb3V0c2lkZSBpdFxuICAgIGlmIChoaWdoLm9wZXJhdG9yID09PSBjb21wIHx8IGhpZ2gub3BlcmF0b3IgPT09IGVjb21wKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbG93ZXN0IHZlcnNpb24gY29tcGFyYXRvciBoYXMgYW4gb3BlcmF0b3IgYW5kIG91ciB2ZXJzaW9uXG4gICAgLy8gaXMgbGVzcyB0aGFuIGl0IHRoZW4gaXQgaXNuJ3QgaGlnaGVyIHRoYW4gdGhlIHJhbmdlXG4gICAgaWYgKCghbG93Lm9wZXJhdG9yIHx8IGxvdy5vcGVyYXRvciA9PT0gY29tcCkgJiZcbiAgICAgICAgbHRlZm4odmVyc2lvbiwgbG93LnNlbXZlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSBpZiAobG93Lm9wZXJhdG9yID09PSBlY29tcCAmJiBsdGZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdXRzaWRlXG4iLCIvLyBnaXZlbiBhIHNldCBvZiB2ZXJzaW9ucyBhbmQgYSByYW5nZSwgY3JlYXRlIGEgXCJzaW1wbGlmaWVkXCIgcmFuZ2Vcbi8vIHRoYXQgaW5jbHVkZXMgdGhlIHNhbWUgdmVyc2lvbnMgdGhhdCB0aGUgb3JpZ2luYWwgcmFuZ2UgZG9lc1xuLy8gSWYgdGhlIG9yaWdpbmFsIHJhbmdlIGlzIHNob3J0ZXIgdGhhbiB0aGUgc2ltcGxpZmllZCBvbmUsIHJldHVybiB0aGF0LlxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL3NhdGlzZmllcy5qcycpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2NvbXBhcmUuanMnKVxubW9kdWxlLmV4cG9ydHMgPSAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHNldCA9IFtdXG4gIGxldCBmaXJzdCA9IG51bGxcbiAgbGV0IHByZXYgPSBudWxsXG4gIGNvbnN0IHYgPSB2ZXJzaW9ucy5zb3J0KChhLCBiKSA9PiBjb21wYXJlKGEsIGIsIG9wdGlvbnMpKVxuICBmb3IgKGNvbnN0IHZlcnNpb24gb2Ygdikge1xuICAgIGNvbnN0IGluY2x1ZGVkID0gc2F0aXNmaWVzKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKVxuICAgIGlmIChpbmNsdWRlZCkge1xuICAgICAgcHJldiA9IHZlcnNpb25cbiAgICAgIGlmICghZmlyc3QpIHtcbiAgICAgICAgZmlyc3QgPSB2ZXJzaW9uXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgIHNldC5wdXNoKFtmaXJzdCwgcHJldl0pXG4gICAgICB9XG4gICAgICBwcmV2ID0gbnVsbFxuICAgICAgZmlyc3QgPSBudWxsXG4gICAgfVxuICB9XG4gIGlmIChmaXJzdCkge1xuICAgIHNldC5wdXNoKFtmaXJzdCwgbnVsbF0pXG4gIH1cblxuICBjb25zdCByYW5nZXMgPSBbXVxuICBmb3IgKGNvbnN0IFttaW4sIG1heF0gb2Ygc2V0KSB7XG4gICAgaWYgKG1pbiA9PT0gbWF4KSB7XG4gICAgICByYW5nZXMucHVzaChtaW4pXG4gICAgfSBlbHNlIGlmICghbWF4ICYmIG1pbiA9PT0gdlswXSkge1xuICAgICAgcmFuZ2VzLnB1c2goJyonKVxuICAgIH0gZWxzZSBpZiAoIW1heCkge1xuICAgICAgcmFuZ2VzLnB1c2goYD49JHttaW59YClcbiAgICB9IGVsc2UgaWYgKG1pbiA9PT0gdlswXSkge1xuICAgICAgcmFuZ2VzLnB1c2goYDw9JHttYXh9YClcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2VzLnB1c2goYCR7bWlufSAtICR7bWF4fWApXG4gICAgfVxuICB9XG4gIGNvbnN0IHNpbXBsaWZpZWQgPSByYW5nZXMuam9pbignIHx8ICcpXG4gIGNvbnN0IG9yaWdpbmFsID0gdHlwZW9mIHJhbmdlLnJhdyA9PT0gJ3N0cmluZycgPyByYW5nZS5yYXcgOiBTdHJpbmcocmFuZ2UpXG4gIHJldHVybiBzaW1wbGlmaWVkLmxlbmd0aCA8IG9yaWdpbmFsLmxlbmd0aCA/IHNpbXBsaWZpZWQgOiByYW5nZVxufVxuIiwiY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlLmpzJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuLi9jbGFzc2VzL2NvbXBhcmF0b3IuanMnKVxuY29uc3QgeyBBTlkgfSA9IENvbXBhcmF0b3JcbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9zYXRpc2ZpZXMuanMnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jb21wYXJlLmpzJylcblxuLy8gQ29tcGxleCByYW5nZSBgcjEgfHwgcjIgfHwgLi4uYCBpcyBhIHN1YnNldCBvZiBgUjEgfHwgUjIgfHwgLi4uYCBpZmY6XG4vLyAtIEV2ZXJ5IHNpbXBsZSByYW5nZSBgcjEsIHIyLCAuLi5gIGlzIGEgbnVsbCBzZXQsIE9SXG4vLyAtIEV2ZXJ5IHNpbXBsZSByYW5nZSBgcjEsIHIyLCAuLi5gIHdoaWNoIGlzIG5vdCBhIG51bGwgc2V0IGlzIGEgc3Vic2V0IG9mXG4vLyAgIHNvbWUgYFIxLCBSMiwgLi4uYFxuLy9cbi8vIFNpbXBsZSByYW5nZSBgYzEgYzIgLi4uYCBpcyBhIHN1YnNldCBvZiBzaW1wbGUgcmFuZ2UgYEMxIEMyIC4uLmAgaWZmOlxuLy8gLSBJZiBjIGlzIG9ubHkgdGhlIEFOWSBjb21wYXJhdG9yXG4vLyAgIC0gSWYgQyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvciwgcmV0dXJuIHRydWVcbi8vICAgLSBFbHNlIGlmIGluIHByZXJlbGVhc2UgbW9kZSwgcmV0dXJuIGZhbHNlXG4vLyAgIC0gZWxzZSByZXBsYWNlIGMgd2l0aCBgWz49MC4wLjBdYFxuLy8gLSBJZiBDIGlzIG9ubHkgdGhlIEFOWSBjb21wYXJhdG9yXG4vLyAgIC0gaWYgaW4gcHJlcmVsZWFzZSBtb2RlLCByZXR1cm4gdHJ1ZVxuLy8gICAtIGVsc2UgcmVwbGFjZSBDIHdpdGggYFs+PTAuMC4wXWBcbi8vIC0gTGV0IEVRIGJlIHRoZSBzZXQgb2YgPSBjb21wYXJhdG9ycyBpbiBjXG4vLyAtIElmIEVRIGlzIG1vcmUgdGhhbiBvbmUsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vIC0gTGV0IEdUIGJlIHRoZSBoaWdoZXN0ID4gb3IgPj0gY29tcGFyYXRvciBpbiBjXG4vLyAtIExldCBMVCBiZSB0aGUgbG93ZXN0IDwgb3IgPD0gY29tcGFyYXRvciBpbiBjXG4vLyAtIElmIEdUIGFuZCBMVCwgYW5kIEdULnNlbXZlciA+IExULnNlbXZlciwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gLSBJZiBhbnkgQyBpcyBhID0gcmFuZ2UsIGFuZCBHVCBvciBMVCBhcmUgc2V0LCByZXR1cm4gZmFsc2Vcbi8vIC0gSWYgRVFcbi8vICAgLSBJZiBHVCwgYW5kIEVRIGRvZXMgbm90IHNhdGlzZnkgR1QsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vICAgLSBJZiBMVCwgYW5kIEVRIGRvZXMgbm90IHNhdGlzZnkgTFQsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vICAgLSBJZiBFUSBzYXRpc2ZpZXMgZXZlcnkgQywgcmV0dXJuIHRydWVcbi8vICAgLSBFbHNlIHJldHVybiBmYWxzZVxuLy8gLSBJZiBHVFxuLy8gICAtIElmIEdULnNlbXZlciBpcyBsb3dlciB0aGFuIGFueSA+IG9yID49IGNvbXAgaW4gQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgR1QgaXMgPj0sIGFuZCBHVC5zZW12ZXIgZG9lcyBub3Qgc2F0aXNmeSBldmVyeSBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBHVC5zZW12ZXIgaGFzIGEgcHJlcmVsZWFzZSwgYW5kIG5vdCBpbiBwcmVyZWxlYXNlIG1vZGVcbi8vICAgICAtIElmIG5vIEMgaGFzIGEgcHJlcmVsZWFzZSBhbmQgdGhlIEdULnNlbXZlciB0dXBsZSwgcmV0dXJuIGZhbHNlXG4vLyAtIElmIExUXG4vLyAgIC0gSWYgTFQuc2VtdmVyIGlzIGdyZWF0ZXIgdGhhbiBhbnkgPCBvciA8PSBjb21wIGluIEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIExUIGlzIDw9LCBhbmQgTFQuc2VtdmVyIGRvZXMgbm90IHNhdGlzZnkgZXZlcnkgQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgR1Quc2VtdmVyIGhhcyBhIHByZXJlbGVhc2UsIGFuZCBub3QgaW4gcHJlcmVsZWFzZSBtb2RlXG4vLyAgICAgLSBJZiBubyBDIGhhcyBhIHByZXJlbGVhc2UgYW5kIHRoZSBMVC5zZW12ZXIgdHVwbGUsIHJldHVybiBmYWxzZVxuLy8gLSBFbHNlIHJldHVybiB0cnVlXG5cbmNvbnN0IHN1YnNldCA9IChzdWIsIGRvbSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmIChzdWIgPT09IGRvbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBzdWIgPSBuZXcgUmFuZ2Uoc3ViLCBvcHRpb25zKVxuICBkb20gPSBuZXcgUmFuZ2UoZG9tLCBvcHRpb25zKVxuICBsZXQgc2F3Tm9uTnVsbCA9IGZhbHNlXG5cbiAgT1VURVI6IGZvciAoY29uc3Qgc2ltcGxlU3ViIG9mIHN1Yi5zZXQpIHtcbiAgICBmb3IgKGNvbnN0IHNpbXBsZURvbSBvZiBkb20uc2V0KSB7XG4gICAgICBjb25zdCBpc1N1YiA9IHNpbXBsZVN1YnNldChzaW1wbGVTdWIsIHNpbXBsZURvbSwgb3B0aW9ucylcbiAgICAgIHNhd05vbk51bGwgPSBzYXdOb25OdWxsIHx8IGlzU3ViICE9PSBudWxsXG4gICAgICBpZiAoaXNTdWIpIHtcbiAgICAgICAgY29udGludWUgT1VURVJcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdGhlIG51bGwgc2V0IGlzIGEgc3Vic2V0IG9mIGV2ZXJ5dGhpbmcsIGJ1dCBudWxsIHNpbXBsZSByYW5nZXMgaW5cbiAgICAvLyBhIGNvbXBsZXggcmFuZ2Ugc2hvdWxkIGJlIGlnbm9yZWQuICBzbyBpZiB3ZSBzYXcgYSBub24tbnVsbCByYW5nZSxcbiAgICAvLyB0aGVuIHdlIGtub3cgdGhpcyBpc24ndCBhIHN1YnNldCwgYnV0IGlmIEVWRVJZIHNpbXBsZSByYW5nZSB3YXMgbnVsbCxcbiAgICAvLyB0aGVuIGl0IGlzIGEgc3Vic2V0LlxuICAgIGlmIChzYXdOb25OdWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgbWluaW11bVZlcnNpb25XaXRoUHJlUmVsZWFzZSA9IFtuZXcgQ29tcGFyYXRvcignPj0wLjAuMC0wJyldXG5jb25zdCBtaW5pbXVtVmVyc2lvbiA9IFtuZXcgQ29tcGFyYXRvcignPj0wLjAuMCcpXVxuXG5jb25zdCBzaW1wbGVTdWJzZXQgPSAoc3ViLCBkb20sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHN1YiA9PT0gZG9tKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChzdWIubGVuZ3RoID09PSAxICYmIHN1YlswXS5zZW12ZXIgPT09IEFOWSkge1xuICAgIGlmIChkb20ubGVuZ3RoID09PSAxICYmIGRvbVswXS5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgIHN1YiA9IG1pbmltdW1WZXJzaW9uV2l0aFByZVJlbGVhc2VcbiAgICB9IGVsc2Uge1xuICAgICAgc3ViID0gbWluaW11bVZlcnNpb25cbiAgICB9XG4gIH1cblxuICBpZiAoZG9tLmxlbmd0aCA9PT0gMSAmJiBkb21bMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgZG9tID0gbWluaW11bVZlcnNpb25cbiAgICB9XG4gIH1cblxuICBjb25zdCBlcVNldCA9IG5ldyBTZXQoKVxuICBsZXQgZ3QsIGx0XG4gIGZvciAoY29uc3QgYyBvZiBzdWIpIHtcbiAgICBpZiAoYy5vcGVyYXRvciA9PT0gJz4nIHx8IGMub3BlcmF0b3IgPT09ICc+PScpIHtcbiAgICAgIGd0ID0gaGlnaGVyR1QoZ3QsIGMsIG9wdGlvbnMpXG4gICAgfSBlbHNlIGlmIChjLm9wZXJhdG9yID09PSAnPCcgfHwgYy5vcGVyYXRvciA9PT0gJzw9Jykge1xuICAgICAgbHQgPSBsb3dlckxUKGx0LCBjLCBvcHRpb25zKVxuICAgIH0gZWxzZSB7XG4gICAgICBlcVNldC5hZGQoYy5zZW12ZXIpXG4gICAgfVxuICB9XG5cbiAgaWYgKGVxU2V0LnNpemUgPiAxKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGxldCBndGx0Q29tcFxuICBpZiAoZ3QgJiYgbHQpIHtcbiAgICBndGx0Q29tcCA9IGNvbXBhcmUoZ3Quc2VtdmVyLCBsdC5zZW12ZXIsIG9wdGlvbnMpXG4gICAgaWYgKGd0bHRDb21wID4gMCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9IGVsc2UgaWYgKGd0bHRDb21wID09PSAwICYmIChndC5vcGVyYXRvciAhPT0gJz49JyB8fCBsdC5vcGVyYXRvciAhPT0gJzw9JykpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gd2lsbCBpdGVyYXRlIG9uZSBvciB6ZXJvIHRpbWVzXG4gIGZvciAoY29uc3QgZXEgb2YgZXFTZXQpIHtcbiAgICBpZiAoZ3QgJiYgIXNhdGlzZmllcyhlcSwgU3RyaW5nKGd0KSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKGx0ICYmICFzYXRpc2ZpZXMoZXEsIFN0cmluZyhsdCksIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGZvciAoY29uc3QgYyBvZiBkb20pIHtcbiAgICAgIGlmICghc2F0aXNmaWVzKGVxLCBTdHJpbmcoYyksIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBsZXQgaGlnaGVyLCBsb3dlclxuICBsZXQgaGFzRG9tTFQsIGhhc0RvbUdUXG4gIC8vIGlmIHRoZSBzdWJzZXQgaGFzIGEgcHJlcmVsZWFzZSwgd2UgbmVlZCBhIGNvbXBhcmF0b3IgaW4gdGhlIHN1cGVyc2V0XG4gIC8vIHdpdGggdGhlIHNhbWUgdHVwbGUgYW5kIGEgcHJlcmVsZWFzZSwgb3IgaXQncyBub3QgYSBzdWJzZXRcbiAgbGV0IG5lZWREb21MVFByZSA9IGx0ICYmXG4gICAgIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICBsdC5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPyBsdC5zZW12ZXIgOiBmYWxzZVxuICBsZXQgbmVlZERvbUdUUHJlID0gZ3QgJiZcbiAgICAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgIGd0LnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCA/IGd0LnNlbXZlciA6IGZhbHNlXG4gIC8vIGV4Y2VwdGlvbjogPDEuMi4zLTAgaXMgdGhlIHNhbWUgYXMgPDEuMi4zXG4gIGlmIChuZWVkRG9tTFRQcmUgJiYgbmVlZERvbUxUUHJlLnByZXJlbGVhc2UubGVuZ3RoID09PSAxICYmXG4gICAgICBsdC5vcGVyYXRvciA9PT0gJzwnICYmIG5lZWREb21MVFByZS5wcmVyZWxlYXNlWzBdID09PSAwKSB7XG4gICAgbmVlZERvbUxUUHJlID0gZmFsc2VcbiAgfVxuXG4gIGZvciAoY29uc3QgYyBvZiBkb20pIHtcbiAgICBoYXNEb21HVCA9IGhhc0RvbUdUIHx8IGMub3BlcmF0b3IgPT09ICc+JyB8fCBjLm9wZXJhdG9yID09PSAnPj0nXG4gICAgaGFzRG9tTFQgPSBoYXNEb21MVCB8fCBjLm9wZXJhdG9yID09PSAnPCcgfHwgYy5vcGVyYXRvciA9PT0gJzw9J1xuICAgIGlmIChndCkge1xuICAgICAgaWYgKG5lZWREb21HVFByZSkge1xuICAgICAgICBpZiAoYy5zZW12ZXIucHJlcmVsZWFzZSAmJiBjLnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCAmJlxuICAgICAgICAgICAgYy5zZW12ZXIubWFqb3IgPT09IG5lZWREb21HVFByZS5tYWpvciAmJlxuICAgICAgICAgICAgYy5zZW12ZXIubWlub3IgPT09IG5lZWREb21HVFByZS5taW5vciAmJlxuICAgICAgICAgICAgYy5zZW12ZXIucGF0Y2ggPT09IG5lZWREb21HVFByZS5wYXRjaCkge1xuICAgICAgICAgIG5lZWREb21HVFByZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjLm9wZXJhdG9yID09PSAnPicgfHwgYy5vcGVyYXRvciA9PT0gJz49Jykge1xuICAgICAgICBoaWdoZXIgPSBoaWdoZXJHVChndCwgYywgb3B0aW9ucylcbiAgICAgICAgaWYgKGhpZ2hlciA9PT0gYyAmJiBoaWdoZXIgIT09IGd0KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZ3Qub3BlcmF0b3IgPT09ICc+PScgJiYgIXNhdGlzZmllcyhndC5zZW12ZXIsIFN0cmluZyhjKSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsdCkge1xuICAgICAgaWYgKG5lZWREb21MVFByZSkge1xuICAgICAgICBpZiAoYy5zZW12ZXIucHJlcmVsZWFzZSAmJiBjLnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCAmJlxuICAgICAgICAgICAgYy5zZW12ZXIubWFqb3IgPT09IG5lZWREb21MVFByZS5tYWpvciAmJlxuICAgICAgICAgICAgYy5zZW12ZXIubWlub3IgPT09IG5lZWREb21MVFByZS5taW5vciAmJlxuICAgICAgICAgICAgYy5zZW12ZXIucGF0Y2ggPT09IG5lZWREb21MVFByZS5wYXRjaCkge1xuICAgICAgICAgIG5lZWREb21MVFByZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjLm9wZXJhdG9yID09PSAnPCcgfHwgYy5vcGVyYXRvciA9PT0gJzw9Jykge1xuICAgICAgICBsb3dlciA9IGxvd2VyTFQobHQsIGMsIG9wdGlvbnMpXG4gICAgICAgIGlmIChsb3dlciA9PT0gYyAmJiBsb3dlciAhPT0gbHQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsdC5vcGVyYXRvciA9PT0gJzw9JyAmJiAhc2F0aXNmaWVzKGx0LnNlbXZlciwgU3RyaW5nKGMpLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFjLm9wZXJhdG9yICYmIChsdCB8fCBndCkgJiYgZ3RsdENvbXAgIT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZXJlIHdhcyBhIDwgb3IgPiwgYW5kIG5vdGhpbmcgaW4gdGhlIGRvbSwgdGhlbiBtdXN0IGJlIGZhbHNlXG4gIC8vIFVOTEVTUyBpdCB3YXMgbGltaXRlZCBieSBhbm90aGVyIHJhbmdlIGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gIC8vIEVnLCA+MS4wLjAgPDEuMC4xIGlzIHN0aWxsIGEgc3Vic2V0IG9mIDwyLjAuMFxuICBpZiAoZ3QgJiYgaGFzRG9tTFQgJiYgIWx0ICYmIGd0bHRDb21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAobHQgJiYgaGFzRG9tR1QgJiYgIWd0ICYmIGd0bHRDb21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyB3ZSBuZWVkZWQgYSBwcmVyZWxlYXNlIHJhbmdlIGluIGEgc3BlY2lmaWMgdHVwbGUsIGJ1dCBkaWRuJ3QgZ2V0IG9uZVxuICAvLyB0aGVuIHRoaXMgaXNuJ3QgYSBzdWJzZXQuICBlZyA+PTEuMi4zLXByZSBpcyBub3QgYSBzdWJzZXQgb2YgPj0xLjAuMCxcbiAgLy8gYmVjYXVzZSBpdCBpbmNsdWRlcyBwcmVyZWxlYXNlcyBpbiB0aGUgMS4yLjMgdHVwbGVcbiAgaWYgKG5lZWREb21HVFByZSB8fCBuZWVkRG9tTFRQcmUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vID49MS4yLjMgaXMgbG93ZXIgdGhhbiA+MS4yLjNcbmNvbnN0IGhpZ2hlckdUID0gKGEsIGIsIG9wdGlvbnMpID0+IHtcbiAgaWYgKCFhKSB7XG4gICAgcmV0dXJuIGJcbiAgfVxuICBjb25zdCBjb21wID0gY29tcGFyZShhLnNlbXZlciwgYi5zZW12ZXIsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wID4gMCA/IGFcbiAgICA6IGNvbXAgPCAwID8gYlxuICAgIDogYi5vcGVyYXRvciA9PT0gJz4nICYmIGEub3BlcmF0b3IgPT09ICc+PScgPyBiXG4gICAgOiBhXG59XG5cbi8vIDw9MS4yLjMgaXMgaGlnaGVyIHRoYW4gPDEuMi4zXG5jb25zdCBsb3dlckxUID0gKGEsIGIsIG9wdGlvbnMpID0+IHtcbiAgaWYgKCFhKSB7XG4gICAgcmV0dXJuIGJcbiAgfVxuICBjb25zdCBjb21wID0gY29tcGFyZShhLnNlbXZlciwgYi5zZW12ZXIsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wIDwgMCA/IGFcbiAgICA6IGNvbXAgPiAwID8gYlxuICAgIDogYi5vcGVyYXRvciA9PT0gJzwnICYmIGEub3BlcmF0b3IgPT09ICc8PScgPyBiXG4gICAgOiBhXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3Vic2V0XG4iLCJjb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuXG4vLyBNb3N0bHkganVzdCBmb3IgdGVzdGluZyBhbmQgbGVnYWN5IEFQSSByZWFzb25zXG5jb25zdCB0b0NvbXBhcmF0b3JzID0gKHJhbmdlLCBvcHRpb25zKSA9PlxuICBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpLnNldFxuICAgIC5tYXAoY29tcCA9PiBjb21wLm1hcChjID0+IGMudmFsdWUpLmpvaW4oJyAnKS50cmltKCkuc3BsaXQoJyAnKSlcblxubW9kdWxlLmV4cG9ydHMgPSB0b0NvbXBhcmF0b3JzXG4iLCJjb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3QgdmFsaWRSYW5nZSA9IChyYW5nZSwgb3B0aW9ucykgPT4ge1xuICB0cnkge1xuICAgIC8vIFJldHVybiAnKicgaW5zdGVhZCBvZiAnJyBzbyB0aGF0IHRydXRoaW5lc3Mgd29ya3MuXG4gICAgLy8gVGhpcyB3aWxsIHRocm93IGlmIGl0J3MgaW52YWxpZCBhbnl3YXlcbiAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKS5yYW5nZSB8fCAnKidcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHZhbGlkUmFuZ2VcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuLy8gVGhlIGRlZmF1bHQgQnVmZmVyIHNpemUgaWYgb25lIGlzIG5vdCBwcm92aWRlZC5cbmNvbnN0IERFRkFVTFRfU01BUlRCVUZGRVJfU0laRSA9IDQwOTY7XG4vLyBUaGUgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcgdG8gdXNlIGZvciByZWFkaW5nL3dyaXRpbmcgc3RyaW5ncy5cbmNvbnN0IERFRkFVTFRfU01BUlRCVUZGRVJfRU5DT0RJTkcgPSAndXRmOCc7XG5jbGFzcyBTbWFydEJ1ZmZlciB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIHsgU21hcnRCdWZmZXJPcHRpb25zIH0gVGhlIFNtYXJ0QnVmZmVyT3B0aW9ucyB0byBhcHBseSB0byB0aGlzIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9lbmNvZGluZyA9IERFRkFVTFRfU01BUlRCVUZGRVJfRU5DT0RJTkc7XG4gICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5fcmVhZE9mZnNldCA9IDA7XG4gICAgICAgIGlmIChTbWFydEJ1ZmZlci5pc1NtYXJ0QnVmZmVyT3B0aW9ucyhvcHRpb25zKSkge1xuICAgICAgICAgICAgLy8gQ2hlY2tzIGZvciBlbmNvZGluZ1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICAgICAgICAgICAgICB1dGlsc18xLmNoZWNrRW5jb2Rpbmcob3B0aW9ucy5lbmNvZGluZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2tzIGZvciBpbml0aWFsIHNpemUgbGVuZ3RoXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zaXplKSB7XG4gICAgICAgICAgICAgICAgaWYgKHV0aWxzXzEuaXNGaW5pdGVJbnRlZ2VyKG9wdGlvbnMuc2l6ZSkgJiYgb3B0aW9ucy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9idWZmID0gQnVmZmVyLmFsbG9jVW5zYWZlKG9wdGlvbnMuc2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodXRpbHNfMS5FUlJPUlMuSU5WQUxJRF9TTUFSVEJVRkZFUl9TSVpFKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGluaXRpYWwgQnVmZmVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmJ1ZmYpIHtcbiAgICAgICAgICAgICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9wdGlvbnMuYnVmZikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnVmZiA9IG9wdGlvbnMuYnVmZjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBvcHRpb25zLmJ1ZmYubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHV0aWxzXzEuRVJST1JTLklOVkFMSURfU01BUlRCVUZGRVJfQlVGRkVSKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9idWZmID0gQnVmZmVyLmFsbG9jVW5zYWZlKERFRkFVTFRfU01BUlRCVUZGRVJfU0laRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2FzIHBhc3NlZCBidXQgaXQncyBub3QgYSBTbWFydEJ1ZmZlck9wdGlvbnMgb2JqZWN0XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHV0aWxzXzEuRVJST1JTLklOVkFMSURfU01BUlRCVUZGRVJfT0JKRUNUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBkZWZhdWx0IHRvIHNhbmUgb3B0aW9uc1xuICAgICAgICAgICAgdGhpcy5fYnVmZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShERUZBVUxUX1NNQVJUQlVGRkVSX1NJWkUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU21hcnRCdWZmZXIgaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgaW50ZXJuYWwgQnVmZmVyIHNpemUgYW5kIG9wdGlvbmFsIGVuY29kaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNpemUgeyBOdW1iZXIgfSBUaGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgQnVmZmVyLlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgU21hcnRCdWZmZXIgfVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tU2l6ZShzaXplLCBlbmNvZGluZykge1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMoe1xuICAgICAgICAgICAgc2l6ZTogc2l6ZSxcbiAgICAgICAgICAgIGVuY29kaW5nOiBlbmNvZGluZ1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTbWFydEJ1ZmZlciBpbnN0YW5jZSB3aXRoIHRoZSBwcm92aWRlZCBCdWZmZXIgYW5kIG9wdGlvbmFsIGVuY29kaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJ1ZmZlciB7IEJ1ZmZlciB9IFRoZSBCdWZmZXIgdG8gdXNlIGFzIHRoZSBpbnRlcm5hbCBCdWZmZXIgdmFsdWUuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIHsgU3RyaW5nIH0gVGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZSBmb3Igc3RyaW5ncy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBTbWFydEJ1ZmZlciB9XG4gICAgICovXG4gICAgc3RhdGljIGZyb21CdWZmZXIoYnVmZiwgZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKHtcbiAgICAgICAgICAgIGJ1ZmY6IGJ1ZmYsXG4gICAgICAgICAgICBlbmNvZGluZzogZW5jb2RpbmdcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU21hcnRCdWZmZXIgaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgU21hcnRCdWZmZXJPcHRpb25zIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyB7IFNtYXJ0QnVmZmVyT3B0aW9ucyB9IFRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IHRoaXMob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFR5cGUgY2hlY2tpbmcgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBpcyBhIFNtYXJ0QnVmZmVyT3B0aW9ucyBvYmplY3QuXG4gICAgICovXG4gICAgc3RhdGljIGlzU21hcnRCdWZmZXJPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY2FzdE9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICByZXR1cm4gKGNhc3RPcHRpb25zICYmXG4gICAgICAgICAgICAoY2FzdE9wdGlvbnMuZW5jb2RpbmcgIT09IHVuZGVmaW5lZCB8fCBjYXN0T3B0aW9ucy5zaXplICE9PSB1bmRlZmluZWQgfHwgY2FzdE9wdGlvbnMuYnVmZiAhPT0gdW5kZWZpbmVkKSk7XG4gICAgfVxuICAgIC8vIFNpZ25lZCBpbnRlZ2Vyc1xuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIEludDggdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRJbnQ4KG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDgsIDEsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIEludDE2QkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRJbnQxNkJFKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUsIDIsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIEludDE2TEUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRJbnQxNkxFKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUsIDIsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIEludDMyQkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRJbnQzMkJFKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUsIDQsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIEludDMyTEUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRJbnQzMkxFKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUsIDQsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgQmlnSW50NjRCRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IEJpZ0ludCB9XG4gICAgICovXG4gICAgcmVhZEJpZ0ludDY0QkUob2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygncmVhZEJpZ0ludDY0QkUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRCaWdJbnQ2NEJFLCA4LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIEJpZ0ludDY0TEUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBCaWdJbnQgfVxuICAgICAqL1xuICAgIHJlYWRCaWdJbnQ2NExFKG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3JlYWRCaWdJbnQ2NExFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnSW50NjRMRSwgOCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIEludDggdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVJbnQ4KHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCwgMSwgdmFsdWUsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIEludDggdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEludDgodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDgsIDEsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYW4gSW50MTZCRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUludDE2QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSwgMiwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gSW50MTZCRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0SW50MTZCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSwgMiwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBJbnQxNkxFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlSW50MTZMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFLCAyLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBJbnQxNkxFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRJbnQxNkxFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFLCAyLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIEludDMyQkUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVJbnQzMkJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIEludDMyQkUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEludDMyQkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYW4gSW50MzJMRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUludDMyTEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSwgNCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gSW50MzJMRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0SW50MzJMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSwgNCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIEJpZ0ludDY0QkUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCaWdJbnQgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVCaWdJbnQ2NEJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCd3cml0ZUJpZ0ludDY0QkUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgQmlnSW50NjRCRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgQmlnSW50IH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0QmlnSW50NjRCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygnd3JpdGVCaWdJbnQ2NEJFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlQmlnSW50NjRCRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIEJpZ0ludDY0TEUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCaWdJbnQgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVCaWdJbnQ2NExFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCd3cml0ZUJpZ0ludDY0TEUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0TEUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgSW50NjRMRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgQmlnSW50IH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0QmlnSW50NjRMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygnd3JpdGVCaWdJbnQ2NExFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlQmlnSW50NjRMRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8vIFVuc2lnbmVkIEludGVnZXJzXG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gVUludDggdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRVSW50OChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCwgMSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gVUludDE2QkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRVSW50MTZCRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSwgMiwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gVUludDE2TEUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRVSW50MTZMRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSwgMiwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gVUludDMyQkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRVSW50MzJCRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSwgNCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gVUludDMyTEUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWRVSW50MzJMRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSwgNCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBCaWdVSW50NjRCRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IEJpZ0ludCB9XG4gICAgICovXG4gICAgcmVhZEJpZ1VJbnQ2NEJFKG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3JlYWRCaWdVSW50NjRCRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NEJFLCA4LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIEJpZ1VJbnQ2NExFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgQmlnSW50IH1cbiAgICAgKi9cbiAgICByZWFkQmlnVUludDY0TEUob2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygncmVhZEJpZ1VJbnQ2NExFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnVUludDY0TEUsIDgsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBVSW50OCB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZVVJbnQ4KHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4LCAxLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBVSW50OCB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0VUludDgodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4LCAxLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIFVJbnQxNkJFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlVUludDE2QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUsIDIsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIFVJbnQxNkJFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRVSW50MTZCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUsIDIsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYW4gVUludDE2TEUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVVSW50MTZMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSwgMiwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gVUludDE2TEUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydFVJbnQxNkxFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSwgMiwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBVSW50MzJCRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZVVJbnQzMkJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBVSW50MzJCRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0VUludDMyQkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIFVJbnQzMkxFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlVUludDMyTEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIFVJbnQzMkxFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRVSW50MzJMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBCaWdVSW50NjRCRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUJpZ1VJbnQ2NEJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCd3cml0ZUJpZ1VJbnQ2NEJFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRCRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBCaWdVSW50NjRCRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0QmlnVUludDY0QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3dyaXRlQmlnVUludDY0QkUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRCRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIEJpZ1VJbnQ2NExFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlQmlnVUludDY0TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3dyaXRlQmlnVUludDY0TEUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIEJpZ1VJbnQ2NExFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRCaWdVSW50NjRMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygnd3JpdGVCaWdVSW50NjRMRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gRmxvYXRpbmcgUG9pbnRcbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBGbG9hdEJFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkRmxvYXRCRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFLCA0LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBGbG9hdExFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkRmxvYXRMRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFLCA0LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBGbG9hdEJFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlRmxvYXRCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIEZsb2F0QkUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEZsb2F0QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBGbG9hdExFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlRmxvYXRMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIEZsb2F0TEUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEZsb2F0TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvLyBEb3VibGUgRmxvYXRpbmcgUG9pbnRcbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBEb3VibEVCRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IE51bWJlciB9XG4gICAgICovXG4gICAgcmVhZERvdWJsZUJFKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFLCA4LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBEb3VibGVMRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IE51bWJlciB9XG4gICAgICovXG4gICAgcmVhZERvdWJsZUxFKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFLCA4LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBEb3VibGVCRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZURvdWJsZUJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIERvdWJsZUJFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnREb3VibGVCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBEb3VibGVMRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZURvdWJsZUxFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIERvdWJsZUxFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnREb3VibGVMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvLyBTdHJpbmdzXG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBTdHJpbmcgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFyZzEgeyBOdW1iZXIgfCBTdHJpbmcgfSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgYXMgYSBTdHJpbmcsIG9yIHRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yXG4gICAgICogICAgICAgICAgICAgdGhlIHN0cmluZyAoRGVmYXVsdHMgdG8gaW5zdGFuY2UgbGV2ZWwgZW5jb2RpbmcpLlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHRoZSBzdHJpbmcgKERlZmF1bHRzIHRvIGluc3RhbmNlIGxldmVsIGVuY29kaW5nKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBTdHJpbmcgfVxuICAgICAqL1xuICAgIHJlYWRTdHJpbmcoYXJnMSwgZW5jb2RpbmcpIHtcbiAgICAgICAgbGV0IGxlbmd0aFZhbDtcbiAgICAgICAgLy8gTGVuZ3RoIHByb3ZpZGVkXG4gICAgICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tMZW5ndGhWYWx1ZShhcmcxKTtcbiAgICAgICAgICAgIGxlbmd0aFZhbCA9IE1hdGgubWluKGFyZzEsIHRoaXMubGVuZ3RoIC0gdGhpcy5fcmVhZE9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbmNvZGluZyA9IGFyZzE7XG4gICAgICAgICAgICBsZW5ndGhWYWwgPSB0aGlzLmxlbmd0aCAtIHRoaXMuX3JlYWRPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgZW5jb2RpbmdcbiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tFbmNvZGluZyhlbmNvZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9idWZmLnNsaWNlKHRoaXMuX3JlYWRPZmZzZXQsIHRoaXMuX3JlYWRPZmZzZXQgKyBsZW5ndGhWYWwpLnRvU3RyaW5nKGVuY29kaW5nIHx8IHRoaXMuX2VuY29kaW5nKTtcbiAgICAgICAgdGhpcy5fcmVhZE9mZnNldCArPSBsZW5ndGhWYWw7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIFN0cmluZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgU3RyaW5nIH0gVGhlIFN0cmluZyB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSBzdHJpbmcgYXQuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIHsgU3RyaW5nIH0gVGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZSBmb3Igd3JpdGluZyBzdHJpbmdzIChkZWZhdWx0cyB0byBpbnN0YW5jZSBlbmNvZGluZykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRTdHJpbmcodmFsdWUsIG9mZnNldCwgZW5jb2RpbmcpIHtcbiAgICAgICAgdXRpbHNfMS5jaGVja09mZnNldFZhbHVlKG9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVTdHJpbmcodmFsdWUsIHRydWUsIG9mZnNldCwgZW5jb2RpbmcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBTdHJpbmdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IFN0cmluZyB9IFRoZSBTdHJpbmcgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIGFyZzIgeyBOdW1iZXIgfCBTdHJpbmcgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBzdHJpbmcgYXQsIG9yIHRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIHsgU3RyaW5nIH0gVGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZSBmb3Igd3JpdGluZyBzdHJpbmdzIChkZWZhdWx0cyB0byBpbnN0YW5jZSBlbmNvZGluZykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZVN0cmluZyh2YWx1ZSwgYXJnMiwgZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZVN0cmluZyh2YWx1ZSwgZmFsc2UsIGFyZzIsIGVuY29kaW5nKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBudWxsLXRlcm1pbmF0ZWQgU3RyaW5nIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHRoZSBzdHJpbmcgKERlZmF1bHRzIHRvIGluc3RhbmNlIGxldmVsIGVuY29kaW5nKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBTdHJpbmcgfVxuICAgICAqL1xuICAgIHJlYWRTdHJpbmdOVChlbmNvZGluZykge1xuICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdXRpbHNfMS5jaGVja0VuY29kaW5nKGVuY29kaW5nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgbnVsbCBjaGFyYWN0ZXIgcG9zaXRpb24gdG8gdGhlIGVuZCBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgICAgbGV0IG51bGxQb3MgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgLy8gRmluZCBuZXh0IG51bGwgY2hhcmFjdGVyIChpZiBvbmUgaXMgbm90IGZvdW5kLCBkZWZhdWx0IGZyb20gYWJvdmUgaXMgdXNlZClcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3JlYWRPZmZzZXQ7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYnVmZltpXSA9PT0gMHgwMCkge1xuICAgICAgICAgICAgICAgIG51bGxQb3MgPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlYWQgc3RyaW5nIHZhbHVlXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fYnVmZi5zbGljZSh0aGlzLl9yZWFkT2Zmc2V0LCBudWxsUG9zKTtcbiAgICAgICAgLy8gSW5jcmVtZW50IGludGVybmFsIEJ1ZmZlciByZWFkIG9mZnNldFxuICAgICAgICB0aGlzLl9yZWFkT2Zmc2V0ID0gbnVsbFBvcyArIDE7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZyhlbmNvZGluZyB8fCB0aGlzLl9lbmNvZGluZyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBudWxsLXRlcm1pbmF0ZWQgU3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgU3RyaW5nIH0gVGhlIFN0cmluZyB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gYXJnMiB7IE51bWJlciB8IFN0cmluZyB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHN0cmluZyB0bywgb3IgdGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvciB3cml0aW5nIHN0cmluZ3MgKGRlZmF1bHRzIHRvIGluc3RhbmNlIGVuY29kaW5nKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydFN0cmluZ05UKHZhbHVlLCBvZmZzZXQsIGVuY29kaW5nKSB7XG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICAvLyBXcml0ZSBWYWx1ZXNcbiAgICAgICAgdGhpcy5pbnNlcnRTdHJpbmcodmFsdWUsIG9mZnNldCwgZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmluc2VydFVJbnQ4KDB4MDAsIG9mZnNldCArIHZhbHVlLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBudWxsLXRlcm1pbmF0ZWQgU3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgU3RyaW5nIH0gVGhlIFN0cmluZyB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gYXJnMiB7IE51bWJlciB8IFN0cmluZyB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHN0cmluZyB0bywgb3IgdGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvciB3cml0aW5nIHN0cmluZ3MgKGRlZmF1bHRzIHRvIGluc3RhbmNlIGVuY29kaW5nKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlU3RyaW5nTlQodmFsdWUsIGFyZzIsIGVuY29kaW5nKSB7XG4gICAgICAgIC8vIFdyaXRlIFZhbHVlc1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKHZhbHVlLCBhcmcyLCBlbmNvZGluZyk7XG4gICAgICAgIHRoaXMud3JpdGVVSW50OCgweDAwLCB0eXBlb2YgYXJnMiA9PT0gJ251bWJlcicgPyBhcmcyICsgdmFsdWUubGVuZ3RoIDogdGhpcy53cml0ZU9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBCdWZmZXJzXG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBCdWZmZXIgZnJvbSB0aGUgaW50ZXJuYWwgcmVhZCBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZW5ndGggeyBOdW1iZXIgfSBUaGUgbGVuZ3RoIG9mIGRhdGEgdG8gcmVhZCBhcyBhIEJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBCdWZmZXIgfVxuICAgICAqL1xuICAgIHJlYWRCdWZmZXIobGVuZ3RoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbGVuZ3RoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdXRpbHNfMS5jaGVja0xlbmd0aFZhbHVlKGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVuZ3RoVmFsID0gdHlwZW9mIGxlbmd0aCA9PT0gJ251bWJlcicgPyBsZW5ndGggOiB0aGlzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSBNYXRoLm1pbih0aGlzLmxlbmd0aCwgdGhpcy5fcmVhZE9mZnNldCArIGxlbmd0aFZhbCk7XG4gICAgICAgIC8vIFJlYWQgYnVmZmVyIHZhbHVlXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fYnVmZi5zbGljZSh0aGlzLl9yZWFkT2Zmc2V0LCBlbmRQb2ludCk7XG4gICAgICAgIC8vIEluY3JlbWVudCBpbnRlcm5hbCBCdWZmZXIgcmVhZCBvZmZzZXRcbiAgICAgICAgdGhpcy5fcmVhZE9mZnNldCA9IGVuZFBvaW50O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIEJ1ZmZlciB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IEJ1ZmZlciB9IFRoZSBCdWZmZXIgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIEJ1ZmZlciB0by5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEJ1ZmZlcih2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlQnVmZmVyKHZhbHVlLCB0cnVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBCdWZmZXIgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCdWZmZXIgfSBUaGUgQnVmZmVyIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBCdWZmZXIgdG8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUJ1ZmZlcih2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVCdWZmZXIodmFsdWUsIGZhbHNlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIG51bGwtdGVybWluYXRlZCBCdWZmZXIgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvaXNpdG9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7IEJ1ZmZlciB9XG4gICAgICovXG4gICAgcmVhZEJ1ZmZlck5UKCkge1xuICAgICAgICAvLyBTZXQgbnVsbCBjaGFyYWN0ZXIgcG9zaXRpb24gdG8gdGhlIGVuZCBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgICAgbGV0IG51bGxQb3MgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgLy8gRmluZCBuZXh0IG51bGwgY2hhcmFjdGVyIChpZiBvbmUgaXMgbm90IGZvdW5kLCBkZWZhdWx0IGZyb20gYWJvdmUgaXMgdXNlZClcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuX3JlYWRPZmZzZXQ7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYnVmZltpXSA9PT0gMHgwMCkge1xuICAgICAgICAgICAgICAgIG51bGxQb3MgPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFJlYWQgdmFsdWVcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9idWZmLnNsaWNlKHRoaXMuX3JlYWRPZmZzZXQsIG51bGxQb3MpO1xuICAgICAgICAvLyBJbmNyZW1lbnQgaW50ZXJuYWwgQnVmZmVyIHJlYWQgb2Zmc2V0XG4gICAgICAgIHRoaXMuX3JlYWRPZmZzZXQgPSBudWxsUG9zICsgMTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgbnVsbC10ZXJtaW5hdGVkIEJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IEJ1ZmZlciB9IFRoZSBCdWZmZXIgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIEJ1ZmZlciB0by5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEJ1ZmZlck5UKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5jaGVja09mZnNldFZhbHVlKG9mZnNldCk7XG4gICAgICAgIC8vIFdyaXRlIFZhbHVlc1xuICAgICAgICB0aGlzLmluc2VydEJ1ZmZlcih2YWx1ZSwgb2Zmc2V0KTtcbiAgICAgICAgdGhpcy5pbnNlcnRVSW50OCgweDAwLCBvZmZzZXQgKyB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgbnVsbC10ZXJtaW5hdGVkIEJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IEJ1ZmZlciB9IFRoZSBCdWZmZXIgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIEJ1ZmZlciB0by5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlQnVmZmVyTlQodmFsdWUsIG9mZnNldCkge1xuICAgICAgICAvLyBDaGVja3MgZm9yIHZhbGlkIG51bWJlcmljIHZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdyaXRlIFZhbHVlc1xuICAgICAgICB0aGlzLndyaXRlQnVmZmVyKHZhbHVlLCBvZmZzZXQpO1xuICAgICAgICB0aGlzLndyaXRlVUludDgoMHgwMCwgdHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicgPyBvZmZzZXQgKyB2YWx1ZS5sZW5ndGggOiB0aGlzLl93cml0ZU9mZnNldCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIFNtYXJ0QnVmZmVyIGluc3RhbmNlIHRvIGl0cyBvcmlnaW5hbCBlbXB0eSBzdGF0ZS5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgPSAwO1xuICAgICAgICB0aGlzLl9yZWFkT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcmVtYWluaW5nIGRhdGEgbGVmdCB0byBiZSByZWFkIGZyb20gdGhlIFNtYXJ0QnVmZmVyIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7IE51bWJlciB9XG4gICAgICovXG4gICAgcmVtYWluaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggLSB0aGlzLl9yZWFkT2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHJlYWQgb2Zmc2V0IHZhbHVlIG9mIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIGdldCByZWFkT2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE9mZnNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVhZCBvZmZzZXQgdmFsdWUgb2YgdGhlIFNtYXJ0QnVmZmVyIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IC0gVGhlIG9mZnNldCB2YWx1ZSB0byBzZXQuXG4gICAgICovXG4gICAgc2V0IHJlYWRPZmZzZXQob2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICAvLyBDaGVjayBmb3IgYm91bmRzLlxuICAgICAgICB1dGlsc18xLmNoZWNrVGFyZ2V0T2Zmc2V0KG9mZnNldCwgdGhpcyk7XG4gICAgICAgIHRoaXMuX3JlYWRPZmZzZXQgPSBvZmZzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgd3JpdGUgb2Zmc2V0IHZhbHVlIG9mIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIGdldCB3cml0ZU9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlT2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB3cml0ZSBvZmZzZXQgdmFsdWUgb2YgdGhlIFNtYXJ0QnVmZmVyIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IC0gVGhlIG9mZnNldCB2YWx1ZSB0byBzZXQuXG4gICAgICovXG4gICAgc2V0IHdyaXRlT2Zmc2V0KG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGJvdW5kcy5cbiAgICAgICAgdXRpbHNfMS5jaGVja1RhcmdldE9mZnNldChvZmZzZXQsIHRoaXMpO1xuICAgICAgICB0aGlzLl93cml0ZU9mZnNldCA9IG9mZnNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudGx5IHNldCBzdHJpbmcgZW5jb2Rpbmcgb2YgdGhlIFNtYXJ0QnVmZmVyIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHJldHVybiB7IEJ1ZmZlckVuY29kaW5nIH0gVGhlIHN0cmluZyBCdWZmZXIgZW5jb2RpbmcgY3VycmVudGx5IHNldC5cbiAgICAgKi9cbiAgICBnZXQgZW5jb2RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RyaW5nIGVuY29kaW5nIG9mIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IEJ1ZmZlckVuY29kaW5nIH0gVGhlIHN0cmluZyBCdWZmZXIgZW5jb2RpbmcgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldCBlbmNvZGluZyhlbmNvZGluZykge1xuICAgICAgICB1dGlsc18xLmNoZWNrRW5jb2RpbmcoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLl9lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIGludGVybmFsIEJ1ZmZlci4gKFRoaXMgaW5jbHVkZXMgdW5tYW5hZ2VkIGRhdGEgaW4gdGhlIEJ1ZmZlcilcbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBCdWZmZXIgfSBUaGUgQnVmZmVyIHZhbHVlLlxuICAgICAqL1xuICAgIGdldCBpbnRlcm5hbEJ1ZmZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmY7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbnRlcm5hbCBtYW5hZ2VkIEJ1ZmZlciAoSW5jbHVkZXMgbWFuYWdlZCBkYXRhIG9ubHkpXG4gICAgICpcbiAgICAgKiBAcGFyYW0geyBCdWZmZXIgfVxuICAgICAqL1xuICAgIHRvQnVmZmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVmZi5zbGljZSgwLCB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgaW50ZXJuYWwgbWFuYWdlZCBCdWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byBkaXNwbGF5IHRoZSBCdWZmZXIgYXMgKGRlZmF1bHRzIHRvIGluc3RhbmNlIGxldmVsIGVuY29kaW5nKS5cbiAgICAgKi9cbiAgICB0b1N0cmluZyhlbmNvZGluZykge1xuICAgICAgICBjb25zdCBlbmNvZGluZ1ZhbCA9IHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgPyBlbmNvZGluZyA6IHRoaXMuX2VuY29kaW5nO1xuICAgICAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBlbmNvZGluZy5cbiAgICAgICAgdXRpbHNfMS5jaGVja0VuY29kaW5nKGVuY29kaW5nVmFsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmYudG9TdHJpbmcoZW5jb2RpbmdWYWwsIDAsIHRoaXMubGVuZ3RoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhlIFNtYXJ0QnVmZmVyIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaW5zZXJ0aW5nIGFuZCB3cml0aW5nIHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBTdHJpbmcgfSBUaGUgU3RyaW5nIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gaXNJbnNlcnQgeyBCb29sZWFuIH0gVHJ1ZSBpZiBpbnNlcnRpbmcgYSBzdHJpbmcsIGZhbHNlIGlmIHdyaXRpbmcuXG4gICAgICogQHBhcmFtIGFyZzIgeyBOdW1iZXIgfCBTdHJpbmcgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgc3RyaW5nIGF0LCBvciB0aGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlLlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHdyaXRpbmcgc3RyaW5ncyAoZGVmYXVsdHMgdG8gaW5zdGFuY2UgZW5jb2RpbmcpLlxuICAgICAqL1xuICAgIF9oYW5kbGVTdHJpbmcodmFsdWUsIGlzSW5zZXJ0LCBhcmczLCBlbmNvZGluZykge1xuICAgICAgICBsZXQgb2Zmc2V0VmFsID0gdGhpcy5fd3JpdGVPZmZzZXQ7XG4gICAgICAgIGxldCBlbmNvZGluZ1ZhbCA9IHRoaXMuX2VuY29kaW5nO1xuICAgICAgICAvLyBDaGVjayBmb3Igb2Zmc2V0XG4gICAgICAgIGlmICh0eXBlb2YgYXJnMyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIG9mZnNldFZhbCA9IGFyZzM7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgZW5jb2RpbmdcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgYXJnMyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tFbmNvZGluZyhhcmczKTtcbiAgICAgICAgICAgIGVuY29kaW5nVmFsID0gYXJnMztcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBmb3IgZW5jb2RpbmcgKHRoaXJkIHBhcmFtKVxuICAgICAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdXRpbHNfMS5jaGVja0VuY29kaW5nKGVuY29kaW5nKTtcbiAgICAgICAgICAgIGVuY29kaW5nVmFsID0gZW5jb2Rpbmc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGJ5dGVsZW5ndGggb2Ygc3RyaW5nLlxuICAgICAgICBjb25zdCBieXRlTGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUsIGVuY29kaW5nVmFsKTtcbiAgICAgICAgLy8gRW5zdXJlIHRoZXJlIGlzIGVub3VnaCBpbnRlcm5hbCBCdWZmZXIgY2FwYWNpdHkuXG4gICAgICAgIGlmIChpc0luc2VydCkge1xuICAgICAgICAgICAgdGhpcy5lbnN1cmVJbnNlcnRhYmxlKGJ5dGVMZW5ndGgsIG9mZnNldFZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbnN1cmVXcml0ZWFibGUoYnl0ZUxlbmd0aCwgb2Zmc2V0VmFsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXcml0ZSB2YWx1ZVxuICAgICAgICB0aGlzLl9idWZmLndyaXRlKHZhbHVlLCBvZmZzZXRWYWwsIGJ5dGVMZW5ndGgsIGVuY29kaW5nVmFsKTtcbiAgICAgICAgLy8gSW5jcmVtZW50IGludGVybmFsIEJ1ZmZlciB3cml0ZSBvZmZzZXQ7XG4gICAgICAgIGlmIChpc0luc2VydCkge1xuICAgICAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgKz0gYnl0ZUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIGFuIG9mZnNldCB3YXMgZ2l2ZW4sIGNoZWNrIHRvIHNlZSBpZiB3ZSB3cm90ZSBiZXlvbmQgdGhlIGN1cnJlbnQgd3JpdGVPZmZzZXQuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZzMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgPSBNYXRoLm1heCh0aGlzLl93cml0ZU9mZnNldCwgb2Zmc2V0VmFsICsgYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBubyBvZmZzZXQgd2FzIGdpdmVuLCB3ZSB3cm90ZSB0byB0aGUgZW5kIG9mIHRoZSBTbWFydEJ1ZmZlciBzbyBpbmNyZW1lbnQgd3JpdGVPZmZzZXQuXG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgKz0gYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3cml0aW5nIG9yIGluc2VydCBvZiBhIEJ1ZmZlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IEJ1ZmZlciB9IFRoZSBCdWZmZXIgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIEJ1ZmZlciB0by5cbiAgICAgKi9cbiAgICBfaGFuZGxlQnVmZmVyKHZhbHVlLCBpc0luc2VydCwgb2Zmc2V0KSB7XG4gICAgICAgIGNvbnN0IG9mZnNldFZhbCA9IHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInID8gb2Zmc2V0IDogdGhpcy5fd3JpdGVPZmZzZXQ7XG4gICAgICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggaW50ZXJuYWwgQnVmZmVyIGNhcGFjaXR5LlxuICAgICAgICBpZiAoaXNJbnNlcnQpIHtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlSW5zZXJ0YWJsZSh2YWx1ZS5sZW5ndGgsIG9mZnNldFZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lbnN1cmVXcml0ZWFibGUodmFsdWUubGVuZ3RoLCBvZmZzZXRWYWwpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdyaXRlIGJ1ZmZlciB2YWx1ZVxuICAgICAgICB2YWx1ZS5jb3B5KHRoaXMuX2J1ZmYsIG9mZnNldFZhbCk7XG4gICAgICAgIC8vIEluY3JlbWVudCBpbnRlcm5hbCBCdWZmZXIgd3JpdGUgb2Zmc2V0O1xuICAgICAgICBpZiAoaXNJbnNlcnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIGFuIG9mZnNldCB3YXMgZ2l2ZW4sIGNoZWNrIHRvIHNlZSBpZiB3ZSB3cm90ZSBiZXlvbmQgdGhlIGN1cnJlbnQgd3JpdGVPZmZzZXQuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93cml0ZU9mZnNldCA9IE1hdGgubWF4KHRoaXMuX3dyaXRlT2Zmc2V0LCBvZmZzZXRWYWwgKyB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbm8gb2Zmc2V0IHdhcyBnaXZlbiwgd2Ugd3JvdGUgdG8gdGhlIGVuZCBvZiB0aGUgU21hcnRCdWZmZXIgc28gaW5jcmVtZW50IHdyaXRlT2Zmc2V0LlxuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5zdXJlcyB0aGF0IHRoZSBpbnRlcm5hbCBCdWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIHJlYWQgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsZW5ndGggeyBOdW1iZXIgfSBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgcmVhZC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHJlYWQuXG4gICAgICovXG4gICAgZW5zdXJlUmVhZGFibGUobGVuZ3RoLCBvZmZzZXQpIHtcbiAgICAgICAgLy8gT2Zmc2V0IHZhbHVlIGRlZmF1bHRzIHRvIG1hbmFnZWQgcmVhZCBvZmZzZXQuXG4gICAgICAgIGxldCBvZmZzZXRWYWwgPSB0aGlzLl9yZWFkT2Zmc2V0O1xuICAgICAgICAvLyBJZiBhbiBvZmZzZXQgd2FzIHByb3ZpZGVkLCB1c2UgaXQuXG4gICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gQ2hlY2tzIGZvciB2YWxpZCBudW1iZXJpYyB2YWx1ZTtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICAgICAgLy8gT3ZlcmlkZSB3aXRoIGN1c3RvbSBvZmZzZXQuXG4gICAgICAgICAgICBvZmZzZXRWYWwgPSBvZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2tzIGlmIG9mZnNldCBpcyBiZWxvdyB6ZXJvLCBvciB0aGUgb2Zmc2V0K2xlbmd0aCBvZmZzZXQgaXMgYmV5b25kIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIG1hbmFnZWQgZGF0YS5cbiAgICAgICAgaWYgKG9mZnNldFZhbCA8IDAgfHwgb2Zmc2V0VmFsICsgbGVuZ3RoID4gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih1dGlsc18xLkVSUk9SUy5JTlZBTElEX1JFQURfQkVZT05EX0JPVU5EUyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5zdXJlcyB0aGF0IHRoZSBpbnRlcm5hbCBCdWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGluc2VydCBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFMZW5ndGggeyBOdW1iZXIgfSBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgd3JpdHRlbi5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byBiZSB3cml0dGVuLlxuICAgICAqL1xuICAgIGVuc3VyZUluc2VydGFibGUoZGF0YUxlbmd0aCwgb2Zmc2V0KSB7XG4gICAgICAgIC8vIENoZWNrcyBmb3IgdmFsaWQgbnVtYmVyaWMgdmFsdWU7XG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICAvLyBFbnN1cmUgdGhlcmUgaXMgZW5vdWdoIGludGVybmFsIEJ1ZmZlciBjYXBhY2l0eS5cbiAgICAgICAgdGhpcy5fZW5zdXJlQ2FwYWNpdHkodGhpcy5sZW5ndGggKyBkYXRhTGVuZ3RoKTtcbiAgICAgICAgLy8gSWYgYW4gb2Zmc2V0IHdhcyBwcm92aWRlZCBhbmQgaXRzIG5vdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGJ1ZmZlciwgY29weSBkYXRhIGludG8gYXBwcm9wcmlhdGUgbG9jYXRpb24gaW4gcmVnYXJkcyB0byB0aGUgb2Zmc2V0LlxuICAgICAgICBpZiAob2Zmc2V0IDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2J1ZmYuY29weSh0aGlzLl9idWZmLCBvZmZzZXQgKyBkYXRhTGVuZ3RoLCBvZmZzZXQsIHRoaXMuX2J1ZmYubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGp1c3QgdHJhY2tlZCBzbWFydCBidWZmZXIgbGVuZ3RoXG4gICAgICAgIGlmIChvZmZzZXQgKyBkYXRhTGVuZ3RoID4gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gb2Zmc2V0ICsgZGF0YUxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoICs9IGRhdGFMZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5zdXJlcyB0aGF0IHRoZSBpbnRlcm5hbCBCdWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIHdyaXRlIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YUxlbmd0aCB7IE51bWJlciB9IFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdGhhdCBuZWVkcyB0byBiZSB3cml0dGVuLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IG9mIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gKGRlZmF1bHRzIHRvIHdyaXRlT2Zmc2V0KS5cbiAgICAgKi9cbiAgICBfZW5zdXJlV3JpdGVhYmxlKGRhdGFMZW5ndGgsIG9mZnNldCkge1xuICAgICAgICBjb25zdCBvZmZzZXRWYWwgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJyA/IG9mZnNldCA6IHRoaXMuX3dyaXRlT2Zmc2V0O1xuICAgICAgICAvLyBFbnN1cmUgZW5vdWdoIGNhcGFjaXR5IHRvIHdyaXRlIGRhdGEuXG4gICAgICAgIHRoaXMuX2Vuc3VyZUNhcGFjaXR5KG9mZnNldFZhbCArIGRhdGFMZW5ndGgpO1xuICAgICAgICAvLyBBZGp1c3QgU21hcnRCdWZmZXIgbGVuZ3RoIChpZiBvZmZzZXQgKyBsZW5ndGggaXMgbGFyZ2VyIHRoYW4gbWFuYWdlZCBsZW5ndGgsIGFkanVzdCBsZW5ndGgpXG4gICAgICAgIGlmIChvZmZzZXRWYWwgKyBkYXRhTGVuZ3RoID4gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gb2Zmc2V0VmFsICsgZGF0YUxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIGludGVybmFsIEJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gd3JpdGUgYXQgbGVhc3QgdGhlIGdpdmVuIGFtb3VudCBvZiBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1pbkxlbmd0aCB7IE51bWJlciB9IFRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgZGF0YSBuZWVkcyB0byBiZSB3cml0dGVuLlxuICAgICAqL1xuICAgIF9lbnN1cmVDYXBhY2l0eShtaW5MZW5ndGgpIHtcbiAgICAgICAgY29uc3Qgb2xkTGVuZ3RoID0gdGhpcy5fYnVmZi5sZW5ndGg7XG4gICAgICAgIGlmIChtaW5MZW5ndGggPiBvbGRMZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5fYnVmZjtcbiAgICAgICAgICAgIGxldCBuZXdMZW5ndGggPSAob2xkTGVuZ3RoICogMykgLyAyICsgMTtcbiAgICAgICAgICAgIGlmIChuZXdMZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBuZXdMZW5ndGggPSBtaW5MZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9idWZmID0gQnVmZmVyLmFsbG9jVW5zYWZlKG5ld0xlbmd0aCk7XG4gICAgICAgICAgICBkYXRhLmNvcHkodGhpcy5fYnVmZiwgMCwgMCwgb2xkTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIG51bWVyaWMgbnVtYmVyIHZhbHVlIHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEB0eXBlcGFyYW0gVCB7IG51bWJlciB8IGJpZ2ludCB9IFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSB0byBiZSByZWFkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZnVuYyB7IEZ1bmN0aW9uKG9mZnNldDogbnVtYmVyKSA9PiBudW1iZXIgfSBUaGUgZnVuY3Rpb24gdG8gcmVhZCBkYXRhIG9uIHRoZSBpbnRlcm5hbCBCdWZmZXIgd2l0aC5cbiAgICAgKiBAcGFyYW0gYnl0ZVNpemUgeyBOdW1iZXIgfSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBmcm9tIChvcHRpb25hbCkuIFdoZW4gdGhpcyBpcyBub3QgcHJvdmlkZWQsIHRoZSBtYW5hZ2VkIHJlYWRPZmZzZXQgaXMgdXNlZCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgeyBUIH0gdGhlIG51bWJlciB2YWx1ZVxuICAgICAqL1xuICAgIF9yZWFkTnVtYmVyVmFsdWUoZnVuYywgYnl0ZVNpemUsIG9mZnNldCkge1xuICAgICAgICB0aGlzLmVuc3VyZVJlYWRhYmxlKGJ5dGVTaXplLCBvZmZzZXQpO1xuICAgICAgICAvLyBDYWxsIEJ1ZmZlci5yZWFkWFhYWCgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGZ1bmMuY2FsbCh0aGlzLl9idWZmLCB0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJyA/IG9mZnNldCA6IHRoaXMuX3JlYWRPZmZzZXQpO1xuICAgICAgICAvLyBBZGp1c3QgaW50ZXJuYWwgcmVhZCBvZmZzZXQgaWYgYW4gb3B0aW9uYWwgcmVhZCBvZmZzZXQgd2FzIG5vdCBwcm92aWRlZC5cbiAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkT2Zmc2V0ICs9IGJ5dGVTaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIG51bWVyaWMgbnVtYmVyIHZhbHVlIGJhc2VkIG9uIHRoZSBnaXZlbiBvZmZzZXQgYW5kIHZhbHVlLlxuICAgICAqXG4gICAgICogQHR5cGVwYXJhbSBUIHsgbnVtYmVyIHwgYmlnaW50IH0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmdW5jIHsgRnVuY3Rpb24ob2Zmc2V0OiBULCBvZmZzZXQ/KSA9PiBudW1iZXJ9IFRoZSBmdW5jdGlvbiB0byB3cml0ZSBkYXRhIG9uIHRoZSBpbnRlcm5hbCBCdWZmZXIgd2l0aC5cbiAgICAgKiBAcGFyYW0gYnl0ZVNpemUgeyBOdW1iZXIgfSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uXG4gICAgICogQHBhcmFtIHZhbHVlIHsgVCB9IFRoZSBudW1iZXIgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IHRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIG51bWJlciBhdCAoUkVRVUlSRUQpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgU21hcnRCdWZmZXIgdGhpcyBidWZmZXJcbiAgICAgKi9cbiAgICBfaW5zZXJ0TnVtYmVyVmFsdWUoZnVuYywgYnl0ZVNpemUsIHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgb2Zmc2V0IHZhbHVlcy5cbiAgICAgICAgdXRpbHNfMS5jaGVja09mZnNldFZhbHVlKG9mZnNldCk7XG4gICAgICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggaW50ZXJuYWwgQnVmZmVyIGNhcGFjaXR5LiAocmF3IG9mZnNldCBpcyBwYXNzZWQpXG4gICAgICAgIHRoaXMuZW5zdXJlSW5zZXJ0YWJsZShieXRlU2l6ZSwgb2Zmc2V0KTtcbiAgICAgICAgLy8gQ2FsbCBidWZmZXIud3JpdGVYWFhYKCk7XG4gICAgICAgIGZ1bmMuY2FsbCh0aGlzLl9idWZmLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICAgICAgLy8gQWRqdXN0cyBpbnRlcm5hbGx5IG1hbmFnZWQgd3JpdGUgb2Zmc2V0LlxuICAgICAgICB0aGlzLl93cml0ZU9mZnNldCArPSBieXRlU2l6ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIG51bWVyaWMgbnVtYmVyIHZhbHVlIGJhc2VkIG9uIHRoZSBnaXZlbiBvZmZzZXQgYW5kIHZhbHVlLlxuICAgICAqXG4gICAgICogQHR5cGVwYXJhbSBUIHsgbnVtYmVyIHwgYmlnaW50IH0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmdW5jIHsgRnVuY3Rpb24ob2Zmc2V0OiBULCBvZmZzZXQ/KSA9PiBudW1iZXJ9IFRoZSBmdW5jdGlvbiB0byB3cml0ZSBkYXRhIG9uIHRoZSBpbnRlcm5hbCBCdWZmZXIgd2l0aC5cbiAgICAgKiBAcGFyYW0gYnl0ZVNpemUgeyBOdW1iZXIgfSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uXG4gICAgICogQHBhcmFtIHZhbHVlIHsgVCB9IFRoZSBudW1iZXIgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IHRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIG51bWJlciBhdCAoUkVRVUlSRUQpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgU21hcnRCdWZmZXIgdGhpcyBidWZmZXJcbiAgICAgKi9cbiAgICBfd3JpdGVOdW1iZXJWYWx1ZShmdW5jLCBieXRlU2l6ZSwgdmFsdWUsIG9mZnNldCkge1xuICAgICAgICAvLyBJZiBhbiBvZmZzZXQgd2FzIHByb3ZpZGVkLCB2YWxpZGF0ZSBpdC5cbiAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSB3cml0aW5nIGJleW9uZCB0aGUgYm91bmRzIG9mIHRoZSBtYW5hZ2VkIGRhdGEuXG4gICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih1dGlsc18xLkVSUk9SUy5JTlZBTElEX1dSSVRFX0JFWU9ORF9CT1VORFMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXRpbHNfMS5jaGVja09mZnNldFZhbHVlKG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVmYXVsdCB0byB3cml0ZU9mZnNldCBpZiBubyBvZmZzZXQgdmFsdWUgd2FzIGdpdmVuLlxuICAgICAgICBjb25zdCBvZmZzZXRWYWwgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJyA/IG9mZnNldCA6IHRoaXMuX3dyaXRlT2Zmc2V0O1xuICAgICAgICAvLyBFbnN1cmUgdGhlcmUgaXMgZW5vdWdoIGludGVybmFsIEJ1ZmZlciBjYXBhY2l0eS4gKHJhdyBvZmZzZXQgaXMgcGFzc2VkKVxuICAgICAgICB0aGlzLl9lbnN1cmVXcml0ZWFibGUoYnl0ZVNpemUsIG9mZnNldFZhbCk7XG4gICAgICAgIGZ1bmMuY2FsbCh0aGlzLl9idWZmLCB2YWx1ZSwgb2Zmc2V0VmFsKTtcbiAgICAgICAgLy8gSWYgYW4gb2Zmc2V0IHdhcyBnaXZlbiwgY2hlY2sgdG8gc2VlIGlmIHdlIHdyb3RlIGJleW9uZCB0aGUgY3VycmVudCB3cml0ZU9mZnNldC5cbiAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLl93cml0ZU9mZnNldCA9IE1hdGgubWF4KHRoaXMuX3dyaXRlT2Zmc2V0LCBvZmZzZXRWYWwgKyBieXRlU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBubyBudW1lcmljIG9mZnNldCB3YXMgZ2l2ZW4sIHdlIHdyb3RlIHRvIHRoZSBlbmQgb2YgdGhlIFNtYXJ0QnVmZmVyIHNvIGluY3JlbWVudCB3cml0ZU9mZnNldC5cbiAgICAgICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ICs9IGJ5dGVTaXplO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbmV4cG9ydHMuU21hcnRCdWZmZXIgPSBTbWFydEJ1ZmZlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNtYXJ0YnVmZmVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgYnVmZmVyXzEgPSByZXF1aXJlKFwiYnVmZmVyXCIpO1xuLyoqXG4gKiBFcnJvciBzdHJpbmdzXG4gKi9cbmNvbnN0IEVSUk9SUyA9IHtcbiAgICBJTlZBTElEX0VOQ09ESU5HOiAnSW52YWxpZCBlbmNvZGluZyBwcm92aWRlZC4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBlbmNvZGluZyB0aGUgaW50ZXJuYWwgTm9kZS5qcyBCdWZmZXIgc3VwcG9ydHMuJyxcbiAgICBJTlZBTElEX1NNQVJUQlVGRkVSX1NJWkU6ICdJbnZhbGlkIHNpemUgcHJvdmlkZWQuIFNpemUgbXVzdCBiZSBhIHZhbGlkIGludGVnZXIgZ3JlYXRlciB0aGFuIHplcm8uJyxcbiAgICBJTlZBTElEX1NNQVJUQlVGRkVSX0JVRkZFUjogJ0ludmFsaWQgQnVmZmVyIHByb3ZpZGVkIGluIFNtYXJ0QnVmZmVyT3B0aW9ucy4nLFxuICAgIElOVkFMSURfU01BUlRCVUZGRVJfT0JKRUNUOiAnSW52YWxpZCBTbWFydEJ1ZmZlck9wdGlvbnMgb2JqZWN0IHN1cHBsaWVkIHRvIFNtYXJ0QnVmZmVyIGNvbnN0cnVjdG9yIG9yIGZhY3RvcnkgbWV0aG9kcy4nLFxuICAgIElOVkFMSURfT0ZGU0VUOiAnQW4gaW52YWxpZCBvZmZzZXQgdmFsdWUgd2FzIHByb3ZpZGVkLicsXG4gICAgSU5WQUxJRF9PRkZTRVRfTk9OX05VTUJFUjogJ0FuIGludmFsaWQgb2Zmc2V0IHZhbHVlIHdhcyBwcm92aWRlZC4gQSBudW1lcmljIHZhbHVlIGlzIHJlcXVpcmVkLicsXG4gICAgSU5WQUxJRF9MRU5HVEg6ICdBbiBpbnZhbGlkIGxlbmd0aCB2YWx1ZSB3YXMgcHJvdmlkZWQuJyxcbiAgICBJTlZBTElEX0xFTkdUSF9OT05fTlVNQkVSOiAnQW4gaW52YWxpZCBsZW5ndGggdmFsdWUgd2FzIHByb3ZpdmVkLiBBIG51bWVyaWMgdmFsdWUgaXMgcmVxdWlyZWQuJyxcbiAgICBJTlZBTElEX1RBUkdFVF9PRkZTRVQ6ICdUYXJnZXQgb2Zmc2V0IGlzIGJleW9uZCB0aGUgYm91bmRzIG9mIHRoZSBpbnRlcm5hbCBTbWFydEJ1ZmZlciBkYXRhLicsXG4gICAgSU5WQUxJRF9UQVJHRVRfTEVOR1RIOiAnU3BlY2lmaWVkIGxlbmd0aCB2YWx1ZSBtb3ZlcyBjdXJzb3IgYmV5b25nIHRoZSBib3VuZHMgb2YgdGhlIGludGVybmFsIFNtYXJ0QnVmZmVyIGRhdGEuJyxcbiAgICBJTlZBTElEX1JFQURfQkVZT05EX0JPVU5EUzogJ0F0dGVtcHRlZCB0byByZWFkIGJleW9uZCB0aGUgYm91bmRzIG9mIHRoZSBtYW5hZ2VkIGRhdGEuJyxcbiAgICBJTlZBTElEX1dSSVRFX0JFWU9ORF9CT1VORFM6ICdBdHRlbXB0ZWQgdG8gd3JpdGUgYmV5b25kIHRoZSBib3VuZHMgb2YgdGhlIG1hbmFnZWQgZGF0YS4nXG59O1xuZXhwb3J0cy5FUlJPUlMgPSBFUlJPUlM7XG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIGVuY29kaW5nIGlzIGEgdmFsaWQgQnVmZmVyIGVuY29kaW5nLiAoVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBjaGVjayBmYWlscylcbiAqXG4gKiBAcGFyYW0geyBTdHJpbmcgfSBlbmNvZGluZyBUaGUgZW5jb2Rpbmcgc3RyaW5nIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjaGVja0VuY29kaW5nKGVuY29kaW5nKSB7XG4gICAgaWYgKCFidWZmZXJfMS5CdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SUy5JTlZBTElEX0VOQ09ESU5HKTtcbiAgICB9XG59XG5leHBvcnRzLmNoZWNrRW5jb2RpbmcgPSBjaGVja0VuY29kaW5nO1xuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBudW1iZXIgaXMgYSBmaW5pdGUgaW50ZWdlci4gKFRocm93cyBhbiBleGNlcHRpb24gaWYgY2hlY2sgZmFpbHMpXG4gKlxuICogQHBhcmFtIHsgTnVtYmVyIH0gdmFsdWUgVGhlIG51bWJlciB2YWx1ZSB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gaXNGaW5pdGVJbnRlZ2VyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsdWUpICYmIGlzSW50ZWdlcih2YWx1ZSk7XG59XG5leHBvcnRzLmlzRmluaXRlSW50ZWdlciA9IGlzRmluaXRlSW50ZWdlcjtcbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9mZnNldC9sZW5ndGggdmFsdWUgaXMgdmFsaWQuIChUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGNoZWNrIGZhaWxzKVxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0gb2Zmc2V0IFRydWUgaWYgY2hlY2tpbmcgYW4gb2Zmc2V0LCBmYWxzZSBpZiBjaGVja2luZyBhIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXRPckxlbmd0aFZhbHVlKHZhbHVlLCBvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBDaGVjayBmb3Igbm9uIGZpbml0ZS9ub24gaW50ZWdlcnNcbiAgICAgICAgaWYgKCFpc0Zpbml0ZUludGVnZXIodmFsdWUpIHx8IHZhbHVlIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG9mZnNldCA/IEVSUk9SUy5JTlZBTElEX09GRlNFVCA6IEVSUk9SUy5JTlZBTElEX0xFTkdUSCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihvZmZzZXQgPyBFUlJPUlMuSU5WQUxJRF9PRkZTRVRfTk9OX05VTUJFUiA6IEVSUk9SUy5JTlZBTElEX0xFTkdUSF9OT05fTlVNQkVSKTtcbiAgICB9XG59XG4vKipcbiAqIENoZWNrcyBpZiBhIGxlbmd0aCB2YWx1ZSBpcyB2YWxpZC4gKFRocm93cyBhbiBleGNlcHRpb24gaWYgY2hlY2sgZmFpbHMpXG4gKlxuICogQHBhcmFtIHsgTnVtYmVyIH0gbGVuZ3RoIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gY2hlY2tMZW5ndGhWYWx1ZShsZW5ndGgpIHtcbiAgICBjaGVja09mZnNldE9yTGVuZ3RoVmFsdWUobGVuZ3RoLCBmYWxzZSk7XG59XG5leHBvcnRzLmNoZWNrTGVuZ3RoVmFsdWUgPSBjaGVja0xlbmd0aFZhbHVlO1xuLyoqXG4gKiBDaGVja3MgaWYgYSBvZmZzZXQgdmFsdWUgaXMgdmFsaWQuIChUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGNoZWNrIGZhaWxzKVxuICpcbiAqIEBwYXJhbSB7IE51bWJlciB9IG9mZnNldCBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KSB7XG4gICAgY2hlY2tPZmZzZXRPckxlbmd0aFZhbHVlKG9mZnNldCwgdHJ1ZSk7XG59XG5leHBvcnRzLmNoZWNrT2Zmc2V0VmFsdWUgPSBjaGVja09mZnNldFZhbHVlO1xuLyoqXG4gKiBDaGVja3MgaWYgYSB0YXJnZXQgb2Zmc2V0IHZhbHVlIGlzIG91dCBvZiBib3VuZHMuIChUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGNoZWNrIGZhaWxzKVxuICpcbiAqIEBwYXJhbSB7IE51bWJlciB9IG9mZnNldCBUaGUgb2Zmc2V0IHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHsgU21hcnRCdWZmZXIgfSBidWZmIFRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZSB0byBjaGVjayBhZ2FpbnN0LlxuICovXG5mdW5jdGlvbiBjaGVja1RhcmdldE9mZnNldChvZmZzZXQsIGJ1ZmYpIHtcbiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JTLklOVkFMSURfVEFSR0VUX09GRlNFVCk7XG4gICAgfVxufVxuZXhwb3J0cy5jaGVja1RhcmdldE9mZnNldCA9IGNoZWNrVGFyZ2V0T2Zmc2V0O1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBudW1iZXIgaXMgYSBpbnRlZ2VyLlxuICogQHBhcmFtIHZhbHVlIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGlzSW50ZWdlcih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbHVlKSAmJiBNYXRoLmZsb29yKHZhbHVlKSA9PT0gdmFsdWU7XG59XG4vKipcbiAqIFRocm93cyBpZiBOb2RlLmpzIHZlcnNpb24gaXMgdG9vIGxvdyB0byBzdXBwb3J0IGJpZ2ludFxuICovXG5mdW5jdGlvbiBiaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKGJ1ZmZlck1ldGhvZCkge1xuICAgIGlmICh0eXBlb2YgQmlnSW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgSlMgQmlnSW50IHR5cGUuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYnVmZmVyXzEuQnVmZmVyLnByb3RvdHlwZVtidWZmZXJNZXRob2RdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgQnVmZmVyLnByb3RvdHlwZS4ke2J1ZmZlck1ldGhvZH0uYCk7XG4gICAgfVxufVxuZXhwb3J0cy5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrID0gYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNvY2tzUHJveHlBZ2VudCA9IHZvaWQgMDtcbmNvbnN0IHNvY2tzXzEgPSByZXF1aXJlKFwic29ja3NcIik7XG5jb25zdCBhZ2VudF9iYXNlXzEgPSByZXF1aXJlKFwiYWdlbnQtYmFzZVwiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IGRucyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiZG5zXCIpKTtcbmNvbnN0IHRscyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidGxzXCIpKTtcbmNvbnN0IHVybF8xID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ3NvY2tzLXByb3h5LWFnZW50Jyk7XG5mdW5jdGlvbiBwYXJzZVNvY2tzVVJMKHVybCkge1xuICAgIGxldCBsb29rdXAgPSBmYWxzZTtcbiAgICBsZXQgdHlwZSA9IDU7XG4gICAgY29uc3QgaG9zdCA9IHVybC5ob3N0bmFtZTtcbiAgICAvLyBGcm9tIFJGQyAxOTI4LCBTZWN0aW9uIDM6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxOTI4I3NlY3Rpb24tM1xuICAgIC8vIFwiVGhlIFNPQ0tTIHNlcnZpY2UgaXMgY29udmVudGlvbmFsbHkgbG9jYXRlZCBvbiBUQ1AgcG9ydCAxMDgwXCJcbiAgICBjb25zdCBwb3J0ID0gcGFyc2VJbnQodXJsLnBvcnQsIDEwKSB8fCAxMDgwO1xuICAgIC8vIGZpZ3VyZSBvdXQgaWYgd2Ugd2FudCBzb2NrcyB2NCBvciB2NSwgYmFzZWQgb24gdGhlIFwicHJvdG9jb2xcIiB1c2VkLlxuICAgIC8vIERlZmF1bHRzIHRvIDUuXG4gICAgc3dpdGNoICh1cmwucHJvdG9jb2wucmVwbGFjZSgnOicsICcnKSkge1xuICAgICAgICBjYXNlICdzb2NrczQnOlxuICAgICAgICAgICAgbG9va3VwID0gdHJ1ZTtcbiAgICAgICAgICAgIHR5cGUgPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIHBhc3MgdGhyb3VnaFxuICAgICAgICBjYXNlICdzb2NrczRhJzpcbiAgICAgICAgICAgIHR5cGUgPSA0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NvY2tzNSc6XG4gICAgICAgICAgICBsb29rdXAgPSB0cnVlO1xuICAgICAgICAgICAgdHlwZSA9IDU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gcGFzcyB0aHJvdWdoXG4gICAgICAgIGNhc2UgJ3NvY2tzJzogLy8gbm8gdmVyc2lvbiBzcGVjaWZpZWQsIGRlZmF1bHQgdG8gNWhcbiAgICAgICAgICAgIHR5cGUgPSA1O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NvY2tzNWgnOlxuICAgICAgICAgICAgdHlwZSA9IDU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEEgXCJzb2Nrc1wiIHByb3RvY29sIG11c3QgYmUgc3BlY2lmaWVkISBHb3Q6ICR7U3RyaW5nKHVybC5wcm90b2NvbCl9YCk7XG4gICAgfVxuICAgIGNvbnN0IHByb3h5ID0ge1xuICAgICAgICBob3N0LFxuICAgICAgICBwb3J0LFxuICAgICAgICB0eXBlLFxuICAgIH07XG4gICAgaWYgKHVybC51c2VybmFtZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJveHksICd1c2VySWQnLCB7XG4gICAgICAgICAgICB2YWx1ZTogZGVjb2RlVVJJQ29tcG9uZW50KHVybC51c2VybmFtZSksXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh1cmwucGFzc3dvcmQgIT0gbnVsbCkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJveHksICdwYXNzd29yZCcsIHtcbiAgICAgICAgICAgIHZhbHVlOiBkZWNvZGVVUklDb21wb25lbnQodXJsLnBhc3N3b3JkKSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbG9va3VwLCBwcm94eSB9O1xufVxuY2xhc3MgU29ja3NQcm94eUFnZW50IGV4dGVuZHMgYWdlbnRfYmFzZV8xLkFnZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmksIG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIGNvbnN0IHVybCA9IHR5cGVvZiB1cmkgPT09ICdzdHJpbmcnID8gbmV3IHVybF8xLlVSTCh1cmkpIDogdXJpO1xuICAgICAgICBjb25zdCB7IHByb3h5LCBsb29rdXAgfSA9IHBhcnNlU29ja3NVUkwodXJsKTtcbiAgICAgICAgdGhpcy5zaG91bGRMb29rdXAgPSBsb29rdXA7XG4gICAgICAgIHRoaXMucHJveHkgPSBwcm94eTtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gb3B0cz8udGltZW91dCA/PyBudWxsO1xuICAgICAgICB0aGlzLnNvY2tldE9wdGlvbnMgPSBvcHRzPy5zb2NrZXRPcHRpb25zID8/IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluaXRpYXRlcyBhIFNPQ0tTIGNvbm5lY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBTT0NLUyBwcm94eSBzZXJ2ZXIsXG4gICAgICogd2hpY2ggaW4gdHVybiBjb25uZWN0cyB0byB0aGUgc3BlY2lmaWVkIHJlbW90ZSBob3N0IGFuZCBwb3J0LlxuICAgICAqL1xuICAgIGFzeW5jIGNvbm5lY3QocmVxLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IHsgc2hvdWxkTG9va3VwLCBwcm94eSwgdGltZW91dCB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFvcHRzLmhvc3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gYGhvc3RgIGRlZmluZWQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgaG9zdCB9ID0gb3B0cztcbiAgICAgICAgY29uc3QgeyBwb3J0LCBsb29rdXA6IGxvb2t1cEZuID0gZG5zLmxvb2t1cCB9ID0gb3B0cztcbiAgICAgICAgaWYgKHNob3VsZExvb2t1cCkge1xuICAgICAgICAgICAgLy8gQ2xpZW50LXNpZGUgRE5TIHJlc29sdXRpb24gZm9yIFwiNFwiIGFuZCBcIjVcIiBzb2NrcyBwcm94eSB2ZXJzaW9ucy5cbiAgICAgICAgICAgIGhvc3QgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSByZXF1ZXN0J3MgY3VzdG9tIGxvb2t1cCwgaWYgb25lIHdhcyBjb25maWd1cmVkOlxuICAgICAgICAgICAgICAgIGxvb2t1cEZuKGhvc3QsIHt9LCAoZXJyLCByZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvY2tzT3B0cyA9IHtcbiAgICAgICAgICAgIHByb3h5LFxuICAgICAgICAgICAgZGVzdGluYXRpb246IHtcbiAgICAgICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgICAgIHBvcnQ6IHR5cGVvZiBwb3J0ID09PSAnbnVtYmVyJyA/IHBvcnQgOiBwYXJzZUludChwb3J0LCAxMCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tbWFuZDogJ2Nvbm5lY3QnLFxuICAgICAgICAgICAgdGltZW91dDogdGltZW91dCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoZSB0eXBlIHN1cHBsaWVkIGJ5IHNvY2tzIGZvciBzb2NrZXRfb3B0aW9ucyBpcyB3aWRlclxuICAgICAgICAgICAgLy8gdGhhbiBuZWNlc3Nhcnkgc2luY2Ugc29ja3Mgd2lsbCBhbHdheXMgb3ZlcnJpZGUgdGhlIGhvc3QgYW5kIHBvcnRcbiAgICAgICAgICAgIHNvY2tldF9vcHRpb25zOiB0aGlzLnNvY2tldE9wdGlvbnMgPz8gdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBjbGVhbnVwID0gKHRsc1NvY2tldCkgPT4ge1xuICAgICAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICBpZiAodGxzU29ja2V0KVxuICAgICAgICAgICAgICAgIHRsc1NvY2tldC5kZXN0cm95KCk7XG4gICAgICAgIH07XG4gICAgICAgIGRlYnVnKCdDcmVhdGluZyBzb2NrcyBwcm94eSBjb25uZWN0aW9uOiAlbycsIHNvY2tzT3B0cyk7XG4gICAgICAgIGNvbnN0IHsgc29ja2V0IH0gPSBhd2FpdCBzb2Nrc18xLlNvY2tzQ2xpZW50LmNyZWF0ZUNvbm5lY3Rpb24oc29ja3NPcHRzKTtcbiAgICAgICAgZGVidWcoJ1N1Y2Nlc3NmdWxseSBjcmVhdGVkIHNvY2tzIHByb3h5IGNvbm5lY3Rpb24nKTtcbiAgICAgICAgaWYgKHRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgc29ja2V0Lm9uKCd0aW1lb3V0JywgKCkgPT4gY2xlYW51cCgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5zZWN1cmVFbmRwb2ludCkge1xuICAgICAgICAgICAgLy8gVGhlIHByb3h5IGlzIGNvbm5lY3RpbmcgdG8gYSBUTFMgc2VydmVyLCBzbyB1cGdyYWRlXG4gICAgICAgICAgICAvLyB0aGlzIHNvY2tldCBjb25uZWN0aW9uIHRvIGEgVExTIGNvbm5lY3Rpb24uXG4gICAgICAgICAgICBkZWJ1ZygnVXBncmFkaW5nIHNvY2tldCBjb25uZWN0aW9uIHRvIFRMUycpO1xuICAgICAgICAgICAgY29uc3Qgc2VydmVybmFtZSA9IG9wdHMuc2VydmVybmFtZSB8fCBvcHRzLmhvc3Q7XG4gICAgICAgICAgICBjb25zdCB0bHNTb2NrZXQgPSB0bHMuY29ubmVjdCh7XG4gICAgICAgICAgICAgICAgLi4ub21pdChvcHRzLCAnaG9zdCcsICdwYXRoJywgJ3BvcnQnKSxcbiAgICAgICAgICAgICAgICBzb2NrZXQsXG4gICAgICAgICAgICAgICAgc2VydmVybmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGxzU29ja2V0Lm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ1NvY2tldCBUTFMgZXJyb3InLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKHRsc1NvY2tldCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0bHNTb2NrZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvY2tldDtcbiAgICB9XG59XG5Tb2Nrc1Byb3h5QWdlbnQucHJvdG9jb2xzID0gW1xuICAgICdzb2NrcycsXG4gICAgJ3NvY2tzNCcsXG4gICAgJ3NvY2tzNGEnLFxuICAgICdzb2NrczUnLFxuICAgICdzb2NrczVoJyxcbl07XG5leHBvcnRzLlNvY2tzUHJveHlBZ2VudCA9IFNvY2tzUHJveHlBZ2VudDtcbmZ1bmN0aW9uIG9taXQob2JqLCAuLi5rZXlzKSB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGtleTtcbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNvY2tzQ2xpZW50RXJyb3IgPSBleHBvcnRzLlNvY2tzQ2xpZW50ID0gdm9pZCAwO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xuY29uc3QgbmV0ID0gcmVxdWlyZShcIm5ldFwiKTtcbmNvbnN0IHNtYXJ0X2J1ZmZlcl8xID0gcmVxdWlyZShcInNtYXJ0LWJ1ZmZlclwiKTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9jb25zdGFudHNcIik7XG5jb25zdCBoZWxwZXJzXzEgPSByZXF1aXJlKFwiLi4vY29tbW9uL2hlbHBlcnNcIik7XG5jb25zdCByZWNlaXZlYnVmZmVyXzEgPSByZXF1aXJlKFwiLi4vY29tbW9uL3JlY2VpdmVidWZmZXJcIik7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwiLi4vY29tbW9uL3V0aWxcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTb2Nrc0NsaWVudEVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsXzEuU29ja3NDbGllbnRFcnJvcjsgfSB9KTtcbmNvbnN0IGlwX2FkZHJlc3NfMSA9IHJlcXVpcmUoXCJpcC1hZGRyZXNzXCIpO1xuY2xhc3MgU29ja3NDbGllbnQgZXh0ZW5kcyBldmVudHNfMS5FdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICAgIC8vIFZhbGlkYXRlIFNvY2tzQ2xpZW50T3B0aW9uc1xuICAgICAgICAoMCwgaGVscGVyc18xLnZhbGlkYXRlU29ja3NDbGllbnRPcHRpb25zKShvcHRpb25zKTtcbiAgICAgICAgLy8gRGVmYXVsdCBzdGF0ZVxuICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuQ3JlYXRlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU09DS1MgY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqIE5vdGU6IFN1cHBvcnRzIGNhbGxiYWNrcyBhbmQgcHJvbWlzZXMuIE9ubHkgc3VwcG9ydHMgdGhlIGNvbm5lY3QgY29tbWFuZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyB7IFNvY2tzQ2xpZW50T3B0aW9ucyB9IE9wdGlvbnMuXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIHsgRnVuY3Rpb24gfSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7IFByb21pc2UgfVxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVDb25uZWN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBWYWxpZGF0ZSBTb2Nrc0NsaWVudE9wdGlvbnNcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgKDAsIGhlbHBlcnNfMS52YWxpZGF0ZVNvY2tzQ2xpZW50T3B0aW9ucykob3B0aW9ucywgWydjb25uZWN0J10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZXJyKTsgLy8gUmVzb2x2ZXMgcGVuZGluZyBwcm9taXNlIChwcmV2ZW50cyBtZW1vcnkgbGVha3MpLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBTb2Nrc0NsaWVudChvcHRpb25zKTtcbiAgICAgICAgICAgIGNsaWVudC5jb25uZWN0KG9wdGlvbnMuZXhpc3Rpbmdfc29ja2V0KTtcbiAgICAgICAgICAgIGNsaWVudC5vbmNlKCdlc3RhYmxpc2hlZCcsIChpbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgaW5mbyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaW5mbyk7IC8vIFJlc29sdmVzIHBlbmRpbmcgcHJvbWlzZSAocHJldmVudHMgbWVtb3J5IGxlYWtzKS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBFcnJvciBvY2N1cnJlZCwgZmFpbGVkIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uLlxuICAgICAgICAgICAgY2xpZW50Lm9uY2UoJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXJyKTsgLy8gUmVzb2x2ZXMgcGVuZGluZyBwcm9taXNlIChwcmV2ZW50cyBtZW1vcnkgbGVha3MpLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNPQ0tTIGNvbm5lY3Rpb24gY2hhaW4gdG8gYSBkZXN0aW5hdGlvbiBob3N0IHRocm91Z2ggMiBvciBtb3JlIFNPQ0tTIHByb3hpZXMuXG4gICAgICpcbiAgICAgKiBOb3RlOiBTdXBwb3J0cyBjYWxsYmFja3MgYW5kIHByb21pc2VzLiBPbmx5IHN1cHBvcnRzIHRoZSBjb25uZWN0IG1ldGhvZC5cbiAgICAgKiBOb3RlOiBJbXBsZW1lbnRlZCB2aWEgY3JlYXRlQ29ubmVjdGlvbigpIGZhY3RvcnkgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgeyBTb2Nrc0NsaWVudENoYWluT3B0aW9ucyB9IE9wdGlvbnNcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgeyBGdW5jdGlvbiB9IEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHsgUHJvbWlzZSB9XG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZUNvbm5lY3Rpb25DaGFpbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgLy8gVmFsaWRhdGUgU29ja3NDbGllbnRDaGFpbk9wdGlvbnNcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgKDAsIGhlbHBlcnNfMS52YWxpZGF0ZVNvY2tzQ2xpZW50Q2hhaW5PcHRpb25zKShvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGVycik7IC8vIFJlc29sdmVzIHBlbmRpbmcgcHJvbWlzZSAocHJldmVudHMgbWVtb3J5IGxlYWtzKS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTaHVmZmxlIHByb3hpZXNcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJhbmRvbWl6ZUNoYWluKSB7XG4gICAgICAgICAgICAgICAgKDAsIHV0aWxfMS5zaHVmZmxlQXJyYXkpKG9wdGlvbnMucHJveGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBzb2NrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5wcm94aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRQcm94eSA9IG9wdGlvbnMucHJveGllc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UndmUgcmVhY2hlZCB0aGUgbGFzdCBwcm94eSBpbiB0aGUgY2hhaW4sIHRoZSBkZXN0aW5hdGlvbiBpcyB0aGUgYWN0dWFsIGRlc3RpbmF0aW9uLCBvdGhlcndpc2UgaXQncyB0aGUgbmV4dCBwcm94eS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dERlc3RpbmF0aW9uID0gaSA9PT0gb3B0aW9ucy5wcm94aWVzLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gb3B0aW9ucy5kZXN0aW5hdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdDogb3B0aW9ucy5wcm94aWVzW2kgKyAxXS5ob3N0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHJveGllc1tpICsgMV0uaXBhZGRyZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IG9wdGlvbnMucHJveGllc1tpICsgMV0ucG9ydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZXMgdGhlIG5leHQgY29ubmVjdGlvbiBpbiB0aGUgY2hhaW4uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIFNvY2tzQ2xpZW50LmNyZWF0ZUNvbm5lY3Rpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogJ2Nvbm5lY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJveHk6IG5leHRQcm94eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBuZXh0RGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19zb2NrZXQ6IHNvY2ssXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBzb2NrIGlzIHVuZGVmaW5lZCwgYXNzaWduIGl0IGhlcmUuXG4gICAgICAgICAgICAgICAgICAgIHNvY2sgPSBzb2NrIHx8IHJlc3VsdC5zb2NrZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgeyBzb2NrZXQ6IHNvY2sgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBzb2NrZXQ6IHNvY2sgfSk7IC8vIFJlc29sdmVzIHBlbmRpbmcgcHJvbWlzZSAocHJldmVudHMgbWVtb3J5IGxlYWtzKS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBzb2NrZXQ6IHNvY2sgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShlcnIpOyAvLyBSZXNvbHZlcyBwZW5kaW5nIHByb21pc2UgKHByZXZlbnRzIG1lbW9yeSBsZWFrcykuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFNPQ0tTIFVEUCBGcmFtZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVVRFBGcmFtZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmYgPSBuZXcgc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIoKTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQxNkJFKDApO1xuICAgICAgICBidWZmLndyaXRlVUludDgob3B0aW9ucy5mcmFtZU51bWJlciB8fCAwKTtcbiAgICAgICAgLy8gSVB2NC9JUHY2L0hvc3RuYW1lXG4gICAgICAgIGlmIChuZXQuaXNJUHY0KG9wdGlvbnMucmVtb3RlSG9zdC5ob3N0KSkge1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLklQdjQpO1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQzMkJFKCgwLCBoZWxwZXJzXzEuaXB2NFRvSW50MzIpKG9wdGlvbnMucmVtb3RlSG9zdC5ob3N0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmV0LmlzSVB2NihvcHRpb25zLnJlbW90ZUhvc3QuaG9zdCkpIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY2KTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVCdWZmZXIoKDAsIGhlbHBlcnNfMS5pcFRvQnVmZmVyKShvcHRpb25zLnJlbW90ZUhvc3QuaG9zdCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLkhvc3RuYW1lKTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChCdWZmZXIuYnl0ZUxlbmd0aChvcHRpb25zLnJlbW90ZUhvc3QuaG9zdCkpO1xuICAgICAgICAgICAgYnVmZi53cml0ZVN0cmluZyhvcHRpb25zLnJlbW90ZUhvc3QuaG9zdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUG9ydFxuICAgICAgICBidWZmLndyaXRlVUludDE2QkUob3B0aW9ucy5yZW1vdGVIb3N0LnBvcnQpO1xuICAgICAgICAvLyBEYXRhXG4gICAgICAgIGJ1ZmYud3JpdGVCdWZmZXIob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgcmV0dXJuIGJ1ZmYudG9CdWZmZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VzIGEgU09DS1MgVURQIGZyYW1lLlxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlVURQRnJhbWUoZGF0YSkge1xuICAgICAgICBjb25zdCBidWZmID0gc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIuZnJvbUJ1ZmZlcihkYXRhKTtcbiAgICAgICAgYnVmZi5yZWFkT2Zmc2V0ID0gMjtcbiAgICAgICAgY29uc3QgZnJhbWVOdW1iZXIgPSBidWZmLnJlYWRVSW50OCgpO1xuICAgICAgICBjb25zdCBob3N0VHlwZSA9IGJ1ZmYucmVhZFVJbnQ4KCk7XG4gICAgICAgIGxldCByZW1vdGVIb3N0O1xuICAgICAgICBpZiAoaG9zdFR5cGUgPT09IGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLklQdjQpIHtcbiAgICAgICAgICAgIHJlbW90ZUhvc3QgPSAoMCwgaGVscGVyc18xLmludDMyVG9JcHY0KShidWZmLnJlYWRVSW50MzJCRSgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChob3N0VHlwZSA9PT0gY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2Nikge1xuICAgICAgICAgICAgcmVtb3RlSG9zdCA9IGlwX2FkZHJlc3NfMS5BZGRyZXNzNi5mcm9tQnl0ZUFycmF5KEFycmF5LmZyb20oYnVmZi5yZWFkQnVmZmVyKDE2KSkpLmNhbm9uaWNhbEZvcm0oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlbW90ZUhvc3QgPSBidWZmLnJlYWRTdHJpbmcoYnVmZi5yZWFkVUludDgoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtb3RlUG9ydCA9IGJ1ZmYucmVhZFVJbnQxNkJFKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmcmFtZU51bWJlcixcbiAgICAgICAgICAgIHJlbW90ZUhvc3Q6IHtcbiAgICAgICAgICAgICAgICBob3N0OiByZW1vdGVIb3N0LFxuICAgICAgICAgICAgICAgIHBvcnQ6IHJlbW90ZVBvcnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0YTogYnVmZi5yZWFkQnVmZmVyKCksXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIHN0YXRlIHNldHRlci4gSWYgdGhlIFNvY2tzQ2xpZW50IGlzIGluIGFuIGVycm9yIHN0YXRlLCBpdCBjYW5ub3QgYmUgY2hhbmdlZCB0byBhIG5vbiBlcnJvciBzdGF0ZS5cbiAgICAgKi9cbiAgICBzZXRTdGF0ZShuZXdTdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyB0aGUgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50IHRvIHRoZSBwcm94eSBhbmQgZGVzdGluYXRpb24uXG4gICAgICogQHBhcmFtIGV4aXN0aW5nU29ja2V0IENvbm5lY3RlZCBzb2NrZXQgdG8gdXNlIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lIChpbnRlcm5hbCB1c2UpLlxuICAgICAqL1xuICAgIGNvbm5lY3QoZXhpc3RpbmdTb2NrZXQpIHtcbiAgICAgICAgdGhpcy5vbkRhdGFSZWNlaXZlZCA9IChkYXRhKSA9PiB0aGlzLm9uRGF0YVJlY2VpdmVkSGFuZGxlcihkYXRhKTtcbiAgICAgICAgdGhpcy5vbkNsb3NlID0gKCkgPT4gdGhpcy5vbkNsb3NlSGFuZGxlcigpO1xuICAgICAgICB0aGlzLm9uRXJyb3IgPSAoZXJyKSA9PiB0aGlzLm9uRXJyb3JIYW5kbGVyKGVycik7XG4gICAgICAgIHRoaXMub25Db25uZWN0ID0gKCkgPT4gdGhpcy5vbkNvbm5lY3RIYW5kbGVyKCk7XG4gICAgICAgIC8vIFN0YXJ0IHRpbWVvdXQgdGltZXIgKGRlZmF1bHRzIHRvIDMwIHNlY29uZHMpXG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLm9uRXN0YWJsaXNoZWRUaW1lb3V0KCksIHRoaXMub3B0aW9ucy50aW1lb3V0IHx8IGNvbnN0YW50c18xLkRFRkFVTFRfVElNRU9VVCk7XG4gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdW5yZWYgaXMgYXZhaWxhYmxlIGFzIGl0IGRpZmZlcnMgZnJvbSBicm93c2VyIHRvIE5vZGVKUyAoIzMzKVxuICAgICAgICBpZiAodGltZXIudW5yZWYgJiYgdHlwZW9mIHRpbWVyLnVucmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aW1lci51bnJlZigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGFuIGV4aXN0aW5nIHNvY2tldCBpcyBwcm92aWRlZCwgdXNlIGl0IHRvIG5lZ290aWF0ZSBTT0NLUyBoYW5kc2hha2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgU29ja2V0LlxuICAgICAgICBpZiAoZXhpc3RpbmdTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gZXhpc3RpbmdTb2NrZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldCA9IG5ldyBuZXQuU29ja2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXR0YWNoIFNvY2tldCBlcnJvciBoYW5kbGVycy5cbiAgICAgICAgdGhpcy5zb2NrZXQub25jZSgnY2xvc2UnLCB0aGlzLm9uQ2xvc2UpO1xuICAgICAgICB0aGlzLnNvY2tldC5vbmNlKCdlcnJvcicsIHRoaXMub25FcnJvcik7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uY2UoJ2Nvbm5lY3QnLCB0aGlzLm9uQ29ubmVjdCk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uKCdkYXRhJywgdGhpcy5vbkRhdGFSZWNlaXZlZCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Db25uZWN0aW5nKTtcbiAgICAgICAgdGhpcy5yZWNlaXZlQnVmZmVyID0gbmV3IHJlY2VpdmVidWZmZXJfMS5SZWNlaXZlQnVmZmVyKCk7XG4gICAgICAgIGlmIChleGlzdGluZ1NvY2tldCkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnY29ubmVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuY29ubmVjdCh0aGlzLmdldFNvY2tldE9wdGlvbnMoKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNldF90Y3Bfbm9kZWxheSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNldF90Y3Bfbm9kZWxheSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNldE5vRGVsYXkoISF0aGlzLm9wdGlvbnMuc2V0X3RjcF9ub2RlbGF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBMaXN0ZW4gZm9yIGVzdGFibGlzaGVkIGV2ZW50IHNvIHdlIGNhbiByZS1lbWl0IGFueSBleGNlc3MgZGF0YSByZWNlaXZlZCBkdXJpbmcgaGFuZHNoYWtlcy5cbiAgICAgICAgdGhpcy5wcmVwZW5kT25jZUxpc3RlbmVyKCdlc3RhYmxpc2hlZCcsIChpbmZvKSA9PiB7XG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlY2VpdmVCdWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGNlc3NEYXRhID0gdGhpcy5yZWNlaXZlQnVmZmVyLmdldCh0aGlzLnJlY2VpdmVCdWZmZXIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaW5mby5zb2NrZXQuZW1pdCgnZGF0YScsIGV4Y2Vzc0RhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbmZvLnNvY2tldC5yZXN1bWUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gU29ja2V0IG9wdGlvbnMgKGRlZmF1bHRzIGhvc3QvcG9ydCB0byBvcHRpb25zLnByb3h5Lmhvc3Qvb3B0aW9ucy5wcm94eS5wb3J0KVxuICAgIGdldFNvY2tldE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucy5zb2NrZXRfb3B0aW9ucyksIHsgaG9zdDogdGhpcy5vcHRpb25zLnByb3h5Lmhvc3QgfHwgdGhpcy5vcHRpb25zLnByb3h5LmlwYWRkcmVzcywgcG9ydDogdGhpcy5vcHRpb25zLnByb3h5LnBvcnQgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgaW50ZXJuYWwgU29ja3MgdGltZW91dCBjYWxsYmFjay5cbiAgICAgKiBOb3RlOiBJZiB0aGUgU29ja3MgY2xpZW50IGlzIG5vdCBCb3VuZFdhaXRpbmdGb3JDb25uZWN0aW9uIG9yIEVzdGFibGlzaGVkLCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZC5cbiAgICAgKi9cbiAgICBvbkVzdGFibGlzaGVkVGltZW91dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXN0YWJsaXNoZWQgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgIT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuQm91bmRXYWl0aW5nRm9yQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVNvY2tldChjb25zdGFudHNfMS5FUlJPUlMuUHJveHlDb25uZWN0aW9uVGltZWRPdXQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja2V0IGNvbm5lY3QgZXZlbnQuXG4gICAgICovXG4gICAgb25Db25uZWN0SGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkNvbm5lY3RlZCk7XG4gICAgICAgIC8vIFNlbmQgaW5pdGlhbCBoYW5kc2hha2UuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkudHlwZSA9PT0gNCkge1xuICAgICAgICAgICAgdGhpcy5zZW5kU29ja3M0SW5pdGlhbEhhbmRzaGFrZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZW5kU29ja3M1SW5pdGlhbEhhbmRzaGFrZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5TZW50SW5pdGlhbEhhbmRzaGFrZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja2V0IGRhdGEgZXZlbnQuXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBvbkRhdGFSZWNlaXZlZEhhbmRsZXIoZGF0YSkge1xuICAgICAgICAvKlxuICAgICAgICAgIEFsbCByZWNlaXZlZCBkYXRhIGlzIGFwcGVuZGVkIHRvIGEgUmVjZWl2ZUJ1ZmZlci5cbiAgICAgICAgICBUaGlzIG1ha2VzIHN1cmUgdGhhdCBhbGwgdGhlIGRhdGEgd2UgbmVlZCBpcyByZWNlaXZlZCBiZWZvcmUgd2UgYXR0ZW1wdCB0byBwcm9jZXNzIGl0LlxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlY2VpdmVCdWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAvLyBQcm9jZXNzIGRhdGEgdGhhdCB3ZSBoYXZlLlxuICAgICAgICB0aGlzLnByb2Nlc3NEYXRhKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgcHJvY2Vzc2luZyBvZiB0aGUgZGF0YSB3ZSBoYXZlIHJlY2VpdmVkLlxuICAgICAqL1xuICAgIHByb2Nlc3NEYXRhKCkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGVub3VnaCBkYXRhIHRvIHByb2Nlc3MgdGhlIG5leHQgc3RlcCBpbiB0aGUgU09DS1MgaGFuZHNoYWtlLCBwcm9jZWVkLlxuICAgICAgICB3aGlsZSAodGhpcy5zdGF0ZSAhPT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Fc3RhYmxpc2hlZCAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZSAhPT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5FcnJvciAmJlxuICAgICAgICAgICAgdGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aCA+PSB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUpIHtcbiAgICAgICAgICAgIC8vIFNlbnQgaW5pdGlhbCBoYW5kc2hha2UsIHdhaXRpbmcgZm9yIHJlc3BvbnNlLlxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEluaXRpYWxIYW5kc2hha2UpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5LnR5cGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU29ja3MgdjQgb25seSBoYXMgb25lIGhhbmRzaGFrZSByZXNwb25zZS5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTb2NrczRGaW5hbEhhbmRzaGFrZVJlc3BvbnNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBTb2NrcyB2NSBoYXMgdHdvIGhhbmRzaGFrZXMsIGhhbmRsZSBpbml0aWFsIG9uZSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluaXRpYWxTb2NrczVIYW5kc2hha2VSZXNwb25zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTZW50IGF1dGggcmVxdWVzdCBmb3IgU29ja3MgdjUsIHdhaXRpbmcgZm9yIHJlc3BvbnNlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5TZW50QXV0aGVudGljYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluaXRpYWxTb2NrczVBdXRoZW50aWNhdGlvbkhhbmRzaGFrZVJlc3BvbnNlKCk7XG4gICAgICAgICAgICAgICAgLy8gU2VudCBmaW5hbCBTb2NrcyB2NSBoYW5kc2hha2UsIHdhaXRpbmcgZm9yIGZpbmFsIHJlc3BvbnNlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5TZW50RmluYWxIYW5kc2hha2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNvY2tzNUZpbmFsSGFuZHNoYWtlUmVzcG9uc2UoKTtcbiAgICAgICAgICAgICAgICAvLyBTb2NrcyBCSU5EIGVzdGFibGlzaGVkLiBXYWl0aW5nIGZvciByZW1vdGUgY29ubmVjdGlvbiB2aWEgcHJveHkuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXRlID09PSBjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkJvdW5kV2FpdGluZ0ZvckNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5LnR5cGUgPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTb2NrczRJbmNvbWluZ0Nvbm5lY3Rpb25SZXNwb25zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTb2NrczVJbmNvbWluZ0Nvbm5lY3Rpb25SZXNwb25zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoY29uc3RhbnRzXzEuRVJST1JTLkludGVybmFsRXJyb3IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja2V0IGNsb3NlIGV2ZW50LlxuICAgICAqIEBwYXJhbSBoYWRfZXJyb3JcbiAgICAgKi9cbiAgICBvbkNsb3NlSGFuZGxlcigpIHtcbiAgICAgICAgdGhpcy5jbG9zZVNvY2tldChjb25zdGFudHNfMS5FUlJPUlMuU29ja2V0Q2xvc2VkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBTb2NrZXQgZXJyb3IgZXZlbnQuXG4gICAgICogQHBhcmFtIGVyclxuICAgICAqL1xuICAgIG9uRXJyb3JIYW5kbGVyKGVycikge1xuICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGVyci5tZXNzYWdlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBpbnRlcm5hbCBldmVudCBsaXN0ZW5lcnMgb24gdGhlIHVuZGVybHlpbmcgU29ja2V0LlxuICAgICAqL1xuICAgIHJlbW92ZUludGVybmFsU29ja2V0SGFuZGxlcnMoKSB7XG4gICAgICAgIC8vIFBhdXNlcyBkYXRhIGZsb3cgb2YgdGhlIHNvY2tldCAodGhpcyBpcyBpbnRlcm5hbGx5IHJlc3VtZWQgYWZ0ZXIgJ2VzdGFibGlzaGVkJyBpcyBlbWl0dGVkKVxuICAgICAgICB0aGlzLnNvY2tldC5wYXVzZSgpO1xuICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHRoaXMub25EYXRhUmVjZWl2ZWQpO1xuICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCB0aGlzLm9uQ2xvc2UpO1xuICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCB0aGlzLm9uRXJyb3IpO1xuICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcignY29ubmVjdCcsIHRoaXMub25Db25uZWN0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIGFuZCBkZXN0cm95cyB0aGUgdW5kZXJseWluZyBTb2NrZXQuIEVtaXRzIGFuIGVycm9yIGV2ZW50LlxuICAgICAqIEBwYXJhbSBlcnIgeyBTdHJpbmcgfSBBbiBlcnJvciBzdHJpbmcgdG8gaW5jbHVkZSBpbiBlcnJvciBldmVudC5cbiAgICAgKi9cbiAgICBjbG9zZVNvY2tldChlcnIpIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIG9ubHkgb25lICdlcnJvcicgZXZlbnQgaXMgZmlyZWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGlzIFNvY2tzQ2xpZW50IGluc3RhbmNlLlxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5FcnJvcikge1xuICAgICAgICAgICAgLy8gU2V0IGludGVybmFsIHN0YXRlIHRvIEVycm9yLlxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkVycm9yKTtcbiAgICAgICAgICAgIC8vIERlc3Ryb3kgU29ja2V0XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICAvLyBSZW1vdmUgaW50ZXJuYWwgbGlzdGVuZXJzXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUludGVybmFsU29ja2V0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIC8vIEZpcmUgJ2Vycm9yJyBldmVudC5cbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoZXJyLCB0aGlzLm9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBpbml0aWFsIFNvY2tzIHY0IGhhbmRzaGFrZSByZXF1ZXN0LlxuICAgICAqL1xuICAgIHNlbmRTb2NrczRJbml0aWFsSGFuZHNoYWtlKCkge1xuICAgICAgICBjb25zdCB1c2VySWQgPSB0aGlzLm9wdGlvbnMucHJveHkudXNlcklkIHx8ICcnO1xuICAgICAgICBjb25zdCBidWZmID0gbmV3IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyKCk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OCgweDA0KTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KGNvbnN0YW50c18xLlNvY2tzQ29tbWFuZFt0aGlzLm9wdGlvbnMuY29tbWFuZF0pO1xuICAgICAgICBidWZmLndyaXRlVUludDE2QkUodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLnBvcnQpO1xuICAgICAgICAvLyBTb2NrcyA0IChJUHY0KVxuICAgICAgICBpZiAobmV0LmlzSVB2NCh0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24uaG9zdCkpIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVCdWZmZXIoKDAsIGhlbHBlcnNfMS5pcFRvQnVmZmVyKSh0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24uaG9zdCkpO1xuICAgICAgICAgICAgYnVmZi53cml0ZVN0cmluZ05UKHVzZXJJZCk7XG4gICAgICAgICAgICAvLyBTb2NrcyA0YSAoaG9zdG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoMHgwMCk7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoMHgwMCk7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoMHgwMCk7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoMHgwMSk7XG4gICAgICAgICAgICBidWZmLndyaXRlU3RyaW5nTlQodXNlcklkKTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVTdHJpbmdOVCh0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24uaG9zdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplID1cbiAgICAgICAgICAgIGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczRSZXNwb25zZTtcbiAgICAgICAgdGhpcy5zb2NrZXQud3JpdGUoYnVmZi50b0J1ZmZlcigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBTb2NrcyB2NCBoYW5kc2hha2UgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVTb2NrczRGaW5hbEhhbmRzaGFrZVJlc3BvbnNlKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5yZWNlaXZlQnVmZmVyLmdldCg4KTtcbiAgICAgICAgaWYgKGRhdGFbMV0gIT09IGNvbnN0YW50c18xLlNvY2tzNFJlc3BvbnNlLkdyYW50ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoYCR7Y29uc3RhbnRzXzEuRVJST1JTLlNvY2tzNFByb3h5UmVqZWN0ZWRDb25uZWN0aW9ufSAtICgke2NvbnN0YW50c18xLlNvY2tzNFJlc3BvbnNlW2RhdGFbMV1dfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEJpbmQgcmVzcG9uc2VcbiAgICAgICAgICAgIGlmIChjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmRbdGhpcy5vcHRpb25zLmNvbW1hbmRdID09PSBjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmQuYmluZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmYgPSBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlci5mcm9tQnVmZmVyKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJ1ZmYucmVhZE9mZnNldCA9IDI7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcG9ydDogYnVmZi5yZWFkVUludDE2QkUoKSxcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogKDAsIGhlbHBlcnNfMS5pbnQzMlRvSXB2NCkoYnVmZi5yZWFkVUludDMyQkUoKSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyBJZiBob3N0IGlzIDAuMC4wLjAsIHNldCB0byBwcm94eSBob3N0LlxuICAgICAgICAgICAgICAgIGlmIChyZW1vdGVIb3N0Lmhvc3QgPT09ICcwLjAuMC4wJykge1xuICAgICAgICAgICAgICAgICAgICByZW1vdGVIb3N0Lmhvc3QgPSB0aGlzLm9wdGlvbnMucHJveHkuaXBhZGRyZXNzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuQm91bmRXYWl0aW5nRm9yQ29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdib3VuZCcsIHsgcmVtb3RlSG9zdCwgc29ja2V0OiB0aGlzLnNvY2tldCB9KTtcbiAgICAgICAgICAgICAgICAvLyBDb25uZWN0IHJlc3BvbnNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXN0YWJsaXNoZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW50ZXJuYWxTb2NrZXRIYW5kbGVycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXN0YWJsaXNoZWQnLCB7IHNvY2tldDogdGhpcy5zb2NrZXQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBTb2NrcyB2NCBpbmNvbWluZyBjb25uZWN0aW9uIHJlcXVlc3QgKEJJTkQpXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVTb2NrczRJbmNvbWluZ0Nvbm5lY3Rpb25SZXNwb25zZSgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoOCk7XG4gICAgICAgIGlmIChkYXRhWzFdICE9PSBjb25zdGFudHNfMS5Tb2NrczRSZXNwb25zZS5HcmFudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGAke2NvbnN0YW50c18xLkVSUk9SUy5Tb2NrczRQcm94eVJlamVjdGVkSW5jb21pbmdCb3VuZENvbm5lY3Rpb259IC0gKCR7Y29uc3RhbnRzXzEuU29ja3M0UmVzcG9uc2VbZGF0YVsxXV19KWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIoZGF0YSk7XG4gICAgICAgICAgICBidWZmLnJlYWRPZmZzZXQgPSAyO1xuICAgICAgICAgICAgY29uc3QgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICBwb3J0OiBidWZmLnJlYWRVSW50MTZCRSgpLFxuICAgICAgICAgICAgICAgIGhvc3Q6ICgwLCBoZWxwZXJzXzEuaW50MzJUb0lwdjQpKGJ1ZmYucmVhZFVJbnQzMkJFKCkpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Fc3RhYmxpc2hlZCk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUludGVybmFsU29ja2V0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXN0YWJsaXNoZWQnLCB7IHJlbW90ZUhvc3QsIHNvY2tldDogdGhpcy5zb2NrZXQgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgaW5pdGlhbCBTb2NrcyB2NSBoYW5kc2hha2UgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBzZW5kU29ja3M1SW5pdGlhbEhhbmRzaGFrZSgpIHtcbiAgICAgICAgY29uc3QgYnVmZiA9IG5ldyBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlcigpO1xuICAgICAgICAvLyBCeSBkZWZhdWx0IHdlIGFsd2F5cyBzdXBwb3J0IG5vIGF1dGguXG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZEF1dGhNZXRob2RzID0gW2NvbnN0YW50c18xLlNvY2tzNUF1dGguTm9BdXRoXTtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIG9ubHkgdGVsbCB0aGUgcHJveHkgd2Ugc3VwcG9ydCB1c2VyL3Bhc3MgYXV0aCBpZiBhdXRoIGluZm8gaXMgYWN0dWFsbHkgcHJvdmlkZWQuXG4gICAgICAgIC8vIE5vdGU6IEFzIG9mIFRvciB2MC4zLjUuNyssIGlmIHVzZXIvcGFzcyBhdXRoIGlzIGFuIG9wdGlvbiBmcm9tIHRoZSBjbGllbnQsIGJ5IGRlZmF1bHQgaXQgd2lsbCBhbHdheXMgdGFrZSBwcmlvcml0eS5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wcm94eS51c2VySWQgfHwgdGhpcy5vcHRpb25zLnByb3h5LnBhc3N3b3JkKSB7XG4gICAgICAgICAgICBzdXBwb3J0ZWRBdXRoTWV0aG9kcy5wdXNoKGNvbnN0YW50c18xLlNvY2tzNUF1dGguVXNlclBhc3MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEN1c3RvbSBhdXRoIG1ldGhvZD9cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wcm94eS5jdXN0b21fYXV0aF9tZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3VwcG9ydGVkQXV0aE1ldGhvZHMucHVzaCh0aGlzLm9wdGlvbnMucHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCdWlsZCBoYW5kc2hha2UgcGFja2V0XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OCgweDA1KTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KHN1cHBvcnRlZEF1dGhNZXRob2RzLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgYXV0aE1ldGhvZCBvZiBzdXBwb3J0ZWRBdXRoTWV0aG9kcykge1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KGF1dGhNZXRob2QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9XG4gICAgICAgICAgICBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1SW5pdGlhbEhhbmRzaGFrZVJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNvY2tldC53cml0ZShidWZmLnRvQnVmZmVyKCkpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEluaXRpYWxIYW5kc2hha2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGluaXRpYWwgU29ja3MgdjUgaGFuZHNoYWtlIHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgaGFuZGxlSW5pdGlhbFNvY2tzNUhhbmRzaGFrZVJlc3BvbnNlKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5yZWNlaXZlQnVmZmVyLmdldCgyKTtcbiAgICAgICAgaWYgKGRhdGFbMF0gIT09IDB4MDUpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2NrczVJbnRpYWlsSGFuZHNoYWtlU29ja3NWZXJzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkYXRhWzFdID09PSBjb25zdGFudHNfMS5TT0NLUzVfTk9fQUNDRVBUQUJMRV9BVVRIKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3M1SW5pdGlhbEhhbmRzaGFrZU5vQWNjZXB0ZWRBdXRoVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBzZWxlY3RlZCBTb2NrcyB2NSBhdXRoIG1ldGhvZCBpcyBubyBhdXRoLCBzZW5kIGZpbmFsIGhhbmRzaGFrZSByZXF1ZXN0LlxuICAgICAgICAgICAgaWYgKGRhdGFbMV0gPT09IGNvbnN0YW50c18xLlNvY2tzNUF1dGguTm9BdXRoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrczVDaG9zZW5BdXRoVHlwZSA9IGNvbnN0YW50c18xLlNvY2tzNUF1dGguTm9BdXRoO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZFNvY2tzNUNvbW1hbmRSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgLy8gSWYgc2VsZWN0ZWQgU29ja3MgdjUgYXV0aCBtZXRob2QgaXMgdXNlci9wYXNzd29yZCwgc2VuZCBhdXRoIGhhbmRzaGFrZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRhdGFbMV0gPT09IGNvbnN0YW50c18xLlNvY2tzNUF1dGguVXNlclBhc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tzNUNob3NlbkF1dGhUeXBlID0gY29uc3RhbnRzXzEuU29ja3M1QXV0aC5Vc2VyUGFzcztcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRTb2NrczVVc2VyUGFzc0F1dGhlbnRpY2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgLy8gSWYgc2VsZWN0ZWQgU29ja3MgdjUgYXV0aCBtZXRob2QgaXMgdGhlIGN1c3RvbV9hdXRoX21ldGhvZCwgc2VuZCBjdXN0b20gaGFuZHNoYWtlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZGF0YVsxXSA9PT0gdGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX21ldGhvZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja3M1Q2hvc2VuQXV0aFR5cGUgPSB0aGlzLm9wdGlvbnMucHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZFNvY2tzNUN1c3RvbUF1dGhlbnRpY2F0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3M1SW5pdGlhbEhhbmRzaGFrZVVua25vd25BdXRoVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgU29ja3MgdjUgdXNlciAmIHBhc3N3b3JkIGF1dGggaGFuZHNoYWtlLlxuICAgICAqXG4gICAgICogTm90ZTogTm8gYXV0aCBhbmQgdXNlci9wYXNzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICAgICAqL1xuICAgIHNlbmRTb2NrczVVc2VyUGFzc0F1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICBjb25zdCB1c2VySWQgPSB0aGlzLm9wdGlvbnMucHJveHkudXNlcklkIHx8ICcnO1xuICAgICAgICBjb25zdCBwYXNzd29yZCA9IHRoaXMub3B0aW9ucy5wcm94eS5wYXNzd29yZCB8fCAnJztcbiAgICAgICAgY29uc3QgYnVmZiA9IG5ldyBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlcigpO1xuICAgICAgICBidWZmLndyaXRlVUludDgoMHgwMSk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OChCdWZmZXIuYnl0ZUxlbmd0aCh1c2VySWQpKTtcbiAgICAgICAgYnVmZi53cml0ZVN0cmluZyh1c2VySWQpO1xuICAgICAgICBidWZmLndyaXRlVUludDgoQnVmZmVyLmJ5dGVMZW5ndGgocGFzc3dvcmQpKTtcbiAgICAgICAgYnVmZi53cml0ZVN0cmluZyhwYXNzd29yZCk7XG4gICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9XG4gICAgICAgICAgICBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1VXNlclBhc3NBdXRoZW50aWNhdGlvblJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNvY2tldC53cml0ZShidWZmLnRvQnVmZmVyKCkpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEF1dGhlbnRpY2F0aW9uKTtcbiAgICB9XG4gICAgc2VuZFNvY2tzNUN1c3RvbUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplID1cbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucHJveHkuY3VzdG9tX2F1dGhfcmVzcG9uc2Vfc2l6ZTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LndyaXRlKHlpZWxkIHRoaXMub3B0aW9ucy5wcm94eS5jdXN0b21fYXV0aF9yZXF1ZXN0X2hhbmRsZXIoKSk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEF1dGhlbnRpY2F0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhbmRsZVNvY2tzNUN1c3RvbUF1dGhIYW5kc2hha2VSZXNwb25zZShkYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4geWllbGQgdGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX3Jlc3BvbnNlX2hhbmRsZXIoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoYW5kbGVTb2NrczVBdXRoZW50aWNhdGlvbk5vQXV0aEhhbmRzaGFrZVJlc3BvbnNlKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhWzFdID09PSAweDAwO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGFuZGxlU29ja3M1QXV0aGVudGljYXRpb25Vc2VyUGFzc0hhbmRzaGFrZVJlc3BvbnNlKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhWzFdID09PSAweDAwO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBTb2NrcyB2NSBhdXRoIGhhbmRzaGFrZSByZXNwb25zZS5cbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqL1xuICAgIGhhbmRsZUluaXRpYWxTb2NrczVBdXRoZW50aWNhdGlvbkhhbmRzaGFrZVJlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLlJlY2VpdmVkQXV0aGVudGljYXRpb25SZXNwb25zZSk7XG4gICAgICAgICAgICBsZXQgYXV0aFJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ja3M1Q2hvc2VuQXV0aFR5cGUgPT09IGNvbnN0YW50c18xLlNvY2tzNUF1dGguTm9BdXRoKSB7XG4gICAgICAgICAgICAgICAgYXV0aFJlc3VsdCA9IHlpZWxkIHRoaXMuaGFuZGxlU29ja3M1QXV0aGVudGljYXRpb25Ob0F1dGhIYW5kc2hha2VSZXNwb25zZSh0aGlzLnJlY2VpdmVCdWZmZXIuZ2V0KDIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc29ja3M1Q2hvc2VuQXV0aFR5cGUgPT09IGNvbnN0YW50c18xLlNvY2tzNUF1dGguVXNlclBhc3MpIHtcbiAgICAgICAgICAgICAgICBhdXRoUmVzdWx0ID1cbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdGhpcy5oYW5kbGVTb2NrczVBdXRoZW50aWNhdGlvblVzZXJQYXNzSGFuZHNoYWtlUmVzcG9uc2UodGhpcy5yZWNlaXZlQnVmZmVyLmdldCgyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNvY2tzNUNob3NlbkF1dGhUeXBlID09PSB0aGlzLm9wdGlvbnMucHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgYXV0aFJlc3VsdCA9IHlpZWxkIHRoaXMuaGFuZGxlU29ja3M1Q3VzdG9tQXV0aEhhbmRzaGFrZVJlc3BvbnNlKHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQodGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX3Jlc3BvbnNlX3NpemUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYXV0aFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoY29uc3RhbnRzXzEuRVJST1JTLlNvY2tzNUF1dGhlbnRpY2F0aW9uRmFpbGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZFNvY2tzNUNvbW1hbmRSZXF1ZXN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBTb2NrcyB2NSBmaW5hbCBoYW5kc2hha2UgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBzZW5kU29ja3M1Q29tbWFuZFJlcXVlc3QoKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmYgPSBuZXcgc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIoKTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KDB4MDUpO1xuICAgICAgICBidWZmLndyaXRlVUludDgoY29uc3RhbnRzXzEuU29ja3NDb21tYW5kW3RoaXMub3B0aW9ucy5jb21tYW5kXSk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OCgweDAwKTtcbiAgICAgICAgLy8gaXB2NCwgaXB2NiwgZG9tYWluP1xuICAgICAgICBpZiAobmV0LmlzSVB2NCh0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24uaG9zdCkpIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY0KTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVCdWZmZXIoKDAsIGhlbHBlcnNfMS5pcFRvQnVmZmVyKSh0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24uaG9zdCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5ldC5pc0lQdjYodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpKSB7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2Nik7XG4gICAgICAgICAgICBidWZmLndyaXRlQnVmZmVyKCgwLCBoZWxwZXJzXzEuaXBUb0J1ZmZlcikodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5Ib3N0bmFtZSk7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QubGVuZ3RoKTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVTdHJpbmcodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50MTZCRSh0aGlzLm9wdGlvbnMuZGVzdGluYXRpb24ucG9ydCk7XG4gICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9XG4gICAgICAgICAgICBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1UmVzcG9uc2VIZWFkZXI7XG4gICAgICAgIHRoaXMuc29ja2V0LndyaXRlKGJ1ZmYudG9CdWZmZXIoKSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5TZW50RmluYWxIYW5kc2hha2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIFNvY2tzIHY1IGZpbmFsIGhhbmRzaGFrZSByZXNwb25zZS5cbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqL1xuICAgIGhhbmRsZVNvY2tzNUZpbmFsSGFuZHNoYWtlUmVzcG9uc2UoKSB7XG4gICAgICAgIC8vIFBlZWsgYXQgYXZhaWxhYmxlIGRhdGEgKHdlIG5lZWQgYXQgbGVhc3QgNSBieXRlcyB0byBnZXQgdGhlIGhvc3RuYW1lIGxlbmd0aClcbiAgICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5yZWNlaXZlQnVmZmVyLnBlZWsoNSk7XG4gICAgICAgIGlmIChoZWFkZXJbMF0gIT09IDB4MDUgfHwgaGVhZGVyWzFdICE9PSBjb25zdGFudHNfMS5Tb2NrczVSZXNwb25zZS5HcmFudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGAke2NvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3M1RmluYWxIYW5kc2hha2VSZWplY3RlZH0gLSAke2NvbnN0YW50c18xLlNvY2tzNVJlc3BvbnNlW2hlYWRlclsxXV19YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBSZWFkIGFkZHJlc3MgdHlwZVxuICAgICAgICAgICAgY29uc3QgYWRkcmVzc1R5cGUgPSBoZWFkZXJbM107XG4gICAgICAgICAgICBsZXQgcmVtb3RlSG9zdDtcbiAgICAgICAgICAgIGxldCBidWZmO1xuICAgICAgICAgICAgLy8gSVB2NFxuICAgICAgICAgICAgaWYgKGFkZHJlc3NUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YU5lZWRlZCA9IGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczVSZXNwb25zZUlQdjQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjZWl2ZUJ1ZmZlci5sZW5ndGggPCBkYXRhTmVlZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9IGRhdGFOZWVkZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIodGhpcy5yZWNlaXZlQnVmZmVyLmdldChkYXRhTmVlZGVkKS5zbGljZSg0KSk7XG4gICAgICAgICAgICAgICAgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogKDAsIGhlbHBlcnNfMS5pbnQzMlRvSXB2NCkoYnVmZi5yZWFkVUludDMyQkUoKSksXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJ1ZmYucmVhZFVJbnQxNkJFKCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyBJZiBnaXZlbiBob3N0IGlzIDAuMC4wLjAsIGFzc3VtZSByZW1vdGUgcHJveHkgaXAgaW5zdGVhZC5cbiAgICAgICAgICAgICAgICBpZiAocmVtb3RlSG9zdC5ob3N0ID09PSAnMC4wLjAuMCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlSG9zdC5ob3N0ID0gdGhpcy5vcHRpb25zLnByb3h5LmlwYWRkcmVzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSG9zdG5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJlc3NUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5Ib3N0bmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RMZW5ndGggPSBoZWFkZXJbNF07XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YU5lZWRlZCA9IGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczVSZXNwb25zZUhvc3RuYW1lKGhvc3RMZW5ndGgpOyAvLyBoZWFkZXIgKyBob3N0IGxlbmd0aCArIGhvc3QgKyBwb3J0XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjZWl2ZUJ1ZmZlci5sZW5ndGggPCBkYXRhTmVlZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9IGRhdGFOZWVkZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIodGhpcy5yZWNlaXZlQnVmZmVyLmdldChkYXRhTmVlZGVkKS5zbGljZSg1KSk7XG4gICAgICAgICAgICAgICAgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogYnVmZi5yZWFkU3RyaW5nKGhvc3RMZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBidWZmLnJlYWRVSW50MTZCRSgpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gSVB2NlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWRkcmVzc1R5cGUgPT09IGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLklQdjYpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhTmVlZGVkID0gY29uc3RhbnRzXzEuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTLlNvY2tzNVJlc3BvbnNlSVB2NjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aCA8IGRhdGFOZWVkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplID0gZGF0YU5lZWRlZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmID0gc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIuZnJvbUJ1ZmZlcih0aGlzLnJlY2VpdmVCdWZmZXIuZ2V0KGRhdGFOZWVkZWQpLnNsaWNlKDQpKTtcbiAgICAgICAgICAgICAgICByZW1vdGVIb3N0ID0ge1xuICAgICAgICAgICAgICAgICAgICBob3N0OiBpcF9hZGRyZXNzXzEuQWRkcmVzczYuZnJvbUJ5dGVBcnJheShBcnJheS5mcm9tKGJ1ZmYucmVhZEJ1ZmZlcigxNikpKS5jYW5vbmljYWxGb3JtKCksXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJ1ZmYucmVhZFVJbnQxNkJFKCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGhhdmUgZXZlcnl0aGluZyB3ZSBuZWVkXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuUmVjZWl2ZWRGaW5hbFJlc3BvbnNlKTtcbiAgICAgICAgICAgIC8vIElmIHVzaW5nIENPTk5FQ1QsIHRoZSBjbGllbnQgaXMgbm93IGluIHRoZSBlc3RhYmxpc2hlZCBzdGF0ZS5cbiAgICAgICAgICAgIGlmIChjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmRbdGhpcy5vcHRpb25zLmNvbW1hbmRdID09PSBjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmQuY29ubmVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Fc3RhYmxpc2hlZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJbnRlcm5hbFNvY2tldEhhbmRsZXJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlc3RhYmxpc2hlZCcsIHsgcmVtb3RlSG9zdCwgc29ja2V0OiB0aGlzLnNvY2tldCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbnN0YW50c18xLlNvY2tzQ29tbWFuZFt0aGlzLm9wdGlvbnMuY29tbWFuZF0gPT09IGNvbnN0YW50c18xLlNvY2tzQ29tbWFuZC5iaW5kKSB7XG4gICAgICAgICAgICAgICAgLyogSWYgdXNpbmcgQklORCwgdGhlIFNvY2tzIGNsaWVudCBpcyBub3cgaW4gQm91bmRXYWl0aW5nRm9yQ29ubmVjdGlvbiBzdGF0ZS5cbiAgICAgICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlIHJlbW90ZSBwcm94eSBzZXJ2ZXIgaXMgd2FpdGluZyBmb3IgYSByZW1vdGUgY29ubmVjdGlvbiB0byB0aGUgYm91bmQgcG9ydC4gKi9cbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuQm91bmRXYWl0aW5nRm9yQ29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplID1cbiAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzXzEuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTLlNvY2tzNVJlc3BvbnNlSGVhZGVyO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYm91bmQnLCB7IHJlbW90ZUhvc3QsIHNvY2tldDogdGhpcy5zb2NrZXQgfSk7XG4gICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgIElmIHVzaW5nIEFzc29jaWF0ZSwgdGhlIFNvY2tzIGNsaWVudCBpcyBub3cgRXN0YWJsaXNoZWQuIEFuZCB0aGUgcHJveHkgc2VydmVyIGlzIG5vdyBhY2NlcHRpbmcgVURQIHBhY2tldHMgYXQgdGhlXG4gICAgICAgICAgICAgICAgICBnaXZlbiBib3VuZCBwb3J0LiBUaGlzIGluaXRpYWwgU29ja3MgVENQIGNvbm5lY3Rpb24gbXVzdCByZW1haW4gb3BlbiBmb3IgdGhlIFVEUCByZWxheSB0byBjb250aW51ZSB0byB3b3JrLlxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmRbdGhpcy5vcHRpb25zLmNvbW1hbmRdID09PSBjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmQuYXNzb2NpYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkVzdGFibGlzaGVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUludGVybmFsU29ja2V0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2VzdGFibGlzaGVkJywge1xuICAgICAgICAgICAgICAgICAgICByZW1vdGVIb3N0LFxuICAgICAgICAgICAgICAgICAgICBzb2NrZXQ6IHRoaXMuc29ja2V0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja3MgdjUgaW5jb21pbmcgY29ubmVjdGlvbiByZXF1ZXN0IChCSU5EKS5cbiAgICAgKi9cbiAgICBoYW5kbGVTb2NrczVJbmNvbWluZ0Nvbm5lY3Rpb25SZXNwb25zZSgpIHtcbiAgICAgICAgLy8gUGVlayBhdCBhdmFpbGFibGUgZGF0YSAod2UgbmVlZCBhdCBsZWFzdCA1IGJ5dGVzIHRvIGdldCB0aGUgaG9zdG5hbWUgbGVuZ3RoKVxuICAgICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLnJlY2VpdmVCdWZmZXIucGVlayg1KTtcbiAgICAgICAgaWYgKGhlYWRlclswXSAhPT0gMHgwNSB8fCBoZWFkZXJbMV0gIT09IGNvbnN0YW50c18xLlNvY2tzNVJlc3BvbnNlLkdyYW50ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoYCR7Y29uc3RhbnRzXzEuRVJST1JTLlNvY2tzNVByb3h5UmVqZWN0ZWRJbmNvbWluZ0JvdW5kQ29ubmVjdGlvbn0gLSAke2NvbnN0YW50c18xLlNvY2tzNVJlc3BvbnNlW2hlYWRlclsxXV19YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBSZWFkIGFkZHJlc3MgdHlwZVxuICAgICAgICAgICAgY29uc3QgYWRkcmVzc1R5cGUgPSBoZWFkZXJbM107XG4gICAgICAgICAgICBsZXQgcmVtb3RlSG9zdDtcbiAgICAgICAgICAgIGxldCBidWZmO1xuICAgICAgICAgICAgLy8gSVB2NFxuICAgICAgICAgICAgaWYgKGFkZHJlc3NUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YU5lZWRlZCA9IGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczVSZXNwb25zZUlQdjQ7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjZWl2ZUJ1ZmZlci5sZW5ndGggPCBkYXRhTmVlZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9IGRhdGFOZWVkZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIodGhpcy5yZWNlaXZlQnVmZmVyLmdldChkYXRhTmVlZGVkKS5zbGljZSg0KSk7XG4gICAgICAgICAgICAgICAgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogKDAsIGhlbHBlcnNfMS5pbnQzMlRvSXB2NCkoYnVmZi5yZWFkVUludDMyQkUoKSksXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJ1ZmYucmVhZFVJbnQxNkJFKCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyBJZiBnaXZlbiBob3N0IGlzIDAuMC4wLjAsIGFzc3VtZSByZW1vdGUgcHJveHkgaXAgaW5zdGVhZC5cbiAgICAgICAgICAgICAgICBpZiAocmVtb3RlSG9zdC5ob3N0ID09PSAnMC4wLjAuMCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlSG9zdC5ob3N0ID0gdGhpcy5vcHRpb25zLnByb3h5LmlwYWRkcmVzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSG9zdG5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJlc3NUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5Ib3N0bmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RMZW5ndGggPSBoZWFkZXJbNF07XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YU5lZWRlZCA9IGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczVSZXNwb25zZUhvc3RuYW1lKGhvc3RMZW5ndGgpOyAvLyBoZWFkZXIgKyBob3N0IGxlbmd0aCArIHBvcnRcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aCA8IGRhdGFOZWVkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplID0gZGF0YU5lZWRlZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmID0gc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIuZnJvbUJ1ZmZlcih0aGlzLnJlY2VpdmVCdWZmZXIuZ2V0KGRhdGFOZWVkZWQpLnNsaWNlKDUpKTtcbiAgICAgICAgICAgICAgICByZW1vdGVIb3N0ID0ge1xuICAgICAgICAgICAgICAgICAgICBob3N0OiBidWZmLnJlYWRTdHJpbmcoaG9zdExlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJ1ZmYucmVhZFVJbnQxNkJFKCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyBJUHY2XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzVHlwZSA9PT0gY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2Nikge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFOZWVkZWQgPSBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1UmVzcG9uc2VJUHY2O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlY2VpdmVCdWZmZXIubGVuZ3RoIDwgZGF0YU5lZWRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPSBkYXRhTmVlZGVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmYgPSBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlci5mcm9tQnVmZmVyKHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoZGF0YU5lZWRlZCkuc2xpY2UoNCkpO1xuICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6IGlwX2FkZHJlc3NfMS5BZGRyZXNzNi5mcm9tQnl0ZUFycmF5KEFycmF5LmZyb20oYnVmZi5yZWFkQnVmZmVyKDE2KSkpLmNhbm9uaWNhbEZvcm0oKSxcbiAgICAgICAgICAgICAgICAgICAgcG9ydDogYnVmZi5yZWFkVUludDE2QkUoKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkVzdGFibGlzaGVkKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSW50ZXJuYWxTb2NrZXRIYW5kbGVycygpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlc3RhYmxpc2hlZCcsIHsgcmVtb3RlSG9zdCwgc29ja2V0OiB0aGlzLnNvY2tldCB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc29ja3NDbGllbnRPcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG59XG5leHBvcnRzLlNvY2tzQ2xpZW50ID0gU29ja3NDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zb2Nrc2NsaWVudC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU09DS1M1X05PX0FDQ0VQVEFCTEVfQVVUSCA9IGV4cG9ydHMuU09DS1M1X0NVU1RPTV9BVVRIX0VORCA9IGV4cG9ydHMuU09DS1M1X0NVU1RPTV9BVVRIX1NUQVJUID0gZXhwb3J0cy5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMgPSBleHBvcnRzLlNvY2tzQ2xpZW50U3RhdGUgPSBleHBvcnRzLlNvY2tzNVJlc3BvbnNlID0gZXhwb3J0cy5Tb2NrczVIb3N0VHlwZSA9IGV4cG9ydHMuU29ja3M1QXV0aCA9IGV4cG9ydHMuU29ja3M0UmVzcG9uc2UgPSBleHBvcnRzLlNvY2tzQ29tbWFuZCA9IGV4cG9ydHMuRVJST1JTID0gZXhwb3J0cy5ERUZBVUxUX1RJTUVPVVQgPSB2b2lkIDA7XG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSAzMDAwMDtcbmV4cG9ydHMuREVGQVVMVF9USU1FT1VUID0gREVGQVVMVF9USU1FT1VUO1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBFUlJPUlMgPSB7XG4gICAgSW52YWxpZFNvY2tzQ29tbWFuZDogJ0FuIGludmFsaWQgU09DS1MgY29tbWFuZCB3YXMgcHJvdmlkZWQuIFZhbGlkIG9wdGlvbnMgYXJlIGNvbm5lY3QsIGJpbmQsIGFuZCBhc3NvY2lhdGUuJyxcbiAgICBJbnZhbGlkU29ja3NDb21tYW5kRm9yT3BlcmF0aW9uOiAnQW4gaW52YWxpZCBTT0NLUyBjb21tYW5kIHdhcyBwcm92aWRlZC4gT25seSBhIHN1YnNldCBvZiBjb21tYW5kcyBhcmUgc3VwcG9ydGVkIGZvciB0aGlzIG9wZXJhdGlvbi4nLFxuICAgIEludmFsaWRTb2Nrc0NvbW1hbmRDaGFpbjogJ0FuIGludmFsaWQgU09DS1MgY29tbWFuZCB3YXMgcHJvdmlkZWQuIENoYWluaW5nIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHRoZSBjb25uZWN0IGNvbW1hbmQuJyxcbiAgICBJbnZhbGlkU29ja3NDbGllbnRPcHRpb25zRGVzdGluYXRpb246ICdBbiBpbnZhbGlkIGRlc3RpbmF0aW9uIGhvc3Qgd2FzIHByb3ZpZGVkLicsXG4gICAgSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0V4aXN0aW5nU29ja2V0OiAnQW4gaW52YWxpZCBleGlzdGluZyBzb2NrZXQgd2FzIHByb3ZpZGVkLiBUaGlzIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBzdHJlYW0uRHVwbGV4LicsXG4gICAgSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc1Byb3h5OiAnSW52YWxpZCBTT0NLUyBwcm94eSBkZXRhaWxzIHdlcmUgcHJvdmlkZWQuJyxcbiAgICBJbnZhbGlkU29ja3NDbGllbnRPcHRpb25zVGltZW91dDogJ0FuIGludmFsaWQgdGltZW91dCB2YWx1ZSB3YXMgcHJvdmlkZWQuIFBsZWFzZSBlbnRlciBhIHZhbHVlIGFib3ZlIDAgKGluIG1zKS4nLFxuICAgIEludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNQcm94aWVzTGVuZ3RoOiAnQXQgbGVhc3QgdHdvIHNvY2tzIHByb3hpZXMgbXVzdCBiZSBwcm92aWRlZCBmb3IgY2hhaW5pbmcuJyxcbiAgICBJbnZhbGlkU29ja3NDbGllbnRPcHRpb25zQ3VzdG9tQXV0aFJhbmdlOiAnQ3VzdG9tIGF1dGggbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMHg4MCBhbmQgMHhGRS4nLFxuICAgIEludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNDdXN0b21BdXRoT3B0aW9uczogJ1doZW4gYSBjdXN0b21fYXV0aF9tZXRob2QgaXMgcHJvdmlkZWQsIGN1c3RvbV9hdXRoX3JlcXVlc3RfaGFuZGxlciwgY3VzdG9tX2F1dGhfcmVzcG9uc2Vfc2l6ZSwgYW5kIGN1c3RvbV9hdXRoX3Jlc3BvbnNlX2hhbmRsZXIgbXVzdCBhbHNvIGJlIHByb3ZpZGVkIGFuZCB2YWxpZC4nLFxuICAgIE5lZ290aWF0aW9uRXJyb3I6ICdOZWdvdGlhdGlvbiBlcnJvcicsXG4gICAgU29ja2V0Q2xvc2VkOiAnU29ja2V0IGNsb3NlZCcsXG4gICAgUHJveHlDb25uZWN0aW9uVGltZWRPdXQ6ICdQcm94eSBjb25uZWN0aW9uIHRpbWVkIG91dCcsXG4gICAgSW50ZXJuYWxFcnJvcjogJ1NvY2tzQ2xpZW50IGludGVybmFsIGVycm9yICh0aGlzIHNob3VsZCBub3QgaGFwcGVuKScsXG4gICAgSW52YWxpZFNvY2tzNEhhbmRzaGFrZVJlc3BvbnNlOiAnUmVjZWl2ZWQgaW52YWxpZCBTb2NrczQgaGFuZHNoYWtlIHJlc3BvbnNlJyxcbiAgICBTb2NrczRQcm94eVJlamVjdGVkQ29ubmVjdGlvbjogJ1NvY2tzNCBQcm94eSByZWplY3RlZCBjb25uZWN0aW9uJyxcbiAgICBJbnZhbGlkU29ja3M0SW5jb21pbmdDb25uZWN0aW9uUmVzcG9uc2U6ICdTb2NrczQgaW52YWxpZCBpbmNvbWluZyBjb25uZWN0aW9uIHJlc3BvbnNlJyxcbiAgICBTb2NrczRQcm94eVJlamVjdGVkSW5jb21pbmdCb3VuZENvbm5lY3Rpb246ICdTb2NrczQgUHJveHkgcmVqZWN0ZWQgaW5jb21pbmcgYm91bmQgY29ubmVjdGlvbicsXG4gICAgSW52YWxpZFNvY2tzNUluaXRpYWxIYW5kc2hha2VSZXNwb25zZTogJ1JlY2VpdmVkIGludmFsaWQgU29ja3M1IGluaXRpYWwgaGFuZHNoYWtlIHJlc3BvbnNlJyxcbiAgICBJbnZhbGlkU29ja3M1SW50aWFpbEhhbmRzaGFrZVNvY2tzVmVyc2lvbjogJ1JlY2VpdmVkIGludmFsaWQgU29ja3M1IGluaXRpYWwgaGFuZHNoYWtlIChpbnZhbGlkIHNvY2tzIHZlcnNpb24pJyxcbiAgICBJbnZhbGlkU29ja3M1SW5pdGlhbEhhbmRzaGFrZU5vQWNjZXB0ZWRBdXRoVHlwZTogJ1JlY2VpdmVkIGludmFsaWQgU29ja3M1IGluaXRpYWwgaGFuZHNoYWtlIChubyBhY2NlcHRlZCBhdXRoZW50aWNhdGlvbiB0eXBlKScsXG4gICAgSW52YWxpZFNvY2tzNUluaXRpYWxIYW5kc2hha2VVbmtub3duQXV0aFR5cGU6ICdSZWNlaXZlZCBpbnZhbGlkIFNvY2tzNSBpbml0aWFsIGhhbmRzaGFrZSAodW5rbm93biBhdXRoZW50aWNhdGlvbiB0eXBlKScsXG4gICAgU29ja3M1QXV0aGVudGljYXRpb25GYWlsZWQ6ICdTb2NrczUgQXV0aGVudGljYXRpb24gZmFpbGVkJyxcbiAgICBJbnZhbGlkU29ja3M1RmluYWxIYW5kc2hha2U6ICdSZWNlaXZlZCBpbnZhbGlkIFNvY2tzNSBmaW5hbCBoYW5kc2hha2UgcmVzcG9uc2UnLFxuICAgIEludmFsaWRTb2NrczVGaW5hbEhhbmRzaGFrZVJlamVjdGVkOiAnU29ja3M1IHByb3h5IHJlamVjdGVkIGNvbm5lY3Rpb24nLFxuICAgIEludmFsaWRTb2NrczVJbmNvbWluZ0Nvbm5lY3Rpb25SZXNwb25zZTogJ1JlY2VpdmVkIGludmFsaWQgU29ja3M1IGluY29taW5nIGNvbm5lY3Rpb24gcmVzcG9uc2UnLFxuICAgIFNvY2tzNVByb3h5UmVqZWN0ZWRJbmNvbWluZ0JvdW5kQ29ubmVjdGlvbjogJ1NvY2tzNSBQcm94eSByZWplY3RlZCBpbmNvbWluZyBib3VuZCBjb25uZWN0aW9uJyxcbn07XG5leHBvcnRzLkVSUk9SUyA9IEVSUk9SUztcbmNvbnN0IFNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUyA9IHtcbiAgICBTb2NrczVJbml0aWFsSGFuZHNoYWtlUmVzcG9uc2U6IDIsXG4gICAgU29ja3M1VXNlclBhc3NBdXRoZW50aWNhdGlvblJlc3BvbnNlOiAyLFxuICAgIC8vIENvbW1hbmQgcmVzcG9uc2UgKyBpbmNvbWluZyBjb25uZWN0aW9uIChiaW5kKVxuICAgIFNvY2tzNVJlc3BvbnNlSGVhZGVyOiA1LCAvLyBXZSBuZWVkIGF0IGxlYXN0IDUgdG8gcmVhZCB0aGUgaG9zdG5hbWUgbGVuZ3RoLCB0aGVuIHdlIHdhaXQgZm9yIHRoZSBhZGRyZXNzK3BvcnQgaW5mb3JtYXRpb24uXG4gICAgU29ja3M1UmVzcG9uc2VJUHY0OiAxMCwgLy8gNCBoZWFkZXIgKyA0IGlwICsgMiBwb3J0XG4gICAgU29ja3M1UmVzcG9uc2VJUHY2OiAyMiwgLy8gNCBoZWFkZXIgKyAxNiBpcCArIDIgcG9ydFxuICAgIFNvY2tzNVJlc3BvbnNlSG9zdG5hbWU6IChob3N0TmFtZUxlbmd0aCkgPT4gaG9zdE5hbWVMZW5ndGggKyA3LCAvLyA0IGhlYWRlciArIDEgaG9zdCBsZW5ndGggKyBob3N0ICsgMiBwb3J0XG4gICAgLy8gQ29tbWFuZCByZXNwb25zZSArIGluY29taW5nIGNvbm5lY3Rpb24gKGJpbmQpXG4gICAgU29ja3M0UmVzcG9uc2U6IDgsIC8vIDIgaGVhZGVyICsgMiBwb3J0ICsgNCBpcFxufTtcbmV4cG9ydHMuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTID0gU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTO1xudmFyIFNvY2tzQ29tbWFuZDtcbihmdW5jdGlvbiAoU29ja3NDb21tYW5kKSB7XG4gICAgU29ja3NDb21tYW5kW1NvY2tzQ29tbWFuZFtcImNvbm5lY3RcIl0gPSAxXSA9IFwiY29ubmVjdFwiO1xuICAgIFNvY2tzQ29tbWFuZFtTb2Nrc0NvbW1hbmRbXCJiaW5kXCJdID0gMl0gPSBcImJpbmRcIjtcbiAgICBTb2Nrc0NvbW1hbmRbU29ja3NDb21tYW5kW1wiYXNzb2NpYXRlXCJdID0gM10gPSBcImFzc29jaWF0ZVwiO1xufSkoU29ja3NDb21tYW5kIHx8IChleHBvcnRzLlNvY2tzQ29tbWFuZCA9IFNvY2tzQ29tbWFuZCA9IHt9KSk7XG52YXIgU29ja3M0UmVzcG9uc2U7XG4oZnVuY3Rpb24gKFNvY2tzNFJlc3BvbnNlKSB7XG4gICAgU29ja3M0UmVzcG9uc2VbU29ja3M0UmVzcG9uc2VbXCJHcmFudGVkXCJdID0gOTBdID0gXCJHcmFudGVkXCI7XG4gICAgU29ja3M0UmVzcG9uc2VbU29ja3M0UmVzcG9uc2VbXCJGYWlsZWRcIl0gPSA5MV0gPSBcIkZhaWxlZFwiO1xuICAgIFNvY2tzNFJlc3BvbnNlW1NvY2tzNFJlc3BvbnNlW1wiUmVqZWN0ZWRcIl0gPSA5Ml0gPSBcIlJlamVjdGVkXCI7XG4gICAgU29ja3M0UmVzcG9uc2VbU29ja3M0UmVzcG9uc2VbXCJSZWplY3RlZElkZW50XCJdID0gOTNdID0gXCJSZWplY3RlZElkZW50XCI7XG59KShTb2NrczRSZXNwb25zZSB8fCAoZXhwb3J0cy5Tb2NrczRSZXNwb25zZSA9IFNvY2tzNFJlc3BvbnNlID0ge30pKTtcbnZhciBTb2NrczVBdXRoO1xuKGZ1bmN0aW9uIChTb2NrczVBdXRoKSB7XG4gICAgU29ja3M1QXV0aFtTb2NrczVBdXRoW1wiTm9BdXRoXCJdID0gMF0gPSBcIk5vQXV0aFwiO1xuICAgIFNvY2tzNUF1dGhbU29ja3M1QXV0aFtcIkdTU0FwaVwiXSA9IDFdID0gXCJHU1NBcGlcIjtcbiAgICBTb2NrczVBdXRoW1NvY2tzNUF1dGhbXCJVc2VyUGFzc1wiXSA9IDJdID0gXCJVc2VyUGFzc1wiO1xufSkoU29ja3M1QXV0aCB8fCAoZXhwb3J0cy5Tb2NrczVBdXRoID0gU29ja3M1QXV0aCA9IHt9KSk7XG5jb25zdCBTT0NLUzVfQ1VTVE9NX0FVVEhfU1RBUlQgPSAweDgwO1xuZXhwb3J0cy5TT0NLUzVfQ1VTVE9NX0FVVEhfU1RBUlQgPSBTT0NLUzVfQ1VTVE9NX0FVVEhfU1RBUlQ7XG5jb25zdCBTT0NLUzVfQ1VTVE9NX0FVVEhfRU5EID0gMHhmZTtcbmV4cG9ydHMuU09DS1M1X0NVU1RPTV9BVVRIX0VORCA9IFNPQ0tTNV9DVVNUT01fQVVUSF9FTkQ7XG5jb25zdCBTT0NLUzVfTk9fQUNDRVBUQUJMRV9BVVRIID0gMHhmZjtcbmV4cG9ydHMuU09DS1M1X05PX0FDQ0VQVEFCTEVfQVVUSCA9IFNPQ0tTNV9OT19BQ0NFUFRBQkxFX0FVVEg7XG52YXIgU29ja3M1UmVzcG9uc2U7XG4oZnVuY3Rpb24gKFNvY2tzNVJlc3BvbnNlKSB7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJHcmFudGVkXCJdID0gMF0gPSBcIkdyYW50ZWRcIjtcbiAgICBTb2NrczVSZXNwb25zZVtTb2NrczVSZXNwb25zZVtcIkZhaWx1cmVcIl0gPSAxXSA9IFwiRmFpbHVyZVwiO1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiTm90QWxsb3dlZFwiXSA9IDJdID0gXCJOb3RBbGxvd2VkXCI7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJOZXR3b3JrVW5yZWFjaGFibGVcIl0gPSAzXSA9IFwiTmV0d29ya1VucmVhY2hhYmxlXCI7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJIb3N0VW5yZWFjaGFibGVcIl0gPSA0XSA9IFwiSG9zdFVucmVhY2hhYmxlXCI7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJDb25uZWN0aW9uUmVmdXNlZFwiXSA9IDVdID0gXCJDb25uZWN0aW9uUmVmdXNlZFwiO1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiVFRMRXhwaXJlZFwiXSA9IDZdID0gXCJUVExFeHBpcmVkXCI7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJDb21tYW5kTm90U3VwcG9ydGVkXCJdID0gN10gPSBcIkNvbW1hbmROb3RTdXBwb3J0ZWRcIjtcbiAgICBTb2NrczVSZXNwb25zZVtTb2NrczVSZXNwb25zZVtcIkFkZHJlc3NOb3RTdXBwb3J0ZWRcIl0gPSA4XSA9IFwiQWRkcmVzc05vdFN1cHBvcnRlZFwiO1xufSkoU29ja3M1UmVzcG9uc2UgfHwgKGV4cG9ydHMuU29ja3M1UmVzcG9uc2UgPSBTb2NrczVSZXNwb25zZSA9IHt9KSk7XG52YXIgU29ja3M1SG9zdFR5cGU7XG4oZnVuY3Rpb24gKFNvY2tzNUhvc3RUeXBlKSB7XG4gICAgU29ja3M1SG9zdFR5cGVbU29ja3M1SG9zdFR5cGVbXCJJUHY0XCJdID0gMV0gPSBcIklQdjRcIjtcbiAgICBTb2NrczVIb3N0VHlwZVtTb2NrczVIb3N0VHlwZVtcIkhvc3RuYW1lXCJdID0gM10gPSBcIkhvc3RuYW1lXCI7XG4gICAgU29ja3M1SG9zdFR5cGVbU29ja3M1SG9zdFR5cGVbXCJJUHY2XCJdID0gNF0gPSBcIklQdjZcIjtcbn0pKFNvY2tzNUhvc3RUeXBlIHx8IChleHBvcnRzLlNvY2tzNUhvc3RUeXBlID0gU29ja3M1SG9zdFR5cGUgPSB7fSkpO1xudmFyIFNvY2tzQ2xpZW50U3RhdGU7XG4oZnVuY3Rpb24gKFNvY2tzQ2xpZW50U3RhdGUpIHtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJDcmVhdGVkXCJdID0gMF0gPSBcIkNyZWF0ZWRcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJDb25uZWN0aW5nXCJdID0gMV0gPSBcIkNvbm5lY3RpbmdcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJDb25uZWN0ZWRcIl0gPSAyXSA9IFwiQ29ubmVjdGVkXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiU2VudEluaXRpYWxIYW5kc2hha2VcIl0gPSAzXSA9IFwiU2VudEluaXRpYWxIYW5kc2hha2VcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJSZWNlaXZlZEluaXRpYWxIYW5kc2hha2VSZXNwb25zZVwiXSA9IDRdID0gXCJSZWNlaXZlZEluaXRpYWxIYW5kc2hha2VSZXNwb25zZVwiO1xuICAgIFNvY2tzQ2xpZW50U3RhdGVbU29ja3NDbGllbnRTdGF0ZVtcIlNlbnRBdXRoZW50aWNhdGlvblwiXSA9IDVdID0gXCJTZW50QXV0aGVudGljYXRpb25cIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJSZWNlaXZlZEF1dGhlbnRpY2F0aW9uUmVzcG9uc2VcIl0gPSA2XSA9IFwiUmVjZWl2ZWRBdXRoZW50aWNhdGlvblJlc3BvbnNlXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiU2VudEZpbmFsSGFuZHNoYWtlXCJdID0gN10gPSBcIlNlbnRGaW5hbEhhbmRzaGFrZVwiO1xuICAgIFNvY2tzQ2xpZW50U3RhdGVbU29ja3NDbGllbnRTdGF0ZVtcIlJlY2VpdmVkRmluYWxSZXNwb25zZVwiXSA9IDhdID0gXCJSZWNlaXZlZEZpbmFsUmVzcG9uc2VcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJCb3VuZFdhaXRpbmdGb3JDb25uZWN0aW9uXCJdID0gOV0gPSBcIkJvdW5kV2FpdGluZ0ZvckNvbm5lY3Rpb25cIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJFc3RhYmxpc2hlZFwiXSA9IDEwXSA9IFwiRXN0YWJsaXNoZWRcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJEaXNjb25uZWN0ZWRcIl0gPSAxMV0gPSBcIkRpc2Nvbm5lY3RlZFwiO1xuICAgIFNvY2tzQ2xpZW50U3RhdGVbU29ja3NDbGllbnRTdGF0ZVtcIkVycm9yXCJdID0gOTldID0gXCJFcnJvclwiO1xufSkoU29ja3NDbGllbnRTdGF0ZSB8fCAoZXhwb3J0cy5Tb2Nrc0NsaWVudFN0YXRlID0gU29ja3NDbGllbnRTdGF0ZSA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdGFudHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlwVG9CdWZmZXIgPSBleHBvcnRzLmludDMyVG9JcHY0ID0gZXhwb3J0cy5pcHY0VG9JbnQzMiA9IGV4cG9ydHMudmFsaWRhdGVTb2Nrc0NsaWVudENoYWluT3B0aW9ucyA9IGV4cG9ydHMudmFsaWRhdGVTb2Nrc0NsaWVudE9wdGlvbnMgPSB2b2lkIDA7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi9jb25zdGFudHNcIik7XG5jb25zdCBzdHJlYW0gPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY29uc3QgaXBfYWRkcmVzc18xID0gcmVxdWlyZShcImlwLWFkZHJlc3NcIik7XG5jb25zdCBuZXQgPSByZXF1aXJlKFwibmV0XCIpO1xuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIHByb3ZpZGVkIFNvY2tzQ2xpZW50T3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnMgeyBTb2Nrc0NsaWVudE9wdGlvbnMgfVxuICogQHBhcmFtIGFjY2VwdGVkQ29tbWFuZHMgeyBzdHJpbmdbXSB9IEEgbGlzdCBvZiBhY2NlcHRlZCBTb2Nrc1Byb3h5IGNvbW1hbmRzLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVNvY2tzQ2xpZW50T3B0aW9ucyhvcHRpb25zLCBhY2NlcHRlZENvbW1hbmRzID0gWydjb25uZWN0JywgJ2JpbmQnLCAnYXNzb2NpYXRlJ10pIHtcbiAgICAvLyBDaGVjayBTT0NLcyBjb21tYW5kIG9wdGlvbi5cbiAgICBpZiAoIWNvbnN0YW50c18xLlNvY2tzQ29tbWFuZFtvcHRpb25zLmNvbW1hbmRdKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ29tbWFuZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIENoZWNrIFNvY2tzQ29tbWFuZCBmb3IgYWNjZXB0YWJsZSBjb21tYW5kLlxuICAgIGlmIChhY2NlcHRlZENvbW1hbmRzLmluZGV4T2Yob3B0aW9ucy5jb21tYW5kKSA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDb21tYW5kRm9yT3BlcmF0aW9uLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgZGVzdGluYXRpb25cbiAgICBpZiAoIWlzVmFsaWRTb2Nrc1JlbW90ZUhvc3Qob3B0aW9ucy5kZXN0aW5hdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zRGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBDaGVjayBTT0NLUyBwcm94eSB0byB1c2VcbiAgICBpZiAoIWlzVmFsaWRTb2Nrc1Byb3h5KG9wdGlvbnMucHJveHkpKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc1Byb3h5LCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgY3VzdG9tIGF1dGggKGlmIHNldClcbiAgICB2YWxpZGF0ZUN1c3RvbVByb3h5QXV0aChvcHRpb25zLnByb3h5LCBvcHRpb25zKTtcbiAgICAvLyBDaGVjayB0aW1lb3V0XG4gICAgaWYgKG9wdGlvbnMudGltZW91dCAmJiAhaXNWYWxpZFRpbWVvdXRWYWx1ZShvcHRpb25zLnRpbWVvdXQpKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc1RpbWVvdXQsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBDaGVjayBleGlzdGluZ19zb2NrZXQgKGlmIHByb3ZpZGVkKVxuICAgIGlmIChvcHRpb25zLmV4aXN0aW5nX3NvY2tldCAmJlxuICAgICAgICAhKG9wdGlvbnMuZXhpc3Rpbmdfc29ja2V0IGluc3RhbmNlb2Ygc3RyZWFtLkR1cGxleCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zRXhpc3RpbmdTb2NrZXQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbmV4cG9ydHMudmFsaWRhdGVTb2Nrc0NsaWVudE9wdGlvbnMgPSB2YWxpZGF0ZVNvY2tzQ2xpZW50T3B0aW9ucztcbi8qKlxuICogVmFsaWRhdGVzIHRoZSBTb2Nrc0NsaWVudENoYWluT3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnMgeyBTb2Nrc0NsaWVudENoYWluT3B0aW9ucyB9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU29ja3NDbGllbnRDaGFpbk9wdGlvbnMob3B0aW9ucykge1xuICAgIC8vIE9ubHkgY29ubmVjdCBpcyBzdXBwb3J0ZWQgd2hlbiBjaGFpbmluZy5cbiAgICBpZiAob3B0aW9ucy5jb21tYW5kICE9PSAnY29ubmVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDb21tYW5kQ2hhaW4sIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBDaGVjayBkZXN0aW5hdGlvblxuICAgIGlmICghaXNWYWxpZFNvY2tzUmVtb3RlSG9zdChvcHRpb25zLmRlc3RpbmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNEZXN0aW5hdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIHByb3hpZXMgKGxlbmd0aClcbiAgICBpZiAoIShvcHRpb25zLnByb3hpZXMgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShvcHRpb25zLnByb3hpZXMpICYmXG4gICAgICAgIG9wdGlvbnMucHJveGllcy5sZW5ndGggPj0gMikpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zUHJveGllc0xlbmd0aCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIHByb3hpZXNcbiAgICBvcHRpb25zLnByb3hpZXMuZm9yRWFjaCgocHJveHkpID0+IHtcbiAgICAgICAgaWYgKCFpc1ZhbGlkU29ja3NQcm94eShwcm94eSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc1Byb3h5LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWYWxpZGF0ZSBjdXN0b20gYXV0aCAoaWYgc2V0KVxuICAgICAgICB2YWxpZGF0ZUN1c3RvbVByb3h5QXV0aChwcm94eSwgb3B0aW9ucyk7XG4gICAgfSk7XG4gICAgLy8gQ2hlY2sgdGltZW91dFxuICAgIGlmIChvcHRpb25zLnRpbWVvdXQgJiYgIWlzVmFsaWRUaW1lb3V0VmFsdWUob3B0aW9ucy50aW1lb3V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNUaW1lb3V0LCBvcHRpb25zKTtcbiAgICB9XG59XG5leHBvcnRzLnZhbGlkYXRlU29ja3NDbGllbnRDaGFpbk9wdGlvbnMgPSB2YWxpZGF0ZVNvY2tzQ2xpZW50Q2hhaW5PcHRpb25zO1xuZnVuY3Rpb24gdmFsaWRhdGVDdXN0b21Qcm94eUF1dGgocHJveHksIG9wdGlvbnMpIHtcbiAgICBpZiAocHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gSW52YWxpZCBhdXRoIG1ldGhvZCByYW5nZVxuICAgICAgICBpZiAocHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kIDwgY29uc3RhbnRzXzEuU09DS1M1X0NVU1RPTV9BVVRIX1NUQVJUIHx8XG4gICAgICAgICAgICBwcm94eS5jdXN0b21fYXV0aF9tZXRob2QgPiBjb25zdGFudHNfMS5TT0NLUzVfQ1VTVE9NX0FVVEhfRU5EKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNDdXN0b21BdXRoUmFuZ2UsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1pc3NpbmcgY3VzdG9tX2F1dGhfcmVxdWVzdF9oYW5kbGVyXG4gICAgICAgIGlmIChwcm94eS5jdXN0b21fYXV0aF9yZXF1ZXN0X2hhbmRsZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgdHlwZW9mIHByb3h5LmN1c3RvbV9hdXRoX3JlcXVlc3RfaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zQ3VzdG9tQXV0aE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1pc3NpbmcgY3VzdG9tX2F1dGhfcmVzcG9uc2Vfc2l6ZVxuICAgICAgICBpZiAocHJveHkuY3VzdG9tX2F1dGhfcmVzcG9uc2Vfc2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNDdXN0b21BdXRoT3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWlzc2luZy9pbnZhbGlkIGN1c3RvbV9hdXRoX3Jlc3BvbnNlX2hhbmRsZXJcbiAgICAgICAgaWYgKHByb3h5LmN1c3RvbV9hdXRoX3Jlc3BvbnNlX2hhbmRsZXIgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgdHlwZW9mIHByb3h5LmN1c3RvbV9hdXRoX3Jlc3BvbnNlX2hhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0N1c3RvbUF1dGhPcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogVmFsaWRhdGVzIGEgU29ja3NSZW1vdGVIb3N0XG4gKiBAcGFyYW0gcmVtb3RlSG9zdCB7IFNvY2tzUmVtb3RlSG9zdCB9XG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTb2Nrc1JlbW90ZUhvc3QocmVtb3RlSG9zdCkge1xuICAgIHJldHVybiAocmVtb3RlSG9zdCAmJlxuICAgICAgICB0eXBlb2YgcmVtb3RlSG9zdC5ob3N0ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB0eXBlb2YgcmVtb3RlSG9zdC5wb3J0ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICByZW1vdGVIb3N0LnBvcnQgPj0gMCAmJlxuICAgICAgICByZW1vdGVIb3N0LnBvcnQgPD0gNjU1MzUpO1xufVxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBTb2Nrc1Byb3h5XG4gKiBAcGFyYW0gcHJveHkgeyBTb2Nrc1Byb3h5IH1cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFNvY2tzUHJveHkocHJveHkpIHtcbiAgICByZXR1cm4gKHByb3h5ICYmXG4gICAgICAgICh0eXBlb2YgcHJveHkuaG9zdCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3h5LmlwYWRkcmVzcyA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgIHR5cGVvZiBwcm94eS5wb3J0ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICBwcm94eS5wb3J0ID49IDAgJiZcbiAgICAgICAgcHJveHkucG9ydCA8PSA2NTUzNSAmJlxuICAgICAgICAocHJveHkudHlwZSA9PT0gNCB8fCBwcm94eS50eXBlID09PSA1KSk7XG59XG4vKipcbiAqIFZhbGlkYXRlcyBhIHRpbWVvdXQgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfVxuICovXG5mdW5jdGlvbiBpc1ZhbGlkVGltZW91dFZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgPiAwO1xufVxuZnVuY3Rpb24gaXB2NFRvSW50MzIoaXApIHtcbiAgICBjb25zdCBhZGRyZXNzID0gbmV3IGlwX2FkZHJlc3NfMS5BZGRyZXNzNChpcCk7XG4gICAgLy8gQ29udmVydCB0aGUgSVB2NCBhZGRyZXNzIHBhcnRzIHRvIGFuIGludGVnZXJcbiAgICByZXR1cm4gYWRkcmVzcy50b0FycmF5KCkucmVkdWNlKChhY2MsIHBhcnQpID0+IChhY2MgPDwgOCkgKyBwYXJ0LCAwKTtcbn1cbmV4cG9ydHMuaXB2NFRvSW50MzIgPSBpcHY0VG9JbnQzMjtcbmZ1bmN0aW9uIGludDMyVG9JcHY0KGludDMyKSB7XG4gICAgLy8gRXh0cmFjdCBlYWNoIGJ5dGUgKG9jdGV0KSBmcm9tIHRoZSAzMi1iaXQgaW50ZWdlclxuICAgIGNvbnN0IG9jdGV0MSA9IChpbnQzMiA+Pj4gMjQpICYgMHhmZjtcbiAgICBjb25zdCBvY3RldDIgPSAoaW50MzIgPj4+IDE2KSAmIDB4ZmY7XG4gICAgY29uc3Qgb2N0ZXQzID0gKGludDMyID4+PiA4KSAmIDB4ZmY7XG4gICAgY29uc3Qgb2N0ZXQ0ID0gaW50MzIgJiAweGZmO1xuICAgIC8vIENvbWJpbmUgdGhlIG9jdGV0cyBpbnRvIGEgc3RyaW5nIGluIElQdjQgZm9ybWF0XG4gICAgcmV0dXJuIFtvY3RldDEsIG9jdGV0Miwgb2N0ZXQzLCBvY3RldDRdLmpvaW4oJy4nKTtcbn1cbmV4cG9ydHMuaW50MzJUb0lwdjQgPSBpbnQzMlRvSXB2NDtcbmZ1bmN0aW9uIGlwVG9CdWZmZXIoaXApIHtcbiAgICBpZiAobmV0LmlzSVB2NChpcCkpIHtcbiAgICAgICAgLy8gSGFuZGxlIElQdjQgYWRkcmVzc2VzXG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSBuZXcgaXBfYWRkcmVzc18xLkFkZHJlc3M0KGlwKTtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFkZHJlc3MudG9BcnJheSgpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAobmV0LmlzSVB2NihpcCkpIHtcbiAgICAgICAgLy8gSGFuZGxlIElQdjYgYWRkcmVzc2VzXG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSBuZXcgaXBfYWRkcmVzc18xLkFkZHJlc3M2KGlwKTtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFkZHJlc3NcbiAgICAgICAgICAgIC5jYW5vbmljYWxGb3JtKClcbiAgICAgICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgICAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnBhZFN0YXJ0KDQsICcwJykpXG4gICAgICAgICAgICAuam9pbignJyksICdoZXgnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBJUCBhZGRyZXNzIGZvcm1hdCcpO1xuICAgIH1cbn1cbmV4cG9ydHMuaXBUb0J1ZmZlciA9IGlwVG9CdWZmZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oZWxwZXJzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWNlaXZlQnVmZmVyID0gdm9pZCAwO1xuY2xhc3MgUmVjZWl2ZUJ1ZmZlciB7XG4gICAgY29uc3RydWN0b3Ioc2l6ZSA9IDQwOTYpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUoc2l6ZSk7XG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5vcmlnaW5hbFNpemUgPSBzaXplO1xuICAgIH1cbiAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXQ7XG4gICAgfVxuICAgIGFwcGVuZChkYXRhKSB7XG4gICAgICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byBhcHBlbmQgYSBub24tYnVmZmVyIGluc3RhbmNlIHRvIFJlY2VpdmVCdWZmZXIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0ICsgZGF0YS5sZW5ndGggPj0gdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB0bXAgPSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKE1hdGgubWF4KHRoaXMuYnVmZmVyLmxlbmd0aCArIHRoaXMub3JpZ2luYWxTaXplLCB0aGlzLmJ1ZmZlci5sZW5ndGggKyBkYXRhLmxlbmd0aCkpO1xuICAgICAgICAgICAgdG1wLmNvcHkodGhpcy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEuY29weSh0aGlzLmJ1ZmZlciwgdGhpcy5vZmZzZXQpO1xuICAgICAgICByZXR1cm4gKHRoaXMub2Zmc2V0ICs9IGRhdGEubGVuZ3RoKTtcbiAgICB9XG4gICAgcGVlayhsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA+IHRoaXMub2Zmc2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byByZWFkIGJleW9uZCB0aGUgYm91bmRzIG9mIHRoZSBtYW5hZ2VkIGludGVybmFsIGRhdGEuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLnNsaWNlKDAsIGxlbmd0aCk7XG4gICAgfVxuICAgIGdldChsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA+IHRoaXMub2Zmc2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byByZWFkIGJleW9uZCB0aGUgYm91bmRzIG9mIHRoZSBtYW5hZ2VkIGludGVybmFsIGRhdGEuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKTtcbiAgICAgICAgdGhpcy5idWZmZXIuc2xpY2UoMCwgbGVuZ3RoKS5jb3B5KHZhbHVlKTtcbiAgICAgICAgdGhpcy5idWZmZXIuY29weVdpdGhpbigwLCBsZW5ndGgsIGxlbmd0aCArIHRoaXMub2Zmc2V0IC0gbGVuZ3RoKTtcbiAgICAgICAgdGhpcy5vZmZzZXQgLT0gbGVuZ3RoO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuZXhwb3J0cy5SZWNlaXZlQnVmZmVyID0gUmVjZWl2ZUJ1ZmZlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlY2VpdmVidWZmZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnNodWZmbGVBcnJheSA9IGV4cG9ydHMuU29ja3NDbGllbnRFcnJvciA9IHZvaWQgMDtcbi8qKlxuICogRXJyb3Igd3JhcHBlciBmb3IgU29ja3NDbGllbnRcbiAqL1xuY2xhc3MgU29ja3NDbGllbnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbn1cbmV4cG9ydHMuU29ja3NDbGllbnRFcnJvciA9IFNvY2tzQ2xpZW50RXJyb3I7XG4vKipcbiAqIFNodWZmbGVzIGEgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gKi9cbmZ1bmN0aW9uIHNodWZmbGVBcnJheShhcnJheSkge1xuICAgIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcbiAgICAgICAgW2FycmF5W2ldLCBhcnJheVtqXV0gPSBbYXJyYXlbal0sIGFycmF5W2ldXTtcbiAgICB9XG59XG5leHBvcnRzLnNodWZmbGVBcnJheSA9IHNodWZmbGVBcnJheTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWwuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9jbGllbnQvc29ja3NjbGllbnRcIiksIGV4cG9ydHMpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaGFzTmF0aXZlTWFwID0gdHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4gYXJyYXkgYW5kIGEgc2V0LiBBZGRpbmcgYSBuZXdcbiAqIG1lbWJlciBpcyBPKDEpLCB0ZXN0aW5nIGZvciBtZW1iZXJzaGlwIGlzIE8oMSksIGFuZCBmaW5kaW5nIHRoZSBpbmRleCBvZiBhblxuICogZWxlbWVudCBpcyBPKDEpLiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSBzZXQgaXMgbm90IHN1cHBvcnRlZC4gT25seVxuICogc3RyaW5ncyBhcmUgc3VwcG9ydGVkIGZvciBtZW1iZXJzaGlwLlxuICovXG5mdW5jdGlvbiBBcnJheVNldCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc2V0ID0gaGFzTmF0aXZlTWFwID8gbmV3IE1hcCgpIDogT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLyoqXG4gKiBTdGF0aWMgbWV0aG9kIGZvciBjcmVhdGluZyBBcnJheVNldCBpbnN0YW5jZXMgZnJvbSBhbiBleGlzdGluZyBhcnJheS5cbiAqL1xuQXJyYXlTZXQuZnJvbUFycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfZnJvbUFycmF5KGFBcnJheSwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc2V0ID0gbmV3IEFycmF5U2V0KCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzZXQuYWRkKGFBcnJheVtpXSwgYUFsbG93RHVwbGljYXRlcyk7XG4gIH1cbiAgcmV0dXJuIHNldDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhvdyBtYW55IHVuaXF1ZSBpdGVtcyBhcmUgaW4gdGhpcyBBcnJheVNldC4gSWYgZHVwbGljYXRlcyBoYXZlIGJlZW5cbiAqIGFkZGVkLCB0aGFuIHRob3NlIGRvIG5vdCBjb3VudCB0b3dhcmRzIHRoZSBzaXplLlxuICpcbiAqIEByZXR1cm5zIE51bWJlclxuICovXG5BcnJheVNldC5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uIEFycmF5U2V0X3NpemUoKSB7XG4gIHJldHVybiBoYXNOYXRpdmVNYXAgPyB0aGlzLl9zZXQuc2l6ZSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuX3NldCkubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHN0cmluZyB0byB0aGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIEFycmF5U2V0X2FkZChhU3RyLCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzU3RyID0gaGFzTmF0aXZlTWFwID8gYVN0ciA6IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gIHZhciBpc0R1cGxpY2F0ZSA9IGhhc05hdGl2ZU1hcCA/IHRoaXMuaGFzKGFTdHIpIDogaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgdmFyIGlkeCA9IHRoaXMuX2FycmF5Lmxlbmd0aDtcbiAgaWYgKCFpc0R1cGxpY2F0ZSB8fCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhU3RyKTtcbiAgfVxuICBpZiAoIWlzRHVwbGljYXRlKSB7XG4gICAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgICAgdGhpcy5fc2V0LnNldChhU3RyLCBpZHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRbc1N0cl0gPSBpZHg7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIElzIHRoZSBnaXZlbiBzdHJpbmcgYSBtZW1iZXIgb2YgdGhpcyBzZXQ/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBBcnJheVNldF9oYXMoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldC5oYXMoYVN0cik7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB9XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlIGFycmF5P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIEFycmF5U2V0X2luZGV4T2YoYVN0cikge1xuICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgdmFyIGlkeCA9IHRoaXMuX3NldC5nZXQoYVN0cik7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICBpZiAoaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NldFtzU3RyXTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTdHIgKyAnXCIgaXMgbm90IGluIHRoZSBzZXQuJyk7XG59O1xuXG4vKipcbiAqIFdoYXQgaXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4P1xuICpcbiAqIEBwYXJhbSBOdW1iZXIgYUlkeFxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBBcnJheVNldF9hdChhSWR4KSB7XG4gIGlmIChhSWR4ID49IDAgJiYgYUlkeCA8IHRoaXMuX2FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVthSWR4XTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVsZW1lbnQgaW5kZXhlZCBieSAnICsgYUlkeCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2V0ICh3aGljaCBoYXMgdGhlIHByb3BlciBpbmRpY2VzXG4gKiBpbmRpY2F0ZWQgYnkgaW5kZXhPZikuIE5vdGUgdGhhdCB0aGlzIGlzIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgYXJyYXkgdXNlZFxuICogZm9yIHN0b3JpbmcgdGhlIG1lbWJlcnMgc28gdGhhdCBubyBvbmUgY2FuIG1lc3Mgd2l0aCBpbnRlcm5hbCBzdGF0ZS5cbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF90b0FycmF5KCkge1xuICByZXR1cm4gdGhpcy5fYXJyYXkuc2xpY2UoKTtcbn07XG5cbmV4cG9ydHMuQXJyYXlTZXQgPSBBcnJheVNldDtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKlxuICogQmFzZWQgb24gdGhlIEJhc2UgNjQgVkxRIGltcGxlbWVudGF0aW9uIGluIENsb3N1cmUgQ29tcGlsZXI6XG4gKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nsb3N1cmUtY29tcGlsZXIvc291cmNlL2Jyb3dzZS90cnVuay9zcmMvY29tL2dvb2dsZS9kZWJ1Z2dpbmcvc291cmNlbWFwL0Jhc2U2NFZMUS5qYXZhXG4gKlxuICogQ29weXJpZ2h0IDIwMTEgVGhlIENsb3N1cmUgQ29tcGlsZXIgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkXG4gKiAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4vYmFzZTY0Jyk7XG5cbi8vIEEgc2luZ2xlIGJhc2UgNjQgZGlnaXQgY2FuIGNvbnRhaW4gNiBiaXRzIG9mIGRhdGEuIEZvciB0aGUgYmFzZSA2NCB2YXJpYWJsZVxuLy8gbGVuZ3RoIHF1YW50aXRpZXMgd2UgdXNlIGluIHRoZSBzb3VyY2UgbWFwIHNwZWMsIHRoZSBmaXJzdCBiaXQgaXMgdGhlIHNpZ24sXG4vLyB0aGUgbmV4dCBmb3VyIGJpdHMgYXJlIHRoZSBhY3R1YWwgdmFsdWUsIGFuZCB0aGUgNnRoIGJpdCBpcyB0aGVcbi8vIGNvbnRpbnVhdGlvbiBiaXQuIFRoZSBjb250aW51YXRpb24gYml0IHRlbGxzIHVzIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmVcbi8vIGRpZ2l0cyBpbiB0aGlzIHZhbHVlIGZvbGxvd2luZyB0aGlzIGRpZ2l0LlxuLy9cbi8vICAgQ29udGludWF0aW9uXG4vLyAgIHwgICAgU2lnblxuLy8gICB8ICAgIHxcbi8vICAgViAgICBWXG4vLyAgIDEwMTAxMVxuXG52YXIgVkxRX0JBU0VfU0hJRlQgPSA1O1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9CQVNFID0gMSA8PCBWTFFfQkFTRV9TSElGVDtcblxuLy8gYmluYXJ5OiAwMTExMTFcbnZhciBWTFFfQkFTRV9NQVNLID0gVkxRX0JBU0UgLSAxO1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9DT05USU5VQVRJT05fQklUID0gVkxRX0JBU0U7XG5cbi8qKlxuICogQ29udmVydHMgZnJvbSBhIHR3by1jb21wbGVtZW50IHZhbHVlIHRvIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMSBiZWNvbWVzIDIgKDEwIGJpbmFyeSksIC0xIGJlY29tZXMgMyAoMTEgYmluYXJ5KVxuICogICAyIGJlY29tZXMgNCAoMTAwIGJpbmFyeSksIC0yIGJlY29tZXMgNSAoMTAxIGJpbmFyeSlcbiAqL1xuZnVuY3Rpb24gdG9WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHJldHVybiBhVmFsdWUgPCAwXG4gICAgPyAoKC1hVmFsdWUpIDw8IDEpICsgMVxuICAgIDogKGFWYWx1ZSA8PCAxKSArIDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgdG8gYSB0d28tY29tcGxlbWVudCB2YWx1ZSBmcm9tIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMiAoMTAgYmluYXJ5KSBiZWNvbWVzIDEsIDMgKDExIGJpbmFyeSkgYmVjb21lcyAtMVxuICogICA0ICgxMDAgYmluYXJ5KSBiZWNvbWVzIDIsIDUgKDEwMSBiaW5hcnkpIGJlY29tZXMgLTJcbiAqL1xuZnVuY3Rpb24gZnJvbVZMUVNpZ25lZChhVmFsdWUpIHtcbiAgdmFyIGlzTmVnYXRpdmUgPSAoYVZhbHVlICYgMSkgPT09IDE7XG4gIHZhciBzaGlmdGVkID0gYVZhbHVlID4+IDE7XG4gIHJldHVybiBpc05lZ2F0aXZlXG4gICAgPyAtc2hpZnRlZFxuICAgIDogc2hpZnRlZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiYXNlIDY0IFZMUSBlbmNvZGVkIHZhbHVlLlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGJhc2U2NFZMUV9lbmNvZGUoYVZhbHVlKSB7XG4gIHZhciBlbmNvZGVkID0gXCJcIjtcbiAgdmFyIGRpZ2l0O1xuXG4gIHZhciB2bHEgPSB0b1ZMUVNpZ25lZChhVmFsdWUpO1xuXG4gIGRvIHtcbiAgICBkaWdpdCA9IHZscSAmIFZMUV9CQVNFX01BU0s7XG4gICAgdmxxID4+Pj0gVkxRX0JBU0VfU0hJRlQ7XG4gICAgaWYgKHZscSA+IDApIHtcbiAgICAgIC8vIFRoZXJlIGFyZSBzdGlsbCBtb3JlIGRpZ2l0cyBpbiB0aGlzIHZhbHVlLCBzbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGVcbiAgICAgIC8vIGNvbnRpbnVhdGlvbiBiaXQgaXMgbWFya2VkLlxuICAgICAgZGlnaXQgfD0gVkxRX0NPTlRJTlVBVElPTl9CSVQ7XG4gICAgfVxuICAgIGVuY29kZWQgKz0gYmFzZTY0LmVuY29kZShkaWdpdCk7XG4gIH0gd2hpbGUgKHZscSA+IDApO1xuXG4gIHJldHVybiBlbmNvZGVkO1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIHRoZSBuZXh0IGJhc2UgNjQgVkxRIHZhbHVlIGZyb20gdGhlIGdpdmVuIHN0cmluZyBhbmQgcmV0dXJucyB0aGVcbiAqIHZhbHVlIGFuZCB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIHZpYSB0aGUgb3V0IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZGVjb2RlKGFTdHIsIGFJbmRleCwgYU91dFBhcmFtKSB7XG4gIHZhciBzdHJMZW4gPSBhU3RyLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IDA7XG4gIHZhciBzaGlmdCA9IDA7XG4gIHZhciBjb250aW51YXRpb24sIGRpZ2l0O1xuXG4gIGRvIHtcbiAgICBpZiAoYUluZGV4ID49IHN0ckxlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbW9yZSBkaWdpdHMgaW4gYmFzZSA2NCBWTFEgdmFsdWUuXCIpO1xuICAgIH1cblxuICAgIGRpZ2l0ID0gYmFzZTY0LmRlY29kZShhU3RyLmNoYXJDb2RlQXQoYUluZGV4KyspKTtcbiAgICBpZiAoZGlnaXQgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJhc2U2NCBkaWdpdDogXCIgKyBhU3RyLmNoYXJBdChhSW5kZXggLSAxKSk7XG4gICAgfVxuXG4gICAgY29udGludWF0aW9uID0gISEoZGlnaXQgJiBWTFFfQ09OVElOVUFUSU9OX0JJVCk7XG4gICAgZGlnaXQgJj0gVkxRX0JBU0VfTUFTSztcbiAgICByZXN1bHQgPSByZXN1bHQgKyAoZGlnaXQgPDwgc2hpZnQpO1xuICAgIHNoaWZ0ICs9IFZMUV9CQVNFX1NISUZUO1xuICB9IHdoaWxlIChjb250aW51YXRpb24pO1xuXG4gIGFPdXRQYXJhbS52YWx1ZSA9IGZyb21WTFFTaWduZWQocmVzdWx0KTtcbiAgYU91dFBhcmFtLnJlc3QgPSBhSW5kZXg7XG59O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgaW50VG9DaGFyTWFwID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLnNwbGl0KCcnKTtcblxuLyoqXG4gKiBFbmNvZGUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2Ugb2YgMCB0byA2MyB0byBhIHNpbmdsZSBiYXNlIDY0IGRpZ2l0LlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgaWYgKDAgPD0gbnVtYmVyICYmIG51bWJlciA8IGludFRvQ2hhck1hcC5sZW5ndGgpIHtcbiAgICByZXR1cm4gaW50VG9DaGFyTWFwW251bWJlcl07XG4gIH1cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk11c3QgYmUgYmV0d2VlbiAwIGFuZCA2MzogXCIgKyBudW1iZXIpO1xufTtcblxuLyoqXG4gKiBEZWNvZGUgYSBzaW5nbGUgYmFzZSA2NCBjaGFyYWN0ZXIgY29kZSBkaWdpdCB0byBhbiBpbnRlZ2VyLiBSZXR1cm5zIC0xIG9uXG4gKiBmYWlsdXJlLlxuICovXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIChjaGFyQ29kZSkge1xuICB2YXIgYmlnQSA9IDY1OyAgICAgLy8gJ0EnXG4gIHZhciBiaWdaID0gOTA7ICAgICAvLyAnWidcblxuICB2YXIgbGl0dGxlQSA9IDk3OyAgLy8gJ2EnXG4gIHZhciBsaXR0bGVaID0gMTIyOyAvLyAneidcblxuICB2YXIgemVybyA9IDQ4OyAgICAgLy8gJzAnXG4gIHZhciBuaW5lID0gNTc7ICAgICAvLyAnOSdcblxuICB2YXIgcGx1cyA9IDQzOyAgICAgLy8gJysnXG4gIHZhciBzbGFzaCA9IDQ3OyAgICAvLyAnLydcblxuICB2YXIgbGl0dGxlT2Zmc2V0ID0gMjY7XG4gIHZhciBudW1iZXJPZmZzZXQgPSA1MjtcblxuICAvLyAwIC0gMjU6IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXG4gIGlmIChiaWdBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGJpZ1opIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gYmlnQSk7XG4gIH1cblxuICAvLyAyNiAtIDUxOiBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elxuICBpZiAobGl0dGxlQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBsaXR0bGVaKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIGxpdHRsZUEgKyBsaXR0bGVPZmZzZXQpO1xuICB9XG5cbiAgLy8gNTIgLSA2MTogMDEyMzQ1Njc4OVxuICBpZiAoemVybyA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBuaW5lKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIHplcm8gKyBudW1iZXJPZmZzZXQpO1xuICB9XG5cbiAgLy8gNjI6ICtcbiAgaWYgKGNoYXJDb2RlID09IHBsdXMpIHtcbiAgICByZXR1cm4gNjI7XG4gIH1cblxuICAvLyA2MzogL1xuICBpZiAoY2hhckNvZGUgPT0gc2xhc2gpIHtcbiAgICByZXR1cm4gNjM7XG4gIH1cblxuICAvLyBJbnZhbGlkIGJhc2U2NCBkaWdpdC5cbiAgcmV0dXJuIC0xO1xufTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxuZXhwb3J0cy5HUkVBVEVTVF9MT1dFUl9CT1VORCA9IDE7XG5leHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EID0gMjtcblxuLyoqXG4gKiBSZWN1cnNpdmUgaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaC5cbiAqXG4gKiBAcGFyYW0gYUxvdyBJbmRpY2VzIGhlcmUgYW5kIGxvd2VyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYUhpZ2ggSW5kaWNlcyBoZXJlIGFuZCBoaWdoZXIgZG8gbm90IGNvbnRhaW4gdGhlIG5lZWRsZS5cbiAqIEBwYXJhbSBhTmVlZGxlIFRoZSBlbGVtZW50IGJlaW5nIHNlYXJjaGVkIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIG5vbi1lbXB0eSBhcnJheSBiZWluZyBzZWFyY2hlZC5cbiAqIEBwYXJhbSBhQ29tcGFyZSBGdW5jdGlvbiB3aGljaCB0YWtlcyB0d28gZWxlbWVudHMgYW5kIHJldHVybnMgLTEsIDAsIG9yIDEuXG4gKiBAcGFyYW0gYUJpYXMgRWl0aGVyICdiaW5hcnlTZWFyY2guR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ2JpbmFyeVNlYXJjaC5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlXG4gKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIHJlY3Vyc2l2ZVNlYXJjaChhTG93LCBhSGlnaCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgLy8gVGhpcyBmdW5jdGlvbiB0ZXJtaW5hdGVzIHdoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZTpcbiAgLy9cbiAgLy8gICAxLiBXZSBmaW5kIHRoZSBleGFjdCBlbGVtZW50IHdlIGFyZSBsb29raW5nIGZvci5cbiAgLy9cbiAgLy8gICAyLiBXZSBkaWQgbm90IGZpbmQgdGhlIGV4YWN0IGVsZW1lbnQsIGJ1dCB3ZSBjYW4gcmV0dXJuIHRoZSBpbmRleCBvZlxuICAvLyAgICAgIHRoZSBuZXh0LWNsb3Nlc3QgZWxlbWVudC5cbiAgLy9cbiAgLy8gICAzLiBXZSBkaWQgbm90IGZpbmQgdGhlIGV4YWN0IGVsZW1lbnQsIGFuZCB0aGVyZSBpcyBubyBuZXh0LWNsb3Nlc3RcbiAgLy8gICAgICBlbGVtZW50IHRoYW4gdGhlIG9uZSB3ZSBhcmUgc2VhcmNoaW5nIGZvciwgc28gd2UgcmV0dXJuIC0xLlxuICB2YXIgbWlkID0gTWF0aC5mbG9vcigoYUhpZ2ggLSBhTG93KSAvIDIpICsgYUxvdztcbiAgdmFyIGNtcCA9IGFDb21wYXJlKGFOZWVkbGUsIGFIYXlzdGFja1ttaWRdLCB0cnVlKTtcbiAgaWYgKGNtcCA9PT0gMCkge1xuICAgIC8vIEZvdW5kIHRoZSBlbGVtZW50IHdlIGFyZSBsb29raW5nIGZvci5cbiAgICByZXR1cm4gbWlkO1xuICB9XG4gIGVsc2UgaWYgKGNtcCA+IDApIHtcbiAgICAvLyBPdXIgbmVlZGxlIGlzIGdyZWF0ZXIgdGhhbiBhSGF5c3RhY2tbbWlkXS5cbiAgICBpZiAoYUhpZ2ggLSBtaWQgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgdXBwZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2gobWlkLCBhSGlnaCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpO1xuICAgIH1cblxuICAgIC8vIFRoZSBleGFjdCBuZWVkbGUgZWxlbWVudCB3YXMgbm90IGZvdW5kIGluIHRoaXMgaGF5c3RhY2suIERldGVybWluZSBpZlxuICAgIC8vIHdlIGFyZSBpbiB0ZXJtaW5hdGlvbiBjYXNlICgzKSBvciAoMikgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdGhpbmcuXG4gICAgaWYgKGFCaWFzID09IGV4cG9ydHMuTEVBU1RfVVBQRVJfQk9VTkQpIHtcbiAgICAgIHJldHVybiBhSGlnaCA8IGFIYXlzdGFjay5sZW5ndGggPyBhSGlnaCA6IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbWlkO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICAvLyBPdXIgbmVlZGxlIGlzIGxlc3MgdGhhbiBhSGF5c3RhY2tbbWlkXS5cbiAgICBpZiAobWlkIC0gYUxvdyA+IDEpIHtcbiAgICAgIC8vIFRoZSBlbGVtZW50IGlzIGluIHRoZSBsb3dlciBoYWxmLlxuICAgICAgcmV0dXJuIHJlY3Vyc2l2ZVNlYXJjaChhTG93LCBtaWQsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gbWlkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYUxvdyA8IDAgPyAtMSA6IGFMb3c7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBiaW5hcnkgc2VhcmNoIHdoaWNoIHdpbGwgYWx3YXlzIHRyeSBhbmQgcmV0dXJuXG4gKiB0aGUgaW5kZXggb2YgdGhlIGNsb3Nlc3QgZWxlbWVudCBpZiB0aGVyZSBpcyBubyBleGFjdCBoaXQuIFRoaXMgaXMgYmVjYXVzZVxuICogbWFwcGluZ3MgYmV0d2VlbiBvcmlnaW5hbCBhbmQgZ2VuZXJhdGVkIGxpbmUvY29sIHBhaXJzIGFyZSBzaW5nbGUgcG9pbnRzLFxuICogYW5kIHRoZXJlIGlzIGFuIGltcGxpY2l0IHJlZ2lvbiBiZXR3ZWVuIGVhY2ggb2YgdGhlbSwgc28gYSBtaXNzIGp1c3QgbWVhbnNcbiAqIHRoYXQgeW91IGFyZW4ndCBvbiB0aGUgdmVyeSBzdGFydCBvZiBhIHJlZ2lvbi5cbiAqXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCB5b3UgYXJlIGxvb2tpbmcgZm9yLlxuICogQHBhcmFtIGFIYXlzdGFjayBUaGUgYXJyYXkgdGhhdCBpcyBiZWluZyBzZWFyY2hlZC5cbiAqIEBwYXJhbSBhQ29tcGFyZSBBIGZ1bmN0aW9uIHdoaWNoIHRha2VzIHRoZSBuZWVkbGUgYW5kIGFuIGVsZW1lbnQgaW4gdGhlXG4gKiAgICAgYXJyYXkgYW5kIHJldHVybnMgLTEsIDAsIG9yIDEgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5lZWRsZSBpcyBsZXNzXG4gKiAgICAgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgZWxlbWVudCwgcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICogICAgIERlZmF1bHRzIHRvICdiaW5hcnlTZWFyY2guR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICovXG5leHBvcnRzLnNlYXJjaCA9IGZ1bmN0aW9uIHNlYXJjaChhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcykge1xuICBpZiAoYUhheXN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHZhciBpbmRleCA9IHJlY3Vyc2l2ZVNlYXJjaCgtMSwgYUhheXN0YWNrLmxlbmd0aCwgYU5lZWRsZSwgYUhheXN0YWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbXBhcmUsIGFCaWFzIHx8IGV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQpO1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLy8gV2UgaGF2ZSBmb3VuZCBlaXRoZXIgdGhlIGV4YWN0IGVsZW1lbnQsIG9yIHRoZSBuZXh0LWNsb3Nlc3QgZWxlbWVudCB0aGFuXG4gIC8vIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IuIEhvd2V2ZXIsIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIHN1Y2hcbiAgLy8gZWxlbWVudC4gTWFrZSBzdXJlIHdlIGFsd2F5cyByZXR1cm4gdGhlIHNtYWxsZXN0IG9mIHRoZXNlLlxuICB3aGlsZSAoaW5kZXggLSAxID49IDApIHtcbiAgICBpZiAoYUNvbXBhcmUoYUhheXN0YWNrW2luZGV4XSwgYUhheXN0YWNrW2luZGV4IC0gMV0sIHRydWUpICE9PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLS1pbmRleDtcbiAgfVxuXG4gIHJldHVybiBpbmRleDtcbn07XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTQgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgbWFwcGluZ0IgaXMgYWZ0ZXIgbWFwcGluZ0Egd2l0aCByZXNwZWN0IHRvIGdlbmVyYXRlZFxuICogcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIC8vIE9wdGltaXplZCBmb3IgbW9zdCBjb21tb24gY2FzZVxuICB2YXIgbGluZUEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgbGluZUIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICB2YXIgY29sdW1uQSA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbjtcbiAgdmFyIGNvbHVtbkIgPSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIHJldHVybiBsaW5lQiA+IGxpbmVBIHx8IGxpbmVCID09IGxpbmVBICYmIGNvbHVtbkIgPj0gY29sdW1uQSB8fFxuICAgICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIDw9IDA7XG59XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB0byBwcm92aWRlIGEgc29ydGVkIHZpZXcgb2YgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gYVxuICogcGVyZm9ybWFuY2UgY29uc2Npb3VzIG1hbm5lci4gSXQgdHJhZGVzIGEgbmVnbGliYWJsZSBvdmVyaGVhZCBpbiBnZW5lcmFsXG4gKiBjYXNlIGZvciBhIGxhcmdlIHNwZWVkdXAgaW4gY2FzZSBvZiBtYXBwaW5ncyBiZWluZyBhZGRlZCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZ0xpc3QoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIC8vIFNlcnZlcyBhcyBpbmZpbXVtXG4gIHRoaXMuX2xhc3QgPSB7Z2VuZXJhdGVkTGluZTogLTEsIGdlbmVyYXRlZENvbHVtbjogMH07XG59XG5cbi8qKlxuICogSXRlcmF0ZSB0aHJvdWdoIGludGVybmFsIGl0ZW1zLiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc2FtZSBhcmd1bWVudHMgdGhhdFxuICogYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCB0YWtlcy5cbiAqXG4gKiBOT1RFOiBUaGUgb3JkZXIgb2YgdGhlIG1hcHBpbmdzIGlzIE5PVCBndWFyYW50ZWVkLlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudW5zb3J0ZWRGb3JFYWNoID1cbiAgZnVuY3Rpb24gTWFwcGluZ0xpc3RfZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKSB7XG4gICAgdGhpcy5fYXJyYXkuZm9yRWFjaChhQ2FsbGJhY2ssIGFUaGlzQXJnKTtcbiAgfTtcblxuLyoqXG4gKiBBZGQgdGhlIGdpdmVuIHNvdXJjZSBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSBPYmplY3QgYU1hcHBpbmdcbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2FkZChhTWFwcGluZykge1xuICBpZiAoZ2VuZXJhdGVkUG9zaXRpb25BZnRlcih0aGlzLl9sYXN0LCBhTWFwcGluZykpIHtcbiAgICB0aGlzLl9sYXN0ID0gYU1hcHBpbmc7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fc29ydGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXJyYXkucHVzaChhTWFwcGluZyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmxhdCwgc29ydGVkIGFycmF5IG9mIG1hcHBpbmdzLiBUaGUgbWFwcGluZ3MgYXJlIHNvcnRlZCBieVxuICogZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICpcbiAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIHJldHVybnMgaW50ZXJuYWwgZGF0YSB3aXRob3V0IGNvcHlpbmcsIGZvclxuICogcGVyZm9ybWFuY2UuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBOT1QgYmUgbXV0YXRlZCwgYW5kIHNob3VsZCBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbW11dGFibGUgYm9ycm93LiBJZiB5b3Ugd2FudCB0byB0YWtlIG93bmVyc2hpcCwgeW91IG11c3QgbWFrZSB5b3VyIG93blxuICogY29weS5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF90b0FycmF5KCkge1xuICBpZiAoIXRoaXMuX3NvcnRlZCkge1xuICAgIHRoaXMuX2FycmF5LnNvcnQodXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCk7XG4gICAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcy5fYXJyYXk7XG59O1xuXG5leHBvcnRzLk1hcHBpbmdMaXN0ID0gTWFwcGluZ0xpc3Q7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGJpbmFyeVNlYXJjaCA9IHJlcXVpcmUoJy4vYmluYXJ5LXNlYXJjaCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciBxdWlja1NvcnQgPSByZXF1aXJlKCcuL3F1aWNrLXNvcnQnKS5xdWlja1NvcnQ7XG5cbmZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICByZXR1cm4gc291cmNlTWFwLnNlY3Rpb25zICE9IG51bGxcbiAgICA/IG5ldyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKVxuICAgIDogbmV3IEJhc2ljU291cmNlTWFwQ29uc3VtZXIoc291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcCA9IGZ1bmN0aW9uKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgcmV0dXJuIEJhc2ljU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKTtcbn1cblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8vIGBfX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmQgYF9fb3JpZ2luYWxNYXBwaW5nc2AgYXJlIGFycmF5cyB0aGF0IGhvbGQgdGhlXG4vLyBwYXJzZWQgbWFwcGluZyBjb29yZGluYXRlcyBmcm9tIHRoZSBzb3VyY2UgbWFwJ3MgXCJtYXBwaW5nc1wiIGF0dHJpYnV0ZS4gVGhleVxuLy8gYXJlIGxhemlseSBpbnN0YW50aWF0ZWQsIGFjY2Vzc2VkIHZpYSB0aGUgYF9nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGdldHRlcnMgcmVzcGVjdGl2ZWx5LCBhbmQgd2Ugb25seSBwYXJzZSB0aGUgbWFwcGluZ3Ncbi8vIGFuZCBjcmVhdGUgdGhlc2UgYXJyYXlzIG9uY2UgcXVlcmllZCBmb3IgYSBzb3VyY2UgbG9jYXRpb24uIFdlIGp1bXAgdGhyb3VnaFxuLy8gdGhlc2UgaG9vcHMgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSB0aG91c2FuZHMgb2YgbWFwcGluZ3MsIGFuZCBwYXJzaW5nXG4vLyB0aGVtIGlzIGV4cGVuc2l2ZSwgc28gd2Ugb25seSB3YW50IHRvIGRvIGl0IGlmIHdlIG11c3QuXG4vL1xuLy8gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5cyBpcyBvZiB0aGUgZm9ybTpcbi8vXG4vLyAgICAge1xuLy8gICAgICAgZ2VuZXJhdGVkTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIGdlbmVyYXRlZENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgc291cmNlOiBUaGUgcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGUgdGhhdCBnZW5lcmF0ZWQgdGhpc1xuLy8gICAgICAgICAgICAgICBjaHVuayBvZiBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxMaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBvcmlnaW5hbENvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSB0aGF0XG4vLyAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhpcyBjaHVuayBvZiBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBzeW1ib2wgd2hpY2ggZ2VuZXJhdGVkIHRoaXMgY2h1bmsgb2Zcbi8vICAgICAgICAgICAgIGNvZGUuXG4vLyAgICAgfVxuLy9cbi8vIEFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBmb3IgYGdlbmVyYXRlZExpbmVgIGFuZCBgZ2VuZXJhdGVkQ29sdW1uYCBjYW4gYmVcbi8vIGBudWxsYC5cbi8vXG4vLyBgX2dlbmVyYXRlZE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zLlxuLy9cbi8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zLlxuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX2dlbmVyYXRlZE1hcHBpbmdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX19vcmlnaW5hbE1hcHBpbmdzID0gbnVsbDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfb3JpZ2luYWxNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19vcmlnaW5hbE1hcHBpbmdzKSB7XG4gICAgICB0aGlzLl9wYXJzZU1hcHBpbmdzKHRoaXMuX21hcHBpbmdzLCB0aGlzLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fY2hhcklzTWFwcGluZ1NlcGFyYXRvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgaW5kZXgpIHtcbiAgICB2YXIgYyA9IGFTdHIuY2hhckF0KGluZGV4KTtcbiAgICByZXR1cm4gYyA9PT0gXCI7XCIgfHwgYyA9PT0gXCIsXCI7XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBfcGFyc2VNYXBwaW5nc1wiKTtcbiAgfTtcblxuU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSID0gMjtcblxuU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBlYWNoIG1hcHBpbmcgYmV0d2VlbiBhbiBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4gYW5kIGFcbiAqIGdlbmVyYXRlZCBsaW5lL2NvbHVtbiBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKlxuICogQHBhcmFtIEZ1bmN0aW9uIGFDYWxsYmFja1xuICogICAgICAgIFRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aXRoIGVhY2ggbWFwcGluZy5cbiAqIEBwYXJhbSBPYmplY3QgYUNvbnRleHRcbiAqICAgICAgICBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIG9iamVjdCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBgdGhpc2AgZXZlcnlcbiAqICAgICAgICB0aW1lIHRoYXQgYGFDYWxsYmFja2AgaXMgY2FsbGVkLlxuICogQHBhcmFtIGFPcmRlclxuICogICAgICAgIEVpdGhlciBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYCBvclxuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUmAuIFNwZWNpZmllcyB3aGV0aGVyIHlvdSB3YW50IHRvXG4gKiAgICAgICAgaXRlcmF0ZSBvdmVyIHRoZSBtYXBwaW5ncyBzb3J0ZWQgYnkgdGhlIGdlbmVyYXRlZCBmaWxlJ3MgbGluZS9jb2x1bW5cbiAqICAgICAgICBvcmRlciBvciB0aGUgb3JpZ2luYWwncyBzb3VyY2UvbGluZS9jb2x1bW4gb3JkZXIsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG9cbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSYC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmVhY2hNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZWFjaE1hcHBpbmcoYUNhbGxiYWNrLCBhQ29udGV4dCwgYU9yZGVyKSB7XG4gICAgdmFyIGNvbnRleHQgPSBhQ29udGV4dCB8fCBudWxsO1xuICAgIHZhciBvcmRlciA9IGFPcmRlciB8fCBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI7XG5cbiAgICB2YXIgbWFwcGluZ3M7XG4gICAgc3dpdGNoIChvcmRlcikge1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBvcmRlciBvZiBpdGVyYXRpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5zb3VyY2VSb290O1xuICAgIG1hcHBpbmdzLm1hcChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZSwgdGhpcy5fc291cmNlTWFwVVJMKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4sXG4gICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICBuYW1lOiBtYXBwaW5nLm5hbWUgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbmFtZXMuYXQobWFwcGluZy5uYW1lKVxuICAgICAgfTtcbiAgICB9LCB0aGlzKS5mb3JFYWNoKGFDYWxsYmFjaywgY29udGV4dCk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcHJvdmlkZWQuIElmIG5vIGNvbHVtbiBpcyBwcm92aWRlZCwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gYSBlaXRoZXIgdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3Igb3IgdGhlIG5leHRcbiAqIGNsb3Nlc3QgbGluZSB0aGF0IGhhcyBhbnkgbWFwcGluZ3MuIE90aGVyd2lzZSwgcmV0dXJucyBhbGwgbWFwcGluZ3NcbiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgYW5kIGVpdGhlciB0aGUgY29sdW1uIHdlIGFyZSBzZWFyY2hpbmcgZm9yXG4gKiBvciB0aGUgbmV4dCBjbG9zZXN0IGNvbHVtbiB0aGF0IGhhcyBhbnkgb2Zmc2V0cy5cbiAqXG4gKiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IE9wdGlvbmFsLiB0aGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpcyByZXR1cm5lZCwgZWFjaCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfYWxsR2VuZXJhdGVkUG9zaXRpb25zRm9yKGFBcmdzKSB7XG4gICAgdmFyIGxpbmUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKTtcblxuICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gZXhhY3QgbWF0Y2gsIEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kTWFwcGluZ1xuICAgIC8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IG1hcHBpbmcgbGVzcyB0aGFuIHRoZSBuZWVkbGUuIEJ5XG4gICAgLy8gc2V0dGluZyBuZWVkbGUub3JpZ2luYWxDb2x1bW4gdG8gMCwgd2UgdGh1cyBmaW5kIHRoZSBsYXN0IG1hcHBpbmcgZm9yXG4gICAgLy8gdGhlIGdpdmVuIGxpbmUsIHByb3ZpZGVkIHN1Y2ggYSBtYXBwaW5nIGV4aXN0cy5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpLFxuICAgICAgb3JpZ2luYWxMaW5lOiBsaW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJywgMClcbiAgICB9O1xuXG4gICAgbmVlZGxlLnNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChuZWVkbGUuc291cmNlKTtcbiAgICBpZiAobmVlZGxlLnNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgbWFwcGluZ3MgPSBbXTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKG5lZWRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKGFBcmdzLmNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBvcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZTtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIGZvdW5kLiBTaW5jZVxuICAgICAgICAvLyBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGZvdW5kLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gb3JpZ2luYWxMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAvLyBJdGVyYXRlIHVudGlsIGVpdGhlciB3ZSBydW4gb3V0IG9mIG1hcHBpbmdzLCBvciB3ZSBydW4gaW50b1xuICAgICAgICAvLyBhIG1hcHBpbmcgZm9yIGEgZGlmZmVyZW50IGxpbmUgdGhhbiB0aGUgb25lIHdlIHdlcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgLy8gU2luY2UgbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBsaW5lICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID09IG9yaWdpbmFsQ29sdW1uKSB7XG4gICAgICAgICAgbWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1srK2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXBwaW5ncztcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2ggd2UgY2FuXG4gKiBxdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGZpbGUgcG9zaXRpb25zIGJ5IGdpdmluZyBpdCBhIGZpbGVcbiAqIHBvc2l0aW9uIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3JcbiAqIGFscmVhZHkgcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYywgc291cmNlIG1hcHMgaGF2ZSB0aGVcbiAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIHNvdXJjZXM6IEFuIGFycmF5IG9mIFVSTHMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAqICAgLSBuYW1lczogQW4gYXJyYXkgb2YgaWRlbnRpZmllcnMgd2hpY2ggY2FuIGJlIHJlZmVycmVuY2VkIGJ5IGluZGl2aWR1YWwgbWFwcGluZ3MuXG4gKiAgIC0gc291cmNlUm9vdDogT3B0aW9uYWwuIFRoZSBVUkwgcm9vdCBmcm9tIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSByZWxhdGl2ZS5cbiAqICAgLSBzb3VyY2VzQ29udGVudDogT3B0aW9uYWwuIEFuIGFycmF5IG9mIGNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbWFwcGluZ3M6IEEgc3RyaW5nIG9mIGJhc2U2NCBWTFFzIHdoaWNoIGNvbnRhaW4gdGhlIGFjdHVhbCBtYXBwaW5ncy5cbiAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKlxuICogSGVyZSBpcyBhbiBleGFtcGxlIHNvdXJjZSBtYXAsIHRha2VuIGZyb20gdGhlIHNvdXJjZSBtYXAgc3BlY1swXTpcbiAqXG4gKiAgICAge1xuICogICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICBmaWxlOiBcIm91dC5qc1wiLFxuICogICAgICAgc291cmNlUm9vdCA6IFwiXCIsXG4gKiAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAqICAgICAgIG1hcHBpbmdzOiBcIkFBLEFCOztBQkNERTtcIlxuICogICAgIH1cbiAqXG4gKiBUaGUgc2Vjb25kIHBhcmFtZXRlciwgaWYgZ2l2ZW4sIGlzIGEgc3RyaW5nIHdob3NlIHZhbHVlIGlzIHRoZSBVUkxcbiAqIGF0IHdoaWNoIHRoZSBzb3VyY2UgbWFwIHdhcyBmb3VuZC4gIFRoaXMgVVJMIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGVcbiAqIHNvdXJjZXMgYXJyYXkuXG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQ/cGxpPTEjXG4gKi9cbmZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IHV0aWwucGFyc2VTb3VyY2VNYXBJbnB1dChhU291cmNlTWFwKTtcbiAgfVxuXG4gIHZhciB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAndmVyc2lvbicpO1xuICB2YXIgc291cmNlcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXMnKTtcbiAgLy8gU2FzcyAzLjMgbGVhdmVzIG91dCB0aGUgJ25hbWVzJyBhcnJheSwgc28gd2UgZGV2aWF0ZSBmcm9tIHRoZSBzcGVjICh3aGljaFxuICAvLyByZXF1aXJlcyB0aGUgYXJyYXkpIHRvIHBsYXkgbmljZSBoZXJlLlxuICB2YXIgbmFtZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICduYW1lcycsIFtdKTtcbiAgdmFyIHNvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VSb290JywgbnVsbCk7XG4gIHZhciBzb3VyY2VzQ29udGVudCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZXNDb250ZW50JywgbnVsbCk7XG4gIHZhciBtYXBwaW5ncyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ21hcHBpbmdzJyk7XG4gIHZhciBmaWxlID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnZmlsZScsIG51bGwpO1xuXG4gIC8vIE9uY2UgYWdhaW4sIFNhc3MgZGV2aWF0ZXMgZnJvbSB0aGUgc3BlYyBhbmQgc3VwcGxpZXMgdGhlIHZlcnNpb24gYXMgYVxuICAvLyBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIsIHNvIHdlIHVzZSBsb29zZSBlcXVhbGl0eSBjaGVja2luZyBoZXJlLlxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIHNvdXJjZVJvb3QgPSB1dGlsLm5vcm1hbGl6ZShzb3VyY2VSb290KTtcbiAgfVxuXG4gIHNvdXJjZXMgPSBzb3VyY2VzXG4gICAgLm1hcChTdHJpbmcpXG4gICAgLy8gU29tZSBzb3VyY2UgbWFwcyBwcm9kdWNlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBsaWtlIFwiLi9mb28uanNcIiBpbnN0ZWFkIG9mXG4gICAgLy8gXCJmb28uanNcIi4gIE5vcm1hbGl6ZSB0aGVzZSBmaXJzdCBzbyB0aGF0IGZ1dHVyZSBjb21wYXJpc29ucyB3aWxsIHN1Y2NlZWQuXG4gICAgLy8gU2VlIGJ1Z3ppbC5sYS8xMDkwNzY4LlxuICAgIC5tYXAodXRpbC5ub3JtYWxpemUpXG4gICAgLy8gQWx3YXlzIGVuc3VyZSB0aGF0IGFic29sdXRlIHNvdXJjZXMgYXJlIGludGVybmFsbHkgc3RvcmVkIHJlbGF0aXZlIHRvXG4gICAgLy8gdGhlIHNvdXJjZSByb290LCBpZiB0aGUgc291cmNlIHJvb3QgaXMgYWJzb2x1dGUuIE5vdCBkb2luZyB0aGlzIHdvdWxkXG4gICAgLy8gYmUgcGFydGljdWxhcmx5IHByb2JsZW1hdGljIHdoZW4gdGhlIHNvdXJjZSByb290IGlzIGEgcHJlZml4IG9mIHRoZVxuICAgIC8vIHNvdXJjZSAodmFsaWQsIGJ1dCB3aHk/PykuIFNlZSBnaXRodWIgaXNzdWUgIzE5OSBhbmQgYnVnemlsLmxhLzExODg5ODIuXG4gICAgLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gc291cmNlUm9vdCAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlUm9vdCkgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZSlcbiAgICAgICAgPyB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZSlcbiAgICAgICAgOiBzb3VyY2U7XG4gICAgfSk7XG5cbiAgLy8gUGFzcyBgdHJ1ZWAgYmVsb3cgdG8gYWxsb3cgZHVwbGljYXRlIG5hbWVzIGFuZCBzb3VyY2VzLiBXaGlsZSBzb3VyY2UgbWFwc1xuICAvLyBhcmUgaW50ZW5kZWQgdG8gYmUgY29tcHJlc3NlZCBhbmQgZGVkdXBsaWNhdGVkLCB0aGUgVHlwZVNjcmlwdCBjb21waWxlclxuICAvLyBzb21ldGltZXMgZ2VuZXJhdGVzIHNvdXJjZSBtYXBzIHdpdGggZHVwbGljYXRlcyBpbiB0aGVtLiBTZWUgR2l0aHViIGlzc3VlXG4gIC8vICM3MiBhbmQgYnVnemlsLmxhLzg4OTQ5Mi5cbiAgdGhpcy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkobmFtZXMubWFwKFN0cmluZyksIHRydWUpO1xuICB0aGlzLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KHNvdXJjZXMsIHRydWUpO1xuXG4gIHRoaXMuX2Fic29sdXRlU291cmNlcyA9IHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgIHJldHVybiB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gIH0pO1xuXG4gIHRoaXMuc291cmNlUm9vdCA9IHNvdXJjZVJvb3Q7XG4gIHRoaXMuc291cmNlc0NvbnRlbnQgPSBzb3VyY2VzQ29udGVudDtcbiAgdGhpcy5fbWFwcGluZ3MgPSBtYXBwaW5ncztcbiAgdGhpcy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgdGhpcy5maWxlID0gZmlsZTtcbn1cblxuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdW1lciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCB0aGUgaW5kZXggb2YgYSBzb3VyY2UuICBSZXR1cm5zIC0xIGlmIG5vdFxuICogZm91bmQuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kU291cmNlSW5kZXggPSBmdW5jdGlvbihhU291cmNlKSB7XG4gIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgIHJlbGF0aXZlU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIGlmICh0aGlzLl9zb3VyY2VzLmhhcyhyZWxhdGl2ZVNvdXJjZSkpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlcy5pbmRleE9mKHJlbGF0aXZlU291cmNlKTtcbiAgfVxuXG4gIC8vIE1heWJlIGFTb3VyY2UgaXMgYW4gYWJzb2x1dGUgVVJMIGFzIHJldHVybmVkIGJ5IHxzb3VyY2VzfC4gIEluXG4gIC8vIHRoaXMgY2FzZSB3ZSBjYW4ndCBzaW1wbHkgdW5kbyB0aGUgdHJhbnNmb3JtLlxuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2Fic29sdXRlU291cmNlcy5sZW5ndGg7ICsraSkge1xuICAgIGlmICh0aGlzLl9hYnNvbHV0ZVNvdXJjZXNbaV0gPT0gYVNvdXJjZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGZyb20gYSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKlxuICogQHBhcmFtIFNvdXJjZU1hcEdlbmVyYXRvciBhU291cmNlTWFwXG4gKiAgICAgICAgVGhlIHNvdXJjZSBtYXAgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLlxuICogQHBhcmFtIFN0cmluZyBhU291cmNlTWFwVVJMXG4gKiAgICAgICAgVGhlIFVSTCBhdCB3aGljaCB0aGUgc291cmNlIG1hcCBjYW4gYmUgZm91bmQgKG9wdGlvbmFsKVxuICogQHJldHVybnMgQmFzaWNTb3VyY2VNYXBDb25zdW1lclxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgICB2YXIgc21jID0gT2JqZWN0LmNyZWF0ZShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5cbiAgICB2YXIgbmFtZXMgPSBzbWMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX25hbWVzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgdmFyIHNvdXJjZXMgPSBzbWMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fc291cmNlcy50b0FycmF5KCksIHRydWUpO1xuICAgIHNtYy5zb3VyY2VSb290ID0gYVNvdXJjZU1hcC5fc291cmNlUm9vdDtcbiAgICBzbWMuc291cmNlc0NvbnRlbnQgPSBhU291cmNlTWFwLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KHNtYy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWMuc291cmNlUm9vdCk7XG4gICAgc21jLmZpbGUgPSBhU291cmNlTWFwLl9maWxlO1xuICAgIHNtYy5fc291cmNlTWFwVVJMID0gYVNvdXJjZU1hcFVSTDtcbiAgICBzbWMuX2Fic29sdXRlU291cmNlcyA9IHNtYy5fc291cmNlcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNtYy5zb3VyY2VSb290LCBzLCBhU291cmNlTWFwVVJMKTtcbiAgICB9KTtcblxuICAgIC8vIEJlY2F1c2Ugd2UgYXJlIG1vZGlmeWluZyB0aGUgZW50cmllcyAoYnkgY29udmVydGluZyBzdHJpbmcgc291cmNlcyBhbmRcbiAgICAvLyBuYW1lcyB0byBpbmRpY2VzIGludG8gdGhlIHNvdXJjZXMgYW5kIG5hbWVzIEFycmF5U2V0cyksIHdlIGhhdmUgdG8gbWFrZVxuICAgIC8vIGEgY29weSBvZiB0aGUgZW50cnkgb3IgZWxzZSBiYWQgdGhpbmdzIGhhcHBlbi4gU2hhcmVkIG11dGFibGUgc3RhdGVcbiAgICAvLyBzdHJpa2VzIGFnYWluISBTZWUgZ2l0aHViIGlzc3VlICMxOTEuXG5cbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBhU291cmNlTWFwLl9tYXBwaW5ncy50b0FycmF5KCkuc2xpY2UoKTtcbiAgICB2YXIgZGVzdEdlbmVyYXRlZE1hcHBpbmdzID0gc21jLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZGVzdE9yaWdpbmFsTWFwcGluZ3MgPSBzbWMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcmNNYXBwaW5nID0gZ2VuZXJhdGVkTWFwcGluZ3NbaV07XG4gICAgICB2YXIgZGVzdE1hcHBpbmcgPSBuZXcgTWFwcGluZztcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBzcmNNYXBwaW5nLmdlbmVyYXRlZExpbmU7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBzcmNNYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKHNyY01hcHBpbmcuc291cmNlKSB7XG4gICAgICAgIGRlc3RNYXBwaW5nLnNvdXJjZSA9IHNvdXJjZXMuaW5kZXhPZihzcmNNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsTGluZSA9IHNyY01hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHNyY01hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKHNyY01hcHBpbmcubmFtZSkge1xuICAgICAgICAgIGRlc3RNYXBwaW5nLm5hbWUgPSBuYW1lcy5pbmRleE9mKHNyY01hcHBpbmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZXN0T3JpZ2luYWxNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICAgIH1cblxuICAgICAgZGVzdEdlbmVyYXRlZE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgIH1cblxuICAgIHF1aWNrU29ydChzbWMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcblxuICAgIHJldHVybiBzbWM7XG4gIH07XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fic29sdXRlU291cmNlcy5zbGljZSgpO1xuICB9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlIHRoZSBKSVQgd2l0aCBhIG5pY2Ugc2hhcGUgLyBoaWRkZW4gY2xhc3MuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmcoKSB7XG4gIHRoaXMuZ2VuZXJhdGVkTGluZSA9IDA7XG4gIHRoaXMuZ2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgdGhpcy5zb3VyY2UgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB0aGlzLm5hbWUgPSBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdmFyIGdlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYVN0ci5sZW5ndGg7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgY2FjaGVkU2VnbWVudHMgPSB7fTtcbiAgICB2YXIgdGVtcCA9IHt9O1xuICAgIHZhciBvcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIG1hcHBpbmcsIHN0ciwgc2VnbWVudCwgZW5kLCB2YWx1ZTtcblxuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJzsnKSB7XG4gICAgICAgIGdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnLCcpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtYXBwaW5nID0gbmV3IE1hcHBpbmcoKTtcbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gZ2VuZXJhdGVkTGluZTtcblxuICAgICAgICAvLyBCZWNhdXNlIGVhY2ggb2Zmc2V0IGlzIGVuY29kZWQgcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIG9uZSxcbiAgICAgICAgLy8gbWFueSBzZWdtZW50cyBvZnRlbiBoYXZlIHRoZSBzYW1lIGVuY29kaW5nLiBXZSBjYW4gZXhwbG9pdCB0aGlzXG4gICAgICAgIC8vIGZhY3QgYnkgY2FjaGluZyB0aGUgcGFyc2VkIHZhcmlhYmxlIGxlbmd0aCBmaWVsZHMgb2YgZWFjaCBzZWdtZW50LFxuICAgICAgICAvLyBhbGxvd2luZyB1cyB0byBhdm9pZCBhIHNlY29uZCBwYXJzZSBpZiB3ZSBlbmNvdW50ZXIgdGhlIHNhbWVcbiAgICAgICAgLy8gc2VnbWVudCBhZ2Fpbi5cbiAgICAgICAgZm9yIChlbmQgPSBpbmRleDsgZW5kIDwgbGVuZ3RoOyBlbmQrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGVuZCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdHIgPSBhU3RyLnNsaWNlKGluZGV4LCBlbmQpO1xuXG4gICAgICAgIHNlZ21lbnQgPSBjYWNoZWRTZWdtZW50c1tzdHJdO1xuICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgIGluZGV4ICs9IHN0ci5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VnbWVudCA9IFtdO1xuICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkge1xuICAgICAgICAgICAgYmFzZTY0VkxRLmRlY29kZShhU3RyLCBpbmRleCwgdGVtcCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHRlbXAudmFsdWU7XG4gICAgICAgICAgICBpbmRleCA9IHRlbXAucmVzdDtcbiAgICAgICAgICAgIHNlZ21lbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlLCBidXQgbm8gbGluZSBhbmQgY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIGEgc291cmNlIGFuZCBsaW5lLCBidXQgbm8gY29sdW1uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FjaGVkU2VnbWVudHNbc3RyXSA9IHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW5lcmF0ZWQgY29sdW1uLlxuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uICsgc2VnbWVudFswXTtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gT3JpZ2luYWwgc291cmNlLlxuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gcHJldmlvdXNTb3VyY2UgKyBzZWdtZW50WzFdO1xuICAgICAgICAgIHByZXZpb3VzU291cmNlICs9IHNlZ21lbnRbMV07XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBsaW5lLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gcHJldmlvdXNPcmlnaW5hbExpbmUgKyBzZWdtZW50WzJdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgICAgLy8gTGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgKz0gMTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGNvbHVtbi5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gcHJldmlvdXNPcmlnaW5hbENvbHVtbiArIHNlZ21lbnRbM107XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICAvLyBPcmlnaW5hbCBuYW1lLlxuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gcHJldmlvdXNOYW1lICsgc2VnbWVudFs0XTtcbiAgICAgICAgICAgIHByZXZpb3VzTmFtZSArPSBzZWdtZW50WzRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGdlbmVyYXRlZE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgb3JpZ2luYWxNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KGdlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBnZW5lcmF0ZWRNYXBwaW5ncztcblxuICAgIHF1aWNrU29ydChvcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG9yaWdpbmFsTWFwcGluZ3M7XG4gIH07XG5cbi8qKlxuICogRmluZCB0aGUgbWFwcGluZyB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgaHlwb3RoZXRpY2FsIFwibmVlZGxlXCIgbWFwcGluZyB0aGF0XG4gKiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBpbiB0aGUgZ2l2ZW4gXCJoYXlzdGFja1wiIG9mIG1hcHBpbmdzLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9maW5kTWFwcGluZyhhTmVlZGxlLCBhTWFwcGluZ3MsIGFMaW5lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUsIGFDb21wYXJhdG9yLCBhQmlhcykge1xuICAgIC8vIFRvIHJldHVybiB0aGUgcG9zaXRpb24gd2UgYXJlIHNlYXJjaGluZyBmb3IsIHdlIG11c3QgZmlyc3QgZmluZCB0aGVcbiAgICAvLyBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gcG9zaXRpb24gYW5kIHRoZW4gcmV0dXJuIHRoZSBvcHBvc2l0ZSBwb3NpdGlvbiBpdFxuICAgIC8vIHBvaW50cyB0by4gQmVjYXVzZSB0aGUgbWFwcGluZ3MgYXJlIHNvcnRlZCwgd2UgY2FuIHVzZSBiaW5hcnkgc2VhcmNoIHRvXG4gICAgLy8gZmluZCB0aGUgYmVzdCBtYXBwaW5nLlxuXG4gICAgaWYgKGFOZWVkbGVbYUxpbmVOYW1lXSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthTGluZU5hbWVdKTtcbiAgICB9XG4gICAgaWYgKGFOZWVkbGVbYUNvbHVtbk5hbWVdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ29sdW1uIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAsIGdvdCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICsgYU5lZWRsZVthQ29sdW1uTmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBiaW5hcnlTZWFyY2guc2VhcmNoKGFOZWVkbGUsIGFNYXBwaW5ncywgYUNvbXBhcmF0b3IsIGFCaWFzKTtcbiAgfTtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBsYXN0IGNvbHVtbiBmb3IgZWFjaCBnZW5lcmF0ZWQgbWFwcGluZy4gVGhlIGxhc3QgY29sdW1uIGlzXG4gKiBpbmNsdXNpdmUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbXB1dGVDb2x1bW5TcGFucyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2NvbXB1dGVDb2x1bW5TcGFucygpIHtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgLy8gTWFwcGluZ3MgZG8gbm90IGNvbnRhaW4gYSBmaWVsZCBmb3IgdGhlIGxhc3QgZ2VuZXJhdGVkIGNvbHVtbnQuIFdlXG4gICAgICAvLyBjYW4gY29tZSB1cCB3aXRoIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUsIGhvd2V2ZXIsIGJ5IGFzc3VtaW5nIHRoYXRcbiAgICAgIC8vIG1hcHBpbmdzIGFyZSBjb250aWd1b3VzIChpLmUuIGdpdmVuIHR3byBjb25zZWN1dGl2ZSBtYXBwaW5ncywgdGhlXG4gICAgICAvLyBmaXJzdCBtYXBwaW5nIGVuZHMgd2hlcmUgdGhlIHNlY29uZCBvbmUgc3RhcnRzKS5cbiAgICAgIGlmIChpbmRleCArIDEgPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIG5leHRNYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgbGFzdCBtYXBwaW5nIGZvciBlYWNoIGxpbmUgc3BhbnMgdGhlIGVudGlyZSBsaW5lLlxuICAgICAgbWFwcGluZy5sYXN0R2VuZXJhdGVkQ29sdW1uID0gSW5maW5pdHk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyXG4gKiAgICAgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9vcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIGdlbmVyYXRlZExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgZ2VuZXJhdGVkQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MsXG4gICAgICBcImdlbmVyYXRlZExpbmVcIixcbiAgICAgIFwiZ2VuZXJhdGVkQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdzb3VyY2UnLCBudWxsKTtcbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuYXQoc291cmNlKTtcbiAgICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwodGhpcy5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbmFtZScsIG51bGwpO1xuICAgICAgICBpZiAobmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5hdChuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbExpbmUnLCBudWxsKSxcbiAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdvcmlnaW5hbENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIG5hbWU6IG5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc291cmNlOiBudWxsLFxuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIG5hbWU6IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgdGhlIHNvdXJjZSBjb250ZW50IGZvciBldmVyeSBzb3VyY2UgaW4gdGhlIHNvdXJjZVxuICogbWFwLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnQubGVuZ3RoID49IHRoaXMuX3NvdXJjZXMuc2l6ZSgpICYmXG4gICAgICAhdGhpcy5zb3VyY2VzQ29udGVudC5zb21lKGZ1bmN0aW9uIChzYykgeyByZXR1cm4gc2MgPT0gbnVsbDsgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBpZiAoIXRoaXMuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChhU291cmNlKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbaW5kZXhdO1xuICAgIH1cblxuICAgIHZhciByZWxhdGl2ZVNvdXJjZSA9IGFTb3VyY2U7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIHVybDtcbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGxcbiAgICAgICAgJiYgKHVybCA9IHV0aWwudXJsUGFyc2UodGhpcy5zb3VyY2VSb290KSkpIHtcbiAgICAgIC8vIFhYWDogZmlsZTovLyBVUklzIGFuZCBhYnNvbHV0ZSBwYXRocyBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IgZm9yXG4gICAgICAvLyBtYW55IHVzZXJzLiBXZSBjYW4gaGVscCB0aGVtIG91dCB3aGVuIHRoZXkgZXhwZWN0IGZpbGU6Ly8gVVJJcyB0b1xuICAgICAgLy8gYmVoYXZlIGxpa2UgaXQgd291bGQgaWYgdGhleSB3ZXJlIHJ1bm5pbmcgYSBsb2NhbCBIVFRQIHNlcnZlci4gU2VlXG4gICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODU1OTcuXG4gICAgICB2YXIgZmlsZVVyaUFic1BhdGggPSByZWxhdGl2ZVNvdXJjZS5yZXBsYWNlKC9eZmlsZTpcXC9cXC8vLCBcIlwiKTtcbiAgICAgIGlmICh1cmwuc2NoZW1lID09IFwiZmlsZVwiXG4gICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoZmlsZVVyaUFic1BhdGgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihmaWxlVXJpQWJzUGF0aCldXG4gICAgICB9XG5cbiAgICAgIGlmICgoIXVybC5wYXRoIHx8IHVybC5wYXRoID09IFwiL1wiKVxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKFwiL1wiICsgcmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W3RoaXMuX3NvdXJjZXMuaW5kZXhPZihcIi9cIiArIHJlbGF0aXZlU291cmNlKV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHJlY3Vyc2l2ZWx5IGZyb21cbiAgICAvLyBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IuIEluIHRoYXQgY2FzZSwgd2VcbiAgICAvLyBkb24ndCB3YW50IHRvIHRocm93IGlmIHdlIGNhbid0IGZpbmQgdGhlIHNvdXJjZSAtIHdlIGp1c3Qgd2FudCB0b1xuICAgIC8vIHJldHVybiBudWxsLCBzbyB3ZSBwcm92aWRlIGEgZmxhZyB0byBleGl0IGdyYWNlZnVsbHkuXG4gICAgaWYgKG51bGxPbk1pc3NpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgcmVsYXRpdmVTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIGJpYXM6IEVpdGhlciAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ1NvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQnLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyk7XG4gICAgc291cmNlID0gdGhpcy5fZmluZFNvdXJjZUluZGV4KHNvdXJjZSk7XG4gICAgaWYgKHNvdXJjZSA8IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBvcmlnaW5hbExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoXG4gICAgICBuZWVkbGUsXG4gICAgICB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzLFxuICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMsXG4gICAgICB1dGlsLmdldEFyZyhhQXJncywgJ2JpYXMnLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORClcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gbmVlZGxlLnNvdXJjZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbGFzdENvbHVtbjogbnVsbFxuICAgIH07XG4gIH07XG5cbmV4cG9ydHMuQmFzaWNTb3VyY2VNYXBDb25zdW1lciA9IEJhc2ljU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQW4gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaFxuICogd2UgY2FuIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbi4gSXQgZGlmZmVycyBmcm9tIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5cbiAqIHRoYXQgaXQgdGFrZXMgXCJpbmRleGVkXCIgc291cmNlIG1hcHMgKGkuZS4gb25lcyB3aXRoIGEgXCJzZWN0aW9uc1wiIGZpZWxkKSBhc1xuICogaW5wdXQuXG4gKlxuICogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJhdyBzb3VyY2UgbWFwIChlaXRoZXIgYXMgYSBKU09OIHN0cmluZywgb3IgYWxyZWFkeVxuICogcGFyc2VkIHRvIGFuIG9iamVjdCkuIEFjY29yZGluZyB0byB0aGUgc3BlYyBmb3IgaW5kZXhlZCBzb3VyY2UgbWFwcywgdGhleVxuICogaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogICAtIHNlY3Rpb25zOiBBIGxpc3Qgb2Ygc2VjdGlvbiBkZWZpbml0aW9ucy5cbiAqXG4gKiBFYWNoIHZhbHVlIHVuZGVyIHRoZSBcInNlY3Rpb25zXCIgZmllbGQgaGFzIHR3byBmaWVsZHM6XG4gKiAgIC0gb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBhdCB3aGljaCB0aGlzIHNlY3Rpb25cbiAqICAgICAgIGJlZ2lucyB0byBhcHBseSwgZGVmaW5lZCBhcyBhbiBvYmplY3Qgd2l0aCBhIFwibGluZVwiIGFuZCBcImNvbHVtblwiXG4gKiAgICAgICBmaWVsZC5cbiAqICAgLSBtYXA6IEEgc291cmNlIG1hcCBkZWZpbml0aW9uLiBUaGlzIHNvdXJjZSBtYXAgY291bGQgYWxzbyBiZSBpbmRleGVkLFxuICogICAgICAgYnV0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbiAqXG4gKiBJbnN0ZWFkIG9mIHRoZSBcIm1hcFwiIGZpZWxkLCBpdCdzIGFsc28gcG9zc2libGUgdG8gaGF2ZSBhIFwidXJsXCIgZmllbGRcbiAqIHNwZWNpZnlpbmcgYSBVUkwgdG8gcmV0cmlldmUgYSBzb3VyY2UgbWFwIGZyb20sIGJ1dCB0aGF0J3MgY3VycmVudGx5XG4gKiB1bnN1cHBvcnRlZC5cbiAqXG4gKiBIZXJlJ3MgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF0sIGJ1dFxuICogbW9kaWZpZWQgdG8gb21pdCBhIHNlY3Rpb24gd2hpY2ggdXNlcyB0aGUgXCJ1cmxcIiBmaWVsZC5cbiAqXG4gKiAge1xuICogICAgdmVyc2lvbiA6IDMsXG4gKiAgICBmaWxlOiBcImFwcC5qc1wiLFxuICogICAgc2VjdGlvbnM6IFt7XG4gKiAgICAgIG9mZnNldDoge2xpbmU6MTAwLCBjb2x1bW46MTB9LFxuICogICAgICBtYXA6IHtcbiAqICAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgICBmaWxlOiBcInNlY3Rpb24uanNcIixcbiAqICAgICAgICBzb3VyY2VzOiBbXCJmb28uanNcIiwgXCJiYXIuanNcIl0sXG4gKiAgICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICAgbWFwcGluZ3M6IFwiQUFBQSxFOztBQkNERTtcIlxuICogICAgICB9XG4gKiAgICB9XSxcbiAqICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0I2hlYWRpbmc9aC41MzVlczN4ZXByZ3RcbiAqL1xuZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNlY3Rpb25zID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc2VjdGlvbnMnKTtcblxuICBpZiAodmVyc2lvbiAhPSB0aGlzLl92ZXJzaW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgdmFyIGxhc3RPZmZzZXQgPSB7XG4gICAgbGluZTogLTEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHRoaXMuX3NlY3Rpb25zID0gc2VjdGlvbnMubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMudXJsKSB7XG4gICAgICAvLyBUaGUgdXJsIGZpZWxkIHdpbGwgcmVxdWlyZSBzdXBwb3J0IGZvciBhc3luY2hyb25pY2l0eS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8xNlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdXBwb3J0IGZvciB1cmwgZmllbGQgaW4gc2VjdGlvbnMgbm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbiAgICB2YXIgb2Zmc2V0ID0gdXRpbC5nZXRBcmcocywgJ29mZnNldCcpO1xuICAgIHZhciBvZmZzZXRMaW5lID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnbGluZScpO1xuICAgIHZhciBvZmZzZXRDb2x1bW4gPSB1dGlsLmdldEFyZyhvZmZzZXQsICdjb2x1bW4nKTtcblxuICAgIGlmIChvZmZzZXRMaW5lIDwgbGFzdE9mZnNldC5saW5lIHx8XG4gICAgICAgIChvZmZzZXRMaW5lID09PSBsYXN0T2Zmc2V0LmxpbmUgJiYgb2Zmc2V0Q29sdW1uIDwgbGFzdE9mZnNldC5jb2x1bW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY3Rpb24gb2Zmc2V0cyBtdXN0IGJlIG9yZGVyZWQgYW5kIG5vbi1vdmVybGFwcGluZy4nKTtcbiAgICB9XG4gICAgbGFzdE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB7XG4gICAgICBnZW5lcmF0ZWRPZmZzZXQ6IHtcbiAgICAgICAgLy8gVGhlIG9mZnNldCBmaWVsZHMgYXJlIDAtYmFzZWQsIGJ1dCB3ZSB1c2UgMS1iYXNlZCBpbmRpY2VzIHdoZW5cbiAgICAgICAgLy8gZW5jb2RpbmcvZGVjb2RpbmcgZnJvbSBWTFEuXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG9mZnNldExpbmUgKyAxLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG9mZnNldENvbHVtbiArIDFcbiAgICAgIH0sXG4gICAgICBjb25zdW1lcjogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHV0aWwuZ2V0QXJnKHMsICdtYXAnKSwgYVNvdXJjZU1hcFVSTClcbiAgICB9XG4gIH0pO1xufVxuXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2Ygb3JpZ2luYWwgc291cmNlcy5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc291cmNlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICBzb3VyY2VzLnB1c2godGhpcy5fc2VjdGlvbnNbaV0uY29uc3VtZXIuc291cmNlc1tqXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9XG59KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLm9yaWdpbmFsUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICAvLyBGaW5kIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbiB3ZSdyZSB0cnlpbmcgdG8gbWFwXG4gICAgLy8gdG8gYW4gb3JpZ2luYWwgcG9zaXRpb24uXG4gICAgdmFyIHNlY3Rpb25JbmRleCA9IGJpbmFyeVNlYXJjaC5zZWFyY2gobmVlZGxlLCB0aGlzLl9zZWN0aW9ucyxcbiAgICAgIGZ1bmN0aW9uKG5lZWRsZSwgc2VjdGlvbikge1xuICAgICAgICB2YXIgY21wID0gbmVlZGxlLmdlbmVyYXRlZExpbmUgLSBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lO1xuICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgcmV0dXJuIGNtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAobmVlZGxlLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgIH0pO1xuICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbc2VjdGlvbkluZGV4XTtcblxuICAgIGlmICghc2VjdGlvbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIG5hbWU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlY3Rpb24uY29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICBsaW5lOiBuZWVkbGUuZ2VuZXJhdGVkTGluZSAtXG4gICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICBjb2x1bW46IG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbmVlZGxlLmdlbmVyYXRlZExpbmVcbiAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgOiAwKSxcbiAgICAgIGJpYXM6IGFBcmdzLmJpYXNcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWN0aW9ucy5ldmVyeShmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHMuY29uc3VtZXIuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKTtcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIHZhciBjb250ZW50ID0gc2VjdGlvbi5jb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIHRydWUpO1xuICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFTb3VyY2UgKyAnXCIgaXMgbm90IGluIHRoZSBTb3VyY2VNYXAuJyk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuIFxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5nZW5lcmF0ZWRQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG5cbiAgICAgIC8vIE9ubHkgY29uc2lkZXIgdGhpcyBzZWN0aW9uIGlmIHRoZSByZXF1ZXN0ZWQgc291cmNlIGlzIGluIHRoZSBsaXN0IG9mXG4gICAgICAvLyBzb3VyY2VzIG9mIHRoZSBjb25zdW1lci5cbiAgICAgIGlmIChzZWN0aW9uLmNvbnN1bWVyLl9maW5kU291cmNlSW5kZXgodXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSkgPT09IC0xKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIGdlbmVyYXRlZFBvc2l0aW9uID0gc2VjdGlvbi5jb25zdW1lci5nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncyk7XG4gICAgICBpZiAoZ2VuZXJhdGVkUG9zaXRpb24pIHtcbiAgICAgICAgdmFyIHJldCA9IHtcbiAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWRQb3NpdGlvbi5jb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IGdlbmVyYXRlZFBvc2l0aW9uLmxpbmVcbiAgICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgICA6IDApXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fcGFyc2VNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9wYXJzZU1hcHBpbmdzKGFTdHIsIGFTb3VyY2VSb290KSB7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuICAgICAgdmFyIHNlY3Rpb25NYXBwaW5ncyA9IHNlY3Rpb24uY29uc3VtZXIuX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWN0aW9uTWFwcGluZ3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIG1hcHBpbmcgPSBzZWN0aW9uTWFwcGluZ3Nbal07XG5cbiAgICAgICAgdmFyIHNvdXJjZSA9IHNlY3Rpb24uY29uc3VtZXIuX3NvdXJjZXMuYXQobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc2VjdGlvbi5jb25zdW1lci5zb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICAgIHNvdXJjZSA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihzb3VyY2UpO1xuXG4gICAgICAgIHZhciBuYW1lID0gbnVsbDtcbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBzZWN0aW9uLmNvbnN1bWVyLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBtYXBwaW5ncyBjb21pbmcgZnJvbSB0aGUgY29uc3VtZXIgZm9yIHRoZSBzZWN0aW9uIGhhdmVcbiAgICAgICAgLy8gZ2VuZXJhdGVkIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24sIHNvIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gb2Zmc2V0IHRoZW0gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb25jYXRlbmF0ZWRcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGZpbGUuXG4gICAgICAgIHZhciBhZGp1c3RlZE1hcHBpbmcgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lIC0gMSksXG4gICAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gbWFwcGluZy5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhZGp1c3RlZE1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLnB1c2goYWRqdXN0ZWRNYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydCh0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHF1aWNrU29ydCh0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gIH07XG5cbmV4cG9ydHMuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyID0gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIEFycmF5U2V0ID0gcmVxdWlyZSgnLi9hcnJheS1zZXQnKS5BcnJheVNldDtcbnZhciBNYXBwaW5nTGlzdCA9IHJlcXVpcmUoJy4vbWFwcGluZy1saXN0JykuTWFwcGluZ0xpc3Q7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhlIFNvdXJjZU1hcEdlbmVyYXRvciByZXByZXNlbnRzIGEgc291cmNlIG1hcCB3aGljaCBpc1xuICogYmVpbmcgYnVpbHQgaW5jcmVtZW50YWxseS4gWW91IG1heSBwYXNzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqICAgLSBzb3VyY2VSb290OiBBIHJvb3QgZm9yIGFsbCByZWxhdGl2ZSBVUkxzIGluIHRoaXMgc291cmNlIG1hcC5cbiAqL1xuZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKSB7XG4gIGlmICghYUFyZ3MpIHtcbiAgICBhQXJncyA9IHt9O1xuICB9XG4gIHRoaXMuX2ZpbGUgPSB1dGlsLmdldEFyZyhhQXJncywgJ2ZpbGUnLCBudWxsKTtcbiAgdGhpcy5fc291cmNlUm9vdCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB0aGlzLl9za2lwVmFsaWRhdGlvbiA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc2tpcFZhbGlkYXRpb24nLCBmYWxzZSk7XG4gIHRoaXMuX3NvdXJjZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgdGhpcy5fbmFtZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgdGhpcy5fbWFwcGluZ3MgPSBuZXcgTWFwcGluZ0xpc3QoKTtcbiAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gbnVsbDtcbn1cblxuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmVyc2lvbiA9IDM7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IgYmFzZWQgb24gYSBTb3VyY2VNYXBDb25zdW1lclxuICpcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLmZyb21Tb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIpIHtcbiAgICB2YXIgc291cmNlUm9vdCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VSb290O1xuICAgIHZhciBnZW5lcmF0b3IgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKHtcbiAgICAgIGZpbGU6IGFTb3VyY2VNYXBDb25zdW1lci5maWxlLFxuICAgICAgc291cmNlUm9vdDogc291cmNlUm9vdFxuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5lYWNoTWFwcGluZyhmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgdmFyIG5ld01hcHBpbmcgPSB7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSxcbiAgICAgICAgICBjb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgIG5ld01hcHBpbmcuc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbmV3TWFwcGluZy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3TWFwcGluZy5vcmlnaW5hbCA9IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW5cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdNYXBwaW5nLm5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZ2VuZXJhdG9yLmFkZE1hcHBpbmcobmV3TWFwcGluZyk7XG4gICAgfSk7XG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgdmFyIHNvdXJjZVJlbGF0aXZlID0gc291cmNlRmlsZTtcbiAgICAgIGlmIChzb3VyY2VSb290ICE9PSBudWxsKSB7XG4gICAgICAgIHNvdXJjZVJlbGF0aXZlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZW5lcmF0b3IuX3NvdXJjZXMuaGFzKHNvdXJjZVJlbGF0aXZlKSkge1xuICAgICAgICBnZW5lcmF0b3IuX3NvdXJjZXMuYWRkKHNvdXJjZVJlbGF0aXZlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgZ2VuZXJhdG9yLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfTtcblxuLyoqXG4gKiBBZGQgYSBzaW5nbGUgbWFwcGluZyBmcm9tIG9yaWdpbmFsIHNvdXJjZSBsaW5lIGFuZCBjb2x1bW4gdG8gdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIGZvciB0aGlzIHNvdXJjZSBtYXAgYmVpbmcgY3JlYXRlZC4gVGhlIG1hcHBpbmdcbiAqIG9iamVjdCBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGdlbmVyYXRlZDogQW4gb2JqZWN0IHdpdGggdGhlIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zLlxuICogICAtIG9yaWdpbmFsOiBBbiBvYmplY3Qgd2l0aCB0aGUgb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSAocmVsYXRpdmUgdG8gdGhlIHNvdXJjZVJvb3QpLlxuICogICAtIG5hbWU6IEFuIG9wdGlvbmFsIG9yaWdpbmFsIHRva2VuIG5hbWUgZm9yIHRoaXMgbWFwcGluZy5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hZGRNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2FkZE1hcHBpbmcoYUFyZ3MpIHtcbiAgICB2YXIgZ2VuZXJhdGVkID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdnZW5lcmF0ZWQnKTtcbiAgICB2YXIgb3JpZ2luYWwgPSB1dGlsLmdldEFyZyhhQXJncywgJ29yaWdpbmFsJywgbnVsbCk7XG4gICAgdmFyIHNvdXJjZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJywgbnVsbCk7XG4gICAgdmFyIG5hbWUgPSB1dGlsLmdldEFyZyhhQXJncywgJ25hbWUnLCBudWxsKTtcblxuICAgIGlmICghdGhpcy5fc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRlTWFwcGluZyhnZW5lcmF0ZWQsIG9yaWdpbmFsLCBzb3VyY2UsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgc291cmNlID0gU3RyaW5nKHNvdXJjZSk7XG4gICAgICBpZiAoIXRoaXMuX3NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICBuYW1lID0gU3RyaW5nKG5hbWUpO1xuICAgICAgaWYgKCF0aGlzLl9uYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgdGhpcy5fbmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX21hcHBpbmdzLmFkZCh7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogZ2VuZXJhdGVkLmNvbHVtbixcbiAgICAgIG9yaWdpbmFsTGluZTogb3JpZ2luYWwgIT0gbnVsbCAmJiBvcmlnaW5hbC5saW5lLFxuICAgICAgb3JpZ2luYWxDb2x1bW46IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwuY29sdW1uLFxuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBuYW1lOiBuYW1lXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3NldFNvdXJjZUNvbnRlbnQoYVNvdXJjZUZpbGUsIGFTb3VyY2VDb250ZW50KSB7XG4gICAgdmFyIHNvdXJjZSA9IGFTb3VyY2VGaWxlO1xuICAgIGlmICh0aGlzLl9zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5fc291cmNlUm9vdCwgc291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoYVNvdXJjZUNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgLy8gQWRkIHRoZSBzb3VyY2UgY29udGVudCB0byB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgX3NvdXJjZXNDb250ZW50cyBtYXAgaWYgdGhlIHByb3BlcnR5IGlzIG51bGwuXG4gICAgICBpZiAoIXRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoc291cmNlKV0gPSBhU291cmNlQ29udGVudDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBzb3VyY2UgZmlsZSBmcm9tIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcC5cbiAgICAgIC8vIElmIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcCBpcyBlbXB0eSwgc2V0IHRoZSBwcm9wZXJ0eSB0byBudWxsLlxuICAgICAgZGVsZXRlIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3NvdXJjZXNDb250ZW50cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIG1hcHBpbmdzIG9mIGEgc3ViLXNvdXJjZS1tYXAgZm9yIGEgc3BlY2lmaWMgc291cmNlIGZpbGUgdG8gdGhlXG4gKiBzb3VyY2UgbWFwIGJlaW5nIGdlbmVyYXRlZC4gRWFjaCBtYXBwaW5nIHRvIHRoZSBzdXBwbGllZCBzb3VyY2UgZmlsZSBpc1xuICogcmV3cml0dGVuIHVzaW5nIHRoZSBzdXBwbGllZCBzb3VyY2UgbWFwLiBOb3RlOiBUaGUgcmVzb2x1dGlvbiBmb3IgdGhlXG4gKiByZXN1bHRpbmcgbWFwcGluZ3MgaXMgdGhlIG1pbmltaXVtIG9mIHRoaXMgbWFwIGFuZCB0aGUgc3VwcGxpZWQgbWFwLlxuICpcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBhU291cmNlRmlsZSBPcHRpb25hbC4gVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZS5cbiAqICAgICAgICBJZiBvbWl0dGVkLCBTb3VyY2VNYXBDb25zdW1lcidzIGZpbGUgcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICogQHBhcmFtIGFTb3VyY2VNYXBQYXRoIE9wdGlvbmFsLiBUaGUgZGlybmFtZSBvZiB0aGUgcGF0aCB0byB0aGUgc291cmNlIG1hcFxuICogICAgICAgIHRvIGJlIGFwcGxpZWQuIElmIHJlbGF0aXZlLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgU291cmNlTWFwQ29uc3VtZXIuXG4gKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgbmVlZGVkIHdoZW4gdGhlIHR3byBzb3VyY2UgbWFwcyBhcmVuJ3QgaW4gdGhlIHNhbWVcbiAqICAgICAgICBkaXJlY3RvcnksIGFuZCB0aGUgc291cmNlIG1hcCB0byBiZSBhcHBsaWVkIGNvbnRhaW5zIHJlbGF0aXZlIHNvdXJjZVxuICogICAgICAgIHBhdGhzLiBJZiBzbywgdGhvc2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIG5lZWQgdG8gYmUgcmV3cml0dGVuXG4gKiAgICAgICAgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvci5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hcHBseVNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hcHBseVNvdXJjZU1hcChhU291cmNlTWFwQ29uc3VtZXIsIGFTb3VyY2VGaWxlLCBhU291cmNlTWFwUGF0aCkge1xuICAgIHZhciBzb3VyY2VGaWxlID0gYVNvdXJjZUZpbGU7XG4gICAgLy8gSWYgYVNvdXJjZUZpbGUgaXMgb21pdHRlZCwgd2Ugd2lsbCB1c2UgdGhlIGZpbGUgcHJvcGVydHkgb2YgdGhlIFNvdXJjZU1hcFxuICAgIGlmIChhU291cmNlRmlsZSA9PSBudWxsKSB7XG4gICAgICBpZiAoYVNvdXJjZU1hcENvbnN1bWVyLmZpbGUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1NvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgcmVxdWlyZXMgZWl0aGVyIGFuIGV4cGxpY2l0IHNvdXJjZSBmaWxlLCAnICtcbiAgICAgICAgICAnb3IgdGhlIHNvdXJjZSBtYXBcXCdzIFwiZmlsZVwiIHByb3BlcnR5LiBCb3RoIHdlcmUgb21pdHRlZC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzb3VyY2VGaWxlID0gYVNvdXJjZU1hcENvbnN1bWVyLmZpbGU7XG4gICAgfVxuICAgIHZhciBzb3VyY2VSb290ID0gdGhpcy5fc291cmNlUm9vdDtcbiAgICAvLyBNYWtlIFwic291cmNlRmlsZVwiIHJlbGF0aXZlIGlmIGFuIGFic29sdXRlIFVybCBpcyBwYXNzZWQuXG4gICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgc291cmNlRmlsZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgfVxuICAgIC8vIEFwcGx5aW5nIHRoZSBTb3VyY2VNYXAgY2FuIGFkZCBhbmQgcmVtb3ZlIGl0ZW1zIGZyb20gdGhlIHNvdXJjZXMgYW5kXG4gICAgLy8gdGhlIG5hbWVzIGFycmF5LlxuICAgIHZhciBuZXdTb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gICAgdmFyIG5ld05hbWVzID0gbmV3IEFycmF5U2V0KCk7XG5cbiAgICAvLyBGaW5kIG1hcHBpbmdzIGZvciB0aGUgXCJzb3VyY2VGaWxlXCJcbiAgICB0aGlzLl9tYXBwaW5ncy51bnNvcnRlZEZvckVhY2goZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSA9PT0gc291cmNlRmlsZSAmJiBtYXBwaW5nLm9yaWdpbmFsTGluZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGl0IGNhbiBiZSBtYXBwZWQgYnkgdGhlIHNvdXJjZSBtYXAsIHRoZW4gdXBkYXRlIHRoZSBtYXBwaW5nLlxuICAgICAgICB2YXIgb3JpZ2luYWwgPSBhU291cmNlTWFwQ29uc3VtZXIub3JpZ2luYWxQb3NpdGlvbkZvcih7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3JpZ2luYWwuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBDb3B5IG1hcHBpbmdcbiAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IG9yaWdpbmFsLnNvdXJjZTtcbiAgICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgbWFwcGluZy5zb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmxpbmU7XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgICAgICBpZiAob3JpZ2luYWwubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXBwaW5nLm5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgc291cmNlID0gbWFwcGluZy5zb3VyY2U7XG4gICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgIW5ld1NvdXJjZXMuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgbmV3U291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG5hbWUgPSBtYXBwaW5nLm5hbWU7XG4gICAgICBpZiAobmFtZSAhPSBudWxsICYmICFuZXdOYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgICAgbmV3TmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuXG4gICAgfSwgdGhpcyk7XG4gICAgdGhpcy5fc291cmNlcyA9IG5ld1NvdXJjZXM7XG4gICAgdGhpcy5fbmFtZXMgPSBuZXdOYW1lcztcblxuICAgIC8vIENvcHkgc291cmNlc0NvbnRlbnRzIG9mIGFwcGxpZWQgbWFwLlxuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChhU291cmNlTWFwUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhU291cmNlTWFwUGF0aCwgc291cmNlRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBBIG1hcHBpbmcgY2FuIGhhdmUgb25lIG9mIHRoZSB0aHJlZSBsZXZlbHMgb2YgZGF0YTpcbiAqXG4gKiAgIDEuIEp1c3QgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi5cbiAqICAgMi4gVGhlIEdlbmVyYXRlZCBwb3NpdGlvbiwgb3JpZ2luYWwgcG9zaXRpb24sIGFuZCBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIDMuIEdlbmVyYXRlZCBhbmQgb3JpZ2luYWwgcG9zaXRpb24sIG9yaWdpbmFsIHNvdXJjZSwgYXMgd2VsbCBhcyBhIG5hbWVcbiAqICAgICAgdG9rZW4uXG4gKlxuICogVG8gbWFpbnRhaW4gY29uc2lzdGVuY3ksIHdlIHZhbGlkYXRlIHRoYXQgYW55IG5ldyBtYXBwaW5nIGJlaW5nIGFkZGVkIGZhbGxzXG4gKiBpbiB0byBvbmUgb2YgdGhlc2UgY2F0ZWdvcmllcy5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGVNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3ZhbGlkYXRlTWFwcGluZyhhR2VuZXJhdGVkLCBhT3JpZ2luYWwsIGFTb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYU5hbWUpIHtcbiAgICAvLyBXaGVuIGFPcmlnaW5hbCBpcyB0cnV0aHkgYnV0IGhhcyBlbXB0eSB2YWx1ZXMgZm9yIC5saW5lIGFuZCAuY29sdW1uLFxuICAgIC8vIGl0IGlzIG1vc3QgbGlrZWx5IGEgcHJvZ3JhbW1lciBlcnJvci4gSW4gdGhpcyBjYXNlIHdlIHRocm93IGEgdmVyeVxuICAgIC8vIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UgdG8gdHJ5IHRvIGd1aWRlIHRoZW0gdGhlIHJpZ2h0IHdheS5cbiAgICAvLyBGb3IgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXIvcG9seW1lci1idW5kbGVyL3B1bGwvNTE5XG4gICAgaWYgKGFPcmlnaW5hbCAmJiB0eXBlb2YgYU9yaWdpbmFsLmxpbmUgIT09ICdudW1iZXInICYmIHR5cGVvZiBhT3JpZ2luYWwuY29sdW1uICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnb3JpZ2luYWwubGluZSBhbmQgb3JpZ2luYWwuY29sdW1uIGFyZSBub3QgbnVtYmVycyAtLSB5b3UgcHJvYmFibHkgbWVhbnQgdG8gb21pdCAnICtcbiAgICAgICAgICAgICd0aGUgb3JpZ2luYWwgbWFwcGluZyBlbnRpcmVseSBhbmQgb25seSBtYXAgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbi4gSWYgc28sIHBhc3MgJyArXG4gICAgICAgICAgICAnbnVsbCBmb3IgdGhlIG9yaWdpbmFsIG1hcHBpbmcgaW5zdGVhZCBvZiBhbiBvYmplY3Qgd2l0aCBlbXB0eSBvciBudWxsIHZhbHVlcy4nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAmJiBhR2VuZXJhdGVkLmxpbmUgPiAwICYmIGFHZW5lcmF0ZWQuY29sdW1uID49IDBcbiAgICAgICAgJiYgIWFPcmlnaW5hbCAmJiAhYVNvdXJjZSAmJiAhYU5hbWUpIHtcbiAgICAgIC8vIENhc2UgMS5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxzZSBpZiAoYUdlbmVyYXRlZCAmJiAnbGluZScgaW4gYUdlbmVyYXRlZCAmJiAnY29sdW1uJyBpbiBhR2VuZXJhdGVkXG4gICAgICAgICAgICAgJiYgYU9yaWdpbmFsICYmICdsaW5lJyBpbiBhT3JpZ2luYWwgJiYgJ2NvbHVtbicgaW4gYU9yaWdpbmFsXG4gICAgICAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICAgICAgJiYgYU9yaWdpbmFsLmxpbmUgPiAwICYmIGFPcmlnaW5hbC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFTb3VyY2UpIHtcbiAgICAgIC8vIENhc2VzIDIgYW5kIDMuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1hcHBpbmc6ICcgKyBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGdlbmVyYXRlZDogYUdlbmVyYXRlZCxcbiAgICAgICAgc291cmNlOiBhU291cmNlLFxuICAgICAgICBvcmlnaW5hbDogYU9yaWdpbmFsLFxuICAgICAgICBuYW1lOiBhTmFtZVxuICAgICAgfSkpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBTZXJpYWxpemUgdGhlIGFjY3VtdWxhdGVkIG1hcHBpbmdzIGluIHRvIHRoZSBzdHJlYW0gb2YgYmFzZSA2NCBWTFFzXG4gKiBzcGVjaWZpZWQgYnkgdGhlIHNvdXJjZSBtYXAgZm9ybWF0LlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl9zZXJpYWxpemVNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXJpYWxpemVNYXBwaW5ncygpIHtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZExpbmUgPSAxO1xuICAgIHZhciBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbExpbmUgPSAwO1xuICAgIHZhciBwcmV2aW91c05hbWUgPSAwO1xuICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgIHZhciBuZXh0O1xuICAgIHZhciBtYXBwaW5nO1xuICAgIHZhciBuYW1lSWR4O1xuICAgIHZhciBzb3VyY2VJZHg7XG5cbiAgICB2YXIgbWFwcGluZ3MgPSB0aGlzLl9tYXBwaW5ncy50b0FycmF5KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG1hcHBpbmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBtYXBwaW5nID0gbWFwcGluZ3NbaV07XG4gICAgICBuZXh0ID0gJydcblxuICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgICAgd2hpbGUgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSAhPT0gcHJldmlvdXNHZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgbmV4dCArPSAnOyc7XG4gICAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICBpZiAoIXV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZywgbWFwcGluZ3NbaSAtIDFdKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHQgKz0gJywnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c0dlbmVyYXRlZENvbHVtbik7XG4gICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VJZHggPSB0aGlzLl9zb3VyY2VzLmluZGV4T2YobWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUoc291cmNlSWR4IC0gcHJldmlvdXNTb3VyY2UpO1xuICAgICAgICBwcmV2aW91c1NvdXJjZSA9IHNvdXJjZUlkeDtcblxuICAgICAgICAvLyBsaW5lcyBhcmUgc3RvcmVkIDAtYmFzZWQgaW4gU291cmNlTWFwIHNwZWMgdmVyc2lvbiAzXG4gICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsTGluZSAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c09yaWdpbmFsTGluZSk7XG4gICAgICAgIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmUgLSAxO1xuXG4gICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbENvbHVtbik7XG4gICAgICAgIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIGlmIChtYXBwaW5nLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5hbWVJZHggPSB0aGlzLl9uYW1lcy5pbmRleE9mKG1hcHBpbmcubmFtZSk7XG4gICAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKG5hbWVJZHggLSBwcmV2aW91c05hbWUpO1xuICAgICAgICAgIHByZXZpb3VzTmFtZSA9IG5hbWVJZHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzdWx0ICs9IG5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KGFTb3VyY2VzLCBhU291cmNlUm9vdCkge1xuICAgIHJldHVybiBhU291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoYVNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKGFTb3VyY2VSb290LCBzb3VyY2UpO1xuICAgICAgfVxuICAgICAgdmFyIGtleSA9IHV0aWwudG9TZXRTdHJpbmcoc291cmNlKTtcbiAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fc291cmNlc0NvbnRlbnRzLCBrZXkpXG4gICAgICAgID8gdGhpcy5fc291cmNlc0NvbnRlbnRzW2tleV1cbiAgICAgICAgOiBudWxsO1xuICAgIH0sIHRoaXMpO1xuICB9O1xuXG4vKipcbiAqIEV4dGVybmFsaXplIHRoZSBzb3VyY2UgbWFwLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvSlNPTiA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl90b0pTT04oKSB7XG4gICAgdmFyIG1hcCA9IHtcbiAgICAgIHZlcnNpb246IHRoaXMuX3ZlcnNpb24sXG4gICAgICBzb3VyY2VzOiB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKSxcbiAgICAgIG5hbWVzOiB0aGlzLl9uYW1lcy50b0FycmF5KCksXG4gICAgICBtYXBwaW5nczogdGhpcy5fc2VyaWFsaXplTWFwcGluZ3MoKVxuICAgIH07XG4gICAgaWYgKHRoaXMuX2ZpbGUgIT0gbnVsbCkge1xuICAgICAgbWFwLmZpbGUgPSB0aGlzLl9maWxlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBtYXAuc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIG1hcC5zb3VyY2VzQ29udGVudCA9IHRoaXMuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQobWFwLnNvdXJjZXMsIG1hcC5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xuICB9O1xuXG4vKipcbiAqIFJlbmRlciB0aGUgc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQgdG8gYSBzdHJpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUudG9TdHJpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudG9KU09OKCkpO1xuICB9O1xuXG5leHBvcnRzLlNvdXJjZU1hcEdlbmVyYXRvciA9IFNvdXJjZU1hcEdlbmVyYXRvcjtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIFNvdXJjZU1hcEdlbmVyYXRvciA9IHJlcXVpcmUoJy4vc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4vLyBNYXRjaGVzIGEgV2luZG93cy1zdHlsZSBgXFxyXFxuYCBuZXdsaW5lIG9yIGEgYFxcbmAgbmV3bGluZSB1c2VkIGJ5IGFsbCBvdGhlclxuLy8gb3BlcmF0aW5nIHN5c3RlbXMgdGhlc2UgZGF5cyAoY2FwdHVyaW5nIHRoZSByZXN1bHQpLlxudmFyIFJFR0VYX05FV0xJTkUgPSAvKFxccj9cXG4pLztcblxuLy8gTmV3bGluZSBjaGFyYWN0ZXIgY29kZSBmb3IgY2hhckNvZGVBdCgpIGNvbXBhcmlzb25zXG52YXIgTkVXTElORV9DT0RFID0gMTA7XG5cbi8vIFByaXZhdGUgc3ltYm9sIGZvciBpZGVudGlmeWluZyBgU291cmNlTm9kZWBzIHdoZW4gbXVsdGlwbGUgdmVyc2lvbnMgb2Zcbi8vIHRoZSBzb3VyY2UtbWFwIGxpYnJhcnkgYXJlIGxvYWRlZC4gVGhpcyBNVVNUIE5PVCBDSEFOR0UgYWNyb3NzXG4vLyB2ZXJzaW9ucyFcbnZhciBpc1NvdXJjZU5vZGUgPSBcIiQkJGlzU291cmNlTm9kZSQkJFwiO1xuXG4vKipcbiAqIFNvdXJjZU5vZGVzIHByb3ZpZGUgYSB3YXkgdG8gYWJzdHJhY3Qgb3ZlciBpbnRlcnBvbGF0aW5nL2NvbmNhdGVuYXRpbmdcbiAqIHNuaXBwZXRzIG9mIGdlbmVyYXRlZCBKYXZhU2NyaXB0IHNvdXJjZSBjb2RlIHdoaWxlIG1haW50YWluaW5nIHRoZSBsaW5lIGFuZFxuICogY29sdW1uIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUuXG4gKlxuICogQHBhcmFtIGFMaW5lIFRoZSBvcmlnaW5hbCBsaW5lIG51bWJlci5cbiAqIEBwYXJhbSBhQ29sdW1uIFRoZSBvcmlnaW5hbCBjb2x1bW4gbnVtYmVyLlxuICogQHBhcmFtIGFTb3VyY2UgVGhlIG9yaWdpbmFsIHNvdXJjZSdzIGZpbGVuYW1lLlxuICogQHBhcmFtIGFDaHVua3MgT3B0aW9uYWwuIEFuIGFycmF5IG9mIHN0cmluZ3Mgd2hpY2ggYXJlIHNuaXBwZXRzIG9mXG4gKiAgICAgICAgZ2VuZXJhdGVkIEpTLCBvciBvdGhlciBTb3VyY2VOb2Rlcy5cbiAqIEBwYXJhbSBhTmFtZSBUaGUgb3JpZ2luYWwgaWRlbnRpZmllci5cbiAqL1xuZnVuY3Rpb24gU291cmNlTm9kZShhTGluZSwgYUNvbHVtbiwgYVNvdXJjZSwgYUNodW5rcywgYU5hbWUpIHtcbiAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICB0aGlzLnNvdXJjZUNvbnRlbnRzID0ge307XG4gIHRoaXMubGluZSA9IGFMaW5lID09IG51bGwgPyBudWxsIDogYUxpbmU7XG4gIHRoaXMuY29sdW1uID0gYUNvbHVtbiA9PSBudWxsID8gbnVsbCA6IGFDb2x1bW47XG4gIHRoaXMuc291cmNlID0gYVNvdXJjZSA9PSBudWxsID8gbnVsbCA6IGFTb3VyY2U7XG4gIHRoaXMubmFtZSA9IGFOYW1lID09IG51bGwgPyBudWxsIDogYU5hbWU7XG4gIHRoaXNbaXNTb3VyY2VOb2RlXSA9IHRydWU7XG4gIGlmIChhQ2h1bmtzICE9IG51bGwpIHRoaXMuYWRkKGFDaHVua3MpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBTb3VyY2VOb2RlIGZyb20gZ2VuZXJhdGVkIGNvZGUgYW5kIGEgU291cmNlTWFwQ29uc3VtZXIuXG4gKlxuICogQHBhcmFtIGFHZW5lcmF0ZWRDb2RlIFRoZSBnZW5lcmF0ZWQgY29kZVxuICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgU291cmNlTWFwIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhUmVsYXRpdmVQYXRoIE9wdGlvbmFsLiBUaGUgcGF0aCB0aGF0IHJlbGF0aXZlIHNvdXJjZXMgaW4gdGhlXG4gKiAgICAgICAgU291cmNlTWFwQ29uc3VtZXIgc2hvdWxkIGJlIHJlbGF0aXZlIHRvLlxuICovXG5Tb3VyY2VOb2RlLmZyb21TdHJpbmdXaXRoU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcChhR2VuZXJhdGVkQ29kZSwgYVNvdXJjZU1hcENvbnN1bWVyLCBhUmVsYXRpdmVQYXRoKSB7XG4gICAgLy8gVGhlIFNvdXJjZU5vZGUgd2Ugd2FudCB0byBmaWxsIHdpdGggdGhlIGdlbmVyYXRlZCBjb2RlXG4gICAgLy8gYW5kIHRoZSBTb3VyY2VNYXBcbiAgICB2YXIgbm9kZSA9IG5ldyBTb3VyY2VOb2RlKCk7XG5cbiAgICAvLyBBbGwgZXZlbiBpbmRpY2VzIG9mIHRoaXMgYXJyYXkgYXJlIG9uZSBsaW5lIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSxcbiAgICAvLyB3aGlsZSBhbGwgb2RkIGluZGljZXMgYXJlIHRoZSBuZXdsaW5lcyBiZXR3ZWVuIHR3byBhZGphY2VudCBsaW5lc1xuICAgIC8vIChzaW5jZSBgUkVHRVhfTkVXTElORWAgY2FwdHVyZXMgaXRzIG1hdGNoKS5cbiAgICAvLyBQcm9jZXNzZWQgZnJhZ21lbnRzIGFyZSBhY2Nlc3NlZCBieSBjYWxsaW5nIGBzaGlmdE5leHRMaW5lYC5cbiAgICB2YXIgcmVtYWluaW5nTGluZXMgPSBhR2VuZXJhdGVkQ29kZS5zcGxpdChSRUdFWF9ORVdMSU5FKTtcbiAgICB2YXIgcmVtYWluaW5nTGluZXNJbmRleCA9IDA7XG4gICAgdmFyIHNoaWZ0TmV4dExpbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBsaW5lQ29udGVudHMgPSBnZXROZXh0TGluZSgpO1xuICAgICAgLy8gVGhlIGxhc3QgbGluZSBvZiBhIGZpbGUgbWlnaHQgbm90IGhhdmUgYSBuZXdsaW5lLlxuICAgICAgdmFyIG5ld0xpbmUgPSBnZXROZXh0TGluZSgpIHx8IFwiXCI7XG4gICAgICByZXR1cm4gbGluZUNvbnRlbnRzICsgbmV3TGluZTtcblxuICAgICAgZnVuY3Rpb24gZ2V0TmV4dExpbmUoKSB7XG4gICAgICAgIHJldHVybiByZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoID9cbiAgICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXgrK10gOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIHBvc2l0aW9uIG9mIFwicmVtYWluaW5nTGluZXNcIlxuICAgIHZhciBsYXN0R2VuZXJhdGVkTGluZSA9IDEsIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuXG4gICAgLy8gVGhlIGdlbmVyYXRlIFNvdXJjZU5vZGVzIHdlIG5lZWQgYSBjb2RlIHJhbmdlLlxuICAgIC8vIFRvIGV4dHJhY3QgaXQgY3VycmVudCBhbmQgbGFzdCBtYXBwaW5nIGlzIHVzZWQuXG4gICAgLy8gSGVyZSB3ZSBzdG9yZSB0aGUgbGFzdCBtYXBwaW5nLlxuICAgIHZhciBsYXN0TWFwcGluZyA9IG51bGw7XG5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIGlmIChsYXN0TWFwcGluZyAhPT0gbnVsbCkge1xuICAgICAgICAvLyBXZSBhZGQgdGhlIGNvZGUgZnJvbSBcImxhc3RNYXBwaW5nXCIgdG8gXCJtYXBwaW5nXCI6XG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZXJlIGlzIGEgbmV3IGxpbmUgaW4gYmV0d2Vlbi5cbiAgICAgICAgaWYgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgICAgLy8gQXNzb2NpYXRlIGZpcnN0IGxpbmUgd2l0aCBcImxhc3RNYXBwaW5nXCJcbiAgICAgICAgICBhZGRNYXBwaW5nV2l0aENvZGUobGFzdE1hcHBpbmcsIHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZExpbmUrKztcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIGNvZGUgaXMgYWRkZWQgd2l0aG91dCBtYXBwaW5nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmV3IGxpbmUgaW4gYmV0d2Vlbi5cbiAgICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIGNvZGUgYmV0d2VlbiBcImxhc3RHZW5lcmF0ZWRDb2x1bW5cIiBhbmRcbiAgICAgICAgICAvLyBcIm1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXCIgd2l0aCBcImxhc3RNYXBwaW5nXCJcbiAgICAgICAgICB2YXIgbmV4dExpbmUgPSByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4XSB8fCAnJztcbiAgICAgICAgICB2YXIgY29kZSA9IG5leHRMaW5lLnN1YnN0cigwLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcbiAgICAgICAgICBhZGRNYXBwaW5nV2l0aENvZGUobGFzdE1hcHBpbmcsIGNvZGUpO1xuICAgICAgICAgIC8vIE5vIG1vcmUgcmVtYWluaW5nIGNvZGUsIGNvbnRpbnVlXG4gICAgICAgICAgbGFzdE1hcHBpbmcgPSBtYXBwaW5nO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gV2UgYWRkIHRoZSBnZW5lcmF0ZWQgY29kZSB1bnRpbCB0aGUgZmlyc3QgbWFwcGluZ1xuICAgICAgLy8gdG8gdGhlIFNvdXJjZU5vZGUgd2l0aG91dCBhbnkgbWFwcGluZy5cbiAgICAgIC8vIEVhY2ggbGluZSBpcyBhZGRlZCBhcyBzZXBhcmF0ZSBzdHJpbmcuXG4gICAgICB3aGlsZSAobGFzdEdlbmVyYXRlZExpbmUgPCBtYXBwaW5nLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgbm9kZS5hZGQoc2hpZnROZXh0TGluZSgpKTtcbiAgICAgICAgbGFzdEdlbmVyYXRlZExpbmUrKztcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0R2VuZXJhdGVkQ29sdW1uIDwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pIHtcbiAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgIG5vZGUuYWRkKG5leHRMaW5lLnN1YnN0cigwLCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbikpO1xuICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4XSA9IG5leHRMaW5lLnN1YnN0cihtYXBwaW5nLmdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcbiAgICAgIH1cbiAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICB9LCB0aGlzKTtcbiAgICAvLyBXZSBoYXZlIHByb2Nlc3NlZCBhbGwgbWFwcGluZ3MuXG4gICAgaWYgKHJlbWFpbmluZ0xpbmVzSW5kZXggPCByZW1haW5pbmdMaW5lcy5sZW5ndGgpIHtcbiAgICAgIGlmIChsYXN0TWFwcGluZykge1xuICAgICAgICAvLyBBc3NvY2lhdGUgdGhlIHJlbWFpbmluZyBjb2RlIGluIHRoZSBjdXJyZW50IGxpbmUgd2l0aCBcImxhc3RNYXBwaW5nXCJcbiAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgfVxuICAgICAgLy8gYW5kIGFkZCB0aGUgcmVtYWluaW5nIGxpbmVzIHdpdGhvdXQgYW55IG1hcHBpbmdcbiAgICAgIG5vZGUuYWRkKHJlbWFpbmluZ0xpbmVzLnNwbGljZShyZW1haW5pbmdMaW5lc0luZGV4KS5qb2luKFwiXCIpKTtcbiAgICB9XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50IGludG8gU291cmNlTm9kZVxuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChhUmVsYXRpdmVQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5qb2luKGFSZWxhdGl2ZVBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBub2RlO1xuXG4gICAgZnVuY3Rpb24gYWRkTWFwcGluZ1dpdGhDb2RlKG1hcHBpbmcsIGNvZGUpIHtcbiAgICAgIGlmIChtYXBwaW5nID09PSBudWxsIHx8IG1hcHBpbmcuc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm9kZS5hZGQoY29kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc291cmNlID0gYVJlbGF0aXZlUGF0aFxuICAgICAgICAgID8gdXRpbC5qb2luKGFSZWxhdGl2ZVBhdGgsIG1hcHBpbmcuc291cmNlKVxuICAgICAgICAgIDogbWFwcGluZy5zb3VyY2U7XG4gICAgICAgIG5vZGUuYWRkKG5ldyBTb3VyY2VOb2RlKG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcubmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBZGQgYSBjaHVuayBvZiBnZW5lcmF0ZWQgSlMgdG8gdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2FkZChhQ2h1bmspIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYUNodW5rKSkge1xuICAgIGFDaHVuay5mb3JFYWNoKGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgdGhpcy5hZGQoY2h1bmspO1xuICAgIH0sIHRoaXMpO1xuICB9XG4gIGVsc2UgaWYgKGFDaHVua1tpc1NvdXJjZU5vZGVdIHx8IHR5cGVvZiBhQ2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAoYUNodW5rKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuLnB1c2goYUNodW5rKTtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBZGQgYSBjaHVuayBvZiBnZW5lcmF0ZWQgSlMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIHNvdXJjZSBub2RlLlxuICpcbiAqIEBwYXJhbSBhQ2h1bmsgQSBzdHJpbmcgc25pcHBldCBvZiBnZW5lcmF0ZWQgSlMgY29kZSwgYW5vdGhlciBpbnN0YW5jZSBvZlxuICogICAgICAgIFNvdXJjZU5vZGUsIG9yIGFuIGFycmF5IHdoZXJlIGVhY2ggbWVtYmVyIGlzIG9uZSBvZiB0aG9zZSB0aGluZ3MuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnByZXBlbmQgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3ByZXBlbmQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBmb3IgKHZhciBpID0gYUNodW5rLmxlbmd0aC0xOyBpID49IDA7IGktLSkge1xuICAgICAgdGhpcy5wcmVwZW5kKGFDaHVua1tpXSk7XG4gICAgfVxuICB9XG4gIGVsc2UgaWYgKGFDaHVua1tpc1NvdXJjZU5vZGVdIHx8IHR5cGVvZiBhQ2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICB0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYUNodW5rKTtcbiAgfVxuICBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgXCJFeHBlY3RlZCBhIFNvdXJjZU5vZGUsIHN0cmluZywgb3IgYW4gYXJyYXkgb2YgU291cmNlTm9kZXMgYW5kIHN0cmluZ3MuIEdvdCBcIiArIGFDaHVua1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFdhbGsgb3ZlciB0aGUgdHJlZSBvZiBKUyBzbmlwcGV0cyBpbiB0aGlzIG5vZGUgYW5kIGl0cyBjaGlsZHJlbi4gVGhlXG4gKiB3YWxraW5nIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHNuaXBwZXQgb2YgSlMgYW5kIGlzIHBhc3NlZCB0aGF0XG4gKiBzbmlwcGV0IGFuZCB0aGUgaXRzIG9yaWdpbmFsIGFzc29jaWF0ZWQgc291cmNlJ3MgbGluZS9jb2x1bW4gbG9jYXRpb24uXG4gKlxuICogQHBhcmFtIGFGbiBUaGUgdHJhdmVyc2FsIGZ1bmN0aW9uLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS53YWxrID0gZnVuY3Rpb24gU291cmNlTm9kZV93YWxrKGFGbikge1xuICB2YXIgY2h1bms7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY2h1bmsgPSB0aGlzLmNoaWxkcmVuW2ldO1xuICAgIGlmIChjaHVua1tpc1NvdXJjZU5vZGVdKSB7XG4gICAgICBjaHVuay53YWxrKGFGbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKGNodW5rICE9PSAnJykge1xuICAgICAgICBhRm4oY2h1bmssIHsgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZSxcbiAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIExpa2UgYFN0cmluZy5wcm90b3R5cGUuam9pbmAgZXhjZXB0IGZvciBTb3VyY2VOb2Rlcy4gSW5zZXJ0cyBgYVN0cmAgYmV0d2VlblxuICogZWFjaCBvZiBgdGhpcy5jaGlsZHJlbmAuXG4gKlxuICogQHBhcmFtIGFTZXAgVGhlIHNlcGFyYXRvci5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfam9pbihhU2VwKSB7XG4gIHZhciBuZXdDaGlsZHJlbjtcbiAgdmFyIGk7XG4gIHZhciBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDtcbiAgaWYgKGxlbiA+IDApIHtcbiAgICBuZXdDaGlsZHJlbiA9IFtdO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW4tMTsgaSsrKSB7XG4gICAgICBuZXdDaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaChhU2VwKTtcbiAgICB9XG4gICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICB0aGlzLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENhbGwgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlIG9uIHRoZSB2ZXJ5IHJpZ2h0LW1vc3Qgc291cmNlIHNuaXBwZXQuIFVzZWZ1bFxuICogZm9yIHRyaW1taW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZW5kIG9mIGEgc291cmNlIG5vZGUsIGV0Yy5cbiAqXG4gKiBAcGFyYW0gYVBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVwbGFjZS5cbiAqIEBwYXJhbSBhUmVwbGFjZW1lbnQgVGhlIHRoaW5nIHRvIHJlcGxhY2UgdGhlIHBhdHRlcm4gd2l0aC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUucmVwbGFjZVJpZ2h0ID0gZnVuY3Rpb24gU291cmNlTm9kZV9yZXBsYWNlUmlnaHQoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCkge1xuICB2YXIgbGFzdENoaWxkID0gdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdO1xuICBpZiAobGFzdENoaWxkW2lzU291cmNlTm9kZV0pIHtcbiAgICBsYXN0Q2hpbGQucmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiBsYXN0Q2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdID0gbGFzdENoaWxkLnJlcGxhY2UoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKCcnLnJlcGxhY2UoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCkpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIHNvdXJjZSBjb250ZW50IGZvciBhIHNvdXJjZSBmaWxlLiBUaGlzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIFNvdXJjZU1hcEdlbmVyYXRvclxuICogaW4gdGhlIHNvdXJjZXNDb250ZW50IGZpZWxkLlxuICpcbiAqIEBwYXJhbSBhU291cmNlRmlsZSBUaGUgZmlsZW5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlXG4gKiBAcGFyYW0gYVNvdXJjZUNvbnRlbnQgVGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnNldFNvdXJjZUNvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VOb2RlX3NldFNvdXJjZUNvbnRlbnQoYVNvdXJjZUZpbGUsIGFTb3VyY2VDb250ZW50KSB7XG4gICAgdGhpcy5zb3VyY2VDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKGFTb3VyY2VGaWxlKV0gPSBhU291cmNlQ29udGVudDtcbiAgfTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgU291cmNlTm9kZXMuIFRoZSB3YWxraW5nIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaFxuICogc291cmNlIGZpbGUgY29udGVudCBhbmQgaXMgcGFzc2VkIHRoZSBmaWxlbmFtZSBhbmQgc291cmNlIGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIGFGbiBUaGUgdHJhdmVyc2FsIGZ1bmN0aW9uLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS53YWxrU291cmNlQ29udGVudHMgPVxuICBmdW5jdGlvbiBTb3VyY2VOb2RlX3dhbGtTb3VyY2VDb250ZW50cyhhRm4pIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV1baXNTb3VyY2VOb2RlXSkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuW2ldLndhbGtTb3VyY2VDb250ZW50cyhhRm4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzb3VyY2VzID0gT2JqZWN0LmtleXModGhpcy5zb3VyY2VDb250ZW50cyk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNvdXJjZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGFGbih1dGlsLmZyb21TZXRTdHJpbmcoc291cmNlc1tpXSksIHRoaXMuc291cmNlQ29udGVudHNbc291cmNlc1tpXV0pO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlLiBXYWxrcyBvdmVyIHRoZSB0cmVlXG4gKiBhbmQgY29uY2F0ZW5hdGVzIGFsbCB0aGUgdmFyaW91cyBzbmlwcGV0cyB0b2dldGhlciB0byBvbmUgc3RyaW5nLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfdG9TdHJpbmcoKSB7XG4gIHZhciBzdHIgPSBcIlwiO1xuICB0aGlzLndhbGsoZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgc3RyICs9IGNodW5rO1xuICB9KTtcbiAgcmV0dXJuIHN0cjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc291cmNlIG5vZGUgYWxvbmcgd2l0aCBhIHNvdXJjZVxuICogbWFwLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS50b1N0cmluZ1dpdGhTb3VyY2VNYXAgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nV2l0aFNvdXJjZU1hcChhQXJncykge1xuICB2YXIgZ2VuZXJhdGVkID0ge1xuICAgIGNvZGU6IFwiXCIsXG4gICAgbGluZTogMSxcbiAgICBjb2x1bW46IDBcbiAgfTtcbiAgdmFyIG1hcCA9IG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IoYUFyZ3MpO1xuICB2YXIgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICB2YXIgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbExpbmUgPSBudWxsO1xuICB2YXIgbGFzdE9yaWdpbmFsQ29sdW1uID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbE5hbWUgPSBudWxsO1xuICB0aGlzLndhbGsoZnVuY3Rpb24gKGNodW5rLCBvcmlnaW5hbCkge1xuICAgIGdlbmVyYXRlZC5jb2RlICs9IGNodW5rO1xuICAgIGlmIChvcmlnaW5hbC5zb3VyY2UgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwubGluZSAhPT0gbnVsbFxuICAgICAgICAmJiBvcmlnaW5hbC5jb2x1bW4gIT09IG51bGwpIHtcbiAgICAgIGlmKGxhc3RPcmlnaW5hbFNvdXJjZSAhPT0gb3JpZ2luYWwuc291cmNlXG4gICAgICAgICB8fCBsYXN0T3JpZ2luYWxMaW5lICE9PSBvcmlnaW5hbC5saW5lXG4gICAgICAgICB8fCBsYXN0T3JpZ2luYWxDb2x1bW4gIT09IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTmFtZSAhPT0gb3JpZ2luYWwubmFtZSkge1xuICAgICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICAgIGxpbmU6IG9yaWdpbmFsLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG9yaWdpbmFsLnNvdXJjZTtcbiAgICAgIGxhc3RPcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgbGFzdE9yaWdpbmFsQ29sdW1uID0gb3JpZ2luYWwuY29sdW1uO1xuICAgICAgbGFzdE9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsLm5hbWU7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHNvdXJjZU1hcHBpbmdBY3RpdmUpIHtcbiAgICAgIG1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDtcbiAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gICAgZm9yICh2YXIgaWR4ID0gMCwgbGVuZ3RoID0gY2h1bmsubGVuZ3RoOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7XG4gICAgICBpZiAoY2h1bmsuY2hhckNvZGVBdChpZHgpID09PSBORVdMSU5FX0NPREUpIHtcbiAgICAgICAgZ2VuZXJhdGVkLmxpbmUrKztcbiAgICAgICAgZ2VuZXJhdGVkLmNvbHVtbiA9IDA7XG4gICAgICAgIC8vIE1hcHBpbmdzIGVuZCBhdCBlb2xcbiAgICAgICAgaWYgKGlkeCArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZU1hcHBpbmdBY3RpdmUpIHtcbiAgICAgICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgICAgICBzb3VyY2U6IG9yaWdpbmFsLnNvdXJjZSxcbiAgICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICAgIGxpbmU6IG9yaWdpbmFsLmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogb3JpZ2luYWwuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lOiBvcmlnaW5hbC5uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4rKztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICB0aGlzLndhbGtTb3VyY2VDb250ZW50cyhmdW5jdGlvbiAoc291cmNlRmlsZSwgc291cmNlQ29udGVudCkge1xuICAgIG1hcC5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpO1xuICB9KTtcblxuICByZXR1cm4geyBjb2RlOiBnZW5lcmF0ZWQuY29kZSwgbWFwOiBtYXAgfTtcbn07XG5cbmV4cG9ydHMuU291cmNlTm9kZSA9IFNvdXJjZU5vZGU7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB2YWx1ZXMgZnJvbSBwYXJhbWV0ZXIvb3B0aW9uc1xuICogb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gYXJncyBUaGUgb2JqZWN0IHdlIGFyZSBleHRyYWN0aW5nIHZhbHVlcyBmcm9tXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2UgYXJlIGdldHRpbmcuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIEFuIG9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcHJvcGVydHkgaXMgbWlzc2luZ1xuICogZnJvbSB0aGUgb2JqZWN0LiBJZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nLCBhblxuICogZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIGdldEFyZyhhQXJncywgYU5hbWUsIGFEZWZhdWx0VmFsdWUpIHtcbiAgaWYgKGFOYW1lIGluIGFBcmdzKSB7XG4gICAgcmV0dXJuIGFBcmdzW2FOYW1lXTtcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgcmV0dXJuIGFEZWZhdWx0VmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhTmFtZSArICdcIiBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LicpO1xuICB9XG59XG5leHBvcnRzLmdldEFyZyA9IGdldEFyZztcblxudmFyIHVybFJlZ2V4cCA9IC9eKD86KFtcXHcrXFwtLl0rKTopP1xcL1xcLyg/OihcXHcrOlxcdyspQCk/KFtcXHcuLV0qKSg/OjooXFxkKykpPyguKikkLztcbnZhciBkYXRhVXJsUmVnZXhwID0gL15kYXRhOi4rXFwsLiskLztcblxuZnVuY3Rpb24gdXJsUGFyc2UoYVVybCkge1xuICB2YXIgbWF0Y2ggPSBhVXJsLm1hdGNoKHVybFJlZ2V4cCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNjaGVtZTogbWF0Y2hbMV0sXG4gICAgYXV0aDogbWF0Y2hbMl0sXG4gICAgaG9zdDogbWF0Y2hbM10sXG4gICAgcG9ydDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV1cbiAgfTtcbn1cbmV4cG9ydHMudXJsUGFyc2UgPSB1cmxQYXJzZTtcblxuZnVuY3Rpb24gdXJsR2VuZXJhdGUoYVBhcnNlZFVybCkge1xuICB2YXIgdXJsID0gJyc7XG4gIGlmIChhUGFyc2VkVXJsLnNjaGVtZSkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnNjaGVtZSArICc6JztcbiAgfVxuICB1cmwgKz0gJy8vJztcbiAgaWYgKGFQYXJzZWRVcmwuYXV0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmF1dGggKyAnQCc7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwuaG9zdCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLmhvc3Q7XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucG9ydCkge1xuICAgIHVybCArPSBcIjpcIiArIGFQYXJzZWRVcmwucG9ydFxuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBhdGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5wYXRoO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5leHBvcnRzLnVybEdlbmVyYXRlID0gdXJsR2VuZXJhdGU7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGgsIG9yIHRoZSBwYXRoIHBvcnRpb24gb2YgYSBVUkw6XG4gKlxuICogLSBSZXBsYWNlcyBjb25zZWN1dGl2ZSBzbGFzaGVzIHdpdGggb25lIHNsYXNoLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICcuJyBwYXJ0cy5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnPGRpcj4vLi4nIHBhcnRzLlxuICpcbiAqIEJhc2VkIG9uIGNvZGUgaW4gdGhlIE5vZGUuanMgJ3BhdGgnIGNvcmUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciB1cmwgdG8gbm9ybWFsaXplLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemUoYVBhdGgpIHtcbiAgdmFyIHBhdGggPSBhUGF0aDtcbiAgdmFyIHVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgaWYgKHVybCkge1xuICAgIGlmICghdXJsLnBhdGgpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG4gICAgcGF0aCA9IHVybC5wYXRoO1xuICB9XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpO1xuXG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoL1xcLysvKTtcbiAgZm9yICh2YXIgcGFydCwgdXAgPSAwLCBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKHBhcnQgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJy4uJykge1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwID4gMCkge1xuICAgICAgaWYgKHBhcnQgPT09ICcnKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJsYW5rIGlmIHRoZSBwYXRoIGlzIGFic29sdXRlLiBUcnlpbmcgdG8gZ29cbiAgICAgICAgLy8gYWJvdmUgdGhlIHJvb3QgaXMgYSBuby1vcC4gVGhlcmVmb3JlIHdlIGNhbiByZW1vdmUgYWxsICcuLicgcGFydHNcbiAgICAgICAgLy8gZGlyZWN0bHkgYWZ0ZXIgdGhlIHJvb3QuXG4gICAgICAgIHBhcnRzLnNwbGljZShpICsgMSwgdXApO1xuICAgICAgICB1cCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0cy5zcGxpY2UoaSwgMik7XG4gICAgICAgIHVwLS07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHBhdGggPSBwYXJ0cy5qb2luKCcvJyk7XG5cbiAgaWYgKHBhdGggPT09ICcnKSB7XG4gICAgcGF0aCA9IGlzQWJzb2x1dGUgPyAnLycgOiAnLic7XG4gIH1cblxuICBpZiAodXJsKSB7XG4gICAgdXJsLnBhdGggPSBwYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZSh1cmwpO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemU7XG5cbi8qKlxuICogSm9pbnMgdHdvIHBhdGhzL1VSTHMuXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBqb2luZWQgd2l0aCB0aGUgcm9vdC5cbiAqXG4gKiAtIElmIGFQYXRoIGlzIGEgVVJMIG9yIGEgZGF0YSBVUkksIGFQYXRoIGlzIHJldHVybmVkLCB1bmxlc3MgYVBhdGggaXMgYVxuICogICBzY2hlbWUtcmVsYXRpdmUgVVJMOiBUaGVuIHRoZSBzY2hlbWUgb2YgYVJvb3QsIGlmIGFueSwgaXMgcHJlcGVuZGVkXG4gKiAgIGZpcnN0LlxuICogLSBPdGhlcndpc2UgYVBhdGggaXMgYSBwYXRoLiBJZiBhUm9vdCBpcyBhIFVSTCwgdGhlbiBpdHMgcGF0aCBwb3J0aW9uXG4gKiAgIGlzIHVwZGF0ZWQgd2l0aCB0aGUgcmVzdWx0IGFuZCBhUm9vdCBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSByZXN1bHRcbiAqICAgaXMgcmV0dXJuZWQuXG4gKiAgIC0gSWYgYVBhdGggaXMgYWJzb2x1dGUsIHRoZSByZXN1bHQgaXMgYVBhdGguXG4gKiAgIC0gT3RoZXJ3aXNlIHRoZSB0d28gcGF0aHMgYXJlIGpvaW5lZCB3aXRoIGEgc2xhc2guXG4gKiAtIEpvaW5pbmcgZm9yIGV4YW1wbGUgJ2h0dHA6Ly8nIGFuZCAnd3d3LmV4YW1wbGUuY29tJyBpcyBhbHNvIHN1cHBvcnRlZC5cbiAqL1xuZnVuY3Rpb24gam9pbihhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuICBpZiAoYVBhdGggPT09IFwiXCIpIHtcbiAgICBhUGF0aCA9IFwiLlwiO1xuICB9XG4gIHZhciBhUGF0aFVybCA9IHVybFBhcnNlKGFQYXRoKTtcbiAgdmFyIGFSb290VXJsID0gdXJsUGFyc2UoYVJvb3QpO1xuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdCA9IGFSb290VXJsLnBhdGggfHwgJy8nO1xuICB9XG5cbiAgLy8gYGpvaW4oZm9vLCAnLy93d3cuZXhhbXBsZS5vcmcnKWBcbiAgaWYgKGFQYXRoVXJsICYmICFhUGF0aFVybC5zY2hlbWUpIHtcbiAgICBpZiAoYVJvb3RVcmwpIHtcbiAgICAgIGFQYXRoVXJsLnNjaGVtZSA9IGFSb290VXJsLnNjaGVtZTtcbiAgICB9XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFQYXRoVXJsKTtcbiAgfVxuXG4gIGlmIChhUGF0aFVybCB8fCBhUGF0aC5tYXRjaChkYXRhVXJsUmVnZXhwKSkge1xuICAgIHJldHVybiBhUGF0aDtcbiAgfVxuXG4gIC8vIGBqb2luKCdodHRwOi8vJywgJ3d3dy5leGFtcGxlLmNvbScpYFxuICBpZiAoYVJvb3RVcmwgJiYgIWFSb290VXJsLmhvc3QgJiYgIWFSb290VXJsLnBhdGgpIHtcbiAgICBhUm9vdFVybC5ob3N0ID0gYVBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuXG4gIHZhciBqb2luZWQgPSBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJ1xuICAgID8gYVBhdGhcbiAgICA6IG5vcm1hbGl6ZShhUm9vdC5yZXBsYWNlKC9cXC8rJC8sICcnKSArICcvJyArIGFQYXRoKTtcblxuICBpZiAoYVJvb3RVcmwpIHtcbiAgICBhUm9vdFVybC5wYXRoID0gam9pbmVkO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cbiAgcmV0dXJuIGpvaW5lZDtcbn1cbmV4cG9ydHMuam9pbiA9IGpvaW47XG5cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uIChhUGF0aCkge1xuICByZXR1cm4gYVBhdGguY2hhckF0KDApID09PSAnLycgfHwgdXJsUmVnZXhwLnRlc3QoYVBhdGgpO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgcGF0aCByZWxhdGl2ZSB0byBhIFVSTCBvciBhbm90aGVyIHBhdGguXG4gKlxuICogQHBhcmFtIGFSb290IFRoZSByb290IHBhdGggb3IgVVJMLlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIFVSTCB0byBiZSBtYWRlIHJlbGF0aXZlIHRvIGFSb290LlxuICovXG5mdW5jdGlvbiByZWxhdGl2ZShhUm9vdCwgYVBhdGgpIHtcbiAgaWYgKGFSb290ID09PSBcIlwiKSB7XG4gICAgYVJvb3QgPSBcIi5cIjtcbiAgfVxuXG4gIGFSb290ID0gYVJvb3QucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHBhdGggdG8gYmUgYWJvdmUgdGhlIHJvb3QuIEluIHRoaXMgY2FzZSwgc2ltcGx5XG4gIC8vIGNoZWNraW5nIHdoZXRoZXIgdGhlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlIHBhdGggd29uJ3Qgd29yay4gSW5zdGVhZCwgd2VcbiAgLy8gbmVlZCB0byByZW1vdmUgY29tcG9uZW50cyBmcm9tIHRoZSByb290IG9uZSBieSBvbmUsIHVudGlsIGVpdGhlciB3ZSBmaW5kXG4gIC8vIGEgcHJlZml4IHRoYXQgZml0cywgb3Igd2UgcnVuIG91dCBvZiBjb21wb25lbnRzIHRvIHJlbW92ZS5cbiAgdmFyIGxldmVsID0gMDtcbiAgd2hpbGUgKGFQYXRoLmluZGV4T2YoYVJvb3QgKyAnLycpICE9PSAwKSB7XG4gICAgdmFyIGluZGV4ID0gYVJvb3QubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb25seSBwYXJ0IG9mIHRoZSByb290IHRoYXQgaXMgbGVmdCBpcyB0aGUgc2NoZW1lIChpLmUuIGh0dHA6Ly8sXG4gICAgLy8gZmlsZTovLy8sIGV0Yy4pLCBvbmUgb3IgbW9yZSBzbGFzaGVzICgvKSwgb3Igc2ltcGx5IG5vdGhpbmcgYXQgYWxsLCB3ZVxuICAgIC8vIGhhdmUgZXhoYXVzdGVkIGFsbCBjb21wb25lbnRzLCBzbyB0aGUgcGF0aCBpcyBub3QgcmVsYXRpdmUgdG8gdGhlIHJvb3QuXG4gICAgYVJvb3QgPSBhUm9vdC5zbGljZSgwLCBpbmRleCk7XG4gICAgaWYgKGFSb290Lm1hdGNoKC9eKFteXFwvXSs6XFwvKT9cXC8qJC8pKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgKytsZXZlbDtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBhZGQgYSBcIi4uL1wiIGZvciBlYWNoIGNvbXBvbmVudCB3ZSByZW1vdmVkIGZyb20gdGhlIHJvb3QuXG4gIHJldHVybiBBcnJheShsZXZlbCArIDEpLmpvaW4oXCIuLi9cIikgKyBhUGF0aC5zdWJzdHIoYVJvb3QubGVuZ3RoICsgMSk7XG59XG5leHBvcnRzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG5cbnZhciBzdXBwb3J0c051bGxQcm90byA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gISgnX19wcm90b19fJyBpbiBvYmopO1xufSgpKTtcblxuZnVuY3Rpb24gaWRlbnRpdHkgKHMpIHtcbiAgcmV0dXJuIHM7XG59XG5cbi8qKlxuICogQmVjYXVzZSBiZWhhdmlvciBnb2VzIHdhY2t5IHdoZW4geW91IHNldCBgX19wcm90b19fYCBvbiBvYmplY3RzLCB3ZVxuICogaGF2ZSB0byBwcmVmaXggYWxsIHRoZSBzdHJpbmdzIGluIG91ciBzZXQgd2l0aCBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL3B1bGwvMzEgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zb3VyY2UtbWFwL2lzc3Vlcy8zMFxuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5mdW5jdGlvbiB0b1NldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuICckJyArIGFTdHI7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMudG9TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogdG9TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGZyb21TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiBhU3RyLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLmZyb21TZXRTdHJpbmcgPSBzdXBwb3J0c051bGxQcm90byA/IGlkZW50aXR5IDogZnJvbVNldFN0cmluZztcblxuZnVuY3Rpb24gaXNQcm90b1N0cmluZyhzKSB7XG4gIGlmICghcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBzLmxlbmd0aDtcblxuICBpZiAobGVuZ3RoIDwgOSAvKiBcIl9fcHJvdG9fX1wiLmxlbmd0aCAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMSkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAyKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDMpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNCkgIT09IDExNiAvKiAndCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA1KSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDYpICE9PSAxMTQgLyogJ3InICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNykgIT09IDExMiAvKiAncCcgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA4KSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDkpICE9PSA5NSAgLyogJ18nICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IGxlbmd0aCAtIDEwOyBpID49IDA7IGktLSkge1xuICAgIGlmIChzLmNoYXJDb2RlQXQoaSkgIT09IDM2IC8qICckJyAqLykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2hlcmUgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBvcmlnaW5hbCBzb3VyY2UvbGluZS9jb2x1bW4sIGJ1dCBkaWZmZXJlbnQgZ2VuZXJhdGVkXG4gKiBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYSBtYXBwaW5nIHdpdGggYVxuICogc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gIHZhciBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zID0gY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnM7XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGRlZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBpbmRpY2VzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKlxuICogT3B0aW9uYWxseSBwYXNzIGluIGB0cnVlYCBhcyBgb25seUNvbXBhcmVHZW5lcmF0ZWRgIHRvIGNvbnNpZGVyIHR3b1xuICogbWFwcGluZ3Mgd2l0aCB0aGUgc2FtZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uLCBidXQgZGlmZmVyZW50XG4gKiBzb3VyY2UvbmFtZS9vcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gdGhlIHNhbWUuIFVzZWZ1bCB3aGVuIHNlYXJjaGluZyBmb3IgYVxuICogbWFwcGluZyB3aXRoIGEgc3R1YmJlZCBvdXQgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCLCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwIHx8IG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZDtcblxuZnVuY3Rpb24gc3RyY21wKGFTdHIxLCBhU3RyMikge1xuICBpZiAoYVN0cjEgPT09IGFTdHIyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAoYVN0cjEgPT09IG51bGwpIHtcbiAgICByZXR1cm4gMTsgLy8gYVN0cjIgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMiA9PT0gbnVsbCkge1xuICAgIHJldHVybiAtMTsgLy8gYVN0cjEgIT09IG51bGxcbiAgfVxuXG4gIGlmIChhU3RyMSA+IGFTdHIyKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aXRoIGluZmxhdGVkIHNvdXJjZSBhbmQgbmFtZSBzdHJpbmdzIHdoZXJlXG4gKiB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucyBhcmUgY29tcGFyZWQuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICB2YXIgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uIC0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQgPSBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZDtcblxuLyoqXG4gKiBTdHJpcCBhbnkgSlNPTiBYU1NJIGF2b2lkYW5jZSBwcmVmaXggZnJvbSB0aGUgc3RyaW5nIChhcyBkb2N1bWVudGVkXG4gKiBpbiB0aGUgc291cmNlIG1hcHMgc3BlY2lmaWNhdGlvbiksIGFuZCB0aGVuIHBhcnNlIHRoZSBzdHJpbmcgYXNcbiAqIEpTT04uXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU291cmNlTWFwSW5wdXQoc3RyKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKHN0ci5yZXBsYWNlKC9eXFwpXX0nW15cXG5dKlxcbi8sICcnKSk7XG59XG5leHBvcnRzLnBhcnNlU291cmNlTWFwSW5wdXQgPSBwYXJzZVNvdXJjZU1hcElucHV0O1xuXG4vKipcbiAqIENvbXB1dGUgdGhlIFVSTCBvZiBhIHNvdXJjZSBnaXZlbiB0aGUgdGhlIHNvdXJjZSByb290LCB0aGUgc291cmNlJ3NcbiAqIFVSTCwgYW5kIHRoZSBzb3VyY2UgbWFwJ3MgVVJMLlxuICovXG5mdW5jdGlvbiBjb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKSB7XG4gIHNvdXJjZVVSTCA9IHNvdXJjZVVSTCB8fCAnJztcblxuICBpZiAoc291cmNlUm9vdCkge1xuICAgIC8vIFRoaXMgZm9sbG93cyB3aGF0IENocm9tZSBkb2VzLlxuICAgIGlmIChzb3VyY2VSb290W3NvdXJjZVJvb3QubGVuZ3RoIC0gMV0gIT09ICcvJyAmJiBzb3VyY2VVUkxbMF0gIT09ICcvJykge1xuICAgICAgc291cmNlUm9vdCArPSAnLyc7XG4gICAgfVxuICAgIC8vIFRoZSBzcGVjIHNheXM6XG4gICAgLy8gICBMaW5lIDQ6IEFuIG9wdGlvbmFsIHNvdXJjZSByb290LCB1c2VmdWwgZm9yIHJlbG9jYXRpbmcgc291cmNlXG4gICAgLy8gICBmaWxlcyBvbiBhIHNlcnZlciBvciByZW1vdmluZyByZXBlYXRlZCB2YWx1ZXMgaW4gdGhlXG4gICAgLy8gICDigJxzb3VyY2Vz4oCdIGVudHJ5LiAgVGhpcyB2YWx1ZSBpcyBwcmVwZW5kZWQgdG8gdGhlIGluZGl2aWR1YWxcbiAgICAvLyAgIGVudHJpZXMgaW4gdGhlIOKAnHNvdXJjZeKAnSBmaWVsZC5cbiAgICBzb3VyY2VVUkwgPSBzb3VyY2VSb290ICsgc291cmNlVVJMO1xuICB9XG5cbiAgLy8gSGlzdG9yaWNhbGx5LCBTb3VyY2VNYXBDb25zdW1lciBkaWQgbm90IHRha2UgdGhlIHNvdXJjZU1hcFVSTCBhc1xuICAvLyBhIHBhcmFtZXRlci4gIFRoaXMgbW9kZSBpcyBzdGlsbCBzb21ld2hhdCBzdXBwb3J0ZWQsIHdoaWNoIGlzIHdoeVxuICAvLyB0aGlzIGNvZGUgYmxvY2sgaXMgY29uZGl0aW9uYWwuICBIb3dldmVyLCBpdCdzIHByZWZlcmFibGUgdG8gcGFzc1xuICAvLyB0aGUgc291cmNlIG1hcCBVUkwgdG8gU291cmNlTWFwQ29uc3VtZXIsIHNvIHRoYXQgdGhpcyBmdW5jdGlvblxuICAvLyBjYW4gaW1wbGVtZW50IHRoZSBzb3VyY2UgVVJMIHJlc29sdXRpb24gYWxnb3JpdGhtIGFzIG91dGxpbmVkIGluXG4gIC8vIHRoZSBzcGVjLiAgVGhpcyBibG9jayBpcyBiYXNpY2FsbHkgdGhlIGVxdWl2YWxlbnQgb2Y6XG4gIC8vICAgIG5ldyBVUkwoc291cmNlVVJMLCBzb3VyY2VNYXBVUkwpLnRvU3RyaW5nKClcbiAgLy8gLi4uIGV4Y2VwdCBpdCBhdm9pZHMgdXNpbmcgVVJMLCB3aGljaCB3YXNuJ3QgYXZhaWxhYmxlIGluIHRoZVxuICAvLyBvbGRlciByZWxlYXNlcyBvZiBub2RlIHN0aWxsIHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnkuXG4gIC8vXG4gIC8vIFRoZSBzcGVjIHNheXM6XG4gIC8vICAgSWYgdGhlIHNvdXJjZXMgYXJlIG5vdCBhYnNvbHV0ZSBVUkxzIGFmdGVyIHByZXBlbmRpbmcgb2YgdGhlXG4gIC8vICAg4oCcc291cmNlUm9vdOKAnSwgdGhlIHNvdXJjZXMgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZVxuICAvLyAgIFNvdXJjZU1hcCAobGlrZSByZXNvbHZpbmcgc2NyaXB0IHNyYyBpbiBhIGh0bWwgZG9jdW1lbnQpLlxuICBpZiAoc291cmNlTWFwVVJMKSB7XG4gICAgdmFyIHBhcnNlZCA9IHVybFBhcnNlKHNvdXJjZU1hcFVSTCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNvdXJjZU1hcFVSTCBjb3VsZCBub3QgYmUgcGFyc2VkXCIpO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLnBhdGgpIHtcbiAgICAgIC8vIFN0cmlwIHRoZSBsYXN0IHBhdGggY29tcG9uZW50LCBidXQga2VlcCB0aGUgXCIvXCIuXG4gICAgICB2YXIgaW5kZXggPSBwYXJzZWQucGF0aC5sYXN0SW5kZXhPZignLycpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgcGFyc2VkLnBhdGggPSBwYXJzZWQucGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc291cmNlVVJMID0gam9pbih1cmxHZW5lcmF0ZShwYXJzZWQpLCBzb3VyY2VVUkwpO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZShzb3VyY2VVUkwpO1xufVxuZXhwb3J0cy5jb21wdXRlU291cmNlVVJMID0gY29tcHV0ZVNvdXJjZVVSTDtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1jb25zdW1lcicpLlNvdXJjZU1hcENvbnN1bWVyO1xuZXhwb3J0cy5Tb3VyY2VOb2RlID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW5vZGUnKS5Tb3VyY2VOb2RlO1xuIiwiLyogZ2xvYmFsIHdpbmRvdywgZXhwb3J0cywgZGVmaW5lICovXG5cbiFmdW5jdGlvbigpIHtcbiAgICAndXNlIHN0cmljdCdcblxuICAgIHZhciByZSA9IHtcbiAgICAgICAgbm90X3N0cmluZzogL1tec10vLFxuICAgICAgICBub3RfYm9vbDogL1tedF0vLFxuICAgICAgICBub3RfdHlwZTogL1teVF0vLFxuICAgICAgICBub3RfcHJpbWl0aXZlOiAvW152XS8sXG4gICAgICAgIG51bWJlcjogL1tkaWVmZ10vLFxuICAgICAgICBudW1lcmljX2FyZzogL1tiY2RpZWZndXhYXS8sXG4gICAgICAgIGpzb246IC9bal0vLFxuICAgICAgICBub3RfanNvbjogL1teal0vLFxuICAgICAgICB0ZXh0OiAvXlteXFx4MjVdKy8sXG4gICAgICAgIG1vZHVsbzogL15cXHgyNXsyfS8sXG4gICAgICAgIHBsYWNlaG9sZGVyOiAvXlxceDI1KD86KFsxLTldXFxkKilcXCR8XFwoKFteKV0rKVxcKSk/KFxcKyk/KDB8J1teJF0pPygtKT8oXFxkKyk/KD86XFwuKFxcZCspKT8oW2ItZ2lqb3N0VHV2eFhdKS8sXG4gICAgICAgIGtleTogL14oW2Etel9dW2Etel9cXGRdKikvaSxcbiAgICAgICAga2V5X2FjY2VzczogL15cXC4oW2Etel9dW2Etel9cXGRdKikvaSxcbiAgICAgICAgaW5kZXhfYWNjZXNzOiAvXlxcWyhcXGQrKVxcXS8sXG4gICAgICAgIHNpZ246IC9eWystXS9cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzcHJpbnRmKGtleSkge1xuICAgICAgICAvLyBgYXJndW1lbnRzYCBpcyBub3QgYW4gYXJyYXksIGJ1dCBzaG91bGQgYmUgZmluZSBmb3IgdGhpcyBjYWxsXG4gICAgICAgIHJldHVybiBzcHJpbnRmX2Zvcm1hdChzcHJpbnRmX3BhcnNlKGtleSksIGFyZ3VtZW50cylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2c3ByaW50ZihmbXQsIGFyZ3YpIHtcbiAgICAgICAgcmV0dXJuIHNwcmludGYuYXBwbHkobnVsbCwgW2ZtdF0uY29uY2F0KGFyZ3YgfHwgW10pKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNwcmludGZfZm9ybWF0KHBhcnNlX3RyZWUsIGFyZ3YpIHtcbiAgICAgICAgdmFyIGN1cnNvciA9IDEsIHRyZWVfbGVuZ3RoID0gcGFyc2VfdHJlZS5sZW5ndGgsIGFyZywgb3V0cHV0ID0gJycsIGksIGssIHBoLCBwYWQsIHBhZF9jaGFyYWN0ZXIsIHBhZF9sZW5ndGgsIGlzX3Bvc2l0aXZlLCBzaWduXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0cmVlX2xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcnNlX3RyZWVbaV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IHBhcnNlX3RyZWVbaV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwYXJzZV90cmVlW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHBoID0gcGFyc2VfdHJlZVtpXSAvLyBjb252ZW5pZW5jZSBwdXJwb3NlcyBvbmx5XG4gICAgICAgICAgICAgICAgaWYgKHBoLmtleXMpIHsgLy8ga2V5d29yZCBhcmd1bWVudFxuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd2W2N1cnNvcl1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHBoLmtleXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHNwcmludGYoJ1tzcHJpbnRmXSBDYW5ub3QgYWNjZXNzIHByb3BlcnR5IFwiJXNcIiBvZiB1bmRlZmluZWQgdmFsdWUgXCIlc1wiJywgcGgua2V5c1trXSwgcGgua2V5c1trLTFdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ1twaC5rZXlzW2tdXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBoLnBhcmFtX25vKSB7IC8vIHBvc2l0aW9uYWwgYXJndW1lbnQgKGV4cGxpY2l0KVxuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd2W3BoLnBhcmFtX25vXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgLy8gcG9zaXRpb25hbCBhcmd1bWVudCAoaW1wbGljaXQpXG4gICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3ZbY3Vyc29yKytdXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlLm5vdF90eXBlLnRlc3QocGgudHlwZSkgJiYgcmUubm90X3ByaW1pdGl2ZS50ZXN0KHBoLnR5cGUpICYmIGFyZyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZygpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlLm51bWVyaWNfYXJnLnRlc3QocGgudHlwZSkgJiYgKHR5cGVvZiBhcmcgIT09ICdudW1iZXInICYmIGlzTmFOKGFyZykpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc3ByaW50ZignW3NwcmludGZdIGV4cGVjdGluZyBudW1iZXIgYnV0IGZvdW5kICVUJywgYXJnKSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmUubnVtYmVyLnRlc3QocGgudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNfcG9zaXRpdmUgPSBhcmcgPj0gMFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGgudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBhcnNlSW50KGFyZywgMTApLnRvU3RyaW5nKDIpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoYXJnLCAxMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBKU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIHBoLndpZHRoID8gcGFyc2VJbnQocGgud2lkdGgpIDogMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2UnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGgucHJlY2lzaW9uID8gcGFyc2VGbG9hdChhcmcpLnRvRXhwb25lbnRpYWwocGgucHJlY2lzaW9uKSA6IHBhcnNlRmxvYXQoYXJnKS50b0V4cG9uZW50aWFsKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGgucHJlY2lzaW9uID8gcGFyc2VGbG9hdChhcmcpLnRvRml4ZWQocGgucHJlY2lzaW9uKSA6IHBhcnNlRmxvYXQoYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwaC5wcmVjaXNpb24gPyBTdHJpbmcoTnVtYmVyKGFyZy50b1ByZWNpc2lvbihwaC5wcmVjaXNpb24pKSkgOiBwYXJzZUZsb2F0KGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ28nOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBhcnNlSW50KGFyZywgMTApID4+PiAwKS50b1N0cmluZyg4KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBTdHJpbmcoYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBoLnByZWNpc2lvbiA/IGFyZy5zdWJzdHJpbmcoMCwgcGgucHJlY2lzaW9uKSA6IGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gU3RyaW5nKCEhYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gKHBoLnByZWNpc2lvbiA/IGFyZy5zdWJzdHJpbmcoMCwgcGgucHJlY2lzaW9uKSA6IGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBhcnNlSW50KGFyZywgMTApID4+PiAwXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd2JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy52YWx1ZU9mKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwYXJzZUludChhcmcsIDEwKSA+Pj4gMCkudG9TdHJpbmcoMTYpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdYJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwYXJzZUludChhcmcsIDEwKSA+Pj4gMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZS5qc29uLnRlc3QocGgudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IGFyZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlLm51bWJlci50ZXN0KHBoLnR5cGUpICYmICghaXNfcG9zaXRpdmUgfHwgcGguc2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSBpc19wb3NpdGl2ZSA/ICcrJyA6ICctJ1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLnRvU3RyaW5nKCkucmVwbGFjZShyZS5zaWduLCAnJylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAnJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBhZF9jaGFyYWN0ZXIgPSBwaC5wYWRfY2hhciA/IHBoLnBhZF9jaGFyID09PSAnMCcgPyAnMCcgOiBwaC5wYWRfY2hhci5jaGFyQXQoMSkgOiAnICdcbiAgICAgICAgICAgICAgICAgICAgcGFkX2xlbmd0aCA9IHBoLndpZHRoIC0gKHNpZ24gKyBhcmcpLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICBwYWQgPSBwaC53aWR0aCA/IChwYWRfbGVuZ3RoID4gMCA/IHBhZF9jaGFyYWN0ZXIucmVwZWF0KHBhZF9sZW5ndGgpIDogJycpIDogJydcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IHBoLmFsaWduID8gc2lnbiArIGFyZyArIHBhZCA6IChwYWRfY2hhcmFjdGVyID09PSAnMCcgPyBzaWduICsgcGFkICsgYXJnIDogcGFkICsgc2lnbiArIGFyZylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dFxuICAgIH1cblxuICAgIHZhciBzcHJpbnRmX2NhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gICAgZnVuY3Rpb24gc3ByaW50Zl9wYXJzZShmbXQpIHtcbiAgICAgICAgaWYgKHNwcmludGZfY2FjaGVbZm10XSkge1xuICAgICAgICAgICAgcmV0dXJuIHNwcmludGZfY2FjaGVbZm10XVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9mbXQgPSBmbXQsIG1hdGNoLCBwYXJzZV90cmVlID0gW10sIGFyZ19uYW1lcyA9IDBcbiAgICAgICAgd2hpbGUgKF9mbXQpIHtcbiAgICAgICAgICAgIGlmICgobWF0Y2ggPSByZS50ZXh0LmV4ZWMoX2ZtdCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZS5wdXNoKG1hdGNoWzBdKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKG1hdGNoID0gcmUubW9kdWxvLmV4ZWMoX2ZtdCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZS5wdXNoKCclJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChtYXRjaCA9IHJlLnBsYWNlaG9sZGVyLmV4ZWMoX2ZtdCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ19uYW1lcyB8PSAxXG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZF9saXN0ID0gW10sIHJlcGxhY2VtZW50X2ZpZWxkID0gbWF0Y2hbMl0sIGZpZWxkX21hdGNoID0gW11cbiAgICAgICAgICAgICAgICAgICAgaWYgKChmaWVsZF9tYXRjaCA9IHJlLmtleS5leGVjKHJlcGxhY2VtZW50X2ZpZWxkKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2xpc3QucHVzaChmaWVsZF9tYXRjaFsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocmVwbGFjZW1lbnRfZmllbGQgPSByZXBsYWNlbWVudF9maWVsZC5zdWJzdHJpbmcoZmllbGRfbWF0Y2hbMF0ubGVuZ3RoKSkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmaWVsZF9tYXRjaCA9IHJlLmtleV9hY2Nlc3MuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2xpc3QucHVzaChmaWVsZF9tYXRjaFsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGZpZWxkX21hdGNoID0gcmUuaW5kZXhfYWNjZXNzLmV4ZWMocmVwbGFjZW1lbnRfZmllbGQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1tzcHJpbnRmXSBmYWlsZWQgdG8gcGFyc2UgbmFtZWQgYXJndW1lbnQga2V5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1tzcHJpbnRmXSBmYWlsZWQgdG8gcGFyc2UgbmFtZWQgYXJndW1lbnQga2V5JylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSA9IGZpZWxkX2xpc3RcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ19uYW1lcyB8PSAyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhcmdfbmFtZXMgPT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbc3ByaW50Zl0gbWl4aW5nIHBvc2l0aW9uYWwgYW5kIG5hbWVkIHBsYWNlaG9sZGVycyBpcyBub3QgKHlldCkgc3VwcG9ydGVkJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXJzZV90cmVlLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBtYXRjaFswXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX25vOiAgICBtYXRjaFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXM6ICAgICAgICBtYXRjaFsyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ246ICAgICAgICBtYXRjaFszXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZF9jaGFyOiAgICBtYXRjaFs0XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAgICAgICBtYXRjaFs1XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAgICAgICBtYXRjaFs2XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbjogICBtYXRjaFs3XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICAgICAgICBtYXRjaFs4XVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gdW5leHBlY3RlZCBwbGFjZWhvbGRlcicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZm10ID0gX2ZtdC5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcHJpbnRmX2NhY2hlW2ZtdF0gPSBwYXJzZV90cmVlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZXhwb3J0IHRvIGVpdGhlciBicm93c2VyIG9yIG5vZGUuanNcbiAgICAgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBxdW90ZS1wcm9wcyAqL1xuICAgIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgZXhwb3J0c1snc3ByaW50ZiddID0gc3ByaW50ZlxuICAgICAgICBleHBvcnRzWyd2c3ByaW50ZiddID0gdnNwcmludGZcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHdpbmRvd1snc3ByaW50ZiddID0gc3ByaW50ZlxuICAgICAgICB3aW5kb3dbJ3ZzcHJpbnRmJ10gPSB2c3ByaW50ZlxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pIHtcbiAgICAgICAgICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAnc3ByaW50Zic6IHNwcmludGYsXG4gICAgICAgICAgICAgICAgICAgICd2c3ByaW50Zic6IHZzcHJpbnRmXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlIHF1b3RlLXByb3BzICovXG59KCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiIsImNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSByZXF1aXJlKCdldmVudHMnKVxuY29uc3QgU1RSRUFNX0RFU1RST1lFRCA9IG5ldyBFcnJvcignU3RyZWFtIHdhcyBkZXN0cm95ZWQnKVxuY29uc3QgUFJFTUFUVVJFX0NMT1NFID0gbmV3IEVycm9yKCdQcmVtYXR1cmUgY2xvc2UnKVxuXG5jb25zdCBxdWV1ZVRpY2sgPSByZXF1aXJlKCdxdWV1ZS10aWNrJylcbmNvbnN0IEZJRk8gPSByZXF1aXJlKCdmYXN0LWZpZm8nKVxuY29uc3QgVGV4dERlY29kZXIgPSByZXF1aXJlKCd0ZXh0LWRlY29kZXInKVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1tdWx0aS1zcGFjZXMgKi9cblxuLy8gMjkgYml0cyB1c2VkIHRvdGFsICg0IGZyb20gc2hhcmVkLCAxNCBmcm9tIHJlYWQsIGFuZCAxMSBmcm9tIHdyaXRlKVxuY29uc3QgTUFYID0gKCgxIDw8IDI5KSAtIDEpXG5cbi8vIFNoYXJlZCBzdGF0ZVxuY29uc3QgT1BFTklORyAgICAgICA9IDBiMDAwMVxuY29uc3QgUFJFREVTVFJPWUlORyA9IDBiMDAxMFxuY29uc3QgREVTVFJPWUlORyAgICA9IDBiMDEwMFxuY29uc3QgREVTVFJPWUVEICAgICA9IDBiMTAwMFxuXG5jb25zdCBOT1RfT1BFTklORyA9IE1BWCBeIE9QRU5JTkdcbmNvbnN0IE5PVF9QUkVERVNUUk9ZSU5HID0gTUFYIF4gUFJFREVTVFJPWUlOR1xuXG4vLyBSZWFkIHN0YXRlICg0IGJpdCBvZmZzZXQgZnJvbSBzaGFyZWQgc3RhdGUpXG5jb25zdCBSRUFEX0FDVElWRSAgICAgICAgICAgPSAwYjAwMDAwMDAwMDAwMDAxIDw8IDRcbmNvbnN0IFJFQURfVVBEQVRJTkcgICAgICAgICA9IDBiMDAwMDAwMDAwMDAwMTAgPDwgNFxuY29uc3QgUkVBRF9QUklNQVJZICAgICAgICAgID0gMGIwMDAwMDAwMDAwMDEwMCA8PCA0XG5jb25zdCBSRUFEX1FVRVVFRCAgICAgICAgICAgPSAwYjAwMDAwMDAwMDAxMDAwIDw8IDRcbmNvbnN0IFJFQURfUkVTVU1FRCAgICAgICAgICA9IDBiMDAwMDAwMDAwMTAwMDAgPDwgNFxuY29uc3QgUkVBRF9QSVBFX0RSQUlORUQgICAgID0gMGIwMDAwMDAwMDEwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0VORElORyAgICAgICAgICAgPSAwYjAwMDAwMDAxMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRU1JVF9EQVRBICAgICAgICA9IDBiMDAwMDAwMTAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9FTUlUX1JFQURBQkxFICAgID0gMGIwMDAwMDEwMDAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0VNSVRURURfUkVBREFCTEUgPSAwYjAwMDAxMDAwMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRE9ORSAgICAgICAgICAgICA9IDBiMDAwMTAwMDAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9ORVhUX1RJQ0sgICAgICAgID0gMGIwMDEwMDAwMDAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX05FRURTX1BVU0ggICAgICAgPSAwYjAxMDAwMDAwMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfUkVBRF9BSEVBRCAgICAgICA9IDBiMTAwMDAwMDAwMDAwMDAgPDwgNFxuXG4vLyBDb21iaW5lZCByZWFkIHN0YXRlXG5jb25zdCBSRUFEX0ZMT1dJTkcgPSBSRUFEX1JFU1VNRUQgfCBSRUFEX1BJUEVfRFJBSU5FRFxuY29uc3QgUkVBRF9BQ1RJVkVfQU5EX05FRURTX1BVU0ggPSBSRUFEX0FDVElWRSB8IFJFQURfTkVFRFNfUFVTSFxuY29uc3QgUkVBRF9QUklNQVJZX0FORF9BQ1RJVkUgPSBSRUFEX1BSSU1BUlkgfCBSRUFEX0FDVElWRVxuY29uc3QgUkVBRF9FTUlUX1JFQURBQkxFX0FORF9RVUVVRUQgPSBSRUFEX0VNSVRfUkVBREFCTEUgfCBSRUFEX1FVRVVFRFxuY29uc3QgUkVBRF9SRVNVTUVEX1JFQURfQUhFQUQgPSBSRUFEX1JFU1VNRUQgfCBSRUFEX1JFQURfQUhFQURcblxuY29uc3QgUkVBRF9OT1RfQUNUSVZFICAgICAgICAgICAgID0gTUFYIF4gUkVBRF9BQ1RJVkVcbmNvbnN0IFJFQURfTk9OX1BSSU1BUlkgICAgICAgICAgICA9IE1BWCBeIFJFQURfUFJJTUFSWVxuY29uc3QgUkVBRF9OT05fUFJJTUFSWV9BTkRfUFVTSEVEID0gTUFYIF4gKFJFQURfUFJJTUFSWSB8IFJFQURfTkVFRFNfUFVTSClcbmNvbnN0IFJFQURfUFVTSEVEICAgICAgICAgICAgICAgICA9IE1BWCBeIFJFQURfTkVFRFNfUFVTSFxuY29uc3QgUkVBRF9QQVVTRUQgICAgICAgICAgICAgICAgID0gTUFYIF4gUkVBRF9SRVNVTUVEXG5jb25zdCBSRUFEX05PVF9RVUVVRUQgICAgICAgICAgICAgPSBNQVggXiAoUkVBRF9RVUVVRUQgfCBSRUFEX0VNSVRURURfUkVBREFCTEUpXG5jb25zdCBSRUFEX05PVF9FTkRJTkcgICAgICAgICAgICAgPSBNQVggXiBSRUFEX0VORElOR1xuY29uc3QgUkVBRF9QSVBFX05PVF9EUkFJTkVEICAgICAgID0gTUFYIF4gUkVBRF9GTE9XSU5HXG5jb25zdCBSRUFEX05PVF9ORVhUX1RJQ0sgICAgICAgICAgPSBNQVggXiBSRUFEX05FWFRfVElDS1xuY29uc3QgUkVBRF9OT1RfVVBEQVRJTkcgICAgICAgICAgID0gTUFYIF4gUkVBRF9VUERBVElOR1xuY29uc3QgUkVBRF9OT19SRUFEX0FIRUFEICAgICAgICAgID0gTUFYIF4gUkVBRF9SRUFEX0FIRUFEXG5jb25zdCBSRUFEX1BBVVNFRF9OT19SRUFEX0FIRUFEICAgPSBNQVggXiBSRUFEX1JFU1VNRURfUkVBRF9BSEVBRFxuXG4vLyBXcml0ZSBzdGF0ZSAoMTggYml0IG9mZnNldCwgNCBiaXQgb2Zmc2V0IGZyb20gc2hhcmVkIHN0YXRlIGFuZCAxNCBmcm9tIHJlYWQgc3RhdGUpXG5jb25zdCBXUklURV9BQ1RJVkUgICAgID0gMGIwMDAwMDAwMDAwMSA8PCAxOFxuY29uc3QgV1JJVEVfVVBEQVRJTkcgICA9IDBiMDAwMDAwMDAwMTAgPDwgMThcbmNvbnN0IFdSSVRFX1BSSU1BUlkgICAgPSAwYjAwMDAwMDAwMTAwIDw8IDE4XG5jb25zdCBXUklURV9RVUVVRUQgICAgID0gMGIwMDAwMDAwMTAwMCA8PCAxOFxuY29uc3QgV1JJVEVfVU5EUkFJTkVEICA9IDBiMDAwMDAwMTAwMDAgPDwgMThcbmNvbnN0IFdSSVRFX0RPTkUgICAgICAgPSAwYjAwMDAwMTAwMDAwIDw8IDE4XG5jb25zdCBXUklURV9FTUlUX0RSQUlOID0gMGIwMDAwMTAwMDAwMCA8PCAxOFxuY29uc3QgV1JJVEVfTkVYVF9USUNLICA9IDBiMDAwMTAwMDAwMDAgPDwgMThcbmNvbnN0IFdSSVRFX1dSSVRJTkcgICAgPSAwYjAwMTAwMDAwMDAwIDw8IDE4XG5jb25zdCBXUklURV9GSU5JU0hJTkcgID0gMGIwMTAwMDAwMDAwMCA8PCAxOFxuY29uc3QgV1JJVEVfQ09SS0VEICAgICA9IDBiMTAwMDAwMDAwMDAgPDwgMThcblxuY29uc3QgV1JJVEVfTk9UX0FDVElWRSAgICA9IE1BWCBeIChXUklURV9BQ1RJVkUgfCBXUklURV9XUklUSU5HKVxuY29uc3QgV1JJVEVfTk9OX1BSSU1BUlkgICA9IE1BWCBeIFdSSVRFX1BSSU1BUllcbmNvbnN0IFdSSVRFX05PVF9GSU5JU0hJTkcgPSBNQVggXiBXUklURV9GSU5JU0hJTkdcbmNvbnN0IFdSSVRFX0RSQUlORUQgICAgICAgPSBNQVggXiBXUklURV9VTkRSQUlORURcbmNvbnN0IFdSSVRFX05PVF9RVUVVRUQgICAgPSBNQVggXiBXUklURV9RVUVVRURcbmNvbnN0IFdSSVRFX05PVF9ORVhUX1RJQ0sgPSBNQVggXiBXUklURV9ORVhUX1RJQ0tcbmNvbnN0IFdSSVRFX05PVF9VUERBVElORyAgPSBNQVggXiBXUklURV9VUERBVElOR1xuY29uc3QgV1JJVEVfTk9UX0NPUktFRCAgICA9IE1BWCBeIFdSSVRFX0NPUktFRFxuXG4vLyBDb21iaW5lZCBzaGFyZWQgc3RhdGVcbmNvbnN0IEFDVElWRSA9IFJFQURfQUNUSVZFIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBOT1RfQUNUSVZFID0gTUFYIF4gQUNUSVZFXG5jb25zdCBET05FID0gUkVBRF9ET05FIHwgV1JJVEVfRE9ORVxuY29uc3QgREVTVFJPWV9TVEFUVVMgPSBERVNUUk9ZSU5HIHwgREVTVFJPWUVEIHwgUFJFREVTVFJPWUlOR1xuY29uc3QgT1BFTl9TVEFUVVMgPSBERVNUUk9ZX1NUQVRVUyB8IE9QRU5JTkdcbmNvbnN0IEFVVE9fREVTVFJPWSA9IERFU1RST1lfU1RBVFVTIHwgRE9ORVxuY29uc3QgTk9OX1BSSU1BUlkgPSBXUklURV9OT05fUFJJTUFSWSAmIFJFQURfTk9OX1BSSU1BUllcbmNvbnN0IEFDVElWRV9PUl9USUNLSU5HID0gV1JJVEVfTkVYVF9USUNLIHwgUkVBRF9ORVhUX1RJQ0tcbmNvbnN0IFRJQ0tJTkcgPSBBQ1RJVkVfT1JfVElDS0lORyAmIE5PVF9BQ1RJVkVcbmNvbnN0IElTX09QRU5JTkcgPSBPUEVOX1NUQVRVUyB8IFRJQ0tJTkdcblxuLy8gQ29tYmluZWQgc2hhcmVkIHN0YXRlIGFuZCByZWFkIHN0YXRlXG5jb25zdCBSRUFEX1BSSU1BUllfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VORElORyB8IFJFQURfRE9ORVxuY29uc3QgUkVBRF9TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFJFQURfRE9ORSB8IFJFQURfUVVFVUVEXG5jb25zdCBSRUFEX0VORElOR19TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFJFQURfRU5ESU5HIHwgUkVBRF9RVUVVRURcbmNvbnN0IFJFQURfUkVBREFCTEVfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VNSVRfUkVBREFCTEUgfCBSRUFEX1FVRVVFRCB8IFJFQURfRU1JVFRFRF9SRUFEQUJMRVxuY29uc3QgU0hPVUxEX05PVF9SRUFEID0gT1BFTl9TVEFUVVMgfCBSRUFEX0FDVElWRSB8IFJFQURfRU5ESU5HIHwgUkVBRF9ET05FIHwgUkVBRF9ORUVEU19QVVNIIHwgUkVBRF9SRUFEX0FIRUFEXG5jb25zdCBSRUFEX0JBQ0tQUkVTU1VSRV9TVEFUVVMgPSBERVNUUk9ZX1NUQVRVUyB8IFJFQURfRU5ESU5HIHwgUkVBRF9ET05FXG5jb25zdCBSRUFEX1VQREFURV9TWU5DX1NUQVRVUyA9IFJFQURfVVBEQVRJTkcgfCBPUEVOX1NUQVRVUyB8IFJFQURfTkVYVF9USUNLIHwgUkVBRF9QUklNQVJZXG5cbi8vIENvbWJpbmVkIHdyaXRlIHN0YXRlXG5jb25zdCBXUklURV9QUklNQVJZX1NUQVRVUyA9IE9QRU5fU1RBVFVTIHwgV1JJVEVfRklOSVNISU5HIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfUVVFVUVEX0FORF9VTkRSQUlORUQgPSBXUklURV9RVUVVRUQgfCBXUklURV9VTkRSQUlORURcbmNvbnN0IFdSSVRFX1FVRVVFRF9BTkRfQUNUSVZFID0gV1JJVEVfUVVFVUVEIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBXUklURV9EUkFJTl9TVEFUVVMgPSBXUklURV9RVUVVRUQgfCBXUklURV9VTkRSQUlORUQgfCBPUEVOX1NUQVRVUyB8IFdSSVRFX0FDVElWRVxuY29uc3QgV1JJVEVfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBXUklURV9BQ1RJVkUgfCBXUklURV9RVUVVRUQgfCBXUklURV9DT1JLRURcbmNvbnN0IFdSSVRFX1BSSU1BUllfQU5EX0FDVElWRSA9IFdSSVRFX1BSSU1BUlkgfCBXUklURV9BQ1RJVkVcbmNvbnN0IFdSSVRFX0FDVElWRV9BTkRfV1JJVElORyA9IFdSSVRFX0FDVElWRSB8IFdSSVRFX1dSSVRJTkdcbmNvbnN0IFdSSVRFX0ZJTklTSElOR19TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFdSSVRFX0ZJTklTSElORyB8IFdSSVRFX1FVRVVFRF9BTkRfQUNUSVZFIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfQkFDS1BSRVNTVVJFX1NUQVRVUyA9IFdSSVRFX1VORFJBSU5FRCB8IERFU1RST1lfU1RBVFVTIHwgV1JJVEVfRklOSVNISU5HIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfVVBEQVRFX1NZTkNfU1RBVFVTID0gV1JJVEVfVVBEQVRJTkcgfCBPUEVOX1NUQVRVUyB8IFdSSVRFX05FWFRfVElDSyB8IFdSSVRFX1BSSU1BUllcblxuY29uc3QgYXN5bmNJdGVyYXRvciA9IFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFN5bWJvbCgnYXN5bmNJdGVyYXRvcicpXG5cbmNsYXNzIFdyaXRhYmxlU3RhdGUge1xuICBjb25zdHJ1Y3RvciAoc3RyZWFtLCB7IGhpZ2hXYXRlck1hcmsgPSAxNjM4NCwgbWFwID0gbnVsbCwgbWFwV3JpdGFibGUsIGJ5dGVMZW5ndGgsIGJ5dGVMZW5ndGhXcml0YWJsZSB9ID0ge30pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbVxuICAgIHRoaXMucXVldWUgPSBuZXcgRklGTygpXG4gICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFya1xuICAgIHRoaXMuYnVmZmVyZWQgPSAwXG4gICAgdGhpcy5lcnJvciA9IG51bGxcbiAgICB0aGlzLnBpcGVsaW5lID0gbnVsbFxuICAgIHRoaXMuZHJhaW5zID0gbnVsbCAvLyBpZiB3ZSBhZGQgbW9yZSBzZWxkb21seSB1c2VkIGhlbHBlcnMgd2UgbWlnaHQgdGhlbSBpbnRvIGEgc3Vib2JqZWN0IHNvIGl0cyBhIHNpbmdsZSBwdHJcbiAgICB0aGlzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoV3JpdGFibGUgfHwgYnl0ZUxlbmd0aCB8fCBkZWZhdWx0Qnl0ZUxlbmd0aFxuICAgIHRoaXMubWFwID0gbWFwV3JpdGFibGUgfHwgbWFwXG4gICAgdGhpcy5hZnRlcldyaXRlID0gYWZ0ZXJXcml0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrID0gdXBkYXRlV3JpdGVOVC5iaW5kKHRoaXMpXG4gIH1cblxuICBnZXQgZW5kZWQgKCkge1xuICAgIHJldHVybiAodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRE9ORSkgIT09IDBcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBpZiAodGhpcy5tYXAgIT09IG51bGwpIGRhdGEgPSB0aGlzLm1hcChkYXRhKVxuXG4gICAgdGhpcy5idWZmZXJlZCArPSB0aGlzLmJ5dGVMZW5ndGgoZGF0YSlcbiAgICB0aGlzLnF1ZXVlLnB1c2goZGF0YSlcblxuICAgIGlmICh0aGlzLmJ1ZmZlcmVkIDwgdGhpcy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfUVVFVUVEXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9RVUVVRURfQU5EX1VORFJBSU5FRFxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgc2hpZnQgKCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnF1ZXVlLnNoaWZ0KClcblxuICAgIHRoaXMuYnVmZmVyZWQgLT0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgaWYgKHRoaXMuYnVmZmVyZWQgPT09IDApIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfUVVFVUVEXG5cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgZW5kIChkYXRhKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB0aGlzLnN0cmVhbS5vbmNlKCdmaW5pc2gnLCBkYXRhKVxuICAgIGVsc2UgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhICE9PSBudWxsKSB0aGlzLnB1c2goZGF0YSlcbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgPSAodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHwgV1JJVEVfRklOSVNISU5HKSAmIFdSSVRFX05PTl9QUklNQVJZXG4gIH1cblxuICBhdXRvQmF0Y2ggKGRhdGEsIGNiKSB7XG4gICAgY29uc3QgYnVmZmVyID0gW11cbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgYnVmZmVyLnB1c2goZGF0YSlcbiAgICB3aGlsZSAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9TVEFUVVMpID09PSBXUklURV9RVUVVRURfQU5EX0FDVElWRSkge1xuICAgICAgYnVmZmVyLnB1c2goc3RyZWFtLl93cml0YWJsZVN0YXRlLnNoaWZ0KCkpXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgT1BFTl9TVEFUVVMpICE9PSAwKSByZXR1cm4gY2IobnVsbClcbiAgICBzdHJlYW0uX3dyaXRldihidWZmZXIsIGNiKVxuICB9XG5cbiAgdXBkYXRlICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9VUERBVElOR1xuXG4gICAgZG8ge1xuICAgICAgd2hpbGUgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfU1RBVFVTKSA9PT0gV1JJVEVfUVVFVUVEKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNoaWZ0KClcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9BQ1RJVkVfQU5EX1dSSVRJTkdcbiAgICAgICAgc3RyZWFtLl93cml0ZShkYXRhLCB0aGlzLmFmdGVyV3JpdGUpXG4gICAgICB9XG5cbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1BSSU1BUllfQU5EX0FDVElWRSkgPT09IDApIHRoaXMudXBkYXRlTm9uUHJpbWFyeSgpXG4gICAgfSB3aGlsZSAodGhpcy5jb250aW51ZVVwZGF0ZSgpID09PSB0cnVlKVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfVVBEQVRJTkdcbiAgfVxuXG4gIHVwZGF0ZU5vblByaW1hcnkgKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9GSU5JU0hJTkdfU1RBVFVTKSA9PT0gV1JJVEVfRklOSVNISU5HKSB7XG4gICAgICBzdHJlYW0uX2R1cGxleFN0YXRlID0gKHN0cmVhbS5fZHVwbGV4U3RhdGUgfCBXUklURV9BQ1RJVkUpICYgV1JJVEVfTk9UX0ZJTklTSElOR1xuICAgICAgc3RyZWFtLl9maW5hbChhZnRlckZpbmFsLmJpbmQodGhpcykpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBERVNUUk9ZX1NUQVRVUykgPT09IERFU1RST1lJTkcpIHtcbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIEFDVElWRV9PUl9USUNLSU5HKSA9PT0gMCkge1xuICAgICAgICBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IEFDVElWRVxuICAgICAgICBzdHJlYW0uX2Rlc3Ryb3koYWZ0ZXJEZXN0cm95LmJpbmQodGhpcykpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBJU19PUEVOSU5HKSA9PT0gT1BFTklORykge1xuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgQUNUSVZFKSAmIE5PVF9PUEVOSU5HXG4gICAgICBzdHJlYW0uX29wZW4oYWZ0ZXJPcGVuLmJpbmQodGhpcykpXG4gICAgfVxuICB9XG5cbiAgY29udGludWVVcGRhdGUgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfTkVYVF9USUNLKSA9PT0gMCkgcmV0dXJuIGZhbHNlXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICY9IFdSSVRFX05PVF9ORVhUX1RJQ0tcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdXBkYXRlQ2FsbGJhY2sgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfVVBEQVRFX1NZTkNfU1RBVFVTKSA9PT0gV1JJVEVfUFJJTUFSWSkgdGhpcy51cGRhdGUoKVxuICAgIGVsc2UgdGhpcy51cGRhdGVOZXh0VGljaygpXG4gIH1cblxuICB1cGRhdGVOZXh0VGljayAoKSB7XG4gICAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9ORVhUX1RJQ0spICE9PSAwKSByZXR1cm5cbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfTkVYVF9USUNLXG4gICAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9VUERBVElORykgPT09IDApIHF1ZXVlVGljayh0aGlzLmFmdGVyVXBkYXRlTmV4dFRpY2spXG4gIH1cbn1cblxuY2xhc3MgUmVhZGFibGVTdGF0ZSB7XG4gIGNvbnN0cnVjdG9yIChzdHJlYW0sIHsgaGlnaFdhdGVyTWFyayA9IDE2Mzg0LCBtYXAgPSBudWxsLCBtYXBSZWFkYWJsZSwgYnl0ZUxlbmd0aCwgYnl0ZUxlbmd0aFJlYWRhYmxlIH0gPSB7fSkge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtXG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBGSUZPKClcbiAgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrID09PSAwID8gMSA6IGhpZ2hXYXRlck1hcmtcbiAgICB0aGlzLmJ1ZmZlcmVkID0gMFxuICAgIHRoaXMucmVhZEFoZWFkID0gaGlnaFdhdGVyTWFyayA+IDBcbiAgICB0aGlzLmVycm9yID0gbnVsbFxuICAgIHRoaXMucGlwZWxpbmUgPSBudWxsXG4gICAgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFJlYWRhYmxlIHx8IGJ5dGVMZW5ndGggfHwgZGVmYXVsdEJ5dGVMZW5ndGhcbiAgICB0aGlzLm1hcCA9IG1hcFJlYWRhYmxlIHx8IG1hcFxuICAgIHRoaXMucGlwZVRvID0gbnVsbFxuICAgIHRoaXMuYWZ0ZXJSZWFkID0gYWZ0ZXJSZWFkLmJpbmQodGhpcylcbiAgICB0aGlzLmFmdGVyVXBkYXRlTmV4dFRpY2sgPSB1cGRhdGVSZWFkTlQuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0IGVuZGVkICgpIHtcbiAgICByZXR1cm4gKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfRE9ORSkgIT09IDBcbiAgfVxuXG4gIHBpcGUgKHBpcGVUbywgY2IpIHtcbiAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwpIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgcGlwZSB0byBvbmUgZGVzdGluYXRpb24nKVxuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbnVsbFxuXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfUElQRV9EUkFJTkVEXG4gICAgdGhpcy5waXBlVG8gPSBwaXBlVG9cbiAgICB0aGlzLnBpcGVsaW5lID0gbmV3IFBpcGVsaW5lKHRoaXMuc3RyZWFtLCBwaXBlVG8sIGNiKVxuXG4gICAgaWYgKGNiKSB0aGlzLnN0cmVhbS5vbignZXJyb3InLCBub29wKSAvLyBXZSBhbHJlYWR5IGVycm9yIGhhbmRsZSB0aGlzIHNvIHN1cHJlc3MgY3Jhc2hlc1xuXG4gICAgaWYgKGlzU3RyZWFteChwaXBlVG8pKSB7XG4gICAgICBwaXBlVG8uX3dyaXRhYmxlU3RhdGUucGlwZWxpbmUgPSB0aGlzLnBpcGVsaW5lXG4gICAgICBpZiAoY2IpIHBpcGVUby5vbignZXJyb3InLCBub29wKSAvLyBXZSBhbHJlYWR5IGVycm9yIGhhbmRsZSB0aGlzIHNvIHN1cHJlc3MgY3Jhc2hlc1xuICAgICAgcGlwZVRvLm9uKCdmaW5pc2gnLCB0aGlzLnBpcGVsaW5lLmZpbmlzaGVkLmJpbmQodGhpcy5waXBlbGluZSkpIC8vIFRPRE86IGp1c3QgY2FsbCBmaW5pc2hlZCBmcm9tIHBpcGVUbyBpdHNlbGZcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb25lcnJvciA9IHRoaXMucGlwZWxpbmUuZG9uZS5iaW5kKHRoaXMucGlwZWxpbmUsIHBpcGVUbylcbiAgICAgIGNvbnN0IG9uY2xvc2UgPSB0aGlzLnBpcGVsaW5lLmRvbmUuYmluZCh0aGlzLnBpcGVsaW5lLCBwaXBlVG8sIG51bGwpIC8vIG9uY2xvc2UgaGFzIGEgd2VpcmQgYm9vbCBhcmdcbiAgICAgIHBpcGVUby5vbignZXJyb3InLCBvbmVycm9yKVxuICAgICAgcGlwZVRvLm9uKCdjbG9zZScsIG9uY2xvc2UpXG4gICAgICBwaXBlVG8ub24oJ2ZpbmlzaCcsIHRoaXMucGlwZWxpbmUuZmluaXNoZWQuYmluZCh0aGlzLnBpcGVsaW5lKSlcbiAgICB9XG5cbiAgICBwaXBlVG8ub24oJ2RyYWluJywgYWZ0ZXJEcmFpbi5iaW5kKHRoaXMpKVxuICAgIHRoaXMuc3RyZWFtLmVtaXQoJ3BpcGluZycsIHBpcGVUbylcbiAgICBwaXBlVG8uZW1pdCgncGlwZScsIHRoaXMuc3RyZWFtKVxuICB9XG5cbiAgcHVzaCAoZGF0YSkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gMFxuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgUkVBRF9FTkRJTkcpICYgUkVBRF9OT05fUFJJTUFSWV9BTkRfUFVTSEVEXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXAgIT09IG51bGwpIHtcbiAgICAgIGRhdGEgPSB0aGlzLm1hcChkYXRhKVxuICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0aGlzLmJ1ZmZlcmVkIDwgdGhpcy5oaWdoV2F0ZXJNYXJrXG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXJlZCArPSB0aGlzLmJ5dGVMZW5ndGgoZGF0YSlcbiAgICB0aGlzLnF1ZXVlLnB1c2goZGF0YSlcblxuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFJFQURfUVVFVUVEKSAmIFJFQURfUFVTSEVEXG5cbiAgICByZXR1cm4gdGhpcy5idWZmZXJlZCA8IHRoaXMuaGlnaFdhdGVyTWFya1xuICB9XG5cbiAgc2hpZnQgKCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnF1ZXVlLnNoaWZ0KClcblxuICAgIHRoaXMuYnVmZmVyZWQgLT0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgaWYgKHRoaXMuYnVmZmVyZWQgPT09IDApIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PVF9RVUVVRURcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgdW5zaGlmdCAoZGF0YSkge1xuICAgIGNvbnN0IHBlbmRpbmcgPSBbdGhpcy5tYXAgIT09IG51bGwgPyB0aGlzLm1hcChkYXRhKSA6IGRhdGFdXG4gICAgd2hpbGUgKHRoaXMuYnVmZmVyZWQgPiAwKSBwZW5kaW5nLnB1c2godGhpcy5zaGlmdCgpKVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwZW5kaW5nLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3QgZGF0YSA9IHBlbmRpbmdbaV1cbiAgICAgIHRoaXMuYnVmZmVyZWQgKz0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgICB0aGlzLnF1ZXVlLnB1c2goZGF0YSlcbiAgICB9XG5cbiAgICB0aGlzLnB1c2gocGVuZGluZ1twZW5kaW5nLmxlbmd0aCAtIDFdKVxuICB9XG5cbiAgcmVhZCAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfU1RBVFVTKSA9PT0gUkVBRF9RVUVVRUQpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNoaWZ0KClcbiAgICAgIGlmICh0aGlzLnBpcGVUbyAhPT0gbnVsbCAmJiB0aGlzLnBpcGVUby53cml0ZShkYXRhKSA9PT0gZmFsc2UpIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9QSVBFX05PVF9EUkFJTkVEXG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0VNSVRfREFUQSkgIT09IDApIHN0cmVhbS5lbWl0KCdkYXRhJywgZGF0YSlcbiAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZEFoZWFkID09PSBmYWxzZSkge1xuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1JFQURfQUhFQURcbiAgICAgIHRoaXMudXBkYXRlTmV4dFRpY2soKVxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBkcmFpbiAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHdoaWxlICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfU1RBVFVTKSA9PT0gUkVBRF9RVUVVRUQgJiYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0ZMT1dJTkcpICE9PSAwKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5zaGlmdCgpXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwgJiYgdGhpcy5waXBlVG8ud3JpdGUoZGF0YSkgPT09IGZhbHNlKSBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfUElQRV9OT1RfRFJBSU5FRFxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTUlUX0RBVEEpICE9PSAwKSBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1VQREFUSU5HXG5cbiAgICBkbyB7XG4gICAgICB0aGlzLmRyYWluKClcblxuICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyZWQgPCB0aGlzLmhpZ2hXYXRlck1hcmsgJiYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBTSE9VTERfTk9UX1JFQUQpID09PSBSRUFEX1JFQURfQUhFQUQpIHtcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX0FDVElWRV9BTkRfTkVFRFNfUFVTSFxuICAgICAgICBzdHJlYW0uX3JlYWQodGhpcy5hZnRlclJlYWQpXG4gICAgICAgIHRoaXMuZHJhaW4oKVxuICAgICAgfVxuXG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1JFQURBQkxFX1NUQVRVUykgPT09IFJFQURfRU1JVF9SRUFEQUJMRV9BTkRfUVVFVUVEKSB7XG4gICAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9FTUlUVEVEX1JFQURBQkxFXG4gICAgICAgIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpXG4gICAgICB9XG5cbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfUFJJTUFSWV9BTkRfQUNUSVZFKSA9PT0gMCkgdGhpcy51cGRhdGVOb25QcmltYXJ5KClcbiAgICB9IHdoaWxlICh0aGlzLmNvbnRpbnVlVXBkYXRlKCkgPT09IHRydWUpXG5cbiAgICBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfTk9UX1VQREFUSU5HXG4gIH1cblxuICB1cGRhdGVOb25QcmltYXJ5ICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTkRJTkdfU1RBVFVTKSA9PT0gUkVBRF9FTkRJTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFJFQURfRE9ORSkgJiBSRUFEX05PVF9FTkRJTkdcbiAgICAgIHN0cmVhbS5lbWl0KCdlbmQnKVxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgQVVUT19ERVNUUk9ZKSA9PT0gRE9ORSkgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBERVNUUk9ZSU5HXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwpIHRoaXMucGlwZVRvLmVuZCgpXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSBERVNUUk9ZSU5HKSB7XG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBBQ1RJVkVfT1JfVElDS0lORykgPT09IDApIHtcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBBQ1RJVkVcbiAgICAgICAgc3RyZWFtLl9kZXN0cm95KGFmdGVyRGVzdHJveS5iaW5kKHRoaXMpKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgSVNfT1BFTklORykgPT09IE9QRU5JTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IEFDVElWRSkgJiBOT1RfT1BFTklOR1xuICAgICAgc3RyZWFtLl9vcGVuKGFmdGVyT3Blbi5iaW5kKHRoaXMpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnRpbnVlVXBkYXRlICgpIHtcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfTkVYVF9USUNLKSA9PT0gMCkgcmV0dXJuIGZhbHNlXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfTk9UX05FWFRfVElDS1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICB1cGRhdGVDYWxsYmFjayAoKSB7XG4gICAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1VQREFURV9TWU5DX1NUQVRVUykgPT09IFJFQURfUFJJTUFSWSkgdGhpcy51cGRhdGUoKVxuICAgIGVsc2UgdGhpcy51cGRhdGVOZXh0VGljaygpXG4gIH1cblxuICB1cGRhdGVOZXh0VGljayAoKSB7XG4gICAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX05FWFRfVElDSykgIT09IDApIHJldHVyblxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX05FWFRfVElDS1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9VUERBVElORykgPT09IDApIHF1ZXVlVGljayh0aGlzLmFmdGVyVXBkYXRlTmV4dFRpY2spXG4gIH1cbn1cblxuY2xhc3MgVHJhbnNmb3JtU3RhdGUge1xuICBjb25zdHJ1Y3RvciAoc3RyZWFtKSB7XG4gICAgdGhpcy5kYXRhID0gbnVsbFxuICAgIHRoaXMuYWZ0ZXJUcmFuc2Zvcm0gPSBhZnRlclRyYW5zZm9ybS5iaW5kKHN0cmVhbSlcbiAgICB0aGlzLmFmdGVyRmluYWwgPSBudWxsXG4gIH1cbn1cblxuY2xhc3MgUGlwZWxpbmUge1xuICBjb25zdHJ1Y3RvciAoc3JjLCBkc3QsIGNiKSB7XG4gICAgdGhpcy5mcm9tID0gc3JjXG4gICAgdGhpcy50byA9IGRzdFxuICAgIHRoaXMuYWZ0ZXJQaXBlID0gY2JcbiAgICB0aGlzLmVycm9yID0gbnVsbFxuICAgIHRoaXMucGlwZVRvRmluaXNoZWQgPSBmYWxzZVxuICB9XG5cbiAgZmluaXNoZWQgKCkge1xuICAgIHRoaXMucGlwZVRvRmluaXNoZWQgPSB0cnVlXG4gIH1cblxuICBkb25lIChzdHJlYW0sIGVycikge1xuICAgIGlmIChlcnIpIHRoaXMuZXJyb3IgPSBlcnJcblxuICAgIGlmIChzdHJlYW0gPT09IHRoaXMudG8pIHtcbiAgICAgIHRoaXMudG8gPSBudWxsXG5cbiAgICAgIGlmICh0aGlzLmZyb20gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCh0aGlzLmZyb20uX2R1cGxleFN0YXRlICYgUkVBRF9ET05FKSA9PT0gMCB8fCAhdGhpcy5waXBlVG9GaW5pc2hlZCkge1xuICAgICAgICAgIHRoaXMuZnJvbS5kZXN0cm95KHRoaXMuZXJyb3IgfHwgbmV3IEVycm9yKCdXcml0YWJsZSBzdHJlYW0gY2xvc2VkIHByZW1hdHVyZWx5JykpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0cmVhbSA9PT0gdGhpcy5mcm9tKSB7XG4gICAgICB0aGlzLmZyb20gPSBudWxsXG5cbiAgICAgIGlmICh0aGlzLnRvICE9PSBudWxsKSB7XG4gICAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfRE9ORSkgPT09IDApIHtcbiAgICAgICAgICB0aGlzLnRvLmRlc3Ryb3kodGhpcy5lcnJvciB8fCBuZXcgRXJyb3IoJ1JlYWRhYmxlIHN0cmVhbSBjbG9zZWQgYmVmb3JlIGVuZGluZycpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFmdGVyUGlwZSAhPT0gbnVsbCkgdGhpcy5hZnRlclBpcGUodGhpcy5lcnJvcilcbiAgICB0aGlzLnRvID0gdGhpcy5mcm9tID0gdGhpcy5hZnRlclBpcGUgPSBudWxsXG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJEcmFpbiAoKSB7XG4gIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1BJUEVfRFJBSU5FRFxuICB0aGlzLnVwZGF0ZUNhbGxiYWNrKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJGaW5hbCAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG4gIGlmIChlcnIpIHN0cmVhbS5kZXN0cm95KGVycilcbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSAwKSB7XG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9ET05FXG4gICAgc3RyZWFtLmVtaXQoJ2ZpbmlzaCcpXG4gIH1cbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgQVVUT19ERVNUUk9ZKSA9PT0gRE9ORSkge1xuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gREVTVFJPWUlOR1xuICB9XG5cbiAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfQUNUSVZFXG5cbiAgLy8gbm8gbmVlZCB0byB3YWl0IHRoZSBleHRyYSB0aWNrIGhlcmUsIHNvIHdlIHNob3J0IGNpcmN1aXQgdGhhdFxuICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9VUERBVElORykgPT09IDApIHRoaXMudXBkYXRlKClcbiAgZWxzZSB0aGlzLnVwZGF0ZU5leHRUaWNrKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJEZXN0cm95IChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoIWVyciAmJiB0aGlzLmVycm9yICE9PSBTVFJFQU1fREVTVFJPWUVEKSBlcnIgPSB0aGlzLmVycm9yXG4gIGlmIChlcnIpIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycilcbiAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBERVNUUk9ZRURcbiAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcblxuICBjb25zdCBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuXG4gIGlmIChycyAhPT0gbnVsbCAmJiBycy5waXBlbGluZSAhPT0gbnVsbCkgcnMucGlwZWxpbmUuZG9uZShzdHJlYW0sIGVycilcblxuICBpZiAod3MgIT09IG51bGwpIHtcbiAgICB3aGlsZSAod3MuZHJhaW5zICE9PSBudWxsICYmIHdzLmRyYWlucy5sZW5ndGggPiAwKSB3cy5kcmFpbnMuc2hpZnQoKS5yZXNvbHZlKGZhbHNlKVxuICAgIGlmICh3cy5waXBlbGluZSAhPT0gbnVsbCkgd3MucGlwZWxpbmUuZG9uZShzdHJlYW0sIGVycilcbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlIChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoZXJyKSBzdHJlYW0uZGVzdHJveShlcnIpXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX0FDVElWRVxuXG4gIGlmICh0aGlzLmRyYWlucyAhPT0gbnVsbCkgdGlja0RyYWlucyh0aGlzLmRyYWlucylcblxuICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9EUkFJTl9TVEFUVVMpID09PSBXUklURV9VTkRSQUlORUQpIHtcbiAgICBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFdSSVRFX0RSQUlORURcbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9FTUlUX0RSQUlOKSA9PT0gV1JJVEVfRU1JVF9EUkFJTikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2RyYWluJylcbiAgICB9XG4gIH1cblxuICB0aGlzLnVwZGF0ZUNhbGxiYWNrKClcbn1cblxuZnVuY3Rpb24gYWZ0ZXJSZWFkIChlcnIpIHtcbiAgaWYgKGVycikgdGhpcy5zdHJlYW0uZGVzdHJveShlcnIpXG4gIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PVF9BQ1RJVkVcbiAgaWYgKHRoaXMucmVhZEFoZWFkID09PSBmYWxzZSAmJiAodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9SRVNVTUVEKSA9PT0gMCkgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfTk9fUkVBRF9BSEVBRFxuICB0aGlzLnVwZGF0ZUNhbGxiYWNrKClcbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVhZE5UICgpIHtcbiAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1VQREFUSU5HKSA9PT0gMCkge1xuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PVF9ORVhUX1RJQ0tcbiAgICB0aGlzLnVwZGF0ZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlV3JpdGVOVCAoKSB7XG4gIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfVVBEQVRJTkcpID09PSAwKSB7XG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICY9IFdSSVRFX05PVF9ORVhUX1RJQ0tcbiAgICB0aGlzLnVwZGF0ZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gdGlja0RyYWlucyAoZHJhaW5zKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZHJhaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gZHJhaW5zLndyaXRlcyBhcmUgbW9ub3RvbmljLCBzbyBpZiBvbmUgaXMgMCBpdHMgYWx3YXlzIHRoZSBmaXJzdCBvbmVcbiAgICBpZiAoLS1kcmFpbnNbaV0ud3JpdGVzID09PSAwKSB7XG4gICAgICBkcmFpbnMuc2hpZnQoKS5yZXNvbHZlKHRydWUpXG4gICAgICBpLS1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJPcGVuIChlcnIpIHtcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICBpZiAoZXJyKSBzdHJlYW0uZGVzdHJveShlcnIpXG5cbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWUlORykgPT09IDApIHtcbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1BSSU1BUllfU1RBVFVTKSA9PT0gMCkgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1BSSU1BUllcbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9QUklNQVJZX1NUQVRVUykgPT09IDApIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfUFJJTUFSWVxuICAgIHN0cmVhbS5lbWl0KCdvcGVuJylcbiAgfVxuXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gTk9UX0FDVElWRVxuXG4gIGlmIChzdHJlYW0uX3dyaXRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUudXBkYXRlQ2FsbGJhY2soKVxuICB9XG5cbiAgaWYgKHN0cmVhbS5fcmVhZGFibGVTdGF0ZSAhPT0gbnVsbCkge1xuICAgIHN0cmVhbS5fcmVhZGFibGVTdGF0ZS51cGRhdGVDYWxsYmFjaygpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0gKGVyciwgZGF0YSkge1xuICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEgIT09IG51bGwpIHRoaXMucHVzaChkYXRhKVxuICB0aGlzLl93cml0YWJsZVN0YXRlLmFmdGVyV3JpdGUoZXJyKVxufVxuXG5mdW5jdGlvbiBuZXdMaXN0ZW5lciAobmFtZSkge1xuICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuYW1lID09PSAnZGF0YScpIHtcbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IChSRUFEX0VNSVRfREFUQSB8IFJFQURfUkVTVU1FRF9SRUFEX0FIRUFEKVxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgfVxuICAgIGlmIChuYW1lID09PSAncmVhZGFibGUnKSB7XG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX0VNSVRfUkVBREFCTEVcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLl93cml0YWJsZVN0YXRlICE9PSBudWxsKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkcmFpbicpIHtcbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IFdSSVRFX0VNSVRfRFJBSU5cbiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBTdHJlYW0gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKClcblxuICAgIHRoaXMuX2R1cGxleFN0YXRlID0gMFxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBudWxsXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG51bGxcblxuICAgIGlmIChvcHRzKSB7XG4gICAgICBpZiAob3B0cy5vcGVuKSB0aGlzLl9vcGVuID0gb3B0cy5vcGVuXG4gICAgICBpZiAob3B0cy5kZXN0cm95KSB0aGlzLl9kZXN0cm95ID0gb3B0cy5kZXN0cm95XG4gICAgICBpZiAob3B0cy5wcmVkZXN0cm95KSB0aGlzLl9wcmVkZXN0cm95ID0gb3B0cy5wcmVkZXN0cm95XG4gICAgICBpZiAob3B0cy5zaWduYWwpIHtcbiAgICAgICAgb3B0cy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydC5iaW5kKHRoaXMpKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub24oJ25ld0xpc3RlbmVyJywgbmV3TGlzdGVuZXIpXG4gIH1cblxuICBfb3BlbiAoY2IpIHtcbiAgICBjYihudWxsKVxuICB9XG5cbiAgX2Rlc3Ryb3kgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9wcmVkZXN0cm95ICgpIHtcbiAgICAvLyBkb2VzIG5vdGhpbmdcbiAgfVxuXG4gIGdldCByZWFkYWJsZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgIT09IG51bGwgPyB0cnVlIDogdW5kZWZpbmVkXG4gIH1cblxuICBnZXQgd3JpdGFibGUgKCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICE9PSBudWxsID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0IGRlc3Ryb3llZCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lFRCkgIT09IDBcbiAgfVxuXG4gIGdldCBkZXN0cm95aW5nICgpIHtcbiAgICByZXR1cm4gKHRoaXMuX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpICE9PSAwXG4gIH1cblxuICBkZXN0cm95IChlcnIpIHtcbiAgICBpZiAoKHRoaXMuX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSAwKSB7XG4gICAgICBpZiAoIWVycikgZXJyID0gU1RSRUFNX0RFU1RST1lFRFxuICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgPSAodGhpcy5fZHVwbGV4U3RhdGUgfCBERVNUUk9ZSU5HKSAmIE5PTl9QUklNQVJZXG5cbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyayA9IDBcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lcnJvciA9IGVyclxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrID0gMFxuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yID0gZXJyXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IFBSRURFU1RST1lJTkdcbiAgICAgIHRoaXMuX3ByZWRlc3Ryb3koKVxuICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgJj0gTk9UX1BSRURFU1RST1lJTkdcblxuICAgICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgICAgaWYgKHRoaXMuX3dyaXRhYmxlU3RhdGUgIT09IG51bGwpIHRoaXMuX3dyaXRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBSZWFkYWJsZSBleHRlbmRzIFN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcblxuICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IE9QRU5JTkcgfCBXUklURV9ET05FIHwgUkVBRF9SRUFEX0FIRUFEXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKHRoaXMsIG9wdHMpXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZEFoZWFkID09PSBmYWxzZSkgdGhpcy5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT19SRUFEX0FIRUFEXG4gICAgICBpZiAob3B0cy5yZWFkKSB0aGlzLl9yZWFkID0gb3B0cy5yZWFkXG4gICAgICBpZiAob3B0cy5lYWdlck9wZW4pIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgICAgaWYgKG9wdHMuZW5jb2RpbmcpIHRoaXMuc2V0RW5jb2Rpbmcob3B0cy5lbmNvZGluZylcbiAgICB9XG4gIH1cblxuICBzZXRFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgICBjb25zdCBkZWMgPSBuZXcgVGV4dERlY29kZXIoZW5jb2RpbmcpXG4gICAgY29uc3QgbWFwID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5tYXAgfHwgZWNob1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUubWFwID0gbWFwT3JTa2lwXG4gICAgcmV0dXJuIHRoaXNcblxuICAgIGZ1bmN0aW9uIG1hcE9yU2tpcCAoZGF0YSkge1xuICAgICAgY29uc3QgbmV4dCA9IGRlYy5wdXNoKGRhdGEpXG4gICAgICByZXR1cm4gbmV4dCA9PT0gJycgPyBudWxsIDogbWFwKG5leHQpXG4gICAgfVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHBpcGUgKGRlc3QsIGNiKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5waXBlKGRlc3QsIGNiKVxuICAgIHJldHVybiBkZXN0XG4gIH1cblxuICByZWFkICgpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkKClcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5wdXNoKGRhdGEpXG4gIH1cblxuICB1bnNoaWZ0IChkYXRhKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUudW5zaGlmdChkYXRhKVxuICB9XG5cbiAgcmVzdW1lICgpIHtcbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1JFU1VNRURfUkVBRF9BSEVBRFxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwYXVzZSAoKSB7XG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgJj0gKHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZEFoZWFkID09PSBmYWxzZSA/IFJFQURfUEFVU0VEX05PX1JFQURfQUhFQUQgOiBSRUFEX1BBVVNFRClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhdGljIF9mcm9tQXN5bmNJdGVyYXRvciAoaXRlLCBvcHRzKSB7XG4gICAgbGV0IGRlc3Ryb3lcblxuICAgIGNvbnN0IHJzID0gbmV3IFJlYWRhYmxlKHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICByZWFkIChjYikge1xuICAgICAgICBpdGUubmV4dCgpLnRoZW4ocHVzaCkudGhlbihjYi5iaW5kKG51bGwsIG51bGwpKS5jYXRjaChjYilcbiAgICAgIH0sXG4gICAgICBwcmVkZXN0cm95ICgpIHtcbiAgICAgICAgZGVzdHJveSA9IGl0ZS5yZXR1cm4oKVxuICAgICAgfSxcbiAgICAgIGRlc3Ryb3kgKGNiKSB7XG4gICAgICAgIGlmICghZGVzdHJveSkgcmV0dXJuIGNiKG51bGwpXG4gICAgICAgIGRlc3Ryb3kudGhlbihjYi5iaW5kKG51bGwsIG51bGwpKS5jYXRjaChjYilcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIHJzXG5cbiAgICBmdW5jdGlvbiBwdXNoIChkYXRhKSB7XG4gICAgICBpZiAoZGF0YS5kb25lKSBycy5wdXNoKG51bGwpXG4gICAgICBlbHNlIHJzLnB1c2goZGF0YS52YWx1ZSlcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZnJvbSAoZGF0YSwgb3B0cykge1xuICAgIGlmIChpc1JlYWRTdHJlYW14KGRhdGEpKSByZXR1cm4gZGF0YVxuICAgIGlmIChkYXRhW2FzeW5jSXRlcmF0b3JdKSByZXR1cm4gdGhpcy5fZnJvbUFzeW5jSXRlcmF0b3IoZGF0YVthc3luY0l0ZXJhdG9yXSgpLCBvcHRzKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkgZGF0YSA9IGRhdGEgPT09IHVuZGVmaW5lZCA/IFtdIDogW2RhdGFdXG5cbiAgICBsZXQgaSA9IDBcbiAgICByZXR1cm4gbmV3IFJlYWRhYmxlKHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICByZWFkIChjYikge1xuICAgICAgICB0aGlzLnB1c2goaSA9PT0gZGF0YS5sZW5ndGggPyBudWxsIDogZGF0YVtpKytdKVxuICAgICAgICBjYihudWxsKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgaXNCYWNrcHJlc3N1cmVkIChycykge1xuICAgIHJldHVybiAocnMuX2R1cGxleFN0YXRlICYgUkVBRF9CQUNLUFJFU1NVUkVfU1RBVFVTKSAhPT0gMCB8fCBycy5fcmVhZGFibGVTdGF0ZS5idWZmZXJlZCA+PSBycy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrXG4gIH1cblxuICBzdGF0aWMgaXNQYXVzZWQgKHJzKSB7XG4gICAgcmV0dXJuIChycy5fZHVwbGV4U3RhdGUgJiBSRUFEX1JFU1VNRUQpID09PSAwXG4gIH1cblxuICBbYXN5bmNJdGVyYXRvcl0gKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXNcblxuICAgIGxldCBlcnJvciA9IG51bGxcbiAgICBsZXQgcHJvbWlzZVJlc29sdmUgPSBudWxsXG4gICAgbGV0IHByb21pc2VSZWplY3QgPSBudWxsXG5cbiAgICB0aGlzLm9uKCdlcnJvcicsIChlcnIpID0+IHsgZXJyb3IgPSBlcnIgfSlcbiAgICB0aGlzLm9uKCdyZWFkYWJsZScsIG9ucmVhZGFibGUpXG4gICAgdGhpcy5vbignY2xvc2UnLCBvbmNsb3NlKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIFthc3luY0l0ZXJhdG9yXSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgICB9LFxuICAgICAgbmV4dCAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgcHJvbWlzZVJlc29sdmUgPSByZXNvbHZlXG4gICAgICAgICAgcHJvbWlzZVJlamVjdCA9IHJlamVjdFxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBzdHJlYW0ucmVhZCgpXG4gICAgICAgICAgaWYgKGRhdGEgIT09IG51bGwpIG9uZGF0YShkYXRhKVxuICAgICAgICAgIGVsc2UgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWUVEKSAhPT0gMCkgb25kYXRhKG51bGwpXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgcmV0dXJuICgpIHtcbiAgICAgICAgcmV0dXJuIGRlc3Ryb3kobnVsbClcbiAgICAgIH0sXG4gICAgICB0aHJvdyAoZXJyKSB7XG4gICAgICAgIHJldHVybiBkZXN0cm95KGVycilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbnJlYWRhYmxlICgpIHtcbiAgICAgIGlmIChwcm9taXNlUmVzb2x2ZSAhPT0gbnVsbCkgb25kYXRhKHN0cmVhbS5yZWFkKCkpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25jbG9zZSAoKSB7XG4gICAgICBpZiAocHJvbWlzZVJlc29sdmUgIT09IG51bGwpIG9uZGF0YShudWxsKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uZGF0YSAoZGF0YSkge1xuICAgICAgaWYgKHByb21pc2VSZWplY3QgPT09IG51bGwpIHJldHVyblxuICAgICAgaWYgKGVycm9yKSBwcm9taXNlUmVqZWN0KGVycm9yKVxuICAgICAgZWxzZSBpZiAoZGF0YSA9PT0gbnVsbCAmJiAoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfRE9ORSkgPT09IDApIHByb21pc2VSZWplY3QoU1RSRUFNX0RFU1RST1lFRClcbiAgICAgIGVsc2UgcHJvbWlzZVJlc29sdmUoeyB2YWx1ZTogZGF0YSwgZG9uZTogZGF0YSA9PT0gbnVsbCB9KVxuICAgICAgcHJvbWlzZVJlamVjdCA9IHByb21pc2VSZXNvbHZlID0gbnVsbFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc3Ryb3kgKGVycikge1xuICAgICAgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBERVNUUk9ZRUQpIHJldHVybiByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICBzdHJlYW0ub25jZSgnY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGVycikgcmVqZWN0KGVycilcbiAgICAgICAgICBlbHNlIHJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBXcml0YWJsZSBleHRlbmRzIFN0cmVhbSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcblxuICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IE9QRU5JTkcgfCBSRUFEX0RPTkVcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUodGhpcywgb3B0cylcblxuICAgIGlmIChvcHRzKSB7XG4gICAgICBpZiAob3B0cy53cml0ZXYpIHRoaXMuX3dyaXRldiA9IG9wdHMud3JpdGV2XG4gICAgICBpZiAob3B0cy53cml0ZSkgdGhpcy5fd3JpdGUgPSBvcHRzLndyaXRlXG4gICAgICBpZiAob3B0cy5maW5hbCkgdGhpcy5fZmluYWwgPSBvcHRzLmZpbmFsXG4gICAgICBpZiAob3B0cy5lYWdlck9wZW4pIHRoaXMuX3dyaXRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIH1cbiAgfVxuXG4gIGNvcmsgKCkge1xuICAgIHRoaXMuX2R1cGxleFN0YXRlIHw9IFdSSVRFX0NPUktFRFxuICB9XG5cbiAgdW5jb3JrICgpIHtcbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfQ09SS0VEXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gIH1cblxuICBfd3JpdGV2IChiYXRjaCwgY2IpIHtcbiAgICBjYihudWxsKVxuICB9XG5cbiAgX3dyaXRlIChkYXRhLCBjYikge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuYXV0b0JhdGNoKGRhdGEsIGNiKVxuICB9XG5cbiAgX2ZpbmFsIChjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBzdGF0aWMgaXNCYWNrcHJlc3N1cmVkICh3cykge1xuICAgIHJldHVybiAod3MuX2R1cGxleFN0YXRlICYgV1JJVEVfQkFDS1BSRVNTVVJFX1NUQVRVUykgIT09IDBcbiAgfVxuXG4gIHN0YXRpYyBkcmFpbmVkICh3cykge1xuICAgIGlmICh3cy5kZXN0cm95ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpXG4gICAgY29uc3Qgc3RhdGUgPSB3cy5fd3JpdGFibGVTdGF0ZVxuICAgIGNvbnN0IHBlbmRpbmcgPSAoaXNXcml0ZXYod3MpID8gTWF0aC5taW4oMSwgc3RhdGUucXVldWUubGVuZ3RoKSA6IHN0YXRlLnF1ZXVlLmxlbmd0aClcbiAgICBjb25zdCB3cml0ZXMgPSBwZW5kaW5nICsgKCh3cy5fZHVwbGV4U3RhdGUgJiBXUklURV9XUklUSU5HKSA/IDEgOiAwKVxuICAgIGlmICh3cml0ZXMgPT09IDApIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSlcbiAgICBpZiAoc3RhdGUuZHJhaW5zID09PSBudWxsKSBzdGF0ZS5kcmFpbnMgPSBbXVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgc3RhdGUuZHJhaW5zLnB1c2goeyB3cml0ZXMsIHJlc29sdmUgfSlcbiAgICB9KVxuICB9XG5cbiAgd3JpdGUgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5wdXNoKGRhdGEpXG4gIH1cblxuICBlbmQgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZChkYXRhKVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxuY2xhc3MgRHVwbGV4IGV4dGVuZHMgUmVhZGFibGUgeyAvLyBhbmQgV3JpdGFibGVcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuXG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgPSBPUEVOSU5HIHwgKHRoaXMuX2R1cGxleFN0YXRlICYgUkVBRF9SRUFEX0FIRUFEKVxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZSh0aGlzLCBvcHRzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLndyaXRldikgdGhpcy5fd3JpdGV2ID0gb3B0cy53cml0ZXZcbiAgICAgIGlmIChvcHRzLndyaXRlKSB0aGlzLl93cml0ZSA9IG9wdHMud3JpdGVcbiAgICAgIGlmIChvcHRzLmZpbmFsKSB0aGlzLl9maW5hbCA9IG9wdHMuZmluYWxcbiAgICB9XG4gIH1cblxuICBjb3JrICgpIHtcbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9DT1JLRURcbiAgfVxuXG4gIHVuY29yayAoKSB7XG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX0NPUktFRFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICB9XG5cbiAgX3dyaXRldiAoYmF0Y2gsIGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmF1dG9CYXRjaChkYXRhLCBjYilcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICBjYihudWxsKVxuICB9XG5cbiAgd3JpdGUgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5wdXNoKGRhdGEpXG4gIH1cblxuICBlbmQgKGRhdGEpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZChkYXRhKVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxuY2xhc3MgVHJhbnNmb3JtIGV4dGVuZHMgRHVwbGV4IHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXMuX3RyYW5zZm9ybVN0YXRlID0gbmV3IFRyYW5zZm9ybVN0YXRlKHRoaXMpXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMudHJhbnNmb3JtKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRzLnRyYW5zZm9ybVxuICAgICAgaWYgKG9wdHMuZmx1c2gpIHRoaXMuX2ZsdXNoID0gb3B0cy5mbHVzaFxuICAgIH1cbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXJlZCA+PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICAgIHRoaXMuX3RyYW5zZm9ybVN0YXRlLmRhdGEgPSBkYXRhXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3RyYW5zZm9ybShkYXRhLCB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlclRyYW5zZm9ybSlcbiAgICB9XG4gIH1cblxuICBfcmVhZCAoY2IpIHtcbiAgICBpZiAodGhpcy5fdHJhbnNmb3JtU3RhdGUuZGF0YSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlLmRhdGFcbiAgICAgIHRoaXMuX3RyYW5zZm9ybVN0YXRlLmRhdGEgPSBudWxsXG4gICAgICBjYihudWxsKVxuICAgICAgdGhpcy5fdHJhbnNmb3JtKGRhdGEsIHRoaXMuX3RyYW5zZm9ybVN0YXRlLmFmdGVyVHJhbnNmb3JtKVxuICAgIH0gZWxzZSB7XG4gICAgICBjYihudWxsKVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3kgKGVycikge1xuICAgIHN1cGVyLmRlc3Ryb3koZXJyKVxuICAgIGlmICh0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gbnVsbFxuICAgICAgdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJUcmFuc2Zvcm0oKVxuICAgIH1cbiAgfVxuXG4gIF90cmFuc2Zvcm0gKGRhdGEsIGNiKSB7XG4gICAgY2IobnVsbCwgZGF0YSlcbiAgfVxuXG4gIF9mbHVzaCAoY2IpIHtcbiAgICBjYihudWxsKVxuICB9XG5cbiAgX2ZpbmFsIChjYikge1xuICAgIHRoaXMuX3RyYW5zZm9ybVN0YXRlLmFmdGVyRmluYWwgPSBjYlxuICAgIHRoaXMuX2ZsdXNoKHRyYW5zZm9ybUFmdGVyRmx1c2guYmluZCh0aGlzKSlcbiAgfVxufVxuXG5jbGFzcyBQYXNzVGhyb3VnaCBleHRlbmRzIFRyYW5zZm9ybSB7fVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1BZnRlckZsdXNoIChlcnIsIGRhdGEpIHtcbiAgY29uc3QgY2IgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlckZpbmFsXG4gIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgdGhpcy5wdXNoKGRhdGEpXG4gIHRoaXMucHVzaChudWxsKVxuICBjYihudWxsKVxufVxuXG5mdW5jdGlvbiBwaXBlbGluZVByb21pc2UgKC4uLnN0cmVhbXMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXR1cm4gcGlwZWxpbmUoLi4uc3RyZWFtcywgKGVycikgPT4ge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpXG4gICAgICByZXNvbHZlKClcbiAgICB9KVxuICB9KVxufVxuXG5mdW5jdGlvbiBwaXBlbGluZSAoc3RyZWFtLCAuLi5zdHJlYW1zKSB7XG4gIGNvbnN0IGFsbCA9IEFycmF5LmlzQXJyYXkoc3RyZWFtKSA/IFsuLi5zdHJlYW0sIC4uLnN0cmVhbXNdIDogW3N0cmVhbSwgLi4uc3RyZWFtc11cbiAgY29uc3QgZG9uZSA9IChhbGwubGVuZ3RoICYmIHR5cGVvZiBhbGxbYWxsLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSA/IGFsbC5wb3AoKSA6IG51bGxcblxuICBpZiAoYWxsLmxlbmd0aCA8IDIpIHRocm93IG5ldyBFcnJvcignUGlwZWxpbmUgcmVxdWlyZXMgYXQgbGVhc3QgMiBzdHJlYW1zJylcblxuICBsZXQgc3JjID0gYWxsWzBdXG4gIGxldCBkZXN0ID0gbnVsbFxuICBsZXQgZXJyb3IgPSBudWxsXG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHtcbiAgICBkZXN0ID0gYWxsW2ldXG5cbiAgICBpZiAoaXNTdHJlYW14KHNyYykpIHtcbiAgICAgIHNyYy5waXBlKGRlc3QsIG9uZXJyb3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9ySGFuZGxlKHNyYywgdHJ1ZSwgaSA+IDEsIG9uZXJyb3IpXG4gICAgICBzcmMucGlwZShkZXN0KVxuICAgIH1cblxuICAgIHNyYyA9IGRlc3RcbiAgfVxuXG4gIGlmIChkb25lKSB7XG4gICAgbGV0IGZpbiA9IGZhbHNlXG5cbiAgICBjb25zdCBhdXRvRGVzdHJveSA9IGlzU3RyZWFteChkZXN0KSB8fCAhIShkZXN0Ll93cml0YWJsZVN0YXRlICYmIGRlc3QuX3dyaXRhYmxlU3RhdGUuYXV0b0Rlc3Ryb3kpXG5cbiAgICBkZXN0Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnJvciA9PT0gbnVsbCkgZXJyb3IgPSBlcnJcbiAgICB9KVxuXG4gICAgZGVzdC5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgZmluID0gdHJ1ZVxuICAgICAgaWYgKCFhdXRvRGVzdHJveSkgZG9uZShlcnJvcilcbiAgICB9KVxuXG4gICAgaWYgKGF1dG9EZXN0cm95KSB7XG4gICAgICBkZXN0Lm9uKCdjbG9zZScsICgpID0+IGRvbmUoZXJyb3IgfHwgKGZpbiA/IG51bGwgOiBQUkVNQVRVUkVfQ0xPU0UpKSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVzdFxuXG4gIGZ1bmN0aW9uIGVycm9ySGFuZGxlIChzLCByZCwgd3IsIG9uZXJyb3IpIHtcbiAgICBzLm9uKCdlcnJvcicsIG9uZXJyb3IpXG4gICAgcy5vbignY2xvc2UnLCBvbmNsb3NlKVxuXG4gICAgZnVuY3Rpb24gb25jbG9zZSAoKSB7XG4gICAgICBpZiAocmQgJiYgcy5fcmVhZGFibGVTdGF0ZSAmJiAhcy5fcmVhZGFibGVTdGF0ZS5lbmRlZCkgcmV0dXJuIG9uZXJyb3IoUFJFTUFUVVJFX0NMT1NFKVxuICAgICAgaWYgKHdyICYmIHMuX3dyaXRhYmxlU3RhdGUgJiYgIXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybiBvbmVycm9yKFBSRU1BVFVSRV9DTE9TRSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVycm9yIChlcnIpIHtcbiAgICBpZiAoIWVyciB8fCBlcnJvcikgcmV0dXJuXG4gICAgZXJyb3IgPSBlcnJcblxuICAgIGZvciAoY29uc3QgcyBvZiBhbGwpIHtcbiAgICAgIHMuZGVzdHJveShlcnIpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGVjaG8gKHMpIHtcbiAgcmV0dXJuIHNcbn1cblxuZnVuY3Rpb24gaXNTdHJlYW0gKHN0cmVhbSkge1xuICByZXR1cm4gISFzdHJlYW0uX3JlYWRhYmxlU3RhdGUgfHwgISFzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbn1cblxuZnVuY3Rpb24gaXNTdHJlYW14IChzdHJlYW0pIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHJlYW0uX2R1cGxleFN0YXRlID09PSAnbnVtYmVyJyAmJiBpc1N0cmVhbShzdHJlYW0pXG59XG5cbmZ1bmN0aW9uIGdldFN0cmVhbUVycm9yIChzdHJlYW0sIG9wdHMgPSB7fSkge1xuICBjb25zdCBlcnIgPSAoc3RyZWFtLl9yZWFkYWJsZVN0YXRlICYmIHN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lcnJvcikgfHwgKHN0cmVhbS5fd3JpdGFibGVTdGF0ZSAmJiBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3IpXG5cbiAgLy8gYXZvaWQgaW1wbGljaXQgZXJyb3JzIGJ5IGRlZmF1bHRcbiAgcmV0dXJuICghb3B0cy5hbGwgJiYgZXJyID09PSBTVFJFQU1fREVTVFJPWUVEKSA/IG51bGwgOiBlcnJcbn1cblxuZnVuY3Rpb24gaXNSZWFkU3RyZWFteCAoc3RyZWFtKSB7XG4gIHJldHVybiBpc1N0cmVhbXgoc3RyZWFtKSAmJiBzdHJlYW0ucmVhZGFibGVcbn1cblxuZnVuY3Rpb24gaXNUeXBlZEFycmF5IChkYXRhKSB7XG4gIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgZGF0YS5ieXRlTGVuZ3RoID09PSAnbnVtYmVyJ1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Qnl0ZUxlbmd0aCAoZGF0YSkge1xuICByZXR1cm4gaXNUeXBlZEFycmF5KGRhdGEpID8gZGF0YS5ieXRlTGVuZ3RoIDogMTAyNFxufVxuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIGFib3J0ICgpIHtcbiAgdGhpcy5kZXN0cm95KG5ldyBFcnJvcignU3RyZWFtIGFib3J0ZWQuJykpXG59XG5cbmZ1bmN0aW9uIGlzV3JpdGV2IChzKSB7XG4gIHJldHVybiBzLl93cml0ZXYgIT09IFdyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2ICYmIHMuX3dyaXRldiAhPT0gRHVwbGV4LnByb3RvdHlwZS5fd3JpdGV2XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwaXBlbGluZSxcbiAgcGlwZWxpbmVQcm9taXNlLFxuICBpc1N0cmVhbSxcbiAgaXNTdHJlYW14LFxuICBnZXRTdHJlYW1FcnJvcixcbiAgU3RyZWFtLFxuICBXcml0YWJsZSxcbiAgUmVhZGFibGUsXG4gIER1cGxleCxcbiAgVHJhbnNmb3JtLFxuICAvLyBFeHBvcnQgUGFzc1Rocm91Z2ggZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBOb2RlLmpzIGNvcmUncyBzdHJlYW0gbW9kdWxlXG4gIFBhc3NUaHJvdWdoXG59XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBzdHJpcEFuc2kgPSByZXF1aXJlKCdzdHJpcC1hbnNpJyk7XG5jb25zdCBpc0Z1bGx3aWR0aENvZGVQb2ludCA9IHJlcXVpcmUoJ2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50Jyk7XG5jb25zdCBlbW9qaVJlZ2V4ID0gcmVxdWlyZSgnZW1vamktcmVnZXgnKTtcblxuY29uc3Qgc3RyaW5nV2lkdGggPSBzdHJpbmcgPT4ge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycgfHwgc3RyaW5nLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0c3RyaW5nID0gc3RyaXBBbnNpKHN0cmluZyk7XG5cblx0aWYgKHN0cmluZy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGVtb2ppUmVnZXgoKSwgJyAgJyk7XG5cblx0bGV0IHdpZHRoID0gMDtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IGNvZGUgPSBzdHJpbmcuY29kZVBvaW50QXQoaSk7XG5cblx0XHQvLyBJZ25vcmUgY29udHJvbCBjaGFyYWN0ZXJzXG5cdFx0aWYgKGNvZGUgPD0gMHgxRiB8fCAoY29kZSA+PSAweDdGICYmIGNvZGUgPD0gMHg5RikpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdC8vIElnbm9yZSBjb21iaW5pbmcgY2hhcmFjdGVyc1xuXHRcdGlmIChjb2RlID49IDB4MzAwICYmIGNvZGUgPD0gMHgzNkYpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdC8vIFN1cnJvZ2F0ZXNcblx0XHRpZiAoY29kZSA+IDB4RkZGRikge1xuXHRcdFx0aSsrO1xuXHRcdH1cblxuXHRcdHdpZHRoICs9IGlzRnVsbHdpZHRoQ29kZVBvaW50KGNvZGUpID8gMiA6IDE7XG5cdH1cblxuXHRyZXR1cm4gd2lkdGg7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ1dpZHRoO1xuLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvblxubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IHN0cmluZ1dpZHRoO1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYW5zaVJlZ2V4ID0gcmVxdWlyZSgnYW5zaS1yZWdleCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZyA9PiB0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJyA/IHN0cmluZy5yZXBsYWNlKGFuc2lSZWdleCgpLCAnJykgOiBzdHJpbmc7XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBvcyA9IHJlcXVpcmUoJ29zJyk7XG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IGhhc0ZsYWcgPSByZXF1aXJlKCdoYXMtZmxhZycpO1xuXG5jb25zdCB7ZW52fSA9IHByb2Nlc3M7XG5cbmxldCBmbGFnRm9yY2VDb2xvcjtcbmlmIChoYXNGbGFnKCduby1jb2xvcicpIHx8XG5cdGhhc0ZsYWcoJ25vLWNvbG9ycycpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPWZhbHNlJykgfHxcblx0aGFzRmxhZygnY29sb3I9bmV2ZXInKSkge1xuXHRmbGFnRm9yY2VDb2xvciA9IDA7XG59IGVsc2UgaWYgKGhhc0ZsYWcoJ2NvbG9yJykgfHxcblx0aGFzRmxhZygnY29sb3JzJykgfHxcblx0aGFzRmxhZygnY29sb3I9dHJ1ZScpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPWFsd2F5cycpKSB7XG5cdGZsYWdGb3JjZUNvbG9yID0gMTtcbn1cblxuZnVuY3Rpb24gZW52Rm9yY2VDb2xvcigpIHtcblx0aWYgKCdGT1JDRV9DT0xPUicgaW4gZW52KSB7XG5cdFx0aWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ3RydWUnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRpZiAoZW52LkZPUkNFX0NPTE9SID09PSAnZmFsc2UnKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW52LkZPUkNFX0NPTE9SLmxlbmd0aCA9PT0gMCA/IDEgOiBNYXRoLm1pbihOdW1iZXIucGFyc2VJbnQoZW52LkZPUkNFX0NPTE9SLCAxMCksIDMpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZUxldmVsKGxldmVsKSB7XG5cdGlmIChsZXZlbCA9PT0gMCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bGV2ZWwsXG5cdFx0aGFzQmFzaWM6IHRydWUsXG5cdFx0aGFzMjU2OiBsZXZlbCA+PSAyLFxuXHRcdGhhczE2bTogbGV2ZWwgPj0gM1xuXHR9O1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0NvbG9yKGhhdmVTdHJlYW0sIHtzdHJlYW1Jc1RUWSwgc25pZmZGbGFncyA9IHRydWV9ID0ge30pIHtcblx0Y29uc3Qgbm9GbGFnRm9yY2VDb2xvciA9IGVudkZvcmNlQ29sb3IoKTtcblx0aWYgKG5vRmxhZ0ZvcmNlQ29sb3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdGZsYWdGb3JjZUNvbG9yID0gbm9GbGFnRm9yY2VDb2xvcjtcblx0fVxuXG5cdGNvbnN0IGZvcmNlQ29sb3IgPSBzbmlmZkZsYWdzID8gZmxhZ0ZvcmNlQ29sb3IgOiBub0ZsYWdGb3JjZUNvbG9yO1xuXG5cdGlmIChmb3JjZUNvbG9yID09PSAwKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRpZiAoc25pZmZGbGFncykge1xuXHRcdGlmIChoYXNGbGFnKCdjb2xvcj0xNm0nKSB8fFxuXHRcdFx0aGFzRmxhZygnY29sb3I9ZnVsbCcpIHx8XG5cdFx0XHRoYXNGbGFnKCdjb2xvcj10cnVlY29sb3InKSkge1xuXHRcdFx0cmV0dXJuIDM7XG5cdFx0fVxuXG5cdFx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTI1NicpKSB7XG5cdFx0XHRyZXR1cm4gMjtcblx0XHR9XG5cdH1cblxuXHRpZiAoaGF2ZVN0cmVhbSAmJiAhc3RyZWFtSXNUVFkgJiYgZm9yY2VDb2xvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRjb25zdCBtaW4gPSBmb3JjZUNvbG9yIHx8IDA7XG5cblx0aWYgKGVudi5URVJNID09PSAnZHVtYicpIHtcblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDEwNTg2IGlzIHRoZSBmaXJzdCBXaW5kb3dzIHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAyNTYgY29sb3JzLlxuXHRcdC8vIFdpbmRvd3MgMTAgYnVpbGQgMTQ5MzEgaXMgdGhlIGZpcnN0IHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAxNm0vVHJ1ZUNvbG9yLlxuXHRcdGNvbnN0IG9zUmVsZWFzZSA9IG9zLnJlbGVhc2UoKS5zcGxpdCgnLicpO1xuXHRcdGlmIChcblx0XHRcdE51bWJlcihvc1JlbGVhc2VbMF0pID49IDEwICYmXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxMDU4NlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIE51bWJlcihvc1JlbGVhc2VbMl0pID49IDE0OTMxID8gMyA6IDI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoJ0NJJyBpbiBlbnYpIHtcblx0XHRpZiAoWydUUkFWSVMnLCAnQ0lSQ0xFQ0knLCAnQVBQVkVZT1InLCAnR0lUTEFCX0NJJywgJ0dJVEhVQl9BQ1RJT05TJywgJ0JVSUxES0lURScsICdEUk9ORSddLnNvbWUoc2lnbiA9PiBzaWduIGluIGVudikgfHwgZW52LkNJX05BTUUgPT09ICdjb2Rlc2hpcCcpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblxuXHRcdHJldHVybiBtaW47XG5cdH1cblxuXHRpZiAoJ1RFQU1DSVRZX1ZFUlNJT04nIGluIGVudikge1xuXHRcdHJldHVybiAvXig5XFwuKDAqWzEtOV1cXGQqKVxcLnxcXGR7Mix9XFwuKS8udGVzdChlbnYuVEVBTUNJVFlfVkVSU0lPTikgPyAxIDogMDtcblx0fVxuXG5cdGlmIChlbnYuQ09MT1JURVJNID09PSAndHJ1ZWNvbG9yJykge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKCdURVJNX1BST0dSQU0nIGluIGVudikge1xuXHRcdGNvbnN0IHZlcnNpb24gPSBOdW1iZXIucGFyc2VJbnQoKGVudi5URVJNX1BST0dSQU1fVkVSU0lPTiB8fCAnJykuc3BsaXQoJy4nKVswXSwgMTApO1xuXG5cdFx0c3dpdGNoIChlbnYuVEVSTV9QUk9HUkFNKSB7XG5cdFx0XHRjYXNlICdpVGVybS5hcHAnOlxuXHRcdFx0XHRyZXR1cm4gdmVyc2lvbiA+PSAzID8gMyA6IDI7XG5cdFx0XHRjYXNlICdBcHBsZV9UZXJtaW5hbCc6XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0Ly8gTm8gZGVmYXVsdFxuXHRcdH1cblx0fVxuXG5cdGlmICgvLTI1Nihjb2xvcik/JC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRpZiAoL15zY3JlZW58Xnh0ZXJtfF52dDEwMHxednQyMjB8XnJ4dnR8Y29sb3J8YW5zaXxjeWd3aW58bGludXgvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDT0xPUlRFUk0nIGluIGVudikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0cmV0dXJuIG1pbjtcbn1cblxuZnVuY3Rpb24gZ2V0U3VwcG9ydExldmVsKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IGxldmVsID0gc3VwcG9ydHNDb2xvcihzdHJlYW0sIHtcblx0XHRzdHJlYW1Jc1RUWTogc3RyZWFtICYmIHN0cmVhbS5pc1RUWSxcblx0XHQuLi5vcHRpb25zXG5cdH0pO1xuXG5cdHJldHVybiB0cmFuc2xhdGVMZXZlbChsZXZlbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRzdXBwb3J0c0NvbG9yOiBnZXRTdXBwb3J0TGV2ZWwsXG5cdHN0ZG91dDogZ2V0U3VwcG9ydExldmVsKHtpc1RUWTogdHR5LmlzYXR0eSgxKX0pLFxuXHRzdGRlcnI6IGdldFN1cHBvcnRMZXZlbCh7aXNUVFk6IHR0eS5pc2F0dHkoMil9KVxufTtcbiIsImNvbnN0IHRhciA9IHJlcXVpcmUoJ3Rhci1zdHJlYW0nKVxuY29uc3QgcHVtcCA9IHJlcXVpcmUoJ3B1bXAnKVxuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5cbmNvbnN0IHdpbjMyID0gKGdsb2JhbC5CYXJlPy5wbGF0Zm9ybSB8fCBwcm9jZXNzLnBsYXRmb3JtKSA9PT0gJ3dpbjMyJ1xuXG5leHBvcnRzLnBhY2sgPSBmdW5jdGlvbiBwYWNrIChjd2QsIG9wdHMpIHtcbiAgaWYgKCFjd2QpIGN3ZCA9ICcuJ1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuXG4gIGNvbnN0IHhmcyA9IG9wdHMuZnMgfHwgZnNcbiAgY29uc3QgaWdub3JlID0gb3B0cy5pZ25vcmUgfHwgb3B0cy5maWx0ZXIgfHwgbm9vcFxuICBjb25zdCBtYXBTdHJlYW0gPSBvcHRzLm1hcFN0cmVhbSB8fCBlY2hvXG4gIGNvbnN0IHN0YXROZXh0ID0gc3RhdEFsbCh4ZnMsIG9wdHMuZGVyZWZlcmVuY2UgPyB4ZnMuc3RhdCA6IHhmcy5sc3RhdCwgY3dkLCBpZ25vcmUsIG9wdHMuZW50cmllcywgb3B0cy5zb3J0KVxuICBjb25zdCBzdHJpY3QgPSBvcHRzLnN0cmljdCAhPT0gZmFsc2VcbiAgY29uc3QgdW1hc2sgPSB0eXBlb2Ygb3B0cy51bWFzayA9PT0gJ251bWJlcicgPyB+b3B0cy51bWFzayA6IH5wcm9jZXNzVW1hc2soKVxuICBjb25zdCBwYWNrID0gb3B0cy5wYWNrIHx8IHRhci5wYWNrKClcbiAgY29uc3QgZmluaXNoID0gb3B0cy5maW5pc2ggfHwgbm9vcFxuXG4gIGxldCBtYXAgPSBvcHRzLm1hcCB8fCBub29wXG4gIGxldCBkbW9kZSA9IHR5cGVvZiBvcHRzLmRtb2RlID09PSAnbnVtYmVyJyA/IG9wdHMuZG1vZGUgOiAwXG4gIGxldCBmbW9kZSA9IHR5cGVvZiBvcHRzLmZtb2RlID09PSAnbnVtYmVyJyA/IG9wdHMuZm1vZGUgOiAwXG5cbiAgaWYgKG9wdHMuc3RyaXApIG1hcCA9IHN0cmlwKG1hcCwgb3B0cy5zdHJpcClcblxuICBpZiAob3B0cy5yZWFkYWJsZSkge1xuICAgIGRtb2RlIHw9IHBhcnNlSW50KDU1NSwgOClcbiAgICBmbW9kZSB8PSBwYXJzZUludCg0NDQsIDgpXG4gIH1cbiAgaWYgKG9wdHMud3JpdGFibGUpIHtcbiAgICBkbW9kZSB8PSBwYXJzZUludCgzMzMsIDgpXG4gICAgZm1vZGUgfD0gcGFyc2VJbnQoMjIyLCA4KVxuICB9XG5cbiAgb25uZXh0ZW50cnkoKVxuXG4gIGZ1bmN0aW9uIG9uc3ltbGluayAoZmlsZW5hbWUsIGhlYWRlcikge1xuICAgIHhmcy5yZWFkbGluayhwYXRoLmpvaW4oY3dkLCBmaWxlbmFtZSksIGZ1bmN0aW9uIChlcnIsIGxpbmtuYW1lKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcGFjay5kZXN0cm95KGVycilcbiAgICAgIGhlYWRlci5saW5rbmFtZSA9IG5vcm1hbGl6ZShsaW5rbmFtZSlcbiAgICAgIHBhY2suZW50cnkoaGVhZGVyLCBvbm5leHRlbnRyeSlcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gb25zdGF0IChlcnIsIGZpbGVuYW1lLCBzdGF0KSB7XG4gICAgaWYgKGVycikgcmV0dXJuIHBhY2suZGVzdHJveShlcnIpXG4gICAgaWYgKCFmaWxlbmFtZSkge1xuICAgICAgaWYgKG9wdHMuZmluYWxpemUgIT09IGZhbHNlKSBwYWNrLmZpbmFsaXplKClcbiAgICAgIHJldHVybiBmaW5pc2gocGFjaylcbiAgICB9XG5cbiAgICBpZiAoc3RhdC5pc1NvY2tldCgpKSByZXR1cm4gb25uZXh0ZW50cnkoKSAvLyB0YXIgZG9lcyBub3Qgc3VwcG9ydCBzb2NrZXRzLi4uXG5cbiAgICBsZXQgaGVhZGVyID0ge1xuICAgICAgbmFtZTogbm9ybWFsaXplKGZpbGVuYW1lKSxcbiAgICAgIG1vZGU6IChzdGF0Lm1vZGUgfCAoc3RhdC5pc0RpcmVjdG9yeSgpID8gZG1vZGUgOiBmbW9kZSkpICYgdW1hc2ssXG4gICAgICBtdGltZTogc3RhdC5tdGltZSxcbiAgICAgIHNpemU6IHN0YXQuc2l6ZSxcbiAgICAgIHR5cGU6ICdmaWxlJyxcbiAgICAgIHVpZDogc3RhdC51aWQsXG4gICAgICBnaWQ6IHN0YXQuZ2lkXG4gICAgfVxuXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaGVhZGVyLnNpemUgPSAwXG4gICAgICBoZWFkZXIudHlwZSA9ICdkaXJlY3RvcnknXG4gICAgICBoZWFkZXIgPSBtYXAoaGVhZGVyKSB8fCBoZWFkZXJcbiAgICAgIHJldHVybiBwYWNrLmVudHJ5KGhlYWRlciwgb25uZXh0ZW50cnkpXG4gICAgfVxuXG4gICAgaWYgKHN0YXQuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgaGVhZGVyLnNpemUgPSAwXG4gICAgICBoZWFkZXIudHlwZSA9ICdzeW1saW5rJ1xuICAgICAgaGVhZGVyID0gbWFwKGhlYWRlcikgfHwgaGVhZGVyXG4gICAgICByZXR1cm4gb25zeW1saW5rKGZpbGVuYW1lLCBoZWFkZXIpXG4gICAgfVxuXG4gICAgLy8gVE9ETzogYWRkIGZpZm8gZXRjLi4uXG5cbiAgICBoZWFkZXIgPSBtYXAoaGVhZGVyKSB8fCBoZWFkZXJcblxuICAgIGlmICghc3RhdC5pc0ZpbGUoKSkge1xuICAgICAgaWYgKHN0cmljdCkgcmV0dXJuIHBhY2suZGVzdHJveShuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIHR5cGUgZm9yICcgKyBmaWxlbmFtZSkpXG4gICAgICByZXR1cm4gb25uZXh0ZW50cnkoKVxuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5ID0gcGFjay5lbnRyeShoZWFkZXIsIG9ubmV4dGVudHJ5KVxuICAgIGNvbnN0IHJzID0gbWFwU3RyZWFtKHhmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGguam9pbihjd2QsIGZpbGVuYW1lKSwgeyBzdGFydDogMCwgZW5kOiBoZWFkZXIuc2l6ZSA+IDAgPyBoZWFkZXIuc2l6ZSAtIDEgOiBoZWFkZXIuc2l6ZSB9KSwgaGVhZGVyKVxuXG4gICAgcnMub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikgeyAvLyBhbHdheXMgZm9yd2FyZCBlcnJvcnMgb24gZGVzdHJveVxuICAgICAgZW50cnkuZGVzdHJveShlcnIpXG4gICAgfSlcblxuICAgIHB1bXAocnMsIGVudHJ5KVxuICB9XG5cbiAgZnVuY3Rpb24gb25uZXh0ZW50cnkgKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBwYWNrLmRlc3Ryb3koZXJyKVxuICAgIHN0YXROZXh0KG9uc3RhdClcbiAgfVxuXG4gIHJldHVybiBwYWNrXG59XG5cbmZ1bmN0aW9uIGhlYWQgKGxpc3QpIHtcbiAgcmV0dXJuIGxpc3QubGVuZ3RoID8gbGlzdFtsaXN0Lmxlbmd0aCAtIDFdIDogbnVsbFxufVxuXG5mdW5jdGlvbiBwcm9jZXNzR2V0dWlkICgpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZ2V0dWlkID8gcHJvY2Vzcy5nZXR1aWQoKSA6IC0xXG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NVbWFzayAoKSB7XG4gIHJldHVybiBwcm9jZXNzLnVtYXNrID8gcHJvY2Vzcy51bWFzaygpIDogMFxufVxuXG5leHBvcnRzLmV4dHJhY3QgPSBmdW5jdGlvbiBleHRyYWN0IChjd2QsIG9wdHMpIHtcbiAgaWYgKCFjd2QpIGN3ZCA9ICcuJ1xuICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuXG4gIGNvbnN0IHhmcyA9IG9wdHMuZnMgfHwgZnNcbiAgY29uc3QgaWdub3JlID0gb3B0cy5pZ25vcmUgfHwgb3B0cy5maWx0ZXIgfHwgbm9vcFxuICBjb25zdCBtYXBTdHJlYW0gPSBvcHRzLm1hcFN0cmVhbSB8fCBlY2hvXG4gIGNvbnN0IG93biA9IG9wdHMuY2hvd24gIT09IGZhbHNlICYmICF3aW4zMiAmJiBwcm9jZXNzR2V0dWlkKCkgPT09IDBcbiAgY29uc3QgZXh0cmFjdCA9IG9wdHMuZXh0cmFjdCB8fCB0YXIuZXh0cmFjdCgpXG4gIGNvbnN0IHN0YWNrID0gW11cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICBjb25zdCB1bWFzayA9IHR5cGVvZiBvcHRzLnVtYXNrID09PSAnbnVtYmVyJyA/IH5vcHRzLnVtYXNrIDogfnByb2Nlc3NVbWFzaygpXG4gIGNvbnN0IHN0cmljdCA9IG9wdHMuc3RyaWN0ICE9PSBmYWxzZVxuXG4gIGxldCBtYXAgPSBvcHRzLm1hcCB8fCBub29wXG4gIGxldCBkbW9kZSA9IHR5cGVvZiBvcHRzLmRtb2RlID09PSAnbnVtYmVyJyA/IG9wdHMuZG1vZGUgOiAwXG4gIGxldCBmbW9kZSA9IHR5cGVvZiBvcHRzLmZtb2RlID09PSAnbnVtYmVyJyA/IG9wdHMuZm1vZGUgOiAwXG5cbiAgaWYgKG9wdHMuc3RyaXApIG1hcCA9IHN0cmlwKG1hcCwgb3B0cy5zdHJpcClcblxuICBpZiAob3B0cy5yZWFkYWJsZSkge1xuICAgIGRtb2RlIHw9IHBhcnNlSW50KDU1NSwgOClcbiAgICBmbW9kZSB8PSBwYXJzZUludCg0NDQsIDgpXG4gIH1cbiAgaWYgKG9wdHMud3JpdGFibGUpIHtcbiAgICBkbW9kZSB8PSBwYXJzZUludCgzMzMsIDgpXG4gICAgZm1vZGUgfD0gcGFyc2VJbnQoMjIyLCA4KVxuICB9XG5cbiAgZXh0cmFjdC5vbignZW50cnknLCBvbmVudHJ5KVxuXG4gIGlmIChvcHRzLmZpbmlzaCkgZXh0cmFjdC5vbignZmluaXNoJywgb3B0cy5maW5pc2gpXG5cbiAgcmV0dXJuIGV4dHJhY3RcblxuICBmdW5jdGlvbiBvbmVudHJ5IChoZWFkZXIsIHN0cmVhbSwgbmV4dCkge1xuICAgIGhlYWRlciA9IG1hcChoZWFkZXIpIHx8IGhlYWRlclxuICAgIGhlYWRlci5uYW1lID0gbm9ybWFsaXplKGhlYWRlci5uYW1lKVxuXG4gICAgY29uc3QgbmFtZSA9IHBhdGguam9pbihjd2QsIHBhdGguam9pbignLycsIGhlYWRlci5uYW1lKSlcblxuICAgIGlmIChpZ25vcmUobmFtZSwgaGVhZGVyKSkge1xuICAgICAgc3RyZWFtLnJlc3VtZSgpXG4gICAgICByZXR1cm4gbmV4dCgpXG4gICAgfVxuXG4gICAgaWYgKGhlYWRlci50eXBlID09PSAnZGlyZWN0b3J5Jykge1xuICAgICAgc3RhY2sucHVzaChbbmFtZSwgaGVhZGVyLm10aW1lXSlcbiAgICAgIHJldHVybiBta2RpcmZpeChuYW1lLCB7XG4gICAgICAgIGZzOiB4ZnMsXG4gICAgICAgIG93bixcbiAgICAgICAgdWlkOiBoZWFkZXIudWlkLFxuICAgICAgICBnaWQ6IGhlYWRlci5naWQsXG4gICAgICAgIG1vZGU6IGhlYWRlci5tb2RlXG4gICAgICB9LCBzdGF0KVxuICAgIH1cblxuICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShuYW1lKVxuXG4gICAgdmFsaWRhdGUoeGZzLCBkaXIsIHBhdGguam9pbihjd2QsICcuJyksIGZ1bmN0aW9uIChlcnIsIHZhbGlkKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG4gICAgICBpZiAoIXZhbGlkKSByZXR1cm4gbmV4dChuZXcgRXJyb3IoZGlyICsgJyBpcyBub3QgYSB2YWxpZCBwYXRoJykpXG5cbiAgICAgIG1rZGlyZml4KGRpciwge1xuICAgICAgICBmczogeGZzLFxuICAgICAgICBvd24sXG4gICAgICAgIHVpZDogaGVhZGVyLnVpZCxcbiAgICAgICAgZ2lkOiBoZWFkZXIuZ2lkLFxuICAgICAgICAvLyBub3JtYWxseSwgdGhlIGZvbGRlcnMgd2l0aCByaWdodHMgYW5kIG93bmVyIHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBUQVIgZmlsZVxuICAgICAgICAvLyBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgY3JlYXRlIGZvbGRlciBmb3Igc2FtZSB1c2VyIGFzIGZpbGUgYW5kIHdpdGhcbiAgICAgICAgLy8gc3RhbmRhcmQgcGVybWlzc2lvbnMgb2YgMG83NTUgKHJ3eHIteHIteClcbiAgICAgICAgbW9kZTogMG83NTVcbiAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIG5leHQoZXJyKVxuXG4gICAgICAgIHN3aXRjaCAoaGVhZGVyLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdmaWxlJzogcmV0dXJuIG9uZmlsZSgpXG4gICAgICAgICAgY2FzZSAnbGluayc6IHJldHVybiBvbmxpbmsoKVxuICAgICAgICAgIGNhc2UgJ3N5bWxpbmsnOiByZXR1cm4gb25zeW1saW5rKClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdHJpY3QpIHJldHVybiBuZXh0KG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgdHlwZSBmb3IgJyArIG5hbWUgKyAnICgnICsgaGVhZGVyLnR5cGUgKyAnKScpKVxuXG4gICAgICAgIHN0cmVhbS5yZXN1bWUoKVxuICAgICAgICBuZXh0KClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIHN0YXQgKGVycikge1xuICAgICAgaWYgKGVycikgcmV0dXJuIG5leHQoZXJyKVxuICAgICAgdXRpbWVzKG5hbWUsIGhlYWRlciwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG4gICAgICAgIGlmICh3aW4zMikgcmV0dXJuIG5leHQoKVxuICAgICAgICBjaHBlcm0obmFtZSwgaGVhZGVyLCBuZXh0KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbnN5bWxpbmsgKCkge1xuICAgICAgaWYgKHdpbjMyKSByZXR1cm4gbmV4dCgpIC8vIHNraXAgc3ltbGlua3Mgb24gd2luIGZvciBub3cgYmVmb3JlIGl0IGNhbiBiZSB0ZXN0ZWRcbiAgICAgIHhmcy51bmxpbmsobmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICB4ZnMuc3ltbGluayhoZWFkZXIubGlua25hbWUsIG5hbWUsIHN0YXQpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9ubGluayAoKSB7XG4gICAgICBpZiAod2luMzIpIHJldHVybiBuZXh0KCkgLy8gc2tpcCBsaW5rcyBvbiB3aW4gZm9yIG5vdyBiZWZvcmUgaXQgY2FuIGJlIHRlc3RlZFxuICAgICAgeGZzLnVubGluayhuYW1lLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNyY3BhdGggPSBwYXRoLmpvaW4oY3dkLCBwYXRoLmpvaW4oJy8nLCBoZWFkZXIubGlua25hbWUpKVxuXG4gICAgICAgIHhmcy5saW5rKHNyY3BhdGgsIG5hbWUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRVBFUk0nICYmIG9wdHMuaGFyZGxpbmtBc0ZpbGVzRmFsbGJhY2spIHtcbiAgICAgICAgICAgIHN0cmVhbSA9IHhmcy5jcmVhdGVSZWFkU3RyZWFtKHNyY3BhdGgpXG4gICAgICAgICAgICByZXR1cm4gb25maWxlKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdGF0KGVycilcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25maWxlICgpIHtcbiAgICAgIGNvbnN0IHdzID0geGZzLmNyZWF0ZVdyaXRlU3RyZWFtKG5hbWUpXG4gICAgICBjb25zdCBycyA9IG1hcFN0cmVhbShzdHJlYW0sIGhlYWRlcilcblxuICAgICAgd3Mub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikgeyAvLyBhbHdheXMgZm9yd2FyZCBlcnJvcnMgb24gZGVzdHJveVxuICAgICAgICBycy5kZXN0cm95KGVycilcbiAgICAgIH0pXG5cbiAgICAgIHB1bXAocnMsIHdzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIpIHJldHVybiBuZXh0KGVycilcbiAgICAgICAgd3Mub24oJ2Nsb3NlJywgc3RhdClcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXRpbWVzUGFyZW50IChuYW1lLCBjYikgeyAvLyB3ZSBqdXN0IHNldCB0aGUgbXRpbWUgb24gdGhlIHBhcmVudCBkaXIgYWdhaW4gZXZlcnl0aW1lIHdlIHdyaXRlIGFuIGVudHJ5XG4gICAgbGV0IHRvcFxuICAgIHdoaWxlICgodG9wID0gaGVhZChzdGFjaykpICYmIG5hbWUuc2xpY2UoMCwgdG9wWzBdLmxlbmd0aCkgIT09IHRvcFswXSkgc3RhY2sucG9wKClcbiAgICBpZiAoIXRvcCkgcmV0dXJuIGNiKClcbiAgICB4ZnMudXRpbWVzKHRvcFswXSwgbm93LCB0b3BbMV0sIGNiKVxuICB9XG5cbiAgZnVuY3Rpb24gdXRpbWVzIChuYW1lLCBoZWFkZXIsIGNiKSB7XG4gICAgaWYgKG9wdHMudXRpbWVzID09PSBmYWxzZSkgcmV0dXJuIGNiKClcblxuICAgIGlmIChoZWFkZXIudHlwZSA9PT0gJ2RpcmVjdG9yeScpIHJldHVybiB4ZnMudXRpbWVzKG5hbWUsIG5vdywgaGVhZGVyLm10aW1lLCBjYilcbiAgICBpZiAoaGVhZGVyLnR5cGUgPT09ICdzeW1saW5rJykgcmV0dXJuIHV0aW1lc1BhcmVudChuYW1lLCBjYikgLy8gVE9ETzogaG93IHRvIHNldCBtdGltZSBvbiBsaW5rP1xuXG4gICAgeGZzLnV0aW1lcyhuYW1lLCBub3csIGhlYWRlci5tdGltZSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgIHV0aW1lc1BhcmVudChuYW1lLCBjYilcbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gY2hwZXJtIChuYW1lLCBoZWFkZXIsIGNiKSB7XG4gICAgY29uc3QgbGluayA9IGhlYWRlci50eXBlID09PSAnc3ltbGluaydcblxuICAgIC8qIGVzbGludC1kaXNhYmxlIG4vbm8tZGVwcmVjYXRlZC1hcGkgKi9cbiAgICBjb25zdCBjaG1vZCA9IGxpbmsgPyB4ZnMubGNobW9kIDogeGZzLmNobW9kXG4gICAgY29uc3QgY2hvd24gPSBsaW5rID8geGZzLmxjaG93biA6IHhmcy5jaG93blxuICAgIC8qIGVzbGludC1lbmFibGUgbi9uby1kZXByZWNhdGVkLWFwaSAqL1xuXG4gICAgaWYgKCFjaG1vZCkgcmV0dXJuIGNiKClcblxuICAgIGNvbnN0IG1vZGUgPSAoaGVhZGVyLm1vZGUgfCAoaGVhZGVyLnR5cGUgPT09ICdkaXJlY3RvcnknID8gZG1vZGUgOiBmbW9kZSkpICYgdW1hc2tcblxuICAgIGlmIChjaG93biAmJiBvd24pIGNob3duLmNhbGwoeGZzLCBuYW1lLCBoZWFkZXIudWlkLCBoZWFkZXIuZ2lkLCBvbmNob3duKVxuICAgIGVsc2Ugb25jaG93bihudWxsKVxuXG4gICAgZnVuY3Rpb24gb25jaG93biAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgICAgaWYgKCFjaG1vZCkgcmV0dXJuIGNiKClcbiAgICAgIGNobW9kLmNhbGwoeGZzLCBuYW1lLCBtb2RlLCBjYilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBta2RpcmZpeCAobmFtZSwgb3B0cywgY2IpIHtcbiAgICAvLyB3aGVuIG1rZGlyIGlzIGNhbGxlZCBvbiBhbiBleGlzdGluZyBkaXJlY3RvcnksIHRoZSBwZXJtaXNzaW9uc1xuICAgIC8vIHdpbGwgYmUgb3ZlcndyaXR0ZW4gKD8pLCB0byBhdm9pZCB0aGlzIHdlIGNoZWNrIGZvciBpdHMgZXhpc3RhbmNlIGZpcnN0XG4gICAgeGZzLnN0YXQobmFtZSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKCFlcnIpIHJldHVybiBjYihudWxsKVxuICAgICAgaWYgKGVyci5jb2RlICE9PSAnRU5PRU5UJykgcmV0dXJuIGNiKGVycilcbiAgICAgIHhmcy5ta2RpcihuYW1lLCB7IG1vZGU6IG9wdHMubW9kZSwgcmVjdXJzaXZlOiB0cnVlIH0sIGZ1bmN0aW9uIChlcnIsIG1hZGUpIHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgICAgY2hwZXJtKG5hbWUsIG9wdHMsIGNiKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlIChmcywgbmFtZSwgcm9vdCwgY2IpIHtcbiAgaWYgKG5hbWUgPT09IHJvb3QpIHJldHVybiBjYihudWxsLCB0cnVlKVxuICBmcy5sc3RhdChuYW1lLCBmdW5jdGlvbiAoZXJyLCBzdCkge1xuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gdmFsaWRhdGUoZnMsIHBhdGguam9pbihuYW1lLCAnLi4nKSwgcm9vdCwgY2IpXG4gICAgZWxzZSBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICAgIGNiKG51bGwsIHN0LmlzRGlyZWN0b3J5KCkpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIG5vb3AgKCkge31cblxuZnVuY3Rpb24gZWNobyAobmFtZSkge1xuICByZXR1cm4gbmFtZVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemUgKG5hbWUpIHtcbiAgcmV0dXJuIHdpbjMyID8gbmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJykucmVwbGFjZSgvWzo/PD58XS9nLCAnXycpIDogbmFtZVxufVxuXG5mdW5jdGlvbiBzdGF0QWxsIChmcywgc3RhdCwgY3dkLCBpZ25vcmUsIGVudHJpZXMsIHNvcnQpIHtcbiAgaWYgKCFlbnRyaWVzKSBlbnRyaWVzID0gWycuJ11cbiAgY29uc3QgcXVldWUgPSBlbnRyaWVzLnNsaWNlKDApXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIGxvb3AgKGNhbGxiYWNrKSB7XG4gICAgaWYgKCFxdWV1ZS5sZW5ndGgpIHJldHVybiBjYWxsYmFjayhudWxsKVxuXG4gICAgY29uc3QgbmV4dCA9IHF1ZXVlLnNoaWZ0KClcbiAgICBjb25zdCBuZXh0QWJzID0gcGF0aC5qb2luKGN3ZCwgbmV4dClcblxuICAgIHN0YXQuY2FsbChmcywgbmV4dEFicywgZnVuY3Rpb24gKGVyciwgc3RhdCkge1xuICAgICAgLy8gaWdub3JlIGVycm9ycyBpZiB0aGUgZmlsZXMgd2VyZSBkZWxldGVkIHdoaWxlIGJ1ZmZlcmluZ1xuICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVudHJpZXMuaW5kZXhPZihuZXh0KSA9PT0gLTEgJiYgZXJyLmNvZGUgPT09ICdFTk9FTlQnID8gbnVsbCA6IGVycilcblxuICAgICAgaWYgKCFzdGF0LmlzRGlyZWN0b3J5KCkpIHJldHVybiBjYWxsYmFjayhudWxsLCBuZXh0LCBzdGF0KVxuXG4gICAgICBmcy5yZWFkZGlyKG5leHRBYnMsIGZ1bmN0aW9uIChlcnIsIGZpbGVzKSB7XG4gICAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpXG5cbiAgICAgICAgaWYgKHNvcnQpIGZpbGVzLnNvcnQoKVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIWlnbm9yZShwYXRoLmpvaW4oY3dkLCBuZXh0LCBmaWxlc1tpXSkpKSBxdWV1ZS5wdXNoKHBhdGguam9pbihuZXh0LCBmaWxlc1tpXSkpXG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhudWxsLCBuZXh0LCBzdGF0KVxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmlwIChtYXAsIGxldmVsKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoaGVhZGVyKSB7XG4gICAgaGVhZGVyLm5hbWUgPSBoZWFkZXIubmFtZS5zcGxpdCgnLycpLnNsaWNlKGxldmVsKS5qb2luKCcvJylcblxuICAgIGNvbnN0IGxpbmtuYW1lID0gaGVhZGVyLmxpbmtuYW1lXG4gICAgaWYgKGxpbmtuYW1lICYmIChoZWFkZXIudHlwZSA9PT0gJ2xpbmsnIHx8IHBhdGguaXNBYnNvbHV0ZShsaW5rbmFtZSkpKSB7XG4gICAgICBoZWFkZXIubGlua25hbWUgPSBsaW5rbmFtZS5zcGxpdCgnLycpLnNsaWNlKGxldmVsKS5qb2luKCcvJylcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwKGhlYWRlcilcbiAgfVxufVxuIiwiY29uc3QgY29uc3RhbnRzID0geyAvLyBqdXN0IGZvciBlbnZzIHdpdGhvdXQgZnNcbiAgU19JRk1UOiA2MTQ0MCxcbiAgU19JRkRJUjogMTYzODQsXG4gIFNfSUZDSFI6IDgxOTIsXG4gIFNfSUZCTEs6IDI0NTc2LFxuICBTX0lGSUZPOiA0MDk2LFxuICBTX0lGTE5LOiA0MDk2MFxufVxuXG50cnkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2ZzJykuY29uc3RhbnRzIHx8IGNvbnN0YW50c1xufSBjYXRjaCB7XG4gIG1vZHVsZS5leHBvcnRzID0gY29uc3RhbnRzXG59XG4iLCJjb25zdCB7IFdyaXRhYmxlLCBSZWFkYWJsZSwgZ2V0U3RyZWFtRXJyb3IgfSA9IHJlcXVpcmUoJ3N0cmVhbXgnKVxuY29uc3QgRklGTyA9IHJlcXVpcmUoJ2Zhc3QtZmlmbycpXG5jb25zdCBiNGEgPSByZXF1aXJlKCdiNGEnKVxuY29uc3QgaGVhZGVycyA9IHJlcXVpcmUoJy4vaGVhZGVycycpXG5cbmNvbnN0IEVNUFRZID0gYjRhLmFsbG9jKDApXG5cbmNsYXNzIEJ1ZmZlckxpc3Qge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5idWZmZXJlZCA9IDBcbiAgICB0aGlzLnNoaWZ0ZWQgPSAwXG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBGSUZPKClcblxuICAgIHRoaXMuX29mZnNldCA9IDBcbiAgfVxuXG4gIHB1c2ggKGJ1ZmZlcikge1xuICAgIHRoaXMuYnVmZmVyZWQgKz0gYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICB0aGlzLnF1ZXVlLnB1c2goYnVmZmVyKVxuICB9XG5cbiAgc2hpZnRGaXJzdCAoc2l6ZSkge1xuICAgIHJldHVybiB0aGlzLl9idWZmZXJlZCA9PT0gMCA/IG51bGwgOiB0aGlzLl9uZXh0KHNpemUpXG4gIH1cblxuICBzaGlmdCAoc2l6ZSkge1xuICAgIGlmIChzaXplID4gdGhpcy5idWZmZXJlZCkgcmV0dXJuIG51bGxcbiAgICBpZiAoc2l6ZSA9PT0gMCkgcmV0dXJuIEVNUFRZXG5cbiAgICBsZXQgY2h1bmsgPSB0aGlzLl9uZXh0KHNpemUpXG5cbiAgICBpZiAoc2l6ZSA9PT0gY2h1bmsuYnl0ZUxlbmd0aCkgcmV0dXJuIGNodW5rIC8vIGxpa2VseSBjYXNlXG5cbiAgICBjb25zdCBjaHVua3MgPSBbY2h1bmtdXG5cbiAgICB3aGlsZSAoKHNpemUgLT0gY2h1bmsuYnl0ZUxlbmd0aCkgPiAwKSB7XG4gICAgICBjaHVuayA9IHRoaXMuX25leHQoc2l6ZSlcbiAgICAgIGNodW5rcy5wdXNoKGNodW5rKVxuICAgIH1cblxuICAgIHJldHVybiBiNGEuY29uY2F0KGNodW5rcylcbiAgfVxuXG4gIF9uZXh0IChzaXplKSB7XG4gICAgY29uc3QgYnVmID0gdGhpcy5xdWV1ZS5wZWVrKClcbiAgICBjb25zdCByZW0gPSBidWYuYnl0ZUxlbmd0aCAtIHRoaXMuX29mZnNldFxuXG4gICAgaWYgKHNpemUgPj0gcmVtKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9vZmZzZXQgPyBidWYuc3ViYXJyYXkodGhpcy5fb2Zmc2V0LCBidWYuYnl0ZUxlbmd0aCkgOiBidWZcbiAgICAgIHRoaXMucXVldWUuc2hpZnQoKVxuICAgICAgdGhpcy5fb2Zmc2V0ID0gMFxuICAgICAgdGhpcy5idWZmZXJlZCAtPSByZW1cbiAgICAgIHRoaXMuc2hpZnRlZCArPSByZW1cbiAgICAgIHJldHVybiBzdWJcbiAgICB9XG5cbiAgICB0aGlzLmJ1ZmZlcmVkIC09IHNpemVcbiAgICB0aGlzLnNoaWZ0ZWQgKz0gc2l6ZVxuXG4gICAgcmV0dXJuIGJ1Zi5zdWJhcnJheSh0aGlzLl9vZmZzZXQsICh0aGlzLl9vZmZzZXQgKz0gc2l6ZSkpXG4gIH1cbn1cblxuY2xhc3MgU291cmNlIGV4dGVuZHMgUmVhZGFibGUge1xuICBjb25zdHJ1Y3RvciAoc2VsZiwgaGVhZGVyLCBvZmZzZXQpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzLmhlYWRlciA9IGhlYWRlclxuICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0XG5cbiAgICB0aGlzLl9wYXJlbnQgPSBzZWxmXG4gIH1cblxuICBfcmVhZCAoY2IpIHtcbiAgICBpZiAodGhpcy5oZWFkZXIuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5wdXNoKG51bGwpXG4gICAgfVxuICAgIGlmICh0aGlzLl9wYXJlbnQuX3N0cmVhbSA9PT0gdGhpcykge1xuICAgICAgdGhpcy5fcGFyZW50Ll91cGRhdGUoKVxuICAgIH1cbiAgICBjYihudWxsKVxuICB9XG5cbiAgX3ByZWRlc3Ryb3kgKCkge1xuICAgIHRoaXMuX3BhcmVudC5kZXN0cm95KGdldFN0cmVhbUVycm9yKHRoaXMpKVxuICB9XG5cbiAgX2RldGFjaCAoKSB7XG4gICAgaWYgKHRoaXMuX3BhcmVudC5fc3RyZWFtID09PSB0aGlzKSB7XG4gICAgICB0aGlzLl9wYXJlbnQuX3N0cmVhbSA9IG51bGxcbiAgICAgIHRoaXMuX3BhcmVudC5fbWlzc2luZyA9IG92ZXJmbG93KHRoaXMuaGVhZGVyLnNpemUpXG4gICAgICB0aGlzLl9wYXJlbnQuX3VwZGF0ZSgpXG4gICAgfVxuICB9XG5cbiAgX2Rlc3Ryb3kgKGNiKSB7XG4gICAgdGhpcy5fZGV0YWNoKClcbiAgICBjYihudWxsKVxuICB9XG59XG5cbmNsYXNzIEV4dHJhY3QgZXh0ZW5kcyBXcml0YWJsZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcblxuICAgIGlmICghb3B0cykgb3B0cyA9IHt9XG5cbiAgICB0aGlzLl9idWZmZXIgPSBuZXcgQnVmZmVyTGlzdCgpXG4gICAgdGhpcy5fb2Zmc2V0ID0gMFxuICAgIHRoaXMuX2hlYWRlciA9IG51bGxcbiAgICB0aGlzLl9zdHJlYW0gPSBudWxsXG4gICAgdGhpcy5fbWlzc2luZyA9IDBcbiAgICB0aGlzLl9sb25nSGVhZGVyID0gZmFsc2VcbiAgICB0aGlzLl9jYWxsYmFjayA9IG5vb3BcbiAgICB0aGlzLl9sb2NrZWQgPSBmYWxzZVxuICAgIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2VcbiAgICB0aGlzLl9wYXggPSBudWxsXG4gICAgdGhpcy5fcGF4R2xvYmFsID0gbnVsbFxuICAgIHRoaXMuX2dudUxvbmdQYXRoID0gbnVsbFxuICAgIHRoaXMuX2dudUxvbmdMaW5rUGF0aCA9IG51bGxcbiAgICB0aGlzLl9maWxlbmFtZUVuY29kaW5nID0gb3B0cy5maWxlbmFtZUVuY29kaW5nIHx8ICd1dGYtOCdcbiAgICB0aGlzLl9hbGxvd1Vua25vd25Gb3JtYXQgPSAhIW9wdHMuYWxsb3dVbmtub3duRm9ybWF0XG4gICAgdGhpcy5fdW5sb2NrQm91bmQgPSB0aGlzLl91bmxvY2suYmluZCh0aGlzKVxuICB9XG5cbiAgX3VubG9jayAoZXJyKSB7XG4gICAgdGhpcy5fbG9ja2VkID0gZmFsc2VcblxuICAgIGlmIChlcnIpIHtcbiAgICAgIHRoaXMuZGVzdHJveShlcnIpXG4gICAgICB0aGlzLl9jb250aW51ZVdyaXRlKGVycilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZSgpXG4gIH1cblxuICBfY29uc3VtZUhlYWRlciAoKSB7XG4gICAgaWYgKHRoaXMuX2xvY2tlZCkgcmV0dXJuIGZhbHNlXG5cbiAgICB0aGlzLl9vZmZzZXQgPSB0aGlzLl9idWZmZXIuc2hpZnRlZFxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2hlYWRlciA9IGhlYWRlcnMuZGVjb2RlKHRoaXMuX2J1ZmZlci5zaGlmdCg1MTIpLCB0aGlzLl9maWxlbmFtZUVuY29kaW5nLCB0aGlzLl9hbGxvd1Vua25vd25Gb3JtYXQpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9jb250aW51ZVdyaXRlKGVycilcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICghdGhpcy5faGVhZGVyKSByZXR1cm4gdHJ1ZVxuXG4gICAgc3dpdGNoICh0aGlzLl9oZWFkZXIudHlwZSkge1xuICAgICAgY2FzZSAnZ251LWxvbmctcGF0aCc6XG4gICAgICBjYXNlICdnbnUtbG9uZy1saW5rLXBhdGgnOlxuICAgICAgY2FzZSAncGF4LWdsb2JhbC1oZWFkZXInOlxuICAgICAgY2FzZSAncGF4LWhlYWRlcic6XG4gICAgICAgIHRoaXMuX2xvbmdIZWFkZXIgPSB0cnVlXG4gICAgICAgIHRoaXMuX21pc3NpbmcgPSB0aGlzLl9oZWFkZXIuc2l6ZVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHRoaXMuX2xvY2tlZCA9IHRydWVcbiAgICB0aGlzLl9hcHBseUxvbmdIZWFkZXJzKClcblxuICAgIGlmICh0aGlzLl9oZWFkZXIuc2l6ZSA9PT0gMCB8fCB0aGlzLl9oZWFkZXIudHlwZSA9PT0gJ2RpcmVjdG9yeScpIHtcbiAgICAgIHRoaXMuZW1pdCgnZW50cnknLCB0aGlzLl9oZWFkZXIsIHRoaXMuX2NyZWF0ZVN0cmVhbSgpLCB0aGlzLl91bmxvY2tCb3VuZClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgdGhpcy5fc3RyZWFtID0gdGhpcy5fY3JlYXRlU3RyZWFtKClcbiAgICB0aGlzLl9taXNzaW5nID0gdGhpcy5faGVhZGVyLnNpemVcblxuICAgIHRoaXMuZW1pdCgnZW50cnknLCB0aGlzLl9oZWFkZXIsIHRoaXMuX3N0cmVhbSwgdGhpcy5fdW5sb2NrQm91bmQpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIF9hcHBseUxvbmdIZWFkZXJzICgpIHtcbiAgICBpZiAodGhpcy5fZ251TG9uZ1BhdGgpIHtcbiAgICAgIHRoaXMuX2hlYWRlci5uYW1lID0gdGhpcy5fZ251TG9uZ1BhdGhcbiAgICAgIHRoaXMuX2dudUxvbmdQYXRoID0gbnVsbFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9nbnVMb25nTGlua1BhdGgpIHtcbiAgICAgIHRoaXMuX2hlYWRlci5saW5rbmFtZSA9IHRoaXMuX2dudUxvbmdMaW5rUGF0aFxuICAgICAgdGhpcy5fZ251TG9uZ0xpbmtQYXRoID0gbnVsbFxuICAgIH1cblxuICAgIGlmICh0aGlzLl9wYXgpIHtcbiAgICAgIGlmICh0aGlzLl9wYXgucGF0aCkgdGhpcy5faGVhZGVyLm5hbWUgPSB0aGlzLl9wYXgucGF0aFxuICAgICAgaWYgKHRoaXMuX3BheC5saW5rcGF0aCkgdGhpcy5faGVhZGVyLmxpbmtuYW1lID0gdGhpcy5fcGF4LmxpbmtwYXRoXG4gICAgICBpZiAodGhpcy5fcGF4LnNpemUpIHRoaXMuX2hlYWRlci5zaXplID0gcGFyc2VJbnQodGhpcy5fcGF4LnNpemUsIDEwKVxuICAgICAgdGhpcy5faGVhZGVyLnBheCA9IHRoaXMuX3BheFxuICAgICAgdGhpcy5fcGF4ID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIF9kZWNvZGVMb25nSGVhZGVyIChidWYpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX2hlYWRlci50eXBlKSB7XG4gICAgICBjYXNlICdnbnUtbG9uZy1wYXRoJzpcbiAgICAgICAgdGhpcy5fZ251TG9uZ1BhdGggPSBoZWFkZXJzLmRlY29kZUxvbmdQYXRoKGJ1ZiwgdGhpcy5fZmlsZW5hbWVFbmNvZGluZylcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ2dudS1sb25nLWxpbmstcGF0aCc6XG4gICAgICAgIHRoaXMuX2dudUxvbmdMaW5rUGF0aCA9IGhlYWRlcnMuZGVjb2RlTG9uZ1BhdGgoYnVmLCB0aGlzLl9maWxlbmFtZUVuY29kaW5nKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncGF4LWdsb2JhbC1oZWFkZXInOlxuICAgICAgICB0aGlzLl9wYXhHbG9iYWwgPSBoZWFkZXJzLmRlY29kZVBheChidWYpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwYXgtaGVhZGVyJzpcbiAgICAgICAgdGhpcy5fcGF4ID0gdGhpcy5fcGF4R2xvYmFsID09PSBudWxsXG4gICAgICAgICAgPyBoZWFkZXJzLmRlY29kZVBheChidWYpXG4gICAgICAgICAgOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9wYXhHbG9iYWwsIGhlYWRlcnMuZGVjb2RlUGF4KGJ1ZikpXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgX2NvbnN1bWVMb25nSGVhZGVyICgpIHtcbiAgICB0aGlzLl9sb25nSGVhZGVyID0gZmFsc2VcbiAgICB0aGlzLl9taXNzaW5nID0gb3ZlcmZsb3codGhpcy5faGVhZGVyLnNpemUpXG5cbiAgICBjb25zdCBidWYgPSB0aGlzLl9idWZmZXIuc2hpZnQodGhpcy5faGVhZGVyLnNpemUpXG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fZGVjb2RlTG9uZ0hlYWRlcihidWYpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9jb250aW51ZVdyaXRlKGVycilcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBfY29uc3VtZVN0cmVhbSAoKSB7XG4gICAgY29uc3QgYnVmID0gdGhpcy5fYnVmZmVyLnNoaWZ0Rmlyc3QodGhpcy5fbWlzc2luZylcbiAgICBpZiAoYnVmID09PSBudWxsKSByZXR1cm4gZmFsc2VcblxuICAgIHRoaXMuX21pc3NpbmcgLT0gYnVmLmJ5dGVMZW5ndGhcbiAgICBjb25zdCBkcmFpbmVkID0gdGhpcy5fc3RyZWFtLnB1c2goYnVmKVxuXG4gICAgaWYgKHRoaXMuX21pc3NpbmcgPT09IDApIHtcbiAgICAgIHRoaXMuX3N0cmVhbS5wdXNoKG51bGwpXG4gICAgICBpZiAoZHJhaW5lZCkgdGhpcy5fc3RyZWFtLl9kZXRhY2goKVxuICAgICAgcmV0dXJuIGRyYWluZWQgJiYgdGhpcy5fbG9ja2VkID09PSBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiBkcmFpbmVkXG4gIH1cblxuICBfY3JlYXRlU3RyZWFtICgpIHtcbiAgICByZXR1cm4gbmV3IFNvdXJjZSh0aGlzLCB0aGlzLl9oZWFkZXIsIHRoaXMuX29mZnNldClcbiAgfVxuXG4gIF91cGRhdGUgKCkge1xuICAgIHdoaWxlICh0aGlzLl9idWZmZXIuYnVmZmVyZWQgPiAwICYmICF0aGlzLmRlc3Ryb3lpbmcpIHtcbiAgICAgIGlmICh0aGlzLl9taXNzaW5nID4gMCkge1xuICAgICAgICBpZiAodGhpcy5fc3RyZWFtICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2NvbnN1bWVTdHJlYW0oKSA9PT0gZmFsc2UpIHJldHVyblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbG9uZ0hlYWRlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGlmICh0aGlzLl9taXNzaW5nID4gdGhpcy5fYnVmZmVyLmJ1ZmZlcmVkKSBicmVha1xuICAgICAgICAgIGlmICh0aGlzLl9jb25zdW1lTG9uZ0hlYWRlcigpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlnbm9yZSA9IHRoaXMuX2J1ZmZlci5zaGlmdEZpcnN0KHRoaXMuX21pc3NpbmcpXG4gICAgICAgIGlmIChpZ25vcmUgIT09IG51bGwpIHRoaXMuX21pc3NpbmcgLT0gaWdub3JlLmJ5dGVMZW5ndGhcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2J1ZmZlci5idWZmZXJlZCA8IDUxMikgYnJlYWtcbiAgICAgIGlmICh0aGlzLl9zdHJlYW0gIT09IG51bGwgfHwgdGhpcy5fY29uc3VtZUhlYWRlcigpID09PSBmYWxzZSkgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fY29udGludWVXcml0ZShudWxsKVxuICB9XG5cbiAgX2NvbnRpbnVlV3JpdGUgKGVycikge1xuICAgIGNvbnN0IGNiID0gdGhpcy5fY2FsbGJhY2tcbiAgICB0aGlzLl9jYWxsYmFjayA9IG5vb3BcbiAgICBjYihlcnIpXG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgdGhpcy5fY2FsbGJhY2sgPSBjYlxuICAgIHRoaXMuX2J1ZmZlci5wdXNoKGRhdGEpXG4gICAgdGhpcy5fdXBkYXRlKClcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICB0aGlzLl9maW5pc2hlZCA9IHRoaXMuX21pc3NpbmcgPT09IDAgJiYgdGhpcy5fYnVmZmVyLmJ1ZmZlcmVkID09PSAwXG4gICAgY2IodGhpcy5fZmluaXNoZWQgPyBudWxsIDogbmV3IEVycm9yKCdVbmV4cGVjdGVkIGVuZCBvZiBkYXRhJykpXG4gIH1cblxuICBfcHJlZGVzdHJveSAoKSB7XG4gICAgdGhpcy5fY29udGludWVXcml0ZShudWxsKVxuICB9XG5cbiAgX2Rlc3Ryb3kgKGNiKSB7XG4gICAgaWYgKHRoaXMuX3N0cmVhbSkgdGhpcy5fc3RyZWFtLmRlc3Ryb3koZ2V0U3RyZWFtRXJyb3IodGhpcykpXG4gICAgY2IobnVsbClcbiAgfVxuXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gKCkge1xuICAgIGxldCBlcnJvciA9IG51bGxcblxuICAgIGxldCBwcm9taXNlUmVzb2x2ZSA9IG51bGxcbiAgICBsZXQgcHJvbWlzZVJlamVjdCA9IG51bGxcblxuICAgIGxldCBlbnRyeVN0cmVhbSA9IG51bGxcbiAgICBsZXQgZW50cnlDYWxsYmFjayA9IG51bGxcblxuICAgIGNvbnN0IGV4dHJhY3QgPSB0aGlzXG5cbiAgICB0aGlzLm9uKCdlbnRyeScsIG9uZW50cnkpXG4gICAgdGhpcy5vbignZXJyb3InLCAoZXJyKSA9PiB7IGVycm9yID0gZXJyIH0pXG4gICAgdGhpcy5vbignY2xvc2UnLCBvbmNsb3NlKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gKCkge1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfSxcbiAgICAgIG5leHQgKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2Uob25uZXh0KVxuICAgICAgfSxcbiAgICAgIHJldHVybiAoKSB7XG4gICAgICAgIHJldHVybiBkZXN0cm95KG51bGwpXG4gICAgICB9LFxuICAgICAgdGhyb3cgKGVycikge1xuICAgICAgICByZXR1cm4gZGVzdHJveShlcnIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uc3VtZUNhbGxiYWNrIChlcnIpIHtcbiAgICAgIGlmICghZW50cnlDYWxsYmFjaykgcmV0dXJuXG4gICAgICBjb25zdCBjYiA9IGVudHJ5Q2FsbGJhY2tcbiAgICAgIGVudHJ5Q2FsbGJhY2sgPSBudWxsXG4gICAgICBjYihlcnIpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25uZXh0IChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKVxuICAgICAgfVxuXG4gICAgICBpZiAoZW50cnlTdHJlYW0pIHtcbiAgICAgICAgcmVzb2x2ZSh7IHZhbHVlOiBlbnRyeVN0cmVhbSwgZG9uZTogZmFsc2UgfSlcbiAgICAgICAgZW50cnlTdHJlYW0gPSBudWxsXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBwcm9taXNlUmVzb2x2ZSA9IHJlc29sdmVcbiAgICAgIHByb21pc2VSZWplY3QgPSByZWplY3RcblxuICAgICAgY29uc3VtZUNhbGxiYWNrKG51bGwpXG5cbiAgICAgIGlmIChleHRyYWN0Ll9maW5pc2hlZCAmJiBwcm9taXNlUmVzb2x2ZSkge1xuICAgICAgICBwcm9taXNlUmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgcHJvbWlzZVJlc29sdmUgPSBwcm9taXNlUmVqZWN0ID0gbnVsbFxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uZW50cnkgKGhlYWRlciwgc3RyZWFtLCBjYWxsYmFjaykge1xuICAgICAgZW50cnlDYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgbm9vcCkgLy8gbm8gd2F5IGFyb3VuZCB0aGlzIGR1ZSB0byB0aWNrIHNpbGx5bmVzc1xuXG4gICAgICBpZiAocHJvbWlzZVJlc29sdmUpIHtcbiAgICAgICAgcHJvbWlzZVJlc29sdmUoeyB2YWx1ZTogc3RyZWFtLCBkb25lOiBmYWxzZSB9KVxuICAgICAgICBwcm9taXNlUmVzb2x2ZSA9IHByb21pc2VSZWplY3QgPSBudWxsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyeVN0cmVhbSA9IHN0cmVhbVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgY29uc3VtZUNhbGxiYWNrKGVycm9yKVxuICAgICAgaWYgKCFwcm9taXNlUmVzb2x2ZSkgcmV0dXJuXG4gICAgICBpZiAoZXJyb3IpIHByb21pc2VSZWplY3QoZXJyb3IpXG4gICAgICBlbHNlIHByb21pc2VSZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgcHJvbWlzZVJlc29sdmUgPSBwcm9taXNlUmVqZWN0ID0gbnVsbFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc3Ryb3kgKGVycikge1xuICAgICAgZXh0cmFjdC5kZXN0cm95KGVycilcbiAgICAgIGNvbnN1bWVDYWxsYmFjayhlcnIpXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAoZXh0cmFjdC5kZXN0cm95ZWQpIHJldHVybiByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICBleHRyYWN0Lm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpXG4gICAgICAgICAgZWxzZSByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBleHRyYWN0IChvcHRzKSB7XG4gIHJldHVybiBuZXcgRXh0cmFjdChvcHRzKVxufVxuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIG92ZXJmbG93IChzaXplKSB7XG4gIHNpemUgJj0gNTExXG4gIHJldHVybiBzaXplICYmIDUxMiAtIHNpemVcbn1cbiIsImNvbnN0IGI0YSA9IHJlcXVpcmUoJ2I0YScpXG5cbmNvbnN0IFpFUk9TID0gJzAwMDAwMDAwMDAwMDAwMDAwMDAnXG5jb25zdCBTRVZFTlMgPSAnNzc3Nzc3Nzc3Nzc3Nzc3Nzc3NydcbmNvbnN0IFpFUk9fT0ZGU0VUID0gJzAnLmNoYXJDb2RlQXQoMClcbmNvbnN0IFVTVEFSX01BR0lDID0gYjRhLmZyb20oWzB4NzUsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzIsIDB4MDBdKSAvLyB1c3RhclxceDAwXG5jb25zdCBVU1RBUl9WRVIgPSBiNGEuZnJvbShbWkVST19PRkZTRVQsIFpFUk9fT0ZGU0VUXSlcbmNvbnN0IEdOVV9NQUdJQyA9IGI0YS5mcm9tKFsweDc1LCAweDczLCAweDc0LCAweDYxLCAweDcyLCAweDIwXSkgLy8gdXN0YXJcXHgyMFxuY29uc3QgR05VX1ZFUiA9IGI0YS5mcm9tKFsweDIwLCAweDAwXSlcbmNvbnN0IE1BU0sgPSAwbzc3NzdcbmNvbnN0IE1BR0lDX09GRlNFVCA9IDI1N1xuY29uc3QgVkVSU0lPTl9PRkZTRVQgPSAyNjNcblxuZXhwb3J0cy5kZWNvZGVMb25nUGF0aCA9IGZ1bmN0aW9uIGRlY29kZUxvbmdQYXRoIChidWYsIGVuY29kaW5nKSB7XG4gIHJldHVybiBkZWNvZGVTdHIoYnVmLCAwLCBidWYubGVuZ3RoLCBlbmNvZGluZylcbn1cblxuZXhwb3J0cy5lbmNvZGVQYXggPSBmdW5jdGlvbiBlbmNvZGVQYXggKG9wdHMpIHsgLy8gVE9ETzogZW5jb2RlIG1vcmUgc3R1ZmYgaW4gcGF4XG4gIGxldCByZXN1bHQgPSAnJ1xuICBpZiAob3B0cy5uYW1lKSByZXN1bHQgKz0gYWRkTGVuZ3RoKCcgcGF0aD0nICsgb3B0cy5uYW1lICsgJ1xcbicpXG4gIGlmIChvcHRzLmxpbmtuYW1lKSByZXN1bHQgKz0gYWRkTGVuZ3RoKCcgbGlua3BhdGg9JyArIG9wdHMubGlua25hbWUgKyAnXFxuJylcbiAgY29uc3QgcGF4ID0gb3B0cy5wYXhcbiAgaWYgKHBheCkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHBheCkge1xuICAgICAgcmVzdWx0ICs9IGFkZExlbmd0aCgnICcgKyBrZXkgKyAnPScgKyBwYXhba2V5XSArICdcXG4nKVxuICAgIH1cbiAgfVxuICByZXR1cm4gYjRhLmZyb20ocmVzdWx0KVxufVxuXG5leHBvcnRzLmRlY29kZVBheCA9IGZ1bmN0aW9uIGRlY29kZVBheCAoYnVmKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgd2hpbGUgKGJ1Zi5sZW5ndGgpIHtcbiAgICBsZXQgaSA9IDBcbiAgICB3aGlsZSAoaSA8IGJ1Zi5sZW5ndGggJiYgYnVmW2ldICE9PSAzMikgaSsrXG4gICAgY29uc3QgbGVuID0gcGFyc2VJbnQoYjRhLnRvU3RyaW5nKGJ1Zi5zdWJhcnJheSgwLCBpKSksIDEwKVxuICAgIGlmICghbGVuKSByZXR1cm4gcmVzdWx0XG5cbiAgICBjb25zdCBiID0gYjRhLnRvU3RyaW5nKGJ1Zi5zdWJhcnJheShpICsgMSwgbGVuIC0gMSkpXG4gICAgY29uc3Qga2V5SW5kZXggPSBiLmluZGV4T2YoJz0nKVxuICAgIGlmIChrZXlJbmRleCA9PT0gLTEpIHJldHVybiByZXN1bHRcbiAgICByZXN1bHRbYi5zbGljZSgwLCBrZXlJbmRleCldID0gYi5zbGljZShrZXlJbmRleCArIDEpXG5cbiAgICBidWYgPSBidWYuc3ViYXJyYXkobGVuKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZSAob3B0cykge1xuICBjb25zdCBidWYgPSBiNGEuYWxsb2MoNTEyKVxuICBsZXQgbmFtZSA9IG9wdHMubmFtZVxuICBsZXQgcHJlZml4ID0gJydcblxuICBpZiAob3B0cy50eXBlZmxhZyA9PT0gNSAmJiBuYW1lW25hbWUubGVuZ3RoIC0gMV0gIT09ICcvJykgbmFtZSArPSAnLydcbiAgaWYgKGI0YS5ieXRlTGVuZ3RoKG5hbWUpICE9PSBuYW1lLmxlbmd0aCkgcmV0dXJuIG51bGwgLy8gdXRmLThcblxuICB3aGlsZSAoYjRhLmJ5dGVMZW5ndGgobmFtZSkgPiAxMDApIHtcbiAgICBjb25zdCBpID0gbmFtZS5pbmRleE9mKCcvJylcbiAgICBpZiAoaSA9PT0gLTEpIHJldHVybiBudWxsXG4gICAgcHJlZml4ICs9IHByZWZpeCA/ICcvJyArIG5hbWUuc2xpY2UoMCwgaSkgOiBuYW1lLnNsaWNlKDAsIGkpXG4gICAgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpXG4gIH1cblxuICBpZiAoYjRhLmJ5dGVMZW5ndGgobmFtZSkgPiAxMDAgfHwgYjRhLmJ5dGVMZW5ndGgocHJlZml4KSA+IDE1NSkgcmV0dXJuIG51bGxcbiAgaWYgKG9wdHMubGlua25hbWUgJiYgYjRhLmJ5dGVMZW5ndGgob3B0cy5saW5rbmFtZSkgPiAxMDApIHJldHVybiBudWxsXG5cbiAgYjRhLndyaXRlKGJ1ZiwgbmFtZSlcbiAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG9wdHMubW9kZSAmIE1BU0ssIDYpLCAxMDApXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChvcHRzLnVpZCwgNiksIDEwOClcbiAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG9wdHMuZ2lkLCA2KSwgMTE2KVxuICBlbmNvZGVTaXplKG9wdHMuc2l6ZSwgYnVmLCAxMjQpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdCgob3B0cy5tdGltZS5nZXRUaW1lKCkgLyAxMDAwKSB8IDAsIDExKSwgMTM2KVxuXG4gIGJ1ZlsxNTZdID0gWkVST19PRkZTRVQgKyB0b1R5cGVmbGFnKG9wdHMudHlwZSlcblxuICBpZiAob3B0cy5saW5rbmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy5saW5rbmFtZSwgMTU3KVxuXG4gIGI0YS5jb3B5KFVTVEFSX01BR0lDLCBidWYsIE1BR0lDX09GRlNFVClcbiAgYjRhLmNvcHkoVVNUQVJfVkVSLCBidWYsIFZFUlNJT05fT0ZGU0VUKVxuICBpZiAob3B0cy51bmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy51bmFtZSwgMjY1KVxuICBpZiAob3B0cy5nbmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy5nbmFtZSwgMjk3KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy5kZXZtYWpvciB8fCAwLCA2KSwgMzI5KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy5kZXZtaW5vciB8fCAwLCA2KSwgMzM3KVxuXG4gIGlmIChwcmVmaXgpIGI0YS53cml0ZShidWYsIHByZWZpeCwgMzQ1KVxuXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChja3N1bShidWYpLCA2KSwgMTQ4KVxuXG4gIHJldHVybiBidWZcbn1cblxuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUgKGJ1ZiwgZmlsZW5hbWVFbmNvZGluZywgYWxsb3dVbmtub3duRm9ybWF0KSB7XG4gIGxldCB0eXBlZmxhZyA9IGJ1ZlsxNTZdID09PSAwID8gMCA6IGJ1ZlsxNTZdIC0gWkVST19PRkZTRVRcblxuICBsZXQgbmFtZSA9IGRlY29kZVN0cihidWYsIDAsIDEwMCwgZmlsZW5hbWVFbmNvZGluZylcbiAgY29uc3QgbW9kZSA9IGRlY29kZU9jdChidWYsIDEwMCwgOClcbiAgY29uc3QgdWlkID0gZGVjb2RlT2N0KGJ1ZiwgMTA4LCA4KVxuICBjb25zdCBnaWQgPSBkZWNvZGVPY3QoYnVmLCAxMTYsIDgpXG4gIGNvbnN0IHNpemUgPSBkZWNvZGVPY3QoYnVmLCAxMjQsIDEyKVxuICBjb25zdCBtdGltZSA9IGRlY29kZU9jdChidWYsIDEzNiwgMTIpXG4gIGNvbnN0IHR5cGUgPSB0b1R5cGUodHlwZWZsYWcpXG4gIGNvbnN0IGxpbmtuYW1lID0gYnVmWzE1N10gPT09IDAgPyBudWxsIDogZGVjb2RlU3RyKGJ1ZiwgMTU3LCAxMDAsIGZpbGVuYW1lRW5jb2RpbmcpXG4gIGNvbnN0IHVuYW1lID0gZGVjb2RlU3RyKGJ1ZiwgMjY1LCAzMilcbiAgY29uc3QgZ25hbWUgPSBkZWNvZGVTdHIoYnVmLCAyOTcsIDMyKVxuICBjb25zdCBkZXZtYWpvciA9IGRlY29kZU9jdChidWYsIDMyOSwgOClcbiAgY29uc3QgZGV2bWlub3IgPSBkZWNvZGVPY3QoYnVmLCAzMzcsIDgpXG5cbiAgY29uc3QgYyA9IGNrc3VtKGJ1ZilcblxuICAvLyBjaGVja3N1bSBpcyBzdGlsbCBpbml0aWFsIHZhbHVlIGlmIGhlYWRlciB3YXMgbnVsbC5cbiAgaWYgKGMgPT09IDggKiAzMikgcmV0dXJuIG51bGxcblxuICAvLyB2YWxpZCBjaGVja3N1bVxuICBpZiAoYyAhPT0gZGVjb2RlT2N0KGJ1ZiwgMTQ4LCA4KSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRhciBoZWFkZXIuIE1heWJlIHRoZSB0YXIgaXMgY29ycnVwdGVkIG9yIGl0IG5lZWRzIHRvIGJlIGd1bnppcHBlZD8nKVxuXG4gIGlmIChpc1VTVEFSKGJ1ZikpIHtcbiAgICAvLyB1c3RhciAocG9zaXgpIGZvcm1hdC5cbiAgICAvLyBwcmVwZW5kIHByZWZpeCwgaWYgcHJlc2VudC5cbiAgICBpZiAoYnVmWzM0NV0pIG5hbWUgPSBkZWNvZGVTdHIoYnVmLCAzNDUsIDE1NSwgZmlsZW5hbWVFbmNvZGluZykgKyAnLycgKyBuYW1lXG4gIH0gZWxzZSBpZiAoaXNHTlUoYnVmKSkge1xuICAgIC8vICdnbnUnLydvbGRnbnUnIGZvcm1hdC4gU2ltaWxhciB0byB1c3RhciwgYnV0IGhhcyBzdXBwb3J0IGZvciBpbmNyZW1lbnRhbCBhbmRcbiAgICAvLyBtdWx0aS12b2x1bWUgdGFyYmFsbHMuXG4gIH0gZWxzZSB7XG4gICAgaWYgKCFhbGxvd1Vua25vd25Gb3JtYXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0YXIgaGVhZGVyOiB1bmtub3duIGZvcm1hdC4nKVxuICAgIH1cbiAgfVxuXG4gIC8vIHRvIHN1cHBvcnQgb2xkIHRhciB2ZXJzaW9ucyB0aGF0IHVzZSB0cmFpbGluZyAvIHRvIGluZGljYXRlIGRpcnNcbiAgaWYgKHR5cGVmbGFnID09PSAwICYmIG5hbWUgJiYgbmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnLycpIHR5cGVmbGFnID0gNVxuXG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBtb2RlLFxuICAgIHVpZCxcbiAgICBnaWQsXG4gICAgc2l6ZSxcbiAgICBtdGltZTogbmV3IERhdGUoMTAwMCAqIG10aW1lKSxcbiAgICB0eXBlLFxuICAgIGxpbmtuYW1lLFxuICAgIHVuYW1lLFxuICAgIGduYW1lLFxuICAgIGRldm1ham9yLFxuICAgIGRldm1pbm9yLFxuICAgIHBheDogbnVsbFxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVVNUQVIgKGJ1Zikge1xuICByZXR1cm4gYjRhLmVxdWFscyhVU1RBUl9NQUdJQywgYnVmLnN1YmFycmF5KE1BR0lDX09GRlNFVCwgTUFHSUNfT0ZGU0VUICsgNikpXG59XG5cbmZ1bmN0aW9uIGlzR05VIChidWYpIHtcbiAgcmV0dXJuIGI0YS5lcXVhbHMoR05VX01BR0lDLCBidWYuc3ViYXJyYXkoTUFHSUNfT0ZGU0VULCBNQUdJQ19PRkZTRVQgKyA2KSkgJiZcbiAgICBiNGEuZXF1YWxzKEdOVV9WRVIsIGJ1Zi5zdWJhcnJheShWRVJTSU9OX09GRlNFVCwgVkVSU0lPTl9PRkZTRVQgKyAyKSlcbn1cblxuZnVuY3Rpb24gY2xhbXAgKGluZGV4LCBsZW4sIGRlZmF1bHRWYWx1ZSkge1xuICBpZiAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJykgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICBpbmRleCA9IH5+aW5kZXggLy8gQ29lcmNlIHRvIGludGVnZXIuXG4gIGlmIChpbmRleCA+PSBsZW4pIHJldHVybiBsZW5cbiAgaWYgKGluZGV4ID49IDApIHJldHVybiBpbmRleFxuICBpbmRleCArPSBsZW5cbiAgaWYgKGluZGV4ID49IDApIHJldHVybiBpbmRleFxuICByZXR1cm4gMFxufVxuXG5mdW5jdGlvbiB0b1R5cGUgKGZsYWcpIHtcbiAgc3dpdGNoIChmbGFnKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICdmaWxlJ1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiAnbGluaydcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gJ3N5bWxpbmsnXG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuICdjaGFyYWN0ZXItZGV2aWNlJ1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiAnYmxvY2stZGV2aWNlJ1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiAnZGlyZWN0b3J5J1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiAnZmlmbydcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gJ2NvbnRpZ3VvdXMtZmlsZSdcbiAgICBjYXNlIDcyOlxuICAgICAgcmV0dXJuICdwYXgtaGVhZGVyJ1xuICAgIGNhc2UgNTU6XG4gICAgICByZXR1cm4gJ3BheC1nbG9iYWwtaGVhZGVyJ1xuICAgIGNhc2UgMjc6XG4gICAgICByZXR1cm4gJ2dudS1sb25nLWxpbmstcGF0aCdcbiAgICBjYXNlIDI4OlxuICAgIGNhc2UgMzA6XG4gICAgICByZXR1cm4gJ2dudS1sb25nLXBhdGgnXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiB0b1R5cGVmbGFnIChmbGFnKSB7XG4gIHN3aXRjaCAoZmxhZykge1xuICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgcmV0dXJuIDBcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIHJldHVybiAxXG4gICAgY2FzZSAnc3ltbGluayc6XG4gICAgICByZXR1cm4gMlxuICAgIGNhc2UgJ2NoYXJhY3Rlci1kZXZpY2UnOlxuICAgICAgcmV0dXJuIDNcbiAgICBjYXNlICdibG9jay1kZXZpY2UnOlxuICAgICAgcmV0dXJuIDRcbiAgICBjYXNlICdkaXJlY3RvcnknOlxuICAgICAgcmV0dXJuIDVcbiAgICBjYXNlICdmaWZvJzpcbiAgICAgIHJldHVybiA2XG4gICAgY2FzZSAnY29udGlndW91cy1maWxlJzpcbiAgICAgIHJldHVybiA3XG4gICAgY2FzZSAncGF4LWhlYWRlcic6XG4gICAgICByZXR1cm4gNzJcbiAgfVxuXG4gIHJldHVybiAwXG59XG5cbmZ1bmN0aW9uIGluZGV4T2YgKGJsb2NrLCBudW0sIG9mZnNldCwgZW5kKSB7XG4gIGZvciAoOyBvZmZzZXQgPCBlbmQ7IG9mZnNldCsrKSB7XG4gICAgaWYgKGJsb2NrW29mZnNldF0gPT09IG51bSkgcmV0dXJuIG9mZnNldFxuICB9XG4gIHJldHVybiBlbmRcbn1cblxuZnVuY3Rpb24gY2tzdW0gKGJsb2NrKSB7XG4gIGxldCBzdW0gPSA4ICogMzJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNDg7IGkrKykgc3VtICs9IGJsb2NrW2ldXG4gIGZvciAobGV0IGogPSAxNTY7IGogPCA1MTI7IGorKykgc3VtICs9IGJsb2NrW2pdXG4gIHJldHVybiBzdW1cbn1cblxuZnVuY3Rpb24gZW5jb2RlT2N0ICh2YWwsIG4pIHtcbiAgdmFsID0gdmFsLnRvU3RyaW5nKDgpXG4gIGlmICh2YWwubGVuZ3RoID4gbikgcmV0dXJuIFNFVkVOUy5zbGljZSgwLCBuKSArICcgJ1xuICByZXR1cm4gWkVST1Muc2xpY2UoMCwgbiAtIHZhbC5sZW5ndGgpICsgdmFsICsgJyAnXG59XG5cbmZ1bmN0aW9uIGVuY29kZVNpemVCaW4gKG51bSwgYnVmLCBvZmYpIHtcbiAgYnVmW29mZl0gPSAweDgwXG4gIGZvciAobGV0IGkgPSAxMTsgaSA+IDA7IGktLSkge1xuICAgIGJ1ZltvZmYgKyBpXSA9IG51bSAmIDB4ZmZcbiAgICBudW0gPSBNYXRoLmZsb29yKG51bSAvIDB4MTAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGVuY29kZVNpemUgKG51bSwgYnVmLCBvZmYpIHtcbiAgaWYgKG51bS50b1N0cmluZyg4KS5sZW5ndGggPiAxMSkge1xuICAgIGVuY29kZVNpemVCaW4obnVtLCBidWYsIG9mZilcbiAgfSBlbHNlIHtcbiAgICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3QobnVtLCAxMSksIG9mZilcbiAgfVxufVxuXG4vKiBDb3BpZWQgZnJvbSB0aGUgbm9kZS10YXIgcmVwbyBhbmQgbW9kaWZpZWQgdG8gbWVldFxuICogdGFyLXN0cmVhbSBjb2Rpbmcgc3RhbmRhcmQuXG4gKlxuICogU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vbnBtL25vZGUtdGFyL2Jsb2IvNTFiNjYyN2ExZjM1N2QyZWI0MzNlNzM3OGU1ZjA1ZTgzYjdhYTZjZC9saWIvaGVhZGVyLmpzI0wzNDlcbiAqL1xuZnVuY3Rpb24gcGFyc2UyNTYgKGJ1Zikge1xuICAvLyBmaXJzdCBieXRlIE1VU1QgYmUgZWl0aGVyIDgwIG9yIEZGXG4gIC8vIDgwIGZvciBwb3NpdGl2ZSwgRkYgZm9yIDIncyBjb21wXG4gIGxldCBwb3NpdGl2ZVxuICBpZiAoYnVmWzBdID09PSAweDgwKSBwb3NpdGl2ZSA9IHRydWVcbiAgZWxzZSBpZiAoYnVmWzBdID09PSAweEZGKSBwb3NpdGl2ZSA9IGZhbHNlXG4gIGVsc2UgcmV0dXJuIG51bGxcblxuICAvLyBidWlsZCB1cCBhIGJhc2UtMjU2IHR1cGxlIGZyb20gdGhlIGxlYXN0IHNpZyB0byB0aGUgaGlnaGVzdFxuICBjb25zdCB0dXBsZSA9IFtdXG4gIGxldCBpXG4gIGZvciAoaSA9IGJ1Zi5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3QgYnl0ZSA9IGJ1ZltpXVxuICAgIGlmIChwb3NpdGl2ZSkgdHVwbGUucHVzaChieXRlKVxuICAgIGVsc2UgdHVwbGUucHVzaCgweEZGIC0gYnl0ZSlcbiAgfVxuXG4gIGxldCBzdW0gPSAwXG4gIGNvbnN0IGwgPSB0dXBsZS5sZW5ndGhcbiAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHN1bSArPSB0dXBsZVtpXSAqIE1hdGgucG93KDI1NiwgaSlcbiAgfVxuXG4gIHJldHVybiBwb3NpdGl2ZSA/IHN1bSA6IC0xICogc3VtXG59XG5cbmZ1bmN0aW9uIGRlY29kZU9jdCAodmFsLCBvZmZzZXQsIGxlbmd0aCkge1xuICB2YWwgPSB2YWwuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpXG4gIG9mZnNldCA9IDBcblxuICAvLyBJZiBwcmVmaXhlZCB3aXRoIDB4ODAgdGhlbiBwYXJzZSBhcyBhIGJhc2UtMjU2IGludGVnZXJcbiAgaWYgKHZhbFtvZmZzZXRdICYgMHg4MCkge1xuICAgIHJldHVybiBwYXJzZTI1Nih2YWwpXG4gIH0gZWxzZSB7XG4gICAgLy8gT2xkZXIgdmVyc2lvbnMgb2YgdGFyIGNhbiBwcmVmaXggd2l0aCBzcGFjZXNcbiAgICB3aGlsZSAob2Zmc2V0IDwgdmFsLmxlbmd0aCAmJiB2YWxbb2Zmc2V0XSA9PT0gMzIpIG9mZnNldCsrXG4gICAgY29uc3QgZW5kID0gY2xhbXAoaW5kZXhPZih2YWwsIDMyLCBvZmZzZXQsIHZhbC5sZW5ndGgpLCB2YWwubGVuZ3RoLCB2YWwubGVuZ3RoKVxuICAgIHdoaWxlIChvZmZzZXQgPCBlbmQgJiYgdmFsW29mZnNldF0gPT09IDApIG9mZnNldCsrXG4gICAgaWYgKGVuZCA9PT0gb2Zmc2V0KSByZXR1cm4gMFxuICAgIHJldHVybiBwYXJzZUludChiNGEudG9TdHJpbmcodmFsLnN1YmFycmF5KG9mZnNldCwgZW5kKSksIDgpXG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlU3RyICh2YWwsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICByZXR1cm4gYjRhLnRvU3RyaW5nKHZhbC5zdWJhcnJheShvZmZzZXQsIGluZGV4T2YodmFsLCAwLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWRkTGVuZ3RoIChzdHIpIHtcbiAgY29uc3QgbGVuID0gYjRhLmJ5dGVMZW5ndGgoc3RyKVxuICBsZXQgZGlnaXRzID0gTWF0aC5mbG9vcihNYXRoLmxvZyhsZW4pIC8gTWF0aC5sb2coMTApKSArIDFcbiAgaWYgKGxlbiArIGRpZ2l0cyA+PSBNYXRoLnBvdygxMCwgZGlnaXRzKSkgZGlnaXRzKytcblxuICByZXR1cm4gKGxlbiArIGRpZ2l0cykgKyBzdHJcbn1cbiIsImV4cG9ydHMuZXh0cmFjdCA9IHJlcXVpcmUoJy4vZXh0cmFjdCcpXG5leHBvcnRzLnBhY2sgPSByZXF1aXJlKCcuL3BhY2snKVxuIiwiY29uc3QgeyBSZWFkYWJsZSwgV3JpdGFibGUsIGdldFN0cmVhbUVycm9yIH0gPSByZXF1aXJlKCdzdHJlYW14JylcbmNvbnN0IGI0YSA9IHJlcXVpcmUoJ2I0YScpXG5cbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IGhlYWRlcnMgPSByZXF1aXJlKCcuL2hlYWRlcnMnKVxuXG5jb25zdCBETU9ERSA9IDBvNzU1XG5jb25zdCBGTU9ERSA9IDBvNjQ0XG5cbmNvbnN0IEVORF9PRl9UQVIgPSBiNGEuYWxsb2MoMTAyNClcblxuY2xhc3MgU2luayBleHRlbmRzIFdyaXRhYmxlIHtcbiAgY29uc3RydWN0b3IgKHBhY2ssIGhlYWRlciwgY2FsbGJhY2spIHtcbiAgICBzdXBlcih7IG1hcFdyaXRhYmxlLCBlYWdlck9wZW46IHRydWUgfSlcblxuICAgIHRoaXMud3JpdHRlbiA9IDBcbiAgICB0aGlzLmhlYWRlciA9IGhlYWRlclxuXG4gICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuX2xpbmtuYW1lID0gbnVsbFxuICAgIHRoaXMuX2lzTGlua25hbWUgPSBoZWFkZXIudHlwZSA9PT0gJ3N5bWxpbmsnICYmICFoZWFkZXIubGlua25hbWVcbiAgICB0aGlzLl9pc1ZvaWQgPSBoZWFkZXIudHlwZSAhPT0gJ2ZpbGUnICYmIGhlYWRlci50eXBlICE9PSAnY29udGlndW91cy1maWxlJ1xuICAgIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2VcbiAgICB0aGlzLl9wYWNrID0gcGFja1xuICAgIHRoaXMuX29wZW5DYWxsYmFjayA9IG51bGxcblxuICAgIGlmICh0aGlzLl9wYWNrLl9zdHJlYW0gPT09IG51bGwpIHRoaXMuX3BhY2suX3N0cmVhbSA9IHRoaXNcbiAgICBlbHNlIHRoaXMuX3BhY2suX3BlbmRpbmcucHVzaCh0aGlzKVxuICB9XG5cbiAgX29wZW4gKGNiKSB7XG4gICAgdGhpcy5fb3BlbkNhbGxiYWNrID0gY2JcbiAgICBpZiAodGhpcy5fcGFjay5fc3RyZWFtID09PSB0aGlzKSB0aGlzLl9jb250aW51ZU9wZW4oKVxuICB9XG5cbiAgX2NvbnRpbnVlUGFjayAoZXJyKSB7XG4gICAgaWYgKHRoaXMuX2NhbGxiYWNrID09PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5fY2FsbGJhY2tcbiAgICB0aGlzLl9jYWxsYmFjayA9IG51bGxcblxuICAgIGNhbGxiYWNrKGVycilcbiAgfVxuXG4gIF9jb250aW51ZU9wZW4gKCkge1xuICAgIGlmICh0aGlzLl9wYWNrLl9zdHJlYW0gPT09IG51bGwpIHRoaXMuX3BhY2suX3N0cmVhbSA9IHRoaXNcblxuICAgIGNvbnN0IGNiID0gdGhpcy5fb3BlbkNhbGxiYWNrXG4gICAgdGhpcy5fb3BlbkNhbGxiYWNrID0gbnVsbFxuICAgIGlmIChjYiA9PT0gbnVsbCkgcmV0dXJuXG5cbiAgICBpZiAodGhpcy5fcGFjay5kZXN0cm95aW5nKSByZXR1cm4gY2IobmV3IEVycm9yKCdwYWNrIHN0cmVhbSBkZXN0cm95ZWQnKSlcbiAgICBpZiAodGhpcy5fcGFjay5fZmluYWxpemVkKSByZXR1cm4gY2IobmV3IEVycm9yKCdwYWNrIHN0cmVhbSBpcyBhbHJlYWR5IGZpbmFsaXplZCcpKVxuXG4gICAgdGhpcy5fcGFjay5fc3RyZWFtID0gdGhpc1xuXG4gICAgaWYgKCF0aGlzLl9pc0xpbmtuYW1lKSB7XG4gICAgICB0aGlzLl9wYWNrLl9lbmNvZGUodGhpcy5oZWFkZXIpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzVm9pZCkge1xuICAgICAgdGhpcy5fZmluaXNoKClcbiAgICAgIHRoaXMuX2NvbnRpbnVlUGFjayhudWxsKVxuICAgIH1cblxuICAgIGNiKG51bGwpXG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgaWYgKHRoaXMuX2lzTGlua25hbWUpIHtcbiAgICAgIHRoaXMuX2xpbmtuYW1lID0gdGhpcy5fbGlua25hbWUgPyBiNGEuY29uY2F0KFt0aGlzLl9saW5rbmFtZSwgZGF0YV0pIDogZGF0YVxuICAgICAgcmV0dXJuIGNiKG51bGwpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzVm9pZCkge1xuICAgICAgaWYgKGRhdGEuYnl0ZUxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGNiKG5ldyBFcnJvcignTm8gYm9keSBhbGxvd2VkIGZvciB0aGlzIGVudHJ5JykpXG4gICAgICB9XG4gICAgICByZXR1cm4gY2IoKVxuICAgIH1cblxuICAgIHRoaXMud3JpdHRlbiArPSBkYXRhLmJ5dGVMZW5ndGhcbiAgICBpZiAodGhpcy5fcGFjay5wdXNoKGRhdGEpKSByZXR1cm4gY2IoKVxuICAgIHRoaXMuX3BhY2suX2RyYWluID0gY2JcbiAgfVxuXG4gIF9maW5pc2ggKCkge1xuICAgIGlmICh0aGlzLl9maW5pc2hlZCkgcmV0dXJuXG4gICAgdGhpcy5fZmluaXNoZWQgPSB0cnVlXG5cbiAgICBpZiAodGhpcy5faXNMaW5rbmFtZSkge1xuICAgICAgdGhpcy5oZWFkZXIubGlua25hbWUgPSB0aGlzLl9saW5rbmFtZSA/IGI0YS50b1N0cmluZyh0aGlzLl9saW5rbmFtZSwgJ3V0Zi04JykgOiAnJ1xuICAgICAgdGhpcy5fcGFjay5fZW5jb2RlKHRoaXMuaGVhZGVyKVxuICAgIH1cblxuICAgIG92ZXJmbG93KHRoaXMuX3BhY2ssIHRoaXMuaGVhZGVyLnNpemUpXG5cbiAgICB0aGlzLl9wYWNrLl9kb25lKHRoaXMpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgaWYgKHRoaXMud3JpdHRlbiAhPT0gdGhpcy5oZWFkZXIuc2l6ZSkgeyAvLyBjb3JydXB0aW5nIHRhclxuICAgICAgcmV0dXJuIGNiKG5ldyBFcnJvcignU2l6ZSBtaXNtYXRjaCcpKVxuICAgIH1cblxuICAgIHRoaXMuX2ZpbmlzaCgpXG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9nZXRFcnJvciAoKSB7XG4gICAgcmV0dXJuIGdldFN0cmVhbUVycm9yKHRoaXMpIHx8IG5ldyBFcnJvcigndGFyIGVudHJ5IGRlc3Ryb3llZCcpXG4gIH1cblxuICBfcHJlZGVzdHJveSAoKSB7XG4gICAgdGhpcy5fcGFjay5kZXN0cm95KHRoaXMuX2dldEVycm9yKCkpXG4gIH1cblxuICBfZGVzdHJveSAoY2IpIHtcbiAgICB0aGlzLl9wYWNrLl9kb25lKHRoaXMpXG5cbiAgICB0aGlzLl9jb250aW51ZVBhY2sodGhpcy5fZmluaXNoZWQgPyBudWxsIDogdGhpcy5fZ2V0RXJyb3IoKSlcblxuICAgIGNiKClcbiAgfVxufVxuXG5jbGFzcyBQYWNrIGV4dGVuZHMgUmVhZGFibGUge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG4gICAgdGhpcy5fZHJhaW4gPSBub29wXG4gICAgdGhpcy5fZmluYWxpemVkID0gZmFsc2VcbiAgICB0aGlzLl9maW5hbGl6aW5nID0gZmFsc2VcbiAgICB0aGlzLl9wZW5kaW5nID0gW11cbiAgICB0aGlzLl9zdHJlYW0gPSBudWxsXG4gIH1cblxuICBlbnRyeSAoaGVhZGVyLCBidWZmZXIsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuX2ZpbmFsaXplZCB8fCB0aGlzLmRlc3Ryb3lpbmcpIHRocm93IG5ldyBFcnJvcignYWxyZWFkeSBmaW5hbGl6ZWQgb3IgZGVzdHJveWVkJylcblxuICAgIGlmICh0eXBlb2YgYnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IGJ1ZmZlclxuICAgICAgYnVmZmVyID0gbnVsbFxuICAgIH1cblxuICAgIGlmICghY2FsbGJhY2spIGNhbGxiYWNrID0gbm9vcFxuXG4gICAgaWYgKCFoZWFkZXIuc2l6ZSB8fCBoZWFkZXIudHlwZSA9PT0gJ3N5bWxpbmsnKSBoZWFkZXIuc2l6ZSA9IDBcbiAgICBpZiAoIWhlYWRlci50eXBlKSBoZWFkZXIudHlwZSA9IG1vZGVUb1R5cGUoaGVhZGVyLm1vZGUpXG4gICAgaWYgKCFoZWFkZXIubW9kZSkgaGVhZGVyLm1vZGUgPSBoZWFkZXIudHlwZSA9PT0gJ2RpcmVjdG9yeScgPyBETU9ERSA6IEZNT0RFXG4gICAgaWYgKCFoZWFkZXIudWlkKSBoZWFkZXIudWlkID0gMFxuICAgIGlmICghaGVhZGVyLmdpZCkgaGVhZGVyLmdpZCA9IDBcbiAgICBpZiAoIWhlYWRlci5tdGltZSkgaGVhZGVyLm10aW1lID0gbmV3IERhdGUoKVxuXG4gICAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdzdHJpbmcnKSBidWZmZXIgPSBiNGEuZnJvbShidWZmZXIpXG5cbiAgICBjb25zdCBzaW5rID0gbmV3IFNpbmsodGhpcywgaGVhZGVyLCBjYWxsYmFjaylcblxuICAgIGlmIChiNGEuaXNCdWZmZXIoYnVmZmVyKSkge1xuICAgICAgaGVhZGVyLnNpemUgPSBidWZmZXIuYnl0ZUxlbmd0aFxuICAgICAgc2luay53cml0ZShidWZmZXIpXG4gICAgICBzaW5rLmVuZCgpXG4gICAgICByZXR1cm4gc2lua1xuICAgIH1cblxuICAgIGlmIChzaW5rLl9pc1ZvaWQpIHtcbiAgICAgIHJldHVybiBzaW5rXG4gICAgfVxuXG4gICAgcmV0dXJuIHNpbmtcbiAgfVxuXG4gIGZpbmFsaXplICgpIHtcbiAgICBpZiAodGhpcy5fc3RyZWFtIHx8IHRoaXMuX3BlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fZmluYWxpemluZyA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9maW5hbGl6ZWQpIHJldHVyblxuICAgIHRoaXMuX2ZpbmFsaXplZCA9IHRydWVcblxuICAgIHRoaXMucHVzaChFTkRfT0ZfVEFSKVxuICAgIHRoaXMucHVzaChudWxsKVxuICB9XG5cbiAgX2RvbmUgKHN0cmVhbSkge1xuICAgIGlmIChzdHJlYW0gIT09IHRoaXMuX3N0cmVhbSkgcmV0dXJuXG5cbiAgICB0aGlzLl9zdHJlYW0gPSBudWxsXG5cbiAgICBpZiAodGhpcy5fZmluYWxpemluZykgdGhpcy5maW5hbGl6ZSgpXG4gICAgaWYgKHRoaXMuX3BlbmRpbmcubGVuZ3RoKSB0aGlzLl9wZW5kaW5nLnNoaWZ0KCkuX2NvbnRpbnVlT3BlbigpXG4gIH1cblxuICBfZW5jb2RlIChoZWFkZXIpIHtcbiAgICBpZiAoIWhlYWRlci5wYXgpIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IGhlYWRlcnMuZW5jb2RlKGhlYWRlcilcbiAgICAgIGlmIChidWYpIHtcbiAgICAgICAgdGhpcy5wdXNoKGJ1ZilcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2VuY29kZVBheChoZWFkZXIpXG4gIH1cblxuICBfZW5jb2RlUGF4IChoZWFkZXIpIHtcbiAgICBjb25zdCBwYXhIZWFkZXIgPSBoZWFkZXJzLmVuY29kZVBheCh7XG4gICAgICBuYW1lOiBoZWFkZXIubmFtZSxcbiAgICAgIGxpbmtuYW1lOiBoZWFkZXIubGlua25hbWUsXG4gICAgICBwYXg6IGhlYWRlci5wYXhcbiAgICB9KVxuXG4gICAgY29uc3QgbmV3SGVhZGVyID0ge1xuICAgICAgbmFtZTogJ1BheEhlYWRlcicsXG4gICAgICBtb2RlOiBoZWFkZXIubW9kZSxcbiAgICAgIHVpZDogaGVhZGVyLnVpZCxcbiAgICAgIGdpZDogaGVhZGVyLmdpZCxcbiAgICAgIHNpemU6IHBheEhlYWRlci5ieXRlTGVuZ3RoLFxuICAgICAgbXRpbWU6IGhlYWRlci5tdGltZSxcbiAgICAgIHR5cGU6ICdwYXgtaGVhZGVyJyxcbiAgICAgIGxpbmtuYW1lOiBoZWFkZXIubGlua25hbWUgJiYgJ1BheEhlYWRlcicsXG4gICAgICB1bmFtZTogaGVhZGVyLnVuYW1lLFxuICAgICAgZ25hbWU6IGhlYWRlci5nbmFtZSxcbiAgICAgIGRldm1ham9yOiBoZWFkZXIuZGV2bWFqb3IsXG4gICAgICBkZXZtaW5vcjogaGVhZGVyLmRldm1pbm9yXG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKGhlYWRlcnMuZW5jb2RlKG5ld0hlYWRlcikpXG4gICAgdGhpcy5wdXNoKHBheEhlYWRlcilcbiAgICBvdmVyZmxvdyh0aGlzLCBwYXhIZWFkZXIuYnl0ZUxlbmd0aClcblxuICAgIG5ld0hlYWRlci5zaXplID0gaGVhZGVyLnNpemVcbiAgICBuZXdIZWFkZXIudHlwZSA9IGhlYWRlci50eXBlXG4gICAgdGhpcy5wdXNoKGhlYWRlcnMuZW5jb2RlKG5ld0hlYWRlcikpXG4gIH1cblxuICBfZG9EcmFpbiAoKSB7XG4gICAgY29uc3QgZHJhaW4gPSB0aGlzLl9kcmFpblxuICAgIHRoaXMuX2RyYWluID0gbm9vcFxuICAgIGRyYWluKClcbiAgfVxuXG4gIF9wcmVkZXN0cm95ICgpIHtcbiAgICBjb25zdCBlcnIgPSBnZXRTdHJlYW1FcnJvcih0aGlzKVxuXG4gICAgaWYgKHRoaXMuX3N0cmVhbSkgdGhpcy5fc3RyZWFtLmRlc3Ryb3koZXJyKVxuXG4gICAgd2hpbGUgKHRoaXMuX3BlbmRpbmcubGVuZ3RoKSB7XG4gICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9wZW5kaW5nLnNoaWZ0KClcbiAgICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgICAgIHN0cmVhbS5fY29udGludWVPcGVuKClcbiAgICB9XG5cbiAgICB0aGlzLl9kb0RyYWluKClcbiAgfVxuXG4gIF9yZWFkIChjYikge1xuICAgIHRoaXMuX2RvRHJhaW4oKVxuICAgIGNiKClcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhY2sgKG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBQYWNrKG9wdHMpXG59XG5cbmZ1bmN0aW9uIG1vZGVUb1R5cGUgKG1vZGUpIHtcbiAgc3dpdGNoIChtb2RlICYgY29uc3RhbnRzLlNfSUZNVCkge1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZCTEs6IHJldHVybiAnYmxvY2stZGV2aWNlJ1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZDSFI6IHJldHVybiAnY2hhcmFjdGVyLWRldmljZSdcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGRElSOiByZXR1cm4gJ2RpcmVjdG9yeSdcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGSUZPOiByZXR1cm4gJ2ZpZm8nXG4gICAgY2FzZSBjb25zdGFudHMuU19JRkxOSzogcmV0dXJuICdzeW1saW5rJ1xuICB9XG5cbiAgcmV0dXJuICdmaWxlJ1xufVxuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIG92ZXJmbG93IChzZWxmLCBzaXplKSB7XG4gIHNpemUgJj0gNTExXG4gIGlmIChzaXplKSBzZWxmLnB1c2goRU5EX09GX1RBUi5zdWJhcnJheSgwLCA1MTIgLSBzaXplKSlcbn1cblxuZnVuY3Rpb24gbWFwV3JpdGFibGUgKGJ1Zikge1xuICByZXR1cm4gYjRhLmlzQnVmZmVyKGJ1ZikgPyBidWYgOiBiNGEuZnJvbShidWYpXG59XG4iLCJjb25zdCBQYXNzVGhyb3VnaERlY29kZXIgPSByZXF1aXJlKCcuL2xpYi9wYXNzLXRocm91Z2gtZGVjb2RlcicpXG5jb25zdCBVVEY4RGVjb2RlciA9IHJlcXVpcmUoJy4vbGliL3V0ZjgtZGVjb2RlcicpXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgVGV4dERlY29kZXIge1xuICBjb25zdHJ1Y3RvciAoZW5jb2RpbmcgPSAndXRmOCcpIHtcbiAgICB0aGlzLmVuY29kaW5nID0gbm9ybWFsaXplRW5jb2RpbmcoZW5jb2RpbmcpXG5cbiAgICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgICB0aGlzLmRlY29kZXIgPSBuZXcgVVRGOERlY29kZXIoKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGVuY29kaW5nOiAnICsgdGhpcy5lbmNvZGluZylcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuZGVjb2RlciA9IG5ldyBQYXNzVGhyb3VnaERlY29kZXIodGhpcy5lbmNvZGluZylcbiAgICB9XG4gIH1cblxuICBwdXNoIChkYXRhKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgcmV0dXJuIGRhdGFcbiAgICByZXR1cm4gdGhpcy5kZWNvZGVyLmRlY29kZShkYXRhKVxuICB9XG5cbiAgLy8gRm9yIE5vZGUuanMgY29tcGF0aWJpbGl0eVxuICB3cml0ZSAoZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnB1c2goZGF0YSlcbiAgfVxuXG4gIGVuZCAoZGF0YSkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIGlmIChkYXRhKSByZXN1bHQgPSB0aGlzLnB1c2goZGF0YSlcbiAgICByZXN1bHQgKz0gdGhpcy5kZWNvZGVyLmZsdXNoKClcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKVxuXG4gIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgICByZXR1cm4gJ3V0ZjgnXG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiAndXRmMTZsZSdcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICByZXR1cm4gJ2xhdGluMSdcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdoZXgnOlxuICAgICAgcmV0dXJuIGVuY29kaW5nXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICB9XG59O1xuIiwiY29uc3QgYjRhID0gcmVxdWlyZSgnYjRhJylcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBQYXNzVGhyb3VnaERlY29kZXIge1xuICBjb25zdHJ1Y3RvciAoZW5jb2RpbmcpIHtcbiAgICB0aGlzLmVuY29kaW5nID0gZW5jb2RpbmdcbiAgfVxuXG4gIGRlY29kZSAodGFpbCkge1xuICAgIHJldHVybiBiNGEudG9TdHJpbmcodGFpbCwgdGhpcy5lbmNvZGluZylcbiAgfVxuXG4gIGZsdXNoICgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxufVxuIiwiY29uc3QgYjRhID0gcmVxdWlyZSgnYjRhJylcblxuLyoqXG4gKiBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jdXRmLTgtZGVjb2RlclxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFVURjhEZWNvZGVyIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMuY29kZVBvaW50ID0gMFxuICAgIHRoaXMuYnl0ZXNTZWVuID0gMFxuICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSAwXG4gICAgdGhpcy5sb3dlckJvdW5kYXJ5ID0gMHg4MFxuICAgIHRoaXMudXBwZXJCb3VuZGFyeSA9IDB4YmZcbiAgfVxuXG4gIGRlY29kZSAoZGF0YSkge1xuICAgIC8vIElmIHdlIGhhdmUgYSBmYXN0IHBhdGgsIGp1c3Qgc25pZmYgaWYgdGhlIGxhc3QgcGFydCBpcyBhIGJvdW5kYXJ5XG4gICAgaWYgKHRoaXMuYnl0ZXNOZWVkZWQgPT09IDApIHtcbiAgICAgIGxldCBpc0JvdW5kYXJ5ID0gdHJ1ZVxuXG4gICAgICBmb3IgKGxldCBpID0gTWF0aC5tYXgoMCwgZGF0YS5ieXRlTGVuZ3RoIC0gNCksIG4gPSBkYXRhLmJ5dGVMZW5ndGg7IGkgPCBuICYmIGlzQm91bmRhcnk7IGkrKykge1xuICAgICAgICBpc0JvdW5kYXJ5ID0gZGF0YVtpXSA8PSAweDdmXG4gICAgICB9XG5cbiAgICAgIGlmIChpc0JvdW5kYXJ5KSByZXR1cm4gYjRhLnRvU3RyaW5nKGRhdGEsICd1dGY4JylcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gJydcblxuICAgIGZvciAobGV0IGkgPSAwLCBuID0gZGF0YS5ieXRlTGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBjb25zdCBieXRlID0gZGF0YVtpXVxuXG4gICAgICBpZiAodGhpcy5ieXRlc05lZWRlZCA9PT0gMCkge1xuICAgICAgICBpZiAoYnl0ZSA8PSAweDdmKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSlcbiAgICAgICAgfSBlbHNlIGlmIChieXRlID49IDB4YzIgJiYgYnl0ZSA8PSAweGRmKSB7XG4gICAgICAgICAgdGhpcy5ieXRlc05lZWRlZCA9IDFcbiAgICAgICAgICB0aGlzLmNvZGVQb2ludCA9IGJ5dGUgJiAweDFmXG4gICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSAweGUwICYmIGJ5dGUgPD0gMHhlZikge1xuICAgICAgICAgIGlmIChieXRlID09PSAweGUwKSB0aGlzLmxvd2VyQm91bmRhcnkgPSAweGEwXG4gICAgICAgICAgZWxzZSBpZiAoYnl0ZSA9PT0gMHhlZCkgdGhpcy51cHBlckJvdW5kYXJ5ID0gMHg5ZlxuICAgICAgICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSAyXG4gICAgICAgICAgdGhpcy5jb2RlUG9pbnQgPSBieXRlICYgMHhmXG4gICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSAweGYwICYmIGJ5dGUgPD0gMHhmNCkge1xuICAgICAgICAgIGlmIChieXRlID09PSAweGYwKSB0aGlzLmxvd2VyQm91bmRhcnkgPSAweDkwXG4gICAgICAgICAgaWYgKGJ5dGUgPT09IDB4ZjQpIHRoaXMudXBwZXJCb3VuZGFyeSA9IDB4OGZcbiAgICAgICAgICB0aGlzLmJ5dGVzTmVlZGVkID0gM1xuICAgICAgICAgIHRoaXMuY29kZVBvaW50ID0gYnl0ZSAmIDB4N1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCArPSAnXFx1ZmZmZCdcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChieXRlIDwgdGhpcy5sb3dlckJvdW5kYXJ5IHx8IGJ5dGUgPiB0aGlzLnVwcGVyQm91bmRhcnkpIHtcbiAgICAgICAgdGhpcy5jb2RlUG9pbnQgPSAwXG4gICAgICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSAwXG4gICAgICAgIHRoaXMuYnl0ZXNTZWVuID0gMFxuICAgICAgICB0aGlzLmxvd2VyQm91bmRhcnkgPSAweDgwXG4gICAgICAgIHRoaXMudXBwZXJCb3VuZGFyeSA9IDB4YmZcblxuICAgICAgICByZXN1bHQgKz0gJ1xcdWZmZmQnXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb3dlckJvdW5kYXJ5ID0gMHg4MFxuICAgICAgdGhpcy51cHBlckJvdW5kYXJ5ID0gMHhiZlxuXG4gICAgICB0aGlzLmNvZGVQb2ludCA9ICh0aGlzLmNvZGVQb2ludCA8PCA2KSB8IChieXRlICYgMHgzZilcbiAgICAgIHRoaXMuYnl0ZXNTZWVuKytcblxuICAgICAgaWYgKHRoaXMuYnl0ZXNTZWVuICE9PSB0aGlzLmJ5dGVzTmVlZGVkKSBjb250aW51ZVxuXG4gICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQodGhpcy5jb2RlUG9pbnQpXG5cbiAgICAgIHRoaXMuY29kZVBvaW50ID0gMFxuICAgICAgdGhpcy5ieXRlc05lZWRlZCA9IDBcbiAgICAgIHRoaXMuYnl0ZXNTZWVuID0gMFxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZsdXNoICgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJ5dGVzTmVlZGVkID4gMCA/ICdcXHVmZmZkJyA6ICcnXG5cbiAgICB0aGlzLmNvZGVQb2ludCA9IDBcbiAgICB0aGlzLmJ5dGVzTmVlZGVkID0gMFxuICAgIHRoaXMuYnl0ZXNTZWVuID0gMFxuICAgIHRoaXMubG93ZXJCb3VuZGFyeSA9IDB4ODBcbiAgICB0aGlzLnVwcGVyQm91bmRhcnkgPSAweGJmXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cbiIsInZhciBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuXG4vLyB0aHJvdWdoXG4vL1xuLy8gYSBzdHJlYW0gdGhhdCBkb2VzIG5vdGhpbmcgYnV0IHJlLWVtaXQgdGhlIGlucHV0LlxuLy8gdXNlZnVsIGZvciBhZ2dyZWdhdGluZyBhIHNlcmllcyBvZiBjaGFuZ2luZyBidXQgbm90IGVuZGluZyBzdHJlYW1zIGludG8gb25lIHN0cmVhbSlcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gdGhyb3VnaFxudGhyb3VnaC50aHJvdWdoID0gdGhyb3VnaFxuXG4vL2NyZWF0ZSBhIHJlYWRhYmxlIHdyaXRhYmxlIHN0cmVhbS5cblxuZnVuY3Rpb24gdGhyb3VnaCAod3JpdGUsIGVuZCwgb3B0cykge1xuICB3cml0ZSA9IHdyaXRlIHx8IGZ1bmN0aW9uIChkYXRhKSB7IHRoaXMucXVldWUoZGF0YSkgfVxuICBlbmQgPSBlbmQgfHwgZnVuY3Rpb24gKCkgeyB0aGlzLnF1ZXVlKG51bGwpIH1cblxuICB2YXIgZW5kZWQgPSBmYWxzZSwgZGVzdHJveWVkID0gZmFsc2UsIGJ1ZmZlciA9IFtdLCBfZW5kZWQgPSBmYWxzZVxuICB2YXIgc3RyZWFtID0gbmV3IFN0cmVhbSgpXG4gIHN0cmVhbS5yZWFkYWJsZSA9IHN0cmVhbS53cml0YWJsZSA9IHRydWVcbiAgc3RyZWFtLnBhdXNlZCA9IGZhbHNlXG5cbi8vICBzdHJlYW0uYXV0b1BhdXNlICAgPSAhKG9wdHMgJiYgb3B0cy5hdXRvUGF1c2UgICA9PT0gZmFsc2UpXG4gIHN0cmVhbS5hdXRvRGVzdHJveSA9ICEob3B0cyAmJiBvcHRzLmF1dG9EZXN0cm95ID09PSBmYWxzZSlcblxuICBzdHJlYW0ud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHdyaXRlLmNhbGwodGhpcywgZGF0YSlcbiAgICByZXR1cm4gIXN0cmVhbS5wYXVzZWRcbiAgfVxuXG4gIGZ1bmN0aW9uIGRyYWluKCkge1xuICAgIHdoaWxlKGJ1ZmZlci5sZW5ndGggJiYgIXN0cmVhbS5wYXVzZWQpIHtcbiAgICAgIHZhciBkYXRhID0gYnVmZmVyLnNoaWZ0KClcbiAgICAgIGlmKG51bGwgPT09IGRhdGEpXG4gICAgICAgIHJldHVybiBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICAgIGVsc2VcbiAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBkYXRhKVxuICAgIH1cbiAgfVxuXG4gIHN0cmVhbS5xdWV1ZSA9IHN0cmVhbS5wdXNoID0gZnVuY3Rpb24gKGRhdGEpIHtcbi8vICAgIGNvbnNvbGUuZXJyb3IoZW5kZWQpXG4gICAgaWYoX2VuZGVkKSByZXR1cm4gc3RyZWFtXG4gICAgaWYoZGF0YSA9PT0gbnVsbCkgX2VuZGVkID0gdHJ1ZVxuICAgIGJ1ZmZlci5wdXNoKGRhdGEpXG4gICAgZHJhaW4oKVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIC8vdGhpcyB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgdGhlIGZpcnN0ICdlbmQnIGxpc3RlbmVyXG4gIC8vbXVzdCBjYWxsIGRlc3Ryb3kgbmV4dCB0aWNrLCB0byBtYWtlIHN1cmUgd2UncmUgYWZ0ZXIgYW55XG4gIC8vc3RyZWFtIHBpcGVkIGZyb20gaGVyZS5cbiAgLy90aGlzIGlzIG9ubHkgYSBwcm9ibGVtIGlmIGVuZCBpcyBub3QgZW1pdHRlZCBzeW5jaHJvbm91c2x5LlxuICAvL2EgbmljZXIgd2F5IHRvIGRvIHRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoaXMgaXMgdGhlIGxhc3QgbGlzdGVuZXIgZm9yICdlbmQnXG5cbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2VcbiAgICBpZighc3RyZWFtLndyaXRhYmxlICYmIHN0cmVhbS5hdXRvRGVzdHJveSlcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBzdHJlYW0uZGVzdHJveSgpXG4gICAgICB9KVxuICB9KVxuXG4gIGZ1bmN0aW9uIF9lbmQgKCkge1xuICAgIHN0cmVhbS53cml0YWJsZSA9IGZhbHNlXG4gICAgZW5kLmNhbGwoc3RyZWFtKVxuICAgIGlmKCFzdHJlYW0ucmVhZGFibGUgJiYgc3RyZWFtLmF1dG9EZXN0cm95KVxuICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICB9XG5cbiAgc3RyZWFtLmVuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgaWYoZW5kZWQpIHJldHVyblxuICAgIGVuZGVkID0gdHJ1ZVxuICAgIGlmKGFyZ3VtZW50cy5sZW5ndGgpIHN0cmVhbS53cml0ZShkYXRhKVxuICAgIF9lbmQoKSAvLyB3aWxsIGVtaXQgb3IgcXVldWVcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cblxuICBzdHJlYW0uZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZihkZXN0cm95ZWQpIHJldHVyblxuICAgIGRlc3Ryb3llZCA9IHRydWVcbiAgICBlbmRlZCA9IHRydWVcbiAgICBidWZmZXIubGVuZ3RoID0gMFxuICAgIHN0cmVhbS53cml0YWJsZSA9IHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlXG4gICAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cblxuICBzdHJlYW0ucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoc3RyZWFtLnBhdXNlZCkgcmV0dXJuXG4gICAgc3RyZWFtLnBhdXNlZCA9IHRydWVcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cblxuICBzdHJlYW0ucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKHN0cmVhbS5wYXVzZWQpIHtcbiAgICAgIHN0cmVhbS5wYXVzZWQgPSBmYWxzZVxuICAgICAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpXG4gICAgfVxuICAgIGRyYWluKClcbiAgICAvL21heSBoYXZlIGJlY29tZSBwYXVzZWQgYWdhaW4sXG4gICAgLy9hcyBkcmFpbiBlbWl0cyAnZGF0YScuXG4gICAgaWYoIXN0cmVhbS5wYXVzZWQpXG4gICAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKVxuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuICByZXR1cm4gc3RyZWFtXG59XG5cbiIsImltcG9ydCB7IHR5cGUgUHJvZHVjdCwgdHlwZSBQcm90b2NvbFR5cGUgfSBmcm9tIFwicHVwcGV0ZWVyLWNvcmVcIjtcblxuaW1wb3J0IHsgcHJvZ3JhbSwgT3B0aW9uIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0ICogYXMgY29tbWFuZGVyIGZyb20gXCJjb21tYW5kZXJcIjtcblxuLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIFN0cmluZyB0byBCb29sZWFuXG5mdW5jdGlvbiBib29sZWFuRW52KG5hbWU6IHN0cmluZywgZGVmYXVsdF92YWx1ZTogYm9vbGVhbikge1xuICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudltuYW1lXTtcbiAgaWYgKGVudiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7XG4gIH1cbiAgc3dpdGNoIChlbnYudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgXCIwXCI6XG4gICAgY2FzZSBcImZhbHNlXCI6XG4gICAgY2FzZSBcIm9mZlwiOlxuICAgIGNhc2UgXCJkaXNhYmxlZFwiOlxuICAgIGNhc2UgXCJub1wiOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNhc2UgXCIxXCI6XG4gICAgY2FzZSBcInRydWVcIjpcbiAgICBjYXNlIFwib25cIjpcbiAgICBjYXNlIFwiZW5hYmxlZFwiOlxuICAgIGNhc2UgXCJ5ZXNcIjpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQnJvd3NlclNldHRpbmdzIHtcbiAgcHJvZHVjdDogUHJvZHVjdDtcbiAgZXhlY3V0YWJsZVBhdGg6IHN0cmluZztcbn1cblxuLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBjb25maWd1cmluZyB0aGUgYnJvd3NlclxuZnVuY3Rpb24gYnJvd3NlclNldHRpbmdzKG5hbWU6IHN0cmluZyk6IEJyb3dzZXJTZXR0aW5ncyB7XG4gIHN3aXRjaCAobmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSBcImZpcmVmb3hcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb2R1Y3Q6IFwiZmlyZWZveFwiLFxuICAgICAgICBleGVjdXRhYmxlUGF0aDogXCIvdXNyL2Jpbi9maXJlZm94XCIsXG4gICAgICB9O1xuICAgIGNhc2UgXCJjaHJvbWVcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb2R1Y3Q6IFwiY2hyb21lXCIsXG4gICAgICAgIGV4ZWN1dGFibGVQYXRoOiBcIi91c3IvYmluL2dvb2dsZS1jaHJvbWUtc3RhYmxlXCIsXG4gICAgICB9O1xuICAgIGNhc2UgXCJjaHJvbWl1bVwiOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvZHVjdDogXCJjaHJvbWVcIixcbiAgICAgICAgZXhlY3V0YWJsZVBhdGg6IFwiL3Vzci9iaW4vY2hyb21pdW1cIixcbiAgICAgIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgYnJvd3NlciB0eXBlOiAke25hbWV9YCk7XG4gIH1cbn1cblxuLy8gcGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGFzIGFuIGludGVnZXJcbmZ1bmN0aW9uIGdldEludCh2YWx1ZTogc3RyaW5nKSB7XG4gIC8vIHBhcnNlIHRoZSB2YWx1ZSBhcyBhIGRlY2ltYWwgbnVtYmVyIChiYXNlIDEwKVxuICBjb25zdCBwYXJzZWQgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICBpZiAoaXNOYU4ocGFyc2VkKSkge1xuICAgIHRocm93IG5ldyBjb21tYW5kZXIuSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJFbnRlciBhIHZhbGlkIG51bWJlci5cIik7XG4gIH1cblxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vLyBkZWZpbmUgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIHBhcnNlIHRoZW1cbi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vdGovY29tbWFuZGVyLmpzXG5wcm9ncmFtXG4gIC5kZXNjcmlwdGlvbihcIlJ1biBhIHNpbXBsZSBBZ2FtYSBpbnRlZ3JhdGlvbiB0ZXN0XCIpXG4gIC5vcHRpb24oXCItdSwgLS11cmwgPHVybD5cIiwgXCJBZ2FtYSBzZXJ2ZXIgVVJMXCIsIFwiaHR0cDovL2xvY2FsaG9zdFwiKVxuICAub3B0aW9uKFwiLXAsIC0tcGFzc3dvcmQgPHBhc3N3b3JkPlwiLCBcIkFnYW1hIGxvZ2luIHBhc3N3b3JkXCIsIFwibm90czNjcjN0XCIpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbihcIi1iLCAtLWJyb3dzZXIgPGJyb3dzZXI+XCIsIFwiQnJvd3NlciB1c2VkIGZvciBydW5uaW5nIHRoZSB0ZXN0XCIpXG4gICAgLmNob2ljZXMoW1wiZmlyZWZveFwiLCBcImNocm9tZVwiLCBcImNocm9taXVtXCJdKVxuICAgIC5kZWZhdWx0KFwiZmlyZWZveFwiKVxuICApXG4gIC5vcHRpb24oXCItaCwgLS1oZWFkZWRcIiwgXCJSdW4gdGhlIGJyb3dzZXIgaW4gaGVhZGVkIG1vZGUgd2l0aCBVSSAodGhlIGRlZmF1bHQgaXMgaGVhZGxlc3MgbW9kZSlcIilcbiAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKFwiLWQsIC0tZGVsYXkgPG1pbGlzZWNvbmRzPlwiLCBcIkRlbGF5IGJldHdlZW4gdGhlIGJyb3dzZXIgYWN0aW9ucywgdXNlZnVsIGluIGhlYWRlZCBtb2RlXCIpXG4gICAgLmFyZ1BhcnNlcihnZXRJbnQpXG4gICAgLmRlZmF1bHQoMClcbiAgKVxuICAub3B0aW9uKFwiLWMsIC0tY29udGludWVcIiwgXCJDb250aW51ZSB0aGUgdGVzdCBhZnRlciBhIGZhaWx1cmUgKHRoZSBkZWZhdWx0IGlzIGFib3J0IG9uIGVycm9yKVwiKVxuICAucGFyc2UocHJvY2Vzcy5hcmd2KTtcblxuLy8gcGFyc2Ugb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmVcbmNvbnN0IG9wdGlvbnMgPSBwcm9ncmFtLm9wdHMoKTtcblxuY29uc3QgcHVwcGV0ZWVyTGF1bmNoT3B0aW9ucyA9IHtcbiAgLy8gXCJ3ZWJEcml2ZXJCaURpXCIgZG9lcyBub3Qgd29yayB3aXRoIG9sZCBGaXJlRm94LCBjb21tZW50IGl0IG91dCBpZiBuZWVkZWRcbiAgcHJvdG9jb2w6IFwid2ViRHJpdmVyQmlEaVwiIGFzIFByb3RvY29sVHlwZSxcbiAgaGVhZGxlc3M6ICFvcHRpb25zLmhlYWRlZCxcbiAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsXG4gIHRpbWVvdXQ6IDMwMDAwLFxuICBzbG93TW86IG9wdGlvbnMuZGVsYXksXG4gIGRlZmF1bHRWaWV3cG9ydDoge1xuICAgIHdpZHRoOiAxMjgwLFxuICAgIGhlaWdodDogNzY4XG4gIH0sXG4gIC4uLmJyb3dzZXJTZXR0aW5ncyhvcHRpb25zLmJyb3dzZXIpXG59XG5cbmV4cG9ydCB7IGJvb2xlYW5FbnYsIG9wdGlvbnMsIHB1cHBldGVlckxhdW5jaE9wdGlvbnMgfTtcbiIsImltcG9ydCBwdXBwZXRlZXIsIHsgdHlwZSBMb2NhdG9yLCB0eXBlIFBhZ2UgfSBmcm9tIFwicHVwcGV0ZWVyLWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIENvbmZpcm1JbnN0YWxsYXRpb25Qb3B1cCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWdlOiBQYWdlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGludWVUZXh0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJidXR0b246Oi1wLXRleHQoJ0NvbnRpbnVlJylcIik7XG5cbiAgICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxuXG4gICAgYXN5bmMgY29udGludWUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29udGludWVUZXh0KCkuY2xpY2soKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgcHVwcGV0ZWVyLCB7IHR5cGUgTG9jYXRvciwgdHlwZSBQYWdlIH0gZnJvbSBcInB1cHBldGVlci1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVGaXJzdFVzZXJQYWdlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmdWxsTmFtZUlucHV0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJpbnB1dCN1c2VyRnVsbE5hbWVcIik7XG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2VybmFtZUlucHV0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJpbnB1dCN1c2VyTmFtZVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhc3N3b3JkSW5wdXQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImlucHV0I3Bhc3N3b3JkXCIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFzc3dvcmRDb25maXJtYXRpb25JbnB1dCA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiaW5wdXQjcGFzc3dvcmRDb25maXJtYXRpb25cIik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhY2NlcHRCdXR0b24gPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImJ1dHRvbltmb3JtPSdmaXJzdFVzZXJGb3JtJ11cIik7XG5cbiAgICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxuXG4gICAgYXN5bmMgZmlsbEZ1bGxOYW1lKGZ1bGxOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5mdWxsTmFtZUlucHV0KCkuZmlsbChmdWxsTmFtZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZmlsbFVzZXJOYW1lKHVzZXJOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy51c2VybmFtZUlucHV0KCkuZmlsbCh1c2VyTmFtZSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZmlsbFBhc3N3b3JkKHBhc3N3b3JkOiBzdHJpbmcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXNzd29yZElucHV0KCkuZmlsbChwYXNzd29yZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZmlsbFBhc3N3b3JkQ29uZmlybWF0aW9uKHBhc3N3b3JkOiBzdHJpbmcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXNzd29yZENvbmZpcm1hdGlvbklucHV0KCkuZmlsbChwYXNzd29yZCk7XG4gICAgfVxuXG4gICAgYXN5bmMgYWNjZXB0KCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFjY2VwdEJ1dHRvbigpLmNsaWNrKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHB1cHBldGVlciwgeyB0eXBlIFBhZ2UgfSBmcm9tIFwicHVwcGV0ZWVyLWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIExvZ2luQXNSb290UGFnZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWdlOiBQYWdlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFzc3dvcmRJbnB1dCA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiaW5wdXQjcGFzc3dvcmRcIik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dJbkJ1dHRvbiA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYnV0dG9uW3R5cGU9J3N1Ym1pdCddXCIpO1xuXG4gICAgY29uc3RydWN0b3IocGFnZTogUGFnZSkge1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIH1cblxuICAgIGFzeW5jIGxvZ0luKHBhc3N3b3JkOiBzdHJpbmcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXNzd29yZElucHV0KCkuZmlsbChwYXNzd29yZCk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nSW5CdXR0b24oKS5jbGljaygpO1xuICAgIH1cbn1cbiIsImltcG9ydCBwdXBwZXRlZXIsIHsgdHlwZSBMb2NhdG9yLCB0eXBlIFBhZ2UgfSBmcm9tIFwicHVwcGV0ZWVyLWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIE92ZXJ2aWV3UGFnZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWdlOiBQYWdlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFsbFRleHQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImJ1dHRvbjo6LXAtdGV4dCgnSW5zdGFsbCcpXCIpO1xuXG4gICAgY29uc3RydWN0b3IocGFnZTogUGFnZSkge1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIH1cblxuICAgIGFzeW5jIGluc3RhbGwoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5zdGFsbFRleHQoKS5jbGljaygpO1xuICAgIH1cbn1cbiIsImltcG9ydCBwdXBwZXRlZXIsIHsgdHlwZSBMb2NhdG9yLCB0eXBlIFBhZ2UgfSBmcm9tIFwicHVwcGV0ZWVyLWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFByb2R1Y3RTZWxlY3Rpb25QYWdlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsZWFwVGV4dCA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiOjotcC10ZXh0KCdMZWFwIDE2LjAgQWxwaGEnKVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1pY3JvT3NUZXh0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCI6Oi1wLXRleHQoJ29wZW5TVVNFIE1pY3JvT1MnKVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHR1bWJsZXdlZWRUZXh0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCI6Oi1wLXRleHQoJ29wZW5TVVNFIFR1bWJsZXdlZWQnKVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdEJ1dHRvbiA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYnV0dG9uW2Zvcm09J3Byb2R1Y3RTZWxlY3Rpb25Gb3JtJ11cIik7XG5cbiAgICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VsZWN0TGVhcCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sZWFwVGV4dCgpLmNsaWNrKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VsZWN0QnV0dG9uKCkuY2xpY2soKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZWxlY3RNaWNyb09zKCkge1xuICAgICAgICBhd2FpdCB0aGlzLm1pY3JvT3NUZXh0KCkuY2xpY2soKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZWxlY3RCdXR0b24oKS5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIHNlbGVjdFR1bWJsZXdlZWQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudHVtYmxld2VlZFRleHQoKS5jbGljaygpO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbGVjdEJ1dHRvbigpLmNsaWNrKCk7XG4gICAgfVxufVxuXG4iLCJpbXBvcnQgcHVwcGV0ZWVyLCB7IHR5cGUgTG9jYXRvciwgdHlwZSBQYWdlIH0gZnJvbSBcInB1cHBldGVlci1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRBUm9vdFBhc3N3b3JkUGFnZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWdlOiBQYWdlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFzc3dvcmRJbnB1dCA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiaW5wdXQjcGFzc3dvcmRcIik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXNzd29yZENvbmZpcm1hdGlvbklucHV0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJpbnB1dCNwYXNzd29yZENvbmZpcm1hdGlvblwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpcm1UZXh0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJidXR0b246Oi1wLXRleHQoQ29uZmlybSlcIik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjYW5jZWxUZXh0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJidXR0b246Oi1wLXRleHQoQ2FuY2VsKVwiKTtcblxuICAgIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UpIHtcbiAgICAgICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICB9XG5cbiAgICBhc3luYyBmaWxsUGFzc3dvcmQocGFzc3dvcmQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLnBhc3N3b3JkSW5wdXQoKS5maWxsKHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICBhc3luYyBmaWxsUGFzc3dvcmRDb25maXJtYXRpb24ocGFzc3dvcmQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLnBhc3N3b3JkQ29uZmlybWF0aW9uSW5wdXQoKS5maWxsKHBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICBhc3luYyBjb25maXJtKCkge1xuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpcm1UZXh0KCkuY2xpY2soKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyB0eXBlIFBhZ2UgfSBmcm9tIFwicHVwcGV0ZWVyLWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFNpZGViYXJQYWdlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvdmVydmlld0xpbmsgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImFbaHJlZj0nIy9vdmVydmlldyddXCIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxpemF0aW9uTGluayA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYVtocmVmPScjL2wxMG4nXVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5ldHdvcmtMaW5rID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJhW2hyZWY9JyMvbmV0d29yayddXCIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZUxpbmsgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImFbaHJlZj0nIy9zdG9yYWdlJ11cIik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzb2Z0d2FyZUxpbmsgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImFbaHJlZj0nIy9zb2Z0d2FyZSddXCIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlcnNMaW5rID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJhW2hyZWY9JyMvdXNlcnMnXVwiKTtcbiAgICBcbiAgICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxuXG4gICAgYXN5bmMgZ29Ub092ZXJ2aWV3KCkge1xuICAgICAgICBhd2FpdCB0aGlzLm92ZXJ2aWV3TGluaygpLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ29Ub0xvY2FsaXphdGlvbigpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2NhbGl6YXRpb25MaW5rKCkuY2xpY2soKTtcbiAgICB9XG5cbiAgICBhc3luYyBnb1RvTmV0d29yaygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5uZXR3b3JrTGluaygpLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ29Ub1N0b3JhZ2UoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZUxpbmsoKS5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIGdvVG9Tb2Z0d2FyZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zb2Z0d2FyZUxpbmsoKS5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIGdvVG9Vc2VycygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy51c2Vyc0xpbmsoKS5jbGljaygpO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IHB1cHBldGVlciwgeyB0eXBlIExvY2F0b3IsIHR5cGUgUGFnZSB9IGZyb20gXCJwdXBwZXRlZXItY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgVXNlcnNQYWdlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmaXJzdFVzZXJMaW5rID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJhW2hyZWY9JyMvdXNlcnMvZmlyc3QnXVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNldEFQYXNzd29yZFRleHQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImJ1dHRvbjo6LXAtdGV4dChTZXQgYSBwYXNzd29yZClcIik7XG5cbiAgICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxuXG4gICAgYXN5bmMgZGVmaW5lQVVzZXJOb3coKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlyc3RVc2VyTGluaygpLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0QVBhc3N3b3JkKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnNldEFQYXNzd29yZFRleHQoKS5jbGljaygpO1xuICAgIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBwdXBwZXRlZXIsIHsgdHlwZSBCcm93c2VyLCB0eXBlIFBhZ2UgfSBmcm9tIFwicHVwcGV0ZWVyLWNvcmVcIjtcblxuaW1wb3J0IHsgaXQgYXMgdGVzdEl0LCBkZXNjcmliZSwgYmVmb3JlLCBhZnRlciwgc2tpcCB9IGZyb20gXCJub2RlOnRlc3RcIjtcbmltcG9ydCBhc3NlcnQgZnJvbSBcIm5vZGU6YXNzZXJ0L3N0cmljdFwiO1xuXG5pbXBvcnQgeyBib29sZWFuRW52LCBvcHRpb25zLCBwdXBwZXRlZXJMYXVuY2hPcHRpb25zIH0gZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb25cIjtcblxuXG5pbXBvcnQgeyBMb2dpbkFzUm9vdFBhZ2UgfSBmcm9tIFwiLi4vcGFnZXMvbG9naW4tYXMtcm9vdC1wYWdlXCI7XG5pbXBvcnQgeyBQcm9kdWN0U2VsZWN0aW9uUGFnZSB9IGZyb20gXCIuLi9wYWdlcy9wcm9kdWN0LXNlbGVjdGlvbi1wYWdlXCI7XG5pbXBvcnQgeyBTaWRlYmFyUGFnZSB9IGZyb20gXCIuLi9wYWdlcy9zaWRlYmFyLXBhZ2VcIjtcbmltcG9ydCB7IFVzZXJzUGFnZSB9IGZyb20gXCIuLi9wYWdlcy91c2Vycy1wYWdlXCI7XG5pbXBvcnQgeyBTZXRBUm9vdFBhc3N3b3JkUGFnZSB9IGZyb20gXCIuLi9wYWdlcy9yb290LXBhc3N3b3JkLXBhZ2VcIjtcbmltcG9ydCB7IENyZWF0ZUZpcnN0VXNlclBhZ2UgfSBmcm9tIFwiLi4vcGFnZXMvY3JlYXRlLXVzZXItcGFnZVwiXG5pbXBvcnQgeyBPdmVydmlld1BhZ2UgfSBmcm9tIFwiLi4vcGFnZXMvb3Zlcmlldy1wYWdlXCI7XG5pbXBvcnQgeyBDb25maXJtSW5zdGFsbGF0aW9uUG9wdXAgfSBmcm9tIFwiLi4vcGFnZXMvY29uZmlybS1pbnN0YWxsYXRpb24tcGFnZVwiO1xuXG5sZXQgcGFnZTogUGFnZTtcbmxldCBicm93c2VyOiBCcm93c2VyO1xubGV0IGZhaWxlZCA9IGZhbHNlO1xuXG4vLyBkZWZpbmUgaXQoKSBhcyBhIHdyYXBwZXIgd2hpY2ggZHVtcHMgdGhlIHBhZ2Ugb24gYSBmYWlsdXJlXG5hc3luYyBmdW5jdGlvbiBpdChsYWJlbDogc3RyaW5nLCB0ZXN0OiAoKSA9PiBQcm9taXNlPHZvaWQ+LCB0aW1lb3V0PzogbnVtYmVyKSB7XG4gIHRlc3RJdChsYWJlbCxcbiAgICAvLyBhYm9ydCB3aGVuIHRoZSB0ZXN0IHRha2VzIG1vcmUgdGhhbiBvbmUgbWludXRlXG4gICAgeyB0aW1lb3V0OiB0aW1lb3V0IHx8IDYwMDAwIH0sXG4gICAgYXN5bmMgKHQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChmYWlsZWQpXG4gICAgICAgICAgdC5za2lwKClcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGF3YWl0IHRlc3QoKTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIW9wdGlvbnMuY29udGludWUpIGZhaWxlZCA9IHRydWU7XG4gICAgICAgIGlmIChwYWdlKSB7XG4gICAgICAgICAgLy8gZGlyZWN0b3J5IGZvciBzdG9yaW5nIHRoZSBkYXRhXG4gICAgICAgICAgY29uc3QgZGlyID0gXCJsb2dcIjtcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkgZnMubWtkaXJTeW5jKGRpcik7XG5cbiAgICAgICAgICAvLyBiYXNlIGZpbGUgbmFtZSBmb3IgdGhlIGR1bXBzXG4gICAgICAgICAgY29uc3QgbmFtZSA9IHBhdGguam9pbihkaXIsIGxhYmVsLnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIl9cIikpO1xuICAgICAgICAgIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IHBhdGg6IG5hbWUgKyBcIi5wbmdcIiB9KTtcbiAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcGFnZS5jb250ZW50KCk7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhuYW1lICsgXCIuaHRtbFwiLCBodG1sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRlc3QgZmFpbGVkIVwiLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn07XG5cbmNvbnN0IGFnYW1hSW5zdGFsbCA9IGJvb2xlYW5FbnYoXCJBR0FNQV9JTlNUQUxMXCIsIHRydWUpO1xuY29uc3QgYWdhbWFEYXNkID0gYm9vbGVhbkVudihcIkFHQU1BX0RBU0RcIiwgZmFsc2UpO1xuY29uc3QgYWdhbWFQcm9kdWN0ID0gcHJvY2Vzcy5lbnYuQUdBTUFfUFJPRFVDVCB8fCBcInR1bWJsZXdlZWRcIjtcblxuY29uc3QgYWdhbWFVc2VyID0gXCJiZXJuaGFyZFwiO1xuY29uc3QgYWdhbWFVc2VyRnVsbE5hbWUgPSBcIkJlcm5oYXJkIE0uIFdpZWRlbWFublwiO1xuXG5kZXNjcmliZShcIkFnYW1hIHRlc3RcIiwgZnVuY3Rpb24gKCkge1xuICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKHB1cHBldGVlckxhdW5jaE9wdGlvbnMpO1xuICAgIHBhZ2UgPSBhd2FpdCBicm93c2VyLm5ld1BhZ2UoKTtcbiAgICBwYWdlLnNldERlZmF1bHRUaW1lb3V0KDIwMDAwKTtcbiAgICBhd2FpdCBwYWdlLmdvdG8ob3B0aW9ucy51cmwsIHsgdGltZW91dDogNjAwMDAsIHdhaXRVbnRpbDogXCJkb21jb250ZW50bG9hZGVkXCIgfSk7XG4gICAgYXdhaXQgcGFnZS53YWl0Rm9yTmV0d29ya0lkbGUoeyBpZGxlVGltZTogMTAwMCB9KTtcbiAgfSk7XG5cbiAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IHBhZ2UuY2xvc2UoKTtcbiAgICBhd2FpdCBicm93c2VyLmNsb3NlKCk7XG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgaGF2ZSBBZ2FtYSBwYWdlIHRpdGxlXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKGF3YWl0IHBhZ2UudGl0bGUoKSwgXCJBZ2FtYVwiKTtcbiAgfSk7XG5cbiAgaXQoXCJhbGxvd3MgbG9nZ2luZyBpblwiLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbG9naW5Bc1Jvb3QgPSBuZXcgTG9naW5Bc1Jvb3RQYWdlKHBhZ2UpO1xuICAgIGF3YWl0IGxvZ2luQXNSb290LmxvZ0luKG9wdGlvbnMucGFzc3dvcmQpO1xuICB9KTtcblxuICBpdChcInNob3VsZCBkaXNwbGF5IHRoZSBwcm9kdWN0IHNlbGVjdGlvbiBkaWFsb2dcIiwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHByb2R1Y3RzZWxlY3Rpb24gPSBuZXcgUHJvZHVjdFNlbGVjdGlvblBhZ2UocGFnZSk7XG5cbiAgICBsZXQgdGltZW91dCA9IDIgKiA2MCAqIDEwMDA7XG5cbiAgICBpZiAoYWdhbWFQcm9kdWN0ID09PSBcImxlYXBcIikge1xuICAgICAgYXdhaXQgcHJvZHVjdHNlbGVjdGlvbi5zZWxlY3RMZWFwKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgYXdhaXQgcHJvZHVjdHNlbGVjdGlvbi5zZWxlY3RUdW1ibGV3ZWVkKCk7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIGNvbmZpZ3VyYXRpb24gcHJvY2VkdXJlIGlzIHByb2dyZXNzaW5nXG4gICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiOjotcC10ZXh0KENvbmZpZ3VyaW5nIHRoZSBwcm9kdWN0KVwiKS53YWl0KCk7XG5cbiAgICAvLyByZWZyZXNoaW5nIHRoZSByZXBvc2l0b3JpZXMgbWlnaHQgdGFrZSBsb25nIHRpbWVcbiAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJoMzo6LXAtdGV4dCgnT3ZlcnZpZXcnKVwiKS5zZXRUaW1lb3V0KHRpbWVvdXQpLndhaXQoKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgZGlzcGxheSBvdmVydmlldyBzZWN0aW9uXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJoMzo6LXAtdGV4dCgnT3ZlcnZpZXcnKVwiKS53YWl0KCk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGFsbG93IHNldHRpbmcgdGhlIHJvb3QgcGFzc3dvcmRcIiwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNpZGViYXIgPSBuZXcgU2lkZWJhclBhZ2UocGFnZSk7XG4gICAgY29uc3QgdXNlcnMgPSBuZXcgVXNlcnNQYWdlKHBhZ2UpO1xuICAgIGNvbnN0IHNldEFSb290UGFzc3dvcmQgPSBuZXcgU2V0QVJvb3RQYXNzd29yZFBhZ2UocGFnZSk7XG5cbiAgICBhd2FpdCBzaWRlYmFyLmdvVG9Vc2VycygpO1xuICAgIGF3YWl0IHVzZXJzLnNldEFQYXNzd29yZCgpO1xuICAgIGF3YWl0IHNldEFSb290UGFzc3dvcmQuZmlsbFBhc3N3b3JkKG9wdGlvbnMucGFzc3dvcmQpO1xuICAgIGF3YWl0IHNldEFSb290UGFzc3dvcmQuZmlsbFBhc3N3b3JkQ29uZmlybWF0aW9uKG9wdGlvbnMucGFzc3dvcmQpO1xuICAgIGF3YWl0IHNldEFSb290UGFzc3dvcmQuY29uZmlybSgpO1xuXG4gICAgLy8gYSBwb3B1cCB0byBkaXNhcHBlYXIgd2hpY2ggY2hhbmdlcyB0aGUgcG9zaXRpb25zIG9mIG90aGVyIGVsZW1lbnRzXG4gICAgLy8gcGFnZS53YWl0Rm9yTmV0d29ya0lkbGUgc29sdmVzIHRoaXMgaXNzdWVcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY3JlYXRlIGZpcnN0IHVzZXJcIiwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHVzZXJzID0gbmV3IFVzZXJzUGFnZShwYWdlKTtcbiAgICBjb25zdCBjcmVhdGVGaXJzdFVzZXIgPSBuZXcgQ3JlYXRlRmlyc3RVc2VyUGFnZShwYWdlKTtcbiAgICBhd2FpdCB1c2Vycy5kZWZpbmVBVXNlck5vdygpO1xuICAgIGF3YWl0IGNyZWF0ZUZpcnN0VXNlci5maWxsRnVsbE5hbWUoYWdhbWFVc2VyRnVsbE5hbWUpO1xuICAgIGF3YWl0IGNyZWF0ZUZpcnN0VXNlci5maWxsVXNlck5hbWUoYWdhbWFVc2VyKTtcbiAgICBhd2FpdCBjcmVhdGVGaXJzdFVzZXIuZmlsbFBhc3N3b3JkKG9wdGlvbnMucGFzc3dvcmQpO1xuICAgIGF3YWl0IGNyZWF0ZUZpcnN0VXNlci5maWxsUGFzc3dvcmRDb25maXJtYXRpb24ob3B0aW9ucy5wYXNzd29yZCk7XG4gICAgYXdhaXQgY3JlYXRlRmlyc3RVc2VyLmFjY2VwdCgpO1xuICB9KTtcblxuICBpZiAoYWdhbWFEYXNkKSB7XG4gICAgaXQoXCJzaG91bGQgcHJlcGFyZSBzdG9yYWdlXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcblxuICAgICAgLy8gV29ya2Fyb3VuZCwgc29tZXRpbWVzIHRoZSBVSSBzZWVtcyBub3QgcmVzcG9uc2l2ZVxuICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiYVtocmVmPScjL3N0b3JhZ2UnXVwiKS5jbGljayh7IGRlbGF5OiAxMDAwIH0pO1xuICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiYVtocmVmPScjL3N0b3JhZ2UnXVwiKS5jbGljayh7IGRlbGF5OiAxMDAwIH0pO1xuICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiYVtocmVmPScjL3N0b3JhZ2UvdGFyZ2V0LWRldmljZSddXCIpLmNsaWNrKCk7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJzcGFuOjotcC10ZXh0KCdzdG9yYWdlIHRlY2hzJylcIikuY2xpY2soKTtcbiAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcihcInNwYW46Oi1wLXRleHQoJ0RBU0QnKVwiKS5jbGljayh7IGRlbGF5OiAxMDAwIH0pO1xuXG4gICAgICAvLyBFbmFibGluZyBEQVNEIGRldmljZSwgYnkgZGVmYXVsdCBpdCBpcyBhbHdheXMgZGlzYWJsZWRcbiAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcihcImlucHV0W25hbWU9J2NoZWNrcm93MCddXCIpLmNsaWNrKHsgZGVsYXk6IDEwMDAgfSk7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJzcGFuOjotcC10ZXh0KCdQZXJmb3JtIGFuIGFjdGlvbicpXCIpLmNsaWNrKHsgZGVsYXk6IDEwMDAgfSk7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJzcGFuOjotcC10ZXh0KCdBY3RpdmF0ZScpXCIpLmNsaWNrKCk7XG5cbiAgICAgIC8vIFNlbGVjdGluZyBpbnN0YWxsYXRpb24gZGV2aWNlXG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJhW2hyZWY9JyMvc3RvcmFnZSddXCIpLmNsaWNrKCk7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJhW2hyZWY9JyMvc3RvcmFnZS90YXJnZXQtZGV2aWNlJ11cIikuY2xpY2soeyBkZWxheTogMTAwMCB9KTtcbiAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcihcImlucHV0W2FyaWEtbGFiZWw9J1NlbGVjdCByb3cgMCddXCIpLmNsaWNrKCk7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJidXR0b25bZm9ybT0ndGFyZ2V0U2VsZWN0aW9uJ11cIikuY2xpY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIGl0KFwic2hvdWxkIGJlIHJlYWR5IGZvciBpbnN0YWxsYXRpb25cIiwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNpZGViYXIgPSBuZXcgU2lkZWJhclBhZ2UocGFnZSk7XG4gICAgYXdhaXQgc2lkZWJhci5nb1RvT3ZlcnZpZXcoKTtcbiAgICAvLyBJbiBPdmVydmlldywgU3RvcmFnZSBzZWN0aW9uIHRha2VzIG1vcmUgdGltZSB0byByZWZyZXNoIGNoYW5naW5nIFxuICAgIC8vIHRoZSBwb3NpdGlvbiBpbiB0aGUgc2NyZWVuIG9mIHRleHQgJ1JlYWR5IGZvciBpbnN0YWxsYXRpb24gYW5kIGJ1dHRvbiAnSW5zdGFsbCdcbiAgICAvLyBwYWdlLndhaXRGb3JOZXR3b3JrSWRsZSBzb2x2ZXMgdGhpcyBpc3N1ZVxuICAgIGF3YWl0IHBhZ2UubG9jYXRvcihcImg0OjotcC10ZXh0KCdSZWFkeSBmb3IgaW5zdGFsbGF0aW9uJylcIikud2FpdCgpO1xuICB9KTtcblxuICAvLyBGb3IgZGV2ZWxvcG1lbnQgd2lsbCBiZSB1c2VmdWwgdG8gc3RvcCBiZWZvcmUgc3RhcnRpbmcgaW5zdGFsbGF0aW9uXG4gIGlmIChhZ2FtYUluc3RhbGwgPT09IHRydWUpIHtcbiAgICBpdChcInNob3VsZCBzdGFydCBpbnN0YWxsYXRpb25cIiwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3ZlcnZpZXcgPSBuZXcgT3ZlcnZpZXdQYWdlKHBhZ2UpO1xuICAgICAgY29uc3QgaW5zdGFsbCA9IG5ldyBDb25maXJtSW5zdGFsbGF0aW9uUG9wdXAocGFnZSk7XG4gICAgICBhd2FpdCBvdmVydmlldy5pbnN0YWxsKCk7XG4gICAgICBhd2FpdCBpbnN0YWxsLmNvbnRpbnVlKCk7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCI6Oi1wLXRleHQoSW5zdGFsbGluZyB0aGUpXCIpLndhaXQoKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGZpbmlzaCBpbnN0YWxsYXRpb25cIiwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgcGFnZVxuICAgICAgICAubG9jYXRvcihcImgyOjotcC10ZXh0KCdDb25ncmF0dWxhdGlvbnMhJylcIilcbiAgICAgICAgLnNldFRpbWVvdXQoMTUgKiA2MCAqIDEwMDApXG4gICAgICAgIC53YWl0KCk7XG4gICAgfSwgMTUgKiA2MCAqIDEwMDApO1xuICB9XG59KTtcbiIsInZhciB0aHJvdWdoID0gcmVxdWlyZSgndGhyb3VnaCcpO1xudmFyIGJ6MiA9IHJlcXVpcmUoJy4vbGliL2J6aXAyJyk7XG52YXIgYml0SXRlcmF0b3IgPSByZXF1aXJlKCcuL2xpYi9iaXRfaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmJ6aXAyU3RyZWFtO1xuXG5mdW5jdGlvbiB1bmJ6aXAyU3RyZWFtKCkge1xuICAgIHZhciBidWZmZXJRdWV1ZSA9IFtdO1xuICAgIHZhciBoYXNCeXRlcyA9IDA7XG4gICAgdmFyIGJsb2NrU2l6ZSA9IDA7XG4gICAgdmFyIGJyb2tlbiA9IGZhbHNlO1xuICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgdmFyIGJpdFJlYWRlciA9IG51bGw7XG4gICAgdmFyIHN0cmVhbUNSQyA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBkZWNvbXByZXNzQmxvY2socHVzaCl7XG4gICAgICAgIGlmKCFibG9ja1NpemUpe1xuICAgICAgICAgICAgYmxvY2tTaXplID0gYnoyLmhlYWRlcihiaXRSZWFkZXIpO1xuICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKFwiZ290IGhlYWRlciBvZlwiLCBibG9ja1NpemUpO1xuICAgICAgICAgICAgc3RyZWFtQ1JDID0gMDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHZhciBidWZzaXplID0gMTAwMDAwICogYmxvY2tTaXplO1xuICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBJbnQzMkFycmF5KGJ1ZnNpemUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgY2h1bmsgPSBbXTtcbiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oYikge1xuICAgICAgICAgICAgICAgIGNodW5rLnB1c2goYik7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzdHJlYW1DUkMgPSBiejIuZGVjb21wcmVzcyhiaXRSZWFkZXIsIGYsIGJ1ZiwgYnVmc2l6ZSwgc3RyZWFtQ1JDKTtcbiAgICAgICAgICAgIGlmIChzdHJlYW1DUkMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyByZXNldCBmb3IgbmV4dCBiemlwMiBoZWFkZXJcbiAgICAgICAgICAgICAgICBibG9ja1NpemUgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcignZGVjb21wcmVzc2VkJywgY2h1bmsubGVuZ3RoLCdieXRlcycpO1xuICAgICAgICAgICAgICAgIHB1c2goQnVmZmVyLmZyb20oY2h1bmspKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBvdXRsZW5ndGggPSAwO1xuICAgIGZ1bmN0aW9uIGRlY29tcHJlc3NBbmRRdWV1ZShzdHJlYW0pIHtcbiAgICAgICAgaWYgKGJyb2tlbikgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGRlY29tcHJlc3NCbG9jayhmdW5jdGlvbihkKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnF1ZXVlKGQpO1xuICAgICAgICAgICAgICAgIGlmIChkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcignd3JpdGUgYXQnLCBvdXRsZW5ndGgudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGVuZ3RoICs9IGQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcignd3JpdHRlbiBFT1MnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICAgICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhyb3VnaChcbiAgICAgICAgZnVuY3Rpb24gd3JpdGUoZGF0YSkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKCdyZWNlaXZlZCcsIGRhdGEubGVuZ3RoLCdieXRlcyBpbicsIHR5cGVvZiBkYXRhKTtcbiAgICAgICAgICAgIGJ1ZmZlclF1ZXVlLnB1c2goZGF0YSk7XG4gICAgICAgICAgICBoYXNCeXRlcyArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChiaXRSZWFkZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBiaXRSZWFkZXIgPSBiaXRJdGVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoIWJyb2tlbiAmJiBoYXNCeXRlcyAtIGJpdFJlYWRlci5ieXRlc1JlYWQgKyAxID49ICgoMjUwMDAgKyAxMDAwMDAgKiBibG9ja1NpemUpIHx8IDQpKXtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoJ2RlY29tcHJlc3Npbmcgd2l0aCcsIGhhc0J5dGVzIC0gYml0UmVhZGVyLmJ5dGVzUmVhZCArIDEsICdieXRlcyBpbiBidWZmZXInKTtcbiAgICAgICAgICAgICAgICBkZWNvbXByZXNzQW5kUXVldWUodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uIGVuZCh4KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoeCwnbGFzdCBjb21wcmVzc2luZyB3aXRoJywgaGFzQnl0ZXMsICdieXRlcyBpbiBidWZmZXInKTtcbiAgICAgICAgICAgIHdoaWxlICghYnJva2VuICYmIGJpdFJlYWRlciAmJiBoYXNCeXRlcyA+IGJpdFJlYWRlci5ieXRlc1JlYWQpe1xuICAgICAgICAgICAgICAgIGRlY29tcHJlc3NBbmRRdWV1ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYnJva2VuKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbUNSQyAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihcImlucHV0IHN0cmVhbSBlbmRlZCBwcmVtYXR1cmVseVwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG59XG5cbiIsInZhciBCSVRNQVNLID0gWzAsIDB4MDEsIDB4MDMsIDB4MDcsIDB4MEYsIDB4MUYsIDB4M0YsIDB4N0YsIDB4RkZdO1xuXG4vLyByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZWFkcyBiaXRzLlxuLy8gdGFrZXMgYSBidWZmZXIgaXRlcmF0b3IgYXMgaW5wdXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYml0SXRlcmF0b3IobmV4dEJ1ZmZlcikge1xuICAgIHZhciBiaXQgPSAwLCBieXRlID0gMDtcbiAgICB2YXIgYnl0ZXMgPSBuZXh0QnVmZmVyKCk7XG4gICAgdmFyIGYgPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmIChuID09PSBudWxsICYmIGJpdCAhPSAwKSB7ICAvLyBhbGlnbiB0byBieXRlIGJvdW5kYXJ5XG4gICAgICAgICAgICBiaXQgPSAwXG4gICAgICAgICAgICBieXRlKys7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICAgIHdoaWxlKG4gPiAwKSB7XG4gICAgICAgICAgICBpZiAoYnl0ZSA+PSBieXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBieXRlID0gMDtcbiAgICAgICAgICAgICAgICBieXRlcyA9IG5leHRCdWZmZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBsZWZ0ID0gOCAtIGJpdDtcbiAgICAgICAgICAgIGlmIChiaXQgPT09IDAgJiYgbiA+IDApXG4gICAgICAgICAgICAgICAgZi5ieXRlc1JlYWQrKztcbiAgICAgICAgICAgIGlmIChuID49IGxlZnQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPDw9IGxlZnQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0IHw9IChCSVRNQVNLW2xlZnRdICYgYnl0ZXNbYnl0ZSsrXSk7XG4gICAgICAgICAgICAgICAgYml0ID0gMDtcbiAgICAgICAgICAgICAgICBuIC09IGxlZnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA8PD0gbjtcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gKChieXRlc1tieXRlXSAmIChCSVRNQVNLW25dIDw8ICg4IC0gbiAtIGJpdCkpKSA+PiAoOCAtIG4gLSBiaXQpKTtcbiAgICAgICAgICAgICAgICBiaXQgKz0gbjtcbiAgICAgICAgICAgICAgICBuID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgZi5ieXRlc1JlYWQgPSAwO1xuICAgIHJldHVybiBmO1xufTtcbiIsIi8qIFxuICBiemlwMi5qcyAtIGEgc21hbGwgYnppcDIgZGVjb21wcmVzc2lvbiBpbXBsZW1lbnRhdGlvblxuICBcbiAgQ29weXJpZ2h0IDIwMTEgYnkgYW50aW1hdHRlcjE1IChhbnRpbWF0dGVyMTVAZ21haWwuY29tKVxuICBcbiAgQmFzZWQgb24gbWljcm8tYnVuemlwIGJ5IFJvYiBMYW5kbGV5IChyb2JAbGFuZGxleS5uZXQpLlxuXG4gIENvcHlyaWdodCAoYykgMjAxMSBieSBhbnRpbWF0dGVyMTUgKGFudGltYXR0ZXIxNUBnbWFpbC5jb20pLlxuXG4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4gIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSxcbiAgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSxcbiAgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlXG4gIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gIFxuICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgXG4gIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsXG4gIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEhcbiAgVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuKi9cbmZ1bmN0aW9uIEJ6aXAyRXJyb3IobWVzc2FnZSkge1xuICAgIHRoaXMubmFtZSA9ICdCemlwMkVycm9yJztcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xufVxuQnppcDJFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3I7XG4gXG52YXIgbWVzc2FnZSA9IHtcbiAgICBFcnJvcjogZnVuY3Rpb24obWVzc2FnZSkge3Rocm93IG5ldyBCemlwMkVycm9yKG1lc3NhZ2UpO31cbn07XG5cbnZhciBiemlwMiA9IHt9O1xuYnppcDIuQnppcDJFcnJvciA9IEJ6aXAyRXJyb3I7XG5cbmJ6aXAyLmNyY1RhYmxlID1cbltcbiAgIDB4MDAwMDAwMDAsIDB4MDRjMTFkYjcsIDB4MDk4MjNiNmUsIDB4MGQ0MzI2ZDksXG4gICAweDEzMDQ3NmRjLCAweDE3YzU2YjZiLCAweDFhODY0ZGIyLCAweDFlNDc1MDA1LFxuICAgMHgyNjA4ZWRiOCwgMHgyMmM5ZjAwZiwgMHgyZjhhZDZkNiwgMHgyYjRiY2I2MSxcbiAgIDB4MzUwYzliNjQsIDB4MzFjZDg2ZDMsIDB4M2M4ZWEwMGEsIDB4Mzg0ZmJkYmQsXG4gICAweDRjMTFkYjcwLCAweDQ4ZDBjNmM3LCAweDQ1OTNlMDFlLCAweDQxNTJmZGE5LFxuICAgMHg1ZjE1YWRhYywgMHg1YmQ0YjAxYiwgMHg1Njk3OTZjMiwgMHg1MjU2OGI3NSxcbiAgIDB4NmExOTM2YzgsIDB4NmVkODJiN2YsIDB4NjM5YjBkYTYsIDB4Njc1YTEwMTEsXG4gICAweDc5MWQ0MDE0LCAweDdkZGM1ZGEzLCAweDcwOWY3YjdhLCAweDc0NWU2NmNkLFxuICAgMHg5ODIzYjZlMCwgMHg5Y2UyYWI1NywgMHg5MWExOGQ4ZSwgMHg5NTYwOTAzOSxcbiAgIDB4OGIyN2MwM2MsIDB4OGZlNmRkOGIsIDB4ODJhNWZiNTIsIDB4ODY2NGU2ZTUsXG4gICAweGJlMmI1YjU4LCAweGJhZWE0NmVmLCAweGI3YTk2MDM2LCAweGIzNjg3ZDgxLFxuICAgMHhhZDJmMmQ4NCwgMHhhOWVlMzAzMywgMHhhNGFkMTZlYSwgMHhhMDZjMGI1ZCxcbiAgIDB4ZDQzMjZkOTAsIDB4ZDBmMzcwMjcsIDB4ZGRiMDU2ZmUsIDB4ZDk3MTRiNDksXG4gICAweGM3MzYxYjRjLCAweGMzZjcwNmZiLCAweGNlYjQyMDIyLCAweGNhNzUzZDk1LFxuICAgMHhmMjNhODAyOCwgMHhmNmZiOWQ5ZiwgMHhmYmI4YmI0NiwgMHhmZjc5YTZmMSxcbiAgIDB4ZTEzZWY2ZjQsIDB4ZTVmZmViNDMsIDB4ZThiY2NkOWEsIDB4ZWM3ZGQwMmQsXG4gICAweDM0ODY3MDc3LCAweDMwNDc2ZGMwLCAweDNkMDQ0YjE5LCAweDM5YzU1NmFlLFxuICAgMHgyNzgyMDZhYiwgMHgyMzQzMWIxYywgMHgyZTAwM2RjNSwgMHgyYWMxMjA3MixcbiAgIDB4MTI4ZTlkY2YsIDB4MTY0ZjgwNzgsIDB4MWIwY2E2YTEsIDB4MWZjZGJiMTYsXG4gICAweDAxOGFlYjEzLCAweDA1NGJmNmE0LCAweDA4MDhkMDdkLCAweDBjYzljZGNhLFxuICAgMHg3ODk3YWIwNywgMHg3YzU2YjZiMCwgMHg3MTE1OTA2OSwgMHg3NWQ0OGRkZSxcbiAgIDB4NmI5M2RkZGIsIDB4NmY1MmMwNmMsIDB4NjIxMWU2YjUsIDB4NjZkMGZiMDIsXG4gICAweDVlOWY0NmJmLCAweDVhNWU1YjA4LCAweDU3MWQ3ZGQxLCAweDUzZGM2MDY2LFxuICAgMHg0ZDliMzA2MywgMHg0OTVhMmRkNCwgMHg0NDE5MGIwZCwgMHg0MGQ4MTZiYSxcbiAgIDB4YWNhNWM2OTcsIDB4YTg2NGRiMjAsIDB4YTUyN2ZkZjksIDB4YTFlNmUwNGUsXG4gICAweGJmYTFiMDRiLCAweGJiNjBhZGZjLCAweGI2MjM4YjI1LCAweGIyZTI5NjkyLFxuICAgMHg4YWFkMmIyZiwgMHg4ZTZjMzY5OCwgMHg4MzJmMTA0MSwgMHg4N2VlMGRmNixcbiAgIDB4OTlhOTVkZjMsIDB4OWQ2ODQwNDQsIDB4OTAyYjY2OWQsIDB4OTRlYTdiMmEsXG4gICAweGUwYjQxZGU3LCAweGU0NzUwMDUwLCAweGU5MzYyNjg5LCAweGVkZjczYjNlLFxuICAgMHhmM2IwNmIzYiwgMHhmNzcxNzY4YywgMHhmYTMyNTA1NSwgMHhmZWYzNGRlMixcbiAgIDB4YzZiY2YwNWYsIDB4YzI3ZGVkZTgsIDB4Y2YzZWNiMzEsIDB4Y2JmZmQ2ODYsXG4gICAweGQ1Yjg4NjgzLCAweGQxNzk5YjM0LCAweGRjM2FiZGVkLCAweGQ4ZmJhMDVhLFxuICAgMHg2OTBjZTBlZSwgMHg2ZGNkZmQ1OSwgMHg2MDhlZGI4MCwgMHg2NDRmYzYzNyxcbiAgIDB4N2EwODk2MzIsIDB4N2VjOThiODUsIDB4NzM4YWFkNWMsIDB4Nzc0YmIwZWIsXG4gICAweDRmMDQwZDU2LCAweDRiYzUxMGUxLCAweDQ2ODYzNjM4LCAweDQyNDcyYjhmLFxuICAgMHg1YzAwN2I4YSwgMHg1OGMxNjYzZCwgMHg1NTgyNDBlNCwgMHg1MTQzNWQ1MyxcbiAgIDB4MjUxZDNiOWUsIDB4MjFkYzI2MjksIDB4MmM5ZjAwZjAsIDB4Mjg1ZTFkNDcsXG4gICAweDM2MTk0ZDQyLCAweDMyZDg1MGY1LCAweDNmOWI3NjJjLCAweDNiNWE2YjliLFxuICAgMHgwMzE1ZDYyNiwgMHgwN2Q0Y2I5MSwgMHgwYTk3ZWQ0OCwgMHgwZTU2ZjBmZixcbiAgIDB4MTAxMWEwZmEsIDB4MTRkMGJkNGQsIDB4MTk5MzliOTQsIDB4MWQ1Mjg2MjMsXG4gICAweGYxMmY1NjBlLCAweGY1ZWU0YmI5LCAweGY4YWQ2ZDYwLCAweGZjNmM3MGQ3LFxuICAgMHhlMjJiMjBkMiwgMHhlNmVhM2Q2NSwgMHhlYmE5MWJiYywgMHhlZjY4MDYwYixcbiAgIDB4ZDcyN2JiYjYsIDB4ZDNlNmE2MDEsIDB4ZGVhNTgwZDgsIDB4ZGE2NDlkNmYsXG4gICAweGM0MjNjZDZhLCAweGMwZTJkMGRkLCAweGNkYTFmNjA0LCAweGM5NjBlYmIzLFxuICAgMHhiZDNlOGQ3ZSwgMHhiOWZmOTBjOSwgMHhiNGJjYjYxMCwgMHhiMDdkYWJhNyxcbiAgIDB4YWUzYWZiYTIsIDB4YWFmYmU2MTUsIDB4YTdiOGMwY2MsIDB4YTM3OWRkN2IsXG4gICAweDliMzY2MGM2LCAweDlmZjc3ZDcxLCAweDkyYjQ1YmE4LCAweDk2NzU0NjFmLFxuICAgMHg4ODMyMTYxYSwgMHg4Y2YzMGJhZCwgMHg4MWIwMmQ3NCwgMHg4NTcxMzBjMyxcbiAgIDB4NWQ4YTkwOTksIDB4NTk0YjhkMmUsIDB4NTQwOGFiZjcsIDB4NTBjOWI2NDAsXG4gICAweDRlOGVlNjQ1LCAweDRhNGZmYmYyLCAweDQ3MGNkZDJiLCAweDQzY2RjMDljLFxuICAgMHg3YjgyN2QyMSwgMHg3ZjQzNjA5NiwgMHg3MjAwNDY0ZiwgMHg3NmMxNWJmOCxcbiAgIDB4Njg4NjBiZmQsIDB4NmM0NzE2NGEsIDB4NjEwNDMwOTMsIDB4NjVjNTJkMjQsXG4gICAweDExOWI0YmU5LCAweDE1NWE1NjVlLCAweDE4MTk3MDg3LCAweDFjZDg2ZDMwLFxuICAgMHgwMjlmM2QzNSwgMHgwNjVlMjA4MiwgMHgwYjFkMDY1YiwgMHgwZmRjMWJlYyxcbiAgIDB4Mzc5M2E2NTEsIDB4MzM1MmJiZTYsIDB4M2UxMTlkM2YsIDB4M2FkMDgwODgsXG4gICAweDI0OTdkMDhkLCAweDIwNTZjZDNhLCAweDJkMTVlYmUzLCAweDI5ZDRmNjU0LFxuICAgMHhjNWE5MjY3OSwgMHhjMTY4M2JjZSwgMHhjYzJiMWQxNywgMHhjOGVhMDBhMCxcbiAgIDB4ZDZhZDUwYTUsIDB4ZDI2YzRkMTIsIDB4ZGYyZjZiY2IsIDB4ZGJlZTc2N2MsXG4gICAweGUzYTFjYmMxLCAweGU3NjBkNjc2LCAweGVhMjNmMGFmLCAweGVlZTJlZDE4LFxuICAgMHhmMGE1YmQxZCwgMHhmNDY0YTBhYSwgMHhmOTI3ODY3MywgMHhmZGU2OWJjNCxcbiAgIDB4ODliOGZkMDksIDB4OGQ3OWUwYmUsIDB4ODAzYWM2NjcsIDB4ODRmYmRiZDAsXG4gICAweDlhYmM4YmQ1LCAweDllN2Q5NjYyLCAweDkzM2ViMGJiLCAweDk3ZmZhZDBjLFxuICAgMHhhZmIwMTBiMSwgMHhhYjcxMGQwNiwgMHhhNjMyMmJkZiwgMHhhMmYzMzY2OCxcbiAgIDB4YmNiNDY2NmQsIDB4Yjg3NTdiZGEsIDB4YjUzNjVkMDMsIDB4YjFmNzQwYjRcbl07XG5cbmJ6aXAyLmFycmF5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICB2YXIgYml0ID0gMCwgYnl0ZSA9IDA7XG4gICAgdmFyIEJJVE1BU0sgPSBbMCwgMHgwMSwgMHgwMywgMHgwNywgMHgwRiwgMHgxRiwgMHgzRiwgMHg3RiwgMHhGRiBdO1xuICAgIHJldHVybiBmdW5jdGlvbihuKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgICB3aGlsZShuID4gMCkge1xuICAgICAgICAgICAgdmFyIGxlZnQgPSA4IC0gYml0O1xuICAgICAgICAgICAgaWYgKG4gPj0gbGVmdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA8PD0gbGVmdDtcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gKEJJVE1BU0tbbGVmdF0gJiBieXRlc1tieXRlKytdKTtcbiAgICAgICAgICAgICAgICBiaXQgPSAwO1xuICAgICAgICAgICAgICAgIG4gLT0gbGVmdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0IDw8PSBuO1xuICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAoKGJ5dGVzW2J5dGVdICYgKEJJVE1BU0tbbl0gPDwgKDggLSBuIC0gYml0KSkpID4+ICg4IC0gbiAtIGJpdCkpO1xuICAgICAgICAgICAgICAgIGJpdCArPSBuO1xuICAgICAgICAgICAgICAgIG4gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG4gICAgXG5iemlwMi5zaW1wbGUgPSBmdW5jdGlvbihzcmNidWZmZXIsIHN0cmVhbSkge1xuICAgIHZhciBiaXRzID0gYnppcDIuYXJyYXkoc3JjYnVmZmVyKTtcbiAgICB2YXIgc2l6ZSA9IGJ6aXAyLmhlYWRlcihiaXRzKTtcbiAgICB2YXIgcmV0ID0gZmFsc2U7XG4gICAgdmFyIGJ1ZnNpemUgPSAxMDAwMDAgKiBzaXplO1xuICAgIHZhciBidWYgPSBuZXcgSW50MzJBcnJheShidWZzaXplKTtcbiAgICBcbiAgICBkbyB7XG4gICAgICAgIHJldCA9IGJ6aXAyLmRlY29tcHJlc3MoYml0cywgc3RyZWFtLCBidWYsIGJ1ZnNpemUpOyAgICAgICAgXG4gICAgfSB3aGlsZSghcmV0KTtcbn1cblxuYnppcDIuaGVhZGVyID0gZnVuY3Rpb24oYml0cykge1xuICAgIHRoaXMuYnl0ZUNvdW50ID0gbmV3IEludDMyQXJyYXkoMjU2KTtcbiAgICB0aGlzLnN5bVRvQnl0ZSA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG4gICAgdGhpcy5tdGZTeW1ib2wgPSBuZXcgSW50MzJBcnJheSgyNTYpO1xuICAgIHRoaXMuc2VsZWN0b3JzID0gbmV3IFVpbnQ4QXJyYXkoMHg4MDAwKTtcblxuICAgIGlmIChiaXRzKDgqMykgIT0gNDM0ODUyMCkgbWVzc2FnZS5FcnJvcihcIk5vIG1hZ2ljIG51bWJlciBmb3VuZFwiKTtcblxuICAgIHZhciBpID0gYml0cyg4KSAtIDQ4O1xuICAgIGlmIChpIDwgMSB8fCBpID4gOSkgbWVzc2FnZS5FcnJvcihcIk5vdCBhIEJaSVAgYXJjaGl2ZVwiKTtcbiAgICByZXR1cm4gaTtcbn07XG5cblxuLy90YWtlcyBhIGZ1bmN0aW9uIGZvciByZWFkaW5nIHRoZSBibG9jayBkYXRhIChzdGFydGluZyB3aXRoIDB4MzE0MTU5MjY1MzU5KVxuLy9hIGJsb2NrIHNpemUgKDAtOSkgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byA5KVxuLy9hIGxlbmd0aCBhdCB3aGljaCB0byBzdG9wIGRlY29tcHJlc3NpbmcgYW5kIHJldHVybiB0aGUgb3V0cHV0XG5iemlwMi5kZWNvbXByZXNzID0gZnVuY3Rpb24oYml0cywgc3RyZWFtLCBidWYsIGJ1ZnNpemUsIHN0cmVhbUNSQykge1xuICAgIHZhciBNQVhfSFVGQ09ERV9CSVRTID0gMjA7XG4gICAgdmFyIE1BWF9TWU1CT0xTID0gMjU4O1xuICAgIHZhciBTWU1CT0xfUlVOQSA9IDA7XG4gICAgdmFyIFNZTUJPTF9SVU5CID0gMTtcbiAgICB2YXIgR1JPVVBfU0laRSA9IDUwO1xuICAgIHZhciBjcmMgPSAwIF4gKC0xKTtcbiAgICBcbiAgICBmb3IodmFyIGggPSAnJywgaSA9IDA7IGkgPCA2OyBpKyspIGggKz0gYml0cyg4KS50b1N0cmluZygxNik7XG4gICAgaWYgKGggPT0gXCIxNzcyNDUzODUwOTBcIikge1xuICAgICAgdmFyIGZpbmFsQ1JDID0gYml0cygzMil8MDtcbiAgICAgIGlmIChmaW5hbENSQyAhPT0gc3RyZWFtQ1JDKSBtZXNzYWdlLkVycm9yKFwiRXJyb3IgaW4gYnppcDI6IGNyYzMyIGRvIG5vdCBtYXRjaFwiKTtcbiAgICAgIC8vIGFsaWduIHN0cmVhbSB0byBieXRlXG4gICAgICBiaXRzKG51bGwpO1xuICAgICAgcmV0dXJuIG51bGw7IC8vIHJlc2V0IHN0cmVhbUNSQyBmb3IgbmV4dCBjYWxsXG4gICAgfVxuICAgIGlmIChoICE9IFwiMzE0MTU5MjY1MzU5XCIpIG1lc3NhZ2UuRXJyb3IoXCJlZWsgbm90IHZhbGlkIGJ6aXAgZGF0YVwiKTtcbiAgICB2YXIgY3JjYmxvY2sgPSBiaXRzKDMyKXwwOyAvLyBDUkMgY29kZVxuICAgIGlmIChiaXRzKDEpKSBtZXNzYWdlLkVycm9yKFwidW5zdXBwb3J0ZWQgb2Jzb2xldGUgdmVyc2lvblwiKTtcbiAgICB2YXIgb3JpZ1B0ciA9IGJpdHMoMjQpO1xuICAgIGlmIChvcmlnUHRyID4gYnVmc2l6ZSkgbWVzc2FnZS5FcnJvcihcIkluaXRpYWwgcG9zaXRpb24gbGFyZ2VyIHRoYW4gYnVmZmVyIHNpemVcIik7XG4gICAgdmFyIHQgPSBiaXRzKDE2KTtcbiAgICB2YXIgc3ltVG90YWwgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgIGlmICh0ICYgKDEgPDwgKDE1IC0gaSkpKSB7XG4gICAgICAgICAgICB2YXIgayA9IGJpdHMoMTYpO1xuICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgMTY7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChrICYgKDEgPDwgKDE1IC0gaikpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ltVG9CeXRlW3N5bVRvdGFsKytdID0gKDE2ICogaSkgKyBqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBncm91cENvdW50ID0gYml0cygzKTtcbiAgICBpZiAoZ3JvdXBDb3VudCA8IDIgfHwgZ3JvdXBDb3VudCA+IDYpIG1lc3NhZ2UuRXJyb3IoXCJhbm90aGVyIGVycm9yXCIpO1xuICAgIHZhciBuU2VsZWN0b3JzID0gYml0cygxNSk7XG4gICAgaWYgKG5TZWxlY3RvcnMgPT0gMCkgbWVzc2FnZS5FcnJvcihcIm1laFwiKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgZ3JvdXBDb3VudDsgaSsrKSB0aGlzLm10ZlN5bWJvbFtpXSA9IGk7XG5cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgblNlbGVjdG9yczsgaSsrKSB7XG4gICAgICAgIGZvcih2YXIgaiA9IDA7IGJpdHMoMSk7IGorKykgaWYgKGogPj0gZ3JvdXBDb3VudCkgbWVzc2FnZS5FcnJvcihcIndob29wcyBhbm90aGVyIGVycm9yXCIpO1xuICAgICAgICB2YXIgdWMgPSB0aGlzLm10ZlN5bWJvbFtqXTtcbiAgICAgICAgZm9yKHZhciBrID0gai0xOyBrPj0wOyBrLS0pIHtcbiAgICAgICAgICAgIHRoaXMubXRmU3ltYm9sW2srMV0gPSB0aGlzLm10ZlN5bWJvbFtrXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm10ZlN5bWJvbFswXSA9IHVjO1xuICAgICAgICB0aGlzLnNlbGVjdG9yc1tpXSA9IHVjO1xuICAgIH1cblxuICAgIHZhciBzeW1Db3VudCA9IHN5bVRvdGFsICsgMjtcbiAgICB2YXIgZ3JvdXBzID0gW107XG4gICAgdmFyIGxlbmd0aCA9IG5ldyBVaW50OEFycmF5KE1BWF9TWU1CT0xTKSxcbiAgICB0ZW1wID0gbmV3IFVpbnQxNkFycmF5KE1BWF9IVUZDT0RFX0JJVFMrMSk7XG5cbiAgICB2YXIgaHVmR3JvdXA7XG5cbiAgICBmb3IodmFyIGogPSAwOyBqIDwgZ3JvdXBDb3VudDsgaisrKSB7XG4gICAgICAgIHQgPSBiaXRzKDUpOyAvL2xlbmd0aHNcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHN5bUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHdoaWxlKHRydWUpe1xuICAgICAgICAgICAgICAgIGlmICh0IDwgMSB8fCB0ID4gTUFYX0hVRkNPREVfQklUUykgbWVzc2FnZS5FcnJvcihcIkkgZ2F2ZSB1cCBhIHdoaWxlIGFnbyBvbiB3cml0aW5nIGVycm9yIG1lc3NhZ2VzXCIpO1xuICAgICAgICAgICAgICAgIGlmICghYml0cygxKSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKCFiaXRzKDEpKSB0Kys7XG4gICAgICAgICAgICAgICAgZWxzZSB0LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZW5ndGhbaV0gPSB0O1xuICAgICAgICB9XG4gICAgICAgIHZhciAgbWluTGVuLCAgbWF4TGVuO1xuICAgICAgICBtaW5MZW4gPSBtYXhMZW4gPSBsZW5ndGhbMF07XG4gICAgICAgIGZvcih2YXIgaSA9IDE7IGkgPCBzeW1Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobGVuZ3RoW2ldID4gbWF4TGVuKSBtYXhMZW4gPSBsZW5ndGhbaV07XG4gICAgICAgICAgICBlbHNlIGlmIChsZW5ndGhbaV0gPCBtaW5MZW4pIG1pbkxlbiA9IGxlbmd0aFtpXTtcbiAgICAgICAgfVxuICAgICAgICBodWZHcm91cCA9IGdyb3Vwc1tqXSA9IHt9O1xuICAgICAgICBodWZHcm91cC5wZXJtdXRlID0gbmV3IEludDMyQXJyYXkoTUFYX1NZTUJPTFMpO1xuICAgICAgICBodWZHcm91cC5saW1pdCA9IG5ldyBJbnQzMkFycmF5KE1BWF9IVUZDT0RFX0JJVFMgKyAxKTtcbiAgICAgICAgaHVmR3JvdXAuYmFzZSA9IG5ldyBJbnQzMkFycmF5KE1BWF9IVUZDT0RFX0JJVFMgKyAxKTtcblxuICAgICAgICBodWZHcm91cC5taW5MZW4gPSBtaW5MZW47XG4gICAgICAgIGh1Zkdyb3VwLm1heExlbiA9IG1heExlbjtcbiAgICAgICAgdmFyIGJhc2UgPSBodWZHcm91cC5iYXNlO1xuICAgICAgICB2YXIgbGltaXQgPSBodWZHcm91cC5saW1pdDtcbiAgICAgICAgdmFyIHBwID0gMDtcbiAgICAgICAgZm9yKHZhciBpID0gbWluTGVuOyBpIDw9IG1heExlbjsgaSsrKVxuICAgICAgICBmb3IodmFyIHQgPSAwOyB0IDwgc3ltQ291bnQ7IHQrKylcbiAgICAgICAgaWYgKGxlbmd0aFt0XSA9PSBpKSBodWZHcm91cC5wZXJtdXRlW3BwKytdID0gdDtcbiAgICAgICAgZm9yKGkgPSBtaW5MZW47IGkgPD0gbWF4TGVuOyBpKyspIHRlbXBbaV0gPSBsaW1pdFtpXSA9IDA7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IHN5bUNvdW50OyBpKyspIHRlbXBbbGVuZ3RoW2ldXSsrO1xuICAgICAgICBwcCA9IHQgPSAwO1xuICAgICAgICBmb3IoaSA9IG1pbkxlbjsgaSA8IG1heExlbjsgaSsrKSB7XG4gICAgICAgICAgICBwcCArPSB0ZW1wW2ldO1xuICAgICAgICAgICAgbGltaXRbaV0gPSBwcCAtIDE7XG4gICAgICAgICAgICBwcCA8PD0gMTtcbiAgICAgICAgICAgIGJhc2VbaSsxXSA9IHBwIC0gKHQgKz0gdGVtcFtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbGltaXRbbWF4TGVuXSA9IHBwICsgdGVtcFttYXhMZW5dIC0gMTtcbiAgICAgICAgYmFzZVttaW5MZW5dID0gMDtcbiAgICB9XG5cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHsgXG4gICAgICAgIHRoaXMubXRmU3ltYm9sW2ldID0gaTtcbiAgICAgICAgdGhpcy5ieXRlQ291bnRbaV0gPSAwO1xuICAgIH1cbiAgICB2YXIgcnVuUG9zLCBjb3VudCwgc3ltQ291bnQsIHNlbGVjdG9yO1xuICAgIHJ1blBvcyA9IGNvdW50ID0gc3ltQ291bnQgPSBzZWxlY3RvciA9IDA7ICAgIFxuICAgIHdoaWxlKHRydWUpIHtcbiAgICAgICAgaWYgKCEoc3ltQ291bnQtLSkpIHtcbiAgICAgICAgICAgIHN5bUNvdW50ID0gR1JPVVBfU0laRSAtIDE7XG4gICAgICAgICAgICBpZiAoc2VsZWN0b3IgPj0gblNlbGVjdG9ycykgbWVzc2FnZS5FcnJvcihcIm1lb3cgaSdtIGEga2l0dHksIHRoYXQncyBhbiBlcnJvclwiKTtcbiAgICAgICAgICAgIGh1Zkdyb3VwID0gZ3JvdXBzW3RoaXMuc2VsZWN0b3JzW3NlbGVjdG9yKytdXTtcbiAgICAgICAgICAgIGJhc2UgPSBodWZHcm91cC5iYXNlO1xuICAgICAgICAgICAgbGltaXQgPSBodWZHcm91cC5saW1pdDtcbiAgICAgICAgfVxuICAgICAgICBpID0gaHVmR3JvdXAubWluTGVuO1xuICAgICAgICBqID0gYml0cyhpKTtcbiAgICAgICAgd2hpbGUodHJ1ZSkge1xuICAgICAgICAgICAgaWYgKGkgPiBodWZHcm91cC5tYXhMZW4pIG1lc3NhZ2UuRXJyb3IoXCJyYXdyIGknbSBhIGRpbm9zYXVyXCIpO1xuICAgICAgICAgICAgaWYgKGogPD0gbGltaXRbaV0pIGJyZWFrO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgaiA9IChqIDw8IDEpIHwgYml0cygxKTtcbiAgICAgICAgfVxuICAgICAgICBqIC09IGJhc2VbaV07XG4gICAgICAgIGlmIChqIDwgMCB8fCBqID49IE1BWF9TWU1CT0xTKSBtZXNzYWdlLkVycm9yKFwibW9vIGknbSBhIGNvd1wiKTtcbiAgICAgICAgdmFyIG5leHRTeW0gPSBodWZHcm91cC5wZXJtdXRlW2pdO1xuICAgICAgICBpZiAobmV4dFN5bSA9PSBTWU1CT0xfUlVOQSB8fCBuZXh0U3ltID09IFNZTUJPTF9SVU5CKSB7XG4gICAgICAgICAgICBpZiAoIXJ1blBvcyl7XG4gICAgICAgICAgICAgICAgcnVuUG9zID0gMTtcbiAgICAgICAgICAgICAgICB0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0U3ltID09IFNZTUJPTF9SVU5BKSB0ICs9IHJ1blBvcztcbiAgICAgICAgICAgIGVsc2UgdCArPSAyICogcnVuUG9zO1xuICAgICAgICAgICAgcnVuUG9zIDw8PSAxO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1blBvcykge1xuICAgICAgICAgICAgcnVuUG9zID0gMDtcbiAgICAgICAgICAgIGlmIChjb3VudCArIHQgPiBidWZzaXplKSBtZXNzYWdlLkVycm9yKFwiQm9vbS5cIik7XG4gICAgICAgICAgICB1YyA9IHRoaXMuc3ltVG9CeXRlW3RoaXMubXRmU3ltYm9sWzBdXTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZUNvdW50W3VjXSArPSB0O1xuICAgICAgICAgICAgd2hpbGUodC0tKSBidWZbY291bnQrK10gPSB1YztcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dFN5bSA+IHN5bVRvdGFsKSBicmVhaztcbiAgICAgICAgaWYgKGNvdW50ID49IGJ1ZnNpemUpIG1lc3NhZ2UuRXJyb3IoXCJJIGNhbid0IHRoaW5rIG9mIGFueXRoaW5nLiBFcnJvclwiKTtcbiAgICAgICAgaSA9IG5leHRTeW0gLSAxO1xuICAgICAgICB1YyA9IHRoaXMubXRmU3ltYm9sW2ldO1xuICAgICAgICBmb3IodmFyIGsgPSBpLTE7IGs+PTA7IGstLSkge1xuICAgICAgICAgICAgdGhpcy5tdGZTeW1ib2xbaysxXSA9IHRoaXMubXRmU3ltYm9sW2tdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubXRmU3ltYm9sWzBdID0gdWNcbiAgICAgICAgdWMgPSB0aGlzLnN5bVRvQnl0ZVt1Y107XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50W3VjXSsrO1xuICAgICAgICBidWZbY291bnQrK10gPSB1YztcbiAgICB9XG4gICAgaWYgKG9yaWdQdHIgPCAwIHx8IG9yaWdQdHIgPj0gY291bnQpIG1lc3NhZ2UuRXJyb3IoXCJJJ20gYSBtb25rZXkgYW5kIEknbSB0aHJvd2luZyBzb21ldGhpbmcgYXQgc29tZW9uZSwgbmFtZWx5IHlvdVwiKTtcbiAgICB2YXIgaiA9IDA7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICAgIGsgPSBqICsgdGhpcy5ieXRlQ291bnRbaV07XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50W2ldID0gajtcbiAgICAgICAgaiA9IGs7XG4gICAgfVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIHVjID0gYnVmW2ldICYgMHhmZjtcbiAgICAgICAgYnVmW3RoaXMuYnl0ZUNvdW50W3VjXV0gfD0gKGkgPDwgOCk7XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50W3VjXSsrO1xuICAgIH1cbiAgICB2YXIgcG9zID0gMCwgY3VycmVudCA9IDAsIHJ1biA9IDA7XG4gICAgaWYgKGNvdW50KSB7XG4gICAgICAgIHBvcyA9IGJ1ZltvcmlnUHRyXTtcbiAgICAgICAgY3VycmVudCA9IChwb3MgJiAweGZmKTtcbiAgICAgICAgcG9zID4+PSA4O1xuICAgICAgICBydW4gPSAtMTtcbiAgICB9XG4gICAgY291bnQgPSBjb3VudDtcbiAgICB2YXIgY29waWVzLCBwcmV2aW91cywgb3V0Ynl0ZTtcbiAgICB3aGlsZShjb3VudCkge1xuICAgICAgICBjb3VudC0tO1xuICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7XG4gICAgICAgIHBvcyA9IGJ1Zltwb3NdO1xuICAgICAgICBjdXJyZW50ID0gcG9zICYgMHhmZjtcbiAgICAgICAgcG9zID4+PSA4O1xuICAgICAgICBpZiAocnVuKysgPT0gMykge1xuICAgICAgICAgICAgY29waWVzID0gY3VycmVudDtcbiAgICAgICAgICAgIG91dGJ5dGUgPSBwcmV2aW91cztcbiAgICAgICAgICAgIGN1cnJlbnQgPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvcGllcyA9IDE7XG4gICAgICAgICAgICBvdXRieXRlID0gY3VycmVudDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZShjb3BpZXMtLSkge1xuICAgICAgICAgICAgY3JjID0gKChjcmMgPDwgOCkgXiB0aGlzLmNyY1RhYmxlWygoY3JjPj4yNCkgXiBvdXRieXRlKSAmIDB4RkZdKSYweEZGRkZGRkZGOyAvLyBjcmMzMlxuICAgICAgICAgICAgc3RyZWFtKG91dGJ5dGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50ICE9IHByZXZpb3VzKSBydW4gPSAwO1xuICAgIH1cblxuICAgIGNyYyA9IChjcmMgXiAoLTEpKSA+Pj4gMDtcbiAgICBpZiAoKGNyY3wwKSAhPSAoY3JjYmxvY2t8MCkpIG1lc3NhZ2UuRXJyb3IoXCJFcnJvciBpbiBiemlwMjogY3JjMzIgZG8gbm90IG1hdGNoXCIpO1xuICAgIHN0cmVhbUNSQyA9IChjcmMgXiAoKHN0cmVhbUNSQyA8PCAxKSB8IChzdHJlYW1DUkMgPj4+IDMxKSkpICYgMHhGRkZGRkZGRjtcbiAgICByZXR1cm4gc3RyZWFtQ1JDO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ6aXAyO1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuZnJvbUNhbGxiYWNrID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykgZm4uYXBwbHkodGhpcywgYXJncylcbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGFyZ3MucHVzaCgoZXJyLCByZXMpID0+IChlcnIgIT0gbnVsbCkgPyByZWplY3QoZXJyKSA6IHJlc29sdmUocmVzKSlcbiAgICAgICAgZm4uYXBwbHkodGhpcywgYXJncylcbiAgICAgIH0pXG4gICAgfVxuICB9LCAnbmFtZScsIHsgdmFsdWU6IGZuLm5hbWUgfSlcbn1cblxuZXhwb3J0cy5mcm9tUHJvbWlzZSA9IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgY29uc3QgY2IgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV1cbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncylcbiAgICBlbHNlIHtcbiAgICAgIGFyZ3MucG9wKClcbiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3MpLnRoZW4ociA9PiBjYihudWxsLCByKSwgY2IpXG4gICAgfVxuICB9LCAnbmFtZScsIHsgdmFsdWU6IGZuLm5hbWUgfSlcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBidWZmZXIgY29udGFpbnMgb25seSBjb3JyZWN0IFVURi04LlxuICogUG9ydGVkIGZyb20gaHR0cHM6Ly93d3cuY2wuY2FtLmFjLnVrLyU3RW1nazI1L3Vjcy91dGY4X2NoZWNrLmMgYnlcbiAqIE1hcmt1cyBLdWhuLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWYgVGhlIGJ1ZmZlciB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGBidWZgIGNvbnRhaW5zIG9ubHkgY29ycmVjdCBVVEYtOCwgZWxzZSBgZmFsc2VgXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRVVEY4KGJ1Zikge1xuICBjb25zdCBsZW4gPSBidWYubGVuZ3RoO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBpZiAoKGJ1ZltpXSAmIDB4ODApID09PSAweDAwKSB7ICAvLyAweHh4eHh4eFxuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZTApID09PSAweGMwKSB7ICAvLyAxMTB4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMSA9PT0gbGVuIHx8XG4gICAgICAgIChidWZbaSArIDFdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSAmIDB4ZmUpID09PSAweGMwICAvLyBvdmVybG9uZ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSArPSAyO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZjApID09PSAweGUwKSB7ICAvLyAxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMiA+PSBsZW4gfHxcbiAgICAgICAgKGJ1ZltpICsgMV0gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICAoYnVmW2kgKyAyXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIGJ1ZltpXSA9PT0gMHhlMCAmJiAoYnVmW2kgKyAxXSAmIDB4ZTApID09PSAweDgwIHx8ICAvLyBvdmVybG9uZ1xuICAgICAgICBidWZbaV0gPT09IDB4ZWQgJiYgKGJ1ZltpICsgMV0gJiAweGUwKSA9PT0gMHhhMCAgLy8gc3Vycm9nYXRlIChVK0Q4MDAgLSBVK0RGRkYpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpICs9IDM7XG4gICAgfSBlbHNlIGlmICgoYnVmW2ldICYgMHhmOCkgPT09IDB4ZjApIHsgIC8vIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4XG4gICAgICBpZiAoXG4gICAgICAgIGkgKyAzID49IGxlbiB8fFxuICAgICAgICAoYnVmW2kgKyAxXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaSArIDJdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpICsgM10gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICBidWZbaV0gPT09IDB4ZjAgJiYgKGJ1ZltpICsgMV0gJiAweGYwKSA9PT0gMHg4MCB8fCAgLy8gb3ZlcmxvbmdcbiAgICAgICAgYnVmW2ldID09PSAweGY0ICYmIGJ1ZltpICsgMV0gPiAweDhmIHx8IGJ1ZltpXSA+IDB4ZjQgIC8vID4gVSsxMEZGRkZcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGkgKz0gNDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVmFsaWRVVEY4O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG50cnkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ25vZGUtZ3lwLWJ1aWxkJykoX19kaXJuYW1lKTtcbn0gY2F0Y2ggKGUpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhbGxiYWNrJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBzdHJpbmdXaWR0aCA9IHJlcXVpcmUoJ3N0cmluZy13aWR0aCcpO1xuY29uc3Qgc3RyaXBBbnNpID0gcmVxdWlyZSgnc3RyaXAtYW5zaScpO1xuY29uc3QgYW5zaVN0eWxlcyA9IHJlcXVpcmUoJ2Fuc2ktc3R5bGVzJyk7XG5cbmNvbnN0IEVTQ0FQRVMgPSBuZXcgU2V0KFtcblx0J1xcdTAwMUInLFxuXHQnXFx1MDA5Qidcbl0pO1xuXG5jb25zdCBFTkRfQ09ERSA9IDM5O1xuXG5jb25zdCBBTlNJX0VTQ0FQRV9CRUxMID0gJ1xcdTAwMDcnO1xuY29uc3QgQU5TSV9DU0kgPSAnWyc7XG5jb25zdCBBTlNJX09TQyA9ICddJztcbmNvbnN0IEFOU0lfU0dSX1RFUk1JTkFUT1IgPSAnbSc7XG5jb25zdCBBTlNJX0VTQ0FQRV9MSU5LID0gYCR7QU5TSV9PU0N9ODs7YDtcblxuY29uc3Qgd3JhcEFuc2kgPSBjb2RlID0+IGAke0VTQ0FQRVMudmFsdWVzKCkubmV4dCgpLnZhbHVlfSR7QU5TSV9DU0l9JHtjb2RlfSR7QU5TSV9TR1JfVEVSTUlOQVRPUn1gO1xuY29uc3Qgd3JhcEFuc2lIeXBlcmxpbmsgPSB1cmkgPT4gYCR7RVNDQVBFUy52YWx1ZXMoKS5uZXh0KCkudmFsdWV9JHtBTlNJX0VTQ0FQRV9MSU5LfSR7dXJpfSR7QU5TSV9FU0NBUEVfQkVMTH1gO1xuXG4vLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB3b3JkcyBzcGxpdCBvbiAnICcsIGlnbm9yaW5nXG4vLyB0aGUgZXh0cmEgY2hhcmFjdGVycyBhZGRlZCBieSBhbnNpIGVzY2FwZSBjb2Rlc1xuY29uc3Qgd29yZExlbmd0aHMgPSBzdHJpbmcgPT4gc3RyaW5nLnNwbGl0KCcgJykubWFwKGNoYXJhY3RlciA9PiBzdHJpbmdXaWR0aChjaGFyYWN0ZXIpKTtcblxuLy8gV3JhcCBhIGxvbmcgd29yZCBhY3Jvc3MgbXVsdGlwbGUgcm93c1xuLy8gQW5zaSBlc2NhcGUgY29kZXMgZG8gbm90IGNvdW50IHRvd2FyZHMgbGVuZ3RoXG5jb25zdCB3cmFwV29yZCA9IChyb3dzLCB3b3JkLCBjb2x1bW5zKSA9PiB7XG5cdGNvbnN0IGNoYXJhY3RlcnMgPSBbLi4ud29yZF07XG5cblx0bGV0IGlzSW5zaWRlRXNjYXBlID0gZmFsc2U7XG5cdGxldCBpc0luc2lkZUxpbmtFc2NhcGUgPSBmYWxzZTtcblx0bGV0IHZpc2libGUgPSBzdHJpbmdXaWR0aChzdHJpcEFuc2kocm93c1tyb3dzLmxlbmd0aCAtIDFdKSk7XG5cblx0Zm9yIChjb25zdCBbaW5kZXgsIGNoYXJhY3Rlcl0gb2YgY2hhcmFjdGVycy5lbnRyaWVzKCkpIHtcblx0XHRjb25zdCBjaGFyYWN0ZXJMZW5ndGggPSBzdHJpbmdXaWR0aChjaGFyYWN0ZXIpO1xuXG5cdFx0aWYgKHZpc2libGUgKyBjaGFyYWN0ZXJMZW5ndGggPD0gY29sdW1ucykge1xuXHRcdFx0cm93c1tyb3dzLmxlbmd0aCAtIDFdICs9IGNoYXJhY3Rlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cm93cy5wdXNoKGNoYXJhY3Rlcik7XG5cdFx0XHR2aXNpYmxlID0gMDtcblx0XHR9XG5cblx0XHRpZiAoRVNDQVBFUy5oYXMoY2hhcmFjdGVyKSkge1xuXHRcdFx0aXNJbnNpZGVFc2NhcGUgPSB0cnVlO1xuXHRcdFx0aXNJbnNpZGVMaW5rRXNjYXBlID0gY2hhcmFjdGVycy5zbGljZShpbmRleCArIDEpLmpvaW4oJycpLnN0YXJ0c1dpdGgoQU5TSV9FU0NBUEVfTElOSyk7XG5cdFx0fVxuXG5cdFx0aWYgKGlzSW5zaWRlRXNjYXBlKSB7XG5cdFx0XHRpZiAoaXNJbnNpZGVMaW5rRXNjYXBlKSB7XG5cdFx0XHRcdGlmIChjaGFyYWN0ZXIgPT09IEFOU0lfRVNDQVBFX0JFTEwpIHtcblx0XHRcdFx0XHRpc0luc2lkZUVzY2FwZSA9IGZhbHNlO1xuXHRcdFx0XHRcdGlzSW5zaWRlTGlua0VzY2FwZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQU5TSV9TR1JfVEVSTUlOQVRPUikge1xuXHRcdFx0XHRpc0luc2lkZUVzY2FwZSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHR2aXNpYmxlICs9IGNoYXJhY3Rlckxlbmd0aDtcblxuXHRcdGlmICh2aXNpYmxlID09PSBjb2x1bW5zICYmIGluZGV4IDwgY2hhcmFjdGVycy5sZW5ndGggLSAxKSB7XG5cdFx0XHRyb3dzLnB1c2goJycpO1xuXHRcdFx0dmlzaWJsZSA9IDA7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBsYXN0IHJvdyB3ZSBjb3B5IG92ZXIgaXMgb25seVxuXHQvLyBhbnNpIGVzY2FwZSBjaGFyYWN0ZXJzLCBoYW5kbGUgdGhpcyBlZGdlLWNhc2Vcblx0aWYgKCF2aXNpYmxlICYmIHJvd3Nbcm93cy5sZW5ndGggLSAxXS5sZW5ndGggPiAwICYmIHJvd3MubGVuZ3RoID4gMSkge1xuXHRcdHJvd3Nbcm93cy5sZW5ndGggLSAyXSArPSByb3dzLnBvcCgpO1xuXHR9XG59O1xuXG4vLyBUcmltcyBzcGFjZXMgZnJvbSBhIHN0cmluZyBpZ25vcmluZyBpbnZpc2libGUgc2VxdWVuY2VzXG5jb25zdCBzdHJpbmdWaXNpYmxlVHJpbVNwYWNlc1JpZ2h0ID0gc3RyaW5nID0+IHtcblx0Y29uc3Qgd29yZHMgPSBzdHJpbmcuc3BsaXQoJyAnKTtcblx0bGV0IGxhc3QgPSB3b3Jkcy5sZW5ndGg7XG5cblx0d2hpbGUgKGxhc3QgPiAwKSB7XG5cdFx0aWYgKHN0cmluZ1dpZHRoKHdvcmRzW2xhc3QgLSAxXSkgPiAwKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRsYXN0LS07XG5cdH1cblxuXHRpZiAobGFzdCA9PT0gd29yZHMubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdHJldHVybiB3b3Jkcy5zbGljZSgwLCBsYXN0KS5qb2luKCcgJykgKyB3b3Jkcy5zbGljZShsYXN0KS5qb2luKCcnKTtcbn07XG5cbi8vIFRoZSB3cmFwLWFuc2kgbW9kdWxlIGNhbiBiZSBpbnZva2VkIGluIGVpdGhlciAnaGFyZCcgb3IgJ3NvZnQnIHdyYXAgbW9kZVxuLy9cbi8vICdoYXJkJyB3aWxsIG5ldmVyIGFsbG93IGEgc3RyaW5nIHRvIHRha2UgdXAgbW9yZSB0aGFuIGNvbHVtbnMgY2hhcmFjdGVyc1xuLy9cbi8vICdzb2Z0JyBhbGxvd3MgbG9uZyB3b3JkcyB0byBleHBhbmQgcGFzdCB0aGUgY29sdW1uIGxlbmd0aFxuY29uc3QgZXhlYyA9IChzdHJpbmcsIGNvbHVtbnMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuXHRpZiAob3B0aW9ucy50cmltICE9PSBmYWxzZSAmJiBzdHJpbmcudHJpbSgpID09PSAnJykge1xuXHRcdHJldHVybiAnJztcblx0fVxuXG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRsZXQgZXNjYXBlQ29kZTtcblx0bGV0IGVzY2FwZVVybDtcblxuXHRjb25zdCBsZW5ndGhzID0gd29yZExlbmd0aHMoc3RyaW5nKTtcblx0bGV0IHJvd3MgPSBbJyddO1xuXG5cdGZvciAoY29uc3QgW2luZGV4LCB3b3JkXSBvZiBzdHJpbmcuc3BsaXQoJyAnKS5lbnRyaWVzKCkpIHtcblx0XHRpZiAob3B0aW9ucy50cmltICE9PSBmYWxzZSkge1xuXHRcdFx0cm93c1tyb3dzLmxlbmd0aCAtIDFdID0gcm93c1tyb3dzLmxlbmd0aCAtIDFdLnRyaW1TdGFydCgpO1xuXHRcdH1cblxuXHRcdGxldCByb3dMZW5ndGggPSBzdHJpbmdXaWR0aChyb3dzW3Jvd3MubGVuZ3RoIC0gMV0pO1xuXG5cdFx0aWYgKGluZGV4ICE9PSAwKSB7XG5cdFx0XHRpZiAocm93TGVuZ3RoID49IGNvbHVtbnMgJiYgKG9wdGlvbnMud29yZFdyYXAgPT09IGZhbHNlIHx8IG9wdGlvbnMudHJpbSA9PT0gZmFsc2UpKSB7XG5cdFx0XHRcdC8vIElmIHdlIHN0YXJ0IHdpdGggYSBuZXcgd29yZCBidXQgdGhlIGN1cnJlbnQgcm93IGxlbmd0aCBlcXVhbHMgdGhlIGxlbmd0aCBvZiB0aGUgY29sdW1ucywgYWRkIGEgbmV3IHJvd1xuXHRcdFx0XHRyb3dzLnB1c2goJycpO1xuXHRcdFx0XHRyb3dMZW5ndGggPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm93TGVuZ3RoID4gMCB8fCBvcHRpb25zLnRyaW0gPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJvd3Nbcm93cy5sZW5ndGggLSAxXSArPSAnICc7XG5cdFx0XHRcdHJvd0xlbmd0aCsrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEluICdoYXJkJyB3cmFwIG1vZGUsIHRoZSBsZW5ndGggb2YgYSBsaW5lIGlzIG5ldmVyIGFsbG93ZWQgdG8gZXh0ZW5kIHBhc3QgJ2NvbHVtbnMnXG5cdFx0aWYgKG9wdGlvbnMuaGFyZCAmJiBsZW5ndGhzW2luZGV4XSA+IGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IHJlbWFpbmluZ0NvbHVtbnMgPSAoY29sdW1ucyAtIHJvd0xlbmd0aCk7XG5cdFx0XHRjb25zdCBicmVha3NTdGFydGluZ1RoaXNMaW5lID0gMSArIE1hdGguZmxvb3IoKGxlbmd0aHNbaW5kZXhdIC0gcmVtYWluaW5nQ29sdW1ucyAtIDEpIC8gY29sdW1ucyk7XG5cdFx0XHRjb25zdCBicmVha3NTdGFydGluZ05leHRMaW5lID0gTWF0aC5mbG9vcigobGVuZ3Roc1tpbmRleF0gLSAxKSAvIGNvbHVtbnMpO1xuXHRcdFx0aWYgKGJyZWFrc1N0YXJ0aW5nTmV4dExpbmUgPCBicmVha3NTdGFydGluZ1RoaXNMaW5lKSB7XG5cdFx0XHRcdHJvd3MucHVzaCgnJyk7XG5cdFx0XHR9XG5cblx0XHRcdHdyYXBXb3JkKHJvd3MsIHdvcmQsIGNvbHVtbnMpO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0aWYgKHJvd0xlbmd0aCArIGxlbmd0aHNbaW5kZXhdID4gY29sdW1ucyAmJiByb3dMZW5ndGggPiAwICYmIGxlbmd0aHNbaW5kZXhdID4gMCkge1xuXHRcdFx0aWYgKG9wdGlvbnMud29yZFdyYXAgPT09IGZhbHNlICYmIHJvd0xlbmd0aCA8IGNvbHVtbnMpIHtcblx0XHRcdFx0d3JhcFdvcmQocm93cywgd29yZCwgY29sdW1ucyk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyb3dzLnB1c2goJycpO1xuXHRcdH1cblxuXHRcdGlmIChyb3dMZW5ndGggKyBsZW5ndGhzW2luZGV4XSA+IGNvbHVtbnMgJiYgb3B0aW9ucy53b3JkV3JhcCA9PT0gZmFsc2UpIHtcblx0XHRcdHdyYXBXb3JkKHJvd3MsIHdvcmQsIGNvbHVtbnMpO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0cm93c1tyb3dzLmxlbmd0aCAtIDFdICs9IHdvcmQ7XG5cdH1cblxuXHRpZiAob3B0aW9ucy50cmltICE9PSBmYWxzZSkge1xuXHRcdHJvd3MgPSByb3dzLm1hcChzdHJpbmdWaXNpYmxlVHJpbVNwYWNlc1JpZ2h0KTtcblx0fVxuXG5cdGNvbnN0IHByZSA9IFsuLi5yb3dzLmpvaW4oJ1xcbicpXTtcblxuXHRmb3IgKGNvbnN0IFtpbmRleCwgY2hhcmFjdGVyXSBvZiBwcmUuZW50cmllcygpKSB7XG5cdFx0cmV0dXJuVmFsdWUgKz0gY2hhcmFjdGVyO1xuXG5cdFx0aWYgKEVTQ0FQRVMuaGFzKGNoYXJhY3RlcikpIHtcblx0XHRcdGNvbnN0IHtncm91cHN9ID0gbmV3IFJlZ0V4cChgKD86XFxcXCR7QU5TSV9DU0l9KD88Y29kZT5cXFxcZCspbXxcXFxcJHtBTlNJX0VTQ0FQRV9MSU5LfSg/PHVyaT4uKikke0FOU0lfRVNDQVBFX0JFTEx9KWApLmV4ZWMocHJlLnNsaWNlKGluZGV4KS5qb2luKCcnKSkgfHwge2dyb3Vwczoge319O1xuXHRcdFx0aWYgKGdyb3Vwcy5jb2RlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc3QgY29kZSA9IE51bWJlci5wYXJzZUZsb2F0KGdyb3Vwcy5jb2RlKTtcblx0XHRcdFx0ZXNjYXBlQ29kZSA9IGNvZGUgPT09IEVORF9DT0RFID8gdW5kZWZpbmVkIDogY29kZTtcblx0XHRcdH0gZWxzZSBpZiAoZ3JvdXBzLnVyaSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGVzY2FwZVVybCA9IGdyb3Vwcy51cmkubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogZ3JvdXBzLnVyaTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjb2RlID0gYW5zaVN0eWxlcy5jb2Rlcy5nZXQoTnVtYmVyKGVzY2FwZUNvZGUpKTtcblxuXHRcdGlmIChwcmVbaW5kZXggKyAxXSA9PT0gJ1xcbicpIHtcblx0XHRcdGlmIChlc2NhcGVVcmwpIHtcblx0XHRcdFx0cmV0dXJuVmFsdWUgKz0gd3JhcEFuc2lIeXBlcmxpbmsoJycpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZXNjYXBlQ29kZSAmJiBjb2RlKSB7XG5cdFx0XHRcdHJldHVyblZhbHVlICs9IHdyYXBBbnNpKGNvZGUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnXFxuJykge1xuXHRcdFx0aWYgKGVzY2FwZUNvZGUgJiYgY29kZSkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSArPSB3cmFwQW5zaShlc2NhcGVDb2RlKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGVzY2FwZVVybCkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSArPSB3cmFwQW5zaUh5cGVybGluayhlc2NhcGVVcmwpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn07XG5cbi8vIEZvciBlYWNoIG5ld2xpbmUsIGludm9rZSB0aGUgbWV0aG9kIHNlcGFyYXRlbHlcbm1vZHVsZS5leHBvcnRzID0gKHN0cmluZywgY29sdW1ucywgb3B0aW9ucykgPT4ge1xuXHRyZXR1cm4gU3RyaW5nKHN0cmluZylcblx0XHQubm9ybWFsaXplKClcblx0XHQucmVwbGFjZSgvXFxyXFxuL2csICdcXG4nKVxuXHRcdC5zcGxpdCgnXFxuJylcblx0XHQubWFwKGxpbmUgPT4gZXhlYyhsaW5lLCBjb2x1bW5zLCBvcHRpb25zKSlcblx0XHQuam9pbignXFxuJyk7XG59O1xuIiwiLy8gUmV0dXJucyBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgd3JhcHBlZCBjYWxsYmFja1xuLy8gVGhlIHdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGRvIHNvbWUgc3R1ZmYsIGFuZCByZXR1cm4gYVxuLy8gcHJlc3VtYWJseSBkaWZmZXJlbnQgY2FsbGJhY2sgZnVuY3Rpb24uXG4vLyBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvd24gcHJvcGVydGllcyBhcmUgcmV0YWluZWQsIHNvIHRoYXRcbi8vIGRlY29yYXRpb25zIGFuZCBzdWNoIGFyZSBub3QgbG9zdCBhbG9uZyB0aGUgd2F5LlxubW9kdWxlLmV4cG9ydHMgPSB3cmFwcHlcbmZ1bmN0aW9uIHdyYXBweSAoZm4sIGNiKSB7XG4gIGlmIChmbiAmJiBjYikgcmV0dXJuIHdyYXBweShmbikoY2IpXG5cbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCduZWVkIHdyYXBwZXIgZnVuY3Rpb24nKVxuXG4gIE9iamVjdC5rZXlzKGZuKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgd3JhcHBlcltrXSA9IGZuW2tdXG4gIH0pXG5cbiAgcmV0dXJuIHdyYXBwZXJcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuICAgIHZhciByZXQgPSBmbi5hcHBseSh0aGlzLCBhcmdzKVxuICAgIHZhciBjYiA9IGFyZ3NbYXJncy5sZW5ndGgtMV1cbiAgICBpZiAodHlwZW9mIHJldCA9PT0gJ2Z1bmN0aW9uJyAmJiByZXQgIT09IGNiKSB7XG4gICAgICBPYmplY3Qua2V5cyhjYikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXRba10gPSBjYltrXVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgRU1QVFlfQlVGRkVSIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG5jb25zdCBGYXN0QnVmZmVyID0gQnVmZmVyW1N5bWJvbC5zcGVjaWVzXTtcblxuLyoqXG4gKiBNZXJnZXMgYW4gYXJyYXkgb2YgYnVmZmVycyBpbnRvIGEgbmV3IGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcltdfSBsaXN0IFRoZSBhcnJheSBvZiBidWZmZXJzIHRvIGNvbmNhdFxuICogQHBhcmFtIHtOdW1iZXJ9IHRvdGFsTGVuZ3RoIFRoZSB0b3RhbCBsZW5ndGggb2YgYnVmZmVycyBpbiB0aGUgbGlzdFxuICogQHJldHVybiB7QnVmZmVyfSBUaGUgcmVzdWx0aW5nIGJ1ZmZlclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBjb25jYXQobGlzdCwgdG90YWxMZW5ndGgpIHtcbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSByZXR1cm4gRU1QVFlfQlVGRkVSO1xuICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHJldHVybiBsaXN0WzBdO1xuXG4gIGNvbnN0IHRhcmdldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSh0b3RhbExlbmd0aCk7XG4gIGxldCBvZmZzZXQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGJ1ZiA9IGxpc3RbaV07XG4gICAgdGFyZ2V0LnNldChidWYsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGJ1Zi5sZW5ndGg7XG4gIH1cblxuICBpZiAob2Zmc2V0IDwgdG90YWxMZW5ndGgpIHtcbiAgICByZXR1cm4gbmV3IEZhc3RCdWZmZXIodGFyZ2V0LmJ1ZmZlciwgdGFyZ2V0LmJ5dGVPZmZzZXQsIG9mZnNldCk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIE1hc2tzIGEgYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBtYXNrLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBzb3VyY2UgVGhlIGJ1ZmZlciB0byBtYXNrXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayBUaGUgbWFzayB0byB1c2VcbiAqIEBwYXJhbSB7QnVmZmVyfSBvdXRwdXQgVGhlIGJ1ZmZlciB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdG8gc3RhcnQgd3JpdGluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIG1hc2suXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIF9tYXNrKHNvdXJjZSwgbWFzaywgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0W29mZnNldCArIGldID0gc291cmNlW2ldIF4gbWFza1tpICYgM107XG4gIH1cbn1cblxuLyoqXG4gKiBVbm1hc2tzIGEgYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBtYXNrLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byB1bm1hc2tcbiAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIFRoZSBtYXNrIHRvIHVzZVxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBfdW5tYXNrKGJ1ZmZlciwgbWFzaykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgIGJ1ZmZlcltpXSBePSBtYXNrW2kgJiAzXTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgYnVmZmVyIHRvIGFuIGBBcnJheUJ1ZmZlcmAuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZiBUaGUgYnVmZmVyIHRvIGNvbnZlcnRcbiAqIEByZXR1cm4ge0FycmF5QnVmZmVyfSBDb252ZXJ0ZWQgYnVmZmVyXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXlCdWZmZXIoYnVmKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBidWYuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICByZXR1cm4gYnVmLmJ1ZmZlcjtcbiAgfVxuXG4gIHJldHVybiBidWYuYnVmZmVyLnNsaWNlKGJ1Zi5ieXRlT2Zmc2V0LCBidWYuYnl0ZU9mZnNldCArIGJ1Zi5sZW5ndGgpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGBkYXRhYCB0byBhIGBCdWZmZXJgLlxuICpcbiAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgZGF0YSB0byBjb252ZXJ0XG4gKiBAcmV0dXJuIHtCdWZmZXJ9IFRoZSBidWZmZXJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn1cbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gdG9CdWZmZXIoZGF0YSkge1xuICB0b0J1ZmZlci5yZWFkT25seSA9IHRydWU7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkgcmV0dXJuIGRhdGE7XG5cbiAgbGV0IGJ1ZjtcblxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgYnVmID0gbmV3IEZhc3RCdWZmZXIoZGF0YSk7XG4gIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpKSB7XG4gICAgYnVmID0gbmV3IEZhc3RCdWZmZXIoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBCdWZmZXIuZnJvbShkYXRhKTtcbiAgICB0b0J1ZmZlci5yZWFkT25seSA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbmNhdCxcbiAgbWFzazogX21hc2ssXG4gIHRvQXJyYXlCdWZmZXIsXG4gIHRvQnVmZmVyLFxuICB1bm1hc2s6IF91bm1hc2tcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICAqL1xuaWYgKCFwcm9jZXNzLmVudi5XU19OT19CVUZGRVJfVVRJTCkge1xuICB0cnkge1xuICAgIGNvbnN0IGJ1ZmZlclV0aWwgPSByZXF1aXJlKCdidWZmZXJ1dGlsJyk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cy5tYXNrID0gZnVuY3Rpb24gKHNvdXJjZSwgbWFzaywgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCkge1xuICAgICAgaWYgKGxlbmd0aCA8IDQ4KSBfbWFzayhzb3VyY2UsIG1hc2ssIG91dHB1dCwgb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgZWxzZSBidWZmZXJVdGlsLm1hc2soc291cmNlLCBtYXNrLCBvdXRwdXQsIG9mZnNldCwgbGVuZ3RoKTtcbiAgICB9O1xuXG4gICAgbW9kdWxlLmV4cG9ydHMudW5tYXNrID0gZnVuY3Rpb24gKGJ1ZmZlciwgbWFzaykge1xuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCAzMikgX3VubWFzayhidWZmZXIsIG1hc2spO1xuICAgICAgZWxzZSBidWZmZXJVdGlsLnVubWFzayhidWZmZXIsIG1hc2spO1xuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBDb250aW51ZSByZWdhcmRsZXNzIG9mIHRoZSBlcnJvci5cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBCSU5BUllfVFlQRVMgPSBbJ25vZGVidWZmZXInLCAnYXJyYXlidWZmZXInLCAnZnJhZ21lbnRzJ107XG5jb25zdCBoYXNCbG9iID0gdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnO1xuXG5pZiAoaGFzQmxvYikgQklOQVJZX1RZUEVTLnB1c2goJ2Jsb2InKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEJJTkFSWV9UWVBFUyxcbiAgRU1QVFlfQlVGRkVSOiBCdWZmZXIuYWxsb2MoMCksXG4gIEdVSUQ6ICcyNThFQUZBNS1FOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTEnLFxuICBoYXNCbG9iLFxuICBrRm9yT25FdmVudEF0dHJpYnV0ZTogU3ltYm9sKCdrSXNGb3JPbkV2ZW50QXR0cmlidXRlJyksXG4gIGtMaXN0ZW5lcjogU3ltYm9sKCdrTGlzdGVuZXInKSxcbiAga1N0YXR1c0NvZGU6IFN5bWJvbCgnc3RhdHVzLWNvZGUnKSxcbiAga1dlYlNvY2tldDogU3ltYm9sKCd3ZWJzb2NrZXQnKSxcbiAgTk9PUDogKCkgPT4ge31cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsga0Zvck9uRXZlbnRBdHRyaWJ1dGUsIGtMaXN0ZW5lciB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcblxuY29uc3Qga0NvZGUgPSBTeW1ib2woJ2tDb2RlJyk7XG5jb25zdCBrRGF0YSA9IFN5bWJvbCgna0RhdGEnKTtcbmNvbnN0IGtFcnJvciA9IFN5bWJvbCgna0Vycm9yJyk7XG5jb25zdCBrTWVzc2FnZSA9IFN5bWJvbCgna01lc3NhZ2UnKTtcbmNvbnN0IGtSZWFzb24gPSBTeW1ib2woJ2tSZWFzb24nKTtcbmNvbnN0IGtUYXJnZXQgPSBTeW1ib2woJ2tUYXJnZXQnKTtcbmNvbnN0IGtUeXBlID0gU3ltYm9sKCdrVHlwZScpO1xuY29uc3Qga1dhc0NsZWFuID0gU3ltYm9sKCdrV2FzQ2xlYW4nKTtcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gZXZlbnQuXG4gKi9cbmNsYXNzIEV2ZW50IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiB0aGUgYHR5cGVgIGFyZ3VtZW50IGlzIG5vdCBzcGVjaWZpZWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHR5cGUpIHtcbiAgICB0aGlzW2tUYXJnZXRdID0gbnVsbDtcbiAgICB0aGlzW2tUeXBlXSA9IHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUgeyp9XG4gICAqL1xuICBnZXQgdGFyZ2V0KCkge1xuICAgIHJldHVybiB0aGlzW2tUYXJnZXRdO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpc1trVHlwZV07XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50LnByb3RvdHlwZSwgJ3RhcmdldCcsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudC5wcm90b3R5cGUsICd0eXBlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIGNsb3NlIGV2ZW50LlxuICpcbiAqIEBleHRlbmRzIEV2ZW50XG4gKi9cbmNsYXNzIENsb3NlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYENsb3NlRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXG4gICAqICAgICBhdHRyaWJ1dGVzIHZpYSBvYmplY3QgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jb2RlPTBdIFRoZSBzdGF0dXMgY29kZSBleHBsYWluaW5nIHdoeSB0aGVcbiAgICogICAgIGNvbm5lY3Rpb24gd2FzIGNsb3NlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucmVhc29uPScnXSBBIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBleHBsYWluaW5nIHdoeVxuICAgKiAgICAgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLndhc0NsZWFuPWZhbHNlXSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlXG4gICAqICAgICBjb25uZWN0aW9uIHdhcyBjbGVhbmx5IGNsb3NlZFxuICAgKi9cbiAgY29uc3RydWN0b3IodHlwZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIodHlwZSk7XG5cbiAgICB0aGlzW2tDb2RlXSA9IG9wdGlvbnMuY29kZSA9PT0gdW5kZWZpbmVkID8gMCA6IG9wdGlvbnMuY29kZTtcbiAgICB0aGlzW2tSZWFzb25dID0gb3B0aW9ucy5yZWFzb24gPT09IHVuZGVmaW5lZCA/ICcnIDogb3B0aW9ucy5yZWFzb247XG4gICAgdGhpc1trV2FzQ2xlYW5dID0gb3B0aW9ucy53YXNDbGVhbiA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBvcHRpb25zLndhc0NsZWFuO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgY29kZSgpIHtcbiAgICByZXR1cm4gdGhpc1trQ29kZV07XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIGdldCByZWFzb24oKSB7XG4gICAgcmV0dXJuIHRoaXNba1JlYXNvbl07XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqL1xuICBnZXQgd2FzQ2xlYW4oKSB7XG4gICAgcmV0dXJuIHRoaXNba1dhc0NsZWFuXTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ2xvc2VFdmVudC5wcm90b3R5cGUsICdjb2RlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KENsb3NlRXZlbnQucHJvdG90eXBlLCAncmVhc29uJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KENsb3NlRXZlbnQucHJvdG90eXBlLCAnd2FzQ2xlYW4nLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGFuIGVycm9yIGV2ZW50LlxuICpcbiAqIEBleHRlbmRzIEV2ZW50XG4gKi9cbmNsYXNzIEVycm9yRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYEVycm9yRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXG4gICAqICAgICBhdHRyaWJ1dGVzIHZpYSBvYmplY3QgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gW29wdGlvbnMuZXJyb3I9bnVsbF0gVGhlIGVycm9yIHRoYXQgZ2VuZXJhdGVkIHRoaXMgZXZlbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2U9JyddIFRoZSBlcnJvciBtZXNzYWdlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcih0eXBlKTtcblxuICAgIHRoaXNba0Vycm9yXSA9IG9wdGlvbnMuZXJyb3IgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBvcHRpb25zLmVycm9yO1xuICAgIHRoaXNba01lc3NhZ2VdID0gb3B0aW9ucy5tZXNzYWdlID09PSB1bmRlZmluZWQgPyAnJyA6IG9wdGlvbnMubWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7Kn1cbiAgICovXG4gIGdldCBlcnJvcigpIHtcbiAgICByZXR1cm4gdGhpc1trRXJyb3JdO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgbWVzc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpc1trTWVzc2FnZV07XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEVycm9yRXZlbnQucHJvdG90eXBlLCAnZXJyb3InLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXJyb3JFdmVudC5wcm90b3R5cGUsICdtZXNzYWdlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgZXZlbnQuXG4gKlxuICogQGV4dGVuZHMgRXZlbnRcbiAqL1xuY2xhc3MgTWVzc2FnZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBNZXNzYWdlRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXG4gICAqICAgICBhdHRyaWJ1dGVzIHZpYSBvYmplY3QgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gW29wdGlvbnMuZGF0YT1udWxsXSBUaGUgbWVzc2FnZSBjb250ZW50XG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcih0eXBlKTtcblxuICAgIHRoaXNba0RhdGFdID0gb3B0aW9ucy5kYXRhID09PSB1bmRlZmluZWQgPyBudWxsIDogb3B0aW9ucy5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHsqfVxuICAgKi9cbiAgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXNba0RhdGFdO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNZXNzYWdlRXZlbnQucHJvdG90eXBlLCAnZGF0YScsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuLyoqXG4gKiBUaGlzIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGVtdWxhdGluZyB0aGUgYEV2ZW50VGFyZ2V0YCBpbnRlcmZhY2UuIEl0J3Mgbm90XG4gKiBtZWFudCB0byBiZSB1c2VkIGRpcmVjdGx5LlxuICpcbiAqIEBtaXhpblxuICovXG5jb25zdCBFdmVudFRhcmdldCA9IHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGV2ZW50IHR5cGUgdG8gbGlzdGVuIGZvclxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnxPYmplY3QpfSBoYW5kbGVyIFRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBbiBvcHRpb25zIG9iamVjdCBzcGVjaWZpZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0XG4gICAqICAgICB0aGUgZXZlbnQgbGlzdGVuZXJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5vbmNlPWZhbHNlXSBBIGBCb29sZWFuYCBpbmRpY2F0aW5nIHRoYXQgdGhlXG4gICAqICAgICBsaXN0ZW5lciBzaG91bGQgYmUgaW52b2tlZCBhdCBtb3N0IG9uY2UgYWZ0ZXIgYmVpbmcgYWRkZWQuIElmIGB0cnVlYCxcbiAgICogICAgIHRoZSBsaXN0ZW5lciB3b3VsZCBiZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiBpbnZva2VkLlxuICAgKiBAcHVibGljXG4gICAqL1xuICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnModHlwZSkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIW9wdGlvbnNba0Zvck9uRXZlbnRBdHRyaWJ1dGVdICYmXG4gICAgICAgIGxpc3RlbmVyW2tMaXN0ZW5lcl0gPT09IGhhbmRsZXIgJiZcbiAgICAgICAgIWxpc3RlbmVyW2tGb3JPbkV2ZW50QXR0cmlidXRlXVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgd3JhcHBlcjtcblxuICAgIGlmICh0eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgIHdyYXBwZXIgPSBmdW5jdGlvbiBvbk1lc3NhZ2UoZGF0YSwgaXNCaW5hcnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50KCdtZXNzYWdlJywge1xuICAgICAgICAgIGRhdGE6IGlzQmluYXJ5ID8gZGF0YSA6IGRhdGEudG9TdHJpbmcoKVxuICAgICAgICB9KTtcblxuICAgICAgICBldmVudFtrVGFyZ2V0XSA9IHRoaXM7XG4gICAgICAgIGNhbGxMaXN0ZW5lcihoYW5kbGVyLCB0aGlzLCBldmVudCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgd3JhcHBlciA9IGZ1bmN0aW9uIG9uQ2xvc2UoY29kZSwgbWVzc2FnZSkge1xuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDbG9zZUV2ZW50KCdjbG9zZScsIHtcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHJlYXNvbjogbWVzc2FnZS50b1N0cmluZygpLFxuICAgICAgICAgIHdhc0NsZWFuOiB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgJiYgdGhpcy5fY2xvc2VGcmFtZVNlbnRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXZlbnRba1RhcmdldF0gPSB0aGlzO1xuICAgICAgICBjYWxsTGlzdGVuZXIoaGFuZGxlciwgdGhpcywgZXZlbnQpO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgIHdyYXBwZXIgPSBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEVycm9yRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXZlbnRba1RhcmdldF0gPSB0aGlzO1xuICAgICAgICBjYWxsTGlzdGVuZXIoaGFuZGxlciwgdGhpcywgZXZlbnQpO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvcGVuJykge1xuICAgICAgd3JhcHBlciA9IGZ1bmN0aW9uIG9uT3BlbigpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ29wZW4nKTtcblxuICAgICAgICBldmVudFtrVGFyZ2V0XSA9IHRoaXM7XG4gICAgICAgIGNhbGxMaXN0ZW5lcihoYW5kbGVyLCB0aGlzLCBldmVudCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd3JhcHBlcltrRm9yT25FdmVudEF0dHJpYnV0ZV0gPSAhIW9wdGlvbnNba0Zvck9uRXZlbnRBdHRyaWJ1dGVdO1xuICAgIHdyYXBwZXJba0xpc3RlbmVyXSA9IGhhbmRsZXI7XG5cbiAgICBpZiAob3B0aW9ucy5vbmNlKSB7XG4gICAgICB0aGlzLm9uY2UodHlwZSwgd3JhcHBlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub24odHlwZSwgd3JhcHBlcik7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXZlbnQgdHlwZSB0byByZW1vdmVcbiAgICogQHBhcmFtIHsoRnVuY3Rpb258T2JqZWN0KX0gaGFuZGxlciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlcikge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnModHlwZSkpIHtcbiAgICAgIGlmIChsaXN0ZW5lcltrTGlzdGVuZXJdID09PSBoYW5kbGVyICYmICFsaXN0ZW5lcltrRm9yT25FdmVudEF0dHJpYnV0ZV0pIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENsb3NlRXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIEV2ZW50LFxuICBFdmVudFRhcmdldCxcbiAgTWVzc2FnZUV2ZW50XG59O1xuXG4vKipcbiAqIENhbGwgYW4gZXZlbnQgbGlzdGVuZXJcbiAqXG4gKiBAcGFyYW0geyhGdW5jdGlvbnxPYmplY3QpfSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gY2FsbFxuICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSB2YWx1ZSB0byB1c2UgYXMgYHRoaXNgYCB3aGVuIGNhbGxpbmcgdGhlIGxpc3RlbmVyXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gcGFzcyB0byB0aGUgbGlzdGVuZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGxMaXN0ZW5lcihsaXN0ZW5lciwgdGhpc0FyZywgZXZlbnQpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciA9PT0gJ29iamVjdCcgJiYgbGlzdGVuZXIuaGFuZGxlRXZlbnQpIHtcbiAgICBsaXN0ZW5lci5oYW5kbGVFdmVudC5jYWxsKGxpc3RlbmVyLCBldmVudCk7XG4gIH0gZWxzZSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzQXJnLCBldmVudCk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyB0b2tlbkNoYXJzIH0gPSByZXF1aXJlKCcuL3ZhbGlkYXRpb24nKTtcblxuLyoqXG4gKiBBZGRzIGFuIG9mZmVyIHRvIHRoZSBtYXAgb2YgZXh0ZW5zaW9uIG9mZmVycyBvciBhIHBhcmFtZXRlciB0byB0aGUgbWFwIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0IFRoZSBtYXAgb2YgZXh0ZW5zaW9uIG9mZmVycyBvciBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgZXh0ZW5zaW9uIG9yIHBhcmFtZXRlciBuYW1lXG4gKiBAcGFyYW0geyhPYmplY3R8Qm9vbGVhbnxTdHJpbmcpfSBlbGVtIFRoZSBleHRlbnNpb24gcGFyYW1ldGVycyBvciB0aGVcbiAqICAgICBwYXJhbWV0ZXIgdmFsdWVcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHB1c2goZGVzdCwgbmFtZSwgZWxlbSkge1xuICBpZiAoZGVzdFtuYW1lXSA9PT0gdW5kZWZpbmVkKSBkZXN0W25hbWVdID0gW2VsZW1dO1xuICBlbHNlIGRlc3RbbmFtZV0ucHVzaChlbGVtKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnNgIGhlYWRlciBpbnRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyIFRoZSBmaWVsZCB2YWx1ZSBvZiB0aGUgaGVhZGVyXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBwYXJzZWQgb2JqZWN0XG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKGhlYWRlcikge1xuICBjb25zdCBvZmZlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBsZXQgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgbGV0IG11c3RVbmVzY2FwZSA9IGZhbHNlO1xuICBsZXQgaXNFc2NhcGluZyA9IGZhbHNlO1xuICBsZXQgaW5RdW90ZXMgPSBmYWxzZTtcbiAgbGV0IGV4dGVuc2lvbk5hbWU7XG4gIGxldCBwYXJhbU5hbWU7XG4gIGxldCBzdGFydCA9IC0xO1xuICBsZXQgY29kZSA9IC0xO1xuICBsZXQgZW5kID0gLTE7XG4gIGxldCBpID0gMDtcblxuICBmb3IgKDsgaSA8IGhlYWRlci5sZW5ndGg7IGkrKykge1xuICAgIGNvZGUgPSBoZWFkZXIuY2hhckNvZGVBdChpKTtcblxuICAgIGlmIChleHRlbnNpb25OYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChlbmQgPT09IC0xICYmIHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSAtMSkgc3RhcnQgPSBpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaSAhPT0gMCAmJlxuICAgICAgICAoY29kZSA9PT0gMHgyMCAvKiAnICcgKi8gfHwgY29kZSA9PT0gMHgwOSkgLyogJ1xcdCcgKi9cbiAgICAgICkge1xuICAgICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4M2IgLyogJzsnICovIHx8IGNvZGUgPT09IDB4MmMgLyogJywnICovKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICAgICAgICBjb25zdCBuYW1lID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgICBpZiAoY29kZSA9PT0gMHgyYykge1xuICAgICAgICAgIHB1c2gob2ZmZXJzLCBuYW1lLCBwYXJhbXMpO1xuICAgICAgICAgIHBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IG5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydCA9IGVuZCA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwYXJhbU5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVuZCA9PT0gLTEgJiYgdG9rZW5DaGFyc1tjb2RlXSA9PT0gMSkge1xuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MjAgfHwgY29kZSA9PT0gMHgwOSkge1xuICAgICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4M2IgfHwgY29kZSA9PT0gMHgyYykge1xuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kID09PSAtMSkgZW5kID0gaTtcbiAgICAgICAgcHVzaChwYXJhbXMsIGhlYWRlci5zbGljZShzdGFydCwgZW5kKSwgdHJ1ZSk7XG4gICAgICAgIGlmIChjb2RlID09PSAweDJjKSB7XG4gICAgICAgICAgcHVzaChvZmZlcnMsIGV4dGVuc2lvbk5hbWUsIHBhcmFtcyk7XG4gICAgICAgICAgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBleHRlbnNpb25OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBlbmQgPSAtMTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgzZCAvKiAnPScgKi8gJiYgc3RhcnQgIT09IC0xICYmIGVuZCA9PT0gLTEpIHtcbiAgICAgICAgcGFyYW1OYW1lID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBpKTtcbiAgICAgICAgc3RhcnQgPSBlbmQgPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHtpfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgLy8gVGhlIHZhbHVlIG9mIGEgcXVvdGVkLXN0cmluZyBhZnRlciB1bmVzY2FwaW5nIG11c3QgY29uZm9ybSB0byB0aGVcbiAgICAgIC8vIHRva2VuIEFCTkYsIHNvIG9ubHkgdG9rZW4gY2hhcmFjdGVycyBhcmUgdmFsaWQuXG4gICAgICAvLyBSZWY6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NDU1I3NlY3Rpb24tOS4xXG4gICAgICAvL1xuICAgICAgaWYgKGlzRXNjYXBpbmcpIHtcbiAgICAgICAgaWYgKHRva2VuQ2hhcnNbY29kZV0gIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICAgIGVsc2UgaWYgKCFtdXN0VW5lc2NhcGUpIG11c3RVbmVzY2FwZSA9IHRydWU7XG4gICAgICAgIGlzRXNjYXBpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoaW5RdW90ZXMpIHtcbiAgICAgICAgaWYgKHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcbiAgICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyMiAvKiAnXCInICovICYmIHN0YXJ0ICE9PSAtMSkge1xuICAgICAgICAgIGluUXVvdGVzID0gZmFsc2U7XG4gICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDVjIC8qICdcXCcgKi8pIHtcbiAgICAgICAgICBpc0VzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDIyICYmIGhlYWRlci5jaGFyQ29kZUF0KGkgLSAxKSA9PT0gMHgzZCkge1xuICAgICAgICBpblF1b3RlcyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGVuZCA9PT0gLTEgJiYgdG9rZW5DaGFyc1tjb2RlXSA9PT0gMSkge1xuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0ICE9PSAtMSAmJiAoY29kZSA9PT0gMHgyMCB8fCBjb2RlID09PSAweDA5KSkge1xuICAgICAgICBpZiAoZW5kID09PSAtMSkgZW5kID0gaTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgzYiB8fCBjb2RlID09PSAweDJjKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICAgICAgICBsZXQgdmFsdWUgPSBoZWFkZXIuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgIGlmIChtdXN0VW5lc2NhcGUpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcXFwvZywgJycpO1xuICAgICAgICAgIG11c3RVbmVzY2FwZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHB1c2gocGFyYW1zLCBwYXJhbU5hbWUsIHZhbHVlKTtcbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MmMpIHtcbiAgICAgICAgICBwdXNoKG9mZmVycywgZXh0ZW5zaW9uTmFtZSwgcGFyYW1zKTtcbiAgICAgICAgICBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGV4dGVuc2lvbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJhbU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHN0YXJ0ID0gZW5kID0gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGluUXVvdGVzIHx8IGNvZGUgPT09IDB4MjAgfHwgY29kZSA9PT0gMHgwOSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQnKTtcbiAgfVxuXG4gIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICBjb25zdCB0b2tlbiA9IGhlYWRlci5zbGljZShzdGFydCwgZW5kKTtcbiAgaWYgKGV4dGVuc2lvbk5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHB1c2gob2ZmZXJzLCB0b2tlbiwgcGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocGFyYW1OYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHB1c2gocGFyYW1zLCB0b2tlbiwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChtdXN0VW5lc2NhcGUpIHtcbiAgICAgIHB1c2gocGFyYW1zLCBwYXJhbU5hbWUsIHRva2VuLnJlcGxhY2UoL1xcXFwvZywgJycpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaChwYXJhbXMsIHBhcmFtTmFtZSwgdG9rZW4pO1xuICAgIH1cbiAgICBwdXNoKG9mZmVycywgZXh0ZW5zaW9uTmFtZSwgcGFyYW1zKTtcbiAgfVxuXG4gIHJldHVybiBvZmZlcnM7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zYCBoZWFkZXIgZmllbGQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGV4dGVuc2lvbnMgVGhlIG1hcCBvZiBleHRlbnNpb25zIGFuZCBwYXJhbWV0ZXJzIHRvIGZvcm1hdFxuICogQHJldHVybiB7U3RyaW5nfSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIG9iamVjdFxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBmb3JtYXQoZXh0ZW5zaW9ucykge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZXh0ZW5zaW9ucylcbiAgICAubWFwKChleHRlbnNpb24pID0+IHtcbiAgICAgIGxldCBjb25maWd1cmF0aW9ucyA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWd1cmF0aW9ucykpIGNvbmZpZ3VyYXRpb25zID0gW2NvbmZpZ3VyYXRpb25zXTtcbiAgICAgIHJldHVybiBjb25maWd1cmF0aW9uc1xuICAgICAgICAubWFwKChwYXJhbXMpID0+IHtcbiAgICAgICAgICByZXR1cm4gW2V4dGVuc2lvbl1cbiAgICAgICAgICAgIC5jb25jYXQoXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IHBhcmFtc1trXTtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkgdmFsdWVzID0gW3ZhbHVlc107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgLm1hcCgodikgPT4gKHYgPT09IHRydWUgPyBrIDogYCR7a309JHt2fWApKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oJzsgJyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbignOyAnKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgfSlcbiAgICAuam9pbignLCAnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7IGZvcm1hdCwgcGFyc2UgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3Qga0RvbmUgPSBTeW1ib2woJ2tEb25lJyk7XG5jb25zdCBrUnVuID0gU3ltYm9sKCdrUnVuJyk7XG5cbi8qKlxuICogQSB2ZXJ5IHNpbXBsZSBqb2IgcXVldWUgd2l0aCBhZGp1c3RhYmxlIGNvbmN1cnJlbmN5LiBBZGFwdGVkIGZyb21cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9TVFJNTC9hc3luYy1saW1pdGVyXG4gKi9cbmNsYXNzIExpbWl0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBgTGltaXRlcmAuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbY29uY3VycmVuY3k9SW5maW5pdHldIFRoZSBtYXhpbXVtIG51bWJlciBvZiBqb2JzIGFsbG93ZWRcbiAgICogICAgIHRvIHJ1biBjb25jdXJyZW50bHlcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmN1cnJlbmN5KSB7XG4gICAgdGhpc1trRG9uZV0gPSAoKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmctLTtcbiAgICAgIHRoaXNba1J1bl0oKTtcbiAgICB9O1xuICAgIHRoaXMuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeSB8fCBJbmZpbml0eTtcbiAgICB0aGlzLmpvYnMgPSBbXTtcbiAgICB0aGlzLnBlbmRpbmcgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBqb2IgdG8gdGhlIHF1ZXVlLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBqb2IgVGhlIGpvYiB0byBydW5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgYWRkKGpvYikge1xuICAgIHRoaXMuam9icy5wdXNoKGpvYik7XG4gICAgdGhpc1trUnVuXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBqb2IgZnJvbSB0aGUgcXVldWUgYW5kIHJ1bnMgaXQgaWYgcG9zc2libGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBba1J1bl0oKSB7XG4gICAgaWYgKHRoaXMucGVuZGluZyA9PT0gdGhpcy5jb25jdXJyZW5jeSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuam9icy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGpvYiA9IHRoaXMuam9icy5zaGlmdCgpO1xuXG4gICAgICB0aGlzLnBlbmRpbmcrKztcbiAgICAgIGpvYih0aGlzW2tEb25lXSk7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTGltaXRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcblxuY29uc3QgYnVmZmVyVXRpbCA9IHJlcXVpcmUoJy4vYnVmZmVyLXV0aWwnKTtcbmNvbnN0IExpbWl0ZXIgPSByZXF1aXJlKCcuL2xpbWl0ZXInKTtcbmNvbnN0IHsga1N0YXR1c0NvZGUgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbmNvbnN0IEZhc3RCdWZmZXIgPSBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdO1xuY29uc3QgVFJBSUxFUiA9IEJ1ZmZlci5mcm9tKFsweDAwLCAweDAwLCAweGZmLCAweGZmXSk7XG5jb25zdCBrUGVyTWVzc2FnZURlZmxhdGUgPSBTeW1ib2woJ3Blcm1lc3NhZ2UtZGVmbGF0ZScpO1xuY29uc3Qga1RvdGFsTGVuZ3RoID0gU3ltYm9sKCd0b3RhbC1sZW5ndGgnKTtcbmNvbnN0IGtDYWxsYmFjayA9IFN5bWJvbCgnY2FsbGJhY2snKTtcbmNvbnN0IGtCdWZmZXJzID0gU3ltYm9sKCdidWZmZXJzJyk7XG5jb25zdCBrRXJyb3IgPSBTeW1ib2woJ2Vycm9yJyk7XG5cbi8vXG4vLyBXZSBsaW1pdCB6bGliIGNvbmN1cnJlbmN5LCB3aGljaCBwcmV2ZW50cyBzZXZlcmUgbWVtb3J5IGZyYWdtZW50YXRpb25cbi8vIGFzIGRvY3VtZW50ZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy84ODcxI2lzc3VlY29tbWVudC0yNTA5MTU5MTNcbi8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vd2Vic29ja2V0cy93cy9pc3N1ZXMvMTIwMlxuLy9cbi8vIEludGVudGlvbmFsbHkgZ2xvYmFsOyBpdCdzIHRoZSBnbG9iYWwgdGhyZWFkIHBvb2wgdGhhdCdzIGFuIGlzc3VlLlxuLy9cbmxldCB6bGliTGltaXRlcjtcblxuLyoqXG4gKiBwZXJtZXNzYWdlLWRlZmxhdGUgaW1wbGVtZW50YXRpb24uXG4gKi9cbmNsYXNzIFBlck1lc3NhZ2VEZWZsYXRlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBQZXJNZXNzYWdlRGVmbGF0ZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBDb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHsoQm9vbGVhbnxOdW1iZXIpfSBbb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzXSBBZHZlcnRpc2Ugc3VwcG9ydFxuICAgKiAgICAgZm9yLCBvciByZXF1ZXN0LCBhIGN1c3RvbSBjbGllbnQgd2luZG93IHNpemVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGllbnROb0NvbnRleHRUYWtlb3Zlcj1mYWxzZV0gQWR2ZXJ0aXNlL1xuICAgKiAgICAgYWNrbm93bGVkZ2UgZGlzYWJsaW5nIG9mIGNsaWVudCBjb250ZXh0IHRha2VvdmVyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jb25jdXJyZW5jeUxpbWl0PTEwXSBUaGUgbnVtYmVyIG9mIGNvbmN1cnJlbnRcbiAgICogICAgIGNhbGxzIHRvIHpsaWJcbiAgICogQHBhcmFtIHsoQm9vbGVhbnxOdW1iZXIpfSBbb3B0aW9ucy5zZXJ2ZXJNYXhXaW5kb3dCaXRzXSBSZXF1ZXN0L2NvbmZpcm0gdGhlXG4gICAqICAgICB1c2Ugb2YgYSBjdXN0b20gc2VydmVyIHdpbmRvdyBzaXplXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2VydmVyTm9Db250ZXh0VGFrZW92ZXI9ZmFsc2VdIFJlcXVlc3QvYWNjZXB0XG4gICAqICAgICBkaXNhYmxpbmcgb2Ygc2VydmVyIGNvbnRleHQgdGFrZW92ZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnRocmVzaG9sZD0xMDI0XSBTaXplIChpbiBieXRlcykgYmVsb3cgd2hpY2hcbiAgICogICAgIG1lc3NhZ2VzIHNob3VsZCBub3QgYmUgY29tcHJlc3NlZCBpZiBjb250ZXh0IHRha2VvdmVyIGlzIGRpc2FibGVkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy56bGliRGVmbGF0ZU9wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB6bGliIG9uXG4gICAqICAgICBkZWZsYXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy56bGliSW5mbGF0ZU9wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB6bGliIG9uXG4gICAqICAgICBpbmZsYXRlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzU2VydmVyPWZhbHNlXSBDcmVhdGUgdGhlIGluc3RhbmNlIGluIGVpdGhlciBzZXJ2ZXIgb3JcbiAgICogICAgIGNsaWVudCBtb2RlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbWF4UGF5bG9hZD0wXSBUaGUgbWF4aW11bSBhbGxvd2VkIG1lc3NhZ2UgbGVuZ3RoXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zLCBpc1NlcnZlciwgbWF4UGF5bG9hZCkge1xuICAgIHRoaXMuX21heFBheWxvYWQgPSBtYXhQYXlsb2FkIHwgMDtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLl90aHJlc2hvbGQgPVxuICAgICAgdGhpcy5fb3B0aW9ucy50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHRoaXMuX29wdGlvbnMudGhyZXNob2xkIDogMTAyNDtcbiAgICB0aGlzLl9pc1NlcnZlciA9ICEhaXNTZXJ2ZXI7XG4gICAgdGhpcy5fZGVmbGF0ZSA9IG51bGw7XG4gICAgdGhpcy5faW5mbGF0ZSA9IG51bGw7XG5cbiAgICB0aGlzLnBhcmFtcyA9IG51bGw7XG5cbiAgICBpZiAoIXpsaWJMaW1pdGVyKSB7XG4gICAgICBjb25zdCBjb25jdXJyZW5jeSA9XG4gICAgICAgIHRoaXMuX29wdGlvbnMuY29uY3VycmVuY3lMaW1pdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB0aGlzLl9vcHRpb25zLmNvbmN1cnJlbmN5TGltaXRcbiAgICAgICAgICA6IDEwO1xuICAgICAgemxpYkxpbWl0ZXIgPSBuZXcgTGltaXRlcihjb25jdXJyZW5jeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGV4dGVuc2lvbk5hbWUoKSB7XG4gICAgcmV0dXJuICdwZXJtZXNzYWdlLWRlZmxhdGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBleHRlbnNpb24gbmVnb3RpYXRpb24gb2ZmZXIuXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gRXh0ZW5zaW9uIHBhcmFtZXRlcnNcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgb2ZmZXIoKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5zZXJ2ZXJOb0NvbnRleHRUYWtlb3Zlcikge1xuICAgICAgcGFyYW1zLnNlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wdGlvbnMuY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIpIHtcbiAgICAgIHBhcmFtcy5jbGllbnRfbm9fY29udGV4dF90YWtlb3ZlciA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcHRpb25zLnNlcnZlck1heFdpbmRvd0JpdHMpIHtcbiAgICAgIHBhcmFtcy5zZXJ2ZXJfbWF4X3dpbmRvd19iaXRzID0gdGhpcy5fb3B0aW9ucy5zZXJ2ZXJNYXhXaW5kb3dCaXRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzKSB7XG4gICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA9IHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cztcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cyA9PSBudWxsKSB7XG4gICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQgYW4gZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVyL3Jlc3BvbnNlLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBjb25maWd1cmF0aW9ucyBUaGUgZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVycy9yZXBvbnNlXG4gICAqIEByZXR1cm4ge09iamVjdH0gQWNjZXB0ZWQgY29uZmlndXJhdGlvblxuICAgKiBAcHVibGljXG4gICAqL1xuICBhY2NlcHQoY29uZmlndXJhdGlvbnMpIHtcbiAgICBjb25maWd1cmF0aW9ucyA9IHRoaXMubm9ybWFsaXplUGFyYW1zKGNvbmZpZ3VyYXRpb25zKTtcblxuICAgIHRoaXMucGFyYW1zID0gdGhpcy5faXNTZXJ2ZXJcbiAgICAgID8gdGhpcy5hY2NlcHRBc1NlcnZlcihjb25maWd1cmF0aW9ucylcbiAgICAgIDogdGhpcy5hY2NlcHRBc0NsaWVudChjb25maWd1cmF0aW9ucyk7XG5cbiAgICByZXR1cm4gdGhpcy5wYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBleHRlbnNpb24uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMuX2luZmxhdGUpIHtcbiAgICAgIHRoaXMuX2luZmxhdGUuY2xvc2UoKTtcbiAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kZWZsYXRlKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuX2RlZmxhdGVba0NhbGxiYWNrXTtcblxuICAgICAgdGhpcy5fZGVmbGF0ZS5jbG9zZSgpO1xuICAgICAgdGhpcy5fZGVmbGF0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayhcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVGhlIGRlZmxhdGUgc3RyZWFtIHdhcyBjbG9zZWQgd2hpbGUgZGF0YSB3YXMgYmVpbmcgcHJvY2Vzc2VkJ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogIEFjY2VwdCBhbiBleHRlbnNpb24gbmVnb3RpYXRpb24gb2ZmZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IG9mZmVycyBUaGUgZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVyc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IEFjY2VwdGVkIGNvbmZpZ3VyYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFjY2VwdEFzU2VydmVyKG9mZmVycykge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9vcHRpb25zO1xuICAgIGNvbnN0IGFjY2VwdGVkID0gb2ZmZXJzLmZpbmQoKHBhcmFtcykgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAob3B0cy5zZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlciA9PT0gZmFsc2UgJiZcbiAgICAgICAgICBwYXJhbXMuc2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXIpIHx8XG4gICAgICAgIChwYXJhbXMuc2VydmVyX21heF93aW5kb3dfYml0cyAmJlxuICAgICAgICAgIChvcHRzLnNlcnZlck1heFdpbmRvd0JpdHMgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICAodHlwZW9mIG9wdHMuc2VydmVyTWF4V2luZG93Qml0cyA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgb3B0cy5zZXJ2ZXJNYXhXaW5kb3dCaXRzID4gcGFyYW1zLnNlcnZlcl9tYXhfd2luZG93X2JpdHMpKSkgfHxcbiAgICAgICAgKHR5cGVvZiBvcHRzLmNsaWVudE1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgIXBhcmFtcy5jbGllbnRfbWF4X3dpbmRvd19iaXRzKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBpZiAoIWFjY2VwdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vbmUgb2YgdGhlIGV4dGVuc2lvbiBvZmZlcnMgY2FuIGJlIGFjY2VwdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuc2VydmVyTm9Db250ZXh0VGFrZW92ZXIpIHtcbiAgICAgIGFjY2VwdGVkLnNlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9wdHMuY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIpIHtcbiAgICAgIGFjY2VwdGVkLmNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRzLnNlcnZlck1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInKSB7XG4gICAgICBhY2NlcHRlZC5zZXJ2ZXJfbWF4X3dpbmRvd19iaXRzID0gb3B0cy5zZXJ2ZXJNYXhXaW5kb3dCaXRzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMuY2xpZW50TWF4V2luZG93Qml0cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFjY2VwdGVkLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPSBvcHRzLmNsaWVudE1heFdpbmRvd0JpdHM7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGFjY2VwdGVkLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPT09IHRydWUgfHxcbiAgICAgIG9wdHMuY2xpZW50TWF4V2luZG93Qml0cyA9PT0gZmFsc2VcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBhY2NlcHRlZC5jbGllbnRfbWF4X3dpbmRvd19iaXRzO1xuICAgIH1cblxuICAgIHJldHVybiBhY2NlcHRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQgdGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gcmVzcG9uc2UgVGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiByZXNwb25zZVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IEFjY2VwdGVkIGNvbmZpZ3VyYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFjY2VwdEFzQ2xpZW50KHJlc3BvbnNlKSB7XG4gICAgY29uc3QgcGFyYW1zID0gcmVzcG9uc2VbMF07XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9vcHRpb25zLmNsaWVudE5vQ29udGV4dFRha2VvdmVyID09PSBmYWxzZSAmJlxuICAgICAgcGFyYW1zLmNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgcGFyYW1ldGVyIFwiY2xpZW50X25vX2NvbnRleHRfdGFrZW92ZXJcIicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmNsaWVudF9tYXhfd2luZG93X2JpdHMpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzID09PSAnbnVtYmVyJykge1xuICAgICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA9IHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzID09PSBmYWxzZSB8fFxuICAgICAgKHR5cGVvZiB0aGlzLl9vcHRpb25zLmNsaWVudE1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInICYmXG4gICAgICAgIHBhcmFtcy5jbGllbnRfbWF4X3dpbmRvd19iaXRzID4gdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVW5leHBlY3RlZCBvciBpbnZhbGlkIHBhcmFtZXRlciBcImNsaWVudF9tYXhfd2luZG93X2JpdHNcIidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gY29uZmlndXJhdGlvbnMgVGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiBvZmZlcnMvcmVwb25zZVxuICAgKiBAcmV0dXJuIHtBcnJheX0gVGhlIG9mZmVycy9yZXNwb25zZSB3aXRoIG5vcm1hbGl6ZWQgcGFyYW1ldGVyc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbm9ybWFsaXplUGFyYW1zKGNvbmZpZ3VyYXRpb25zKSB7XG4gICAgY29uZmlndXJhdGlvbnMuZm9yRWFjaCgocGFyYW1zKSA9PiB7XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJhbXNba2V5XTtcblxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyIFwiJHtrZXl9XCIgbXVzdCBoYXZlIG9ubHkgYSBzaW5nbGUgdmFsdWVgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gdmFsdWVbMF07XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ2NsaWVudF9tYXhfd2luZG93X2JpdHMnKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBudW0gPSArdmFsdWU7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtKSB8fCBudW0gPCA4IHx8IG51bSA+IDE1KSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYEludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciBcIiR7a2V5fVwiOiAke3ZhbHVlfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gbnVtO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzU2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyIFwiJHtrZXl9XCI6ICR7dmFsdWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnc2VydmVyX21heF93aW5kb3dfYml0cycpIHtcbiAgICAgICAgICBjb25zdCBudW0gPSArdmFsdWU7XG4gICAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtIDwgOCB8fCBudW0gPiAxNSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgYEludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciBcIiR7a2V5fVwiOiAke3ZhbHVlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbHVlID0gbnVtO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGtleSA9PT0gJ2NsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyJyB8fFxuICAgICAgICAgIGtleSA9PT0gJ3NlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyJ1xuICAgICAgICApIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgXCIke2tleX1cIjogJHt2YWx1ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcGFyYW1ldGVyIFwiJHtrZXl9XCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmFtc1trZXldID0gdmFsdWU7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjb25maWd1cmF0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvbXByZXNzIGRhdGEuIENvbmN1cnJlbmN5IGxpbWl0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIENvbXByZXNzZWQgZGF0YVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBkZWNvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICB6bGliTGltaXRlci5hZGQoKGRvbmUpID0+IHtcbiAgICAgIHRoaXMuX2RlY29tcHJlc3MoZGF0YSwgZmluLCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wcmVzcyBkYXRhLiBDb25jdXJyZW5jeSBsaW1pdGVkLlxuICAgKlxuICAgKiBAcGFyYW0geyhCdWZmZXJ8U3RyaW5nKX0gZGF0YSBEYXRhIHRvIGNvbXByZXNzXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZmluIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIHRoZSBsYXN0IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICB6bGliTGltaXRlci5hZGQoKGRvbmUpID0+IHtcbiAgICAgIHRoaXMuX2NvbXByZXNzKGRhdGEsIGZpbiwgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb21wcmVzcyBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBDb21wcmVzc2VkIGRhdGFcbiAgICogQHBhcmFtIHtCb29sZWFufSBmaW4gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgdGhlIGxhc3QgZnJhZ21lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kZWNvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuX2lzU2VydmVyID8gJ2NsaWVudCcgOiAnc2VydmVyJztcblxuICAgIGlmICghdGhpcy5faW5mbGF0ZSkge1xuICAgICAgY29uc3Qga2V5ID0gYCR7ZW5kcG9pbnR9X21heF93aW5kb3dfYml0c2A7XG4gICAgICBjb25zdCB3aW5kb3dCaXRzID1cbiAgICAgICAgdHlwZW9mIHRoaXMucGFyYW1zW2tleV0gIT09ICdudW1iZXInXG4gICAgICAgICAgPyB6bGliLlpfREVGQVVMVF9XSU5ET1dCSVRTXG4gICAgICAgICAgOiB0aGlzLnBhcmFtc1trZXldO1xuXG4gICAgICB0aGlzLl9pbmZsYXRlID0gemxpYi5jcmVhdGVJbmZsYXRlUmF3KHtcbiAgICAgICAgLi4udGhpcy5fb3B0aW9ucy56bGliSW5mbGF0ZU9wdGlvbnMsXG4gICAgICAgIHdpbmRvd0JpdHNcbiAgICAgIH0pO1xuICAgICAgdGhpcy5faW5mbGF0ZVtrUGVyTWVzc2FnZURlZmxhdGVdID0gdGhpcztcbiAgICAgIHRoaXMuX2luZmxhdGVba1RvdGFsTGVuZ3RoXSA9IDA7XG4gICAgICB0aGlzLl9pbmZsYXRlW2tCdWZmZXJzXSA9IFtdO1xuICAgICAgdGhpcy5faW5mbGF0ZS5vbignZXJyb3InLCBpbmZsYXRlT25FcnJvcik7XG4gICAgICB0aGlzLl9pbmZsYXRlLm9uKCdkYXRhJywgaW5mbGF0ZU9uRGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5faW5mbGF0ZVtrQ2FsbGJhY2tdID0gY2FsbGJhY2s7XG5cbiAgICB0aGlzLl9pbmZsYXRlLndyaXRlKGRhdGEpO1xuICAgIGlmIChmaW4pIHRoaXMuX2luZmxhdGUud3JpdGUoVFJBSUxFUik7XG5cbiAgICB0aGlzLl9pbmZsYXRlLmZsdXNoKCgpID0+IHtcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuX2luZmxhdGVba0Vycm9yXTtcblxuICAgICAgaWYgKGVycikge1xuICAgICAgICB0aGlzLl9pbmZsYXRlLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBidWZmZXJVdGlsLmNvbmNhdChcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrQnVmZmVyc10sXG4gICAgICAgIHRoaXMuX2luZmxhdGVba1RvdGFsTGVuZ3RoXVxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuX2luZmxhdGUuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCkge1xuICAgICAgICB0aGlzLl9pbmZsYXRlLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrVG90YWxMZW5ndGhdID0gMDtcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgICBpZiAoZmluICYmIHRoaXMucGFyYW1zW2Ake2VuZHBvaW50fV9ub19jb250ZXh0X3Rha2VvdmVyYF0pIHtcbiAgICAgICAgICB0aGlzLl9pbmZsYXRlLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHJlc3MgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHsoQnVmZmVyfFN0cmluZyl9IGRhdGEgRGF0YSB0byBjb21wcmVzc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuX2lzU2VydmVyID8gJ3NlcnZlcicgOiAnY2xpZW50JztcblxuICAgIGlmICghdGhpcy5fZGVmbGF0ZSkge1xuICAgICAgY29uc3Qga2V5ID0gYCR7ZW5kcG9pbnR9X21heF93aW5kb3dfYml0c2A7XG4gICAgICBjb25zdCB3aW5kb3dCaXRzID1cbiAgICAgICAgdHlwZW9mIHRoaXMucGFyYW1zW2tleV0gIT09ICdudW1iZXInXG4gICAgICAgICAgPyB6bGliLlpfREVGQVVMVF9XSU5ET1dCSVRTXG4gICAgICAgICAgOiB0aGlzLnBhcmFtc1trZXldO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlID0gemxpYi5jcmVhdGVEZWZsYXRlUmF3KHtcbiAgICAgICAgLi4udGhpcy5fb3B0aW9ucy56bGliRGVmbGF0ZU9wdGlvbnMsXG4gICAgICAgIHdpbmRvd0JpdHNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF0gPSAwO1xuICAgICAgdGhpcy5fZGVmbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgdGhpcy5fZGVmbGF0ZS5vbignZGF0YScsIGRlZmxhdGVPbkRhdGEpO1xuICAgIH1cblxuICAgIHRoaXMuX2RlZmxhdGVba0NhbGxiYWNrXSA9IGNhbGxiYWNrO1xuXG4gICAgdGhpcy5fZGVmbGF0ZS53cml0ZShkYXRhKTtcbiAgICB0aGlzLl9kZWZsYXRlLmZsdXNoKHpsaWIuWl9TWU5DX0ZMVVNILCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2RlZmxhdGUpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGRlZmxhdGUgc3RyZWFtIHdhcyBjbG9zZWQgd2hpbGUgZGF0YSB3YXMgYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAgICAvL1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhID0gYnVmZmVyVXRpbC5jb25jYXQoXG4gICAgICAgIHRoaXMuX2RlZmxhdGVba0J1ZmZlcnNdLFxuICAgICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF1cbiAgICAgICk7XG5cbiAgICAgIGlmIChmaW4pIHtcbiAgICAgICAgZGF0YSA9IG5ldyBGYXN0QnVmZmVyKGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEubGVuZ3RoIC0gNCk7XG4gICAgICB9XG5cbiAgICAgIC8vXG4gICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkIGFnYWluIGluXG4gICAgICAvLyBgUGVyTWVzc2FnZURlZmxhdGUjY2xlYW51cCgpYC5cbiAgICAgIC8vXG4gICAgICB0aGlzLl9kZWZsYXRlW2tDYWxsYmFja10gPSBudWxsO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF0gPSAwO1xuICAgICAgdGhpcy5fZGVmbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgaWYgKGZpbiAmJiB0aGlzLnBhcmFtc1tgJHtlbmRwb2ludH1fbm9fY29udGV4dF90YWtlb3ZlcmBdKSB7XG4gICAgICAgIHRoaXMuX2RlZmxhdGUucmVzZXQoKTtcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgfSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBQZXJNZXNzYWdlRGVmbGF0ZTtcblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGB6bGliLkRlZmxhdGVSYXdgIHN0cmVhbSBgJ2RhdGEnYCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgQSBjaHVuayBvZiBkYXRhXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZsYXRlT25EYXRhKGNodW5rKSB7XG4gIHRoaXNba0J1ZmZlcnNdLnB1c2goY2h1bmspO1xuICB0aGlzW2tUb3RhbExlbmd0aF0gKz0gY2h1bmsubGVuZ3RoO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYHpsaWIuSW5mbGF0ZVJhd2Agc3RyZWFtIGAnZGF0YSdgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBjaHVuayBBIGNodW5rIG9mIGRhdGFcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluZmxhdGVPbkRhdGEoY2h1bmspIHtcbiAgdGhpc1trVG90YWxMZW5ndGhdICs9IGNodW5rLmxlbmd0aDtcblxuICBpZiAoXG4gICAgdGhpc1trUGVyTWVzc2FnZURlZmxhdGVdLl9tYXhQYXlsb2FkIDwgMSB8fFxuICAgIHRoaXNba1RvdGFsTGVuZ3RoXSA8PSB0aGlzW2tQZXJNZXNzYWdlRGVmbGF0ZV0uX21heFBheWxvYWRcbiAgKSB7XG4gICAgdGhpc1trQnVmZmVyc10ucHVzaChjaHVuayk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpc1trRXJyb3JdID0gbmV3IFJhbmdlRXJyb3IoJ01heCBwYXlsb2FkIHNpemUgZXhjZWVkZWQnKTtcbiAgdGhpc1trRXJyb3JdLmNvZGUgPSAnV1NfRVJSX1VOU1VQUE9SVEVEX01FU1NBR0VfTEVOR1RIJztcbiAgdGhpc1trRXJyb3JdW2tTdGF0dXNDb2RlXSA9IDEwMDk7XG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBpbmZsYXRlT25EYXRhKTtcbiAgdGhpcy5yZXNldCgpO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYHpsaWIuSW5mbGF0ZVJhd2Agc3RyZWFtIGAnZXJyb3InYCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnIgVGhlIGVtaXR0ZWQgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluZmxhdGVPbkVycm9yKGVycikge1xuICAvL1xuICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgYFpsaWIjY2xvc2UoKWAgYXMgdGhlIGhhbmRsZSBpcyBhdXRvbWF0aWNhbGx5XG4gIC8vIGNsb3NlZCB3aGVuIGFuIGVycm9yIGlzIGVtaXR0ZWQuXG4gIC8vXG4gIHRoaXNba1Blck1lc3NhZ2VEZWZsYXRlXS5faW5mbGF0ZSA9IG51bGw7XG4gIGVycltrU3RhdHVzQ29kZV0gPSAxMDA3O1xuICB0aGlzW2tDYWxsYmFja10oZXJyKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBXcml0YWJsZSB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlID0gcmVxdWlyZSgnLi9wZXJtZXNzYWdlLWRlZmxhdGUnKTtcbmNvbnN0IHtcbiAgQklOQVJZX1RZUEVTLFxuICBFTVBUWV9CVUZGRVIsXG4gIGtTdGF0dXNDb2RlLFxuICBrV2ViU29ja2V0XG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IHsgY29uY2F0LCB0b0FycmF5QnVmZmVyLCB1bm1hc2sgfSA9IHJlcXVpcmUoJy4vYnVmZmVyLXV0aWwnKTtcbmNvbnN0IHsgaXNWYWxpZFN0YXR1c0NvZGUsIGlzVmFsaWRVVEY4IH0gPSByZXF1aXJlKCcuL3ZhbGlkYXRpb24nKTtcblxuY29uc3QgRmFzdEJ1ZmZlciA9IEJ1ZmZlcltTeW1ib2wuc3BlY2llc107XG5cbmNvbnN0IEdFVF9JTkZPID0gMDtcbmNvbnN0IEdFVF9QQVlMT0FEX0xFTkdUSF8xNiA9IDE7XG5jb25zdCBHRVRfUEFZTE9BRF9MRU5HVEhfNjQgPSAyO1xuY29uc3QgR0VUX01BU0sgPSAzO1xuY29uc3QgR0VUX0RBVEEgPSA0O1xuY29uc3QgSU5GTEFUSU5HID0gNTtcbmNvbnN0IERFRkVSX0VWRU5UID0gNjtcblxuLyoqXG4gKiBIeUJpIFJlY2VpdmVyIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBleHRlbmRzIFdyaXRhYmxlXG4gKi9cbmNsYXNzIFJlY2VpdmVyIGV4dGVuZHMgV3JpdGFibGUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIFJlY2VpdmVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cz10cnVlXSBTcGVjaWZpZXMgd2hldGhlclxuICAgKiAgICAgYW55IG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWRcbiAgICogICAgIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHRpY2tcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmJpbmFyeVR5cGU9bm9kZWJ1ZmZlcl0gVGhlIHR5cGUgZm9yIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5leHRlbnNpb25zXSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbmVnb3RpYXRlZFxuICAgKiAgICAgZXh0ZW5zaW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmlzU2VydmVyPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciB0byBvcGVyYXRlIGluXG4gICAqICAgICBjbGllbnQgb3Igc2VydmVyIG1vZGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heFBheWxvYWQ9MF0gVGhlIG1heGltdW0gYWxsb3dlZCBtZXNzYWdlIGxlbmd0aFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAgICogICAgIG5vdCB0byBza2lwIFVURi04IHZhbGlkYXRpb24gZm9yIHRleHQgYW5kIGNsb3NlIG1lc3NhZ2VzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYWxsb3dTeW5jaHJvbm91c0V2ZW50cyA9XG4gICAgICBvcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG9wdGlvbnMuYWxsb3dTeW5jaHJvbm91c0V2ZW50c1xuICAgICAgICA6IHRydWU7XG4gICAgdGhpcy5fYmluYXJ5VHlwZSA9IG9wdGlvbnMuYmluYXJ5VHlwZSB8fCBCSU5BUllfVFlQRVNbMF07XG4gICAgdGhpcy5fZXh0ZW5zaW9ucyA9IG9wdGlvbnMuZXh0ZW5zaW9ucyB8fCB7fTtcbiAgICB0aGlzLl9pc1NlcnZlciA9ICEhb3B0aW9ucy5pc1NlcnZlcjtcbiAgICB0aGlzLl9tYXhQYXlsb2FkID0gb3B0aW9ucy5tYXhQYXlsb2FkIHwgMDtcbiAgICB0aGlzLl9za2lwVVRGOFZhbGlkYXRpb24gPSAhIW9wdGlvbnMuc2tpcFVURjhWYWxpZGF0aW9uO1xuICAgIHRoaXNba1dlYlNvY2tldF0gPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzID0gMDtcbiAgICB0aGlzLl9idWZmZXJzID0gW107XG5cbiAgICB0aGlzLl9jb21wcmVzc2VkID0gZmFsc2U7XG4gICAgdGhpcy5fcGF5bG9hZExlbmd0aCA9IDA7XG4gICAgdGhpcy5fbWFzayA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9mcmFnbWVudGVkID0gMDtcbiAgICB0aGlzLl9tYXNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9maW4gPSBmYWxzZTtcbiAgICB0aGlzLl9vcGNvZGUgPSAwO1xuXG4gICAgdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9mcmFnbWVudHMgPSBbXTtcblxuICAgIHRoaXMuX2Vycm9yZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGBXcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlKClgLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgVGhlIGNodW5rIG9mIGRhdGEgdG8gd3JpdGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGVuY29kaW5nIFRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgYGNodW5rYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICBpZiAodGhpcy5fb3Bjb2RlID09PSAweDA4ICYmIHRoaXMuX3N0YXRlID09IEdFVF9JTkZPKSByZXR1cm4gY2IoKTtcblxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuICAgIHRoaXMuX2J1ZmZlcnMucHVzaChjaHVuayk7XG4gICAgdGhpcy5zdGFydExvb3AoY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVzIGBuYCBieXRlcyBmcm9tIHRoZSBidWZmZXJlZCBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnN1bWVcbiAgICogQHJldHVybiB7QnVmZmVyfSBUaGUgY29uc3VtZWQgYnl0ZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN1bWUobikge1xuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgLT0gbjtcblxuICAgIGlmIChuID09PSB0aGlzLl9idWZmZXJzWzBdLmxlbmd0aCkgcmV0dXJuIHRoaXMuX2J1ZmZlcnMuc2hpZnQoKTtcblxuICAgIGlmIChuIDwgdGhpcy5fYnVmZmVyc1swXS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IHRoaXMuX2J1ZmZlcnNbMF07XG4gICAgICB0aGlzLl9idWZmZXJzWzBdID0gbmV3IEZhc3RCdWZmZXIoXG4gICAgICAgIGJ1Zi5idWZmZXIsXG4gICAgICAgIGJ1Zi5ieXRlT2Zmc2V0ICsgbixcbiAgICAgICAgYnVmLmxlbmd0aCAtIG5cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBuZXcgRmFzdEJ1ZmZlcihidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgbik7XG4gICAgfVxuXG4gICAgY29uc3QgZHN0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4pO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgYnVmID0gdGhpcy5fYnVmZmVyc1swXTtcbiAgICAgIGNvbnN0IG9mZnNldCA9IGRzdC5sZW5ndGggLSBuO1xuXG4gICAgICBpZiAobiA+PSBidWYubGVuZ3RoKSB7XG4gICAgICAgIGRzdC5zZXQodGhpcy5fYnVmZmVycy5zaGlmdCgpLCBvZmZzZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHN0LnNldChuZXcgVWludDhBcnJheShidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgbiksIG9mZnNldCk7XG4gICAgICAgIHRoaXMuX2J1ZmZlcnNbMF0gPSBuZXcgRmFzdEJ1ZmZlcihcbiAgICAgICAgICBidWYuYnVmZmVyLFxuICAgICAgICAgIGJ1Zi5ieXRlT2Zmc2V0ICsgbixcbiAgICAgICAgICBidWYubGVuZ3RoIC0gblxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBuIC09IGJ1Zi5sZW5ndGg7XG4gICAgfSB3aGlsZSAobiA+IDApO1xuXG4gICAgcmV0dXJuIGRzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBhcnNpbmcgbG9vcC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0TG9vcChjYikge1xuICAgIHRoaXMuX2xvb3AgPSB0cnVlO1xuXG4gICAgZG8ge1xuICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xuICAgICAgICBjYXNlIEdFVF9JTkZPOlxuICAgICAgICAgIHRoaXMuZ2V0SW5mbyhjYik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgR0VUX1BBWUxPQURfTEVOR1RIXzE2OlxuICAgICAgICAgIHRoaXMuZ2V0UGF5bG9hZExlbmd0aDE2KGNiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBHRVRfUEFZTE9BRF9MRU5HVEhfNjQ6XG4gICAgICAgICAgdGhpcy5nZXRQYXlsb2FkTGVuZ3RoNjQoY2IpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEdFVF9NQVNLOlxuICAgICAgICAgIHRoaXMuZ2V0TWFzaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEdFVF9EQVRBOlxuICAgICAgICAgIHRoaXMuZ2V0RGF0YShjYik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSU5GTEFUSU5HOlxuICAgICAgICBjYXNlIERFRkVSX0VWRU5UOlxuICAgICAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSB3aGlsZSAodGhpcy5fbG9vcCk7XG5cbiAgICBpZiAoIXRoaXMuX2Vycm9yZWQpIGNiKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGZpcnN0IHR3byBieXRlcyBvZiBhIGZyYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0SW5mbyhjYikge1xuICAgIGlmICh0aGlzLl9idWZmZXJlZEJ5dGVzIDwgMikge1xuICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuY29uc3VtZSgyKTtcblxuICAgIGlmICgoYnVmWzBdICYgMHgzMCkgIT09IDB4MDApIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgJ1JTVjIgYW5kIFJTVjMgbXVzdCBiZSBjbGVhcicsXG4gICAgICAgIHRydWUsXG4gICAgICAgIDEwMDIsXG4gICAgICAgICdXU19FUlJfVU5FWFBFQ1RFRF9SU1ZfMl8zJ1xuICAgICAgKTtcblxuICAgICAgY2IoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXByZXNzZWQgPSAoYnVmWzBdICYgMHg0MCkgPT09IDB4NDA7XG5cbiAgICBpZiAoY29tcHJlc3NlZCAmJiAhdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAnUlNWMSBtdXN0IGJlIGNsZWFyJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgMTAwMixcbiAgICAgICAgJ1dTX0VSUl9VTkVYUEVDVEVEX1JTVl8xJ1xuICAgICAgKTtcblxuICAgICAgY2IoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpbiA9IChidWZbMF0gJiAweDgwKSA9PT0gMHg4MDtcbiAgICB0aGlzLl9vcGNvZGUgPSBidWZbMF0gJiAweDBmO1xuICAgIHRoaXMuX3BheWxvYWRMZW5ndGggPSBidWZbMV0gJiAweDdmO1xuXG4gICAgaWYgKHRoaXMuX29wY29kZSA9PT0gMHgwMCkge1xuICAgICAgaWYgKGNvbXByZXNzZWQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ1JTVjEgbXVzdCBiZSBjbGVhcicsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfVU5FWFBFQ1RFRF9SU1ZfMSdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9mcmFnbWVudGVkKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgICdpbnZhbGlkIG9wY29kZSAwJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIDEwMDIsXG4gICAgICAgICAgJ1dTX0VSUl9JTlZBTElEX09QQ09ERSdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb3Bjb2RlID0gdGhpcy5fZnJhZ21lbnRlZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wY29kZSA9PT0gMHgwMSB8fCB0aGlzLl9vcGNvZGUgPT09IDB4MDIpIHtcbiAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgIGBpbnZhbGlkIG9wY29kZSAke3RoaXMuX29wY29kZX1gLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgMTAwMixcbiAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfT1BDT0RFJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wcmVzc2VkID0gY29tcHJlc3NlZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wY29kZSA+IDB4MDcgJiYgdGhpcy5fb3Bjb2RlIDwgMHgwYikge1xuICAgICAgaWYgKCF0aGlzLl9maW4pIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ0ZJTiBtdXN0IGJlIHNldCcsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfRVhQRUNURURfRklOJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29tcHJlc3NlZCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICAnUlNWMSBtdXN0IGJlIGNsZWFyJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIDEwMDIsXG4gICAgICAgICAgJ1dTX0VSUl9VTkVYUEVDVEVEX1JTVl8xJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX3BheWxvYWRMZW5ndGggPiAweDdkIHx8XG4gICAgICAgICh0aGlzLl9vcGNvZGUgPT09IDB4MDggJiYgdGhpcy5fcGF5bG9hZExlbmd0aCA9PT0gMSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICBgaW52YWxpZCBwYXlsb2FkIGxlbmd0aCAke3RoaXMuX3BheWxvYWRMZW5ndGh9YCxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIDEwMDIsXG4gICAgICAgICAgJ1dTX0VSUl9JTlZBTElEX0NPTlRST0xfUEFZTE9BRF9MRU5HVEgnXG4gICAgICAgICk7XG5cbiAgICAgICAgY2IoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgYGludmFsaWQgb3Bjb2RlICR7dGhpcy5fb3Bjb2RlfWAsXG4gICAgICAgIHRydWUsXG4gICAgICAgIDEwMDIsXG4gICAgICAgICdXU19FUlJfSU5WQUxJRF9PUENPREUnXG4gICAgICApO1xuXG4gICAgICBjYihlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9maW4gJiYgIXRoaXMuX2ZyYWdtZW50ZWQpIHRoaXMuX2ZyYWdtZW50ZWQgPSB0aGlzLl9vcGNvZGU7XG4gICAgdGhpcy5fbWFza2VkID0gKGJ1ZlsxXSAmIDB4ODApID09PSAweDgwO1xuXG4gICAgaWYgKHRoaXMuX2lzU2VydmVyKSB7XG4gICAgICBpZiAoIXRoaXMuX21hc2tlZCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICAnTUFTSyBtdXN0IGJlIHNldCcsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfRVhQRUNURURfTUFTSydcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX21hc2tlZCkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAnTUFTSyBtdXN0IGJlIGNsZWFyJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgMTAwMixcbiAgICAgICAgJ1dTX0VSUl9VTkVYUEVDVEVEX01BU0snXG4gICAgICApO1xuXG4gICAgICBjYihlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BheWxvYWRMZW5ndGggPT09IDEyNikgdGhpcy5fc3RhdGUgPSBHRVRfUEFZTE9BRF9MRU5HVEhfMTY7XG4gICAgZWxzZSBpZiAodGhpcy5fcGF5bG9hZExlbmd0aCA9PT0gMTI3KSB0aGlzLl9zdGF0ZSA9IEdFVF9QQVlMT0FEX0xFTkdUSF82NDtcbiAgICBlbHNlIHRoaXMuaGF2ZUxlbmd0aChjYik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBleHRlbmRlZCBwYXlsb2FkIGxlbmd0aCAoNysxNikuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRQYXlsb2FkTGVuZ3RoMTYoY2IpIHtcbiAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IDIpIHtcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXlsb2FkTGVuZ3RoID0gdGhpcy5jb25zdW1lKDIpLnJlYWRVSW50MTZCRSgwKTtcbiAgICB0aGlzLmhhdmVMZW5ndGgoY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGggKDcrNjQpLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0UGF5bG9hZExlbmd0aDY0KGNiKSB7XG4gICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCA4KSB7XG4gICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVmID0gdGhpcy5jb25zdW1lKDgpO1xuICAgIGNvbnN0IG51bSA9IGJ1Zi5yZWFkVUludDMyQkUoMCk7XG5cbiAgICAvL1xuICAgIC8vIFRoZSBtYXhpbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0IGlzIDJeNTMgLSAxLiBBbiBlcnJvciBpcyByZXR1cm5lZFxuICAgIC8vIGlmIHBheWxvYWQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIG51bWJlci5cbiAgICAvL1xuICAgIGlmIChudW0gPiBNYXRoLnBvdygyLCA1MyAtIDMyKSAtIDEpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgJ1Vuc3VwcG9ydGVkIFdlYlNvY2tldCBmcmFtZTogcGF5bG9hZCBsZW5ndGggPiAyXjUzIC0gMScsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAxMDA5LFxuICAgICAgICAnV1NfRVJSX1VOU1VQUE9SVEVEX0RBVEFfUEFZTE9BRF9MRU5HVEgnXG4gICAgICApO1xuXG4gICAgICBjYihlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcGF5bG9hZExlbmd0aCA9IG51bSAqIE1hdGgucG93KDIsIDMyKSArIGJ1Zi5yZWFkVUludDMyQkUoNCk7XG4gICAgdGhpcy5oYXZlTGVuZ3RoKGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXlsb2FkIGxlbmd0aCBoYXMgYmVlbiByZWFkLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGF2ZUxlbmd0aChjYikge1xuICAgIGlmICh0aGlzLl9wYXlsb2FkTGVuZ3RoICYmIHRoaXMuX29wY29kZSA8IDB4MDgpIHtcbiAgICAgIHRoaXMuX3RvdGFsUGF5bG9hZExlbmd0aCArPSB0aGlzLl9wYXlsb2FkTGVuZ3RoO1xuICAgICAgaWYgKHRoaXMuX3RvdGFsUGF5bG9hZExlbmd0aCA+IHRoaXMuX21heFBheWxvYWQgJiYgdGhpcy5fbWF4UGF5bG9hZCA+IDApIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ01heCBwYXlsb2FkIHNpemUgZXhjZWVkZWQnLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIDEwMDksXG4gICAgICAgICAgJ1dTX0VSUl9VTlNVUFBPUlRFRF9NRVNTQUdFX0xFTkdUSCdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWFza2VkKSB0aGlzLl9zdGF0ZSA9IEdFVF9NQVNLO1xuICAgIGVsc2UgdGhpcy5fc3RhdGUgPSBHRVRfREFUQTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBtYXNrIGJ5dGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0TWFzaygpIHtcbiAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IDQpIHtcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXNrID0gdGhpcy5jb25zdW1lKDQpO1xuICAgIHRoaXMuX3N0YXRlID0gR0VUX0RBVEE7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgZGF0YSBieXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldERhdGEoY2IpIHtcbiAgICBsZXQgZGF0YSA9IEVNUFRZX0JVRkZFUjtcblxuICAgIGlmICh0aGlzLl9wYXlsb2FkTGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IHRoaXMuX3BheWxvYWRMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRhdGEgPSB0aGlzLmNvbnN1bWUodGhpcy5fcGF5bG9hZExlbmd0aCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fbWFza2VkICYmXG4gICAgICAgICh0aGlzLl9tYXNrWzBdIHwgdGhpcy5fbWFza1sxXSB8IHRoaXMuX21hc2tbMl0gfCB0aGlzLl9tYXNrWzNdKSAhPT0gMFxuICAgICAgKSB7XG4gICAgICAgIHVubWFzayhkYXRhLCB0aGlzLl9tYXNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb3Bjb2RlID4gMHgwNykge1xuICAgICAgdGhpcy5jb250cm9sTWVzc2FnZShkYXRhLCBjYik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbXByZXNzZWQpIHtcbiAgICAgIHRoaXMuX3N0YXRlID0gSU5GTEFUSU5HO1xuICAgICAgdGhpcy5kZWNvbXByZXNzKGRhdGEsIGNiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5sZW5ndGgpIHtcbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIG1lc3NhZ2UgaXMgbm90IGNvbXByZXNzZWQgc28gaXRzIGxlbmd0aCBpcyB0aGUgc3VtIG9mIHRoZSBwYXlsb2FkXG4gICAgICAvLyBsZW5ndGggb2YgYWxsIGZyYWdtZW50cy5cbiAgICAgIC8vXG4gICAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoO1xuICAgICAgdGhpcy5fZnJhZ21lbnRzLnB1c2goZGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhTWVzc2FnZShjYik7XG4gIH1cblxuICAvKipcbiAgICogRGVjb21wcmVzc2VzIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIENvbXByZXNzZWQgZGF0YVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjb21wcmVzcyhkYXRhLCBjYikge1xuICAgIGNvbnN0IHBlck1lc3NhZ2VEZWZsYXRlID0gdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXTtcblxuICAgIHBlck1lc3NhZ2VEZWZsYXRlLmRlY29tcHJlc3MoZGF0YSwgdGhpcy5fZmluLCAoZXJyLCBidWYpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuXG4gICAgICBpZiAoYnVmLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoICs9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLl9tZXNzYWdlTGVuZ3RoID4gdGhpcy5fbWF4UGF5bG9hZCAmJiB0aGlzLl9tYXhQYXlsb2FkID4gMCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgICAnTWF4IHBheWxvYWQgc2l6ZSBleGNlZWRlZCcsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIDEwMDksXG4gICAgICAgICAgICAnV1NfRVJSX1VOU1VQUE9SVEVEX01FU1NBR0VfTEVOR1RIJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjYihlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZnJhZ21lbnRzLnB1c2goYnVmKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXRhTWVzc2FnZShjYik7XG4gICAgICBpZiAodGhpcy5fc3RhdGUgPT09IEdFVF9JTkZPKSB0aGlzLnN0YXJ0TG9vcChjYik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGRhdGEgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRhdGFNZXNzYWdlKGNiKSB7XG4gICAgaWYgKCF0aGlzLl9maW4pIHtcbiAgICAgIHRoaXMuX3N0YXRlID0gR0VUX0lORk87XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZUxlbmd0aCA9IHRoaXMuX21lc3NhZ2VMZW5ndGg7XG4gICAgY29uc3QgZnJhZ21lbnRzID0gdGhpcy5fZnJhZ21lbnRzO1xuXG4gICAgdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9mcmFnbWVudGVkID0gMDtcbiAgICB0aGlzLl9mcmFnbWVudHMgPSBbXTtcblxuICAgIGlmICh0aGlzLl9vcGNvZGUgPT09IDIpIHtcbiAgICAgIGxldCBkYXRhO1xuXG4gICAgICBpZiAodGhpcy5fYmluYXJ5VHlwZSA9PT0gJ25vZGVidWZmZXInKSB7XG4gICAgICAgIGRhdGEgPSBjb25jYXQoZnJhZ21lbnRzLCBtZXNzYWdlTGVuZ3RoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYmluYXJ5VHlwZSA9PT0gJ2FycmF5YnVmZmVyJykge1xuICAgICAgICBkYXRhID0gdG9BcnJheUJ1ZmZlcihjb25jYXQoZnJhZ21lbnRzLCBtZXNzYWdlTGVuZ3RoKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JpbmFyeVR5cGUgPT09ICdibG9iJykge1xuICAgICAgICBkYXRhID0gbmV3IEJsb2IoZnJhZ21lbnRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEgPSBmcmFnbWVudHM7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9hbGxvd1N5bmNocm9ub3VzRXZlbnRzKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIGRhdGEsIHRydWUpO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBERUZFUl9FVkVOVDtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBkYXRhLCB0cnVlKTtcbiAgICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xuICAgICAgICAgIHRoaXMuc3RhcnRMb29wKGNiKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IGNvbmNhdChmcmFnbWVudHMsIG1lc3NhZ2VMZW5ndGgpO1xuXG4gICAgICBpZiAoIXRoaXMuX3NraXBVVEY4VmFsaWRhdGlvbiAmJiAhaXNWYWxpZFVURjgoYnVmKSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgRXJyb3IsXG4gICAgICAgICAgJ2ludmFsaWQgVVRGLTggc2VxdWVuY2UnLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgMTAwNyxcbiAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfVVRGOCdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBJTkZMQVRJTkcgfHwgdGhpcy5fYWxsb3dTeW5jaHJvbm91c0V2ZW50cykge1xuICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBidWYsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gREVGRVJfRVZFTlQ7XG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdtZXNzYWdlJywgYnVmLCBmYWxzZSk7XG4gICAgICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgICAgICAgICB0aGlzLnN0YXJ0TG9vcChjYik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgY29udHJvbCBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBEYXRhIHRvIGhhbmRsZVxuICAgKiBAcmV0dXJuIHsoRXJyb3J8UmFuZ2VFcnJvcnx1bmRlZmluZWQpfSBBIHBvc3NpYmxlIGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb250cm9sTWVzc2FnZShkYXRhLCBjYikge1xuICAgIGlmICh0aGlzLl9vcGNvZGUgPT09IDB4MDgpIHtcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdCgnY29uY2x1ZGUnLCAxMDA1LCBFTVBUWV9CVUZGRVIpO1xuICAgICAgICB0aGlzLmVuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGRhdGEucmVhZFVJbnQxNkJFKDApO1xuXG4gICAgICAgIGlmICghaXNWYWxpZFN0YXR1c0NvZGUoY29kZSkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgICAgYGludmFsaWQgc3RhdHVzIGNvZGUgJHtjb2RlfWAsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgMTAwMixcbiAgICAgICAgICAgICdXU19FUlJfSU5WQUxJRF9DTE9TRV9DT0RFJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjYihlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVmID0gbmV3IEZhc3RCdWZmZXIoXG4gICAgICAgICAgZGF0YS5idWZmZXIsXG4gICAgICAgICAgZGF0YS5ieXRlT2Zmc2V0ICsgMixcbiAgICAgICAgICBkYXRhLmxlbmd0aCAtIDJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXRoaXMuX3NraXBVVEY4VmFsaWRhdGlvbiAmJiAhaXNWYWxpZFVURjgoYnVmKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICAgIEVycm9yLFxuICAgICAgICAgICAgJ2ludmFsaWQgVVRGLTggc2VxdWVuY2UnLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIDEwMDcsXG4gICAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfVVRGOCdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY2IoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbWl0KCdjb25jbHVkZScsIGNvZGUsIGJ1Zik7XG4gICAgICAgIHRoaXMuZW5kKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3N0YXRlID0gR0VUX0lORk87XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FsbG93U3luY2hyb25vdXNFdmVudHMpIHtcbiAgICAgIHRoaXMuZW1pdCh0aGlzLl9vcGNvZGUgPT09IDB4MDkgPyAncGluZycgOiAncG9uZycsIGRhdGEpO1xuICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3RhdGUgPSBERUZFUl9FVkVOVDtcbiAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLl9vcGNvZGUgPT09IDB4MDkgPyAncGluZycgOiAncG9uZycsIGRhdGEpO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xuICAgICAgICB0aGlzLnN0YXJ0TG9vcChjYik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuIGVycm9yIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6RXJyb3J8UmFuZ2VFcnJvcil9IEVycm9yQ3RvciBUaGUgZXJyb3IgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtCb29sZWFufSBwcmVmaXggU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGFkZCBhIGRlZmF1bHQgcHJlZml4IHRvXG4gICAqICAgICBgbWVzc2FnZWBcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgVGhlIHN0YXR1cyBjb2RlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBlcnJvckNvZGUgVGhlIGV4cG9zZWQgZXJyb3IgY29kZVxuICAgKiBAcmV0dXJuIHsoRXJyb3J8UmFuZ2VFcnJvcil9IFRoZSBlcnJvclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlRXJyb3IoRXJyb3JDdG9yLCBtZXNzYWdlLCBwcmVmaXgsIHN0YXR1c0NvZGUsIGVycm9yQ29kZSkge1xuICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICB0aGlzLl9lcnJvcmVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvckN0b3IoXG4gICAgICBwcmVmaXggPyBgSW52YWxpZCBXZWJTb2NrZXQgZnJhbWU6ICR7bWVzc2FnZX1gIDogbWVzc2FnZVxuICAgICk7XG5cbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIHRoaXMuY3JlYXRlRXJyb3IpO1xuICAgIGVyci5jb2RlID0gZXJyb3JDb2RlO1xuICAgIGVycltrU3RhdHVzQ29kZV0gPSBzdGF0dXNDb2RlO1xuICAgIHJldHVybiBlcnI7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWNlaXZlcjtcbiIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXkR1cGxleFwiIH1dICovXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBEdXBsZXggfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuY29uc3QgeyByYW5kb21GaWxsU3luYyB9ID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlID0gcmVxdWlyZSgnLi9wZXJtZXNzYWdlLWRlZmxhdGUnKTtcbmNvbnN0IHsgRU1QVFlfQlVGRkVSLCBrV2ViU29ja2V0LCBOT09QIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuY29uc3QgeyBpc0Jsb2IsIGlzVmFsaWRTdGF0dXNDb2RlIH0gPSByZXF1aXJlKCcuL3ZhbGlkYXRpb24nKTtcbmNvbnN0IHsgbWFzazogYXBwbHlNYXNrLCB0b0J1ZmZlciB9ID0gcmVxdWlyZSgnLi9idWZmZXItdXRpbCcpO1xuXG5jb25zdCBrQnl0ZUxlbmd0aCA9IFN5bWJvbCgna0J5dGVMZW5ndGgnKTtcbmNvbnN0IG1hc2tCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNCk7XG5jb25zdCBSQU5ET01fUE9PTF9TSVpFID0gOCAqIDEwMjQ7XG5sZXQgcmFuZG9tUG9vbDtcbmxldCByYW5kb21Qb29sUG9pbnRlciA9IFJBTkRPTV9QT09MX1NJWkU7XG5cbmNvbnN0IERFRkFVTFQgPSAwO1xuY29uc3QgREVGTEFUSU5HID0gMTtcbmNvbnN0IEdFVF9CTE9CX0RBVEEgPSAyO1xuXG4vKipcbiAqIEh5QmkgU2VuZGVyIGltcGxlbWVudGF0aW9uLlxuICovXG5jbGFzcyBTZW5kZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIFNlbmRlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgY29ubmVjdGlvbiBzb2NrZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtleHRlbnNpb25zXSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbmVnb3RpYXRlZCBleHRlbnNpb25zXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtnZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBtYXNraW5nXG4gICAqICAgICBrZXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNvY2tldCwgZXh0ZW5zaW9ucywgZ2VuZXJhdGVNYXNrKSB7XG4gICAgdGhpcy5fZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgfHwge307XG5cbiAgICBpZiAoZ2VuZXJhdGVNYXNrKSB7XG4gICAgICB0aGlzLl9nZW5lcmF0ZU1hc2sgPSBnZW5lcmF0ZU1hc2s7XG4gICAgICB0aGlzLl9tYXNrQnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIH1cblxuICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcblxuICAgIHRoaXMuX2ZpcnN0RnJhZ21lbnQgPSB0cnVlO1xuICAgIHRoaXMuX2NvbXByZXNzID0gZmFsc2U7XG5cbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzID0gMDtcbiAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIHRoaXMuX3N0YXRlID0gREVGQVVMVDtcbiAgICB0aGlzLm9uZXJyb3IgPSBOT09QO1xuICAgIHRoaXNba1dlYlNvY2tldF0gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRnJhbWVzIGEgcGllY2Ugb2YgZGF0YSBhY2NvcmRpbmcgdG8gdGhlIEh5QmkgV2ViU29ja2V0IHByb3RvY29sLlxuICAgKlxuICAgKiBAcGFyYW0geyhCdWZmZXJ8U3RyaW5nKX0gZGF0YSBUaGUgZGF0YSB0byBmcmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZpbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNldCB0aGVcbiAgICogICAgIEZJTiBiaXRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZ2VuZXJhdGVNYXNrXSBUaGUgZnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSB0aGVcbiAgICogICAgIG1hc2tpbmcga2V5XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWFzaz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2tcbiAgICogICAgIGBkYXRhYFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gW29wdGlvbnMubWFza0J1ZmZlcl0gVGhlIGJ1ZmZlciB1c2VkIHRvIHN0b3JlIHRoZSBtYXNraW5nXG4gICAqICAgICBrZXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMub3Bjb2RlIFRoZSBvcGNvZGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZWFkT25seT1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgYGRhdGFgIGNhbiBiZVxuICAgKiAgICAgbW9kaWZpZWRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yc3YxPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gc2V0IHRoZVxuICAgKiAgICAgUlNWMSBiaXRcbiAgICogQHJldHVybiB7KEJ1ZmZlcnxTdHJpbmcpW119IFRoZSBmcmFtZWQgZGF0YVxuICAgKiBAcHVibGljXG4gICAqL1xuICBzdGF0aWMgZnJhbWUoZGF0YSwgb3B0aW9ucykge1xuICAgIGxldCBtYXNrO1xuICAgIGxldCBtZXJnZSA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSAyO1xuICAgIGxldCBza2lwTWFza2luZyA9IGZhbHNlO1xuXG4gICAgaWYgKG9wdGlvbnMubWFzaykge1xuICAgICAgbWFzayA9IG9wdGlvbnMubWFza0J1ZmZlciB8fCBtYXNrQnVmZmVyO1xuXG4gICAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZU1hc2spIHtcbiAgICAgICAgb3B0aW9ucy5nZW5lcmF0ZU1hc2sobWFzayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmFuZG9tUG9vbFBvaW50ZXIgPT09IFJBTkRPTV9QT09MX1NJWkUpIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAgKi9cbiAgICAgICAgICBpZiAocmFuZG9tUG9vbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgYmVjYXVzZSBzZXJ2ZXItc2VudCBmcmFtZXMgbXVzdCBub3RcbiAgICAgICAgICAgIC8vIGJlIG1hc2tlZCBzbyBpdCBtYXkgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByYW5kb21Qb29sID0gQnVmZmVyLmFsbG9jKFJBTkRPTV9QT09MX1NJWkUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJhbmRvbUZpbGxTeW5jKHJhbmRvbVBvb2wsIDAsIFJBTkRPTV9QT09MX1NJWkUpO1xuICAgICAgICAgIHJhbmRvbVBvb2xQb2ludGVyID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hc2tbMF0gPSByYW5kb21Qb29sW3JhbmRvbVBvb2xQb2ludGVyKytdO1xuICAgICAgICBtYXNrWzFdID0gcmFuZG9tUG9vbFtyYW5kb21Qb29sUG9pbnRlcisrXTtcbiAgICAgICAgbWFza1syXSA9IHJhbmRvbVBvb2xbcmFuZG9tUG9vbFBvaW50ZXIrK107XG4gICAgICAgIG1hc2tbM10gPSByYW5kb21Qb29sW3JhbmRvbVBvb2xQb2ludGVyKytdO1xuICAgICAgfVxuXG4gICAgICBza2lwTWFza2luZyA9IChtYXNrWzBdIHwgbWFza1sxXSB8IG1hc2tbMl0gfCBtYXNrWzNdKSA9PT0gMDtcbiAgICAgIG9mZnNldCA9IDY7XG4gICAgfVxuXG4gICAgbGV0IGRhdGFMZW5ndGg7XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoXG4gICAgICAgICghb3B0aW9ucy5tYXNrIHx8IHNraXBNYXNraW5nKSAmJlxuICAgICAgICBvcHRpb25zW2tCeXRlTGVuZ3RoXSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgZGF0YUxlbmd0aCA9IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEpO1xuICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgIG1lcmdlID0gb3B0aW9ucy5tYXNrICYmIG9wdGlvbnMucmVhZE9ubHkgJiYgIXNraXBNYXNraW5nO1xuICAgIH1cblxuICAgIGxldCBwYXlsb2FkTGVuZ3RoID0gZGF0YUxlbmd0aDtcblxuICAgIGlmIChkYXRhTGVuZ3RoID49IDY1NTM2KSB7XG4gICAgICBvZmZzZXQgKz0gODtcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjc7XG4gICAgfSBlbHNlIGlmIChkYXRhTGVuZ3RoID4gMTI1KSB7XG4gICAgICBvZmZzZXQgKz0gMjtcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjY7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG1lcmdlID8gZGF0YUxlbmd0aCArIG9mZnNldCA6IG9mZnNldCk7XG5cbiAgICB0YXJnZXRbMF0gPSBvcHRpb25zLmZpbiA/IG9wdGlvbnMub3Bjb2RlIHwgMHg4MCA6IG9wdGlvbnMub3Bjb2RlO1xuICAgIGlmIChvcHRpb25zLnJzdjEpIHRhcmdldFswXSB8PSAweDQwO1xuXG4gICAgdGFyZ2V0WzFdID0gcGF5bG9hZExlbmd0aDtcblxuICAgIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjYpIHtcbiAgICAgIHRhcmdldC53cml0ZVVJbnQxNkJFKGRhdGFMZW5ndGgsIDIpO1xuICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI3KSB7XG4gICAgICB0YXJnZXRbMl0gPSB0YXJnZXRbM10gPSAwO1xuICAgICAgdGFyZ2V0LndyaXRlVUludEJFKGRhdGFMZW5ndGgsIDQsIDYpO1xuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5tYXNrKSByZXR1cm4gW3RhcmdldCwgZGF0YV07XG5cbiAgICB0YXJnZXRbMV0gfD0gMHg4MDtcbiAgICB0YXJnZXRbb2Zmc2V0IC0gNF0gPSBtYXNrWzBdO1xuICAgIHRhcmdldFtvZmZzZXQgLSAzXSA9IG1hc2tbMV07XG4gICAgdGFyZ2V0W29mZnNldCAtIDJdID0gbWFza1syXTtcbiAgICB0YXJnZXRbb2Zmc2V0IC0gMV0gPSBtYXNrWzNdO1xuXG4gICAgaWYgKHNraXBNYXNraW5nKSByZXR1cm4gW3RhcmdldCwgZGF0YV07XG5cbiAgICBpZiAobWVyZ2UpIHtcbiAgICAgIGFwcGx5TWFzayhkYXRhLCBtYXNrLCB0YXJnZXQsIG9mZnNldCwgZGF0YUxlbmd0aCk7XG4gICAgICByZXR1cm4gW3RhcmdldF07XG4gICAgfVxuXG4gICAgYXBwbHlNYXNrKGRhdGEsIG1hc2ssIGRhdGEsIDAsIGRhdGFMZW5ndGgpO1xuICAgIHJldHVybiBbdGFyZ2V0LCBkYXRhXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNsb3NlIG1lc3NhZ2UgdG8gdGhlIG90aGVyIHBlZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbY29kZV0gVGhlIHN0YXR1cyBjb2RlIGNvbXBvbmVudCBvZiB0aGUgYm9keVxuICAgKiBAcGFyYW0geyhTdHJpbmd8QnVmZmVyKX0gW2RhdGFdIFRoZSBtZXNzYWdlIGNvbXBvbmVudCBvZiB0aGUgYm9keVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayB0aGUgbWVzc2FnZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNsb3NlKGNvZGUsIGRhdGEsIG1hc2ssIGNiKSB7XG4gICAgbGV0IGJ1ZjtcblxuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJ1ZiA9IEVNUFRZX0JVRkZFUjtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2RlICE9PSAnbnVtYmVyJyB8fCAhaXNWYWxpZFN0YXR1c0NvZGUoY29kZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSB2YWxpZCBlcnJvciBjb2RlIG51bWJlcicpO1xuICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkIHx8ICFkYXRhLmxlbmd0aCkge1xuICAgICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIpO1xuICAgICAgYnVmLndyaXRlVUludDE2QkUoY29kZSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpO1xuXG4gICAgICBpZiAobGVuZ3RoID4gMTIzKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgbWVzc2FnZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gMTIzIGJ5dGVzJyk7XG4gICAgICB9XG5cbiAgICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyICsgbGVuZ3RoKTtcbiAgICAgIGJ1Zi53cml0ZVVJbnQxNkJFKGNvZGUsIDApO1xuXG4gICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGJ1Zi53cml0ZShkYXRhLCAyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1Zi5zZXQoZGF0YSwgMik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIFtrQnl0ZUxlbmd0aF06IGJ1Zi5sZW5ndGgsXG4gICAgICBmaW46IHRydWUsXG4gICAgICBnZW5lcmF0ZU1hc2s6IHRoaXMuX2dlbmVyYXRlTWFzayxcbiAgICAgIG1hc2ssXG4gICAgICBtYXNrQnVmZmVyOiB0aGlzLl9tYXNrQnVmZmVyLFxuICAgICAgb3Bjb2RlOiAweDA4LFxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgcnN2MTogZmFsc2VcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XG4gICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGJ1ZiwgZmFsc2UsIG9wdGlvbnMsIGNiXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShidWYsIG9wdGlvbnMpLCBjYik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgcGluZyBtZXNzYWdlIHRvIHRoZSBvdGhlciBwZWVyLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1lc3NhZ2UgdG8gc2VuZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBwaW5nKGRhdGEsIG1hc2ssIGNiKSB7XG4gICAgbGV0IGJ5dGVMZW5ndGg7XG4gICAgbGV0IHJlYWRPbmx5O1xuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgYnl0ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpO1xuICAgICAgcmVhZE9ubHkgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGlzQmxvYihkYXRhKSkge1xuICAgICAgYnl0ZUxlbmd0aCA9IGRhdGEuc2l6ZTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSB0b0J1ZmZlcihkYXRhKTtcbiAgICAgIGJ5dGVMZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgIHJlYWRPbmx5ID0gdG9CdWZmZXIucmVhZE9ubHk7XG4gICAgfVxuXG4gICAgaWYgKGJ5dGVMZW5ndGggPiAxMjUpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgZGF0YSBzaXplIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiAxMjUgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgW2tCeXRlTGVuZ3RoXTogYnl0ZUxlbmd0aCxcbiAgICAgIGZpbjogdHJ1ZSxcbiAgICAgIGdlbmVyYXRlTWFzazogdGhpcy5fZ2VuZXJhdGVNYXNrLFxuICAgICAgbWFzayxcbiAgICAgIG1hc2tCdWZmZXI6IHRoaXMuX21hc2tCdWZmZXIsXG4gICAgICBvcGNvZGU6IDB4MDksXG4gICAgICByZWFkT25seSxcbiAgICAgIHJzdjE6IGZhbHNlXG4gICAgfTtcblxuICAgIGlmIChpc0Jsb2IoZGF0YSkpIHtcbiAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gREVGQVVMVCkge1xuICAgICAgICB0aGlzLmVucXVldWUoW3RoaXMuZ2V0QmxvYkRhdGEsIGRhdGEsIGZhbHNlLCBvcHRpb25zLCBjYl0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZXRCbG9iRGF0YShkYXRhLCBmYWxzZSwgb3B0aW9ucywgY2IpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5fc3RhdGUgIT09IERFRkFVTFQpIHtcbiAgICAgIHRoaXMuZW5xdWV1ZShbdGhpcy5kaXNwYXRjaCwgZGF0YSwgZmFsc2UsIG9wdGlvbnMsIGNiXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShkYXRhLCBvcHRpb25zKSwgY2IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIHBvbmcgbWVzc2FnZSB0byB0aGUgb3RoZXIgcGVlci5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXNzYWdlIHRvIHNlbmRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbbWFzaz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2sgYGRhdGFgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcG9uZyhkYXRhLCBtYXNrLCBjYikge1xuICAgIGxldCBieXRlTGVuZ3RoO1xuICAgIGxldCByZWFkT25seTtcblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc0Jsb2IoZGF0YSkpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBkYXRhLnNpemU7XG4gICAgICByZWFkT25seSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gdG9CdWZmZXIoZGF0YSk7XG4gICAgICBieXRlTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICByZWFkT25seSA9IHRvQnVmZmVyLnJlYWRPbmx5O1xuICAgIH1cblxuICAgIGlmIChieXRlTGVuZ3RoID4gMTI1KSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIGRhdGEgc2l6ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gMTI1IGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIFtrQnl0ZUxlbmd0aF06IGJ5dGVMZW5ndGgsXG4gICAgICBmaW46IHRydWUsXG4gICAgICBnZW5lcmF0ZU1hc2s6IHRoaXMuX2dlbmVyYXRlTWFzayxcbiAgICAgIG1hc2ssXG4gICAgICBtYXNrQnVmZmVyOiB0aGlzLl9tYXNrQnVmZmVyLFxuICAgICAgb3Bjb2RlOiAweDBhLFxuICAgICAgcmVhZE9ubHksXG4gICAgICByc3YxOiBmYWxzZVxuICAgIH07XG5cbiAgICBpZiAoaXNCbG9iKGRhdGEpKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUgIT09IERFRkFVTFQpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlKFt0aGlzLmdldEJsb2JEYXRhLCBkYXRhLCBmYWxzZSwgb3B0aW9ucywgY2JdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0QmxvYkRhdGEoZGF0YSwgZmFsc2UsIG9wdGlvbnMsIGNiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XG4gICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGRhdGEsIGZhbHNlLCBvcHRpb25zLCBjYl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbmRGcmFtZShTZW5kZXIuZnJhbWUoZGF0YSwgb3B0aW9ucyksIGNiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBkYXRhIG1lc3NhZ2UgdG8gdGhlIG90aGVyIHBlZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWVzc2FnZSB0byBzZW5kXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYmluYXJ5PWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBgZGF0YWAgaXMgYmluYXJ5XG4gICAqICAgICBvciB0ZXh0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY29tcHJlc3M9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0b1xuICAgKiAgICAgY29tcHJlc3MgYGRhdGFgXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZmluPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciB0aGUgZnJhZ21lbnQgaXMgdGhlXG4gICAqICAgICBsYXN0IG9uZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1hc2s9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBzZW5kKGRhdGEsIG9wdGlvbnMsIGNiKSB7XG4gICAgY29uc3QgcGVyTWVzc2FnZURlZmxhdGUgPSB0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdO1xuICAgIGxldCBvcGNvZGUgPSBvcHRpb25zLmJpbmFyeSA/IDIgOiAxO1xuICAgIGxldCByc3YxID0gb3B0aW9ucy5jb21wcmVzcztcblxuICAgIGxldCBieXRlTGVuZ3RoO1xuICAgIGxldCByZWFkT25seTtcblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc0Jsb2IoZGF0YSkpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBkYXRhLnNpemU7XG4gICAgICByZWFkT25seSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gdG9CdWZmZXIoZGF0YSk7XG4gICAgICBieXRlTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICByZWFkT25seSA9IHRvQnVmZmVyLnJlYWRPbmx5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9maXJzdEZyYWdtZW50KSB7XG4gICAgICB0aGlzLl9maXJzdEZyYWdtZW50ID0gZmFsc2U7XG4gICAgICBpZiAoXG4gICAgICAgIHJzdjEgJiZcbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUgJiZcbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUucGFyYW1zW1xuICAgICAgICAgIHBlck1lc3NhZ2VEZWZsYXRlLl9pc1NlcnZlclxuICAgICAgICAgICAgPyAnc2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXInXG4gICAgICAgICAgICA6ICdjbGllbnRfbm9fY29udGV4dF90YWtlb3ZlcidcbiAgICAgICAgXVxuICAgICAgKSB7XG4gICAgICAgIHJzdjEgPSBieXRlTGVuZ3RoID49IHBlck1lc3NhZ2VEZWZsYXRlLl90aHJlc2hvbGQ7XG4gICAgICB9XG4gICAgICB0aGlzLl9jb21wcmVzcyA9IHJzdjE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJzdjEgPSBmYWxzZTtcbiAgICAgIG9wY29kZSA9IDA7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZmluKSB0aGlzLl9maXJzdEZyYWdtZW50ID0gdHJ1ZTtcblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBba0J5dGVMZW5ndGhdOiBieXRlTGVuZ3RoLFxuICAgICAgZmluOiBvcHRpb25zLmZpbixcbiAgICAgIGdlbmVyYXRlTWFzazogdGhpcy5fZ2VuZXJhdGVNYXNrLFxuICAgICAgbWFzazogb3B0aW9ucy5tYXNrLFxuICAgICAgbWFza0J1ZmZlcjogdGhpcy5fbWFza0J1ZmZlcixcbiAgICAgIG9wY29kZSxcbiAgICAgIHJlYWRPbmx5LFxuICAgICAgcnN2MVxuICAgIH07XG5cbiAgICBpZiAoaXNCbG9iKGRhdGEpKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUgIT09IERFRkFVTFQpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlKFt0aGlzLmdldEJsb2JEYXRhLCBkYXRhLCB0aGlzLl9jb21wcmVzcywgb3B0cywgY2JdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0QmxvYkRhdGEoZGF0YSwgdGhpcy5fY29tcHJlc3MsIG9wdHMsIGNiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XG4gICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGRhdGEsIHRoaXMuX2NvbXByZXNzLCBvcHRzLCBjYl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BhdGNoKGRhdGEsIHRoaXMuX2NvbXByZXNzLCBvcHRzLCBjYik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbnRlbnRzIG9mIGEgYmxvYiBhcyBiaW5hcnkgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtCbG9ifSBibG9iIFRoZSBibG9iXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2NvbXByZXNzPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gY29tcHJlc3NcbiAgICogICAgIHRoZSBkYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZmluPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gc2V0IHRoZVxuICAgKiAgICAgRklOIGJpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5nZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZVxuICAgKiAgICAgbWFza2luZyBrZXlcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFza1xuICAgKiAgICAgYGRhdGFgXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBbb3B0aW9ucy5tYXNrQnVmZmVyXSBUaGUgYnVmZmVyIHVzZWQgdG8gc3RvcmUgdGhlIG1hc2tpbmdcbiAgICogICAgIGtleVxuICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5vcGNvZGUgVGhlIG9wY29kZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJlYWRPbmx5PWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBgZGF0YWAgY2FuIGJlXG4gICAqICAgICBtb2RpZmllZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJzdjE9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBzZXQgdGhlXG4gICAqICAgICBSU1YxIGJpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRCbG9iRGF0YShibG9iLCBjb21wcmVzcywgb3B0aW9ucywgY2IpIHtcbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzICs9IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgIHRoaXMuX3N0YXRlID0gR0VUX0JMT0JfREFUQTtcblxuICAgIGJsb2JcbiAgICAgIC5hcnJheUJ1ZmZlcigpXG4gICAgICAudGhlbigoYXJyYXlCdWZmZXIpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVGhlIHNvY2tldCB3YXMgY2xvc2VkIHdoaWxlIHRoZSBibG9iIHdhcyBiZWluZyByZWFkJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIGBjYWxsQ2FsbGJhY2tzYCBpcyBjYWxsZWQgaW4gdGhlIG5leHQgdGljayB0byBlbnN1cmUgdGhhdCBlcnJvcnNcbiAgICAgICAgICAvLyB0aGF0IG1pZ2h0IGJlIHRocm93biBpbiB0aGUgY2FsbGJhY2tzIGJlaGF2ZSBsaWtlIGVycm9ycyB0aHJvd25cbiAgICAgICAgICAvLyBvdXRzaWRlIHRoZSBwcm9taXNlIGNoYWluLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsQ2FsbGJhY2tzLCB0aGlzLCBlcnIsIGNiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgICAgICBjb25zdCBkYXRhID0gdG9CdWZmZXIoYXJyYXlCdWZmZXIpO1xuXG4gICAgICAgIGlmICghY29tcHJlc3MpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0ZSA9IERFRkFVTFQ7XG4gICAgICAgICAgdGhpcy5zZW5kRnJhbWUoU2VuZGVyLmZyYW1lKGRhdGEsIG9wdGlvbnMpLCBjYik7XG4gICAgICAgICAgdGhpcy5kZXF1ZXVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaChkYXRhLCBjb21wcmVzcywgb3B0aW9ucywgY2IpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gYG9uRXJyb3JgIGlzIGNhbGxlZCBpbiB0aGUgbmV4dCB0aWNrIGZvciB0aGUgc2FtZSByZWFzb24gdGhhdFxuICAgICAgICAvLyBgY2FsbENhbGxiYWNrc2AgYWJvdmUgaXMuXG4gICAgICAgIC8vXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2sob25FcnJvciwgdGhpcywgZXJyLCBjYik7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGEgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHsoQnVmZmVyfFN0cmluZyl9IGRhdGEgVGhlIG1lc3NhZ2UgdG8gc2VuZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtjb21wcmVzcz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGNvbXByZXNzXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5maW49ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBzZXQgdGhlXG4gICAqICAgICBGSU4gYml0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmdlbmVyYXRlTWFza10gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgdGhlXG4gICAqICAgICBtYXNraW5nIGtleVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1hc2s9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtCdWZmZXJ9IFtvcHRpb25zLm1hc2tCdWZmZXJdIFRoZSBidWZmZXIgdXNlZCB0byBzdG9yZSB0aGUgbWFza2luZ1xuICAgKiAgICAga2V5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLm9wY29kZSBUaGUgb3Bjb2RlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmVhZE9ubHk9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIGBkYXRhYCBjYW4gYmVcbiAgICogICAgIG1vZGlmaWVkXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucnN2MT1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNldCB0aGVcbiAgICogICAgIFJTVjEgYml0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRpc3BhdGNoKGRhdGEsIGNvbXByZXNzLCBvcHRpb25zLCBjYikge1xuICAgIGlmICghY29tcHJlc3MpIHtcbiAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShkYXRhLCBvcHRpb25zKSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBlck1lc3NhZ2VEZWZsYXRlID0gdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXTtcblxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gb3B0aW9uc1trQnl0ZUxlbmd0aF07XG4gICAgdGhpcy5fc3RhdGUgPSBERUZMQVRJTkc7XG4gICAgcGVyTWVzc2FnZURlZmxhdGUuY29tcHJlc3MoZGF0YSwgb3B0aW9ucy5maW4sIChfLCBidWYpID0+IHtcbiAgICAgIGlmICh0aGlzLl9zb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAnVGhlIHNvY2tldCB3YXMgY2xvc2VkIHdoaWxlIGRhdGEgd2FzIGJlaW5nIGNvbXByZXNzZWQnXG4gICAgICAgICk7XG5cbiAgICAgICAgY2FsbENhbGxiYWNrcyh0aGlzLCBlcnIsIGNiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgICAgdGhpcy5fc3RhdGUgPSBERUZBVUxUO1xuICAgICAgb3B0aW9ucy5yZWFkT25seSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZW5kRnJhbWUoU2VuZGVyLmZyYW1lKGJ1Ziwgb3B0aW9ucyksIGNiKTtcbiAgICAgIHRoaXMuZGVxdWV1ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHF1ZXVlZCBzZW5kIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZXF1ZXVlKCkge1xuICAgIHdoaWxlICh0aGlzLl9zdGF0ZSA9PT0gREVGQVVMVCAmJiB0aGlzLl9xdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgLT0gcGFyYW1zWzNdW2tCeXRlTGVuZ3RoXTtcbiAgICAgIFJlZmxlY3QuYXBwbHkocGFyYW1zWzBdLCB0aGlzLCBwYXJhbXMuc2xpY2UoMSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIHNlbmQgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMgU2VuZCBvcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVucXVldWUocGFyYW1zKSB7XG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyArPSBwYXJhbXNbM11ba0J5dGVMZW5ndGhdO1xuICAgIHRoaXMuX3F1ZXVlLnB1c2gocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGZyYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcltdfSBsaXN0IFRoZSBmcmFtZSB0byBzZW5kXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbmRGcmFtZShsaXN0LCBjYikge1xuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMikge1xuICAgICAgdGhpcy5fc29ja2V0LmNvcmsoKTtcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzBdKTtcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzFdLCBjYik7XG4gICAgICB0aGlzLl9zb2NrZXQudW5jb3JrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzBdLCBjYik7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2VuZGVyO1xuXG4vKipcbiAqIENhbGxzIHF1ZXVlZCBjYWxsYmFja3Mgd2l0aCBhbiBlcnJvci5cbiAqXG4gKiBAcGFyYW0ge1NlbmRlcn0gc2VuZGVyIFRoZSBgU2VuZGVyYCBpbnN0YW5jZVxuICogQHBhcmFtIHtFcnJvcn0gZXJyIFRoZSBlcnJvciB0byBjYWxsIHRoZSBjYWxsYmFja3Mgd2l0aFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBUaGUgZmlyc3QgY2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGxDYWxsYmFja3Moc2VuZGVyLCBlcnIsIGNiKSB7XG4gIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIGNiKGVycik7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZW5kZXIuX3F1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcGFyYW1zID0gc2VuZGVyLl9xdWV1ZVtpXTtcbiAgICBjb25zdCBjYWxsYmFjayA9IHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjayhlcnIpO1xuICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyBhIGBTZW5kZXJgIGVycm9yLlxuICpcbiAqIEBwYXJhbSB7U2VuZGVyfSBzZW5kZXIgVGhlIGBTZW5kZXJgIGluc3RhbmNlXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnIgVGhlIGVycm9yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIFRoZSBmaXJzdCBwZW5kaW5nIGNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBvbkVycm9yKHNlbmRlciwgZXJyLCBjYikge1xuICBjYWxsQ2FsbGJhY2tzKHNlbmRlciwgZXJyLCBjYik7XG4gIHNlbmRlci5vbmVycm9yKGVycik7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgRHVwbGV4IH0gPSByZXF1aXJlKCdzdHJlYW0nKTtcblxuLyoqXG4gKiBFbWl0cyB0aGUgYCdjbG9zZSdgIGV2ZW50IG9uIGEgc3RyZWFtLlxuICpcbiAqIEBwYXJhbSB7RHVwbGV4fSBzdHJlYW0gVGhlIHN0cmVhbS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGVtaXRDbG9zZShzdHJlYW0pIHtcbiAgc3RyZWFtLmVtaXQoJ2Nsb3NlJyk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgJ2VuZCdgIGV2ZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGR1cGxleE9uRW5kKCkge1xuICBpZiAoIXRoaXMuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQpIHtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyciBUaGUgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGR1cGxleE9uRXJyb3IoZXJyKSB7XG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZHVwbGV4T25FcnJvcik7XG4gIHRoaXMuZGVzdHJveSgpO1xuICBpZiAodGhpcy5saXN0ZW5lckNvdW50KCdlcnJvcicpID09PSAwKSB7XG4gICAgLy8gRG8gbm90IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvci5cbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXBzIGEgYFdlYlNvY2tldGAgaW4gYSBkdXBsZXggc3RyZWFtLlxuICpcbiAqIEBwYXJhbSB7V2ViU29ja2V0fSB3cyBUaGUgYFdlYlNvY2tldGAgdG8gd3JhcFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBmb3IgdGhlIGBEdXBsZXhgIGNvbnN0cnVjdG9yXG4gKiBAcmV0dXJuIHtEdXBsZXh9IFRoZSBkdXBsZXggc3RyZWFtXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFN0cmVhbSh3cywgb3B0aW9ucykge1xuICBsZXQgdGVybWluYXRlT25EZXN0cm95ID0gdHJ1ZTtcblxuICBjb25zdCBkdXBsZXggPSBuZXcgRHVwbGV4KHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGF1dG9EZXN0cm95OiBmYWxzZSxcbiAgICBlbWl0Q2xvc2U6IGZhbHNlLFxuICAgIG9iamVjdE1vZGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlT2JqZWN0TW9kZTogZmFsc2VcbiAgfSk7XG5cbiAgd3Mub24oJ21lc3NhZ2UnLCBmdW5jdGlvbiBtZXNzYWdlKG1zZywgaXNCaW5hcnkpIHtcbiAgICBjb25zdCBkYXRhID1cbiAgICAgICFpc0JpbmFyeSAmJiBkdXBsZXguX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZSA/IG1zZy50b1N0cmluZygpIDogbXNnO1xuXG4gICAgaWYgKCFkdXBsZXgucHVzaChkYXRhKSkgd3MucGF1c2UoKTtcbiAgfSk7XG5cbiAgd3Mub25jZSgnZXJyb3InLCBmdW5jdGlvbiBlcnJvcihlcnIpIHtcbiAgICBpZiAoZHVwbGV4LmRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgLy8gUHJldmVudCBgd3MudGVybWluYXRlKClgIGZyb20gYmVpbmcgY2FsbGVkIGJ5IGBkdXBsZXguX2Rlc3Ryb3koKWAuXG4gICAgLy9cbiAgICAvLyAtIElmIHRoZSBgJ2Vycm9yJ2AgZXZlbnQgaXMgZW1pdHRlZCBiZWZvcmUgdGhlIGAnb3BlbidgIGV2ZW50LCB0aGVuXG4gICAgLy8gICBgd3MudGVybWluYXRlKClgIGlzIGEgbm9vcCBhcyBubyBzb2NrZXQgaXMgYXNzaWduZWQuXG4gICAgLy8gLSBPdGhlcndpc2UsIHRoZSBlcnJvciBpcyByZS1lbWl0dGVkIGJ5IHRoZSBsaXN0ZW5lciBvZiB0aGUgYCdlcnJvcidgXG4gICAgLy8gICBldmVudCBvZiB0aGUgYFJlY2VpdmVyYCBvYmplY3QuIFRoZSBsaXN0ZW5lciBhbHJlYWR5IGNsb3NlcyB0aGVcbiAgICAvLyAgIGNvbm5lY3Rpb24gYnkgY2FsbGluZyBgd3MuY2xvc2UoKWAuIFRoaXMgYWxsb3dzIGEgY2xvc2UgZnJhbWUgdG8gYmVcbiAgICAvLyAgIHNlbnQgdG8gdGhlIG90aGVyIHBlZXIuIElmIGB3cy50ZXJtaW5hdGUoKWAgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHRoaXMsXG4gICAgLy8gICB0aGVuIHRoZSBjbG9zZSBmcmFtZSBtaWdodCBub3QgYmUgc2VudC5cbiAgICB0ZXJtaW5hdGVPbkRlc3Ryb3kgPSBmYWxzZTtcbiAgICBkdXBsZXguZGVzdHJveShlcnIpO1xuICB9KTtcblxuICB3cy5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIGlmIChkdXBsZXguZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBkdXBsZXgucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgZHVwbGV4Ll9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAod3MucmVhZHlTdGF0ZSA9PT0gd3MuQ0xPU0VEKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIGR1cGxleCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuXG4gICAgd3Mub25jZSgnZXJyb3InLCBmdW5jdGlvbiBlcnJvcihlcnIpIHtcbiAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH0pO1xuXG4gICAgd3Mub25jZSgnY2xvc2UnLCBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIGlmICghY2FsbGVkKSBjYWxsYmFjayhlcnIpO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIGR1cGxleCk7XG4gICAgfSk7XG5cbiAgICBpZiAodGVybWluYXRlT25EZXN0cm95KSB3cy50ZXJtaW5hdGUoKTtcbiAgfTtcblxuICBkdXBsZXguX2ZpbmFsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgaWYgKHdzLnJlYWR5U3RhdGUgPT09IHdzLkNPTk5FQ1RJTkcpIHtcbiAgICAgIHdzLm9uY2UoJ29wZW4nLCBmdW5jdGlvbiBvcGVuKCkge1xuICAgICAgICBkdXBsZXguX2ZpbmFsKGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB2YWx1ZSBvZiB0aGUgYF9zb2NrZXRgIHByb3BlcnR5IGlzIGBudWxsYCBpdCBtZWFucyB0aGF0IGB3c2AgaXMgYVxuICAgIC8vIGNsaWVudCB3ZWJzb2NrZXQgYW5kIHRoZSBoYW5kc2hha2UgZmFpbGVkLiBJbiBmYWN0LCB3aGVuIHRoaXMgaGFwcGVucywgYVxuICAgIC8vIHNvY2tldCBpcyBuZXZlciBhc3NpZ25lZCB0byB0aGUgd2Vic29ja2V0LiBXYWl0IGZvciB0aGUgYCdlcnJvcidgIGV2ZW50XG4gICAgLy8gdGhhdCB3aWxsIGJlIGVtaXR0ZWQgYnkgdGhlIHdlYnNvY2tldC5cbiAgICBpZiAod3MuX3NvY2tldCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgaWYgKHdzLl9zb2NrZXQuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQpIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgICBpZiAoZHVwbGV4Ll9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIGR1cGxleC5kZXN0cm95KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdzLl9zb2NrZXQub25jZSgnZmluaXNoJywgZnVuY3Rpb24gZmluaXNoKCkge1xuICAgICAgICAvLyBgZHVwbGV4YCBpcyBub3QgZGVzdHJveWVkIGhlcmUgYmVjYXVzZSB0aGUgYCdlbmQnYCBldmVudCB3aWxsIGJlXG4gICAgICAgIC8vIGVtaXR0ZWQgb24gYGR1cGxleGAgYWZ0ZXIgdGhpcyBgJ2ZpbmlzaCdgIGV2ZW50LiBUaGUgRU9GIHNpZ25hbGluZ1xuICAgICAgICAvLyBgbnVsbGAgY2h1bmsgaXMsIGluIGZhY3QsIHB1c2hlZCB3aGVuIHRoZSB3ZWJzb2NrZXQgZW1pdHMgYCdjbG9zZSdgLlxuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgICB3cy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICBkdXBsZXguX3JlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHdzLmlzUGF1c2VkKSB3cy5yZXN1bWUoKTtcbiAgfTtcblxuICBkdXBsZXguX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAod3MucmVhZHlTdGF0ZSA9PT0gd3MuQ09OTkVDVElORykge1xuICAgICAgd3Mub25jZSgnb3BlbicsIGZ1bmN0aW9uIG9wZW4oKSB7XG4gICAgICAgIGR1cGxleC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3cy5zZW5kKGNodW5rLCBjYWxsYmFjayk7XG4gIH07XG5cbiAgZHVwbGV4Lm9uKCdlbmQnLCBkdXBsZXhPbkVuZCk7XG4gIGR1cGxleC5vbignZXJyb3InLCBkdXBsZXhPbkVycm9yKTtcbiAgcmV0dXJuIGR1cGxleDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVXZWJTb2NrZXRTdHJlYW07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgdG9rZW5DaGFycyB9ID0gcmVxdWlyZSgnLi92YWxpZGF0aW9uJyk7XG5cbi8qKlxuICogUGFyc2VzIHRoZSBgU2VjLVdlYlNvY2tldC1Qcm90b2NvbGAgaGVhZGVyIGludG8gYSBzZXQgb2Ygc3VicHJvdG9jb2wgbmFtZXMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlciBUaGUgZmllbGQgdmFsdWUgb2YgdGhlIGhlYWRlclxuICogQHJldHVybiB7U2V0fSBUaGUgc3VicHJvdG9jb2wgbmFtZXNcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gcGFyc2UoaGVhZGVyKSB7XG4gIGNvbnN0IHByb3RvY29scyA9IG5ldyBTZXQoKTtcbiAgbGV0IHN0YXJ0ID0gLTE7XG4gIGxldCBlbmQgPSAtMTtcbiAgbGV0IGkgPSAwO1xuXG4gIGZvciAoaTsgaSA8IGhlYWRlci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBoZWFkZXIuY2hhckNvZGVBdChpKTtcblxuICAgIGlmIChlbmQgPT09IC0xICYmIHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcbiAgICAgIGlmIChzdGFydCA9PT0gLTEpIHN0YXJ0ID0gaTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgaSAhPT0gMCAmJlxuICAgICAgKGNvZGUgPT09IDB4MjAgLyogJyAnICovIHx8IGNvZGUgPT09IDB4MDkpIC8qICdcXHQnICovXG4gICAgKSB7XG4gICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XG4gICAgfSBlbHNlIGlmIChjb2RlID09PSAweDJjIC8qICcsJyAqLykge1xuICAgICAgaWYgKHN0YXJ0ID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuZCA9PT0gLTEpIGVuZCA9IGk7XG5cbiAgICAgIGNvbnN0IHByb3RvY29sID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gICAgICBpZiAocHJvdG9jb2xzLmhhcyhwcm90b2NvbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBUaGUgXCIke3Byb3RvY29sfVwiIHN1YnByb3RvY29sIGlzIGR1cGxpY2F0ZWRgKTtcbiAgICAgIH1cblxuICAgICAgcHJvdG9jb2xzLmFkZChwcm90b2NvbCk7XG4gICAgICBzdGFydCA9IGVuZCA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGVuZCAhPT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Jyk7XG4gIH1cblxuICBjb25zdCBwcm90b2NvbCA9IGhlYWRlci5zbGljZShzdGFydCwgaSk7XG5cbiAgaWYgKHByb3RvY29scy5oYXMocHJvdG9jb2wpKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBUaGUgXCIke3Byb3RvY29sfVwiIHN1YnByb3RvY29sIGlzIGR1cGxpY2F0ZWRgKTtcbiAgfVxuXG4gIHByb3RvY29scy5hZGQocHJvdG9jb2wpO1xuICByZXR1cm4gcHJvdG9jb2xzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgcGFyc2UgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBpc1V0ZjggfSA9IHJlcXVpcmUoJ2J1ZmZlcicpO1xuXG5jb25zdCB7IGhhc0Jsb2IgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbi8vXG4vLyBBbGxvd2VkIHRva2VuIGNoYXJhY3RlcnM6XG4vL1xuLy8gJyEnLCAnIycsICckJywgJyUnLCAnJicsICcnJywgJyonLCAnKycsICctJyxcbi8vICcuJywgMC05LCBBLVosICdeJywgJ18nLCAnYCcsIGEteiwgJ3wnLCAnfidcbi8vXG4vLyB0b2tlbkNoYXJzWzMyXSA9PT0gMCAvLyAnICdcbi8vIHRva2VuQ2hhcnNbMzNdID09PSAxIC8vICchJ1xuLy8gdG9rZW5DaGFyc1szNF0gPT09IDAgLy8gJ1wiJ1xuLy8gLi4uXG4vL1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCB0b2tlbkNoYXJzID0gW1xuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAwIC0gMTVcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gMTYgLSAzMVxuICAwLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAvLyAzMiAtIDQ3XG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDQ4IC0gNjNcbiAgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gNjQgLSA3OVxuICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAxLCAvLyA4MCAtIDk1XG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vIDk2IC0gMTExXG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIDAgLy8gMTEyIC0gMTI3XG5dO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHN0YXR1cyBjb2RlIGlzIGFsbG93ZWQgaW4gYSBjbG9zZSBmcmFtZS5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gY29kZSBUaGUgc3RhdHVzIGNvZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgc3RhdHVzIGNvZGUgaXMgdmFsaWQsIGVsc2UgYGZhbHNlYFxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBpc1ZhbGlkU3RhdHVzQ29kZShjb2RlKSB7XG4gIHJldHVybiAoXG4gICAgKGNvZGUgPj0gMTAwMCAmJlxuICAgICAgY29kZSA8PSAxMDE0ICYmXG4gICAgICBjb2RlICE9PSAxMDA0ICYmXG4gICAgICBjb2RlICE9PSAxMDA1ICYmXG4gICAgICBjb2RlICE9PSAxMDA2KSB8fFxuICAgIChjb2RlID49IDMwMDAgJiYgY29kZSA8PSA0OTk5KVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIGJ1ZmZlciBjb250YWlucyBvbmx5IGNvcnJlY3QgVVRGLTguXG4gKiBQb3J0ZWQgZnJvbSBodHRwczovL3d3dy5jbC5jYW0uYWMudWsvJTdFbWdrMjUvdWNzL3V0ZjhfY2hlY2suYyBieVxuICogTWFya3VzIEt1aG4uXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZiBUaGUgYnVmZmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYGJ1ZmAgY29udGFpbnMgb25seSBjb3JyZWN0IFVURi04LCBlbHNlIGBmYWxzZWBcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gX2lzVmFsaWRVVEY4KGJ1Zikge1xuICBjb25zdCBsZW4gPSBidWYubGVuZ3RoO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBpZiAoKGJ1ZltpXSAmIDB4ODApID09PSAwKSB7XG4gICAgICAvLyAweHh4eHh4eFxuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZTApID09PSAweGMwKSB7XG4gICAgICAvLyAxMTB4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMSA9PT0gbGVuIHx8XG4gICAgICAgIChidWZbaSArIDFdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSAmIDB4ZmUpID09PSAweGMwIC8vIE92ZXJsb25nXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpICs9IDI7XG4gICAgfSBlbHNlIGlmICgoYnVmW2ldICYgMHhmMCkgPT09IDB4ZTApIHtcbiAgICAgIC8vIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4XG4gICAgICBpZiAoXG4gICAgICAgIGkgKyAyID49IGxlbiB8fFxuICAgICAgICAoYnVmW2kgKyAxXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaSArIDJdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSA9PT0gMHhlMCAmJiAoYnVmW2kgKyAxXSAmIDB4ZTApID09PSAweDgwKSB8fCAvLyBPdmVybG9uZ1xuICAgICAgICAoYnVmW2ldID09PSAweGVkICYmIChidWZbaSArIDFdICYgMHhlMCkgPT09IDB4YTApIC8vIFN1cnJvZ2F0ZSAoVStEODAwIC0gVStERkZGKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSArPSAzO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZjgpID09PSAweGYwKSB7XG4gICAgICAvLyAxMTExMHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMyA+PSBsZW4gfHxcbiAgICAgICAgKGJ1ZltpICsgMV0gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICAoYnVmW2kgKyAyXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaSArIDNdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSA9PT0gMHhmMCAmJiAoYnVmW2kgKyAxXSAmIDB4ZjApID09PSAweDgwKSB8fCAvLyBPdmVybG9uZ1xuICAgICAgICAoYnVmW2ldID09PSAweGY0ICYmIGJ1ZltpICsgMV0gPiAweDhmKSB8fFxuICAgICAgICBidWZbaV0gPiAweGY0IC8vID4gVSsxMEZGRkZcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGkgKz0gNDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHZhbHVlIGlzIGEgYEJsb2JgLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHRlc3RlZFxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBgQmxvYmAsIGVsc2UgYGZhbHNlYFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNCbG9iKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgaGFzQmxvYiAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgdmFsdWUuYXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUudHlwZSA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2YgdmFsdWUuc3RyZWFtID09PSAnZnVuY3Rpb24nICYmXG4gICAgKHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdCbG9iJyB8fFxuICAgICAgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0ZpbGUnKVxuICApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNCbG9iLFxuICBpc1ZhbGlkU3RhdHVzQ29kZSxcbiAgaXNWYWxpZFVURjg6IF9pc1ZhbGlkVVRGOCxcbiAgdG9rZW5DaGFyc1xufTtcblxuaWYgKGlzVXRmOCkge1xuICBtb2R1bGUuZXhwb3J0cy5pc1ZhbGlkVVRGOCA9IGZ1bmN0aW9uIChidWYpIHtcbiAgICByZXR1cm4gYnVmLmxlbmd0aCA8IDI0ID8gX2lzVmFsaWRVVEY4KGJ1ZikgOiBpc1V0ZjgoYnVmKTtcbiAgfTtcbn0gLyogaXN0YW5idWwgaWdub3JlIGVsc2UgICovIGVsc2UgaWYgKCFwcm9jZXNzLmVudi5XU19OT19VVEZfOF9WQUxJREFURSkge1xuICB0cnkge1xuICAgIGNvbnN0IGlzVmFsaWRVVEY4ID0gcmVxdWlyZSgndXRmLTgtdmFsaWRhdGUnKTtcblxuICAgIG1vZHVsZS5leHBvcnRzLmlzVmFsaWRVVEY4ID0gZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgcmV0dXJuIGJ1Zi5sZW5ndGggPCAzMiA/IF9pc1ZhbGlkVVRGOChidWYpIDogaXNWYWxpZFVURjgoYnVmKTtcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gQ29udGludWUgcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3IuXG4gIH1cbn1cbiIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXkR1cGxleCRcIiwgXCJjYXVnaHRFcnJvcnNcIjogXCJub25lXCIgfV0gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCB7IER1cGxleCB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5jb25zdCB7IGNyZWF0ZUhhc2ggfSA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG5jb25zdCBleHRlbnNpb24gPSByZXF1aXJlKCcuL2V4dGVuc2lvbicpO1xuY29uc3QgUGVyTWVzc2FnZURlZmxhdGUgPSByZXF1aXJlKCcuL3Blcm1lc3NhZ2UtZGVmbGF0ZScpO1xuY29uc3Qgc3VicHJvdG9jb2wgPSByZXF1aXJlKCcuL3N1YnByb3RvY29sJyk7XG5jb25zdCBXZWJTb2NrZXQgPSByZXF1aXJlKCcuL3dlYnNvY2tldCcpO1xuY29uc3QgeyBHVUlELCBrV2ViU29ja2V0IH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG5jb25zdCBrZXlSZWdleCA9IC9eWysvMC05QS1aYS16XXsyMn09PSQvO1xuXG5jb25zdCBSVU5OSU5HID0gMDtcbmNvbnN0IENMT1NJTkcgPSAxO1xuY29uc3QgQ0xPU0VEID0gMjtcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBXZWJTb2NrZXQgc2VydmVyLlxuICpcbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICovXG5jbGFzcyBXZWJTb2NrZXRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgYFdlYlNvY2tldFNlcnZlcmAgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHM9dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXJcbiAgICogICAgIGFueSBvZiB0aGUgYCdtZXNzYWdlJ2AsIGAncGluZydgLCBhbmQgYCdwb25nJ2AgZXZlbnRzIGNhbiBiZSBlbWl0dGVkXG4gICAqICAgICBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSB0aWNrXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYXV0b1Bvbmc9dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvXG4gICAqICAgICBhdXRvbWF0aWNhbGx5IHNlbmQgYSBwb25nIGluIHJlc3BvbnNlIHRvIGEgcGluZ1xuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYmFja2xvZz01MTFdIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcXVldWUgb2ZcbiAgICogICAgIHBlbmRpbmcgY29ubmVjdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGllbnRUcmFja2luZz10cnVlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG9cbiAgICogICAgIHRyYWNrIGNsaWVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuaGFuZGxlUHJvdG9jb2xzXSBBIGhvb2sgdG8gaGFuZGxlIHByb3RvY29sc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaG9zdF0gVGhlIGhvc3RuYW1lIHdoZXJlIHRvIGJpbmQgdGhlIHNlcnZlclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UGF5bG9hZD0xMDQ4NTc2MDBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZVxuICAgKiAgICAgc2l6ZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm5vU2VydmVyPWZhbHNlXSBFbmFibGUgbm8gc2VydmVyIG1vZGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnBhdGhdIEFjY2VwdCBvbmx5IGNvbm5lY3Rpb25zIG1hdGNoaW5nIHRoaXMgcGF0aFxuICAgKiBAcGFyYW0geyhCb29sZWFufE9iamVjdCl9IFtvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlPWZhbHNlXSBFbmFibGUvZGlzYWJsZVxuICAgKiAgICAgcGVybWVzc2FnZS1kZWZsYXRlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wb3J0XSBUaGUgcG9ydCB3aGVyZSB0byBiaW5kIHRoZSBzZXJ2ZXJcbiAgICogQHBhcmFtIHsoaHR0cC5TZXJ2ZXJ8aHR0cHMuU2VydmVyKX0gW29wdGlvbnMuc2VydmVyXSBBIHByZS1jcmVhdGVkIEhUVFAvU1xuICAgKiAgICAgc2VydmVyIHRvIHVzZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAgICogICAgIG5vdCB0byBza2lwIFVURi04IHZhbGlkYXRpb24gZm9yIHRleHQgYW5kIGNsb3NlIG1lc3NhZ2VzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnZlcmlmeUNsaWVudF0gQSBob29rIHRvIHJlamVjdCBjb25uZWN0aW9uc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5XZWJTb2NrZXQ9V2ViU29ja2V0XSBTcGVjaWZpZXMgdGhlIGBXZWJTb2NrZXRgXG4gICAqICAgICBjbGFzcyB0byB1c2UuIEl0IG11c3QgYmUgdGhlIGBXZWJTb2NrZXRgIGNsYXNzIG9yIGNsYXNzIHRoYXQgZXh0ZW5kcyBpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIEEgbGlzdGVuZXIgZm9yIHRoZSBgbGlzdGVuaW5nYCBldmVudFxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBzdXBlcigpO1xuXG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IHRydWUsXG4gICAgICBhdXRvUG9uZzogdHJ1ZSxcbiAgICAgIG1heFBheWxvYWQ6IDEwMCAqIDEwMjQgKiAxMDI0LFxuICAgICAgc2tpcFVURjhWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgIHBlck1lc3NhZ2VEZWZsYXRlOiBmYWxzZSxcbiAgICAgIGhhbmRsZVByb3RvY29sczogbnVsbCxcbiAgICAgIGNsaWVudFRyYWNraW5nOiB0cnVlLFxuICAgICAgdmVyaWZ5Q2xpZW50OiBudWxsLFxuICAgICAgbm9TZXJ2ZXI6IGZhbHNlLFxuICAgICAgYmFja2xvZzogbnVsbCwgLy8gdXNlIGRlZmF1bHQgKDUxMSBhcyBpbXBsZW1lbnRlZCBpbiBuZXQuanMpXG4gICAgICBzZXJ2ZXI6IG51bGwsXG4gICAgICBob3N0OiBudWxsLFxuICAgICAgcGF0aDogbnVsbCxcbiAgICAgIHBvcnQ6IG51bGwsXG4gICAgICBXZWJTb2NrZXQsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIGlmIChcbiAgICAgIChvcHRpb25zLnBvcnQgPT0gbnVsbCAmJiAhb3B0aW9ucy5zZXJ2ZXIgJiYgIW9wdGlvbnMubm9TZXJ2ZXIpIHx8XG4gICAgICAob3B0aW9ucy5wb3J0ICE9IG51bGwgJiYgKG9wdGlvbnMuc2VydmVyIHx8IG9wdGlvbnMubm9TZXJ2ZXIpKSB8fFxuICAgICAgKG9wdGlvbnMuc2VydmVyICYmIG9wdGlvbnMubm9TZXJ2ZXIpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgXCJwb3J0XCIsIFwic2VydmVyXCIsIG9yIFwibm9TZXJ2ZXJcIiBvcHRpb25zICcgK1xuICAgICAgICAgICdtdXN0IGJlIHNwZWNpZmllZCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucG9ydCAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9zZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcigocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgYm9keSA9IGh0dHAuU1RBVFVTX0NPREVTWzQyNl07XG5cbiAgICAgICAgcmVzLndyaXRlSGVhZCg0MjYsIHtcbiAgICAgICAgICAnQ29udGVudC1MZW5ndGgnOiBib2R5Lmxlbmd0aCxcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nXG4gICAgICAgIH0pO1xuICAgICAgICByZXMuZW5kKGJvZHkpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9zZXJ2ZXIubGlzdGVuKFxuICAgICAgICBvcHRpb25zLnBvcnQsXG4gICAgICAgIG9wdGlvbnMuaG9zdCxcbiAgICAgICAgb3B0aW9ucy5iYWNrbG9nLFxuICAgICAgICBjYWxsYmFja1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc2VydmVyKSB7XG4gICAgICB0aGlzLl9zZXJ2ZXIgPSBvcHRpb25zLnNlcnZlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2VydmVyKSB7XG4gICAgICBjb25zdCBlbWl0Q29ubmVjdGlvbiA9IHRoaXMuZW1pdC5iaW5kKHRoaXMsICdjb25uZWN0aW9uJyk7XG5cbiAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycyA9IGFkZExpc3RlbmVycyh0aGlzLl9zZXJ2ZXIsIHtcbiAgICAgICAgbGlzdGVuaW5nOiB0aGlzLmVtaXQuYmluZCh0aGlzLCAnbGlzdGVuaW5nJyksXG4gICAgICAgIGVycm9yOiB0aGlzLmVtaXQuYmluZCh0aGlzLCAnZXJyb3InKSxcbiAgICAgICAgdXBncmFkZTogKHJlcSwgc29ja2V0LCBoZWFkKSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVVcGdyYWRlKHJlcSwgc29ja2V0LCBoZWFkLCBlbWl0Q29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlID09PSB0cnVlKSBvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlID0ge307XG4gICAgaWYgKG9wdGlvbnMuY2xpZW50VHJhY2tpbmcpIHtcbiAgICAgIHRoaXMuY2xpZW50cyA9IG5ldyBTZXQoKTtcbiAgICAgIHRoaXMuX3Nob3VsZEVtaXRDbG9zZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5fc3RhdGUgPSBSVU5OSU5HO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGJvdW5kIGFkZHJlc3MsIHRoZSBhZGRyZXNzIGZhbWlseSBuYW1lLCBhbmQgcG9ydCBvZiB0aGUgc2VydmVyXG4gICAqIGFzIHJlcG9ydGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlmIGxpc3RlbmluZyBvbiBhbiBJUCBzb2NrZXQuXG4gICAqIElmIHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uIGEgcGlwZSBvciBVTklYIGRvbWFpbiBzb2NrZXQsIHRoZSBuYW1lIGlzXG4gICAqIHJldHVybmVkIGFzIGEgc3RyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJuIHsoT2JqZWN0fFN0cmluZ3xudWxsKX0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlcnZlclxuICAgKiBAcHVibGljXG4gICAqL1xuICBhZGRyZXNzKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMubm9TZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHNlcnZlciBpcyBvcGVyYXRpbmcgaW4gXCJub1NlcnZlclwiIG1vZGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3NlcnZlcikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlci5hZGRyZXNzKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB0aGUgc2VydmVyIGZyb20gYWNjZXB0aW5nIG5ldyBjb25uZWN0aW9ucyBhbmQgZW1pdCB0aGUgYCdjbG9zZSdgIGV2ZW50XG4gICAqIHdoZW4gYWxsIGV4aXN0aW5nIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgdGhlIGAnY2xvc2UnYCBldmVudFxuICAgKiBAcHVibGljXG4gICAqL1xuICBjbG9zZShjYikge1xuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gQ0xPU0VEKSB7XG4gICAgICBpZiAoY2IpIHtcbiAgICAgICAgdGhpcy5vbmNlKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICBjYihuZXcgRXJyb3IoJ1RoZSBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZSwgdGhpcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNiKSB0aGlzLm9uY2UoJ2Nsb3NlJywgY2IpO1xuXG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBDTE9TSU5HKSByZXR1cm47XG4gICAgdGhpcy5fc3RhdGUgPSBDTE9TSU5HO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub1NlcnZlciB8fCB0aGlzLm9wdGlvbnMuc2VydmVyKSB7XG4gICAgICBpZiAodGhpcy5fc2VydmVyKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMgPSB0aGlzLl9zZXJ2ZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jbGllbnRzKSB7XG4gICAgICAgIGlmICghdGhpcy5jbGllbnRzLnNpemUpIHtcbiAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZSwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fc2hvdWxkRW1pdENsb3NlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLl9zZXJ2ZXI7XG5cbiAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xuICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzID0gdGhpcy5fc2VydmVyID0gbnVsbDtcblxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBIVFRQL1Mgc2VydmVyIHdhcyBjcmVhdGVkIGludGVybmFsbHkuIENsb3NlIGl0LCBhbmQgcmVseSBvbiBpdHNcbiAgICAgIC8vIGAnY2xvc2UnYCBldmVudC5cbiAgICAgIC8vXG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICBlbWl0Q2xvc2UodGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VlIGlmIGEgZ2l2ZW4gcmVxdWVzdCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGlzIHNlcnZlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtodHRwLkluY29taW5nTWVzc2FnZX0gcmVxIFJlcXVlc3Qgb2JqZWN0IHRvIGluc3BlY3RcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSByZXF1ZXN0IGlzIHZhbGlkLCBlbHNlIGBmYWxzZWBcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2hvdWxkSGFuZGxlKHJlcSkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMucGF0aCkge1xuICAgICAgY29uc3QgaW5kZXggPSByZXEudXJsLmluZGV4T2YoJz8nKTtcbiAgICAgIGNvbnN0IHBhdGhuYW1lID0gaW5kZXggIT09IC0xID8gcmVxLnVybC5zbGljZSgwLCBpbmRleCkgOiByZXEudXJsO1xuXG4gICAgICBpZiAocGF0aG5hbWUgIT09IHRoaXMub3B0aW9ucy5wYXRoKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGEgSFRUUCBVcGdyYWRlIHJlcXVlc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7aHR0cC5JbmNvbWluZ01lc3NhZ2V9IHJlcSBUaGUgcmVxdWVzdCBvYmplY3RcbiAgICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgbmV0d29yayBzb2NrZXQgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWQgVGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgdXBncmFkZWQgc3RyZWFtXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGhhbmRsZVVwZ3JhZGUocmVxLCBzb2NrZXQsIGhlYWQsIGNiKSB7XG4gICAgc29ja2V0Lm9uKCdlcnJvcicsIHNvY2tldE9uRXJyb3IpO1xuXG4gICAgY29uc3Qga2V5ID0gcmVxLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQta2V5J107XG4gICAgY29uc3QgdXBncmFkZSA9IHJlcS5oZWFkZXJzLnVwZ3JhZGU7XG4gICAgY29uc3QgdmVyc2lvbiA9ICtyZXEuaGVhZGVyc1snc2VjLXdlYnNvY2tldC12ZXJzaW9uJ107XG5cbiAgICBpZiAocmVxLm1ldGhvZCAhPT0gJ0dFVCcpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnSW52YWxpZCBIVFRQIG1ldGhvZCc7XG4gICAgICBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3IodGhpcywgcmVxLCBzb2NrZXQsIDQwNSwgbWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHVwZ3JhZGUgPT09IHVuZGVmaW5lZCB8fCB1cGdyYWRlLnRvTG93ZXJDYXNlKCkgIT09ICd3ZWJzb2NrZXQnKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgVXBncmFkZSBoZWFkZXInO1xuICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCAha2V5UmVnZXgudGVzdChrZXkpKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ01pc3Npbmcgb3IgaW52YWxpZCBTZWMtV2ViU29ja2V0LUtleSBoZWFkZXInO1xuICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uICE9PSA4ICYmIHZlcnNpb24gIT09IDEzKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ01pc3Npbmcgb3IgaW52YWxpZCBTZWMtV2ViU29ja2V0LVZlcnNpb24gaGVhZGVyJztcbiAgICAgIGFib3J0SGFuZHNoYWtlT3JFbWl0d3NDbGllbnRFcnJvcih0aGlzLCByZXEsIHNvY2tldCwgNDAwLCBtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2hvdWxkSGFuZGxlKHJlcSkpIHtcbiAgICAgIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgNDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWNXZWJTb2NrZXRQcm90b2NvbCA9IHJlcS5oZWFkZXJzWydzZWMtd2Vic29ja2V0LXByb3RvY29sJ107XG4gICAgbGV0IHByb3RvY29scyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChzZWNXZWJTb2NrZXRQcm90b2NvbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwcm90b2NvbHMgPSBzdWJwcm90b2NvbC5wYXJzZShzZWNXZWJTb2NrZXRQcm90b2NvbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgaGVhZGVyJztcbiAgICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjV2ViU29ja2V0RXh0ZW5zaW9ucyA9IHJlcS5oZWFkZXJzWydzZWMtd2Vic29ja2V0LWV4dGVuc2lvbnMnXTtcbiAgICBjb25zdCBleHRlbnNpb25zID0ge307XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLm9wdGlvbnMucGVyTWVzc2FnZURlZmxhdGUgJiZcbiAgICAgIHNlY1dlYlNvY2tldEV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc3QgcGVyTWVzc2FnZURlZmxhdGUgPSBuZXcgUGVyTWVzc2FnZURlZmxhdGUoXG4gICAgICAgIHRoaXMub3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5vcHRpb25zLm1heFBheWxvYWRcbiAgICAgICk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9mZmVycyA9IGV4dGVuc2lvbi5wYXJzZShzZWNXZWJTb2NrZXRFeHRlbnNpb25zKTtcblxuICAgICAgICBpZiAob2ZmZXJzW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdKSB7XG4gICAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUuYWNjZXB0KG9mZmVyc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSk7XG4gICAgICAgICAgZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSA9IHBlck1lc3NhZ2VEZWZsYXRlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgJ0ludmFsaWQgb3IgdW5hY2NlcHRhYmxlIFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyBoZWFkZXInO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3IodGhpcywgcmVxLCBzb2NrZXQsIDQwMCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIE9wdGlvbmFsbHkgY2FsbCBleHRlcm5hbCBjbGllbnQgdmVyaWZpY2F0aW9uIGhhbmRsZXIuXG4gICAgLy9cbiAgICBpZiAodGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudCkge1xuICAgICAgY29uc3QgaW5mbyA9IHtcbiAgICAgICAgb3JpZ2luOlxuICAgICAgICAgIHJlcS5oZWFkZXJzW2Ake3ZlcnNpb24gPT09IDggPyAnc2VjLXdlYnNvY2tldC1vcmlnaW4nIDogJ29yaWdpbid9YF0sXG4gICAgICAgIHNlY3VyZTogISEocmVxLnNvY2tldC5hdXRob3JpemVkIHx8IHJlcS5zb2NrZXQuZW5jcnlwdGVkKSxcbiAgICAgICAgcmVxXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudChpbmZvLCAodmVyaWZpZWQsIGNvZGUsIG1lc3NhZ2UsIGhlYWRlcnMpID0+IHtcbiAgICAgICAgICBpZiAoIXZlcmlmaWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYWJvcnRIYW5kc2hha2Uoc29ja2V0LCBjb2RlIHx8IDQwMSwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb21wbGV0ZVVwZ3JhZGUoXG4gICAgICAgICAgICBleHRlbnNpb25zLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcHJvdG9jb2xzLFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgc29ja2V0LFxuICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgIGNiXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudmVyaWZ5Q2xpZW50KGluZm8pKSByZXR1cm4gYWJvcnRIYW5kc2hha2Uoc29ja2V0LCA0MDEpO1xuICAgIH1cblxuICAgIHRoaXMuY29tcGxldGVVcGdyYWRlKGV4dGVuc2lvbnMsIGtleSwgcHJvdG9jb2xzLCByZXEsIHNvY2tldCwgaGVhZCwgY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZ3JhZGUgdGhlIGNvbm5lY3Rpb24gdG8gV2ViU29ja2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXh0ZW5zaW9ucyBUaGUgYWNjZXB0ZWQgZXh0ZW5zaW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSB2YWx1ZSBvZiB0aGUgYFNlYy1XZWJTb2NrZXQtS2V5YCBoZWFkZXJcbiAgICogQHBhcmFtIHtTZXR9IHByb3RvY29scyBUaGUgc3VicHJvdG9jb2xzXG4gICAqIEBwYXJhbSB7aHR0cC5JbmNvbWluZ01lc3NhZ2V9IHJlcSBUaGUgcmVxdWVzdCBvYmplY3RcbiAgICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgbmV0d29yayBzb2NrZXQgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWQgVGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgdXBncmFkZWQgc3RyZWFtXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugd2l0aCB0aGUgc2FtZSBzb2NrZXRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbXBsZXRlVXBncmFkZShleHRlbnNpb25zLCBrZXksIHByb3RvY29scywgcmVxLCBzb2NrZXQsIGhlYWQsIGNiKSB7XG4gICAgLy9cbiAgICAvLyBEZXN0cm95IHRoZSBzb2NrZXQgaWYgdGhlIGNsaWVudCBoYXMgYWxyZWFkeSBzZW50IGEgRklOIHBhY2tldC5cbiAgICAvL1xuICAgIGlmICghc29ja2V0LnJlYWRhYmxlIHx8ICFzb2NrZXQud3JpdGFibGUpIHJldHVybiBzb2NrZXQuZGVzdHJveSgpO1xuXG4gICAgaWYgKHNvY2tldFtrV2ViU29ja2V0XSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnc2VydmVyLmhhbmRsZVVwZ3JhZGUoKSB3YXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHdpdGggdGhlIHNhbWUgJyArXG4gICAgICAgICAgJ3NvY2tldCwgcG9zc2libHkgZHVlIHRvIGEgbWlzY29uZmlndXJhdGlvbidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3N0YXRlID4gUlVOTklORykgcmV0dXJuIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgNTAzKTtcblxuICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goJ3NoYTEnKVxuICAgICAgLnVwZGF0ZShrZXkgKyBHVUlEKVxuICAgICAgLmRpZ2VzdCgnYmFzZTY0Jyk7XG5cbiAgICBjb25zdCBoZWFkZXJzID0gW1xuICAgICAgJ0hUVFAvMS4xIDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzJyxcbiAgICAgICdVcGdyYWRlOiB3ZWJzb2NrZXQnLFxuICAgICAgJ0Nvbm5lY3Rpb246IFVwZ3JhZGUnLFxuICAgICAgYFNlYy1XZWJTb2NrZXQtQWNjZXB0OiAke2RpZ2VzdH1gXG4gICAgXTtcblxuICAgIGNvbnN0IHdzID0gbmV3IHRoaXMub3B0aW9ucy5XZWJTb2NrZXQobnVsbCwgdW5kZWZpbmVkLCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgaWYgKHByb3RvY29scy5zaXplKSB7XG4gICAgICAvL1xuICAgICAgLy8gT3B0aW9uYWxseSBjYWxsIGV4dGVybmFsIHByb3RvY29sIHNlbGVjdGlvbiBoYW5kbGVyLlxuICAgICAgLy9cbiAgICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5vcHRpb25zLmhhbmRsZVByb3RvY29sc1xuICAgICAgICA/IHRoaXMub3B0aW9ucy5oYW5kbGVQcm90b2NvbHMocHJvdG9jb2xzLCByZXEpXG4gICAgICAgIDogcHJvdG9jb2xzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgICAgaWYgKHByb3RvY29sKSB7XG4gICAgICAgIGhlYWRlcnMucHVzaChgU2VjLVdlYlNvY2tldC1Qcm90b2NvbDogJHtwcm90b2NvbH1gKTtcbiAgICAgICAgd3MuX3Byb3RvY29sID0gcHJvdG9jb2w7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0pIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IGV4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0ucGFyYW1zO1xuICAgICAgY29uc3QgdmFsdWUgPSBleHRlbnNpb24uZm9ybWF0KHtcbiAgICAgICAgW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdOiBbcGFyYW1zXVxuICAgICAgfSk7XG4gICAgICBoZWFkZXJzLnB1c2goYFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9uczogJHt2YWx1ZX1gKTtcbiAgICAgIHdzLl9leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIEFsbG93IGV4dGVybmFsIG1vZGlmaWNhdGlvbi9pbnNwZWN0aW9uIG9mIGhhbmRzaGFrZSBoZWFkZXJzLlxuICAgIC8vXG4gICAgdGhpcy5lbWl0KCdoZWFkZXJzJywgaGVhZGVycywgcmVxKTtcblxuICAgIHNvY2tldC53cml0ZShoZWFkZXJzLmNvbmNhdCgnXFxyXFxuJykuam9pbignXFxyXFxuJykpO1xuICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBzb2NrZXRPbkVycm9yKTtcblxuICAgIHdzLnNldFNvY2tldChzb2NrZXQsIGhlYWQsIHtcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IHRoaXMub3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzLFxuICAgICAgbWF4UGF5bG9hZDogdGhpcy5vcHRpb25zLm1heFBheWxvYWQsXG4gICAgICBza2lwVVRGOFZhbGlkYXRpb246IHRoaXMub3B0aW9ucy5za2lwVVRGOFZhbGlkYXRpb25cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNsaWVudHMpIHtcbiAgICAgIHRoaXMuY2xpZW50cy5hZGQod3MpO1xuICAgICAgd3Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmNsaWVudHMuZGVsZXRlKHdzKTtcblxuICAgICAgICBpZiAodGhpcy5fc2hvdWxkRW1pdENsb3NlICYmICF0aGlzLmNsaWVudHMuc2l6ZSkge1xuICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2Iod3MsIHJlcSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBXZWJTb2NrZXRTZXJ2ZXI7XG5cbi8qKlxuICogQWRkIGV2ZW50IGxpc3RlbmVycyBvbiBhbiBgRXZlbnRFbWl0dGVyYCB1c2luZyBhIG1hcCBvZiA8ZXZlbnQsIGxpc3RlbmVyPlxuICogcGFpcnMuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IHNlcnZlciBUaGUgZXZlbnQgZW1pdHRlclxuICogQHBhcmFtIHtPYmplY3QuPFN0cmluZywgRnVuY3Rpb24+fSBtYXAgVGhlIGxpc3RlbmVycyB0byBhZGRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCByZW1vdmUgdGhlIGFkZGVkIGxpc3RlbmVycyB3aGVuXG4gKiAgICAgY2FsbGVkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRMaXN0ZW5lcnMoc2VydmVyLCBtYXApIHtcbiAgZm9yIChjb25zdCBldmVudCBvZiBPYmplY3Qua2V5cyhtYXApKSBzZXJ2ZXIub24oZXZlbnQsIG1hcFtldmVudF0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcnMoKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBPYmplY3Qua2V5cyhtYXApKSB7XG4gICAgICBzZXJ2ZXIucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIG1hcFtldmVudF0pO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBFbWl0IGEgYCdjbG9zZSdgIGV2ZW50IG9uIGFuIGBFdmVudEVtaXR0ZXJgLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBzZXJ2ZXIgVGhlIGV2ZW50IGVtaXR0ZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGVtaXRDbG9zZShzZXJ2ZXIpIHtcbiAgc2VydmVyLl9zdGF0ZSA9IENMT1NFRDtcbiAgc2VydmVyLmVtaXQoJ2Nsb3NlJyk7XG59XG5cbi8qKlxuICogSGFuZGxlIHNvY2tldCBlcnJvcnMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc29ja2V0T25FcnJvcigpIHtcbiAgdGhpcy5kZXN0cm95KCk7XG59XG5cbi8qKlxuICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24gd2hlbiBwcmVjb25kaXRpb25zIGFyZSBub3QgZnVsZmlsbGVkLlxuICpcbiAqIEBwYXJhbSB7RHVwbGV4fSBzb2NrZXQgVGhlIHNvY2tldCBvZiB0aGUgdXBncmFkZSByZXF1ZXN0XG4gKiBAcGFyYW0ge051bWJlcn0gY29kZSBUaGUgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZVxuICogQHBhcmFtIHtTdHJpbmd9IFttZXNzYWdlXSBUaGUgSFRUUCByZXNwb25zZSBib2R5XG4gKiBAcGFyYW0ge09iamVjdH0gW2hlYWRlcnNdIEFkZGl0aW9uYWwgSFRUUCByZXNwb25zZSBoZWFkZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZShzb2NrZXQsIGNvZGUsIG1lc3NhZ2UsIGhlYWRlcnMpIHtcbiAgLy9cbiAgLy8gVGhlIHNvY2tldCBpcyB3cml0YWJsZSB1bmxlc3MgdGhlIHVzZXIgZGVzdHJveWVkIG9yIGVuZGVkIGl0IGJlZm9yZSBjYWxsaW5nXG4gIC8vIGBzZXJ2ZXIuaGFuZGxlVXBncmFkZSgpYCBvciBpbiB0aGUgYHZlcmlmeUNsaWVudGAgZnVuY3Rpb24sIHdoaWNoIGlzIGEgdXNlclxuICAvLyBlcnJvci4gSGFuZGxpbmcgdGhpcyBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgYXMgdGhlIHdvcnN0IHRoYXQgY2FuIGhhcHBlblxuICAvLyBpcyB0aGF0IHNvbWUgb2YgdGhlIGRhdGEgd3JpdHRlbiBieSB0aGUgdXNlciBtaWdodCBiZSBkaXNjYXJkZWQgZHVlIHRvIHRoZVxuICAvLyBjYWxsIHRvIGBzb2NrZXQuZW5kKClgIGJlbG93LCB3aGljaCB0cmlnZ2VycyBhbiBgJ2Vycm9yJ2AgZXZlbnQgdGhhdCBpblxuICAvLyB0dXJuIGNhdXNlcyB0aGUgc29ja2V0IHRvIGJlIGRlc3Ryb3llZC5cbiAgLy9cbiAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgaHR0cC5TVEFUVVNfQ09ERVNbY29kZV07XG4gIGhlYWRlcnMgPSB7XG4gICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcbiAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbCcsXG4gICAgJ0NvbnRlbnQtTGVuZ3RoJzogQnVmZmVyLmJ5dGVMZW5ndGgobWVzc2FnZSksXG4gICAgLi4uaGVhZGVyc1xuICB9O1xuXG4gIHNvY2tldC5vbmNlKCdmaW5pc2gnLCBzb2NrZXQuZGVzdHJveSk7XG5cbiAgc29ja2V0LmVuZChcbiAgICBgSFRUUC8xLjEgJHtjb2RlfSAke2h0dHAuU1RBVFVTX0NPREVTW2NvZGVdfVxcclxcbmAgK1xuICAgICAgT2JqZWN0LmtleXMoaGVhZGVycylcbiAgICAgICAgLm1hcCgoaCkgPT4gYCR7aH06ICR7aGVhZGVyc1toXX1gKVxuICAgICAgICAuam9pbignXFxyXFxuJykgK1xuICAgICAgJ1xcclxcblxcclxcbicgK1xuICAgICAgbWVzc2FnZVxuICApO1xufVxuXG4vKipcbiAqIEVtaXQgYSBgJ3dzQ2xpZW50RXJyb3InYCBldmVudCBvbiBhIGBXZWJTb2NrZXRTZXJ2ZXJgIGlmIHRoZXJlIGlzIGF0IGxlYXN0XG4gKiBvbmUgbGlzdGVuZXIgZm9yIGl0LCBvdGhlcndpc2UgY2FsbCBgYWJvcnRIYW5kc2hha2UoKWAuXG4gKlxuICogQHBhcmFtIHtXZWJTb2NrZXRTZXJ2ZXJ9IHNlcnZlciBUaGUgV2ViU29ja2V0IHNlcnZlclxuICogQHBhcmFtIHtodHRwLkluY29taW5nTWVzc2FnZX0gcmVxIFRoZSByZXF1ZXN0IG9iamVjdFxuICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgc29ja2V0IG9mIHRoZSB1cGdyYWRlIHJlcXVlc3RcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlIFRoZSBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgSFRUUCByZXNwb25zZSBib2R5XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3Ioc2VydmVyLCByZXEsIHNvY2tldCwgY29kZSwgbWVzc2FnZSkge1xuICBpZiAoc2VydmVyLmxpc3RlbmVyQ291bnQoJ3dzQ2xpZW50RXJyb3InKSkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIGFib3J0SGFuZHNoYWtlT3JFbWl0d3NDbGllbnRFcnJvcik7XG5cbiAgICBzZXJ2ZXIuZW1pdCgnd3NDbGllbnRFcnJvcicsIGVyciwgc29ja2V0LCByZXEpO1xuICB9IGVsc2Uge1xuICAgIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgY29kZSwgbWVzc2FnZSk7XG4gIH1cbn1cbiIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXkR1cGxleHxSZWFkYWJsZSRcIiwgXCJjYXVnaHRFcnJvcnNcIjogXCJub25lXCIgfV0gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCBuZXQgPSByZXF1aXJlKCduZXQnKTtcbmNvbnN0IHRscyA9IHJlcXVpcmUoJ3RscycpO1xuY29uc3QgeyByYW5kb21CeXRlcywgY3JlYXRlSGFzaCB9ID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCB7IER1cGxleCwgUmVhZGFibGUgfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuY29uc3QgeyBVUkwgfSA9IHJlcXVpcmUoJ3VybCcpO1xuXG5jb25zdCBQZXJNZXNzYWdlRGVmbGF0ZSA9IHJlcXVpcmUoJy4vcGVybWVzc2FnZS1kZWZsYXRlJyk7XG5jb25zdCBSZWNlaXZlciA9IHJlcXVpcmUoJy4vcmVjZWl2ZXInKTtcbmNvbnN0IFNlbmRlciA9IHJlcXVpcmUoJy4vc2VuZGVyJyk7XG5jb25zdCB7IGlzQmxvYiB9ID0gcmVxdWlyZSgnLi92YWxpZGF0aW9uJyk7XG5cbmNvbnN0IHtcbiAgQklOQVJZX1RZUEVTLFxuICBFTVBUWV9CVUZGRVIsXG4gIEdVSUQsXG4gIGtGb3JPbkV2ZW50QXR0cmlidXRlLFxuICBrTGlzdGVuZXIsXG4gIGtTdGF0dXNDb2RlLFxuICBrV2ViU29ja2V0LFxuICBOT09QXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IHtcbiAgRXZlbnRUYXJnZXQ6IHsgYWRkRXZlbnRMaXN0ZW5lciwgcmVtb3ZlRXZlbnRMaXN0ZW5lciB9XG59ID0gcmVxdWlyZSgnLi9ldmVudC10YXJnZXQnKTtcbmNvbnN0IHsgZm9ybWF0LCBwYXJzZSB9ID0gcmVxdWlyZSgnLi9leHRlbnNpb24nKTtcbmNvbnN0IHsgdG9CdWZmZXIgfSA9IHJlcXVpcmUoJy4vYnVmZmVyLXV0aWwnKTtcblxuY29uc3QgY2xvc2VUaW1lb3V0ID0gMzAgKiAxMDAwO1xuY29uc3Qga0Fib3J0ZWQgPSBTeW1ib2woJ2tBYm9ydGVkJyk7XG5jb25zdCBwcm90b2NvbFZlcnNpb25zID0gWzgsIDEzXTtcbmNvbnN0IHJlYWR5U3RhdGVzID0gWydDT05ORUNUSU5HJywgJ09QRU4nLCAnQ0xPU0lORycsICdDTE9TRUQnXTtcbmNvbnN0IHN1YnByb3RvY29sUmVnZXggPSAvXlshIyQlJicqK1xcLS4wLTlBLVpeX2B8YS16fl0rJC87XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgV2ViU29ja2V0LlxuICpcbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICovXG5jbGFzcyBXZWJTb2NrZXQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBXZWJTb2NrZXRgLlxuICAgKlxuICAgKiBAcGFyYW0geyhTdHJpbmd8VVJMKX0gYWRkcmVzcyBUaGUgVVJMIHRvIHdoaWNoIHRvIGNvbm5lY3RcbiAgICogQHBhcmFtIHsoU3RyaW5nfFN0cmluZ1tdKX0gW3Byb3RvY29sc10gVGhlIHN1YnByb3RvY29sc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIENvbm5lY3Rpb24gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IoYWRkcmVzcywgcHJvdG9jb2xzLCBvcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2JpbmFyeVR5cGUgPSBCSU5BUllfVFlQRVNbMF07XG4gICAgdGhpcy5fY2xvc2VDb2RlID0gMTAwNjtcbiAgICB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jbG9zZUZyYW1lU2VudCA9IGZhbHNlO1xuICAgIHRoaXMuX2Nsb3NlTWVzc2FnZSA9IEVNUFRZX0JVRkZFUjtcbiAgICB0aGlzLl9jbG9zZVRpbWVyID0gbnVsbDtcbiAgICB0aGlzLl9lcnJvckVtaXR0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9leHRlbnNpb25zID0ge307XG4gICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5fcHJvdG9jb2wgPSAnJztcbiAgICB0aGlzLl9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNPTk5FQ1RJTkc7XG4gICAgdGhpcy5fcmVjZWl2ZXIgPSBudWxsO1xuICAgIHRoaXMuX3NlbmRlciA9IG51bGw7XG4gICAgdGhpcy5fc29ja2V0ID0gbnVsbDtcblxuICAgIGlmIChhZGRyZXNzICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9idWZmZXJlZEFtb3VudCA9IDA7XG4gICAgICB0aGlzLl9pc1NlcnZlciA9IGZhbHNlO1xuICAgICAgdGhpcy5fcmVkaXJlY3RzID0gMDtcblxuICAgICAgaWYgKHByb3RvY29scyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3RvY29scyA9IFtdO1xuICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShwcm90b2NvbHMpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdG9jb2xzID09PSAnb2JqZWN0JyAmJiBwcm90b2NvbHMgIT09IG51bGwpIHtcbiAgICAgICAgICBvcHRpb25zID0gcHJvdG9jb2xzO1xuICAgICAgICAgIHByb3RvY29scyA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3RvY29scyA9IFtwcm90b2NvbHNdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGluaXRBc0NsaWVudCh0aGlzLCBhZGRyZXNzLCBwcm90b2NvbHMsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hdXRvUG9uZyA9IG9wdGlvbnMuYXV0b1Bvbmc7XG4gICAgICB0aGlzLl9pc1NlcnZlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoZSBjdXN0b20gXCJub2RlYnVmZmVyXCIgdHlwZSBpcyB1c2VkIGJ5IHRoZSBkZWZhdWx0XG4gICAqIGluc3RlYWQgb2YgXCJibG9iXCIuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgYmluYXJ5VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYmluYXJ5VHlwZTtcbiAgfVxuXG4gIHNldCBiaW5hcnlUeXBlKHR5cGUpIHtcbiAgICBpZiAoIUJJTkFSWV9UWVBFUy5pbmNsdWRlcyh0eXBlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fYmluYXJ5VHlwZSA9IHR5cGU7XG5cbiAgICAvL1xuICAgIC8vIEFsbG93IHRvIGNoYW5nZSBgYmluYXJ5VHlwZWAgb24gdGhlIGZseS5cbiAgICAvL1xuICAgIGlmICh0aGlzLl9yZWNlaXZlcikgdGhpcy5fcmVjZWl2ZXIuX2JpbmFyeVR5cGUgPSB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgYnVmZmVyZWRBbW91bnQoKSB7XG4gICAgaWYgKCF0aGlzLl9zb2NrZXQpIHJldHVybiB0aGlzLl9idWZmZXJlZEFtb3VudDtcblxuICAgIHJldHVybiB0aGlzLl9zb2NrZXQuX3dyaXRhYmxlU3RhdGUubGVuZ3RoICsgdGhpcy5fc2VuZGVyLl9idWZmZXJlZEJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgZXh0ZW5zaW9ucygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fZXh0ZW5zaW9ucykuam9pbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgZ2V0IGlzUGF1c2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXVzZWQ7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0IG9uY2xvc2UoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0IG9uZXJyb3IoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0IG9ub3BlbigpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBnZXQgb25tZXNzYWdlKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgcHJvdG9jb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgcmVhZHlTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZHlTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgZ2V0IHVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCB0aGUgc29ja2V0IGFuZCB0aGUgaW50ZXJuYWwgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge0R1cGxleH0gc29ja2V0IFRoZSBuZXR3b3JrIHNvY2tldCBiZXR3ZWVuIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gaGVhZCBUaGUgZmlyc3QgcGFja2V0IG9mIHRoZSB1cGdyYWRlZCBzdHJlYW1cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlclxuICAgKiAgICAgYW55IG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWRcbiAgICogICAgIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHRpY2tcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZ2VuZXJhdGVNYXNrXSBUaGUgZnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSB0aGVcbiAgICogICAgIG1hc2tpbmcga2V5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhQYXlsb2FkPTBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZSBzaXplXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2tpcFVURjhWYWxpZGF0aW9uPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvclxuICAgKiAgICAgbm90IHRvIHNraXAgVVRGLTggdmFsaWRhdGlvbiBmb3IgdGV4dCBhbmQgY2xvc2UgbWVzc2FnZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldFNvY2tldChzb2NrZXQsIGhlYWQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCByZWNlaXZlciA9IG5ldyBSZWNlaXZlcih7XG4gICAgICBhbGxvd1N5bmNocm9ub3VzRXZlbnRzOiBvcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHMsXG4gICAgICBiaW5hcnlUeXBlOiB0aGlzLmJpbmFyeVR5cGUsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLl9leHRlbnNpb25zLFxuICAgICAgaXNTZXJ2ZXI6IHRoaXMuX2lzU2VydmVyLFxuICAgICAgbWF4UGF5bG9hZDogb3B0aW9ucy5tYXhQYXlsb2FkLFxuICAgICAgc2tpcFVURjhWYWxpZGF0aW9uOiBvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvblxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2VuZGVyID0gbmV3IFNlbmRlcihzb2NrZXQsIHRoaXMuX2V4dGVuc2lvbnMsIG9wdGlvbnMuZ2VuZXJhdGVNYXNrKTtcblxuICAgIHRoaXMuX3JlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgdGhpcy5fc2VuZGVyID0gc2VuZGVyO1xuICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcblxuICAgIHJlY2VpdmVyW2tXZWJTb2NrZXRdID0gdGhpcztcbiAgICBzZW5kZXJba1dlYlNvY2tldF0gPSB0aGlzO1xuICAgIHNvY2tldFtrV2ViU29ja2V0XSA9IHRoaXM7XG5cbiAgICByZWNlaXZlci5vbignY29uY2x1ZGUnLCByZWNlaXZlck9uQ29uY2x1ZGUpO1xuICAgIHJlY2VpdmVyLm9uKCdkcmFpbicsIHJlY2VpdmVyT25EcmFpbik7XG4gICAgcmVjZWl2ZXIub24oJ2Vycm9yJywgcmVjZWl2ZXJPbkVycm9yKTtcbiAgICByZWNlaXZlci5vbignbWVzc2FnZScsIHJlY2VpdmVyT25NZXNzYWdlKTtcbiAgICByZWNlaXZlci5vbigncGluZycsIHJlY2VpdmVyT25QaW5nKTtcbiAgICByZWNlaXZlci5vbigncG9uZycsIHJlY2VpdmVyT25Qb25nKTtcblxuICAgIHNlbmRlci5vbmVycm9yID0gc2VuZGVyT25FcnJvcjtcblxuICAgIC8vXG4gICAgLy8gVGhlc2UgbWV0aG9kcyBtYXkgbm90IGJlIGF2YWlsYWJsZSBpZiBgc29ja2V0YCBpcyBqdXN0IGEgYER1cGxleGAuXG4gICAgLy9cbiAgICBpZiAoc29ja2V0LnNldFRpbWVvdXQpIHNvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgIGlmIChzb2NrZXQuc2V0Tm9EZWxheSkgc29ja2V0LnNldE5vRGVsYXkoKTtcblxuICAgIGlmIChoZWFkLmxlbmd0aCA+IDApIHNvY2tldC51bnNoaWZ0KGhlYWQpO1xuXG4gICAgc29ja2V0Lm9uKCdjbG9zZScsIHNvY2tldE9uQ2xvc2UpO1xuICAgIHNvY2tldC5vbignZGF0YScsIHNvY2tldE9uRGF0YSk7XG4gICAgc29ja2V0Lm9uKCdlbmQnLCBzb2NrZXRPbkVuZCk7XG4gICAgc29ja2V0Lm9uKCdlcnJvcicsIHNvY2tldE9uRXJyb3IpO1xuXG4gICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5PUEVOO1xuICAgIHRoaXMuZW1pdCgnb3BlbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGAnY2xvc2UnYCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXRDbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX3NvY2tldCkge1xuICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TRUQ7XG4gICAgICB0aGlzLmVtaXQoJ2Nsb3NlJywgdGhpcy5fY2xvc2VDb2RlLCB0aGlzLl9jbG9zZU1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdKSB7XG4gICAgICB0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdLmNsZWFudXAoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWNlaXZlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NFRDtcbiAgICB0aGlzLmVtaXQoJ2Nsb3NlJywgdGhpcy5fY2xvc2VDb2RlLCB0aGlzLl9jbG9zZU1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgY2xvc2luZyBoYW5kc2hha2UuXG4gICAqXG4gICAqICAgICAgICAgICstLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLStcbiAgICogICAgIC0gLSAtfHdzLmNsb3NlKCl8LS0+fGNsb3NlIGZyYW1lfC0tPnx3cy5jbG9zZSgpfC0gLSAtXG4gICAqICAgIHwgICAgICstLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLSsgICAgIHxcbiAgICogICAgICAgICAgKy0tLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0tKyAgICAgICAgIHxcbiAgICogQ0xPU0lORyAgfHdzLmNsb3NlKCl8PC0tfGNsb3NlIGZyYW1lfDwtLSstLS0tLSsgICAgICAgQ0xPU0lOR1xuICAgKiAgICAgICAgICArLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0rICAgfFxuICAgKiAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICstLS0rICAgICAgICB8XG4gICAqICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0+fGZpbnwgLSAtIC0gLVxuICAgKiAgICB8ICAgICAgICAgKy0tLSsgICAgICAgICAgICAgICAgICAgICAgfCAgICstLS0rXG4gICAqICAgICAtIC0gLSAtIC18ZmlufDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICAqICAgICAgICAgICAgICArLS0tK1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2NvZGVdIFN0YXR1cyBjb2RlIGV4cGxhaW5pbmcgd2h5IHRoZSBjb25uZWN0aW9uIGlzIGNsb3NpbmdcbiAgICogQHBhcmFtIHsoU3RyaW5nfEJ1ZmZlcil9IFtkYXRhXSBUaGUgcmVhc29uIHdoeSB0aGUgY29ubmVjdGlvbiBpc1xuICAgKiAgICAgY2xvc2luZ1xuICAgKiBAcHVibGljXG4gICAqL1xuICBjbG9zZShjb2RlLCBkYXRhKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NFRCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICBjb25zdCBtc2cgPSAnV2ViU29ja2V0IHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCc7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh0aGlzLCB0aGlzLl9yZXEsIG1zZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NJTkcpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fY2xvc2VGcmFtZVNlbnQgJiZcbiAgICAgICAgKHRoaXMuX2Nsb3NlRnJhbWVSZWNlaXZlZCB8fCB0aGlzLl9yZWNlaXZlci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fc29ja2V0LmVuZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgIHRoaXMuX3NlbmRlci5jbG9zZShjb2RlLCBkYXRhLCAhdGhpcy5faXNTZXJ2ZXIsIChlcnIpID0+IHtcbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGVycm9yIGlzIGhhbmRsZWQgYnkgdGhlIGAnZXJyb3InYCBsaXN0ZW5lciBvbiB0aGUgc29ja2V0LiBXZSBvbmx5XG4gICAgICAvLyB3YW50IHRvIGtub3cgaWYgdGhlIGNsb3NlIGZyYW1lIGhhcyBiZWVuIHNlbnQgaGVyZS5cbiAgICAgIC8vXG4gICAgICBpZiAoZXJyKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX2Nsb3NlRnJhbWVTZW50ID0gdHJ1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgfHxcbiAgICAgICAgdGhpcy5fcmVjZWl2ZXIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fc29ja2V0LmVuZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0Q2xvc2VUaW1lcih0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB0aGUgc29ja2V0LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICBwYXVzZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HIHx8XG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRURcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xuICAgIHRoaXMuX3NvY2tldC5wYXVzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBwaW5nLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IFtkYXRhXSBUaGUgZGF0YSB0byBzZW5kXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW21hc2tdIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrIGBkYXRhYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrIHdoaWNoIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIHBpbmcgaXMgc2VudFxuICAgKiBAcHVibGljXG4gICAqL1xuICBwaW5nKGRhdGEsIG1hc2ssIGNiKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2ViU29ja2V0IGlzIG5vdCBvcGVuOiByZWFkeVN0YXRlIDAgKENPTk5FQ1RJTkcpJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IGRhdGE7XG4gICAgICBkYXRhID0gbWFzayA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtYXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IG1hc2s7XG4gICAgICBtYXNrID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgc2VuZEFmdGVyQ2xvc2UodGhpcywgZGF0YSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYXNrID09PSB1bmRlZmluZWQpIG1hc2sgPSAhdGhpcy5faXNTZXJ2ZXI7XG4gICAgdGhpcy5fc2VuZGVyLnBpbmcoZGF0YSB8fCBFTVBUWV9CVUZGRVIsIG1hc2ssIGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgcG9uZy5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBbZGF0YV0gVGhlIGRhdGEgdG8gc2VuZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrXSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFjayB3aGljaCBpcyBleGVjdXRlZCB3aGVuIHRoZSBwb25nIGlzIHNlbnRcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcG9uZyhkYXRhLCBtYXNrLCBjYikge1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAwIChDT05ORUNUSU5HKScpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBkYXRhO1xuICAgICAgZGF0YSA9IG1hc2sgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWFzayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBtYXNrO1xuICAgICAgbWFzayA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdudW1iZXInKSBkYXRhID0gZGF0YS50b1N0cmluZygpO1xuXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHNlbmRBZnRlckNsb3NlKHRoaXMsIGRhdGEsIGNiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobWFzayA9PT0gdW5kZWZpbmVkKSBtYXNrID0gIXRoaXMuX2lzU2VydmVyO1xuICAgIHRoaXMuX3NlbmRlci5wb25nKGRhdGEgfHwgRU1QVFlfQlVGRkVSLCBtYXNrLCBjYik7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIHRoZSBzb2NrZXQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHJlc3VtZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HIHx8XG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRURcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLm5lZWREcmFpbikgdGhpcy5fc29ja2V0LnJlc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBkYXRhIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWVzc2FnZSB0byBzZW5kXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5iaW5hcnldIFNwZWNpZmllcyB3aGV0aGVyIGBkYXRhYCBpcyBiaW5hcnkgb3JcbiAgICogICAgIHRleHRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jb21wcmVzc10gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGNvbXByZXNzXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5maW49dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZyYWdtZW50IGlzIHRoZVxuICAgKiAgICAgbGFzdCBvbmVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tYXNrXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFjayB3aGljaCBpcyBleGVjdXRlZCB3aGVuIGRhdGEgaXMgd3JpdHRlbiBvdXRcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2VuZChkYXRhLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAwIChDT05ORUNUSU5HKScpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgc2VuZEFmdGVyQ2xvc2UodGhpcywgZGF0YSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBiaW5hcnk6IHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJyxcbiAgICAgIG1hc2s6ICF0aGlzLl9pc1NlcnZlcixcbiAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgZmluOiB0cnVlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG5cbiAgICBpZiAoIXRoaXMuX2V4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0pIHtcbiAgICAgIG9wdHMuY29tcHJlc3MgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZW5kZXIuc2VuZChkYXRhIHx8IEVNUFRZX0JVRkZFUiwgb3B0cywgY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNpYmx5IGNsb3NlIHRoZSBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICB0ZXJtaW5hdGUoKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NFRCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICBjb25zdCBtc2cgPSAnV2ViU29ja2V0IHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCc7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh0aGlzLCB0aGlzLl9yZXEsIG1zZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3NvY2tldCkge1xuICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgICAgdGhpcy5fc29ja2V0LmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gQ09OTkVDVElOR1xuICogQG1lbWJlcm9mIFdlYlNvY2tldFxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0LCAnQ09OTkVDVElORycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ0NPTk5FQ1RJTkcnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENPTk5FQ1RJTkdcbiAqIEBtZW1iZXJvZiBXZWJTb2NrZXQucHJvdG90eXBlXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQucHJvdG90eXBlLCAnQ09OTkVDVElORycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ0NPTk5FQ1RJTkcnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IE9QRU5cbiAqIEBtZW1iZXJvZiBXZWJTb2NrZXRcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldCwgJ09QRU4nLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdPUEVOJylcbn0pO1xuXG4vKipcbiAqIEBjb25zdGFudCB7TnVtYmVyfSBPUEVOXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0LnByb3RvdHlwZVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0LnByb3RvdHlwZSwgJ09QRU4nLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdPUEVOJylcbn0pO1xuXG4vKipcbiAqIEBjb25zdGFudCB7TnVtYmVyfSBDTE9TSU5HXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQsICdDTE9TSU5HJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB2YWx1ZTogcmVhZHlTdGF0ZXMuaW5kZXhPZignQ0xPU0lORycpXG59KTtcblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gQ0xPU0lOR1xuICogQG1lbWJlcm9mIFdlYlNvY2tldC5wcm90b3R5cGVcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsICdDTE9TSU5HJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB2YWx1ZTogcmVhZHlTdGF0ZXMuaW5kZXhPZignQ0xPU0lORycpXG59KTtcblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gQ0xPU0VEXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQsICdDTE9TRUQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdDTE9TRUQnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENMT1NFRFxuICogQG1lbWJlcm9mIFdlYlNvY2tldC5wcm90b3R5cGVcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsICdDTE9TRUQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdDTE9TRUQnKVxufSk7XG5cbltcbiAgJ2JpbmFyeVR5cGUnLFxuICAnYnVmZmVyZWRBbW91bnQnLFxuICAnZXh0ZW5zaW9ucycsXG4gICdpc1BhdXNlZCcsXG4gICdwcm90b2NvbCcsXG4gICdyZWFkeVN0YXRlJyxcbiAgJ3VybCdcbl0uZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsIHByb3BlcnR5LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG59KTtcblxuLy9cbi8vIEFkZCB0aGUgYG9ub3BlbmAsIGBvbmVycm9yYCwgYG9uY2xvc2VgLCBhbmQgYG9ubWVzc2FnZWAgYXR0cmlidXRlcy5cbi8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jb21tcy5odG1sI3RoZS13ZWJzb2NrZXQtaW50ZXJmYWNlXG4vL1xuWydvcGVuJywgJ2Vycm9yJywgJ2Nsb3NlJywgJ21lc3NhZ2UnXS5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsIGBvbiR7bWV0aG9kfWAsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldCgpIHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMobWV0aG9kKSkge1xuICAgICAgICBpZiAobGlzdGVuZXJba0Zvck9uRXZlbnRBdHRyaWJ1dGVdKSByZXR1cm4gbGlzdGVuZXJba0xpc3RlbmVyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBzZXQoaGFuZGxlcikge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycyhtZXRob2QpKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lcltrRm9yT25FdmVudEF0dHJpYnV0ZV0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKG1ldGhvZCwgbGlzdGVuZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIobWV0aG9kLCBoYW5kbGVyLCB7XG4gICAgICAgIFtrRm9yT25FdmVudEF0dHJpYnV0ZV06IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59KTtcblxuV2ViU29ja2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcjtcbldlYlNvY2tldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IHJlbW92ZUV2ZW50TGlzdGVuZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gV2ViU29ja2V0O1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBXZWJTb2NrZXQgY2xpZW50LlxuICpcbiAqIEBwYXJhbSB7V2ViU29ja2V0fSB3ZWJzb2NrZXQgVGhlIGNsaWVudCB0byBpbml0aWFsaXplXG4gKiBAcGFyYW0geyhTdHJpbmd8VVJMKX0gYWRkcmVzcyBUaGUgVVJMIHRvIHdoaWNoIHRvIGNvbm5lY3RcbiAqIEBwYXJhbSB7QXJyYXl9IHByb3RvY29scyBUaGUgc3VicHJvdG9jb2xzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIENvbm5lY3Rpb24gb3B0aW9uc1xuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzPXRydWVdIFNwZWNpZmllcyB3aGV0aGVyIGFueVxuICogICAgIG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWQgbXVsdGlwbGVcbiAqICAgICB0aW1lcyBpbiB0aGUgc2FtZSB0aWNrXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmF1dG9Qb25nPXRydWVdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0b1xuICogICAgIGF1dG9tYXRpY2FsbHkgc2VuZCBhIHBvbmcgaW4gcmVzcG9uc2UgdG8gYSBwaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5maW5pc2hSZXF1ZXN0XSBBIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvXG4gKiAgICAgY3VzdG9taXplIHRoZSBoZWFkZXJzIG9mIGVhY2ggaHR0cCByZXF1ZXN0IGJlZm9yZSBpdCBpcyBzZW50XG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZvbGxvd1JlZGlyZWN0cz1mYWxzZV0gV2hldGhlciBvciBub3QgdG8gZm9sbG93XG4gKiAgICAgcmVkaXJlY3RzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5nZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZVxuICogICAgIG1hc2tpbmcga2V5XG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaGFuZHNoYWtlVGltZW91dF0gVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZVxuICogICAgIGhhbmRzaGFrZSByZXF1ZXN0XG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UGF5bG9hZD0xMDQ4NTc2MDBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZVxuICogICAgIHNpemVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhSZWRpcmVjdHM9MTBdIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZWRpcmVjdHNcbiAqICAgICBhbGxvd2VkXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMub3JpZ2luXSBWYWx1ZSBvZiB0aGUgYE9yaWdpbmAgb3JcbiAqICAgICBgU2VjLVdlYlNvY2tldC1PcmlnaW5gIGhlYWRlclxuICogQHBhcmFtIHsoQm9vbGVhbnxPYmplY3QpfSBbb3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZT10cnVlXSBFbmFibGUvZGlzYWJsZVxuICogICAgIHBlcm1lc3NhZ2UtZGVmbGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnByb3RvY29sVmVyc2lvbj0xM10gVmFsdWUgb2YgdGhlXG4gKiAgICAgYFNlYy1XZWJTb2NrZXQtVmVyc2lvbmAgaGVhZGVyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAqICAgICBub3QgdG8gc2tpcCBVVEYtOCB2YWxpZGF0aW9uIGZvciB0ZXh0IGFuZCBjbG9zZSBtZXNzYWdlc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaW5pdEFzQ2xpZW50KHdlYnNvY2tldCwgYWRkcmVzcywgcHJvdG9jb2xzLCBvcHRpb25zKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgYWxsb3dTeW5jaHJvbm91c0V2ZW50czogdHJ1ZSxcbiAgICBhdXRvUG9uZzogdHJ1ZSxcbiAgICBwcm90b2NvbFZlcnNpb246IHByb3RvY29sVmVyc2lvbnNbMV0sXG4gICAgbWF4UGF5bG9hZDogMTAwICogMTAyNCAqIDEwMjQsXG4gICAgc2tpcFVURjhWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICBwZXJNZXNzYWdlRGVmbGF0ZTogdHJ1ZSxcbiAgICBmb2xsb3dSZWRpcmVjdHM6IGZhbHNlLFxuICAgIG1heFJlZGlyZWN0czogMTAsXG4gICAgLi4ub3B0aW9ucyxcbiAgICBzb2NrZXRQYXRoOiB1bmRlZmluZWQsXG4gICAgaG9zdG5hbWU6IHVuZGVmaW5lZCxcbiAgICBwcm90b2NvbDogdW5kZWZpbmVkLFxuICAgIHRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIGhvc3Q6IHVuZGVmaW5lZCxcbiAgICBwYXRoOiB1bmRlZmluZWQsXG4gICAgcG9ydDogdW5kZWZpbmVkXG4gIH07XG5cbiAgd2Vic29ja2V0Ll9hdXRvUG9uZyA9IG9wdHMuYXV0b1Bvbmc7XG5cbiAgaWYgKCFwcm90b2NvbFZlcnNpb25zLmluY2x1ZGVzKG9wdHMucHJvdG9jb2xWZXJzaW9uKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIHByb3RvY29sIHZlcnNpb246ICR7b3B0cy5wcm90b2NvbFZlcnNpb259IGAgK1xuICAgICAgICBgKHN1cHBvcnRlZCB2ZXJzaW9uczogJHtwcm90b2NvbFZlcnNpb25zLmpvaW4oJywgJyl9KWBcbiAgICApO1xuICB9XG5cbiAgbGV0IHBhcnNlZFVybDtcblxuICBpZiAoYWRkcmVzcyBpbnN0YW5jZW9mIFVSTCkge1xuICAgIHBhcnNlZFVybCA9IGFkZHJlc3M7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZFVybCA9IG5ldyBVUkwoYWRkcmVzcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIFVSTDogJHthZGRyZXNzfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwOicpIHtcbiAgICBwYXJzZWRVcmwucHJvdG9jb2wgPSAnd3M6JztcbiAgfSBlbHNlIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgcGFyc2VkVXJsLnByb3RvY29sID0gJ3dzczonO1xuICB9XG5cbiAgd2Vic29ja2V0Ll91cmwgPSBwYXJzZWRVcmwuaHJlZjtcblxuICBjb25zdCBpc1NlY3VyZSA9IHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ3dzczonO1xuICBjb25zdCBpc0lwY1VybCA9IHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ3dzK3VuaXg6JztcbiAgbGV0IGludmFsaWRVcmxNZXNzYWdlO1xuXG4gIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgIT09ICd3czonICYmICFpc1NlY3VyZSAmJiAhaXNJcGNVcmwpIHtcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9XG4gICAgICAnVGhlIFVSTFxcJ3MgcHJvdG9jb2wgbXVzdCBiZSBvbmUgb2YgXCJ3czpcIiwgXCJ3c3M6XCIsICcgK1xuICAgICAgJ1wiaHR0cDpcIiwgXCJodHRwc1wiLCBvciBcIndzK3VuaXg6XCInO1xuICB9IGVsc2UgaWYgKGlzSXBjVXJsICYmICFwYXJzZWRVcmwucGF0aG5hbWUpIHtcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9IFwiVGhlIFVSTCdzIHBhdGhuYW1lIGlzIGVtcHR5XCI7XG4gIH0gZWxzZSBpZiAocGFyc2VkVXJsLmhhc2gpIHtcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9ICdUaGUgVVJMIGNvbnRhaW5zIGEgZnJhZ21lbnQgaWRlbnRpZmllcic7XG4gIH1cblxuICBpZiAoaW52YWxpZFVybE1lc3NhZ2UpIHtcbiAgICBjb25zdCBlcnIgPSBuZXcgU3ludGF4RXJyb3IoaW52YWxpZFVybE1lc3NhZ2UpO1xuXG4gICAgaWYgKHdlYnNvY2tldC5fcmVkaXJlY3RzID09PSAwKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXRFcnJvckFuZENsb3NlKHdlYnNvY2tldCwgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWZhdWx0UG9ydCA9IGlzU2VjdXJlID8gNDQzIDogODA7XG4gIGNvbnN0IGtleSA9IHJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIGNvbnN0IHJlcXVlc3QgPSBpc1NlY3VyZSA/IGh0dHBzLnJlcXVlc3QgOiBodHRwLnJlcXVlc3Q7XG4gIGNvbnN0IHByb3RvY29sU2V0ID0gbmV3IFNldCgpO1xuICBsZXQgcGVyTWVzc2FnZURlZmxhdGU7XG5cbiAgb3B0cy5jcmVhdGVDb25uZWN0aW9uID1cbiAgICBvcHRzLmNyZWF0ZUNvbm5lY3Rpb24gfHwgKGlzU2VjdXJlID8gdGxzQ29ubmVjdCA6IG5ldENvbm5lY3QpO1xuICBvcHRzLmRlZmF1bHRQb3J0ID0gb3B0cy5kZWZhdWx0UG9ydCB8fCBkZWZhdWx0UG9ydDtcbiAgb3B0cy5wb3J0ID0gcGFyc2VkVXJsLnBvcnQgfHwgZGVmYXVsdFBvcnQ7XG4gIG9wdHMuaG9zdCA9IHBhcnNlZFVybC5ob3N0bmFtZS5zdGFydHNXaXRoKCdbJylcbiAgICA/IHBhcnNlZFVybC5ob3N0bmFtZS5zbGljZSgxLCAtMSlcbiAgICA6IHBhcnNlZFVybC5ob3N0bmFtZTtcbiAgb3B0cy5oZWFkZXJzID0ge1xuICAgIC4uLm9wdHMuaGVhZGVycyxcbiAgICAnU2VjLVdlYlNvY2tldC1WZXJzaW9uJzogb3B0cy5wcm90b2NvbFZlcnNpb24sXG4gICAgJ1NlYy1XZWJTb2NrZXQtS2V5Jzoga2V5LFxuICAgIENvbm5lY3Rpb246ICdVcGdyYWRlJyxcbiAgICBVcGdyYWRlOiAnd2Vic29ja2V0J1xuICB9O1xuICBvcHRzLnBhdGggPSBwYXJzZWRVcmwucGF0aG5hbWUgKyBwYXJzZWRVcmwuc2VhcmNoO1xuICBvcHRzLnRpbWVvdXQgPSBvcHRzLmhhbmRzaGFrZVRpbWVvdXQ7XG5cbiAgaWYgKG9wdHMucGVyTWVzc2FnZURlZmxhdGUpIHtcbiAgICBwZXJNZXNzYWdlRGVmbGF0ZSA9IG5ldyBQZXJNZXNzYWdlRGVmbGF0ZShcbiAgICAgIG9wdHMucGVyTWVzc2FnZURlZmxhdGUgIT09IHRydWUgPyBvcHRzLnBlck1lc3NhZ2VEZWZsYXRlIDoge30sXG4gICAgICBmYWxzZSxcbiAgICAgIG9wdHMubWF4UGF5bG9hZFxuICAgICk7XG4gICAgb3B0cy5oZWFkZXJzWydTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMnXSA9IGZvcm1hdCh7XG4gICAgICBbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV06IHBlck1lc3NhZ2VEZWZsYXRlLm9mZmVyKClcbiAgICB9KTtcbiAgfVxuICBpZiAocHJvdG9jb2xzLmxlbmd0aCkge1xuICAgIGZvciAoY29uc3QgcHJvdG9jb2wgb2YgcHJvdG9jb2xzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBwcm90b2NvbCAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgIXN1YnByb3RvY29sUmVnZXgudGVzdChwcm90b2NvbCkgfHxcbiAgICAgICAgcHJvdG9jb2xTZXQuaGFzKHByb3RvY29sKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICAnQW4gaW52YWxpZCBvciBkdXBsaWNhdGVkIHN1YnByb3RvY29sIHdhcyBzcGVjaWZpZWQnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHByb3RvY29sU2V0LmFkZChwcm90b2NvbCk7XG4gICAgfVxuXG4gICAgb3B0cy5oZWFkZXJzWydTZWMtV2ViU29ja2V0LVByb3RvY29sJ10gPSBwcm90b2NvbHMuam9pbignLCcpO1xuICB9XG4gIGlmIChvcHRzLm9yaWdpbikge1xuICAgIGlmIChvcHRzLnByb3RvY29sVmVyc2lvbiA8IDEzKSB7XG4gICAgICBvcHRzLmhlYWRlcnNbJ1NlYy1XZWJTb2NrZXQtT3JpZ2luJ10gPSBvcHRzLm9yaWdpbjtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0cy5oZWFkZXJzLk9yaWdpbiA9IG9wdHMub3JpZ2luO1xuICAgIH1cbiAgfVxuICBpZiAocGFyc2VkVXJsLnVzZXJuYW1lIHx8IHBhcnNlZFVybC5wYXNzd29yZCkge1xuICAgIG9wdHMuYXV0aCA9IGAke3BhcnNlZFVybC51c2VybmFtZX06JHtwYXJzZWRVcmwucGFzc3dvcmR9YDtcbiAgfVxuXG4gIGlmIChpc0lwY1VybCkge1xuICAgIGNvbnN0IHBhcnRzID0gb3B0cy5wYXRoLnNwbGl0KCc6Jyk7XG5cbiAgICBvcHRzLnNvY2tldFBhdGggPSBwYXJ0c1swXTtcbiAgICBvcHRzLnBhdGggPSBwYXJ0c1sxXTtcbiAgfVxuXG4gIGxldCByZXE7XG5cbiAgaWYgKG9wdHMuZm9sbG93UmVkaXJlY3RzKSB7XG4gICAgaWYgKHdlYnNvY2tldC5fcmVkaXJlY3RzID09PSAwKSB7XG4gICAgICB3ZWJzb2NrZXQuX29yaWdpbmFsSXBjID0gaXNJcGNVcmw7XG4gICAgICB3ZWJzb2NrZXQuX29yaWdpbmFsU2VjdXJlID0gaXNTZWN1cmU7XG4gICAgICB3ZWJzb2NrZXQuX29yaWdpbmFsSG9zdE9yU29ja2V0UGF0aCA9IGlzSXBjVXJsXG4gICAgICAgID8gb3B0cy5zb2NrZXRQYXRoXG4gICAgICAgIDogcGFyc2VkVXJsLmhvc3Q7XG5cbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBvcHRpb25zICYmIG9wdGlvbnMuaGVhZGVycztcblxuICAgICAgLy9cbiAgICAgIC8vIFNoYWxsb3cgY29weSB0aGUgdXNlciBwcm92aWRlZCBvcHRpb25zIHNvIHRoYXQgaGVhZGVycyBjYW4gYmUgY2hhbmdlZFxuICAgICAgLy8gd2l0aG91dCBtdXRhdGluZyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgICAgLy9cbiAgICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIGhlYWRlcnM6IHt9IH07XG5cbiAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh3ZWJzb2NrZXQubGlzdGVuZXJDb3VudCgncmVkaXJlY3QnKSA9PT0gMCkge1xuICAgICAgY29uc3QgaXNTYW1lSG9zdCA9IGlzSXBjVXJsXG4gICAgICAgID8gd2Vic29ja2V0Ll9vcmlnaW5hbElwY1xuICAgICAgICAgID8gb3B0cy5zb2NrZXRQYXRoID09PSB3ZWJzb2NrZXQuX29yaWdpbmFsSG9zdE9yU29ja2V0UGF0aFxuICAgICAgICAgIDogZmFsc2VcbiAgICAgICAgOiB3ZWJzb2NrZXQuX29yaWdpbmFsSXBjXG4gICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgIDogcGFyc2VkVXJsLmhvc3QgPT09IHdlYnNvY2tldC5fb3JpZ2luYWxIb3N0T3JTb2NrZXRQYXRoO1xuXG4gICAgICBpZiAoIWlzU2FtZUhvc3QgfHwgKHdlYnNvY2tldC5fb3JpZ2luYWxTZWN1cmUgJiYgIWlzU2VjdXJlKSkge1xuICAgICAgICAvL1xuICAgICAgICAvLyBNYXRjaCBjdXJsIDcuNzcuMCBiZWhhdmlvciBhbmQgZHJvcCB0aGUgZm9sbG93aW5nIGhlYWRlcnMuIFRoZXNlXG4gICAgICAgIC8vIGhlYWRlcnMgYXJlIGFsc28gZHJvcHBlZCB3aGVuIGZvbGxvd2luZyBhIHJlZGlyZWN0IHRvIGEgc3ViZG9tYWluLlxuICAgICAgICAvL1xuICAgICAgICBkZWxldGUgb3B0cy5oZWFkZXJzLmF1dGhvcml6YXRpb247XG4gICAgICAgIGRlbGV0ZSBvcHRzLmhlYWRlcnMuY29va2llO1xuXG4gICAgICAgIGlmICghaXNTYW1lSG9zdCkgZGVsZXRlIG9wdHMuaGVhZGVycy5ob3N0O1xuXG4gICAgICAgIG9wdHMuYXV0aCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIE1hdGNoIGN1cmwgNy43Ny4wIGJlaGF2aW9yIGFuZCBtYWtlIHRoZSBmaXJzdCBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIHdpbi5cbiAgICAvLyBJZiB0aGUgYEF1dGhvcml6YXRpb25gIGhlYWRlciBpcyBzZXQsIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkbyBhcyBpdFxuICAgIC8vIHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICAgIC8vXG4gICAgaWYgKG9wdHMuYXV0aCAmJiAhb3B0aW9ucy5oZWFkZXJzLmF1dGhvcml6YXRpb24pIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5hdXRob3JpemF0aW9uID1cbiAgICAgICAgJ0Jhc2ljICcgKyBCdWZmZXIuZnJvbShvcHRzLmF1dGgpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICByZXEgPSB3ZWJzb2NrZXQuX3JlcSA9IHJlcXVlc3Qob3B0cyk7XG5cbiAgICBpZiAod2Vic29ja2V0Ll9yZWRpcmVjdHMpIHtcbiAgICAgIC8vXG4gICAgICAvLyBVbmxpa2Ugd2hhdCBpcyBkb25lIGZvciB0aGUgYCd1cGdyYWRlJ2AgZXZlbnQsIG5vIGVhcmx5IGV4aXQgaXNcbiAgICAgIC8vIHRyaWdnZXJlZCBoZXJlIGlmIHRoZSB1c2VyIGNhbGxzIGB3ZWJzb2NrZXQuY2xvc2UoKWAgb3JcbiAgICAgIC8vIGB3ZWJzb2NrZXQudGVybWluYXRlKClgIGZyb20gYSBsaXN0ZW5lciBvZiB0aGUgYCdyZWRpcmVjdCdgIGV2ZW50LiBUaGlzXG4gICAgICAvLyBpcyBiZWNhdXNlIHRoZSB1c2VyIGNhbiBhbHNvIGNhbGwgYHJlcXVlc3QuZGVzdHJveSgpYCB3aXRoIGFuIGVycm9yXG4gICAgICAvLyBiZWZvcmUgY2FsbGluZyBgd2Vic29ja2V0LmNsb3NlKClgIG9yIGB3ZWJzb2NrZXQudGVybWluYXRlKClgIGFuZCB0aGlzXG4gICAgICAvLyB3b3VsZCByZXN1bHQgaW4gYW4gZXJyb3IgYmVpbmcgZW1pdHRlZCBvbiB0aGUgYHJlcXVlc3RgIG9iamVjdCB3aXRoIG5vXG4gICAgICAvLyBgJ2Vycm9yJ2AgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkLlxuICAgICAgLy9cbiAgICAgIHdlYnNvY2tldC5lbWl0KCdyZWRpcmVjdCcsIHdlYnNvY2tldC51cmwsIHJlcSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlcSA9IHdlYnNvY2tldC5fcmVxID0gcmVxdWVzdChvcHRzKTtcbiAgfVxuXG4gIGlmIChvcHRzLnRpbWVvdXQpIHtcbiAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHJlcSwgJ09wZW5pbmcgaGFuZHNoYWtlIGhhcyB0aW1lZCBvdXQnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgaWYgKHJlcSA9PT0gbnVsbCB8fCByZXFba0Fib3J0ZWRdKSByZXR1cm47XG5cbiAgICByZXEgPSB3ZWJzb2NrZXQuX3JlcSA9IG51bGw7XG4gICAgZW1pdEVycm9yQW5kQ2xvc2Uod2Vic29ja2V0LCBlcnIpO1xuICB9KTtcblxuICByZXEub24oJ3Jlc3BvbnNlJywgKHJlcykgPT4ge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gcmVzLmhlYWRlcnMubG9jYXRpb247XG4gICAgY29uc3Qgc3RhdHVzQ29kZSA9IHJlcy5zdGF0dXNDb2RlO1xuXG4gICAgaWYgKFxuICAgICAgbG9jYXRpb24gJiZcbiAgICAgIG9wdHMuZm9sbG93UmVkaXJlY3RzICYmXG4gICAgICBzdGF0dXNDb2RlID49IDMwMCAmJlxuICAgICAgc3RhdHVzQ29kZSA8IDQwMFxuICAgICkge1xuICAgICAgaWYgKCsrd2Vic29ja2V0Ll9yZWRpcmVjdHMgPiBvcHRzLm1heFJlZGlyZWN0cykge1xuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHJlcSwgJ01heGltdW0gcmVkaXJlY3RzIGV4Y2VlZGVkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVxLmFib3J0KCk7XG5cbiAgICAgIGxldCBhZGRyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhZGRyID0gbmV3IFVSTChsb2NhdGlvbiwgYWRkcmVzcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBVUkw6ICR7bG9jYXRpb259YCk7XG4gICAgICAgIGVtaXRFcnJvckFuZENsb3NlKHdlYnNvY2tldCwgZXJyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpbml0QXNDbGllbnQod2Vic29ja2V0LCBhZGRyLCBwcm90b2NvbHMsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXdlYnNvY2tldC5lbWl0KCd1bmV4cGVjdGVkLXJlc3BvbnNlJywgcmVxLCByZXMpKSB7XG4gICAgICBhYm9ydEhhbmRzaGFrZShcbiAgICAgICAgd2Vic29ja2V0LFxuICAgICAgICByZXEsXG4gICAgICAgIGBVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZTogJHtyZXMuc3RhdHVzQ29kZX1gXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmVxLm9uKCd1cGdyYWRlJywgKHJlcywgc29ja2V0LCBoZWFkKSA9PiB7XG4gICAgd2Vic29ja2V0LmVtaXQoJ3VwZ3JhZGUnLCByZXMpO1xuXG4gICAgLy9cbiAgICAvLyBUaGUgdXNlciBtYXkgaGF2ZSBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gZnJvbSBhIGxpc3RlbmVyIG9mIHRoZVxuICAgIC8vIGAndXBncmFkZSdgIGV2ZW50LlxuICAgIC8vXG4gICAgaWYgKHdlYnNvY2tldC5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuQ09OTkVDVElORykgcmV0dXJuO1xuXG4gICAgcmVxID0gd2Vic29ja2V0Ll9yZXEgPSBudWxsO1xuXG4gICAgY29uc3QgdXBncmFkZSA9IHJlcy5oZWFkZXJzLnVwZ3JhZGU7XG5cbiAgICBpZiAodXBncmFkZSA9PT0gdW5kZWZpbmVkIHx8IHVwZ3JhZGUudG9Mb3dlckNhc2UoKSAhPT0gJ3dlYnNvY2tldCcpIHtcbiAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCAnSW52YWxpZCBVcGdyYWRlIGhlYWRlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goJ3NoYTEnKVxuICAgICAgLnVwZGF0ZShrZXkgKyBHVUlEKVxuICAgICAgLmRpZ2VzdCgnYmFzZTY0Jyk7XG5cbiAgICBpZiAocmVzLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQtYWNjZXB0J10gIT09IGRpZ2VzdCkge1xuICAgICAgYWJvcnRIYW5kc2hha2Uod2Vic29ja2V0LCBzb2NrZXQsICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtQWNjZXB0IGhlYWRlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZlclByb3QgPSByZXMuaGVhZGVyc1snc2VjLXdlYnNvY2tldC1wcm90b2NvbCddO1xuICAgIGxldCBwcm90RXJyb3I7XG5cbiAgICBpZiAoc2VydmVyUHJvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIXByb3RvY29sU2V0LnNpemUpIHtcbiAgICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IGEgc3VicHJvdG9jb2wgYnV0IG5vbmUgd2FzIHJlcXVlc3RlZCc7XG4gICAgICB9IGVsc2UgaWYgKCFwcm90b2NvbFNldC5oYXMoc2VydmVyUHJvdCkpIHtcbiAgICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IGFuIGludmFsaWQgc3VicHJvdG9jb2wnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvdG9jb2xTZXQuc2l6ZSkge1xuICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IG5vIHN1YnByb3RvY29sJztcbiAgICB9XG5cbiAgICBpZiAocHJvdEVycm9yKSB7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgcHJvdEVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VydmVyUHJvdCkgd2Vic29ja2V0Ll9wcm90b2NvbCA9IHNlcnZlclByb3Q7XG5cbiAgICBjb25zdCBzZWNXZWJTb2NrZXRFeHRlbnNpb25zID0gcmVzLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQtZXh0ZW5zaW9ucyddO1xuXG4gICAgaWYgKHNlY1dlYlNvY2tldEV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFwZXJNZXNzYWdlRGVmbGF0ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgICAnU2VydmVyIHNlbnQgYSBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMgaGVhZGVyIGJ1dCBubyBleHRlbnNpb24gJyArXG4gICAgICAgICAgJ3dhcyByZXF1ZXN0ZWQnO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGV4dGVuc2lvbnM7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGV4dGVuc2lvbnMgPSBwYXJzZShzZWNXZWJTb2NrZXRFeHRlbnNpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIGhlYWRlcic7XG4gICAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCBtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRlbnNpb25OYW1lcyA9IE9iamVjdC5rZXlzKGV4dGVuc2lvbnMpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGV4dGVuc2lvbk5hbWVzLmxlbmd0aCAhPT0gMSB8fFxuICAgICAgICBleHRlbnNpb25OYW1lc1swXSAhPT0gUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnU2VydmVyIGluZGljYXRlZCBhbiBleHRlbnNpb24gdGhhdCB3YXMgbm90IHJlcXVlc3RlZCc7XG4gICAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCBtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBwZXJNZXNzYWdlRGVmbGF0ZS5hY2NlcHQoZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyBoZWFkZXInO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2Vic29ja2V0Ll9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdID1cbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGU7XG4gICAgfVxuXG4gICAgd2Vic29ja2V0LnNldFNvY2tldChzb2NrZXQsIGhlYWQsIHtcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IG9wdHMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cyxcbiAgICAgIGdlbmVyYXRlTWFzazogb3B0cy5nZW5lcmF0ZU1hc2ssXG4gICAgICBtYXhQYXlsb2FkOiBvcHRzLm1heFBheWxvYWQsXG4gICAgICBza2lwVVRGOFZhbGlkYXRpb246IG9wdHMuc2tpcFVURjhWYWxpZGF0aW9uXG4gICAgfSk7XG4gIH0pO1xuXG4gIGlmIChvcHRzLmZpbmlzaFJlcXVlc3QpIHtcbiAgICBvcHRzLmZpbmlzaFJlcXVlc3QocmVxLCB3ZWJzb2NrZXQpO1xuICB9IGVsc2Uge1xuICAgIHJlcS5lbmQoKTtcbiAgfVxufVxuXG4vKipcbiAqIEVtaXQgdGhlIGAnZXJyb3InYCBhbmQgYCdjbG9zZSdgIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7RXJyb3J9IFRoZSBlcnJvciB0byBlbWl0XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBlbWl0RXJyb3JBbmRDbG9zZSh3ZWJzb2NrZXQsIGVycikge1xuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcbiAgLy9cbiAgLy8gVGhlIGZvbGxvd2luZyBhc3NpZ25tZW50IGlzIHByYWN0aWNhbGx5IHVzZWxlc3MgYW5kIGlzIGRvbmUgb25seSBmb3JcbiAgLy8gY29uc2lzdGVuY3kuXG4gIC8vXG4gIHdlYnNvY2tldC5fZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgd2Vic29ja2V0LmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgd2Vic29ja2V0LmVtaXRDbG9zZSgpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGBuZXQuU29ja2V0YCBhbmQgaW5pdGlhdGUgYSBjb25uZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIENvbm5lY3Rpb24gb3B0aW9uc1xuICogQHJldHVybiB7bmV0LlNvY2tldH0gVGhlIG5ld2x5IGNyZWF0ZWQgc29ja2V0IHVzZWQgdG8gc3RhcnQgdGhlIGNvbm5lY3Rpb25cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG5ldENvbm5lY3Qob3B0aW9ucykge1xuICBvcHRpb25zLnBhdGggPSBvcHRpb25zLnNvY2tldFBhdGg7XG4gIHJldHVybiBuZXQuY29ubmVjdChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgdGxzLlRMU1NvY2tldGAgYW5kIGluaXRpYXRlIGEgY29ubmVjdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBDb25uZWN0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm4ge3Rscy5UTFNTb2NrZXR9IFRoZSBuZXdseSBjcmVhdGVkIHNvY2tldCB1c2VkIHRvIHN0YXJ0IHRoZSBjb25uZWN0aW9uXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0bHNDb25uZWN0KG9wdGlvbnMpIHtcbiAgb3B0aW9ucy5wYXRoID0gdW5kZWZpbmVkO1xuXG4gIGlmICghb3B0aW9ucy5zZXJ2ZXJuYW1lICYmIG9wdGlvbnMuc2VydmVybmFtZSAhPT0gJycpIHtcbiAgICBvcHRpb25zLnNlcnZlcm5hbWUgPSBuZXQuaXNJUChvcHRpb25zLmhvc3QpID8gJycgOiBvcHRpb25zLmhvc3Q7XG4gIH1cblxuICByZXR1cm4gdGxzLmNvbm5lY3Qob3B0aW9ucyk7XG59XG5cbi8qKlxuICogQWJvcnQgdGhlIGhhbmRzaGFrZSBhbmQgZW1pdCBhbiBlcnJvci5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7KGh0dHAuQ2xpZW50UmVxdWVzdHxuZXQuU29ja2V0fHRscy5Tb2NrZXQpfSBzdHJlYW0gVGhlIHJlcXVlc3QgdG9cbiAqICAgICBhYm9ydCBvciB0aGUgc29ja2V0IHRvIGRlc3Ryb3lcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHN0cmVhbSwgbWVzc2FnZSkge1xuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcblxuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgYWJvcnRIYW5kc2hha2UpO1xuXG4gIGlmIChzdHJlYW0uc2V0SGVhZGVyKSB7XG4gICAgc3RyZWFtW2tBYm9ydGVkXSA9IHRydWU7XG4gICAgc3RyZWFtLmFib3J0KCk7XG5cbiAgICBpZiAoc3RyZWFtLnNvY2tldCAmJiAhc3RyZWFtLnNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIC8vXG4gICAgICAvLyBPbiBOb2RlLmpzID49IDE0LjMuMCBgcmVxdWVzdC5hYm9ydCgpYCBkb2VzIG5vdCBkZXN0cm95IHRoZSBzb2NrZXQgaWZcbiAgICAgIC8vIGNhbGxlZCBhZnRlciB0aGUgcmVxdWVzdCBjb21wbGV0ZWQuIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvaXNzdWVzLzE4NjkuXG4gICAgICAvL1xuICAgICAgc3RyZWFtLnNvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JBbmRDbG9zZSwgd2Vic29ja2V0LCBlcnIpO1xuICB9IGVsc2Uge1xuICAgIHN0cmVhbS5kZXN0cm95KGVycik7XG4gICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgd2Vic29ja2V0LmVtaXQuYmluZCh3ZWJzb2NrZXQsICdlcnJvcicpKTtcbiAgICBzdHJlYW0ub25jZSgnY2xvc2UnLCB3ZWJzb2NrZXQuZW1pdENsb3NlLmJpbmQod2Vic29ja2V0KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgY2FzZXMgd2hlcmUgdGhlIGBwaW5nKClgLCBgcG9uZygpYCwgb3IgYHNlbmQoKWAgbWV0aG9kcyBhcmUgY2FsbGVkXG4gKiB3aGVuIHRoZSBgcmVhZHlTdGF0ZWAgYXR0cmlidXRlIGlzIGBDTE9TSU5HYCBvciBgQ0xPU0VEYC5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Kn0gW2RhdGFdIFRoZSBkYXRhIHRvIHNlbmRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNlbmRBZnRlckNsb3NlKHdlYnNvY2tldCwgZGF0YSwgY2IpIHtcbiAgaWYgKGRhdGEpIHtcbiAgICBjb25zdCBsZW5ndGggPSBpc0Jsb2IoZGF0YSkgPyBkYXRhLnNpemUgOiB0b0J1ZmZlcihkYXRhKS5sZW5ndGg7XG5cbiAgICAvL1xuICAgIC8vIFRoZSBgX2J1ZmZlcmVkQW1vdW50YCBwcm9wZXJ0eSBpcyB1c2VkIG9ubHkgd2hlbiB0aGUgcGVlciBpcyBhIGNsaWVudCBhbmRcbiAgICAvLyB0aGUgb3BlbmluZyBoYW5kc2hha2UgZmFpbHMuIFVuZGVyIHRoZXNlIGNpcmN1bXN0YW5jZXMsIGluIGZhY3QsIHRoZVxuICAgIC8vIGBzZXRTb2NrZXQoKWAgbWV0aG9kIGlzIG5vdCBjYWxsZWQsIHNvIHRoZSBgX3NvY2tldGAgYW5kIGBfc2VuZGVyYFxuICAgIC8vIHByb3BlcnRpZXMgYXJlIHNldCB0byBgbnVsbGAuXG4gICAgLy9cbiAgICBpZiAod2Vic29ja2V0Ll9zb2NrZXQpIHdlYnNvY2tldC5fc2VuZGVyLl9idWZmZXJlZEJ5dGVzICs9IGxlbmd0aDtcbiAgICBlbHNlIHdlYnNvY2tldC5fYnVmZmVyZWRBbW91bnQgKz0gbGVuZ3RoO1xuICB9XG5cbiAgaWYgKGNiKSB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgYFdlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAke3dlYnNvY2tldC5yZWFkeVN0YXRlfSBgICtcbiAgICAgICAgYCgke3JlYWR5U3RhdGVzW3dlYnNvY2tldC5yZWFkeVN0YXRlXX0pYFxuICAgICk7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXJyKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYFJlY2VpdmVyYCBgJ2NvbmNsdWRlJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGUgVGhlIHN0YXR1cyBjb2RlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gcmVhc29uIFRoZSByZWFzb24gZm9yIGNsb3NpbmdcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25Db25jbHVkZShjb2RlLCByZWFzb24pIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICB3ZWJzb2NrZXQuX2Nsb3NlRnJhbWVSZWNlaXZlZCA9IHRydWU7XG4gIHdlYnNvY2tldC5fY2xvc2VNZXNzYWdlID0gcmVhc29uO1xuICB3ZWJzb2NrZXQuX2Nsb3NlQ29kZSA9IGNvZGU7XG5cbiAgaWYgKHdlYnNvY2tldC5fc29ja2V0W2tXZWJTb2NrZXRdID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICB3ZWJzb2NrZXQuX3NvY2tldC5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHNvY2tldE9uRGF0YSk7XG4gIHByb2Nlc3MubmV4dFRpY2socmVzdW1lLCB3ZWJzb2NrZXQuX3NvY2tldCk7XG5cbiAgaWYgKGNvZGUgPT09IDEwMDUpIHdlYnNvY2tldC5jbG9zZSgpO1xuICBlbHNlIHdlYnNvY2tldC5jbG9zZShjb2RlLCByZWFzb24pO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYFJlY2VpdmVyYCBgJ2RyYWluJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZXJPbkRyYWluKCkge1xuICBjb25zdCB3ZWJzb2NrZXQgPSB0aGlzW2tXZWJTb2NrZXRdO1xuXG4gIGlmICghd2Vic29ja2V0LmlzUGF1c2VkKSB3ZWJzb2NrZXQuX3NvY2tldC5yZXN1bWUoKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFJhbmdlRXJyb3J8RXJyb3IpfSBlcnIgVGhlIGVtaXR0ZWQgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25FcnJvcihlcnIpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICBpZiAod2Vic29ja2V0Ll9zb2NrZXRba1dlYlNvY2tldF0gIT09IHVuZGVmaW5lZCkge1xuICAgIHdlYnNvY2tldC5fc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgc29ja2V0T25EYXRhKTtcblxuICAgIC8vXG4gICAgLy8gT24gTm9kZS5qcyA8IDE0LjAuMCB0aGUgYCdlcnJvcidgIGV2ZW50IGlzIGVtaXR0ZWQgc3luY2hyb25vdXNseS4gU2VlXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvaXNzdWVzLzE5NDAuXG4gICAgLy9cbiAgICBwcm9jZXNzLm5leHRUaWNrKHJlc3VtZSwgd2Vic29ja2V0Ll9zb2NrZXQpO1xuXG4gICAgd2Vic29ja2V0LmNsb3NlKGVycltrU3RhdHVzQ29kZV0pO1xuICB9XG5cbiAgaWYgKCF3ZWJzb2NrZXQuX2Vycm9yRW1pdHRlZCkge1xuICAgIHdlYnNvY2tldC5fZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICB3ZWJzb2NrZXQuZW1pdCgnZXJyb3InLCBlcnIpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgUmVjZWl2ZXJgIGAnZmluaXNoJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZXJPbkZpbmlzaCgpIHtcbiAgdGhpc1trV2ViU29ja2V0XS5lbWl0Q2xvc2UoKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdtZXNzYWdlJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ8QXJyYXlCdWZmZXJ8QnVmZmVyW10pfSBkYXRhIFRoZSBtZXNzYWdlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzQmluYXJ5IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGJpbmFyeSBvciBub3RcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25NZXNzYWdlKGRhdGEsIGlzQmluYXJ5KSB7XG4gIHRoaXNba1dlYlNvY2tldF0uZW1pdCgnbWVzc2FnZScsIGRhdGEsIGlzQmluYXJ5KTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdwaW5nJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgVGhlIGRhdGEgaW5jbHVkZWQgaW4gdGhlIHBpbmcgZnJhbWVcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25QaW5nKGRhdGEpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICBpZiAod2Vic29ja2V0Ll9hdXRvUG9uZykgd2Vic29ja2V0LnBvbmcoZGF0YSwgIXRoaXMuX2lzU2VydmVyLCBOT09QKTtcbiAgd2Vic29ja2V0LmVtaXQoJ3BpbmcnLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdwb25nJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgVGhlIGRhdGEgaW5jbHVkZWQgaW4gdGhlIHBvbmcgZnJhbWVcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25Qb25nKGRhdGEpIHtcbiAgdGhpc1trV2ViU29ja2V0XS5lbWl0KCdwb25nJywgZGF0YSk7XG59XG5cbi8qKlxuICogUmVzdW1lIGEgcmVhZGFibGUgc3RyZWFtXG4gKlxuICogQHBhcmFtIHtSZWFkYWJsZX0gc3RyZWFtIFRoZSByZWFkYWJsZSBzdHJlYW1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0pIHtcbiAgc3RyZWFtLnJlc3VtZSgpO1xufVxuXG4vKipcbiAqIFRoZSBgU2VuZGVyYCBlcnJvciBldmVudCBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IFRoZSBlcnJvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2VuZGVyT25FcnJvcihlcnIpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICBpZiAod2Vic29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRUQpIHJldHVybjtcbiAgaWYgKHdlYnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgIHdlYnNvY2tldC5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgIHNldENsb3NlVGltZXIod2Vic29ja2V0KTtcbiAgfVxuXG4gIC8vXG4gIC8vIGBzb2NrZXQuZW5kKClgIGlzIHVzZWQgaW5zdGVhZCBvZiBgc29ja2V0LmRlc3Ryb3koKWAgdG8gYWxsb3cgdGhlIG90aGVyXG4gIC8vIHBlZXIgdG8gZmluaXNoIHNlbmRpbmcgcXVldWVkIGRhdGEuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IGEgdGltZXIgaGVyZVxuICAvLyBiZWNhdXNlIGBDTE9TSU5HYCBtZWFucyB0aGF0IGl0IGlzIGFscmVhZHkgc2V0IG9yIG5vdCBuZWVkZWQuXG4gIC8vXG4gIHRoaXMuX3NvY2tldC5lbmQoKTtcblxuICBpZiAoIXdlYnNvY2tldC5fZXJyb3JFbWl0dGVkKSB7XG4gICAgd2Vic29ja2V0Ll9lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHdlYnNvY2tldC5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYSB0aW1lciB0byBkZXN0cm95IHRoZSB1bmRlcmx5aW5nIHJhdyBzb2NrZXQgb2YgYSBXZWJTb2NrZXQuXG4gKlxuICogQHBhcmFtIHtXZWJTb2NrZXR9IHdlYnNvY2tldCBUaGUgV2ViU29ja2V0IGluc3RhbmNlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXRDbG9zZVRpbWVyKHdlYnNvY2tldCkge1xuICB3ZWJzb2NrZXQuX2Nsb3NlVGltZXIgPSBzZXRUaW1lb3V0KFxuICAgIHdlYnNvY2tldC5fc29ja2V0LmRlc3Ryb3kuYmluZCh3ZWJzb2NrZXQuX3NvY2tldCksXG4gICAgY2xvc2VUaW1lb3V0XG4gICk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBzb2NrZXQgYCdjbG9zZSdgIGV2ZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNvY2tldE9uQ2xvc2UoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XG5cbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBzb2NrZXRPbkNsb3NlKTtcbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHNvY2tldE9uRGF0YSk7XG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHNvY2tldE9uRW5kKTtcblxuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcblxuICBsZXQgY2h1bms7XG5cbiAgLy9cbiAgLy8gVGhlIGNsb3NlIGZyYW1lIG1pZ2h0IG5vdCBoYXZlIGJlZW4gcmVjZWl2ZWQgb3IgdGhlIGAnZW5kJ2AgZXZlbnQgZW1pdHRlZCxcbiAgLy8gZm9yIGV4YW1wbGUsIGlmIHRoZSBzb2NrZXQgd2FzIGRlc3Ryb3llZCBkdWUgdG8gYW4gZXJyb3IuIEVuc3VyZSB0aGF0IHRoZVxuICAvLyBgcmVjZWl2ZXJgIHN0cmVhbSBpcyBjbG9zZWQgYWZ0ZXIgd3JpdGluZyBhbnkgcmVtYWluaW5nIGJ1ZmZlcmVkIGRhdGEgdG9cbiAgLy8gaXQuIElmIHRoZSByZWFkYWJsZSBzaWRlIG9mIHRoZSBzb2NrZXQgaXMgaW4gZmxvd2luZyBtb2RlIHRoZW4gdGhlcmUgaXMgbm9cbiAgLy8gYnVmZmVyZWQgZGF0YSBhcyBldmVyeXRoaW5nIGhhcyBiZWVuIGFscmVhZHkgd3JpdHRlbiBhbmQgYHJlYWRhYmxlLnJlYWQoKWBcbiAgLy8gd2lsbCByZXR1cm4gYG51bGxgLiBJZiBpbnN0ZWFkLCB0aGUgc29ja2V0IGlzIHBhdXNlZCwgYW55IHBvc3NpYmxlIGJ1ZmZlcmVkXG4gIC8vIGRhdGEgd2lsbCBiZSByZWFkIGFzIGEgc2luZ2xlIGNodW5rLlxuICAvL1xuICBpZiAoXG4gICAgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCAmJlxuICAgICF3ZWJzb2NrZXQuX2Nsb3NlRnJhbWVSZWNlaXZlZCAmJlxuICAgICF3ZWJzb2NrZXQuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCAmJlxuICAgIChjaHVuayA9IHdlYnNvY2tldC5fc29ja2V0LnJlYWQoKSkgIT09IG51bGxcbiAgKSB7XG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci53cml0ZShjaHVuayk7XG4gIH1cblxuICB3ZWJzb2NrZXQuX3JlY2VpdmVyLmVuZCgpO1xuXG4gIHRoaXNba1dlYlNvY2tldF0gPSB1bmRlZmluZWQ7XG5cbiAgY2xlYXJUaW1lb3V0KHdlYnNvY2tldC5fY2xvc2VUaW1lcik7XG5cbiAgaWYgKFxuICAgIHdlYnNvY2tldC5fcmVjZWl2ZXIuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgfHxcbiAgICB3ZWJzb2NrZXQuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZFxuICApIHtcbiAgICB3ZWJzb2NrZXQuZW1pdENsb3NlKCk7XG4gIH0gZWxzZSB7XG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci5vbignZXJyb3InLCByZWNlaXZlck9uRmluaXNoKTtcbiAgICB3ZWJzb2NrZXQuX3JlY2VpdmVyLm9uKCdmaW5pc2gnLCByZWNlaXZlck9uRmluaXNoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgc29ja2V0IGAnZGF0YSdgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBjaHVuayBBIGNodW5rIG9mIGRhdGFcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNvY2tldE9uRGF0YShjaHVuaykge1xuICBpZiAoIXRoaXNba1dlYlNvY2tldF0uX3JlY2VpdmVyLndyaXRlKGNodW5rKSkge1xuICAgIHRoaXMucGF1c2UoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgc29ja2V0IGAnZW5kJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc29ja2V0T25FbmQoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XG5cbiAgd2Vic29ja2V0Ll9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NJTkc7XG4gIHdlYnNvY2tldC5fcmVjZWl2ZXIuZW5kKCk7XG4gIHRoaXMuZW5kKCk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBzb2NrZXQgYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNvY2tldE9uRXJyb3IoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XG5cbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBzb2NrZXRPbkVycm9yKTtcbiAgdGhpcy5vbignZXJyb3InLCBOT09QKTtcblxuICBpZiAod2Vic29ja2V0KSB7XG4gICAgd2Vic29ja2V0Ll9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NJTkc7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0J1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoWWFsbGlzdCkge1xuICBZYWxsaXN0LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24qICgpIHtcbiAgICBmb3IgKGxldCB3YWxrZXIgPSB0aGlzLmhlYWQ7IHdhbGtlcjsgd2Fsa2VyID0gd2Fsa2VyLm5leHQpIHtcbiAgICAgIHlpZWxkIHdhbGtlci52YWx1ZVxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5tb2R1bGUuZXhwb3J0cyA9IFlhbGxpc3RcblxuWWFsbGlzdC5Ob2RlID0gTm9kZVxuWWFsbGlzdC5jcmVhdGUgPSBZYWxsaXN0XG5cbmZ1bmN0aW9uIFlhbGxpc3QgKGxpc3QpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmICghKHNlbGYgaW5zdGFuY2VvZiBZYWxsaXN0KSkge1xuICAgIHNlbGYgPSBuZXcgWWFsbGlzdCgpXG4gIH1cblxuICBzZWxmLnRhaWwgPSBudWxsXG4gIHNlbGYuaGVhZCA9IG51bGxcbiAgc2VsZi5sZW5ndGggPSAwXG5cbiAgaWYgKGxpc3QgJiYgdHlwZW9mIGxpc3QuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgc2VsZi5wdXNoKGl0ZW0pXG4gICAgfSlcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgc2VsZi5wdXNoKGFyZ3VtZW50c1tpXSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VsZlxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5yZW1vdmVOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgaWYgKG5vZGUubGlzdCAhPT0gdGhpcykge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVtb3Zpbmcgbm9kZSB3aGljaCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBsaXN0JylcbiAgfVxuXG4gIHZhciBuZXh0ID0gbm9kZS5uZXh0XG4gIHZhciBwcmV2ID0gbm9kZS5wcmV2XG5cbiAgaWYgKG5leHQpIHtcbiAgICBuZXh0LnByZXYgPSBwcmV2XG4gIH1cblxuICBpZiAocHJldikge1xuICAgIHByZXYubmV4dCA9IG5leHRcbiAgfVxuXG4gIGlmIChub2RlID09PSB0aGlzLmhlYWQpIHtcbiAgICB0aGlzLmhlYWQgPSBuZXh0XG4gIH1cbiAgaWYgKG5vZGUgPT09IHRoaXMudGFpbCkge1xuICAgIHRoaXMudGFpbCA9IHByZXZcbiAgfVxuXG4gIG5vZGUubGlzdC5sZW5ndGgtLVxuICBub2RlLm5leHQgPSBudWxsXG4gIG5vZGUucHJldiA9IG51bGxcbiAgbm9kZS5saXN0ID0gbnVsbFxuXG4gIHJldHVybiBuZXh0XG59XG5cbllhbGxpc3QucHJvdG90eXBlLnVuc2hpZnROb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IHRoaXMuaGVhZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKG5vZGUubGlzdCkge1xuICAgIG5vZGUubGlzdC5yZW1vdmVOb2RlKG5vZGUpXG4gIH1cblxuICB2YXIgaGVhZCA9IHRoaXMuaGVhZFxuICBub2RlLmxpc3QgPSB0aGlzXG4gIG5vZGUubmV4dCA9IGhlYWRcbiAgaWYgKGhlYWQpIHtcbiAgICBoZWFkLnByZXYgPSBub2RlXG4gIH1cblxuICB0aGlzLmhlYWQgPSBub2RlXG4gIGlmICghdGhpcy50YWlsKSB7XG4gICAgdGhpcy50YWlsID0gbm9kZVxuICB9XG4gIHRoaXMubGVuZ3RoKytcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucHVzaE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICBpZiAobm9kZSA9PT0gdGhpcy50YWlsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAobm9kZS5saXN0KSB7XG4gICAgbm9kZS5saXN0LnJlbW92ZU5vZGUobm9kZSlcbiAgfVxuXG4gIHZhciB0YWlsID0gdGhpcy50YWlsXG4gIG5vZGUubGlzdCA9IHRoaXNcbiAgbm9kZS5wcmV2ID0gdGFpbFxuICBpZiAodGFpbCkge1xuICAgIHRhaWwubmV4dCA9IG5vZGVcbiAgfVxuXG4gIHRoaXMudGFpbCA9IG5vZGVcbiAgaWYgKCF0aGlzLmhlYWQpIHtcbiAgICB0aGlzLmhlYWQgPSBub2RlXG4gIH1cbiAgdGhpcy5sZW5ndGgrK1xufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBwdXNoKHRoaXMsIGFyZ3VtZW50c1tpXSlcbiAgfVxuICByZXR1cm4gdGhpcy5sZW5ndGhcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdW5zaGlmdCh0aGlzLCBhcmd1bWVudHNbaV0pXG4gIH1cbiAgcmV0dXJuIHRoaXMubGVuZ3RoXG59XG5cbllhbGxpc3QucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLnRhaWwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICB2YXIgcmVzID0gdGhpcy50YWlsLnZhbHVlXG4gIHRoaXMudGFpbCA9IHRoaXMudGFpbC5wcmV2XG4gIGlmICh0aGlzLnRhaWwpIHtcbiAgICB0aGlzLnRhaWwubmV4dCA9IG51bGxcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmhlYWQgPSBudWxsXG4gIH1cbiAgdGhpcy5sZW5ndGgtLVxuICByZXR1cm4gcmVzXG59XG5cbllhbGxpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuaGVhZCkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHZhciByZXMgPSB0aGlzLmhlYWQudmFsdWVcbiAgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHRcbiAgaWYgKHRoaXMuaGVhZCkge1xuICAgIHRoaXMuaGVhZC5wcmV2ID0gbnVsbFxuICB9IGVsc2Uge1xuICAgIHRoaXMudGFpbCA9IG51bGxcbiAgfVxuICB0aGlzLmxlbmd0aC0tXG4gIHJldHVybiByZXNcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChmbiwgdGhpc3ApIHtcbiAgdGhpc3AgPSB0aGlzcCB8fCB0aGlzXG4gIGZvciAodmFyIHdhbGtlciA9IHRoaXMuaGVhZCwgaSA9IDA7IHdhbGtlciAhPT0gbnVsbDsgaSsrKSB7XG4gICAgZm4uY2FsbCh0aGlzcCwgd2Fsa2VyLnZhbHVlLCBpLCB0aGlzKVxuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cbn1cblxuWWFsbGlzdC5wcm90b3R5cGUuZm9yRWFjaFJldmVyc2UgPSBmdW5jdGlvbiAoZm4sIHRoaXNwKSB7XG4gIHRoaXNwID0gdGhpc3AgfHwgdGhpc1xuICBmb3IgKHZhciB3YWxrZXIgPSB0aGlzLnRhaWwsIGkgPSB0aGlzLmxlbmd0aCAtIDE7IHdhbGtlciAhPT0gbnVsbDsgaS0tKSB7XG4gICAgZm4uY2FsbCh0aGlzcCwgd2Fsa2VyLnZhbHVlLCBpLCB0aGlzKVxuICAgIHdhbGtlciA9IHdhbGtlci5wcmV2XG4gIH1cbn1cblxuWWFsbGlzdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG4pIHtcbiAgZm9yICh2YXIgaSA9IDAsIHdhbGtlciA9IHRoaXMuaGVhZDsgd2Fsa2VyICE9PSBudWxsICYmIGkgPCBuOyBpKyspIHtcbiAgICAvLyBhYm9ydCBvdXQgb2YgdGhlIGxpc3QgZWFybHkgaWYgd2UgaGl0IGEgY3ljbGVcbiAgICB3YWxrZXIgPSB3YWxrZXIubmV4dFxuICB9XG4gIGlmIChpID09PSBuICYmIHdhbGtlciAhPT0gbnVsbCkge1xuICAgIHJldHVybiB3YWxrZXIudmFsdWVcbiAgfVxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5nZXRSZXZlcnNlID0gZnVuY3Rpb24gKG4pIHtcbiAgZm9yICh2YXIgaSA9IDAsIHdhbGtlciA9IHRoaXMudGFpbDsgd2Fsa2VyICE9PSBudWxsICYmIGkgPCBuOyBpKyspIHtcbiAgICAvLyBhYm9ydCBvdXQgb2YgdGhlIGxpc3QgZWFybHkgaWYgd2UgaGl0IGEgY3ljbGVcbiAgICB3YWxrZXIgPSB3YWxrZXIucHJldlxuICB9XG4gIGlmIChpID09PSBuICYmIHdhbGtlciAhPT0gbnVsbCkge1xuICAgIHJldHVybiB3YWxrZXIudmFsdWVcbiAgfVxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAoZm4sIHRoaXNwKSB7XG4gIHRoaXNwID0gdGhpc3AgfHwgdGhpc1xuICB2YXIgcmVzID0gbmV3IFlhbGxpc3QoKVxuICBmb3IgKHZhciB3YWxrZXIgPSB0aGlzLmhlYWQ7IHdhbGtlciAhPT0gbnVsbDspIHtcbiAgICByZXMucHVzaChmbi5jYWxsKHRoaXNwLCB3YWxrZXIudmFsdWUsIHRoaXMpKVxuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5tYXBSZXZlcnNlID0gZnVuY3Rpb24gKGZuLCB0aGlzcCkge1xuICB0aGlzcCA9IHRoaXNwIHx8IHRoaXNcbiAgdmFyIHJlcyA9IG5ldyBZYWxsaXN0KClcbiAgZm9yICh2YXIgd2Fsa2VyID0gdGhpcy50YWlsOyB3YWxrZXIgIT09IG51bGw7KSB7XG4gICAgcmVzLnB1c2goZm4uY2FsbCh0aGlzcCwgd2Fsa2VyLnZhbHVlLCB0aGlzKSlcbiAgICB3YWxrZXIgPSB3YWxrZXIucHJldlxuICB9XG4gIHJldHVybiByZXNcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucmVkdWNlID0gZnVuY3Rpb24gKGZuLCBpbml0aWFsKSB7XG4gIHZhciBhY2NcbiAgdmFyIHdhbGtlciA9IHRoaXMuaGVhZFxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICBhY2MgPSBpbml0aWFsXG4gIH0gZWxzZSBpZiAodGhpcy5oZWFkKSB7XG4gICAgd2Fsa2VyID0gdGhpcy5oZWFkLm5leHRcbiAgICBhY2MgPSB0aGlzLmhlYWQudmFsdWVcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgbGlzdCB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IHdhbGtlciAhPT0gbnVsbDsgaSsrKSB7XG4gICAgYWNjID0gZm4oYWNjLCB3YWxrZXIudmFsdWUsIGkpXG4gICAgd2Fsa2VyID0gd2Fsa2VyLm5leHRcbiAgfVxuXG4gIHJldHVybiBhY2Ncbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucmVkdWNlUmV2ZXJzZSA9IGZ1bmN0aW9uIChmbiwgaW5pdGlhbCkge1xuICB2YXIgYWNjXG4gIHZhciB3YWxrZXIgPSB0aGlzLnRhaWxcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgYWNjID0gaW5pdGlhbFxuICB9IGVsc2UgaWYgKHRoaXMudGFpbCkge1xuICAgIHdhbGtlciA9IHRoaXMudGFpbC5wcmV2XG4gICAgYWNjID0gdGhpcy50YWlsLnZhbHVlXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVkdWNlIG9mIGVtcHR5IGxpc3Qgd2l0aCBubyBpbml0aWFsIHZhbHVlJylcbiAgfVxuXG4gIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IHdhbGtlciAhPT0gbnVsbDsgaS0tKSB7XG4gICAgYWNjID0gZm4oYWNjLCB3YWxrZXIudmFsdWUsIGkpXG4gICAgd2Fsa2VyID0gd2Fsa2VyLnByZXZcbiAgfVxuXG4gIHJldHVybiBhY2Ncbn1cblxuWWFsbGlzdC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFyciA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDAsIHdhbGtlciA9IHRoaXMuaGVhZDsgd2Fsa2VyICE9PSBudWxsOyBpKyspIHtcbiAgICBhcnJbaV0gPSB3YWxrZXIudmFsdWVcbiAgICB3YWxrZXIgPSB3YWxrZXIubmV4dFxuICB9XG4gIHJldHVybiBhcnJcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUudG9BcnJheVJldmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhcnIgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwLCB3YWxrZXIgPSB0aGlzLnRhaWw7IHdhbGtlciAhPT0gbnVsbDsgaSsrKSB7XG4gICAgYXJyW2ldID0gd2Fsa2VyLnZhbHVlXG4gICAgd2Fsa2VyID0gd2Fsa2VyLnByZXZcbiAgfVxuICByZXR1cm4gYXJyXG59XG5cbllhbGxpc3QucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gIHRvID0gdG8gfHwgdGhpcy5sZW5ndGhcbiAgaWYgKHRvIDwgMCkge1xuICAgIHRvICs9IHRoaXMubGVuZ3RoXG4gIH1cbiAgZnJvbSA9IGZyb20gfHwgMFxuICBpZiAoZnJvbSA8IDApIHtcbiAgICBmcm9tICs9IHRoaXMubGVuZ3RoXG4gIH1cbiAgdmFyIHJldCA9IG5ldyBZYWxsaXN0KClcbiAgaWYgKHRvIDwgZnJvbSB8fCB0byA8IDApIHtcbiAgICByZXR1cm4gcmV0XG4gIH1cbiAgaWYgKGZyb20gPCAwKSB7XG4gICAgZnJvbSA9IDBcbiAgfVxuICBpZiAodG8gPiB0aGlzLmxlbmd0aCkge1xuICAgIHRvID0gdGhpcy5sZW5ndGhcbiAgfVxuICBmb3IgKHZhciBpID0gMCwgd2Fsa2VyID0gdGhpcy5oZWFkOyB3YWxrZXIgIT09IG51bGwgJiYgaSA8IGZyb207IGkrKykge1xuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cbiAgZm9yICg7IHdhbGtlciAhPT0gbnVsbCAmJiBpIDwgdG87IGkrKywgd2Fsa2VyID0gd2Fsa2VyLm5leHQpIHtcbiAgICByZXQucHVzaCh3YWxrZXIudmFsdWUpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5zbGljZVJldmVyc2UgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgdG8gPSB0byB8fCB0aGlzLmxlbmd0aFxuICBpZiAodG8gPCAwKSB7XG4gICAgdG8gKz0gdGhpcy5sZW5ndGhcbiAgfVxuICBmcm9tID0gZnJvbSB8fCAwXG4gIGlmIChmcm9tIDwgMCkge1xuICAgIGZyb20gKz0gdGhpcy5sZW5ndGhcbiAgfVxuICB2YXIgcmV0ID0gbmV3IFlhbGxpc3QoKVxuICBpZiAodG8gPCBmcm9tIHx8IHRvIDwgMCkge1xuICAgIHJldHVybiByZXRcbiAgfVxuICBpZiAoZnJvbSA8IDApIHtcbiAgICBmcm9tID0gMFxuICB9XG4gIGlmICh0byA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdG8gPSB0aGlzLmxlbmd0aFxuICB9XG4gIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCwgd2Fsa2VyID0gdGhpcy50YWlsOyB3YWxrZXIgIT09IG51bGwgJiYgaSA+IHRvOyBpLS0pIHtcbiAgICB3YWxrZXIgPSB3YWxrZXIucHJldlxuICB9XG4gIGZvciAoOyB3YWxrZXIgIT09IG51bGwgJiYgaSA+IGZyb207IGktLSwgd2Fsa2VyID0gd2Fsa2VyLnByZXYpIHtcbiAgICByZXQucHVzaCh3YWxrZXIudmFsdWUpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5zcGxpY2UgPSBmdW5jdGlvbiAoc3RhcnQsIGRlbGV0ZUNvdW50LCAuLi5ub2Rlcykge1xuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggKyBzdGFydDtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCB3YWxrZXIgPSB0aGlzLmhlYWQ7IHdhbGtlciAhPT0gbnVsbCAmJiBpIDwgc3RhcnQ7IGkrKykge1xuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cblxuICB2YXIgcmV0ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IHdhbGtlciAmJiBpIDwgZGVsZXRlQ291bnQ7IGkrKykge1xuICAgIHJldC5wdXNoKHdhbGtlci52YWx1ZSlcbiAgICB3YWxrZXIgPSB0aGlzLnJlbW92ZU5vZGUod2Fsa2VyKVxuICB9XG4gIGlmICh3YWxrZXIgPT09IG51bGwpIHtcbiAgICB3YWxrZXIgPSB0aGlzLnRhaWxcbiAgfVxuXG4gIGlmICh3YWxrZXIgIT09IHRoaXMuaGVhZCAmJiB3YWxrZXIgIT09IHRoaXMudGFpbCkge1xuICAgIHdhbGtlciA9IHdhbGtlci5wcmV2XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgd2Fsa2VyID0gaW5zZXJ0KHRoaXMsIHdhbGtlciwgbm9kZXNbaV0pXG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucmV2ZXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhlYWQgPSB0aGlzLmhlYWRcbiAgdmFyIHRhaWwgPSB0aGlzLnRhaWxcbiAgZm9yICh2YXIgd2Fsa2VyID0gaGVhZDsgd2Fsa2VyICE9PSBudWxsOyB3YWxrZXIgPSB3YWxrZXIucHJldikge1xuICAgIHZhciBwID0gd2Fsa2VyLnByZXZcbiAgICB3YWxrZXIucHJldiA9IHdhbGtlci5uZXh0XG4gICAgd2Fsa2VyLm5leHQgPSBwXG4gIH1cbiAgdGhpcy5oZWFkID0gdGFpbFxuICB0aGlzLnRhaWwgPSBoZWFkXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIGluc2VydCAoc2VsZiwgbm9kZSwgdmFsdWUpIHtcbiAgdmFyIGluc2VydGVkID0gbm9kZSA9PT0gc2VsZi5oZWFkID9cbiAgICBuZXcgTm9kZSh2YWx1ZSwgbnVsbCwgbm9kZSwgc2VsZikgOlxuICAgIG5ldyBOb2RlKHZhbHVlLCBub2RlLCBub2RlLm5leHQsIHNlbGYpXG5cbiAgaWYgKGluc2VydGVkLm5leHQgPT09IG51bGwpIHtcbiAgICBzZWxmLnRhaWwgPSBpbnNlcnRlZFxuICB9XG4gIGlmIChpbnNlcnRlZC5wcmV2ID09PSBudWxsKSB7XG4gICAgc2VsZi5oZWFkID0gaW5zZXJ0ZWRcbiAgfVxuXG4gIHNlbGYubGVuZ3RoKytcblxuICByZXR1cm4gaW5zZXJ0ZWRcbn1cblxuZnVuY3Rpb24gcHVzaCAoc2VsZiwgaXRlbSkge1xuICBzZWxmLnRhaWwgPSBuZXcgTm9kZShpdGVtLCBzZWxmLnRhaWwsIG51bGwsIHNlbGYpXG4gIGlmICghc2VsZi5oZWFkKSB7XG4gICAgc2VsZi5oZWFkID0gc2VsZi50YWlsXG4gIH1cbiAgc2VsZi5sZW5ndGgrK1xufVxuXG5mdW5jdGlvbiB1bnNoaWZ0IChzZWxmLCBpdGVtKSB7XG4gIHNlbGYuaGVhZCA9IG5ldyBOb2RlKGl0ZW0sIG51bGwsIHNlbGYuaGVhZCwgc2VsZilcbiAgaWYgKCFzZWxmLnRhaWwpIHtcbiAgICBzZWxmLnRhaWwgPSBzZWxmLmhlYWRcbiAgfVxuICBzZWxmLmxlbmd0aCsrXG59XG5cbmZ1bmN0aW9uIE5vZGUgKHZhbHVlLCBwcmV2LCBuZXh0LCBsaXN0KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBOb2RlKSkge1xuICAgIHJldHVybiBuZXcgTm9kZSh2YWx1ZSwgcHJldiwgbmV4dCwgbGlzdClcbiAgfVxuXG4gIHRoaXMubGlzdCA9IGxpc3RcbiAgdGhpcy52YWx1ZSA9IHZhbHVlXG5cbiAgaWYgKHByZXYpIHtcbiAgICBwcmV2Lm5leHQgPSB0aGlzXG4gICAgdGhpcy5wcmV2ID0gcHJldlxuICB9IGVsc2Uge1xuICAgIHRoaXMucHJldiA9IG51bGxcbiAgfVxuXG4gIGlmIChuZXh0KSB7XG4gICAgbmV4dC5wcmV2ID0gdGhpc1xuICAgIHRoaXMubmV4dCA9IG5leHRcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm5leHQgPSBudWxsXG4gIH1cbn1cblxudHJ5IHtcbiAgLy8gYWRkIGlmIHN1cHBvcnQgZm9yIFN5bWJvbC5pdGVyYXRvciBpcyBwcmVzZW50XG4gIHJlcXVpcmUoJy4vaXRlcmF0b3IuanMnKShZYWxsaXN0KVxufSBjYXRjaCAoZXIpIHt9XG4iLCJmdW5jdGlvbiB3ZWJwYWNrRW1wdHlDb250ZXh0KHJlcSkge1xuXHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0dGhyb3cgZTtcbn1cbndlYnBhY2tFbXB0eUNvbnRleHQua2V5cyA9ICgpID0+IChbXSk7XG53ZWJwYWNrRW1wdHlDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrRW1wdHlDb250ZXh0O1xud2VicGFja0VtcHR5Q29udGV4dC5pZCA9IFwiLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkIHN5bmMgcmVjdXJzaXZlXCI7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tFbXB0eUNvbnRleHQ7IiwiZnVuY3Rpb24gd2VicGFja0VtcHR5Q29udGV4dChyZXEpIHtcblx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdHRocm93IGU7XG59XG53ZWJwYWNrRW1wdHlDb250ZXh0LmtleXMgPSAoKSA9PiAoW10pO1xud2VicGFja0VtcHR5Q29udGV4dC5yZXNvbHZlID0gd2VicGFja0VtcHR5Q29udGV4dDtcbndlYnBhY2tFbXB0eUNvbnRleHQuaWQgPSBcIi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkIHN5bmMgcmVjdXJzaXZlXCI7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tFbXB0eUNvbnRleHQ7IiwidmFyIGZzID0gcmVxdWlyZShcImZzXCIpO1xudmFyIHpsaWIgPSByZXF1aXJlKFwiemxpYlwiKTtcbnZhciBmZF9zbGljZXIgPSByZXF1aXJlKFwiZmQtc2xpY2VyXCIpO1xudmFyIGNyYzMyID0gcmVxdWlyZShcImJ1ZmZlci1jcmMzMlwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcInV0aWxcIik7XG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZShcImV2ZW50c1wiKS5FdmVudEVtaXR0ZXI7XG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZShcInN0cmVhbVwiKS5UcmFuc2Zvcm07XG52YXIgUGFzc1Rocm91Z2ggPSByZXF1aXJlKFwic3RyZWFtXCIpLlBhc3NUaHJvdWdoO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZShcInN0cmVhbVwiKS5Xcml0YWJsZTtcblxuZXhwb3J0cy5vcGVuID0gb3BlbjtcbmV4cG9ydHMuZnJvbUZkID0gZnJvbUZkO1xuZXhwb3J0cy5mcm9tQnVmZmVyID0gZnJvbUJ1ZmZlcjtcbmV4cG9ydHMuZnJvbVJhbmRvbUFjY2Vzc1JlYWRlciA9IGZyb21SYW5kb21BY2Nlc3NSZWFkZXI7XG5leHBvcnRzLmRvc0RhdGVUaW1lVG9EYXRlID0gZG9zRGF0ZVRpbWVUb0RhdGU7XG5leHBvcnRzLnZhbGlkYXRlRmlsZU5hbWUgPSB2YWxpZGF0ZUZpbGVOYW1lO1xuZXhwb3J0cy5aaXBGaWxlID0gWmlwRmlsZTtcbmV4cG9ydHMuRW50cnkgPSBFbnRyeTtcbmV4cG9ydHMuUmFuZG9tQWNjZXNzUmVhZGVyID0gUmFuZG9tQWNjZXNzUmVhZGVyO1xuXG5mdW5jdGlvbiBvcGVuKHBhdGgsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSBudWxsO1xuICB9XG4gIGlmIChvcHRpb25zID09IG51bGwpIG9wdGlvbnMgPSB7fTtcbiAgaWYgKG9wdGlvbnMuYXV0b0Nsb3NlID09IG51bGwpIG9wdGlvbnMuYXV0b0Nsb3NlID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMubGF6eUVudHJpZXMgPT0gbnVsbCkgb3B0aW9ucy5sYXp5RW50cmllcyA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5kZWNvZGVTdHJpbmdzID09IG51bGwpIG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9IHRydWU7XG4gIGlmIChvcHRpb25zLnZhbGlkYXRlRW50cnlTaXplcyA9PSBudWxsKSBvcHRpb25zLnZhbGlkYXRlRW50cnlTaXplcyA9IHRydWU7XG4gIGlmIChvcHRpb25zLnN0cmljdEZpbGVOYW1lcyA9PSBudWxsKSBvcHRpb25zLnN0cmljdEZpbGVOYW1lcyA9IGZhbHNlO1xuICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgY2FsbGJhY2sgPSBkZWZhdWx0Q2FsbGJhY2s7XG4gIGZzLm9wZW4ocGF0aCwgXCJyXCIsIGZ1bmN0aW9uKGVyciwgZmQpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBmcm9tRmQoZmQsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgemlwZmlsZSkge1xuICAgICAgaWYgKGVycikgZnMuY2xvc2UoZmQsIGRlZmF1bHRDYWxsYmFjayk7XG4gICAgICBjYWxsYmFjayhlcnIsIHppcGZpbGUpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZnJvbUZkKGZkLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0gbnVsbDtcbiAgfVxuICBpZiAob3B0aW9ucyA9PSBudWxsKSBvcHRpb25zID0ge307XG4gIGlmIChvcHRpb25zLmF1dG9DbG9zZSA9PSBudWxsKSBvcHRpb25zLmF1dG9DbG9zZSA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5sYXp5RW50cmllcyA9PSBudWxsKSBvcHRpb25zLmxhenlFbnRyaWVzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmRlY29kZVN0cmluZ3MgPT0gbnVsbCkgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID09IG51bGwpIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID09IG51bGwpIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID0gZmFsc2U7XG4gIGlmIChjYWxsYmFjayA9PSBudWxsKSBjYWxsYmFjayA9IGRlZmF1bHRDYWxsYmFjaztcbiAgZnMuZnN0YXQoZmQsIGZ1bmN0aW9uKGVyciwgc3RhdHMpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB2YXIgcmVhZGVyID0gZmRfc2xpY2VyLmNyZWF0ZUZyb21GZChmZCwge2F1dG9DbG9zZTogdHJ1ZX0pO1xuICAgIGZyb21SYW5kb21BY2Nlc3NSZWFkZXIocmVhZGVyLCBzdGF0cy5zaXplLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmcm9tQnVmZmVyKGJ1ZmZlciwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgb3B0aW9ucyA9IHt9O1xuICBvcHRpb25zLmF1dG9DbG9zZSA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5sYXp5RW50cmllcyA9PSBudWxsKSBvcHRpb25zLmxhenlFbnRyaWVzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmRlY29kZVN0cmluZ3MgPT0gbnVsbCkgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID09IG51bGwpIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID09IG51bGwpIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID0gZmFsc2U7XG4gIC8vIGxpbWl0IHRoZSBtYXggY2h1bmsgc2l6ZS4gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVqb3Nod29sZmUveWF1emwvaXNzdWVzLzg3XG4gIHZhciByZWFkZXIgPSBmZF9zbGljZXIuY3JlYXRlRnJvbUJ1ZmZlcihidWZmZXIsIHttYXhDaHVua1NpemU6IDB4MTAwMDB9KTtcbiAgZnJvbVJhbmRvbUFjY2Vzc1JlYWRlcihyZWFkZXIsIGJ1ZmZlci5sZW5ndGgsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZnJvbVJhbmRvbUFjY2Vzc1JlYWRlcihyZWFkZXIsIHRvdGFsU2l6ZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgb3B0aW9ucyA9IHt9O1xuICBpZiAob3B0aW9ucy5hdXRvQ2xvc2UgPT0gbnVsbCkgb3B0aW9ucy5hdXRvQ2xvc2UgPSB0cnVlO1xuICBpZiAob3B0aW9ucy5sYXp5RW50cmllcyA9PSBudWxsKSBvcHRpb25zLmxhenlFbnRyaWVzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmRlY29kZVN0cmluZ3MgPT0gbnVsbCkgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gdHJ1ZTtcbiAgdmFyIGRlY29kZVN0cmluZ3MgPSAhIW9wdGlvbnMuZGVjb2RlU3RyaW5ncztcbiAgaWYgKG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID09IG51bGwpIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID09IG51bGwpIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID0gZmFsc2U7XG4gIGlmIChjYWxsYmFjayA9PSBudWxsKSBjYWxsYmFjayA9IGRlZmF1bHRDYWxsYmFjaztcbiAgaWYgKHR5cGVvZiB0b3RhbFNpemUgIT09IFwibnVtYmVyXCIpIHRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIHRvdGFsU2l6ZSBwYXJhbWV0ZXIgdG8gYmUgYSBudW1iZXJcIik7XG4gIGlmICh0b3RhbFNpemUgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgIHRocm93IG5ldyBFcnJvcihcInppcCBmaWxlIHRvbyBsYXJnZS4gb25seSBmaWxlIHNpemVzIHVwIHRvIDJeNTIgYXJlIHN1cHBvcnRlZCBkdWUgdG8gSmF2YVNjcmlwdCdzIE51bWJlciB0eXBlIGJlaW5nIGFuIElFRUUgNzU0IGRvdWJsZS5cIik7XG4gIH1cblxuICAvLyB0aGUgbWF0Y2hpbmcgdW5yZWYoKSBjYWxsIGlzIGluIHppcGZpbGUuY2xvc2UoKVxuICByZWFkZXIucmVmKCk7XG5cbiAgLy8gZW9jZHIgbWVhbnMgRW5kIG9mIENlbnRyYWwgRGlyZWN0b3J5IFJlY29yZC5cbiAgLy8gc2VhcmNoIGJhY2t3YXJkcyBmb3IgdGhlIGVvY2RyIHNpZ25hdHVyZS5cbiAgLy8gdGhlIGxhc3QgZmllbGQgb2YgdGhlIGVvY2RyIGlzIGEgdmFyaWFibGUtbGVuZ3RoIGNvbW1lbnQuXG4gIC8vIHRoZSBjb21tZW50IHNpemUgaXMgZW5jb2RlZCBpbiBhIDItYnl0ZSBmaWVsZCBpbiB0aGUgZW9jZHIsIHdoaWNoIHdlIGNhbid0IGZpbmQgd2l0aG91dCB0cnVkZ2luZyBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgY29tbWVudCB0byBmaW5kIGl0LlxuICAvLyBhcyBhIGNvbnNlcXVlbmNlIG9mIHRoaXMgZGVzaWduIGRlY2lzaW9uLCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgYW1iaWd1b3VzIHppcCBmaWxlIG1ldGFkYXRhIGlmIGEgY29oZXJlbnQgZW9jZHIgd2FzIGluIHRoZSBjb21tZW50LlxuICAvLyB3ZSBzZWFyY2ggYmFja3dhcmRzIGZvciBhIGVvY2RyIHNpZ25hdHVyZSwgYW5kIGhvcGUgdGhhdCB3aG9ldmVyIG1hZGUgdGhlIHppcCBmaWxlIHdhcyBzbWFydCBlbm91Z2ggdG8gZm9yYmlkIHRoZSBlb2NkciBzaWduYXR1cmUgaW4gdGhlIGNvbW1lbnQuXG4gIHZhciBlb2NkcldpdGhvdXRDb21tZW50U2l6ZSA9IDIyO1xuICB2YXIgbWF4Q29tbWVudFNpemUgPSAweGZmZmY7IC8vIDItYnl0ZSBzaXplXG4gIHZhciBidWZmZXJTaXplID0gTWF0aC5taW4oZW9jZHJXaXRob3V0Q29tbWVudFNpemUgKyBtYXhDb21tZW50U2l6ZSwgdG90YWxTaXplKTtcbiAgdmFyIGJ1ZmZlciA9IG5ld0J1ZmZlcihidWZmZXJTaXplKTtcbiAgdmFyIGJ1ZmZlclJlYWRTdGFydCA9IHRvdGFsU2l6ZSAtIGJ1ZmZlci5sZW5ndGg7XG4gIHJlYWRBbmRBc3NlcnROb0VvZihyZWFkZXIsIGJ1ZmZlciwgMCwgYnVmZmVyU2l6ZSwgYnVmZmVyUmVhZFN0YXJ0LCBmdW5jdGlvbihlcnIpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBmb3IgKHZhciBpID0gYnVmZmVyU2l6ZSAtIGVvY2RyV2l0aG91dENvbW1lbnRTaXplOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgaWYgKGJ1ZmZlci5yZWFkVUludDMyTEUoaSkgIT09IDB4MDYwNTRiNTApIGNvbnRpbnVlO1xuICAgICAgLy8gZm91bmQgZW9jZHJcbiAgICAgIHZhciBlb2NkckJ1ZmZlciA9IGJ1ZmZlci5zbGljZShpKTtcblxuICAgICAgLy8gMCAtIEVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBzaWduYXR1cmUgPSAweDA2MDU0YjUwXG4gICAgICAvLyA0IC0gTnVtYmVyIG9mIHRoaXMgZGlza1xuICAgICAgdmFyIGRpc2tOdW1iZXIgPSBlb2NkckJ1ZmZlci5yZWFkVUludDE2TEUoNCk7XG4gICAgICBpZiAoZGlza051bWJlciAhPT0gMCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwibXVsdGktZGlzayB6aXAgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQ6IGZvdW5kIGRpc2sgbnVtYmVyOiBcIiArIGRpc2tOdW1iZXIpKTtcbiAgICAgIH1cbiAgICAgIC8vIDYgLSBEaXNrIHdoZXJlIGNlbnRyYWwgZGlyZWN0b3J5IHN0YXJ0c1xuICAgICAgLy8gOCAtIE51bWJlciBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmRzIG9uIHRoaXMgZGlza1xuICAgICAgLy8gMTAgLSBUb3RhbCBudW1iZXIgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3Jkc1xuICAgICAgdmFyIGVudHJ5Q291bnQgPSBlb2NkckJ1ZmZlci5yZWFkVUludDE2TEUoMTApO1xuICAgICAgLy8gMTIgLSBTaXplIG9mIGNlbnRyYWwgZGlyZWN0b3J5IChieXRlcylcbiAgICAgIC8vIDE2IC0gT2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5LCByZWxhdGl2ZSB0byBzdGFydCBvZiBhcmNoaXZlXG4gICAgICB2YXIgY2VudHJhbERpcmVjdG9yeU9mZnNldCA9IGVvY2RyQnVmZmVyLnJlYWRVSW50MzJMRSgxNik7XG4gICAgICAvLyAyMCAtIENvbW1lbnQgbGVuZ3RoXG4gICAgICB2YXIgY29tbWVudExlbmd0aCA9IGVvY2RyQnVmZmVyLnJlYWRVSW50MTZMRSgyMCk7XG4gICAgICB2YXIgZXhwZWN0ZWRDb21tZW50TGVuZ3RoID0gZW9jZHJCdWZmZXIubGVuZ3RoIC0gZW9jZHJXaXRob3V0Q29tbWVudFNpemU7XG4gICAgICBpZiAoY29tbWVudExlbmd0aCAhPT0gZXhwZWN0ZWRDb21tZW50TGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJpbnZhbGlkIGNvbW1lbnQgbGVuZ3RoLiBleHBlY3RlZDogXCIgKyBleHBlY3RlZENvbW1lbnRMZW5ndGggKyBcIi4gZm91bmQ6IFwiICsgY29tbWVudExlbmd0aCkpO1xuICAgICAgfVxuICAgICAgLy8gMjIgLSBDb21tZW50XG4gICAgICAvLyB0aGUgZW5jb2RpbmcgaXMgYWx3YXlzIGNwNDM3LlxuICAgICAgdmFyIGNvbW1lbnQgPSBkZWNvZGVTdHJpbmdzID8gZGVjb2RlQnVmZmVyKGVvY2RyQnVmZmVyLCAyMiwgZW9jZHJCdWZmZXIubGVuZ3RoLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVvY2RyQnVmZmVyLnNsaWNlKDIyKTtcblxuICAgICAgaWYgKCEoZW50cnlDb3VudCA9PT0gMHhmZmZmIHx8IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgPT09IDB4ZmZmZmZmZmYpKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBuZXcgWmlwRmlsZShyZWFkZXIsIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsIHRvdGFsU2l6ZSwgZW50cnlDb3VudCwgY29tbWVudCwgb3B0aW9ucy5hdXRvQ2xvc2UsIG9wdGlvbnMubGF6eUVudHJpZXMsIGRlY29kZVN0cmluZ3MsIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzLCBvcHRpb25zLnN0cmljdEZpbGVOYW1lcykpO1xuICAgICAgfVxuXG4gICAgICAvLyBaSVA2NCBmb3JtYXRcblxuICAgICAgLy8gWklQNjQgWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3JcbiAgICAgIHZhciB6aXA2NEVvY2RsQnVmZmVyID0gbmV3QnVmZmVyKDIwKTtcbiAgICAgIHZhciB6aXA2NEVvY2RsT2Zmc2V0ID0gYnVmZmVyUmVhZFN0YXJ0ICsgaSAtIHppcDY0RW9jZGxCdWZmZXIubGVuZ3RoO1xuICAgICAgcmVhZEFuZEFzc2VydE5vRW9mKHJlYWRlciwgemlwNjRFb2NkbEJ1ZmZlciwgMCwgemlwNjRFb2NkbEJ1ZmZlci5sZW5ndGgsIHppcDY0RW9jZGxPZmZzZXQsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgICAgICAvLyAwIC0gemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyIGxvY2F0b3Igc2lnbmF0dXJlID0gMHgwNzA2NGI1MFxuICAgICAgICBpZiAoemlwNjRFb2NkbEJ1ZmZlci5yZWFkVUludDMyTEUoMCkgIT09IDB4MDcwNjRiNTApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiaW52YWxpZCB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciBzaWduYXR1cmVcIikpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDQgLSBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIHppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeVxuICAgICAgICAvLyA4IC0gcmVsYXRpdmUgb2Zmc2V0IG9mIHRoZSB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkXG4gICAgICAgIHZhciB6aXA2NEVvY2RyT2Zmc2V0ID0gcmVhZFVJbnQ2NExFKHppcDY0RW9jZGxCdWZmZXIsIDgpO1xuICAgICAgICAvLyAxNiAtIHRvdGFsIG51bWJlciBvZiBkaXNrc1xuXG4gICAgICAgIC8vIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmRcbiAgICAgICAgdmFyIHppcDY0RW9jZHJCdWZmZXIgPSBuZXdCdWZmZXIoNTYpO1xuICAgICAgICByZWFkQW5kQXNzZXJ0Tm9Fb2YocmVhZGVyLCB6aXA2NEVvY2RyQnVmZmVyLCAwLCB6aXA2NEVvY2RyQnVmZmVyLmxlbmd0aCwgemlwNjRFb2Nkck9mZnNldCwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG5cbiAgICAgICAgICAvLyAwIC0gemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyIHNpZ25hdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXMgICgweDA2MDY0YjUwKVxuICAgICAgICAgIGlmICh6aXA2NEVvY2RyQnVmZmVyLnJlYWRVSW50MzJMRSgwKSAhPT0gMHgwNjA2NGI1MCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcImludmFsaWQgemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCBzaWduYXR1cmVcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyA0IC0gc2l6ZSBvZiB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICAgICAgICAgICAgICAgIDggYnl0ZXNcbiAgICAgICAgICAvLyAxMiAtIHZlcnNpb24gbWFkZSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgYnl0ZXNcbiAgICAgICAgICAvLyAxNCAtIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgYnl0ZXNcbiAgICAgICAgICAvLyAxNiAtIG51bWJlciBvZiB0aGlzIGRpc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXNcbiAgICAgICAgICAvLyAyMCAtIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgIDQgYnl0ZXNcbiAgICAgICAgICAvLyAyNCAtIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBvbiB0aGlzIGRpc2sgICAgICAgICA4IGJ5dGVzXG4gICAgICAgICAgLy8gMzIgLSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgICAgICAgICAgICA4IGJ5dGVzXG4gICAgICAgICAgZW50cnlDb3VudCA9IHJlYWRVSW50NjRMRSh6aXA2NEVvY2RyQnVmZmVyLCAzMik7XG4gICAgICAgICAgLy8gNDAgLSBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IGJ5dGVzXG4gICAgICAgICAgLy8gNDggLSBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZSBzdGFydGluZyBkaXNrIG51bWJlciAgICAgOCBieXRlc1xuICAgICAgICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgPSByZWFkVUludDY0TEUoemlwNjRFb2NkckJ1ZmZlciwgNDgpO1xuICAgICAgICAgIC8vIDU2IC0gemlwNjQgZXh0ZW5zaWJsZSBkYXRhIHNlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhcmlhYmxlIHNpemUpXG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG5ldyBaaXBGaWxlKHJlYWRlciwgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgdG90YWxTaXplLCBlbnRyeUNvdW50LCBjb21tZW50LCBvcHRpb25zLmF1dG9DbG9zZSwgb3B0aW9ucy5sYXp5RW50cmllcywgZGVjb2RlU3RyaW5ncywgb3B0aW9ucy52YWxpZGF0ZUVudHJ5U2l6ZXMsIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxiYWNrKG5ldyBFcnJvcihcImVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgc2lnbmF0dXJlIG5vdCBmb3VuZFwiKSk7XG4gIH0pO1xufVxuXG51dGlsLmluaGVyaXRzKFppcEZpbGUsIEV2ZW50RW1pdHRlcik7XG5mdW5jdGlvbiBaaXBGaWxlKHJlYWRlciwgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgZmlsZVNpemUsIGVudHJ5Q291bnQsIGNvbW1lbnQsIGF1dG9DbG9zZSwgbGF6eUVudHJpZXMsIGRlY29kZVN0cmluZ3MsIHZhbGlkYXRlRW50cnlTaXplcywgc3RyaWN0RmlsZU5hbWVzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgRXZlbnRFbWl0dGVyLmNhbGwoc2VsZik7XG4gIHNlbGYucmVhZGVyID0gcmVhZGVyO1xuICAvLyBmb3J3YXJkIGNsb3NlIGV2ZW50c1xuICBzZWxmLnJlYWRlci5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgIC8vIGVycm9yIGNsb3NpbmcgdGhlIGZkXG4gICAgZW1pdEVycm9yKHNlbGYsIGVycik7XG4gIH0pO1xuICBzZWxmLnJlYWRlci5vbmNlKFwiY2xvc2VcIiwgZnVuY3Rpb24oKSB7XG4gICAgc2VsZi5lbWl0KFwiY2xvc2VcIik7XG4gIH0pO1xuICBzZWxmLnJlYWRFbnRyeUN1cnNvciA9IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQ7XG4gIHNlbGYuZmlsZVNpemUgPSBmaWxlU2l6ZTtcbiAgc2VsZi5lbnRyeUNvdW50ID0gZW50cnlDb3VudDtcbiAgc2VsZi5jb21tZW50ID0gY29tbWVudDtcbiAgc2VsZi5lbnRyaWVzUmVhZCA9IDA7XG4gIHNlbGYuYXV0b0Nsb3NlID0gISFhdXRvQ2xvc2U7XG4gIHNlbGYubGF6eUVudHJpZXMgPSAhIWxhenlFbnRyaWVzO1xuICBzZWxmLmRlY29kZVN0cmluZ3MgPSAhIWRlY29kZVN0cmluZ3M7XG4gIHNlbGYudmFsaWRhdGVFbnRyeVNpemVzID0gISF2YWxpZGF0ZUVudHJ5U2l6ZXM7XG4gIHNlbGYuc3RyaWN0RmlsZU5hbWVzID0gISFzdHJpY3RGaWxlTmFtZXM7XG4gIHNlbGYuaXNPcGVuID0gdHJ1ZTtcbiAgc2VsZi5lbWl0dGVkRXJyb3IgPSBmYWxzZTtcblxuICBpZiAoIXNlbGYubGF6eUVudHJpZXMpIHNlbGYuX3JlYWRFbnRyeSgpO1xufVxuWmlwRmlsZS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICB0aGlzLnJlYWRlci51bnJlZigpO1xufTtcblxuZnVuY3Rpb24gZW1pdEVycm9yQW5kQXV0b0Nsb3NlKHNlbGYsIGVycikge1xuICBpZiAoc2VsZi5hdXRvQ2xvc2UpIHNlbGYuY2xvc2UoKTtcbiAgZW1pdEVycm9yKHNlbGYsIGVycik7XG59XG5mdW5jdGlvbiBlbWl0RXJyb3Ioc2VsZiwgZXJyKSB7XG4gIGlmIChzZWxmLmVtaXR0ZWRFcnJvcikgcmV0dXJuO1xuICBzZWxmLmVtaXR0ZWRFcnJvciA9IHRydWU7XG4gIHNlbGYuZW1pdChcImVycm9yXCIsIGVycik7XG59XG5cblppcEZpbGUucHJvdG90eXBlLnJlYWRFbnRyeSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMubGF6eUVudHJpZXMpIHRocm93IG5ldyBFcnJvcihcInJlYWRFbnRyeSgpIGNhbGxlZCB3aXRob3V0IGxhenlFbnRyaWVzOnRydWVcIik7XG4gIHRoaXMuX3JlYWRFbnRyeSgpO1xufTtcblppcEZpbGUucHJvdG90eXBlLl9yZWFkRW50cnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoc2VsZi5lbnRyeUNvdW50ID09PSBzZWxmLmVudHJpZXNSZWFkKSB7XG4gICAgLy8gZG9uZSB3aXRoIG1ldGFkYXRhXG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuYXV0b0Nsb3NlKSBzZWxmLmNsb3NlKCk7XG4gICAgICBpZiAoc2VsZi5lbWl0dGVkRXJyb3IpIHJldHVybjtcbiAgICAgIHNlbGYuZW1pdChcImVuZFwiKTtcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHNlbGYuZW1pdHRlZEVycm9yKSByZXR1cm47XG4gIHZhciBidWZmZXIgPSBuZXdCdWZmZXIoNDYpO1xuICByZWFkQW5kQXNzZXJ0Tm9Fb2Yoc2VsZi5yZWFkZXIsIGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgc2VsZi5yZWFkRW50cnlDdXJzb3IsIGZ1bmN0aW9uKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgZXJyKTtcbiAgICBpZiAoc2VsZi5lbWl0dGVkRXJyb3IpIHJldHVybjtcbiAgICB2YXIgZW50cnkgPSBuZXcgRW50cnkoKTtcbiAgICAvLyAwIC0gQ2VudHJhbCBkaXJlY3RvcnkgZmlsZSBoZWFkZXIgc2lnbmF0dXJlXG4gICAgdmFyIHNpZ25hdHVyZSA9IGJ1ZmZlci5yZWFkVUludDMyTEUoMCk7XG4gICAgaWYgKHNpZ25hdHVyZSAhPT0gMHgwMjAxNGI1MCkgcmV0dXJuIGVtaXRFcnJvckFuZEF1dG9DbG9zZShzZWxmLCBuZXcgRXJyb3IoXCJpbnZhbGlkIGNlbnRyYWwgZGlyZWN0b3J5IGZpbGUgaGVhZGVyIHNpZ25hdHVyZTogMHhcIiArIHNpZ25hdHVyZS50b1N0cmluZygxNikpKTtcbiAgICAvLyA0IC0gVmVyc2lvbiBtYWRlIGJ5XG4gICAgZW50cnkudmVyc2lvbk1hZGVCeSA9IGJ1ZmZlci5yZWFkVUludDE2TEUoNCk7XG4gICAgLy8gNiAtIFZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgKG1pbmltdW0pXG4gICAgZW50cnkudmVyc2lvbk5lZWRlZFRvRXh0cmFjdCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoNik7XG4gICAgLy8gOCAtIEdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZ1xuICAgIGVudHJ5LmdlbmVyYWxQdXJwb3NlQml0RmxhZyA9IGJ1ZmZlci5yZWFkVUludDE2TEUoOCk7XG4gICAgLy8gMTAgLSBDb21wcmVzc2lvbiBtZXRob2RcbiAgICBlbnRyeS5jb21wcmVzc2lvbk1ldGhvZCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoMTApO1xuICAgIC8vIDEyIC0gRmlsZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lXG4gICAgZW50cnkubGFzdE1vZEZpbGVUaW1lID0gYnVmZmVyLnJlYWRVSW50MTZMRSgxMik7XG4gICAgLy8gMTQgLSBGaWxlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGVcbiAgICBlbnRyeS5sYXN0TW9kRmlsZURhdGUgPSBidWZmZXIucmVhZFVJbnQxNkxFKDE0KTtcbiAgICAvLyAxNiAtIENSQy0zMlxuICAgIGVudHJ5LmNyYzMyID0gYnVmZmVyLnJlYWRVSW50MzJMRSgxNik7XG4gICAgLy8gMjAgLSBDb21wcmVzc2VkIHNpemVcbiAgICBlbnRyeS5jb21wcmVzc2VkU2l6ZSA9IGJ1ZmZlci5yZWFkVUludDMyTEUoMjApO1xuICAgIC8vIDI0IC0gVW5jb21wcmVzc2VkIHNpemVcbiAgICBlbnRyeS51bmNvbXByZXNzZWRTaXplID0gYnVmZmVyLnJlYWRVSW50MzJMRSgyNCk7XG4gICAgLy8gMjggLSBGaWxlIG5hbWUgbGVuZ3RoIChuKVxuICAgIGVudHJ5LmZpbGVOYW1lTGVuZ3RoID0gYnVmZmVyLnJlYWRVSW50MTZMRSgyOCk7XG4gICAgLy8gMzAgLSBFeHRyYSBmaWVsZCBsZW5ndGggKG0pXG4gICAgZW50cnkuZXh0cmFGaWVsZExlbmd0aCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoMzApO1xuICAgIC8vIDMyIC0gRmlsZSBjb21tZW50IGxlbmd0aCAoaylcbiAgICBlbnRyeS5maWxlQ29tbWVudExlbmd0aCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoMzIpO1xuICAgIC8vIDM0IC0gRGlzayBudW1iZXIgd2hlcmUgZmlsZSBzdGFydHNcbiAgICAvLyAzNiAtIEludGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgIGVudHJ5LmludGVybmFsRmlsZUF0dHJpYnV0ZXMgPSBidWZmZXIucmVhZFVJbnQxNkxFKDM2KTtcbiAgICAvLyAzOCAtIEV4dGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgIGVudHJ5LmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSBidWZmZXIucmVhZFVJbnQzMkxFKDM4KTtcbiAgICAvLyA0MiAtIFJlbGF0aXZlIG9mZnNldCBvZiBsb2NhbCBmaWxlIGhlYWRlclxuICAgIGVudHJ5LnJlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciA9IGJ1ZmZlci5yZWFkVUludDMyTEUoNDIpO1xuXG4gICAgaWYgKGVudHJ5LmdlbmVyYWxQdXJwb3NlQml0RmxhZyAmIDB4NDApIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwic3Ryb25nIGVuY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZFwiKSk7XG5cbiAgICBzZWxmLnJlYWRFbnRyeUN1cnNvciArPSA0NjtcblxuICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcihlbnRyeS5maWxlTmFtZUxlbmd0aCArIGVudHJ5LmV4dHJhRmllbGRMZW5ndGggKyBlbnRyeS5maWxlQ29tbWVudExlbmd0aCk7XG4gICAgcmVhZEFuZEFzc2VydE5vRW9mKHNlbGYucmVhZGVyLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIHNlbGYucmVhZEVudHJ5Q3Vyc29yLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgZXJyKTtcbiAgICAgIGlmIChzZWxmLmVtaXR0ZWRFcnJvcikgcmV0dXJuO1xuICAgICAgLy8gNDYgLSBGaWxlIG5hbWVcbiAgICAgIHZhciBpc1V0ZjggPSAoZW50cnkuZ2VuZXJhbFB1cnBvc2VCaXRGbGFnICYgMHg4MDApICE9PSAwO1xuICAgICAgZW50cnkuZmlsZU5hbWUgPSBzZWxmLmRlY29kZVN0cmluZ3MgPyBkZWNvZGVCdWZmZXIoYnVmZmVyLCAwLCBlbnRyeS5maWxlTmFtZUxlbmd0aCwgaXNVdGY4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBidWZmZXIuc2xpY2UoMCwgZW50cnkuZmlsZU5hbWVMZW5ndGgpO1xuXG4gICAgICAvLyA0NituIC0gRXh0cmEgZmllbGRcbiAgICAgIHZhciBmaWxlQ29tbWVudFN0YXJ0ID0gZW50cnkuZmlsZU5hbWVMZW5ndGggKyBlbnRyeS5leHRyYUZpZWxkTGVuZ3RoO1xuICAgICAgdmFyIGV4dHJhRmllbGRCdWZmZXIgPSBidWZmZXIuc2xpY2UoZW50cnkuZmlsZU5hbWVMZW5ndGgsIGZpbGVDb21tZW50U3RhcnQpO1xuICAgICAgZW50cnkuZXh0cmFGaWVsZHMgPSBbXTtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChpIDwgZXh0cmFGaWVsZEJ1ZmZlci5sZW5ndGggLSAzKSB7XG4gICAgICAgIHZhciBoZWFkZXJJZCA9IGV4dHJhRmllbGRCdWZmZXIucmVhZFVJbnQxNkxFKGkgKyAwKTtcbiAgICAgICAgdmFyIGRhdGFTaXplID0gZXh0cmFGaWVsZEJ1ZmZlci5yZWFkVUludDE2TEUoaSArIDIpO1xuICAgICAgICB2YXIgZGF0YVN0YXJ0ID0gaSArIDQ7XG4gICAgICAgIHZhciBkYXRhRW5kID0gZGF0YVN0YXJ0ICsgZGF0YVNpemU7XG4gICAgICAgIGlmIChkYXRhRW5kID4gZXh0cmFGaWVsZEJ1ZmZlci5sZW5ndGgpIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwiZXh0cmEgZmllbGQgbGVuZ3RoIGV4Y2VlZHMgZXh0cmEgZmllbGQgYnVmZmVyIHNpemVcIikpO1xuICAgICAgICB2YXIgZGF0YUJ1ZmZlciA9IG5ld0J1ZmZlcihkYXRhU2l6ZSk7XG4gICAgICAgIGV4dHJhRmllbGRCdWZmZXIuY29weShkYXRhQnVmZmVyLCAwLCBkYXRhU3RhcnQsIGRhdGFFbmQpO1xuICAgICAgICBlbnRyeS5leHRyYUZpZWxkcy5wdXNoKHtcbiAgICAgICAgICBpZDogaGVhZGVySWQsXG4gICAgICAgICAgZGF0YTogZGF0YUJ1ZmZlcixcbiAgICAgICAgfSk7XG4gICAgICAgIGkgPSBkYXRhRW5kO1xuICAgICAgfVxuXG4gICAgICAvLyA0NituK20gLSBGaWxlIGNvbW1lbnRcbiAgICAgIGVudHJ5LmZpbGVDb21tZW50ID0gc2VsZi5kZWNvZGVTdHJpbmdzID8gZGVjb2RlQnVmZmVyKGJ1ZmZlciwgZmlsZUNvbW1lbnRTdGFydCwgZmlsZUNvbW1lbnRTdGFydCArIGVudHJ5LmZpbGVDb21tZW50TGVuZ3RoLCBpc1V0ZjgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJ1ZmZlci5zbGljZShmaWxlQ29tbWVudFN0YXJ0LCBmaWxlQ29tbWVudFN0YXJ0ICsgZW50cnkuZmlsZUNvbW1lbnRMZW5ndGgpO1xuICAgICAgLy8gY29tcGF0aWJpbGl0eSBoYWNrIGZvciBodHRwczovL2dpdGh1Yi5jb20vdGhlam9zaHdvbGZlL3lhdXpsL2lzc3Vlcy80N1xuICAgICAgZW50cnkuY29tbWVudCA9IGVudHJ5LmZpbGVDb21tZW50O1xuXG4gICAgICBzZWxmLnJlYWRFbnRyeUN1cnNvciArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgc2VsZi5lbnRyaWVzUmVhZCArPSAxO1xuXG4gICAgICBpZiAoZW50cnkudW5jb21wcmVzc2VkU2l6ZSAgICAgICAgICAgID09PSAweGZmZmZmZmZmIHx8XG4gICAgICAgICAgZW50cnkuY29tcHJlc3NlZFNpemUgICAgICAgICAgICAgID09PSAweGZmZmZmZmZmIHx8XG4gICAgICAgICAgZW50cnkucmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyID09PSAweGZmZmZmZmZmKSB7XG4gICAgICAgIC8vIFpJUDY0IGZvcm1hdFxuICAgICAgICAvLyBmaW5kIHRoZSBaaXA2NCBFeHRlbmRlZCBJbmZvcm1hdGlvbiBFeHRyYSBGaWVsZFxuICAgICAgICB2YXIgemlwNjRFaWVmQnVmZmVyID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyeS5leHRyYUZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBleHRyYUZpZWxkID0gZW50cnkuZXh0cmFGaWVsZHNbaV07XG4gICAgICAgICAgaWYgKGV4dHJhRmllbGQuaWQgPT09IDB4MDAwMSkge1xuICAgICAgICAgICAgemlwNjRFaWVmQnVmZmVyID0gZXh0cmFGaWVsZC5kYXRhO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh6aXA2NEVpZWZCdWZmZXIgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwiZXhwZWN0ZWQgemlwNjQgZXh0ZW5kZWQgaW5mb3JtYXRpb24gZXh0cmEgZmllbGRcIikpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIC8vIDAgLSBPcmlnaW5hbCBTaXplICAgICAgICAgIDggYnl0ZXNcbiAgICAgICAgaWYgKGVudHJ5LnVuY29tcHJlc3NlZFNpemUgPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgICBpZiAoaW5kZXggKyA4ID4gemlwNjRFaWVmQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRFcnJvckFuZEF1dG9DbG9zZShzZWxmLCBuZXcgRXJyb3IoXCJ6aXA2NCBleHRlbmRlZCBpbmZvcm1hdGlvbiBleHRyYSBmaWVsZCBkb2VzIG5vdCBpbmNsdWRlIHVuY29tcHJlc3NlZCBzaXplXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkU2l6ZSA9IHJlYWRVSW50NjRMRSh6aXA2NEVpZWZCdWZmZXIsIGluZGV4KTtcbiAgICAgICAgICBpbmRleCArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vIDggLSBDb21wcmVzc2VkIFNpemUgICAgICAgIDggYnl0ZXNcbiAgICAgICAgaWYgKGVudHJ5LmNvbXByZXNzZWRTaXplID09PSAweGZmZmZmZmZmKSB7XG4gICAgICAgICAgaWYgKGluZGV4ICsgOCA+IHppcDY0RWllZkJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwiemlwNjQgZXh0ZW5kZWQgaW5mb3JtYXRpb24gZXh0cmEgZmllbGQgZG9lcyBub3QgaW5jbHVkZSBjb21wcmVzc2VkIHNpemVcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbnRyeS5jb21wcmVzc2VkU2l6ZSA9IHJlYWRVSW50NjRMRSh6aXA2NEVpZWZCdWZmZXIsIGluZGV4KTtcbiAgICAgICAgICBpbmRleCArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vIDE2IC0gUmVsYXRpdmUgSGVhZGVyIE9mZnNldCA4IGJ5dGVzXG4gICAgICAgIGlmIChlbnRyeS5yZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgICBpZiAoaW5kZXggKyA4ID4gemlwNjRFaWVmQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRFcnJvckFuZEF1dG9DbG9zZShzZWxmLCBuZXcgRXJyb3IoXCJ6aXA2NCBleHRlbmRlZCBpbmZvcm1hdGlvbiBleHRyYSBmaWVsZCBkb2VzIG5vdCBpbmNsdWRlIHJlbGF0aXZlIGhlYWRlciBvZmZzZXRcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbnRyeS5yZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgPSByZWFkVUludDY0TEUoemlwNjRFaWVmQnVmZmVyLCBpbmRleCk7XG4gICAgICAgICAgaW5kZXggKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLyAyNCAtIERpc2sgU3RhcnQgTnVtYmVyICAgICAgNCBieXRlc1xuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBmb3IgSW5mby1aSVAgVW5pY29kZSBQYXRoIEV4dHJhIEZpZWxkICgweDcwNzUpXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWpvc2h3b2xmZS95YXV6bC9pc3N1ZXMvMzNcbiAgICAgIGlmIChzZWxmLmRlY29kZVN0cmluZ3MpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyeS5leHRyYUZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBleHRyYUZpZWxkID0gZW50cnkuZXh0cmFGaWVsZHNbaV07XG4gICAgICAgICAgaWYgKGV4dHJhRmllbGQuaWQgPT09IDB4NzA3NSkge1xuICAgICAgICAgICAgaWYgKGV4dHJhRmllbGQuZGF0YS5sZW5ndGggPCA2KSB7XG4gICAgICAgICAgICAgIC8vIHRvbyBzaG9ydCB0byBiZSBtZWFuaW5nZnVsXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVmVyc2lvbiAgICAgICAxIGJ5dGUgICAgICB2ZXJzaW9uIG9mIHRoaXMgZXh0cmEgZmllbGQsIGN1cnJlbnRseSAxXG4gICAgICAgICAgICBpZiAoZXh0cmFGaWVsZC5kYXRhLnJlYWRVSW50OCgwKSAhPT0gMSkge1xuICAgICAgICAgICAgICAvLyA+IENoYW5nZXMgbWF5IG5vdCBiZSBiYWNrd2FyZCBjb21wYXRpYmxlIHNvIHRoaXMgZXh0cmFcbiAgICAgICAgICAgICAgLy8gPiBmaWVsZCBzaG91bGQgbm90IGJlIHVzZWQgaWYgdGhlIHZlcnNpb24gaXMgbm90IHJlY29nbml6ZWQuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTmFtZUNSQzMyICAgICA0IGJ5dGVzICAgICBGaWxlIE5hbWUgRmllbGQgQ1JDMzIgQ2hlY2tzdW1cbiAgICAgICAgICAgIHZhciBvbGROYW1lQ3JjMzIgPSBleHRyYUZpZWxkLmRhdGEucmVhZFVJbnQzMkxFKDEpO1xuICAgICAgICAgICAgaWYgKGNyYzMyLnVuc2lnbmVkKGJ1ZmZlci5zbGljZSgwLCBlbnRyeS5maWxlTmFtZUxlbmd0aCkpICE9PSBvbGROYW1lQ3JjMzIpIHtcbiAgICAgICAgICAgICAgLy8gPiBJZiB0aGUgQ1JDIGNoZWNrIGZhaWxzLCB0aGlzIFVURi04IFBhdGggRXh0cmEgRmllbGQgc2hvdWxkIGJlXG4gICAgICAgICAgICAgIC8vID4gaWdub3JlZCBhbmQgdGhlIEZpbGUgTmFtZSBmaWVsZCBpbiB0aGUgaGVhZGVyIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVW5pY29kZU5hbWUgICBWYXJpYWJsZSAgICBVVEYtOCB2ZXJzaW9uIG9mIHRoZSBlbnRyeSBGaWxlIE5hbWVcbiAgICAgICAgICAgIGVudHJ5LmZpbGVOYW1lID0gZGVjb2RlQnVmZmVyKGV4dHJhRmllbGQuZGF0YSwgNSwgZXh0cmFGaWVsZC5kYXRhLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWRhdGUgZmlsZSBzaXplXG4gICAgICBpZiAoc2VsZi52YWxpZGF0ZUVudHJ5U2l6ZXMgJiYgZW50cnkuY29tcHJlc3Npb25NZXRob2QgPT09IDApIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ29tcHJlc3NlZFNpemUgPSBlbnRyeS51bmNvbXByZXNzZWRTaXplO1xuICAgICAgICBpZiAoZW50cnkuaXNFbmNyeXB0ZWQoKSkge1xuICAgICAgICAgIC8vIHRyYWRpdGlvbmFsIGVuY3J5cHRpb24gcHJlZml4ZXMgdGhlIGZpbGUgZGF0YSB3aXRoIGEgaGVhZGVyXG4gICAgICAgICAgZXhwZWN0ZWRDb21wcmVzc2VkU2l6ZSArPSAxMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuY29tcHJlc3NlZFNpemUgIT09IGV4cGVjdGVkQ29tcHJlc3NlZFNpemUpIHtcbiAgICAgICAgICB2YXIgbXNnID0gXCJjb21wcmVzc2VkL3VuY29tcHJlc3NlZCBzaXplIG1pc21hdGNoIGZvciBzdG9yZWQgZmlsZTogXCIgKyBlbnRyeS5jb21wcmVzc2VkU2l6ZSArIFwiICE9IFwiICsgZW50cnkudW5jb21wcmVzc2VkU2l6ZTtcbiAgICAgICAgICByZXR1cm4gZW1pdEVycm9yQW5kQXV0b0Nsb3NlKHNlbGYsIG5ldyBFcnJvcihtc2cpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZi5kZWNvZGVTdHJpbmdzKSB7XG4gICAgICAgIGlmICghc2VsZi5zdHJpY3RGaWxlTmFtZXMpIHtcbiAgICAgICAgICAvLyBhbGxvdyBiYWNrc2xhc2hcbiAgICAgICAgICBlbnRyeS5maWxlTmFtZSA9IGVudHJ5LmZpbGVOYW1lLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSB2YWxpZGF0ZUZpbGVOYW1lKGVudHJ5LmZpbGVOYW1lLCBzZWxmLnZhbGlkYXRlRmlsZU5hbWVPcHRpb25zKTtcbiAgICAgICAgaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSByZXR1cm4gZW1pdEVycm9yQW5kQXV0b0Nsb3NlKHNlbGYsIG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZW1pdChcImVudHJ5XCIsIGVudHJ5KTtcblxuICAgICAgaWYgKCFzZWxmLmxhenlFbnRyaWVzKSBzZWxmLl9yZWFkRW50cnkoKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5aaXBGaWxlLnByb3RvdHlwZS5vcGVuUmVhZFN0cmVhbSA9IGZ1bmN0aW9uKGVudHJ5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIC8vIHBhcmFtZXRlciB2YWxpZGF0aW9uXG4gIHZhciByZWxhdGl2ZVN0YXJ0ID0gMDtcbiAgdmFyIHJlbGF0aXZlRW5kID0gZW50cnkuY29tcHJlc3NlZFNpemU7XG4gIGlmIChjYWxsYmFjayA9PSBudWxsKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICAvLyB2YWxpZGF0ZSBvcHRpb25zIHRoYXQgdGhlIGNhbGxlciBoYXMgbm8gZXhjdXNlIHRvIGdldCB3cm9uZ1xuICAgIGlmIChvcHRpb25zLmRlY3J5cHQgIT0gbnVsbCkge1xuICAgICAgaWYgKCFlbnRyeS5pc0VuY3J5cHRlZCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMuZGVjcnlwdCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGVuY3J5cHRlZCBlbnRyaWVzXCIpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZGVjcnlwdCAhPT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgb3B0aW9ucy5kZWNyeXB0IHZhbHVlOiBcIiArIG9wdGlvbnMuZGVjcnlwdCk7XG4gICAgICBpZiAoZW50cnkuaXNDb21wcmVzc2VkKCkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGVjb21wcmVzcyAhPT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcihcImVudHJ5IGlzIGVuY3J5cHRlZCBhbmQgY29tcHJlc3NlZCwgYW5kIG9wdGlvbnMuZGVjb21wcmVzcyAhPT0gZmFsc2VcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmRlY29tcHJlc3MgIT0gbnVsbCkge1xuICAgICAgaWYgKCFlbnRyeS5pc0NvbXByZXNzZWQoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLmRlY29tcHJlc3MgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBjb21wcmVzc2VkIGVudHJpZXNcIik7XG4gICAgICB9XG4gICAgICBpZiAoIShvcHRpb25zLmRlY29tcHJlc3MgPT09IGZhbHNlIHx8IG9wdGlvbnMuZGVjb21wcmVzcyA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvcHRpb25zLmRlY29tcHJlc3MgdmFsdWU6IFwiICsgb3B0aW9ucy5kZWNvbXByZXNzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc3RhcnQgIT0gbnVsbCB8fCBvcHRpb25zLmVuZCAhPSBudWxsKSB7XG4gICAgICBpZiAoZW50cnkuaXNDb21wcmVzc2VkKCkgJiYgb3B0aW9ucy5kZWNvbXByZXNzICE9PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydC9lbmQgcmFuZ2Ugbm90IGFsbG93ZWQgZm9yIGNvbXByZXNzZWQgZW50cnkgd2l0aG91dCBvcHRpb25zLmRlY29tcHJlc3MgPT09IGZhbHNlXCIpO1xuICAgICAgfVxuICAgICAgaWYgKGVudHJ5LmlzRW5jcnlwdGVkKCkgJiYgb3B0aW9ucy5kZWNyeXB0ICE9PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydC9lbmQgcmFuZ2Ugbm90IGFsbG93ZWQgZm9yIGVuY3J5cHRlZCBlbnRyeSB3aXRob3V0IG9wdGlvbnMuZGVjcnlwdCA9PT0gZmFsc2VcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnN0YXJ0ICE9IG51bGwpIHtcbiAgICAgIHJlbGF0aXZlU3RhcnQgPSBvcHRpb25zLnN0YXJ0O1xuICAgICAgaWYgKHJlbGF0aXZlU3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLnN0YXJ0IDwgMFwiKTtcbiAgICAgIGlmIChyZWxhdGl2ZVN0YXJ0ID4gZW50cnkuY29tcHJlc3NlZFNpemUpIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMuc3RhcnQgPiBlbnRyeS5jb21wcmVzc2VkU2l6ZVwiKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZW5kICE9IG51bGwpIHtcbiAgICAgIHJlbGF0aXZlRW5kID0gb3B0aW9ucy5lbmQ7XG4gICAgICBpZiAocmVsYXRpdmVFbmQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLmVuZCA8IDBcIik7XG4gICAgICBpZiAocmVsYXRpdmVFbmQgPiBlbnRyeS5jb21wcmVzc2VkU2l6ZSkgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucy5lbmQgPiBlbnRyeS5jb21wcmVzc2VkU2l6ZVwiKTtcbiAgICAgIGlmIChyZWxhdGl2ZUVuZCA8IHJlbGF0aXZlU3RhcnQpIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMuZW5kIDwgb3B0aW9ucy5zdGFydFwiKTtcbiAgICB9XG4gIH1cbiAgLy8gYW55IGZ1cnRoZXIgZXJyb3JzIGNhbiBlaXRoZXIgYmUgY2F1c2VkIGJ5IHRoZSB6aXBmaWxlLFxuICAvLyBvciB3ZXJlIGludHJvZHVjZWQgaW4gYSBtaW5vciB2ZXJzaW9uIG9mIHlhdXpsLFxuICAvLyBzbyBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBjbGllbnQgcmF0aGVyIHRoYW4gdGhyb3duLlxuICBpZiAoIXNlbGYuaXNPcGVuKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiY2xvc2VkXCIpKTtcbiAgaWYgKGVudHJ5LmlzRW5jcnlwdGVkKCkpIHtcbiAgICBpZiAob3B0aW9ucy5kZWNyeXB0ICE9PSBmYWxzZSkgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcImVudHJ5IGlzIGVuY3J5cHRlZCwgYW5kIG9wdGlvbnMuZGVjcnlwdCAhPT0gZmFsc2VcIikpO1xuICB9XG4gIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBsb3NlIHRoZSBmZCBiZWZvcmUgd2Ugb3BlbiB0aGUgYWN0dWFsIHJlYWQgc3RyZWFtXG4gIHNlbGYucmVhZGVyLnJlZigpO1xuICB2YXIgYnVmZmVyID0gbmV3QnVmZmVyKDMwKTtcbiAgcmVhZEFuZEFzc2VydE5vRW9mKHNlbGYucmVhZGVyLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIGVudHJ5LnJlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciwgZnVuY3Rpb24oZXJyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgLy8gMCAtIExvY2FsIGZpbGUgaGVhZGVyIHNpZ25hdHVyZSA9IDB4MDQwMzRiNTBcbiAgICAgIHZhciBzaWduYXR1cmUgPSBidWZmZXIucmVhZFVJbnQzMkxFKDApO1xuICAgICAgaWYgKHNpZ25hdHVyZSAhPT0gMHgwNDAzNGI1MCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiaW52YWxpZCBsb2NhbCBmaWxlIGhlYWRlciBzaWduYXR1cmU6IDB4XCIgKyBzaWduYXR1cmUudG9TdHJpbmcoMTYpKSk7XG4gICAgICB9XG4gICAgICAvLyBhbGwgdGhpcyBzaG91bGQgYmUgcmVkdW5kYW50XG4gICAgICAvLyA0IC0gVmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAobWluaW11bSlcbiAgICAgIC8vIDYgLSBHZW5lcmFsIHB1cnBvc2UgYml0IGZsYWdcbiAgICAgIC8vIDggLSBDb21wcmVzc2lvbiBtZXRob2RcbiAgICAgIC8vIDEwIC0gRmlsZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lXG4gICAgICAvLyAxMiAtIEZpbGUgbGFzdCBtb2RpZmljYXRpb24gZGF0ZVxuICAgICAgLy8gMTQgLSBDUkMtMzJcbiAgICAgIC8vIDE4IC0gQ29tcHJlc3NlZCBzaXplXG4gICAgICAvLyAyMiAtIFVuY29tcHJlc3NlZCBzaXplXG4gICAgICAvLyAyNiAtIEZpbGUgbmFtZSBsZW5ndGggKG4pXG4gICAgICB2YXIgZmlsZU5hbWVMZW5ndGggPSBidWZmZXIucmVhZFVJbnQxNkxFKDI2KTtcbiAgICAgIC8vIDI4IC0gRXh0cmEgZmllbGQgbGVuZ3RoIChtKVxuICAgICAgdmFyIGV4dHJhRmllbGRMZW5ndGggPSBidWZmZXIucmVhZFVJbnQxNkxFKDI4KTtcbiAgICAgIC8vIDMwIC0gRmlsZSBuYW1lXG4gICAgICAvLyAzMCtuIC0gRXh0cmEgZmllbGRcbiAgICAgIHZhciBsb2NhbEZpbGVIZWFkZXJFbmQgPSBlbnRyeS5yZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgKyBidWZmZXIubGVuZ3RoICsgZmlsZU5hbWVMZW5ndGggKyBleHRyYUZpZWxkTGVuZ3RoO1xuICAgICAgdmFyIGRlY29tcHJlc3M7XG4gICAgICBpZiAoZW50cnkuY29tcHJlc3Npb25NZXRob2QgPT09IDApIHtcbiAgICAgICAgLy8gMCAtIFRoZSBmaWxlIGlzIHN0b3JlZCAobm8gY29tcHJlc3Npb24pXG4gICAgICAgIGRlY29tcHJlc3MgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkuY29tcHJlc3Npb25NZXRob2QgPT09IDgpIHtcbiAgICAgICAgLy8gOCAtIFRoZSBmaWxlIGlzIERlZmxhdGVkXG4gICAgICAgIGRlY29tcHJlc3MgPSBvcHRpb25zLmRlY29tcHJlc3MgIT0gbnVsbCA/IG9wdGlvbnMuZGVjb21wcmVzcyA6IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kOiBcIiArIGVudHJ5LmNvbXByZXNzaW9uTWV0aG9kKSk7XG4gICAgICB9XG4gICAgICB2YXIgZmlsZURhdGFTdGFydCA9IGxvY2FsRmlsZUhlYWRlckVuZDtcbiAgICAgIHZhciBmaWxlRGF0YUVuZCA9IGZpbGVEYXRhU3RhcnQgKyBlbnRyeS5jb21wcmVzc2VkU2l6ZTtcbiAgICAgIGlmIChlbnRyeS5jb21wcmVzc2VkU2l6ZSAhPT0gMCkge1xuICAgICAgICAvLyBib3VuZHMgY2hlY2sgbm93LCBiZWNhdXNlIHRoZSByZWFkIHN0cmVhbXMgd2lsbCBwcm9iYWJseSBub3QgY29tcGxhaW4gbG91ZCBlbm91Z2guXG4gICAgICAgIC8vIHNpbmNlIHdlJ3JlIGRlYWxpbmcgd2l0aCBhbiB1bnNpZ25lZCBvZmZzZXQgcGx1cyBhbiB1bnNpZ25lZCBzaXplLFxuICAgICAgICAvLyB3ZSBvbmx5IGhhdmUgMSB0aGluZyB0byBjaGVjayBmb3IuXG4gICAgICAgIGlmIChmaWxlRGF0YUVuZCA+IHNlbGYuZmlsZVNpemUpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiZmlsZSBkYXRhIG92ZXJmbG93cyBmaWxlIGJvdW5kczogXCIgK1xuICAgICAgICAgICAgICBmaWxlRGF0YVN0YXJ0ICsgXCIgKyBcIiArIGVudHJ5LmNvbXByZXNzZWRTaXplICsgXCIgPiBcIiArIHNlbGYuZmlsZVNpemUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHJlYWRTdHJlYW0gPSBzZWxmLnJlYWRlci5jcmVhdGVSZWFkU3RyZWFtKHtcbiAgICAgICAgc3RhcnQ6IGZpbGVEYXRhU3RhcnQgKyByZWxhdGl2ZVN0YXJ0LFxuICAgICAgICBlbmQ6IGZpbGVEYXRhU3RhcnQgKyByZWxhdGl2ZUVuZCxcbiAgICAgIH0pO1xuICAgICAgdmFyIGVuZHBvaW50U3RyZWFtID0gcmVhZFN0cmVhbTtcbiAgICAgIGlmIChkZWNvbXByZXNzKSB7XG4gICAgICAgIHZhciBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGluZmxhdGVGaWx0ZXIgPSB6bGliLmNyZWF0ZUluZmxhdGVSYXcoKTtcbiAgICAgICAgcmVhZFN0cmVhbS5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIC8vIHNldEltbWVkaWF0ZSBoZXJlIGJlY2F1c2UgZXJyb3JzIGNhbiBiZSBlbWl0dGVkIGR1cmluZyB0aGUgZmlyc3QgY2FsbCB0byBwaXBlKClcbiAgICAgICAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoIWRlc3Ryb3llZCkgaW5mbGF0ZUZpbHRlci5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRTdHJlYW0ucGlwZShpbmZsYXRlRmlsdGVyKTtcblxuICAgICAgICBpZiAoc2VsZi52YWxpZGF0ZUVudHJ5U2l6ZXMpIHtcbiAgICAgICAgICBlbmRwb2ludFN0cmVhbSA9IG5ldyBBc3NlcnRCeXRlQ291bnRTdHJlYW0oZW50cnkudW5jb21wcmVzc2VkU2l6ZSk7XG4gICAgICAgICAgaW5mbGF0ZUZpbHRlci5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgLy8gZm9yd2FyZCB6bGliIGVycm9ycyB0byB0aGUgY2xpZW50LXZpc2libGUgc3RyZWFtXG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmICghZGVzdHJveWVkKSBlbmRwb2ludFN0cmVhbS5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGluZmxhdGVGaWx0ZXIucGlwZShlbmRwb2ludFN0cmVhbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhlIHpsaWIgZmlsdGVyIGlzIHRoZSBjbGllbnQtdmlzaWJsZSBzdHJlYW1cbiAgICAgICAgICBlbmRwb2ludFN0cmVhbSA9IGluZmxhdGVGaWx0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcyBpcyBwYXJ0IG9mIHlhdXpsJ3MgQVBJLCBzbyBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBvbiB0aGUgY2xpZW50LXZpc2libGUgc3RyZWFtXG4gICAgICAgIGVuZHBvaW50U3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBkZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChpbmZsYXRlRmlsdGVyICE9PSBlbmRwb2ludFN0cmVhbSkgaW5mbGF0ZUZpbHRlci51bnBpcGUoZW5kcG9pbnRTdHJlYW0pO1xuICAgICAgICAgIHJlYWRTdHJlYW0udW5waXBlKGluZmxhdGVGaWx0ZXIpO1xuICAgICAgICAgIC8vIFRPRE86IHRoZSBpbmZsYXRlRmlsdGVyIG1heSBjYXVzZSBhIG1lbW9yeSBsZWFrLiBzZWUgSXNzdWUgIzI3LlxuICAgICAgICAgIHJlYWRTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgZW5kcG9pbnRTdHJlYW0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZWxmLnJlYWRlci51bnJlZigpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBFbnRyeSgpIHtcbn1cbkVudHJ5LnByb3RvdHlwZS5nZXRMYXN0TW9kRGF0ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZG9zRGF0ZVRpbWVUb0RhdGUodGhpcy5sYXN0TW9kRmlsZURhdGUsIHRoaXMubGFzdE1vZEZpbGVUaW1lKTtcbn07XG5FbnRyeS5wcm90b3R5cGUuaXNFbmNyeXB0ZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICh0aGlzLmdlbmVyYWxQdXJwb3NlQml0RmxhZyAmIDB4MSkgIT09IDA7XG59O1xuRW50cnkucHJvdG90eXBlLmlzQ29tcHJlc3NlZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jb21wcmVzc2lvbk1ldGhvZCA9PT0gODtcbn07XG5cbmZ1bmN0aW9uIGRvc0RhdGVUaW1lVG9EYXRlKGRhdGUsIHRpbWUpIHtcbiAgdmFyIGRheSA9IGRhdGUgJiAweDFmOyAvLyAxLTMxXG4gIHZhciBtb250aCA9IChkYXRlID4+IDUgJiAweGYpIC0gMTsgLy8gMS0xMiwgMC0xMVxuICB2YXIgeWVhciA9IChkYXRlID4+IDkgJiAweDdmKSArIDE5ODA7IC8vIDAtMTI4LCAxOTgwLTIxMDhcblxuICB2YXIgbWlsbGlzZWNvbmQgPSAwO1xuICB2YXIgc2Vjb25kID0gKHRpbWUgJiAweDFmKSAqIDI7IC8vIDAtMjksIDAtNTggKGV2ZW4gbnVtYmVycylcbiAgdmFyIG1pbnV0ZSA9IHRpbWUgPj4gNSAmIDB4M2Y7IC8vIDAtNTlcbiAgdmFyIGhvdXIgPSB0aW1lID4+IDExICYgMHgxZjsgLy8gMC0yM1xuXG4gIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZpbGVOYW1lKGZpbGVOYW1lKSB7XG4gIGlmIChmaWxlTmFtZS5pbmRleE9mKFwiXFxcXFwiKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gXCJpbnZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZU5hbWU6IFwiICsgZmlsZU5hbWU7XG4gIH1cbiAgaWYgKC9eW2EtekEtWl06Ly50ZXN0KGZpbGVOYW1lKSB8fCAvXlxcLy8udGVzdChmaWxlTmFtZSkpIHtcbiAgICByZXR1cm4gXCJhYnNvbHV0ZSBwYXRoOiBcIiArIGZpbGVOYW1lO1xuICB9XG4gIGlmIChmaWxlTmFtZS5zcGxpdChcIi9cIikuaW5kZXhPZihcIi4uXCIpICE9PSAtMSkge1xuICAgIHJldHVybiBcImludmFsaWQgcmVsYXRpdmUgcGF0aDogXCIgKyBmaWxlTmFtZTtcbiAgfVxuICAvLyBhbGwgZ29vZFxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVhZEFuZEFzc2VydE5vRW9mKHJlYWRlciwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAvLyBmcy5yZWFkIHdpbGwgdGhyb3cgYW4gb3V0LW9mLWJvdW5kcyBlcnJvciBpZiB5b3UgdHJ5IHRvIHJlYWQgMCBieXRlcyBmcm9tIGEgMCBieXRlIGZpbGVcbiAgICByZXR1cm4gc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkgeyBjYWxsYmFjayhudWxsLCBuZXdCdWZmZXIoMCkpOyB9KTtcbiAgfVxuICByZWFkZXIucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgZnVuY3Rpb24oZXJyLCBieXRlc1JlYWQpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBpZiAoYnl0ZXNSZWFkIDwgbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwidW5leHBlY3RlZCBFT0ZcIikpO1xuICAgIH1cbiAgICBjYWxsYmFjaygpO1xuICB9KTtcbn1cblxudXRpbC5pbmhlcml0cyhBc3NlcnRCeXRlQ291bnRTdHJlYW0sIFRyYW5zZm9ybSk7XG5mdW5jdGlvbiBBc3NlcnRCeXRlQ291bnRTdHJlYW0oYnl0ZUNvdW50KSB7XG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMpO1xuICB0aGlzLmFjdHVhbEJ5dGVDb3VudCA9IDA7XG4gIHRoaXMuZXhwZWN0ZWRCeXRlQ291bnQgPSBieXRlQ291bnQ7XG59XG5Bc3NlcnRCeXRlQ291bnRTdHJlYW0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuYWN0dWFsQnl0ZUNvdW50ICs9IGNodW5rLmxlbmd0aDtcbiAgaWYgKHRoaXMuYWN0dWFsQnl0ZUNvdW50ID4gdGhpcy5leHBlY3RlZEJ5dGVDb3VudCkge1xuICAgIHZhciBtc2cgPSBcInRvbyBtYW55IGJ5dGVzIGluIHRoZSBzdHJlYW0uIGV4cGVjdGVkIFwiICsgdGhpcy5leHBlY3RlZEJ5dGVDb3VudCArIFwiLiBnb3QgYXQgbGVhc3QgXCIgKyB0aGlzLmFjdHVhbEJ5dGVDb3VudDtcbiAgICByZXR1cm4gY2IobmV3IEVycm9yKG1zZykpO1xuICB9XG4gIGNiKG51bGwsIGNodW5rKTtcbn07XG5Bc3NlcnRCeXRlQ291bnRTdHJlYW0ucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uKGNiKSB7XG4gIGlmICh0aGlzLmFjdHVhbEJ5dGVDb3VudCA8IHRoaXMuZXhwZWN0ZWRCeXRlQ291bnQpIHtcbiAgICB2YXIgbXNnID0gXCJub3QgZW5vdWdoIGJ5dGVzIGluIHRoZSBzdHJlYW0uIGV4cGVjdGVkIFwiICsgdGhpcy5leHBlY3RlZEJ5dGVDb3VudCArIFwiLiBnb3Qgb25seSBcIiArIHRoaXMuYWN0dWFsQnl0ZUNvdW50O1xuICAgIHJldHVybiBjYihuZXcgRXJyb3IobXNnKSk7XG4gIH1cbiAgY2IoKTtcbn07XG5cbnV0aWwuaW5oZXJpdHMoUmFuZG9tQWNjZXNzUmVhZGVyLCBFdmVudEVtaXR0ZXIpO1xuZnVuY3Rpb24gUmFuZG9tQWNjZXNzUmVhZGVyKCkge1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcbiAgdGhpcy5yZWZDb3VudCA9IDA7XG59XG5SYW5kb21BY2Nlc3NSZWFkZXIucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJlZkNvdW50ICs9IDE7XG59O1xuUmFuZG9tQWNjZXNzUmVhZGVyLnByb3RvdHlwZS51bnJlZiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYucmVmQ291bnQgLT0gMTtcblxuICBpZiAoc2VsZi5yZWZDb3VudCA+IDApIHJldHVybjtcbiAgaWYgKHNlbGYucmVmQ291bnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHVucmVmXCIpO1xuXG4gIHNlbGYuY2xvc2Uob25DbG9zZURvbmUpO1xuXG4gIGZ1bmN0aW9uIG9uQ2xvc2VEb25lKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICBzZWxmLmVtaXQoJ2Nsb3NlJyk7XG4gIH1cbn07XG5SYW5kb21BY2Nlc3NSZWFkZXIucHJvdG90eXBlLmNyZWF0ZVJlYWRTdHJlYW0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHZhciBzdGFydCA9IG9wdGlvbnMuc3RhcnQ7XG4gIHZhciBlbmQgPSBvcHRpb25zLmVuZDtcbiAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICB2YXIgZW1wdHlTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICBlbXB0eVN0cmVhbS5lbmQoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZW1wdHlTdHJlYW07XG4gIH1cbiAgdmFyIHN0cmVhbSA9IHRoaXMuX3JlYWRTdHJlYW1Gb3JSYW5nZShzdGFydCwgZW5kKTtcblxuICB2YXIgZGVzdHJveWVkID0gZmFsc2U7XG4gIHZhciByZWZVbnJlZkZpbHRlciA9IG5ldyBSZWZVbnJlZkZpbHRlcih0aGlzKTtcbiAgc3RyZWFtLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24oZXJyKSB7XG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFkZXN0cm95ZWQpIHJlZlVucmVmRmlsdGVyLmVtaXQoXCJlcnJvclwiLCBlcnIpO1xuICAgIH0pO1xuICB9KTtcbiAgcmVmVW5yZWZGaWx0ZXIuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIHN0cmVhbS51bnBpcGUocmVmVW5yZWZGaWx0ZXIpO1xuICAgIHJlZlVucmVmRmlsdGVyLnVucmVmKCk7XG4gICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgfTtcblxuICB2YXIgYnl0ZUNvdW50ZXIgPSBuZXcgQXNzZXJ0Qnl0ZUNvdW50U3RyZWFtKGVuZCAtIHN0YXJ0KTtcbiAgcmVmVW5yZWZGaWx0ZXIub24oXCJlcnJvclwiLCBmdW5jdGlvbihlcnIpIHtcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIWRlc3Ryb3llZCkgYnl0ZUNvdW50ZXIuZW1pdChcImVycm9yXCIsIGVycik7XG4gICAgfSk7XG4gIH0pO1xuICBieXRlQ291bnRlci5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgZGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZWZVbnJlZkZpbHRlci51bnBpcGUoYnl0ZUNvdW50ZXIpO1xuICAgIHJlZlVucmVmRmlsdGVyLmRlc3Ryb3koKTtcbiAgfTtcblxuICByZXR1cm4gc3RyZWFtLnBpcGUocmVmVW5yZWZGaWx0ZXIpLnBpcGUoYnl0ZUNvdW50ZXIpO1xufTtcblJhbmRvbUFjY2Vzc1JlYWRlci5wcm90b3R5cGUuX3JlYWRTdHJlYW1Gb3JSYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xufTtcblJhbmRvbUFjY2Vzc1JlYWRlci5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaykge1xuICB2YXIgcmVhZFN0cmVhbSA9IHRoaXMuY3JlYXRlUmVhZFN0cmVhbSh7c3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uICsgbGVuZ3RofSk7XG4gIHZhciB3cml0ZVN0cmVhbSA9IG5ldyBXcml0YWJsZSgpO1xuICB2YXIgd3JpdHRlbiA9IDA7XG4gIHdyaXRlU3RyZWFtLl93cml0ZSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICBjaHVuay5jb3B5KGJ1ZmZlciwgb2Zmc2V0ICsgd3JpdHRlbiwgMCwgY2h1bmsubGVuZ3RoKTtcbiAgICB3cml0dGVuICs9IGNodW5rLmxlbmd0aDtcbiAgICBjYigpO1xuICB9O1xuICB3cml0ZVN0cmVhbS5vbihcImZpbmlzaFwiLCBjYWxsYmFjayk7XG4gIHJlYWRTdHJlYW0ub24oXCJlcnJvclwiLCBmdW5jdGlvbihlcnJvcikge1xuICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgfSk7XG4gIHJlYWRTdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSk7XG59O1xuUmFuZG9tQWNjZXNzUmVhZGVyLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG59O1xuXG51dGlsLmluaGVyaXRzKFJlZlVucmVmRmlsdGVyLCBQYXNzVGhyb3VnaCk7XG5mdW5jdGlvbiBSZWZVbnJlZkZpbHRlcihjb250ZXh0KSB7XG4gIFBhc3NUaHJvdWdoLmNhbGwodGhpcyk7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuY29udGV4dC5yZWYoKTtcbiAgdGhpcy51bnJlZmZlZFlldCA9IGZhbHNlO1xufVxuUmVmVW5yZWZGaWx0ZXIucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uKGNiKSB7XG4gIHRoaXMudW5yZWYoKTtcbiAgY2IoKTtcbn07XG5SZWZVbnJlZkZpbHRlci5wcm90b3R5cGUudW5yZWYgPSBmdW5jdGlvbihjYikge1xuICBpZiAodGhpcy51bnJlZmZlZFlldCkgcmV0dXJuO1xuICB0aGlzLnVucmVmZmVkWWV0ID0gdHJ1ZTtcbiAgdGhpcy5jb250ZXh0LnVucmVmKCk7XG59O1xuXG52YXIgY3A0MzcgPSAnXFx1MDAwMOKYuuKYu+KZpeKZpuKZo+KZoOKAouKXmOKXi+KXmeKZguKZgOKZquKZq+KYvOKWuuKXhOKGleKAvMK2wqfilqzihqjihpHihpPihpLihpDiiJ/ihpTilrLilrwgIVwiIyQlJlxcJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fuKMgsOHw7zDqcOiw6TDoMOlw6fDqsOrw6jDr8Ouw6zDhMOFw4nDpsOGw7TDtsOyw7vDucO/w5bDnMKiwqPCpeKCp8aSw6HDrcOzw7rDscORwqrCusK/4oyQwqzCvcK8wqHCq8K74paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAzrHDn86Tz4DOo8+DwrXPhM6mzpjOqc604oiez4bOteKIqeKJocKx4oml4omk4oyg4oyhw7fiiYjCsOKImcK34oia4oG/wrLilqDCoCc7XG5mdW5jdGlvbiBkZWNvZGVCdWZmZXIoYnVmZmVyLCBzdGFydCwgZW5kLCBpc1V0ZjgpIHtcbiAgaWYgKGlzVXRmOCkge1xuICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoXCJ1dGY4XCIsIHN0YXJ0LCBlbmQpO1xuICB9IGVsc2Uge1xuICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICByZXN1bHQgKz0gY3A0MzdbYnVmZmVyW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkVUludDY0TEUoYnVmZmVyLCBvZmZzZXQpIHtcbiAgLy8gdGhlcmUgaXMgbm8gbmF0aXZlIGZ1bmN0aW9uIGZvciB0aGlzLCBiZWNhdXNlIHdlIGNhbid0IGFjdHVhbGx5IHN0b3JlIDY0LWJpdCBpbnRlZ2VycyBwcmVjaXNlbHkuXG4gIC8vIGFmdGVyIDUzIGJpdHMsIEphdmFTY3JpcHQncyBOdW1iZXIgdHlwZSAoSUVFRSA3NTQgZG91YmxlKSBjYW4ndCBzdG9yZSBpbmRpdmlkdWFsIGludGVnZXJzIGFueW1vcmUuXG4gIC8vIGJ1dCBzaW5jZSA1MyBiaXRzIGlzIGEgd2hvbGUgbG90IG1vcmUgdGhhbiAzMiBiaXRzLCB3ZSBkbyBvdXIgYmVzdCBhbnl3YXkuXG4gIHZhciBsb3dlcjMyID0gYnVmZmVyLnJlYWRVSW50MzJMRShvZmZzZXQpO1xuICB2YXIgdXBwZXIzMiA9IGJ1ZmZlci5yZWFkVUludDMyTEUob2Zmc2V0ICsgNCk7XG4gIC8vIHdlIGNhbid0IHVzZSBiaXRzaGlmdGluZyBoZXJlLCBiZWNhdXNlIEphdmFTY3JpcHQgYml0c2hpZnRpbmcgb25seSB3b3JrcyBvbiAzMi1iaXQgaW50ZWdlcnMuXG4gIHJldHVybiB1cHBlcjMyICogMHgxMDAwMDAwMDAgKyBsb3dlcjMyO1xuICAvLyBhcyBsb25nIGFzIHdlJ3JlIGJvdW5kcyBjaGVja2luZyB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gYWdhaW5zdCB0aGUgdG90YWwgZmlsZSBzaXplLFxuICAvLyB3ZSdsbCBjYXRjaCBhbnkgb3ZlcmZsb3cgZXJyb3JzLCBiZWNhdXNlIHdlIGFscmVhZHkgbWFkZSBzdXJlIHRoZSB0b3RhbCBmaWxlIHNpemUgd2FzIHdpdGhpbiByZWFzb24uXG59XG5cbi8vIE5vZGUgMTAgZGVwcmVjYXRlZCBuZXcgQnVmZmVyKCkuXG52YXIgbmV3QnVmZmVyO1xuaWYgKHR5cGVvZiBCdWZmZXIuYWxsb2NVbnNhZmUgPT09IFwiZnVuY3Rpb25cIikge1xuICBuZXdCdWZmZXIgPSBmdW5jdGlvbihsZW4pIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbik7XG4gIH07XG59IGVsc2Uge1xuICBuZXdCdWZmZXIgPSBmdW5jdGlvbihsZW4pIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihsZW4pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q2FsbGJhY2soZXJyKSB7XG4gIGlmIChlcnIpIHRocm93IGVycjtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImFzc2VydFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJidWZmZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb25zdGFudHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImRuc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJldmVudHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnMvcHJvbWlzZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiaHR0cFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJodHRwc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJuZXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZTphc3NlcnQvc3RyaWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlOmV2ZW50c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlOmZzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGU6cGF0aFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlOnByb2Nlc3NcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZTp0ZXN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm9zXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicHJvY2Vzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFkbGluZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzdHJlYW1cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidGxzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInR0eVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1cmxcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidXRpbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ6bGliXCIpOyIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYWxpZ24gPSB7XG4gICAgcmlnaHQ6IGFsaWduUmlnaHQsXG4gICAgY2VudGVyOiBhbGlnbkNlbnRlclxufTtcbmNvbnN0IHRvcCA9IDA7XG5jb25zdCByaWdodCA9IDE7XG5jb25zdCBib3R0b20gPSAyO1xuY29uc3QgbGVmdCA9IDM7XG5jbGFzcyBVSSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoO1xuICAgICAgICB0aGlzLndyYXAgPSAoX2EgPSBvcHRzLndyYXApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRydWU7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgIH1cbiAgICBzcGFuKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuZGl2KC4uLmFyZ3MpO1xuICAgICAgICBjb2xzLnNwYW4gPSB0cnVlO1xuICAgIH1cbiAgICByZXNldE91dHB1dCgpIHtcbiAgICAgICAgdGhpcy5yb3dzID0gW107XG4gICAgfVxuICAgIGRpdiguLi5hcmdzKSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXYoJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndyYXAgJiYgdGhpcy5zaG91bGRBcHBseUxheW91dERTTCguLi5hcmdzKSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5TGF5b3V0RFNMKGFyZ3NbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbHMgPSBhcmdzLm1hcChhcmcgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sRnJvbVN0cmluZyhhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucm93cy5wdXNoKGNvbHMpO1xuICAgICAgICByZXR1cm4gY29scztcbiAgICB9XG4gICAgc2hvdWxkQXBwbHlMYXlvdXREU0woLi4uYXJncykge1xuICAgICAgICByZXR1cm4gYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAvW1xcdFxcbl0vLnRlc3QoYXJnc1swXSk7XG4gICAgfVxuICAgIGFwcGx5TGF5b3V0RFNMKHN0cikge1xuICAgICAgICBjb25zdCByb3dzID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAocm93ID0+IHJvdy5zcGxpdCgnXFx0JykpO1xuICAgICAgICBsZXQgbGVmdENvbHVtbldpZHRoID0gMDtcbiAgICAgICAgLy8gc2ltcGxlIGhldXJpc3RpYyBmb3IgbGF5b3V0LCBtYWtlIHN1cmUgdGhlXG4gICAgICAgIC8vIHNlY29uZCBjb2x1bW4gbGluZXMgdXAgYWxvbmcgdGhlIGxlZnQtaGFuZC5cbiAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZpcnN0IGNvbHVtbiB0byB0YWtlIHVwIG1vcmVcbiAgICAgICAgLy8gdGhhbiA1MCUgb2YgdGhlIHNjcmVlbi5cbiAgICAgICAgcm93cy5mb3JFYWNoKGNvbHVtbnMgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID4gMSAmJiBtaXhpbi5zdHJpbmdXaWR0aChjb2x1bW5zWzBdKSA+IGxlZnRDb2x1bW5XaWR0aCkge1xuICAgICAgICAgICAgICAgIGxlZnRDb2x1bW5XaWR0aCA9IE1hdGgubWluKE1hdGguZmxvb3IodGhpcy53aWR0aCAqIDAuNSksIG1peGluLnN0cmluZ1dpZHRoKGNvbHVtbnNbMF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGdlbmVyYXRlIGEgdGFibGU6XG4gICAgICAgIC8vICByZXBsYWNpbmcgJyAnIHdpdGggcGFkZGluZyBjYWxjdWxhdGlvbnMuXG4gICAgICAgIC8vICB1c2luZyB0aGUgYWxnb3JpdGhtaWNhbGx5IGdlbmVyYXRlZCB3aWR0aC5cbiAgICAgICAgcm93cy5mb3JFYWNoKGNvbHVtbnMgPT4ge1xuICAgICAgICAgICAgdGhpcy5kaXYoLi4uY29sdW1ucy5tYXAoKHIsIGkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiByLnRyaW0oKSxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogdGhpcy5tZWFzdXJlUGFkZGluZyhyKSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IChpID09PSAwICYmIGNvbHVtbnMubGVuZ3RoID4gMSkgPyBsZWZ0Q29sdW1uV2lkdGggOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93c1t0aGlzLnJvd3MubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIGNvbEZyb21TdHJpbmcodGV4dCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHBhZGRpbmc6IHRoaXMubWVhc3VyZVBhZGRpbmcodGV4dClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgbWVhc3VyZVBhZGRpbmcoc3RyKSB7XG4gICAgICAgIC8vIG1lYXN1cmUgcGFkZGluZyB3aXRob3V0IGFuc2kgZXNjYXBlIGNvZGVzXG4gICAgICAgIGNvbnN0IG5vQW5zaSA9IG1peGluLnN0cmlwQW5zaShzdHIpO1xuICAgICAgICByZXR1cm4gWzAsIG5vQW5zaS5tYXRjaCgvXFxzKiQvKVswXS5sZW5ndGgsIDAsIG5vQW5zaS5tYXRjaCgvXlxccyovKVswXS5sZW5ndGhdO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICAgICAgdGhpcy5yb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICAgIHRoaXMucm93VG9TdHJpbmcocm93LCBsaW5lcyk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBkb24ndCBkaXNwbGF5IGFueSBsaW5lcyB3aXRoIHRoZVxuICAgICAgICAvLyBoaWRkZW4gZmxhZyBzZXQuXG4gICAgICAgIHJldHVybiBsaW5lc1xuICAgICAgICAgICAgLmZpbHRlcihsaW5lID0+ICFsaW5lLmhpZGRlbilcbiAgICAgICAgICAgIC5tYXAobGluZSA9PiBsaW5lLnRleHQpXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuICAgIHJvd1RvU3RyaW5nKHJvdywgbGluZXMpIHtcbiAgICAgICAgdGhpcy5yYXN0ZXJpemUocm93KS5mb3JFYWNoKChycm93LCByKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RyID0gJyc7XG4gICAgICAgICAgICBycm93LmZvckVhY2goKGNvbCwgYykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGggfSA9IHJvd1tjXTsgLy8gdGhlIHdpZHRoIHdpdGggcGFkZGluZy5cbiAgICAgICAgICAgICAgICBjb25zdCB3cmFwV2lkdGggPSB0aGlzLm5lZ2F0ZVBhZGRpbmcocm93W2NdKTsgLy8gdGhlIHdpZHRoIHdpdGhvdXQgcGFkZGluZy5cbiAgICAgICAgICAgICAgICBsZXQgdHMgPSBjb2w7IC8vIHRlbXBvcmFyeSBzdHJpbmcgdXNlZCBkdXJpbmcgYWxpZ25tZW50L3BhZGRpbmcuXG4gICAgICAgICAgICAgICAgaWYgKHdyYXBXaWR0aCA+IG1peGluLnN0cmluZ1dpZHRoKGNvbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHMgKz0gJyAnLnJlcGVhdCh3cmFwV2lkdGggLSBtaXhpbi5zdHJpbmdXaWR0aChjb2wpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYWxpZ24gdGhlIHN0cmluZyB3aXRoaW4gaXRzIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBpZiAocm93W2NdLmFsaWduICYmIHJvd1tjXS5hbGlnbiAhPT0gJ2xlZnQnICYmIHRoaXMud3JhcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbiA9IGFsaWduW3Jvd1tjXS5hbGlnbl07XG4gICAgICAgICAgICAgICAgICAgIHRzID0gZm4odHMsIHdyYXBXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaXhpbi5zdHJpbmdXaWR0aCh0cykgPCB3cmFwV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRzICs9ICcgJy5yZXBlYXQoKHdpZHRoIHx8IDApIC0gbWl4aW4uc3RyaW5nV2lkdGgodHMpIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYXBwbHkgYm9yZGVyIGFuZCBwYWRkaW5nIHRvIHN0cmluZy5cbiAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gcm93W2NdLnBhZGRpbmcgfHwgWzAsIDAsIDAsIDBdO1xuICAgICAgICAgICAgICAgIGlmIChwYWRkaW5nW2xlZnRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSAnICcucmVwZWF0KHBhZGRpbmdbbGVmdF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHIgKz0gYWRkQm9yZGVyKHJvd1tjXSwgdHMsICd8ICcpO1xuICAgICAgICAgICAgICAgIHN0ciArPSB0cztcbiAgICAgICAgICAgICAgICBzdHIgKz0gYWRkQm9yZGVyKHJvd1tjXSwgdHMsICcgfCcpO1xuICAgICAgICAgICAgICAgIGlmIChwYWRkaW5nW3JpZ2h0XSkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnLnJlcGVhdChwYWRkaW5nW3JpZ2h0XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIHByaW9yIHJvdyBpcyBzcGFuLCB0cnkgdG8gcmVuZGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcm93IG9uIHRoZSBwcmlvciBsaW5lLlxuICAgICAgICAgICAgICAgIGlmIChyID09PSAwICYmIGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gdGhpcy5yZW5kZXJJbmxpbmUoc3RyLCBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAgICAgICAgICAgIGxpbmVzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRleHQ6IHN0ci5yZXBsYWNlKC8gKyQvLCAnJyksXG4gICAgICAgICAgICAgICAgc3Bhbjogcm93LnNwYW5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH1cbiAgICAvLyBpZiB0aGUgZnVsbCAnc291cmNlJyBjYW4gcmVuZGVyIGluXG4gICAgLy8gdGhlIHRhcmdldCBsaW5lLCBkbyBzby5cbiAgICByZW5kZXJJbmxpbmUoc291cmNlLCBwcmV2aW91c0xpbmUpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBzb3VyY2UubWF0Y2goL14gKi8pO1xuICAgICAgICBjb25zdCBsZWFkaW5nV2hpdGVzcGFjZSA9IG1hdGNoID8gbWF0Y2hbMF0ubGVuZ3RoIDogMDtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcHJldmlvdXNMaW5lLnRleHQ7XG4gICAgICAgIGNvbnN0IHRhcmdldFRleHRXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHRhcmdldC50cmltUmlnaHQoKSk7XG4gICAgICAgIGlmICghcHJldmlvdXNMaW5lLnNwYW4pIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgd2UncmUgbm90IGFwcGx5aW5nIHdyYXBwaW5nIGxvZ2ljLFxuICAgICAgICAvLyBqdXN0IGFsd2F5cyBhcHBlbmQgdG8gdGhlIHNwYW4uXG4gICAgICAgIGlmICghdGhpcy53cmFwKSB7XG4gICAgICAgICAgICBwcmV2aW91c0xpbmUuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQgKyBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlIDwgdGFyZ2V0VGV4dFdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzTGluZS5oaWRkZW4gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGFyZ2V0LnRyaW1SaWdodCgpICsgJyAnLnJlcGVhdChsZWFkaW5nV2hpdGVzcGFjZSAtIHRhcmdldFRleHRXaWR0aCkgKyBzb3VyY2UudHJpbUxlZnQoKTtcbiAgICB9XG4gICAgcmFzdGVyaXplKHJvdykge1xuICAgICAgICBjb25zdCBycm93cyA9IFtdO1xuICAgICAgICBjb25zdCB3aWR0aHMgPSB0aGlzLmNvbHVtbldpZHRocyhyb3cpO1xuICAgICAgICBsZXQgd3JhcHBlZDtcbiAgICAgICAgLy8gd29yZCB3cmFwIGFsbCBjb2x1bW5zLCBhbmQgY3JlYXRlXG4gICAgICAgIC8vIGEgZGF0YS1zdHJ1Y3R1cmUgdGhhdCBpcyBlYXN5IHRvIHJhc3Rlcml6ZS5cbiAgICAgICAgcm93LmZvckVhY2goKGNvbCwgYykgPT4ge1xuICAgICAgICAgICAgLy8gbGVhdmUgcm9vbSBmb3IgbGVmdCBhbmQgcmlnaHQgcGFkZGluZy5cbiAgICAgICAgICAgIGNvbC53aWR0aCA9IHdpZHRoc1tjXTtcbiAgICAgICAgICAgIGlmICh0aGlzLndyYXApIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkID0gbWl4aW4ud3JhcChjb2wudGV4dCwgdGhpcy5uZWdhdGVQYWRkaW5nKGNvbCksIHsgaGFyZDogdHJ1ZSB9KS5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkID0gY29sLnRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnVuc2hpZnQoJy4nICsgJy0nLnJlcGVhdCh0aGlzLm5lZ2F0ZVBhZGRpbmcoY29sKSArIDIpICsgJy4nKTtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnB1c2goXCInXCIgKyAnLScucmVwZWF0KHRoaXMubmVnYXRlUGFkZGluZyhjb2wpICsgMikgKyBcIidcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdG9wIGFuZCBib3R0b20gcGFkZGluZy5cbiAgICAgICAgICAgIGlmIChjb2wucGFkZGluZykge1xuICAgICAgICAgICAgICAgIHdyYXBwZWQudW5zaGlmdCguLi5uZXcgQXJyYXkoY29sLnBhZGRpbmdbdG9wXSB8fCAwKS5maWxsKCcnKSk7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC5wdXNoKC4uLm5ldyBBcnJheShjb2wucGFkZGluZ1tib3R0b21dIHx8IDApLmZpbGwoJycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdyYXBwZWQuZm9yRWFjaCgoc3RyLCByKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFycm93c1tyXSkge1xuICAgICAgICAgICAgICAgICAgICBycm93cy5wdXNoKFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcnJvdyA9IHJyb3dzW3JdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChycm93W2ldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJyb3cucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcnJvdy5wdXNoKHN0cik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBycm93cztcbiAgICB9XG4gICAgbmVnYXRlUGFkZGluZyhjb2wpIHtcbiAgICAgICAgbGV0IHdyYXBXaWR0aCA9IGNvbC53aWR0aCB8fCAwO1xuICAgICAgICBpZiAoY29sLnBhZGRpbmcpIHtcbiAgICAgICAgICAgIHdyYXBXaWR0aCAtPSAoY29sLnBhZGRpbmdbbGVmdF0gfHwgMCkgKyAoY29sLnBhZGRpbmdbcmlnaHRdIHx8IDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgICAgICB3cmFwV2lkdGggLT0gNDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JhcFdpZHRoO1xuICAgIH1cbiAgICBjb2x1bW5XaWR0aHMocm93KSB7XG4gICAgICAgIGlmICghdGhpcy53cmFwKSB7XG4gICAgICAgICAgICByZXR1cm4gcm93Lm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2wud2lkdGggfHwgbWl4aW4uc3RyaW5nV2lkdGgoY29sLnRleHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVuc2V0ID0gcm93Lmxlbmd0aDtcbiAgICAgICAgbGV0IHJlbWFpbmluZ1dpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgLy8gY29sdW1uIHdpZHRocyBjYW4gYmUgc2V0IGluIGNvbmZpZy5cbiAgICAgICAgY29uc3Qgd2lkdGhzID0gcm93Lm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC53aWR0aCkge1xuICAgICAgICAgICAgICAgIHVuc2V0LS07XG4gICAgICAgICAgICAgICAgcmVtYWluaW5nV2lkdGggLT0gY29sLndpZHRoO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2wud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gYW55IHVuc2V0IHdpZHRocyBzaG91bGQgYmUgY2FsY3VsYXRlZC5cbiAgICAgICAgY29uc3QgdW5zZXRXaWR0aCA9IHVuc2V0ID8gTWF0aC5mbG9vcihyZW1haW5pbmdXaWR0aCAvIHVuc2V0KSA6IDA7XG4gICAgICAgIHJldHVybiB3aWR0aHMubWFwKCh3LCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAodyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHVuc2V0V2lkdGgsIF9taW5XaWR0aChyb3dbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3O1xuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRCb3JkZXIoY29sLCB0cywgc3R5bGUpIHtcbiAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICBpZiAoL1suJ10tK1suJ10vLnRlc3QodHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRzLnRyaW0oKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyAgJztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuLy8gY2FsY3VsYXRlcyB0aGUgbWluaW11bSB3aWR0aCBvZlxuLy8gYSBjb2x1bW4sIGJhc2VkIG9uIHBhZGRpbmcgcHJlZmVyZW5jZXMuXG5mdW5jdGlvbiBfbWluV2lkdGgoY29sKSB7XG4gICAgY29uc3QgcGFkZGluZyA9IGNvbC5wYWRkaW5nIHx8IFtdO1xuICAgIGNvbnN0IG1pbldpZHRoID0gMSArIChwYWRkaW5nW2xlZnRdIHx8IDApICsgKHBhZGRpbmdbcmlnaHRdIHx8IDApO1xuICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgIHJldHVybiBtaW5XaWR0aCArIDQ7XG4gICAgfVxuICAgIHJldHVybiBtaW5XaWR0aDtcbn1cbmZ1bmN0aW9uIGdldFdpbmRvd1dpZHRoKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkZXBlbmRzIG9uIHRlcm1pbmFsICovXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnN0ZG91dCAmJiBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zO1xuICAgIH1cbiAgICByZXR1cm4gODA7XG59XG5mdW5jdGlvbiBhbGlnblJpZ2h0KHN0ciwgd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgIGNvbnN0IHN0cldpZHRoID0gbWl4aW4uc3RyaW5nV2lkdGgoc3RyKTtcbiAgICBpZiAoc3RyV2lkdGggPCB3aWR0aCkge1xuICAgICAgICByZXR1cm4gJyAnLnJlcGVhdCh3aWR0aCAtIHN0cldpZHRoKSArIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cbmZ1bmN0aW9uIGFsaWduQ2VudGVyKHN0ciwgd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgIGNvbnN0IHN0cldpZHRoID0gbWl4aW4uc3RyaW5nV2lkdGgoc3RyKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChzdHJXaWR0aCA+PSB3aWR0aCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICByZXR1cm4gJyAnLnJlcGVhdCgod2lkdGggLSBzdHJXaWR0aCkgPj4gMSkgKyBzdHI7XG59XG5sZXQgbWl4aW47XG5mdW5jdGlvbiBjbGl1aShvcHRzLCBfbWl4aW4pIHtcbiAgICBtaXhpbiA9IF9taXhpbjtcbiAgICByZXR1cm4gbmV3IFVJKHtcbiAgICAgICAgd2lkdGg6IChvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMud2lkdGgpIHx8IGdldFdpbmRvd1dpZHRoKCksXG4gICAgICAgIHdyYXA6IG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy53cmFwXG4gICAgfSk7XG59XG5cbi8vIEJvb3RzdHJhcCBjbGl1aSB3aXRoIENvbW1vbkpTIGRlcGVuZGVuY2llczpcbmNvbnN0IHN0cmluZ1dpZHRoID0gcmVxdWlyZSgnc3RyaW5nLXdpZHRoJyk7XG5jb25zdCBzdHJpcEFuc2kgPSByZXF1aXJlKCdzdHJpcC1hbnNpJyk7XG5jb25zdCB3cmFwID0gcmVxdWlyZSgnd3JhcC1hbnNpJyk7XG5mdW5jdGlvbiB1aShvcHRzKSB7XG4gICAgcmV0dXJuIGNsaXVpKG9wdHMsIHtcbiAgICAgICAgc3RyaW5nV2lkdGgsXG4gICAgICAgIHN0cmlwQW5zaSxcbiAgICAgICAgd3JhcFxuICAgIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVpO1xuIiwiY29uc3QgeyBBcmd1bWVudCB9ID0gcmVxdWlyZSgnLi9saWIvYXJndW1lbnQuanMnKTtcbmNvbnN0IHsgQ29tbWFuZCB9ID0gcmVxdWlyZSgnLi9saWIvY29tbWFuZC5qcycpO1xuY29uc3QgeyBDb21tYW5kZXJFcnJvciwgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vbGliL2Vycm9yLmpzJyk7XG5jb25zdCB7IEhlbHAgfSA9IHJlcXVpcmUoJy4vbGliL2hlbHAuanMnKTtcbmNvbnN0IHsgT3B0aW9uIH0gPSByZXF1aXJlKCcuL2xpYi9vcHRpb24uanMnKTtcblxuZXhwb3J0cy5wcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxuZXhwb3J0cy5jcmVhdGVDb21tYW5kID0gKG5hbWUpID0+IG5ldyBDb21tYW5kKG5hbWUpO1xuZXhwb3J0cy5jcmVhdGVPcHRpb24gPSAoZmxhZ3MsIGRlc2NyaXB0aW9uKSA9PiBuZXcgT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG5leHBvcnRzLmNyZWF0ZUFyZ3VtZW50ID0gKG5hbWUsIGRlc2NyaXB0aW9uKSA9PiBuZXcgQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pO1xuXG4vKipcbiAqIEV4cG9zZSBjbGFzc2VzXG4gKi9cblxuZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDtcbmV4cG9ydHMuT3B0aW9uID0gT3B0aW9uO1xuZXhwb3J0cy5Bcmd1bWVudCA9IEFyZ3VtZW50O1xuZXhwb3J0cy5IZWxwID0gSGVscDtcblxuZXhwb3J0cy5Db21tYW5kZXJFcnJvciA9IENvbW1hbmRlckVycm9yO1xuZXhwb3J0cy5JbnZhbGlkQXJndW1lbnRFcnJvciA9IEludmFsaWRBcmd1bWVudEVycm9yO1xuZXhwb3J0cy5JbnZhbGlkT3B0aW9uQXJndW1lbnRFcnJvciA9IEludmFsaWRBcmd1bWVudEVycm9yOyAvLyBEZXByZWNhdGVkXG4iLCJjb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9yLmpzJyk7XG5cbmNsYXNzIEFyZ3VtZW50IHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgY29tbWFuZCBhcmd1bWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBkZXNjcmlwdGlvbi5cbiAgICogVGhlIGRlZmF1bHQgaXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgcmVxdWlyZWQsIGFuZCB5b3UgY2FuIGV4cGxpY2l0bHlcbiAgICogaW5kaWNhdGUgdGhpcyB3aXRoIDw+IGFyb3VuZCB0aGUgbmFtZS4gUHV0IFtdIGFyb3VuZCB0aGUgbmFtZSBmb3IgYW4gb3B0aW9uYWwgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uIHx8ICcnO1xuICAgIHRoaXMudmFyaWFkaWMgPSBmYWxzZTtcbiAgICB0aGlzLnBhcnNlQXJnID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdW5kZWZpbmVkO1xuXG4gICAgc3dpdGNoIChuYW1lWzBdKSB7XG4gICAgICBjYXNlICc8JzogLy8gZS5nLiA8cmVxdWlyZWQ+XG4gICAgICAgIHRoaXMucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZS5zbGljZSgxLCAtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnWyc6IC8vIGUuZy4gW29wdGlvbmFsXVxuICAgICAgICB0aGlzLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9uYW1lLmxlbmd0aCA+IDMgJiYgdGhpcy5fbmFtZS5zbGljZSgtMykgPT09ICcuLi4nKSB7XG4gICAgICB0aGlzLnZhcmlhZGljID0gdHJ1ZTtcbiAgICAgIHRoaXMuX25hbWUgPSB0aGlzLl9uYW1lLnNsaWNlKDAsIC0zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFyZ3VtZW50IG5hbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFja2FnZVxuICAgKi9cblxuICBfY29uY2F0VmFsdWUodmFsdWUsIHByZXZpb3VzKSB7XG4gICAgaWYgKHByZXZpb3VzID09PSB0aGlzLmRlZmF1bHRWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShwcmV2aW91cykpIHtcbiAgICAgIHJldHVybiBbdmFsdWVdO1xuICAgIH1cblxuICAgIHJldHVybiBwcmV2aW91cy5jb25jYXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSwgYW5kIG9wdGlvbmFsbHkgc3VwcGx5IHRoZSBkZXNjcmlwdGlvbiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGRlZmF1bHQodmFsdWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjdXN0b20gaGFuZGxlciBmb3IgcHJvY2Vzc2luZyBDTEkgY29tbWFuZCBhcmd1bWVudHMgaW50byBhcmd1bWVudCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGFyZ1BhcnNlcihmbikge1xuICAgIHRoaXMucGFyc2VBcmcgPSBmbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IGFsbG93IGFyZ3VtZW50IHZhbHVlIHRvIGJlIG9uZSBvZiBjaG9pY2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB2YWx1ZXNcbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGNob2ljZXModmFsdWVzKSB7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdmFsdWVzLnNsaWNlKCk7XG4gICAgdGhpcy5wYXJzZUFyZyA9IChhcmcsIHByZXZpb3VzKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYXJnQ2hvaWNlcy5pbmNsdWRlcyhhcmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgICBgQWxsb3dlZCBjaG9pY2VzIGFyZSAke3RoaXMuYXJnQ2hvaWNlcy5qb2luKCcsICcpfS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmFyaWFkaWMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmNhdFZhbHVlKGFyZywgcHJldmlvdXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYXJndW1lbnQgcmVxdWlyZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBcmd1bWVudH1cbiAgICovXG4gIGFyZ1JlcXVpcmVkKCkge1xuICAgIHRoaXMucmVxdWlyZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYXJndW1lbnQgb3B0aW9uYWwuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBcmd1bWVudH1cbiAgICovXG4gIGFyZ09wdGlvbmFsKCkge1xuICAgIHRoaXMucmVxdWlyZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKipcbiAqIFRha2VzIGFuIGFyZ3VtZW50IGFuZCByZXR1cm5zIGl0cyBodW1hbiByZWFkYWJsZSBlcXVpdmFsZW50IGZvciBoZWxwIHVzYWdlLlxuICpcbiAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBodW1hblJlYWRhYmxlQXJnTmFtZShhcmcpIHtcbiAgY29uc3QgbmFtZU91dHB1dCA9IGFyZy5uYW1lKCkgKyAoYXJnLnZhcmlhZGljID09PSB0cnVlID8gJy4uLicgOiAnJyk7XG5cbiAgcmV0dXJuIGFyZy5yZXF1aXJlZCA/ICc8JyArIG5hbWVPdXRwdXQgKyAnPicgOiAnWycgKyBuYW1lT3V0cHV0ICsgJ10nO1xufVxuXG5leHBvcnRzLkFyZ3VtZW50ID0gQXJndW1lbnQ7XG5leHBvcnRzLmh1bWFuUmVhZGFibGVBcmdOYW1lID0gaHVtYW5SZWFkYWJsZUFyZ05hbWU7XG4iLCJjb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdub2RlOmV2ZW50cycpLkV2ZW50RW1pdHRlcjtcbmNvbnN0IGNoaWxkUHJvY2VzcyA9IHJlcXVpcmUoJ25vZGU6Y2hpbGRfcHJvY2VzcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ25vZGU6cGF0aCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdub2RlOmZzJyk7XG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgnbm9kZTpwcm9jZXNzJyk7XG5cbmNvbnN0IHsgQXJndW1lbnQsIGh1bWFuUmVhZGFibGVBcmdOYW1lIH0gPSByZXF1aXJlKCcuL2FyZ3VtZW50LmpzJyk7XG5jb25zdCB7IENvbW1hbmRlckVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9yLmpzJyk7XG5jb25zdCB7IEhlbHAgfSA9IHJlcXVpcmUoJy4vaGVscC5qcycpO1xuY29uc3QgeyBPcHRpb24sIER1YWxPcHRpb25zIH0gPSByZXF1aXJlKCcuL29wdGlvbi5qcycpO1xuY29uc3QgeyBzdWdnZXN0U2ltaWxhciB9ID0gcmVxdWlyZSgnLi9zdWdnZXN0U2ltaWxhcicpO1xuXG5jbGFzcyBDb21tYW5kIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgYENvbW1hbmRgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcigpO1xuICAgIC8qKiBAdHlwZSB7Q29tbWFuZFtdfSAqL1xuICAgIHRoaXMuY29tbWFuZHMgPSBbXTtcbiAgICAvKiogQHR5cGUge09wdGlvbltdfSAqL1xuICAgIHRoaXMub3B0aW9ucyA9IFtdO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9hbGxvd1Vua25vd25PcHRpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cyA9IHRydWU7XG4gICAgLyoqIEB0eXBlIHtBcmd1bWVudFtdfSAqL1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cyA9IFtdO1xuICAgIHRoaXMuX2FyZ3MgPSB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHM7IC8vIGRlcHJlY2F0ZWQgb2xkIG5hbWVcbiAgICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIHRoaXMuYXJncyA9IFtdOyAvLyBjbGkgYXJncyB3aXRoIG9wdGlvbnMgcmVtb3ZlZFxuICAgIHRoaXMucmF3QXJncyA9IFtdO1xuICAgIHRoaXMucHJvY2Vzc2VkQXJncyA9IFtdOyAvLyBsaWtlIC5hcmdzIGJ1dCBhZnRlciBjdXN0b20gcHJvY2Vzc2luZyBhbmQgY29sbGVjdGluZyB2YXJpYWRpY1xuICAgIHRoaXMuX3NjcmlwdFBhdGggPSBudWxsO1xuICAgIHRoaXMuX25hbWUgPSBuYW1lIHx8ICcnO1xuICAgIHRoaXMuX29wdGlvblZhbHVlcyA9IHt9O1xuICAgIHRoaXMuX29wdGlvblZhbHVlU291cmNlcyA9IHt9OyAvLyBkZWZhdWx0LCBlbnYsIGNsaSBldGNcbiAgICB0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMgPSBmYWxzZTtcbiAgICB0aGlzLl9hY3Rpb25IYW5kbGVyID0gbnVsbDtcbiAgICB0aGlzLl9leGVjdXRhYmxlSGFuZGxlciA9IGZhbHNlO1xuICAgIHRoaXMuX2V4ZWN1dGFibGVGaWxlID0gbnVsbDsgLy8gY3VzdG9tIG5hbWUgZm9yIGV4ZWN1dGFibGVcbiAgICB0aGlzLl9leGVjdXRhYmxlRGlyID0gbnVsbDsgLy8gY3VzdG9tIHNlYXJjaCBkaXJlY3RvcnkgZm9yIHN1YmNvbW1hbmRzXG4gICAgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gbnVsbDtcbiAgICB0aGlzLl9leGl0Q2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX2FsaWFzZXMgPSBbXTtcbiAgICB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gJyc7XG4gICAgdGhpcy5fc3VtbWFyeSA9ICcnO1xuICAgIHRoaXMuX2FyZ3NEZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDsgLy8gbGVnYWN5XG4gICAgdGhpcy5fZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgPSBmYWxzZTtcbiAgICB0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMgPSBmYWxzZTtcbiAgICB0aGlzLl9saWZlQ3ljbGVIb29rcyA9IHt9OyAvLyBhIGhhc2ggb2YgYXJyYXlzXG4gICAgLyoqIEB0eXBlIHsoYm9vbGVhbiB8IHN0cmluZyl9ICovXG4gICAgdGhpcy5fc2hvd0hlbHBBZnRlckVycm9yID0gZmFsc2U7XG4gICAgdGhpcy5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yID0gdHJ1ZTtcblxuICAgIC8vIHNlZSAuY29uZmlndXJlT3V0cHV0KCkgZm9yIGRvY3NcbiAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uID0ge1xuICAgICAgd3JpdGVPdXQ6IChzdHIpID0+IHByb2Nlc3Muc3Rkb3V0LndyaXRlKHN0ciksXG4gICAgICB3cml0ZUVycjogKHN0cikgPT4gcHJvY2Vzcy5zdGRlcnIud3JpdGUoc3RyKSxcbiAgICAgIGdldE91dEhlbHBXaWR0aDogKCkgPT5cbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQuaXNUVFkgPyBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zIDogdW5kZWZpbmVkLFxuICAgICAgZ2V0RXJySGVscFdpZHRoOiAoKSA9PlxuICAgICAgICBwcm9jZXNzLnN0ZGVyci5pc1RUWSA/IHByb2Nlc3Muc3RkZXJyLmNvbHVtbnMgOiB1bmRlZmluZWQsXG4gICAgICBvdXRwdXRFcnJvcjogKHN0ciwgd3JpdGUpID0+IHdyaXRlKHN0ciksXG4gICAgfTtcblxuICAgIHRoaXMuX2hpZGRlbiA9IGZhbHNlO1xuICAgIC8qKiBAdHlwZSB7KE9wdGlvbiB8IG51bGwgfCB1bmRlZmluZWQpfSAqL1xuICAgIHRoaXMuX2hlbHBPcHRpb24gPSB1bmRlZmluZWQ7IC8vIExhenkgY3JlYXRlZCBvbiBkZW1hbmQuIE1heSBiZSBudWxsIGlmIGhlbHAgb3B0aW9uIGlzIGRpc2FibGVkLlxuICAgIHRoaXMuX2FkZEltcGxpY2l0SGVscENvbW1hbmQgPSB1bmRlZmluZWQ7IC8vIHVuZGVjaWRlZCB3aGV0aGVyIHRydWUgb3IgZmFsc2UgeWV0LCBub3QgaW5oZXJpdGVkXG4gICAgLyoqIEB0eXBlIHtDb21tYW5kfSAqL1xuICAgIHRoaXMuX2hlbHBDb21tYW5kID0gdW5kZWZpbmVkOyAvLyBsYXp5IGluaXRpYWxpc2VkLCBpbmhlcml0ZWRcbiAgICB0aGlzLl9oZWxwQ29uZmlndXJhdGlvbiA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgc2V0dGluZ3MgdGhhdCBhcmUgdXNlZnVsIHRvIGhhdmUgaW4gY29tbW9uIGFjcm9zcyByb290IGNvbW1hbmQgYW5kIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiAoVXNlZCBpbnRlcm5hbGx5IHdoZW4gYWRkaW5nIGEgY29tbWFuZCB1c2luZyBgLmNvbW1hbmQoKWAgc28gc3ViY29tbWFuZHMgaW5oZXJpdCBwYXJlbnQgc2V0dGluZ3MuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IHNvdXJjZUNvbW1hbmRcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBjb3B5SW5oZXJpdGVkU2V0dGluZ3Moc291cmNlQ29tbWFuZCkge1xuICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24gPSBzb3VyY2VDb21tYW5kLl9vdXRwdXRDb25maWd1cmF0aW9uO1xuICAgIHRoaXMuX2hlbHBPcHRpb24gPSBzb3VyY2VDb21tYW5kLl9oZWxwT3B0aW9uO1xuICAgIHRoaXMuX2hlbHBDb21tYW5kID0gc291cmNlQ29tbWFuZC5faGVscENvbW1hbmQ7XG4gICAgdGhpcy5faGVscENvbmZpZ3VyYXRpb24gPSBzb3VyY2VDb21tYW5kLl9oZWxwQ29uZmlndXJhdGlvbjtcbiAgICB0aGlzLl9leGl0Q2FsbGJhY2sgPSBzb3VyY2VDb21tYW5kLl9leGl0Q2FsbGJhY2s7XG4gICAgdGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzID0gc291cmNlQ29tbWFuZC5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzO1xuICAgIHRoaXMuX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZSA9XG4gICAgICBzb3VyY2VDb21tYW5kLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWU7XG4gICAgdGhpcy5fYWxsb3dFeGNlc3NBcmd1bWVudHMgPSBzb3VyY2VDb21tYW5kLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cztcbiAgICB0aGlzLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucyA9IHNvdXJjZUNvbW1hbmQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zO1xuICAgIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9IHNvdXJjZUNvbW1hbmQuX3Nob3dIZWxwQWZ0ZXJFcnJvcjtcbiAgICB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IgPSBzb3VyY2VDb21tYW5kLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3I7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Q29tbWFuZFtdfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBmb3IgKGxldCBjb21tYW5kID0gdGhpczsgY29tbWFuZDsgY29tbWFuZCA9IGNvbW1hbmQucGFyZW50KSB7XG4gICAgICByZXN1bHQucHVzaChjb21tYW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgYSBjb21tYW5kLlxuICAgKlxuICAgKiBUaGVyZSBhcmUgdHdvIHN0eWxlcyBvZiBjb21tYW5kOiBwYXkgYXR0ZW50aW9uIHRvIHdoZXJlIHRvIHB1dCB0aGUgZGVzY3JpcHRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENvbW1hbmQgaW1wbGVtZW50ZWQgdXNpbmcgYWN0aW9uIGhhbmRsZXIgKGRlc2NyaXB0aW9uIGlzIHN1cHBsaWVkIHNlcGFyYXRlbHkgdG8gYC5jb21tYW5kYClcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5jb21tYW5kKCdjbG9uZSA8c291cmNlPiBbZGVzdGluYXRpb25dJylcbiAgICogICAuZGVzY3JpcHRpb24oJ2Nsb25lIGEgcmVwb3NpdG9yeSBpbnRvIGEgbmV3bHkgY3JlYXRlZCBkaXJlY3RvcnknKVxuICAgKiAgIC5hY3Rpb24oKHNvdXJjZSwgZGVzdGluYXRpb24pID0+IHtcbiAgICogICAgIGNvbnNvbGUubG9nKCdjbG9uZSBjb21tYW5kIGNhbGxlZCcpO1xuICAgKiAgIH0pO1xuICAgKlxuICAgKiAvLyBDb21tYW5kIGltcGxlbWVudGVkIHVzaW5nIHNlcGFyYXRlIGV4ZWN1dGFibGUgZmlsZSAoZGVzY3JpcHRpb24gaXMgc2Vjb25kIHBhcmFtZXRlciB0byBgLmNvbW1hbmRgKVxuICAgKiBwcm9ncmFtXG4gICAqICAgLmNvbW1hbmQoJ3N0YXJ0IDxzZXJ2aWNlPicsICdzdGFydCBuYW1lZCBzZXJ2aWNlJylcbiAgICogICAuY29tbWFuZCgnc3RvcCBbc2VydmljZV0nLCAnc3RvcCBuYW1lZCBzZXJ2aWNlLCBvciBhbGwgaWYgbm8gbmFtZSBzdXBwbGllZCcpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZUFuZEFyZ3MgLSBjb21tYW5kIG5hbWUgYW5kIGFyZ3VtZW50cywgYXJncyBhcmUgYDxyZXF1aXJlZD5gIG9yIGBbb3B0aW9uYWxdYCBhbmQgbGFzdCBtYXkgYWxzbyBiZSBgdmFyaWFkaWMuLi5gXG4gICAqIEBwYXJhbSB7KG9iamVjdCB8IHN0cmluZyl9IFthY3Rpb25PcHRzT3JFeGVjRGVzY10gLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKGZvciBhY3Rpb24pLCBvciBkZXNjcmlwdGlvbiAoZm9yIGV4ZWN1dGFibGUpXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbZXhlY09wdHNdIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIChmb3IgZXhlY3V0YWJsZSlcbiAgICogQHJldHVybiB7Q29tbWFuZH0gcmV0dXJucyBuZXcgY29tbWFuZCBmb3IgYWN0aW9uIGhhbmRsZXIsIG9yIGB0aGlzYCBmb3IgZXhlY3V0YWJsZSBjb21tYW5kXG4gICAqL1xuXG4gIGNvbW1hbmQobmFtZUFuZEFyZ3MsIGFjdGlvbk9wdHNPckV4ZWNEZXNjLCBleGVjT3B0cykge1xuICAgIGxldCBkZXNjID0gYWN0aW9uT3B0c09yRXhlY0Rlc2M7XG4gICAgbGV0IG9wdHMgPSBleGVjT3B0cztcbiAgICBpZiAodHlwZW9mIGRlc2MgPT09ICdvYmplY3QnICYmIGRlc2MgIT09IG51bGwpIHtcbiAgICAgIG9wdHMgPSBkZXNjO1xuICAgICAgZGVzYyA9IG51bGw7XG4gICAgfVxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIGNvbnN0IFssIG5hbWUsIGFyZ3NdID0gbmFtZUFuZEFyZ3MubWF0Y2goLyhbXiBdKykgKiguKikvKTtcblxuICAgIGNvbnN0IGNtZCA9IHRoaXMuY3JlYXRlQ29tbWFuZChuYW1lKTtcbiAgICBpZiAoZGVzYykge1xuICAgICAgY21kLmRlc2NyaXB0aW9uKGRlc2MpO1xuICAgICAgY21kLl9leGVjdXRhYmxlSGFuZGxlciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChvcHRzLmlzRGVmYXVsdCkgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gY21kLl9uYW1lO1xuICAgIGNtZC5faGlkZGVuID0gISEob3B0cy5ub0hlbHAgfHwgb3B0cy5oaWRkZW4pOyAvLyBub0hlbHAgaXMgZGVwcmVjYXRlZCBvbGQgbmFtZSBmb3IgaGlkZGVuXG4gICAgY21kLl9leGVjdXRhYmxlRmlsZSA9IG9wdHMuZXhlY3V0YWJsZUZpbGUgfHwgbnVsbDsgLy8gQ3VzdG9tIG5hbWUgZm9yIGV4ZWN1dGFibGUgZmlsZSwgc2V0IG1pc3NpbmcgdG8gbnVsbCB0byBtYXRjaCBjb25zdHJ1Y3RvclxuICAgIGlmIChhcmdzKSBjbWQuYXJndW1lbnRzKGFyZ3MpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29tbWFuZChjbWQpO1xuICAgIGNtZC5wYXJlbnQgPSB0aGlzO1xuICAgIGNtZC5jb3B5SW5oZXJpdGVkU2V0dGluZ3ModGhpcyk7XG5cbiAgICBpZiAoZGVzYykgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIGNtZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IHJvdXRpbmUgdG8gY3JlYXRlIGEgbmV3IHVuYXR0YWNoZWQgY29tbWFuZC5cbiAgICpcbiAgICogU2VlIC5jb21tYW5kKCkgZm9yIGNyZWF0aW5nIGFuIGF0dGFjaGVkIHN1YmNvbW1hbmQsIHdoaWNoIHVzZXMgdGhpcyByb3V0aW5lIHRvXG4gICAqIGNyZWF0ZSB0aGUgY29tbWFuZC4gWW91IGNhbiBvdmVycmlkZSBjcmVhdGVDb21tYW5kIHRvIGN1c3RvbWlzZSBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBuZXcgY29tbWFuZFxuICAgKi9cblxuICBjcmVhdGVDb21tYW5kKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IENvbW1hbmQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogWW91IGNhbiBjdXN0b21pc2UgdGhlIGhlbHAgd2l0aCBhIHN1YmNsYXNzIG9mIEhlbHAgYnkgb3ZlcnJpZGluZyBjcmVhdGVIZWxwLFxuICAgKiBvciBieSBvdmVycmlkaW5nIEhlbHAgcHJvcGVydGllcyB1c2luZyBjb25maWd1cmVIZWxwKCkuXG4gICAqXG4gICAqIEByZXR1cm4ge0hlbHB9XG4gICAqL1xuXG4gIGNyZWF0ZUhlbHAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEhlbHAoKSwgdGhpcy5jb25maWd1cmVIZWxwKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gY3VzdG9taXNlIHRoZSBoZWxwIGJ5IG92ZXJyaWRpbmcgSGVscCBwcm9wZXJ0aWVzIHVzaW5nIGNvbmZpZ3VyZUhlbHAoKSxcbiAgICogb3Igd2l0aCBhIHN1YmNsYXNzIG9mIEhlbHAgYnkgb3ZlcnJpZGluZyBjcmVhdGVIZWxwKCkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbY29uZmlndXJhdGlvbl0gLSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybiB7KENvbW1hbmQgfCBvYmplY3QpfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmcsIG9yIHN0b3JlZCBjb25maWd1cmF0aW9uXG4gICAqL1xuXG4gIGNvbmZpZ3VyZUhlbHAoY29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9oZWxwQ29uZmlndXJhdGlvbjtcblxuICAgIHRoaXMuX2hlbHBDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBvdXRwdXQgZ29lcyB0byBzdGRvdXQgYW5kIHN0ZGVyci4gWW91IGNhbiBjdXN0b21pc2UgdGhpcyBmb3Igc3BlY2lhbFxuICAgKiBhcHBsaWNhdGlvbnMuIFlvdSBjYW4gYWxzbyBjdXN0b21pc2UgdGhlIGRpc3BsYXkgb2YgZXJyb3JzIGJ5IG92ZXJyaWRpbmcgb3V0cHV0RXJyb3IuXG4gICAqXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgYXJlIGFsbCBmdW5jdGlvbnM6XG4gICAqXG4gICAqICAgICAvLyBmdW5jdGlvbnMgdG8gY2hhbmdlIHdoZXJlIGJlaW5nIHdyaXR0ZW4sIHN0ZG91dCBhbmQgc3RkZXJyXG4gICAqICAgICB3cml0ZU91dChzdHIpXG4gICAqICAgICB3cml0ZUVycihzdHIpXG4gICAqICAgICAvLyBtYXRjaGluZyBmdW5jdGlvbnMgdG8gc3BlY2lmeSB3aWR0aCBmb3Igd3JhcHBpbmcgaGVscFxuICAgKiAgICAgZ2V0T3V0SGVscFdpZHRoKClcbiAgICogICAgIGdldEVyckhlbHBXaWR0aCgpXG4gICAqICAgICAvLyBmdW5jdGlvbnMgYmFzZWQgb24gd2hhdCBpcyBiZWluZyB3cml0dGVuIG91dFxuICAgKiAgICAgb3V0cHV0RXJyb3Ioc3RyLCB3cml0ZSkgLy8gdXNlZCBmb3IgZGlzcGxheWluZyBlcnJvcnMsIGFuZCBub3QgdXNlZCBmb3IgZGlzcGxheWluZyBoZWxwXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbY29uZmlndXJhdGlvbl0gLSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybiB7KENvbW1hbmQgfCBvYmplY3QpfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmcsIG9yIHN0b3JlZCBjb25maWd1cmF0aW9uXG4gICAqL1xuXG4gIGNvbmZpZ3VyZU91dHB1dChjb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb247XG5cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgdGhlIGhlbHAgb3IgYSBjdXN0b20gbWVzc2FnZSBhZnRlciBhbiBlcnJvciBvY2N1cnMuXG4gICAqXG4gICAqIEBwYXJhbSB7KGJvb2xlYW58c3RyaW5nKX0gW2Rpc3BsYXlIZWxwXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHNob3dIZWxwQWZ0ZXJFcnJvcihkaXNwbGF5SGVscCA9IHRydWUpIHtcbiAgICBpZiAodHlwZW9mIGRpc3BsYXlIZWxwICE9PSAnc3RyaW5nJykgZGlzcGxheUhlbHAgPSAhIWRpc3BsYXlIZWxwO1xuICAgIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9IGRpc3BsYXlIZWxwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgc3VnZ2VzdGlvbiBvZiBzaW1pbGFyIGNvbW1hbmRzIGZvciB1bmtub3duIGNvbW1hbmRzLCBvciBvcHRpb25zIGZvciB1bmtub3duIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Rpc3BsYXlTdWdnZXN0aW9uXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHNob3dTdWdnZXN0aW9uQWZ0ZXJFcnJvcihkaXNwbGF5U3VnZ2VzdGlvbiA9IHRydWUpIHtcbiAgICB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IgPSAhIWRpc3BsYXlTdWdnZXN0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHByZXBhcmVkIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIFNlZSAuY29tbWFuZCgpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBzdWJjb21tYW5kIHdoaWNoIGluaGVyaXRzIHNldHRpbmdzIGZyb20gaXRzIHBhcmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWQgLSBuZXcgc3ViY29tbWFuZFxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdHNdIC0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBhZGRDb21tYW5kKGNtZCwgb3B0cykge1xuICAgIGlmICghY21kLl9uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbW1hbmQgcGFzc2VkIHRvIC5hZGRDb21tYW5kKCkgbXVzdCBoYXZlIGEgbmFtZVxuLSBzcGVjaWZ5IHRoZSBuYW1lIGluIENvbW1hbmQgY29uc3RydWN0b3Igb3IgdXNpbmcgLm5hbWUoKWApO1xuICAgIH1cblxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIGlmIChvcHRzLmlzRGVmYXVsdCkgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gY21kLl9uYW1lO1xuICAgIGlmIChvcHRzLm5vSGVscCB8fCBvcHRzLmhpZGRlbikgY21kLl9oaWRkZW4gPSB0cnVlOyAvLyBtb2RpZnlpbmcgcGFzc2VkIGNvbW1hbmQgZHVlIHRvIGV4aXN0aW5nIGltcGxlbWVudGF0aW9uXG5cbiAgICB0aGlzLl9yZWdpc3RlckNvbW1hbmQoY21kKTtcbiAgICBjbWQucGFyZW50ID0gdGhpcztcbiAgICBjbWQuX2NoZWNrRm9yQnJva2VuUGFzc1Rocm91Z2goKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3Rvcnkgcm91dGluZSB0byBjcmVhdGUgYSBuZXcgdW5hdHRhY2hlZCBhcmd1bWVudC5cbiAgICpcbiAgICogU2VlIC5hcmd1bWVudCgpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBhcmd1bWVudCwgd2hpY2ggdXNlcyB0aGlzIHJvdXRpbmUgdG9cbiAgICogY3JlYXRlIHRoZSBhcmd1bWVudC4gWW91IGNhbiBvdmVycmlkZSBjcmVhdGVBcmd1bWVudCB0byByZXR1cm4gYSBjdXN0b20gYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge0FyZ3VtZW50fSBuZXcgYXJndW1lbnRcbiAgICovXG5cbiAgY3JlYXRlQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pIHtcbiAgICByZXR1cm4gbmV3IEFyZ3VtZW50KG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgYXJndW1lbnQgc3ludGF4IGZvciBjb21tYW5kLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBpcyB0aGF0IHRoZSBhcmd1bWVudCBpcyByZXF1aXJlZCwgYW5kIHlvdSBjYW4gZXhwbGljaXRseVxuICAgKiBpbmRpY2F0ZSB0aGlzIHdpdGggPD4gYXJvdW5kIHRoZSBuYW1lLiBQdXQgW10gYXJvdW5kIHRoZSBuYW1lIGZvciBhbiBvcHRpb25hbCBhcmd1bWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5hcmd1bWVudCgnPGlucHV0LWZpbGU+Jyk7XG4gICAqIHByb2dyYW0uYXJndW1lbnQoJ1tvdXRwdXQtZmlsZV0nKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtIHsoRnVuY3Rpb258Kil9IFtmbl0gLSBjdXN0b20gYXJndW1lbnQgcHJvY2Vzc2luZyBmdW5jdGlvblxuICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24sIGZuLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCBhcmd1bWVudCA9IHRoaXMuY3JlYXRlQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFyZ3VtZW50LmRlZmF1bHQoZGVmYXVsdFZhbHVlKS5hcmdQYXJzZXIoZm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcmd1bWVudC5kZWZhdWx0KGZuKTtcbiAgICB9XG4gICAgdGhpcy5hZGRBcmd1bWVudChhcmd1bWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGFyZ3VtZW50IHN5bnRheCBmb3IgY29tbWFuZCwgYWRkaW5nIG11bHRpcGxlIGF0IG9uY2UgKHdpdGhvdXQgZGVzY3JpcHRpb25zKS5cbiAgICpcbiAgICogU2VlIGFsc28gLmFyZ3VtZW50KCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uYXJndW1lbnRzKCc8Y21kPiBbZW52XScpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGFyZ3VtZW50cyhuYW1lcykge1xuICAgIG5hbWVzXG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoLyArLylcbiAgICAgIC5mb3JFYWNoKChkZXRhaWwpID0+IHtcbiAgICAgICAgdGhpcy5hcmd1bWVudChkZXRhaWwpO1xuICAgICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGFyZ3VtZW50IHN5bnRheCBmb3IgY29tbWFuZCwgYWRkaW5nIGEgcHJlcGFyZWQgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkQXJndW1lbnQoYXJndW1lbnQpIHtcbiAgICBjb25zdCBwcmV2aW91c0FyZ3VtZW50ID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLnNsaWNlKC0xKVswXTtcbiAgICBpZiAocHJldmlvdXNBcmd1bWVudCAmJiBwcmV2aW91c0FyZ3VtZW50LnZhcmlhZGljKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBvbmx5IHRoZSBsYXN0IGFyZ3VtZW50IGNhbiBiZSB2YXJpYWRpYyAnJHtwcmV2aW91c0FyZ3VtZW50Lm5hbWUoKX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGFyZ3VtZW50LnJlcXVpcmVkICYmXG4gICAgICBhcmd1bWVudC5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgYXJndW1lbnQucGFyc2VBcmcgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYSBkZWZhdWx0IHZhbHVlIGZvciBhIHJlcXVpcmVkIGFyZ3VtZW50IGlzIG5ldmVyIHVzZWQ6ICcke2FyZ3VtZW50Lm5hbWUoKX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5wdXNoKGFyZ3VtZW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b21pc2Ugb3Igb3ZlcnJpZGUgZGVmYXVsdCBoZWxwIGNvbW1hbmQuIEJ5IGRlZmF1bHQgYSBoZWxwIGNvbW1hbmQgaXMgYXV0b21hdGljYWxseSBhZGRlZCBpZiB5b3VyIGNvbW1hbmQgaGFzIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKCdoZWxwIFtjbWRdJyk7XG4gICAqICAgIHByb2dyYW0uaGVscENvbW1hbmQoJ2hlbHAgW2NtZF0nLCAnc2hvdyBoZWxwJyk7XG4gICAqICAgIHByb2dyYW0uaGVscENvbW1hbmQoZmFsc2UpOyAvLyBzdXBwcmVzcyBkZWZhdWx0IGhlbHAgY29tbWFuZFxuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKHRydWUpOyAvLyBhZGQgaGVscCBjb21tYW5kIGV2ZW4gaWYgbm8gc3ViY29tbWFuZHNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8Ym9vbGVhbn0gZW5hYmxlT3JOYW1lQW5kQXJncyAtIGVuYWJsZSB3aXRoIGN1c3RvbSBuYW1lIGFuZC9vciBhcmd1bWVudHMsIG9yIGJvb2xlYW4gdG8gb3ZlcnJpZGUgd2hldGhlciBhZGRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXSAtIGN1c3RvbSBkZXNjcmlwdGlvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaGVscENvbW1hbmQoZW5hYmxlT3JOYW1lQW5kQXJncywgZGVzY3JpcHRpb24pIHtcbiAgICBpZiAodHlwZW9mIGVuYWJsZU9yTmFtZUFuZEFyZ3MgPT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IGVuYWJsZU9yTmFtZUFuZEFyZ3M7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBlbmFibGVPck5hbWVBbmRBcmdzID0gZW5hYmxlT3JOYW1lQW5kQXJncyA/PyAnaGVscCBbY29tbWFuZF0nO1xuICAgIGNvbnN0IFssIGhlbHBOYW1lLCBoZWxwQXJnc10gPSBlbmFibGVPck5hbWVBbmRBcmdzLm1hdGNoKC8oW14gXSspICooLiopLyk7XG4gICAgY29uc3QgaGVscERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPz8gJ2Rpc3BsYXkgaGVscCBmb3IgY29tbWFuZCc7XG5cbiAgICBjb25zdCBoZWxwQ29tbWFuZCA9IHRoaXMuY3JlYXRlQ29tbWFuZChoZWxwTmFtZSk7XG4gICAgaGVscENvbW1hbmQuaGVscE9wdGlvbihmYWxzZSk7XG4gICAgaWYgKGhlbHBBcmdzKSBoZWxwQ29tbWFuZC5hcmd1bWVudHMoaGVscEFyZ3MpO1xuICAgIGlmIChoZWxwRGVzY3JpcHRpb24pIGhlbHBDb21tYW5kLmRlc2NyaXB0aW9uKGhlbHBEZXNjcmlwdGlvbik7XG5cbiAgICB0aGlzLl9hZGRJbXBsaWNpdEhlbHBDb21tYW5kID0gdHJ1ZTtcbiAgICB0aGlzLl9oZWxwQ29tbWFuZCA9IGhlbHBDb21tYW5kO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHByZXBhcmVkIGN1c3RvbSBoZWxwIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7KENvbW1hbmR8c3RyaW5nfGJvb2xlYW4pfSBoZWxwQ29tbWFuZCAtIGN1c3RvbSBoZWxwIGNvbW1hbmQsIG9yIGRlcHJlY2F0ZWQgZW5hYmxlT3JOYW1lQW5kQXJncyBhcyBmb3IgYC5oZWxwQ29tbWFuZCgpYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RlcHJlY2F0ZWREZXNjcmlwdGlvbl0gLSBkZXByZWNhdGVkIGN1c3RvbSBkZXNjcmlwdGlvbiB1c2VkIHdpdGggY3VzdG9tIG5hbWUgb25seVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEhlbHBDb21tYW5kKGhlbHBDb21tYW5kLCBkZXByZWNhdGVkRGVzY3JpcHRpb24pIHtcbiAgICAvLyBJZiBub3QgcGFzc2VkIGFuIG9iamVjdCwgY2FsbCB0aHJvdWdoIHRvIGhlbHBDb21tYW5kIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSxcbiAgICAvLyBhcyBhZGRIZWxwQ29tbWFuZCB3YXMgb3JpZ2luYWxseSB1c2VkIGxpa2UgaGVscENvbW1hbmQgaXMgbm93LlxuICAgIGlmICh0eXBlb2YgaGVscENvbW1hbmQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmhlbHBDb21tYW5kKGhlbHBDb21tYW5kLCBkZXByZWNhdGVkRGVzY3JpcHRpb24pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IHRydWU7XG4gICAgdGhpcy5faGVscENvbW1hbmQgPSBoZWxwQ29tbWFuZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXp5IGNyZWF0ZSBoZWxwIGNvbW1hbmQuXG4gICAqXG4gICAqIEByZXR1cm4geyhDb21tYW5kfG51bGwpfVxuICAgKiBAcGFja2FnZVxuICAgKi9cbiAgX2dldEhlbHBDb21tYW5kKCkge1xuICAgIGNvbnN0IGhhc0ltcGxpY2l0SGVscENvbW1hbmQgPVxuICAgICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA/P1xuICAgICAgKHRoaXMuY29tbWFuZHMubGVuZ3RoICYmXG4gICAgICAgICF0aGlzLl9hY3Rpb25IYW5kbGVyICYmXG4gICAgICAgICF0aGlzLl9maW5kQ29tbWFuZCgnaGVscCcpKTtcblxuICAgIGlmIChoYXNJbXBsaWNpdEhlbHBDb21tYW5kKSB7XG4gICAgICBpZiAodGhpcy5faGVscENvbW1hbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmhlbHBDb21tYW5kKHVuZGVmaW5lZCwgdW5kZWZpbmVkKTsgLy8gdXNlIGRlZmF1bHQgbmFtZSBhbmQgZGVzY3JpcHRpb25cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9oZWxwQ29tbWFuZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGhvb2sgZm9yIGxpZmUgY3ljbGUgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaG9vayhldmVudCwgbGlzdGVuZXIpIHtcbiAgICBjb25zdCBhbGxvd2VkVmFsdWVzID0gWydwcmVTdWJjb21tYW5kJywgJ3ByZUFjdGlvbicsICdwb3N0QWN0aW9uJ107XG4gICAgaWYgKCFhbGxvd2VkVmFsdWVzLmluY2x1ZGVzKGV2ZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciBldmVudCBwYXNzZWQgdG8gaG9vayA6ICcke2V2ZW50fScuXG5FeHBlY3Rpbmcgb25lIG9mICcke2FsbG93ZWRWYWx1ZXMuam9pbihcIicsICdcIil9J2ApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdKSB7XG4gICAgICB0aGlzLl9saWZlQ3ljbGVIb29rc1tldmVudF0ucHVzaChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XSA9IFtsaXN0ZW5lcl07XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGNhbGxiYWNrIHRvIHVzZSBhcyByZXBsYWNlbWVudCBmb3IgY2FsbGluZyBwcm9jZXNzLmV4aXQuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl0gb3B0aW9uYWwgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBwYXNzZWQgYSBDb21tYW5kZXJFcnJvciwgZGVmYXVsdHMgdG8gdGhyb3dpbmdcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGV4aXRPdmVycmlkZShmbikge1xuICAgIGlmIChmbikge1xuICAgICAgdGhpcy5fZXhpdENhbGxiYWNrID0gZm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2V4aXRDYWxsYmFjayA9IChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnKSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFzeW5jIGNhbGxiYWNrIGZyb20gc3Bhd24gZXZlbnRzLCBub3QgdXNlZnVsIHRvIHRocm93LlxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHByb2Nlc3MuZXhpdCwgYW5kIF9leGl0Q2FsbGJhY2sgaWYgZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGV4aXRDb2RlIGV4aXQgY29kZSBmb3IgdXNpbmcgd2l0aCBwcm9jZXNzLmV4aXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgYW4gaWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yXG4gICAqIEByZXR1cm4gbmV2ZXJcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2V4aXQoZXhpdENvZGUsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5fZXhpdENhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9leGl0Q2FsbGJhY2sobmV3IENvbW1hbmRlckVycm9yKGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKSk7XG4gICAgICAvLyBFeHBlY3RpbmcgdGhpcyBsaW5lIGlzIG5vdCByZWFjaGVkLlxuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGNhbGxiYWNrIGBmbmAgZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtXG4gICAqICAgLmNvbW1hbmQoJ3NlcnZlJylcbiAgICogICAuZGVzY3JpcHRpb24oJ3N0YXJ0IHNlcnZpY2UnKVxuICAgKiAgIC5hY3Rpb24oZnVuY3Rpb24oKSB7XG4gICAqICAgICAgLy8gZG8gd29yayBoZXJlXG4gICAqICAgfSk7XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBhY3Rpb24oZm4pIHtcbiAgICBjb25zdCBsaXN0ZW5lciA9IChhcmdzKSA9PiB7XG4gICAgICAvLyBUaGUgLmFjdGlvbiBjYWxsYmFjayB0YWtlcyBhbiBleHRyYSBwYXJhbWV0ZXIgd2hpY2ggaXMgdGhlIGNvbW1hbmQgb3Igb3B0aW9ucy5cbiAgICAgIGNvbnN0IGV4cGVjdGVkQXJnc0NvdW50ID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGNvbnN0IGFjdGlvbkFyZ3MgPSBhcmdzLnNsaWNlKDAsIGV4cGVjdGVkQXJnc0NvdW50KTtcbiAgICAgIGlmICh0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgYWN0aW9uQXJnc1tleHBlY3RlZEFyZ3NDb3VudF0gPSB0aGlzOyAvLyBiYWNrd2FyZHMgY29tcGF0aWJsZSBcIm9wdGlvbnNcIlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aW9uQXJnc1tleHBlY3RlZEFyZ3NDb3VudF0gPSB0aGlzLm9wdHMoKTtcbiAgICAgIH1cbiAgICAgIGFjdGlvbkFyZ3MucHVzaCh0aGlzKTtcblxuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFjdGlvbkFyZ3MpO1xuICAgIH07XG4gICAgdGhpcy5fYWN0aW9uSGFuZGxlciA9IGxpc3RlbmVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3Rvcnkgcm91dGluZSB0byBjcmVhdGUgYSBuZXcgdW5hdHRhY2hlZCBvcHRpb24uXG4gICAqXG4gICAqIFNlZSAub3B0aW9uKCkgZm9yIGNyZWF0aW5nIGFuIGF0dGFjaGVkIG9wdGlvbiwgd2hpY2ggdXNlcyB0aGlzIHJvdXRpbmUgdG9cbiAgICogY3JlYXRlIHRoZSBvcHRpb24uIFlvdSBjYW4gb3ZlcnJpZGUgY3JlYXRlT3B0aW9uIHRvIHJldHVybiBhIGN1c3RvbSBvcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtPcHRpb259IG5ldyBvcHRpb25cbiAgICovXG5cbiAgY3JlYXRlT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiBuZXcgT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCBwYXJzZUFyZ3MgdG8gY2F0Y2ggJ2NvbW1hbmRlci5pbnZhbGlkQXJndW1lbnQnLlxuICAgKlxuICAgKiBAcGFyYW0geyhPcHRpb24gfCBBcmd1bWVudCl9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHsqfSBwcmV2aW91c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gaW52YWxpZEFyZ3VtZW50TWVzc2FnZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2FsbFBhcnNlQXJnKHRhcmdldCwgdmFsdWUsIHByZXZpb3VzLCBpbnZhbGlkQXJndW1lbnRNZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0YXJnZXQucGFyc2VBcmcodmFsdWUsIHByZXZpb3VzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ2NvbW1hbmRlci5pbnZhbGlkQXJndW1lbnQnKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgJHtpbnZhbGlkQXJndW1lbnRNZXNzYWdlfSAke2Vyci5tZXNzYWdlfWA7XG4gICAgICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBleGl0Q29kZTogZXJyLmV4aXRDb2RlLCBjb2RlOiBlcnIuY29kZSB9KTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIG9wdGlvbiBmbGFnIGNvbmZsaWN0cy5cbiAgICogUmVnaXN0ZXIgb3B0aW9uIGlmIG5vIGNvbmZsaWN0cyBmb3VuZCwgb3IgdGhyb3cgb24gY29uZmxpY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX3JlZ2lzdGVyT3B0aW9uKG9wdGlvbikge1xuICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID1cbiAgICAgIChvcHRpb24uc2hvcnQgJiYgdGhpcy5fZmluZE9wdGlvbihvcHRpb24uc2hvcnQpKSB8fFxuICAgICAgKG9wdGlvbi5sb25nICYmIHRoaXMuX2ZpbmRPcHRpb24ob3B0aW9uLmxvbmcpKTtcbiAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRmxhZyA9XG4gICAgICAgIG9wdGlvbi5sb25nICYmIHRoaXMuX2ZpbmRPcHRpb24ob3B0aW9uLmxvbmcpXG4gICAgICAgICAgPyBvcHRpb24ubG9uZ1xuICAgICAgICAgIDogb3B0aW9uLnNob3J0O1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYWRkIG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyR7dGhpcy5fbmFtZSAmJiBgIHRvIGNvbW1hbmQgJyR7dGhpcy5fbmFtZX0nYH0gZHVlIHRvIGNvbmZsaWN0aW5nIGZsYWcgJyR7bWF0Y2hpbmdGbGFnfSdcbi0gIGFscmVhZHkgdXNlZCBieSBvcHRpb24gJyR7bWF0Y2hpbmdPcHRpb24uZmxhZ3N9J2ApO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIGNvbW1hbmQgbmFtZSBhbmQgYWxpYXMgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgY29tbWFuZHMuXG4gICAqIFJlZ2lzdGVyIGNvbW1hbmQgaWYgbm8gY29uZmxpY3RzIGZvdW5kLCBvciB0aHJvdyBvbiBjb25mbGljdC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjb21tYW5kXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9yZWdpc3RlckNvbW1hbmQoY29tbWFuZCkge1xuICAgIGNvbnN0IGtub3duQnkgPSAoY21kKSA9PiB7XG4gICAgICByZXR1cm4gW2NtZC5uYW1lKCldLmNvbmNhdChjbWQuYWxpYXNlcygpKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYWxyZWFkeVVzZWQgPSBrbm93bkJ5KGNvbW1hbmQpLmZpbmQoKG5hbWUpID0+XG4gICAgICB0aGlzLl9maW5kQ29tbWFuZChuYW1lKSxcbiAgICApO1xuICAgIGlmIChhbHJlYWR5VXNlZCkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDbWQgPSBrbm93bkJ5KHRoaXMuX2ZpbmRDb21tYW5kKGFscmVhZHlVc2VkKSkuam9pbignfCcpO1xuICAgICAgY29uc3QgbmV3Q21kID0ga25vd25CeShjb21tYW5kKS5qb2luKCd8Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYW5ub3QgYWRkIGNvbW1hbmQgJyR7bmV3Q21kfScgYXMgYWxyZWFkeSBoYXZlIGNvbW1hbmQgJyR7ZXhpc3RpbmdDbWR9J2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY29tbWFuZHMucHVzaChjb21tYW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkT3B0aW9uKG9wdGlvbikge1xuICAgIHRoaXMuX3JlZ2lzdGVyT3B0aW9uKG9wdGlvbik7XG5cbiAgICBjb25zdCBvbmFtZSA9IG9wdGlvbi5uYW1lKCk7XG4gICAgY29uc3QgbmFtZSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG5cbiAgICAvLyBzdG9yZSBkZWZhdWx0IHZhbHVlXG4gICAgaWYgKG9wdGlvbi5uZWdhdGUpIHtcbiAgICAgIC8vIC0tbm8tZm9vIGlzIHNwZWNpYWwgYW5kIGRlZmF1bHRzIGZvbyB0byB0cnVlLCB1bmxlc3MgYSAtLWZvbyBvcHRpb24gaXMgYWxyZWFkeSBkZWZpbmVkXG4gICAgICBjb25zdCBwb3NpdGl2ZUxvbmdGbGFnID0gb3B0aW9uLmxvbmcucmVwbGFjZSgvXi0tbm8tLywgJy0tJyk7XG4gICAgICBpZiAoIXRoaXMuX2ZpbmRPcHRpb24ocG9zaXRpdmVMb25nRmxhZykpIHtcbiAgICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBvcHRpb24uZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQgPyB0cnVlIDogb3B0aW9uLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAnZGVmYXVsdCcsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb24uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKG5hbWUsIG9wdGlvbi5kZWZhdWx0VmFsdWUsICdkZWZhdWx0Jyk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlciBmb3IgY2xpIGFuZCBlbnYgc3VwcGxpZWQgdmFsdWVzXG4gICAgY29uc3QgaGFuZGxlT3B0aW9uVmFsdWUgPSAodmFsLCBpbnZhbGlkVmFsdWVNZXNzYWdlLCB2YWx1ZVNvdXJjZSkgPT4ge1xuICAgICAgLy8gdmFsIGlzIG51bGwgZm9yIG9wdGlvbmFsIG9wdGlvbiB1c2VkIHdpdGhvdXQgYW4gb3B0aW9uYWwtYXJndW1lbnQuXG4gICAgICAvLyB2YWwgaXMgdW5kZWZpbmVkIGZvciBib29sZWFuIGFuZCBuZWdhdGVkIG9wdGlvbi5cbiAgICAgIGlmICh2YWwgPT0gbnVsbCAmJiBvcHRpb24ucHJlc2V0QXJnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsID0gb3B0aW9uLnByZXNldEFyZztcbiAgICAgIH1cblxuICAgICAgLy8gY3VzdG9tIHByb2Nlc3NpbmdcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5nZXRPcHRpb25WYWx1ZShuYW1lKTtcbiAgICAgIGlmICh2YWwgIT09IG51bGwgJiYgb3B0aW9uLnBhcnNlQXJnKSB7XG4gICAgICAgIHZhbCA9IHRoaXMuX2NhbGxQYXJzZUFyZyhvcHRpb24sIHZhbCwgb2xkVmFsdWUsIGludmFsaWRWYWx1ZU1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmICh2YWwgIT09IG51bGwgJiYgb3B0aW9uLnZhcmlhZGljKSB7XG4gICAgICAgIHZhbCA9IG9wdGlvbi5fY29uY2F0VmFsdWUodmFsLCBvbGRWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbGwtaW4gYXBwcm9wcmlhdGUgbWlzc2luZyB2YWx1ZXMuIExvbmcgd2luZGVkIGJ1dCBlYXN5IHRvIGZvbGxvdy5cbiAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICBpZiAob3B0aW9uLm5lZ2F0ZSkge1xuICAgICAgICAgIHZhbCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5pc0Jvb2xlYW4oKSB8fCBvcHRpb24ub3B0aW9uYWwpIHtcbiAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9ICcnOyAvLyBub3Qgbm9ybWFsLCBwYXJzZUFyZyBtaWdodCBoYXZlIGZhaWxlZCBvciBiZSBhIG1vY2sgZnVuY3Rpb24gZm9yIHRlc3RpbmdcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UobmFtZSwgdmFsLCB2YWx1ZVNvdXJjZSk7XG4gICAgfTtcblxuICAgIHRoaXMub24oJ29wdGlvbjonICsgb25hbWUsICh2YWwpID0+IHtcbiAgICAgIGNvbnN0IGludmFsaWRWYWx1ZU1lc3NhZ2UgPSBgZXJyb3I6IG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyBhcmd1bWVudCAnJHt2YWx9JyBpcyBpbnZhbGlkLmA7XG4gICAgICBoYW5kbGVPcHRpb25WYWx1ZSh2YWwsIGludmFsaWRWYWx1ZU1lc3NhZ2UsICdjbGknKTtcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb24uZW52VmFyKSB7XG4gICAgICB0aGlzLm9uKCdvcHRpb25FbnY6JyArIG9uYW1lLCAodmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGludmFsaWRWYWx1ZU1lc3NhZ2UgPSBgZXJyb3I6IG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyB2YWx1ZSAnJHt2YWx9JyBmcm9tIGVudiAnJHtvcHRpb24uZW52VmFyfScgaXMgaW52YWxpZC5gO1xuICAgICAgICBoYW5kbGVPcHRpb25WYWx1ZSh2YWwsIGludmFsaWRWYWx1ZU1lc3NhZ2UsICdlbnYnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIHNoYXJlZCBieSAub3B0aW9uKCkgYW5kIC5yZXF1aXJlZE9wdGlvbigpXG4gICAqXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29wdGlvbkV4KGNvbmZpZywgZmxhZ3MsIGRlc2NyaXB0aW9uLCBmbiwgZGVmYXVsdFZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBmbGFncyA9PT0gJ29iamVjdCcgJiYgZmxhZ3MgaW5zdGFuY2VvZiBPcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RvIGFkZCBhbiBPcHRpb24gb2JqZWN0IHVzZSBhZGRPcHRpb24oKSBpbnN0ZWFkIG9mIG9wdGlvbigpIG9yIHJlcXVpcmVkT3B0aW9uKCknLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcbiAgICBvcHRpb24ubWFrZU9wdGlvbk1hbmRhdG9yeSghIWNvbmZpZy5tYW5kYXRvcnkpO1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdGlvbi5kZWZhdWx0KGRlZmF1bHRWYWx1ZSkuYXJnUGFyc2VyKGZuKTtcbiAgICB9IGVsc2UgaWYgKGZuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBkZXByZWNhdGVkXG4gICAgICBjb25zdCByZWdleCA9IGZuO1xuICAgICAgZm4gPSAodmFsLCBkZWYpID0+IHtcbiAgICAgICAgY29uc3QgbSA9IHJlZ2V4LmV4ZWModmFsKTtcbiAgICAgICAgcmV0dXJuIG0gPyBtWzBdIDogZGVmO1xuICAgICAgfTtcbiAgICAgIG9wdGlvbi5kZWZhdWx0KGRlZmF1bHRWYWx1ZSkuYXJnUGFyc2VyKGZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9uLmRlZmF1bHQoZm4pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkZE9wdGlvbihvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBvcHRpb24gd2l0aCBgZmxhZ3NgLCBgZGVzY3JpcHRpb25gLCBhbmQgb3B0aW9uYWwgYXJndW1lbnQgcGFyc2luZyBmdW5jdGlvbiBvciBgZGVmYXVsdFZhbHVlYCBvciBib3RoLlxuICAgKlxuICAgKiBUaGUgYGZsYWdzYCBzdHJpbmcgY29udGFpbnMgdGhlIHNob3J0IGFuZC9vciBsb25nIGZsYWdzLCBzZXBhcmF0ZWQgYnkgY29tbWEsIGEgcGlwZSBvciBzcGFjZS4gQSByZXF1aXJlZFxuICAgKiBvcHRpb24tYXJndW1lbnQgaXMgaW5kaWNhdGVkIGJ5IGA8PmAgYW5kIGFuIG9wdGlvbmFsIG9wdGlvbi1hcmd1bWVudCBieSBgW11gLlxuICAgKlxuICAgKiBTZWUgdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLCBhbmQgc2VlIGFsc28gYWRkT3B0aW9uKCkgYW5kIHJlcXVpcmVkT3B0aW9uKCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW1cbiAgICogICAgIC5vcHRpb24oJy1wLCAtLXBlcHBlcicsICdhZGQgcGVwcGVyJylcbiAgICogICAgIC5vcHRpb24oJy1wLCAtLXBpenphLXR5cGUgPFRZUEU+JywgJ3R5cGUgb2YgcGl6emEnKSAvLyByZXF1aXJlZCBvcHRpb24tYXJndW1lbnRcbiAgICogICAgIC5vcHRpb24oJy1jLCAtLWNoZWVzZSBbQ0hFRVNFXScsICdhZGQgZXh0cmEgY2hlZXNlJywgJ21venphcmVsbGEnKSAvLyBvcHRpb25hbCBvcHRpb24tYXJndW1lbnQgd2l0aCBkZWZhdWx0XG4gICAqICAgICAub3B0aW9uKCctdCwgLS10aXAgPFZBTFVFPicsICdhZGQgdGlwIHRvIHB1cmNoYXNlIGNvc3QnLCBwYXJzZUZsb2F0KSAvLyBjdXN0b20gcGFyc2UgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufCopfSBbcGFyc2VBcmddIC0gY3VzdG9tIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIG9yIGRlZmF1bHQgdmFsdWVcbiAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgb3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbiwgcGFyc2VBcmcsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25FeCh7fSwgZmxhZ3MsIGRlc2NyaXB0aW9uLCBwYXJzZUFyZywgZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSByZXF1aXJlZCBvcHRpb24gd2hpY2ggbXVzdCBoYXZlIGEgdmFsdWUgYWZ0ZXIgcGFyc2luZy4gVGhpcyB1c3VhbGx5IG1lYW5zXG4gICAqIHRoZSBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gKE90aGVyd2lzZSB0aGUgc2FtZSBhcyAub3B0aW9uKCkuKVxuICAgKlxuICAgKiBUaGUgYGZsYWdzYCBzdHJpbmcgY29udGFpbnMgdGhlIHNob3J0IGFuZC9vciBsb25nIGZsYWdzLCBzZXBhcmF0ZWQgYnkgY29tbWEsIGEgcGlwZSBvciBzcGFjZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufCopfSBbcGFyc2VBcmddIC0gY3VzdG9tIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIG9yIGRlZmF1bHQgdmFsdWVcbiAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgcmVxdWlyZWRPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uLCBwYXJzZUFyZywgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbkV4KFxuICAgICAgeyBtYW5kYXRvcnk6IHRydWUgfSxcbiAgICAgIGZsYWdzLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBwYXJzZUFyZyxcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsdGVyIHBhcnNpbmcgb2Ygc2hvcnQgZmxhZ3Mgd2l0aCBvcHRpb25hbCB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIGZvciBgLm9wdGlvbignLWYsLS1mbGFnIFt2YWx1ZV0nKTpcbiAgICogcHJvZ3JhbS5jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUodHJ1ZSk7ICAvLyBgLWY4MGAgaXMgdHJlYXRlZCBsaWtlIGAtLWZsYWc9ODBgLCB0aGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW91clxuICAgKiBwcm9ncmFtLmNvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZShmYWxzZSkgLy8gYC1mYmAgaXMgdHJlYXRlZCBsaWtlIGAtZiAtYmBcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbY29tYmluZV0gLSBpZiBgdHJ1ZWAgb3Igb21pdHRlZCwgYW4gb3B0aW9uYWwgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBkaXJlY3RseSBhZnRlciB0aGUgZmxhZy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBjb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUoY29tYmluZSA9IHRydWUpIHtcbiAgICB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUgPSAhIWNvbWJpbmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdW5rbm93biBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93VW5rbm93bl0gLSBpZiBgdHJ1ZWAgb3Igb21pdHRlZCwgbm8gZXJyb3Igd2lsbCBiZSB0aHJvd24gZm9yIHVua25vd24gb3B0aW9ucy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhbGxvd1Vua25vd25PcHRpb24oYWxsb3dVbmtub3duID0gdHJ1ZSkge1xuICAgIHRoaXMuX2FsbG93VW5rbm93bk9wdGlvbiA9ICEhYWxsb3dVbmtub3duO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IGV4Y2VzcyBjb21tYW5kLWFyZ3VtZW50cyBvbiB0aGUgY29tbWFuZCBsaW5lLiBQYXNzIGZhbHNlIHRvIG1ha2UgZXhjZXNzIGFyZ3VtZW50cyBhbiBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dFeGNlc3NdIC0gaWYgYHRydWVgIG9yIG9taXR0ZWQsIG5vIGVycm9yIHdpbGwgYmUgdGhyb3duIGZvciBleGNlc3MgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFsbG93RXhjZXNzQXJndW1lbnRzKGFsbG93RXhjZXNzID0gdHJ1ZSkge1xuICAgIHRoaXMuX2FsbG93RXhjZXNzQXJndW1lbnRzID0gISFhbGxvd0V4Y2VzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgcG9zaXRpb25hbCBvcHRpb25zLiBQb3NpdGlvbmFsIG1lYW5zIGdsb2JhbCBvcHRpb25zIGFyZSBzcGVjaWZpZWQgYmVmb3JlIHN1YmNvbW1hbmRzIHdoaWNoIGxldHNcbiAgICogc3ViY29tbWFuZHMgcmV1c2UgdGhlIHNhbWUgb3B0aW9uIG5hbWVzLCBhbmQgYWxzbyBlbmFibGVzIHN1YmNvbW1hbmRzIHRvIHR1cm4gb24gcGFzc1Rocm91Z2hPcHRpb25zLlxuICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbm9uLXBvc2l0aW9uYWwgYW5kIGdsb2JhbCBvcHRpb25zIG1heSBhcHBlYXIgYW55d2hlcmUgb24gdGhlIGNvbW1hbmQgbGluZS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbcG9zaXRpb25hbF1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVQb3NpdGlvbmFsT3B0aW9ucyhwb3NpdGlvbmFsID0gdHJ1ZSkge1xuICAgIHRoaXMuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zID0gISFwb3NpdGlvbmFsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhc3MgdGhyb3VnaCBvcHRpb25zIHRoYXQgY29tZSBhZnRlciBjb21tYW5kLWFyZ3VtZW50cyByYXRoZXIgdGhhbiB0cmVhdCB0aGVtIGFzIGNvbW1hbmQtb3B0aW9ucyxcbiAgICogc28gYWN0dWFsIGNvbW1hbmQtb3B0aW9ucyBjb21lIGJlZm9yZSBjb21tYW5kLWFyZ3VtZW50cy4gVHVybmluZyB0aGlzIG9uIGZvciBhIHN1YmNvbW1hbmQgcmVxdWlyZXNcbiAgICogcG9zaXRpb25hbCBvcHRpb25zIHRvIGhhdmUgYmVlbiBlbmFibGVkIG9uIHRoZSBwcm9ncmFtIChwYXJlbnQgY29tbWFuZHMpLlxuICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbm9uLXBvc2l0aW9uYWwgYW5kIG9wdGlvbnMgbWF5IGFwcGVhciBiZWZvcmUgb3IgYWZ0ZXIgY29tbWFuZC1hcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Bhc3NUaHJvdWdoXSBmb3IgdW5rbm93biBvcHRpb25zLlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHBhc3NUaHJvdWdoT3B0aW9ucyhwYXNzVGhyb3VnaCA9IHRydWUpIHtcbiAgICB0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMgPSAhIXBhc3NUaHJvdWdoO1xuICAgIHRoaXMuX2NoZWNrRm9yQnJva2VuUGFzc1Rocm91Z2goKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hlY2tGb3JCcm9rZW5QYXNzVGhyb3VnaCgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnBhcmVudCAmJlxuICAgICAgdGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zICYmXG4gICAgICAhdGhpcy5wYXJlbnQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwYXNzVGhyb3VnaE9wdGlvbnMgY2Fubm90IGJlIHVzZWQgZm9yICcke3RoaXMuX25hbWV9JyB3aXRob3V0IHR1cm5pbmcgb24gZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgZm9yIHBhcmVudCBjb21tYW5kKHMpYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RvcmUgb3B0aW9uIHZhbHVlcyBhcyBwcm9wZXJ0aWVzIG9uIGNvbW1hbmQgb2JqZWN0LFxuICAgKiBvciBzdG9yZSBzZXBhcmF0ZWx5IChzcGVjaWZ5IGZhbHNlKS4gSW4gYm90aCBjYXNlcyB0aGUgb3B0aW9uIHZhbHVlcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgLm9wdHMoKS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbc3RvcmVBc1Byb3BlcnRpZXM9dHJ1ZV1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHN0b3JlT3B0aW9uc0FzUHJvcGVydGllcyhzdG9yZUFzUHJvcGVydGllcyA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsIC5zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMoKSBiZWZvcmUgYWRkaW5nIG9wdGlvbnMnKTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX29wdGlvblZhbHVlcykubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdjYWxsIC5zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMoKSBiZWZvcmUgc2V0dGluZyBvcHRpb24gdmFsdWVzJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcyA9ICEhc3RvcmVBc1Byb3BlcnRpZXM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgb3B0aW9uIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge29iamVjdH0gdmFsdWVcbiAgICovXG5cbiAgZ2V0T3B0aW9uVmFsdWUoa2V5KSB7XG4gICAgaWYgKHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcykge1xuICAgICAgcmV0dXJuIHRoaXNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvblZhbHVlc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIG9wdGlvbiB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHNldE9wdGlvblZhbHVlKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2Uoa2V5LCB2YWx1ZSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBvcHRpb24gdmFsdWUgYW5kIHdoZXJlIHRoZSB2YWx1ZSBjYW1lIGZyb20uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtvYmplY3R9IHZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBleHBlY3RlZCB2YWx1ZXMgYXJlIGRlZmF1bHQvY29uZmlnL2Vudi9jbGkvaW1wbGllZFxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKGtleSwgdmFsdWUsIHNvdXJjZSkge1xuICAgIGlmICh0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMpIHtcbiAgICAgIHRoaXNba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vcHRpb25WYWx1ZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl9vcHRpb25WYWx1ZVNvdXJjZXNba2V5XSA9IHNvdXJjZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc291cmNlIG9mIG9wdGlvbiB2YWx1ZS5cbiAgICogRXhwZWN0ZWQgdmFsdWVzIGFyZSBkZWZhdWx0IHwgY29uZmlnIHwgZW52IHwgY2xpIHwgaW1wbGllZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgZ2V0T3B0aW9uVmFsdWVTb3VyY2Uoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvblZhbHVlU291cmNlc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2Ugb2Ygb3B0aW9uIHZhbHVlLiBTZWUgYWxzbyAub3B0c1dpdGhHbG9iYWxzKCkuXG4gICAqIEV4cGVjdGVkIHZhbHVlcyBhcmUgZGVmYXVsdCB8IGNvbmZpZyB8IGVudiB8IGNsaSB8IGltcGxpZWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIGdldE9wdGlvblZhbHVlU291cmNlV2l0aEdsb2JhbHMoa2V5KSB7XG4gICAgLy8gZ2xvYmFsIG92ZXJ3cml0ZXMgbG9jYWwsIGxpa2Ugb3B0c1dpdGhHbG9iYWxzXG4gICAgbGV0IHNvdXJjZTtcbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBpZiAoY21kLmdldE9wdGlvblZhbHVlU291cmNlKGtleSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzb3VyY2UgPSBjbWQuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uoa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyIGFyZ3VtZW50cyBmcm9tIGltcGxpZWQgb3IgZXhwbGljaXQgYXJndW1lbnRzLlxuICAgKiBTaWRlLWVmZmVjdHM6IHNldCBfc2NyaXB0UGF0aCBpZiBhcmdzIGluY2x1ZGVkIHNjcmlwdC4gVXNlZCBmb3IgZGVmYXVsdCBwcm9ncmFtIG5hbWUsIGFuZCBzdWJjb21tYW5kIHNlYXJjaGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcHJlcGFyZVVzZXJBcmdzKGFyZ3YsIHBhcnNlT3B0aW9ucykge1xuICAgIGlmIChhcmd2ICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkoYXJndikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmlyc3QgcGFyYW1ldGVyIHRvIHBhcnNlIG11c3QgYmUgYXJyYXkgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHBhcnNlT3B0aW9ucyA9IHBhcnNlT3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIGF1dG8tZGV0ZWN0IGFyZ3VtZW50IGNvbnZlbnRpb25zIGlmIG5vdGhpbmcgc3VwcGxpZWRcbiAgICBpZiAoYXJndiA9PT0gdW5kZWZpbmVkICYmIHBhcnNlT3B0aW9ucy5mcm9tID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnZlcnNpb25zPy5lbGVjdHJvbikge1xuICAgICAgICBwYXJzZU9wdGlvbnMuZnJvbSA9ICdlbGVjdHJvbic7XG4gICAgICB9XG4gICAgICAvLyBjaGVjayBub2RlIHNwZWNpZmljIG9wdGlvbnMgZm9yIHNjZW5hcmlvcyB3aGVyZSB1c2VyIENMSSBhcmdzIGZvbGxvdyBleGVjdXRhYmxlIHdpdGhvdXQgc2NyaXB0bmFtZVxuICAgICAgY29uc3QgZXhlY0FyZ3YgPSBwcm9jZXNzLmV4ZWNBcmd2ID8/IFtdO1xuICAgICAgaWYgKFxuICAgICAgICBleGVjQXJndi5pbmNsdWRlcygnLWUnKSB8fFxuICAgICAgICBleGVjQXJndi5pbmNsdWRlcygnLS1ldmFsJykgfHxcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy1wJykgfHxcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy0tcHJpbnQnKVxuICAgICAgKSB7XG4gICAgICAgIHBhcnNlT3B0aW9ucy5mcm9tID0gJ2V2YWwnOyAvLyBpbnRlcm5hbCB1c2FnZSwgbm90IGRvY3VtZW50ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkZWZhdWx0IHRvIHVzaW5nIHByb2Nlc3MuYXJndlxuICAgIGlmIChhcmd2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyZ3YgPSBwcm9jZXNzLmFyZ3Y7XG4gICAgfVxuICAgIHRoaXMucmF3QXJncyA9IGFyZ3Yuc2xpY2UoKTtcblxuICAgIC8vIGV4dHJhY3QgdGhlIHVzZXIgYXJncyBhbmQgc2NyaXB0UGF0aFxuICAgIGxldCB1c2VyQXJncztcbiAgICBzd2l0Y2ggKHBhcnNlT3B0aW9ucy5mcm9tKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICB0aGlzLl9zY3JpcHRQYXRoID0gYXJndlsxXTtcbiAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VsZWN0cm9uJzpcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBkZWZhdWx0QXBwIGlzIGFuIHVua25vd24gcHJvcGVydHlcbiAgICAgICAgaWYgKHByb2Nlc3MuZGVmYXVsdEFwcCkge1xuICAgICAgICAgIHRoaXMuX3NjcmlwdFBhdGggPSBhcmd2WzFdO1xuICAgICAgICAgIHVzZXJBcmdzID0gYXJndi5zbGljZSgyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1c2VyJzpcbiAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2V2YWwnOlxuICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB1bmV4cGVjdGVkIHBhcnNlIG9wdGlvbiB7IGZyb206ICcke3BhcnNlT3B0aW9ucy5mcm9tfScgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmluZCBkZWZhdWx0IG5hbWUgZm9yIHByb2dyYW0gZnJvbSBhcmd1bWVudHMuXG4gICAgaWYgKCF0aGlzLl9uYW1lICYmIHRoaXMuX3NjcmlwdFBhdGgpXG4gICAgICB0aGlzLm5hbWVGcm9tRmlsZW5hbWUodGhpcy5fc2NyaXB0UGF0aCk7XG4gICAgdGhpcy5fbmFtZSA9IHRoaXMuX25hbWUgfHwgJ3Byb2dyYW0nO1xuXG4gICAgcmV0dXJuIHVzZXJBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGBhcmd2YCwgc2V0dGluZyBvcHRpb25zIGFuZCBpbnZva2luZyBjb21tYW5kcyB3aGVuIGRlZmluZWQuXG4gICAqXG4gICAqIFVzZSBwYXJzZUFzeW5jIGluc3RlYWQgb2YgcGFyc2UgaWYgYW55IG9mIHlvdXIgYWN0aW9uIGhhbmRsZXJzIGFyZSBhc3luYy5cbiAgICpcbiAgICogQ2FsbCB3aXRoIG5vIHBhcmFtZXRlcnMgdG8gcGFyc2UgYHByb2Nlc3MuYXJndmAuIERldGVjdHMgRWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBvcHRpb25zIGxpa2UgYG5vZGUgLS1ldmFsYC4gRWFzeSBtb2RlIVxuICAgKlxuICAgKiBPciBjYWxsIHdpdGggYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBwYXJzZSwgYW5kIG9wdGlvbmFsbHkgd2hlcmUgdGhlIHVzZXIgYXJndW1lbnRzIHN0YXJ0IGJ5IHNwZWNpZnlpbmcgd2hlcmUgdGhlIGFyZ3VtZW50cyBhcmUgYGZyb21gOlxuICAgKiAtIGAnbm9kZSdgOiBkZWZhdWx0LCBgYXJndlswXWAgaXMgdGhlIGFwcGxpY2F0aW9uIGFuZCBgYXJndlsxXWAgaXMgdGhlIHNjcmlwdCBiZWluZyBydW4sIHdpdGggdXNlciBhcmd1bWVudHMgYWZ0ZXIgdGhhdFxuICAgKiAtIGAnZWxlY3Ryb24nYDogYGFyZ3ZbMF1gIGlzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYGFyZ3ZbMV1gIHZhcmllcyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZWxlY3Ryb24gYXBwbGljYXRpb24gaXMgcGFja2FnZWRcbiAgICogLSBgJ3VzZXInYDoganVzdCB1c2VyIGFyZ3VtZW50c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLnBhcnNlKCk7IC8vIHBhcnNlIHByb2Nlc3MuYXJndiBhbmQgYXV0by1kZXRlY3QgZWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBmbGFnc1xuICAgKiBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7IC8vIGFzc3VtZSBhcmd2WzBdIGlzIGFwcCBhbmQgYXJndlsxXSBpcyBzY3JpcHRcbiAgICogcHJvZ3JhbS5wYXJzZShteS1hcmdzLCB7IGZyb206ICd1c2VyJyB9KTsgLy8ganVzdCB1c2VyIHN1cHBsaWVkIGFyZ3VtZW50cywgbm90aGluZyBzcGVjaWFsIGFib3V0IGFyZ3ZbMF1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3ZdIC0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHByb2Nlc3MuYXJndlxuICAgKiBAcGFyYW0ge29iamVjdH0gW3BhcnNlT3B0aW9uc10gLSBvcHRpb25hbGx5IHNwZWNpZnkgc3R5bGUgb2Ygb3B0aW9ucyB3aXRoIGZyb206IG5vZGUvdXNlci9lbGVjdHJvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcnNlT3B0aW9ucy5mcm9tXSAtIHdoZXJlIHRoZSBhcmdzIGFyZSBmcm9tOiAnbm9kZScsICd1c2VyJywgJ2VsZWN0cm9uJ1xuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgcGFyc2UoYXJndiwgcGFyc2VPcHRpb25zKSB7XG4gICAgY29uc3QgdXNlckFyZ3MgPSB0aGlzLl9wcmVwYXJlVXNlckFyZ3MoYXJndiwgcGFyc2VPcHRpb25zKTtcbiAgICB0aGlzLl9wYXJzZUNvbW1hbmQoW10sIHVzZXJBcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGBhcmd2YCwgc2V0dGluZyBvcHRpb25zIGFuZCBpbnZva2luZyBjb21tYW5kcyB3aGVuIGRlZmluZWQuXG4gICAqXG4gICAqIENhbGwgd2l0aCBubyBwYXJhbWV0ZXJzIHRvIHBhcnNlIGBwcm9jZXNzLmFyZ3ZgLiBEZXRlY3RzIEVsZWN0cm9uIGFuZCBzcGVjaWFsIG5vZGUgb3B0aW9ucyBsaWtlIGBub2RlIC0tZXZhbGAuIEVhc3kgbW9kZSFcbiAgICpcbiAgICogT3IgY2FsbCB3aXRoIGFuIGFycmF5IG9mIHN0cmluZ3MgdG8gcGFyc2UsIGFuZCBvcHRpb25hbGx5IHdoZXJlIHRoZSB1c2VyIGFyZ3VtZW50cyBzdGFydCBieSBzcGVjaWZ5aW5nIHdoZXJlIHRoZSBhcmd1bWVudHMgYXJlIGBmcm9tYDpcbiAgICogLSBgJ25vZGUnYDogZGVmYXVsdCwgYGFyZ3ZbMF1gIGlzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYGFyZ3ZbMV1gIGlzIHRoZSBzY3JpcHQgYmVpbmcgcnVuLCB3aXRoIHVzZXIgYXJndW1lbnRzIGFmdGVyIHRoYXRcbiAgICogLSBgJ2VsZWN0cm9uJ2A6IGBhcmd2WzBdYCBpcyB0aGUgYXBwbGljYXRpb24gYW5kIGBhcmd2WzFdYCB2YXJpZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGVsZWN0cm9uIGFwcGxpY2F0aW9uIGlzIHBhY2thZ2VkXG4gICAqIC0gYCd1c2VyJ2A6IGp1c3QgdXNlciBhcmd1bWVudHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgcHJvZ3JhbS5wYXJzZUFzeW5jKCk7IC8vIHBhcnNlIHByb2Nlc3MuYXJndiBhbmQgYXV0by1kZXRlY3QgZWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBmbGFnc1xuICAgKiBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMocHJvY2Vzcy5hcmd2KTsgLy8gYXNzdW1lIGFyZ3ZbMF0gaXMgYXBwIGFuZCBhcmd2WzFdIGlzIHNjcmlwdFxuICAgKiBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMobXktYXJncywgeyBmcm9tOiAndXNlcicgfSk7IC8vIGp1c3QgdXNlciBzdXBwbGllZCBhcmd1bWVudHMsIG5vdGhpbmcgc3BlY2lhbCBhYm91dCBhcmd2WzBdXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmd2XVxuICAgKiBAcGFyYW0ge29iamVjdH0gW3BhcnNlT3B0aW9uc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcnNlT3B0aW9ucy5mcm9tIC0gd2hlcmUgdGhlIGFyZ3MgYXJlIGZyb206ICdub2RlJywgJ3VzZXInLCAnZWxlY3Ryb24nXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuXG4gIGFzeW5jIHBhcnNlQXN5bmMoYXJndiwgcGFyc2VPcHRpb25zKSB7XG4gICAgY29uc3QgdXNlckFyZ3MgPSB0aGlzLl9wcmVwYXJlVXNlckFyZ3MoYXJndiwgcGFyc2VPcHRpb25zKTtcbiAgICBhd2FpdCB0aGlzLl9wYXJzZUNvbW1hbmQoW10sIHVzZXJBcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWItY29tbWFuZCBleGVjdXRhYmxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZXhlY3V0ZVN1YkNvbW1hbmQoc3ViY29tbWFuZCwgYXJncykge1xuICAgIGFyZ3MgPSBhcmdzLnNsaWNlKCk7XG4gICAgbGV0IGxhdW5jaFdpdGhOb2RlID0gZmFsc2U7IC8vIFVzZSBub2RlIGZvciBzb3VyY2UgdGFyZ2V0cyBzbyBkbyBub3QgbmVlZCB0byBnZXQgcGVybWlzc2lvbnMgY29ycmVjdCwgYW5kIG9uIFdpbmRvd3MuXG4gICAgY29uc3Qgc291cmNlRXh0ID0gWycuanMnLCAnLnRzJywgJy50c3gnLCAnLm1qcycsICcuY2pzJ107XG5cbiAgICBmdW5jdGlvbiBmaW5kRmlsZShiYXNlRGlyLCBiYXNlTmFtZSkge1xuICAgICAgLy8gTG9vayBmb3Igc3BlY2lmaWVkIGZpbGVcbiAgICAgIGNvbnN0IGxvY2FsQmluID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIGJhc2VOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsQmluKSkgcmV0dXJuIGxvY2FsQmluO1xuXG4gICAgICAvLyBTdG9wIGxvb2tpbmcgaWYgY2FuZGlkYXRlIGFscmVhZHkgaGFzIGFuIGV4cGVjdGVkIGV4dGVuc2lvbi5cbiAgICAgIGlmIChzb3VyY2VFeHQuaW5jbHVkZXMocGF0aC5leHRuYW1lKGJhc2VOYW1lKSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIFRyeSBhbGwgdGhlIGV4dGVuc2lvbnMuXG4gICAgICBjb25zdCBmb3VuZEV4dCA9IHNvdXJjZUV4dC5maW5kKChleHQpID0+XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoYCR7bG9jYWxCaW59JHtleHR9YCksXG4gICAgICApO1xuICAgICAgaWYgKGZvdW5kRXh0KSByZXR1cm4gYCR7bG9jYWxCaW59JHtmb3VuZEV4dH1gO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIE5vdCBjaGVja2luZyBmb3IgaGVscCBmaXJzdC4gVW5saWtlbHkgdG8gaGF2ZSBtYW5kYXRvcnkgYW5kIGV4ZWN1dGFibGUsIGFuZCBjYW4ndCByb2J1c3RseSB0ZXN0IGZvciBoZWxwIGZsYWdzIGluIGV4dGVybmFsIGNvbW1hbmQuXG4gICAgdGhpcy5fY2hlY2tGb3JNaXNzaW5nTWFuZGF0b3J5T3B0aW9ucygpO1xuICAgIHRoaXMuX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCk7XG5cbiAgICAvLyBleGVjdXRhYmxlRmlsZSBhbmQgZXhlY3V0YWJsZURpciBtaWdodCBiZSBmdWxsIHBhdGgsIG9yIGp1c3QgYSBuYW1lXG4gICAgbGV0IGV4ZWN1dGFibGVGaWxlID1cbiAgICAgIHN1YmNvbW1hbmQuX2V4ZWN1dGFibGVGaWxlIHx8IGAke3RoaXMuX25hbWV9LSR7c3ViY29tbWFuZC5fbmFtZX1gO1xuICAgIGxldCBleGVjdXRhYmxlRGlyID0gdGhpcy5fZXhlY3V0YWJsZURpciB8fCAnJztcbiAgICBpZiAodGhpcy5fc2NyaXB0UGF0aCkge1xuICAgICAgbGV0IHJlc29sdmVkU2NyaXB0UGF0aDsgLy8gcmVzb2x2ZSBwb3NzaWJsZSBzeW1saW5rIGZvciBpbnN0YWxsZWQgbnBtIGJpbmFyeVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZWRTY3JpcHRQYXRoID0gZnMucmVhbHBhdGhTeW5jKHRoaXMuX3NjcmlwdFBhdGgpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlc29sdmVkU2NyaXB0UGF0aCA9IHRoaXMuX3NjcmlwdFBhdGg7XG4gICAgICB9XG4gICAgICBleGVjdXRhYmxlRGlyID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICBwYXRoLmRpcm5hbWUocmVzb2x2ZWRTY3JpcHRQYXRoKSxcbiAgICAgICAgZXhlY3V0YWJsZURpcixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTG9vayBmb3IgYSBsb2NhbCBmaWxlIGluIHByZWZlcmVuY2UgdG8gYSBjb21tYW5kIGluIFBBVEguXG4gICAgaWYgKGV4ZWN1dGFibGVEaXIpIHtcbiAgICAgIGxldCBsb2NhbEZpbGUgPSBmaW5kRmlsZShleGVjdXRhYmxlRGlyLCBleGVjdXRhYmxlRmlsZSk7XG5cbiAgICAgIC8vIExlZ2FjeSBzZWFyY2ggdXNpbmcgcHJlZml4IG9mIHNjcmlwdCBuYW1lIGluc3RlYWQgb2YgY29tbWFuZCBuYW1lXG4gICAgICBpZiAoIWxvY2FsRmlsZSAmJiAhc3ViY29tbWFuZC5fZXhlY3V0YWJsZUZpbGUgJiYgdGhpcy5fc2NyaXB0UGF0aCkge1xuICAgICAgICBjb25zdCBsZWdhY3lOYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgICB0aGlzLl9zY3JpcHRQYXRoLFxuICAgICAgICAgIHBhdGguZXh0bmFtZSh0aGlzLl9zY3JpcHRQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxlZ2FjeU5hbWUgIT09IHRoaXMuX25hbWUpIHtcbiAgICAgICAgICBsb2NhbEZpbGUgPSBmaW5kRmlsZShcbiAgICAgICAgICAgIGV4ZWN1dGFibGVEaXIsXG4gICAgICAgICAgICBgJHtsZWdhY3lOYW1lfS0ke3N1YmNvbW1hbmQuX25hbWV9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBleGVjdXRhYmxlRmlsZSA9IGxvY2FsRmlsZSB8fCBleGVjdXRhYmxlRmlsZTtcbiAgICB9XG5cbiAgICBsYXVuY2hXaXRoTm9kZSA9IHNvdXJjZUV4dC5pbmNsdWRlcyhwYXRoLmV4dG5hbWUoZXhlY3V0YWJsZUZpbGUpKTtcblxuICAgIGxldCBwcm9jO1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSAnd2luMzInKSB7XG4gICAgICBpZiAobGF1bmNoV2l0aE5vZGUpIHtcbiAgICAgICAgYXJncy51bnNoaWZ0KGV4ZWN1dGFibGVGaWxlKTtcbiAgICAgICAgLy8gYWRkIGV4ZWN1dGFibGUgYXJndW1lbnRzIHRvIHNwYXduXG4gICAgICAgIGFyZ3MgPSBpbmNyZW1lbnROb2RlSW5zcGVjdG9yUG9ydChwcm9jZXNzLmV4ZWNBcmd2KS5jb25jYXQoYXJncyk7XG5cbiAgICAgICAgcHJvYyA9IGNoaWxkUHJvY2Vzcy5zcGF3bihwcm9jZXNzLmFyZ3ZbMF0sIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2MgPSBjaGlsZFByb2Nlc3Muc3Bhd24oZXhlY3V0YWJsZUZpbGUsIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXJncy51bnNoaWZ0KGV4ZWN1dGFibGVGaWxlKTtcbiAgICAgIC8vIGFkZCBleGVjdXRhYmxlIGFyZ3VtZW50cyB0byBzcGF3blxuICAgICAgYXJncyA9IGluY3JlbWVudE5vZGVJbnNwZWN0b3JQb3J0KHByb2Nlc3MuZXhlY0FyZ3YpLmNvbmNhdChhcmdzKTtcbiAgICAgIHByb2MgPSBjaGlsZFByb2Nlc3Muc3Bhd24ocHJvY2Vzcy5leGVjUGF0aCwgYXJncywgeyBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIH1cblxuICAgIGlmICghcHJvYy5raWxsZWQpIHtcbiAgICAgIC8vIHRlc3RpbmcgbWFpbmx5IHRvIGF2b2lkIGxlYWsgd2FybmluZ3MgZHVyaW5nIHVuaXQgdGVzdHMgd2l0aCBtb2NrZWQgc3Bhd25cbiAgICAgIGNvbnN0IHNpZ25hbHMgPSBbJ1NJR1VTUjEnLCAnU0lHVVNSMicsICdTSUdURVJNJywgJ1NJR0lOVCcsICdTSUdIVVAnXTtcbiAgICAgIHNpZ25hbHMuZm9yRWFjaCgoc2lnbmFsKSA9PiB7XG4gICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHByb2Mua2lsbGVkID09PSBmYWxzZSAmJiBwcm9jLmV4aXRDb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIGJlY2F1c2Ugc2lnbmFscyBub3QgdHlwZWQgdG8ga25vd24gc3RyaW5nc1xuICAgICAgICAgICAgcHJvYy5raWxsKHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQgdGVybWluYXRlIHByb2Nlc3Mgd2hlbiBzcGF3bmVkIHByb2Nlc3MgdGVybWluYXRlcy5cbiAgICBjb25zdCBleGl0Q2FsbGJhY2sgPSB0aGlzLl9leGl0Q2FsbGJhY2s7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoY29kZSkgPT4ge1xuICAgICAgY29kZSA9IGNvZGUgPz8gMTsgLy8gY29kZSBpcyBudWxsIGlmIHNwYXduZWQgcHJvY2VzcyB0ZXJtaW5hdGVkIGR1ZSB0byBhIHNpZ25hbFxuICAgICAgaWYgKCFleGl0Q2FsbGJhY2spIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpdENhbGxiYWNrKFxuICAgICAgICAgIG5ldyBDb21tYW5kZXJFcnJvcihcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnLFxuICAgICAgICAgICAgJyhjbG9zZSknLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlOiBiZWNhdXNlIGVyci5jb2RlIGlzIGFuIHVua25vd24gcHJvcGVydHlcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgY29uc3QgZXhlY3V0YWJsZURpck1lc3NhZ2UgPSBleGVjdXRhYmxlRGlyXG4gICAgICAgICAgPyBgc2VhcmNoZWQgZm9yIGxvY2FsIHN1YmNvbW1hbmQgcmVsYXRpdmUgdG8gZGlyZWN0b3J5ICcke2V4ZWN1dGFibGVEaXJ9J2BcbiAgICAgICAgICA6ICdubyBkaXJlY3RvcnkgZm9yIHNlYXJjaCBmb3IgbG9jYWwgc3ViY29tbWFuZCwgdXNlIC5leGVjdXRhYmxlRGlyKCkgdG8gc3VwcGx5IGEgY3VzdG9tIGRpcmVjdG9yeSc7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGFibGVNaXNzaW5nID0gYCcke2V4ZWN1dGFibGVGaWxlfScgZG9lcyBub3QgZXhpc3RcbiAtIGlmICcke3N1YmNvbW1hbmQuX25hbWV9JyBpcyBub3QgbWVhbnQgdG8gYmUgYW4gZXhlY3V0YWJsZSBjb21tYW5kLCByZW1vdmUgZGVzY3JpcHRpb24gcGFyYW1ldGVyIGZyb20gJy5jb21tYW5kKCknIGFuZCB1c2UgJy5kZXNjcmlwdGlvbigpJyBpbnN0ZWFkXG4gLSBpZiB0aGUgZGVmYXVsdCBleGVjdXRhYmxlIG5hbWUgaXMgbm90IHN1aXRhYmxlLCB1c2UgdGhlIGV4ZWN1dGFibGVGaWxlIG9wdGlvbiB0byBzdXBwbHkgYSBjdXN0b20gbmFtZSBvciBwYXRoXG4gLSAke2V4ZWN1dGFibGVEaXJNZXNzYWdlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihleGVjdXRhYmxlTWlzc2luZyk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2UgZXJyLmNvZGUgaXMgYW4gdW5rbm93biBwcm9wZXJ0eVxuICAgICAgfSBlbHNlIGlmIChlcnIuY29kZSA9PT0gJ0VBQ0NFUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtleGVjdXRhYmxlRmlsZX0nIG5vdCBleGVjdXRhYmxlYCk7XG4gICAgICB9XG4gICAgICBpZiAoIWV4aXRDYWxsYmFjaykge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgQ29tbWFuZGVyRXJyb3IoXG4gICAgICAgICAgMSxcbiAgICAgICAgICAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnLFxuICAgICAgICAgICcoZXJyb3IpJyxcbiAgICAgICAgKTtcbiAgICAgICAgd3JhcHBlZEVycm9yLm5lc3RlZEVycm9yID0gZXJyO1xuICAgICAgICBleGl0Q2FsbGJhY2sod3JhcHBlZEVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNoaWxkIHByb2Nlc3NcbiAgICB0aGlzLnJ1bm5pbmdDb21tYW5kID0gcHJvYztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZGlzcGF0Y2hTdWJjb21tYW5kKGNvbW1hbmROYW1lLCBvcGVyYW5kcywgdW5rbm93bikge1xuICAgIGNvbnN0IHN1YkNvbW1hbmQgPSB0aGlzLl9maW5kQ29tbWFuZChjb21tYW5kTmFtZSk7XG4gICAgaWYgKCFzdWJDb21tYW5kKSB0aGlzLmhlbHAoeyBlcnJvcjogdHJ1ZSB9KTtcblxuICAgIGxldCBwcm9taXNlQ2hhaW47XG4gICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGxTdWJDb21tYW5kSG9vayhcbiAgICAgIHByb21pc2VDaGFpbixcbiAgICAgIHN1YkNvbW1hbmQsXG4gICAgICAncHJlU3ViY29tbWFuZCcsXG4gICAgKTtcbiAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbChwcm9taXNlQ2hhaW4sICgpID0+IHtcbiAgICAgIGlmIChzdWJDb21tYW5kLl9leGVjdXRhYmxlSGFuZGxlcikge1xuICAgICAgICB0aGlzLl9leGVjdXRlU3ViQ29tbWFuZChzdWJDb21tYW5kLCBvcGVyYW5kcy5jb25jYXQodW5rbm93bikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN1YkNvbW1hbmQuX3BhcnNlQ29tbWFuZChvcGVyYW5kcywgdW5rbm93bik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb21pc2VDaGFpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgaGVscCBkaXJlY3RseSBpZiBwb3NzaWJsZSwgb3IgZGlzcGF0Y2ggaWYgbmVjZXNzYXJ5LlxuICAgKiBlLmcuIGhlbHAgZm9vXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9kaXNwYXRjaEhlbHBDb21tYW5kKHN1YmNvbW1hbmROYW1lKSB7XG4gICAgaWYgKCFzdWJjb21tYW5kTmFtZSkge1xuICAgICAgdGhpcy5oZWxwKCk7XG4gICAgfVxuICAgIGNvbnN0IHN1YkNvbW1hbmQgPSB0aGlzLl9maW5kQ29tbWFuZChzdWJjb21tYW5kTmFtZSk7XG4gICAgaWYgKHN1YkNvbW1hbmQgJiYgIXN1YkNvbW1hbmQuX2V4ZWN1dGFibGVIYW5kbGVyKSB7XG4gICAgICBzdWJDb21tYW5kLmhlbHAoKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBwYXJzaW5nIHRoZSBoZWxwIGZsYWcgdG8gaW52b2tlIHRoZSBoZWxwLlxuICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoXG4gICAgICBzdWJjb21tYW5kTmFtZSxcbiAgICAgIFtdLFxuICAgICAgW3RoaXMuX2dldEhlbHBPcHRpb24oKT8ubG9uZyA/PyB0aGlzLl9nZXRIZWxwT3B0aW9uKCk/LnNob3J0ID8/ICctLWhlbHAnXSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoaXMuYXJncyBhZ2FpbnN0IGV4cGVjdGVkIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoZWNrTnVtYmVyT2ZBcmd1bWVudHMoKSB7XG4gICAgLy8gdG9vIGZld1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChhcmcsIGkpID0+IHtcbiAgICAgIGlmIChhcmcucmVxdWlyZWQgJiYgdGhpcy5hcmdzW2ldID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5taXNzaW5nQXJndW1lbnQoYXJnLm5hbWUoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gdG9vIG1hbnlcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzW3RoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGggLSAxXS52YXJpYWRpY1xuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5hcmdzLmxlbmd0aCA+IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2V4Y2Vzc0FyZ3VtZW50cyh0aGlzLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHRoaXMuYXJncyB1c2luZyB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMgYW5kIHNhdmUgYXMgdGhpcy5wcm9jZXNzZWRBcmdzIVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcHJvY2Vzc0FyZ3VtZW50cygpIHtcbiAgICBjb25zdCBteVBhcnNlQXJnID0gKGFyZ3VtZW50LCB2YWx1ZSwgcHJldmlvdXMpID0+IHtcbiAgICAgIC8vIEV4dHJhIHByb2Nlc3NpbmcgZm9yIG5pY2UgZXJyb3IgbWVzc2FnZSBvbiBwYXJzaW5nIGZhaWx1cmUuXG4gICAgICBsZXQgcGFyc2VkVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiBhcmd1bWVudC5wYXJzZUFyZykge1xuICAgICAgICBjb25zdCBpbnZhbGlkVmFsdWVNZXNzYWdlID0gYGVycm9yOiBjb21tYW5kLWFyZ3VtZW50IHZhbHVlICcke3ZhbHVlfScgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgJyR7YXJndW1lbnQubmFtZSgpfScuYDtcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB0aGlzLl9jYWxsUGFyc2VBcmcoXG4gICAgICAgICAgYXJndW1lbnQsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgcHJldmlvdXMsXG4gICAgICAgICAgaW52YWxpZFZhbHVlTWVzc2FnZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgICB9O1xuXG4gICAgdGhpcy5fY2hlY2tOdW1iZXJPZkFyZ3VtZW50cygpO1xuXG4gICAgY29uc3QgcHJvY2Vzc2VkQXJncyA9IFtdO1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChkZWNsYXJlZEFyZywgaW5kZXgpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IGRlY2xhcmVkQXJnLmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChkZWNsYXJlZEFyZy52YXJpYWRpYykge1xuICAgICAgICAvLyBDb2xsZWN0IHRvZ2V0aGVyIHJlbWFpbmluZyBhcmd1bWVudHMgZm9yIHBhc3NpbmcgdG9nZXRoZXIgYXMgYW4gYXJyYXkuXG4gICAgICAgIGlmIChpbmRleCA8IHRoaXMuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuYXJncy5zbGljZShpbmRleCk7XG4gICAgICAgICAgaWYgKGRlY2xhcmVkQXJnLnBhcnNlQXJnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlZHVjZSgocHJvY2Vzc2VkLCB2KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBteVBhcnNlQXJnKGRlY2xhcmVkQXJnLCB2LCBwcm9jZXNzZWQpO1xuICAgICAgICAgICAgfSwgZGVjbGFyZWRBcmcuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhbHVlID0gW107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaW5kZXggPCB0aGlzLmFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5hcmdzW2luZGV4XTtcbiAgICAgICAgaWYgKGRlY2xhcmVkQXJnLnBhcnNlQXJnKSB7XG4gICAgICAgICAgdmFsdWUgPSBteVBhcnNlQXJnKGRlY2xhcmVkQXJnLCB2YWx1ZSwgZGVjbGFyZWRBcmcuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJvY2Vzc2VkQXJnc1tpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnByb2Nlc3NlZEFyZ3MgPSBwcm9jZXNzZWRBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uY2Ugd2UgaGF2ZSBhIHByb21pc2Ugd2UgY2hhaW4sIGJ1dCBjYWxsIHN5bmNocm9ub3VzbHkgdW50aWwgdGhlbi5cbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm4geyhQcm9taXNlfHVuZGVmaW5lZCl9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGFpbk9yQ2FsbChwcm9taXNlLCBmbikge1xuICAgIC8vIHRoZW5hYmxlXG4gICAgaWYgKHByb21pc2UgJiYgcHJvbWlzZS50aGVuICYmIHR5cGVvZiBwcm9taXNlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIGFscmVhZHkgaGF2ZSBhIHByb21pc2UsIGNoYWluIGNhbGxiYWNrXG4gICAgICByZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IGZuKCkpO1xuICAgIH1cbiAgICAvLyBjYWxsYmFjayBtaWdodCByZXR1cm4gYSBwcm9taXNlXG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcmV0dXJuIHsoUHJvbWlzZXx1bmRlZmluZWQpfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hhaW5PckNhbGxIb29rcyhwcm9taXNlLCBldmVudCkge1xuICAgIGxldCByZXN1bHQgPSBwcm9taXNlO1xuICAgIGNvbnN0IGhvb2tzID0gW107XG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmlsdGVyKChjbWQpID0+IGNtZC5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdICE9PSB1bmRlZmluZWQpXG4gICAgICAuZm9yRWFjaCgoaG9va2VkQ29tbWFuZCkgPT4ge1xuICAgICAgICBob29rZWRDb21tYW5kLl9saWZlQ3ljbGVIb29rc1tldmVudF0uZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICBob29rcy5wdXNoKHsgaG9va2VkQ29tbWFuZCwgY2FsbGJhY2sgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgaWYgKGV2ZW50ID09PSAncG9zdEFjdGlvbicpIHtcbiAgICAgIGhvb2tzLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICBob29rcy5mb3JFYWNoKChob29rRGV0YWlsKSA9PiB7XG4gICAgICByZXN1bHQgPSB0aGlzLl9jaGFpbk9yQ2FsbChyZXN1bHQsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGhvb2tEZXRhaWwuY2FsbGJhY2soaG9va0RldGFpbC5ob29rZWRDb21tYW5kLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gc3ViQ29tbWFuZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHJldHVybiB7KFByb21pc2V8dW5kZWZpbmVkKX1cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoYWluT3JDYWxsU3ViQ29tbWFuZEhvb2socHJvbWlzZSwgc3ViQ29tbWFuZCwgZXZlbnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gcHJvbWlzZTtcbiAgICBpZiAodGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XS5mb3JFYWNoKChob29rKSA9PiB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2NoYWluT3JDYWxsKHJlc3VsdCwgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBob29rKHRoaXMsIHN1YkNvbW1hbmQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYXJndW1lbnRzIGluIGNvbnRleHQgb2YgdGhpcyBjb21tYW5kLlxuICAgKiBSZXR1cm5zIGFjdGlvbiByZXN1bHQsIGluIGNhc2UgaXQgaXMgYSBwcm9taXNlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcGFyc2VDb21tYW5kKG9wZXJhbmRzLCB1bmtub3duKSB7XG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZU9wdGlvbnModW5rbm93bik7XG4gICAgdGhpcy5fcGFyc2VPcHRpb25zRW52KCk7IC8vIGFmdGVyIGNsaSwgc28gcGFyc2VBcmcgbm90IGNhbGxlZCBvbiBib3RoIGNsaSBhbmQgZW52XG4gICAgdGhpcy5fcGFyc2VPcHRpb25zSW1wbGllZCgpO1xuICAgIG9wZXJhbmRzID0gb3BlcmFuZHMuY29uY2F0KHBhcnNlZC5vcGVyYW5kcyk7XG4gICAgdW5rbm93biA9IHBhcnNlZC51bmtub3duO1xuICAgIHRoaXMuYXJncyA9IG9wZXJhbmRzLmNvbmNhdCh1bmtub3duKTtcblxuICAgIGlmIChvcGVyYW5kcyAmJiB0aGlzLl9maW5kQ29tbWFuZChvcGVyYW5kc1swXSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQob3BlcmFuZHNbMF0sIG9wZXJhbmRzLnNsaWNlKDEpLCB1bmtub3duKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5fZ2V0SGVscENvbW1hbmQoKSAmJlxuICAgICAgb3BlcmFuZHNbMF0gPT09IHRoaXMuX2dldEhlbHBDb21tYW5kKCkubmFtZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hIZWxwQ29tbWFuZChvcGVyYW5kc1sxXSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWUpIHtcbiAgICAgIHRoaXMuX291dHB1dEhlbHBJZlJlcXVlc3RlZCh1bmtub3duKTsgLy8gUnVuIHRoZSBoZWxwIGZvciBkZWZhdWx0IGNvbW1hbmQgZnJvbSBwYXJlbnQgcmF0aGVyIHRoYW4gcGFzc2luZyB0byBkZWZhdWx0IGNvbW1hbmRcbiAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoXG4gICAgICAgIHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSxcbiAgICAgICAgb3BlcmFuZHMsXG4gICAgICAgIHVua25vd24sXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbW1hbmRzLmxlbmd0aCAmJlxuICAgICAgdGhpcy5hcmdzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgIXRoaXMuX2FjdGlvbkhhbmRsZXIgJiZcbiAgICAgICF0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWVcbiAgICApIHtcbiAgICAgIC8vIHByb2JhYmx5IG1pc3Npbmcgc3ViY29tbWFuZCBhbmQgbm8gaGFuZGxlciwgdXNlciBuZWVkcyBoZWxwIChhbmQgZXhpdClcbiAgICAgIHRoaXMuaGVscCh7IGVycm9yOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX291dHB1dEhlbHBJZlJlcXVlc3RlZChwYXJzZWQudW5rbm93bik7XG4gICAgdGhpcy5fY2hlY2tGb3JNaXNzaW5nTWFuZGF0b3J5T3B0aW9ucygpO1xuICAgIHRoaXMuX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCk7XG5cbiAgICAvLyBXZSBkbyBub3QgYWx3YXlzIGNhbGwgdGhpcyBjaGVjayB0byBhdm9pZCBtYXNraW5nIGEgXCJiZXR0ZXJcIiBlcnJvciwgbGlrZSB1bmtub3duIGNvbW1hbmQuXG4gICAgY29uc3QgY2hlY2tGb3JVbmtub3duT3B0aW9ucyA9ICgpID0+IHtcbiAgICAgIGlmIChwYXJzZWQudW5rbm93bi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudW5rbm93bk9wdGlvbihwYXJzZWQudW5rbm93blswXSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbW1hbmRFdmVudCA9IGBjb21tYW5kOiR7dGhpcy5uYW1lKCl9YDtcbiAgICBpZiAodGhpcy5fYWN0aW9uSGFuZGxlcikge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgdGhpcy5fcHJvY2Vzc0FyZ3VtZW50cygpO1xuXG4gICAgICBsZXQgcHJvbWlzZUNoYWluO1xuICAgICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGxIb29rcyhwcm9taXNlQ2hhaW4sICdwcmVBY3Rpb24nKTtcbiAgICAgIHByb21pc2VDaGFpbiA9IHRoaXMuX2NoYWluT3JDYWxsKHByb21pc2VDaGFpbiwgKCkgPT5cbiAgICAgICAgdGhpcy5fYWN0aW9uSGFuZGxlcih0aGlzLnByb2Nlc3NlZEFyZ3MpLFxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbChwcm9taXNlQ2hhaW4sICgpID0+IHtcbiAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KGNvbW1hbmRFdmVudCwgb3BlcmFuZHMsIHVua25vd24pOyAvLyBsZWdhY3lcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbEhvb2tzKHByb21pc2VDaGFpbiwgJ3Bvc3RBY3Rpb24nKTtcbiAgICAgIHJldHVybiBwcm9taXNlQ2hhaW47XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5saXN0ZW5lckNvdW50KGNvbW1hbmRFdmVudCkpIHtcbiAgICAgIGNoZWNrRm9yVW5rbm93bk9wdGlvbnMoKTtcbiAgICAgIHRoaXMuX3Byb2Nlc3NBcmd1bWVudHMoKTtcbiAgICAgIHRoaXMucGFyZW50LmVtaXQoY29tbWFuZEV2ZW50LCBvcGVyYW5kcywgdW5rbm93bik7IC8vIGxlZ2FjeVxuICAgIH0gZWxzZSBpZiAob3BlcmFuZHMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5fZmluZENvbW1hbmQoJyonKSkge1xuICAgICAgICAvLyBsZWdhY3kgZGVmYXVsdCBjb21tYW5kXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoJyonLCBvcGVyYW5kcywgdW5rbm93bik7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50KCdjb21tYW5kOionKSkge1xuICAgICAgICAvLyBza2lwIG9wdGlvbiBjaGVjaywgZW1pdCBldmVudCBmb3IgcG9zc2libGUgbWlzc3BlbGxpbmcgc3VnZ2VzdGlvblxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6KicsIG9wZXJhbmRzLCB1bmtub3duKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51bmtub3duQ29tbWFuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgICB0aGlzLl9wcm9jZXNzQXJndW1lbnRzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbW1hbmRzLmxlbmd0aCkge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgLy8gVGhpcyBjb21tYW5kIGhhcyBzdWJjb21tYW5kcyBhbmQgbm90aGluZyBob29rZWQgdXAgYXQgdGhpcyBsZXZlbCwgc28gZGlzcGxheSBoZWxwIChhbmQgZXhpdCkuXG4gICAgICB0aGlzLmhlbHAoeyBlcnJvcjogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgdGhpcy5fcHJvY2Vzc0FyZ3VtZW50cygpO1xuICAgICAgLy8gZmFsbCB0aHJvdWdoIGZvciBjYWxsZXIgdG8gaGFuZGxlIGFmdGVyIGNhbGxpbmcgLnBhcnNlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtYXRjaGluZyBjb21tYW5kLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJuIHtDb21tYW5kIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgX2ZpbmRDb21tYW5kKG5hbWUpIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZHMuZmluZChcbiAgICAgIChjbWQpID0+IGNtZC5fbmFtZSA9PT0gbmFtZSB8fCBjbWQuX2FsaWFzZXMuaW5jbHVkZXMobmFtZSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gb3B0aW9uIG1hdGNoaW5nIGBhcmdgIGlmIGFueS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIF9maW5kT3B0aW9uKGFyZykge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24uaXMoYXJnKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGlmIGEgbWFuZGF0b3J5IG9wdGlvbiBkb2VzIG5vdCBoYXZlIGEgdmFsdWUuXG4gICAqIENhbGxlZCBhZnRlciBjaGVja2luZyBmb3IgaGVscCBmbGFncyBpbiBsZWFmIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGVja0Zvck1pc3NpbmdNYW5kYXRvcnlPcHRpb25zKCkge1xuICAgIC8vIFdhbGsgdXAgaGllcmFyY2h5IHNvIGNhbiBjYWxsIGluIHN1YmNvbW1hbmQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGRpc3BsYXlpbmcgaGVscC5cbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBjbWQub3B0aW9ucy5mb3JFYWNoKChhbk9wdGlvbikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYW5PcHRpb24ubWFuZGF0b3J5ICYmXG4gICAgICAgICAgY21kLmdldE9wdGlvblZhbHVlKGFuT3B0aW9uLmF0dHJpYnV0ZU5hbWUoKSkgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICBjbWQubWlzc2luZ01hbmRhdG9yeU9wdGlvblZhbHVlKGFuT3B0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGlmIGNvbmZsaWN0aW5nIG9wdGlvbnMgYXJlIHVzZWQgdG9nZXRoZXIgaW4gdGhpcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGVja0ZvckNvbmZsaWN0aW5nTG9jYWxPcHRpb25zKCkge1xuICAgIGNvbnN0IGRlZmluZWROb25EZWZhdWx0T3B0aW9ucyA9IHRoaXMub3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5ID0gb3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIGlmICh0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbktleSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5nZXRPcHRpb25WYWx1ZVNvdXJjZShvcHRpb25LZXkpICE9PSAnZGVmYXVsdCc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvcHRpb25zV2l0aENvbmZsaWN0aW5nID0gZGVmaW5lZE5vbkRlZmF1bHRPcHRpb25zLmZpbHRlcihcbiAgICAgIChvcHRpb24pID0+IG9wdGlvbi5jb25mbGljdHNXaXRoLmxlbmd0aCA+IDAsXG4gICAgKTtcblxuICAgIG9wdGlvbnNXaXRoQ29uZmxpY3RpbmcuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBjb25zdCBjb25mbGljdGluZ0FuZERlZmluZWQgPSBkZWZpbmVkTm9uRGVmYXVsdE9wdGlvbnMuZmluZCgoZGVmaW5lZCkgPT5cbiAgICAgICAgb3B0aW9uLmNvbmZsaWN0c1dpdGguaW5jbHVkZXMoZGVmaW5lZC5hdHRyaWJ1dGVOYW1lKCkpLFxuICAgICAgKTtcbiAgICAgIGlmIChjb25mbGljdGluZ0FuZERlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fY29uZmxpY3RpbmdPcHRpb24ob3B0aW9uLCBjb25mbGljdGluZ0FuZERlZmluZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBpZiBjb25mbGljdGluZyBvcHRpb25zIGFyZSB1c2VkIHRvZ2V0aGVyLlxuICAgKiBDYWxsZWQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGhlbHAgZmxhZ3MgaW4gbGVhZiBzdWJjb21tYW5kLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCkge1xuICAgIC8vIFdhbGsgdXAgaGllcmFyY2h5IHNvIGNhbiBjYWxsIGluIHN1YmNvbW1hbmQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGRpc3BsYXlpbmcgaGVscC5cbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBjbWQuX2NoZWNrRm9yQ29uZmxpY3RpbmdMb2NhbE9wdGlvbnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBvcHRpb25zIGZyb20gYGFyZ3ZgIHJlbW92aW5nIGtub3duIG9wdGlvbnMsXG4gICAqIGFuZCByZXR1cm4gYXJndiBzcGxpdCBpbnRvIG9wZXJhbmRzIGFuZCB1bmtub3duIGFyZ3VtZW50cy5cbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqXG4gICAqICAgICBhcmd2ID0+IG9wZXJhbmRzLCB1bmtub3duXG4gICAqICAgICAtLWtub3duIGtrayBvcCA9PiBbb3BdLCBbXVxuICAgKiAgICAgb3AgLS1rbm93biBra2sgPT4gW29wXSwgW11cbiAgICogICAgIHN1YiAtLXVua25vd24gdXV1IG9wID0+IFtzdWJdLCBbLS11bmtub3duIHV1dSBvcF1cbiAgICogICAgIHN1YiAtLSAtLXVua25vd24gdXV1IG9wID0+IFtzdWIgLS11bmtub3duIHV1dSBvcF0sIFtdXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3ZcbiAgICogQHJldHVybiB7e29wZXJhbmRzOiBzdHJpbmdbXSwgdW5rbm93bjogc3RyaW5nW119fVxuICAgKi9cblxuICBwYXJzZU9wdGlvbnMoYXJndikge1xuICAgIGNvbnN0IG9wZXJhbmRzID0gW107IC8vIG9wZXJhbmRzLCBub3Qgb3B0aW9ucyBvciB2YWx1ZXNcbiAgICBjb25zdCB1bmtub3duID0gW107IC8vIGZpcnN0IHVua25vd24gb3B0aW9uIGFuZCByZW1haW5pbmcgdW5rbm93biBhcmdzXG4gICAgbGV0IGRlc3QgPSBvcGVyYW5kcztcbiAgICBjb25zdCBhcmdzID0gYXJndi5zbGljZSgpO1xuXG4gICAgZnVuY3Rpb24gbWF5YmVPcHRpb24oYXJnKSB7XG4gICAgICByZXR1cm4gYXJnLmxlbmd0aCA+IDEgJiYgYXJnWzBdID09PSAnLSc7XG4gICAgfVxuXG4gICAgLy8gcGFyc2Ugb3B0aW9uc1xuICAgIGxldCBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG51bGw7XG4gICAgd2hpbGUgKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhcmcgPSBhcmdzLnNoaWZ0KCk7XG5cbiAgICAgIC8vIGxpdGVyYWxcbiAgICAgIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgICAgaWYgKGRlc3QgPT09IHVua25vd24pIGRlc3QucHVzaChhcmcpO1xuICAgICAgICBkZXN0LnB1c2goLi4uYXJncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlVmFyaWFkaWNPcHRpb24gJiYgIW1heWJlT3B0aW9uKGFyZykpIHtcbiAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHthY3RpdmVWYXJpYWRpY09wdGlvbi5uYW1lKCl9YCwgYXJnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG51bGw7XG5cbiAgICAgIGlmIChtYXliZU9wdGlvbihhcmcpKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2ZpbmRPcHRpb24oYXJnKTtcbiAgICAgICAgLy8gcmVjb2duaXNlZCBvcHRpb24sIGNhbGwgbGlzdGVuZXIgdG8gYXNzaWduIHZhbHVlIHdpdGggcG9zc2libGUgY3VzdG9tIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgIGlmIChvcHRpb24ucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXJncy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHRoaXMub3B0aW9uTWlzc2luZ0FyZ3VtZW50KG9wdGlvbik7XG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgLy8gaGlzdG9yaWNhbCBiZWhhdmlvdXIgaXMgb3B0aW9uYWwgdmFsdWUgaXMgZm9sbG93aW5nIGFyZyB1bmxlc3MgYW4gb3B0aW9uXG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwICYmICFtYXliZU9wdGlvbihhcmdzWzBdKSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7b3B0aW9uLm5hbWUoKX1gLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJvb2xlYW4gZmxhZ1xuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG9wdGlvbi52YXJpYWRpYyA/IG9wdGlvbiA6IG51bGw7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9vayBmb3IgY29tYm8gb3B0aW9ucyBmb2xsb3dpbmcgc2luZ2xlIGRhc2gsIGVhdCBmaXJzdCBvbmUgaWYga25vd24uXG4gICAgICBpZiAoYXJnLmxlbmd0aCA+IDIgJiYgYXJnWzBdID09PSAnLScgJiYgYXJnWzFdICE9PSAnLScpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZmluZE9wdGlvbihgLSR7YXJnWzFdfWApO1xuICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgb3B0aW9uLnJlcXVpcmVkIHx8XG4gICAgICAgICAgICAob3B0aW9uLm9wdGlvbmFsICYmIHRoaXMuX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIG9wdGlvbiB3aXRoIHZhbHVlIGZvbGxvd2luZyBpbiBzYW1lIGFyZ3VtZW50XG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCwgYXJnLnNsaWNlKDIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYm9vbGVhbiBvcHRpb24sIGVtaXQgYW5kIHB1dCBiYWNrIHJlbWFpbmRlciBvZiBhcmcgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgICAgYXJncy51bnNoaWZ0KGAtJHthcmcuc2xpY2UoMil9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvb2sgZm9yIGtub3duIGxvbmcgZmxhZyB3aXRoIHZhbHVlLCBsaWtlIC0tZm9vPWJhclxuICAgICAgaWYgKC9eLS1bXj1dKz0vLnRlc3QoYXJnKSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGFyZy5pbmRleE9mKCc9Jyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2ZpbmRPcHRpb24oYXJnLnNsaWNlKDAsIGluZGV4KSk7XG4gICAgICAgIGlmIChvcHRpb24gJiYgKG9wdGlvbi5yZXF1aXJlZCB8fCBvcHRpb24ub3B0aW9uYWwpKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWAsIGFyZy5zbGljZShpbmRleCArIDEpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOb3QgYSByZWNvZ25pc2VkIG9wdGlvbiBieSB0aGlzIGNvbW1hbmQuXG4gICAgICAvLyBNaWdodCBiZSBhIGNvbW1hbmQtYXJndW1lbnQsIG9yIHN1YmNvbW1hbmQgb3B0aW9uLCBvciB1bmtub3duIG9wdGlvbiwgb3IgaGVscCBjb21tYW5kIG9yIG9wdGlvbi5cblxuICAgICAgLy8gQW4gdW5rbm93biBvcHRpb24gbWVhbnMgZnVydGhlciBhcmd1bWVudHMgYWxzbyBjbGFzc2lmaWVkIGFzIHVua25vd24gc28gY2FuIGJlIHJlcHJvY2Vzc2VkIGJ5IHN1YmNvbW1hbmRzLlxuICAgICAgaWYgKG1heWJlT3B0aW9uKGFyZykpIHtcbiAgICAgICAgZGVzdCA9IHVua25vd247XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHVzaW5nIHBvc2l0aW9uYWxPcHRpb25zLCBzdG9wIHByb2Nlc3Npbmcgb3VyIG9wdGlvbnMgYXQgc3ViY29tbWFuZC5cbiAgICAgIGlmIChcbiAgICAgICAgKHRoaXMuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zIHx8IHRoaXMuX3Bhc3NUaHJvdWdoT3B0aW9ucykgJiZcbiAgICAgICAgb3BlcmFuZHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgIHVua25vd24ubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmRDb21tYW5kKGFyZykpIHtcbiAgICAgICAgICBvcGVyYW5kcy5wdXNoKGFyZyk7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgdW5rbm93bi5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMuX2dldEhlbHBDb21tYW5kKCkgJiZcbiAgICAgICAgICBhcmcgPT09IHRoaXMuX2dldEhlbHBDb21tYW5kKCkubmFtZSgpXG4gICAgICAgICkge1xuICAgICAgICAgIG9wZXJhbmRzLnB1c2goYXJnKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSBvcGVyYW5kcy5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSkge1xuICAgICAgICAgIHVua25vd24ucHVzaChhcmcpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHVua25vd24ucHVzaCguLi5hcmdzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB1c2luZyBwYXNzVGhyb3VnaE9wdGlvbnMsIHN0b3AgcHJvY2Vzc2luZyBvcHRpb25zIGF0IGZpcnN0IGNvbW1hbmQtYXJndW1lbnQuXG4gICAgICBpZiAodGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zKSB7XG4gICAgICAgIGRlc3QucHVzaChhcmcpO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSBkZXN0LnB1c2goLi4uYXJncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgYXJnXG4gICAgICBkZXN0LnB1c2goYXJnKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBvcGVyYW5kcywgdW5rbm93biB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBsb2NhbCBvcHRpb24gdmFsdWVzIGFzIGtleS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgb3B0cygpIHtcbiAgICBpZiAodGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBQcmVzZXJ2ZSBvcmlnaW5hbCBiZWhhdmlvdXIgc28gYmFja3dhcmRzIGNvbXBhdGlibGUgd2hlbiBzdGlsbCB1c2luZyBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMub3B0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5vcHRpb25zW2ldLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPVxuICAgICAgICAgIGtleSA9PT0gdGhpcy5fdmVyc2lvbk9wdGlvbk5hbWUgPyB0aGlzLl92ZXJzaW9uIDogdGhpc1trZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uVmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBtZXJnZWQgbG9jYWwgYW5kIGdsb2JhbCBvcHRpb24gdmFsdWVzIGFzIGtleS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgb3B0c1dpdGhHbG9iYWxzKCkge1xuICAgIC8vIGdsb2JhbHMgb3ZlcndyaXRlIGxvY2Fsc1xuICAgIHJldHVybiB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkucmVkdWNlKFxuICAgICAgKGNvbWJpbmVkT3B0aW9ucywgY21kKSA9PiBPYmplY3QuYXNzaWduKGNvbWJpbmVkT3B0aW9ucywgY21kLm9wdHMoKSksXG4gICAgICB7fSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCAob3IgY2FsbCBleGl0T3ZlcnJpZGUpLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge29iamVjdH0gW2Vycm9yT3B0aW9uc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlcnJvck9wdGlvbnMuY29kZV0gLSBhbiBpZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlcnJvclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2Vycm9yT3B0aW9ucy5leGl0Q29kZV0gLSB1c2VkIHdpdGggcHJvY2Vzcy5leGl0XG4gICAqL1xuICBlcnJvcihtZXNzYWdlLCBlcnJvck9wdGlvbnMpIHtcbiAgICAvLyBvdXRwdXQgaGFuZGxpbmdcbiAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLm91dHB1dEVycm9yKFxuICAgICAgYCR7bWVzc2FnZX1cXG5gLFxuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZUVycixcbiAgICApO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fc2hvd0hlbHBBZnRlckVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZUVycihgJHt0aGlzLl9zaG93SGVscEFmdGVyRXJyb3J9XFxuYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zaG93SGVscEFmdGVyRXJyb3IpIHtcbiAgICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIoJ1xcbicpO1xuICAgICAgdGhpcy5vdXRwdXRIZWxwKHsgZXJyb3I6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gZXhpdCBoYW5kbGluZ1xuICAgIGNvbnN0IGNvbmZpZyA9IGVycm9yT3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBleGl0Q29kZSA9IGNvbmZpZy5leGl0Q29kZSB8fCAxO1xuICAgIGNvbnN0IGNvZGUgPSBjb25maWcuY29kZSB8fCAnY29tbWFuZGVyLmVycm9yJztcbiAgICB0aGlzLl9leGl0KGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhbnkgb3B0aW9uIHJlbGF0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBpZiBvcHRpb24gZG9lc1xuICAgKiBub3QgaGF2ZSBhIHZhbHVlIGZyb20gY2xpIG9yIGNsaWVudCBjb2RlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3BhcnNlT3B0aW9uc0VudigpIHtcbiAgICB0aGlzLm9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAob3B0aW9uLmVudlZhciAmJiBvcHRpb24uZW52VmFyIGluIHByb2Nlc3MuZW52KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICAgIC8vIFByaW9yaXR5IGNoZWNrLiBEbyBub3Qgb3ZlcndyaXRlIGNsaSBvciBvcHRpb25zIGZyb20gdW5rbm93biBzb3VyY2UgKGNsaWVudC1jb2RlKS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgWydkZWZhdWx0JywgJ2NvbmZpZycsICdlbnYnXS5pbmNsdWRlcyhcbiAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KSxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChvcHRpb24ucmVxdWlyZWQgfHwgb3B0aW9uLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAvLyBvcHRpb24gY2FuIHRha2UgYSB2YWx1ZVxuICAgICAgICAgICAgLy8ga2VlcCB2ZXJ5IHNpbXBsZSwgb3B0aW9uYWwgYWx3YXlzIHRha2VzIHZhbHVlXG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbkVudjoke29wdGlvbi5uYW1lKCl9YCwgcHJvY2Vzcy5lbnZbb3B0aW9uLmVudlZhcl0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBib29sZWFuXG4gICAgICAgICAgICAvLyBrZWVwIHZlcnkgc2ltcGxlLCBvbmx5IGNhcmUgdGhhdCBlbnZWYXIgZGVmaW5lZCBhbmQgbm90IHRoZSB2YWx1ZVxuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb25FbnY6JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFueSBpbXBsaWVkIG9wdGlvbiB2YWx1ZXMsIGlmIG9wdGlvbiBpcyB1bmRlZmluZWQgb3IgZGVmYXVsdCB2YWx1ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wYXJzZU9wdGlvbnNJbXBsaWVkKCkge1xuICAgIGNvbnN0IGR1YWxIZWxwZXIgPSBuZXcgRHVhbE9wdGlvbnModGhpcy5vcHRpb25zKTtcbiAgICBjb25zdCBoYXNDdXN0b21PcHRpb25WYWx1ZSA9IChvcHRpb25LZXkpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICFbJ2RlZmF1bHQnLCAnaW1wbGllZCddLmluY2x1ZGVzKHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KSlcbiAgICAgICk7XG4gICAgfTtcbiAgICB0aGlzLm9wdGlvbnNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChvcHRpb24pID0+XG4gICAgICAgICAgb3B0aW9uLmltcGxpZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIGhhc0N1c3RvbU9wdGlvblZhbHVlKG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkpICYmXG4gICAgICAgICAgZHVhbEhlbHBlci52YWx1ZUZyb21PcHRpb24oXG4gICAgICAgICAgICB0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkpLFxuICAgICAgICAgICAgb3B0aW9uLFxuICAgICAgICAgICksXG4gICAgICApXG4gICAgICAuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbi5pbXBsaWVkKVxuICAgICAgICAgIC5maWx0ZXIoKGltcGxpZWRLZXkpID0+ICFoYXNDdXN0b21PcHRpb25WYWx1ZShpbXBsaWVkS2V5KSlcbiAgICAgICAgICAuZm9yRWFjaCgoaW1wbGllZEtleSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UoXG4gICAgICAgICAgICAgIGltcGxpZWRLZXksXG4gICAgICAgICAgICAgIG9wdGlvbi5pbXBsaWVkW2ltcGxpZWRLZXldLFxuICAgICAgICAgICAgICAnaW1wbGllZCcsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXJndW1lbnQgYG5hbWVgIGlzIG1pc3NpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIG1pc3NpbmdBcmd1bWVudChuYW1lKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCAnJHtuYW1lfSdgO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLm1pc3NpbmdBcmd1bWVudCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogYE9wdGlvbmAgaXMgbWlzc2luZyBhbiBhcmd1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBvcHRpb25NaXNzaW5nQXJndW1lbnQob3B0aW9uKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogb3B0aW9uICcke29wdGlvbi5mbGFnc30nIGFyZ3VtZW50IG1pc3NpbmdgO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLm9wdGlvbk1pc3NpbmdBcmd1bWVudCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogYE9wdGlvbmAgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgaXMgYSBtYW5kYXRvcnkgb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIG1pc3NpbmdNYW5kYXRvcnlPcHRpb25WYWx1ZShvcHRpb24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiByZXF1aXJlZCBvcHRpb24gJyR7b3B0aW9uLmZsYWdzfScgbm90IHNwZWNpZmllZGA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIubWlzc2luZ01hbmRhdG9yeU9wdGlvblZhbHVlJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgT3B0aW9uYCBjb25mbGljdHMgd2l0aCBhbm90aGVyIG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcGFyYW0ge09wdGlvbn0gY29uZmxpY3RpbmdPcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jb25mbGljdGluZ09wdGlvbihvcHRpb24sIGNvbmZsaWN0aW5nT3B0aW9uKSB7XG4gICAgLy8gVGhlIGNhbGxpbmcgY29kZSBkb2VzIG5vdCBrbm93IHdoZXRoZXIgYSBuZWdhdGVkIG9wdGlvbiBpcyB0aGUgc291cmNlIG9mIHRoZVxuICAgIC8vIHZhbHVlLCBzbyBkbyBzb21lIHdvcmsgdG8gdGFrZSBhbiBlZHVjYXRlZCBndWVzcy5cbiAgICBjb25zdCBmaW5kQmVzdE9wdGlvbkZyb21WYWx1ZSA9IChvcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KTtcbiAgICAgIGNvbnN0IG5lZ2F0aXZlT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoXG4gICAgICAgICh0YXJnZXQpID0+IHRhcmdldC5uZWdhdGUgJiYgb3B0aW9uS2V5ID09PSB0YXJnZXQuYXR0cmlidXRlTmFtZSgpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBvc2l0aXZlT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoXG4gICAgICAgICh0YXJnZXQpID0+ICF0YXJnZXQubmVnYXRlICYmIG9wdGlvbktleSA9PT0gdGFyZ2V0LmF0dHJpYnV0ZU5hbWUoKSxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIG5lZ2F0aXZlT3B0aW9uICYmXG4gICAgICAgICgobmVnYXRpdmVPcHRpb24ucHJlc2V0QXJnID09PSB1bmRlZmluZWQgJiYgb3B0aW9uVmFsdWUgPT09IGZhbHNlKSB8fFxuICAgICAgICAgIChuZWdhdGl2ZU9wdGlvbi5wcmVzZXRBcmcgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgb3B0aW9uVmFsdWUgPT09IG5lZ2F0aXZlT3B0aW9uLnByZXNldEFyZykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG5lZ2F0aXZlT3B0aW9uO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBvc2l0aXZlT3B0aW9uIHx8IG9wdGlvbjtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3QgYmVzdE9wdGlvbiA9IGZpbmRCZXN0T3B0aW9uRnJvbVZhbHVlKG9wdGlvbik7XG4gICAgICBjb25zdCBvcHRpb25LZXkgPSBiZXN0T3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KTtcbiAgICAgIGlmIChzb3VyY2UgPT09ICdlbnYnKSB7XG4gICAgICAgIHJldHVybiBgZW52aXJvbm1lbnQgdmFyaWFibGUgJyR7YmVzdE9wdGlvbi5lbnZWYXJ9J2A7XG4gICAgICB9XG4gICAgICByZXR1cm4gYG9wdGlvbiAnJHtiZXN0T3B0aW9uLmZsYWdzfSdgO1xuICAgIH07XG5cbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiAke2dldEVycm9yTWVzc2FnZShvcHRpb24pfSBjYW5ub3QgYmUgdXNlZCB3aXRoICR7Z2V0RXJyb3JNZXNzYWdlKGNvbmZsaWN0aW5nT3B0aW9uKX1gO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLmNvbmZsaWN0aW5nT3B0aW9uJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmtub3duIG9wdGlvbiBgZmxhZ2AuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIHVua25vd25PcHRpb24oZmxhZykge1xuICAgIGlmICh0aGlzLl9hbGxvd1Vua25vd25PcHRpb24pIHJldHVybjtcbiAgICBsZXQgc3VnZ2VzdGlvbiA9ICcnO1xuXG4gICAgaWYgKGZsYWcuc3RhcnRzV2l0aCgnLS0nKSAmJiB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IpIHtcbiAgICAgIC8vIExvb3BpbmcgdG8gcGljayB1cCB0aGUgZ2xvYmFsIG9wdGlvbnMgdG9vXG4gICAgICBsZXQgY2FuZGlkYXRlRmxhZ3MgPSBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgbGV0IGNvbW1hbmQgPSB0aGlzO1xuICAgICAgZG8ge1xuICAgICAgICBjb25zdCBtb3JlRmxhZ3MgPSBjb21tYW5kXG4gICAgICAgICAgLmNyZWF0ZUhlbHAoKVxuICAgICAgICAgIC52aXNpYmxlT3B0aW9ucyhjb21tYW5kKVxuICAgICAgICAgIC5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLmxvbmcpXG4gICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiBvcHRpb24ubG9uZyk7XG4gICAgICAgIGNhbmRpZGF0ZUZsYWdzID0gY2FuZGlkYXRlRmxhZ3MuY29uY2F0KG1vcmVGbGFncyk7XG4gICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnBhcmVudDtcbiAgICAgIH0gd2hpbGUgKGNvbW1hbmQgJiYgIWNvbW1hbmQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zKTtcbiAgICAgIHN1Z2dlc3Rpb24gPSBzdWdnZXN0U2ltaWxhcihmbGFnLCBjYW5kaWRhdGVGbGFncyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogdW5rbm93biBvcHRpb24gJyR7ZmxhZ30nJHtzdWdnZXN0aW9ufWA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIudW5rbm93bk9wdGlvbicgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXhjZXNzIGFyZ3VtZW50cywgbW9yZSB0aGFuIGV4cGVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSByZWNlaXZlZEFyZ3NcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2V4Y2Vzc0FyZ3VtZW50cyhyZWNlaXZlZEFyZ3MpIHtcbiAgICBpZiAodGhpcy5fYWxsb3dFeGNlc3NBcmd1bWVudHMpIHJldHVybjtcblxuICAgIGNvbnN0IGV4cGVjdGVkID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aDtcbiAgICBjb25zdCBzID0gZXhwZWN0ZWQgPT09IDEgPyAnJyA6ICdzJztcbiAgICBjb25zdCBmb3JTdWJjb21tYW5kID0gdGhpcy5wYXJlbnQgPyBgIGZvciAnJHt0aGlzLm5hbWUoKX0nYCA6ICcnO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IHRvbyBtYW55IGFyZ3VtZW50cyR7Zm9yU3ViY29tbWFuZH0uIEV4cGVjdGVkICR7ZXhwZWN0ZWR9IGFyZ3VtZW50JHtzfSBidXQgZ290ICR7cmVjZWl2ZWRBcmdzLmxlbmd0aH0uYDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci5leGNlc3NBcmd1bWVudHMnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVua25vd24gY29tbWFuZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgdW5rbm93bkNvbW1hbmQoKSB7XG4gICAgY29uc3QgdW5rbm93bk5hbWUgPSB0aGlzLmFyZ3NbMF07XG4gICAgbGV0IHN1Z2dlc3Rpb24gPSAnJztcblxuICAgIGlmICh0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZU5hbWVzID0gW107XG4gICAgICB0aGlzLmNyZWF0ZUhlbHAoKVxuICAgICAgICAudmlzaWJsZUNvbW1hbmRzKHRoaXMpXG4gICAgICAgIC5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgY2FuZGlkYXRlTmFtZXMucHVzaChjb21tYW5kLm5hbWUoKSk7XG4gICAgICAgICAgLy8ganVzdCB2aXNpYmxlIGFsaWFzXG4gICAgICAgICAgaWYgKGNvbW1hbmQuYWxpYXMoKSkgY2FuZGlkYXRlTmFtZXMucHVzaChjb21tYW5kLmFsaWFzKCkpO1xuICAgICAgICB9KTtcbiAgICAgIHN1Z2dlc3Rpb24gPSBzdWdnZXN0U2ltaWxhcih1bmtub3duTmFtZSwgY2FuZGlkYXRlTmFtZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IHVua25vd24gY29tbWFuZCAnJHt1bmtub3duTmFtZX0nJHtzdWdnZXN0aW9ufWA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIudW5rbm93bkNvbW1hbmQnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIHByb2dyYW0gdmVyc2lvbi5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgYXV0by1yZWdpc3RlcnMgdGhlIFwiLVYsIC0tdmVyc2lvblwiIG9wdGlvbiB3aGljaCB3aWxsIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICpcbiAgICogWW91IGNhbiBvcHRpb25hbGx5IHN1cHBseSB0aGUgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhZ3NdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4geyh0aGlzIHwgc3RyaW5nIHwgdW5kZWZpbmVkKX0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nLCBvciB2ZXJzaW9uIHN0cmluZyBpZiBubyBhcmd1bWVudHNcbiAgICovXG5cbiAgdmVyc2lvbihzdHIsIGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgdGhpcy5fdmVyc2lvbiA9IHN0cjtcbiAgICBmbGFncyA9IGZsYWdzIHx8ICctViwgLS12ZXJzaW9uJztcbiAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uIHx8ICdvdXRwdXQgdGhlIHZlcnNpb24gbnVtYmVyJztcbiAgICBjb25zdCB2ZXJzaW9uT3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcbiAgICB0aGlzLl92ZXJzaW9uT3B0aW9uTmFtZSA9IHZlcnNpb25PcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyT3B0aW9uKHZlcnNpb25PcHRpb24pO1xuXG4gICAgdGhpcy5vbignb3B0aW9uOicgKyB2ZXJzaW9uT3B0aW9uLm5hbWUoKSwgKCkgPT4ge1xuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZU91dChgJHtzdHJ9XFxuYCk7XG4gICAgICB0aGlzLl9leGl0KDAsICdjb21tYW5kZXIudmVyc2lvbicsIHN0cik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc0Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cbiAgZGVzY3JpcHRpb24oc3RyLCBhcmdzRGVzY3JpcHRpb24pIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQgJiYgYXJnc0Rlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSBzdHI7XG4gICAgaWYgKGFyZ3NEZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fYXJnc0Rlc2NyaXB0aW9uID0gYXJnc0Rlc2NyaXB0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHN1bW1hcnkuIFVzZWQgd2hlbiBsaXN0ZWQgYXMgc3ViY29tbWFuZCBvZiBwYXJlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cbiAgc3VtbWFyeShzdHIpIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9zdW1tYXJ5O1xuICAgIHRoaXMuX3N1bW1hcnkgPSBzdHI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFuIGFsaWFzIGZvciB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogWW91IG1heSBjYWxsIG1vcmUgdGhhbiBvbmNlIHRvIGFkZCBtdWx0aXBsZSBhbGlhc2VzLiBPbmx5IHRoZSBmaXJzdCBhbGlhcyBpcyBzaG93biBpbiB0aGUgYXV0by1nZW5lcmF0ZWQgaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc11cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG5cbiAgYWxpYXMoYWxpYXMpIHtcbiAgICBpZiAoYWxpYXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2FsaWFzZXNbMF07IC8vIGp1c3QgcmV0dXJuIGZpcnN0LCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuICAgIC8qKiBAdHlwZSB7Q29tbWFuZH0gKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBsZXQgY29tbWFuZCA9IHRoaXM7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb21tYW5kcy5sZW5ndGggIT09IDAgJiZcbiAgICAgIHRoaXMuY29tbWFuZHNbdGhpcy5jb21tYW5kcy5sZW5ndGggLSAxXS5fZXhlY3V0YWJsZUhhbmRsZXJcbiAgICApIHtcbiAgICAgIC8vIGFzc3VtZSBhZGRpbmcgYWxpYXMgZm9yIGxhc3QgYWRkZWQgZXhlY3V0YWJsZSBzdWJjb21tYW5kLCByYXRoZXIgdGhhbiB0aGlzXG4gICAgICBjb21tYW5kID0gdGhpcy5jb21tYW5kc1t0aGlzLmNvbW1hbmRzLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIGlmIChhbGlhcyA9PT0gY29tbWFuZC5fbmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbW1hbmQgYWxpYXMgY2FuJ3QgYmUgdGhlIHNhbWUgYXMgaXRzIG5hbWVcIik7XG4gICAgY29uc3QgbWF0Y2hpbmdDb21tYW5kID0gdGhpcy5wYXJlbnQ/Ll9maW5kQ29tbWFuZChhbGlhcyk7XG4gICAgaWYgKG1hdGNoaW5nQ29tbWFuZCkge1xuICAgICAgLy8gYy5mLiBfcmVnaXN0ZXJDb21tYW5kXG4gICAgICBjb25zdCBleGlzdGluZ0NtZCA9IFttYXRjaGluZ0NvbW1hbmQubmFtZSgpXVxuICAgICAgICAuY29uY2F0KG1hdGNoaW5nQ29tbWFuZC5hbGlhc2VzKCkpXG4gICAgICAgIC5qb2luKCd8Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYW5ub3QgYWRkIGFsaWFzICcke2FsaWFzfScgdG8gY29tbWFuZCAnJHt0aGlzLm5hbWUoKX0nIGFzIGFscmVhZHkgaGF2ZSBjb21tYW5kICcke2V4aXN0aW5nQ21kfSdgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb21tYW5kLl9hbGlhc2VzLnB1c2goYWxpYXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbGlhc2VzIGZvciB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogT25seSB0aGUgZmlyc3QgYWxpYXMgaXMgc2hvd24gaW4gdGhlIGF1dG8tZ2VuZXJhdGVkIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthbGlhc2VzXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nW118Q29tbWFuZCl9XG4gICAqL1xuXG4gIGFsaWFzZXMoYWxpYXNlcykge1xuICAgIC8vIEdldHRlciBmb3IgdGhlIGFycmF5IG9mIGFsaWFzZXMgaXMgdGhlIG1haW4gcmVhc29uIGZvciBoYXZpbmcgYWxpYXNlcygpIGluIGFkZGl0aW9uIHRvIGFsaWFzKCkuXG4gICAgaWYgKGFsaWFzZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2FsaWFzZXM7XG5cbiAgICBhbGlhc2VzLmZvckVhY2goKGFsaWFzKSA9PiB0aGlzLmFsaWFzKGFsaWFzKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IC8gZ2V0IHRoZSBjb21tYW5kIHVzYWdlIGBzdHJgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cl1cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG5cbiAgdXNhZ2Uoc3RyKSB7XG4gICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5fdXNhZ2UpIHJldHVybiB0aGlzLl91c2FnZTtcblxuICAgICAgY29uc3QgYXJncyA9IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5tYXAoKGFyZykgPT4ge1xuICAgICAgICByZXR1cm4gaHVtYW5SZWFkYWJsZUFyZ05hbWUoYXJnKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtdXG4gICAgICAgIC5jb25jYXQoXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxlbmd0aCB8fCB0aGlzLl9oZWxwT3B0aW9uICE9PSBudWxsID8gJ1tvcHRpb25zXScgOiBbXSxcbiAgICAgICAgICB0aGlzLmNvbW1hbmRzLmxlbmd0aCA/ICdbY29tbWFuZF0nIDogW10sXG4gICAgICAgICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aCA/IGFyZ3MgOiBbXSxcbiAgICAgICAgKVxuICAgICAgICAuam9pbignICcpO1xuICAgIH1cblxuICAgIHRoaXMuX3VzYWdlID0gc3RyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cblxuICBuYW1lKHN0cikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX25hbWU7XG4gICAgdGhpcy5fbmFtZSA9IHN0cjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgZnJvbSBzY3JpcHQgZmlsZW5hbWUsIHN1Y2ggYXMgcHJvY2Vzcy5hcmd2WzFdLFxuICAgKiBvciByZXF1aXJlLm1haW4uZmlsZW5hbWUsIG9yIF9fZmlsZW5hbWUuXG4gICAqXG4gICAqIChVc2VkIGludGVybmFsbHkgYW5kIHB1YmxpYyBhbHRob3VnaCBub3QgZG9jdW1lbnRlZCBpbiBSRUFETUUuKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLm5hbWVGcm9tRmlsZW5hbWUocmVxdWlyZS5tYWluLmZpbGVuYW1lKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9XG4gICAqL1xuXG4gIG5hbWVGcm9tRmlsZW5hbWUoZmlsZW5hbWUpIHtcbiAgICB0aGlzLl9uYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgcGF0aC5leHRuYW1lKGZpbGVuYW1lKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBkaXJlY3RvcnkgZm9yIHNlYXJjaGluZyBmb3IgZXhlY3V0YWJsZSBzdWJjb21tYW5kcyBvZiB0aGlzIGNvbW1hbmQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uZXhlY3V0YWJsZURpcihfX2Rpcm5hbWUpO1xuICAgKiAvLyBvclxuICAgKiBwcm9ncmFtLmV4ZWN1dGFibGVEaXIoJ3N1YmNvbW1hbmRzJyk7XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHJldHVybiB7KHN0cmluZ3xudWxsfENvbW1hbmQpfVxuICAgKi9cblxuICBleGVjdXRhYmxlRGlyKHBhdGgpIHtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fZXhlY3V0YWJsZURpcjtcbiAgICB0aGlzLl9leGVjdXRhYmxlRGlyID0gcGF0aDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gcHJvZ3JhbSBoZWxwIGRvY3VtZW50YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7eyBlcnJvcjogYm9vbGVhbiB9fSBbY29udGV4dE9wdGlvbnNdIC0gcGFzcyB7ZXJyb3I6dHJ1ZX0gdG8gd3JhcCBmb3Igc3RkZXJyIGluc3RlYWQgb2Ygc3Rkb3V0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgaGVscEluZm9ybWF0aW9uKGNvbnRleHRPcHRpb25zKSB7XG4gICAgY29uc3QgaGVscGVyID0gdGhpcy5jcmVhdGVIZWxwKCk7XG4gICAgaWYgKGhlbHBlci5oZWxwV2lkdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVscGVyLmhlbHBXaWR0aCA9XG4gICAgICAgIGNvbnRleHRPcHRpb25zICYmIGNvbnRleHRPcHRpb25zLmVycm9yXG4gICAgICAgICAgPyB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLmdldEVyckhlbHBXaWR0aCgpXG4gICAgICAgICAgOiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLmdldE91dEhlbHBXaWR0aCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGVscGVyLmZvcm1hdEhlbHAodGhpcywgaGVscGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZ2V0SGVscENvbnRleHQoY29udGV4dE9wdGlvbnMpIHtcbiAgICBjb250ZXh0T3B0aW9ucyA9IGNvbnRleHRPcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGNvbnRleHQgPSB7IGVycm9yOiAhIWNvbnRleHRPcHRpb25zLmVycm9yIH07XG4gICAgbGV0IHdyaXRlO1xuICAgIGlmIChjb250ZXh0LmVycm9yKSB7XG4gICAgICB3cml0ZSA9IChhcmcpID0+IHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIoYXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd3JpdGUgPSAoYXJnKSA9PiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLndyaXRlT3V0KGFyZyk7XG4gICAgfVxuICAgIGNvbnRleHQud3JpdGUgPSBjb250ZXh0T3B0aW9ucy53cml0ZSB8fCB3cml0ZTtcbiAgICBjb250ZXh0LmNvbW1hbmQgPSB0aGlzO1xuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIE91dHB1dCBoZWxwIGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbW1hbmQuXG4gICAqXG4gICAqIE91dHB1dHMgYnVpbHQtaW4gaGVscCwgYW5kIGN1c3RvbSB0ZXh0IGFkZGVkIHVzaW5nIGAuYWRkSGVscFRleHQoKWAuXG4gICAqXG4gICAqIEBwYXJhbSB7eyBlcnJvcjogYm9vbGVhbiB9IHwgRnVuY3Rpb259IFtjb250ZXh0T3B0aW9uc10gLSBwYXNzIHtlcnJvcjp0cnVlfSB0byB3cml0ZSB0byBzdGRlcnIgaW5zdGVhZCBvZiBzdGRvdXRcbiAgICovXG5cbiAgb3V0cHV0SGVscChjb250ZXh0T3B0aW9ucykge1xuICAgIGxldCBkZXByZWNhdGVkQ2FsbGJhY2s7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0T3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZGVwcmVjYXRlZENhbGxiYWNrID0gY29udGV4dE9wdGlvbnM7XG4gICAgICBjb250ZXh0T3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2dldEhlbHBDb250ZXh0KGNvbnRleHRPcHRpb25zKTtcblxuICAgIHRoaXMuX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZvckVhY2goKGNvbW1hbmQpID0+IGNvbW1hbmQuZW1pdCgnYmVmb3JlQWxsSGVscCcsIGNvbnRleHQpKTtcbiAgICB0aGlzLmVtaXQoJ2JlZm9yZUhlbHAnLCBjb250ZXh0KTtcblxuICAgIGxldCBoZWxwSW5mb3JtYXRpb24gPSB0aGlzLmhlbHBJbmZvcm1hdGlvbihjb250ZXh0KTtcbiAgICBpZiAoZGVwcmVjYXRlZENhbGxiYWNrKSB7XG4gICAgICBoZWxwSW5mb3JtYXRpb24gPSBkZXByZWNhdGVkQ2FsbGJhY2soaGVscEluZm9ybWF0aW9uKTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGhlbHBJbmZvcm1hdGlvbiAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgIUJ1ZmZlci5pc0J1ZmZlcihoZWxwSW5mb3JtYXRpb24pXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvdXRwdXRIZWxwIGNhbGxiYWNrIG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIGEgQnVmZmVyJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnRleHQud3JpdGUoaGVscEluZm9ybWF0aW9uKTtcblxuICAgIGlmICh0aGlzLl9nZXRIZWxwT3B0aW9uKCk/LmxvbmcpIHtcbiAgICAgIHRoaXMuZW1pdCh0aGlzLl9nZXRIZWxwT3B0aW9uKCkubG9uZyk7IC8vIGRlcHJlY2F0ZWRcbiAgICB9XG4gICAgdGhpcy5lbWl0KCdhZnRlckhlbHAnLCBjb250ZXh0KTtcbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY29tbWFuZCkgPT5cbiAgICAgIGNvbW1hbmQuZW1pdCgnYWZ0ZXJBbGxIZWxwJywgY29udGV4dCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHBhc3MgaW4gZmxhZ3MgYW5kIGEgZGVzY3JpcHRpb24gdG8gY3VzdG9taXNlIHRoZSBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICogUGFzcyBpbiBmYWxzZSB0byBkaXNhYmxlIHRoZSBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5oZWxwT3B0aW9uKCctPywgLS1oZWxwJyAnc2hvdyBoZWxwJyk7IC8vIGN1c3RvbWlzZVxuICAgKiBwcm9ncmFtLmhlbHBPcHRpb24oZmFsc2UpOyAvLyBkaXNhYmxlXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IGJvb2xlYW4pfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaGVscE9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pIHtcbiAgICAvLyBTdXBwb3J0IGRpc2FibGluZyBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICBpZiAodHlwZW9mIGZsYWdzID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGlmIChmbGFncykge1xuICAgICAgICB0aGlzLl9oZWxwT3B0aW9uID0gdGhpcy5faGVscE9wdGlvbiA/PyB1bmRlZmluZWQ7IC8vIHByZXNlcnZlIGV4aXN0aW5nIG9wdGlvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faGVscE9wdGlvbiA9IG51bGw7IC8vIGRpc2FibGVcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEN1c3RvbWlzZSBmbGFncyBhbmQgZGVzY3JpcHRpb24uXG4gICAgZmxhZ3MgPSBmbGFncyA/PyAnLWgsIC0taGVscCc7XG4gICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiA/PyAnZGlzcGxheSBoZWxwIGZvciBjb21tYW5kJztcbiAgICB0aGlzLl9oZWxwT3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExhenkgY3JlYXRlIGhlbHAgb3B0aW9uLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgaGFzIGJlZW4gZGlzYWJsZWQgd2l0aCAuaGVscE9wdGlvbihmYWxzZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIHsoT3B0aW9uIHwgbnVsbCl9IHRoZSBoZWxwIG9wdGlvblxuICAgKiBAcGFja2FnZVxuICAgKi9cbiAgX2dldEhlbHBPcHRpb24oKSB7XG4gICAgLy8gTGF6eSBjcmVhdGUgaGVscCBvcHRpb24gb24gZGVtYW5kLlxuICAgIGlmICh0aGlzLl9oZWxwT3B0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaGVscE9wdGlvbih1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9oZWxwT3B0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1cHBseSB5b3VyIG93biBvcHRpb24gdG8gdXNlIGZvciB0aGUgYnVpbHQtaW4gaGVscCBvcHRpb24uXG4gICAqIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgaGVscE9wdGlvbigpIHRvIGN1c3RvbWlzZSB0aGUgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEhlbHBPcHRpb24ob3B0aW9uKSB7XG4gICAgdGhpcy5faGVscE9wdGlvbiA9IG9wdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBhbmQgZXhpdC5cbiAgICpcbiAgICogT3V0cHV0cyBidWlsdC1pbiBoZWxwLCBhbmQgY3VzdG9tIHRleHQgYWRkZWQgdXNpbmcgYC5hZGRIZWxwVGV4dCgpYC5cbiAgICpcbiAgICogQHBhcmFtIHt7IGVycm9yOiBib29sZWFuIH19IFtjb250ZXh0T3B0aW9uc10gLSBwYXNzIHtlcnJvcjp0cnVlfSB0byB3cml0ZSB0byBzdGRlcnIgaW5zdGVhZCBvZiBzdGRvdXRcbiAgICovXG5cbiAgaGVscChjb250ZXh0T3B0aW9ucykge1xuICAgIHRoaXMub3V0cHV0SGVscChjb250ZXh0T3B0aW9ucyk7XG4gICAgbGV0IGV4aXRDb2RlID0gcHJvY2Vzcy5leGl0Q29kZSB8fCAwO1xuICAgIGlmIChcbiAgICAgIGV4aXRDb2RlID09PSAwICYmXG4gICAgICBjb250ZXh0T3B0aW9ucyAmJlxuICAgICAgdHlwZW9mIGNvbnRleHRPcHRpb25zICE9PSAnZnVuY3Rpb24nICYmXG4gICAgICBjb250ZXh0T3B0aW9ucy5lcnJvclxuICAgICkge1xuICAgICAgZXhpdENvZGUgPSAxO1xuICAgIH1cbiAgICAvLyBtZXNzYWdlOiBkbyBub3QgaGF2ZSBhbGwgZGlzcGxheWVkIHRleHQgYXZhaWxhYmxlIHNvIG9ubHkgcGFzc2luZyBwbGFjZWhvbGRlci5cbiAgICB0aGlzLl9leGl0KGV4aXRDb2RlLCAnY29tbWFuZGVyLmhlbHAnLCAnKG91dHB1dEhlbHApJyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFkZGl0aW9uYWwgdGV4dCB0byBiZSBkaXNwbGF5ZWQgd2l0aCB0aGUgYnVpbHQtaW4gaGVscC5cbiAgICpcbiAgICogUG9zaXRpb24gaXMgJ2JlZm9yZScgb3IgJ2FmdGVyJyB0byBhZmZlY3QganVzdCB0aGlzIGNvbW1hbmQsXG4gICAqIGFuZCAnYmVmb3JlQWxsJyBvciAnYWZ0ZXJBbGwnIHRvIGFmZmVjdCB0aGlzIGNvbW1hbmQgYW5kIGFsbCBpdHMgc3ViY29tbWFuZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwb3NpdGlvbiAtIGJlZm9yZSBvciBhZnRlciBidWlsdC1pbiBoZWxwXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IEZ1bmN0aW9uKX0gdGV4dCAtIHN0cmluZyB0byBhZGQsIG9yIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgc3RyaW5nXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkSGVscFRleHQocG9zaXRpb24sIHRleHQpIHtcbiAgICBjb25zdCBhbGxvd2VkVmFsdWVzID0gWydiZWZvcmVBbGwnLCAnYmVmb3JlJywgJ2FmdGVyJywgJ2FmdGVyQWxsJ107XG4gICAgaWYgKCFhbGxvd2VkVmFsdWVzLmluY2x1ZGVzKHBvc2l0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciBwb3NpdGlvbiB0byBhZGRIZWxwVGV4dC5cbkV4cGVjdGluZyBvbmUgb2YgJyR7YWxsb3dlZFZhbHVlcy5qb2luKFwiJywgJ1wiKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGhlbHBFdmVudCA9IGAke3Bvc2l0aW9ufUhlbHBgO1xuICAgIHRoaXMub24oaGVscEV2ZW50LCAoY29udGV4dCkgPT4ge1xuICAgICAgbGV0IGhlbHBTdHI7XG4gICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGVscFN0ciA9IHRleHQoeyBlcnJvcjogY29udGV4dC5lcnJvciwgY29tbWFuZDogY29udGV4dC5jb21tYW5kIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVscFN0ciA9IHRleHQ7XG4gICAgICB9XG4gICAgICAvLyBJZ25vcmUgZmFsc3kgdmFsdWUgd2hlbiBub3RoaW5nIHRvIG91dHB1dC5cbiAgICAgIGlmIChoZWxwU3RyKSB7XG4gICAgICAgIGNvbnRleHQud3JpdGUoYCR7aGVscFN0cn1cXG5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBpZiBoZWxwIGZsYWdzIHNwZWNpZmllZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIC0gYXJyYXkgb2Ygb3B0aW9ucyB0byBzZWFyY2ggZm9yIGhlbHAgZmxhZ3NcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX291dHB1dEhlbHBJZlJlcXVlc3RlZChhcmdzKSB7XG4gICAgY29uc3QgaGVscE9wdGlvbiA9IHRoaXMuX2dldEhlbHBPcHRpb24oKTtcbiAgICBjb25zdCBoZWxwUmVxdWVzdGVkID0gaGVscE9wdGlvbiAmJiBhcmdzLmZpbmQoKGFyZykgPT4gaGVscE9wdGlvbi5pcyhhcmcpKTtcbiAgICBpZiAoaGVscFJlcXVlc3RlZCkge1xuICAgICAgdGhpcy5vdXRwdXRIZWxwKCk7XG4gICAgICAvLyAoRG8gbm90IGhhdmUgYWxsIGRpc3BsYXllZCB0ZXh0IGF2YWlsYWJsZSBzbyBvbmx5IHBhc3NpbmcgcGxhY2Vob2xkZXIuKVxuICAgICAgdGhpcy5fZXhpdCgwLCAnY29tbWFuZGVyLmhlbHBEaXNwbGF5ZWQnLCAnKG91dHB1dEhlbHApJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU2NhbiBhcmd1bWVudHMgYW5kIGluY3JlbWVudCBwb3J0IG51bWJlciBmb3IgaW5zcGVjdCBjYWxscyAodG8gYXZvaWQgY29uZmxpY3RzIHdoZW4gc3Bhd25pbmcgbmV3IGNvbW1hbmQpLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MgLSBhcnJheSBvZiBhcmd1bWVudHMgZnJvbSBub2RlLmV4ZWNBcmd2XG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGluY3JlbWVudE5vZGVJbnNwZWN0b3JQb3J0KGFyZ3MpIHtcbiAgLy8gVGVzdGluZyBmb3IgdGhlc2Ugb3B0aW9uczpcbiAgLy8gIC0taW5zcGVjdFs9W2hvc3Q6XXBvcnRdXG4gIC8vICAtLWluc3BlY3QtYnJrWz1baG9zdDpdcG9ydF1cbiAgLy8gIC0taW5zcGVjdC1wb3J0PVtob3N0Ol1wb3J0XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiB7XG4gICAgaWYgKCFhcmcuc3RhcnRzV2l0aCgnLS1pbnNwZWN0JykpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIGxldCBkZWJ1Z09wdGlvbjtcbiAgICBsZXQgZGVidWdIb3N0ID0gJzEyNy4wLjAuMSc7XG4gICAgbGV0IGRlYnVnUG9ydCA9ICc5MjI5JztcbiAgICBsZXQgbWF0Y2g7XG4gICAgaWYgKChtYXRjaCA9IGFyZy5tYXRjaCgvXigtLWluc3BlY3QoLWJyayk/KSQvKSkgIT09IG51bGwpIHtcbiAgICAgIC8vIGUuZy4gLS1pbnNwZWN0XG4gICAgICBkZWJ1Z09wdGlvbiA9IG1hdGNoWzFdO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAobWF0Y2ggPSBhcmcubWF0Y2goL14oLS1pbnNwZWN0KC1icmt8LXBvcnQpPyk9KFteOl0rKSQvKSkgIT09IG51bGxcbiAgICApIHtcbiAgICAgIGRlYnVnT3B0aW9uID0gbWF0Y2hbMV07XG4gICAgICBpZiAoL15cXGQrJC8udGVzdChtYXRjaFszXSkpIHtcbiAgICAgICAgLy8gZS5nLiAtLWluc3BlY3Q9MTIzNFxuICAgICAgICBkZWJ1Z1BvcnQgPSBtYXRjaFszXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGUuZy4gLS1pbnNwZWN0PWxvY2FsaG9zdFxuICAgICAgICBkZWJ1Z0hvc3QgPSBtYXRjaFszXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKG1hdGNoID0gYXJnLm1hdGNoKC9eKC0taW5zcGVjdCgtYnJrfC1wb3J0KT8pPShbXjpdKyk6KFxcZCspJC8pKSAhPT0gbnVsbFxuICAgICkge1xuICAgICAgLy8gZS5nLiAtLWluc3BlY3Q9bG9jYWxob3N0OjEyMzRcbiAgICAgIGRlYnVnT3B0aW9uID0gbWF0Y2hbMV07XG4gICAgICBkZWJ1Z0hvc3QgPSBtYXRjaFszXTtcbiAgICAgIGRlYnVnUG9ydCA9IG1hdGNoWzRdO1xuICAgIH1cblxuICAgIGlmIChkZWJ1Z09wdGlvbiAmJiBkZWJ1Z1BvcnQgIT09ICcwJykge1xuICAgICAgcmV0dXJuIGAke2RlYnVnT3B0aW9ufT0ke2RlYnVnSG9zdH06JHtwYXJzZUludChkZWJ1Z1BvcnQpICsgMX1gO1xuICAgIH1cbiAgICByZXR1cm4gYXJnO1xuICB9KTtcbn1cblxuZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDtcbiIsIi8qKlxuICogQ29tbWFuZGVyRXJyb3IgY2xhc3NcbiAqL1xuY2xhc3MgQ29tbWFuZGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHRoZSBDb21tYW5kZXJFcnJvciBjbGFzc1xuICAgKiBAcGFyYW0ge251bWJlcn0gZXhpdENvZGUgc3VnZ2VzdGVkIGV4aXQgY29kZSB3aGljaCBjb3VsZCBiZSB1c2VkIHdpdGggcHJvY2Vzcy5leGl0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIGFuIGlkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGVycm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvclxuICAgKi9cbiAgY29uc3RydWN0b3IoZXhpdENvZGUsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAvLyBwcm9wZXJseSBjYXB0dXJlIHN0YWNrIHRyYWNlIGluIE5vZGUuanNcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLmV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgdGhpcy5uZXN0ZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEludmFsaWRBcmd1bWVudEVycm9yIGNsYXNzXG4gKi9cbmNsYXNzIEludmFsaWRBcmd1bWVudEVycm9yIGV4dGVuZHMgQ29tbWFuZGVyRXJyb3Ige1xuICAvKipcbiAgICogQ29uc3RydWN0cyB0aGUgSW52YWxpZEFyZ3VtZW50RXJyb3IgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBleHBsYW5hdGlvbiBvZiB3aHkgYXJndW1lbnQgaXMgaW52YWxpZFxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKDEsICdjb21tYW5kZXIuaW52YWxpZEFyZ3VtZW50JywgbWVzc2FnZSk7XG4gICAgLy8gcHJvcGVybHkgY2FwdHVyZSBzdGFjayB0cmFjZSBpbiBOb2RlLmpzXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG59XG5cbmV4cG9ydHMuQ29tbWFuZGVyRXJyb3IgPSBDb21tYW5kZXJFcnJvcjtcbmV4cG9ydHMuSW52YWxpZEFyZ3VtZW50RXJyb3IgPSBJbnZhbGlkQXJndW1lbnRFcnJvcjtcbiIsImNvbnN0IHsgaHVtYW5SZWFkYWJsZUFyZ05hbWUgfSA9IHJlcXVpcmUoJy4vYXJndW1lbnQuanMnKTtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IGltcG9ydCB0eXBlcyBmb3IgSlNEb2MsIHVzZWQgYnkgVmlzdWFsIFN0dWRpbyBDb2RlIEludGVsbGlTZW5zZSBhbmQgYG5wbSBydW4gdHlwZXNjcmlwdC1jaGVja0pTYFxuICogaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svanNkb2Mtc3VwcG9ydGVkLXR5cGVzLmh0bWwjaW1wb3J0LXR5cGVzXG4gKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vYXJndW1lbnQuanNcIikuQXJndW1lbnQgfSBBcmd1bWVudFxuICogQHR5cGVkZWYgeyBpbXBvcnQoXCIuL2NvbW1hbmQuanNcIikuQ29tbWFuZCB9IENvbW1hbmRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KFwiLi9vcHRpb24uanNcIikuT3B0aW9uIH0gT3B0aW9uXG4gKi9cblxuLy8gQWx0aG91Z2ggdGhpcyBpcyBhIGNsYXNzLCBtZXRob2RzIGFyZSBzdGF0aWMgaW4gc3R5bGUgdG8gYWxsb3cgb3ZlcnJpZGUgdXNpbmcgc3ViY2xhc3Mgb3IganVzdCBmdW5jdGlvbnMuXG5jbGFzcyBIZWxwIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oZWxwV2lkdGggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zb3J0U3ViY29tbWFuZHMgPSBmYWxzZTtcbiAgICB0aGlzLnNvcnRPcHRpb25zID0gZmFsc2U7XG4gICAgdGhpcy5zaG93R2xvYmFsT3B0aW9ucyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiB0aGUgdmlzaWJsZSBzdWJjb21tYW5kcy4gSW5jbHVkZXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGltcGxpY2l0IGhlbHAgY29tbWFuZCwgaWYgdGhlcmUgaXMgb25lLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7Q29tbWFuZFtdfVxuICAgKi9cblxuICB2aXNpYmxlQ29tbWFuZHMoY21kKSB7XG4gICAgY29uc3QgdmlzaWJsZUNvbW1hbmRzID0gY21kLmNvbW1hbmRzLmZpbHRlcigoY21kKSA9PiAhY21kLl9oaWRkZW4pO1xuICAgIGNvbnN0IGhlbHBDb21tYW5kID0gY21kLl9nZXRIZWxwQ29tbWFuZCgpO1xuICAgIGlmIChoZWxwQ29tbWFuZCAmJiAhaGVscENvbW1hbmQuX2hpZGRlbikge1xuICAgICAgdmlzaWJsZUNvbW1hbmRzLnB1c2goaGVscENvbW1hbmQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0U3ViY29tbWFuZHMpIHtcbiAgICAgIHZpc2libGVDb21tYW5kcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2Ugb3ZlcmxvYWRlZCByZXR1cm4gdHlwZVxuICAgICAgICByZXR1cm4gYS5uYW1lKCkubG9jYWxlQ29tcGFyZShiLm5hbWUoKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZpc2libGVDb21tYW5kcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIG9wdGlvbnMgZm9yIHNvcnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBhXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBiXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBjb21wYXJlT3B0aW9ucyhhLCBiKSB7XG4gICAgY29uc3QgZ2V0U29ydEtleSA9IChvcHRpb24pID0+IHtcbiAgICAgIC8vIFdZU0lXWUcgZm9yIG9yZGVyIGRpc3BsYXllZCBpbiBoZWxwLiBTaG9ydCB1c2VkIGZvciBjb21wYXJpc29uIGlmIHByZXNlbnQuIE5vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG5lZ2F0ZWQuXG4gICAgICByZXR1cm4gb3B0aW9uLnNob3J0XG4gICAgICAgID8gb3B0aW9uLnNob3J0LnJlcGxhY2UoL14tLywgJycpXG4gICAgICAgIDogb3B0aW9uLmxvbmcucmVwbGFjZSgvXi0tLywgJycpO1xuICAgIH07XG4gICAgcmV0dXJuIGdldFNvcnRLZXkoYSkubG9jYWxlQ29tcGFyZShnZXRTb3J0S2V5KGIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIHZpc2libGUgb3B0aW9ucy4gSW5jbHVkZXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGltcGxpY2l0IGhlbHAgb3B0aW9uLCBpZiB0aGVyZSBpcyBvbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtPcHRpb25bXX1cbiAgICovXG5cbiAgdmlzaWJsZU9wdGlvbnMoY21kKSB7XG4gICAgY29uc3QgdmlzaWJsZU9wdGlvbnMgPSBjbWQub3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5oaWRkZW4pO1xuICAgIC8vIEJ1aWx0LWluIGhlbHAgb3B0aW9uLlxuICAgIGNvbnN0IGhlbHBPcHRpb24gPSBjbWQuX2dldEhlbHBPcHRpb24oKTtcbiAgICBpZiAoaGVscE9wdGlvbiAmJiAhaGVscE9wdGlvbi5oaWRkZW4pIHtcbiAgICAgIC8vIEF1dG9tYXRpY2FsbHkgaGlkZSBjb25mbGljdGluZyBmbGFncy4gQml0IGR1YmlvdXMgYnV0IGEgaGlzdG9yaWNhbCBiZWhhdmlvdXIgdGhhdCBpcyBjb252ZW5pZW50IGZvciBzaW5nbGUtY29tbWFuZCBwcm9ncmFtcy5cbiAgICAgIGNvbnN0IHJlbW92ZVNob3J0ID0gaGVscE9wdGlvbi5zaG9ydCAmJiBjbWQuX2ZpbmRPcHRpb24oaGVscE9wdGlvbi5zaG9ydCk7XG4gICAgICBjb25zdCByZW1vdmVMb25nID0gaGVscE9wdGlvbi5sb25nICYmIGNtZC5fZmluZE9wdGlvbihoZWxwT3B0aW9uLmxvbmcpO1xuICAgICAgaWYgKCFyZW1vdmVTaG9ydCAmJiAhcmVtb3ZlTG9uZykge1xuICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKGhlbHBPcHRpb24pOyAvLyBubyBjaGFuZ2VzIG5lZWRlZFxuICAgICAgfSBlbHNlIGlmIChoZWxwT3B0aW9uLmxvbmcgJiYgIXJlbW92ZUxvbmcpIHtcbiAgICAgICAgdmlzaWJsZU9wdGlvbnMucHVzaChcbiAgICAgICAgICBjbWQuY3JlYXRlT3B0aW9uKGhlbHBPcHRpb24ubG9uZywgaGVscE9wdGlvbi5kZXNjcmlwdGlvbiksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGhlbHBPcHRpb24uc2hvcnQgJiYgIXJlbW92ZVNob3J0KSB7XG4gICAgICAgIHZpc2libGVPcHRpb25zLnB1c2goXG4gICAgICAgICAgY21kLmNyZWF0ZU9wdGlvbihoZWxwT3B0aW9uLnNob3J0LCBoZWxwT3B0aW9uLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydE9wdGlvbnMpIHtcbiAgICAgIHZpc2libGVPcHRpb25zLnNvcnQodGhpcy5jb21wYXJlT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB2aXNpYmxlT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIHZpc2libGUgZ2xvYmFsIG9wdGlvbnMuIChOb3QgaW5jbHVkaW5nIGhlbHAuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7T3B0aW9uW119XG4gICAqL1xuXG4gIHZpc2libGVHbG9iYWxPcHRpb25zKGNtZCkge1xuICAgIGlmICghdGhpcy5zaG93R2xvYmFsT3B0aW9ucykgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgZ2xvYmFsT3B0aW9ucyA9IFtdO1xuICAgIGZvciAoXG4gICAgICBsZXQgYW5jZXN0b3JDbWQgPSBjbWQucGFyZW50O1xuICAgICAgYW5jZXN0b3JDbWQ7XG4gICAgICBhbmNlc3RvckNtZCA9IGFuY2VzdG9yQ21kLnBhcmVudFxuICAgICkge1xuICAgICAgY29uc3QgdmlzaWJsZU9wdGlvbnMgPSBhbmNlc3RvckNtZC5vcHRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wdGlvbikgPT4gIW9wdGlvbi5oaWRkZW4sXG4gICAgICApO1xuICAgICAgZ2xvYmFsT3B0aW9ucy5wdXNoKC4uLnZpc2libGVPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydE9wdGlvbnMpIHtcbiAgICAgIGdsb2JhbE9wdGlvbnMuc29ydCh0aGlzLmNvbXBhcmVPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbE9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IG9mIHRoZSBhcmd1bWVudHMgaWYgYW55IGhhdmUgYSBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge0FyZ3VtZW50W119XG4gICAqL1xuXG4gIHZpc2libGVBcmd1bWVudHMoY21kKSB7XG4gICAgLy8gU2lkZSBlZmZlY3QhIEFwcGx5IHRoZSBsZWdhY3kgZGVzY3JpcHRpb25zIGJlZm9yZSB0aGUgYXJndW1lbnRzIGFyZSBkaXNwbGF5ZWQuXG4gICAgaWYgKGNtZC5fYXJnc0Rlc2NyaXB0aW9uKSB7XG4gICAgICBjbWQucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChhcmd1bWVudCkgPT4ge1xuICAgICAgICBhcmd1bWVudC5kZXNjcmlwdGlvbiA9XG4gICAgICAgICAgYXJndW1lbnQuZGVzY3JpcHRpb24gfHwgY21kLl9hcmdzRGVzY3JpcHRpb25bYXJndW1lbnQubmFtZSgpXSB8fCAnJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgYXJndW1lbnRzIHdpdGggYSBkZXNjcmlwdGlvbiB0aGVuIHJldHVybiBhbGwgdGhlIGFyZ3VtZW50cy5cbiAgICBpZiAoY21kLnJlZ2lzdGVyZWRBcmd1bWVudHMuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50LmRlc2NyaXB0aW9uKSkge1xuICAgICAgcmV0dXJuIGNtZC5yZWdpc3RlcmVkQXJndW1lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb21tYW5kIHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgc3ViY29tbWFuZFRlcm0oY21kKSB7XG4gICAgLy8gTGVnYWN5LiBJZ25vcmVzIGN1c3RvbSB1c2FnZSBzdHJpbmcsIGFuZCBuZXN0ZWQgY29tbWFuZHMuXG4gICAgY29uc3QgYXJncyA9IGNtZC5yZWdpc3RlcmVkQXJndW1lbnRzXG4gICAgICAubWFwKChhcmcpID0+IGh1bWFuUmVhZGFibGVBcmdOYW1lKGFyZykpXG4gICAgICAuam9pbignICcpO1xuICAgIHJldHVybiAoXG4gICAgICBjbWQuX25hbWUgK1xuICAgICAgKGNtZC5fYWxpYXNlc1swXSA/ICd8JyArIGNtZC5fYWxpYXNlc1swXSA6ICcnKSArXG4gICAgICAoY21kLm9wdGlvbnMubGVuZ3RoID8gJyBbb3B0aW9uc10nIDogJycpICsgLy8gc2ltcGxpc3RpYyBjaGVjayBmb3Igbm9uLWhlbHAgb3B0aW9uXG4gICAgICAoYXJncyA/ICcgJyArIGFyZ3MgOiAnJylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3B0aW9uIHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIG9wdGlvblRlcm0ob3B0aW9uKSB7XG4gICAgcmV0dXJuIG9wdGlvbi5mbGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFyZ3VtZW50IHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIGFyZ3VtZW50VGVybShhcmd1bWVudCkge1xuICAgIHJldHVybiBhcmd1bWVudC5uYW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb25nZXN0IGNvbW1hbmQgdGVybSBsZW5ndGguXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG4gIGxvbmdlc3RTdWJjb21tYW5kVGVybUxlbmd0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBoZWxwZXIudmlzaWJsZUNvbW1hbmRzKGNtZCkucmVkdWNlKChtYXgsIGNvbW1hbmQpID0+IHtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIGhlbHBlci5zdWJjb21tYW5kVGVybShjb21tYW5kKS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZ2VzdCBvcHRpb24gdGVybSBsZW5ndGguXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG4gIGxvbmdlc3RPcHRpb25UZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSB7XG4gICAgcmV0dXJuIGhlbHBlci52aXNpYmxlT3B0aW9ucyhjbWQpLnJlZHVjZSgobWF4LCBvcHRpb24pID0+IHtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIGhlbHBlci5vcHRpb25UZXJtKG9wdGlvbikubGVuZ3RoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmdlc3QgZ2xvYmFsIG9wdGlvbiB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdEdsb2JhbE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gaGVscGVyLnZpc2libGVHbG9iYWxPcHRpb25zKGNtZCkucmVkdWNlKChtYXgsIG9wdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLm9wdGlvblRlcm0ob3B0aW9uKS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZ2VzdCBhcmd1bWVudCB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdEFyZ3VtZW50VGVybUxlbmd0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBoZWxwZXIudmlzaWJsZUFyZ3VtZW50cyhjbWQpLnJlZHVjZSgobWF4LCBhcmd1bWVudCkgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLmFyZ3VtZW50VGVybShhcmd1bWVudCkubGVuZ3RoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbW1hbmQgdXNhZ2UgdG8gYmUgZGlzcGxheWVkIGF0IHRoZSB0b3Agb2YgdGhlIGJ1aWx0LWluIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIGNvbW1hbmRVc2FnZShjbWQpIHtcbiAgICAvLyBVc2FnZVxuICAgIGxldCBjbWROYW1lID0gY21kLl9uYW1lO1xuICAgIGlmIChjbWQuX2FsaWFzZXNbMF0pIHtcbiAgICAgIGNtZE5hbWUgPSBjbWROYW1lICsgJ3wnICsgY21kLl9hbGlhc2VzWzBdO1xuICAgIH1cbiAgICBsZXQgYW5jZXN0b3JDbWROYW1lcyA9ICcnO1xuICAgIGZvciAoXG4gICAgICBsZXQgYW5jZXN0b3JDbWQgPSBjbWQucGFyZW50O1xuICAgICAgYW5jZXN0b3JDbWQ7XG4gICAgICBhbmNlc3RvckNtZCA9IGFuY2VzdG9yQ21kLnBhcmVudFxuICAgICkge1xuICAgICAgYW5jZXN0b3JDbWROYW1lcyA9IGFuY2VzdG9yQ21kLm5hbWUoKSArICcgJyArIGFuY2VzdG9yQ21kTmFtZXM7XG4gICAgfVxuICAgIHJldHVybiBhbmNlc3RvckNtZE5hbWVzICsgY21kTmFtZSArICcgJyArIGNtZC51c2FnZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBjb21tYW5kRGVzY3JpcHRpb24oY21kKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBvdmVybG9hZGVkIHJldHVybiB0eXBlXG4gICAgcmV0dXJuIGNtZC5kZXNjcmlwdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3ViY29tbWFuZCBzdW1tYXJ5IHRvIHNob3cgaW4gdGhlIGxpc3Qgb2Ygc3ViY29tbWFuZHMuXG4gICAqIChGYWxsYmFjayB0byBkZXNjcmlwdGlvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBzdWJjb21tYW5kRGVzY3JpcHRpb24oY21kKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBvdmVybG9hZGVkIHJldHVybiB0eXBlXG4gICAgcmV0dXJuIGNtZC5zdW1tYXJ5KCkgfHwgY21kLmRlc2NyaXB0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvcHRpb24gZGVzY3JpcHRpb24gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgb3B0aW9uRGVzY3JpcHRpb24ob3B0aW9uKSB7XG4gICAgY29uc3QgZXh0cmFJbmZvID0gW107XG5cbiAgICBpZiAob3B0aW9uLmFyZ0Nob2ljZXMpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKFxuICAgICAgICAvLyB1c2Ugc3RyaW5naWZ5IHRvIG1hdGNoIHRoZSBkaXNwbGF5IG9mIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIGBjaG9pY2VzOiAke29wdGlvbi5hcmdDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiBKU09OLnN0cmluZ2lmeShjaG9pY2UpKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9uLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBkZWZhdWx0IGZvciBib29sZWFuIGFuZCBuZWdhdGVkIG1vcmUgZm9yIHByb2dyYW1tZXIgdGhhbiBlbmQgdXNlcixcbiAgICAgIC8vIGJ1dCBzaG93IHRydWUvZmFsc2UgZm9yIGJvb2xlYW4gb3B0aW9uIGFzIG1heSBiZSBmb3IgaGFuZC1yb2xsZWQgZW52IG9yIGNvbmZpZyBwcm9jZXNzaW5nLlxuICAgICAgY29uc3Qgc2hvd0RlZmF1bHQgPVxuICAgICAgICBvcHRpb24ucmVxdWlyZWQgfHxcbiAgICAgICAgb3B0aW9uLm9wdGlvbmFsIHx8XG4gICAgICAgIChvcHRpb24uaXNCb29sZWFuKCkgJiYgdHlwZW9mIG9wdGlvbi5kZWZhdWx0VmFsdWUgPT09ICdib29sZWFuJyk7XG4gICAgICBpZiAoc2hvd0RlZmF1bHQpIHtcbiAgICAgICAgZXh0cmFJbmZvLnB1c2goXG4gICAgICAgICAgYGRlZmF1bHQ6ICR7b3B0aW9uLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uIHx8IEpTT04uc3RyaW5naWZ5KG9wdGlvbi5kZWZhdWx0VmFsdWUpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHByZXNldCBmb3IgYm9vbGVhbiBhbmQgbmVnYXRlZCBhcmUgbW9yZSBmb3IgcHJvZ3JhbW1lciB0aGFuIGVuZCB1c2VyXG4gICAgaWYgKG9wdGlvbi5wcmVzZXRBcmcgIT09IHVuZGVmaW5lZCAmJiBvcHRpb24ub3B0aW9uYWwpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKGBwcmVzZXQ6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9uLnByZXNldEFyZyl9YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb24uZW52VmFyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKGBlbnY6ICR7b3B0aW9uLmVudlZhcn1gKTtcbiAgICB9XG4gICAgaWYgKGV4dHJhSW5mby5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYCR7b3B0aW9uLmRlc2NyaXB0aW9ufSAoJHtleHRyYUluZm8uam9pbignLCAnKX0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9uLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXJndW1lbnQgZGVzY3JpcHRpb24gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgYXJndW1lbnREZXNjcmlwdGlvbihhcmd1bWVudCkge1xuICAgIGNvbnN0IGV4dHJhSW5mbyA9IFtdO1xuICAgIGlmIChhcmd1bWVudC5hcmdDaG9pY2VzKSB7XG4gICAgICBleHRyYUluZm8ucHVzaChcbiAgICAgICAgLy8gdXNlIHN0cmluZ2lmeSB0byBtYXRjaCB0aGUgZGlzcGxheSBvZiB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgICAgICBgY2hvaWNlczogJHthcmd1bWVudC5hcmdDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiBKU09OLnN0cmluZ2lmeShjaG9pY2UpKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXJndW1lbnQuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKFxuICAgICAgICBgZGVmYXVsdDogJHthcmd1bWVudC5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiB8fCBKU09OLnN0cmluZ2lmeShhcmd1bWVudC5kZWZhdWx0VmFsdWUpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZXh0cmFJbmZvLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4dHJhRGVzY3JpcHRvbiA9IGAoJHtleHRyYUluZm8uam9pbignLCAnKX0pYDtcbiAgICAgIGlmIChhcmd1bWVudC5kZXNjcmlwdGlvbikge1xuICAgICAgICByZXR1cm4gYCR7YXJndW1lbnQuZGVzY3JpcHRpb259ICR7ZXh0cmFEZXNjcmlwdG9ufWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXh0cmFEZXNjcmlwdG9uO1xuICAgIH1cbiAgICByZXR1cm4gYXJndW1lbnQuZGVzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGhlIGJ1aWx0LWluIGhlbHAgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgZm9ybWF0SGVscChjbWQsIGhlbHBlcikge1xuICAgIGNvbnN0IHRlcm1XaWR0aCA9IGhlbHBlci5wYWRXaWR0aChjbWQsIGhlbHBlcik7XG4gICAgY29uc3QgaGVscFdpZHRoID0gaGVscGVyLmhlbHBXaWR0aCB8fCA4MDtcbiAgICBjb25zdCBpdGVtSW5kZW50V2lkdGggPSAyO1xuICAgIGNvbnN0IGl0ZW1TZXBhcmF0b3JXaWR0aCA9IDI7IC8vIGJldHdlZW4gdGVybSBhbmQgZGVzY3JpcHRpb25cbiAgICBmdW5jdGlvbiBmb3JtYXRJdGVtKHRlcm0sIGRlc2NyaXB0aW9uKSB7XG4gICAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgZnVsbFRleHQgPSBgJHt0ZXJtLnBhZEVuZCh0ZXJtV2lkdGggKyBpdGVtU2VwYXJhdG9yV2lkdGgpfSR7ZGVzY3JpcHRpb259YDtcbiAgICAgICAgcmV0dXJuIGhlbHBlci53cmFwKFxuICAgICAgICAgIGZ1bGxUZXh0LFxuICAgICAgICAgIGhlbHBXaWR0aCAtIGl0ZW1JbmRlbnRXaWR0aCxcbiAgICAgICAgICB0ZXJtV2lkdGggKyBpdGVtU2VwYXJhdG9yV2lkdGgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVybTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZm9ybWF0TGlzdCh0ZXh0QXJyYXkpIHtcbiAgICAgIHJldHVybiB0ZXh0QXJyYXkuam9pbignXFxuJykucmVwbGFjZSgvXi9nbSwgJyAnLnJlcGVhdChpdGVtSW5kZW50V2lkdGgpKTtcbiAgICB9XG5cbiAgICAvLyBVc2FnZVxuICAgIGxldCBvdXRwdXQgPSBbYFVzYWdlOiAke2hlbHBlci5jb21tYW5kVXNhZ2UoY21kKX1gLCAnJ107XG5cbiAgICAvLyBEZXNjcmlwdGlvblxuICAgIGNvbnN0IGNvbW1hbmREZXNjcmlwdGlvbiA9IGhlbHBlci5jb21tYW5kRGVzY3JpcHRpb24oY21kKTtcbiAgICBpZiAoY29tbWFuZERlc2NyaXB0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoW1xuICAgICAgICBoZWxwZXIud3JhcChjb21tYW5kRGVzY3JpcHRpb24sIGhlbHBXaWR0aCwgMCksXG4gICAgICAgICcnLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gQXJndW1lbnRzXG4gICAgY29uc3QgYXJndW1lbnRMaXN0ID0gaGVscGVyLnZpc2libGVBcmd1bWVudHMoY21kKS5tYXAoKGFyZ3VtZW50KSA9PiB7XG4gICAgICByZXR1cm4gZm9ybWF0SXRlbShcbiAgICAgICAgaGVscGVyLmFyZ3VtZW50VGVybShhcmd1bWVudCksXG4gICAgICAgIGhlbHBlci5hcmd1bWVudERlc2NyaXB0aW9uKGFyZ3VtZW50KSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGFyZ3VtZW50TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBvdXRwdXQgPSBvdXRwdXQuY29uY2F0KFsnQXJndW1lbnRzOicsIGZvcm1hdExpc3QoYXJndW1lbnRMaXN0KSwgJyddKTtcbiAgICB9XG5cbiAgICAvLyBPcHRpb25zXG4gICAgY29uc3Qgb3B0aW9uTGlzdCA9IGhlbHBlci52aXNpYmxlT3B0aW9ucyhjbWQpLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gZm9ybWF0SXRlbShcbiAgICAgICAgaGVscGVyLm9wdGlvblRlcm0ob3B0aW9uKSxcbiAgICAgICAgaGVscGVyLm9wdGlvbkRlc2NyaXB0aW9uKG9wdGlvbiksXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChvcHRpb25MaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoWydPcHRpb25zOicsIGZvcm1hdExpc3Qob3B0aW9uTGlzdCksICcnXSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvd0dsb2JhbE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGdsb2JhbE9wdGlvbkxpc3QgPSBoZWxwZXJcbiAgICAgICAgLnZpc2libGVHbG9iYWxPcHRpb25zKGNtZClcbiAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdEl0ZW0oXG4gICAgICAgICAgICBoZWxwZXIub3B0aW9uVGVybShvcHRpb24pLFxuICAgICAgICAgICAgaGVscGVyLm9wdGlvbkRlc2NyaXB0aW9uKG9wdGlvbiksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAoZ2xvYmFsT3B0aW9uTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoW1xuICAgICAgICAgICdHbG9iYWwgT3B0aW9uczonLFxuICAgICAgICAgIGZvcm1hdExpc3QoZ2xvYmFsT3B0aW9uTGlzdCksXG4gICAgICAgICAgJycsXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbW1hbmRzXG4gICAgY29uc3QgY29tbWFuZExpc3QgPSBoZWxwZXIudmlzaWJsZUNvbW1hbmRzKGNtZCkubWFwKChjbWQpID0+IHtcbiAgICAgIHJldHVybiBmb3JtYXRJdGVtKFxuICAgICAgICBoZWxwZXIuc3ViY29tbWFuZFRlcm0oY21kKSxcbiAgICAgICAgaGVscGVyLnN1YmNvbW1hbmREZXNjcmlwdGlvbihjbWQpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAoY29tbWFuZExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChbJ0NvbW1hbmRzOicsIGZvcm1hdExpc3QoY29tbWFuZExpc3QpLCAnJ10pO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBwYWQgd2lkdGggZnJvbSB0aGUgbWF4aW11bSB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgcGFkV2lkdGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoXG4gICAgICBoZWxwZXIubG9uZ2VzdE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICAgaGVscGVyLmxvbmdlc3RHbG9iYWxPcHRpb25UZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSxcbiAgICAgIGhlbHBlci5sb25nZXN0U3ViY29tbWFuZFRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICAgaGVscGVyLmxvbmdlc3RBcmd1bWVudFRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHdpZHRoIGNoYXJhY3RlcnMgcGVyIGxpbmUsIHdpdGggbGluZXMgYWZ0ZXIgdGhlIGZpcnN0IGluZGVudGVkLlxuICAgKiBEbyBub3Qgd3JhcCBpZiBpbnN1ZmZpY2llbnQgcm9vbSBmb3Igd3JhcHBpbmcgKG1pbkNvbHVtbldpZHRoKSwgb3Igc3RyaW5nIGlzIG1hbnVhbGx5IGZvcm1hdHRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGVudFxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbkNvbHVtbldpZHRoPTQwXVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqXG4gICAqL1xuXG4gIHdyYXAoc3RyLCB3aWR0aCwgaW5kZW50LCBtaW5Db2x1bW5XaWR0aCA9IDQwKSB7XG4gICAgLy8gRnVsbCBcXHMgY2hhcmFjdGVycywgbWludXMgdGhlIGxpbmVmZWVkcy5cbiAgICBjb25zdCBpbmRlbnRzID1cbiAgICAgICcgXFxcXGZcXFxcdFxcXFx2XFx1MDBhMFxcdTE2ODBcXHUyMDAwLVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDBcXHVmZWZmJztcbiAgICAvLyBEZXRlY3QgbWFudWFsbHkgd3JhcHBlZCBhbmQgaW5kZW50ZWQgc3RyaW5ncyBieSBzZWFyY2hpbmcgZm9yIGxpbmUgYnJlYWsgZm9sbG93ZWQgYnkgc3BhY2VzLlxuICAgIGNvbnN0IG1hbnVhbEluZGVudCA9IG5ldyBSZWdFeHAoYFtcXFxcbl1bJHtpbmRlbnRzfV0rYCk7XG4gICAgaWYgKHN0ci5tYXRjaChtYW51YWxJbmRlbnQpKSByZXR1cm4gc3RyO1xuICAgIC8vIERvIG5vdCB3cmFwIGlmIG5vdCBlbm91Z2ggcm9vbSBmb3IgYSB3cmFwcGVkIGNvbHVtbiBvZiB0ZXh0IChhcyBjb3VsZCBlbmQgdXAgd2l0aCBhIHdvcmQgcGVyIGxpbmUpLlxuICAgIGNvbnN0IGNvbHVtbldpZHRoID0gd2lkdGggLSBpbmRlbnQ7XG4gICAgaWYgKGNvbHVtbldpZHRoIDwgbWluQ29sdW1uV2lkdGgpIHJldHVybiBzdHI7XG5cbiAgICBjb25zdCBsZWFkaW5nU3RyID0gc3RyLnNsaWNlKDAsIGluZGVudCk7XG4gICAgY29uc3QgY29sdW1uVGV4dCA9IHN0ci5zbGljZShpbmRlbnQpLnJlcGxhY2UoJ1xcclxcbicsICdcXG4nKTtcbiAgICBjb25zdCBpbmRlbnRTdHJpbmcgPSAnICcucmVwZWF0KGluZGVudCk7XG4gICAgY29uc3QgemVyb1dpZHRoU3BhY2UgPSAnXFx1MjAwQic7XG4gICAgY29uc3QgYnJlYWtzID0gYFxcXFxzJHt6ZXJvV2lkdGhTcGFjZX1gO1xuICAgIC8vIE1hdGNoIGxpbmUgZW5kIChzbyBlbXB0eSBsaW5lcyBkb24ndCBjb2xsYXBzZSksXG4gICAgLy8gb3IgYXMgbXVjaCB0ZXh0IGFzIHdpbGwgZml0IGluIGNvbHVtbiwgb3IgZXhjZXNzIHRleHQgdXAgdG8gZmlyc3QgYnJlYWsuXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgYFxcbnwuezEsJHtjb2x1bW5XaWR0aCAtIDF9fShbJHticmVha3N9XXwkKXxbXiR7YnJlYWtzfV0rPyhbJHticmVha3N9XXwkKWAsXG4gICAgICAnZycsXG4gICAgKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbHVtblRleHQubWF0Y2gocmVnZXgpIHx8IFtdO1xuICAgIHJldHVybiAoXG4gICAgICBsZWFkaW5nU3RyICtcbiAgICAgIGxpbmVzXG4gICAgICAgIC5tYXAoKGxpbmUsIGkpID0+IHtcbiAgICAgICAgICBpZiAobGluZSA9PT0gJ1xcbicpIHJldHVybiAnJzsgLy8gcHJlc2VydmUgZW1wdHkgbGluZXNcbiAgICAgICAgICByZXR1cm4gKGkgPiAwID8gaW5kZW50U3RyaW5nIDogJycpICsgbGluZS50cmltRW5kKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0cy5IZWxwID0gSGVscDtcbiIsImNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3IuanMnKTtcblxuY2xhc3MgT3B0aW9uIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgYE9wdGlvbmAgd2l0aCB0aGUgZ2l2ZW4gYGZsYWdzYCBhbmQgYGRlc2NyaXB0aW9uYC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgJyc7XG5cbiAgICB0aGlzLnJlcXVpcmVkID0gZmxhZ3MuaW5jbHVkZXMoJzwnKTsgLy8gQSB2YWx1ZSBtdXN0IGJlIHN1cHBsaWVkIHdoZW4gdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQuXG4gICAgdGhpcy5vcHRpb25hbCA9IGZsYWdzLmluY2x1ZGVzKCdbJyk7IC8vIEEgdmFsdWUgaXMgb3B0aW9uYWwgd2hlbiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZC5cbiAgICAvLyB2YXJpYWRpYyB0ZXN0IGlnbm9yZXMgPHZhbHVlLC4uLj4gZXQgYWwgd2hpY2ggbWlnaHQgYmUgdXNlZCB0byBkZXNjcmliZSBjdXN0b20gc3BsaXR0aW5nIG9mIHNpbmdsZSBhcmd1bWVudFxuICAgIHRoaXMudmFyaWFkaWMgPSAvXFx3XFwuXFwuXFwuWz5cXF1dJC8udGVzdChmbGFncyk7IC8vIFRoZSBvcHRpb24gY2FuIHRha2UgbXVsdGlwbGUgdmFsdWVzLlxuICAgIHRoaXMubWFuZGF0b3J5ID0gZmFsc2U7IC8vIFRoZSBvcHRpb24gbXVzdCBoYXZlIGEgdmFsdWUgYWZ0ZXIgcGFyc2luZywgd2hpY2ggdXN1YWxseSBtZWFucyBpdCBtdXN0IGJlIHNwZWNpZmllZCBvbiBjb21tYW5kIGxpbmUuXG4gICAgY29uc3Qgb3B0aW9uRmxhZ3MgPSBzcGxpdE9wdGlvbkZsYWdzKGZsYWdzKTtcbiAgICB0aGlzLnNob3J0ID0gb3B0aW9uRmxhZ3Muc2hvcnRGbGFnO1xuICAgIHRoaXMubG9uZyA9IG9wdGlvbkZsYWdzLmxvbmdGbGFnO1xuICAgIHRoaXMubmVnYXRlID0gZmFsc2U7XG4gICAgaWYgKHRoaXMubG9uZykge1xuICAgICAgdGhpcy5uZWdhdGUgPSB0aGlzLmxvbmcuc3RhcnRzV2l0aCgnLS1uby0nKTtcbiAgICB9XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnByZXNldEFyZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVudlZhciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBhcnNlQXJnID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29uZmxpY3RzV2l0aCA9IFtdO1xuICAgIHRoaXMuaW1wbGllZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUsIGFuZCBvcHRpb25hbGx5IHN1cHBseSB0aGUgZGVzY3JpcHRpb24gdG8gYmUgZGlzcGxheWVkIGluIHRoZSBoZWxwLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgZGVmYXVsdCh2YWx1ZSwgZGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVzZXQgdG8gdXNlIHdoZW4gb3B0aW9uIHVzZWQgd2l0aG91dCBvcHRpb24tYXJndW1lbnQsIGVzcGVjaWFsbHkgb3B0aW9uYWwgYnV0IGFsc28gYm9vbGVhbiBhbmQgbmVnYXRlZC5cbiAgICogVGhlIGN1c3RvbSBwcm9jZXNzaW5nIChwYXJzZUFyZykgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBuZXcgT3B0aW9uKCctLWNvbG9yJykuZGVmYXVsdCgnR1JFWVNDQUxFJykucHJlc2V0KCdSR0InKTtcbiAgICogbmV3IE9wdGlvbignLS1kb25hdGUgW2Ftb3VudF0nKS5wcmVzZXQoJzIwJykuYXJnUGFyc2VyKHBhcnNlRmxvYXQpO1xuICAgKlxuICAgKiBAcGFyYW0geyp9IGFyZ1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIHByZXNldChhcmcpIHtcbiAgICB0aGlzLnByZXNldEFyZyA9IGFyZztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgb3B0aW9uIG5hbWUocykgdGhhdCBjb25mbGljdCB3aXRoIHRoaXMgb3B0aW9uLlxuICAgKiBBbiBlcnJvciB3aWxsIGJlIGRpc3BsYXllZCBpZiBjb25mbGljdGluZyBvcHRpb25zIGFyZSBmb3VuZCBkdXJpbmcgcGFyc2luZy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbmV3IE9wdGlvbignLS1yZ2InKS5jb25mbGljdHMoJ2NteWsnKTtcbiAgICogbmV3IE9wdGlvbignLS1qcycpLmNvbmZsaWN0cyhbJ3RzJywgJ2pzeCddKTtcbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgc3RyaW5nW10pfSBuYW1lc1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGNvbmZsaWN0cyhuYW1lcykge1xuICAgIHRoaXMuY29uZmxpY3RzV2l0aCA9IHRoaXMuY29uZmxpY3RzV2l0aC5jb25jYXQobmFtZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgaW1wbGllZCBvcHRpb24gdmFsdWVzIGZvciB3aGVuIHRoaXMgb3B0aW9uIGlzIHNldCBhbmQgdGhlIGltcGxpZWQgb3B0aW9ucyBhcmUgbm90LlxuICAgKlxuICAgKiBUaGUgY3VzdG9tIHByb2Nlc3NpbmcgKHBhcnNlQXJnKSBpcyBub3QgY2FsbGVkIG9uIHRoZSBpbXBsaWVkIHZhbHVlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1sb2cnLCAnd3JpdGUgbG9nZ2luZyBpbmZvcm1hdGlvbiB0byBmaWxlJykpXG4gICAqICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLXRyYWNlJywgJ2xvZyBleHRyYSBkZXRhaWxzJykuaW1wbGllcyh7IGxvZzogJ3RyYWNlLnR4dCcgfSkpO1xuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW1wbGllZE9wdGlvblZhbHVlc1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuICBpbXBsaWVzKGltcGxpZWRPcHRpb25WYWx1ZXMpIHtcbiAgICBsZXQgbmV3SW1wbGllZCA9IGltcGxpZWRPcHRpb25WYWx1ZXM7XG4gICAgaWYgKHR5cGVvZiBpbXBsaWVkT3B0aW9uVmFsdWVzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gc3RyaW5nIGlzIG5vdCBkb2N1bWVudGVkLCBidXQgZWFzeSBtaXN0YWtlIGFuZCB3ZSBjYW4gZG8gd2hhdCB1c2VyIHByb2JhYmx5IGludGVuZGVkLlxuICAgICAgbmV3SW1wbGllZCA9IHsgW2ltcGxpZWRPcHRpb25WYWx1ZXNdOiB0cnVlIH07XG4gICAgfVxuICAgIHRoaXMuaW1wbGllZCA9IE9iamVjdC5hc3NpZ24odGhpcy5pbXBsaWVkIHx8IHt9LCBuZXdJbXBsaWVkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gY2hlY2sgZm9yIG9wdGlvbiB2YWx1ZS5cbiAgICpcbiAgICogQW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgb25seSB1c2VkIGlmIHdoZW4gcHJvY2Vzc2VkIHRoZSBjdXJyZW50IG9wdGlvbiB2YWx1ZSBpc1xuICAgKiB1bmRlZmluZWQsIG9yIHRoZSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgdmFsdWUgaXMgJ2RlZmF1bHQnIG9yICdjb25maWcnIG9yICdlbnYnLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGVudihuYW1lKSB7XG4gICAgdGhpcy5lbnZWYXIgPSBuYW1lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VzdG9tIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgQ0xJIG9wdGlvbiBhcmd1bWVudHMgaW50byBvcHRpb24gdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgYXJnUGFyc2VyKGZuKSB7XG4gICAgdGhpcy5wYXJzZUFyZyA9IGZuO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBtYW5kYXRvcnkgYW5kIG11c3QgaGF2ZSBhIHZhbHVlIGFmdGVyIHBhcnNpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW21hbmRhdG9yeT10cnVlXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIG1ha2VPcHRpb25NYW5kYXRvcnkobWFuZGF0b3J5ID0gdHJ1ZSkge1xuICAgIHRoaXMubWFuZGF0b3J5ID0gISFtYW5kYXRvcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSBvcHRpb24gaW4gaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbaGlkZT10cnVlXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGhpZGVIZWxwKGhpZGUgPSB0cnVlKSB7XG4gICAgdGhpcy5oaWRkZW4gPSAhIWhpZGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhY2thZ2VcbiAgICovXG5cbiAgX2NvbmNhdFZhbHVlKHZhbHVlLCBwcmV2aW91cykge1xuICAgIGlmIChwcmV2aW91cyA9PT0gdGhpcy5kZWZhdWx0VmFsdWUgfHwgIUFycmF5LmlzQXJyYXkocHJldmlvdXMpKSB7XG4gICAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJldmlvdXMuY29uY2F0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IGFsbG93IG9wdGlvbiB2YWx1ZSB0byBiZSBvbmUgb2YgY2hvaWNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdmFsdWVzXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgY2hvaWNlcyh2YWx1ZXMpIHtcbiAgICB0aGlzLmFyZ0Nob2ljZXMgPSB2YWx1ZXMuc2xpY2UoKTtcbiAgICB0aGlzLnBhcnNlQXJnID0gKGFyZywgcHJldmlvdXMpID0+IHtcbiAgICAgIGlmICghdGhpcy5hcmdDaG9pY2VzLmluY2x1ZGVzKGFyZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgIGBBbGxvd2VkIGNob2ljZXMgYXJlICR7dGhpcy5hcmdDaG9pY2VzLmpvaW4oJywgJyl9LmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52YXJpYWRpYykge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uY2F0VmFsdWUoYXJnLCBwcmV2aW91cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIG9wdGlvbiBuYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIG5hbWUoKSB7XG4gICAgaWYgKHRoaXMubG9uZykge1xuICAgICAgcmV0dXJuIHRoaXMubG9uZy5yZXBsYWNlKC9eLS0vLCAnJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3J0LnJlcGxhY2UoL14tLywgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBvcHRpb24gbmFtZSwgaW4gYSBjYW1lbGNhc2UgZm9ybWF0IHRoYXQgY2FuIGJlIHVzZWRcbiAgICogYXMgYSBvYmplY3QgYXR0cmlidXRlIGtleS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBhdHRyaWJ1dGVOYW1lKCkge1xuICAgIHJldHVybiBjYW1lbGNhc2UodGhpcy5uYW1lKCkucmVwbGFjZSgvXm5vLS8sICcnKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYGFyZ2AgbWF0Y2hlcyB0aGUgc2hvcnQgb3IgbG9uZyBmbGFnLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIGlzKGFyZykge1xuICAgIHJldHVybiB0aGlzLnNob3J0ID09PSBhcmcgfHwgdGhpcy5sb25nID09PSBhcmc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgYSBib29sZWFuIG9wdGlvbi5cbiAgICpcbiAgICogT3B0aW9ucyBhcmUgb25lIG9mIGJvb2xlYW4sIG5lZ2F0ZWQsIHJlcXVpcmVkIGFyZ3VtZW50LCBvciBvcHRpb25hbCBhcmd1bWVudC5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogQHBhY2thZ2VcbiAgICovXG5cbiAgaXNCb29sZWFuKCkge1xuICAgIHJldHVybiAhdGhpcy5yZXF1aXJlZCAmJiAhdGhpcy5vcHRpb25hbCAmJiAhdGhpcy5uZWdhdGU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdvcmsgd2l0aCBkdWFsIG9wdGlvbnMsIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGV4aXN0aW5nXG4gKiBpbXBsZW1lbnRhdGlvbi4gV2Ugc3VwcG9ydCBzZXBhcmF0ZSBkdWFsIG9wdGlvbnMgZm9yIHNlcGFyYXRlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBvcHRpb25zLFxuICogbGlrZSBgLS1idWlsZGAgYW5kIGAtLW5vLWJ1aWxkYCwgd2hpY2ggc2hhcmUgYSBzaW5nbGUgb3B0aW9uIHZhbHVlLiBUaGlzIHdvcmtzIG5pY2VseSBmb3Igc29tZVxuICogdXNlIGNhc2VzLCBidXQgaXMgdHJpY2t5IGZvciBvdGhlcnMgd2hlcmUgd2Ugd2FudCBzZXBhcmF0ZSBiZWhhdmlvdXJzIGRlc3BpdGVcbiAqIHRoZSBzaW5nbGUgc2hhcmVkIG9wdGlvbiB2YWx1ZS5cbiAqL1xuY2xhc3MgRHVhbE9wdGlvbnMge1xuICAvKipcbiAgICogQHBhcmFtIHtPcHRpb25bXX0gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHRoaXMucG9zaXRpdmVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgIHRoaXMubmVnYXRpdmVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZHVhbE9wdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgIGlmIChvcHRpb24ubmVnYXRlKSB7XG4gICAgICAgIHRoaXMubmVnYXRpdmVPcHRpb25zLnNldChvcHRpb24uYXR0cmlidXRlTmFtZSgpLCBvcHRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3NpdGl2ZU9wdGlvbnMuc2V0KG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCksIG9wdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5uZWdhdGl2ZU9wdGlvbnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgaWYgKHRoaXMucG9zaXRpdmVPcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuZHVhbE9wdGlvbnMuYWRkKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlkIHRoZSB2YWx1ZSBjb21lIGZyb20gdGhlIG9wdGlvbiwgYW5kIG5vdCBmcm9tIHBvc3NpYmxlIG1hdGNoaW5nIGR1YWwgb3B0aW9uP1xuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICB2YWx1ZUZyb21PcHRpb24odmFsdWUsIG9wdGlvbikge1xuICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgaWYgKCF0aGlzLmR1YWxPcHRpb25zLmhhcyhvcHRpb25LZXkpKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIFVzZSB0aGUgdmFsdWUgdG8gZGVkdWNlIGlmIChwcm9iYWJseSkgY2FtZSBmcm9tIHRoZSBvcHRpb24uXG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5uZWdhdGl2ZU9wdGlvbnMuZ2V0KG9wdGlvbktleSkucHJlc2V0QXJnO1xuICAgIGNvbnN0IG5lZ2F0aXZlVmFsdWUgPSBwcmVzZXQgIT09IHVuZGVmaW5lZCA/IHByZXNldCA6IGZhbHNlO1xuICAgIHJldHVybiBvcHRpb24ubmVnYXRlID09PSAobmVnYXRpdmVWYWx1ZSA9PT0gdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBzdHJpbmcgZnJvbSBrZWJhYi1jYXNlIHRvIGNhbWVsQ2FzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNhbWVsY2FzZShzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgnLScpLnJlZHVjZSgoc3RyLCB3b3JkKSA9PiB7XG4gICAgcmV0dXJuIHN0ciArIHdvcmRbMF0udG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNwbGl0IHRoZSBzaG9ydCBhbmQgbG9uZyBmbGFnIG91dCBvZiBzb21ldGhpbmcgbGlrZSAnLW0sLS1taXhlZCA8dmFsdWU+J1xuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BsaXRPcHRpb25GbGFncyhmbGFncykge1xuICBsZXQgc2hvcnRGbGFnO1xuICBsZXQgbG9uZ0ZsYWc7XG4gIC8vIFVzZSBvcmlnaW5hbCB2ZXJ5IGxvb3NlIHBhcnNpbmcgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG5vdyxcbiAgLy8gd2hpY2ggYWxsb3dlZCBmb3IgZXhhbXBsZSB1bmludGVuZGVkIGAtc3csIC0tc2hvcnQtd29yZGAgW3NpY10uXG4gIGNvbnN0IGZsYWdQYXJ0cyA9IGZsYWdzLnNwbGl0KC9bIHwsXSsvKTtcbiAgaWYgKGZsYWdQYXJ0cy5sZW5ndGggPiAxICYmICEvXltbPF0vLnRlc3QoZmxhZ1BhcnRzWzFdKSlcbiAgICBzaG9ydEZsYWcgPSBmbGFnUGFydHMuc2hpZnQoKTtcbiAgbG9uZ0ZsYWcgPSBmbGFnUGFydHMuc2hpZnQoKTtcbiAgLy8gQWRkIHN1cHBvcnQgZm9yIGxvbmUgc2hvcnQgZmxhZyB3aXRob3V0IHNpZ25pZmljYW50bHkgY2hhbmdpbmcgcGFyc2luZyFcbiAgaWYgKCFzaG9ydEZsYWcgJiYgL14tW14tXSQvLnRlc3QobG9uZ0ZsYWcpKSB7XG4gICAgc2hvcnRGbGFnID0gbG9uZ0ZsYWc7XG4gICAgbG9uZ0ZsYWcgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc2hvcnRGbGFnLCBsb25nRmxhZyB9O1xufVxuXG5leHBvcnRzLk9wdGlvbiA9IE9wdGlvbjtcbmV4cG9ydHMuRHVhbE9wdGlvbnMgPSBEdWFsT3B0aW9ucztcbiIsImNvbnN0IG1heERpc3RhbmNlID0gMztcblxuZnVuY3Rpb24gZWRpdERpc3RhbmNlKGEsIGIpIHtcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGFtZXJhdeKAk0xldmVuc2h0ZWluX2Rpc3RhbmNlXG4gIC8vIENhbGN1bGF0aW5nIG9wdGltYWwgc3RyaW5nIGFsaWdubWVudCBkaXN0YW5jZSwgbm8gc3Vic3RyaW5nIGlzIGVkaXRlZCBtb3JlIHRoYW4gb25jZS5cbiAgLy8gKFNpbXBsZSBpbXBsZW1lbnRhdGlvbi4pXG5cbiAgLy8gUXVpY2sgZWFybHkgZXhpdCwgcmV0dXJuIHdvcnN0IGNhc2UuXG4gIGlmIChNYXRoLmFicyhhLmxlbmd0aCAtIGIubGVuZ3RoKSA+IG1heERpc3RhbmNlKVxuICAgIHJldHVybiBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuXG4gIC8vIGRpc3RhbmNlIGJldHdlZW4gcHJlZml4IHN1YnN0cmluZ3Mgb2YgYSBhbmQgYlxuICBjb25zdCBkID0gW107XG5cbiAgLy8gcHVyZSBkZWxldGlvbnMgdHVybiBhIGludG8gZW1wdHkgc3RyaW5nXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IGEubGVuZ3RoOyBpKyspIHtcbiAgICBkW2ldID0gW2ldO1xuICB9XG4gIC8vIHB1cmUgaW5zZXJ0aW9ucyB0dXJuIGVtcHR5IHN0cmluZyBpbnRvIGJcbiAgZm9yIChsZXQgaiA9IDA7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIGRbMF1bal0gPSBqO1xuICB9XG5cbiAgLy8gZmlsbCBtYXRyaXhcbiAgZm9yIChsZXQgaiA9IDE7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjb3N0ID0gMTtcbiAgICAgIGlmIChhW2kgLSAxXSA9PT0gYltqIC0gMV0pIHtcbiAgICAgICAgY29zdCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3N0ID0gMTtcbiAgICAgIH1cbiAgICAgIGRbaV1bal0gPSBNYXRoLm1pbihcbiAgICAgICAgZFtpIC0gMV1bal0gKyAxLCAvLyBkZWxldGlvblxuICAgICAgICBkW2ldW2ogLSAxXSArIDEsIC8vIGluc2VydGlvblxuICAgICAgICBkW2kgLSAxXVtqIC0gMV0gKyBjb3N0LCAvLyBzdWJzdGl0dXRpb25cbiAgICAgICk7XG4gICAgICAvLyB0cmFuc3Bvc2l0aW9uXG4gICAgICBpZiAoaSA+IDEgJiYgaiA+IDEgJiYgYVtpIC0gMV0gPT09IGJbaiAtIDJdICYmIGFbaSAtIDJdID09PSBiW2ogLSAxXSkge1xuICAgICAgICBkW2ldW2pdID0gTWF0aC5taW4oZFtpXVtqXSwgZFtpIC0gMl1baiAtIDJdICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRbYS5sZW5ndGhdW2IubGVuZ3RoXTtcbn1cblxuLyoqXG4gKiBGaW5kIGNsb3NlIG1hdGNoZXMsIHJlc3RyaWN0ZWQgdG8gc2FtZSBudW1iZXIgb2YgZWRpdHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IGNhbmRpZGF0ZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gc3VnZ2VzdFNpbWlsYXIod29yZCwgY2FuZGlkYXRlcykge1xuICBpZiAoIWNhbmRpZGF0ZXMgfHwgY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgLy8gcmVtb3ZlIHBvc3NpYmxlIGR1cGxpY2F0ZXNcbiAgY2FuZGlkYXRlcyA9IEFycmF5LmZyb20obmV3IFNldChjYW5kaWRhdGVzKSk7XG5cbiAgY29uc3Qgc2VhcmNoaW5nT3B0aW9ucyA9IHdvcmQuc3RhcnRzV2l0aCgnLS0nKTtcbiAgaWYgKHNlYXJjaGluZ09wdGlvbnMpIHtcbiAgICB3b3JkID0gd29yZC5zbGljZSgyKTtcbiAgICBjYW5kaWRhdGVzID0gY2FuZGlkYXRlcy5tYXAoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnNsaWNlKDIpKTtcbiAgfVxuXG4gIGxldCBzaW1pbGFyID0gW107XG4gIGxldCBiZXN0RGlzdGFuY2UgPSBtYXhEaXN0YW5jZTtcbiAgY29uc3QgbWluU2ltaWxhcml0eSA9IDAuNDtcbiAgY2FuZGlkYXRlcy5mb3JFYWNoKChjYW5kaWRhdGUpID0+IHtcbiAgICBpZiAoY2FuZGlkYXRlLmxlbmd0aCA8PSAxKSByZXR1cm47IC8vIG5vIG9uZSBjaGFyYWN0ZXIgZ3Vlc3Nlc1xuXG4gICAgY29uc3QgZGlzdGFuY2UgPSBlZGl0RGlzdGFuY2Uod29yZCwgY2FuZGlkYXRlKTtcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCh3b3JkLmxlbmd0aCwgY2FuZGlkYXRlLmxlbmd0aCk7XG4gICAgY29uc3Qgc2ltaWxhcml0eSA9IChsZW5ndGggLSBkaXN0YW5jZSkgLyBsZW5ndGg7XG4gICAgaWYgKHNpbWlsYXJpdHkgPiBtaW5TaW1pbGFyaXR5KSB7XG4gICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgLy8gYmV0dGVyIGVkaXQgZGlzdGFuY2UsIHRocm93IGF3YXkgcHJldmlvdXMgd29yc2UgbWF0Y2hlc1xuICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgc2ltaWxhciA9IFtjYW5kaWRhdGVdO1xuICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA9PT0gYmVzdERpc3RhbmNlKSB7XG4gICAgICAgIHNpbWlsYXIucHVzaChjYW5kaWRhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgc2ltaWxhci5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBpZiAoc2VhcmNoaW5nT3B0aW9ucykge1xuICAgIHNpbWlsYXIgPSBzaW1pbGFyLm1hcCgoY2FuZGlkYXRlKSA9PiBgLS0ke2NhbmRpZGF0ZX1gKTtcbiAgfVxuXG4gIGlmIChzaW1pbGFyLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gYFxcbihEaWQgeW91IG1lYW4gb25lIG9mICR7c2ltaWxhci5qb2luKCcsICcpfT8pYDtcbiAgfVxuICBpZiAoc2ltaWxhci5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYFxcbihEaWQgeW91IG1lYW4gJHtzaW1pbGFyWzBdfT8pYDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydHMuc3VnZ2VzdFNpbWlsYXIgPSBzdWdnZXN0U2ltaWxhcjtcbiIsImNvbnN0IHBlcmYgPVxuICB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmXG4gIHBlcmZvcm1hbmNlICYmXG4gIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbidcbiAgICA/IHBlcmZvcm1hbmNlXG4gICAgOiBEYXRlXG5cbmNvbnN0IGhhc0Fib3J0Q29udHJvbGxlciA9IHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgPT09ICdmdW5jdGlvbidcblxuLy8gbWluaW1hbCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBwb2x5ZmlsbFxuLy8gdGhpcyBkb2Vzbid0IGhhdmUgbmVhcmx5IGFsbCB0aGUgY2hlY2tzIGFuZCB3aGF0bm90IHRoYXRcbi8vIGFjdHVhbCBBYm9ydENvbnRyb2xsZXIvU2lnbmFsIGhhcywgYnV0IGl0J3MgZW5vdWdoIGZvclxuLy8gb3VyIHB1cnBvc2VzLCBhbmQgaWYgdXNlZCBwcm9wZXJseSwgYmVoYXZlcyB0aGUgc2FtZS5cbmNvbnN0IEFDID0gaGFzQWJvcnRDb250cm9sbGVyXG4gID8gQWJvcnRDb250cm9sbGVyXG4gIDogY2xhc3MgQWJvcnRDb250cm9sbGVyIHtcbiAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNpZ25hbCA9IG5ldyBBUygpXG4gICAgICB9XG4gICAgICBhYm9ydChyZWFzb24gPSBuZXcgRXJyb3IoJ1RoaXMgb3BlcmF0aW9uIHdhcyBhYm9ydGVkJykpIHtcbiAgICAgICAgdGhpcy5zaWduYWwucmVhc29uID0gdGhpcy5zaWduYWwucmVhc29uIHx8IHJlYXNvblxuICAgICAgICB0aGlzLnNpZ25hbC5hYm9ydGVkID0gdHJ1ZVxuICAgICAgICB0aGlzLnNpZ25hbC5kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnYWJvcnQnLFxuICAgICAgICAgIHRhcmdldDogdGhpcy5zaWduYWwsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG5jb25zdCBoYXNBYm9ydFNpZ25hbCA9IHR5cGVvZiBBYm9ydFNpZ25hbCA9PT0gJ2Z1bmN0aW9uJ1xuLy8gU29tZSBwb2x5ZmlsbHMgcHV0IHRoaXMgb24gdGhlIEFDIGNsYXNzLCBub3QgZ2xvYmFsXG5jb25zdCBoYXNBQ0Fib3J0U2lnbmFsID0gdHlwZW9mIEFDLkFib3J0U2lnbmFsID09PSAnZnVuY3Rpb24nXG5jb25zdCBBUyA9IGhhc0Fib3J0U2lnbmFsXG4gID8gQWJvcnRTaWduYWxcbiAgOiBoYXNBQ0Fib3J0U2lnbmFsXG4gID8gQUMuQWJvcnRDb250cm9sbGVyXG4gIDogY2xhc3MgQWJvcnRTaWduYWwge1xuICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucmVhc29uID0gdW5kZWZpbmVkXG4gICAgICAgIHRoaXMuYWJvcnRlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdXG4gICAgICB9XG4gICAgICBkaXNwYXRjaEV2ZW50KGUpIHtcbiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWVcbiAgICAgICAgICB0aGlzLm9uYWJvcnQoZSlcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaChmID0+IGYoZSksIHRoaXMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uYWJvcnQoKSB7fVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihldiwgZm4pIHtcbiAgICAgICAgaWYgKGV2ID09PSAnYWJvcnQnKSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2goZm4pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoZXYsIGZuKSB7XG4gICAgICAgIGlmIChldiA9PT0gJ2Fib3J0Jykge1xuICAgICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycy5maWx0ZXIoZiA9PiBmICE9PSBmbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuY29uc3Qgd2FybmVkID0gbmV3IFNldCgpXG5jb25zdCBkZXByZWNhdGVkT3B0aW9uID0gKG9wdCwgaW5zdGVhZCkgPT4ge1xuICBjb25zdCBjb2RlID0gYExSVV9DQUNIRV9PUFRJT05fJHtvcHR9YFxuICBpZiAoc2hvdWxkV2Fybihjb2RlKSkge1xuICAgIHdhcm4oY29kZSwgYCR7b3B0fSBvcHRpb25gLCBgb3B0aW9ucy4ke2luc3RlYWR9YCwgTFJVQ2FjaGUpXG4gIH1cbn1cbmNvbnN0IGRlcHJlY2F0ZWRNZXRob2QgPSAobWV0aG9kLCBpbnN0ZWFkKSA9PiB7XG4gIGNvbnN0IGNvZGUgPSBgTFJVX0NBQ0hFX01FVEhPRF8ke21ldGhvZH1gXG4gIGlmIChzaG91bGRXYXJuKGNvZGUpKSB7XG4gICAgY29uc3QgeyBwcm90b3R5cGUgfSA9IExSVUNhY2hlXG4gICAgY29uc3QgeyBnZXQgfSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBtZXRob2QpXG4gICAgd2Fybihjb2RlLCBgJHttZXRob2R9IG1ldGhvZGAsIGBjYWNoZS4ke2luc3RlYWR9KClgLCBnZXQpXG4gIH1cbn1cbmNvbnN0IGRlcHJlY2F0ZWRQcm9wZXJ0eSA9IChmaWVsZCwgaW5zdGVhZCkgPT4ge1xuICBjb25zdCBjb2RlID0gYExSVV9DQUNIRV9QUk9QRVJUWV8ke2ZpZWxkfWBcbiAgaWYgKHNob3VsZFdhcm4oY29kZSkpIHtcbiAgICBjb25zdCB7IHByb3RvdHlwZSB9ID0gTFJVQ2FjaGVcbiAgICBjb25zdCB7IGdldCB9ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIGZpZWxkKVxuICAgIHdhcm4oY29kZSwgYCR7ZmllbGR9IHByb3BlcnR5YCwgYGNhY2hlLiR7aW5zdGVhZH1gLCBnZXQpXG4gIH1cbn1cblxuY29uc3QgZW1pdFdhcm5pbmcgPSAoLi4uYSkgPT4ge1xuICB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgcHJvY2VzcyAmJlxuICB0eXBlb2YgcHJvY2Vzcy5lbWl0V2FybmluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gcHJvY2Vzcy5lbWl0V2FybmluZyguLi5hKVxuICAgIDogY29uc29sZS5lcnJvciguLi5hKVxufVxuXG5jb25zdCBzaG91bGRXYXJuID0gY29kZSA9PiAhd2FybmVkLmhhcyhjb2RlKVxuXG5jb25zdCB3YXJuID0gKGNvZGUsIHdoYXQsIGluc3RlYWQsIGZuKSA9PiB7XG4gIHdhcm5lZC5hZGQoY29kZSlcbiAgY29uc3QgbXNnID0gYFRoZSAke3doYXR9IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJHtpbnN0ZWFkfSBpbnN0ZWFkLmBcbiAgZW1pdFdhcm5pbmcobXNnLCAnRGVwcmVjYXRpb25XYXJuaW5nJywgY29kZSwgZm4pXG59XG5cbmNvbnN0IGlzUG9zSW50ID0gbiA9PiBuICYmIG4gPT09IE1hdGguZmxvb3IobikgJiYgbiA+IDAgJiYgaXNGaW5pdGUobilcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgLSBUaGlzIGlzIGEgbGl0dGxlIGJpdCByaWRpY3Vsb3VzLCB0YmguXG4gKiBUaGUgbWF4aW11bSBhcnJheSBsZW5ndGggaXMgMl4zMi0xIG9yIHRoZXJlYWJvdXRzIG9uIG1vc3QgSlMgaW1wbHMuXG4gKiBBbmQgd2VsbCBiZWZvcmUgdGhhdCBwb2ludCwgeW91J3JlIGNhY2hpbmcgdGhlIGVudGlyZSB3b3JsZCwgSSBtZWFuLFxuICogdGhhdCdzIH4zMkdCIG9mIGp1c3QgaW50ZWdlcnMgZm9yIHRoZSBuZXh0L3ByZXYgbGlua3MsIHBsdXMgd2hhdGV2ZXJcbiAqIGVsc2UgdG8gaG9sZCB0aGF0IG1hbnkga2V5cyBhbmQgdmFsdWVzLiAgSnVzdCBmaWxsaW5nIHRoZSBtZW1vcnkgd2l0aFxuICogemVyb2VzIGF0IGluaXQgdGltZSBpcyBicnV0YWwgd2hlbiB5b3UgZ2V0IHRoYXQgYmlnLlxuICogQnV0IHdoeSBub3QgYmUgY29tcGxldGU/XG4gKiBNYXliZSBpbiB0aGUgZnV0dXJlLCB0aGVzZSBsaW1pdHMgd2lsbCBoYXZlIGV4cGFuZGVkLiAqL1xuY29uc3QgZ2V0VWludEFycmF5ID0gbWF4ID0+XG4gICFpc1Bvc0ludChtYXgpXG4gICAgPyBudWxsXG4gICAgOiBtYXggPD0gTWF0aC5wb3coMiwgOClcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IG1heCA8PSBNYXRoLnBvdygyLCAxNilcbiAgICA/IFVpbnQxNkFycmF5XG4gICAgOiBtYXggPD0gTWF0aC5wb3coMiwgMzIpXG4gICAgPyBVaW50MzJBcnJheVxuICAgIDogbWF4IDw9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG4gICAgPyBaZXJvQXJyYXlcbiAgICA6IG51bGxcblxuY2xhc3MgWmVyb0FycmF5IGV4dGVuZHMgQXJyYXkge1xuICBjb25zdHJ1Y3RvcihzaXplKSB7XG4gICAgc3VwZXIoc2l6ZSlcbiAgICB0aGlzLmZpbGwoMClcbiAgfVxufVxuXG5jbGFzcyBTdGFjayB7XG4gIGNvbnN0cnVjdG9yKG1heCkge1xuICAgIGlmIChtYXggPT09IDApIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgICBjb25zdCBVaW50QXJyYXkgPSBnZXRVaW50QXJyYXkobWF4KVxuICAgIHRoaXMuaGVhcCA9IG5ldyBVaW50QXJyYXkobWF4KVxuICAgIHRoaXMubGVuZ3RoID0gMFxuICB9XG4gIHB1c2gobikge1xuICAgIHRoaXMuaGVhcFt0aGlzLmxlbmd0aCsrXSA9IG5cbiAgfVxuICBwb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVhcFstLXRoaXMubGVuZ3RoXVxuICB9XG59XG5cbmNsYXNzIExSVUNhY2hlIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgbWF4ID0gMCxcbiAgICAgIHR0bCxcbiAgICAgIHR0bFJlc29sdXRpb24gPSAxLFxuICAgICAgdHRsQXV0b3B1cmdlLFxuICAgICAgdXBkYXRlQWdlT25HZXQsXG4gICAgICB1cGRhdGVBZ2VPbkhhcyxcbiAgICAgIGFsbG93U3RhbGUsXG4gICAgICBkaXNwb3NlLFxuICAgICAgZGlzcG9zZUFmdGVyLFxuICAgICAgbm9EaXNwb3NlT25TZXQsXG4gICAgICBub1VwZGF0ZVRUTCxcbiAgICAgIG1heFNpemUgPSAwLFxuICAgICAgbWF4RW50cnlTaXplID0gMCxcbiAgICAgIHNpemVDYWxjdWxhdGlvbixcbiAgICAgIGZldGNoTWV0aG9kLFxuICAgICAgZmV0Y2hDb250ZXh0LFxuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgbm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0LFxuICAgICAgaWdub3JlRmV0Y2hBYm9ydCxcbiAgICB9ID0gb3B0aW9uc1xuXG4gICAgLy8gZGVwcmVjYXRlZCBvcHRpb25zLCBkb24ndCB0cmlnZ2VyIGEgd2FybmluZyBmb3IgZ2V0dGluZyB0aGVtIGlmXG4gICAgLy8gdGhlIHRoaW5nIGJlaW5nIHBhc3NlZCBpbiBpcyBhbm90aGVyIExSVUNhY2hlIHdlJ3JlIGNvcHlpbmcuXG4gICAgY29uc3QgeyBsZW5ndGgsIG1heEFnZSwgc3RhbGUgfSA9XG4gICAgICBvcHRpb25zIGluc3RhbmNlb2YgTFJVQ2FjaGUgPyB7fSA6IG9wdGlvbnNcblxuICAgIGlmIChtYXggIT09IDAgJiYgIWlzUG9zSW50KG1heCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heCBvcHRpb24gbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXInKVxuICAgIH1cblxuICAgIGNvbnN0IFVpbnRBcnJheSA9IG1heCA/IGdldFVpbnRBcnJheShtYXgpIDogQXJyYXlcbiAgICBpZiAoIVVpbnRBcnJheSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heCB2YWx1ZTogJyArIG1heClcbiAgICB9XG5cbiAgICB0aGlzLm1heCA9IG1heFxuICAgIHRoaXMubWF4U2l6ZSA9IG1heFNpemVcbiAgICB0aGlzLm1heEVudHJ5U2l6ZSA9IG1heEVudHJ5U2l6ZSB8fCB0aGlzLm1heFNpemVcbiAgICB0aGlzLnNpemVDYWxjdWxhdGlvbiA9IHNpemVDYWxjdWxhdGlvbiB8fCBsZW5ndGhcbiAgICBpZiAodGhpcy5zaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgIGlmICghdGhpcy5tYXhTaXplICYmICF0aGlzLm1heEVudHJ5U2l6ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdjYW5ub3Qgc2V0IHNpemVDYWxjdWxhdGlvbiB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUnXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5zaXplQ2FsY3VsYXRpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZUNhbGN1bGF0aW9uIHNldCB0byBub24tZnVuY3Rpb24nKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZmV0Y2hNZXRob2QgPSBmZXRjaE1ldGhvZCB8fCBudWxsXG4gICAgaWYgKHRoaXMuZmV0Y2hNZXRob2QgJiYgdHlwZW9mIHRoaXMuZmV0Y2hNZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdmZXRjaE1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgc3BlY2lmaWVkJ1xuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuZmV0Y2hDb250ZXh0ID0gZmV0Y2hDb250ZXh0XG4gICAgaWYgKCF0aGlzLmZldGNoTWV0aG9kICYmIGZldGNoQ29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnY2Fubm90IHNldCBmZXRjaENvbnRleHQgd2l0aG91dCBmZXRjaE1ldGhvZCdcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLmtleU1hcCA9IG5ldyBNYXAoKVxuICAgIHRoaXMua2V5TGlzdCA9IG5ldyBBcnJheShtYXgpLmZpbGwobnVsbClcbiAgICB0aGlzLnZhbExpc3QgPSBuZXcgQXJyYXkobWF4KS5maWxsKG51bGwpXG4gICAgdGhpcy5uZXh0ID0gbmV3IFVpbnRBcnJheShtYXgpXG4gICAgdGhpcy5wcmV2ID0gbmV3IFVpbnRBcnJheShtYXgpXG4gICAgdGhpcy5oZWFkID0gMFxuICAgIHRoaXMudGFpbCA9IDBcbiAgICB0aGlzLmZyZWUgPSBuZXcgU3RhY2sobWF4KVxuICAgIHRoaXMuaW5pdGlhbEZpbGwgPSAxXG4gICAgdGhpcy5zaXplID0gMFxuXG4gICAgaWYgKHR5cGVvZiBkaXNwb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmRpc3Bvc2UgPSBkaXNwb3NlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZUFmdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmRpc3Bvc2VBZnRlciA9IGRpc3Bvc2VBZnRlclxuICAgICAgdGhpcy5kaXNwb3NlZCA9IFtdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcG9zZUFmdGVyID0gbnVsbFxuICAgICAgdGhpcy5kaXNwb3NlZCA9IG51bGxcbiAgICB9XG4gICAgdGhpcy5ub0Rpc3Bvc2VPblNldCA9ICEhbm9EaXNwb3NlT25TZXRcbiAgICB0aGlzLm5vVXBkYXRlVFRMID0gISFub1VwZGF0ZVRUTFxuICAgIHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gISFub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb25cbiAgICB0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uID0gISFhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvblxuICAgIHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCA9ICEhYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydFxuICAgIHRoaXMuaWdub3JlRmV0Y2hBYm9ydCA9ICEhaWdub3JlRmV0Y2hBYm9ydFxuXG4gICAgLy8gTkI6IG1heEVudHJ5U2l6ZSBpcyBzZXQgdG8gbWF4U2l6ZSBpZiBpdCdzIHNldFxuICAgIGlmICh0aGlzLm1heEVudHJ5U2l6ZSAhPT0gMCkge1xuICAgICAgaWYgKHRoaXMubWF4U2l6ZSAhPT0gMCkge1xuICAgICAgICBpZiAoIWlzUG9zSW50KHRoaXMubWF4U2l6ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ21heFNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkJ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLm1heEVudHJ5U2l6ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAnbWF4RW50cnlTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCdcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgdGhpcy5pbml0aWFsaXplU2l6ZVRyYWNraW5nKClcbiAgICB9XG5cbiAgICB0aGlzLmFsbG93U3RhbGUgPSAhIWFsbG93U3RhbGUgfHwgISFzdGFsZVxuICAgIHRoaXMubm9EZWxldGVPblN0YWxlR2V0ID0gISFub0RlbGV0ZU9uU3RhbGVHZXRcbiAgICB0aGlzLnVwZGF0ZUFnZU9uR2V0ID0gISF1cGRhdGVBZ2VPbkdldFxuICAgIHRoaXMudXBkYXRlQWdlT25IYXMgPSAhIXVwZGF0ZUFnZU9uSGFzXG4gICAgdGhpcy50dGxSZXNvbHV0aW9uID1cbiAgICAgIGlzUG9zSW50KHR0bFJlc29sdXRpb24pIHx8IHR0bFJlc29sdXRpb24gPT09IDBcbiAgICAgICAgPyB0dGxSZXNvbHV0aW9uXG4gICAgICAgIDogMVxuICAgIHRoaXMudHRsQXV0b3B1cmdlID0gISF0dGxBdXRvcHVyZ2VcbiAgICB0aGlzLnR0bCA9IHR0bCB8fCBtYXhBZ2UgfHwgMFxuICAgIGlmICh0aGlzLnR0bCkge1xuICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLnR0bCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAndHRsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCdcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgdGhpcy5pbml0aWFsaXplVFRMVHJhY2tpbmcoKVxuICAgIH1cblxuICAgIC8vIGRvIG5vdCBhbGxvdyBjb21wbGV0ZWx5IHVuYm91bmRlZCBjYWNoZXNcbiAgICBpZiAodGhpcy5tYXggPT09IDAgJiYgdGhpcy50dGwgPT09IDAgJiYgdGhpcy5tYXhTaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQXQgbGVhc3Qgb25lIG9mIG1heCwgbWF4U2l6ZSwgb3IgdHRsIGlzIHJlcXVpcmVkJ1xuICAgICAgKVxuICAgIH1cbiAgICBpZiAoIXRoaXMudHRsQXV0b3B1cmdlICYmICF0aGlzLm1heCAmJiAhdGhpcy5tYXhTaXplKSB7XG4gICAgICBjb25zdCBjb2RlID0gJ0xSVV9DQUNIRV9VTkJPVU5ERUQnXG4gICAgICBpZiAoc2hvdWxkV2Fybihjb2RlKSkge1xuICAgICAgICB3YXJuZWQuYWRkKGNvZGUpXG4gICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgJ1RUTCBjYWNoaW5nIHdpdGhvdXQgdHRsQXV0b3B1cmdlLCBtYXgsIG9yIG1heFNpemUgY2FuICcgK1xuICAgICAgICAgICdyZXN1bHQgaW4gdW5ib3VuZGVkIG1lbW9yeSBjb25zdW1wdGlvbi4nXG4gICAgICAgIGVtaXRXYXJuaW5nKG1zZywgJ1VuYm91bmRlZENhY2hlV2FybmluZycsIGNvZGUsIExSVUNhY2hlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGFsZSkge1xuICAgICAgZGVwcmVjYXRlZE9wdGlvbignc3RhbGUnLCAnYWxsb3dTdGFsZScpXG4gICAgfVxuICAgIGlmIChtYXhBZ2UpIHtcbiAgICAgIGRlcHJlY2F0ZWRPcHRpb24oJ21heEFnZScsICd0dGwnKVxuICAgIH1cbiAgICBpZiAobGVuZ3RoKSB7XG4gICAgICBkZXByZWNhdGVkT3B0aW9uKCdsZW5ndGgnLCAnc2l6ZUNhbGN1bGF0aW9uJylcbiAgICB9XG4gIH1cblxuICBnZXRSZW1haW5pbmdUVEwoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzKGtleSwgeyB1cGRhdGVBZ2VPbkhhczogZmFsc2UgfSkgPyBJbmZpbml0eSA6IDBcbiAgfVxuXG4gIGluaXRpYWxpemVUVExUcmFja2luZygpIHtcbiAgICB0aGlzLnR0bHMgPSBuZXcgWmVyb0FycmF5KHRoaXMubWF4KVxuICAgIHRoaXMuc3RhcnRzID0gbmV3IFplcm9BcnJheSh0aGlzLm1heClcblxuICAgIHRoaXMuc2V0SXRlbVRUTCA9IChpbmRleCwgdHRsLCBzdGFydCA9IHBlcmYubm93KCkpID0+IHtcbiAgICAgIHRoaXMuc3RhcnRzW2luZGV4XSA9IHR0bCAhPT0gMCA/IHN0YXJ0IDogMFxuICAgICAgdGhpcy50dGxzW2luZGV4XSA9IHR0bFxuICAgICAgaWYgKHR0bCAhPT0gMCAmJiB0aGlzLnR0bEF1dG9wdXJnZSkge1xuICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNTdGFsZShpbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlKHRoaXMua2V5TGlzdFtpbmRleF0pXG4gICAgICAgICAgfVxuICAgICAgICB9LCB0dGwgKyAxKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAtIHVucmVmKCkgbm90IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zICovXG4gICAgICAgIGlmICh0LnVucmVmKSB7XG4gICAgICAgICAgdC51bnJlZigpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUl0ZW1BZ2UgPSBpbmRleCA9PiB7XG4gICAgICB0aGlzLnN0YXJ0c1tpbmRleF0gPSB0aGlzLnR0bHNbaW5kZXhdICE9PSAwID8gcGVyZi5ub3coKSA6IDBcbiAgICB9XG5cbiAgICB0aGlzLnN0YXR1c1RUTCA9IChzdGF0dXMsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy50dGwgPSB0aGlzLnR0bHNbaW5kZXhdXG4gICAgICAgIHN0YXR1cy5zdGFydCA9IHRoaXMuc3RhcnRzW2luZGV4XVxuICAgICAgICBzdGF0dXMubm93ID0gY2FjaGVkTm93IHx8IGdldE5vdygpXG4gICAgICAgIHN0YXR1cy5yZW1haW5pbmdUVEwgPSBzdGF0dXMubm93ICsgc3RhdHVzLnR0bCAtIHN0YXR1cy5zdGFydFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRlYm91bmNlIGNhbGxzIHRvIHBlcmYubm93KCkgdG8gMXMgc28gd2UncmUgbm90IGhpdHRpbmdcbiAgICAvLyB0aGF0IGNvc3RseSBjYWxsIHJlcGVhdGVkbHkuXG4gICAgbGV0IGNhY2hlZE5vdyA9IDBcbiAgICBjb25zdCBnZXROb3cgPSAoKSA9PiB7XG4gICAgICBjb25zdCBuID0gcGVyZi5ub3coKVxuICAgICAgaWYgKHRoaXMudHRsUmVzb2x1dGlvbiA+IDApIHtcbiAgICAgICAgY2FjaGVkTm93ID0gblxuICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dChcbiAgICAgICAgICAoKSA9PiAoY2FjaGVkTm93ID0gMCksXG4gICAgICAgICAgdGhpcy50dGxSZXNvbHV0aW9uXG4gICAgICAgIClcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgLSBub3QgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgKi9cbiAgICAgICAgaWYgKHQudW5yZWYpIHtcbiAgICAgICAgICB0LnVucmVmKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5cbiAgICB9XG5cbiAgICB0aGlzLmdldFJlbWFpbmluZ1RUTCA9IGtleSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMua2V5TWFwLmdldChrZXkpXG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudHRsc1tpbmRleF0gPT09IDAgfHwgdGhpcy5zdGFydHNbaW5kZXhdID09PSAwXG4gICAgICAgID8gSW5maW5pdHlcbiAgICAgICAgOiB0aGlzLnN0YXJ0c1tpbmRleF0gK1xuICAgICAgICAgICAgdGhpcy50dGxzW2luZGV4XSAtXG4gICAgICAgICAgICAoY2FjaGVkTm93IHx8IGdldE5vdygpKVxuICAgIH1cblxuICAgIHRoaXMuaXNTdGFsZSA9IGluZGV4ID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMudHRsc1tpbmRleF0gIT09IDAgJiZcbiAgICAgICAgdGhpcy5zdGFydHNbaW5kZXhdICE9PSAwICYmXG4gICAgICAgIChjYWNoZWROb3cgfHwgZ2V0Tm93KCkpIC0gdGhpcy5zdGFydHNbaW5kZXhdID5cbiAgICAgICAgICB0aGlzLnR0bHNbaW5kZXhdXG4gICAgICApXG4gICAgfVxuICB9XG4gIHVwZGF0ZUl0ZW1BZ2UoX2luZGV4KSB7fVxuICBzdGF0dXNUVEwoX3N0YXR1cywgX2luZGV4KSB7fVxuICBzZXRJdGVtVFRMKF9pbmRleCwgX3R0bCwgX3N0YXJ0KSB7fVxuICBpc1N0YWxlKF9pbmRleCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaW5pdGlhbGl6ZVNpemVUcmFja2luZygpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZWRTaXplID0gMFxuICAgIHRoaXMuc2l6ZXMgPSBuZXcgWmVyb0FycmF5KHRoaXMubWF4KVxuICAgIHRoaXMucmVtb3ZlSXRlbVNpemUgPSBpbmRleCA9PiB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZWRTaXplIC09IHRoaXMuc2l6ZXNbaW5kZXhdXG4gICAgICB0aGlzLnNpemVzW2luZGV4XSA9IDBcbiAgICB9XG4gICAgdGhpcy5yZXF1aXJlU2l6ZSA9IChrLCB2LCBzaXplLCBzaXplQ2FsY3VsYXRpb24pID0+IHtcbiAgICAgIC8vIHByb3Zpc2lvbmFsbHkgYWNjZXB0IGJhY2tncm91bmQgZmV0Y2hlcy5cbiAgICAgIC8vIGFjdHVhbCB2YWx1ZSBzaXplIHdpbGwgYmUgY2hlY2tlZCB3aGVuIHRoZXkgcmV0dXJuLlxuICAgICAgaWYgKHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cbiAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgaWYgKHNpemVDYWxjdWxhdGlvbikge1xuICAgICAgICAgIGlmICh0eXBlb2Ygc2l6ZUNhbGN1bGF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplQ2FsY3VsYXRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uJylcbiAgICAgICAgICB9XG4gICAgICAgICAgc2l6ZSA9IHNpemVDYWxjdWxhdGlvbih2LCBrKVxuICAgICAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICdzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKSdcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdpbnZhbGlkIHNpemUgdmFsdWUgKG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcikuICcgK1xuICAgICAgICAgICAgICAnV2hlbiBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZSBpcyB1c2VkLCBzaXplQ2FsY3VsYXRpb24gb3Igc2l6ZSAnICtcbiAgICAgICAgICAgICAgJ211c3QgYmUgc2V0LidcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzaXplXG4gICAgfVxuICAgIHRoaXMuYWRkSXRlbVNpemUgPSAoaW5kZXgsIHNpemUsIHN0YXR1cykgPT4ge1xuICAgICAgdGhpcy5zaXplc1tpbmRleF0gPSBzaXplXG4gICAgICBpZiAodGhpcy5tYXhTaXplKSB7XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemVzW2luZGV4XVxuICAgICAgICB3aGlsZSAodGhpcy5jYWxjdWxhdGVkU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgICB0aGlzLmV2aWN0KHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsY3VsYXRlZFNpemUgKz0gdGhpcy5zaXplc1tpbmRleF1cbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLmVudHJ5U2l6ZSA9IHNpemVcbiAgICAgICAgc3RhdHVzLnRvdGFsQ2FsY3VsYXRlZFNpemUgPSB0aGlzLmNhbGN1bGF0ZWRTaXplXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlbW92ZUl0ZW1TaXplKF9pbmRleCkge31cbiAgYWRkSXRlbVNpemUoX2luZGV4LCBfc2l6ZSkge31cbiAgcmVxdWlyZVNpemUoX2ssIF92LCBzaXplLCBzaXplQ2FsY3VsYXRpb24pIHtcbiAgICBpZiAoc2l6ZSB8fCBzaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdjYW5ub3Qgc2V0IHNpemUgd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplIG9uIGNhY2hlJ1xuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gICppbmRleGVzKHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5zaXplKSB7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy50YWlsOyB0cnVlOyApIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRJbmRleChpKSkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbG93U3RhbGUgfHwgIXRoaXMuaXNTdGFsZShpKSkge1xuICAgICAgICAgIHlpZWxkIGlcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gdGhpcy5oZWFkKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gdGhpcy5wcmV2W2ldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAqcmluZGV4ZXMoeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLnNpemUpIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLmhlYWQ7IHRydWU7ICkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZEluZGV4KGkpKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxsb3dTdGFsZSB8fCAhdGhpcy5pc1N0YWxlKGkpKSB7XG4gICAgICAgICAgeWllbGQgaVxuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSB0aGlzLnRhaWwpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkgPSB0aGlzLm5leHRbaV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzVmFsaWRJbmRleChpbmRleCkge1xuICAgIHJldHVybiAoXG4gICAgICBpbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLmtleU1hcC5nZXQodGhpcy5rZXlMaXN0W2luZGV4XSkgPT09IGluZGV4XG4gICAgKVxuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRoaXMua2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCBbdGhpcy5rZXlMaXN0W2ldLCB0aGlzLnZhbExpc3RbaV1dXG4gICAgICB9XG4gICAgfVxuICB9XG4gICpyZW50cmllcygpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5yaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRoaXMua2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCBbdGhpcy5rZXlMaXN0W2ldLCB0aGlzLnZhbExpc3RbaV1dXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgKmtleXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMua2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCB0aGlzLmtleUxpc3RbaV1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgKnJrZXlzKCkge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnJpbmRleGVzKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5rZXlMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIXRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy52YWxMaXN0W2ldKVxuICAgICAgKSB7XG4gICAgICAgIHlpZWxkIHRoaXMua2V5TGlzdFtpXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICp2YWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCB0aGlzLnZhbExpc3RbaV1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgKnJ2YWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMucmluZGV4ZXMoKSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnZhbExpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAhdGhpcy5pc0JhY2tncm91bmRGZXRjaCh0aGlzLnZhbExpc3RbaV0pXG4gICAgICApIHtcbiAgICAgICAgeWllbGQgdGhpcy52YWxMaXN0W2ldXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcygpXG4gIH1cblxuICBmaW5kKGZuLCBnZXRPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2ldXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godilcbiAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgIDogdlxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICBpZiAoZm4odmFsdWUsIHRoaXMua2V5TGlzdFtpXSwgdGhpcykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMua2V5TGlzdFtpXSwgZ2V0T3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3JFYWNoKGZuLCB0aGlzcCA9IHRoaXMpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5pbmRleGVzKCkpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbExpc3RbaV1cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgOiB2XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGZuLmNhbGwodGhpc3AsIHZhbHVlLCB0aGlzLmtleUxpc3RbaV0sIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgcmZvckVhY2goZm4sIHRoaXNwID0gdGhpcykge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnJpbmRleGVzKCkpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbExpc3RbaV1cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgOiB2XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGZuLmNhbGwodGhpc3AsIHZhbHVlLCB0aGlzLmtleUxpc3RbaV0sIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgZ2V0IHBydW5lKCkge1xuICAgIGRlcHJlY2F0ZWRNZXRob2QoJ3BydW5lJywgJ3B1cmdlU3RhbGUnKVxuICAgIHJldHVybiB0aGlzLnB1cmdlU3RhbGVcbiAgfVxuXG4gIHB1cmdlU3RhbGUoKSB7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZVxuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnJpbmRleGVzKHsgYWxsb3dTdGFsZTogdHJ1ZSB9KSkge1xuICAgICAgaWYgKHRoaXMuaXNTdGFsZShpKSkge1xuICAgICAgICB0aGlzLmRlbGV0ZSh0aGlzLmtleUxpc3RbaV0pXG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkXG4gIH1cblxuICBkdW1wKCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMua2V5TGlzdFtpXVxuICAgICAgY29uc3QgdiA9IHRoaXMudmFsTGlzdFtpXVxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICA6IHZcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgY29uc3QgZW50cnkgPSB7IHZhbHVlIH1cbiAgICAgIGlmICh0aGlzLnR0bHMpIHtcbiAgICAgICAgZW50cnkudHRsID0gdGhpcy50dGxzW2ldXG4gICAgICAgIC8vIGFsd2F5cyBkdW1wIHRoZSBzdGFydCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlIHRpbWVzdGFtcFxuICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgY29uc3QgYWdlID0gcGVyZi5ub3coKSAtIHRoaXMuc3RhcnRzW2ldXG4gICAgICAgIGVudHJ5LnN0YXJ0ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC0gYWdlKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2l6ZXMpIHtcbiAgICAgICAgZW50cnkuc2l6ZSA9IHRoaXMuc2l6ZXNbaV1cbiAgICAgIH1cbiAgICAgIGFyci51bnNoaWZ0KFtrZXksIGVudHJ5XSlcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgbG9hZChhcnIpIHtcbiAgICB0aGlzLmNsZWFyKClcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBhcnIpIHtcbiAgICAgIGlmIChlbnRyeS5zdGFydCkge1xuICAgICAgICAvLyBlbnRyeS5zdGFydCBpcyBhIHBvcnRhYmxlIHRpbWVzdGFtcCwgYnV0IHdlIG1heSBiZSB1c2luZ1xuICAgICAgICAvLyBub2RlJ3MgcGVyZm9ybWFuY2Uubm93KCksIHNvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0LlxuICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIGVudHJ5LnN0YXJ0XG4gICAgICAgIGVudHJ5LnN0YXJ0ID0gcGVyZi5ub3coKSAtIGFnZVxuICAgICAgfVxuICAgICAgdGhpcy5zZXQoa2V5LCBlbnRyeS52YWx1ZSwgZW50cnkpXG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZShfdiwgX2ssIF9yZWFzb24pIHt9XG5cbiAgc2V0KFxuICAgIGssXG4gICAgdixcbiAgICB7XG4gICAgICB0dGwgPSB0aGlzLnR0bCxcbiAgICAgIHN0YXJ0LFxuICAgICAgbm9EaXNwb3NlT25TZXQgPSB0aGlzLm5vRGlzcG9zZU9uU2V0LFxuICAgICAgc2l6ZSA9IDAsXG4gICAgICBzaXplQ2FsY3VsYXRpb24gPSB0aGlzLnNpemVDYWxjdWxhdGlvbixcbiAgICAgIG5vVXBkYXRlVFRMID0gdGhpcy5ub1VwZGF0ZVRUTCxcbiAgICAgIHN0YXR1cyxcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgc2l6ZSA9IHRoaXMucmVxdWlyZVNpemUoaywgdiwgc2l6ZSwgc2l6ZUNhbGN1bGF0aW9uKVxuICAgIC8vIGlmIHRoZSBpdGVtIGRvZXNuJ3QgZml0LCBkb24ndCBkbyBhbnl0aGluZ1xuICAgIC8vIE5COiBtYXhFbnRyeVNpemUgc2V0IHRvIG1heFNpemUgYnkgZGVmYXVsdFxuICAgIGlmICh0aGlzLm1heEVudHJ5U2l6ZSAmJiBzaXplID4gdGhpcy5tYXhFbnRyeVNpemUpIHtcbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLnNldCA9ICdtaXNzJ1xuICAgICAgICBzdGF0dXMubWF4RW50cnlTaXplRXhjZWVkZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICAvLyBoYXZlIHRvIGRlbGV0ZSwgaW4gY2FzZSBhIGJhY2tncm91bmQgZmV0Y2ggaXMgdGhlcmUgYWxyZWFkeS5cbiAgICAgIC8vIGluIG5vbi1hc3luYyBjYXNlcywgdGhpcyBpcyBhIG5vLW9wXG4gICAgICB0aGlzLmRlbGV0ZShrKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gICAgbGV0IGluZGV4ID0gdGhpcy5zaXplID09PSAwID8gdW5kZWZpbmVkIDogdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGFkZGl0aW9uXG4gICAgICBpbmRleCA9IHRoaXMubmV3SW5kZXgoKVxuICAgICAgdGhpcy5rZXlMaXN0W2luZGV4XSA9IGtcbiAgICAgIHRoaXMudmFsTGlzdFtpbmRleF0gPSB2XG4gICAgICB0aGlzLmtleU1hcC5zZXQoaywgaW5kZXgpXG4gICAgICB0aGlzLm5leHRbdGhpcy50YWlsXSA9IGluZGV4XG4gICAgICB0aGlzLnByZXZbaW5kZXhdID0gdGhpcy50YWlsXG4gICAgICB0aGlzLnRhaWwgPSBpbmRleFxuICAgICAgdGhpcy5zaXplKytcbiAgICAgIHRoaXMuYWRkSXRlbVNpemUoaW5kZXgsIHNpemUsIHN0YXR1cylcbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLnNldCA9ICdhZGQnXG4gICAgICB9XG4gICAgICBub1VwZGF0ZVRUTCA9IGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVwZGF0ZVxuICAgICAgdGhpcy5tb3ZlVG9UYWlsKGluZGV4KVxuICAgICAgY29uc3Qgb2xkVmFsID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgaWYgKHYgIT09IG9sZFZhbCkge1xuICAgICAgICBpZiAodGhpcy5pc0JhY2tncm91bmRGZXRjaChvbGRWYWwpKSB7XG4gICAgICAgICAgb2xkVmFsLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigncmVwbGFjZWQnKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW5vRGlzcG9zZU9uU2V0KSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2Uob2xkVmFsLCBrLCAnc2V0JylcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2VkLnB1c2goW29sZFZhbCwgaywgJ3NldCddKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUl0ZW1TaXplKGluZGV4KVxuICAgICAgICB0aGlzLnZhbExpc3RbaW5kZXhdID0gdlxuICAgICAgICB0aGlzLmFkZEl0ZW1TaXplKGluZGV4LCBzaXplLCBzdGF0dXMpXG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICBzdGF0dXMuc2V0ID0gJ3JlcGxhY2UnXG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPVxuICAgICAgICAgICAgb2xkVmFsICYmIHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2gob2xkVmFsKVxuICAgICAgICAgICAgICA/IG9sZFZhbC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICA6IG9sZFZhbFxuICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkKSBzdGF0dXMub2xkVmFsdWUgPSBvbGRWYWx1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMuc2V0ID0gJ3VwZGF0ZSdcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR0bCAhPT0gMCAmJiB0aGlzLnR0bCA9PT0gMCAmJiAhdGhpcy50dGxzKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVUVExUcmFja2luZygpXG4gICAgfVxuICAgIGlmICghbm9VcGRhdGVUVEwpIHtcbiAgICAgIHRoaXMuc2V0SXRlbVRUTChpbmRleCwgdHRsLCBzdGFydClcbiAgICB9XG4gICAgdGhpcy5zdGF0dXNUVEwoc3RhdHVzLCBpbmRleClcbiAgICBpZiAodGhpcy5kaXNwb3NlQWZ0ZXIpIHtcbiAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2VkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VBZnRlciguLi50aGlzLmRpc3Bvc2VkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBuZXdJbmRleCgpIHtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWlsXG4gICAgfVxuICAgIGlmICh0aGlzLnNpemUgPT09IHRoaXMubWF4ICYmIHRoaXMubWF4ICE9PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5ldmljdChmYWxzZSlcbiAgICB9XG4gICAgaWYgKHRoaXMuZnJlZS5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmZyZWUucG9wKClcbiAgICB9XG4gICAgLy8gaW5pdGlhbCBmaWxsLCBqdXN0IGtlZXAgd3JpdGluZyBkb3duIHRoZSBsaXN0XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbEZpbGwrK1xuICB9XG5cbiAgcG9wKCkge1xuICAgIGlmICh0aGlzLnNpemUpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMudmFsTGlzdFt0aGlzLmhlYWRdXG4gICAgICB0aGlzLmV2aWN0KHRydWUpXG4gICAgICByZXR1cm4gdmFsXG4gICAgfVxuICB9XG5cbiAgZXZpY3QoZnJlZSkge1xuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmhlYWRcbiAgICBjb25zdCBrID0gdGhpcy5rZXlMaXN0W2hlYWRdXG4gICAgY29uc3QgdiA9IHRoaXMudmFsTGlzdFtoZWFkXVxuICAgIGlmICh0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZXZpY3RlZCcpKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3Bvc2UodiwgaywgJ2V2aWN0JylcbiAgICAgIGlmICh0aGlzLmRpc3Bvc2VBZnRlcikge1xuICAgICAgICB0aGlzLmRpc3Bvc2VkLnB1c2goW3YsIGssICdldmljdCddKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlbW92ZUl0ZW1TaXplKGhlYWQpXG4gICAgLy8gaWYgd2UgYXJlbid0IGFib3V0IHRvIHVzZSB0aGUgaW5kZXgsIHRoZW4gbnVsbCB0aGVzZSBvdXRcbiAgICBpZiAoZnJlZSkge1xuICAgICAgdGhpcy5rZXlMaXN0W2hlYWRdID0gbnVsbFxuICAgICAgdGhpcy52YWxMaXN0W2hlYWRdID0gbnVsbFxuICAgICAgdGhpcy5mcmVlLnB1c2goaGVhZClcbiAgICB9XG4gICAgdGhpcy5oZWFkID0gdGhpcy5uZXh0W2hlYWRdXG4gICAgdGhpcy5rZXlNYXAuZGVsZXRlKGspXG4gICAgdGhpcy5zaXplLS1cbiAgICByZXR1cm4gaGVhZFxuICB9XG5cbiAgaGFzKGssIHsgdXBkYXRlQWdlT25IYXMgPSB0aGlzLnVwZGF0ZUFnZU9uSGFzLCBzdGF0dXMgfSA9IHt9KSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmtleU1hcC5nZXQoaylcbiAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RhbGUoaW5kZXgpKSB7XG4gICAgICAgIGlmICh1cGRhdGVBZ2VPbkhhcykge1xuICAgICAgICAgIHRoaXMudXBkYXRlSXRlbUFnZShpbmRleClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuaGFzID0gJ2hpdCdcbiAgICAgICAgdGhpcy5zdGF0dXNUVEwoc3RhdHVzLCBpbmRleClcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy5oYXMgPSAnc3RhbGUnXG4gICAgICAgIHRoaXMuc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgIHN0YXR1cy5oYXMgPSAnbWlzcydcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBsaWtlIGdldCgpLCBidXQgd2l0aG91dCBhbnkgTFJVIHVwZGF0aW5nIG9yIFRUTCBleHBpcmF0aW9uXG4gIHBlZWsoaywgeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgKGFsbG93U3RhbGUgfHwgIXRoaXMuaXNTdGFsZShpbmRleCkpKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgLy8gZWl0aGVyIHN0YWxlIGFuZCBhbGxvd2VkLCBvciBmb3JjaW5nIGEgcmVmcmVzaCBvZiBub24tc3RhbGUgdmFsdWVcbiAgICAgIHJldHVybiB0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHZcbiAgICB9XG4gIH1cblxuICBiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpIHtcbiAgICBjb25zdCB2ID0gaW5kZXggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMudmFsTGlzdFtpbmRleF1cbiAgICBpZiAodGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgcmV0dXJuIHZcbiAgICB9XG4gICAgY29uc3QgYWMgPSBuZXcgQUMoKVxuICAgIGlmIChvcHRpb25zLnNpZ25hbCkge1xuICAgICAgb3B0aW9ucy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PlxuICAgICAgICBhYy5hYm9ydChvcHRpb25zLnNpZ25hbC5yZWFzb24pXG4gICAgICApXG4gICAgfVxuICAgIGNvbnN0IGZldGNoT3B0cyA9IHtcbiAgICAgIHNpZ25hbDogYWMuc2lnbmFsLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGNvbnRleHQsXG4gICAgfVxuICAgIGNvbnN0IGNiID0gKHYsIHVwZGF0ZUNhY2hlID0gZmFsc2UpID0+IHtcbiAgICAgIGNvbnN0IHsgYWJvcnRlZCB9ID0gYWMuc2lnbmFsXG4gICAgICBjb25zdCBpZ25vcmVBYm9ydCA9IG9wdGlvbnMuaWdub3JlRmV0Y2hBYm9ydCAmJiB2ICE9PSB1bmRlZmluZWRcbiAgICAgIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgICAgICBpZiAoYWJvcnRlZCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEFib3J0ZWQgPSB0cnVlXG4gICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hFcnJvciA9IGFjLnNpZ25hbC5yZWFzb25cbiAgICAgICAgICBpZiAoaWdub3JlQWJvcnQpIG9wdGlvbnMuc3RhdHVzLmZldGNoQWJvcnRJZ25vcmVkID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoUmVzb2x2ZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhYm9ydGVkICYmICFpZ25vcmVBYm9ydCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgcmV0dXJuIGZldGNoRmFpbChhYy5zaWduYWwucmVhc29uKVxuICAgICAgfVxuICAgICAgLy8gZWl0aGVyIHdlIGRpZG4ndCBhYm9ydCwgYW5kIGFyZSBzdGlsbCBoZXJlLCBvciB3ZSBkaWQsIGFuZCBpZ25vcmVkXG4gICAgICBpZiAodGhpcy52YWxMaXN0W2luZGV4XSA9PT0gcCkge1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHAuX19zdGFsZVdoaWxlRmV0Y2hpbmcpIHtcbiAgICAgICAgICAgIHRoaXMudmFsTGlzdFtpbmRleF0gPSBwLl9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlKGspXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChvcHRpb25zLnN0YXR1cykgb3B0aW9ucy5zdGF0dXMuZmV0Y2hVcGRhdGVkID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuc2V0KGssIHYsIGZldGNoT3B0cy5vcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdlxuICAgIH1cbiAgICBjb25zdCBlYiA9IGVyID0+IHtcbiAgICAgIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaFJlamVjdGVkID0gdHJ1ZVxuICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEVycm9yID0gZXJcbiAgICAgIH1cbiAgICAgIHJldHVybiBmZXRjaEZhaWwoZXIpXG4gICAgfVxuICAgIGNvbnN0IGZldGNoRmFpbCA9IGVyID0+IHtcbiAgICAgIGNvbnN0IHsgYWJvcnRlZCB9ID0gYWMuc2lnbmFsXG4gICAgICBjb25zdCBhbGxvd1N0YWxlQWJvcnRlZCA9XG4gICAgICAgIGFib3J0ZWQgJiYgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0XG4gICAgICBjb25zdCBhbGxvd1N0YWxlID1cbiAgICAgICAgYWxsb3dTdGFsZUFib3J0ZWQgfHwgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvblxuICAgICAgY29uc3Qgbm9EZWxldGUgPSBhbGxvd1N0YWxlIHx8IG9wdGlvbnMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uXG4gICAgICBpZiAodGhpcy52YWxMaXN0W2luZGV4XSA9PT0gcCkge1xuICAgICAgICAvLyBpZiB3ZSBhbGxvdyBzdGFsZSBvbiBmZXRjaCByZWplY3Rpb25zLCB0aGVuIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXRcbiAgICAgICAgLy8gdGhlIHN0YWxlIHZhbHVlIGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGNhY2hlIHdoZW4gdGhlIGZldGNoIGZhaWxzLlxuICAgICAgICBjb25zdCBkZWwgPSAhbm9EZWxldGUgfHwgcC5fX3N0YWxlV2hpbGVGZXRjaGluZyA9PT0gdW5kZWZpbmVkXG4gICAgICAgIGlmIChkZWwpIHtcbiAgICAgICAgICB0aGlzLmRlbGV0ZShrKVxuICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd1N0YWxlQWJvcnRlZCkge1xuICAgICAgICAgIC8vIHN0aWxsIHJlcGxhY2UgdGhlICpwcm9taXNlKiB3aXRoIHRoZSBzdGFsZSB2YWx1ZSxcbiAgICAgICAgICAvLyBzaW5jZSB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBwcm9taXNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgLy8gbGVhdmUgaXQgdW50b3VjaGVkIGlmIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIGFuXG4gICAgICAgICAgLy8gYWJvcnRlZCBiYWNrZ3JvdW5kIGZldGNoIHRoYXQgaGFzbid0IHlldCByZXR1cm5lZC5cbiAgICAgICAgICB0aGlzLnZhbExpc3RbaW5kZXhdID0gcC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYWxsb3dTdGFsZSkge1xuICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMgJiYgcC5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3B0aW9ucy5zdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgfSBlbHNlIGlmIChwLl9fcmV0dXJuZWQgPT09IHApIHtcbiAgICAgICAgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGNhbGwgPSAocmVzLCByZWopID0+IHtcbiAgICAgIHRoaXMuZmV0Y2hNZXRob2QoaywgdiwgZmV0Y2hPcHRzKS50aGVuKHYgPT4gcmVzKHYpLCByZWopXG4gICAgICAvLyBpZ25vcmVkLCB3ZSBnbyB1bnRpbCB3ZSBmaW5pc2gsIHJlZ2FyZGxlc3MuXG4gICAgICAvLyBkZWZlciBjaGVjayB1bnRpbCB3ZSBhcmUgYWN0dWFsbHkgYWJvcnRpbmcsXG4gICAgICAvLyBzbyBmZXRjaE1ldGhvZCBjYW4gb3ZlcnJpZGUuXG4gICAgICBhYy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhb3B0aW9ucy5pZ25vcmVGZXRjaEFib3J0IHx8XG4gICAgICAgICAgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0XG4gICAgICAgICkge1xuICAgICAgICAgIHJlcygpXG4gICAgICAgICAgLy8gd2hlbiBpdCBldmVudHVhbGx5IHJlc29sdmVzLCB1cGRhdGUgdGhlIGNhY2hlLlxuICAgICAgICAgIGlmIChvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnQpIHtcbiAgICAgICAgICAgIHJlcyA9IHYgPT4gY2IodiwgdHJ1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnN0YXR1cykgb3B0aW9ucy5zdGF0dXMuZmV0Y2hEaXNwYXRjaGVkID0gdHJ1ZVxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZShwY2FsbCkudGhlbihjYiwgZWIpXG4gICAgcC5fX2Fib3J0Q29udHJvbGxlciA9IGFjXG4gICAgcC5fX3N0YWxlV2hpbGVGZXRjaGluZyA9IHZcbiAgICBwLl9fcmV0dXJuZWQgPSBudWxsXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGludGVybmFsLCBkb24ndCBleHBvc2Ugc3RhdHVzLlxuICAgICAgdGhpcy5zZXQoaywgcCwgeyAuLi5mZXRjaE9wdHMub3B0aW9ucywgc3RhdHVzOiB1bmRlZmluZWQgfSlcbiAgICAgIGluZGV4ID0gdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsTGlzdFtpbmRleF0gPSBwXG4gICAgfVxuICAgIHJldHVybiBwXG4gIH1cblxuICBpc0JhY2tncm91bmRGZXRjaChwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHAgJiZcbiAgICAgIHR5cGVvZiBwID09PSAnb2JqZWN0JyAmJlxuICAgICAgdHlwZW9mIHAudGhlbiA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICBwLFxuICAgICAgICAnX19zdGFsZVdoaWxlRmV0Y2hpbmcnXG4gICAgICApICYmXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocCwgJ19fcmV0dXJuZWQnKSAmJlxuICAgICAgKHAuX19yZXR1cm5lZCA9PT0gcCB8fCBwLl9fcmV0dXJuZWQgPT09IG51bGwpXG4gICAgKVxuICB9XG5cbiAgLy8gdGhpcyB0YWtlcyB0aGUgdW5pb24gb2YgZ2V0KCkgYW5kIHNldCgpIG9wdHMsIGJlY2F1c2UgaXQgZG9lcyBib3RoXG4gIGFzeW5jIGZldGNoKFxuICAgIGssXG4gICAge1xuICAgICAgLy8gZ2V0IG9wdGlvbnNcbiAgICAgIGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUsXG4gICAgICB1cGRhdGVBZ2VPbkdldCA9IHRoaXMudXBkYXRlQWdlT25HZXQsXG4gICAgICBub0RlbGV0ZU9uU3RhbGVHZXQgPSB0aGlzLm5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgIC8vIHNldCBvcHRpb25zXG4gICAgICB0dGwgPSB0aGlzLnR0bCxcbiAgICAgIG5vRGlzcG9zZU9uU2V0ID0gdGhpcy5ub0Rpc3Bvc2VPblNldCxcbiAgICAgIHNpemUgPSAwLFxuICAgICAgc2l6ZUNhbGN1bGF0aW9uID0gdGhpcy5zaXplQ2FsY3VsYXRpb24sXG4gICAgICBub1VwZGF0ZVRUTCA9IHRoaXMubm9VcGRhdGVUVEwsXG4gICAgICAvLyBmZXRjaCBleGNsdXNpdmUgb3B0aW9uc1xuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gdGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBpZ25vcmVGZXRjaEFib3J0ID0gdGhpcy5pZ25vcmVGZXRjaEFib3J0LFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCxcbiAgICAgIGZldGNoQ29udGV4dCA9IHRoaXMuZmV0Y2hDb250ZXh0LFxuICAgICAgZm9yY2VSZWZyZXNoID0gZmFsc2UsXG4gICAgICBzdGF0dXMsXG4gICAgICBzaWduYWwsXG4gICAgfSA9IHt9XG4gICkge1xuICAgIGlmICghdGhpcy5mZXRjaE1ldGhvZCkge1xuICAgICAgaWYgKHN0YXR1cykgc3RhdHVzLmZldGNoID0gJ2dldCdcbiAgICAgIHJldHVybiB0aGlzLmdldChrLCB7XG4gICAgICAgIGFsbG93U3RhbGUsXG4gICAgICAgIHVwZGF0ZUFnZU9uR2V0LFxuICAgICAgICBub0RlbGV0ZU9uU3RhbGVHZXQsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGFsbG93U3RhbGUsXG4gICAgICB1cGRhdGVBZ2VPbkdldCxcbiAgICAgIG5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgIHR0bCxcbiAgICAgIG5vRGlzcG9zZU9uU2V0LFxuICAgICAgc2l6ZSxcbiAgICAgIHNpemVDYWxjdWxhdGlvbixcbiAgICAgIG5vVXBkYXRlVFRMLFxuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0LFxuICAgICAgaWdub3JlRmV0Y2hBYm9ydCxcbiAgICAgIHN0YXR1cyxcbiAgICAgIHNpZ25hbCxcbiAgICB9XG5cbiAgICBsZXQgaW5kZXggPSB0aGlzLmtleU1hcC5nZXQoaylcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHN0YXR1cykgc3RhdHVzLmZldGNoID0gJ21pc3MnXG4gICAgICBjb25zdCBwID0gdGhpcy5iYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGZldGNoQ29udGV4dClcbiAgICAgIHJldHVybiAocC5fX3JldHVybmVkID0gcClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW4gY2FjaGUsIG1heWJlIGFscmVhZHkgZmV0Y2hpbmdcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbExpc3RbaW5kZXhdXG4gICAgICBpZiAodGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICBjb25zdCBzdGFsZSA9XG4gICAgICAgICAgYWxsb3dTdGFsZSAmJiB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWRcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdpbmZsaWdodCdcbiAgICAgICAgICBpZiAoc3RhbGUpIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGFsZSA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiAodi5fX3JldHVybmVkID0gdilcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgZm9yY2UgYSByZWZyZXNoLCB0aGF0IG1lYW5zIGRvIE5PVCBzZXJ2ZSB0aGUgY2FjaGVkIHZhbHVlLFxuICAgICAgLy8gdW5sZXNzIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIHJlZnJlc2hpbmcgdGhlIGNhY2hlLlxuICAgICAgY29uc3QgaXNTdGFsZSA9IHRoaXMuaXNTdGFsZShpbmRleClcbiAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmICFpc1N0YWxlKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHN0YXR1cy5mZXRjaCA9ICdoaXQnXG4gICAgICAgIHRoaXMubW92ZVRvVGFpbChpbmRleClcbiAgICAgICAgaWYgKHVwZGF0ZUFnZU9uR2V0KSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVJdGVtQWdlKGluZGV4KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICAgIHJldHVybiB2XG4gICAgICB9XG5cbiAgICAgIC8vIG9rLCBpdCBpcyBzdGFsZSBvciBhIGZvcmNlZCByZWZyZXNoLCBhbmQgbm90IGFscmVhZHkgZmV0Y2hpbmcuXG4gICAgICAvLyByZWZyZXNoIHRoZSBjYWNoZS5cbiAgICAgIGNvbnN0IHAgPSB0aGlzLmJhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgZmV0Y2hDb250ZXh0KVxuICAgICAgY29uc3QgaGFzU3RhbGUgPSBwLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHN0YWxlVmFsID0gaGFzU3RhbGUgJiYgYWxsb3dTdGFsZVxuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMuZmV0Y2ggPSBoYXNTdGFsZSAmJiBpc1N0YWxlID8gJ3N0YWxlJyA6ICdyZWZyZXNoJ1xuICAgICAgICBpZiAoc3RhbGVWYWwgJiYgaXNTdGFsZSkgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhbGVWYWwgPyBwLl9fc3RhbGVXaGlsZUZldGNoaW5nIDogKHAuX19yZXR1cm5lZCA9IHApXG4gICAgfVxuICB9XG5cbiAgZ2V0KFxuICAgIGssXG4gICAge1xuICAgICAgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSxcbiAgICAgIHVwZGF0ZUFnZU9uR2V0ID0gdGhpcy51cGRhdGVBZ2VPbkdldCxcbiAgICAgIG5vRGVsZXRlT25TdGFsZUdldCA9IHRoaXMubm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgc3RhdHVzLFxuICAgIH0gPSB7fVxuICApIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMua2V5TWFwLmdldChrKVxuICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsTGlzdFtpbmRleF1cbiAgICAgIGNvbnN0IGZldGNoaW5nID0gdGhpcy5pc0JhY2tncm91bmRGZXRjaCh2YWx1ZSlcbiAgICAgIHRoaXMuc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICBpZiAodGhpcy5pc1N0YWxlKGluZGV4KSkge1xuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuZ2V0ID0gJ3N0YWxlJ1xuICAgICAgICAvLyBkZWxldGUgb25seSBpZiBub3QgYW4gaW4tZmxpZ2h0IGJhY2tncm91bmQgZmV0Y2hcbiAgICAgICAgaWYgKCFmZXRjaGluZykge1xuICAgICAgICAgIGlmICghbm9EZWxldGVPblN0YWxlR2V0KSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZShrKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IGFsbG93U3RhbGVcbiAgICAgICAgICByZXR1cm4gYWxsb3dTdGFsZSA/IHZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgc3RhdHVzLnJldHVybmVkU3RhbGUgPVxuICAgICAgICAgICAgICBhbGxvd1N0YWxlICYmIHZhbHVlLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFsbG93U3RhbGUgPyB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuZ2V0ID0gJ2hpdCdcbiAgICAgICAgLy8gaWYgd2UncmUgY3VycmVudGx5IGZldGNoaW5nIGl0LCB3ZSBkb24ndCBhY3R1YWxseSBoYXZlIGl0IHlldFxuICAgICAgICAvLyBpdCdzIG5vdCBzdGFsZSwgd2hpY2ggbWVhbnMgdGhpcyBpc24ndCBhIHN0YWxlV2hpbGVSZWZldGNoaW5nLlxuICAgICAgICAvLyBJZiBpdCdzIG5vdCBzdGFsZSwgYW5kIGZldGNoaW5nLCBBTkQgaGFzIGEgX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgLy8gdmFsdWUsIHRoZW4gdGhhdCBtZWFucyB0aGUgdXNlciBmZXRjaGVkIHdpdGgge2ZvcmNlUmVmcmVzaDp0cnVlfSxcbiAgICAgICAgLy8gc28gaXQncyBzYWZlIHRvIHJldHVybiB0aGF0IHZhbHVlLlxuICAgICAgICBpZiAoZmV0Y2hpbmcpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vdmVUb1RhaWwoaW5kZXgpXG4gICAgICAgIGlmICh1cGRhdGVBZ2VPbkdldCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlSXRlbUFnZShpbmRleClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLmdldCA9ICdtaXNzJ1xuICAgIH1cbiAgfVxuXG4gIGNvbm5lY3QocCwgbikge1xuICAgIHRoaXMucHJldltuXSA9IHBcbiAgICB0aGlzLm5leHRbcF0gPSBuXG4gIH1cblxuICBtb3ZlVG9UYWlsKGluZGV4KSB7XG4gICAgLy8gaWYgdGFpbCBhbHJlYWR5LCBub3RoaW5nIHRvIGRvXG4gICAgLy8gaWYgaGVhZCwgbW92ZSBoZWFkIHRvIG5leHRbaW5kZXhdXG4gICAgLy8gZWxzZVxuICAgIC8vICAgbW92ZSBuZXh0W3ByZXZbaW5kZXhdXSB0byBuZXh0W2luZGV4XSAoaGVhZCBoYXMgbm8gcHJldilcbiAgICAvLyAgIG1vdmUgcHJldltuZXh0W2luZGV4XV0gdG8gcHJldltpbmRleF1cbiAgICAvLyBwcmV2W2luZGV4XSA9IHRhaWxcbiAgICAvLyBuZXh0W3RhaWxdID0gaW5kZXhcbiAgICAvLyB0YWlsID0gaW5kZXhcbiAgICBpZiAoaW5kZXggIT09IHRoaXMudGFpbCkge1xuICAgICAgaWYgKGluZGV4ID09PSB0aGlzLmhlYWQpIHtcbiAgICAgICAgdGhpcy5oZWFkID0gdGhpcy5uZXh0W2luZGV4XVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25uZWN0KHRoaXMucHJldltpbmRleF0sIHRoaXMubmV4dFtpbmRleF0pXG4gICAgICB9XG4gICAgICB0aGlzLmNvbm5lY3QodGhpcy50YWlsLCBpbmRleClcbiAgICAgIHRoaXMudGFpbCA9IGluZGV4XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRlbCgpIHtcbiAgICBkZXByZWNhdGVkTWV0aG9kKCdkZWwnLCAnZGVsZXRlJylcbiAgICByZXR1cm4gdGhpcy5kZWxldGVcbiAgfVxuXG4gIGRlbGV0ZShrKSB7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZVxuICAgIGlmICh0aGlzLnNpemUgIT09IDApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGVkID0gdHJ1ZVxuICAgICAgICBpZiAodGhpcy5zaXplID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5jbGVhcigpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVJdGVtU2l6ZShpbmRleClcbiAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgICAgIGlmICh0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZGVsZXRlZCcpKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2UodiwgaywgJ2RlbGV0ZScpXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlZC5wdXNoKFt2LCBrLCAnZGVsZXRlJ10pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMua2V5TWFwLmRlbGV0ZShrKVxuICAgICAgICAgIHRoaXMua2V5TGlzdFtpbmRleF0gPSBudWxsXG4gICAgICAgICAgdGhpcy52YWxMaXN0W2luZGV4XSA9IG51bGxcbiAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMudGFpbCkge1xuICAgICAgICAgICAgdGhpcy50YWlsID0gdGhpcy5wcmV2W2luZGV4XVxuICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuaGVhZCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkID0gdGhpcy5uZXh0W2luZGV4XVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5leHRbdGhpcy5wcmV2W2luZGV4XV0gPSB0aGlzLm5leHRbaW5kZXhdXG4gICAgICAgICAgICB0aGlzLnByZXZbdGhpcy5uZXh0W2luZGV4XV0gPSB0aGlzLnByZXZbaW5kZXhdXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2l6ZS0tXG4gICAgICAgICAgdGhpcy5mcmVlLnB1c2goaW5kZXgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2VkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VBZnRlciguLi50aGlzLmRpc3Bvc2VkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkXG4gIH1cblxuICBjbGVhcigpIHtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIHRoaXMucmluZGV4ZXMoeyBhbGxvd1N0YWxlOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgaWYgKHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2RlbGV0ZWQnKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGsgPSB0aGlzLmtleUxpc3RbaW5kZXhdXG4gICAgICAgIHRoaXMuZGlzcG9zZSh2LCBrLCAnZGVsZXRlJylcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgdGhpcy5kaXNwb3NlZC5wdXNoKFt2LCBrLCAnZGVsZXRlJ10pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtleU1hcC5jbGVhcigpXG4gICAgdGhpcy52YWxMaXN0LmZpbGwobnVsbClcbiAgICB0aGlzLmtleUxpc3QuZmlsbChudWxsKVxuICAgIGlmICh0aGlzLnR0bHMpIHtcbiAgICAgIHRoaXMudHRscy5maWxsKDApXG4gICAgICB0aGlzLnN0YXJ0cy5maWxsKDApXG4gICAgfVxuICAgIGlmICh0aGlzLnNpemVzKSB7XG4gICAgICB0aGlzLnNpemVzLmZpbGwoMClcbiAgICB9XG4gICAgdGhpcy5oZWFkID0gMFxuICAgIHRoaXMudGFpbCA9IDBcbiAgICB0aGlzLmluaXRpYWxGaWxsID0gMVxuICAgIHRoaXMuZnJlZS5sZW5ndGggPSAwXG4gICAgdGhpcy5jYWxjdWxhdGVkU2l6ZSA9IDBcbiAgICB0aGlzLnNpemUgPSAwXG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2VkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VBZnRlciguLi50aGlzLmRpc3Bvc2VkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlc2V0KCkge1xuICAgIGRlcHJlY2F0ZWRNZXRob2QoJ3Jlc2V0JywgJ2NsZWFyJylcbiAgICByZXR1cm4gdGhpcy5jbGVhclxuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICBkZXByZWNhdGVkUHJvcGVydHkoJ2xlbmd0aCcsICdzaXplJylcbiAgICByZXR1cm4gdGhpcy5zaXplXG4gIH1cblxuICBzdGF0aWMgZ2V0IEFib3J0Q29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gQUNcbiAgfVxuICBzdGF0aWMgZ2V0IEFib3J0U2lnbmFsKCkge1xuICAgIHJldHVybiBBU1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTFJVQ2FjaGVcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5cbmxldCBzaGltO1xuY2xhc3MgWTE4TiB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICAvLyBjb25maWd1cmFibGUgb3B0aW9ucy5cbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gb3B0cy5kaXJlY3RvcnkgfHwgJy4vbG9jYWxlcyc7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsZXMgPSB0eXBlb2Ygb3B0cy51cGRhdGVGaWxlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy51cGRhdGVGaWxlcyA6IHRydWU7XG4gICAgICAgIHRoaXMubG9jYWxlID0gb3B0cy5sb2NhbGUgfHwgJ2VuJztcbiAgICAgICAgdGhpcy5mYWxsYmFja1RvTGFuZ3VhZ2UgPSB0eXBlb2Ygb3B0cy5mYWxsYmFja1RvTGFuZ3VhZ2UgPT09ICdib29sZWFuJyA/IG9wdHMuZmFsbGJhY2tUb0xhbmd1YWdlIDogdHJ1ZTtcbiAgICAgICAgLy8gaW50ZXJuYWwgc3R1ZmYuXG4gICAgICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLndyaXRlUXVldWUgPSBbXTtcbiAgICB9XG4gICAgX18oLi4uYXJncykge1xuICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90YWdnZWRMaXRlcmFsKGFyZ3VtZW50c1swXSwgLi4uYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHIgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGxldCBjYiA9IGZ1bmN0aW9uICgpIHsgfTsgLy8gc3RhcnQgd2l0aCBub29wLlxuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiID0gYXJncy5wb3AoKTtcbiAgICAgICAgY2IgPSBjYiB8fCBmdW5jdGlvbiAoKSB7IH07IC8vIG5vb3AuXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICAvLyB3ZSd2ZSBvYnNlcnZlZCBhIG5ldyBzdHJpbmcsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgZmlsZS5cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzdHJdICYmIHRoaXMudXBkYXRlRmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gPSBzdHI7XG4gICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgbG9jYWxlLFxuICAgICAgICAgICAgLy8gc2luY2UgdGhlc2UgdmFsdWVzIGNvdWxkIGNoYW5nZSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyB3cml0ZSBpcyBwZXJmb3JtZWQuXG4gICAgICAgICAgICB0aGlzLl9lbnF1ZXVlV3JpdGUoe1xuICAgICAgICAgICAgICAgIGRpcmVjdG9yeTogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICAgICAgICBjYlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgW3RoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gfHwgc3RyXS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgICBfX24oKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICBjb25zdCBzaW5ndWxhciA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgY29uc3QgcGx1cmFsID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBjb25zdCBxdWFudGl0eSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgbGV0IGNiID0gZnVuY3Rpb24gKCkgeyB9OyAvLyBzdGFydCB3aXRoIG5vb3AuXG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IgPSBhcmdzLnBvcCgpO1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdKVxuICAgICAgICAgICAgdGhpcy5fcmVhZExvY2FsZUZpbGUoKTtcbiAgICAgICAgbGV0IHN0ciA9IHF1YW50aXR5ID09PSAxID8gc2luZ3VsYXIgOiBwbHVyYWw7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdO1xuICAgICAgICAgICAgc3RyID0gZW50cnlbcXVhbnRpdHkgPT09IDEgPyAnb25lJyA6ICdvdGhlciddO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdlJ3ZlIG9ic2VydmVkIGEgbmV3IHN0cmluZywgdXBkYXRlIHRoZSBsYW5ndWFnZSBmaWxlLlxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXSAmJiB0aGlzLnVwZGF0ZUZpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0gPSB7XG4gICAgICAgICAgICAgICAgb25lOiBzaW5ndWxhcixcbiAgICAgICAgICAgICAgICBvdGhlcjogcGx1cmFsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGxvY2FsZSxcbiAgICAgICAgICAgIC8vIHNpbmNlIHRoZXNlIHZhbHVlcyBjb3VsZCBjaGFuZ2UgYmVmb3JlIHRoZVxuICAgICAgICAgICAgLy8gd3JpdGUgaXMgcGVyZm9ybWVkLlxuICAgICAgICAgICAgdGhpcy5fZW5xdWV1ZVdyaXRlKHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuZGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgICAgICAgY2JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhICVkIHBsYWNlaG9sZGVyIGlzIHByb3ZpZGVkLCBhZGQgcXVhbnRpdHlcbiAgICAgICAgLy8gdG8gdGhlIGFyZ3VtZW50cyBleHBhbmRlZCBieSB1dGlsLmZvcm1hdC5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gW3N0cl07XG4gICAgICAgIGlmICh+c3RyLmluZGV4T2YoJyVkJykpXG4gICAgICAgICAgICB2YWx1ZXMucHVzaChxdWFudGl0eSk7XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgdmFsdWVzLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICAgIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgfVxuICAgIGdldExvY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlO1xuICAgIH1cbiAgICB1cGRhdGVMb2NhbGUob2JqKSB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1ba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIF90YWdnZWRMaXRlcmFsKHBhcnRzLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgcGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCwgaSkge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpICsgMV07XG4gICAgICAgICAgICBzdHIgKz0gcGFydDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHN0ciArPSAnJXMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX18uYXBwbHkodGhpcywgW3N0cl0uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJncywgMSkpKTtcbiAgICB9XG4gICAgX2VucXVldWVXcml0ZSh3b3JrKSB7XG4gICAgICAgIHRoaXMud3JpdGVRdWV1ZS5wdXNoKHdvcmspO1xuICAgICAgICBpZiAodGhpcy53cml0ZVF1ZXVlLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NXcml0ZVF1ZXVlKCk7XG4gICAgfVxuICAgIF9wcm9jZXNzV3JpdGVRdWV1ZSgpIHtcbiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xuICAgICAgICBjb25zdCB3b3JrID0gdGhpcy53cml0ZVF1ZXVlWzBdO1xuICAgICAgICAvLyBkZXN0cnVjdHVyZSB0aGUgZW5xdWV1ZWQgd29yay5cbiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gd29yay5kaXJlY3Rvcnk7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9IHdvcmsubG9jYWxlO1xuICAgICAgICBjb25zdCBjYiA9IHdvcmsuY2I7XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHRoaXMuX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZExvY2FsZSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY2FjaGVbbG9jYWxlXSwgbnVsbCwgMik7XG4gICAgICAgIHNoaW0uZnMud3JpdGVGaWxlKGxhbmd1YWdlRmlsZSwgc2VyaWFsaXplZExvY2FsZSwgJ3V0Zi04JywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgX3RoaXMud3JpdGVRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKF90aGlzLndyaXRlUXVldWUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBfdGhpcy5fcHJvY2Vzc1dyaXRlUXVldWUoKTtcbiAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcmVhZExvY2FsZUZpbGUoKSB7XG4gICAgICAgIGxldCBsb2NhbGVMb29rdXAgPSB7fTtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VGaWxlID0gdGhpcy5fcmVzb2x2ZUxvY2FsZUZpbGUodGhpcy5kaXJlY3RvcnksIHRoaXMubG9jYWxlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBidW5kbGVyIHN1Y2ggYXMgd2VicGFjaywgcmVhZEZpbGVTeW5jIG1heSBub3QgYmUgZGVmaW5lZDpcbiAgICAgICAgICAgIGlmIChzaGltLmZzLnJlYWRGaWxlU3luYykge1xuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IEpTT04ucGFyc2Uoc2hpbS5mcy5yZWFkRmlsZVN5bmMobGFuZ3VhZ2VGaWxlLCAndXRmLTgnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSAnc3ludGF4IGVycm9yIGluICcgKyBsYW5ndWFnZUZpbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKVxuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IHt9O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSA9IGxvY2FsZUxvb2t1cDtcbiAgICB9XG4gICAgX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKSB7XG4gICAgICAgIGxldCBmaWxlID0gc2hpbS5yZXNvbHZlKGRpcmVjdG9yeSwgJy4vJywgbG9jYWxlICsgJy5qc29uJyk7XG4gICAgICAgIGlmICh0aGlzLmZhbGxiYWNrVG9MYW5ndWFnZSAmJiAhdGhpcy5fZmlsZUV4aXN0c1N5bmMoZmlsZSkgJiYgfmxvY2FsZS5sYXN0SW5kZXhPZignXycpKSB7XG4gICAgICAgICAgICAvLyBhdHRlbXB0IGZhbGxiYWNrIHRvIGxhbmd1YWdlIG9ubHlcbiAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHNoaW0ucmVzb2x2ZShkaXJlY3RvcnksICcuLycsIGxvY2FsZS5zcGxpdCgnXycpWzBdICsgJy5qc29uJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZmlsZUV4aXN0c1N5bmMobGFuZ3VhZ2VGaWxlKSlcbiAgICAgICAgICAgICAgICBmaWxlID0gbGFuZ3VhZ2VGaWxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cbiAgICBfZmlsZUV4aXN0c1N5bmMoZmlsZSkge1xuICAgICAgICByZXR1cm4gc2hpbS5leGlzdHMoZmlsZSk7XG4gICAgfVxufVxuZnVuY3Rpb24geTE4biQxKG9wdHMsIF9zaGltKSB7XG4gICAgc2hpbSA9IF9zaGltO1xuICAgIGNvbnN0IHkxOG4gPSBuZXcgWTE4TihvcHRzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBfXzogeTE4bi5fXy5iaW5kKHkxOG4pLFxuICAgICAgICBfX246IHkxOG4uX19uLmJpbmQoeTE4biksXG4gICAgICAgIHNldExvY2FsZTogeTE4bi5zZXRMb2NhbGUuYmluZCh5MThuKSxcbiAgICAgICAgZ2V0TG9jYWxlOiB5MThuLmdldExvY2FsZS5iaW5kKHkxOG4pLFxuICAgICAgICB1cGRhdGVMb2NhbGU6IHkxOG4udXBkYXRlTG9jYWxlLmJpbmQoeTE4biksXG4gICAgICAgIGxvY2FsZTogeTE4bi5sb2NhbGVcbiAgICB9O1xufVxuXG52YXIgbm9kZVBsYXRmb3JtU2hpbSA9IHtcbiAgICBmczoge1xuICAgICAgICByZWFkRmlsZVN5bmM6IGZzLnJlYWRGaWxlU3luYyxcbiAgICAgICAgd3JpdGVGaWxlOiBmcy53cml0ZUZpbGVcbiAgICB9LFxuICAgIGZvcm1hdDogdXRpbC5mb3JtYXQsXG4gICAgcmVzb2x2ZTogcGF0aC5yZXNvbHZlLFxuICAgIGV4aXN0czogKGZpbGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBmcy5zdGF0U3luYyhmaWxlKS5pc0ZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jb25zdCB5MThuID0gKG9wdHMpID0+IHtcbiAgICByZXR1cm4geTE4biQxKG9wdHMsIG5vZGVQbGF0Zm9ybVNoaW0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB5MThuO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcblxuZnVuY3Rpb24gY2FtZWxDYXNlKHN0cikge1xuICAgIGNvbnN0IGlzQ2FtZWxDYXNlID0gc3RyICE9PSBzdHIudG9Mb3dlckNhc2UoKSAmJiBzdHIgIT09IHN0ci50b1VwcGVyQ2FzZSgpO1xuICAgIGlmICghaXNDYW1lbENhc2UpIHtcbiAgICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmIChzdHIuaW5kZXhPZignLScpID09PSAtMSAmJiBzdHIuaW5kZXhPZignXycpID09PSAtMSkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNhbWVsY2FzZSA9ICcnO1xuICAgICAgICBsZXQgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdIeXBoZW5zID0gc3RyLm1hdGNoKC9eLSsvKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxlYWRpbmdIeXBoZW5zID8gbGVhZGluZ0h5cGhlbnNbMF0ubGVuZ3RoIDogMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNociA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAobmV4dENoclVwcGVyKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hyID0gY2hyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gMCAmJiAoY2hyID09PSAnLScgfHwgY2hyID09PSAnXycpKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNociAhPT0gJy0nICYmIGNociAhPT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgY2FtZWxjYXNlICs9IGNocjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FtZWxjYXNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRlY2FtZWxpemUoc3RyLCBqb2luU3RyaW5nKSB7XG4gICAgY29uc3QgbG93ZXJjYXNlID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgam9pblN0cmluZyA9IGpvaW5TdHJpbmcgfHwgJy0nO1xuICAgIGxldCBub3RDYW1lbGNhc2UgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaHJMb3dlciA9IGxvd2VyY2FzZS5jaGFyQXQoaSk7XG4gICAgICAgIGNvbnN0IGNoclN0cmluZyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChjaHJMb3dlciAhPT0gY2hyU3RyaW5nICYmIGkgPiAwKSB7XG4gICAgICAgICAgICBub3RDYW1lbGNhc2UgKz0gYCR7am9pblN0cmluZ30ke2xvd2VyY2FzZS5jaGFyQXQoaSl9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5vdENhbWVsY2FzZSArPSBjaHJTdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vdENhbWVsY2FzZTtcbn1cbmZ1bmN0aW9uIGxvb2tzTGlrZU51bWJlcih4KSB7XG4gICAgaWYgKHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKC9eMHhbMC05YS1mXSskL2kudGVzdCh4KSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKC9eMFteLl0vLnRlc3QoeCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gL15bLV0/KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKShlWy0rXT9cXGQrKT8kLy50ZXN0KHgpO1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUFyZ1N0cmluZyhhcmdTdHJpbmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdTdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBhcmdTdHJpbmcubWFwKGUgPT4gdHlwZW9mIGUgIT09ICdzdHJpbmcnID8gZSArICcnIDogZSk7XG4gICAgfVxuICAgIGFyZ1N0cmluZyA9IGFyZ1N0cmluZy50cmltKCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBwcmV2QyA9IG51bGw7XG4gICAgbGV0IGMgPSBudWxsO1xuICAgIGxldCBvcGVuaW5nID0gbnVsbDtcbiAgICBjb25zdCBhcmdzID0gW107XG4gICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGFyZ1N0cmluZy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgcHJldkMgPSBjO1xuICAgICAgICBjID0gYXJnU3RyaW5nLmNoYXJBdChpaSk7XG4gICAgICAgIGlmIChjID09PSAnICcgJiYgIW9wZW5pbmcpIHtcbiAgICAgICAgICAgIGlmICghKHByZXZDID09PSAnICcpKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09IG9wZW5pbmcpIHtcbiAgICAgICAgICAgIG9wZW5pbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjID09PSBcIidcIiB8fCBjID09PSAnXCInKSAmJiAhb3BlbmluZykge1xuICAgICAgICAgICAgb3BlbmluZyA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmdzW2ldKVxuICAgICAgICAgICAgYXJnc1tpXSA9ICcnO1xuICAgICAgICBhcmdzW2ldICs9IGM7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuXG52YXIgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXk7XG4oZnVuY3Rpb24gKERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5KSB7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJCT09MRUFOXCJdID0gXCJib29sZWFuXCI7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJTVFJJTkdcIl0gPSBcInN0cmluZ1wiO1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiTlVNQkVSXCJdID0gXCJudW1iZXJcIjtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIkFSUkFZXCJdID0gXCJhcnJheVwiO1xufSkoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgfHwgKERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5ID0ge30pKTtcblxubGV0IG1peGluO1xuY2xhc3MgWWFyZ3NQYXJzZXIge1xuICAgIGNvbnN0cnVjdG9yKF9taXhpbikge1xuICAgICAgICBtaXhpbiA9IF9taXhpbjtcbiAgICB9XG4gICAgcGFyc2UoYXJnc0lucHV0LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIGFsaWFzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcnJheTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9vbGVhbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29uZmlnOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWdPYmplY3RzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb2VyY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvdW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlbnZQcmVmaXg6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5hcmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5vcm1hbGl6ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3RyaW5nOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBudW1iZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIF9fOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBrZXk6IHVuZGVmaW5lZFxuICAgICAgICB9LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgYXJncyA9IHRva2VuaXplQXJnU3RyaW5nKGFyZ3NJbnB1dCk7XG4gICAgICAgIGNvbnN0IGlucHV0SXNTdHJpbmcgPSB0eXBlb2YgYXJnc0lucHV0ID09PSAnc3RyaW5nJztcbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IGNvbWJpbmVBbGlhc2VzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5hbGlhcykpO1xuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAnYm9vbGVhbi1uZWdhdGlvbic6IHRydWUsXG4gICAgICAgICAgICAnY2FtZWwtY2FzZS1leHBhbnNpb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2NvbWJpbmUtYXJyYXlzJzogZmFsc2UsXG4gICAgICAgICAgICAnZG90LW5vdGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgICAgICdkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5JzogdHJ1ZSxcbiAgICAgICAgICAgICdmbGF0dGVuLWR1cGxpY2F0ZS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2dyZWVkeS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2hhbHQtYXQtbm9uLW9wdGlvbic6IGZhbHNlLFxuICAgICAgICAgICAgJ25hcmdzLWVhdHMtb3B0aW9ucyc6IGZhbHNlLFxuICAgICAgICAgICAgJ25lZ2F0aW9uLXByZWZpeCc6ICduby0nLFxuICAgICAgICAgICAgJ3BhcnNlLW51bWJlcnMnOiB0cnVlLFxuICAgICAgICAgICAgJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyc6IHRydWUsXG4gICAgICAgICAgICAncG9wdWxhdGUtLSc6IGZhbHNlLFxuICAgICAgICAgICAgJ3NldC1wbGFjZWhvbGRlci1rZXknOiBmYWxzZSxcbiAgICAgICAgICAgICdzaG9ydC1vcHRpb24tZ3JvdXBzJzogdHJ1ZSxcbiAgICAgICAgICAgICdzdHJpcC1hbGlhc2VkJzogZmFsc2UsXG4gICAgICAgICAgICAnc3RyaXAtZGFzaGVkJzogZmFsc2UsXG4gICAgICAgICAgICAndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnOiBmYWxzZVxuICAgICAgICB9LCBvcHRzLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5kZWZhdWx0KTtcbiAgICAgICAgY29uc3QgY29uZmlnT2JqZWN0cyA9IG9wdHMuY29uZmlnT2JqZWN0cyB8fCBbXTtcbiAgICAgICAgY29uc3QgZW52UHJlZml4ID0gb3B0cy5lbnZQcmVmaXg7XG4gICAgICAgIGNvbnN0IG5vdEZsYWdzT3B0aW9uID0gY29uZmlndXJhdGlvblsncG9wdWxhdGUtLSddO1xuICAgICAgICBjb25zdCBub3RGbGFnc0FyZ3YgPSBub3RGbGFnc09wdGlvbiA/ICctLScgOiAnXyc7XG4gICAgICAgIGNvbnN0IG5ld0FsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBkZWZhdWx0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBfXyA9IG9wdHMuX18gfHwgbWl4aW4uZm9ybWF0O1xuICAgICAgICBjb25zdCBmbGFncyA9IHtcbiAgICAgICAgICAgIGFsaWFzZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBhcnJheXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBib29sczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIHN0cmluZ3M6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBudW1iZXJzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY291bnRzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgbm9ybWFsaXplOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29uZmlnczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG5hcmdzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29lcmNpb25zOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAga2V5czogW11cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmUgPSAvXi0oWzAtOV0rKFxcLlswLTldKyk/fFxcLlswLTldKykkLztcbiAgICAgICAgY29uc3QgbmVnYXRlZEJvb2xlYW4gPSBuZXcgUmVnRXhwKCdeLS0nICsgY29uZmlndXJhdGlvblsnbmVnYXRpb24tcHJlZml4J10gKyAnKC4rKScpO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5hcnJheSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdHlwZW9mIG9wdCA9PT0gJ29iamVjdCcgPyBvcHQua2V5IDogb3B0O1xuICAgICAgICAgICAgY29uc3QgYXNzaWdubWVudCA9IE9iamVjdC5rZXlzKG9wdCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUZsYWdLZXlzID0ge1xuICAgICAgICAgICAgICAgICAgICBib29sZWFuOiAnYm9vbHMnLFxuICAgICAgICAgICAgICAgICAgICBzdHJpbmc6ICdzdHJpbmdzJyxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiAnbnVtYmVycydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheUZsYWdLZXlzW2tleV07XG4gICAgICAgICAgICB9KS5maWx0ZXIoQm9vbGVhbikucG9wKCk7XG4gICAgICAgICAgICBpZiAoYXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZsYWdzW2Fzc2lnbm1lbnRdW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmxhZ3MuYXJyYXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5ib29sZWFuIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5ib29sc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMuc3RyaW5nIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5zdHJpbmdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5udW1iZXIgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLm51bWJlcnNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmNvdW50IHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5jb3VudHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLm5vcm1hbGl6ZSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZmxhZ3Mubm9ybWFsaXplW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubmFyZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMubmFyZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MubmFyZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY29lcmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb2VyY2UpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29lcmNpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmNvbmZpZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMuY29uZmlnKSB8fCB0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgW10uY29uY2F0KG9wdHMuY29uZmlnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNvbmZpZ3Nba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb25maWcpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5jb25maWdzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV4dGVuZEFsaWFzZXMob3B0cy5rZXksIGFsaWFzZXMsIG9wdHMuZGVmYXVsdCwgZmxhZ3MuYXJyYXlzKTtcbiAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgKGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1thbGlhc10gPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgbGV0IG5vdEZsYWdzID0gW107XG4gICAgICAgIGNvbnN0IGFyZ3YgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHsgXzogW10gfSk7XG4gICAgICAgIGNvbnN0IGFyZ3ZSZXR1cm4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkQXJnID0gYXJnLnJlcGxhY2UoL14tezMsfS8sICctLS0nKTtcbiAgICAgICAgICAgIGxldCBicm9rZW47XG4gICAgICAgICAgICBsZXQga2V5O1xuICAgICAgICAgICAgbGV0IGxldHRlcnM7XG4gICAgICAgICAgICBsZXQgbTtcbiAgICAgICAgICAgIGxldCBuZXh0O1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKGFyZyAhPT0gJy0tJyAmJiAvXi0vLnRlc3QoYXJnKSAmJiBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRydW5jYXRlZEFyZy5tYXRjaCgvXi0tLSsoPXwkKS8pKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLis9LykgfHwgKCFjb25maWd1cmF0aW9uWydzaG9ydC1vcHRpb24tZ3JvdXBzJ10gJiYgYXJnLm1hdGNoKC9eLS4rPS8pKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tLT8oW149XSspPShbXFxzXFxTXSopJC8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKG1bMV0sIGZsYWdzLmFycmF5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXRBcnJheShpLCBtWzFdLCBhcmdzLCBtWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMobVsxXSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIG1bMV0sIGFyZ3MsIG1bMl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKSAmJiBjb25maWd1cmF0aW9uWydib29sZWFuLW5lZ2F0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSA/IFtmYWxzZV0gOiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS0uKy8pIHx8ICghY29uZmlndXJhdGlvblsnc2hvcnQtb3B0aW9uLWdyb3VwcyddICYmIGFyZy5tYXRjaCgvXi1bXi1dKy8pKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tLT8oLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCFuZXh0Lm1hdGNoKC9eLS8pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS5cXC4uKz0vKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tKFtePV0rKT0oW1xcc1xcU10qKSQvKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0uXFwuLisvKSAmJiAhYXJnLm1hdGNoKG5lZ2F0aXZlKSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLSguXFwuLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgIW5leHQubWF0Y2goL14tLykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi1bXi1dKy8pICYmICFhcmcubWF0Y2gobmVnYXRpdmUpKSB7XG4gICAgICAgICAgICAgICAgbGV0dGVycyA9IGFyZy5zbGljZSgxLCAtMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgICAgIGJyb2tlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnLnNsaWNlKGogKyAyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnLnNsaWNlKGogKyAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGxldHRlcnNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXRBcnJheShpLCBrZXksIGFyZ3MsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgL14tP1xcZCsoXFwuXFxkKik/KGUtP1xcZCspPyQvLnRlc3QobmV4dCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhuZXh0LCBmbGFncy5ib29scykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIGRlZmF1bHRWYWx1ZShsZXR0ZXJzW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga2V5ID0gYXJnLnNsaWNlKC0xKVswXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJyb2tlbiAmJiBrZXkgIT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnc1tpICsgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAhPT0gdW5kZWZpbmVkICYmICghL14oLXwtLSlbXi1dLy50ZXN0KG5leHQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLVswLTldJC8pICYmXG4gICAgICAgICAgICAgICAgYXJnLm1hdGNoKG5lZ2F0aXZlKSAmJlxuICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhhcmcuc2xpY2UoMSksIGZsYWdzLmJvb2xzKSkge1xuICAgICAgICAgICAgICAgIGtleSA9IGFyZy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgICAgICAgICAgICBub3RGbGFncyA9IGFyZ3Muc2xpY2UoaSArIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29uZmlndXJhdGlvblsnaGFsdC1hdC1ub24tb3B0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBub3RGbGFncyA9IGFyZ3Muc2xpY2UoaSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwdXNoUG9zaXRpb25hbChhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCB0cnVlKTtcbiAgICAgICAgYXBwbHlFbnZWYXJzKGFyZ3YsIGZhbHNlKTtcbiAgICAgICAgc2V0Q29uZmlnKGFyZ3YpO1xuICAgICAgICBzZXRDb25maWdPYmplY3RzKCk7XG4gICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGFyZ3YsIGZsYWdzLmFsaWFzZXMsIGRlZmF1bHRzLCB0cnVlKTtcbiAgICAgICAgYXBwbHlDb2VyY2lvbnMoYXJndik7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydzZXQtcGxhY2Vob2xkZXIta2V5J10pXG4gICAgICAgICAgICBzZXRQbGFjZWhvbGRlcktleXMoYXJndik7XG4gICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoIWhhc0tleShhcmd2LCBrZXkuc3BsaXQoJy4nKSkpXG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobm90RmxhZ3NPcHRpb24gJiYgbm90RmxhZ3MubGVuZ3RoKVxuICAgICAgICAgICAgYXJndltub3RGbGFnc0FyZ3ZdID0gW107XG4gICAgICAgIG5vdEZsYWdzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgYXJndltub3RGbGFnc0FyZ3ZdLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddICYmIGNvbmZpZ3VyYXRpb25bJ3N0cmlwLWRhc2hlZCddKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJy0tJyAmJiBrZXkuaW5jbHVkZXMoJy0nKSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBhcmd2W2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnc3RyaXAtYWxpYXNlZCddKSB7XG4gICAgICAgICAgICBbXS5jb25jYXQoLi4uT2JqZWN0LmtleXMoYWxpYXNlcykubWFwKGsgPT4gYWxpYXNlc1trXSkpLmZvckVhY2goYWxpYXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddICYmIGFsaWFzLmluY2x1ZGVzKCctJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3ZbYWxpYXMuc3BsaXQoJy4nKS5tYXAocHJvcCA9PiBjYW1lbENhc2UocHJvcCkpLmpvaW4oJy4nKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhcmd2W2FsaWFzXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHB1c2hQb3NpdGlvbmFsKGFyZykge1xuICAgICAgICAgICAgY29uc3QgbWF5YmVDb2VyY2VkTnVtYmVyID0gbWF5YmVDb2VyY2VOdW1iZXIoJ18nLCBhcmcpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgYXJndi5fLnB1c2gobWF5YmVDb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlYXROYXJncyhpLCBrZXksIGFyZ3MsIGFyZ0FmdGVyRXF1YWxTaWduKSB7XG4gICAgICAgICAgICBsZXQgaWk7XG4gICAgICAgICAgICBsZXQgdG9FYXQgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncyk7XG4gICAgICAgICAgICB0b0VhdCA9IHR5cGVvZiB0b0VhdCAhPT0gJ251bWJlcicgfHwgaXNOYU4odG9FYXQpID8gMSA6IHRvRWF0O1xuICAgICAgICAgICAgaWYgKHRvRWF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnQXJndW1lbnQgdW5leHBlY3RlZCBmb3I6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhdmFpbGFibGUgPSBpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgPyAwIDogMTtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWyduYXJncy1lYXRzLW9wdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAtIChpICsgMSkgKyBhdmFpbGFibGUgPCB0b0VhdCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IHRvRWF0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChpaSA9IGkgKyAxOyBpaSA8IGFyZ3MubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJnc1tpaV0ubWF0Y2goL14tW14wLTldLykgfHwgYXJnc1tpaV0ubWF0Y2gobmVnYXRpdmUpIHx8IGlzVW5rbm93bk9wdGlvbkFzQXJnKGFyZ3NbaWldKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSsrO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSA8IHRvRWF0KVxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29uc3VtZWQgPSBNYXRoLm1pbihhdmFpbGFibGUsIHRvRWF0KTtcbiAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pICYmIGNvbnN1bWVkID4gMCkge1xuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGFyZ0FmdGVyRXF1YWxTaWduKTtcbiAgICAgICAgICAgICAgICBjb25zdW1lZC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpaSA9IGkgKyAxOyBpaSA8IChjb25zdW1lZCArIGkgKyAxKTsgaWkrKykge1xuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGFyZ3NbaWldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoaSArIGNvbnN1bWVkKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlYXRBcnJheShpLCBrZXksIGFyZ3MsIGFyZ0FmdGVyRXF1YWxTaWduKSB7XG4gICAgICAgICAgICBsZXQgYXJnc1RvU2V0ID0gW107XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGFyZ0FmdGVyRXF1YWxTaWduIHx8IGFyZ3NbaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgbmFyZ3NDb3VudCA9IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKTtcbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiYgISgvXih0cnVlfGZhbHNlKSQvLnRlc3QobmV4dCkpKSB7XG4gICAgICAgICAgICAgICAgYXJnc1RvU2V0LnB1c2godHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc1VuZGVmaW5lZChuZXh0KSB8fFxuICAgICAgICAgICAgICAgIChpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgJiYgL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdHNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZlZhbCA9IGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldCA9IEFycmF5LmlzQXJyYXkoZGVmVmFsKSA/IGRlZlZhbCA6IFtkZWZWYWxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIGFyZ0FmdGVyRXF1YWxTaWduLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghY29uZmlndXJhdGlvblsnZ3JlZWR5LWFycmF5cyddICYmIGFyZ3NUb1NldC5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKG5hcmdzQ291bnQgJiYgdHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmIGFyZ3NUb1NldC5sZW5ndGggPj0gbmFyZ3NDb3VudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaWldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpID0gaWk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIG5leHQsIGlucHV0SXNTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmICgobmFyZ3NDb3VudCAmJiBhcmdzVG9TZXQubGVuZ3RoIDwgbmFyZ3NDb3VudCkgfHxcbiAgICAgICAgICAgICAgICAoaXNOYU4obmFyZ3NDb3VudCkgJiYgYXJnc1RvU2V0Lmxlbmd0aCA9PT0gMCkpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnTm90IGVub3VnaCBhcmd1bWVudHMgZm9sbG93aW5nOiAlcycsIGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnc1RvU2V0KTtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNldEFyZyhrZXksIHZhbCwgc2hvdWxkU3RyaXBRdW90ZXMgPSBpbnB1dElzU3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAoLy0vLnRlc3Qoa2V5KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxpYXMgPSBrZXkuc3BsaXQoJy4nKS5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZShwcm9wKTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKCcuJyk7XG4gICAgICAgICAgICAgICAgYWRkTmV3QWxpYXMoa2V5LCBhbGlhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHByb2Nlc3NWYWx1ZShrZXksIHZhbCwgc2hvdWxkU3RyaXBRdW90ZXMpO1xuICAgICAgICAgICAgY29uc3Qgc3BsaXRLZXkgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIHNldEtleShhcmd2LCBzcGxpdEtleSwgdmFsdWUpO1xuICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3BsaXRLZXkubGVuZ3RoID4gMSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgIChmbGFncy5hbGlhc2VzW3NwbGl0S2V5WzBdXSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQga2V5UHJvcGVydGllcyA9IHguc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IFtdLmNvbmNhdChzcGxpdEtleSk7XG4gICAgICAgICAgICAgICAgICAgIGEuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAga2V5UHJvcGVydGllcyA9IGtleVByb3BlcnRpZXMuY29uY2F0KGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2tleV0gfHwgW10pLmluY2x1ZGVzKGtleVByb3BlcnRpZXMuam9pbignLicpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIGtleVByb3BlcnRpZXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmFycmF5cykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gW2tleV0uY29uY2F0KGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSk7XG4gICAgICAgICAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFyZ3ZSZXR1cm4sIGtleSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBtaXhpbi5ub3JtYWxpemUodmFsdWUpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFkZE5ld0FsaWFzKGtleSwgYWxpYXMpIHtcbiAgICAgICAgICAgIGlmICghKGZsYWdzLmFsaWFzZXNba2V5XSAmJiBmbGFncy5hbGlhc2VzW2tleV0ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XSA9IFthbGlhc107XG4gICAgICAgICAgICAgICAgbmV3QWxpYXNlc1thbGlhc10gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1thbGlhc10gJiYgZmxhZ3MuYWxpYXNlc1thbGlhc10ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIGFkZE5ld0FsaWFzKGFsaWFzLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NWYWx1ZShrZXksIHZhbCwgc2hvdWxkU3RyaXBRdW90ZXMpIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRTdHJpcFF1b3Rlcykge1xuICAgICAgICAgICAgICAgIHZhbCA9IHN0cmlwUXVvdGVzKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpIHx8IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbCA9PT0gJ3RydWUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgICAgICAgICAgICAgPyB2YWwubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiBtYXliZUNvZXJjZU51bWJlcihrZXksIHYpOyB9KVxuICAgICAgICAgICAgICAgIDogbWF5YmVDb2VyY2VOdW1iZXIoa2V5LCB2YWwpO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykgJiYgKGlzVW5kZWZpbmVkKHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGluY3JlbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsLm1hcCgodmFsKSA9PiB7IHJldHVybiBtaXhpbi5ub3JtYWxpemUodmFsKTsgfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1peGluLm5vcm1hbGl6ZSh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJ10gJiYga2V5ID09PSAnXycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5zdHJpbmdzKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZENvZXJjZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcih2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsncGFyc2UtbnVtYmVycyddICYmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dmFsdWV9YCkpKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENvZXJjZU51bWJlciB8fCAoIWlzVW5kZWZpbmVkKHZhbHVlKSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWcoYXJndikge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGNvbmZpZ0xvb2t1cCwgZmxhZ3MuYWxpYXNlcywgZGVmYXVsdHMpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmxhZ3MuY29uZmlncykuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGFyZ3ZbY29uZmlnS2V5XSB8fCBjb25maWdMb29rdXBbY29uZmlnS2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbmZpZ1BhdGggPSBtaXhpbi5yZXNvbHZlKG1peGluLmN3ZCgpLCBjb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVDb25maWcgPSBmbGFncy5jb25maWdzW2NvbmZpZ0tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSByZXNvbHZlQ29uZmlnKHJlc29sdmVkQ29uZmlnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1peGluLnJlcXVpcmUocmVzb2x2ZWRDb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4Lm5hbWUgPT09ICdQZXJtaXNzaW9uRGVuaWVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJndltjb25maWdLZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgSlNPTiBjb25maWcgZmlsZTogJXMnLCBjb25maWdQYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3QoY29uZmlnLCBwcmV2KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbEtleSA9IHByZXYgPyBwcmV2ICsgJy4nICsga2V5IDoga2V5O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDb25maWdPYmplY3QodmFsdWUsIGZ1bGxLZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwgZnVsbEtleS5zcGxpdCgnLicpKSB8fCAoY2hlY2tBbGxBbGlhc2VzKGZ1bGxLZXksIGZsYWdzLmFycmF5cykgJiYgY29uZmlndXJhdGlvblsnY29tYmluZS1hcnJheXMnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhmdWxsS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3RzKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25maWdPYmplY3RzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGNvbmZpZ09iamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWdPYmplY3QpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5RW52VmFycyhhcmd2LCBjb25maWdPbmx5KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVudlByZWZpeCA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gdHlwZW9mIGVudlByZWZpeCA9PT0gJ3N0cmluZycgPyBlbnZQcmVmaXggOiAnJztcbiAgICAgICAgICAgIGNvbnN0IGVudiA9IG1peGluLmVudigpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGZ1bmN0aW9uIChlbnZWYXIpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09PSAnJyB8fCBlbnZWYXIubGFzdEluZGV4T2YocHJlZml4LCAwKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gZW52VmFyLnNwbGl0KCdfXycpLm1hcChmdW5jdGlvbiAoa2V5LCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtZWxDYXNlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKChjb25maWdPbmx5ICYmIGZsYWdzLmNvbmZpZ3Nba2V5cy5qb2luKCcuJyldKSB8fCAhY29uZmlnT25seSkgJiYgIWhhc0tleShhcmd2LCBrZXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleXMuam9pbignLicpLCBlbnZbZW52VmFyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBhcHBseUNvZXJjaW9ucyhhcmd2KSB7XG4gICAgICAgICAgICBsZXQgY29lcmNlO1xuICAgICAgICAgICAgY29uc3QgYXBwbGllZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGlmICghYXBwbGllZC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb2VyY2UgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb2VyY2lvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1heWJlQ29lcmNlTnVtYmVyKGtleSwgY29lcmNlKGFyZ3Zba2V5XSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpKS5mb3JFYWNoKGFsaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQuYWRkKGFsaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbYWxpXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpIHtcbiAgICAgICAgICAgIGZsYWdzLmtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKH5rZXkuaW5kZXhPZignLicpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd2W2tleV0gPT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgICAgICAgICBhcmd2W2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKG9iaiwgYWxpYXNlcywgZGVmYXVsdHMsIGNhbkxvZyA9IGZhbHNlKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkZWZhdWx0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkob2JqLCBrZXkuc3BsaXQoJy4nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0S2V5KG9iaiwga2V5LnNwbGl0KCcuJyksIGRlZmF1bHRzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FuTG9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdGVkW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAoYWxpYXNlc1trZXldIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzS2V5KG9iaiwgeC5zcGxpdCgnLicpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRLZXkob2JqLCB4LnNwbGl0KCcuJyksIGRlZmF1bHRzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYXNLZXkob2JqLCBrZXlzKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG9iajtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pXG4gICAgICAgICAgICAgICAga2V5cyA9IFtrZXlzLmpvaW4oJy4nKV07XG4gICAgICAgICAgICBrZXlzLnNsaWNlKDAsIC0xKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBvID0gKG9ba2V5XSB8fCB7fSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbyAhPT0gJ29iamVjdCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXkgaW4gbztcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRLZXkob2JqLCBrZXlzLCB2YWx1ZSkge1xuICAgICAgICAgICAgbGV0IG8gPSBvYmo7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb25bJ2RvdC1ub3RhdGlvbiddKVxuICAgICAgICAgICAgICAgIGtleXMgPSBba2V5cy5qb2luKCcuJyldO1xuICAgICAgICAgICAga2V5cy5zbGljZSgwLCAtMSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAga2V5ID0gc2FuaXRpemVLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG8gPT09ICdvYmplY3QnICYmIG9ba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XS5wdXNoKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHt9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvID0gb1trZXldW29ba2V5XS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG8gPSBvW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzYW5pdGl6ZUtleShrZXlzW2tleXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlQXJyYXkgPSBjaGVja0FsbEFsaWFzZXMoa2V5cy5qb2luKCcuJyksIGZsYWdzLmFycmF5cyk7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBkdXBsaWNhdGUgPSBjb25maWd1cmF0aW9uWydkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5J107XG4gICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykpIHtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgoIWlzVW5kZWZpbmVkKG9ba2V5XSkgJiYgZmxhZ3MubmFyZ3Nba2V5XSA9PT0gMSkgfHwgKEFycmF5LmlzQXJyYXkob1trZXldKSAmJiBvW2tleV0ubGVuZ3RoID09PSBmbGFncy5uYXJnc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBpbmNyZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IGluY3JlbWVudChvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSAmJiBpc1R5cGVBcnJheSAmJiBpc1ZhbHVlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gY29uZmlndXJhdGlvblsnZmxhdHRlbi1kdXBsaWNhdGUtYXJyYXlzJ10gPyBvW2tleV0uY29uY2F0KHZhbHVlKSA6IChBcnJheS5pc0FycmF5KG9ba2V5XVswXSkgPyBvW2tleV0gOiBbb1trZXldXSkuY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZHVwbGljYXRlICYmIEJvb2xlYW4oaXNUeXBlQXJyYXkpID09PSBCb29sZWFuKGlzVmFsdWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSBvW2tleV0uY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9ba2V5XSA9PT0gdW5kZWZpbmVkICYmIGlzVHlwZUFycmF5KSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gaXNWYWx1ZUFycmF5ID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHVwbGljYXRlICYmICEob1trZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpIHx8XG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGV4dGVuZEFsaWFzZXMoLi4uYXJncykge1xuICAgICAgICAgICAgYXJncy5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhvYmogfHwge30pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MuYWxpYXNlc1trZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0gPSBbXS5jb25jYXQoYWxpYXNlc1trZXldIHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmNvbmNhdChrZXkpLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvLS8udGVzdCh4KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGNhbWVsQ2FzZSh4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPT0ga2V5ICYmIGZsYWdzLmFsaWFzZXNba2V5XS5pbmRleE9mKGMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0ucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWxpYXNlc1tjXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmNvbmNhdChrZXkpLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4Lmxlbmd0aCA+IDEgJiYgL1tBLVpdLy50ZXN0KHgpICYmIGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gZGVjYW1lbGl6ZSh4LCAnLScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICE9PSBrZXkgJiYgZmxhZ3MuYWxpYXNlc1trZXldLmluZGV4T2YoYykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBbGlhc2VzW2NdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0uZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1t4XSA9IFtrZXldLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0uZmlsdGVyKGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggIT09IHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZykge1xuICAgICAgICAgICAgY29uc3QgdG9DaGVjayA9IFtdLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0gfHwgW10sIGtleSk7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmxhZyk7XG4gICAgICAgICAgICBjb25zdCBzZXRBbGlhcyA9IHRvQ2hlY2suZmluZChrZXkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKTtcbiAgICAgICAgICAgIHJldHVybiBzZXRBbGlhcyA/IGZsYWdbc2V0QWxpYXNdIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzQW55RmxhZyhrZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsYWdzS2V5cyA9IE9iamVjdC5rZXlzKGZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoZmxhZ3NLZXlzLm1hcChrID0+IGZsYWdzW2tdKSk7XG4gICAgICAgICAgICByZXR1cm4gdG9DaGVjay5zb21lKGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmxhZykgPyBmbGFnLmluY2x1ZGVzKGtleSkgOiBmbGFnW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYXNGbGFnc01hdGNoaW5nKGFyZywgLi4ucGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoLi4ucGF0dGVybnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2suc29tZShmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gYXJnLm1hdGNoKHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaCAmJiBoYXNBbnlGbGFnKG1hdGNoWzFdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0FsbFNob3J0RmxhZ3MoYXJnKSB7XG4gICAgICAgICAgICBpZiAoYXJnLm1hdGNoKG5lZ2F0aXZlKSB8fCAhYXJnLm1hdGNoKC9eLVteLV0rLykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaGFzQWxsRmxhZ3MgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IG5leHQ7XG4gICAgICAgICAgICBjb25zdCBsZXR0ZXJzID0gYXJnLnNsaWNlKDEpLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmcuc2xpY2UoaiArIDIpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzQW55RmxhZyhsZXR0ZXJzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNBbGxGbGFncyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChsZXR0ZXJzW2ogKyAxXSAmJiBsZXR0ZXJzW2ogKyAxXSA9PT0gJz0nKSB8fFxuICAgICAgICAgICAgICAgICAgICBuZXh0ID09PSAnLScgfHxcbiAgICAgICAgICAgICAgICAgICAgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJiAvXi0/XFxkKyhcXC5cXGQqKT8oZS0/XFxkKyk/JC8udGVzdChuZXh0KSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhc0FsbEZsYWdzO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVW5rbm93bk9wdGlvbkFzQXJnKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25bJ3Vua25vd24tb3B0aW9ucy1hcy1hcmdzJ10gJiYgaXNVbmtub3duT3B0aW9uKGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaXNVbmtub3duT3B0aW9uKGFyZykge1xuICAgICAgICAgICAgYXJnID0gYXJnLnJlcGxhY2UoL14tezMsfS8sICctLScpO1xuICAgICAgICAgICAgaWYgKGFyZy5tYXRjaChuZWdhdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzQWxsU2hvcnRGbGFncyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmxhZ1dpdGhFcXVhbHMgPSAvXi0rKFtePV0rPyk9W1xcc1xcU10qJC87XG4gICAgICAgICAgICBjb25zdCBub3JtYWxGbGFnID0gL14tKyhbXj1dKz8pJC87XG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5IeXBoZW4gPSAvXi0rKFtePV0rPyktJC87XG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5EaWdpdHMgPSAvXi0rKFtePV0rP1xcZCspJC87XG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyA9IC9eLSsoW149XSs/KVxcVysuKiQvO1xuICAgICAgICAgICAgcmV0dXJuICFoYXNGbGFnc01hdGNoaW5nKGFyZywgZmxhZ1dpdGhFcXVhbHMsIG5lZ2F0ZWRCb29sZWFuLCBub3JtYWxGbGFnLCBmbGFnRW5kaW5nSW5IeXBoZW4sIGZsYWdFbmRpbmdJbkRpZ2l0cywgZmxhZ0VuZGluZ0luTm9uV29yZENoYXJhY3RlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZShrZXkpIHtcbiAgICAgICAgICAgIGlmICghY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmXG4gICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykgJiZcbiAgICAgICAgICAgICAgICBgJHtrZXl9YCBpbiBkZWZhdWx0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRGb3JUeXBlKGd1ZXNzVHlwZShrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBkZWZhdWx0Rm9yVHlwZSh0eXBlKSB7XG4gICAgICAgICAgICBjb25zdCBkZWYgPSB7XG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU5dOiB0cnVlLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5TVFJJTkddOiAnJyxcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuTlVNQkVSXTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5BUlJBWV06IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGRlZlt0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBndWVzc1R5cGUoa2V5KSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU47XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Muc3RyaW5ncykpXG4gICAgICAgICAgICAgICAgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LlNUUklORztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm51bWJlcnMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5OVU1CRVI7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykpXG4gICAgICAgICAgICAgICAgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU47XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5BUlJBWTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKG51bSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bSA9PT0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrQ29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZmluZChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgY29uZmlndXJhdGlvbjogJXMsIG9wdHMuY291bnQgZXhjbHVkZXMgb3B0cy5hcnJheS4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb246ICVzLCBvcHRzLmNvdW50IGV4Y2x1ZGVzIG9wdHMubmFyZy4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGlhc2VzOiBPYmplY3QuYXNzaWduKHt9LCBmbGFncy5hbGlhc2VzKSxcbiAgICAgICAgICAgIGFyZ3Y6IE9iamVjdC5hc3NpZ24oYXJndlJldHVybiwgYXJndiksXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdGVkOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0ZWQpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgbmV3QWxpYXNlczogT2JqZWN0LmFzc2lnbih7fSwgbmV3QWxpYXNlcylcbiAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21iaW5lQWxpYXNlcyhhbGlhc2VzKSB7XG4gICAgY29uc3QgYWxpYXNBcnJheXMgPSBbXTtcbiAgICBjb25zdCBjb21iaW5lZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGNoYW5nZSA9IHRydWU7XG4gICAgT2JqZWN0LmtleXMoYWxpYXNlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGFsaWFzQXJyYXlzLnB1c2goW10uY29uY2F0KGFsaWFzZXNba2V5XSwga2V5KSk7XG4gICAgfSk7XG4gICAgd2hpbGUgKGNoYW5nZSkge1xuICAgICAgICBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaWkgPSBpICsgMTsgaWkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBhbGlhc0FycmF5c1tpXS5maWx0ZXIoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzQXJyYXlzW2lpXS5pbmRleE9mKHYpICE9PSAtMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5c1tpXSA9IGFsaWFzQXJyYXlzW2ldLmNvbmNhdChhbGlhc0FycmF5c1tpaV0pO1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5cy5zcGxpY2UoaWksIDEpO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWxpYXNBcnJheXMuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXNBcnJheSkge1xuICAgICAgICBhbGlhc0FycmF5ID0gYWxpYXNBcnJheS5maWx0ZXIoZnVuY3Rpb24gKHYsIGksIHNlbGYpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmluZGV4T2YodikgPT09IGk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBsYXN0QWxpYXMgPSBhbGlhc0FycmF5LnBvcCgpO1xuICAgICAgICBpZiAobGFzdEFsaWFzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGxhc3RBbGlhcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbWJpbmVkW2xhc3RBbGlhc10gPSBhbGlhc0FycmF5O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbWJpbmVkO1xufVxuZnVuY3Rpb24gaW5jcmVtZW50KG9yaWcpIHtcbiAgICByZXR1cm4gb3JpZyAhPT0gdW5kZWZpbmVkID8gb3JpZyArIDEgOiAxO1xufVxuZnVuY3Rpb24gc2FuaXRpemVLZXkoa2V5KSB7XG4gICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycpXG4gICAgICAgIHJldHVybiAnX19fcHJvdG9fX18nO1xuICAgIHJldHVybiBrZXk7XG59XG5mdW5jdGlvbiBzdHJpcFF1b3Rlcyh2YWwpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICh2YWxbMF0gPT09IFwiJ1wiIHx8IHZhbFswXSA9PT0gJ1wiJykgJiZcbiAgICAgICAgdmFsW3ZhbC5sZW5ndGggLSAxXSA9PT0gdmFsWzBdKVxuICAgICAgICA/IHZhbC5zdWJzdHJpbmcoMSwgdmFsLmxlbmd0aCAtIDEpXG4gICAgICAgIDogdmFsO1xufVxuXG52YXIgX2EsIF9iLCBfYztcbmNvbnN0IG1pbk5vZGVWZXJzaW9uID0gKHByb2Nlc3MgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuWUFSR1NfTUlOX05PREVfVkVSU0lPTilcbiAgICA/IE51bWJlcihwcm9jZXNzLmVudi5ZQVJHU19NSU5fTk9ERV9WRVJTSU9OKVxuICAgIDogMTI7XG5jb25zdCBub2RlVmVyc2lvbiA9IChfYiA9IChfYSA9IHByb2Nlc3MgPT09IG51bGwgfHwgcHJvY2VzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvY2Vzcy52ZXJzaW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vZGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IChfYyA9IHByb2Nlc3MgPT09IG51bGwgfHwgcHJvY2VzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvY2Vzcy52ZXJzaW9uKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Muc2xpY2UoMSk7XG5pZiAobm9kZVZlcnNpb24pIHtcbiAgICBjb25zdCBtYWpvciA9IE51bWJlcihub2RlVmVyc2lvbi5tYXRjaCgvXihbXi5dKykvKVsxXSk7XG4gICAgaWYgKG1ham9yIDwgbWluTm9kZVZlcnNpb24pIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYHlhcmdzIHBhcnNlciBzdXBwb3J0cyBhIG1pbmltdW0gTm9kZS5qcyB2ZXJzaW9uIG9mICR7bWluTm9kZVZlcnNpb259LiBSZWFkIG91ciB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5OiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3MtcGFyc2VyI3N1cHBvcnRlZC1ub2RlanMtdmVyc2lvbnNgKTtcbiAgICB9XG59XG5jb25zdCBlbnYgPSBwcm9jZXNzID8gcHJvY2Vzcy5lbnYgOiB7fTtcbmNvbnN0IHBhcnNlciA9IG5ldyBZYXJnc1BhcnNlcih7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCxcbiAgICBlbnY6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGVudjtcbiAgICB9LFxuICAgIGZvcm1hdDogdXRpbC5mb3JtYXQsXG4gICAgbm9ybWFsaXplOiBwYXRoLm5vcm1hbGl6ZSxcbiAgICByZXNvbHZlOiBwYXRoLnJlc29sdmUsXG4gICAgcmVxdWlyZTogKHBhdGgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF0aC5tYXRjaCgvXFwuanNvbiQvKSkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgsICd1dGY4JykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ29ubHkgLmpzb24gY29uZmlnIGZpbGVzIGFyZSBzdXBwb3J0ZWQgaW4gRVNNJyk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbmNvbnN0IHlhcmdzUGFyc2VyID0gZnVuY3Rpb24gUGFyc2VyKGFyZ3MsIG9wdHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIucGFyc2UoYXJncy5zbGljZSgpLCBvcHRzKTtcbiAgICByZXR1cm4gcmVzdWx0LmFyZ3Y7XG59O1xueWFyZ3NQYXJzZXIuZGV0YWlsZWQgPSBmdW5jdGlvbiAoYXJncywgb3B0cykge1xuICAgIHJldHVybiBwYXJzZXIucGFyc2UoYXJncy5zbGljZSgpLCBvcHRzKTtcbn07XG55YXJnc1BhcnNlci5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG55YXJnc1BhcnNlci5kZWNhbWVsaXplID0gZGVjYW1lbGl6ZTtcbnlhcmdzUGFyc2VyLmxvb2tzTGlrZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcjtcblxubW9kdWxlLmV4cG9ydHMgPSB5YXJnc1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO3ZhciB0PXJlcXVpcmUoXCJhc3NlcnRcIik7Y2xhc3MgZSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHR8fFwieWFyZ3MgZXJyb3JcIiksdGhpcy5uYW1lPVwiWUVycm9yXCIsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsZSl9fWxldCBzLGk9W107ZnVuY3Rpb24gbih0LG8sYSxoKXtzPWg7bGV0IGw9e307aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsXCJleHRlbmRzXCIpKXtpZihcInN0cmluZ1wiIT10eXBlb2YgdC5leHRlbmRzKXJldHVybiBsO2NvbnN0IHI9L1xcLmpzb258XFwuLipyYyQvLnRlc3QodC5leHRlbmRzKTtsZXQgaD1udWxsO2lmKHIpaD1mdW5jdGlvbih0LGUpe3JldHVybiBzLnBhdGgucmVzb2x2ZSh0LGUpfShvLHQuZXh0ZW5kcyk7ZWxzZSB0cnl7aD1yZXF1aXJlLnJlc29sdmUodC5leHRlbmRzKX1jYXRjaChlKXtyZXR1cm4gdH0hZnVuY3Rpb24odCl7aWYoaS5pbmRleE9mKHQpPi0xKXRocm93IG5ldyBlKGBDaXJjdWxhciBleHRlbmRlZCBjb25maWd1cmF0aW9uczogJyR7dH0nLmApfShoKSxpLnB1c2goaCksbD1yP0pTT04ucGFyc2Uocy5yZWFkRmlsZVN5bmMoaCxcInV0ZjhcIikpOnJlcXVpcmUodC5leHRlbmRzKSxkZWxldGUgdC5leHRlbmRzLGw9bihsLHMucGF0aC5kaXJuYW1lKGgpLGEscyl9cmV0dXJuIGk9W10sYT9yKGwsdCk6T2JqZWN0LmFzc2lnbih7fSxsLHQpfWZ1bmN0aW9uIHIodCxlKXtjb25zdCBzPXt9O2Z1bmN0aW9uIGkodCl7cmV0dXJuIHQmJlwib2JqZWN0XCI9PXR5cGVvZiB0JiYhQXJyYXkuaXNBcnJheSh0KX1PYmplY3QuYXNzaWduKHMsdCk7Zm9yKGNvbnN0IG4gb2YgT2JqZWN0LmtleXMoZSkpaShlW25dKSYmaShzW25dKT9zW25dPXIodFtuXSxlW25dKTpzW25dPWVbbl07cmV0dXJuIHN9ZnVuY3Rpb24gbyh0KXtjb25zdCBlPXQucmVwbGFjZSgvXFxzezIsfS9nLFwiIFwiKS5zcGxpdCgvXFxzKyg/IVteW10qXXxbXjxdKj4pLykscz0vXFwuKltcXF1bPD5dL2csaT1lLnNoaWZ0KCk7aWYoIWkpdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIGZvdW5kIGluOiAke3R9YCk7Y29uc3Qgbj17Y21kOmkucmVwbGFjZShzLFwiXCIpLGRlbWFuZGVkOltdLG9wdGlvbmFsOltdfTtyZXR1cm4gZS5mb3JFYWNoKCgodCxpKT0+e2xldCByPSExO3Q9dC5yZXBsYWNlKC9cXHMvZyxcIlwiKSwvXFwuK1tcXF0+XS8udGVzdCh0KSYmaT09PWUubGVuZ3RoLTEmJihyPSEwKSwvXlxcWy8udGVzdCh0KT9uLm9wdGlvbmFsLnB1c2goe2NtZDp0LnJlcGxhY2UocyxcIlwiKS5zcGxpdChcInxcIiksdmFyaWFkaWM6cn0pOm4uZGVtYW5kZWQucHVzaCh7Y21kOnQucmVwbGFjZShzLFwiXCIpLnNwbGl0KFwifFwiKSx2YXJpYWRpYzpyfSl9KSksbn1jb25zdCBhPVtcImZpcnN0XCIsXCJzZWNvbmRcIixcInRoaXJkXCIsXCJmb3VydGhcIixcImZpZnRoXCIsXCJzaXh0aFwiXTtmdW5jdGlvbiBoKHQscyxpKXt0cnl7bGV0IG49MDtjb25zdFtyLGEsaF09XCJvYmplY3RcIj09dHlwZW9mIHQ/W3tkZW1hbmRlZDpbXSxvcHRpb25hbDpbXX0sdCxzXTpbbyhgY21kICR7dH1gKSxzLGldLGY9W10uc2xpY2UuY2FsbChhKTtmb3IoO2YubGVuZ3RoJiZ2b2lkIDA9PT1mW2YubGVuZ3RoLTFdOylmLnBvcCgpO2NvbnN0IGQ9aHx8Zi5sZW5ndGg7aWYoZDxyLmRlbWFuZGVkLmxlbmd0aCl0aHJvdyBuZXcgZShgTm90IGVub3VnaCBhcmd1bWVudHMgcHJvdmlkZWQuIEV4cGVjdGVkICR7ci5kZW1hbmRlZC5sZW5ndGh9IGJ1dCByZWNlaXZlZCAke2YubGVuZ3RofS5gKTtjb25zdCB1PXIuZGVtYW5kZWQubGVuZ3RoK3Iub3B0aW9uYWwubGVuZ3RoO2lmKGQ+dSl0aHJvdyBuZXcgZShgVG9vIG1hbnkgYXJndW1lbnRzIHByb3ZpZGVkLiBFeHBlY3RlZCBtYXggJHt1fSBidXQgcmVjZWl2ZWQgJHtkfS5gKTtyLmRlbWFuZGVkLmZvckVhY2goKHQ9Pntjb25zdCBlPWwoZi5zaGlmdCgpKTswPT09dC5jbWQuZmlsdGVyKCh0PT50PT09ZXx8XCIqXCI9PT10KSkubGVuZ3RoJiZjKGUsdC5jbWQsbiksbis9MX0pKSxyLm9wdGlvbmFsLmZvckVhY2goKHQ9PntpZigwPT09Zi5sZW5ndGgpcmV0dXJuO2NvbnN0IGU9bChmLnNoaWZ0KCkpOzA9PT10LmNtZC5maWx0ZXIoKHQ9PnQ9PT1lfHxcIipcIj09PXQpKS5sZW5ndGgmJmMoZSx0LmNtZCxuKSxuKz0xfSkpfWNhdGNoKHQpe2NvbnNvbGUud2Fybih0LnN0YWNrKX19ZnVuY3Rpb24gbCh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT9cImFycmF5XCI6bnVsbD09PXQ/XCJudWxsXCI6dHlwZW9mIHR9ZnVuY3Rpb24gYyh0LHMsaSl7dGhyb3cgbmV3IGUoYEludmFsaWQgJHthW2ldfHxcIm1hbnlpdGhcIn0gYXJndW1lbnQuIEV4cGVjdGVkICR7cy5qb2luKFwiIG9yIFwiKX0gYnV0IHJlY2VpdmVkICR7dH0uYCl9ZnVuY3Rpb24gZih0KXtyZXR1cm4hIXQmJiEhdC50aGVuJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnRoZW59ZnVuY3Rpb24gZCh0LGUscyxpKXtzLmFzc2VydC5ub3RTdHJpY3RFcXVhbCh0LGUsaSl9ZnVuY3Rpb24gdSh0LGUpe2UuYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiB0LFwic3RyaW5nXCIpfWZ1bmN0aW9uIHAodCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpfWZ1bmN0aW9uIGcodD17fSxlPSgoKT0+ITApKXtjb25zdCBzPXt9O3JldHVybiBwKHQpLmZvckVhY2goKGk9PntlKGksdFtpXSkmJihzW2ldPXRbaV0pfSkpLHN9ZnVuY3Rpb24gbSgpe3JldHVybiBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uJiYhcHJvY2Vzcy5kZWZhdWx0QXBwPzA6MX1mdW5jdGlvbiB5KCl7cmV0dXJuIHByb2Nlc3MuYXJndlttKCldfXZhciBiPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGhpZGVCaW46ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2xpY2UobSgpKzEpfSxnZXRQcm9jZXNzQXJndkJpbjp5fSk7ZnVuY3Rpb24gdih0LGUscyxpKXtpZihcImFcIj09PXMmJiFpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZT90IT09ZXx8IWk6IWUuaGFzKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7cmV0dXJuXCJtXCI9PT1zP2k6XCJhXCI9PT1zP2kuY2FsbCh0KTppP2kudmFsdWU6ZS5nZXQodCl9ZnVuY3Rpb24gTyh0LGUscyxpLG4pe2lmKFwibVwiPT09aSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO2lmKFwiYVwiPT09aSYmIW4pdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBlP3QhPT1lfHwhbjohZS5oYXModCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO3JldHVyblwiYVwiPT09aT9uLmNhbGwodCxzKTpuP24udmFsdWU9czplLnNldCh0LHMpLHN9Y2xhc3Mgd3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmdsb2JhbE1pZGRsZXdhcmU9W10sdGhpcy5mcm96ZW5zPVtdLHRoaXMueWFyZ3M9dH1hZGRNaWRkbGV3YXJlKHQsZSxzPSEwLGk9ITEpe2lmKGgoXCI8YXJyYXl8ZnVuY3Rpb24+IFtib29sZWFuXSBbYm9vbGVhbl0gW2Jvb2xlYW5dXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSxBcnJheS5pc0FycmF5KHQpKXtmb3IobGV0IGk9MDtpPHQubGVuZ3RoO2krKyl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdFtpXSl0aHJvdyBFcnJvcihcIm1pZGRsZXdhcmUgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO2NvbnN0IG49dFtpXTtuLmFwcGx5QmVmb3JlVmFsaWRhdGlvbj1lLG4uZ2xvYmFsPXN9QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5nbG9iYWxNaWRkbGV3YXJlLHQpfWVsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdCl7Y29uc3Qgbj10O24uYXBwbHlCZWZvcmVWYWxpZGF0aW9uPWUsbi5nbG9iYWw9cyxuLm11dGF0ZXM9aSx0aGlzLmdsb2JhbE1pZGRsZXdhcmUucHVzaCh0KX1yZXR1cm4gdGhpcy55YXJnc31hZGRDb2VyY2VNaWRkbGV3YXJlKHQsZSl7Y29uc3Qgcz10aGlzLnlhcmdzLmdldEFsaWFzZXMoKTtyZXR1cm4gdGhpcy5nbG9iYWxNaWRkbGV3YXJlPXRoaXMuZ2xvYmFsTWlkZGxld2FyZS5maWx0ZXIoKHQ9Pntjb25zdCBpPVsuLi5zW2VdfHxbXSxlXTtyZXR1cm4hdC5vcHRpb258fCFpLmluY2x1ZGVzKHQub3B0aW9uKX0pKSx0Lm9wdGlvbj1lLHRoaXMuYWRkTWlkZGxld2FyZSh0LCEwLCEwLCEwKX1nZXRNaWRkbGV3YXJlKCl7cmV0dXJuIHRoaXMuZ2xvYmFsTWlkZGxld2FyZX1mcmVlemUoKXt0aGlzLmZyb3plbnMucHVzaChbLi4udGhpcy5nbG9iYWxNaWRkbGV3YXJlXSl9dW5mcmVlemUoKXtjb25zdCB0PXRoaXMuZnJvemVucy5wb3AoKTt2b2lkIDAhPT10JiYodGhpcy5nbG9iYWxNaWRkbGV3YXJlPXQpfXJlc2V0KCl7dGhpcy5nbG9iYWxNaWRkbGV3YXJlPXRoaXMuZ2xvYmFsTWlkZGxld2FyZS5maWx0ZXIoKHQ9PnQuZ2xvYmFsKSl9fWZ1bmN0aW9uIEModCxlLHMsaSl7cmV0dXJuIHMucmVkdWNlKCgodCxzKT0+e2lmKHMuYXBwbHlCZWZvcmVWYWxpZGF0aW9uIT09aSlyZXR1cm4gdDtpZihzLm11dGF0ZXMpe2lmKHMuYXBwbGllZClyZXR1cm4gdDtzLmFwcGxpZWQ9ITB9aWYoZih0KSlyZXR1cm4gdC50aGVuKCh0PT5Qcm9taXNlLmFsbChbdCxzKHQsZSldKSkpLnRoZW4oKChbdCxlXSk9Pk9iamVjdC5hc3NpZ24odCxlKSkpO3tjb25zdCBpPXModCxlKTtyZXR1cm4gZihpKT9pLnRoZW4oKGU9Pk9iamVjdC5hc3NpZ24odCxlKSkpOk9iamVjdC5hc3NpZ24odCxpKX19KSx0KX1mdW5jdGlvbiBqKHQsZSxzPSh0PT57dGhyb3cgdH0pKXt0cnl7Y29uc3Qgcz1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3QoKTp0O3JldHVybiBmKHMpP3MudGhlbigodD0+ZSh0KSkpOmUocyl9Y2F0Y2godCl7cmV0dXJuIHModCl9fWNvbnN0IE09LyheXFwqKXwoXlxcJDApLztjbGFzcyBfe2NvbnN0cnVjdG9yKHQsZSxzLGkpe3RoaXMucmVxdWlyZUNhY2hlPW5ldyBTZXQsdGhpcy5oYW5kbGVycz17fSx0aGlzLmFsaWFzTWFwPXt9LHRoaXMuZnJvemVucz1bXSx0aGlzLnNoaW09aSx0aGlzLnVzYWdlPXQsdGhpcy5nbG9iYWxNaWRkbGV3YXJlPXMsdGhpcy52YWxpZGF0aW9uPWV9YWRkRGlyZWN0b3J5KHQsZSxzLGkpe1wiYm9vbGVhblwiIT10eXBlb2YoaT1pfHx7fSkucmVjdXJzZSYmKGkucmVjdXJzZT0hMSksQXJyYXkuaXNBcnJheShpLmV4dGVuc2lvbnMpfHwoaS5leHRlbnNpb25zPVtcImpzXCJdKTtjb25zdCBuPVwiZnVuY3Rpb25cIj09dHlwZW9mIGkudmlzaXQ/aS52aXNpdDp0PT50O2kudmlzaXQ9KHQsZSxzKT0+e2NvbnN0IGk9bih0LGUscyk7aWYoaSl7aWYodGhpcy5yZXF1aXJlQ2FjaGUuaGFzKGUpKXJldHVybiBpO3RoaXMucmVxdWlyZUNhY2hlLmFkZChlKSx0aGlzLmFkZEhhbmRsZXIoaSl9cmV0dXJuIGl9LHRoaXMuc2hpbS5yZXF1aXJlRGlyZWN0b3J5KHtyZXF1aXJlOmUsZmlsZW5hbWU6c30sdCxpKX1hZGRIYW5kbGVyKHQsZSxzLGksbixyKXtsZXQgYT1bXTtjb25zdCBoPWZ1bmN0aW9uKHQpe3JldHVybiB0P3QubWFwKCh0PT4odC5hcHBseUJlZm9yZVZhbGlkYXRpb249ITEsdCkpKTpbXX0obik7aWYoaT1pfHwoKCk9Pnt9KSxBcnJheS5pc0FycmF5KHQpKWlmKGZ1bmN0aW9uKHQpe3JldHVybiB0LmV2ZXJ5KCh0PT5cInN0cmluZ1wiPT10eXBlb2YgdCkpfSh0KSlbdCwuLi5hXT10O2Vsc2UgZm9yKGNvbnN0IGUgb2YgdCl0aGlzLmFkZEhhbmRsZXIoZSk7ZWxzZXtpZihmdW5jdGlvbih0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdCYmIUFycmF5LmlzQXJyYXkodCl9KHQpKXtsZXQgZT1BcnJheS5pc0FycmF5KHQuY29tbWFuZCl8fFwic3RyaW5nXCI9PXR5cGVvZiB0LmNvbW1hbmQ/dC5jb21tYW5kOnRoaXMubW9kdWxlTmFtZSh0KTtyZXR1cm4gdC5hbGlhc2VzJiYoZT1bXS5jb25jYXQoZSkuY29uY2F0KHQuYWxpYXNlcykpLHZvaWQgdGhpcy5hZGRIYW5kbGVyKGUsdGhpcy5leHRyYWN0RGVzYyh0KSx0LmJ1aWxkZXIsdC5oYW5kbGVyLHQubWlkZGxld2FyZXMsdC5kZXByZWNhdGVkKX1pZihrKHMpKXJldHVybiB2b2lkIHRoaXMuYWRkSGFuZGxlcihbdF0uY29uY2F0KGEpLGUscy5idWlsZGVyLHMuaGFuZGxlcixzLm1pZGRsZXdhcmVzLHMuZGVwcmVjYXRlZCl9aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe2NvbnN0IG49byh0KTthPWEubWFwKCh0PT5vKHQpLmNtZCkpO2xldCBsPSExO2NvbnN0IGM9W24uY21kXS5jb25jYXQoYSkuZmlsdGVyKCh0PT4hTS50ZXN0KHQpfHwobD0hMCwhMSkpKTswPT09Yy5sZW5ndGgmJmwmJmMucHVzaChcIiQwXCIpLGwmJihuLmNtZD1jWzBdLGE9Yy5zbGljZSgxKSx0PXQucmVwbGFjZShNLG4uY21kKSksYS5mb3JFYWNoKCh0PT57dGhpcy5hbGlhc01hcFt0XT1uLmNtZH0pKSwhMSE9PWUmJnRoaXMudXNhZ2UuY29tbWFuZCh0LGUsbCxhLHIpLHRoaXMuaGFuZGxlcnNbbi5jbWRdPXtvcmlnaW5hbDp0LGRlc2NyaXB0aW9uOmUsaGFuZGxlcjppLGJ1aWxkZXI6c3x8e30sbWlkZGxld2FyZXM6aCxkZXByZWNhdGVkOnIsZGVtYW5kZWQ6bi5kZW1hbmRlZCxvcHRpb25hbDpuLm9wdGlvbmFsfSxsJiYodGhpcy5kZWZhdWx0Q29tbWFuZD10aGlzLmhhbmRsZXJzW24uY21kXSl9fWdldENvbW1hbmRIYW5kbGVycygpe3JldHVybiB0aGlzLmhhbmRsZXJzfWdldENvbW1hbmRzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaGFuZGxlcnMpLmNvbmNhdChPYmplY3Qua2V5cyh0aGlzLmFsaWFzTWFwKSl9aGFzRGVmYXVsdENvbW1hbmQoKXtyZXR1cm4hIXRoaXMuZGVmYXVsdENvbW1hbmR9cnVuQ29tbWFuZCh0LGUscyxpLG4scil7Y29uc3Qgbz10aGlzLmhhbmRsZXJzW3RdfHx0aGlzLmhhbmRsZXJzW3RoaXMuYWxpYXNNYXBbdF1dfHx0aGlzLmRlZmF1bHRDb21tYW5kLGE9ZS5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCksaD1hLmNvbW1hbmRzLnNsaWNlKCksbD0hdDt0JiYoYS5jb21tYW5kcy5wdXNoKHQpLGEuZnVsbENvbW1hbmRzLnB1c2goby5vcmlnaW5hbCkpO2NvbnN0IGM9dGhpcy5hcHBseUJ1aWxkZXJVcGRhdGVVc2FnZUFuZFBhcnNlKGwsbyxlLHMuYWxpYXNlcyxoLGksbixyKTtyZXR1cm4gZihjKT9jLnRoZW4oKHQ9PnRoaXMuYXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0KGwsbyx0LmlubmVyQXJndixhLG4sdC5hbGlhc2VzLGUpKSk6dGhpcy5hcHBseU1pZGRsZXdhcmVBbmRHZXRSZXN1bHQobCxvLGMuaW5uZXJBcmd2LGEsbixjLmFsaWFzZXMsZSl9YXBwbHlCdWlsZGVyVXBkYXRlVXNhZ2VBbmRQYXJzZSh0LGUscyxpLG4scixvLGEpe2NvbnN0IGg9ZS5idWlsZGVyO2xldCBsPXM7aWYoeChoKSl7cy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkuZnJlZXplKCk7Y29uc3QgYz1oKHMuZ2V0SW50ZXJuYWxNZXRob2RzKCkucmVzZXQoaSksYSk7aWYoZihjKSlyZXR1cm4gYy50aGVuKChpPT57dmFyIGE7cmV0dXJuIGw9KGE9aSkmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGEuZ2V0SW50ZXJuYWxNZXRob2RzP2k6cyx0aGlzLnBhcnNlQW5kVXBkYXRlVXNhZ2UodCxlLGwsbixyLG8pfSkpfWVsc2UoZnVuY3Rpb24odCl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIHR9KShoKSYmKHMuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmZyZWV6ZSgpLGw9cy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5yZXNldChpKSxPYmplY3Qua2V5cyhlLmJ1aWxkZXIpLmZvckVhY2goKHQ9PntsLm9wdGlvbih0LGhbdF0pfSkpKTtyZXR1cm4gdGhpcy5wYXJzZUFuZFVwZGF0ZVVzYWdlKHQsZSxsLG4scixvKX1wYXJzZUFuZFVwZGF0ZVVzYWdlKHQsZSxzLGksbixyKXt0JiZzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS51bmZyZWV6ZSghMCksdGhpcy5zaG91bGRVcGRhdGVVc2FnZShzKSYmcy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkudXNhZ2UodGhpcy51c2FnZUZyb21QYXJlbnRDb21tYW5kc0NvbW1hbmRIYW5kbGVyKGksZSksZS5kZXNjcmlwdGlvbik7Y29uc3Qgbz1zLmdldEludGVybmFsTWV0aG9kcygpLnJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzKG51bGwsdm9pZCAwLCEwLG4scik7cmV0dXJuIGYobyk/by50aGVuKCh0PT4oe2FsaWFzZXM6cy5wYXJzZWQuYWxpYXNlcyxpbm5lckFyZ3Y6dH0pKSk6e2FsaWFzZXM6cy5wYXJzZWQuYWxpYXNlcyxpbm5lckFyZ3Y6b319c2hvdWxkVXBkYXRlVXNhZ2UodCl7cmV0dXJuIXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmdldFVzYWdlRGlzYWJsZWQoKSYmMD09PXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmdldFVzYWdlKCkubGVuZ3RofXVzYWdlRnJvbVBhcmVudENvbW1hbmRzQ29tbWFuZEhhbmRsZXIodCxlKXtjb25zdCBzPU0udGVzdChlLm9yaWdpbmFsKT9lLm9yaWdpbmFsLnJlcGxhY2UoTSxcIlwiKS50cmltKCk6ZS5vcmlnaW5hbCxpPXQuZmlsdGVyKCh0PT4hTS50ZXN0KHQpKSk7cmV0dXJuIGkucHVzaChzKSxgJDAgJHtpLmpvaW4oXCIgXCIpfWB9aGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdCh0LGUscyxpLG4scixvLGEpe2lmKCFyLmdldEludGVybmFsTWV0aG9kcygpLmdldEhhc091dHB1dCgpKXtjb25zdCBlPXIuZ2V0SW50ZXJuYWxNZXRob2RzKCkucnVuVmFsaWRhdGlvbihuLGEsci5wYXJzZWQuZXJyb3IsdCk7cz1qKHMsKHQ9PihlKHQpLHQpKSl9aWYoZS5oYW5kbGVyJiYhci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRIYXNPdXRwdXQoKSl7ci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5zZXRIYXNPdXRwdXQoKTtjb25zdCBpPSEhci5nZXRPcHRpb25zKCkuY29uZmlndXJhdGlvbltcInBvcHVsYXRlLS1cIl07ci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5wb3N0UHJvY2VzcyhzLGksITEsITEpLHM9aihzPUMocyxyLG8sITEpLCh0PT57Y29uc3Qgcz1lLmhhbmRsZXIodCk7cmV0dXJuIGYocyk/cy50aGVuKCgoKT0+dCkpOnR9KSksdHx8ci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkuY2FjaGVIZWxwTWVzc2FnZSgpLGYocykmJiFyLmdldEludGVybmFsTWV0aG9kcygpLmhhc1BhcnNlQ2FsbGJhY2soKSYmcy5jYXRjaCgodD0+e3RyeXtyLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5mYWlsKG51bGwsdCl9Y2F0Y2godCl7fX0pKX1yZXR1cm4gdHx8KGkuY29tbWFuZHMucG9wKCksaS5mdWxsQ29tbWFuZHMucG9wKCkpLHN9YXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0KHQsZSxzLGksbixyLG8pe2xldCBhPXt9O2lmKG4pcmV0dXJuIHM7by5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRIYXNPdXRwdXQoKXx8KGE9dGhpcy5wb3B1bGF0ZVBvc2l0aW9uYWxzKGUscyxpLG8pKTtjb25zdCBoPXRoaXMuZ2xvYmFsTWlkZGxld2FyZS5nZXRNaWRkbGV3YXJlKCkuc2xpY2UoMCkuY29uY2F0KGUubWlkZGxld2FyZXMpLGw9QyhzLG8saCwhMCk7cmV0dXJuIGYobCk/bC50aGVuKChzPT50aGlzLmhhbmRsZVZhbGlkYXRpb25BbmRHZXRSZXN1bHQodCxlLHMsaSxyLG8saCxhKSkpOnRoaXMuaGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdCh0LGUsbCxpLHIsbyxoLGEpfXBvcHVsYXRlUG9zaXRpb25hbHModCxlLHMsaSl7ZS5fPWUuXy5zbGljZShzLmNvbW1hbmRzLmxlbmd0aCk7Y29uc3Qgbj10LmRlbWFuZGVkLnNsaWNlKDApLHI9dC5vcHRpb25hbC5zbGljZSgwKSxvPXt9O2Zvcih0aGlzLnZhbGlkYXRpb24ucG9zaXRpb25hbENvdW50KG4ubGVuZ3RoLGUuXy5sZW5ndGgpO24ubGVuZ3RoOyl7Y29uc3QgdD1uLnNoaWZ0KCk7dGhpcy5wb3B1bGF0ZVBvc2l0aW9uYWwodCxlLG8pfWZvcig7ci5sZW5ndGg7KXtjb25zdCB0PXIuc2hpZnQoKTt0aGlzLnBvcHVsYXRlUG9zaXRpb25hbCh0LGUsbyl9cmV0dXJuIGUuXz1zLmNvbW1hbmRzLmNvbmNhdChlLl8ubWFwKCh0PT5cIlwiK3QpKSksdGhpcy5wb3N0UHJvY2Vzc1Bvc2l0aW9uYWxzKGUsbyx0aGlzLmNtZFRvUGFyc2VPcHRpb25zKHQub3JpZ2luYWwpLGkpLG99cG9wdWxhdGVQb3NpdGlvbmFsKHQsZSxzKXtjb25zdCBpPXQuY21kWzBdO3QudmFyaWFkaWM/c1tpXT1lLl8uc3BsaWNlKDApLm1hcChTdHJpbmcpOmUuXy5sZW5ndGgmJihzW2ldPVtTdHJpbmcoZS5fLnNoaWZ0KCkpXSl9Y21kVG9QYXJzZU9wdGlvbnModCl7Y29uc3QgZT17YXJyYXk6W10sZGVmYXVsdDp7fSxhbGlhczp7fSxkZW1hbmQ6e319LHM9byh0KTtyZXR1cm4gcy5kZW1hbmRlZC5mb3JFYWNoKCh0PT57Y29uc3RbcywuLi5pXT10LmNtZDt0LnZhcmlhZGljJiYoZS5hcnJheS5wdXNoKHMpLGUuZGVmYXVsdFtzXT1bXSksZS5hbGlhc1tzXT1pLGUuZGVtYW5kW3NdPSEwfSkpLHMub3B0aW9uYWwuZm9yRWFjaCgodD0+e2NvbnN0W3MsLi4uaV09dC5jbWQ7dC52YXJpYWRpYyYmKGUuYXJyYXkucHVzaChzKSxlLmRlZmF1bHRbc109W10pLGUuYWxpYXNbc109aX0pKSxlfXBvc3RQcm9jZXNzUG9zaXRpb25hbHModCxlLHMsaSl7Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LGkuZ2V0T3B0aW9ucygpKTtuLmRlZmF1bHQ9T2JqZWN0LmFzc2lnbihzLmRlZmF1bHQsbi5kZWZhdWx0KTtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhzLmFsaWFzKSluLmFsaWFzW3RdPShuLmFsaWFzW3RdfHxbXSkuY29uY2F0KHMuYWxpYXNbdF0pO24uYXJyYXk9bi5hcnJheS5jb25jYXQocy5hcnJheSksbi5jb25maWc9e307Y29uc3Qgcj1bXTtpZihPYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0PT57ZVt0XS5tYXAoKGU9PntuLmNvbmZpZ3VyYXRpb25bXCJ1bmtub3duLW9wdGlvbnMtYXMtYXJnc1wiXSYmKG4ua2V5W3RdPSEwKSxyLnB1c2goYC0tJHt0fWApLHIucHVzaChlKX0pKX0pKSwhci5sZW5ndGgpcmV0dXJuO2NvbnN0IG89T2JqZWN0LmFzc2lnbih7fSxuLmNvbmZpZ3VyYXRpb24se1wicG9wdWxhdGUtLVwiOiExfSksYT10aGlzLnNoaW0uUGFyc2VyLmRldGFpbGVkKHIsT2JqZWN0LmFzc2lnbih7fSxuLHtjb25maWd1cmF0aW9uOm99KSk7aWYoYS5lcnJvcilpLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5mYWlsKGEuZXJyb3IubWVzc2FnZSxhLmVycm9yKTtlbHNle2NvbnN0IHM9T2JqZWN0LmtleXMoZSk7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e3MucHVzaCguLi5hLmFsaWFzZXNbdF0pfSkpLE9iamVjdC5rZXlzKGEuYXJndikuZm9yRWFjaCgobj0+e3MuaW5jbHVkZXMobikmJihlW25dfHwoZVtuXT1hLmFyZ3Zbbl0pLCF0aGlzLmlzSW5Db25maWdzKGksbikmJiF0aGlzLmlzRGVmYXVsdGVkKGksbikmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYS5hcmd2LG4pJiYoQXJyYXkuaXNBcnJheSh0W25dKXx8QXJyYXkuaXNBcnJheShhLmFyZ3Zbbl0pKT90W25dPVtdLmNvbmNhdCh0W25dLGEuYXJndltuXSk6dFtuXT1hLmFyZ3Zbbl0pfSkpfX1pc0RlZmF1bHRlZCh0LGUpe2NvbnN0e2RlZmF1bHQ6c309dC5nZXRPcHRpb25zKCk7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLGUpfHxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyx0aGlzLnNoaW0uUGFyc2VyLmNhbWVsQ2FzZShlKSl9aXNJbkNvbmZpZ3ModCxlKXtjb25zdHtjb25maWdPYmplY3RzOnN9PXQuZ2V0T3B0aW9ucygpO3JldHVybiBzLnNvbWUoKHQ9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpKSl8fHMuc29tZSgodD0+T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsdGhpcy5zaGltLlBhcnNlci5jYW1lbENhc2UoZSkpKSl9cnVuRGVmYXVsdEJ1aWxkZXJPbih0KXtpZighdGhpcy5kZWZhdWx0Q29tbWFuZClyZXR1cm47aWYodGhpcy5zaG91bGRVcGRhdGVVc2FnZSh0KSl7Y29uc3QgZT1NLnRlc3QodGhpcy5kZWZhdWx0Q29tbWFuZC5vcmlnaW5hbCk/dGhpcy5kZWZhdWx0Q29tbWFuZC5vcmlnaW5hbDp0aGlzLmRlZmF1bHRDb21tYW5kLm9yaWdpbmFsLnJlcGxhY2UoL15bXltcXF08Pl0qLyxcIiQwIFwiKTt0LmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS51c2FnZShlLHRoaXMuZGVmYXVsdENvbW1hbmQuZGVzY3JpcHRpb24pfWNvbnN0IGU9dGhpcy5kZWZhdWx0Q29tbWFuZC5idWlsZGVyO2lmKHgoZSkpcmV0dXJuIGUodCwhMCk7ayhlKXx8T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgocz0+e3Qub3B0aW9uKHMsZVtzXSl9KSl9bW9kdWxlTmFtZSh0KXtjb25zdCBlPWZ1bmN0aW9uKHQpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiByZXF1aXJlKXJldHVybiBudWxsO2ZvcihsZXQgZSxzPTAsaT1PYmplY3Qua2V5cyhyZXF1aXJlLmNhY2hlKTtzPGkubGVuZ3RoO3MrKylpZihlPXJlcXVpcmUuY2FjaGVbaVtzXV0sZS5leHBvcnRzPT09dClyZXR1cm4gZTtyZXR1cm4gbnVsbH0odCk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIG5hbWUgZ2l2ZW4gZm9yIG1vZHVsZTogJHt0aGlzLnNoaW0uaW5zcGVjdCh0KX1gKTtyZXR1cm4gdGhpcy5jb21tYW5kRnJvbUZpbGVuYW1lKGUuZmlsZW5hbWUpfWNvbW1hbmRGcm9tRmlsZW5hbWUodCl7cmV0dXJuIHRoaXMuc2hpbS5wYXRoLmJhc2VuYW1lKHQsdGhpcy5zaGltLnBhdGguZXh0bmFtZSh0KSl9ZXh0cmFjdERlc2Moe2Rlc2NyaWJlOnQsZGVzY3JpcHRpb246ZSxkZXNjOnN9KXtmb3IoY29uc3QgaSBvZlt0LGUsc10pe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBpfHwhMT09PWkpcmV0dXJuIGk7ZChpLCEwLHRoaXMuc2hpbSl9cmV0dXJuITF9ZnJlZXplKCl7dGhpcy5mcm96ZW5zLnB1c2goe2hhbmRsZXJzOnRoaXMuaGFuZGxlcnMsYWxpYXNNYXA6dGhpcy5hbGlhc01hcCxkZWZhdWx0Q29tbWFuZDp0aGlzLmRlZmF1bHRDb21tYW5kfSl9dW5mcmVlemUoKXtjb25zdCB0PXRoaXMuZnJvemVucy5wb3AoKTtkKHQsdm9pZCAwLHRoaXMuc2hpbSksKHtoYW5kbGVyczp0aGlzLmhhbmRsZXJzLGFsaWFzTWFwOnRoaXMuYWxpYXNNYXAsZGVmYXVsdENvbW1hbmQ6dGhpcy5kZWZhdWx0Q29tbWFuZH09dCl9cmVzZXQoKXtyZXR1cm4gdGhpcy5oYW5kbGVycz17fSx0aGlzLmFsaWFzTWFwPXt9LHRoaXMuZGVmYXVsdENvbW1hbmQ9dm9pZCAwLHRoaXMucmVxdWlyZUNhY2hlPW5ldyBTZXQsdGhpc319ZnVuY3Rpb24gayh0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdCYmISF0LmJ1aWxkZXImJlwiZnVuY3Rpb25cIj09dHlwZW9mIHQuaGFuZGxlcn1mdW5jdGlvbiB4KHQpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHR9ZnVuY3Rpb24gRSh0KXtcInVuZGVmaW5lZFwiIT10eXBlb2YgcHJvY2VzcyYmW3Byb2Nlc3Muc3Rkb3V0LHByb2Nlc3Muc3RkZXJyXS5mb3JFYWNoKChlPT57Y29uc3Qgcz1lO3MuX2hhbmRsZSYmcy5pc1RUWSYmXCJmdW5jdGlvblwiPT10eXBlb2Ygcy5faGFuZGxlLnNldEJsb2NraW5nJiZzLl9oYW5kbGUuc2V0QmxvY2tpbmcodCl9KSl9ZnVuY3Rpb24gQSh0KXtyZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIHR9ZnVuY3Rpb24gUCh0LHMpe2NvbnN0IGk9cy55MThuLl9fLG49e30scj1bXTtuLmZhaWxGbj1mdW5jdGlvbih0KXtyLnB1c2godCl9O2xldCBvPW51bGwsYT1udWxsLGg9ITA7bi5zaG93SGVscE9uRmFpbD1mdW5jdGlvbihlPSEwLHMpe2NvbnN0W2kscl09XCJzdHJpbmdcIj09dHlwZW9mIGU/WyEwLGVdOltlLHNdO3JldHVybiB0LmdldEludGVybmFsTWV0aG9kcygpLmlzR2xvYmFsQ29udGV4dCgpJiYoYT1yKSxvPXIsaD1pLG59O2xldCBsPSExO24uZmFpbD1mdW5jdGlvbihzLGkpe2NvbnN0IGM9dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRMb2dnZXJJbnN0YW5jZSgpO2lmKCFyLmxlbmd0aCl7aWYodC5nZXRFeGl0UHJvY2VzcygpJiZFKCEwKSwhbCl7bD0hMCxoJiYodC5zaG93SGVscChcImVycm9yXCIpLGMuZXJyb3IoKSksKHN8fGkpJiZjLmVycm9yKHN8fGkpO2NvbnN0IGU9b3x8YTtlJiYoKHN8fGkpJiZjLmVycm9yKFwiXCIpLGMuZXJyb3IoZSkpfWlmKGk9aXx8bmV3IGUocyksdC5nZXRFeGl0UHJvY2VzcygpKXJldHVybiB0LmV4aXQoMSk7aWYodC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5oYXNQYXJzZUNhbGxiYWNrKCkpcmV0dXJuIHQuZXhpdCgxLGkpO3Rocm93IGl9Zm9yKGxldCB0PXIubGVuZ3RoLTE7dD49MDstLXQpe2NvbnN0IGU9clt0XTtpZihBKGUpKXtpZihpKXRocm93IGk7aWYocyl0aHJvdyBFcnJvcihzKX1lbHNlIGUocyxpLG4pfX07bGV0IGM9W10sZj0hMTtuLnVzYWdlPSh0LGUpPT5udWxsPT09dD8oZj0hMCxjPVtdLG4pOihmPSExLGMucHVzaChbdCxlfHxcIlwiXSksbiksbi5nZXRVc2FnZT0oKT0+YyxuLmdldFVzYWdlRGlzYWJsZWQ9KCk9PmYsbi5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lPSgpPT5pKFwiUG9zaXRpb25hbHM6XCIpO2xldCBkPVtdO24uZXhhbXBsZT0odCxlKT0+e2QucHVzaChbdCxlfHxcIlwiXSl9O2xldCB1PVtdO24uY29tbWFuZD1mdW5jdGlvbih0LGUscyxpLG49ITEpe3MmJih1PXUubWFwKCh0PT4odFsyXT0hMSx0KSkpKSx1LnB1c2goW3QsZXx8XCJcIixzLGksbl0pfSxuLmdldENvbW1hbmRzPSgpPT51O2xldCBwPXt9O24uZGVzY3JpYmU9ZnVuY3Rpb24odCxlKXtBcnJheS5pc0FycmF5KHQpP3QuZm9yRWFjaCgodD0+e24uZGVzY3JpYmUodCxlKX0pKTpcIm9iamVjdFwiPT10eXBlb2YgdD9PYmplY3Qua2V5cyh0KS5mb3JFYWNoKChlPT57bi5kZXNjcmliZShlLHRbZV0pfSkpOnBbdF09ZX0sbi5nZXREZXNjcmlwdGlvbnM9KCk9PnA7bGV0IG09W107bi5lcGlsb2c9dD0+e20ucHVzaCh0KX07bGV0IHksYj0hMTtuLndyYXA9dD0+e2I9ITAseT10fSxuLmdldFdyYXA9KCk9PnMuZ2V0RW52KFwiWUFSR1NfRElTQUJMRV9XUkFQXCIpP251bGw6KGJ8fCh5PWZ1bmN0aW9uKCl7Y29uc3QgdD04MDtyZXR1cm4gcy5wcm9jZXNzLnN0ZENvbHVtbnM/TWF0aC5taW4odCxzLnByb2Nlc3Muc3RkQ29sdW1ucyk6dH0oKSxiPSEwKSx5KTtjb25zdCB2PVwiX195YXJnc1N0cmluZ19fOlwiO2Z1bmN0aW9uIE8odCxlLGkpe2xldCBuPTA7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl8fCh0PU9iamVjdC52YWx1ZXModCkubWFwKCh0PT5bdF0pKSksdC5mb3JFYWNoKCh0PT57bj1NYXRoLm1heChzLnN0cmluZ1dpZHRoKGk/YCR7aX0gJHtJKHRbMF0pfWA6SSh0WzBdKSkrJCh0WzBdKSxuKX0pKSxlJiYobj1NYXRoLm1pbihuLHBhcnNlSW50KCguNSplKS50b1N0cmluZygpLDEwKSkpLG59bGV0IHc7ZnVuY3Rpb24gQyhlKXtyZXR1cm4gdC5nZXRPcHRpb25zKCkuaGlkZGVuT3B0aW9ucy5pbmRleE9mKGUpPDB8fHQucGFyc2VkLmFyZ3ZbdC5nZXRPcHRpb25zKCkuc2hvd0hpZGRlbk9wdF19ZnVuY3Rpb24gaih0LGUpe2xldCBzPWBbJHtpKFwiZGVmYXVsdDpcIil9IGA7aWYodm9pZCAwPT09dCYmIWUpcmV0dXJuIG51bGw7aWYoZSlzKz1lO2Vsc2Ugc3dpdGNoKHR5cGVvZiB0KXtjYXNlXCJzdHJpbmdcIjpzKz1gXCIke3R9XCJgO2JyZWFrO2Nhc2VcIm9iamVjdFwiOnMrPUpTT04uc3RyaW5naWZ5KHQpO2JyZWFrO2RlZmF1bHQ6cys9dH1yZXR1cm5gJHtzfV1gfW4uZGVmZXJZMThuTG9va3VwPXQ9PnYrdCxuLmhlbHA9ZnVuY3Rpb24oKXtpZih3KXJldHVybiB3OyFmdW5jdGlvbigpe2NvbnN0IGU9dC5nZXREZW1hbmRlZE9wdGlvbnMoKSxzPXQuZ2V0T3B0aW9ucygpOyhPYmplY3Qua2V5cyhzLmFsaWFzKXx8W10pLmZvckVhY2goKGk9PntzLmFsaWFzW2ldLmZvckVhY2goKHI9PntwW3JdJiZuLmRlc2NyaWJlKGkscFtyXSksciBpbiBlJiZ0LmRlbWFuZE9wdGlvbihpLGVbcl0pLHMuYm9vbGVhbi5pbmNsdWRlcyhyKSYmdC5ib29sZWFuKGkpLHMuY291bnQuaW5jbHVkZXMocikmJnQuY291bnQoaSkscy5zdHJpbmcuaW5jbHVkZXMocikmJnQuc3RyaW5nKGkpLHMubm9ybWFsaXplLmluY2x1ZGVzKHIpJiZ0Lm5vcm1hbGl6ZShpKSxzLmFycmF5LmluY2x1ZGVzKHIpJiZ0LmFycmF5KGkpLHMubnVtYmVyLmluY2x1ZGVzKHIpJiZ0Lm51bWJlcihpKX0pKX0pKX0oKTtjb25zdCBlPXQuY3VzdG9tU2NyaXB0TmFtZT90LiQwOnMucGF0aC5iYXNlbmFtZSh0LiQwKSxyPXQuZ2V0RGVtYW5kZWRPcHRpb25zKCksbz10LmdldERlbWFuZGVkQ29tbWFuZHMoKSxhPXQuZ2V0RGVwcmVjYXRlZE9wdGlvbnMoKSxoPXQuZ2V0R3JvdXBzKCksbD10LmdldE9wdGlvbnMoKTtsZXQgZz1bXTtnPWcuY29uY2F0KE9iamVjdC5rZXlzKHApKSxnPWcuY29uY2F0KE9iamVjdC5rZXlzKHIpKSxnPWcuY29uY2F0KE9iamVjdC5rZXlzKG8pKSxnPWcuY29uY2F0KE9iamVjdC5rZXlzKGwuZGVmYXVsdCkpLGc9Zy5maWx0ZXIoQyksZz1PYmplY3Qua2V5cyhnLnJlZHVjZSgoKHQsZSk9PihcIl9cIiE9PWUmJih0W2VdPSEwKSx0KSkse30pKTtjb25zdCB5PW4uZ2V0V3JhcCgpLGI9cy5jbGl1aSh7d2lkdGg6eSx3cmFwOiEheX0pO2lmKCFmKWlmKGMubGVuZ3RoKWMuZm9yRWFjaCgodD0+e2IuZGl2KHt0ZXh0OmAke3RbMF0ucmVwbGFjZSgvXFwkMC9nLGUpfWB9KSx0WzFdJiZiLmRpdih7dGV4dDpgJHt0WzFdfWAscGFkZGluZzpbMSwwLDAsMF19KX0pKSxiLmRpdigpO2Vsc2UgaWYodS5sZW5ndGgpe2xldCB0PW51bGw7dD1vLl8/YCR7ZX0gPCR7aShcImNvbW1hbmRcIil9PlxcbmA6YCR7ZX0gWyR7aShcImNvbW1hbmRcIil9XVxcbmAsYi5kaXYoYCR7dH1gKX1pZih1Lmxlbmd0aD4xfHwxPT09dS5sZW5ndGgmJiF1WzBdWzJdKXtiLmRpdihpKFwiQ29tbWFuZHM6XCIpKTtjb25zdCBzPXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLG49cy5jb21tYW5kcy5sZW5ndGg/YCR7cy5jb21tYW5kcy5qb2luKFwiIFwiKX0gYDpcIlwiOyEwPT09dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRQYXJzZXJDb25maWd1cmF0aW9uKClbXCJzb3J0LWNvbW1hbmRzXCJdJiYodT11LnNvcnQoKCh0LGUpPT50WzBdLmxvY2FsZUNvbXBhcmUoZVswXSkpKSk7Y29uc3Qgcj1lP2Ake2V9IGA6XCJcIjt1LmZvckVhY2goKHQ9Pntjb25zdCBzPWAke3J9JHtufSR7dFswXS5yZXBsYWNlKC9eXFwkMCA/LyxcIlwiKX1gO2Iuc3Bhbih7dGV4dDpzLHBhZGRpbmc6WzAsMiwwLDJdLHdpZHRoOk8odSx5LGAke2V9JHtufWApKzR9LHt0ZXh0OnRbMV19KTtjb25zdCBvPVtdO3RbMl0mJm8ucHVzaChgWyR7aShcImRlZmF1bHRcIil9XWApLHRbM10mJnRbM10ubGVuZ3RoJiZvLnB1c2goYFske2koXCJhbGlhc2VzOlwiKX0gJHt0WzNdLmpvaW4oXCIsIFwiKX1dYCksdFs0XSYmKFwic3RyaW5nXCI9PXR5cGVvZiB0WzRdP28ucHVzaChgWyR7aShcImRlcHJlY2F0ZWQ6ICVzXCIsdFs0XSl9XWApOm8ucHVzaChgWyR7aShcImRlcHJlY2F0ZWRcIil9XWApKSxvLmxlbmd0aD9iLmRpdih7dGV4dDpvLmpvaW4oXCIgXCIpLHBhZGRpbmc6WzAsMCwwLDJdLGFsaWduOlwicmlnaHRcIn0pOmIuZGl2KCl9KSksYi5kaXYoKX1jb25zdCBNPShPYmplY3Qua2V5cyhsLmFsaWFzKXx8W10pLmNvbmNhdChPYmplY3Qua2V5cyh0LnBhcnNlZC5uZXdBbGlhc2VzKXx8W10pO2c9Zy5maWx0ZXIoKGU9PiF0LnBhcnNlZC5uZXdBbGlhc2VzW2VdJiZNLmV2ZXJ5KCh0PT4tMT09PShsLmFsaWFzW3RdfHxbXSkuaW5kZXhPZihlKSkpKSk7Y29uc3QgXz1pKFwiT3B0aW9uczpcIik7aFtfXXx8KGhbX109W10pLGZ1bmN0aW9uKHQsZSxzLGkpe2xldCBuPVtdLHI9bnVsbDtPYmplY3Qua2V5cyhzKS5mb3JFYWNoKCh0PT57bj1uLmNvbmNhdChzW3RdKX0pKSx0LmZvckVhY2goKHQ9PntyPVt0XS5jb25jYXQoZVt0XSksci5zb21lKCh0PT4tMSE9PW4uaW5kZXhPZih0KSkpfHxzW2ldLnB1c2godCl9KSl9KGcsbC5hbGlhcyxoLF8pO2NvbnN0IGs9dD0+L14tLS8udGVzdChJKHQpKSx4PU9iamVjdC5rZXlzKGgpLmZpbHRlcigodD0+aFt0XS5sZW5ndGg+MCkpLm1hcCgodD0+KHtncm91cE5hbWU6dCxub3JtYWxpemVkS2V5czpoW3RdLmZpbHRlcihDKS5tYXAoKHQ9PntpZihNLmluY2x1ZGVzKHQpKXJldHVybiB0O2ZvcihsZXQgZSxzPTA7dm9pZCAwIT09KGU9TVtzXSk7cysrKWlmKChsLmFsaWFzW2VdfHxbXSkuaW5jbHVkZXModCkpcmV0dXJuIGU7cmV0dXJuIHR9KSl9KSkpLmZpbHRlcigoKHtub3JtYWxpemVkS2V5czp0fSk9PnQubGVuZ3RoPjApKS5tYXAoKCh7Z3JvdXBOYW1lOnQsbm9ybWFsaXplZEtleXM6ZX0pPT57Y29uc3Qgcz1lLnJlZHVjZSgoKGUscyk9PihlW3NdPVtzXS5jb25jYXQobC5hbGlhc1tzXXx8W10pLm1hcCgoZT0+dD09PW4uZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpP2U6KC9eWzAtOV0kLy50ZXN0KGUpP2wuYm9vbGVhbi5pbmNsdWRlcyhzKT9cIi1cIjpcIi0tXCI6ZS5sZW5ndGg+MT9cIi0tXCI6XCItXCIpK2UpKS5zb3J0KCgodCxlKT0+ayh0KT09PWsoZSk/MDprKHQpPzE6LTEpKS5qb2luKFwiLCBcIiksZSkpLHt9KTtyZXR1cm57Z3JvdXBOYW1lOnQsbm9ybWFsaXplZEtleXM6ZSxzd2l0Y2hlczpzfX0pKTtpZih4LmZpbHRlcigoKHtncm91cE5hbWU6dH0pPT50IT09bi5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lKCkpKS5zb21lKCgoe25vcm1hbGl6ZWRLZXlzOnQsc3dpdGNoZXM6ZX0pPT4hdC5ldmVyeSgodD0+ayhlW3RdKSkpKSkmJnguZmlsdGVyKCgoe2dyb3VwTmFtZTp0fSk9PnQhPT1uLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKSkpLmZvckVhY2goKCh7bm9ybWFsaXplZEtleXM6dCxzd2l0Y2hlczplfSk9Pnt0LmZvckVhY2goKHQ9Pnt2YXIgcyxpO2soZVt0XSkmJihlW3RdPShzPWVbdF0saT00LFMocyk/e3RleHQ6cy50ZXh0LGluZGVudGF0aW9uOnMuaW5kZW50YXRpb24raX06e3RleHQ6cyxpbmRlbnRhdGlvbjppfSkpfSkpfSkpLHguZm9yRWFjaCgoKHtncm91cE5hbWU6ZSxub3JtYWxpemVkS2V5czpzLHN3aXRjaGVzOm99KT0+e2IuZGl2KGUpLHMuZm9yRWFjaCgoZT0+e2NvbnN0IHM9b1tlXTtsZXQgaD1wW2VdfHxcIlwiLGM9bnVsbDtoLmluY2x1ZGVzKHYpJiYoaD1pKGguc3Vic3RyaW5nKDE2KSkpLGwuYm9vbGVhbi5pbmNsdWRlcyhlKSYmKGM9YFske2koXCJib29sZWFuXCIpfV1gKSxsLmNvdW50LmluY2x1ZGVzKGUpJiYoYz1gWyR7aShcImNvdW50XCIpfV1gKSxsLnN0cmluZy5pbmNsdWRlcyhlKSYmKGM9YFske2koXCJzdHJpbmdcIil9XWApLGwubm9ybWFsaXplLmluY2x1ZGVzKGUpJiYoYz1gWyR7aShcInN0cmluZ1wiKX1dYCksbC5hcnJheS5pbmNsdWRlcyhlKSYmKGM9YFske2koXCJhcnJheVwiKX1dYCksbC5udW1iZXIuaW5jbHVkZXMoZSkmJihjPWBbJHtpKFwibnVtYmVyXCIpfV1gKTtjb25zdCBmPVtlIGluIGE/KGQ9YVtlXSxcInN0cmluZ1wiPT10eXBlb2YgZD9gWyR7aShcImRlcHJlY2F0ZWQ6ICVzXCIsZCl9XWA6YFske2koXCJkZXByZWNhdGVkXCIpfV1gKTpudWxsLGMsZSBpbiByP2BbJHtpKFwicmVxdWlyZWRcIil9XWA6bnVsbCxsLmNob2ljZXMmJmwuY2hvaWNlc1tlXT9gWyR7aShcImNob2ljZXM6XCIpfSAke24uc3RyaW5naWZpZWRWYWx1ZXMobC5jaG9pY2VzW2VdKX1dYDpudWxsLGoobC5kZWZhdWx0W2VdLGwuZGVmYXVsdERlc2NyaXB0aW9uW2VdKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpO3ZhciBkO2Iuc3Bhbih7dGV4dDpJKHMpLHBhZGRpbmc6WzAsMiwwLDIrJChzKV0sd2lkdGg6TyhvLHkpKzR9LGgpO2NvbnN0IHU9ITA9PT10LmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlQ29uZmlndXJhdGlvbigpW1wiaGlkZS10eXBlc1wiXTtmJiYhdT9iLmRpdih7dGV4dDpmLHBhZGRpbmc6WzAsMCwwLDJdLGFsaWduOlwicmlnaHRcIn0pOmIuZGl2KCl9KSksYi5kaXYoKX0pKSxkLmxlbmd0aCYmKGIuZGl2KGkoXCJFeGFtcGxlczpcIikpLGQuZm9yRWFjaCgodD0+e3RbMF09dFswXS5yZXBsYWNlKC9cXCQwL2csZSl9KSksZC5mb3JFYWNoKCh0PT57XCJcIj09PXRbMV0/Yi5kaXYoe3RleHQ6dFswXSxwYWRkaW5nOlswLDIsMCwyXX0pOmIuZGl2KHt0ZXh0OnRbMF0scGFkZGluZzpbMCwyLDAsMl0sd2lkdGg6TyhkLHkpKzR9LHt0ZXh0OnRbMV19KX0pKSxiLmRpdigpKSxtLmxlbmd0aD4wKXtjb25zdCB0PW0ubWFwKCh0PT50LnJlcGxhY2UoL1xcJDAvZyxlKSkpLmpvaW4oXCJcXG5cIik7Yi5kaXYoYCR7dH1cXG5gKX1yZXR1cm4gYi50b1N0cmluZygpLnJlcGxhY2UoL1xccyokLyxcIlwiKX0sbi5jYWNoZUhlbHBNZXNzYWdlPWZ1bmN0aW9uKCl7dz10aGlzLmhlbHAoKX0sbi5jbGVhckNhY2hlZEhlbHBNZXNzYWdlPWZ1bmN0aW9uKCl7dz12b2lkIDB9LG4uaGFzQ2FjaGVkSGVscE1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4hIXd9LG4uc2hvd0hlbHA9ZT0+e2NvbnN0IHM9dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRMb2dnZXJJbnN0YW5jZSgpO2V8fChlPVwiZXJyb3JcIik7KFwiZnVuY3Rpb25cIj09dHlwZW9mIGU/ZTpzW2VdKShuLmhlbHAoKSl9LG4uZnVuY3Rpb25EZXNjcmlwdGlvbj10PT5bXCIoXCIsdC5uYW1lP3MuUGFyc2VyLmRlY2FtZWxpemUodC5uYW1lLFwiLVwiKTppKFwiZ2VuZXJhdGVkLXZhbHVlXCIpLFwiKVwiXS5qb2luKFwiXCIpLG4uc3RyaW5naWZpZWRWYWx1ZXM9ZnVuY3Rpb24odCxlKXtsZXQgcz1cIlwiO2NvbnN0IGk9ZXx8XCIsIFwiLG49W10uY29uY2F0KHQpO3JldHVybiB0JiZuLmxlbmd0aD8obi5mb3JFYWNoKCh0PT57cy5sZW5ndGgmJihzKz1pKSxzKz1KU09OLnN0cmluZ2lmeSh0KX0pKSxzKTpzfTtsZXQgTT1udWxsO24udmVyc2lvbj10PT57TT10fSxuLnNob3dWZXJzaW9uPWU9Pntjb25zdCBzPXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0TG9nZ2VySW5zdGFuY2UoKTtlfHwoZT1cImVycm9yXCIpOyhcImZ1bmN0aW9uXCI9PXR5cGVvZiBlP2U6c1tlXSkoTSl9LG4ucmVzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIG89bnVsbCxsPSExLGM9W10sZj0hMSxtPVtdLGQ9W10sdT1bXSxwPWcocCwoZT0+IXRbZV0pKSxufTtjb25zdCBfPVtdO3JldHVybiBuLmZyZWV6ZT1mdW5jdGlvbigpe18ucHVzaCh7ZmFpbE1lc3NhZ2U6byxmYWlsdXJlT3V0cHV0OmwsdXNhZ2VzOmMsdXNhZ2VEaXNhYmxlZDpmLGVwaWxvZ3M6bSxleGFtcGxlczpkLGNvbW1hbmRzOnUsZGVzY3JpcHRpb25zOnB9KX0sbi51bmZyZWV6ZT1mdW5jdGlvbih0PSExKXtjb25zdCBlPV8ucG9wKCk7ZSYmKHQ/KHA9ey4uLmUuZGVzY3JpcHRpb25zLC4uLnB9LHU9Wy4uLmUuY29tbWFuZHMsLi4udV0sYz1bLi4uZS51c2FnZXMsLi4uY10sZD1bLi4uZS5leGFtcGxlcywuLi5kXSxtPVsuLi5lLmVwaWxvZ3MsLi4ubV0pOih7ZmFpbE1lc3NhZ2U6byxmYWlsdXJlT3V0cHV0OmwsdXNhZ2VzOmMsdXNhZ2VEaXNhYmxlZDpmLGVwaWxvZ3M6bSxleGFtcGxlczpkLGNvbW1hbmRzOnUsZGVzY3JpcHRpb25zOnB9PWUpKX0sbn1mdW5jdGlvbiBTKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0fWZ1bmN0aW9uICQodCl7cmV0dXJuIFModCk/dC5pbmRlbnRhdGlvbjowfWZ1bmN0aW9uIEkodCl7cmV0dXJuIFModCk/dC50ZXh0OnR9Y2xhc3MgRHtjb25zdHJ1Y3Rvcih0LGUscyxpKXt2YXIgbixyLG87dGhpcy55YXJncz10LHRoaXMudXNhZ2U9ZSx0aGlzLmNvbW1hbmQ9cyx0aGlzLnNoaW09aSx0aGlzLmNvbXBsZXRpb25LZXk9XCJnZXQteWFyZ3MtY29tcGxldGlvbnNcIix0aGlzLmFsaWFzZXM9bnVsbCx0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbj1udWxsLHRoaXMuaW5kZXhBZnRlckxhc3RSZXNldD0wLHRoaXMuenNoU2hlbGw9bnVsbCE9PShvPShudWxsPT09KG49dGhpcy5zaGltLmdldEVudihcIlNIRUxMXCIpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5pbmNsdWRlcyhcInpzaFwiKSl8fChudWxsPT09KHI9dGhpcy5zaGltLmdldEVudihcIlpTSF9OQU1FXCIpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5pbmNsdWRlcyhcInpzaFwiKSkpJiZ2b2lkIDAhPT1vJiZvfWRlZmF1bHRDb21wbGV0aW9uKHQsZSxzLGkpe2NvbnN0IG49dGhpcy5jb21tYW5kLmdldENvbW1hbmRIYW5kbGVycygpO2ZvcihsZXQgZT0wLHM9dC5sZW5ndGg7ZTxzOysrZSlpZihuW3RbZV1dJiZuW3RbZV1dLmJ1aWxkZXIpe2NvbnN0IHM9blt0W2VdXS5idWlsZGVyO2lmKHgocykpe3RoaXMuaW5kZXhBZnRlckxhc3RSZXNldD1lKzE7Y29uc3QgdD10aGlzLnlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLnJlc2V0KCk7cmV0dXJuIHModCwhMCksdC5hcmd2fX1jb25zdCByPVtdO3RoaXMuY29tbWFuZENvbXBsZXRpb25zKHIsdCxzKSx0aGlzLm9wdGlvbkNvbXBsZXRpb25zKHIsdCxlLHMpLHRoaXMuY2hvaWNlc0Zyb21PcHRpb25zQ29tcGxldGlvbnMocix0LGUscyksdGhpcy5jaG9pY2VzRnJvbVBvc2l0aW9uYWxzQ29tcGxldGlvbnMocix0LGUscyksaShudWxsLHIpfWNvbW1hbmRDb21wbGV0aW9ucyh0LGUscyl7Y29uc3QgaT10aGlzLnlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKS5jb21tYW5kcztzLm1hdGNoKC9eLS8pfHxpW2kubGVuZ3RoLTFdPT09c3x8dGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoZSl8fHRoaXMudXNhZ2UuZ2V0Q29tbWFuZHMoKS5mb3JFYWNoKChzPT57Y29uc3QgaT1vKHNbMF0pLmNtZDtpZigtMT09PWUuaW5kZXhPZihpKSlpZih0aGlzLnpzaFNoZWxsKXtjb25zdCBlPXNbMV18fFwiXCI7dC5wdXNoKGkucmVwbGFjZSgvOi9nLFwiXFxcXDpcIikrXCI6XCIrZSl9ZWxzZSB0LnB1c2goaSl9KSl9b3B0aW9uQ29tcGxldGlvbnModCxlLHMsaSl7aWYoKGkubWF0Y2goL14tLyl8fFwiXCI9PT1pJiYwPT09dC5sZW5ndGgpJiYhdGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoZSkpe2NvbnN0IHM9dGhpcy55YXJncy5nZXRPcHRpb25zKCksbj10aGlzLnlhcmdzLmdldEdyb3VwcygpW3RoaXMudXNhZ2UuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpXXx8W107T2JqZWN0LmtleXMocy5rZXkpLmZvckVhY2goKHI9Pntjb25zdCBvPSEhcy5jb25maWd1cmF0aW9uW1wiYm9vbGVhbi1uZWdhdGlvblwiXSYmcy5ib29sZWFuLmluY2x1ZGVzKHIpO24uaW5jbHVkZXMocil8fHMuaGlkZGVuT3B0aW9ucy5pbmNsdWRlcyhyKXx8dGhpcy5hcmdzQ29udGFpbktleShlLHIsbyl8fHRoaXMuY29tcGxldGVPcHRpb25LZXkocix0LGksbyYmISFzLmRlZmF1bHRbcl0pfSkpfX1jaG9pY2VzRnJvbU9wdGlvbnNDb21wbGV0aW9ucyh0LGUscyxpKXtpZih0aGlzLnByZXZpb3VzQXJnSGFzQ2hvaWNlcyhlKSl7Y29uc3Qgcz10aGlzLmdldFByZXZpb3VzQXJnQ2hvaWNlcyhlKTtzJiZzLmxlbmd0aD4wJiZ0LnB1c2goLi4ucy5tYXAoKHQ9PnQucmVwbGFjZSgvOi9nLFwiXFxcXDpcIikpKSl9fWNob2ljZXNGcm9tUG9zaXRpb25hbHNDb21wbGV0aW9ucyh0LGUscyxpKXtpZihcIlwiPT09aSYmdC5sZW5ndGg+MCYmdGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoZSkpcmV0dXJuO2NvbnN0IG49dGhpcy55YXJncy5nZXRHcm91cHMoKVt0aGlzLnVzYWdlLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKV18fFtdLHI9TWF0aC5tYXgodGhpcy5pbmRleEFmdGVyTGFzdFJlc2V0LHRoaXMueWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLmNvbW1hbmRzLmxlbmd0aCsxKSxvPW5bcy5fLmxlbmd0aC1yLTFdO2lmKCFvKXJldHVybjtjb25zdCBhPXRoaXMueWFyZ3MuZ2V0T3B0aW9ucygpLmNob2ljZXNbb118fFtdO2Zvcihjb25zdCBlIG9mIGEpZS5zdGFydHNXaXRoKGkpJiZ0LnB1c2goZS5yZXBsYWNlKC86L2csXCJcXFxcOlwiKSl9Z2V0UHJldmlvdXNBcmdDaG9pY2VzKHQpe2lmKHQubGVuZ3RoPDEpcmV0dXJuO2xldCBlPXRbdC5sZW5ndGgtMV0scz1cIlwiO2lmKCFlLnN0YXJ0c1dpdGgoXCItXCIpJiZ0Lmxlbmd0aD4xJiYocz1lLGU9dFt0Lmxlbmd0aC0yXSksIWUuc3RhcnRzV2l0aChcIi1cIikpcmV0dXJuO2NvbnN0IGk9ZS5yZXBsYWNlKC9eLSsvLFwiXCIpLG49dGhpcy55YXJncy5nZXRPcHRpb25zKCkscj1baSwuLi50aGlzLnlhcmdzLmdldEFsaWFzZXMoKVtpXXx8W11dO2xldCBvO2Zvcihjb25zdCB0IG9mIHIpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4ua2V5LHQpJiZBcnJheS5pc0FycmF5KG4uY2hvaWNlc1t0XSkpe289bi5jaG9pY2VzW3RdO2JyZWFrfXJldHVybiBvP28uZmlsdGVyKCh0PT4hc3x8dC5zdGFydHNXaXRoKHMpKSk6dm9pZCAwfXByZXZpb3VzQXJnSGFzQ2hvaWNlcyh0KXtjb25zdCBlPXRoaXMuZ2V0UHJldmlvdXNBcmdDaG9pY2VzKHQpO3JldHVybiB2b2lkIDAhPT1lJiZlLmxlbmd0aD4wfWFyZ3NDb250YWluS2V5KHQsZSxzKXtjb25zdCBpPWU9Pi0xIT09dC5pbmRleE9mKCgvXlteMC05XSQvLnRlc3QoZSk/XCItXCI6XCItLVwiKStlKTtpZihpKGUpKXJldHVybiEwO2lmKHMmJmkoYG5vLSR7ZX1gKSlyZXR1cm4hMDtpZih0aGlzLmFsaWFzZXMpZm9yKGNvbnN0IHQgb2YgdGhpcy5hbGlhc2VzW2VdKWlmKGkodCkpcmV0dXJuITA7cmV0dXJuITF9Y29tcGxldGVPcHRpb25LZXkodCxlLHMsaSl7dmFyIG4scixvLGE7bGV0IGg9dDtpZih0aGlzLnpzaFNoZWxsKXtjb25zdCBlPXRoaXMudXNhZ2UuZ2V0RGVzY3JpcHRpb25zKCkscz1udWxsPT09KHI9bnVsbD09PShuPW51bGw9PXRoaXM/dm9pZCAwOnRoaXMuYWxpYXNlcyl8fHZvaWQgMD09PW4/dm9pZCAwOm5bdF0pfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmZpbmQoKHQ9Pntjb25zdCBzPWVbdF07cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHMmJnMubGVuZ3RoPjB9KSksaT1zP2Vbc106dm9pZCAwLGw9bnVsbCE9PShhPW51bGwhPT0obz1lW3RdKSYmdm9pZCAwIT09bz9vOmkpJiZ2b2lkIDAhPT1hP2E6XCJcIjtoPWAke3QucmVwbGFjZSgvOi9nLFwiXFxcXDpcIil9OiR7bC5yZXBsYWNlKFwiX195YXJnc1N0cmluZ19fOlwiLFwiXCIpLnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZ20sXCIgXCIpfWB9Y29uc3QgbD0hL14tLS8udGVzdChzKSYmKHQ9Pi9eW14wLTldJC8udGVzdCh0KSkodCk/XCItXCI6XCItLVwiO2UucHVzaChsK2gpLGkmJmUucHVzaChsK1wibm8tXCIraCl9Y3VzdG9tQ29tcGxldGlvbih0LGUscyxpKXtpZihkKHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uLG51bGwsdGhpcy5zaGltKSx0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbi5sZW5ndGg8Myl7Y29uc3QgdD10aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihzLGUpO3JldHVybiBmKHQpP3QudGhlbigodD0+e3RoaXMuc2hpbS5wcm9jZXNzLm5leHRUaWNrKCgoKT0+e2kobnVsbCx0KX0pKX0pKS5jYXRjaCgodD0+e3RoaXMuc2hpbS5wcm9jZXNzLm5leHRUaWNrKCgoKT0+e2kodCx2b2lkIDApfSkpfSkpOmkobnVsbCx0KX1yZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoPjN9KHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uKT90aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihzLGUsKChuPWkpPT50aGlzLmRlZmF1bHRDb21wbGV0aW9uKHQsZSxzLG4pKSwodD0+e2kobnVsbCx0KX0pKTp0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihzLGUsKHQ9PntpKG51bGwsdCl9KSl9Z2V0Q29tcGxldGlvbih0LGUpe2NvbnN0IHM9dC5sZW5ndGg/dFt0Lmxlbmd0aC0xXTpcIlwiLGk9dGhpcy55YXJncy5wYXJzZSh0LCEwKSxuPXRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uP2k9PnRoaXMuY3VzdG9tQ29tcGxldGlvbih0LGkscyxlKTppPT50aGlzLmRlZmF1bHRDb21wbGV0aW9uKHQsaSxzLGUpO3JldHVybiBmKGkpP2kudGhlbihuKTpuKGkpfWdlbmVyYXRlQ29tcGxldGlvblNjcmlwdCh0LGUpe2xldCBzPXRoaXMuenNoU2hlbGw/JyNjb21wZGVmIHt7YXBwX25hbWV9fVxcbiMjIy1iZWdpbi17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXFxuI1xcbiMgeWFyZ3MgY29tbWFuZCBjb21wbGV0aW9uIHNjcmlwdFxcbiNcXG4jIEluc3RhbGxhdGlvbjoge3thcHBfcGF0aH19IHt7Y29tcGxldGlvbl9jb21tYW5kfX0gPj4gfi8uenNocmNcXG4jICAgIG9yIHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLnpwcm9maWxlIG9uIE9TWC5cXG4jXFxuX3t7YXBwX25hbWV9fV95YXJnc19jb21wbGV0aW9ucygpXFxue1xcbiAgbG9jYWwgcmVwbHlcXG4gIGxvY2FsIHNpPSRJRlNcXG4gIElGUz0kXFwnXFxuXFwnIHJlcGx5PSgkKENPTVBfQ1dPUkQ9XCIkKChDVVJSRU5ULTEpKVwiIENPTVBfTElORT1cIiRCVUZGRVJcIiBDT01QX1BPSU5UPVwiJENVUlNPUlwiIHt7YXBwX3BhdGh9fSAtLWdldC15YXJncy1jb21wbGV0aW9ucyBcIiR7d29yZHNbQF19XCIpKVxcbiAgSUZTPSRzaVxcbiAgX2Rlc2NyaWJlIFxcJ3ZhbHVlc1xcJyByZXBseVxcbn1cXG5jb21wZGVmIF97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMge3thcHBfbmFtZX19XFxuIyMjLWVuZC17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXFxuJzonIyMjLWJlZ2luLXt7YXBwX25hbWV9fS1jb21wbGV0aW9ucy0jIyNcXG4jXFxuIyB5YXJncyBjb21tYW5kIGNvbXBsZXRpb24gc2NyaXB0XFxuI1xcbiMgSW5zdGFsbGF0aW9uOiB7e2FwcF9wYXRofX0ge3tjb21wbGV0aW9uX2NvbW1hbmR9fSA+PiB+Ly5iYXNocmNcXG4jICAgIG9yIHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLmJhc2hfcHJvZmlsZSBvbiBPU1guXFxuI1xcbl97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMoKVxcbntcXG4gICAgbG9jYWwgY3VyX3dvcmQgYXJncyB0eXBlX2xpc3RcXG5cXG4gICAgY3VyX3dvcmQ9XCIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19XCJcXG4gICAgYXJncz0oXCIke0NPTVBfV09SRFNbQF19XCIpXFxuXFxuICAgICMgYXNrIHlhcmdzIHRvIGdlbmVyYXRlIGNvbXBsZXRpb25zLlxcbiAgICB0eXBlX2xpc3Q9JCh7e2FwcF9wYXRofX0gLS1nZXQteWFyZ3MtY29tcGxldGlvbnMgXCIke2FyZ3NbQF19XCIpXFxuXFxuICAgIENPTVBSRVBMWT0oICQoY29tcGdlbiAtVyBcIiR7dHlwZV9saXN0fVwiIC0tICR7Y3VyX3dvcmR9KSApXFxuXFxuICAgICMgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLCBmYWxsIGJhY2sgdG8gZmlsZW5hbWUgY29tcGxldGlvblxcbiAgICBpZiBbICR7I0NPTVBSRVBMWVtAXX0gLWVxIDAgXTsgdGhlblxcbiAgICAgIENPTVBSRVBMWT0oKVxcbiAgICBmaVxcblxcbiAgICByZXR1cm4gMFxcbn1cXG5jb21wbGV0ZSAtbyBiYXNoZGVmYXVsdCAtbyBkZWZhdWx0IC1GIF97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMge3thcHBfbmFtZX19XFxuIyMjLWVuZC17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXFxuJztjb25zdCBpPXRoaXMuc2hpbS5wYXRoLmJhc2VuYW1lKHQpO3JldHVybiB0Lm1hdGNoKC9cXC5qcyQvKSYmKHQ9YC4vJHt0fWApLHM9cy5yZXBsYWNlKC97e2FwcF9uYW1lfX0vZyxpKSxzPXMucmVwbGFjZSgve3tjb21wbGV0aW9uX2NvbW1hbmR9fS9nLGUpLHMucmVwbGFjZSgve3thcHBfcGF0aH19L2csdCl9cmVnaXN0ZXJGdW5jdGlvbih0KXt0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbj10fXNldFBhcnNlZCh0KXt0aGlzLmFsaWFzZXM9dC5hbGlhc2VzfX1mdW5jdGlvbiBOKHQsZSl7aWYoMD09PXQubGVuZ3RoKXJldHVybiBlLmxlbmd0aDtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHQubGVuZ3RoO2NvbnN0IHM9W107bGV0IGksbjtmb3IoaT0wO2k8PWUubGVuZ3RoO2krKylzW2ldPVtpXTtmb3Iobj0wO248PXQubGVuZ3RoO24rKylzWzBdW25dPW47Zm9yKGk9MTtpPD1lLmxlbmd0aDtpKyspZm9yKG49MTtuPD10Lmxlbmd0aDtuKyspZS5jaGFyQXQoaS0xKT09PXQuY2hhckF0KG4tMSk/c1tpXVtuXT1zW2ktMV1bbi0xXTppPjEmJm4+MSYmZS5jaGFyQXQoaS0yKT09PXQuY2hhckF0KG4tMSkmJmUuY2hhckF0KGktMSk9PT10LmNoYXJBdChuLTIpP3NbaV1bbl09c1tpLTJdW24tMl0rMTpzW2ldW25dPU1hdGgubWluKHNbaS0xXVtuLTFdKzEsTWF0aC5taW4oc1tpXVtuLTFdKzEsc1tpLTFdW25dKzEpKTtyZXR1cm4gc1tlLmxlbmd0aF1bdC5sZW5ndGhdfWNvbnN0IEg9W1wiJDBcIixcIi0tXCIsXCJfXCJdO3ZhciB6LFcscSxVLEYsTCxWLEcsUixULEIsWSxLLEosWixYLFEsdHQsZXQsc3QsaXQsbnQscnQsb3QsYXQsaHQsbHQsY3QsZnQsZHQsdXQscHQsZ3QsbXQseXQ7Y29uc3QgYnQ9U3ltYm9sKFwiY29weURvdWJsZURhc2hcIiksdnQ9U3ltYm9sKFwiY29weURvdWJsZURhc2hcIiksT3Q9U3ltYm9sKFwiZGVsZXRlRnJvbVBhcnNlckhpbnRPYmplY3RcIiksd3Q9U3ltYm9sKFwiZW1pdFdhcm5pbmdcIiksQ3Q9U3ltYm9sKFwiZnJlZXplXCIpLGp0PVN5bWJvbChcImdldERvbGxhclplcm9cIiksTXQ9U3ltYm9sKFwiZ2V0UGFyc2VyQ29uZmlndXJhdGlvblwiKSxfdD1TeW1ib2woXCJnZXRVc2FnZUNvbmZpZ3VyYXRpb25cIiksa3Q9U3ltYm9sKFwiZ3Vlc3NMb2NhbGVcIikseHQ9U3ltYm9sKFwiZ3Vlc3NWZXJzaW9uXCIpLEV0PVN5bWJvbChcInBhcnNlUG9zaXRpb25hbE51bWJlcnNcIiksQXQ9U3ltYm9sKFwicGtnVXBcIiksUHQ9U3ltYm9sKFwicG9wdWxhdGVQYXJzZXJIaW50QXJyYXlcIiksU3Q9U3ltYm9sKFwicG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5XCIpLCR0PVN5bWJvbChcInBvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeVwiKSxJdD1TeW1ib2woXCJwb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5XCIpLER0PVN5bWJvbChcInNhbml0aXplS2V5XCIpLE50PVN5bWJvbChcInNldEtleVwiKSxIdD1TeW1ib2woXCJ1bmZyZWV6ZVwiKSx6dD1TeW1ib2woXCJ2YWxpZGF0ZUFzeW5jXCIpLFd0PVN5bWJvbChcImdldENvbW1hbmRJbnN0YW5jZVwiKSxxdD1TeW1ib2woXCJnZXRDb250ZXh0XCIpLFV0PVN5bWJvbChcImdldEhhc091dHB1dFwiKSxGdD1TeW1ib2woXCJnZXRMb2dnZXJJbnN0YW5jZVwiKSxMdD1TeW1ib2woXCJnZXRQYXJzZUNvbnRleHRcIiksVnQ9U3ltYm9sKFwiZ2V0VXNhZ2VJbnN0YW5jZVwiKSxHdD1TeW1ib2woXCJnZXRWYWxpZGF0aW9uSW5zdGFuY2VcIiksUnQ9U3ltYm9sKFwiaGFzUGFyc2VDYWxsYmFja1wiKSxUdD1TeW1ib2woXCJpc0dsb2JhbENvbnRleHRcIiksQnQ9U3ltYm9sKFwicG9zdFByb2Nlc3NcIiksWXQ9U3ltYm9sKFwicmViYXNlXCIpLEt0PVN5bWJvbChcInJlc2V0XCIpLEp0PVN5bWJvbChcInJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzXCIpLFp0PVN5bWJvbChcInJ1blZhbGlkYXRpb25cIiksWHQ9U3ltYm9sKFwic2V0SGFzT3V0cHV0XCIpLFF0PVN5bWJvbChcImtUcmFja01hbnVhbGx5U2V0S2V5c1wiKTtjbGFzcyB0ZXtjb25zdHJ1Y3Rvcih0PVtdLGUscyxpKXt0aGlzLmN1c3RvbVNjcmlwdE5hbWU9ITEsdGhpcy5wYXJzZWQ9ITEsei5zZXQodGhpcyx2b2lkIDApLFcuc2V0KHRoaXMsdm9pZCAwKSxxLnNldCh0aGlzLHtjb21tYW5kczpbXSxmdWxsQ29tbWFuZHM6W119KSxVLnNldCh0aGlzLG51bGwpLEYuc2V0KHRoaXMsbnVsbCksTC5zZXQodGhpcyxcInNob3ctaGlkZGVuXCIpLFYuc2V0KHRoaXMsbnVsbCksRy5zZXQodGhpcywhMCksUi5zZXQodGhpcyx7fSksVC5zZXQodGhpcywhMCksQi5zZXQodGhpcyxbXSksWS5zZXQodGhpcyx2b2lkIDApLEsuc2V0KHRoaXMse30pLEouc2V0KHRoaXMsITEpLFouc2V0KHRoaXMsbnVsbCksWC5zZXQodGhpcywhMCksUS5zZXQodGhpcyx2b2lkIDApLHR0LnNldCh0aGlzLFwiXCIpLGV0LnNldCh0aGlzLHZvaWQgMCksc3Quc2V0KHRoaXMsdm9pZCAwKSxpdC5zZXQodGhpcyx7fSksbnQuc2V0KHRoaXMsbnVsbCkscnQuc2V0KHRoaXMsbnVsbCksb3Quc2V0KHRoaXMse30pLGF0LnNldCh0aGlzLHt9KSxodC5zZXQodGhpcyx2b2lkIDApLGx0LnNldCh0aGlzLCExKSxjdC5zZXQodGhpcyx2b2lkIDApLGZ0LnNldCh0aGlzLCExKSxkdC5zZXQodGhpcywhMSksdXQuc2V0KHRoaXMsITEpLHB0LnNldCh0aGlzLHZvaWQgMCksZ3Quc2V0KHRoaXMse30pLG10LnNldCh0aGlzLG51bGwpLHl0LnNldCh0aGlzLHZvaWQgMCksTyh0aGlzLGN0LGksXCJmXCIpLE8odGhpcyxodCx0LFwiZlwiKSxPKHRoaXMsVyxlLFwiZlwiKSxPKHRoaXMsc3QscyxcImZcIiksTyh0aGlzLFksbmV3IHcodGhpcyksXCJmXCIpLHRoaXMuJDA9dGhpc1tqdF0oKSx0aGlzW0t0XSgpLE8odGhpcyx6LHYodGhpcyx6LFwiZlwiKSxcImZcIiksTyh0aGlzLHB0LHYodGhpcyxwdCxcImZcIiksXCJmXCIpLE8odGhpcyx5dCx2KHRoaXMseXQsXCJmXCIpLFwiZlwiKSxPKHRoaXMsZXQsdih0aGlzLGV0LFwiZlwiKSxcImZcIiksdih0aGlzLGV0LFwiZlwiKS5zaG93SGlkZGVuT3B0PXYodGhpcyxMLFwiZlwiKSxPKHRoaXMsUSx0aGlzW3Z0XSgpLFwiZlwiKX1hZGRIZWxwT3B0KHQsZSl7cmV0dXJuIGgoXCJbc3RyaW5nfGJvb2xlYW5dIFtzdHJpbmddXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLFosXCJmXCIpJiYodGhpc1tPdF0odih0aGlzLFosXCJmXCIpKSxPKHRoaXMsWixudWxsLFwiZlwiKSksITE9PT10JiZ2b2lkIDA9PT1lfHwoTyh0aGlzLFosXCJzdHJpbmdcIj09dHlwZW9mIHQ/dDpcImhlbHBcIixcImZcIiksdGhpcy5ib29sZWFuKHYodGhpcyxaLFwiZlwiKSksdGhpcy5kZXNjcmliZSh2KHRoaXMsWixcImZcIiksZXx8dih0aGlzLHB0LFwiZlwiKS5kZWZlclkxOG5Mb29rdXAoXCJTaG93IGhlbHBcIikpKSx0aGlzfWhlbHAodCxlKXtyZXR1cm4gdGhpcy5hZGRIZWxwT3B0KHQsZSl9YWRkU2hvd0hpZGRlbk9wdCh0LGUpe2lmKGgoXCJbc3RyaW5nfGJvb2xlYW5dIFtzdHJpbmddXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksITE9PT10JiZ2b2lkIDA9PT1lKXJldHVybiB0aGlzO2NvbnN0IHM9XCJzdHJpbmdcIj09dHlwZW9mIHQ/dDp2KHRoaXMsTCxcImZcIik7cmV0dXJuIHRoaXMuYm9vbGVhbihzKSx0aGlzLmRlc2NyaWJlKHMsZXx8dih0aGlzLHB0LFwiZlwiKS5kZWZlclkxOG5Mb29rdXAoXCJTaG93IGhpZGRlbiBvcHRpb25zXCIpKSx2KHRoaXMsZXQsXCJmXCIpLnNob3dIaWRkZW5PcHQ9cyx0aGlzfXNob3dIaWRkZW4odCxlKXtyZXR1cm4gdGhpcy5hZGRTaG93SGlkZGVuT3B0KHQsZSl9YWxpYXModCxlKXtyZXR1cm4gaChcIjxvYmplY3R8c3RyaW5nfGFycmF5PiBbc3RyaW5nfGFycmF5XVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbJHRdKHRoaXMuYWxpYXMuYmluZCh0aGlzKSxcImFsaWFzXCIsdCxlKSx0aGlzfWFycmF5KHQpe3JldHVybiBoKFwiPGFycmF5fHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tQdF0oXCJhcnJheVwiLHQpLHRoaXNbUXRdKHQpLHRoaXN9Ym9vbGVhbih0KXtyZXR1cm4gaChcIjxhcnJheXxzdHJpbmc+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbUHRdKFwiYm9vbGVhblwiLHQpLHRoaXNbUXRdKHQpLHRoaXN9Y2hlY2sodCxlKXtyZXR1cm4gaChcIjxmdW5jdGlvbj4gW2Jvb2xlYW5dXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdGhpcy5taWRkbGV3YXJlKCgoZSxzKT0+aigoKCk9PnQoZSxzLmdldE9wdGlvbnMoKSkpLChzPT4ocz8oXCJzdHJpbmdcIj09dHlwZW9mIHN8fHMgaW5zdGFuY2VvZiBFcnJvcikmJnYodGhpcyxwdCxcImZcIikuZmFpbChzLnRvU3RyaW5nKCkscyk6dih0aGlzLHB0LFwiZlwiKS5mYWlsKHYodGhpcyxjdCxcImZcIikueTE4bi5fXyhcIkFyZ3VtZW50IGNoZWNrIGZhaWxlZDogJXNcIix0LnRvU3RyaW5nKCkpKSxlKSksKHQ9Pih2KHRoaXMscHQsXCJmXCIpLmZhaWwodC5tZXNzYWdlP3QubWVzc2FnZTp0LnRvU3RyaW5nKCksdCksZSkpKSksITEsZSksdGhpc31jaG9pY2VzKHQsZSl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ3xhcnJheV1cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzWyR0XSh0aGlzLmNob2ljZXMuYmluZCh0aGlzKSxcImNob2ljZXNcIix0LGUpLHRoaXN9Y29lcmNlKHQscyl7aWYoaChcIjxvYmplY3R8c3RyaW5nfGFycmF5PiBbZnVuY3Rpb25dXCIsW3Qsc10sYXJndW1lbnRzLmxlbmd0aCksQXJyYXkuaXNBcnJheSh0KSl7aWYoIXMpdGhyb3cgbmV3IGUoXCJjb2VyY2UgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZFwiKTtmb3IoY29uc3QgZSBvZiB0KXRoaXMuY29lcmNlKGUscyk7cmV0dXJuIHRoaXN9aWYoXCJvYmplY3RcIj09dHlwZW9mIHQpe2Zvcihjb25zdCBlIG9mIE9iamVjdC5rZXlzKHQpKXRoaXMuY29lcmNlKGUsdFtlXSk7cmV0dXJuIHRoaXN9aWYoIXMpdGhyb3cgbmV3IGUoXCJjb2VyY2UgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZFwiKTtyZXR1cm4gdih0aGlzLGV0LFwiZlwiKS5rZXlbdF09ITAsdih0aGlzLFksXCJmXCIpLmFkZENvZXJjZU1pZGRsZXdhcmUoKChpLG4pPT57bGV0IHI7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLHQpP2ooKCgpPT4ocj1uLmdldEFsaWFzZXMoKSxzKGlbdF0pKSksKGU9PntpW3RdPWU7Y29uc3Qgcz1uLmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKVtcInN0cmlwLWFsaWFzZWRcIl07aWYoclt0XSYmITAhPT1zKWZvcihjb25zdCBzIG9mIHJbdF0paVtzXT1lO3JldHVybiBpfSksKHQ9Pnt0aHJvdyBuZXcgZSh0Lm1lc3NhZ2UpfSkpOml9KSx0KSx0aGlzfWNvbmZsaWN0cyh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xvYmplY3Q+IFtzdHJpbmd8YXJyYXldXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLHl0LFwiZlwiKS5jb25mbGljdHModCxlKSx0aGlzfWNvbmZpZyh0PVwiY29uZmlnXCIsZSxzKXtyZXR1cm4gaChcIltvYmplY3R8c3RyaW5nXSBbc3RyaW5nfGZ1bmN0aW9uXSBbZnVuY3Rpb25dXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSxcIm9iamVjdFwiIT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KT8oXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmKHM9ZSxlPXZvaWQgMCksdGhpcy5kZXNjcmliZSh0LGV8fHYodGhpcyxwdCxcImZcIikuZGVmZXJZMThuTG9va3VwKFwiUGF0aCB0byBKU09OIGNvbmZpZyBmaWxlXCIpKSwoQXJyYXkuaXNBcnJheSh0KT90Olt0XSkuZm9yRWFjaCgodD0+e3YodGhpcyxldCxcImZcIikuY29uZmlnW3RdPXN8fCEwfSkpLHRoaXMpOih0PW4odCx2KHRoaXMsVyxcImZcIiksdGhpc1tNdF0oKVtcImRlZXAtbWVyZ2UtY29uZmlnXCJdfHwhMSx2KHRoaXMsY3QsXCJmXCIpKSx2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHM9KHYodGhpcyxldCxcImZcIikuY29uZmlnT2JqZWN0c3x8W10pLmNvbmNhdCh0KSx0aGlzKX1jb21wbGV0aW9uKHQsZSxzKXtyZXR1cm4gaChcIltzdHJpbmddIFtzdHJpbmd8Ym9vbGVhbnxmdW5jdGlvbl0gW2Z1bmN0aW9uXVwiLFt0LGUsc10sYXJndW1lbnRzLmxlbmd0aCksXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmKHM9ZSxlPXZvaWQgMCksTyh0aGlzLEYsdHx8dih0aGlzLEYsXCJmXCIpfHxcImNvbXBsZXRpb25cIixcImZcIiksZXx8ITE9PT1lfHwoZT1cImdlbmVyYXRlIGNvbXBsZXRpb24gc2NyaXB0XCIpLHRoaXMuY29tbWFuZCh2KHRoaXMsRixcImZcIiksZSkscyYmdih0aGlzLFUsXCJmXCIpLnJlZ2lzdGVyRnVuY3Rpb24ocyksdGhpc31jb21tYW5kKHQsZSxzLGksbixyKXtyZXR1cm4gaChcIjxzdHJpbmd8YXJyYXl8b2JqZWN0PiBbc3RyaW5nfGJvb2xlYW5dIFtmdW5jdGlvbnxvYmplY3RdIFtmdW5jdGlvbl0gW2FycmF5XSBbYm9vbGVhbnxzdHJpbmddXCIsW3QsZSxzLGksbixyXSxhcmd1bWVudHMubGVuZ3RoKSx2KHRoaXMseixcImZcIikuYWRkSGFuZGxlcih0LGUscyxpLG4sciksdGhpc31jb21tYW5kcyh0LGUscyxpLG4scil7cmV0dXJuIHRoaXMuY29tbWFuZCh0LGUscyxpLG4scil9Y29tbWFuZERpcih0LGUpe2goXCI8c3RyaW5nPiBbb2JqZWN0XVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpO2NvbnN0IHM9dih0aGlzLHN0LFwiZlwiKXx8dih0aGlzLGN0LFwiZlwiKS5yZXF1aXJlO3JldHVybiB2KHRoaXMseixcImZcIikuYWRkRGlyZWN0b3J5KHQscyx2KHRoaXMsY3QsXCJmXCIpLmdldENhbGxlckZpbGUoKSxlKSx0aGlzfWNvdW50KHQpe3JldHVybiBoKFwiPGFycmF5fHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tQdF0oXCJjb3VudFwiLHQpLHRoaXNbUXRdKHQpLHRoaXN9ZGVmYXVsdCh0LGUscyl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gWypdIFtzdHJpbmddXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSxzJiYodSh0LHYodGhpcyxjdCxcImZcIikpLHYodGhpcyxldCxcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW3RdPXMpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJih1KHQsdih0aGlzLGN0LFwiZlwiKSksdih0aGlzLGV0LFwiZlwiKS5kZWZhdWx0RGVzY3JpcHRpb25bdF18fCh2KHRoaXMsZXQsXCJmXCIpLmRlZmF1bHREZXNjcmlwdGlvblt0XT12KHRoaXMscHQsXCJmXCIpLmZ1bmN0aW9uRGVzY3JpcHRpb24oZSkpLGU9ZS5jYWxsKCkpLHRoaXNbU3RdKHRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLFwiZGVmYXVsdFwiLHQsZSksdGhpc31kZWZhdWx0cyh0LGUscyl7cmV0dXJuIHRoaXMuZGVmYXVsdCh0LGUscyl9ZGVtYW5kQ29tbWFuZCh0PTEsZSxzLGkpe3JldHVybiBoKFwiW251bWJlcl0gW251bWJlcnxzdHJpbmddIFtzdHJpbmd8bnVsbHx1bmRlZmluZWRdIFtzdHJpbmd8bnVsbHx1bmRlZmluZWRdXCIsW3QsZSxzLGldLGFyZ3VtZW50cy5sZW5ndGgpLFwibnVtYmVyXCIhPXR5cGVvZiBlJiYocz1lLGU9MS8wKSx0aGlzLmdsb2JhbChcIl9cIiwhMSksdih0aGlzLGV0LFwiZlwiKS5kZW1hbmRlZENvbW1hbmRzLl89e21pbjp0LG1heDplLG1pbk1zZzpzLG1heE1zZzppfSx0aGlzfWRlbWFuZCh0LGUscyl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/KGUuZm9yRWFjaCgodD0+e2QocywhMCx2KHRoaXMsY3QsXCJmXCIpKSx0aGlzLmRlbWFuZE9wdGlvbih0LHMpfSkpLGU9MS8wKTpcIm51bWJlclwiIT10eXBlb2YgZSYmKHM9ZSxlPTEvMCksXCJudW1iZXJcIj09dHlwZW9mIHQ/KGQocywhMCx2KHRoaXMsY3QsXCJmXCIpKSx0aGlzLmRlbWFuZENvbW1hbmQodCxlLHMscykpOkFycmF5LmlzQXJyYXkodCk/dC5mb3JFYWNoKCh0PT57ZChzLCEwLHYodGhpcyxjdCxcImZcIikpLHRoaXMuZGVtYW5kT3B0aW9uKHQscyl9KSk6XCJzdHJpbmdcIj09dHlwZW9mIHM/dGhpcy5kZW1hbmRPcHRpb24odCxzKTohMCE9PXMmJnZvaWQgMCE9PXN8fHRoaXMuZGVtYW5kT3B0aW9uKHQpLHRoaXN9ZGVtYW5kT3B0aW9uKHQsZSl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW1N0XSh0aGlzLmRlbWFuZE9wdGlvbi5iaW5kKHRoaXMpLFwiZGVtYW5kZWRPcHRpb25zXCIsdCxlKSx0aGlzfWRlcHJlY2F0ZU9wdGlvbih0LGUpe3JldHVybiBoKFwiPHN0cmluZz4gW3N0cmluZ3xib29sZWFuXVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLHYodGhpcyxldCxcImZcIikuZGVwcmVjYXRlZE9wdGlvbnNbdF09ZSx0aGlzfWRlc2NyaWJlKHQsZSl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW050XSh0LCEwKSx2KHRoaXMscHQsXCJmXCIpLmRlc2NyaWJlKHQsZSksdGhpc31kZXRlY3RMb2NhbGUodCl7cmV0dXJuIGgoXCI8Ym9vbGVhbj5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksTyh0aGlzLEcsdCxcImZcIiksdGhpc31lbnYodCl7cmV0dXJuIGgoXCJbc3RyaW5nfGJvb2xlYW5dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLCExPT09dD9kZWxldGUgdih0aGlzLGV0LFwiZlwiKS5lbnZQcmVmaXg6dih0aGlzLGV0LFwiZlwiKS5lbnZQcmVmaXg9dHx8XCJcIix0aGlzfWVwaWxvZ3VlKHQpe3JldHVybiBoKFwiPHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLHB0LFwiZlwiKS5lcGlsb2codCksdGhpc31lcGlsb2codCl7cmV0dXJuIHRoaXMuZXBpbG9ndWUodCl9ZXhhbXBsZSh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xhcnJheT4gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSxBcnJheS5pc0FycmF5KHQpP3QuZm9yRWFjaCgodD0+dGhpcy5leGFtcGxlKC4uLnQpKSk6dih0aGlzLHB0LFwiZlwiKS5leGFtcGxlKHQsZSksdGhpc31leGl0KHQsZSl7Tyh0aGlzLEosITAsXCJmXCIpLE8odGhpcyxWLGUsXCJmXCIpLHYodGhpcyxULFwiZlwiKSYmdih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmV4aXQodCl9ZXhpdFByb2Nlc3ModD0hMCl7cmV0dXJuIGgoXCJbYm9vbGVhbl1cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksTyh0aGlzLFQsdCxcImZcIiksdGhpc31mYWlsKHQpe2lmKGgoXCI8ZnVuY3Rpb258Ym9vbGVhbj5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksXCJib29sZWFuXCI9PXR5cGVvZiB0JiYhMSE9PXQpdGhyb3cgbmV3IGUoXCJJbnZhbGlkIGZpcnN0IGFyZ3VtZW50LiBFeHBlY3RlZCBmdW5jdGlvbiBvciBib29sZWFuICdmYWxzZSdcIik7cmV0dXJuIHYodGhpcyxwdCxcImZcIikuZmFpbEZuKHQpLHRoaXN9Z2V0QWxpYXNlcygpe3JldHVybiB0aGlzLnBhcnNlZD90aGlzLnBhcnNlZC5hbGlhc2VzOnt9fWFzeW5jIGdldENvbXBsZXRpb24odCxlKXtyZXR1cm4gaChcIjxhcnJheT4gW2Z1bmN0aW9uXVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLGU/dih0aGlzLFUsXCJmXCIpLmdldENvbXBsZXRpb24odCxlKTpuZXcgUHJvbWlzZSgoKGUscyk9Pnt2KHRoaXMsVSxcImZcIikuZ2V0Q29tcGxldGlvbih0LCgodCxpKT0+e3Q/cyh0KTplKGkpfSkpfSkpfWdldERlbWFuZGVkT3B0aW9ucygpe3JldHVybiBoKFtdLDApLHYodGhpcyxldCxcImZcIikuZGVtYW5kZWRPcHRpb25zfWdldERlbWFuZGVkQ29tbWFuZHMoKXtyZXR1cm4gaChbXSwwKSx2KHRoaXMsZXQsXCJmXCIpLmRlbWFuZGVkQ29tbWFuZHN9Z2V0RGVwcmVjYXRlZE9wdGlvbnMoKXtyZXR1cm4gaChbXSwwKSx2KHRoaXMsZXQsXCJmXCIpLmRlcHJlY2F0ZWRPcHRpb25zfWdldERldGVjdExvY2FsZSgpe3JldHVybiB2KHRoaXMsRyxcImZcIil9Z2V0RXhpdFByb2Nlc3MoKXtyZXR1cm4gdih0aGlzLFQsXCJmXCIpfWdldEdyb3Vwcygpe3JldHVybiBPYmplY3QuYXNzaWduKHt9LHYodGhpcyxLLFwiZlwiKSx2KHRoaXMsYXQsXCJmXCIpKX1nZXRIZWxwKCl7aWYoTyh0aGlzLEosITAsXCJmXCIpLCF2KHRoaXMscHQsXCJmXCIpLmhhc0NhY2hlZEhlbHBNZXNzYWdlKCkpe2lmKCF0aGlzLnBhcnNlZCl7Y29uc3QgdD10aGlzW0p0XSh2KHRoaXMsaHQsXCJmXCIpLHZvaWQgMCx2b2lkIDAsMCwhMCk7aWYoZih0KSlyZXR1cm4gdC50aGVuKCgoKT0+dih0aGlzLHB0LFwiZlwiKS5oZWxwKCkpKX1jb25zdCB0PXYodGhpcyx6LFwiZlwiKS5ydW5EZWZhdWx0QnVpbGRlck9uKHRoaXMpO2lmKGYodCkpcmV0dXJuIHQudGhlbigoKCk9PnYodGhpcyxwdCxcImZcIikuaGVscCgpKSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KHRoaXMscHQsXCJmXCIpLmhlbHAoKSl9Z2V0T3B0aW9ucygpe3JldHVybiB2KHRoaXMsZXQsXCJmXCIpfWdldFN0cmljdCgpe3JldHVybiB2KHRoaXMsZnQsXCJmXCIpfWdldFN0cmljdENvbW1hbmRzKCl7cmV0dXJuIHYodGhpcyxkdCxcImZcIil9Z2V0U3RyaWN0T3B0aW9ucygpe3JldHVybiB2KHRoaXMsdXQsXCJmXCIpfWdsb2JhbCh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xhcnJheT4gW2Jvb2xlYW5dXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdD1bXS5jb25jYXQodCksITEhPT1lP3YodGhpcyxldCxcImZcIikubG9jYWw9dih0aGlzLGV0LFwiZlwiKS5sb2NhbC5maWx0ZXIoKGU9Pi0xPT09dC5pbmRleE9mKGUpKSk6dC5mb3JFYWNoKCh0PT57dih0aGlzLGV0LFwiZlwiKS5sb2NhbC5pbmNsdWRlcyh0KXx8dih0aGlzLGV0LFwiZlwiKS5sb2NhbC5wdXNoKHQpfSkpLHRoaXN9Z3JvdXAodCxlKXtoKFwiPHN0cmluZ3xhcnJheT4gPHN0cmluZz5cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKTtjb25zdCBzPXYodGhpcyxhdCxcImZcIilbZV18fHYodGhpcyxLLFwiZlwiKVtlXTt2KHRoaXMsYXQsXCJmXCIpW2VdJiZkZWxldGUgdih0aGlzLGF0LFwiZlwiKVtlXTtjb25zdCBpPXt9O3JldHVybiB2KHRoaXMsSyxcImZcIilbZV09KHN8fFtdKS5jb25jYXQodCkuZmlsdGVyKCh0PT4haVt0XSYmKGlbdF09ITApKSksdGhpc31oaWRlKHQpe3JldHVybiBoKFwiPHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLGV0LFwiZlwiKS5oaWRkZW5PcHRpb25zLnB1c2godCksdGhpc31pbXBsaWVzKHQsZSl7cmV0dXJuIGgoXCI8c3RyaW5nfG9iamVjdD4gW251bWJlcnxzdHJpbmd8YXJyYXldXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLHl0LFwiZlwiKS5pbXBsaWVzKHQsZSksdGhpc31sb2NhbGUodCl7cmV0dXJuIGgoXCJbc3RyaW5nXVwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSx2b2lkIDA9PT10Pyh0aGlzW2t0XSgpLHYodGhpcyxjdCxcImZcIikueTE4bi5nZXRMb2NhbGUoKSk6KE8odGhpcyxHLCExLFwiZlwiKSx2KHRoaXMsY3QsXCJmXCIpLnkxOG4uc2V0TG9jYWxlKHQpLHRoaXMpfW1pZGRsZXdhcmUodCxlLHMpe3JldHVybiB2KHRoaXMsWSxcImZcIikuYWRkTWlkZGxld2FyZSh0LCEhZSxzKX1uYXJncyh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xvYmplY3R8YXJyYXk+IFtudW1iZXJdXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tTdF0odGhpcy5uYXJncy5iaW5kKHRoaXMpLFwibmFyZ1wiLHQsZSksdGhpc31ub3JtYWxpemUodCl7cmV0dXJuIGgoXCI8YXJyYXl8c3RyaW5nPlwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW1B0XShcIm5vcm1hbGl6ZVwiLHQpLHRoaXN9bnVtYmVyKHQpe3JldHVybiBoKFwiPGFycmF5fHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tQdF0oXCJudW1iZXJcIix0KSx0aGlzW1F0XSh0KSx0aGlzfW9wdGlvbih0LGUpe2lmKGgoXCI8c3RyaW5nfG9iamVjdD4gW29iamVjdF1cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSxcIm9iamVjdFwiPT10eXBlb2YgdClPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChlPT57dGhpcy5vcHRpb25zKGUsdFtlXSl9KSk7ZWxzZXtcIm9iamVjdFwiIT10eXBlb2YgZSYmKGU9e30pLHRoaXNbUXRdKHQpLCF2KHRoaXMsbXQsXCJmXCIpfHxcInZlcnNpb25cIiE9PXQmJlwidmVyc2lvblwiIT09KG51bGw9PWU/dm9pZCAwOmUuYWxpYXMpfHx0aGlzW3d0XShbJ1widmVyc2lvblwiIGlzIGEgcmVzZXJ2ZWQgd29yZC4nLFwiUGxlYXNlIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOlwiLCctIERpc2FibGUgdmVyc2lvbiB3aXRoIGB5YXJncy52ZXJzaW9uKGZhbHNlKWAgaWYgdXNpbmcgXCJ2ZXJzaW9uXCIgYXMgYW4gb3B0aW9uJyxcIi0gVXNlIHRoZSBidWlsdC1pbiBgeWFyZ3MudmVyc2lvbmAgbWV0aG9kIGluc3RlYWQgKGlmIGFwcGxpY2FibGUpXCIsXCItIFVzZSBhIGRpZmZlcmVudCBvcHRpb24ga2V5XCIsXCJodHRwczovL3lhcmdzLmpzLm9yZy9kb2NzLyNhcGktcmVmZXJlbmNlLXZlcnNpb25cIl0uam9pbihcIlxcblwiKSx2b2lkIDAsXCJ2ZXJzaW9uV2FybmluZ1wiKSx2KHRoaXMsZXQsXCJmXCIpLmtleVt0XT0hMCxlLmFsaWFzJiZ0aGlzLmFsaWFzKHQsZS5hbGlhcyk7Y29uc3Qgcz1lLmRlcHJlY2F0ZXx8ZS5kZXByZWNhdGVkO3MmJnRoaXMuZGVwcmVjYXRlT3B0aW9uKHQscyk7Y29uc3QgaT1lLmRlbWFuZHx8ZS5yZXF1aXJlZHx8ZS5yZXF1aXJlO2kmJnRoaXMuZGVtYW5kKHQsaSksZS5kZW1hbmRPcHRpb24mJnRoaXMuZGVtYW5kT3B0aW9uKHQsXCJzdHJpbmdcIj09dHlwZW9mIGUuZGVtYW5kT3B0aW9uP2UuZGVtYW5kT3B0aW9uOnZvaWQgMCksZS5jb25mbGljdHMmJnRoaXMuY29uZmxpY3RzKHQsZS5jb25mbGljdHMpLFwiZGVmYXVsdFwiaW4gZSYmdGhpcy5kZWZhdWx0KHQsZS5kZWZhdWx0KSx2b2lkIDAhPT1lLmltcGxpZXMmJnRoaXMuaW1wbGllcyh0LGUuaW1wbGllcyksdm9pZCAwIT09ZS5uYXJncyYmdGhpcy5uYXJncyh0LGUubmFyZ3MpLGUuY29uZmlnJiZ0aGlzLmNvbmZpZyh0LGUuY29uZmlnUGFyc2VyKSxlLm5vcm1hbGl6ZSYmdGhpcy5ub3JtYWxpemUodCksZS5jaG9pY2VzJiZ0aGlzLmNob2ljZXModCxlLmNob2ljZXMpLGUuY29lcmNlJiZ0aGlzLmNvZXJjZSh0LGUuY29lcmNlKSxlLmdyb3VwJiZ0aGlzLmdyb3VwKHQsZS5ncm91cCksKGUuYm9vbGVhbnx8XCJib29sZWFuXCI9PT1lLnR5cGUpJiYodGhpcy5ib29sZWFuKHQpLGUuYWxpYXMmJnRoaXMuYm9vbGVhbihlLmFsaWFzKSksKGUuYXJyYXl8fFwiYXJyYXlcIj09PWUudHlwZSkmJih0aGlzLmFycmF5KHQpLGUuYWxpYXMmJnRoaXMuYXJyYXkoZS5hbGlhcykpLChlLm51bWJlcnx8XCJudW1iZXJcIj09PWUudHlwZSkmJih0aGlzLm51bWJlcih0KSxlLmFsaWFzJiZ0aGlzLm51bWJlcihlLmFsaWFzKSksKGUuc3RyaW5nfHxcInN0cmluZ1wiPT09ZS50eXBlKSYmKHRoaXMuc3RyaW5nKHQpLGUuYWxpYXMmJnRoaXMuc3RyaW5nKGUuYWxpYXMpKSwoZS5jb3VudHx8XCJjb3VudFwiPT09ZS50eXBlKSYmdGhpcy5jb3VudCh0KSxcImJvb2xlYW5cIj09dHlwZW9mIGUuZ2xvYmFsJiZ0aGlzLmdsb2JhbCh0LGUuZ2xvYmFsKSxlLmRlZmF1bHREZXNjcmlwdGlvbiYmKHYodGhpcyxldCxcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW3RdPWUuZGVmYXVsdERlc2NyaXB0aW9uKSxlLnNraXBWYWxpZGF0aW9uJiZ0aGlzLnNraXBWYWxpZGF0aW9uKHQpO2NvbnN0IG49ZS5kZXNjcmliZXx8ZS5kZXNjcmlwdGlvbnx8ZS5kZXNjLHI9dih0aGlzLHB0LFwiZlwiKS5nZXREZXNjcmlwdGlvbnMoKTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocix0KSYmXCJzdHJpbmdcIiE9dHlwZW9mIG58fHRoaXMuZGVzY3JpYmUodCxuKSxlLmhpZGRlbiYmdGhpcy5oaWRlKHQpLGUucmVxdWlyZXNBcmcmJnRoaXMucmVxdWlyZXNBcmcodCl9cmV0dXJuIHRoaXN9b3B0aW9ucyh0LGUpe3JldHVybiB0aGlzLm9wdGlvbih0LGUpfXBhcnNlKHQsZSxzKXtoKFwiW3N0cmluZ3xhcnJheV0gW2Z1bmN0aW9ufGJvb2xlYW58b2JqZWN0XSBbZnVuY3Rpb25dXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW0N0XSgpLHZvaWQgMD09PXQmJih0PXYodGhpcyxodCxcImZcIikpLFwib2JqZWN0XCI9PXR5cGVvZiBlJiYoTyh0aGlzLHJ0LGUsXCJmXCIpLGU9cyksXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmKE8odGhpcyxudCxlLFwiZlwiKSxlPSExKSxlfHxPKHRoaXMsaHQsdCxcImZcIiksdih0aGlzLG50LFwiZlwiKSYmTyh0aGlzLFQsITEsXCJmXCIpO2NvbnN0IGk9dGhpc1tKdF0odCwhIWUpLG49dGhpcy5wYXJzZWQ7cmV0dXJuIHYodGhpcyxVLFwiZlwiKS5zZXRQYXJzZWQodGhpcy5wYXJzZWQpLGYoaSk/aS50aGVuKCh0PT4odih0aGlzLG50LFwiZlwiKSYmdih0aGlzLG50LFwiZlwiKS5jYWxsKHRoaXMsdih0aGlzLFYsXCJmXCIpLHQsdih0aGlzLHR0LFwiZlwiKSksdCkpKS5jYXRjaCgodD0+e3Rocm93IHYodGhpcyxudCxcImZcIikmJnYodGhpcyxudCxcImZcIikodCx0aGlzLnBhcnNlZC5hcmd2LHYodGhpcyx0dCxcImZcIikpLHR9KSkuZmluYWxseSgoKCk9Pnt0aGlzW0h0XSgpLHRoaXMucGFyc2VkPW59KSk6KHYodGhpcyxudCxcImZcIikmJnYodGhpcyxudCxcImZcIikuY2FsbCh0aGlzLHYodGhpcyxWLFwiZlwiKSxpLHYodGhpcyx0dCxcImZcIikpLHRoaXNbSHRdKCksdGhpcy5wYXJzZWQ9bixpKX1wYXJzZUFzeW5jKHQsZSxzKXtjb25zdCBpPXRoaXMucGFyc2UodCxlLHMpO3JldHVybiBmKGkpP2k6UHJvbWlzZS5yZXNvbHZlKGkpfXBhcnNlU3luYyh0LHMsaSl7Y29uc3Qgbj10aGlzLnBhcnNlKHQscyxpKTtpZihmKG4pKXRocm93IG5ldyBlKFwiLnBhcnNlU3luYygpIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhc3luY2hyb25vdXMgYnVpbGRlcnMsIGhhbmRsZXJzLCBvciBtaWRkbGV3YXJlXCIpO3JldHVybiBufXBhcnNlckNvbmZpZ3VyYXRpb24odCl7cmV0dXJuIGgoXCI8b2JqZWN0PlwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsaXQsdCxcImZcIiksdGhpc31wa2dDb25mKHQsZSl7aChcIjxzdHJpbmc+IFtzdHJpbmddXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCk7bGV0IHM9bnVsbDtjb25zdCBpPXRoaXNbQXRdKGV8fHYodGhpcyxXLFwiZlwiKSk7cmV0dXJuIGlbdF0mJlwib2JqZWN0XCI9PXR5cGVvZiBpW3RdJiYocz1uKGlbdF0sZXx8dih0aGlzLFcsXCJmXCIpLHRoaXNbTXRdKClbXCJkZWVwLW1lcmdlLWNvbmZpZ1wiXXx8ITEsdih0aGlzLGN0LFwiZlwiKSksdih0aGlzLGV0LFwiZlwiKS5jb25maWdPYmplY3RzPSh2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHN8fFtdKS5jb25jYXQocykpLHRoaXN9cG9zaXRpb25hbCh0LGUpe2goXCI8c3RyaW5nPiA8b2JqZWN0PlwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpO2NvbnN0IHM9W1wiZGVmYXVsdFwiLFwiZGVmYXVsdERlc2NyaXB0aW9uXCIsXCJpbXBsaWVzXCIsXCJub3JtYWxpemVcIixcImNob2ljZXNcIixcImNvbmZsaWN0c1wiLFwiY29lcmNlXCIsXCJ0eXBlXCIsXCJkZXNjcmliZVwiLFwiZGVzY1wiLFwiZGVzY3JpcHRpb25cIixcImFsaWFzXCJdO2U9ZyhlLCgodCxlKT0+IShcInR5cGVcIj09PXQmJiFbXCJzdHJpbmdcIixcIm51bWJlclwiLFwiYm9vbGVhblwiXS5pbmNsdWRlcyhlKSkmJnMuaW5jbHVkZXModCkpKTtjb25zdCBpPXYodGhpcyxxLFwiZlwiKS5mdWxsQ29tbWFuZHNbdih0aGlzLHEsXCJmXCIpLmZ1bGxDb21tYW5kcy5sZW5ndGgtMV0sbj1pP3YodGhpcyx6LFwiZlwiKS5jbWRUb1BhcnNlT3B0aW9ucyhpKTp7YXJyYXk6W10sYWxpYXM6e30sZGVmYXVsdDp7fSxkZW1hbmQ6e319O3JldHVybiBwKG4pLmZvckVhY2goKHM9Pntjb25zdCBpPW5bc107QXJyYXkuaXNBcnJheShpKT8tMSE9PWkuaW5kZXhPZih0KSYmKGVbc109ITApOmlbdF0mJiEocyBpbiBlKSYmKGVbc109aVt0XSl9KSksdGhpcy5ncm91cCh0LHYodGhpcyxwdCxcImZcIikuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpKSx0aGlzLm9wdGlvbih0LGUpfXJlY29tbWVuZENvbW1hbmRzKHQ9ITApe3JldHVybiBoKFwiW2Jvb2xlYW5dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLE8odGhpcyxsdCx0LFwiZlwiKSx0aGlzfXJlcXVpcmVkKHQsZSxzKXtyZXR1cm4gdGhpcy5kZW1hbmQodCxlLHMpfXJlcXVpcmUodCxlLHMpe3JldHVybiB0aGlzLmRlbWFuZCh0LGUscyl9cmVxdWlyZXNBcmcodCl7cmV0dXJuIGgoXCI8YXJyYXl8c3RyaW5nfG9iamVjdD4gW251bWJlcl1cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksXCJzdHJpbmdcIj09dHlwZW9mIHQmJnYodGhpcyxldCxcImZcIikubmFyZ1t0XXx8dGhpc1tTdF0odGhpcy5yZXF1aXJlc0FyZy5iaW5kKHRoaXMpLFwibmFyZ1wiLHQsTmFOKSx0aGlzfXNob3dDb21wbGV0aW9uU2NyaXB0KHQsZSl7cmV0dXJuIGgoXCJbc3RyaW5nXSBbc3RyaW5nXVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLHQ9dHx8dGhpcy4kMCx2KHRoaXMsUSxcImZcIikubG9nKHYodGhpcyxVLFwiZlwiKS5nZW5lcmF0ZUNvbXBsZXRpb25TY3JpcHQodCxlfHx2KHRoaXMsRixcImZcIil8fFwiY29tcGxldGlvblwiKSksdGhpc31zaG93SGVscCh0KXtpZihoKFwiW3N0cmluZ3xmdW5jdGlvbl1cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksTyh0aGlzLEosITAsXCJmXCIpLCF2KHRoaXMscHQsXCJmXCIpLmhhc0NhY2hlZEhlbHBNZXNzYWdlKCkpe2lmKCF0aGlzLnBhcnNlZCl7Y29uc3QgZT10aGlzW0p0XSh2KHRoaXMsaHQsXCJmXCIpLHZvaWQgMCx2b2lkIDAsMCwhMCk7aWYoZihlKSlyZXR1cm4gZS50aGVuKCgoKT0+e3YodGhpcyxwdCxcImZcIikuc2hvd0hlbHAodCl9KSksdGhpc31jb25zdCBlPXYodGhpcyx6LFwiZlwiKS5ydW5EZWZhdWx0QnVpbGRlck9uKHRoaXMpO2lmKGYoZSkpcmV0dXJuIGUudGhlbigoKCk9Pnt2KHRoaXMscHQsXCJmXCIpLnNob3dIZWxwKHQpfSkpLHRoaXN9cmV0dXJuIHYodGhpcyxwdCxcImZcIikuc2hvd0hlbHAodCksdGhpc31zY3JpcHROYW1lKHQpe3JldHVybiB0aGlzLmN1c3RvbVNjcmlwdE5hbWU9ITAsdGhpcy4kMD10LHRoaXN9c2hvd0hlbHBPbkZhaWwodCxlKXtyZXR1cm4gaChcIltib29sZWFufHN0cmluZ10gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx2KHRoaXMscHQsXCJmXCIpLnNob3dIZWxwT25GYWlsKHQsZSksdGhpc31zaG93VmVyc2lvbih0KXtyZXR1cm4gaChcIltzdHJpbmd8ZnVuY3Rpb25dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHYodGhpcyxwdCxcImZcIikuc2hvd1ZlcnNpb24odCksdGhpc31za2lwVmFsaWRhdGlvbih0KXtyZXR1cm4gaChcIjxhcnJheXxzdHJpbmc+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbUHRdKFwic2tpcFZhbGlkYXRpb25cIix0KSx0aGlzfXN0cmljdCh0KXtyZXR1cm4gaChcIltib29sZWFuXVwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsZnQsITEhPT10LFwiZlwiKSx0aGlzfXN0cmljdENvbW1hbmRzKHQpe3JldHVybiBoKFwiW2Jvb2xlYW5dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLE8odGhpcyxkdCwhMSE9PXQsXCJmXCIpLHRoaXN9c3RyaWN0T3B0aW9ucyh0KXtyZXR1cm4gaChcIltib29sZWFuXVwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsdXQsITEhPT10LFwiZlwiKSx0aGlzfXN0cmluZyh0KXtyZXR1cm4gaChcIjxhcnJheXxzdHJpbmc+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbUHRdKFwic3RyaW5nXCIsdCksdGhpc1tRdF0odCksdGhpc310ZXJtaW5hbFdpZHRoKCl7cmV0dXJuIGgoW10sMCksdih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLnN0ZENvbHVtbnN9dXBkYXRlTG9jYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVN0cmluZ3ModCl9dXBkYXRlU3RyaW5ncyh0KXtyZXR1cm4gaChcIjxvYmplY3Q+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLE8odGhpcyxHLCExLFwiZlwiKSx2KHRoaXMsY3QsXCJmXCIpLnkxOG4udXBkYXRlTG9jYWxlKHQpLHRoaXN9dXNhZ2UodCxzLGksbil7aWYoaChcIjxzdHJpbmd8bnVsbHx1bmRlZmluZWQ+IFtzdHJpbmd8Ym9vbGVhbl0gW2Z1bmN0aW9ufG9iamVjdF0gW2Z1bmN0aW9uXVwiLFt0LHMsaSxuXSxhcmd1bWVudHMubGVuZ3RoKSx2b2lkIDAhPT1zKXtpZihkKHQsbnVsbCx2KHRoaXMsY3QsXCJmXCIpKSwodHx8XCJcIikubWF0Y2goL15cXCQwKCB8JCkvKSlyZXR1cm4gdGhpcy5jb21tYW5kKHQscyxpLG4pO3Rocm93IG5ldyBlKFwiLnVzYWdlKCkgZGVzY3JpcHRpb24gbXVzdCBzdGFydCB3aXRoICQwIGlmIGJlaW5nIHVzZWQgYXMgYWxpYXMgZm9yIC5jb21tYW5kKClcIil9cmV0dXJuIHYodGhpcyxwdCxcImZcIikudXNhZ2UodCksdGhpc311c2FnZUNvbmZpZ3VyYXRpb24odCl7cmV0dXJuIGgoXCI8b2JqZWN0PlwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsZ3QsdCxcImZcIiksdGhpc312ZXJzaW9uKHQsZSxzKXtjb25zdCBpPVwidmVyc2lvblwiO2lmKGgoXCJbYm9vbGVhbnxzdHJpbmddIFtzdHJpbmddIFtzdHJpbmddXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSx2KHRoaXMsbXQsXCJmXCIpJiYodGhpc1tPdF0odih0aGlzLG10LFwiZlwiKSksdih0aGlzLHB0LFwiZlwiKS52ZXJzaW9uKHZvaWQgMCksTyh0aGlzLG10LG51bGwsXCJmXCIpKSwwPT09YXJndW1lbnRzLmxlbmd0aClzPXRoaXNbeHRdKCksdD1pO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCExPT09dClyZXR1cm4gdGhpcztzPXQsdD1pfWVsc2UgMj09PWFyZ3VtZW50cy5sZW5ndGgmJihzPWUsZT12b2lkIDApO3JldHVybiBPKHRoaXMsbXQsXCJzdHJpbmdcIj09dHlwZW9mIHQ/dDppLFwiZlwiKSxlPWV8fHYodGhpcyxwdCxcImZcIikuZGVmZXJZMThuTG9va3VwKFwiU2hvdyB2ZXJzaW9uIG51bWJlclwiKSx2KHRoaXMscHQsXCJmXCIpLnZlcnNpb24oc3x8dm9pZCAwKSx0aGlzLmJvb2xlYW4odih0aGlzLG10LFwiZlwiKSksdGhpcy5kZXNjcmliZSh2KHRoaXMsbXQsXCJmXCIpLGUpLHRoaXN9d3JhcCh0KXtyZXR1cm4gaChcIjxudW1iZXJ8bnVsbHx1bmRlZmluZWQ+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHYodGhpcyxwdCxcImZcIikud3JhcCh0KSx0aGlzfVsoej1uZXcgV2Vha01hcCxXPW5ldyBXZWFrTWFwLHE9bmV3IFdlYWtNYXAsVT1uZXcgV2Vha01hcCxGPW5ldyBXZWFrTWFwLEw9bmV3IFdlYWtNYXAsVj1uZXcgV2Vha01hcCxHPW5ldyBXZWFrTWFwLFI9bmV3IFdlYWtNYXAsVD1uZXcgV2Vha01hcCxCPW5ldyBXZWFrTWFwLFk9bmV3IFdlYWtNYXAsSz1uZXcgV2Vha01hcCxKPW5ldyBXZWFrTWFwLFo9bmV3IFdlYWtNYXAsWD1uZXcgV2Vha01hcCxRPW5ldyBXZWFrTWFwLHR0PW5ldyBXZWFrTWFwLGV0PW5ldyBXZWFrTWFwLHN0PW5ldyBXZWFrTWFwLGl0PW5ldyBXZWFrTWFwLG50PW5ldyBXZWFrTWFwLHJ0PW5ldyBXZWFrTWFwLG90PW5ldyBXZWFrTWFwLGF0PW5ldyBXZWFrTWFwLGh0PW5ldyBXZWFrTWFwLGx0PW5ldyBXZWFrTWFwLGN0PW5ldyBXZWFrTWFwLGZ0PW5ldyBXZWFrTWFwLGR0PW5ldyBXZWFrTWFwLHV0PW5ldyBXZWFrTWFwLHB0PW5ldyBXZWFrTWFwLGd0PW5ldyBXZWFrTWFwLG10PW5ldyBXZWFrTWFwLHl0PW5ldyBXZWFrTWFwLGJ0KV0odCl7aWYoIXQuX3x8IXRbXCItLVwiXSlyZXR1cm4gdDt0Ll8ucHVzaC5hcHBseSh0Ll8sdFtcIi0tXCJdKTt0cnl7ZGVsZXRlIHRbXCItLVwiXX1jYXRjaCh0KXt9cmV0dXJuIHR9W3Z0XSgpe3JldHVybntsb2c6KC4uLnQpPT57dGhpc1tSdF0oKXx8Y29uc29sZS5sb2coLi4udCksTyh0aGlzLEosITAsXCJmXCIpLHYodGhpcyx0dCxcImZcIikubGVuZ3RoJiZPKHRoaXMsdHQsdih0aGlzLHR0LFwiZlwiKStcIlxcblwiLFwiZlwiKSxPKHRoaXMsdHQsdih0aGlzLHR0LFwiZlwiKSt0LmpvaW4oXCIgXCIpLFwiZlwiKX0sZXJyb3I6KC4uLnQpPT57dGhpc1tSdF0oKXx8Y29uc29sZS5lcnJvciguLi50KSxPKHRoaXMsSiwhMCxcImZcIiksdih0aGlzLHR0LFwiZlwiKS5sZW5ndGgmJk8odGhpcyx0dCx2KHRoaXMsdHQsXCJmXCIpK1wiXFxuXCIsXCJmXCIpLE8odGhpcyx0dCx2KHRoaXMsdHQsXCJmXCIpK3Quam9pbihcIiBcIiksXCJmXCIpfX19W090XSh0KXtwKHYodGhpcyxldCxcImZcIikpLmZvckVhY2goKGU9PntpZihcImNvbmZpZ09iamVjdHNcIj09PWUpcmV0dXJuO2NvbnN0IHM9dih0aGlzLGV0LFwiZlwiKVtlXTtBcnJheS5pc0FycmF5KHMpP3MuaW5jbHVkZXModCkmJnMuc3BsaWNlKHMuaW5kZXhPZih0KSwxKTpcIm9iamVjdFwiPT10eXBlb2YgcyYmZGVsZXRlIHNbdF19KSksZGVsZXRlIHYodGhpcyxwdCxcImZcIikuZ2V0RGVzY3JpcHRpb25zKClbdF19W3d0XSh0LGUscyl7dih0aGlzLFIsXCJmXCIpW3NdfHwodih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmVtaXRXYXJuaW5nKHQsZSksdih0aGlzLFIsXCJmXCIpW3NdPSEwKX1bQ3RdKCl7dih0aGlzLEIsXCJmXCIpLnB1c2goe29wdGlvbnM6dih0aGlzLGV0LFwiZlwiKSxjb25maWdPYmplY3RzOnYodGhpcyxldCxcImZcIikuY29uZmlnT2JqZWN0cy5zbGljZSgwKSxleGl0UHJvY2Vzczp2KHRoaXMsVCxcImZcIiksZ3JvdXBzOnYodGhpcyxLLFwiZlwiKSxzdHJpY3Q6dih0aGlzLGZ0LFwiZlwiKSxzdHJpY3RDb21tYW5kczp2KHRoaXMsZHQsXCJmXCIpLHN0cmljdE9wdGlvbnM6dih0aGlzLHV0LFwiZlwiKSxjb21wbGV0aW9uQ29tbWFuZDp2KHRoaXMsRixcImZcIiksb3V0cHV0OnYodGhpcyx0dCxcImZcIiksZXhpdEVycm9yOnYodGhpcyxWLFwiZlwiKSxoYXNPdXRwdXQ6dih0aGlzLEosXCJmXCIpLHBhcnNlZDp0aGlzLnBhcnNlZCxwYXJzZUZuOnYodGhpcyxudCxcImZcIikscGFyc2VDb250ZXh0OnYodGhpcyxydCxcImZcIil9KSx2KHRoaXMscHQsXCJmXCIpLmZyZWV6ZSgpLHYodGhpcyx5dCxcImZcIikuZnJlZXplKCksdih0aGlzLHosXCJmXCIpLmZyZWV6ZSgpLHYodGhpcyxZLFwiZlwiKS5mcmVlemUoKX1banRdKCl7bGV0IHQsZT1cIlwiO3JldHVybiB0PS9cXGIobm9kZXxpb2pzfGVsZWN0cm9uKShcXC5leGUpPyQvLnRlc3Qodih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmFyZ3YoKVswXSk/dih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmFyZ3YoKS5zbGljZSgxLDIpOnYodGhpcyxjdCxcImZcIikucHJvY2Vzcy5hcmd2KCkuc2xpY2UoMCwxKSxlPXQubWFwKCh0PT57Y29uc3QgZT10aGlzW1l0XSh2KHRoaXMsVyxcImZcIiksdCk7cmV0dXJuIHQubWF0Y2goL14oXFwvfChbYS16QS1aXTopP1xcXFwpLykmJmUubGVuZ3RoPHQubGVuZ3RoP2U6dH0pKS5qb2luKFwiIFwiKS50cmltKCksdih0aGlzLGN0LFwiZlwiKS5nZXRFbnYoXCJfXCIpJiZ2KHRoaXMsY3QsXCJmXCIpLmdldFByb2Nlc3NBcmd2QmluKCk9PT12KHRoaXMsY3QsXCJmXCIpLmdldEVudihcIl9cIikmJihlPXYodGhpcyxjdCxcImZcIikuZ2V0RW52KFwiX1wiKS5yZXBsYWNlKGAke3YodGhpcyxjdCxcImZcIikucGF0aC5kaXJuYW1lKHYodGhpcyxjdCxcImZcIikucHJvY2Vzcy5leGVjUGF0aCgpKX0vYCxcIlwiKSksZX1bTXRdKCl7cmV0dXJuIHYodGhpcyxpdCxcImZcIil9W190XSgpe3JldHVybiB2KHRoaXMsZ3QsXCJmXCIpfVtrdF0oKXtpZighdih0aGlzLEcsXCJmXCIpKXJldHVybjtjb25zdCB0PXYodGhpcyxjdCxcImZcIikuZ2V0RW52KFwiTENfQUxMXCIpfHx2KHRoaXMsY3QsXCJmXCIpLmdldEVudihcIkxDX01FU1NBR0VTXCIpfHx2KHRoaXMsY3QsXCJmXCIpLmdldEVudihcIkxBTkdcIil8fHYodGhpcyxjdCxcImZcIikuZ2V0RW52KFwiTEFOR1VBR0VcIil8fFwiZW5fVVNcIjt0aGlzLmxvY2FsZSh0LnJlcGxhY2UoL1suOl0uKi8sXCJcIikpfVt4dF0oKXtyZXR1cm4gdGhpc1tBdF0oKS52ZXJzaW9ufHxcInVua25vd25cIn1bRXRdKHQpe2NvbnN0IGU9dFtcIi0tXCJdP3RbXCItLVwiXTp0Ll87Zm9yKGxldCB0LHM9MDt2b2lkIDAhPT0odD1lW3NdKTtzKyspdih0aGlzLGN0LFwiZlwiKS5QYXJzZXIubG9va3NMaWtlTnVtYmVyKHQpJiZOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dH1gKSkpJiYoZVtzXT1OdW1iZXIodCkpO3JldHVybiB0fVtBdF0odCl7Y29uc3QgZT10fHxcIipcIjtpZih2KHRoaXMsb3QsXCJmXCIpW2VdKXJldHVybiB2KHRoaXMsb3QsXCJmXCIpW2VdO2xldCBzPXt9O3RyeXtsZXQgZT10fHx2KHRoaXMsY3QsXCJmXCIpLm1haW5GaWxlbmFtZTshdCYmdih0aGlzLGN0LFwiZlwiKS5wYXRoLmV4dG5hbWUoZSkmJihlPXYodGhpcyxjdCxcImZcIikucGF0aC5kaXJuYW1lKGUpKTtjb25zdCBpPXYodGhpcyxjdCxcImZcIikuZmluZFVwKGUsKCh0LGUpPT5lLmluY2x1ZGVzKFwicGFja2FnZS5qc29uXCIpP1wicGFja2FnZS5qc29uXCI6dm9pZCAwKSk7ZChpLHZvaWQgMCx2KHRoaXMsY3QsXCJmXCIpKSxzPUpTT04ucGFyc2Uodih0aGlzLGN0LFwiZlwiKS5yZWFkRmlsZVN5bmMoaSxcInV0ZjhcIikpfWNhdGNoKHQpe31yZXR1cm4gdih0aGlzLG90LFwiZlwiKVtlXT1zfHx7fSx2KHRoaXMsb3QsXCJmXCIpW2VdfVtQdF0odCxlKXsoZT1bXS5jb25jYXQoZSkpLmZvckVhY2goKGU9PntlPXRoaXNbRHRdKGUpLHYodGhpcyxldCxcImZcIilbdF0ucHVzaChlKX0pKX1bU3RdKHQsZSxzLGkpe3RoaXNbSXRdKHQsZSxzLGksKCh0LGUscyk9Pnt2KHRoaXMsZXQsXCJmXCIpW3RdW2VdPXN9KSl9WyR0XSh0LGUscyxpKXt0aGlzW0l0XSh0LGUscyxpLCgodCxlLHMpPT57dih0aGlzLGV0LFwiZlwiKVt0XVtlXT0odih0aGlzLGV0LFwiZlwiKVt0XVtlXXx8W10pLmNvbmNhdChzKX0pKX1bSXRdKHQsZSxzLGksbil7aWYoQXJyYXkuaXNBcnJheShzKSlzLmZvckVhY2goKGU9Pnt0KGUsaSl9KSk7ZWxzZSBpZigodD0+XCJvYmplY3RcIj09dHlwZW9mIHQpKHMpKWZvcihjb25zdCBlIG9mIHAocykpdChlLHNbZV0pO2Vsc2UgbihlLHRoaXNbRHRdKHMpLGkpfVtEdF0odCl7cmV0dXJuXCJfX3Byb3RvX19cIj09PXQ/XCJfX19wcm90b19fX1wiOnR9W050XSh0LGUpe3JldHVybiB0aGlzW1N0XSh0aGlzW050XS5iaW5kKHRoaXMpLFwia2V5XCIsdCxlKSx0aGlzfVtIdF0oKXt2YXIgdCxlLHMsaSxuLHIsbyxhLGgsbCxjLGY7Y29uc3QgdT12KHRoaXMsQixcImZcIikucG9wKCk7bGV0IHA7ZCh1LHZvaWQgMCx2KHRoaXMsY3QsXCJmXCIpKSx0PXRoaXMsZT10aGlzLHM9dGhpcyxpPXRoaXMsbj10aGlzLHI9dGhpcyxvPXRoaXMsYT10aGlzLGg9dGhpcyxsPXRoaXMsYz10aGlzLGY9dGhpcywoe29wdGlvbnM6e3NldCB2YWx1ZShlKXtPKHQsZXQsZSxcImZcIil9fS52YWx1ZSxjb25maWdPYmplY3RzOnAsZXhpdFByb2Nlc3M6e3NldCB2YWx1ZSh0KXtPKGUsVCx0LFwiZlwiKX19LnZhbHVlLGdyb3Vwczp7c2V0IHZhbHVlKHQpe08ocyxLLHQsXCJmXCIpfX0udmFsdWUsb3V0cHV0OntzZXQgdmFsdWUodCl7TyhpLHR0LHQsXCJmXCIpfX0udmFsdWUsZXhpdEVycm9yOntzZXQgdmFsdWUodCl7TyhuLFYsdCxcImZcIil9fS52YWx1ZSxoYXNPdXRwdXQ6e3NldCB2YWx1ZSh0KXtPKHIsSix0LFwiZlwiKX19LnZhbHVlLHBhcnNlZDp0aGlzLnBhcnNlZCxzdHJpY3Q6e3NldCB2YWx1ZSh0KXtPKG8sZnQsdCxcImZcIil9fS52YWx1ZSxzdHJpY3RDb21tYW5kczp7c2V0IHZhbHVlKHQpe08oYSxkdCx0LFwiZlwiKX19LnZhbHVlLHN0cmljdE9wdGlvbnM6e3NldCB2YWx1ZSh0KXtPKGgsdXQsdCxcImZcIil9fS52YWx1ZSxjb21wbGV0aW9uQ29tbWFuZDp7c2V0IHZhbHVlKHQpe08obCxGLHQsXCJmXCIpfX0udmFsdWUscGFyc2VGbjp7c2V0IHZhbHVlKHQpe08oYyxudCx0LFwiZlwiKX19LnZhbHVlLHBhcnNlQ29udGV4dDp7c2V0IHZhbHVlKHQpe08oZixydCx0LFwiZlwiKX19LnZhbHVlfT11KSx2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHM9cCx2KHRoaXMscHQsXCJmXCIpLnVuZnJlZXplKCksdih0aGlzLHl0LFwiZlwiKS51bmZyZWV6ZSgpLHYodGhpcyx6LFwiZlwiKS51bmZyZWV6ZSgpLHYodGhpcyxZLFwiZlwiKS51bmZyZWV6ZSgpfVt6dF0odCxlKXtyZXR1cm4gaihlLChlPT4odChlKSxlKSkpfWdldEludGVybmFsTWV0aG9kcygpe3JldHVybntnZXRDb21tYW5kSW5zdGFuY2U6dGhpc1tXdF0uYmluZCh0aGlzKSxnZXRDb250ZXh0OnRoaXNbcXRdLmJpbmQodGhpcyksZ2V0SGFzT3V0cHV0OnRoaXNbVXRdLmJpbmQodGhpcyksZ2V0TG9nZ2VySW5zdGFuY2U6dGhpc1tGdF0uYmluZCh0aGlzKSxnZXRQYXJzZUNvbnRleHQ6dGhpc1tMdF0uYmluZCh0aGlzKSxnZXRQYXJzZXJDb25maWd1cmF0aW9uOnRoaXNbTXRdLmJpbmQodGhpcyksZ2V0VXNhZ2VDb25maWd1cmF0aW9uOnRoaXNbX3RdLmJpbmQodGhpcyksZ2V0VXNhZ2VJbnN0YW5jZTp0aGlzW1Z0XS5iaW5kKHRoaXMpLGdldFZhbGlkYXRpb25JbnN0YW5jZTp0aGlzW0d0XS5iaW5kKHRoaXMpLGhhc1BhcnNlQ2FsbGJhY2s6dGhpc1tSdF0uYmluZCh0aGlzKSxpc0dsb2JhbENvbnRleHQ6dGhpc1tUdF0uYmluZCh0aGlzKSxwb3N0UHJvY2Vzczp0aGlzW0J0XS5iaW5kKHRoaXMpLHJlc2V0OnRoaXNbS3RdLmJpbmQodGhpcykscnVuVmFsaWRhdGlvbjp0aGlzW1p0XS5iaW5kKHRoaXMpLHJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzOnRoaXNbSnRdLmJpbmQodGhpcyksc2V0SGFzT3V0cHV0OnRoaXNbWHRdLmJpbmQodGhpcyl9fVtXdF0oKXtyZXR1cm4gdih0aGlzLHosXCJmXCIpfVtxdF0oKXtyZXR1cm4gdih0aGlzLHEsXCJmXCIpfVtVdF0oKXtyZXR1cm4gdih0aGlzLEosXCJmXCIpfVtGdF0oKXtyZXR1cm4gdih0aGlzLFEsXCJmXCIpfVtMdF0oKXtyZXR1cm4gdih0aGlzLHJ0LFwiZlwiKXx8e319W1Z0XSgpe3JldHVybiB2KHRoaXMscHQsXCJmXCIpfVtHdF0oKXtyZXR1cm4gdih0aGlzLHl0LFwiZlwiKX1bUnRdKCl7cmV0dXJuISF2KHRoaXMsbnQsXCJmXCIpfVtUdF0oKXtyZXR1cm4gdih0aGlzLFgsXCJmXCIpfVtCdF0odCxlLHMsaSl7aWYocylyZXR1cm4gdDtpZihmKHQpKXJldHVybiB0O2V8fCh0PXRoaXNbYnRdKHQpKTtyZXR1cm4odGhpc1tNdF0oKVtcInBhcnNlLXBvc2l0aW9uYWwtbnVtYmVyc1wiXXx8dm9pZCAwPT09dGhpc1tNdF0oKVtcInBhcnNlLXBvc2l0aW9uYWwtbnVtYmVyc1wiXSkmJih0PXRoaXNbRXRdKHQpKSxpJiYodD1DKHQsdGhpcyx2KHRoaXMsWSxcImZcIikuZ2V0TWlkZGxld2FyZSgpLCExKSksdH1bS3RdKHQ9e30pe08odGhpcyxldCx2KHRoaXMsZXQsXCJmXCIpfHx7fSxcImZcIik7Y29uc3QgZT17fTtlLmxvY2FsPXYodGhpcyxldCxcImZcIikubG9jYWx8fFtdLGUuY29uZmlnT2JqZWN0cz12KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHN8fFtdO2NvbnN0IHM9e307ZS5sb2NhbC5mb3JFYWNoKChlPT57c1tlXT0hMCwodFtlXXx8W10pLmZvckVhY2goKHQ9PntzW3RdPSEwfSkpfSkpLE9iamVjdC5hc3NpZ24odih0aGlzLGF0LFwiZlwiKSxPYmplY3Qua2V5cyh2KHRoaXMsSyxcImZcIikpLnJlZHVjZSgoKHQsZSk9Pntjb25zdCBpPXYodGhpcyxLLFwiZlwiKVtlXS5maWx0ZXIoKHQ9PiEodCBpbiBzKSkpO3JldHVybiBpLmxlbmd0aD4wJiYodFtlXT1pKSx0fSkse30pKSxPKHRoaXMsSyx7fSxcImZcIik7cmV0dXJuW1wiYXJyYXlcIixcImJvb2xlYW5cIixcInN0cmluZ1wiLFwic2tpcFZhbGlkYXRpb25cIixcImNvdW50XCIsXCJub3JtYWxpemVcIixcIm51bWJlclwiLFwiaGlkZGVuT3B0aW9uc1wiXS5mb3JFYWNoKCh0PT57ZVt0XT0odih0aGlzLGV0LFwiZlwiKVt0XXx8W10pLmZpbHRlcigodD0+IXNbdF0pKX0pKSxbXCJuYXJnXCIsXCJrZXlcIixcImFsaWFzXCIsXCJkZWZhdWx0XCIsXCJkZWZhdWx0RGVzY3JpcHRpb25cIixcImNvbmZpZ1wiLFwiY2hvaWNlc1wiLFwiZGVtYW5kZWRPcHRpb25zXCIsXCJkZW1hbmRlZENvbW1hbmRzXCIsXCJkZXByZWNhdGVkT3B0aW9uc1wiXS5mb3JFYWNoKCh0PT57ZVt0XT1nKHYodGhpcyxldCxcImZcIilbdF0sKHQ9PiFzW3RdKSl9KSksZS5lbnZQcmVmaXg9dih0aGlzLGV0LFwiZlwiKS5lbnZQcmVmaXgsTyh0aGlzLGV0LGUsXCJmXCIpLE8odGhpcyxwdCx2KHRoaXMscHQsXCJmXCIpP3YodGhpcyxwdCxcImZcIikucmVzZXQocyk6UCh0aGlzLHYodGhpcyxjdCxcImZcIikpLFwiZlwiKSxPKHRoaXMseXQsdih0aGlzLHl0LFwiZlwiKT92KHRoaXMseXQsXCJmXCIpLnJlc2V0KHMpOmZ1bmN0aW9uKHQsZSxzKXtjb25zdCBpPXMueTE4bi5fXyxuPXMueTE4bi5fX24scj17bm9uT3B0aW9uQ291bnQ6ZnVuY3Rpb24ocyl7Y29uc3QgaT10LmdldERlbWFuZGVkQ29tbWFuZHMoKSxyPXMuXy5sZW5ndGgrKHNbXCItLVwiXT9zW1wiLS1cIl0ubGVuZ3RoOjApLXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLmNvbW1hbmRzLmxlbmd0aDtpLl8mJihyPGkuXy5taW58fHI+aS5fLm1heCkmJihyPGkuXy5taW4/dm9pZCAwIT09aS5fLm1pbk1zZz9lLmZhaWwoaS5fLm1pbk1zZz9pLl8ubWluTXNnLnJlcGxhY2UoL1xcJDAvZyxyLnRvU3RyaW5nKCkpLnJlcGxhY2UoL1xcJDEvLGkuXy5taW4udG9TdHJpbmcoKSk6bnVsbCk6ZS5mYWlsKG4oXCJOb3QgZW5vdWdoIG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG5lZWQgYXQgbGVhc3QgJXNcIixcIk5vdCBlbm91Z2ggbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbmVlZCBhdCBsZWFzdCAlc1wiLHIsci50b1N0cmluZygpLGkuXy5taW4udG9TdHJpbmcoKSkpOnI+aS5fLm1heCYmKHZvaWQgMCE9PWkuXy5tYXhNc2c/ZS5mYWlsKGkuXy5tYXhNc2c/aS5fLm1heE1zZy5yZXBsYWNlKC9cXCQwL2csci50b1N0cmluZygpKS5yZXBsYWNlKC9cXCQxLyxpLl8ubWF4LnRvU3RyaW5nKCkpOm51bGwpOmUuZmFpbChuKFwiVG9vIG1hbnkgbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbWF4aW11bSBvZiAlc1wiLFwiVG9vIG1hbnkgbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbWF4aW11bSBvZiAlc1wiLHIsci50b1N0cmluZygpLGkuXy5tYXgudG9TdHJpbmcoKSkpKSl9LHBvc2l0aW9uYWxDb3VudDpmdW5jdGlvbih0LHMpe3M8dCYmZS5mYWlsKG4oXCJOb3QgZW5vdWdoIG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG5lZWQgYXQgbGVhc3QgJXNcIixcIk5vdCBlbm91Z2ggbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbmVlZCBhdCBsZWFzdCAlc1wiLHMscytcIlwiLHQrXCJcIikpfSxyZXF1aXJlZEFyZ3VtZW50czpmdW5jdGlvbih0LHMpe2xldCBpPW51bGw7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXMocykpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSkmJnZvaWQgMCE9PXRbZV18fChpPWl8fHt9LGlbZV09c1tlXSk7aWYoaSl7Y29uc3QgdD1bXTtmb3IoY29uc3QgZSBvZiBPYmplY3Qua2V5cyhpKSl7Y29uc3Qgcz1pW2VdO3MmJnQuaW5kZXhPZihzKTwwJiZ0LnB1c2gocyl9Y29uc3Qgcz10Lmxlbmd0aD9gXFxuJHt0LmpvaW4oXCJcXG5cIil9YDpcIlwiO2UuZmFpbChuKFwiTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudDogJXNcIixcIk1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnRzOiAlc1wiLE9iamVjdC5rZXlzKGkpLmxlbmd0aCxPYmplY3Qua2V5cyhpKS5qb2luKFwiLCBcIikrcykpfX0sdW5rbm93bkFyZ3VtZW50czpmdW5jdGlvbihzLGksbyxhLGg9ITApe3ZhciBsO2NvbnN0IGM9dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb21tYW5kSW5zdGFuY2UoKS5nZXRDb21tYW5kcygpLGY9W10sZD10LmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKTtpZihPYmplY3Qua2V5cyhzKS5mb3JFYWNoKChlPT57SC5pbmNsdWRlcyhlKXx8T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sZSl8fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlQ29udGV4dCgpLGUpfHxyLmlzVmFsaWRBbmRTb21lQWxpYXNJc05vdE5ldyhlLGkpfHxmLnB1c2goZSl9KSksaCYmKGQuY29tbWFuZHMubGVuZ3RoPjB8fGMubGVuZ3RoPjB8fGEpJiZzLl8uc2xpY2UoZC5jb21tYW5kcy5sZW5ndGgpLmZvckVhY2goKHQ9PntjLmluY2x1ZGVzKFwiXCIrdCl8fGYucHVzaChcIlwiK3QpfSkpLGgpe2NvbnN0IGU9KG51bGw9PT0obD10LmdldERlbWFuZGVkQ29tbWFuZHMoKS5fKXx8dm9pZCAwPT09bD92b2lkIDA6bC5tYXgpfHwwLGk9ZC5jb21tYW5kcy5sZW5ndGgrZTtpPHMuXy5sZW5ndGgmJnMuXy5zbGljZShpKS5mb3JFYWNoKCh0PT57dD1TdHJpbmcodCksZC5jb21tYW5kcy5pbmNsdWRlcyh0KXx8Zi5pbmNsdWRlcyh0KXx8Zi5wdXNoKHQpfSkpfWYubGVuZ3RoJiZlLmZhaWwobihcIlVua25vd24gYXJndW1lbnQ6ICVzXCIsXCJVbmtub3duIGFyZ3VtZW50czogJXNcIixmLmxlbmd0aCxmLm1hcCgodD0+dC50cmltKCk/dDpgXCIke3R9XCJgKSkuam9pbihcIiwgXCIpKSl9LHVua25vd25Db21tYW5kczpmdW5jdGlvbihzKXtjb25zdCBpPXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29tbWFuZEluc3RhbmNlKCkuZ2V0Q29tbWFuZHMoKSxyPVtdLG89dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCk7cmV0dXJuKG8uY29tbWFuZHMubGVuZ3RoPjB8fGkubGVuZ3RoPjApJiZzLl8uc2xpY2Uoby5jb21tYW5kcy5sZW5ndGgpLmZvckVhY2goKHQ9PntpLmluY2x1ZGVzKFwiXCIrdCl8fHIucHVzaChcIlwiK3QpfSkpLHIubGVuZ3RoPjAmJihlLmZhaWwobihcIlVua25vd24gY29tbWFuZDogJXNcIixcIlVua25vd24gY29tbWFuZHM6ICVzXCIsci5sZW5ndGgsci5qb2luKFwiLCBcIikpKSwhMCl9LGlzVmFsaWRBbmRTb21lQWxpYXNJc05vdE5ldzpmdW5jdGlvbihlLHMpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyxlKSlyZXR1cm4hMTtjb25zdCBpPXQucGFyc2VkLm5ld0FsaWFzZXM7cmV0dXJuW2UsLi4uc1tlXV0uc29tZSgodD0+IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLHQpfHwhaVtlXSkpfSxsaW1pdGVkQ2hvaWNlczpmdW5jdGlvbihzKXtjb25zdCBuPXQuZ2V0T3B0aW9ucygpLHI9e307aWYoIU9iamVjdC5rZXlzKG4uY2hvaWNlcykubGVuZ3RoKXJldHVybjtPYmplY3Qua2V5cyhzKS5mb3JFYWNoKCh0PT57LTE9PT1ILmluZGV4T2YodCkmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLmNob2ljZXMsdCkmJltdLmNvbmNhdChzW3RdKS5mb3JFYWNoKChlPT57LTE9PT1uLmNob2ljZXNbdF0uaW5kZXhPZihlKSYmdm9pZCAwIT09ZSYmKHJbdF09KHJbdF18fFtdKS5jb25jYXQoZSkpfSkpfSkpO2NvbnN0IG89T2JqZWN0LmtleXMocik7aWYoIW8ubGVuZ3RoKXJldHVybjtsZXQgYT1pKFwiSW52YWxpZCB2YWx1ZXM6XCIpO28uZm9yRWFjaCgodD0+e2ErPWBcXG4gICR7aShcIkFyZ3VtZW50OiAlcywgR2l2ZW46ICVzLCBDaG9pY2VzOiAlc1wiLHQsZS5zdHJpbmdpZmllZFZhbHVlcyhyW3RdKSxlLnN0cmluZ2lmaWVkVmFsdWVzKG4uY2hvaWNlc1t0XSkpfWB9KSksZS5mYWlsKGEpfX07bGV0IG89e307ZnVuY3Rpb24gYSh0LGUpe2NvbnN0IHM9TnVtYmVyKGUpO3JldHVyblwibnVtYmVyXCI9PXR5cGVvZihlPWlzTmFOKHMpP2U6cyk/ZT10Ll8ubGVuZ3RoPj1lOmUubWF0Y2goL14tLW5vLS4rLyk/KGU9ZS5tYXRjaCgvXi0tbm8tKC4rKS8pWzFdLGU9IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpKTplPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpLGV9ci5pbXBsaWVzPWZ1bmN0aW9uKGUsaSl7aChcIjxzdHJpbmd8b2JqZWN0PiBbYXJyYXl8bnVtYmVyfHN0cmluZ11cIixbZSxpXSxhcmd1bWVudHMubGVuZ3RoKSxcIm9iamVjdFwiPT10eXBlb2YgZT9PYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0PT57ci5pbXBsaWVzKHQsZVt0XSl9KSk6KHQuZ2xvYmFsKGUpLG9bZV18fChvW2VdPVtdKSxBcnJheS5pc0FycmF5KGkpP2kuZm9yRWFjaCgodD0+ci5pbXBsaWVzKGUsdCkpKTooZChpLHZvaWQgMCxzKSxvW2VdLnB1c2goaSkpKX0sci5nZXRJbXBsaWVkPWZ1bmN0aW9uKCl7cmV0dXJuIG99LHIuaW1wbGljYXRpb25zPWZ1bmN0aW9uKHQpe2NvbnN0IHM9W107aWYoT2JqZWN0LmtleXMobykuZm9yRWFjaCgoZT0+e2NvbnN0IGk9ZTsob1tlXXx8W10pLmZvckVhY2goKGU9PntsZXQgbj1pO2NvbnN0IHI9ZTtuPWEodCxuKSxlPWEodCxlKSxuJiYhZSYmcy5wdXNoKGAgJHtpfSAtPiAke3J9YCl9KSl9KSkscy5sZW5ndGgpe2xldCB0PWAke2koXCJJbXBsaWNhdGlvbnMgZmFpbGVkOlwiKX1cXG5gO3MuZm9yRWFjaCgoZT0+e3QrPWV9KSksZS5mYWlsKHQpfX07bGV0IGw9e307ci5jb25mbGljdHM9ZnVuY3Rpb24oZSxzKXtoKFwiPHN0cmluZ3xvYmplY3Q+IFthcnJheXxzdHJpbmddXCIsW2Usc10sYXJndW1lbnRzLmxlbmd0aCksXCJvYmplY3RcIj09dHlwZW9mIGU/T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e3IuY29uZmxpY3RzKHQsZVt0XSl9KSk6KHQuZ2xvYmFsKGUpLGxbZV18fChsW2VdPVtdKSxBcnJheS5pc0FycmF5KHMpP3MuZm9yRWFjaCgodD0+ci5jb25mbGljdHMoZSx0KSkpOmxbZV0ucHVzaChzKSl9LHIuZ2V0Q29uZmxpY3Rpbmc9KCk9Pmwsci5jb25mbGljdGluZz1mdW5jdGlvbihuKXtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKCh0PT57bFt0XSYmbFt0XS5mb3JFYWNoKChzPT57cyYmdm9pZCAwIT09blt0XSYmdm9pZCAwIT09bltzXSYmZS5mYWlsKGkoXCJBcmd1bWVudHMgJXMgYW5kICVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIix0LHMpKX0pKX0pKSx0LmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKVtcInN0cmlwLWRhc2hlZFwiXSYmT2JqZWN0LmtleXMobCkuZm9yRWFjaCgodD0+e2xbdF0uZm9yRWFjaCgocj0+e3ImJnZvaWQgMCE9PW5bcy5QYXJzZXIuY2FtZWxDYXNlKHQpXSYmdm9pZCAwIT09bltzLlBhcnNlci5jYW1lbENhc2UocildJiZlLmZhaWwoaShcIkFyZ3VtZW50cyAlcyBhbmQgJXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiLHQscikpfSkpfSkpfSxyLnJlY29tbWVuZENvbW1hbmRzPWZ1bmN0aW9uKHQscyl7cz1zLnNvcnQoKCh0LGUpPT5lLmxlbmd0aC10Lmxlbmd0aCkpO2xldCBuPW51bGwscj0xLzA7Zm9yKGxldCBlLGk9MDt2b2lkIDAhPT0oZT1zW2ldKTtpKyspe2NvbnN0IHM9Tih0LGUpO3M8PTMmJnM8ciYmKHI9cyxuPWUpfW4mJmUuZmFpbChpKFwiRGlkIHlvdSBtZWFuICVzP1wiLG4pKX0sci5yZXNldD1mdW5jdGlvbih0KXtyZXR1cm4gbz1nKG8sKGU9PiF0W2VdKSksbD1nKGwsKGU9PiF0W2VdKSkscn07Y29uc3QgYz1bXTtyZXR1cm4gci5mcmVlemU9ZnVuY3Rpb24oKXtjLnB1c2goe2ltcGxpZWQ6byxjb25mbGljdGluZzpsfSl9LHIudW5mcmVlemU9ZnVuY3Rpb24oKXtjb25zdCB0PWMucG9wKCk7ZCh0LHZvaWQgMCxzKSwoe2ltcGxpZWQ6byxjb25mbGljdGluZzpsfT10KX0scn0odGhpcyx2KHRoaXMscHQsXCJmXCIpLHYodGhpcyxjdCxcImZcIikpLFwiZlwiKSxPKHRoaXMseix2KHRoaXMseixcImZcIik/dih0aGlzLHosXCJmXCIpLnJlc2V0KCk6ZnVuY3Rpb24odCxlLHMsaSl7cmV0dXJuIG5ldyBfKHQsZSxzLGkpfSh2KHRoaXMscHQsXCJmXCIpLHYodGhpcyx5dCxcImZcIiksdih0aGlzLFksXCJmXCIpLHYodGhpcyxjdCxcImZcIikpLFwiZlwiKSx2KHRoaXMsVSxcImZcIil8fE8odGhpcyxVLGZ1bmN0aW9uKHQsZSxzLGkpe3JldHVybiBuZXcgRCh0LGUscyxpKX0odGhpcyx2KHRoaXMscHQsXCJmXCIpLHYodGhpcyx6LFwiZlwiKSx2KHRoaXMsY3QsXCJmXCIpKSxcImZcIiksdih0aGlzLFksXCJmXCIpLnJlc2V0KCksTyh0aGlzLEYsbnVsbCxcImZcIiksTyh0aGlzLHR0LFwiXCIsXCJmXCIpLE8odGhpcyxWLG51bGwsXCJmXCIpLE8odGhpcyxKLCExLFwiZlwiKSx0aGlzLnBhcnNlZD0hMSx0aGlzfVtZdF0odCxlKXtyZXR1cm4gdih0aGlzLGN0LFwiZlwiKS5wYXRoLnJlbGF0aXZlKHQsZSl9W0p0XSh0LHMsaSxuPTAscj0hMSl7bGV0IG89ISFpfHxyO3Q9dHx8dih0aGlzLGh0LFwiZlwiKSx2KHRoaXMsZXQsXCJmXCIpLl9fPXYodGhpcyxjdCxcImZcIikueTE4bi5fXyx2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ3VyYXRpb249dGhpc1tNdF0oKTtjb25zdCBhPSEhdih0aGlzLGV0LFwiZlwiKS5jb25maWd1cmF0aW9uW1wicG9wdWxhdGUtLVwiXSxoPU9iamVjdC5hc3NpZ24oe30sdih0aGlzLGV0LFwiZlwiKS5jb25maWd1cmF0aW9uLHtcInBvcHVsYXRlLS1cIjohMH0pLGw9dih0aGlzLGN0LFwiZlwiKS5QYXJzZXIuZGV0YWlsZWQodCxPYmplY3QuYXNzaWduKHt9LHYodGhpcyxldCxcImZcIikse2NvbmZpZ3VyYXRpb246e1wicGFyc2UtcG9zaXRpb25hbC1udW1iZXJzXCI6ITEsLi4uaH19KSksYz1PYmplY3QuYXNzaWduKGwuYXJndix2KHRoaXMscnQsXCJmXCIpKTtsZXQgZDtjb25zdCB1PWwuYWxpYXNlcztsZXQgcD0hMSxnPSExO09iamVjdC5rZXlzKGMpLmZvckVhY2goKHQ9Pnt0PT09dih0aGlzLFosXCJmXCIpJiZjW3RdP3A9ITA6dD09PXYodGhpcyxtdCxcImZcIikmJmNbdF0mJihnPSEwKX0pKSxjLiQwPXRoaXMuJDAsdGhpcy5wYXJzZWQ9bCwwPT09biYmdih0aGlzLHB0LFwiZlwiKS5jbGVhckNhY2hlZEhlbHBNZXNzYWdlKCk7dHJ5e2lmKHRoaXNba3RdKCkscylyZXR1cm4gdGhpc1tCdF0oYyxhLCEhaSwhMSk7aWYodih0aGlzLFosXCJmXCIpKXtbdih0aGlzLFosXCJmXCIpXS5jb25jYXQodVt2KHRoaXMsWixcImZcIildfHxbXSkuZmlsdGVyKCh0PT50Lmxlbmd0aD4xKSkuaW5jbHVkZXMoXCJcIitjLl9bYy5fLmxlbmd0aC0xXSkmJihjLl8ucG9wKCkscD0hMCl9Tyh0aGlzLFgsITEsXCJmXCIpO2NvbnN0IGg9dih0aGlzLHosXCJmXCIpLmdldENvbW1hbmRzKCksbT12KHRoaXMsVSxcImZcIikuY29tcGxldGlvbktleSBpbiBjLHk9cHx8bXx8cjtpZihjLl8ubGVuZ3RoKXtpZihoLmxlbmd0aCl7bGV0IHQ7Zm9yKGxldCBlLHM9bnx8MDt2b2lkIDAhPT1jLl9bc107cysrKXtpZihlPVN0cmluZyhjLl9bc10pLGguaW5jbHVkZXMoZSkmJmUhPT12KHRoaXMsRixcImZcIikpe2NvbnN0IHQ9dih0aGlzLHosXCJmXCIpLnJ1bkNvbW1hbmQoZSx0aGlzLGwscysxLHIscHx8Z3x8cik7cmV0dXJuIHRoaXNbQnRdKHQsYSwhIWksITEpfWlmKCF0JiZlIT09dih0aGlzLEYsXCJmXCIpKXt0PWU7YnJlYWt9fSF2KHRoaXMseixcImZcIikuaGFzRGVmYXVsdENvbW1hbmQoKSYmdih0aGlzLGx0LFwiZlwiKSYmdCYmIXkmJnYodGhpcyx5dCxcImZcIikucmVjb21tZW5kQ29tbWFuZHModCxoKX12KHRoaXMsRixcImZcIikmJmMuXy5pbmNsdWRlcyh2KHRoaXMsRixcImZcIikpJiYhbSYmKHYodGhpcyxULFwiZlwiKSYmRSghMCksdGhpcy5zaG93Q29tcGxldGlvblNjcmlwdCgpLHRoaXMuZXhpdCgwKSl9aWYodih0aGlzLHosXCJmXCIpLmhhc0RlZmF1bHRDb21tYW5kKCkmJiF5KXtjb25zdCB0PXYodGhpcyx6LFwiZlwiKS5ydW5Db21tYW5kKG51bGwsdGhpcyxsLDAscixwfHxnfHxyKTtyZXR1cm4gdGhpc1tCdF0odCxhLCEhaSwhMSl9aWYobSl7dih0aGlzLFQsXCJmXCIpJiZFKCEwKTtjb25zdCBzPSh0PVtdLmNvbmNhdCh0KSkuc2xpY2UodC5pbmRleE9mKGAtLSR7dih0aGlzLFUsXCJmXCIpLmNvbXBsZXRpb25LZXl9YCkrMSk7cmV0dXJuIHYodGhpcyxVLFwiZlwiKS5nZXRDb21wbGV0aW9uKHMsKCh0LHMpPT57aWYodCl0aHJvdyBuZXcgZSh0Lm1lc3NhZ2UpOyhzfHxbXSkuZm9yRWFjaCgodD0+e3YodGhpcyxRLFwiZlwiKS5sb2codCl9KSksdGhpcy5leGl0KDApfSkpLHRoaXNbQnRdKGMsIWEsISFpLCExKX1pZih2KHRoaXMsSixcImZcIil8fChwPyh2KHRoaXMsVCxcImZcIikmJkUoITApLG89ITAsdGhpcy5zaG93SGVscChcImxvZ1wiKSx0aGlzLmV4aXQoMCkpOmcmJih2KHRoaXMsVCxcImZcIikmJkUoITApLG89ITAsdih0aGlzLHB0LFwiZlwiKS5zaG93VmVyc2lvbihcImxvZ1wiKSx0aGlzLmV4aXQoMCkpKSwhbyYmdih0aGlzLGV0LFwiZlwiKS5za2lwVmFsaWRhdGlvbi5sZW5ndGg+MCYmKG89T2JqZWN0LmtleXMoYykuc29tZSgodD0+dih0aGlzLGV0LFwiZlwiKS5za2lwVmFsaWRhdGlvbi5pbmRleE9mKHQpPj0wJiYhMD09PWNbdF0pKSksIW8pe2lmKGwuZXJyb3IpdGhyb3cgbmV3IGUobC5lcnJvci5tZXNzYWdlKTtpZighbSl7Y29uc3QgdD10aGlzW1p0XSh1LHt9LGwuZXJyb3IpO2l8fChkPUMoYyx0aGlzLHYodGhpcyxZLFwiZlwiKS5nZXRNaWRkbGV3YXJlKCksITApKSxkPXRoaXNbenRdKHQsbnVsbCE9ZD9kOmMpLGYoZCkmJiFpJiYoZD1kLnRoZW4oKCgpPT5DKGMsdGhpcyx2KHRoaXMsWSxcImZcIikuZ2V0TWlkZGxld2FyZSgpLCExKSkpKX19fWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IHQ7dih0aGlzLHB0LFwiZlwiKS5mYWlsKHQubWVzc2FnZSx0KX1yZXR1cm4gdGhpc1tCdF0obnVsbCE9ZD9kOmMsYSwhIWksITApfVtadF0odCxzLGksbil7Y29uc3Qgcj17Li4udGhpcy5nZXREZW1hbmRlZE9wdGlvbnMoKX07cmV0dXJuIG89PntpZihpKXRocm93IG5ldyBlKGkubWVzc2FnZSk7dih0aGlzLHl0LFwiZlwiKS5ub25PcHRpb25Db3VudChvKSx2KHRoaXMseXQsXCJmXCIpLnJlcXVpcmVkQXJndW1lbnRzKG8scik7bGV0IGE9ITE7dih0aGlzLGR0LFwiZlwiKSYmKGE9dih0aGlzLHl0LFwiZlwiKS51bmtub3duQ29tbWFuZHMobykpLHYodGhpcyxmdCxcImZcIikmJiFhP3YodGhpcyx5dCxcImZcIikudW5rbm93bkFyZ3VtZW50cyhvLHQscywhIW4pOnYodGhpcyx1dCxcImZcIikmJnYodGhpcyx5dCxcImZcIikudW5rbm93bkFyZ3VtZW50cyhvLHQse30sITEsITEpLHYodGhpcyx5dCxcImZcIikubGltaXRlZENob2ljZXMobyksdih0aGlzLHl0LFwiZlwiKS5pbXBsaWNhdGlvbnMobyksdih0aGlzLHl0LFwiZlwiKS5jb25mbGljdGluZyhvKX19W1h0XSgpe08odGhpcyxKLCEwLFwiZlwiKX1bUXRdKHQpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXYodGhpcyxldCxcImZcIikua2V5W3RdPSEwO2Vsc2UgZm9yKGNvbnN0IGUgb2YgdCl2KHRoaXMsZXQsXCJmXCIpLmtleVtlXT0hMH19dmFyIGVlLHNlO2NvbnN0e3JlYWRGaWxlU3luYzppZX09cmVxdWlyZShcImZzXCIpLHtpbnNwZWN0Om5lfT1yZXF1aXJlKFwidXRpbFwiKSx7cmVzb2x2ZTpyZX09cmVxdWlyZShcInBhdGhcIiksb2U9cmVxdWlyZShcInkxOG5cIiksYWU9cmVxdWlyZShcInlhcmdzLXBhcnNlclwiKTt2YXIgaGUsbGU9e2Fzc2VydDp7bm90U3RyaWN0RXF1YWw6dC5ub3RTdHJpY3RFcXVhbCxzdHJpY3RFcXVhbDp0LnN0cmljdEVxdWFsfSxjbGl1aTpyZXF1aXJlKFwiY2xpdWlcIiksZmluZFVwOnJlcXVpcmUoXCJlc2NhbGFkZS9zeW5jXCIpLGdldEVudjp0PT5wcm9jZXNzLmVudlt0XSxnZXRDYWxsZXJGaWxlOnJlcXVpcmUoXCJnZXQtY2FsbGVyLWZpbGVcIiksZ2V0UHJvY2Vzc0FyZ3ZCaW46eSxpbnNwZWN0Om5lLG1haW5GaWxlbmFtZTpudWxsIT09KHNlPW51bGw9PT0oZWU9bnVsbD09PXJlcXVpcmV8fHZvaWQgMD09PXJlcXVpcmU/dm9pZCAwOnJlcXVpcmUubWFpbil8fHZvaWQgMD09PWVlP3ZvaWQgMDplZS5maWxlbmFtZSkmJnZvaWQgMCE9PXNlP3NlOnByb2Nlc3MuY3dkKCksUGFyc2VyOmFlLHBhdGg6cmVxdWlyZShcInBhdGhcIikscHJvY2Vzczp7YXJndjooKT0+cHJvY2Vzcy5hcmd2LGN3ZDpwcm9jZXNzLmN3ZCxlbWl0V2FybmluZzoodCxlKT0+cHJvY2Vzcy5lbWl0V2FybmluZyh0LGUpLGV4ZWNQYXRoOigpPT5wcm9jZXNzLmV4ZWNQYXRoLGV4aXQ6dD0+e3Byb2Nlc3MuZXhpdCh0KX0sbmV4dFRpY2s6cHJvY2Vzcy5uZXh0VGljayxzdGRDb2x1bW5zOnZvaWQgMCE9PXByb2Nlc3Muc3Rkb3V0LmNvbHVtbnM/cHJvY2Vzcy5zdGRvdXQuY29sdW1uczpudWxsfSxyZWFkRmlsZVN5bmM6aWUscmVxdWlyZTpyZXF1aXJlLHJlcXVpcmVEaXJlY3Rvcnk6cmVxdWlyZShcInJlcXVpcmUtZGlyZWN0b3J5XCIpLHN0cmluZ1dpZHRoOnJlcXVpcmUoXCJzdHJpbmctd2lkdGhcIikseTE4bjpvZSh7ZGlyZWN0b3J5OnJlKF9fZGlybmFtZSxcIi4uL2xvY2FsZXNcIiksdXBkYXRlRmlsZXM6ITF9KX07Y29uc3QgY2U9KG51bGw9PT0oaGU9bnVsbD09PXByb2Nlc3N8fHZvaWQgMD09PXByb2Nlc3M/dm9pZCAwOnByb2Nlc3MuZW52KXx8dm9pZCAwPT09aGU/dm9pZCAwOmhlLllBUkdTX01JTl9OT0RFX1ZFUlNJT04pP051bWJlcihwcm9jZXNzLmVudi5ZQVJHU19NSU5fTk9ERV9WRVJTSU9OKToxMjtpZihwcm9jZXNzJiZwcm9jZXNzLnZlcnNpb24pe2lmKE51bWJlcihwcm9jZXNzLnZlcnNpb24ubWF0Y2goL3YoW14uXSspLylbMV0pPGNlKXRocm93IEVycm9yKGB5YXJncyBzdXBwb3J0cyBhIG1pbmltdW0gTm9kZS5qcyB2ZXJzaW9uIG9mICR7Y2V9LiBSZWFkIG91ciB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5OiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3Mjc3VwcG9ydGVkLW5vZGVqcy12ZXJzaW9uc2ApfWNvbnN0IGZlPXJlcXVpcmUoXCJ5YXJncy1wYXJzZXJcIik7dmFyIGRlLHVlPXthcHBseUV4dGVuZHM6bixjanNQbGF0Zm9ybVNoaW06bGUsWWFyZ3M6KGRlPWxlLCh0PVtdLGU9ZGUucHJvY2Vzcy5jd2QoKSxzKT0+e2NvbnN0IGk9bmV3IHRlKHQsZSxzLGRlKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGksXCJhcmd2XCIse2dldDooKT0+aS5wYXJzZSgpLGVudW1lcmFibGU6ITB9KSxpLmhlbHAoKSxpLnZlcnNpb24oKSxpfSksYXJnc2VydDpoLGlzUHJvbWlzZTpmLG9iakZpbHRlcjpnLHBhcnNlQ29tbWFuZDpvLFBhcnNlcjpmZSxwcm9jZXNzQXJndjpiLFlFcnJvcjplfTttb2R1bGUuZXhwb3J0cz11ZTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBzdGRpbiBhcyBpbnB1dCwgc3Rkb3V0IGFzIG91dHB1dCB9IGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSAncmVhZGxpbmUnO1xuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJ3Byb2dyZXNzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncy95YXJncyc7XG5pbXBvcnQgeyByZXNvbHZlQnVpbGRJZCwgQnJvd3NlclBsYXRmb3JtLCB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG5pbXBvcnQgeyBDYWNoZSB9IGZyb20gJy4vQ2FjaGUuanMnO1xuaW1wb3J0IHsgZGV0ZWN0QnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi9kZXRlY3RQbGF0Zm9ybS5qcyc7XG5pbXBvcnQgeyBpbnN0YWxsIH0gZnJvbSAnLi9pbnN0YWxsLmpzJztcbmltcG9ydCB7IGNvbXB1dGVFeGVjdXRhYmxlUGF0aCwgY29tcHV0ZVN5c3RlbUV4ZWN1dGFibGVQYXRoLCBsYXVuY2gsIH0gZnJvbSAnLi9sYXVuY2guanMnO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBDTEkge1xuICAgICNjYWNoZVBhdGg7XG4gICAgI3JsO1xuICAgICNzY3JpcHROYW1lID0gJyc7XG4gICAgI2FsbG93Q2FjaGVQYXRoT3ZlcnJpZGUgPSB0cnVlO1xuICAgICNwaW5uZWRCcm93c2VycztcbiAgICAjcHJlZml4Q29tbWFuZDtcbiAgICBjb25zdHJ1Y3RvcihvcHRzLCBybCkge1xuICAgICAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgICAgIG9wdHMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBvcHRzID0ge1xuICAgICAgICAgICAgICAgIGNhY2hlUGF0aDogb3B0cyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2FjaGVQYXRoID0gb3B0cy5jYWNoZVBhdGggPz8gcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgdGhpcy4jcmwgPSBybDtcbiAgICAgICAgdGhpcy4jc2NyaXB0TmFtZSA9IG9wdHMuc2NyaXB0TmFtZSA/PyAnQHB1cHBldGVlci9icm93c2Vycyc7XG4gICAgICAgIHRoaXMuI2FsbG93Q2FjaGVQYXRoT3ZlcnJpZGUgPSBvcHRzLmFsbG93Q2FjaGVQYXRoT3ZlcnJpZGUgPz8gdHJ1ZTtcbiAgICAgICAgdGhpcy4jcGlubmVkQnJvd3NlcnMgPSBvcHRzLnBpbm5lZEJyb3dzZXJzO1xuICAgICAgICB0aGlzLiNwcmVmaXhDb21tYW5kID0gb3B0cy5wcmVmaXhDb21tYW5kO1xuICAgIH1cbiAgICAjZGVmaW5lQnJvd3NlclBhcmFtZXRlcih5YXJncykge1xuICAgICAgICB5YXJncy5wb3NpdGlvbmFsKCdicm93c2VyJywge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXaGljaCBicm93c2VyIHRvIGluc3RhbGwgPGJyb3dzZXI+W0A8YnVpbGRJZHxsYXRlc3Q+XS4gYGxhdGVzdGAgd2lsbCB0cnkgdG8gZmluZCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZC4gYGJ1aWxkSWRgIGlzIGEgYnJvd3Nlci1zcGVjaWZpYyBpZGVudGlmaWVyIHN1Y2ggYXMgYSB2ZXJzaW9uIG9yIGEgcmV2aXNpb24uJyxcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgY29lcmNlOiAob3B0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy4jcGFyc2VCcm93c2VyKG9wdCksXG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IHRoaXMuI3BhcnNlQnVpbGRJZChvcHQpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgI2RlZmluZVBsYXRmb3JtUGFyYW1ldGVyKHlhcmdzKSB7XG4gICAgICAgIHlhcmdzLm9wdGlvbigncGxhdGZvcm0nLCB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2M6ICdQbGF0Zm9ybSB0aGF0IHRoZSBiaW5hcnkgbmVlZHMgdG8gYmUgY29tcGF0aWJsZSB3aXRoLicsXG4gICAgICAgICAgICBjaG9pY2VzOiBPYmplY3QudmFsdWVzKEJyb3dzZXJQbGF0Zm9ybSksXG4gICAgICAgICAgICBkZWZhdWx0RGVzY3JpcHRpb246ICdBdXRvLWRldGVjdGVkJyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICNkZWZpbmVQYXRoUGFyYW1ldGVyKHlhcmdzLCByZXF1aXJlZCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghdGhpcy4jYWxsb3dDYWNoZVBhdGhPdmVycmlkZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHlhcmdzLm9wdGlvbigncGF0aCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzYzogJ1BhdGggdG8gdGhlIHJvb3QgZm9sZGVyIGZvciB0aGUgYnJvd3NlciBkb3dubG9hZHMgYW5kIGluc3RhbGxhdGlvbi4gVGhlIGluc3RhbGxhdGlvbiBmb2xkZXIgc3RydWN0dXJlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY2FjaGUgc3RydWN0dXJlIHVzZWQgYnkgUHVwcGV0ZWVyLicsXG4gICAgICAgICAgICBkZWZhdWx0RGVzY3JpcHRpb246ICdDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICAgICAgICAgIC4uLihyZXF1aXJlZCA/IHt9IDogeyBkZWZhdWx0OiBwcm9jZXNzLmN3ZCgpIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB5YXJncy5kZW1hbmRPcHRpb24oJ3BhdGgnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBydW4oYXJndikge1xuICAgICAgICBjb25zdCB5YXJnc0luc3RhbmNlID0geWFyZ3MoaGlkZUJpbihhcmd2KSk7XG4gICAgICAgIGxldCB0YXJnZXQgPSB5YXJnc0luc3RhbmNlLnNjcmlwdE5hbWUodGhpcy4jc2NyaXB0TmFtZSk7XG4gICAgICAgIGlmICh0aGlzLiNwcmVmaXhDb21tYW5kKSB7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuY29tbWFuZCh0aGlzLiNwcmVmaXhDb21tYW5kLmNtZCwgdGhpcy4jcHJlZml4Q29tbWFuZC5kZXNjcmlwdGlvbiwgeWFyZ3MgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNidWlsZCh5YXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuI2J1aWxkKHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGFyZ2V0XG4gICAgICAgICAgICAuZGVtYW5kQ29tbWFuZCgxKVxuICAgICAgICAgICAgLmhlbHAoKVxuICAgICAgICAgICAgLndyYXAoTWF0aC5taW4oMTIwLCB5YXJnc0luc3RhbmNlLnRlcm1pbmFsV2lkdGgoKSkpXG4gICAgICAgICAgICAucGFyc2UoKTtcbiAgICB9XG4gICAgI2J1aWxkKHlhcmdzKSB7XG4gICAgICAgIGNvbnN0IGxhdGVzdE9yUGlubmVkID0gdGhpcy4jcGlubmVkQnJvd3NlcnMgPyAncGlubmVkJyA6ICdsYXRlc3QnO1xuICAgICAgICByZXR1cm4geWFyZ3NcbiAgICAgICAgICAgIC5jb21tYW5kKCdpbnN0YWxsIDxicm93c2VyPicsICdEb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgc3BlY2lmaWVkIGJyb3dzZXIuIElmIHN1Y2Nlc3NmdWwsIHRoZSBjb21tYW5kIG91dHB1dHMgdGhlIGFjdHVhbCBicm93c2VyIGJ1aWxkSWQgdGhhdCB3YXMgaW5zdGFsbGVkIGFuZCB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgYnJvd3NlciBleGVjdXRhYmxlIChmb3JtYXQ6IDxicm93c2VyPkA8YnVpbGRJRD4gPHBhdGg+KS4nLCB5YXJncyA9PiB7XG4gICAgICAgICAgICB0aGlzLiNkZWZpbmVCcm93c2VyUGFyYW1ldGVyKHlhcmdzKTtcbiAgICAgICAgICAgIHRoaXMuI2RlZmluZVBsYXRmb3JtUGFyYW1ldGVyKHlhcmdzKTtcbiAgICAgICAgICAgIHRoaXMuI2RlZmluZVBhdGhQYXJhbWV0ZXIoeWFyZ3MpO1xuICAgICAgICAgICAgeWFyZ3Mub3B0aW9uKCdiYXNlLXVybCcsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZXNjOiAnQmFzZSBVUkwgdG8gZG93bmxvYWQgZnJvbScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lJywgYEluc3RhbGwgdGhlICR7bGF0ZXN0T3JQaW5uZWR9IGF2YWlsYWJsZSBidWlsZCBvZiB0aGUgQ2hyb21lIGJyb3dzZXIuYCk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZUBsYXRlc3QnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgdGhlIENocm9tZSBicm93c2VyLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBjaHJvbWVAc3RhYmxlJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBhdmFpbGFibGUgYnVpbGQgZm9yIHRoZSBDaHJvbWUgYnJvd3NlciBmcm9tIHRoZSBzdGFibGUgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lQGJldGEnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgdGhlIENocm9tZSBicm93c2VyIGZyb20gdGhlIGJldGEgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lQGRldicsICdJbnN0YWxsIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGJ1aWxkIGZvciB0aGUgQ2hyb21lIGJyb3dzZXIgZnJvbSB0aGUgZGV2IGNoYW5uZWwuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZUBjYW5hcnknLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgdGhlIENocm9tZSBDYW5hcnkgYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lQDExNScsICdJbnN0YWxsIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGJ1aWxkIGZvciBDaHJvbWUgMTE1LicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBjaHJvbWVkcml2ZXJAY2FuYXJ5JywgJ0luc3RhbGwgdGhlIGxhdGVzdCBhdmFpbGFibGUgYnVpbGQgZm9yIENocm9tZURyaXZlciBDYW5hcnkuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZWRyaXZlckAxMTUnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgQ2hyb21lRHJpdmVyIDExNS4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lZHJpdmVyQDExNS4wLjU3OTAnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBwYXRjaCAoMTE1LjAuNTc5MC5YKSBidWlsZCBmb3IgQ2hyb21lRHJpdmVyLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBjaHJvbWUtaGVhZGxlc3Mtc2hlbGwnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBjaHJvbWUtaGVhZGxlc3Mtc2hlbGwgYnVpbGQuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZS1oZWFkbGVzcy1zaGVsbEBiZXRhJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBhdmFpbGFibGUgY2hyb21lLWhlYWRsZXNzLXNoZWxsIGJ1aWxkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEJldGEgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lLWhlYWRsZXNzLXNoZWxsQDExOCcsICdJbnN0YWxsIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGNocm9tZS1oZWFkbGVzcy1zaGVsbCAxMTggYnVpbGQuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9taXVtQDEwODMwODAnLCAnSW5zdGFsbCB0aGUgcmV2aXNpb24gMTA4MzA4MCBvZiB0aGUgQ2hyb21pdW0gYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveCcsICdJbnN0YWxsIHRoZSBsYXRlc3QgbmlnaHRseSBhdmFpbGFibGUgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveEBzdGFibGUnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IHN0YWJsZSBidWlsZCBvZiB0aGUgRmlyZWZveCBicm93c2VyLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBmaXJlZm94QGJldGEnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGJldGEgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveEBkZXZlZGl0aW9uJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBkZXZlZGl0aW9uIGJ1aWxkIG9mIHRoZSBGaXJlZm94IGJyb3dzZXIuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGZpcmVmb3hAZXNyJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBFU1IgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveEBuaWdodGx5JywgJ0luc3RhbGwgdGhlIGxhdGVzdCBuaWdodGx5IGJ1aWxkIG9mIHRoZSBGaXJlZm94IGJyb3dzZXIuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGZpcmVmb3hAc3RhYmxlXzExMS4wLjEnLCAnSW5zdGFsbCBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveCAtLXBsYXRmb3JtIG1hYycsICdJbnN0YWxsIHRoZSBsYXRlc3QgTWFjIChJbnRlbCkgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNhbGxvd0NhY2hlUGF0aE92ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBmaXJlZm94IC0tcGF0aCAvdG1wL215LWJyb3dzZXItY2FjaGUnLCAnSW5zdGFsbCB0byB0aGUgc3BlY2lmaWVkIGNhY2hlIGRpcmVjdG9yeS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgYXN5bmMgKGFyZ3YpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBhcmd2O1xuICAgICAgICAgICAgYXJncy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgICAgICAgICBpZiAoIWFyZ3MucGxhdGZvcm0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZXNvbHZlIHRoZSBjdXJyZW50IHBsYXRmb3JtYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJncy5icm93c2VyLmJ1aWxkSWQgPT09ICdwaW5uZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGlubmVkVmVyc2lvbiA9IHRoaXMuI3Bpbm5lZEJyb3dzZXJzPy5bYXJncy5icm93c2VyLm5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICghcGlubmVkVmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBpbm5lZCB2ZXJzaW9uIGZvdW5kIGZvciAke2FyZ3MuYnJvd3Nlci5uYW1lfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhcmdzLmJyb3dzZXIuYnVpbGRJZCA9IHBpbm5lZFZlcnNpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEJ1aWxkSWQgPSBhcmdzLmJyb3dzZXIuYnVpbGRJZDtcbiAgICAgICAgICAgIGFyZ3MuYnJvd3Nlci5idWlsZElkID0gYXdhaXQgcmVzb2x2ZUJ1aWxkSWQoYXJncy5icm93c2VyLm5hbWUsIGFyZ3MucGxhdGZvcm0sIGFyZ3MuYnJvd3Nlci5idWlsZElkKTtcbiAgICAgICAgICAgIGF3YWl0IGluc3RhbGwoe1xuICAgICAgICAgICAgICAgIGJyb3dzZXI6IGFyZ3MuYnJvd3Nlci5uYW1lLFxuICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBhcmdzLnBsYXRmb3JtLFxuICAgICAgICAgICAgICAgIGNhY2hlRGlyOiBhcmdzLnBhdGggPz8gdGhpcy4jY2FjaGVQYXRoLFxuICAgICAgICAgICAgICAgIGRvd25sb2FkUHJvZ3Jlc3NDYWxsYmFjazogbWFrZVByb2dyZXNzQ2FsbGJhY2soYXJncy5icm93c2VyLm5hbWUsIGFyZ3MuYnJvd3Nlci5idWlsZElkKSxcbiAgICAgICAgICAgICAgICBiYXNlVXJsOiBhcmdzLmJhc2VVcmwsXG4gICAgICAgICAgICAgICAgYnVpbGRJZEFsaWFzOiBvcmlnaW5hbEJ1aWxkSWQgIT09IGFyZ3MuYnJvd3Nlci5idWlsZElkXG4gICAgICAgICAgICAgICAgICAgID8gb3JpZ2luYWxCdWlsZElkXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJHthcmdzLmJyb3dzZXIubmFtZX1AJHthcmdzLmJyb3dzZXIuYnVpbGRJZH0gJHtjb21wdXRlRXhlY3V0YWJsZVBhdGgoe1xuICAgICAgICAgICAgICAgIGJyb3dzZXI6IGFyZ3MuYnJvd3Nlci5uYW1lLFxuICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgIGNhY2hlRGlyOiBhcmdzLnBhdGggPz8gdGhpcy4jY2FjaGVQYXRoLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBhcmdzLnBsYXRmb3JtLFxuICAgICAgICAgICAgfSl9YCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY29tbWFuZCgnbGF1bmNoIDxicm93c2VyPicsICdMYXVuY2ggdGhlIHNwZWNpZmllZCBicm93c2VyJywgeWFyZ3MgPT4ge1xuICAgICAgICAgICAgdGhpcy4jZGVmaW5lQnJvd3NlclBhcmFtZXRlcih5YXJncyk7XG4gICAgICAgICAgICB0aGlzLiNkZWZpbmVQbGF0Zm9ybVBhcmFtZXRlcih5YXJncyk7XG4gICAgICAgICAgICB0aGlzLiNkZWZpbmVQYXRoUGFyYW1ldGVyKHlhcmdzKTtcbiAgICAgICAgICAgIHlhcmdzLm9wdGlvbignZGV0YWNoZWQnLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgIGRlc2M6ICdEZXRhY2ggdGhlIGNoaWxkIHByb2Nlc3MuJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgeWFyZ3Mub3B0aW9uKCdzeXN0ZW0nLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgIGRlc2M6ICdTZWFyY2ggZm9yIGEgYnJvd3NlciBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBpbnN0ZWFkIG9mIHRoZSBjYWNoZSBmb2xkZXIuJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgbGF1bmNoIGNocm9tZUAxMTUuMC41NzkwLjE3MCcsICdMYXVuY2ggQ2hyb21lIDExNS4wLjU3OTAuMTcwJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBsYXVuY2ggZmlyZWZveEAxMTIuMGExJywgJ0xhdW5jaCB0aGUgRmlyZWZveCBicm93c2VyIGlkZW50aWZpZWQgYnkgdGhlIG1pbGVzdG9uZSAxMTIuMGExLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgbGF1bmNoIGNocm9tZUAxMTUuMC41NzkwLjE3MCAtLWRldGFjaGVkJywgJ0xhdW5jaCB0aGUgYnJvd3NlciBidXQgZGV0YWNoIHRoZSBzdWItcHJvY2Vzc2VzLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgbGF1bmNoIGNocm9tZUBjYW5hcnkgLS1zeXN0ZW0nLCAnVHJ5IHRvIGxvY2F0ZSB0aGUgQ2FuYXJ5IGJ1aWxkIG9mIENocm9tZSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBhbmQgbGF1bmNoIGl0LicpO1xuICAgICAgICB9LCBhc3luYyAoYXJndikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGFyZ3Y7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRhYmxlUGF0aCA9IGFyZ3Muc3lzdGVtXG4gICAgICAgICAgICAgICAgPyBjb21wdXRlU3lzdGVtRXhlY3V0YWJsZVBhdGgoe1xuICAgICAgICAgICAgICAgICAgICBicm93c2VyOiBhcmdzLmJyb3dzZXIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdGhyb3cgYW4gZXJyb3IgaWYgbm90IGEgQ2hyb21lUmVsZWFzZUNoYW5uZWwgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybTogYXJncy5wbGF0Zm9ybSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogY29tcHV0ZUV4ZWN1dGFibGVQYXRoKHtcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlcjogYXJncy5icm93c2VyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgICAgICBjYWNoZURpcjogYXJncy5wYXRoID8/IHRoaXMuI2NhY2hlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06IGFyZ3MucGxhdGZvcm0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsYXVuY2goe1xuICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVQYXRoLFxuICAgICAgICAgICAgICAgIGRldGFjaGVkOiBhcmdzLmRldGFjaGVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY29tbWFuZCgnY2xlYXInLCB0aGlzLiNhbGxvd0NhY2hlUGF0aE92ZXJyaWRlXG4gICAgICAgICAgICA/ICdSZW1vdmVzIGFsbCBpbnN0YWxsZWQgYnJvd3NlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIGNhY2hlIGRpcmVjdG9yeSdcbiAgICAgICAgICAgIDogYFJlbW92ZXMgYWxsIGluc3RhbGxlZCBicm93c2VycyBmcm9tICR7dGhpcy4jY2FjaGVQYXRofWAsIHlhcmdzID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2RlZmluZVBhdGhQYXJhbWV0ZXIoeWFyZ3MsIHRydWUpO1xuICAgICAgICB9LCBhc3luYyAoYXJndikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGFyZ3Y7XG4gICAgICAgICAgICBjb25zdCBjYWNoZURpciA9IGFyZ3MucGF0aCA/PyB0aGlzLiNjYWNoZVBhdGg7XG4gICAgICAgICAgICBjb25zdCBybCA9IHRoaXMuI3JsID8/IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7IGlucHV0LCBvdXRwdXQgfSk7XG4gICAgICAgICAgICBybC5xdWVzdGlvbihgRG8geW91IHdhbnQgdG8gcGVybWFuZW50bHkgYW5kIHJlY3Vyc2l2ZWx5IGRlbGV0ZSB0aGUgY29udGVudCBvZiAke2NhY2hlRGlyfSAoeWVzL05vKT8gYCwgYW5zd2VyID0+IHtcbiAgICAgICAgICAgICAgICBybC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGlmICghWyd5JywgJ3llcyddLmluY2x1ZGVzKGFuc3dlci50b0xvd2VyQ2FzZSgpLnRyaW0oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NhbmNlbGxlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZShjYWNoZURpcik7XG4gICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtjYWNoZURpcn0gY2xlYXJlZC5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmRlbWFuZENvbW1hbmQoMSlcbiAgICAgICAgICAgIC5oZWxwKCk7XG4gICAgfVxuICAgICNwYXJzZUJyb3dzZXIodmVyc2lvbikge1xuICAgICAgICByZXR1cm4gdmVyc2lvbi5zcGxpdCgnQCcpLnNoaWZ0KCk7XG4gICAgfVxuICAgICNwYXJzZUJ1aWxkSWQodmVyc2lvbikge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHZlcnNpb24uc3BsaXQoJ0AnKTtcbiAgICAgICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMlxuICAgICAgICAgICAgPyBwYXJ0c1sxXVxuICAgICAgICAgICAgOiB0aGlzLiNwaW5uZWRCcm93c2Vyc1xuICAgICAgICAgICAgICAgID8gJ3Bpbm5lZCdcbiAgICAgICAgICAgICAgICA6ICdsYXRlc3QnO1xuICAgIH1cbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVByb2dyZXNzQ2FsbGJhY2soYnJvd3NlciwgYnVpbGRJZCkge1xuICAgIGxldCBwcm9ncmVzc0JhcjtcbiAgICBsZXQgbGFzdERvd25sb2FkZWRCeXRlcyA9IDA7XG4gICAgcmV0dXJuIChkb3dubG9hZGVkQnl0ZXMsIHRvdGFsQnl0ZXMpID0+IHtcbiAgICAgICAgaWYgKCFwcm9ncmVzc0Jhcikge1xuICAgICAgICAgICAgcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoYERvd25sb2FkaW5nICR7YnJvd3Nlcn0gJHtidWlsZElkfSAtICR7dG9NZWdhYnl0ZXModG90YWxCeXRlcyl9IFs6YmFyXSA6cGVyY2VudCA6ZXRhcyBgLCB7XG4gICAgICAgICAgICAgICAgY29tcGxldGU6ICc9JyxcbiAgICAgICAgICAgICAgICBpbmNvbXBsZXRlOiAnICcsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwLFxuICAgICAgICAgICAgICAgIHRvdGFsOiB0b3RhbEJ5dGVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsdGEgPSBkb3dubG9hZGVkQnl0ZXMgLSBsYXN0RG93bmxvYWRlZEJ5dGVzO1xuICAgICAgICBsYXN0RG93bmxvYWRlZEJ5dGVzID0gZG93bmxvYWRlZEJ5dGVzO1xuICAgICAgICBwcm9ncmVzc0Jhci50aWNrKGRlbHRhKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gdG9NZWdhYnl0ZXMoYnl0ZXMpIHtcbiAgICBjb25zdCBtYiA9IGJ5dGVzIC8gMTAwMCAvIDEwMDA7XG4gICAgcmV0dXJuIGAke01hdGgucm91bmQobWIgKiAxMCkgLyAxMH0gTUJgO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q0xJLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IEJyb3dzZXIsIGV4ZWN1dGFibGVQYXRoQnlCcm93c2VyLCBnZXRWZXJzaW9uQ29tcGFyYXRvciwgfSBmcm9tICcuL2Jyb3dzZXItZGF0YS9icm93c2VyLWRhdGEuanMnO1xuaW1wb3J0IHsgZGV0ZWN0QnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi9kZXRlY3RQbGF0Zm9ybS5qcyc7XG5jb25zdCBkZWJ1Z0NhY2hlID0gZGVidWcoJ3B1cHBldGVlcjpicm93c2VyczpjYWNoZScpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnN0YWxsZWRCcm93c2VyIHtcbiAgICBicm93c2VyO1xuICAgIGJ1aWxkSWQ7XG4gICAgcGxhdGZvcm07XG4gICAgZXhlY3V0YWJsZVBhdGg7XG4gICAgI2NhY2hlO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhY2hlLCBicm93c2VyLCBidWlsZElkLCBwbGF0Zm9ybSkge1xuICAgICAgICB0aGlzLiNjYWNoZSA9IGNhY2hlO1xuICAgICAgICB0aGlzLmJyb3dzZXIgPSBicm93c2VyO1xuICAgICAgICB0aGlzLmJ1aWxkSWQgPSBidWlsZElkO1xuICAgICAgICB0aGlzLnBsYXRmb3JtID0gcGxhdGZvcm07XG4gICAgICAgIHRoaXMuZXhlY3V0YWJsZVBhdGggPSBjYWNoZS5jb21wdXRlRXhlY3V0YWJsZVBhdGgoe1xuICAgICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgICAgIGJ1aWxkSWQsXG4gICAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlIGluc3RhbGxhdGlvbiBmb2xkZXIuIFVzZVxuICAgICAqIHtAbGluayBjb21wdXRlRXhlY3V0YWJsZVBhdGh9IHRvIGdldCB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSBiaW5hcnkuXG4gICAgICovXG4gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWNoZS5pbnN0YWxsYXRpb25EaXIodGhpcy5icm93c2VyLCB0aGlzLnBsYXRmb3JtLCB0aGlzLmJ1aWxkSWQpO1xuICAgIH1cbiAgICByZWFkTWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWNoZS5yZWFkTWV0YWRhdGEodGhpcy5icm93c2VyKTtcbiAgICB9XG4gICAgd3JpdGVNZXRhZGF0YShtZXRhZGF0YSkge1xuICAgICAgICB0aGlzLiNjYWNoZS53cml0ZU1ldGFkYXRhKHRoaXMuYnJvd3NlciwgbWV0YWRhdGEpO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIGNhY2hlIHVzZWQgYnkgUHVwcGV0ZWVyIHJlbGllcyBvbiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqXG4gKiAtIHJvb3REaXJcbiAqICAgLS0gPGJyb3dzZXIxPiB8IGJyb3dzZXJSb290KGJyb3dzZXIxKVxuICogICAtLS0tIDxwbGF0Zm9ybT4tPGJ1aWxkSWQ+IHwgaW5zdGFsbGF0aW9uRGlyKClcbiAqICAgLS0tLS0tIHRoZSBicm93c2VyLXBsYXRmb3JtLWJ1aWxkSWRcbiAqICAgLS0tLS0tIHNwZWNpZmljIHN0cnVjdHVyZS5cbiAqICAgLS0gPGJyb3dzZXIyPiB8IGJyb3dzZXJSb290KGJyb3dzZXIyKVxuICogICAtLS0tIDxwbGF0Zm9ybT4tPGJ1aWxkSWQ+IHwgaW5zdGFsbGF0aW9uRGlyKClcbiAqICAgLS0tLS0tIHRoZSBicm93c2VyLXBsYXRmb3JtLWJ1aWxkSWRcbiAqICAgLS0tLS0tIHNwZWNpZmljIHN0cnVjdHVyZS5cbiAqICAgQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWNoZSB7XG4gICAgI3Jvb3REaXI7XG4gICAgY29uc3RydWN0b3Iocm9vdERpcikge1xuICAgICAgICB0aGlzLiNyb290RGlyID0gcm9vdERpcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0IHJvb3REaXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyb290RGlyO1xuICAgIH1cbiAgICBicm93c2VyUm9vdChicm93c2VyKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy4jcm9vdERpciwgYnJvd3Nlcik7XG4gICAgfVxuICAgIG1ldGFkYXRhRmlsZShicm93c2VyKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5icm93c2VyUm9vdChicm93c2VyKSwgJy5tZXRhZGF0YScpO1xuICAgIH1cbiAgICByZWFkTWV0YWRhdGEoYnJvd3Nlcikge1xuICAgICAgICBjb25zdCBtZXRhdGFkYVBhdGggPSB0aGlzLm1ldGFkYXRhRmlsZShicm93c2VyKTtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG1ldGF0YWRhUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGFsaWFzZXM6IHt9IH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogYWRkIHR5cGUtc2FmZSBwYXJzaW5nLlxuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWV0YXRhZGFQYXRoLCAndXRmOCcpKTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcubWV0YWRhdGEgaXMgbm90IGFuIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICB3cml0ZU1ldGFkYXRhKGJyb3dzZXIsIG1ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IG1ldGF0YWRhUGF0aCA9IHRoaXMubWV0YWRhdGFGaWxlKGJyb3dzZXIpO1xuICAgICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG1ldGF0YWRhUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG1ldGF0YWRhUGF0aCwgSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEsIG51bGwsIDIpKTtcbiAgICB9XG4gICAgcmVzb2x2ZUFsaWFzKGJyb3dzZXIsIGFsaWFzKSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5yZWFkTWV0YWRhdGEoYnJvd3Nlcik7XG4gICAgICAgIGlmIChhbGlhcyA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKG1ldGFkYXRhLmFsaWFzZXMgfHwge30pXG4gICAgICAgICAgICAgICAgLnNvcnQoZ2V0VmVyc2lvbkNvbXBhcmF0b3IoYnJvd3NlcikpXG4gICAgICAgICAgICAgICAgLmF0KC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0YWRhdGEuYWxpYXNlc1thbGlhc107XG4gICAgfVxuICAgIGluc3RhbGxhdGlvbkRpcihicm93c2VyLCBwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgICAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuYnJvd3NlclJvb3QoYnJvd3NlciksIGAke3BsYXRmb3JtfS0ke2J1aWxkSWR9YCk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICBmcy5ybVN5bmModGhpcy4jcm9vdERpciwge1xuICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgICBtYXhSZXRyaWVzOiAxMCxcbiAgICAgICAgICAgIHJldHJ5RGVsYXk6IDUwMCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVuaW5zdGFsbChicm93c2VyLCBwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMucmVhZE1ldGFkYXRhKGJyb3dzZXIpO1xuICAgICAgICBmb3IgKGNvbnN0IGFsaWFzIG9mIE9iamVjdC5rZXlzKG1ldGFkYXRhLmFsaWFzZXMpKSB7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEuYWxpYXNlc1thbGlhc10gPT09IGJ1aWxkSWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWxpYXNlc1thbGlhc107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnMucm1TeW5jKHRoaXMuaW5zdGFsbGF0aW9uRGlyKGJyb3dzZXIsIHBsYXRmb3JtLCBidWlsZElkKSwge1xuICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgICBtYXhSZXRyaWVzOiAxMCxcbiAgICAgICAgICAgIHJldHJ5RGVsYXk6IDUwMCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldEluc3RhbGxlZEJyb3dzZXJzKCkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy4jcm9vdERpcikpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuI3Jvb3REaXIpO1xuICAgICAgICBjb25zdCBicm93c2VycyA9IHR5cGVzLmZpbHRlcigodCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoQnJvd3NlcikuaW5jbHVkZXModCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYnJvd3NlcnMuZmxhdE1hcChicm93c2VyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmModGhpcy5icm93c2VyUm9vdChicm93c2VyKSk7XG4gICAgICAgICAgICByZXR1cm4gZmlsZXNcbiAgICAgICAgICAgICAgICAubWFwKGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlRm9sZGVyUGF0aChwYXRoLmpvaW4odGhpcy5icm93c2VyUm9vdChicm93c2VyKSwgZmlsZSkpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluc3RhbGxlZEJyb3dzZXIodGhpcywgYnJvd3NlciwgcmVzdWx0LmJ1aWxkSWQsIHJlc3VsdC5wbGF0Zm9ybSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSAhPT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29tcHV0ZUV4ZWN1dGFibGVQYXRoKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgICAgIGlmICghb3B0aW9ucy5wbGF0Zm9ybSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZG93bmxvYWQgYSBiaW5hcnkgZm9yIHRoZSBwcm92aWRlZCBwbGF0Zm9ybTogJHtvcy5wbGF0Zm9ybSgpfSAoJHtvcy5hcmNoKCl9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvcHRpb25zLmJ1aWxkSWQgPVxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZUFsaWFzKG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5idWlsZElkKSA/PyBvcHRpb25zLmJ1aWxkSWQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgZGVidWdDYWNoZSgnY291bGQgbm90IHJlYWQgLm1ldGFkYXRhIGZpbGUgZm9yIHRoZSBicm93c2VyJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5zdGFsbGF0aW9uRGlyID0gdGhpcy5pbnN0YWxsYXRpb25EaXIob3B0aW9ucy5icm93c2VyLCBvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQpO1xuICAgICAgICByZXR1cm4gcGF0aC5qb2luKGluc3RhbGxhdGlvbkRpciwgZXhlY3V0YWJsZVBhdGhCeUJyb3dzZXJbb3B0aW9ucy5icm93c2VyXShvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZUZvbGRlclBhdGgoZm9sZGVyUGF0aCkge1xuICAgIGNvbnN0IG5hbWUgPSBwYXRoLmJhc2VuYW1lKGZvbGRlclBhdGgpO1xuICAgIGNvbnN0IHNwbGl0cyA9IG5hbWUuc3BsaXQoJy0nKTtcbiAgICBpZiAoc3BsaXRzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFtwbGF0Zm9ybSwgYnVpbGRJZF0gPSBzcGxpdHM7XG4gICAgaWYgKCFidWlsZElkIHx8ICFwbGF0Zm9ybSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB7IHBsYXRmb3JtLCBidWlsZElkIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYWNoZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0ICogYXMgY2hyb21lSGVhZGxlc3NTaGVsbCBmcm9tICcuL2Nocm9tZS1oZWFkbGVzcy1zaGVsbC5qcyc7XG5pbXBvcnQgKiBhcyBjaHJvbWUgZnJvbSAnLi9jaHJvbWUuanMnO1xuaW1wb3J0ICogYXMgY2hyb21lZHJpdmVyIGZyb20gJy4vY2hyb21lZHJpdmVyLmpzJztcbmltcG9ydCAqIGFzIGNocm9taXVtIGZyb20gJy4vY2hyb21pdW0uanMnO1xuaW1wb3J0ICogYXMgZmlyZWZveCBmcm9tICcuL2ZpcmVmb3guanMnO1xuaW1wb3J0IHsgQnJvd3NlciwgQnJvd3NlclBsYXRmb3JtLCBCcm93c2VyVGFnLCBDaHJvbWVSZWxlYXNlQ2hhbm5lbCwgfSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCBjb25zdCBkb3dubG9hZFVybHMgPSB7XG4gICAgW0Jyb3dzZXIuQ0hST01FRFJJVkVSXTogY2hyb21lZHJpdmVyLnJlc29sdmVEb3dubG9hZFVybCxcbiAgICBbQnJvd3Nlci5DSFJPTUVIRUFETEVTU1NIRUxMXTogY2hyb21lSGVhZGxlc3NTaGVsbC5yZXNvbHZlRG93bmxvYWRVcmwsXG4gICAgW0Jyb3dzZXIuQ0hST01FXTogY2hyb21lLnJlc29sdmVEb3dubG9hZFVybCxcbiAgICBbQnJvd3Nlci5DSFJPTUlVTV06IGNocm9taXVtLnJlc29sdmVEb3dubG9hZFVybCxcbiAgICBbQnJvd3Nlci5GSVJFRk9YXTogZmlyZWZveC5yZXNvbHZlRG93bmxvYWRVcmwsXG59O1xuZXhwb3J0IGNvbnN0IGRvd25sb2FkUGF0aHMgPSB7XG4gICAgW0Jyb3dzZXIuQ0hST01FRFJJVkVSXTogY2hyb21lZHJpdmVyLnJlc29sdmVEb3dubG9hZFBhdGgsXG4gICAgW0Jyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTF06IGNocm9tZUhlYWRsZXNzU2hlbGwucmVzb2x2ZURvd25sb2FkUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUVdOiBjaHJvbWUucmVzb2x2ZURvd25sb2FkUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUlVTV06IGNocm9taXVtLnJlc29sdmVEb3dubG9hZFBhdGgsXG4gICAgW0Jyb3dzZXIuRklSRUZPWF06IGZpcmVmb3gucmVzb2x2ZURvd25sb2FkUGF0aCxcbn07XG5leHBvcnQgY29uc3QgZXhlY3V0YWJsZVBhdGhCeUJyb3dzZXIgPSB7XG4gICAgW0Jyb3dzZXIuQ0hST01FRFJJVkVSXTogY2hyb21lZHJpdmVyLnJlbGF0aXZlRXhlY3V0YWJsZVBhdGgsXG4gICAgW0Jyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTF06IGNocm9tZUhlYWRsZXNzU2hlbGwucmVsYXRpdmVFeGVjdXRhYmxlUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUVdOiBjaHJvbWUucmVsYXRpdmVFeGVjdXRhYmxlUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUlVTV06IGNocm9taXVtLnJlbGF0aXZlRXhlY3V0YWJsZVBhdGgsXG4gICAgW0Jyb3dzZXIuRklSRUZPWF06IGZpcmVmb3gucmVsYXRpdmVFeGVjdXRhYmxlUGF0aCxcbn07XG5leHBvcnQgY29uc3QgdmVyc2lvbkNvbXBhcmF0b3JzID0ge1xuICAgIFtCcm93c2VyLkNIUk9NRURSSVZFUl06IGNocm9tZWRyaXZlci5jb21wYXJlVmVyc2lvbnMsXG4gICAgW0Jyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTF06IGNocm9tZUhlYWRsZXNzU2hlbGwuY29tcGFyZVZlcnNpb25zLFxuICAgIFtCcm93c2VyLkNIUk9NRV06IGNocm9tZS5jb21wYXJlVmVyc2lvbnMsXG4gICAgW0Jyb3dzZXIuQ0hST01JVU1dOiBjaHJvbWl1bS5jb21wYXJlVmVyc2lvbnMsXG4gICAgW0Jyb3dzZXIuRklSRUZPWF06IGZpcmVmb3guY29tcGFyZVZlcnNpb25zLFxufTtcbmV4cG9ydCB7IEJyb3dzZXIsIEJyb3dzZXJQbGF0Zm9ybSwgQ2hyb21lUmVsZWFzZUNoYW5uZWwgfTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCdWlsZElkRm9yQnJvd3NlclRhZyhicm93c2VyLCBwbGF0Zm9ybSwgdGFnKSB7XG4gICAgc3dpdGNoIChicm93c2VyKSB7XG4gICAgICAgIGNhc2UgQnJvd3Nlci5GSVJFRk9YOlxuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTEFURVNUOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLk5JR0hUTFkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLkJFVEEpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5OSUdIVExZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLk5JR0hUTFkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVZFRElUSU9OOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLkRFVkVESVRJT04pO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5TVEFCTEU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBmaXJlZm94LnJlc29sdmVCdWlsZElkKGZpcmVmb3guRmlyZWZveENoYW5uZWwuU1RBQkxFKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuRVNSOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLkVTUik7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuREVWOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFnLnRvVXBwZXJDYXNlKCl9IGlzIG5vdCBhdmFpbGFibGUgZm9yIEZpcmVmb3hgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NRToge1xuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTEFURVNUOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkNBTkFSWSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkJFVEE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWUucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuQkVUQSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNocm9tZS5yZXNvbHZlQnVpbGRJZChDaHJvbWVSZWxlYXNlQ2hhbm5lbC5DQU5BUlkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWUucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuREVWKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLlNUQUJMRSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLk5JR0hUTFk6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkRFVkVESVRJT046XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkVTUjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhZy50b1VwcGVyQ2FzZSgpfSBpcyBub3QgYXZhaWxhYmxlIGZvciBDaHJvbWVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FRFJJVkVSOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5MQVRFU1Q6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNocm9tZWRyaXZlci5yZXNvbHZlQnVpbGRJZChDaHJvbWVSZWxlYXNlQ2hhbm5lbC5DQU5BUlkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lZHJpdmVyLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkJFVEEpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVkcml2ZXIucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuREVWKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lZHJpdmVyLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLlNUQUJMRSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLk5JR0hUTFk6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkRFVkVESVRJT046XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkVTUjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhZy50b1VwcGVyQ2FzZSgpfSBpcyBub3QgYXZhaWxhYmxlIGZvciBDaHJvbWVEcml2ZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTDoge1xuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTEFURVNUOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5DQU5BUlk6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkNBTkFSWSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkJFVEE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkJFVEEpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkRFVik7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLlNUQUJMRTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNocm9tZUhlYWRsZXNzU2hlbGwucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTklHSFRMWTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuREVWRURJVElPTjpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuRVNSOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFnfSBpcyBub3QgYXZhaWxhYmxlIGZvciBjaHJvbWUtaGVhZGxlc3Mtc2hlbGxgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01JVU06XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5MQVRFU1Q6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWl1bS5yZXNvbHZlQnVpbGRJZChwbGF0Zm9ybSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLk5JR0hUTFk6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuREVWOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVZFRElUSU9OOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5CRVRBOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5TVEFCTEU6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkVTUjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhZ30gaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2hyb21pdW0uIFVzZSAnbGF0ZXN0JyBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJ1aWxkSWQoYnJvd3NlciwgcGxhdGZvcm0sIHRhZykge1xuICAgIGNvbnN0IGJyb3dzZXJUYWcgPSB0YWc7XG4gICAgaWYgKE9iamVjdC52YWx1ZXMoQnJvd3NlclRhZykuaW5jbHVkZXMoYnJvd3NlclRhZykpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVCdWlsZElkRm9yQnJvd3NlclRhZyhicm93c2VyLCBwbGF0Zm9ybSwgYnJvd3NlclRhZyk7XG4gICAgfVxuICAgIHN3aXRjaCAoYnJvd3Nlcikge1xuICAgICAgICBjYXNlIEJyb3dzZXIuRklSRUZPWDpcbiAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUU6XG4gICAgICAgICAgICBjb25zdCBjaHJvbWVSZXN1bHQgPSBhd2FpdCBjaHJvbWUucmVzb2x2ZUJ1aWxkSWQodGFnKTtcbiAgICAgICAgICAgIGlmIChjaHJvbWVSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hyb21lUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NRURSSVZFUjpcbiAgICAgICAgICAgIGNvbnN0IGNocm9tZURyaXZlclJlc3VsdCA9IGF3YWl0IGNocm9tZWRyaXZlci5yZXNvbHZlQnVpbGRJZCh0YWcpO1xuICAgICAgICAgICAgaWYgKGNocm9tZURyaXZlclJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaHJvbWVEcml2ZXJSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGFnO1xuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTDpcbiAgICAgICAgICAgIGNvbnN0IGNocm9tZUhlYWRsZXNzU2hlbGxSZXN1bHQgPSBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKHRhZyk7XG4gICAgICAgICAgICBpZiAoY2hyb21lSGVhZGxlc3NTaGVsbFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaHJvbWVIZWFkbGVzc1NoZWxsUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NSVVNOlxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVByb2ZpbGUoYnJvd3Nlciwgb3B0cykge1xuICAgIHN3aXRjaCAoYnJvd3Nlcikge1xuICAgICAgICBjYXNlIEJyb3dzZXIuRklSRUZPWDpcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmaXJlZm94LmNyZWF0ZVByb2ZpbGUob3B0cyk7XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUU6XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUlVTTpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvZmlsZSBjcmVhdGlvbiBpcyBub3Qgc3VwcG9ydCBmb3IgJHticm93c2VyfSB5ZXRgKTtcbiAgICB9XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTeXN0ZW1FeGVjdXRhYmxlUGF0aChicm93c2VyLCBwbGF0Zm9ybSwgY2hhbm5lbCkge1xuICAgIHN3aXRjaCAoYnJvd3Nlcikge1xuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FRFJJVkVSOlxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTDpcbiAgICAgICAgY2FzZSBCcm93c2VyLkZJUkVGT1g6XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUlVTTpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3lzdGVtIGJyb3dzZXIgZGV0ZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yICR7YnJvd3Nlcn0geWV0LmApO1xuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FOlxuICAgICAgICAgICAgcmV0dXJuIGNocm9tZS5yZXNvbHZlU3lzdGVtRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIGNoYW5uZWwpO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyBhIHZlcnNpb24gY29tcGFyYXRvciBmb3IgdGhlIGdpdmVuIGJyb3dzZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBzb3J0XG4gKiBicm93c2VyIHZlcnNpb25zLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25Db21wYXJhdG9yKGJyb3dzZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvbkNvbXBhcmF0b3JzW2Jyb3dzZXJdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJvd3Nlci1kYXRhLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vdHlwZXMuanMnO1xuZnVuY3Rpb24gZm9sZGVyKHBsYXRmb3JtKSB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgIHJldHVybiAnbGludXg2NCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgICAgICByZXR1cm4gJ21hYy1hcm02NCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiAnbWFjLXg2NCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICAgICAgcmV0dXJuICd3aW4zMic7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICAgICAgcmV0dXJuICd3aW42NCc7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFVybChwbGF0Zm9ybSwgYnVpbGRJZCwgYmFzZVVybCA9ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vY2hyb21lLWZvci10ZXN0aW5nLXB1YmxpYycpIHtcbiAgICByZXR1cm4gYCR7YmFzZVVybH0vJHtyZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCBidWlsZElkKS5qb2luKCcvJyl9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCBidWlsZElkKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYnVpbGRJZCxcbiAgICAgICAgZm9sZGVyKHBsYXRmb3JtKSxcbiAgICAgICAgYGNocm9tZS1oZWFkbGVzcy1zaGVsbC0ke2ZvbGRlcihwbGF0Zm9ybSl9LnppcGAsXG4gICAgXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUV4ZWN1dGFibGVQYXRoKHBsYXRmb3JtLCBfYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLWhlYWRsZXNzLXNoZWxsLScgKyBmb2xkZXIocGxhdGZvcm0pLCAnY2hyb21lLWhlYWRsZXNzLXNoZWxsJyk7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLWhlYWRsZXNzLXNoZWxsLWxpbnV4NjQnLCAnY2hyb21lLWhlYWRsZXNzLXNoZWxsJyk7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2Nocm9tZS1oZWFkbGVzcy1zaGVsbC0nICsgZm9sZGVyKHBsYXRmb3JtKSwgJ2Nocm9tZS1oZWFkbGVzcy1zaGVsbC5leGUnKTtcbiAgICB9XG59XG5leHBvcnQgeyByZXNvbHZlQnVpbGRJZCwgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnLi9jaHJvbWUuanMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2hyb21lLWhlYWRsZXNzLXNoZWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IGdldEpTT04gfSBmcm9tICcuLi9odHRwVXRpbC5qcyc7XG5pbXBvcnQgeyBCcm93c2VyUGxhdGZvcm0sIENocm9tZVJlbGVhc2VDaGFubmVsIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5mdW5jdGlvbiBmb2xkZXIocGxhdGZvcm0pIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuICdsaW51eDY0JztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDX0FSTTpcbiAgICAgICAgICAgIHJldHVybiAnbWFjLWFybTY0JztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICAgICAgcmV0dXJuICdtYWMteDY0JztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lOMzI6XG4gICAgICAgICAgICByZXR1cm4gJ3dpbjMyJztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gJ3dpbjY0JztcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURvd25sb2FkVXJsKHBsYXRmb3JtLCBidWlsZElkLCBiYXNlVXJsID0gJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9jaHJvbWUtZm9yLXRlc3RpbmctcHVibGljJykge1xuICAgIHJldHVybiBgJHtiYXNlVXJsfS8ke3Jlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpLmpvaW4oJy8nKX1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICByZXR1cm4gW2J1aWxkSWQsIGZvbGRlcihwbGF0Zm9ybSksIGBjaHJvbWUtJHtmb2xkZXIocGxhdGZvcm0pfS56aXBgXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUV4ZWN1dGFibGVQYXRoKHBsYXRmb3JtLCBfYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLScgKyBmb2xkZXIocGxhdGZvcm0pLCAnR29vZ2xlIENocm9tZSBmb3IgVGVzdGluZy5hcHAnLCAnQ29udGVudHMnLCAnTWFjT1MnLCAnR29vZ2xlIENocm9tZSBmb3IgVGVzdGluZycpO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2Nocm9tZS1saW51eDY0JywgJ2Nocm9tZScpO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWUtJyArIGZvbGRlcihwbGF0Zm9ybSksICdjaHJvbWUuZXhlJyk7XG4gICAgfVxufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhc3RLbm93bkdvb2RSZWxlYXNlRm9yQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBnZXRKU09OKG5ldyBVUkwoJ2h0dHBzOi8vZ29vZ2xlY2hyb21lbGFicy5naXRodWIuaW8vY2hyb21lLWZvci10ZXN0aW5nL2xhc3Qta25vd24tZ29vZC12ZXJzaW9ucy5qc29uJykpKTtcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgT2JqZWN0LmtleXMoZGF0YS5jaGFubmVscykpIHtcbiAgICAgICAgZGF0YS5jaGFubmVsc1tjaGFubmVsLnRvTG93ZXJDYXNlKCldID0gZGF0YS5jaGFubmVsc1tjaGFubmVsXTtcbiAgICAgICAgZGVsZXRlIGRhdGEuY2hhbm5lbHNbY2hhbm5lbF07XG4gICAgfVxuICAgIHJldHVybiBkYXRhLmNoYW5uZWxzW2NoYW5uZWxdO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhc3RLbm93bkdvb2RSZWxlYXNlRm9yTWlsZXN0b25lKG1pbGVzdG9uZSkge1xuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgZ2V0SlNPTihuZXcgVVJMKCdodHRwczovL2dvb2dsZWNocm9tZWxhYnMuZ2l0aHViLmlvL2Nocm9tZS1mb3ItdGVzdGluZy9sYXRlc3QtdmVyc2lvbnMtcGVyLW1pbGVzdG9uZS5qc29uJykpKTtcbiAgICByZXR1cm4gZGF0YS5taWxlc3RvbmVzW21pbGVzdG9uZV07XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGFzdEtub3duR29vZFJlbGVhc2VGb3JCdWlsZChcbi8qKlxuICogQGV4YW1wbGUgYDExMi4wLjIzYCxcbiAqL1xuYnVpbGRQcmVmaXgpIHtcbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IGdldEpTT04obmV3IFVSTCgnaHR0cHM6Ly9nb29nbGVjaHJvbWVsYWJzLmdpdGh1Yi5pby9jaHJvbWUtZm9yLXRlc3RpbmcvbGF0ZXN0LXBhdGNoLXZlcnNpb25zLXBlci1idWlsZC5qc29uJykpKTtcbiAgICByZXR1cm4gZGF0YS5idWlsZHNbYnVpbGRQcmVmaXhdO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCdWlsZElkKGNoYW5uZWwpIHtcbiAgICBpZiAoT2JqZWN0LnZhbHVlcyhDaHJvbWVSZWxlYXNlQ2hhbm5lbCkuaW5jbHVkZXMoY2hhbm5lbCkpIHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBnZXRMYXN0S25vd25Hb29kUmVsZWFzZUZvckNoYW5uZWwoY2hhbm5lbCkpLnZlcnNpb247XG4gICAgfVxuICAgIGlmIChjaGFubmVsLm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgICAvLyBQb3RlbnRpYWxseSBhIG1pbGVzdG9uZS5cbiAgICAgICAgcmV0dXJuIChhd2FpdCBnZXRMYXN0S25vd25Hb29kUmVsZWFzZUZvck1pbGVzdG9uZShjaGFubmVsKSk/LnZlcnNpb247XG4gICAgfVxuICAgIGlmIChjaGFubmVsLm1hdGNoKC9eXFxkK1xcLlxcZCtcXC5cXGQrJC8pKSB7XG4gICAgICAgIC8vIFBvdGVudGlhbGx5IGEgYnVpbGQgcHJlZml4IHdpdGhvdXQgdGhlIHBhdGNoIHZlcnNpb24uXG4gICAgICAgIHJldHVybiAoYXdhaXQgZ2V0TGFzdEtub3duR29vZFJlbGVhc2VGb3JCdWlsZChjaGFubmVsKSk/LnZlcnNpb247XG4gICAgfVxuICAgIHJldHVybjtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU3lzdGVtRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIGNoYW5uZWwpIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7cHJvY2Vzcy5lbnZbJ1BST0dSQU1GSUxFUyddfVxcXFxHb29nbGVcXFxcQ2hyb21lXFxcXEFwcGxpY2F0aW9uXFxcXGNocm9tZS5leGVgO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuQkVUQTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3Byb2Nlc3MuZW52WydQUk9HUkFNRklMRVMnXX1cXFxcR29vZ2xlXFxcXENocm9tZSBCZXRhXFxcXEFwcGxpY2F0aW9uXFxcXGNocm9tZS5leGVgO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuQ0FOQVJZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7cHJvY2Vzcy5lbnZbJ1BST0dSQU1GSUxFUyddfVxcXFxHb29nbGVcXFxcQ2hyb21lIFN4U1xcXFxBcHBsaWNhdGlvblxcXFxjaHJvbWUuZXhlYDtcbiAgICAgICAgICAgICAgICBjYXNlIENocm9tZVJlbGVhc2VDaGFubmVsLkRFVjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3Byb2Nlc3MuZW52WydQUk9HUkFNRklMRVMnXX1cXFxcR29vZ2xlXFxcXENocm9tZSBEZXZcXFxcQXBwbGljYXRpb25cXFxcY2hyb21lLmV4ZWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvR29vZ2xlIENocm9tZS5hcHAvQ29udGVudHMvTWFjT1MvR29vZ2xlIENocm9tZSc7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvR29vZ2xlIENocm9tZSBCZXRhLmFwcC9Db250ZW50cy9NYWNPUy9Hb29nbGUgQ2hyb21lIEJldGEnO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuQ0FOQVJZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvR29vZ2xlIENocm9tZSBDYW5hcnkuYXBwL0NvbnRlbnRzL01hY09TL0dvb2dsZSBDaHJvbWUgQ2FuYXJ5JztcbiAgICAgICAgICAgICAgICBjYXNlIENocm9tZVJlbGVhc2VDaGFubmVsLkRFVjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcvQXBwbGljYXRpb25zL0dvb2dsZSBDaHJvbWUgRGV2LmFwcC9Db250ZW50cy9NYWNPUy9Hb29nbGUgQ2hyb21lIERldic7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5TVEFCTEU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnL29wdC9nb29nbGUvY2hyb21lL2Nocm9tZSc7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9vcHQvZ29vZ2xlL2Nocm9tZS1iZXRhL2Nocm9tZSc7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnL29wdC9nb29nbGUvY2hyb21lLXVuc3RhYmxlL2Nocm9tZSc7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRldGVjdCBicm93c2VyIGV4ZWN1dGFibGUgcGF0aCBmb3IgJyR7Y2hhbm5lbH0nIG9uICR7cGxhdGZvcm19LmApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhLCBiKSB7XG4gICAgaWYgKCFzZW12ZXIudmFsaWQoYSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWZXJzaW9uICR7YX0gaXMgbm90IGEgdmFsaWQgc2VtdmVyIHZlcnNpb25gKTtcbiAgICB9XG4gICAgaWYgKCFzZW12ZXIudmFsaWQoYikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWZXJzaW9uICR7Yn0gaXMgbm90IGEgdmFsaWQgc2VtdmVyIHZlcnNpb25gKTtcbiAgICB9XG4gICAgaWYgKHNlbXZlci5ndChhLCBiKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VtdmVyLmx0KGEsIGIpKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNocm9tZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBCcm93c2VyUGxhdGZvcm0gfSBmcm9tICcuL3R5cGVzLmpzJztcbmZ1bmN0aW9uIGZvbGRlcihwbGF0Zm9ybSkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gJ2xpbnV4NjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuICdtYWMtYXJtNjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgICAgICByZXR1cm4gJ21hYy14NjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgIHJldHVybiAnd2luMzInO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiAnd2luNjQnO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRVcmwocGxhdGZvcm0sIGJ1aWxkSWQsIGJhc2VVcmwgPSAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Nocm9tZS1mb3ItdGVzdGluZy1wdWJsaWMnKSB7XG4gICAgcmV0dXJuIGAke2Jhc2VVcmx9LyR7cmVzb2x2ZURvd25sb2FkUGF0aChwbGF0Zm9ybSwgYnVpbGRJZCkuam9pbignLycpfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURvd25sb2FkUGF0aChwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgIHJldHVybiBbYnVpbGRJZCwgZm9sZGVyKHBsYXRmb3JtKSwgYGNocm9tZWRyaXZlci0ke2ZvbGRlcihwbGF0Zm9ybSl9LnppcGBdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIF9idWlsZElkKSB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWVkcml2ZXItJyArIGZvbGRlcihwbGF0Zm9ybSksICdjaHJvbWVkcml2ZXInKTtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWVkcml2ZXItbGludXg2NCcsICdjaHJvbWVkcml2ZXInKTtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lOMzI6XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lZHJpdmVyLScgKyBmb2xkZXIocGxhdGZvcm0pLCAnY2hyb21lZHJpdmVyLmV4ZScpO1xuICAgIH1cbn1cbmV4cG9ydCB7IHJlc29sdmVCdWlsZElkLCBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuL2Nocm9tZS5qcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaHJvbWVkcml2ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0VGV4dCB9IGZyb20gJy4uL2h0dHBVdGlsLmpzJztcbmltcG9ydCB7IEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vdHlwZXMuanMnO1xuZnVuY3Rpb24gYXJjaGl2ZShwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gJ2Nocm9tZS1saW51eCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiAnY2hyb21lLW1hYyc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIC8vIFdpbmRvd3MgYXJjaGl2ZSBuYW1lIGNoYW5nZWQgYXQgcjU5MTQ3OS5cbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChidWlsZElkLCAxMCkgPiA1OTE0NzkgPyAnY2hyb21lLXdpbicgOiAnY2hyb21lLXdpbjMyJztcbiAgICB9XG59XG5mdW5jdGlvbiBmb2xkZXIocGxhdGZvcm0pIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuICdMaW51eF94NjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuICdNYWNfQXJtJztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICAgICAgcmV0dXJuICdNYWMnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgIHJldHVybiAnV2luJztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gJ1dpbl94NjQnO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRVcmwocGxhdGZvcm0sIGJ1aWxkSWQsIGJhc2VVcmwgPSAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Nocm9taXVtLWJyb3dzZXItc25hcHNob3RzJykge1xuICAgIHJldHVybiBgJHtiYXNlVXJsfS8ke3Jlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpLmpvaW4oJy8nKX1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICByZXR1cm4gW2ZvbGRlcihwbGF0Zm9ybSksIGJ1aWxkSWQsIGAke2FyY2hpdmUocGxhdGZvcm0sIGJ1aWxkSWQpfS56aXBgXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUV4ZWN1dGFibGVQYXRoKHBsYXRmb3JtLCBfYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLW1hYycsICdDaHJvbWl1bS5hcHAnLCAnQ29udGVudHMnLCAnTWFjT1MnLCAnQ2hyb21pdW0nKTtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWUtbGludXgnLCAnY2hyb21lJyk7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2Nocm9tZS13aW4nLCAnY2hyb21lLmV4ZScpO1xuICAgIH1cbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlQnVpbGRJZChwbGF0Zm9ybSkge1xuICAgIHJldHVybiBhd2FpdCBnZXRUZXh0KG5ldyBVUkwoYGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9jaHJvbWl1bS1icm93c2VyLXNuYXBzaG90cy8ke2ZvbGRlcihwbGF0Zm9ybSl9L0xBU1RfQ0hBTkdFYCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhLCBiKSB7XG4gICAgcmV0dXJuIE51bWJlcihhKSAtIE51bWJlcihiKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNocm9taXVtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBnZXRKU09OIH0gZnJvbSAnLi4vaHR0cFV0aWwuanMnO1xuaW1wb3J0IHsgQnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5mdW5jdGlvbiBhcmNoaXZlTmlnaHRseShwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gYGZpcmVmb3gtJHtidWlsZElkfS5lbi1VUy4ke3BsYXRmb3JtfS14ODZfNjQudGFyLmJ6MmA7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiBgZmlyZWZveC0ke2J1aWxkSWR9LmVuLVVTLm1hYy5kbWdgO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gYGZpcmVmb3gtJHtidWlsZElkfS5lbi1VUy4ke3BsYXRmb3JtfS56aXBgO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFyY2hpdmUocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuIGBmaXJlZm94LSR7YnVpbGRJZH0udGFyLmJ6MmA7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiBgRmlyZWZveCAke2J1aWxkSWR9LmRtZ2A7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiBgRmlyZWZveCBTZXR1cCAke2J1aWxkSWR9LmV4ZWA7XG4gICAgfVxufVxuZnVuY3Rpb24gcGxhdGZvcm1OYW1lKHBsYXRmb3JtKSB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgIHJldHVybiBgbGludXgteDg2XzY0YDtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDX0FSTTpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICAgICAgcmV0dXJuIGBtYWNgO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gcGxhdGZvcm07XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VCdWlsZElkKGJ1aWxkSWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMoRmlyZWZveENoYW5uZWwpKSB7XG4gICAgICAgIGlmIChidWlsZElkLnN0YXJ0c1dpdGgodmFsdWUgKyAnXycpKSB7XG4gICAgICAgICAgICBidWlsZElkID0gYnVpbGRJZC5zdWJzdHJpbmcodmFsdWUubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICByZXR1cm4gW3ZhbHVlLCBidWlsZElkXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBkbyBub3QgaGF2ZSBjaGFubmVsIGFzIHRoZSBwcmVmaXguwqtcbiAgICByZXR1cm4gW0ZpcmVmb3hDaGFubmVsLk5JR0hUTFksIGJ1aWxkSWRdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFVybChwbGF0Zm9ybSwgYnVpbGRJZCwgYmFzZVVybCkge1xuICAgIGNvbnN0IFtjaGFubmVsLCByZXNvbHZlZEJ1aWxkSWRdID0gcGFyc2VCdWlsZElkKGJ1aWxkSWQpO1xuICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLk5JR0hUTFk6XG4gICAgICAgICAgICBiYXNlVXJsID8/PVxuICAgICAgICAgICAgICAgICdodHRwczovL2FyY2hpdmUubW96aWxsYS5vcmcvcHViL2ZpcmVmb3gvbmlnaHRseS9sYXRlc3QtbW96aWxsYS1jZW50cmFsJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkRFVkVESVRJT046XG4gICAgICAgICAgICBiYXNlVXJsID8/PSAnaHR0cHM6Ly9hcmNoaXZlLm1vemlsbGEub3JnL3B1Yi9kZXZlZGl0aW9uL3JlbGVhc2VzJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkJFVEE6XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuU1RBQkxFOlxuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkVTUjpcbiAgICAgICAgICAgIGJhc2VVcmwgPz89ICdodHRwczovL2FyY2hpdmUubW96aWxsYS5vcmcvcHViL2ZpcmVmb3gvcmVsZWFzZXMnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLk5JR0hUTFk6XG4gICAgICAgICAgICByZXR1cm4gYCR7YmFzZVVybH0vJHtyZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCByZXNvbHZlZEJ1aWxkSWQpLmpvaW4oJy8nKX1gO1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkRFVkVESVRJT046XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuQkVUQTpcbiAgICAgICAgY2FzZSBGaXJlZm94Q2hhbm5lbC5TVEFCTEU6XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuRVNSOlxuICAgICAgICAgICAgcmV0dXJuIGAke2Jhc2VVcmx9LyR7cmVzb2x2ZWRCdWlsZElkfS8ke3BsYXRmb3JtTmFtZShwbGF0Zm9ybSl9L2VuLVVTLyR7YXJjaGl2ZShwbGF0Zm9ybSwgcmVzb2x2ZWRCdWlsZElkKX1gO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCBidWlsZElkKSB7XG4gICAgcmV0dXJuIFthcmNoaXZlTmlnaHRseShwbGF0Zm9ybSwgYnVpbGRJZCldO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICBjb25zdCBbY2hhbm5lbF0gPSBwYXJzZUJ1aWxkSWQoYnVpbGRJZCk7XG4gICAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuTklHSFRMWTpcbiAgICAgICAgICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignRmlyZWZveCBOaWdodGx5LmFwcCcsICdDb250ZW50cycsICdNYWNPUycsICdmaXJlZm94Jyk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2ZpcmVmb3gnLCAnZmlyZWZveCcpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdmaXJlZm94JywgJ2ZpcmVmb3guZXhlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuQkVUQTpcbiAgICAgICAgY2FzZSBGaXJlZm94Q2hhbm5lbC5ERVZFRElUSU9OOlxuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkVTUjpcbiAgICAgICAgY2FzZSBGaXJlZm94Q2hhbm5lbC5TVEFCTEU6XG4gICAgICAgICAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDX0FSTTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ0ZpcmVmb3guYXBwJywgJ0NvbnRlbnRzJywgJ01hY09TJywgJ2ZpcmVmb3gnKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignZmlyZWZveCcsICdmaXJlZm94Jyk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lOMzI6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2NvcmUnLCAnZmlyZWZveC5leGUnKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgdmFyIEZpcmVmb3hDaGFubmVsO1xuKGZ1bmN0aW9uIChGaXJlZm94Q2hhbm5lbCkge1xuICAgIEZpcmVmb3hDaGFubmVsW1wiU1RBQkxFXCJdID0gXCJzdGFibGVcIjtcbiAgICBGaXJlZm94Q2hhbm5lbFtcIkVTUlwiXSA9IFwiZXNyXCI7XG4gICAgRmlyZWZveENoYW5uZWxbXCJERVZFRElUSU9OXCJdID0gXCJkZXZlZGl0aW9uXCI7XG4gICAgRmlyZWZveENoYW5uZWxbXCJCRVRBXCJdID0gXCJiZXRhXCI7XG4gICAgRmlyZWZveENoYW5uZWxbXCJOSUdIVExZXCJdID0gXCJuaWdodGx5XCI7XG59KShGaXJlZm94Q2hhbm5lbCB8fCAoRmlyZWZveENoYW5uZWwgPSB7fSkpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCdWlsZElkKGNoYW5uZWwgPSBGaXJlZm94Q2hhbm5lbC5OSUdIVExZKSB7XG4gICAgY29uc3QgY2hhbm5lbFRvVmVyc2lvbktleSA9IHtcbiAgICAgICAgW0ZpcmVmb3hDaGFubmVsLkVTUl06ICdGSVJFRk9YX0VTUicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5TVEFCTEVdOiAnTEFURVNUX0ZJUkVGT1hfVkVSU0lPTicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5ERVZFRElUSU9OXTogJ0ZJUkVGT1hfREVWRURJVElPTicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5CRVRBXTogJ0ZJUkVGT1hfREVWRURJVElPTicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5OSUdIVExZXTogJ0ZJUkVGT1hfTklHSFRMWScsXG4gICAgfTtcbiAgICBjb25zdCB2ZXJzaW9ucyA9IChhd2FpdCBnZXRKU09OKG5ldyBVUkwoJ2h0dHBzOi8vcHJvZHVjdC1kZXRhaWxzLm1vemlsbGEub3JnLzEuMC9maXJlZm94X3ZlcnNpb25zLmpzb24nKSkpO1xuICAgIGNvbnN0IHZlcnNpb24gPSB2ZXJzaW9uc1tjaGFubmVsVG9WZXJzaW9uS2V5W2NoYW5uZWxdXTtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGFubmVsICR7Y2hhbm5lbH0gaXMgbm90IGZvdW5kLmApO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbCArICdfJyArIHZlcnNpb247XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUHJvZmlsZShvcHRpb25zKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG9wdGlvbnMucGF0aCkpIHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIob3B0aW9ucy5wYXRoLCB7XG4gICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhd2FpdCB3cml0ZVByZWZlcmVuY2VzKHtcbiAgICAgICAgcHJlZmVyZW5jZXM6IHtcbiAgICAgICAgICAgIC4uLmRlZmF1bHRQcm9maWxlUHJlZmVyZW5jZXMob3B0aW9ucy5wcmVmZXJlbmNlcyksXG4gICAgICAgICAgICAuLi5vcHRpb25zLnByZWZlcmVuY2VzLFxuICAgICAgICB9LFxuICAgICAgICBwYXRoOiBvcHRpb25zLnBhdGgsXG4gICAgfSk7XG59XG5mdW5jdGlvbiBkZWZhdWx0UHJvZmlsZVByZWZlcmVuY2VzKGV4dHJhUHJlZnMpIHtcbiAgICBjb25zdCBzZXJ2ZXIgPSAnZHVtbXkudGVzdCc7XG4gICAgY29uc3QgZGVmYXVsdFByZWZzID0ge1xuICAgICAgICAvLyBNYWtlIHN1cmUgU2hpZWxkIGRvZXNuJ3QgaGl0IHRoZSBuZXR3b3JrLlxuICAgICAgICAnYXBwLm5vcm1hbmR5LmFwaV91cmwnOiAnJyxcbiAgICAgICAgLy8gRGlzYWJsZSBGaXJlZm94IG9sZCBidWlsZCBiYWNrZ3JvdW5kIGNoZWNrXG4gICAgICAgICdhcHAudXBkYXRlLmNoZWNrSW5zdGFsbFRpbWUnOiBmYWxzZSxcbiAgICAgICAgLy8gRGlzYWJsZSBhdXRvbWF0aWNhbGx5IHVwZ3JhZGluZyBGaXJlZm94XG4gICAgICAgICdhcHAudXBkYXRlLmRpc2FibGVkRm9yVGVzdGluZyc6IHRydWUsXG4gICAgICAgIC8vIEluY3JlYXNlIHRoZSBBUFogY29udGVudCByZXNwb25zZSB0aW1lb3V0IHRvIDEgbWludXRlXG4gICAgICAgICdhcHouY29udGVudF9yZXNwb25zZV90aW1lb3V0JzogNjAwMDAsXG4gICAgICAgIC8vIFByZXZlbnQgdmFyaW91cyBlcnJvciBtZXNzYWdlIG9uIHRoZSBjb25zb2xlXG4gICAgICAgIC8vIGplc3QtcHVwcGV0ZWVyIGFzc2VydHMgdGhhdCBubyBlcnJvciBtZXNzYWdlIGlzIGVtaXR0ZWQgYnkgdGhlIGNvbnNvbGVcbiAgICAgICAgJ2Jyb3dzZXIuY29udGVudGJsb2NraW5nLmZlYXR1cmVzLnN0YW5kYXJkJzogJy10cCx0cFByaXZhdGUsY29va2llQmVoYXZpb3IwLC1jbSwtZnAnLFxuICAgICAgICAvLyBFbmFibGUgdGhlIGR1bXAgZnVuY3Rpb246IHdoaWNoIHNlbmRzIG1lc3NhZ2VzIHRvIHRoZSBzeXN0ZW1cbiAgICAgICAgLy8gY29uc29sZVxuICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTQzMTE1XG4gICAgICAgICdicm93c2VyLmRvbS53aW5kb3cuZHVtcC5lbmFibGVkJzogdHJ1ZSxcbiAgICAgICAgLy8gRGlzYWJsZSB0b3BzdG9yaWVzXG4gICAgICAgICdicm93c2VyLm5ld3RhYnBhZ2UuYWN0aXZpdHktc3RyZWFtLmZlZWRzLnN5c3RlbS50b3BzdG9yaWVzJzogZmFsc2UsXG4gICAgICAgIC8vIEFsd2F5cyBkaXNwbGF5IGEgYmxhbmsgcGFnZVxuICAgICAgICAnYnJvd3Nlci5uZXd0YWJwYWdlLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gQmFja2dyb3VuZCB0aHVtYm5haWxzIGluIHBhcnRpY3VsYXIgY2F1c2UgZ3JpZWY6IGFuZCBkaXNhYmxpbmdcbiAgICAgICAgLy8gdGh1bWJuYWlscyBpbiBnZW5lcmFsIGNhbm5vdCBodXJ0XG4gICAgICAgICdicm93c2VyLnBhZ2V0aHVtYm5haWxzLmNhcHR1cmluZ19kaXNhYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIERpc2FibGUgc2FmZWJyb3dzaW5nIGNvbXBvbmVudHMuXG4gICAgICAgICdicm93c2VyLnNhZmVicm93c2luZy5ibG9ja2VkVVJJcy5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgICdicm93c2VyLnNhZmVicm93c2luZy5kb3dubG9hZHMuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAnYnJvd3Nlci5zYWZlYnJvd3NpbmcubWFsd2FyZS5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgICdicm93c2VyLnNhZmVicm93c2luZy5waGlzaGluZy5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgdXBkYXRlcyB0byBzZWFyY2ggZW5naW5lcy5cbiAgICAgICAgJ2Jyb3dzZXIuc2VhcmNoLnVwZGF0ZSc6IGZhbHNlLFxuICAgICAgICAvLyBEbyBub3QgcmVzdG9yZSB0aGUgbGFzdCBvcGVuIHNldCBvZiB0YWJzIGlmIHRoZSBicm93c2VyIGhhcyBjcmFzaGVkXG4gICAgICAgICdicm93c2VyLnNlc3Npb25zdG9yZS5yZXN1bWVfZnJvbV9jcmFzaCc6IGZhbHNlLFxuICAgICAgICAvLyBTa2lwIGNoZWNrIGZvciBkZWZhdWx0IGJyb3dzZXIgb24gc3RhcnR1cFxuICAgICAgICAnYnJvd3Nlci5zaGVsbC5jaGVja0RlZmF1bHRCcm93c2VyJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgbmV3dGFicGFnZVxuICAgICAgICAnYnJvd3Nlci5zdGFydHVwLmhvbWVwYWdlJzogJ2Fib3V0OmJsYW5rJyxcbiAgICAgICAgLy8gRG8gbm90IHJlZGlyZWN0IHVzZXIgd2hlbiBhIG1pbHN0b25lIHVwZ3JhZGUgb2YgRmlyZWZveCBpcyBkZXRlY3RlZFxuICAgICAgICAnYnJvd3Nlci5zdGFydHVwLmhvbWVwYWdlX292ZXJyaWRlLm1zdG9uZSc6ICdpZ25vcmUnLFxuICAgICAgICAvLyBTdGFydCB3aXRoIGEgYmxhbmsgcGFnZSBhYm91dDpibGFua1xuICAgICAgICAnYnJvd3Nlci5zdGFydHVwLnBhZ2UnOiAwLFxuICAgICAgICAvLyBEbyBub3QgYWxsb3cgYmFja2dyb3VuZCB0YWJzIHRvIGJlIHpvbWJpZmllZCBvbiBBbmRyb2lkOiBvdGhlcndpc2UgZm9yXG4gICAgICAgIC8vIHRlc3RzIHRoYXQgb3BlbiBhZGRpdGlvbmFsIHRhYnM6IHRoZSB0ZXN0IGhhcm5lc3MgdGFiIGl0c2VsZiBtaWdodCBnZXRcbiAgICAgICAgLy8gdW5sb2FkZWRcbiAgICAgICAgJ2Jyb3dzZXIudGFicy5kaXNhYmxlQmFja2dyb3VuZFpvbWJpZmljYXRpb24nOiBmYWxzZSxcbiAgICAgICAgLy8gRG8gbm90IHdhcm4gd2hlbiBjbG9zaW5nIGFsbCBvdGhlciBvcGVuIHRhYnNcbiAgICAgICAgJ2Jyb3dzZXIudGFicy53YXJuT25DbG9zZU90aGVyVGFicyc6IGZhbHNlLFxuICAgICAgICAvLyBEbyBub3Qgd2FybiB3aGVuIG11bHRpcGxlIHRhYnMgd2lsbCBiZSBvcGVuZWRcbiAgICAgICAgJ2Jyb3dzZXIudGFicy53YXJuT25PcGVuJzogZmFsc2UsXG4gICAgICAgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IG9mZmVyIHRyYW5zbGF0aW9ucywgYXMgdGVzdHMgZG8gbm90IGV4cGVjdCB0aGlzLlxuICAgICAgICAnYnJvd3Nlci50cmFuc2xhdGlvbnMuYXV0b21hdGljYWxseVBvcHVwJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgdGhlIFVJIHRvdXIuXG4gICAgICAgICdicm93c2VyLnVpdG91ci5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIFR1cm4gb2ZmIHNlYXJjaCBzdWdnZXN0aW9ucyBpbiB0aGUgbG9jYXRpb24gYmFyIHNvIGFzIG5vdCB0byB0cmlnZ2VyXG4gICAgICAgIC8vIG5ldHdvcmsgY29ubmVjdGlvbnMuXG4gICAgICAgICdicm93c2VyLnVybGJhci5zdWdnZXN0LnNlYXJjaGVzJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgZmlyc3QgcnVuIHNwbGFzaCBwYWdlIG9uIFdpbmRvd3MgMTBcbiAgICAgICAgJ2Jyb3dzZXIudXNlZE9uV2luZG93czEwLmludHJvVVJMJzogJycsXG4gICAgICAgIC8vIERvIG5vdCB3YXJuIG9uIHF1aXR0aW5nIEZpcmVmb3hcbiAgICAgICAgJ2Jyb3dzZXIud2Fybk9uUXVpdCc6IGZhbHNlLFxuICAgICAgICAvLyBEZWZlbnNpdmVseSBkaXNhYmxlIGRhdGEgcmVwb3J0aW5nIHN5c3RlbXNcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcuaGVhbHRocmVwb3J0LmRvY3VtZW50U2VydmVyVVJJJzogYGh0dHA6Ly8ke3NlcnZlcn0vZHVtbXkvaGVhbHRocmVwb3J0L2AsXG4gICAgICAgICdkYXRhcmVwb3J0aW5nLmhlYWx0aHJlcG9ydC5sb2dnaW5nLmNvbnNvbGVFbmFibGVkJzogZmFsc2UsXG4gICAgICAgICdkYXRhcmVwb3J0aW5nLmhlYWx0aHJlcG9ydC5zZXJ2aWNlLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcuaGVhbHRocmVwb3J0LnNlcnZpY2UuZmlyc3RSdW4nOiBmYWxzZSxcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcuaGVhbHRocmVwb3J0LnVwbG9hZEVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gRG8gbm90IHNob3cgZGF0YXJlcG9ydGluZyBwb2xpY3kgbm90aWZpY2F0aW9ucyB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggdGVzdHNcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcucG9saWN5LmRhdGFTdWJtaXNzaW9uRW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAnZGF0YXJlcG9ydGluZy5wb2xpY3kuZGF0YVN1Ym1pc3Npb25Qb2xpY3lCeXBhc3NOb3RpZmljYXRpb24nOiB0cnVlLFxuICAgICAgICAvLyBEZXZUb29scyBKU09OVmlld2VyIHNvbWV0aW1lcyBmYWlscyB0byBsb2FkIGRlcGVuZGVuY2llcyB3aXRoIGl0cyByZXF1aXJlLmpzLlxuICAgICAgICAvLyBUaGlzIGRvZXNuJ3QgYWZmZWN0IFB1cHBldGVlciBidXQgc3BhbXMgY29uc29sZSAoQnVnIDE0MjQzNzIpXG4gICAgICAgICdkZXZ0b29scy5qc29udmlldy5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgcG9wdXAtYmxvY2tlclxuICAgICAgICAnZG9tLmRpc2FibGVfb3Blbl9kdXJpbmdfbG9hZCc6IGZhbHNlLFxuICAgICAgICAvLyBFbmFibGUgdGhlIHN1cHBvcnQgZm9yIEZpbGUgb2JqZWN0IGNyZWF0aW9uIGluIHRoZSBjb250ZW50IHByb2Nlc3NcbiAgICAgICAgLy8gUmVxdWlyZWQgZm9yIHxQYWdlLnNldEZpbGVJbnB1dEZpbGVzfCBwcm90b2NvbCBtZXRob2QuXG4gICAgICAgICdkb20uZmlsZS5jcmVhdGVJbkNoaWxkJzogdHJ1ZSxcbiAgICAgICAgLy8gRGlzYWJsZSB0aGUgUHJvY2Vzc0hhbmdNb25pdG9yXG4gICAgICAgICdkb20uaXBjLnJlcG9ydFByb2Nlc3NIYW5ncyc6IGZhbHNlLFxuICAgICAgICAvLyBEaXNhYmxlIHNsb3cgc2NyaXB0IGRpYWxvZ3Vlc1xuICAgICAgICAnZG9tLm1heF9jaHJvbWVfc2NyaXB0X3J1bl90aW1lJzogMCxcbiAgICAgICAgJ2RvbS5tYXhfc2NyaXB0X3J1bl90aW1lJzogMCxcbiAgICAgICAgLy8gT25seSBsb2FkIGV4dGVuc2lvbnMgZnJvbSB0aGUgYXBwbGljYXRpb24gYW5kIHVzZXIgcHJvZmlsZVxuICAgICAgICAvLyBBZGRvbk1hbmFnZXIuU0NPUEVfUFJPRklMRSArIEFkZG9uTWFuYWdlci5TQ09QRV9BUFBMSUNBVElPTlxuICAgICAgICAnZXh0ZW5zaW9ucy5hdXRvRGlzYWJsZVNjb3Blcyc6IDAsXG4gICAgICAgICdleHRlbnNpb25zLmVuYWJsZWRTY29wZXMnOiA1LFxuICAgICAgICAvLyBEaXNhYmxlIG1ldGFkYXRhIGNhY2hpbmcgZm9yIGluc3RhbGxlZCBhZGQtb25zIGJ5IGRlZmF1bHRcbiAgICAgICAgJ2V4dGVuc2lvbnMuZ2V0QWRkb25zLmNhY2hlLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gRGlzYWJsZSBpbnN0YWxsaW5nIGFueSBkaXN0cmlidXRpb24gZXh0ZW5zaW9ucyBvciBhZGQtb25zLlxuICAgICAgICAnZXh0ZW5zaW9ucy5pbnN0YWxsRGlzdHJvQWRkb25zJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGVkIHNjcmVlbnNob3RzIGV4dGVuc2lvblxuICAgICAgICAnZXh0ZW5zaW9ucy5zY3JlZW5zaG90cy5kaXNhYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIFR1cm4gb2ZmIGV4dGVuc2lvbiB1cGRhdGVzIHNvIHRoZXkgZG8gbm90IGJvdGhlciB0ZXN0c1xuICAgICAgICAnZXh0ZW5zaW9ucy51cGRhdGUuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBUdXJuIG9mZiBleHRlbnNpb24gdXBkYXRlcyBzbyB0aGV5IGRvIG5vdCBib3RoZXIgdGVzdHNcbiAgICAgICAgJ2V4dGVuc2lvbnMudXBkYXRlLm5vdGlmeVVzZXInOiBmYWxzZSxcbiAgICAgICAgLy8gTWFrZSBzdXJlIG9wZW5pbmcgYWJvdXQ6YWRkb25zIHdpbGwgbm90IGhpdCB0aGUgbmV0d29ya1xuICAgICAgICAnZXh0ZW5zaW9ucy53ZWJzZXJ2aWNlLmRpc2NvdmVyVVJMJzogYGh0dHA6Ly8ke3NlcnZlcn0vZHVtbXkvZGlzY292ZXJ5VVJMYCxcbiAgICAgICAgLy8gQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGhhdmUgZm9jdXMgZXZlbiBpdCBydW5zIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICdmb2N1c21hbmFnZXIudGVzdG1vZGUnOiB0cnVlLFxuICAgICAgICAvLyBEaXNhYmxlIHVzZXJhZ2VudCB1cGRhdGVzXG4gICAgICAgICdnZW5lcmFsLnVzZXJhZ2VudC51cGRhdGVzLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gQWx3YXlzIHVzZSBuZXR3b3JrIHByb3ZpZGVyIGZvciBnZW9sb2NhdGlvbiB0ZXN0cyBzbyB3ZSBieXBhc3MgdGhlXG4gICAgICAgIC8vIG1hY09TIGRpYWxvZyByYWlzZWQgYnkgdGhlIGNvcmVsb2NhdGlvbiBwcm92aWRlclxuICAgICAgICAnZ2VvLnByb3ZpZGVyLnRlc3RpbmcnOiB0cnVlLFxuICAgICAgICAvLyBEbyBub3Qgc2NhbiBXaWZpXG4gICAgICAgICdnZW8ud2lmaS5zY2FuJzogZmFsc2UsXG4gICAgICAgIC8vIE5vIGhhbmcgbW9uaXRvclxuICAgICAgICAnaGFuZ21vbml0b3IudGltZW91dCc6IDAsXG4gICAgICAgIC8vIFNob3cgY2hyb21lIGVycm9ycyBhbmQgd2FybmluZ3MgaW4gdGhlIGVycm9yIGNvbnNvbGVcbiAgICAgICAgJ2phdmFzY3JpcHQub3B0aW9ucy5zaG93SW5Db25zb2xlJzogdHJ1ZSxcbiAgICAgICAgLy8gRGlzYWJsZSBkb3dubG9hZCBhbmQgdXNhZ2Ugb2YgT3BlbkgyNjQ6IGFuZCBXaWRldmluZSBwbHVnaW5zXG4gICAgICAgICdtZWRpYS5nbXAtbWFuYWdlci51cGRhdGVFbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgdGhlIEdGWCBzYW5pdHkgd2luZG93XG4gICAgICAgICdtZWRpYS5zYW5pdHktdGVzdC5kaXNhYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIERpc2FibGUgZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBOaWdodGx5XG4gICAgICAgICduZXR3b3JrLmNvb2tpZS5zYW1lU2l0ZS5sYXhCeURlZmF1bHQnOiBmYWxzZSxcbiAgICAgICAgLy8gRG8gbm90IHByb21wdCBmb3IgdGVtcG9yYXJ5IHJlZGlyZWN0c1xuICAgICAgICAnbmV0d29yay5odHRwLnByb21wdC10ZW1wLXJlZGlyZWN0JzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgc3BlY3VsYXRpdmUgY29ubmVjdGlvbnMgc28gdGhleSBhcmUgbm90IHJlcG9ydGVkIGFzIGxlYWtpbmdcbiAgICAgICAgLy8gd2hlbiB0aGV5IGFyZSBoYW5naW5nIGFyb3VuZFxuICAgICAgICAnbmV0d29yay5odHRwLnNwZWN1bGF0aXZlLXBhcmFsbGVsLWxpbWl0JzogMCxcbiAgICAgICAgLy8gRG8gbm90IGF1dG9tYXRpY2FsbHkgc3dpdGNoIGJldHdlZW4gb2ZmbGluZSBhbmQgb25saW5lXG4gICAgICAgICduZXR3b3JrLm1hbmFnZS1vZmZsaW5lLXN0YXR1cyc6IGZhbHNlLFxuICAgICAgICAvLyBNYWtlIHN1cmUgU05UUCByZXF1ZXN0cyBkbyBub3QgaGl0IHRoZSBuZXR3b3JrXG4gICAgICAgICduZXR3b3JrLnNudHAucG9vbHMnOiBzZXJ2ZXIsXG4gICAgICAgIC8vIERpc2FibGUgRmxhc2guXG4gICAgICAgICdwbHVnaW4uc3RhdGUuZmxhc2gnOiAwLFxuICAgICAgICAncHJpdmFjeS50cmFja2luZ3Byb3RlY3Rpb24uZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBDYW4gYmUgcmVtb3ZlZCBvbmNlIEZpcmVmb3ggODkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzEwODM5XG4gICAgICAgICdyZW1vdGUuZW5hYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIERvbid0IGRvIG5ldHdvcmsgY29ubmVjdGlvbnMgZm9yIG1pdG0gcHJpbWluZ1xuICAgICAgICAnc2VjdXJpdHkuY2VydGVycm9ycy5taXRtLnByaW1pbmcuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBMb2NhbCBkb2N1bWVudHMgaGF2ZSBhY2Nlc3MgdG8gYWxsIG90aGVyIGxvY2FsIGRvY3VtZW50cyxcbiAgICAgICAgLy8gaW5jbHVkaW5nIGRpcmVjdG9yeSBsaXN0aW5nc1xuICAgICAgICAnc2VjdXJpdHkuZmlsZXVyaS5zdHJpY3Rfb3JpZ2luX3BvbGljeSc6IGZhbHNlLFxuICAgICAgICAvLyBEbyBub3Qgd2FpdCBmb3IgdGhlIG5vdGlmaWNhdGlvbiBidXR0b24gc2VjdXJpdHkgZGVsYXlcbiAgICAgICAgJ3NlY3VyaXR5Lm5vdGlmaWNhdGlvbl9lbmFibGVfZGVsYXknOiAwLFxuICAgICAgICAvLyBFbnN1cmUgYmxvY2tsaXN0IHVwZGF0ZXMgZG8gbm90IGhpdCB0aGUgbmV0d29ya1xuICAgICAgICAnc2VydmljZXMuc2V0dGluZ3Muc2VydmVyJzogYGh0dHA6Ly8ke3NlcnZlcn0vZHVtbXkvYmxvY2tsaXN0L2AsXG4gICAgICAgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IGZpbGwgc2lnbi1pbiBmb3JtcyB3aXRoIGtub3duIHVzZXJuYW1lcyBhbmRcbiAgICAgICAgLy8gcGFzc3dvcmRzXG4gICAgICAgICdzaWdub24uYXV0b2ZpbGxGb3Jtcyc6IGZhbHNlLFxuICAgICAgICAvLyBEaXNhYmxlIHBhc3N3b3JkIGNhcHR1cmUsIHNvIHRoYXQgdGVzdHMgdGhhdCBpbmNsdWRlIGZvcm1zIGFyZSBub3RcbiAgICAgICAgLy8gaW5mbHVlbmNlZCBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIHBlcnNpc3RlbnQgZG9vcmhhbmdlciBub3RpZmljYXRpb25cbiAgICAgICAgJ3NpZ25vbi5yZW1lbWJlclNpZ25vbnMnOiBmYWxzZSxcbiAgICAgICAgLy8gRGlzYWJsZSBmaXJzdC1ydW4gd2VsY29tZSBwYWdlXG4gICAgICAgICdzdGFydHVwLmhvbWVwYWdlX3dlbGNvbWVfdXJsJzogJ2Fib3V0OmJsYW5rJyxcbiAgICAgICAgLy8gRGlzYWJsZSBmaXJzdC1ydW4gd2VsY29tZSBwYWdlXG4gICAgICAgICdzdGFydHVwLmhvbWVwYWdlX3dlbGNvbWVfdXJsLmFkZGl0aW9uYWwnOiAnJyxcbiAgICAgICAgLy8gRGlzYWJsZSBicm93c2VyIGFuaW1hdGlvbnMgKHRhYnMsIGZ1bGxzY3JlZW4sIHNsaWRpbmcgYWxlcnRzKVxuICAgICAgICAndG9vbGtpdC5jb3NtZXRpY0FuaW1hdGlvbnMuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBQcmV2ZW50IHN0YXJ0aW5nIGludG8gc2FmZSBtb2RlIGFmdGVyIGFwcGxpY2F0aW9uIGNyYXNoZXNcbiAgICAgICAgJ3Rvb2xraXQuc3RhcnR1cC5tYXhfcmVzdW1lZF9jcmFzaGVzJzogLTEsXG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihkZWZhdWx0UHJlZnMsIGV4dHJhUHJlZnMpO1xufVxuLyoqXG4gKiBQb3B1bGF0ZXMgdGhlIHVzZXIuanMgZmlsZSB3aXRoIGN1c3RvbSBwcmVmZXJlbmNlcyBhcyBuZWVkZWQgdG8gYWxsb3dcbiAqIEZpcmVmb3gncyBDRFAgc3VwcG9ydCB0byBwcm9wZXJseSBmdW5jdGlvbi4gVGhlc2UgcHJlZmVyZW5jZXMgd2lsbCBiZVxuICogYXV0b21hdGljYWxseSBjb3BpZWQgb3ZlciB0byBwcmVmcy5qcyBkdXJpbmcgc3RhcnR1cCBvZiBGaXJlZm94LiBUbyBiZVxuICogYWJsZSB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZXMgb2YgcHJlZmVyZW5jZXMgYSBiYWNrdXAgb2YgcHJlZnMuanNcbiAqIHdpbGwgYmUgY3JlYXRlZC5cbiAqXG4gKiBAcGFyYW0gcHJlZnMgLSBMaXN0IG9mIHByZWZlcmVuY2VzIHRvIGFkZC5cbiAqIEBwYXJhbSBwcm9maWxlUGF0aCAtIEZpcmVmb3ggcHJvZmlsZSB0byB3cml0ZSB0aGUgcHJlZmVyZW5jZXMgdG8uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUHJlZmVyZW5jZXMob3B0aW9ucykge1xuICAgIGNvbnN0IHByZWZzUGF0aCA9IHBhdGguam9pbihvcHRpb25zLnBhdGgsICdwcmVmcy5qcycpO1xuICAgIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucy5wcmVmZXJlbmNlcykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgcmV0dXJuIGB1c2VyX3ByZWYoJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9KTtgO1xuICAgIH0pO1xuICAgIC8vIFVzZSBhbGxTZXR0bGVkIHRvIHByZXZlbnQgY29ycnVwdGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ob3B0aW9ucy5wYXRoLCAndXNlci5qcycpLCBsaW5lcy5qb2luKCdcXG4nKSksXG4gICAgICAgIC8vIENyZWF0ZSBhIGJhY2t1cCBvZiB0aGUgcHJlZmVyZW5jZXMgZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXRzdHMuXG4gICAgICAgIGZzLnByb21pc2VzLmFjY2VzcyhwcmVmc1BhdGgsIGZzLmNvbnN0YW50cy5GX09LKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLmNvcHlGaWxlKHByZWZzUGF0aCwgcGF0aC5qb2luKG9wdGlvbnMucGF0aCwgJ3ByZWZzLmpzLnB1cHBldGVlcicpKTtcbiAgICAgICAgfSwgXG4gICAgICAgIC8vIFN3YWxsb3cgb25seSBpZiBmaWxlIGRvZXMgbm90IGV4aXN0XG4gICAgICAgICgpID0+IHsgfSksXG4gICAgXSk7XG4gICAgZm9yIChjb25zdCBjb21tYW5kIG9mIHJlc3VsdCkge1xuICAgICAgICBpZiAoY29tbWFuZC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIHRocm93IGNvbW1hbmQucmVhc29uO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhLCBiKSB7XG4gICAgLy8gVE9ETzogdGhpcyBpcyBhIG5vdCB2ZXJ5IHJlbGlhYmxlIGNoZWNrLlxuICAgIHJldHVybiBwYXJzZUludChhLnJlcGxhY2UoJy4nLCAnJyksIDE2KSAtIHBhcnNlSW50KGIucmVwbGFjZSgnLicsICcnKSwgMTYpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlyZWZveC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBTdXBwb3J0ZWQgYnJvd3NlcnMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIEJyb3dzZXI7XG4oZnVuY3Rpb24gKEJyb3dzZXIpIHtcbiAgICBCcm93c2VyW1wiQ0hST01FXCJdID0gXCJjaHJvbWVcIjtcbiAgICBCcm93c2VyW1wiQ0hST01FSEVBRExFU1NTSEVMTFwiXSA9IFwiY2hyb21lLWhlYWRsZXNzLXNoZWxsXCI7XG4gICAgQnJvd3NlcltcIkNIUk9NSVVNXCJdID0gXCJjaHJvbWl1bVwiO1xuICAgIEJyb3dzZXJbXCJGSVJFRk9YXCJdID0gXCJmaXJlZm94XCI7XG4gICAgQnJvd3NlcltcIkNIUk9NRURSSVZFUlwiXSA9IFwiY2hyb21lZHJpdmVyXCI7XG59KShCcm93c2VyIHx8IChCcm93c2VyID0ge30pKTtcbi8qKlxuICogUGxhdGZvcm0gbmFtZXMgdXNlZCB0byBpZGVudGlmeSBhIE9TIHBsYXRmb3JtIHggYXJjaGl0ZWN0dXJlIGNvbWJpbmF0aW9uIGluIHRoZSB3YXlcbiAqIHRoYXQgaXMgcmVsZXZhbnQgZm9yIHRoZSBicm93c2VyIGRvd25sb2FkLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBCcm93c2VyUGxhdGZvcm07XG4oZnVuY3Rpb24gKEJyb3dzZXJQbGF0Zm9ybSkge1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIkxJTlVYXCJdID0gXCJsaW51eFwiO1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIk1BQ1wiXSA9IFwibWFjXCI7XG4gICAgQnJvd3NlclBsYXRmb3JtW1wiTUFDX0FSTVwiXSA9IFwibWFjX2FybVwiO1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIldJTjMyXCJdID0gXCJ3aW4zMlwiO1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIldJTjY0XCJdID0gXCJ3aW42NFwiO1xufSkoQnJvd3NlclBsYXRmb3JtIHx8IChCcm93c2VyUGxhdGZvcm0gPSB7fSkpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgQnJvd3NlclRhZztcbihmdW5jdGlvbiAoQnJvd3NlclRhZykge1xuICAgIEJyb3dzZXJUYWdbXCJDQU5BUllcIl0gPSBcImNhbmFyeVwiO1xuICAgIEJyb3dzZXJUYWdbXCJOSUdIVExZXCJdID0gXCJuaWdodGx5XCI7XG4gICAgQnJvd3NlclRhZ1tcIkJFVEFcIl0gPSBcImJldGFcIjtcbiAgICBCcm93c2VyVGFnW1wiREVWXCJdID0gXCJkZXZcIjtcbiAgICBCcm93c2VyVGFnW1wiREVWRURJVElPTlwiXSA9IFwiZGV2ZWRpdGlvblwiO1xuICAgIEJyb3dzZXJUYWdbXCJTVEFCTEVcIl0gPSBcInN0YWJsZVwiO1xuICAgIEJyb3dzZXJUYWdbXCJFU1JcIl0gPSBcImVzclwiO1xuICAgIEJyb3dzZXJUYWdbXCJMQVRFU1RcIl0gPSBcImxhdGVzdFwiO1xufSkoQnJvd3NlclRhZyB8fCAoQnJvd3NlclRhZyA9IHt9KSk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBDaHJvbWVSZWxlYXNlQ2hhbm5lbDtcbihmdW5jdGlvbiAoQ2hyb21lUmVsZWFzZUNoYW5uZWwpIHtcbiAgICBDaHJvbWVSZWxlYXNlQ2hhbm5lbFtcIlNUQUJMRVwiXSA9IFwic3RhYmxlXCI7XG4gICAgQ2hyb21lUmVsZWFzZUNoYW5uZWxbXCJERVZcIl0gPSBcImRldlwiO1xuICAgIENocm9tZVJlbGVhc2VDaGFubmVsW1wiQ0FOQVJZXCJdID0gXCJjYW5hcnlcIjtcbiAgICBDaHJvbWVSZWxlYXNlQ2hhbm5lbFtcIkJFVEFcIl0gPSBcImJldGFcIjtcbn0pKENocm9tZVJlbGVhc2VDaGFubmVsIHx8IChDaHJvbWVSZWxlYXNlQ2hhbm5lbCA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmV4cG9ydCB7IGRlYnVnIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWJ1Zy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCB7IEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEJyb3dzZXJQbGF0Zm9ybSgpIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IG9zLnBsYXRmb3JtKCk7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlICdkYXJ3aW4nOlxuICAgICAgICAgICAgcmV0dXJuIG9zLmFyY2goKSA9PT0gJ2FybTY0J1xuICAgICAgICAgICAgICAgID8gQnJvd3NlclBsYXRmb3JtLk1BQ19BUk1cbiAgICAgICAgICAgICAgICA6IEJyb3dzZXJQbGF0Zm9ybS5NQUM7XG4gICAgICAgIGNhc2UgJ2xpbnV4JzpcbiAgICAgICAgICAgIHJldHVybiBCcm93c2VyUGxhdGZvcm0uTElOVVg7XG4gICAgICAgIGNhc2UgJ3dpbjMyJzpcbiAgICAgICAgICAgIHJldHVybiBvcy5hcmNoKCkgPT09ICd4NjQnIHx8XG4gICAgICAgICAgICAgICAgLy8gV2luZG93cyAxMSBmb3IgQVJNIHN1cHBvcnRzIHg2NCBlbXVsYXRpb25cbiAgICAgICAgICAgICAgICAob3MuYXJjaCgpID09PSAnYXJtNjQnICYmIGlzV2luZG93czExKG9zLnJlbGVhc2UoKSkpXG4gICAgICAgICAgICAgICAgPyBCcm93c2VyUGxhdGZvcm0uV0lONjRcbiAgICAgICAgICAgICAgICA6IEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLyoqXG4gKiBXaW5kb3dzIDExIGlzIGlkZW50aWZpZWQgYnkgdGhlIHZlcnNpb24gMTAuMC4yMjAwMCBvciBncmVhdGVyXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gaXNXaW5kb3dzMTEodmVyc2lvbikge1xuICAgIGNvbnN0IHBhcnRzID0gdmVyc2lvbi5zcGxpdCgnLicpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgIGNvbnN0IG1ham9yID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcbiAgICAgICAgY29uc3QgbWlub3IgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApO1xuICAgICAgICBjb25zdCBwYXRjaCA9IHBhcnNlSW50KHBhcnRzWzJdLCAxMCk7XG4gICAgICAgIHJldHVybiAobWFqb3IgPiAxMCB8fFxuICAgICAgICAgICAgKG1ham9yID09PSAxMCAmJiBtaW5vciA+IDApIHx8XG4gICAgICAgICAgICAobWFqb3IgPT09IDEwICYmIG1pbm9yID09PSAwICYmIHBhdGNoID49IDIyMDAwKSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRldGVjdFBsYXRmb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBleGVjIGFzIGV4ZWNDaGlsZFByb2Nlc3MsIHNwYXduU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyIH0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IGV4dHJhY3RaaXAgZnJvbSAnZXh0cmFjdC16aXAnO1xuaW1wb3J0IHRhciBmcm9tICd0YXItZnMnO1xuaW1wb3J0IGJ6aXAgZnJvbSAndW5iemlwMi1zdHJlYW0nO1xuY29uc3QgZXhlYyA9IHByb21pc2lmeShleGVjQ2hpbGRQcm9jZXNzKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bnBhY2tBcmNoaXZlKGFyY2hpdmVQYXRoLCBmb2xkZXJQYXRoKSB7XG4gICAgaWYgKGFyY2hpdmVQYXRoLmVuZHNXaXRoKCcuemlwJykpIHtcbiAgICAgICAgYXdhaXQgZXh0cmFjdFppcChhcmNoaXZlUGF0aCwgeyBkaXI6IGZvbGRlclBhdGggfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyY2hpdmVQYXRoLmVuZHNXaXRoKCcudGFyLmJ6MicpKSB7XG4gICAgICAgIGF3YWl0IGV4dHJhY3RUYXIoYXJjaGl2ZVBhdGgsIGZvbGRlclBhdGgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmNoaXZlUGF0aC5lbmRzV2l0aCgnLmRtZycpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGZvbGRlclBhdGgpO1xuICAgICAgICBhd2FpdCBpbnN0YWxsRE1HKGFyY2hpdmVQYXRoLCBmb2xkZXJQYXRoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJjaGl2ZVBhdGguZW5kc1dpdGgoJy5leGUnKSkge1xuICAgICAgICAvLyBGaXJlZm94IG9uIFdpbmRvd3MuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhhcmNoaXZlUGF0aCwgW2AvRXh0cmFjdERpcj0ke2ZvbGRlclBhdGh9YF0sIHtcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgIF9fY29tcGF0X2xheWVyOiAnUnVuQXNJbnZva2VyJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCAke2FyY2hpdmVQYXRofSB0byAke2ZvbGRlclBhdGh9OiAke3Jlc3VsdC5vdXRwdXR9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgYXJjaGl2ZSBmb3JtYXQ6ICR7YXJjaGl2ZVBhdGh9YCk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFRhcih0YXJQYXRoLCBmb2xkZXJQYXRoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChmdWxmaWxsLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdGFyU3RyZWFtID0gdGFyLmV4dHJhY3QoZm9sZGVyUGF0aCk7XG4gICAgICAgIHRhclN0cmVhbS5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgICB0YXJTdHJlYW0ub24oJ2ZpbmlzaCcsIGZ1bGZpbGwpO1xuICAgICAgICBjb25zdCByZWFkU3RyZWFtID0gY3JlYXRlUmVhZFN0cmVhbSh0YXJQYXRoKTtcbiAgICAgICAgcmVhZFN0cmVhbS5waXBlKGJ6aXAoKSkucGlwZSh0YXJTdHJlYW0pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbERNRyhkbWdQYXRoLCBmb2xkZXJQYXRoKSB7XG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWMoYGhkaXV0aWwgYXR0YWNoIC1ub2Jyb3dzZSAtbm9hdXRvb3BlbiBcIiR7ZG1nUGF0aH1cImApO1xuICAgIGNvbnN0IHZvbHVtZXMgPSBzdGRvdXQubWF0Y2goL1xcL1ZvbHVtZXNcXC8oLiopL20pO1xuICAgIGlmICghdm9sdW1lcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHZvbHVtZSBwYXRoIGluICR7c3Rkb3V0fWApO1xuICAgIH1cbiAgICBjb25zdCBtb3VudFBhdGggPSB2b2x1bWVzWzBdO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIobW91bnRQYXRoKTtcbiAgICAgICAgY29uc3QgYXBwTmFtZSA9IGZpbGVOYW1lcy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyAmJiBpdGVtLmVuZHNXaXRoKCcuYXBwJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWFwcE5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgYXBwIGluICR7bW91bnRQYXRofWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vdW50ZWRQYXRoID0gcGF0aC5qb2luKG1vdW50UGF0aCwgYXBwTmFtZSk7XG4gICAgICAgIGF3YWl0IGV4ZWMoYGNwIC1SIFwiJHttb3VudGVkUGF0aH1cIiBcIiR7Zm9sZGVyUGF0aH1cImApO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgZXhlYyhgaGRpdXRpbCBkZXRhY2ggXCIke21vdW50UGF0aH1cIiAtcXVpZXRgKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxlVXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgY3JlYXRlV3JpdGVTdHJlYW0gfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IHsgVVJMLCB1cmxUb0h0dHBPcHRpb25zIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IFByb3h5QWdlbnQgfSBmcm9tICdwcm94eS1hZ2VudCc7XG5leHBvcnQgZnVuY3Rpb24gaGVhZEh0dHBSZXF1ZXN0KHVybCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGh0dHBSZXF1ZXN0KHVybCwgJ0hFQUQnLCByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAvLyBjb25zdW1lIHJlc3BvbnNlIGRhdGEgZnJlZSBub2RlIHByb2Nlc3NcbiAgICAgICAgICAgIHJlc3BvbnNlLnJlc3VtZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5zdGF0dXNDb2RlID09PSAyMDApO1xuICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgIHJlcXVlc3Qub24oJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgbWV0aG9kLCByZXNwb25zZSwga2VlcEFsaXZlID0gdHJ1ZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHByb3RvY29sOiB1cmwucHJvdG9jb2wsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIHBvcnQ6IHVybC5wb3J0LFxuICAgICAgICBwYXRoOiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGtlZXBBbGl2ZSA/IHsgQ29ubmVjdGlvbjogJ2tlZXAtYWxpdmUnIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIGF1dGg6IHVybFRvSHR0cE9wdGlvbnModXJsKS5hdXRoLFxuICAgICAgICBhZ2VudDogbmV3IFByb3h5QWdlbnQoKSxcbiAgICB9O1xuICAgIGNvbnN0IHJlcXVlc3RDYWxsYmFjayA9IChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlICYmXG4gICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA+PSAzMDAgJiZcbiAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlIDwgNDAwICYmXG4gICAgICAgICAgICByZXMuaGVhZGVycy5sb2NhdGlvbikge1xuICAgICAgICAgICAgaHR0cFJlcXVlc3QobmV3IFVSTChyZXMuaGVhZGVycy5sb2NhdGlvbiksIG1ldGhvZCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgLy8gY29uc3VtZSByZXNwb25zZSBkYXRhIHRvIGZyZWUgdXAgbWVtb3J5XG4gICAgICAgICAgICAvLyBBbmQgcHJldmVudHMgdGhlIGNvbm5lY3Rpb24gZnJvbSBiZWluZyBrZXB0IGFsaXZlXG4gICAgICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZShyZXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCByZXF1ZXN0ID0gb3B0aW9ucy5wcm90b2NvbCA9PT0gJ2h0dHBzOidcbiAgICAgICAgPyBodHRwcy5yZXF1ZXN0KG9wdGlvbnMsIHJlcXVlc3RDYWxsYmFjaylcbiAgICAgICAgOiBodHRwLnJlcXVlc3Qob3B0aW9ucywgcmVxdWVzdENhbGxiYWNrKTtcbiAgICByZXF1ZXN0LmVuZCgpO1xuICAgIHJldHVybiByZXF1ZXN0O1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkRmlsZSh1cmwsIGRlc3RpbmF0aW9uUGF0aCwgcHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBkb3dubG9hZGVkQnl0ZXMgPSAwO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGZ1bmN0aW9uIG9uRGF0YShjaHVuaykge1xuICAgICAgICAgICAgZG93bmxvYWRlZEJ5dGVzICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIHByb2dyZXNzQ2FsbGJhY2soZG93bmxvYWRlZEJ5dGVzLCB0b3RhbEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gaHR0cFJlcXVlc3QodXJsLCAnR0VUJywgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBEb3dubG9hZCBmYWlsZWQ6IHNlcnZlciByZXR1cm5lZCBjb2RlICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX0uIFVSTDogJHt1cmx9YCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3VtZSByZXNwb25zZSBkYXRhIHRvIGZyZWUgdXAgbWVtb3J5XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gY3JlYXRlV3JpdGVTdHJlYW0oZGVzdGluYXRpb25QYXRoKTtcbiAgICAgICAgICAgIGZpbGUub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaWxlLm9uKCdlcnJvcicsIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzcG9uc2UucGlwZShmaWxlKTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMgPSBwYXJzZUludChyZXNwb25zZS5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddLCAxMCk7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgb25EYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlcXVlc3Qub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IGdldFRleHQodXJsKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBwYXJzZSBKU09OIGZyb20gJyArIHVybC50b1N0cmluZygpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dCh1cmwpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gaHR0cFJlcXVlc3QodXJsLCAnR0VUJywgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSAnJztcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYEdvdCBzdGF0dXMgY29kZSAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgICAgICAgICAgICAgZGF0YSArPSBjaHVuaztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzcG9uc2Uub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShTdHJpbmcoZGF0YSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdDaHJvbWUgdmVyc2lvbiBub3QgZm91bmQnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgcmVxdWVzdC5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cFV0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBta2RpciwgdW5saW5rIH0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQnJvd3NlciwgQnJvd3NlclBsYXRmb3JtLCBkb3dubG9hZFVybHMsIH0gZnJvbSAnLi9icm93c2VyLWRhdGEvYnJvd3Nlci1kYXRhLmpzJztcbmltcG9ydCB7IENhY2hlLCBJbnN0YWxsZWRCcm93c2VyIH0gZnJvbSAnLi9DYWNoZS5qcyc7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4vZGVidWcuanMnO1xuaW1wb3J0IHsgZGV0ZWN0QnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi9kZXRlY3RQbGF0Zm9ybS5qcyc7XG5pbXBvcnQgeyB1bnBhY2tBcmNoaXZlIH0gZnJvbSAnLi9maWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb3dubG9hZEZpbGUsIGdldEpTT04sIGhlYWRIdHRwUmVxdWVzdCB9IGZyb20gJy4vaHR0cFV0aWwuanMnO1xuY29uc3QgZGVidWdJbnN0YWxsID0gZGVidWcoJ3B1cHBldGVlcjpicm93c2VyczppbnN0YWxsJyk7XG5jb25zdCB0aW1lcyA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIGRlYnVnVGltZShsYWJlbCkge1xuICAgIHRpbWVzLnNldChsYWJlbCwgcHJvY2Vzcy5ocnRpbWUoKSk7XG59XG5mdW5jdGlvbiBkZWJ1Z1RpbWVFbmQobGFiZWwpIHtcbiAgICBjb25zdCBlbmQgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGltZXMuZ2V0KGxhYmVsKTtcbiAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb24gPSBlbmRbMF0gKiAxMDAwICsgZW5kWzFdIC8gMWU2IC0gKHN0YXJ0WzBdICogMTAwMCArIHN0YXJ0WzFdIC8gMWU2KTsgLy8gY2FsY3VsYXRlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICAgIGRlYnVnSW5zdGFsbChgRHVyYXRpb24gZm9yICR7bGFiZWx9OiAke2R1cmF0aW9ufW1zYCk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbChvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgb3B0aW9ucy51bnBhY2sgPz89IHRydWU7XG4gICAgaWYgKCFvcHRpb25zLnBsYXRmb3JtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRvd25sb2FkIGEgYmluYXJ5IGZvciB0aGUgcHJvdmlkZWQgcGxhdGZvcm06ICR7b3MucGxhdGZvcm0oKX0gKCR7b3MuYXJjaCgpfSlgKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gZ2V0RG93bmxvYWRVcmwob3B0aW9ucy5icm93c2VyLCBvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQsIG9wdGlvbnMuYmFzZVVybCk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGluc3RhbGxVcmwodXJsLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBJZiBjdXN0b20gYmFzZVVybCBpcyBwcm92aWRlZCwgZG8gbm90IGZhbGwgYmFjayB0byBDZlQgZGFzaGJvYXJkLlxuICAgICAgICBpZiAob3B0aW9ucy5iYXNlVXJsICYmICFvcHRpb25zLmZvcmNlRmFsbGJhY2tGb3JUZXN0aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbnN0YWxsKGBFcnJvciBkb3dubG9hZGluZyBmcm9tICR7dXJsfS5gKTtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLmJyb3dzZXIpIHtcbiAgICAgICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUU6XG4gICAgICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FRFJJVkVSOlxuICAgICAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NRUhFQURMRVNTU0hFTEw6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0luc3RhbGwoYFRyeWluZyB0byBmaW5kIGRvd25sb2FkIFVSTCB2aWEgaHR0cHM6Ly9nb29nbGVjaHJvbWVsYWJzLmdpdGh1Yi5pby9jaHJvbWUtZm9yLXRlc3RpbmcuYCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IChhd2FpdCBnZXRKU09OKG5ldyBVUkwoYGh0dHBzOi8vZ29vZ2xlY2hyb21lbGFicy5naXRodWIuaW8vY2hyb21lLWZvci10ZXN0aW5nLyR7b3B0aW9ucy5idWlsZElkfS5qc29uYCkpKTtcbiAgICAgICAgICAgICAgICBsZXQgcGxhdGZvcm0gPSAnJztcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMucGxhdGZvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSA9ICdsaW51eDY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0gPSAnbWFjLWFybTY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSA9ICdtYWMteDY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3dpbjMyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3dpbjY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB2ZXJzaW9uLmRvd25sb2Fkc1tvcHRpb25zLmJyb3dzZXJdPy5maW5kKGxpbmsgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGlua1sncGxhdGZvcm0nXSA9PT0gcGxhdGZvcm07XG4gICAgICAgICAgICAgICAgfSk/LnVybDtcbiAgICAgICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnSW5zdGFsbChgRmFsbGluZyBiYWNrIHRvIGRvd25sb2FkaW5nIGZyb20gJHt1cmx9LmApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgaW5zdGFsbFVybChuZXcgVVJMKHVybCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbGxVcmwodXJsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgaWYgKCFvcHRpb25zLnBsYXRmb3JtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRvd25sb2FkIGEgYmluYXJ5IGZvciB0aGUgcHJvdmlkZWQgcGxhdGZvcm06ICR7b3MucGxhdGZvcm0oKX0gKCR7b3MuYXJjaCgpfSlgKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWUgPSB1cmwudG9TdHJpbmcoKS5zcGxpdCgnLycpLnBvcCgpO1xuICAgIGFzc2VydChmaWxlTmFtZSwgYEEgbWFsZm9ybWVkIGRvd25sb2FkIFVSTCB3YXMgZm91bmQ6ICR7dXJsfS5gKTtcbiAgICBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZShvcHRpb25zLmNhY2hlRGlyKTtcbiAgICBjb25zdCBicm93c2VyUm9vdCA9IGNhY2hlLmJyb3dzZXJSb290KG9wdGlvbnMuYnJvd3Nlcik7XG4gICAgY29uc3QgYXJjaGl2ZVBhdGggPSBwYXRoLmpvaW4oYnJvd3NlclJvb3QsIGAke29wdGlvbnMuYnVpbGRJZH0tJHtmaWxlTmFtZX1gKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoYnJvd3NlclJvb3QpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGJyb3dzZXJSb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLnVucGFjaykge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhhcmNoaXZlUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmNoaXZlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1Z0luc3RhbGwoYERvd25sb2FkaW5nIGJpbmFyeSBmcm9tICR7dXJsfWApO1xuICAgICAgICBkZWJ1Z1RpbWUoJ2Rvd25sb2FkJyk7XG4gICAgICAgIGF3YWl0IGRvd25sb2FkRmlsZSh1cmwsIGFyY2hpdmVQYXRoLCBvcHRpb25zLmRvd25sb2FkUHJvZ3Jlc3NDYWxsYmFjayk7XG4gICAgICAgIGRlYnVnVGltZUVuZCgnZG93bmxvYWQnKTtcbiAgICAgICAgcmV0dXJuIGFyY2hpdmVQYXRoO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRQYXRoID0gY2FjaGUuaW5zdGFsbGF0aW9uRGlyKG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5wbGF0Zm9ybSwgb3B0aW9ucy5idWlsZElkKTtcbiAgICB0cnkge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhvdXRwdXRQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFsbGVkQnJvd3NlciA9IG5ldyBJbnN0YWxsZWRCcm93c2VyKGNhY2hlLCBvcHRpb25zLmJyb3dzZXIsIG9wdGlvbnMuYnVpbGRJZCwgb3B0aW9ucy5wbGF0Zm9ybSk7XG4gICAgICAgICAgICBpZiAoIWV4aXN0c1N5bmMoaW5zdGFsbGVkQnJvd3Nlci5leGVjdXRhYmxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBicm93c2VyIGZvbGRlciAoJHtvdXRwdXRQYXRofSkgZXhpc3RzIGJ1dCB0aGUgZXhlY3V0YWJsZSAoJHtpbnN0YWxsZWRCcm93c2VyLmV4ZWN1dGFibGVQYXRofSkgaXMgbWlzc2luZ2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxlZEJyb3dzZXI7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbnN0YWxsKGBEb3dubG9hZGluZyBiaW5hcnkgZnJvbSAke3VybH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlYnVnVGltZSgnZG93bmxvYWQnKTtcbiAgICAgICAgICAgIGF3YWl0IGRvd25sb2FkRmlsZSh1cmwsIGFyY2hpdmVQYXRoLCBvcHRpb25zLmRvd25sb2FkUHJvZ3Jlc3NDYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBkZWJ1Z1RpbWVFbmQoJ2Rvd25sb2FkJyk7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbnN0YWxsKGBJbnN0YWxsaW5nICR7YXJjaGl2ZVBhdGh9IHRvICR7b3V0cHV0UGF0aH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlYnVnVGltZSgnZXh0cmFjdCcpO1xuICAgICAgICAgICAgYXdhaXQgdW5wYWNrQXJjaGl2ZShhcmNoaXZlUGF0aCwgb3V0cHV0UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBkZWJ1Z1RpbWVFbmQoJ2V4dHJhY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnN0YWxsZWRCcm93c2VyID0gbmV3IEluc3RhbGxlZEJyb3dzZXIoY2FjaGUsIG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5idWlsZElkLCBvcHRpb25zLnBsYXRmb3JtKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYnVpbGRJZEFsaWFzKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGluc3RhbGxlZEJyb3dzZXIucmVhZE1ldGFkYXRhKCk7XG4gICAgICAgICAgICBtZXRhZGF0YS5hbGlhc2VzW29wdGlvbnMuYnVpbGRJZEFsaWFzXSA9IG9wdGlvbnMuYnVpbGRJZDtcbiAgICAgICAgICAgIGluc3RhbGxlZEJyb3dzZXIud3JpdGVNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbGxlZEJyb3dzZXI7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhhcmNoaXZlUGF0aCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHVubGluayhhcmNoaXZlUGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bmluc3RhbGwob3B0aW9ucykge1xuICAgIG9wdGlvbnMucGxhdGZvcm0gPz89IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSgpO1xuICAgIGlmICghb3B0aW9ucy5wbGF0Zm9ybSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkZXRlY3QgdGhlIGJyb3dzZXIgcGxhdGZvcm0gZm9yOiAke29zLnBsYXRmb3JtKCl9ICgke29zLmFyY2goKX0pYCk7XG4gICAgfVxuICAgIG5ldyBDYWNoZShvcHRpb25zLmNhY2hlRGlyKS51bmluc3RhbGwob3B0aW9ucy5icm93c2VyLCBvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQpO1xufVxuLyoqXG4gKiBSZXR1cm5zIG1ldGFkYXRhIGFib3V0IGJyb3dzZXJzIGluc3RhbGxlZCBpbiB0aGUgY2FjaGUgZGlyZWN0b3J5LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEluc3RhbGxlZEJyb3dzZXJzKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IENhY2hlKG9wdGlvbnMuY2FjaGVEaXIpLmdldEluc3RhbGxlZEJyb3dzZXJzKCk7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhbkRvd25sb2FkKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zLnBsYXRmb3JtID8/PSBkZXRlY3RCcm93c2VyUGxhdGZvcm0oKTtcbiAgICBpZiAoIW9wdGlvbnMucGxhdGZvcm0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZG93bmxvYWQgYSBiaW5hcnkgZm9yIHRoZSBwcm92aWRlZCBwbGF0Zm9ybTogJHtvcy5wbGF0Zm9ybSgpfSAoJHtvcy5hcmNoKCl9KWApO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgaGVhZEh0dHBSZXF1ZXN0KGdldERvd25sb2FkVXJsKG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5wbGF0Zm9ybSwgb3B0aW9ucy5idWlsZElkLCBvcHRpb25zLmJhc2VVcmwpKTtcbn1cbmZ1bmN0aW9uIGdldERvd25sb2FkVXJsKGJyb3dzZXIsIHBsYXRmb3JtLCBidWlsZElkLCBiYXNlVXJsKSB7XG4gICAgcmV0dXJuIG5ldyBVUkwoZG93bmxvYWRVcmxzW2Jyb3dzZXJdKHBsYXRmb3JtLCBidWlsZElkLCBiYXNlVXJsKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnN0YWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgYWNjZXNzU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcmVhZGxpbmUgZnJvbSAncmVhZGxpbmUnO1xuaW1wb3J0IHsgcmVzb2x2ZVN5c3RlbUV4ZWN1dGFibGVQYXRoLCB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG5pbXBvcnQgeyBDYWNoZSB9IGZyb20gJy4vQ2FjaGUuanMnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuL2RlYnVnLmpzJztcbmltcG9ydCB7IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vZGV0ZWN0UGxhdGZvcm0uanMnO1xuY29uc3QgZGVidWdMYXVuY2ggPSBkZWJ1ZygncHVwcGV0ZWVyOmJyb3dzZXJzOmxhdW5jaGVyJyk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVFeGVjdXRhYmxlUGF0aChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBDYWNoZShvcHRpb25zLmNhY2hlRGlyKS5jb21wdXRlRXhlY3V0YWJsZVBhdGgob3B0aW9ucyk7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTeXN0ZW1FeGVjdXRhYmxlUGF0aChvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgaWYgKCFvcHRpb25zLnBsYXRmb3JtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRvd25sb2FkIGEgYmluYXJ5IGZvciB0aGUgcHJvdmlkZWQgcGxhdGZvcm06ICR7b3MucGxhdGZvcm0oKX0gKCR7b3MuYXJjaCgpfSlgKTtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9IHJlc29sdmVTeXN0ZW1FeGVjdXRhYmxlUGF0aChvcHRpb25zLmJyb3dzZXIsIG9wdGlvbnMucGxhdGZvcm0sIG9wdGlvbnMuY2hhbm5lbCk7XG4gICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzU3luYyhwYXRoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgR29vZ2xlIENocm9tZSBleGVjdXRhYmxlIGZvciBjaGFubmVsICcke29wdGlvbnMuY2hhbm5lbH0nIGF0ICcke3BhdGh9Jy5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhdW5jaChvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9jZXNzKG9wdHMpO1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYID0gL15EZXZUb29scyBsaXN0ZW5pbmcgb24gKHdzOlxcL1xcLy4qKSQvO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBXRUJEUklWRVJfQklESV9XRUJTT0NLRVRfRU5EUE9JTlRfUkVHRVggPSAvXldlYkRyaXZlciBCaURpIGxpc3RlbmluZyBvbiAod3M6XFwvXFwvLiopJC87XG5jb25zdCBwcm9jZXNzTGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuY29uc3QgZGlzcGF0Y2hlcnMgPSB7XG4gICAgZXhpdDogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgcHJvY2Vzc0xpc3RlbmVycy5nZXQoJ2V4aXQnKT8uZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKC4uLmFyZ3MpO1xuICAgICAgICB9KTtcbiAgICB9LFxuICAgIFNJR0lOVDogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgcHJvY2Vzc0xpc3RlbmVycy5nZXQoJ1NJR0lOVCcpPy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIoLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgU0lHSFVQOiAoLi4uYXJncykgPT4ge1xuICAgICAgICBwcm9jZXNzTGlzdGVuZXJzLmdldCgnU0lHSFVQJyk/LmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlciguLi5hcmdzKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBTSUdURVJNOiAoLi4uYXJncykgPT4ge1xuICAgICAgICBwcm9jZXNzTGlzdGVuZXJzLmdldCgnU0lHVEVSTScpPy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIoLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH0sXG59O1xuZnVuY3Rpb24gc3Vic2NyaWJlVG9Qcm9jZXNzRXZlbnQoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBwcm9jZXNzTGlzdGVuZXJzLmdldChldmVudCkgfHwgW107XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHJvY2Vzcy5vbihldmVudCwgZGlzcGF0Y2hlcnNbZXZlbnRdKTtcbiAgICB9XG4gICAgbGlzdGVuZXJzLnB1c2goaGFuZGxlcik7XG4gICAgcHJvY2Vzc0xpc3RlbmVycy5zZXQoZXZlbnQsIGxpc3RlbmVycyk7XG59XG5mdW5jdGlvbiB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBwcm9jZXNzTGlzdGVuZXJzLmdldChldmVudCkgfHwgW107XG4gICAgY29uc3QgZXhpc3RpbmdMaXN0ZW5lcklkeCA9IGxpc3RlbmVycy5pbmRleE9mKGhhbmRsZXIpO1xuICAgIGlmIChleGlzdGluZ0xpc3RlbmVySWR4ID09PSAtMSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxpc3RlbmVycy5zcGxpY2UoZXhpc3RpbmdMaXN0ZW5lcklkeCwgMSk7XG4gICAgcHJvY2Vzc0xpc3RlbmVycy5zZXQoZXZlbnQsIGxpc3RlbmVycyk7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHJvY2Vzcy5vZmYoZXZlbnQsIGRpc3BhdGNoZXJzW2V2ZW50XSk7XG4gICAgfVxufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9jZXNzIHtcbiAgICAjZXhlY3V0YWJsZVBhdGg7XG4gICAgI2FyZ3M7XG4gICAgI2Jyb3dzZXJQcm9jZXNzO1xuICAgICNleGl0ZWQgPSBmYWxzZTtcbiAgICAvLyBUaGUgYnJvd3NlciBwcm9jZXNzIGNhbiBiZSBjbG9zZWQgZXh0ZXJuYWxseSBvciBmcm9tIHRoZSBkcml2ZXIgcHJvY2Vzcy4gV2VcbiAgICAvLyBuZWVkIHRvIGludm9rZSB0aGUgaG9va3Mgb25seSBvbmNlIHRob3VnaCBidXQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSB0aW1lc1xuICAgIC8vIHdlIHdpbGwgYmUgaW52b2tlZC5cbiAgICAjaG9va3NSYW4gPSBmYWxzZTtcbiAgICAjb25FeGl0SG9vayA9IGFzeW5jICgpID0+IHsgfTtcbiAgICAjYnJvd3NlclByb2Nlc3NFeGl0aW5nO1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgdGhpcy4jZXhlY3V0YWJsZVBhdGggPSBvcHRzLmV4ZWN1dGFibGVQYXRoO1xuICAgICAgICB0aGlzLiNhcmdzID0gb3B0cy5hcmdzID8/IFtdO1xuICAgICAgICBvcHRzLnBpcGUgPz89IGZhbHNlO1xuICAgICAgICBvcHRzLmR1bXBpbyA/Pz0gZmFsc2U7XG4gICAgICAgIG9wdHMuaGFuZGxlU0lHSU5UID8/PSB0cnVlO1xuICAgICAgICBvcHRzLmhhbmRsZVNJR1RFUk0gPz89IHRydWU7XG4gICAgICAgIG9wdHMuaGFuZGxlU0lHSFVQID8/PSB0cnVlO1xuICAgICAgICAvLyBPbiBub24td2luZG93cyBwbGF0Zm9ybXMsIGBkZXRhY2hlZDogdHJ1ZWAgbWFrZXMgY2hpbGQgcHJvY2VzcyBhXG4gICAgICAgIC8vIGxlYWRlciBvZiBhIG5ldyBwcm9jZXNzIGdyb3VwLCBtYWtpbmcgaXQgcG9zc2libGUgdG8ga2lsbCBjaGlsZFxuICAgICAgICAvLyBwcm9jZXNzIHRyZWUgd2l0aCBgLmtpbGwoLXBpZClgIGNvbW1hbmQuIEBzZWVcbiAgICAgICAgLy8gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9jaGlsZF9wcm9jZXNzLmh0bWwjY2hpbGRfcHJvY2Vzc19vcHRpb25zX2RldGFjaGVkXG4gICAgICAgIG9wdHMuZGV0YWNoZWQgPz89IHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMic7XG4gICAgICAgIGNvbnN0IHN0ZGlvID0gdGhpcy4jY29uZmlndXJlU3RkaW8oe1xuICAgICAgICAgICAgcGlwZTogb3B0cy5waXBlLFxuICAgICAgICAgICAgZHVtcGlvOiBvcHRzLmR1bXBpbyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVudiA9IG9wdHMuZW52IHx8IHt9O1xuICAgICAgICBkZWJ1Z0xhdW5jaChgTGF1bmNoaW5nICR7dGhpcy4jZXhlY3V0YWJsZVBhdGh9ICR7dGhpcy4jYXJncy5qb2luKCcgJyl9YCwge1xuICAgICAgICAgICAgZGV0YWNoZWQ6IG9wdHMuZGV0YWNoZWQsXG4gICAgICAgICAgICBlbnY6IE9iamVjdC5rZXlzKGVudikucmVkdWNlKChyZXMsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdwdXBwZXRlZXJfJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBlbnZba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH0sIHt9KSxcbiAgICAgICAgICAgIHN0ZGlvLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3MgPSBjaGlsZFByb2Nlc3Muc3Bhd24odGhpcy4jZXhlY3V0YWJsZVBhdGgsIHRoaXMuI2FyZ3MsIHtcbiAgICAgICAgICAgIGRldGFjaGVkOiBvcHRzLmRldGFjaGVkLFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgc3RkaW8sXG4gICAgICAgIH0pO1xuICAgICAgICBkZWJ1Z0xhdW5jaChgTGF1bmNoZWQgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9YCk7XG4gICAgICAgIGlmIChvcHRzLmR1bXBpbykge1xuICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Muc3RkZXJyPy5waXBlKHByb2Nlc3Muc3RkZXJyKTtcbiAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLnN0ZG91dD8ucGlwZShwcm9jZXNzLnN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICAgc3Vic2NyaWJlVG9Qcm9jZXNzRXZlbnQoJ2V4aXQnLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NFeGl0KTtcbiAgICAgICAgaWYgKG9wdHMuaGFuZGxlU0lHSU5UKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVUb1Byb2Nlc3NFdmVudCgnU0lHSU5UJywgdGhpcy4jb25Ecml2ZXJQcm9jZXNzU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5oYW5kbGVTSUdURVJNKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVUb1Byb2Nlc3NFdmVudCgnU0lHVEVSTScsIHRoaXMuI29uRHJpdmVyUHJvY2Vzc1NpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuaGFuZGxlU0lHSFVQKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVUb1Byb2Nlc3NFdmVudCgnU0lHSFVQJywgdGhpcy4jb25Ecml2ZXJQcm9jZXNzU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5vbkV4aXQpIHtcbiAgICAgICAgICAgIHRoaXMuI29uRXhpdEhvb2sgPSBvcHRzLm9uRXhpdDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNicm93c2VyUHJvY2Vzc0V4aXRpbmcgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNicm93c2VyUHJvY2Vzcy5vbmNlKCdleGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnTGF1bmNoKGBCcm93c2VyIHByb2Nlc3MgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9IG9uRXhpdGApO1xuICAgICAgICAgICAgICAgIHRoaXMuI2NsZWFyTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNydW5Ib29rcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgI3J1bkhvb2tzKCkge1xuICAgICAgICBpZiAodGhpcy4jaG9va3NSYW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNob29rc1JhbiA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuI29uRXhpdEhvb2soKTtcbiAgICB9XG4gICAgZ2V0IG5vZGVQcm9jZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlclByb2Nlc3M7XG4gICAgfVxuICAgICNjb25maWd1cmVTdGRpbyhvcHRzKSB7XG4gICAgICAgIGlmIChvcHRzLnBpcGUpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLmR1bXBpbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnLCAncGlwZScsICdwaXBlJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChvcHRzLmR1bXBpbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbJ3BpcGUnLCAncGlwZScsICdwaXBlJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWydwaXBlJywgJ2lnbm9yZScsICdwaXBlJ107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2NsZWFyTGlzdGVuZXJzKCkge1xuICAgICAgICB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoJ2V4aXQnLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NFeGl0KTtcbiAgICAgICAgdW5zdWJzY3JpYmVGcm9tUHJvY2Vzc0V2ZW50KCdTSUdJTlQnLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NTaWduYWwpO1xuICAgICAgICB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoJ1NJR1RFUk0nLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NTaWduYWwpO1xuICAgICAgICB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoJ1NJR0hVUCcsIHRoaXMuI29uRHJpdmVyUHJvY2Vzc1NpZ25hbCk7XG4gICAgfVxuICAgICNvbkRyaXZlclByb2Nlc3NFeGl0ID0gKF9jb2RlKSA9PiB7XG4gICAgICAgIHRoaXMua2lsbCgpO1xuICAgIH07XG4gICAgI29uRHJpdmVyUHJvY2Vzc1NpZ25hbCA9IChzaWduYWwpID0+IHtcbiAgICAgICAgc3dpdGNoIChzaWduYWwpIHtcbiAgICAgICAgICAgIGNhc2UgJ1NJR0lOVCc6XG4gICAgICAgICAgICAgICAgdGhpcy5raWxsKCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEzMCk7XG4gICAgICAgICAgICBjYXNlICdTSUdURVJNJzpcbiAgICAgICAgICAgIGNhc2UgJ1NJR0hVUCc6XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNydW5Ib29rcygpO1xuICAgICAgICBpZiAoIXRoaXMuI2V4aXRlZCkge1xuICAgICAgICAgICAgdGhpcy5raWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2Jyb3dzZXJQcm9jZXNzRXhpdGluZztcbiAgICB9XG4gICAgaGFzQ2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlclByb2Nlc3NFeGl0aW5nO1xuICAgIH1cbiAgICBraWxsKCkge1xuICAgICAgICBkZWJ1Z0xhdW5jaChgVHJ5aW5nIHRvIGtpbGwgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9YCk7XG4gICAgICAgIC8vIElmIHRoZSBwcm9jZXNzIGZhaWxlZCB0byBsYXVuY2ggKGZvciBleGFtcGxlIGlmIHRoZSBicm93c2VyIGV4ZWN1dGFibGUgcGF0aFxuICAgICAgICAvLyBpcyBpbnZhbGlkKSwgdGhlbiB0aGUgcHJvY2VzcyBkb2VzIG5vdCBnZXQgYSBwaWQgYXNzaWduZWQuIEEgY2FsbCB0b1xuICAgICAgICAvLyBgcHJvYy5raWxsYCB3b3VsZCBlcnJvciwgYXMgdGhlIGBwaWRgIHRvLWJlLWtpbGxlZCBjYW4gbm90IGJlIGZvdW5kLlxuICAgICAgICBpZiAodGhpcy4jYnJvd3NlclByb2Nlc3MgJiZcbiAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZCAmJlxuICAgICAgICAgICAgcGlkRXhpc3RzKHRoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGVidWdMYXVuY2goYEJyb3dzZXIgcHJvY2VzcyAke3RoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZH0gZXhpc3RzYCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkUHJvY2Vzcy5leGVjU3luYyhgdGFza2tpbGwgL3BpZCAke3RoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZH0gL1QgL0ZgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnTGF1bmNoKGBLaWxsaW5nICR7dGhpcy4jYnJvd3NlclByb2Nlc3MucGlkfSB1c2luZyB0YXNra2lsbCBmYWlsZWRgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXNra2lsbCBjYW4gZmFpbCB0byBraWxsIHRoZSBwcm9jZXNzIGUuZy4gZHVlIHRvIG1pc3NpbmcgcGVybWlzc2lvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyBraWxsIHRoZSBwcm9jZXNzIHZpYSBOb2RlIEFQSS4gVGhpcyBkZWxheXMga2lsbGluZyBvZiBhbGwgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlcyBvZiBgdGhpcy5wcm9jYCB1bnRpbCB0aGUgbWFpbiBOb2RlLmpzIHByb2Nlc3MgZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLmtpbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gbGludXggdGhlIHByb2Nlc3MgZ3JvdXAgY2FuIGJlIGtpbGxlZCB3aXRoIHRoZSBncm91cCBpZCBwcmVmaXhlZCB3aXRoXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgbWludXMgc2lnbi4gVGhlIHByb2Nlc3MgZ3JvdXAgaWQgaXMgdGhlIGdyb3VwIGxlYWRlcidzIHBpZC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0dyb3VwSWQgPSAtdGhpcy4jYnJvd3NlclByb2Nlc3MucGlkO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3NHcm91cElkLCAnU0lHS0lMTCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdMYXVuY2goYEtpbGxpbmcgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9IHVzaW5nIHByb2Nlc3Mua2lsbCBmYWlsZWRgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBLaWxsaW5nIHRoZSBwcm9jZXNzIGdyb3VwIGNhbiBmYWlsIGR1ZSBlLmcuIHRvIG1pc3NpbmcgcGVybWlzc2lvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyBraWxsIHRoZSBwcm9jZXNzIHZpYSBOb2RlIEFQSS4gVGhpcyBkZWxheXMga2lsbGluZyBvZiBhbGwgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlcyBvZiBgdGhpcy5wcm9jYCB1bnRpbCB0aGUgbWFpbiBOb2RlLmpzIHByb2Nlc3MgZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLmtpbGwoJ1NJR0tJTEwnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtQUk9DRVNTX0VSUk9SX0VYUExBTkFUSU9OfVxcbkVycm9yIGNhdXNlOiAke2lzRXJyb3JMaWtlKGVycm9yKSA/IGVycm9yLnN0YWNrIDogZXJyb3J9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2xlYXJMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgd2FpdEZvckxpbmVPdXRwdXQocmVnZXgsIHRpbWVvdXQgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy4jYnJvd3NlclByb2Nlc3Muc3RkZXJyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bicm93c2VyUHJvY2Vzc2AgZG9lcyBub3QgaGF2ZSBzdGRlcnIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UodGhpcy4jYnJvd3NlclByb2Nlc3Muc3RkZXJyKTtcbiAgICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmwub24oJ2xpbmUnLCBvbkxpbmUpO1xuICAgICAgICAgICAgcmwub24oJ2Nsb3NlJywgb25DbG9zZSk7XG4gICAgICAgICAgICB0aGlzLiNicm93c2VyUHJvY2Vzcy5vbignZXhpdCcsIG9uQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Mub24oJ2Vycm9yJywgb25DbG9zZSk7XG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSB0aW1lb3V0ID4gMCA/IHNldFRpbWVvdXQob25UaW1lb3V0LCB0aW1lb3V0KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmwub2ZmKCdsaW5lJywgb25MaW5lKTtcbiAgICAgICAgICAgICAgICBybC5vZmYoJ2Nsb3NlJywgb25DbG9zZSk7XG4gICAgICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Mub2ZmKCdleGl0Jywgb25DbG9zZSk7XG4gICAgICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Mub2ZmKCdlcnJvcicsIG9uQ2xvc2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG9uQ2xvc2UoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihbXG4gICAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gbGF1bmNoIHRoZSBicm93c2VyIHByb2Nlc3MhJHtlcnJvciA/ICcgJyArIGVycm9yLm1lc3NhZ2UgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAnVFJPVUJMRVNIT09USU5HOiBodHRwczovL3BwdHIuZGV2L3Ryb3VibGVzaG9vdGluZycsXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgIF0uam9pbignXFxuJykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUaW1lb3V0RXJyb3IoYFRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9IG1zIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBXUyBlbmRwb2ludCBVUkwgdG8gYXBwZWFyIGluIHN0ZG91dCFgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBvbkxpbmUobGluZSkge1xuICAgICAgICAgICAgICAgIHN0ZGVyciArPSBsaW5lICsgJ1xcbic7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSBSZWdFeHAgbWF0Y2hlcywgc28gdGhpcyB3aWxsIG9idmlvdXNseSBleGlzdC5cbiAgICAgICAgICAgICAgICByZXNvbHZlKG1hdGNoWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuY29uc3QgUFJPQ0VTU19FUlJPUl9FWFBMQU5BVElPTiA9IGBQdXBwZXRlZXIgd2FzIHVuYWJsZSB0byBraWxsIHRoZSBwcm9jZXNzIHdoaWNoIHJhbiB0aGUgYnJvd3NlciBiaW5hcnkuXG5UaGlzIG1lYW5zIHRoYXQsIG9uIGZ1dHVyZSBQdXBwZXRlZXIgbGF1bmNoZXMsIFB1cHBldGVlciBtaWdodCBub3QgYmUgYWJsZSB0byBsYXVuY2ggdGhlIGJyb3dzZXIuXG5QbGVhc2UgY2hlY2sgeW91ciBvcGVuIHByb2Nlc3NlcyBhbmQgZW5zdXJlIHRoYXQgdGhlIGJyb3dzZXIgcHJvY2Vzc2VzIHRoYXQgUHVwcGV0ZWVyIGxhdW5jaGVkIGhhdmUgYmVlbiBraWxsZWQuXG5JZiB5b3UgdGhpbmsgdGhpcyBpcyBhIGJ1ZywgcGxlYXNlIHJlcG9ydCBpdCBvbiB0aGUgUHVwcGV0ZWVyIGlzc3VlIHRyYWNrZXIuYDtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHBpZEV4aXN0cyhwaWQpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5raWxsKHBpZCwgMCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5jb2RlICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3JMaWtlKG9iaikge1xuICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsICYmICduYW1lJyBpbiBvYmogJiYgJ21lc3NhZ2UnIGluIG9iaik7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihvYmopIHtcbiAgICByZXR1cm4gKGlzRXJyb3JMaWtlKG9iaikgJiZcbiAgICAgICAgKCdlcnJubycgaW4gb2JqIHx8ICdjb2RlJyBpbiBvYmogfHwgJ3BhdGgnIGluIG9iaiB8fCAnc3lzY2FsbCcgaW4gb2JqKSk7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhdW5jaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHsgbGF1bmNoLCBjb21wdXRlRXhlY3V0YWJsZVBhdGgsIGNvbXB1dGVTeXN0ZW1FeGVjdXRhYmxlUGF0aCwgVGltZW91dEVycm9yLCBDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBXRUJEUklWRVJfQklESV9XRUJTT0NLRVRfRU5EUE9JTlRfUkVHRVgsIFByb2Nlc3MsIH0gZnJvbSAnLi9sYXVuY2guanMnO1xuZXhwb3J0IHsgaW5zdGFsbCwgZ2V0SW5zdGFsbGVkQnJvd3NlcnMsIGNhbkRvd25sb2FkLCB1bmluc3RhbGwsIH0gZnJvbSAnLi9pbnN0YWxsLmpzJztcbmV4cG9ydCB7IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vZGV0ZWN0UGxhdGZvcm0uanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUJ1aWxkSWQsIEJyb3dzZXIsIEJyb3dzZXJQbGF0Zm9ybSwgQ2hyb21lUmVsZWFzZUNoYW5uZWwsIGNyZWF0ZVByb2ZpbGUsIGdldFZlcnNpb25Db21wYXJhdG9yLCB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG5leHBvcnQgeyBDTEksIG1ha2VQcm9ncmVzc0NhbGxiYWNrIH0gZnJvbSAnLi9DTEkuanMnO1xuZXhwb3J0IHsgQ2FjaGUsIEluc3RhbGxlZEJyb3dzZXIgfSBmcm9tICcuL0NhY2hlLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1haW4uanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYWxpZ24gPSB7XG4gICAgcmlnaHQ6IGFsaWduUmlnaHQsXG4gICAgY2VudGVyOiBhbGlnbkNlbnRlclxufTtcbmNvbnN0IHRvcCA9IDA7XG5jb25zdCByaWdodCA9IDE7XG5jb25zdCBib3R0b20gPSAyO1xuY29uc3QgbGVmdCA9IDM7XG5leHBvcnQgY2xhc3MgVUkge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aDtcbiAgICAgICAgdGhpcy53cmFwID0gKF9hID0gb3B0cy53cmFwKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0cnVlO1xuICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICB9XG4gICAgc3BhbiguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLmRpdiguLi5hcmdzKTtcbiAgICAgICAgY29scy5zcGFuID0gdHJ1ZTtcbiAgICB9XG4gICAgcmVzZXRPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgIH1cbiAgICBkaXYoLi4uYXJncykge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGl2KCcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53cmFwICYmIHRoaXMuc2hvdWxkQXBwbHlMYXlvdXREU0woLi4uYXJncykgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxheW91dERTTChhcmdzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xzID0gYXJncy5tYXAoYXJnID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbEZyb21TdHJpbmcoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJvd3MucHVzaChjb2xzKTtcbiAgICAgICAgcmV0dXJuIGNvbHM7XG4gICAgfVxuICAgIHNob3VsZEFwcGx5TGF5b3V0RFNMKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgL1tcXHRcXG5dLy50ZXN0KGFyZ3NbMF0pO1xuICAgIH1cbiAgICBhcHBseUxheW91dERTTChzdHIpIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IHN0ci5zcGxpdCgnXFxuJykubWFwKHJvdyA9PiByb3cuc3BsaXQoJ1xcdCcpKTtcbiAgICAgICAgbGV0IGxlZnRDb2x1bW5XaWR0aCA9IDA7XG4gICAgICAgIC8vIHNpbXBsZSBoZXVyaXN0aWMgZm9yIGxheW91dCwgbWFrZSBzdXJlIHRoZVxuICAgICAgICAvLyBzZWNvbmQgY29sdW1uIGxpbmVzIHVwIGFsb25nIHRoZSBsZWZ0LWhhbmQuXG4gICAgICAgIC8vIGRvbid0IGFsbG93IHRoZSBmaXJzdCBjb2x1bW4gdG8gdGFrZSB1cCBtb3JlXG4gICAgICAgIC8vIHRoYW4gNTAlIG9mIHRoZSBzY3JlZW4uXG4gICAgICAgIHJvd3MuZm9yRWFjaChjb2x1bW5zID0+IHtcbiAgICAgICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA+IDEgJiYgbWl4aW4uc3RyaW5nV2lkdGgoY29sdW1uc1swXSkgPiBsZWZ0Q29sdW1uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsZWZ0Q29sdW1uV2lkdGggPSBNYXRoLm1pbihNYXRoLmZsb29yKHRoaXMud2lkdGggKiAwLjUpLCBtaXhpbi5zdHJpbmdXaWR0aChjb2x1bW5zWzBdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZW5lcmF0ZSBhIHRhYmxlOlxuICAgICAgICAvLyAgcmVwbGFjaW5nICcgJyB3aXRoIHBhZGRpbmcgY2FsY3VsYXRpb25zLlxuICAgICAgICAvLyAgdXNpbmcgdGhlIGFsZ29yaXRobWljYWxseSBnZW5lcmF0ZWQgd2lkdGguXG4gICAgICAgIHJvd3MuZm9yRWFjaChjb2x1bW5zID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGl2KC4uLmNvbHVtbnMubWFwKChyLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogci50cmltKCksXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IHRoaXMubWVhc3VyZVBhZGRpbmcociksXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAoaSA9PT0gMCAmJiBjb2x1bW5zLmxlbmd0aCA+IDEpID8gbGVmdENvbHVtbldpZHRoIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd3NbdGhpcy5yb3dzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBjb2xGcm9tU3RyaW5nKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICBwYWRkaW5nOiB0aGlzLm1lYXN1cmVQYWRkaW5nKHRleHQpXG4gICAgICAgIH07XG4gICAgfVxuICAgIG1lYXN1cmVQYWRkaW5nKHN0cikge1xuICAgICAgICAvLyBtZWFzdXJlIHBhZGRpbmcgd2l0aG91dCBhbnNpIGVzY2FwZSBjb2Rlc1xuICAgICAgICBjb25zdCBub0Fuc2kgPSBtaXhpbi5zdHJpcEFuc2koc3RyKTtcbiAgICAgICAgcmV0dXJuIFswLCBub0Fuc2kubWF0Y2goL1xccyokLylbMF0ubGVuZ3RoLCAwLCBub0Fuc2kubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoXTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgICAgIHRoaXMucm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvd1RvU3RyaW5nKHJvdywgbGluZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZG9uJ3QgZGlzcGxheSBhbnkgbGluZXMgd2l0aCB0aGVcbiAgICAgICAgLy8gaGlkZGVuIGZsYWcgc2V0LlxuICAgICAgICByZXR1cm4gbGluZXNcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiAhbGluZS5oaWRkZW4pXG4gICAgICAgICAgICAubWFwKGxpbmUgPT4gbGluZS50ZXh0KVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgICByb3dUb1N0cmluZyhyb3csIGxpbmVzKSB7XG4gICAgICAgIHRoaXMucmFzdGVyaXplKHJvdykuZm9yRWFjaCgocnJvdywgcikgPT4ge1xuICAgICAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICAgICAgcnJvdy5mb3JFYWNoKChjb2wsIGMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoIH0gPSByb3dbY107IC8vIHRoZSB3aWR0aCB3aXRoIHBhZGRpbmcuXG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcFdpZHRoID0gdGhpcy5uZWdhdGVQYWRkaW5nKHJvd1tjXSk7IC8vIHRoZSB3aWR0aCB3aXRob3V0IHBhZGRpbmcuXG4gICAgICAgICAgICAgICAgbGV0IHRzID0gY29sOyAvLyB0ZW1wb3Jhcnkgc3RyaW5nIHVzZWQgZHVyaW5nIGFsaWdubWVudC9wYWRkaW5nLlxuICAgICAgICAgICAgICAgIGlmICh3cmFwV2lkdGggPiBtaXhpbi5zdHJpbmdXaWR0aChjb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRzICs9ICcgJy5yZXBlYXQod3JhcFdpZHRoIC0gbWl4aW4uc3RyaW5nV2lkdGgoY29sKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFsaWduIHRoZSBzdHJpbmcgd2l0aGluIGl0cyBjb2x1bW4uXG4gICAgICAgICAgICAgICAgaWYgKHJvd1tjXS5hbGlnbiAmJiByb3dbY10uYWxpZ24gIT09ICdsZWZ0JyAmJiB0aGlzLndyYXApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm4gPSBhbGlnbltyb3dbY10uYWxpZ25dO1xuICAgICAgICAgICAgICAgICAgICB0cyA9IGZuKHRzLCB3cmFwV2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWl4aW4uc3RyaW5nV2lkdGgodHMpIDwgd3JhcFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cyArPSAnICcucmVwZWF0KCh3aWR0aCB8fCAwKSAtIG1peGluLnN0cmluZ1dpZHRoKHRzKSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFwcGx5IGJvcmRlciBhbmQgcGFkZGluZyB0byBzdHJpbmcuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHJvd1tjXS5wYWRkaW5nIHx8IFswLCAwLCAwLCAwXTtcbiAgICAgICAgICAgICAgICBpZiAocGFkZGluZ1tsZWZ0XSkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnLnJlcGVhdChwYWRkaW5nW2xlZnRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyICs9IGFkZEJvcmRlcihyb3dbY10sIHRzLCAnfCAnKTtcbiAgICAgICAgICAgICAgICBzdHIgKz0gdHM7XG4gICAgICAgICAgICAgICAgc3RyICs9IGFkZEJvcmRlcihyb3dbY10sIHRzLCAnIHwnKTtcbiAgICAgICAgICAgICAgICBpZiAocGFkZGluZ1tyaWdodF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJy5yZXBlYXQocGFkZGluZ1tyaWdodF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiBwcmlvciByb3cgaXMgc3BhbiwgdHJ5IHRvIHJlbmRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHJvdyBvbiB0aGUgcHJpb3IgbGluZS5cbiAgICAgICAgICAgICAgICBpZiAociA9PT0gMCAmJiBsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMucmVuZGVySW5saW5lKHN0ciwgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UuXG4gICAgICAgICAgICBsaW5lcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBzdHIucmVwbGFjZSgvICskLywgJycpLFxuICAgICAgICAgICAgICAgIHNwYW46IHJvdy5zcGFuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG4gICAgLy8gaWYgdGhlIGZ1bGwgJ3NvdXJjZScgY2FuIHJlbmRlciBpblxuICAgIC8vIHRoZSB0YXJnZXQgbGluZSwgZG8gc28uXG4gICAgcmVuZGVySW5saW5lKHNvdXJjZSwgcHJldmlvdXNMaW5lKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gc291cmNlLm1hdGNoKC9eICovKTtcbiAgICAgICAgY29uc3QgbGVhZGluZ1doaXRlc3BhY2UgPSBtYXRjaCA/IG1hdGNoWzBdLmxlbmd0aCA6IDA7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHByZXZpb3VzTGluZS50ZXh0O1xuICAgICAgICBjb25zdCB0YXJnZXRUZXh0V2lkdGggPSBtaXhpbi5zdHJpbmdXaWR0aCh0YXJnZXQudHJpbVJpZ2h0KCkpO1xuICAgICAgICBpZiAoIXByZXZpb3VzTGluZS5zcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBhcHBseWluZyB3cmFwcGluZyBsb2dpYyxcbiAgICAgICAgLy8ganVzdCBhbHdheXMgYXBwZW5kIHRvIHRoZSBzcGFuLlxuICAgICAgICBpZiAoIXRoaXMud3JhcCkge1xuICAgICAgICAgICAgcHJldmlvdXNMaW5lLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICsgc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZWFkaW5nV2hpdGVzcGFjZSA8IHRhcmdldFRleHRXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91c0xpbmUuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRhcmdldC50cmltUmlnaHQoKSArICcgJy5yZXBlYXQobGVhZGluZ1doaXRlc3BhY2UgLSB0YXJnZXRUZXh0V2lkdGgpICsgc291cmNlLnRyaW1MZWZ0KCk7XG4gICAgfVxuICAgIHJhc3Rlcml6ZShyb3cpIHtcbiAgICAgICAgY29uc3QgcnJvd3MgPSBbXTtcbiAgICAgICAgY29uc3Qgd2lkdGhzID0gdGhpcy5jb2x1bW5XaWR0aHMocm93KTtcbiAgICAgICAgbGV0IHdyYXBwZWQ7XG4gICAgICAgIC8vIHdvcmQgd3JhcCBhbGwgY29sdW1ucywgYW5kIGNyZWF0ZVxuICAgICAgICAvLyBhIGRhdGEtc3RydWN0dXJlIHRoYXQgaXMgZWFzeSB0byByYXN0ZXJpemUuXG4gICAgICAgIHJvdy5mb3JFYWNoKChjb2wsIGMpID0+IHtcbiAgICAgICAgICAgIC8vIGxlYXZlIHJvb20gZm9yIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcuXG4gICAgICAgICAgICBjb2wud2lkdGggPSB3aWR0aHNbY107XG4gICAgICAgICAgICBpZiAodGhpcy53cmFwKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZCA9IG1peGluLndyYXAoY29sLnRleHQsIHRoaXMubmVnYXRlUGFkZGluZyhjb2wpLCB7IGhhcmQ6IHRydWUgfSkuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZCA9IGNvbC50ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC51bnNoaWZ0KCcuJyArICctJy5yZXBlYXQodGhpcy5uZWdhdGVQYWRkaW5nKGNvbCkgKyAyKSArICcuJyk7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC5wdXNoKFwiJ1wiICsgJy0nLnJlcGVhdCh0aGlzLm5lZ2F0ZVBhZGRpbmcoY29sKSArIDIpICsgXCInXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkIHRvcCBhbmQgYm90dG9tIHBhZGRpbmcuXG4gICAgICAgICAgICBpZiAoY29sLnBhZGRpbmcpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnVuc2hpZnQoLi4ubmV3IEFycmF5KGNvbC5wYWRkaW5nW3RvcF0gfHwgMCkuZmlsbCgnJykpO1xuICAgICAgICAgICAgICAgIHdyYXBwZWQucHVzaCguLi5uZXcgQXJyYXkoY29sLnBhZGRpbmdbYm90dG9tXSB8fCAwKS5maWxsKCcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cmFwcGVkLmZvckVhY2goKHN0ciwgcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcnJvd3Nbcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgcnJvd3MucHVzaChbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJyb3cgPSBycm93c1tyXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnJvd1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBycm93LnB1c2goJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJyb3cucHVzaChzdHIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcnJvd3M7XG4gICAgfVxuICAgIG5lZ2F0ZVBhZGRpbmcoY29sKSB7XG4gICAgICAgIGxldCB3cmFwV2lkdGggPSBjb2wud2lkdGggfHwgMDtcbiAgICAgICAgaWYgKGNvbC5wYWRkaW5nKSB7XG4gICAgICAgICAgICB3cmFwV2lkdGggLT0gKGNvbC5wYWRkaW5nW2xlZnRdIHx8IDApICsgKGNvbC5wYWRkaW5nW3JpZ2h0XSB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICAgICAgd3JhcFdpZHRoIC09IDQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyYXBXaWR0aDtcbiAgICB9XG4gICAgY29sdW1uV2lkdGhzKHJvdykge1xuICAgICAgICBpZiAoIXRoaXMud3JhcCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLndpZHRoIHx8IG1peGluLnN0cmluZ1dpZHRoKGNvbC50ZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCB1bnNldCA9IHJvdy5sZW5ndGg7XG4gICAgICAgIGxldCByZW1haW5pbmdXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIC8vIGNvbHVtbiB3aWR0aHMgY2FuIGJlIHNldCBpbiBjb25maWcuXG4gICAgICAgIGNvbnN0IHdpZHRocyA9IHJvdy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgIGlmIChjb2wud2lkdGgpIHtcbiAgICAgICAgICAgICAgICB1bnNldC0tO1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZ1dpZHRoIC09IGNvbC53aWR0aDtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFueSB1bnNldCB3aWR0aHMgc2hvdWxkIGJlIGNhbGN1bGF0ZWQuXG4gICAgICAgIGNvbnN0IHVuc2V0V2lkdGggPSB1bnNldCA/IE1hdGguZmxvb3IocmVtYWluaW5nV2lkdGggLyB1bnNldCkgOiAwO1xuICAgICAgICByZXR1cm4gd2lkdGhzLm1hcCgodywgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh1bnNldFdpZHRoLCBfbWluV2lkdGgocm93W2ldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkQm9yZGVyKGNvbCwgdHMsIHN0eWxlKSB7XG4gICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgaWYgKC9bLiddLStbLiddLy50ZXN0KHRzKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cy50cmltKCkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcgICc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cbi8vIGNhbGN1bGF0ZXMgdGhlIG1pbmltdW0gd2lkdGggb2Zcbi8vIGEgY29sdW1uLCBiYXNlZCBvbiBwYWRkaW5nIHByZWZlcmVuY2VzLlxuZnVuY3Rpb24gX21pbldpZHRoKGNvbCkge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBjb2wucGFkZGluZyB8fCBbXTtcbiAgICBjb25zdCBtaW5XaWR0aCA9IDEgKyAocGFkZGluZ1tsZWZ0XSB8fCAwKSArIChwYWRkaW5nW3JpZ2h0XSB8fCAwKTtcbiAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICByZXR1cm4gbWluV2lkdGggKyA0O1xuICAgIH1cbiAgICByZXR1cm4gbWluV2lkdGg7XG59XG5mdW5jdGlvbiBnZXRXaW5kb3dXaWR0aCgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZGVwZW5kcyBvbiB0ZXJtaW5hbCAqL1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy5zdGRvdXQgJiYgcHJvY2Vzcy5zdGRvdXQuY29sdW1ucykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRvdXQuY29sdW1ucztcbiAgICB9XG4gICAgcmV0dXJuIDgwO1xufVxuZnVuY3Rpb24gYWxpZ25SaWdodChzdHIsIHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBjb25zdCBzdHJXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHN0cik7XG4gICAgaWYgKHN0cldpZHRoIDwgd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuICcgJy5yZXBlYXQod2lkdGggLSBzdHJXaWR0aCkgKyBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBhbGlnbkNlbnRlcihzdHIsIHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBjb25zdCBzdHJXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHN0cik7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoc3RyV2lkdGggPj0gd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuICcgJy5yZXBlYXQoKHdpZHRoIC0gc3RyV2lkdGgpID4+IDEpICsgc3RyO1xufVxubGV0IG1peGluO1xuZXhwb3J0IGZ1bmN0aW9uIGNsaXVpKG9wdHMsIF9taXhpbikge1xuICAgIG1peGluID0gX21peGluO1xuICAgIHJldHVybiBuZXcgVUkoe1xuICAgICAgICB3aWR0aDogKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy53aWR0aCkgfHwgZ2V0V2luZG93V2lkdGgoKSxcbiAgICAgICAgd3JhcDogb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLndyYXBcbiAgICB9KTtcbn1cbiIsIi8vIE1pbmltYWwgcmVwbGFjZW1lbnQgZm9yIGFuc2kgc3RyaW5nIGhlbHBlcnMgXCJ3cmFwLWFuc2lcIiBhbmQgXCJzdHJpcC1hbnNpXCIuXG4vLyB0byBmYWNpbGl0YXRlIEVTTSBhbmQgRGVubyBtb2R1bGVzLlxuLy8gVE9ETzogbG9vayBhdCBwb3J0aW5nIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3dyYXAtYW5zaSB0byBFU00uXG4vLyBUaGUgbnBtIGFwcGxpY2F0aW9uXG4vLyBDb3B5cmlnaHQgKGMpIG5wbSwgSW5jLiBhbmQgQ29udHJpYnV0b3JzXG4vLyBMaWNlbnNlZCBvbiB0aGUgdGVybXMgb2YgVGhlIEFydGlzdGljIExpY2Vuc2UgMi4wXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vY2xpL2Jsb2IvNGM2NWNkOTUyYmM4NjI3ODExNzM1YmVhNzZiOWIxMTBjYzRmYzgwZS9saWIvdXRpbHMvYW5zaS10cmltLmpzXG5jb25zdCBhbnNpID0gbmV3IFJlZ0V4cCgnXFx4MWIoPzpcXFxcWyg/OlxcXFxkK1tBQkNERUZHSktTVG1dfFxcXFxkKztcXFxcZCtbSGZtXXwnICtcbiAgICAnXFxcXGQrO1xcXFxkKztcXFxcZCttfDZufHN8dXxcXFxcPzI1W2xoXSl8XFxcXHcpJywgJ2cnKTtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEFuc2koc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKGFuc2ksICcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3cmFwKHN0ciwgd2lkdGgpIHtcbiAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSBzdHIubWF0Y2goYW5zaSkgfHwgWycnLCAnJ107XG4gICAgc3RyID0gc3RyaXBBbnNpKHN0cik7XG4gICAgbGV0IHdyYXBwZWQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSAhPT0gMCAmJiAoaSAlIHdpZHRoKSA9PT0gMCkge1xuICAgICAgICAgICAgd3JhcHBlZCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB3cmFwcGVkICs9IHN0ci5jaGFyQXQoaSk7XG4gICAgfVxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgICAgd3JhcHBlZCA9IGAke3N0YXJ0fSR7d3JhcHBlZH0ke2VuZH1gO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlZDtcbn1cbiIsIi8vIEJvb3RzdHJhcCBjbGl1aSB3aXRoIENvbW1vbkpTIGRlcGVuZGVuY2llczpcbmltcG9ydCB7IGNsaXVpIH0gZnJvbSAnLi9idWlsZC9saWIvaW5kZXguanMnXG5pbXBvcnQgeyB3cmFwLCBzdHJpcEFuc2kgfSBmcm9tICcuL2J1aWxkL2xpYi9zdHJpbmctdXRpbHMuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVpIChvcHRzKSB7XG4gIHJldHVybiBjbGl1aShvcHRzLCB7XG4gICAgc3RyaW5nV2lkdGg6IChzdHIpID0+IHtcbiAgICAgIHJldHVybiBbLi4uc3RyXS5sZW5ndGhcbiAgICB9LFxuICAgIHN0cmlwQW5zaSxcbiAgICB3cmFwXG4gIH0pXG59XG4iLCJpbXBvcnQgY29tbWFuZGVyIGZyb20gJy4vaW5kZXguanMnO1xuXG4vLyB3cmFwcGVyIHRvIHByb3ZpZGUgbmFtZWQgZXhwb3J0cyBmb3IgRVNNLlxuZXhwb3J0IGNvbnN0IHtcbiAgcHJvZ3JhbSxcbiAgY3JlYXRlQ29tbWFuZCxcbiAgY3JlYXRlQXJndW1lbnQsXG4gIGNyZWF0ZU9wdGlvbixcbiAgQ29tbWFuZGVyRXJyb3IsXG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkT3B0aW9uQXJndW1lbnRFcnJvciwgLy8gZGVwcmVjYXRlZCBvbGQgbmFtZVxuICBDb21tYW5kLFxuICBBcmd1bWVudCxcbiAgT3B0aW9uLFxuICBIZWxwLFxufSA9IGNvbW1hbmRlcjtcbiIsImltcG9ydCB7IGRpcm5hbWUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IHJlYWRkaXJTeW5jLCBzdGF0U3luYyB9IGZyb20gJ2ZzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHN0YXJ0LCBjYWxsYmFjaykge1xuXHRsZXQgZGlyID0gcmVzb2x2ZSgnLicsIHN0YXJ0KTtcblx0bGV0IHRtcCwgc3RhdHMgPSBzdGF0U3luYyhkaXIpO1xuXG5cdGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuXHRcdGRpciA9IGRpcm5hbWUoZGlyKTtcblx0fVxuXG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0dG1wID0gY2FsbGJhY2soZGlyLCByZWFkZGlyU3luYyhkaXIpKTtcblx0XHRpZiAodG1wKSByZXR1cm4gcmVzb2x2ZShkaXIsIHRtcCk7XG5cdFx0ZGlyID0gZGlybmFtZSh0bXAgPSBkaXIpO1xuXHRcdGlmICh0bXAgPT09IGRpcikgYnJlYWs7XG5cdH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgbWVyZ2UsIHJhY2VXaXRoLCB9IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIGZyb21FbWl0dGVyRXZlbnQsIGZpbHRlckFzeW5jLCB0aW1lb3V0LCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzeW5jRGlzcG9zZVN5bWJvbCwgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgV0VCX1BFUk1JU1NJT05fVE9fUFJPVE9DT0xfUEVSTUlTU0lPTiA9IG5ldyBNYXAoW1xuICAgIFsnZ2VvbG9jYXRpb24nLCAnZ2VvbG9jYXRpb24nXSxcbiAgICBbJ21pZGknLCAnbWlkaSddLFxuICAgIFsnbm90aWZpY2F0aW9ucycsICdub3RpZmljYXRpb25zJ10sXG4gICAgLy8gVE9ETzogcHVzaCBpc24ndCBhIHZhbGlkIHR5cGU/XG4gICAgLy8gWydwdXNoJywgJ3B1c2gnXSxcbiAgICBbJ2NhbWVyYScsICd2aWRlb0NhcHR1cmUnXSxcbiAgICBbJ21pY3JvcGhvbmUnLCAnYXVkaW9DYXB0dXJlJ10sXG4gICAgWydiYWNrZ3JvdW5kLXN5bmMnLCAnYmFja2dyb3VuZFN5bmMnXSxcbiAgICBbJ2FtYmllbnQtbGlnaHQtc2Vuc29yJywgJ3NlbnNvcnMnXSxcbiAgICBbJ2FjY2VsZXJvbWV0ZXInLCAnc2Vuc29ycyddLFxuICAgIFsnZ3lyb3Njb3BlJywgJ3NlbnNvcnMnXSxcbiAgICBbJ21hZ25ldG9tZXRlcicsICdzZW5zb3JzJ10sXG4gICAgWydhY2Nlc3NpYmlsaXR5LWV2ZW50cycsICdhY2Nlc3NpYmlsaXR5RXZlbnRzJ10sXG4gICAgWydjbGlwYm9hcmQtcmVhZCcsICdjbGlwYm9hcmRSZWFkV3JpdGUnXSxcbiAgICBbJ2NsaXBib2FyZC13cml0ZScsICdjbGlwYm9hcmRSZWFkV3JpdGUnXSxcbiAgICBbJ2NsaXBib2FyZC1zYW5pdGl6ZWQtd3JpdGUnLCAnY2xpcGJvYXJkU2FuaXRpemVkV3JpdGUnXSxcbiAgICBbJ3BheW1lbnQtaGFuZGxlcicsICdwYXltZW50SGFuZGxlciddLFxuICAgIFsncGVyc2lzdGVudC1zdG9yYWdlJywgJ2R1cmFibGVTdG9yYWdlJ10sXG4gICAgWydpZGxlLWRldGVjdGlvbicsICdpZGxlRGV0ZWN0aW9uJ10sXG4gICAgLy8gY2hyb21lLXNwZWNpZmljIHBlcm1pc3Npb25zIHdlIGhhdmUuXG4gICAgWydtaWRpLXN5c2V4JywgJ21pZGlTeXNleCddLFxuXSk7XG4vKipcbiAqIHtAbGluayBCcm93c2VyfSByZXByZXNlbnRzIGEgYnJvd3NlciBpbnN0YW5jZSB0aGF0IGlzIGVpdGhlcjpcbiAqXG4gKiAtIGNvbm5lY3RlZCB0byB2aWEge0BsaW5rIFB1cHBldGVlci5jb25uZWN0fSBvclxuICogLSBsYXVuY2hlZCBieSB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXVuY2h9LlxuICpcbiAqIHtAbGluayBCcm93c2VyfSB7QGxpbmsgRXZlbnRFbWl0dGVyLmVtaXQgfCBlbWl0c30gdmFyaW91cyBldmVudHMgd2hpY2ggYXJlXG4gKiBkb2N1bWVudGVkIGluIHRoZSB7QGxpbmsgQnJvd3NlckV2ZW50fSBlbnVtLlxuICpcbiAqIEBleGFtcGxlIFVzaW5nIGEge0BsaW5rIEJyb3dzZXJ9IHRvIGNyZWF0ZSBhIHtAbGluayBQYWdlfTpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICpcbiAqIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gKiBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vZXhhbXBsZS5jb20nKTtcbiAqIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIERpc2Nvbm5lY3RpbmcgZnJvbSBhbmQgcmVjb25uZWN0aW5nIHRvIGEge0BsaW5rIEJyb3dzZXJ9OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gKlxuICogY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqIC8vIFN0b3JlIHRoZSBlbmRwb2ludCB0byBiZSBhYmxlIHRvIHJlY29ubmVjdCB0byB0aGUgYnJvd3Nlci5cbiAqIGNvbnN0IGJyb3dzZXJXU0VuZHBvaW50ID0gYnJvd3Nlci53c0VuZHBvaW50KCk7XG4gKiAvLyBEaXNjb25uZWN0IHB1cHBldGVlciBmcm9tIHRoZSBicm93c2VyLlxuICogYXdhaXQgYnJvd3Nlci5kaXNjb25uZWN0KCk7XG4gKlxuICogLy8gVXNlIHRoZSBlbmRwb2ludCB0byByZWVzdGFibGlzaCBhIGNvbm5lY3Rpb25cbiAqIGNvbnN0IGJyb3dzZXIyID0gYXdhaXQgcHVwcGV0ZWVyLmNvbm5lY3Qoe2Jyb3dzZXJXU0VuZHBvaW50fSk7XG4gKiAvLyBDbG9zZSB0aGUgYnJvd3Nlci5cbiAqIGF3YWl0IGJyb3dzZXIyLmNsb3NlKCk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBCcm93c2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgdW50aWwgYSB7QGxpbmsgVGFyZ2V0IHwgdGFyZ2V0fSBtYXRjaGluZyB0aGUgZ2l2ZW4gYHByZWRpY2F0ZWBcbiAgICAgKiBhcHBlYXJzIGFuZCByZXR1cm5zIGl0LlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGxvb2sgYWxsIG9wZW4ge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0c30uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBGaW5kaW5nIGEgdGFyZ2V0IGZvciBhIHBhZ2Ugb3BlbmVkIHZpYSBgd2luZG93Lm9wZW5gOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHdpbmRvdy5vcGVuKCdodHRwczovL3d3dy5leGFtcGxlLmNvbS8nKSk7XG4gICAgICogY29uc3QgbmV3V2luZG93VGFyZ2V0ID0gYXdhaXQgYnJvd3Nlci53YWl0Rm9yVGFyZ2V0KFxuICAgICAqICAgdGFyZ2V0ID0+IHRhcmdldC51cmwoKSA9PT0gJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tLydcbiAgICAgKiApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JUYXJnZXQocHJlZGljYXRlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyB0aW1lb3V0OiBtcyA9IDMwMDAwIH0gPSBvcHRpb25zO1xuICAgICAgICByZXR1cm4gYXdhaXQgZmlyc3RWYWx1ZUZyb20obWVyZ2UoZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInRhcmdldGNyZWF0ZWRcIiAvKiBCcm93c2VyRXZlbnQuVGFyZ2V0Q3JlYXRlZCAqLyksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJ0YXJnZXRjaGFuZ2VkXCIgLyogQnJvd3NlckV2ZW50LlRhcmdldENoYW5nZWQgKi8pLCBmcm9tKHRoaXMudGFyZ2V0cygpKSkucGlwZShmaWx0ZXJBc3luYyhwcmVkaWNhdGUpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGxpc3Qgb2YgYWxsIG9wZW4ge0BsaW5rIFBhZ2UgfCBwYWdlc30gaW5zaWRlIHRoaXMge0BsaW5rIEJyb3dzZXJ9LlxuICAgICAqXG4gICAgICogSWYgdGhlcmUgYXIgbXVsdGlwbGUge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0c30sIHRoaXNcbiAgICAgKiByZXR1cm5zIGFsbCB7QGxpbmsgUGFnZSB8IHBhZ2VzfSBpbiBhbGxcbiAgICAgKiB7QGxpbmsgQnJvd3NlckNvbnRleHQgfCBicm93c2VyIGNvbnRleHRzfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzIE5vbi12aXNpYmxlIHtAbGluayBQYWdlIHwgcGFnZXN9LCBzdWNoIGFzIGBcImJhY2tncm91bmRfcGFnZVwiYCxcbiAgICAgKiB3aWxsIG5vdCBiZSBsaXN0ZWQgaGVyZS4gWW91IGNhbiBmaW5kIHRoZW0gdXNpbmcge0BsaW5rIFRhcmdldC5wYWdlfS5cbiAgICAgKi9cbiAgICBhc3luYyBwYWdlcygpIHtcbiAgICAgICAgY29uc3QgY29udGV4dFBhZ2VzID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5icm93c2VyQ29udGV4dHMoKS5tYXAoY29udGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5wYWdlcygpO1xuICAgICAgICB9KSk7XG4gICAgICAgIC8vIEZsYXR0ZW4gYXJyYXkuXG4gICAgICAgIHJldHVybiBjb250ZXh0UGFnZXMucmVkdWNlKChhY2MsIHgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhY2MuY29uY2F0KHgpO1xuICAgICAgICB9LCBbXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgUHVwcGV0ZWVyIGlzIGNvbm5lY3RlZCB0byB0aGlzIHtAbGluayBCcm93c2VyIHwgYnJvd3Nlcn0uXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEJyb3dzZXIgfCBCcm93c2VyLmNvbm5lY3RlZH0uXG4gICAgICovXG4gICAgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFtkaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvY2VzcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmNsb3NlKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5kaXNjb25uZWN0KCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbYXN5bmNEaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvY2VzcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgbWVyZ2UsIHJhY2VXaXRoLCB9IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIGZyb21FbWl0dGVyRXZlbnQsIGZpbHRlckFzeW5jLCB0aW1lb3V0LCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzeW5jRGlzcG9zZVN5bWJvbCwgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG5pbXBvcnQgeyBNdXRleCB9IGZyb20gJy4uL3V0aWwvTXV0ZXguanMnO1xuLyoqXG4gKiB7QGxpbmsgQnJvd3NlckNvbnRleHR9IHJlcHJlc2VudHMgaW5kaXZpZHVhbCB1c2VyIGNvbnRleHRzIHdpdGhpbiBhXG4gKiB7QGxpbmsgQnJvd3NlciB8IGJyb3dzZXJ9LlxuICpcbiAqIFdoZW4gYSB7QGxpbmsgQnJvd3NlciB8IGJyb3dzZXJ9IGlzIGxhdW5jaGVkLCBpdCBoYXMgYSBzaW5nbGVcbiAqIHtAbGluayBCcm93c2VyQ29udGV4dCB8IGJyb3dzZXIgY29udGV4dH0gYnkgZGVmYXVsdC4gT3RoZXJzIGNhbiBiZSBjcmVhdGVkXG4gKiB1c2luZyB7QGxpbmsgQnJvd3Nlci5jcmVhdGVCcm93c2VyQ29udGV4dH0uIEVhY2ggY29udGV4dCBoYXMgaXNvbGF0ZWQgc3RvcmFnZVxuICogKGNvb2tpZXMvbG9jYWxTdG9yYWdlL2V0Yy4pXG4gKlxuICoge0BsaW5rIEJyb3dzZXJDb250ZXh0fSB7QGxpbmsgRXZlbnRFbWl0dGVyIHwgZW1pdHN9IHZhcmlvdXMgZXZlbnRzIHdoaWNoIGFyZVxuICogZG9jdW1lbnRlZCBpbiB0aGUge0BsaW5rIEJyb3dzZXJDb250ZXh0RXZlbnR9IGVudW0uXG4gKlxuICogSWYgYSB7QGxpbmsgUGFnZSB8IHBhZ2V9IG9wZW5zIGFub3RoZXIge0BsaW5rIFBhZ2UgfCBwYWdlfSwgZS5nLiB1c2luZ1xuICogYHdpbmRvdy5vcGVuYCwgdGhlIHBvcHVwIHdpbGwgYmVsb25nIHRvIHRoZSBwYXJlbnQge0BsaW5rIFBhZ2UuYnJvd3NlckNvbnRleHRcbiAqIHwgcGFnZSdzIGJyb3dzZXIgY29udGV4dH0uXG4gKlxuICogQGV4YW1wbGUgQ3JlYXRpbmcgYSBuZXcge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0fTpcbiAqXG4gKiBgYGB0c1xuICogLy8gQ3JlYXRlIGEgbmV3IGJyb3dzZXIgY29udGV4dFxuICogY29uc3QgY29udGV4dCA9IGF3YWl0IGJyb3dzZXIuY3JlYXRlQnJvd3NlckNvbnRleHQoKTtcbiAqIC8vIENyZWF0ZSBhIG5ldyBwYWdlIGluc2lkZSBjb250ZXh0LlxuICogY29uc3QgcGFnZSA9IGF3YWl0IGNvbnRleHQubmV3UGFnZSgpO1xuICogLy8gLi4uIGRvIHN0dWZmIHdpdGggcGFnZSAuLi5cbiAqIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICogLy8gRGlzcG9zZSBjb250ZXh0IG9uY2UgaXQncyBubyBsb25nZXIgbmVlZGVkLlxuICogYXdhaXQgY29udGV4dC5jbG9zZSgpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckNvbnRleHQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBkZWZpbmVkLCBpbmRpY2F0ZXMgYW4gb25nb2luZyBzY3JlZW5zaG90IG9wZXJlYXRpb24uXG4gICAgICovXG4gICAgI3BhZ2VTY3JlZW5zaG90TXV0ZXg7XG4gICAgI3NjcmVlbnNob3RPcGVyYXRpb25zQ291bnQgPSAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXJ0U2NyZWVuc2hvdCgpIHtcbiAgICAgICAgY29uc3QgbXV0ZXggPSB0aGlzLiNwYWdlU2NyZWVuc2hvdE11dGV4IHx8IG5ldyBNdXRleCgpO1xuICAgICAgICB0aGlzLiNwYWdlU2NyZWVuc2hvdE11dGV4ID0gbXV0ZXg7XG4gICAgICAgIHRoaXMuI3NjcmVlbnNob3RPcGVyYXRpb25zQ291bnQrKztcbiAgICAgICAgcmV0dXJuIG11dGV4LmFjcXVpcmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jc2NyZWVuc2hvdE9wZXJhdGlvbnNDb3VudC0tO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3NjcmVlbnNob3RPcGVyYXRpb25zQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG11dGV4IHRvIGluZGljYXRlIG5vIG9uZ29pbmcgc2NyZWVuc2hvdCBvcGVyYXRpb24uXG4gICAgICAgICAgICAgICAgdGhpcy4jcGFnZVNjcmVlbnNob3RNdXRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHdhaXRGb3JTY3JlZW5zaG90T3BlcmF0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3BhZ2VTY3JlZW5zaG90TXV0ZXg/LmFjcXVpcmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgdW50aWwgYSB7QGxpbmsgVGFyZ2V0IHwgdGFyZ2V0fSBtYXRjaGluZyB0aGUgZ2l2ZW4gYHByZWRpY2F0ZWBcbiAgICAgKiBhcHBlYXJzIGFuZCByZXR1cm5zIGl0LlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGxvb2sgYWxsIG9wZW4ge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0c30uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBGaW5kaW5nIGEgdGFyZ2V0IGZvciBhIHBhZ2Ugb3BlbmVkIHZpYSBgd2luZG93Lm9wZW5gOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHdpbmRvdy5vcGVuKCdodHRwczovL3d3dy5leGFtcGxlLmNvbS8nKSk7XG4gICAgICogY29uc3QgbmV3V2luZG93VGFyZ2V0ID0gYXdhaXQgYnJvd3NlckNvbnRleHQud2FpdEZvclRhcmdldChcbiAgICAgKiAgIHRhcmdldCA9PiB0YXJnZXQudXJsKCkgPT09ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8nXG4gICAgICogKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyB3YWl0Rm9yVGFyZ2V0KHByZWRpY2F0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgdGltZW91dDogbXMgPSAzMDAwMCB9ID0gb3B0aW9ucztcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1lcmdlKGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJ0YXJnZXRjcmVhdGVkXCIgLyogQnJvd3NlckNvbnRleHRFdmVudC5UYXJnZXRDcmVhdGVkICovKSwgZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInRhcmdldGNoYW5nZWRcIiAvKiBCcm93c2VyQ29udGV4dEV2ZW50LlRhcmdldENoYW5nZWQgKi8pLCBmcm9tKHRoaXMudGFyZ2V0cygpKSkucGlwZShmaWx0ZXJBc3luYyhwcmVkaWNhdGUpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIHtAbGluayBCcm93c2VyQ29udGV4dCB8IGJyb3dzZXIgY29udGV4dH0gaXMgY2xvc2VkLlxuICAgICAqL1xuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5icm93c2VyKCkuYnJvd3NlckNvbnRleHRzKCkuaW5jbHVkZXModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoaXMge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0fS5cbiAgICAgKi9cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHJldHVybiB2b2lkIHRoaXMuY2xvc2UoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFthc3luY0Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJDb250ZXh0LmpzLm1hcCIsImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuLyoqXG4gKiBFdmVudHMgdGhhdCB0aGUgQ0RQU2Vzc2lvbiBjbGFzcyBlbWl0cy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIENEUFNlc3Npb25FdmVudDtcbihmdW5jdGlvbiAoQ0RQU2Vzc2lvbkV2ZW50KSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQgPSBTeW1ib2woJ0NEUFNlc3Npb24uRGlzY29ubmVjdGVkJyk7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIENEUFNlc3Npb25FdmVudC5Td2FwcGVkID0gU3ltYm9sKCdDRFBTZXNzaW9uLlN3YXBwZWQnKTtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHNlc3Npb24gaXMgcmVhZHkgdG8gYmUgY29uZmlndXJlZCBkdXJpbmcgdGhlIGF1dG8tYXR0YWNoXG4gICAgICogcHJvY2Vzcy4gUmlnaHQgYWZ0ZXIgdGhlIGV2ZW50IGlzIGhhbmRsZWQsIHRoZSBzZXNzaW9uIHdpbGwgYmUgcmVzdW1lZC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIENEUFNlc3Npb25FdmVudC5SZWFkeSA9IFN5bWJvbCgnQ0RQU2Vzc2lvbi5SZWFkeScpO1xuICAgIENEUFNlc3Npb25FdmVudC5TZXNzaW9uQXR0YWNoZWQgPSAnc2Vzc2lvbmF0dGFjaGVkJztcbiAgICBDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkID0gJ3Nlc3Npb25kZXRhY2hlZCc7XG59KShDRFBTZXNzaW9uRXZlbnQgfHwgKENEUFNlc3Npb25FdmVudCA9IHt9KSk7XG4vKipcbiAqIFRoZSBgQ0RQU2Vzc2lvbmAgaW5zdGFuY2VzIGFyZSB1c2VkIHRvIHRhbGsgcmF3IENocm9tZSBEZXZ0b29scyBQcm90b2NvbC5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIFByb3RvY29sIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCB3aXRoIHtAbGluayBDRFBTZXNzaW9uLnNlbmR9IG1ldGhvZCBhbmQgcHJvdG9jb2xcbiAqIGV2ZW50cyBjYW4gYmUgc3Vic2NyaWJlZCB0byB3aXRoIGBDRFBTZXNzaW9uLm9uYCBtZXRob2QuXG4gKlxuICogVXNlZnVsIGxpbmtzOiB7QGxpbmsgaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvIHwgRGV2VG9vbHMgUHJvdG9jb2wgVmlld2VyfVxuICogYW5kIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNsdXNobmlrb3YvZ2V0dGluZy1zdGFydGVkLXdpdGgtY2RwL2Jsb2IvSEVBRC9SRUFETUUubWQgfCBHZXR0aW5nIFN0YXJ0ZWQgd2l0aCBEZXZUb29scyBQcm90b2NvbH0uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgY2xpZW50ID0gYXdhaXQgcGFnZS5jcmVhdGVDRFBTZXNzaW9uKCk7XG4gKiBhd2FpdCBjbGllbnQuc2VuZCgnQW5pbWF0aW9uLmVuYWJsZScpO1xuICogY2xpZW50Lm9uKCdBbmltYXRpb24uYW5pbWF0aW9uQ3JlYXRlZCcsICgpID0+XG4gKiAgIGNvbnNvbGUubG9nKCdBbmltYXRpb24gY3JlYXRlZCEnKVxuICogKTtcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnNlbmQoJ0FuaW1hdGlvbi5nZXRQbGF5YmFja1JhdGUnKTtcbiAqIGNvbnNvbGUubG9nKCdwbGF5YmFjayByYXRlIGlzICcgKyByZXNwb25zZS5wbGF5YmFja1JhdGUpO1xuICogYXdhaXQgY2xpZW50LnNlbmQoJ0FuaW1hdGlvbi5zZXRQbGF5YmFja1JhdGUnLCB7XG4gKiAgIHBsYXliYWNrUmF0ZTogcmVzcG9uc2UucGxheWJhY2tSYXRlIC8gMixcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQ0RQU2Vzc2lvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcmVudCBzZXNzaW9uIGluIHRlcm1zIG9mIENEUCdzIGF1dG8tYXR0YWNoIG1lY2hhbmlzbS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHBhcmVudFNlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q0RQU2Vzc2lvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuLyoqXG4gKiBEaWFsb2cgaW5zdGFuY2VzIGFyZSBkaXNwYXRjaGVkIGJ5IHRoZSB7QGxpbmsgUGFnZX0gdmlhIHRoZSBgZGlhbG9nYCBldmVudC5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAqXG4gKiAoYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiAgIHBhZ2Uub24oJ2RpYWxvZycsIGFzeW5jIGRpYWxvZyA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coZGlhbG9nLm1lc3NhZ2UoKSk7XG4gKiAgICAgYXdhaXQgZGlhbG9nLmRpc21pc3MoKTtcbiAqICAgICBhd2FpdCBicm93c2VyLmNsb3NlKCk7XG4gKiAgIH0pO1xuICogICBwYWdlLmV2YWx1YXRlKCgpID0+IGFsZXJ0KCcxJykpO1xuICogfSkoKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERpYWxvZyB7XG4gICAgI3R5cGU7XG4gICAgI21lc3NhZ2U7XG4gICAgI2RlZmF1bHRWYWx1ZTtcbiAgICAjaGFuZGxlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSA9ICcnKSB7XG4gICAgICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLiNtZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy4jZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0eXBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWVzc2FnZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByb21wdCwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBkaWFsb2dcbiAgICAgKiBpcyBub3QgYSBgcHJvbXB0YC5cbiAgICAgKi9cbiAgICBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRpYWxvZyBoYXMgYmVlbiBhY2NlcHRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9tcHRUZXh0IC0gb3B0aW9uYWwgdGV4dCB0aGF0IHdpbGwgYmUgZW50ZXJlZCBpbiB0aGUgZGlhbG9nXG4gICAgICogcHJvbXB0LiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBkaWFsb2cncyB0eXBlIGlzIG5vdCBgcHJvbXB0YC5cbiAgICAgKlxuICAgICAqL1xuICAgIGFzeW5jIGFjY2VwdChwcm9tcHRUZXh0KSB7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBhY2NlcHQgZGlhbG9nIHdoaWNoIGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgdGhpcy4jaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlKHtcbiAgICAgICAgICAgIGFjY2VwdDogdHJ1ZSxcbiAgICAgICAgICAgIHRleHQ6IHByb21wdFRleHQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIG9uY2UgdGhlIGRpYWxvZyBoYXMgYmVlbiBkaXNtaXNzZWRcbiAgICAgKi9cbiAgICBhc3luYyBkaXNtaXNzKCkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2hhbmRsZWQsICdDYW5ub3QgZGlzbWlzcyBkaWFsb2cgd2hpY2ggaXMgYWxyZWFkeSBoYW5kbGVkIScpO1xuICAgICAgICB0aGlzLiNoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGUoe1xuICAgICAgICAgICAgYWNjZXB0OiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGlhbG9nLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG52YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xudmFyIF9fc2V0RnVuY3Rpb25OYW1lID0gKHRoaXMgJiYgdGhpcy5fX3NldEZ1bmN0aW9uTmFtZSkgfHwgZnVuY3Rpb24gKGYsIG5hbWUsIHByZWZpeCkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5pbXBvcnQgeyBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvciB9IGZyb20gJy4uL2NvbW1vbi9HZXRRdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4uL2NvbW1vbi9MYXp5QXJnLmpzJztcbmltcG9ydCB7IGlzU3RyaW5nLCB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgQXN5bmNJdGVyYWJsZVV0aWwgfSBmcm9tICcuLi91dGlsL0FzeW5jSXRlcmFibGVVdGlsLmpzJztcbmltcG9ydCB7IHRocm93SWZEaXNwb3NlZCB9IGZyb20gJy4uL3V0aWwvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBfaXNFbGVtZW50SGFuZGxlIH0gZnJvbSAnLi9FbGVtZW50SGFuZGxlU3ltYm9sLmpzJztcbmltcG9ydCB7IEpTSGFuZGxlIH0gZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG4vKipcbiAqIEVsZW1lbnRIYW5kbGUgcmVwcmVzZW50cyBhbiBpbi1wYWdlIERPTSBlbGVtZW50LlxuICpcbiAqIEByZW1hcmtzXG4gKiBFbGVtZW50SGFuZGxlcyBjYW4gYmUgY3JlYXRlZCB3aXRoIHRoZSB7QGxpbmsgUGFnZS4kfSBtZXRob2QuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAqXG4gKiAoYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiAgIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICogICBjb25zdCBocmVmRWxlbWVudCA9IGF3YWl0IHBhZ2UuJCgnYScpO1xuICogICBhd2FpdCBocmVmRWxlbWVudC5jbGljaygpO1xuICogICAvLyAuLi5cbiAqIH0pKCk7XG4gKiBgYGBcbiAqXG4gKiBFbGVtZW50SGFuZGxlIHByZXZlbnRzIHRoZSBET00gZWxlbWVudCBmcm9tIGJlaW5nIGdhcmJhZ2UtY29sbGVjdGVkIHVubGVzcyB0aGVcbiAqIGhhbmRsZSBpcyB7QGxpbmsgSlNIYW5kbGUuZGlzcG9zZSB8IGRpc3Bvc2VkfS4gRWxlbWVudEhhbmRsZXMgYXJlIGF1dG8tZGlzcG9zZWRcbiAqIHdoZW4gdGhlaXIgb3JpZ2luIGZyYW1lIGdldHMgbmF2aWdhdGVkLlxuICpcbiAqIEVsZW1lbnRIYW5kbGUgaW5zdGFuY2VzIGNhbiBiZSB1c2VkIGFzIGFyZ3VtZW50cyBpbiB7QGxpbmsgUGFnZS4kZXZhbH0gYW5kXG4gKiB7QGxpbmsgUGFnZS5ldmFsdWF0ZX0gbWV0aG9kcy5cbiAqXG4gKiBJZiB5b3UncmUgdXNpbmcgVHlwZVNjcmlwdCwgRWxlbWVudEhhbmRsZSB0YWtlcyBhIGdlbmVyaWMgYXJndW1lbnQgdGhhdFxuICogZGVub3RlcyB0aGUgdHlwZSBvZiBlbGVtZW50IHRoZSBoYW5kbGUgaXMgaG9sZGluZyB3aXRoaW4uIEZvciBleGFtcGxlLCBpZiB5b3VcbiAqIGhhdmUgYSBoYW5kbGUgdG8gYSBgPHNlbGVjdD5gIGVsZW1lbnQsIHlvdSBjYW4gdHlwZSBpdCBhc1xuICogYEVsZW1lbnRIYW5kbGU8SFRNTFNlbGVjdEVsZW1lbnQ+YCBhbmQgeW91IGdldCBzb21lIG5pY2VyIHR5cGUgY2hlY2tzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xubGV0IEVsZW1lbnRIYW5kbGUgPSAoKCkgPT4ge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tLCBfbywgX3AsIF9xLCBfciwgX3MsIF90LCBfdSwgX3YsIF93LCBfeCwgX3ksIF96LCBfMCwgXzEsIF8yLCBfMywgXzQsIF81O1xuICAgIGxldCBfY2xhc3NTdXBlciA9IEpTSGFuZGxlO1xuICAgIGxldCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfZ2V0UHJvcGVydHlfZGVjb3JhdG9ycztcbiAgICBsZXQgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycztcbiAgICBsZXQgX2pzb25WYWx1ZV9kZWNvcmF0b3JzO1xuICAgIGxldCBfJF9kZWNvcmF0b3JzO1xuICAgIGxldCBfJCRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfJCRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfJCRfZGVzY3JpcHRvcjtcbiAgICBsZXQgX3dhaXRGb3JTZWxlY3Rvcl9kZWNvcmF0b3JzO1xuICAgIGxldCBfaXNWaXNpYmxlX2RlY29yYXRvcnM7XG4gICAgbGV0IF9pc0hpZGRlbl9kZWNvcmF0b3JzO1xuICAgIGxldCBfdG9FbGVtZW50X2RlY29yYXRvcnM7XG4gICAgbGV0IF9jbGlja2FibGVQb2ludF9kZWNvcmF0b3JzO1xuICAgIGxldCBfaG92ZXJfZGVjb3JhdG9ycztcbiAgICBsZXQgX2NsaWNrX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcmFnX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcmFnRW50ZXJfZGVjb3JhdG9ycztcbiAgICBsZXQgX2RyYWdPdmVyX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcm9wX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcmFnQW5kRHJvcF9kZWNvcmF0b3JzO1xuICAgIGxldCBfc2VsZWN0X2RlY29yYXRvcnM7XG4gICAgbGV0IF90YXBfZGVjb3JhdG9ycztcbiAgICBsZXQgX3RvdWNoU3RhcnRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3RvdWNoTW92ZV9kZWNvcmF0b3JzO1xuICAgIGxldCBfdG91Y2hFbmRfZGVjb3JhdG9ycztcbiAgICBsZXQgX2ZvY3VzX2RlY29yYXRvcnM7XG4gICAgbGV0IF90eXBlX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcmVzc19kZWNvcmF0b3JzO1xuICAgIGxldCBfYm91bmRpbmdCb3hfZGVjb3JhdG9ycztcbiAgICBsZXQgX2JveE1vZGVsX2RlY29yYXRvcnM7XG4gICAgbGV0IF9zY3JlZW5zaG90X2RlY29yYXRvcnM7XG4gICAgbGV0IF9pc0ludGVyc2VjdGluZ1ZpZXdwb3J0X2RlY29yYXRvcnM7XG4gICAgbGV0IF9zY3JvbGxJbnRvVmlld19kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBFbGVtZW50SGFuZGxlIGV4dGVuZHMgX2NsYXNzU3VwZXIge1xuICAgICAgICBzdGF0aWMge1xuICAgICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9nZXRQcm9wZXJ0eV9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX2EgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfYSldO1xuICAgICAgICAgICAgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9iID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2IpXTtcbiAgICAgICAgICAgIF9qc29uVmFsdWVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9jID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2MpXTtcbiAgICAgICAgICAgIF8kX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfZCA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9kKV07XG4gICAgICAgICAgICBfJCRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKV07XG4gICAgICAgICAgICBfcHJpdmF0ZV8kJF9kZWNvcmF0b3JzID0gWyhfZSA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9lKV07XG4gICAgICAgICAgICBfd2FpdEZvclNlbGVjdG9yX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfZiA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9mKV07XG4gICAgICAgICAgICBfaXNWaXNpYmxlX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfZyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9nKV07XG4gICAgICAgICAgICBfaXNIaWRkZW5fZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9oID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2gpXTtcbiAgICAgICAgICAgIF90b0VsZW1lbnRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9qID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2opXTtcbiAgICAgICAgICAgIF9jbGlja2FibGVQb2ludF9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX2sgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfayldO1xuICAgICAgICAgICAgX2hvdmVyX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfbCA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9sKV07XG4gICAgICAgICAgICBfY2xpY2tfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9tID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX20pXTtcbiAgICAgICAgICAgIF9kcmFnX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfbyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9vKV07XG4gICAgICAgICAgICBfZHJhZ0VudGVyX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfcCA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9wKV07XG4gICAgICAgICAgICBfZHJhZ092ZXJfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9xID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3EpXTtcbiAgICAgICAgICAgIF9kcm9wX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfciA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9yKV07XG4gICAgICAgICAgICBfZHJhZ0FuZERyb3BfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9zID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3MpXTtcbiAgICAgICAgICAgIF9zZWxlY3RfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF90ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3QpXTtcbiAgICAgICAgICAgIF90YXBfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF91ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3UpXTtcbiAgICAgICAgICAgIF90b3VjaFN0YXJ0X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfdiA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF92KV07XG4gICAgICAgICAgICBfdG91Y2hNb3ZlX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfdyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF93KV07XG4gICAgICAgICAgICBfdG91Y2hFbmRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF94ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3gpXTtcbiAgICAgICAgICAgIF9mb2N1c19kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX3kgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfeSldO1xuICAgICAgICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF96ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3opXTtcbiAgICAgICAgICAgIF9wcmVzc19kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoXzAgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfMCldO1xuICAgICAgICAgICAgX2JvdW5kaW5nQm94X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfMSA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF8xKV07XG4gICAgICAgICAgICBfYm94TW9kZWxfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF8yID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoXzIpXTtcbiAgICAgICAgICAgIF9zY3JlZW5zaG90X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfMyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF8zKV07XG4gICAgICAgICAgICBfaXNJbnRlcnNlY3RpbmdWaWV3cG9ydF9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoXzQgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfNCldO1xuICAgICAgICAgICAgX3Njcm9sbEludG9WaWV3X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfNSA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF81KV07XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2dldFByb3BlcnR5X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJnZXRQcm9wZXJ0eVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZ2V0UHJvcGVydHlcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5nZXRQcm9wZXJ0eSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZ2V0UHJvcGVydGllc19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZ2V0UHJvcGVydGllc1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZ2V0UHJvcGVydGllc1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmdldFByb3BlcnRpZXMgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2pzb25WYWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwianNvblZhbHVlXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJqc29uVmFsdWVcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5qc29uVmFsdWUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgXyRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIiRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai4kIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF8kJF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiJCRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIiQkXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouJCQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfJCRfZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jJCRpbXBsKHNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICB9LCBcIiMkJFwiKSB9LCBfcHJpdmF0ZV8kJF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiIyQkXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjJCQgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouIyQkIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF93YWl0Rm9yU2VsZWN0b3JfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIndhaXRGb3JTZWxlY3RvclwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwid2FpdEZvclNlbGVjdG9yXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoud2FpdEZvclNlbGVjdG9yIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9pc1Zpc2libGVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImlzVmlzaWJsZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiaXNWaXNpYmxlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaXNWaXNpYmxlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9pc0hpZGRlbl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiaXNIaWRkZW5cIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImlzSGlkZGVuXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaXNIaWRkZW4gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RvRWxlbWVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidG9FbGVtZW50XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ0b0VsZW1lbnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50b0VsZW1lbnQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2NsaWNrYWJsZVBvaW50X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJjbGlja2FibGVQb2ludFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiY2xpY2thYmxlUG9pbnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5jbGlja2FibGVQb2ludCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfaG92ZXJfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImhvdmVyXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJob3ZlclwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmhvdmVyIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9jbGlja19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiY2xpY2tcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImNsaWNrXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouY2xpY2sgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2RyYWdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImRyYWdcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyYWdcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5kcmFnIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9kcmFnRW50ZXJfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImRyYWdFbnRlclwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZHJhZ0VudGVyXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZHJhZ0VudGVyIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9kcmFnT3Zlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZHJhZ092ZXJcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyYWdPdmVyXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZHJhZ092ZXIgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2Ryb3BfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImRyb3BcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyb3BcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5kcm9wIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9kcmFnQW5kRHJvcF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZHJhZ0FuZERyb3BcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyYWdBbmREcm9wXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZHJhZ0FuZERyb3AgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3NlbGVjdF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2VsZWN0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzZWxlY3RcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5zZWxlY3QgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RhcF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidGFwXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ0YXBcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50YXAgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RvdWNoU3RhcnRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInRvdWNoU3RhcnRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInRvdWNoU3RhcnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50b3VjaFN0YXJ0IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF90b3VjaE1vdmVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInRvdWNoTW92ZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwidG91Y2hNb3ZlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudG91Y2hNb3ZlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF90b3VjaEVuZF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidG91Y2hFbmRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInRvdWNoRW5kXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudG91Y2hFbmQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2ZvY3VzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJmb2N1c1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZm9jdXNcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5mb2N1cyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfdHlwZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidHlwZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwidHlwZVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnR5cGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3ByZXNzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJwcmVzc1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwicHJlc3NcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5wcmVzcyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfYm91bmRpbmdCb3hfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImJvdW5kaW5nQm94XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJib3VuZGluZ0JveFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmJvdW5kaW5nQm94IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9ib3hNb2RlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiYm94TW9kZWxcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImJveE1vZGVsXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYm94TW9kZWwgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3NjcmVlbnNob3RfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInNjcmVlbnNob3RcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInNjcmVlbnNob3RcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5zY3JlZW5zaG90IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9pc0ludGVyc2VjdGluZ1ZpZXdwb3J0X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJpc0ludGVyc2VjdGluZ1ZpZXdwb3J0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJpc0ludGVyc2VjdGluZ1ZpZXdwb3J0XCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaXNJbnRlcnNlY3RpbmdWaWV3cG9ydCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2Nyb2xsSW50b1ZpZXdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInNjcm9sbEludG9WaWV3XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzY3JvbGxJbnRvVmlld1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNjcm9sbEludG9WaWV3IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICogQ2FjaGVkIGlzb2xhdGVkSGFuZGxlIHRvIHByZXZlbnRcbiAgICAgICAgICogdHJ5aW5nIHRvIGFkb3B0IGl0IG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAqL1xuICAgICAgICBpc29sYXRlZEhhbmRsZSA9IF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXMsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZ2l2ZW4gbWV0aG9kIHdpbGwgaGF2ZSBpdCdzIGB0aGlzYCByZXBsYWNlZCB3aXRoIGFuIGlzb2xhdGVkIHZlcnNpb24gb2ZcbiAgICAgICAgICogYHRoaXNgIHdoZW4gZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEFsbCBjaGFuZ2VzIG9mIGlzb2xhdGVkIGB0aGlzYCBhcmUgcmVmbGVjdGVkIG9uIHRoZSBhY3R1YWwgYHRoaXNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHN0YXRpYyBiaW5kSXNvbGF0ZWRIYW5kbGUodGFyZ2V0LCBfKSB7XG4gICAgICAgICAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaGFuZGxlIGlzIGFscmVhZHkgaXNvbGF0ZWQsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBhZG9wdCBpdFxuICAgICAgICAgICAgICAgIC8vIGFnYWluLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWxtID09PSB0aGlzLmZyYW1lLmlzb2xhdGVkUmVhbG0oKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGFyZ2V0LmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBhZG9wdGVkVGhpcztcbiAgICAgICAgICAgICAgICBpZiAodGhpc1snaXNvbGF0ZWRIYW5kbGUnXSkge1xuICAgICAgICAgICAgICAgICAgICBhZG9wdGVkVGhpcyA9IHRoaXNbJ2lzb2xhdGVkSGFuZGxlJ107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzWydpc29sYXRlZEhhbmRsZSddID0gYWRvcHRlZFRoaXMgPSBhd2FpdCB0aGlzLmZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRvcHRIYW5kbGUodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5jYWxsKGFkb3B0ZWRUaGlzLCAuLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBgYWRvcHRlZFRoaXNgLCB0aGVuIHdlIHJldHVybiBgdGhpc2AuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gYWRvcHRlZFRoaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgaGFuZGxlLCB0cmFuc2ZlciBpdCBpbnRvIHRoZSBjdXJyZW50IHJlYWxtLlxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBKU0hhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWFsbS50cmFuc2ZlckhhbmRsZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSBvZiBoYW5kbGVycywgdHJhbnNmZXIgdGhlbSBpbnRvIHRoZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcmVhbG0uXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChyZXN1bHQubWFwKGFzeW5jIChpdGVtLCBpbmRleCwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEpTSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGF3YWl0IHRoaXMucmVhbG0udHJhbnNmZXJIYW5kbGUoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbLi4ucmVzdWx0LmVudHJpZXMoKV0ubWFwKGFzeW5jIChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEpTSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIGF3YWl0IHRoaXMucmVhbG0udHJhbnNmZXJIYW5kbGUodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBoYW5kbGU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0cnVjdG9yKGhhbmRsZSkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlO1xuICAgICAgICAgICAgdGhpc1tfaXNFbGVtZW50SGFuZGxlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0IGlkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLmlkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZS5kaXNwb3NlZDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGdldFByb3BlcnRpZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGUuZ2V0UHJvcGVydGllcygpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICAgICAgcGFnZUZ1bmN0aW9uID0gd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSh0aGlzLmV2YWx1YXRlLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGUuZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBldmFsdWF0ZUhhbmRsZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy5ldmFsdWF0ZUhhbmRsZS5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlLmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMganNvblZhbHVlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlLmpzb25WYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgcmVtb3RlT2JqZWN0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLnJlbW90ZU9iamVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzRWxlbWVudCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBRdWVyaWVzIHRoZSBjdXJyZW50IGVsZW1lbnQgZm9yIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKiBAcmV0dXJucyBBIHtAbGluayBFbGVtZW50SGFuZGxlIHwgZWxlbWVudCBoYW5kbGV9IHRvIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICAgICAqIG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3Rvci4gT3RoZXJ3aXNlLCBgbnVsbGAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICBjb25zdCB7IHVwZGF0ZWRTZWxlY3RvciwgUXVlcnlIYW5kbGVyIH0gPSBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgICAgICByZXR1cm4gKGF3YWl0IFF1ZXJ5SGFuZGxlci5xdWVyeU9uZSh0aGlzLCB1cGRhdGVkU2VsZWN0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUXVlcmllcyB0aGUgY3VycmVudCBlbGVtZW50IGZvciBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB7QGxpbmsgRWxlbWVudEhhbmRsZSB8IGVsZW1lbnQgaGFuZGxlc30gdGhhdCBwb2ludCB0b1xuICAgICAgICAgKiBlbGVtZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkJChzZWxlY3Rvciwgb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmlzb2xhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuIyQkaW1wbChzZWxlY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jJCQoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJc29sYXRlcyB7QGxpbmsgRWxlbWVudEhhbmRsZS4kJH0gaWYgbmVlZGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGdldCAjJCQoKSB7IHJldHVybiBfcHJpdmF0ZV8kJF9kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIEVsZW1lbnRIYW5kbGUuJCR9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICMkJGltcGwoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlZFNlbGVjdG9yLCBRdWVyeUhhbmRsZXIgfSA9IGdldFF1ZXJ5SGFuZGxlckFuZFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBBc3luY0l0ZXJhYmxlVXRpbC5jb2xsZWN0KFF1ZXJ5SGFuZGxlci5xdWVyeUFsbCh0aGlzLCB1cGRhdGVkU2VsZWN0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gdGhlIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGluXG4gICAgICAgICAqIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdGlsbFxuICAgICAgICAgKiB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgdHdlZXRIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJy50d2VldCcpO1xuICAgICAgICAgKiBleHBlY3QoYXdhaXQgdHdlZXRIYW5kbGUuJGV2YWwoJy5saWtlJywgbm9kZSA9PiBub2RlLmlubmVyVGV4dCkpLnRvQmUoXG4gICAgICAgICAqICAgJzEwMCdcbiAgICAgICAgICogKTtcbiAgICAgICAgICogZXhwZWN0KGF3YWl0IHR3ZWV0SGFuZGxlLiRldmFsKCcucmV0d2VldHMnLCBub2RlID0+IG5vZGUuaW5uZXJUZXh0KSkudG9CZShcbiAgICAgICAgICogICAnMTAnXG4gICAgICAgICAqICk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKiBAcGFyYW0gcGFnZUZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZCBpbiB0aGlzIGVsZW1lbnQncyBwYWdlJ3NcbiAgICAgICAgICogY29udGV4dC4gVGhlIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yIHdpbGwgYmUgcGFzc2VkIGluIGFzIHRoZVxuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZfMSA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGFnZUZ1bmN0aW9uID0gd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSh0aGlzLiRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudEhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBhd2FpdCB0aGlzLiQoc2VsZWN0b3IpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3I6IGZhaWxlZCB0byBmaW5kIGVsZW1lbnQgbWF0Y2hpbmcgc2VsZWN0b3IgXCIke3NlbGVjdG9yfVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBlbGVtZW50SGFuZGxlLmV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgZW52XzEuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yXG4gICAgICAgICAqIGluIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdGlsbFxuICAgICAgICAgKiB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogSFRNTDpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgaHRtbFxuICAgICAgICAgKiA8ZGl2IGNsYXNzPVwiZmVlZFwiPlxuICAgICAgICAgKiAgIDxkaXYgY2xhc3M9XCJ0d2VldFwiPkhlbGxvITwvZGl2PlxuICAgICAgICAgKiAgIDxkaXYgY2xhc3M9XCJ0d2VldFwiPkhpITwvZGl2PlxuICAgICAgICAgKiA8L2Rpdj5cbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEphdmFTY3JpcHQ6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGZlZWRIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJy5mZWVkJyk7XG4gICAgICAgICAqIGV4cGVjdChcbiAgICAgICAgICogICBhd2FpdCBmZWVkSGFuZGxlLiQkZXZhbCgnLnR3ZWV0Jywgbm9kZXMgPT4gbm9kZXMubWFwKG4gPT4gbi5pbm5lclRleHQpKVxuICAgICAgICAgKiApLnRvRXF1YWwoWydIZWxsbyEnLCAnSGkhJ10pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC1cbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3NlbGVjdG9ycyB8IHNlbGVjdG9yfVxuICAgICAgICAgKiB0byBxdWVyeSBwYWdlIGZvci5cbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzIHwgQ1NTIHNlbGVjdG9yc31cbiAgICAgICAgICogY2FuIGJlIHBhc3NlZCBhcy1pcyBhbmQgYVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjbm9uLWNzcy1zZWxlY3RvcnMgfCBQdXBwZXRlZXItc3BlY2lmaWMgc2VsZWN0b3Igc3ludGF4fVxuICAgICAgICAgKiBhbGxvd3MgcXVlcmluZyBieVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjdGV4dC1zZWxlY3RvcnMtLXAtdGV4dCB8IHRleHR9LFxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjYXJpYS1zZWxlY3RvcnMtLXAtYXJpYSB8IGExMXkgcm9sZSBhbmQgbmFtZX0sXG4gICAgICAgICAqIGFuZFxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjeHBhdGgtc2VsZWN0b3JzLS1wLXhwYXRoIHwgeHBhdGh9XG4gICAgICAgICAqIGFuZFxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjcXVlcnlpbmctZWxlbWVudHMtaW4tc2hhZG93LWRvbSB8IGNvbWJpbmluZyB0aGVzZSBxdWVyaWVzIGFjcm9zcyBzaGFkb3cgcm9vdHN9LlxuICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNwZWNpZnkgdGhlIHNlbGVjdG9yIHR5cGUgdXNpbmcgYVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjcHJlZml4ZWQtc2VsZWN0b3Itc3ludGF4IHwgcHJlZml4fS5cbiAgICAgICAgICogQHBhcmFtIHBhZ2VGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBiZSBldmFsdWF0ZWQgaW4gdGhlIGVsZW1lbnQncyBwYWdlJ3NcbiAgICAgICAgICogY29udGV4dC4gQW4gYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIHdpbGwgYmUgcGFzc2VkIHRvXG4gICAgICAgICAqIHRoZSBmdW5jdGlvbiBhcyBpdHMgZmlyc3QgYXJndW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBgcGFnZUZ1bmN0aW9uYC5cbiAgICAgICAgICogQHJldHVybnMgQSBwcm9taXNlIHRvIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgJCRldmFsKHNlbGVjdG9yLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuJCRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuJCQoc2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzIsIGF3YWl0IHRoaXMuZXZhbHVhdGVIYW5kbGUoKF8sIC4uLmVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICAgICAgICAgICAgICB9LCAuLi5yZXN1bHRzKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5ldmFsdWF0ZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpLFxuICAgICAgICAgICAgICAgICAgICAuLi5yZXN1bHRzLm1hcChyZXN1bHRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzIpIHtcbiAgICAgICAgICAgICAgICBlbnZfMi5lcnJvciA9IGVfMjtcbiAgICAgICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXYWl0IGZvciBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciB0byBhcHBlYXIgaW4gdGhlIGN1cnJlbnRcbiAgICAgICAgICogZWxlbWVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogVW5saWtlIHtAbGluayBGcmFtZS53YWl0Rm9yU2VsZWN0b3J9LCB0aGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGFjcm9zc1xuICAgICAgICAgKiBuYXZpZ2F0aW9ucyBvciBpZiB0aGUgZWxlbWVudCBpcyBkZXRhY2hlZCBmcm9tIERPTS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKlxuICAgICAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgKiAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gICAgICAgICAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICAgKiAgIGxldCBjdXJyZW50VVJMO1xuICAgICAgICAgKiAgIHBhZ2VcbiAgICAgICAgICogICAgIC5tYWluRnJhbWUoKVxuICAgICAgICAgKiAgICAgLndhaXRGb3JTZWxlY3RvcignaW1nJylcbiAgICAgICAgICogICAgIC50aGVuKCgpID0+IGNvbnNvbGUubG9nKCdGaXJzdCBVUkwgd2l0aCBpbWFnZTogJyArIGN1cnJlbnRVUkwpKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICBmb3IgKGN1cnJlbnRVUkwgb2YgW1xuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZ29vZ2xlLmNvbScsXG4gICAgICAgICAqICAgICAnaHR0cHM6Ly9iYmMuY29tJyxcbiAgICAgICAgICogICBdKSB7XG4gICAgICAgICAqICAgICBhd2FpdCBwYWdlLmdvdG8oY3VycmVudFVSTCk7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIFRoZSBzZWxlY3RvciB0byBxdWVyeSBhbmQgd2FpdCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgY3VzdG9taXppbmcgd2FpdGluZyBiZWhhdmlvci5cbiAgICAgICAgICogQHJldHVybnMgQW4gZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqIEB0aHJvd3MgVGhyb3dzIGlmIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGRvZXNuJ3QgYXBwZWFyLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FpdEZvclNlbGVjdG9yKHNlbGVjdG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlZFNlbGVjdG9yLCBRdWVyeUhhbmRsZXIsIHBvbGxpbmcgfSA9IGdldFF1ZXJ5SGFuZGxlckFuZFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgUXVlcnlIYW5kbGVyLndhaXRGb3IodGhpcywgdXBkYXRlZFNlbGVjdG9yLCB7XG4gICAgICAgICAgICAgICAgcG9sbGluZyxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jICNjaGVja1Zpc2liaWxpdHkodmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXZhbHVhdGUoYXN5bmMgKGVsZW1lbnQsIFB1cHBldGVlclV0aWwsIHZpc2liaWxpdHkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihQdXBwZXRlZXJVdGlsLmNoZWNrVmlzaWJpbGl0eShlbGVtZW50LCB2aXNpYmlsaXR5KSk7XG4gICAgICAgICAgICB9LCBMYXp5QXJnLmNyZWF0ZShjb250ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgfSksIHZpc2liaWxpdHkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBlbGVtZW50IGlzIGNvbnNpZGVyZWQgdG8gYmUgdmlzaWJsZSBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBpc1xuICAgICAgICAgKiB0cnVlOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhc1xuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2dldENvbXB1dGVkU3R5bGUgfCBjb21wdXRlZCBzdHlsZXN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhcyBhIG5vbi1lbXB0eVxuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRCb3VuZGluZ0NsaWVudFJlY3QgfCBib3VuZGluZyBjbGllbnQgcmVjdH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIC0gdGhlIGVsZW1lbnQncyB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3Zpc2liaWxpdHkgfCB2aXNpYmlsaXR5fVxuICAgICAgICAgKiAgIGlzIG5vdCBgaGlkZGVuYCBvciBgY29sbGFwc2VgLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXNWaXNpYmxlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2NoZWNrVmlzaWJpbGl0eSh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gZWxlbWVudCBpcyBjb25zaWRlcmVkIHRvIGJlIGhpZGRlbiBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhcyBub1xuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2dldENvbXB1dGVkU3R5bGUgfCBjb21wdXRlZCBzdHlsZXN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhcyBhbiBlbXB0eVxuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRCb3VuZGluZ0NsaWVudFJlY3QgfCBib3VuZGluZyBjbGllbnQgcmVjdH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIC0gdGhlIGVsZW1lbnQncyB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3Zpc2liaWxpdHkgfCB2aXNpYmlsaXR5fVxuICAgICAgICAgKiAgIGlzIGBoaWRkZW5gIG9yIGBjb2xsYXBzZWAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpc0hpZGRlbigpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjaGVja1Zpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb252ZXJ0cyB0aGUgY3VycmVudCBoYW5kbGUgdG8gdGhlIGdpdmVuIGVsZW1lbnQgdHlwZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgZWxlbWVudDogRWxlbWVudEhhbmRsZTxFbGVtZW50PiA9IGF3YWl0IHBhZ2UuJChcbiAgICAgICAgICogICAnLmNsYXNzLW5hbWUtb2YtYW5jaG9yJ1xuICAgICAgICAgKiApO1xuICAgICAgICAgKiAvLyBETyBOT1QgRElTUE9TRSBgZWxlbWVudGAsIHRoaXMgd2lsbCBiZSBhbHdheXMgYmUgdGhlIHNhbWUgaGFuZGxlLlxuICAgICAgICAgKiBjb25zdCBhbmNob3I6IEVsZW1lbnRIYW5kbGU8SFRNTEFuY2hvckVsZW1lbnQ+ID1cbiAgICAgICAgICogICBhd2FpdCBlbGVtZW50LnRvRWxlbWVudCgnYScpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHRhZ05hbWUgLSBUaGUgdGFnIG5hbWUgb2YgdGhlIGRlc2lyZWQgZWxlbWVudCB0eXBlLlxuICAgICAgICAgKiBAdGhyb3dzIEFuIGVycm9yIGlmIHRoZSBoYW5kbGUgZG9lcyBub3QgbWF0Y2guICoqVGhlIGhhbmRsZSB3aWxsIG5vdCBiZVxuICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IGRpc3Bvc2VkLioqXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0b0VsZW1lbnQodGFnTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgaXNNYXRjaGluZ1RhZ05hbWUgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKChub2RlLCB0YWdOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUubm9kZU5hbWUgPT09IHRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH0sIHRhZ05hbWUpO1xuICAgICAgICAgICAgaWYgKCFpc01hdGNoaW5nVGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBpcyBub3QgYShuKSBcXGAke3RhZ05hbWV9XFxgIGVsZW1lbnRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBtaWRkbGUgcG9pbnQgd2l0aGluIGFuIGVsZW1lbnQgdW5sZXNzIGEgc3BlY2lmaWMgb2Zmc2V0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY2xpY2thYmxlUG9pbnQob2Zmc2V0KSB7XG4gICAgICAgICAgICBjb25zdCBib3ggPSBhd2FpdCB0aGlzLiNjbGlja2FibGVCb3goKTtcbiAgICAgICAgICAgIGlmICghYm94KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb2RlIGlzIGVpdGhlciBub3QgY2xpY2thYmxlIG9yIG5vdCBhbiBFbGVtZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB4OiBib3gueCArIG9mZnNldC54LFxuICAgICAgICAgICAgICAgICAgICB5OiBib3gueSArIG9mZnNldC55LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHg6IGJveC54ICsgYm94LndpZHRoIC8gMixcbiAgICAgICAgICAgICAgICB5OiBib3gueSArIGJveC5oZWlnaHQgLyAyLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2Qgc2Nyb2xscyBlbGVtZW50IGludG8gdmlldyBpZiBuZWVkZWQsIGFuZCB0aGVuXG4gICAgICAgICAqIHVzZXMge0BsaW5rIFBhZ2UubW91c2V9IHRvIGhvdmVyIG92ZXIgdGhlIGNlbnRlciBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICogSWYgdGhlIGVsZW1lbnQgaXMgZGV0YWNoZWQgZnJvbSBET00sIHRoZSBtZXRob2QgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaG92ZXIoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gYXdhaXQgdGhpcy5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkubW91c2UubW92ZSh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2Qgc2Nyb2xscyBlbGVtZW50IGludG8gdmlldyBpZiBuZWVkZWQsIGFuZCB0aGVuXG4gICAgICAgICAqIHVzZXMge0BsaW5rIFBhZ2UubW91c2V9IHRvIGNsaWNrIGluIHRoZSBjZW50ZXIgb2YgdGhlIGVsZW1lbnQuXG4gICAgICAgICAqIElmIHRoZSBlbGVtZW50IGlzIGRldGFjaGVkIGZyb20gRE9NLCB0aGUgbWV0aG9kIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNsaWNrKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQob3B0aW9ucy5vZmZzZXQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkubW91c2UuY2xpY2soeCwgeSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERyYWdzIGFuIGVsZW1lbnQgb3ZlciB0aGUgZ2l2ZW4gZWxlbWVudCBvciBwb2ludC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMgREVQUkVDQVRFRC4gV2hlbiBkcmFnIGludGVyY2VwdGlvbiBpcyBlbmFibGVkLCB0aGUgZHJhZyBwYXlsb2FkIGlzXG4gICAgICAgICAqIHJldHVybmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZHJhZyh0YXJnZXQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZnJhbWUucGFnZSgpO1xuICAgICAgICAgICAgaWYgKHBhZ2UuaXNEcmFnSW50ZXJjZXB0aW9uRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgdGhpcy5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGF3YWl0IHRhcmdldC5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcGFnZS5tb3VzZS5kcmFnKHNvdXJjZSwgdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWdlLl9pc0RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UuX2lzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhvdmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UuZG93bigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0YXJnZXQuaG92ZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UubW92ZSh0YXJnZXQueCwgdGFyZ2V0LnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHBhZ2UuX2lzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZS4gYGRyYWdlbnRlcmAgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHBlcmZvcm1lZCBkdXJpbmcgZHJhZ2dpbmcuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkcmFnRW50ZXIoZGF0YSA9IHsgaXRlbXM6IFtdLCBkcmFnT3BlcmF0aW9uc01hc2s6IDEgfSkge1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZnJhbWUucGFnZSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmNsaWNrYWJsZVBvaW50KCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLm1vdXNlLmRyYWdFbnRlcih0YXJnZXQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlLiBgZHJhZ292ZXJgIHdpbGwgYXV0b21hdGljYWxseSBiZSBwZXJmb3JtZWQgZHVyaW5nIGRyYWdnaW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZHJhZ092ZXIoZGF0YSA9IHsgaXRlbXM6IFtdLCBkcmFnT3BlcmF0aW9uc01hc2s6IDEgfSkge1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZnJhbWUucGFnZSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmNsaWNrYWJsZVBvaW50KCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLm1vdXNlLmRyYWdPdmVyKHRhcmdldCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZHJvcChkYXRhT3JFbGVtZW50ID0ge1xuICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgZHJhZ09wZXJhdGlvbnNNYXNrOiAxLFxuICAgICAgICB9KSB7XG4gICAgICAgICAgICBjb25zdCBwYWdlID0gdGhpcy5mcmFtZS5wYWdlKCk7XG4gICAgICAgICAgICBpZiAoJ2l0ZW1zJyBpbiBkYXRhT3JFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBhd2FpdCB0aGlzLmNsaWNrYWJsZVBvaW50KCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5tb3VzZS5kcm9wKGRlc3RpbmF0aW9uLCBkYXRhT3JFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vdGUgaWYgdGhlIHJlc3QgZXJyb3JzLCB3ZSBzdGlsbCB3YW50IGRyYWdnaW5nIG9mZiBiZWNhdXNlIHRoZSBlcnJvcnNcbiAgICAgICAgICAgICAgICAvLyBpcyBtb3N0IGxpa2VseSBzb21ldGhpbmcgaW1wbHlpbmcgdGhlIG1vdXNlIGlzIG5vIGxvbmdlciBkcmFnZ2luZy5cbiAgICAgICAgICAgICAgICBhd2FpdCBkYXRhT3JFbGVtZW50LmRyYWcodGhpcyk7XG4gICAgICAgICAgICAgICAgcGFnZS5faXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UudXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGBFbGVtZW50SGFuZGxlLmRyb3BgIGluc3RlYWQuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkcmFnQW5kRHJvcCh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmZyYW1lLnBhZ2UoKTtcbiAgICAgICAgICAgIGFzc2VydChwYWdlLmlzRHJhZ0ludGVyY2VwdGlvbkVuYWJsZWQoKSwgJ0RyYWcgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCBzdGFydFBvaW50ID0gYXdhaXQgdGhpcy5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0UG9pbnQgPSBhd2FpdCB0YXJnZXQuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UuZHJhZ0FuZERyb3Aoc3RhcnRQb2ludCwgdGFyZ2V0UG9pbnQsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmlnZ2VycyBhIGBjaGFuZ2VgIGFuZCBgaW5wdXRgIGV2ZW50IG9uY2UgYWxsIHRoZSBwcm92aWRlZCBvcHRpb25zIGhhdmUgYmVlblxuICAgICAgICAgKiBzZWxlY3RlZC4gSWYgdGhlcmUncyBubyBgPHNlbGVjdD5gIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCwgdGhlIG1ldGhvZFxuICAgICAgICAgKiB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGhhbmRsZS5zZWxlY3QoJ2JsdWUnKTsgLy8gc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgKiBoYW5kbGUuc2VsZWN0KCdyZWQnLCAnZ3JlZW4nLCAnYmx1ZScpOyAvLyBtdWx0aXBsZSBzZWxlY3Rpb25zXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdmFsdWVzIC0gVmFsdWVzIG9mIG9wdGlvbnMgdG8gc2VsZWN0LiBJZiB0aGUgYDxzZWxlY3Q+YCBoYXMgdGhlXG4gICAgICAgICAqIGBtdWx0aXBsZWAgYXR0cmlidXRlLCBhbGwgdmFsdWVzIGFyZSBjb25zaWRlcmVkLCBvdGhlcndpc2Ugb25seSB0aGUgZmlyc3RcbiAgICAgICAgICogb25lIGlzIHRha2VuIGludG8gYWNjb3VudC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNlbGVjdCguLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGlzU3RyaW5nKHZhbHVlKSwgJ1ZhbHVlcyBtdXN0IGJlIHN0cmluZ3MuIEZvdW5kIHZhbHVlIFwiJyArXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiIG9mIHR5cGUgXCInICtcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ldmFsdWF0ZSgoZWxlbWVudCwgdmFscykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBTZXQodmFscyk7XG4gICAgICAgICAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnQgaXMgbm90IGEgPHNlbGVjdD4gZWxlbWVudC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGVsZW1lbnQub3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmhhcyhvcHRpb24udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFZhbHVlcy5hZGQob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB2YWx1ZXMuaGFzKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMuYWRkKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5zZWxlY3RlZFZhbHVlcy52YWx1ZXMoKV07XG4gICAgICAgICAgICB9LCB2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBzY3JvbGxzIGVsZW1lbnQgaW50byB2aWV3IGlmIG5lZWRlZCwgYW5kIHRoZW4gdXNlc1xuICAgICAgICAgKiB7QGxpbmsgVG91Y2hzY3JlZW4udGFwfSB0byB0YXAgaW4gdGhlIGNlbnRlciBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICogSWYgdGhlIGVsZW1lbnQgaXMgZGV0YWNoZWQgZnJvbSBET00sIHRoZSBtZXRob2QgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdGFwKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLnRvdWNoc2NyZWVuLnRhcCh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyB0b3VjaFN0YXJ0KCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLnRvdWNoc2NyZWVuLnRvdWNoU3RhcnQoeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgdG91Y2hNb3ZlKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLnRvdWNoc2NyZWVuLnRvdWNoTW92ZSh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyB0b3VjaEVuZCgpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkudG91Y2hzY3JlZW4udG91Y2hFbmQoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbHMge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9mb2N1cyB8IGZvY3VzfSBvbiB0aGUgZWxlbWVudC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZvY3VzKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZvY3VzIG5vbi1IVE1MRWxlbWVudCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvY3VzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGVuIHNlbmRzIGEgYGtleWRvd25gLCBga2V5cHJlc3NgL2BpbnB1dGAsIGFuZFxuICAgICAgICAgKiBga2V5dXBgIGV2ZW50IGZvciBlYWNoIGNoYXJhY3RlciBpbiB0aGUgdGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogVG8gcHJlc3MgYSBzcGVjaWFsIGtleSwgbGlrZSBgQ29udHJvbGAgb3IgYEFycm93RG93bmAsXG4gICAgICAgICAqIHVzZSB7QGxpbmsgRWxlbWVudEhhbmRsZS5wcmVzc30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGF3YWl0IGVsZW1lbnRIYW5kbGUudHlwZSgnSGVsbG8nKTsgLy8gVHlwZXMgaW5zdGFudGx5XG4gICAgICAgICAqIGF3YWl0IGVsZW1lbnRIYW5kbGUudHlwZSgnV29ybGQnLCB7ZGVsYXk6IDEwMH0pOyAvLyBUeXBlcyBzbG93ZXIsIGxpa2UgYSB1c2VyXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBBbiBleGFtcGxlIG9mIHR5cGluZyBpbnRvIGEgdGV4dCBmaWVsZCBhbmQgdGhlbiBzdWJtaXR0aW5nIHRoZSBmb3JtOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBlbGVtZW50SGFuZGxlID0gYXdhaXQgcGFnZS4kKCdpbnB1dCcpO1xuICAgICAgICAgKiBhd2FpdCBlbGVtZW50SGFuZGxlLnR5cGUoJ3NvbWUgdGV4dCcpO1xuICAgICAgICAgKiBhd2FpdCBlbGVtZW50SGFuZGxlLnByZXNzKCdFbnRlcicpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBEZWxheSBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0eXBlKHRleHQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLmtleWJvYXJkLnR5cGUodGV4dCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvY3VzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGVuIHVzZXMge0BsaW5rIEtleWJvYXJkLmRvd259IGFuZCB7QGxpbmsgS2V5Ym9hcmQudXB9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiBga2V5YCBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgYW5kIG5vIG1vZGlmaWVyIGtleXMgYmVzaWRlcyBgU2hpZnRgXG4gICAgICAgICAqIGFyZSBiZWluZyBoZWxkIGRvd24sIGEgYGtleXByZXNzYC9gaW5wdXRgIGV2ZW50IHdpbGwgYWxzbyBiZSBnZW5lcmF0ZWQuXG4gICAgICAgICAqIFRoZSBgdGV4dGAgb3B0aW9uIGNhbiBiZSBzcGVjaWZpZWQgdG8gZm9yY2UgYW4gaW5wdXQgZXZlbnQgdG8gYmUgZ2VuZXJhdGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5PVEUqKiBNb2RpZmllciBrZXlzIERPIGFmZmVjdCBgZWxlbWVudEhhbmRsZS5wcmVzc2AuIEhvbGRpbmcgZG93biBgU2hpZnRgXG4gICAgICAgICAqIHdpbGwgdHlwZSB0aGUgdGV4dCBpbiB1cHBlciBjYXNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ga2V5IC0gTmFtZSBvZiBrZXkgdG8gcHJlc3MsIHN1Y2ggYXMgYEFycm93TGVmdGAuXG4gICAgICAgICAqIFNlZSB7QGxpbmsgS2V5SW5wdXR9IGZvciBhIGxpc3Qgb2YgYWxsIGtleSBuYW1lcy5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByZXNzKGtleSwgb3B0aW9ucykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkua2V5Ym9hcmQucHJlc3Moa2V5LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyAjY2xpY2thYmxlQm94KCkge1xuICAgICAgICAgICAgY29uc3QgYm94ZXMgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5lbGVtZW50LmdldENsaWVudFJlY3RzKCldLm1hcChyZWN0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgeDogcmVjdC54LCB5OiByZWN0LnksIHdpZHRoOiByZWN0LndpZHRoLCBoZWlnaHQ6IHJlY3QuaGVpZ2h0IH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghYm94ZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy4jaW50ZXJzZWN0Qm91bmRpbmdCb3hlc1dpdGhGcmFtZShib3hlcyk7XG4gICAgICAgICAgICBsZXQgZnJhbWUgPSB0aGlzLmZyYW1lO1xuICAgICAgICAgICAgbGV0IHBhcmVudEZyYW1lO1xuICAgICAgICAgICAgd2hpbGUgKChwYXJlbnRGcmFtZSA9IGZyYW1lPy5wYXJlbnRGcmFtZSgpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8zLCBhd2FpdCBmcmFtZS5mcmFtZUVsZW1lbnQoKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBmcmFtZSB0eXBlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Qm94ID0gYXdhaXQgaGFuZGxlLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxlbWVudCBpcyBub3QgdmlzaWJsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0LCAxMCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChzdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHJlY3QudG9wICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUucGFkZGluZ1RvcCwgMTApICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUuYm9yZGVyVG9wV2lkdGgsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudEJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBib3ggb2YgYm94ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJveC54ICs9IHBhcmVudEJveC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYm94LnkgKz0gcGFyZW50Qm94LnRvcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUuI2ludGVyc2VjdEJvdW5kaW5nQm94ZXNXaXRoRnJhbWUoYm94ZXMpO1xuICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IHBhcmVudEZyYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8zKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudl8zLmVycm9yID0gZV8zO1xuICAgICAgICAgICAgICAgICAgICBlbnZfMy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGJveGVzLmZpbmQoYm94ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYm94LndpZHRoID49IDEgJiYgYm94LmhlaWdodCA+PSAxO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWJveCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB4OiBib3gueCxcbiAgICAgICAgICAgICAgICB5OiBib3gueSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGJveC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGJveC53aWR0aCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgI2ludGVyc2VjdEJvdW5kaW5nQm94ZXNXaXRoRnJhbWUoYm94ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZG9jdW1lbnRXaWR0aCwgZG9jdW1lbnRIZWlnaHQgfSA9IGF3YWl0IHRoaXMuZnJhbWVcbiAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudFdpZHRoOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50SGVpZ2h0OiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0Qm91bmRpbmdCb3goYm94LCBkb2N1bWVudFdpZHRoLCBkb2N1bWVudEhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgZWxlbWVudCAocmVsYXRpdmUgdG8gdGhlIG1haW4gZnJhbWUpLFxuICAgICAgICAgKiBvciBgbnVsbGAgaWYgdGhlIGVsZW1lbnQgaXMge0BsaW5rIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtZGlzcGxheS00LyNib3gtZ2VuZXJhdGlvbiB8IG5vdCBwYXJ0IG9mIHRoZSBsYXlvdXR9XG4gICAgICAgICAqIChleGFtcGxlOiBgZGlzcGxheTogbm9uZWApLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYm91bmRpbmdCb3goKSB7XG4gICAgICAgICAgICBjb25zdCBib3ggPSBhd2FpdCB0aGlzLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRWxlbWVudCBpcyBub3QgdmlzaWJsZS5cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgeDogcmVjdC54LCB5OiByZWN0LnksIHdpZHRoOiByZWN0LndpZHRoLCBoZWlnaHQ6IHJlY3QuaGVpZ2h0IH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghYm94KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBhd2FpdCB0aGlzLiNnZXRUb3BMZWZ0Q29ybmVyT2ZGcmFtZSgpO1xuICAgICAgICAgICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgeDogYm94LnggKyBvZmZzZXQueCxcbiAgICAgICAgICAgICAgICB5OiBib3gueSArIG9mZnNldC55LFxuICAgICAgICAgICAgICAgIGhlaWdodDogYm94LmhlaWdodCxcbiAgICAgICAgICAgICAgICB3aWR0aDogYm94LndpZHRoLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBib3hlcyBvZiB0aGUgZWxlbWVudCxcbiAgICAgICAgICogb3IgYG51bGxgIGlmIHRoZSBlbGVtZW50IGlzIHtAbGluayBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLWRpc3BsYXktNC8jYm94LWdlbmVyYXRpb24gfCBub3QgcGFydCBvZiB0aGUgbGF5b3V0fVxuICAgICAgICAgKiAoZXhhbXBsZTogYGRpc3BsYXk6IG5vbmVgKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogQm94ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIHBvaW50cztcbiAgICAgICAgICogRWFjaCBQb2ludCBpcyBhbiBvYmplY3QgYHt4LCB5fWAuIEJveCBwb2ludHMgYXJlIHNvcnRlZCBjbG9jay13aXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYm94TW9kZWwoKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGlzIG5vdCB2aXNpYmxlLlxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0LCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdUb3AsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBwYXJzZUludChzdHlsZS5wYWRkaW5nUmlnaHQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcGFyc2VJbnQoc3R5bGUucGFkZGluZ0JvdHRvbSwgMTApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IC1wYXJzZUludChzdHlsZS5tYXJnaW5MZWZ0LCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IC1wYXJzZUludChzdHlsZS5tYXJnaW5Ub3AsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAtcGFyc2VJbnQoc3R5bGUubWFyZ2luUmlnaHQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogLXBhcnNlSW50KHN0eWxlLm1hcmdpbkJvdHRvbSwgMTApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHBhcnNlSW50KHN0eWxlLmJvcmRlckxlZnQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcGFyc2VJbnQoc3R5bGUuYm9yZGVyVG9wLCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodDogcGFyc2VJbnQoc3R5bGUuYm9yZGVyUmlnaHQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcGFyc2VJbnQoc3R5bGUuYm9yZGVyQm90dG9tLCAxMCksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXIgPSBbXG4gICAgICAgICAgICAgICAgICAgIHsgeDogcmVjdC5sZWZ0LCB5OiByZWN0LnRvcCB9LFxuICAgICAgICAgICAgICAgICAgICB7IHg6IHJlY3QubGVmdCArIHJlY3Qud2lkdGgsIHk6IHJlY3QudG9wIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCwgeTogcmVjdC50b3AgKyByZWN0LmJvdHRvbSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHg6IHJlY3QubGVmdCwgeTogcmVjdC50b3AgKyByZWN0LmJvdHRvbSB9LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHRyYW5zZm9ybVF1YWRXaXRoT2Zmc2V0cyhib3JkZXIsIG9mZnNldHMuYm9yZGVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdHJhbnNmb3JtUXVhZFdpdGhPZmZzZXRzKHBhZGRpbmcsIG9mZnNldHMucGFkZGluZyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFyZ2luID0gdHJhbnNmb3JtUXVhZFdpdGhPZmZzZXRzKGJvcmRlciwgb2Zmc2V0cy5tYXJnaW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcixcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVF1YWRXaXRoT2Zmc2V0cyhxdWFkLCBvZmZzZXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogcXVhZFswXS54ICsgb2Zmc2V0cy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHF1YWRbMF0ueSArIG9mZnNldHMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBxdWFkWzFdLnggLSBvZmZzZXRzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHF1YWRbMV0ueSArIG9mZnNldHMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBxdWFkWzJdLnggLSBvZmZzZXRzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHF1YWRbMl0ueSAtIG9mZnNldHMuYm90dG9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBxdWFkWzNdLnggKyBvZmZzZXRzLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogcXVhZFszXS55IC0gb2Zmc2V0cy5ib3R0b20sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYXdhaXQgdGhpcy4jZ2V0VG9wTGVmdENvcm5lck9mRnJhbWUoKTtcbiAgICAgICAgICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBbXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICdwYWRkaW5nJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyJyxcbiAgICAgICAgICAgICAgICAnbWFyZ2luJyxcbiAgICAgICAgICAgIF0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIG1vZGVsW2F0dHJpYnV0ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQueCArPSBvZmZzZXQueDtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQueSArPSBvZmZzZXQueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgI2dldFRvcExlZnRDb3JuZXJPZkZyYW1lKCkge1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgICAgIGxldCBmcmFtZSA9IHRoaXMuZnJhbWU7XG4gICAgICAgICAgICBsZXQgcGFyZW50RnJhbWU7XG4gICAgICAgICAgICB3aGlsZSAoKHBhcmVudEZyYW1lID0gZnJhbWU/LnBhcmVudEZyYW1lKCkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52XzQgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzQsIGF3YWl0IGZyYW1lLmZyYW1lRWxlbWVudCgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGZyYW1lIHR5cGUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRCb3ggPSBhd2FpdCBoYW5kbGUuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGlzIG5vdCB2aXNpYmxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQsIDEwKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHN0eWxlLmJvcmRlckxlZnRXaWR0aCwgMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcmVjdC50b3AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChzdHlsZS5wYWRkaW5nVG9wLCAxMCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChzdHlsZS5ib3JkZXJUb3BXaWR0aCwgMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50Qm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwb2ludC54ICs9IHBhcmVudEJveC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICBwb2ludC55ICs9IHBhcmVudEJveC50b3A7XG4gICAgICAgICAgICAgICAgICAgIGZyYW1lID0gcGFyZW50RnJhbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzQpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52XzQuZXJyb3IgPSBlXzQ7XG4gICAgICAgICAgICAgICAgICAgIGVudl80Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBvaW50O1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHNjcmVlbnNob3Qob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHNjcm9sbEludG9WaWV3ID0gdHJ1ZSwgY2xpcCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmZyYW1lLnBhZ2UoKTtcbiAgICAgICAgICAgIC8vIE9ubHkgc2Nyb2xsIHRoZSBlbGVtZW50IGludG8gdmlldyBpZiB0aGUgdXNlciB3YW50cyBpdC5cbiAgICAgICAgICAgIGlmIChzY3JvbGxJbnRvVmlldykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZWxlbWVudENsaXAgPSBhd2FpdCB0aGlzLiNub25FbXB0eVZpc2libGVCb3VuZGluZ0JveCgpO1xuICAgICAgICAgICAgY29uc3QgW3BhZ2VMZWZ0LCBwYWdlVG9wXSA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghd2luZG93LnZpc3VhbFZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2luZG93LnZpc3VhbFZpZXdwb3J0IGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy52aXN1YWxWaWV3cG9ydC5wYWdlTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnZpc3VhbFZpZXdwb3J0LnBhZ2VUb3AsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxlbWVudENsaXAueCArPSBwYWdlTGVmdDtcbiAgICAgICAgICAgIGVsZW1lbnRDbGlwLnkgKz0gcGFnZVRvcDtcbiAgICAgICAgICAgIGlmIChjbGlwKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAueCArPSBjbGlwLng7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAueSArPSBjbGlwLnk7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAuaGVpZ2h0ID0gY2xpcC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAud2lkdGggPSBjbGlwLndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IC4uLm9wdGlvbnMsIGNsaXA6IGVsZW1lbnRDbGlwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jICNub25FbXB0eVZpc2libGVCb3VuZGluZ0JveCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGF3YWl0IHRoaXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgIGFzc2VydChib3gsICdOb2RlIGlzIGVpdGhlciBub3QgdmlzaWJsZSBvciBub3QgYW4gSFRNTEVsZW1lbnQnKTtcbiAgICAgICAgICAgIGFzc2VydChib3gud2lkdGggIT09IDAsICdOb2RlIGhhcyAwIHdpZHRoLicpO1xuICAgICAgICAgICAgYXNzZXJ0KGJveC5oZWlnaHQgIT09IDAsICdOb2RlIGhhcyAwIGhlaWdodC4nKTtcbiAgICAgICAgICAgIHJldHVybiBib3g7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXJ0Q29ubmVjdGVkRWxlbWVudCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShhc3luYyAoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05vZGUgaXMgZGV0YWNoZWQgZnJvbSBkb2N1bWVudCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05vZGUgaXMgbm90IG9mIHR5cGUgSFRNTEVsZW1lbnQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpIHtcbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmlzSW50ZXJzZWN0aW5nVmlld3BvcnQoe1xuICAgICAgICAgICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gdGhlIGN1cnJlbnQgdmlld3BvcnQuIElmIGFuXG4gICAgICAgICAqIGVsZW1lbnQgaXMgYW4gU1ZHLCB3ZSBjaGVjayBpZiB0aGUgc3ZnIG93bmVyIGVsZW1lbnQgaXMgaW4gdGhlIHZpZXdwb3J0XG4gICAgICAgICAqIGluc3RlYWQuIFNlZSBodHRwczovL2NyYnVnLmNvbS85NjMyNDYuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhyZXNob2xkIGZvciB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gMCAobm8gaW50ZXJzZWN0aW9uKSBhbmQgMVxuICAgICAgICAgKiAoZnVsbCBpbnRlcnNlY3Rpb24pLiBEZWZhdWx0cyB0byAxLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXNJbnRlcnNlY3RpbmdWaWV3cG9ydChvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl81ID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydENvbm5lY3RlZEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnVsZXNkaXIvdXNlLXVzaW5nIC0tIFJldHVybnMgYHRoaXNgLlxuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IGF3YWl0IHRoaXMuI2FzU1ZHRWxlbWVudEhhbmRsZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl81LCBoYW5kbGUgJiYgKGF3YWl0IGhhbmRsZS4jZ2V0T3duZXJTVkdFbGVtZW50KCkpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0ICh0YXJnZXQgPz8gdGhpcykuZXZhbHVhdGUoYXN5bmMgKGVsZW1lbnQsIHRocmVzaG9sZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXNpYmxlUmF0aW8gPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW50cmllc1swXS5pbnRlcnNlY3Rpb25SYXRpbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZCA9PT0gMSA/IHZpc2libGVSYXRpbyA9PT0gMSA6IHZpc2libGVSYXRpbyA+IHRocmVzaG9sZDtcbiAgICAgICAgICAgICAgICB9LCBvcHRpb25zLnRocmVzaG9sZCA/PyAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzUpIHtcbiAgICAgICAgICAgICAgICBlbnZfNS5lcnJvciA9IGVfNTtcbiAgICAgICAgICAgICAgICBlbnZfNS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTY3JvbGxzIHRoZSBlbGVtZW50IGludG8gdmlldyB1c2luZyBlaXRoZXIgdGhlIGF1dG9tYXRpb24gcHJvdG9jb2wgY2xpZW50XG4gICAgICAgICAqIG9yIGJ5IGNhbGxpbmcgZWxlbWVudC5zY3JvbGxJbnRvVmlldy5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNjcm9sbEludG9WaWV3KCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRDb25uZWN0ZWRFbGVtZW50KCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGFzeW5jIChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW4gZWxlbWVudCBpcyBhbiBTVkdFbGVtZW50IChpbmNsdWRlZCBzdmcsIHBhdGgsIHJlY3RcbiAgICAgICAgICogZXRjLikuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAjYXNTVkdFbGVtZW50SGFuZGxlKCkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBTVkdFbGVtZW50O1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jICNnZXRPd25lclNWR0VsZW1lbnQoKSB7XG4gICAgICAgICAgICAvLyBTVkdTVkdFbGVtZW50Lm93bmVyU1ZHRWxlbWVudCA9PT0gbnVsbC5cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV2YWx1YXRlSGFuZGxlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU1ZHU1ZHRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQub3duZXJTVkdFbGVtZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IEVsZW1lbnRIYW5kbGUgfTtcbmZ1bmN0aW9uIGludGVyc2VjdEJvdW5kaW5nQm94KGJveCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGJveC53aWR0aCA9IE1hdGgubWF4KGJveC54ID49IDBcbiAgICAgICAgPyBNYXRoLm1pbih3aWR0aCAtIGJveC54LCBib3gud2lkdGgpXG4gICAgICAgIDogTWF0aC5taW4od2lkdGgsIGJveC53aWR0aCArIGJveC54KSwgMCk7XG4gICAgYm94LmhlaWdodCA9IE1hdGgubWF4KGJveC55ID49IDBcbiAgICAgICAgPyBNYXRoLm1pbihoZWlnaHQgLSBib3gueSwgYm94LmhlaWdodClcbiAgICAgICAgOiBNYXRoLm1pbihoZWlnaHQsIGJveC5oZWlnaHQgKyBib3gueSksIDApO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RWxlbWVudEhhbmRsZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IF9pc0VsZW1lbnRIYW5kbGUgPSBTeW1ib2woJ19pc0VsZW1lbnRIYW5kbGUnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVsZW1lbnRIYW5kbGVTeW1ib2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudmlyb25tZW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG52YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvciB9IGZyb20gJy4uL2NvbW1vbi9HZXRRdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgdHJhbnNwb3NlSXRlcmFibGVIYW5kbGUgfSBmcm9tICcuLi9jb21tb24vSGFuZGxlSXRlcmF0b3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0RlNQcm9taXNlcywgd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyB0aHJvd0lmRGlzcG9zZWQgfSBmcm9tICcuLi91dGlsL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25Mb2NhdG9yLCBOb2RlTG9jYXRvciwgfSBmcm9tICcuL2xvY2F0b3JzL2xvY2F0b3JzLmpzJztcbi8qKlxuICogV2UgdXNlIHN5bWJvbHMgdG8gcHJldmVudCBleHRlcm5hbCBwYXJ0aWVzIGxpc3RlbmluZyB0byB0aGVzZSBldmVudHMuXG4gKiBUaGV5IGFyZSBpbnRlcm5hbCB0byBQdXBwZXRlZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIEZyYW1lRXZlbnQ7XG4oZnVuY3Rpb24gKEZyYW1lRXZlbnQpIHtcbiAgICBGcmFtZUV2ZW50LkZyYW1lTmF2aWdhdGVkID0gU3ltYm9sKCdGcmFtZS5GcmFtZU5hdmlnYXRlZCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkID0gU3ltYm9sKCdGcmFtZS5GcmFtZVN3YXBwZWQnKTtcbiAgICBGcmFtZUV2ZW50LkxpZmVjeWNsZUV2ZW50ID0gU3ltYm9sKCdGcmFtZS5MaWZlY3ljbGVFdmVudCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCA9IFN5bWJvbCgnRnJhbWUuRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVEZXRhY2hlZCA9IFN5bWJvbCgnRnJhbWUuRnJhbWVEZXRhY2hlZCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkQnlBY3RpdmF0aW9uID0gU3ltYm9sKCdGcmFtZS5GcmFtZVN3YXBwZWRCeUFjdGl2YXRpb24nKTtcbn0pKEZyYW1lRXZlbnQgfHwgKEZyYW1lRXZlbnQgPSB7fSkpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHRocm93SWZEZXRhY2hlZCA9IHRocm93SWZEaXNwb3NlZChmcmFtZSA9PiB7XG4gICAgcmV0dXJuIGBBdHRlbXB0ZWQgdG8gdXNlIGRldGFjaGVkIEZyYW1lICcke2ZyYW1lLl9pZH0nLmA7XG59KTtcbi8qKlxuICogUmVwcmVzZW50cyBhIERPTSBmcmFtZS5cbiAqXG4gKiBUbyB1bmRlcnN0YW5kIGZyYW1lcywgeW91IGNhbiB0aGluayBvZiBmcmFtZXMgYXMgYDxpZnJhbWU+YCBlbGVtZW50cy4gSnVzdFxuICogbGlrZSBpZnJhbWVzLCBmcmFtZXMgY2FuIGJlIG5lc3RlZCwgYW5kIHdoZW4gSmF2YVNjcmlwdCBpcyBleGVjdXRlZCBpbiBhXG4gKiBmcmFtZSwgdGhlIEphdmFTY3JpcHQgZG9lcyBub3QgZWZmZWN0IGZyYW1lcyBpbnNpZGUgdGhlIGFtYmllbnQgZnJhbWUgdGhlXG4gKiBKYXZhU2NyaXB0IGV4ZWN1dGVzIGluLlxuICpcbiAqIEBleGFtcGxlXG4gKiBBdCBhbnkgcG9pbnQgaW4gdGltZSwge0BsaW5rIFBhZ2UgfCBwYWdlc30gZXhwb3NlIHRoZWlyIGN1cnJlbnQgZnJhbWVcbiAqIHRyZWUgdmlhIHRoZSB7QGxpbmsgUGFnZS5tYWluRnJhbWV9IGFuZCB7QGxpbmsgRnJhbWUuY2hpbGRGcmFtZXN9IG1ldGhvZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIEFuIGV4YW1wbGUgb2YgZHVtcGluZyBmcmFtZSB0cmVlOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gKlxuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20vY2hyb21lL2Jyb3dzZXIvY2FuYXJ5Lmh0bWwnKTtcbiAqICAgZHVtcEZyYW1lVHJlZShwYWdlLm1haW5GcmFtZSgpLCAnJyk7XG4gKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqXG4gKiAgIGZ1bmN0aW9uIGR1bXBGcmFtZVRyZWUoZnJhbWUsIGluZGVudCkge1xuICogICAgIGNvbnNvbGUubG9nKGluZGVudCArIGZyYW1lLnVybCgpKTtcbiAqICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZyYW1lLmNoaWxkRnJhbWVzKCkpIHtcbiAqICAgICAgIGR1bXBGcmFtZVRyZWUoY2hpbGQsIGluZGVudCArICcgICcpO1xuICogICAgIH1cbiAqICAgfVxuICogfSkoKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBBbiBleGFtcGxlIG9mIGdldHRpbmcgdGV4dCBmcm9tIGFuIGlmcmFtZSBlbGVtZW50OlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBmcmFtZSA9IHBhZ2UuZnJhbWVzKCkuZmluZChmcmFtZSA9PiBmcmFtZS5uYW1lKCkgPT09ICdteWZyYW1lJyk7XG4gKiBjb25zdCB0ZXh0ID0gYXdhaXQgZnJhbWUuJGV2YWwoJy5zZWxlY3RvcicsIGVsZW1lbnQgPT4gZWxlbWVudC50ZXh0Q29udGVudCk7XG4gKiBjb25zb2xlLmxvZyh0ZXh0KTtcbiAqIGBgYFxuICpcbiAqIEByZW1hcmtzXG4gKiBGcmFtZSBsaWZlY3ljbGVzIGFyZSBjb250cm9sbGVkIGJ5IHRocmVlIGV2ZW50cyB0aGF0IGFyZSBhbGwgZGlzcGF0Y2hlZCBvblxuICogdGhlIHBhcmVudCB7QGxpbmsgRnJhbWUucGFnZSB8IHBhZ2V9OlxuICpcbiAqIC0ge0BsaW5rIFBhZ2VFdmVudC5GcmFtZUF0dGFjaGVkfVxuICogLSB7QGxpbmsgUGFnZUV2ZW50LkZyYW1lTmF2aWdhdGVkfVxuICogLSB7QGxpbmsgUGFnZUV2ZW50LkZyYW1lRGV0YWNoZWR9XG4gKlxuICogQHB1YmxpY1xuICovXG5sZXQgRnJhbWUgPSAoKCkgPT4ge1xuICAgIGxldCBfY2xhc3NTdXBlciA9IEV2ZW50RW1pdHRlcjtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX2ZyYW1lRWxlbWVudF9kZWNvcmF0b3JzO1xuICAgIGxldCBfZXZhbHVhdGVIYW5kbGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX2V2YWx1YXRlX2RlY29yYXRvcnM7XG4gICAgbGV0IF9sb2NhdG9yX2RlY29yYXRvcnM7XG4gICAgbGV0IF8kX2RlY29yYXRvcnM7XG4gICAgbGV0IF8kJF9kZWNvcmF0b3JzO1xuICAgIGxldCBfJGV2YWxfZGVjb3JhdG9ycztcbiAgICBsZXQgXyQkZXZhbF9kZWNvcmF0b3JzO1xuICAgIGxldCBfd2FpdEZvclNlbGVjdG9yX2RlY29yYXRvcnM7XG4gICAgbGV0IF93YWl0Rm9yRnVuY3Rpb25fZGVjb3JhdG9ycztcbiAgICBsZXQgX2NvbnRlbnRfZGVjb3JhdG9ycztcbiAgICBsZXQgX2FkZFNjcmlwdFRhZ19kZWNvcmF0b3JzO1xuICAgIGxldCBfYWRkU3R5bGVUYWdfZGVjb3JhdG9ycztcbiAgICBsZXQgX2NsaWNrX2RlY29yYXRvcnM7XG4gICAgbGV0IF9mb2N1c19kZWNvcmF0b3JzO1xuICAgIGxldCBfaG92ZXJfZGVjb3JhdG9ycztcbiAgICBsZXQgX3NlbGVjdF9kZWNvcmF0b3JzO1xuICAgIGxldCBfdGFwX2RlY29yYXRvcnM7XG4gICAgbGV0IF90eXBlX2RlY29yYXRvcnM7XG4gICAgbGV0IF90aXRsZV9kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBGcmFtZSBleHRlbmRzIF9jbGFzc1N1cGVyIHtcbiAgICAgICAgc3RhdGljIHtcbiAgICAgICAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7XG4gICAgICAgICAgICBfZnJhbWVFbGVtZW50X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9ldmFsdWF0ZUhhbmRsZV9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfZXZhbHVhdGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX2xvY2F0b3JfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgXyRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgXyQkX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF8kZXZhbF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfJCRldmFsX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF93YWl0Rm9yU2VsZWN0b3JfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX3dhaXRGb3JGdW5jdGlvbl9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfY29udGVudF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfYWRkU2NyaXB0VGFnX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9hZGRTdHlsZVRhZ19kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfY2xpY2tfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX2ZvY3VzX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9ob3Zlcl9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfc2VsZWN0X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF90YXBfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX3RpdGxlX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZnJhbWVFbGVtZW50X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJmcmFtZUVsZW1lbnRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImZyYW1lRWxlbWVudFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmZyYW1lRWxlbWVudCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZXZhbHVhdGVIYW5kbGVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImV2YWx1YXRlSGFuZGxlXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJldmFsdWF0ZUhhbmRsZVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmV2YWx1YXRlSGFuZGxlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9ldmFsdWF0ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZXZhbHVhdGVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImV2YWx1YXRlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZXZhbHVhdGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2xvY2F0b3JfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImxvY2F0b3JcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImxvY2F0b3JcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5sb2NhdG9yIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF8kX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIkXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCIkXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouJCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfJCRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiQkXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCIkJFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiQkIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF8kZXZhbF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiJGV2YWxcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIiRldmFsXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouJGV2YWwgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgXyQkZXZhbF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiJCRldmFsXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCIkJGV2YWxcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai4kJGV2YWwgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JTZWxlY3Rvcl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwid2FpdEZvclNlbGVjdG9yXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ3YWl0Rm9yU2VsZWN0b3JcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yU2VsZWN0b3IgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JGdW5jdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwid2FpdEZvckZ1bmN0aW9uXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ3YWl0Rm9yRnVuY3Rpb25cIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yRnVuY3Rpb24gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2NvbnRlbnRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImNvbnRlbnRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImNvbnRlbnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5jb250ZW50IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9hZGRTY3JpcHRUYWdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImFkZFNjcmlwdFRhZ1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiYWRkU2NyaXB0VGFnXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYWRkU2NyaXB0VGFnIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9hZGRTdHlsZVRhZ19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiYWRkU3R5bGVUYWdcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImFkZFN0eWxlVGFnXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYWRkU3R5bGVUYWcgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2NsaWNrX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJjbGlja1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiY2xpY2tcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5jbGljayB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZm9jdXNfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImZvY3VzXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJmb2N1c1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmZvY3VzIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9ob3Zlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiaG92ZXJcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImhvdmVyXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaG92ZXIgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3NlbGVjdF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2VsZWN0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzZWxlY3RcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5zZWxlY3QgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RhcF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidGFwXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ0YXBcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50YXAgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3R5cGVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInR5cGVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInR5cGVcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50eXBlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF90aXRsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidGl0bGVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInRpdGxlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudGl0bGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX2lkID0gX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBfcGFyZW50SWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIF9uYW1lO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBfaGFzU3RhcnRlZExvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICB9XG4gICAgICAgICNfZG9jdW1lbnQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgICNkb2N1bWVudCgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy4jX2RvY3VtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jX2RvY3VtZW50ID0gdGhpcy5tYWluUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNfZG9jdW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY2xlYXIgdGhlIGRvY3VtZW50IGhhbmRsZSB0aGF0IGhhcyBiZWVuIGRlc3Ryb3llZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBjbGVhckRvY3VtZW50SGFuZGxlKCkge1xuICAgICAgICAgICAgdGhpcy4jX2RvY3VtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgZnJhbWUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmcmFtZSAoaWYgYW55KS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZyYW1lRWxlbWVudCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRGcmFtZSA9IHRoaXMucGFyZW50RnJhbWUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHBhcmVudEZyYW1lLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUsZnJhbWUnKTtcbiAgICAgICAgICAgICAgICB9KSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgaWZyYW1lXzEgb2YgdHJhbnNwb3NlSXRlcmFibGVIYW5kbGUobGlzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52XzIgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMiwgaWZyYW1lXzEsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgaWZyYW1lLmNvbnRlbnRGcmFtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lPy5faWQgPT09IHRoaXMuX2lkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZS5tb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgICAgIGVudl8xLmVycm9yID0gZV8yO1xuICAgICAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJlaGF2ZXMgaWRlbnRpY2FsbHkgdG8ge0BsaW5rIFBhZ2UuZXZhbHVhdGVIYW5kbGV9IGV4Y2VwdCBpdCdzIHJ1biB3aXRoaW5cbiAgICAgICAgICogdGhlIGNvbnRleHQgb2YgdGhpcyBmcmFtZS5cbiAgICAgICAgICpcbiAgICAgICAgICogU2VlIHtAbGluayBQYWdlLmV2YWx1YXRlSGFuZGxlfSBmb3IgZGV0YWlscy5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICAgICAgcGFnZUZ1bmN0aW9uID0gd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSh0aGlzLmV2YWx1YXRlSGFuZGxlLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCZWhhdmVzIGlkZW50aWNhbGx5IHRvIHtAbGluayBQYWdlLmV2YWx1YXRlfSBleGNlcHQgaXQncyBydW4gd2l0aGluXG4gICAgICAgICAqIHRoZSBjb250ZXh0IG9mIHRoaXMgZnJhbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFNlZSB7QGxpbmsgUGFnZS5ldmFsdWF0ZX0gZm9yIGRldGFpbHMuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBldmFsdWF0ZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy5ldmFsdWF0ZS5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpblJlYWxtKCkuZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBsb2NhdG9yKHNlbGVjdG9yT3JGdW5jKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNlbGVjdG9yT3JGdW5jID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBOb2RlTG9jYXRvci5jcmVhdGUodGhpcywgc2VsZWN0b3JPckZ1bmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uTG9jYXRvci5jcmVhdGUodGhpcywgc2VsZWN0b3JPckZ1bmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBRdWVyaWVzIHRoZSBmcmFtZSBmb3IgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIEEge0BsaW5rIEVsZW1lbnRIYW5kbGUgfCBlbGVtZW50IGhhbmRsZX0gdG8gdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgICAgICogbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLiBPdGhlcndpc2UsIGBudWxsYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBydWxlc2Rpci91c2UtdXNpbmcgLS0gVGhpcyBpcyBjYWNoZWQuXG4gICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IGF3YWl0IHRoaXMuI2RvY3VtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZG9jdW1lbnQuJChzZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFF1ZXJpZXMgdGhlIGZyYW1lIGZvciBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB7QGxpbmsgRWxlbWVudEhhbmRsZSB8IGVsZW1lbnQgaGFuZGxlc30gdGhhdCBwb2ludCB0b1xuICAgICAgICAgKiBlbGVtZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkJChzZWxlY3Rvciwgb3B0aW9ucykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ1bGVzZGlyL3VzZS11c2luZyAtLSBUaGlzIGlzIGNhY2hlZC5cbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gYXdhaXQgdGhpcy4jZG9jdW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkb2N1bWVudC4kJChzZWxlY3Rvciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJ1bnMgdGhlIGdpdmVuIGZ1bmN0aW9uIG9uIHRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciBpblxuICAgICAgICAgKiB0aGUgZnJhbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdGlsbFxuICAgICAgICAgKiB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VhcmNoVmFsdWUgPSBhd2FpdCBmcmFtZS4kZXZhbCgnI3NlYXJjaCcsIGVsID0+IGVsLnZhbHVlKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBmcmFtZSdzIGNvbnRleHQuXG4gICAgICAgICAqIFRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvciB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYXNcbiAgICAgICAgICogaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICRldmFsKHNlbGVjdG9yLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy4kZXZhbC5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ1bGVzZGlyL3VzZS11c2luZyAtLSBUaGlzIGlzIGNhY2hlZC5cbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gYXdhaXQgdGhpcy4jZG9jdW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkb2N1bWVudC4kZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yXG4gICAgICAgICAqIGluIHRoZSBmcmFtZS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGdpdmVuIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgd2FpdCB0aWxsXG4gICAgICAgICAqIHRoZSBwcm9taXNlIHJlc29sdmVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBkaXZzQ291bnRzID0gYXdhaXQgZnJhbWUuJCRldmFsKCdkaXYnLCBkaXZzID0+IGRpdnMubGVuZ3RoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBmcmFtZSdzIGNvbnRleHQuXG4gICAgICAgICAqIEFuIGFycmF5IG9mIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciB3aWxsIGJlIHBhc3NlZCB0byB0aGVcbiAgICAgICAgICogZnVuY3Rpb24gYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuJCRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnVsZXNkaXIvdXNlLXVzaW5nIC0tIFRoaXMgaXMgY2FjaGVkLlxuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBhd2FpdCB0aGlzLiNkb2N1bWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRvY3VtZW50LiQkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdHMgZm9yIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIHRvIGFwcGVhciBpbiB0aGUgZnJhbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHdvcmtzIGFjcm9zcyBuYXZpZ2F0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKlxuICAgICAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgKiAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gICAgICAgICAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICAgKiAgIGxldCBjdXJyZW50VVJMO1xuICAgICAgICAgKiAgIHBhZ2VcbiAgICAgICAgICogICAgIC5tYWluRnJhbWUoKVxuICAgICAgICAgKiAgICAgLndhaXRGb3JTZWxlY3RvcignaW1nJylcbiAgICAgICAgICogICAgIC50aGVuKCgpID0+IGNvbnNvbGUubG9nKCdGaXJzdCBVUkwgd2l0aCBpbWFnZTogJyArIGN1cnJlbnRVUkwpKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICBmb3IgKGN1cnJlbnRVUkwgb2YgW1xuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZ29vZ2xlLmNvbScsXG4gICAgICAgICAqICAgICAnaHR0cHM6Ly9iYmMuY29tJyxcbiAgICAgICAgICogICBdKSB7XG4gICAgICAgICAqICAgICBhd2FpdCBwYWdlLmdvdG8oY3VycmVudFVSTCk7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIFRoZSBzZWxlY3RvciB0byBxdWVyeSBhbmQgd2FpdCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgY3VzdG9taXppbmcgd2FpdGluZyBiZWhhdmlvci5cbiAgICAgICAgICogQHJldHVybnMgQW4gZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqIEB0aHJvd3MgVGhyb3dzIGlmIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGRvZXNuJ3QgYXBwZWFyLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FpdEZvclNlbGVjdG9yKHNlbGVjdG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlZFNlbGVjdG9yLCBRdWVyeUhhbmRsZXIsIHBvbGxpbmcgfSA9IGdldFF1ZXJ5SGFuZGxlckFuZFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgUXVlcnlIYW5kbGVyLndhaXRGb3IodGhpcywgdXBkYXRlZFNlbGVjdG9yLCB7XG4gICAgICAgICAgICAgICAgcG9sbGluZyxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBUaGUgYHdhaXRGb3JGdW5jdGlvbmAgY2FuIGJlIHVzZWQgdG8gb2JzZXJ2ZSB2aWV3cG9ydCBzaXplIGNoYW5nZTpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKlxuICAgICAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgKiAuICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICAgICAgICAgKiAuICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgICAgICAqIC4gIGNvbnN0IHdhdGNoRG9nID0gcGFnZS5tYWluRnJhbWUoKS53YWl0Rm9yRnVuY3Rpb24oJ3dpbmRvdy5pbm5lcldpZHRoIDwgMTAwJyk7XG4gICAgICAgICAqIC4gIHBhZ2Uuc2V0Vmlld3BvcnQoe3dpZHRoOiA1MCwgaGVpZ2h0OiA1MH0pO1xuICAgICAgICAgKiAuICBhd2FpdCB3YXRjaERvZztcbiAgICAgICAgICogLiAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICAgICAgICAgKiB9KSgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogVG8gcGFzcyBhcmd1bWVudHMgZnJvbSBOb2RlLmpzIHRvIHRoZSBwcmVkaWNhdGUgb2YgYHBhZ2Uud2FpdEZvckZ1bmN0aW9uYCBmdW5jdGlvbjpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VsZWN0b3IgPSAnLmZvbyc7XG4gICAgICAgICAqIGF3YWl0IGZyYW1lLndhaXRGb3JGdW5jdGlvbihcbiAgICAgICAgICogICBzZWxlY3RvciA9PiAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLFxuICAgICAgICAgKiAgIHt9LCAvLyBlbXB0eSBvcHRpb25zIG9iamVjdFxuICAgICAgICAgKiAgIHNlbGVjdG9yXG4gICAgICAgICAqICk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gcGFnZUZ1bmN0aW9uIC0gdGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIGluIHRoZSBmcmFtZSBjb250ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBwb2xsaW5nIG1ldGhvZCBhbmQgdGltZW91dC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEByZXR1cm5zIHRoZSBwcm9taXNlIHdoaWNoIHJlc29sdmUgd2hlbiB0aGUgYHBhZ2VGdW5jdGlvbmAgcmV0dXJucyBhIHRydXRoeSB2YWx1ZS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhaXRGb3JGdW5jdGlvbihwYWdlRnVuY3Rpb24sIG9wdGlvbnMgPSB7fSwgLi4uYXJncykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpblJlYWxtKCkud2FpdEZvckZ1bmN0aW9uKHBhZ2VGdW5jdGlvbiwgb3B0aW9ucywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBmdWxsIEhUTUwgY29udGVudHMgb2YgdGhlIGZyYW1lLCBpbmNsdWRpbmcgdGhlIERPQ1RZUEUuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjb250ZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXZhbHVhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gJyc7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIGRvY3VtZW50LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNldEZyYW1lQ29udGVudChjb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ldmFsdWF0ZShodG1sID0+IHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5vcGVuKCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoaHRtbCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuY2xvc2UoKTtcbiAgICAgICAgICAgIH0sIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZnJhbWUncyBgbmFtZWAgYXR0cmlidXRlIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFnLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiB0aGUgbmFtZSBpcyBlbXB0eSwgaXQgcmV0dXJucyB0aGUgYGlkYCBhdHRyaWJ1dGUgaW5zdGVhZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBjYWxjdWxhdGVkIG9uY2Ugd2hlbiB0aGUgZnJhbWUgaXMgY3JlYXRlZCwgYW5kIHdpbGwgbm90XG4gICAgICAgICAqIHVwZGF0ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGNoYW5nZWQgbGF0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZXByZWNhdGVkIFVzZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBlbGVtZW50ID0gYXdhaXQgZnJhbWUuZnJhbWVFbGVtZW50KCk7XG4gICAgICAgICAqIGNvbnN0IG5hbWVPcklkID0gYXdhaXQgZWxlbWVudC5ldmFsdWF0ZShmcmFtZSA9PiBmcmFtZS5uYW1lID8/IGZyYW1lLmlkKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBuYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25hbWUgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzYHRydWVgIGlmIHRoZSBmcmFtZSBoYXMgYmVlbiBkZXRhY2hlZC4gT3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGBkZXRhY2hlZGAgZ2V0dGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgaXNEZXRhY2hlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGRzIGEgYDxzY3JpcHQ+YCB0YWcgaW50byB0aGUgcGFnZSB3aXRoIHRoZSBkZXNpcmVkIHVybCBvciBjb250ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBzY3JpcHQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIHtAbGluayBFbGVtZW50SGFuZGxlIHwgZWxlbWVudCBoYW5kbGV9IHRvIHRoZSBpbmplY3RlZFxuICAgICAgICAgKiBgPHNjcmlwdD5gIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhZGRTY3JpcHRUYWcob3B0aW9ucykge1xuICAgICAgICAgICAgbGV0IHsgY29udGVudCA9ICcnLCB0eXBlIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgeyBwYXRoIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgaWYgKCshIW9wdGlvbnMudXJsICsgKyEhcGF0aCArICshIWNvbnRlbnQgIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4YWN0bHkgb25lIG9mIGB1cmxgLCBgcGF0aGAsIG9yIGBjb250ZW50YCBtdXN0IGJlIHNwZWNpZmllZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnRGU1Byb21pc2VzKCk7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgICAgICAgY29udGVudCArPSBgLy8jIHNvdXJjZVVSTD0ke3BhdGgucmVwbGFjZSgvXFxuL2csICcnKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHlwZSA9IHR5cGUgPz8gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluUmVhbG0oKS50cmFuc2ZlckhhbmRsZShhd2FpdCB0aGlzLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZShhc3luYyAoeyB1cmwsIGlkLCB0eXBlLCBjb250ZW50IH0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICBzY3JpcHQudGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXZlbnQubWVzc2FnZSA/PyAnQ291bGQgbm90IGxvYWQgc2NyaXB0JykpO1xuICAgICAgICAgICAgICAgICAgICB9LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmlkID0gaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgeyAuLi5vcHRpb25zLCB0eXBlLCBjb250ZW50IH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhZGRTdHlsZVRhZyhvcHRpb25zKSB7XG4gICAgICAgICAgICBsZXQgeyBjb250ZW50ID0gJycgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCB7IHBhdGggfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoKyEhb3B0aW9ucy51cmwgKyArISFwYXRoICsgKyEhY29udGVudCAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhhY3RseSBvbmUgb2YgYHVybGAsIGBwYXRoYCwgb3IgYGNvbnRlbnRgIG11c3QgYmUgc3BlY2lmaWVkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydEZTUHJvbWlzZXMoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgICBjb250ZW50ICs9ICcvKiMgc291cmNlVVJMPScgKyBwYXRoLnJlcGxhY2UoL1xcbi9nLCAnJykgKyAnKi8nO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluUmVhbG0oKS50cmFuc2ZlckhhbmRsZShhd2FpdCB0aGlzLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZShhc3luYyAoeyB1cmwsIGNvbnRlbnQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBsaW5rO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXZlbnQubWVzc2FnZSA/PyAnQ291bGQgbm90IGxvYWQgc3R5bGUnKSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBvcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENsaWNrcyB0aGUgZmlyc3QgZWxlbWVudCBmb3VuZCB0aGF0IG1hdGNoZXMgYHNlbGVjdG9yYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogSWYgYGNsaWNrKClgIHRyaWdnZXJzIGEgbmF2aWdhdGlvbiBldmVudCBhbmQgdGhlcmUncyBhIHNlcGFyYXRlXG4gICAgICAgICAqIGBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKClgIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQsIHlvdSBtYXkgZW5kIHVwIHdpdGggYVxuICAgICAgICAgKiByYWNlIGNvbmRpdGlvbiB0aGF0IHlpZWxkcyB1bmV4cGVjdGVkIHJlc3VsdHMuIFRoZSBjb3JyZWN0IHBhdHRlcm4gZm9yXG4gICAgICAgICAqIGNsaWNrIGFuZCB3YWl0IGZvciBuYXZpZ2F0aW9uIGlzIHRoZSBmb2xsb3dpbmc6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IFtyZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAqICAgcGFnZS53YWl0Rm9yTmF2aWdhdGlvbih3YWl0T3B0aW9ucyksXG4gICAgICAgICAqICAgZnJhbWUuY2xpY2soc2VsZWN0b3IsIGNsaWNrT3B0aW9ucyksXG4gICAgICAgICAqIF0pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIHRvIHF1ZXJ5IGZvci5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNsaWNrKHNlbGVjdG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMywgYXdhaXQgdGhpcy4kKHNlbGVjdG9yKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGFzc2VydChoYW5kbGUsIGBObyBlbGVtZW50IGZvdW5kIGZvciBzZWxlY3RvcjogJHtzZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUuY2xpY2sob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzMpIHtcbiAgICAgICAgICAgICAgICBlbnZfMy5lcnJvciA9IGVfMztcbiAgICAgICAgICAgICAgICBlbnZfMy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGb2N1c2VzIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgYHNlbGVjdG9yYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIHRvIHF1ZXJ5IGZvci5cbiAgICAgICAgICogQHRocm93cyBUaHJvd3MgaWYgdGhlcmUncyBubyBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmb2N1cyhzZWxlY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgZW52XzQgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl80LCBhd2FpdCB0aGlzLiQoc2VsZWN0b3IpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGhhbmRsZSwgYE5vIGVsZW1lbnQgZm91bmQgZm9yIHNlbGVjdG9yOiAke3NlbGVjdG9yfWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZS5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfNCkge1xuICAgICAgICAgICAgICAgIGVudl80LmVycm9yID0gZV80O1xuICAgICAgICAgICAgICAgIGVudl80Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhvdmVycyB0aGUgcG9pbnRlciBvdmVyIHRoZSBjZW50ZXIgb2YgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZVxuICAgICAgICAgKiBgc2VsZWN0b3JgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgc2VsZWN0b3IgdG8gcXVlcnkgZm9yLlxuICAgICAgICAgKiBAdGhyb3dzIFRocm93cyBpZiB0aGVyZSdzIG5vIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGhvdmVyKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZfNSA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzUsIGF3YWl0IHRoaXMuJChzZWxlY3RvciksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoaGFuZGxlLCBgTm8gZWxlbWVudCBmb3VuZCBmb3Igc2VsZWN0b3I6ICR7c2VsZWN0b3J9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLmhvdmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV81KSB7XG4gICAgICAgICAgICAgICAgZW52XzUuZXJyb3IgPSBlXzU7XG4gICAgICAgICAgICAgICAgZW52XzUuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl81KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogU2VsZWN0cyBhIHNldCBvZiB2YWx1ZSBvbiB0aGUgZmlyc3QgYDxzZWxlY3Q+YCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGVcbiAgICAgICAgICogYHNlbGVjdG9yYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogZnJhbWUuc2VsZWN0KCdzZWxlY3QjY29sb3JzJywgJ2JsdWUnKTsgLy8gc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgKiBmcmFtZS5zZWxlY3QoJ3NlbGVjdCNjb2xvcnMnLCAncmVkJywgJ2dyZWVuJywgJ2JsdWUnKTsgLy8gbXVsdGlwbGUgc2VsZWN0aW9uc1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIHRvIHF1ZXJ5IGZvci5cbiAgICAgICAgICogQHBhcmFtIHZhbHVlcyAtIFRoZSBhcnJheSBvZiB2YWx1ZXMgdG8gc2VsZWN0LiBJZiB0aGUgYDxzZWxlY3Q+YCBoYXMgdGhlXG4gICAgICAgICAqIGBtdWx0aXBsZWAgYXR0cmlidXRlLCBhbGwgdmFsdWVzIGFyZSBjb25zaWRlcmVkLCBvdGhlcndpc2Ugb25seSB0aGUgZmlyc3RcbiAgICAgICAgICogb25lIGlzIHRha2VuIGludG8gYWNjb3VudC5cbiAgICAgICAgICogQHJldHVybnMgdGhlIGxpc3Qgb2YgdmFsdWVzIHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgc2VsZWN0ZWQuXG4gICAgICAgICAqIEB0aHJvd3MgVGhyb3dzIGlmIHRoZXJlJ3Mgbm8gYDxzZWxlY3Q+YCBtYXRjaGluZyBgc2VsZWN0b3JgLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2VsZWN0KHNlbGVjdG9yLCAuLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl82ID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfNiwgYXdhaXQgdGhpcy4kKHNlbGVjdG9yKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGFzc2VydChoYW5kbGUsIGBObyBlbGVtZW50IGZvdW5kIGZvciBzZWxlY3RvcjogJHtzZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgaGFuZGxlLnNlbGVjdCguLi52YWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfNikge1xuICAgICAgICAgICAgICAgIGVudl82LmVycm9yID0gZV82O1xuICAgICAgICAgICAgICAgIGVudl82Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhcHMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBgc2VsZWN0b3JgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgc2VsZWN0b3IgdG8gcXVlcnkgZm9yLlxuICAgICAgICAgKiBAdGhyb3dzIFRocm93cyBpZiB0aGVyZSdzIG5vIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRhcChzZWxlY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgZW52XzcgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl83LCBhd2FpdCB0aGlzLiQoc2VsZWN0b3IpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGhhbmRsZSwgYE5vIGVsZW1lbnQgZm91bmQgZm9yIHNlbGVjdG9yOiAke3NlbGVjdG9yfWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZS50YXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzcpIHtcbiAgICAgICAgICAgICAgICBlbnZfNy5lcnJvciA9IGVfNztcbiAgICAgICAgICAgICAgICBlbnZfNy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZW5kcyBhIGBrZXlkb3duYCwgYGtleXByZXNzYC9gaW5wdXRgLCBhbmQgYGtleXVwYCBldmVudCBmb3IgZWFjaCBjaGFyYWN0ZXJcbiAgICAgICAgICogaW4gdGhlIHRleHQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFRvIHByZXNzIGEgc3BlY2lhbCBrZXksIGxpa2UgYENvbnRyb2xgIG9yIGBBcnJvd0Rvd25gLCB1c2VcbiAgICAgICAgICoge0BsaW5rIEtleWJvYXJkLnByZXNzfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogYXdhaXQgZnJhbWUudHlwZSgnI215dGV4dGFyZWEnLCAnSGVsbG8nKTsgLy8gVHlwZXMgaW5zdGFudGx5XG4gICAgICAgICAqIGF3YWl0IGZyYW1lLnR5cGUoJyNteXRleHRhcmVhJywgJ1dvcmxkJywge2RlbGF5OiAxMDB9KTsgLy8gVHlwZXMgc2xvd2VyLCBsaWtlIGEgdXNlclxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gdGhlIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudCB0byB0eXBlIGludG8uIElmIHRoZXJlIGFyZVxuICAgICAgICAgKiBtdWx0aXBsZSB0aGUgZmlyc3Qgd2lsbCBiZSB1c2VkLlxuICAgICAgICAgKiBAcGFyYW0gdGV4dCAtIHRleHQgdG8gdHlwZSBpbnRvIHRoZSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gdGFrZXMgb25lIG9wdGlvbiwgYGRlbGF5YCwgd2hpY2ggc2V0cyB0aGUgdGltZSB0byB3YWl0XG4gICAgICAgICAqIGJldHdlZW4ga2V5IHByZXNzZXMgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byBgMGAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0eXBlKHNlbGVjdG9yLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZfOCA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzgsIGF3YWl0IHRoaXMuJChzZWxlY3RvciksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoaGFuZGxlLCBgTm8gZWxlbWVudCBmb3VuZCBmb3Igc2VsZWN0b3I6ICR7c2VsZWN0b3J9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnR5cGUodGV4dCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV84KSB7XG4gICAgICAgICAgICAgICAgZW52XzguZXJyb3IgPSBlXzg7XG4gICAgICAgICAgICAgICAgZW52XzguaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl84KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGZyYW1lJ3MgdGl0bGUuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0aXRsZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnRpdGxlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IEZyYW1lIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GcmFtZS5qcy5tYXAiLCJpbXBvcnQgeyBkZWJ1Z0Vycm9yLCBpc1N0cmluZyB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogVGhlIGRlZmF1bHQgY29vcGVyYXRpdmUgcmVxdWVzdCBpbnRlcmNlcHRpb24gcmVzb2x1dGlvbiBwcmlvcml0eVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5URVJDRVBUX1JFU09MVVRJT05fUFJJT1JJVFkgPSAwO1xuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEhUVFAgcmVxdWVzdCBzZW50IGJ5IGEgcGFnZS5cbiAqIEByZW1hcmtzXG4gKlxuICogV2hlbmV2ZXIgdGhlIHBhZ2Ugc2VuZHMgYSByZXF1ZXN0LCBzdWNoIGFzIGZvciBhIG5ldHdvcmsgcmVzb3VyY2UsIHRoZVxuICogZm9sbG93aW5nIGV2ZW50cyBhcmUgZW1pdHRlZCBieSBQdXBwZXRlZXIncyBgcGFnZWA6XG4gKlxuICogLSBgcmVxdWVzdGA6IGVtaXR0ZWQgd2hlbiB0aGUgcmVxdWVzdCBpcyBpc3N1ZWQgYnkgdGhlIHBhZ2UuXG4gKiAtIGByZXF1ZXN0ZmluaXNoZWRgIC0gZW1pdHRlZCB3aGVuIHRoZSByZXNwb25zZSBib2R5IGlzIGRvd25sb2FkZWQgYW5kIHRoZVxuICogICByZXF1ZXN0IGlzIGNvbXBsZXRlLlxuICpcbiAqIElmIHJlcXVlc3QgZmFpbHMgYXQgc29tZSBwb2ludCwgdGhlbiBpbnN0ZWFkIG9mIGByZXF1ZXN0ZmluaXNoZWRgIGV2ZW50IHRoZVxuICogYHJlcXVlc3RmYWlsZWRgIGV2ZW50IGlzIGVtaXR0ZWQuXG4gKlxuICogQWxsIG9mIHRoZXNlIGV2ZW50cyBwcm92aWRlIGFuIGluc3RhbmNlIG9mIGBIVFRQUmVxdWVzdGAgcmVwcmVzZW50aW5nIHRoZVxuICogcmVxdWVzdCB0aGF0IG9jY3VycmVkOlxuICpcbiAqIGBgYFxuICogcGFnZS5vbigncmVxdWVzdCcsIHJlcXVlc3QgPT4gLi4uKVxuICogYGBgXG4gKlxuICogTk9URTogSFRUUCBFcnJvciByZXNwb25zZXMsIHN1Y2ggYXMgNDA0IG9yIDUwMywgYXJlIHN0aWxsIHN1Y2Nlc3NmdWxcbiAqIHJlc3BvbnNlcyBmcm9tIEhUVFAgc3RhbmRwb2ludCwgc28gcmVxdWVzdCB3aWxsIGNvbXBsZXRlIHdpdGhcbiAqIGByZXF1ZXN0ZmluaXNoZWRgIGV2ZW50LlxuICpcbiAqIElmIHJlcXVlc3QgZ2V0cyBhICdyZWRpcmVjdCcgcmVzcG9uc2UsIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZFxuICogd2l0aCB0aGUgYHJlcXVlc3RmaW5pc2hlZGAgZXZlbnQsIGFuZCBhIG5ldyByZXF1ZXN0IGlzIGlzc3VlZCB0byBhXG4gKiByZWRpcmVjdGVkIHVybC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBIVFRQUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2ludGVyY2VwdGlvbklkO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9mYWlsdXJlVGV4dCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3Jlc3BvbnNlID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfZnJvbU1lbW9yeUNhY2hlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3JlZGlyZWN0Q2hhaW4gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBpbnRlcmNlcHRpb24gPSB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBoYW5kbGVkOiBmYWxzZSxcbiAgICAgICAgaGFuZGxlcnM6IFtdLFxuICAgICAgICByZXNvbHV0aW9uU3RhdGU6IHtcbiAgICAgICAgICAgIGFjdGlvbjogSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbi5Ob25lLFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0T3ZlcnJpZGVzOiB7fSxcbiAgICAgICAgcmVzcG9uc2U6IG51bGwsXG4gICAgICAgIGFib3J0UmVhc29uOiBudWxsLFxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICAgKiBUaGUgYENvbnRpbnVlUmVxdWVzdE92ZXJyaWRlc2AgdGhhdCB3aWxsIGJlIHVzZWRcbiAgICAgKiBpZiB0aGUgaW50ZXJjZXB0aW9uIGlzIGFsbG93ZWQgdG8gY29udGludWUgKGllLCBgYWJvcnQoKWAgYW5kXG4gICAgICogYHJlc3BvbmQoKWAgYXJlbid0IGNhbGxlZCkuXG4gICAgICovXG4gICAgY29udGludWVSZXF1ZXN0T3ZlcnJpZGVzKCkge1xuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmNlcHRpb24ucmVxdWVzdE92ZXJyaWRlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGBSZXNwb25zZUZvclJlcXVlc3RgIHRoYXQgZ2V0cyB1c2VkIGlmIHRoZVxuICAgICAqIGludGVyY2VwdGlvbiBpcyBhbGxvd2VkIHRvIHJlc3BvbmQgKGllLCBgYWJvcnQoKWAgaXMgbm90IGNhbGxlZCkuXG4gICAgICovXG4gICAgcmVzcG9uc2VGb3JSZXF1ZXN0KCkge1xuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmNlcHRpb24ucmVzcG9uc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IHJlY2VudCByZWFzb24gZm9yIGFib3J0aW5nIHRoZSByZXF1ZXN0XG4gICAgICovXG4gICAgYWJvcnRFcnJvclJlYXNvbigpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuaW50ZXJjZXB0aW9uLmVuYWJsZWQsICdSZXF1ZXN0IEludGVyY2VwdGlvbiBpcyBub3QgZW5hYmxlZCEnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJjZXB0aW9uLmFib3J0UmVhc29uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBJbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGN1cnJlbnQgcmVzb2x1dGlvblxuICAgICAqIGFjdGlvbiBhbmQgcHJpb3JpdHkuXG4gICAgICpcbiAgICAgKiBJbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUgY29udGFpbnM6XG4gICAgICogYWN0aW9uOiBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uXG4gICAgICogcHJpb3JpdHk/OiBudW1iZXJcbiAgICAgKlxuICAgICAqIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24gaXMgb25lIG9mOiBgYWJvcnRgLCBgcmVzcG9uZGAsIGBjb250aW51ZWAsXG4gICAgICogYGRpc2FibGVkYCwgYG5vbmVgLCBvciBgYWxyZWFkeS1oYW5kbGVkYC5cbiAgICAgKi9cbiAgICBpbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgYWN0aW9uOiBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uLkRpc2FibGVkIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGFjdGlvbjogSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbi5BbHJlYWR5SGFuZGxlZCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLnRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZSB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyBgdHJ1ZWAgaWYgdGhlIGludGVyY2VwdCByZXNvbHV0aW9uIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCxcbiAgICAgKiBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc0ludGVyY2VwdFJlc29sdXRpb25IYW5kbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBhc3luYyByZXF1ZXN0IGhhbmRsZXIgdG8gdGhlIHByb2Nlc3NpbmcgcXVldWUuXG4gICAgICogRGVmZXJyZWQgaGFuZGxlcnMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGV4ZWN1dGUgaW4gYW55IHBhcnRpY3VsYXIgb3JkZXIsXG4gICAgICogYnV0IHRoZXkgYXJlIGd1YXJhbnRlZWQgdG8gcmVzb2x2ZSBiZWZvcmUgdGhlIHJlcXVlc3QgaW50ZXJjZXB0aW9uXG4gICAgICogaXMgZmluYWxpemVkLlxuICAgICAqL1xuICAgIGVucXVldWVJbnRlcmNlcHRBY3Rpb24ocGVuZGluZ0hhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlcnMucHVzaChwZW5kaW5nSGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF3YWl0cyBwZW5kaW5nIGludGVyY2VwdGlvbiBoYW5kbGVycyBhbmQgdGhlbiBkZWNpZGVzIGhvdyB0byBmdWxmaWxsXG4gICAgICogdGhlIHJlcXVlc3QgaW50ZXJjZXB0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGZpbmFsaXplSW50ZXJjZXB0aW9ucygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlcnMucmVkdWNlKChwcm9taXNlQ2hhaW4sIGludGVyY2VwdEFjdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VDaGFpbi50aGVuKGludGVyY2VwdEFjdGlvbik7XG4gICAgICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKTtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlcnMgPSBbXTsgLy8gVE9ETzogdmVyaWZ5IHRoaXMgaXMgY29ycmVjdCB0b3AgbGV0IGdjIHJ1blxuICAgICAgICBjb25zdCB7IGFjdGlvbiB9ID0gdGhpcy5pbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUoKTtcbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2Fib3J0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fYWJvcnQodGhpcy5pbnRlcmNlcHRpb24uYWJvcnRSZWFzb24pO1xuICAgICAgICAgICAgY2FzZSAncmVzcG9uZCc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJjZXB0aW9uLnJlc3BvbnNlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UgaXMgbWlzc2luZyBmb3IgdGhlIGludGVyY2VwdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVzcG9uZCh0aGlzLmludGVyY2VwdGlvbi5yZXNwb25zZSk7XG4gICAgICAgICAgICBjYXNlICdjb250aW51ZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbnRpbnVlKHRoaXMuaW50ZXJjZXB0aW9uLnJlcXVlc3RPdmVycmlkZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnRpbnVlcyByZXF1ZXN0IHdpdGggb3B0aW9uYWwgcmVxdWVzdCBvdmVycmlkZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb24odHJ1ZSk7XG4gICAgICogcGFnZS5vbigncmVxdWVzdCcsIHJlcXVlc3QgPT4ge1xuICAgICAqICAgLy8gT3ZlcnJpZGUgaGVhZGVyc1xuICAgICAqICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHJlcXVlc3QuaGVhZGVycygpLCB7XG4gICAgICogICAgIGZvbzogJ2JhcicsIC8vIHNldCBcImZvb1wiIGhlYWRlclxuICAgICAqICAgICBvcmlnaW46IHVuZGVmaW5lZCwgLy8gcmVtb3ZlIFwib3JpZ2luXCIgaGVhZGVyXG4gICAgICogICB9KTtcbiAgICAgKiAgIHJlcXVlc3QuY29udGludWUoe2hlYWRlcnN9KTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvdmVycmlkZXMgLSBvcHRpb25hbCBvdmVycmlkZXMgdG8gYXBwbHkgdG8gdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHByaW9yaXR5IC0gSWYgcHJvdmlkZWQsIGludGVyY2VwdCBpcyByZXNvbHZlZCB1c2luZyBjb29wZXJhdGl2ZVxuICAgICAqIGhhbmRsaW5nIHJ1bGVzLiBPdGhlcndpc2UsIGludGVyY2VwdCBpcyByZXNvbHZlZCBpbW1lZGlhdGVseS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiBUbyB1c2UgdGhpcywgcmVxdWVzdCBpbnRlcmNlcHRpb24gc2hvdWxkIGJlIGVuYWJsZWQgd2l0aFxuICAgICAqIHtAbGluayBQYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb259LlxuICAgICAqXG4gICAgICogRXhjZXB0aW9uIGlzIGltbWVkaWF0ZWx5IHRocm93biBpZiB0aGUgcmVxdWVzdCBpbnRlcmNlcHRpb24gaXMgbm90IGVuYWJsZWQuXG4gICAgICovXG4gICAgYXN5bmMgY29udGludWUob3ZlcnJpZGVzID0ge30sIHByaW9yaXR5KSB7XG4gICAgICAgIC8vIFJlcXVlc3QgaW50ZXJjZXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRhdGE6IHVybHMuXG4gICAgICAgIGlmICh0aGlzLnVybCgpLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQsICdSZXF1ZXN0IGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb250aW51ZShvdmVycmlkZXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlcXVlc3RPdmVycmlkZXMgPSBvdmVycmlkZXM7XG4gICAgICAgIGlmICh0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUucHJpb3JpdHkgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgcHJpb3JpdHkgPiB0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uQ29udGludWUsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmlvcml0eSA9PT0gdGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLmFjdGlvbiA9PT0gJ2Fib3J0JyB8fFxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5hY3Rpb24gPT09ICdyZXNwb25kJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5hY3Rpb24gPVxuICAgICAgICAgICAgICAgIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uQ29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdWxmaWxscyBhIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIEFuIGV4YW1wbGUgb2YgZnVsZmlsbGluZyBhbGwgcmVxdWVzdHMgd2l0aCA0MDQgcmVzcG9uc2VzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb24odHJ1ZSk7XG4gICAgICogcGFnZS5vbigncmVxdWVzdCcsIHJlcXVlc3QgPT4ge1xuICAgICAqICAgcmVxdWVzdC5yZXNwb25kKHtcbiAgICAgKiAgICAgc3RhdHVzOiA0MDQsXG4gICAgICogICAgIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbicsXG4gICAgICogICAgIGJvZHk6ICdOb3QgRm91bmQhJyxcbiAgICAgKiAgIH0pO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogTk9URTogTW9ja2luZyByZXNwb25zZXMgZm9yIGRhdGFVUkwgcmVxdWVzdHMgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKiBDYWxsaW5nIGByZXF1ZXN0LnJlc3BvbmRgIGZvciBhIGRhdGFVUkwgcmVxdWVzdCBpcyBhIG5vb3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2UgLSB0aGUgcmVzcG9uc2UgdG8gZnVsZmlsbCB0aGUgcmVxdWVzdCB3aXRoLlxuICAgICAqIEBwYXJhbSBwcmlvcml0eSAtIElmIHByb3ZpZGVkLCBpbnRlcmNlcHQgaXMgcmVzb2x2ZWQgdXNpbmdcbiAgICAgKiBjb29wZXJhdGl2ZSBoYW5kbGluZyBydWxlcy4gT3RoZXJ3aXNlLCBpbnRlcmNlcHQgaXMgcmVzb2x2ZWRcbiAgICAgKiBpbW1lZGlhdGVseS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiBUbyB1c2UgdGhpcywgcmVxdWVzdFxuICAgICAqIGludGVyY2VwdGlvbiBzaG91bGQgYmUgZW5hYmxlZCB3aXRoIHtAbGluayBQYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb259LlxuICAgICAqXG4gICAgICogRXhjZXB0aW9uIGlzIGltbWVkaWF0ZWx5IHRocm93biBpZiB0aGUgcmVxdWVzdCBpbnRlcmNlcHRpb24gaXMgbm90IGVuYWJsZWQuXG4gICAgICovXG4gICAgYXN5bmMgcmVzcG9uZChyZXNwb25zZSwgcHJpb3JpdHkpIHtcbiAgICAgICAgLy8gTW9ja2luZyByZXNwb25zZXMgZm9yIGRhdGFVUkwgcmVxdWVzdHMgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gICAgICAgIGlmICh0aGlzLnVybCgpLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQsICdSZXF1ZXN0IGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZXNwb25kKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIHByaW9yaXR5ID4gdGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5KSB7XG4gICAgICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uLlJlc3BvbmQsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmlvcml0eSA9PT0gdGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLmFjdGlvbiA9PT0gJ2Fib3J0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5hY3Rpb24gPVxuICAgICAgICAgICAgICAgIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uUmVzcG9uZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgYSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVycm9yQ29kZSAtIG9wdGlvbmFsIGVycm9yIGNvZGUgdG8gcHJvdmlkZS5cbiAgICAgKiBAcGFyYW0gcHJpb3JpdHkgLSBJZiBwcm92aWRlZCwgaW50ZXJjZXB0IGlzIHJlc29sdmVkIHVzaW5nXG4gICAgICogY29vcGVyYXRpdmUgaGFuZGxpbmcgcnVsZXMuIE90aGVyd2lzZSwgaW50ZXJjZXB0IGlzIHJlc29sdmVkXG4gICAgICogaW1tZWRpYXRlbHkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqXG4gICAgICogVG8gdXNlIHRoaXMsIHJlcXVlc3QgaW50ZXJjZXB0aW9uIHNob3VsZCBiZSBlbmFibGVkIHdpdGhcbiAgICAgKiB7QGxpbmsgUGFnZS5zZXRSZXF1ZXN0SW50ZXJjZXB0aW9ufS4gSWYgaXQgaXMgbm90IGVuYWJsZWQsIHRoaXMgbWV0aG9kIHdpbGxcbiAgICAgKiB0aHJvdyBhbiBleGNlcHRpb24gaW1tZWRpYXRlbHkuXG4gICAgICovXG4gICAgYXN5bmMgYWJvcnQoZXJyb3JDb2RlID0gJ2ZhaWxlZCcsIHByaW9yaXR5KSB7XG4gICAgICAgIC8vIFJlcXVlc3QgaW50ZXJjZXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRhdGE6IHVybHMuXG4gICAgICAgIGlmICh0aGlzLnVybCgpLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvclJlYXNvbiA9IGVycm9yUmVhc29uc1tlcnJvckNvZGVdO1xuICAgICAgICBhc3NlcnQoZXJyb3JSZWFzb24sICdVbmtub3duIGVycm9yIGNvZGU6ICcgKyBlcnJvckNvZGUpO1xuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQsICdSZXF1ZXN0IGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9hYm9ydChlcnJvclJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uYWJvcnRSZWFzb24gPSBlcnJvclJlYXNvbjtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5wcmlvcml0eSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBwcmlvcml0eSA+PSB0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uQWJvcnQsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRSZXNwb25zZShib2R5KSB7XG4gICAgICAgIC8vIE5lZWRlZCB0byBnZXQgdGhlIGNvcnJlY3QgYnl0ZUxlbmd0aFxuICAgICAgICBjb25zdCBieXRlQm9keSA9IGlzU3RyaW5nKGJvZHkpXG4gICAgICAgICAgICA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShib2R5KVxuICAgICAgICAgICAgOiBib2R5O1xuICAgICAgICBjb25zdCBieXRlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGJ5dGUgb2YgYnl0ZUJvZHkpIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IGJ5dGVCb2R5LmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICBiYXNlNjQ6IGJ0b2EoYnl0ZXMuam9pbignJykpLFxuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb247XG4oZnVuY3Rpb24gKEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24pIHtcbiAgICBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uW1wiQWJvcnRcIl0gPSBcImFib3J0XCI7XG4gICAgSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbltcIlJlc3BvbmRcIl0gPSBcInJlc3BvbmRcIjtcbiAgICBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uW1wiQ29udGludWVcIl0gPSBcImNvbnRpbnVlXCI7XG4gICAgSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbltcIkRpc2FibGVkXCJdID0gXCJkaXNhYmxlZFwiO1xuICAgIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb25bXCJOb25lXCJdID0gXCJub25lXCI7XG4gICAgSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbltcIkFscmVhZHlIYW5kbGVkXCJdID0gXCJhbHJlYWR5LWhhbmRsZWRcIjtcbn0pKEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24gfHwgKEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24gPSB7fSkpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhlYWRlcnNBcnJheShoZWFkZXJzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCBuYW1lIGluIGhlYWRlcnMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXJzW25hbWVdO1xuICAgICAgICBpZiAoIU9iamVjdC5pcyh2YWx1ZSwgdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi52YWx1ZXMubWFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lLCB2YWx1ZTogdmFsdWUgKyAnJyB9O1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEByZW1hcmtzXG4gKiBMaXN0IHRha2VuIGZyb20ge0BsaW5rIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2h0dHAtc3RhdHVzLWNvZGVzL2h0dHAtc3RhdHVzLWNvZGVzLnhodG1sfVxuICogd2l0aCBleHRyYSAzMDYgYW5kIDQxOCBjb2Rlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUQVRVU19URVhUUyA9IHtcbiAgICAnMTAwJzogJ0NvbnRpbnVlJyxcbiAgICAnMTAxJzogJ1N3aXRjaGluZyBQcm90b2NvbHMnLFxuICAgICcxMDInOiAnUHJvY2Vzc2luZycsXG4gICAgJzEwMyc6ICdFYXJseSBIaW50cycsXG4gICAgJzIwMCc6ICdPSycsXG4gICAgJzIwMSc6ICdDcmVhdGVkJyxcbiAgICAnMjAyJzogJ0FjY2VwdGVkJyxcbiAgICAnMjAzJzogJ05vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uJyxcbiAgICAnMjA0JzogJ05vIENvbnRlbnQnLFxuICAgICcyMDUnOiAnUmVzZXQgQ29udGVudCcsXG4gICAgJzIwNic6ICdQYXJ0aWFsIENvbnRlbnQnLFxuICAgICcyMDcnOiAnTXVsdGktU3RhdHVzJyxcbiAgICAnMjA4JzogJ0FscmVhZHkgUmVwb3J0ZWQnLFxuICAgICcyMjYnOiAnSU0gVXNlZCcsXG4gICAgJzMwMCc6ICdNdWx0aXBsZSBDaG9pY2VzJyxcbiAgICAnMzAxJzogJ01vdmVkIFBlcm1hbmVudGx5JyxcbiAgICAnMzAyJzogJ0ZvdW5kJyxcbiAgICAnMzAzJzogJ1NlZSBPdGhlcicsXG4gICAgJzMwNCc6ICdOb3QgTW9kaWZpZWQnLFxuICAgICczMDUnOiAnVXNlIFByb3h5JyxcbiAgICAnMzA2JzogJ1N3aXRjaCBQcm94eScsXG4gICAgJzMwNyc6ICdUZW1wb3JhcnkgUmVkaXJlY3QnLFxuICAgICczMDgnOiAnUGVybWFuZW50IFJlZGlyZWN0JyxcbiAgICAnNDAwJzogJ0JhZCBSZXF1ZXN0JyxcbiAgICAnNDAxJzogJ1VuYXV0aG9yaXplZCcsXG4gICAgJzQwMic6ICdQYXltZW50IFJlcXVpcmVkJyxcbiAgICAnNDAzJzogJ0ZvcmJpZGRlbicsXG4gICAgJzQwNCc6ICdOb3QgRm91bmQnLFxuICAgICc0MDUnOiAnTWV0aG9kIE5vdCBBbGxvd2VkJyxcbiAgICAnNDA2JzogJ05vdCBBY2NlcHRhYmxlJyxcbiAgICAnNDA3JzogJ1Byb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyxcbiAgICAnNDA4JzogJ1JlcXVlc3QgVGltZW91dCcsXG4gICAgJzQwOSc6ICdDb25mbGljdCcsXG4gICAgJzQxMCc6ICdHb25lJyxcbiAgICAnNDExJzogJ0xlbmd0aCBSZXF1aXJlZCcsXG4gICAgJzQxMic6ICdQcmVjb25kaXRpb24gRmFpbGVkJyxcbiAgICAnNDEzJzogJ1BheWxvYWQgVG9vIExhcmdlJyxcbiAgICAnNDE0JzogJ1VSSSBUb28gTG9uZycsXG4gICAgJzQxNSc6ICdVbnN1cHBvcnRlZCBNZWRpYSBUeXBlJyxcbiAgICAnNDE2JzogJ1JhbmdlIE5vdCBTYXRpc2ZpYWJsZScsXG4gICAgJzQxNyc6ICdFeHBlY3RhdGlvbiBGYWlsZWQnLFxuICAgICc0MTgnOiBcIkknbSBhIHRlYXBvdFwiLFxuICAgICc0MjEnOiAnTWlzZGlyZWN0ZWQgUmVxdWVzdCcsXG4gICAgJzQyMic6ICdVbnByb2Nlc3NhYmxlIEVudGl0eScsXG4gICAgJzQyMyc6ICdMb2NrZWQnLFxuICAgICc0MjQnOiAnRmFpbGVkIERlcGVuZGVuY3knLFxuICAgICc0MjUnOiAnVG9vIEVhcmx5JyxcbiAgICAnNDI2JzogJ1VwZ3JhZGUgUmVxdWlyZWQnLFxuICAgICc0MjgnOiAnUHJlY29uZGl0aW9uIFJlcXVpcmVkJyxcbiAgICAnNDI5JzogJ1RvbyBNYW55IFJlcXVlc3RzJyxcbiAgICAnNDMxJzogJ1JlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2UnLFxuICAgICc0NTEnOiAnVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnMnLFxuICAgICc1MDAnOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbiAgICAnNTAxJzogJ05vdCBJbXBsZW1lbnRlZCcsXG4gICAgJzUwMic6ICdCYWQgR2F0ZXdheScsXG4gICAgJzUwMyc6ICdTZXJ2aWNlIFVuYXZhaWxhYmxlJyxcbiAgICAnNTA0JzogJ0dhdGV3YXkgVGltZW91dCcsXG4gICAgJzUwNSc6ICdIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCcsXG4gICAgJzUwNic6ICdWYXJpYW50IEFsc28gTmVnb3RpYXRlcycsXG4gICAgJzUwNyc6ICdJbnN1ZmZpY2llbnQgU3RvcmFnZScsXG4gICAgJzUwOCc6ICdMb29wIERldGVjdGVkJyxcbiAgICAnNTEwJzogJ05vdCBFeHRlbmRlZCcsXG4gICAgJzUxMSc6ICdOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyxcbn07XG5jb25zdCBlcnJvclJlYXNvbnMgPSB7XG4gICAgYWJvcnRlZDogJ0Fib3J0ZWQnLFxuICAgIGFjY2Vzc2RlbmllZDogJ0FjY2Vzc0RlbmllZCcsXG4gICAgYWRkcmVzc3VucmVhY2hhYmxlOiAnQWRkcmVzc1VucmVhY2hhYmxlJyxcbiAgICBibG9ja2VkYnljbGllbnQ6ICdCbG9ja2VkQnlDbGllbnQnLFxuICAgIGJsb2NrZWRieXJlc3BvbnNlOiAnQmxvY2tlZEJ5UmVzcG9uc2UnLFxuICAgIGNvbm5lY3Rpb25hYm9ydGVkOiAnQ29ubmVjdGlvbkFib3J0ZWQnLFxuICAgIGNvbm5lY3Rpb25jbG9zZWQ6ICdDb25uZWN0aW9uQ2xvc2VkJyxcbiAgICBjb25uZWN0aW9uZmFpbGVkOiAnQ29ubmVjdGlvbkZhaWxlZCcsXG4gICAgY29ubmVjdGlvbnJlZnVzZWQ6ICdDb25uZWN0aW9uUmVmdXNlZCcsXG4gICAgY29ubmVjdGlvbnJlc2V0OiAnQ29ubmVjdGlvblJlc2V0JyxcbiAgICBpbnRlcm5ldGRpc2Nvbm5lY3RlZDogJ0ludGVybmV0RGlzY29ubmVjdGVkJyxcbiAgICBuYW1lbm90cmVzb2x2ZWQ6ICdOYW1lTm90UmVzb2x2ZWQnLFxuICAgIHRpbWVkb3V0OiAnVGltZWRPdXQnLFxuICAgIGZhaWxlZDogJ0ZhaWxlZCcsXG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgLy8gRmlyZWZveCB0aHJvd3MgYW4gaW52YWxpZCBhcmd1bWVudCBlcnJvciB3aXRoIGEgbWVzc2FnZSBzdGFydGluZyB3aXRoXG4gICAgLy8gJ0V4cGVjdGVkIFwiaGVhZGVyXCIgWy4uLl0nLlxuICAgIGlmIChlcnJvci5vcmlnaW5hbE1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgaGVhZGVyJykgfHxcbiAgICAgICAgZXJyb3Iub3JpZ2luYWxNZXNzYWdlLmluY2x1ZGVzKCdFeHBlY3RlZCBcImhlYWRlclwiJykgfHxcbiAgICAgICAgLy8gV2ViRHJpdmVyIEJpRGkgZXJyb3IgZm9yIGludmFsaWQgdmFsdWVzLCBmb3IgZXhhbXBsZSwgaGVhZGVycy5cbiAgICAgICAgZXJyb3Iub3JpZ2luYWxNZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkIGFyZ3VtZW50JykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIC8vIEluIGNlcnRhaW4gY2FzZXMsIHByb3RvY29sIHdpbGwgcmV0dXJuIGVycm9yIGlmIHRoZSByZXF1ZXN0IHdhc1xuICAgIC8vIGFscmVhZHkgY2FuY2VsZWQgb3IgdGhlIHBhZ2Ugd2FzIGNsb3NlZC4gV2Ugc2hvdWxkIHRvbGVyYXRlIHRoZXNlXG4gICAgLy8gZXJyb3JzLlxuICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SFRUUFJlcXVlc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogVGhlIEhUVFBSZXNwb25zZSBjbGFzcyByZXByZXNlbnRzIHJlc3BvbnNlcyB3aGljaCBhcmUgcmVjZWl2ZWQgYnkgdGhlXG4gKiB7QGxpbmsgUGFnZX0gY2xhc3MuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgSFRUUFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhlIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsIChzdGF0dXMgaW4gdGhlIHJhbmdlIDIwMC0yOTkpLlxuICAgICAqL1xuICAgIG9rKCkge1xuICAgICAgICAvLyBUT0RPOiBkb2N1bWVudCA9PT0gMCBjYXNlP1xuICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLnN0YXR1cygpO1xuICAgICAgICByZXR1cm4gc3RhdHVzID09PSAwIHx8IChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8PSAyOTkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGEgdGV4dCAodXRmOCkgcmVwcmVzZW50YXRpb24gb2YgcmVzcG9uc2UgYm9keS5cbiAgICAgKi9cbiAgICBhc3luYyB0ZXh0KCkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5idWZmZXIoKTtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgcmVzcG9uc2UgYm9keS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHRocm93IGlmIHRoZSByZXNwb25zZSBib2R5IGlzIG5vdCBwYXJzYWJsZSB2aWFcbiAgICAgKiBgSlNPTi5wYXJzZWAuXG4gICAgICovXG4gICAgYXN5bmMganNvbigpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMudGV4dCgpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1IVFRQUmVzcG9uc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogS2V5Ym9hcmQgcHJvdmlkZXMgYW4gYXBpIGZvciBtYW5hZ2luZyBhIHZpcnR1YWwga2V5Ym9hcmQuXG4gKiBUaGUgaGlnaCBsZXZlbCBhcGkgaXMge0BsaW5rIEtleWJvYXJkLlwidHlwZVwifSxcbiAqIHdoaWNoIHRha2VzIHJhdyBjaGFyYWN0ZXJzIGFuZCBnZW5lcmF0ZXMgcHJvcGVyIGtleWRvd24sIGtleXByZXNzL2lucHV0LFxuICogYW5kIGtleXVwIGV2ZW50cyBvbiB5b3VyIHBhZ2UuXG4gKlxuICogQHJlbWFya3NcbiAqIEZvciBmaW5lciBjb250cm9sLCB5b3UgY2FuIHVzZSB7QGxpbmsgS2V5Ym9hcmQuZG93bn0sXG4gKiB7QGxpbmsgS2V5Ym9hcmQudXB9LCBhbmQge0BsaW5rIEtleWJvYXJkLnNlbmRDaGFyYWN0ZXJ9XG4gKiB0byBtYW51YWxseSBmaXJlIGV2ZW50cyBhcyBpZiB0aGV5IHdlcmUgZ2VuZXJhdGVkIGZyb20gYSByZWFsIGtleWJvYXJkLlxuICpcbiAqIE9uIG1hY09TLCBrZXlib2FyZCBzaG9ydGN1dHMgbGlrZSBg4oyYIEFgIC1cXD4gU2VsZWN0IEFsbCBkbyBub3Qgd29yay5cbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3B1cHBldGVlci9wdXBwZXRlZXIvaXNzdWVzLzEzMTMgfCAjMTMxM30uXG4gKlxuICogQGV4YW1wbGVcbiAqIEFuIGV4YW1wbGUgb2YgaG9sZGluZyBkb3duIGBTaGlmdGAgaW4gb3JkZXIgdG8gc2VsZWN0IGFuZCBkZWxldGUgc29tZSB0ZXh0OlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBwYWdlLmtleWJvYXJkLnR5cGUoJ0hlbGxvIFdvcmxkIScpO1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygnQXJyb3dMZWZ0Jyk7XG4gKlxuICogYXdhaXQgcGFnZS5rZXlib2FyZC5kb3duKCdTaGlmdCcpO1xuICogZm9yIChsZXQgaSA9IDA7IGkgPCAnIFdvcmxkJy5sZW5ndGg7IGkrKylcbiAqICAgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygnQXJyb3dMZWZ0Jyk7XG4gKiBhd2FpdCBwYWdlLmtleWJvYXJkLnVwKCdTaGlmdCcpO1xuICpcbiAqIGF3YWl0IHBhZ2Uua2V5Ym9hcmQucHJlc3MoJ0JhY2tzcGFjZScpO1xuICogLy8gUmVzdWx0IHRleHQgd2lsbCBlbmQgdXAgc2F5aW5nICdIZWxsbyEnXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQW4gZXhhbXBsZSBvZiBwcmVzc2luZyBgQWBcbiAqXG4gKiBgYGB0c1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC5kb3duKCdTaGlmdCcpO1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygnS2V5QScpO1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC51cCgnU2hpZnQnKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEtleWJvYXJkIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxufVxuLyoqXG4gKiBFbnVtIG9mIHZhbGlkIG1vdXNlIGJ1dHRvbnMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgTW91c2VCdXR0b24gPSBPYmplY3QuZnJlZXplKHtcbiAgICBMZWZ0OiAnbGVmdCcsXG4gICAgUmlnaHQ6ICdyaWdodCcsXG4gICAgTWlkZGxlOiAnbWlkZGxlJyxcbiAgICBCYWNrOiAnYmFjaycsXG4gICAgRm9yd2FyZDogJ2ZvcndhcmQnLFxufSk7XG4vKipcbiAqIFRoZSBNb3VzZSBjbGFzcyBvcGVyYXRlcyBpbiBtYWluLWZyYW1lIENTUyBwaXhlbHNcbiAqIHJlbGF0aXZlIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHZpZXdwb3J0LlxuICpcbiAqIEByZW1hcmtzXG4gKiBFdmVyeSBgcGFnZWAgb2JqZWN0IGhhcyBpdHMgb3duIE1vdXNlLCBhY2Nlc3NpYmxlIHdpdGgge0BsaW5rIFBhZ2UubW91c2V9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIFVzaW5nIOKAmHBhZ2UubW91c2XigJkgdG8gdHJhY2UgYSAxMDB4MTAwIHNxdWFyZS5cbiAqIGF3YWl0IHBhZ2UubW91c2UubW92ZSgwLCAwKTtcbiAqIGF3YWl0IHBhZ2UubW91c2UuZG93bigpO1xuICogYXdhaXQgcGFnZS5tb3VzZS5tb3ZlKDAsIDEwMCk7XG4gKiBhd2FpdCBwYWdlLm1vdXNlLm1vdmUoMTAwLCAxMDApO1xuICogYXdhaXQgcGFnZS5tb3VzZS5tb3ZlKDEwMCwgMCk7XG4gKiBhd2FpdCBwYWdlLm1vdXNlLm1vdmUoMCwgMCk7XG4gKiBhd2FpdCBwYWdlLm1vdXNlLnVwKCk7XG4gKiBgYGBcbiAqXG4gKiAqKk5vdGUqKjogVGhlIG1vdXNlIGV2ZW50cyB0cmlnZ2VyIHN5bnRoZXRpYyBgTW91c2VFdmVudGBzLlxuICogVGhpcyBtZWFucyB0aGF0IGl0IGRvZXMgbm90IGZ1bGx5IHJlcGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB3aGF0IGEgbm9ybWFsIHVzZXJcbiAqIHdvdWxkIGJlIGFibGUgdG8gZG8gd2l0aCB0aGVpciBtb3VzZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgZHJhZ2dpbmcgYW5kIHNlbGVjdGluZyB0ZXh0IGlzIG5vdCBwb3NzaWJsZSB1c2luZyBgcGFnZS5tb3VzZWAuXG4gKiBJbnN0ZWFkLCB5b3UgY2FuIHVzZSB0aGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudE9yU2hhZG93Um9vdC9nZXRTZWxlY3Rpb24gfCBgRG9jdW1lbnRPclNoYWRvd1Jvb3QuZ2V0U2VsZWN0aW9uKClgfSBmdW5jdGlvbmFsaXR5IGltcGxlbWVudGVkIGluIHRoZSBwbGF0Zm9ybS5cbiAqXG4gKiBAZXhhbXBsZVxuICogRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHNlbGVjdCBhbGwgY29udGVudCBiZXR3ZWVuIG5vZGVzOlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBwYWdlLmV2YWx1YXRlKFxuICogICAoZnJvbSwgdG8pID0+IHtcbiAqICAgICBjb25zdCBzZWxlY3Rpb24gPSBmcm9tLmdldFJvb3ROb2RlKCkuZ2V0U2VsZWN0aW9uKCk7XG4gKiAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICogICAgIHJhbmdlLnNldFN0YXJ0QmVmb3JlKGZyb20pO1xuICogICAgIHJhbmdlLnNldEVuZEFmdGVyKHRvKTtcbiAqICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gKiAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAqICAgfSxcbiAqICAgZnJvbUpTSGFuZGxlLFxuICogICB0b0pTSGFuZGxlXG4gKiApO1xuICogYGBgXG4gKlxuICogSWYgeW91IHRoZW4gd291bGQgd2FudCB0byBjb3B5LXBhc3RlIHlvdXIgc2VsZWN0aW9uLCB5b3UgY2FuIHVzZSB0aGUgY2xpcGJvYXJkIGFwaTpcbiAqXG4gKiBgYGB0c1xuICogLy8gVGhlIGNsaXBib2FyZCBhcGkgZG9lcyBub3QgYWxsb3cgeW91IHRvIGNvcHksIHVubGVzcyB0aGUgdGFiIGlzIGZvY3VzZWQuXG4gKiBhd2FpdCBwYWdlLmJyaW5nVG9Gcm9udCgpO1xuICogYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7XG4gKiAgIC8vIENvcHkgdGhlIHNlbGVjdGVkIGNvbnRlbnQgdG8gdGhlIGNsaXBib2FyZFxuICogICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICogICAvLyBPYnRhaW4gdGhlIGNvbnRlbnQgb2YgdGhlIGNsaXBib2FyZCBhcyBhIHN0cmluZ1xuICogICByZXR1cm4gbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpO1xuICogfSk7XG4gKiBgYGBcbiAqXG4gKiAqKk5vdGUqKjogSWYgeW91IHdhbnQgYWNjZXNzIHRvIHRoZSBjbGlwYm9hcmQgQVBJLFxuICogeW91IGhhdmUgdG8gZ2l2ZSBpdCBwZXJtaXNzaW9uIHRvIGRvIHNvOlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBicm93c2VyXG4gKiAgIC5kZWZhdWx0QnJvd3NlckNvbnRleHQoKVxuICogICAub3ZlcnJpZGVQZXJtaXNzaW9ucygnPHlvdXIgb3JpZ2luPicsIFtcbiAqICAgICAnY2xpcGJvYXJkLXJlYWQnLFxuICogICAgICdjbGlwYm9hcmQtd3JpdGUnLFxuICogICBdKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIE1vdXNlIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxufVxuLyoqXG4gKiBUaGUgVG91Y2hzY3JlZW4gY2xhc3MgZXhwb3NlcyB0b3VjaHNjcmVlbiBldmVudHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUb3VjaHNjcmVlbiB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVzIGEgYHRvdWNoc3RhcnRgIGFuZCBgdG91Y2hlbmRgIGV2ZW50LlxuICAgICAqIEBwYXJhbSB4IC0gSG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgdGFwLlxuICAgICAqIEBwYXJhbSB5IC0gVmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHRhcC5cbiAgICAgKi9cbiAgICBhc3luYyB0YXAoeCwgeSkge1xuICAgICAgICBhd2FpdCB0aGlzLnRvdWNoU3RhcnQoeCwgeSk7XG4gICAgICAgIGF3YWl0IHRoaXMudG91Y2hFbmQoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbnB1dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fcnVuSW5pdGlhbGl6ZXJzID0gKHRoaXMgJiYgdGhpcy5fX3J1bkluaXRpYWxpemVycykgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcbnZhciBfX2VzRGVjb3JhdGUgPSAodGhpcyAmJiB0aGlzLl9fZXNEZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gICAgZG9uZSA9IHRydWU7XG59O1xudmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbmltcG9ydCB7IGRlYnVnRXJyb3IsIHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlYWJsZSwgdGhyb3dJZkRpc3Bvc2VkIH0gZnJvbSAnLi4vdXRpbC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VTeW1ib2wsIGFzeW5jRGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYSBKYXZhU2NyaXB0IG9iamVjdC4gSW5zdGFuY2VzIGNhbiBiZSBjcmVhdGVkIHVzaW5nXG4gKiB7QGxpbmsgUGFnZS5ldmFsdWF0ZUhhbmRsZX0uXG4gKlxuICogSGFuZGxlcyBwcmV2ZW50IHRoZSByZWZlcmVuY2VkIEphdmFTY3JpcHQgb2JqZWN0IGZyb20gYmVpbmcgZ2FyYmFnZS1jb2xsZWN0ZWRcbiAqIHVubGVzcyB0aGUgaGFuZGxlIGlzIHB1cnBvc2VseSB7QGxpbmsgSlNIYW5kbGUuZGlzcG9zZSB8IGRpc3Bvc2VkfS4gSlNIYW5kbGVzXG4gKiBhcmUgYXV0by1kaXNwb3NlZCB3aGVuIHRoZWlyIGFzc29jaWF0ZWQgZnJhbWUgaXMgbmF2aWdhdGVkIGF3YXkgb3IgdGhlIHBhcmVudFxuICogY29udGV4dCBnZXRzIGRlc3Ryb3llZC5cbiAqXG4gKiBIYW5kbGVzIGNhbiBiZSB1c2VkIGFzIGFyZ3VtZW50cyBmb3IgYW55IGV2YWx1YXRpb24gZnVuY3Rpb24gc3VjaCBhc1xuICoge0BsaW5rIFBhZ2UuJGV2YWx9LCB7QGxpbmsgUGFnZS5ldmFsdWF0ZX0sIGFuZCB7QGxpbmsgUGFnZS5ldmFsdWF0ZUhhbmRsZX0uXG4gKiBUaGV5IGFyZSByZXNvbHZlZCB0byB0aGVpciByZWZlcmVuY2VkIG9iamVjdC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCB3aW5kb3dIYW5kbGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlSGFuZGxlKCgpID0+IHdpbmRvdyk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmxldCBKU0hhbmRsZSA9ICgoKSA9PiB7XG4gICAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbbW92ZWFibGVdO1xuICAgIGxldCBfY2xhc3NEZXNjcmlwdG9yO1xuICAgIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfY2xhc3NUaGlzO1xuICAgIGxldCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfZ2V0UHJvcGVydHlfZGVjb3JhdG9ycztcbiAgICBsZXQgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycztcbiAgICB2YXIgSlNIYW5kbGUgPSBjbGFzcyB7XG4gICAgICAgIHN0YXRpYyB7IF9jbGFzc1RoaXMgPSB0aGlzOyB9XG4gICAgICAgIHN0YXRpYyB7XG4gICAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZ2V0UHJvcGVydHlfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImdldFByb3BlcnR5XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJnZXRQcm9wZXJ0eVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmdldFByb3BlcnR5IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9nZXRQcm9wZXJ0aWVzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJnZXRQcm9wZXJ0aWVzXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJnZXRQcm9wZXJ0aWVzXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZ2V0UHJvcGVydGllcyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6IFwiY2xhc3NcIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIEpTSGFuZGxlID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7XG4gICAgICAgICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7XG4gICAgICAgICAgICBfX3J1bkluaXRpYWxpemVycyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBfX3J1bkluaXRpYWxpemVycyh0aGlzLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCBoYW5kbGUgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlYWxtLmV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgdGhpcywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCBoYW5kbGUgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZXZhbHVhdGVIYW5kbGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlYWxtLmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgdGhpcywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ldmFsdWF0ZUhhbmRsZSgob2JqZWN0LCBwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0W3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICB9LCBwcm9wZXJ0eU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgbWFwIG9mIGhhbmRsZXMgcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IGhhbmRsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgbGlzdEhhbmRsZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGVIYW5kbGUoKCkgPT4gZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICAgICAqIGNvbnN0IHByb3BlcnRpZXMgPSBhd2FpdCBsaXN0SGFuZGxlLmdldFByb3BlcnRpZXMoKTtcbiAgICAgICAgICogY29uc3QgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICogZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzLnZhbHVlcygpKSB7XG4gICAgICAgICAqICAgY29uc3QgZWxlbWVudCA9IHByb3BlcnR5LmFzRWxlbWVudCgpO1xuICAgICAgICAgKiAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAqICAgICBjaGlsZHJlbi5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgKiAgIH1cbiAgICAgICAgICogfVxuICAgICAgICAgKiBjaGlsZHJlbjsgLy8gaG9sZHMgZWxlbWVudEhhbmRsZXMgdG8gYWxsIGNoaWxkcmVuIG9mIGRvY3VtZW50LmJvZHlcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lcyA9IGF3YWl0IHRoaXMuZXZhbHVhdGUob2JqZWN0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnVtZXJhYmxlUHJvcGVydGllcyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiBkZXNjcmlwdG9ycykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcnNbcHJvcGVydHlOYW1lXT8uZW51bWVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnVtZXJhYmxlUHJvcGVydGllcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb3BlcnR5TmFtZXMubWFwKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoa2V5KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnR5TmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIHJlc3VsdHNba2V5XSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KHZhbHVlLCBoYW5kbGUubW92ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudl8xLmVycm9yID0gZV8xO1xuICAgICAgICAgICAgICAgICAgICBlbnZfMS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBbKF9nZXRQcm9wZXJ0eV9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpXSwgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKV0sIGRpc3Bvc2VTeW1ib2wpXSgpIHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZGlzcG9zZSgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgW2FzeW5jRGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBKU0hhbmRsZSA9IF9jbGFzc1RoaXM7XG59KSgpO1xuZXhwb3J0IHsgSlNIYW5kbGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUpTSGFuZGxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG52YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xuaW1wb3J0IHsgY29uY2F0LCBFTVBUWSwgZmlsdGVyLCBmaXJzdCwgZmlyc3RWYWx1ZUZyb20sIGZyb20sIG1hcCwgbWVyZ2UsIG1lcmdlTWFwLCBtZXJnZVNjYW4sIG9mLCByYWNlV2l0aCwgUmVwbGF5U3ViamVjdCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2UsIHRha2VVbnRpbCwgdGltZXIsIH0gZnJvbSAnLi4vLi4vdGhpcmRfcGFydHkvcnhqcy9yeGpzLmpzJztcbmltcG9ydCB7IFRhcmdldENsb3NlRXJyb3IgfSBmcm9tICcuLi9jb21tb24vRXJyb3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IFRpbWVvdXRTZXR0aW5ncyB9IGZyb20gJy4uL2NvbW1vbi9UaW1lb3V0U2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgZnJvbUVtaXR0ZXJFdmVudCwgZmlsdGVyQXN5bmMsIGltcG9ydEZTUHJvbWlzZXMsIGlzU3RyaW5nLCBORVRXT1JLX0lETEVfVElNRSwgdGltZW91dCwgd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSwgZnJvbUFib3J0U2lnbmFsLCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuLi91dGlsL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQXN5bmNEaXNwb3NhYmxlU3RhY2ssIGFzeW5jRGlzcG9zZVN5bWJvbCwgRGlzcG9zYWJsZVN0YWNrLCBkaXNwb3NlU3ltYm9sLCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbkxvY2F0b3IsIExvY2F0b3IsIE5vZGVMb2NhdG9yLCB9IGZyb20gJy4vbG9jYXRvcnMvbG9jYXRvcnMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRTY3JlZW5zaG90T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5vcHRpbWl6ZUZvclNwZWVkID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLnR5cGUgPz89ICdwbmcnO1xuICAgIG9wdGlvbnMuZnJvbVN1cmZhY2UgPz89IHRydWU7XG4gICAgb3B0aW9ucy5mdWxsUGFnZSA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5vbWl0QmFja2dyb3VuZCA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5lbmNvZGluZyA/Pz0gJ2JpbmFyeSc7XG4gICAgb3B0aW9ucy5jYXB0dXJlQmV5b25kVmlld3BvcnQgPz89IHRydWU7XG59XG4vKipcbiAqIFBhZ2UgcHJvdmlkZXMgbWV0aG9kcyB0byBpbnRlcmFjdCB3aXRoIGEgc2luZ2xlIHRhYiBvclxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZXh0ZW5zaW9ucy9iYWNrZ3JvdW5kX3BhZ2VzIHwgZXh0ZW5zaW9uIGJhY2tncm91bmQgcGFnZX1cbiAqIGluIHRoZSBicm93c2VyLlxuICpcbiAqIDo6Om5vdGVcbiAqXG4gKiBPbmUgQnJvd3NlciBpbnN0YW5jZSBtaWdodCBoYXZlIG11bHRpcGxlIFBhZ2UgaW5zdGFuY2VzLlxuICpcbiAqIDo6OlxuICpcbiAqIEBleGFtcGxlXG4gKiBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIHBhZ2UsIG5hdmlnYXRlcyBpdCB0byBhIFVSTCwgYW5kIHRoZW4gc2F2ZXMgYSBzY3JlZW5zaG90OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gKlxuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vZXhhbXBsZS5jb20nKTtcbiAqICAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHtwYXRoOiAnc2NyZWVuc2hvdC5wbmcnfSk7XG4gKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqIH0pKCk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgUGFnZSBjbGFzcyBleHRlbmRzIGZyb20gUHVwcGV0ZWVyJ3Mge0BsaW5rIEV2ZW50RW1pdHRlcn0gY2xhc3MgYW5kIHdpbGxcbiAqIGVtaXQgdmFyaW91cyBldmVudHMgd2hpY2ggYXJlIGRvY3VtZW50ZWQgaW4gdGhlIHtAbGluayBQYWdlRXZlbnR9IGVudW0uXG4gKlxuICogQGV4YW1wbGVcbiAqIFRoaXMgZXhhbXBsZSBsb2dzIGEgbWVzc2FnZSBmb3IgYSBzaW5nbGUgcGFnZSBgbG9hZGAgZXZlbnQ6XG4gKlxuICogYGBgdHNcbiAqIHBhZ2Uub25jZSgnbG9hZCcsICgpID0+IGNvbnNvbGUubG9nKCdQYWdlIGxvYWRlZCEnKSk7XG4gKiBgYGBcbiAqXG4gKiBUbyB1bnN1YnNjcmliZSBmcm9tIGV2ZW50cyB1c2UgdGhlIHtAbGluayBFdmVudEVtaXR0ZXIub2ZmfSBtZXRob2Q6XG4gKlxuICogYGBgdHNcbiAqIGZ1bmN0aW9uIGxvZ1JlcXVlc3QoaW50ZXJjZXB0ZWRSZXF1ZXN0KSB7XG4gKiAgIGNvbnNvbGUubG9nKCdBIHJlcXVlc3Qgd2FzIG1hZGU6JywgaW50ZXJjZXB0ZWRSZXF1ZXN0LnVybCgpKTtcbiAqIH1cbiAqIHBhZ2Uub24oJ3JlcXVlc3QnLCBsb2dSZXF1ZXN0KTtcbiAqIC8vIFNvbWV0aW1lIGxhdGVyLi4uXG4gKiBwYWdlLm9mZigncmVxdWVzdCcsIGxvZ1JlcXVlc3QpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5sZXQgUGFnZSA9ICgoKSA9PiB7XG4gICAgbGV0IF9jbGFzc1N1cGVyID0gRXZlbnRFbWl0dGVyO1xuICAgIGxldCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfc2NyZWVuc2hvdF9kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBQYWdlIGV4dGVuZHMgX2NsYXNzU3VwZXIge1xuICAgICAgICBzdGF0aWMge1xuICAgICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2NyZWVuc2hvdF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2NyZWVuc2hvdFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwic2NyZWVuc2hvdFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNjcmVlbnNob3QgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX2lzRHJhZ2dpbmcgPSAoX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpLCBmYWxzZSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIF90aW1lb3V0U2V0dGluZ3MgPSBuZXcgVGltZW91dFNldHRpbmdzKCk7XG4gICAgICAgICNyZXF1ZXN0SGFuZGxlcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAjaW5mbGlnaHQkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJyZXF1ZXN0XCIgLyogUGFnZUV2ZW50LlJlcXVlc3QgKi8pXG4gICAgICAgICAgICAgICAgLnBpcGUobWVyZ2VNYXAob3JpZ2luYWxSZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uY2F0KG9mKDEpLCBtZXJnZShmcm9tRW1pdHRlckV2ZW50KHRoaXMsIFwicmVxdWVzdGZhaWxlZFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0RmFpbGVkICovKSwgZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInJlcXVlc3RmaW5pc2hlZFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0RmluaXNoZWQgKi8pLCBmcm9tRW1pdHRlckV2ZW50KHRoaXMsIFwicmVzcG9uc2VcIiAvKiBQYWdlRXZlbnQuUmVzcG9uc2UgKi8pLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB9KSkpLnBpcGUoZmlsdGVyKHJlcXVlc3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5pZCA9PT0gb3JpZ2luYWxSZXF1ZXN0LmlkO1xuICAgICAgICAgICAgICAgIH0pLCB0YWtlKDEpLCBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIH0pLCBtZXJnZVNjYW4oKGFjYywgYWRkZW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKGFjYyArIGFkZGVuZCk7XG4gICAgICAgICAgICB9LCAwKSwgdGFrZVVudGlsKGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykpLCBzdGFydFdpdGgoMCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLiNpbmZsaWdodCQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0ZW4gdG8gcGFnZSBldmVudHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGV4aXN0cyB0byBkZWZpbmUgZXZlbnQgdHlwaW5ncyBhbmQgaGFuZGxlIHByb3BlciB3aXJldXAgb2ZcbiAgICAgICAgICogY29vcGVyYXRpdmUgcmVxdWVzdCBpbnRlcmNlcHRpb24uIEFjdHVhbCBldmVudCBsaXN0ZW5pbmcgYW5kIGRpc3BhdGNoaW5nIGlzXG4gICAgICAgICAqIGRlbGVnYXRlZCB0byB7QGxpbmsgRXZlbnRFbWl0dGVyfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBvbih0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgICAgICBpZiAodHlwZSAhPT0gXCJyZXF1ZXN0XCIgLyogUGFnZUV2ZW50LlJlcXVlc3QgKi8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIub24odHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgd3JhcHBlciA9IHRoaXMuI3JlcXVlc3RIYW5kbGVycy5nZXQoaGFuZGxlcik7XG4gICAgICAgICAgICBpZiAod3JhcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5lbnF1ZXVlSW50ZXJjZXB0QWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZXF1ZXN0SGFuZGxlcnMuc2V0KGhhbmRsZXIsIHdyYXBwZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uKHR5cGUsIHdyYXBwZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIG9mZih0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJyZXF1ZXN0XCIgLyogUGFnZUV2ZW50LlJlcXVlc3QgKi8pIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcmVxdWVzdEhhbmRsZXJzLmdldChoYW5kbGVyKSB8fCBoYW5kbGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9mZih0eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICoge0Bpbmhlcml0RG9jIEFjY2Vzc2liaWxpdHl9XG4gICAgICAgICAqL1xuICAgICAgICBnZXQgYWNjZXNzaWJpbGl0eSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLmFjY2Vzc2liaWxpdHk7XG4gICAgICAgIH1cbiAgICAgICAgbG9jYXRvcihzZWxlY3Rvck9yRnVuYykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxlY3Rvck9yRnVuYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZUxvY2F0b3IuY3JlYXRlKHRoaXMsIHNlbGVjdG9yT3JGdW5jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbkxvY2F0b3IuY3JlYXRlKHRoaXMsIHNlbGVjdG9yT3JGdW5jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQSBzaG9ydGN1dCBmb3Ige0BsaW5rIExvY2F0b3IucmFjZX0gdGhhdCBkb2VzIG5vdCByZXF1aXJlIHN0YXRpYyBpbXBvcnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGxvY2F0b3JSYWNlKGxvY2F0b3JzKSB7XG4gICAgICAgICAgICByZXR1cm4gTG9jYXRvci5yYWNlKGxvY2F0b3JzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4gSWYgbm8gZWxlbWVudCBtYXRjaGVzXG4gICAgICAgICAqIHRoZSBzZWxlY3RvciwgdGhlIHJldHVybiB2YWx1ZSByZXNvbHZlcyB0byBgbnVsbGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuJCB8IFBhZ2UubWFpbkZyYW1lKCkuJChzZWxlY3RvcikgfS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLiQoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaW5kcyBlbGVtZW50cyBvbiB0aGUgcGFnZSB0aGF0IG1hdGNoIHRoZSBzZWxlY3Rvci4gSWYgbm8gZWxlbWVudHNcbiAgICAgICAgICogbWF0Y2ggdGhlIHNlbGVjdG9yLCB0aGUgcmV0dXJuIHZhbHVlIHJlc29sdmVzIHRvIGBbXWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuJCQgfCBQYWdlLm1haW5GcmFtZSgpLiQkKHNlbGVjdG9yKSB9LlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgJCQoc2VsZWN0b3IsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLiQkKHNlbGVjdG9yLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHtAbGluayBQYWdlLmV2YWx1YXRlIHwgcGFnZS5ldmFsdWF0ZX0gYW5kXG4gICAgICAgICAqIGBwYWdlLmV2YWx1YXRlSGFuZGxlYCBpcyB0aGF0IGBldmFsdWF0ZUhhbmRsZWAgd2lsbCByZXR1cm4gdGhlIHZhbHVlXG4gICAgICAgICAqIHdyYXBwZWQgaW4gYW4gaW4tcGFnZSBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gYHBhZ2UuZXZhbHVhdGVIYW5kbGVgIHJldHVybnMgYSBQcm9taXNlLCB0aGVcbiAgICAgICAgICogZnVuY3Rpb24gd2lsbCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0byByZXNvbHZlIGFuZCByZXR1cm4gaXRzIHZhbHVlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBZb3UgY2FuIHBhc3MgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIChhbHRob3VnaCBmdW5jdGlvbnMgYXJlXG4gICAgICAgICAqIHJlY29tbWVuZGVkIGFzIHRoZXkgYXJlIGVhc2llciB0byBkZWJ1ZyBhbmQgdXNlIHdpdGggVHlwZVNjcmlwdCk6XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGFIYW5kbGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlSGFuZGxlKCdkb2N1bWVudCcpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICoge0BsaW5rIEpTSGFuZGxlfSBpbnN0YW5jZXMgY2FuIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gdGhlIGBwYWdlRnVuY3Rpb25gOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBhSGFuZGxlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZUhhbmRsZSgoKSA9PiBkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICogY29uc3QgcmVzdWx0SGFuZGxlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZUhhbmRsZShcbiAgICAgICAgICogICBib2R5ID0+IGJvZHkuaW5uZXJIVE1MLFxuICAgICAgICAgKiAgIGFIYW5kbGVcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc29sZS5sb2coYXdhaXQgcmVzdWx0SGFuZGxlLmpzb25WYWx1ZSgpKTtcbiAgICAgICAgICogYXdhaXQgcmVzdWx0SGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIE1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEge0BsaW5rIEpTSGFuZGxlfSxcbiAgICAgICAgICogYnV0IGlmIGBwYWdlRnVuY3Rpb25gIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudCxcbiAgICAgICAgICogeW91IGluc3RlYWQgZ2V0IGFuIHtAbGluayBFbGVtZW50SGFuZGxlfSBiYWNrOlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBidXR0b24gPSBhd2FpdCBwYWdlLmV2YWx1YXRlSGFuZGxlKCgpID0+XG4gICAgICAgICAqICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uJylcbiAgICAgICAgICogKTtcbiAgICAgICAgICogLy8gY2FuIGNhbGwgYGNsaWNrYCBiZWNhdXNlIGBidXR0b25gIGlzIGFuIGBFbGVtZW50SGFuZGxlYFxuICAgICAgICAgKiBhd2FpdCBidXR0b24uY2xpY2soKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBUeXBlU2NyaXB0IGRlZmluaXRpb25zIGFzc3VtZSB0aGF0IGBldmFsdWF0ZUhhbmRsZWAgcmV0dXJuc1xuICAgICAgICAgKiBhIGBKU0hhbmRsZWAsIGJ1dCBpZiB5b3Uga25vdyBpdCdzIGdvaW5nIHRvIHJldHVybiBhblxuICAgICAgICAgKiBgRWxlbWVudEhhbmRsZWAsIHBhc3MgaXQgYXMgdGhlIGdlbmVyaWMgYXJndW1lbnQ6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGJ1dHRvbiA9IGF3YWl0IHBhZ2UuZXZhbHVhdGVIYW5kbGU8RWxlbWVudEhhbmRsZT4oLi4uKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBhIGZ1bmN0aW9uIHRoYXQgaXMgcnVuIHdpdGhpbiB0aGUgcGFnZVxuICAgICAgICAgKiBAcGFyYW0gYXJncyAtIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHBhZ2VGdW5jdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZXZhbHVhdGVIYW5kbGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IHdpdGhpbiB0aGUgcGFnZSB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yXG4gICAgICAgICAqIGFuZCBwYXNzZXMgdGhlIHJlc3VsdCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBJZiBubyBlbGVtZW50IGlzIGZvdW5kIG1hdGNoaW5nIGBzZWxlY3RvcmAsIHRoZSBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgYHBhZ2VGdW5jdGlvbmAgcmV0dXJucyBhIHByb21pc2UgYCRldmFsYCB3aWxsIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvXG4gICAgICAgICAqIHJlc29sdmUgYW5kIHRoZW4gcmV0dXJuIGl0cyB2YWx1ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VhcmNoVmFsdWUgPSBhd2FpdCBwYWdlLiRldmFsKCcjc2VhcmNoJywgZWwgPT4gZWwudmFsdWUpO1xuICAgICAgICAgKiBjb25zdCBwcmVsb2FkSHJlZiA9IGF3YWl0IHBhZ2UuJGV2YWwoJ2xpbmtbcmVsPXByZWxvYWRdJywgZWwgPT4gZWwuaHJlZik7XG4gICAgICAgICAqIGNvbnN0IGh0bWwgPSBhd2FpdCBwYWdlLiRldmFsKCcubWFpbi1jb250YWluZXInLCBlbCA9PiBlbC5vdXRlckhUTUwpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogSWYgeW91IGFyZSB1c2luZyBUeXBlU2NyaXB0LCB5b3UgbWF5IGhhdmUgdG8gcHJvdmlkZSBhbiBleHBsaWNpdCB0eXBlIHRvIHRoZVxuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgdHlwZWQgYXMgYEVsZW1lbnRgLCBidXQgeW91IG1heSBuZWVkIHRvIHByb3ZpZGUgYSBtb3JlXG4gICAgICAgICAqIHNwZWNpZmljIHN1Yi10eXBlOlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiAvLyBpZiB5b3UgZG9uJ3QgcHJvdmlkZSBIVE1MSW5wdXRFbGVtZW50IGhlcmUsIFRTIHdpbGwgZXJyb3JcbiAgICAgICAgICogLy8gYXMgYHZhbHVlYCBpcyBub3Qgb24gYEVsZW1lbnRgXG4gICAgICAgICAqIGNvbnN0IHNlYXJjaFZhbHVlID0gYXdhaXQgcGFnZS4kZXZhbChcbiAgICAgICAgICogICAnI3NlYXJjaCcsXG4gICAgICAgICAqICAgKGVsOiBIVE1MSW5wdXRFbGVtZW50KSA9PiBlbC52YWx1ZVxuICAgICAgICAgKiApO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIGluZmVyIHRoZSByZXR1cm4gdHlwZVxuICAgICAgICAgKiBmcm9tIHRoZSBgcGFnZUZ1bmN0aW9uYCB5b3UgcHJvdmlkZS4gSWYgaXQgaXMgdW5hYmxlIHRvLCB5b3UgY2FuIHVzZSB0aGUgZ2VuZXJpY1xuICAgICAgICAgKiB0eXBlIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHdoYXQgcmV0dXJuIHR5cGUgeW91IGV4cGVjdCBmcm9tIGAkZXZhbGA6XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIC8vIFRoZSBjb21waWxlciBjYW4gaW5mZXIgdGhlIHJldHVybiB0eXBlIGluIHRoaXMgY2FzZSwgYnV0IGlmIGl0IGNhbid0XG4gICAgICAgICAqIC8vIG9yIGlmIHlvdSB3YW50IHRvIGJlIG1vcmUgZXhwbGljaXQsIHByb3ZpZGUgaXQgYXMgdGhlIGdlbmVyaWMgdHlwZS5cbiAgICAgICAgICogY29uc3Qgc2VhcmNoVmFsdWUgPSBhd2FpdCBwYWdlLiRldmFsPHN0cmluZz4oXG4gICAgICAgICAqICAgJyNzZWFyY2gnLFxuICAgICAgICAgKiAgIChlbDogSFRNTElucHV0RWxlbWVudCkgPT4gZWwudmFsdWVcbiAgICAgICAgICogKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSB0aGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBwYWdlIGNvbnRleHQuXG4gICAgICAgICAqIFdpbGwgYmUgcGFzc2VkIHRoZSByZXN1bHQgb2YgdGhlIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yIGFzIGl0c1xuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0aHJvdWdoIHRvIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgYHBhZ2VGdW5jdGlvbmAuIElmIGl0IHJldHVybnMgYW4gZWxlbWVudCBpdFxuICAgICAgICAgKiBpcyB3cmFwcGVkIGluIGFuIHtAbGluayBFbGVtZW50SGFuZGxlfSwgZWxzZSB0aGUgcmF3IHZhbHVlIGl0c2VsZiBpc1xuICAgICAgICAgKiByZXR1cm5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICRldmFsKHNlbGVjdG9yLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy4kZXZhbC5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuJGV2YWwoc2VsZWN0b3IsIHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvciBhbmQgcGFzc2VzIHRoZVxuICAgICAgICAgKiByZXN1bHRpbmcgYXJyYXkgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBgcGFnZUZ1bmN0aW9uYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogSWYgYHBhZ2VGdW5jdGlvbmAgcmV0dXJucyBhIHByb21pc2UgYCQkZXZhbGAgd2lsbCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0b1xuICAgICAgICAgKiByZXNvbHZlIGFuZCB0aGVuIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIC8vIGdldCB0aGUgYW1vdW50IG9mIGRpdnMgb24gdGhlIHBhZ2VcbiAgICAgICAgICogY29uc3QgZGl2Q291bnQgPSBhd2FpdCBwYWdlLiQkZXZhbCgnZGl2JywgZGl2cyA9PiBkaXZzLmxlbmd0aCk7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIGdldCB0aGUgdGV4dCBjb250ZW50IG9mIGFsbCB0aGUgYC5vcHRpb25zYCBlbGVtZW50czpcbiAgICAgICAgICogY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHBhZ2UuJCRldmFsKCdkaXYgPiBzcGFuLm9wdGlvbnMnLCBvcHRpb25zID0+IHtcbiAgICAgICAgICogICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+IG9wdGlvbi50ZXh0Q29udGVudCk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogSWYgeW91IGFyZSB1c2luZyBUeXBlU2NyaXB0LCB5b3UgbWF5IGhhdmUgdG8gcHJvdmlkZSBhbiBleHBsaWNpdCB0eXBlIHRvIHRoZVxuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgdHlwZWQgYXMgYEVsZW1lbnRbXWAsIGJ1dCB5b3UgbWF5IG5lZWQgdG8gcHJvdmlkZSBhIG1vcmVcbiAgICAgICAgICogc3BlY2lmaWMgc3ViLXR5cGU6XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGF3YWl0IHBhZ2UuJCRldmFsKCdpbnB1dCcsIGVsZW1lbnRzID0+IHtcbiAgICAgICAgICogICByZXR1cm4gZWxlbWVudHMubWFwKGUgPT4gZS52YWx1ZSk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIGluZmVyIHRoZSByZXR1cm4gdHlwZVxuICAgICAgICAgKiBmcm9tIHRoZSBgcGFnZUZ1bmN0aW9uYCB5b3UgcHJvdmlkZS4gSWYgaXQgaXMgdW5hYmxlIHRvLCB5b3UgY2FuIHVzZSB0aGUgZ2VuZXJpY1xuICAgICAgICAgKiB0eXBlIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHdoYXQgcmV0dXJuIHR5cGUgeW91IGV4cGVjdCBmcm9tIGAkJGV2YWxgOlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBhbGxJbnB1dFZhbHVlcyA9IGF3YWl0IHBhZ2UuJCRldmFsKCdpbnB1dCcsIGVsZW1lbnRzID0+XG4gICAgICAgICAqICAgZWxlbWVudHMubWFwKGUgPT4gZS50ZXh0Q29udGVudClcbiAgICAgICAgICogKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSB0aGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBwYWdlIGNvbnRleHQuXG4gICAgICAgICAqIFdpbGwgYmUgcGFzc2VkIGFuIGFycmF5IG9mIG1hdGNoaW5nIGVsZW1lbnRzIGFzIGl0cyBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0aHJvdWdoIHRvIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgYHBhZ2VGdW5jdGlvbmAuIElmIGl0IHJldHVybnMgYW4gZWxlbWVudCBpdFxuICAgICAgICAgKiBpcyB3cmFwcGVkIGluIGFuIHtAbGluayBFbGVtZW50SGFuZGxlfSwgZWxzZSB0aGUgcmF3IHZhbHVlIGl0c2VsZiBpc1xuICAgICAgICAgKiByZXR1cm5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuJCRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluRnJhbWUoKS4kJGV2YWwoc2VsZWN0b3IsIHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgYSBgPHNjcmlwdD5gIHRhZyBpbnRvIHRoZSBwYWdlIHdpdGggdGhlIGRlc2lyZWQgVVJMIG9yIGNvbnRlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFNob3J0Y3V0IGZvclxuICAgICAgICAgKiB7QGxpbmsgRnJhbWUuYWRkU2NyaXB0VGFnIHwgcGFnZS5tYWluRnJhbWUoKS5hZGRTY3JpcHRUYWcob3B0aW9ucyl9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBzY3JpcHQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIHtAbGluayBFbGVtZW50SGFuZGxlIHwgZWxlbWVudCBoYW5kbGV9IHRvIHRoZSBpbmplY3RlZFxuICAgICAgICAgKiBgPHNjcmlwdD5gIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhZGRTY3JpcHRUYWcob3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuYWRkU2NyaXB0VGFnKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGFkZFN0eWxlVGFnKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmFkZFN0eWxlVGFnKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGFnZSdzIFVSTC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogU2hvcnRjdXQgZm9yIHtAbGluayBGcmFtZS51cmwgfCBwYWdlLm1haW5GcmFtZSgpLnVybCgpfS5cbiAgICAgICAgICovXG4gICAgICAgIHVybCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLnVybCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZnVsbCBIVE1MIGNvbnRlbnRzIG9mIHRoZSBwYWdlLCBpbmNsdWRpbmcgdGhlIERPQ1RZUEUuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjb250ZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuY29udGVudCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBodG1sIC0gSFRNTCBtYXJrdXAgdG8gYXNzaWduIHRvIHRoZSBwYWdlLlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFBhcmFtZXRlcnMgdGhhdCBoYXMgc29tZSBwcm9wZXJ0aWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2V0Q29udGVudChodG1sLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLnNldENvbnRlbnQoaHRtbCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHtAaW5oZXJpdERvYyBGcmFtZS5nb3RvfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZ290byh1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmdvdG8odXJsLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdHMgZm9yIHRoZSBwYWdlIHRvIG5hdmlnYXRlIHRvIGEgbmV3IFVSTCBvciB0byByZWxvYWQuIEl0IGlzIHVzZWZ1bCB3aGVuXG4gICAgICAgICAqIHlvdSBydW4gY29kZSB0aGF0IHdpbGwgaW5kaXJlY3RseSBjYXVzZSB0aGUgcGFnZSB0byBuYXZpZ2F0ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgW3Jlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICogICBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKCksIC8vIFRoZSBwcm9taXNlIHJlc29sdmVzIGFmdGVyIG5hdmlnYXRpb24gaGFzIGZpbmlzaGVkXG4gICAgICAgICAqICAgcGFnZS5jbGljaygnYS5teS1saW5rJyksIC8vIENsaWNraW5nIHRoZSBsaW5rIHdpbGwgaW5kaXJlY3RseSBjYXVzZSBhIG5hdmlnYXRpb25cbiAgICAgICAgICogXSk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBVc2FnZSBvZiB0aGVcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IaXN0b3J5X0FQSSB8IEhpc3RvcnkgQVBJfVxuICAgICAgICAgKiB0byBjaGFuZ2UgdGhlIFVSTCBpcyBjb25zaWRlcmVkIGEgbmF2aWdhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBOYXZpZ2F0aW9uIHBhcmFtZXRlcnMgd2hpY2ggbWlnaHQgaGF2ZSB0aGUgZm9sbG93aW5nXG4gICAgICAgICAqIHByb3BlcnRpZXM6XG4gICAgICAgICAqIEByZXR1cm5zIEEgYFByb21pc2VgIHdoaWNoIHJlc29sdmVzIHRvIHRoZSBtYWluIHJlc291cmNlIHJlc3BvbnNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIEluIGNhc2Ugb2YgbXVsdGlwbGUgcmVkaXJlY3RzLCB0aGUgbmF2aWdhdGlvbiB3aWxsIHJlc29sdmUgd2l0aCB0aGVcbiAgICAgICAgICogICByZXNwb25zZSBvZiB0aGUgbGFzdCByZWRpcmVjdC5cbiAgICAgICAgICogLSBJbiBjYXNlIG9mIG5hdmlnYXRpb24gdG8gYSBkaWZmZXJlbnQgYW5jaG9yIG9yIG5hdmlnYXRpb24gZHVlIHRvIEhpc3RvcnlcbiAgICAgICAgICogICBBUEkgdXNhZ2UsIHRoZSBuYXZpZ2F0aW9uIHdpbGwgcmVzb2x2ZSB3aXRoIGBudWxsYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhaXRGb3JOYXZpZ2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkud2FpdEZvck5hdmlnYXRpb24ob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB1cmxPclByZWRpY2F0ZSAtIEEgVVJMIG9yIHByZWRpY2F0ZSB0byB3YWl0IGZvclxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHdhaXRpbmcgcGFyYW1ldGVyc1xuICAgICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSBtYXRjaGVkIHJlcXVlc3RcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgZmlyc3RSZXF1ZXN0ID0gYXdhaXQgcGFnZS53YWl0Rm9yUmVxdWVzdChcbiAgICAgICAgICogICAnaHR0cHM6Ly9leGFtcGxlLmNvbS9yZXNvdXJjZSdcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc3QgZmluYWxSZXF1ZXN0ID0gYXdhaXQgcGFnZS53YWl0Rm9yUmVxdWVzdChcbiAgICAgICAgICogICByZXF1ZXN0ID0+IHJlcXVlc3QudXJsKCkgPT09ICdodHRwczovL2V4YW1wbGUuY29tJ1xuICAgICAgICAgKiApO1xuICAgICAgICAgKiByZXR1cm4gZmluYWxSZXF1ZXN0LnJlc3BvbnNlKCk/Lm9rKCk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBPcHRpb25hbCBXYWl0aW5nIFBhcmFtZXRlcnMgaGF2ZTpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgdGltZW91dGA6IE1heGltdW0gd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcywgZGVmYXVsdHMgdG8gYDMwYCBzZWNvbmRzLCBwYXNzXG4gICAgICAgICAqICAgYDBgIHRvIGRpc2FibGUgdGhlIHRpbWVvdXQuIFRoZSBkZWZhdWx0IHZhbHVlIGNhbiBiZSBjaGFuZ2VkIGJ5IHVzaW5nIHRoZVxuICAgICAgICAgKiAgIHtAbGluayBQYWdlLnNldERlZmF1bHRUaW1lb3V0fSBtZXRob2QuXG4gICAgICAgICAqL1xuICAgICAgICB3YWl0Rm9yUmVxdWVzdCh1cmxPclByZWRpY2F0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSwgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxPclByZWRpY2F0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB1cmxPclByZWRpY2F0ZTtcbiAgICAgICAgICAgICAgICB1cmxPclByZWRpY2F0ZSA9IChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnVybCgpID09PSB1cmw7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmFibGUkID0gZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInJlcXVlc3RcIiAvKiBQYWdlRXZlbnQuUmVxdWVzdCAqLykucGlwZShmaWx0ZXJBc3luYyh1cmxPclByZWRpY2F0ZSksIHJhY2VXaXRoKHRpbWVvdXQobXMpLCBmcm9tQWJvcnRTaWduYWwoc2lnbmFsKSwgZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcImNsb3NlXCIgLyogUGFnZUV2ZW50LkNsb3NlICovKS5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldENsb3NlRXJyb3IoJ1BhZ2UgY2xvc2VkIScpO1xuICAgICAgICAgICAgfSkpKSk7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20ob2JzZXJ2YWJsZSQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gdXJsT3JQcmVkaWNhdGUgLSBBIFVSTCBvciBwcmVkaWNhdGUgdG8gd2FpdCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgd2FpdGluZyBwYXJhbWV0ZXJzXG4gICAgICAgICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIG1hdGNoZWQgcmVzcG9uc2UuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBhd2FpdCBwYWdlLndhaXRGb3JSZXNwb25zZShcbiAgICAgICAgICogICAnaHR0cHM6Ly9leGFtcGxlLmNvbS9yZXNvdXJjZSdcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc3QgZmluYWxSZXNwb25zZSA9IGF3YWl0IHBhZ2Uud2FpdEZvclJlc3BvbnNlKFxuICAgICAgICAgKiAgIHJlc3BvbnNlID0+XG4gICAgICAgICAqICAgICByZXNwb25zZS51cmwoKSA9PT0gJ2h0dHBzOi8vZXhhbXBsZS5jb20nICYmIHJlc3BvbnNlLnN0YXR1cygpID09PSAyMDBcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc3QgZmluYWxSZXNwb25zZSA9IGF3YWl0IHBhZ2Uud2FpdEZvclJlc3BvbnNlKGFzeW5jIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICogICByZXR1cm4gKGF3YWl0IHJlc3BvbnNlLnRleHQoKSkuaW5jbHVkZXMoJzxodG1sPicpO1xuICAgICAgICAgKiB9KTtcbiAgICAgICAgICogcmV0dXJuIGZpbmFsUmVzcG9uc2Uub2soKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIE9wdGlvbmFsIFBhcmFtZXRlciBoYXZlOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIGB0aW1lb3V0YDogTWF4aW11bSB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLCBkZWZhdWx0cyB0byBgMzBgIHNlY29uZHMsXG4gICAgICAgICAqICAgcGFzcyBgMGAgdG8gZGlzYWJsZSB0aGUgdGltZW91dC4gVGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWQgYnkgdXNpbmdcbiAgICAgICAgICogICB0aGUge0BsaW5rIFBhZ2Uuc2V0RGVmYXVsdFRpbWVvdXR9IG1ldGhvZC5cbiAgICAgICAgICovXG4gICAgICAgIHdhaXRGb3JSZXNwb25zZSh1cmxPclByZWRpY2F0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSwgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxPclByZWRpY2F0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB1cmxPclByZWRpY2F0ZTtcbiAgICAgICAgICAgICAgICB1cmxPclByZWRpY2F0ZSA9IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UudXJsKCkgPT09IHVybDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSQgPSBmcm9tRW1pdHRlckV2ZW50KHRoaXMsIFwicmVzcG9uc2VcIiAvKiBQYWdlRXZlbnQuUmVzcG9uc2UgKi8pLnBpcGUoZmlsdGVyQXN5bmModXJsT3JQcmVkaWNhdGUpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSwgZnJvbUFib3J0U2lnbmFsKHNpZ25hbCksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRDbG9zZUVycm9yKCdQYWdlIGNsb3NlZCEnKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKG9ic2VydmFibGUkKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdHMgZm9yIHRoZSBuZXR3b3JrIHRvIGJlIGlkbGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgd2FpdGluZyBiZWhhdmlvci5cbiAgICAgICAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIG9uY2UgdGhlIG5ldHdvcmsgaXMgaWRsZS5cbiAgICAgICAgICovXG4gICAgICAgIHdhaXRGb3JOZXR3b3JrSWRsZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLndhaXRGb3JOZXR3b3JrSWRsZSQob3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHdhaXRGb3JOZXR3b3JrSWRsZSQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSwgaWRsZVRpbWUgPSBORVRXT1JLX0lETEVfVElNRSwgY29uY3VycmVuY3kgPSAwLCBzaWduYWwsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2luZmxpZ2h0JC5waXBlKHN3aXRjaE1hcChpbmZsaWdodCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZmxpZ2h0ID4gY29uY3VycmVuY3kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGltZXIoaWRsZVRpbWUpO1xuICAgICAgICAgICAgfSksIG1hcCgoKSA9PiB7IH0pLCByYWNlV2l0aCh0aW1lb3V0KG1zKSwgZnJvbUFib3J0U2lnbmFsKHNpZ25hbCksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRDbG9zZUVycm9yKCdQYWdlIGNsb3NlZCEnKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXYWl0cyBmb3IgYSBmcmFtZSBtYXRjaGluZyB0aGUgZ2l2ZW4gY29uZGl0aW9ucyB0byBhcHBlYXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGZyYW1lID0gYXdhaXQgcGFnZS53YWl0Rm9yRnJhbWUoYXN5bmMgZnJhbWUgPT4ge1xuICAgICAgICAgKiAgIHJldHVybiBmcmFtZS5uYW1lKCkgPT09ICdUZXN0JztcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FpdEZvckZyYW1lKHVybE9yUHJlZGljYXRlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGltZW91dDogbXMgPSB0aGlzLmdldERlZmF1bHRUaW1lb3V0KCksIHNpZ25hbCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGlmIChpc1N0cmluZyh1cmxPclByZWRpY2F0ZSkpIHtcbiAgICAgICAgICAgICAgICB1cmxPclByZWRpY2F0ZSA9IChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsT3JQcmVkaWNhdGUgPT09IGZyYW1lLnVybCgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyc3RWYWx1ZUZyb20obWVyZ2UoZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcImZyYW1lYXR0YWNoZWRcIiAvKiBQYWdlRXZlbnQuRnJhbWVBdHRhY2hlZCAqLyksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJmcmFtZW5hdmlnYXRlZFwiIC8qIFBhZ2VFdmVudC5GcmFtZU5hdmlnYXRlZCAqLyksIGZyb20odGhpcy5mcmFtZXMoKSkpLnBpcGUoZmlsdGVyQXN5bmModXJsT3JQcmVkaWNhdGUpLCBmaXJzdCgpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSwgZnJvbUFib3J0U2lnbmFsKHNpZ25hbCksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRDbG9zZUVycm9yKCdQYWdlIGNsb3NlZC4nKTtcbiAgICAgICAgICAgIH0pKSkpKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogRW11bGF0ZXMgYSBnaXZlbiBkZXZpY2UncyBtZXRyaWNzIGFuZCB1c2VyIGFnZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBhaWQgZW11bGF0aW9uLCBQdXBwZXRlZXIgcHJvdmlkZXMgYSBsaXN0IG9mIGtub3duIGRldmljZXMgdGhhdCBjYW4gYmVcbiAgICAgICAgICogdmlhIHtAbGluayBLbm93bkRldmljZXN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhIHNob3J0Y3V0IGZvciBjYWxsaW5nIHR3byBtZXRob2RzOlxuICAgICAgICAgKiB7QGxpbmsgUGFnZS5zZXRVc2VyQWdlbnR9IGFuZCB7QGxpbmsgUGFnZS5zZXRWaWV3cG9ydH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmVzaXplIHRoZSBwYWdlLiBBIGxvdCBvZiB3ZWJzaXRlcyBkb24ndCBleHBlY3QgcGhvbmVzIHRvXG4gICAgICAgICAqIGNoYW5nZSBzaXplLCBzbyB5b3Ugc2hvdWxkIGVtdWxhdGUgYmVmb3JlIG5hdmlnYXRpbmcgdG8gdGhlIHBhZ2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGltcG9ydCB7S25vd25EZXZpY2VzfSBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKiBjb25zdCBpUGhvbmUgPSBLbm93bkRldmljZXNbJ2lQaG9uZSA2J107XG4gICAgICAgICAqXG4gICAgICAgICAqIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgICAgICAqICAgYXdhaXQgcGFnZS5lbXVsYXRlKGlQaG9uZSk7XG4gICAgICAgICAqICAgYXdhaXQgcGFnZS5nb3RvKCdodHRwczovL3d3dy5nb29nbGUuY29tJyk7XG4gICAgICAgICAqICAgLy8gb3RoZXIgYWN0aW9ucy4uLlxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBlbXVsYXRlKGRldmljZSkge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VXNlckFnZW50KGRldmljZS51c2VyQWdlbnQpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Vmlld3BvcnQoZGV2aWNlLnZpZXdwb3J0KSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFdmFsdWF0ZXMgYSBmdW5jdGlvbiBpbiB0aGUgcGFnZSdzIGNvbnRleHQgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGZ1bmN0aW9uIHBhc3NlZCB0byBgcGFnZS5ldmFsdWF0ZWAgcmV0dXJucyBhIFByb21pc2UsIHRoZVxuICAgICAgICAgKiBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvIHJlc29sdmUgYW5kIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZyYW1lLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICogICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKDggKiA3KTtcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdCk7IC8vIHByaW50cyBcIjU2XCJcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIFlvdSBjYW4gcGFzcyBhIHN0cmluZyBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gKGFsdGhvdWdoIGZ1bmN0aW9ucyBhcmVcbiAgICAgICAgICogcmVjb21tZW5kZWQgYXMgdGhleSBhcmUgZWFzaWVyIHRvIGRlYnVnIGFuZCB1c2Ugd2l0aCBUeXBlU2NyaXB0KTpcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgYUhhbmRsZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoJzEgKyAyJyk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBnZXQgdGhlIGJlc3QgVHlwZVNjcmlwdCBleHBlcmllbmNlLCB5b3Ugc2hvdWxkIHBhc3MgaW4gYXMgdGhlXG4gICAgICAgICAqIGdlbmVyaWMgdGhlIHR5cGUgb2YgYHBhZ2VGdW5jdGlvbmA6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGFIYW5kbGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IDIpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICoge0BsaW5rIEVsZW1lbnRIYW5kbGV9IGluc3RhbmNlcyAoaW5jbHVkaW5nIHtAbGluayBKU0hhbmRsZX1zKSBjYW4gYmUgcGFzc2VkXG4gICAgICAgICAqIGFzIGFyZ3VtZW50cyB0byB0aGUgYHBhZ2VGdW5jdGlvbmA6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGJvZHlIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJ2JvZHknKTtcbiAgICAgICAgICogY29uc3QgaHRtbCA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoYm9keSA9PiBib2R5LmlubmVySFRNTCwgYm9keUhhbmRsZSk7XG4gICAgICAgICAqIGF3YWl0IGJvZHlIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHBhZ2VGdW5jdGlvbiAtIGEgZnVuY3Rpb24gdGhhdCBpcyBydW4gd2l0aGluIHRoZSBwYWdlXG4gICAgICAgICAqIEBwYXJhbSBhcmdzIC0gYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgcGFnZUZ1bmN0aW9uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHRoZSByZXR1cm4gdmFsdWUgb2YgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBldmFsdWF0ZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy5ldmFsdWF0ZS5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBfbWF5YmVXcml0ZUJ1ZmZlclRvRmlsZShwYXRoLCBidWZmZXIpIHtcbiAgICAgICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0RlNQcm9taXNlcygpO1xuICAgICAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGgsIGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhcHR1cmVzIGEgc2NyZWVuY2FzdCBvZiB0aGlzIHtAbGluayBQYWdlIHwgcGFnZX0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIFJlY29yZGluZyBhIHtAbGluayBQYWdlIHwgcGFnZX06XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIExhdW5jaCBhIGJyb3dzZXJcbiAgICAgICAgICogY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gQ3JlYXRlIGEgbmV3IHBhZ2VcbiAgICAgICAgICogY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBHbyB0byB5b3VyIHNpdGUuXG4gICAgICAgICAqIGF3YWl0IHBhZ2UuZ290byhcImh0dHBzOi8vd3d3LmV4YW1wbGUuY29tXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBTdGFydCByZWNvcmRpbmcuXG4gICAgICAgICAqIGNvbnN0IHJlY29yZGVyID0gYXdhaXQgcGFnZS5zY3JlZW5jYXN0KHtwYXRoOiAncmVjb3JkaW5nLndlYm0nfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIERvIHNvbWV0aGluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogLy8gU3RvcCByZWNvcmRpbmcuXG4gICAgICAgICAqIGF3YWl0IHJlY29yZGVyLnN0b3AoKTtcbiAgICAgICAgICpcbiAgICAgICAgICogYnJvd3Nlci5jbG9zZSgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmVzIHNjcmVlbmNhc3QgYmVoYXZpb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogQWxsIHJlY29yZGluZ3Mgd2lsbCBiZSB7QGxpbmsgaHR0cHM6Ly93d3cud2VibXByb2plY3Qub3JnLyB8IFdlYk19IGZvcm1hdCB1c2luZ1xuICAgICAgICAgKiB0aGUge0BsaW5rIGh0dHBzOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy92cDkvIHwgVlA5fSB2aWRlbyBjb2RlYy4gVGhlIEZQUyBpcyAzMC5cbiAgICAgICAgICpcbiAgICAgICAgICogWW91IG11c3QgaGF2ZSB7QGxpbmsgaHR0cHM6Ly9mZm1wZWcub3JnLyB8IGZmbXBlZ30gaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2NyZWVuY2FzdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IFt7IFNjcmVlblJlY29yZGVyIH0sIFt3aWR0aCwgaGVpZ2h0LCBkZXZpY2VQaXhlbFJhdGlvXV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgaW1wb3J0KCcuLi9ub2RlL1NjcmVlblJlY29yZGVyLmpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy4jZ2V0TmF0aXZlUGl4ZWxEaW1lbnNpb25zKCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIGxldCBjcm9wO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY3JvcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgeCwgeSwgd2lkdGg6IGNyb3BXaWR0aCwgaGVpZ2h0OiBjcm9wSGVpZ2h0LCB9ID0gcm91bmRSZWN0YW5nbGUobm9ybWFsaXplUmVjdGFuZ2xlKG9wdGlvbnMuY3JvcCkpO1xuICAgICAgICAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYGNyb3AueFxcYCBhbmQgXFxgY3JvcC55XFxgIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjcm9wV2lkdGggPD0gMCB8fCBjcm9wSGVpZ2h0IDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGBjcm9wLmhlaWdodFxcYCBhbmQgXFxgY3JvcC53aWR0aFxcYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2lkdGggLyBkZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gaGVpZ2h0IC8gZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgICAgICAgICBpZiAoeCArIGNyb3BXaWR0aCA+IHZpZXdwb3J0V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGBjcm9wLndpZHRoXFxgIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgdmlld3BvcnQgd2lkdGggKCR7dmlld3BvcnRXaWR0aH0pLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoeSArIGNyb3BIZWlnaHQgPiB2aWV3cG9ydEhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYGNyb3AuaGVpZ2h0XFxgIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgdmlld3BvcnQgaGVpZ2h0ICgke3ZpZXdwb3J0SGVpZ2h0fSkuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNyb3AgPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6IHggKiBkZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICB5OiB5ICogZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNyb3BXaWR0aCAqIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogY3JvcEhlaWdodCAqIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnNwZWVkICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zcGVlZCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGBzcGVlZFxcYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2NhbGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnNjYWxlIDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYHNjYWxlXFxgIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZWNvcmRlciA9IG5ldyBTY3JlZW5SZWNvcmRlcih0aGlzLCB3aWR0aCwgaGVpZ2h0LCB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICBwYXRoOiBvcHRpb25zLmZmbXBlZ1BhdGgsXG4gICAgICAgICAgICAgICAgY3JvcCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zdGFydFNjcmVlbmNhc3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHZvaWQgcmVjb3JkZXIuc3RvcCgpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGF0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY3JlYXRlV3JpdGVTdHJlYW0gfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBjcmVhdGVXcml0ZVN0cmVhbShvcHRpb25zLnBhdGgsICdiaW5hcnknKTtcbiAgICAgICAgICAgICAgICByZWNvcmRlci5waXBlKHN0cmVhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgI3NjcmVlbmNhc3RTZXNzaW9uQ291bnQgPSAwO1xuICAgICAgICAjc3RhcnRTY3JlZW5jYXN0UHJvbWlzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgX3N0YXJ0U2NyZWVuY2FzdCgpIHtcbiAgICAgICAgICAgICsrdGhpcy4jc2NyZWVuY2FzdFNlc3Npb25Db3VudDtcbiAgICAgICAgICAgIGlmICghdGhpcy4jc3RhcnRTY3JlZW5jYXN0UHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI3N0YXJ0U2NyZWVuY2FzdFByb21pc2UgPSB0aGlzLm1haW5GcmFtZSgpXG4gICAgICAgICAgICAgICAgICAgIC5jbGllbnQuc2VuZCgnUGFnZS5zdGFydFNjcmVlbmNhc3QnLCB7IGZvcm1hdDogJ3BuZycgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgZmlyc3QgZnJhbWUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLmNsaWVudC5vbmNlKCdQYWdlLnNjcmVlbmNhc3RGcmFtZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy4jc3RhcnRTY3JlZW5jYXN0UHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBfc3RvcFNjcmVlbmNhc3QoKSB7XG4gICAgICAgICAgICAtLXRoaXMuI3NjcmVlbmNhc3RTZXNzaW9uQ291bnQ7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI3N0YXJ0U2NyZWVuY2FzdFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNzdGFydFNjcmVlbmNhc3RQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3NjcmVlbmNhc3RTZXNzaW9uQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmNsaWVudC5zZW5kKCdQYWdlLnN0b3BTY3JlZW5jYXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG5hdGl2ZSwgbm9uLWVtdWxhdGVkIGRpbWVuc2lvbnMgb2YgdGhlIHZpZXdwb3J0LlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgI2dldE5hdGl2ZVBpeGVsRGltZW5zaW9ucygpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBuZXcgRGlzcG9zYWJsZVN0YWNrKCksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAodmlld3BvcnQgJiYgdmlld3BvcnQuZGV2aWNlU2NhbGVGYWN0b3IgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRWaWV3cG9ydCh7IC4uLnZpZXdwb3J0LCBkZXZpY2VTY2FsZUZhY3RvcjogMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2suZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCB0aGlzLnNldFZpZXdwb3J0KHZpZXdwb3J0KS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpXG4gICAgICAgICAgICAgICAgICAgIC5pc29sYXRlZFJlYWxtKClcbiAgICAgICAgICAgICAgICAgICAgLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy52aXN1YWxWaWV3cG9ydC53aWR0aCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnZpc3VhbFZpZXdwb3J0LmhlaWdodCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgZW52XzEuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhc3luYyBzY3JlZW5zaG90KHVzZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfZ3VhcmQgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMiwgYXdhaXQgdGhpcy5icm93c2VyQ29udGV4dCgpLnN0YXJ0U2NyZWVuc2hvdCgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2Ugc3RydWN0dXJlZENsb25lIGFmdGVyIE5vZGUgMTYgc3VwcG9ydCBpcyBkcm9wcGVkLlxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnVzZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBjbGlwOiB1c2VyT3B0aW9ucy5jbGlwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi51c2VyT3B0aW9ucy5jbGlwLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5wYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBvcHRpb25zLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgd2UgY2Fubm90IHVzZSBOb2RlLmpzIGhlcmUgZHVlIHRvIGJyb3dzZXIgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZVBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZShmaWxlUGF0aC5sYXN0SW5kZXhPZignLicpICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGV4dGVuc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncG5nJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAncG5nJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2pwZWcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnanBnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnanBlZyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd3ZWJwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnd2VicCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPCAwIHx8IG9wdGlvbnMucXVhbGl0eSA+IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAncXVhbGl0eScgKCR7b3B0aW9ucy5xdWFsaXR5fSkgdG8gYmUgYmV0d2VlbiAwIGFuZCAxMDAsIGluY2x1c2l2ZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFbJ2pwZWcnLCAnd2VicCddLmluY2x1ZGVzKG9wdGlvbnMudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvcHRpb25zLnR5cGUgPz8gJ3BuZyd9IHNjcmVlbnNob3RzIGRvIG5vdCBzdXBwb3J0ICdxdWFsaXR5Jy5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jbGlwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsaXAud2lkdGggPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ3dpZHRoJyBpbiAnY2xpcCcgbXVzdCBiZSBwb3NpdGl2ZS5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xpcC5oZWlnaHQgPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ2hlaWdodCcgaW4gJ2NsaXAnIG11c3QgYmUgcG9zaXRpdmUuXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldERlZmF1bHRTY3JlZW5zaG90T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8yLCBuZXcgQXN5bmNEaXNwb3NhYmxlU3RhY2soKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xpcCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mdWxsUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ2NsaXAnIGFuZCAnZnVsbFBhZ2UnIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jbGlwID0gcm91bmRSZWN0YW5nbGUobm9ybWFsaXplUmVjdGFuZ2xlKG9wdGlvbnMuY2xpcCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZnVsbFBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGBjYXB0dXJlQmV5b25kVmlld3BvcnRgIGlzIGBmYWxzZWAsIHRoZW4gd2Ugc2V0IHRoZSB2aWV3cG9ydCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSB0aGUgZnVsbCBwYWdlLiBOb3RlIHRoaXMgbWF5IGJlIGFmZmVjdGVkIGJ5IG9uLXBhZ2UgQ1NTIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSmF2YVNjcmlwdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5jYXB0dXJlQmV5b25kVmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxEaW1lbnNpb25zID0gYXdhaXQgdGhpcy5tYWluRnJhbWUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ldmFsdWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZWxlbWVudC5zY3JvbGxXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZWxlbWVudC5zY3JvbGxIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRWaWV3cG9ydCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnZpZXdwb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5zY3JvbGxEaW1lbnNpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLmRlZmVyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRWaWV3cG9ydCh2aWV3cG9ydCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNhcHR1cmVCZXlvbmRWaWV3cG9ydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLl9zY3JlZW5zaG90KG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVuY29kaW5nID09PSAnYmFzZTY0Jykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oZGF0YSwgJ2Jhc2U2NCcpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX21heWJlV3JpdGVCdWZmZXJUb0ZpbGUob3B0aW9ucy5wYXRoLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yKSB7XG4gICAgICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzI7XG4gICAgICAgICAgICAgICAgZW52XzIuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0XzEgPSBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRfMSlcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVzdWx0XzE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwYWdlJ3MgdGl0bGVcbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogU2hvcnRjdXQgZm9yIHtAbGluayBGcmFtZS50aXRsZSB8IHBhZ2UubWFpbkZyYW1lKCkudGl0bGUoKX0uXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0aXRsZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLnRpdGxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYW4gZWxlbWVudCB3aXRoIGBzZWxlY3RvcmAsIHNjcm9sbHMgaXQgaW50byB2aWV3IGlmXG4gICAgICAgICAqIG5lZWRlZCwgYW5kIHRoZW4gdXNlcyB7QGxpbmsgUGFnZS5tb3VzZX0gdG8gY2xpY2sgaW4gdGhlIGNlbnRlciBvZiB0aGVcbiAgICAgICAgICogZWxlbWVudC4gSWYgdGhlcmUncyBubyBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAsIHRoZSBtZXRob2QgdGhyb3dzIGFuXG4gICAgICAgICAqIGVycm9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBCZWFyIGluIG1pbmQgdGhhdCBpZiBgY2xpY2soKWAgdHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIGV2ZW50IGFuZFxuICAgICAgICAgKiB0aGVyZSdzIGEgc2VwYXJhdGUgYHBhZ2Uud2FpdEZvck5hdmlnYXRpb24oKWAgcHJvbWlzZSB0byBiZSByZXNvbHZlZCwgeW91XG4gICAgICAgICAqIG1heSBlbmQgdXAgd2l0aCBhIHJhY2UgY29uZGl0aW9uIHRoYXQgeWllbGRzIHVuZXhwZWN0ZWQgcmVzdWx0cy4gVGhlXG4gICAgICAgICAqIGNvcnJlY3QgcGF0dGVybiBmb3IgY2xpY2sgYW5kIHdhaXQgZm9yIG5hdmlnYXRpb24gaXMgdGhlIGZvbGxvd2luZzpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgW3Jlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICogICBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKHdhaXRPcHRpb25zKSxcbiAgICAgICAgICogICBwYWdlLmNsaWNrKHNlbGVjdG9yLCBjbGlja09wdGlvbnMpLFxuICAgICAgICAgKiBdKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuY2xpY2sgfCBwYWdlLm1haW5GcmFtZSgpLmNsaWNrKHNlbGVjdG9yWywgb3B0aW9uc10pIH0uXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIEEgYHNlbGVjdG9yYCB0byBzZWFyY2ggZm9yIGVsZW1lbnQgdG8gY2xpY2suIElmIHRoZXJlIGFyZVxuICAgICAgICAgKiBtdWx0aXBsZSBlbGVtZW50cyBzYXRpc2Z5aW5nIHRoZSBgc2VsZWN0b3JgLCB0aGUgZmlyc3Qgd2lsbCBiZSBjbGlja2VkXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYE9iamVjdGBcbiAgICAgICAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAgaXNcbiAgICAgICAgICogc3VjY2Vzc2Z1bGx5IGNsaWNrZWQuIFRoZSBQcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgaWYgdGhlcmUgaXMgbm8gZWxlbWVudFxuICAgICAgICAgKiBtYXRjaGluZyBgc2VsZWN0b3JgLlxuICAgICAgICAgKi9cbiAgICAgICAgY2xpY2soc2VsZWN0b3IsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLmNsaWNrKHNlbGVjdG9yLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgZmV0Y2hlcyBhbiBlbGVtZW50IHdpdGggYHNlbGVjdG9yYCBhbmQgZm9jdXNlcyBpdC4gSWYgdGhlcmUncyBub1xuICAgICAgICAgKiBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAsIHRoZSBtZXRob2QgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBBXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IHNlbGVjdG9yIH1cbiAgICAgICAgICogb2YgYW4gZWxlbWVudCB0byBmb2N1cy4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIHNhdGlzZnlpbmcgdGhlXG4gICAgICAgICAqIHNlbGVjdG9yLCB0aGUgZmlyc3Qgd2lsbCBiZSBmb2N1c2VkLlxuICAgICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgbWF0Y2hpbmcgc2VsZWN0b3IgaXNcbiAgICAgICAgICogc3VjY2Vzc2Z1bGx5IGZvY3VzZWQuIFRoZSBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgaWYgdGhlcmUgaXMgbm8gZWxlbWVudFxuICAgICAgICAgKiBtYXRjaGluZyBzZWxlY3Rvci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogU2hvcnRjdXQgZm9yIHtAbGluayBGcmFtZS5mb2N1cyB8IHBhZ2UubWFpbkZyYW1lKCkuZm9jdXMoc2VsZWN0b3IpfS5cbiAgICAgICAgICovXG4gICAgICAgIGZvY3VzKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluRnJhbWUoKS5mb2N1cyhzZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYW4gZWxlbWVudCB3aXRoIGBzZWxlY3RvcmAsIHNjcm9sbHMgaXQgaW50byB2aWV3IGlmXG4gICAgICAgICAqIG5lZWRlZCwgYW5kIHRoZW4gdXNlcyB7QGxpbmsgUGFnZS5tb3VzZX1cbiAgICAgICAgICogdG8gaG92ZXIgb3ZlciB0aGUgY2VudGVyIG9mIHRoZSBlbGVtZW50LlxuICAgICAgICAgKiBJZiB0aGVyZSdzIG5vIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCwgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIEFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHNlYXJjaCBmb3IgZWxlbWVudCB0byBob3Zlci4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIHNhdGlzZnlpbmdcbiAgICAgICAgICogdGhlIHNlbGVjdG9yLCB0aGUgZmlyc3Qgd2lsbCBiZSBob3ZlcmVkLlxuICAgICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCBpc1xuICAgICAgICAgKiBzdWNjZXNzZnVsbHkgaG92ZXJlZC4gUHJvbWlzZSBnZXRzIHJlamVjdGVkIGlmIHRoZXJlJ3Mgbm8gZWxlbWVudCBtYXRjaGluZ1xuICAgICAgICAgKiBgc2VsZWN0b3JgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBTaG9ydGN1dCBmb3Ige0BsaW5rIFBhZ2UuaG92ZXIgfCBwYWdlLm1haW5GcmFtZSgpLmhvdmVyKHNlbGVjdG9yKX0uXG4gICAgICAgICAqL1xuICAgICAgICBob3ZlcihzZWxlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbkZyYW1lKCkuaG92ZXIoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmlnZ2VycyBhIGBjaGFuZ2VgIGFuZCBgaW5wdXRgIGV2ZW50IG9uY2UgYWxsIHRoZSBwcm92aWRlZCBvcHRpb25zIGhhdmUgYmVlblxuICAgICAgICAgKiBzZWxlY3RlZC4gSWYgdGhlcmUncyBubyBgPHNlbGVjdD5gIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCwgdGhlIG1ldGhvZFxuICAgICAgICAgKiB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIHBhZ2Uuc2VsZWN0KCdzZWxlY3QjY29sb3JzJywgJ2JsdWUnKTsgLy8gc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgKiBwYWdlLnNlbGVjdCgnc2VsZWN0I2NvbG9ycycsICdyZWQnLCAnZ3JlZW4nLCAnYmx1ZScpOyAvLyBtdWx0aXBsZSBzZWxlY3Rpb25zXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBBXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IFNlbGVjdG9yfVxuICAgICAgICAgKiB0byBxdWVyeSB0aGUgcGFnZSBmb3JcbiAgICAgICAgICogQHBhcmFtIHZhbHVlcyAtIFZhbHVlcyBvZiBvcHRpb25zIHRvIHNlbGVjdC4gSWYgdGhlIGA8c2VsZWN0PmAgaGFzIHRoZVxuICAgICAgICAgKiBgbXVsdGlwbGVgIGF0dHJpYnV0ZSwgYWxsIHZhbHVlcyBhcmUgY29uc2lkZXJlZCwgb3RoZXJ3aXNlIG9ubHkgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgKiBpcyB0YWtlbiBpbnRvIGFjY291bnQuXG4gICAgICAgICAqIEByZXR1cm5zXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuc2VsZWN0IHwgcGFnZS5tYWluRnJhbWUoKS5zZWxlY3QoKX1cbiAgICAgICAgICovXG4gICAgICAgIHNlbGVjdChzZWxlY3RvciwgLi4udmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluRnJhbWUoKS5zZWxlY3Qoc2VsZWN0b3IsIC4uLnZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYW4gZWxlbWVudCB3aXRoIGBzZWxlY3RvcmAsIHNjcm9sbHMgaXQgaW50byB2aWV3IGlmXG4gICAgICAgICAqIG5lZWRlZCwgYW5kIHRoZW4gdXNlcyB7QGxpbmsgUGFnZS50b3VjaHNjcmVlbn1cbiAgICAgICAgICogdG8gdGFwIGluIHRoZSBjZW50ZXIgb2YgdGhlIGVsZW1lbnQuXG4gICAgICAgICAqIElmIHRoZXJlJ3Mgbm8gZWxlbWVudCBtYXRjaGluZyBgc2VsZWN0b3JgLCB0aGUgbWV0aG9kIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gQVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBTZWxlY3Rvcn1cbiAgICAgICAgICogdG8gc2VhcmNoIGZvciBlbGVtZW50IHRvIHRhcC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIHNhdGlzZnlpbmcgdGhlXG4gICAgICAgICAqIHNlbGVjdG9yLCB0aGUgZmlyc3Qgd2lsbCBiZSB0YXBwZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUudGFwIHwgcGFnZS5tYWluRnJhbWUoKS50YXAoc2VsZWN0b3IpfS5cbiAgICAgICAgICovXG4gICAgICAgIHRhcChzZWxlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbkZyYW1lKCkudGFwKHNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZHMgYSBga2V5ZG93bmAsIGBrZXlwcmVzcy9pbnB1dGAsIGFuZCBga2V5dXBgIGV2ZW50IGZvciBlYWNoIGNoYXJhY3RlclxuICAgICAgICAgKiBpbiB0aGUgdGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogVG8gcHJlc3MgYSBzcGVjaWFsIGtleSwgbGlrZSBgQ29udHJvbGAgb3IgYEFycm93RG93bmAsIHVzZSB7QGxpbmsgS2V5Ym9hcmQucHJlc3N9LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBhd2FpdCBwYWdlLnR5cGUoJyNteXRleHRhcmVhJywgJ0hlbGxvJyk7XG4gICAgICAgICAqIC8vIFR5cGVzIGluc3RhbnRseVxuICAgICAgICAgKiBhd2FpdCBwYWdlLnR5cGUoJyNteXRleHRhcmVhJywgJ1dvcmxkJywge2RlbGF5OiAxMDB9KTtcbiAgICAgICAgICogLy8gVHlwZXMgc2xvd2VyLCBsaWtlIGEgdXNlclxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gQVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogb2YgYW4gZWxlbWVudCB0byB0eXBlIGludG8uIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cyBzYXRpc2Z5aW5nIHRoZVxuICAgICAgICAgKiBzZWxlY3RvciwgdGhlIGZpcnN0IHdpbGwgYmUgdXNlZC5cbiAgICAgICAgICogQHBhcmFtIHRleHQgLSBBIHRleHQgdG8gdHlwZSBpbnRvIGEgZm9jdXNlZCBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGhhdmUgcHJvcGVydHkgYGRlbGF5YCB3aGljaCBpcyB0aGUgVGltZSB0byB3YWl0IGJldHdlZW5cbiAgICAgICAgICoga2V5IHByZXNzZXMgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byBgMGAuXG4gICAgICAgICAqIEByZXR1cm5zXG4gICAgICAgICAqL1xuICAgICAgICB0eXBlKHNlbGVjdG9yLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluRnJhbWUoKS50eXBlKHNlbGVjdG9yLCB0ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdCBmb3IgdGhlIGBzZWxlY3RvcmAgdG8gYXBwZWFyIGluIHBhZ2UuIElmIGF0IHRoZSBtb21lbnQgb2YgY2FsbGluZyB0aGVcbiAgICAgICAgICogbWV0aG9kIHRoZSBgc2VsZWN0b3JgIGFscmVhZHkgZXhpc3RzLCB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LiBJZlxuICAgICAgICAgKiB0aGUgYHNlbGVjdG9yYCBkb2Vzbid0IGFwcGVhciBhZnRlciB0aGUgYHRpbWVvdXRgIG1pbGxpc2Vjb25kcyBvZiB3YWl0aW5nLCB0aGVcbiAgICAgICAgICogZnVuY3Rpb24gd2lsbCB0aHJvdy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogVGhpcyBtZXRob2Qgd29ya3MgYWNyb3NzIG5hdmlnYXRpb25zOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gICAgICAgICAqIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgICAgICAqICAgbGV0IGN1cnJlbnRVUkw7XG4gICAgICAgICAqICAgcGFnZVxuICAgICAgICAgKiAgICAgLndhaXRGb3JTZWxlY3RvcignaW1nJylcbiAgICAgICAgICogICAgIC50aGVuKCgpID0+IGNvbnNvbGUubG9nKCdGaXJzdCBVUkwgd2l0aCBpbWFnZTogJyArIGN1cnJlbnRVUkwpKTtcbiAgICAgICAgICogICBmb3IgKGN1cnJlbnRVUkwgb2YgW1xuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZ29vZ2xlLmNvbScsXG4gICAgICAgICAqICAgICAnaHR0cHM6Ly9iYmMuY29tJyxcbiAgICAgICAgICogICBdKSB7XG4gICAgICAgICAqICAgICBhd2FpdCBwYWdlLmdvdG8oY3VycmVudFVSTCk7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIEFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIG9mIGFuIGVsZW1lbnQgdG8gd2FpdCBmb3JcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCB3YWl0aW5nIHBhcmFtZXRlcnNcbiAgICAgICAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgKiBpcyBhZGRlZCB0byBET00uIFJlc29sdmVzIHRvIGBudWxsYCBpZiB3YWl0aW5nIGZvciBoaWRkZW46IGB0cnVlYCBhbmRcbiAgICAgICAgICogc2VsZWN0b3IgaXMgbm90IGZvdW5kIGluIERPTS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogVGhlIG9wdGlvbmFsIFBhcmFtZXRlciBpbiBBcmd1bWVudHMgYG9wdGlvbnNgIGFyZTpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgdmlzaWJsZWA6IEEgYm9vbGVhbiB3YWl0IGZvciBlbGVtZW50IHRvIGJlIHByZXNlbnQgaW4gRE9NIGFuZCB0byBiZVxuICAgICAgICAgKiAgIHZpc2libGUsIGkuZS4gdG8gbm90IGhhdmUgYGRpc3BsYXk6IG5vbmVgIG9yIGB2aXNpYmlsaXR5OiBoaWRkZW5gIENTU1xuICAgICAgICAgKiAgIHByb3BlcnRpZXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIC0gYGhpZGRlbmA6IFdhaXQgZm9yIGVsZW1lbnQgdG8gbm90IGJlIGZvdW5kIGluIHRoZSBET00gb3IgdG8gYmUgaGlkZGVuLFxuICAgICAgICAgKiAgIGkuZS4gaGF2ZSBgZGlzcGxheTogbm9uZWAgb3IgYHZpc2liaWxpdHk6IGhpZGRlbmAgQ1NTIHByb3BlcnRpZXMuIERlZmF1bHRzIHRvXG4gICAgICAgICAqICAgYGZhbHNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogLSBgdGltZW91dGA6IG1heGltdW0gdGltZSB0byB3YWl0IGZvciBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIGAzMDAwMGBcbiAgICAgICAgICogICAoMzAgc2Vjb25kcykuIFBhc3MgYDBgIHRvIGRpc2FibGUgdGltZW91dC4gVGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWRcbiAgICAgICAgICogICBieSB1c2luZyB0aGUge0BsaW5rIFBhZ2Uuc2V0RGVmYXVsdFRpbWVvdXR9IG1ldGhvZC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhaXRGb3JTZWxlY3RvcihzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluRnJhbWUoKS53YWl0Rm9yU2VsZWN0b3Ioc2VsZWN0b3IsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXYWl0cyBmb3IgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLCBgcGFnZUZ1bmN0aW9uYCwgdG8gcmV0dXJuIGEgdHJ1dGh5IHZhbHVlIHdoZW5cbiAgICAgICAgICogZXZhbHVhdGVkIGluIHRoZSBwYWdlJ3MgY29udGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICoge0BsaW5rIFBhZ2Uud2FpdEZvckZ1bmN0aW9ufSBjYW4gYmUgdXNlZCB0byBvYnNlcnZlIGEgdmlld3BvcnQgc2l6ZSBjaGFuZ2U6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAgICAgICAgICogKGFzeW5jICgpID0+IHtcbiAgICAgICAgICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICAgICAgICAgKiAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBicm93c2VyLm5ld1BhZ2UoKTtcbiAgICAgICAgICogICBjb25zdCB3YXRjaERvZyA9IHBhZ2Uud2FpdEZvckZ1bmN0aW9uKCd3aW5kb3cuaW5uZXJXaWR0aCA8IDEwMCcpO1xuICAgICAgICAgKiAgIGF3YWl0IHBhZ2Uuc2V0Vmlld3BvcnQoe3dpZHRoOiA1MCwgaGVpZ2h0OiA1MH0pO1xuICAgICAgICAgKiAgIGF3YWl0IHdhdGNoRG9nO1xuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIEFyZ3VtZW50cyBjYW4gYmUgcGFzc2VkIGZyb20gTm9kZS5qcyB0byBgcGFnZUZ1bmN0aW9uYDpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VsZWN0b3IgPSAnLmZvbyc7XG4gICAgICAgICAqIGF3YWl0IHBhZ2Uud2FpdEZvckZ1bmN0aW9uKFxuICAgICAgICAgKiAgIHNlbGVjdG9yID0+ICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvciksXG4gICAgICAgICAqICAge30sXG4gICAgICAgICAqICAgc2VsZWN0b3JcbiAgICAgICAgICogKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIFRoZSBwcm92aWRlZCBgcGFnZUZ1bmN0aW9uYCBjYW4gYmUgYXN5bmNocm9ub3VzOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCB1c2VybmFtZSA9ICdnaXRodWItdXNlcm5hbWUnO1xuICAgICAgICAgKiBhd2FpdCBwYWdlLndhaXRGb3JGdW5jdGlvbihcbiAgICAgICAgICogICBhc3luYyB1c2VybmFtZSA9PiB7XG4gICAgICAgICAqICAgICBjb25zdCBnaXRodWJSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgKiAgICAgICBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy8ke3VzZXJuYW1lfWBcbiAgICAgICAgICogICAgICk7XG4gICAgICAgICAqICAgICBjb25zdCBnaXRodWJVc2VyID0gYXdhaXQgZ2l0aHViUmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgKiAgICAgLy8gc2hvdyB0aGUgYXZhdGFyXG4gICAgICAgICAqICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgICAgICogICAgIGltZy5zcmMgPSBnaXRodWJVc2VyLmF2YXRhcl91cmw7XG4gICAgICAgICAqICAgICAvLyB3YWl0IDMgc2Vjb25kc1xuICAgICAgICAgKiAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAzMDAwKSk7XG4gICAgICAgICAqICAgICBpbWcucmVtb3ZlKCk7XG4gICAgICAgICAqICAgfSxcbiAgICAgICAgICogICB7fSxcbiAgICAgICAgICogICB1c2VybmFtZVxuICAgICAgICAgKiApO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHBhZ2VGdW5jdGlvbiAtIEZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZCBpbiBicm93c2VyIGNvbnRleHQgdW50aWwgaXQgcmV0dXJucyBhXG4gICAgICAgICAqIHRydXRoeSB2YWx1ZS5cbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciBjb25maWd1cmluZyB3YWl0aW5nIGJlaGF2aW9yLlxuICAgICAgICAgKi9cbiAgICAgICAgd2FpdEZvckZ1bmN0aW9uKHBhZ2VGdW5jdGlvbiwgb3B0aW9ucywgLi4uYXJncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbkZyYW1lKCkud2FpdEZvckZ1bmN0aW9uKHBhZ2VGdW5jdGlvbiwgb3B0aW9ucywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBbKF9zY3JlZW5zaG90X2RlY29yYXRvcnMgPSBbZ3VhcmRlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnJvd3NlcigpO1xuICAgICAgICAgICAgfSldLCBkaXNwb3NlU3ltYm9sKV0oKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmNsb3NlKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBbYXN5bmNEaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IFBhZ2UgfTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBzdXBwb3J0ZWRNZXRyaWNzID0gbmV3IFNldChbXG4gICAgJ1RpbWVzdGFtcCcsXG4gICAgJ0RvY3VtZW50cycsXG4gICAgJ0ZyYW1lcycsXG4gICAgJ0pTRXZlbnRMaXN0ZW5lcnMnLFxuICAgICdOb2RlcycsXG4gICAgJ0xheW91dENvdW50JyxcbiAgICAnUmVjYWxjU3R5bGVDb3VudCcsXG4gICAgJ0xheW91dER1cmF0aW9uJyxcbiAgICAnUmVjYWxjU3R5bGVEdXJhdGlvbicsXG4gICAgJ1NjcmlwdER1cmF0aW9uJyxcbiAgICAnVGFza0R1cmF0aW9uJyxcbiAgICAnSlNIZWFwVXNlZFNpemUnLFxuICAgICdKU0hlYXBUb3RhbFNpemUnLFxuXSk7XG4vKiogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vd2ViZHJpdmVyLWJpZGkvI25vcm1hbGl6ZS1yZWN0ICovXG5mdW5jdGlvbiBub3JtYWxpemVSZWN0YW5nbGUoY2xpcCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNsaXAsXG4gICAgICAgIC4uLihjbGlwLndpZHRoIDwgMFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgeDogY2xpcC54ICsgY2xpcC53aWR0aCxcbiAgICAgICAgICAgICAgICB3aWR0aDogLWNsaXAud2lkdGgsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICB4OiBjbGlwLngsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGNsaXAud2lkdGgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgLi4uKGNsaXAuaGVpZ2h0IDwgMFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgeTogY2xpcC55ICsgY2xpcC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAtY2xpcC5oZWlnaHQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICB5OiBjbGlwLnksXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBjbGlwLmhlaWdodCxcbiAgICAgICAgICAgIH0pLFxuICAgIH07XG59XG5mdW5jdGlvbiByb3VuZFJlY3RhbmdsZShjbGlwKSB7XG4gICAgY29uc3QgeCA9IE1hdGgucm91bmQoY2xpcC54KTtcbiAgICBjb25zdCB5ID0gTWF0aC5yb3VuZChjbGlwLnkpO1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5yb3VuZChjbGlwLndpZHRoICsgY2xpcC54IC0geCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5yb3VuZChjbGlwLmhlaWdodCArIGNsaXAueSAtIHkpO1xuICAgIHJldHVybiB7IC4uLmNsaXAsIHgsIHksIHdpZHRoLCBoZWlnaHQgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhZ2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IFRhc2tNYW5hZ2VyLCBXYWl0VGFzayB9IGZyb20gJy4uL2NvbW1vbi9XYWl0VGFzay5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlU3ltYm9sIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWFsbSB7XG4gICAgdGltZW91dFNldHRpbmdzO1xuICAgIHRhc2tNYW5hZ2VyID0gbmV3IFRhc2tNYW5hZ2VyKCk7XG4gICAgY29uc3RydWN0b3IodGltZW91dFNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMudGltZW91dFNldHRpbmdzID0gdGltZW91dFNldHRpbmdzO1xuICAgIH1cbiAgICBhc3luYyB3YWl0Rm9yRnVuY3Rpb24ocGFnZUZ1bmN0aW9uLCBvcHRpb25zID0ge30sIC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgeyBwb2xsaW5nID0gJ3JhZicsIHRpbWVvdXQgPSB0aGlzLnRpbWVvdXRTZXR0aW5ncy50aW1lb3V0KCksIHJvb3QsIHNpZ25hbCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmICh0eXBlb2YgcG9sbGluZyA9PT0gJ251bWJlcicgJiYgcG9sbGluZyA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBvbGwgd2l0aCBub24tcG9zaXRpdmUgaW50ZXJ2YWwnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3YWl0VGFzayA9IG5ldyBXYWl0VGFzayh0aGlzLCB7XG4gICAgICAgICAgICBwb2xsaW5nLFxuICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0sIHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0VGFzay5yZXN1bHQ7XG4gICAgfVxuICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VkO1xuICAgIH1cbiAgICAjZGlzcG9zZWQgPSBmYWxzZTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy4jZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnRhc2tNYW5hZ2VyLnRlcm1pbmF0ZUFsbChuZXcgRXJyb3IoJ3dhaXRGb3JGdW5jdGlvbiBmYWlsZWQ6IGZyYW1lIGdvdCBkZXRhY2hlZC4nKSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWxtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBUYXJnZXRUeXBlO1xuKGZ1bmN0aW9uIChUYXJnZXRUeXBlKSB7XG4gICAgVGFyZ2V0VHlwZVtcIlBBR0VcIl0gPSBcInBhZ2VcIjtcbiAgICBUYXJnZXRUeXBlW1wiQkFDS0dST1VORF9QQUdFXCJdID0gXCJiYWNrZ3JvdW5kX3BhZ2VcIjtcbiAgICBUYXJnZXRUeXBlW1wiU0VSVklDRV9XT1JLRVJcIl0gPSBcInNlcnZpY2Vfd29ya2VyXCI7XG4gICAgVGFyZ2V0VHlwZVtcIlNIQVJFRF9XT1JLRVJcIl0gPSBcInNoYXJlZF93b3JrZXJcIjtcbiAgICBUYXJnZXRUeXBlW1wiQlJPV1NFUlwiXSA9IFwiYnJvd3NlclwiO1xuICAgIFRhcmdldFR5cGVbXCJXRUJWSUVXXCJdID0gXCJ3ZWJ2aWV3XCI7XG4gICAgVGFyZ2V0VHlwZVtcIk9USEVSXCJdID0gXCJvdGhlclwiO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIFRhcmdldFR5cGVbXCJUQUJcIl0gPSBcInRhYlwiO1xufSkoVGFyZ2V0VHlwZSB8fCAoVGFyZ2V0VHlwZSA9IHt9KSk7XG4vKipcbiAqIFRhcmdldCByZXByZXNlbnRzIGFcbiAqIHtAbGluayBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvVGFyZ2V0LyB8IENEUCB0YXJnZXR9LlxuICogSW4gQ0RQIGEgdGFyZ2V0IGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBkZWJ1Z2dlZCBzdWNoIGEgZnJhbWUsIGEgcGFnZSBvciBhXG4gKiB3b3JrZXIuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXQge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHRhcmdldCBpcyBub3Qgb2YgdHlwZSBgXCJzZXJ2aWNlX3dvcmtlclwiYCBvciBgXCJzaGFyZWRfd29ya2VyXCJgLCByZXR1cm5zIGBudWxsYC5cbiAgICAgKi9cbiAgICBhc3luYyB3b3JrZXIoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgdGFyZ2V0IGlzIG5vdCBvZiB0eXBlIGBcInBhZ2VcImAsIGBcIndlYnZpZXdcImAgb3IgYFwiYmFja2dyb3VuZF9wYWdlXCJgLFxuICAgICAqIHJldHVybnMgYG51bGxgLlxuICAgICAqL1xuICAgIGFzeW5jIHBhZ2UoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhcmdldC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRPcGVyYXRpb24gfSBmcm9tICcuLi9jb21tb24vRXJyb3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgVGltZW91dFNldHRpbmdzIH0gZnJvbSAnLi4vY29tbW9uL1RpbWVvdXRTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYVxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfV29ya2Vyc19BUEkgfCBXZWJXb3JrZXJ9LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgZXZlbnRzIGB3b3JrZXJjcmVhdGVkYCBhbmQgYHdvcmtlcmRlc3Ryb3llZGAgYXJlIGVtaXR0ZWQgb24gdGhlIHBhZ2VcbiAqIG9iamVjdCB0byBzaWduYWwgdGhlIHdvcmtlciBsaWZlY3ljbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogcGFnZS5vbignd29ya2VyY3JlYXRlZCcsIHdvcmtlciA9PlxuICogICBjb25zb2xlLmxvZygnV29ya2VyIGNyZWF0ZWQ6ICcgKyB3b3JrZXIudXJsKCkpXG4gKiApO1xuICogcGFnZS5vbignd29ya2VyZGVzdHJveWVkJywgd29ya2VyID0+XG4gKiAgIGNvbnNvbGUubG9nKCdXb3JrZXIgZGVzdHJveWVkOiAnICsgd29ya2VyLnVybCgpKVxuICogKTtcbiAqXG4gKiBjb25zb2xlLmxvZygnQ3VycmVudCB3b3JrZXJzOicpO1xuICogZm9yIChjb25zdCB3b3JrZXIgb2YgcGFnZS53b3JrZXJzKCkpIHtcbiAqICAgY29uc29sZS5sb2coJyAgJyArIHdvcmtlci51cmwoKSk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJXb3JrZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRpbWVvdXRTZXR0aW5ncyA9IG5ldyBUaW1lb3V0U2V0dGluZ3MoKTtcbiAgICAjdXJsO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVybCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiN1cmwgPSB1cmw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgdGhpcyB3ZWIgd29ya2VyLlxuICAgICAqL1xuICAgIHVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3VybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZhbHVhdGVzIGEgZ2l2ZW4gZnVuY3Rpb24gaW4gdGhlIHtAbGluayBXZWJXb3JrZXIgfCB3b3JrZXJ9LlxuICAgICAqXG4gICAgICogQHJlbWFya3MgSWYgdGhlIGdpdmVuIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlLFxuICAgICAqIHtAbGluayBXZWJXb3JrZXIuZXZhbHVhdGUgfCBldmFsdWF0ZX0gd2lsbCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0byByZXNvbHZlLlxuICAgICAqXG4gICAgICogQXMgYSBydWxlIG9mIHRodW1iLCBpZiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBtb3JlXG4gICAgICogY29tcGxpY2F0ZWQgdGhhbiBhIEpTT04gb2JqZWN0IChlLmcuIG1vc3QgY2xhc3NlcyksIHRoZW5cbiAgICAgKiB7QGxpbmsgV2ViV29ya2VyLmV2YWx1YXRlIHwgZXZhbHVhdGV9IHdpbGwgX2xpa2VseV8gcmV0dXJuIHNvbWUgdHJ1bmNhdGVkXG4gICAgICogdmFsdWUgKG9yIGB7fWApLiBUaGlzIGlzIGJlY2F1c2Ugd2UgYXJlIG5vdCByZXR1cm5pbmcgdGhlIGFjdHVhbCByZXR1cm5cbiAgICAgKiB2YWx1ZSwgYnV0IGEgZGVzZXJpYWxpemVkIHZlcnNpb24gYXMgYSByZXN1bHQgb2YgdHJhbnNmZXJyaW5nIHRoZSByZXR1cm5cbiAgICAgKiB2YWx1ZSB0aHJvdWdoIGEgcHJvdG9jb2wgdG8gUHVwcGV0ZWVyLlxuICAgICAqXG4gICAgICogSW4gZ2VuZXJhbCwgeW91IHNob3VsZCB1c2VcbiAgICAgKiB7QGxpbmsgV2ViV29ya2VyLmV2YWx1YXRlSGFuZGxlIHwgZXZhbHVhdGVIYW5kbGV9IGlmXG4gICAgICoge0BsaW5rIFdlYldvcmtlci5ldmFsdWF0ZSB8IGV2YWx1YXRlfSBjYW5ub3Qgc2VyaWFsaXplIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgKiBwcm9wZXJseSBvciB5b3UgbmVlZCBhIG11dGFibGUge0BsaW5rIEpTSGFuZGxlIHwgaGFuZGxlfSB0byB0aGUgcmV0dXJuXG4gICAgICogb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZ1bmMgLSBGdW5jdGlvbiB0byBiZSBldmFsdWF0ZWQuXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBcmd1bWVudHMgdG8gcGFzcyBpbnRvIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAgICAgKi9cbiAgICBhc3luYyBldmFsdWF0ZShmdW5jLCAuLi5hcmdzKSB7XG4gICAgICAgIGZ1bmMgPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGUubmFtZSwgZnVuYyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5SZWFsbSgpLmV2YWx1YXRlKGZ1bmMsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmFsdWF0ZXMgYSBnaXZlbiBmdW5jdGlvbiBpbiB0aGUge0BsaW5rIFdlYldvcmtlciB8IHdvcmtlcn0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBJZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UsXG4gICAgICoge0BsaW5rIFdlYldvcmtlci5ldmFsdWF0ZSB8IGV2YWx1YXRlfSB3aWxsIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvIHJlc29sdmUuXG4gICAgICpcbiAgICAgKiBJbiBnZW5lcmFsLCB5b3Ugc2hvdWxkIHVzZVxuICAgICAqIHtAbGluayBXZWJXb3JrZXIuZXZhbHVhdGVIYW5kbGUgfCBldmFsdWF0ZUhhbmRsZX0gaWZcbiAgICAgKiB7QGxpbmsgV2ViV29ya2VyLmV2YWx1YXRlIHwgZXZhbHVhdGV9IGNhbm5vdCBzZXJpYWxpemUgdGhlIHJldHVybiB2YWx1ZVxuICAgICAqIHByb3Blcmx5IG9yIHlvdSBuZWVkIGEgbXV0YWJsZSB7QGxpbmsgSlNIYW5kbGUgfCBoYW5kbGV9IHRvIHRoZSByZXR1cm5cbiAgICAgKiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZnVuYyAtIEZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyB0byBwYXNzIGludG8gYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIEEge0BsaW5rIEpTSGFuZGxlIHwgaGFuZGxlfSB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIGBmdW5jYC5cbiAgICAgKi9cbiAgICBhc3luYyBldmFsdWF0ZUhhbmRsZShmdW5jLCAuLi5hcmdzKSB7XG4gICAgICAgIGZ1bmMgPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgZnVuYyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5SZWFsbSgpLmV2YWx1YXRlSGFuZGxlKGZ1bmMsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uKCdXZWJXb3JrZXIuY2xvc2UoKSBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViV29ya2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL0Jyb3dzZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Ccm93c2VyQ29udGV4dC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0NEUFNlc3Npb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9EaWFsb2cuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9FbGVtZW50SGFuZGxlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRW52aXJvbm1lbnQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9GcmFtZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0hUVFBSZXF1ZXN0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSFRUUFJlc3BvbnNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSW5wdXQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1BhZ2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9SZWFsbS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1RhcmdldC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1dlYldvcmtlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2xvY2F0b3JzL2xvY2F0b3JzLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFwaS5qcy5tYXAiLCJ2YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xuaW1wb3J0IHsgRU1QVFksIGNhdGNoRXJyb3IsIGRlZmF1bHRJZkVtcHR5LCBkZWZlciwgZmlsdGVyLCBmaXJzdCwgZmlyc3RWYWx1ZUZyb20sIGZyb20sIGlkZW50aXR5LCBpZ25vcmVFbGVtZW50cywgbWFwLCBtZXJnZSwgbWVyZ2VNYXAsIG5vb3AsIHBpcGUsIHJhY2UsIHJhY2VXaXRoLCByZXRyeSwgdGFwLCB0aHJvd0lmRW1wdHksIH0gZnJvbSAnLi4vLi4vLi4vdGhpcmRfcGFydHkvcnhqcy9yeGpzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgZnJvbUFib3J0U2lnbmFsLCB0aW1lb3V0IH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWwuanMnO1xuLyoqXG4gKiBBbGwgdGhlIGV2ZW50cyB0aGF0IGEgbG9jYXRvciBpbnN0YW5jZSBtYXkgZW1pdC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRvckV2ZW50O1xuKGZ1bmN0aW9uIChMb2NhdG9yRXZlbnQpIHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGV2ZXJ5IHRpbWUgYmVmb3JlIHRoZSBsb2NhdG9yIHBlcmZvcm1zIGFuIGFjdGlvbiBvbiB0aGUgbG9jYXRlZCBlbGVtZW50KHMpLlxuICAgICAqL1xuICAgIExvY2F0b3JFdmVudFtcIkFjdGlvblwiXSA9IFwiYWN0aW9uXCI7XG59KShMb2NhdG9yRXZlbnQgfHwgKExvY2F0b3JFdmVudCA9IHt9KSk7XG4vKipcbiAqIExvY2F0b3JzIGRlc2NyaWJlIGEgc3RyYXRlZ3kgb2YgbG9jYXRpbmcgb2JqZWN0cyBhbmQgcGVyZm9ybWluZyBhbiBhY3Rpb24gb25cbiAqIHRoZW0uIElmIHRoZSBhY3Rpb24gZmFpbHMgYmVjYXVzZSB0aGUgb2JqZWN0IGlzIG5vdCByZWFkeSBmb3IgdGhlIGFjdGlvbiwgdGhlXG4gKiB3aG9sZSBvcGVyYXRpb24gaXMgcmV0cmllZC4gVmFyaW91cyBwcmVjb25kaXRpb25zIGZvciBhIHN1Y2Nlc3NmdWwgYWN0aW9uIGFyZVxuICogY2hlY2tlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjbG9jYXRvcnN9IGZvciBkZXRhaWxzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIExvY2F0b3IgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByYWNlIGJldHdlZW4gbXVsdGlwbGUgbG9jYXRvcnMgdHJ5aW5nIHRvIGxvY2F0ZSBlbGVtZW50cyBpblxuICAgICAqIHBhcmFsbGVsIGJ1dCBlbnN1cmVzIHRoYXQgb25seSBhIHNpbmdsZSBlbGVtZW50IHJlY2VpdmVzIHRoZSBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgc3RhdGljIHJhY2UobG9jYXRvcnMpIHtcbiAgICAgICAgcmV0dXJuIFJhY2VMb2NhdG9yLmNyZWF0ZShsb2NhdG9ycyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHZpc2liaWxpdHkgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF90aW1lb3V0ID0gMzAwMDA7XG4gICAgI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQgPSB0cnVlO1xuICAgICN3YWl0Rm9yRW5hYmxlZCA9IHRydWU7XG4gICAgI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveCA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgb3BlcmF0b3JzID0ge1xuICAgICAgICBjb25kaXRpb25zOiAoY29uZGl0aW9ucywgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VNYXAoKGhhbmRsZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZSguLi5jb25kaXRpb25zLm1hcChjb25kaXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uKGhhbmRsZSwgc2lnbmFsKTtcbiAgICAgICAgICAgICAgICB9KSkucGlwZShkZWZhdWx0SWZFbXB0eShoYW5kbGUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZXRyeUFuZFJhY2VXaXRoU2lnbmFsQW5kVGltZXI6IChzaWduYWwsIGNhdXNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gW107XG4gICAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKGZyb21BYm9ydFNpZ25hbChzaWduYWwsIGNhdXNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2godGltZW91dCh0aGlzLl90aW1lb3V0LCBjYXVzZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHBpcGUocmV0cnkoeyBkZWxheTogUkVUUllfREVMQVkgfSksIHJhY2VXaXRoKC4uLmNhbmRpZGF0ZXMpKTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIC8vIERldGVybWluZXMgd2hlbiB0aGUgbG9jYXRvciB3aWxsIHRpbWVvdXQgZm9yIGFjdGlvbnMuXG4gICAgZ2V0IHRpbWVvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lb3V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGxvY2F0b3IgaW5zdGFuY2UgYnkgY2xvbmluZyB0aGUgY3VycmVudCBsb2NhdG9yIGFuZCBzZXR0aW5nXG4gICAgICogdGhlIHRvdGFsIHRpbWVvdXQgZm9yIHRoZSBsb2NhdG9yIGFjdGlvbnMuXG4gICAgICpcbiAgICAgKiBQYXNzIGAwYCB0byBkaXNhYmxlIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdFZhbHVlIGBQYWdlLmdldERlZmF1bHRUaW1lb3V0KClgXG4gICAgICovXG4gICAgc2V0VGltZW91dCh0aW1lb3V0KSB7XG4gICAgICAgIGNvbnN0IGxvY2F0b3IgPSB0aGlzLl9jbG9uZSgpO1xuICAgICAgICBsb2NhdG9yLl90aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgbG9jYXRvciBpbnN0YW5jZSBieSBjbG9uaW5nIHRoZSBjdXJyZW50IGxvY2F0b3Igd2l0aCB0aGVcbiAgICAgKiB2aXNpYmlsaXR5IHByb3BlcnR5IGNoYW5nZWQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBzZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpIHtcbiAgICAgICAgY29uc3QgbG9jYXRvciA9IHRoaXMuX2Nsb25lKCk7XG4gICAgICAgIGxvY2F0b3IudmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7XG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGxvY2F0b3IgaW5zdGFuY2UgYnkgY2xvbmluZyB0aGUgY3VycmVudCBsb2NhdG9yIGFuZFxuICAgICAqIHNwZWNpZnlpbmcgd2hldGhlciB0byB3YWl0IGZvciBpbnB1dCBlbGVtZW50cyB0byBiZWNvbWUgZW5hYmxlZCBiZWZvcmUgdGhlXG4gICAgICogYWN0aW9uLiBBcHBsaWNhYmxlIHRvIGBjbGlja2AgYW5kIGBmaWxsYCBhY3Rpb25zLlxuICAgICAqXG4gICAgICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWBcbiAgICAgKi9cbiAgICBzZXRXYWl0Rm9yRW5hYmxlZCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgbG9jYXRvci4jd2FpdEZvckVuYWJsZWQgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgbG9jYXRvciBpbnN0YW5jZSBieSBjbG9uaW5nIHRoZSBjdXJyZW50IGxvY2F0b3IgYW5kXG4gICAgICogc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBsb2NhdG9yIHNob3VsZCBzY3JvbGwgdGhlIGVsZW1lbnQgaW50byB2aWV3cG9ydCBpZlxuICAgICAqIGl0IGlzIG5vdCBpbiB0aGUgdmlld3BvcnQgYWxyZWFkeS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0VmFsdWUgYHRydWVgXG4gICAgICovXG4gICAgc2V0RW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgbG9jYXRvci4jZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBsb2NhdG9yIGluc3RhbmNlIGJ5IGNsb25pbmcgdGhlIGN1cnJlbnQgbG9jYXRvciBhbmRcbiAgICAgKiBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGxvY2F0b3IgaGFzIHRvIHdhaXQgZm9yIHRoZSBlbGVtZW50J3MgYm91bmRpbmcgYm94XG4gICAgICogdG8gYmUgc2FtZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBhbmltYXRpb24gZnJhbWVzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWBcbiAgICAgKi9cbiAgICBzZXRXYWl0Rm9yU3RhYmxlQm91bmRpbmdCb3godmFsdWUpIHtcbiAgICAgICAgY29uc3QgbG9jYXRvciA9IHRoaXMuX2Nsb25lKCk7XG4gICAgICAgIGxvY2F0b3IuI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29weU9wdGlvbnMobG9jYXRvcikge1xuICAgICAgICB0aGlzLl90aW1lb3V0ID0gbG9jYXRvci5fdGltZW91dDtcbiAgICAgICAgdGhpcy52aXNpYmlsaXR5ID0gbG9jYXRvci52aXNpYmlsaXR5O1xuICAgICAgICB0aGlzLiN3YWl0Rm9yRW5hYmxlZCA9IGxvY2F0b3IuI3dhaXRGb3JFbmFibGVkO1xuICAgICAgICB0aGlzLiNlbnN1cmVFbGVtZW50SXNJblRoZVZpZXdwb3J0ID0gbG9jYXRvci4jZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydDtcbiAgICAgICAgdGhpcy4jd2FpdEZvclN0YWJsZUJvdW5kaW5nQm94ID0gbG9jYXRvci4jd2FpdEZvclN0YWJsZUJvdW5kaW5nQm94O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVsZW1lbnQgaGFzIGEgXCJkaXNhYmxlZFwiIHByb3BlcnR5LCB3YWl0IGZvciB0aGUgZWxlbWVudCB0byBiZVxuICAgICAqIGVuYWJsZWQuXG4gICAgICovXG4gICAgI3dhaXRGb3JFbmFibGVkSWZOZWVkZWQgPSAoaGFuZGxlLCBzaWduYWwpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLiN3YWl0Rm9yRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcm9tKGhhbmRsZS5mcmFtZS53YWl0Rm9yRnVuY3Rpb24oZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc05hdGl2ZUZvcm1Db250cm9sID0gW1xuICAgICAgICAgICAgICAgICdCVVRUT04nLFxuICAgICAgICAgICAgICAgICdJTlBVVCcsXG4gICAgICAgICAgICAgICAgJ1NFTEVDVCcsXG4gICAgICAgICAgICAgICAgJ1RFWFRBUkVBJyxcbiAgICAgICAgICAgICAgICAnT1BUSU9OJyxcbiAgICAgICAgICAgICAgICAnT1BUR1JPVVAnLFxuICAgICAgICAgICAgXS5pbmNsdWRlcyhlbGVtZW50Lm5vZGVOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiAhaXNOYXRpdmVGb3JtQ29udHJvbCB8fCAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHRpbWVvdXQ6IHRoaXMuX3RpbWVvdXQsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0sIGhhbmRsZSkpLnBpcGUoaWdub3JlRWxlbWVudHMoKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBlbGVtZW50IGZvciB0d28gY29uc2VjdXRpdmUgYW5pbWF0aW9uXG4gICAgICogZnJhbWVzIGFuZCB3YWl0cyB0aWxsIHRoZXkgYXJlIHRoZSBzYW1lLlxuICAgICAqL1xuICAgICN3YWl0Rm9yU3RhYmxlQm91bmRpbmdCb3hJZk5lZWRlZCA9IChoYW5kbGUpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLiN3YWl0Rm9yU3RhYmxlQm91bmRpbmdCb3gpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgLy8gTm90ZSB3ZSBkb24ndCB1c2Ugd2FpdEZvckZ1bmN0aW9uIGJlY2F1c2UgdGhhdCByZWxpZXMgb24gUkFGLlxuICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0MSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0MiA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHJlY3QxLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiByZWN0MS55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHJlY3QxLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZWN0MS5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHJlY3QyLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiByZWN0Mi55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHJlY3QyLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZWN0Mi5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pLnBpcGUoZmlyc3QoKFtyZWN0MSwgcmVjdDJdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKHJlY3QxLnggPT09IHJlY3QyLnggJiZcbiAgICAgICAgICAgICAgICByZWN0MS55ID09PSByZWN0Mi55ICYmXG4gICAgICAgICAgICAgICAgcmVjdDEud2lkdGggPT09IHJlY3QyLndpZHRoICYmXG4gICAgICAgICAgICAgICAgcmVjdDEuaGVpZ2h0ID09PSByZWN0Mi5oZWlnaHQpO1xuICAgICAgICB9KSwgcmV0cnkoeyBkZWxheTogUkVUUllfREVMQVkgfSksIGlnbm9yZUVsZW1lbnRzKCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSB2aWV3cG9ydCBhbmQgYXV0by1zY3JvbGxzIGl0IGlmIGl0IGlzIG5vdC5cbiAgICAgKi9cbiAgICAjZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydElmTmVlZGVkID0gKGhhbmRsZSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuaXNJbnRlcnNlY3RpbmdWaWV3cG9ydCh7IHRocmVzaG9sZDogMCB9KSkucGlwZShmaWx0ZXIoaXNJbnRlcnNlY3RpbmdWaWV3cG9ydCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIWlzSW50ZXJzZWN0aW5nVmlld3BvcnQ7XG4gICAgICAgIH0pLCBtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIH0pLCBtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tKGhhbmRsZS5pc0ludGVyc2VjdGluZ1ZpZXdwb3J0KHsgdGhyZXNob2xkOiAwIH0pKTtcbiAgICAgICAgICAgIH0pLnBpcGUoZmlyc3QoaWRlbnRpdHkpLCByZXRyeSh7IGRlbGF5OiBSRVRSWV9ERUxBWSB9KSwgaWdub3JlRWxlbWVudHMoKSk7XG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgICNjbGljayhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICAgICAgY29uc3QgY2F1c2UgPSBuZXcgRXJyb3IoJ0xvY2F0b3IuY2xpY2snKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhaXQob3B0aW9ucykucGlwZSh0aGlzLm9wZXJhdG9ycy5jb25kaXRpb25zKFtcbiAgICAgICAgICAgIHRoaXMuI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnRJZk5lZWRlZCxcbiAgICAgICAgICAgIHRoaXMuI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveElmTmVlZGVkLFxuICAgICAgICAgICAgdGhpcy4jd2FpdEZvckVuYWJsZWRJZk5lZWRlZCxcbiAgICAgICAgXSwgc2lnbmFsKSwgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoTG9jYXRvckV2ZW50LkFjdGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSksIG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuY2xpY2sob3B0aW9ucykpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgaGFuZGxlLmRpc3Bvc2UoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pLCB0aGlzLm9wZXJhdG9ycy5yZXRyeUFuZFJhY2VXaXRoU2lnbmFsQW5kVGltZXIoc2lnbmFsLCBjYXVzZSkpO1xuICAgIH1cbiAgICAjZmlsbCh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gbmV3IEVycm9yKCdMb2NhdG9yLmZpbGwnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhaXQob3B0aW9ucykucGlwZSh0aGlzLm9wZXJhdG9ycy5jb25kaXRpb25zKFtcbiAgICAgICAgICAgIHRoaXMuI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnRJZk5lZWRlZCxcbiAgICAgICAgICAgIHRoaXMuI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveElmTmVlZGVkLFxuICAgICAgICAgICAgdGhpcy4jd2FpdEZvckVuYWJsZWRJZk5lZWRlZCxcbiAgICAgICAgXSwgc2lnbmFsKSwgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoTG9jYXRvckV2ZW50LkFjdGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSksIG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuZXZhbHVhdGUoZWwgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnc2VsZWN0JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3R5cGVhYmxlLWlucHV0JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3IFNldChbXG4gICAgICAgICAgICAgICAgICAgICAgICAndGV4dGFyZWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAndGVsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzZWFyY2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2VtYWlsJyxcbiAgICAgICAgICAgICAgICAgICAgXSkuaGFzKGVsLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3R5cGVhYmxlLWlucHV0JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnb3RoZXItaW5wdXQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbnRlbnRlZGl0YWJsZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAndW5rbm93bic7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAucGlwZShtZXJnZU1hcChpbnB1dFR5cGUgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5wdXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuc2VsZWN0KHZhbHVlKS50aGVuKG5vb3ApKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29udGVudGVkaXRhYmxlJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndHlwZWFibGUtaW5wdXQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKChpbnB1dCwgbmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBpbnB1dC5pc0NvbnRlbnRFZGl0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmlubmVyVGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlucHV0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBpbnB1dCBpZiB0aGUgY3VycmVudCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gY3VycmVudFZhbHVlLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmV3VmFsdWUuc3RhcnRzV2l0aChpbnB1dC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5pbm5lclRleHQgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gaW5wdXQuaXNDb250ZW50RWRpdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5pbm5lclRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgcGFydGlhbGx5IGZpbGxlZCBvdXQsIG9ubHkgdHlwZSB0aGUgcmVzdC4gTW92ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBjb21tb24gcHJlZml4LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5pbm5lclRleHQgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuaW5uZXJUZXh0ID0gb3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gb3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlLnN1YnN0cmluZyhvcmlnaW5hbFZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB2YWx1ZSkpLnBpcGUobWVyZ2VNYXAodGV4dFRvVHlwZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLnR5cGUodGV4dFRvVHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdvdGhlci1pbnB1dCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuZm9jdXMoKSkucGlwZShtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKChpbnB1dCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndW5rbm93bic6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY2Fubm90IGJlIGZpbGxlZCBvdXQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgaGFuZGxlLmRpc3Bvc2UoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pLCB0aGlzLm9wZXJhdG9ycy5yZXRyeUFuZFJhY2VXaXRoU2lnbmFsQW5kVGltZXIoc2lnbmFsLCBjYXVzZSkpO1xuICAgIH1cbiAgICAjaG92ZXIob3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gbmV3IEVycm9yKCdMb2NhdG9yLmhvdmVyJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl93YWl0KG9wdGlvbnMpLnBpcGUodGhpcy5vcGVyYXRvcnMuY29uZGl0aW9ucyhbXG4gICAgICAgICAgICB0aGlzLiNlbnN1cmVFbGVtZW50SXNJblRoZVZpZXdwb3J0SWZOZWVkZWQsXG4gICAgICAgICAgICB0aGlzLiN3YWl0Rm9yU3RhYmxlQm91bmRpbmdCb3hJZk5lZWRlZCxcbiAgICAgICAgXSwgc2lnbmFsKSwgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoTG9jYXRvckV2ZW50LkFjdGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSksIG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuaG92ZXIoKSkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBoYW5kbGUuZGlzcG9zZSgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSksIHRoaXMub3BlcmF0b3JzLnJldHJ5QW5kUmFjZVdpdGhTaWduYWxBbmRUaW1lcihzaWduYWwsIGNhdXNlKSk7XG4gICAgfVxuICAgICNzY3JvbGwob3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gbmV3IEVycm9yKCdMb2NhdG9yLnNjcm9sbCcpO1xuICAgICAgICByZXR1cm4gdGhpcy5fd2FpdChvcHRpb25zKS5waXBlKHRoaXMub3BlcmF0b3JzLmNvbmRpdGlvbnMoW1xuICAgICAgICAgICAgdGhpcy4jZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydElmTmVlZGVkLFxuICAgICAgICAgICAgdGhpcy4jd2FpdEZvclN0YWJsZUJvdW5kaW5nQm94SWZOZWVkZWQsXG4gICAgICAgIF0sIHNpZ25hbCksIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KExvY2F0b3JFdmVudC5BY3Rpb24sIHVuZGVmaW5lZCk7XG4gICAgICAgIH0pLCBtZXJnZU1hcChoYW5kbGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKChlbCwgc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbFRvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbExlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBlbC5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBvcHRpb25zPy5zY3JvbGxUb3AsIG9wdGlvbnM/LnNjcm9sbExlZnQpKS5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICB2b2lkIGhhbmRsZS5kaXNwb3NlKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSwgdGhpcy5vcGVyYXRvcnMucmV0cnlBbmRSYWNlV2l0aFNpZ25hbEFuZFRpbWVyKHNpZ25hbCwgY2F1c2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvbmVzIHRoZSBsb2NhdG9yLlxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvbmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgZm9yIHRoZSBsb2NhdG9yIHRvIGdldCBhIGhhbmRsZSBmcm9tIHRoZSBwYWdlLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGFzeW5jIHdhaXRIYW5kbGUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBjYXVzZSA9IG5ldyBFcnJvcignTG9jYXRvci53YWl0SGFuZGxlJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl93YWl0KG9wdGlvbnMpLnBpcGUodGhpcy5vcGVyYXRvcnMucmV0cnlBbmRSYWNlV2l0aFNpZ25hbEFuZFRpbWVyKG9wdGlvbnM/LnNpZ25hbCwgY2F1c2UpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdhaXRzIGZvciB0aGUgbG9jYXRvciB0byBnZXQgdGhlIHNlcmlhbGl6ZWQgdmFsdWUgZnJvbSB0aGUgcGFnZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhpcyByZXF1aXJlcyB0aGUgdmFsdWUgdG8gYmUgSlNPTi1zZXJpYWxpemFibGUuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgYXN5bmMgd2FpdChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHRoaXMud2FpdEhhbmRsZShvcHRpb25zKSwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZS5qc29uVmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFwcyB0aGUgbG9jYXRvciB1c2luZyB0aGUgcHJvdmlkZWQgbWFwcGVyLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIG1hcChtYXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBwZWRMb2NhdG9yKHRoaXMuX2Nsb25lKCksIGhhbmRsZSA9PiB7XG4gICAgICAgICAgICAvLyBTQUZFVFk6IFR5cGVTY3JpcHQgY2Fubm90IGRlZHVjZSB0aGUgdHlwZS5cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGUuZXZhbHVhdGVIYW5kbGUobWFwcGVyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gZXhwZWN0YXRpb24gdGhhdCBpcyBldmFsdWF0ZWQgYWdhaW5zdCBsb2NhdGVkIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBleHBlY3RhdGlvbnMgZG8gbm90IG1hdGNoLCB0aGVuIHRoZSBsb2NhdG9yIHdpbGwgcmV0cnkuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgZmlsdGVyKHByZWRpY2F0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZpbHRlcmVkTG9jYXRvcih0aGlzLl9jbG9uZSgpLCBhc3luYyAoaGFuZGxlLCBzaWduYWwpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZS5mcmFtZS53YWl0Rm9yRnVuY3Rpb24ocHJlZGljYXRlLCB7IHNpZ25hbCwgdGltZW91dDogdGhpcy5fdGltZW91dCB9LCBoYW5kbGUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGV4cGVjdGF0aW9uIHRoYXQgaXMgZXZhbHVhdGVkIGFnYWluc3QgbG9jYXRlZCBoYW5kbGVzLlxuICAgICAqXG4gICAgICogSWYgdGhlIGV4cGVjdGF0aW9ucyBkbyBub3QgbWF0Y2gsIHRoZW4gdGhlIGxvY2F0b3Igd2lsbCByZXRyeS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGZpbHRlckhhbmRsZShwcmVkaWNhdGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJlZExvY2F0b3IodGhpcy5fY2xvbmUoKSwgcHJlZGljYXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFwcyB0aGUgbG9jYXRvciB1c2luZyB0aGUgcHJvdmlkZWQgbWFwcGVyLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgbWFwSGFuZGxlKG1hcHBlcikge1xuICAgICAgICByZXR1cm4gbmV3IE1hcHBlZExvY2F0b3IodGhpcy5fY2xvbmUoKSwgbWFwcGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xpY2tzIHRoZSBsb2NhdGVkIGVsZW1lbnQuXG4gICAgICovXG4gICAgY2xpY2sob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy4jY2xpY2sob3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaWxscyBvdXQgdGhlIGlucHV0IGlkZW50aWZpZWQgYnkgdGhlIGxvY2F0b3IgdXNpbmcgdGhlIHByb3ZpZGVkIHZhbHVlLiBUaGVcbiAgICAgKiB0eXBlIG9mIHRoZSBpbnB1dCBpcyBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUgYW5kIHRoZSBhcHByb3ByaWF0ZSBmaWxsLW91dFxuICAgICAqIG1ldGhvZCBpcyBjaG9zZW4gYmFzZWQgb24gdGhlIHR5cGUuIGBjb250ZW50ZWRpdGFibGVgLCBzZWxlY3QsIHRleHRhcmVhIGFuZFxuICAgICAqIGlucHV0IGVsZW1lbnRzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICovXG4gICAgZmlsbCh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy4jZmlsbCh2YWx1ZSwgb3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIb3ZlcnMgb3ZlciB0aGUgbG9jYXRlZCBlbGVtZW50LlxuICAgICAqL1xuICAgIGhvdmVyKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuI2hvdmVyKG9wdGlvbnMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2Nyb2xscyB0aGUgbG9jYXRlZCBlbGVtZW50LlxuICAgICAqL1xuICAgIHNjcm9sbChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLiNzY3JvbGwob3B0aW9ucykpO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBGdW5jdGlvbkxvY2F0b3IgZXh0ZW5kcyBMb2NhdG9yIHtcbiAgICBzdGF0aWMgY3JlYXRlKHBhZ2VPckZyYW1lLCBmdW5jKSB7XG4gICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25Mb2NhdG9yKHBhZ2VPckZyYW1lLCBmdW5jKS5zZXRUaW1lb3V0KCdnZXREZWZhdWx0VGltZW91dCcgaW4gcGFnZU9yRnJhbWVcbiAgICAgICAgICAgID8gcGFnZU9yRnJhbWUuZ2V0RGVmYXVsdFRpbWVvdXQoKVxuICAgICAgICAgICAgOiBwYWdlT3JGcmFtZS5wYWdlKCkuZ2V0RGVmYXVsdFRpbWVvdXQoKSk7XG4gICAgfVxuICAgICNwYWdlT3JGcmFtZTtcbiAgICAjZnVuYztcbiAgICBjb25zdHJ1Y3RvcihwYWdlT3JGcmFtZSwgZnVuYykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNwYWdlT3JGcmFtZSA9IHBhZ2VPckZyYW1lO1xuICAgICAgICB0aGlzLiNmdW5jID0gZnVuYztcbiAgICB9XG4gICAgX2Nsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uTG9jYXRvcih0aGlzLiNwYWdlT3JGcmFtZSwgdGhpcy4jZnVuYyk7XG4gICAgfVxuICAgIF93YWl0KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZyb20odGhpcy4jcGFnZU9yRnJhbWUud2FpdEZvckZ1bmN0aW9uKHRoaXMuI2Z1bmMsIHtcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiB0aGlzLnRpbWVvdXQsXG4gICAgICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KS5waXBlKHRocm93SWZFbXB0eSgpKTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRGVsZWdhdGVkTG9jYXRvciBleHRlbmRzIExvY2F0b3Ige1xuICAgICNkZWxlZ2F0ZTtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNkZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgICAgICB0aGlzLmNvcHlPcHRpb25zKHRoaXMuI2RlbGVnYXRlKTtcbiAgICB9XG4gICAgZ2V0IGRlbGVnYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGVsZWdhdGU7XG4gICAgfVxuICAgIHNldFRpbWVvdXQodGltZW91dCkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gc3VwZXIuc2V0VGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgbG9jYXRvci4jZGVsZWdhdGUgPSB0aGlzLiNkZWxlZ2F0ZS5zZXRUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KSB7XG4gICAgICAgIGNvbnN0IGxvY2F0b3IgPSBzdXBlci5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IGxvY2F0b3IuI2RlbGVnYXRlLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7XG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgIH1cbiAgICBzZXRXYWl0Rm9yRW5hYmxlZCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gc3VwZXIuc2V0V2FpdEZvckVuYWJsZWQodmFsdWUpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IHRoaXMuI2RlbGVnYXRlLnNldFdhaXRGb3JFbmFibGVkKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XG4gICAgfVxuICAgIHNldEVuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbG9jYXRvciA9IHN1cGVyLnNldEVuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQodmFsdWUpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IHRoaXMuI2RlbGVnYXRlLnNldEVuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQodmFsdWUpO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgc2V0V2FpdEZvclN0YWJsZUJvdW5kaW5nQm94KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0b3IgPSBzdXBlci5zZXRXYWl0Rm9yU3RhYmxlQm91bmRpbmdCb3godmFsdWUpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IHRoaXMuI2RlbGVnYXRlLnNldFdhaXRGb3JTdGFibGVCb3VuZGluZ0JveCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWx0ZXJlZExvY2F0b3IgZXh0ZW5kcyBEZWxlZ2F0ZWRMb2NhdG9yIHtcbiAgICAjcHJlZGljYXRlO1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIHByZWRpY2F0ZSkge1xuICAgICAgICBzdXBlcihiYXNlKTtcbiAgICAgICAgdGhpcy4jcHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgIH1cbiAgICBfY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmlsdGVyZWRMb2NhdG9yKHRoaXMuZGVsZWdhdGUuY2xvbmUoKSwgdGhpcy4jcHJlZGljYXRlKS5jb3B5T3B0aW9ucyh0aGlzKTtcbiAgICB9XG4gICAgX3dhaXQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5fd2FpdChvcHRpb25zKS5waXBlKG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUodGhpcy4jcHJlZGljYXRlKGhhbmRsZSwgb3B0aW9ucz8uc2lnbmFsKSkpLnBpcGUoZmlsdGVyKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9KSwgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTQUZFVFk6IEl0IHBhc3NlZCB0aGUgcHJlZGljYXRlLCBzbyB0aGlzIGlzIGNvcnJlY3QuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSksIHRocm93SWZFbXB0eSgpKTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTWFwcGVkTG9jYXRvciBleHRlbmRzIERlbGVnYXRlZExvY2F0b3Ige1xuICAgICNtYXBwZXI7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgbWFwcGVyKSB7XG4gICAgICAgIHN1cGVyKGJhc2UpO1xuICAgICAgICB0aGlzLiNtYXBwZXIgPSBtYXBwZXI7XG4gICAgfVxuICAgIF9jbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBwZWRMb2NhdG9yKHRoaXMuZGVsZWdhdGUuY2xvbmUoKSwgdGhpcy4jbWFwcGVyKS5jb3B5T3B0aW9ucyh0aGlzKTtcbiAgICB9XG4gICAgX3dhaXQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5fd2FpdChvcHRpb25zKS5waXBlKG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUodGhpcy4jbWFwcGVyKGhhbmRsZSwgb3B0aW9ucz8uc2lnbmFsKSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE5vZGVMb2NhdG9yIGV4dGVuZHMgTG9jYXRvciB7XG4gICAgc3RhdGljIGNyZWF0ZShwYWdlT3JGcmFtZSwgc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlTG9jYXRvcihwYWdlT3JGcmFtZSwgc2VsZWN0b3IpLnNldFRpbWVvdXQoJ2dldERlZmF1bHRUaW1lb3V0JyBpbiBwYWdlT3JGcmFtZVxuICAgICAgICAgICAgPyBwYWdlT3JGcmFtZS5nZXREZWZhdWx0VGltZW91dCgpXG4gICAgICAgICAgICA6IHBhZ2VPckZyYW1lLnBhZ2UoKS5nZXREZWZhdWx0VGltZW91dCgpKTtcbiAgICB9XG4gICAgI3BhZ2VPckZyYW1lO1xuICAgICNzZWxlY3RvcjtcbiAgICBjb25zdHJ1Y3RvcihwYWdlT3JGcmFtZSwgc2VsZWN0b3IpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jcGFnZU9yRnJhbWUgPSBwYWdlT3JGcmFtZTtcbiAgICAgICAgdGhpcy4jc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgZm9yIHRoZSBlbGVtZW50IHRvIGJlY29tZSB2aXNpYmxlIG9yIGhpZGRlbi4gdmlzaWJpbGl0eSA9PT0gJ3Zpc2libGUnXG4gICAgICogbWVhbnMgdGhhdCB0aGUgZWxlbWVudCBoYXMgYSBjb21wdXRlZCBzdHlsZSwgdGhlIHZpc2liaWxpdHkgcHJvcGVydHkgb3RoZXJcbiAgICAgKiB0aGFuICdoaWRkZW4nIG9yICdjb2xsYXBzZScgYW5kIG5vbi1lbXB0eSBib3VuZGluZyBib3guIHZpc2liaWxpdHkgPT09XG4gICAgICogJ2hpZGRlbicgbWVhbnMgdGhlIG9wcG9zaXRlIG9mIHRoYXQuXG4gICAgICovXG4gICAgI3dhaXRGb3JWaXNpYmlsaXR5SWZOZWVkZWQgPSAoaGFuZGxlKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgoKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuaXNIaWRkZW4oKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3Zpc2libGUnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmlzVmlzaWJsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCkucGlwZShmaXJzdChpZGVudGl0eSksIHJldHJ5KHsgZGVsYXk6IFJFVFJZX0RFTEFZIH0pLCBpZ25vcmVFbGVtZW50cygpKTtcbiAgICB9O1xuICAgIF9jbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlTG9jYXRvcih0aGlzLiNwYWdlT3JGcmFtZSwgdGhpcy4jc2VsZWN0b3IpLmNvcHlPcHRpb25zKHRoaXMpO1xuICAgIH1cbiAgICBfd2FpdChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICAgICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMuI3BhZ2VPckZyYW1lLndhaXRGb3JTZWxlY3Rvcih0aGlzLiNzZWxlY3Rvciwge1xuICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IHRoaXMuX3RpbWVvdXQsXG4gICAgICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KS5waXBlKGZpbHRlcigodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbDtcbiAgICAgICAgfSksIHRocm93SWZFbXB0eSgpLCB0aGlzLm9wZXJhdG9ycy5jb25kaXRpb25zKFt0aGlzLiN3YWl0Rm9yVmlzaWJpbGl0eUlmTmVlZGVkXSwgc2lnbmFsKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tMb2NhdG9yQXJyYXkobG9jYXRvcnMpIHtcbiAgICBmb3IgKGNvbnN0IGxvY2F0b3Igb2YgbG9jYXRvcnMpIHtcbiAgICAgICAgaWYgKCEobG9jYXRvciBpbnN0YW5jZW9mIExvY2F0b3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbG9jYXRvciBmb3IgcmFjZSBjYW5kaWRhdGUnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbG9jYXRvcnM7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgUmFjZUxvY2F0b3IgZXh0ZW5kcyBMb2NhdG9yIHtcbiAgICBzdGF0aWMgY3JlYXRlKGxvY2F0b3JzKSB7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gY2hlY2tMb2NhdG9yQXJyYXkobG9jYXRvcnMpO1xuICAgICAgICByZXR1cm4gbmV3IFJhY2VMb2NhdG9yKGFycmF5KTtcbiAgICB9XG4gICAgI2xvY2F0b3JzO1xuICAgIGNvbnN0cnVjdG9yKGxvY2F0b3JzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2xvY2F0b3JzID0gbG9jYXRvcnM7XG4gICAgfVxuICAgIF9jbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYWNlTG9jYXRvcih0aGlzLiNsb2NhdG9ycy5tYXAobG9jYXRvciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvci5jbG9uZSgpO1xuICAgICAgICB9KSkuY29weU9wdGlvbnModGhpcyk7XG4gICAgfVxuICAgIF93YWl0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHJhY2UoLi4udGhpcy4jbG9jYXRvcnMubWFwKGxvY2F0b3IgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3IuX3dhaXQob3B0aW9ucyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG4vKipcbiAqIEZvciBvYnNlcnZhYmxlcyBjb21pbmcgZnJvbSBwcm9taXNlcywgYSBkZWxheSBpcyBuZWVkZWQsIG90aGVyd2lzZSBSeEpTIHdpbGxcbiAqIG5ldmVyIHlpZWxkIGluIGEgcGVybWFuZW50IGZhaWx1cmUgZm9yIGEgcHJvbWlzZS5cbiAqXG4gKiBXZSBhbHNvIGRvbid0IHdhbnQgUnhKUyB0byBkbyBwcm9taXNlIG9wZXJhdGlvbnMgdG8gb2Z0ZW4sIHNvIHdlIGJ1bXAgdGhlXG4gKiBkZWxheSB1cCB0byAxMDBtcy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJFVFJZX0RFTEFZID0gMTAwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9jYXRvcnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuLi9jZHAvQ29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBQcm90b2NvbEVycm9yLCBVbnN1cHBvcnRlZE9wZXJhdGlvbiB9IGZyb20gJy4uL2NvbW1vbi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgREVGQVVMVF9WSUVXUE9SVCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbi8qKlxuICogVXNlcnMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBkaXJlY3RseTsgaXQncyBjYWxsZWQgd2hlbiBjYWxsaW5nIGBwdXBwZXRlZXIuY29ubmVjdGBcbiAqIHdpdGggYHByb3RvY29sOiAnd2ViRHJpdmVyQmlEaSdgLiBUaGlzIG1ldGhvZCBhdHRhY2hlcyBQdXBwZXRlZXIgdG8gYW4gZXhpc3RpbmcgYnJvd3NlclxuICogaW5zdGFuY2UuIEZpcnN0IGl0IHRyaWVzIHRvIGNvbm5lY3QgdG8gdGhlIGJyb3dzZXIgdXNpbmcgcHVyZSBCaURpLiBJZiB0aGUgcHJvdG9jb2wgaXNcbiAqIG5vdCBzdXBwb3J0ZWQsIGNvbm5lY3RzIHRvIHRoZSBicm93c2VyIHVzaW5nIEJpRGkgb3ZlciBDRFAuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfY29ubmVjdFRvQmlEaUJyb3dzZXIoY29ubmVjdGlvblRyYW5zcG9ydCwgdXJsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyBpZ25vcmVIVFRQU0Vycm9ycyA9IGZhbHNlLCBkZWZhdWx0Vmlld3BvcnQgPSBERUZBVUxUX1ZJRVdQT1JUIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgYmlkaUNvbm5lY3Rpb24sIGNsb3NlQ2FsbGJhY2sgfSA9IGF3YWl0IGdldEJpRGlDb25uZWN0aW9uKGNvbm5lY3Rpb25UcmFuc3BvcnQsIHVybCwgb3B0aW9ucyk7XG4gICAgY29uc3QgQmlEaSA9IGF3YWl0IGltcG9ydCgvKiA6IHRydWUgKi8gJy4vYmlkaS5qcycpO1xuICAgIGNvbnN0IGJpZGlCcm93c2VyID0gYXdhaXQgQmlEaS5CaWRpQnJvd3Nlci5jcmVhdGUoe1xuICAgICAgICBjb25uZWN0aW9uOiBiaWRpQ29ubmVjdGlvbixcbiAgICAgICAgY2xvc2VDYWxsYmFjayxcbiAgICAgICAgcHJvY2VzczogdW5kZWZpbmVkLFxuICAgICAgICBkZWZhdWx0Vmlld3BvcnQ6IGRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IGlnbm9yZUhUVFBTRXJyb3JzLFxuICAgIH0pO1xuICAgIHJldHVybiBiaWRpQnJvd3Nlcjtcbn1cbi8qKlxuICogUmV0dXJucyBhIEJpRGlDb25uZWN0aW9uIGVzdGFibGlzaGVkIHRvIHRoZSBlbmRwb2ludCBzcGVjaWZpZWQgYnkgdGhlIG9wdGlvbnMgYW5kIGFcbiAqIGNhbGxiYWNrIGNsb3NpbmcgdGhlIGJyb3dzZXIuIENhbGxiYWNrIGRlcGVuZHMgb24gd2hldGhlciB0aGUgY29ubmVjdGlvbiBpcyBwdXJlIEJpRGlcbiAqIG9yIEJpRGkgb3ZlciBDRFAuXG4gKiBUaGUgbWV0aG9kIHRyaWVzIHRvIGNvbm5lY3QgdG8gdGhlIGJyb3dzZXIgdXNpbmcgcHVyZSBCaURpIHByb3RvY29sLCBhbmQgZmFsbHMgYmFja1xuICogdG8gQmlEaSBvdmVyIENEUC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QmlEaUNvbm5lY3Rpb24oY29ubmVjdGlvblRyYW5zcG9ydCwgdXJsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgQmlEaSA9IGF3YWl0IGltcG9ydCgvKiA6IHRydWUgKi8gJy4vYmlkaS5qcycpO1xuICAgIGNvbnN0IHsgaWdub3JlSFRUUFNFcnJvcnMgPSBmYWxzZSwgc2xvd01vID0gMCwgcHJvdG9jb2xUaW1lb3V0IH0gPSBvcHRpb25zO1xuICAgIC8vIFRyeSBwdXJlIEJpRGkgZmlyc3QuXG4gICAgY29uc3QgcHVyZUJpZGlDb25uZWN0aW9uID0gbmV3IEJpRGkuQmlkaUNvbm5lY3Rpb24odXJsLCBjb25uZWN0aW9uVHJhbnNwb3J0LCBzbG93TW8sIHByb3RvY29sVGltZW91dCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHVyZUJpZGlDb25uZWN0aW9uLnNlbmQoJ3Nlc3Npb24uc3RhdHVzJywge30pO1xuICAgICAgICBpZiAoJ3R5cGUnIGluIHJlc3VsdCAmJiByZXN1bHQudHlwZSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAvLyBUaGUgYGJyb3dzZXJXU0VuZHBvaW50YCBwb2ludHMgdG8gYW4gZW5kcG9pbnQgc3VwcG9ydGluZyBwdXJlIFdlYkRyaXZlciBCaURpLlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBiaWRpQ29ubmVjdGlvbjogcHVyZUJpZGlDb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGNsb3NlQ2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHVyZUJpZGlDb25uZWN0aW9uLnNlbmQoJ2Jyb3dzZXIuY2xvc2UnLCB7fSkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFByb3RvY29sRXJyb3IpKSB7XG4gICAgICAgICAgICAvLyBVbmV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgcmVsYXRlZCB0byBCaURpIC8gQ0RQLiBSZXRocm93LlxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBVbmJpbmQgdGhlIGNvbm5lY3Rpb24gdG8gYXZvaWQgbWVtb3J5IGxlYWtzLlxuICAgIHB1cmVCaWRpQ29ubmVjdGlvbi51bmJpbmQoKTtcbiAgICAvLyBGYWxsIGJhY2sgdG8gQ0RQIG92ZXIgQmlEaSByZXVzaW5nIHRoZSBXUyBjb25uZWN0aW9uLlxuICAgIGNvbnN0IGNkcENvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbih1cmwsIGNvbm5lY3Rpb25UcmFuc3BvcnQsIHNsb3dNbywgcHJvdG9jb2xUaW1lb3V0KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgY2RwQ29ubmVjdGlvbi5zZW5kKCdCcm93c2VyLmdldFZlcnNpb24nKTtcbiAgICBpZiAodmVyc2lvbi5wcm9kdWN0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ZpcmVmb3gnKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb24oJ0ZpcmVmb3ggaXMgbm90IHN1cHBvcnRlZCBpbiBCaURpIG92ZXIgQ0RQIG1vZGUuJyk7XG4gICAgfVxuICAgIC8vIFRPRE86IHVzZSBvdGhlciBvcHRpb25zIHRvby5cbiAgICBjb25zdCBiaWRpT3ZlckNkcENvbm5lY3Rpb24gPSBhd2FpdCBCaURpLmNvbm5lY3RCaWRpT3ZlckNkcChjZHBDb25uZWN0aW9uLCB7XG4gICAgICAgIGFjY2VwdEluc2VjdXJlQ2VydHM6IGlnbm9yZUhUVFBTRXJyb3JzLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGJpZGlDb25uZWN0aW9uOiBiaWRpT3ZlckNkcENvbm5lY3Rpb24sXG4gICAgICAgIGNsb3NlQ2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgQmlEaSBvdmVyIENEUCwgd2UgbmVlZCB0byBjbG9zZSBicm93c2VyIHZpYSBDRFAuXG4gICAgICAgICAgICBhd2FpdCBjZHBDb25uZWN0aW9uLnNlbmQoJ0Jyb3dzZXIuY2xvc2UnKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckNvbm5lY3Rvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgQWNjZXNzaWJpbGl0eSBjbGFzcyBwcm92aWRlcyBtZXRob2RzIGZvciBpbnNwZWN0aW5nIHRoZSBicm93c2VyJ3NcbiAqIGFjY2Vzc2liaWxpdHkgdHJlZS4gVGhlIGFjY2Vzc2liaWxpdHkgdHJlZSBpcyB1c2VkIGJ5IGFzc2lzdGl2ZSB0ZWNobm9sb2d5XG4gKiBzdWNoIGFzIHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TY3JlZW5fcmVhZGVyIHwgc2NyZWVuIHJlYWRlcnN9IG9yXG4gKiB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3dpdGNoX2FjY2VzcyB8IHN3aXRjaGVzfS5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIEFjY2Vzc2liaWxpdHkgaXMgYSB2ZXJ5IHBsYXRmb3JtLXNwZWNpZmljIHRoaW5nLiBPbiBkaWZmZXJlbnQgcGxhdGZvcm1zLFxuICogdGhlcmUgYXJlIGRpZmZlcmVudCBzY3JlZW4gcmVhZGVycyB0aGF0IG1pZ2h0IGhhdmUgd2lsZGx5IGRpZmZlcmVudCBvdXRwdXQuXG4gKlxuICogQmxpbmsgLSBDaHJvbWUncyByZW5kZXJpbmcgZW5naW5lIC0gaGFzIGEgY29uY2VwdCBvZiBcImFjY2Vzc2liaWxpdHkgdHJlZVwiLFxuICogd2hpY2ggaXMgdGhlbiB0cmFuc2xhdGVkIGludG8gZGlmZmVyZW50IHBsYXRmb3JtLXNwZWNpZmljIEFQSXMuIEFjY2Vzc2liaWxpdHlcbiAqIG5hbWVzcGFjZSBnaXZlcyB1c2VycyBhY2Nlc3MgdG8gdGhlIEJsaW5rIEFjY2Vzc2liaWxpdHkgVHJlZS5cbiAqXG4gKiBNb3N0IG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUgZ2V0cyBmaWx0ZXJlZCBvdXQgd2hlbiBjb252ZXJ0aW5nIGZyb20gQmxpbmtcbiAqIEFYIFRyZWUgdG8gUGxhdGZvcm0tc3BlY2lmaWMgQVgtVHJlZSBvciBieSBhc3Npc3RpdmUgdGVjaG5vbG9naWVzIHRoZW1zZWx2ZXMuXG4gKiBCeSBkZWZhdWx0LCBQdXBwZXRlZXIgdHJpZXMgdG8gYXBwcm94aW1hdGUgdGhpcyBmaWx0ZXJpbmcsIGV4cG9zaW5nIG9ubHlcbiAqIHRoZSBcImludGVyZXN0aW5nXCIgbm9kZXMgb2YgdGhlIHRyZWUuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQWNjZXNzaWJpbGl0eSB7XG4gICAgI3JlYWxtO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJlYWxtKSB7XG4gICAgICAgIHRoaXMuI3JlYWxtID0gcmVhbG07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhcHR1cmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuXG4gICAgICogVGhlIHJldHVybmVkIG9iamVjdCByZXByZXNlbnRzIHRoZSByb290IGFjY2Vzc2libGUgbm9kZSBvZiB0aGUgcGFnZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBUaGUgQ2hyb21lIGFjY2Vzc2liaWxpdHkgdHJlZSBjb250YWlucyBub2RlcyB0aGF0IGdvIHVudXNlZCBvblxuICAgICAqIG1vc3QgcGxhdGZvcm1zIGFuZCBieSBtb3N0IHNjcmVlbiByZWFkZXJzLiBQdXBwZXRlZXIgd2lsbCBkaXNjYXJkIHRoZW0gYXNcbiAgICAgKiB3ZWxsIGZvciBhbiBlYXNpZXIgdG8gcHJvY2VzcyB0cmVlLCB1bmxlc3MgYGludGVyZXN0aW5nT25seWAgaXMgc2V0IHRvXG4gICAgICogYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogQW4gZXhhbXBsZSBvZiBkdW1waW5nIHRoZSBlbnRpcmUgYWNjZXNzaWJpbGl0eSB0cmVlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHBhZ2UuYWNjZXNzaWJpbGl0eS5zbmFwc2hvdCgpO1xuICAgICAqIGNvbnNvbGUubG9nKHNuYXBzaG90KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogQW4gZXhhbXBsZSBvZiBsb2dnaW5nIHRoZSBmb2N1c2VkIG5vZGUncyBuYW1lOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHBhZ2UuYWNjZXNzaWJpbGl0eS5zbmFwc2hvdCgpO1xuICAgICAqIGNvbnN0IG5vZGUgPSBmaW5kRm9jdXNlZE5vZGUoc25hcHNob3QpO1xuICAgICAqIGNvbnNvbGUubG9nKG5vZGUgJiYgbm9kZS5uYW1lKTtcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGZpbmRGb2N1c2VkTm9kZShub2RlKSB7XG4gICAgICogICBpZiAobm9kZS5mb2N1c2VkKSByZXR1cm4gbm9kZTtcbiAgICAgKiAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbiB8fCBbXSkge1xuICAgICAqICAgICBjb25zdCBmb3VuZE5vZGUgPSBmaW5kRm9jdXNlZE5vZGUoY2hpbGQpO1xuICAgICAqICAgICByZXR1cm4gZm91bmROb2RlO1xuICAgICAqICAgfVxuICAgICAqICAgcmV0dXJuIG51bGw7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gQVhOb2RlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNuYXBzaG90LlxuICAgICAqL1xuICAgIGFzeW5jIHNuYXBzaG90KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGludGVyZXN0aW5nT25seSA9IHRydWUsIHJvb3QgPSBudWxsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCB7IG5vZGVzIH0gPSBhd2FpdCB0aGlzLiNyZWFsbS5lbnZpcm9ubWVudC5jbGllbnQuc2VuZCgnQWNjZXNzaWJpbGl0eS5nZXRGdWxsQVhUcmVlJyk7XG4gICAgICAgIGxldCBiYWNrZW5kTm9kZUlkO1xuICAgICAgICBpZiAocm9vdCkge1xuICAgICAgICAgICAgY29uc3QgeyBub2RlIH0gPSBhd2FpdCB0aGlzLiNyZWFsbS5lbnZpcm9ubWVudC5jbGllbnQuc2VuZCgnRE9NLmRlc2NyaWJlTm9kZScsIHtcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogcm9vdC5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmFja2VuZE5vZGVJZCA9IG5vZGUuYmFja2VuZE5vZGVJZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZhdWx0Um9vdCA9IEFYTm9kZS5jcmVhdGVUcmVlKHRoaXMuI3JlYWxtLCBub2Rlcyk7XG4gICAgICAgIGxldCBuZWVkbGUgPSBkZWZhdWx0Um9vdDtcbiAgICAgICAgaWYgKGJhY2tlbmROb2RlSWQpIHtcbiAgICAgICAgICAgIG5lZWRsZSA9IGRlZmF1bHRSb290LmZpbmQobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUucGF5bG9hZC5iYWNrZW5kRE9NTm9kZUlkID09PSBiYWNrZW5kTm9kZUlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIW5lZWRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaW50ZXJlc3RpbmdPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVUcmVlKG5lZWRsZSlbMF0gPz8gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnRlcmVzdGluZ05vZGVzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLmNvbGxlY3RJbnRlcmVzdGluZ05vZGVzKGludGVyZXN0aW5nTm9kZXMsIGRlZmF1bHRSb290LCBmYWxzZSk7XG4gICAgICAgIGlmICghaW50ZXJlc3RpbmdOb2Rlcy5oYXMobmVlZGxlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplVHJlZShuZWVkbGUsIGludGVyZXN0aW5nTm9kZXMpWzBdID8/IG51bGw7XG4gICAgfVxuICAgIHNlcmlhbGl6ZVRyZWUobm9kZSwgaW50ZXJlc3RpbmdOb2Rlcykge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goLi4udGhpcy5zZXJpYWxpemVUcmVlKGNoaWxkLCBpbnRlcmVzdGluZ05vZGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyZXN0aW5nTm9kZXMgJiYgIWludGVyZXN0aW5nTm9kZXMuaGFzKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZE5vZGUgPSBub2RlLnNlcmlhbGl6ZSgpO1xuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZXJpYWxpemVkTm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbc2VyaWFsaXplZE5vZGVdO1xuICAgIH1cbiAgICBjb2xsZWN0SW50ZXJlc3RpbmdOb2Rlcyhjb2xsZWN0aW9uLCBub2RlLCBpbnNpZGVDb250cm9sKSB7XG4gICAgICAgIGlmIChub2RlLmlzSW50ZXJlc3RpbmcoaW5zaWRlQ29udHJvbCkpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmlzTGVhZk5vZGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGluc2lkZUNvbnRyb2wgPSBpbnNpZGVDb250cm9sIHx8IG5vZGUuaXNDb250cm9sKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy5jb2xsZWN0SW50ZXJlc3RpbmdOb2Rlcyhjb2xsZWN0aW9uLCBjaGlsZCwgaW5zaWRlQ29udHJvbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBBWE5vZGUge1xuICAgIHBheWxvYWQ7XG4gICAgY2hpbGRyZW4gPSBbXTtcbiAgICAjcmljaGx5RWRpdGFibGUgPSBmYWxzZTtcbiAgICAjZWRpdGFibGUgPSBmYWxzZTtcbiAgICAjZm9jdXNhYmxlID0gZmFsc2U7XG4gICAgI2hpZGRlbiA9IGZhbHNlO1xuICAgICNuYW1lO1xuICAgICNyb2xlO1xuICAgICNpZ25vcmVkO1xuICAgICNjYWNoZWRIYXNGb2N1c2FibGVDaGlsZDtcbiAgICAjcmVhbG07XG4gICAgY29uc3RydWN0b3IocmVhbG0sIHBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgdGhpcy4jbmFtZSA9IHRoaXMucGF5bG9hZC5uYW1lID8gdGhpcy5wYXlsb2FkLm5hbWUudmFsdWUgOiAnJztcbiAgICAgICAgdGhpcy4jcm9sZSA9IHRoaXMucGF5bG9hZC5yb2xlID8gdGhpcy5wYXlsb2FkLnJvbGUudmFsdWUgOiAnVW5rbm93bic7XG4gICAgICAgIHRoaXMuI2lnbm9yZWQgPSB0aGlzLnBheWxvYWQuaWdub3JlZDtcbiAgICAgICAgdGhpcy4jcmVhbG0gPSByZWFsbTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLnBheWxvYWQucHJvcGVydGllcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm5hbWUgPT09ICdlZGl0YWJsZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyaWNobHlFZGl0YWJsZSA9IHByb3BlcnR5LnZhbHVlLnZhbHVlID09PSAncmljaHRleHQnO1xuICAgICAgICAgICAgICAgIHRoaXMuI2VkaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5uYW1lID09PSAnZm9jdXNhYmxlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2ZvY3VzYWJsZSA9IHByb3BlcnR5LnZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm5hbWUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jaGlkZGVuID0gcHJvcGVydHkudmFsdWUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2lzUGxhaW5UZXh0RmllbGQoKSB7XG4gICAgICAgIGlmICh0aGlzLiNyaWNobHlFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNlZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI3JvbGUgPT09ICd0ZXh0Ym94JyB8fCB0aGlzLiNyb2xlID09PSAnc2VhcmNoYm94JztcbiAgICB9XG4gICAgI2lzVGV4dE9ubHlPYmplY3QoKSB7XG4gICAgICAgIGNvbnN0IHJvbGUgPSB0aGlzLiNyb2xlO1xuICAgICAgICByZXR1cm4gKHJvbGUgPT09ICdMaW5lQnJlYWsnIHx8XG4gICAgICAgICAgICByb2xlID09PSAndGV4dCcgfHxcbiAgICAgICAgICAgIHJvbGUgPT09ICdJbmxpbmVUZXh0Qm94JyB8fFxuICAgICAgICAgICAgcm9sZSA9PT0gJ1N0YXRpY1RleHQnKTtcbiAgICB9XG4gICAgI2hhc0ZvY3VzYWJsZUNoaWxkKCkge1xuICAgICAgICBpZiAodGhpcy4jY2FjaGVkSGFzRm9jdXNhYmxlQ2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy4jY2FjaGVkSGFzRm9jdXNhYmxlQ2hpbGQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC4jZm9jdXNhYmxlIHx8IGNoaWxkLiNoYXNGb2N1c2FibGVDaGlsZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2NhY2hlZEhhc0ZvY3VzYWJsZUNoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWNoZWRIYXNGb2N1c2FibGVDaGlsZDtcbiAgICB9XG4gICAgZmluZChwcmVkaWNhdGUpIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGlsZC5maW5kKHByZWRpY2F0ZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaXNMZWFmTm9kZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlc2UgdHlwZXMgb2Ygb2JqZWN0cyBtYXkgaGF2ZSBjaGlsZHJlbiB0aGF0IHdlIHVzZSBhcyBpbnRlcm5hbFxuICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCBidXQgd2Ugd2FudCB0byBleHBvc2UgdGhlbSBhcyBsZWF2ZXMgdG8gcGxhdGZvcm1cbiAgICAgICAgLy8gYWNjZXNzaWJpbGl0eSBBUElzIGJlY2F1c2Ugc2NyZWVuIHJlYWRlcnMgbWlnaHQgYmUgY29uZnVzZWQgaWYgdGhleSBmaW5kXG4gICAgICAgIC8vIGFueSBjaGlsZHJlbi5cbiAgICAgICAgaWYgKHRoaXMuI2lzUGxhaW5UZXh0RmllbGQoKSB8fCB0aGlzLiNpc1RleHRPbmx5T2JqZWN0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJvbGVzIHdob3NlIGNoaWxkcmVuIGFyZSBvbmx5IHByZXNlbnRhdGlvbmFsIGFjY29yZGluZyB0byB0aGUgQVJJQSBhbmRcbiAgICAgICAgLy8gSFRNTDUgU3BlY3Mgc2hvdWxkIGJlIGhpZGRlbiBmcm9tIHNjcmVlbiByZWFkZXJzLlxuICAgICAgICAvLyAoTm90ZSB0aGF0IHdoaWxzdCBBUklBIGJ1dHRvbnMgY2FuIGhhdmUgb25seSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiwgSFRNTDVcbiAgICAgICAgLy8gYnV0dG9ucyBhcmUgYWxsb3dlZCB0byBoYXZlIGNvbnRlbnQuKVxuICAgICAgICBzd2l0Y2ggKHRoaXMuI3JvbGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1jb3Zlcic6XG4gICAgICAgICAgICBjYXNlICdncmFwaGljcy1zeW1ib2wnOlxuICAgICAgICAgICAgY2FzZSAnaW1nJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgICAgIGNhc2UgJ01ldGVyJzpcbiAgICAgICAgICAgIGNhc2UgJ3Njcm9sbGJhcic6XG4gICAgICAgICAgICBjYXNlICdzbGlkZXInOlxuICAgICAgICAgICAgY2FzZSAnc2VwYXJhdG9yJzpcbiAgICAgICAgICAgIGNhc2UgJ3Byb2dyZXNzYmFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGVyZSBhbmQgYmVsb3c6IEFuZHJvaWQgaGV1cmlzdGljc1xuICAgICAgICBpZiAodGhpcy4jaGFzRm9jdXNhYmxlQ2hpbGQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNmb2N1c2FibGUgJiYgdGhpcy4jbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3JvbGUgPT09ICdoZWFkaW5nJyAmJiB0aGlzLiNuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlzQ29udHJvbCgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLiNyb2xlKSB7XG4gICAgICAgICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgY2FzZSAnQ29sb3JXZWxsJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbWJvYm94JzpcbiAgICAgICAgICAgIGNhc2UgJ0Rpc2Nsb3N1cmVUcmlhbmdsZSc6XG4gICAgICAgICAgICBjYXNlICdsaXN0Ym94JzpcbiAgICAgICAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgICAgICAgY2FzZSAnbWVudWJhcic6XG4gICAgICAgICAgICBjYXNlICdtZW51aXRlbSc6XG4gICAgICAgICAgICBjYXNlICdtZW51aXRlbWNoZWNrYm94JzpcbiAgICAgICAgICAgIGNhc2UgJ21lbnVpdGVtcmFkaW8nOlxuICAgICAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgICAgY2FzZSAnc2Nyb2xsYmFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NlYXJjaGJveCc6XG4gICAgICAgICAgICBjYXNlICdzbGlkZXInOlxuICAgICAgICAgICAgY2FzZSAnc3BpbmJ1dHRvbic6XG4gICAgICAgICAgICBjYXNlICdzd2l0Y2gnOlxuICAgICAgICAgICAgY2FzZSAndGFiJzpcbiAgICAgICAgICAgIGNhc2UgJ3RleHRib3gnOlxuICAgICAgICAgICAgY2FzZSAndHJlZSc6XG4gICAgICAgICAgICBjYXNlICd0cmVlaXRlbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc0ludGVyZXN0aW5nKGluc2lkZUNvbnRyb2wpIHtcbiAgICAgICAgY29uc3Qgcm9sZSA9IHRoaXMuI3JvbGU7XG4gICAgICAgIGlmIChyb2xlID09PSAnSWdub3JlZCcgfHwgdGhpcy4jaGlkZGVuIHx8IHRoaXMuI2lnbm9yZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jZm9jdXNhYmxlIHx8IHRoaXMuI3JpY2hseUVkaXRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBpdCdzIG5vdCBmb2N1c2FibGUgYnV0IGhhcyBhIGNvbnRyb2wgcm9sZSwgdGhlbiBpdCdzIGludGVyZXN0aW5nLlxuICAgICAgICBpZiAodGhpcy5pc0NvbnRyb2woKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBub24gZm9jdXNhYmxlIGNoaWxkIG9mIGEgY29udHJvbCBpcyBub3QgaW50ZXJlc3RpbmdcbiAgICAgICAgaWYgKGluc2lkZUNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pc0xlYWZOb2RlKCkgJiYgISF0aGlzLiNuYW1lO1xuICAgIH1cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdGhpcy5wYXlsb2FkLnByb3BlcnRpZXMgfHwgW10pIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0KHByb3BlcnR5Lm5hbWUudG9Mb3dlckNhc2UoKSwgcHJvcGVydHkudmFsdWUudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBheWxvYWQubmFtZSkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoJ25hbWUnLCB0aGlzLnBheWxvYWQubmFtZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGF5bG9hZC52YWx1ZSkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoJ3ZhbHVlJywgdGhpcy5wYXlsb2FkLnZhbHVlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXlsb2FkLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnNldCgnZGVzY3JpcHRpb24nLCB0aGlzLnBheWxvYWQuZGVzY3JpcHRpb24udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgICAgICByb2xlOiB0aGlzLiNyb2xlLFxuICAgICAgICAgICAgZWxlbWVudEhhbmRsZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wYXlsb2FkLmJhY2tlbmRET01Ob2RlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy4jcmVhbG0uYWRvcHRCYWNrZW5kTm9kZSh0aGlzLnBheWxvYWQuYmFja2VuZERPTU5vZGVJZCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdXNlclN0cmluZ1Byb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICdrZXlzaG9ydGN1dHMnLFxuICAgICAgICAgICAgJ3JvbGVkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAndmFsdWV0ZXh0JyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgZ2V0VXNlclN0cmluZ1Byb3BlcnR5VmFsdWUgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCB1c2VyU3RyaW5nUHJvcGVydHkgb2YgdXNlclN0cmluZ1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICghcHJvcGVydGllcy5oYXModXNlclN0cmluZ1Byb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZVt1c2VyU3RyaW5nUHJvcGVydHldID0gZ2V0VXNlclN0cmluZ1Byb3BlcnR5VmFsdWUodXNlclN0cmluZ1Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBib29sZWFuUHJvcGVydGllcyA9IFtcbiAgICAgICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICAgICAnZXhwYW5kZWQnLFxuICAgICAgICAgICAgJ2ZvY3VzZWQnLFxuICAgICAgICAgICAgJ21vZGFsJyxcbiAgICAgICAgICAgICdtdWx0aWxpbmUnLFxuICAgICAgICAgICAgJ211bHRpc2VsZWN0YWJsZScsXG4gICAgICAgICAgICAncmVhZG9ubHknLFxuICAgICAgICAgICAgJ3JlcXVpcmVkJyxcbiAgICAgICAgICAgICdzZWxlY3RlZCcsXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGdldEJvb2xlYW5Qcm9wZXJ0eVZhbHVlID0gKGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0KGtleSk7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgYm9vbGVhblByb3BlcnR5IG9mIGJvb2xlYW5Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAvLyBSb290V2ViQXJlYSdzIHRyZWF0IGZvY3VzIGRpZmZlcmVudGx5IHRoYW4gb3RoZXIgbm9kZXMuIFRoZXkgcmVwb3J0IHdoZXRoZXJcbiAgICAgICAgICAgIC8vIHRoZWlyIGZyYW1lICBoYXMgZm9jdXMsIG5vdCB3aGV0aGVyIGZvY3VzIGlzIHNwZWNpZmljYWxseSBvbiB0aGUgcm9vdFxuICAgICAgICAgICAgLy8gbm9kZS5cbiAgICAgICAgICAgIGlmIChib29sZWFuUHJvcGVydHkgPT09ICdmb2N1c2VkJyAmJiB0aGlzLiNyb2xlID09PSAnUm9vdFdlYkFyZWEnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEJvb2xlYW5Qcm9wZXJ0eVZhbHVlKGJvb2xlYW5Qcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlW2Jvb2xlYW5Qcm9wZXJ0eV0gPSBnZXRCb29sZWFuUHJvcGVydHlWYWx1ZShib29sZWFuUHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyaXN0YXRlUHJvcGVydGllcyA9IFsnY2hlY2tlZCcsICdwcmVzc2VkJ107XG4gICAgICAgIGZvciAoY29uc3QgdHJpc3RhdGVQcm9wZXJ0eSBvZiB0cmlzdGF0ZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICghcHJvcGVydGllcy5oYXModHJpc3RhdGVQcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydGllcy5nZXQodHJpc3RhdGVQcm9wZXJ0eSk7XG4gICAgICAgICAgICBub2RlW3RyaXN0YXRlUHJvcGVydHldID1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9PT0gJ21peGVkJyA/ICdtaXhlZCcgOiB2YWx1ZSA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG51bWVyaWNhbFByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAnbGV2ZWwnLFxuICAgICAgICAgICAgJ3ZhbHVlbWF4JyxcbiAgICAgICAgICAgICd2YWx1ZW1pbicsXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGdldE51bWVyaWNhbFByb3BlcnR5VmFsdWUgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBudW1lcmljYWxQcm9wZXJ0eSBvZiBudW1lcmljYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMuaGFzKG51bWVyaWNhbFByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZVtudW1lcmljYWxQcm9wZXJ0eV0gPSBnZXROdW1lcmljYWxQcm9wZXJ0eVZhbHVlKG51bWVyaWNhbFByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlblByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAnYXV0b2NvbXBsZXRlJyxcbiAgICAgICAgICAgICdoYXNwb3B1cCcsXG4gICAgICAgICAgICAnaW52YWxpZCcsXG4gICAgICAgICAgICAnb3JpZW50YXRpb24nLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBnZXRUb2tlblByb3BlcnR5VmFsdWUgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlblByb3BlcnR5IG9mIHRva2VuUHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRUb2tlblByb3BlcnR5VmFsdWUodG9rZW5Qcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlW3Rva2VuUHJvcGVydHldID0gZ2V0VG9rZW5Qcm9wZXJ0eVZhbHVlKHRva2VuUHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlVHJlZShyZWFsbSwgcGF5bG9hZHMpIHtcbiAgICAgICAgY29uc3Qgbm9kZUJ5SWQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgcGF5bG9hZCBvZiBwYXlsb2Fkcykge1xuICAgICAgICAgICAgbm9kZUJ5SWQuc2V0KHBheWxvYWQubm9kZUlkLCBuZXcgQVhOb2RlKHJlYWxtLCBwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVCeUlkLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkSWQgb2Ygbm9kZS5wYXlsb2FkLmNoaWxkSWRzIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlQnlJZC5nZXQoY2hpbGRJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlQnlJZC52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWNjZXNzaWJpbGl0eS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi4vY29tbW9uL1F1ZXJ5SGFuZGxlci5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBBc3luY0l0ZXJhYmxlVXRpbCB9IGZyb20gJy4uL3V0aWwvQXN5bmNJdGVyYWJsZVV0aWwuanMnO1xuY29uc3QgaXNLbm93bkF0dHJpYnV0ZSA9IChhdHRyaWJ1dGUpID0+IHtcbiAgICByZXR1cm4gWyduYW1lJywgJ3JvbGUnXS5pbmNsdWRlcyhhdHRyaWJ1dGUpO1xufTtcbmNvbnN0IG5vcm1hbGl6ZVZhbHVlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyArL2csICcgJykudHJpbSgpO1xufTtcbi8qKlxuICogVGhlIHNlbGVjdG9ycyBjb25zaXN0IG9mIGFuIGFjY2Vzc2libGUgbmFtZSB0byBxdWVyeSBmb3IgYW5kIG9wdGlvbmFsbHlcbiAqIGZ1cnRoZXIgYXJpYSBhdHRyaWJ1dGVzIG9uIHRoZSBmb3JtIGBbPGF0dHJpYnV0ZT49PHZhbHVlPl1gLlxuICogQ3VycmVudGx5LCB3ZSBvbmx5IHN1cHBvcnQgdGhlIGBuYW1lYCBhbmQgYHJvbGVgIGF0dHJpYnV0ZS5cbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvd2Nhc2UgaG93IHRoZSBzeW50YXggd29ya3Mgd3J0LiBxdWVyeWluZzpcbiAqXG4gKiAtICd0aXRsZVtyb2xlPVwiaGVhZGluZ1wiXScgcXVlcmllcyBmb3IgZWxlbWVudHMgd2l0aCBuYW1lICd0aXRsZScgYW5kIHJvbGUgJ2hlYWRpbmcnLlxuICogLSAnW3JvbGU9XCJpbWFnZVwiXScgcXVlcmllcyBmb3IgZWxlbWVudHMgd2l0aCByb2xlICdpbWFnZScgYW5kIGFueSBuYW1lLlxuICogLSAnbGFiZWwnIHF1ZXJpZXMgZm9yIGVsZW1lbnRzIHdpdGggbmFtZSAnbGFiZWwnIGFuZCBhbnkgcm9sZS5cbiAqIC0gJ1tuYW1lPVwiXCJdW3JvbGU9XCJidXR0b25cIl0nIHF1ZXJpZXMgZm9yIGVsZW1lbnRzIHdpdGggbm8gbmFtZSBhbmQgcm9sZSAnYnV0dG9uJy5cbiAqL1xuY29uc3QgQVRUUklCVVRFX1JFR0VYUCA9IC9cXFtcXHMqKD88YXR0cmlidXRlPlxcdyspXFxzKj1cXHMqKD88cXVvdGU+XCJ8JykoPzx2YWx1ZT5cXFxcLnwuKj8oPz1cXGs8cXVvdGU+KSlcXGs8cXVvdGU+XFxzKlxcXS9nO1xuY29uc3QgcGFyc2VBUklBU2VsZWN0b3IgPSAoc2VsZWN0b3IpID0+IHtcbiAgICBjb25zdCBxdWVyeU9wdGlvbnMgPSB7fTtcbiAgICBjb25zdCBkZWZhdWx0TmFtZSA9IHNlbGVjdG9yLnJlcGxhY2UoQVRUUklCVVRFX1JFR0VYUCwgKF8sIGF0dHJpYnV0ZSwgX18sIHZhbHVlKSA9PiB7XG4gICAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS50cmltKCk7XG4gICAgICAgIGFzc2VydChpc0tub3duQXR0cmlidXRlKGF0dHJpYnV0ZSksIGBVbmtub3duIGFyaWEgYXR0cmlidXRlIFwiJHthdHRyaWJ1dGV9XCIgaW4gc2VsZWN0b3JgKTtcbiAgICAgICAgcXVlcnlPcHRpb25zW2F0dHJpYnV0ZV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcbiAgICBpZiAoZGVmYXVsdE5hbWUgJiYgIXF1ZXJ5T3B0aW9ucy5uYW1lKSB7XG4gICAgICAgIHF1ZXJ5T3B0aW9ucy5uYW1lID0gbm9ybWFsaXplVmFsdWUoZGVmYXVsdE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gcXVlcnlPcHRpb25zO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBBUklBUXVlcnlIYW5kbGVyIGV4dGVuZHMgUXVlcnlIYW5kbGVyIHtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvciA9IGFzeW5jIChub2RlLCBzZWxlY3RvciwgeyBhcmlhUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBhcmlhUXVlcnlTZWxlY3Rvcihub2RlLCBzZWxlY3Rvcik7XG4gICAgfTtcbiAgICBzdGF0aWMgYXN5bmMgKnF1ZXJ5QWxsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgcm9sZSB9ID0gcGFyc2VBUklBU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICB5aWVsZCogZWxlbWVudC5xdWVyeUFYVHJlZShuYW1lLCByb2xlKTtcbiAgICB9XG4gICAgc3RhdGljIHF1ZXJ5T25lID0gYXN5bmMgKGVsZW1lbnQsIHNlbGVjdG9yKSA9PiB7XG4gICAgICAgIHJldHVybiAoKGF3YWl0IEFzeW5jSXRlcmFibGVVdGlsLmZpcnN0KHRoaXMucXVlcnlBbGwoZWxlbWVudCwgc2VsZWN0b3IpKSkgPz8gbnVsbCk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFyaWFRdWVyeUhhbmRsZXIuanMubWFwIiwidmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBKU0hhbmRsZSB9IGZyb20gJy4uL2FwaS9KU0hhbmRsZS5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IGlzRXJyb3JMaWtlIH0gZnJvbSAnLi4vdXRpbC9FcnJvckxpa2UuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEJpbmRpbmcge1xuICAgICNuYW1lO1xuICAgICNmbjtcbiAgICAjaW5pdFNvdXJjZTtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBmbiwgaW5pdFNvdXJjZSkge1xuICAgICAgICB0aGlzLiNuYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy4jZm4gPSBmbjtcbiAgICAgICAgdGhpcy4jaW5pdFNvdXJjZSA9IGluaXRTb3VyY2U7XG4gICAgfVxuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbmFtZTtcbiAgICB9XG4gICAgZ2V0IGluaXRTb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpbml0U291cmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29udGV4dCAtIENvbnRleHQgdG8gcnVuIHRoZSBiaW5kaW5nIGluOyB0aGUgY29udGV4dCBzaG91bGQgaGF2ZVxuICAgICAqIHRoZSBiaW5kaW5nIGFkZGVkIHRvIGl0IGJlZm9yZWhhbmQuXG4gICAgICogQHBhcmFtIGlkIC0gSUQgb2YgdGhlIGNhbGwuIFRoaXMgc2hvdWxkIGNvbWUgZnJvbSB0aGUgQ0RQXG4gICAgICogYG9uQmluZGluZ0NhbGxlZGAgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIGFyZ3MgLSBQbGFpbiBhcmd1bWVudHMgZnJvbSBDRFAuXG4gICAgICovXG4gICAgYXN5bmMgcnVuKGNvbnRleHQsIGlkLCBhcmdzLCBpc1RyaXZpYWwpIHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWlzVHJpdmlhbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldHRpbmcgbm9uLXRyaXZpYWwgYXJndW1lbnRzLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVzID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IGNvbnRleHQuZXZhbHVhdGVIYW5kbGUoKG5hbWUsIHNlcSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBDb2RlIGlzIGV2YWx1YXRlZCBpbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFRoaXNbbmFtZV0uYXJncy5nZXQoc2VxKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy4jbmFtZSwgaWQpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBhd2FpdCBoYW5kbGVzLmdldFByb3BlcnRpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGhhbmRsZV0gb2YgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3Qgc3RyYWlnaHQtZm9yd2FyZCBzaW5jZSBzb21lIGFyZ3VtZW50cyBjYW4gc3RyaW5naWZ5LCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZW4ndCBwbGFpbiBvYmplY3RzIHNvIGFkZCBzdWJ0eXBlcyB3aGVuIHRoZSB1c2UtY2FzZSBhcmlzZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggaW4gYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaGFuZGxlLnJlbW90ZU9iamVjdCgpLnN1YnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbm9kZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWytpbmRleF0gPSBoYW5kbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnVzZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnVzZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5ldmFsdWF0ZSgobmFtZSwgc2VxLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIENvZGUgaXMgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gZ2xvYmFsVGhpc1tuYW1lXS5jYWxsYmFja3M7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzLmdldChzZXEpLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICBjYWxsYmFja3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICB9LCB0aGlzLiNuYW1lLCBpZCwgYXdhaXQgdGhpcy4jZm4oLi4uYXJncykpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBKU0hhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFjay51c2UoYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dFxuICAgICAgICAgICAgICAgICAgICAuZXZhbHVhdGUoKG5hbWUsIHNlcSwgbWVzc2FnZSwgc3RhY2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnN0YWNrID0gc3RhY2s7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgQ29kZSBpcyBldmFsdWF0ZWQgaW4gYSBkaWZmZXJlbnQgY29udGV4dC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gZ2xvYmFsVGhpc1tuYW1lXS5jYWxsYmFja3M7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5nZXQoc2VxKS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcy4jbmFtZSwgaWQsIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5ldmFsdWF0ZSgobmFtZSwgc2VxLCBlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIENvZGUgaXMgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGdsb2JhbFRoaXNbbmFtZV0uY2FsbGJhY2tzO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZ2V0KHNlcSkucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmRlbGV0ZShzZXEpO1xuICAgICAgICAgICAgICAgIH0sIHRoaXMuI25hbWUsIGlkLCBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmluZGluZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQnJvd3NlciBhcyBCcm93c2VyQmFzZSwgfSBmcm9tICcuLi9hcGkvQnJvd3Nlci5qcyc7XG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBDZHBCcm93c2VyQ29udGV4dCB9IGZyb20gJy4vQnJvd3NlckNvbnRleHQuanMnO1xuaW1wb3J0IHsgQ2hyb21lVGFyZ2V0TWFuYWdlciB9IGZyb20gJy4vQ2hyb21lVGFyZ2V0TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBGaXJlZm94VGFyZ2V0TWFuYWdlciB9IGZyb20gJy4vRmlyZWZveFRhcmdldE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRGV2VG9vbHNUYXJnZXQsIEluaXRpYWxpemF0aW9uU3RhdHVzLCBPdGhlclRhcmdldCwgUGFnZVRhcmdldCwgV29ya2VyVGFyZ2V0LCB9IGZyb20gJy4vVGFyZ2V0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBCcm93c2VyIGV4dGVuZHMgQnJvd3NlckJhc2Uge1xuICAgIHByb3RvY29sID0gJ2NkcCc7XG4gICAgc3RhdGljIGFzeW5jIF9jcmVhdGUocHJvZHVjdCwgY29ubmVjdGlvbiwgY29udGV4dElkcywgaWdub3JlSFRUUFNFcnJvcnMsIGRlZmF1bHRWaWV3cG9ydCwgcHJvY2VzcywgY2xvc2VDYWxsYmFjaywgdGFyZ2V0RmlsdGVyQ2FsbGJhY2ssIGlzUGFnZVRhcmdldENhbGxiYWNrLCB3YWl0Rm9ySW5pdGlhbGx5RGlzY292ZXJlZFRhcmdldHMgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXIgPSBuZXcgQ2RwQnJvd3Nlcihwcm9kdWN0LCBjb25uZWN0aW9uLCBjb250ZXh0SWRzLCBkZWZhdWx0Vmlld3BvcnQsIHByb2Nlc3MsIGNsb3NlQ2FsbGJhY2ssIHRhcmdldEZpbHRlckNhbGxiYWNrLCBpc1BhZ2VUYXJnZXRDYWxsYmFjaywgd2FpdEZvckluaXRpYWxseURpc2NvdmVyZWRUYXJnZXRzKTtcbiAgICAgICAgaWYgKGlnbm9yZUhUVFBTRXJyb3JzKSB7XG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1NlY3VyaXR5LnNldElnbm9yZUNlcnRpZmljYXRlRXJyb3JzJywge1xuICAgICAgICAgICAgICAgIGlnbm9yZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGJyb3dzZXIuX2F0dGFjaCgpO1xuICAgICAgICByZXR1cm4gYnJvd3NlcjtcbiAgICB9XG4gICAgI2RlZmF1bHRWaWV3cG9ydDtcbiAgICAjcHJvY2VzcztcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjY2xvc2VDYWxsYmFjaztcbiAgICAjdGFyZ2V0RmlsdGVyQ2FsbGJhY2s7XG4gICAgI2lzUGFnZVRhcmdldENhbGxiYWNrO1xuICAgICNkZWZhdWx0Q29udGV4dDtcbiAgICAjY29udGV4dHMgPSBuZXcgTWFwKCk7XG4gICAgI3RhcmdldE1hbmFnZXI7XG4gICAgY29uc3RydWN0b3IocHJvZHVjdCwgY29ubmVjdGlvbiwgY29udGV4dElkcywgZGVmYXVsdFZpZXdwb3J0LCBwcm9jZXNzLCBjbG9zZUNhbGxiYWNrLCB0YXJnZXRGaWx0ZXJDYWxsYmFjaywgaXNQYWdlVGFyZ2V0Q2FsbGJhY2ssIHdhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cyA9IHRydWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgfHwgJ2Nocm9tZSc7XG4gICAgICAgIHRoaXMuI2RlZmF1bHRWaWV3cG9ydCA9IGRlZmF1bHRWaWV3cG9ydDtcbiAgICAgICAgdGhpcy4jcHJvY2VzcyA9IHByb2Nlc3M7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLiNjbG9zZUNhbGxiYWNrID0gY2xvc2VDYWxsYmFjayB8fCAoKCkgPT4geyB9KTtcbiAgICAgICAgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2sgPVxuICAgICAgICAgICAgdGFyZ2V0RmlsdGVyQ2FsbGJhY2sgfHxcbiAgICAgICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jc2V0SXNQYWdlVGFyZ2V0Q2FsbGJhY2soaXNQYWdlVGFyZ2V0Q2FsbGJhY2spO1xuICAgICAgICBpZiAocHJvZHVjdCA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyID0gbmV3IEZpcmVmb3hUYXJnZXRNYW5hZ2VyKGNvbm5lY3Rpb24sIHRoaXMuI2NyZWF0ZVRhcmdldCwgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jdGFyZ2V0TWFuYWdlciA9IG5ldyBDaHJvbWVUYXJnZXRNYW5hZ2VyKGNvbm5lY3Rpb24sIHRoaXMuI2NyZWF0ZVRhcmdldCwgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2ssIHdhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGVmYXVsdENvbnRleHQgPSBuZXcgQ2RwQnJvd3NlckNvbnRleHQodGhpcy4jY29ubmVjdGlvbiwgdGhpcyk7XG4gICAgICAgIGZvciAoY29uc3QgY29udGV4dElkIG9mIGNvbnRleHRJZHMpIHtcbiAgICAgICAgICAgIHRoaXMuI2NvbnRleHRzLnNldChjb250ZXh0SWQsIG5ldyBDZHBCcm93c2VyQ29udGV4dCh0aGlzLiNjb25uZWN0aW9uLCB0aGlzLCBjb250ZXh0SWQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjZW1pdERpc2Nvbm5lY3RlZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KFwiZGlzY29ubmVjdGVkXCIgLyogQnJvd3NlckV2ZW50LkRpc2Nvbm5lY3RlZCAqLywgdW5kZWZpbmVkKTtcbiAgICB9O1xuICAgIGFzeW5jIF9hdHRhY2goKSB7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24ub24oQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgdGhpcy4jZW1pdERpc2Nvbm5lY3RlZCk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0aGlzLiNvbkF0dGFjaGVkVG9UYXJnZXQpO1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLm9uKFwidGFyZ2V0R29uZVwiIC8qIFRhcmdldE1hbmFnZXJFdmVudC5UYXJnZXRHb25lICovLCB0aGlzLiNvbkRldGFjaGVkRnJvbVRhcmdldCk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXRDaGFuZ2VkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldENoYW5nZWQgKi8sIHRoaXMuI29uVGFyZ2V0Q2hhbmdlZCk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXREaXNjb3ZlcmVkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldERpc2NvdmVyZWQgKi8sIHRoaXMuI29uVGFyZ2V0RGlzY292ZXJlZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuI3RhcmdldE1hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgICBfZGV0YWNoKCkge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZihDRFBTZXNzaW9uRXZlbnQuRGlzY29ubmVjdGVkLCB0aGlzLiNlbWl0RGlzY29ubmVjdGVkKTtcbiAgICAgICAgdGhpcy4jdGFyZ2V0TWFuYWdlci5vZmYoXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0aGlzLiNvbkF0dGFjaGVkVG9UYXJnZXQpO1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLm9mZihcInRhcmdldEdvbmVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0R29uZSAqLywgdGhpcy4jb25EZXRhY2hlZEZyb21UYXJnZXQpO1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLm9mZihcInRhcmdldENoYW5nZWRcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0Q2hhbmdlZCAqLywgdGhpcy4jb25UYXJnZXRDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy4jdGFyZ2V0TWFuYWdlci5vZmYoXCJ0YXJnZXREaXNjb3ZlcmVkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldERpc2NvdmVyZWQgKi8sIHRoaXMuI29uVGFyZ2V0RGlzY292ZXJlZCk7XG4gICAgfVxuICAgIHByb2Nlc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9jZXNzID8/IG51bGw7XG4gICAgfVxuICAgIF90YXJnZXRNYW5hZ2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFyZ2V0TWFuYWdlcjtcbiAgICB9XG4gICAgI3NldElzUGFnZVRhcmdldENhbGxiYWNrKGlzUGFnZVRhcmdldENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuI2lzUGFnZVRhcmdldENhbGxiYWNrID1cbiAgICAgICAgICAgIGlzUGFnZVRhcmdldENhbGxiYWNrIHx8XG4gICAgICAgICAgICAgICAgKCh0YXJnZXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0YXJnZXQudHlwZSgpID09PSAncGFnZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC50eXBlKCkgPT09ICdiYWNrZ3JvdW5kX3BhZ2UnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQudHlwZSgpID09PSAnd2VidmlldycpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0SXNQYWdlVGFyZ2V0Q2FsbGJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc1BhZ2VUYXJnZXRDYWxsYmFjaztcbiAgICB9XG4gICAgYXN5bmMgY3JlYXRlQnJvd3NlckNvbnRleHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgcHJveHlTZXJ2ZXIsIHByb3h5QnlwYXNzTGlzdCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgeyBicm93c2VyQ29udGV4dElkIH0gPSBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5jcmVhdGVCcm93c2VyQ29udGV4dCcsIHtcbiAgICAgICAgICAgIHByb3h5U2VydmVyLFxuICAgICAgICAgICAgcHJveHlCeXBhc3NMaXN0OiBwcm94eUJ5cGFzc0xpc3QgJiYgcHJveHlCeXBhc3NMaXN0LmpvaW4oJywnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgQ2RwQnJvd3NlckNvbnRleHQodGhpcy4jY29ubmVjdGlvbiwgdGhpcywgYnJvd3NlckNvbnRleHRJZCk7XG4gICAgICAgIHRoaXMuI2NvbnRleHRzLnNldChicm93c2VyQ29udGV4dElkLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuICAgIGJyb3dzZXJDb250ZXh0cygpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLiNkZWZhdWx0Q29udGV4dCwgLi4uQXJyYXkuZnJvbSh0aGlzLiNjb250ZXh0cy52YWx1ZXMoKSldO1xuICAgIH1cbiAgICBkZWZhdWx0QnJvd3NlckNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0Q29udGV4dDtcbiAgICB9XG4gICAgYXN5bmMgX2Rpc3Bvc2VDb250ZXh0KGNvbnRleHRJZCkge1xuICAgICAgICBpZiAoIWNvbnRleHRJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LmRpc3Bvc2VCcm93c2VyQ29udGV4dCcsIHtcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IGNvbnRleHRJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2NvbnRleHRzLmRlbGV0ZShjb250ZXh0SWQpO1xuICAgIH1cbiAgICAjY3JlYXRlVGFyZ2V0ID0gKHRhcmdldEluZm8sIHNlc3Npb24pID0+IHtcbiAgICAgICAgY29uc3QgeyBicm93c2VyQ29udGV4dElkIH0gPSB0YXJnZXRJbmZvO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gYnJvd3NlckNvbnRleHRJZCAmJiB0aGlzLiNjb250ZXh0cy5oYXMoYnJvd3NlckNvbnRleHRJZClcbiAgICAgICAgICAgID8gdGhpcy4jY29udGV4dHMuZ2V0KGJyb3dzZXJDb250ZXh0SWQpXG4gICAgICAgICAgICA6IHRoaXMuI2RlZmF1bHRDb250ZXh0O1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBicm93c2VyIGNvbnRleHQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjcmVhdGVTZXNzaW9uID0gKGlzQXV0b0F0dGFjaEVtdWxhdGVkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jY29ubmVjdGlvbi5fY3JlYXRlU2Vzc2lvbih0YXJnZXRJbmZvLCBpc0F1dG9BdHRhY2hFbXVsYXRlZCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gbmV3IE90aGVyVGFyZ2V0KHRhcmdldEluZm8sIHNlc3Npb24sIGNvbnRleHQsIHRoaXMuI3RhcmdldE1hbmFnZXIsIGNyZWF0ZVNlc3Npb24pO1xuICAgICAgICBpZiAodGFyZ2V0SW5mby51cmw/LnN0YXJ0c1dpdGgoJ2RldnRvb2xzOi8vJykpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGV2VG9vbHNUYXJnZXQodGFyZ2V0SW5mbywgc2Vzc2lvbiwgY29udGV4dCwgdGhpcy4jdGFyZ2V0TWFuYWdlciwgY3JlYXRlU2Vzc2lvbiwgdGhpcy4jZGVmYXVsdFZpZXdwb3J0ID8/IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNpc1BhZ2VUYXJnZXRDYWxsYmFjayhvdGhlclRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFnZVRhcmdldCh0YXJnZXRJbmZvLCBzZXNzaW9uLCBjb250ZXh0LCB0aGlzLiN0YXJnZXRNYW5hZ2VyLCBjcmVhdGVTZXNzaW9uLCB0aGlzLiNkZWZhdWx0Vmlld3BvcnQgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldEluZm8udHlwZSA9PT0gJ3NlcnZpY2Vfd29ya2VyJyB8fFxuICAgICAgICAgICAgdGFyZ2V0SW5mby50eXBlID09PSAnc2hhcmVkX3dvcmtlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgV29ya2VyVGFyZ2V0KHRhcmdldEluZm8sIHNlc3Npb24sIGNvbnRleHQsIHRoaXMuI3RhcmdldE1hbmFnZXIsIGNyZWF0ZVNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdGhlclRhcmdldDtcbiAgICB9O1xuICAgICNvbkF0dGFjaGVkVG9UYXJnZXQgPSBhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgIGlmICh0YXJnZXQuX2lzVGFyZ2V0RXhwb3NlZCgpICYmXG4gICAgICAgICAgICAoYXdhaXQgdGFyZ2V0Ll9pbml0aWFsaXplZERlZmVycmVkLnZhbHVlT3JUaHJvdygpKSA9PT1cbiAgICAgICAgICAgICAgICBJbml0aWFsaXphdGlvblN0YXR1cy5TVUNDRVNTKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRjcmVhdGVkXCIgLyogQnJvd3NlckV2ZW50LlRhcmdldENyZWF0ZWQgKi8sIHRhcmdldCk7XG4gICAgICAgICAgICB0YXJnZXQuYnJvd3NlckNvbnRleHQoKS5lbWl0KFwidGFyZ2V0Y3JlYXRlZFwiIC8qIEJyb3dzZXJDb250ZXh0RXZlbnQuVGFyZ2V0Q3JlYXRlZCAqLywgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgI29uRGV0YWNoZWRGcm9tVGFyZ2V0ID0gYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgICB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQucmVzb2x2ZShJbml0aWFsaXphdGlvblN0YXR1cy5BQk9SVEVEKTtcbiAgICAgICAgdGFyZ2V0Ll9pc0Nsb3NlZERlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgICAgaWYgKHRhcmdldC5faXNUYXJnZXRFeHBvc2VkKCkgJiZcbiAgICAgICAgICAgIChhd2FpdCB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQudmFsdWVPclRocm93KCkpID09PVxuICAgICAgICAgICAgICAgIEluaXRpYWxpemF0aW9uU3RhdHVzLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldGRlc3Ryb3llZFwiIC8qIEJyb3dzZXJFdmVudC5UYXJnZXREZXN0cm95ZWQgKi8sIHRhcmdldCk7XG4gICAgICAgICAgICB0YXJnZXQuYnJvd3NlckNvbnRleHQoKS5lbWl0KFwidGFyZ2V0ZGVzdHJveWVkXCIgLyogQnJvd3NlckNvbnRleHRFdmVudC5UYXJnZXREZXN0cm95ZWQgKi8sIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgICNvblRhcmdldENoYW5nZWQgPSAoeyB0YXJnZXQgfSkgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRjaGFuZ2VkXCIgLyogQnJvd3NlckV2ZW50LlRhcmdldENoYW5nZWQgKi8sIHRhcmdldCk7XG4gICAgICAgIHRhcmdldC5icm93c2VyQ29udGV4dCgpLmVtaXQoXCJ0YXJnZXRjaGFuZ2VkXCIgLyogQnJvd3NlckNvbnRleHRFdmVudC5UYXJnZXRDaGFuZ2VkICovLCB0YXJnZXQpO1xuICAgIH07XG4gICAgI29uVGFyZ2V0RGlzY292ZXJlZCA9ICh0YXJnZXRJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdChcInRhcmdldGRpc2NvdmVyZWRcIiAvKiBCcm93c2VyRXZlbnQuVGFyZ2V0RGlzY292ZXJlZCAqLywgdGFyZ2V0SW5mbyk7XG4gICAgfTtcbiAgICB3c0VuZHBvaW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY29ubmVjdGlvbi51cmwoKTtcbiAgICB9XG4gICAgYXN5bmMgbmV3UGFnZSgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2RlZmF1bHRDb250ZXh0Lm5ld1BhZ2UoKTtcbiAgICB9XG4gICAgYXN5bmMgX2NyZWF0ZVBhZ2VJbkNvbnRleHQoY29udGV4dElkKSB7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0SWQgfSA9IGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LmNyZWF0ZVRhcmdldCcsIHtcbiAgICAgICAgICAgIHVybDogJ2Fib3V0OmJsYW5rJyxcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IGNvbnRleHRJZCB8fCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSAoYXdhaXQgdGhpcy53YWl0Rm9yVGFyZ2V0KHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHQuX3RhcmdldElkID09PSB0YXJnZXRJZDtcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHRhcmdldCBmb3IgcGFnZSAoaWQgPSAke3RhcmdldElkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbml0aWFsaXplZCA9IChhd2FpdCB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQudmFsdWVPclRocm93KCkpID09PVxuICAgICAgICAgICAgSW5pdGlhbGl6YXRpb25TdGF0dXMuU1VDQ0VTUztcbiAgICAgICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHRhcmdldCBmb3IgcGFnZSAoaWQgPSAke3RhcmdldElkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGFyZ2V0LnBhZ2UoKTtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgYSBwYWdlIGZvciBjb250ZXh0IChpZCA9ICR7Y29udGV4dElkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICB9XG4gICAgdGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy4jdGFyZ2V0TWFuYWdlci5nZXRBdmFpbGFibGVUYXJnZXRzKCkudmFsdWVzKCkpLmZpbHRlcih0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICh0YXJnZXQuX2lzVGFyZ2V0RXhwb3NlZCgpICYmXG4gICAgICAgICAgICAgICAgdGFyZ2V0Ll9pbml0aWFsaXplZERlZmVycmVkLnZhbHVlKCkgPT09IEluaXRpYWxpemF0aW9uU3RhdHVzLlNVQ0NFU1MpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGFyZ2V0KCkge1xuICAgICAgICBjb25zdCBicm93c2VyVGFyZ2V0ID0gdGhpcy50YXJnZXRzKCkuZmluZCh0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC50eXBlKCkgPT09ICdicm93c2VyJztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghYnJvd3NlclRhcmdldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyIHRhcmdldCBpcyBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnJvd3NlclRhcmdldDtcbiAgICB9XG4gICAgYXN5bmMgdmVyc2lvbigpIHtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IHRoaXMuI2dldFZlcnNpb24oKTtcbiAgICAgICAgcmV0dXJuIHZlcnNpb24ucHJvZHVjdDtcbiAgICB9XG4gICAgYXN5bmMgdXNlckFnZW50KCkge1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgdGhpcy4jZ2V0VmVyc2lvbigpO1xuICAgICAgICByZXR1cm4gdmVyc2lvbi51c2VyQWdlbnQ7XG4gICAgfVxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjbG9zZUNhbGxiYWNrLmNhbGwobnVsbCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuX2RldGFjaCgpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGdldCBjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy4jY29ubmVjdGlvbi5fY2xvc2VkO1xuICAgIH1cbiAgICAjZ2V0VmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnQnJvd3Nlci5nZXRWZXJzaW9uJyk7XG4gICAgfVxuICAgIGdldCBkZWJ1Z0luZm8oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwZW5kaW5nUHJvdG9jb2xFcnJvcnM6IHRoaXMuI2Nvbm5lY3Rpb24uZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCksXG4gICAgICAgIH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3Nlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgZGVidWdFcnJvciwgREVGQVVMVF9WSUVXUE9SVCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IENkcEJyb3dzZXIgfSBmcm9tICcuL0Jyb3dzZXIuanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gJy4vQ29ubmVjdGlvbi5qcyc7XG4vKipcbiAqIFVzZXJzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgZGlyZWN0bHk7IGl0J3MgY2FsbGVkIHdoZW4gY2FsbGluZ1xuICogYHB1cHBldGVlci5jb25uZWN0YCB3aXRoIGBwcm90b2NvbDogJ2NkcCdgLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2Nvbm5lY3RUb0NkcEJyb3dzZXIoY29ubmVjdGlvblRyYW5zcG9ydCwgdXJsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyBpZ25vcmVIVFRQU0Vycm9ycyA9IGZhbHNlLCBkZWZhdWx0Vmlld3BvcnQgPSBERUZBVUxUX1ZJRVdQT1JULCB0YXJnZXRGaWx0ZXIsIF9pc1BhZ2VUYXJnZXQ6IGlzUGFnZVRhcmdldCwgc2xvd01vID0gMCwgcHJvdG9jb2xUaW1lb3V0LCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24odXJsLCBjb25uZWN0aW9uVHJhbnNwb3J0LCBzbG93TW8sIHByb3RvY29sVGltZW91dCk7XG4gICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnQnJvd3Nlci5nZXRWZXJzaW9uJyk7XG4gICAgY29uc3QgcHJvZHVjdCA9IHZlcnNpb24ucHJvZHVjdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdmaXJlZm94JylcbiAgICAgICAgPyAnZmlyZWZveCdcbiAgICAgICAgOiAnY2hyb21lJztcbiAgICBjb25zdCB7IGJyb3dzZXJDb250ZXh0SWRzIH0gPSBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5nZXRCcm93c2VyQ29udGV4dHMnKTtcbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgQ2RwQnJvd3Nlci5fY3JlYXRlKHByb2R1Y3QgfHwgJ2Nocm9tZScsIGNvbm5lY3Rpb24sIGJyb3dzZXJDb250ZXh0SWRzLCBpZ25vcmVIVFRQU0Vycm9ycywgZGVmYXVsdFZpZXdwb3J0LCB1bmRlZmluZWQsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uc2VuZCgnQnJvd3Nlci5jbG9zZScpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgIH0sIHRhcmdldEZpbHRlciwgaXNQYWdlVGFyZ2V0KTtcbiAgICByZXR1cm4gYnJvd3Nlcjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJDb25uZWN0b3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjQgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBXRUJfUEVSTUlTU0lPTl9UT19QUk9UT0NPTF9QRVJNSVNTSU9OLCB9IGZyb20gJy4uL2FwaS9Ccm93c2VyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJDb250ZXh0IH0gZnJvbSAnLi4vYXBpL0Jyb3dzZXJDb250ZXh0LmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBCcm93c2VyQ29udGV4dCBleHRlbmRzIEJyb3dzZXJDb250ZXh0IHtcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjYnJvd3NlcjtcbiAgICAjaWQ7XG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbiwgYnJvd3NlciwgY29udGV4dElkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLiNicm93c2VyID0gYnJvd3NlcjtcbiAgICAgICAgdGhpcy4jaWQgPSBjb250ZXh0SWQ7XG4gICAgfVxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lkO1xuICAgIH1cbiAgICB0YXJnZXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3Nlci50YXJnZXRzKCkuZmlsdGVyKHRhcmdldCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmJyb3dzZXJDb250ZXh0KCkgPT09IHRoaXM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBwYWdlcygpIHtcbiAgICAgICAgY29uc3QgcGFnZXMgPSBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnRhcmdldHMoKVxuICAgICAgICAgICAgLmZpbHRlcih0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICh0YXJnZXQudHlwZSgpID09PSAncGFnZScgfHxcbiAgICAgICAgICAgICAgICAodGFyZ2V0LnR5cGUoKSA9PT0gJ290aGVyJyAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNicm93c2VyLl9nZXRJc1BhZ2VUYXJnZXRDYWxsYmFjaygpPy4odGFyZ2V0KSkpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLm1hcCh0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5wYWdlKCk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgcmV0dXJuIHBhZ2VzLmZpbHRlcigocGFnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICEhcGFnZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlzSW5jb2duaXRvKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLiNpZDtcbiAgICB9XG4gICAgYXN5bmMgb3ZlcnJpZGVQZXJtaXNzaW9ucyhvcmlnaW4sIHBlcm1pc3Npb25zKSB7XG4gICAgICAgIGNvbnN0IHByb3RvY29sUGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucy5tYXAocGVybWlzc2lvbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm90b2NvbFBlcm1pc3Npb24gPSBXRUJfUEVSTUlTU0lPTl9UT19QUk9UT0NPTF9QRVJNSVNTSU9OLmdldChwZXJtaXNzaW9uKTtcbiAgICAgICAgICAgIGlmICghcHJvdG9jb2xQZXJtaXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHBlcm1pc3Npb246ICcgKyBwZXJtaXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm90b2NvbFBlcm1pc3Npb247XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ0Jyb3dzZXIuZ3JhbnRQZXJtaXNzaW9ucycsIHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IHRoaXMuI2lkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBwcm90b2NvbFBlcm1pc3Npb25zLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgY2xlYXJQZXJtaXNzaW9uT3ZlcnJpZGVzKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ0Jyb3dzZXIucmVzZXRQZXJtaXNzaW9ucycsIHtcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IHRoaXMuI2lkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIG5ld1BhZ2UoKSB7XG4gICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgX2d1YXJkID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHRoaXMud2FpdEZvclNjcmVlbnNob3RPcGVyYXRpb25zKCksIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNicm93c2VyLl9jcmVhdGVQYWdlSW5Db250ZXh0KHRoaXMuI2lkKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnJvd3NlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Jyb3dzZXI7XG4gICAgfVxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jaWQsICdOb24taW5jb2duaXRvIHByb2ZpbGVzIGNhbm5vdCBiZSBjbG9zZWQhJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2Jyb3dzZXIuX2Rpc3Bvc2VDb250ZXh0KHRoaXMuI2lkKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyQ29udGV4dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbiwgQ0RQU2Vzc2lvbkV2ZW50LCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IENhbGxiYWNrUmVnaXN0cnkgfSBmcm9tICcuLi9jb21tb24vQ2FsbGJhY2tSZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyBUYXJnZXRDbG9zZUVycm9yIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm90b2NvbEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBDRFBTZXNzaW9uIGV4dGVuZHMgQ0RQU2Vzc2lvbiB7XG4gICAgI3Nlc3Npb25JZDtcbiAgICAjdGFyZ2V0VHlwZTtcbiAgICAjY2FsbGJhY2tzID0gbmV3IENhbGxiYWNrUmVnaXN0cnkoKTtcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjcGFyZW50U2Vzc2lvbklkO1xuICAgICN0YXJnZXQ7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbiwgdGFyZ2V0VHlwZSwgc2Vzc2lvbklkLCBwYXJlbnRTZXNzaW9uSWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIHRoaXMuI3RhcmdldFR5cGUgPSB0YXJnZXRUeXBlO1xuICAgICAgICB0aGlzLiNzZXNzaW9uSWQgPSBzZXNzaW9uSWQ7XG4gICAgICAgIHRoaXMuI3BhcmVudFNlc3Npb25JZCA9IHBhcmVudFNlc3Npb25JZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUge0BsaW5rIENkcFRhcmdldH0gYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3NldFRhcmdldCh0YXJnZXQpIHtcbiAgICAgICAgdGhpcy4jdGFyZ2V0ID0gdGFyZ2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB7QGxpbmsgQ2RwVGFyZ2V0fSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfdGFyZ2V0KCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jdGFyZ2V0LCAnVGFyZ2V0IG11c3QgZXhpc3QnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhcmdldDtcbiAgICB9XG4gICAgY29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Nvbm5lY3Rpb247XG4gICAgfVxuICAgIHBhcmVudFNlc3Npb24oKSB7XG4gICAgICAgIGlmICghdGhpcy4jcGFyZW50U2Vzc2lvbklkKSB7XG4gICAgICAgICAgICAvLyBUbyBtYWtlIGl0IHdvcmsgaW4gRmlyZWZveCB0aGF0IGRvZXMgbm90IGhhdmUgcGFyZW50ICh0YWIpIHNlc3Npb25zLlxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy4jY29ubmVjdGlvbj8uc2Vzc2lvbih0aGlzLiNwYXJlbnRTZXNzaW9uSWQpO1xuICAgICAgICByZXR1cm4gcGFyZW50ID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc2VuZChtZXRob2QsIHBhcmFtcywgb3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuI2Nvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVGFyZ2V0Q2xvc2VFcnJvcihgUHJvdG9jb2wgZXJyb3IgKCR7bWV0aG9kfSk6IFNlc3Npb24gY2xvc2VkLiBNb3N0IGxpa2VseSB0aGUgJHt0aGlzLiN0YXJnZXRUeXBlfSBoYXMgYmVlbiBjbG9zZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNjb25uZWN0aW9uLl9yYXdTZW5kKHRoaXMuI2NhbGxiYWNrcywgbWV0aG9kLCBwYXJhbXMsIHRoaXMuI3Nlc3Npb25JZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbk1lc3NhZ2Uob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QuaWQpIHtcbiAgICAgICAgICAgIGlmIChvYmplY3QuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjYWxsYmFja3MucmVqZWN0KG9iamVjdC5pZCwgY3JlYXRlUHJvdG9jb2xFcnJvck1lc3NhZ2Uob2JqZWN0KSwgb2JqZWN0LmVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY2FsbGJhY2tzLnJlc29sdmUob2JqZWN0LmlkLCBvYmplY3QucmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydCghb2JqZWN0LmlkKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChvYmplY3QubWV0aG9kLCBvYmplY3QucGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXRhY2hlcyB0aGUgY2RwU2Vzc2lvbiBmcm9tIHRoZSB0YXJnZXQuIE9uY2UgZGV0YWNoZWQsIHRoZSBjZHBTZXNzaW9uIG9iamVjdFxuICAgICAqIHdvbid0IGVtaXQgYW55IGV2ZW50cyBhbmQgY2FuJ3QgYmUgdXNlZCB0byBzZW5kIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIGFzeW5jIGRldGFjaCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNjb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlc3Npb24gYWxyZWFkeSBkZXRhY2hlZC4gTW9zdCBsaWtlbHkgdGhlICR7dGhpcy4jdGFyZ2V0VHlwZX0gaGFzIGJlZW4gY2xvc2VkLmApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LmRldGFjaEZyb21UYXJnZXQnLCB7XG4gICAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuI3Nlc3Npb25JZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbkNsb3NlZCgpIHtcbiAgICAgICAgdGhpcy4jY2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZW1pdChDRFBTZXNzaW9uRXZlbnQuRGlzY29ubmVjdGVkLCB1bmRlZmluZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uJ3MgaWQuXG4gICAgICovXG4gICAgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzZXNzaW9uSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldFBlbmRpbmdQcm90b2NvbEVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NhbGxiYWNrcy5nZXRQZW5kaW5nUHJvdG9jb2xFcnJvcnMoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DRFBTZXNzaW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwUHJlbG9hZFNjcmlwdCB7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgSUQgb2YgdGhlIHByZWxvYWQgc2NyaXB0IHJldHVybmVkIGJ5XG4gICAgICogUGFnZS5hZGRTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCBpbiB0aGUgbWFpbiBmcmFtZS5cbiAgICAgKlxuICAgICAqIFN1Yi1mcmFtZXMgd291bGQgZ2V0IGEgZGlmZmVyZW50IENEUCBJRCBiZWNhdXNlXG4gICAgICogYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQgaXMgY2FsbGVkIGZvciBlYWNoIHN1YmZyYW1lLiBCdXRcbiAgICAgKiB1c2VycyBvbmx5IHNlZSB0aGlzIElEIGFuZCBzdWJmcmFtZSBJRHMgYXJlIGludGVybmFsIHRvIFB1cHBldGVlci5cbiAgICAgKi9cbiAgICAjaWQ7XG4gICAgI3NvdXJjZTtcbiAgICAjZnJhbWVUb0lkID0gbmV3IFdlYWtNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihtYWluRnJhbWUsIGlkLCBzb3VyY2UpIHtcbiAgICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICAgICAgdGhpcy4jc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLiNmcmFtZVRvSWQuc2V0KG1haW5GcmFtZSwgaWQpO1xuICAgIH1cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpZDtcbiAgICB9XG4gICAgZ2V0IHNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NvdXJjZTtcbiAgICB9XG4gICAgZ2V0SWRGb3JGcmFtZShmcmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVUb0lkLmdldChmcmFtZSk7XG4gICAgfVxuICAgIHNldElkRm9yRnJhbWUoZnJhbWUsIGlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy4jZnJhbWVUb0lkLnNldChmcmFtZSwgaWRlbnRpZmllcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2RwUHJlbG9hZFNjcmlwdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbiwgQ0RQU2Vzc2lvbkV2ZW50IH0gZnJvbSAnLi4vYXBpL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IENkcFRhcmdldCwgSW5pdGlhbGl6YXRpb25TdGF0dXMgfSBmcm9tICcuL1RhcmdldC5qcyc7XG5mdW5jdGlvbiBpc1BhZ2VUYXJnZXRCZWNvbWluZ1ByaW1hcnkodGFyZ2V0LCBuZXdUYXJnZXRJbmZvKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGFyZ2V0Ll9zdWJ0eXBlKCkpICYmICFuZXdUYXJnZXRJbmZvLnN1YnR5cGU7XG59XG4vKipcbiAqIENocm9tZVRhcmdldE1hbmFnZXIgdXNlcyB0aGUgQ0RQJ3MgYXV0by1hdHRhY2ggbWVjaGFuaXNtIHRvIGludGVyY2VwdFxuICogbmV3IHRhcmdldHMgYW5kIGFsbG93IHRoZSByZXN0IG9mIFB1cHBldGVlciB0byBjb25maWd1cmUgbGlzdGVuZXJzIHdoaWxlXG4gKiB0aGUgdGFyZ2V0IGlzIHBhdXNlZC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENocm9tZVRhcmdldE1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNjb25uZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzOiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnLFxuICAgICAqICdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJywgJ1RhcmdldC50YXJnZXRJbmZvQ2hhbmdlZCcuXG4gICAgICpcbiAgICAgKiBBIHRhcmdldCBiZWNvbWVzIGRpc2NvdmVyZWQgd2hlbiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnIGlzIHJlY2VpdmVkLlxuICAgICAqIEEgdGFyZ2V0IGlzIHJlbW92ZWQgZnJvbSB0aGlzIG1hcCBvbmNlICdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJyBpc1xuICAgICAqIHJlY2VpdmVkLlxuICAgICAqXG4gICAgICogYHRhcmdldEZpbHRlckNhbGxiYWNrYCBoYXMgbm8gZWZmZWN0IG9uIHRoaXMgbWFwLlxuICAgICAqL1xuICAgICNkaXNjb3ZlcmVkVGFyZ2V0c0J5VGFyZ2V0SWQgPSBuZXcgTWFwKCk7XG4gICAgLyoqXG4gICAgICogQSB0YXJnZXQgaXMgYWRkZWQgdG8gdGhpcyBtYXAgb25jZSBDaHJvbWVUYXJnZXRNYW5hZ2VyIGhhcyBjcmVhdGVkXG4gICAgICogYSBUYXJnZXQgYW5kIGF0dGFjaGVkIGF0IGxlYXN0IG9uY2UgdG8gaXQuXG4gICAgICovXG4gICAgI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQgPSBuZXcgTWFwKCk7XG4gICAgLyoqXG4gICAgICogVHJhY2tzIHdoaWNoIHNlc3Npb25zIGF0dGFjaCB0byB3aGljaCB0YXJnZXQuXG4gICAgICovXG4gICAgI2F0dGFjaGVkVGFyZ2V0c0J5U2Vzc2lvbklkID0gbmV3IE1hcCgpO1xuICAgIC8qKlxuICAgICAqIElmIGEgdGFyZ2V0IHdhcyBmaWx0ZXJlZCBvdXQgYnkgYHRhcmdldEZpbHRlckNhbGxiYWNrYCwgd2Ugc3RpbGwgcmVjZWl2ZVxuICAgICAqIGV2ZW50cyBhYm91dCBpdCBmcm9tIENEUCwgYnV0IHdlIGRvbid0IGZvcndhcmQgdGhlbSB0byB0aGUgcmVzdCBvZiBQdXBwZXRlZXIuXG4gICAgICovXG4gICAgI2lnbm9yZWRUYXJnZXRzID0gbmV3IFNldCgpO1xuICAgICN0YXJnZXRGaWx0ZXJDYWxsYmFjaztcbiAgICAjdGFyZ2V0RmFjdG9yeTtcbiAgICAjYXR0YWNoZWRUb1RhcmdldExpc3RlbmVyc0J5U2Vzc2lvbiA9IG5ldyBXZWFrTWFwKCk7XG4gICAgI2RldGFjaGVkRnJvbVRhcmdldExpc3RlbmVyc0J5U2Vzc2lvbiA9IG5ldyBXZWFrTWFwKCk7XG4gICAgI2luaXRpYWxpemVEZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICN0YXJnZXRzSWRzRm9ySW5pdCA9IG5ldyBTZXQoKTtcbiAgICAjd2FpdEZvckluaXRpYWxseURpc2NvdmVyZWRUYXJnZXRzID0gdHJ1ZTtcbiAgICAjZGlzY292ZXJ5RmlsdGVyID0gW3t9XTtcbiAgICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uLCB0YXJnZXRGYWN0b3J5LCB0YXJnZXRGaWx0ZXJDYWxsYmFjaywgd2FpdEZvckluaXRpYWxseURpc2NvdmVyZWRUYXJnZXRzID0gdHJ1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2sgPSB0YXJnZXRGaWx0ZXJDYWxsYmFjaztcbiAgICAgICAgdGhpcy4jdGFyZ2V0RmFjdG9yeSA9IHRhcmdldEZhY3Rvcnk7XG4gICAgICAgIHRoaXMuI3dhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cyA9IHdhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cztcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vbignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKCdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJywgdGhpcy4jb25UYXJnZXREZXN0cm95ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKCdUYXJnZXQudGFyZ2V0SW5mb0NoYW5nZWQnLCB0aGlzLiNvblRhcmdldEluZm9DaGFuZ2VkKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vbihDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCB0aGlzLiNvblNlc3Npb25EZXRhY2hlZCk7XG4gICAgICAgIHRoaXMuI3NldHVwQXR0YWNobWVudExpc3RlbmVycyh0aGlzLiNjb25uZWN0aW9uKTtcbiAgICB9XG4gICAgI3N0b3JlRXhpc3RpbmdUYXJnZXRzRm9ySW5pdCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLiN3YWl0Rm9ySW5pdGlhbGx5RGlzY292ZXJlZFRhcmdldHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFt0YXJnZXRJZCwgdGFyZ2V0SW5mbyxdIG9mIHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEZvckZpbHRlciA9IG5ldyBDZHBUYXJnZXQodGFyZ2V0SW5mbywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRoaXMsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAvLyBUYXJnZXRzIGZyb20gZXh0ZW5zaW9ucyBhbmQgdGhlIGJyb3dzZXIgdGhhdCB3aWxsIG5vdCBiZVxuICAgICAgICAgICAgLy8gYXV0by1hdHRhY2hlZC4gVGhlcmVmb3JlLCB3ZSBzaG91bGQgbm90IGFkZCB0aGVtIHRvXG4gICAgICAgICAgICAvLyAjdGFyZ2V0c0lkc0ZvckluaXQuXG4gICAgICAgICAgICBjb25zdCBza2lwVGFyZ2V0ID0gdGFyZ2V0SW5mby50eXBlID09PSAnYnJvd3NlcicgfHxcbiAgICAgICAgICAgICAgICB0YXJnZXRJbmZvLnVybC5zdGFydHNXaXRoKCdjaHJvbWUtZXh0ZW5zaW9uOi8vJyk7XG4gICAgICAgICAgICBpZiAoKCF0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayB8fFxuICAgICAgICAgICAgICAgIHRoaXMuI3RhcmdldEZpbHRlckNhbGxiYWNrKHRhcmdldEZvckZpbHRlcikpICYmXG4gICAgICAgICAgICAgICAgIXNraXBUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdC5hZGQodGFyZ2V0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBhc3luYyBpbml0aWFsaXplKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5zZXREaXNjb3ZlclRhcmdldHMnLCB7XG4gICAgICAgICAgICBkaXNjb3ZlcjogdHJ1ZSxcbiAgICAgICAgICAgIGZpbHRlcjogdGhpcy4jZGlzY292ZXJ5RmlsdGVyLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jc3RvcmVFeGlzdGluZ1RhcmdldHNGb3JJbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LnNldEF1dG9BdHRhY2gnLCB7XG4gICAgICAgICAgICB3YWl0Rm9yRGVidWdnZXJPblN0YXJ0OiB0cnVlLFxuICAgICAgICAgICAgZmxhdHRlbjogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9BdHRhY2g6IHRydWUsXG4gICAgICAgICAgICBmaWx0ZXI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuI2Rpc2NvdmVyeUZpbHRlcixcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkoKTtcbiAgICAgICAgYXdhaXQgdGhpcy4jaW5pdGlhbGl6ZURlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgIH1cbiAgICBnZXRDaGlsZFRhcmdldHModGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQuX2NoaWxkVGFyZ2V0cygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldERlc3Ryb3llZCcsIHRoaXMuI29uVGFyZ2V0RGVzdHJveWVkKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vZmYoJ1RhcmdldC50YXJnZXRJbmZvQ2hhbmdlZCcsIHRoaXMuI29uVGFyZ2V0SW5mb0NoYW5nZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZihDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCB0aGlzLiNvblNlc3Npb25EZXRhY2hlZCk7XG4gICAgICAgIHRoaXMuI3JlbW92ZUF0dGFjaG1lbnRMaXN0ZW5lcnModGhpcy4jY29ubmVjdGlvbik7XG4gICAgfVxuICAgIGdldEF2YWlsYWJsZVRhcmdldHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkO1xuICAgIH1cbiAgICAjc2V0dXBBdHRhY2htZW50TGlzdGVuZXJzKHNlc3Npb24pIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KHNlc3Npb24sIGV2ZW50KTtcbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSk7XG4gICAgICAgIHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uc2V0KHNlc3Npb24sIGxpc3RlbmVyKTtcbiAgICAgICAgc2Vzc2lvbi5vbignVGFyZ2V0LmF0dGFjaGVkVG9UYXJnZXQnLCBsaXN0ZW5lcik7XG4gICAgICAgIGNvbnN0IGRldGFjaGVkTGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNvbkRldGFjaGVkRnJvbVRhcmdldChzZXNzaW9uLCBldmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIGFzc2VydCghdGhpcy4jZGV0YWNoZWRGcm9tVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSk7XG4gICAgICAgIHRoaXMuI2RldGFjaGVkRnJvbVRhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5zZXQoc2Vzc2lvbiwgZGV0YWNoZWRMaXN0ZW5lcik7XG4gICAgICAgIHNlc3Npb24ub24oJ1RhcmdldC5kZXRhY2hlZEZyb21UYXJnZXQnLCBkZXRhY2hlZExpc3RlbmVyKTtcbiAgICB9XG4gICAgI3JlbW92ZUF0dGFjaG1lbnRMaXN0ZW5lcnMoc2Vzc2lvbikge1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uZ2V0KHNlc3Npb24pO1xuICAgICAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHNlc3Npb24ub2ZmKCdUYXJnZXQuYXR0YWNoZWRUb1RhcmdldCcsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uZGVsZXRlKHNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNkZXRhY2hlZEZyb21UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uaGFzKHNlc3Npb24pKSB7XG4gICAgICAgICAgICBzZXNzaW9uLm9mZignVGFyZ2V0LmRldGFjaGVkRnJvbVRhcmdldCcsIHRoaXMuI2RldGFjaGVkRnJvbVRhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5nZXQoc2Vzc2lvbikpO1xuICAgICAgICAgICAgdGhpcy4jZGV0YWNoZWRGcm9tVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmRlbGV0ZShzZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjb25TZXNzaW9uRGV0YWNoZWQgPSAoc2Vzc2lvbikgPT4ge1xuICAgICAgICB0aGlzLiNyZW1vdmVBdHRhY2htZW50TGlzdGVuZXJzKHNlc3Npb24pO1xuICAgIH07XG4gICAgI29uVGFyZ2V0Q3JlYXRlZCA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLiNkaXNjb3ZlcmVkVGFyZ2V0c0J5VGFyZ2V0SWQuc2V0KGV2ZW50LnRhcmdldEluZm8udGFyZ2V0SWQsIGV2ZW50LnRhcmdldEluZm8pO1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXREaXNjb3ZlcmVkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldERpc2NvdmVyZWQgKi8sIGV2ZW50LnRhcmdldEluZm8pO1xuICAgICAgICAvLyBUaGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZSBicm93c2VyIHRhcmdldCBpbXBsaWNpdGx5LFxuICAgICAgICAvLyB0aGVyZWZvcmUsIG5vIG5ldyBDRFBTZXNzaW9uIGlzIGNyZWF0ZWQgYW5kIHdlIGhhdmUgc3BlY2lhbCBoYW5kbGluZ1xuICAgICAgICAvLyBoZXJlLlxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0SW5mby50eXBlID09PSAnYnJvd3NlcicgJiYgZXZlbnQudGFyZ2V0SW5mby5hdHRhY2hlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuaGFzKGV2ZW50LnRhcmdldEluZm8udGFyZ2V0SWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4jdGFyZ2V0RmFjdG9yeShldmVudC50YXJnZXRJbmZvLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgdGFyZ2V0Ll9pbml0aWFsaXplKCk7XG4gICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLnNldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAjb25UYXJnZXREZXN0cm95ZWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5mbyA9IHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5nZXQoZXZlbnQudGFyZ2V0SWQpO1xuICAgICAgICB0aGlzLiNkaXNjb3ZlcmVkVGFyZ2V0c0J5VGFyZ2V0SWQuZGVsZXRlKGV2ZW50LnRhcmdldElkKTtcbiAgICAgICAgdGhpcy4jZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KGV2ZW50LnRhcmdldElkKTtcbiAgICAgICAgaWYgKHRhcmdldEluZm8/LnR5cGUgPT09ICdzZXJ2aWNlX3dvcmtlcicgJiZcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuaGFzKGV2ZW50LnRhcmdldElkKSkge1xuICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzZXJ2aWNlIHdvcmtlcnM6IHJlcG9ydCBUYXJnZXRHb25lIGV2ZW50IHdoZW5cbiAgICAgICAgICAgIC8vIHRoZSB3b3JrZXIgaXMgZGVzdHJveWVkLlxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4jYXR0YWNoZWRUYXJnZXRzQnlUYXJnZXRJZC5nZXQoZXZlbnQudGFyZ2V0SWQpO1xuICAgICAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldEdvbmVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0R29uZSAqLywgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmRlbGV0ZShldmVudC50YXJnZXRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgICNvblRhcmdldEluZm9DaGFuZ2VkID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5zZXQoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCwgZXZlbnQudGFyZ2V0SW5mbyk7XG4gICAgICAgIGlmICh0aGlzLiNpZ25vcmVkVGFyZ2V0cy5oYXMoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCkgfHxcbiAgICAgICAgICAgICF0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmhhcyhldmVudC50YXJnZXRJbmZvLnRhcmdldElkKSB8fFxuICAgICAgICAgICAgIWV2ZW50LnRhcmdldEluZm8uYXR0YWNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmdldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2aW91c1VSTCA9IHRhcmdldC51cmwoKTtcbiAgICAgICAgY29uc3Qgd2FzSW5pdGlhbGl6ZWQgPSB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQudmFsdWUoKSA9PT0gSW5pdGlhbGl6YXRpb25TdGF0dXMuU1VDQ0VTUztcbiAgICAgICAgaWYgKGlzUGFnZVRhcmdldEJlY29taW5nUHJpbWFyeSh0YXJnZXQsIGV2ZW50LnRhcmdldEluZm8pKSB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gdGFyZ2V0Py5fc2Vzc2lvbigpO1xuICAgICAgICAgICAgYXNzZXJ0KHNlc3Npb24sICdUYXJnZXQgdGhhdCBpcyBiZWluZyBhY3RpdmF0ZWQgaXMgbWlzc2luZyBhIENEUFNlc3Npb24uJyk7XG4gICAgICAgICAgICBzZXNzaW9uLnBhcmVudFNlc3Npb24oKT8uZW1pdChDRFBTZXNzaW9uRXZlbnQuU3dhcHBlZCwgc2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0Ll90YXJnZXRJbmZvQ2hhbmdlZChldmVudC50YXJnZXRJbmZvKTtcbiAgICAgICAgaWYgKHdhc0luaXRpYWxpemVkICYmIHByZXZpb3VzVVJMICE9PSB0YXJnZXQudXJsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldENoYW5nZWRcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0Q2hhbmdlZCAqLywge1xuICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICB3YXNJbml0aWFsaXplZCxcbiAgICAgICAgICAgICAgICBwcmV2aW91c1VSTCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAjb25BdHRhY2hlZFRvVGFyZ2V0ID0gYXN5bmMgKHBhcmVudFNlc3Npb24sIGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZm8gPSBldmVudC50YXJnZXRJbmZvO1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy4jY29ubmVjdGlvbi5zZXNzaW9uKGV2ZW50LnNlc3Npb25JZCk7XG4gICAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXNzaW9uICR7ZXZlbnQuc2Vzc2lvbklkfSB3YXMgbm90IGNyZWF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2lsZW50RGV0YWNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kKCdSdW50aW1lLnJ1bklmV2FpdGluZ0ZvckRlYnVnZ2VyJykuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCB1c2UgYHNlc3Npb24uZGV0YWNoKClgIGJlY2F1c2UgdGhhdCBkaXNwYXRjaGVzIGFsbCBjb21tYW5kcyBvblxuICAgICAgICAgICAgLy8gdGhlIGNvbm5lY3Rpb24gaW5zdGVhZCBvZiB0aGUgcGFyZW50IHNlc3Npb24uXG4gICAgICAgICAgICBhd2FpdCBwYXJlbnRTZXNzaW9uXG4gICAgICAgICAgICAgICAgLnNlbmQoJ1RhcmdldC5kZXRhY2hGcm9tVGFyZ2V0Jywge1xuICAgICAgICAgICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbi5pZCgpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGlmICghdGhpcy4jY29ubmVjdGlvbi5pc0F1dG9BdHRhY2hlZCh0YXJnZXRJbmZvLnRhcmdldElkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3Igc2VydmljZSB3b3JrZXJzOiBiZWluZyBhdHRhY2hlZCB0byBzZXJ2aWNlIHdvcmtlcnMgd2lsbFxuICAgICAgICAvLyBwcmV2ZW50IHRoZW0gZnJvbSBldmVyIGJlaW5nIGRlc3Ryb3llZC4gVGhlcmVmb3JlLCB3ZSBzaWxlbnRseSBkZXRhY2hcbiAgICAgICAgLy8gZnJvbSBzZXJ2aWNlIHdvcmtlcnMgdW5sZXNzIHRoZSBjb25uZWN0aW9uIHdhcyBtYW51YWxseSBjcmVhdGVkIHZpYVxuICAgICAgICAvLyBgcGFnZS53b3JrZXIoKWAuIFRvIGRldGVybWluZSB0aGlzLCB3ZSB1c2VcbiAgICAgICAgLy8gYHRoaXMuI2Nvbm5lY3Rpb24uaXNBdXRvQXR0YWNoZWQodGFyZ2V0SW5mby50YXJnZXRJZClgLiBJbiB0aGUgZnV0dXJlLCB3ZVxuICAgICAgICAvLyBzaG91bGQgZGV0ZXJtaW5lIGlmIGEgdGFyZ2V0IGlzIGF1dG8tYXR0YWNoZWQgb3Igbm90IHdpdGggdGhlIGhlbHAgb2ZcbiAgICAgICAgLy8gQ0RQLlxuICAgICAgICBpZiAodGFyZ2V0SW5mby50eXBlID09PSAnc2VydmljZV93b3JrZXInKSB7XG4gICAgICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgICAgICBhd2FpdCBzaWxlbnREZXRhY2goKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmhhcyh0YXJnZXRJbmZvLnRhcmdldElkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI3RhcmdldEZhY3RvcnkodGFyZ2V0SW5mbyk7XG4gICAgICAgICAgICB0YXJnZXQuX2luaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuc2V0KHRhcmdldEluZm8udGFyZ2V0SWQsIHRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0YXJnZXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzRXhpc3RpbmdUYXJnZXQgPSB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmhhcyh0YXJnZXRJbmZvLnRhcmdldElkKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNFeGlzdGluZ1RhcmdldFxuICAgICAgICAgICAgPyB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmdldCh0YXJnZXRJbmZvLnRhcmdldElkKVxuICAgICAgICAgICAgOiB0aGlzLiN0YXJnZXRGYWN0b3J5KHRhcmdldEluZm8sIHNlc3Npb24sIHBhcmVudFNlc3Npb24gaW5zdGFuY2VvZiBDRFBTZXNzaW9uID8gcGFyZW50U2Vzc2lvbiA6IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayAmJiAhdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2sodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhpcy4jaWdub3JlZFRhcmdldHMuYWRkKHRhcmdldEluZm8udGFyZ2V0SWQpO1xuICAgICAgICAgICAgdGhpcy4jZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KHRhcmdldEluZm8udGFyZ2V0SWQpO1xuICAgICAgICAgICAgYXdhaXQgc2lsZW50RGV0YWNoKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc2V0dXBBdHRhY2htZW50TGlzdGVuZXJzKHNlc3Npb24pO1xuICAgICAgICBpZiAoaXNFeGlzdGluZ1RhcmdldCkge1xuICAgICAgICAgICAgc2Vzc2lvbi5fc2V0VGFyZ2V0KHRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVNlc3Npb25JZC5zZXQoc2Vzc2lvbi5pZCgpLCB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmdldCh0YXJnZXRJbmZvLnRhcmdldElkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXQuX2luaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuc2V0KHRhcmdldEluZm8udGFyZ2V0SWQsIHRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVNlc3Npb25JZC5zZXQoc2Vzc2lvbi5pZCgpLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudFRhcmdldCA9IHBhcmVudFNlc3Npb24gaW5zdGFuY2VvZiBDRFBTZXNzaW9uXG4gICAgICAgICAgICA/IHBhcmVudFNlc3Npb24uX3RhcmdldCgpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIHBhcmVudFRhcmdldD8uX2FkZENoaWxkVGFyZ2V0KHRhcmdldCk7XG4gICAgICAgIHBhcmVudFNlc3Npb24uZW1pdChDRFBTZXNzaW9uRXZlbnQuUmVhZHksIHNlc3Npb24pO1xuICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdC5kZWxldGUodGFyZ2V0Ll90YXJnZXRJZCk7XG4gICAgICAgIGlmICghaXNFeGlzdGluZ1RhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwidGFyZ2V0QXZhaWxhYmxlXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldEF2YWlsYWJsZSAqLywgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkoKTtcbiAgICAgICAgLy8gVE9ETzogdGhlIGJyb3dzZXIgbWlnaHQgYmUgc2h1dHRpbmcgZG93biBoZXJlLiBXaGF0IGRvIHdlIGRvIHdpdGggdGhlXG4gICAgICAgIC8vIGVycm9yP1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICBzZXNzaW9uLnNlbmQoJ1RhcmdldC5zZXRBdXRvQXR0YWNoJywge1xuICAgICAgICAgICAgICAgIHdhaXRGb3JEZWJ1Z2dlck9uU3RhcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZmxhdHRlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhdXRvQXR0YWNoOiB0cnVlLFxuICAgICAgICAgICAgICAgIGZpbHRlcjogdGhpcy4jZGlzY292ZXJ5RmlsdGVyLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzZXNzaW9uLnNlbmQoJ1J1bnRpbWUucnVuSWZXYWl0aW5nRm9yRGVidWdnZXInKSxcbiAgICAgICAgXSkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgfTtcbiAgICAjZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KHRhcmdldElkKSB7XG4gICAgICAgIHRhcmdldElkICE9PSB1bmRlZmluZWQgJiYgdGhpcy4jdGFyZ2V0c0lkc0ZvckluaXQuZGVsZXRlKHRhcmdldElkKTtcbiAgICAgICAgaWYgKHRoaXMuI3RhcmdldHNJZHNGb3JJbml0LnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uRGV0YWNoZWRGcm9tVGFyZ2V0ID0gKHBhcmVudFNlc3Npb24sIGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5U2Vzc2lvbklkLmdldChldmVudC5zZXNzaW9uSWQpO1xuICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVNlc3Npb25JZC5kZWxldGUoZXZlbnQuc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50U2Vzc2lvbiBpbnN0YW5jZW9mIENEUFNlc3Npb24pIHtcbiAgICAgICAgICAgIHBhcmVudFNlc3Npb24uX3RhcmdldCgpLl9yZW1vdmVDaGlsZFRhcmdldCh0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuZGVsZXRlKHRhcmdldC5fdGFyZ2V0SWQpO1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRHb25lXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldEdvbmUgKi8sIHRhcmdldCk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNocm9tZVRhcmdldE1hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IENEUFNlc3Npb25FdmVudCwgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBDYWxsYmFja1JlZ2lzdHJ5IH0gZnJvbSAnLi4vY29tbW9uL0NhbGxiYWNrUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuLi9jb21tb24vRGVidWcuanMnO1xuaW1wb3J0IHsgVGFyZ2V0Q2xvc2VFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm90b2NvbEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IENkcENEUFNlc3Npb24gfSBmcm9tICcuL0NEUFNlc3Npb24uanMnO1xuY29uc3QgZGVidWdQcm90b2NvbFNlbmQgPSBkZWJ1ZygncHVwcGV0ZWVyOnByb3RvY29sOlNFTkQg4pa6Jyk7XG5jb25zdCBkZWJ1Z1Byb3RvY29sUmVjZWl2ZSA9IGRlYnVnKCdwdXBwZXRlZXI6cHJvdG9jb2w6UkVDViDil4AnKTtcbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgI3VybDtcbiAgICAjdHJhbnNwb3J0O1xuICAgICNkZWxheTtcbiAgICAjdGltZW91dDtcbiAgICAjc2Vzc2lvbnMgPSBuZXcgTWFwKCk7XG4gICAgI2Nsb3NlZCA9IGZhbHNlO1xuICAgICNtYW51YWxseUF0dGFjaGVkID0gbmV3IFNldCgpO1xuICAgICNjYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tSZWdpc3RyeSgpO1xuICAgIGNvbnN0cnVjdG9yKHVybCwgdHJhbnNwb3J0LCBkZWxheSA9IDAsIHRpbWVvdXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jdXJsID0gdXJsO1xuICAgICAgICB0aGlzLiNkZWxheSA9IGRlbGF5O1xuICAgICAgICB0aGlzLiN0aW1lb3V0ID0gdGltZW91dCA/PyAxODBfMDAwO1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgICAgIHRoaXMuI3RyYW5zcG9ydC5vbm1lc3NhZ2UgPSB0aGlzLm9uTWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQub25jbG9zZSA9IHRoaXMuI29uQ2xvc2UuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21TZXNzaW9uKHNlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHNlc3Npb24uY29ubmVjdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgZGVsYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWxheTtcbiAgICB9XG4gICAgZ2V0IHRpbWVvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0aW1lb3V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgX2Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Nsb3NlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0IF9zZXNzaW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Nlc3Npb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIC0gVGhlIHNlc3Npb24gaWRcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBDRFAgc2Vzc2lvbiBpZiBpdCBleGlzdHNcbiAgICAgKi9cbiAgICBzZXNzaW9uKHNlc3Npb25JZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCkgfHwgbnVsbDtcbiAgICB9XG4gICAgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdXJsO1xuICAgIH1cbiAgICBzZW5kKG1ldGhvZCwgcGFyYW1zLCBvcHRpb25zKSB7XG4gICAgICAgIC8vIFRoZXJlIGlzIG9ubHkgZXZlciAxIHBhcmFtIGFyZyBwYXNzZWQsIGJ1dCB0aGUgUHJvdG9jb2wgZGVmaW5lcyBpdCBhcyBhblxuICAgICAgICAvLyBhcnJheSBvZiAwIG9yIDEgaXRlbXMgU2VlIHRoaXMgY29tbWVudDpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0Nocm9tZURldlRvb2xzL2RldnRvb2xzLXByb3RvY29sL3B1bGwvMTEzI2lzc3VlY29tbWVudC00MTI2MDMyODVcbiAgICAgICAgLy8gd2hpY2ggZXhwbGFpbnMgd2h5IHRoZSBwcm90b2NvbCBkZWZpbmVzIHRoZSBwYXJhbXMgdGhpcyB3YXkgZm9yIGJldHRlclxuICAgICAgICAvLyB0eXBlLWluZmVyZW5jZS5cbiAgICAgICAgLy8gU28gbm93IHdlIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcGFyYW1zIG9yIG5vdCBhbmQgZGVhbCB3aXRoIHRoZW0gYWNjb3JkaW5nbHkuXG4gICAgICAgIHJldHVybiB0aGlzLl9yYXdTZW5kKHRoaXMuI2NhbGxiYWNrcywgbWV0aG9kLCBwYXJhbXMsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9yYXdTZW5kKGNhbGxiYWNrcywgbWV0aG9kLCBwYXJhbXMsIHNlc3Npb25JZCwgb3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy4jY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdQcm90b2NvbCBlcnJvcjogQ29ubmVjdGlvbiBjbG9zZWQuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFja3MuY3JlYXRlKG1ldGhvZCwgb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLiN0aW1lb3V0LCBpZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHJpbmdpZmllZE1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlYnVnUHJvdG9jb2xTZW5kKHN0cmluZ2lmaWVkTWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLiN0cmFuc3BvcnQuc2VuZChzdHJpbmdpZmllZE1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmQoJ0Jyb3dzZXIuY2xvc2UnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgb25NZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RlbGF5KSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChyLCB0aGlzLiNkZWxheSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1Z1Byb3RvY29sUmVjZWl2ZShtZXNzYWdlKTtcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gSlNPTi5wYXJzZShtZXNzYWdlKTtcbiAgICAgICAgaWYgKG9iamVjdC5tZXRob2QgPT09ICdUYXJnZXQuYXR0YWNoZWRUb1RhcmdldCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IG9iamVjdC5wYXJhbXMuc2Vzc2lvbklkO1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBDZHBDRFBTZXNzaW9uKHRoaXMsIG9iamVjdC5wYXJhbXMudGFyZ2V0SW5mby50eXBlLCBzZXNzaW9uSWQsIG9iamVjdC5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgdGhpcy4jc2Vzc2lvbnMuc2V0KHNlc3Npb25JZCwgc2Vzc2lvbik7XG4gICAgICAgICAgICB0aGlzLmVtaXQoQ0RQU2Vzc2lvbkV2ZW50LlNlc3Npb25BdHRhY2hlZCwgc2Vzc2lvbik7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRTZXNzaW9uID0gdGhpcy4jc2Vzc2lvbnMuZ2V0KG9iamVjdC5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgaWYgKHBhcmVudFNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRTZXNzaW9uLmVtaXQoQ0RQU2Vzc2lvbkV2ZW50LlNlc3Npb25BdHRhY2hlZCwgc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob2JqZWN0Lm1ldGhvZCA9PT0gJ1RhcmdldC5kZXRhY2hlZEZyb21UYXJnZXQnKSB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy4jc2Vzc2lvbnMuZ2V0KG9iamVjdC5wYXJhbXMuc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5fb25DbG9zZWQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNzZXNzaW9ucy5kZWxldGUob2JqZWN0LnBhcmFtcy5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRTZXNzaW9uID0gdGhpcy4jc2Vzc2lvbnMuZ2V0KG9iamVjdC5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRTZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFNlc3Npb24uZW1pdChDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdC5zZXNzaW9uSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLiNzZXNzaW9ucy5nZXQob2JqZWN0LnNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgIHNlc3Npb24uX29uTWVzc2FnZShvYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9iamVjdC5pZCkge1xuICAgICAgICAgICAgaWYgKG9iamVjdC5lcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NhbGxiYWNrcy5yZWplY3Qob2JqZWN0LmlkLCBjcmVhdGVQcm90b2NvbEVycm9yTWVzc2FnZShvYmplY3QpLCBvYmplY3QuZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjYWxsYmFja3MucmVzb2x2ZShvYmplY3QuaWQsIG9iamVjdC5yZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KG9iamVjdC5tZXRob2QsIG9iamVjdC5wYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNvbkNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy4jY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9ubWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9uY2xvc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuI2NhbGxiYWNrcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IHNlc3Npb24gb2YgdGhpcy4jc2Vzc2lvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHNlc3Npb24uX29uQ2xvc2VkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc2Vzc2lvbnMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbWl0KENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuI29uQ2xvc2UoKTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGlzQXV0b0F0dGFjaGVkKHRhcmdldElkKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy4jbWFudWFsbHlBdHRhY2hlZC5oYXModGFyZ2V0SWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBfY3JlYXRlU2Vzc2lvbih0YXJnZXRJbmZvLCBpc0F1dG9BdHRhY2hFbXVsYXRlZCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCFpc0F1dG9BdHRhY2hFbXVsYXRlZCkge1xuICAgICAgICAgICAgdGhpcy4jbWFudWFsbHlBdHRhY2hlZC5hZGQodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzZXNzaW9uSWQgfSA9IGF3YWl0IHRoaXMuc2VuZCgnVGFyZ2V0LmF0dGFjaFRvVGFyZ2V0Jywge1xuICAgICAgICAgICAgdGFyZ2V0SWQ6IHRhcmdldEluZm8udGFyZ2V0SWQsXG4gICAgICAgICAgICBmbGF0dGVuOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jbWFudWFsbHlBdHRhY2hlZC5kZWxldGUodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLiNzZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NEUFNlc3Npb24gY3JlYXRpb24gZmFpbGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGFyZ2V0SW5mbyAtIFRoZSB0YXJnZXQgaW5mb1xuICAgICAqIEByZXR1cm5zIFRoZSBDRFAgc2Vzc2lvbiB0aGF0IGlzIGNyZWF0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTZXNzaW9uKHRhcmdldEluZm8pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NyZWF0ZVNlc3Npb24odGFyZ2V0SW5mbywgZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRQZW5kaW5nUHJvdG9jb2xFcnJvcnMoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLiNjYWxsYmFja3MuZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCkpO1xuICAgICAgICBmb3IgKGNvbnN0IHNlc3Npb24gb2YgdGhpcy4jc2Vzc2lvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnNlc3Npb24uZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGFyZ2V0Q2xvc2VkRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRDbG9zZUVycm9yO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yLCBQdXBwZXRlZXJVUkwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2sgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuLyoqXG4gKiBUaGUgQ292ZXJhZ2UgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0byBnYXRoZXIgaW5mb3JtYXRpb24gYWJvdXQgcGFydHMgb2ZcbiAqIEphdmFTY3JpcHQgYW5kIENTUyB0aGF0IHdlcmUgdXNlZCBieSB0aGUgcGFnZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogVG8gb3V0cHV0IGNvdmVyYWdlIGluIGEgZm9ybSBjb25zdW1hYmxlIGJ5IHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vaXN0YW5idWxqcyB8IElzdGFuYnVsfSxcbiAqIHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2lzdGFuYnVsanMvcHVwcGV0ZWVyLXRvLWlzdGFuYnVsIHwgcHVwcGV0ZWVyLXRvLWlzdGFuYnVsfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogQW4gZXhhbXBsZSBvZiB1c2luZyBKYXZhU2NyaXB0IGFuZCBDU1MgY292ZXJhZ2UgdG8gZ2V0IHBlcmNlbnRhZ2Ugb2YgaW5pdGlhbGx5XG4gKiBleGVjdXRlZCBjb2RlOlxuICpcbiAqIGBgYHRzXG4gKiAvLyBFbmFibGUgYm90aCBKYXZhU2NyaXB0IGFuZCBDU1MgY292ZXJhZ2VcbiAqIGF3YWl0IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS5jb3ZlcmFnZS5zdGFydEpTQ292ZXJhZ2UoKSxcbiAqICAgcGFnZS5jb3ZlcmFnZS5zdGFydENTU0NvdmVyYWdlKCksXG4gKiBdKTtcbiAqIC8vIE5hdmlnYXRlIHRvIHBhZ2VcbiAqIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICogLy8gRGlzYWJsZSBib3RoIEphdmFTY3JpcHQgYW5kIENTUyBjb3ZlcmFnZVxuICogY29uc3QgW2pzQ292ZXJhZ2UsIGNzc0NvdmVyYWdlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS5jb3ZlcmFnZS5zdG9wSlNDb3ZlcmFnZSgpLFxuICogICBwYWdlLmNvdmVyYWdlLnN0b3BDU1NDb3ZlcmFnZSgpLFxuICogXSk7XG4gKiBsZXQgdG90YWxCeXRlcyA9IDA7XG4gKiBsZXQgdXNlZEJ5dGVzID0gMDtcbiAqIGNvbnN0IGNvdmVyYWdlID0gWy4uLmpzQ292ZXJhZ2UsIC4uLmNzc0NvdmVyYWdlXTtcbiAqIGZvciAoY29uc3QgZW50cnkgb2YgY292ZXJhZ2UpIHtcbiAqICAgdG90YWxCeXRlcyArPSBlbnRyeS50ZXh0Lmxlbmd0aDtcbiAqICAgZm9yIChjb25zdCByYW5nZSBvZiBlbnRyeS5yYW5nZXMpIHVzZWRCeXRlcyArPSByYW5nZS5lbmQgLSByYW5nZS5zdGFydCAtIDE7XG4gKiB9XG4gKiBjb25zb2xlLmxvZyhgQnl0ZXMgdXNlZDogJHsodXNlZEJ5dGVzIC8gdG90YWxCeXRlcykgKiAxMDB9JWApO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQ292ZXJhZ2Uge1xuICAgICNqc0NvdmVyYWdlO1xuICAgICNjc3NDb3ZlcmFnZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy4janNDb3ZlcmFnZSA9IG5ldyBKU0NvdmVyYWdlKGNsaWVudCk7XG4gICAgICAgIHRoaXMuI2Nzc0NvdmVyYWdlID0gbmV3IENTU0NvdmVyYWdlKGNsaWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHVwZGF0ZUNsaWVudChjbGllbnQpIHtcbiAgICAgICAgdGhpcy4janNDb3ZlcmFnZS51cGRhdGVDbGllbnQoY2xpZW50KTtcbiAgICAgICAgdGhpcy4jY3NzQ292ZXJhZ2UudXBkYXRlQ2xpZW50KGNsaWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gU2V0IG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zIGZvciBjb3ZlcmFnZSBkZWZhdWx0cyB0b1xuICAgICAqIGByZXNldE9uTmF2aWdhdGlvbiA6IHRydWUsIHJlcG9ydEFub255bW91c1NjcmlwdHMgOiBmYWxzZSxgXG4gICAgICogYGluY2x1ZGVSYXdTY3JpcHRDb3ZlcmFnZSA6IGZhbHNlLCB1c2VCbG9ja0NvdmVyYWdlIDogdHJ1ZWBcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjb3ZlcmFnZSBpcyBzdGFydGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbm9ueW1vdXMgc2NyaXB0cyBhcmUgb25lcyB0aGF0IGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCB1cmwuIFRoZXNlIGFyZVxuICAgICAqIHNjcmlwdHMgdGhhdCBhcmUgZHluYW1pY2FsbHkgY3JlYXRlZCBvbiB0aGUgcGFnZSB1c2luZyBgZXZhbGAgb3JcbiAgICAgKiBgbmV3IEZ1bmN0aW9uYC4gSWYgYHJlcG9ydEFub255bW91c1NjcmlwdHNgIGlzIHNldCB0byBgdHJ1ZWAsIGFub255bW91c1xuICAgICAqIHNjcmlwdHMgVVJMIHdpbGwgc3RhcnQgd2l0aCBgZGVidWdnZXI6Ly9WTWAgKHVubGVzcyBhIG1hZ2ljIC8vIyBzb3VyY2VVUkxcbiAgICAgKiBjb21tZW50IGlzIHByZXNlbnQsIGluIHdoaWNoIGNhc2UgdGhhdCB3aWxsIHRoZSBiZSBVUkwpLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YXJ0SlNDb3ZlcmFnZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2pzQ292ZXJhZ2Uuc3RhcnQob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgY292ZXJhZ2UgcmVwb3J0cyBmb3JcbiAgICAgKiBhbGwgc2NyaXB0cy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSmF2YVNjcmlwdCBDb3ZlcmFnZSBkb2Vzbid0IGluY2x1ZGUgYW5vbnltb3VzIHNjcmlwdHMgYnkgZGVmYXVsdC5cbiAgICAgKiBIb3dldmVyLCBzY3JpcHRzIHdpdGggc291cmNlVVJMcyBhcmUgcmVwb3J0ZWQuXG4gICAgICovXG4gICAgYXN5bmMgc3RvcEpTQ292ZXJhZ2UoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNqc0NvdmVyYWdlLnN0b3AoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTZXQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMgZm9yIGNvdmVyYWdlLCBkZWZhdWx0cyB0b1xuICAgICAqIGByZXNldE9uTmF2aWdhdGlvbiA6IHRydWVgXG4gICAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gY292ZXJhZ2UgaXMgc3RhcnRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBzdGFydENTU0NvdmVyYWdlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jY3NzQ292ZXJhZ2Uuc3RhcnQob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgY292ZXJhZ2UgcmVwb3J0c1xuICAgICAqIGZvciBhbGwgc3R5bGVzaGVldHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIENTUyBDb3ZlcmFnZSBkb2Vzbid0IGluY2x1ZGUgZHluYW1pY2FsbHkgaW5qZWN0ZWQgc3R5bGUgdGFnc1xuICAgICAqIHdpdGhvdXQgc291cmNlVVJMcy5cbiAgICAgKi9cbiAgICBhc3luYyBzdG9wQ1NTQ292ZXJhZ2UoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjc3NDb3ZlcmFnZS5zdG9wKCk7XG4gICAgfVxufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBKU0NvdmVyYWdlIHtcbiAgICAjY2xpZW50O1xuICAgICNlbmFibGVkID0gZmFsc2U7XG4gICAgI3NjcmlwdFVSTHMgPSBuZXcgTWFwKCk7XG4gICAgI3NjcmlwdFNvdXJjZXMgPSBuZXcgTWFwKCk7XG4gICAgI3N1YnNjcmlwdGlvbnM7XG4gICAgI3Jlc2V0T25OYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgI3JlcG9ydEFub255bW91c1NjcmlwdHMgPSBmYWxzZTtcbiAgICAjaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdXBkYXRlQ2xpZW50KGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIGFzeW5jIHN0YXJ0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2VuYWJsZWQsICdKU0NvdmVyYWdlIGlzIGFscmVhZHkgZW5hYmxlZCcpO1xuICAgICAgICBjb25zdCB7IHJlc2V0T25OYXZpZ2F0aW9uID0gdHJ1ZSwgcmVwb3J0QW5vbnltb3VzU2NyaXB0cyA9IGZhbHNlLCBpbmNsdWRlUmF3U2NyaXB0Q292ZXJhZ2UgPSBmYWxzZSwgdXNlQmxvY2tDb3ZlcmFnZSA9IHRydWUsIH0gPSBvcHRpb25zO1xuICAgICAgICB0aGlzLiNyZXNldE9uTmF2aWdhdGlvbiA9IHJlc2V0T25OYXZpZ2F0aW9uO1xuICAgICAgICB0aGlzLiNyZXBvcnRBbm9ueW1vdXNTY3JpcHRzID0gcmVwb3J0QW5vbnltb3VzU2NyaXB0cztcbiAgICAgICAgdGhpcy4jaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlID0gaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlO1xuICAgICAgICB0aGlzLiNlbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jc2NyaXB0VVJMcy5jbGVhcigpO1xuICAgICAgICB0aGlzLiNzY3JpcHRTb3VyY2VzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbnMgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgICAgIGNvbnN0IGNsaWVudEVtaXR0ZXIgPSB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRFbWl0dGVyKHRoaXMuI2NsaWVudCkpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdEZWJ1Z2dlci5zY3JpcHRQYXJzZWQnLCB0aGlzLiNvblNjcmlwdFBhcnNlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgY2xpZW50RW1pdHRlci5vbignUnVudGltZS5leGVjdXRpb25Db250ZXh0c0NsZWFyZWQnLCB0aGlzLiNvbkV4ZWN1dGlvbkNvbnRleHRzQ2xlYXJlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1Byb2ZpbGVyLmVuYWJsZScpLFxuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1Byb2ZpbGVyLnN0YXJ0UHJlY2lzZUNvdmVyYWdlJywge1xuICAgICAgICAgICAgICAgIGNhbGxDb3VudDogdGhpcy4jaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlLFxuICAgICAgICAgICAgICAgIGRldGFpbGVkOiB1c2VCbG9ja0NvdmVyYWdlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnRGVidWdnZXIuZW5hYmxlJyksXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnRGVidWdnZXIuc2V0U2tpcEFsbFBhdXNlcycsIHsgc2tpcDogdHJ1ZSB9KSxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgICNvbkV4ZWN1dGlvbkNvbnRleHRzQ2xlYXJlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNyZXNldE9uTmF2aWdhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3NjcmlwdFVSTHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy4jc2NyaXB0U291cmNlcy5jbGVhcigpO1xuICAgIH1cbiAgICBhc3luYyAjb25TY3JpcHRQYXJzZWQoZXZlbnQpIHtcbiAgICAgICAgLy8gSWdub3JlIHB1cHBldGVlci1pbmplY3RlZCBzY3JpcHRzXG4gICAgICAgIGlmIChQdXBwZXRlZXJVUkwuaXNQdXBwZXRlZXJVUkwoZXZlbnQudXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElnbm9yZSBvdGhlciBhbm9ueW1vdXMgc2NyaXB0cyB1bmxlc3MgdGhlIHJlcG9ydEFub255bW91c1NjcmlwdHMgb3B0aW9uIGlzIHRydWUuXG4gICAgICAgIGlmICghZXZlbnQudXJsICYmICF0aGlzLiNyZXBvcnRBbm9ueW1vdXNTY3JpcHRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ0RlYnVnZ2VyLmdldFNjcmlwdFNvdXJjZScsIHtcbiAgICAgICAgICAgICAgICBzY3JpcHRJZDogZXZlbnQuc2NyaXB0SWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuI3NjcmlwdFVSTHMuc2V0KGV2ZW50LnNjcmlwdElkLCBldmVudC51cmwpO1xuICAgICAgICAgICAgdGhpcy4jc2NyaXB0U291cmNlcy5zZXQoZXZlbnQuc2NyaXB0SWQsIHJlc3BvbnNlLnNjcmlwdFNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IGhhcHBlbiBpZiB0aGUgcGFnZSBoYXMgYWxyZWFkeSBuYXZpZ2F0ZWQgYXdheS5cbiAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHN0b3AoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLiNlbmFibGVkLCAnSlNDb3ZlcmFnZSBpcyBub3QgZW5hYmxlZCcpO1xuICAgICAgICB0aGlzLiNlbmFibGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdQcm9maWxlci50YWtlUHJlY2lzZUNvdmVyYWdlJyksXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnUHJvZmlsZXIuc3RvcFByZWNpc2VDb3ZlcmFnZScpLFxuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1Byb2ZpbGVyLmRpc2FibGUnKSxcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdEZWJ1Z2dlci5kaXNhYmxlJyksXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zPy5kaXNwb3NlKCk7XG4gICAgICAgIGNvbnN0IGNvdmVyYWdlID0gW107XG4gICAgICAgIGNvbnN0IHByb2ZpbGVSZXNwb25zZSA9IHJlc3VsdFswXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBwcm9maWxlUmVzcG9uc2UucmVzdWx0KSB7XG4gICAgICAgICAgICBsZXQgdXJsID0gdGhpcy4jc2NyaXB0VVJMcy5nZXQoZW50cnkuc2NyaXB0SWQpO1xuICAgICAgICAgICAgaWYgKCF1cmwgJiYgdGhpcy4jcmVwb3J0QW5vbnltb3VzU2NyaXB0cykge1xuICAgICAgICAgICAgICAgIHVybCA9ICdkZWJ1Z2dlcjovL1ZNJyArIGVudHJ5LnNjcmlwdElkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuI3NjcmlwdFNvdXJjZXMuZ2V0KGVudHJ5LnNjcmlwdElkKTtcbiAgICAgICAgICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQgfHwgdXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5SYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZnVuYyBvZiBlbnRyeS5mdW5jdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBmbGF0dGVuUmFuZ2VzLnB1c2goLi4uZnVuYy5yYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmFuZ2VzID0gY29udmVydFRvRGlzam9pbnRSYW5nZXMoZmxhdHRlblJhbmdlcyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI2luY2x1ZGVSYXdTY3JpcHRDb3ZlcmFnZSkge1xuICAgICAgICAgICAgICAgIGNvdmVyYWdlLnB1c2goeyB1cmwsIHJhbmdlcywgdGV4dCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvdmVyYWdlLnB1c2goeyB1cmwsIHJhbmdlcywgdGV4dCwgcmF3U2NyaXB0Q292ZXJhZ2U6IGVudHJ5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3ZlcmFnZTtcbiAgICB9XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIENTU0NvdmVyYWdlIHtcbiAgICAjY2xpZW50O1xuICAgICNlbmFibGVkID0gZmFsc2U7XG4gICAgI3N0eWxlc2hlZXRVUkxzID0gbmV3IE1hcCgpO1xuICAgICNzdHlsZXNoZWV0U291cmNlcyA9IG5ldyBNYXAoKTtcbiAgICAjZXZlbnRMaXN0ZW5lcnM7XG4gICAgI3Jlc2V0T25OYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdXBkYXRlQ2xpZW50KGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIGFzeW5jIHN0YXJ0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2VuYWJsZWQsICdDU1NDb3ZlcmFnZSBpcyBhbHJlYWR5IGVuYWJsZWQnKTtcbiAgICAgICAgY29uc3QgeyByZXNldE9uTmF2aWdhdGlvbiA9IHRydWUgfSA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuI3Jlc2V0T25OYXZpZ2F0aW9uID0gcmVzZXRPbk5hdmlnYXRpb247XG4gICAgICAgIHRoaXMuI2VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLiNzdHlsZXNoZWV0VVJMcy5jbGVhcigpO1xuICAgICAgICB0aGlzLiNzdHlsZXNoZWV0U291cmNlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLiNldmVudExpc3RlbmVycyA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTtcbiAgICAgICAgY29uc3QgY2xpZW50RW1pdHRlciA9IHRoaXMuI2V2ZW50TGlzdGVuZXJzLnVzZShuZXcgRXZlbnRFbWl0dGVyKHRoaXMuI2NsaWVudCkpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdDU1Muc3R5bGVTaGVldEFkZGVkJywgdGhpcy4jb25TdHlsZVNoZWV0LmJpbmQodGhpcykpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHRzQ2xlYXJlZCcsIHRoaXMuI29uRXhlY3V0aW9uQ29udGV4dHNDbGVhcmVkLmJpbmQodGhpcykpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnRE9NLmVuYWJsZScpLFxuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ0NTUy5lbmFibGUnKSxcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdDU1Muc3RhcnRSdWxlVXNhZ2VUcmFja2luZycpLFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgI29uRXhlY3V0aW9uQ29udGV4dHNDbGVhcmVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuI3Jlc2V0T25OYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc3R5bGVzaGVldFVSTHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy4jc3R5bGVzaGVldFNvdXJjZXMuY2xlYXIoKTtcbiAgICB9XG4gICAgYXN5bmMgI29uU3R5bGVTaGVldChldmVudCkge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBldmVudC5oZWFkZXI7XG4gICAgICAgIC8vIElnbm9yZSBhbm9ueW1vdXMgc2NyaXB0c1xuICAgICAgICBpZiAoIWhlYWRlci5zb3VyY2VVUkwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnQ1NTLmdldFN0eWxlU2hlZXRUZXh0Jywge1xuICAgICAgICAgICAgICAgIHN0eWxlU2hlZXRJZDogaGVhZGVyLnN0eWxlU2hlZXRJZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy4jc3R5bGVzaGVldFVSTHMuc2V0KGhlYWRlci5zdHlsZVNoZWV0SWQsIGhlYWRlci5zb3VyY2VVUkwpO1xuICAgICAgICAgICAgdGhpcy4jc3R5bGVzaGVldFNvdXJjZXMuc2V0KGhlYWRlci5zdHlsZVNoZWV0SWQsIHJlc3BvbnNlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gVGhpcyBtaWdodCBoYXBwZW4gaWYgdGhlIHBhZ2UgaGFzIGFscmVhZHkgbmF2aWdhdGVkIGF3YXkuXG4gICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBzdG9wKCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jZW5hYmxlZCwgJ0NTU0NvdmVyYWdlIGlzIG5vdCBlbmFibGVkJyk7XG4gICAgICAgIHRoaXMuI2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcnVsZVRyYWNraW5nUmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnQ1NTLnN0b3BSdWxlVXNhZ2VUcmFja2luZycpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnQ1NTLmRpc2FibGUnKSxcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdET00uZGlzYWJsZScpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy4jZXZlbnRMaXN0ZW5lcnM/LmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gYWdncmVnYXRlIGJ5IHN0eWxlU2hlZXRJZFxuICAgICAgICBjb25zdCBzdHlsZVNoZWV0SWRUb0NvdmVyYWdlID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJ1bGVUcmFja2luZ1Jlc3BvbnNlLnJ1bGVVc2FnZSkge1xuICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHN0eWxlU2hlZXRJZFRvQ292ZXJhZ2UuZ2V0KGVudHJ5LnN0eWxlU2hlZXRJZCk7XG4gICAgICAgICAgICBpZiAoIXJhbmdlcykge1xuICAgICAgICAgICAgICAgIHJhbmdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHN0eWxlU2hlZXRJZFRvQ292ZXJhZ2Uuc2V0KGVudHJ5LnN0eWxlU2hlZXRJZCwgcmFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdGFydE9mZnNldDogZW50cnkuc3RhcnRPZmZzZXQsXG4gICAgICAgICAgICAgICAgZW5kT2Zmc2V0OiBlbnRyeS5lbmRPZmZzZXQsXG4gICAgICAgICAgICAgICAgY291bnQ6IGVudHJ5LnVzZWQgPyAxIDogMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvdmVyYWdlID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgc3R5bGVTaGVldElkIG9mIHRoaXMuI3N0eWxlc2hlZXRVUkxzLmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy4jc3R5bGVzaGVldFVSTHMuZ2V0KHN0eWxlU2hlZXRJZCk7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIHVybCAhPT0gJ3VuZGVmaW5lZCcsIGBTdHlsZXNoZWV0IFVSTCBpcyB1bmRlZmluZWQgKHN0eWxlU2hlZXRJZD0ke3N0eWxlU2hlZXRJZH0pYCk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy4jc3R5bGVzaGVldFNvdXJjZXMuZ2V0KHN0eWxlU2hlZXRJZCk7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIHRleHQgIT09ICd1bmRlZmluZWQnLCBgU3R5bGVzaGVldCB0ZXh0IGlzIHVuZGVmaW5lZCAoc3R5bGVTaGVldElkPSR7c3R5bGVTaGVldElkfSlgKTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlcyA9IGNvbnZlcnRUb0Rpc2pvaW50UmFuZ2VzKHN0eWxlU2hlZXRJZFRvQ292ZXJhZ2UuZ2V0KHN0eWxlU2hlZXRJZCkgfHwgW10pO1xuICAgICAgICAgICAgY292ZXJhZ2UucHVzaCh7IHVybCwgcmFuZ2VzLCB0ZXh0IH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3ZlcmFnZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb252ZXJ0VG9EaXNqb2ludFJhbmdlcyhuZXN0ZWRSYW5nZXMpIHtcbiAgICBjb25zdCBwb2ludHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIG5lc3RlZFJhbmdlcykge1xuICAgICAgICBwb2ludHMucHVzaCh7IG9mZnNldDogcmFuZ2Uuc3RhcnRPZmZzZXQsIHR5cGU6IDAsIHJhbmdlIH0pO1xuICAgICAgICBwb2ludHMucHVzaCh7IG9mZnNldDogcmFuZ2UuZW5kT2Zmc2V0LCB0eXBlOiAxLCByYW5nZSB9KTtcbiAgICB9XG4gICAgLy8gU29ydCBwb2ludHMgdG8gZm9ybSBhIHZhbGlkIHBhcmVudGhlc2lzIHNlcXVlbmNlLlxuICAgIHBvaW50cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIFNvcnQgd2l0aCBpbmNyZWFzaW5nIG9mZnNldHMuXG4gICAgICAgIGlmIChhLm9mZnNldCAhPT0gYi5vZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBhLm9mZnNldCAtIGIub2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsbCBcImVuZFwiIHBvaW50cyBzaG91bGQgZ28gYmVmb3JlIFwic3RhcnRcIiBwb2ludHMuXG4gICAgICAgIGlmIChhLnR5cGUgIT09IGIudHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGIudHlwZSAtIGEudHlwZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhTGVuZ3RoID0gYS5yYW5nZS5lbmRPZmZzZXQgLSBhLnJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgICAgICBjb25zdCBiTGVuZ3RoID0gYi5yYW5nZS5lbmRPZmZzZXQgLSBiLnJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgICAgICAvLyBGb3IgdHdvIFwic3RhcnRcIiBwb2ludHMsIHRoZSBvbmUgd2l0aCBsb25nZXIgcmFuZ2UgZ29lcyBmaXJzdC5cbiAgICAgICAgaWYgKGEudHlwZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJMZW5ndGggLSBhTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvciB0d28gXCJlbmRcIiBwb2ludHMsIHRoZSBvbmUgd2l0aCBzaG9ydGVyIHJhbmdlIGdvZXMgZmlyc3QuXG4gICAgICAgIHJldHVybiBhTGVuZ3RoIC0gYkxlbmd0aDtcbiAgICB9KTtcbiAgICBjb25zdCBoaXRDb3VudFN0YWNrID0gW107XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgIGxldCBsYXN0T2Zmc2V0ID0gMDtcbiAgICAvLyBSdW4gc2Nhbm5pbmcgbGluZSB0byBpbnRlcnNlY3QgYWxsIHJhbmdlcy5cbiAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHBvaW50cykge1xuICAgICAgICBpZiAoaGl0Q291bnRTdGFjay5sZW5ndGggJiZcbiAgICAgICAgICAgIGxhc3RPZmZzZXQgPCBwb2ludC5vZmZzZXQgJiZcbiAgICAgICAgICAgIGhpdENvdW50U3RhY2tbaGl0Q291bnRTdGFjay5sZW5ndGggLSAxXSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RSZXN1bHQgPSByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAobGFzdFJlc3VsdCAmJiBsYXN0UmVzdWx0LmVuZCA9PT0gbGFzdE9mZnNldCkge1xuICAgICAgICAgICAgICAgIGxhc3RSZXN1bHQuZW5kID0gcG9pbnQub2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgc3RhcnQ6IGxhc3RPZmZzZXQsIGVuZDogcG9pbnQub2Zmc2V0IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxhc3RPZmZzZXQgPSBwb2ludC5vZmZzZXQ7XG4gICAgICAgIGlmIChwb2ludC50eXBlID09PSAwKSB7XG4gICAgICAgICAgICBoaXRDb3VudFN0YWNrLnB1c2gocG9pbnQucmFuZ2UuY291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGl0Q291bnRTdGFjay5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBGaWx0ZXIgb3V0IGVtcHR5IHJhbmdlcy5cbiAgICByZXR1cm4gcmVzdWx0cy5maWx0ZXIocmFuZ2UgPT4ge1xuICAgICAgICByZXR1cm4gcmFuZ2UuZW5kIC0gcmFuZ2Uuc3RhcnQgPiAwO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q292ZXJhZ2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi4vdXRpbC9EZWZlcnJlZC5qcyc7XG4vKipcbiAqIERldmljZSBpbiBhIHJlcXVlc3QgcHJvbXB0LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERldmljZVJlcXVlc3RQcm9tcHREZXZpY2Uge1xuICAgIC8qKlxuICAgICAqIERldmljZSBpZCBkdXJpbmcgYSBwcm9tcHQuXG4gICAgICovXG4gICAgaWQ7XG4gICAgLyoqXG4gICAgICogRGV2aWNlIG5hbWUgYXMgaXQgYXBwZWFycyBpbiBhIHByb21wdC5cbiAgICAgKi9cbiAgICBuYW1lO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlkLCBuYW1lKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB9XG59XG4vKipcbiAqIERldmljZSByZXF1ZXN0IHByb21wdHMgbGV0IHlvdSByZXNwb25kIHRvIHRoZSBwYWdlIHJlcXVlc3RpbmcgZm9yIGEgZGV2aWNlXG4gKiB0aHJvdWdoIGFuIEFQSSBsaWtlIFdlYkJsdWV0b290aC5cbiAqXG4gKiBAcmVtYXJrc1xuICogYERldmljZVJlcXVlc3RQcm9tcHRgIGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgdmlhIHRoZVxuICoge0BsaW5rIFBhZ2Uud2FpdEZvckRldmljZVByb21wdH0gbWV0aG9kLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IFtkZXZpY2VSZXF1ZXN0XSA9IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS53YWl0Rm9yRGV2aWNlUHJvbXB0KCksXG4gKiAgIHBhZ2UuY2xpY2soJyNjb25uZWN0LWJsdWV0b290aCcpLFxuICogXSk7XG4gKiBhd2FpdCBkZXZpY2VQcm9tcHQuc2VsZWN0KFxuICogICBhd2FpdCBkZXZpY2VQcm9tcHQud2FpdEZvckRldmljZSgoe25hbWV9KSA9PiBuYW1lLmluY2x1ZGVzKCdNeSBEZXZpY2UnKSlcbiAqICk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXZpY2VSZXF1ZXN0UHJvbXB0IHtcbiAgICAjY2xpZW50O1xuICAgICN0aW1lb3V0U2V0dGluZ3M7XG4gICAgI2lkO1xuICAgICNoYW5kbGVkID0gZmFsc2U7XG4gICAgI3VwZGF0ZURldmljZXNIYW5kbGUgPSB0aGlzLiN1cGRhdGVEZXZpY2VzLmJpbmQodGhpcyk7XG4gICAgI3dhaXRGb3JEZXZpY2VQcm9taXNlcyA9IG5ldyBTZXQoKTtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGxpc3Qgb2Ygc2VsZWN0YWJsZSBkZXZpY2VzLlxuICAgICAqL1xuICAgIGRldmljZXMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIHRpbWVvdXRTZXR0aW5ncywgZmlyc3RFdmVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3RpbWVvdXRTZXR0aW5ncyA9IHRpbWVvdXRTZXR0aW5ncztcbiAgICAgICAgdGhpcy4jaWQgPSBmaXJzdEV2ZW50LmlkO1xuICAgICAgICB0aGlzLiNjbGllbnQub24oJ0RldmljZUFjY2Vzcy5kZXZpY2VSZXF1ZXN0UHJvbXB0ZWQnLCB0aGlzLiN1cGRhdGVEZXZpY2VzSGFuZGxlKTtcbiAgICAgICAgdGhpcy4jY2xpZW50Lm9uKCdUYXJnZXQuZGV0YWNoZWRGcm9tVGFyZ2V0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jY2xpZW50ID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI3VwZGF0ZURldmljZXMoZmlyc3RFdmVudCk7XG4gICAgfVxuICAgICN1cGRhdGVEZXZpY2VzKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5pZCAhPT0gdGhpcy4jaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJhd0RldmljZSBvZiBldmVudC5kZXZpY2VzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZXZpY2VzLnNvbWUoZGV2aWNlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLmlkID09PSByYXdEZXZpY2UuaWQ7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3RGV2aWNlID0gbmV3IERldmljZVJlcXVlc3RQcm9tcHREZXZpY2UocmF3RGV2aWNlLmlkLCByYXdEZXZpY2UubmFtZSk7XG4gICAgICAgICAgICB0aGlzLmRldmljZXMucHVzaChuZXdEZXZpY2UpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB3YWl0Rm9yRGV2aWNlUHJvbWlzZSBvZiB0aGlzLiN3YWl0Rm9yRGV2aWNlUHJvbWlzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAod2FpdEZvckRldmljZVByb21pc2UuZmlsdGVyKG5ld0RldmljZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FpdEZvckRldmljZVByb21pc2UucHJvbWlzZS5yZXNvbHZlKG5ld0RldmljZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgdG8gdGhlIGZpcnN0IGRldmljZSBpbiB0aGUgcHJvbXB0IG1hdGNoaW5nIGEgZmlsdGVyLlxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JEZXZpY2UoZmlsdGVyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXZpY2Ugb2YgdGhpcy5kZXZpY2VzKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyKGRldmljZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdGltZW91dCA9IHRoaXMuI3RpbWVvdXRTZXR0aW5ncy50aW1lb3V0KCkgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBXYWl0aW5nIGZvciBcXGBEZXZpY2VSZXF1ZXN0UHJvbXB0RGV2aWNlXFxgIGZhaWxlZDogJHt0aW1lb3V0fW1zIGV4Y2VlZGVkYCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBoYW5kbGUgPSB7IGZpbHRlciwgcHJvbWlzZTogZGVmZXJyZWQgfTtcbiAgICAgICAgdGhpcy4jd2FpdEZvckRldmljZVByb21pc2VzLmFkZChoYW5kbGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy4jd2FpdEZvckRldmljZVByb21pc2VzLmRlbGV0ZShoYW5kbGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBhIGRldmljZSBpbiB0aGUgcHJvbXB0J3MgbGlzdC5cbiAgICAgKi9cbiAgICBhc3luYyBzZWxlY3QoZGV2aWNlKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLiNjbGllbnQgIT09IG51bGwsICdDYW5ub3Qgc2VsZWN0IGRldmljZSB0aHJvdWdoIGRldGFjaGVkIHNlc3Npb24hJyk7XG4gICAgICAgIGFzc2VydCh0aGlzLmRldmljZXMuaW5jbHVkZXMoZGV2aWNlKSwgJ0Nhbm5vdCBzZWxlY3QgdW5rbm93biBkZXZpY2UhJyk7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBzZWxlY3QgRGV2aWNlUmVxdWVzdFByb21wdCB3aGljaCBpcyBhbHJlYWR5IGhhbmRsZWQhJyk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vZmYoJ0RldmljZUFjY2Vzcy5kZXZpY2VSZXF1ZXN0UHJvbXB0ZWQnLCB0aGlzLiN1cGRhdGVEZXZpY2VzSGFuZGxlKTtcbiAgICAgICAgdGhpcy4jaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnRGV2aWNlQWNjZXNzLnNlbGVjdFByb21wdCcsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLiNpZCxcbiAgICAgICAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgdGhlIHByb21wdC5cbiAgICAgKi9cbiAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLiNjbGllbnQgIT09IG51bGwsICdDYW5ub3QgY2FuY2VsIHByb21wdCB0aHJvdWdoIGRldGFjaGVkIHNlc3Npb24hJyk7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBjYW5jZWwgRGV2aWNlUmVxdWVzdFByb21wdCB3aGljaCBpcyBhbHJlYWR5IGhhbmRsZWQhJyk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vZmYoJ0RldmljZUFjY2Vzcy5kZXZpY2VSZXF1ZXN0UHJvbXB0ZWQnLCB0aGlzLiN1cGRhdGVEZXZpY2VzSGFuZGxlKTtcbiAgICAgICAgdGhpcy4jaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnRGV2aWNlQWNjZXNzLmNhbmNlbFByb21wdCcsIHsgaWQ6IHRoaXMuI2lkIH0pO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXZpY2VSZXF1ZXN0UHJvbXB0TWFuYWdlciB7XG4gICAgI2NsaWVudDtcbiAgICAjdGltZW91dFNldHRpbmdzO1xuICAgICNkZXZpY2VSZXF1ZXN0UHJvbXBEZWZlcnJlZHMgPSBuZXcgU2V0KCk7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2xpZW50LCB0aW1lb3V0U2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB0aGlzLiN0aW1lb3V0U2V0dGluZ3MgPSB0aW1lb3V0U2V0dGluZ3M7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbignRGV2aWNlQWNjZXNzLmRldmljZVJlcXVlc3RQcm9tcHRlZCcsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuI29uRGV2aWNlUmVxdWVzdFByb21wdGVkKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbignVGFyZ2V0LmRldGFjaGVkRnJvbVRhcmdldCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudCA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXYWl0IGZvciBkZXZpY2UgcHJvbXB0IGNyZWF0ZWQgYnkgYW4gYWN0aW9uIGxpa2UgY2FsbGluZyBXZWJCbHVldG9vdGgnc1xuICAgICAqIHJlcXVlc3REZXZpY2UuXG4gICAgICovXG4gICAgYXN5bmMgd2FpdEZvckRldmljZVByb21wdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuI2NsaWVudCAhPT0gbnVsbCwgJ0Nhbm5vdCB3YWl0IGZvciBkZXZpY2UgcHJvbXB0IHRocm91Z2ggZGV0YWNoZWQgc2Vzc2lvbiEnKTtcbiAgICAgICAgY29uc3QgbmVlZHNFbmFibGUgPSB0aGlzLiNkZXZpY2VSZXF1ZXN0UHJvbXBEZWZlcnJlZHMuc2l6ZSA9PT0gMDtcbiAgICAgICAgbGV0IGVuYWJsZVByb21pc2U7XG4gICAgICAgIGlmIChuZWVkc0VuYWJsZSkge1xuICAgICAgICAgICAgZW5hYmxlUHJvbWlzZSA9IHRoaXMuI2NsaWVudC5zZW5kKCdEZXZpY2VBY2Nlc3MuZW5hYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0aW1lb3V0ID0gdGhpcy4jdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoe1xuICAgICAgICAgICAgbWVzc2FnZTogYFdhaXRpbmcgZm9yIFxcYERldmljZVJlcXVlc3RQcm9tcHRcXGAgZmFpbGVkOiAke3RpbWVvdXR9bXMgZXhjZWVkZWRgLFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQudmFsdWVPclRocm93KCksXG4gICAgICAgICAgICAgICAgZW5hYmxlUHJvbWlzZSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgICNvbkRldmljZVJlcXVlc3RQcm9tcHRlZChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5zaXplKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHRoaXMuI2NsaWVudCAhPT0gbnVsbCk7XG4gICAgICAgIGNvbnN0IGRldmljZVByb21wdCA9IG5ldyBEZXZpY2VSZXF1ZXN0UHJvbXB0KHRoaXMuI2NsaWVudCwgdGhpcy4jdGltZW91dFNldHRpbmdzLCBldmVudCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiB0aGlzLiNkZXZpY2VSZXF1ZXN0UHJvbXBEZWZlcnJlZHMpIHtcbiAgICAgICAgICAgIHByb21pc2UucmVzb2x2ZShkZXZpY2VQcm9tcHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5jbGVhcigpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURldmljZVJlcXVlc3RQcm9tcHQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IERpYWxvZyB9IGZyb20gJy4uL2FwaS9EaWFsb2cuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENkcERpYWxvZyBleHRlbmRzIERpYWxvZyB7XG4gICAgI2NsaWVudDtcbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIHR5cGUsIG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSA9ICcnKSB7XG4gICAgICAgIHN1cGVyKHR5cGUsIG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgYXN5bmMgaGFuZGxlKG9wdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ1BhZ2UuaGFuZGxlSmF2YVNjcmlwdERpYWxvZycsIHtcbiAgICAgICAgICAgIGFjY2VwdDogb3B0aW9ucy5hY2NlcHQsXG4gICAgICAgICAgICBwcm9tcHRUZXh0OiBvcHRpb25zLnRleHQsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpYWxvZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fcnVuSW5pdGlhbGl6ZXJzID0gKHRoaXMgJiYgdGhpcy5fX3J1bkluaXRpYWxpemVycykgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcbnZhciBfX2VzRGVjb3JhdGUgPSAodGhpcyAmJiB0aGlzLl9fZXNEZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gICAgZG9uZSA9IHRydWU7XG59O1xuaW1wb3J0IHsgRWxlbWVudEhhbmRsZSB9IGZyb20gJy4uL2FwaS9FbGVtZW50SGFuZGxlLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBBc3luY0l0ZXJhYmxlVXRpbCB9IGZyb20gJy4uL3V0aWwvQXN5bmNJdGVyYWJsZVV0aWwuanMnO1xuaW1wb3J0IHsgdGhyb3dJZkRpc3Bvc2VkIH0gZnJvbSAnLi4vdXRpbC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENkcEpTSGFuZGxlIH0gZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG5jb25zdCBOT05fRUxFTUVOVF9OT0RFX1JPTEVTID0gbmV3IFNldChbJ1N0YXRpY1RleHQnLCAnSW5saW5lVGV4dEJveCddKTtcbi8qKlxuICogVGhlIENkcEVsZW1lbnRIYW5kbGUgZXh0ZW5kcyBFbGVtZW50SGFuZGxlIG5vdyB0byBrZWVwIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggYGluc3RhbmNlb2ZgIGJlY2F1c2Ugb2YgdGhhdCB3ZSBuZWVkIHRvIGhhdmUgbWV0aG9kcyBmb3JcbiAqIENkcEpTSGFuZGxlIHRvIGluIHRoaXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xubGV0IENkcEVsZW1lbnRIYW5kbGUgPSAoKCkgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgbGV0IF9jbGFzc1N1cGVyID0gRWxlbWVudEhhbmRsZTtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX2NvbnRlbnRGcmFtZV9kZWNvcmF0b3JzO1xuICAgIGxldCBfc2Nyb2xsSW50b1ZpZXdfZGVjb3JhdG9ycztcbiAgICBsZXQgX3VwbG9hZEZpbGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX2F1dG9maWxsX2RlY29yYXRvcnM7XG4gICAgcmV0dXJuIGNsYXNzIENkcEVsZW1lbnRIYW5kbGUgZXh0ZW5kcyBfY2xhc3NTdXBlciB7XG4gICAgICAgIHN0YXRpYyB7XG4gICAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwO1xuICAgICAgICAgICAgX2NvbnRlbnRGcmFtZV9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpXTtcbiAgICAgICAgICAgIF9zY3JvbGxJbnRvVmlld19kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX2EgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfYSldO1xuICAgICAgICAgICAgX3VwbG9hZEZpbGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9iID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2IpXTtcbiAgICAgICAgICAgIF9hdXRvZmlsbF9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpXTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfY29udGVudEZyYW1lX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJjb250ZW50RnJhbWVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImNvbnRlbnRGcmFtZVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmNvbnRlbnRGcmFtZSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2Nyb2xsSW50b1ZpZXdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInNjcm9sbEludG9WaWV3XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzY3JvbGxJbnRvVmlld1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNjcm9sbEludG9WaWV3IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF91cGxvYWRGaWxlX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJ1cGxvYWRGaWxlXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ1cGxvYWRGaWxlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudXBsb2FkRmlsZSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfYXV0b2ZpbGxfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImF1dG9maWxsXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJhdXRvZmlsbFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmF1dG9maWxsIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0cnVjdG9yKHdvcmxkLCByZW1vdGVPYmplY3QpIHtcbiAgICAgICAgICAgIHN1cGVyKG5ldyBDZHBKU0hhbmRsZSh3b3JsZCwgcmVtb3RlT2JqZWN0KSk7XG4gICAgICAgICAgICBfX3J1bkluaXRpYWxpemVycyh0aGlzLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHJlYWxtKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLnJlYWxtO1xuICAgICAgICB9XG4gICAgICAgIGdldCBjbGllbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGUuY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIHJlbW90ZU9iamVjdCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZS5yZW1vdGVPYmplY3QoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI2ZyYW1lTWFuYWdlcigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZyYW1lLl9mcmFtZU1hbmFnZXI7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGZyYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhbG0uZW52aXJvbm1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgY29udGVudEZyYW1lKCkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUluZm8gPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uZGVzY3JpYmVOb2RlJywge1xuICAgICAgICAgICAgICAgIG9iamVjdElkOiB0aGlzLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGVJbmZvLm5vZGUuZnJhbWVJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNmcmFtZU1hbmFnZXIuZnJhbWUobm9kZUluZm8ubm9kZS5mcmFtZUlkKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBzY3JvbGxJbnRvVmlldygpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0Q29ubmVjdGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byBFbGVtZW50LnNjcm9sbEludG9WaWV3IGlmIERPTS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkIGlzIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICBhd2FpdCBzdXBlci5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHVwbG9hZEZpbGUoLi4uZmlsZVBhdGhzKSB7XG4gICAgICAgICAgICBjb25zdCBpc011bHRpcGxlID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5tdWx0aXBsZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXNzZXJ0KGZpbGVQYXRocy5sZW5ndGggPD0gMSB8fCBpc011bHRpcGxlLCAnTXVsdGlwbGUgZmlsZSB1cGxvYWRzIG9ubHkgd29yayB3aXRoIDxpbnB1dCB0eXBlPWZpbGUgbXVsdGlwbGU+Jyk7XG4gICAgICAgICAgICAvLyBMb2NhdGUgYWxsIGZpbGVzIGFuZCBjb25maXJtIHRoYXQgdGhleSBleGlzdC5cbiAgICAgICAgICAgIGxldCBwYXRoO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXRoID0gYXdhaXQgaW1wb3J0KCdwYXRoJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBKU0hhbmRsZSN1cGxvYWRGaWxlIGNhbiBvbmx5IGJlIHVzZWQgaW4gTm9kZS1saWtlIGVudmlyb25tZW50cy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGZpbGVQYXRocy5tYXAoZmlsZVBhdGggPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoLndpbjMyLmlzQWJzb2x1dGUoZmlsZVBhdGgpIHx8IHBhdGgucG9zaXguaXNBYnNvbHV0ZShmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSB6ZXJvLWxlbmd0aCBhcnJheSBpcyBhIHNwZWNpYWwgY2FzZSwgaXQgc2VlbXMgdGhhdFxuICAgICAgICAgICAgICogRE9NLnNldEZpbGVJbnB1dEZpbGVzIGRvZXMgbm90IGFjdHVhbGx5IHVwZGF0ZSB0aGUgZmlsZXMgaW4gdGhhdCBjYXNlLCBzb1xuICAgICAgICAgICAgICogdGhlIHNvbHV0aW9uIGlzIHRvIGV2YWwgdGhlIGVsZW1lbnQgdmFsdWUgdG8gYSBuZXcgRmlsZUxpc3QgZGlyZWN0bHkuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBYWFg6IFRoZXNlIGV2ZW50cyBzaG91bGQgY29udmVydGVkIHRvIHRydXN0ZWQgZXZlbnRzLiBQZXJoYXBzIGRvIHRoaXNcbiAgICAgICAgICAgICAgICAvLyBpbiBgRE9NLnNldEZpbGVJbnB1dEZpbGVzYD9cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZpbGVzID0gbmV3IERhdGFUcmFuc2ZlcigpLmZpbGVzO1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaCBldmVudHMgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIGl0IHNob3VsZCBiZWhhdmUgYWtpbiB0byBhIHVzZXIgYWN0aW9uLlxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgbm9kZTogeyBiYWNrZW5kTm9kZUlkIH0sIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uZGVzY3JpYmVOb2RlJywge1xuICAgICAgICAgICAgICAgIG9iamVjdElkOiB0aGlzLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uc2V0RmlsZUlucHV0RmlsZXMnLCB7XG4gICAgICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZmlsZXMsXG4gICAgICAgICAgICAgICAgYmFja2VuZE5vZGVJZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGF1dG9maWxsKGRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJbmZvID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnRE9NLmRlc2NyaWJlTm9kZScsIHtcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5oYW5kbGUuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkSWQgPSBub2RlSW5mby5ub2RlLmJhY2tlbmROb2RlSWQ7XG4gICAgICAgICAgICBjb25zdCBmcmFtZUlkID0gdGhpcy5mcmFtZS5faWQ7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdBdXRvZmlsbC50cmlnZ2VyJywge1xuICAgICAgICAgICAgICAgIGZpZWxkSWQsXG4gICAgICAgICAgICAgICAgZnJhbWVJZCxcbiAgICAgICAgICAgICAgICBjYXJkOiBkYXRhLmNyZWRpdENhcmQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyAqcXVlcnlBWFRyZWUobmFtZSwgcm9sZSkge1xuICAgICAgICAgICAgY29uc3QgeyBub2RlcyB9ID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnQWNjZXNzaWJpbGl0eS5xdWVyeUFYVHJlZScsIHtcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBhY2Nlc3NpYmxlTmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gbm9kZXMuZmlsdGVyKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmlnbm9yZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUucm9sZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChOT05fRUxFTUVOVF9OT0RFX1JPTEVTLmhhcyhub2RlLnJvbGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogQXN5bmNJdGVyYWJsZVV0aWwubWFwKHJlc3VsdHMsIG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWxtLmFkb3B0QmFja2VuZE5vZGUobm9kZS5iYWNrZW5kRE9NTm9kZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5leHBvcnQgeyBDZHBFbGVtZW50SGFuZGxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbGVtZW50SGFuZGxlLmpzLm1hcCIsInZhciBfX3J1bkluaXRpYWxpemVycyA9ICh0aGlzICYmIHRoaXMuX19ydW5Jbml0aWFsaXplcnMpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG52YXIgX19lc0RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2VzRGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICAgIGRvbmUgPSB0cnVlO1xufTtcbnZhciBfX3NldEZ1bmN0aW9uTmFtZSA9ICh0aGlzICYmIHRoaXMuX19zZXRGdW5jdGlvbk5hbWUpIHx8IGZ1bmN0aW9uIChmLCBuYW1lLCBwcmVmaXgpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbkV2ZW50IH0gZnJvbSAnLi4vYXBpL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IGludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHMgfSBmcm9tICcuLi91dGlsL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRW11bGF0ZWRTdGF0ZSB7XG4gICAgI3N0YXRlO1xuICAgICNjbGllbnRQcm92aWRlcjtcbiAgICAjdXBkYXRlcjtcbiAgICBjb25zdHJ1Y3Rvcihpbml0aWFsU3RhdGUsIGNsaWVudFByb3ZpZGVyLCB1cGRhdGVyKSB7XG4gICAgICAgIHRoaXMuI3N0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgICAgICB0aGlzLiNjbGllbnRQcm92aWRlciA9IGNsaWVudFByb3ZpZGVyO1xuICAgICAgICB0aGlzLiN1cGRhdGVyID0gdXBkYXRlcjtcbiAgICAgICAgdGhpcy4jY2xpZW50UHJvdmlkZXIucmVnaXN0ZXJTdGF0ZSh0aGlzKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0U3RhdGUoc3RhdGUpIHtcbiAgICAgICAgdGhpcy4jc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gICAgfVxuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3N0YXRlO1xuICAgIH1cbiAgICBhc3luYyBzeW5jKCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLiNjbGllbnRQcm92aWRlci5jbGllbnRzKCkubWFwKGNsaWVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jdXBkYXRlcihjbGllbnQsIHRoaXMuI3N0YXRlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBFbXVsYXRpb25NYW5hZ2VyID0gKCgpID0+IHtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX3ByaXZhdGVfYXBwbHlWaWV3cG9ydF9kZWNvcmF0b3JzO1xuICAgIGxldCBfcHJpdmF0ZV9hcHBseVZpZXdwb3J0X2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVJZGxlU3RhdGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfZW11bGF0ZUlkbGVTdGF0ZV9kZXNjcmlwdG9yO1xuICAgIGxldCBfcHJpdmF0ZV9lbXVsYXRlVGltZXpvbmVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVWaXNpb25EZWZpY2llbmN5X2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVWaXNpb25EZWZpY2llbmN5X2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVNZWRpYUZlYXR1cmVzX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVNZWRpYUZlYXR1cmVzX2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVNZWRpYVR5cGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfZW11bGF0ZU1lZGlhVHlwZV9kZXNjcmlwdG9yO1xuICAgIGxldCBfcHJpdmF0ZV9zZXRHZW9sb2NhdGlvbl9kZWNvcmF0b3JzO1xuICAgIGxldCBfcHJpdmF0ZV9zZXRHZW9sb2NhdGlvbl9kZXNjcmlwdG9yO1xuICAgIGxldCBfcHJpdmF0ZV9zZXREZWZhdWx0QmFja2dyb3VuZENvbG9yX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX3NldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3JfZGVzY3JpcHRvcjtcbiAgICBsZXQgX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVzY3JpcHRvcjtcbiAgICByZXR1cm4gY2xhc3MgRW11bGF0aW9uTWFuYWdlciB7XG4gICAgICAgIHN0YXRpYyB7XG4gICAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9wcml2YXRlX2FwcGx5Vmlld3BvcnRfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX2VtdWxhdGVJZGxlU3RhdGVfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX2VtdWxhdGVUaW1lem9uZV9kZWNvcmF0b3JzID0gW2ludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHNdO1xuICAgICAgICAgICAgX3ByaXZhdGVfZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2RlY29yYXRvcnMgPSBbaW52b2tlQXRNb3N0T25jZUZvckFyZ3VtZW50c107XG4gICAgICAgICAgICBfcHJpdmF0ZV9lbXVsYXRlTWVkaWFGZWF0dXJlc19kZWNvcmF0b3JzID0gW2ludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHNdO1xuICAgICAgICAgICAgX3ByaXZhdGVfZW11bGF0ZU1lZGlhVHlwZV9kZWNvcmF0b3JzID0gW2ludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHNdO1xuICAgICAgICAgICAgX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX3NldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3JfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX3NldEphdmFTY3JpcHRFbmFibGVkX2RlY29yYXRvcnMgPSBbaW52b2tlQXRNb3N0T25jZUZvckFyZ3VtZW50c107XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfYXBwbHlWaWV3cG9ydF9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZpZXdwb3J0U3RhdGUudmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2VuZCgnRW11bGF0aW9uLmNsZWFyRGV2aWNlTWV0cmljc092ZXJyaWRlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRUb3VjaEVtdWxhdGlvbkVuYWJsZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB2aWV3cG9ydCB9ID0gdmlld3BvcnRTdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9iaWxlID0gdmlld3BvcnQuaXNNb2JpbGUgfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gdmlld3BvcnQud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHZpZXdwb3J0LmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlU2NhbGVGYWN0b3IgPSB2aWV3cG9ydC5kZXZpY2VTY2FsZUZhY3RvciA/PyAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JlZW5PcmllbnRhdGlvbiA9IHZpZXdwb3J0LmlzTGFuZHNjYXBlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHsgYW5nbGU6IDkwLCB0eXBlOiAnbGFuZHNjYXBlUHJpbWFyeScgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7IGFuZ2xlOiAwLCB0eXBlOiAncG9ydHJhaXRQcmltYXJ5JyB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNUb3VjaCA9IHZpZXdwb3J0Lmhhc1RvdWNoIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZCgnRW11bGF0aW9uLnNldERldmljZU1ldHJpY3NPdmVycmlkZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2JpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbk9yaWVudGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ1RhcmdldCBkb2VzIG5vdCBzdXBwb3J0IG1ldHJpY3Mgb3ZlcnJpZGUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldFRvdWNoRW11bGF0aW9uRW5hYmxlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBoYXNUb3VjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9LCBcIiNhcHBseVZpZXdwb3J0XCIpIH0sIF9wcml2YXRlX2FwcGx5Vmlld3BvcnRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNhcHBseVZpZXdwb3J0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjYXBwbHlWaWV3cG9ydCBpbiBvYmosIGdldDogb2JqID0+IG9iai4jYXBwbHlWaWV3cG9ydCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9lbXVsYXRlSWRsZVN0YXRlX2Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfX3NldEZ1bmN0aW9uTmFtZShhc3luYyBmdW5jdGlvbiAoY2xpZW50LCBpZGxlU3RhdGVTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlkbGVTdGF0ZVN0YXRlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZGxlU3RhdGVTdGF0ZS5vdmVycmlkZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdFbXVsYXRpb24uc2V0SWRsZU92ZXJyaWRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVXNlckFjdGl2ZTogaWRsZVN0YXRlU3RhdGUub3ZlcnJpZGVzLmlzVXNlckFjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NjcmVlblVubG9ja2VkOiBpZGxlU3RhdGVTdGF0ZS5vdmVycmlkZXMuaXNTY3JlZW5VbmxvY2tlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5jbGVhcklkbGVPdmVycmlkZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgXCIjZW11bGF0ZUlkbGVTdGF0ZVwiKSB9LCBfcHJpdmF0ZV9lbXVsYXRlSWRsZVN0YXRlX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZUlkbGVTdGF0ZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI2VtdWxhdGVJZGxlU3RhdGUgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouI2VtdWxhdGVJZGxlU3RhdGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfX3NldEZ1bmN0aW9uTmFtZShhc3luYyBmdW5jdGlvbiAoY2xpZW50LCB0aW1lem9uZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGltZXpvbmVTdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRUaW1lem9uZU92ZXJyaWRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV6b25lSWQ6IHRpbWV6b25lU3RhdGUudGltZXpvbmVJZCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRXJyb3JMaWtlKGVycm9yKSAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIHRpbWV6b25lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGltZXpvbmUgSUQ6ICR7dGltZXpvbmVTdGF0ZS50aW1lem9uZUlkfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBcIiNlbXVsYXRlVGltZXpvbmVcIikgfSwgX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZVRpbWV6b25lXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjZW11bGF0ZVRpbWV6b25lIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNlbXVsYXRlVGltZXpvbmUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lfZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChjbGllbnQsIHZpc2lvbkRlZmljaWVuY3kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2aXNpb25EZWZpY2llbmN5LmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdFbXVsYXRpb24uc2V0RW11bGF0ZWRWaXNpb25EZWZpY2llbmN5Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdmlzaW9uRGVmaWNpZW5jeS52aXNpb25EZWZpY2llbmN5IHx8ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgXCIjZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lcIikgfSwgX3ByaXZhdGVfZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNlbXVsYXRlVmlzaW9uRGVmaWNpZW5jeVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI2VtdWxhdGVWaXNpb25EZWZpY2llbmN5IGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNlbXVsYXRlVmlzaW9uRGVmaWNpZW5jeSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9lbXVsYXRlQ3B1VGhyb3R0bGluZ19kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldENQVVRocm90dGxpbmdSYXRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogc3RhdGUuZmFjdG9yID8/IDEsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIFwiI2VtdWxhdGVDcHVUaHJvdHRsaW5nXCIpIH0sIF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZUNwdVRocm90dGxpbmdcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogdHJ1ZSwgYWNjZXNzOiB7IGhhczogb2JqID0+ICNlbXVsYXRlQ3B1VGhyb3R0bGluZyBpbiBvYmosIGdldDogb2JqID0+IG9iai4jZW11bGF0ZUNwdVRocm90dGxpbmcgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZU1lZGlhRmVhdHVyZXNfZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChjbGllbnQsIHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRFbXVsYXRlZE1lZGlhJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IHN0YXRlLm1lZGlhRmVhdHVyZXMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIFwiI2VtdWxhdGVNZWRpYUZlYXR1cmVzXCIpIH0sIF9wcml2YXRlX2VtdWxhdGVNZWRpYUZlYXR1cmVzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZU1lZGlhRmVhdHVyZXNcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogdHJ1ZSwgYWNjZXNzOiB7IGhhczogb2JqID0+ICNlbXVsYXRlTWVkaWFGZWF0dXJlcyBpbiBvYmosIGdldDogb2JqID0+IG9iai4jZW11bGF0ZU1lZGlhRmVhdHVyZXMgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZU1lZGlhVHlwZV9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldEVtdWxhdGVkTWVkaWEnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTogc3RhdGUudHlwZSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgXCIjZW11bGF0ZU1lZGlhVHlwZVwiKSB9LCBfcHJpdmF0ZV9lbXVsYXRlTWVkaWFUeXBlX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZU1lZGlhVHlwZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI2VtdWxhdGVNZWRpYVR5cGUgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouI2VtdWxhdGVNZWRpYVR5cGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChjbGllbnQsIHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRHZW9sb2NhdGlvbk92ZXJyaWRlJywgc3RhdGUuZ2VvTG9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogc3RhdGUuZ2VvTG9jYXRpb24ubG9uZ2l0dWRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlOiBzdGF0ZS5nZW9Mb2NhdGlvbi5sYXRpdHVkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeTogc3RhdGUuZ2VvTG9jYXRpb24uYWNjdXJhY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfSwgXCIjc2V0R2VvbG9jYXRpb25cIikgfSwgX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNzZXRHZW9sb2NhdGlvblwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI3NldEdlb2xvY2F0aW9uIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNzZXRHZW9sb2NhdGlvbiB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9zZXREZWZhdWx0QmFja2dyb3VuZENvbG9yX2Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfX3NldEZ1bmN0aW9uTmFtZShhc3luYyBmdW5jdGlvbiAoY2xpZW50LCBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdFbXVsYXRpb24uc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvck92ZXJyaWRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHN0YXRlLmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCBcIiNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yXCIpIH0sIF9wcml2YXRlX3NldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3JfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvciBpbiBvYmosIGdldDogb2JqID0+IG9iai4jc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvciB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9zZXRKYXZhU2NyaXB0RW5hYmxlZF9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldFNjcmlwdEV4ZWN1dGlvbkRpc2FibGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICFzdGF0ZS5qYXZhU2NyaXB0RW5hYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgXCIjc2V0SmF2YVNjcmlwdEVuYWJsZWRcIikgfSwgX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNzZXRKYXZhU2NyaXB0RW5hYmxlZFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI3NldEphdmFTY3JpcHRFbmFibGVkIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNzZXRKYXZhU2NyaXB0RW5hYmxlZCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICAjY2xpZW50ID0gX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAjZW11bGF0aW5nTW9iaWxlID0gZmFsc2U7XG4gICAgICAgICNoYXNUb3VjaCA9IGZhbHNlO1xuICAgICAgICAjc3RhdGVzID0gW107XG4gICAgICAgICN2aWV3cG9ydFN0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jYXBwbHlWaWV3cG9ydCk7XG4gICAgICAgICNpZGxlT3ZlcnJpZGVzU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNlbXVsYXRlSWRsZVN0YXRlKTtcbiAgICAgICAgI3RpbWV6b25lU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNlbXVsYXRlVGltZXpvbmUpO1xuICAgICAgICAjdmlzaW9uRGVmaWNpZW5jeVN0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jZW11bGF0ZVZpc2lvbkRlZmljaWVuY3kpO1xuICAgICAgICAjY3B1VGhyb3R0bGluZ1N0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jZW11bGF0ZUNwdVRocm90dGxpbmcpO1xuICAgICAgICAjbWVkaWFGZWF0dXJlc1N0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jZW11bGF0ZU1lZGlhRmVhdHVyZXMpO1xuICAgICAgICAjbWVkaWFUeXBlU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNlbXVsYXRlTWVkaWFUeXBlKTtcbiAgICAgICAgI2dlb0xvY2F0aW9uU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNzZXRHZW9sb2NhdGlvbik7XG4gICAgICAgICNkZWZhdWx0QmFja2dyb3VuZENvbG9yU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgI2phdmFzY3JpcHRFbmFibGVkU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBqYXZhU2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgIH0sIHRoaXMsIHRoaXMuI3NldEphdmFTY3JpcHRFbmFibGVkKTtcbiAgICAgICAgI3NlY29uZGFyeUNsaWVudHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGNvbnN0cnVjdG9yKGNsaWVudCkge1xuICAgICAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUNsaWVudChjbGllbnQpIHtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICAgICAgICAgIHRoaXMuI3NlY29uZGFyeUNsaWVudHMuZGVsZXRlKGNsaWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVnaXN0ZXJTdGF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy4jc3RhdGVzLnB1c2goc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGNsaWVudHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gW3RoaXMuI2NsaWVudCwgLi4uQXJyYXkuZnJvbSh0aGlzLiNzZWNvbmRhcnlDbGllbnRzKV07XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgcmVnaXN0ZXJTcGVjdWxhdGl2ZVNlc3Npb24oY2xpZW50KSB7XG4gICAgICAgICAgICB0aGlzLiNzZWNvbmRhcnlDbGllbnRzLmFkZChjbGllbnQpO1xuICAgICAgICAgICAgY2xpZW50Lm9uY2UoQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI3NlY29uZGFyeUNsaWVudHMuZGVsZXRlKGNsaWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IGF3YWl0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvIHJlZ2lzdGVyIGFsbCBzdGF0ZSBjaGFuZ2VzIGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBpcyB1bnBhdXNlZC5cbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGwodGhpcy4jc3RhdGVzLm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcy5zeW5jKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGphdmFzY3JpcHRFbmFibGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2phdmFzY3JpcHRFbmFibGVkU3RhdGUuc3RhdGUuamF2YVNjcmlwdEVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgZW11bGF0ZVZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLiN2aWV3cG9ydFN0YXRlLnN0YXRlO1xuICAgICAgICAgICAgaWYgKCF2aWV3cG9ydCAmJiAhY3VycmVudFN0YXRlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3ZpZXdwb3J0U3RhdGUuc2V0U3RhdGUodmlld3BvcnRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgdmlld3BvcnQsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBtb2JpbGUgPSB2aWV3cG9ydD8uaXNNb2JpbGUgfHwgZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBoYXNUb3VjaCA9IHZpZXdwb3J0Py5oYXNUb3VjaCB8fCBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHJlbG9hZE5lZWRlZCA9IHRoaXMuI2VtdWxhdGluZ01vYmlsZSAhPT0gbW9iaWxlIHx8IHRoaXMuI2hhc1RvdWNoICE9PSBoYXNUb3VjaDtcbiAgICAgICAgICAgIHRoaXMuI2VtdWxhdGluZ01vYmlsZSA9IG1vYmlsZTtcbiAgICAgICAgICAgIHRoaXMuI2hhc1RvdWNoID0gaGFzVG91Y2g7XG4gICAgICAgICAgICByZXR1cm4gcmVsb2FkTmVlZGVkO1xuICAgICAgICB9XG4gICAgICAgIGdldCAjYXBwbHlWaWV3cG9ydCgpIHsgcmV0dXJuIF9wcml2YXRlX2FwcGx5Vmlld3BvcnRfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBlbXVsYXRlSWRsZVN0YXRlKG92ZXJyaWRlcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jaWRsZU92ZXJyaWRlc1N0YXRlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0ICNlbXVsYXRlSWRsZVN0YXRlKCkgeyByZXR1cm4gX3ByaXZhdGVfZW11bGF0ZUlkbGVTdGF0ZV9kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIGdldCAjZW11bGF0ZVRpbWV6b25lKCkgeyByZXR1cm4gX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2Rlc2NyaXB0b3IudmFsdWU7IH1cbiAgICAgICAgYXN5bmMgZW11bGF0ZVRpbWV6b25lKHRpbWV6b25lSWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3RpbWV6b25lU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHRpbWV6b25lSWQsXG4gICAgICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0ICNlbXVsYXRlVmlzaW9uRGVmaWNpZW5jeSgpIHsgcmV0dXJuIF9wcml2YXRlX2VtdWxhdGVWaXNpb25EZWZpY2llbmN5X2Rlc2NyaXB0b3IudmFsdWU7IH1cbiAgICAgICAgYXN5bmMgZW11bGF0ZVZpc2lvbkRlZmljaWVuY3kodHlwZSkge1xuICAgICAgICAgICAgY29uc3QgdmlzaW9uRGVmaWNpZW5jaWVzID0gbmV3IFNldChbXG4gICAgICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgICAgICdhY2hyb21hdG9wc2lhJyxcbiAgICAgICAgICAgICAgICAnYmx1cnJlZFZpc2lvbicsXG4gICAgICAgICAgICAgICAgJ2RldXRlcmFub3BpYScsXG4gICAgICAgICAgICAgICAgJ3Byb3Rhbm9waWEnLFxuICAgICAgICAgICAgICAgICd0cml0YW5vcGlhJyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgYXNzZXJ0KCF0eXBlIHx8IHZpc2lvbkRlZmljaWVuY2llcy5oYXModHlwZSksIGBVbnN1cHBvcnRlZCB2aXNpb24gZGVmaWNpZW5jeTogJHt0eXBlfWApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jdmlzaW9uRGVmaWNpZW5jeVN0YXRlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmlzaW9uRGVmaWNpZW5jeTogdHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCAjZW11bGF0ZUNwdVRocm90dGxpbmcoKSB7IHJldHVybiBfcHJpdmF0ZV9lbXVsYXRlQ3B1VGhyb3R0bGluZ19kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIGFzeW5jIGVtdWxhdGVDUFVUaHJvdHRsaW5nKGZhY3Rvcikge1xuICAgICAgICAgICAgYXNzZXJ0KGZhY3RvciA9PT0gbnVsbCB8fCBmYWN0b3IgPj0gMSwgJ1Rocm90dGxpbmcgcmF0ZSBzaG91bGQgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxJyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNjcHVUaHJvdHRsaW5nU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBmYWN0b3I6IGZhY3RvciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI2VtdWxhdGVNZWRpYUZlYXR1cmVzKCkgeyByZXR1cm4gX3ByaXZhdGVfZW11bGF0ZU1lZGlhRmVhdHVyZXNfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBlbXVsYXRlTWVkaWFGZWF0dXJlcyhmZWF0dXJlcykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmVhdHVyZXMpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtZWRpYUZlYXR1cmUgb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IG1lZGlhRmVhdHVyZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQoL14oPzpwcmVmZXJzLSg/OmNvbG9yLXNjaGVtZXxyZWR1Y2VkLW1vdGlvbil8Y29sb3ItZ2FtdXQpJC8udGVzdChuYW1lKSwgJ1Vuc3VwcG9ydGVkIG1lZGlhIGZlYXR1cmU6ICcgKyBuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNtZWRpYUZlYXR1cmVzU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZWRpYUZlYXR1cmVzOiBmZWF0dXJlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCAjZW11bGF0ZU1lZGlhVHlwZSgpIHsgcmV0dXJuIF9wcml2YXRlX2VtdWxhdGVNZWRpYVR5cGVfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBlbXVsYXRlTWVkaWFUeXBlKHR5cGUpIHtcbiAgICAgICAgICAgIGFzc2VydCh0eXBlID09PSAnc2NyZWVuJyB8fFxuICAgICAgICAgICAgICAgIHR5cGUgPT09ICdwcmludCcgfHxcbiAgICAgICAgICAgICAgICAodHlwZSA/PyB1bmRlZmluZWQpID09PSB1bmRlZmluZWQsICdVbnN1cHBvcnRlZCBtZWRpYSB0eXBlOiAnICsgdHlwZSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNtZWRpYVR5cGVTdGF0ZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI3NldEdlb2xvY2F0aW9uKCkgeyByZXR1cm4gX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBzZXRHZW9sb2NhdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCB7IGxvbmdpdHVkZSwgbGF0aXR1ZGUsIGFjY3VyYWN5ID0gMCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGlmIChsb25naXR1ZGUgPCAtMTgwIHx8IGxvbmdpdHVkZSA+IDE4MCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb25naXR1ZGUgXCIke2xvbmdpdHVkZX1cIjogcHJlY29uZGl0aW9uIC0xODAgPD0gTE9OR0lUVURFIDw9IDE4MCBmYWlsZWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGF0aXR1ZGUgPCAtOTAgfHwgbGF0aXR1ZGUgPiA5MCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsYXRpdHVkZSBcIiR7bGF0aXR1ZGV9XCI6IHByZWNvbmRpdGlvbiAtOTAgPD0gTEFUSVRVREUgPD0gOTAgZmFpbGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFjY3VyYWN5IDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhY2N1cmFjeSBcIiR7YWNjdXJhY3l9XCI6IHByZWNvbmRpdGlvbiAwIDw9IEFDQ1VSQUNZIGZhaWxlZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2dlb0xvY2F0aW9uU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW9Mb2NhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGUsXG4gICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlLFxuICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0ICNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yKCkgeyByZXR1cm4gX3ByaXZhdGVfc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvcl9kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXNldHMgZGVmYXVsdCB3aGl0ZSBiYWNrZ3JvdW5kXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyByZXNldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNkZWZhdWx0QmFja2dyb3VuZENvbG9yU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhpZGVzIGRlZmF1bHQgd2hpdGUgYmFja2dyb3VuZFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNkZWZhdWx0QmFja2dyb3VuZENvbG9yU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogeyByOiAwLCBnOiAwLCBiOiAwLCBhOiAwIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI3NldEphdmFTY3JpcHRFbmFibGVkKCkgeyByZXR1cm4gX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBzZXRKYXZhU2NyaXB0RW5hYmxlZChlbmFibGVkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNqYXZhc2NyaXB0RW5hYmxlZFN0YXRlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgamF2YVNjcmlwdEVuYWJsZWQ6IGVuYWJsZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuZXhwb3J0IHsgRW11bGF0aW9uTWFuYWdlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RW11bGF0aW9uTWFuYWdlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbmltcG9ydCB7IENEUFNlc3Npb25FdmVudCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4uL2NvbW1vbi9MYXp5QXJnLmpzJztcbmltcG9ydCB7IHNjcmlwdEluamVjdG9yIH0gZnJvbSAnLi4vY29tbW9uL1NjcmlwdEluamVjdG9yLmpzJztcbmltcG9ydCB7IFB1cHBldGVlclVSTCwgU09VUkNFX1VSTF9SRUdFWCwgZGVidWdFcnJvciwgZ2V0U291cmNlUHVwcGV0ZWVyVVJMSWZBdmFpbGFibGUsIGdldFNvdXJjZVVybENvbW1lbnQsIGlzU3RyaW5nLCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IEFzeW5jSXRlcmFibGVVdGlsIH0gZnJvbSAnLi4vdXRpbC9Bc3luY0l0ZXJhYmxlVXRpbC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2ssIGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5RnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL0Z1bmN0aW9uLmpzJztcbmltcG9ydCB7IE11dGV4IH0gZnJvbSAnLi4vdXRpbC9NdXRleC5qcyc7XG5pbXBvcnQgeyBBUklBUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9BcmlhUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IEJpbmRpbmcgfSBmcm9tICcuL0JpbmRpbmcuanMnO1xuaW1wb3J0IHsgQ2RwRWxlbWVudEhhbmRsZSB9IGZyb20gJy4vRWxlbWVudEhhbmRsZS5qcyc7XG5pbXBvcnQgeyBDZHBKU0hhbmRsZSB9IGZyb20gJy4vSlNIYW5kbGUuanMnO1xuaW1wb3J0IHsgYWRkUGFnZUJpbmRpbmcsIENEUF9CSU5ESU5HX1BSRUZJWCwgY3JlYXRlRXZhbHVhdGlvbkVycm9yLCB2YWx1ZUZyb21SZW1vdGVPYmplY3QsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5jb25zdCBhcmlhUXVlcnlTZWxlY3RvckJpbmRpbmcgPSBuZXcgQmluZGluZygnX19hcmlhUXVlcnlTZWxlY3RvcicsIEFSSUFRdWVyeUhhbmRsZXIucXVlcnlPbmUsICcnIC8vIGN1c3RvbSBpbml0XG4pO1xuY29uc3QgYXJpYVF1ZXJ5U2VsZWN0b3JBbGxCaW5kaW5nID0gbmV3IEJpbmRpbmcoJ19fYXJpYVF1ZXJ5U2VsZWN0b3JBbGwnLCAoYXN5bmMgKGVsZW1lbnQsIHNlbGVjdG9yKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IEFSSUFRdWVyeUhhbmRsZXIucXVlcnlBbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICAgIHJldHVybiBhd2FpdCBlbGVtZW50LnJlYWxtLmV2YWx1YXRlSGFuZGxlKCguLi5lbGVtZW50cykgPT4ge1xuICAgICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfSwgLi4uKGF3YWl0IEFzeW5jSXRlcmFibGVVdGlsLmNvbGxlY3QocmVzdWx0cykpKTtcbn0pLCAnJyAvLyBjdXN0b20gaW5pdFxuKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICAjY2xpZW50O1xuICAgICN3b3JsZDtcbiAgICAjaWQ7XG4gICAgI25hbWU7XG4gICAgI2Rpc3Bvc2FibGVzID0gbmV3IERpc3Bvc2FibGVTdGFjaygpO1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCwgY29udGV4dFBheWxvYWQsIHdvcmxkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICAgICAgdGhpcy4jd29ybGQgPSB3b3JsZDtcbiAgICAgICAgdGhpcy4jaWQgPSBjb250ZXh0UGF5bG9hZC5pZDtcbiAgICAgICAgaWYgKGNvbnRleHRQYXlsb2FkLm5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuI25hbWUgPSBjb250ZXh0UGF5bG9hZC5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsaWVudEVtaXR0ZXIgPSB0aGlzLiNkaXNwb3NhYmxlcy51c2UobmV3IEV2ZW50RW1pdHRlcih0aGlzLiNjbGllbnQpKTtcbiAgICAgICAgY2xpZW50RW1pdHRlci5vbignUnVudGltZS5iaW5kaW5nQ2FsbGVkJywgdGhpcy4jb25CaW5kaW5nQ2FsbGVkLmJpbmQodGhpcykpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHREZXN0cm95ZWQnLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5leGVjdXRpb25Db250ZXh0SWQgPT09IHRoaXMuI2lkKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tkaXNwb3NlU3ltYm9sXSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY2xpZW50RW1pdHRlci5vbignUnVudGltZS5leGVjdXRpb25Db250ZXh0c0NsZWFyZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdSdW50aW1lLmNvbnNvbGVBUElDYWxsZWQnLCB0aGlzLiNvbkNvbnNvbGVBUEkuYmluZCh0aGlzKSk7XG4gICAgICAgIGNsaWVudEVtaXR0ZXIub24oQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpc1tkaXNwb3NlU3ltYm9sXSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ29udGFpbnMgbWFwcGluZyBmcm9tIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBib3VuZCB0byBQdXBwZXRlZXIgZnVuY3Rpb25zLlxuICAgICNiaW5kaW5ncyA9IG5ldyBNYXAoKTtcbiAgICAvLyBJZiBtdWx0aXBsZSB3YWl0Rm9yIGFyZSBzZXQgdXAgYXN5bmNocm9ub3VzbHksIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlXG4gICAgLy8gZmlyc3Qgb25lIHRvIHNldCB1cCB0aGUgYmluZGluZyBpbiB0aGUgcGFnZSBiZWZvcmUgcnVubmluZyB0aGUgb3RoZXJzLlxuICAgICNtdXRleCA9IG5ldyBNdXRleCgpO1xuICAgIGFzeW5jICNhZGRCaW5kaW5nKGJpbmRpbmcpIHtcbiAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jYmluZGluZ3MuaGFzKGJpbmRpbmcubmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBfID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHRoaXMuI211dGV4LmFjcXVpcmUoKSwgZmFsc2UpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnUnVudGltZS5hZGRCaW5kaW5nJywgdGhpcy4jbmFtZVxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IENEUF9CSU5ESU5HX1BSRUZJWCArIGJpbmRpbmcubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHROYW1lOiB0aGlzLiNuYW1lLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogQ0RQX0JJTkRJTkdfUFJFRklYICsgYmluZGluZy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dElkOiB0aGlzLiNpZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShhZGRQYWdlQmluZGluZywgJ2ludGVybmFsJywgYmluZGluZy5uYW1lLCBDRFBfQklORElOR19QUkVGSVgpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2JpbmRpbmdzLnNldChiaW5kaW5nLm5hbWUsIGJpbmRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY291bGQgaGF2ZSB0cmllZCB0byBldmFsdWF0ZSBpbiBhIGNvbnRleHQgd2hpY2ggd2FzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAvLyBkZXN0cm95ZWQuIFRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsIGlmIHRoZSBwYWdlIGlzIG5hdmlnYXRlZCB3aGlsZVxuICAgICAgICAgICAgICAgIC8vIHdlIGFyZSB0cnlpbmcgdG8gYWRkIHRoZSBiaW5kaW5nXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVzdHJveWVkIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFeGVjdXRpb24gY29udGV4dCB3YXMgZGVzdHJveWVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBNaXNzaW5nIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdDYW5ub3QgZmluZCBjb250ZXh0IHdpdGggc3BlY2lmaWVkIGlkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI29uQmluZGluZ0NhbGxlZChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQuZXhlY3V0aW9uQ29udGV4dElkICE9PSB0aGlzLiNpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXlsb2FkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoZXZlbnQucGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgLy8gVGhlIGJpbmRpbmcgd2FzIGVpdGhlciBjYWxsZWQgYnkgc29tZXRoaW5nIGluIHRoZSBwYWdlIG9yIGl0IHdhc1xuICAgICAgICAgICAgLy8gY2FsbGVkIGJlZm9yZSBvdXIgd3JhcHBlciB3YXMgaW5pdGlhbGl6ZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlLCBuYW1lLCBzZXEsIGFyZ3MsIGlzVHJpdmlhbCB9ID0gcGF5bG9hZDtcbiAgICAgICAgaWYgKHR5cGUgIT09ICdpbnRlcm5hbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYmluZGluZ2NhbGxlZCcsIGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuI2JpbmRpbmdzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdiaW5kaW5nY2FsbGVkJywgZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy4jYmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgYXdhaXQgYmluZGluZz8ucnVuKHRoaXMsIHNlcSwgYXJncywgaXNUcml2aWFsKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaWQ7XG4gICAgfVxuICAgICNvbkNvbnNvbGVBUEkoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmV4ZWN1dGlvbkNvbnRleHRJZCAhPT0gdGhpcy4jaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoJ2NvbnNvbGVhcGljYWxsZWQnLCBldmVudCk7XG4gICAgfVxuICAgICNiaW5kaW5nc0luc3RhbGxlZCA9IGZhbHNlO1xuICAgICNwdXBwZXRlZXJVdGlsO1xuICAgIGdldCBwdXBwZXRlZXJVdGlsKCkge1xuICAgICAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBpZiAoIXRoaXMuI2JpbmRpbmdzSW5zdGFsbGVkKSB7XG4gICAgICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2FkZEJpbmRpbmdXaXRob3V0VGhyb3dpbmcoYXJpYVF1ZXJ5U2VsZWN0b3JCaW5kaW5nKSxcbiAgICAgICAgICAgICAgICB0aGlzLiNhZGRCaW5kaW5nV2l0aG91dFRocm93aW5nKGFyaWFRdWVyeVNlbGVjdG9yQWxsQmluZGluZyksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHRoaXMuI2JpbmRpbmdzSW5zdGFsbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBzY3JpcHRJbmplY3Rvci5pbmplY3Qoc2NyaXB0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNwdXBwZXRlZXJVdGlsKSB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLiNwdXBwZXRlZXJVdGlsLnRoZW4oaGFuZGxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdm9pZCBoYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jcHVwcGV0ZWVyVXRpbCA9IHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVIYW5kbGUoc2NyaXB0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCAhdGhpcy4jcHVwcGV0ZWVyVXRpbCk7XG4gICAgICAgIHJldHVybiB0aGlzLiNwdXBwZXRlZXJVdGlsO1xuICAgIH1cbiAgICBhc3luYyAjYWRkQmluZGluZ1dpdGhvdXRUaHJvd2luZyhiaW5kaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNhZGRCaW5kaW5nKGJpbmRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZSBhZGRlZCwgdGhlbiBlaXRoZXIgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0XG4gICAgICAgICAgICAvLyBiaW5kaW5ncyAoZS5nLiBGaXJlZm94KSBvciB0aGUgY29udGV4dCBpcyBicm9rZW4uIEVpdGhlciBicmVha2FnZSBpc1xuICAgICAgICAgICAgLy8gb2theSwgc28gd2UgaWdub3JlIHRoZSBlcnJvci5cbiAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IGF3YWl0IHBhZ2UubWFpbkZyYW1lKCkuZXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGUoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKDggKiA3KSkqIDtcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBwcmludHMgXCI1NlwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIEEgc3RyaW5nIGNhbiBhbHNvIGJlIHBhc3NlZCBpbiBpbnN0ZWFkIG9mIGEgZnVuY3Rpb246XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnNvbGUubG9nKGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGUoJzEgKyAyJykpOyAvLyBwcmludHMgXCIzXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogSGFuZGxlcyBjYW4gYWxzbyBiZSBwYXNzZWQgYXMgYGFyZ3NgLiBUaGV5IHJlc29sdmUgdG8gdGhlaXIgcmVmZXJlbmNlZCBvYmplY3Q6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IG9uZUhhbmRsZSA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGVIYW5kbGUoKCkgPT4gMSk7XG4gICAgICogY29uc3QgdHdvSGFuZGxlID0gYXdhaXQgZXhlY3V0aW9uQ29udGV4dC5ldmFsdWF0ZUhhbmRsZSgoKSA9PiAyKTtcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRpb25Db250ZXh0LmV2YWx1YXRlKFxuICAgICAqICAgKGEsIGIpID0+IGEgKyBiLFxuICAgICAqICAgb25lSGFuZGxlLFxuICAgICAqICAgdHdvSGFuZGxlXG4gICAgICogKTtcbiAgICAgKiBhd2FpdCBvbmVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAqIGF3YWl0IHR3b0hhbmRsZS5kaXNwb3NlKCk7XG4gICAgICogY29uc29sZS5sb2cocmVzdWx0KTsgLy8gcHJpbnRzICczJy5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIGludG8gdGhlIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZnVuY3Rpb24uIElmIHRoZSByZXN1bHQgaXMgYW4gb2JqZWN0LFxuICAgICAqIGEgdmFuaWxsYSBvYmplY3QgY29udGFpbmluZyB0aGUgc2VyaWFsaXphYmxlIHByb3BlcnRpZXMgb2YgdGhlIHJlc3VsdCBpc1xuICAgICAqIHJldHVybmVkLlxuICAgICAqL1xuICAgIGFzeW5jIGV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZXZhbHVhdGUodHJ1ZSwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZhbHVhdGVzIHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIFVubGlrZSB7QGxpbmsgRXhlY3V0aW9uQ29udGV4dC5ldmFsdWF0ZSB8IGV2YWx1YXRlfSwgdGhpcyBtZXRob2QgcmV0dXJucyBhXG4gICAgICogaGFuZGxlIHRvIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGJldHRlciBzdWl0ZWQgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgc2VyaWFsaXplZCAoZS5nLlxuICAgICAqIGBNYXBgKSBhbmQgcmVxdWlyZXMgZnVydGhlciBtYW5pcHVsYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBjb250ZXh0ID0gYXdhaXQgcGFnZS5tYWluRnJhbWUoKS5leGVjdXRpb25Db250ZXh0KCk7XG4gICAgICogY29uc3QgaGFuZGxlOiBKU0hhbmRsZTx0eXBlb2YgZ2xvYmFsVGhpcz4gPSBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKFxuICAgICAqICAgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHNlbGYpXG4gICAgICogKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogQSBzdHJpbmcgY2FuIGFsc28gYmUgcGFzc2VkIGluIGluc3RlYWQgb2YgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgaGFuZGxlOiBKU0hhbmRsZTxudW1iZXI+ID0gYXdhaXQgY29udGV4dC5ldmFsdWF0ZUhhbmRsZSgnMSArIDInKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogSGFuZGxlcyBjYW4gYWxzbyBiZSBwYXNzZWQgYXMgYGFyZ3NgLiBUaGV5IHJlc29sdmUgdG8gdGhlaXIgcmVmZXJlbmNlZCBvYmplY3Q6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGJvZHlIYW5kbGU6IEVsZW1lbnRIYW5kbGU8SFRNTEJvZHlFbGVtZW50PiA9XG4gICAgICogICBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKCgpID0+IHtcbiAgICAgKiAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG4gICAgICogICB9KTtcbiAgICAgKiBjb25zdCBzdHJpbmdIYW5kbGU6IEpTSGFuZGxlPHN0cmluZz4gPSBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKFxuICAgICAqICAgYm9keSA9PiBib2R5LmlubmVySFRNTCxcbiAgICAgKiAgIGJvZHlcbiAgICAgKiApO1xuICAgICAqIGNvbnNvbGUubG9nKGF3YWl0IHN0cmluZ0hhbmRsZS5qc29uVmFsdWUoKSk7IC8vIHByaW50cyBib2R5J3MgaW5uZXJIVE1MXG4gICAgICogLy8gQWx3YXlzIGRpc3Bvc2UgeW91ciBnYXJiYWdlISA6KVxuICAgICAqIGF3YWl0IGJvZHlIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAqIGF3YWl0IHN0cmluZ0hhbmRsZS5kaXNwb3NlKCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFnZUZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyBpbnRvIHRoZSBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIHtAbGluayBKU0hhbmRsZSB8IGhhbmRsZX0gdG8gdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZVxuICAgICAqIGZ1bmN0aW9uLiBJZiB0aGUgcmVzdWx0IGlzIGEgYE5vZGVgLCB0aGVuIHRoaXMgd2lsbCByZXR1cm4gYW5cbiAgICAgKiB7QGxpbmsgRWxlbWVudEhhbmRsZSB8IGVsZW1lbnQgaGFuZGxlfS5cbiAgICAgKi9cbiAgICBhc3luYyBldmFsdWF0ZUhhbmRsZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2V2YWx1YXRlKGZhbHNlLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpO1xuICAgIH1cbiAgICBhc3luYyAjZXZhbHVhdGUocmV0dXJuQnlWYWx1ZSwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVVybENvbW1lbnQgPSBnZXRTb3VyY2VVcmxDb21tZW50KGdldFNvdXJjZVB1cHBldGVlclVSTElmQXZhaWxhYmxlKHBhZ2VGdW5jdGlvbik/LnRvU3RyaW5nKCkgPz9cbiAgICAgICAgICAgIFB1cHBldGVlclVSTC5JTlRFUk5BTF9VUkwpO1xuICAgICAgICBpZiAoaXNTdHJpbmcocGFnZUZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dElkID0gdGhpcy4jaWQ7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uID0gcGFnZUZ1bmN0aW9uO1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbldpdGhTb3VyY2VVcmwgPSBTT1VSQ0VfVVJMX1JFR0VYLnRlc3QoZXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICA/IGV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICA6IGAke2V4cHJlc3Npb259XFxuJHtzb3VyY2VVcmxDb21tZW50fVxcbmA7XG4gICAgICAgICAgICBjb25zdCB7IGV4Y2VwdGlvbkRldGFpbHMsIHJlc3VsdDogcmVtb3RlT2JqZWN0IH0gPSBhd2FpdCB0aGlzLiNjbGllbnRcbiAgICAgICAgICAgICAgICAuc2VuZCgnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uV2l0aFNvdXJjZVVybCxcbiAgICAgICAgICAgICAgICBjb250ZXh0SWQsXG4gICAgICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZSxcbiAgICAgICAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgICAgICAgdXNlckdlc3R1cmU6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZXdyaXRlRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbkRldGFpbHMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVFdmFsdWF0aW9uRXJyb3IoZXhjZXB0aW9uRGV0YWlscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuQnlWYWx1ZVxuICAgICAgICAgICAgICAgID8gdmFsdWVGcm9tUmVtb3RlT2JqZWN0KHJlbW90ZU9iamVjdClcbiAgICAgICAgICAgICAgICA6IHRoaXMuI3dvcmxkLmNyZWF0ZUNkcEhhbmRsZShyZW1vdGVPYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uRGVjbGFyYXRpb24gPSBzdHJpbmdpZnlGdW5jdGlvbihwYWdlRnVuY3Rpb24pO1xuICAgICAgICBjb25zdCBmdW5jdGlvbkRlY2xhcmF0aW9uV2l0aFNvdXJjZVVybCA9IFNPVVJDRV9VUkxfUkVHRVgudGVzdChmdW5jdGlvbkRlY2xhcmF0aW9uKVxuICAgICAgICAgICAgPyBmdW5jdGlvbkRlY2xhcmF0aW9uXG4gICAgICAgICAgICA6IGAke2Z1bmN0aW9uRGVjbGFyYXRpb259XFxuJHtzb3VyY2VVcmxDb21tZW50fVxcbmA7XG4gICAgICAgIGxldCBjYWxsRnVuY3Rpb25PblByb21pc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjYWxsRnVuY3Rpb25PblByb21pc2UgPSB0aGlzLiNjbGllbnQuc2VuZCgnUnVudGltZS5jYWxsRnVuY3Rpb25PbicsIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbkRlY2xhcmF0aW9uOiBmdW5jdGlvbkRlY2xhcmF0aW9uV2l0aFNvdXJjZVVybCxcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0SWQ6IHRoaXMuI2lkLFxuICAgICAgICAgICAgICAgIGFyZ3VtZW50czogYXJncy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBQcm9taXNlLmFsbChhcmdzLm1hcChjb252ZXJ0QXJndW1lbnQuYmluZCh0aGlzKSkpXG4gICAgICAgICAgICAgICAgICAgIDogW10sXG4gICAgICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZSxcbiAgICAgICAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgICAgICAgdXNlckdlc3R1cmU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJlxuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTicpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSArPSAnIFJlY3Vyc2l2ZSBvYmplY3RzIGFyZSBub3QgYWxsb3dlZC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBleGNlcHRpb25EZXRhaWxzLCByZXN1bHQ6IHJlbW90ZU9iamVjdCB9ID0gYXdhaXQgY2FsbEZ1bmN0aW9uT25Qcm9taXNlLmNhdGNoKHJld3JpdGVFcnJvcik7XG4gICAgICAgIGlmIChleGNlcHRpb25EZXRhaWxzKSB7XG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVFdmFsdWF0aW9uRXJyb3IoZXhjZXB0aW9uRGV0YWlscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldHVybkJ5VmFsdWVcbiAgICAgICAgICAgID8gdmFsdWVGcm9tUmVtb3RlT2JqZWN0KHJlbW90ZU9iamVjdClcbiAgICAgICAgICAgIDogdGhpcy4jd29ybGQuY3JlYXRlQ2RwSGFuZGxlKHJlbW90ZU9iamVjdCk7XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRBcmd1bWVudChhcmcpIHtcbiAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBMYXp5QXJnKSB7XG4gICAgICAgICAgICAgICAgYXJnID0gYXdhaXQgYXJnLmdldCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdmFsaWQtdHlwZW9mXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdW5zZXJpYWxpemFibGVWYWx1ZTogYCR7YXJnLnRvU3RyaW5nKCl9bmAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChPYmplY3QuaXMoYXJnLCAtMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB1bnNlcmlhbGl6YWJsZVZhbHVlOiAnLTAnIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmlzKGFyZywgSW5maW5pdHkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdW5zZXJpYWxpemFibGVWYWx1ZTogJ0luZmluaXR5JyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE9iamVjdC5pcyhhcmcsIC1JbmZpbml0eSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB1bnNlcmlhbGl6YWJsZVZhbHVlOiAnLUluZmluaXR5JyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE9iamVjdC5pcyhhcmcsIE5hTikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB1bnNlcmlhbGl6YWJsZVZhbHVlOiAnTmFOJyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SGFuZGxlID0gYXJnICYmIChhcmcgaW5zdGFuY2VvZiBDZHBKU0hhbmRsZSB8fCBhcmcgaW5zdGFuY2VvZiBDZHBFbGVtZW50SGFuZGxlKVxuICAgICAgICAgICAgICAgID8gYXJnXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgaWYgKG9iamVjdEhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGlmIChvYmplY3RIYW5kbGUucmVhbG0gIT09IHRoaXMuI3dvcmxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSlNIYW5kbGVzIGNhbiBiZSBldmFsdWF0ZWQgb25seSBpbiB0aGUgY29udGV4dCB0aGV5IHdlcmUgY3JlYXRlZCEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdEhhbmRsZS5kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pTSGFuZGxlIGlzIGRpc3Bvc2VkIScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0SGFuZGxlLnJlbW90ZU9iamVjdCgpLnVuc2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2VyaWFsaXphYmxlVmFsdWU6IG9iamVjdEhhbmRsZS5yZW1vdGVPYmplY3QoKS51bnNlcmlhbGl6YWJsZVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdEhhbmRsZS5yZW1vdGVPYmplY3QoKS5vYmplY3RJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogb2JqZWN0SGFuZGxlLnJlbW90ZU9iamVjdCgpLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IG9iamVjdElkOiBvYmplY3RIYW5kbGUucmVtb3RlT2JqZWN0KCkub2JqZWN0SWQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBhcmcgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2FibGVzLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5lbWl0KCdkaXNwb3NlZCcsIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuY29uc3QgcmV3cml0ZUVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ09iamVjdCByZWZlcmVuY2UgY2hhaW4gaXMgdG9vIGxvbmcnKSkge1xuICAgICAgICByZXR1cm4geyByZXN1bHQ6IHsgdHlwZTogJ3VuZGVmaW5lZCcgfSB9O1xuICAgIH1cbiAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIk9iamVjdCBjb3VsZG4ndCBiZSByZXR1cm5lZCBieSB2YWx1ZVwiKSkge1xuICAgICAgICByZXR1cm4geyByZXN1bHQ6IHsgdHlwZTogJ3VuZGVmaW5lZCcgfSB9O1xuICAgIH1cbiAgICBpZiAoZXJyb3IubWVzc2FnZS5lbmRzV2l0aCgnQ2Fubm90IGZpbmQgY29udGV4dCB3aXRoIHNwZWNpZmllZCBpZCcpIHx8XG4gICAgICAgIGVycm9yLm1lc3NhZ2UuZW5kc1dpdGgoJ0luc3BlY3RlZCB0YXJnZXQgbmF2aWdhdGVkIG9yIGNsb3NlZCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhlY3V0aW9uIGNvbnRleHQgd2FzIGRlc3Ryb3llZCwgbW9zdCBsaWtlbHkgYmVjYXVzZSBvZiBhIG5hdmlnYXRpb24uJyk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4ZWN1dGlvbkNvbnRleHQuanMubWFwIiwiY29uc3QgdGFiVGFyZ2V0SW5mbyA9IHtcbiAgICB0YXJnZXRJZDogJ3RhYlRhcmdldElkJyxcbiAgICB0eXBlOiAndGFiJyxcbiAgICB0aXRsZTogJ3RhYicsXG4gICAgdXJsOiAnYWJvdXQ6YmxhbmsnLFxuICAgIGF0dGFjaGVkOiBmYWxzZSxcbiAgICBjYW5BY2Nlc3NPcGVuZXI6IGZhbHNlLFxufTtcbmNvbnN0IHBhZ2VUYXJnZXRJbmZvID0ge1xuICAgIHRhcmdldElkOiAncGFnZVRhcmdldElkJyxcbiAgICB0eXBlOiAncGFnZScsXG4gICAgdGl0bGU6ICdwYWdlJyxcbiAgICB1cmw6ICdhYm91dDpibGFuaycsXG4gICAgYXR0YWNoZWQ6IGZhbHNlLFxuICAgIGNhbkFjY2Vzc09wZW5lcjogZmFsc2UsXG59O1xuLyoqXG4gKiBFeHBlcmltZW50YWwgRXh0ZW5zaW9uVHJhbnNwb3J0IGFsbG93cyBlc3RhYmxpc2hpbmcgYSBjb25uZWN0aW9uIHZpYVxuICogY2hyb21lLmRlYnVnZ2VyIEFQSSBpZiBQdXBwZXRlZXIgcnVucyBpbiBhbiBleHRlbnNpb24uIFNpbmNlIENocm9tZVxuICogRGV2VG9vbHMgUHJvdG9jb2wgaXMgcmVzdHJpY3RlZCBmb3IgZXh0ZW5zaW9ucywgdGhlIHRyYW5zcG9ydFxuICogaW1wbGVtZW50cyBtaXNzaW5nIGNvbW1hbmRzIGFuZCBldmVudHMuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uVHJhbnNwb3J0IHtcbiAgICBzdGF0aWMgYXN5bmMgY29ubmVjdFRhYih0YWJJZCkge1xuICAgICAgICBhd2FpdCBjaHJvbWUuZGVidWdnZXIuYXR0YWNoKHsgdGFiSWQgfSwgJzEuMycpO1xuICAgICAgICByZXR1cm4gbmV3IEV4dGVuc2lvblRyYW5zcG9ydCh0YWJJZCk7XG4gICAgfVxuICAgIG9ubWVzc2FnZTtcbiAgICBvbmNsb3NlO1xuICAgICN0YWJJZDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0YWJJZCkge1xuICAgICAgICB0aGlzLiN0YWJJZCA9IHRhYklkO1xuICAgICAgICBjaHJvbWUuZGVidWdnZXIub25FdmVudC5hZGRMaXN0ZW5lcih0aGlzLiNkZWJ1Z2dlckV2ZW50SGFuZGxlcik7XG4gICAgfVxuICAgICNkZWJ1Z2dlckV2ZW50SGFuZGxlciA9IChzb3VyY2UsIG1ldGhvZCwgcGFyYW1zKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UudGFiSWQgIT09IHRoaXMuI3RhYklkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHNlc3Npb25JZCBpcyBub3QgaW4gc3RhYmxlIHlldC5cbiAgICAgICAgICAgIHNlc3Npb25JZDogc291cmNlLnNlc3Npb25JZCA/PyAncGFnZVRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgICNkaXNwYXRjaFJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5vbm1lc3NhZ2U/LihKU09OLnN0cmluZ2lmeShtZXNzYWdlKSk7XG4gICAgfVxuICAgIHNlbmQobWVzc2FnZSkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgICAgICBzd2l0Y2ggKHBhcnNlZC5tZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Jyb3dzZXIuZ2V0VmVyc2lvbic6IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBhcnNlZC5pZCxcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXJzZWQuc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcnNlZC5tZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xWZXJzaW9uOiAnMS4zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Q6ICdjaHJvbWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb246ICd1bmtub3duJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJBZ2VudDogJ2Nocm9tZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBqc1ZlcnNpb246ICd1bmtub3duJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdUYXJnZXQuZ2V0QnJvd3NlckNvbnRleHRzJzoge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3BhdGNoUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgICAgICBpZDogcGFyc2VkLmlkLFxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHBhcnNlZC5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogcGFyc2VkLm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyQ29udGV4dElkczogW10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnVGFyZ2V0LnNldERpc2NvdmVyVGFyZ2V0cyc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEluZm86IHRhYlRhcmdldEluZm8sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1RhcmdldC50YXJnZXRDcmVhdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbmZvOiBwYWdlVGFyZ2V0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBhcnNlZC5pZCxcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXJzZWQuc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcnNlZC5tZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge30sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnVGFyZ2V0LnNldEF1dG9BdHRhY2gnOiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5zZXNzaW9uSWQgPT09ICd0YWJUYXJnZXRTZXNzaW9uSWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3BhdGNoUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnVGFyZ2V0LmF0dGFjaGVkVG9UYXJnZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5mbzogcGFnZVRhcmdldEluZm8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiAncGFnZVRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXBhcnNlZC5zZXNzaW9uSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdUYXJnZXQuYXR0YWNoZWRUb1RhcmdldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbmZvOiB0YWJUYXJnZXRJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDogJ3RhYlRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBwYXJzZWQuaWQsXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDogcGFyc2VkLnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBwYXJzZWQubWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHt9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLnNlc3Npb25JZCA9PT0gJ3BhZ2VUYXJnZXRTZXNzaW9uSWQnKSB7XG4gICAgICAgICAgICBkZWxldGUgcGFyc2VkLnNlc3Npb25JZDtcbiAgICAgICAgfVxuICAgICAgICBjaHJvbWUuZGVidWdnZXJcbiAgICAgICAgICAgIC5zZW5kQ29tbWFuZChcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzZXNzaW9uSWQgaXMgbm90IGluIHN0YWJsZSB5ZXQuXG4gICAgICAgIHsgdGFiSWQ6IHRoaXMuI3RhYklkLCBzZXNzaW9uSWQ6IHBhcnNlZC5zZXNzaW9uSWQgfSwgcGFyc2VkLm1ldGhvZCwgcGFyc2VkLnBhcmFtcylcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3BhdGNoUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgIGlkOiBwYXJzZWQuaWQsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXJzZWQuc2Vzc2lvbklkID8/ICdwYWdlVGFyZ2V0U2Vzc2lvbklkJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcnNlZC5tZXRob2QsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiByZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICBpZDogcGFyc2VkLmlkLFxuICAgICAgICAgICAgICAgIHNlc3Npb25JZDogcGFyc2VkLnNlc3Npb25JZCA/PyAncGFnZVRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBwYXJzZWQubWV0aG9kLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICBjaHJvbWUuZGVidWdnZXIub25FdmVudC5yZW1vdmVMaXN0ZW5lcih0aGlzLiNkZWJ1Z2dlckV2ZW50SGFuZGxlcik7XG4gICAgICAgIHZvaWQgY2hyb21lLmRlYnVnZ2VyLmRldGFjaCh7IHRhYklkOiB0aGlzLiN0YWJJZCB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeHRlbnNpb25UcmFuc3BvcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IENEUFNlc3Npb25FdmVudCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbi8qKlxuICogRmlyZWZveFRhcmdldE1hbmFnZXIgaW1wbGVtZW50cyB0YXJnZXQgbWFuYWdlbWVudCB1c2luZ1xuICogYFRhcmdldC5zZXREaXNjb3ZlclRhcmdldHNgIHdpdGhvdXQgdXNpbmcgYXV0by1hdHRhY2guIEl0LCB0aGVyZWZvcmUsIGNyZWF0ZXNcbiAqIHRhcmdldHMgdGhhdCBsYXppbHkgZXN0YWJsaXNoIHRoZWlyIENEUCBzZXNzaW9ucy5cbiAqXG4gKiBBbHRob3VnaCB0aGUgYXBwcm9hY2ggaXMgcG90ZW50aWFsbHkgZmxha3ksIHRoZXJlIGlzIG5vIG90aGVyIHdheSBmb3IgRmlyZWZveFxuICogYmVjYXVzZSBGaXJlZm94J3MgQ0RQIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgYXV0by1hdHRhY2guXG4gKlxuICogRmlyZWZveCBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldEluZm9DaGFuZ2VkIGFuZCBkZXRhY2hlZEZyb21UYXJnZXQgZXZlbnRzOlxuICpcbiAqIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMDg1NVxuICogLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM2OTc5XG4gKiAgIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRmlyZWZveFRhcmdldE1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNjb25uZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzOiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnLFxuICAgICAqICdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJy5cbiAgICAgKlxuICAgICAqIEEgdGFyZ2V0IGJlY29tZXMgZGlzY292ZXJlZCB3aGVuICdUYXJnZXQudGFyZ2V0Q3JlYXRlZCcgaXMgcmVjZWl2ZWQuXG4gICAgICogQSB0YXJnZXQgaXMgcmVtb3ZlZCBmcm9tIHRoaXMgbWFwIG9uY2UgJ1RhcmdldC50YXJnZXREZXN0cm95ZWQnIGlzXG4gICAgICogcmVjZWl2ZWQuXG4gICAgICpcbiAgICAgKiBgdGFyZ2V0RmlsdGVyQ2FsbGJhY2tgIGhhcyBubyBlZmZlY3Qgb24gdGhpcyBtYXAuXG4gICAgICovXG4gICAgI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZCA9IG5ldyBNYXAoKTtcbiAgICAvKipcbiAgICAgKiBLZWVwcyB0cmFjayBvZiB0YXJnZXRzIHRoYXQgd2VyZSBjcmVhdGVkIHZpYSAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnXG4gICAgICogYW5kIHdoaWNoIG9uZSBhcmUgbm90IGZpbHRlcmVkIG91dCBieSBgdGFyZ2V0RmlsdGVyQ2FsbGJhY2tgLlxuICAgICAqXG4gICAgICogVGhlIHRhcmdldCBpcyByZW1vdmVkIGZyb20gaGVyZSBvbmNlIGl0J3MgYmVlbiBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkID0gbmV3IE1hcCgpO1xuICAgIC8qKlxuICAgICAqIFRyYWNrcyB3aGljaCBzZXNzaW9ucyBhdHRhY2ggdG8gd2hpY2ggdGFyZ2V0LlxuICAgICAqL1xuICAgICNhdmFpbGFibGVUYXJnZXRzQnlTZXNzaW9uSWQgPSBuZXcgTWFwKCk7XG4gICAgI3RhcmdldEZpbHRlckNhbGxiYWNrO1xuICAgICN0YXJnZXRGYWN0b3J5O1xuICAgICNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uID0gbmV3IFdlYWtNYXAoKTtcbiAgICAjaW5pdGlhbGl6ZURlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgI3RhcmdldHNJZHNGb3JJbml0ID0gbmV3IFNldCgpO1xuICAgIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb24sIHRhcmdldEZhY3RvcnksIHRhcmdldEZpbHRlckNhbGxiYWNrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayA9IHRhcmdldEZpbHRlckNhbGxiYWNrO1xuICAgICAgICB0aGlzLiN0YXJnZXRGYWN0b3J5ID0gdGFyZ2V0RmFjdG9yeTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vbignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKCdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJywgdGhpcy4jb25UYXJnZXREZXN0cm95ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKENEUFNlc3Npb25FdmVudC5TZXNzaW9uRGV0YWNoZWQsIHRoaXMuI29uU2Vzc2lvbkRldGFjaGVkKTtcbiAgICAgICAgdGhpcy5zZXR1cEF0dGFjaG1lbnRMaXN0ZW5lcnModGhpcy4jY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHNldHVwQXR0YWNobWVudExpc3RlbmVycyhzZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KHNlc3Npb24sIGV2ZW50KTtcbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSk7XG4gICAgICAgIHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uc2V0KHNlc3Npb24sIGxpc3RlbmVyKTtcbiAgICAgICAgc2Vzc2lvbi5vbignVGFyZ2V0LmF0dGFjaGVkVG9UYXJnZXQnLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgICNvblNlc3Npb25EZXRhY2hlZCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlU2Vzc2lvbkxpc3RlbmVycyhzZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jYXZhaWxhYmxlVGFyZ2V0c0J5U2Vzc2lvbklkLmRlbGV0ZShzZXNzaW9uLmlkKCkpO1xuICAgIH07XG4gICAgcmVtb3ZlU2Vzc2lvbkxpc3RlbmVycyhzZXNzaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLiNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSkge1xuICAgICAgICAgICAgc2Vzc2lvbi5vZmYoJ1RhcmdldC5hdHRhY2hlZFRvVGFyZ2V0JywgdGhpcy4jYXR0YWNoZWRUb1RhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5nZXQoc2Vzc2lvbikpO1xuICAgICAgICAgICAgdGhpcy4jYXR0YWNoZWRUb1RhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5kZWxldGUoc2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0QXZhaWxhYmxlVGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkO1xuICAgIH1cbiAgICBnZXRDaGlsZFRhcmdldHMoX3RhcmdldCkge1xuICAgICAgICByZXR1cm4gbmV3IFNldCgpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldERlc3Ryb3llZCcsIHRoaXMuI29uVGFyZ2V0RGVzdHJveWVkKTtcbiAgICB9XG4gICAgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY29ubmVjdGlvbi5zZW5kKCdUYXJnZXQuc2V0RGlzY292ZXJUYXJnZXRzJywge1xuICAgICAgICAgICAgZGlzY292ZXI6IHRydWUsXG4gICAgICAgICAgICBmaWx0ZXI6IFt7fV0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdCA9IG5ldyBTZXQodGhpcy4jZGlzY292ZXJlZFRhcmdldHNCeVRhcmdldElkLmtleXMoKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2luaXRpYWxpemVEZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgI29uVGFyZ2V0Q3JlYXRlZCA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy4jZGlzY292ZXJlZFRhcmdldHNCeVRhcmdldElkLmhhcyhldmVudC50YXJnZXRJbmZvLnRhcmdldElkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5zZXQoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCwgZXZlbnQudGFyZ2V0SW5mbyk7XG4gICAgICAgIGlmIChldmVudC50YXJnZXRJbmZvLnR5cGUgPT09ICdicm93c2VyJyAmJiBldmVudC50YXJnZXRJbmZvLmF0dGFjaGVkKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiN0YXJnZXRGYWN0b3J5KGV2ZW50LnRhcmdldEluZm8sIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB0YXJnZXQuX2luaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLnNldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkLCB0YXJnZXQpO1xuICAgICAgICAgICAgdGhpcy4jZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KHRhcmdldC5fdGFyZ2V0SWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI3RhcmdldEZhY3RvcnkoZXZlbnQudGFyZ2V0SW5mbywgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHRoaXMuI3RhcmdldEZpbHRlckNhbGxiYWNrICYmICF0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0Ll9pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLnNldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkLCB0YXJnZXQpO1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0YXJnZXQpO1xuICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkodGFyZ2V0Ll90YXJnZXRJZCk7XG4gICAgfTtcbiAgICAjb25UYXJnZXREZXN0cm95ZWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy4jZGlzY292ZXJlZFRhcmdldHNCeVRhcmdldElkLmRlbGV0ZShldmVudC50YXJnZXRJZCk7XG4gICAgICAgIHRoaXMuI2ZpbmlzaEluaXRpYWxpemF0aW9uSWZSZWFkeShldmVudC50YXJnZXRJZCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLmdldChldmVudC50YXJnZXRJZCk7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldEdvbmVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0R29uZSAqLywgdGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLmRlbGV0ZShldmVudC50YXJnZXRJZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgICNvbkF0dGFjaGVkVG9UYXJnZXQgPSBhc3luYyAocGFyZW50U2Vzc2lvbiwgZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5mbyA9IGV2ZW50LnRhcmdldEluZm87XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLiNjb25uZWN0aW9uLnNlc3Npb24oZXZlbnQuc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlc3Npb24gJHtldmVudC5zZXNzaW9uSWR9IHdhcyBub3QgY3JlYXRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiNhdmFpbGFibGVUYXJnZXRzQnlUYXJnZXRJZC5nZXQodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgIGFzc2VydCh0YXJnZXQsIGBUYXJnZXQgJHt0YXJnZXRJbmZvLnRhcmdldElkfSBpcyBtaXNzaW5nYCk7XG4gICAgICAgIHNlc3Npb24uX3NldFRhcmdldCh0YXJnZXQpO1xuICAgICAgICB0aGlzLnNldHVwQXR0YWNobWVudExpc3RlbmVycyhzZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jYXZhaWxhYmxlVGFyZ2V0c0J5U2Vzc2lvbklkLnNldChzZXNzaW9uLmlkKCksIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLmdldCh0YXJnZXRJbmZvLnRhcmdldElkKSk7XG4gICAgICAgIHBhcmVudFNlc3Npb24uZW1pdChDRFBTZXNzaW9uRXZlbnQuUmVhZHksIHNlc3Npb24pO1xuICAgIH07XG4gICAgI2ZpbmlzaEluaXRpYWxpemF0aW9uSWZSZWFkeSh0YXJnZXRJZCkge1xuICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdC5kZWxldGUodGFyZ2V0SWQpO1xuICAgICAgICBpZiAodGhpcy4jdGFyZ2V0c0lkc0ZvckluaXQuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy4jaW5pdGlhbGl6ZURlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpcmVmb3hUYXJnZXRNYW5hZ2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG5pbXBvcnQgeyBGcmFtZSwgRnJhbWVFdmVudCwgdGhyb3dJZkRldGFjaGVkIH0gZnJvbSAnLi4vYXBpL0ZyYW1lLmpzJztcbmltcG9ydCB7IFVuc3VwcG9ydGVkT3BlcmF0aW9uIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5IH0gZnJvbSAnLi9BY2Nlc3NpYmlsaXR5LmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlckV2ZW50IH0gZnJvbSAnLi9GcmFtZU1hbmFnZXJFdmVudHMuanMnO1xuaW1wb3J0IHsgSXNvbGF0ZWRXb3JsZCB9IGZyb20gJy4vSXNvbGF0ZWRXb3JsZC5qcyc7XG5pbXBvcnQgeyBNQUlOX1dPUkxELCBQVVBQRVRFRVJfV09STEQgfSBmcm9tICcuL0lzb2xhdGVkV29ybGRzLmpzJztcbmltcG9ydCB7IExpZmVjeWNsZVdhdGNoZXIsIH0gZnJvbSAnLi9MaWZlY3ljbGVXYXRjaGVyLmpzJztcbmltcG9ydCB7IENEUF9CSU5ESU5HX1BSRUZJWCB9IGZyb20gJy4vdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xubGV0IENkcEZyYW1lID0gKCgpID0+IHtcbiAgICBsZXQgX2NsYXNzU3VwZXIgPSBGcmFtZTtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX2dvdG9fZGVjb3JhdG9ycztcbiAgICBsZXQgX3dhaXRGb3JOYXZpZ2F0aW9uX2RlY29yYXRvcnM7XG4gICAgbGV0IF9zZXRDb250ZW50X2RlY29yYXRvcnM7XG4gICAgbGV0IF9hZGRQcmVsb2FkU2NyaXB0X2RlY29yYXRvcnM7XG4gICAgbGV0IF9hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnM7XG4gICAgbGV0IF9yZW1vdmVFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnM7XG4gICAgbGV0IF93YWl0Rm9yRGV2aWNlUHJvbXB0X2RlY29yYXRvcnM7XG4gICAgcmV0dXJuIGNsYXNzIENkcEZyYW1lIGV4dGVuZHMgX2NsYXNzU3VwZXIge1xuICAgICAgICBzdGF0aWMge1xuICAgICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZ290b19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZ290b1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZ290b1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmdvdG8gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JOYXZpZ2F0aW9uX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJ3YWl0Rm9yTmF2aWdhdGlvblwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwid2FpdEZvck5hdmlnYXRpb25cIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yTmF2aWdhdGlvbiB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2V0Q29udGVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2V0Q29udGVudFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwic2V0Q29udGVudFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNldENvbnRlbnQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2FkZFByZWxvYWRTY3JpcHRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImFkZFByZWxvYWRTY3JpcHRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImFkZFByZWxvYWRTY3JpcHRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5hZGRQcmVsb2FkU2NyaXB0IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJhZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJhZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYWRkRXhwb3NlZEZ1bmN0aW9uQmluZGluZyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfcmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwicmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZ1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwicmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZ1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnJlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmcgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JEZXZpY2VQcm9tcHRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIndhaXRGb3JEZXZpY2VQcm9tcHRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIndhaXRGb3JEZXZpY2VQcm9tcHRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yRGV2aWNlUHJvbXB0IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgICN1cmwgPSAoX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpLCAnJyk7XG4gICAgICAgICNkZXRhY2hlZCA9IGZhbHNlO1xuICAgICAgICAjY2xpZW50O1xuICAgICAgICBfZnJhbWVNYW5hZ2VyO1xuICAgICAgICBfbG9hZGVySWQgPSAnJztcbiAgICAgICAgX2xpZmVjeWNsZUV2ZW50cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgX2lkO1xuICAgICAgICBfcGFyZW50SWQ7XG4gICAgICAgIGFjY2Vzc2liaWxpdHk7XG4gICAgICAgIHdvcmxkcztcbiAgICAgICAgY29uc3RydWN0b3IoZnJhbWVNYW5hZ2VyLCBmcmFtZUlkLCBwYXJlbnRGcmFtZUlkLCBjbGllbnQpIHtcbiAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZU1hbmFnZXIgPSBmcmFtZU1hbmFnZXI7XG4gICAgICAgICAgICB0aGlzLiN1cmwgPSAnJztcbiAgICAgICAgICAgIHRoaXMuX2lkID0gZnJhbWVJZDtcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudElkID0gcGFyZW50RnJhbWVJZDtcbiAgICAgICAgICAgIHRoaXMuI2RldGFjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZXJJZCA9ICcnO1xuICAgICAgICAgICAgdGhpcy53b3JsZHMgPSB7XG4gICAgICAgICAgICAgICAgW01BSU5fV09STERdOiBuZXcgSXNvbGF0ZWRXb3JsZCh0aGlzLCB0aGlzLl9mcmFtZU1hbmFnZXIudGltZW91dFNldHRpbmdzKSxcbiAgICAgICAgICAgICAgICBbUFVQUEVURUVSX1dPUkxEXTogbmV3IElzb2xhdGVkV29ybGQodGhpcywgdGhpcy5fZnJhbWVNYW5hZ2VyLnRpbWVvdXRTZXR0aW5ncyksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5hY2Nlc3NpYmlsaXR5ID0gbmV3IEFjY2Vzc2liaWxpdHkodGhpcy53b3JsZHNbTUFJTl9XT1JMRF0pO1xuICAgICAgICAgICAgdGhpcy5vbihGcmFtZUV2ZW50LkZyYW1lU3dhcHBlZEJ5QWN0aXZhdGlvbiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEVtdWxhdGUgbG9hZGluZyBwcm9jZXNzIGZvciBzd2FwcGVkIGZyYW1lcy5cbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRpbmdTdGFydGVkKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Mb2FkaW5nU3RvcHBlZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLndvcmxkc1tNQUlOX1dPUkxEXS5lbWl0dGVyLm9uKCdjb25zb2xlYXBpY2FsbGVkJywgdGhpcy4jb25NYWluV29ybGRDb25zb2xlQXBpQ2FsbGVkLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy53b3JsZHNbTUFJTl9XT1JMRF0uZW1pdHRlci5vbignYmluZGluZ2NhbGxlZCcsIHRoaXMuI29uTWFpbldvcmxkQmluZGluZ0NhbGxlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICAjb25NYWluV29ybGRDb25zb2xlQXBpQ2FsbGVkKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZU1hbmFnZXIuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5Db25zb2xlQXBpQ2FsbGVkLCBbXG4gICAgICAgICAgICAgICAgdGhpcy53b3JsZHNbTUFJTl9XT1JMRF0sXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICAjb25NYWluV29ybGRCaW5kaW5nQ2FsbGVkKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZU1hbmFnZXIuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5CaW5kaW5nQ2FsbGVkLCBbXG4gICAgICAgICAgICAgICAgdGhpcy53b3JsZHNbTUFJTl9XT1JMRF0sXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkgaW4gRGV2VG9vbHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX2NsaWVudCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZXMgdGhlIGZyYW1lIElEIHdpdGggdGhlIG5ldyBJRC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIG1haW4gZnJhbWUgaXNcbiAgICAgICAgICogcmVwbGFjZWQgYnkgYSBkaWZmZXJlbnQgZnJhbWUuXG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGVJZChpZCkge1xuICAgICAgICAgICAgdGhpcy5faWQgPSBpZDtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcGFnZSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcmFtZU1hbmFnZXIucGFnZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlzT09QRnJhbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50ICE9PSB0aGlzLl9mcmFtZU1hbmFnZXIuY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGdvdG8odXJsLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmVmZXJlciA9IHRoaXMuX2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5leHRyYUhUVFBIZWFkZXJzKClbJ3JlZmVyZXInXSwgcmVmZXJyZXJQb2xpY3kgPSB0aGlzLl9mcmFtZU1hbmFnZXIubmV0d29ya01hbmFnZXIuZXh0cmFIVFRQSGVhZGVycygpWydyZWZlcmVyLXBvbGljeSddLCB3YWl0VW50aWwgPSBbJ2xvYWQnXSwgdGltZW91dCA9IHRoaXMuX2ZyYW1lTWFuYWdlci50aW1lb3V0U2V0dGluZ3MubmF2aWdhdGlvblRpbWVvdXQoKSwgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBsZXQgZW5zdXJlTmV3RG9jdW1lbnROYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCB3YXRjaGVyID0gbmV3IExpZmVjeWNsZVdhdGNoZXIodGhpcy5fZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLCB0aGlzLCB3YWl0VW50aWwsIHRpbWVvdXQpO1xuICAgICAgICAgICAgbGV0IGVycm9yID0gYXdhaXQgRGVmZXJyZWQucmFjZShbXG4gICAgICAgICAgICAgICAgbmF2aWdhdGUodGhpcy4jY2xpZW50LCB1cmwsIHJlZmVyZXIsIHJlZmVycmVyUG9saWN5LCB0aGlzLl9pZCksXG4gICAgICAgICAgICAgICAgd2F0Y2hlci50ZXJtaW5hdGlvblByb21pc2UoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9yID0gYXdhaXQgRGVmZXJyZWQucmFjZShbXG4gICAgICAgICAgICAgICAgICAgIHdhdGNoZXIudGVybWluYXRpb25Qcm9taXNlKCksXG4gICAgICAgICAgICAgICAgICAgIGVuc3VyZU5ld0RvY3VtZW50TmF2aWdhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgPyB3YXRjaGVyLm5ld0RvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB3YXRjaGVyLnNhbWVEb2N1bWVudE5hdmlnYXRpb25Qcm9taXNlKCksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHdhdGNoZXIubmF2aWdhdGlvblJlc3BvbnNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB3YXRjaGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRlKGNsaWVudCwgdXJsLCByZWZlcnJlciwgcmVmZXJyZXJQb2xpY3ksIGZyYW1lSWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKCdQYWdlLm5hdmlnYXRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3ksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbnN1cmVOZXdEb2N1bWVudE5hdmlnYXRpb24gPSAhIXJlc3BvbnNlLmxvYWRlcklkO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3JUZXh0ID09PSAnbmV0OjpFUlJfSFRUUF9SRVNQT05TRV9DT0RFX0ZBSUxVUkUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZXJyb3JUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBFcnJvcihgJHtyZXNwb25zZS5lcnJvclRleHR9IGF0ICR7dXJsfWApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHdhaXRGb3JOYXZpZ2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgY29uc3QgeyB3YWl0VW50aWwgPSBbJ2xvYWQnXSwgdGltZW91dCA9IHRoaXMuX2ZyYW1lTWFuYWdlci50aW1lb3V0U2V0dGluZ3MubmF2aWdhdGlvblRpbWVvdXQoKSwgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCB3YXRjaGVyID0gbmV3IExpZmVjeWNsZVdhdGNoZXIodGhpcy5fZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLCB0aGlzLCB3YWl0VW50aWwsIHRpbWVvdXQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCBEZWZlcnJlZC5yYWNlKFtcbiAgICAgICAgICAgICAgICB3YXRjaGVyLnRlcm1pbmF0aW9uUHJvbWlzZSgpLFxuICAgICAgICAgICAgICAgIC4uLihvcHRpb25zLmlnbm9yZVNhbWVEb2N1bWVudE5hdmlnYXRpb25cbiAgICAgICAgICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgICAgICAgICA6IFt3YXRjaGVyLnNhbWVEb2N1bWVudE5hdmlnYXRpb25Qcm9taXNlKCldKSxcbiAgICAgICAgICAgICAgICB3YXRjaGVyLm5ld0RvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IERlZmVycmVkLnJhY2UoW3dhdGNoZXIudGVybWluYXRpb25Qcm9taXNlKCksIHdhdGNoZXIubmF2aWdhdGlvblJlc3BvbnNlKCldKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgfHwgbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHdhdGNoZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCBjbGllbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIG1haW5SZWFsbSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndvcmxkc1tNQUlOX1dPUkxEXTtcbiAgICAgICAgfVxuICAgICAgICBpc29sYXRlZFJlYWxtKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud29ybGRzW1BVUFBFVEVFUl9XT1JMRF07XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgc2V0Q29udGVudChodG1sLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgd2FpdFVudGlsID0gWydsb2FkJ10sIHRpbWVvdXQgPSB0aGlzLl9mcmFtZU1hbmFnZXIudGltZW91dFNldHRpbmdzLm5hdmlnYXRpb25UaW1lb3V0KCksIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgLy8gV2UgcmVseSB1cG9uIHRoZSBmYWN0IHRoYXQgZG9jdW1lbnQub3BlbigpIHdpbGwgcmVzZXQgZnJhbWUgbGlmZWN5Y2xlIHdpdGggXCJpbml0XCJcbiAgICAgICAgICAgIC8vIGxpZmVjeWNsZSBldmVudC4gQHNlZSBodHRwczovL2NycmV2LmNvbS82MDg2NThcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0RnJhbWVDb250ZW50KGh0bWwpO1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hlciA9IG5ldyBMaWZlY3ljbGVXYXRjaGVyKHRoaXMuX2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlciwgdGhpcywgd2FpdFVudGlsLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgRGVmZXJyZWQucmFjZShbXG4gICAgICAgICAgICAgICAgd2F0Y2hlci50ZXJtaW5hdGlvblByb21pc2UoKSxcbiAgICAgICAgICAgICAgICB3YXRjaGVyLmxpZmVjeWNsZVByb21pc2UoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgd2F0Y2hlci5kaXNwb3NlKCk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cmwoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jdXJsO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudEZyYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lTWFuYWdlci5fZnJhbWVUcmVlLnBhcmVudEZyYW1lKHRoaXMuX2lkKSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkRnJhbWVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lTWFuYWdlci5fZnJhbWVUcmVlLmNoaWxkRnJhbWVzKHRoaXMuX2lkKTtcbiAgICAgICAgfVxuICAgICAgICAjZGV2aWNlUmVxdWVzdFByb21wdE1hbmFnZXIoKSB7XG4gICAgICAgICAgICBjb25zdCByb290RnJhbWUgPSB0aGlzLnBhZ2UoKS5tYWluRnJhbWUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT09QRnJhbWUoKSB8fCByb290RnJhbWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWVNYW5hZ2VyLl9kZXZpY2VSZXF1ZXN0UHJvbXB0TWFuYWdlcih0aGlzLiNjbGllbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvb3RGcmFtZS5fZnJhbWVNYW5hZ2VyLl9kZXZpY2VSZXF1ZXN0UHJvbXB0TWFuYWdlcih0aGlzLiNjbGllbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGFkZFByZWxvYWRTY3JpcHQocHJlbG9hZFNjcmlwdCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzT09QRnJhbWUoKSAmJiB0aGlzICE9PSB0aGlzLl9mcmFtZU1hbmFnZXIubWFpbkZyYW1lKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJlbG9hZFNjcmlwdC5nZXRJZEZvckZyYW1lKHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnUGFnZS5hZGRTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCcsIHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHByZWxvYWRTY3JpcHQuc291cmNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcmVsb2FkU2NyaXB0LnNldElkRm9yRnJhbWUodGhpcywgaWRlbnRpZmllcik7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgYWRkRXhwb3NlZEZ1bmN0aW9uQmluZGluZyhiaW5kaW5nKSB7XG4gICAgICAgICAgICAvLyBJZiBhIGZyYW1lIGhhcyBub3Qgc3RhcnRlZCBsb2FkaW5nLCBpdCBtaWdodCBuZXZlciBzdGFydC4gUmVseSBvblxuICAgICAgICAgICAgLy8gYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQgaW4gdGhhdCBjYXNlLlxuICAgICAgICAgICAgaWYgKHRoaXMgIT09IHRoaXMuX2ZyYW1lTWFuYWdlci5tYWluRnJhbWUoKSAmJiAhdGhpcy5faGFzU3RhcnRlZExvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1J1bnRpbWUuYWRkQmluZGluZycsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogQ0RQX0JJTkRJTkdfUFJFRklYICsgYmluZGluZy5uYW1lLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGUoYmluZGluZy5pbml0U291cmNlKS5jYXRjaChkZWJ1Z0Vycm9yKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHJlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZykge1xuICAgICAgICAgICAgLy8gSWYgYSBmcmFtZSBoYXMgbm90IHN0YXJ0ZWQgbG9hZGluZywgaXQgbWlnaHQgbmV2ZXIgc3RhcnQuIFJlbHkgb25cbiAgICAgICAgICAgIC8vIGFkZFNjcmlwdFRvRXZhbHVhdGVPbk5ld0RvY3VtZW50IGluIHRoYXQgY2FzZS5cbiAgICAgICAgICAgIGlmICh0aGlzICE9PSB0aGlzLl9mcmFtZU1hbmFnZXIubWFpbkZyYW1lKCkgJiYgIXRoaXMuX2hhc1N0YXJ0ZWRMb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdSdW50aW1lLnJlbW92ZUJpbmRpbmcnLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IENEUF9CSU5ESU5HX1BSRUZJWCArIGJpbmRpbmcubmFtZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0aGlzLmV2YWx1YXRlKG5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmVzIHRoZSBkYW5nbGluZyBQdXBwZXRlZXIgYmluZGluZyB3cmFwcGVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBJbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH0sIGJpbmRpbmcubmFtZSkuY2F0Y2goZGVidWdFcnJvciksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyB3YWl0Rm9yRGV2aWNlUHJvbXB0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyKCkud2FpdEZvckRldmljZVByb21wdChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBfbmF2aWdhdGVkKGZyYW1lUGF5bG9hZCkge1xuICAgICAgICAgICAgdGhpcy5fbmFtZSA9IGZyYW1lUGF5bG9hZC5uYW1lO1xuICAgICAgICAgICAgdGhpcy4jdXJsID0gYCR7ZnJhbWVQYXlsb2FkLnVybH0ke2ZyYW1lUGF5bG9hZC51cmxGcmFnbWVudCB8fCAnJ31gO1xuICAgICAgICB9XG4gICAgICAgIF9uYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCh1cmwpIHtcbiAgICAgICAgICAgIHRoaXMuI3VybCA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBfb25MaWZlY3ljbGVFdmVudChsb2FkZXJJZCwgbmFtZSkge1xuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdpbml0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRlcklkID0gbG9hZGVySWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGlmZWN5Y2xlRXZlbnRzLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9saWZlY3ljbGVFdmVudHMuYWRkKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIF9vbkxvYWRpbmdTdG9wcGVkKCkge1xuICAgICAgICAgICAgdGhpcy5fbGlmZWN5Y2xlRXZlbnRzLmFkZCgnRE9NQ29udGVudExvYWRlZCcpO1xuICAgICAgICAgICAgdGhpcy5fbGlmZWN5Y2xlRXZlbnRzLmFkZCgnbG9hZCcpO1xuICAgICAgICB9XG4gICAgICAgIF9vbkxvYWRpbmdTdGFydGVkKCkge1xuICAgICAgICAgICAgdGhpcy5faGFzU3RhcnRlZExvYWRpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBkZXRhY2hlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkZXRhY2hlZDtcbiAgICAgICAgfVxuICAgICAgICBbKF9nb3RvX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXSwgX3dhaXRGb3JOYXZpZ2F0aW9uX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXSwgX3NldENvbnRlbnRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdLCBfYWRkUHJlbG9hZFNjcmlwdF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF0sIF9hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXSwgX3JlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmdfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdLCBfd2FpdEZvckRldmljZVByb21wdF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF0sIGRpc3Bvc2VTeW1ib2wpXSgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNkZXRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2RldGFjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMud29ybGRzW01BSU5fV09STERdW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgICAgICB0aGlzLndvcmxkc1tQVVBQRVRFRVJfV09STERdW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3NlRnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuZXhwb3J0IHsgQ2RwRnJhbWUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyYW1lLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBGcmFtZUV2ZW50IH0gZnJvbSAnLi4vYXBpL0ZyYW1lLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgUHVwcGV0ZWVyVVJMLCBVVElMSVRZX1dPUkxEX05BTUUgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4uL3V0aWwvRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG5pbXBvcnQgeyBpc0Vycm9yTGlrZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IENkcFByZWxvYWRTY3JpcHQgfSBmcm9tICcuL0NkcFByZWxvYWRTY3JpcHQuanMnO1xuaW1wb3J0IHsgQ2RwQ0RQU2Vzc2lvbiB9IGZyb20gJy4vQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBpc1RhcmdldENsb3NlZEVycm9yIH0gZnJvbSAnLi9Db25uZWN0aW9uLmpzJztcbmltcG9ydCB7IERldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyIH0gZnJvbSAnLi9EZXZpY2VSZXF1ZXN0UHJvbXB0LmpzJztcbmltcG9ydCB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4ZWN1dGlvbkNvbnRleHQuanMnO1xuaW1wb3J0IHsgQ2RwRnJhbWUgfSBmcm9tICcuL0ZyYW1lLmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlckV2ZW50IH0gZnJvbSAnLi9GcmFtZU1hbmFnZXJFdmVudHMuanMnO1xuaW1wb3J0IHsgRnJhbWVUcmVlIH0gZnJvbSAnLi9GcmFtZVRyZWUuanMnO1xuaW1wb3J0IHsgTUFJTl9XT1JMRCwgUFVQUEVURUVSX1dPUkxEIH0gZnJvbSAnLi9Jc29sYXRlZFdvcmxkcy5qcyc7XG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlciB9IGZyb20gJy4vTmV0d29ya01hbmFnZXIuanMnO1xuY29uc3QgVElNRV9GT1JfV0FJVElOR19GT1JfU1dBUCA9IDEwMDsgLy8gbXMuXG4vKipcbiAqIEEgZnJhbWUgbWFuYWdlciBtYW5hZ2VzIHRoZSBmcmFtZXMgZm9yIGEgZ2l2ZW4ge0BsaW5rIFBhZ2UgfCBwYWdlfS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZyYW1lTWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgI3BhZ2U7XG4gICAgI25ldHdvcmtNYW5hZ2VyO1xuICAgICN0aW1lb3V0U2V0dGluZ3M7XG4gICAgI2lzb2xhdGVkV29ybGRzID0gbmV3IFNldCgpO1xuICAgICNjbGllbnQ7XG4gICAgI3NjcmlwdHNUb0V2YWx1YXRlT25OZXdEb2N1bWVudCA9IG5ldyBNYXAoKTtcbiAgICAjYmluZGluZ3MgPSBuZXcgU2V0KCk7XG4gICAgX2ZyYW1lVHJlZSA9IG5ldyBGcmFtZVRyZWUoKTtcbiAgICAvKipcbiAgICAgKiBTZXQgb2YgZnJhbWUgSURzIHN0b3JlZCB0byBpbmRpY2F0ZSBpZiBhIGZyYW1lIGhhcyByZWNlaXZlZCBhXG4gICAgICogZnJhbWVOYXZpZ2F0ZWQgZXZlbnQgc28gdGhhdCBmcmFtZSB0cmVlIHJlc3BvbnNlcyBjb3VsZCBiZSBpZ25vcmVkIGFzIHRoZVxuICAgICAqIGZyYW1lTmF2aWdhdGVkIGV2ZW50IHVzdWFsbHkgY29udGFpbnMgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICAjZnJhbWVOYXZpZ2F0ZWRSZWNlaXZlZCA9IG5ldyBTZXQoKTtcbiAgICAjZGV2aWNlUmVxdWVzdFByb21wdE1hbmFnZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICNmcmFtZVRyZWVIYW5kbGVkO1xuICAgIGdldCB0aW1lb3V0U2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0aW1lb3V0U2V0dGluZ3M7XG4gICAgfVxuICAgIGdldCBuZXR3b3JrTWFuYWdlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25ldHdvcmtNYW5hZ2VyO1xuICAgIH1cbiAgICBnZXQgY2xpZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50O1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIHBhZ2UsIHRpbWVvdXRTZXR0aW5ncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3BhZ2UgPSBwYWdlO1xuICAgICAgICB0aGlzLiNuZXR3b3JrTWFuYWdlciA9IG5ldyBOZXR3b3JrTWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy4jdGltZW91dFNldHRpbmdzID0gdGltZW91dFNldHRpbmdzO1xuICAgICAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnModGhpcy4jY2xpZW50KTtcbiAgICAgICAgY2xpZW50Lm9uY2UoQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jb25DbGllbnREaXNjb25uZWN0KCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhbWUncyBjbGllbnQgaXMgZGlzY29ubmVjdGVkLiBXZSBkb24ndCBrbm93IGlmIHRoZVxuICAgICAqIGRpc2Nvbm5lY3QgbWVhbnMgdGhhdCB0aGUgZnJhbWUgaXMgcmVtb3ZlZCBvciBpZiBpdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IGFcbiAgICAgKiBuZXcgZnJhbWUuIFRoZXJlZm9yZSwgd2Ugd2FpdCBmb3IgYSBzd2FwIGV2ZW50LlxuICAgICAqL1xuICAgIGFzeW5jICNvbkNsaWVudERpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGNvbnN0IG1haW5GcmFtZSA9IHRoaXMuX2ZyYW1lVHJlZS5nZXRNYWluRnJhbWUoKTtcbiAgICAgICAgaWYgKCFtYWluRnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG1haW5GcmFtZS5jaGlsZEZyYW1lcygpKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3dhcHBlZCA9IERlZmVycmVkLmNyZWF0ZSh7XG4gICAgICAgICAgICB0aW1lb3V0OiBUSU1FX0ZPUl9XQUlUSU5HX0ZPUl9TV0FQLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZyYW1lIHdhcyBub3Qgc3dhcHBlZCcsXG4gICAgICAgIH0pO1xuICAgICAgICBtYWluRnJhbWUub25jZShGcmFtZUV2ZW50LkZyYW1lU3dhcHBlZEJ5QWN0aXZhdGlvbiwgKCkgPT4ge1xuICAgICAgICAgICAgc3dhcHBlZC5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgc3dhcHBlZC52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShtYWluRnJhbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIG1haW4gZnJhbWUgaXMgcmVwbGFjZWQgYnkgYW5vdGhlciBtYWluIGZyYW1lLFxuICAgICAqIHdlIG1haW50YWluIHRoZSBtYWluIGZyYW1lIG9iamVjdCBpZGVudGl0eSB3aGlsZSB1cGRhdGluZ1xuICAgICAqIGl0cyBmcmFtZSB0cmVlIGFuZCBJRC5cbiAgICAgKi9cbiAgICBhc3luYyBzd2FwRnJhbWVUcmVlKGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIGFzc2VydCh0aGlzLiNjbGllbnQgaW5zdGFuY2VvZiBDZHBDRFBTZXNzaW9uLCAnQ0RQU2Vzc2lvbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgQ0RQU2Vzc2lvbkltcGwuJyk7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5fZnJhbWVUcmVlLmdldE1haW5GcmFtZSgpO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuI2ZyYW1lTmF2aWdhdGVkUmVjZWl2ZWQuYWRkKHRoaXMuI2NsaWVudC5fdGFyZ2V0KCkuX3RhcmdldElkKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lVHJlZS5yZW1vdmVGcmFtZShmcmFtZSk7XG4gICAgICAgICAgICBmcmFtZS51cGRhdGVJZCh0aGlzLiNjbGllbnQuX3RhcmdldCgpLl90YXJnZXRJZCk7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZVRyZWUuYWRkRnJhbWUoZnJhbWUpO1xuICAgICAgICAgICAgZnJhbWUudXBkYXRlQ2xpZW50KGNsaWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKGNsaWVudCk7XG4gICAgICAgIGNsaWVudC5vbmNlKENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI29uQ2xpZW50RGlzY29ubmVjdCgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplKGNsaWVudCwgZnJhbWUpO1xuICAgICAgICBhd2FpdCB0aGlzLiNuZXR3b3JrTWFuYWdlci5hZGRDbGllbnQoY2xpZW50KTtcbiAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkQnlBY3RpdmF0aW9uLCB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlZ2lzdGVyU3BlY3VsYXRpdmVTZXNzaW9uKGNsaWVudCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNuZXR3b3JrTWFuYWdlci5hZGRDbGllbnQoY2xpZW50KTtcbiAgICB9XG4gICAgc2V0dXBFdmVudExpc3RlbmVycyhzZXNzaW9uKSB7XG4gICAgICAgIHNlc3Npb24ub24oJ1BhZ2UuZnJhbWVBdHRhY2hlZCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jZnJhbWVUcmVlSGFuZGxlZD8udmFsdWVPclRocm93KCk7XG4gICAgICAgICAgICB0aGlzLiNvbkZyYW1lQXR0YWNoZWQoc2Vzc2lvbiwgZXZlbnQuZnJhbWVJZCwgZXZlbnQucGFyZW50RnJhbWVJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdQYWdlLmZyYW1lTmF2aWdhdGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU5hdmlnYXRlZFJlY2VpdmVkLmFkZChldmVudC5mcmFtZS5pZCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25GcmFtZU5hdmlnYXRlZChldmVudC5mcmFtZSwgZXZlbnQudHlwZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdQYWdlLm5hdmlnYXRlZFdpdGhpbkRvY3VtZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudChldmVudC5mcmFtZUlkLCBldmVudC51cmwpO1xuICAgICAgICB9KTtcbiAgICAgICAgc2Vzc2lvbi5vbignUGFnZS5mcmFtZURldGFjaGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRnJhbWVEZXRhY2hlZChldmVudC5mcmFtZUlkLCBldmVudC5yZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgICAgc2Vzc2lvbi5vbignUGFnZS5mcmFtZVN0YXJ0ZWRMb2FkaW5nJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRnJhbWVTdGFydGVkTG9hZGluZyhldmVudC5mcmFtZUlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNlc3Npb24ub24oJ1BhZ2UuZnJhbWVTdG9wcGVkTG9hZGluZycsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jZnJhbWVUcmVlSGFuZGxlZD8udmFsdWVPclRocm93KCk7XG4gICAgICAgICAgICB0aGlzLiNvbkZyYW1lU3RvcHBlZExvYWRpbmcoZXZlbnQuZnJhbWVJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRXhlY3V0aW9uQ29udGV4dENyZWF0ZWQoZXZlbnQuY29udGV4dCwgc2Vzc2lvbik7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdQYWdlLmxpZmVjeWNsZUV2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uTGlmZWN5Y2xlRXZlbnQoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgaW5pdGlhbGl6ZShjbGllbnQsIGZyYW1lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy5yZXNvbHZlKCk7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNjaGVkdWxlIGFsbCB0aGVzZSBjb21tYW5kcyB3aGlsZSB0aGUgdGFyZ2V0IGlzIHBhdXNlZCxcbiAgICAgICAgICAgIC8vIHRoZXJlZm9yZSwgaXQgbmVlZHMgdG8gaGFwcGVuIHN5bmNocm9uaW91c2x5LiBBdCB0aGUgc2FtZSB0aW1lIHdlXG4gICAgICAgICAgICAvLyBzaG91bGQgbm90IHN0YXJ0IHByb2Nlc3NpbmcgZXhlY3V0aW9uIGNvbnRleHQgYW5kIGZyYW1lIGV2ZW50cyBiZWZvcmVcbiAgICAgICAgICAgIC8vIHdlIHJlY2VpdmVkIHRoZSBpbml0aWFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmcmFtZSB0cmVlLlxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI25ldHdvcmtNYW5hZ2VyLmFkZENsaWVudChjbGllbnQpLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdQYWdlLmVuYWJsZScpLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdQYWdlLmdldEZyYW1lVHJlZScpLnRoZW4oKHsgZnJhbWVUcmVlIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jaGFuZGxlRnJhbWVUcmVlKGNsaWVudCwgZnJhbWVUcmVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZnJhbWVUcmVlSGFuZGxlZD8ucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdQYWdlLnNldExpZmVjeWNsZUV2ZW50c0VuYWJsZWQnLCB7IGVuYWJsZWQ6IHRydWUgfSksXG4gICAgICAgICAgICAgICAgY2xpZW50LnNlbmQoJ1J1bnRpbWUuZW5hYmxlJykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNjcmVhdGVJc29sYXRlZFdvcmxkKGNsaWVudCwgVVRJTElUWV9XT1JMRF9OQU1FKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAuLi4oZnJhbWVcbiAgICAgICAgICAgICAgICAgICAgPyBBcnJheS5mcm9tKHRoaXMuI3NjcmlwdHNUb0V2YWx1YXRlT25OZXdEb2N1bWVudC52YWx1ZXMoKSlcbiAgICAgICAgICAgICAgICAgICAgOiBbXSkubWFwKHNjcmlwdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZT8uYWRkUHJlbG9hZFNjcmlwdChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC4uLihmcmFtZSA/IEFycmF5LmZyb20odGhpcy4jYmluZGluZ3MudmFsdWVzKCkpIDogW10pLm1hcChiaW5kaW5nID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lPy5hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nKGJpbmRpbmcpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy5yZXNvbHZlKCk7XG4gICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG1pZ2h0IGhhdmUgYmVlbiBjbG9zZWQgYmVmb3JlIHRoZSBpbml0aWFsaXphdGlvbiBmaW5pc2hlZC5cbiAgICAgICAgICAgIGlmIChpc0Vycm9yTGlrZShlcnJvcikgJiYgaXNUYXJnZXRDbG9zZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGFnZTtcbiAgICB9XG4gICAgbWFpbkZyYW1lKCkge1xuICAgICAgICBjb25zdCBtYWluRnJhbWUgPSB0aGlzLl9mcmFtZVRyZWUuZ2V0TWFpbkZyYW1lKCk7XG4gICAgICAgIGFzc2VydChtYWluRnJhbWUsICdSZXF1ZXN0aW5nIG1haW4gZnJhbWUgdG9vIGVhcmx5IScpO1xuICAgICAgICByZXR1cm4gbWFpbkZyYW1lO1xuICAgIH1cbiAgICBmcmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2ZyYW1lVHJlZS5mcmFtZXMoKSk7XG4gICAgfVxuICAgIGZyYW1lKGZyYW1lSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lVHJlZS5nZXRCeUlkKGZyYW1lSWQpIHx8IG51bGw7XG4gICAgfVxuICAgIGFzeW5jIGFkZEV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZykge1xuICAgICAgICB0aGlzLiNiaW5kaW5ncy5hZGQoYmluZGluZyk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuZnJhbWVzKCkubWFwKGFzeW5jIChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZyYW1lLmFkZEV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgYXN5bmMgcmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZyhiaW5kaW5nKSB7XG4gICAgICAgIHRoaXMuI2JpbmRpbmdzLmRlbGV0ZShiaW5kaW5nKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mcmFtZXMoKS5tYXAoYXN5bmMgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZnJhbWUucmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZyhiaW5kaW5nKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBhc3luYyBldmFsdWF0ZU9uTmV3RG9jdW1lbnQoc291cmNlKSB7XG4gICAgICAgIGNvbnN0IHsgaWRlbnRpZmllciB9ID0gYXdhaXQgdGhpcy5tYWluRnJhbWUoKVxuICAgICAgICAgICAgLl9jbGllbnQoKVxuICAgICAgICAgICAgLnNlbmQoJ1BhZ2UuYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQnLCB7XG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwcmVsb2FkU2NyaXB0ID0gbmV3IENkcFByZWxvYWRTY3JpcHQodGhpcy5tYWluRnJhbWUoKSwgaWRlbnRpZmllciwgc291cmNlKTtcbiAgICAgICAgdGhpcy4jc2NyaXB0c1RvRXZhbHVhdGVPbk5ld0RvY3VtZW50LnNldChpZGVudGlmaWVyLCBwcmVsb2FkU2NyaXB0KTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mcmFtZXMoKS5tYXAoYXN5bmMgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZnJhbWUuYWRkUHJlbG9hZFNjcmlwdChwcmVsb2FkU2NyaXB0KTtcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4geyBpZGVudGlmaWVyIH07XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZVNjcmlwdFRvRXZhbHVhdGVPbk5ld0RvY3VtZW50KGlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgcHJlbG9hZFNjcmlwdCA9IHRoaXMuI3NjcmlwdHNUb0V2YWx1YXRlT25OZXdEb2N1bWVudC5nZXQoaWRlbnRpZmllcik7XG4gICAgICAgIGlmICghcHJlbG9hZFNjcmlwdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgdG8gZXZhbHVhdGUgb24gbmV3IGRvY3VtZW50IHdpdGggaWQgJHtpZGVudGlmaWVyfSBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNzY3JpcHRzVG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQuZGVsZXRlKGlkZW50aWZpZXIpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmZyYW1lcygpLm1hcChmcmFtZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gcHJlbG9hZFNjcmlwdC5nZXRJZEZvckZyYW1lKGZyYW1lKTtcbiAgICAgICAgICAgIGlmICghaWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmcmFtZVxuICAgICAgICAgICAgICAgIC5fY2xpZW50KClcbiAgICAgICAgICAgICAgICAuc2VuZCgnUGFnZS5yZW1vdmVTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCcsIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgb25BdHRhY2hlZFRvVGFyZ2V0KHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0Ll9nZXRUYXJnZXRJbmZvKCkudHlwZSAhPT0gJ2lmcmFtZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUodGFyZ2V0Ll9nZXRUYXJnZXRJbmZvKCkudGFyZ2V0SWQpO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIGZyYW1lLnVwZGF0ZUNsaWVudCh0YXJnZXQuX3Nlc3Npb24oKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKHRhcmdldC5fc2Vzc2lvbigpKTtcbiAgICAgICAgdm9pZCB0aGlzLmluaXRpYWxpemUodGFyZ2V0Ll9zZXNzaW9uKCksIGZyYW1lKTtcbiAgICB9XG4gICAgX2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyKGNsaWVudCkge1xuICAgICAgICBsZXQgbWFuYWdlciA9IHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyTWFwLmdldChjbGllbnQpO1xuICAgICAgICBpZiAobWFuYWdlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtYW5hZ2VyID0gbmV3IERldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyKGNsaWVudCwgdGhpcy4jdGltZW91dFNldHRpbmdzKTtcbiAgICAgICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyTWFwLnNldChjbGllbnQsIG1hbmFnZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYW5hZ2VyO1xuICAgIH1cbiAgICAjb25MaWZlY3ljbGVFdmVudChldmVudCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUoZXZlbnQuZnJhbWVJZCk7XG4gICAgICAgIGlmICghZnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZS5fb25MaWZlY3ljbGVFdmVudChldmVudC5sb2FkZXJJZCwgZXZlbnQubmFtZSk7XG4gICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5MaWZlY3ljbGVFdmVudCwgZnJhbWUpO1xuICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuTGlmZWN5Y2xlRXZlbnQsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgICNvbkZyYW1lU3RhcnRlZExvYWRpbmcoZnJhbWVJZCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUoZnJhbWVJZCk7XG4gICAgICAgIGlmICghZnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZS5fb25Mb2FkaW5nU3RhcnRlZCgpO1xuICAgIH1cbiAgICAjb25GcmFtZVN0b3BwZWRMb2FkaW5nKGZyYW1lSWQpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmZyYW1lKGZyYW1lSWQpO1xuICAgICAgICBpZiAoIWZyYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUuX29uTG9hZGluZ1N0b3BwZWQoKTtcbiAgICAgICAgdGhpcy5lbWl0KEZyYW1lTWFuYWdlckV2ZW50LkxpZmVjeWNsZUV2ZW50LCBmcmFtZSk7XG4gICAgICAgIGZyYW1lLmVtaXQoRnJhbWVFdmVudC5MaWZlY3ljbGVFdmVudCwgdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgI2hhbmRsZUZyYW1lVHJlZShzZXNzaW9uLCBmcmFtZVRyZWUpIHtcbiAgICAgICAgaWYgKGZyYW1lVHJlZS5mcmFtZS5wYXJlbnRJZCkge1xuICAgICAgICAgICAgdGhpcy4jb25GcmFtZUF0dGFjaGVkKHNlc3Npb24sIGZyYW1lVHJlZS5mcmFtZS5pZCwgZnJhbWVUcmVlLmZyYW1lLnBhcmVudElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuI2ZyYW1lTmF2aWdhdGVkUmVjZWl2ZWQuaGFzKGZyYW1lVHJlZS5mcmFtZS5pZCkpIHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25GcmFtZU5hdmlnYXRlZChmcmFtZVRyZWUuZnJhbWUsICdOYXZpZ2F0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU5hdmlnYXRlZFJlY2VpdmVkLmRlbGV0ZShmcmFtZVRyZWUuZnJhbWUuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZnJhbWVUcmVlLmNoaWxkRnJhbWVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmcmFtZVRyZWUuY2hpbGRGcmFtZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZUZyYW1lVHJlZShzZXNzaW9uLCBjaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uRnJhbWVBdHRhY2hlZChzZXNzaW9uLCBmcmFtZUlkLCBwYXJlbnRGcmFtZUlkKSB7XG4gICAgICAgIGxldCBmcmFtZSA9IHRoaXMuZnJhbWUoZnJhbWVJZCk7XG4gICAgICAgIGlmIChmcmFtZSkge1xuICAgICAgICAgICAgaWYgKHNlc3Npb24gJiYgZnJhbWUuaXNPT1BGcmFtZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gT09QIGlmcmFtZXMgYmVjb21lcyBhIG5vcm1hbCBpZnJhbWUgYWdhaW5cbiAgICAgICAgICAgICAgICAvLyBpdCBpcyBmaXJzdCBhdHRhY2hlZCB0byB0aGUgcGFyZW50IHBhZ2UgYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBpcyByZW1vdmVkLlxuICAgICAgICAgICAgICAgIGZyYW1lLnVwZGF0ZUNsaWVudChzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZSA9IG5ldyBDZHBGcmFtZSh0aGlzLCBmcmFtZUlkLCBwYXJlbnRGcmFtZUlkLCBzZXNzaW9uKTtcbiAgICAgICAgdGhpcy5fZnJhbWVUcmVlLmFkZEZyYW1lKGZyYW1lKTtcbiAgICAgICAgdGhpcy5lbWl0KEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lQXR0YWNoZWQsIGZyYW1lKTtcbiAgICB9XG4gICAgYXN5bmMgI29uRnJhbWVOYXZpZ2F0ZWQoZnJhbWVQYXlsb2FkLCBuYXZpZ2F0aW9uVHlwZSkge1xuICAgICAgICBjb25zdCBmcmFtZUlkID0gZnJhbWVQYXlsb2FkLmlkO1xuICAgICAgICBjb25zdCBpc01haW5GcmFtZSA9ICFmcmFtZVBheWxvYWQucGFyZW50SWQ7XG4gICAgICAgIGxldCBmcmFtZSA9IHRoaXMuX2ZyYW1lVHJlZS5nZXRCeUlkKGZyYW1lSWQpO1xuICAgICAgICAvLyBEZXRhY2ggYWxsIGNoaWxkIGZyYW1lcyBmaXJzdC5cbiAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZyYW1lLmNoaWxkRnJhbWVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIG9yIGNyZWF0ZSBtYWluIGZyYW1lLlxuICAgICAgICBpZiAoaXNNYWluRnJhbWUpIHtcbiAgICAgICAgICAgIGlmIChmcmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmcmFtZSBpZCB0byByZXRhaW4gZnJhbWUgaWRlbnRpdHkgb24gY3Jvc3MtcHJvY2VzcyBuYXZpZ2F0aW9uLlxuICAgICAgICAgICAgICAgIHRoaXMuX2ZyYW1lVHJlZS5yZW1vdmVGcmFtZShmcmFtZSk7XG4gICAgICAgICAgICAgICAgZnJhbWUuX2lkID0gZnJhbWVJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgbWFpbiBmcmFtZSBuYXZpZ2F0aW9uLlxuICAgICAgICAgICAgICAgIGZyYW1lID0gbmV3IENkcEZyYW1lKHRoaXMsIGZyYW1lSWQsIHVuZGVmaW5lZCwgdGhpcy4jY2xpZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lVHJlZS5hZGRGcmFtZShmcmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUgPSBhd2FpdCB0aGlzLl9mcmFtZVRyZWUud2FpdEZvckZyYW1lKGZyYW1lSWQpO1xuICAgICAgICBmcmFtZS5fbmF2aWdhdGVkKGZyYW1lUGF5bG9hZCk7XG4gICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5GcmFtZU5hdmlnYXRlZCwgZnJhbWUpO1xuICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuRnJhbWVOYXZpZ2F0ZWQsIG5hdmlnYXRpb25UeXBlKTtcbiAgICB9XG4gICAgYXN5bmMgI2NyZWF0ZUlzb2xhdGVkV29ybGQoc2Vzc2lvbiwgbmFtZSkge1xuICAgICAgICBjb25zdCBrZXkgPSBgJHtzZXNzaW9uLmlkKCl9OiR7bmFtZX1gO1xuICAgICAgICBpZiAodGhpcy4jaXNvbGF0ZWRXb3JsZHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmQoJ1BhZ2UuYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQnLCB7XG4gICAgICAgICAgICBzb3VyY2U6IGAvLyMgc291cmNlVVJMPSR7UHVwcGV0ZWVyVVJMLklOVEVSTkFMX1VSTH1gLFxuICAgICAgICAgICAgd29ybGROYW1lOiBuYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mcmFtZXMoKVxuICAgICAgICAgICAgLmZpbHRlcihmcmFtZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJhbWUuY2xpZW50ID09PSBzZXNzaW9uO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLm1hcChmcmFtZSA9PiB7XG4gICAgICAgICAgICAvLyBGcmFtZXMgbWlnaHQgYmUgcmVtb3ZlZCBiZWZvcmUgd2Ugc2VuZCB0aGlzLCBzbyB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgICAgICAvLyB0aHJvdyBhbiBlcnJvci5cbiAgICAgICAgICAgIHJldHVybiBzZXNzaW9uXG4gICAgICAgICAgICAgICAgLnNlbmQoJ1BhZ2UuY3JlYXRlSXNvbGF0ZWRXb3JsZCcsIHtcbiAgICAgICAgICAgICAgICBmcmFtZUlkOiBmcmFtZS5faWQsXG4gICAgICAgICAgICAgICAgd29ybGROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgIGdyYW50VW5pdmVyYWxBY2Nlc3M6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLiNpc29sYXRlZFdvcmxkcy5hZGQoa2V5KTtcbiAgICB9XG4gICAgI29uRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudChmcmFtZUlkLCB1cmwpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmZyYW1lKGZyYW1lSWQpO1xuICAgICAgICBpZiAoIWZyYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUuX25hdmlnYXRlZFdpdGhpbkRvY3VtZW50KHVybCk7XG4gICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5GcmFtZU5hdmlnYXRlZFdpdGhpbkRvY3VtZW50LCBmcmFtZSk7XG4gICAgICAgIGZyYW1lLmVtaXQoRnJhbWVFdmVudC5GcmFtZU5hdmlnYXRlZFdpdGhpbkRvY3VtZW50LCB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmVtaXQoRnJhbWVNYW5hZ2VyRXZlbnQuRnJhbWVOYXZpZ2F0ZWQsIGZyYW1lKTtcbiAgICAgICAgZnJhbWUuZW1pdChGcmFtZUV2ZW50LkZyYW1lTmF2aWdhdGVkLCAnTmF2aWdhdGlvbicpO1xuICAgIH1cbiAgICAjb25GcmFtZURldGFjaGVkKGZyYW1lSWQsIHJlYXNvbikge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUoZnJhbWVJZCk7XG4gICAgICAgIGlmICghZnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgY2FzZSAncmVtb3ZlJzpcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHJlbW92ZSB0aGUgZnJhbWUgaWYgdGhlIHJlYXNvbiBmb3IgdGhlIGRldGFjaGVkIGV2ZW50IGlzXG4gICAgICAgICAgICAgICAgLy8gYW4gYWN0dWFsIHJlbW92ZW1lbnQgb2YgdGhlIGZyYW1lLlxuICAgICAgICAgICAgICAgIC8vIEZvciBmcmFtZXMgdGhhdCBiZWNvbWUgT09QIGlmcmFtZXMsIHRoZSByZWFzb24gd291bGQgYmUgJ3N3YXAnLlxuICAgICAgICAgICAgICAgIHRoaXMuI3JlbW92ZUZyYW1lc1JlY3Vyc2l2ZWx5KGZyYW1lKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3N3YXAnOlxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5GcmFtZVN3YXBwZWQsIGZyYW1lKTtcbiAgICAgICAgICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgICNvbkV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkKGNvbnRleHRQYXlsb2FkLCBzZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGF1eERhdGEgPSBjb250ZXh0UGF5bG9hZC5hdXhEYXRhO1xuICAgICAgICBjb25zdCBmcmFtZUlkID0gYXV4RGF0YSAmJiBhdXhEYXRhLmZyYW1lSWQ7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdHlwZW9mIGZyYW1lSWQgPT09ICdzdHJpbmcnID8gdGhpcy5mcmFtZShmcmFtZUlkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHdvcmxkO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgY2FyZSBhYm91dCBleGVjdXRpb24gY29udGV4dHMgY3JlYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi5cbiAgICAgICAgICAgIGlmIChmcmFtZS5jbGllbnQgIT09IHNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29udGV4dFBheWxvYWQuYXV4RGF0YSAmJiBjb250ZXh0UGF5bG9hZC5hdXhEYXRhWydpc0RlZmF1bHQnXSkge1xuICAgICAgICAgICAgICAgIHdvcmxkID0gZnJhbWUud29ybGRzW01BSU5fV09STERdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29udGV4dFBheWxvYWQubmFtZSA9PT0gVVRJTElUWV9XT1JMRF9OQU1FKSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBtdWx0aXBsZSBzZXNzaW9ucyB0byB0aGUgc2FtZSB0YXJnZXQsIHRoZXJlJ3MgYSByYWNlIGJldHdlZW5cbiAgICAgICAgICAgICAgICAvLyBjb25uZWN0aW9ucyBzbyB3ZSBtaWdodCBlbmQgdXAgY3JlYXRpbmcgbXVsdGlwbGUgaXNvbGF0ZWQgd29ybGRzLlxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgZWl0aGVyLlxuICAgICAgICAgICAgICAgIHdvcmxkID0gZnJhbWUud29ybGRzW1BVUFBFVEVFUl9XT1JMRF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gd29ybGQsIHRoZSBjb250ZXh0IGlzIG5vdCBtZWFudCB0byBiZSBoYW5kbGVkIGJ5IHVzLlxuICAgICAgICBpZiAoIXdvcmxkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBFeGVjdXRpb25Db250ZXh0KGZyYW1lPy5jbGllbnQgfHwgdGhpcy4jY2xpZW50LCBjb250ZXh0UGF5bG9hZCwgd29ybGQpO1xuICAgICAgICB3b3JsZC5zZXRDb250ZXh0KGNvbnRleHQpO1xuICAgIH1cbiAgICAjcmVtb3ZlRnJhbWVzUmVjdXJzaXZlbHkoZnJhbWUpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmcmFtZS5jaGlsZEZyYW1lcygpKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWVbZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgdGhpcy5fZnJhbWVUcmVlLnJlbW92ZUZyYW1lKGZyYW1lKTtcbiAgICAgICAgdGhpcy5lbWl0KEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lRGV0YWNoZWQsIGZyYW1lKTtcbiAgICAgICAgZnJhbWUuZW1pdChGcmFtZUV2ZW50LkZyYW1lRGV0YWNoZWQsIGZyYW1lKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GcmFtZU1hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogV2UgdXNlIHN5bWJvbHMgdG8gcHJldmVudCBleHRlcm5hbCBwYXJ0aWVzIGxpc3RlbmluZyB0byB0aGVzZSBldmVudHMuXG4gKiBUaGV5IGFyZSBpbnRlcm5hbCB0byBQdXBwZXRlZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIEZyYW1lTWFuYWdlckV2ZW50O1xuKGZ1bmN0aW9uIChGcmFtZU1hbmFnZXJFdmVudCkge1xuICAgIEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lQXR0YWNoZWQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZUF0dGFjaGVkJyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuRnJhbWVOYXZpZ2F0ZWQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZU5hdmlnYXRlZCcpO1xuICAgIEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lRGV0YWNoZWQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZURldGFjaGVkJyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuRnJhbWVTd2FwcGVkID0gU3ltYm9sKCdGcmFtZU1hbmFnZXIuRnJhbWVTd2FwcGVkJyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuTGlmZWN5Y2xlRXZlbnQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5MaWZlY3ljbGVFdmVudCcpO1xuICAgIEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lTmF2aWdhdGVkV2l0aGluRG9jdW1lbnQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZU5hdmlnYXRlZFdpdGhpbkRvY3VtZW50Jyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuQ29uc29sZUFwaUNhbGxlZCA9IFN5bWJvbCgnRnJhbWVNYW5hZ2VyLkNvbnNvbGVBcGlDYWxsZWQnKTtcbiAgICBGcmFtZU1hbmFnZXJFdmVudC5CaW5kaW5nQ2FsbGVkID0gU3ltYm9sKCdGcmFtZU1hbmFnZXIuQmluZGluZ0NhbGxlZCcpO1xufSkoRnJhbWVNYW5hZ2VyRXZlbnQgfHwgKEZyYW1lTWFuYWdlckV2ZW50ID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyYW1lTWFuYWdlckV2ZW50cy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIHBhZ2UgZnJhbWUgdHJlZSBhbmQgaXQncyBpcyBtYW5hZ2VkIGJ5XG4gKiB7QGxpbmsgRnJhbWVNYW5hZ2VyfS4gRnJhbWVUcmVlIHVzZXMgZnJhbWUgSURzIHRvIHJlZmVyZW5jZSBmcmFtZSBhbmQgaXRcbiAqIG1lYW5zIHRoYXQgcmVmZXJlbmNlZCBmcmFtZXMgbWlnaHQgbm90IGJlIGluIHRoZSB0cmVlIGFueW1vcmUuIFRodXMsIHRoZSB0cmVlXG4gKiBzdHJ1Y3R1cmUgaXMgZXZlbnR1YWxseSBjb25zaXN0ZW50LlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBGcmFtZVRyZWUge1xuICAgICNmcmFtZXMgPSBuZXcgTWFwKCk7XG4gICAgLy8gZnJhbWVJRCAtPiBwYXJlbnRGcmFtZUlEXG4gICAgI3BhcmVudElkcyA9IG5ldyBNYXAoKTtcbiAgICAvLyBmcmFtZUlEIC0+IGNoaWxkRnJhbWVJRHNcbiAgICAjY2hpbGRJZHMgPSBuZXcgTWFwKCk7XG4gICAgI21haW5GcmFtZTtcbiAgICAjaXNNYWluRnJhbWVTdGFsZSA9IGZhbHNlO1xuICAgICN3YWl0UmVxdWVzdHMgPSBuZXcgTWFwKCk7XG4gICAgZ2V0TWFpbkZyYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWFpbkZyYW1lO1xuICAgIH1cbiAgICBnZXRCeUlkKGZyYW1lSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZyYW1lcy5nZXQoZnJhbWVJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgZnJhbWUgd2l0aFxuICAgICAqIHRoZSBnaXZlbiBJRCBpcyBhZGRlZCB0byB0aGUgdHJlZS5cbiAgICAgKi9cbiAgICB3YWl0Rm9yRnJhbWUoZnJhbWVJZCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZ2V0QnlJZChmcmFtZUlkKTtcbiAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZyYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLiN3YWl0UmVxdWVzdHMuZ2V0KGZyYW1lSWQpIHx8IG5ldyBTZXQoKTtcbiAgICAgICAgY2FsbGJhY2tzLmFkZChkZWZlcnJlZCk7XG4gICAgICAgIHJldHVybiBkZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgZnJhbWVzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiNmcmFtZXMudmFsdWVzKCkpO1xuICAgIH1cbiAgICBhZGRGcmFtZShmcmFtZSkge1xuICAgICAgICB0aGlzLiNmcmFtZXMuc2V0KGZyYW1lLl9pZCwgZnJhbWUpO1xuICAgICAgICBpZiAoZnJhbWUuX3BhcmVudElkKSB7XG4gICAgICAgICAgICB0aGlzLiNwYXJlbnRJZHMuc2V0KGZyYW1lLl9pZCwgZnJhbWUuX3BhcmVudElkKTtcbiAgICAgICAgICAgIGlmICghdGhpcy4jY2hpbGRJZHMuaGFzKGZyYW1lLl9wYXJlbnRJZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjaGlsZElkcy5zZXQoZnJhbWUuX3BhcmVudElkLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jY2hpbGRJZHMuZ2V0KGZyYW1lLl9wYXJlbnRJZCkuYWRkKGZyYW1lLl9pZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuI21haW5GcmFtZSB8fCB0aGlzLiNpc01haW5GcmFtZVN0YWxlKSB7XG4gICAgICAgICAgICB0aGlzLiNtYWluRnJhbWUgPSBmcmFtZTtcbiAgICAgICAgICAgIHRoaXMuI2lzTWFpbkZyYW1lU3RhbGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN3YWl0UmVxdWVzdHMuZ2V0KGZyYW1lLl9pZCk/LmZvckVhY2gocmVxdWVzdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5yZXNvbHZlKGZyYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZUZyYW1lKGZyYW1lKSB7XG4gICAgICAgIHRoaXMuI2ZyYW1lcy5kZWxldGUoZnJhbWUuX2lkKTtcbiAgICAgICAgdGhpcy4jcGFyZW50SWRzLmRlbGV0ZShmcmFtZS5faWQpO1xuICAgICAgICBpZiAoZnJhbWUuX3BhcmVudElkKSB7XG4gICAgICAgICAgICB0aGlzLiNjaGlsZElkcy5nZXQoZnJhbWUuX3BhcmVudElkKT8uZGVsZXRlKGZyYW1lLl9pZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNpc01haW5GcmFtZVN0YWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjaGlsZEZyYW1lcyhmcmFtZUlkKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkSWRzID0gdGhpcy4jY2hpbGRJZHMuZ2V0KGZyYW1lSWQpO1xuICAgICAgICBpZiAoIWNoaWxkSWRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oY2hpbGRJZHMpXG4gICAgICAgICAgICAubWFwKGlkID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEJ5SWQoaWQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigoZnJhbWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmcmFtZSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGFyZW50RnJhbWUoZnJhbWVJZCkge1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMuI3BhcmVudElkcy5nZXQoZnJhbWVJZCk7XG4gICAgICAgIHJldHVybiBwYXJlbnRJZCA/IHRoaXMuZ2V0QnlJZChwYXJlbnRJZCkgOiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnJhbWVUcmVlLmpzLm1hcCIsImltcG9ydCB7IGhlYWRlcnNBcnJheSwgSFRUUFJlcXVlc3QsIFNUQVRVU19URVhUUywgaGFuZGxlRXJyb3IsIH0gZnJvbSAnLi4vYXBpL0hUVFBSZXF1ZXN0LmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwSFRUUFJlcXVlc3QgZXh0ZW5kcyBIVFRQUmVxdWVzdCB7XG4gICAgaWQ7XG4gICAgI2NsaWVudDtcbiAgICAjaXNOYXZpZ2F0aW9uUmVxdWVzdDtcbiAgICAjdXJsO1xuICAgICNyZXNvdXJjZVR5cGU7XG4gICAgI21ldGhvZDtcbiAgICAjaGFzUG9zdERhdGEgPSBmYWxzZTtcbiAgICAjcG9zdERhdGE7XG4gICAgI2hlYWRlcnMgPSB7fTtcbiAgICAjZnJhbWU7XG4gICAgI2luaXRpYXRvcjtcbiAgICBnZXQgY2xpZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50O1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIGZyYW1lLCBpbnRlcmNlcHRpb25JZCwgYWxsb3dJbnRlcmNlcHRpb24sIGRhdGEsIHJlZGlyZWN0Q2hhaW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB0aGlzLmlkID0gZGF0YS5yZXF1ZXN0SWQ7XG4gICAgICAgIHRoaXMuI2lzTmF2aWdhdGlvblJlcXVlc3QgPVxuICAgICAgICAgICAgZGF0YS5yZXF1ZXN0SWQgPT09IGRhdGEubG9hZGVySWQgJiYgZGF0YS50eXBlID09PSAnRG9jdW1lbnQnO1xuICAgICAgICB0aGlzLl9pbnRlcmNlcHRpb25JZCA9IGludGVyY2VwdGlvbklkO1xuICAgICAgICB0aGlzLiN1cmwgPSBkYXRhLnJlcXVlc3QudXJsO1xuICAgICAgICB0aGlzLiNyZXNvdXJjZVR5cGUgPSAoZGF0YS50eXBlIHx8ICdvdGhlcicpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHRoaXMuI21ldGhvZCA9IGRhdGEucmVxdWVzdC5tZXRob2Q7XG4gICAgICAgIHRoaXMuI3Bvc3REYXRhID0gZGF0YS5yZXF1ZXN0LnBvc3REYXRhO1xuICAgICAgICB0aGlzLiNoYXNQb3N0RGF0YSA9IGRhdGEucmVxdWVzdC5oYXNQb3N0RGF0YSA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy4jZnJhbWUgPSBmcmFtZTtcbiAgICAgICAgdGhpcy5fcmVkaXJlY3RDaGFpbiA9IHJlZGlyZWN0Q2hhaW47XG4gICAgICAgIHRoaXMuI2luaXRpYXRvciA9IGRhdGEuaW5pdGlhdG9yO1xuICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5lbmFibGVkID0gYWxsb3dJbnRlcmNlcHRpb247XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEucmVxdWVzdC5oZWFkZXJzKSkge1xuICAgICAgICAgICAgdGhpcy4jaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN1cmw7XG4gICAgfVxuICAgIHJlc291cmNlVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlVHlwZTtcbiAgICB9XG4gICAgbWV0aG9kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWV0aG9kO1xuICAgIH1cbiAgICBwb3N0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Bvc3REYXRhO1xuICAgIH1cbiAgICBoYXNQb3N0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hhc1Bvc3REYXRhO1xuICAgIH1cbiAgICBhc3luYyBmZXRjaFBvc3REYXRhKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ05ldHdvcmsuZ2V0UmVxdWVzdFBvc3REYXRhJywge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5wb3N0RGF0YTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hlYWRlcnM7XG4gICAgfVxuICAgIHJlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2U7XG4gICAgfVxuICAgIGZyYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWU7XG4gICAgfVxuICAgIGlzTmF2aWdhdGlvblJlcXVlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc05hdmlnYXRpb25SZXF1ZXN0O1xuICAgIH1cbiAgICBpbml0aWF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpbml0aWF0b3I7XG4gICAgfVxuICAgIHJlZGlyZWN0Q2hhaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWRpcmVjdENoYWluLnNsaWNlKCk7XG4gICAgfVxuICAgIGZhaWx1cmUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZmFpbHVyZVRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvclRleHQ6IHRoaXMuX2ZhaWx1cmVUZXh0LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBfY29udGludWUob3ZlcnJpZGVzID0ge30pIHtcbiAgICAgICAgY29uc3QgeyB1cmwsIG1ldGhvZCwgcG9zdERhdGEsIGhlYWRlcnMgfSA9IG92ZXJyaWRlcztcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBvc3REYXRhQmluYXJ5QmFzZTY0ID0gcG9zdERhdGEgPyBidG9hKHBvc3REYXRhKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMuX2ludGVyY2VwdGlvbklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSFRUUFJlcXVlc3QgaXMgbWlzc2luZyBfaW50ZXJjZXB0aW9uSWQgbmVlZGVkIGZvciBGZXRjaC5jb250aW51ZVJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnRcbiAgICAgICAgICAgIC5zZW5kKCdGZXRjaC5jb250aW51ZVJlcXVlc3QnLCB7XG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHRoaXMuX2ludGVyY2VwdGlvbklkLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgcG9zdERhdGE6IHBvc3REYXRhQmluYXJ5QmFzZTY0LFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyA/IGhlYWRlcnNBcnJheShoZWFkZXJzKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5oYW5kbGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX3Jlc3BvbmQocmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGxldCBwYXJzZWRCb2R5O1xuICAgICAgICBpZiAocmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgcGFyc2VkQm9keSA9IEhUVFBSZXF1ZXN0LmdldFJlc3BvbnNlKHJlc3BvbnNlLmJvZHkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgb2YgT2JqZWN0LmtleXMocmVzcG9uc2UuaGVhZGVycykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgICAgICAgICByZXNwb25zZUhlYWRlcnNbaGVhZGVyLnRvTG93ZXJDYXNlKCldID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyB2YWx1ZS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLmNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICByZXNwb25zZUhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gcmVzcG9uc2UuY29udGVudFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZEJvZHk/LmNvbnRlbnRMZW5ndGggJiYgISgnY29udGVudC1sZW5ndGgnIGluIHJlc3BvbnNlSGVhZGVycykpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9IFN0cmluZyhwYXJzZWRCb2R5LmNvbnRlbnRMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cyB8fCAyMDA7XG4gICAgICAgIGlmICh0aGlzLl9pbnRlcmNlcHRpb25JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hUVFBSZXF1ZXN0IGlzIG1pc3NpbmcgX2ludGVyY2VwdGlvbklkIG5lZWRlZCBmb3IgRmV0Y2guZnVsZmlsbFJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnRcbiAgICAgICAgICAgIC5zZW5kKCdGZXRjaC5mdWxmaWxsUmVxdWVzdCcsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZDogdGhpcy5faW50ZXJjZXB0aW9uSWQsXG4gICAgICAgICAgICByZXNwb25zZUNvZGU6IHN0YXR1cyxcbiAgICAgICAgICAgIHJlc3BvbnNlUGhyYXNlOiBTVEFUVVNfVEVYVFNbc3RhdHVzXSxcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyczogaGVhZGVyc0FycmF5KHJlc3BvbnNlSGVhZGVycyksXG4gICAgICAgICAgICBib2R5OiBwYXJzZWRCb2R5Py5iYXNlNjQsXG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIF9hYm9ydChlcnJvclJlYXNvbikge1xuICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5oYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuX2ludGVyY2VwdGlvbklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSFRUUFJlcXVlc3QgaXMgbWlzc2luZyBfaW50ZXJjZXB0aW9uSWQgbmVlZGVkIGZvciBGZXRjaC5mYWlsUmVxdWVzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudFxuICAgICAgICAgICAgLnNlbmQoJ0ZldGNoLmZhaWxSZXF1ZXN0Jywge1xuICAgICAgICAgICAgcmVxdWVzdElkOiB0aGlzLl9pbnRlcmNlcHRpb25JZCxcbiAgICAgICAgICAgIGVycm9yUmVhc29uOiBlcnJvclJlYXNvbiB8fCAnRmFpbGVkJyxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChoYW5kbGVFcnJvcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SFRUUFJlcXVlc3QuanMubWFwIiwiaW1wb3J0IHsgSFRUUFJlc3BvbnNlIH0gZnJvbSAnLi4vYXBpL0hUVFBSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBQcm90b2NvbEVycm9yIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eURldGFpbHMgfSBmcm9tICcuLi9jb21tb24vU2VjdXJpdHlEZXRhaWxzLmpzJztcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi4vdXRpbC9EZWZlcnJlZC5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwSFRUUFJlc3BvbnNlIGV4dGVuZHMgSFRUUFJlc3BvbnNlIHtcbiAgICAjY2xpZW50O1xuICAgICNyZXF1ZXN0O1xuICAgICNjb250ZW50UHJvbWlzZSA9IG51bGw7XG4gICAgI2JvZHlMb2FkZWREZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICNyZW1vdGVBZGRyZXNzO1xuICAgICNzdGF0dXM7XG4gICAgI3N0YXR1c1RleHQ7XG4gICAgI3VybDtcbiAgICAjZnJvbURpc2tDYWNoZTtcbiAgICAjZnJvbVNlcnZpY2VXb3JrZXI7XG4gICAgI2hlYWRlcnMgPSB7fTtcbiAgICAjc2VjdXJpdHlEZXRhaWxzO1xuICAgICN0aW1pbmc7XG4gICAgY29uc3RydWN0b3IoY2xpZW50LCByZXF1ZXN0LCByZXNwb25zZVBheWxvYWQsIGV4dHJhSW5mbykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3JlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICB0aGlzLiNyZW1vdGVBZGRyZXNzID0ge1xuICAgICAgICAgICAgaXA6IHJlc3BvbnNlUGF5bG9hZC5yZW1vdGVJUEFkZHJlc3MsXG4gICAgICAgICAgICBwb3J0OiByZXNwb25zZVBheWxvYWQucmVtb3RlUG9ydCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3RhdHVzVGV4dCA9XG4gICAgICAgICAgICB0aGlzLiNwYXJzZVN0YXR1c1RleHRGcm9tRXh0cmFJbmZvKGV4dHJhSW5mbykgfHxcbiAgICAgICAgICAgICAgICByZXNwb25zZVBheWxvYWQuc3RhdHVzVGV4dDtcbiAgICAgICAgdGhpcy4jdXJsID0gcmVxdWVzdC51cmwoKTtcbiAgICAgICAgdGhpcy4jZnJvbURpc2tDYWNoZSA9ICEhcmVzcG9uc2VQYXlsb2FkLmZyb21EaXNrQ2FjaGU7XG4gICAgICAgIHRoaXMuI2Zyb21TZXJ2aWNlV29ya2VyID0gISFyZXNwb25zZVBheWxvYWQuZnJvbVNlcnZpY2VXb3JrZXI7XG4gICAgICAgIHRoaXMuI3N0YXR1cyA9IGV4dHJhSW5mbyA/IGV4dHJhSW5mby5zdGF0dXNDb2RlIDogcmVzcG9uc2VQYXlsb2FkLnN0YXR1cztcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGV4dHJhSW5mbyA/IGV4dHJhSW5mby5oZWFkZXJzIDogcmVzcG9uc2VQYXlsb2FkLmhlYWRlcnM7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgICB0aGlzLiNoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3NlY3VyaXR5RGV0YWlscyA9IHJlc3BvbnNlUGF5bG9hZC5zZWN1cml0eURldGFpbHNcbiAgICAgICAgICAgID8gbmV3IFNlY3VyaXR5RGV0YWlscyhyZXNwb25zZVBheWxvYWQuc2VjdXJpdHlEZXRhaWxzKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICB0aGlzLiN0aW1pbmcgPSByZXNwb25zZVBheWxvYWQudGltaW5nIHx8IG51bGw7XG4gICAgfVxuICAgICNwYXJzZVN0YXR1c1RleHRGcm9tRXh0cmFJbmZvKGV4dHJhSW5mbykge1xuICAgICAgICBpZiAoIWV4dHJhSW5mbyB8fCAhZXh0cmFJbmZvLmhlYWRlcnNUZXh0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RMaW5lID0gZXh0cmFJbmZvLmhlYWRlcnNUZXh0LnNwbGl0KCdcXHInLCAxKVswXTtcbiAgICAgICAgaWYgKCFmaXJzdExpbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXRjaCA9IGZpcnN0TGluZS5tYXRjaCgvW14gXSogW14gXSogKC4qKS8pO1xuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzVGV4dCA9IG1hdGNoWzFdO1xuICAgICAgICBpZiAoIXN0YXR1c1RleHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdHVzVGV4dDtcbiAgICB9XG4gICAgX3Jlc29sdmVCb2R5KGVycikge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jYm9keUxvYWRlZERlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNib2R5TG9hZGVkRGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdGVBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmVtb3RlQWRkcmVzcztcbiAgICB9XG4gICAgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdXJsO1xuICAgIH1cbiAgICBzdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0dXM7XG4gICAgfVxuICAgIHN0YXR1c1RleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0dXNUZXh0O1xuICAgIH1cbiAgICBoZWFkZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaGVhZGVycztcbiAgICB9XG4gICAgc2VjdXJpdHlEZXRhaWxzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc2VjdXJpdHlEZXRhaWxzO1xuICAgIH1cbiAgICB0aW1pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0aW1pbmc7XG4gICAgfVxuICAgIGJ1ZmZlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNjb250ZW50UHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy4jY29udGVudFByb21pc2UgPSB0aGlzLiNib2R5TG9hZGVkRGVmZXJyZWRcbiAgICAgICAgICAgICAgICAudmFsdWVPclRocm93KClcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnTmV0d29yay5nZXRSZXNwb25zZUJvZHknLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHRoaXMuI3JlcXVlc3QuaWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20ocmVzcG9uc2UuYm9keSwgcmVzcG9uc2UuYmFzZTY0RW5jb2RlZCA/ICdiYXNlNjQnIDogJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFByb3RvY29sRXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm9yaWdpbmFsTWVzc2FnZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTm8gcmVzb3VyY2Ugd2l0aCBnaXZlbiBpZGVudGlmaWVyIGZvdW5kJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGJvZHkgZm9yIHRoaXMgcmVxdWVzdC4gVGhpcyBtaWdodCBoYXBwZW4gaWYgdGhlIHJlcXVlc3QgaXMgYSBwcmVmbGlnaHQgcmVxdWVzdC4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jY29udGVudFByb21pc2U7XG4gICAgfVxuICAgIHJlcXVlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0O1xuICAgIH1cbiAgICBmcm9tQ2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmcm9tRGlza0NhY2hlIHx8IHRoaXMuI3JlcXVlc3QuX2Zyb21NZW1vcnlDYWNoZTtcbiAgICB9XG4gICAgZnJvbVNlcnZpY2VXb3JrZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmcm9tU2VydmljZVdvcmtlcjtcbiAgICB9XG4gICAgZnJhbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0LmZyYW1lKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SFRUUFJlc3BvbnNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBLZXlib2FyZCwgTW91c2UsIE1vdXNlQnV0dG9uLCBUb3VjaHNjcmVlbiwgfSBmcm9tICcuLi9hcGkvSW5wdXQuanMnO1xuaW1wb3J0IHsgX2tleURlZmluaXRpb25zLCB9IGZyb20gJy4uL2NvbW1vbi9VU0tleWJvYXJkTGF5b3V0LmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBLZXlib2FyZCBleHRlbmRzIEtleWJvYXJkIHtcbiAgICAjY2xpZW50O1xuICAgICNwcmVzc2VkS2V5cyA9IG5ldyBTZXQoKTtcbiAgICBfbW9kaWZpZXJzID0gMDtcbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICB1cGRhdGVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgYXN5bmMgZG93bihrZXksIG9wdGlvbnMgPSB7XG4gICAgICAgIHRleHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgY29tbWFuZHM6IFtdLFxuICAgIH0pIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLiNrZXlEZXNjcmlwdGlvbkZvclN0cmluZyhrZXkpO1xuICAgICAgICBjb25zdCBhdXRvUmVwZWF0ID0gdGhpcy4jcHJlc3NlZEtleXMuaGFzKGRlc2NyaXB0aW9uLmNvZGUpO1xuICAgICAgICB0aGlzLiNwcmVzc2VkS2V5cy5hZGQoZGVzY3JpcHRpb24uY29kZSk7XG4gICAgICAgIHRoaXMuX21vZGlmaWVycyB8PSB0aGlzLiNtb2RpZmllckJpdChkZXNjcmlwdGlvbi5rZXkpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gb3B0aW9ucy50ZXh0ID09PSB1bmRlZmluZWQgPyBkZXNjcmlwdGlvbi50ZXh0IDogb3B0aW9ucy50ZXh0O1xuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hLZXlFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6IHRleHQgPyAna2V5RG93bicgOiAncmF3S2V5RG93bicsXG4gICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuX21vZGlmaWVycyxcbiAgICAgICAgICAgIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogZGVzY3JpcHRpb24ua2V5Q29kZSxcbiAgICAgICAgICAgIGNvZGU6IGRlc2NyaXB0aW9uLmNvZGUsXG4gICAgICAgICAgICBrZXk6IGRlc2NyaXB0aW9uLmtleSxcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgICB1bm1vZGlmaWVkVGV4dDogdGV4dCxcbiAgICAgICAgICAgIGF1dG9SZXBlYXQsXG4gICAgICAgICAgICBsb2NhdGlvbjogZGVzY3JpcHRpb24ubG9jYXRpb24sXG4gICAgICAgICAgICBpc0tleXBhZDogZGVzY3JpcHRpb24ubG9jYXRpb24gPT09IDMsXG4gICAgICAgICAgICBjb21tYW5kczogb3B0aW9ucy5jb21tYW5kcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICNtb2RpZmllckJpdChrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ0FsdCcpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdDb250cm9sJykge1xuICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ01ldGEnKSB7XG4gICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSAnU2hpZnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gODtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgI2tleURlc2NyaXB0aW9uRm9yU3RyaW5nKGtleVN0cmluZykge1xuICAgICAgICBjb25zdCBzaGlmdCA9IHRoaXMuX21vZGlmaWVycyAmIDg7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0ge1xuICAgICAgICAgICAga2V5OiAnJyxcbiAgICAgICAgICAgIGtleUNvZGU6IDAsXG4gICAgICAgICAgICBjb2RlOiAnJyxcbiAgICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgICAgbG9jYXRpb246IDAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBfa2V5RGVmaW5pdGlvbnNba2V5U3RyaW5nXTtcbiAgICAgICAgYXNzZXJ0KGRlZmluaXRpb24sIGBVbmtub3duIGtleTogXCIke2tleVN0cmluZ31cImApO1xuICAgICAgICBpZiAoZGVmaW5pdGlvbi5rZXkpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLmtleSA9IGRlZmluaXRpb24ua2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaGlmdCAmJiBkZWZpbml0aW9uLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi5rZXkgPSBkZWZpbml0aW9uLnNoaWZ0S2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZpbml0aW9uLmtleUNvZGUpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLmtleUNvZGUgPSBkZWZpbml0aW9uLmtleUNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoaWZ0ICYmIGRlZmluaXRpb24uc2hpZnRLZXlDb2RlKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi5rZXlDb2RlID0gZGVmaW5pdGlvbi5zaGlmdEtleUNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmluaXRpb24uY29kZSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24uY29kZSA9IGRlZmluaXRpb24uY29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmaW5pdGlvbi5sb2NhdGlvbikge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24ubG9jYXRpb24gPSBkZWZpbml0aW9uLmxvY2F0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbi5rZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi50ZXh0ID0gZGVzY3JpcHRpb24ua2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZpbml0aW9uLnRleHQpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLnRleHQgPSBkZWZpbml0aW9uLnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoaWZ0ICYmIGRlZmluaXRpb24uc2hpZnRUZXh0KSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi50ZXh0ID0gZGVmaW5pdGlvbi5zaGlmdFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYW55IG1vZGlmaWVycyBiZXNpZGVzIHNoaWZ0IGFyZSBwcmVzc2VkLCBubyB0ZXh0IHNob3VsZCBiZSBzZW50XG4gICAgICAgIGlmICh0aGlzLl9tb2RpZmllcnMgJiB+OCkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24udGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgYXN5bmMgdXAoa2V5KSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy4ja2V5RGVzY3JpcHRpb25Gb3JTdHJpbmcoa2V5KTtcbiAgICAgICAgdGhpcy5fbW9kaWZpZXJzICY9IH50aGlzLiNtb2RpZmllckJpdChkZXNjcmlwdGlvbi5rZXkpO1xuICAgICAgICB0aGlzLiNwcmVzc2VkS2V5cy5kZWxldGUoZGVzY3JpcHRpb24uY29kZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaEtleUV2ZW50Jywge1xuICAgICAgICAgICAgdHlwZTogJ2tleVVwJyxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy5fbW9kaWZpZXJzLFxuICAgICAgICAgICAga2V5OiBkZXNjcmlwdGlvbi5rZXksXG4gICAgICAgICAgICB3aW5kb3dzVmlydHVhbEtleUNvZGU6IGRlc2NyaXB0aW9uLmtleUNvZGUsXG4gICAgICAgICAgICBjb2RlOiBkZXNjcmlwdGlvbi5jb2RlLFxuICAgICAgICAgICAgbG9jYXRpb246IGRlc2NyaXB0aW9uLmxvY2F0aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2VuZENoYXJhY3RlcihjaGFyKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5pbnNlcnRUZXh0JywgeyB0ZXh0OiBjaGFyIH0pO1xuICAgIH1cbiAgICBjaGFySXNLZXkoY2hhcikge1xuICAgICAgICByZXR1cm4gISFfa2V5RGVmaW5pdGlvbnNbY2hhcl07XG4gICAgfVxuICAgIGFzeW5jIHR5cGUodGV4dCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gb3B0aW9ucy5kZWxheSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hhciBvZiB0ZXh0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGFySXNLZXkoY2hhcikpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByZXNzKGNoYXIsIHsgZGVsYXkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChmLCBkZWxheSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRDaGFyYWN0ZXIoY2hhcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcHJlc3Moa2V5LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IG51bGwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGF3YWl0IHRoaXMuZG93bihrZXksIG9wdGlvbnMpO1xuICAgICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKGYgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGYsIG9wdGlvbnMuZGVsYXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy51cChrZXkpO1xuICAgIH1cbn1cbmNvbnN0IGdldEZsYWcgPSAoYnV0dG9uKSA9PiB7XG4gICAgc3dpdGNoIChidXR0b24pIHtcbiAgICAgICAgY2FzZSBNb3VzZUJ1dHRvbi5MZWZ0OlxuICAgICAgICAgICAgcmV0dXJuIDEgLyogTW91c2VCdXR0b25GbGFnLkxlZnQgKi87XG4gICAgICAgIGNhc2UgTW91c2VCdXR0b24uUmlnaHQ6XG4gICAgICAgICAgICByZXR1cm4gMiAvKiBNb3VzZUJ1dHRvbkZsYWcuUmlnaHQgKi87XG4gICAgICAgIGNhc2UgTW91c2VCdXR0b24uTWlkZGxlOlxuICAgICAgICAgICAgcmV0dXJuIDQgLyogTW91c2VCdXR0b25GbGFnLk1pZGRsZSAqLztcbiAgICAgICAgY2FzZSBNb3VzZUJ1dHRvbi5CYWNrOlxuICAgICAgICAgICAgcmV0dXJuIDggLyogTW91c2VCdXR0b25GbGFnLkJhY2sgKi87XG4gICAgICAgIGNhc2UgTW91c2VCdXR0b24uRm9yd2FyZDpcbiAgICAgICAgICAgIHJldHVybiAxNiAvKiBNb3VzZUJ1dHRvbkZsYWcuRm9yd2FyZCAqLztcbiAgICB9XG59O1xuLyoqXG4gKiBUaGlzIHNob3VsZCBtYXRjaFxuICogaHR0cHM6Ly9zb3VyY2UuY2hyb21pdW0ub3JnL2Nocm9taXVtL2Nocm9taXVtL3NyYy8rL3JlZnMvaGVhZHMvbWFpbjpjb250ZW50L2Jyb3dzZXIvcmVuZGVyZXJfaG9zdC9pbnB1dC93ZWJfaW5wdXRfZXZlbnRfYnVpbGRlcnNfbWFjLm1tO2RyYz1hNjFiOTVjNjNiMGI3NWMxY2ZlODcyZDljOGNkZjkyN2MyMjYwNDZlO2Jwdj0xO2JwdD0xO2w9MjIxLlxuICovXG5jb25zdCBnZXRCdXR0b25Gcm9tUHJlc3NlZEJ1dHRvbnMgPSAoYnV0dG9ucykgPT4ge1xuICAgIGlmIChidXR0b25zICYgMSAvKiBNb3VzZUJ1dHRvbkZsYWcuTGVmdCAqLykge1xuICAgICAgICByZXR1cm4gTW91c2VCdXR0b24uTGVmdDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnV0dG9ucyAmIDIgLyogTW91c2VCdXR0b25GbGFnLlJpZ2h0ICovKSB7XG4gICAgICAgIHJldHVybiBNb3VzZUJ1dHRvbi5SaWdodDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnV0dG9ucyAmIDQgLyogTW91c2VCdXR0b25GbGFnLk1pZGRsZSAqLykge1xuICAgICAgICByZXR1cm4gTW91c2VCdXR0b24uTWlkZGxlO1xuICAgIH1cbiAgICBlbHNlIGlmIChidXR0b25zICYgOCAvKiBNb3VzZUJ1dHRvbkZsYWcuQmFjayAqLykge1xuICAgICAgICByZXR1cm4gTW91c2VCdXR0b24uQmFjaztcbiAgICB9XG4gICAgZWxzZSBpZiAoYnV0dG9ucyAmIDE2IC8qIE1vdXNlQnV0dG9uRmxhZy5Gb3J3YXJkICovKSB7XG4gICAgICAgIHJldHVybiBNb3VzZUJ1dHRvbi5Gb3J3YXJkO1xuICAgIH1cbiAgICByZXR1cm4gJ25vbmUnO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBNb3VzZSBleHRlbmRzIE1vdXNlIHtcbiAgICAjY2xpZW50O1xuICAgICNrZXlib2FyZDtcbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIGtleWJvYXJkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICAgICAgdGhpcy4ja2V5Ym9hcmQgPSBrZXlib2FyZDtcbiAgICB9XG4gICAgdXBkYXRlQ2xpZW50KGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgICNfc3RhdGUgPSB7XG4gICAgICAgIHBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgYnV0dG9uczogMCAvKiBNb3VzZUJ1dHRvbkZsYWcuTm9uZSAqLyxcbiAgICB9O1xuICAgIGdldCAjc3RhdGUoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgLi4udGhpcy4jX3N0YXRlIH0sIC4uLnRoaXMuI3RyYW5zYWN0aW9ucyk7XG4gICAgfVxuICAgIC8vIFRyYW5zYWN0aW9ucyBjYW4gcnVuIGluIHBhcmFsbGVsLCBzbyB3ZSBzdG9yZSBlYWNoIG9mIHRobWUgaW4gdGhpcyBhcnJheS5cbiAgICAjdHJhbnNhY3Rpb25zID0gW107XG4gICAgI2NyZWF0ZVRyYW5zYWN0aW9uKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHt9O1xuICAgICAgICB0aGlzLiN0cmFuc2FjdGlvbnMucHVzaCh0cmFuc2FjdGlvbik7XG4gICAgICAgIGNvbnN0IHBvcFRyYW5zYWN0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jdHJhbnNhY3Rpb25zLnNwbGljZSh0aGlzLiN0cmFuc2FjdGlvbnMuaW5kZXhPZih0cmFuc2FjdGlvbiksIDEpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXBkYXRlOiAodXBkYXRlcykgPT4ge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odHJhbnNhY3Rpb24sIHVwZGF0ZXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbW1pdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI19zdGF0ZSA9IHsgLi4udGhpcy4jX3N0YXRlLCAuLi50cmFuc2FjdGlvbiB9O1xuICAgICAgICAgICAgICAgIHBvcFRyYW5zYWN0aW9uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm9sbGJhY2s6IHBvcFRyYW5zYWN0aW9uLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIGEgdHlwaWNhbCB1cGRhdGUsIGNvbW1pdC9yb2xsYmFjayBsaWZlY3ljbGUgYmFzZWQgb25cbiAgICAgKiB0aGUgZXJyb3Igb2YgdGhlIGFjdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyAjd2l0aFRyYW5zYWN0aW9uKGFjdGlvbikge1xuICAgICAgICBjb25zdCB7IHVwZGF0ZSwgY29tbWl0LCByb2xsYmFjayB9ID0gdGhpcy4jY3JlYXRlVHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGFjdGlvbih1cGRhdGUpO1xuICAgICAgICAgICAgY29tbWl0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByb2xsYmFjaygpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcmVzZXQoKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbZmxhZywgYnV0dG9uXSBvZiBbXG4gICAgICAgICAgICBbMSAvKiBNb3VzZUJ1dHRvbkZsYWcuTGVmdCAqLywgTW91c2VCdXR0b24uTGVmdF0sXG4gICAgICAgICAgICBbNCAvKiBNb3VzZUJ1dHRvbkZsYWcuTWlkZGxlICovLCBNb3VzZUJ1dHRvbi5NaWRkbGVdLFxuICAgICAgICAgICAgWzIgLyogTW91c2VCdXR0b25GbGFnLlJpZ2h0ICovLCBNb3VzZUJ1dHRvbi5SaWdodF0sXG4gICAgICAgICAgICBbMTYgLyogTW91c2VCdXR0b25GbGFnLkZvcndhcmQgKi8sIE1vdXNlQnV0dG9uLkZvcndhcmRdLFxuICAgICAgICAgICAgWzggLyogTW91c2VCdXR0b25GbGFnLkJhY2sgKi8sIE1vdXNlQnV0dG9uLkJhY2tdLFxuICAgICAgICBdKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jc3RhdGUuYnV0dG9ucyAmIGZsYWcpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zLnB1c2godGhpcy51cCh7IGJ1dHRvbjogYnV0dG9uIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jc3RhdGUucG9zaXRpb24ueCAhPT0gMCB8fCB0aGlzLiNzdGF0ZS5wb3NpdGlvbi55ICE9PSAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2godGhpcy5tb3ZlKDAsIDApKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChhY3Rpb25zKTtcbiAgICB9XG4gICAgYXN5bmMgbW92ZSh4LCB5LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzdGVwcyA9IDEgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGZyb20gPSB0aGlzLiNzdGF0ZS5wb3NpdGlvbjtcbiAgICAgICAgY29uc3QgdG8gPSB7IHgsIHkgfTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gc3RlcHM7IGkrKykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jd2l0aFRyYW5zYWN0aW9uKHVwZGF0ZVN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBmcm9tLnggKyAodG8ueCAtIGZyb20ueCkgKiAoaSAvIHN0ZXBzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGZyb20ueSArICh0by55IC0gZnJvbS55KSAqIChpIC8gc3RlcHMpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYnV0dG9ucywgcG9zaXRpb24gfSA9IHRoaXMuI3N0YXRlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50Jywge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbW91c2VNb3ZlZCcsXG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uOiBnZXRCdXR0b25Gcm9tUHJlc3NlZEJ1dHRvbnMoYnV0dG9ucyksXG4gICAgICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZG93bihvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBidXR0b24gPSBNb3VzZUJ1dHRvbi5MZWZ0LCBjbGlja0NvdW50ID0gMSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZmxhZyA9IGdldEZsYWcoYnV0dG9uKTtcbiAgICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG1vdXNlIGJ1dHRvbjogJHtidXR0b259YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3N0YXRlLmJ1dHRvbnMgJiBmbGFnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2J1dHRvbn0nIGlzIGFscmVhZHkgcHJlc3NlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiN3aXRoVHJhbnNhY3Rpb24odXBkYXRlU3RhdGUgPT4ge1xuICAgICAgICAgICAgdXBkYXRlU3RhdGUoe1xuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IHRoaXMuI3N0YXRlLmJ1dHRvbnMgfCBmbGFnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB7IGJ1dHRvbnMsIHBvc2l0aW9uIH0gPSB0aGlzLiNzdGF0ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50Jywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdtb3VzZVByZXNzZWQnLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgICAgICAgICBjbGlja0NvdW50LFxuICAgICAgICAgICAgICAgIGJ1dHRvbnMsXG4gICAgICAgICAgICAgICAgYnV0dG9uLFxuICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyB1cChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBidXR0b24gPSBNb3VzZUJ1dHRvbi5MZWZ0LCBjbGlja0NvdW50ID0gMSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZmxhZyA9IGdldEZsYWcoYnV0dG9uKTtcbiAgICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG1vdXNlIGJ1dHRvbjogJHtidXR0b259YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEodGhpcy4jc3RhdGUuYnV0dG9ucyAmIGZsYWcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2J1dHRvbn0nIGlzIG5vdCBwcmVzc2VkLmApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI3dpdGhUcmFuc2FjdGlvbih1cGRhdGVTdGF0ZSA9PiB7XG4gICAgICAgICAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgICAgICAgYnV0dG9uczogdGhpcy4jc3RhdGUuYnV0dG9ucyAmIH5mbGFnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB7IGJ1dHRvbnMsIHBvc2l0aW9uIH0gPSB0aGlzLiNzdGF0ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50Jywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdtb3VzZVJlbGVhc2VkJyxcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuI2tleWJvYXJkLl9tb2RpZmllcnMsXG4gICAgICAgICAgICAgICAgY2xpY2tDb3VudCxcbiAgICAgICAgICAgICAgICBidXR0b25zLFxuICAgICAgICAgICAgICAgIGJ1dHRvbixcbiAgICAgICAgICAgICAgICAuLi5wb3NpdGlvbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgY2xpY2soeCwgeSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXksIGNvdW50ID0gMSwgY2xpY2tDb3VudCA9IGNvdW50IH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAoY291bnQgPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NsaWNrIG11c3Qgb2NjdXIgYSBwb3NpdGl2ZSBudW1iZXIgb2YgdGltZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IFt0aGlzLm1vdmUoeCwgeSldO1xuICAgICAgICBpZiAoY2xpY2tDb3VudCA9PT0gY291bnQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY291bnQ7ICsraSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaCh0aGlzLmRvd24oeyAuLi5vcHRpb25zLCBjbGlja0NvdW50OiBpIH0pLCB0aGlzLnVwKHsgLi4ub3B0aW9ucywgY2xpY2tDb3VudDogaSB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWN0aW9ucy5wdXNoKHRoaXMuZG93bih7IC4uLm9wdGlvbnMsIGNsaWNrQ291bnQgfSkpO1xuICAgICAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYWN0aW9ucyk7XG4gICAgICAgICAgICBhY3Rpb25zLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFjdGlvbnMucHVzaCh0aGlzLnVwKHsgLi4ub3B0aW9ucywgY2xpY2tDb3VudCB9KSk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGFjdGlvbnMpO1xuICAgIH1cbiAgICBhc3luYyB3aGVlbChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBkZWx0YVggPSAwLCBkZWx0YVkgPSAwIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCB7IHBvc2l0aW9uLCBidXR0b25zIH0gPSB0aGlzLiNzdGF0ZTtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ0lucHV0LmRpc3BhdGNoTW91c2VFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdtb3VzZVdoZWVsJyxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiAnbW91c2UnLFxuICAgICAgICAgICAgbW9kaWZpZXJzOiB0aGlzLiNrZXlib2FyZC5fbW9kaWZpZXJzLFxuICAgICAgICAgICAgZGVsdGFZLFxuICAgICAgICAgICAgZGVsdGFYLFxuICAgICAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZyhzdGFydCwgdGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5vbmNlKCdJbnB1dC5kcmFnSW50ZXJjZXB0ZWQnLCBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMubW92ZShzdGFydC54LCBzdGFydC55KTtcbiAgICAgICAgYXdhaXQgdGhpcy5kb3duKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubW92ZSh0YXJnZXQueCwgdGFyZ2V0LnkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZ0VudGVyKHRhcmdldCwgZGF0YSkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hEcmFnRXZlbnQnLCB7XG4gICAgICAgICAgICB0eXBlOiAnZHJhZ0VudGVyJyxcbiAgICAgICAgICAgIHg6IHRhcmdldC54LFxuICAgICAgICAgICAgeTogdGFyZ2V0LnksXG4gICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuI2tleWJvYXJkLl9tb2RpZmllcnMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZ092ZXIodGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaERyYWdFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdkcmFnT3ZlcicsXG4gICAgICAgICAgICB4OiB0YXJnZXQueCxcbiAgICAgICAgICAgIHk6IHRhcmdldC55LFxuICAgICAgICAgICAgbW9kaWZpZXJzOiB0aGlzLiNrZXlib2FyZC5fbW9kaWZpZXJzLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGRyb3AodGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaERyYWdFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdkcm9wJyxcbiAgICAgICAgICAgIHg6IHRhcmdldC54LFxuICAgICAgICAgICAgeTogdGFyZ2V0LnksXG4gICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuI2tleWJvYXJkLl9tb2RpZmllcnMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZ0FuZERyb3Aoc3RhcnQsIHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSBudWxsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5kcmFnKHN0YXJ0LCB0YXJnZXQpO1xuICAgICAgICBhd2FpdCB0aGlzLmRyYWdFbnRlcih0YXJnZXQsIGRhdGEpO1xuICAgICAgICBhd2FpdCB0aGlzLmRyYWdPdmVyKHRhcmdldCwgZGF0YSk7XG4gICAgICAgIGlmIChkZWxheSkge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5kcm9wKHRhcmdldCwgZGF0YSk7XG4gICAgICAgIGF3YWl0IHRoaXMudXAoKTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwVG91Y2hzY3JlZW4gZXh0ZW5kcyBUb3VjaHNjcmVlbiB7XG4gICAgI2NsaWVudDtcbiAgICAja2V5Ym9hcmQ7XG4gICAgY29uc3RydWN0b3IoY2xpZW50LCBrZXlib2FyZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI2tleWJvYXJkID0ga2V5Ym9hcmQ7XG4gICAgfVxuICAgIHVwZGF0ZUNsaWVudChjbGllbnQpIHtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICBhc3luYyB0b3VjaFN0YXJ0KHgsIHkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ0lucHV0LmRpc3BhdGNoVG91Y2hFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICd0b3VjaFN0YXJ0JyxcbiAgICAgICAgICAgIHRvdWNoUG9pbnRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB4OiBNYXRoLnJvdW5kKHgpLFxuICAgICAgICAgICAgICAgICAgICB5OiBNYXRoLnJvdW5kKHkpLFxuICAgICAgICAgICAgICAgICAgICByYWRpdXNYOiAwLjUsXG4gICAgICAgICAgICAgICAgICAgIHJhZGl1c1k6IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2U6IDAuNSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHRvdWNoTW92ZSh4LCB5KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaFRvdWNoRXZlbnQnLCB7XG4gICAgICAgICAgICB0eXBlOiAndG91Y2hNb3ZlJyxcbiAgICAgICAgICAgIHRvdWNoUG9pbnRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB4OiBNYXRoLnJvdW5kKHgpLFxuICAgICAgICAgICAgICAgICAgICB5OiBNYXRoLnJvdW5kKHkpLFxuICAgICAgICAgICAgICAgICAgICByYWRpdXNYOiAwLjUsXG4gICAgICAgICAgICAgICAgICAgIHJhZGl1c1k6IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2U6IDAuNSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHRvdWNoRW5kKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50Jywge1xuICAgICAgICAgICAgdHlwZTogJ3RvdWNoRW5kJyxcbiAgICAgICAgICAgIHRvdWNoUG9pbnRzOiBbXSxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBtYXAsIHJhY2VXaXRoIH0gZnJvbSAnLi4vLi4vdGhpcmRfcGFydHkvcnhqcy9yeGpzLmpzJztcbmltcG9ydCB7IFJlYWxtIH0gZnJvbSAnLi4vYXBpL1JlYWxtLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZnJvbUVtaXR0ZXJFdmVudCwgdGltZW91dCwgd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlU3ltYm9sIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IENkcEVsZW1lbnRIYW5kbGUgfSBmcm9tICcuL0VsZW1lbnRIYW5kbGUuanMnO1xuaW1wb3J0IHsgQ2RwSlNIYW5kbGUgfSBmcm9tICcuL0pTSGFuZGxlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBJc29sYXRlZFdvcmxkIGV4dGVuZHMgUmVhbG0ge1xuICAgICNjb250ZXh0O1xuICAgICNlbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICNmcmFtZU9yV29ya2VyO1xuICAgIGNvbnN0cnVjdG9yKGZyYW1lT3JXb3JrZXIsIHRpbWVvdXRTZXR0aW5ncykge1xuICAgICAgICBzdXBlcih0aW1lb3V0U2V0dGluZ3MpO1xuICAgICAgICB0aGlzLiNmcmFtZU9yV29ya2VyID0gZnJhbWVPcldvcmtlcjtcbiAgICB9XG4gICAgZ2V0IGVudmlyb25tZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVPcldvcmtlcjtcbiAgICB9XG4gICAgZ2V0IGNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZyYW1lT3JXb3JrZXIuY2xpZW50O1xuICAgIH1cbiAgICBnZXQgZW1pdHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2VtaXR0ZXI7XG4gICAgfVxuICAgIHNldENvbnRleHQoY29udGV4dCkge1xuICAgICAgICB0aGlzLiNjb250ZXh0Py5bZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgY29udGV4dC5vbmNlKCdkaXNwb3NlZCcsIHRoaXMuI29uQ29udGV4dERpc3Bvc2VkLmJpbmQodGhpcykpO1xuICAgICAgICBjb250ZXh0Lm9uKCdjb25zb2xlYXBpY2FsbGVkJywgdGhpcy4jb25Db250ZXh0Q29uc29sZUFwaUNhbGxlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgY29udGV4dC5vbignYmluZGluZ2NhbGxlZCcsIHRoaXMuI29uQ29udGV4dEJpbmRpbmdDYWxsZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuI2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLiNlbWl0dGVyLmVtaXQoJ2NvbnRleHQnLCBjb250ZXh0KTtcbiAgICAgICAgdm9pZCB0aGlzLnRhc2tNYW5hZ2VyLnJlcnVuQWxsKCk7XG4gICAgfVxuICAgICNvbkNvbnRleHREaXNwb3NlZCgpIHtcbiAgICAgICAgdGhpcy4jY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCdjbGVhckRvY3VtZW50SGFuZGxlJyBpbiB0aGlzLiNmcmFtZU9yV29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU9yV29ya2VyLmNsZWFyRG9jdW1lbnRIYW5kbGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjb25Db250ZXh0Q29uc29sZUFwaUNhbGxlZChldmVudCkge1xuICAgICAgICB0aGlzLiNlbWl0dGVyLmVtaXQoJ2NvbnNvbGVhcGljYWxsZWQnLCBldmVudCk7XG4gICAgfVxuICAgICNvbkNvbnRleHRCaW5kaW5nQ2FsbGVkKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuI2VtaXR0ZXIuZW1pdCgnYmluZGluZ2NhbGxlZCcsIGV2ZW50KTtcbiAgICB9XG4gICAgaGFzQ29udGV4dCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy4jY29udGV4dDtcbiAgICB9XG4gICAgZ2V0IGNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb250ZXh0O1xuICAgIH1cbiAgICAjZXhlY3V0aW9uQ29udGV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhlY3V0aW9uIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBkZXRhY2hlZCBmcmFtZSBvciB3b3JrZXIgXCIke3RoaXMuZW52aXJvbm1lbnQudXJsKCl9XCIgKGFyZSB5b3UgdHJ5aW5nIHRvIGV2YWx1YXRlPylgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jY29udGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgZm9yIHRoZSBuZXh0IGNvbnRleHQgdG8gYmUgc2V0IG9uIHRoZSBpc29sYXRlZCB3b3JsZC5cbiAgICAgKi9cbiAgICBhc3luYyAjd2FpdEZvckV4ZWN1dGlvbkNvbnRleHQoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGZyb21FbWl0dGVyRXZlbnQodGhpcy4jZW1pdHRlciwgJ2NvbnRleHQnKS5waXBlKHJhY2VXaXRoKGZyb21FbWl0dGVyRXZlbnQodGhpcy4jZW1pdHRlciwgJ2Rpc3Bvc2VkJykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIG1lc3NhZ2UgaGFzIHRvIG1hdGNoIHRoZSBDRFAgbWVzc2FnZSBleHBlY3RlZCBieSB0aGUgV2FpdFRhc2sgY2xhc3MuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4ZWN1dGlvbiBjb250ZXh0IHdhcyBkZXN0cm95ZWQnKTtcbiAgICAgICAgfSkpLCB0aW1lb3V0KHRoaXMudGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSkpKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIGV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgLy8gVGhpcyBjb2RlIG5lZWRzIHRvIHNjaGVkdWxlIGV2YWx1YXRlSGFuZGxlIGNhbGwgc3luY2hyb25pb3VzbHkgKGF0XG4gICAgICAgIC8vIGxlYXN0IHdoZW4gdGhlIGNvbnRleHQgaXMgdGhlcmUpIHNvIHdlIGNhbm5vdCB1bmNvbmRpdGlvbmFsbHlcbiAgICAgICAgLy8gYXdhaXQuXG4gICAgICAgIGxldCBjb250ZXh0ID0gdGhpcy4jZXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSBhd2FpdCB0aGlzLiN3YWl0Rm9yRXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgfVxuICAgIGFzeW5jIGV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgLy8gVGhpcyBjb2RlIG5lZWRzIHRvIHNjaGVkdWxlIGV2YWx1YXRlIGNhbGwgc3luY2hyb25pb3VzbHkgKGF0XG4gICAgICAgIC8vIGxlYXN0IHdoZW4gdGhlIGNvbnRleHQgaXMgdGhlcmUpIHNvIHdlIGNhbm5vdCB1bmNvbmRpdGlvbmFsbHlcbiAgICAgICAgLy8gYXdhaXQuXG4gICAgICAgIGxldCBjb250ZXh0ID0gdGhpcy4jZXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSBhd2FpdCB0aGlzLiN3YWl0Rm9yRXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBjb250ZXh0LmV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgfVxuICAgIGFzeW5jIGFkb3B0QmFja2VuZE5vZGUoYmFja2VuZE5vZGVJZCkge1xuICAgICAgICAvLyBUaGlzIGNvZGUgbmVlZHMgdG8gc2NoZWR1bGUgcmVzb2x2ZU5vZGUgY2FsbCBzeW5jaHJvbmlvdXNseSAoYXRcbiAgICAgICAgLy8gbGVhc3Qgd2hlbiB0aGUgY29udGV4dCBpcyB0aGVyZSkgc28gd2UgY2Fubm90IHVuY29uZGl0aW9uYWxseVxuICAgICAgICAvLyBhd2FpdC5cbiAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLiNleGVjdXRpb25Db250ZXh0KCk7XG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgICAgY29udGV4dCA9IGF3YWl0IHRoaXMuI3dhaXRGb3JFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBvYmplY3QgfSA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoJ0RPTS5yZXNvbHZlTm9kZScsIHtcbiAgICAgICAgICAgIGJhY2tlbmROb2RlSWQ6IGJhY2tlbmROb2RlSWQsXG4gICAgICAgICAgICBleGVjdXRpb25Db250ZXh0SWQ6IGNvbnRleHQuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDZHBIYW5kbGUob2JqZWN0KTtcbiAgICB9XG4gICAgYXN5bmMgYWRvcHRIYW5kbGUoaGFuZGxlKSB7XG4gICAgICAgIGlmIChoYW5kbGUucmVhbG0gPT09IHRoaXMpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb250ZXh0IGhhcyBhbHJlYWR5IGFkb3B0ZWQgdGhpcyBoYW5kbGUsIGNsb25lIGl0IHNvIGRvd25zdHJlYW1cbiAgICAgICAgICAgIC8vIGRpc3Bvc2FsIGRvZXNuJ3QgYmVjb21lIGFuIGlzc3VlLlxuICAgICAgICAgICAgcmV0dXJuIChhd2FpdCBoYW5kbGUuZXZhbHVhdGVIYW5kbGUodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub2RlSW5mbyA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoJ0RPTS5kZXNjcmliZU5vZGUnLCB7XG4gICAgICAgICAgICBvYmplY3RJZDogaGFuZGxlLmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmFkb3B0QmFja2VuZE5vZGUobm9kZUluZm8ubm9kZS5iYWNrZW5kTm9kZUlkKSk7XG4gICAgfVxuICAgIGFzeW5jIHRyYW5zZmVySGFuZGxlKGhhbmRsZSkge1xuICAgICAgICBpZiAoaGFuZGxlLnJlYWxtID09PSB0aGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEltcGxpZXMgaXQncyBhIHByaW1pdGl2ZSB2YWx1ZSwgcHJvYmFibHkuXG4gICAgICAgIGlmIChoYW5kbGUucmVtb3RlT2JqZWN0KCkub2JqZWN0SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnRE9NLmRlc2NyaWJlTm9kZScsIHtcbiAgICAgICAgICAgIG9iamVjdElkOiBoYW5kbGUucmVtb3RlT2JqZWN0KCkub2JqZWN0SWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBuZXdIYW5kbGUgPSAoYXdhaXQgdGhpcy5hZG9wdEJhY2tlbmROb2RlKGluZm8ubm9kZS5iYWNrZW5kTm9kZUlkKSk7XG4gICAgICAgIGF3YWl0IGhhbmRsZS5kaXNwb3NlKCk7XG4gICAgICAgIHJldHVybiBuZXdIYW5kbGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNyZWF0ZUNkcEhhbmRsZShyZW1vdGVPYmplY3QpIHtcbiAgICAgICAgaWYgKHJlbW90ZU9iamVjdC5zdWJ0eXBlID09PSAnbm9kZScpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2RwRWxlbWVudEhhbmRsZSh0aGlzLCByZW1vdGVPYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2RwSlNIYW5kbGUodGhpcywgcmVtb3RlT2JqZWN0KTtcbiAgICB9XG4gICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICB0aGlzLiNjb250ZXh0Py5bZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgdGhpcy4jZW1pdHRlci5lbWl0KCdkaXNwb3NlZCcsIHVuZGVmaW5lZCk7XG4gICAgICAgIHN1cGVyW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIHRoaXMuI2VtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SXNvbGF0ZWRXb3JsZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBBIHVuaXF1ZSBrZXkgZm9yIHtAbGluayBJc29sYXRlZFdvcmxkQ2hhcnR9IHRvIGRlbm90ZSB0aGUgZGVmYXVsdCB3b3JsZC5cbiAqIEV4ZWN1dGlvbiBjb250ZXh0cyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGluIHRoZSBkZWZhdWx0IHdvcmxkLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTUFJTl9XT1JMRCA9IFN5bWJvbCgnbWFpbldvcmxkJyk7XG4vKipcbiAqIEEgdW5pcXVlIGtleSBmb3Ige0BsaW5rIElzb2xhdGVkV29ybGRDaGFydH0gdG8gZGVub3RlIHRoZSBwdXBwZXRlZXIgd29ybGQuXG4gKiBUaGlzIHdvcmxkIGNvbnRhaW5zIGFsbCBwdXBwZXRlZXItaW50ZXJuYWwgYmluZGluZ3MvY29kZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFBVUFBFVEVFUl9XT1JMRCA9IFN5bWJvbCgncHVwcGV0ZWVyV29ybGQnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlzb2xhdGVkV29ybGRzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBKU0hhbmRsZSB9IGZyb20gJy4uL2FwaS9KU0hhbmRsZS5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgdmFsdWVGcm9tUmVtb3RlT2JqZWN0IH0gZnJvbSAnLi91dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwSlNIYW5kbGUgZXh0ZW5kcyBKU0hhbmRsZSB7XG4gICAgI2Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgI3JlbW90ZU9iamVjdDtcbiAgICAjd29ybGQ7XG4gICAgY29uc3RydWN0b3Iod29ybGQsIHJlbW90ZU9iamVjdCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiN3b3JsZCA9IHdvcmxkO1xuICAgICAgICB0aGlzLiNyZW1vdGVPYmplY3QgPSByZW1vdGVPYmplY3Q7XG4gICAgfVxuICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VkO1xuICAgIH1cbiAgICBnZXQgcmVhbG0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3b3JsZDtcbiAgICB9XG4gICAgZ2V0IGNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhbG0uZW52aXJvbm1lbnQuY2xpZW50O1xuICAgIH1cbiAgICBhc3luYyBqc29uVmFsdWUoKSB7XG4gICAgICAgIGlmICghdGhpcy4jcmVtb3RlT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVGcm9tUmVtb3RlT2JqZWN0KHRoaXMuI3JlbW90ZU9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKG9iamVjdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHNlcmlhbGl6ZSByZWZlcmVuY2VkIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGBudWxsYCBvciB0aGUgaGFuZGxlIGl0c2VsZiBpZiB0aGUgaGFuZGxlIGlzIGFuXG4gICAgICogaW5zdGFuY2Ugb2Yge0BsaW5rIEVsZW1lbnRIYW5kbGV9LlxuICAgICAqL1xuICAgIGFzRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGFzeW5jIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgcmVsZWFzZU9iamVjdCh0aGlzLmNsaWVudCwgdGhpcy4jcmVtb3RlT2JqZWN0KTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmICghdGhpcy4jcmVtb3RlT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0pTSGFuZGxlOicgKyB2YWx1ZUZyb21SZW1vdGVPYmplY3QodGhpcy4jcmVtb3RlT2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy4jcmVtb3RlT2JqZWN0LnN1YnR5cGUgfHwgdGhpcy4jcmVtb3RlT2JqZWN0LnR5cGU7XG4gICAgICAgIHJldHVybiAnSlNIYW5kbGVAJyArIHR5cGU7XG4gICAgfVxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3JlbW90ZU9iamVjdC5vYmplY3RJZDtcbiAgICB9XG4gICAgcmVtb3RlT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmVtb3RlT2JqZWN0O1xuICAgIH1cbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKCkge1xuICAgICAgICAvLyBXZSB1c2UgUnVudGltZS5nZXRQcm9wZXJ0aWVzIHJhdGhlciB0aGFuIGl0ZXJhdGl2ZSB2ZXJzaW9uIGZvclxuICAgICAgICAvLyBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhcyBpdCBhbGxvd3MgZ2V0dGluZyBldmVyeXRoaW5nIGF0IG9uY2UuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnUnVudGltZS5nZXRQcm9wZXJ0aWVzJywge1xuICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuI3JlbW90ZU9iamVjdC5vYmplY3RJZCxcbiAgICAgICAgICAgIG93blByb3BlcnRpZXM6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcmVzcG9uc2UucmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5LmVudW1lcmFibGUgfHwgIXByb3BlcnR5LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQuc2V0KHByb3BlcnR5Lm5hbWUsIHRoaXMuI3dvcmxkLmNyZWF0ZUNkcEhhbmRsZShwcm9wZXJ0eS52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VPYmplY3QoY2xpZW50LCByZW1vdGVPYmplY3QpIHtcbiAgICBpZiAoIXJlbW90ZU9iamVjdC5vYmplY3RJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGNsaWVudFxuICAgICAgICAuc2VuZCgnUnVudGltZS5yZWxlYXNlT2JqZWN0JywgeyBvYmplY3RJZDogcmVtb3RlT2JqZWN0Lm9iamVjdElkIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIC8vIEV4Y2VwdGlvbnMgbWlnaHQgaGFwcGVuIGluIGNhc2Ugb2YgYSBwYWdlIGJlZW4gbmF2aWdhdGVkIG9yIGNsb3NlZC5cbiAgICAgICAgLy8gU3dhbGxvdyB0aGVzZSBzaW5jZSB0aGV5IGFyZSBoYXJtbGVzcyBhbmQgd2UgZG9uJ3QgbGVhayBhbnl0aGluZyBpbiB0aGlzIGNhc2UuXG4gICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SlNIYW5kbGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IEZyYW1lRXZlbnQgfSBmcm9tICcuLi9hcGkvRnJhbWUuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlckV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL05ldHdvcmtNYW5hZ2VyRXZlbnRzLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi4vdXRpbC9EZWZlcnJlZC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2sgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgRnJhbWVNYW5hZ2VyRXZlbnQgfSBmcm9tICcuL0ZyYW1lTWFuYWdlckV2ZW50cy5qcyc7XG5jb25zdCBwdXBwZXRlZXJUb1Byb3RvY29sTGlmZWN5Y2xlID0gbmV3IE1hcChbXG4gICAgWydsb2FkJywgJ2xvYWQnXSxcbiAgICBbJ2RvbWNvbnRlbnRsb2FkZWQnLCAnRE9NQ29udGVudExvYWRlZCddLFxuICAgIFsnbmV0d29ya2lkbGUwJywgJ25ldHdvcmtJZGxlJ10sXG4gICAgWyduZXR3b3JraWRsZTInLCAnbmV0d29ya0FsbW9zdElkbGUnXSxcbl0pO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIExpZmVjeWNsZVdhdGNoZXIge1xuICAgICNleHBlY3RlZExpZmVjeWNsZTtcbiAgICAjZnJhbWU7XG4gICAgI3RpbWVvdXQ7XG4gICAgI25hdmlnYXRpb25SZXF1ZXN0ID0gbnVsbDtcbiAgICAjc3Vic2NyaXB0aW9ucyA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTtcbiAgICAjaW5pdGlhbExvYWRlcklkO1xuICAgICN0ZXJtaW5hdGlvbkRlZmVycmVkO1xuICAgICNzYW1lRG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAjbGlmZWN5Y2xlRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAjbmV3RG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAjaGFzU2FtZURvY3VtZW50TmF2aWdhdGlvbjtcbiAgICAjc3dhcHBlZDtcbiAgICAjbmF2aWdhdGlvblJlc3BvbnNlUmVjZWl2ZWQ7XG4gICAgY29uc3RydWN0b3IobmV0d29ya01hbmFnZXIsIGZyYW1lLCB3YWl0VW50aWwsIHRpbWVvdXQpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2FpdFVudGlsKSkge1xuICAgICAgICAgICAgd2FpdFVudGlsID0gd2FpdFVudGlsLnNsaWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHdhaXRVbnRpbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHdhaXRVbnRpbCA9IFt3YWl0VW50aWxdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2luaXRpYWxMb2FkZXJJZCA9IGZyYW1lLl9sb2FkZXJJZDtcbiAgICAgICAgdGhpcy4jZXhwZWN0ZWRMaWZlY3ljbGUgPSB3YWl0VW50aWwubWFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3RvY29sRXZlbnQgPSBwdXBwZXRlZXJUb1Byb3RvY29sTGlmZWN5Y2xlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBhc3NlcnQocHJvdG9jb2xFdmVudCwgJ1Vua25vd24gdmFsdWUgZm9yIG9wdGlvbnMud2FpdFVudGlsOiAnICsgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sRXZlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNmcmFtZSA9IGZyYW1lO1xuICAgICAgICB0aGlzLiN0aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgY29uc3QgZnJhbWVNYW5hZ2VyRW1pdHRlciA9IHRoaXMuI3N1YnNjcmlwdGlvbnMudXNlKG5ldyBFdmVudEVtaXR0ZXIoZnJhbWUuX2ZyYW1lTWFuYWdlcikpO1xuICAgICAgICBmcmFtZU1hbmFnZXJFbWl0dGVyLm9uKEZyYW1lTWFuYWdlckV2ZW50LkxpZmVjeWNsZUV2ZW50LCB0aGlzLiNjaGVja0xpZmVjeWNsZUNvbXBsZXRlLmJpbmQodGhpcykpO1xuICAgICAgICBjb25zdCBmcmFtZUVtaXR0ZXIgPSB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRFbWl0dGVyKGZyYW1lKSk7XG4gICAgICAgIGZyYW1lRW1pdHRlci5vbihGcmFtZUV2ZW50LkZyYW1lTmF2aWdhdGVkV2l0aGluRG9jdW1lbnQsIHRoaXMuI25hdmlnYXRlZFdpdGhpbkRvY3VtZW50LmJpbmQodGhpcykpO1xuICAgICAgICBmcmFtZUVtaXR0ZXIub24oRnJhbWVFdmVudC5GcmFtZU5hdmlnYXRlZCwgdGhpcy4jbmF2aWdhdGVkLmJpbmQodGhpcykpO1xuICAgICAgICBmcmFtZUVtaXR0ZXIub24oRnJhbWVFdmVudC5GcmFtZVN3YXBwZWQsIHRoaXMuI2ZyYW1lU3dhcHBlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgZnJhbWVFbWl0dGVyLm9uKEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkQnlBY3RpdmF0aW9uLCB0aGlzLiNmcmFtZVN3YXBwZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIGZyYW1lRW1pdHRlci5vbihGcmFtZUV2ZW50LkZyYW1lRGV0YWNoZWQsIHRoaXMuI29uRnJhbWVEZXRhY2hlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgY29uc3QgbmV0d29ya01hbmFnZXJFbWl0dGVyID0gdGhpcy4jc3Vic2NyaXB0aW9ucy51c2UobmV3IEV2ZW50RW1pdHRlcihuZXR3b3JrTWFuYWdlcikpO1xuICAgICAgICBuZXR3b3JrTWFuYWdlckVtaXR0ZXIub24oTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0LCB0aGlzLiNvblJlcXVlc3QuYmluZCh0aGlzKSk7XG4gICAgICAgIG5ldHdvcmtNYW5hZ2VyRW1pdHRlci5vbihOZXR3b3JrTWFuYWdlckV2ZW50LlJlc3BvbnNlLCB0aGlzLiNvblJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgICAgICBuZXR3b3JrTWFuYWdlckVtaXR0ZXIub24oTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmFpbGVkLCB0aGlzLiNvblJlcXVlc3RGYWlsZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuI3Rlcm1pbmF0aW9uRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoe1xuICAgICAgICAgICAgdGltZW91dDogdGhpcy4jdGltZW91dCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBOYXZpZ2F0aW9uIHRpbWVvdXQgb2YgJHt0aGlzLiN0aW1lb3V0fSBtcyBleGNlZWRlZGAsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNjaGVja0xpZmVjeWNsZUNvbXBsZXRlKCk7XG4gICAgfVxuICAgICNvblJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5mcmFtZSgpICE9PSB0aGlzLiNmcmFtZSB8fCAhcmVxdWVzdC5pc05hdmlnYXRpb25SZXF1ZXN0KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNuYXZpZ2F0aW9uUmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICAgIC8vIFJlc29sdmUgcHJldmlvdXMgbmF2aWdhdGlvbiByZXNwb25zZSBpbiBjYXNlIHRoZXJlIGFyZSBtdWx0aXBsZVxuICAgICAgICAvLyBuYXZpZ2F0aW9uIHJlcXVlc3RzIHJlcG9ydGVkIGJ5IHRoZSBiYWNrZW5kLiBUaGlzIGdlbmVyYWxseSBzaG91bGQgbm90XG4gICAgICAgIC8vIGhhcHBlbiBieSBpdCBsb29rcyBsaWtlIGl0J3MgcG9zc2libGUuXG4gICAgICAgIHRoaXMuI25hdmlnYXRpb25SZXNwb25zZVJlY2VpdmVkPy5yZXNvbHZlKCk7XG4gICAgICAgIHRoaXMuI25hdmlnYXRpb25SZXNwb25zZVJlY2VpdmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgICAgIGlmIChyZXF1ZXN0LnJlc3BvbnNlKCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuI25hdmlnYXRpb25SZXNwb25zZVJlY2VpdmVkPy5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uUmVxdWVzdEZhaWxlZChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICh0aGlzLiNuYXZpZ2F0aW9uUmVxdWVzdD8uaWQgIT09IHJlcXVlc3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNuYXZpZ2F0aW9uUmVzcG9uc2VSZWNlaXZlZD8ucmVzb2x2ZSgpO1xuICAgIH1cbiAgICAjb25SZXNwb25zZShyZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy4jbmF2aWdhdGlvblJlcXVlc3Q/LmlkICE9PSByZXNwb25zZS5yZXF1ZXN0KCkuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNuYXZpZ2F0aW9uUmVzcG9uc2VSZWNlaXZlZD8ucmVzb2x2ZSgpO1xuICAgIH1cbiAgICAjb25GcmFtZURldGFjaGVkKGZyYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLiNmcmFtZSA9PT0gZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuI3Rlcm1pbmF0aW9uRGVmZXJyZWQucmVzb2x2ZShuZXcgRXJyb3IoJ05hdmlnYXRpbmcgZnJhbWUgd2FzIGRldGFjaGVkJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2NoZWNrTGlmZWN5Y2xlQ29tcGxldGUoKTtcbiAgICB9XG4gICAgYXN5bmMgbmF2aWdhdGlvblJlc3BvbnNlKCkge1xuICAgICAgICAvLyBDb250aW51ZSB3aXRoIGEgcG9zc2libHkgbnVsbCByZXNwb25zZS5cbiAgICAgICAgYXdhaXQgdGhpcy4jbmF2aWdhdGlvblJlc3BvbnNlUmVjZWl2ZWQ/LnZhbHVlT3JUaHJvdygpO1xuICAgICAgICByZXR1cm4gdGhpcy4jbmF2aWdhdGlvblJlcXVlc3QgPyB0aGlzLiNuYXZpZ2F0aW9uUmVxdWVzdC5yZXNwb25zZSgpIDogbnVsbDtcbiAgICB9XG4gICAgc2FtZURvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzYW1lRG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQudmFsdWVPclRocm93KCk7XG4gICAgfVxuICAgIG5ld0RvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNuZXdEb2N1bWVudE5hdmlnYXRpb25EZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgbGlmZWN5Y2xlUHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xpZmVjeWNsZURlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgIH1cbiAgICB0ZXJtaW5hdGlvblByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0ZXJtaW5hdGlvbkRlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgIH1cbiAgICAjbmF2aWdhdGVkV2l0aGluRG9jdW1lbnQoKSB7XG4gICAgICAgIHRoaXMuI2hhc1NhbWVEb2N1bWVudE5hdmlnYXRpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLiNjaGVja0xpZmVjeWNsZUNvbXBsZXRlKCk7XG4gICAgfVxuICAgICNuYXZpZ2F0ZWQobmF2aWdhdGlvblR5cGUpIHtcbiAgICAgICAgaWYgKG5hdmlnYXRpb25UeXBlID09PSAnQmFja0ZvcndhcmRDYWNoZVJlc3RvcmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVTd2FwcGVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2hlY2tMaWZlY3ljbGVDb21wbGV0ZSgpO1xuICAgIH1cbiAgICAjZnJhbWVTd2FwcGVkKCkge1xuICAgICAgICB0aGlzLiNzd2FwcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jY2hlY2tMaWZlY3ljbGVDb21wbGV0ZSgpO1xuICAgIH1cbiAgICAjY2hlY2tMaWZlY3ljbGVDb21wbGV0ZSgpIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IG5hdmlnYXRpb24gdG8gY29tbWl0LlxuICAgICAgICBpZiAoIWNoZWNrTGlmZWN5Y2xlKHRoaXMuI2ZyYW1lLCB0aGlzLiNleHBlY3RlZExpZmVjeWNsZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNsaWZlY3ljbGVEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgIGlmICh0aGlzLiNoYXNTYW1lRG9jdW1lbnROYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLiNzYW1lRG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzd2FwcGVkIHx8IHRoaXMuI2ZyYW1lLl9sb2FkZXJJZCAhPT0gdGhpcy4jaW5pdGlhbExvYWRlcklkKSB7XG4gICAgICAgICAgICB0aGlzLiNuZXdEb2N1bWVudE5hdmlnYXRpb25EZWZlcnJlZC5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tMaWZlY3ljbGUoZnJhbWUsIGV4cGVjdGVkTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV4cGVjdGVkTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmcmFtZS5fbGlmZWN5Y2xlRXZlbnRzLmhhcyhldmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE8oIzEpOiBJdHMgcG9zc2libGUgd2UgZG9uJ3QgbmVlZCB0aGlzIGNoZWNrXG4gICAgICAgICAgICAvLyBDRFAgcHJvdmlkZWQgdGhlIGNvcnJlY3Qgb3JkZXIgZm9yIExvYWRpbmcgRXZlbnRzXG4gICAgICAgICAgICAvLyBBbmQgTmV0d29ya0lkbGUgaXMgYSBnbG9iYWwgc3RhdGVcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIHJlbW92aW5nXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZyYW1lLmNoaWxkRnJhbWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuX2hhc1N0YXJ0ZWRMb2FkaW5nICYmXG4gICAgICAgICAgICAgICAgICAgICFjaGVja0xpZmVjeWNsZShjaGlsZCwgZXhwZWN0ZWRMaWZlY3ljbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy4jdGVybWluYXRpb25EZWZlcnJlZC5yZXNvbHZlKG5ldyBFcnJvcignTGlmZWN5Y2xlV2F0Y2hlciBkaXNwb3NlZCcpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaWZlY3ljbGVXYXRjaGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEhlbHBlciBjbGFzcyB0byB0cmFjayBuZXR3b3JrIGV2ZW50cyBieSByZXF1ZXN0IElEXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXR3b3JrRXZlbnRNYW5hZ2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBvcmRlcnMgb2YgZXZlbnRzOlxuICAgICAqIEEuIGBfb25SZXF1ZXN0V2lsbEJlU2VudGBcbiAgICAgKiBCLiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGBcbiAgICAgKiBDLiBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0V2lsbEJlU2VudGBcbiAgICAgKiBELiBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0V2lsbEJlU2VudGAsIGBfb25SZXF1ZXN0UGF1c2VkYCxcbiAgICAgKiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0UGF1c2VkYFxuICAgICAqIChzZWUgY3JidWcuY29tLzExOTYwMDQpXG4gICAgICpcbiAgICAgKiBGb3IgYF9vblJlcXVlc3RgIHdlIG5lZWQgdGhlIGV2ZW50IGZyb20gYF9vblJlcXVlc3RXaWxsQmVTZW50YCBhbmRcbiAgICAgKiBvcHRpb25hbGx5IHRoZSBgaW50ZXJjZXB0aW9uSWRgIGZyb20gYF9vblJlcXVlc3RQYXVzZWRgLlxuICAgICAqXG4gICAgICogSWYgcmVxdWVzdCBpbnRlcmNlcHRpb24gaXMgZGlzYWJsZWQsIGNhbGwgYF9vblJlcXVlc3RgIG9uY2UgcGVyIGNhbGwgdG9cbiAgICAgKiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLlxuICAgICAqIElmIHJlcXVlc3QgaW50ZXJjZXB0aW9uIGlzIGVuYWJsZWQsIGNhbGwgYF9vblJlcXVlc3RgIG9uY2UgcGVyIGNhbGwgdG9cbiAgICAgKiBgX29uUmVxdWVzdFBhdXNlZGAgKG9uY2UgcGVyIGBpbnRlcmNlcHRpb25JZGApLlxuICAgICAqXG4gICAgICogRXZlbnRzIGFyZSBzdG9yZWQgdG8gYWxsb3cgZm9yIHN1YnNlcXVlbnQgZXZlbnRzIHRvIGNhbGwgYF9vblJlcXVlc3RgLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IChjaGFpbnMgb2YpIHJlZGlyZWN0IHJlcXVlc3RzIGhhdmUgdGhlIHNhbWUgYHJlcXVlc3RJZGAgKCEpIGFzXG4gICAgICogdGhlIG9yaWdpbmFsIHJlcXVlc3QuIFdlIGhhdmUgdG8gYW50aWNpcGF0ZSBzZXJpZXMgb2YgZXZlbnRzIGxpa2UgdGhlc2U6XG4gICAgICogQS4gYF9vblJlcXVlc3RXaWxsQmVTZW50YCxcbiAgICAgKiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCAuLi5cbiAgICAgKiBCLiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsXG4gICAgICogYF9vblJlcXVlc3RXaWxsQmVTZW50YCwgYF9vblJlcXVlc3RQYXVzZWRgLCAuLi5cbiAgICAgKiBDLiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsXG4gICAgICogYF9vblJlcXVlc3RQYXVzZWRgLCBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCAuLi5cbiAgICAgKiBELiBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0V2lsbEJlU2VudGAsXG4gICAgICogYF9vblJlcXVlc3RQYXVzZWRgLCBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsXG4gICAgICogYF9vblJlcXVlc3RXaWxsQmVTZW50YCwgYF9vblJlcXVlc3RQYXVzZWRgLCBgX29uUmVxdWVzdFBhdXNlZGAsIC4uLlxuICAgICAqIChzZWUgY3JidWcuY29tLzExOTYwMDQpXG4gICAgICovXG4gICAgI3JlcXVlc3RXaWxsQmVTZW50TWFwID0gbmV3IE1hcCgpO1xuICAgICNyZXF1ZXN0UGF1c2VkTWFwID0gbmV3IE1hcCgpO1xuICAgICNodHRwUmVxdWVzdHNNYXAgPSBuZXcgTWFwKCk7XG4gICAgLypcbiAgICAgKiBUaGUgYmVsb3cgbWFwcyBhcmUgdXNlZCB0byByZWNvbmNpbGUgTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvXG4gICAgICogZXZlbnRzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyByZXF1ZXN0LiBFYWNoIHJlc3BvbnNlIGFuZCByZWRpcmVjdFxuICAgICAqIHJlc3BvbnNlIGdldHMgYW4gRXh0cmFJbmZvIGV2ZW50LCBhbmQgd2UgZG9uJ3Qga25vdyB3aGljaCB3aWxsIGNvbWUgZmlyc3QuXG4gICAgICogVGhpcyBtZWFucyB0aGF0IHdlIGhhdmUgdG8gc3RvcmUgYSBSZXNwb25zZSBvciBhbiBFeHRyYUluZm8gZm9yIGVhY2hcbiAgICAgKiByZXNwb25zZSwgYW5kIGVtaXQgdGhlIGV2ZW50IHdoZW4gd2UgZ2V0IGJvdGggb2YgdGhlbS4gSW4gYWRkaXRpb24sIHRvXG4gICAgICogaGFuZGxlIHJlZGlyZWN0cywgd2UgaGF2ZSB0byBtYWtlIHRoZW0gQXJyYXlzIHRvIHJlcHJlc2VudCB0aGUgY2hhaW4gb2ZcbiAgICAgKiBldmVudHMuXG4gICAgICovXG4gICAgI3Jlc3BvbnNlUmVjZWl2ZWRFeHRyYUluZm9NYXAgPSBuZXcgTWFwKCk7XG4gICAgI3F1ZXVlZFJlZGlyZWN0SW5mb01hcCA9IG5ldyBNYXAoKTtcbiAgICAjcXVldWVkRXZlbnRHcm91cE1hcCA9IG5ldyBNYXAoKTtcbiAgICBmb3JnZXQobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0V2lsbEJlU2VudE1hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgICAgIHRoaXMuI3JlcXVlc3RQYXVzZWRNYXAuZGVsZXRlKG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgICAgICB0aGlzLiNxdWV1ZWRFdmVudEdyb3VwTWFwLmRlbGV0ZShuZXR3b3JrUmVxdWVzdElkKTtcbiAgICAgICAgdGhpcy4jcXVldWVkUmVkaXJlY3RJbmZvTWFwLmRlbGV0ZShuZXR3b3JrUmVxdWVzdElkKTtcbiAgICAgICAgdGhpcy4jcmVzcG9uc2VSZWNlaXZlZEV4dHJhSW5mb01hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHJlc3BvbnNlRXh0cmFJbmZvKG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNyZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvTWFwLmhhcyhuZXR3b3JrUmVxdWVzdElkKSkge1xuICAgICAgICAgICAgdGhpcy4jcmVzcG9uc2VSZWNlaXZlZEV4dHJhSW5mb01hcC5zZXQobmV0d29ya1JlcXVlc3RJZCwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvTWFwLmdldChuZXR3b3JrUmVxdWVzdElkKTtcbiAgICB9XG4gICAgcXVldWVkUmVkaXJlY3RJbmZvKGZldGNoUmVxdWVzdElkKSB7XG4gICAgICAgIGlmICghdGhpcy4jcXVldWVkUmVkaXJlY3RJbmZvTWFwLmhhcyhmZXRjaFJlcXVlc3RJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuI3F1ZXVlZFJlZGlyZWN0SW5mb01hcC5zZXQoZmV0Y2hSZXF1ZXN0SWQsIFtdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jcXVldWVkUmVkaXJlY3RJbmZvTWFwLmdldChmZXRjaFJlcXVlc3RJZCk7XG4gICAgfVxuICAgIHF1ZXVlUmVkaXJlY3RJbmZvKGZldGNoUmVxdWVzdElkLCByZWRpcmVjdEluZm8pIHtcbiAgICAgICAgdGhpcy5xdWV1ZWRSZWRpcmVjdEluZm8oZmV0Y2hSZXF1ZXN0SWQpLnB1c2gocmVkaXJlY3RJbmZvKTtcbiAgICB9XG4gICAgdGFrZVF1ZXVlZFJlZGlyZWN0SW5mbyhmZXRjaFJlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZWRSZWRpcmVjdEluZm8oZmV0Y2hSZXF1ZXN0SWQpLnNoaWZ0KCk7XG4gICAgfVxuICAgIGluRmxpZ2h0UmVxdWVzdHNDb3VudCgpIHtcbiAgICAgICAgbGV0IGluRmxpZ2h0UmVxdWVzdENvdW50ZXIgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgdGhpcy4jaHR0cFJlcXVlc3RzTWFwLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoIXJlcXVlc3QucmVzcG9uc2UoKSkge1xuICAgICAgICAgICAgICAgIGluRmxpZ2h0UmVxdWVzdENvdW50ZXIrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5GbGlnaHRSZXF1ZXN0Q291bnRlcjtcbiAgICB9XG4gICAgc3RvcmVSZXF1ZXN0V2lsbEJlU2VudChuZXR3b3JrUmVxdWVzdElkLCBldmVudCkge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0V2lsbEJlU2VudE1hcC5zZXQobmV0d29ya1JlcXVlc3RJZCwgZXZlbnQpO1xuICAgIH1cbiAgICBnZXRSZXF1ZXN0V2lsbEJlU2VudChuZXR3b3JrUmVxdWVzdElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0V2lsbEJlU2VudE1hcC5nZXQobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIGZvcmdldFJlcXVlc3RXaWxsQmVTZW50KG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhpcy4jcmVxdWVzdFdpbGxCZVNlbnRNYXAuZGVsZXRlKG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgIH1cbiAgICBnZXRSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3JlcXVlc3RQYXVzZWRNYXAuZ2V0KG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgIH1cbiAgICBmb3JnZXRSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhpcy4jcmVxdWVzdFBhdXNlZE1hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHN0b3JlUmVxdWVzdFBhdXNlZChuZXR3b3JrUmVxdWVzdElkLCBldmVudCkge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0UGF1c2VkTWFwLnNldChuZXR3b3JrUmVxdWVzdElkLCBldmVudCk7XG4gICAgfVxuICAgIGdldFJlcXVlc3QobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaHR0cFJlcXVlc3RzTWFwLmdldChuZXR3b3JrUmVxdWVzdElkKTtcbiAgICB9XG4gICAgc3RvcmVSZXF1ZXN0KG5ldHdvcmtSZXF1ZXN0SWQsIHJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy4jaHR0cFJlcXVlc3RzTWFwLnNldChuZXR3b3JrUmVxdWVzdElkLCByZXF1ZXN0KTtcbiAgICB9XG4gICAgZm9yZ2V0UmVxdWVzdChuZXR3b3JrUmVxdWVzdElkKSB7XG4gICAgICAgIHRoaXMuI2h0dHBSZXF1ZXN0c01hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIGdldFF1ZXVlZEV2ZW50R3JvdXAobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcXVldWVkRXZlbnRHcm91cE1hcC5nZXQobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHF1ZXVlRXZlbnRHcm91cChuZXR3b3JrUmVxdWVzdElkLCBldmVudCkge1xuICAgICAgICB0aGlzLiNxdWV1ZWRFdmVudEdyb3VwTWFwLnNldChuZXR3b3JrUmVxdWVzdElkLCBldmVudCk7XG4gICAgfVxuICAgIGZvcmdldFF1ZXVlZEV2ZW50R3JvdXAobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICB0aGlzLiNxdWV1ZWRFdmVudEdyb3VwTWFwLmRlbGV0ZShuZXR3b3JrUmVxdWVzdElkKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OZXR3b3JrRXZlbnRNYW5hZ2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyRXZlbnQsIH0gZnJvbSAnLi4vY29tbW9uL05ldHdvcmtNYW5hZ2VyRXZlbnRzLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIGlzU3RyaW5nIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IENkcEhUVFBSZXF1ZXN0IH0gZnJvbSAnLi9IVFRQUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBDZHBIVFRQUmVzcG9uc2UgfSBmcm9tICcuL0hUVFBSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBOZXR3b3JrRXZlbnRNYW5hZ2VyLCB9IGZyb20gJy4vTmV0d29ya0V2ZW50TWFuYWdlci5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTmV0d29ya01hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNmcmFtZU1hbmFnZXI7XG4gICAgI25ldHdvcmtFdmVudE1hbmFnZXIgPSBuZXcgTmV0d29ya0V2ZW50TWFuYWdlcigpO1xuICAgICNleHRyYUhUVFBIZWFkZXJzO1xuICAgICNjcmVkZW50aWFscyA9IG51bGw7XG4gICAgI2F0dGVtcHRlZEF1dGhlbnRpY2F0aW9ucyA9IG5ldyBTZXQoKTtcbiAgICAjdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICAjdXNlckNhY2hlRGlzYWJsZWQ7XG4gICAgI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnM7XG4gICAgI3VzZXJBZ2VudDtcbiAgICAjdXNlckFnZW50TWV0YWRhdGE7XG4gICAgI2hhbmRsZXJzID0gW1xuICAgICAgICBbJ0ZldGNoLnJlcXVlc3RQYXVzZWQnLCB0aGlzLiNvblJlcXVlc3RQYXVzZWRdLFxuICAgICAgICBbJ0ZldGNoLmF1dGhSZXF1aXJlZCcsIHRoaXMuI29uQXV0aFJlcXVpcmVkXSxcbiAgICAgICAgWydOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50JywgdGhpcy4jb25SZXF1ZXN0V2lsbEJlU2VudF0sXG4gICAgICAgIFsnTmV0d29yay5yZXF1ZXN0U2VydmVkRnJvbUNhY2hlJywgdGhpcy4jb25SZXF1ZXN0U2VydmVkRnJvbUNhY2hlXSxcbiAgICAgICAgWydOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQnLCB0aGlzLiNvblJlc3BvbnNlUmVjZWl2ZWRdLFxuICAgICAgICBbJ05ldHdvcmsubG9hZGluZ0ZpbmlzaGVkJywgdGhpcy4jb25Mb2FkaW5nRmluaXNoZWRdLFxuICAgICAgICBbJ05ldHdvcmsubG9hZGluZ0ZhaWxlZCcsIHRoaXMuI29uTG9hZGluZ0ZhaWxlZF0sXG4gICAgICAgIFsnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvJywgdGhpcy4jb25SZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvXSxcbiAgICAgICAgW0NEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsIHRoaXMuI3JlbW92ZUNsaWVudF0sXG4gICAgXTtcbiAgICAjY2xpZW50cyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihmcmFtZU1hbmFnZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jZnJhbWVNYW5hZ2VyID0gZnJhbWVNYW5hZ2VyO1xuICAgIH1cbiAgICBhc3luYyBhZGRDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIGlmICh0aGlzLiNjbGllbnRzLmhhcyhjbGllbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTtcbiAgICAgICAgdGhpcy4jY2xpZW50cy5zZXQoY2xpZW50LCBzdWJzY3JpcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2xpZW50RW1pdHRlciA9IHN1YnNjcmlwdGlvbnMudXNlKG5ldyBFdmVudEVtaXR0ZXIoY2xpZW50KSk7XG4gICAgICAgIGZvciAoY29uc3QgW2V2ZW50LCBoYW5kbGVyXSBvZiB0aGlzLiNoYW5kbGVycykge1xuICAgICAgICAgICAgY2xpZW50RW1pdHRlci5vbihldmVudCwgKGFyZykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLmJpbmQodGhpcykoY2xpZW50LCBhcmcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgY2xpZW50LnNlbmQoJ05ldHdvcmsuZW5hYmxlJyksXG4gICAgICAgICAgICB0aGlzLiNhcHBseUV4dHJhSFRUUEhlYWRlcnMoY2xpZW50KSxcbiAgICAgICAgICAgIHRoaXMuI2FwcGx5TmV0d29ya0NvbmRpdGlvbnMoY2xpZW50KSxcbiAgICAgICAgICAgIHRoaXMuI2FwcGx5UHJvdG9jb2xDYWNoZURpc2FibGVkKGNsaWVudCksXG4gICAgICAgICAgICB0aGlzLiNhcHBseVByb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbihjbGllbnQpLFxuICAgICAgICAgICAgdGhpcy4jYXBwbHlVc2VyQWdlbnQoY2xpZW50KSxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGFzeW5jICNyZW1vdmVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudHMuZ2V0KGNsaWVudCk/LmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy4jY2xpZW50cy5kZWxldGUoY2xpZW50KTtcbiAgICB9XG4gICAgYXN5bmMgYXV0aGVudGljYXRlKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHRoaXMuI2NyZWRlbnRpYWxzID0gY3JlZGVudGlhbHM7XG4gICAgICAgIGNvbnN0IGVuYWJsZWQgPSB0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgfHwgISF0aGlzLiNjcmVkZW50aWFscztcbiAgICAgICAgaWYgKGVuYWJsZWQgPT09IHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNwcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXBwbHlUb0FsbENsaWVudHModGhpcy4jYXBwbHlQcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb24uYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jIHNldEV4dHJhSFRUUEhlYWRlcnMoaGVhZGVycykge1xuICAgICAgICBjb25zdCBleHRyYUhUVFBIZWFkZXJzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgICBhc3NlcnQoaXNTdHJpbmcodmFsdWUpLCBgRXhwZWN0ZWQgdmFsdWUgb2YgaGVhZGVyIFwiJHtrZXl9XCIgdG8gYmUgU3RyaW5nLCBidXQgXCIke3R5cGVvZiB2YWx1ZX1cIiBpcyBmb3VuZC5gKTtcbiAgICAgICAgICAgIGV4dHJhSFRUUEhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZXh0cmFIVFRQSGVhZGVycyA9IGV4dHJhSFRUUEhlYWRlcnM7XG4gICAgICAgIGF3YWl0IHRoaXMuI2FwcGx5VG9BbGxDbGllbnRzKHRoaXMuI2FwcGx5RXh0cmFIVFRQSGVhZGVycy5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgYXN5bmMgI2FwcGx5RXh0cmFIVFRQSGVhZGVycyhjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2V4dHJhSFRUUEhlYWRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdOZXR3b3JrLnNldEV4dHJhSFRUUEhlYWRlcnMnLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLiNleHRyYUhUVFBIZWFkZXJzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZXh0cmFIVFRQSGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuI2V4dHJhSFRUUEhlYWRlcnMpO1xuICAgIH1cbiAgICBpbkZsaWdodFJlcXVlc3RzQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmluRmxpZ2h0UmVxdWVzdHNDb3VudCgpO1xuICAgIH1cbiAgICBhc3luYyBzZXRPZmZsaW5lTW9kZSh2YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgb2ZmbGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdXBsb2FkOiAtMSxcbiAgICAgICAgICAgICAgICBkb3dubG9hZDogLTEsXG4gICAgICAgICAgICAgICAgbGF0ZW5jeTogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZW11bGF0ZWROZXR3b3JrQ29uZGl0aW9ucy5vZmZsaW5lID0gdmFsdWU7XG4gICAgICAgIGF3YWl0IHRoaXMuI2FwcGx5VG9BbGxDbGllbnRzKHRoaXMuI2FwcGx5TmV0d29ya0NvbmRpdGlvbnMuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jIGVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyhuZXR3b3JrQ29uZGl0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgb2ZmbGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdXBsb2FkOiAtMSxcbiAgICAgICAgICAgICAgICBkb3dubG9hZDogLTEsXG4gICAgICAgICAgICAgICAgbGF0ZW5jeTogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZW11bGF0ZWROZXR3b3JrQ29uZGl0aW9ucy51cGxvYWQgPSBuZXR3b3JrQ29uZGl0aW9uc1xuICAgICAgICAgICAgPyBuZXR3b3JrQ29uZGl0aW9ucy51cGxvYWRcbiAgICAgICAgICAgIDogLTE7XG4gICAgICAgIHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMuZG93bmxvYWQgPSBuZXR3b3JrQ29uZGl0aW9uc1xuICAgICAgICAgICAgPyBuZXR3b3JrQ29uZGl0aW9ucy5kb3dubG9hZFxuICAgICAgICAgICAgOiAtMTtcbiAgICAgICAgdGhpcy4jZW11bGF0ZWROZXR3b3JrQ29uZGl0aW9ucy5sYXRlbmN5ID0gbmV0d29ya0NvbmRpdGlvbnNcbiAgICAgICAgICAgID8gbmV0d29ya0NvbmRpdGlvbnMubGF0ZW5jeVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBhd2FpdCB0aGlzLiNhcHBseVRvQWxsQ2xpZW50cyh0aGlzLiNhcHBseU5ldHdvcmtDb25kaXRpb25zLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBhc3luYyAjYXBwbHlUb0FsbENsaWVudHMoZm4pIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh0aGlzLiNjbGllbnRzLmtleXMoKSkubWFwKGNsaWVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZm4oY2xpZW50KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBhc3luYyAjYXBwbHlOZXR3b3JrQ29uZGl0aW9ucyhjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdOZXR3b3JrLmVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucycsIHtcbiAgICAgICAgICAgIG9mZmxpbmU6IHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMub2ZmbGluZSxcbiAgICAgICAgICAgIGxhdGVuY3k6IHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMubGF0ZW5jeSxcbiAgICAgICAgICAgIHVwbG9hZFRocm91Z2hwdXQ6IHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMudXBsb2FkLFxuICAgICAgICAgICAgZG93bmxvYWRUaHJvdWdocHV0OiB0aGlzLiNlbXVsYXRlZE5ldHdvcmtDb25kaXRpb25zLmRvd25sb2FkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2V0VXNlckFnZW50KHVzZXJBZ2VudCwgdXNlckFnZW50TWV0YWRhdGEpIHtcbiAgICAgICAgdGhpcy4jdXNlckFnZW50ID0gdXNlckFnZW50O1xuICAgICAgICB0aGlzLiN1c2VyQWdlbnRNZXRhZGF0YSA9IHVzZXJBZ2VudE1ldGFkYXRhO1xuICAgICAgICBhd2FpdCB0aGlzLiNhcHBseVRvQWxsQ2xpZW50cyh0aGlzLiNhcHBseVVzZXJBZ2VudC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgYXN5bmMgI2FwcGx5VXNlckFnZW50KGNsaWVudCkge1xuICAgICAgICBpZiAodGhpcy4jdXNlckFnZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnTmV0d29yay5zZXRVc2VyQWdlbnRPdmVycmlkZScsIHtcbiAgICAgICAgICAgIHVzZXJBZ2VudDogdGhpcy4jdXNlckFnZW50LFxuICAgICAgICAgICAgdXNlckFnZW50TWV0YWRhdGE6IHRoaXMuI3VzZXJBZ2VudE1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2V0Q2FjaGVFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy4jdXNlckNhY2hlRGlzYWJsZWQgPSAhZW5hYmxlZDtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXBwbHlUb0FsbENsaWVudHModGhpcy4jYXBwbHlQcm90b2NvbENhY2hlRGlzYWJsZWQuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jIHNldFJlcXVlc3RJbnRlcmNlcHRpb24odmFsdWUpIHtcbiAgICAgICAgdGhpcy4jdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IGVuYWJsZWQgPSB0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgfHwgISF0aGlzLiNjcmVkZW50aWFscztcbiAgICAgICAgaWYgKGVuYWJsZWQgPT09IHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNwcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXBwbHlUb0FsbENsaWVudHModGhpcy4jYXBwbHlQcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb24uYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jICNhcHBseVByb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbihjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI3VzZXJDYWNoZURpc2FibGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuI3VzZXJDYWNoZURpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLiNhcHBseVByb3RvY29sQ2FjaGVEaXNhYmxlZChjbGllbnQpLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdGZXRjaC5lbmFibGUnLCB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZUF1dGhSZXF1ZXN0czogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybnM6IFt7IHVybFBhdHRlcm46ICcqJyB9XSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2FwcGx5UHJvdG9jb2xDYWNoZURpc2FibGVkKGNsaWVudCksXG4gICAgICAgICAgICAgICAgY2xpZW50LnNlbmQoJ0ZldGNoLmRpc2FibGUnKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jICNhcHBseVByb3RvY29sQ2FjaGVEaXNhYmxlZChjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI3VzZXJDYWNoZURpc2FibGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnTmV0d29yay5zZXRDYWNoZURpc2FibGVkJywge1xuICAgICAgICAgICAgY2FjaGVEaXNhYmxlZDogdGhpcy4jdXNlckNhY2hlRGlzYWJsZWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAjb25SZXF1ZXN0V2lsbEJlU2VudChjbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIFJlcXVlc3QgaW50ZXJjZXB0aW9uIGRvZXNuJ3QgaGFwcGVuIGZvciBkYXRhIFVSTHMgd2l0aCBOZXR3b3JrIFNlcnZpY2UuXG4gICAgICAgIGlmICh0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgJiZcbiAgICAgICAgICAgICFldmVudC5yZXF1ZXN0LnVybC5zdGFydHNXaXRoKCdkYXRhOicpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHJlcXVlc3RJZDogbmV0d29ya1JlcXVlc3RJZCB9ID0gZXZlbnQ7XG4gICAgICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLnN0b3JlUmVxdWVzdFdpbGxCZVNlbnQobmV0d29ya1JlcXVlc3RJZCwgZXZlbnQpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDRFAgbWF5IGhhdmUgc2VudCBhIEZldGNoLnJlcXVlc3RQYXVzZWQgZXZlbnQgYWxyZWFkeS4gQ2hlY2sgZm9yIGl0LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0UGF1c2VkRXZlbnQgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFJlcXVlc3RQYXVzZWQobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdFBhdXNlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyByZXF1ZXN0SWQ6IGZldGNoUmVxdWVzdElkIH0gPSByZXF1ZXN0UGF1c2VkRXZlbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy4jcGF0Y2hSZXF1ZXN0RXZlbnRIZWFkZXJzKGV2ZW50LCByZXF1ZXN0UGF1c2VkRXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuI29uUmVxdWVzdChjbGllbnQsIGV2ZW50LCBmZXRjaFJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5mb3JnZXRSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI29uUmVxdWVzdChjbGllbnQsIGV2ZW50LCB1bmRlZmluZWQpO1xuICAgIH1cbiAgICAjb25BdXRoUmVxdWlyZWQoY2xpZW50LCBldmVudCkge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSAnRGVmYXVsdCc7XG4gICAgICAgIGlmICh0aGlzLiNhdHRlbXB0ZWRBdXRoZW50aWNhdGlvbnMuaGFzKGV2ZW50LnJlcXVlc3RJZCkpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gJ0NhbmNlbEF1dGgnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI2NyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICByZXNwb25zZSA9ICdQcm92aWRlQ3JlZGVudGlhbHMnO1xuICAgICAgICAgICAgdGhpcy4jYXR0ZW1wdGVkQXV0aGVudGljYXRpb25zLmFkZChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0gPSB0aGlzLiNjcmVkZW50aWFscyB8fCB7XG4gICAgICAgICAgICB1c2VybmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgY2xpZW50XG4gICAgICAgICAgICAuc2VuZCgnRmV0Y2guY29udGludWVXaXRoQXV0aCcsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZDogZXZlbnQucmVxdWVzdElkLFxuICAgICAgICAgICAgYXV0aENoYWxsZW5nZVJlc3BvbnNlOiB7IHJlc3BvbnNlLCB1c2VybmFtZSwgcGFzc3dvcmQgfSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ0RQIG1heSBzZW5kIGEgRmV0Y2gucmVxdWVzdFBhdXNlZCB3aXRob3V0IG9yIGJlZm9yZSBhXG4gICAgICogTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudFxuICAgICAqXG4gICAgICogQ0RQIG1heSBzZW5kIG11bHRpcGxlIEZldGNoLnJlcXVlc3RQYXVzZWRcbiAgICAgKiBmb3IgdGhlIHNhbWUgTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudC5cbiAgICAgKi9cbiAgICAjb25SZXF1ZXN0UGF1c2VkKGNsaWVudCwgZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgJiZcbiAgICAgICAgICAgIHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGNsaWVudFxuICAgICAgICAgICAgICAgIC5zZW5kKCdGZXRjaC5jb250aW51ZVJlcXVlc3QnLCB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdElkOiBldmVudC5yZXF1ZXN0SWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG5ldHdvcmtJZDogbmV0d29ya1JlcXVlc3RJZCwgcmVxdWVzdElkOiBmZXRjaFJlcXVlc3RJZCB9ID0gZXZlbnQ7XG4gICAgICAgIGlmICghbmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICAgICAgdGhpcy4jb25SZXF1ZXN0V2l0aG91dE5ldHdvcmtJbnN0cnVtZW50YXRpb24oY2xpZW50LCBldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdFdpbGxCZVNlbnRFdmVudCA9ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0V2lsbEJlU2VudEV2ZW50ID0gdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5nZXRSZXF1ZXN0V2lsbEJlU2VudChuZXR3b3JrUmVxdWVzdElkKTtcbiAgICAgICAgICAgIC8vIHJlZGlyZWN0IHJlcXVlc3RzIGhhdmUgdGhlIHNhbWUgYHJlcXVlc3RJZGAsXG4gICAgICAgICAgICBpZiAocmVxdWVzdFdpbGxCZVNlbnRFdmVudCAmJlxuICAgICAgICAgICAgICAgIChyZXF1ZXN0V2lsbEJlU2VudEV2ZW50LnJlcXVlc3QudXJsICE9PSBldmVudC5yZXF1ZXN0LnVybCB8fFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0V2lsbEJlU2VudEV2ZW50LnJlcXVlc3QubWV0aG9kICE9PSBldmVudC5yZXF1ZXN0Lm1ldGhvZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmZvcmdldFJlcXVlc3RXaWxsQmVTZW50KG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0V2lsbEJlU2VudEV2ZW50O1xuICAgICAgICB9KSgpO1xuICAgICAgICBpZiAocmVxdWVzdFdpbGxCZVNlbnRFdmVudCkge1xuICAgICAgICAgICAgdGhpcy4jcGF0Y2hSZXF1ZXN0RXZlbnRIZWFkZXJzKHJlcXVlc3RXaWxsQmVTZW50RXZlbnQsIGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMuI29uUmVxdWVzdChjbGllbnQsIHJlcXVlc3RXaWxsQmVTZW50RXZlbnQsIGZldGNoUmVxdWVzdElkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuc3RvcmVSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjcGF0Y2hSZXF1ZXN0RXZlbnRIZWFkZXJzKHJlcXVlc3RXaWxsQmVTZW50RXZlbnQsIHJlcXVlc3RQYXVzZWRFdmVudCkge1xuICAgICAgICByZXF1ZXN0V2lsbEJlU2VudEV2ZW50LnJlcXVlc3QuaGVhZGVycyA9IHtcbiAgICAgICAgICAgIC4uLnJlcXVlc3RXaWxsQmVTZW50RXZlbnQucmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgICAgLy8gaW5jbHVkZXMgZXh0cmEgaGVhZGVycywgbGlrZTogQWNjZXB0LCBPcmlnaW5cbiAgICAgICAgICAgIC4uLnJlcXVlc3RQYXVzZWRFdmVudC5yZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgIH07XG4gICAgfVxuICAgICNvblJlcXVlc3RXaXRob3V0TmV0d29ya0luc3RydW1lbnRhdGlvbihjbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIElmIGFuIGV2ZW50IGhhcyBubyBuZXR3b3JrSWQgaXQgc2hvdWxkIG5vdCBoYXZlIGFueSBuZXR3b3JrIGV2ZW50cy4gV2VcbiAgICAgICAgLy8gc3RpbGwgd2FudCB0byBkaXNwYXRjaCBpdCBmb3IgdGhlIGludGVyY2VwdGlvbiBieSB0aGUgdXNlci5cbiAgICAgICAgY29uc3QgZnJhbWUgPSBldmVudC5mcmFtZUlkXG4gICAgICAgICAgICA/IHRoaXMuI2ZyYW1lTWFuYWdlci5mcmFtZShldmVudC5mcmFtZUlkKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IENkcEhUVFBSZXF1ZXN0KGNsaWVudCwgZnJhbWUsIGV2ZW50LnJlcXVlc3RJZCwgdGhpcy4jdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkLCBldmVudCwgW10pO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0LCByZXF1ZXN0KTtcbiAgICAgICAgdm9pZCByZXF1ZXN0LmZpbmFsaXplSW50ZXJjZXB0aW9ucygpO1xuICAgIH1cbiAgICAjb25SZXF1ZXN0KGNsaWVudCwgZXZlbnQsIGZldGNoUmVxdWVzdElkKSB7XG4gICAgICAgIGxldCByZWRpcmVjdENoYWluID0gW107XG4gICAgICAgIGlmIChldmVudC5yZWRpcmVjdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAvLyBXZSB3YW50IHRvIGVtaXQgYSByZXNwb25zZSBhbmQgcmVxdWVzdGZpbmlzaGVkIGZvciB0aGVcbiAgICAgICAgICAgIC8vIHJlZGlyZWN0UmVzcG9uc2UsIGJ1dCB3ZSBjYW4ndCBkbyBzbyB1bmxlc3Mgd2UgaGF2ZSBhXG4gICAgICAgICAgICAvLyByZXNwb25zZUV4dHJhSW5mbyByZWFkeSB0byBwYWlyIGl0IHVwIHdpdGguIElmIHdlIGRvbid0IGhhdmUgYW55XG4gICAgICAgICAgICAvLyByZXNwb25zZUV4dHJhSW5mb3Mgc2F2ZWQgaW4gb3VyIHF1ZXVlLCB0aGV5IHdlIGhhdmUgdG8gd2FpdCB1bnRpbFxuICAgICAgICAgICAgLy8gdGhlIG5leHQgb25lIHRvIGVtaXQgcmVzcG9uc2UgYW5kIHJlcXVlc3RmaW5pc2hlZCwgKmFuZCogd2Ugc2hvdWxkXG4gICAgICAgICAgICAvLyBhbHNvIHdhaXQgdG8gZW1pdCB0aGlzIFJlcXVlc3QgdG9vIGJlY2F1c2UgaXQgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAvLyByZXNwb25zZS9yZXF1ZXN0ZmluaXNoZWQuXG4gICAgICAgICAgICBsZXQgcmVkaXJlY3RSZXNwb25zZUV4dHJhSW5mbyA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZXZlbnQucmVkaXJlY3RIYXNFeHRyYUluZm8pIHtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFJlc3BvbnNlRXh0cmFJbmZvID0gdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAucmVzcG9uc2VFeHRyYUluZm8oZXZlbnQucmVxdWVzdElkKVxuICAgICAgICAgICAgICAgICAgICAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0UmVzcG9uc2VFeHRyYUluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5xdWV1ZVJlZGlyZWN0SW5mbyhldmVudC5yZXF1ZXN0SWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hSZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICAgICAgLy8gSWYgd2UgY29ubmVjdCBsYXRlIHRvIHRoZSB0YXJnZXQsIHdlIGNvdWxkIGhhdmUgbWlzc2VkIHRoZVxuICAgICAgICAgICAgLy8gcmVxdWVzdFdpbGxCZVNlbnQgZXZlbnQuXG4gICAgICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2hhbmRsZVJlcXVlc3RSZWRpcmVjdChjbGllbnQsIHJlcXVlc3QsIGV2ZW50LnJlZGlyZWN0UmVzcG9uc2UsIHJlZGlyZWN0UmVzcG9uc2VFeHRyYUluZm8pO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0Q2hhaW4gPSByZXF1ZXN0Ll9yZWRpcmVjdENoYWluO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZyYW1lID0gZXZlbnQuZnJhbWVJZFxuICAgICAgICAgICAgPyB0aGlzLiNmcmFtZU1hbmFnZXIuZnJhbWUoZXZlbnQuZnJhbWVJZClcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBDZHBIVFRQUmVxdWVzdChjbGllbnQsIGZyYW1lLCBmZXRjaFJlcXVlc3RJZCwgdGhpcy4jdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkLCBldmVudCwgcmVkaXJlY3RDaGFpbik7XG4gICAgICAgIHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuc3RvcmVSZXF1ZXN0KGV2ZW50LnJlcXVlc3RJZCwgcmVxdWVzdCk7XG4gICAgICAgIHRoaXMuZW1pdChOZXR3b3JrTWFuYWdlckV2ZW50LlJlcXVlc3QsIHJlcXVlc3QpO1xuICAgICAgICB2b2lkIHJlcXVlc3QuZmluYWxpemVJbnRlcmNlcHRpb25zKCk7XG4gICAgfVxuICAgICNvblJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUoX2NsaWVudCwgZXZlbnQpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmVxdWVzdC5fZnJvbU1lbW9yeUNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0U2VydmVkRnJvbUNhY2hlLCByZXF1ZXN0KTtcbiAgICB9XG4gICAgI2hhbmRsZVJlcXVlc3RSZWRpcmVjdChjbGllbnQsIHJlcXVlc3QsIHJlc3BvbnNlUGF5bG9hZCwgZXh0cmFJbmZvKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IENkcEhUVFBSZXNwb25zZShjbGllbnQsIHJlcXVlc3QsIHJlc3BvbnNlUGF5bG9hZCwgZXh0cmFJbmZvKTtcbiAgICAgICAgcmVxdWVzdC5fcmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgcmVxdWVzdC5fcmVkaXJlY3RDaGFpbi5wdXNoKHJlcXVlc3QpO1xuICAgICAgICByZXNwb25zZS5fcmVzb2x2ZUJvZHkobmV3IEVycm9yKCdSZXNwb25zZSBib2R5IGlzIHVuYXZhaWxhYmxlIGZvciByZWRpcmVjdCByZXNwb25zZXMnKSk7XG4gICAgICAgIHRoaXMuI2ZvcmdldFJlcXVlc3QocmVxdWVzdCwgZmFsc2UpO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmluaXNoZWQsIHJlcXVlc3QpO1xuICAgIH1cbiAgICAjZW1pdFJlc3BvbnNlRXZlbnQoY2xpZW50LCByZXNwb25zZVJlY2VpdmVkLCBleHRyYUluZm8pIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChyZXNwb25zZVJlY2VpdmVkLnJlcXVlc3RJZCk7XG4gICAgICAgIC8vIEZpbGVVcGxvYWQgc2VuZHMgYSByZXNwb25zZSB3aXRob3V0IGEgbWF0Y2hpbmcgcmVxdWVzdC5cbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXh0cmFJbmZvcyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIucmVzcG9uc2VFeHRyYUluZm8ocmVzcG9uc2VSZWNlaXZlZC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAoZXh0cmFJbmZvcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRlYnVnRXJyb3IobmV3IEVycm9yKCdVbmV4cGVjdGVkIGV4dHJhSW5mbyBldmVudHMgZm9yIHJlcXVlc3QgJyArXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VSZWNlaXZlZC5yZXF1ZXN0SWQpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaHJvbWl1bSBzZW5kcyB3cm9uZyBleHRyYUluZm8gZXZlbnRzIGZvciByZXNwb25zZXMgc2VydmVkIGZyb20gY2FjaGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHVwcGV0ZWVyL3B1cHBldGVlci9pc3N1ZXMvOTk2NSBhbmRcbiAgICAgICAgLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vMTM0MDM5OC5cbiAgICAgICAgaWYgKHJlc3BvbnNlUmVjZWl2ZWQucmVzcG9uc2UuZnJvbURpc2tDYWNoZSkge1xuICAgICAgICAgICAgZXh0cmFJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IG5ldyBDZHBIVFRQUmVzcG9uc2UoY2xpZW50LCByZXF1ZXN0LCByZXNwb25zZVJlY2VpdmVkLnJlc3BvbnNlLCBleHRyYUluZm8pO1xuICAgICAgICByZXF1ZXN0Ll9yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgIH1cbiAgICAjb25SZXNwb25zZVJlY2VpdmVkKGNsaWVudCwgZXZlbnQpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBsZXQgZXh0cmFJbmZvID0gbnVsbDtcbiAgICAgICAgaWYgKHJlcXVlc3QgJiYgIXJlcXVlc3QuX2Zyb21NZW1vcnlDYWNoZSAmJiBldmVudC5oYXNFeHRyYUluZm8pIHtcbiAgICAgICAgICAgIGV4dHJhSW5mbyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXJcbiAgICAgICAgICAgICAgICAucmVzcG9uc2VFeHRyYUluZm8oZXZlbnQucmVxdWVzdElkKVxuICAgICAgICAgICAgICAgIC5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKCFleHRyYUluZm8pIHtcbiAgICAgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHdlIGdldCB0aGUgY29ycmVzcG9uZGluZyBFeHRyYUluZm8gZXZlbnQuXG4gICAgICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5xdWV1ZUV2ZW50R3JvdXAoZXZlbnQucmVxdWVzdElkLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUmVjZWl2ZWRFdmVudDogZXZlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2VtaXRSZXNwb25zZUV2ZW50KGNsaWVudCwgZXZlbnQsIGV4dHJhSW5mbyk7XG4gICAgfVxuICAgICNvblJlc3BvbnNlUmVjZWl2ZWRFeHRyYUluZm8oY2xpZW50LCBldmVudCkge1xuICAgICAgICAvLyBXZSBtYXkgaGF2ZSBza2lwcGVkIGEgcmVkaXJlY3QgcmVzcG9uc2UvcmVxdWVzdCBwYWlyIGR1ZSB0byB3YWl0aW5nIGZvclxuICAgICAgICAvLyB0aGlzIEV4dHJhSW5mbyBldmVudC4gSWYgc28sIGNvbnRpbnVlIHRoYXQgd29yayBub3cgdGhhdCB3ZSBoYXZlIHRoZVxuICAgICAgICAvLyByZXF1ZXN0LlxuICAgICAgICBjb25zdCByZWRpcmVjdEluZm8gPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLnRha2VRdWV1ZWRSZWRpcmVjdEluZm8oZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgaWYgKHJlZGlyZWN0SW5mbykge1xuICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5yZXNwb25zZUV4dHJhSW5mbyhldmVudC5yZXF1ZXN0SWQpLnB1c2goZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy4jb25SZXF1ZXN0KGNsaWVudCwgcmVkaXJlY3RJbmZvLmV2ZW50LCByZWRpcmVjdEluZm8uZmV0Y2hSZXF1ZXN0SWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIG1heSBoYXZlIHNraXBwZWQgcmVzcG9uc2UgYW5kIGxvYWRpbmcgZXZlbnRzIGJlY2F1c2Ugd2UgZGlkbid0IGhhdmVcbiAgICAgICAgLy8gdGhpcyBFeHRyYUluZm8gZXZlbnQgeWV0LiBJZiBzbywgZW1pdCB0aG9zZSBldmVudHMgbm93LlxuICAgICAgICBjb25zdCBxdWV1ZWRFdmVudHMgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFF1ZXVlZEV2ZW50R3JvdXAoZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgaWYgKHF1ZXVlZEV2ZW50cykge1xuICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5mb3JnZXRRdWV1ZWRFdmVudEdyb3VwKGV2ZW50LnJlcXVlc3RJZCk7XG4gICAgICAgICAgICB0aGlzLiNlbWl0UmVzcG9uc2VFdmVudChjbGllbnQsIHF1ZXVlZEV2ZW50cy5yZXNwb25zZVJlY2VpdmVkRXZlbnQsIGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChxdWV1ZWRFdmVudHMubG9hZGluZ0ZpbmlzaGVkRXZlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNlbWl0TG9hZGluZ0ZpbmlzaGVkKHF1ZXVlZEV2ZW50cy5sb2FkaW5nRmluaXNoZWRFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocXVldWVkRXZlbnRzLmxvYWRpbmdGYWlsZWRFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXRMb2FkaW5nRmFpbGVkKHF1ZXVlZEV2ZW50cy5sb2FkaW5nRmFpbGVkRXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhaXQgdW50aWwgd2UgZ2V0IGFub3RoZXIgZXZlbnQgdGhhdCBjYW4gdXNlIHRoaXMgRXh0cmFJbmZvIGV2ZW50LlxuICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLnJlc3BvbnNlRXh0cmFJbmZvKGV2ZW50LnJlcXVlc3RJZCkucHVzaChldmVudCk7XG4gICAgfVxuICAgICNmb3JnZXRSZXF1ZXN0KHJlcXVlc3QsIGV2ZW50cykge1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSByZXF1ZXN0LmlkO1xuICAgICAgICBjb25zdCBpbnRlcmNlcHRpb25JZCA9IHJlcXVlc3QuX2ludGVyY2VwdGlvbklkO1xuICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmZvcmdldFJlcXVlc3QocmVxdWVzdElkKTtcbiAgICAgICAgaW50ZXJjZXB0aW9uSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdGhpcy4jYXR0ZW1wdGVkQXV0aGVudGljYXRpb25zLmRlbGV0ZShpbnRlcmNlcHRpb25JZCk7XG4gICAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZm9yZ2V0KHJlcXVlc3RJZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uTG9hZGluZ0ZpbmlzaGVkKF9jbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBldmVudCBmb3IgdGhpcyByZXF1ZXN0IGlzIHN0aWxsIHdhaXRpbmcgb24gYVxuICAgICAgICAvLyBjb3JyZXNwb25kaW5nIEV4dHJhSW5mbyBldmVudCwgdGhlbiB3YWl0IHRvIGVtaXQgdGhpcyBldmVudCB0b28uXG4gICAgICAgIGNvbnN0IHF1ZXVlZEV2ZW50cyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UXVldWVkRXZlbnRHcm91cChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAocXVldWVkRXZlbnRzKSB7XG4gICAgICAgICAgICBxdWV1ZWRFdmVudHMubG9hZGluZ0ZpbmlzaGVkRXZlbnQgPSBldmVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2VtaXRMb2FkaW5nRmluaXNoZWQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNlbWl0TG9hZGluZ0ZpbmlzaGVkKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFJlcXVlc3QoZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgLy8gRm9yIGNlcnRhaW4gcmVxdWVzdElkcyB3ZSBuZXZlciByZWNlaXZlIHJlcXVlc3RXaWxsQmVTZW50IGV2ZW50LlxuICAgICAgICAvLyBAc2VlIGh0dHBzOi8vY3JidWcuY29tLzc1MDQ2OVxuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMgd2UgbmV2ZXIgZ2V0IHRoZSBOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWRcbiAgICAgICAgLy8gZXZlbnQgZnJvbSBwcm90b2NvbC4gQHNlZSBodHRwczovL2NyYnVnLmNvbS84ODM0NzVcbiAgICAgICAgaWYgKHJlcXVlc3QucmVzcG9uc2UoKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZSgpPy5fcmVzb2x2ZUJvZHkoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmb3JnZXRSZXF1ZXN0KHJlcXVlc3QsIHRydWUpO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmluaXNoZWQsIHJlcXVlc3QpO1xuICAgIH1cbiAgICAjb25Mb2FkaW5nRmFpbGVkKF9jbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBldmVudCBmb3IgdGhpcyByZXF1ZXN0IGlzIHN0aWxsIHdhaXRpbmcgb24gYVxuICAgICAgICAvLyBjb3JyZXNwb25kaW5nIEV4dHJhSW5mbyBldmVudCwgdGhlbiB3YWl0IHRvIGVtaXQgdGhpcyBldmVudCB0b28uXG4gICAgICAgIGNvbnN0IHF1ZXVlZEV2ZW50cyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UXVldWVkRXZlbnRHcm91cChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAocXVldWVkRXZlbnRzKSB7XG4gICAgICAgICAgICBxdWV1ZWRFdmVudHMubG9hZGluZ0ZhaWxlZEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNlbWl0TG9hZGluZ0ZhaWxlZChldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2VtaXRMb2FkaW5nRmFpbGVkKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFJlcXVlc3QoZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgLy8gRm9yIGNlcnRhaW4gcmVxdWVzdElkcyB3ZSBuZXZlciByZWNlaXZlIHJlcXVlc3RXaWxsQmVTZW50IGV2ZW50LlxuICAgICAgICAvLyBAc2VlIGh0dHBzOi8vY3JidWcuY29tLzc1MDQ2OVxuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0Ll9mYWlsdXJlVGV4dCA9IGV2ZW50LmVycm9yVGV4dDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXF1ZXN0LnJlc3BvbnNlKCk7XG4gICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgcmVzcG9uc2UuX3Jlc29sdmVCb2R5KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZm9yZ2V0UmVxdWVzdChyZXF1ZXN0LCB0cnVlKTtcbiAgICAgICAgdGhpcy5lbWl0KE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdEZhaWxlZCwgcmVxdWVzdCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmV0d29ya01hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgcmFjZVdpdGggfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMnO1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbkV2ZW50IH0gZnJvbSAnLi4vYXBpL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgUGFnZSwgfSBmcm9tICcuLi9hcGkvUGFnZS5qcyc7XG5pbXBvcnQgeyBDb25zb2xlTWVzc2FnZSwgfSBmcm9tICcuLi9jb21tb24vQ29uc29sZU1lc3NhZ2UuanMnO1xuaW1wb3J0IHsgVGFyZ2V0Q2xvc2VFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgRmlsZUNob29zZXIgfSBmcm9tICcuLi9jb21tb24vRmlsZUNob29zZXIuanMnO1xuaW1wb3J0IHsgTmV0d29ya01hbmFnZXJFdmVudCB9IGZyb20gJy4uL2NvbW1vbi9OZXR3b3JrTWFuYWdlckV2ZW50cy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yLCBldmFsdWF0aW9uU3RyaW5nLCBnZXRSZWFkYWJsZUFzQnVmZmVyLCBnZXRSZWFkYWJsZUZyb21Qcm90b2NvbFN0cmVhbSwgcGFyc2VQREZPcHRpb25zLCB0aW1lb3V0LCB2YWxpZGF0ZURpYWxvZ1R5cGUsIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IEFzeW5jRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IGlzRXJyb3JMaWtlIH0gZnJvbSAnLi4vdXRpbC9FcnJvckxpa2UuanMnO1xuaW1wb3J0IHsgQmluZGluZyB9IGZyb20gJy4vQmluZGluZy5qcyc7XG5pbXBvcnQgeyBDZHBDRFBTZXNzaW9uIH0gZnJvbSAnLi9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IGlzVGFyZ2V0Q2xvc2VkRXJyb3IgfSBmcm9tICcuL0Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHsgQ292ZXJhZ2UgfSBmcm9tICcuL0NvdmVyYWdlLmpzJztcbmltcG9ydCB7IENkcERpYWxvZyB9IGZyb20gJy4vRGlhbG9nLmpzJztcbmltcG9ydCB7IEVtdWxhdGlvbk1hbmFnZXIgfSBmcm9tICcuL0VtdWxhdGlvbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRmlyZWZveFRhcmdldE1hbmFnZXIgfSBmcm9tICcuL0ZpcmVmb3hUYXJnZXRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlciB9IGZyb20gJy4vRnJhbWVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlckV2ZW50IH0gZnJvbSAnLi9GcmFtZU1hbmFnZXJFdmVudHMuanMnO1xuaW1wb3J0IHsgQ2RwS2V5Ym9hcmQsIENkcE1vdXNlLCBDZHBUb3VjaHNjcmVlbiB9IGZyb20gJy4vSW5wdXQuanMnO1xuaW1wb3J0IHsgTUFJTl9XT1JMRCB9IGZyb20gJy4vSXNvbGF0ZWRXb3JsZHMuanMnO1xuaW1wb3J0IHsgcmVsZWFzZU9iamVjdCB9IGZyb20gJy4vSlNIYW5kbGUuanMnO1xuaW1wb3J0IHsgVHJhY2luZyB9IGZyb20gJy4vVHJhY2luZy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVDbGllbnRFcnJvciwgcGFnZUJpbmRpbmdJbml0U3RyaW5nLCB2YWx1ZUZyb21SZW1vdGVPYmplY3QsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBDZHBXZWJXb3JrZXIgfSBmcm9tICcuL1dlYldvcmtlci5qcyc7XG5mdW5jdGlvbiBjb252ZXJ0Q29uc29sZU1lc3NhZ2VMZXZlbChtZXRob2QpIHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICBjYXNlICd3YXJuaW5nJzpcbiAgICAgICAgICAgIHJldHVybiAnd2Fybic7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBQYWdlIGV4dGVuZHMgUGFnZSB7XG4gICAgc3RhdGljIGFzeW5jIF9jcmVhdGUoY2xpZW50LCB0YXJnZXQsIGRlZmF1bHRWaWV3cG9ydCkge1xuICAgICAgICBjb25zdCBwYWdlID0gbmV3IENkcFBhZ2UoY2xpZW50LCB0YXJnZXQpO1xuICAgICAgICBhd2FpdCBwYWdlLiNpbml0aWFsaXplKCk7XG4gICAgICAgIGlmIChkZWZhdWx0Vmlld3BvcnQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5zZXRWaWV3cG9ydChkZWZhdWx0Vmlld3BvcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChpc0Vycm9yTGlrZShlcnIpICYmIGlzVGFyZ2V0Q2xvc2VkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWdlO1xuICAgIH1cbiAgICAjY2xvc2VkID0gZmFsc2U7XG4gICAgI3RhcmdldE1hbmFnZXI7XG4gICAgI3ByaW1hcnlUYXJnZXRDbGllbnQ7XG4gICAgI3ByaW1hcnlUYXJnZXQ7XG4gICAgI3RhYlRhcmdldENsaWVudDtcbiAgICAjdGFiVGFyZ2V0O1xuICAgICNrZXlib2FyZDtcbiAgICAjbW91c2U7XG4gICAgI3RvdWNoc2NyZWVuO1xuICAgICNmcmFtZU1hbmFnZXI7XG4gICAgI2VtdWxhdGlvbk1hbmFnZXI7XG4gICAgI3RyYWNpbmc7XG4gICAgI2JpbmRpbmdzID0gbmV3IE1hcCgpO1xuICAgICNleHBvc2VkRnVuY3Rpb25zID0gbmV3IE1hcCgpO1xuICAgICNjb3ZlcmFnZTtcbiAgICAjdmlld3BvcnQ7XG4gICAgI3dvcmtlcnMgPSBuZXcgTWFwKCk7XG4gICAgI2ZpbGVDaG9vc2VyRGVmZXJyZWRzID0gbmV3IFNldCgpO1xuICAgICNzZXNzaW9uQ2xvc2VEZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICNzZXJ2aWNlV29ya2VyQnlwYXNzZWQgPSBmYWxzZTtcbiAgICAjdXNlckRyYWdJbnRlcmNlcHRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgI2ZyYW1lTWFuYWdlckhhbmRsZXJzID0gW1xuICAgICAgICBbXG4gICAgICAgICAgICBGcmFtZU1hbmFnZXJFdmVudC5GcmFtZUF0dGFjaGVkLFxuICAgICAgICAgICAgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZnJhbWVhdHRhY2hlZFwiIC8qIFBhZ2VFdmVudC5GcmFtZUF0dGFjaGVkICovLCBmcmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICBGcmFtZU1hbmFnZXJFdmVudC5GcmFtZURldGFjaGVkLFxuICAgICAgICAgICAgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZnJhbWVkZXRhY2hlZFwiIC8qIFBhZ2VFdmVudC5GcmFtZURldGFjaGVkICovLCBmcmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICBGcmFtZU1hbmFnZXJFdmVudC5GcmFtZU5hdmlnYXRlZCxcbiAgICAgICAgICAgIChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImZyYW1lbmF2aWdhdGVkXCIgLyogUGFnZUV2ZW50LkZyYW1lTmF2aWdhdGVkICovLCBmcmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgIF07XG4gICAgI25ldHdvcmtNYW5hZ2VySGFuZGxlcnMgPSBbXG4gICAgICAgIFtcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdCxcbiAgICAgICAgICAgIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwicmVxdWVzdFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0ICovLCByZXF1ZXN0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdFNlcnZlZEZyb21DYWNoZSxcbiAgICAgICAgICAgIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwicmVxdWVzdHNlcnZlZGZyb21jYWNoZVwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0U2VydmVkRnJvbUNhY2hlICovLCByZXF1ZXN0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVzcG9uc2UsXG4gICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJyZXNwb25zZVwiIC8qIFBhZ2VFdmVudC5SZXNwb25zZSAqLywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmFpbGVkLFxuICAgICAgICAgICAgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJyZXF1ZXN0ZmFpbGVkXCIgLyogUGFnZUV2ZW50LlJlcXVlc3RGYWlsZWQgKi8sIHJlcXVlc3QpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmluaXNoZWQsXG4gICAgICAgICAgICAocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcInJlcXVlc3RmaW5pc2hlZFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0RmluaXNoZWQgKi8sIHJlcXVlc3QpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICBdO1xuICAgICNzZXNzaW9uSGFuZGxlcnMgPSBbXG4gICAgICAgIFtcbiAgICAgICAgICAgIENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4jc2Vzc2lvbkNsb3NlRGVmZXJyZWQucmVqZWN0KG5ldyBUYXJnZXRDbG9zZUVycm9yKCdUYXJnZXQgY2xvc2VkJykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgJ1BhZ2UuZG9tQ29udGVudEV2ZW50RmlyZWQnLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoXCJkb21jb250ZW50bG9hZGVkXCIgLyogUGFnZUV2ZW50LkRPTUNvbnRlbnRMb2FkZWQgKi8sIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICAnUGFnZS5sb2FkRXZlbnRGaXJlZCcsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdChcImxvYWRcIiAvKiBQYWdlRXZlbnQuTG9hZCAqLywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIFsnUGFnZS5qYXZhc2NyaXB0RGlhbG9nT3BlbmluZycsIHRoaXMuI29uRGlhbG9nLmJpbmQodGhpcyldLFxuICAgICAgICBbJ1J1bnRpbWUuZXhjZXB0aW9uVGhyb3duJywgdGhpcy4jaGFuZGxlRXhjZXB0aW9uLmJpbmQodGhpcyldLFxuICAgICAgICBbJ0luc3BlY3Rvci50YXJnZXRDcmFzaGVkJywgdGhpcy4jb25UYXJnZXRDcmFzaGVkLmJpbmQodGhpcyldLFxuICAgICAgICBbJ1BlcmZvcm1hbmNlLm1ldHJpY3MnLCB0aGlzLiNlbWl0TWV0cmljcy5iaW5kKHRoaXMpXSxcbiAgICAgICAgWydMb2cuZW50cnlBZGRlZCcsIHRoaXMuI29uTG9nRW50cnlBZGRlZC5iaW5kKHRoaXMpXSxcbiAgICAgICAgWydQYWdlLmZpbGVDaG9vc2VyT3BlbmVkJywgdGhpcy4jb25GaWxlQ2hvb3Nlci5iaW5kKHRoaXMpXSxcbiAgICBdO1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCwgdGFyZ2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3RhYlRhcmdldENsaWVudCA9IGNsaWVudC5wYXJlbnRTZXNzaW9uKCk7XG4gICAgICAgIGFzc2VydCh0aGlzLiN0YWJUYXJnZXRDbGllbnQsICdUYWIgdGFyZ2V0IHNlc3Npb24gaXMgbm90IGRlZmluZWQuJyk7XG4gICAgICAgIHRoaXMuI3RhYlRhcmdldCA9IHRoaXMuI3RhYlRhcmdldENsaWVudC5fdGFyZ2V0KCk7XG4gICAgICAgIGFzc2VydCh0aGlzLiN0YWJUYXJnZXQsICdUYWIgdGFyZ2V0IGlzIG5vdCBkZWZpbmVkLicpO1xuICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyID0gdGFyZ2V0Ll90YXJnZXRNYW5hZ2VyKCk7XG4gICAgICAgIHRoaXMuI2tleWJvYXJkID0gbmV3IENkcEtleWJvYXJkKGNsaWVudCk7XG4gICAgICAgIHRoaXMuI21vdXNlID0gbmV3IENkcE1vdXNlKGNsaWVudCwgdGhpcy4ja2V5Ym9hcmQpO1xuICAgICAgICB0aGlzLiN0b3VjaHNjcmVlbiA9IG5ldyBDZHBUb3VjaHNjcmVlbihjbGllbnQsIHRoaXMuI2tleWJvYXJkKTtcbiAgICAgICAgdGhpcy4jZnJhbWVNYW5hZ2VyID0gbmV3IEZyYW1lTWFuYWdlcihjbGllbnQsIHRoaXMsIHRoaXMuX3RpbWVvdXRTZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIgPSBuZXcgRW11bGF0aW9uTWFuYWdlcihjbGllbnQpO1xuICAgICAgICB0aGlzLiN0cmFjaW5nID0gbmV3IFRyYWNpbmcoY2xpZW50KTtcbiAgICAgICAgdGhpcy4jY292ZXJhZ2UgPSBuZXcgQ292ZXJhZ2UoY2xpZW50KTtcbiAgICAgICAgdGhpcy4jdmlld3BvcnQgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIHRoaXMuI2ZyYW1lTWFuYWdlckhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIub24oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIub24oRnJhbWVNYW5hZ2VyRXZlbnQuQ29uc29sZUFwaUNhbGxlZCwgKFt3b3JsZCwgZXZlbnRdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNvbkNvbnNvbGVBUEkod29ybGQsIGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5vbihGcmFtZU1hbmFnZXJFdmVudC5CaW5kaW5nQ2FsbGVkLCAoW3dvcmxkLCBldmVudF0pID0+IHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25CaW5kaW5nQ2FsbGVkKHdvcmxkLCBldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIHRoaXMuI25ldHdvcmtNYW5hZ2VySGFuZGxlcnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBhbnkuXG4gICAgICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIubmV0d29ya01hbmFnZXIub24oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN0YWJUYXJnZXRDbGllbnQub24oQ0RQU2Vzc2lvbkV2ZW50LlN3YXBwZWQsIHRoaXMuI29uQWN0aXZhdGlvbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy4jdGFiVGFyZ2V0Q2xpZW50Lm9uKENEUFNlc3Npb25FdmVudC5SZWFkeSwgdGhpcy4jb25TZWNvbmRhcnlUYXJnZXQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXRHb25lXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldEdvbmUgKi8sIHRoaXMuI29uRGV0YWNoZWRGcm9tVGFyZ2V0KTtcbiAgICAgICAgdGhpcy4jdGFiVGFyZ2V0Ll9pc0Nsb3NlZERlZmVycmVkXG4gICAgICAgICAgICAudmFsdWVPclRocm93KClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub2ZmKFwidGFyZ2V0R29uZVwiIC8qIFRhcmdldE1hbmFnZXJFdmVudC5UYXJnZXRHb25lICovLCB0aGlzLiNvbkRldGFjaGVkRnJvbVRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHRoaXMuI2Nsb3NlZCA9IHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIHRoaXMuI3NldHVwUHJpbWFyeVRhcmdldExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLiNhdHRhY2hFeGlzdGluZ1RhcmdldHMoKTtcbiAgICB9XG4gICAgI2F0dGFjaEV4aXN0aW5nVGFyZ2V0cygpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZFRhcmdldCBvZiB0aGlzLiN0YXJnZXRNYW5hZ2VyLmdldENoaWxkVGFyZ2V0cyh0aGlzLiNwcmltYXJ5VGFyZ2V0KSkge1xuICAgICAgICAgICAgcXVldWUucHVzaChjaGlsZFRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlkeCA9IDA7XG4gICAgICAgIHdoaWxlIChpZHggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBxdWV1ZVtpZHhdO1xuICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gbmV4dC5fc2Vzc2lvbigpO1xuICAgICAgICAgICAgaWYgKHNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNvbkF0dGFjaGVkVG9UYXJnZXQoc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkVGFyZ2V0IG9mIHRoaXMuI3RhcmdldE1hbmFnZXIuZ2V0Q2hpbGRUYXJnZXRzKG5leHQpKSB7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaChjaGlsZFRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI29uQWN0aXZhdGlvbihuZXdTZXNzaW9uKSB7XG4gICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQgPSBuZXdTZXNzaW9uO1xuICAgICAgICBhc3NlcnQodGhpcy4jcHJpbWFyeVRhcmdldENsaWVudCBpbnN0YW5jZW9mIENkcENEUFNlc3Npb24sICdDRFBTZXNzaW9uIGlzIG5vdCBpbnN0YW5jZSBvZiBDRFBTZXNzaW9uSW1wbCcpO1xuICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0ID0gdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5fdGFyZ2V0KCk7XG4gICAgICAgIGFzc2VydCh0aGlzLiNwcmltYXJ5VGFyZ2V0LCAnTWlzc2luZyB0YXJnZXQgb24gc3dhcCcpO1xuICAgICAgICB0aGlzLiNrZXlib2FyZC51cGRhdGVDbGllbnQobmV3U2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI21vdXNlLnVwZGF0ZUNsaWVudChuZXdTZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jdG91Y2hzY3JlZW4udXBkYXRlQ2xpZW50KG5ld1Nlc3Npb24pO1xuICAgICAgICB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLnVwZGF0ZUNsaWVudChuZXdTZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jdHJhY2luZy51cGRhdGVDbGllbnQobmV3U2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI2NvdmVyYWdlLnVwZGF0ZUNsaWVudChuZXdTZXNzaW9uKTtcbiAgICAgICAgYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLnN3YXBGcmFtZVRyZWUobmV3U2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI3NldHVwUHJpbWFyeVRhcmdldExpc3RlbmVycygpO1xuICAgIH1cbiAgICBhc3luYyAjb25TZWNvbmRhcnlUYXJnZXQoc2Vzc2lvbikge1xuICAgICAgICBhc3NlcnQoc2Vzc2lvbiBpbnN0YW5jZW9mIENkcENEUFNlc3Npb24pO1xuICAgICAgICBpZiAoc2Vzc2lvbi5fdGFyZ2V0KCkuX3N1YnR5cGUoKSAhPT0gJ3ByZXJlbmRlcicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIucmVnaXN0ZXJTcGVjdWxhdGl2ZVNlc3Npb24oc2Vzc2lvbikuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIHRoaXMuI2VtdWxhdGlvbk1hbmFnZXJcbiAgICAgICAgICAgIC5yZWdpc3RlclNwZWN1bGF0aXZlU2Vzc2lvbihzZXNzaW9uKVxuICAgICAgICAgICAgLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHVwIGxpc3RlbmVycyBmb3IgdGhlIHByaW1hcnkgdGFyZ2V0LiBUaGUgcHJpbWFyeSB0YXJnZXQgY2FuIGNoYW5nZVxuICAgICAqIGR1cmluZyBhIG5hdmlnYXRpb24gdG8gYSBwcmVyZW5kZWQgcGFnZS5cbiAgICAgKi9cbiAgICAjc2V0dXBQcmltYXJ5VGFyZ2V0TGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50Lm9uKENEUFNlc3Npb25FdmVudC5SZWFkeSwgdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KTtcbiAgICAgICAgZm9yIChjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSBvZiB0aGlzLiNzZXNzaW9uSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBhbnkuXG4gICAgICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50Lm9uKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uRGV0YWNoZWRGcm9tVGFyZ2V0ID0gKHRhcmdldCkgPT4ge1xuICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSB0YXJnZXQuX3Nlc3Npb24oKT8uaWQoKTtcbiAgICAgICAgY29uc3Qgd29ya2VyID0gdGhpcy4jd29ya2Vycy5nZXQoc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCF3b3JrZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN3b3JrZXJzLmRlbGV0ZShzZXNzaW9uSWQpO1xuICAgICAgICB0aGlzLmVtaXQoXCJ3b3JrZXJkZXN0cm95ZWRcIiAvKiBQYWdlRXZlbnQuV29ya2VyRGVzdHJveWVkICovLCB3b3JrZXIpO1xuICAgIH07XG4gICAgI29uQXR0YWNoZWRUb1RhcmdldCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICAgIGFzc2VydChzZXNzaW9uIGluc3RhbmNlb2YgQ2RwQ0RQU2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5vbkF0dGFjaGVkVG9UYXJnZXQoc2Vzc2lvbi5fdGFyZ2V0KCkpO1xuICAgICAgICBpZiAoc2Vzc2lvbi5fdGFyZ2V0KCkuX2dldFRhcmdldEluZm8oKS50eXBlID09PSAnd29ya2VyJykge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gbmV3IENkcFdlYldvcmtlcihzZXNzaW9uLCBzZXNzaW9uLl90YXJnZXQoKS51cmwoKSwgc2Vzc2lvbi5fdGFyZ2V0KCkuX3RhcmdldElkLCBzZXNzaW9uLl90YXJnZXQoKS50eXBlKCksIHRoaXMuI2FkZENvbnNvbGVNZXNzYWdlLmJpbmQodGhpcyksIHRoaXMuI2hhbmRsZUV4Y2VwdGlvbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuI3dvcmtlcnMuc2V0KHNlc3Npb24uaWQoKSwgd29ya2VyKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcIndvcmtlcmNyZWF0ZWRcIiAvKiBQYWdlRXZlbnQuV29ya2VyQ3JlYXRlZCAqLywgd29ya2VyKTtcbiAgICAgICAgfVxuICAgICAgICBzZXNzaW9uLm9uKENEUFNlc3Npb25FdmVudC5SZWFkeSwgdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KTtcbiAgICB9O1xuICAgIGFzeW5jICNpbml0aWFsaXplKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5pbml0aWFsaXplKHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQpLFxuICAgICAgICAgICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnUGVyZm9ybWFuY2UuZW5hYmxlJyksXG4gICAgICAgICAgICAgICAgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdMb2cuZW5hYmxlJyksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyKSAmJiBpc1RhcmdldENsb3NlZEVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI29uRmlsZUNob29zZXIoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzLnNpemUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuI2ZyYW1lTWFuYWdlci5mcmFtZShldmVudC5mcmFtZUlkKTtcbiAgICAgICAgICAgIGFzc2VydChmcmFtZSwgJ1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4nKTtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSBhbiBIVE1MSW5wdXRFbGVtZW50IGhhbmRsZSBieSB0aGUgZXZlbnQuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMSwgKGF3YWl0IGZyYW1lLndvcmxkc1tNQUlOX1dPUkxEXS5hZG9wdEJhY2tlbmROb2RlKGV2ZW50LmJhY2tlbmROb2RlSWQpKSwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc3QgZmlsZUNob29zZXIgPSBuZXcgRmlsZUNob29zZXIoaGFuZGxlLm1vdmUoKSwgZXZlbnQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9taXNlIG9mIHRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKGZpbGVDaG9vc2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMSkge1xuICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICBlbnZfMS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9jbGllbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50O1xuICAgIH1cbiAgICBpc1NlcnZpY2VXb3JrZXJCeXBhc3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NlcnZpY2VXb3JrZXJCeXBhc3NlZDtcbiAgICB9XG4gICAgaXNEcmFnSW50ZXJjZXB0aW9uRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3VzZXJEcmFnSW50ZXJjZXB0aW9uRW5hYmxlZDtcbiAgICB9XG4gICAgaXNKYXZhU2NyaXB0RW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuamF2YXNjcmlwdEVuYWJsZWQ7XG4gICAgfVxuICAgIGFzeW5jIHdhaXRGb3JGaWxlQ2hvb3NlcihvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgbmVlZHNFbmFibGUgPSB0aGlzLiNmaWxlQ2hvb3NlckRlZmVycmVkcy5zaXplID09PSAwO1xuICAgICAgICBjb25zdCB7IHRpbWVvdXQgPSB0aGlzLl90aW1lb3V0U2V0dGluZ3MudGltZW91dCgpIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSh7XG4gICAgICAgICAgICBtZXNzYWdlOiBgV2FpdGluZyBmb3IgXFxgRmlsZUNob29zZXJcXGAgZmFpbGVkOiAke3RpbWVvdXR9bXMgZXhjZWVkZWRgLFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gICAgICAgIGxldCBlbmFibGVQcm9taXNlO1xuICAgICAgICBpZiAobmVlZHNFbmFibGUpIHtcbiAgICAgICAgICAgIGVuYWJsZVByb21pc2UgPSB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ1BhZ2Uuc2V0SW50ZXJjZXB0RmlsZUNob29zZXJEaWFsb2cnLCB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC52YWx1ZU9yVGhyb3coKSxcbiAgICAgICAgICAgICAgICBlbmFibGVQcm9taXNlLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy4jZmlsZUNob29zZXJEZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNldEdlb2xvY2F0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuc2V0R2VvbG9jYXRpb24ob3B0aW9ucyk7XG4gICAgfVxuICAgIHRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3ByaW1hcnlUYXJnZXQ7XG4gICAgfVxuICAgIGJyb3dzZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmltYXJ5VGFyZ2V0LmJyb3dzZXIoKTtcbiAgICB9XG4gICAgYnJvd3NlckNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmltYXJ5VGFyZ2V0LmJyb3dzZXJDb250ZXh0KCk7XG4gICAgfVxuICAgICNvblRhcmdldENyYXNoZWQoKSB7XG4gICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIgLyogUGFnZUV2ZW50LkVycm9yICovLCBuZXcgRXJyb3IoJ1BhZ2UgY3Jhc2hlZCEnKSk7XG4gICAgfVxuICAgICNvbkxvZ0VudHJ5QWRkZWQoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgeyBsZXZlbCwgdGV4dCwgYXJncywgc291cmNlLCB1cmwsIGxpbmVOdW1iZXIgfSA9IGV2ZW50LmVudHJ5O1xuICAgICAgICBpZiAoYXJncykge1xuICAgICAgICAgICAgYXJncy5tYXAoYXJnID0+IHtcbiAgICAgICAgICAgICAgICB2b2lkIHJlbGVhc2VPYmplY3QodGhpcy4jcHJpbWFyeVRhcmdldENsaWVudCwgYXJnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UgIT09ICd3b3JrZXInKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJjb25zb2xlXCIgLyogUGFnZUV2ZW50LkNvbnNvbGUgKi8sIG5ldyBDb25zb2xlTWVzc2FnZShjb252ZXJ0Q29uc29sZU1lc3NhZ2VMZXZlbChsZXZlbCksIHRleHQsIFtdLCBbeyB1cmwsIGxpbmVOdW1iZXIgfV0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtYWluRnJhbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmcmFtZU1hbmFnZXIubWFpbkZyYW1lKCk7XG4gICAgfVxuICAgIGdldCBrZXlib2FyZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2tleWJvYXJkO1xuICAgIH1cbiAgICBnZXQgdG91Y2hzY3JlZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0b3VjaHNjcmVlbjtcbiAgICB9XG4gICAgZ2V0IGNvdmVyYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY292ZXJhZ2U7XG4gICAgfVxuICAgIGdldCB0cmFjaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhY2luZztcbiAgICB9XG4gICAgZnJhbWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVNYW5hZ2VyLmZyYW1lcygpO1xuICAgIH1cbiAgICB3b3JrZXJzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiN3b3JrZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0UmVxdWVzdEludGVyY2VwdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLnNldFJlcXVlc3RJbnRlcmNlcHRpb24odmFsdWUpO1xuICAgIH1cbiAgICBhc3luYyBzZXRCeXBhc3NTZXJ2aWNlV29ya2VyKGJ5cGFzcykge1xuICAgICAgICB0aGlzLiNzZXJ2aWNlV29ya2VyQnlwYXNzZWQgPSBieXBhc3M7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ05ldHdvcmsuc2V0QnlwYXNzU2VydmljZVdvcmtlcicsIHsgYnlwYXNzIH0pO1xuICAgIH1cbiAgICBhc3luYyBzZXREcmFnSW50ZXJjZXB0aW9uKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy4jdXNlckRyYWdJbnRlcmNlcHRpb25FbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnSW5wdXQuc2V0SW50ZXJjZXB0RHJhZ3MnLCB7XG4gICAgICAgICAgICBlbmFibGVkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2V0T2ZmbGluZU1vZGUoZW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLnNldE9mZmxpbmVNb2RlKGVuYWJsZWQpO1xuICAgIH1cbiAgICBhc3luYyBlbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMobmV0d29ya0NvbmRpdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMobmV0d29ya0NvbmRpdGlvbnMpO1xuICAgIH1cbiAgICBzZXREZWZhdWx0TmF2aWdhdGlvblRpbWVvdXQodGltZW91dCkge1xuICAgICAgICB0aGlzLl90aW1lb3V0U2V0dGluZ3Muc2V0RGVmYXVsdE5hdmlnYXRpb25UaW1lb3V0KHRpbWVvdXQpO1xuICAgIH1cbiAgICBzZXREZWZhdWx0VGltZW91dCh0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuX3RpbWVvdXRTZXR0aW5ncy5zZXREZWZhdWx0VGltZW91dCh0aW1lb3V0KTtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdFRpbWVvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lb3V0U2V0dGluZ3MudGltZW91dCgpO1xuICAgIH1cbiAgICBhc3luYyBxdWVyeU9iamVjdHMocHJvdG90eXBlSGFuZGxlKSB7XG4gICAgICAgIGFzc2VydCghcHJvdG90eXBlSGFuZGxlLmRpc3Bvc2VkLCAnUHJvdG90eXBlIEpTSGFuZGxlIGlzIGRpc3Bvc2VkIScpO1xuICAgICAgICBhc3NlcnQocHJvdG90eXBlSGFuZGxlLmlkLCAnUHJvdG90eXBlIEpTSGFuZGxlIG11c3Qgbm90IGJlIHJlZmVyZW5jaW5nIHByaW1pdGl2ZSB2YWx1ZScpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuY2xpZW50LnNlbmQoJ1J1bnRpbWUucXVlcnlPYmplY3RzJywge1xuICAgICAgICAgICAgcHJvdG90eXBlT2JqZWN0SWQ6IHByb3RvdHlwZUhhbmRsZS5pZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpXG4gICAgICAgICAgICAubWFpblJlYWxtKClcbiAgICAgICAgICAgIC5jcmVhdGVDZHBIYW5kbGUocmVzcG9uc2Uub2JqZWN0cyk7XG4gICAgfVxuICAgIGFzeW5jIGNvb2tpZXMoLi4udXJscykge1xuICAgICAgICBjb25zdCBvcmlnaW5hbENvb2tpZXMgPSAoYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdOZXR3b3JrLmdldENvb2tpZXMnLCB7XG4gICAgICAgICAgICB1cmxzOiB1cmxzLmxlbmd0aCA/IHVybHMgOiBbdGhpcy51cmwoKV0sXG4gICAgICAgIH0pKS5jb29raWVzO1xuICAgICAgICBjb25zdCB1bnN1cHBvcnRlZENvb2tpZUF0dHJpYnV0ZXMgPSBbJ3NvdXJjZVBvcnQnXTtcbiAgICAgICAgY29uc3QgZmlsdGVyVW5zdXBwb3J0ZWRBdHRyaWJ1dGVzID0gKGNvb2tpZSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIHVuc3VwcG9ydGVkQ29va2llQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb29raWVbYXR0cl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29va2llO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxDb29raWVzLm1hcChmaWx0ZXJVbnN1cHBvcnRlZEF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgICBhc3luYyBkZWxldGVDb29raWUoLi4uY29va2llcykge1xuICAgICAgICBjb25zdCBwYWdlVVJMID0gdGhpcy51cmwoKTtcbiAgICAgICAgZm9yIChjb25zdCBjb29raWUgb2YgY29va2llcykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGNvb2tpZSk7XG4gICAgICAgICAgICBpZiAoIWNvb2tpZS51cmwgJiYgcGFnZVVSTC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICAgICAgICBpdGVtLnVybCA9IHBhZ2VVUkw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ05ldHdvcmsuZGVsZXRlQ29va2llcycsIGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNldENvb2tpZSguLi5jb29raWVzKSB7XG4gICAgICAgIGNvbnN0IHBhZ2VVUkwgPSB0aGlzLnVybCgpO1xuICAgICAgICBjb25zdCBzdGFydHNXaXRoSFRUUCA9IHBhZ2VVUkwuc3RhcnRzV2l0aCgnaHR0cCcpO1xuICAgICAgICBjb25zdCBpdGVtcyA9IGNvb2tpZXMubWFwKGNvb2tpZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgY29va2llKTtcbiAgICAgICAgICAgIGlmICghaXRlbS51cmwgJiYgc3RhcnRzV2l0aEhUVFApIHtcbiAgICAgICAgICAgICAgICBpdGVtLnVybCA9IHBhZ2VVUkw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQoaXRlbS51cmwgIT09ICdhYm91dDpibGFuaycsIGBCbGFuayBwYWdlIGNhbiBub3QgaGF2ZSBjb29raWUgXCIke2l0ZW0ubmFtZX1cImApO1xuICAgICAgICAgICAgYXNzZXJ0KCFTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGguY2FsbChpdGVtLnVybCB8fCAnJywgJ2RhdGE6JyksIGBEYXRhIFVSTCBwYWdlIGNhbiBub3QgaGF2ZSBjb29raWUgXCIke2l0ZW0ubmFtZX1cImApO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUNvb2tpZSguLi5pdGVtcyk7XG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnTmV0d29yay5zZXRDb29raWVzJywge1xuICAgICAgICAgICAgICAgIGNvb2tpZXM6IGl0ZW1zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZXhwb3NlRnVuY3Rpb24obmFtZSwgcHB0ckZ1bmN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLiNiaW5kaW5ncy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGFkZCBwYWdlIGJpbmRpbmcgd2l0aCBuYW1lICR7bmFtZX06IHdpbmRvd1snJHtuYW1lfSddIGFscmVhZHkgZXhpc3RzIWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHBhZ2VCaW5kaW5nSW5pdFN0cmluZygnZXhwb3NlZEZ1bicsIG5hbWUpO1xuICAgICAgICBsZXQgYmluZGluZztcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgcHB0ckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICAgICAgYmluZGluZyA9IG5ldyBCaW5kaW5nKG5hbWUsIHBwdHJGdW5jdGlvbiwgc291cmNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYmluZGluZyA9IG5ldyBCaW5kaW5nKG5hbWUsIHBwdHJGdW5jdGlvbi5kZWZhdWx0LCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2JpbmRpbmdzLnNldChuYW1lLCBiaW5kaW5nKTtcbiAgICAgICAgY29uc3QgW3sgaWRlbnRpZmllciB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5ldmFsdWF0ZU9uTmV3RG9jdW1lbnQoc291cmNlKSxcbiAgICAgICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nKGJpbmRpbmcpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy4jZXhwb3NlZEZ1bmN0aW9ucy5zZXQobmFtZSwgaWRlbnRpZmllcik7XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZUV4cG9zZWRGdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGV4cG9zZWRGdW5jdGlvbklkID0gdGhpcy4jZXhwb3NlZEZ1bmN0aW9ucy5nZXQobmFtZSk7XG4gICAgICAgIGlmICghZXhwb3NlZEZ1bmN0aW9uSWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb24gd2l0aCBuYW1lIFwiJHtuYW1lfVwiIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gI2JpbmRpbmdzIG11c3QgYmUgdXBkYXRlZCB0b2dldGhlciB3aXRoICNleHBvc2VkRnVuY3Rpb25zLlxuICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy4jYmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgICAgICB0aGlzLiNleHBvc2VkRnVuY3Rpb25zLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgdGhpcy4jYmluZGluZ3MuZGVsZXRlKG5hbWUpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIucmVtb3ZlU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQoZXhwb3NlZEZ1bmN0aW9uSWQpLFxuICAgICAgICAgICAgdGhpcy4jZnJhbWVNYW5hZ2VyLnJlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZyksXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBhc3luYyBhdXRoZW50aWNhdGUoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5hdXRoZW50aWNhdGUoY3JlZGVudGlhbHMpO1xuICAgIH1cbiAgICBhc3luYyBzZXRFeHRyYUhUVFBIZWFkZXJzKGhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5zZXRFeHRyYUhUVFBIZWFkZXJzKGhlYWRlcnMpO1xuICAgIH1cbiAgICBhc3luYyBzZXRVc2VyQWdlbnQodXNlckFnZW50LCB1c2VyQWdlbnRNZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLnNldFVzZXJBZ2VudCh1c2VyQWdlbnQsIHVzZXJBZ2VudE1ldGFkYXRhKTtcbiAgICB9XG4gICAgYXN5bmMgbWV0cmljcygpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ1BlcmZvcm1hbmNlLmdldE1ldHJpY3MnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2J1aWxkTWV0cmljc09iamVjdChyZXNwb25zZS5tZXRyaWNzKTtcbiAgICB9XG4gICAgI2VtaXRNZXRyaWNzKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZW1pdChcIm1ldHJpY3NcIiAvKiBQYWdlRXZlbnQuTWV0cmljcyAqLywge1xuICAgICAgICAgICAgdGl0bGU6IGV2ZW50LnRpdGxlLFxuICAgICAgICAgICAgbWV0cmljczogdGhpcy4jYnVpbGRNZXRyaWNzT2JqZWN0KGV2ZW50Lm1ldHJpY3MpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgI2J1aWxkTWV0cmljc09iamVjdChtZXRyaWNzKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IG1ldHJpYyBvZiBtZXRyaWNzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoc3VwcG9ydGVkTWV0cmljcy5oYXMobWV0cmljLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W21ldHJpYy5uYW1lXSA9IG1ldHJpYy52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAjaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgICB0aGlzLmVtaXQoXCJwYWdlZXJyb3JcIiAvKiBQYWdlRXZlbnQuUGFnZUVycm9yICovLCBjcmVhdGVDbGllbnRFcnJvcihleGNlcHRpb24uZXhjZXB0aW9uRGV0YWlscykpO1xuICAgIH1cbiAgICAjb25Db25zb2xlQVBJKHdvcmxkLCBldmVudCkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBldmVudC5hcmdzLm1hcChhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdvcmxkLmNyZWF0ZUNkcEhhbmRsZShhcmcpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jYWRkQ29uc29sZU1lc3NhZ2UoY29udmVydENvbnNvbGVNZXNzYWdlTGV2ZWwoZXZlbnQudHlwZSksIHZhbHVlcywgZXZlbnQuc3RhY2tUcmFjZSk7XG4gICAgfVxuICAgIGFzeW5jICNvbkJpbmRpbmdDYWxsZWQod29ybGQsIGV2ZW50KSB7XG4gICAgICAgIGxldCBwYXlsb2FkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoZXZlbnQucGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgLy8gVGhlIGJpbmRpbmcgd2FzIGVpdGhlciBjYWxsZWQgYnkgc29tZXRoaW5nIGluIHRoZSBwYWdlIG9yIGl0IHdhc1xuICAgICAgICAgICAgLy8gY2FsbGVkIGJlZm9yZSBvdXIgd3JhcHBlciB3YXMgaW5pdGlhbGl6ZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlLCBuYW1lLCBzZXEsIGFyZ3MsIGlzVHJpdmlhbCB9ID0gcGF5bG9hZDtcbiAgICAgICAgaWYgKHR5cGUgIT09ICdleHBvc2VkRnVuJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB3b3JsZC5jb250ZXh0O1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy4jYmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgICAgICBhd2FpdCBiaW5kaW5nPy5ydW4oY29udGV4dCwgc2VxLCBhcmdzLCBpc1RyaXZpYWwpO1xuICAgIH1cbiAgICAjYWRkQ29uc29sZU1lc3NhZ2UoZXZlbnRUeXBlLCBhcmdzLCBzdGFja1RyYWNlKSB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lckNvdW50KFwiY29uc29sZVwiIC8qIFBhZ2VFdmVudC5Db25zb2xlICovKSkge1xuICAgICAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0VG9rZW5zID0gW107XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuIC0tIFRoZSBjb21tZW50IGlzIGxvbmcuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBydWxlc2Rpci91c2UtdXNpbmcgLS0gVGhlc2UgYXJlIG5vdCBvd25lZCBieSB0aGlzIGZ1bmN0aW9uLlxuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdGVPYmplY3QgPSBhcmcucmVtb3RlT2JqZWN0KCk7XG4gICAgICAgICAgICBpZiAocmVtb3RlT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICAgICAgdGV4dFRva2Vucy5wdXNoKGFyZy50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRleHRUb2tlbnMucHVzaCh2YWx1ZUZyb21SZW1vdGVPYmplY3QocmVtb3RlT2JqZWN0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhY2tUcmFjZUxvY2F0aW9ucyA9IFtdO1xuICAgICAgICBpZiAoc3RhY2tUcmFjZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYWxsRnJhbWUgb2Ygc3RhY2tUcmFjZS5jYWxsRnJhbWVzKSB7XG4gICAgICAgICAgICAgICAgc3RhY2tUcmFjZUxvY2F0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBjYWxsRnJhbWUudXJsLFxuICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBjYWxsRnJhbWUubGluZU51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyOiBjYWxsRnJhbWUuY29sdW1uTnVtYmVyLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgQ29uc29sZU1lc3NhZ2UoY29udmVydENvbnNvbGVNZXNzYWdlTGV2ZWwoZXZlbnRUeXBlKSwgdGV4dFRva2Vucy5qb2luKCcgJyksIGFyZ3MsIHN0YWNrVHJhY2VMb2NhdGlvbnMpO1xuICAgICAgICB0aGlzLmVtaXQoXCJjb25zb2xlXCIgLyogUGFnZUV2ZW50LkNvbnNvbGUgKi8sIG1lc3NhZ2UpO1xuICAgIH1cbiAgICAjb25EaWFsb2coZXZlbnQpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbGlkYXRlRGlhbG9nVHlwZShldmVudC50eXBlKTtcbiAgICAgICAgY29uc3QgZGlhbG9nID0gbmV3IENkcERpYWxvZyh0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LCB0eXBlLCBldmVudC5tZXNzYWdlLCBldmVudC5kZWZhdWx0UHJvbXB0KTtcbiAgICAgICAgdGhpcy5lbWl0KFwiZGlhbG9nXCIgLyogUGFnZUV2ZW50LkRpYWxvZyAqLywgZGlhbG9nKTtcbiAgICB9XG4gICAgYXN5bmMgcmVsb2FkKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLndhaXRGb3JOYXZpZ2F0aW9uKHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgIGlnbm9yZVNhbWVEb2N1bWVudE5hdmlnYXRpb246IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnUGFnZS5yZWxvYWQnKSxcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIGNyZWF0ZUNEUFNlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRhcmdldCgpLmNyZWF0ZUNEUFNlc3Npb24oKTtcbiAgICB9XG4gICAgYXN5bmMgZ29CYWNrKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZ28oLTEsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBhc3luYyBnb0ZvcndhcmQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNnbygrMSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGFzeW5jICNnbyhkZWx0YSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBoaXN0b3J5ID0gYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5Jyk7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gaGlzdG9yeS5lbnRyaWVzW2hpc3RvcnkuY3VycmVudEluZGV4ICsgZGVsdGFdO1xuICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLndhaXRGb3JOYXZpZ2F0aW9uKG9wdGlvbnMpLFxuICAgICAgICAgICAgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLm5hdmlnYXRlVG9IaXN0b3J5RW50cnknLCB7XG4gICAgICAgICAgICAgICAgZW50cnlJZDogZW50cnkuaWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiByZXN1bHRbMF07XG4gICAgfVxuICAgIGFzeW5jIGJyaW5nVG9Gcm9udCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmJyaW5nVG9Gcm9udCcpO1xuICAgIH1cbiAgICBhc3luYyBzZXRKYXZhU2NyaXB0RW5hYmxlZChlbmFibGVkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLnNldEphdmFTY3JpcHRFbmFibGVkKGVuYWJsZWQpO1xuICAgIH1cbiAgICBhc3luYyBzZXRCeXBhc3NDU1AoZW5hYmxlZCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ1BhZ2Uuc2V0QnlwYXNzQ1NQJywgeyBlbmFibGVkIH0pO1xuICAgIH1cbiAgICBhc3luYyBlbXVsYXRlTWVkaWFUeXBlKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuZW11bGF0ZU1lZGlhVHlwZSh0eXBlKTtcbiAgICB9XG4gICAgYXN5bmMgZW11bGF0ZUNQVVRocm90dGxpbmcoZmFjdG9yKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLmVtdWxhdGVDUFVUaHJvdHRsaW5nKGZhY3Rvcik7XG4gICAgfVxuICAgIGFzeW5jIGVtdWxhdGVNZWRpYUZlYXR1cmVzKGZlYXR1cmVzKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLmVtdWxhdGVNZWRpYUZlYXR1cmVzKGZlYXR1cmVzKTtcbiAgICB9XG4gICAgYXN5bmMgZW11bGF0ZVRpbWV6b25lKHRpbWV6b25lSWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuZW11bGF0ZVRpbWV6b25lKHRpbWV6b25lSWQpO1xuICAgIH1cbiAgICBhc3luYyBlbXVsYXRlSWRsZVN0YXRlKG92ZXJyaWRlcykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZW11bGF0aW9uTWFuYWdlci5lbXVsYXRlSWRsZVN0YXRlKG92ZXJyaWRlcyk7XG4gICAgfVxuICAgIGFzeW5jIGVtdWxhdGVWaXNpb25EZWZpY2llbmN5KHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuZW11bGF0ZVZpc2lvbkRlZmljaWVuY3kodHlwZSk7XG4gICAgfVxuICAgIGFzeW5jIHNldFZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgICAgIGNvbnN0IG5lZWRzUmVsb2FkID0gYXdhaXQgdGhpcy4jZW11bGF0aW9uTWFuYWdlci5lbXVsYXRlVmlld3BvcnQodmlld3BvcnQpO1xuICAgICAgICB0aGlzLiN2aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICAgICBpZiAobmVlZHNSZWxvYWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlld3BvcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2aWV3cG9ydDtcbiAgICB9XG4gICAgYXN5bmMgZXZhbHVhdGVPbk5ld0RvY3VtZW50KHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmFsdWF0aW9uU3RyaW5nKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNmcmFtZU1hbmFnZXIuZXZhbHVhdGVPbk5ld0RvY3VtZW50KHNvdXJjZSk7XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZVNjcmlwdFRvRXZhbHVhdGVPbk5ld0RvY3VtZW50KGlkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5yZW1vdmVTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudChpZGVudGlmaWVyKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0Q2FjaGVFbmFibGVkKGVuYWJsZWQgPSB0cnVlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5zZXRDYWNoZUVuYWJsZWQoZW5hYmxlZCk7XG4gICAgfVxuICAgIGFzeW5jIF9zY3JlZW5zaG90KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZW52XzIgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IGZyb21TdXJmYWNlLCBvbWl0QmFja2dyb3VuZCwgb3B0aW1pemVGb3JTcGVlZCwgcXVhbGl0eSwgY2xpcDogdXNlckNsaXAsIHR5cGUsIGNhcHR1cmVCZXlvbmRWaWV3cG9ydCwgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBpc0ZpcmVmb3ggPSB0aGlzLnRhcmdldCgpLl90YXJnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBGaXJlZm94VGFyZ2V0TWFuYWdlcjtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzIsIG5ldyBBc3luY0Rpc3Bvc2FibGVTdGFjaygpLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIEZpcmVmb3ggb21pdHMgYmFja2dyb3VuZCBieSBkZWZhdWx0OyBpdCdzIG5vdCBjb25maWd1cmFibGUuXG4gICAgICAgICAgICBpZiAoIWlzRmlyZWZveCAmJiBvbWl0QmFja2dyb3VuZCAmJiAodHlwZSA9PT0gJ3BuZycgfHwgdHlwZSA9PT0gJ3dlYnAnKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kQ29sb3IoKTtcbiAgICAgICAgICAgICAgICBzdGFjay5kZWZlcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3IoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNsaXAgPSB1c2VyQ2xpcDtcbiAgICAgICAgICAgIGlmIChjbGlwICYmICFjYXB0dXJlQmV5b25kVmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IGF3YWl0IHRoaXMubWFpbkZyYW1lKClcbiAgICAgICAgICAgICAgICAgICAgLmlzb2xhdGVkUmVhbG0oKVxuICAgICAgICAgICAgICAgICAgICAuZXZhbHVhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGhlaWdodCwgcGFnZUxlZnQ6IHgsIHBhZ2VUb3A6IHksIHdpZHRoLCB9ID0gd2luZG93LnZpc3VhbFZpZXdwb3J0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB4LCB5LCBoZWlnaHQsIHdpZHRoIH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2xpcCA9IGdldEludGVyc2VjdGlvblJlY3QoY2xpcCwgdmlld3BvcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGVzZSBzcHJlYWRzIGJlY2F1c2UgRmlyZWZveCBkb2Vzbid0IGFsbG93IHVua25vd24gb3B0aW9ucy5cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmNhcHR1cmVTY3JlZW5zaG90Jywge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogdHlwZSxcbiAgICAgICAgICAgICAgICAuLi4ob3B0aW1pemVGb3JTcGVlZCA/IHsgb3B0aW1pemVGb3JTcGVlZCB9IDoge30pLFxuICAgICAgICAgICAgICAgIC4uLihxdWFsaXR5ICE9PSB1bmRlZmluZWQgPyB7IHF1YWxpdHk6IE1hdGgucm91bmQocXVhbGl0eSkgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAuLi4oY2xpcCA/IHsgY2xpcDogeyAuLi5jbGlwLCBzY2FsZTogY2xpcC5zY2FsZSA/PyAxIH0gfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAuLi4oIWZyb21TdXJmYWNlID8geyBmcm9tU3VyZmFjZSB9IDoge30pLFxuICAgICAgICAgICAgICAgIGNhcHR1cmVCZXlvbmRWaWV3cG9ydCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzI7XG4gICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRfMSA9IF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMik7XG4gICAgICAgICAgICBpZiAocmVzdWx0XzEpXG4gICAgICAgICAgICAgICAgYXdhaXQgcmVzdWx0XzE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgY3JlYXRlUERGU3RyZWFtKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgeyBsYW5kc2NhcGUsIGRpc3BsYXlIZWFkZXJGb290ZXIsIGhlYWRlclRlbXBsYXRlLCBmb290ZXJUZW1wbGF0ZSwgcHJpbnRCYWNrZ3JvdW5kLCBzY2FsZSwgd2lkdGg6IHBhcGVyV2lkdGgsIGhlaWdodDogcGFwZXJIZWlnaHQsIG1hcmdpbiwgcGFnZVJhbmdlcywgcHJlZmVyQ1NTUGFnZVNpemUsIG9taXRCYWNrZ3JvdW5kLCB0YWdnZWQ6IGdlbmVyYXRlVGFnZ2VkUERGLCBvdXRsaW5lOiBnZW5lcmF0ZURvY3VtZW50T3V0bGluZSwgd2FpdEZvckZvbnRzLCB9ID0gcGFyc2VQREZPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAob21pdEJhY2tncm91bmQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kQ29sb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2FpdEZvckZvbnRzKSB7XG4gICAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShmcm9tKHRoaXMubWFpbkZyYW1lKClcbiAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZm9udHMucmVhZHk7XG4gICAgICAgICAgICB9KSkucGlwZShyYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmludENvbW1hbmRQcm9taXNlID0gdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLnByaW50VG9QREYnLCB7XG4gICAgICAgICAgICB0cmFuc2Zlck1vZGU6ICdSZXR1cm5Bc1N0cmVhbScsXG4gICAgICAgICAgICBsYW5kc2NhcGUsXG4gICAgICAgICAgICBkaXNwbGF5SGVhZGVyRm9vdGVyLFxuICAgICAgICAgICAgaGVhZGVyVGVtcGxhdGUsXG4gICAgICAgICAgICBmb290ZXJUZW1wbGF0ZSxcbiAgICAgICAgICAgIHByaW50QmFja2dyb3VuZCxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgcGFwZXJXaWR0aCxcbiAgICAgICAgICAgIHBhcGVySGVpZ2h0LFxuICAgICAgICAgICAgbWFyZ2luVG9wOiBtYXJnaW4udG9wLFxuICAgICAgICAgICAgbWFyZ2luQm90dG9tOiBtYXJnaW4uYm90dG9tLFxuICAgICAgICAgICAgbWFyZ2luTGVmdDogbWFyZ2luLmxlZnQsXG4gICAgICAgICAgICBtYXJnaW5SaWdodDogbWFyZ2luLnJpZ2h0LFxuICAgICAgICAgICAgcGFnZVJhbmdlcyxcbiAgICAgICAgICAgIHByZWZlckNTU1BhZ2VTaXplLFxuICAgICAgICAgICAgZ2VuZXJhdGVUYWdnZWRQREYsXG4gICAgICAgICAgICBnZW5lcmF0ZURvY3VtZW50T3V0bGluZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGZyb20ocHJpbnRDb21tYW5kUHJvbWlzZSkucGlwZShyYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICAgICAgaWYgKG9taXRCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLnJlc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvcigpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChyZXN1bHQuc3RyZWFtLCAnYHN0cmVhbWAgaXMgbWlzc2luZyBmcm9tIGBQYWdlLnByaW50VG9QREYnKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldFJlYWRhYmxlRnJvbVByb3RvY29sU3RyZWFtKHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQsIHJlc3VsdC5zdHJlYW0pO1xuICAgIH1cbiAgICBhc3luYyBwZGYob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgcGF0aCA9IHVuZGVmaW5lZCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgcmVhZGFibGUgPSBhd2FpdCB0aGlzLmNyZWF0ZVBERlN0cmVhbShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZ2V0UmVhZGFibGVBc0J1ZmZlcihyZWFkYWJsZSwgcGF0aCk7XG4gICAgICAgIGFzc2VydChidWZmZXIsICdDb3VsZCBub3QgY3JlYXRlIGJ1ZmZlcicpO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBjbG9zZShvcHRpb25zID0geyBydW5CZWZvcmVVbmxvYWQ6IHVuZGVmaW5lZCB9KSB7XG4gICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgX2d1YXJkID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzMsIGF3YWl0IHRoaXMuYnJvd3NlckNvbnRleHQoKS53YWl0Rm9yU2NyZWVuc2hvdE9wZXJhdGlvbnMoKSwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuY29ubmVjdGlvbigpO1xuICAgICAgICAgICAgYXNzZXJ0KGNvbm5lY3Rpb24sICdQcm90b2NvbCBlcnJvcjogQ29ubmVjdGlvbiBjbG9zZWQuIE1vc3QgbGlrZWx5IHRoZSBwYWdlIGhhcyBiZWVuIGNsb3NlZC4nKTtcbiAgICAgICAgICAgIGNvbnN0IHJ1bkJlZm9yZVVubG9hZCA9ICEhb3B0aW9ucy5ydW5CZWZvcmVVbmxvYWQ7XG4gICAgICAgICAgICBpZiAocnVuQmVmb3JlVW5sb2FkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmNsb3NlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5jbG9zZVRhcmdldCcsIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SWQ6IHRoaXMuI3ByaW1hcnlUYXJnZXQuX3RhcmdldElkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3RhYlRhcmdldC5faXNDbG9zZWREZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8zKSB7XG4gICAgICAgICAgICBlbnZfMy5lcnJvciA9IGVfMztcbiAgICAgICAgICAgIGVudl8zLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNDbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjbG9zZWQ7XG4gICAgfVxuICAgIGdldCBtb3VzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI21vdXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY291cGxlZCB3aXRoIGFuIGFjdGlvbiB0aGF0IHRyaWdnZXJzIGEgZGV2aWNlXG4gICAgICogcmVxdWVzdCBmcm9tIGFuIGFwaSBzdWNoIGFzIFdlYkJsdWV0b290aC5cbiAgICAgKlxuICAgICAqIDo6OmNhdXRpb25cbiAgICAgKlxuICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBkZXZpY2UgcmVxdWVzdCBpcyBtYWRlLiBJdCB3aWxsIG5vdCByZXR1cm4gYVxuICAgICAqIGN1cnJlbnRseSBhY3RpdmUgZGV2aWNlIHByb21wdC5cbiAgICAgKlxuICAgICAqIDo6OlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgW2RldmljZVByb21wdF0gPSBQcm9taXNlLmFsbChbXG4gICAgICogICBwYWdlLndhaXRGb3JEZXZpY2VQcm9tcHQoKSxcbiAgICAgKiAgIHBhZ2UuY2xpY2soJyNjb25uZWN0LWJsdWV0b290aCcpLFxuICAgICAqIF0pO1xuICAgICAqIGF3YWl0IGRldmljZVByb21wdC5zZWxlY3QoXG4gICAgICogICBhd2FpdCBkZXZpY2VQcm9tcHQud2FpdEZvckRldmljZSgoe25hbWV9KSA9PiBuYW1lLmluY2x1ZGVzKCdNeSBEZXZpY2UnKSlcbiAgICAgKiApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JEZXZpY2VQcm9tcHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLndhaXRGb3JEZXZpY2VQcm9tcHQob3B0aW9ucyk7XG4gICAgfVxufVxuY29uc3Qgc3VwcG9ydGVkTWV0cmljcyA9IG5ldyBTZXQoW1xuICAgICdUaW1lc3RhbXAnLFxuICAgICdEb2N1bWVudHMnLFxuICAgICdGcmFtZXMnLFxuICAgICdKU0V2ZW50TGlzdGVuZXJzJyxcbiAgICAnTm9kZXMnLFxuICAgICdMYXlvdXRDb3VudCcsXG4gICAgJ1JlY2FsY1N0eWxlQ291bnQnLFxuICAgICdMYXlvdXREdXJhdGlvbicsXG4gICAgJ1JlY2FsY1N0eWxlRHVyYXRpb24nLFxuICAgICdTY3JpcHREdXJhdGlvbicsXG4gICAgJ1Rhc2tEdXJhdGlvbicsXG4gICAgJ0pTSGVhcFVzZWRTaXplJyxcbiAgICAnSlNIZWFwVG90YWxTaXplJyxcbl0pO1xuLyoqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmRyaXZlci1iaWRpLyNyZWN0YW5nbGUtaW50ZXJzZWN0aW9uICovXG5mdW5jdGlvbiBnZXRJbnRlcnNlY3Rpb25SZWN0KGNsaXAsIHZpZXdwb3J0KSB7XG4gICAgLy8gTm90ZSB0aGVzZSB3aWxsIGFscmVhZHkgYmUgbm9ybWFsaXplZC5cbiAgICBjb25zdCB4ID0gTWF0aC5tYXgoY2xpcC54LCB2aWV3cG9ydC54KTtcbiAgICBjb25zdCB5ID0gTWF0aC5tYXgoY2xpcC55LCB2aWV3cG9ydC55KTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3aWR0aDogTWF0aC5tYXgoTWF0aC5taW4oY2xpcC54ICsgY2xpcC53aWR0aCwgdmlld3BvcnQueCArIHZpZXdwb3J0LndpZHRoKSAtIHgsIDApLFxuICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KE1hdGgubWluKGNsaXAueSArIGNsaXAuaGVpZ2h0LCB2aWV3cG9ydC55ICsgdmlld3BvcnQuaGVpZ2h0KSAtIHksIDApLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QYWdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEEgbGlzdCBvZiBwcmUtZGVmaW5lZCBuZXR3b3JrIGNvbmRpdGlvbnMgdG8gYmUgdXNlZCB3aXRoXG4gKiB7QGxpbmsgUGFnZS5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7UHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zfSBmcm9tICdwdXBwZXRlZXInO1xuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyhcbiAqICAgICBQcmVkZWZpbmVkTmV0d29ya0NvbmRpdGlvbnNbJ1Nsb3cgM0cnXVxuICogICApO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20nKTtcbiAqICAgYXdhaXQgcGFnZS5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMoXG4gKiAgICAgUHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zWydGYXN0IDNHJ11cbiAqICAgKTtcbiAqICAgYXdhaXQgcGFnZS5nb3RvKCdodHRwczovL3d3dy5nb29nbGUuY29tJyk7XG4gKiAgIGF3YWl0IHBhZ2UuZW11bGF0ZU5ldHdvcmtDb25kaXRpb25zKFxuICogICAgIFByZWRlZmluZWROZXR3b3JrQ29uZGl0aW9uc1snU2xvdyA0RyddXG4gKiAgICk7IC8vIGFsaWFzIHRvIEZhc3QgM0cuXG4gKiAgIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbScpO1xuICogICBhd2FpdCBwYWdlLmVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyhcbiAqICAgICBQcmVkZWZpbmVkTmV0d29ya0NvbmRpdGlvbnNbJ0Zhc3QgNEcnXVxuICogICApO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20nKTtcbiAqICAgLy8gb3RoZXIgYWN0aW9ucy4uLlxuICogICBhd2FpdCBicm93c2VyLmNsb3NlKCk7XG4gKiB9KSgpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgUHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgLy8gR2VuZXJhbGx5IGFsaWduZWQgd2l0aCBEZXZUb29sc1xuICAgIC8vIGh0dHBzOi8vc291cmNlLmNocm9taXVtLm9yZy9jaHJvbWl1bS9jaHJvbWl1bS9zcmMvKy9tYWluOnRoaXJkX3BhcnR5L2RldnRvb2xzLWZyb250ZW5kL3NyYy9mcm9udF9lbmQvY29yZS9zZGsvTmV0d29ya01hbmFnZXIudHM7bD0zOTg7ZHJjPTIyNWUxMjQwZjUyMmNhNjg0NDczZjU0MWFlNmRhZTZjZDc2NmRkMzMuXG4gICAgJ1Nsb3cgM0cnOiB7XG4gICAgICAgIC8vIH41MDBLYnBzIGRvd25cbiAgICAgICAgZG93bmxvYWQ6ICgoNTAwICogMTAwMCkgLyA4KSAqIDAuOCxcbiAgICAgICAgLy8gfjUwMEticHMgdXBcbiAgICAgICAgdXBsb2FkOiAoKDUwMCAqIDEwMDApIC8gOCkgKiAwLjgsXG4gICAgICAgIC8vIDQwMG1zIFJUVFxuICAgICAgICBsYXRlbmN5OiA0MDAgKiA1LFxuICAgIH0sXG4gICAgJ0Zhc3QgM0cnOiB7XG4gICAgICAgIC8vIH4xLjYgTWJwcyBkb3duXG4gICAgICAgIGRvd25sb2FkOiAoKDEuNiAqIDEwMDAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyB+MC43NSBNYnBzIHVwXG4gICAgICAgIHVwbG9hZDogKCg3NTAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyAxNTBtcyBSVFRcbiAgICAgICAgbGF0ZW5jeTogMTUwICogMy43NSxcbiAgICB9LFxuICAgIC8vIGFsaWFzIHRvIEZhc3QgM0cgdG8gYWxpZ24gd2l0aCBMaWdodGhvdXNlIChjcmJ1Zy5jb20vMzQyNDA2NjA4KVxuICAgIC8vIGFuZCBEZXZUb29scyAoY3JidWcuY29tLzM0MjQwNjYwOCksXG4gICAgJ1Nsb3cgNEcnOiB7XG4gICAgICAgIC8vIH4xLjYgTWJwcyBkb3duXG4gICAgICAgIGRvd25sb2FkOiAoKDEuNiAqIDEwMDAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyB+MC43NSBNYnBzIHVwXG4gICAgICAgIHVwbG9hZDogKCg3NTAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyAxNTBtcyBSVFRcbiAgICAgICAgbGF0ZW5jeTogMTUwICogMy43NSxcbiAgICB9LFxuICAgICdGYXN0IDRHJzoge1xuICAgICAgICAvLyA5IE1icHMgZG93blxuICAgICAgICBkb3dubG9hZDogKCg5ICogMTAwMCAqIDEwMDApIC8gOCkgKiAwLjksXG4gICAgICAgIC8vIDEuNSBNYnBzIHVwXG4gICAgICAgIHVwbG9hZDogKCgxLjUgKiAxMDAwICogMTAwMCkgLyA4KSAqIDAuOSxcbiAgICAgICAgLy8gNjBtcyBSVFRcbiAgICAgICAgbGF0ZW5jeTogNjAgKiAyLjc1LFxuICAgIH0sXG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByZWRlZmluZWROZXR3b3JrQ29uZGl0aW9ucy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVGFyZ2V0LCBUYXJnZXRUeXBlIH0gZnJvbSAnLi4vYXBpL1RhcmdldC5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IENkcENEUFNlc3Npb24gfSBmcm9tICcuL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgQ2RwUGFnZSB9IGZyb20gJy4vUGFnZS5qcyc7XG5pbXBvcnQgeyBDZHBXZWJXb3JrZXIgfSBmcm9tICcuL1dlYldvcmtlci5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdmFyIEluaXRpYWxpemF0aW9uU3RhdHVzO1xuKGZ1bmN0aW9uIChJbml0aWFsaXphdGlvblN0YXR1cykge1xuICAgIEluaXRpYWxpemF0aW9uU3RhdHVzW1wiU1VDQ0VTU1wiXSA9IFwic3VjY2Vzc1wiO1xuICAgIEluaXRpYWxpemF0aW9uU3RhdHVzW1wiQUJPUlRFRFwiXSA9IFwiYWJvcnRlZFwiO1xufSkoSW5pdGlhbGl6YXRpb25TdGF0dXMgfHwgKEluaXRpYWxpemF0aW9uU3RhdHVzID0ge30pKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBUYXJnZXQgZXh0ZW5kcyBUYXJnZXQge1xuICAgICNicm93c2VyQ29udGV4dDtcbiAgICAjc2Vzc2lvbjtcbiAgICAjdGFyZ2V0SW5mbztcbiAgICAjdGFyZ2V0TWFuYWdlcjtcbiAgICAjc2Vzc2lvbkZhY3Rvcnk7XG4gICAgI2NoaWxkVGFyZ2V0cyA9IG5ldyBTZXQoKTtcbiAgICBfaW5pdGlhbGl6ZWREZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgIF9pc0Nsb3NlZERlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgX3RhcmdldElkO1xuICAgIC8qKlxuICAgICAqIFRvIGluaXRpYWxpemUgdGhlIHRhcmdldCBmb3IgdXNlLCBjYWxsIGluaXRpYWxpemUuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0YXJnZXRJbmZvLCBzZXNzaW9uLCBicm93c2VyQ29udGV4dCwgdGFyZ2V0TWFuYWdlciwgc2Vzc2lvbkZhY3RvcnkpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIgPSB0YXJnZXRNYW5hZ2VyO1xuICAgICAgICB0aGlzLiN0YXJnZXRJbmZvID0gdGFyZ2V0SW5mbztcbiAgICAgICAgdGhpcy4jYnJvd3NlckNvbnRleHQgPSBicm93c2VyQ29udGV4dDtcbiAgICAgICAgdGhpcy5fdGFyZ2V0SWQgPSB0YXJnZXRJbmZvLnRhcmdldElkO1xuICAgICAgICB0aGlzLiNzZXNzaW9uRmFjdG9yeSA9IHNlc3Npb25GYWN0b3J5O1xuICAgICAgICBpZiAodGhpcy4jc2Vzc2lvbiAmJiB0aGlzLiNzZXNzaW9uIGluc3RhbmNlb2YgQ2RwQ0RQU2Vzc2lvbikge1xuICAgICAgICAgICAgdGhpcy4jc2Vzc2lvbi5fc2V0VGFyZ2V0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGFzUGFnZSgpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuX3Nlc3Npb24oKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVDRFBTZXNzaW9uKCkudGhlbihjbGllbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBDZHBQYWdlLl9jcmVhdGUoY2xpZW50LCB0aGlzLCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBDZHBQYWdlLl9jcmVhdGUoc2Vzc2lvbiwgdGhpcywgbnVsbCk7XG4gICAgfVxuICAgIF9zdWJ0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFyZ2V0SW5mby5zdWJ0eXBlO1xuICAgIH1cbiAgICBfc2Vzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Nlc3Npb247XG4gICAgfVxuICAgIF9hZGRDaGlsZFRhcmdldCh0YXJnZXQpIHtcbiAgICAgICAgdGhpcy4jY2hpbGRUYXJnZXRzLmFkZCh0YXJnZXQpO1xuICAgIH1cbiAgICBfcmVtb3ZlQ2hpbGRUYXJnZXQodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuI2NoaWxkVGFyZ2V0cy5kZWxldGUodGFyZ2V0KTtcbiAgICB9XG4gICAgX2NoaWxkVGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NoaWxkVGFyZ2V0cztcbiAgICB9XG4gICAgX3Nlc3Npb25GYWN0b3J5KCkge1xuICAgICAgICBpZiAoIXRoaXMuI3Nlc3Npb25GYWN0b3J5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nlc3Npb25GYWN0b3J5IGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNzZXNzaW9uRmFjdG9yeTtcbiAgICB9XG4gICAgY3JlYXRlQ0RQU2Vzc2lvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNzZXNzaW9uRmFjdG9yeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXNzaW9uRmFjdG9yeSBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jc2Vzc2lvbkZhY3RvcnkoZmFsc2UpLnRoZW4oc2Vzc2lvbiA9PiB7XG4gICAgICAgICAgICBzZXNzaW9uLl9zZXRUYXJnZXQodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhcmdldEluZm8udXJsO1xuICAgIH1cbiAgICB0eXBlKCkge1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy4jdGFyZ2V0SW5mby50eXBlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3BhZ2UnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXRUeXBlLlBBR0U7XG4gICAgICAgICAgICBjYXNlICdiYWNrZ3JvdW5kX3BhZ2UnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXRUeXBlLkJBQ0tHUk9VTkRfUEFHRTtcbiAgICAgICAgICAgIGNhc2UgJ3NlcnZpY2Vfd29ya2VyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0VHlwZS5TRVJWSUNFX1dPUktFUjtcbiAgICAgICAgICAgIGNhc2UgJ3NoYXJlZF93b3JrZXInOlxuICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXRUeXBlLlNIQVJFRF9XT1JLRVI7XG4gICAgICAgICAgICBjYXNlICdicm93c2VyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0VHlwZS5CUk9XU0VSO1xuICAgICAgICAgICAgY2FzZSAnd2Vidmlldyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRhcmdldFR5cGUuV0VCVklFVztcbiAgICAgICAgICAgIGNhc2UgJ3RhYic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRhcmdldFR5cGUuVEFCO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0VHlwZS5PVEhFUjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfdGFyZ2V0TWFuYWdlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiN0YXJnZXRNYW5hZ2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldE1hbmFnZXIgaXMgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhcmdldE1hbmFnZXI7XG4gICAgfVxuICAgIF9nZXRUYXJnZXRJbmZvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFyZ2V0SW5mbztcbiAgICB9XG4gICAgYnJvd3NlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNicm93c2VyQ29udGV4dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdicm93c2VyQ29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlckNvbnRleHQuYnJvd3NlcigpO1xuICAgIH1cbiAgICBicm93c2VyQ29udGV4dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNicm93c2VyQ29udGV4dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdicm93c2VyQ29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlckNvbnRleHQ7XG4gICAgfVxuICAgIG9wZW5lcigpIHtcbiAgICAgICAgY29uc3QgeyBvcGVuZXJJZCB9ID0gdGhpcy4jdGFyZ2V0SW5mbztcbiAgICAgICAgaWYgKCFvcGVuZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJyb3dzZXIoKVxuICAgICAgICAgICAgLnRhcmdldHMoKVxuICAgICAgICAgICAgLmZpbmQodGFyZ2V0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQuX3RhcmdldElkID09PSBvcGVuZXJJZDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF90YXJnZXRJbmZvQ2hhbmdlZCh0YXJnZXRJbmZvKSB7XG4gICAgICAgIHRoaXMuI3RhcmdldEluZm8gPSB0YXJnZXRJbmZvO1xuICAgICAgICB0aGlzLl9jaGVja0lmSW5pdGlhbGl6ZWQoKTtcbiAgICB9XG4gICAgX2luaXRpYWxpemUoKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkRGVmZXJyZWQucmVzb2x2ZShJbml0aWFsaXphdGlvblN0YXR1cy5TVUNDRVNTKTtcbiAgICB9XG4gICAgX2lzVGFyZ2V0RXhwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSgpICE9PSBUYXJnZXRUeXBlLlRBQiAmJiAhdGhpcy5fc3VidHlwZSgpO1xuICAgIH1cbiAgICBfY2hlY2tJZkluaXRpYWxpemVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkRGVmZXJyZWQucmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWREZWZlcnJlZC5yZXNvbHZlKEluaXRpYWxpemF0aW9uU3RhdHVzLlNVQ0NFU1MpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VUYXJnZXQgZXh0ZW5kcyBDZHBUYXJnZXQge1xuICAgICNkZWZhdWx0Vmlld3BvcnQ7XG4gICAgcGFnZVByb21pc2U7XG4gICAgY29uc3RydWN0b3IodGFyZ2V0SW5mbywgc2Vzc2lvbiwgYnJvd3NlckNvbnRleHQsIHRhcmdldE1hbmFnZXIsIHNlc3Npb25GYWN0b3J5LCBkZWZhdWx0Vmlld3BvcnQpIHtcbiAgICAgICAgc3VwZXIodGFyZ2V0SW5mbywgc2Vzc2lvbiwgYnJvd3NlckNvbnRleHQsIHRhcmdldE1hbmFnZXIsIHNlc3Npb25GYWN0b3J5KTtcbiAgICAgICAgdGhpcy4jZGVmYXVsdFZpZXdwb3J0ID0gZGVmYXVsdFZpZXdwb3J0ID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgX2luaXRpYWxpemUoKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkRGVmZXJyZWRcbiAgICAgICAgICAgIC52YWx1ZU9yVGhyb3coKVxuICAgICAgICAgICAgLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gSW5pdGlhbGl6YXRpb25TdGF0dXMuQUJPUlRFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9wZW5lciA9IHRoaXMub3BlbmVyKCk7XG4gICAgICAgICAgICBpZiAoIShvcGVuZXIgaW5zdGFuY2VvZiBQYWdlVGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3BlbmVyIHx8ICFvcGVuZXIucGFnZVByb21pc2UgfHwgdGhpcy50eXBlKCkgIT09ICdwYWdlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3BlbmVyUGFnZSA9IGF3YWl0IG9wZW5lci5wYWdlUHJvbWlzZTtcbiAgICAgICAgICAgIGlmICghb3BlbmVyUGFnZS5saXN0ZW5lckNvdW50KFwicG9wdXBcIiAvKiBQYWdlRXZlbnQuUG9wdXAgKi8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwb3B1cFBhZ2UgPSBhd2FpdCB0aGlzLnBhZ2UoKTtcbiAgICAgICAgICAgIG9wZW5lclBhZ2UuZW1pdChcInBvcHVwXCIgLyogUGFnZUV2ZW50LlBvcHVwICovLCBwb3B1cFBhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIHRoaXMuX2NoZWNrSWZJbml0aWFsaXplZCgpO1xuICAgIH1cbiAgICBhc3luYyBwYWdlKCkge1xuICAgICAgICBpZiAoIXRoaXMucGFnZVByb21pc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9zZXNzaW9uKCk7XG4gICAgICAgICAgICB0aGlzLnBhZ2VQcm9taXNlID0gKHNlc3Npb25cbiAgICAgICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZShzZXNzaW9uKVxuICAgICAgICAgICAgICAgIDogdGhpcy5fc2Vzc2lvbkZhY3RvcnkoKSgvKiBpc0F1dG9BdHRhY2hFbXVsYXRlZD0qLyBmYWxzZSkpLnRoZW4oY2xpZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2RwUGFnZS5fY3JlYXRlKGNsaWVudCwgdGhpcywgdGhpcy4jZGVmYXVsdFZpZXdwb3J0ID8/IG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnBhZ2VQcm9taXNlKSA/PyBudWxsO1xuICAgIH1cbiAgICBfY2hlY2tJZkluaXRpYWxpemVkKCkge1xuICAgICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWREZWZlcnJlZC5yZXNvbHZlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2dldFRhcmdldEluZm8oKS51cmwgIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplZERlZmVycmVkLnJlc29sdmUoSW5pdGlhbGl6YXRpb25TdGF0dXMuU1VDQ0VTUyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRGV2VG9vbHNUYXJnZXQgZXh0ZW5kcyBQYWdlVGFyZ2V0IHtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZXJUYXJnZXQgZXh0ZW5kcyBDZHBUYXJnZXQge1xuICAgICN3b3JrZXJQcm9taXNlO1xuICAgIGFzeW5jIHdvcmtlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiN3b3JrZXJQcm9taXNlKSB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fc2Vzc2lvbigpO1xuICAgICAgICAgICAgLy8gVE9ETyhlaW5iaW5kZXIpOiBNYWtlIHdvcmtlcnMgc2VuZCB0aGVpciBjb25zb2xlIGxvZ3MuXG4gICAgICAgICAgICB0aGlzLiN3b3JrZXJQcm9taXNlID0gKHNlc3Npb25cbiAgICAgICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZShzZXNzaW9uKVxuICAgICAgICAgICAgICAgIDogdGhpcy5fc2Vzc2lvbkZhY3RvcnkoKSgvKiBpc0F1dG9BdHRhY2hFbXVsYXRlZD0qLyBmYWxzZSkpLnRoZW4oY2xpZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENkcFdlYldvcmtlcihjbGllbnQsIHRoaXMuX2dldFRhcmdldEluZm8oKS51cmwsIHRoaXMuX3RhcmdldElkLCB0aGlzLnR5cGUoKSwgKCkgPT4geyB9IC8qIGNvbnNvbGVBUElDYWxsZWQgKi8sICgpID0+IHsgfSAvKiBleGNlcHRpb25UaHJvd24gKi8pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI3dvcmtlclByb21pc2U7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE90aGVyVGFyZ2V0IGV4dGVuZHMgQ2RwVGFyZ2V0IHtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhcmdldC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFyZ2V0TWFuYWdlci5qcy5tYXAiLCJpbXBvcnQgeyBnZXRSZWFkYWJsZUFzQnVmZmVyLCBnZXRSZWFkYWJsZUZyb21Qcm90b2NvbFN0cmVhbSwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4uL3V0aWwvRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG4vKipcbiAqIFRoZSBUcmFjaW5nIGNsYXNzIGV4cG9zZXMgdGhlIHRyYWNpbmcgYXVkaXQgaW50ZXJmYWNlLlxuICogQHJlbWFya3NcbiAqIFlvdSBjYW4gdXNlIGB0cmFjaW5nLnN0YXJ0YCBhbmQgYHRyYWNpbmcuc3RvcGAgdG8gY3JlYXRlIGEgdHJhY2UgZmlsZVxuICogd2hpY2ggY2FuIGJlIG9wZW5lZCBpbiBDaHJvbWUgRGV2VG9vbHMgb3Ige0BsaW5rIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL3RpbWVsaW5lLXZpZXdlci8gfCB0aW1lbGluZSB2aWV3ZXJ9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IHBhZ2UudHJhY2luZy5zdGFydCh7cGF0aDogJ3RyYWNlLmpzb24nfSk7XG4gKiBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20nKTtcbiAqIGF3YWl0IHBhZ2UudHJhY2luZy5zdG9wKCk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFjaW5nIHtcbiAgICAjY2xpZW50O1xuICAgICNyZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAjcGF0aDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB1cGRhdGVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIGEgdHJhY2UgZm9yIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBPbmx5IG9uZSB0cmFjZSBjYW4gYmUgYWN0aXZlIGF0IGEgdGltZSBwZXIgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYFRyYWNpbmdPcHRpb25zYC5cbiAgICAgKi9cbiAgICBhc3luYyBzdGFydChvcHRpb25zID0ge30pIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNyZWNvcmRpbmcsICdDYW5ub3Qgc3RhcnQgcmVjb3JkaW5nIHRyYWNlIHdoaWxlIGFscmVhZHkgcmVjb3JkaW5nIHRyYWNlLicpO1xuICAgICAgICBjb25zdCBkZWZhdWx0Q2F0ZWdvcmllcyA9IFtcbiAgICAgICAgICAgICctKicsXG4gICAgICAgICAgICAnZGV2dG9vbHMudGltZWxpbmUnLFxuICAgICAgICAgICAgJ3Y4LmV4ZWN1dGUnLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUnLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUuZnJhbWUnLFxuICAgICAgICAgICAgJ3RvcGxldmVsJyxcbiAgICAgICAgICAgICdibGluay5jb25zb2xlJyxcbiAgICAgICAgICAgICdibGluay51c2VyX3RpbWluZycsXG4gICAgICAgICAgICAnbGF0ZW5jeUluZm8nLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUuc3RhY2snLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtdjguY3B1X3Byb2ZpbGVyJyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgeyBwYXRoLCBzY3JlZW5zaG90cyA9IGZhbHNlLCBjYXRlZ29yaWVzID0gZGVmYXVsdENhdGVnb3JpZXMgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChzY3JlZW5zaG90cykge1xuICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKCdkaXNhYmxlZC1ieS1kZWZhdWx0LWRldnRvb2xzLnNjcmVlbnNob3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGNsdWRlZENhdGVnb3JpZXMgPSBjYXRlZ29yaWVzXG4gICAgICAgICAgICAuZmlsdGVyKGNhdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2F0LnN0YXJ0c1dpdGgoJy0nKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5tYXAoY2F0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYXQuc2xpY2UoMSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbmNsdWRlZENhdGVnb3JpZXMgPSBjYXRlZ29yaWVzLmZpbHRlcihjYXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFjYXQuc3RhcnRzV2l0aCgnLScpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jcGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuI3JlY29yZGluZyA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdUcmFjaW5nLnN0YXJ0Jywge1xuICAgICAgICAgICAgdHJhbnNmZXJNb2RlOiAnUmV0dXJuQXNTdHJlYW0nLFxuICAgICAgICAgICAgdHJhY2VDb25maWc6IHtcbiAgICAgICAgICAgICAgICBleGNsdWRlZENhdGVnb3JpZXMsXG4gICAgICAgICAgICAgICAgaW5jbHVkZWRDYXRlZ29yaWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3BzIGEgdHJhY2Ugc3RhcnRlZCB3aXRoIHRoZSBgc3RhcnRgIG1ldGhvZC5cbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGJ1ZmZlciB3aXRoIHRyYWNlIGRhdGEuXG4gICAgICovXG4gICAgYXN5bmMgc3RvcCgpIHtcbiAgICAgICAgY29uc3QgY29udGVudERlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbmNlKCdUcmFjaW5nLnRyYWNpbmdDb21wbGV0ZScsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZXZlbnQuc3RyZWFtLCAnTWlzc2luZyBcInN0cmVhbVwiJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZGFibGUgPSBhd2FpdCBnZXRSZWFkYWJsZUZyb21Qcm90b2NvbFN0cmVhbSh0aGlzLiNjbGllbnQsIGV2ZW50LnN0cmVhbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZ2V0UmVhZGFibGVBc0J1ZmZlcihyZWFkYWJsZSwgdGhpcy4jcGF0aCk7XG4gICAgICAgICAgICAgICAgY29udGVudERlZmVycmVkLnJlc29sdmUoYnVmZmVyID8/IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnREZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudERlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoYFVua25vd24gZXJyb3I6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdUcmFjaW5nLmVuZCcpO1xuICAgICAgICB0aGlzLiNyZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRlbnREZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFjaW5nLmpzLm1hcCIsImltcG9ydCB7IENEUFNlc3Npb25FdmVudCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IFRhcmdldFR5cGUgfSBmcm9tICcuLi9hcGkvVGFyZ2V0LmpzJztcbmltcG9ydCB7IFdlYldvcmtlciB9IGZyb20gJy4uL2FwaS9XZWJXb3JrZXIuanMnO1xuaW1wb3J0IHsgVGltZW91dFNldHRpbmdzIH0gZnJvbSAnLi4vY29tbW9uL1RpbWVvdXRTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vRXhlY3V0aW9uQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBJc29sYXRlZFdvcmxkIH0gZnJvbSAnLi9Jc29sYXRlZFdvcmxkLmpzJztcbmltcG9ydCB7IENkcEpTSGFuZGxlIH0gZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwV2ViV29ya2VyIGV4dGVuZHMgV2ViV29ya2VyIHtcbiAgICAjd29ybGQ7XG4gICAgI2NsaWVudDtcbiAgICAjaWQ7XG4gICAgI3RhcmdldFR5cGU7XG4gICAgY29uc3RydWN0b3IoY2xpZW50LCB1cmwsIHRhcmdldElkLCB0YXJnZXRUeXBlLCBjb25zb2xlQVBJQ2FsbGVkLCBleGNlcHRpb25UaHJvd24pIHtcbiAgICAgICAgc3VwZXIodXJsKTtcbiAgICAgICAgdGhpcy4jaWQgPSB0YXJnZXRJZDtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB0aGlzLiN0YXJnZXRUeXBlID0gdGFyZ2V0VHlwZTtcbiAgICAgICAgdGhpcy4jd29ybGQgPSBuZXcgSXNvbGF0ZWRXb3JsZCh0aGlzLCBuZXcgVGltZW91dFNldHRpbmdzKCkpO1xuICAgICAgICB0aGlzLiNjbGllbnQub25jZSgnUnVudGltZS5leGVjdXRpb25Db250ZXh0Q3JlYXRlZCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jd29ybGQuc2V0Q29udGV4dChuZXcgRXhlY3V0aW9uQ29udGV4dChjbGllbnQsIGV2ZW50LmNvbnRleHQsIHRoaXMuI3dvcmxkKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN3b3JsZC5lbWl0dGVyLm9uKCdjb25zb2xlYXBpY2FsbGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zb2xlQVBJQ2FsbGVkKGV2ZW50LnR5cGUsIGV2ZW50LmFyZ3MubWFwKChvYmplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDZHBKU0hhbmRsZSh0aGlzLiN3b3JsZCwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9KSwgZXZlbnQuc3RhY2tUcmFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZGVidWdFcnJvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jY2xpZW50Lm9uKCdSdW50aW1lLmV4Y2VwdGlvblRocm93bicsIGV4Y2VwdGlvblRocm93bik7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbmNlKENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3dvcmxkLmRpc3Bvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFRoaXMgbWlnaHQgZmFpbCBpZiB0aGUgdGFyZ2V0IGlzIGNsb3NlZCBiZWZvcmUgd2UgcmVjZWl2ZSBhbGwgZXhlY3V0aW9uIGNvbnRleHRzLlxuICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnUnVudGltZS5lbmFibGUnKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICB9XG4gICAgbWFpblJlYWxtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jd29ybGQ7XG4gICAgfVxuICAgIGdldCBjbGllbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQ7XG4gICAgfVxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuI3RhcmdldFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVGFyZ2V0VHlwZS5TRVJWSUNFX1dPUktFUjpcbiAgICAgICAgICAgIGNhc2UgVGFyZ2V0VHlwZS5TSEFSRURfV09SS0VSOiB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHNlcnZpY2UgYW5kIHNoYXJlZCB3b3JrZXJzIHdlIG5lZWQgdG8gY2xvc2UgdGhlIHRhcmdldCBhbmQgZGV0YWNoIHRvIGFsbG93XG4gICAgICAgICAgICAgICAgLy8gdGhlIHdvcmtlciB0byBzdG9wLlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LmNvbm5lY3Rpb24oKT8uc2VuZCgnVGFyZ2V0LmNsb3NlVGFyZ2V0Jywge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRJZDogdGhpcy4jaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuY29ubmVjdGlvbigpPy5zZW5kKCdUYXJnZXQuZGV0YWNoRnJvbVRhcmdldCcsIHtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLmNsaWVudC5pZCgpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViV29ya2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL0FjY2Vzc2liaWxpdHkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9BcmlhUXVlcnlIYW5kbGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQmluZGluZy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0Jyb3dzZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Ccm93c2VyQ29ubmVjdG9yLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ0RQU2Vzc2lvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0Nocm9tZVRhcmdldE1hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25uZWN0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ292ZXJhZ2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXZpY2VSZXF1ZXN0UHJvbXB0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRGlhbG9nLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRWxlbWVudEhhbmRsZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0VtdWxhdGlvbk1hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeGVjdXRpb25Db250ZXh0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZW5zaW9uVHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRmlyZWZveFRhcmdldE1hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9GcmFtZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZyYW1lTWFuYWdlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZyYW1lTWFuYWdlckV2ZW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZyYW1lVHJlZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0hUVFBSZXF1ZXN0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSFRUUFJlc3BvbnNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSW5wdXQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Jc29sYXRlZFdvcmxkLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSXNvbGF0ZWRXb3JsZHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0xpZmVjeWNsZVdhdGNoZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9OZXR3b3JrRXZlbnRNYW5hZ2VyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vTmV0d29ya01hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QYWdlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGFyZ2V0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGFyZ2V0TWFuYWdlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1RyYWNpbmcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1dlYldvcmtlci5qcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jZHAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IFB1cHBldGVlclVSTCwgZXZhbHVhdGlvblN0cmluZyB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmFsdWF0aW9uRXJyb3IoZGV0YWlscykge1xuICAgIGxldCBuYW1lO1xuICAgIGxldCBtZXNzYWdlO1xuICAgIGlmICghZGV0YWlscy5leGNlcHRpb24pIHtcbiAgICAgICAgbmFtZSA9ICdFcnJvcic7XG4gICAgICAgIG1lc3NhZ2UgPSBkZXRhaWxzLnRleHQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKChkZXRhaWxzLmV4Y2VwdGlvbi50eXBlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICBkZXRhaWxzLmV4Y2VwdGlvbi5zdWJ0eXBlICE9PSAnZXJyb3InKSAmJlxuICAgICAgICAhZGV0YWlscy5leGNlcHRpb24ub2JqZWN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlRnJvbVJlbW90ZU9iamVjdChkZXRhaWxzLmV4Y2VwdGlvbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBkZXRhaWwgPSBnZXRFcnJvckRldGFpbHMoZGV0YWlscyk7XG4gICAgICAgIG5hbWUgPSBkZXRhaWwubmFtZTtcbiAgICAgICAgbWVzc2FnZSA9IGRldGFpbC5tZXNzYWdlO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlSGVpZ2h0ID0gbWVzc2FnZS5zcGxpdCgnXFxuJykubGVuZ3RoO1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIGVycm9yLm5hbWUgPSBuYW1lO1xuICAgIGNvbnN0IHN0YWNrTGluZXMgPSBlcnJvci5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgY29uc3QgbWVzc2FnZUxpbmVzID0gc3RhY2tMaW5lcy5zcGxpY2UoMCwgbWVzc2FnZUhlaWdodCk7XG4gICAgLy8gVGhlIGZpcnN0IGxpbmUgaXMgdGhpcyBmdW5jdGlvbiB3aGljaCB3ZSBpZ25vcmUuXG4gICAgc3RhY2tMaW5lcy5zaGlmdCgpO1xuICAgIGlmIChkZXRhaWxzLnN0YWNrVHJhY2UgJiYgc3RhY2tMaW5lcy5sZW5ndGggPCBFcnJvci5zdGFja1RyYWNlTGltaXQpIHtcbiAgICAgICAgZm9yIChjb25zdCBmcmFtZSBvZiBkZXRhaWxzLnN0YWNrVHJhY2UuY2FsbEZyYW1lcy5yZXZlcnNlKCkpIHtcbiAgICAgICAgICAgIGlmIChQdXBwZXRlZXJVUkwuaXNQdXBwZXRlZXJVUkwoZnJhbWUudXJsKSAmJlxuICAgICAgICAgICAgICAgIGZyYW1lLnVybCAhPT0gUHVwcGV0ZWVyVVJMLklOVEVSTkFMX1VSTCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IFB1cHBldGVlclVSTC5wYXJzZShmcmFtZS51cmwpO1xuICAgICAgICAgICAgICAgIHN0YWNrTGluZXMudW5zaGlmdChgICAgIGF0ICR7ZnJhbWUuZnVuY3Rpb25OYW1lIHx8IHVybC5mdW5jdGlvbk5hbWV9ICgke3VybC5mdW5jdGlvbk5hbWV9IGF0ICR7dXJsLnNpdGVTdHJpbmd9LCA8YW5vbnltb3VzPjoke2ZyYW1lLmxpbmVOdW1iZXJ9OiR7ZnJhbWUuY29sdW1uTnVtYmVyfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YWNrTGluZXMucHVzaChgICAgIGF0ICR7ZnJhbWUuZnVuY3Rpb25OYW1lIHx8ICc8YW5vbnltb3VzPid9ICgke2ZyYW1lLnVybH06JHtmcmFtZS5saW5lTnVtYmVyfToke2ZyYW1lLmNvbHVtbk51bWJlcn0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhY2tMaW5lcy5sZW5ndGggPj0gRXJyb3Iuc3RhY2tUcmFjZUxpbWl0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXJyb3Iuc3RhY2sgPSBbLi4ubWVzc2FnZUxpbmVzLCAuLi5zdGFja0xpbmVzXS5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gZXJyb3I7XG59XG5jb25zdCBnZXRFcnJvckRldGFpbHMgPSAoZGV0YWlscykgPT4ge1xuICAgIGxldCBuYW1lID0gJyc7XG4gICAgbGV0IG1lc3NhZ2U7XG4gICAgY29uc3QgbGluZXMgPSBkZXRhaWxzLmV4Y2VwdGlvbj8uZGVzY3JpcHRpb24/LnNwbGl0KCdcXG4gICAgYXQgJykgPz8gW107XG4gICAgY29uc3Qgc2l6ZSA9IE1hdGgubWluKGRldGFpbHMuc3RhY2tUcmFjZT8uY2FsbEZyYW1lcy5sZW5ndGggPz8gMCwgbGluZXMubGVuZ3RoIC0gMSk7XG4gICAgbGluZXMuc3BsaWNlKC1zaXplLCBzaXplKTtcbiAgICBpZiAoZGV0YWlscy5leGNlcHRpb24/LmNsYXNzTmFtZSkge1xuICAgICAgICBuYW1lID0gZGV0YWlscy5leGNlcHRpb24uY2xhc3NOYW1lO1xuICAgIH1cbiAgICBtZXNzYWdlID0gbGluZXMuam9pbignXFxuJyk7XG4gICAgaWYgKG5hbWUgJiYgbWVzc2FnZS5zdGFydHNXaXRoKGAke25hbWV9OiBgKSkge1xuICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5zbGljZShuYW1lLmxlbmd0aCArIDIpO1xuICAgIH1cbiAgICByZXR1cm4geyBtZXNzYWdlLCBuYW1lIH07XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNsaWVudEVycm9yKGRldGFpbHMpIHtcbiAgICBsZXQgbmFtZTtcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBpZiAoIWRldGFpbHMuZXhjZXB0aW9uKSB7XG4gICAgICAgIG5hbWUgPSAnRXJyb3InO1xuICAgICAgICBtZXNzYWdlID0gZGV0YWlscy50ZXh0O1xuICAgIH1cbiAgICBlbHNlIGlmICgoZGV0YWlscy5leGNlcHRpb24udHlwZSAhPT0gJ29iamVjdCcgfHxcbiAgICAgICAgZGV0YWlscy5leGNlcHRpb24uc3VidHlwZSAhPT0gJ2Vycm9yJykgJiZcbiAgICAgICAgIWRldGFpbHMuZXhjZXB0aW9uLm9iamVjdElkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZUZyb21SZW1vdGVPYmplY3QoZGV0YWlscy5leGNlcHRpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZGV0YWlsID0gZ2V0RXJyb3JEZXRhaWxzKGRldGFpbHMpO1xuICAgICAgICBuYW1lID0gZGV0YWlsLm5hbWU7XG4gICAgICAgIG1lc3NhZ2UgPSBkZXRhaWwubWVzc2FnZTtcbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgZXJyb3IubmFtZSA9IG5hbWU7XG4gICAgY29uc3QgbWVzc2FnZUhlaWdodCA9IGVycm9yLm1lc3NhZ2Uuc3BsaXQoJ1xcbicpLmxlbmd0aDtcbiAgICBjb25zdCBtZXNzYWdlTGluZXMgPSBlcnJvci5zdGFjay5zcGxpdCgnXFxuJykuc3BsaWNlKDAsIG1lc3NhZ2VIZWlnaHQpO1xuICAgIGNvbnN0IHN0YWNrTGluZXMgPSBbXTtcbiAgICBpZiAoZGV0YWlscy5zdGFja1RyYWNlKSB7XG4gICAgICAgIGZvciAoY29uc3QgZnJhbWUgb2YgZGV0YWlscy5zdGFja1RyYWNlLmNhbGxGcmFtZXMpIHtcbiAgICAgICAgICAgIC8vIE5vdGUgd2UgbmVlZCB0byBhZGQgYDFgIGJlY2F1c2UgdGhlIHZhbHVlcyBhcmUgMC1pbmRleGVkLlxuICAgICAgICAgICAgc3RhY2tMaW5lcy5wdXNoKGAgICAgYXQgJHtmcmFtZS5mdW5jdGlvbk5hbWUgfHwgJzxhbm9ueW1vdXM+J30gKCR7ZnJhbWUudXJsfToke2ZyYW1lLmxpbmVOdW1iZXIgKyAxfToke2ZyYW1lLmNvbHVtbk51bWJlciArIDF9KWApO1xuICAgICAgICAgICAgaWYgKHN0YWNrTGluZXMubGVuZ3RoID49IEVycm9yLnN0YWNrVHJhY2VMaW1pdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVycm9yLnN0YWNrID0gWy4uLm1lc3NhZ2VMaW5lcywgLi4uc3RhY2tMaW5lc10uam9pbignXFxuJyk7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlRnJvbVJlbW90ZU9iamVjdChyZW1vdGVPYmplY3QpIHtcbiAgICBhc3NlcnQoIXJlbW90ZU9iamVjdC5vYmplY3RJZCwgJ0Nhbm5vdCBleHRyYWN0IHZhbHVlIHdoZW4gb2JqZWN0SWQgaXMgZ2l2ZW4nKTtcbiAgICBpZiAocmVtb3RlT2JqZWN0LnVuc2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgaWYgKHJlbW90ZU9iamVjdC50eXBlID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChyZW1vdGVPYmplY3QudW5zZXJpYWxpemFibGVWYWx1ZS5yZXBsYWNlKCduJywgJycpKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHJlbW90ZU9iamVjdC51bnNlcmlhbGl6YWJsZVZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlICctMCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0wO1xuICAgICAgICAgICAgY2FzZSAnTmFOJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgICAgY2FzZSAnSW5maW5pdHknOlxuICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgIGNhc2UgJy1JbmZpbml0eSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB1bnNlcmlhbGl6YWJsZSB2YWx1ZTogJyArXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZU9iamVjdC51bnNlcmlhbGl6YWJsZVZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVtb3RlT2JqZWN0LnZhbHVlO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFBhZ2VCaW5kaW5nKHR5cGUsIG5hbWUsIHByZWZpeCkge1xuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgZnJhbWUgbG9hZGluZyBzdGF0ZSBlaXRoZXIgUnVudGltZS5ldmFsdWF0ZSBvclxuICAgIC8vIFBhZ2UuYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQgbWlnaHQgc3VjY2VlZC4gTGV0J3MgY2hlY2sgdGhhdCB3ZVxuICAgIC8vIGRvbid0IHJlLXdyYXAgUHVwcGV0ZWVyJ3MgYmluZGluZy5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBJbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgIGlmIChnbG9iYWxUaGlzW25hbWVdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gV2UgcmVwbGFjZSB0aGUgQ0RQIGJpbmRpbmcgd2l0aCBhIFB1cHBldGVlciBiaW5kaW5nLlxuICAgIE9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywge1xuICAgICAgICBbbmFtZV0oLi4uYXJncykge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgUHVwcGV0ZWVyIGJpbmRpbmcuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBJbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgICAgICAgICAgY29uc3QgY2FsbFB1cHBldGVlciA9IGdsb2JhbFRoaXNbbmFtZV07XG4gICAgICAgICAgICBjYWxsUHVwcGV0ZWVyLmFyZ3MgPz89IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNhbGxQdXBwZXRlZXIuY2FsbGJhY2tzID8/PSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBzZXEgPSAoY2FsbFB1cHBldGVlci5sYXN0U2VxID8/IDApICsgMTtcbiAgICAgICAgICAgIGNhbGxQdXBwZXRlZXIubGFzdFNlcSA9IHNlcTtcbiAgICAgICAgICAgIGNhbGxQdXBwZXRlZXIuYXJncy5zZXQoc2VxLCBhcmdzKTtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IEluIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gICAgICAgICAgICAvLyBOZWVkcyB0byBiZSB0aGUgc2FtZSBhcyBDRFBfQklORElOR19QUkVGSVguXG4gICAgICAgICAgICBnbG9iYWxUaGlzW3ByZWZpeCArIG5hbWVdKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgaXNUcml2aWFsOiAhYXJncy5zb21lKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgTm9kZTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbFB1cHBldGVlci5jYWxsYmFja3Muc2V0KHNlcSwge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUHVwcGV0ZWVyLmFyZ3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUHVwcGV0ZWVyLmFyZ3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ0RQX0JJTkRJTkdfUFJFRklYID0gJ3B1cHBldGVlcl8nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZ2VCaW5kaW5nSW5pdFN0cmluZyh0eXBlLCBuYW1lKSB7XG4gICAgcmV0dXJuIGV2YWx1YXRpb25TdHJpbmcoYWRkUGFnZUJpbmRpbmcsIHR5cGUsIG5hbWUsIENEUF9CSU5ESU5HX1BSRUZJWCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgX2Nvbm5lY3RUb0JpRGlCcm93c2VyIH0gZnJvbSAnLi4vYmlkaS9Ccm93c2VyQ29ubmVjdG9yLmpzJztcbmltcG9ydCB7IF9jb25uZWN0VG9DZHBCcm93c2VyIH0gZnJvbSAnLi4vY2RwL0Jyb3dzZXJDb25uZWN0b3IuanMnO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi4vZW52aXJvbm1lbnQuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG5jb25zdCBnZXRXZWJTb2NrZXRUcmFuc3BvcnRDbGFzcyA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gaXNOb2RlXG4gICAgICAgID8gKGF3YWl0IGltcG9ydCgnLi4vbm9kZS9Ob2RlV2ViU29ja2V0VHJhbnNwb3J0LmpzJykpLk5vZGVXZWJTb2NrZXRUcmFuc3BvcnRcbiAgICAgICAgOiAoYXdhaXQgaW1wb3J0KCcuLi9jb21tb24vQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydC5qcycpKVxuICAgICAgICAgICAgLkJyb3dzZXJXZWJTb2NrZXRUcmFuc3BvcnQ7XG59O1xuLyoqXG4gKiBVc2VycyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIGRpcmVjdGx5OyBpdCdzIGNhbGxlZCB3aGVuIGNhbGxpbmdcbiAqIGBwdXBwZXRlZXIuY29ubmVjdGAuIFRoaXMgbWV0aG9kIGF0dGFjaGVzIFB1cHBldGVlciB0byBhbiBleGlzdGluZyBicm93c2VyIGluc3RhbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2Nvbm5lY3RUb0Jyb3dzZXIob3B0aW9ucykge1xuICAgIGNvbnN0IHsgY29ubmVjdGlvblRyYW5zcG9ydCwgZW5kcG9pbnRVcmwgfSA9IGF3YWl0IGdldENvbm5lY3Rpb25UcmFuc3BvcnQob3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMucHJvdG9jb2wgPT09ICd3ZWJEcml2ZXJCaURpJykge1xuICAgICAgICBjb25zdCBiaWRpQnJvd3NlciA9IGF3YWl0IF9jb25uZWN0VG9CaURpQnJvd3Nlcihjb25uZWN0aW9uVHJhbnNwb3J0LCBlbmRwb2ludFVybCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBiaWRpQnJvd3NlcjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGNkcEJyb3dzZXIgPSBhd2FpdCBfY29ubmVjdFRvQ2RwQnJvd3Nlcihjb25uZWN0aW9uVHJhbnNwb3J0LCBlbmRwb2ludFVybCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBjZHBCcm93c2VyO1xuICAgIH1cbn1cbi8qKlxuICogRXN0YWJsaXNoZXMgYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiBieSBnaXZlbiBvcHRpb25zIGFuZCByZXR1cm5zIGJvdGggdHJhbnNwb3J0IGFuZFxuICogZW5kcG9pbnQgdXJsIHRoZSB0cmFuc3BvcnQgaXMgY29ubmVjdGVkIHRvLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDb25uZWN0aW9uVHJhbnNwb3J0KG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGJyb3dzZXJXU0VuZHBvaW50LCBicm93c2VyVVJMLCB0cmFuc3BvcnQsIGhlYWRlcnMgPSB7fSB9ID0gb3B0aW9ucztcbiAgICBhc3NlcnQoTnVtYmVyKCEhYnJvd3NlcldTRW5kcG9pbnQpICsgTnVtYmVyKCEhYnJvd3NlclVSTCkgKyBOdW1iZXIoISF0cmFuc3BvcnQpID09PVxuICAgICAgICAxLCAnRXhhY3RseSBvbmUgb2YgYnJvd3NlcldTRW5kcG9pbnQsIGJyb3dzZXJVUkwgb3IgdHJhbnNwb3J0IG11c3QgYmUgcGFzc2VkIHRvIHB1cHBldGVlci5jb25uZWN0Jyk7XG4gICAgaWYgKHRyYW5zcG9ydCkge1xuICAgICAgICByZXR1cm4geyBjb25uZWN0aW9uVHJhbnNwb3J0OiB0cmFuc3BvcnQsIGVuZHBvaW50VXJsOiAnJyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChicm93c2VyV1NFbmRwb2ludCkge1xuICAgICAgICBjb25zdCBXZWJTb2NrZXRDbGFzcyA9IGF3YWl0IGdldFdlYlNvY2tldFRyYW5zcG9ydENsYXNzKCk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25UcmFuc3BvcnQgPSBhd2FpdCBXZWJTb2NrZXRDbGFzcy5jcmVhdGUoYnJvd3NlcldTRW5kcG9pbnQsIGhlYWRlcnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29ubmVjdGlvblRyYW5zcG9ydDogY29ubmVjdGlvblRyYW5zcG9ydCxcbiAgICAgICAgICAgIGVuZHBvaW50VXJsOiBicm93c2VyV1NFbmRwb2ludCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnJvd3NlclVSTCkge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uVVJMID0gYXdhaXQgZ2V0V1NFbmRwb2ludChicm93c2VyVVJMKTtcbiAgICAgICAgY29uc3QgV2ViU29ja2V0Q2xhc3MgPSBhd2FpdCBnZXRXZWJTb2NrZXRUcmFuc3BvcnRDbGFzcygpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uVHJhbnNwb3J0ID0gYXdhaXQgV2ViU29ja2V0Q2xhc3MuY3JlYXRlKGNvbm5lY3Rpb25VUkwpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29ubmVjdGlvblRyYW5zcG9ydDogY29ubmVjdGlvblRyYW5zcG9ydCxcbiAgICAgICAgICAgIGVuZHBvaW50VXJsOiBjb25uZWN0aW9uVVJMLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29ubmVjdGlvbiBvcHRpb25zJyk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRXU0VuZHBvaW50KGJyb3dzZXJVUkwpIHtcbiAgICBjb25zdCBlbmRwb2ludFVSTCA9IG5ldyBVUkwoJy9qc29uL3ZlcnNpb24nLCBicm93c2VyVVJMKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnbG9iYWxUaGlzLmZldGNoKGVuZHBvaW50VVJMLnRvU3RyaW5nKCksIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzdWx0LnN0YXR1c1RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3VsdC5qc29uKCk7XG4gICAgICAgIHJldHVybiBkYXRhLndlYlNvY2tldERlYnVnZ2VyVXJsO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGlzRXJyb3JMaWtlKGVycm9yKSkge1xuICAgICAgICAgICAgZXJyb3IubWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCBicm93c2VyIHdlYlNvY2tldCBVUkwgZnJvbSAke2VuZHBvaW50VVJMfTogYCArXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckNvbm5lY3Rvci5qcy5tYXAiLCIvKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydCB7XG4gICAgc3RhdGljIGNyZWF0ZSh1cmwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh1cmwpO1xuICAgICAgICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShuZXcgQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydCh3cykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAjd3M7XG4gICAgb25tZXNzYWdlO1xuICAgIG9uY2xvc2U7XG4gICAgY29uc3RydWN0b3Iod3MpIHtcbiAgICAgICAgdGhpcy4jd3MgPSB3cztcbiAgICAgICAgdGhpcy4jd3MuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9ubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25tZXNzYWdlLmNhbGwobnVsbCwgZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN3cy5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uY2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2xvc2UuY2FsbChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSBhbGwgZXJyb3JzIC0gd2UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggdGhlbS5cbiAgICAgICAgdGhpcy4jd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7IH0pO1xuICAgIH1cbiAgICBzZW5kKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy4jd3Muc2VuZChtZXNzYWdlKTtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuI3dzLmNsb3NlKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9RdWVyeUhhbmRsZXIuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENTU1F1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3IgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgY3NzUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjc3NRdWVyeVNlbGVjdG9yKGVsZW1lbnQsIHNlbGVjdG9yKTtcbiAgICB9O1xuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yQWxsID0gKGVsZW1lbnQsIHNlbGVjdG9yLCB7IGNzc1F1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY3NzUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNTU1F1ZXJ5SGFuZGxlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IHJld3JpdGVFcnJvciB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IFByb3RvY29sRXJyb3IsIFRhcmdldENsb3NlRXJyb3IgfSBmcm9tICcuL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi91dGlsLmpzJztcbi8qKlxuICogTWFuYWdlcyBjYWxsYmFja3MgYW5kIHRoZWlyIElEcyBmb3IgdGhlIHByb3RvY29sIHJlcXVlc3QvcmVzcG9uc2UgY29tbXVuaWNhdGlvbi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxiYWNrUmVnaXN0cnkge1xuICAgICNjYWxsYmFja3MgPSBuZXcgTWFwKCk7XG4gICAgI2lkR2VuZXJhdG9yID0gY3JlYXRlSW5jcmVtZW50YWxJZEdlbmVyYXRvcigpO1xuICAgIGNyZWF0ZShsYWJlbCwgdGltZW91dCwgcmVxdWVzdCkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IG5ldyBDYWxsYmFjayh0aGlzLiNpZEdlbmVyYXRvcigpLCBsYWJlbCwgdGltZW91dCk7XG4gICAgICAgIHRoaXMuI2NhbGxiYWNrcy5zZXQoY2FsbGJhY2suaWQsIGNhbGxiYWNrKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QoY2FsbGJhY2suaWQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gV2Ugc3RpbGwgdGhyb3cgc3luYyBlcnJvcnMgc3luY2hyb25vdXNseSBhbmQgY2xlYW4gdXAgdGhlIHNjaGVkdWxlZFxuICAgICAgICAgICAgLy8gY2FsbGJhY2suXG4gICAgICAgICAgICBjYWxsYmFjay5wcm9taXNlLmNhdGNoKGRlYnVnRXJyb3IpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2suaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYWxsYmFjay5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTXVzdCBvbmx5IGhhdmUgc3luYyBjb2RlIHVwIHVudGlsIGhlcmUuXG4gICAgICAgIHJldHVybiBjYWxsYmFjay5wcm9taXNlLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jY2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjay5pZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWplY3QoaWQsIG1lc3NhZ2UsIG9yaWdpbmFsTWVzc2FnZSkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuI2NhbGxiYWNrcy5nZXQoaWQpO1xuICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVqZWN0KGNhbGxiYWNrLCBtZXNzYWdlLCBvcmlnaW5hbE1lc3NhZ2UpO1xuICAgIH1cbiAgICBfcmVqZWN0KGNhbGxiYWNrLCBlcnJvck1lc3NhZ2UsIG9yaWdpbmFsTWVzc2FnZSkge1xuICAgICAgICBsZXQgZXJyb3I7XG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlIGluc3RhbmNlb2YgUHJvdG9jb2xFcnJvcikge1xuICAgICAgICAgICAgZXJyb3IgPSBlcnJvck1lc3NhZ2U7XG4gICAgICAgICAgICBlcnJvci5jYXVzZSA9IGNhbGxiYWNrLmVycm9yO1xuICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IgPSBjYWxsYmFjay5lcnJvcjtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2sucmVqZWN0KHJld3JpdGVFcnJvcihlcnJvciwgYFByb3RvY29sIGVycm9yICgke2NhbGxiYWNrLmxhYmVsfSk6ICR7bWVzc2FnZX1gLCBvcmlnaW5hbE1lc3NhZ2UpKTtcbiAgICB9XG4gICAgcmVzb2x2ZShpZCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLiNjYWxsYmFja3MuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrLnJlc29sdmUodmFsdWUpO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLiNjYWxsYmFja3MudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHByb2JhYmx5IHdlIGNhbiBhY2NlcHQgZXJyb3IgbWVzc2FnZXMgYXMgcGFyYW1zLlxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0KGNhbGxiYWNrLCBuZXcgVGFyZ2V0Q2xvc2VFcnJvcignVGFyZ2V0IGNsb3NlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNjYWxsYmFja3MuY2xlYXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLiNjYWxsYmFja3MudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBFcnJvcihgJHtjYWxsYmFjay5sYWJlbH0gdGltZWQgb3V0LiBUcmFjZTogJHtjYWxsYmFjay5lcnJvci5zdGFja31gKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2FsbGJhY2sge1xuICAgICNpZDtcbiAgICAjZXJyb3IgPSBuZXcgUHJvdG9jb2xFcnJvcigpO1xuICAgICNkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICN0aW1lcjtcbiAgICAjbGFiZWw7XG4gICAgY29uc3RydWN0b3IoaWQsIGxhYmVsLCB0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuI2lkID0gaWQ7XG4gICAgICAgIHRoaXMuI2xhYmVsID0gbGFiZWw7XG4gICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgICB0aGlzLiN0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2RlZmVycmVkLnJlamVjdChyZXdyaXRlRXJyb3IodGhpcy4jZXJyb3IsIGAke2xhYmVsfSB0aW1lZCBvdXQuIEluY3JlYXNlIHRoZSAncHJvdG9jb2xUaW1lb3V0JyBzZXR0aW5nIGluIGxhdW5jaC9jb25uZWN0IGNhbGxzIGZvciBhIGhpZ2hlciB0aW1lb3V0IGlmIG5lZWRlZC5gKSk7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0aW1lcik7XG4gICAgICAgIHRoaXMuI2RlZmVycmVkLnJlc29sdmUodmFsdWUpO1xuICAgIH1cbiAgICByZWplY3QoZXJyb3IpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3RpbWVyKTtcbiAgICAgICAgdGhpcy4jZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaWQ7XG4gICAgfVxuICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGVmZXJyZWQudmFsdWVPclRocm93KCk7XG4gICAgfVxuICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Vycm9yO1xuICAgIH1cbiAgICBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYWJlbDtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5jcmVtZW50YWxJZEdlbmVyYXRvcigpIHtcbiAgICBsZXQgaWQgPSAwO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHJldHVybiArK2lkO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYWxsYmFja1JlZ2lzdHJ5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25maWd1cmF0aW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25uZWN0T3B0aW9ucy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvblRyYW5zcG9ydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBDb25zb2xlTWVzc2FnZSBvYmplY3RzIGFyZSBkaXNwYXRjaGVkIGJ5IHBhZ2UgdmlhIHRoZSAnY29uc29sZScgZXZlbnQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25zb2xlTWVzc2FnZSB7XG4gICAgI3R5cGU7XG4gICAgI3RleHQ7XG4gICAgI2FyZ3M7XG4gICAgI3N0YWNrVHJhY2VMb2NhdGlvbnM7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZSwgdGV4dCwgYXJncywgc3RhY2tUcmFjZUxvY2F0aW9ucykge1xuICAgICAgICB0aGlzLiN0eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy4jdGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuI2FyZ3MgPSBhcmdzO1xuICAgICAgICB0aGlzLiNzdGFja1RyYWNlTG9jYXRpb25zID0gc3RhY2tUcmFjZUxvY2F0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGNvbnNvbGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHRleHQgb2YgdGhlIGNvbnNvbGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICB0ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgY29uc29sZS5cbiAgICAgKi9cbiAgICBhcmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYXJncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBjb25zb2xlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgbG9jYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGFja1RyYWNlTG9jYXRpb25zWzBdID8/IHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYXJyYXkgb2YgbG9jYXRpb25zIG9uIHRoZSBzdGFjayBvZiB0aGUgY29uc29sZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIHN0YWNrVHJhY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGFja1RyYWNlTG9jYXRpb25zO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnNvbGVNZXNzYWdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db29raWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IGludGVycG9sYXRlRnVuY3Rpb24sIHN0cmluZ2lmeUZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbC9GdW5jdGlvbi5qcyc7XG5pbXBvcnQgeyBRdWVyeUhhbmRsZXIsIH0gZnJvbSAnLi9RdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgc2NyaXB0SW5qZWN0b3IgfSBmcm9tICcuL1NjcmlwdEluamVjdG9yLmpzJztcbi8qKlxuICogVGhlIHJlZ2lzdHJ5IG9mIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBjdXN0b20gcXVlcnkgaGFuZGxlcnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIFB1cHBldGVlci5jdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKCdsaXQnLCB7IOKApiB9KTtcbiAqIGNvbnN0IGFIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJ2xpdC/igKYnKTtcbiAqIGBgYFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ3VzdG9tUXVlcnlIYW5kbGVyUmVnaXN0cnkge1xuICAgICNoYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBnZXQobmFtZSkge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy4jaGFuZGxlcnMuZ2V0KG5hbWUpO1xuICAgICAgICByZXR1cm4gaGFuZGxlciA/IGhhbmRsZXJbMV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBjdXN0b20gcXVlcnkgaGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFmdGVyIHJlZ2lzdHJhdGlvbiwgdGhlIGhhbmRsZXIgY2FuIGJlIHVzZWQgZXZlcnl3aGVyZSB3aGVyZSBhIHNlbGVjdG9yIGlzXG4gICAgICogZXhwZWN0ZWQgYnkgcHJlcGVuZGluZyB0aGUgc2VsZWN0aW9uIHN0cmluZyB3aXRoIGA8bmFtZT4vYC4gVGhlIG5hbWUgaXNcbiAgICAgKiBvbmx5IGFsbG93ZWQgdG8gY29uc2lzdCBvZiBsb3dlci0gYW5kIHVwcGVyIGNhc2UgbGF0aW4gbGV0dGVycy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIFB1cHBldGVlci5jdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKCdsaXQnLCB7IOKApiB9KTtcbiAgICAgKiBjb25zdCBhSGFuZGxlID0gYXdhaXQgcGFnZS4kKCdsaXQv4oCmJyk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgdG8gcmVnaXN0ZXIgdW5kZXIuXG4gICAgICogQHBhcmFtIHF1ZXJ5SGFuZGxlciAtIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBDdXN0b20gcXVlcnkgaGFuZGxlcn0gdG9cbiAgICAgKiByZWdpc3Rlci5cbiAgICAgKi9cbiAgICByZWdpc3RlcihuYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlcnMuaGFzKG5hbWUpLCBgQ2Fubm90IHJlZ2lzdGVyIG92ZXIgZXhpc3RpbmcgaGFuZGxlcjogJHtuYW1lfWApO1xuICAgICAgICBhc3NlcnQoL15bYS16QS1aXSskLy50ZXN0KG5hbWUpLCBgQ3VzdG9tIHF1ZXJ5IGhhbmRsZXIgbmFtZXMgbWF5IG9ubHkgY29udGFpbiBbYS16QS1aXWApO1xuICAgICAgICBhc3NlcnQoaGFuZGxlci5xdWVyeUFsbCB8fCBoYW5kbGVyLnF1ZXJ5T25lLCBgQXQgbGVhc3Qgb25lIHF1ZXJ5IG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkLmApO1xuICAgICAgICBjb25zdCBIYW5kbGVyID0gY2xhc3MgZXh0ZW5kcyBRdWVyeUhhbmRsZXIge1xuICAgICAgICAgICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JBbGwgPSBpbnRlcnBvbGF0ZUZ1bmN0aW9uKChub2RlLCBzZWxlY3RvciwgUHVwcGV0ZWVyVXRpbCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQdXBwZXRlZXJVdGlsLmN1c3RvbVF1ZXJ5U2VsZWN0b3JzXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoUExBQ0VIT0xERVIoJ25hbWUnKSlcbiAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwobm9kZSwgc2VsZWN0b3IpO1xuICAgICAgICAgICAgfSwgeyBuYW1lOiBKU09OLnN0cmluZ2lmeShuYW1lKSB9KTtcbiAgICAgICAgICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yID0gaW50ZXJwb2xhdGVGdW5jdGlvbigobm9kZSwgc2VsZWN0b3IsIFB1cHBldGVlclV0aWwpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHVwcGV0ZWVyVXRpbC5jdXN0b21RdWVyeVNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICAuZ2V0KFBMQUNFSE9MREVSKCduYW1lJykpXG4gICAgICAgICAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKG5vZGUsIHNlbGVjdG9yKTtcbiAgICAgICAgICAgIH0sIHsgbmFtZTogSlNPTi5zdHJpbmdpZnkobmFtZSkgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyU2NyaXB0ID0gaW50ZXJwb2xhdGVGdW5jdGlvbigoUHVwcGV0ZWVyVXRpbCkgPT4ge1xuICAgICAgICAgICAgUHVwcGV0ZWVyVXRpbC5jdXN0b21RdWVyeVNlbGVjdG9ycy5yZWdpc3RlcihQTEFDRUhPTERFUignbmFtZScpLCB7XG4gICAgICAgICAgICAgICAgcXVlcnlBbGw6IFBMQUNFSE9MREVSKCdxdWVyeUFsbCcpLFxuICAgICAgICAgICAgICAgIHF1ZXJ5T25lOiBQTEFDRUhPTERFUigncXVlcnlPbmUnKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBuYW1lOiBKU09OLnN0cmluZ2lmeShuYW1lKSxcbiAgICAgICAgICAgIHF1ZXJ5QWxsOiBoYW5kbGVyLnF1ZXJ5QWxsXG4gICAgICAgICAgICAgICAgPyBzdHJpbmdpZnlGdW5jdGlvbihoYW5kbGVyLnF1ZXJ5QWxsKVxuICAgICAgICAgICAgICAgIDogU3RyaW5nKHVuZGVmaW5lZCksXG4gICAgICAgICAgICBxdWVyeU9uZTogaGFuZGxlci5xdWVyeU9uZVxuICAgICAgICAgICAgICAgID8gc3RyaW5naWZ5RnVuY3Rpb24oaGFuZGxlci5xdWVyeU9uZSlcbiAgICAgICAgICAgICAgICA6IFN0cmluZyh1bmRlZmluZWQpLFxuICAgICAgICB9KS50b1N0cmluZygpO1xuICAgICAgICB0aGlzLiNoYW5kbGVycy5zZXQobmFtZSwgW3JlZ2lzdGVyU2NyaXB0LCBIYW5kbGVyXSk7XG4gICAgICAgIHNjcmlwdEluamVjdG9yLmFwcGVuZChyZWdpc3RlclNjcmlwdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIHRoZSB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJ9IGZvciB0aGVcbiAgICAgKiBnaXZlbiBuYW1lLlxuICAgICAqXG4gICAgICogQHRocm93cyBgRXJyb3JgIGlmIHRoZXJlIGlzIG5vIGhhbmRsZXIgdW5kZXIgdGhlIGdpdmVuIG5hbWUuXG4gICAgICovXG4gICAgdW5yZWdpc3RlcihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLiNoYW5kbGVycy5nZXQobmFtZSk7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdW5yZWdpc3RlciB1bmtub3duIGhhbmRsZXI6ICR7bmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBzY3JpcHRJbmplY3Rvci5wb3AoaGFuZGxlclswXSk7XG4gICAgICAgIHRoaXMuI2hhbmRsZXJzLmRlbGV0ZShuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBjdXN0b20gcXVlcnkgaGFuZGxlcnN9LlxuICAgICAqL1xuICAgIG5hbWVzKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuI2hhbmRsZXJzLmtleXMoKV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIGFsbCBjdXN0b20gcXVlcnkgaGFuZGxlcnMuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3JlZ2lzdGVyU2NyaXB0XSBvZiB0aGlzLiNoYW5kbGVycykge1xuICAgICAgICAgICAgc2NyaXB0SW5qZWN0b3IucG9wKHJlZ2lzdGVyU2NyaXB0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNoYW5kbGVycy5jbGVhcigpO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21RdWVyeUhhbmRsZXJzID0gbmV3IEN1c3RvbVF1ZXJ5SGFuZGxlclJlZ2lzdHJ5KCk7XG4vKipcbiAqIEBkZXByZWNhdGVkIEltcG9ydCB7QGxpbmsgUHVwcGV0ZWVyfSBhbmQgdXNlIHRoZSBzdGF0aWMgbWV0aG9kXG4gKiB7QGxpbmsgUHVwcGV0ZWVyLnJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyfVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBjdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKG5hbWUsIGhhbmRsZXIpO1xufVxuLyoqXG4gKiBAZGVwcmVjYXRlZCBJbXBvcnQge0BsaW5rIFB1cHBldGVlcn0gYW5kIHVzZSB0aGUgc3RhdGljIG1ldGhvZFxuICoge0BsaW5rIFB1cHBldGVlci51bnJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyfVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJDdXN0b21RdWVyeUhhbmRsZXIobmFtZSkge1xuICAgIGN1c3RvbVF1ZXJ5SGFuZGxlcnMudW5yZWdpc3RlcihuYW1lKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgSW1wb3J0IHtAbGluayBQdXBwZXRlZXJ9IGFuZCB1c2UgdGhlIHN0YXRpYyBtZXRob2RcbiAqIHtAbGluayBQdXBwZXRlZXIuY3VzdG9tUXVlcnlIYW5kbGVyTmFtZXN9XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tUXVlcnlIYW5kbGVyTmFtZXMoKSB7XG4gICAgcmV0dXJuIGN1c3RvbVF1ZXJ5SGFuZGxlcnMubmFtZXMoKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgSW1wb3J0IHtAbGluayBQdXBwZXRlZXJ9IGFuZCB1c2UgdGhlIHN0YXRpYyBtZXRob2RcbiAqIHtAbGluayBQdXBwZXRlZXIuY2xlYXJDdXN0b21RdWVyeUhhbmRsZXJzfVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQ3VzdG9tUXVlcnlIYW5kbGVycygpIHtcbiAgICBjdXN0b21RdWVyeUhhbmRsZXJzLmNsZWFyKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdXN0b21RdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gJy4uL2Vudmlyb25tZW50LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBkZWJ1Z01vZHVsZSA9IG51bGw7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RGVidWcoKSB7XG4gICAgaWYgKCFkZWJ1Z01vZHVsZSkge1xuICAgICAgICBkZWJ1Z01vZHVsZSA9IChhd2FpdCBpbXBvcnQoJ2RlYnVnJykpLmRlZmF1bHQ7XG4gICAgfVxuICAgIHJldHVybiBkZWJ1Z01vZHVsZTtcbn1cbi8qKlxuICogQSBkZWJ1ZyBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGFueSBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgdXNlZCBpbiBOb2RlLCBpdCBmYWxscyBiYWNrIHRvIHRoZVxuICoge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2RlYnVnIHwgZGVidWcgbW9kdWxlfS4gSW4gdGhlIGJyb3dzZXIgaXRcbiAqIHVzZXMgYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBJbiBOb2RlLCB1c2UgdGhlIGBERUJVR2AgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gY29udHJvbCBsb2dnaW5nOlxuICpcbiAqIGBgYFxuICogREVCVUc9KiAvLyBsb2dzIGFsbCBjaGFubmVsc1xuICogREVCVUc9Zm9vIC8vIGxvZ3MgdGhlIGBmb29gIGNoYW5uZWxcbiAqIERFQlVHPWZvbyogLy8gbG9ncyBhbnkgY2hhbm5lbHMgc3RhcnRpbmcgd2l0aCBgZm9vYFxuICogYGBgXG4gKlxuICogSW4gdGhlIGJyb3dzZXIsIHNldCBgd2luZG93Ll9fUFVQUEVURUVSX0RFQlVHYCB0byBhIHN0cmluZzpcbiAqXG4gKiBgYGBcbiAqIHdpbmRvdy5fX1BVUFBFVEVFUl9ERUJVRz0nKic7IC8vIGxvZ3MgYWxsIGNoYW5uZWxzXG4gKiB3aW5kb3cuX19QVVBQRVRFRVJfREVCVUc9J2Zvbyc7IC8vIGxvZ3MgdGhlIGBmb29gIGNoYW5uZWxcbiAqIHdpbmRvdy5fX1BVUFBFVEVFUl9ERUJVRz0nZm9vKic7IC8vIGxvZ3MgYW55IGNoYW5uZWxzIHN0YXJ0aW5nIHdpdGggYGZvb2BcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgXG4gKiBjb25zdCBsb2cgPSBkZWJ1ZygnUGFnZScpO1xuICpcbiAqIGxvZygnbmV3IHBhZ2UgY3JlYXRlZCcpXG4gKiAvLyBsb2dzIFwiUGFnZTogbmV3IHBhZ2UgY3JlYXRlZFwiXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHJlZml4IC0gdGhpcyB3aWxsIGJlIHByZWZpeGVkIHRvIGVhY2ggbG9nLlxuICogQHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gbG9nIHRvIHRoYXQgZGVidWcgY2hhbm5lbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGRlYnVnID0gKHByZWZpeCkgPT4ge1xuICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jICguLi5sb2dBcmdzKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2FwdHVyZUxvZ3MpIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlZExvZ3MucHVzaChwcmVmaXggKyBsb2dBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChhd2FpdCBpbXBvcnREZWJ1ZygpKShwcmVmaXgpKGxvZ0FyZ3MpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gKC4uLmxvZ0FyZ3MpID0+IHtcbiAgICAgICAgY29uc3QgZGVidWdMZXZlbCA9IGdsb2JhbFRoaXMuX19QVVBQRVRFRVJfREVCVUc7XG4gICAgICAgIGlmICghZGVidWdMZXZlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZXJ5dGhpbmdTaG91bGRCZUxvZ2dlZCA9IGRlYnVnTGV2ZWwgPT09ICcqJztcbiAgICAgICAgY29uc3QgcHJlZml4TWF0Y2hlc0RlYnVnTGV2ZWwgPSBldmVyeXRoaW5nU2hvdWxkQmVMb2dnZWQgfHxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSWYgdGhlIGRlYnVnIGxldmVsIGlzIGBmb28qYCwgdGhhdCBtZWFucyB3ZSBtYXRjaCBhbnkgcHJlZml4IHRoYXRcbiAgICAgICAgICAgICAqIHN0YXJ0cyB3aXRoIGBmb29gLiBJZiB0aGUgbGV2ZWwgaXMgYGZvb2AsIHdlIG1hdGNoIG9ubHkgdGhlIHByZWZpeFxuICAgICAgICAgICAgICogYGZvb2AuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIChkZWJ1Z0xldmVsLmVuZHNXaXRoKCcqJylcbiAgICAgICAgICAgICAgICA/IHByZWZpeC5zdGFydHNXaXRoKGRlYnVnTGV2ZWwpXG4gICAgICAgICAgICAgICAgOiBwcmVmaXggPT09IGRlYnVnTGV2ZWwpO1xuICAgICAgICBpZiAoIXByZWZpeE1hdGNoZXNEZWJ1Z0xldmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coYCR7cHJlZml4fTpgLCAuLi5sb2dBcmdzKTtcbiAgICB9O1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBjYXB0dXJlZExvZ3MgPSBbXTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBjYXB0dXJlTG9ncyA9IGZhbHNlO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExvZ0NhcHR1cmUodmFsdWUpIHtcbiAgICBjYXB0dXJlZExvZ3MgPSBbXTtcbiAgICBjYXB0dXJlTG9ncyA9IHZhbHVlO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhcHR1cmVkTG9ncygpIHtcbiAgICByZXR1cm4gY2FwdHVyZWRMb2dzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVidWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmNvbnN0IGtub3duRGV2aWNlcyA9IFtcbiAgICB7XG4gICAgICAgIG5hbWU6ICdCbGFja2JlcnJ5IFBsYXlCb29rJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKFBsYXlCb29rOyBVOyBSSU0gVGFibGV0IE9TIDIuMS4wOyBlbi1VUykgQXBwbGVXZWJLaXQvNTM2LjIrIChLSFRNTCBsaWtlIEdlY2tvKSBWZXJzaW9uLzcuMi4xLjAgU2FmYXJpLzUzNi4yKycsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDI0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDEsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnQmxhY2tiZXJyeSBQbGF5Qm9vayBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoUGxheUJvb2s7IFU7IFJJTSBUYWJsZXQgT1MgMi4xLjA7IGVuLVVTKSBBcHBsZVdlYktpdC81MzYuMisgKEtIVE1MIGxpa2UgR2Vja28pIFZlcnNpb24vNy4yLjEuMCBTYWZhcmkvNTM2LjIrJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDI0LFxuICAgICAgICAgICAgaGVpZ2h0OiA2MDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0JsYWNrQmVycnkgWjMwJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKEJCMTA7IFRvdWNoKSBBcHBsZVdlYktpdC81MzcuMTArIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wLjkuMjM3MiBNb2JpbGUgU2FmYXJpLzUzNy4xMCsnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnQmxhY2tCZXJyeSBaMzAgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKEJCMTA7IFRvdWNoKSBBcHBsZVdlYktpdC81MzcuMTArIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wLjkuMjM3MiBNb2JpbGUgU2FmYXJpLzUzNy4xMCsnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgTm90ZSAzJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMzsgZW4tdXM7IFNNLU45MDBUIEJ1aWxkL0pTUzE1SikgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnR2FsYXh5IE5vdGUgMyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgNC4zOyBlbi11czsgU00tTjkwMFQgQnVpbGQvSlNTMTVKKSBBcHBsZVdlYktpdC81MzQuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBNb2JpbGUgU2FmYXJpLzUzNC4zMCcsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBOb3RlIElJJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMTsgZW4tdXM7IEdULU43MTAwIEJ1aWxkL0pSTzAzQykgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnR2FsYXh5IE5vdGUgSUkgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMTsgZW4tdXM7IEdULU43MTAwIEJ1aWxkL0pSTzAzQykgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUyBJSUknLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgNC4wOyBlbi11czsgR1QtSTkzMDAgQnVpbGQvSU1NNzZEKSBBcHBsZVdlYktpdC81MzQuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBNb2JpbGUgU2FmYXJpLzUzNC4zMCcsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzYwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUyBJSUkgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMDsgZW4tdXM7IEdULUk5MzAwIEJ1aWxkL0lNTTc2RCkgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUzUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNS4wOyBTTS1HOTAwUCBCdWlsZC9MUlgyMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzYwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUzUgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDUuMDsgU00tRzkwMFAgQnVpbGQvTFJYMjFUKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUzgnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNy4wOyBTTS1HOTUwVSBCdWlsZC9OUkQ5ME0pIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS82Mi4wLjMyMDIuODQgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNzQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnR2FsYXh5IFM4IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA3LjA7IFNNLUc5NTBVIEJ1aWxkL05SRDkwTSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzYyLjAuMzIwMi44NCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBTOSsnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4wLjA7IFNNLUc5NjVVIEJ1aWxkL1IxNk5XKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNjMuMC4zMjM5LjExMSBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzIwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NTgsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogNC41LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBTOSsgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBTTS1HOTY1VSBCdWlsZC9SMTZOVykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzYzLjAuMzIzOS4xMTEgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY1OCxcbiAgICAgICAgICAgIGhlaWdodDogMzIwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDQuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBUYWIgUzQnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4xLjA7IFNNLVQ4MzdBKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzAuMC4zNTM4LjgwIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDcxMixcbiAgICAgICAgICAgIGhlaWdodDogMTEzOCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLjI1LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBUYWIgUzQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMS4wOyBTTS1UODM3QSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzcwLjAuMzUzOC44MCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMTM4LFxuICAgICAgICAgICAgaGVpZ2h0OiA3MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi4yNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzQgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTUzNDFmIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzY4LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDI0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzQgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTUzNDFmIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMTAyNCxcbiAgICAgICAgICAgIGhlaWdodDogNzY4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIChnZW4gNiknLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDEyXzIgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDc2OCxcbiAgICAgICAgICAgIGhlaWdodDogMTAyNCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQgKGdlbiA2KSBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDEyXzIgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDEwMjQsXG4gICAgICAgICAgICBoZWlnaHQ6IDc2OCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCAoZ2VuIDcpJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMl8yIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xNS40IE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4MTAsXG4gICAgICAgICAgICBoZWlnaHQ6IDEwODAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIChnZW4gNykgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMl8yIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xNS40IE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDgwLFxuICAgICAgICAgICAgaGVpZ2h0OiA4MTAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQgTWluaScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zNCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBNTM0MWYgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA3NjgsXG4gICAgICAgICAgICBoZWlnaHQ6IDEwMjQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIE1pbmkgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM0IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUE1MzQxZiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDEwMjQsXG4gICAgICAgICAgICBoZWlnaHQ6IDc2OCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzQgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTUzNDFmIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMTAyNCxcbiAgICAgICAgICAgIGhlaWdodDogMTM2NixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQgUHJvIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zNCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBNTM0MWYgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMzY2LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDI0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIFBybyAxMScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgMTJfMiBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODM0LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMTk0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCBQcm8gMTEgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMl8yIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xNS40IE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMTk0LFxuICAgICAgICAgICAgaGVpZ2h0OiA4MzQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA0JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyA3XzFfMiBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC81MzcuNTEuMiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNy4wIE1vYmlsZS8xMUQyNTcgU2FmYXJpLzk1MzcuNTMnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDMyMCxcbiAgICAgICAgICAgIGhlaWdodDogNDgwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyA3XzFfMiBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC81MzcuNTEuMiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNy4wIE1vYmlsZS8xMUQyNTcgU2FmYXJpLzk1MzcuNTMnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQ4MCxcbiAgICAgICAgICAgIGhlaWdodDogMzIwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgNScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTBfM18xIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwMy4xLjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wIE1vYmlsZS8xNEUzMDQgU2FmYXJpLzYwMi4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzMjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDU2OCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA1IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTBfM18xIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwMy4xLjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wIE1vYmlsZS8xNEUzMDQgU2FmYXJpLzYwMi4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA1NjgsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDYnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM3NSxcbiAgICAgICAgICAgIGhlaWdodDogNjY3LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDYgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA2NjcsXG4gICAgICAgICAgICBoZWlnaHQ6IDM3NSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDYgUGx1cycsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDE0LFxuICAgICAgICAgICAgaGVpZ2h0OiA3MzYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgNiBQbHVzIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzM2LFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA3JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNzUsXG4gICAgICAgICAgICBoZWlnaHQ6IDY2NyxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA3IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjY3LFxuICAgICAgICAgICAgaGVpZ2h0OiAzNzUsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA3IFBsdXMnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQxNCxcbiAgICAgICAgICAgIGhlaWdodDogNzM2LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDcgUGx1cyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDczNixcbiAgICAgICAgICAgIGhlaWdodDogNDE0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgOCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzc1LFxuICAgICAgICAgICAgaGVpZ2h0OiA2NjcsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgOCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY2NyxcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgOCBQbHVzJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTQsXG4gICAgICAgICAgICBoZWlnaHQ6IDczNixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA4IFBsdXMgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA3MzYsXG4gICAgICAgICAgICBoZWlnaHQ6IDQxNCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFNFJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMF8zXzEgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjAzLjEuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEwLjAgTW9iaWxlLzE0RTMwNCBTYWZhcmkvNjAyLjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDMyMCxcbiAgICAgICAgICAgIGhlaWdodDogNTY4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFNFIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTBfM18xIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwMy4xLjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wIE1vYmlsZS8xNEUzMDQgU2FmYXJpLzYwMi4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA1NjgsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFgnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM3NSxcbiAgICAgICAgICAgIGhlaWdodDogODEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFggbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4MTIsXG4gICAgICAgICAgICBoZWlnaHQ6IDM3NSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFhSJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMl8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMi4wIE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTQsXG4gICAgICAgICAgICBoZWlnaHQ6IDg5NixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSBYUiBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEyXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEyLjAgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg5NixcbiAgICAgICAgICAgIGhlaWdodDogNDE0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTEnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQxNCxcbiAgICAgICAgICAgIGhlaWdodDogODI4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDExIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTNfNyBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTMuMSBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODI4LFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSAxMSBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM3NSxcbiAgICAgICAgICAgIGhlaWdodDogODEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDExIFBybyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgxMixcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTEgUHJvIE1heCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTNfNyBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTMuMSBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDE0LFxuICAgICAgICAgICAgaGVpZ2h0OiA4OTYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTEgUHJvIE1heCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg5NixcbiAgICAgICAgICAgIGhlaWdodDogNDE0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTInLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEyIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTRfNCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODQ0LFxuICAgICAgICAgICAgaGVpZ2h0OiAzOTAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSAxMiBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEyIFBybyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg0NCxcbiAgICAgICAgICAgIGhlaWdodDogMzkwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgUHJvIE1heCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTRfNCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDI4LFxuICAgICAgICAgICAgaGVpZ2h0OiA5MjYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgUHJvIE1heCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDkyNixcbiAgICAgICAgICAgIGhlaWdodDogNDI4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgTWluaScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTRfNCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzc1LFxuICAgICAgICAgICAgaGVpZ2h0OiA4MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgTWluaSBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgxMixcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEzIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTVfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODQ0LFxuICAgICAgICAgICAgaGVpZ2h0OiAzOTAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSAxMyBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEzIFBybyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg0NCxcbiAgICAgICAgICAgIGhlaWdodDogMzkwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgUHJvIE1heCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTVfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDI4LFxuICAgICAgICAgICAgaGVpZ2h0OiA5MjYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgUHJvIE1heCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDkyNixcbiAgICAgICAgICAgIGhlaWdodDogNDI4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgTWluaScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTVfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzc1LFxuICAgICAgICAgICAgaGVpZ2h0OiA4MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgTWluaSBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgxMixcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdKaW9QaG9uZSAyJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKE1vYmlsZTsgTFlGL0YzMDBCL0xZRi1GMzAwQi0wMDEtMDEtMTUtMTMwNzE4LWk7QW5kcm9pZDsgcnY6NDguMCkgR2Vja28vNDguMCBGaXJlZm94LzQ4LjAgS0FJT1MvMi41JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAyNDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0ppb1Bob25lIDIgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKE1vYmlsZTsgTFlGL0YzMDBCL0xZRi1GMzAwQi0wMDEtMDEtMTUtMTMwNzE4LWk7QW5kcm9pZDsgcnY6NDguMCkgR2Vja28vNDguMCBGaXJlZm94LzQ4LjAgS0FJT1MvMi41JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzMjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDI0MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnS2luZGxlIEZpcmUgSERYJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBlbi11czsgS0ZBUFdJIEJ1aWxkL0pEUTM5KSBBcHBsZVdlYktpdC81MzUuMTkgKEtIVE1MLCBsaWtlIEdlY2tvKSBTaWxrLzMuMTMgU2FmYXJpLzUzNS4xOSBTaWxrLUFjY2VsZXJhdGVkPXRydWUnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgwMCxcbiAgICAgICAgICAgIGhlaWdodDogMTI4MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0tpbmRsZSBGaXJlIEhEWCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IFU7IGVuLXVzOyBLRkFQV0kgQnVpbGQvSkRRMzkpIEFwcGxlV2ViS2l0LzUzNS4xOSAoS0hUTUwsIGxpa2UgR2Vja28pIFNpbGsvMy4xMyBTYWZhcmkvNTM1LjE5IFNpbGstQWNjZWxlcmF0ZWQ9dHJ1ZScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMTI4MCxcbiAgICAgICAgICAgIGhlaWdodDogODAwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdMRyBPcHRpbXVzIEw3MCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgVTsgQW5kcm9pZCA0LjQuMjsgZW4tdXM7IExHTVMzMjMgQnVpbGQvS09UNDlJLk1TMzIzMTBjKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM4NCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDEuMjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTEcgT3B0aW11cyBMNzAgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuNC4yOyBlbi11czsgTEdNUzMyMyBCdWlsZC9LT1Q0OUkuTVMzMjMxMGMpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzODQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMS4yNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ01pY3Jvc29mdCBMdW1pYSA1NTAnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBQaG9uZSAxMC4wOyBBbmRyb2lkIDQuMi4xOyBNaWNyb3NvZnQ7IEx1bWlhIDU1MCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzQ2LjAuMjQ4Ni4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2IEVkZ2UvMTQuMTQyNjMnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTWljcm9zb2Z0IEx1bWlhIDk1MCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChXaW5kb3dzIFBob25lIDEwLjA7IEFuZHJvaWQgNC4yLjE7IE1pY3Jvc29mdDsgTHVtaWEgOTUwKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDYuMC4yNDg2LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYgRWRnZS8xNC4xNDI2MycsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzYwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogNCxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdNaWNyb3NvZnQgTHVtaWEgOTUwIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChXaW5kb3dzIFBob25lIDEwLjA7IEFuZHJvaWQgNC4yLjE7IE1pY3Jvc29mdDsgTHVtaWEgOTUwKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDYuMC4yNDg2LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYgRWRnZS8xNC4xNDI2MycsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogNCxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDEwJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMC4xOyBOZXh1cyAxMCBCdWlsZC9NT0IzMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4MDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDEyODAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyAxMCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wLjE7IE5leHVzIDEwIEJ1aWxkL01PQjMxVCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDEyODAsXG4gICAgICAgICAgICBoZWlnaHQ6IDgwMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTmV4dXMgNCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA0LjQuMjsgTmV4dXMgNCBCdWlsZC9LT1Q0OUgpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzg0LFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyA0IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA0LjQuMjsgTmV4dXMgNCBCdWlsZC9LT1Q0OUgpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzODQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wOyBOZXh1cyA1IEJ1aWxkL01SQTU4TikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDY0MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDUgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMDsgTmV4dXMgNSBCdWlsZC9NUkE1OE4pIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDVYJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBOZXh1cyA1WCBCdWlsZC9PUFI0LjE3MDYyMy4wMDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDEyLFxuICAgICAgICAgICAgaGVpZ2h0OiA3MzIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi42MjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTmV4dXMgNVggbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBOZXh1cyA1WCBCdWlsZC9PUFI0LjE3MDYyMy4wMDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzMyLFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi42MjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyA2JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMS4xOyBOZXh1cyA2IEJ1aWxkL042RjI2VSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTIsXG4gICAgICAgICAgICBoZWlnaHQ6IDczMixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTmV4dXMgNiBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNy4xLjE7IE5leHVzIDYgQnVpbGQvTjZGMjZVKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDczMixcbiAgICAgICAgICAgIGhlaWdodDogNDEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDZQJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBOZXh1cyA2UCBCdWlsZC9PUFAzLjE3MDUxOC4wMDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDEyLFxuICAgICAgICAgICAgaGVpZ2h0OiA3MzIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMy41LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDZQIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA4LjAuMDsgTmV4dXMgNlAgQnVpbGQvT1BQMy4xNzA1MTguMDA2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDczMixcbiAgICAgICAgICAgIGhlaWdodDogNDEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDcnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wLjE7IE5leHVzIDcgQnVpbGQvTU9CMzBYKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiA5NjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyA3IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA2LjAuMTsgTmV4dXMgNyBCdWlsZC9NT0IzMFgpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA5NjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDYwMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTm9raWEgTHVtaWEgNTIwJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IE1TSUUgMTAuMDsgV2luZG93cyBQaG9uZSA4LjA7IFRyaWRlbnQvNi4wOyBJRU1vYmlsZS8xMC4wOyBBUk07IFRvdWNoOyBOT0tJQTsgTHVtaWEgNTIwKScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzIwLFxuICAgICAgICAgICAgaGVpZ2h0OiA1MzMsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMS41LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05va2lhIEx1bWlhIDUyMCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoY29tcGF0aWJsZTsgTVNJRSAxMC4wOyBXaW5kb3dzIFBob25lIDguMDsgVHJpZGVudC82LjA7IElFTW9iaWxlLzEwLjA7IEFSTTsgVG91Y2g7IE5PS0lBOyBMdW1pYSA1MjApJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA1MzMsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOb2tpYSBOOScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChNZWVHbzsgTm9raWFOOSkgQXBwbGVXZWJLaXQvNTM0LjEzIChLSFRNTCwgbGlrZSBHZWNrbykgTm9raWFCcm93c2VyLzguNS4wIE1vYmlsZSBTYWZhcmkvNTM0LjEzJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0ODAsXG4gICAgICAgICAgICBoZWlnaHQ6IDg1NCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05va2lhIE45IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChNZWVHbzsgTm9raWFOOSkgQXBwbGVXZWJLaXQvNTM0LjEzIChLSFRNTCwgbGlrZSBHZWNrbykgTm9raWFCcm93c2VyLzguNS4wIE1vYmlsZSBTYWZhcmkvNTM0LjEzJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4NTQsXG4gICAgICAgICAgICBoZWlnaHQ6IDQ4MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnUGl4ZWwgMicsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA4LjA7IFBpeGVsIDIgQnVpbGQvT1BEMy4xNzA4MTYuMDEyKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQxMSxcbiAgICAgICAgICAgIGhlaWdodDogNzMxLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIuNjI1LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDIgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMDsgUGl4ZWwgMiBCdWlsZC9PUEQzLjE3MDgxNi4wMTIpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzMxLFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTEsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi42MjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdQaXhlbCAyIFhMJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBQaXhlbCAyIFhMIEJ1aWxkL09QRDEuMTcwODE2LjAwNCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTEsXG4gICAgICAgICAgICBoZWlnaHQ6IDgyMyxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnUGl4ZWwgMiBYTCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4wLjA7IFBpeGVsIDIgWEwgQnVpbGQvT1BEMS4xNzA4MTYuMDA0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgyMyxcbiAgICAgICAgICAgIGhlaWdodDogNDExLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDMnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOTsgUGl4ZWwgMyBCdWlsZC9QUTFBLjE4MTEwNS4wMTcuQTEpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS82Ni4wLjMzNTkuMTU4IE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzOTMsXG4gICAgICAgICAgICBoZWlnaHQ6IDc4NixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLjc1LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDMgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDk7IFBpeGVsIDMgQnVpbGQvUFExQS4xODExMDUuMDE3LkExKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNjYuMC4zMzU5LjE1OCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzg2LFxuICAgICAgICAgICAgaGVpZ2h0OiAzOTMsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi43NSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDQnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IFBpeGVsIDQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84MS4wLjQwNDQuMTM4IE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNTMsXG4gICAgICAgICAgICBoZWlnaHQ6IDc0NSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDEwOyBQaXhlbCA0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODEuMC40MDQ0LjEzOCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzQ1LFxuICAgICAgICAgICAgaGVpZ2h0OiAzNTMsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDRhICg1RyknLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTE7IFBpeGVsIDRhICg1RykpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS85OS4wLjQ4MTIuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzUzLFxuICAgICAgICAgICAgaGVpZ2h0OiA3NDUsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdQaXhlbCA0YSAoNUcpIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMTsgUGl4ZWwgNGEgKDVHKSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA3NDUsXG4gICAgICAgICAgICBoZWlnaHQ6IDM1MyxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnUGl4ZWwgNScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMTsgUGl4ZWwgNSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzOTMsXG4gICAgICAgICAgICBoZWlnaHQ6IDg1MSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDUgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDExOyBQaXhlbCA1KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvOTkuMC40ODEyLjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg1MSxcbiAgICAgICAgICAgIGhlaWdodDogMzkzLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdNb3RvIEc0JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMDsgTW90byBHICg0KSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDY0MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ01vdG8gRzQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMDsgTW90byBHICg0KSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA2NDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDM2MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG5dO1xuY29uc3Qga25vd25EZXZpY2VzQnlOYW1lID0ge307XG5mb3IgKGNvbnN0IGRldmljZSBvZiBrbm93bkRldmljZXMpIHtcbiAgICBrbm93bkRldmljZXNCeU5hbWVbZGV2aWNlLm5hbWVdID0gZGV2aWNlO1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgZGV2aWNlcyB0byBiZSB1c2VkIHdpdGgge0BsaW5rIFBhZ2UuZW11bGF0ZX0uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHtLbm93bkRldmljZXN9IGZyb20gJ3B1cHBldGVlcic7XG4gKiBjb25zdCBpUGhvbmUgPSBLbm93bkRldmljZXNbJ2lQaG9uZSA2J107XG4gKlxuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmVtdWxhdGUoaVBob25lKTtcbiAqICAgYXdhaXQgcGFnZS5nb3RvKCdodHRwczovL3d3dy5nb29nbGUuY29tJyk7XG4gKiAgIC8vIG90aGVyIGFjdGlvbnMuLi5cbiAqICAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICogfSkoKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IEtub3duRGV2aWNlcyA9IE9iamVjdC5mcmVlemUoa25vd25EZXZpY2VzQnlOYW1lKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURldmljZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIFB1cHBldGVlci1zcGVjaWZpYyBlcnJvcnNcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQdXBwZXRlZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICB9XG59XG4vKipcbiAqIFRpbWVvdXRFcnJvciBpcyBlbWl0dGVkIHdoZW5ldmVyIGNlcnRhaW4gb3BlcmF0aW9ucyBhcmUgdGVybWluYXRlZCBkdWUgdG9cbiAqIHRpbWVvdXQuXG4gKlxuICogQHJlbWFya3NcbiAqIEV4YW1wbGUgb3BlcmF0aW9ucyBhcmUge0BsaW5rIFBhZ2Uud2FpdEZvclNlbGVjdG9yIHwgcGFnZS53YWl0Rm9yU2VsZWN0b3J9IG9yXG4gKiB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXVuY2ggfCBwdXBwZXRlZXIubGF1bmNofS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lb3V0RXJyb3IgZXh0ZW5kcyBQdXBwZXRlZXJFcnJvciB7XG59XG4vKipcbiAqIFByb3RvY29sRXJyb3IgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGVyZSBpcyBhbiBlcnJvciBmcm9tIHRoZSBwcm90b2NvbC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm90b2NvbEVycm9yIGV4dGVuZHMgUHVwcGV0ZWVyRXJyb3Ige1xuICAgICNjb2RlO1xuICAgICNvcmlnaW5hbE1lc3NhZ2UgPSAnJztcbiAgICBzZXQgY29kZShjb2RlKSB7XG4gICAgICAgIHRoaXMuI2NvZGUgPSBjb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgZ2V0IGNvZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb2RlO1xuICAgIH1cbiAgICBzZXQgb3JpZ2luYWxNZXNzYWdlKG9yaWdpbmFsTWVzc2FnZSkge1xuICAgICAgICB0aGlzLiNvcmlnaW5hbE1lc3NhZ2UgPSBvcmlnaW5hbE1lc3NhZ2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBnZXQgb3JpZ2luYWxNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jb3JpZ2luYWxNZXNzYWdlO1xuICAgIH1cbn1cbi8qKlxuICogUHVwcGV0ZWVyIHdpbGwgdGhyb3cgdGhpcyBlcnJvciBpZiBhIG1ldGhvZCBpcyBub3RcbiAqIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHVzZWQgcHJvdG9jb2xcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZE9wZXJhdGlvbiBleHRlbmRzIFB1cHBldGVlckVycm9yIHtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRDbG9zZUVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcnJvcnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBtaXR0IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L21pdHQvbWl0dC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlU3ltYm9sIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbi8qKlxuICogVGhlIEV2ZW50RW1pdHRlciBjbGFzcyB0aGF0IG1hbnkgUHVwcGV0ZWVyIGNsYXNzZXMgZXh0ZW5kLlxuICpcbiAqIEByZW1hcmtzXG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIGxpc3RlbiB0byBldmVudHMgdGhhdCBQdXBwZXRlZXIgY2xhc3NlcyBmaXJlIGFuZCBhY3RcbiAqIGFjY29yZGluZ2x5LiBUaGVyZWZvcmUgeW91J2xsIG1vc3RseSB1c2Uge0BsaW5rIEV2ZW50RW1pdHRlci5vbiB8IG9ufSBhbmRcbiAqIHtAbGluayBFdmVudEVtaXR0ZXIub2ZmIHwgb2ZmfSB0byBiaW5kXG4gKiBhbmQgdW5iaW5kIHRvIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXIge1xuICAgICNlbWl0dGVyO1xuICAgICNoYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICAvKipcbiAgICAgKiBJZiB5b3UgcGFzcyBhbiBlbWl0dGVyLCB0aGUgcmV0dXJuZWQgZW1pdHRlciB3aWxsIHdyYXAgdGhlIHBhc3NlZCBlbWl0dGVyLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZW1pdHRlciA9IG1pdHQobmV3IE1hcCgpKSkge1xuICAgICAgICB0aGlzLiNlbWl0dGVyID0gZW1pdHRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQmluZCBhbiBldmVudCBsaXN0ZW5lciB0byBmaXJlIHdoZW4gYW4gZXZlbnQgb2NjdXJzLlxuICAgICAqIEBwYXJhbSB0eXBlIC0gdGhlIGV2ZW50IHR5cGUgeW91J2QgbGlrZSB0byBsaXN0ZW4gdG8uIENhbiBiZSBhIHN0cmluZyBvciBzeW1ib2wuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IG9jY3Vycy5cbiAgICAgKiBAcmV0dXJucyBgdGhpc2AgdG8gZW5hYmxlIHlvdSB0byBjaGFpbiBtZXRob2QgY2FsbHMuXG4gICAgICovXG4gICAgb24odHlwZSwgaGFuZGxlcikge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuI2hhbmRsZXJzLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKGhhbmRsZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZXJzLnNldCh0eXBlLCBbaGFuZGxlcl0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNlbWl0dGVyLm9uKHR5cGUsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gZmlyaW5nLlxuICAgICAqIEBwYXJhbSB0eXBlIC0gdGhlIGV2ZW50IHR5cGUgeW91J2QgbGlrZSB0byBzdG9wIGxpc3RlbmluZyB0by5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciAtIHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSByZW1vdmVkLlxuICAgICAqIEByZXR1cm5zIGB0aGlzYCB0byBlbmFibGUgeW91IHRvIGNoYWluIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICBvZmYodHlwZSwgaGFuZGxlcikge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuI2hhbmRsZXJzLmdldCh0eXBlKSA/PyBbXTtcbiAgICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZW1pdHRlci5vZmYodHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNoYW5kbGVycy5kZWxldGUodHlwZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IGhhbmRsZXJzLmxhc3RJbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy4jZW1pdHRlci5vZmYodHlwZSwgLi4uaGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVtaXQgYW4gZXZlbnQgYW5kIGNhbGwgYW55IGFzc29jaWF0ZWQgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgLSB0aGUgZXZlbnQgeW91J2QgbGlrZSB0byBlbWl0XG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSAtIGFueSBkYXRhIHlvdSdkIGxpa2UgdG8gZW1pdCB3aXRoIHRoZSBldmVudFxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGVyZSBhcmUgYW55IGxpc3RlbmVycywgYGZhbHNlYCBpZiB0aGVyZSBhcmUgbm90LlxuICAgICAqL1xuICAgIGVtaXQodHlwZSwgZXZlbnQpIHtcbiAgICAgICAgdGhpcy4jZW1pdHRlci5lbWl0KHR5cGUsIGV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXJDb3VudCh0eXBlKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpa2UgYG9uYCBidXQgdGhlIGxpc3RlbmVyIHdpbGwgb25seSBiZSBmaXJlZCBvbmNlIGFuZCB0aGVuIGl0IHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAgKiBAcGFyYW0gdHlwZSAtIHRoZSBldmVudCB5b3UnZCBsaWtlIHRvIGxpc3RlbiB0b1xuICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gdGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gcnVuIHdoZW4gdGhlIGV2ZW50IG9jY3Vyc1xuICAgICAqIEByZXR1cm5zIGB0aGlzYCB0byBlbmFibGUgeW91IHRvIGNoYWluIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICBvbmNlKHR5cGUsIGhhbmRsZXIpIHtcbiAgICAgICAgY29uc3Qgb25jZUhhbmRsZXIgPSBldmVudERhdGEgPT4ge1xuICAgICAgICAgICAgaGFuZGxlcihldmVudERhdGEpO1xuICAgICAgICAgICAgdGhpcy5vZmYodHlwZSwgb25jZUhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5vbih0eXBlLCBvbmNlSGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSAtIHRoZSBldmVudCB0byBnZXQgdGhlIGxpc3RlbmVyIGNvdW50IGZvclxuICAgICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGJvdW5kIHRvIHRoZSBnaXZlbiBldmVudFxuICAgICAqL1xuICAgIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaGFuZGxlcnMuZ2V0KHR5cGUpPy5sZW5ndGggfHwgMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgbGlzdGVuZXJzLiBJZiBnaXZlbiBhbiBldmVudCBhcmd1bWVudCwgaXQgd2lsbCByZW1vdmUgb25seVxuICAgICAqIGxpc3RlbmVycyBmb3IgdGhhdCBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlIC0gdGhlIGV2ZW50IHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICAgICAqIEByZXR1cm5zIGB0aGlzYCB0byBlbmFibGUgeW91IHRvIGNoYWluIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vZmYodHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpc1tkaXNwb3NlU3ltYm9sXSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICBmb3IgKGNvbnN0IFt0eXBlLCBoYW5kbGVyc10gb2YgdGhpcy4jaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXR0ZXIub2ZmKHR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2hhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50U3Vic2NyaXB0aW9uIHtcbiAgICAjdGFyZ2V0O1xuICAgICN0eXBlO1xuICAgICNoYW5kbGVyO1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgdHlwZSwgaGFuZGxlcikge1xuICAgICAgICB0aGlzLiN0YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLiNoYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgdGhpcy4jdGFyZ2V0Lm9uKHRoaXMuI3R5cGUsIHRoaXMuI2hhbmRsZXIpO1xuICAgIH1cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHRoaXMuI3RhcmdldC5vZmYodGhpcy4jdHlwZSwgdGhpcy4jaGFuZGxlcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRFbWl0dGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG4vKipcbiAqIEZpbGUgY2hvb3NlcnMgbGV0IHlvdSByZWFjdCB0byB0aGUgcGFnZSByZXF1ZXN0aW5nIGZvciBhIGZpbGUuXG4gKlxuICogQHJlbWFya3NcbiAqIGBGaWxlQ2hvb3NlcmAgaW5zdGFuY2VzIGFyZSByZXR1cm5lZCB2aWEgdGhlIHtAbGluayBQYWdlLndhaXRGb3JGaWxlQ2hvb3Nlcn0gbWV0aG9kLlxuICpcbiAqIEluIGJyb3dzZXJzLCBvbmx5IG9uZSBmaWxlIGNob29zZXIgY2FuIGJlIG9wZW5lZCBhdCBhIHRpbWUuXG4gKiBBbGwgZmlsZSBjaG9vc2VycyBtdXN0IGJlIGFjY2VwdGVkIG9yIGNhbmNlbGVkLiBOb3QgZG9pbmcgc28gd2lsbCBwcmV2ZW50XG4gKiBzdWJzZXF1ZW50IGZpbGUgY2hvb3NlcnMgZnJvbSBhcHBlYXJpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgW2ZpbGVDaG9vc2VyXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS53YWl0Rm9yRmlsZUNob29zZXIoKSxcbiAqICAgcGFnZS5jbGljaygnI3VwbG9hZC1maWxlLWJ1dHRvbicpLCAvLyBzb21lIGJ1dHRvbiB0aGF0IHRyaWdnZXJzIGZpbGUgc2VsZWN0aW9uXG4gKiBdKTtcbiAqIGF3YWl0IGZpbGVDaG9vc2VyLmFjY2VwdChbJy90bXAvbXlmaWxlLnBkZiddKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVDaG9vc2VyIHtcbiAgICAjZWxlbWVudDtcbiAgICAjbXVsdGlwbGU7XG4gICAgI2hhbmRsZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBldmVudCkge1xuICAgICAgICB0aGlzLiNlbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy4jbXVsdGlwbGUgPSBldmVudC5tb2RlICE9PSAnc2VsZWN0U2luZ2xlJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciBmaWxlIGNob29zZXIgYWxsb3cgZm9yXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dC9maWxlI2F0dHItbXVsdGlwbGUgfCBtdWx0aXBsZX1cbiAgICAgKiBmaWxlIHNlbGVjdGlvbi5cbiAgICAgKi9cbiAgICBpc011bHRpcGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbXVsdGlwbGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjY2VwdCB0aGUgZmlsZSBjaG9vc2VyIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gZmlsZSBwYXRocy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzIFRoaXMgd2lsbCBub3QgdmFsaWRhdGUgd2hldGhlciB0aGUgZmlsZSBwYXRocyBleGlzdHMuIEFsc28sIGlmIGFcbiAgICAgKiBwYXRoIGlzIHJlbGF0aXZlLCB0aGVuIGl0IGlzIHJlc29sdmVkIGFnYWluc3QgdGhlXG4gICAgICoge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19jd2QgfCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5fS5cbiAgICAgKiBGb3IgbG9jYWxzIHNjcmlwdCBjb25uZWN0aW5nIHRvIHJlbW90ZSBjaHJvbWUgZW52aXJvbm1lbnRzLCBwYXRocyBtdXN0IGJlXG4gICAgICogYWJzb2x1dGUuXG4gICAgICovXG4gICAgYXN5bmMgYWNjZXB0KHBhdGhzKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBhY2NlcHQgRmlsZUNob29zZXIgd2hpY2ggaXMgYWxyZWFkeSBoYW5kbGVkIScpO1xuICAgICAgICB0aGlzLiNoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy4jZWxlbWVudC51cGxvYWRGaWxlKC4uLnBhdGhzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBmaWxlIGNob29zZXIgd2l0aG91dCBzZWxlY3RpbmcgYW55IGZpbGVzLlxuICAgICAqL1xuICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNoYW5kbGVkLCAnQ2Fubm90IGNhbmNlbCBGaWxlQ2hvb3NlciB3aGljaCBpcyBhbHJlYWR5IGhhbmRsZWQhJyk7XG4gICAgICAgIHRoaXMuI2hhbmRsZWQgPSB0cnVlO1xuICAgICAgICAvLyBYWFg6IFRoZXNlIGV2ZW50cyBzaG91bGQgY29udmVydGVkIHRvIHRydXN0ZWQgZXZlbnRzLiBQZXJoYXBzIGRvIHRoaXNcbiAgICAgICAgLy8gaW4gYERPTS5zZXRGaWxlSW5wdXRGaWxlc2A/XG4gICAgICAgIGF3YWl0IHRoaXMuI2VsZW1lbnQuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjYW5jZWwnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaWxlQ2hvb3Nlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQVJJQVF1ZXJ5SGFuZGxlciB9IGZyb20gJy4uL2NkcC9BcmlhUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IENTU1F1ZXJ5SGFuZGxlciB9IGZyb20gJy4vQ1NTUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IGN1c3RvbVF1ZXJ5SGFuZGxlcnMgfSBmcm9tICcuL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG5pbXBvcnQgeyBQaWVyY2VRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1BpZXJjZVF1ZXJ5SGFuZGxlci5qcyc7XG5pbXBvcnQgeyBQUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9QUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IHBhcnNlUFNlbGVjdG9ycyB9IGZyb20gJy4vUFNlbGVjdG9yUGFyc2VyLmpzJztcbmltcG9ydCB7IFRleHRRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1RleHRRdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgWFBhdGhRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1hQYXRoUXVlcnlIYW5kbGVyLmpzJztcbmNvbnN0IEJVSUxUSU5fUVVFUllfSEFORExFUlMgPSB7XG4gICAgYXJpYTogQVJJQVF1ZXJ5SGFuZGxlcixcbiAgICBwaWVyY2U6IFBpZXJjZVF1ZXJ5SGFuZGxlcixcbiAgICB4cGF0aDogWFBhdGhRdWVyeUhhbmRsZXIsXG4gICAgdGV4dDogVGV4dFF1ZXJ5SGFuZGxlcixcbn07XG5jb25zdCBRVUVSWV9TRVBBUkFUT1JTID0gWyc9JywgJy8nXTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGZvciAoY29uc3QgaGFuZGxlck1hcCBvZiBbXG4gICAgICAgIGN1c3RvbVF1ZXJ5SGFuZGxlcnMubmFtZXMoKS5tYXAobmFtZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gW25hbWUsIGN1c3RvbVF1ZXJ5SGFuZGxlcnMuZ2V0KG5hbWUpXTtcbiAgICAgICAgfSksXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKEJVSUxUSU5fUVVFUllfSEFORExFUlMpLFxuICAgIF0pIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgUXVlcnlIYW5kbGVyXSBvZiBoYW5kbGVyTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlcGFyYXRvciBvZiBRVUVSWV9TRVBBUkFUT1JTKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gYCR7bmFtZX0ke3NlcGFyYXRvcn1gO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2xsaW5nOiBuYW1lID09PSAnYXJpYScgPyBcInJhZlwiIC8qIFBvbGxpbmdPcHRpb25zLlJBRiAqLyA6IFwibXV0YXRpb25cIiAvKiBQb2xsaW5nT3B0aW9ucy5NVVRBVElPTiAqLyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5SGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgW3BTZWxlY3RvciwgaXNQdXJlQ1NTLCBoYXNQc2V1ZG9DbGFzc2VzLCBoYXNBcmlhXSA9IHBhcnNlUFNlbGVjdG9ycyhzZWxlY3Rvcik7XG4gICAgICAgIGlmIChpc1B1cmVDU1MpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBwb2xsaW5nOiBoYXNQc2V1ZG9DbGFzc2VzXG4gICAgICAgICAgICAgICAgICAgID8gXCJyYWZcIiAvKiBQb2xsaW5nT3B0aW9ucy5SQUYgKi9cbiAgICAgICAgICAgICAgICAgICAgOiBcIm11dGF0aW9uXCIgLyogUG9sbGluZ09wdGlvbnMuTVVUQVRJT04gKi8sXG4gICAgICAgICAgICAgICAgUXVlcnlIYW5kbGVyOiBDU1NRdWVyeUhhbmRsZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1cGRhdGVkU2VsZWN0b3I6IEpTT04uc3RyaW5naWZ5KHBTZWxlY3RvciksXG4gICAgICAgICAgICBwb2xsaW5nOiBoYXNBcmlhID8gXCJyYWZcIiAvKiBQb2xsaW5nT3B0aW9ucy5SQUYgKi8gOiBcIm11dGF0aW9uXCIgLyogUG9sbGluZ09wdGlvbnMuTVVUQVRJT04gKi8sXG4gICAgICAgICAgICBRdWVyeUhhbmRsZXI6IFBRdWVyeUhhbmRsZXIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVwZGF0ZWRTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICBwb2xsaW5nOiBcIm11dGF0aW9uXCIgLyogUG9sbGluZ09wdGlvbnMuTVVUQVRJT04gKi8sXG4gICAgICAgICAgICBRdWVyeUhhbmRsZXI6IENTU1F1ZXJ5SGFuZGxlcixcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HZXRRdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2ssIGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuY29uc3QgREVGQVVMVF9CQVRDSF9TSVpFID0gMjA7XG4vKipcbiAqIFRoaXMgd2lsbCB0cmFuc3Bvc2UgYW4gaXRlcmF0b3IgSlNIYW5kbGUgaW50byBhIGZhc3QsIFB1cHBldGVlci1zaWRlIGl0ZXJhdG9yXG4gKiBvZiBKU0hhbmRsZXMuXG4gKlxuICogQHBhcmFtIHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRyYW5zcG9zZS4gVGhpcyBzaG91bGQgYmUgc29tZXRoaW5nXG4gKiByZWFzb25hYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiogZmFzdFRyYW5zcG9zZUl0ZXJhdG9ySGFuZGxlKGl0ZXJhdG9yLCBzaXplKSB7XG4gICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMSwgYXdhaXQgaXRlcmF0b3IuZXZhbHVhdGVIYW5kbGUoYXN5bmMgKGl0ZXJhdG9yLCBzaXplKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgICAgICAgICB3aGlsZSAocmVzdWx0cy5sZW5ndGggPCBzaXplKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfSwgc2l6ZSksIGZhbHNlKTtcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IChhd2FpdCBhcnJheS5nZXRQcm9wZXJ0aWVzKCkpO1xuICAgICAgICBjb25zdCBoYW5kbGVzID0gcHJvcGVydGllcy52YWx1ZXMoKTtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMSwgbmV3IERpc3Bvc2FibGVTdGFjaygpLCBmYWxzZSk7XG4gICAgICAgIHN0YWNrLmRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlXzEgb2YgaGFuZGxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8yLCBoYW5kbGVfMSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVbZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgICAgICAgICBlbnZfMi5lcnJvciA9IGVfMjtcbiAgICAgICAgICAgICAgICAgICAgZW52XzIuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB5aWVsZCogaGFuZGxlcztcbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuc2l6ZSA9PT0gMDtcbiAgICB9XG4gICAgY2F0Y2ggKGVfMSkge1xuICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgZW52XzEuaGFzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8xKTtcbiAgICB9XG59XG4vKipcbiAqIFRoaXMgd2lsbCB0cmFuc3Bvc2UgYW4gaXRlcmF0b3IgSlNIYW5kbGUgaW4gYmF0Y2hlcyBiYXNlZCBvbiB0aGUgZGVmYXVsdCBzaXplXG4gKiBvZiB7QGxpbmsgZmFzdFRyYW5zcG9zZUl0ZXJhdG9ySGFuZGxlfS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24qIHRyYW5zcG9zZUl0ZXJhdG9ySGFuZGxlKGl0ZXJhdG9yKSB7XG4gICAgbGV0IHNpemUgPSBERUZBVUxUX0JBVENIX1NJWkU7XG4gICAgd2hpbGUgKCEoeWllbGQqIGZhc3RUcmFuc3Bvc2VJdGVyYXRvckhhbmRsZShpdGVyYXRvciwgc2l6ZSkpKSB7XG4gICAgICAgIHNpemUgPDw9IDE7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uKiB0cmFuc3Bvc2VJdGVyYWJsZUhhbmRsZShoYW5kbGUpIHtcbiAgICBjb25zdCBlbnZfMyA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBnZW5lcmF0b3JIYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMywgYXdhaXQgaGFuZGxlLmV2YWx1YXRlSGFuZGxlKGl0ZXJhYmxlID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoYXN5bmMgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogaXRlcmFibGU7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9KSwgZmFsc2UpO1xuICAgICAgICB5aWVsZCogdHJhbnNwb3NlSXRlcmF0b3JIYW5kbGUoZ2VuZXJhdG9ySGFuZGxlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVfMykge1xuICAgICAgICBlbnZfMy5lcnJvciA9IGVfMztcbiAgICAgICAgZW52XzMuaGFzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8zKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1IYW5kbGVJdGVyYXRvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIExhenlBcmcge1xuICAgIHN0YXRpYyBjcmVhdGUgPSAoZ2V0KSA9PiB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gaW50cm9kdWNlIExhenlBcmcgdG8gdGhlIHR5cGUgc3lzdGVtLCBvdGhlcndpc2Ugd2Ugd291bGRcbiAgICAgICAgLy8gaGF2ZSB0byBtYWtlIGl0IHB1YmxpYy5cbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5QXJnKGdldCk7XG4gICAgfTtcbiAgICAjZ2V0O1xuICAgIGNvbnN0cnVjdG9yKGdldCkge1xuICAgICAgICB0aGlzLiNnZXQgPSBnZXQ7XG4gICAgfVxuICAgIGFzeW5jIGdldChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNnZXQoY29udGV4dCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGF6eUFyZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBXZSB1c2Ugc3ltYm9scyB0byBwcmV2ZW50IGFueSBleHRlcm5hbCBwYXJ0aWVzIGxpc3RlbmluZyB0byB0aGVzZSBldmVudHMuXG4gKiBUaGV5IGFyZSBpbnRlcm5hbCB0byBQdXBwZXRlZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIE5ldHdvcmtNYW5hZ2VyRXZlbnQ7XG4oZnVuY3Rpb24gKE5ldHdvcmtNYW5hZ2VyRXZlbnQpIHtcbiAgICBOZXR3b3JrTWFuYWdlckV2ZW50LlJlcXVlc3QgPSBTeW1ib2woJ05ldHdvcmtNYW5hZ2VyLlJlcXVlc3QnKTtcbiAgICBOZXR3b3JrTWFuYWdlckV2ZW50LlJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUgPSBTeW1ib2woJ05ldHdvcmtNYW5hZ2VyLlJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUnKTtcbiAgICBOZXR3b3JrTWFuYWdlckV2ZW50LlJlc3BvbnNlID0gU3ltYm9sKCdOZXR3b3JrTWFuYWdlci5SZXNwb25zZScpO1xuICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdEZhaWxlZCA9IFN5bWJvbCgnTmV0d29ya01hbmFnZXIuUmVxdWVzdEZhaWxlZCcpO1xuICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdEZpbmlzaGVkID0gU3ltYm9sKCdOZXR3b3JrTWFuYWdlci5SZXF1ZXN0RmluaXNoZWQnKTtcbn0pKE5ldHdvcmtNYW5hZ2VyRXZlbnQgfHwgKE5ldHdvcmtNYW5hZ2VyRXZlbnQgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmV0d29ya01hbmFnZXJFdmVudHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBwYXBlckZvcm1hdHMgPSB7XG4gICAgbGV0dGVyOiB7IHdpZHRoOiA4LjUsIGhlaWdodDogMTEgfSxcbiAgICBsZWdhbDogeyB3aWR0aDogOC41LCBoZWlnaHQ6IDE0IH0sXG4gICAgdGFibG9pZDogeyB3aWR0aDogMTEsIGhlaWdodDogMTcgfSxcbiAgICBsZWRnZXI6IHsgd2lkdGg6IDE3LCBoZWlnaHQ6IDExIH0sXG4gICAgYTA6IHsgd2lkdGg6IDMzLjEsIGhlaWdodDogNDYuOCB9LFxuICAgIGExOiB7IHdpZHRoOiAyMy40LCBoZWlnaHQ6IDMzLjEgfSxcbiAgICBhMjogeyB3aWR0aDogMTYuNTQsIGhlaWdodDogMjMuNCB9LFxuICAgIGEzOiB7IHdpZHRoOiAxMS43LCBoZWlnaHQ6IDE2LjU0IH0sXG4gICAgYTQ6IHsgd2lkdGg6IDguMjcsIGhlaWdodDogMTEuNyB9LFxuICAgIGE1OiB7IHdpZHRoOiA1LjgzLCBoZWlnaHQ6IDguMjcgfSxcbiAgICBhNjogeyB3aWR0aDogNC4xMywgaGVpZ2h0OiA1LjgzIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT3B0aW9ucy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyLCB9IGZyb20gJy4vUXVlcnlIYW5kbGVyLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBQUXVlcnlIYW5kbGVyIGV4dGVuZHMgUXVlcnlIYW5kbGVyIHtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvckFsbCA9IChlbGVtZW50LCBzZWxlY3RvciwgeyBwUXVlcnlTZWxlY3RvckFsbCB9KSA9PiB7XG4gICAgICAgIHJldHVybiBwUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvciA9IChlbGVtZW50LCBzZWxlY3RvciwgeyBwUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBwUXVlcnlTZWxlY3RvcihlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBRdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IHRva2VuaXplLCBUT0tFTlMsIHN0cmluZ2lmeSwgfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9wYXJzZWwtanMvcGFyc2VsLWpzLmpzJztcblRPS0VOU1snbmVzdGluZyddID0gLyYvZztcblRPS0VOU1snY29tYmluYXRvciddID0gL1xccyooPj4+Pj98W1xccz4rfl0pXFxzKi9nO1xuY29uc3QgRVNDQVBFX1JFR0VYUCA9IC9cXFxcW1xcc1xcU10vZztcbmNvbnN0IHVucXVvdGUgPSAodGV4dCkgPT4ge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBpZiAoKHRleHRbMF0gPT09ICdcIicgfHwgdGV4dFswXSA9PT0gXCInXCIpICYmIHRleHQuZW5kc1dpdGgodGV4dFswXSkpIHtcbiAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMSwgLTEpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKEVTQ0FQRV9SRUdFWFAsIG1hdGNoID0+IHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdO1xuICAgIH0pO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBTZWxlY3RvcnMoc2VsZWN0b3IpIHtcbiAgICBsZXQgaXNQdXJlQ1NTID0gdHJ1ZTtcbiAgICBsZXQgaGFzQXJpYSA9IGZhbHNlO1xuICAgIGxldCBoYXNQc2V1ZG9DbGFzc2VzID0gZmFsc2U7XG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemUoc2VsZWN0b3IpO1xuICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbW10sIGlzUHVyZUNTUywgaGFzUHNldWRvQ2xhc3NlcywgZmFsc2VdO1xuICAgIH1cbiAgICBsZXQgY29tcG91bmRTZWxlY3RvciA9IFtdO1xuICAgIGxldCBjb21wbGV4U2VsZWN0b3IgPSBbY29tcG91bmRTZWxlY3Rvcl07XG4gICAgY29uc3Qgc2VsZWN0b3JzID0gW2NvbXBsZXhTZWxlY3Rvcl07XG4gICAgY29uc3Qgc3RvcmFnZSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY29tYmluYXRvcic6XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbi5jb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCI+Pj5cIiAvKiBQQ29tYmluYXRvci5EZXNjZW5kZW50ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQdXJlQ1NTID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3VuZFNlbGVjdG9yLnB1c2goc3RyaW5naWZ5KHN0b3JhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNwbGljZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kU2VsZWN0b3IgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZWxlY3Rvci5wdXNoKFwiPj4+XCIgLyogUENvbWJpbmF0b3IuRGVzY2VuZGVudCAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4U2VsZWN0b3IucHVzaChjb21wb3VuZFNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPj4+PlwiIC8qIFBDb21iaW5hdG9yLkNoaWxkICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQdXJlQ1NTID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3VuZFNlbGVjdG9yLnB1c2goc3RyaW5naWZ5KHN0b3JhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNwbGljZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kU2VsZWN0b3IgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZWxlY3Rvci5wdXNoKFwiPj4+PlwiIC8qIFBDb21iaW5hdG9yLkNoaWxkICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZWxlY3Rvci5wdXNoKGNvbXBvdW5kU2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHNldWRvLWVsZW1lbnQnOlxuICAgICAgICAgICAgICAgIGlmICghdG9rZW4ubmFtZS5zdGFydHNXaXRoKCctcC0nKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNQdXJlQ1NTID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JhZ2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kU2VsZWN0b3IucHVzaChzdHJpbmdpZnkoc3RvcmFnZSkpO1xuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNwbGljZSgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRva2VuLm5hbWUuc2xpY2UoMyk7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdhcmlhJykge1xuICAgICAgICAgICAgICAgICAgICBoYXNBcmlhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcG91bmRTZWxlY3Rvci5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVucXVvdGUodG9rZW4uYXJndW1lbnQgPz8gJycpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgY2FzZSAncHNldWRvLWNsYXNzJzpcbiAgICAgICAgICAgICAgICBoYXNQc2V1ZG9DbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmRTZWxlY3Rvci5wdXNoKHN0cmluZ2lmeShzdG9yYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2Uuc3BsaWNlKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wb3VuZFNlbGVjdG9yID0gW107XG4gICAgICAgICAgICAgICAgY29tcGxleFNlbGVjdG9yID0gW2NvbXBvdW5kU2VsZWN0b3JdO1xuICAgICAgICAgICAgICAgIHNlbGVjdG9ycy5wdXNoKGNvbXBsZXhTZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmFnZS5wdXNoKHRva2VuKTtcbiAgICB9XG4gICAgaWYgKHN0b3JhZ2UubGVuZ3RoKSB7XG4gICAgICAgIGNvbXBvdW5kU2VsZWN0b3IucHVzaChzdHJpbmdpZnkoc3RvcmFnZSkpO1xuICAgIH1cbiAgICByZXR1cm4gW3NlbGVjdG9ycywgaXNQdXJlQ1NTLCBoYXNQc2V1ZG9DbGFzc2VzLCBoYXNBcmlhXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBTZWxlY3RvclBhcnNlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9RdWVyeUhhbmRsZXIuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBpZXJjZVF1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3IgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgcGllcmNlUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBwaWVyY2VRdWVyeVNlbGVjdG9yKGVsZW1lbnQsIHNlbGVjdG9yKTtcbiAgICB9O1xuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yQWxsID0gKGVsZW1lbnQsIHNlbGVjdG9yLCB7IHBpZXJjZVF1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICByZXR1cm4gcGllcmNlUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBpZXJjZVF1ZXJ5SGFuZGxlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvZHVjdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgX2Nvbm5lY3RUb0Jyb3dzZXIgfSBmcm9tICcuL0Jyb3dzZXJDb25uZWN0b3IuanMnO1xuaW1wb3J0IHsgY3VzdG9tUXVlcnlIYW5kbGVycywgfSBmcm9tICcuL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG4vKipcbiAqIFRoZSBtYWluIFB1cHBldGVlciBjbGFzcy5cbiAqXG4gKiBJTVBPUlRBTlQ6IGlmIHlvdSBhcmUgdXNpbmcgUHVwcGV0ZWVyIGluIGEgTm9kZSBlbnZpcm9ubWVudCwgeW91IHdpbGwgZ2V0IGFuXG4gKiBpbnN0YW5jZSBvZiB7QGxpbmsgUHVwcGV0ZWVyTm9kZX0gd2hlbiB5b3UgaW1wb3J0IG9yIHJlcXVpcmUgYHB1cHBldGVlcmAuXG4gKiBUaGF0IGNsYXNzIGV4dGVuZHMgYFB1cHBldGVlcmAsIHNvIGhhcyBhbGwgdGhlIG1ldGhvZHMgZG9jdW1lbnRlZCBiZWxvdyBhc1xuICogd2VsbCBhcyBhbGwgdGhhdCBhcmUgZGVmaW5lZCBvbiB7QGxpbmsgUHVwcGV0ZWVyTm9kZX0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUHVwcGV0ZWVyIHtcbiAgICAvKipcbiAgICAgKiBPcGVyYXRpb25zIGZvciB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJzfS4gU2VlXG4gICAgICoge0BsaW5rIEN1c3RvbVF1ZXJ5SGFuZGxlclJlZ2lzdHJ5fS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBjdXN0b21RdWVyeUhhbmRsZXJzID0gY3VzdG9tUXVlcnlIYW5kbGVycztcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBZnRlciByZWdpc3RyYXRpb24sIHRoZSBoYW5kbGVyIGNhbiBiZSB1c2VkIGV2ZXJ5d2hlcmUgd2hlcmUgYSBzZWxlY3RvciBpc1xuICAgICAqIGV4cGVjdGVkIGJ5IHByZXBlbmRpbmcgdGhlIHNlbGVjdGlvbiBzdHJpbmcgd2l0aCBgPG5hbWU+L2AuIFRoZSBuYW1lIGlzIG9ubHlcbiAgICAgKiBhbGxvd2VkIHRvIGNvbnNpc3Qgb2YgbG93ZXItIGFuZCB1cHBlciBjYXNlIGxhdGluIGxldHRlcnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogcHVwcGV0ZWVyLnJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyKCd0ZXh0JywgeyDigKYgfSk7XG4gICAgICogY29uc3QgYUhhbmRsZSA9IGF3YWl0IHBhZ2UuJCgndGV4dC/igKYnKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgdGhhdCB0aGUgY3VzdG9tIHF1ZXJ5IGhhbmRsZXIgd2lsbCBiZSByZWdpc3RlcmVkXG4gICAgICogdW5kZXIuXG4gICAgICogQHBhcmFtIHF1ZXJ5SGFuZGxlciAtIFRoZSB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJ9XG4gICAgICogdG8gcmVnaXN0ZXIuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyKG5hbWUsIHF1ZXJ5SGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKG5hbWUsIHF1ZXJ5SGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIHF1ZXJ5IGhhbmRsZXIgZm9yIGEgZ2l2ZW4gbmFtZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdW5yZWdpc3RlckN1c3RvbVF1ZXJ5SGFuZGxlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVF1ZXJ5SGFuZGxlcnMudW5yZWdpc3RlcihuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIGN1c3RvbSBxdWVyeSBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3VzdG9tUXVlcnlIYW5kbGVyTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVF1ZXJ5SGFuZGxlcnMubmFtZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgYWxsIGN1c3RvbSBxdWVyeSBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBzdGF0aWMgY2xlYXJDdXN0b21RdWVyeUhhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21RdWVyeUhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9pc1B1cHBldGVlckNvcmU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2NoYW5nZWRQcm9kdWN0ID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5faXNQdXBwZXRlZXJDb3JlID0gc2V0dGluZ3MuaXNQdXBwZXRlZXJDb3JlO1xuICAgICAgICB0aGlzLmNvbm5lY3QgPSB0aGlzLmNvbm5lY3QuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgYXR0YWNoZXMgUHVwcGV0ZWVyIHRvIGFuIGV4aXN0aW5nIGJyb3dzZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTZXQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMgdG8gc2V0IG9uIHRoZSBicm93c2VyLlxuICAgICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gYnJvd3NlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25uZWN0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9jb25uZWN0VG9Ccm93c2VyKG9wdGlvbnMpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVB1cHBldGVlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbmltcG9ydCB7IF9pc0VsZW1lbnRIYW5kbGUgfSBmcm9tICcuLi9hcGkvRWxlbWVudEhhbmRsZVN5bWJvbC5qcyc7XG5pbXBvcnQgeyBpc0Vycm9yTGlrZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IGludGVycG9sYXRlRnVuY3Rpb24sIHN0cmluZ2lmeUZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbC9GdW5jdGlvbi5qcyc7XG5pbXBvcnQgeyB0cmFuc3Bvc2VJdGVyYWJsZUhhbmRsZSB9IGZyb20gJy4vSGFuZGxlSXRlcmF0b3IuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4vTGF6eUFyZy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgUXVlcnlIYW5kbGVyIHtcbiAgICAvLyBFaXRoZXIgb25lIG9mIHRoZXNlIG1heSBiZSBpbXBsZW1lbnRlZCwgYnV0IGF0IGxlYXN0IG9uZSBtdXN0IGJlLlxuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yQWxsO1xuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yO1xuICAgIHN0YXRpYyBnZXQgX3F1ZXJ5U2VsZWN0b3IoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5U2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBkZWZhdWx0IGBxdWVyeVNlbGVjdG9yYC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMucXVlcnlTZWxlY3RvciA9IGludGVycG9sYXRlRnVuY3Rpb24oYXN5bmMgKG5vZGUsIHNlbGVjdG9yLCBQdXBwZXRlZXJVdGlsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVNlbGVjdG9yQWxsID0gUExBQ0VIT0xERVIoJ3F1ZXJ5U2VsZWN0b3JBbGwnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBxdWVyeVNlbGVjdG9yQWxsKG5vZGUsIHNlbGVjdG9yLCBQdXBwZXRlZXJVdGlsKTtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHF1ZXJ5U2VsZWN0b3JBbGw6IHN0cmluZ2lmeUZ1bmN0aW9uKHRoaXMucXVlcnlTZWxlY3RvckFsbCksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBfcXVlcnlTZWxlY3RvckFsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucXVlcnlTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGRlZmF1bHQgYHF1ZXJ5U2VsZWN0b3JBbGxgLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodGhpcy5xdWVyeVNlbGVjdG9yQWxsID0gaW50ZXJwb2xhdGVGdW5jdGlvbihhc3luYyBmdW5jdGlvbiogKG5vZGUsIHNlbGVjdG9yLCBQdXBwZXRlZXJVdGlsKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVNlbGVjdG9yID0gUExBQ0VIT0xERVIoJ3F1ZXJ5U2VsZWN0b3InKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5U2VsZWN0b3Iobm9kZSwgc2VsZWN0b3IsIFB1cHBldGVlclV0aWwpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgcXVlcnlTZWxlY3Rvcjogc3RyaW5naWZ5RnVuY3Rpb24odGhpcy5xdWVyeVNlbGVjdG9yKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIGZvciBtdWx0aXBsZSBub2RlcyBnaXZlbiBhIHNlbGVjdG9yIGFuZCB7QGxpbmsgRWxlbWVudEhhbmRsZX0uXG4gICAgICpcbiAgICAgKiBBa2luIHRvIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvcXVlcnlTZWxlY3RvckFsbCB8IERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoKX0uXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jICpxdWVyeUFsbChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICBjb25zdCBlbnZfMSA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBhd2FpdCBlbGVtZW50LmV2YWx1YXRlSGFuZGxlKHRoaXMuX3F1ZXJ5U2VsZWN0b3JBbGwsIHNlbGVjdG9yLCBMYXp5QXJnLmNyZWF0ZShjb250ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgfSkpLCBmYWxzZSk7XG4gICAgICAgICAgICB5aWVsZCogdHJhbnNwb3NlSXRlcmFibGVIYW5kbGUoaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUXVlcmllcyBmb3IgYSBzaW5nbGUgbm9kZSBnaXZlbiBhIHNlbGVjdG9yIGFuZCB7QGxpbmsgRWxlbWVudEhhbmRsZX0uXG4gICAgICpcbiAgICAgKiBBa2luIHRvIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvcXVlcnlTZWxlY3Rvcn0uXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHF1ZXJ5T25lKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzIsIGF3YWl0IGVsZW1lbnQuZXZhbHVhdGVIYW5kbGUodGhpcy5fcXVlcnlTZWxlY3Rvciwgc2VsZWN0b3IsIExhenlBcmcuY3JlYXRlKGNvbnRleHQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnB1cHBldGVlclV0aWw7XG4gICAgICAgICAgICB9KSksIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghKF9pc0VsZW1lbnRIYW5kbGUgaW4gcmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzI7XG4gICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdhaXRzIHVudGlsIGEgc2luZ2xlIG5vZGUgYXBwZWFycyBmb3IgYSBnaXZlbiBzZWxlY3RvciBhbmRcbiAgICAgKiB7QGxpbmsgRWxlbWVudEhhbmRsZX0uXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIHF1ZXJ5IHRoZSBoYW5kbGUgaW4gdGhlIFB1cHBldGVlciB3b3JsZCBhbmQgbWlncmF0ZSB0aGVcbiAgICAgKiByZXN1bHQgdG8gdGhlIG1haW4gd29ybGQuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHdhaXRGb3IoZWxlbWVudE9yRnJhbWUsIHNlbGVjdG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGZyYW1lO1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8zLCBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKF9pc0VsZW1lbnRIYW5kbGUgaW4gZWxlbWVudE9yRnJhbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyYW1lID0gZWxlbWVudE9yRnJhbWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnJhbWUgPSBlbGVtZW50T3JGcmFtZS5mcmFtZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZnJhbWUuaXNvbGF0ZWRSZWFsbSgpLmFkb3B0SGFuZGxlKGVsZW1lbnRPckZyYW1lKTtcbiAgICAgICAgICAgIH0pKCksIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmlzaWJsZSA9IGZhbHNlLCBoaWRkZW4gPSBmYWxzZSwgdGltZW91dCwgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgcG9sbGluZyA9IG9wdGlvbnMucG9sbGluZyA/P1xuICAgICAgICAgICAgICAgICh2aXNpYmxlIHx8IGhpZGRlbiA/IFwicmFmXCIgLyogUG9sbGluZ09wdGlvbnMuUkFGICovIDogXCJtdXRhdGlvblwiIC8qIFBvbGxpbmdPcHRpb25zLk1VVEFUSU9OICovKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52XzQgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfNCwgYXdhaXQgZnJhbWUuaXNvbGF0ZWRSZWFsbSgpLndhaXRGb3JGdW5jdGlvbihhc3luYyAoUHVwcGV0ZWVyVXRpbCwgcXVlcnksIHNlbGVjdG9yLCByb290LCB2aXNpYmxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVNlbGVjdG9yID0gUHVwcGV0ZWVyVXRpbC5jcmVhdGVGdW5jdGlvbihxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gYXdhaXQgcXVlcnlTZWxlY3Rvcihyb290ID8/IGRvY3VtZW50LCBzZWxlY3RvciwgUHVwcGV0ZWVyVXRpbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHVwcGV0ZWVyVXRpbC5jaGVja1Zpc2liaWxpdHkobm9kZSwgdmlzaWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvbGxpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICByb290OiBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgfSwgTGF6eUFyZy5jcmVhdGUoY29udGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgICAgICAgICB9KSwgc3RyaW5naWZ5RnVuY3Rpb24odGhpcy5fcXVlcnlTZWxlY3RvciksIHNlbGVjdG9yLCBlbGVtZW50LCB2aXNpYmxlID8gdHJ1ZSA6IGhpZGRlbiA/IGZhbHNlIDogdW5kZWZpbmVkKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzaWduYWwucmVhc29uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghKF9pc0VsZW1lbnRIYW5kbGUgaW4gaGFuZGxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZyYW1lLm1haW5SZWFsbSgpLnRyYW5zZmVySGFuZGxlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzMpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52XzQuZXJyb3IgPSBlXzM7XG4gICAgICAgICAgICAgICAgICAgIGVudl80Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0Vycm9yTGlrZShlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPSBgV2FpdGluZyBmb3Igc2VsZWN0b3IgXFxgJHtzZWxlY3Rvcn1cXGAgZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV80KSB7XG4gICAgICAgICAgICBlbnZfMy5lcnJvciA9IGVfNDtcbiAgICAgICAgICAgIGVudl8zLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjQgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IHNvdXJjZSBhcyBpbmplY3RlZFNvdXJjZSB9IGZyb20gJy4uL2dlbmVyYXRlZC9pbmplY3RlZC5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgU2NyaXB0SW5qZWN0b3Ige1xuICAgICN1cGRhdGVkID0gZmFsc2U7XG4gICAgI2FtZW5kbWVudHMgPSBuZXcgU2V0KCk7XG4gICAgLy8gQXBwZW5kcyBhIHN0YXRlbWVudCBvZiB0aGUgZm9ybSBgKFB1cHBldGVlclV0aWwpID0+IHsuLi59YC5cbiAgICBhcHBlbmQoc3RhdGVtZW50KSB7XG4gICAgICAgIHRoaXMuI3VwZGF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNhbWVuZG1lbnRzLmFkZChzdGF0ZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9wKHN0YXRlbWVudCkge1xuICAgICAgICB0aGlzLiN1cGRhdGUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jYW1lbmRtZW50cy5kZWxldGUoc3RhdGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGluamVjdChpbmplY3QsIGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuI3VwZGF0ZWQgfHwgZm9yY2UpIHtcbiAgICAgICAgICAgIGluamVjdCh0aGlzLiNnZXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jdXBkYXRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAjdXBkYXRlKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuI3VwZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICAjZ2V0KCkge1xuICAgICAgICByZXR1cm4gYCgoKSA9PiB7XG4gICAgICBjb25zdCBtb2R1bGUgPSB7fTtcbiAgICAgICR7aW5qZWN0ZWRTb3VyY2V9XG4gICAgICAke1suLi50aGlzLiNhbWVuZG1lbnRzXVxuICAgICAgICAgICAgLm1hcChzdGF0ZW1lbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAoJHtzdGF0ZW1lbnR9KShtb2R1bGUuZXhwb3J0cy5kZWZhdWx0KTtgO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJycpfVxuICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzLmRlZmF1bHQ7XG4gICAgfSkoKWA7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHNjcmlwdEluamVjdG9yID0gbmV3IFNjcmlwdEluamVjdG9yKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY3JpcHRJbmplY3Rvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgU2VjdXJpdHlEZXRhaWxzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHNlY3VyaXR5IGRldGFpbHMgb2YgYVxuICogcmVzcG9uc2UgdGhhdCB3YXMgcmVjZWl2ZWQgb3ZlciBhIHNlY3VyZSBjb25uZWN0aW9uLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3VyaXR5RGV0YWlscyB7XG4gICAgI3N1YmplY3ROYW1lO1xuICAgICNpc3N1ZXI7XG4gICAgI3ZhbGlkRnJvbTtcbiAgICAjdmFsaWRUbztcbiAgICAjcHJvdG9jb2w7XG4gICAgI3Nhbkxpc3Q7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2VjdXJpdHlQYXlsb2FkKSB7XG4gICAgICAgIHRoaXMuI3N1YmplY3ROYW1lID0gc2VjdXJpdHlQYXlsb2FkLnN1YmplY3ROYW1lO1xuICAgICAgICB0aGlzLiNpc3N1ZXIgPSBzZWN1cml0eVBheWxvYWQuaXNzdWVyO1xuICAgICAgICB0aGlzLiN2YWxpZEZyb20gPSBzZWN1cml0eVBheWxvYWQudmFsaWRGcm9tO1xuICAgICAgICB0aGlzLiN2YWxpZFRvID0gc2VjdXJpdHlQYXlsb2FkLnZhbGlkVG87XG4gICAgICAgIHRoaXMuI3Byb3RvY29sID0gc2VjdXJpdHlQYXlsb2FkLnByb3RvY29sO1xuICAgICAgICB0aGlzLiNzYW5MaXN0ID0gc2VjdXJpdHlQYXlsb2FkLnNhbkxpc3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpc3N1ZXIgb2YgdGhlIGNlcnRpZmljYXRlLlxuICAgICAqL1xuICAgIGlzc3VlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzc3VlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfdGltZSB8IFVuaXggdGltZXN0YW1wfVxuICAgICAqIG1hcmtpbmcgdGhlIHN0YXJ0IG9mIHRoZSBjZXJ0aWZpY2F0ZSdzIHZhbGlkaXR5LlxuICAgICAqL1xuICAgIHZhbGlkRnJvbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3ZhbGlkRnJvbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfdGltZSB8IFVuaXggdGltZXN0YW1wfVxuICAgICAqIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgY2VydGlmaWNhdGUncyB2YWxpZGl0eS5cbiAgICAgKi9cbiAgICB2YWxpZFRvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdmFsaWRUbztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHByb3RvY29sIGJlaW5nIHVzZWQsIGUuZy4gXCJUTFMgMS4yXCIuXG4gICAgICovXG4gICAgcHJvdG9jb2woKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm90b2NvbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QgdG8gd2hpY2ggdGhlIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQuXG4gICAgICovXG4gICAgc3ViamVjdE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdWJqZWN0TmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2Yge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N1YmplY3RfQWx0ZXJuYXRpdmVfTmFtZSB8IHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZXMgKFNBTnMpfSBvZiB0aGUgY2VydGlmaWNhdGUuXG4gICAgICovXG4gICAgc3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzYW5MaXN0O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNlY3VyaXR5RGV0YWlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tRdWV1ZSB7XG4gICAgI2NoYWluO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLiNjaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBwb3N0VGFzayh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI2NoYWluLnRoZW4odGFzayk7XG4gICAgICAgIHRoaXMuI2NoYWluID0gcmVzdWx0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFza1F1ZXVlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1F1ZXJ5SGFuZGxlci5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgVGV4dFF1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JBbGwgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgdGV4dFF1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICByZXR1cm4gdGV4dFF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UZXh0UXVlcnlIYW5kbGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSAzMDAwMDtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lb3V0U2V0dGluZ3Mge1xuICAgICNkZWZhdWx0VGltZW91dDtcbiAgICAjZGVmYXVsdE5hdmlnYXRpb25UaW1lb3V0O1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0VGltZW91dCA9IG51bGw7XG4gICAgICAgIHRoaXMuI2RlZmF1bHROYXZpZ2F0aW9uVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIHNldERlZmF1bHRUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy4jZGVmYXVsdFRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIH1cbiAgICBzZXREZWZhdWx0TmF2aWdhdGlvblRpbWVvdXQodGltZW91dCkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0TmF2aWdhdGlvblRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIH1cbiAgICBuYXZpZ2F0aW9uVGltZW91dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RlZmF1bHROYXZpZ2F0aW9uVGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHROYXZpZ2F0aW9uVGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jZGVmYXVsdFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0VGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gREVGQVVMVF9USU1FT1VUO1xuICAgIH1cbiAgICB0aW1lb3V0KCkge1xuICAgICAgICBpZiAodGhpcy4jZGVmYXVsdFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0VGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gREVGQVVMVF9USU1FT1VUO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRpbWVvdXRTZXR0aW5ncy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IF9rZXlEZWZpbml0aW9ucyA9IHtcbiAgICAnMCc6IHsga2V5Q29kZTogNDgsIGtleTogJzAnLCBjb2RlOiAnRGlnaXQwJyB9LFxuICAgICcxJzogeyBrZXlDb2RlOiA0OSwga2V5OiAnMScsIGNvZGU6ICdEaWdpdDEnIH0sXG4gICAgJzInOiB7IGtleUNvZGU6IDUwLCBrZXk6ICcyJywgY29kZTogJ0RpZ2l0MicgfSxcbiAgICAnMyc6IHsga2V5Q29kZTogNTEsIGtleTogJzMnLCBjb2RlOiAnRGlnaXQzJyB9LFxuICAgICc0JzogeyBrZXlDb2RlOiA1Miwga2V5OiAnNCcsIGNvZGU6ICdEaWdpdDQnIH0sXG4gICAgJzUnOiB7IGtleUNvZGU6IDUzLCBrZXk6ICc1JywgY29kZTogJ0RpZ2l0NScgfSxcbiAgICAnNic6IHsga2V5Q29kZTogNTQsIGtleTogJzYnLCBjb2RlOiAnRGlnaXQ2JyB9LFxuICAgICc3JzogeyBrZXlDb2RlOiA1NSwga2V5OiAnNycsIGNvZGU6ICdEaWdpdDcnIH0sXG4gICAgJzgnOiB7IGtleUNvZGU6IDU2LCBrZXk6ICc4JywgY29kZTogJ0RpZ2l0OCcgfSxcbiAgICAnOSc6IHsga2V5Q29kZTogNTcsIGtleTogJzknLCBjb2RlOiAnRGlnaXQ5JyB9LFxuICAgIFBvd2VyOiB7IGtleTogJ1Bvd2VyJywgY29kZTogJ1Bvd2VyJyB9LFxuICAgIEVqZWN0OiB7IGtleTogJ0VqZWN0JywgY29kZTogJ0VqZWN0JyB9LFxuICAgIEFib3J0OiB7IGtleUNvZGU6IDMsIGNvZGU6ICdBYm9ydCcsIGtleTogJ0NhbmNlbCcgfSxcbiAgICBIZWxwOiB7IGtleUNvZGU6IDYsIGNvZGU6ICdIZWxwJywga2V5OiAnSGVscCcgfSxcbiAgICBCYWNrc3BhY2U6IHsga2V5Q29kZTogOCwgY29kZTogJ0JhY2tzcGFjZScsIGtleTogJ0JhY2tzcGFjZScgfSxcbiAgICBUYWI6IHsga2V5Q29kZTogOSwgY29kZTogJ1RhYicsIGtleTogJ1RhYicgfSxcbiAgICBOdW1wYWQ1OiB7XG4gICAgICAgIGtleUNvZGU6IDEyLFxuICAgICAgICBzaGlmdEtleUNvZGU6IDEwMSxcbiAgICAgICAga2V5OiAnQ2xlYXInLFxuICAgICAgICBjb2RlOiAnTnVtcGFkNScsXG4gICAgICAgIHNoaWZ0S2V5OiAnNScsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkRW50ZXI6IHtcbiAgICAgICAga2V5Q29kZTogMTMsXG4gICAgICAgIGNvZGU6ICdOdW1wYWRFbnRlcicsXG4gICAgICAgIGtleTogJ0VudGVyJyxcbiAgICAgICAgdGV4dDogJ1xccicsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgRW50ZXI6IHsga2V5Q29kZTogMTMsIGNvZGU6ICdFbnRlcicsIGtleTogJ0VudGVyJywgdGV4dDogJ1xccicgfSxcbiAgICAnXFxyJzogeyBrZXlDb2RlOiAxMywgY29kZTogJ0VudGVyJywga2V5OiAnRW50ZXInLCB0ZXh0OiAnXFxyJyB9LFxuICAgICdcXG4nOiB7IGtleUNvZGU6IDEzLCBjb2RlOiAnRW50ZXInLCBrZXk6ICdFbnRlcicsIHRleHQ6ICdcXHInIH0sXG4gICAgU2hpZnRMZWZ0OiB7IGtleUNvZGU6IDE2LCBjb2RlOiAnU2hpZnRMZWZ0Jywga2V5OiAnU2hpZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIFNoaWZ0UmlnaHQ6IHsga2V5Q29kZTogMTYsIGNvZGU6ICdTaGlmdFJpZ2h0Jywga2V5OiAnU2hpZnQnLCBsb2NhdGlvbjogMiB9LFxuICAgIENvbnRyb2xMZWZ0OiB7XG4gICAgICAgIGtleUNvZGU6IDE3LFxuICAgICAgICBjb2RlOiAnQ29udHJvbExlZnQnLFxuICAgICAgICBrZXk6ICdDb250cm9sJyxcbiAgICAgICAgbG9jYXRpb246IDEsXG4gICAgfSxcbiAgICBDb250cm9sUmlnaHQ6IHtcbiAgICAgICAga2V5Q29kZTogMTcsXG4gICAgICAgIGNvZGU6ICdDb250cm9sUmlnaHQnLFxuICAgICAgICBrZXk6ICdDb250cm9sJyxcbiAgICAgICAgbG9jYXRpb246IDIsXG4gICAgfSxcbiAgICBBbHRMZWZ0OiB7IGtleUNvZGU6IDE4LCBjb2RlOiAnQWx0TGVmdCcsIGtleTogJ0FsdCcsIGxvY2F0aW9uOiAxIH0sXG4gICAgQWx0UmlnaHQ6IHsga2V5Q29kZTogMTgsIGNvZGU6ICdBbHRSaWdodCcsIGtleTogJ0FsdCcsIGxvY2F0aW9uOiAyIH0sXG4gICAgUGF1c2U6IHsga2V5Q29kZTogMTksIGNvZGU6ICdQYXVzZScsIGtleTogJ1BhdXNlJyB9LFxuICAgIENhcHNMb2NrOiB7IGtleUNvZGU6IDIwLCBjb2RlOiAnQ2Fwc0xvY2snLCBrZXk6ICdDYXBzTG9jaycgfSxcbiAgICBFc2NhcGU6IHsga2V5Q29kZTogMjcsIGNvZGU6ICdFc2NhcGUnLCBrZXk6ICdFc2NhcGUnIH0sXG4gICAgQ29udmVydDogeyBrZXlDb2RlOiAyOCwgY29kZTogJ0NvbnZlcnQnLCBrZXk6ICdDb252ZXJ0JyB9LFxuICAgIE5vbkNvbnZlcnQ6IHsga2V5Q29kZTogMjksIGNvZGU6ICdOb25Db252ZXJ0Jywga2V5OiAnTm9uQ29udmVydCcgfSxcbiAgICBTcGFjZTogeyBrZXlDb2RlOiAzMiwgY29kZTogJ1NwYWNlJywga2V5OiAnICcgfSxcbiAgICBOdW1wYWQ5OiB7XG4gICAgICAgIGtleUNvZGU6IDMzLFxuICAgICAgICBzaGlmdEtleUNvZGU6IDEwNSxcbiAgICAgICAga2V5OiAnUGFnZVVwJyxcbiAgICAgICAgY29kZTogJ051bXBhZDknLFxuICAgICAgICBzaGlmdEtleTogJzknLFxuICAgICAgICBsb2NhdGlvbjogMyxcbiAgICB9LFxuICAgIFBhZ2VVcDogeyBrZXlDb2RlOiAzMywgY29kZTogJ1BhZ2VVcCcsIGtleTogJ1BhZ2VVcCcgfSxcbiAgICBOdW1wYWQzOiB7XG4gICAgICAgIGtleUNvZGU6IDM0LFxuICAgICAgICBzaGlmdEtleUNvZGU6IDk5LFxuICAgICAgICBrZXk6ICdQYWdlRG93bicsXG4gICAgICAgIGNvZGU6ICdOdW1wYWQzJyxcbiAgICAgICAgc2hpZnRLZXk6ICczJyxcbiAgICAgICAgbG9jYXRpb246IDMsXG4gICAgfSxcbiAgICBQYWdlRG93bjogeyBrZXlDb2RlOiAzNCwgY29kZTogJ1BhZ2VEb3duJywga2V5OiAnUGFnZURvd24nIH0sXG4gICAgRW5kOiB7IGtleUNvZGU6IDM1LCBjb2RlOiAnRW5kJywga2V5OiAnRW5kJyB9LFxuICAgIE51bXBhZDE6IHtcbiAgICAgICAga2V5Q29kZTogMzUsXG4gICAgICAgIHNoaWZ0S2V5Q29kZTogOTcsXG4gICAgICAgIGtleTogJ0VuZCcsXG4gICAgICAgIGNvZGU6ICdOdW1wYWQxJyxcbiAgICAgICAgc2hpZnRLZXk6ICcxJyxcbiAgICAgICAgbG9jYXRpb246IDMsXG4gICAgfSxcbiAgICBIb21lOiB7IGtleUNvZGU6IDM2LCBjb2RlOiAnSG9tZScsIGtleTogJ0hvbWUnIH0sXG4gICAgTnVtcGFkNzoge1xuICAgICAgICBrZXlDb2RlOiAzNixcbiAgICAgICAgc2hpZnRLZXlDb2RlOiAxMDMsXG4gICAgICAgIGtleTogJ0hvbWUnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkNycsXG4gICAgICAgIHNoaWZ0S2V5OiAnNycsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgQXJyb3dMZWZ0OiB7IGtleUNvZGU6IDM3LCBjb2RlOiAnQXJyb3dMZWZ0Jywga2V5OiAnQXJyb3dMZWZ0JyB9LFxuICAgIE51bXBhZDQ6IHtcbiAgICAgICAga2V5Q29kZTogMzcsXG4gICAgICAgIHNoaWZ0S2V5Q29kZTogMTAwLFxuICAgICAgICBrZXk6ICdBcnJvd0xlZnQnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkNCcsXG4gICAgICAgIHNoaWZ0S2V5OiAnNCcsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkODoge1xuICAgICAgICBrZXlDb2RlOiAzOCxcbiAgICAgICAgc2hpZnRLZXlDb2RlOiAxMDQsXG4gICAgICAgIGtleTogJ0Fycm93VXAnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkOCcsXG4gICAgICAgIHNoaWZ0S2V5OiAnOCcsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgQXJyb3dVcDogeyBrZXlDb2RlOiAzOCwgY29kZTogJ0Fycm93VXAnLCBrZXk6ICdBcnJvd1VwJyB9LFxuICAgIEFycm93UmlnaHQ6IHsga2V5Q29kZTogMzksIGNvZGU6ICdBcnJvd1JpZ2h0Jywga2V5OiAnQXJyb3dSaWdodCcgfSxcbiAgICBOdW1wYWQ2OiB7XG4gICAgICAgIGtleUNvZGU6IDM5LFxuICAgICAgICBzaGlmdEtleUNvZGU6IDEwMixcbiAgICAgICAga2V5OiAnQXJyb3dSaWdodCcsXG4gICAgICAgIGNvZGU6ICdOdW1wYWQ2JyxcbiAgICAgICAgc2hpZnRLZXk6ICc2JyxcbiAgICAgICAgbG9jYXRpb246IDMsXG4gICAgfSxcbiAgICBOdW1wYWQyOiB7XG4gICAgICAgIGtleUNvZGU6IDQwLFxuICAgICAgICBzaGlmdEtleUNvZGU6IDk4LFxuICAgICAgICBrZXk6ICdBcnJvd0Rvd24nLFxuICAgICAgICBjb2RlOiAnTnVtcGFkMicsXG4gICAgICAgIHNoaWZ0S2V5OiAnMicsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgQXJyb3dEb3duOiB7IGtleUNvZGU6IDQwLCBjb2RlOiAnQXJyb3dEb3duJywga2V5OiAnQXJyb3dEb3duJyB9LFxuICAgIFNlbGVjdDogeyBrZXlDb2RlOiA0MSwgY29kZTogJ1NlbGVjdCcsIGtleTogJ1NlbGVjdCcgfSxcbiAgICBPcGVuOiB7IGtleUNvZGU6IDQzLCBjb2RlOiAnT3BlbicsIGtleTogJ0V4ZWN1dGUnIH0sXG4gICAgUHJpbnRTY3JlZW46IHsga2V5Q29kZTogNDQsIGNvZGU6ICdQcmludFNjcmVlbicsIGtleTogJ1ByaW50U2NyZWVuJyB9LFxuICAgIEluc2VydDogeyBrZXlDb2RlOiA0NSwgY29kZTogJ0luc2VydCcsIGtleTogJ0luc2VydCcgfSxcbiAgICBOdW1wYWQwOiB7XG4gICAgICAgIGtleUNvZGU6IDQ1LFxuICAgICAgICBzaGlmdEtleUNvZGU6IDk2LFxuICAgICAgICBrZXk6ICdJbnNlcnQnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkMCcsXG4gICAgICAgIHNoaWZ0S2V5OiAnMCcsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgRGVsZXRlOiB7IGtleUNvZGU6IDQ2LCBjb2RlOiAnRGVsZXRlJywga2V5OiAnRGVsZXRlJyB9LFxuICAgIE51bXBhZERlY2ltYWw6IHtcbiAgICAgICAga2V5Q29kZTogNDYsXG4gICAgICAgIHNoaWZ0S2V5Q29kZTogMTEwLFxuICAgICAgICBjb2RlOiAnTnVtcGFkRGVjaW1hbCcsXG4gICAgICAgIGtleTogJ1xcdTAwMDAnLFxuICAgICAgICBzaGlmdEtleTogJy4nLFxuICAgICAgICBsb2NhdGlvbjogMyxcbiAgICB9LFxuICAgIERpZ2l0MDogeyBrZXlDb2RlOiA0OCwgY29kZTogJ0RpZ2l0MCcsIHNoaWZ0S2V5OiAnKScsIGtleTogJzAnIH0sXG4gICAgRGlnaXQxOiB7IGtleUNvZGU6IDQ5LCBjb2RlOiAnRGlnaXQxJywgc2hpZnRLZXk6ICchJywga2V5OiAnMScgfSxcbiAgICBEaWdpdDI6IHsga2V5Q29kZTogNTAsIGNvZGU6ICdEaWdpdDInLCBzaGlmdEtleTogJ0AnLCBrZXk6ICcyJyB9LFxuICAgIERpZ2l0MzogeyBrZXlDb2RlOiA1MSwgY29kZTogJ0RpZ2l0MycsIHNoaWZ0S2V5OiAnIycsIGtleTogJzMnIH0sXG4gICAgRGlnaXQ0OiB7IGtleUNvZGU6IDUyLCBjb2RlOiAnRGlnaXQ0Jywgc2hpZnRLZXk6ICckJywga2V5OiAnNCcgfSxcbiAgICBEaWdpdDU6IHsga2V5Q29kZTogNTMsIGNvZGU6ICdEaWdpdDUnLCBzaGlmdEtleTogJyUnLCBrZXk6ICc1JyB9LFxuICAgIERpZ2l0NjogeyBrZXlDb2RlOiA1NCwgY29kZTogJ0RpZ2l0NicsIHNoaWZ0S2V5OiAnXicsIGtleTogJzYnIH0sXG4gICAgRGlnaXQ3OiB7IGtleUNvZGU6IDU1LCBjb2RlOiAnRGlnaXQ3Jywgc2hpZnRLZXk6ICcmJywga2V5OiAnNycgfSxcbiAgICBEaWdpdDg6IHsga2V5Q29kZTogNTYsIGNvZGU6ICdEaWdpdDgnLCBzaGlmdEtleTogJyonLCBrZXk6ICc4JyB9LFxuICAgIERpZ2l0OTogeyBrZXlDb2RlOiA1NywgY29kZTogJ0RpZ2l0OScsIHNoaWZ0S2V5OiAnKCcsIGtleTogJzknIH0sXG4gICAgS2V5QTogeyBrZXlDb2RlOiA2NSwgY29kZTogJ0tleUEnLCBzaGlmdEtleTogJ0EnLCBrZXk6ICdhJyB9LFxuICAgIEtleUI6IHsga2V5Q29kZTogNjYsIGNvZGU6ICdLZXlCJywgc2hpZnRLZXk6ICdCJywga2V5OiAnYicgfSxcbiAgICBLZXlDOiB7IGtleUNvZGU6IDY3LCBjb2RlOiAnS2V5QycsIHNoaWZ0S2V5OiAnQycsIGtleTogJ2MnIH0sXG4gICAgS2V5RDogeyBrZXlDb2RlOiA2OCwgY29kZTogJ0tleUQnLCBzaGlmdEtleTogJ0QnLCBrZXk6ICdkJyB9LFxuICAgIEtleUU6IHsga2V5Q29kZTogNjksIGNvZGU6ICdLZXlFJywgc2hpZnRLZXk6ICdFJywga2V5OiAnZScgfSxcbiAgICBLZXlGOiB7IGtleUNvZGU6IDcwLCBjb2RlOiAnS2V5RicsIHNoaWZ0S2V5OiAnRicsIGtleTogJ2YnIH0sXG4gICAgS2V5RzogeyBrZXlDb2RlOiA3MSwgY29kZTogJ0tleUcnLCBzaGlmdEtleTogJ0cnLCBrZXk6ICdnJyB9LFxuICAgIEtleUg6IHsga2V5Q29kZTogNzIsIGNvZGU6ICdLZXlIJywgc2hpZnRLZXk6ICdIJywga2V5OiAnaCcgfSxcbiAgICBLZXlJOiB7IGtleUNvZGU6IDczLCBjb2RlOiAnS2V5SScsIHNoaWZ0S2V5OiAnSScsIGtleTogJ2knIH0sXG4gICAgS2V5SjogeyBrZXlDb2RlOiA3NCwgY29kZTogJ0tleUonLCBzaGlmdEtleTogJ0onLCBrZXk6ICdqJyB9LFxuICAgIEtleUs6IHsga2V5Q29kZTogNzUsIGNvZGU6ICdLZXlLJywgc2hpZnRLZXk6ICdLJywga2V5OiAnaycgfSxcbiAgICBLZXlMOiB7IGtleUNvZGU6IDc2LCBjb2RlOiAnS2V5TCcsIHNoaWZ0S2V5OiAnTCcsIGtleTogJ2wnIH0sXG4gICAgS2V5TTogeyBrZXlDb2RlOiA3NywgY29kZTogJ0tleU0nLCBzaGlmdEtleTogJ00nLCBrZXk6ICdtJyB9LFxuICAgIEtleU46IHsga2V5Q29kZTogNzgsIGNvZGU6ICdLZXlOJywgc2hpZnRLZXk6ICdOJywga2V5OiAnbicgfSxcbiAgICBLZXlPOiB7IGtleUNvZGU6IDc5LCBjb2RlOiAnS2V5TycsIHNoaWZ0S2V5OiAnTycsIGtleTogJ28nIH0sXG4gICAgS2V5UDogeyBrZXlDb2RlOiA4MCwgY29kZTogJ0tleVAnLCBzaGlmdEtleTogJ1AnLCBrZXk6ICdwJyB9LFxuICAgIEtleVE6IHsga2V5Q29kZTogODEsIGNvZGU6ICdLZXlRJywgc2hpZnRLZXk6ICdRJywga2V5OiAncScgfSxcbiAgICBLZXlSOiB7IGtleUNvZGU6IDgyLCBjb2RlOiAnS2V5UicsIHNoaWZ0S2V5OiAnUicsIGtleTogJ3InIH0sXG4gICAgS2V5UzogeyBrZXlDb2RlOiA4MywgY29kZTogJ0tleVMnLCBzaGlmdEtleTogJ1MnLCBrZXk6ICdzJyB9LFxuICAgIEtleVQ6IHsga2V5Q29kZTogODQsIGNvZGU6ICdLZXlUJywgc2hpZnRLZXk6ICdUJywga2V5OiAndCcgfSxcbiAgICBLZXlVOiB7IGtleUNvZGU6IDg1LCBjb2RlOiAnS2V5VScsIHNoaWZ0S2V5OiAnVScsIGtleTogJ3UnIH0sXG4gICAgS2V5VjogeyBrZXlDb2RlOiA4NiwgY29kZTogJ0tleVYnLCBzaGlmdEtleTogJ1YnLCBrZXk6ICd2JyB9LFxuICAgIEtleVc6IHsga2V5Q29kZTogODcsIGNvZGU6ICdLZXlXJywgc2hpZnRLZXk6ICdXJywga2V5OiAndycgfSxcbiAgICBLZXlYOiB7IGtleUNvZGU6IDg4LCBjb2RlOiAnS2V5WCcsIHNoaWZ0S2V5OiAnWCcsIGtleTogJ3gnIH0sXG4gICAgS2V5WTogeyBrZXlDb2RlOiA4OSwgY29kZTogJ0tleVknLCBzaGlmdEtleTogJ1knLCBrZXk6ICd5JyB9LFxuICAgIEtleVo6IHsga2V5Q29kZTogOTAsIGNvZGU6ICdLZXlaJywgc2hpZnRLZXk6ICdaJywga2V5OiAneicgfSxcbiAgICBNZXRhTGVmdDogeyBrZXlDb2RlOiA5MSwgY29kZTogJ01ldGFMZWZ0Jywga2V5OiAnTWV0YScsIGxvY2F0aW9uOiAxIH0sXG4gICAgTWV0YVJpZ2h0OiB7IGtleUNvZGU6IDkyLCBjb2RlOiAnTWV0YVJpZ2h0Jywga2V5OiAnTWV0YScsIGxvY2F0aW9uOiAyIH0sXG4gICAgQ29udGV4dE1lbnU6IHsga2V5Q29kZTogOTMsIGNvZGU6ICdDb250ZXh0TWVudScsIGtleTogJ0NvbnRleHRNZW51JyB9LFxuICAgIE51bXBhZE11bHRpcGx5OiB7XG4gICAgICAgIGtleUNvZGU6IDEwNixcbiAgICAgICAgY29kZTogJ051bXBhZE11bHRpcGx5JyxcbiAgICAgICAga2V5OiAnKicsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkQWRkOiB7IGtleUNvZGU6IDEwNywgY29kZTogJ051bXBhZEFkZCcsIGtleTogJysnLCBsb2NhdGlvbjogMyB9LFxuICAgIE51bXBhZFN1YnRyYWN0OiB7XG4gICAgICAgIGtleUNvZGU6IDEwOSxcbiAgICAgICAgY29kZTogJ051bXBhZFN1YnRyYWN0JyxcbiAgICAgICAga2V5OiAnLScsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkRGl2aWRlOiB7IGtleUNvZGU6IDExMSwgY29kZTogJ051bXBhZERpdmlkZScsIGtleTogJy8nLCBsb2NhdGlvbjogMyB9LFxuICAgIEYxOiB7IGtleUNvZGU6IDExMiwgY29kZTogJ0YxJywga2V5OiAnRjEnIH0sXG4gICAgRjI6IHsga2V5Q29kZTogMTEzLCBjb2RlOiAnRjInLCBrZXk6ICdGMicgfSxcbiAgICBGMzogeyBrZXlDb2RlOiAxMTQsIGNvZGU6ICdGMycsIGtleTogJ0YzJyB9LFxuICAgIEY0OiB7IGtleUNvZGU6IDExNSwgY29kZTogJ0Y0Jywga2V5OiAnRjQnIH0sXG4gICAgRjU6IHsga2V5Q29kZTogMTE2LCBjb2RlOiAnRjUnLCBrZXk6ICdGNScgfSxcbiAgICBGNjogeyBrZXlDb2RlOiAxMTcsIGNvZGU6ICdGNicsIGtleTogJ0Y2JyB9LFxuICAgIEY3OiB7IGtleUNvZGU6IDExOCwgY29kZTogJ0Y3Jywga2V5OiAnRjcnIH0sXG4gICAgRjg6IHsga2V5Q29kZTogMTE5LCBjb2RlOiAnRjgnLCBrZXk6ICdGOCcgfSxcbiAgICBGOTogeyBrZXlDb2RlOiAxMjAsIGNvZGU6ICdGOScsIGtleTogJ0Y5JyB9LFxuICAgIEYxMDogeyBrZXlDb2RlOiAxMjEsIGNvZGU6ICdGMTAnLCBrZXk6ICdGMTAnIH0sXG4gICAgRjExOiB7IGtleUNvZGU6IDEyMiwgY29kZTogJ0YxMScsIGtleTogJ0YxMScgfSxcbiAgICBGMTI6IHsga2V5Q29kZTogMTIzLCBjb2RlOiAnRjEyJywga2V5OiAnRjEyJyB9LFxuICAgIEYxMzogeyBrZXlDb2RlOiAxMjQsIGNvZGU6ICdGMTMnLCBrZXk6ICdGMTMnIH0sXG4gICAgRjE0OiB7IGtleUNvZGU6IDEyNSwgY29kZTogJ0YxNCcsIGtleTogJ0YxNCcgfSxcbiAgICBGMTU6IHsga2V5Q29kZTogMTI2LCBjb2RlOiAnRjE1Jywga2V5OiAnRjE1JyB9LFxuICAgIEYxNjogeyBrZXlDb2RlOiAxMjcsIGNvZGU6ICdGMTYnLCBrZXk6ICdGMTYnIH0sXG4gICAgRjE3OiB7IGtleUNvZGU6IDEyOCwgY29kZTogJ0YxNycsIGtleTogJ0YxNycgfSxcbiAgICBGMTg6IHsga2V5Q29kZTogMTI5LCBjb2RlOiAnRjE4Jywga2V5OiAnRjE4JyB9LFxuICAgIEYxOTogeyBrZXlDb2RlOiAxMzAsIGNvZGU6ICdGMTknLCBrZXk6ICdGMTknIH0sXG4gICAgRjIwOiB7IGtleUNvZGU6IDEzMSwgY29kZTogJ0YyMCcsIGtleTogJ0YyMCcgfSxcbiAgICBGMjE6IHsga2V5Q29kZTogMTMyLCBjb2RlOiAnRjIxJywga2V5OiAnRjIxJyB9LFxuICAgIEYyMjogeyBrZXlDb2RlOiAxMzMsIGNvZGU6ICdGMjInLCBrZXk6ICdGMjInIH0sXG4gICAgRjIzOiB7IGtleUNvZGU6IDEzNCwgY29kZTogJ0YyMycsIGtleTogJ0YyMycgfSxcbiAgICBGMjQ6IHsga2V5Q29kZTogMTM1LCBjb2RlOiAnRjI0Jywga2V5OiAnRjI0JyB9LFxuICAgIE51bUxvY2s6IHsga2V5Q29kZTogMTQ0LCBjb2RlOiAnTnVtTG9jaycsIGtleTogJ051bUxvY2snIH0sXG4gICAgU2Nyb2xsTG9jazogeyBrZXlDb2RlOiAxNDUsIGNvZGU6ICdTY3JvbGxMb2NrJywga2V5OiAnU2Nyb2xsTG9jaycgfSxcbiAgICBBdWRpb1ZvbHVtZU11dGU6IHtcbiAgICAgICAga2V5Q29kZTogMTczLFxuICAgICAgICBjb2RlOiAnQXVkaW9Wb2x1bWVNdXRlJyxcbiAgICAgICAga2V5OiAnQXVkaW9Wb2x1bWVNdXRlJyxcbiAgICB9LFxuICAgIEF1ZGlvVm9sdW1lRG93bjoge1xuICAgICAgICBrZXlDb2RlOiAxNzQsXG4gICAgICAgIGNvZGU6ICdBdWRpb1ZvbHVtZURvd24nLFxuICAgICAgICBrZXk6ICdBdWRpb1ZvbHVtZURvd24nLFxuICAgIH0sXG4gICAgQXVkaW9Wb2x1bWVVcDogeyBrZXlDb2RlOiAxNzUsIGNvZGU6ICdBdWRpb1ZvbHVtZVVwJywga2V5OiAnQXVkaW9Wb2x1bWVVcCcgfSxcbiAgICBNZWRpYVRyYWNrTmV4dDoge1xuICAgICAgICBrZXlDb2RlOiAxNzYsXG4gICAgICAgIGNvZGU6ICdNZWRpYVRyYWNrTmV4dCcsXG4gICAgICAgIGtleTogJ01lZGlhVHJhY2tOZXh0JyxcbiAgICB9LFxuICAgIE1lZGlhVHJhY2tQcmV2aW91czoge1xuICAgICAgICBrZXlDb2RlOiAxNzcsXG4gICAgICAgIGNvZGU6ICdNZWRpYVRyYWNrUHJldmlvdXMnLFxuICAgICAgICBrZXk6ICdNZWRpYVRyYWNrUHJldmlvdXMnLFxuICAgIH0sXG4gICAgTWVkaWFTdG9wOiB7IGtleUNvZGU6IDE3OCwgY29kZTogJ01lZGlhU3RvcCcsIGtleTogJ01lZGlhU3RvcCcgfSxcbiAgICBNZWRpYVBsYXlQYXVzZToge1xuICAgICAgICBrZXlDb2RlOiAxNzksXG4gICAgICAgIGNvZGU6ICdNZWRpYVBsYXlQYXVzZScsXG4gICAgICAgIGtleTogJ01lZGlhUGxheVBhdXNlJyxcbiAgICB9LFxuICAgIFNlbWljb2xvbjogeyBrZXlDb2RlOiAxODYsIGNvZGU6ICdTZW1pY29sb24nLCBzaGlmdEtleTogJzonLCBrZXk6ICc7JyB9LFxuICAgIEVxdWFsOiB7IGtleUNvZGU6IDE4NywgY29kZTogJ0VxdWFsJywgc2hpZnRLZXk6ICcrJywga2V5OiAnPScgfSxcbiAgICBOdW1wYWRFcXVhbDogeyBrZXlDb2RlOiAxODcsIGNvZGU6ICdOdW1wYWRFcXVhbCcsIGtleTogJz0nLCBsb2NhdGlvbjogMyB9LFxuICAgIENvbW1hOiB7IGtleUNvZGU6IDE4OCwgY29kZTogJ0NvbW1hJywgc2hpZnRLZXk6ICc8Jywga2V5OiAnLCcgfSxcbiAgICBNaW51czogeyBrZXlDb2RlOiAxODksIGNvZGU6ICdNaW51cycsIHNoaWZ0S2V5OiAnXycsIGtleTogJy0nIH0sXG4gICAgUGVyaW9kOiB7IGtleUNvZGU6IDE5MCwgY29kZTogJ1BlcmlvZCcsIHNoaWZ0S2V5OiAnPicsIGtleTogJy4nIH0sXG4gICAgU2xhc2g6IHsga2V5Q29kZTogMTkxLCBjb2RlOiAnU2xhc2gnLCBzaGlmdEtleTogJz8nLCBrZXk6ICcvJyB9LFxuICAgIEJhY2txdW90ZTogeyBrZXlDb2RlOiAxOTIsIGNvZGU6ICdCYWNrcXVvdGUnLCBzaGlmdEtleTogJ34nLCBrZXk6ICdgJyB9LFxuICAgIEJyYWNrZXRMZWZ0OiB7IGtleUNvZGU6IDIxOSwgY29kZTogJ0JyYWNrZXRMZWZ0Jywgc2hpZnRLZXk6ICd7Jywga2V5OiAnWycgfSxcbiAgICBCYWNrc2xhc2g6IHsga2V5Q29kZTogMjIwLCBjb2RlOiAnQmFja3NsYXNoJywgc2hpZnRLZXk6ICd8Jywga2V5OiAnXFxcXCcgfSxcbiAgICBCcmFja2V0UmlnaHQ6IHsga2V5Q29kZTogMjIxLCBjb2RlOiAnQnJhY2tldFJpZ2h0Jywgc2hpZnRLZXk6ICd9Jywga2V5OiAnXScgfSxcbiAgICBRdW90ZTogeyBrZXlDb2RlOiAyMjIsIGNvZGU6ICdRdW90ZScsIHNoaWZ0S2V5OiAnXCInLCBrZXk6IFwiJ1wiIH0sXG4gICAgQWx0R3JhcGg6IHsga2V5Q29kZTogMjI1LCBjb2RlOiAnQWx0R3JhcGgnLCBrZXk6ICdBbHRHcmFwaCcgfSxcbiAgICBQcm9wczogeyBrZXlDb2RlOiAyNDcsIGNvZGU6ICdQcm9wcycsIGtleTogJ0NyU2VsJyB9LFxuICAgIENhbmNlbDogeyBrZXlDb2RlOiAzLCBrZXk6ICdDYW5jZWwnLCBjb2RlOiAnQWJvcnQnIH0sXG4gICAgQ2xlYXI6IHsga2V5Q29kZTogMTIsIGtleTogJ0NsZWFyJywgY29kZTogJ051bXBhZDUnLCBsb2NhdGlvbjogMyB9LFxuICAgIFNoaWZ0OiB7IGtleUNvZGU6IDE2LCBrZXk6ICdTaGlmdCcsIGNvZGU6ICdTaGlmdExlZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIENvbnRyb2w6IHsga2V5Q29kZTogMTcsIGtleTogJ0NvbnRyb2wnLCBjb2RlOiAnQ29udHJvbExlZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIEFsdDogeyBrZXlDb2RlOiAxOCwga2V5OiAnQWx0JywgY29kZTogJ0FsdExlZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIEFjY2VwdDogeyBrZXlDb2RlOiAzMCwga2V5OiAnQWNjZXB0JyB9LFxuICAgIE1vZGVDaGFuZ2U6IHsga2V5Q29kZTogMzEsIGtleTogJ01vZGVDaGFuZ2UnIH0sXG4gICAgJyAnOiB7IGtleUNvZGU6IDMyLCBrZXk6ICcgJywgY29kZTogJ1NwYWNlJyB9LFxuICAgIFByaW50OiB7IGtleUNvZGU6IDQyLCBrZXk6ICdQcmludCcgfSxcbiAgICBFeGVjdXRlOiB7IGtleUNvZGU6IDQzLCBrZXk6ICdFeGVjdXRlJywgY29kZTogJ09wZW4nIH0sXG4gICAgJ1xcdTAwMDAnOiB7IGtleUNvZGU6IDQ2LCBrZXk6ICdcXHUwMDAwJywgY29kZTogJ051bXBhZERlY2ltYWwnLCBsb2NhdGlvbjogMyB9LFxuICAgIGE6IHsga2V5Q29kZTogNjUsIGtleTogJ2EnLCBjb2RlOiAnS2V5QScgfSxcbiAgICBiOiB7IGtleUNvZGU6IDY2LCBrZXk6ICdiJywgY29kZTogJ0tleUInIH0sXG4gICAgYzogeyBrZXlDb2RlOiA2Nywga2V5OiAnYycsIGNvZGU6ICdLZXlDJyB9LFxuICAgIGQ6IHsga2V5Q29kZTogNjgsIGtleTogJ2QnLCBjb2RlOiAnS2V5RCcgfSxcbiAgICBlOiB7IGtleUNvZGU6IDY5LCBrZXk6ICdlJywgY29kZTogJ0tleUUnIH0sXG4gICAgZjogeyBrZXlDb2RlOiA3MCwga2V5OiAnZicsIGNvZGU6ICdLZXlGJyB9LFxuICAgIGc6IHsga2V5Q29kZTogNzEsIGtleTogJ2cnLCBjb2RlOiAnS2V5RycgfSxcbiAgICBoOiB7IGtleUNvZGU6IDcyLCBrZXk6ICdoJywgY29kZTogJ0tleUgnIH0sXG4gICAgaTogeyBrZXlDb2RlOiA3Mywga2V5OiAnaScsIGNvZGU6ICdLZXlJJyB9LFxuICAgIGo6IHsga2V5Q29kZTogNzQsIGtleTogJ2onLCBjb2RlOiAnS2V5SicgfSxcbiAgICBrOiB7IGtleUNvZGU6IDc1LCBrZXk6ICdrJywgY29kZTogJ0tleUsnIH0sXG4gICAgbDogeyBrZXlDb2RlOiA3Niwga2V5OiAnbCcsIGNvZGU6ICdLZXlMJyB9LFxuICAgIG06IHsga2V5Q29kZTogNzcsIGtleTogJ20nLCBjb2RlOiAnS2V5TScgfSxcbiAgICBuOiB7IGtleUNvZGU6IDc4LCBrZXk6ICduJywgY29kZTogJ0tleU4nIH0sXG4gICAgbzogeyBrZXlDb2RlOiA3OSwga2V5OiAnbycsIGNvZGU6ICdLZXlPJyB9LFxuICAgIHA6IHsga2V5Q29kZTogODAsIGtleTogJ3AnLCBjb2RlOiAnS2V5UCcgfSxcbiAgICBxOiB7IGtleUNvZGU6IDgxLCBrZXk6ICdxJywgY29kZTogJ0tleVEnIH0sXG4gICAgcjogeyBrZXlDb2RlOiA4Miwga2V5OiAncicsIGNvZGU6ICdLZXlSJyB9LFxuICAgIHM6IHsga2V5Q29kZTogODMsIGtleTogJ3MnLCBjb2RlOiAnS2V5UycgfSxcbiAgICB0OiB7IGtleUNvZGU6IDg0LCBrZXk6ICd0JywgY29kZTogJ0tleVQnIH0sXG4gICAgdTogeyBrZXlDb2RlOiA4NSwga2V5OiAndScsIGNvZGU6ICdLZXlVJyB9LFxuICAgIHY6IHsga2V5Q29kZTogODYsIGtleTogJ3YnLCBjb2RlOiAnS2V5VicgfSxcbiAgICB3OiB7IGtleUNvZGU6IDg3LCBrZXk6ICd3JywgY29kZTogJ0tleVcnIH0sXG4gICAgeDogeyBrZXlDb2RlOiA4OCwga2V5OiAneCcsIGNvZGU6ICdLZXlYJyB9LFxuICAgIHk6IHsga2V5Q29kZTogODksIGtleTogJ3knLCBjb2RlOiAnS2V5WScgfSxcbiAgICB6OiB7IGtleUNvZGU6IDkwLCBrZXk6ICd6JywgY29kZTogJ0tleVonIH0sXG4gICAgTWV0YTogeyBrZXlDb2RlOiA5MSwga2V5OiAnTWV0YScsIGNvZGU6ICdNZXRhTGVmdCcsIGxvY2F0aW9uOiAxIH0sXG4gICAgJyonOiB7IGtleUNvZGU6IDEwNiwga2V5OiAnKicsIGNvZGU6ICdOdW1wYWRNdWx0aXBseScsIGxvY2F0aW9uOiAzIH0sXG4gICAgJysnOiB7IGtleUNvZGU6IDEwNywga2V5OiAnKycsIGNvZGU6ICdOdW1wYWRBZGQnLCBsb2NhdGlvbjogMyB9LFxuICAgICctJzogeyBrZXlDb2RlOiAxMDksIGtleTogJy0nLCBjb2RlOiAnTnVtcGFkU3VidHJhY3QnLCBsb2NhdGlvbjogMyB9LFxuICAgICcvJzogeyBrZXlDb2RlOiAxMTEsIGtleTogJy8nLCBjb2RlOiAnTnVtcGFkRGl2aWRlJywgbG9jYXRpb246IDMgfSxcbiAgICAnOyc6IHsga2V5Q29kZTogMTg2LCBrZXk6ICc7JywgY29kZTogJ1NlbWljb2xvbicgfSxcbiAgICAnPSc6IHsga2V5Q29kZTogMTg3LCBrZXk6ICc9JywgY29kZTogJ0VxdWFsJyB9LFxuICAgICcsJzogeyBrZXlDb2RlOiAxODgsIGtleTogJywnLCBjb2RlOiAnQ29tbWEnIH0sXG4gICAgJy4nOiB7IGtleUNvZGU6IDE5MCwga2V5OiAnLicsIGNvZGU6ICdQZXJpb2QnIH0sXG4gICAgJ2AnOiB7IGtleUNvZGU6IDE5Miwga2V5OiAnYCcsIGNvZGU6ICdCYWNrcXVvdGUnIH0sXG4gICAgJ1snOiB7IGtleUNvZGU6IDIxOSwga2V5OiAnWycsIGNvZGU6ICdCcmFja2V0TGVmdCcgfSxcbiAgICAnXFxcXCc6IHsga2V5Q29kZTogMjIwLCBrZXk6ICdcXFxcJywgY29kZTogJ0JhY2tzbGFzaCcgfSxcbiAgICAnXSc6IHsga2V5Q29kZTogMjIxLCBrZXk6ICddJywgY29kZTogJ0JyYWNrZXRSaWdodCcgfSxcbiAgICBcIidcIjogeyBrZXlDb2RlOiAyMjIsIGtleTogXCInXCIsIGNvZGU6ICdRdW90ZScgfSxcbiAgICBBdHRuOiB7IGtleUNvZGU6IDI0Niwga2V5OiAnQXR0bicgfSxcbiAgICBDclNlbDogeyBrZXlDb2RlOiAyNDcsIGtleTogJ0NyU2VsJywgY29kZTogJ1Byb3BzJyB9LFxuICAgIEV4U2VsOiB7IGtleUNvZGU6IDI0OCwga2V5OiAnRXhTZWwnIH0sXG4gICAgRXJhc2VFb2Y6IHsga2V5Q29kZTogMjQ5LCBrZXk6ICdFcmFzZUVvZicgfSxcbiAgICBQbGF5OiB7IGtleUNvZGU6IDI1MCwga2V5OiAnUGxheScgfSxcbiAgICBab29tT3V0OiB7IGtleUNvZGU6IDI1MSwga2V5OiAnWm9vbU91dCcgfSxcbiAgICAnKSc6IHsga2V5Q29kZTogNDgsIGtleTogJyknLCBjb2RlOiAnRGlnaXQwJyB9LFxuICAgICchJzogeyBrZXlDb2RlOiA0OSwga2V5OiAnIScsIGNvZGU6ICdEaWdpdDEnIH0sXG4gICAgJ0AnOiB7IGtleUNvZGU6IDUwLCBrZXk6ICdAJywgY29kZTogJ0RpZ2l0MicgfSxcbiAgICAnIyc6IHsga2V5Q29kZTogNTEsIGtleTogJyMnLCBjb2RlOiAnRGlnaXQzJyB9LFxuICAgICQ6IHsga2V5Q29kZTogNTIsIGtleTogJyQnLCBjb2RlOiAnRGlnaXQ0JyB9LFxuICAgICclJzogeyBrZXlDb2RlOiA1Mywga2V5OiAnJScsIGNvZGU6ICdEaWdpdDUnIH0sXG4gICAgJ14nOiB7IGtleUNvZGU6IDU0LCBrZXk6ICdeJywgY29kZTogJ0RpZ2l0NicgfSxcbiAgICAnJic6IHsga2V5Q29kZTogNTUsIGtleTogJyYnLCBjb2RlOiAnRGlnaXQ3JyB9LFxuICAgICcoJzogeyBrZXlDb2RlOiA1Nywga2V5OiAnKCcsIGNvZGU6ICdEaWdpdDknIH0sXG4gICAgQTogeyBrZXlDb2RlOiA2NSwga2V5OiAnQScsIGNvZGU6ICdLZXlBJyB9LFxuICAgIEI6IHsga2V5Q29kZTogNjYsIGtleTogJ0InLCBjb2RlOiAnS2V5QicgfSxcbiAgICBDOiB7IGtleUNvZGU6IDY3LCBrZXk6ICdDJywgY29kZTogJ0tleUMnIH0sXG4gICAgRDogeyBrZXlDb2RlOiA2OCwga2V5OiAnRCcsIGNvZGU6ICdLZXlEJyB9LFxuICAgIEU6IHsga2V5Q29kZTogNjksIGtleTogJ0UnLCBjb2RlOiAnS2V5RScgfSxcbiAgICBGOiB7IGtleUNvZGU6IDcwLCBrZXk6ICdGJywgY29kZTogJ0tleUYnIH0sXG4gICAgRzogeyBrZXlDb2RlOiA3MSwga2V5OiAnRycsIGNvZGU6ICdLZXlHJyB9LFxuICAgIEg6IHsga2V5Q29kZTogNzIsIGtleTogJ0gnLCBjb2RlOiAnS2V5SCcgfSxcbiAgICBJOiB7IGtleUNvZGU6IDczLCBrZXk6ICdJJywgY29kZTogJ0tleUknIH0sXG4gICAgSjogeyBrZXlDb2RlOiA3NCwga2V5OiAnSicsIGNvZGU6ICdLZXlKJyB9LFxuICAgIEs6IHsga2V5Q29kZTogNzUsIGtleTogJ0snLCBjb2RlOiAnS2V5SycgfSxcbiAgICBMOiB7IGtleUNvZGU6IDc2LCBrZXk6ICdMJywgY29kZTogJ0tleUwnIH0sXG4gICAgTTogeyBrZXlDb2RlOiA3Nywga2V5OiAnTScsIGNvZGU6ICdLZXlNJyB9LFxuICAgIE46IHsga2V5Q29kZTogNzgsIGtleTogJ04nLCBjb2RlOiAnS2V5TicgfSxcbiAgICBPOiB7IGtleUNvZGU6IDc5LCBrZXk6ICdPJywgY29kZTogJ0tleU8nIH0sXG4gICAgUDogeyBrZXlDb2RlOiA4MCwga2V5OiAnUCcsIGNvZGU6ICdLZXlQJyB9LFxuICAgIFE6IHsga2V5Q29kZTogODEsIGtleTogJ1EnLCBjb2RlOiAnS2V5UScgfSxcbiAgICBSOiB7IGtleUNvZGU6IDgyLCBrZXk6ICdSJywgY29kZTogJ0tleVInIH0sXG4gICAgUzogeyBrZXlDb2RlOiA4Mywga2V5OiAnUycsIGNvZGU6ICdLZXlTJyB9LFxuICAgIFQ6IHsga2V5Q29kZTogODQsIGtleTogJ1QnLCBjb2RlOiAnS2V5VCcgfSxcbiAgICBVOiB7IGtleUNvZGU6IDg1LCBrZXk6ICdVJywgY29kZTogJ0tleVUnIH0sXG4gICAgVjogeyBrZXlDb2RlOiA4Niwga2V5OiAnVicsIGNvZGU6ICdLZXlWJyB9LFxuICAgIFc6IHsga2V5Q29kZTogODcsIGtleTogJ1cnLCBjb2RlOiAnS2V5VycgfSxcbiAgICBYOiB7IGtleUNvZGU6IDg4LCBrZXk6ICdYJywgY29kZTogJ0tleVgnIH0sXG4gICAgWTogeyBrZXlDb2RlOiA4OSwga2V5OiAnWScsIGNvZGU6ICdLZXlZJyB9LFxuICAgIFo6IHsga2V5Q29kZTogOTAsIGtleTogJ1onLCBjb2RlOiAnS2V5WicgfSxcbiAgICAnOic6IHsga2V5Q29kZTogMTg2LCBrZXk6ICc6JywgY29kZTogJ1NlbWljb2xvbicgfSxcbiAgICAnPCc6IHsga2V5Q29kZTogMTg4LCBrZXk6ICc8JywgY29kZTogJ0NvbW1hJyB9LFxuICAgIF86IHsga2V5Q29kZTogMTg5LCBrZXk6ICdfJywgY29kZTogJ01pbnVzJyB9LFxuICAgICc+JzogeyBrZXlDb2RlOiAxOTAsIGtleTogJz4nLCBjb2RlOiAnUGVyaW9kJyB9LFxuICAgICc/JzogeyBrZXlDb2RlOiAxOTEsIGtleTogJz8nLCBjb2RlOiAnU2xhc2gnIH0sXG4gICAgJ34nOiB7IGtleUNvZGU6IDE5Miwga2V5OiAnficsIGNvZGU6ICdCYWNrcXVvdGUnIH0sXG4gICAgJ3snOiB7IGtleUNvZGU6IDIxOSwga2V5OiAneycsIGNvZGU6ICdCcmFja2V0TGVmdCcgfSxcbiAgICAnfCc6IHsga2V5Q29kZTogMjIwLCBrZXk6ICd8JywgY29kZTogJ0JhY2tzbGFzaCcgfSxcbiAgICAnfSc6IHsga2V5Q29kZTogMjIxLCBrZXk6ICd9JywgY29kZTogJ0JyYWNrZXRSaWdodCcgfSxcbiAgICAnXCInOiB7IGtleUNvZGU6IDIyMiwga2V5OiAnXCInLCBjb2RlOiAnUXVvdGUnIH0sXG4gICAgU29mdExlZnQ6IHsga2V5OiAnU29mdExlZnQnLCBjb2RlOiAnU29mdExlZnQnLCBsb2NhdGlvbjogNCB9LFxuICAgIFNvZnRSaWdodDogeyBrZXk6ICdTb2Z0UmlnaHQnLCBjb2RlOiAnU29mdFJpZ2h0JywgbG9jYXRpb246IDQgfSxcbiAgICBDYW1lcmE6IHsga2V5Q29kZTogNDQsIGtleTogJ0NhbWVyYScsIGNvZGU6ICdDYW1lcmEnLCBsb2NhdGlvbjogNCB9LFxuICAgIENhbGw6IHsga2V5OiAnQ2FsbCcsIGNvZGU6ICdDYWxsJywgbG9jYXRpb246IDQgfSxcbiAgICBFbmRDYWxsOiB7IGtleUNvZGU6IDk1LCBrZXk6ICdFbmRDYWxsJywgY29kZTogJ0VuZENhbGwnLCBsb2NhdGlvbjogNCB9LFxuICAgIFZvbHVtZURvd246IHtcbiAgICAgICAga2V5Q29kZTogMTgyLFxuICAgICAgICBrZXk6ICdWb2x1bWVEb3duJyxcbiAgICAgICAgY29kZTogJ1ZvbHVtZURvd24nLFxuICAgICAgICBsb2NhdGlvbjogNCxcbiAgICB9LFxuICAgIFZvbHVtZVVwOiB7IGtleUNvZGU6IDE4Mywga2V5OiAnVm9sdW1lVXAnLCBjb2RlOiAnVm9sdW1lVXAnLCBsb2NhdGlvbjogNCB9LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVTS2V5Ym9hcmRMYXlvdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZXdwb3J0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4uL3V0aWwvRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlGdW5jdGlvbiB9IGZyb20gJy4uL3V0aWwvRnVuY3Rpb24uanMnO1xuaW1wb3J0IHsgVGltZW91dEVycm9yIH0gZnJvbSAnLi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4vTGF6eUFyZy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgV2FpdFRhc2sge1xuICAgICN3b3JsZDtcbiAgICAjcG9sbGluZztcbiAgICAjcm9vdDtcbiAgICAjZm47XG4gICAgI2FyZ3M7XG4gICAgI3RpbWVvdXQ7XG4gICAgI3RpbWVvdXRFcnJvcjtcbiAgICAjcmVzdWx0ID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgI3BvbGxlcjtcbiAgICAjc2lnbmFsO1xuICAgICNyZXJ1bnMgPSBbXTtcbiAgICBjb25zdHJ1Y3Rvcih3b3JsZCwgb3B0aW9ucywgZm4sIC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy4jd29ybGQgPSB3b3JsZDtcbiAgICAgICAgdGhpcy4jcG9sbGluZyA9IG9wdGlvbnMucG9sbGluZztcbiAgICAgICAgdGhpcy4jcm9vdCA9IG9wdGlvbnMucm9vdDtcbiAgICAgICAgdGhpcy4jc2lnbmFsID0gb3B0aW9ucy5zaWduYWw7XG4gICAgICAgIHRoaXMuI3NpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHRoaXMudGVybWluYXRlKHRoaXMuI3NpZ25hbD8ucmVhc29uKTtcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGZuKSB7XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIHRoaXMuI2ZuID0gYCgpID0+IHtyZXR1cm4gKCR7Zm59KTt9YDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy4jZm4gPSBzdHJpbmdpZnlGdW5jdGlvbihmbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jYXJncyA9IGFyZ3M7XG4gICAgICAgIHRoaXMuI3dvcmxkLnRhc2tNYW5hZ2VyLmFkZCh0aGlzKTtcbiAgICAgICAgaWYgKG9wdGlvbnMudGltZW91dCkge1xuICAgICAgICAgICAgdGhpcy4jdGltZW91dEVycm9yID0gbmV3IFRpbWVvdXRFcnJvcihgV2FpdGluZyBmYWlsZWQ6ICR7b3B0aW9ucy50aW1lb3V0fW1zIGV4Y2VlZGVkYCk7XG4gICAgICAgICAgICB0aGlzLiN0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnRlcm1pbmF0ZSh0aGlzLiN0aW1lb3V0RXJyb3IpO1xuICAgICAgICAgICAgfSwgb3B0aW9ucy50aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICB2b2lkIHRoaXMucmVydW4oKTtcbiAgICB9XG4gICAgZ2V0IHJlc3VsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Jlc3VsdC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgYXN5bmMgcmVydW4oKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJldiBvZiB0aGlzLiNyZXJ1bnMpIHtcbiAgICAgICAgICAgIHByZXYuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNyZXJ1bnMubGVuZ3RoID0gMDtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgdGhpcy4jcmVydW5zLnB1c2goY29udHJvbGxlcik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuI3BvbGxpbmcpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdyYWYnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNwb2xsZXIgPSBhd2FpdCB0aGlzLiN3b3JsZC5ldmFsdWF0ZUhhbmRsZSgoeyBSQUZQb2xsZXIsIGNyZWF0ZUZ1bmN0aW9uIH0sIGZuLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmdW4gPSBjcmVhdGVGdW5jdGlvbihmbik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJBRlBvbGxlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1biguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LCBMYXp5QXJnLmNyZWF0ZShjb250ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnB1cHBldGVlclV0aWw7XG4gICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLiNmbiwgLi4udGhpcy4jYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ211dGF0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcG9sbGVyID0gYXdhaXQgdGhpcy4jd29ybGQuZXZhbHVhdGVIYW5kbGUoKHsgTXV0YXRpb25Qb2xsZXIsIGNyZWF0ZUZ1bmN0aW9uIH0sIHJvb3QsIGZuLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmdW4gPSBjcmVhdGVGdW5jdGlvbihmbik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE11dGF0aW9uUG9sbGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm9vdCB8fCBkb2N1bWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIExhenlBcmcuY3JlYXRlKGNvbnRleHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHVwcGV0ZWVyVXRpbDtcbiAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuI3Jvb3QsIHRoaXMuI2ZuLCAuLi50aGlzLiNhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcG9sbGVyID0gYXdhaXQgdGhpcy4jd29ybGQuZXZhbHVhdGVIYW5kbGUoKHsgSW50ZXJ2YWxQb2xsZXIsIGNyZWF0ZUZ1bmN0aW9uIH0sIG1zLCBmbiwgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVuID0gY3JlYXRlRnVuY3Rpb24oZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbFBvbGxlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1biguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG1zKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgTGF6eUFyZy5jcmVhdGUoY29udGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy4jcG9sbGluZywgdGhpcy4jZm4sIC4uLnRoaXMuI2FyZ3MpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3BvbGxlci5ldmFsdWF0ZShwb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgcG9sbGVyLnN0YXJ0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI3BvbGxlci5ldmFsdWF0ZUhhbmRsZShwb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb2xsZXIucmVzdWx0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuI3Jlc3VsdC5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRlcm1pbmF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiYWRFcnJvciA9IHRoaXMuZ2V0QmFkRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgaWYgKGJhZEVycm9yKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy50ZXJtaW5hdGUoYmFkRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHRlcm1pbmF0ZShlcnJvcikge1xuICAgICAgICB0aGlzLiN3b3JsZC50YXNrTWFuYWdlci5kZWxldGUodGhpcyk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0aW1lb3V0KTtcbiAgICAgICAgaWYgKGVycm9yICYmICF0aGlzLiNyZXN1bHQuZmluaXNoZWQoKSkge1xuICAgICAgICAgICAgdGhpcy4jcmVzdWx0LnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3BvbGxlcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNwb2xsZXIuZXZhbHVhdGVIYW5kbGUoYXN5bmMgKHBvbGxlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwb2xsZXIuc3RvcCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNwb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcG9sbGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcG9sbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIHNpbmNlIHRoZXkgbW9zdCBsaWtlbHkgY29tZSBmcm9tIGxvdy1sZXZlbCBjbGVhbnVwLlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vdCBhbGwgZXJyb3JzIGxlYWQgdG8gdGVybWluYXRpb24uIFRoZXkgdXN1YWxseSBpbXBseSB3ZSBuZWVkIHRvIHJlcnVuIHRoZSB0YXNrLlxuICAgICAqL1xuICAgIGdldEJhZEVycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChpc0Vycm9yTGlrZShlcnJvcikpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gZnJhbWUgaXMgZGV0YWNoZWQgdGhlIHRhc2sgc2hvdWxkIGhhdmUgYmVlbiB0ZXJtaW5hdGVkIGJ5IHRoZSBJc29sYXRlZFdvcmxkLlxuICAgICAgICAgICAgLy8gVGhpcyBjYW4gZmFpbCBpZiB3ZSB3ZXJlIGFkZGluZyB0aGlzIHRhc2sgd2hpbGUgdGhlIGZyYW1lIHdhcyBkZXRhY2hlZCxcbiAgICAgICAgICAgIC8vIHNvIHdlIHRlcm1pbmF0ZSBoZXJlIGluc3RlYWQuXG4gICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRXhlY3V0aW9uIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBkZXRhY2hlZCBmcmFtZScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignV2FpdGluZyBmYWlsZWQ6IEZyYW1lIGRldGFjaGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXaGVuIHRoZSBwYWdlIGlzIG5hdmlnYXRlZCwgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQuXG4gICAgICAgICAgICAvLyBXZSB3aWxsIHRyeSBhZ2FpbiBpbiB0aGUgbmV3IGV4ZWN1dGlvbiBjb250ZXh0LlxuICAgICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0V4ZWN1dGlvbiBjb250ZXh0IHdhcyBkZXN0cm95ZWQnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGNvdWxkIGhhdmUgdHJpZWQgdG8gZXZhbHVhdGUgaW4gYSBjb250ZXh0IHdoaWNoIHdhcyBhbHJlYWR5XG4gICAgICAgICAgICAvLyBkZXN0cm95ZWQuXG4gICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnQ2Fubm90IGZpbmQgY29udGV4dCB3aXRoIHNwZWNpZmllZCBpZCcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRXJyb3JzIGNvbWluZyBmcm9tIFdlYkRyaXZlciBCaURpLiBUT0RPOiBBZGp1c3QgbWVzc2FnZXMgYWZ0ZXJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93M2Mvd2ViZHJpdmVyLWJpZGkvaXNzdWVzLzU0MCBpcyByZXNvbHZlZC5cbiAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQWJvcnRFcnJvcjogQWN0b3IgJ01lc3NhZ2VIYW5kbGVyRnJhbWUnIGRlc3Ryb3llZFwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdXYWl0VGFzayBmYWlsZWQgd2l0aCBhbiBlcnJvcicsIHtcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tNYW5hZ2VyIHtcbiAgICAjdGFza3MgPSBuZXcgU2V0KCk7XG4gICAgYWRkKHRhc2spIHtcbiAgICAgICAgdGhpcy4jdGFza3MuYWRkKHRhc2spO1xuICAgIH1cbiAgICBkZWxldGUodGFzaykge1xuICAgICAgICB0aGlzLiN0YXNrcy5kZWxldGUodGFzayk7XG4gICAgfVxuICAgIHRlcm1pbmF0ZUFsbChlcnJvcikge1xuICAgICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy4jdGFza3MpIHtcbiAgICAgICAgICAgIHZvaWQgdGFzay50ZXJtaW5hdGUoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3Rhc2tzLmNsZWFyKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlcnVuQWxsKCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbLi4udGhpcy4jdGFza3NdLm1hcCh0YXNrID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0YXNrLnJlcnVuKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XYWl0VGFzay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyLCB9IGZyb20gJy4vUXVlcnlIYW5kbGVyLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBYUGF0aFF1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JBbGwgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgeHBhdGhRdWVyeVNlbGVjdG9yQWxsIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHhwYXRoUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvciA9IChlbGVtZW50LCBzZWxlY3RvciwgeyB4cGF0aFF1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiB4cGF0aFF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudCwgc2VsZWN0b3IsIDEpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1YUGF0aFF1ZXJ5SGFuZGxlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9Ccm93c2VyV2ViU29ja2V0VHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FsbGJhY2tSZWdpc3RyeS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbmZpZ3VyYXRpb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25uZWN0aW9uVHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ29ubmVjdE9wdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25zb2xlTWVzc2FnZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0Nvb2tpZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0RlYnVnLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRGV2aWNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXJyb3JzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXZlbnRFbWl0dGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRmlsZUNob29zZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRRdWVyeUhhbmRsZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9IYW5kbGVJdGVyYXRvci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0xhenlBcmcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9OZXR3b3JrTWFuYWdlckV2ZW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1BERk9wdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QaWVyY2VRdWVyeUhhbmRsZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QUXVlcnlIYW5kbGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHJvZHVjdC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1BTZWxlY3RvclBhcnNlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1B1cHBldGVlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5SGFuZGxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1NjcmlwdEluamVjdG9yLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vU2VjdXJpdHlEZXRhaWxzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGFza1F1ZXVlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dFF1ZXJ5SGFuZGxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1RpbWVvdXRTZXR0aW5ncy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVVNLZXlib2FyZExheW91dC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWwuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9WaWV3cG9ydC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1dhaXRUYXNrLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vWFBhdGhRdWVyeUhhbmRsZXIuanMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgZmlsdGVyLCBmcm9tLCBmcm9tRXZlbnQsIG1hcCwgbWVyZ2VNYXAsIE5FVkVSLCBPYnNlcnZhYmxlLCB0aW1lciwgfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuL0RlYnVnLmpzJztcbmltcG9ydCB7IFRpbWVvdXRFcnJvciB9IGZyb20gJy4vRXJyb3JzLmpzJztcbmltcG9ydCB7IHBhcGVyRm9ybWF0cyB9IGZyb20gJy4vUERGT3B0aW9ucy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZGVidWdFcnJvciA9IGRlYnVnKCdwdXBwZXRlZXI6ZXJyb3InKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1ZJRVdQT1JUID0gT2JqZWN0LmZyZWV6ZSh7IHdpZHRoOiA4MDAsIGhlaWdodDogNjAwIH0pO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgU09VUkNFX1VSTCA9IFN5bWJvbCgnU291cmNlIFVSTCBmb3IgUHVwcGV0ZWVyIGV2YWx1YXRpb24gc2NyaXB0cycpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFB1cHBldGVlclVSTCB7XG4gICAgc3RhdGljIElOVEVSTkFMX1VSTCA9ICdwcHRyOmludGVybmFsJztcbiAgICBzdGF0aWMgZnJvbUNhbGxTaXRlKGZ1bmN0aW9uTmFtZSwgc2l0ZSkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgUHVwcGV0ZWVyVVJMKCk7XG4gICAgICAgIHVybC4jZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lO1xuICAgICAgICB1cmwuI3NpdGVTdHJpbmcgPSBzaXRlLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuICAgIHN0YXRpYyBwYXJzZSA9ICh1cmwpID0+IHtcbiAgICAgICAgdXJsID0gdXJsLnNsaWNlKCdwcHRyOicubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgW2Z1bmN0aW9uTmFtZSA9ICcnLCBzaXRlU3RyaW5nID0gJyddID0gdXJsLnNwbGl0KCc7Jyk7XG4gICAgICAgIGNvbnN0IHB1cHBldGVlclVybCA9IG5ldyBQdXBwZXRlZXJVUkwoKTtcbiAgICAgICAgcHVwcGV0ZWVyVXJsLiNmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgIHB1cHBldGVlclVybC4jc2l0ZVN0cmluZyA9IGRlY29kZVVSSUNvbXBvbmVudChzaXRlU3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHB1cHBldGVlclVybDtcbiAgICB9O1xuICAgIHN0YXRpYyBpc1B1cHBldGVlclVSTCA9ICh1cmwpID0+IHtcbiAgICAgICAgcmV0dXJuIHVybC5zdGFydHNXaXRoKCdwcHRyOicpO1xuICAgIH07XG4gICAgI2Z1bmN0aW9uTmFtZTtcbiAgICAjc2l0ZVN0cmluZztcbiAgICBnZXQgZnVuY3Rpb25OYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnVuY3Rpb25OYW1lO1xuICAgIH1cbiAgICBnZXQgc2l0ZVN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NpdGVTdHJpbmc7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYHBwdHI6JHtbXG4gICAgICAgICAgICB0aGlzLiNmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQodGhpcy4jc2l0ZVN0cmluZyksXG4gICAgICAgIF0uam9pbignOycpfWA7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUgPSAoZnVuY3Rpb25OYW1lLCBvYmplY3QpID0+IHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgU09VUkNFX1VSTCkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtcbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IChfLCBzdGFjaykgPT4ge1xuICAgICAgICAvLyBGaXJzdCBlbGVtZW50IGlzIHRoZSBmdW5jdGlvbi5cbiAgICAgICAgLy8gU2Vjb25kIGVsZW1lbnQgaXMgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uLlxuICAgICAgICAvLyBUaGlyZCBlbGVtZW50IGlzIHRoZSBjYWxsZXIgb2YgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uXG4gICAgICAgIC8vIHdoaWNoIGlzIHByZWNpc2VseSB3aGF0IHdlIHdhbnQuXG4gICAgICAgIHJldHVybiBzdGFja1syXTtcbiAgICB9O1xuICAgIGNvbnN0IHNpdGUgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IG9yaWdpbmFsO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG9iamVjdCwge1xuICAgICAgICBbU09VUkNFX1VSTF06IFB1cHBldGVlclVSTC5mcm9tQ2FsbFNpdGUoZnVuY3Rpb25OYW1lLCBzaXRlKSxcbiAgICB9KTtcbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0U291cmNlUHVwcGV0ZWVyVVJMSWZBdmFpbGFibGUgPSAob2JqZWN0KSA9PiB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIFNPVVJDRV9VUkwpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3RbU09VUkNFX1VSTF07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU3RyaW5nID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCBvYmogaW5zdGFuY2VvZiBTdHJpbmc7XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGlzTnVtYmVyID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCBvYmogaW5zdGFuY2VvZiBOdW1iZXI7XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGlzUGxhaW5PYmplY3QgPSAob2JqKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaj8uY29uc3RydWN0b3IgPT09IE9iamVjdDtcbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaXNSZWdFeHAgPSAob2JqKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaj8uY29uc3RydWN0b3IgPT09IFJlZ0V4cDtcbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaXNEYXRlID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmo/LmNvbnN0cnVjdG9yID09PSBEYXRlO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0aW9uU3RyaW5nKGZ1biwgLi4uYXJncykge1xuICAgIGlmIChpc1N0cmluZyhmdW4pKSB7XG4gICAgICAgIGFzc2VydChhcmdzLmxlbmd0aCA9PT0gMCwgJ0Nhbm5vdCBldmFsdWF0ZSBhIHN0cmluZyB3aXRoIGFyZ3VtZW50cycpO1xuICAgICAgICByZXR1cm4gZnVuO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXJpYWxpemVBcmd1bWVudChhcmcpIHtcbiAgICAgICAgaWYgKE9iamVjdC5pcyhhcmcsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIGAoJHtmdW59KSgke2FyZ3MubWFwKHNlcmlhbGl6ZUFyZ3VtZW50KS5qb2luKCcsJyl9KWA7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5sZXQgZnMgPSBudWxsO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEZTUHJvbWlzZXMoKSB7XG4gICAgaWYgKCFmcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZnMgPSBhd2FpdCBpbXBvcnQoJ2ZzL3Byb21pc2VzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB3cml0ZSB0byBhIHBhdGggb3V0c2lkZSBvZiBhIE5vZGUtbGlrZSBlbnZpcm9ubWVudC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWFkYWJsZUFzQnVmZmVyKHJlYWRhYmxlLCBwYXRoKSB7XG4gICAgY29uc3QgYnVmZmVycyA9IFtdO1xuICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgIGlmIChwYXRoKSB7XG4gICAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0RlNQcm9taXNlcygpO1xuICAgICAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgZnMub3BlbihwYXRoLCAndysnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBmaWxlSGFuZGxlLndyaXRlRmlsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBmaWxlSGFuZGxlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlYWRhYmxlRnJvbVByb3RvY29sU3RyZWFtKGNsaWVudCwgaGFuZGxlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0VW5pdDhBcnJheShkYXRhLCBpc0Jhc2U2NCkge1xuICAgICAgICAgICAgICAgIGlmIChpc0Jhc2U2NCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGF0b2IoZGF0YSksIG0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uY29kZVBvaW50QXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZXIuZW5jb2RlKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBiYXNlNjRFbmNvZGVkLCBlb2YgfSA9IGF3YWl0IGNsaWVudC5zZW5kKCdJTy5yZWFkJywge1xuICAgICAgICAgICAgICAgIGhhbmRsZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGdldFVuaXQ4QXJyYXkoZGF0YSwgYmFzZTY0RW5jb2RlZCA/PyBmYWxzZSkpO1xuICAgICAgICAgICAgaWYgKGVvZikge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdJTy5jbG9zZScsIHsgaGFuZGxlIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZURpYWxvZ1R5cGUodHlwZSkge1xuICAgIGxldCBkaWFsb2dUeXBlID0gbnVsbDtcbiAgICBjb25zdCB2YWxpZERpYWxvZ1R5cGVzID0gbmV3IFNldChbXG4gICAgICAgICdhbGVydCcsXG4gICAgICAgICdjb25maXJtJyxcbiAgICAgICAgJ3Byb21wdCcsXG4gICAgICAgICdiZWZvcmV1bmxvYWQnLFxuICAgIF0pO1xuICAgIGlmICh2YWxpZERpYWxvZ1R5cGVzLmhhcyh0eXBlKSkge1xuICAgICAgICBkaWFsb2dUeXBlID0gdHlwZTtcbiAgICB9XG4gICAgYXNzZXJ0KGRpYWxvZ1R5cGUsIGBVbmtub3duIGphdmFzY3JpcHQgZGlhbG9nIHR5cGU6ICR7dHlwZX1gKTtcbiAgICByZXR1cm4gZGlhbG9nVHlwZTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lb3V0KG1zLCBjYXVzZSkge1xuICAgIHJldHVybiBtcyA9PT0gMFxuICAgICAgICA/IE5FVkVSXG4gICAgICAgIDogdGltZXIobXMpLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXJyb3IoYFRpbWVkIG91dCBhZnRlciB3YWl0aW5nICR7bXN9bXNgLCB7IGNhdXNlIH0pO1xuICAgICAgICB9KSk7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVVRJTElUWV9XT1JMRF9OQU1FID0gJ19fcHVwcGV0ZWVyX3V0aWxpdHlfd29ybGRfXyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU09VUkNFX1VSTF9SRUdFWCA9IC9eW1xcMDQwXFx0XSpcXC9cXC9bQCNdIHNvdXJjZVVSTD1cXHMqKFxcUyo/KVxccyokL207XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U291cmNlVXJsQ29tbWVudCh1cmwpIHtcbiAgICByZXR1cm4gYC8vIyBzb3VyY2VVUkw9JHt1cmx9YDtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBORVRXT1JLX0lETEVfVElNRSA9IDUwMDtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBERk9wdGlvbnMob3B0aW9ucyA9IHt9LCBsZW5ndGhVbml0ID0gJ2luJykge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgZGlzcGxheUhlYWRlckZvb3RlcjogZmFsc2UsXG4gICAgICAgIGhlYWRlclRlbXBsYXRlOiAnJyxcbiAgICAgICAgZm9vdGVyVGVtcGxhdGU6ICcnLFxuICAgICAgICBwcmludEJhY2tncm91bmQ6IGZhbHNlLFxuICAgICAgICBsYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICBwYWdlUmFuZ2VzOiAnJyxcbiAgICAgICAgcHJlZmVyQ1NTUGFnZVNpemU6IGZhbHNlLFxuICAgICAgICBvbWl0QmFja2dyb3VuZDogZmFsc2UsXG4gICAgICAgIG91dGxpbmU6IGZhbHNlLFxuICAgICAgICB0YWdnZWQ6IHRydWUsXG4gICAgICAgIHdhaXRGb3JGb250czogdHJ1ZSxcbiAgICB9O1xuICAgIGxldCB3aWR0aCA9IDguNTtcbiAgICBsZXQgaGVpZ2h0ID0gMTE7XG4gICAgaWYgKG9wdGlvbnMuZm9ybWF0KSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IHBhcGVyRm9ybWF0c1tvcHRpb25zLmZvcm1hdC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgYXNzZXJ0KGZvcm1hdCwgJ1Vua25vd24gcGFwZXIgZm9ybWF0OiAnICsgb3B0aW9ucy5mb3JtYXQpO1xuICAgICAgICB3aWR0aCA9IGZvcm1hdC53aWR0aDtcbiAgICAgICAgaGVpZ2h0ID0gZm9ybWF0LmhlaWdodDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdpZHRoID0gY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy53aWR0aCwgbGVuZ3RoVW5pdCkgPz8gd2lkdGg7XG4gICAgICAgIGhlaWdodCA9XG4gICAgICAgICAgICBjb252ZXJ0UHJpbnRQYXJhbWV0ZXJUb0luY2hlcyhvcHRpb25zLmhlaWdodCwgbGVuZ3RoVW5pdCkgPz8gaGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBtYXJnaW4gPSB7XG4gICAgICAgIHRvcDogY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy5tYXJnaW4/LnRvcCwgbGVuZ3RoVW5pdCkgfHwgMCxcbiAgICAgICAgbGVmdDogY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy5tYXJnaW4/LmxlZnQsIGxlbmd0aFVuaXQpIHx8IDAsXG4gICAgICAgIGJvdHRvbTogY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy5tYXJnaW4/LmJvdHRvbSwgbGVuZ3RoVW5pdCkgfHwgMCxcbiAgICAgICAgcmlnaHQ6IGNvbnZlcnRQcmludFBhcmFtZXRlclRvSW5jaGVzKG9wdGlvbnMubWFyZ2luPy5yaWdodCwgbGVuZ3RoVW5pdCkgfHwgMCxcbiAgICB9O1xuICAgIC8vIFF1aXJrIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTg0MDQ1NSNjNDRcbiAgICBpZiAob3B0aW9ucy5vdXRsaW5lKSB7XG4gICAgICAgIG9wdGlvbnMudGFnZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmYXVsdHMsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIG1hcmdpbixcbiAgICB9O1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHVuaXRUb1BpeGVscyA9IHtcbiAgICBweDogMSxcbiAgICBpbjogOTYsXG4gICAgY206IDM3LjgsXG4gICAgbW06IDMuNzgsXG59O1xuZnVuY3Rpb24gY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMocGFyYW1ldGVyLCBsZW5ndGhVbml0ID0gJ2luJykge1xuICAgIGlmICh0eXBlb2YgcGFyYW1ldGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgcGl4ZWxzO1xuICAgIGlmIChpc051bWJlcihwYXJhbWV0ZXIpKSB7XG4gICAgICAgIC8vIFRyZWF0IG51bWJlcnMgYXMgcGl4ZWwgdmFsdWVzIHRvIGJlIGFsaWduZWQgd2l0aCBwaGFudG9tJ3MgcGFwZXJTaXplLlxuICAgICAgICBwaXhlbHMgPSBwYXJhbWV0ZXI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzU3RyaW5nKHBhcmFtZXRlcikpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IHBhcmFtZXRlcjtcbiAgICAgICAgbGV0IHVuaXQgPSB0ZXh0LnN1YnN0cmluZyh0ZXh0Lmxlbmd0aCAtIDIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCB2YWx1ZVRleHQgPSAnJztcbiAgICAgICAgaWYgKHVuaXQgaW4gdW5pdFRvUGl4ZWxzKSB7XG4gICAgICAgICAgICB2YWx1ZVRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCAtIDIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1bmtub3duIHVuaXQgdHJ5IHRvIHBhcnNlIHRoZSB3aG9sZSBwYXJhbWV0ZXIgYXMgbnVtYmVyIG9mIHBpeGVscy5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHBoYW50b20ncyBwYXBlclNpemUgYmVoYXZpb3IuXG4gICAgICAgICAgICB1bml0ID0gJ3B4JztcbiAgICAgICAgICAgIHZhbHVlVGV4dCA9IHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBOdW1iZXIodmFsdWVUZXh0KTtcbiAgICAgICAgYXNzZXJ0KCFpc05hTih2YWx1ZSksICdGYWlsZWQgdG8gcGFyc2UgcGFyYW1ldGVyIHZhbHVlOiAnICsgdGV4dCk7XG4gICAgICAgIHBpeGVscyA9IHZhbHVlICogdW5pdFRvUGl4ZWxzW3VuaXRdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYWdlLnBkZigpIENhbm5vdCBoYW5kbGUgcGFyYW1ldGVyIHR5cGU6ICcgKyB0eXBlb2YgcGFyYW1ldGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHBpeGVscyAvIHVuaXRUb1BpeGVsc1tsZW5ndGhVbml0XTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRW1pdHRlckV2ZW50KGVtaXR0ZXIsIGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChldmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIGVtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBlbWl0dGVyLm9mZihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQWJvcnRTaWduYWwoc2lnbmFsLCBjYXVzZSkge1xuICAgIHJldHVybiBzaWduYWxcbiAgICAgICAgPyBmcm9tRXZlbnQoc2lnbmFsLCAnYWJvcnQnKS5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgc2lnbmFsLnJlYXNvbi5jYXVzZSA9IGNhdXNlO1xuICAgICAgICAgICAgICAgIHRocm93IHNpZ25hbC5yZWFzb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2lnbmFsLnJlYXNvbiwgeyBjYXVzZSB9KTtcbiAgICAgICAgfSkpXG4gICAgICAgIDogTkVWRVI7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyQXN5bmMocHJlZGljYXRlKSB7XG4gICAgcmV0dXJuIG1lcmdlTWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUocHJlZGljYXRlKHZhbHVlKSkpLnBpcGUoZmlsdGVyKGlzTWF0Y2ggPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGlzTWF0Y2g7XG4gICAgICAgIH0pLCBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaXNOb2RlID0gISEodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MudmVyc2lvbik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbnZpcm9ubWVudC5qcy5tYXAiLCIvKipcbiAqIEphdmFTY3JpcHQgY29kZSB0aGF0IHByb3ZpZGVzIHRoZSBwdXBwZXRlZXIgdXRpbGl0aWVzLiBTZWUgdGhlXG4gKiBbUkVBRE1FXShodHRwczovL2dpdGh1Yi5jb20vcHVwcGV0ZWVyL3B1cHBldGVlci9ibG9iL21haW4vc3JjL2luamVjdGVkL1JFQURNRS5tZClcbiAqIGZvciBpbmplY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBzb3VyY2UgPSBcIlxcXCJ1c2Ugc3RyaWN0XFxcIjt2YXIgZz1PYmplY3QuZGVmaW5lUHJvcGVydHk7dmFyIFg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgQj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczt2YXIgWT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBsPSh0LGUpPT57Zm9yKHZhciByIGluIGUpZyh0LHIse2dldDplW3JdLGVudW1lcmFibGU6ITB9KX0sSj0odCxlLHIsbyk9PntpZihlJiZ0eXBlb2YgZT09XFxcIm9iamVjdFxcXCJ8fHR5cGVvZiBlPT1cXFwiZnVuY3Rpb25cXFwiKWZvcihsZXQgbiBvZiBCKGUpKSFZLmNhbGwodCxuKSYmbiE9PXImJmcodCxuLHtnZXQ6KCk9PmVbbl0sZW51bWVyYWJsZTohKG89WChlLG4pKXx8by5lbnVtZXJhYmxlfSk7cmV0dXJuIHR9O3ZhciB6PXQ9PkooZyh7fSxcXFwiX19lc01vZHVsZVxcXCIse3ZhbHVlOiEwfSksdCk7dmFyIHBlPXt9O2wocGUse2RlZmF1bHQ6KCk9PmhlfSk7bW9kdWxlLmV4cG9ydHM9eihwZSk7dmFyIE49Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHIpe3N1cGVyKGUsciksdGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWV9fSxwPWNsYXNzIGV4dGVuZHMgTnt9O3ZhciBjPWNsYXNzIHR7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gbmV3IHQoZSl9c3RhdGljIGFzeW5jIHJhY2UoZSl7bGV0IHI9bmV3IFNldDt0cnl7bGV0IG89ZS5tYXAobj0+biBpbnN0YW5jZW9mIHQ/KG4uI24mJnIuYWRkKG4pLG4udmFsdWVPclRocm93KCkpOm4pO3JldHVybiBhd2FpdCBQcm9taXNlLnJhY2Uobyl9ZmluYWxseXtmb3IobGV0IG8gb2YgcilvLnJlamVjdChuZXcgRXJyb3IoXFxcIlRpbWVvdXQgY2xlYXJlZFxcXCIpKX19I2U9ITE7I3I9ITE7I287I3Q7I2E9bmV3IFByb21pc2UoZT0+e3RoaXMuI3Q9ZX0pOyNuOyNpO2NvbnN0cnVjdG9yKGUpe2UmJmUudGltZW91dD4wJiYodGhpcy4jaT1uZXcgcChlLm1lc3NhZ2UpLHRoaXMuI249c2V0VGltZW91dCgoKT0+e3RoaXMucmVqZWN0KHRoaXMuI2kpfSxlLnRpbWVvdXQpKX0jbChlKXtjbGVhclRpbWVvdXQodGhpcy4jbiksdGhpcy4jbz1lLHRoaXMuI3QoKX1yZXNvbHZlKGUpe3RoaXMuI3J8fHRoaXMuI2V8fCh0aGlzLiNlPSEwLHRoaXMuI2woZSkpfXJlamVjdChlKXt0aGlzLiNyfHx0aGlzLiNlfHwodGhpcy4jcj0hMCx0aGlzLiNsKGUpKX1yZXNvbHZlZCgpe3JldHVybiB0aGlzLiNlfWZpbmlzaGVkKCl7cmV0dXJuIHRoaXMuI2V8fHRoaXMuI3J9dmFsdWUoKXtyZXR1cm4gdGhpcy4jb30jczt2YWx1ZU9yVGhyb3coKXtyZXR1cm4gdGhpcy4jc3x8KHRoaXMuI3M9KGFzeW5jKCk9PntpZihhd2FpdCB0aGlzLiNhLHRoaXMuI3IpdGhyb3cgdGhpcy4jbztyZXR1cm4gdGhpcy4jb30pKCkpLHRoaXMuI3N9fTt2YXIgTD1uZXcgTWFwLEY9dD0+e2xldCBlPUwuZ2V0KHQpO3JldHVybiBlfHwoZT1uZXcgRnVuY3Rpb24oYHJldHVybiAke3R9YCkoKSxMLnNldCh0LGUpLGUpfTt2YXIgeD17fTtsKHgse2FyaWFRdWVyeVNlbGVjdG9yOigpPT5HLGFyaWFRdWVyeVNlbGVjdG9yQWxsOigpPT5ifSk7dmFyIEc9KHQsZSk9Pmdsb2JhbFRoaXMuX19hcmlhUXVlcnlTZWxlY3Rvcih0LGUpLGI9YXN5bmMgZnVuY3Rpb24qKHQsZSl7eWllbGQqYXdhaXQgZ2xvYmFsVGhpcy5fX2FyaWFRdWVyeVNlbGVjdG9yQWxsKHQsZSl9O3ZhciBFPXt9O2woRSx7Y3NzUXVlcnlTZWxlY3RvcjooKT0+Syxjc3NRdWVyeVNlbGVjdG9yQWxsOigpPT5afSk7dmFyIEs9KHQsZSk9PnQucXVlcnlTZWxlY3RvcihlKSxaPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChlKX07dmFyIEE9e307bChBLHtjdXN0b21RdWVyeVNlbGVjdG9yczooKT0+UH0pO3ZhciB2PWNsYXNzeyNlPW5ldyBNYXA7cmVnaXN0ZXIoZSxyKXtpZighci5xdWVyeU9uZSYmci5xdWVyeUFsbCl7bGV0IG89ci5xdWVyeUFsbDtyLnF1ZXJ5T25lPShuLGkpPT57Zm9yKGxldCBzIG9mIG8obixpKSlyZXR1cm4gcztyZXR1cm4gbnVsbH19ZWxzZSBpZihyLnF1ZXJ5T25lJiYhci5xdWVyeUFsbCl7bGV0IG89ci5xdWVyeU9uZTtyLnF1ZXJ5QWxsPShuLGkpPT57bGV0IHM9byhuLGkpO3JldHVybiBzP1tzXTpbXX19ZWxzZSBpZighci5xdWVyeU9uZXx8IXIucXVlcnlBbGwpdGhyb3cgbmV3IEVycm9yKFxcXCJBdCBsZWFzdCBvbmUgcXVlcnkgbWV0aG9kIG11c3QgYmUgZGVmaW5lZC5cXFwiKTt0aGlzLiNlLnNldChlLHtxdWVyeVNlbGVjdG9yOnIucXVlcnlPbmUscXVlcnlTZWxlY3RvckFsbDpyLnF1ZXJ5QWxsfSl9dW5yZWdpc3RlcihlKXt0aGlzLiNlLmRlbGV0ZShlKX1nZXQoZSl7cmV0dXJuIHRoaXMuI2UuZ2V0KGUpfWNsZWFyKCl7dGhpcy4jZS5jbGVhcigpfX0sUD1uZXcgdjt2YXIgUj17fTtsKFIse3BpZXJjZVF1ZXJ5U2VsZWN0b3I6KCk9PmVlLHBpZXJjZVF1ZXJ5U2VsZWN0b3JBbGw6KCk9PnRlfSk7dmFyIGVlPSh0LGUpPT57bGV0IHI9bnVsbCxvPW49PntsZXQgaT1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKG4sTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO2Rve2xldCBzPWkuY3VycmVudE5vZGU7cy5zaGFkb3dSb290JiZvKHMuc2hhZG93Um9vdCksIShzIGluc3RhbmNlb2YgU2hhZG93Um9vdCkmJnMhPT1uJiYhciYmcy5tYXRjaGVzKGUpJiYocj1zKX13aGlsZSghciYmaS5uZXh0Tm9kZSgpKX07cmV0dXJuIHQgaW5zdGFuY2VvZiBEb2N1bWVudCYmKHQ9dC5kb2N1bWVudEVsZW1lbnQpLG8odCkscn0sdGU9KHQsZSk9PntsZXQgcj1bXSxvPW49PntsZXQgaT1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKG4sTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO2Rve2xldCBzPWkuY3VycmVudE5vZGU7cy5zaGFkb3dSb290JiZvKHMuc2hhZG93Um9vdCksIShzIGluc3RhbmNlb2YgU2hhZG93Um9vdCkmJnMhPT1uJiZzLm1hdGNoZXMoZSkmJnIucHVzaChzKX13aGlsZShpLm5leHROb2RlKCkpfTtyZXR1cm4gdCBpbnN0YW5jZW9mIERvY3VtZW50JiYodD10LmRvY3VtZW50RWxlbWVudCksbyh0KSxyfTt2YXIgdT0odCxlKT0+e2lmKCF0KXRocm93IG5ldyBFcnJvcihlKX07dmFyIHk9Y2xhc3N7I2U7I3I7I287I3Q7Y29uc3RydWN0b3IoZSxyKXt0aGlzLiNlPWUsdGhpcy4jcj1yfWFzeW5jIHN0YXJ0KCl7bGV0IGU9dGhpcy4jdD1jLmNyZWF0ZSgpLHI9YXdhaXQgdGhpcy4jZSgpO2lmKHIpe2UucmVzb2x2ZShyKTtyZXR1cm59dGhpcy4jbz1uZXcgTXV0YXRpb25PYnNlcnZlcihhc3luYygpPT57bGV0IG89YXdhaXQgdGhpcy4jZSgpO28mJihlLnJlc29sdmUobyksYXdhaXQgdGhpcy5zdG9wKCkpfSksdGhpcy4jby5vYnNlcnZlKHRoaXMuI3Ise2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwLGF0dHJpYnV0ZXM6ITB9KX1hc3luYyBzdG9wKCl7dSh0aGlzLiN0LFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jdC5maW5pc2hlZCgpfHx0aGlzLiN0LnJlamVjdChuZXcgRXJyb3IoXFxcIlBvbGxpbmcgc3RvcHBlZFxcXCIpKSx0aGlzLiNvJiYodGhpcy4jby5kaXNjb25uZWN0KCksdGhpcy4jbz12b2lkIDApfXJlc3VsdCgpe3JldHVybiB1KHRoaXMuI3QsXFxcIlBvbGxpbmcgbmV2ZXIgc3RhcnRlZC5cXFwiKSx0aGlzLiN0LnZhbHVlT3JUaHJvdygpfX0sdz1jbGFzc3sjZTsjcjtjb25zdHJ1Y3RvcihlKXt0aGlzLiNlPWV9YXN5bmMgc3RhcnQoKXtsZXQgZT10aGlzLiNyPWMuY3JlYXRlKCkscj1hd2FpdCB0aGlzLiNlKCk7aWYocil7ZS5yZXNvbHZlKHIpO3JldHVybn1sZXQgbz1hc3luYygpPT57aWYoZS5maW5pc2hlZCgpKXJldHVybjtsZXQgbj1hd2FpdCB0aGlzLiNlKCk7aWYoIW4pe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobyk7cmV0dXJufWUucmVzb2x2ZShuKSxhd2FpdCB0aGlzLnN0b3AoKX07d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShvKX1hc3luYyBzdG9wKCl7dSh0aGlzLiNyLFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jci5maW5pc2hlZCgpfHx0aGlzLiNyLnJlamVjdChuZXcgRXJyb3IoXFxcIlBvbGxpbmcgc3RvcHBlZFxcXCIpKX1yZXN1bHQoKXtyZXR1cm4gdSh0aGlzLiNyLFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jci52YWx1ZU9yVGhyb3coKX19LFQ9Y2xhc3N7I2U7I3I7I287I3Q7Y29uc3RydWN0b3IoZSxyKXt0aGlzLiNlPWUsdGhpcy4jcj1yfWFzeW5jIHN0YXJ0KCl7bGV0IGU9dGhpcy4jdD1jLmNyZWF0ZSgpLHI9YXdhaXQgdGhpcy4jZSgpO2lmKHIpe2UucmVzb2x2ZShyKTtyZXR1cm59dGhpcy4jbz1zZXRJbnRlcnZhbChhc3luYygpPT57bGV0IG89YXdhaXQgdGhpcy4jZSgpO28mJihlLnJlc29sdmUobyksYXdhaXQgdGhpcy5zdG9wKCkpfSx0aGlzLiNyKX1hc3luYyBzdG9wKCl7dSh0aGlzLiN0LFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jdC5maW5pc2hlZCgpfHx0aGlzLiN0LnJlamVjdChuZXcgRXJyb3IoXFxcIlBvbGxpbmcgc3RvcHBlZFxcXCIpKSx0aGlzLiNvJiYoY2xlYXJJbnRlcnZhbCh0aGlzLiNvKSx0aGlzLiNvPXZvaWQgMCl9cmVzdWx0KCl7cmV0dXJuIHUodGhpcy4jdCxcXFwiUG9sbGluZyBuZXZlciBzdGFydGVkLlxcXCIpLHRoaXMuI3QudmFsdWVPclRocm93KCl9fTt2YXIgXz17fTtsKF8se1BDb21iaW5hdG9yOigpPT5ILHBRdWVyeVNlbGVjdG9yOigpPT5mZSxwUXVlcnlTZWxlY3RvckFsbDooKT0+JH0pO3ZhciBhPWNsYXNze3N0YXRpYyBhc3luYyptYXAoZSxyKXtmb3IgYXdhaXQobGV0IG8gb2YgZSl5aWVsZCBhd2FpdCByKG8pfXN0YXRpYyBhc3luYypmbGF0TWFwKGUscil7Zm9yIGF3YWl0KGxldCBvIG9mIGUpeWllbGQqcihvKX1zdGF0aWMgYXN5bmMgY29sbGVjdChlKXtsZXQgcj1bXTtmb3IgYXdhaXQobGV0IG8gb2YgZSlyLnB1c2gobyk7cmV0dXJuIHJ9c3RhdGljIGFzeW5jIGZpcnN0KGUpe2ZvciBhd2FpdChsZXQgciBvZiBlKXJldHVybiByfX07dmFyIEM9e307bChDLHt0ZXh0UXVlcnlTZWxlY3RvckFsbDooKT0+bX0pO3ZhciByZT1uZXcgU2V0KFtcXFwiY2hlY2tib3hcXFwiLFxcXCJpbWFnZVxcXCIsXFxcInJhZGlvXFxcIl0pLG9lPXQ9PnQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudHx8dCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnR8fHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50JiYhcmUuaGFzKHQudHlwZSksbmU9bmV3IFNldChbXFxcIlNDUklQVFxcXCIsXFxcIlNUWUxFXFxcIl0pLGY9dD0+IW5lLmhhcyh0Lm5vZGVOYW1lKSYmIWRvY3VtZW50LmhlYWQ/LmNvbnRhaW5zKHQpLEk9bmV3IFdlYWtNYXAsaj10PT57Zm9yKDt0OylJLmRlbGV0ZSh0KSx0IGluc3RhbmNlb2YgU2hhZG93Um9vdD90PXQuaG9zdDp0PXQucGFyZW50Tm9kZX0sVz1uZXcgV2Vha1NldCxzZT1uZXcgTXV0YXRpb25PYnNlcnZlcih0PT57Zm9yKGxldCBlIG9mIHQpaihlLnRhcmdldCl9KSxkPXQ9PntsZXQgZT1JLmdldCh0KTtpZihlfHwoZT17ZnVsbDpcXFwiXFxcIixpbW1lZGlhdGU6W119LCFmKHQpKSlyZXR1cm4gZTtsZXQgcj1cXFwiXFxcIjtpZihvZSh0KSllLmZ1bGw9dC52YWx1ZSxlLmltbWVkaWF0ZS5wdXNoKHQudmFsdWUpLHQuYWRkRXZlbnRMaXN0ZW5lcihcXFwiaW5wdXRcXFwiLG89PntqKG8udGFyZ2V0KX0se29uY2U6ITAsY2FwdHVyZTohMH0pO2Vsc2V7Zm9yKGxldCBvPXQuZmlyc3RDaGlsZDtvO289by5uZXh0U2libGluZyl7aWYoby5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXtlLmZ1bGwrPW8ubm9kZVZhbHVlPz9cXFwiXFxcIixyKz1vLm5vZGVWYWx1ZT8/XFxcIlxcXCI7Y29udGludWV9ciYmZS5pbW1lZGlhdGUucHVzaChyKSxyPVxcXCJcXFwiLG8ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGUuZnVsbCs9ZChvKS5mdWxsKX1yJiZlLmltbWVkaWF0ZS5wdXNoKHIpLHQgaW5zdGFuY2VvZiBFbGVtZW50JiZ0LnNoYWRvd1Jvb3QmJihlLmZ1bGwrPWQodC5zaGFkb3dSb290KS5mdWxsKSxXLmhhcyh0KXx8KHNlLm9ic2VydmUodCx7Y2hpbGRMaXN0OiEwLGNoYXJhY3RlckRhdGE6ITAsc3VidHJlZTohMH0pLFcuYWRkKHQpKX1yZXR1cm4gSS5zZXQodCxlKSxlfTt2YXIgbT1mdW5jdGlvbioodCxlKXtsZXQgcj0hMTtmb3IobGV0IG8gb2YgdC5jaGlsZE5vZGVzKWlmKG8gaW5zdGFuY2VvZiBFbGVtZW50JiZmKG8pKXtsZXQgbjtvLnNoYWRvd1Jvb3Q/bj1tKG8uc2hhZG93Um9vdCxlKTpuPW0obyxlKTtmb3IobGV0IGkgb2Ygbil5aWVsZCBpLHI9ITB9cnx8dCBpbnN0YW5jZW9mIEVsZW1lbnQmJmYodCkmJmQodCkuZnVsbC5pbmNsdWRlcyhlKSYmKHlpZWxkIHQpfTt2YXIgaz17fTtsKGsse2NoZWNrVmlzaWJpbGl0eTooKT0+bGUscGllcmNlOigpPT5TLHBpZXJjZUFsbDooKT0+T30pO3ZhciBpZT1bXFxcImhpZGRlblxcXCIsXFxcImNvbGxhcHNlXFxcIl0sbGU9KHQsZSk9PntpZighdClyZXR1cm4gZT09PSExO2lmKGU9PT12b2lkIDApcmV0dXJuIHQ7bGV0IHI9dC5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFP3QucGFyZW50RWxlbWVudDp0LG89d2luZG93LmdldENvbXB1dGVkU3R5bGUociksbj1vJiYhaWUuaW5jbHVkZXMoby52aXNpYmlsaXR5KSYmIWFlKHIpO3JldHVybiBlPT09bj90OiExfTtmdW5jdGlvbiBhZSh0KXtsZXQgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBlLndpZHRoPT09MHx8ZS5oZWlnaHQ9PT0wfXZhciBjZT10PT5cXFwic2hhZG93Um9vdFxcXCJpbiB0JiZ0LnNoYWRvd1Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290O2Z1bmN0aW9uKlModCl7Y2UodCk/eWllbGQgdC5zaGFkb3dSb290OnlpZWxkIHR9ZnVuY3Rpb24qTyh0KXt0PVModCkubmV4dCgpLnZhbHVlLHlpZWxkIHQ7bGV0IGU9W2RvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIodCxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCldO2ZvcihsZXQgciBvZiBlKXtsZXQgbztmb3IoO289ci5uZXh0Tm9kZSgpOylvLnNoYWRvd1Jvb3QmJih5aWVsZCBvLnNoYWRvd1Jvb3QsZS5wdXNoKGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoby5zaGFkb3dSb290LE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKSkpfX12YXIgUT17fTtsKFEse3hwYXRoUXVlcnlTZWxlY3RvckFsbDooKT0+cX0pO3ZhciBxPWZ1bmN0aW9uKih0LGUscj0tMSl7bGV0IG49KHQub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQpLmV2YWx1YXRlKGUsdCxudWxsLFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9JVEVSQVRPUl9UWVBFKSxpPVtdLHM7Zm9yKDsocz1uLml0ZXJhdGVOZXh0KCkpJiYoaS5wdXNoKHMpLCEociYmaS5sZW5ndGg9PT1yKSk7KTtmb3IobGV0IGg9MDtoPGkubGVuZ3RoO2grKylzPWlbaF0seWllbGQgcyxkZWxldGUgaVtoXX07dmFyIHVlPS9bLVxcXFx3XFxcXFB7QVNDSUl9Kl0vLEg9KHI9PihyLkRlc2NlbmRlbnQ9XFxcIj4+PlxcXCIsci5DaGlsZD1cXFwiPj4+PlxcXCIscikpKEh8fHt9KSxWPXQ9PlxcXCJxdWVyeVNlbGVjdG9yQWxsXFxcImluIHQsTT1jbGFzc3sjZTsjcj1bXTsjbz12b2lkIDA7ZWxlbWVudHM7Y29uc3RydWN0b3IoZSxyKXt0aGlzLmVsZW1lbnRzPVtlXSx0aGlzLiNlPXIsdGhpcy4jdCgpfWFzeW5jIHJ1bigpe2lmKHR5cGVvZiB0aGlzLiNvPT1cXFwic3RyaW5nXFxcIilzd2l0Y2godGhpcy4jby50cmltU3RhcnQoKSl7Y2FzZVxcXCI6c2NvcGVcXFwiOnRoaXMuI3QoKTticmVha31mb3IoO3RoaXMuI28hPT12b2lkIDA7dGhpcy4jdCgpKXtsZXQgZT10aGlzLiNvO3R5cGVvZiBlPT1cXFwic3RyaW5nXFxcIj9lWzBdJiZ1ZS50ZXN0KGVbMF0pP3RoaXMuZWxlbWVudHM9YS5mbGF0TWFwKHRoaXMuZWxlbWVudHMsYXN5bmMgZnVuY3Rpb24qKHIpe1YocikmJih5aWVsZCpyLnF1ZXJ5U2VsZWN0b3JBbGwoZSkpfSk6dGhpcy5lbGVtZW50cz1hLmZsYXRNYXAodGhpcy5lbGVtZW50cyxhc3luYyBmdW5jdGlvbioocil7aWYoIXIucGFyZW50RWxlbWVudCl7aWYoIVYocikpcmV0dXJuO3lpZWxkKnIucXVlcnlTZWxlY3RvckFsbChlKTtyZXR1cm59bGV0IG89MDtmb3IobGV0IG4gb2Ygci5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKWlmKCsrbyxuPT09cilicmVhazt5aWVsZCpyLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChgOnNjb3BlPjpudGgtY2hpbGQoJHtvfSkke2V9YCl9KTp0aGlzLmVsZW1lbnRzPWEuZmxhdE1hcCh0aGlzLmVsZW1lbnRzLGFzeW5jIGZ1bmN0aW9uKihyKXtzd2l0Y2goZS5uYW1lKXtjYXNlXFxcInRleHRcXFwiOnlpZWxkKm0ocixlLnZhbHVlKTticmVhaztjYXNlXFxcInhwYXRoXFxcIjp5aWVsZCpxKHIsZS52YWx1ZSk7YnJlYWs7Y2FzZVxcXCJhcmlhXFxcIjp5aWVsZCpiKHIsZS52YWx1ZSk7YnJlYWs7ZGVmYXVsdDpsZXQgbz1QLmdldChlLm5hbWUpO2lmKCFvKXRocm93IG5ldyBFcnJvcihgVW5rbm93biBzZWxlY3RvciB0eXBlOiAke2UubmFtZX1gKTt5aWVsZCpvLnF1ZXJ5U2VsZWN0b3JBbGwocixlLnZhbHVlKX19KX19I3QoKXtpZih0aGlzLiNyLmxlbmd0aCE9PTApe3RoaXMuI289dGhpcy4jci5zaGlmdCgpO3JldHVybn1pZih0aGlzLiNlLmxlbmd0aD09PTApe3RoaXMuI289dm9pZCAwO3JldHVybn1sZXQgZT10aGlzLiNlLnNoaWZ0KCk7c3dpdGNoKGUpe2Nhc2VcXFwiPj4+PlxcXCI6e3RoaXMuZWxlbWVudHM9YS5mbGF0TWFwKHRoaXMuZWxlbWVudHMsUyksdGhpcy4jdCgpO2JyZWFrfWNhc2VcXFwiPj4+XFxcIjp7dGhpcy5lbGVtZW50cz1hLmZsYXRNYXAodGhpcy5lbGVtZW50cyxPKSx0aGlzLiN0KCk7YnJlYWt9ZGVmYXVsdDp0aGlzLiNyPWUsdGhpcy4jdCgpO2JyZWFrfX19LEQ9Y2xhc3N7I2U9bmV3IFdlYWtNYXA7Y2FsY3VsYXRlKGUscj1bXSl7aWYoZT09PW51bGwpcmV0dXJuIHI7ZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QmJihlPWUuaG9zdCk7bGV0IG89dGhpcy4jZS5nZXQoZSk7aWYobylyZXR1cm5bLi4ubywuLi5yXTtsZXQgbj0wO2ZvcihsZXQgcz1lLnByZXZpb3VzU2libGluZztzO3M9cy5wcmV2aW91c1NpYmxpbmcpKytuO2xldCBpPXRoaXMuY2FsY3VsYXRlKGUucGFyZW50Tm9kZSxbbl0pO3JldHVybiB0aGlzLiNlLnNldChlLGkpLFsuLi5pLC4uLnJdfX0sVT0odCxlKT0+e2lmKHQubGVuZ3RoK2UubGVuZ3RoPT09MClyZXR1cm4gMDtsZXRbcj0tMSwuLi5vXT10LFtuPS0xLC4uLmldPWU7cmV0dXJuIHI9PT1uP1UobyxpKTpyPG4/LTE6MX0sZGU9YXN5bmMgZnVuY3Rpb24qKHQpe2xldCBlPW5ldyBTZXQ7Zm9yIGF3YWl0KGxldCBvIG9mIHQpZS5hZGQobyk7bGV0IHI9bmV3IEQ7eWllbGQqWy4uLmUudmFsdWVzKCldLm1hcChvPT5bbyxyLmNhbGN1bGF0ZShvKV0pLnNvcnQoKFssb10sWyxuXSk9PlUobyxuKSkubWFwKChbb10pPT5vKX0sJD1mdW5jdGlvbih0LGUpe2xldCByPUpTT04ucGFyc2UoZSk7aWYoci5zb21lKG89PntsZXQgbj0wO3JldHVybiBvLnNvbWUoaT0+KHR5cGVvZiBpPT1cXFwic3RyaW5nXFxcIj8rK246bj0wLG4+MSkpfSkpdGhyb3cgbmV3IEVycm9yKFxcXCJNdWx0aXBsZSBkZWVwIGNvbWJpbmF0b3JzIGZvdW5kIGluIHNlcXVlbmNlLlxcXCIpO3JldHVybiBkZShhLmZsYXRNYXAocixvPT57bGV0IG49bmV3IE0odCxvKTtyZXR1cm4gbi5ydW4oKSxuLmVsZW1lbnRzfSkpfSxmZT1hc3luYyBmdW5jdGlvbih0LGUpe2ZvciBhd2FpdChsZXQgciBvZiAkKHQsZSkpcmV0dXJuIHI7cmV0dXJuIG51bGx9O3ZhciBtZT1PYmplY3QuZnJlZXplKHsuLi54LC4uLkEsLi4uUiwuLi5fLC4uLkMsLi4uaywuLi5RLC4uLkUsRGVmZXJyZWQ6YyxjcmVhdGVGdW5jdGlvbjpGLGNyZWF0ZVRleHRDb250ZW50OmQsSW50ZXJ2YWxQb2xsZXI6VCxpc1N1aXRhYmxlTm9kZUZvclRleHRNYXRjaGluZzpmLE11dGF0aW9uUG9sbGVyOnksUkFGUG9sbGVyOnd9KSxoZT1tZTtcXG5cIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluamVjdGVkLmpzLm1hcCIsIi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBwYWNrYWdlVmVyc2lvbiA9ICcyMi4xMy4wJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vYXBpL2FwaS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NkcC9jZHAuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vY29tbW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmV2aXNpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbC91dGlsLmpzJztcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBxdWVyeSBoYW5kbGVyIEFQSSBkZWZpbmVkIG9uIHtAbGluayBQdXBwZXRlZXJ9XG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC1icm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL2luZGV4LWJyb3dzZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub2RlL25vZGUuanMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IG1rZHRlbXAgfSBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjb21wdXRlU3lzdGVtRXhlY3V0YWJsZVBhdGgsIEJyb3dzZXIgYXMgU3VwcG9ydGVkQnJvd3NlcnMsIENocm9tZVJlbGVhc2VDaGFubmVsIGFzIEJyb3dzZXJzQ2hyb21lUmVsZWFzZUNoYW5uZWwsIH0gZnJvbSAnQHB1cHBldGVlci9icm93c2Vycyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgUHJvZHVjdExhdW5jaGVyIH0gZnJvbSAnLi9Qcm9kdWN0TGF1bmNoZXIuanMnO1xuaW1wb3J0IHsgcm0gfSBmcm9tICcuL3V0aWwvZnMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENocm9tZUxhdW5jaGVyIGV4dGVuZHMgUHJvZHVjdExhdW5jaGVyIHtcbiAgICBjb25zdHJ1Y3RvcihwdXBwZXRlZXIpIHtcbiAgICAgICAgc3VwZXIocHVwcGV0ZWVyLCAnY2hyb21lJyk7XG4gICAgfVxuICAgIGxhdW5jaChvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24ubG9nTGV2ZWwgPT09ICd3YXJuJyAmJlxuICAgICAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicgJiZcbiAgICAgICAgICAgIHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNwdXMgPSBvcy5jcHVzKCk7XG4gICAgICAgICAgICBpZiAoY3B1c1swXT8ubW9kZWwuaW5jbHVkZXMoJ0FwcGxlJykpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oW1xuICAgICAgICAgICAgICAgICAgICAnXFx4MUJbMW1cXHgxQls0M21cXHgxQlszMG0nLFxuICAgICAgICAgICAgICAgICAgICAnRGVncmFkZWQgcGVyZm9ybWFuY2Ugd2FybmluZzpcXHgxQlswbVxceDFCWzMzbScsXG4gICAgICAgICAgICAgICAgICAgICdMYXVuY2hpbmcgQ2hyb21lIG9uIE1hYyBTaWxpY29uIChhcm02NCkgZnJvbSBhbiB4NjQgTm9kZSBpbnN0YWxsYXRpb24gcmVzdWx0cyBpbicsXG4gICAgICAgICAgICAgICAgICAgICdSb3NldHRhIHRyYW5zbGF0aW5nIHRoZSBDaHJvbWUgYmluYXJ5LCBldmVuIGlmIENocm9tZSBpcyBhbHJlYWR5IGFybTY0LiBUaGlzIHdvdWxkJyxcbiAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCBpbiBodWdlIHBlcmZvcm1hbmNlIGlzc3Vlcy4gVG8gcmVzb2x2ZSB0aGlzLCB5b3UgbXVzdCBydW4gUHVwcGV0ZWVyIHdpdGgnLFxuICAgICAgICAgICAgICAgICAgICAnYSB2ZXJzaW9uIG9mIE5vZGUgYnVpbHQgZm9yIGFybTY0LicsXG4gICAgICAgICAgICAgICAgXS5qb2luKCdcXG4gICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIubGF1bmNoKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBjb21wdXRlTGF1bmNoQXJndW1lbnRzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGlnbm9yZURlZmF1bHRBcmdzID0gZmFsc2UsIGFyZ3MgPSBbXSwgcGlwZSA9IGZhbHNlLCBkZWJ1Z2dpbmdQb3J0LCBjaGFubmVsLCBleGVjdXRhYmxlUGF0aCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGNocm9tZUFyZ3VtZW50cyA9IFtdO1xuICAgICAgICBpZiAoIWlnbm9yZURlZmF1bHRBcmdzKSB7XG4gICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaCguLi50aGlzLmRlZmF1bHRBcmdzKG9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlnbm9yZURlZmF1bHRBcmdzKSkge1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goLi4udGhpcy5kZWZhdWx0QXJncyhvcHRpb25zKS5maWx0ZXIoYXJnID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIWlnbm9yZURlZmF1bHRBcmdzLmluY2x1ZGVzKGFyZyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaCguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNocm9tZUFyZ3VtZW50cy5zb21lKGFyZ3VtZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcmd1bWVudC5zdGFydHNXaXRoKCctLXJlbW90ZS1kZWJ1Z2dpbmctJyk7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBpZiAocGlwZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydCghZGVidWdnaW5nUG9ydCwgJ0Jyb3dzZXIgc2hvdWxkIGJlIGxhdW5jaGVkIHdpdGggZWl0aGVyIHBpcGUgb3IgZGVidWdnaW5nIHBvcnQgLSBub3QgYm90aC4nKTtcbiAgICAgICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaCgnLS1yZW1vdGUtZGVidWdnaW5nLXBpcGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNocm9tZUFyZ3VtZW50cy5wdXNoKGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke2RlYnVnZ2luZ1BvcnQgfHwgMH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgaXNUZW1wVXNlckRhdGFEaXIgPSBmYWxzZTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSB1c2VyIGRhdGEgZGlyIGFyZ3VtZW50LCB3aGljaCB3aWxsIGFsd2F5cyBiZSBzZXQgZXZlblxuICAgICAgICAvLyB3aXRoIGEgY3VzdG9tIGRpcmVjdG9yeSBzcGVjaWZpZWQgdmlhIHRoZSB1c2VyRGF0YURpciBvcHRpb24uXG4gICAgICAgIGxldCB1c2VyRGF0YURpckluZGV4ID0gY2hyb21lQXJndW1lbnRzLmZpbmRJbmRleChhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFyZy5zdGFydHNXaXRoKCctLXVzZXItZGF0YS1kaXInKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh1c2VyRGF0YURpckluZGV4IDwgMCkge1xuICAgICAgICAgICAgaXNUZW1wVXNlckRhdGFEaXIgPSB0cnVlO1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goYC0tdXNlci1kYXRhLWRpcj0ke2F3YWl0IG1rZHRlbXAodGhpcy5nZXRQcm9maWxlUGF0aCgpKX1gKTtcbiAgICAgICAgICAgIHVzZXJEYXRhRGlySW5kZXggPSBjaHJvbWVBcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VyRGF0YURpciA9IGNocm9tZUFyZ3VtZW50c1t1c2VyRGF0YURpckluZGV4XS5zcGxpdCgnPScsIDIpWzFdO1xuICAgICAgICBhc3NlcnQodHlwZW9mIHVzZXJEYXRhRGlyID09PSAnc3RyaW5nJywgJ2AtLXVzZXItZGF0YS1kaXJgIGlzIG1hbGZvcm1lZCcpO1xuICAgICAgICBsZXQgY2hyb21lRXhlY3V0YWJsZSA9IGV4ZWN1dGFibGVQYXRoO1xuICAgICAgICBpZiAoIWNocm9tZUV4ZWN1dGFibGUpIHtcbiAgICAgICAgICAgIGFzc2VydChjaGFubmVsIHx8ICF0aGlzLnB1cHBldGVlci5faXNQdXBwZXRlZXJDb3JlLCBgQW4gXFxgZXhlY3V0YWJsZVBhdGhcXGAgb3IgXFxgY2hhbm5lbFxcYCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgXFxgcHVwcGV0ZWVyLWNvcmVcXGBgKTtcbiAgICAgICAgICAgIGNocm9tZUV4ZWN1dGFibGUgPSB0aGlzLmV4ZWN1dGFibGVQYXRoKGNoYW5uZWwsIG9wdGlvbnMuaGVhZGxlc3MgPz8gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4ZWN1dGFibGVQYXRoOiBjaHJvbWVFeGVjdXRhYmxlLFxuICAgICAgICAgICAgYXJnczogY2hyb21lQXJndW1lbnRzLFxuICAgICAgICAgICAgaXNUZW1wVXNlckRhdGFEaXIsXG4gICAgICAgICAgICB1c2VyRGF0YURpcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY2xlYW5Vc2VyRGF0YURpcihwYXRoLCBvcHRzKSB7XG4gICAgICAgIGlmIChvcHRzLmlzVGVtcCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBybShwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGRlZmF1bHRBcmdzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZS9jaHJvbWUtbGF1bmNoZXIvYmxvYi9tYWluL2RvY3MvY2hyb21lLWZsYWdzLWZvci10b29scy5tZFxuICAgICAgICBjb25zdCB1c2VyRGlzYWJsZWRGZWF0dXJlcyA9IGdldEZlYXR1cmVzKCctLWRpc2FibGUtZmVhdHVyZXMnLCBvcHRpb25zLmFyZ3MpO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzICYmIHVzZXJEaXNhYmxlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlbW92ZU1hdGNoaW5nRmxhZ3Mob3B0aW9ucy5hcmdzLCAnLS1kaXNhYmxlLWZlYXR1cmVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHVybk9uRXhwZXJpbWVudGFsRmVhdHVyZXNGb3JUZXN0aW5nID0gcHJvY2Vzcy5lbnZbJ1BVUFBFVEVFUl9URVNUX0VYUEVSSU1FTlRBTF9DSFJPTUVfRkVBVFVSRVMnXSA9PT0gJ3RydWUnO1xuICAgICAgICAvLyBNZXJnZSBkZWZhdWx0IGRpc2FibGVkIGZlYXR1cmVzIHdpdGggdXNlci1wcm92aWRlZCBvbmVzLCBpZiBhbnkuXG4gICAgICAgIGNvbnN0IGRpc2FibGVkRmVhdHVyZXMgPSBbXG4gICAgICAgICAgICAnVHJhbnNsYXRlJyxcbiAgICAgICAgICAgIC8vIEFjY2VwdENIRnJhbWUgZGlzYWJsZWQgYmVjYXVzZSBvZiBjcmJ1Zy5jb20vMTM0ODEwNi5cbiAgICAgICAgICAgICdBY2NlcHRDSEZyYW1lJyxcbiAgICAgICAgICAgICdNZWRpYVJvdXRlcicsXG4gICAgICAgICAgICAnT3B0aW1pemF0aW9uSGludHMnLFxuICAgICAgICAgICAgLi4uKHR1cm5PbkV4cGVyaW1lbnRhbEZlYXR1cmVzRm9yVGVzdGluZ1xuICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vMTQ5MjA1M1xuICAgICAgICAgICAgICAgICAgICAnUHJvY2Vzc1BlclNpdGVVcFRvTWFpbkZyYW1lVGhyZXNob2xkJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3B1cHBldGVlci9wdXBwZXRlZXIvaXNzdWVzLzEwNzE1XG4gICAgICAgICAgICAgICAgICAgICdJc29sYXRlU2FuZGJveGVkSWZyYW1lcycsXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAuLi51c2VyRGlzYWJsZWRGZWF0dXJlcyxcbiAgICAgICAgXS5maWx0ZXIoZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmVhdHVyZSAhPT0gJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB1c2VyRW5hYmxlZEZlYXR1cmVzID0gZ2V0RmVhdHVyZXMoJy0tZW5hYmxlLWZlYXR1cmVzJywgb3B0aW9ucy5hcmdzKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncyAmJiB1c2VyRW5hYmxlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlbW92ZU1hdGNoaW5nRmxhZ3Mob3B0aW9ucy5hcmdzLCAnLS1lbmFibGUtZmVhdHVyZXMnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNZXJnZSBkZWZhdWx0IGVuYWJsZWQgZmVhdHVyZXMgd2l0aCB1c2VyLXByb3ZpZGVkIG9uZXMsIGlmIGFueS5cbiAgICAgICAgY29uc3QgZW5hYmxlZEZlYXR1cmVzID0gW1xuICAgICAgICAgICAgJ1BkZk9vcGlmJyxcbiAgICAgICAgICAgIC8vIEFkZCBmZWF0dXJlcyB0byBlbmFibGUgYnkgZGVmYXVsdCBoZXJlLlxuICAgICAgICAgICAgLi4udXNlckVuYWJsZWRGZWF0dXJlcyxcbiAgICAgICAgXS5maWx0ZXIoZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmVhdHVyZSAhPT0gJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjaHJvbWVBcmd1bWVudHMgPSBbXG4gICAgICAgICAgICAnLS1hbGxvdy1wcmUtY29tbWl0LWlucHV0JyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYmFja2dyb3VuZC1uZXR3b3JraW5nJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYmFja2dyb3VuZC10aW1lci10aHJvdHRsaW5nJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYmFja2dyb3VuZGluZy1vY2NsdWRlZC13aW5kb3dzJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYnJlYWtwYWQnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1jbGllbnQtc2lkZS1waGlzaGluZy1kZXRlY3Rpb24nLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1jb21wb25lbnQtZXh0ZW5zaW9ucy13aXRoLWJhY2tncm91bmQtcGFnZXMnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1jb21wb25lbnQtdXBkYXRlJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtZGVmYXVsdC1hcHBzJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtZGV2LXNobS11c2FnZScsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLWV4dGVuc2lvbnMnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1oYW5nLW1vbml0b3InLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1pbmZvYmFycycsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLWlwYy1mbG9vZGluZy1wcm90ZWN0aW9uJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtcG9wdXAtYmxvY2tpbmcnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1wcm9tcHQtb24tcmVwb3N0JyxcbiAgICAgICAgICAgICctLWRpc2FibGUtcmVuZGVyZXItYmFja2dyb3VuZGluZycsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLXNlYXJjaC1lbmdpbmUtY2hvaWNlLXNjcmVlbicsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLXN5bmMnLFxuICAgICAgICAgICAgJy0tZW5hYmxlLWF1dG9tYXRpb24nLFxuICAgICAgICAgICAgJy0tZXhwb3J0LXRhZ2dlZC1wZGYnLFxuICAgICAgICAgICAgJy0tZ2VuZXJhdGUtcGRmLWRvY3VtZW50LW91dGxpbmUnLFxuICAgICAgICAgICAgJy0tZm9yY2UtY29sb3ItcHJvZmlsZT1zcmdiJyxcbiAgICAgICAgICAgICctLW1ldHJpY3MtcmVjb3JkaW5nLW9ubHknLFxuICAgICAgICAgICAgJy0tbm8tZmlyc3QtcnVuJyxcbiAgICAgICAgICAgICctLXBhc3N3b3JkLXN0b3JlPWJhc2ljJyxcbiAgICAgICAgICAgICctLXVzZS1tb2NrLWtleWNoYWluJyxcbiAgICAgICAgICAgIGAtLWRpc2FibGUtZmVhdHVyZXM9JHtkaXNhYmxlZEZlYXR1cmVzLmpvaW4oJywnKX1gLFxuICAgICAgICAgICAgYC0tZW5hYmxlLWZlYXR1cmVzPSR7ZW5hYmxlZEZlYXR1cmVzLmpvaW4oJywnKX1gLFxuICAgICAgICBdLmZpbHRlcihhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFyZyAhPT0gJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB7IGRldnRvb2xzID0gZmFsc2UsIGhlYWRsZXNzID0gIWRldnRvb2xzLCBhcmdzID0gW10sIHVzZXJEYXRhRGlyLCB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKHVzZXJEYXRhRGlyKSB7XG4gICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaChgLS11c2VyLWRhdGEtZGlyPSR7cGF0aC5yZXNvbHZlKHVzZXJEYXRhRGlyKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGV2dG9vbHMpIHtcbiAgICAgICAgICAgIGNocm9tZUFyZ3VtZW50cy5wdXNoKCctLWF1dG8tb3Blbi1kZXZ0b29scy1mb3ItdGFicycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkbGVzcykge1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goaGVhZGxlc3MgPT09ICdzaGVsbCcgPyAnLS1oZWFkbGVzcycgOiAnLS1oZWFkbGVzcz1uZXcnLCAnLS1oaWRlLXNjcm9sbGJhcnMnLCAnLS1tdXRlLWF1ZGlvJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZ3MuZXZlcnkoYXJnID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcmcuc3RhcnRzV2l0aCgnLScpO1xuICAgICAgICB9KSkge1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goJ2Fib3V0OmJsYW5rJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBjaHJvbWVBcmd1bWVudHM7XG4gICAgfVxuICAgIGV4ZWN1dGFibGVQYXRoKGNoYW5uZWwsIGhlYWRsZXNzKSB7XG4gICAgICAgIGlmIChjaGFubmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcHV0ZVN5c3RlbUV4ZWN1dGFibGVQYXRoKHtcbiAgICAgICAgICAgICAgICBicm93c2VyOiBTdXBwb3J0ZWRCcm93c2Vycy5DSFJPTUUsXG4gICAgICAgICAgICAgICAgY2hhbm5lbDogY29udmVydFB1cHBldGVlckNoYW5uZWxUb0Jyb3dzZXJzQ2hhbm5lbChjaGFubmVsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUV4ZWN1dGFibGVQYXRoKGhlYWRsZXNzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbnZlcnRQdXBwZXRlZXJDaGFubmVsVG9Ccm93c2Vyc0NoYW5uZWwoY2hhbm5lbCkge1xuICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICBjYXNlICdjaHJvbWUnOlxuICAgICAgICAgICAgcmV0dXJuIEJyb3dzZXJzQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFO1xuICAgICAgICBjYXNlICdjaHJvbWUtZGV2JzpcbiAgICAgICAgICAgIHJldHVybiBCcm93c2Vyc0Nocm9tZVJlbGVhc2VDaGFubmVsLkRFVjtcbiAgICAgICAgY2FzZSAnY2hyb21lLWJldGEnOlxuICAgICAgICAgICAgcmV0dXJuIEJyb3dzZXJzQ2hyb21lUmVsZWFzZUNoYW5uZWwuQkVUQTtcbiAgICAgICAgY2FzZSAnY2hyb21lLWNhbmFyeSc6XG4gICAgICAgICAgICByZXR1cm4gQnJvd3NlcnNDaHJvbWVSZWxlYXNlQ2hhbm5lbC5DQU5BUlk7XG4gICAgfVxufVxuLyoqXG4gKiBFeHRyYWN0cyBhbGwgZmVhdHVyZXMgZnJvbSB0aGUgZ2l2ZW4gY29tbWFuZC1saW5lIGZsYWdcbiAqIChlLmcuIGAtLWVuYWJsZS1mZWF0dXJlc2AsIGAtLWVuYWJsZS1mZWF0dXJlcz1gKS5cbiAqXG4gKiBFeGFtcGxlIGlucHV0OlxuICogW1wiLS1lbmFibGUtZmVhdHVyZXM9TmV0d29ya1NlcnZpY2UsTmV0d29ya1NlcnZpY2VJblByb2Nlc3NcIiwgXCItLWVuYWJsZS1mZWF0dXJlcz1Gb29cIl1cbiAqXG4gKiBFeGFtcGxlIG91dHB1dDpcbiAqIFtcIk5ldHdvcmtTZXJ2aWNlXCIsIFwiTmV0d29ya1NlcnZpY2VJblByb2Nlc3NcIiwgXCJGb29cIl1cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZlYXR1cmVzKGZsYWcsIG9wdGlvbnMgPSBbXSkge1xuICAgIHJldHVybiBvcHRpb25zXG4gICAgICAgIC5maWx0ZXIocyA9PiB7XG4gICAgICAgIHJldHVybiBzLnN0YXJ0c1dpdGgoZmxhZy5lbmRzV2l0aCgnPScpID8gZmxhZyA6IGAke2ZsYWd9PWApO1xuICAgIH0pXG4gICAgICAgIC5tYXAocyA9PiB7XG4gICAgICAgIHJldHVybiBzLnNwbGl0KG5ldyBSZWdFeHAoYCR7ZmxhZ309XFxcXHMqYCkpWzFdPy50cmltKCk7XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihzID0+IHtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfSk7XG59XG4vKipcbiAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGluLXBsYWNlIGZyb20gdGhlIGdpdmVuIHN0cmluZyBhcnJheVxuICogdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gY29tbWFuZC1saW5lIGZsYWcuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVNYXRjaGluZ0ZsYWdzKGFycmF5LCBmbGFnKSB7XG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtmbGFnfT0uKmApO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICBpZiAocmVnZXgudGVzdChhcnJheVtpXSkpIHtcbiAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaHJvbWVMYXVuY2hlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IHJlbmFtZSwgdW5saW5rLCBta2R0ZW1wIH0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQnJvd3NlciBhcyBTdXBwb3J0ZWRCcm93c2VycywgY3JlYXRlUHJvZmlsZSwgQ2FjaGUsIGRldGVjdEJyb3dzZXJQbGF0Zm9ybSwgQnJvd3NlciwgfSBmcm9tICdAcHVwcGV0ZWVyL2Jyb3dzZXJzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBQcm9kdWN0TGF1bmNoZXIgfSBmcm9tICcuL1Byb2R1Y3RMYXVuY2hlci5qcyc7XG5pbXBvcnQgeyBybSB9IGZyb20gJy4vdXRpbC9mcy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRmlyZWZveExhdW5jaGVyIGV4dGVuZHMgUHJvZHVjdExhdW5jaGVyIHtcbiAgICBjb25zdHJ1Y3RvcihwdXBwZXRlZXIpIHtcbiAgICAgICAgc3VwZXIocHVwcGV0ZWVyLCAnZmlyZWZveCcpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0UHJlZmVyZW5jZXMoZXh0cmFQcmVmc0ZpcmVmb3gsIHByb3RvY29sKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5leHRyYVByZWZzRmlyZWZveCxcbiAgICAgICAgICAgIC4uLihwcm90b2NvbCA9PT0gJ3dlYkRyaXZlckJpRGknXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZW5hYmxlIHRoZSBXZWJEcml2ZXIgQmlEaSBwcm90b2NvbFxuICAgICAgICAgICAgICAgICAgICAncmVtb3RlLmFjdGl2ZS1wcm90b2NvbHMnOiAxLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGNsb3NlIHRoZSB3aW5kb3cgd2hlbiB0aGUgbGFzdCB0YWIgZ2V0cyBjbG9zZWRcbiAgICAgICAgICAgICAgICAgICAgJ2Jyb3dzZXIudGFicy5jbG9zZVdpbmRvd1dpdGhMYXN0VGFiJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgdmFyaW91cyBlcnJvciBtZXNzYWdlIG9uIHRoZSBjb25zb2xlXG4gICAgICAgICAgICAgICAgICAgIC8vIGplc3QtcHVwcGV0ZWVyIGFzc2VydHMgdGhhdCBubyBlcnJvciBtZXNzYWdlIGlzIGVtaXR0ZWQgYnkgdGhlIGNvbnNvbGVcbiAgICAgICAgICAgICAgICAgICAgJ25ldHdvcmsuY29va2llLmNvb2tpZUJlaGF2aW9yJzogMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gVGVtcG9yYXJpbHkgZm9yY2UgZGlzYWJsZSBCRkNhY2hlIGluIHBhcmVudCAoaHR0cHM6Ly9iaXQubHkvYnVnLTE3MzIyNjMpXG4gICAgICAgICAgICAgICAgICAgICdmaXNzaW9uLmJmY2FjaGVJblBhcmVudCc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGVuYWJsZSB0aGUgQ0RQIHByb3RvY29sXG4gICAgICAgICAgICAgICAgICAgICdyZW1vdGUuYWN0aXZlLXByb3RvY29scyc6IDIsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAvLyBGb3JjZSBhbGwgd2ViIGNvbnRlbnQgdG8gdXNlIGEgc2luZ2xlIGNvbnRlbnQgcHJvY2Vzcy4gVE9ETzogcmVtb3ZlXG4gICAgICAgICAgICAvLyB0aGlzIG9uY2UgRmlyZWZveCBzdXBwb3J0cyBtb3VzZSBldmVudCBkaXNwYXRjaCBmcm9tIHRoZSBtYWluIGZyYW1lXG4gICAgICAgICAgICAvLyBjb250ZXh0LiBPbmNlIHRoaXMgaGFwcGVucywgd2ViQ29udGVudElzb2xhdGlvblN0cmF0ZWd5IHNob3VsZCBvbmx5XG4gICAgICAgICAgICAvLyBiZSBzZXQgZm9yIENEUC4gU2VlXG4gICAgICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzczMzkzXG4gICAgICAgICAgICAnZmlzc2lvbi53ZWJDb250ZW50SXNvbGF0aW9uU3RyYXRlZ3knOiAwLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBjb21wdXRlTGF1bmNoQXJndW1lbnRzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGlnbm9yZURlZmF1bHRBcmdzID0gZmFsc2UsIGFyZ3MgPSBbXSwgZXhlY3V0YWJsZVBhdGgsIHBpcGUgPSBmYWxzZSwgZXh0cmFQcmVmc0ZpcmVmb3ggPSB7fSwgZGVidWdnaW5nUG9ydCA9IG51bGwsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBmaXJlZm94QXJndW1lbnRzID0gW107XG4gICAgICAgIGlmICghaWdub3JlRGVmYXVsdEFyZ3MpIHtcbiAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCguLi50aGlzLmRlZmF1bHRBcmdzKG9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlnbm9yZURlZmF1bHRBcmdzKSkge1xuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKC4uLnRoaXMuZGVmYXVsdEFyZ3Mob3B0aW9ucykuZmlsdGVyKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFpZ25vcmVEZWZhdWx0QXJncy5pbmNsdWRlcyhhcmcpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmlyZWZveEFyZ3VtZW50cy5zb21lKGFyZ3VtZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcmd1bWVudC5zdGFydHNXaXRoKCctLXJlbW90ZS1kZWJ1Z2dpbmctJyk7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBpZiAocGlwZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydChkZWJ1Z2dpbmdQb3J0ID09PSBudWxsLCAnQnJvd3NlciBzaG91bGQgYmUgbGF1bmNoZWQgd2l0aCBlaXRoZXIgcGlwZSBvciBkZWJ1Z2dpbmcgcG9ydCAtIG5vdCBib3RoLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke2RlYnVnZ2luZ1BvcnQgfHwgMH1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdXNlckRhdGFEaXI7XG4gICAgICAgIGxldCBpc1RlbXBVc2VyRGF0YURpciA9IHRydWU7XG4gICAgICAgIC8vIENoZWNrIGZvciB0aGUgcHJvZmlsZSBhcmd1bWVudCwgd2hpY2ggd2lsbCBhbHdheXMgYmUgc2V0IGV2ZW5cbiAgICAgICAgLy8gd2l0aCBhIGN1c3RvbSBkaXJlY3Rvcnkgc3BlY2lmaWVkIHZpYSB0aGUgdXNlckRhdGFEaXIgb3B0aW9uLlxuICAgICAgICBjb25zdCBwcm9maWxlQXJnSW5kZXggPSBmaXJlZm94QXJndW1lbnRzLmZpbmRJbmRleChhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFsnLXByb2ZpbGUnLCAnLS1wcm9maWxlJ10uaW5jbHVkZXMoYXJnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwcm9maWxlQXJnSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB1c2VyRGF0YURpciA9IGZpcmVmb3hBcmd1bWVudHNbcHJvZmlsZUFyZ0luZGV4ICsgMV07XG4gICAgICAgICAgICBpZiAoIXVzZXJEYXRhRGlyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXJlZm94IHByb2ZpbGUgbm90IGZvdW5kIGF0ICcke3VzZXJEYXRhRGlyfSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBjdXN0b20gRmlyZWZveCBwcm9maWxlIGl0IG5lZWRzIHRvIGJlIHBvcHVsYXRlZFxuICAgICAgICAgICAgLy8gd2l0aCByZXF1aXJlZCBwcmVmZXJlbmNlcy5cbiAgICAgICAgICAgIGlzVGVtcFVzZXJEYXRhRGlyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1c2VyRGF0YURpciA9IGF3YWl0IG1rZHRlbXAodGhpcy5nZXRQcm9maWxlUGF0aCgpKTtcbiAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCgnLS1wcm9maWxlJyk7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2godXNlckRhdGFEaXIpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNyZWF0ZVByb2ZpbGUoU3VwcG9ydGVkQnJvd3NlcnMuRklSRUZPWCwge1xuICAgICAgICAgICAgcGF0aDogdXNlckRhdGFEaXIsXG4gICAgICAgICAgICBwcmVmZXJlbmNlczogRmlyZWZveExhdW5jaGVyLmdldFByZWZlcmVuY2VzKGV4dHJhUHJlZnNGaXJlZm94LCBvcHRpb25zLnByb3RvY29sKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBmaXJlZm94RXhlY3V0YWJsZTtcbiAgICAgICAgaWYgKHRoaXMucHVwcGV0ZWVyLl9pc1B1cHBldGVlckNvcmUgfHwgZXhlY3V0YWJsZVBhdGgpIHtcbiAgICAgICAgICAgIGFzc2VydChleGVjdXRhYmxlUGF0aCwgYEFuIFxcYGV4ZWN1dGFibGVQYXRoXFxgIG11c3QgYmUgc3BlY2lmaWVkIGZvciBcXGBwdXBwZXRlZXItY29yZVxcYGApO1xuICAgICAgICAgICAgZmlyZWZveEV4ZWN1dGFibGUgPSBleGVjdXRhYmxlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZpcmVmb3hFeGVjdXRhYmxlID0gdGhpcy5leGVjdXRhYmxlUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1RlbXBVc2VyRGF0YURpcixcbiAgICAgICAgICAgIHVzZXJEYXRhRGlyLFxuICAgICAgICAgICAgYXJnczogZmlyZWZveEFyZ3VtZW50cyxcbiAgICAgICAgICAgIGV4ZWN1dGFibGVQYXRoOiBmaXJlZm94RXhlY3V0YWJsZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY2xlYW5Vc2VyRGF0YURpcih1c2VyRGF0YURpciwgb3B0cykge1xuICAgICAgICBpZiAob3B0cy5pc1RlbXApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcm0odXNlckRhdGFEaXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZGVidWdFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gYW4gZXhpc3RpbmcgdXNlciBwcm9maWxlIGhhcyBiZWVuIHVzZWQgcmVtb3ZlIHRoZSB1c2VyXG4gICAgICAgICAgICAgICAgLy8gcHJlZmVyZW5jZXMgZmlsZSBhbmQgcmVzdG9yZSBwb3NzaWJseSBiYWNrdXBlZCBwcmVmZXJlbmNlcy5cbiAgICAgICAgICAgICAgICBhd2FpdCB1bmxpbmsocGF0aC5qb2luKHVzZXJEYXRhRGlyLCAndXNlci5qcycpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVmc0JhY2t1cFBhdGggPSBwYXRoLmpvaW4odXNlckRhdGFEaXIsICdwcmVmcy5qcy5wdXBwZXRlZXInKTtcbiAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwcmVmc0JhY2t1cFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZzUGF0aCA9IHBhdGguam9pbih1c2VyRGF0YURpciwgJ3ByZWZzLmpzJyk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHVubGluayhwcmVmc1BhdGgpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZW5hbWUocHJlZnNCYWNrdXBQYXRoLCBwcmVmc1BhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGV4ZWN1dGFibGVQYXRoKCkge1xuICAgICAgICAvLyByZXBsYWNlICdsYXRlc3QnIHBsYWNlaG9sZGVyIHdpdGggYWN0dWFsIGRvd25sb2FkZWQgcmV2aXNpb25cbiAgICAgICAgaWYgKHRoaXMucHVwcGV0ZWVyLmJyb3dzZXJSZXZpc2lvbiA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IENhY2hlKHRoaXMucHVwcGV0ZWVyLmRlZmF1bHREb3dubG9hZFBhdGgpO1xuICAgICAgICAgICAgY29uc3QgaW5zdGFsbGVkRmlyZWZveCA9IGNhY2hlLmdldEluc3RhbGxlZEJyb3dzZXJzKCkuZmluZChicm93c2VyID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGJyb3dzZXIucGxhdGZvcm0gPT09IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSgpICYmXG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXIuYnJvd3NlciA9PT0gQnJvd3Nlci5GSVJFRk9YKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGluc3RhbGxlZEZpcmVmb3gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbEJyb3dzZXJSZXZpc2lvbiA9IGluc3RhbGxlZEZpcmVmb3guYnVpbGRJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlRXhlY3V0YWJsZVBhdGgoKTtcbiAgICB9XG4gICAgZGVmYXVsdEFyZ3Mob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgZGV2dG9vbHMgPSBmYWxzZSwgaGVhZGxlc3MgPSAhZGV2dG9vbHMsIGFyZ3MgPSBbXSwgdXNlckRhdGFEaXIgPSBudWxsLCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZmlyZWZveEFyZ3VtZW50cyA9IFsnLS1uby1yZW1vdGUnXTtcbiAgICAgICAgc3dpdGNoIChvcy5wbGF0Zm9ybSgpKSB7XG4gICAgICAgICAgICBjYXNlICdkYXJ3aW4nOlxuICAgICAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCgnLS1mb3JlZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3aW4zMic6XG4gICAgICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKCctLXdhaXQtZm9yLWJyb3dzZXInKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlckRhdGFEaXIpIHtcbiAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCgnLS1wcm9maWxlJyk7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2godXNlckRhdGFEaXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkbGVzcykge1xuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKCctLWhlYWRsZXNzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRldnRvb2xzKSB7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2goJy0tZGV2dG9vbHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJncy5ldmVyeShhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFyZy5zdGFydHNXaXRoKCctJyk7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2goJ2Fib3V0OmJsYW5rJyk7XG4gICAgICAgIH1cbiAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICByZXR1cm4gZmlyZWZveEFyZ3VtZW50cztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaXJlZm94TGF1bmNoZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxhdW5jaE9wdGlvbnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBOb2RlV2ViU29ja2V0IGZyb20gJ3dzJztcbmltcG9ydCB7IHBhY2thZ2VWZXJzaW9uIH0gZnJvbSAnLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE5vZGVXZWJTb2NrZXRUcmFuc3BvcnQge1xuICAgIHN0YXRpYyBjcmVhdGUodXJsLCBoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3cyA9IG5ldyBOb2RlV2ViU29ja2V0KHVybCwgW10sIHtcbiAgICAgICAgICAgICAgICBmb2xsb3dSZWRpcmVjdHM6IHRydWUsXG4gICAgICAgICAgICAgICAgcGVyTWVzc2FnZURlZmxhdGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvYmxvYi9tYXN0ZXIvZG9jL3dzLm1kI25ldy13ZWJzb2NrZXRhZGRyZXNzLXByb3RvY29scy1vcHRpb25zXG4gICAgICAgICAgICAgICAgYWxsb3dTeW5jaHJvbm91c0V2ZW50czogZmFsc2UsXG4gICAgICAgICAgICAgICAgbWF4UGF5bG9hZDogMjU2ICogMTAyNCAqIDEwMjQsIC8vIDI1Nk1iXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IGBQdXBwZXRlZXIgJHtwYWNrYWdlVmVyc2lvbn1gLFxuICAgICAgICAgICAgICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobmV3IE5vZGVXZWJTb2NrZXRUcmFuc3BvcnQod3MpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgI3dzO1xuICAgIG9ubWVzc2FnZTtcbiAgICBvbmNsb3NlO1xuICAgIGNvbnN0cnVjdG9yKHdzKSB7XG4gICAgICAgIHRoaXMuI3dzID0gd3M7XG4gICAgICAgIHRoaXMuI3dzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vbm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9ubWVzc2FnZS5jYWxsKG51bGwsIGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jd3MuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vbmNsb3NlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNsb3NlLmNhbGwobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBTaWxlbnRseSBpZ25vcmUgYWxsIGVycm9ycyAtIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoZW0uXG4gICAgICAgIHRoaXMuI3dzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4geyB9KTtcbiAgICB9XG4gICAgc2VuZChtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuI3dzLnNlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLiN3cy5jbG9zZSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vZGVXZWJTb2NrZXRUcmFuc3BvcnQuanMubWFwIiwiaW1wb3J0IHsgRXZlbnRTdWJzY3JpcHRpb24gfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2sgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBpcGVUcmFuc3BvcnQge1xuICAgICNwaXBlV3JpdGU7XG4gICAgI3N1YnNjcmlwdGlvbnMgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgI2lzQ2xvc2VkID0gZmFsc2U7XG4gICAgI3BlbmRpbmdNZXNzYWdlID0gJyc7XG4gICAgb25jbG9zZTtcbiAgICBvbm1lc3NhZ2U7XG4gICAgY29uc3RydWN0b3IocGlwZVdyaXRlLCBwaXBlUmVhZCkge1xuICAgICAgICB0aGlzLiNwaXBlV3JpdGUgPSBwaXBlV3JpdGU7XG4gICAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbnMudXNlKG5ldyBFdmVudFN1YnNjcmlwdGlvbihwaXBlUmVhZCwgJ2RhdGEnLCAoYnVmZmVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZGlzcGF0Y2goYnVmZmVyKTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRTdWJzY3JpcHRpb24ocGlwZVJlYWQsICdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uY2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2xvc2UuY2FsbChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRTdWJzY3JpcHRpb24ocGlwZVJlYWQsICdlcnJvcicsIGRlYnVnRXJyb3IpKTtcbiAgICAgICAgdGhpcy4jc3Vic2NyaXB0aW9ucy51c2UobmV3IEV2ZW50U3Vic2NyaXB0aW9uKHBpcGVXcml0ZSwgJ2Vycm9yJywgZGVidWdFcnJvcikpO1xuICAgIH1cbiAgICBzZW5kKG1lc3NhZ2UpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNpc0Nsb3NlZCwgJ2BQaXBlVHJhbnNwb3J0YCBpcyBjbG9zZWQuJyk7XG4gICAgICAgIHRoaXMuI3BpcGVXcml0ZS53cml0ZShtZXNzYWdlKTtcbiAgICAgICAgdGhpcy4jcGlwZVdyaXRlLndyaXRlKCdcXDAnKTtcbiAgICB9XG4gICAgI2Rpc3BhdGNoKGJ1ZmZlcikge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2lzQ2xvc2VkLCAnYFBpcGVUcmFuc3BvcnRgIGlzIGNsb3NlZC4nKTtcbiAgICAgICAgbGV0IGVuZCA9IGJ1ZmZlci5pbmRleE9mKCdcXDAnKTtcbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuI3BlbmRpbmdNZXNzYWdlICs9IGJ1ZmZlci50b1N0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLiNwZW5kaW5nTWVzc2FnZSArIGJ1ZmZlci50b1N0cmluZyh1bmRlZmluZWQsIDAsIGVuZCk7XG4gICAgICAgIGlmICh0aGlzLm9ubWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2UuY2FsbChudWxsLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnQgPSBlbmQgKyAxO1xuICAgICAgICBlbmQgPSBidWZmZXIuaW5kZXhPZignXFwwJywgc3RhcnQpO1xuICAgICAgICB3aGlsZSAoZW5kICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub25tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2UuY2FsbChudWxsLCBidWZmZXIudG9TdHJpbmcodW5kZWZpbmVkLCBzdGFydCwgZW5kKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7XG4gICAgICAgICAgICBlbmQgPSBidWZmZXIuaW5kZXhPZignXFwwJywgc3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3BlbmRpbmdNZXNzYWdlID0gYnVmZmVyLnRvU3RyaW5nKHVuZGVmaW5lZCwgc3RhcnQpO1xuICAgIH1cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy4jaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLmRpc3Bvc2UoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QaXBlVHJhbnNwb3J0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQnJvd3NlciBhcyBJbnN0YWxsZWRCcm93c2VyLCBDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBsYXVuY2gsIFRpbWVvdXRFcnJvciBhcyBCcm93c2Vyc1RpbWVvdXRFcnJvciwgV0VCRFJJVkVSX0JJRElfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBjb21wdXRlRXhlY3V0YWJsZVBhdGgsIH0gZnJvbSAnQHB1cHBldGVlci9icm93c2Vycyc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgbWFwLCByYWNlLCB0aW1lciwgfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMnO1xuaW1wb3J0IHsgQ2RwQnJvd3NlciB9IGZyb20gJy4uL2NkcC9Ccm93c2VyLmpzJztcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuLi9jZHAvQ29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBUaW1lb3V0RXJyb3IgfSBmcm9tICcuLi9jb21tb24vRXJyb3JzLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIERFRkFVTFRfVklFV1BPUlQgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBOb2RlV2ViU29ja2V0VHJhbnNwb3J0IGFzIFdlYlNvY2tldFRyYW5zcG9ydCB9IGZyb20gJy4vTm9kZVdlYlNvY2tldFRyYW5zcG9ydC5qcyc7XG5pbXBvcnQgeyBQaXBlVHJhbnNwb3J0IH0gZnJvbSAnLi9QaXBlVHJhbnNwb3J0LmpzJztcbi8qKlxuICogRGVzY3JpYmVzIGEgbGF1bmNoZXIgLSBhIGNsYXNzIHRoYXQgaXMgYWJsZSB0byBjcmVhdGUgYW5kIGxhdW5jaCBhIGJyb3dzZXIgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUHJvZHVjdExhdW5jaGVyIHtcbiAgICAjcHJvZHVjdDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdXBwZXRlZXI7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYWN0dWFsQnJvd3NlclJldmlzaW9uO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHB1cHBldGVlciwgcHJvZHVjdCkge1xuICAgICAgICB0aGlzLnB1cHBldGVlciA9IHB1cHBldGVlcjtcbiAgICAgICAgdGhpcy4jcHJvZHVjdCA9IHByb2R1Y3Q7XG4gICAgfVxuICAgIGdldCBwcm9kdWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvZHVjdDtcbiAgICB9XG4gICAgYXN5bmMgbGF1bmNoKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGR1bXBpbyA9IGZhbHNlLCBlbnYgPSBwcm9jZXNzLmVudiwgaGFuZGxlU0lHSU5UID0gdHJ1ZSwgaGFuZGxlU0lHVEVSTSA9IHRydWUsIGhhbmRsZVNJR0hVUCA9IHRydWUsIGlnbm9yZUhUVFBTRXJyb3JzID0gZmFsc2UsIGRlZmF1bHRWaWV3cG9ydCA9IERFRkFVTFRfVklFV1BPUlQsIHNsb3dNbyA9IDAsIHRpbWVvdXQgPSAzMDAwMCwgd2FpdEZvckluaXRpYWxQYWdlID0gdHJ1ZSwgcHJvdG9jb2xUaW1lb3V0LCBwcm90b2NvbCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGxhdW5jaEFyZ3MgPSBhd2FpdCB0aGlzLmNvbXB1dGVMYXVuY2hBcmd1bWVudHMob3B0aW9ucyk7XG4gICAgICAgIGlmICghZXhpc3RzU3luYyhsYXVuY2hBcmdzLmV4ZWN1dGFibGVQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm93c2VyIHdhcyBub3QgZm91bmQgYXQgdGhlIGNvbmZpZ3VyZWQgZXhlY3V0YWJsZVBhdGggKCR7bGF1bmNoQXJncy5leGVjdXRhYmxlUGF0aH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlUGlwZSA9IGxhdW5jaEFyZ3MuYXJncy5pbmNsdWRlcygnLS1yZW1vdGUtZGVidWdnaW5nLXBpcGUnKTtcbiAgICAgICAgY29uc3Qgb25Qcm9jZXNzRXhpdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYW5Vc2VyRGF0YURpcihsYXVuY2hBcmdzLnVzZXJEYXRhRGlyLCB7XG4gICAgICAgICAgICAgICAgaXNUZW1wOiBsYXVuY2hBcmdzLmlzVGVtcFVzZXJEYXRhRGlyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLiNwcm9kdWN0ID09PSAnZmlyZWZveCcgJiZcbiAgICAgICAgICAgIHByb3RvY29sICE9PSAnd2ViRHJpdmVyQmlEaScgJiZcbiAgICAgICAgICAgIHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24ubG9nTGV2ZWwgPT09ICd3YXJuJykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2wgKENEUCkgc3VwcG9ydCBmb3IgRmlyZWZveCBpcyBkZXByZWNhdGVkIGluIFB1cHBldGVlciBgICtcbiAgICAgICAgICAgICAgICBgYW5kIGl0IHdpbGwgYmUgZXZlbnR1YWxseSByZW1vdmVkLiBgICtcbiAgICAgICAgICAgICAgICBgVXNlIFdlYkRyaXZlciBCaURpIGluc3RlYWQgKHNlZSBodHRwczovL3BwdHIuZGV2L3dlYmRyaXZlci1iaWRpI2dldC1zdGFydGVkKS5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBicm93c2VyUHJvY2VzcyA9IGxhdW5jaCh7XG4gICAgICAgICAgICBleGVjdXRhYmxlUGF0aDogbGF1bmNoQXJncy5leGVjdXRhYmxlUGF0aCxcbiAgICAgICAgICAgIGFyZ3M6IGxhdW5jaEFyZ3MuYXJncyxcbiAgICAgICAgICAgIGhhbmRsZVNJR0hVUCxcbiAgICAgICAgICAgIGhhbmRsZVNJR1RFUk0sXG4gICAgICAgICAgICBoYW5kbGVTSUdJTlQsXG4gICAgICAgICAgICBkdW1waW8sXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICBwaXBlOiB1c2VQaXBlLFxuICAgICAgICAgICAgb25FeGl0OiBvblByb2Nlc3NFeGl0LFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGJyb3dzZXI7XG4gICAgICAgIGxldCBjZHBDb25uZWN0aW9uO1xuICAgICAgICBsZXQgY2xvc2luZyA9IGZhbHNlO1xuICAgICAgICBjb25zdCBicm93c2VyQ2xvc2VDYWxsYmFjayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChjbG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xvc2luZyA9IHRydWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlQnJvd3Nlcihicm93c2VyUHJvY2VzcywgY2RwQ29ubmVjdGlvbik7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jcHJvZHVjdCA9PT0gJ2ZpcmVmb3gnICYmIHByb3RvY29sID09PSAnd2ViRHJpdmVyQmlEaScpIHtcbiAgICAgICAgICAgICAgICBicm93c2VyID0gYXdhaXQgdGhpcy5jcmVhdGVCaURpQnJvd3Nlcihicm93c2VyUHJvY2VzcywgYnJvd3NlckNsb3NlQ2FsbGJhY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xUaW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICBzbG93TW8sXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodXNlUGlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjZHBDb25uZWN0aW9uID0gYXdhaXQgdGhpcy5jcmVhdGVDZHBQaXBlQ29ubmVjdGlvbihicm93c2VyUHJvY2Vzcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sVGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3dNbyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjZHBDb25uZWN0aW9uID0gYXdhaXQgdGhpcy5jcmVhdGVDZHBTb2NrZXRDb25uZWN0aW9uKGJyb3dzZXJQcm9jZXNzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xUaW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2xvd01vLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb3RvY29sID09PSAnd2ViRHJpdmVyQmlEaScpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlciA9IGF3YWl0IHRoaXMuY3JlYXRlQmlEaU92ZXJDZHBCcm93c2VyKGJyb3dzZXJQcm9jZXNzLCBjZHBDb25uZWN0aW9uLCBicm93c2VyQ2xvc2VDYWxsYmFjaywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlciA9IGF3YWl0IENkcEJyb3dzZXIuX2NyZWF0ZSh0aGlzLnByb2R1Y3QsIGNkcENvbm5lY3Rpb24sIFtdLCBpZ25vcmVIVFRQU0Vycm9ycywgZGVmYXVsdFZpZXdwb3J0LCBicm93c2VyUHJvY2Vzcy5ub2RlUHJvY2VzcywgYnJvd3NlckNsb3NlQ2FsbGJhY2ssIG9wdGlvbnMudGFyZ2V0RmlsdGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB2b2lkIGJyb3dzZXJDbG9zZUNhbGxiYWNrKCk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCcm93c2Vyc1RpbWVvdXRFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2FpdEZvckluaXRpYWxQYWdlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JQYWdlVGFyZ2V0KGJyb3dzZXIsIHRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBicm93c2VyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgb25seSBmb3IgRmlyZWZveCwgYWZ0ZXIgdGhlIGxhdW5jaGVyIHJlc29sdmVzIHRoZSBgbGF0ZXN0YCByZXZpc2lvbiB0b1xuICAgICAqIHRoZSBhY3R1YWwgcmV2aXNpb24uXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0QWN0dWFsQnJvd3NlclJldmlzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3R1YWxCcm93c2VyUmV2aXNpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIGNsb3NlQnJvd3Nlcihicm93c2VyUHJvY2VzcywgY2RwQ29ubmVjdGlvbikge1xuICAgICAgICBpZiAoY2RwQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBjbG9zZSB0aGUgYnJvd3NlciBncmFjZWZ1bGx5XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNkcENvbm5lY3Rpb24uY2xvc2VCcm93c2VyKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYnJvd3NlclByb2Nlc3MuaGFzQ2xvc2VkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBicm93c2VyUHJvY2Vzcy5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV2FpdCBmb3IgYSBwb3NzaWJsZSBncmFjZWZ1bCBzaHV0ZG93bi5cbiAgICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHJhY2UoZnJvbShicm93c2VyUHJvY2Vzcy5oYXNDbG9zZWQoKSksIHRpbWVyKDUwMDApLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShicm93c2VyUHJvY2Vzcy5jbG9zZSgpKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JQYWdlVGFyZ2V0KGJyb3dzZXIsIHRpbWVvdXQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGJyb3dzZXIud2FpdEZvclRhcmdldCh0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC50eXBlKCkgPT09ICdwYWdlJztcbiAgICAgICAgICAgIH0sIHsgdGltZW91dCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUNkcFNvY2tldENvbm5lY3Rpb24oYnJvd3NlclByb2Nlc3MsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgYnJvd3NlcldTRW5kcG9pbnQgPSBhd2FpdCBicm93c2VyUHJvY2Vzcy53YWl0Rm9yTGluZU91dHB1dChDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBvcHRzLnRpbWVvdXQpO1xuICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSBhd2FpdCBXZWJTb2NrZXRUcmFuc3BvcnQuY3JlYXRlKGJyb3dzZXJXU0VuZHBvaW50KTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uKGJyb3dzZXJXU0VuZHBvaW50LCB0cmFuc3BvcnQsIG9wdHMuc2xvd01vLCBvcHRzLnByb3RvY29sVGltZW91dCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUNkcFBpcGVDb25uZWN0aW9uKGJyb3dzZXJQcm9jZXNzLCBvcHRzKSB7XG4gICAgICAgIC8vIHN0ZGlvIHdhcyBhc3NpZ25lZCBkdXJpbmcgc3RhcnQoKSwgYW5kIHRoZSAncGlwZScgb3B0aW9uIHRoZXJlIGFkZHMgdGhlXG4gICAgICAgIC8vIDR0aCBhbmQgNXRoIGl0ZW1zIHRvIHN0ZGlvIGFycmF5XG4gICAgICAgIGNvbnN0IHsgMzogcGlwZVdyaXRlLCA0OiBwaXBlUmVhZCB9ID0gYnJvd3NlclByb2Nlc3Mubm9kZVByb2Nlc3Muc3RkaW87XG4gICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBQaXBlVHJhbnNwb3J0KHBpcGVXcml0ZSwgcGlwZVJlYWQpO1xuICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oJycsIHRyYW5zcG9ydCwgb3B0cy5zbG93TW8sIG9wdHMucHJvdG9jb2xUaW1lb3V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQmlEaU92ZXJDZHBCcm93c2VyKGJyb3dzZXJQcm9jZXNzLCBjb25uZWN0aW9uLCBjbG9zZUNhbGxiYWNrLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IEJpRGkgPSBhd2FpdCBpbXBvcnQoLyogOiB0cnVlICovICcuLi9iaWRpL2JpZGkuanMnKTtcbiAgICAgICAgY29uc3QgYmlkaUNvbm5lY3Rpb24gPSBhd2FpdCBCaURpLmNvbm5lY3RCaWRpT3ZlckNkcChjb25uZWN0aW9uLCB7XG4gICAgICAgICAgICBhY2NlcHRJbnNlY3VyZUNlcnRzOiBvcHRzLmlnbm9yZUhUVFBTRXJyb3JzID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IEJpRGkuQmlkaUJyb3dzZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb246IGJpZGlDb25uZWN0aW9uLFxuICAgICAgICAgICAgY2xvc2VDYWxsYmFjayxcbiAgICAgICAgICAgIHByb2Nlc3M6IGJyb3dzZXJQcm9jZXNzLm5vZGVQcm9jZXNzLFxuICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0OiBvcHRzLmRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiBvcHRzLmlnbm9yZUhUVFBTRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQmlEaUJyb3dzZXIoYnJvd3NlclByb2Nlc3MsIGNsb3NlQ2FsbGJhY2ssIG9wdHMpIHtcbiAgICAgICAgY29uc3QgYnJvd3NlcldTRW5kcG9pbnQgPSAoYXdhaXQgYnJvd3NlclByb2Nlc3Mud2FpdEZvckxpbmVPdXRwdXQoV0VCRFJJVkVSX0JJRElfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBvcHRzLnRpbWVvdXQpKSArICcvc2Vzc2lvbic7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IGF3YWl0IFdlYlNvY2tldFRyYW5zcG9ydC5jcmVhdGUoYnJvd3NlcldTRW5kcG9pbnQpO1xuICAgICAgICBjb25zdCBCaURpID0gYXdhaXQgaW1wb3J0KC8qIDogdHJ1ZSAqLyAnLi4vYmlkaS9iaWRpLmpzJyk7XG4gICAgICAgIGNvbnN0IGJpZGlDb25uZWN0aW9uID0gbmV3IEJpRGkuQmlkaUNvbm5lY3Rpb24oYnJvd3NlcldTRW5kcG9pbnQsIHRyYW5zcG9ydCwgb3B0cy5zbG93TW8sIG9wdHMucHJvdG9jb2xUaW1lb3V0KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IEJpRGkuQmlkaUJyb3dzZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb246IGJpZGlDb25uZWN0aW9uLFxuICAgICAgICAgICAgY2xvc2VDYWxsYmFjayxcbiAgICAgICAgICAgIHByb2Nlc3M6IGJyb3dzZXJQcm9jZXNzLm5vZGVQcm9jZXNzLFxuICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0OiBvcHRzLmRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiBvcHRzLmlnbm9yZUhUVFBTRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0UHJvZmlsZVBhdGgoKSB7XG4gICAgICAgIHJldHVybiBqb2luKHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24udGVtcG9yYXJ5RGlyZWN0b3J5ID8/IHRtcGRpcigpLCBgcHVwcGV0ZWVyX2Rldl8ke3RoaXMucHJvZHVjdH1fcHJvZmlsZS1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcmVzb2x2ZUV4ZWN1dGFibGVQYXRoKGhlYWRsZXNzKSB7XG4gICAgICAgIGxldCBleGVjdXRhYmxlUGF0aCA9IHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24uZXhlY3V0YWJsZVBhdGg7XG4gICAgICAgIGlmIChleGVjdXRhYmxlUGF0aCkge1xuICAgICAgICAgICAgaWYgKCFleGlzdHNTeW5jKGV4ZWN1dGFibGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gZmluZCB0aGUgYnJvd3NlciBhdCB0aGUgY29uZmlndXJlZCBwYXRoICgke2V4ZWN1dGFibGVQYXRofSksIGJ1dCBubyBleGVjdXRhYmxlIHdhcyBmb3VuZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBleGVjdXRhYmxlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBwcm9kdWN0VG9Ccm93c2VyKHByb2R1Y3QsIGhlYWRsZXNzKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHByb2R1Y3QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjaHJvbWUnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGxlc3MgPT09ICdzaGVsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnN0YWxsZWRCcm93c2VyLkNIUk9NRUhFQURMRVNTU0hFTEw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEluc3RhbGxlZEJyb3dzZXIuQ0hST01FO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2ZpcmVmb3gnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW5zdGFsbGVkQnJvd3Nlci5GSVJFRk9YO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEluc3RhbGxlZEJyb3dzZXIuQ0hST01FO1xuICAgICAgICB9XG4gICAgICAgIGV4ZWN1dGFibGVQYXRoID0gY29tcHV0ZUV4ZWN1dGFibGVQYXRoKHtcbiAgICAgICAgICAgIGNhY2hlRGlyOiB0aGlzLnB1cHBldGVlci5kZWZhdWx0RG93bmxvYWRQYXRoLFxuICAgICAgICAgICAgYnJvd3NlcjogcHJvZHVjdFRvQnJvd3Nlcih0aGlzLnByb2R1Y3QsIGhlYWRsZXNzKSxcbiAgICAgICAgICAgIGJ1aWxkSWQ6IHRoaXMucHVwcGV0ZWVyLmJyb3dzZXJSZXZpc2lvbixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZXhpc3RzU3luYyhleGVjdXRhYmxlUGF0aCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnB1cHBldGVlci5jb25maWd1cmF0aW9uLmJyb3dzZXJSZXZpc2lvbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gZmluZCB0aGUgYnJvd3NlciBhdCB0aGUgY29uZmlndXJlZCBwYXRoICgke2V4ZWN1dGFibGVQYXRofSkgZm9yIHJldmlzaW9uICR7dGhpcy5wdXBwZXRlZXIuYnJvd3NlclJldmlzaW9ufSwgYnV0IG5vIGV4ZWN1dGFibGUgd2FzIGZvdW5kLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnByb2R1Y3QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjaHJvbWUnOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIENocm9tZSAodmVyLiAke3RoaXMucHVwcGV0ZWVyLmJyb3dzZXJSZXZpc2lvbn0pLiBUaGlzIGNhbiBvY2N1ciBpZiBlaXRoZXJcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgMS4geW91IGRpZCBub3QgcGVyZm9ybSBhbiBpbnN0YWxsYXRpb24gYmVmb3JlIHJ1bm5pbmcgdGhlIHNjcmlwdCAoZS5nLiBgbnB4IHB1cHBldGVlciBicm93c2VycyBpbnN0YWxsIGNocm9tZWApIG9yXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBgIDIuIHlvdXIgY2FjaGUgcGF0aCBpcyBpbmNvcnJlY3RseSBjb25maWd1cmVkICh3aGljaCBpczogJHt0aGlzLnB1cHBldGVlci5jb25maWd1cmF0aW9uLmNhY2hlRGlyZWN0b3J5fSkuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnRm9yICgyKSwgY2hlY2sgb3V0IG91ciBndWlkZSBvbiBjb25maWd1cmluZyBwdXBwZXRlZXIgYXQgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvY29uZmlndXJhdGlvbi4nKTtcbiAgICAgICAgICAgICAgICBjYXNlICdmaXJlZm94JzpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBGaXJlZm94IChyZXYuICR7dGhpcy5wdXBwZXRlZXIuYnJvd3NlclJldmlzaW9ufSkuIFRoaXMgY2FuIG9jY3VyIGlmIGVpdGhlclxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAxLiB5b3UgZGlkIG5vdCBwZXJmb3JtIGFuIGluc3RhbGxhdGlvbiBmb3IgRmlyZWZveCBiZWZvcmUgcnVubmluZyB0aGUgc2NyaXB0IChlLmcuIGBucHggcHVwcGV0ZWVyIGJyb3dzZXJzIGluc3RhbGwgZmlyZWZveGApIG9yXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBgIDIuIHlvdXIgY2FjaGUgcGF0aCBpcyBpbmNvcnJlY3RseSBjb25maWd1cmVkICh3aGljaCBpczogJHt0aGlzLnB1cHBldGVlci5jb25maWd1cmF0aW9uLmNhY2hlRGlyZWN0b3J5fSkuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnRm9yICgyKSwgY2hlY2sgb3V0IG91ciBndWlkZSBvbiBjb25maWd1cmluZyBwdXBwZXRlZXIgYXQgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvY29uZmlndXJhdGlvbi4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhlY3V0YWJsZVBhdGg7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvZHVjdExhdW5jaGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBCcm93c2VyIGFzIFN1cHBvcnRlZEJyb3dzZXIsIHJlc29sdmVCdWlsZElkLCBkZXRlY3RCcm93c2VyUGxhdGZvcm0sIGdldEluc3RhbGxlZEJyb3dzZXJzLCB1bmluc3RhbGwsIH0gZnJvbSAnQHB1cHBldGVlci9icm93c2Vycyc7XG5pbXBvcnQgeyBQdXBwZXRlZXIgfSBmcm9tICcuLi9jb21tb24vUHVwcGV0ZWVyLmpzJztcbmltcG9ydCB7IFBVUFBFVEVFUl9SRVZJU0lPTlMgfSBmcm9tICcuLi9yZXZpc2lvbnMuanMnO1xuaW1wb3J0IHsgQ2hyb21lTGF1bmNoZXIgfSBmcm9tICcuL0Nocm9tZUxhdW5jaGVyLmpzJztcbmltcG9ydCB7IEZpcmVmb3hMYXVuY2hlciB9IGZyb20gJy4vRmlyZWZveExhdW5jaGVyLmpzJztcbi8qKlxuICogRXh0ZW5kcyB0aGUgbWFpbiB7QGxpbmsgUHVwcGV0ZWVyfSBjbGFzcyB3aXRoIE5vZGUgc3BlY2lmaWMgYmVoYXZpb3VyIGZvclxuICogZmV0Y2hpbmcgYW5kIGRvd25sb2FkaW5nIGJyb3dzZXJzLlxuICpcbiAqIElmIHlvdSdyZSB1c2luZyBQdXBwZXRlZXIgaW4gYSBOb2RlIGVudmlyb25tZW50LCB0aGlzIGlzIHRoZSBjbGFzcyB5b3UnbGwgZ2V0XG4gKiB3aGVuIHlvdSBydW4gYHJlcXVpcmUoJ3B1cHBldGVlcicpYCAob3IgdGhlIGVxdWl2YWxlbnQgRVMgYGltcG9ydGApLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgbW9zdCBjb21tb24gbWV0aG9kIHRvIHVzZSBpcyB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXVuY2ggfCBsYXVuY2h9LCB3aGljaFxuICogaXMgdXNlZCB0byBsYXVuY2ggYW5kIGNvbm5lY3QgdG8gYSBuZXcgYnJvd3NlciBpbnN0YW5jZS5cbiAqXG4gKiBTZWUge0BsaW5rIFB1cHBldGVlciB8IHRoZSBtYWluIFB1cHBldGVlciBjbGFzc30gZm9yIG1ldGhvZHMgY29tbW9uIHRvIGFsbFxuICogZW52aXJvbm1lbnRzLCBzdWNoIGFzIHtAbGluayBQdXBwZXRlZXIuY29ubmVjdH0uXG4gKlxuICogQGV4YW1wbGVcbiAqIFRoZSBmb2xsb3dpbmcgaXMgYSB0eXBpY2FsIGV4YW1wbGUgb2YgdXNpbmcgUHVwcGV0ZWVyIHRvIGRyaXZlIGF1dG9tYXRpb246XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAqXG4gKiAoYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiAgIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbScpO1xuICogICAvLyBvdGhlciBhY3Rpb25zLi4uXG4gKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqIH0pKCk7XG4gKiBgYGBcbiAqXG4gKiBPbmNlIHlvdSBoYXZlIGNyZWF0ZWQgYSBgcGFnZWAgeW91IGhhdmUgYWNjZXNzIHRvIGEgbGFyZ2UgQVBJIHRvIGludGVyYWN0XG4gKiB3aXRoIHRoZSBwYWdlLCBuYXZpZ2F0ZSwgb3IgZmluZCBjZXJ0YWluIGVsZW1lbnRzIGluIHRoYXQgcGFnZS5cbiAqIFRoZSB7QGxpbmsgUGFnZSB8IGBwYWdlYCBkb2N1bWVudGF0aW9ufSBsaXN0cyBhbGwgdGhlIGF2YWlsYWJsZSBtZXRob2RzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFB1cHBldGVlck5vZGUgZXh0ZW5kcyBQdXBwZXRlZXIge1xuICAgICNfbGF1bmNoZXI7XG4gICAgI2xhc3RMYXVuY2hlZFByb2R1Y3Q7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZGVmYXVsdEJyb3dzZXJSZXZpc2lvbjtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25maWd1cmF0aW9uID0ge307XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3QgeyBjb25maWd1cmF0aW9uLCAuLi5jb21tb25TZXR0aW5ncyB9ID0gc2V0dGluZ3M7XG4gICAgICAgIHN1cGVyKGNvbW1vblNldHRpbmdzKTtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFByb2R1Y3QpIHtcbiAgICAgICAgICAgIGNhc2UgJ2ZpcmVmb3gnOlxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJyb3dzZXJSZXZpc2lvbiA9IFBVUFBFVEVFUl9SRVZJU0lPTlMuZmlyZWZveDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRQcm9kdWN0ID0gJ2Nocm9tZSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QnJvd3NlclJldmlzaW9uID0gUFVQUEVURUVSX1JFVklTSU9OUy5jaHJvbWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25uZWN0ID0gdGhpcy5jb25uZWN0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubGF1bmNoID0gdGhpcy5sYXVuY2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5leGVjdXRhYmxlUGF0aCA9IHRoaXMuZXhlY3V0YWJsZVBhdGguYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0QXJncyA9IHRoaXMuZGVmYXVsdEFyZ3MuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy50cmltQ2FjaGUgPSB0aGlzLnRyaW1DYWNoZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBhdHRhY2hlcyBQdXBwZXRlZXIgdG8gYW4gZXhpc3RpbmcgYnJvd3NlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gU2V0IG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zIHRvIHNldCBvbiB0aGUgYnJvd3Nlci5cbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGJyb3dzZXIgaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29ubmVjdChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5jb25uZWN0KG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMYXVuY2hlcyBhIGJyb3dzZXIgaW5zdGFuY2Ugd2l0aCBnaXZlbiBhcmd1bWVudHMgYW5kIG9wdGlvbnMgd2hlblxuICAgICAqIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIFdoZW4gdXNpbmcgd2l0aCBgcHVwcGV0ZWVyLWNvcmVgLFxuICAgICAqIHtAbGluayBMYXVuY2hPcHRpb25zLmV4ZWN1dGFibGVQYXRoIHwgb3B0aW9ucy5leGVjdXRhYmxlUGF0aH0gb3JcbiAgICAgKiB7QGxpbmsgTGF1bmNoT3B0aW9ucy5jaGFubmVsIHwgb3B0aW9ucy5jaGFubmVsfSBtdXN0IGJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBZb3UgY2FuIHVzZSB7QGxpbmsgTGF1bmNoT3B0aW9ucy5pZ25vcmVEZWZhdWx0QXJncyB8IG9wdGlvbnMuaWdub3JlRGVmYXVsdEFyZ3N9XG4gICAgICogdG8gZmlsdGVyIG91dCBgLS1tdXRlLWF1ZGlvYCBmcm9tIGRlZmF1bHQgYXJndW1lbnRzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCh7XG4gICAgICogICBpZ25vcmVEZWZhdWx0QXJnczogWyctLW11dGUtYXVkaW8nXSxcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUHVwcGV0ZWVyIGNhbiBhbHNvIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgQ2hyb21lIGJyb3dzZXIsIGJ1dCBpdCB3b3JrcyBiZXN0XG4gICAgICogd2l0aCB0aGUgdmVyc2lvbiBvZiBDaHJvbWUgZm9yIFRlc3RpbmcgZG93bmxvYWRlZCBieSBkZWZhdWx0LlxuICAgICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSBpdCB3aWxsIHdvcmsgd2l0aCBhbnkgb3RoZXIgdmVyc2lvbi4gSWYgR29vZ2xlIENocm9tZVxuICAgICAqIChyYXRoZXIgdGhhbiBDaHJvbWUgZm9yIFRlc3RpbmcpIGlzIHByZWZlcnJlZCwgYVxuICAgICAqIHtAbGluayBodHRwczovL3d3dy5nb29nbGUuY29tL2Nocm9tZS9icm93c2VyL2NhbmFyeS5odG1sIHwgQ2hyb21lIENhbmFyeX1cbiAgICAgKiBvclxuICAgICAqIHtAbGluayBodHRwczovL3d3dy5jaHJvbWl1bS5vcmcvZ2V0dGluZy1pbnZvbHZlZC9kZXYtY2hhbm5lbCB8IERldiBDaGFubmVsfVxuICAgICAqIGJ1aWxkIGlzIHN1Z2dlc3RlZC4gU2VlXG4gICAgICoge0BsaW5rIGh0dHBzOi8vd3d3Lmhvd3RvZ2Vlay5jb20vMjAyODI1L3doYXQlRTIlODAlOTlzLXRoZS1kaWZmZXJlbmNlLWJldHdlZW4tY2hyb21pdW0tYW5kLWNocm9tZS8gfCB0aGlzIGFydGljbGV9XG4gICAgICogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gQ2hyb21pdW0gYW5kIENocm9tZS5cbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYy8rL2xrZ3IvZG9jcy9jaHJvbWl1bV9icm93c2VyX3ZzX2dvb2dsZV9jaHJvbWUubWQgfCBUaGlzIGFydGljbGV9XG4gICAgICogZGVzY3JpYmVzIHNvbWUgZGlmZmVyZW5jZXMgZm9yIExpbnV4IHVzZXJzLiBTZWVcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9ibG9nL2Nocm9tZS1mb3ItdGVzdGluZy8gfCB0aGlzIGRvY30gZm9yIHRoZSBkZXNjcmlwdGlvblxuICAgICAqIG9mIENocm9tZSBmb3IgVGVzdGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgbGF1bmNoaW5nIGJlaGF2aW9yLlxuICAgICAqL1xuICAgIGxhdW5jaChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBwcm9kdWN0ID0gdGhpcy5kZWZhdWx0UHJvZHVjdCB9ID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy4jbGFzdExhdW5jaGVkUHJvZHVjdCA9IHByb2R1Y3Q7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYXVuY2hlci5sYXVuY2gob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCAjbGF1bmNoZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLiNfbGF1bmNoZXIgJiZcbiAgICAgICAgICAgIHRoaXMuI19sYXVuY2hlci5wcm9kdWN0ID09PSB0aGlzLmxhc3RMYXVuY2hlZFByb2R1Y3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNfbGF1bmNoZXI7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0aGlzLmxhc3RMYXVuY2hlZFByb2R1Y3QpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Nocm9tZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QnJvd3NlclJldmlzaW9uID0gUFVQUEVURUVSX1JFVklTSU9OUy5jaHJvbWU7XG4gICAgICAgICAgICAgICAgdGhpcy4jX2xhdW5jaGVyID0gbmV3IENocm9tZUxhdW5jaGVyKHRoaXMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZmlyZWZveCc6XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QnJvd3NlclJldmlzaW9uID0gUFVQUEVURUVSX1JFVklTSU9OUy5maXJlZm94O1xuICAgICAgICAgICAgICAgIHRoaXMuI19sYXVuY2hlciA9IG5ldyBGaXJlZm94TGF1bmNoZXIodGhpcyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcm9kdWN0OiAke3RoaXMuI2xhc3RMYXVuY2hlZFByb2R1Y3R9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI19sYXVuY2hlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgZXhlY3V0YWJsZSBwYXRoLlxuICAgICAqL1xuICAgIGV4ZWN1dGFibGVQYXRoKGNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xhdW5jaGVyLmV4ZWN1dGFibGVQYXRoKGNoYW5uZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgYnJvd3NlclJldmlzaW9uKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI19sYXVuY2hlcj8uZ2V0QWN0dWFsQnJvd3NlclJldmlzaW9uKCkgPz9cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5icm93c2VyUmV2aXNpb24gPz9cbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJyb3dzZXJSZXZpc2lvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGRvd25sb2FkIHBhdGggZm9yIHB1cHBldGVlci4gRm9yIHB1cHBldGVlci1jb3JlLCB0aGlzXG4gICAgICogY29kZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGFzIGl0IGlzIG5ldmVyIGRlZmluZWQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdERvd25sb2FkUGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5jYWNoZURpcmVjdG9yeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJyb3dzZXIgdGhhdCB3YXMgbGFzdCBsYXVuY2hlZC5cbiAgICAgKi9cbiAgICBnZXQgbGFzdExhdW5jaGVkUHJvZHVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xhc3RMYXVuY2hlZFByb2R1Y3QgPz8gdGhpcy5kZWZhdWx0UHJvZHVjdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJyb3dzZXIgdGhhdCB3aWxsIGJlIGxhdW5jaGVkIGJ5IGRlZmF1bHQuIEZvclxuICAgICAqIGBwdXBwZXRlZXJgLCB0aGlzIGlzIGluZmx1ZW5jZWQgYnkgeW91ciBjb25maWd1cmF0aW9uLiBPdGhlcndpc2UsIGl0J3NcbiAgICAgKiBgY2hyb21lYC5cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByb2R1Y3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFByb2R1Y3QgPz8gJ2Nocm9tZSc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgYXMgdGhpcyBmaWVsZCBhcyBpdCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudFxuICAgICAqIG11bHRpcGxlIGJyb3dzZXJzIG9mIGRpZmZlcmVudCB0eXBlcy4gVXNlXG4gICAgICoge0BsaW5rIFB1cHBldGVlck5vZGUuZGVmYXVsdFByb2R1Y3QgfCBkZWZhdWx0UHJvZHVjdH0gb3JcbiAgICAgKiB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXN0TGF1bmNoZWRQcm9kdWN0IHwgbGFzdExhdW5jaGVkUHJvZHVjdH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgYnJvd3NlciB0aGF0IGlzIHVuZGVyIGF1dG9tYXRpb24uXG4gICAgICovXG4gICAgZ2V0IHByb2R1Y3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYXVuY2hlci5wcm9kdWN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFNldCBvZiBjb25maWd1cmFibGUgb3B0aW9ucyB0byBzZXQgb24gdGhlIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBmbGFncyB0aGF0IENocm9taXVtIHdpbGwgYmUgbGF1bmNoZWQgd2l0aC5cbiAgICAgKi9cbiAgICBkZWZhdWx0QXJncyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xhdW5jaGVyLmRlZmF1bHRBcmdzKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBub24tY3VycmVudCBGaXJlZm94IGFuZCBDaHJvbWUgYmluYXJpZXMgaW4gdGhlIGNhY2hlIGRpcmVjdG9yeVxuICAgICAqIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIFB1cHBldGVlciBjb25maWd1cmF0aW9uLiBUaGUgY3VycmVudCBicm93c2VyXG4gICAgICogdmVyc2lvbiBpcyBkZXRlcm1pbmVkIGJ5IHJlc29sdmluZyBQVVBQRVRFRVJfUkVWSVNJT05TIGZyb20gUHVwcGV0ZWVyXG4gICAgICogdW5sZXNzIGBjb25maWd1cmF0aW9uLmJyb3dzZXJSZXZpc2lvbmAgaXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoZSBtZXRob2QgZG9lcyBub3QgY2hlY2sgaWYgYW55IG90aGVyIFB1cHBldGVlciB2ZXJzaW9uc1xuICAgICAqIGluc3RhbGxlZCBvbiB0aGUgaG9zdCB0aGF0IHVzZSB0aGUgc2FtZSBjYWNoZSBkaXJlY3RvcnkgcmVxdWlyZSB0aGVcbiAgICAgKiBub24tY3VycmVudCBiaW5hcmllcy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBhc3luYyB0cmltQ2FjaGUoKSB7XG4gICAgICAgIGNvbnN0IHBsYXRmb3JtID0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgICAgIGlmICghcGxhdGZvcm0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYWNoZURpciA9IHRoaXMuY29uZmlndXJhdGlvbi5jYWNoZURpcmVjdG9yeTtcbiAgICAgICAgY29uc3QgaW5zdGFsbGVkQnJvd3NlcnMgPSBhd2FpdCBnZXRJbnN0YWxsZWRCcm93c2Vycyh7XG4gICAgICAgICAgICBjYWNoZURpcixcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb2R1Y3QgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFByb2R1Y3Q7XG4gICAgICAgIGNvbnN0IHB1cHBldGVlckJyb3dzZXJzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByb2R1Y3Q6ICdjaHJvbWUnLFxuICAgICAgICAgICAgICAgIGJyb3dzZXI6IFN1cHBvcnRlZEJyb3dzZXIuQ0hST01FLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRCdWlsZElkOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdDogJ2ZpcmVmb3gnLFxuICAgICAgICAgICAgICAgIGJyb3dzZXI6IFN1cHBvcnRlZEJyb3dzZXIuRklSRUZPWCxcbiAgICAgICAgICAgICAgICBjdXJyZW50QnVpbGRJZDogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICAvLyBSZXNvbHZlIGN1cnJlbnQgYnVpbGRJZHMuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwdXBwZXRlZXJCcm93c2Vycykge1xuICAgICAgICAgICAgaXRlbS5jdXJyZW50QnVpbGRJZCA9IGF3YWl0IHJlc29sdmVCdWlsZElkKGl0ZW0uYnJvd3NlciwgcGxhdGZvcm0sIChwcm9kdWN0ID09PSBpdGVtLnByb2R1Y3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuY29uZmlndXJhdGlvbi5icm93c2VyUmV2aXNpb25cbiAgICAgICAgICAgICAgICA6IG51bGwpIHx8IFBVUFBFVEVFUl9SRVZJU0lPTlNbaXRlbS5wcm9kdWN0XSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudEJyb3dzZXJCdWlsZHMgPSBuZXcgU2V0KHB1cHBldGVlckJyb3dzZXJzLm1hcChicm93c2VyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgJHticm93c2VyLmJyb3dzZXJ9XyR7YnJvd3Nlci5jdXJyZW50QnVpbGRJZH1gO1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCcm93c2VycyA9IG5ldyBTZXQocHVwcGV0ZWVyQnJvd3NlcnMubWFwKGJyb3dzZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIuYnJvd3NlcjtcbiAgICAgICAgfSkpO1xuICAgICAgICBmb3IgKGNvbnN0IGluc3RhbGxlZEJyb3dzZXIgb2YgaW5zdGFsbGVkQnJvd3NlcnMpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHVuaW5zdGFsbCBicm93c2VycyB0aGF0IGFyZSBub3QgbWFuYWdlZCBieSBQdXBwZXRlZXIgeWV0LlxuICAgICAgICAgICAgaWYgKCFjdXJyZW50QnJvd3NlcnMuaGFzKGluc3RhbGxlZEJyb3dzZXIuYnJvd3NlcikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIGJyb3dzZXIgYnVpbGQgdXNlZCBieSB0aGUgY3VycmVudCBQdXBwZXRlZXIgaW5zdGFsbGF0aW9uLlxuICAgICAgICAgICAgaWYgKGN1cnJlbnRCcm93c2VyQnVpbGRzLmhhcyhgJHtpbnN0YWxsZWRCcm93c2VyLmJyb3dzZXJ9XyR7aW5zdGFsbGVkQnJvd3Nlci5idWlsZElkfWApKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB1bmluc3RhbGwoe1xuICAgICAgICAgICAgICAgIGJyb3dzZXI6IGluc3RhbGxlZEJyb3dzZXIuYnJvd3NlcixcbiAgICAgICAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICAgICAgICBjYWNoZURpcixcbiAgICAgICAgICAgICAgICBidWlsZElkOiBpbnN0YWxsZWRCcm93c2VyLmJ1aWxkSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVB1cHBldGVlck5vZGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX3J1bkluaXRpYWxpemVycyA9ICh0aGlzICYmIHRoaXMuX19ydW5Jbml0aWFsaXplcnMpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG52YXIgX19lc0RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2VzRGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICAgIGRvbmUgPSB0cnVlO1xufTtcbnZhciBfX3NldEZ1bmN0aW9uTmFtZSA9ICh0aGlzICYmIHRoaXMuX19zZXRGdW5jdGlvbk5hbWUpIHx8IGZ1bmN0aW9uIChmLCBuYW1lLCBwcmVmaXgpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuaW1wb3J0IHsgc3Bhd24sIHNwYXduU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgUGFzc1Rocm91Z2ggfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IGJ1ZmZlckNvdW50LCBjb25jYXRNYXAsIGZpbHRlciwgZnJvbSwgZnJvbUV2ZW50LCBsYXN0VmFsdWVGcm9tLCBtYXAsIHRha2VVbnRpbCwgdGFwLCB9IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyc7XG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yLCBmcm9tRW1pdHRlckV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgZ3VhcmRlZCB9IGZyb20gJy4uL3V0aWwvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBhc3luY0Rpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuY29uc3QgQ1JGX1ZBTFVFID0gMzA7XG5jb25zdCBERUZBVUxUX0ZQUyA9IDMwO1xuY29uc3QgZGVidWdGZm1wZWcgPSBkZWJ1ZygncHVwcGV0ZWVyOmZmbXBlZycpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmxldCBTY3JlZW5SZWNvcmRlciA9ICgoKSA9PiB7XG4gICAgbGV0IF9jbGFzc1N1cGVyID0gUGFzc1Rocm91Z2g7XG4gICAgbGV0IF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzID0gW107XG4gICAgbGV0IF9wcml2YXRlX3dyaXRlRnJhbWVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfd3JpdGVGcmFtZV9kZXNjcmlwdG9yO1xuICAgIGxldCBfc3RvcF9kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBTY3JlZW5SZWNvcmRlciBleHRlbmRzIF9jbGFzc1N1cGVyIHtcbiAgICAgICAgc3RhdGljIHtcbiAgICAgICAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfd3JpdGVGcmFtZV9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jcHJvY2Vzcy5zdGRpbi53cml0ZShidWZmZXIsIHJlc29sdmUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgZmZtcGVnIGZhaWxlZCB0byB3cml0ZTogJHtlcnJvci5tZXNzYWdlfS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIFwiI3dyaXRlRnJhbWVcIikgfSwgX3ByaXZhdGVfd3JpdGVGcmFtZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiI3dyaXRlRnJhbWVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogdHJ1ZSwgYWNjZXNzOiB7IGhhczogb2JqID0+ICN3cml0ZUZyYW1lIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiN3cml0ZUZyYW1lIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9zdG9wX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJzdG9wXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzdG9wXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouc3RvcCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICAjcGFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXMsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgI3Byb2Nlc3M7XG4gICAgICAgICNjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICAjbGFzdEZyYW1lO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdHJ1Y3RvcihwYWdlLCB3aWR0aCwgaGVpZ2h0LCB7IHNwZWVkLCBzY2FsZSwgY3JvcCwgZm9ybWF0LCBwYXRoIH0gPSB7fSkge1xuICAgICAgICAgICAgc3VwZXIoeyBhbGxvd0hhbGZPcGVuOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIHBhdGggPz89ICdmZm1wZWcnO1xuICAgICAgICAgICAgLy8gVGVzdHMgaWYgYGZmbXBlZ2AgZXhpc3RzLlxuICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gc3Bhd25TeW5jKHBhdGgpO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNwcm9jZXNzID0gc3Bhd24ocGF0aCwgXG4gICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly90cmFjLmZmbXBlZy5vcmcvd2lraS9FbmNvZGUvVlA5IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGZsYWdzLlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsnLWxvZ2xldmVsJywgJ2Vycm9yJ10sXG4gICAgICAgICAgICAgICAgLy8gUmVkdWNlcyBnZW5lcmFsIGJ1ZmZlcmluZy5cbiAgICAgICAgICAgICAgICBbJy1hdmlvZmxhZ3MnLCAnZGlyZWN0J10sXG4gICAgICAgICAgICAgICAgLy8gUmVkdWNlcyBpbml0aWFsIGJ1ZmZlcmluZyB3aGlsZSBhbmFseXppbmcgaW5wdXQgZnBzIGFuZCBvdGhlciBzdGF0cy5cbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICctZnBzcHJvYmVzaXplJyxcbiAgICAgICAgICAgICAgICAgICAgJzAnLFxuICAgICAgICAgICAgICAgICAgICAnLXByb2Jlc2l6ZScsXG4gICAgICAgICAgICAgICAgICAgICczMicsXG4gICAgICAgICAgICAgICAgICAgICctYW5hbHl6ZWR1cmF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJzAnLFxuICAgICAgICAgICAgICAgICAgICAnLWZmbGFncycsXG4gICAgICAgICAgICAgICAgICAgICdub2J1ZmZlcicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAvLyBGb3JjZXMgaW5wdXQgdG8gYmUgcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LCBhbmQgZm9yY2VzIHBuZyBpbnB1dFxuICAgICAgICAgICAgICAgIC8vIGltYWdlIGZvcm1hdC5cbiAgICAgICAgICAgICAgICBbJy1mJywgJ2ltYWdlMnBpcGUnLCAnLWM6dicsICdwbmcnLCAnLWknLCAncGlwZTowJ10sXG4gICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIG91dHB1dCBhbmQgbm8gYXVkaW8uXG4gICAgICAgICAgICAgICAgWycteScsICctYW4nXSxcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGRyYXN0aWNhbGx5IHJlZHVjZXMgc3RhbGxpbmcgd2hlbiBjcHUgaXMgb3ZlcmJvb2tlZC4gQnkgZGVmYXVsdFxuICAgICAgICAgICAgICAgIC8vIFZQOSB0cmllcyB0byB1c2UgYWxsIGF2YWlsYWJsZSB0aHJlYWRzP1xuICAgICAgICAgICAgICAgIFsnLXRocmVhZHMnLCAnMSddLFxuICAgICAgICAgICAgICAgIC8vIFNwZWNpZmllcyB0aGUgZnJhbWUgcmF0ZSB3ZSBhcmUgZ2l2aW5nIGZmbXBlZy5cbiAgICAgICAgICAgICAgICBbJy1mcmFtZXJhdGUnLCBgJHtERUZBVUxUX0ZQU31gXSxcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWZpZXMgdGhlIGVuY29kaW5nIGFuZCBmb3JtYXQgd2UgYXJlIHVzaW5nLlxuICAgICAgICAgICAgICAgIHRoaXMuI2dldEZvcm1hdEFyZ3MoZm9ybWF0ID8/ICd3ZWJtJyksXG4gICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBiaXRyYXRlLlxuICAgICAgICAgICAgICAgIFsnLWI6dicsICcwJ10sXG4gICAgICAgICAgICAgICAgLy8gRmlsdGVycyB0byBlbnN1cmUgdGhlIGltYWdlcyBhcmUgcGlwZWQgY29ycmVjdGx5LlxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgJy12ZicsXG4gICAgICAgICAgICAgICAgICAgIGAke3NwZWVkID8gYHNldHB0cz0kezEgLyBzcGVlZH0qUFRTLGAgOiAnJ31jcm9wPSdtaW4oJHt3aWR0aH0saXcpOm1pbigke2hlaWdodH0saWgpOjA6MCcscGFkPSR7d2lkdGh9OiR7aGVpZ2h0fTowOjAke2Nyb3AgPyBgLGNyb3A9JHtjcm9wLndpZHRofToke2Nyb3AuaGVpZ2h0fToke2Nyb3AueH06JHtjcm9wLnl9YCA6ICcnfSR7c2NhbGUgPyBgLHNjYWxlPWl3KiR7c2NhbGV9Oi0xYCA6ICcnfWAsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAncGlwZToxJyxcbiAgICAgICAgICAgIF0uZmxhdCgpLCB7IHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdwaXBlJ10gfSk7XG4gICAgICAgICAgICB0aGlzLiNwcm9jZXNzLnN0ZG91dC5waXBlKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy4jcHJvY2Vzcy5zdGRlcnIub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnRmZtcGVnKGRhdGEudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuI3BhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHRoaXMuI3BhZ2UubWFpbkZyYW1lKCk7XG4gICAgICAgICAgICBjbGllbnQub25jZShDRFBTZXNzaW9uRXZlbnQuRGlzY29ubmVjdGVkLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnN0b3AoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy4jbGFzdEZyYW1lID0gbGFzdFZhbHVlRnJvbShmcm9tRW1pdHRlckV2ZW50KGNsaWVudCwgJ1BhZ2Uuc2NyZWVuY2FzdEZyYW1lJykucGlwZSh0YXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgY2xpZW50LnNlbmQoJ1BhZ2Uuc2NyZWVuY2FzdEZyYW1lQWNrJywge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IGV2ZW50LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLCBmaWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmVudC5tZXRhZGF0YS50aW1lc3RhbXAgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pLCBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogQnVmZmVyLmZyb20oZXZlbnQuZGF0YSwgJ2Jhc2U2NCcpLFxuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IGV2ZW50Lm1ldGFkYXRhLnRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksIGJ1ZmZlckNvdW50KDIsIDEpLCBjb25jYXRNYXAoKFt7IHRpbWVzdGFtcDogcHJldmlvdXNUaW1lc3RhbXAsIGJ1ZmZlciB9LCB7IHRpbWVzdGFtcCB9XSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tKEFycmF5KE1hdGgucm91bmQoREVGQVVMVF9GUFMgKiBNYXRoLm1heCh0aW1lc3RhbXAgLSBwcmV2aW91c1RpbWVzdGFtcCwgMCkpKS5maWxsKGJ1ZmZlcikpO1xuICAgICAgICAgICAgfSksIG1hcChidWZmZXIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy4jd3JpdGVGcmFtZShidWZmZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbYnVmZmVyLCBwZXJmb3JtYW5jZS5ub3coKV07XG4gICAgICAgICAgICB9KSwgdGFrZVVudGlsKGZyb21FdmVudCh0aGlzLiNjb250cm9sbGVyLnNpZ25hbCwgJ2Fib3J0JykpKSwgeyBkZWZhdWx0VmFsdWU6IFtCdWZmZXIuZnJvbShbXSksIHBlcmZvcm1hbmNlLm5vdygpXSB9KTtcbiAgICAgICAgfVxuICAgICAgICAjZ2V0Rm9ybWF0QXJncyhmb3JtYXQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2VibSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBjb2RlYyB0byB1c2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBbJy1jOnYnLCAndnA5J10sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnLWYnLCAnd2VibSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0cyB0aGUgcXVhbGl0eS4gTG93ZXIgdGhlIGJldHRlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIFsnLWNyZicsIGAke0NSRl9WQUxVRX1gXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldHMgdGhlIHF1YWxpdHkgYW5kIGhvdyBlZmZpY2llbnQgdGhlIGNvbXByZXNzaW9uIHdpbGwgYmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBbJy1kZWFkbGluZScsICdyZWFsdGltZScsICctY3B1LXVzZWQnLCAnOCddLFxuICAgICAgICAgICAgICAgICAgICBdLmZsYXQoKTtcbiAgICAgICAgICAgICAgICBjYXNlICdnaWYnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0cyB0aGUgZnJhbWUgcmF0ZSBhbmQgdXNlcyBhIGN1c3RvbSBwYWxldHRlIGdlbmVyYXRlZCBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQuXG4gICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy12ZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zwcz01LHNwbGl0W3MwXVtzMV07W3MwXXBhbGV0dGVnZW49c3RhdHNfbW9kZT1kaWZmW3BdO1tzMV1bcF1wYWxldHRldXNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnLWYnLCAnZ2lmJ10sXG4gICAgICAgICAgICAgICAgICAgIF0uZmxhdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCAjd3JpdGVGcmFtZSgpIHsgcmV0dXJuIF9wcml2YXRlX3dyaXRlRnJhbWVfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICAvKipcbiAgICAgICAgICogU3RvcHMgdGhlIHJlY29yZGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzdG9wKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2NvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTdG9wcGluZyB0aGUgc2NyZWVuY2FzdCB3aWxsIGZsdXNoIHRoZSBmcmFtZXMuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwYWdlLl9zdG9wU2NyZWVuY2FzdCgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy4jY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgLy8gUmVwZWF0IHRoZSBsYXN0IGZyYW1lIGZvciB0aGUgcmVtYWluaW5nIGZyYW1lcy5cbiAgICAgICAgICAgIGNvbnN0IFtidWZmZXIsIHRpbWVzdGFtcF0gPSBhd2FpdCB0aGlzLiNsYXN0RnJhbWU7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheShNYXRoLm1heCgxLCBNYXRoLnJvdW5kKChERUZBVUxUX0ZQUyAqIChwZXJmb3JtYW5jZS5ub3coKSAtIHRpbWVzdGFtcCkpIC8gMTAwMCkpKVxuICAgICAgICAgICAgICAgIC5maWxsKGJ1ZmZlcilcbiAgICAgICAgICAgICAgICAubWFwKHRoaXMuI3dyaXRlRnJhbWUuYmluZCh0aGlzKSkpO1xuICAgICAgICAgICAgLy8gQ2xvc2Ugc3RkaW4gdG8gbm90aWZ5IEZGbXBlZyB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIHRoaXMuI3Byb2Nlc3Muc3RkaW4uZW5kKCk7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNwcm9jZXNzLm9uY2UoJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBbKF9wcml2YXRlX3dyaXRlRnJhbWVfZGVjb3JhdG9ycyA9IFtndWFyZGVkKCldLCBfc3RvcF9kZWNvcmF0b3JzID0gW2d1YXJkZWQoKV0sIGFzeW5jRGlzcG9zZVN5bWJvbCldKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9wKCk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IFNjcmVlblJlY29yZGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY3JlZW5SZWNvcmRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9DaHJvbWVMYXVuY2hlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZpcmVmb3hMYXVuY2hlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0xhdW5jaE9wdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXBlVHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHJvZHVjdExhdW5jaGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHVwcGV0ZWVyTm9kZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1NjcmVlblJlY29yZGVyLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vZGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBmcyBmcm9tICdmcyc7XG5jb25zdCBybU9wdGlvbnMgPSB7XG4gICAgZm9yY2U6IHRydWUsXG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgIG1heFJldHJpZXM6IDUsXG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJtKHBhdGgpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLCBybU9wdGlvbnMpO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJtU3luYyhwYXRoKSB7XG4gICAgZnMucm1TeW5jKHBhdGgsIHJtT3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9pbmRleC5qcyc7XG5pbXBvcnQgeyBQdXBwZXRlZXJOb2RlIH0gZnJvbSAnLi9ub2RlL1B1cHBldGVlck5vZGUuanMnO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IHB1cHBldGVlciA9IG5ldyBQdXBwZXRlZXJOb2RlKHtcbiAgICBpc1B1cHBldGVlckNvcmU6IHRydWUsXG59KTtcbmV4cG9ydCBjb25zdCB7IFxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmNvbm5lY3QsIFxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmRlZmF1bHRBcmdzLCBcbi8qKlxuICogQHB1YmxpY1xuICovXG5leGVjdXRhYmxlUGF0aCwgXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xubGF1bmNoLCB9ID0gcHVwcGV0ZWVyO1xuZXhwb3J0IGRlZmF1bHQgcHVwcGV0ZWVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVwcGV0ZWVyLWNvcmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQVVBQRVRFRVJfUkVWSVNJT05TID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgY2hyb21lOiAnMTI2LjAuNjQ3OC4xMjYnLFxuICAgICdjaHJvbWUtaGVhZGxlc3Mtc2hlbGwnOiAnMTI2LjAuNjQ3OC4xMjYnLFxuICAgIGZpcmVmb3g6ICdsYXRlc3QnLFxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXZpc2lvbnMuanMubWFwIiwiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jSXRlcmFibGVVdGlsIHtcbiAgICBzdGF0aWMgYXN5bmMgKm1hcChpdGVyYWJsZSwgbWFwKSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIHlpZWxkIGF3YWl0IG1hcCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jICpmbGF0TWFwKGl0ZXJhYmxlLCBtYXApIHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgeWllbGQqIG1hcCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGNvbGxlY3QoaXRlcmFibGUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZmlyc3QoaXRlcmFibGUpIHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc3luY0l0ZXJhYmxlVXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyNCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVGltZW91dEVycm9yIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBkZWZlcnJlZCBvYmplY3QgYWxvbmcgd2l0aCB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zLlxuICpcbiAqIElmIHRoZSBkZWZlcnJlZCBoYXMgbm90IGJlZW4gcmVzb2x2ZWQvcmVqZWN0ZWQgd2l0aGluIHRoZSBgdGltZW91dGAgcGVyaW9kLFxuICogdGhlIGRlZmVycmVkIGdldHMgcmVzb2x2ZXMgd2l0aCBhIHRpbWVvdXQgZXJyb3IuIGB0aW1lb3V0YCBoYXMgdG8gYmUgZ3JlYXRlciB0aGFuIDAgb3JcbiAqIGl0IGlzIGlnbm9yZWQuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgc3RhdGljIGNyZWF0ZShvcHRzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVmZXJyZWQob3B0cyk7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyByYWNlKGF3YWl0YWJsZXMpIHtcbiAgICAgICAgY29uc3QgZGVmZXJyZWRXaXRoVGltZW91dCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gYXdhaXRhYmxlcy5tYXAodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERlZmVycmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS4jdGltZW91dElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZFdpdGhUaW1lb3V0LmFkZCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlT3JUaHJvdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShwcm9taXNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlZmVycmVkIG9mIGRlZmVycmVkV2l0aFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHN0b3AgdGhlIHRpbWVvdXQgZWxzZVxuICAgICAgICAgICAgICAgIC8vIE5vZGUuSlMgd2lsbCBrZWVwIHJ1bm5pbmcgdGhlIGV2ZW50IGxvb3AgdGlsbCB0aGVcbiAgICAgICAgICAgICAgICAvLyB0aW1lciBleGVjdXRlc1xuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoJ1RpbWVvdXQgY2xlYXJlZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAjaXNSZXNvbHZlZCA9IGZhbHNlO1xuICAgICNpc1JlamVjdGVkID0gZmFsc2U7XG4gICAgI3ZhbHVlO1xuICAgIC8vIFNBRkVUWTogVGhpcyBpcyBlbnN1cmVkIGJ5ICN0YXNrUHJvbWlzZS5cbiAgICAjcmVzb2x2ZTtcbiAgICAjdGFza1Byb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gICAgI3RpbWVvdXRJZDtcbiAgICAjdGltZW91dEVycm9yO1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy50aW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgdGhpcy4jdGltZW91dEVycm9yID0gbmV3IFRpbWVvdXRFcnJvcihvcHRzLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy4jdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3QodGhpcy4jdGltZW91dEVycm9yKTtcbiAgICAgICAgICAgIH0sIG9wdHMudGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2ZpbmlzaCh2YWx1ZSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jdGltZW91dElkKTtcbiAgICAgICAgdGhpcy4jdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLiNpc1JlamVjdGVkIHx8IHRoaXMuI2lzUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNpc1Jlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jZmluaXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmVqZWN0KGVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLiNpc1JlamVjdGVkIHx8IHRoaXMuI2lzUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNpc1JlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jZmluaXNoKGVycm9yKTtcbiAgICB9XG4gICAgcmVzb2x2ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc1Jlc29sdmVkO1xuICAgIH1cbiAgICBmaW5pc2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzUmVzb2x2ZWQgfHwgdGhpcy4jaXNSZWplY3RlZDtcbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2YWx1ZTtcbiAgICB9XG4gICAgI3Byb21pc2U7XG4gICAgdmFsdWVPclRocm93KCkge1xuICAgICAgICBpZiAoIXRoaXMuI3Byb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMuI3Byb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Rhc2tQcm9taXNlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNpc1JlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMuI3ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4jdmFsdWU7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9taXNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlZmVycmVkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvckxpa2Uob2JqKSB7XG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwgJiYgJ25hbWUnIGluIG9iaiAmJiAnbWVzc2FnZScgaW4gb2JqKTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Vycm5vRXhjZXB0aW9uKG9iaikge1xuICAgIHJldHVybiAoaXNFcnJvckxpa2Uob2JqKSAmJlxuICAgICAgICAoJ2Vycm5vJyBpbiBvYmogfHwgJ2NvZGUnIGluIG9iaiB8fCAncGF0aCcgaW4gb2JqIHx8ICdzeXNjYWxsJyBpbiBvYmopKTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXdyaXRlRXJyb3IoZXJyb3IsIG1lc3NhZ2UsIG9yaWdpbmFsTWVzc2FnZSkge1xuICAgIGVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIGVycm9yLm9yaWdpbmFsTWVzc2FnZSA9IG9yaWdpbmFsTWVzc2FnZSA/PyBlcnJvci5vcmlnaW5hbE1lc3NhZ2U7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3RvY29sRXJyb3JNZXNzYWdlKG9iamVjdCkge1xuICAgIGxldCBtZXNzYWdlID0gb2JqZWN0LmVycm9yLm1lc3NhZ2U7XG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoZSB0eXBlIGNoZWNrcyB3aGVuIHdlIHN0b3AgY29ubmVjdGluZyB0byBCaURpIHdpdGggYSBDRFBcbiAgICAvLyBjbGllbnQuXG4gICAgaWYgKG9iamVjdC5lcnJvciAmJlxuICAgICAgICB0eXBlb2Ygb2JqZWN0LmVycm9yID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAnZGF0YScgaW4gb2JqZWN0LmVycm9yKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYCAke29iamVjdC5lcnJvci5kYXRhfWA7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXJyb3JMaWtlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5jb25zdCBjcmVhdGVkRnVuY3Rpb25zID0gbmV3IE1hcCgpO1xuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gZnJvbSBhIHN0cmluZy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUZ1bmN0aW9uID0gKGZ1bmN0aW9uVmFsdWUpID0+IHtcbiAgICBsZXQgZm4gPSBjcmVhdGVkRnVuY3Rpb25zLmdldChmdW5jdGlvblZhbHVlKTtcbiAgICBpZiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuO1xuICAgIH1cbiAgICBmbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICR7ZnVuY3Rpb25WYWx1ZX1gKSgpO1xuICAgIGNyZWF0ZWRGdW5jdGlvbnMuc2V0KGZ1bmN0aW9uVmFsdWUsIGZuKTtcbiAgICByZXR1cm4gZm47XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeUZ1bmN0aW9uKGZuKSB7XG4gICAgbGV0IHZhbHVlID0gZm4udG9TdHJpbmcoKTtcbiAgICB0cnkge1xuICAgICAgICBuZXcgRnVuY3Rpb24oYCgke3ZhbHVlfSlgKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoYFJlZnVzZWQgdG8gZXZhbHVhdGUgYSBzdHJpbmcgYXMgSmF2YVNjcmlwdCBiZWNhdXNlICd1bnNhZmUtZXZhbCcgaXMgbm90IGFuIGFsbG93ZWQgc291cmNlIG9mIHNjcmlwdCBpbiB0aGUgZm9sbG93aW5nIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGRpcmVjdGl2ZWApKSB7XG4gICAgICAgICAgICAvLyBUaGUgY29udGVudCBzZWN1cml0eSBwb2xpY3kgZG9lcyBub3QgYWxsb3cgRnVuY3Rpb24gZXZhbC4gTGV0J3NcbiAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgdmFsdWUgbWlnaHQgYmUgdmFsaWQgYXMgaXMuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBtaWdodCBoYXZlIGEgZnVuY3Rpb24gc2hvcnRoYW5kIChlLmcuIGB0ZXN0KCl7fWApLiBMZXQnc1xuICAgICAgICAvLyB0cnkgcHJlZml4aW5nLlxuICAgICAgICBsZXQgcHJlZml4ID0gJ2Z1bmN0aW9uICc7XG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdhc3luYyAnKSkge1xuICAgICAgICAgICAgcHJlZml4ID0gYGFzeW5jICR7cHJlZml4fWA7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygnYXN5bmMgJy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gYCR7cHJlZml4fSR7dmFsdWV9YDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ldyBGdW5jdGlvbihgKCR7dmFsdWV9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIC8vIFdlIHRyaWVkIGhhcmQgdG8gc2VyaWFsaXplLCBidXQgdGhlcmUncyBhIHdlaXJkIGJlYXN0IGhlcmUuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Bhc3NlZCBmdW5jdGlvbiBjYW5ub3QgYmUgc2VyaWFsaXplZCEnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4vKipcbiAqIFJlcGxhY2VzIGBQTEFDRUhPTERFUmBzIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50cy5cbiAqXG4gKiBBbGwgcmVwbGFjZW1lbnRzIG11c3QgYmUgdmFsaWQgSlMgY29kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBpbnRlcnBvbGF0ZUZ1bmN0aW9uKCgpID0+IFBMQUNFSE9MREVSKCd0ZXN0JyksIHt0ZXN0OiAndm9pZCAwJ30pO1xuICogLy8gRXF1aXZhbGVudCB0byAoKSA9PiB2b2lkIDBcbiAqIGBgYFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaW50ZXJwb2xhdGVGdW5jdGlvbiA9IChmbiwgcmVwbGFjZW1lbnRzKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gc3RyaW5naWZ5RnVuY3Rpb24oZm4pO1xuICAgIGZvciAoY29uc3QgW25hbWUsIGpzVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcGxhY2VtZW50cykpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYFBMQUNFSE9MREVSXFxcXChcXFxccyooPzonJHtuYW1lfSd8XCIke25hbWV9XCIpXFxcXHMqXFxcXClgLCAnZycpLCBcbiAgICAgICAgLy8gV3JhcHBpbmcgdGhpcyBlbnN1cmVzIHRlcnNlcnMgdGhhdCBhY2NpZGVudGFsbHkgaW5saW5lIFBMQUNFSE9MREVSIGNhbGxzXG4gICAgICAgIC8vIGFyZSBzdGlsbCB2YWxpZC4gV2l0aG91dCwgd2UgbWF5IGdldCBjYWxscyBsaWtlICgpPT57Li4ufSgpIHdoaWNoIGlzXG4gICAgICAgIC8vIG5vdCB2YWxpZC5cbiAgICAgICAgYCgke2pzVmFsdWV9KWApO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb24odmFsdWUpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZ1bmN0aW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4vZGlzcG9zYWJsZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTXV0ZXgge1xuICAgIHN0YXRpYyBHdWFyZCA9IGNsYXNzIEd1YXJkIHtcbiAgICAgICAgI211dGV4O1xuICAgICAgICAjb25SZWxlYXNlO1xuICAgICAgICBjb25zdHJ1Y3RvcihtdXRleCwgb25SZWxlYXNlKSB7XG4gICAgICAgICAgICB0aGlzLiNtdXRleCA9IG11dGV4O1xuICAgICAgICAgICAgdGhpcy4jb25SZWxlYXNlID0gb25SZWxlYXNlO1xuICAgICAgICB9XG4gICAgICAgIFtkaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgICAgIHRoaXMuI29uUmVsZWFzZT8uKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jbXV0ZXgucmVsZWFzZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAjbG9ja2VkID0gZmFsc2U7XG4gICAgI2FjcXVpcmVycyA9IFtdO1xuICAgIC8vIFRoaXMgaXMgRklGTy5cbiAgICBhc3luYyBhY3F1aXJlKG9uUmVsZWFzZSkge1xuICAgICAgICBpZiAoIXRoaXMuI2xvY2tlZCkge1xuICAgICAgICAgICAgdGhpcy4jbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTXV0ZXguR3VhcmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAgICAgdGhpcy4jYWNxdWlyZXJzLnB1c2goZGVmZXJyZWQucmVzb2x2ZS5iaW5kKGRlZmVycmVkKSk7XG4gICAgICAgIGF3YWl0IGRlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgICAgICByZXR1cm4gbmV3IE11dGV4Lkd1YXJkKHRoaXMsIG9uUmVsZWFzZSk7XG4gICAgfVxuICAgIHJlbGVhc2UoKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmUgPSB0aGlzLiNhY3F1aXJlcnMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCFyZXNvbHZlKSB7XG4gICAgICAgICAgICB0aGlzLiNsb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXV0ZXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiB2YWx1ZSBpcyB0cnV0aHkuXG4gKiBAcGFyYW0gdmFsdWUgLSBzb21lIGNvbmRpdGlvbmFsIHN0YXRlbWVudFxuICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHRydXRoeS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGFzc2VydCA9ICh2YWx1ZSwgbWVzc2FnZSkgPT4ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hc3NlcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBhc3luY0Rpc3Bvc2VTeW1ib2wsIGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgTXV0ZXggfSBmcm9tICcuL011dGV4LmpzJztcbmNvbnN0IGluc3RhbmNlcyA9IG5ldyBXZWFrU2V0KCk7XG5leHBvcnQgZnVuY3Rpb24gbW92ZWFibGUoQ2xhc3MsIF8pIHtcbiAgICBsZXQgaGFzRGlzcG9zZSA9IGZhbHNlO1xuICAgIGlmIChDbGFzcy5wcm90b3R5cGVbZGlzcG9zZVN5bWJvbF0pIHtcbiAgICAgICAgY29uc3QgZGlzcG9zZSA9IENsYXNzLnByb3RvdHlwZVtkaXNwb3NlU3ltYm9sXTtcbiAgICAgICAgQ2xhc3MucHJvdG90eXBlW2Rpc3Bvc2VTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlcy5oYXModGhpcykpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXMuZGVsZXRlKHRoaXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkaXNwb3NlLmNhbGwodGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIGhhc0Rpc3Bvc2UgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoQ2xhc3MucHJvdG90eXBlW2FzeW5jRGlzcG9zZVN5bWJvbF0pIHtcbiAgICAgICAgY29uc3QgYXN5bmNEaXNwb3NlID0gQ2xhc3MucHJvdG90eXBlW2FzeW5jRGlzcG9zZVN5bWJvbF07XG4gICAgICAgIENsYXNzLnByb3RvdHlwZVthc3luY0Rpc3Bvc2VTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlcy5oYXModGhpcykpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXMuZGVsZXRlKHRoaXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhc3luY0Rpc3Bvc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgaGFzRGlzcG9zZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChoYXNEaXNwb3NlKSB7XG4gICAgICAgIENsYXNzLnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaW5zdGFuY2VzLmFkZCh0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gQ2xhc3M7XG59XG5leHBvcnQgZnVuY3Rpb24gdGhyb3dJZkRpc3Bvc2VkKG1lc3NhZ2UgPSB2YWx1ZSA9PiB7XG4gICAgcmV0dXJuIGBBdHRlbXB0ZWQgdG8gdXNlIGRpc3Bvc2VkICR7dmFsdWUuY29uc3RydWN0b3IubmFtZX0uYDtcbn0pIHtcbiAgICByZXR1cm4gKHRhcmdldCwgXykgPT4ge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gaW5lcnRJZkRpc3Bvc2VkKHRhcmdldCwgXykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQuY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICB9O1xufVxuLyoqXG4gKiBUaGUgZGVjb3JhdG9yIG9ubHkgaW52b2tlcyB0aGUgdGFyZ2V0IGlmIHRoZSB0YXJnZXQgaGFzIG5vdCBiZWVuIGludm9rZWQgd2l0aFxuICogdGhlIHNhbWUgYXJndW1lbnRzIGJlZm9yZS4gVGhlIGRlY29yYXRlZCBtZXRob2QgdGhyb3dzIGFuIGVycm9yIGlmIGl0J3NcbiAqIGludm9rZWQgd2l0aCBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHM6IGlmIHlvdSBkZWNvcmF0ZSBhIG1ldGhvZCwgaXRcbiAqIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHNcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHModGFyZ2V0LCBfKSB7XG4gICAgY29uc3QgY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuICAgIGxldCBjYWNoZURlcHRoID0gLTE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGlmIChjYWNoZURlcHRoID09PSAtMSkge1xuICAgICAgICAgICAgY2FjaGVEZXB0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWNoZURlcHRoICE9PSBhcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vaXplZCBtZXRob2Qgd2FzIGNhbGxlZCB3aXRoIHRoZSB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZyZXNoQXJndW1lbnRzID0gZmFsc2U7XG4gICAgICAgIGxldCBjYWNoZUl0ZXJhdG9yID0gY2FjaGU7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgIGlmIChjYWNoZUl0ZXJhdG9yLmhhcyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgY2FjaGVJdGVyYXRvciA9IGNhY2hlSXRlcmF0b3IuZ2V0KGFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmVzaEFyZ3VtZW50cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2FjaGVJdGVyYXRvci5zZXQoYXJnLCBuZXcgV2Vha01hcCgpKTtcbiAgICAgICAgICAgICAgICBjYWNoZUl0ZXJhdG9yID0gY2FjaGVJdGVyYXRvci5nZXQoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZyZXNoQXJndW1lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ3VhcmRlZChnZXRLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG59KSB7XG4gICAgcmV0dXJuICh0YXJnZXQsIF8pID0+IHtcbiAgICAgICAgY29uc3QgbXV0ZXhlcyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGdldEtleS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIGxldCBtdXRleCA9IG11dGV4ZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFtdXRleCkge1xuICAgICAgICAgICAgICAgICAgICBtdXRleCA9IG5ldyBNdXRleCgpO1xuICAgICAgICAgICAgICAgICAgICBtdXRleGVzLnNldChrZXksIG11dGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgXyA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBhd2FpdCBtdXRleC5hY3F1aXJlKCksIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0YXJnZXQuY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzEpIHtcbiAgICAgICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgICAgICBlbnZfMS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRfMSA9IF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdF8xKVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXN1bHRfMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xufVxuY29uc3QgYnViYmxlSGFuZGxlcnMgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgYnViYmxlSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZXZlbnRzKSB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSBidWJibGVIYW5kbGVycy5nZXQodGhpcykgPz8gbmV3IE1hcCgpO1xuICAgIGlmIChoYW5kbGVycy5oYXMoZXZlbnRzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXIgPSBldmVudHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/ICh0eXBlLCBldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50cy5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCh0eXBlLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgOiAodHlwZSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCh0eXBlLCBldmVudCk7XG4gICAgICAgIH07XG4gICAgaGFuZGxlcnMuc2V0KGV2ZW50cywgaGFuZGxlcik7XG4gICAgYnViYmxlSGFuZGxlcnMuc2V0KHRoaXMsIGhhbmRsZXJzKTtcbn07XG4vKipcbiAqIEV2ZW50IGVtaXR0ZXIgZmllbGRzIG1hcmtlZCB3aXRoIGBidWJibGVgIHdpbGwgaGF2ZSB0aGVpciBldmVudHMgYnViYmxlIHVwXG4gKiB0aGUgZmllbGQgb3duZXIuXG4gKi9cbi8vIFRoZSB0eXBlIGlzIHRvbyBjb21wbGljYXRlZCB0byB0eXBlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbmV4cG9ydCBmdW5jdGlvbiBidWJibGUoZXZlbnRzKSB7XG4gICAgcmV0dXJuICh7IHNldCwgZ2V0IH0sIGNvbnRleHQpID0+IHtcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gYnViYmxlSW5pdGlhbGl6ZXIuYXBwbHkodGhpcywgW2V2ZW50c10pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNldChlbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IGJ1YmJsZUhhbmRsZXJzLmdldCh0aGlzKS5nZXQoZXZlbnRzKTtcbiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGFyZSByZS1zZXR0aW5nLlxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZEVtaXR0ZXIgPSBnZXQuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAob2xkRW1pdHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZEVtaXR0ZXIub2ZmKCcqJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbWl0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbWl0dGVyLm9uKCcqJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgc2V0LmNhbGwodGhpcywgZW1pdHRlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5pdChlbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVtaXR0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdHRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnViYmxlSW5pdGlhbGl6ZXIuYXBwbHkodGhpcywgW2V2ZW50c10pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBidWJibGVIYW5kbGVycy5nZXQodGhpcykuZ2V0KGV2ZW50cyk7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5vbignKicsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbWl0dGVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVjb3JhdG9ycy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuU3ltYm9sLmRpc3Bvc2UgPz89IFN5bWJvbCgnZGlzcG9zZScpO1xuU3ltYm9sLmFzeW5jRGlzcG9zZSA/Pz0gU3ltYm9sKCdhc3luY0Rpc3Bvc2UnKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBkaXNwb3NlU3ltYm9sID0gU3ltYm9sLmRpc3Bvc2U7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgYXN5bmNEaXNwb3NlU3ltYm9sID0gU3ltYm9sLmFzeW5jRGlzcG9zZTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXNwb3NhYmxlU3RhY2sge1xuICAgICNkaXNwb3NlZCA9IGZhbHNlO1xuICAgICNzdGFjayA9IFtdO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBzdGFjayBoYXMgYmVlbiBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBnZXQgZGlzcG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkaXNwb3NlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZXMgZWFjaCByZXNvdXJjZSBpbiB0aGUgc3RhY2sgaW4gdGhlIHJldmVyc2Ugb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWRkZWQuXG4gICAgICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHRoaXMuI3N0YWNrLnJldmVyc2UoKSkge1xuICAgICAgICAgICAgcmVzb3VyY2VbZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZGlzcG9zYWJsZSByZXNvdXJjZSB0byB0aGUgc3RhY2ssIHJldHVybmluZyB0aGUgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgcmVzb3VyY2UgdG8gYWRkLiBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIHdpbGwgbm90IGJlIGFkZGVkLFxuICAgICAqIGJ1dCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEByZXR1cm5zIFRoZSBwcm92aWRlZCBgdmFsdWVgLlxuICAgICAqL1xuICAgIHVzZSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuI3N0YWNrLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHZhbHVlIGFuZCBhc3NvY2lhdGVkIGRpc3Bvc2FsIGNhbGxiYWNrIGFzIGEgcmVzb3VyY2UgdG8gdGhlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0gb25EaXNwb3NlIC0gVGhlIGNhbGxiYWNrIHRvIHVzZSBpbiBwbGFjZSBvZiBhIGBbZGlzcG9zZVN5bWJvbF0oKWBcbiAgICAgKiBtZXRob2QuIFdpbGwgYmUgaW52b2tlZCB3aXRoIGB2YWx1ZWAgYXMgdGhlIGZpcnN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvdmlkZWQgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBhZG9wdCh2YWx1ZSwgb25EaXNwb3NlKSB7XG4gICAgICAgIHRoaXMuI3N0YWNrLnB1c2goe1xuICAgICAgICAgICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICAgICAgICAgIG9uRGlzcG9zZSh2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBzdGFjayBpcyBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBkZWZlcihvbkRpc3Bvc2UpIHtcbiAgICAgICAgdGhpcy4jc3RhY2sucHVzaCh7XG4gICAgICAgICAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgICAgICAgICAgb25EaXNwb3NlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTW92ZSBhbGwgcmVzb3VyY2VzIG91dCBvZiB0aGlzIHN0YWNrIGFuZCBpbnRvIGEgbmV3IGBEaXNwb3NhYmxlU3RhY2tgLCBhbmRcbiAgICAgKiBtYXJrcyB0aGlzIHN0YWNrIGFzIGRpc3Bvc2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY2xhc3MgQyB7XG4gICAgICogICAjcmVzMTogRGlzcG9zYWJsZTtcbiAgICAgKiAgICNyZXMyOiBEaXNwb3NhYmxlO1xuICAgICAqICAgI2Rpc3Bvc2FibGVzOiBEaXNwb3NhYmxlU3RhY2s7XG4gICAgICogICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgKiAgICAgLy8gc3RhY2sgd2lsbCBiZSBkaXNwb3NlZCB3aGVuIGV4aXRpbmcgY29uc3RydWN0b3IgZm9yIGFueSByZWFzb25cbiAgICAgKiAgICAgdXNpbmcgc3RhY2sgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgICpcbiAgICAgKiAgICAgLy8gZ2V0IGZpcnN0IHJlc291cmNlXG4gICAgICogICAgIHRoaXMuI3JlczEgPSBzdGFjay51c2UoZ2V0UmVzb3VyY2UxKCkpO1xuICAgICAqXG4gICAgICogICAgIC8vIGdldCBzZWNvbmQgcmVzb3VyY2UuIElmIHRoaXMgZmFpbHMsIGJvdGggYHN0YWNrYCBhbmQgYCNyZXMxYCB3aWxsIGJlIGRpc3Bvc2VkLlxuICAgICAqICAgICB0aGlzLiNyZXMyID0gc3RhY2sudXNlKGdldFJlc291cmNlMigpKTtcbiAgICAgKlxuICAgICAqICAgICAvLyBhbGwgb3BlcmF0aW9ucyBzdWNjZWVkZWQsIG1vdmUgcmVzb3VyY2VzIG91dCBvZiBgc3RhY2tgIHNvIHRoYXRcbiAgICAgKiAgICAgLy8gdGhleSBhcmVuJ3QgZGlzcG9zZWQgd2hlbiBjb25zdHJ1Y3RvciBleGl0c1xuICAgICAqICAgICB0aGlzLiNkaXNwb3NhYmxlcyA9IHN0YWNrLm1vdmUoKTtcbiAgICAgKiAgIH1cbiAgICAgKlxuICAgICAqICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAqICAgICB0aGlzLiNkaXNwb3NhYmxlcy5kaXNwb3NlKCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCdhIGRpc3Bvc2VkIHN0YWNrIGNhbiBub3QgdXNlIGFueXRoaW5nIG5ldycpOyAvLyBzdGVwIDNcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFjayA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTsgLy8gc3RlcCA0LTVcbiAgICAgICAgc3RhY2suI3N0YWNrID0gdGhpcy4jc3RhY2s7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH1cbiAgICBbZGlzcG9zZVN5bWJvbF0gPSB0aGlzLmRpc3Bvc2U7XG4gICAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnRGlzcG9zYWJsZVN0YWNrJztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0Rpc3Bvc2FibGVTdGFjayB7XG4gICAgI2Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgI3N0YWNrID0gW107XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHN0YWNrIGhhcyBiZWVuIGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlcyBlYWNoIHJlc291cmNlIGluIHRoZSBzdGFjayBpbiB0aGUgcmV2ZXJzZSBvcmRlciB0aGF0IHRoZXkgd2VyZSBhZGRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNkaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgdGhpcy4jc3RhY2sucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBhd2FpdCByZXNvdXJjZVthc3luY0Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGRpc3Bvc2FibGUgcmVzb3VyY2UgdG8gdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIHJlc291cmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHJlc291cmNlIHRvIGFkZC4gYG51bGxgIGFuZCBgdW5kZWZpbmVkYCB3aWxsIG5vdCBiZSBhZGRlZCxcbiAgICAgKiBidXQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvdmlkZWQgYHZhbHVlYC5cbiAgICAgKi9cbiAgICB1c2UodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLiNzdGFjay5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB2YWx1ZSBhbmQgYXNzb2NpYXRlZCBkaXNwb3NhbCBjYWxsYmFjayBhcyBhIHJlc291cmNlIHRvIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBhZGQuXG4gICAgICogQHBhcmFtIG9uRGlzcG9zZSAtIFRoZSBjYWxsYmFjayB0byB1c2UgaW4gcGxhY2Ugb2YgYSBgW2Rpc3Bvc2VTeW1ib2xdKClgXG4gICAgICogbWV0aG9kLiBXaWxsIGJlIGludm9rZWQgd2l0aCBgdmFsdWVgIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMgVGhlIHByb3ZpZGVkIGB2YWx1ZWAuXG4gICAgICovXG4gICAgYWRvcHQodmFsdWUsIG9uRGlzcG9zZSkge1xuICAgICAgICB0aGlzLiNzdGFjay5wdXNoKHtcbiAgICAgICAgICAgIFthc3luY0Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvbkRpc3Bvc2UodmFsdWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc3RhY2sgaXMgZGlzcG9zZWQuXG4gICAgICovXG4gICAgZGVmZXIob25EaXNwb3NlKSB7XG4gICAgICAgIHRoaXMuI3N0YWNrLnB1c2goe1xuICAgICAgICAgICAgW2FzeW5jRGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9uRGlzcG9zZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmUgYWxsIHJlc291cmNlcyBvdXQgb2YgdGhpcyBzdGFjayBhbmQgaW50byBhIG5ldyBgRGlzcG9zYWJsZVN0YWNrYCwgYW5kXG4gICAgICogbWFya3MgdGhpcyBzdGFjayBhcyBkaXNwb3NlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNsYXNzIEMge1xuICAgICAqICAgI3JlczE6IERpc3Bvc2FibGU7XG4gICAgICogICAjcmVzMjogRGlzcG9zYWJsZTtcbiAgICAgKiAgICNkaXNwb3NhYmxlczogRGlzcG9zYWJsZVN0YWNrO1xuICAgICAqICAgY29uc3RydWN0b3IoKSB7XG4gICAgICogICAgIC8vIHN0YWNrIHdpbGwgYmUgZGlzcG9zZWQgd2hlbiBleGl0aW5nIGNvbnN0cnVjdG9yIGZvciBhbnkgcmVhc29uXG4gICAgICogICAgIHVzaW5nIHN0YWNrID0gbmV3IERpc3Bvc2FibGVTdGFjaygpO1xuICAgICAqXG4gICAgICogICAgIC8vIGdldCBmaXJzdCByZXNvdXJjZVxuICAgICAqICAgICB0aGlzLiNyZXMxID0gc3RhY2sudXNlKGdldFJlc291cmNlMSgpKTtcbiAgICAgKlxuICAgICAqICAgICAvLyBnZXQgc2Vjb25kIHJlc291cmNlLiBJZiB0aGlzIGZhaWxzLCBib3RoIGBzdGFja2AgYW5kIGAjcmVzMWAgd2lsbCBiZSBkaXNwb3NlZC5cbiAgICAgKiAgICAgdGhpcy4jcmVzMiA9IHN0YWNrLnVzZShnZXRSZXNvdXJjZTIoKSk7XG4gICAgICpcbiAgICAgKiAgICAgLy8gYWxsIG9wZXJhdGlvbnMgc3VjY2VlZGVkLCBtb3ZlIHJlc291cmNlcyBvdXQgb2YgYHN0YWNrYCBzbyB0aGF0XG4gICAgICogICAgIC8vIHRoZXkgYXJlbid0IGRpc3Bvc2VkIHdoZW4gY29uc3RydWN0b3IgZXhpdHNcbiAgICAgKiAgICAgdGhpcy4jZGlzcG9zYWJsZXMgPSBzdGFjay5tb3ZlKCk7XG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiAgIFtkaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgKiAgICAgdGhpcy4jZGlzcG9zYWJsZXMuZGlzcG9zZSgpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb3ZlKCkge1xuICAgICAgICBpZiAodGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcignYSBkaXNwb3NlZCBzdGFjayBjYW4gbm90IHVzZSBhbnl0aGluZyBuZXcnKTsgLy8gc3RlcCAzXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgQXN5bmNEaXNwb3NhYmxlU3RhY2soKTsgLy8gc3RlcCA0LTVcbiAgICAgICAgc3RhY2suI3N0YWNrID0gdGhpcy4jc3RhY2s7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH1cbiAgICBbYXN5bmNEaXNwb3NlU3ltYm9sXSA9IHRoaXMuZGlzcG9zZTtcbiAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdBc3luY0Rpc3Bvc2FibGVTdGFjayc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXNwb3NhYmxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL2Fzc2VydC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0RlZmVycmVkLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXJyb3JMaWtlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQXN5bmNJdGVyYWJsZVV0aWwuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXNwb3NhYmxlLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWwuanMubWFwIiwiLyoqXG5NSVQgTGljZW5zZVxuXG5Db3B5cmlnaHQgKGMpIDIwMjEgSmFzb24gTWlsbGVyXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG5jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG5TT0ZUV0FSRS5cblxuKi9cbi8vIC4uLy4uL25vZGVfbW9kdWxlcy9taXR0L2Rpc3QvbWl0dC5tanNcbmZ1bmN0aW9uIG1pdHRfZGVmYXVsdChuKSB7XG4gIHJldHVybiB7IGFsbDogbiA9IG4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgb246IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICB2YXIgaSA9IG4uZ2V0KHQpO1xuICAgIGkgPyBpLnB1c2goZSkgOiBuLnNldCh0LCBbZV0pO1xuICB9LCBvZmY6IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICB2YXIgaSA9IG4uZ2V0KHQpO1xuICAgIGkgJiYgKGUgPyBpLnNwbGljZShpLmluZGV4T2YoZSkgPj4+IDAsIDEpIDogbi5zZXQodCwgW10pKTtcbiAgfSwgZW1pdDogZnVuY3Rpb24odCwgZSkge1xuICAgIHZhciBpID0gbi5nZXQodCk7XG4gICAgaSAmJiBpLnNsaWNlKCkubWFwKGZ1bmN0aW9uKG4yKSB7XG4gICAgICBuMihlKTtcbiAgICB9KSwgKGkgPSBuLmdldChcIipcIikpICYmIGkuc2xpY2UoKS5tYXAoZnVuY3Rpb24objIpIHtcbiAgICAgIG4yKHQsIGUpO1xuICAgIH0pO1xuICB9IH07XG59XG5leHBvcnQge1xuICBtaXR0X2RlZmF1bHQgYXMgZGVmYXVsdFxufTtcbiIsIi8qKlxuTUlUIExpY2Vuc2VcblxuQ29weXJpZ2h0IChjKSAyMDIwIExlYSBWZXJvdVxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuU09GVFdBUkUuXG5cbiovXG4vLyAuLi8uLi9ub2RlX21vZHVsZXMvcGFyc2VsLWpzL2Rpc3QvcGFyc2VsLmpzXG52YXIgVE9LRU5TID0ge1xuICBhdHRyaWJ1dGU6IC9cXFtcXHMqKD86KD88bmFtZXNwYWNlPlxcKnxbLVxcd1xcUHtBU0NJSX1dKilcXHwpPyg/PG5hbWU+Wy1cXHdcXFB7QVNDSUl9XSspXFxzKig/Oig/PG9wZXJhdG9yPlxcVz89KVxccyooPzx2YWx1ZT4uKz8pXFxzKihcXHMoPzxjYXNlU2Vuc2l0aXZlPltpSXNTXSkpP1xccyopP1xcXS9ndSxcbiAgaWQ6IC8jKD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykvZ3UsXG4gIGNsYXNzOiAvXFwuKD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykvZ3UsXG4gIGNvbW1hOiAvXFxzKixcXHMqL2csXG4gIGNvbWJpbmF0b3I6IC9cXHMqW1xccz4rfl1cXHMqL2csXG4gIFwicHNldWRvLWVsZW1lbnRcIjogLzo6KD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykoPzpcXCgoPzxhcmd1bWVudD7CtiopXFwpKT8vZ3UsXG4gIFwicHNldWRvLWNsYXNzXCI6IC86KD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykoPzpcXCgoPzxhcmd1bWVudD7CtiopXFwpKT8vZ3UsXG4gIHVuaXZlcnNhbDogLyg/Oig/PG5hbWVzcGFjZT5cXCp8Wy1cXHdcXFB7QVNDSUl9XSopXFx8KT9cXCovZ3UsXG4gIHR5cGU6IC8oPzooPzxuYW1lc3BhY2U+XFwqfFstXFx3XFxQe0FTQ0lJfV0qKVxcfCk/KD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykvZ3VcbiAgLy8gdGhpcyBtdXN0IGJlIGxhc3Rcbn07XG52YXIgVFJJTV9UT0tFTlMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXCJjb21iaW5hdG9yXCIsIFwiY29tbWFcIl0pO1xudmFyIGdldEFyZ3VtZW50UGF0dGVybkJ5VHlwZSA9ICh0eXBlKSA9PiB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJwc2V1ZG8tZWxlbWVudFwiOlxuICAgIGNhc2UgXCJwc2V1ZG8tY2xhc3NcIjpcbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKFRPS0VOU1t0eXBlXS5zb3VyY2UucmVwbGFjZShcIig/PGFyZ3VtZW50PlxceEI2KilcIiwgXCIoPzxhcmd1bWVudD4uKilcIiksIFwiZ3VcIik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBUT0tFTlNbdHlwZV07XG4gIH1cbn07XG5mdW5jdGlvbiBnb2JibGVQYXJlbnModGV4dCwgb2Zmc2V0KSB7XG4gIGxldCBuZXN0aW5nID0gMDtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGZvciAoOyBvZmZzZXQgPCB0ZXh0Lmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICBjb25zdCBjaGFyID0gdGV4dFtvZmZzZXRdO1xuICAgIHN3aXRjaCAoY2hhcikge1xuICAgICAgY2FzZSBcIihcIjpcbiAgICAgICAgKytuZXN0aW5nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCIpXCI6XG4gICAgICAgIC0tbmVzdGluZztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJlc3VsdCArPSBjaGFyO1xuICAgIGlmIChuZXN0aW5nID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdG9rZW5pemVCeSh0ZXh0LCBncmFtbWFyID0gVE9LRU5TKSB7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCB0b2tlbnMgPSBbdGV4dF07XG4gIGZvciAoY29uc3QgW3R5cGUsIHBhdHRlcm5dIG9mIE9iamVjdC5lbnRyaWVzKGdyYW1tYXIpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKHRva2VuKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBmcm9tID0gbWF0Y2guaW5kZXggLSAxO1xuICAgICAgY29uc3QgYXJncyA9IFtdO1xuICAgICAgY29uc3QgY29udGVudCA9IG1hdGNoWzBdO1xuICAgICAgY29uc3QgYmVmb3JlID0gdG9rZW4uc2xpY2UoMCwgZnJvbSArIDEpO1xuICAgICAgaWYgKGJlZm9yZSkge1xuICAgICAgICBhcmdzLnB1c2goYmVmb3JlKTtcbiAgICAgIH1cbiAgICAgIGFyZ3MucHVzaCh7XG4gICAgICAgIC4uLm1hdGNoLmdyb3VwcyxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgY29udGVudFxuICAgICAgfSk7XG4gICAgICBjb25zdCBhZnRlciA9IHRva2VuLnNsaWNlKGZyb20gKyBjb250ZW50Lmxlbmd0aCArIDEpO1xuICAgICAgaWYgKGFmdGVyKSB7XG4gICAgICAgIGFyZ3MucHVzaChhZnRlcik7XG4gICAgICB9XG4gICAgICB0b2tlbnMuc3BsaWNlKGksIDEsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB0b2tlbikge1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2VxdWVuY2UgJHt0b2tlbn0gZm91bmQgYXQgaW5kZXggJHtvZmZzZXR9YCk7XG4gICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgIG9mZnNldCArPSB0b2tlbi5jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgdG9rZW4ucG9zID0gW29mZnNldCAtIHRva2VuLmNvbnRlbnQubGVuZ3RoLCBvZmZzZXRdO1xuICAgICAgICBpZiAoVFJJTV9UT0tFTlMuaGFzKHRva2VuLnR5cGUpKSB7XG4gICAgICAgICAgdG9rZW4uY29udGVudCA9IHRva2VuLmNvbnRlbnQudHJpbSgpIHx8IFwiIFwiO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG9rZW5zO1xufVxudmFyIFNUUklOR19QQVRURVJOID0gLyhbJ1wiXSkoW15cXFxcXFxuXSs/KVxcMS9nO1xudmFyIEVTQ0FQRV9QQVRURVJOID0gL1xcXFwuL2c7XG5mdW5jdGlvbiB0b2tlbml6ZShzZWxlY3RvciwgZ3JhbW1hciA9IFRPS0VOUykge1xuICBzZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKTtcbiAgaWYgKHNlbGVjdG9yID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHJlcGxhY2VtZW50cyA9IFtdO1xuICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoRVNDQVBFX1BBVFRFUk4sICh2YWx1ZSwgb2Zmc2V0KSA9PiB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyB2YWx1ZSwgb2Zmc2V0IH0pO1xuICAgIHJldHVybiBcIlxcdUUwMDBcIi5yZXBlYXQodmFsdWUubGVuZ3RoKTtcbiAgfSk7XG4gIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZShTVFJJTkdfUEFUVEVSTiwgKHZhbHVlLCBxdW90ZSwgY29udGVudCwgb2Zmc2V0KSA9PiB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyB2YWx1ZSwgb2Zmc2V0IH0pO1xuICAgIHJldHVybiBgJHtxdW90ZX0ke1wiXFx1RTAwMVwiLnJlcGVhdChjb250ZW50Lmxlbmd0aCl9JHtxdW90ZX1gO1xuICB9KTtcbiAge1xuICAgIGxldCBwb3MgPSAwO1xuICAgIGxldCBvZmZzZXQ7XG4gICAgd2hpbGUgKChvZmZzZXQgPSBzZWxlY3Rvci5pbmRleE9mKFwiKFwiLCBwb3MpKSA+IC0xKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGdvYmJsZVBhcmVucyhzZWxlY3Rvciwgb2Zmc2V0KTtcbiAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHsgdmFsdWUsIG9mZnNldCB9KTtcbiAgICAgIHNlbGVjdG9yID0gYCR7c2VsZWN0b3Iuc3Vic3RyaW5nKDAsIG9mZnNldCl9KCR7XCJcXHhCNlwiLnJlcGVhdCh2YWx1ZS5sZW5ndGggLSAyKX0pJHtzZWxlY3Rvci5zdWJzdHJpbmcob2Zmc2V0ICsgdmFsdWUubGVuZ3RoKX1gO1xuICAgICAgcG9zID0gb2Zmc2V0ICsgdmFsdWUubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZUJ5KHNlbGVjdG9yLCBncmFtbWFyKTtcbiAgY29uc3QgY2hhbmdlZFRva2VucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGZvciAoY29uc3QgcmVwbGFjZW1lbnQgb2YgcmVwbGFjZW1lbnRzLnJldmVyc2UoKSkge1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICBjb25zdCB7IG9mZnNldCwgdmFsdWUgfSA9IHJlcGxhY2VtZW50O1xuICAgICAgaWYgKCEodG9rZW4ucG9zWzBdIDw9IG9mZnNldCAmJiBvZmZzZXQgKyB2YWx1ZS5sZW5ndGggPD0gdG9rZW4ucG9zWzFdKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgY29udGVudCB9ID0gdG9rZW47XG4gICAgICBjb25zdCB0b2tlbk9mZnNldCA9IG9mZnNldCAtIHRva2VuLnBvc1swXTtcbiAgICAgIHRva2VuLmNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIHRva2VuT2Zmc2V0KSArIHZhbHVlICsgY29udGVudC5zbGljZSh0b2tlbk9mZnNldCArIHZhbHVlLmxlbmd0aCk7XG4gICAgICBpZiAodG9rZW4uY29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgICBjaGFuZ2VkVG9rZW5zLmFkZCh0b2tlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgdG9rZW4gb2YgY2hhbmdlZFRva2Vucykge1xuICAgIGNvbnN0IHBhdHRlcm4gPSBnZXRBcmd1bWVudFBhdHRlcm5CeVR5cGUodG9rZW4udHlwZSk7XG4gICAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdG9rZW4gdHlwZTogJHt0b2tlbi50eXBlfWApO1xuICAgIH1cbiAgICBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWModG9rZW4uY29udGVudCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgY29udGVudCBmb3IgJHt0b2tlbi50eXBlfTogJHt0b2tlbi5jb250ZW50fWApO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHRva2VuLCBtYXRjaC5ncm91cHMpO1xuICB9XG4gIHJldHVybiB0b2tlbnM7XG59XG5mdW5jdGlvbiogZmxhdHRlbihub2RlLCBwYXJlbnQpIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwibGlzdFwiOlxuICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5saXN0KSB7XG4gICAgICAgIHlpZWxkKiBmbGF0dGVuKGNoaWxkLCBub2RlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJjb21wbGV4XCI6XG4gICAgICB5aWVsZCogZmxhdHRlbihub2RlLmxlZnQsIG5vZGUpO1xuICAgICAgeWllbGQqIGZsYXR0ZW4obm9kZS5yaWdodCwgbm9kZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiY29tcG91bmRcIjpcbiAgICAgIHlpZWxkKiBub2RlLmxpc3QubWFwKCh0b2tlbikgPT4gW3Rva2VuLCBub2RlXSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgeWllbGQgW25vZGUsIHBhcmVudF07XG4gIH1cbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeShsaXN0T3JOb2RlKSB7XG4gIGxldCB0b2tlbnM7XG4gIGlmIChBcnJheS5pc0FycmF5KGxpc3RPck5vZGUpKSB7XG4gICAgdG9rZW5zID0gbGlzdE9yTm9kZTtcbiAgfSBlbHNlIHtcbiAgICB0b2tlbnMgPSBbLi4uZmxhdHRlbihsaXN0T3JOb2RlKV0ubWFwKChbdG9rZW5dKSA9PiB0b2tlbik7XG4gIH1cbiAgcmV0dXJuIHRva2Vucy5tYXAoKHRva2VuKSA9PiB0b2tlbi5jb250ZW50KS5qb2luKFwiXCIpO1xufVxuZXhwb3J0IHtcbiAgVE9LRU5TLFxuICBzdHJpbmdpZnksXG4gIHRva2VuaXplXG59O1xuIiwiLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0XG4gICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL1xuXG4gVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OXG5cbiAxLiBEZWZpbml0aW9ucy5cblxuICAgIFwiTGljZW5zZVwiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbixcbiAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC5cblxuICAgIFwiTGljZW5zb3JcIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnlcbiAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICBcIkxlZ2FsIEVudGl0eVwiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGxcbiAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uXG4gICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbixcbiAgICBcImNvbnRyb2xcIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZVxuICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yXG4gICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlXG4gICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS5cblxuICAgIFwiWW91XCIgKG9yIFwiWW91clwiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5XG4gICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS5cblxuICAgIFwiU291cmNlXCIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsXG4gICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvblxuICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG5cbiAgICBcIk9iamVjdFwiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsXG4gICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dFxuICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbixcbiAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuXG5cbiAgICBcIldvcmtcIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yXG4gICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYVxuICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29ya1xuICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuXG5cbiAgICBcIkRlcml2YXRpdmUgV29ya3NcIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3RcbiAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlXG4gICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9uc1xuICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzXG4gICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluXG4gICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLFxuICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuXG5cbiAgICBcIkNvbnRyaWJ1dGlvblwiIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nXG4gICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9uc1xuICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseVxuICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXJcbiAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2ZcbiAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgXCJzdWJtaXR0ZWRcIlxuICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnRcbiAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0b1xuICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsXG4gICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGVcbiAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXRcbiAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZVxuICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzIFwiTm90IGEgQ29udHJpYnV0aW9uLlwiXG5cbiAgICBcIkNvbnRyaWJ1dG9yXCIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5XG4gICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kXG4gICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuXG5cbiAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsXG4gICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGVcbiAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZixcbiAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGVcbiAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLlxuXG4gMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG4gICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLFxuICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlXG4gICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsXG4gICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssXG4gICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGVcbiAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpclxuICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocylcbiAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdVxuICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhXG4gICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29ya1xuICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0XG4gICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlc1xuICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZVxuICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC5cblxuIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlXG4gICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0XG4gICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3VcbiAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yXG4gICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kXG5cbiAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzXG4gICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZFxuXG4gICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzXG4gICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmRcbiAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yayxcbiAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZlxuICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kXG5cbiAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSBcIk5PVElDRVwiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0c1xuICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0XG4gICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZFxuICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3RcbiAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lXG4gICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkXG4gICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3JcbiAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsXG4gICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmRcbiAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzXG4gICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmRcbiAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb25cbiAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGVcbiAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkXG4gICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZFxuICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmRcbiAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zXG4gICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvclxuICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLFxuICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aFxuICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuXG5cbiA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsXG4gICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrXG4gICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy5cbiAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5XG4gICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWRcbiAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuXG5cbiA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlXG4gICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLFxuICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZVxuICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLlxuXG4gNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yXG4gICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaFxuICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yXG4gICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnNcbiAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBXG4gICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlXG4gICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55XG4gICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLlxuXG4gOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksXG4gICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsXG4gICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHlcbiAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZVxuICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCxcbiAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGFcbiAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlXG4gICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLFxuICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsXG4gICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvclxuICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy5cblxuIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmdcbiAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLFxuICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksXG4gICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXNcbiAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seVxuICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmXG4gICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LFxuICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eVxuICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb25cbiAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS5cblxuIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OU1xuXG4gQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLlxuXG4gICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmdcbiAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBcIltdXCJcbiAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZVxuICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlXG4gICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhXG4gICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZVxuICAgIHNhbWUgXCJwcmludGVkIHBhZ2VcIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyXG4gICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLlxuXG4gQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggR29vZ2xlLCBJbmMuLCBOZXRmbGl4LCBJbmMuLCBNaWNyb3NvZnQgQ29ycC4gYW5kIGNvbnRyaWJ1dG9yc1xuXG4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiBcblxuKi9cbi8vIG5vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikge1xuICAgIGQyLl9fcHJvdG9fXyA9IGIyO1xuICB9IHx8IGZ1bmN0aW9uKGQyLCBiMikge1xuICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdO1xuICB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5mdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7XG4gIH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgfVxuICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdO1xuICAgIHJldHVybiB0WzFdO1xuICB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odikge1xuICAgICAgcmV0dXJuIHN0ZXAoW24sIHZdKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICB5ID0gb3BbMV07XG4gICAgICAgICAgb3AgPSBbMF07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpO1xuICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCBvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkge1xuICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV07XG4gICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9wID0gWzYsIGVdO1xuICAgICAgeSA9IDA7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGYgPSB0ID0gMDtcbiAgICB9XG4gICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07XG4gICAgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cbmZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZSA9IHsgZXJyb3IgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5mdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tMiwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20yLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoYXIgfHwgIShpIGluIGZyb20yKSkge1xuICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tMiwgMCwgaSk7XG4gICAgICBhcltpXSA9IGZyb20yW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20yKSk7XG59XG5mdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5mdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0ZXAoZ1tuXSh2KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2V0dGxlKHFbMF1bM10sIGUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzdGVwKHIpIHtcbiAgICByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTtcbiAgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7XG4gICAgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpO1xuICB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7XG4gICAgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTtcbiAgfVxufVxuZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikge1xuICAgIGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHtcbiAgICBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2Mikge1xuICAgICAgcmVzb2x2ZSh7IHZhbHVlOiB2MiwgZG9uZTogZCB9KTtcbiAgICB9LCByZWplY3QpO1xuICB9XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzRnVuY3Rpb24uanNcbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9jcmVhdGVFcnJvckNsYXNzLmpzXG5mdW5jdGlvbiBjcmVhdGVFcnJvckNsYXNzKGNyZWF0ZUltcGwpIHtcbiAgdmFyIF9zdXBlciA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgRXJyb3IuY2FsbChpbnN0YW5jZSk7XG4gICAgaW5zdGFuY2Uuc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgfTtcbiAgdmFyIGN0b3JGdW5jID0gY3JlYXRlSW1wbChfc3VwZXIpO1xuICBjdG9yRnVuYy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4gIGN0b3JGdW5jLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JGdW5jO1xuICByZXR1cm4gY3RvckZ1bmM7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL1Vuc3Vic2NyaXB0aW9uRXJyb3IuanNcbnZhciBVbnN1YnNjcmlwdGlvbkVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVuc3Vic2NyaXB0aW9uRXJyb3JJbXBsKGVycm9ycykge1xuICAgIF9zdXBlcih0aGlzKTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBlcnJvcnMgPyBlcnJvcnMubGVuZ3RoICsgXCIgZXJyb3JzIG9jY3VycmVkIGR1cmluZyB1bnN1YnNjcmlwdGlvbjpcXG5cIiArIGVycm9ycy5tYXAoZnVuY3Rpb24oZXJyLCBpKSB7XG4gICAgICByZXR1cm4gaSArIDEgKyBcIikgXCIgKyBlcnIudG9TdHJpbmcoKTtcbiAgICB9KS5qb2luKFwiXFxuICBcIikgOiBcIlwiO1xuICAgIHRoaXMubmFtZSA9IFwiVW5zdWJzY3JpcHRpb25FcnJvclwiO1xuICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICB9O1xufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyclJlbW92ZS5qc1xuZnVuY3Rpb24gYXJyUmVtb3ZlKGFyciwgaXRlbSkge1xuICBpZiAoYXJyKSB7XG4gICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7XG4gICAgMCA8PSBpbmRleCAmJiBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvU3Vic2NyaXB0aW9uLmpzXG52YXIgU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIFN1YnNjcmlwdGlvbjIoaW5pdGlhbFRlYXJkb3duKSB7XG4gICAgdGhpcy5pbml0aWFsVGVhcmRvd24gPSBpbml0aWFsVGVhcmRvd247XG4gICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsO1xuICAgIHRoaXMuX2ZpbmFsaXplcnMgPSBudWxsO1xuICB9XG4gIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGVfMSwgX2EsIGVfMiwgX2I7XG4gICAgdmFyIGVycm9ycztcbiAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICAgIGlmIChfcGFyZW50YWdlKSB7XG4gICAgICAgIHRoaXMuX3BhcmVudGFnZSA9IG51bGw7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KF9wYXJlbnRhZ2UpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9wYXJlbnRhZ2VfMSA9IF9fdmFsdWVzKF9wYXJlbnRhZ2UpLCBfcGFyZW50YWdlXzFfMSA9IF9wYXJlbnRhZ2VfMS5uZXh0KCk7ICFfcGFyZW50YWdlXzFfMS5kb25lOyBfcGFyZW50YWdlXzFfMSA9IF9wYXJlbnRhZ2VfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgdmFyIHBhcmVudF8xID0gX3BhcmVudGFnZV8xXzEudmFsdWU7XG4gICAgICAgICAgICAgIHBhcmVudF8xLnJlbW92ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlXzFfMSkge1xuICAgICAgICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKF9wYXJlbnRhZ2VfMV8xICYmICFfcGFyZW50YWdlXzFfMS5kb25lICYmIChfYSA9IF9wYXJlbnRhZ2VfMS5yZXR1cm4pKSBfYS5jYWxsKF9wYXJlbnRhZ2VfMSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9wYXJlbnRhZ2UucmVtb3ZlKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgaW5pdGlhbEZpbmFsaXplciA9IHRoaXMuaW5pdGlhbFRlYXJkb3duO1xuICAgICAgaWYgKGlzRnVuY3Rpb24oaW5pdGlhbEZpbmFsaXplcikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbml0aWFsRmluYWxpemVyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBlcnJvcnMgPSBlIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvciA/IGUuZXJyb3JzIDogW2VdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX2ZpbmFsaXplcnMgPSB0aGlzLl9maW5hbGl6ZXJzO1xuICAgICAgaWYgKF9maW5hbGl6ZXJzKSB7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplcnMgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9maW5hbGl6ZXJzXzEgPSBfX3ZhbHVlcyhfZmluYWxpemVycyksIF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpOyAhX2ZpbmFsaXplcnNfMV8xLmRvbmU7IF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgZmluYWxpemVyID0gX2ZpbmFsaXplcnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZXhlY0ZpbmFsaXplcihmaW5hbGl6ZXIpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycyAhPT0gbnVsbCAmJiBlcnJvcnMgIT09IHZvaWQgMCA/IGVycm9ycyA6IFtdO1xuICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9ycyA9IF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGVycm9ycykpLCBfX3JlYWQoZXJyLmVycm9ycykpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVfMl8xKSB7XG4gICAgICAgICAgZV8yID0geyBlcnJvcjogZV8yXzEgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9maW5hbGl6ZXJzXzFfMSAmJiAhX2ZpbmFsaXplcnNfMV8xLmRvbmUgJiYgKF9iID0gX2ZpbmFsaXplcnNfMS5yZXR1cm4pKSBfYi5jYWxsKF9maW5hbGl6ZXJzXzEpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1YnNjcmlwdGlvbkVycm9yKGVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbih0ZWFyZG93bikge1xuICAgIHZhciBfYTtcbiAgICBpZiAodGVhcmRvd24gJiYgdGVhcmRvd24gIT09IHRoaXMpIHtcbiAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICBleGVjRmluYWxpemVyKHRlYXJkb3duKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0ZWFyZG93biBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbjIpIHtcbiAgICAgICAgICBpZiAodGVhcmRvd24uY2xvc2VkIHx8IHRlYXJkb3duLl9oYXNQYXJlbnQodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGVhcmRvd24uX2FkZFBhcmVudCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICAodGhpcy5fZmluYWxpemVycyA9IChfYSA9IHRoaXMuX2ZpbmFsaXplcnMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKS5wdXNoKHRlYXJkb3duKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9oYXNQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHtcbiAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICByZXR1cm4gX3BhcmVudGFnZSA9PT0gcGFyZW50IHx8IEFycmF5LmlzQXJyYXkoX3BhcmVudGFnZSkgJiYgX3BhcmVudGFnZS5pbmNsdWRlcyhwYXJlbnQpO1xuICB9O1xuICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5fYWRkUGFyZW50ID0gZnVuY3Rpb24ocGFyZW50KSB7XG4gICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7XG4gICAgdGhpcy5fcGFyZW50YWdlID0gQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSA/IChfcGFyZW50YWdlLnB1c2gocGFyZW50KSwgX3BhcmVudGFnZSkgOiBfcGFyZW50YWdlID8gW19wYXJlbnRhZ2UsIHBhcmVudF0gOiBwYXJlbnQ7XG4gIH07XG4gIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9yZW1vdmVQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHtcbiAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICBpZiAoX3BhcmVudGFnZSA9PT0gcGFyZW50KSB7XG4gICAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSkge1xuICAgICAgYXJyUmVtb3ZlKF9wYXJlbnRhZ2UsIHBhcmVudCk7XG4gICAgfVxuICB9O1xuICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbih0ZWFyZG93bikge1xuICAgIHZhciBfZmluYWxpemVycyA9IHRoaXMuX2ZpbmFsaXplcnM7XG4gICAgX2ZpbmFsaXplcnMgJiYgYXJyUmVtb3ZlKF9maW5hbGl6ZXJzLCB0ZWFyZG93bik7XG4gICAgaWYgKHRlYXJkb3duIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uMikge1xuICAgICAgdGVhcmRvd24uX3JlbW92ZVBhcmVudCh0aGlzKTtcbiAgICB9XG4gIH07XG4gIFN1YnNjcmlwdGlvbjIuRU1QVFkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZW1wdHkgPSBuZXcgU3Vic2NyaXB0aW9uMigpO1xuICAgIGVtcHR5LmNsb3NlZCA9IHRydWU7XG4gICAgcmV0dXJuIGVtcHR5O1xuICB9KCk7XG4gIHJldHVybiBTdWJzY3JpcHRpb24yO1xufSgpO1xudmFyIEVNUFRZX1NVQlNDUklQVElPTiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbmZ1bmN0aW9uIGlzU3Vic2NyaXB0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbiB8fCB2YWx1ZSAmJiBcImNsb3NlZFwiIGluIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUucmVtb3ZlKSAmJiBpc0Z1bmN0aW9uKHZhbHVlLmFkZCkgJiYgaXNGdW5jdGlvbih2YWx1ZS51bnN1YnNjcmliZSk7XG59XG5mdW5jdGlvbiBleGVjRmluYWxpemVyKGZpbmFsaXplcikge1xuICBpZiAoaXNGdW5jdGlvbihmaW5hbGl6ZXIpKSB7XG4gICAgZmluYWxpemVyKCk7XG4gIH0gZWxzZSB7XG4gICAgZmluYWxpemVyLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL2NvbmZpZy5qc1xudmFyIGNvbmZpZyA9IHtcbiAgb25VbmhhbmRsZWRFcnJvcjogbnVsbCxcbiAgb25TdG9wcGVkTm90aWZpY2F0aW9uOiBudWxsLFxuICBQcm9taXNlOiB2b2lkIDAsXG4gIHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmc6IGZhbHNlLFxuICB1c2VEZXByZWNhdGVkTmV4dENvbnRleHQ6IGZhbHNlXG59O1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL3RpbWVvdXRQcm92aWRlci5qc1xudmFyIHRpbWVvdXRQcm92aWRlciA9IHtcbiAgc2V0VGltZW91dDogZnVuY3Rpb24oaGFuZGxlciwgdGltZW91dCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGFyZ3NbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBkZWxlZ2F0ZSA9IHRpbWVvdXRQcm92aWRlci5kZWxlZ2F0ZTtcbiAgICBpZiAoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLnNldFRpbWVvdXQpIHtcbiAgICAgIHJldHVybiBkZWxlZ2F0ZS5zZXRUaW1lb3V0LmFwcGx5KGRlbGVnYXRlLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyLCB0aW1lb3V0XSwgX19yZWFkKGFyZ3MpKSk7XG4gICAgfVxuICAgIHJldHVybiBzZXRUaW1lb3V0LmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbaGFuZGxlciwgdGltZW91dF0sIF9fcmVhZChhcmdzKSkpO1xuICB9LFxuICBjbGVhclRpbWVvdXQ6IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgIHZhciBkZWxlZ2F0ZSA9IHRpbWVvdXRQcm92aWRlci5kZWxlZ2F0ZTtcbiAgICByZXR1cm4gKChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuY2xlYXJUaW1lb3V0KSB8fCBjbGVhclRpbWVvdXQpKGhhbmRsZSk7XG4gIH0sXG4gIGRlbGVnYXRlOiB2b2lkIDBcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3JlcG9ydFVuaGFuZGxlZEVycm9yLmpzXG5mdW5jdGlvbiByZXBvcnRVbmhhbmRsZWRFcnJvcihlcnIpIHtcbiAgdGltZW91dFByb3ZpZGVyLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uVW5oYW5kbGVkRXJyb3IgPSBjb25maWcub25VbmhhbmRsZWRFcnJvcjtcbiAgICBpZiAob25VbmhhbmRsZWRFcnJvcikge1xuICAgICAgb25VbmhhbmRsZWRFcnJvcihlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvbm9vcC5qc1xuZnVuY3Rpb24gbm9vcCgpIHtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL05vdGlmaWNhdGlvbkZhY3Rvcmllcy5qc1xudmFyIENPTVBMRVRFX05PVElGSUNBVElPTiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKFwiQ1wiLCB2b2lkIDAsIHZvaWQgMCk7XG59KCk7XG5mdW5jdGlvbiBlcnJvck5vdGlmaWNhdGlvbihlcnJvcikge1xuICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKFwiRVwiLCB2b2lkIDAsIGVycm9yKTtcbn1cbmZ1bmN0aW9uIG5leHROb3RpZmljYXRpb24odmFsdWUpIHtcbiAgcmV0dXJuIGNyZWF0ZU5vdGlmaWNhdGlvbihcIk5cIiwgdmFsdWUsIHZvaWQgMCk7XG59XG5mdW5jdGlvbiBjcmVhdGVOb3RpZmljYXRpb24oa2luZCwgdmFsdWUsIGVycm9yKSB7XG4gIHJldHVybiB7XG4gICAga2luZCxcbiAgICB2YWx1ZSxcbiAgICBlcnJvclxuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9lcnJvckNvbnRleHQuanNcbnZhciBjb250ZXh0ID0gbnVsbDtcbmZ1bmN0aW9uIGVycm9yQ29udGV4dChjYikge1xuICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHtcbiAgICB2YXIgaXNSb290ID0gIWNvbnRleHQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgY29udGV4dCA9IHsgZXJyb3JUaHJvd246IGZhbHNlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cbiAgICBjYigpO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHZhciBfYSA9IGNvbnRleHQsIGVycm9yVGhyb3duID0gX2EuZXJyb3JUaHJvd24sIGVycm9yID0gX2EuZXJyb3I7XG4gICAgICBjb250ZXh0ID0gbnVsbDtcbiAgICAgIGlmIChlcnJvclRocm93bikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY2IoKTtcbiAgfVxufVxuZnVuY3Rpb24gY2FwdHVyZUVycm9yKGVycikge1xuICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgJiYgY29udGV4dCkge1xuICAgIGNvbnRleHQuZXJyb3JUaHJvd24gPSB0cnVlO1xuICAgIGNvbnRleHQuZXJyb3IgPSBlcnI7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1N1YnNjcmliZXIuanNcbnZhciBTdWJzY3JpYmVyID0gZnVuY3Rpb24oX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhTdWJzY3JpYmVyMiwgX3N1cGVyKTtcbiAgZnVuY3Rpb24gU3Vic2NyaWJlcjIoZGVzdGluYXRpb24pIHtcbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgIGlmIChkZXN0aW5hdGlvbikge1xuICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICAgIGlmIChpc1N1YnNjcmlwdGlvbihkZXN0aW5hdGlvbikpIHtcbiAgICAgICAgZGVzdGluYXRpb24uYWRkKF90aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBFTVBUWV9PQlNFUlZFUjtcbiAgICB9XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIFN1YnNjcmliZXIyLmNyZWF0ZSA9IGZ1bmN0aW9uKG5leHQsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgIHJldHVybiBuZXcgU2FmZVN1YnNjcmliZXIobmV4dCwgZXJyb3IsIGNvbXBsZXRlKTtcbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmICh0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgaGFuZGxlU3RvcHBlZE5vdGlmaWNhdGlvbihuZXh0Tm90aWZpY2F0aW9uKHZhbHVlKSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX25leHQodmFsdWUpO1xuICAgIH1cbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKGVycm9yTm90aWZpY2F0aW9uKGVyciksIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICB0aGlzLl9lcnJvcihlcnIpO1xuICAgIH1cbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKENPTVBMRVRFX05PVElGSUNBVElPTiwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NvbXBsZXRlKCk7XG4gICAgfVxuICB9O1xuICBTdWJzY3JpYmVyMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICBfc3VwZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLmRlc3RpbmF0aW9uID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIFN1YnNjcmliZXIyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTtcbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH07XG4gIFN1YnNjcmliZXIyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gU3Vic2NyaWJlcjI7XG59KFN1YnNjcmlwdGlvbik7XG52YXIgX2JpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDtcbmZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIF9iaW5kLmNhbGwoZm4sIHRoaXNBcmcpO1xufVxudmFyIENvbnN1bWVyT2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gQ29uc3VtZXJPYnNlcnZlcjIocGFydGlhbE9ic2VydmVyKSB7XG4gICAgdGhpcy5wYXJ0aWFsT2JzZXJ2ZXIgPSBwYXJ0aWFsT2JzZXJ2ZXI7XG4gIH1cbiAgQ29uc3VtZXJPYnNlcnZlcjIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAocGFydGlhbE9ic2VydmVyLm5leHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnRpYWxPYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIENvbnN1bWVyT2JzZXJ2ZXIyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAocGFydGlhbE9ic2VydmVyLmVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyKTtcbiAgICB9XG4gIH07XG4gIENvbnN1bWVyT2JzZXJ2ZXIyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAocGFydGlhbE9ic2VydmVyLmNvbXBsZXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBDb25zdW1lck9ic2VydmVyMjtcbn0oKTtcbnZhciBTYWZlU3Vic2NyaWJlciA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoU2FmZVN1YnNjcmliZXIyLCBfc3VwZXIpO1xuICBmdW5jdGlvbiBTYWZlU3Vic2NyaWJlcjIob2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgdmFyIHBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAoaXNGdW5jdGlvbihvYnNlcnZlck9yTmV4dCkgfHwgIW9ic2VydmVyT3JOZXh0KSB7XG4gICAgICBwYXJ0aWFsT2JzZXJ2ZXIgPSB7XG4gICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0ICE9PSBudWxsICYmIG9ic2VydmVyT3JOZXh0ICE9PSB2b2lkIDAgPyBvYnNlcnZlck9yTmV4dCA6IHZvaWQgMCxcbiAgICAgICAgZXJyb3I6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6IHZvaWQgMCxcbiAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlICE9PSBudWxsICYmIGNvbXBsZXRlICE9PSB2b2lkIDAgPyBjb21wbGV0ZSA6IHZvaWQgMFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbnRleHRfMTtcbiAgICAgIGlmIChfdGhpcyAmJiBjb25maWcudXNlRGVwcmVjYXRlZE5leHRDb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHRfMSA9IE9iamVjdC5jcmVhdGUob2JzZXJ2ZXJPck5leHQpO1xuICAgICAgICBjb250ZXh0XzEudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgcGFydGlhbE9ic2VydmVyID0ge1xuICAgICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0Lm5leHQgJiYgYmluZChvYnNlcnZlck9yTmV4dC5uZXh0LCBjb250ZXh0XzEpLFxuICAgICAgICAgIGVycm9yOiBvYnNlcnZlck9yTmV4dC5lcnJvciAmJiBiaW5kKG9ic2VydmVyT3JOZXh0LmVycm9yLCBjb250ZXh0XzEpLFxuICAgICAgICAgIGNvbXBsZXRlOiBvYnNlcnZlck9yTmV4dC5jb21wbGV0ZSAmJiBiaW5kKG9ic2VydmVyT3JOZXh0LmNvbXBsZXRlLCBjb250ZXh0XzEpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIgPSBvYnNlcnZlck9yTmV4dDtcbiAgICAgIH1cbiAgICB9XG4gICAgX3RoaXMuZGVzdGluYXRpb24gPSBuZXcgQ29uc3VtZXJPYnNlcnZlcihwYXJ0aWFsT2JzZXJ2ZXIpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICByZXR1cm4gU2FmZVN1YnNjcmliZXIyO1xufShTdWJzY3JpYmVyKTtcbmZ1bmN0aW9uIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKSB7XG4gIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykge1xuICAgIGNhcHR1cmVFcnJvcihlcnJvcik7XG4gIH0gZWxzZSB7XG4gICAgcmVwb3J0VW5oYW5kbGVkRXJyb3IoZXJyb3IpO1xuICB9XG59XG5mdW5jdGlvbiBkZWZhdWx0RXJyb3JIYW5kbGVyKGVycikge1xuICB0aHJvdyBlcnI7XG59XG5mdW5jdGlvbiBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgc3Vic2NyaWJlcikge1xuICB2YXIgb25TdG9wcGVkTm90aWZpY2F0aW9uID0gY29uZmlnLm9uU3RvcHBlZE5vdGlmaWNhdGlvbjtcbiAgb25TdG9wcGVkTm90aWZpY2F0aW9uICYmIHRpbWVvdXRQcm92aWRlci5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBvblN0b3BwZWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBzdWJzY3JpYmVyKTtcbiAgfSk7XG59XG52YXIgRU1QVFlfT0JTRVJWRVIgPSB7XG4gIGNsb3NlZDogdHJ1ZSxcbiAgbmV4dDogbm9vcCxcbiAgZXJyb3I6IGRlZmF1bHRFcnJvckhhbmRsZXIsXG4gIGNvbXBsZXRlOiBub29wXG59O1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc3ltYm9sL29ic2VydmFibGUuanNcbnZhciBvYnNlcnZhYmxlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm9ic2VydmFibGUgfHwgXCJAQG9ic2VydmFibGVcIjtcbn0oKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaWRlbnRpdHkuanNcbmZ1bmN0aW9uIGlkZW50aXR5KHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3BpcGUuanNcbmZ1bmN0aW9uIHBpcGUoKSB7XG4gIHZhciBmbnMgPSBbXTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBmbnNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICByZXR1cm4gcGlwZUZyb21BcnJheShmbnMpO1xufVxuZnVuY3Rpb24gcGlwZUZyb21BcnJheShmbnMpIHtcbiAgaWYgKGZucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgaWYgKGZucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZm5zWzBdO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBwaXBlZChpbnB1dCkge1xuICAgIHJldHVybiBmbnMucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGZuKSB7XG4gICAgICByZXR1cm4gZm4ocHJldik7XG4gICAgfSwgaW5wdXQpO1xuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvT2JzZXJ2YWJsZS5qc1xudmFyIE9ic2VydmFibGUgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gT2JzZXJ2YWJsZTIoc3Vic2NyaWJlKSB7XG4gICAgaWYgKHN1YnNjcmliZSkge1xuICAgICAgdGhpcy5fc3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgIH1cbiAgfVxuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUubGlmdCA9IGZ1bmN0aW9uKG9wZXJhdG9yKSB7XG4gICAgdmFyIG9ic2VydmFibGUyID0gbmV3IE9ic2VydmFibGUyKCk7XG4gICAgb2JzZXJ2YWJsZTIuc291cmNlID0gdGhpcztcbiAgICBvYnNlcnZhYmxlMi5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgIHJldHVybiBvYnNlcnZhYmxlMjtcbiAgfTtcbiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLnN1YnNjcmliZSA9IGZ1bmN0aW9uKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBzdWJzY3JpYmVyID0gaXNTdWJzY3JpYmVyKG9ic2VydmVyT3JOZXh0KSA/IG9ic2VydmVyT3JOZXh0IDogbmV3IFNhZmVTdWJzY3JpYmVyKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpO1xuICAgIGVycm9yQ29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBfYSA9IF90aGlzLCBvcGVyYXRvciA9IF9hLm9wZXJhdG9yLCBzb3VyY2UgPSBfYS5zb3VyY2U7XG4gICAgICBzdWJzY3JpYmVyLmFkZChvcGVyYXRvciA/IG9wZXJhdG9yLmNhbGwoc3Vic2NyaWJlciwgc291cmNlKSA6IHNvdXJjZSA/IF90aGlzLl9zdWJzY3JpYmUoc3Vic2NyaWJlcikgOiBfdGhpcy5fdHJ5U3Vic2NyaWJlKHN1YnNjcmliZXIpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3Vic2NyaWJlcjtcbiAgfTtcbiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLl90cnlTdWJzY3JpYmUgPSBmdW5jdGlvbihzaW5rKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpYmUoc2luayk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzaW5rLmVycm9yKGVycik7XG4gICAgfVxuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKG5leHQsIHByb21pc2VDdG9yKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBwcm9taXNlQ3RvciA9IGdldFByb21pc2VDdG9yKHByb21pc2VDdG9yKTtcbiAgICByZXR1cm4gbmV3IHByb21pc2VDdG9yKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHN1YnNjcmliZXIgPSBuZXcgU2FmZVN1YnNjcmliZXIoe1xuICAgICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXh0KHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IHJlamVjdCxcbiAgICAgICAgY29tcGxldGU6IHJlc29sdmVcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIH0pO1xuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IHRoaXMuc291cmNlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGVbb2JzZXJ2YWJsZV0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3BlcmF0aW9ucyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBvcGVyYXRpb25zW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHJldHVybiBwaXBlRnJvbUFycmF5KG9wZXJhdGlvbnMpKHRoaXMpO1xuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUudG9Qcm9taXNlID0gZnVuY3Rpb24ocHJvbWlzZUN0b3IpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHByb21pc2VDdG9yID0gZ2V0UHJvbWlzZUN0b3IocHJvbWlzZUN0b3IpO1xuICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICBfdGhpcy5zdWJzY3JpYmUoZnVuY3Rpb24oeCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPSB4O1xuICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgT2JzZXJ2YWJsZTIuY3JlYXRlID0gZnVuY3Rpb24oc3Vic2NyaWJlKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlMihzdWJzY3JpYmUpO1xuICB9O1xuICByZXR1cm4gT2JzZXJ2YWJsZTI7XG59KCk7XG5mdW5jdGlvbiBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3Rvcikge1xuICB2YXIgX2E7XG4gIHJldHVybiAoX2EgPSBwcm9taXNlQ3RvciAhPT0gbnVsbCAmJiBwcm9taXNlQ3RvciAhPT0gdm9pZCAwID8gcHJvbWlzZUN0b3IgOiBjb25maWcuUHJvbWlzZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGlzT2JzZXJ2ZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUubmV4dCkgJiYgaXNGdW5jdGlvbih2YWx1ZS5lcnJvcikgJiYgaXNGdW5jdGlvbih2YWx1ZS5jb21wbGV0ZSk7XG59XG5mdW5jdGlvbiBpc1N1YnNjcmliZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgU3Vic2NyaWJlciB8fCBpc09ic2VydmVyKHZhbHVlKSAmJiBpc1N1YnNjcmlwdGlvbih2YWx1ZSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2xpZnQuanNcbmZ1bmN0aW9uIGhhc0xpZnQoc291cmNlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHNvdXJjZSA9PT0gbnVsbCB8fCBzb3VyY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNvdXJjZS5saWZ0KTtcbn1cbmZ1bmN0aW9uIG9wZXJhdGUoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7XG4gICAgaWYgKGhhc0xpZnQoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KGZ1bmN0aW9uKGxpZnRlZFNvdXJjZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBpbml0KGxpZnRlZFNvdXJjZSwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMuZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmFibGUgdG8gbGlmdCB1bmtub3duIE9ic2VydmFibGUgdHlwZVwiKTtcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9PcGVyYXRvclN1YnNjcmliZXIuanNcbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgb25OZXh0LCBvbkNvbXBsZXRlLCBvbkVycm9yLCBvbkZpbmFsaXplKSB7XG4gIHJldHVybiBuZXcgT3BlcmF0b3JTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBvbk5leHQsIG9uQ29tcGxldGUsIG9uRXJyb3IsIG9uRmluYWxpemUpO1xufVxudmFyIE9wZXJhdG9yU3Vic2NyaWJlciA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoT3BlcmF0b3JTdWJzY3JpYmVyMiwgX3N1cGVyKTtcbiAgZnVuY3Rpb24gT3BlcmF0b3JTdWJzY3JpYmVyMihkZXN0aW5hdGlvbiwgb25OZXh0LCBvbkNvbXBsZXRlLCBvbkVycm9yLCBvbkZpbmFsaXplLCBzaG91bGRVbnN1YnNjcmliZSkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKSB8fCB0aGlzO1xuICAgIF90aGlzLm9uRmluYWxpemUgPSBvbkZpbmFsaXplO1xuICAgIF90aGlzLnNob3VsZFVuc3Vic2NyaWJlID0gc2hvdWxkVW5zdWJzY3JpYmU7XG4gICAgX3RoaXMuX25leHQgPSBvbk5leHQgPyBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb25OZXh0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9uZXh0O1xuICAgIF90aGlzLl9lcnJvciA9IG9uRXJyb3IgPyBmdW5jdGlvbihlcnIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgIH0gY2F0Y2ggKGVycjIpIHtcbiAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyMik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfSA6IF9zdXBlci5wcm90b3R5cGUuX2Vycm9yO1xuICAgIF90aGlzLl9jb21wbGV0ZSA9IG9uQ29tcGxldGUgPyBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9uQ29tcGxldGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9jb21wbGV0ZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgT3BlcmF0b3JTdWJzY3JpYmVyMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKCF0aGlzLnNob3VsZFVuc3Vic2NyaWJlIHx8IHRoaXMuc2hvdWxkVW5zdWJzY3JpYmUoKSkge1xuICAgICAgdmFyIGNsb3NlZF8xID0gdGhpcy5jbG9zZWQ7XG4gICAgICBfc3VwZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyk7XG4gICAgICAhY2xvc2VkXzEgJiYgKChfYSA9IHRoaXMub25GaW5hbGl6ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodGhpcykpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIE9wZXJhdG9yU3Vic2NyaWJlcjI7XG59KFN1YnNjcmliZXIpO1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9PYmplY3RVbnN1YnNjcmliZWRFcnJvci5qc1xudmFyIE9iamVjdFVuc3Vic2NyaWJlZEVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIE9iamVjdFVuc3Vic2NyaWJlZEVycm9ySW1wbCgpIHtcbiAgICBfc3VwZXIodGhpcyk7XG4gICAgdGhpcy5uYW1lID0gXCJPYmplY3RVbnN1YnNjcmliZWRFcnJvclwiO1xuICAgIHRoaXMubWVzc2FnZSA9IFwib2JqZWN0IHVuc3Vic2NyaWJlZFwiO1xuICB9O1xufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9TdWJqZWN0LmpzXG52YXIgU3ViamVjdCA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoU3ViamVjdDIsIF9zdXBlcik7XG4gIGZ1bmN0aW9uIFN1YmplY3QyKCkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgX3RoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgX3RoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7XG4gICAgX3RoaXMub2JzZXJ2ZXJzID0gW107XG4gICAgX3RoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgX3RoaXMuaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBfdGhpcy50aHJvd25FcnJvciA9IG51bGw7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIFN1YmplY3QyLnByb3RvdHlwZS5saWZ0ID0gZnVuY3Rpb24ob3BlcmF0b3IpIHtcbiAgICB2YXIgc3ViamVjdCA9IG5ldyBBbm9ueW1vdXNTdWJqZWN0KHRoaXMsIHRoaXMpO1xuICAgIHN1YmplY3Qub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICByZXR1cm4gc3ViamVjdDtcbiAgfTtcbiAgU3ViamVjdDIucHJvdG90eXBlLl90aHJvd0lmQ2xvc2VkID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTtcbiAgICB9XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIGVycm9yQ29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICAgIGlmICghX3RoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIGlmICghX3RoaXMuY3VycmVudE9ic2VydmVycykge1xuICAgICAgICAgIF90aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBBcnJheS5mcm9tKF90aGlzLm9ic2VydmVycyk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKF90aGlzLmN1cnJlbnRPYnNlcnZlcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZV8xXzEpIHtcbiAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgU3ViamVjdDIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5fdGhyb3dJZkNsb3NlZCgpO1xuICAgICAgaWYgKCFfdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgX3RoaXMuaGFzRXJyb3IgPSBfdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICBfdGhpcy50aHJvd25FcnJvciA9IGVycjtcbiAgICAgICAgdmFyIG9ic2VydmVycyA9IF90aGlzLm9ic2VydmVycztcbiAgICAgICAgd2hpbGUgKG9ic2VydmVycy5sZW5ndGgpIHtcbiAgICAgICAgICBvYnNlcnZlcnMuc2hpZnQoKS5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgZXJyb3JDb250ZXh0KGZ1bmN0aW9uKCkge1xuICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICAgIGlmICghX3RoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIF90aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHZhciBvYnNlcnZlcnMgPSBfdGhpcy5vYnNlcnZlcnM7XG4gICAgICAgIHdoaWxlIChvYnNlcnZlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgb2JzZXJ2ZXJzLnNoaWZ0KCkuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBTdWJqZWN0Mi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlzU3RvcHBlZCA9IHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLm9ic2VydmVycyA9IHRoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdWJqZWN0Mi5wcm90b3R5cGUsIFwib2JzZXJ2ZWRcIiwge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgX2E7XG4gICAgICByZXR1cm4gKChfYSA9IHRoaXMub2JzZXJ2ZXJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKSA+IDA7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIFN1YmplY3QyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlLmNhbGwodGhpcywgc3Vic2NyaWJlcik7XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICB0aGlzLl9jaGVja0ZpbmFsaXplZFN0YXR1c2VzKHN1YnNjcmliZXIpO1xuICAgIHJldHVybiB0aGlzLl9pbm5lclN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgfTtcbiAgU3ViamVjdDIucHJvdG90eXBlLl9pbm5lclN1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBfYSA9IHRoaXMsIGhhc0Vycm9yID0gX2EuaGFzRXJyb3IsIGlzU3RvcHBlZCA9IF9hLmlzU3RvcHBlZCwgb2JzZXJ2ZXJzID0gX2Eub2JzZXJ2ZXJzO1xuICAgIGlmIChoYXNFcnJvciB8fCBpc1N0b3BwZWQpIHtcbiAgICAgIHJldHVybiBFTVBUWV9TVUJTQ1JJUFRJT047XG4gICAgfVxuICAgIHRoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7XG4gICAgb2JzZXJ2ZXJzLnB1c2goc3Vic2NyaWJlcik7XG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDtcbiAgICAgIGFyclJlbW92ZShvYnNlcnZlcnMsIHN1YnNjcmliZXIpO1xuICAgIH0pO1xuICB9O1xuICBTdWJqZWN0Mi5wcm90b3R5cGUuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIF9hID0gdGhpcywgaGFzRXJyb3IgPSBfYS5oYXNFcnJvciwgdGhyb3duRXJyb3IgPSBfYS50aHJvd25FcnJvciwgaXNTdG9wcGVkID0gX2EuaXNTdG9wcGVkO1xuICAgIGlmIChoYXNFcnJvcikge1xuICAgICAgc3Vic2NyaWJlci5lcnJvcih0aHJvd25FcnJvcik7XG4gICAgfSBlbHNlIGlmIChpc1N0b3BwZWQpIHtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5hc09ic2VydmFibGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JzZXJ2YWJsZTIgPSBuZXcgT2JzZXJ2YWJsZSgpO1xuICAgIG9ic2VydmFibGUyLnNvdXJjZSA9IHRoaXM7XG4gICAgcmV0dXJuIG9ic2VydmFibGUyO1xuICB9O1xuICBTdWJqZWN0Mi5jcmVhdGUgPSBmdW5jdGlvbihkZXN0aW5hdGlvbiwgc291cmNlKSB7XG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNTdWJqZWN0KGRlc3RpbmF0aW9uLCBzb3VyY2UpO1xuICB9O1xuICByZXR1cm4gU3ViamVjdDI7XG59KE9ic2VydmFibGUpO1xudmFyIEFub255bW91c1N1YmplY3QgPSBmdW5jdGlvbihfc3VwZXIpIHtcbiAgX19leHRlbmRzKEFub255bW91c1N1YmplY3QyLCBfc3VwZXIpO1xuICBmdW5jdGlvbiBBbm9ueW1vdXNTdWJqZWN0MihkZXN0aW5hdGlvbiwgc291cmNlKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICBfdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuICAgIF90aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgKF9iID0gKF9hID0gdGhpcy5kZXN0aW5hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5leHQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCB2YWx1ZSk7XG4gIH07XG4gIEFub255bW91c1N1YmplY3QyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICAgIHZhciBfYSwgX2I7XG4gICAgKF9iID0gKF9hID0gdGhpcy5kZXN0aW5hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVycm9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgZXJyKTtcbiAgfTtcbiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICAoX2IgPSAoX2EgPSB0aGlzLmRlc3RpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29tcGxldGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hKTtcbiAgfTtcbiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5zb3VyY2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdWJzY3JpYmUoc3Vic2NyaWJlcikpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IEVNUFRZX1NVQlNDUklQVElPTjtcbiAgfTtcbiAgcmV0dXJuIEFub255bW91c1N1YmplY3QyO1xufShTdWJqZWN0KTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9kYXRlVGltZXN0YW1wUHJvdmlkZXIuanNcbnZhciBkYXRlVGltZXN0YW1wUHJvdmlkZXIgPSB7XG4gIG5vdzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIChkYXRlVGltZXN0YW1wUHJvdmlkZXIuZGVsZWdhdGUgfHwgRGF0ZSkubm93KCk7XG4gIH0sXG4gIGRlbGVnYXRlOiB2b2lkIDBcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9SZXBsYXlTdWJqZWN0LmpzXG52YXIgUmVwbGF5U3ViamVjdCA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoUmVwbGF5U3ViamVjdDIsIF9zdXBlcik7XG4gIGZ1bmN0aW9uIFJlcGxheVN1YmplY3QyKF9idWZmZXJTaXplLCBfd2luZG93VGltZSwgX3RpbWVzdGFtcFByb3ZpZGVyKSB7XG4gICAgaWYgKF9idWZmZXJTaXplID09PSB2b2lkIDApIHtcbiAgICAgIF9idWZmZXJTaXplID0gSW5maW5pdHk7XG4gICAgfVxuICAgIGlmIChfd2luZG93VGltZSA9PT0gdm9pZCAwKSB7XG4gICAgICBfd2luZG93VGltZSA9IEluZmluaXR5O1xuICAgIH1cbiAgICBpZiAoX3RpbWVzdGFtcFByb3ZpZGVyID09PSB2b2lkIDApIHtcbiAgICAgIF90aW1lc3RhbXBQcm92aWRlciA9IGRhdGVUaW1lc3RhbXBQcm92aWRlcjtcbiAgICB9XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICBfdGhpcy5fYnVmZmVyU2l6ZSA9IF9idWZmZXJTaXplO1xuICAgIF90aGlzLl93aW5kb3dUaW1lID0gX3dpbmRvd1RpbWU7XG4gICAgX3RoaXMuX3RpbWVzdGFtcFByb3ZpZGVyID0gX3RpbWVzdGFtcFByb3ZpZGVyO1xuICAgIF90aGlzLl9idWZmZXIgPSBbXTtcbiAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gdHJ1ZTtcbiAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gX3dpbmRvd1RpbWUgPT09IEluZmluaXR5O1xuICAgIF90aGlzLl9idWZmZXJTaXplID0gTWF0aC5tYXgoMSwgX2J1ZmZlclNpemUpO1xuICAgIF90aGlzLl93aW5kb3dUaW1lID0gTWF0aC5tYXgoMSwgX3dpbmRvd1RpbWUpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBSZXBsYXlTdWJqZWN0Mi5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIF9hID0gdGhpcywgaXNTdG9wcGVkID0gX2EuaXNTdG9wcGVkLCBfYnVmZmVyID0gX2EuX2J1ZmZlciwgX2luZmluaXRlVGltZVdpbmRvdyA9IF9hLl9pbmZpbml0ZVRpbWVXaW5kb3csIF90aW1lc3RhbXBQcm92aWRlciA9IF9hLl90aW1lc3RhbXBQcm92aWRlciwgX3dpbmRvd1RpbWUgPSBfYS5fd2luZG93VGltZTtcbiAgICBpZiAoIWlzU3RvcHBlZCkge1xuICAgICAgX2J1ZmZlci5wdXNoKHZhbHVlKTtcbiAgICAgICFfaW5maW5pdGVUaW1lV2luZG93ICYmIF9idWZmZXIucHVzaChfdGltZXN0YW1wUHJvdmlkZXIubm93KCkgKyBfd2luZG93VGltZSk7XG4gICAgfVxuICAgIHRoaXMuX3RyaW1CdWZmZXIoKTtcbiAgICBfc3VwZXIucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gIH07XG4gIFJlcGxheVN1YmplY3QyLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICB0aGlzLl90cmltQnVmZmVyKCk7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuX2lubmVyU3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIHZhciBfYSA9IHRoaXMsIF9pbmZpbml0ZVRpbWVXaW5kb3cgPSBfYS5faW5maW5pdGVUaW1lV2luZG93LCBfYnVmZmVyID0gX2EuX2J1ZmZlcjtcbiAgICB2YXIgY29weSA9IF9idWZmZXIuc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcHkubGVuZ3RoICYmICFzdWJzY3JpYmVyLmNsb3NlZDsgaSArPSBfaW5maW5pdGVUaW1lV2luZG93ID8gMSA6IDIpIHtcbiAgICAgIHN1YnNjcmliZXIubmV4dChjb3B5W2ldKTtcbiAgICB9XG4gICAgdGhpcy5fY2hlY2tGaW5hbGl6ZWRTdGF0dXNlcyhzdWJzY3JpYmVyKTtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICB9O1xuICBSZXBsYXlTdWJqZWN0Mi5wcm90b3R5cGUuX3RyaW1CdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX2EgPSB0aGlzLCBfYnVmZmVyU2l6ZSA9IF9hLl9idWZmZXJTaXplLCBfdGltZXN0YW1wUHJvdmlkZXIgPSBfYS5fdGltZXN0YW1wUHJvdmlkZXIsIF9idWZmZXIgPSBfYS5fYnVmZmVyLCBfaW5maW5pdGVUaW1lV2luZG93ID0gX2EuX2luZmluaXRlVGltZVdpbmRvdztcbiAgICB2YXIgYWRqdXN0ZWRCdWZmZXJTaXplID0gKF9pbmZpbml0ZVRpbWVXaW5kb3cgPyAxIDogMikgKiBfYnVmZmVyU2l6ZTtcbiAgICBfYnVmZmVyU2l6ZSA8IEluZmluaXR5ICYmIGFkanVzdGVkQnVmZmVyU2l6ZSA8IF9idWZmZXIubGVuZ3RoICYmIF9idWZmZXIuc3BsaWNlKDAsIF9idWZmZXIubGVuZ3RoIC0gYWRqdXN0ZWRCdWZmZXJTaXplKTtcbiAgICBpZiAoIV9pbmZpbml0ZVRpbWVXaW5kb3cpIHtcbiAgICAgIHZhciBub3cgPSBfdGltZXN0YW1wUHJvdmlkZXIubm93KCk7XG4gICAgICB2YXIgbGFzdDIgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBfYnVmZmVyLmxlbmd0aCAmJiBfYnVmZmVyW2ldIDw9IG5vdzsgaSArPSAyKSB7XG4gICAgICAgIGxhc3QyID0gaTtcbiAgICAgIH1cbiAgICAgIGxhc3QyICYmIF9idWZmZXIuc3BsaWNlKDAsIGxhc3QyICsgMSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gUmVwbGF5U3ViamVjdDI7XG59KFN1YmplY3QpO1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FjdGlvbi5qc1xudmFyIEFjdGlvbiA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQWN0aW9uMiwgX3N1cGVyKTtcbiAgZnVuY3Rpb24gQWN0aW9uMihzY2hlZHVsZXIsIHdvcmspIHtcbiAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgfVxuICBBY3Rpb24yLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKHN0YXRlLCBkZWxheTIpIHtcbiAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHtcbiAgICAgIGRlbGF5MiA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICByZXR1cm4gQWN0aW9uMjtcbn0oU3Vic2NyaXB0aW9uKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9pbnRlcnZhbFByb3ZpZGVyLmpzXG52YXIgaW50ZXJ2YWxQcm92aWRlciA9IHtcbiAgc2V0SW50ZXJ2YWw6IGZ1bmN0aW9uKGhhbmRsZXIsIHRpbWVvdXQpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgZGVsZWdhdGUgPSBpbnRlcnZhbFByb3ZpZGVyLmRlbGVnYXRlO1xuICAgIGlmIChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuc2V0SW50ZXJ2YWwpIHtcbiAgICAgIHJldHVybiBkZWxlZ2F0ZS5zZXRJbnRlcnZhbC5hcHBseShkZWxlZ2F0ZSwgX19zcHJlYWRBcnJheShbaGFuZGxlciwgdGltZW91dF0sIF9fcmVhZChhcmdzKSkpO1xuICAgIH1cbiAgICByZXR1cm4gc2V0SW50ZXJ2YWwuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyLCB0aW1lb3V0XSwgX19yZWFkKGFyZ3MpKSk7XG4gIH0sXG4gIGNsZWFySW50ZXJ2YWw6IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgIHZhciBkZWxlZ2F0ZSA9IGludGVydmFsUHJvdmlkZXIuZGVsZWdhdGU7XG4gICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLmNsZWFySW50ZXJ2YWwpIHx8IGNsZWFySW50ZXJ2YWwpKGhhbmRsZSk7XG4gIH0sXG4gIGRlbGVnYXRlOiB2b2lkIDBcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQXN5bmNBY3Rpb24uanNcbnZhciBBc3luY0FjdGlvbiA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQXN5bmNBY3Rpb24yLCBfc3VwZXIpO1xuICBmdW5jdGlvbiBBc3luY0FjdGlvbjIoc2NoZWR1bGVyLCB3b3JrKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyLCB3b3JrKSB8fCB0aGlzO1xuICAgIF90aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICBfdGhpcy53b3JrID0gd29yaztcbiAgICBfdGhpcy5wZW5kaW5nID0gZmFsc2U7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIEFzeW5jQWN0aW9uMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbihzdGF0ZSwgZGVsYXkyKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkge1xuICAgICAgZGVsYXkyID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHZhciBpZCA9IHRoaXMuaWQ7XG4gICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyO1xuICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheTIpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZGVsYXkgPSBkZWxheTI7XG4gICAgdGhpcy5pZCA9IChfYSA9IHRoaXMuaWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMucmVxdWVzdEFzeW5jSWQoc2NoZWR1bGVyLCB0aGlzLmlkLCBkZWxheTIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBBc3luY0FjdGlvbjIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBfaWQsIGRlbGF5Mikge1xuICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkge1xuICAgICAgZGVsYXkyID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGludGVydmFsUHJvdmlkZXIuc2V0SW50ZXJ2YWwoc2NoZWR1bGVyLmZsdXNoLmJpbmQoc2NoZWR1bGVyLCB0aGlzKSwgZGVsYXkyKTtcbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uKF9zY2hlZHVsZXIsIGlkLCBkZWxheTIpIHtcbiAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHtcbiAgICAgIGRlbGF5MiA9IDA7XG4gICAgfVxuICAgIGlmIChkZWxheTIgIT0gbnVsbCAmJiB0aGlzLmRlbGF5ID09PSBkZWxheTIgJiYgdGhpcy5wZW5kaW5nID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgaW50ZXJ2YWxQcm92aWRlci5jbGVhckludGVydmFsKGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24oc3RhdGUsIGRlbGF5Mikge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcihcImV4ZWN1dGluZyBhIGNhbmNlbGxlZCBhY3Rpb25cIik7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZyA9IGZhbHNlO1xuICAgIHZhciBlcnJvciA9IHRoaXMuX2V4ZWN1dGUoc3RhdGUsIGRlbGF5Mik7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBlbmRpbmcgPT09IGZhbHNlICYmIHRoaXMuaWQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQodGhpcy5zY2hlZHVsZXIsIHRoaXMuaWQsIG51bGwpO1xuICAgIH1cbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5fZXhlY3V0ZSA9IGZ1bmN0aW9uKHN0YXRlLCBfZGVsYXkpIHtcbiAgICB2YXIgZXJyb3JlZCA9IGZhbHNlO1xuICAgIHZhciBlcnJvclZhbHVlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLndvcmsoc3RhdGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yZWQgPSB0cnVlO1xuICAgICAgZXJyb3JWYWx1ZSA9IGUgPyBlIDogbmV3IEVycm9yKFwiU2NoZWR1bGVkIGFjdGlvbiB0aHJldyBmYWxzeSBlcnJvclwiKTtcbiAgICB9XG4gICAgaWYgKGVycm9yZWQpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIHJldHVybiBlcnJvclZhbHVlO1xuICAgIH1cbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgIHZhciBfYSA9IHRoaXMsIGlkID0gX2EuaWQsIHNjaGVkdWxlciA9IF9hLnNjaGVkdWxlcjtcbiAgICAgIHZhciBhY3Rpb25zID0gc2NoZWR1bGVyLmFjdGlvbnM7XG4gICAgICB0aGlzLndvcmsgPSB0aGlzLnN0YXRlID0gdGhpcy5zY2hlZHVsZXIgPSBudWxsO1xuICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XG4gICAgICBhcnJSZW1vdmUoYWN0aW9ucywgdGhpcyk7XG4gICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVsYXkgPSBudWxsO1xuICAgICAgX3N1cGVyLnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIEFzeW5jQWN0aW9uMjtcbn0oQWN0aW9uKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1NjaGVkdWxlci5qc1xudmFyIFNjaGVkdWxlciA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBTY2hlZHVsZXIyKHNjaGVkdWxlckFjdGlvbkN0b3IsIG5vdykge1xuICAgIGlmIChub3cgPT09IHZvaWQgMCkge1xuICAgICAgbm93ID0gU2NoZWR1bGVyMi5ub3c7XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3RvciA9IHNjaGVkdWxlckFjdGlvbkN0b3I7XG4gICAgdGhpcy5ub3cgPSBub3c7XG4gIH1cbiAgU2NoZWR1bGVyMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbih3b3JrLCBkZWxheTIsIHN0YXRlKSB7XG4gICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWxheTIgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3Rvcih0aGlzLCB3b3JrKS5zY2hlZHVsZShzdGF0ZSwgZGVsYXkyKTtcbiAgfTtcbiAgU2NoZWR1bGVyMi5ub3cgPSBkYXRlVGltZXN0YW1wUHJvdmlkZXIubm93O1xuICByZXR1cm4gU2NoZWR1bGVyMjtcbn0oKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9Bc3luY1NjaGVkdWxlci5qc1xudmFyIEFzeW5jU2NoZWR1bGVyID0gZnVuY3Rpb24oX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhBc3luY1NjaGVkdWxlcjIsIF9zdXBlcik7XG4gIGZ1bmN0aW9uIEFzeW5jU2NoZWR1bGVyMihTY2hlZHVsZXJBY3Rpb24sIG5vdykge1xuICAgIGlmIChub3cgPT09IHZvaWQgMCkge1xuICAgICAgbm93ID0gU2NoZWR1bGVyLm5vdztcbiAgICB9XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgU2NoZWR1bGVyQWN0aW9uLCBub3cpIHx8IHRoaXM7XG4gICAgX3RoaXMuYWN0aW9ucyA9IFtdO1xuICAgIF90aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgQXN5bmNTY2hlZHVsZXIyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKGFjdGlvbikge1xuICAgIHZhciBhY3Rpb25zID0gdGhpcy5hY3Rpb25zO1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZXJyb3I7XG4gICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICBkbyB7XG4gICAgICBpZiAoZXJyb3IgPSBhY3Rpb24uZXhlY3V0ZShhY3Rpb24uc3RhdGUsIGFjdGlvbi5kZWxheSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKTtcbiAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpIHtcbiAgICAgICAgYWN0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG4gIHJldHVybiBBc3luY1NjaGVkdWxlcjI7XG59KFNjaGVkdWxlcik7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvYXN5bmMuanNcbnZhciBhc3luY1NjaGVkdWxlciA9IG5ldyBBc3luY1NjaGVkdWxlcihBc3luY0FjdGlvbik7XG52YXIgYXN5bmMgPSBhc3luY1NjaGVkdWxlcjtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZW1wdHkuanNcbnZhciBFTVBUWSA9IG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbn0pO1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1NjaGVkdWxlci5qc1xuZnVuY3Rpb24gaXNTY2hlZHVsZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUuc2NoZWR1bGUpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9hcmdzLmpzXG5mdW5jdGlvbiBsYXN0KGFycikge1xuICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbn1cbmZ1bmN0aW9uIHBvcFJlc3VsdFNlbGVjdG9yKGFyZ3MpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24obGFzdChhcmdzKSkgPyBhcmdzLnBvcCgpIDogdm9pZCAwO1xufVxuZnVuY3Rpb24gcG9wU2NoZWR1bGVyKGFyZ3MpIHtcbiAgcmV0dXJuIGlzU2NoZWR1bGVyKGxhc3QoYXJncykpID8gYXJncy5wb3AoKSA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHBvcE51bWJlcihhcmdzLCBkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiBsYXN0KGFyZ3MpID09PSBcIm51bWJlclwiID8gYXJncy5wb3AoKSA6IGRlZmF1bHRWYWx1ZTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNBcnJheUxpa2UuanNcbnZhciBpc0FycmF5TGlrZSA9IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHggJiYgdHlwZW9mIHgubGVuZ3RoID09PSBcIm51bWJlclwiICYmIHR5cGVvZiB4ICE9PSBcImZ1bmN0aW9uXCI7XG59O1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1Byb21pc2UuanNcbmZ1bmN0aW9uIGlzUHJvbWlzZSh2YWx1ZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmFsdWUudGhlbik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzSW50ZXJvcE9ic2VydmFibGUuanNcbmZ1bmN0aW9uIGlzSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24oaW5wdXRbb2JzZXJ2YWJsZV0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0FzeW5jSXRlcmFibGUuanNcbmZ1bmN0aW9uIGlzQXN5bmNJdGVyYWJsZShvYmopIHtcbiAgcmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yICYmIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3Rocm93VW5vYnNlcnZhYmxlRXJyb3IuanNcbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRPYnNlcnZhYmxlVHlwZUVycm9yKGlucHV0KSB7XG4gIHJldHVybiBuZXcgVHlwZUVycm9yKFwiWW91IHByb3ZpZGVkIFwiICsgKGlucHV0ICE9PSBudWxsICYmIHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiA/IFwiYW4gaW52YWxpZCBvYmplY3RcIiA6IFwiJ1wiICsgaW5wdXQgKyBcIidcIikgKyBcIiB3aGVyZSBhIHN0cmVhbSB3YXMgZXhwZWN0ZWQuIFlvdSBjYW4gcHJvdmlkZSBhbiBPYnNlcnZhYmxlLCBQcm9taXNlLCBSZWFkYWJsZVN0cmVhbSwgQXJyYXksIEFzeW5jSXRlcmFibGUsIG9yIEl0ZXJhYmxlLlwiKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3N5bWJvbC9pdGVyYXRvci5qc1xuZnVuY3Rpb24gZ2V0U3ltYm9sSXRlcmF0b3IoKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcImZ1bmN0aW9uXCIgfHwgIVN5bWJvbC5pdGVyYXRvcikge1xuICAgIHJldHVybiBcIkBAaXRlcmF0b3JcIjtcbiAgfVxuICByZXR1cm4gU3ltYm9sLml0ZXJhdG9yO1xufVxudmFyIGl0ZXJhdG9yID0gZ2V0U3ltYm9sSXRlcmF0b3IoKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNJdGVyYWJsZS5qc1xuZnVuY3Rpb24gaXNJdGVyYWJsZShpbnB1dCkge1xuICByZXR1cm4gaXNGdW5jdGlvbihpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5wdXRbaXRlcmF0b3JdKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNSZWFkYWJsZVN0cmVhbUxpa2UuanNcbmZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IocmVhZGFibGVTdHJlYW0pIHtcbiAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiByZWFkYWJsZVN0cmVhbUxpa2VUb0FzeW5jR2VuZXJhdG9yXzEoKSB7XG4gICAgdmFyIHJlYWRlciwgX2EsIHZhbHVlLCBkb25lO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfYikge1xuICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2IudHJ5cy5wdXNoKFsxLCAsIDksIDEwXSk7XG4gICAgICAgICAgX2IubGFiZWwgPSAyO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKGZhbHNlKSByZXR1cm4gWzMsIDhdO1xuICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdChyZWFkZXIucmVhZCgpKV07XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfYSA9IF9iLnNlbnQoKSwgdmFsdWUgPSBfYS52YWx1ZSwgZG9uZSA9IF9hLmRvbmU7XG4gICAgICAgICAgaWYgKCFkb25lKSByZXR1cm4gWzMsIDVdO1xuICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdCh2b2lkIDApXTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiBbMiwgX2Iuc2VudCgpXTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdCh2YWx1ZSldO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgcmV0dXJuIFs0LCBfYi5zZW50KCldO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgIHJldHVybiBbMywgMl07XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gWzMsIDEwXTtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgICAgIHJldHVybiBbN107XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgcmV0dXJuIFsyXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtTGlrZShvYmopIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqLmdldFJlYWRlcik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2lubmVyRnJvbS5qc1xuZnVuY3Rpb24gaW5uZXJGcm9tKGlucHV0KSB7XG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICBpZiAoaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkpIHtcbiAgICAgIHJldHVybiBmcm9tSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheUxpa2UoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZShpbnB1dCk7XG4gICAgfVxuICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIGZyb21Bc3luY0l0ZXJhYmxlKGlucHV0KTtcbiAgICB9XG4gICAgaWYgKGlzSXRlcmFibGUoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gZnJvbUl0ZXJhYmxlKGlucHV0KTtcbiAgICB9XG4gICAgaWYgKGlzUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIGZyb21SZWFkYWJsZVN0cmVhbUxpa2UoaW5wdXQpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCk7XG59XG5mdW5jdGlvbiBmcm9tSW50ZXJvcE9ic2VydmFibGUob2JqKSB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIG9icyA9IG9ialtvYnNlcnZhYmxlXSgpO1xuICAgIGlmIChpc0Z1bmN0aW9uKG9icy5zdWJzY3JpYmUpKSB7XG4gICAgICByZXR1cm4gb2JzLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb3ZpZGVkIG9iamVjdCBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IFN5bWJvbC5vYnNlcnZhYmxlXCIpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UoYXJyYXkpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aCAmJiAhc3Vic2NyaWJlci5jbG9zZWQ7IGkrKykge1xuICAgICAgc3Vic2NyaWJlci5uZXh0KGFycmF5W2ldKTtcbiAgICB9XG4gICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21Qcm9taXNlKHByb21pc2UpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZXJyKTtcbiAgICB9KS50aGVuKG51bGwsIHJlcG9ydFVuaGFuZGxlZEVycm9yKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBmcm9tSXRlcmFibGUoaXRlcmFibGUpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgZV8xLCBfYTtcbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgaXRlcmFibGVfMSA9IF9fdmFsdWVzKGl0ZXJhYmxlKSwgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCk7ICFpdGVyYWJsZV8xXzEuZG9uZTsgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gaXRlcmFibGVfMV8xLnZhbHVlO1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzFfMSkge1xuICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGl0ZXJhYmxlXzFfMSAmJiAhaXRlcmFibGVfMV8xLmRvbmUgJiYgKF9hID0gaXRlcmFibGVfMS5yZXR1cm4pKSBfYS5jYWxsKGl0ZXJhYmxlXzEpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZnJvbUFzeW5jSXRlcmFibGUoYXN5bmNJdGVyYWJsZSkge1xuICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHByb2Nlc3MoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgIH0pO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21SZWFkYWJsZVN0cmVhbUxpa2UocmVhZGFibGVTdHJlYW0pIHtcbiAgcmV0dXJuIGZyb21Bc3luY0l0ZXJhYmxlKHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IocmVhZGFibGVTdHJlYW0pKTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3MoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikge1xuICB2YXIgYXN5bmNJdGVyYWJsZV8xLCBhc3luY0l0ZXJhYmxlXzFfMTtcbiAgdmFyIGVfMiwgX2E7XG4gIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSwgZV8yXzE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9iKSB7XG4gICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDExXSk7XG4gICAgICAgICAgYXN5bmNJdGVyYWJsZV8xID0gX19hc3luY1ZhbHVlcyhhc3luY0l0ZXJhYmxlKTtcbiAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gWzQsIGFzeW5jSXRlcmFibGVfMS5uZXh0KCldO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKCEoYXN5bmNJdGVyYWJsZV8xXzEgPSBfYi5zZW50KCksICFhc3luY0l0ZXJhYmxlXzFfMS5kb25lKSkgcmV0dXJuIFszLCA0XTtcbiAgICAgICAgICB2YWx1ZSA9IGFzeW5jSXRlcmFibGVfMV8xLnZhbHVlO1xuICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gWzJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByZXR1cm4gWzMsIDFdO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIFszLCAxMV07XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBlXzJfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICAgIHJldHVybiBbMywgMTFdO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2IudHJ5cy5wdXNoKFs2LCAsIDksIDEwXSk7XG4gICAgICAgICAgaWYgKCEoYXN5bmNJdGVyYWJsZV8xXzEgJiYgIWFzeW5jSXRlcmFibGVfMV8xLmRvbmUgJiYgKF9hID0gYXN5bmNJdGVyYWJsZV8xLnJldHVybikpKSByZXR1cm4gWzMsIDhdO1xuICAgICAgICAgIHJldHVybiBbNCwgX2EuY2FsbChhc3luY0l0ZXJhYmxlXzEpXTtcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICBfYi5sYWJlbCA9IDg7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gWzMsIDEwXTtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjtcbiAgICAgICAgICByZXR1cm4gWzddO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIHJldHVybiBbN107XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybiBbMl07XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9leGVjdXRlU2NoZWR1bGUuanNcbmZ1bmN0aW9uIGV4ZWN1dGVTY2hlZHVsZShwYXJlbnRTdWJzY3JpcHRpb24sIHNjaGVkdWxlciwgd29yaywgZGVsYXkyLCByZXBlYXQpIHtcbiAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7XG4gICAgZGVsYXkyID0gMDtcbiAgfVxuICBpZiAocmVwZWF0ID09PSB2b2lkIDApIHtcbiAgICByZXBlYXQgPSBmYWxzZTtcbiAgfVxuICB2YXIgc2NoZWR1bGVTdWJzY3JpcHRpb24gPSBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7XG4gICAgd29yaygpO1xuICAgIGlmIChyZXBlYXQpIHtcbiAgICAgIHBhcmVudFN1YnNjcmlwdGlvbi5hZGQodGhpcy5zY2hlZHVsZShudWxsLCBkZWxheTIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfSwgZGVsYXkyKTtcbiAgcGFyZW50U3Vic2NyaXB0aW9uLmFkZChzY2hlZHVsZVN1YnNjcmlwdGlvbik7XG4gIGlmICghcmVwZWF0KSB7XG4gICAgcmV0dXJuIHNjaGVkdWxlU3Vic2NyaXB0aW9uO1xuICB9XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvb2JzZXJ2ZU9uLmpzXG5mdW5jdGlvbiBvYnNlcnZlT24oc2NoZWR1bGVyLCBkZWxheTIpIHtcbiAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7XG4gICAgZGVsYXkyID0gMDtcbiAgfVxuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0sIGRlbGF5Mik7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LCBkZWxheTIpO1xuICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgcmV0dXJuIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgICAgfSwgZGVsYXkyKTtcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N1YnNjcmliZU9uLmpzXG5mdW5jdGlvbiBzdWJzY3JpYmVPbihzY2hlZHVsZXIsIGRlbGF5Mikge1xuICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHtcbiAgICBkZWxheTIgPSAwO1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHN1YnNjcmliZXIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIH0sIGRlbGF5MikpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZU9ic2VydmFibGUuanNcbmZ1bmN0aW9uIHNjaGVkdWxlT2JzZXJ2YWJsZShpbnB1dCwgc2NoZWR1bGVyKSB7XG4gIHJldHVybiBpbm5lckZyb20oaW5wdXQpLnBpcGUoc3Vic2NyaWJlT24oc2NoZWR1bGVyKSwgb2JzZXJ2ZU9uKHNjaGVkdWxlcikpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlUHJvbWlzZS5qc1xuZnVuY3Rpb24gc2NoZWR1bGVQcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpIHtcbiAgcmV0dXJuIGlubmVyRnJvbShpbnB1dCkucGlwZShzdWJzY3JpYmVPbihzY2hlZHVsZXIpLCBvYnNlcnZlT24oc2NoZWR1bGVyKSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVBcnJheS5qc1xuZnVuY3Rpb24gc2NoZWR1bGVBcnJheShpbnB1dCwgc2NoZWR1bGVyKSB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGkgPSAwO1xuICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoaSA9PT0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnNjcmliZXIubmV4dChpbnB1dFtpKytdKTtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUl0ZXJhYmxlLmpzXG5mdW5jdGlvbiBzY2hlZHVsZUl0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgaXRlcmF0b3IyO1xuICAgIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgaXRlcmF0b3IyID0gaW5wdXRbaXRlcmF0b3JdKCk7XG4gICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgIHZhciBkb25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIF9hID0gaXRlcmF0b3IyLm5leHQoKSwgdmFsdWUgPSBfYS52YWx1ZSwgZG9uZSA9IF9hLmRvbmU7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSwgMCwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oaXRlcmF0b3IyID09PSBudWxsIHx8IGl0ZXJhdG9yMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogaXRlcmF0b3IyLnJldHVybikgJiYgaXRlcmF0b3IyLnJldHVybigpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlQXN5bmNJdGVyYWJsZS5qc1xuZnVuY3Rpb24gc2NoZWR1bGVBc3luY0l0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkl0ZXJhYmxlIGNhbm5vdCBiZSBudWxsXCIpO1xuICB9XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaXRlcmF0b3IyID0gaW5wdXRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaXRlcmF0b3IyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgMCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlLmpzXG5mdW5jdGlvbiBzY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCwgc2NoZWR1bGVyKSB7XG4gIHJldHVybiBzY2hlZHVsZUFzeW5jSXRlcmFibGUocmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvcihpbnB1dCksIHNjaGVkdWxlcik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVkLmpzXG5mdW5jdGlvbiBzY2hlZHVsZWQoaW5wdXQsIHNjaGVkdWxlcikge1xuICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgIGlmIChpc0ludGVyb3BPYnNlcnZhYmxlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlT2JzZXJ2YWJsZShpbnB1dCwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXlMaWtlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcik7XG4gICAgfVxuICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVQcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpO1xuICAgIH1cbiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQXN5bmNJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGlzSXRlcmFibGUoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGlzUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0LCBzY2hlZHVsZXIpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb20uanNcbmZ1bmN0aW9uIGZyb20oaW5wdXQsIHNjaGVkdWxlcikge1xuICByZXR1cm4gc2NoZWR1bGVyID8gc2NoZWR1bGVkKGlucHV0LCBzY2hlZHVsZXIpIDogaW5uZXJGcm9tKGlucHV0KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvb2YuanNcbmZ1bmN0aW9uIG9mKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKGFyZ3MpO1xuICByZXR1cm4gZnJvbShhcmdzLCBzY2hlZHVsZXIpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9FbXB0eUVycm9yLmpzXG52YXIgRW1wdHlFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiBFbXB0eUVycm9ySW1wbCgpIHtcbiAgICBfc3VwZXIodGhpcyk7XG4gICAgdGhpcy5uYW1lID0gXCJFbXB0eUVycm9yXCI7XG4gICAgdGhpcy5tZXNzYWdlID0gXCJubyBlbGVtZW50cyBpbiBzZXF1ZW5jZVwiO1xuICB9O1xufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9sYXN0VmFsdWVGcm9tLmpzXG5mdW5jdGlvbiBsYXN0VmFsdWVGcm9tKHNvdXJjZSwgY29uZmlnMikge1xuICB2YXIgaGFzQ29uZmlnID0gdHlwZW9mIGNvbmZpZzIgPT09IFwib2JqZWN0XCI7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgX2hhc1ZhbHVlID0gZmFsc2U7XG4gICAgdmFyIF92YWx1ZTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF92YWx1ZSA9IHZhbHVlO1xuICAgICAgICBfaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChfaGFzVmFsdWUpIHtcbiAgICAgICAgICByZXNvbHZlKF92YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQ29uZmlnKSB7XG4gICAgICAgICAgcmVzb2x2ZShjb25maWcyLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFbXB0eUVycm9yKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvZmlyc3RWYWx1ZUZyb20uanNcbmZ1bmN0aW9uIGZpcnN0VmFsdWVGcm9tKHNvdXJjZSwgY29uZmlnMikge1xuICB2YXIgaGFzQ29uZmlnID0gdHlwZW9mIGNvbmZpZzIgPT09IFwib2JqZWN0XCI7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgc3Vic2NyaWJlciA9IG5ldyBTYWZlU3Vic2NyaWJlcih7XG4gICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChoYXNDb25maWcpIHtcbiAgICAgICAgICByZXNvbHZlKGNvbmZpZzIuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QobmV3IEVtcHR5RXJyb3IoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNEYXRlLmpzXG5mdW5jdGlvbiBpc1ZhbGlkRGF0ZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2YWx1ZSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWFwLmpzXG5mdW5jdGlvbiBtYXAocHJvamVjdCwgdGhpc0FyZykge1xuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBzdWJzY3JpYmVyLm5leHQocHJvamVjdC5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCsrKSk7XG4gICAgfSkpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvbWFwT25lT3JNYW55QXJncy5qc1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gY2FsbE9yQXBwbHkoZm4sIGFyZ3MpIHtcbiAgcmV0dXJuIGlzQXJyYXkoYXJncykgPyBmbi5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhcmdzKSkpIDogZm4oYXJncyk7XG59XG5mdW5jdGlvbiBtYXBPbmVPck1hbnlBcmdzKGZuKSB7XG4gIHJldHVybiBtYXAoZnVuY3Rpb24oYXJncykge1xuICAgIHJldHVybiBjYWxsT3JBcHBseShmbiwgYXJncyk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9hcmdzQXJnQXJyYXlPck9iamVjdC5qc1xudmFyIGlzQXJyYXkyID0gQXJyYXkuaXNBcnJheTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG52YXIgZ2V0S2V5cyA9IE9iamVjdC5rZXlzO1xuZnVuY3Rpb24gYXJnc0FyZ0FycmF5T3JPYmplY3QoYXJncykge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICB2YXIgZmlyc3RfMSA9IGFyZ3NbMF07XG4gICAgaWYgKGlzQXJyYXkyKGZpcnN0XzEpKSB7XG4gICAgICByZXR1cm4geyBhcmdzOiBmaXJzdF8xLCBrZXlzOiBudWxsIH07XG4gICAgfVxuICAgIGlmIChpc1BPSk8oZmlyc3RfMSkpIHtcbiAgICAgIHZhciBrZXlzID0gZ2V0S2V5cyhmaXJzdF8xKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFyZ3M6IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIHJldHVybiBmaXJzdF8xW2tleV07XG4gICAgICAgIH0pLFxuICAgICAgICBrZXlzXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBhcmdzLCBrZXlzOiBudWxsIH07XG59XG5mdW5jdGlvbiBpc1BPSk8ob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiBnZXRQcm90b3R5cGVPZihvYmopID09PSBvYmplY3RQcm90bztcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvY3JlYXRlT2JqZWN0LmpzXG5mdW5jdGlvbiBjcmVhdGVPYmplY3Qoa2V5cywgdmFsdWVzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbihyZXN1bHQsIGtleSwgaSkge1xuICAgIHJldHVybiByZXN1bHRba2V5XSA9IHZhbHVlc1tpXSwgcmVzdWx0O1xuICB9LCB7fSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2NvbWJpbmVMYXRlc3QuanNcbmZ1bmN0aW9uIGNvbWJpbmVMYXRlc3QoKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG4gIHZhciBzY2hlZHVsZXIgPSBwb3BTY2hlZHVsZXIoYXJncyk7XG4gIHZhciByZXN1bHRTZWxlY3RvciA9IHBvcFJlc3VsdFNlbGVjdG9yKGFyZ3MpO1xuICB2YXIgX2EgPSBhcmdzQXJnQXJyYXlPck9iamVjdChhcmdzKSwgb2JzZXJ2YWJsZXMgPSBfYS5hcmdzLCBrZXlzID0gX2Eua2V5cztcbiAgaWYgKG9ic2VydmFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmcm9tKFtdLCBzY2hlZHVsZXIpO1xuICB9XG4gIHZhciByZXN1bHQgPSBuZXcgT2JzZXJ2YWJsZShjb21iaW5lTGF0ZXN0SW5pdChvYnNlcnZhYmxlcywgc2NoZWR1bGVyLCBrZXlzID8gZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU9iamVjdChrZXlzLCB2YWx1ZXMpO1xuICB9IDogaWRlbnRpdHkpKTtcbiAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0LnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpIDogcmVzdWx0O1xufVxuZnVuY3Rpb24gY29tYmluZUxhdGVzdEluaXQob2JzZXJ2YWJsZXMsIHNjaGVkdWxlciwgdmFsdWVUcmFuc2Zvcm0pIHtcbiAgaWYgKHZhbHVlVHJhbnNmb3JtID09PSB2b2lkIDApIHtcbiAgICB2YWx1ZVRyYW5zZm9ybSA9IGlkZW50aXR5O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgbWF5YmVTY2hlZHVsZShzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGxlbmd0aCA9IG9ic2VydmFibGVzLmxlbmd0aDtcbiAgICAgIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICAgIHZhciBhY3RpdmUgPSBsZW5ndGg7XG4gICAgICB2YXIgcmVtYWluaW5nRmlyc3RWYWx1ZXMgPSBsZW5ndGg7XG4gICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uKGkyKSB7XG4gICAgICAgIG1heWJlU2NoZWR1bGUoc2NoZWR1bGVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgc291cmNlID0gZnJvbShvYnNlcnZhYmxlc1tpMl0sIHNjaGVkdWxlcik7XG4gICAgICAgICAgdmFyIGhhc0ZpcnN0VmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWVzW2kyXSA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFoYXNGaXJzdFZhbHVlKSB7XG4gICAgICAgICAgICAgIGhhc0ZpcnN0VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICByZW1haW5pbmdGaXJzdFZhbHVlcy0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZW1haW5pbmdGaXJzdFZhbHVlcykge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWVUcmFuc2Zvcm0odmFsdWVzLnNsaWNlKCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICghLS1hY3RpdmUpIHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSwgc3Vic2NyaWJlcik7XG4gICAgICB9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBfbG9vcF8xKGkpO1xuICAgICAgfVxuICAgIH0sIHN1YnNjcmliZXIpO1xuICB9O1xufVxuZnVuY3Rpb24gbWF5YmVTY2hlZHVsZShzY2hlZHVsZXIsIGV4ZWN1dGUsIHN1YnNjcmlwdGlvbikge1xuICBpZiAoc2NoZWR1bGVyKSB7XG4gICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmlwdGlvbiwgc2NoZWR1bGVyLCBleGVjdXRlKTtcbiAgfSBlbHNlIHtcbiAgICBleGVjdXRlKCk7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUludGVybmFscy5qc1xuZnVuY3Rpb24gbWVyZ2VJbnRlcm5hbHMoc291cmNlLCBzdWJzY3JpYmVyLCBwcm9qZWN0LCBjb25jdXJyZW50LCBvbkJlZm9yZU5leHQsIGV4cGFuZCwgaW5uZXJTdWJTY2hlZHVsZXIsIGFkZGl0aW9uYWxGaW5hbGl6ZXIpIHtcbiAgdmFyIGJ1ZmZlciA9IFtdO1xuICB2YXIgYWN0aXZlID0gMDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGlzQ29tcGxldGUgPSBmYWxzZTtcbiAgdmFyIGNoZWNrQ29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoaXNDb21wbGV0ZSAmJiAhYnVmZmVyLmxlbmd0aCAmJiAhYWN0aXZlKSB7XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfVxuICB9O1xuICB2YXIgb3V0ZXJOZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gYWN0aXZlIDwgY29uY3VycmVudCA/IGRvSW5uZXJTdWIodmFsdWUpIDogYnVmZmVyLnB1c2godmFsdWUpO1xuICB9O1xuICB2YXIgZG9Jbm5lclN1YiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgZXhwYW5kICYmIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgYWN0aXZlKys7XG4gICAgdmFyIGlubmVyQ29tcGxldGUgPSBmYWxzZTtcbiAgICBpbm5lckZyb20ocHJvamVjdCh2YWx1ZSwgaW5kZXgrKykpLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oaW5uZXJWYWx1ZSkge1xuICAgICAgb25CZWZvcmVOZXh0ID09PSBudWxsIHx8IG9uQmVmb3JlTmV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CZWZvcmVOZXh0KGlubmVyVmFsdWUpO1xuICAgICAgaWYgKGV4cGFuZCkge1xuICAgICAgICBvdXRlck5leHQoaW5uZXJWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoaW5uZXJWYWx1ZSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICBpbm5lckNvbXBsZXRlID0gdHJ1ZTtcbiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGlubmVyQ29tcGxldGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhY3RpdmUtLTtcbiAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGJ1ZmZlcmVkVmFsdWUgPSBidWZmZXIuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChpbm5lclN1YlNjaGVkdWxlcikge1xuICAgICAgICAgICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgaW5uZXJTdWJTY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkb0lubmVyU3ViKGJ1ZmZlcmVkVmFsdWUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRvSW5uZXJTdWIoYnVmZmVyZWRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCAmJiBhY3RpdmUgPCBjb25jdXJyZW50KSB7XG4gICAgICAgICAgICBfbG9vcF8xKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoZWNrQ29tcGxldGUoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpO1xuICB9O1xuICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBvdXRlck5leHQsIGZ1bmN0aW9uKCkge1xuICAgIGlzQ29tcGxldGUgPSB0cnVlO1xuICAgIGNoZWNrQ29tcGxldGUoKTtcbiAgfSkpO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgYWRkaXRpb25hbEZpbmFsaXplciA9PT0gbnVsbCB8fCBhZGRpdGlvbmFsRmluYWxpemVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZGRpdGlvbmFsRmluYWxpemVyKCk7XG4gIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VNYXAuanNcbmZ1bmN0aW9uIG1lcmdlTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50KSB7XG4gIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHtcbiAgICBjb25jdXJyZW50ID0gSW5maW5pdHk7XG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24ocmVzdWx0U2VsZWN0b3IpKSB7XG4gICAgcmV0dXJuIG1lcmdlTWFwKGZ1bmN0aW9uKGEsIGkpIHtcbiAgICAgIHJldHVybiBtYXAoZnVuY3Rpb24oYiwgaWkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yKGEsIGIsIGksIGlpKTtcbiAgICAgIH0pKGlubmVyRnJvbShwcm9qZWN0KGEsIGkpKSk7XG4gICAgfSwgY29uY3VycmVudCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSBcIm51bWJlclwiKSB7XG4gICAgY29uY3VycmVudCA9IHJlc3VsdFNlbGVjdG9yO1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBtZXJnZUludGVybmFscyhzb3VyY2UsIHN1YnNjcmliZXIsIHByb2plY3QsIGNvbmN1cnJlbnQpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUFsbC5qc1xuZnVuY3Rpb24gbWVyZ2VBbGwoY29uY3VycmVudCkge1xuICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7XG4gICAgY29uY3VycmVudCA9IEluZmluaXR5O1xuICB9XG4gIHJldHVybiBtZXJnZU1hcChpZGVudGl0eSwgY29uY3VycmVudCk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0QWxsLmpzXG5mdW5jdGlvbiBjb25jYXRBbGwoKSB7XG4gIHJldHVybiBtZXJnZUFsbCgxKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvY29uY2F0LmpzXG5mdW5jdGlvbiBjb25jYXQoKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG4gIHJldHVybiBjb25jYXRBbGwoKShmcm9tKGFyZ3MsIHBvcFNjaGVkdWxlcihhcmdzKSkpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9kZWZlci5qc1xuZnVuY3Rpb24gZGVmZXIob2JzZXJ2YWJsZUZhY3RvcnkpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICBpbm5lckZyb20ob2JzZXJ2YWJsZUZhY3RvcnkoKSkuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZm9ya0pvaW4uanNcbmZ1bmN0aW9uIGZvcmtKb2luKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBwb3BSZXN1bHRTZWxlY3RvcihhcmdzKTtcbiAgdmFyIF9hID0gYXJnc0FyZ0FycmF5T3JPYmplY3QoYXJncyksIHNvdXJjZXMgPSBfYS5hcmdzLCBrZXlzID0gX2Eua2V5cztcbiAgdmFyIHJlc3VsdCA9IG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHZhbHVlcyA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgIHZhciByZW1haW5pbmdDb21wbGV0aW9ucyA9IGxlbmd0aDtcbiAgICB2YXIgcmVtYWluaW5nRW1pc3Npb25zID0gbGVuZ3RoO1xuICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24oc291cmNlSW5kZXgyKSB7XG4gICAgICB2YXIgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgIGlubmVyRnJvbShzb3VyY2VzW3NvdXJjZUluZGV4Ml0pLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKCFoYXNWYWx1ZSkge1xuICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICByZW1haW5pbmdFbWlzc2lvbnMtLTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXNbc291cmNlSW5kZXgyXSA9IHZhbHVlO1xuICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByZW1haW5pbmdDb21wbGV0aW9ucy0tO1xuICAgICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCFyZW1haW5pbmdDb21wbGV0aW9ucyB8fCAhaGFzVmFsdWUpIHtcbiAgICAgICAgICBpZiAoIXJlbWFpbmluZ0VtaXNzaW9ucykge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGtleXMgPyBjcmVhdGVPYmplY3Qoa2V5cywgdmFsdWVzKSA6IHZhbHVlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH07XG4gICAgZm9yICh2YXIgc291cmNlSW5kZXggPSAwOyBzb3VyY2VJbmRleCA8IGxlbmd0aDsgc291cmNlSW5kZXgrKykge1xuICAgICAgX2xvb3BfMShzb3VyY2VJbmRleCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0LnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpIDogcmVzdWx0O1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tRXZlbnQuanNcbnZhciBub2RlRXZlbnRFbWl0dGVyTWV0aG9kcyA9IFtcImFkZExpc3RlbmVyXCIsIFwicmVtb3ZlTGlzdGVuZXJcIl07XG52YXIgZXZlbnRUYXJnZXRNZXRob2RzID0gW1wiYWRkRXZlbnRMaXN0ZW5lclwiLCBcInJlbW92ZUV2ZW50TGlzdGVuZXJcIl07XG52YXIganF1ZXJ5TWV0aG9kcyA9IFtcIm9uXCIsIFwib2ZmXCJdO1xuZnVuY3Rpb24gZnJvbUV2ZW50KHRhcmdldCwgZXZlbnROYW1lLCBvcHRpb25zLCByZXN1bHRTZWxlY3Rvcikge1xuICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgIHJlc3VsdFNlbGVjdG9yID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0gdm9pZCAwO1xuICB9XG4gIGlmIChyZXN1bHRTZWxlY3Rvcikge1xuICAgIHJldHVybiBmcm9tRXZlbnQodGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpLnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpO1xuICB9XG4gIHZhciBfYSA9IF9fcmVhZChpc0V2ZW50VGFyZ2V0KHRhcmdldCkgPyBldmVudFRhcmdldE1ldGhvZHMubWFwKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oaGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRhcmdldFttZXRob2ROYW1lXShldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIH07XG4gIH0pIDogaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSA/IG5vZGVFdmVudEVtaXR0ZXJNZXRob2RzLm1hcCh0b0NvbW1vbkhhbmRsZXJSZWdpc3RyeSh0YXJnZXQsIGV2ZW50TmFtZSkpIDogaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpID8ganF1ZXJ5TWV0aG9kcy5tYXAodG9Db21tb25IYW5kbGVyUmVnaXN0cnkodGFyZ2V0LCBldmVudE5hbWUpKSA6IFtdLCAyKSwgYWRkID0gX2FbMF0sIHJlbW92ZSA9IF9hWzFdO1xuICBpZiAoIWFkZCkge1xuICAgIGlmIChpc0FycmF5TGlrZSh0YXJnZXQpKSB7XG4gICAgICByZXR1cm4gbWVyZ2VNYXAoZnVuY3Rpb24oc3ViVGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBmcm9tRXZlbnQoc3ViVGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpO1xuICAgICAgfSkoaW5uZXJGcm9tKHRhcmdldCkpO1xuICAgIH1cbiAgfVxuICBpZiAoIWFkZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGV2ZW50IHRhcmdldFwiKTtcbiAgfVxuICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1YnNjcmliZXIubmV4dCgxIDwgYXJncy5sZW5ndGggPyBhcmdzIDogYXJnc1swXSk7XG4gICAgfTtcbiAgICBhZGQoaGFuZGxlcik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJlbW92ZShoYW5kbGVyKTtcbiAgICB9O1xuICB9KTtcbn1cbmZ1bmN0aW9uIHRvQ29tbW9uSGFuZGxlclJlZ2lzdHJ5KHRhcmdldCwgZXZlbnROYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHRhcmdldC5hZGRMaXN0ZW5lcikgJiYgaXNGdW5jdGlvbih0YXJnZXQucmVtb3ZlTGlzdGVuZXIpO1xufVxuZnVuY3Rpb24gaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24odGFyZ2V0Lm9uKSAmJiBpc0Z1bmN0aW9uKHRhcmdldC5vZmYpO1xufVxuZnVuY3Rpb24gaXNFdmVudFRhcmdldCh0YXJnZXQpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24odGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpICYmIGlzRnVuY3Rpb24odGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS90aW1lci5qc1xuZnVuY3Rpb24gdGltZXIoZHVlVGltZSwgaW50ZXJ2YWxPclNjaGVkdWxlciwgc2NoZWR1bGVyKSB7XG4gIGlmIChkdWVUaW1lID09PSB2b2lkIDApIHtcbiAgICBkdWVUaW1lID0gMDtcbiAgfVxuICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHtcbiAgICBzY2hlZHVsZXIgPSBhc3luYztcbiAgfVxuICB2YXIgaW50ZXJ2YWxEdXJhdGlvbiA9IC0xO1xuICBpZiAoaW50ZXJ2YWxPclNjaGVkdWxlciAhPSBudWxsKSB7XG4gICAgaWYgKGlzU2NoZWR1bGVyKGludGVydmFsT3JTY2hlZHVsZXIpKSB7XG4gICAgICBzY2hlZHVsZXIgPSBpbnRlcnZhbE9yU2NoZWR1bGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbER1cmF0aW9uID0gaW50ZXJ2YWxPclNjaGVkdWxlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgZHVlID0gaXNWYWxpZERhdGUoZHVlVGltZSkgPyArZHVlVGltZSAtIHNjaGVkdWxlci5ub3coKSA6IGR1ZVRpbWU7XG4gICAgaWYgKGR1ZSA8IDApIHtcbiAgICAgIGR1ZSA9IDA7XG4gICAgfVxuICAgIHZhciBuID0gMDtcbiAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQobisrKTtcbiAgICAgICAgaWYgKDAgPD0gaW50ZXJ2YWxEdXJhdGlvbikge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGUodm9pZCAwLCBpbnRlcnZhbER1cmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBkdWUpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvbWVyZ2UuanNcbmZ1bmN0aW9uIG1lcmdlKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKGFyZ3MpO1xuICB2YXIgY29uY3VycmVudCA9IHBvcE51bWJlcihhcmdzLCBJbmZpbml0eSk7XG4gIHZhciBzb3VyY2VzID0gYXJncztcbiAgcmV0dXJuICFzb3VyY2VzLmxlbmd0aCA/IEVNUFRZIDogc291cmNlcy5sZW5ndGggPT09IDEgPyBpbm5lckZyb20oc291cmNlc1swXSkgOiBtZXJnZUFsbChjb25jdXJyZW50KShmcm9tKHNvdXJjZXMsIHNjaGVkdWxlcikpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9uZXZlci5qc1xudmFyIE5FVkVSID0gbmV3IE9ic2VydmFibGUobm9vcCk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyZ3NPckFyZ0FycmF5LmpzXG52YXIgaXNBcnJheTMgPSBBcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gYXJnc09yQXJnQXJyYXkoYXJncykge1xuICByZXR1cm4gYXJncy5sZW5ndGggPT09IDEgJiYgaXNBcnJheTMoYXJnc1swXSkgPyBhcmdzWzBdIDogYXJncztcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9maWx0ZXIuanNcbmZ1bmN0aW9uIGZpbHRlcihwcmVkaWNhdGUsIHRoaXNBcmcpIHtcbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCsrKSAmJiBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgIH0pKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3JhY2UuanNcbmZ1bmN0aW9uIHJhY2UoKSB7XG4gIHZhciBzb3VyY2VzID0gW107XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgc291cmNlc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG4gIHNvdXJjZXMgPSBhcmdzT3JBcmdBcnJheShzb3VyY2VzKTtcbiAgcmV0dXJuIHNvdXJjZXMubGVuZ3RoID09PSAxID8gaW5uZXJGcm9tKHNvdXJjZXNbMF0pIDogbmV3IE9ic2VydmFibGUocmFjZUluaXQoc291cmNlcykpO1xufVxuZnVuY3Rpb24gcmFjZUluaXQoc291cmNlcykge1xuICByZXR1cm4gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHZhciBzdWJzY3JpcHRpb25zID0gW107XG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbihpMikge1xuICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKGlubmVyRnJvbShzb3VyY2VzW2kyXSkuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucykge1xuICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgc3Vic2NyaXB0aW9ucy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgcyAhPT0gaTIgJiYgc3Vic2NyaXB0aW9uc1tzXS51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdWJzY3JpcHRpb25zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgfSkpKTtcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBzdWJzY3JpcHRpb25zICYmICFzdWJzY3JpYmVyLmNsb3NlZCAmJiBpIDwgc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgX2xvb3BfMShpKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3ppcC5qc1xuZnVuY3Rpb24gemlwKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBwb3BSZXN1bHRTZWxlY3RvcihhcmdzKTtcbiAgdmFyIHNvdXJjZXMgPSBhcmdzT3JBcmdBcnJheShhcmdzKTtcbiAgcmV0dXJuIHNvdXJjZXMubGVuZ3RoID8gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHZhciBidWZmZXJzID0gc291cmNlcy5tYXAoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG4gICAgdmFyIGNvbXBsZXRlZCA9IHNvdXJjZXMubWFwKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIHN1YnNjcmliZXIuYWRkKGZ1bmN0aW9uKCkge1xuICAgICAgYnVmZmVycyA9IGNvbXBsZXRlZCA9IG51bGw7XG4gICAgfSk7XG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbihzb3VyY2VJbmRleDIpIHtcbiAgICAgIGlubmVyRnJvbShzb3VyY2VzW3NvdXJjZUluZGV4Ml0pLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgYnVmZmVyc1tzb3VyY2VJbmRleDJdLnB1c2godmFsdWUpO1xuICAgICAgICBpZiAoYnVmZmVycy5ldmVyeShmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgICAgICByZXR1cm4gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gYnVmZmVycy5tYXAoZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyLnNoaWZ0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0U2VsZWN0b3IuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQocmVzdWx0KSkpIDogcmVzdWx0KTtcbiAgICAgICAgICBpZiAoYnVmZmVycy5zb21lKGZ1bmN0aW9uKGJ1ZmZlciwgaSkge1xuICAgICAgICAgICAgcmV0dXJuICFidWZmZXIubGVuZ3RoICYmIGNvbXBsZXRlZFtpXTtcbiAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbXBsZXRlZFtzb3VyY2VJbmRleDJdID0gdHJ1ZTtcbiAgICAgICAgIWJ1ZmZlcnNbc291cmNlSW5kZXgyXS5sZW5ndGggJiYgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfSkpO1xuICAgIH07XG4gICAgZm9yICh2YXIgc291cmNlSW5kZXggPSAwOyAhc3Vic2NyaWJlci5jbG9zZWQgJiYgc291cmNlSW5kZXggPCBzb3VyY2VzLmxlbmd0aDsgc291cmNlSW5kZXgrKykge1xuICAgICAgX2xvb3BfMShzb3VyY2VJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIGJ1ZmZlcnMgPSBjb21wbGV0ZWQgPSBudWxsO1xuICAgIH07XG4gIH0pIDogRU1QVFk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvYnVmZmVyQ291bnQuanNcbmZ1bmN0aW9uIGJ1ZmZlckNvdW50KGJ1ZmZlclNpemUsIHN0YXJ0QnVmZmVyRXZlcnkpIHtcbiAgaWYgKHN0YXJ0QnVmZmVyRXZlcnkgPT09IHZvaWQgMCkge1xuICAgIHN0YXJ0QnVmZmVyRXZlcnkgPSBudWxsO1xuICB9XG4gIHN0YXJ0QnVmZmVyRXZlcnkgPSBzdGFydEJ1ZmZlckV2ZXJ5ICE9PSBudWxsICYmIHN0YXJ0QnVmZmVyRXZlcnkgIT09IHZvaWQgMCA/IHN0YXJ0QnVmZmVyRXZlcnkgOiBidWZmZXJTaXplO1xuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgYnVmZmVycyA9IFtdO1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBlXzEsIF9hLCBlXzIsIF9iO1xuICAgICAgdmFyIHRvRW1pdCA9IG51bGw7XG4gICAgICBpZiAoY291bnQrKyAlIHN0YXJ0QnVmZmVyRXZlcnkgPT09IDApIHtcbiAgICAgICAgYnVmZmVycy5wdXNoKFtdKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIGJ1ZmZlcnNfMSA9IF9fdmFsdWVzKGJ1ZmZlcnMpLCBidWZmZXJzXzFfMSA9IGJ1ZmZlcnNfMS5uZXh0KCk7ICFidWZmZXJzXzFfMS5kb25lOyBidWZmZXJzXzFfMSA9IGJ1ZmZlcnNfMS5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gYnVmZmVyc18xXzEudmFsdWU7XG4gICAgICAgICAgYnVmZmVyLnB1c2godmFsdWUpO1xuICAgICAgICAgIGlmIChidWZmZXJTaXplIDw9IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRvRW1pdCA9IHRvRW1pdCAhPT0gbnVsbCAmJiB0b0VtaXQgIT09IHZvaWQgMCA/IHRvRW1pdCA6IFtdO1xuICAgICAgICAgICAgdG9FbWl0LnB1c2goYnVmZmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7XG4gICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChidWZmZXJzXzFfMSAmJiAhYnVmZmVyc18xXzEuZG9uZSAmJiAoX2EgPSBidWZmZXJzXzEucmV0dXJuKSkgX2EuY2FsbChidWZmZXJzXzEpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRvRW1pdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIHRvRW1pdF8xID0gX192YWx1ZXModG9FbWl0KSwgdG9FbWl0XzFfMSA9IHRvRW1pdF8xLm5leHQoKTsgIXRvRW1pdF8xXzEuZG9uZTsgdG9FbWl0XzFfMSA9IHRvRW1pdF8xLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IHRvRW1pdF8xXzEudmFsdWU7XG4gICAgICAgICAgICBhcnJSZW1vdmUoYnVmZmVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZV8yXzEpIHtcbiAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodG9FbWl0XzFfMSAmJiAhdG9FbWl0XzFfMS5kb25lICYmIChfYiA9IHRvRW1pdF8xLnJldHVybikpIF9iLmNhbGwodG9FbWl0XzEpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZV8zLCBfYTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIGJ1ZmZlcnNfMiA9IF9fdmFsdWVzKGJ1ZmZlcnMpLCBidWZmZXJzXzJfMSA9IGJ1ZmZlcnNfMi5uZXh0KCk7ICFidWZmZXJzXzJfMS5kb25lOyBidWZmZXJzXzJfMSA9IGJ1ZmZlcnNfMi5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gYnVmZmVyc18yXzEudmFsdWU7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVfM18xKSB7XG4gICAgICAgIGVfMyA9IHsgZXJyb3I6IGVfM18xIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChidWZmZXJzXzJfMSAmJiAhYnVmZmVyc18yXzEuZG9uZSAmJiAoX2EgPSBidWZmZXJzXzIucmV0dXJuKSkgX2EuY2FsbChidWZmZXJzXzIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgIH0sIHZvaWQgMCwgZnVuY3Rpb24oKSB7XG4gICAgICBidWZmZXJzID0gbnVsbDtcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NhdGNoRXJyb3IuanNcbmZ1bmN0aW9uIGNhdGNoRXJyb3Ioc2VsZWN0b3IpIHtcbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGlubmVyU3ViID0gbnVsbDtcbiAgICB2YXIgc3luY1Vuc3ViID0gZmFsc2U7XG4gICAgdmFyIGhhbmRsZWRSZXN1bHQ7XG4gICAgaW5uZXJTdWIgPSBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICBoYW5kbGVkUmVzdWx0ID0gaW5uZXJGcm9tKHNlbGVjdG9yKGVyciwgY2F0Y2hFcnJvcihzZWxlY3Rvcikoc291cmNlKSkpO1xuICAgICAgaWYgKGlubmVyU3ViKSB7XG4gICAgICAgIGlubmVyU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGlubmVyU3ViID0gbnVsbDtcbiAgICAgICAgaGFuZGxlZFJlc3VsdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jVW5zdWIgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pKTtcbiAgICBpZiAoc3luY1Vuc3ViKSB7XG4gICAgICBpbm5lclN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgaW5uZXJTdWIgPSBudWxsO1xuICAgICAgaGFuZGxlZFJlc3VsdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb25jYXRNYXAuanNcbmZ1bmN0aW9uIGNvbmNhdE1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3Rvcikge1xuICByZXR1cm4gaXNGdW5jdGlvbihyZXN1bHRTZWxlY3RvcikgPyBtZXJnZU1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvciwgMSkgOiBtZXJnZU1hcChwcm9qZWN0LCAxKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZWJvdW5jZVRpbWUuanNcbmZ1bmN0aW9uIGRlYm91bmNlVGltZShkdWVUaW1lLCBzY2hlZHVsZXIpIHtcbiAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7XG4gICAgc2NoZWR1bGVyID0gYXN5bmNTY2hlZHVsZXI7XG4gIH1cbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGFjdGl2ZVRhc2sgPSBudWxsO1xuICAgIHZhciBsYXN0VmFsdWUgPSBudWxsO1xuICAgIHZhciBsYXN0VGltZSA9IG51bGw7XG4gICAgdmFyIGVtaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChhY3RpdmVUYXNrKSB7XG4gICAgICAgIGFjdGl2ZVRhc2sudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgYWN0aXZlVGFzayA9IG51bGw7XG4gICAgICAgIHZhciB2YWx1ZSA9IGxhc3RWYWx1ZTtcbiAgICAgICAgbGFzdFZhbHVlID0gbnVsbDtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGVtaXRXaGVuSWRsZSgpIHtcbiAgICAgIHZhciB0YXJnZXRUaW1lID0gbGFzdFRpbWUgKyBkdWVUaW1lO1xuICAgICAgdmFyIG5vdyA9IHNjaGVkdWxlci5ub3coKTtcbiAgICAgIGlmIChub3cgPCB0YXJnZXRUaW1lKSB7XG4gICAgICAgIGFjdGl2ZVRhc2sgPSB0aGlzLnNjaGVkdWxlKHZvaWQgMCwgdGFyZ2V0VGltZSAtIG5vdyk7XG4gICAgICAgIHN1YnNjcmliZXIuYWRkKGFjdGl2ZVRhc2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbWl0KCk7XG4gICAgfVxuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBsYXN0VmFsdWUgPSB2YWx1ZTtcbiAgICAgIGxhc3RUaW1lID0gc2NoZWR1bGVyLm5vdygpO1xuICAgICAgaWYgKCFhY3RpdmVUYXNrKSB7XG4gICAgICAgIGFjdGl2ZVRhc2sgPSBzY2hlZHVsZXIuc2NoZWR1bGUoZW1pdFdoZW5JZGxlLCBkdWVUaW1lKTtcbiAgICAgICAgc3Vic2NyaWJlci5hZGQoYWN0aXZlVGFzayk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICBlbWl0KCk7XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHtcbiAgICAgIGxhc3RWYWx1ZSA9IGFjdGl2ZVRhc2sgPSBudWxsO1xuICAgIH0pKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVmYXVsdElmRW1wdHkuanNcbmZ1bmN0aW9uIGRlZmF1bHRJZkVtcHR5KGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghaGFzVmFsdWUpIHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSkpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YWtlLmpzXG5mdW5jdGlvbiB0YWtlKGNvdW50KSB7XG4gIHJldHVybiBjb3VudCA8PSAwID8gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIEVNUFRZO1xuICB9IDogb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgc2VlbiA9IDA7XG4gICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICgrK3NlZW4gPD0gY291bnQpIHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgaWYgKGNvdW50IDw9IHNlZW4pIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2lnbm9yZUVsZW1lbnRzLmpzXG5mdW5jdGlvbiBpZ25vcmVFbGVtZW50cygpIHtcbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgbm9vcCkpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tYXBUby5qc1xuZnVuY3Rpb24gbWFwVG8odmFsdWUpIHtcbiAgcmV0dXJuIG1hcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlbGF5V2hlbi5qc1xuZnVuY3Rpb24gZGVsYXlXaGVuKGRlbGF5RHVyYXRpb25TZWxlY3Rvciwgc3Vic2NyaXB0aW9uRGVsYXkpIHtcbiAgaWYgKHN1YnNjcmlwdGlvbkRlbGF5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGNvbmNhdChzdWJzY3JpcHRpb25EZWxheS5waXBlKHRha2UoMSksIGlnbm9yZUVsZW1lbnRzKCkpLCBzb3VyY2UucGlwZShkZWxheVdoZW4oZGVsYXlEdXJhdGlvblNlbGVjdG9yKSkpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIG1lcmdlTWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgIHJldHVybiBpbm5lckZyb20oZGVsYXlEdXJhdGlvblNlbGVjdG9yKHZhbHVlLCBpbmRleCkpLnBpcGUodGFrZSgxKSwgbWFwVG8odmFsdWUpKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVsYXkuanNcbmZ1bmN0aW9uIGRlbGF5KGR1ZSwgc2NoZWR1bGVyKSB7XG4gIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkge1xuICAgIHNjaGVkdWxlciA9IGFzeW5jU2NoZWR1bGVyO1xuICB9XG4gIHZhciBkdXJhdGlvbiA9IHRpbWVyKGR1ZSwgc2NoZWR1bGVyKTtcbiAgcmV0dXJuIGRlbGF5V2hlbihmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rocm93SWZFbXB0eS5qc1xuZnVuY3Rpb24gdGhyb3dJZkVtcHR5KGVycm9yRmFjdG9yeSkge1xuICBpZiAoZXJyb3JGYWN0b3J5ID09PSB2b2lkIDApIHtcbiAgICBlcnJvckZhY3RvcnkgPSBkZWZhdWx0RXJyb3JGYWN0b3J5O1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHZhciBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBoYXNWYWx1ZSA9IHRydWU7XG4gICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGhhc1ZhbHVlID8gc3Vic2NyaWJlci5jb21wbGV0ZSgpIDogc3Vic2NyaWJlci5lcnJvcihlcnJvckZhY3RvcnkoKSk7XG4gICAgfSkpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRFcnJvckZhY3RvcnkoKSB7XG4gIHJldHVybiBuZXcgRW1wdHlFcnJvcigpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpcnN0LmpzXG5mdW5jdGlvbiBmaXJzdChwcmVkaWNhdGUsIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgaGFzRGVmYXVsdFZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+PSAyO1xuICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7XG4gICAgcmV0dXJuIHNvdXJjZS5waXBlKHByZWRpY2F0ZSA/IGZpbHRlcihmdW5jdGlvbih2LCBpKSB7XG4gICAgICByZXR1cm4gcHJlZGljYXRlKHYsIGksIHNvdXJjZSk7XG4gICAgfSkgOiBpZGVudGl0eSwgdGFrZSgxKSwgaGFzRGVmYXVsdFZhbHVlID8gZGVmYXVsdElmRW1wdHkoZGVmYXVsdFZhbHVlKSA6IHRocm93SWZFbXB0eShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgRW1wdHlFcnJvcigpO1xuICAgIH0pKTtcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZVNjYW4uanNcbmZ1bmN0aW9uIG1lcmdlU2NhbihhY2N1bXVsYXRvciwgc2VlZCwgY29uY3VycmVudCkge1xuICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7XG4gICAgY29uY3VycmVudCA9IEluZmluaXR5O1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHZhciBzdGF0ZSA9IHNlZWQ7XG4gICAgcmV0dXJuIG1lcmdlSW50ZXJuYWxzKHNvdXJjZSwgc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3Ioc3RhdGUsIHZhbHVlLCBpbmRleCk7XG4gICAgfSwgY29uY3VycmVudCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHN0YXRlID0gdmFsdWU7XG4gICAgfSwgZmFsc2UsIHZvaWQgMCwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3RhdGUgPSBudWxsO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yYWNlV2l0aC5qc1xuZnVuY3Rpb24gcmFjZVdpdGgoKSB7XG4gIHZhciBvdGhlclNvdXJjZXMgPSBbXTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBvdGhlclNvdXJjZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICByZXR1cm4gIW90aGVyU291cmNlcy5sZW5ndGggPyBpZGVudGl0eSA6IG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgcmFjZUluaXQoX19zcHJlYWRBcnJheShbc291cmNlXSwgX19yZWFkKG90aGVyU291cmNlcykpKShzdWJzY3JpYmVyKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmV0cnkuanNcbmZ1bmN0aW9uIHJldHJ5KGNvbmZpZ09yQ291bnQpIHtcbiAgaWYgKGNvbmZpZ09yQ291bnQgPT09IHZvaWQgMCkge1xuICAgIGNvbmZpZ09yQ291bnQgPSBJbmZpbml0eTtcbiAgfVxuICB2YXIgY29uZmlnMjtcbiAgaWYgKGNvbmZpZ09yQ291bnQgJiYgdHlwZW9mIGNvbmZpZ09yQ291bnQgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25maWcyID0gY29uZmlnT3JDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcyID0ge1xuICAgICAgY291bnQ6IGNvbmZpZ09yQ291bnRcbiAgICB9O1xuICB9XG4gIHZhciBfYSA9IGNvbmZpZzIuY291bnQsIGNvdW50ID0gX2EgPT09IHZvaWQgMCA/IEluZmluaXR5IDogX2EsIGRlbGF5MiA9IGNvbmZpZzIuZGVsYXksIF9iID0gY29uZmlnMi5yZXNldE9uU3VjY2VzcywgcmVzZXRPblN1Y2Nlc3MgPSBfYiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYjtcbiAgcmV0dXJuIGNvdW50IDw9IDAgPyBpZGVudGl0eSA6IG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIHNvRmFyID0gMDtcbiAgICB2YXIgaW5uZXJTdWI7XG4gICAgdmFyIHN1YnNjcmliZUZvclJldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc3luY1Vuc3ViID0gZmFsc2U7XG4gICAgICBpbm5lclN1YiA9IHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmIChyZXNldE9uU3VjY2Vzcykge1xuICAgICAgICAgIHNvRmFyID0gMDtcbiAgICAgICAgfVxuICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgfSwgdm9pZCAwLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKHNvRmFyKysgPCBjb3VudCkge1xuICAgICAgICAgIHZhciByZXN1Yl8xID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoaW5uZXJTdWIpIHtcbiAgICAgICAgICAgICAgaW5uZXJTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgaW5uZXJTdWIgPSBudWxsO1xuICAgICAgICAgICAgICBzdWJzY3JpYmVGb3JSZXRyeSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3luY1Vuc3ViID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChkZWxheTIgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIG5vdGlmaWVyID0gdHlwZW9mIGRlbGF5MiA9PT0gXCJudW1iZXJcIiA/IHRpbWVyKGRlbGF5MikgOiBpbm5lckZyb20oZGVsYXkyKGVyciwgc29GYXIpKTtcbiAgICAgICAgICAgIHZhciBub3RpZmllclN1YnNjcmliZXJfMSA9IGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgbm90aWZpZXJTdWJzY3JpYmVyXzEudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgcmVzdWJfMSgpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbm90aWZpZXIuc3Vic2NyaWJlKG5vdGlmaWVyU3Vic2NyaWJlcl8xKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWJfMSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICAgIGlmIChzeW5jVW5zdWIpIHtcbiAgICAgICAgaW5uZXJTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaW5uZXJTdWIgPSBudWxsO1xuICAgICAgICBzdWJzY3JpYmVGb3JSZXRyeSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgc3Vic2NyaWJlRm9yUmV0cnkoKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3RhcnRXaXRoLmpzXG5mdW5jdGlvbiBzdGFydFdpdGgoKSB7XG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YWx1ZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKHZhbHVlcyk7XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIChzY2hlZHVsZXIgPyBjb25jYXQodmFsdWVzLCBzb3VyY2UsIHNjaGVkdWxlcikgOiBjb25jYXQodmFsdWVzLCBzb3VyY2UpKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaE1hcC5qc1xuZnVuY3Rpb24gc3dpdGNoTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yKSB7XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHZhciBpbm5lclN1YnNjcmliZXIgPSBudWxsO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGlzQ29tcGxldGUgPSBmYWxzZTtcbiAgICB2YXIgY2hlY2tDb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGlzQ29tcGxldGUgJiYgIWlubmVyU3Vic2NyaWJlciAmJiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaW5uZXJTdWJzY3JpYmVyID09PSBudWxsIHx8IGlubmVyU3Vic2NyaWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5uZXJTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB2YXIgaW5uZXJJbmRleCA9IDA7XG4gICAgICB2YXIgb3V0ZXJJbmRleCA9IGluZGV4Kys7XG4gICAgICBpbm5lckZyb20ocHJvamVjdCh2YWx1ZSwgb3V0ZXJJbmRleCkpLnN1YnNjcmliZShpbm5lclN1YnNjcmliZXIgPSBjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oaW5uZXJWYWx1ZSkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5uZXh0KHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0U2VsZWN0b3IodmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgrKykgOiBpbm5lclZhbHVlKTtcbiAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICBpbm5lclN1YnNjcmliZXIgPSBudWxsO1xuICAgICAgICBjaGVja0NvbXBsZXRlKCk7XG4gICAgICB9KSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICBpc0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgIGNoZWNrQ29tcGxldGUoKTtcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rha2VVbnRpbC5qc1xuZnVuY3Rpb24gdGFrZVVudGlsKG5vdGlmaWVyKSB7XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIGlubmVyRnJvbShub3RpZmllcikuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSwgbm9vcCkpO1xuICAgICFzdWJzY3JpYmVyLmNsb3NlZCAmJiBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YXAuanNcbmZ1bmN0aW9uIHRhcChvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gIHZhciB0YXBPYnNlcnZlciA9IGlzRnVuY3Rpb24ob2JzZXJ2ZXJPck5leHQpIHx8IGVycm9yIHx8IGNvbXBsZXRlID8geyBuZXh0OiBvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlIH0gOiBvYnNlcnZlck9yTmV4dDtcbiAgcmV0dXJuIHRhcE9ic2VydmVyID8gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgX2E7XG4gICAgKF9hID0gdGFwT2JzZXJ2ZXIuc3Vic2NyaWJlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0YXBPYnNlcnZlcik7XG4gICAgdmFyIGlzVW5zdWIgPSB0cnVlO1xuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgX2EyO1xuICAgICAgKF9hMiA9IHRhcE9ic2VydmVyLm5leHQpID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmNhbGwodGFwT2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgX2EyO1xuICAgICAgaXNVbnN1YiA9IGZhbHNlO1xuICAgICAgKF9hMiA9IHRhcE9ic2VydmVyLmNvbXBsZXRlKSA9PT0gbnVsbCB8fCBfYTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMi5jYWxsKHRhcE9ic2VydmVyKTtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIHZhciBfYTI7XG4gICAgICBpc1Vuc3ViID0gZmFsc2U7XG4gICAgICAoX2EyID0gdGFwT2JzZXJ2ZXIuZXJyb3IpID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmNhbGwodGFwT2JzZXJ2ZXIsIGVycik7XG4gICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgX2EyLCBfYjtcbiAgICAgIGlmIChpc1Vuc3ViKSB7XG4gICAgICAgIChfYTIgPSB0YXBPYnNlcnZlci51bnN1YnNjcmliZSkgPT09IG51bGwgfHwgX2EyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTIuY2FsbCh0YXBPYnNlcnZlcik7XG4gICAgICB9XG4gICAgICAoX2IgPSB0YXBPYnNlcnZlci5maW5hbGl6ZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwodGFwT2JzZXJ2ZXIpO1xuICAgIH0pKTtcbiAgfSkgOiBpZGVudGl0eTtcbn1cbmV4cG9ydCB7XG4gIEVNUFRZLFxuICBORVZFUixcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgYnVmZmVyQ291bnQsXG4gIGNhdGNoRXJyb3IsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGNvbmNhdCxcbiAgY29uY2F0TWFwLFxuICBkZWJvdW5jZVRpbWUsXG4gIGRlZmF1bHRJZkVtcHR5LFxuICBkZWZlcixcbiAgZGVsYXksXG4gIGRlbGF5V2hlbixcbiAgZmlsdGVyLFxuICBmaXJzdCxcbiAgZmlyc3RWYWx1ZUZyb20sXG4gIGZvcmtKb2luLFxuICBmcm9tLFxuICBmcm9tRXZlbnQsXG4gIGlkZW50aXR5LFxuICBpZ25vcmVFbGVtZW50cyxcbiAgbGFzdFZhbHVlRnJvbSxcbiAgbWFwLFxuICBtZXJnZSxcbiAgbWVyZ2VNYXAsXG4gIG1lcmdlU2NhbixcbiAgbm9vcCxcbiAgb2YsXG4gIHBpcGUsXG4gIHJhY2UsXG4gIHJhY2VXaXRoLFxuICByZXRyeSxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB0aHJvd0lmRW1wdHksXG4gIHRpbWVyLFxuICB6aXBcbn07XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG59O1xuIiwiaW1wb3J0IGNyZWF0ZVdlYlNvY2tldFN0cmVhbSBmcm9tICcuL2xpYi9zdHJlYW0uanMnO1xuaW1wb3J0IFJlY2VpdmVyIGZyb20gJy4vbGliL3JlY2VpdmVyLmpzJztcbmltcG9ydCBTZW5kZXIgZnJvbSAnLi9saWIvc2VuZGVyLmpzJztcbmltcG9ydCBXZWJTb2NrZXQgZnJvbSAnLi9saWIvd2Vic29ja2V0LmpzJztcbmltcG9ydCBXZWJTb2NrZXRTZXJ2ZXIgZnJvbSAnLi9saWIvd2Vic29ja2V0LXNlcnZlci5qcyc7XG5cbmV4cG9ydCB7IGNyZWF0ZVdlYlNvY2tldFN0cmVhbSwgUmVjZWl2ZXIsIFNlbmRlciwgV2ViU29ja2V0LCBXZWJTb2NrZXRTZXJ2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IFdlYlNvY2tldDtcbiIsImxldCBzaGltO1xuY2xhc3MgWTE4TiB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICAvLyBjb25maWd1cmFibGUgb3B0aW9ucy5cbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gb3B0cy5kaXJlY3RvcnkgfHwgJy4vbG9jYWxlcyc7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsZXMgPSB0eXBlb2Ygb3B0cy51cGRhdGVGaWxlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy51cGRhdGVGaWxlcyA6IHRydWU7XG4gICAgICAgIHRoaXMubG9jYWxlID0gb3B0cy5sb2NhbGUgfHwgJ2VuJztcbiAgICAgICAgdGhpcy5mYWxsYmFja1RvTGFuZ3VhZ2UgPSB0eXBlb2Ygb3B0cy5mYWxsYmFja1RvTGFuZ3VhZ2UgPT09ICdib29sZWFuJyA/IG9wdHMuZmFsbGJhY2tUb0xhbmd1YWdlIDogdHJ1ZTtcbiAgICAgICAgLy8gaW50ZXJuYWwgc3R1ZmYuXG4gICAgICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLndyaXRlUXVldWUgPSBbXTtcbiAgICB9XG4gICAgX18oLi4uYXJncykge1xuICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90YWdnZWRMaXRlcmFsKGFyZ3VtZW50c1swXSwgLi4uYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHIgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGxldCBjYiA9IGZ1bmN0aW9uICgpIHsgfTsgLy8gc3RhcnQgd2l0aCBub29wLlxuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiID0gYXJncy5wb3AoKTtcbiAgICAgICAgY2IgPSBjYiB8fCBmdW5jdGlvbiAoKSB7IH07IC8vIG5vb3AuXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICAvLyB3ZSd2ZSBvYnNlcnZlZCBhIG5ldyBzdHJpbmcsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgZmlsZS5cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzdHJdICYmIHRoaXMudXBkYXRlRmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gPSBzdHI7XG4gICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgbG9jYWxlLFxuICAgICAgICAgICAgLy8gc2luY2UgdGhlc2UgdmFsdWVzIGNvdWxkIGNoYW5nZSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyB3cml0ZSBpcyBwZXJmb3JtZWQuXG4gICAgICAgICAgICB0aGlzLl9lbnF1ZXVlV3JpdGUoe1xuICAgICAgICAgICAgICAgIGRpcmVjdG9yeTogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICAgICAgICBjYlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgW3RoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gfHwgc3RyXS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgICBfX24oKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICBjb25zdCBzaW5ndWxhciA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgY29uc3QgcGx1cmFsID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBjb25zdCBxdWFudGl0eSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgbGV0IGNiID0gZnVuY3Rpb24gKCkgeyB9OyAvLyBzdGFydCB3aXRoIG5vb3AuXG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IgPSBhcmdzLnBvcCgpO1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdKVxuICAgICAgICAgICAgdGhpcy5fcmVhZExvY2FsZUZpbGUoKTtcbiAgICAgICAgbGV0IHN0ciA9IHF1YW50aXR5ID09PSAxID8gc2luZ3VsYXIgOiBwbHVyYWw7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdO1xuICAgICAgICAgICAgc3RyID0gZW50cnlbcXVhbnRpdHkgPT09IDEgPyAnb25lJyA6ICdvdGhlciddO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdlJ3ZlIG9ic2VydmVkIGEgbmV3IHN0cmluZywgdXBkYXRlIHRoZSBsYW5ndWFnZSBmaWxlLlxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXSAmJiB0aGlzLnVwZGF0ZUZpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0gPSB7XG4gICAgICAgICAgICAgICAgb25lOiBzaW5ndWxhcixcbiAgICAgICAgICAgICAgICBvdGhlcjogcGx1cmFsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGxvY2FsZSxcbiAgICAgICAgICAgIC8vIHNpbmNlIHRoZXNlIHZhbHVlcyBjb3VsZCBjaGFuZ2UgYmVmb3JlIHRoZVxuICAgICAgICAgICAgLy8gd3JpdGUgaXMgcGVyZm9ybWVkLlxuICAgICAgICAgICAgdGhpcy5fZW5xdWV1ZVdyaXRlKHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuZGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgICAgICAgY2JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhICVkIHBsYWNlaG9sZGVyIGlzIHByb3ZpZGVkLCBhZGQgcXVhbnRpdHlcbiAgICAgICAgLy8gdG8gdGhlIGFyZ3VtZW50cyBleHBhbmRlZCBieSB1dGlsLmZvcm1hdC5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gW3N0cl07XG4gICAgICAgIGlmICh+c3RyLmluZGV4T2YoJyVkJykpXG4gICAgICAgICAgICB2YWx1ZXMucHVzaChxdWFudGl0eSk7XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgdmFsdWVzLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICAgIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgfVxuICAgIGdldExvY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlO1xuICAgIH1cbiAgICB1cGRhdGVMb2NhbGUob2JqKSB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1ba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIF90YWdnZWRMaXRlcmFsKHBhcnRzLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgcGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCwgaSkge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpICsgMV07XG4gICAgICAgICAgICBzdHIgKz0gcGFydDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHN0ciArPSAnJXMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX18uYXBwbHkodGhpcywgW3N0cl0uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJncywgMSkpKTtcbiAgICB9XG4gICAgX2VucXVldWVXcml0ZSh3b3JrKSB7XG4gICAgICAgIHRoaXMud3JpdGVRdWV1ZS5wdXNoKHdvcmspO1xuICAgICAgICBpZiAodGhpcy53cml0ZVF1ZXVlLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NXcml0ZVF1ZXVlKCk7XG4gICAgfVxuICAgIF9wcm9jZXNzV3JpdGVRdWV1ZSgpIHtcbiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xuICAgICAgICBjb25zdCB3b3JrID0gdGhpcy53cml0ZVF1ZXVlWzBdO1xuICAgICAgICAvLyBkZXN0cnVjdHVyZSB0aGUgZW5xdWV1ZWQgd29yay5cbiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gd29yay5kaXJlY3Rvcnk7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9IHdvcmsubG9jYWxlO1xuICAgICAgICBjb25zdCBjYiA9IHdvcmsuY2I7XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHRoaXMuX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZExvY2FsZSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY2FjaGVbbG9jYWxlXSwgbnVsbCwgMik7XG4gICAgICAgIHNoaW0uZnMud3JpdGVGaWxlKGxhbmd1YWdlRmlsZSwgc2VyaWFsaXplZExvY2FsZSwgJ3V0Zi04JywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgX3RoaXMud3JpdGVRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKF90aGlzLndyaXRlUXVldWUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBfdGhpcy5fcHJvY2Vzc1dyaXRlUXVldWUoKTtcbiAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcmVhZExvY2FsZUZpbGUoKSB7XG4gICAgICAgIGxldCBsb2NhbGVMb29rdXAgPSB7fTtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VGaWxlID0gdGhpcy5fcmVzb2x2ZUxvY2FsZUZpbGUodGhpcy5kaXJlY3RvcnksIHRoaXMubG9jYWxlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBidW5kbGVyIHN1Y2ggYXMgd2VicGFjaywgcmVhZEZpbGVTeW5jIG1heSBub3QgYmUgZGVmaW5lZDpcbiAgICAgICAgICAgIGlmIChzaGltLmZzLnJlYWRGaWxlU3luYykge1xuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IEpTT04ucGFyc2Uoc2hpbS5mcy5yZWFkRmlsZVN5bmMobGFuZ3VhZ2VGaWxlLCAndXRmLTgnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSAnc3ludGF4IGVycm9yIGluICcgKyBsYW5ndWFnZUZpbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKVxuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IHt9O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSA9IGxvY2FsZUxvb2t1cDtcbiAgICB9XG4gICAgX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKSB7XG4gICAgICAgIGxldCBmaWxlID0gc2hpbS5yZXNvbHZlKGRpcmVjdG9yeSwgJy4vJywgbG9jYWxlICsgJy5qc29uJyk7XG4gICAgICAgIGlmICh0aGlzLmZhbGxiYWNrVG9MYW5ndWFnZSAmJiAhdGhpcy5fZmlsZUV4aXN0c1N5bmMoZmlsZSkgJiYgfmxvY2FsZS5sYXN0SW5kZXhPZignXycpKSB7XG4gICAgICAgICAgICAvLyBhdHRlbXB0IGZhbGxiYWNrIHRvIGxhbmd1YWdlIG9ubHlcbiAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHNoaW0ucmVzb2x2ZShkaXJlY3RvcnksICcuLycsIGxvY2FsZS5zcGxpdCgnXycpWzBdICsgJy5qc29uJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZmlsZUV4aXN0c1N5bmMobGFuZ3VhZ2VGaWxlKSlcbiAgICAgICAgICAgICAgICBmaWxlID0gbGFuZ3VhZ2VGaWxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cbiAgICBfZmlsZUV4aXN0c1N5bmMoZmlsZSkge1xuICAgICAgICByZXR1cm4gc2hpbS5leGlzdHMoZmlsZSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHkxOG4ob3B0cywgX3NoaW0pIHtcbiAgICBzaGltID0gX3NoaW07XG4gICAgY29uc3QgeTE4biA9IG5ldyBZMThOKG9wdHMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIF9fOiB5MThuLl9fLmJpbmQoeTE4biksXG4gICAgICAgIF9fbjogeTE4bi5fX24uYmluZCh5MThuKSxcbiAgICAgICAgc2V0TG9jYWxlOiB5MThuLnNldExvY2FsZS5iaW5kKHkxOG4pLFxuICAgICAgICBnZXRMb2NhbGU6IHkxOG4uZ2V0TG9jYWxlLmJpbmQoeTE4biksXG4gICAgICAgIHVwZGF0ZUxvY2FsZTogeTE4bi51cGRhdGVMb2NhbGUuYmluZCh5MThuKSxcbiAgICAgICAgbG9jYWxlOiB5MThuLmxvY2FsZVxuICAgIH07XG59XG4iLCJpbXBvcnQgeyByZWFkRmlsZVN5bmMsIHN0YXRTeW5jLCB3cml0ZUZpbGUgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBmczoge1xuICAgICAgICByZWFkRmlsZVN5bmMsXG4gICAgICAgIHdyaXRlRmlsZVxuICAgIH0sXG4gICAgZm9ybWF0LFxuICAgIHJlc29sdmUsXG4gICAgZXhpc3RzOiAoZmlsZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRTeW5jKGZpbGUpLmlzRmlsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCJpbXBvcnQgc2hpbSBmcm9tICcuL2J1aWxkL2xpYi9wbGF0Zm9ybS1zaGltcy9ub2RlLmpzJ1xuaW1wb3J0IHsgeTE4biBhcyBfeTE4biB9IGZyb20gJy4vYnVpbGQvbGliL2luZGV4LmpzJ1xuXG5jb25zdCB5MThuID0gKG9wdHMpID0+IHtcbiAgcmV0dXJuIF95MThuKG9wdHMsIHNoaW0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IHkxOG5cbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBNYWluIGVudHJ5cG9pbnQgZm9yIGxpYnJhcmllcyB1c2luZyB5YXJncy1wYXJzZXIgaW4gTm9kZS5qc1xuICogQ0pTIGFuZCBFU00gZW52aXJvbm1lbnRzLlxuICpcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG52YXIgX2EsIF9iLCBfYztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHsgbm9ybWFsaXplLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjYW1lbENhc2UsIGRlY2FtZWxpemUsIGxvb2tzTGlrZU51bWJlciB9IGZyb20gJy4vc3RyaW5nLXV0aWxzLmpzJztcbmltcG9ydCB7IFlhcmdzUGFyc2VyIH0gZnJvbSAnLi95YXJncy1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJncy95YXJncy1wYXJzZXIjc3VwcG9ydGVkLW5vZGVqcy12ZXJzaW9ucyBmb3Igb3VyXG4vLyB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5LiBUaGUgWUFSR1NfTUlOX05PREVfVkVSU0lPTiBpcyB1c2VkIGZvciB0ZXN0aW5nIG9ubHkuXG5jb25zdCBtaW5Ob2RlVmVyc2lvbiA9IChwcm9jZXNzICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52LllBUkdTX01JTl9OT0RFX1ZFUlNJT04pXG4gICAgPyBOdW1iZXIocHJvY2Vzcy5lbnYuWUFSR1NfTUlOX05PREVfVkVSU0lPTilcbiAgICA6IDEyO1xuY29uc3Qgbm9kZVZlcnNpb24gPSAoX2IgPSAoX2EgPSBwcm9jZXNzID09PSBudWxsIHx8IHByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2Nlc3MudmVyc2lvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub2RlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAoX2MgPSBwcm9jZXNzID09PSBudWxsIHx8IHByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2Nlc3MudmVyc2lvbikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnNsaWNlKDEpO1xuaWYgKG5vZGVWZXJzaW9uKSB7XG4gICAgY29uc3QgbWFqb3IgPSBOdW1iZXIobm9kZVZlcnNpb24ubWF0Y2goL14oW14uXSspLylbMV0pO1xuICAgIGlmIChtYWpvciA8IG1pbk5vZGVWZXJzaW9uKSB7XG4gICAgICAgIHRocm93IEVycm9yKGB5YXJncyBwYXJzZXIgc3VwcG9ydHMgYSBtaW5pbXVtIE5vZGUuanMgdmVyc2lvbiBvZiAke21pbk5vZGVWZXJzaW9ufS4gUmVhZCBvdXIgdmVyc2lvbiBzdXBwb3J0IHBvbGljeTogaHR0cHM6Ly9naXRodWIuY29tL3lhcmdzL3lhcmdzLXBhcnNlciNzdXBwb3J0ZWQtbm9kZWpzLXZlcnNpb25zYCk7XG4gICAgfVxufVxuLy8gQ3JlYXRlcyBhIHlhcmdzLXBhcnNlciBpbnN0YW5jZSB1c2luZyBOb2RlLmpzIHN0YW5kYXJkIGxpYnJhcmllczpcbmNvbnN0IGVudiA9IHByb2Nlc3MgPyBwcm9jZXNzLmVudiA6IHt9O1xuY29uc3QgcGFyc2VyID0gbmV3IFlhcmdzUGFyc2VyKHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkLFxuICAgIGVudjogKCkgPT4ge1xuICAgICAgICByZXR1cm4gZW52O1xuICAgIH0sXG4gICAgZm9ybWF0LFxuICAgIG5vcm1hbGl6ZSxcbiAgICByZXNvbHZlLFxuICAgIC8vIFRPRE86IGZpZ3VyZSAgb3V0IGEgIHdheSB0byBjb21iaW5lIEVTTSBhbmQgQ0pTIGNvdmVyYWdlLCBzdWNoICB0aGF0XG4gICAgLy8gd2UgY2FuIGV4ZXJjaXNlIGFsbCB0aGUgbGluZXMgYmVsb3c6XG4gICAgcmVxdWlyZTogKHBhdGgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF0aC5tYXRjaCgvXFwuanNvbiQvKSkge1xuICAgICAgICAgICAgLy8gQWRkcmVzc2VzOiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3MvaXNzdWVzLzIwNDBcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwYXRoLCAndXRmOCcpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdvbmx5IC5qc29uIGNvbmZpZyBmaWxlcyBhcmUgc3VwcG9ydGVkIGluIEVTTScpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5jb25zdCB5YXJnc1BhcnNlciA9IGZ1bmN0aW9uIFBhcnNlcihhcmdzLCBvcHRzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKGFyZ3Muc2xpY2UoKSwgb3B0cyk7XG4gICAgcmV0dXJuIHJlc3VsdC5hcmd2O1xufTtcbnlhcmdzUGFyc2VyLmRldGFpbGVkID0gZnVuY3Rpb24gKGFyZ3MsIG9wdHMpIHtcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGFyZ3Muc2xpY2UoKSwgb3B0cyk7XG59O1xueWFyZ3NQYXJzZXIuY2FtZWxDYXNlID0gY2FtZWxDYXNlO1xueWFyZ3NQYXJzZXIuZGVjYW1lbGl6ZSA9IGRlY2FtZWxpemU7XG55YXJnc1BhcnNlci5sb29rc0xpa2VOdW1iZXIgPSBsb29rc0xpa2VOdW1iZXI7XG5leHBvcnQgZGVmYXVsdCB5YXJnc1BhcnNlcjtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiwgQ29udHJpYnV0b3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogSVNDXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbENhc2Uoc3RyKSB7XG4gICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGFzIGNhbWVsIGNhc2UsIGUuZy4sIGZvb0Jhci5cbiAgICAvLyBieSBlbnN1cmluZyB0aGF0IHRoZSBzdHJpbmcgaXNuJ3QgYWxyZWFkeSBtaXhlZCBjYXNlOlxuICAgIGNvbnN0IGlzQ2FtZWxDYXNlID0gc3RyICE9PSBzdHIudG9Mb3dlckNhc2UoKSAmJiBzdHIgIT09IHN0ci50b1VwcGVyQ2FzZSgpO1xuICAgIGlmICghaXNDYW1lbENhc2UpIHtcbiAgICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmIChzdHIuaW5kZXhPZignLScpID09PSAtMSAmJiBzdHIuaW5kZXhPZignXycpID09PSAtMSkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNhbWVsY2FzZSA9ICcnO1xuICAgICAgICBsZXQgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdIeXBoZW5zID0gc3RyLm1hdGNoKC9eLSsvKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxlYWRpbmdIeXBoZW5zID8gbGVhZGluZ0h5cGhlbnNbMF0ubGVuZ3RoIDogMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNociA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAobmV4dENoclVwcGVyKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hyID0gY2hyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gMCAmJiAoY2hyID09PSAnLScgfHwgY2hyID09PSAnXycpKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNociAhPT0gJy0nICYmIGNociAhPT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgY2FtZWxjYXNlICs9IGNocjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FtZWxjYXNlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNhbWVsaXplKHN0ciwgam9pblN0cmluZykge1xuICAgIGNvbnN0IGxvd2VyY2FzZSA9IHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIGpvaW5TdHJpbmcgPSBqb2luU3RyaW5nIHx8ICctJztcbiAgICBsZXQgbm90Q2FtZWxjYXNlID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hyTG93ZXIgPSBsb3dlcmNhc2UuY2hhckF0KGkpO1xuICAgICAgICBjb25zdCBjaHJTdHJpbmcgPSBzdHIuY2hhckF0KGkpO1xuICAgICAgICBpZiAoY2hyTG93ZXIgIT09IGNoclN0cmluZyAmJiBpID4gMCkge1xuICAgICAgICAgICAgbm90Q2FtZWxjYXNlICs9IGAke2pvaW5TdHJpbmd9JHtsb3dlcmNhc2UuY2hhckF0KGkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub3RDYW1lbGNhc2UgKz0gY2hyU3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub3RDYW1lbGNhc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gbG9va3NMaWtlTnVtYmVyKHgpIHtcbiAgICBpZiAoeCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBpZiBsb2FkZWQgZnJvbSBjb25maWcsIG1heSBhbHJlYWR5IGJlIGEgbnVtYmVyLlxuICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIGhleGFkZWNpbWFsLlxuICAgIGlmICgvXjB4WzAtOWEtZl0rJC9pLnRlc3QoeCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIGRvbid0IHRyZWF0IDAxMjMgYXMgYSBudW1iZXI7IGFzIGl0IGRyb3BzIHRoZSBsZWFkaW5nICcwJy5cbiAgICBpZiAoL14wW14uXS8udGVzdCh4KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAvXlstXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKGVbLStdP1xcZCspPyQvLnRlc3QoeCk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG4vLyB0YWtlIGFuIHVuLXNwbGl0IGFyZ3Ygc3RyaW5nIGFuZCB0b2tlbml6ZSBpdC5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZUFyZ1N0cmluZyhhcmdTdHJpbmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdTdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBhcmdTdHJpbmcubWFwKGUgPT4gdHlwZW9mIGUgIT09ICdzdHJpbmcnID8gZSArICcnIDogZSk7XG4gICAgfVxuICAgIGFyZ1N0cmluZyA9IGFyZ1N0cmluZy50cmltKCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBwcmV2QyA9IG51bGw7XG4gICAgbGV0IGMgPSBudWxsO1xuICAgIGxldCBvcGVuaW5nID0gbnVsbDtcbiAgICBjb25zdCBhcmdzID0gW107XG4gICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGFyZ1N0cmluZy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgcHJldkMgPSBjO1xuICAgICAgICBjID0gYXJnU3RyaW5nLmNoYXJBdChpaSk7XG4gICAgICAgIC8vIHNwbGl0IG9uIHNwYWNlcyB1bmxlc3Mgd2UncmUgaW4gcXVvdGVzLlxuICAgICAgICBpZiAoYyA9PT0gJyAnICYmICFvcGVuaW5nKSB7XG4gICAgICAgICAgICBpZiAoIShwcmV2QyA9PT0gJyAnKSkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRvbid0IHNwbGl0IHRoZSBzdHJpbmcgaWYgd2UncmUgaW4gbWF0Y2hpbmdcbiAgICAgICAgLy8gb3BlbmluZyBvciBjbG9zaW5nIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlcy5cbiAgICAgICAgaWYgKGMgPT09IG9wZW5pbmcpIHtcbiAgICAgICAgICAgIG9wZW5pbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjID09PSBcIidcIiB8fCBjID09PSAnXCInKSAmJiAhb3BlbmluZykge1xuICAgICAgICAgICAgb3BlbmluZyA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmdzW2ldKVxuICAgICAgICAgICAgYXJnc1tpXSA9ICcnO1xuICAgICAgICBhcmdzW2ldICs9IGM7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xuZXhwb3J0IHZhciBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleTtcbihmdW5jdGlvbiAoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkpIHtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIkJPT0xFQU5cIl0gPSBcImJvb2xlYW5cIjtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIlNUUklOR1wiXSA9IFwic3RyaW5nXCI7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJOVU1CRVJcIl0gPSBcIm51bWJlclwiO1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiQVJSQVlcIl0gPSBcImFycmF5XCI7XG59KShEZWZhdWx0VmFsdWVzRm9yVHlwZUtleSB8fCAoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgPSB7fSkpO1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xuaW1wb3J0IHsgdG9rZW5pemVBcmdTdHJpbmcgfSBmcm9tICcuL3Rva2VuaXplLWFyZy1zdHJpbmcuanMnO1xuaW1wb3J0IHsgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgfSBmcm9tICcuL3lhcmdzLXBhcnNlci10eXBlcy5qcyc7XG5pbXBvcnQgeyBjYW1lbENhc2UsIGRlY2FtZWxpemUsIGxvb2tzTGlrZU51bWJlciB9IGZyb20gJy4vc3RyaW5nLXV0aWxzLmpzJztcbmxldCBtaXhpbjtcbmV4cG9ydCBjbGFzcyBZYXJnc1BhcnNlciB7XG4gICAgY29uc3RydWN0b3IoX21peGluKSB7XG4gICAgICAgIG1peGluID0gX21peGluO1xuICAgIH1cbiAgICBwYXJzZShhcmdzSW5wdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgYWxpYXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFycmF5OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib29sZWFuOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZ09iamVjdHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvZXJjZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY291bnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVudlByZWZpeDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbmFyZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbm9ybWFsaXplOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdHJpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG51bWJlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgX186IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGtleTogdW5kZWZpbmVkXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgICAvLyBhbGxvdyBhIHN0cmluZyBhcmd1bWVudCB0byBiZSBwYXNzZWQgaW4gcmF0aGVyXG4gICAgICAgIC8vIHRoYW4gYW4gYXJndiBhcnJheS5cbiAgICAgICAgY29uc3QgYXJncyA9IHRva2VuaXplQXJnU3RyaW5nKGFyZ3NJbnB1dCk7XG4gICAgICAgIC8vIHRva2VuaXplQXJnU3RyaW5nIGFkZHMgZXh0cmEgcXVvdGVzIHRvIGFyZ3MgaWYgYXJnc0lucHV0IGlzIGEgc3RyaW5nXG4gICAgICAgIC8vIG9ubHkgc3RyaXAgdGhvc2UgZXh0cmEgcXVvdGVzIGluIHByb2Nlc3NWYWx1ZSBpZiBhcmdzSW5wdXQgaXMgYSBzdHJpbmdcbiAgICAgICAgY29uc3QgaW5wdXRJc1N0cmluZyA9IHR5cGVvZiBhcmdzSW5wdXQgPT09ICdzdHJpbmcnO1xuICAgICAgICAvLyBhbGlhc2VzIG1pZ2h0IGhhdmUgdHJhbnNpdGl2ZSByZWxhdGlvbnNoaXBzLCBub3JtYWxpemUgdGhpcy5cbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IGNvbWJpbmVBbGlhc2VzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5hbGlhcykpO1xuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAnYm9vbGVhbi1uZWdhdGlvbic6IHRydWUsXG4gICAgICAgICAgICAnY2FtZWwtY2FzZS1leHBhbnNpb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2NvbWJpbmUtYXJyYXlzJzogZmFsc2UsXG4gICAgICAgICAgICAnZG90LW5vdGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgICAgICdkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5JzogdHJ1ZSxcbiAgICAgICAgICAgICdmbGF0dGVuLWR1cGxpY2F0ZS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2dyZWVkeS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2hhbHQtYXQtbm9uLW9wdGlvbic6IGZhbHNlLFxuICAgICAgICAgICAgJ25hcmdzLWVhdHMtb3B0aW9ucyc6IGZhbHNlLFxuICAgICAgICAgICAgJ25lZ2F0aW9uLXByZWZpeCc6ICduby0nLFxuICAgICAgICAgICAgJ3BhcnNlLW51bWJlcnMnOiB0cnVlLFxuICAgICAgICAgICAgJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyc6IHRydWUsXG4gICAgICAgICAgICAncG9wdWxhdGUtLSc6IGZhbHNlLFxuICAgICAgICAgICAgJ3NldC1wbGFjZWhvbGRlci1rZXknOiBmYWxzZSxcbiAgICAgICAgICAgICdzaG9ydC1vcHRpb24tZ3JvdXBzJzogdHJ1ZSxcbiAgICAgICAgICAgICdzdHJpcC1hbGlhc2VkJzogZmFsc2UsXG4gICAgICAgICAgICAnc3RyaXAtZGFzaGVkJzogZmFsc2UsXG4gICAgICAgICAgICAndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnOiBmYWxzZVxuICAgICAgICB9LCBvcHRzLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5kZWZhdWx0KTtcbiAgICAgICAgY29uc3QgY29uZmlnT2JqZWN0cyA9IG9wdHMuY29uZmlnT2JqZWN0cyB8fCBbXTtcbiAgICAgICAgY29uc3QgZW52UHJlZml4ID0gb3B0cy5lbnZQcmVmaXg7XG4gICAgICAgIGNvbnN0IG5vdEZsYWdzT3B0aW9uID0gY29uZmlndXJhdGlvblsncG9wdWxhdGUtLSddO1xuICAgICAgICBjb25zdCBub3RGbGFnc0FyZ3YgPSBub3RGbGFnc09wdGlvbiA/ICctLScgOiAnXyc7XG4gICAgICAgIGNvbnN0IG5ld0FsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBkZWZhdWx0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyBhbGxvdyBhIGkxOG4gaGFuZGxlciB0byBiZSBwYXNzZWQgaW4sIGRlZmF1bHQgdG8gYSBmYWtlIG9uZSAodXRpbC5mb3JtYXQpLlxuICAgICAgICBjb25zdCBfXyA9IG9wdHMuX18gfHwgbWl4aW4uZm9ybWF0O1xuICAgICAgICBjb25zdCBmbGFncyA9IHtcbiAgICAgICAgICAgIGFsaWFzZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBhcnJheXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBib29sczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIHN0cmluZ3M6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBudW1iZXJzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY291bnRzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgbm9ybWFsaXplOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29uZmlnczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG5hcmdzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29lcmNpb25zOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAga2V5czogW11cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmUgPSAvXi0oWzAtOV0rKFxcLlswLTldKyk/fFxcLlswLTldKykkLztcbiAgICAgICAgY29uc3QgbmVnYXRlZEJvb2xlYW4gPSBuZXcgUmVnRXhwKCdeLS0nICsgY29uZmlndXJhdGlvblsnbmVnYXRpb24tcHJlZml4J10gKyAnKC4rKScpO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5hcnJheSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdHlwZW9mIG9wdCA9PT0gJ29iamVjdCcgPyBvcHQua2V5IDogb3B0O1xuICAgICAgICAgICAgLy8gYXNzaWduIHRvIGZsYWdzW2Jvb2xzfHN0cmluZ3N8bnVtYmVyc11cbiAgICAgICAgICAgIGNvbnN0IGFzc2lnbm1lbnQgPSBPYmplY3Qua2V5cyhvcHQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlGbGFnS2V5cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbjogJ2Jvb2xzJyxcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nOiAnc3RyaW5ncycsXG4gICAgICAgICAgICAgICAgICAgIG51bWJlcjogJ251bWJlcnMnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlGbGFnS2V5c1trZXldO1xuICAgICAgICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pLnBvcCgpO1xuICAgICAgICAgICAgLy8gYXNzaWduIGtleSB0byBiZSBjb2VyY2VkXG4gICAgICAgICAgICBpZiAoYXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZsYWdzW2Fzc2lnbm1lbnRdW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmxhZ3MuYXJyYXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5ib29sZWFuIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5ib29sc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMuc3RyaW5nIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5zdHJpbmdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5udW1iZXIgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLm51bWJlcnNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmNvdW50IHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5jb3VudHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLm5vcm1hbGl6ZSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZmxhZ3Mubm9ybWFsaXplW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubmFyZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMubmFyZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MubmFyZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY29lcmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb2VyY2UpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29lcmNpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmNvbmZpZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMuY29uZmlnKSB8fCB0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIFtdLmNvbmNhdChvcHRzLmNvbmZpZykuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5jb25maWdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdHMuY29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMuY29uZmlnKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29uZmlnc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgdGFibGUgdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgYWxsXG4gICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBhbGlhc2VzOiB7ZjogWydmb28nXSwgZm9vOiBbJ2YnXX1cbiAgICAgICAgZXh0ZW5kQWxpYXNlcyhvcHRzLmtleSwgYWxpYXNlcywgb3B0cy5kZWZhdWx0LCBmbGFncy5hcnJheXMpO1xuICAgICAgICAvLyBhcHBseSBkZWZhdWx0IHZhbHVlcyB0byBhbGwgYWxpYXNlcy5cbiAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgKGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1thbGlhc10gPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgbGV0IG5vdEZsYWdzID0gW107XG4gICAgICAgIGNvbnN0IGFyZ3YgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHsgXzogW10gfSk7XG4gICAgICAgIC8vIFRPRE8oYmNvZSk6IGZvciB0aGUgZmlyc3QgcGFzcyBhdCByZW1vdmluZyBvYmplY3QgcHJvdG90eXBlICB3ZSBkaWRuJ3RcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBwcm90b3R5cGVzIGZyb20gb2JqZWN0cyByZXR1cm5lZCBieSB0aGlzIEFQSSwgd2UgbWlnaHQgd2FudFxuICAgICAgICAvLyB0byBncmFkdWFsbHkgbW92ZSB0b3dhcmRzIGRvaW5nIHNvLlxuICAgICAgICBjb25zdCBhcmd2UmV0dXJuID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHRydW5jYXRlZEFyZyA9IGFyZy5yZXBsYWNlKC9eLXszLH0vLCAnLS0tJyk7XG4gICAgICAgICAgICBsZXQgYnJva2VuO1xuICAgICAgICAgICAgbGV0IGtleTtcbiAgICAgICAgICAgIGxldCBsZXR0ZXJzO1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgIC8vIGFueSB1bmtub3duIG9wdGlvbiAoZXhjZXB0IGZvciBlbmQtb2Ytb3B0aW9ucywgXCItLVwiKVxuICAgICAgICAgICAgaWYgKGFyZyAhPT0gJy0tJyAmJiAvXi0vLnRlc3QoYXJnKSAmJiBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgICAgICAvLyAtLS0sIC0tLT0sIC0tLS0sIGV0YyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRydW5jYXRlZEFyZy5tYXRjaCgvXi0tLSsoPXwkKS8pKSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW9ucyB3aXRob3V0IGtleSBuYW1lIGFyZSBpbnZhbGlkLlxuICAgICAgICAgICAgICAgIHB1c2hQb3NpdGlvbmFsKGFyZyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gLS0gc2VwYXJhdGVkIGJ5ID1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLis9LykgfHwgKCFjb25maWd1cmF0aW9uWydzaG9ydC1vcHRpb24tZ3JvdXBzJ10gJiYgYXJnLm1hdGNoKC9eLS4rPS8pKSkge1xuICAgICAgICAgICAgICAgIC8vIFVzaW5nIFtcXHNcXFNdIGluc3RlYWQgb2YgLiBiZWNhdXNlIGpzIGRvZXNuJ3Qgc3VwcG9ydCB0aGVcbiAgICAgICAgICAgICAgICAvLyAnZG90YWxsJyByZWdleCBtb2RpZmllci4gU2VlOlxuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEwNjgzMDgvMTMyMTZcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLS0/KFtePV0rKT0oW1xcc1xcU10qKSQvKTtcbiAgICAgICAgICAgICAgICAvLyBhcnJheXMgZm9ybWF0ID0gJy0tZj1hIGIgYydcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhtWzFdLCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwgbVsxXSwgYXJncywgbVsyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKG1bMV0sIGZsYWdzLm5hcmdzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hcmdzIGZvcm1hdCA9ICctLWY9bW9ua2V5IHdhc2hpbmcgY2F0J1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIG1bMV0sIGFyZ3MsIG1bMl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKSAmJiBjb25maWd1cmF0aW9uWydib29sZWFuLW5lZ2F0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSA/IFtmYWxzZV0gOiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIC0tIHNlcGFyYXRlZCBieSBzcGFjZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLisvKSB8fCAoIWNvbmZpZ3VyYXRpb25bJ3Nob3J0LW9wdGlvbi1ncm91cHMnXSAmJiBhcmcubWF0Y2goL14tW14tXSsvKSkpIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLS0/KC4rKS8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBtWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy0tZm9vIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy0tZm9vIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRydXRoeSBldmVuIGlmOiBmbGFncy5uYXJnc1trZXldID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCFuZXh0Lm1hdGNoKC9eLS8pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRvdC1ub3RhdGlvbiBmbGFnIHNlcGFyYXRlZCBieSAnPScuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2goL14tLlxcLi4rPS8pKSB7XG4gICAgICAgICAgICAgICAgbSA9IGFyZy5tYXRjaCgvXi0oW149XSspPShbXFxzXFxTXSopJC8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBzZXRBcmcobVsxXSwgbVsyXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRvdC1ub3RhdGlvbiBmbGFnIHNlcGFyYXRlZCBieSBzcGFjZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0uXFwuLisvKSAmJiAhYXJnLm1hdGNoKG5lZ2F0aXZlKSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLSguXFwuLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgIW5leHQubWF0Y2goL14tLykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi1bXi1dKy8pICYmICFhcmcubWF0Y2gobmVnYXRpdmUpKSB7XG4gICAgICAgICAgICAgICAgbGV0dGVycyA9IGFyZy5zbGljZSgxLCAtMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgICAgIGJyb2tlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnLnNsaWNlKGogKyAyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnLnNsaWNlKGogKyAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGxldHRlcnNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGZvcm1hdCA9ICctZj1hIGIgYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy1mPW1vbmtleSB3YXNoaW5nIGNhdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBsZXR0ZXIgaXMgYW4gYWxwaGFiZXRpYyBjaGFyYWN0ZXIgYW5kIG5leHQgdmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgL14tP1xcZCsoXFwuXFxkKik/KGUtP1xcZCspPyQvLnRlc3QobmV4dCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhuZXh0LCBmbGFncy5ib29scykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIGRlZmF1bHRWYWx1ZShsZXR0ZXJzW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga2V5ID0gYXJnLnNsaWNlKC0xKVswXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJyb2tlbiAmJiBrZXkgIT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy1mIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy1mIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRydXRoeSBldmVuIGlmOiBmbGFncy5uYXJnc1trZXldID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCEvXigtfC0tKVteLV0vLnRlc3QobmV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Lm1hdGNoKG5lZ2F0aXZlKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgvXih0cnVlfGZhbHNlKSQvLnRlc3QobmV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2goL14tWzAtOV0kLykgJiZcbiAgICAgICAgICAgICAgICBhcmcubWF0Y2gobmVnYXRpdmUpICYmXG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGFyZy5zbGljZSgxKSwgZmxhZ3MuYm9vbHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gc2luZ2xlLWRpZ2l0IGJvb2xlYW4gYWxpYXMsIGUuZzogeGFyZ3MgLTBcbiAgICAgICAgICAgICAgICBrZXkgPSBhcmcuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICAgICAgICAgICAgbm90RmxhZ3MgPSBhcmdzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmZpZ3VyYXRpb25bJ2hhbHQtYXQtbm9uLW9wdGlvbiddKSB7XG4gICAgICAgICAgICAgICAgbm90RmxhZ3MgPSBhcmdzLnNsaWNlKGkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBvcmRlciBvZiBwcmVjZWRlbmNlOlxuICAgICAgICAvLyAxLiBjb21tYW5kIGxpbmUgYXJnXG4gICAgICAgIC8vIDIuIHZhbHVlIGZyb20gZW52IHZhclxuICAgICAgICAvLyAzLiB2YWx1ZSBmcm9tIGNvbmZpZyBmaWxlXG4gICAgICAgIC8vIDQuIHZhbHVlIGZyb20gY29uZmlnIG9iamVjdHNcbiAgICAgICAgLy8gNS4gY29uZmlndXJlZCBkZWZhdWx0IHZhbHVlXG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCB0cnVlKTsgLy8gc3BlY2lhbCBjYXNlOiBjaGVjayBlbnYgdmFycyB0aGF0IHBvaW50IHRvIGNvbmZpZyBmaWxlXG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCBmYWxzZSk7XG4gICAgICAgIHNldENvbmZpZyhhcmd2KTtcbiAgICAgICAgc2V0Q29uZmlnT2JqZWN0cygpO1xuICAgICAgICBhcHBseURlZmF1bHRzQW5kQWxpYXNlcyhhcmd2LCBmbGFncy5hbGlhc2VzLCBkZWZhdWx0cywgdHJ1ZSk7XG4gICAgICAgIGFwcGx5Q29lcmNpb25zKGFyZ3YpO1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnc2V0LXBsYWNlaG9sZGVyLWtleSddKVxuICAgICAgICAgICAgc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpO1xuICAgICAgICAvLyBmb3IgYW55IGNvdW50cyBlaXRoZXIgbm90IGluIGFyZ3Mgb3Igd2l0aG91dCBhbiBleHBsaWNpdCBkZWZhdWx0LCBzZXQgdG8gMFxuICAgICAgICBPYmplY3Qua2V5cyhmbGFncy5jb3VudHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwga2V5LnNwbGl0KCcuJykpKVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gJy0tJyBkZWZhdWx0cyB0byB1bmRlZmluZWQuXG4gICAgICAgIGlmIChub3RGbGFnc09wdGlvbiAmJiBub3RGbGFncy5sZW5ndGgpXG4gICAgICAgICAgICBhcmd2W25vdEZsYWdzQXJndl0gPSBbXTtcbiAgICAgICAgbm90RmxhZ3MuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBhcmd2W25vdEZsYWdzQXJndl0ucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10gJiYgY29uZmlndXJhdGlvblsnc3RyaXAtZGFzaGVkJ10pIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZpbHRlcihrZXkgPT4ga2V5ICE9PSAnLS0nICYmIGtleS5pbmNsdWRlcygnLScpKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3Zba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydzdHJpcC1hbGlhc2VkJ10pIHtcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIFtdLmNvbmNhdCguLi5PYmplY3Qua2V5cyhhbGlhc2VzKS5tYXAoayA9PiBhbGlhc2VzW2tdKSkuZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10gJiYgYWxpYXMuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgYXJndlthbGlhcy5zcGxpdCgnLicpLm1hcChwcm9wID0+IGNhbWVsQ2FzZShwcm9wKSkuam9pbignLicpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3ZbYWxpYXNdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHVzaCBhcmd1bWVudCBpbnRvIHBvc2l0aW9uYWwgYXJyYXksIGFwcGx5aW5nIG51bWVyaWMgY29lcmNpb246XG4gICAgICAgIGZ1bmN0aW9uIHB1c2hQb3NpdGlvbmFsKGFyZykge1xuICAgICAgICAgICAgY29uc3QgbWF5YmVDb2VyY2VkTnVtYmVyID0gbWF5YmVDb2VyY2VOdW1iZXIoJ18nLCBhcmcpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgYXJndi5fLnB1c2gobWF5YmVDb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBob3cgbWFueSBhcmd1bWVudHMgc2hvdWxkIHdlIGNvbnN1bWUsIGJhc2VkXG4gICAgICAgIC8vIG9uIHRoZSBuYXJncyBvcHRpb24/XG4gICAgICAgIGZ1bmN0aW9uIGVhdE5hcmdzKGksIGtleSwgYXJncywgYXJnQWZ0ZXJFcXVhbFNpZ24pIHtcbiAgICAgICAgICAgIGxldCBpaTtcbiAgICAgICAgICAgIGxldCB0b0VhdCA9IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKTtcbiAgICAgICAgICAgIC8vIE5hTiBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgZm9yIHRoZSBhcnJheSB0eXBlLCBpbmRpY2F0aW5nIHRoYXQgb25lIG9yXG4gICAgICAgICAgICAvLyBtb3JlIHZhbHVlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICAgICAgICB0b0VhdCA9IHR5cGVvZiB0b0VhdCAhPT0gJ251bWJlcicgfHwgaXNOYU4odG9FYXQpID8gMSA6IHRvRWF0O1xuICAgICAgICAgICAgaWYgKHRvRWF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnQXJndW1lbnQgdW5leHBlY3RlZCBmb3I6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhdmFpbGFibGUgPSBpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgPyAwIDogMTtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWyduYXJncy1lYXRzLW9wdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgIC8vIGNsYXNzaWMgYmVoYXZpb3IsIHlhcmdzIGVhdHMgcG9zaXRpb25hbCBhbmQgZGFzaCBhcmd1bWVudHMuXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIC0gKGkgKyAxKSArIGF2YWlsYWJsZSA8IHRvRWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gdG9FYXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBuYXJncyB3aWxsIG5vdCBjb25zdW1lIGZsYWcgYXJndW1lbnRzLCBlLmcuLCAtYWJjLCAtLWZvbyxcbiAgICAgICAgICAgICAgICAvLyBhbmQgdGVybWluYXRlcyB3aGVuIG9uZSBpcyBvYnNlcnZlZC5cbiAgICAgICAgICAgICAgICBmb3IgKGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmdzW2lpXS5tYXRjaCgvXi1bXjAtOV0vKSB8fCBhcmdzW2lpXS5tYXRjaChuZWdhdGl2ZSkgfHwgaXNVbmtub3duT3B0aW9uQXNBcmcoYXJnc1tpaV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlKys7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlIDwgdG9FYXQpXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb25zdW1lZCA9IE1hdGgubWluKGF2YWlsYWJsZSwgdG9FYXQpO1xuICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgJiYgY29uc3VtZWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnQWZ0ZXJFcXVhbFNpZ24pO1xuICAgICAgICAgICAgICAgIGNvbnN1bWVkLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGlpID0gaSArIDE7IGlpIDwgKGNvbnN1bWVkICsgaSArIDEpOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnc1tpaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChpICsgY29uc3VtZWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFuIG9wdGlvbiBpcyBhbiBhcnJheSwgZWF0IGFsbCBub24taHlwaGVuYXRlZCBhcmd1bWVudHNcbiAgICAgICAgLy8gZm9sbG93aW5nIGl0Li4uIFlVTSFcbiAgICAgICAgLy8gZS5nLiwgLS1mb28gYXBwbGUgYmFuYW5hIGNhdCBiZWNvbWVzIFtcImFwcGxlXCIsIFwiYmFuYW5hXCIsIFwiY2F0XCJdXG4gICAgICAgIGZ1bmN0aW9uIGVhdEFycmF5KGksIGtleSwgYXJncywgYXJnQWZ0ZXJFcXVhbFNpZ24pIHtcbiAgICAgICAgICAgIGxldCBhcmdzVG9TZXQgPSBbXTtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gYXJnQWZ0ZXJFcXVhbFNpZ24gfHwgYXJnc1tpICsgMV07XG4gICAgICAgICAgICAvLyBJZiBib3RoIGFycmF5IGFuZCBuYXJncyBhcmUgY29uZmlndXJlZCwgZW5mb3JjZSB0aGUgbmFyZ3MgY291bnQ6XG4gICAgICAgICAgICBjb25zdCBuYXJnc0NvdW50ID0gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJiAhKC9eKHRydWV8ZmFsc2UpJC8udGVzdChuZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBhcmdzVG9TZXQucHVzaCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzVW5kZWZpbmVkKG5leHQpIHx8XG4gICAgICAgICAgICAgICAgKGlzVW5kZWZpbmVkKGFyZ0FmdGVyRXF1YWxTaWduKSAmJiAvXi0vLnRlc3QobmV4dCkgJiYgIW5lZ2F0aXZlLnRlc3QobmV4dCkgJiYgIWlzVW5rbm93bk9wdGlvbkFzQXJnKG5leHQpKSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBrZXlzIHdpdGhvdXQgdmFsdWUgPT0+IGFyZ3NUb1NldCByZW1haW5zIGFuIGVtcHR5IFtdXG4gICAgICAgICAgICAgICAgLy8gc2V0IHVzZXIgZGVmYXVsdCB2YWx1ZSwgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZWYWwgPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgICAgICAgICBhcmdzVG9TZXQgPSBBcnJheS5pc0FycmF5KGRlZlZhbCkgPyBkZWZWYWwgOiBbZGVmVmFsXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpbiAtLW9wdGlvbj12YWx1ZSBpcyBlYXRlbiBhcyBpc1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIGFyZ0FmdGVyRXF1YWxTaWduLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghY29uZmlndXJhdGlvblsnZ3JlZWR5LWFycmF5cyddICYmIGFyZ3NUb1NldC5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKG5hcmdzQ291bnQgJiYgdHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmIGFyZ3NUb1NldC5sZW5ndGggPj0gbmFyZ3NDb3VudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaWldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpID0gaWk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIG5leHQsIGlucHV0SXNTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBib3RoIGFycmF5IGFuZCBuYXJncyBhcmUgY29uZmlndXJlZCwgY3JlYXRlIGFuIGVycm9yIGlmIGxlc3MgdGhhblxuICAgICAgICAgICAgLy8gbmFyZ3MgcG9zaXRpb25hbHMgd2VyZSBmb3VuZC4gTmFOIGhhcyBzcGVjaWFsIG1lYW5pbmcsIGluZGljYXRpbmdcbiAgICAgICAgICAgIC8vIHRoYXQgYXQgbGVhc3Qgb25lIHZhbHVlIGlzIHJlcXVpcmVkIChtb3JlIGFyZSBva2F5KS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFyZ3NDb3VudCA9PT0gJ251bWJlcicgJiYgKChuYXJnc0NvdW50ICYmIGFyZ3NUb1NldC5sZW5ndGggPCBuYXJnc0NvdW50KSB8fFxuICAgICAgICAgICAgICAgIChpc05hTihuYXJnc0NvdW50KSAmJiBhcmdzVG9TZXQubGVuZ3RoID09PSAwKSkpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRBcmcoa2V5LCBhcmdzVG9TZXQpO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0QXJnKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3RlcyA9IGlucHV0SXNTdHJpbmcpIHtcbiAgICAgICAgICAgIGlmICgvLS8udGVzdChrZXkpICYmIGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGlhcyA9IGtleS5zcGxpdCgnLicpLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtZWxDYXNlKHByb3ApO1xuICAgICAgICAgICAgICAgIH0pLmpvaW4oJy4nKTtcbiAgICAgICAgICAgICAgICBhZGROZXdBbGlhcyhrZXksIGFsaWFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvY2Vzc1ZhbHVlKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3Rlcyk7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEtleSA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIHNwbGl0S2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAvLyBoYW5kbGUgcG9wdWxhdGluZyBhbGlhc2VzIG9mIHRoZSBmdWxsIGtleVxuICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBoYW5kbGUgcG9wdWxhdGluZyBhbGlhc2VzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBkb3Qtbm90YXRpb24ga2V5XG4gICAgICAgICAgICBpZiAoc3BsaXRLZXkubGVuZ3RoID4gMSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAoZmxhZ3MuYWxpYXNlc1tzcGxpdEtleVswXV0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cGFuZCBhbGlhcyB3aXRoIG5lc3RlZCBvYmplY3RzIGluIGtleVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0gW10uY29uY2F0KHNwbGl0S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgYS5zaGlmdCgpOyAvLyBudWtlIHRoZSBvbGQga2V5LlxuICAgICAgICAgICAgICAgICAgICBrZXlQcm9wZXJ0aWVzID0ga2V5UHJvcGVydGllcy5jb25jYXQoYSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBvcHVsYXRlIGFsaWFzIG9ubHkgaWYgaXMgbm90IGFscmVhZHkgYW4gYWxpYXMgb2YgdGhlIGZ1bGwga2V5XG4gICAgICAgICAgICAgICAgICAgIC8vIChhbHJlYWR5IHBvcHVsYXRlZCBhYm92ZSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKS5pbmNsdWRlcyhrZXlQcm9wZXJ0aWVzLmpvaW4oJy4nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCBub3JtYWxpemUgZ2V0dGVyIGFuZCBzZXR0ZXIgd2hlbiBrZXkgaXMgaW4gJ25vcm1hbGl6ZScgYnV0IGlzbid0IGFuIGFycmF5XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Mubm9ybWFsaXplKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBba2V5XS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKTtcbiAgICAgICAgICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJndlJldHVybiwga2V5LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG1peGluLm5vcm1hbGl6ZSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYWRkTmV3QWxpYXMoa2V5LCBhbGlhcykge1xuICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1trZXldICYmIGZsYWdzLmFsaWFzZXNba2V5XS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldID0gW2FsaWFzXTtcbiAgICAgICAgICAgICAgICBuZXdBbGlhc2VzW2FsaWFzXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2FsaWFzXSAmJiBmbGFncy5hbGlhc2VzW2FsaWFzXS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgYWRkTmV3QWxpYXMoYWxpYXMsIGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc1ZhbHVlKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3Rlcykge1xuICAgICAgICAgICAgLy8gc3RyaW5ncyBtYXkgYmUgcXVvdGVkLCBjbGVhbiB0aGlzIHVwIGFzIHdlIGFzc2lnbiB2YWx1ZXMuXG4gICAgICAgICAgICBpZiAoc2hvdWxkU3RyaXBRdW90ZXMpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBzdHJpcFF1b3Rlcyh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaGFuZGxlIHBhcnNpbmcgYm9vbGVhbiBhcmd1bWVudHMgLS1mb289dHJ1ZSAtLWJhciBmYWxzZS5cbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgfHwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsID09PSAndHJ1ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbClcbiAgICAgICAgICAgICAgICA/IHZhbC5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdik7IH0pXG4gICAgICAgICAgICAgICAgOiBtYXliZUNvZXJjZU51bWJlcihrZXksIHZhbCk7XG4gICAgICAgICAgICAvLyBpbmNyZW1lbnQgYSBjb3VudCBnaXZlbiBhcyBhcmcgKGVpdGhlciBubyB2YWx1ZSBvciB2YWx1ZSBwYXJzZWQgYXMgYm9vbGVhbilcbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpICYmIChpc1VuZGVmaW5lZCh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBpbmNyZW1lbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCBub3JtYWxpemVkIHZhbHVlIHdoZW4ga2V5IGlzIGluICdub3JtYWxpemUnIGFuZCBpbiAnYXJyYXlzJ1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsLm1hcCgodmFsKSA9PiB7IHJldHVybiBtaXhpbi5ub3JtYWxpemUodmFsKTsgfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1peGluLm5vcm1hbGl6ZSh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJ10gJiYga2V5ID09PSAnXycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5zdHJpbmdzKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZENvZXJjZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcih2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsncGFyc2UtbnVtYmVycyddICYmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dmFsdWV9YCkpKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENvZXJjZU51bWJlciB8fCAoIWlzVW5kZWZpbmVkKHZhbHVlKSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgYXJncyBmcm9tIGNvbmZpZy5qc29uIGZpbGUsIHRoaXMgc2hvdWxkIGJlXG4gICAgICAgIC8vIGFwcGxpZWQgbGFzdCBzbyB0aGF0IGRlZmF1bHRzIGNhbiBiZSBhcHBsaWVkLlxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWcoYXJndikge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIC8vIGV4cGFuZCBkZWZhdWx0cy9hbGlhc2VzLCBpbi1jYXNlIGFueSBoYXBwZW4gdG8gcmVmZXJlbmNlXG4gICAgICAgICAgICAvLyB0aGUgY29uZmlnLmpzb24gZmlsZS5cbiAgICAgICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGNvbmZpZ0xvb2t1cCwgZmxhZ3MuYWxpYXNlcywgZGVmYXVsdHMpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmxhZ3MuY29uZmlncykuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGFyZ3ZbY29uZmlnS2V5XSB8fCBjb25maWdMb29rdXBbY29uZmlnS2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbmZpZ1BhdGggPSBtaXhpbi5yZXNvbHZlKG1peGluLmN3ZCgpLCBjb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVDb25maWcgPSBmbGFncy5jb25maWdzW2NvbmZpZ0tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSByZXNvbHZlQ29uZmlnKHJlc29sdmVkQ29uZmlnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1peGluLnJlcXVpcmUocmVzb2x2ZWRDb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVubyB3aWxsIHJlY2VpdmUgYSBQZXJtaXNzaW9uRGVuaWVkIGVycm9yIGlmIGFuIGF0dGVtcHQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hZGUgdG8gbG9hZCBjb25maWcgd2l0aG91dCB0aGUgLS1hbGxvdy1yZWFkIGZsYWc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXgubmFtZSA9PT0gJ1Blcm1pc3Npb25EZW5pZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmd2W2NvbmZpZ0tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnSW52YWxpZCBKU09OIGNvbmZpZyBmaWxlOiAlcycsIGNvbmZpZ1BhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBhcmdzIGZyb20gY29uZmlnIG9iamVjdC5cbiAgICAgICAgLy8gaXQgcmVjdXJzaXZlbHkgY2hlY2tzIG5lc3RlZCBvYmplY3RzLlxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3QoY29uZmlnLCBwcmV2KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbEtleSA9IHByZXYgPyBwcmV2ICsgJy4nICsga2V5IDoga2V5O1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbm5lciBvYmplY3QgYW5kIHdlIGhhdmUgZG90LW5vdGF0aW9uXG4gICAgICAgICAgICAgICAgLy8gZW5hYmxlZCwgdHJlYXQgaW5uZXIgb2JqZWN0cyBpbiBjb25maWcgdGhlIHNhbWUgYXNcbiAgICAgICAgICAgICAgICAvLyBoZWF2aWx5IG5lc3RlZCBkb3Qgbm90YXRpb25zIChmb28uYmFyLmFwcGxlKS5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCBidXQgbm90IGFuIGFycmF5LCBjaGVjayBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdCh2YWx1ZSwgZnVsbEtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXR0aW5nIGFyZ3VtZW50cyB2aWEgQ0xJIHRha2VzIHByZWNlZGVuY2Ugb3ZlclxuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgd2l0aGluIHRoZSBjb25maWcgZmlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwgZnVsbEtleS5zcGxpdCgnLicpKSB8fCAoY2hlY2tBbGxBbGlhc2VzKGZ1bGxLZXksIGZsYWdzLmFycmF5cykgJiYgY29uZmlndXJhdGlvblsnY29tYmluZS1hcnJheXMnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhmdWxsS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgYWxsIGNvbmZpZyBvYmplY3RzIHBhc3NlZCBpbiBvcHRzXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbmZpZ09iamVjdHMoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZ09iamVjdHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnT2JqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChjb25maWdPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0Q29uZmlnT2JqZWN0KGNvbmZpZ09iamVjdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlFbnZWYXJzKGFyZ3YsIGNvbmZpZ09ubHkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW52UHJlZml4ID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSB0eXBlb2YgZW52UHJlZml4ID09PSAnc3RyaW5nJyA/IGVudlByZWZpeCA6ICcnO1xuICAgICAgICAgICAgY29uc3QgZW52ID0gbWl4aW4uZW52KCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhlbnYpLmZvckVhY2goZnVuY3Rpb24gKGVudlZhcikge1xuICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT09ICcnIHx8IGVudlZhci5sYXN0SW5kZXhPZihwcmVmaXgsIDApID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBhcnJheSBvZiBuZXN0ZWQga2V5cyBhbmQgY29udmVydCB0aGVtIHRvIGNhbWVsIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IGVudlZhci5zcGxpdCgnX18nKS5tYXAoZnVuY3Rpb24gKGtleSwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZShrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCgoY29uZmlnT25seSAmJiBmbGFncy5jb25maWdzW2tleXMuam9pbignLicpXSkgfHwgIWNvbmZpZ09ubHkpICYmICFoYXNLZXkoYXJndiwga2V5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXlzLmpvaW4oJy4nKSwgZW52W2VudlZhcl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlDb2VyY2lvbnMoYXJndikge1xuICAgICAgICAgICAgbGV0IGNvZXJjZTtcbiAgICAgICAgICAgIGNvbnN0IGFwcGxpZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFwcGxpZWQuaGFzKGtleSkpIHsgLy8gSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGNvZXJjZWQgdGhpcyBvcHRpb24gdmlhIG9uZSBvZiBpdHMgYWxpYXNlc1xuICAgICAgICAgICAgICAgICAgICBjb2VyY2UgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb2VyY2lvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1heWJlQ29lcmNlTnVtYmVyKGtleSwgY29lcmNlKGFyZ3Zba2V5XSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpKS5mb3JFYWNoKGFsaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQuYWRkKGFsaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbYWxpXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpIHtcbiAgICAgICAgICAgIGZsYWdzLmtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2V0IHBsYWNlaG9sZGVyIGtleXMgZm9yIGRvdCBub3RhdGlvbiBvcHRpb25zICdmb28uYmFyJy5cbiAgICAgICAgICAgICAgICBpZiAofmtleS5pbmRleE9mKCcuJykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3Zba2V5XSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgICAgIGFyZ3Zba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlEZWZhdWx0c0FuZEFsaWFzZXMob2JqLCBhbGlhc2VzLCBkZWZhdWx0cywgY2FuTG9nID0gZmFsc2UpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleShvYmosIGtleS5zcGxpdCgnLicpKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRLZXkob2JqLCBrZXkuc3BsaXQoJy4nKSwgZGVmYXVsdHNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5Mb2cpXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ZWRba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIChhbGlhc2VzW2tleV0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNLZXkob2JqLCB4LnNwbGl0KCcuJykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEtleShvYmosIHguc3BsaXQoJy4nKSwgZGVmYXVsdHNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0tleShvYmosIGtleXMpIHtcbiAgICAgICAgICAgIGxldCBvID0gb2JqO1xuICAgICAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSlcbiAgICAgICAgICAgICAgICBrZXlzID0gW2tleXMuam9pbignLicpXTtcbiAgICAgICAgICAgIGtleXMuc2xpY2UoMCwgLTEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIG8gPSAob1trZXldIHx8IHt9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleSBpbiBvO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNldEtleShvYmosIGtleXMsIHZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG9iajtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pXG4gICAgICAgICAgICAgICAga2V5cyA9IFtrZXlzLmpvaW4oJy4nKV07XG4gICAgICAgICAgICBrZXlzLnNsaWNlKDAsIC0xKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPKGJjb2UpOiBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIHlhcmdzLCBzd2l0Y2ggdG9cbiAgICAgICAgICAgICAgICAvLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG4gICAgICAgICAgICAgICAga2V5ID0gc2FuaXRpemVLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG8gPT09ICdvYmplY3QnICYmIG9ba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IG9ba2V5XSBpcyBhbiBhcnJheSwgYW5kIHRoYXQgdGhlIGxhc3QgaXRlbSBpcyBhbiBlbXB0eSBvYmplY3QuXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XS5wdXNoKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHt9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgZW1wdHkgb2JqZWN0IGF0IHRoZSBlbmQgb2YgdGhlIG9ba2V5XSBhcnJheSwgc28gc2V0IG8gdG8gdGhhdCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgbyA9IG9ba2V5XVtvW2tleV0ubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvID0gb1trZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gVE9ETyhiY29lKTogaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiB5YXJncywgc3dpdGNoIHRvXG4gICAgICAgICAgICAvLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzYW5pdGl6ZUtleShrZXlzW2tleXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlQXJyYXkgPSBjaGVja0FsbEFsaWFzZXMoa2V5cy5qb2luKCcuJyksIGZsYWdzLmFycmF5cyk7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBkdXBsaWNhdGUgPSBjb25maWd1cmF0aW9uWydkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5J107XG4gICAgICAgICAgICAvLyBuYXJncyBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gZHVwbGljYXRlXG4gICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykpIHtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgoIWlzVW5kZWZpbmVkKG9ba2V5XSkgJiYgZmxhZ3MubmFyZ3Nba2V5XSA9PT0gMSkgfHwgKEFycmF5LmlzQXJyYXkob1trZXldKSAmJiBvW2tleV0ubGVuZ3RoID09PSBmbGFncy5uYXJnc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBpbmNyZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IGluY3JlbWVudChvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSAmJiBpc1R5cGVBcnJheSAmJiBpc1ZhbHVlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gY29uZmlndXJhdGlvblsnZmxhdHRlbi1kdXBsaWNhdGUtYXJyYXlzJ10gPyBvW2tleV0uY29uY2F0KHZhbHVlKSA6IChBcnJheS5pc0FycmF5KG9ba2V5XVswXSkgPyBvW2tleV0gOiBbb1trZXldXSkuY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZHVwbGljYXRlICYmIEJvb2xlYW4oaXNUeXBlQXJyYXkpID09PSBCb29sZWFuKGlzVmFsdWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSBvW2tleV0uY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9ba2V5XSA9PT0gdW5kZWZpbmVkICYmIGlzVHlwZUFycmF5KSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gaXNWYWx1ZUFycmF5ID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHVwbGljYXRlICYmICEob1trZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpIHx8XG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGV4dGVuZCB0aGUgYWxpYXNlcyBsaXN0IHdpdGggaW5mZXJyZWQgYWxpYXNlcy5cbiAgICAgICAgZnVuY3Rpb24gZXh0ZW5kQWxpYXNlcyguLi5hcmdzKSB7XG4gICAgICAgICAgICBhcmdzLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9iaiB8fCB7fSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNob3J0LWNpcmN1aXQgaWYgd2UndmUgYWxyZWFkeSBhZGRlZCBhIGtleVxuICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgYWxpYXNlcyBhcnJheSwgZm9yIGV4YW1wbGUgaXQgbWlnaHRcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3QgaW4gYm90aCAnb3B0cy5kZWZhdWx0JyBhbmQgJ29wdHMua2V5Jy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldID0gW10uY29uY2F0KGFsaWFzZXNba2V5XSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBcIi0tb3B0aW9uLW5hbWVcIiwgYWxzbyBzZXQgYXJndi5vcHRpb25OYW1lXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5jb25jYXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoLy0vLnRlc3QoeCkgJiYgY29uZmlndXJhdGlvblsnY2FtZWwtY2FzZS1leHBhbnNpb24nXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBjYW1lbENhc2UoeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT09IGtleSAmJiBmbGFncy5hbGlhc2VzW2tleV0uaW5kZXhPZihjKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FsaWFzZXNbY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBcIi0tb3B0aW9uTmFtZVwiLCBhbHNvIHNldCBhcmd2WydvcHRpb24tbmFtZSddXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5jb25jYXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5sZW5ndGggPiAxICYmIC9bQS1aXS8udGVzdCh4KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGRlY2FtZWxpemUoeCwgJy0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPT0ga2V5ICYmIGZsYWdzLmFsaWFzZXNba2V5XS5pbmRleE9mKGMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0ucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWxpYXNlc1tjXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNbeF0gPSBba2V5XS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldLmZpbHRlcihmdW5jdGlvbiAoeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICE9PSB5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWcpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpO1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZsYWcpO1xuICAgICAgICAgICAgY29uc3Qgc2V0QWxpYXMgPSB0b0NoZWNrLmZpbmQoa2V5ID0+IGtleXMuaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgICAgICByZXR1cm4gc2V0QWxpYXMgPyBmbGFnW3NldEFsaWFzXSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0FueUZsYWcoa2V5KSB7XG4gICAgICAgICAgICBjb25zdCBmbGFnc0tleXMgPSBPYmplY3Qua2V5cyhmbGFncyk7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gW10uY29uY2F0KGZsYWdzS2V5cy5tYXAoayA9PiBmbGFnc1trXSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2suc29tZShmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGZsYWcpID8gZmxhZy5pbmNsdWRlcyhrZXkpIDogZmxhZ1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzRmxhZ3NNYXRjaGluZyhhcmcsIC4uLnBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gW10uY29uY2F0KC4uLnBhdHRlcm5zKTtcbiAgICAgICAgICAgIHJldHVybiB0b0NoZWNrLnNvbWUoZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IGFyZy5tYXRjaChwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2ggJiYgaGFzQW55RmxhZyhtYXRjaFsxXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBiYXNlZCBvbiBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgc2hvcnQgZmxhZyBncm91cCBwYXJzaW5nIGxvZ2ljXG4gICAgICAgIGZ1bmN0aW9uIGhhc0FsbFNob3J0RmxhZ3MoYXJnKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLCBvciBkb2Vzbid0IHN0YXJ0IHdpdGggYSBzaW5nbGUgaHlwaGVuLCBpdCdzIG5vdCBhIHNob3J0IGZsYWcgZ3JvdXBcbiAgICAgICAgICAgIGlmIChhcmcubWF0Y2gobmVnYXRpdmUpIHx8ICFhcmcubWF0Y2goL14tW14tXSsvKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBoYXNBbGxGbGFncyA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgICAgIGNvbnN0IGxldHRlcnMgPSBhcmcuc2xpY2UoMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZXR0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV4dCA9IGFyZy5zbGljZShqICsgMik7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNBbnlGbGFnKGxldHRlcnNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0FsbEZsYWdzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHx8XG4gICAgICAgICAgICAgICAgICAgIG5leHQgPT09ICctJyB8fFxuICAgICAgICAgICAgICAgICAgICAoL1tBLVphLXpdLy50ZXN0KGxldHRlcnNbal0pICYmIC9eLT9cXGQrKFxcLlxcZCopPyhlLT9cXGQrKT8kLy50ZXN0KG5leHQpKSB8fFxuICAgICAgICAgICAgICAgICAgICAobGV0dGVyc1tqICsgMV0gJiYgbGV0dGVyc1tqICsgMV0ubWF0Y2goL1xcVy8pKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGFzQWxsRmxhZ3M7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaXNVbmtub3duT3B0aW9uQXNBcmcoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvblsndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnXSAmJiBpc1Vua25vd25PcHRpb24oYXJnKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1Vua25vd25PcHRpb24oYXJnKSB7XG4gICAgICAgICAgICBhcmcgPSBhcmcucmVwbGFjZSgvXi17Myx9LywgJy0tJyk7XG4gICAgICAgICAgICAvLyBpZ25vcmUgbmVnYXRpdmUgbnVtYmVyc1xuICAgICAgICAgICAgaWYgKGFyZy5tYXRjaChuZWdhdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgc2hvcnQgb3B0aW9uIGdyb3VwIGFuZCBhbGwgb2YgdGhlbSBhcmUgY29uZmlndXJlZCwgaXQgaXNuJ3QgdW5rbm93blxuICAgICAgICAgICAgaWYgKGhhc0FsbFNob3J0RmxhZ3MoYXJnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGUuZy4gJy0tY291bnQ9MidcbiAgICAgICAgICAgIGNvbnN0IGZsYWdXaXRoRXF1YWxzID0gL14tKyhbXj1dKz8pPVtcXHNcXFNdKiQvO1xuICAgICAgICAgICAgLy8gZS5nLiAnLWEnIG9yICctLWFyZydcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbEZsYWcgPSAvXi0rKFtePV0rPykkLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hLSdcbiAgICAgICAgICAgIGNvbnN0IGZsYWdFbmRpbmdJbkh5cGhlbiA9IC9eLSsoW149XSs/KS0kLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hYmMxMjMnXG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5EaWdpdHMgPSAvXi0rKFtePV0rP1xcZCspJC87XG4gICAgICAgICAgICAvLyBlLmcuICctYS91c3IvbG9jYWwnXG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyA9IC9eLSsoW149XSs/KVxcVysuKiQvO1xuICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBmbGFnIHN0eWxlcywgaW5jbHVkaW5nIG5lZ2F0ZWRCb29sZWFuLCBhIHBhdHRlcm4gZGVmaW5lZCBuZWFyIHRoZSBzdGFydCBvZiB0aGUgcGFyc2UgbWV0aG9kXG4gICAgICAgICAgICByZXR1cm4gIWhhc0ZsYWdzTWF0Y2hpbmcoYXJnLCBmbGFnV2l0aEVxdWFscywgbmVnYXRlZEJvb2xlYW4sIG5vcm1hbEZsYWcsIGZsYWdFbmRpbmdJbkh5cGhlbiwgZmxhZ0VuZGluZ0luRGlnaXRzLCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHBpY2sgYSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIC8vIGZvciBhbiBvcHRpb24gYmFzZWQgb24gbmFtZSBhbmQgdHlwZS5cbiAgICAgICAgZnVuY3Rpb24gZGVmYXVsdFZhbHVlKGtleSkge1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSAmJlxuICAgICAgICAgICAgICAgIGAke2tleX1gIGluIGRlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdEZvclR5cGUoZ3Vlc3NUeXBlKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHJldHVybiBhIGRlZmF1bHQgdmFsdWUsIGdpdmVuIHRoZSB0eXBlIG9mIGEgZmxhZy4sXG4gICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRGb3JUeXBlKHR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQk9PTEVBTl06IHRydWUsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LlNUUklOR106ICcnLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5OVU1CRVJdOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkFSUkFZXTogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZGVmW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdpdmVuIGEgZmxhZywgZW5mb3JjZSBhIGRlZmF1bHQgdHlwZS5cbiAgICAgICAgZnVuY3Rpb24gZ3Vlc3NUeXBlKGtleSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLnN0cmluZ3MpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5TVFJJTkc7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSlcbiAgICAgICAgICAgICAgICB0eXBlID0gRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuTlVNQkVSO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSlcbiAgICAgICAgICAgICAgICB0eXBlID0gRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQVJSQVk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZChudW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudW0gPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayB1c2VyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGluY29uc2lzdGVuY2llc1xuICAgICAgICBmdW5jdGlvbiBjaGVja0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgICAgICAvLyBjb3VudCBrZXlzIHNob3VsZCBub3QgYmUgc2V0IGFzIGFycmF5L25hcmdcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZmluZChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgY29uZmlndXJhdGlvbjogJXMsIG9wdHMuY291bnQgZXhjbHVkZXMgb3B0cy5hcnJheS4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb246ICVzLCBvcHRzLmNvdW50IGV4Y2x1ZGVzIG9wdHMubmFyZy4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGlhc2VzOiBPYmplY3QuYXNzaWduKHt9LCBmbGFncy5hbGlhc2VzKSxcbiAgICAgICAgICAgIGFyZ3Y6IE9iamVjdC5hc3NpZ24oYXJndlJldHVybiwgYXJndiksXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdGVkOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0ZWQpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgbmV3QWxpYXNlczogT2JqZWN0LmFzc2lnbih7fSwgbmV3QWxpYXNlcylcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyBpZiBhbnkgYWxpYXNlcyByZWZlcmVuY2UgZWFjaCBvdGhlciwgd2Ugc2hvdWxkXG4vLyBtZXJnZSB0aGVtIHRvZ2V0aGVyLlxuZnVuY3Rpb24gY29tYmluZUFsaWFzZXMoYWxpYXNlcykge1xuICAgIGNvbnN0IGFsaWFzQXJyYXlzID0gW107XG4gICAgY29uc3QgY29tYmluZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjaGFuZ2UgPSB0cnVlO1xuICAgIC8vIHR1cm4gYWxpYXMgbG9va3VwIGhhc2gge2tleTogWydhbGlhczEnLCAnYWxpYXMyJ119IGludG9cbiAgICAvLyBhIHNpbXBsZSBhcnJheSBbJ2tleScsICdhbGlhczEnLCAnYWxpYXMyJ11cbiAgICBPYmplY3Qua2V5cyhhbGlhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgYWxpYXNBcnJheXMucHVzaChbXS5jb25jYXQoYWxpYXNlc1trZXldLCBrZXkpKTtcbiAgICB9KTtcbiAgICAvLyBjb21iaW5lIGFycmF5cyB1bnRpbCB6ZXJvIGNoYW5nZXMgYXJlXG4gICAgLy8gbWFkZSBpbiBhbiBpdGVyYXRpb24uXG4gICAgd2hpbGUgKGNoYW5nZSkge1xuICAgICAgICBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaWkgPSBpICsgMTsgaWkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBhbGlhc0FycmF5c1tpXS5maWx0ZXIoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzQXJyYXlzW2lpXS5pbmRleE9mKHYpICE9PSAtMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5c1tpXSA9IGFsaWFzQXJyYXlzW2ldLmNvbmNhdChhbGlhc0FycmF5c1tpaV0pO1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5cy5zcGxpY2UoaWksIDEpO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbWFwIGFycmF5cyBiYWNrIHRvIHRoZSBoYXNoLWxvb2t1cCAoZGUtZHVwZSB3aGlsZVxuICAgIC8vIHdlJ3JlIGF0IGl0KS5cbiAgICBhbGlhc0FycmF5cy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhc0FycmF5KSB7XG4gICAgICAgIGFsaWFzQXJyYXkgPSBhbGlhc0FycmF5LmZpbHRlcihmdW5jdGlvbiAodiwgaSwgc2VsZikge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZih2KSA9PT0gaTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGxhc3RBbGlhcyA9IGFsaWFzQXJyYXkucG9wKCk7XG4gICAgICAgIGlmIChsYXN0QWxpYXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbGFzdEFsaWFzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29tYmluZWRbbGFzdEFsaWFzXSA9IGFsaWFzQXJyYXk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29tYmluZWQ7XG59XG4vLyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGEgY291bnQgaXMgZ2l2ZW4gYXMgYW4gYXJnXG4vLyBpdCBpcyBOT1QgY2FsbGVkIHRvIHNldCBhIGRlZmF1bHQgdmFsdWVcbi8vIHRodXMgd2UgY2FuIHN0YXJ0IHRoZSBjb3VudCBhdCAxIGluc3RlYWQgb2YgMFxuZnVuY3Rpb24gaW5jcmVtZW50KG9yaWcpIHtcbiAgICByZXR1cm4gb3JpZyAhPT0gdW5kZWZpbmVkID8gb3JpZyArIDEgOiAxO1xufVxuLy8gVE9ETyhiY29lKTogaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiB5YXJncywgc3dpdGNoIHRvXG4vLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG5mdW5jdGlvbiBzYW5pdGl6ZUtleShrZXkpIHtcbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJylcbiAgICAgICAgcmV0dXJuICdfX19wcm90b19fXyc7XG4gICAgcmV0dXJuIGtleTtcbn1cbmZ1bmN0aW9uIHN0cmlwUXVvdGVzKHZhbCkge1xuICAgIHJldHVybiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgKHZhbFswXSA9PT0gXCInXCIgfHwgdmFsWzBdID09PSAnXCInKSAmJlxuICAgICAgICB2YWxbdmFsLmxlbmd0aCAtIDFdID09PSB2YWxbMF0pXG4gICAgICAgID8gdmFsLnN1YnN0cmluZygxLCB2YWwubGVuZ3RoIC0gMSlcbiAgICAgICAgOiB2YWw7XG59XG4iLCJpbXBvcnQgeyBZRXJyb3IgfSBmcm9tICcuLi95ZXJyb3IuanMnO1xubGV0IHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncyA9IFtdO1xubGV0IHNoaW07XG5leHBvcnQgZnVuY3Rpb24gYXBwbHlFeHRlbmRzKGNvbmZpZywgY3dkLCBtZXJnZUV4dGVuZHMsIF9zaGltKSB7XG4gICAgc2hpbSA9IF9zaGltO1xuICAgIGxldCBkZWZhdWx0Q29uZmlnID0ge307XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdleHRlbmRzJykpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcuZXh0ZW5kcyAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdENvbmZpZztcbiAgICAgICAgY29uc3QgaXNQYXRoID0gL1xcLmpzb258XFwuLipyYyQvLnRlc3QoY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICBsZXQgcGF0aFRvRGVmYXVsdCA9IG51bGw7XG4gICAgICAgIGlmICghaXNQYXRoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBhdGhUb0RlZmF1bHQgPSByZXF1aXJlLnJlc29sdmUoY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGF0aFRvRGVmYXVsdCA9IGdldFBhdGhUb0RlZmF1bHRDb25maWcoY3dkLCBjb25maWcuZXh0ZW5kcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tGb3JDaXJjdWxhckV4dGVuZHMocGF0aFRvRGVmYXVsdCk7XG4gICAgICAgIHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncy5wdXNoKHBhdGhUb0RlZmF1bHQpO1xuICAgICAgICBkZWZhdWx0Q29uZmlnID0gaXNQYXRoXG4gICAgICAgICAgICA/IEpTT04ucGFyc2Uoc2hpbS5yZWFkRmlsZVN5bmMocGF0aFRvRGVmYXVsdCwgJ3V0ZjgnKSlcbiAgICAgICAgICAgIDogcmVxdWlyZShjb25maWcuZXh0ZW5kcyk7XG4gICAgICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5kcztcbiAgICAgICAgZGVmYXVsdENvbmZpZyA9IGFwcGx5RXh0ZW5kcyhkZWZhdWx0Q29uZmlnLCBzaGltLnBhdGguZGlybmFtZShwYXRoVG9EZWZhdWx0KSwgbWVyZ2VFeHRlbmRzLCBzaGltKTtcbiAgICB9XG4gICAgcHJldmlvdXNseVZpc2l0ZWRDb25maWdzID0gW107XG4gICAgcmV0dXJuIG1lcmdlRXh0ZW5kc1xuICAgICAgICA/IG1lcmdlRGVlcChkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdENvbmZpZywgY29uZmlnKTtcbn1cbmZ1bmN0aW9uIGNoZWNrRm9yQ2lyY3VsYXJFeHRlbmRzKGNmZ1BhdGgpIHtcbiAgICBpZiAocHJldmlvdXNseVZpc2l0ZWRDb25maWdzLmluZGV4T2YoY2ZnUGF0aCkgPiAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgWUVycm9yKGBDaXJjdWxhciBleHRlbmRlZCBjb25maWd1cmF0aW9uczogJyR7Y2ZnUGF0aH0nLmApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFBhdGhUb0RlZmF1bHRDb25maWcoY3dkLCBwYXRoVG9FeHRlbmQpIHtcbiAgICByZXR1cm4gc2hpbS5wYXRoLnJlc29sdmUoY3dkLCBwYXRoVG9FeHRlbmQpO1xufVxuZnVuY3Rpb24gbWVyZ2VEZWVwKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgICBmdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgY29uZmlnMSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnMikpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGNvbmZpZzJba2V5XSkgJiYgaXNPYmplY3QodGFyZ2V0W2tleV0pKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IG1lcmdlRGVlcChjb25maWcxW2tleV0sIGNvbmZpZzJba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvbmZpZzJba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuIiwiZnVuY3Rpb24gZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCgpIHtcbiAgICBpZiAoaXNCdW5kbGVkRWxlY3Ryb25BcHAoKSlcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgcmV0dXJuIDE7XG59XG5mdW5jdGlvbiBpc0J1bmRsZWRFbGVjdHJvbkFwcCgpIHtcbiAgICByZXR1cm4gaXNFbGVjdHJvbkFwcCgpICYmICFwcm9jZXNzLmRlZmF1bHRBcHA7XG59XG5mdW5jdGlvbiBpc0VsZWN0cm9uQXBwKCkge1xuICAgIHJldHVybiAhIXByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb247XG59XG5leHBvcnQgZnVuY3Rpb24gaGlkZUJpbihhcmd2KSB7XG4gICAgcmV0dXJuIGFyZ3Yuc2xpY2UoZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCgpICsgMSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvY2Vzc0FyZ3ZCaW4oKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuYXJndltnZXRQcm9jZXNzQXJndkJpbkluZGV4KCldO1xufVxuIiwiZXhwb3J0IGNsYXNzIFlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICAgICAgc3VwZXIobXNnIHx8ICd5YXJncyBlcnJvcicpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnWUVycm9yJztcbiAgICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBZRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHthcHBseUV4dGVuZHMgYXMgX2FwcGx5RXh0ZW5kc30gZnJvbSAnLi4vYnVpbGQvbGliL3V0aWxzL2FwcGx5LWV4dGVuZHMuanMnO1xuaW1wb3J0IHtoaWRlQmlufSBmcm9tICcuLi9idWlsZC9saWIvdXRpbHMvcHJvY2Vzcy1hcmd2LmpzJztcbmltcG9ydCBQYXJzZXIgZnJvbSAneWFyZ3MtcGFyc2VyJztcbmltcG9ydCBzaGltIGZyb20gJy4uL2xpYi9wbGF0Zm9ybS1zaGltcy9lc20ubWpzJztcblxuY29uc3QgYXBwbHlFeHRlbmRzID0gKGNvbmZpZywgY3dkLCBtZXJnZUV4dGVuZHMpID0+IHtcbiAgcmV0dXJuIF9hcHBseUV4dGVuZHMoY29uZmlnLCBjd2QsIG1lcmdlRXh0ZW5kcywgc2hpbSk7XG59O1xuXG5leHBvcnQge2FwcGx5RXh0ZW5kcywgaGlkZUJpbiwgUGFyc2VyfTtcbiIsIid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBub3RTdHJpY3RFcXVhbCwgc3RyaWN0RXF1YWwgfSBmcm9tICdhc3NlcnQnXG5pbXBvcnQgY2xpdWkgZnJvbSAnY2xpdWknXG5pbXBvcnQgZXNjYWxhZGUgZnJvbSAnZXNjYWxhZGUvc3luYydcbmltcG9ydCB7IGluc3BlY3QgfSBmcm9tICd1dGlsJ1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnXG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCBQYXJzZXIgZnJvbSAneWFyZ3MtcGFyc2VyJ1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGV4dG5hbWUsIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAncGF0aCdcbmltcG9ydCB7IGdldFByb2Nlc3NBcmd2QmluIH0gZnJvbSAnLi4vLi4vYnVpbGQvbGliL3V0aWxzL3Byb2Nlc3MtYXJndi5qcydcbmltcG9ydCB7IFlFcnJvciB9IGZyb20gJy4uLy4uL2J1aWxkL2xpYi95ZXJyb3IuanMnXG5pbXBvcnQgeTE4biBmcm9tICd5MThuJ1xuXG5jb25zdCBSRVFVSVJFX0VSUk9SID0gJ3JlcXVpcmUgaXMgbm90IHN1cHBvcnRlZCBieSBFU00nXG5jb25zdCBSRVFVSVJFX0RJUkVDVE9SWV9FUlJPUiA9ICdsb2FkaW5nIGEgZGlyZWN0b3J5IG9mIGNvbW1hbmRzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IGZvciBFU00nXG5cbmxldCBfX2Rpcm5hbWU7XG50cnkge1xuICBfX2Rpcm5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG59IGNhdGNoIChlKSB7XG4gIF9fZGlybmFtZSA9IHByb2Nlc3MuY3dkKCk7XG59XG5jb25zdCBtYWluRmlsZW5hbWUgPSBfX2Rpcm5hbWUuc3Vic3RyaW5nKDAsIF9fZGlybmFtZS5sYXN0SW5kZXhPZignbm9kZV9tb2R1bGVzJykpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFzc2VydDoge1xuICAgIG5vdFN0cmljdEVxdWFsLFxuICAgIHN0cmljdEVxdWFsXG4gIH0sXG4gIGNsaXVpLFxuICBmaW5kVXA6IGVzY2FsYWRlLFxuICBnZXRFbnY6IChrZXkpID0+IHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZba2V5XVxuICB9LFxuICBpbnNwZWN0LFxuICBnZXRDYWxsZXJGaWxlOiAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFlFcnJvcihSRVFVSVJFX0RJUkVDVE9SWV9FUlJPUilcbiAgfSxcbiAgZ2V0UHJvY2Vzc0FyZ3ZCaW4sXG4gIG1haW5GaWxlbmFtZTogbWFpbkZpbGVuYW1lIHx8IHByb2Nlc3MuY3dkKCksXG4gIFBhcnNlcixcbiAgcGF0aDoge1xuICAgIGJhc2VuYW1lLFxuICAgIGRpcm5hbWUsXG4gICAgZXh0bmFtZSxcbiAgICByZWxhdGl2ZSxcbiAgICByZXNvbHZlXG4gIH0sXG4gIHByb2Nlc3M6IHtcbiAgICBhcmd2OiAoKSA9PiBwcm9jZXNzLmFyZ3YsXG4gICAgY3dkOiBwcm9jZXNzLmN3ZCxcbiAgICBlbWl0V2FybmluZzogKHdhcm5pbmcsIHR5cGUpID0+IHByb2Nlc3MuZW1pdFdhcm5pbmcod2FybmluZywgdHlwZSksXG4gICAgZXhlY1BhdGg6ICgpID0+IHByb2Nlc3MuZXhlY1BhdGgsXG4gICAgZXhpdDogcHJvY2Vzcy5leGl0LFxuICAgIG5leHRUaWNrOiBwcm9jZXNzLm5leHRUaWNrLFxuICAgIHN0ZENvbHVtbnM6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgOiBudWxsXG4gIH0sXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVxdWlyZTogKCkgPT4ge1xuICAgIHRocm93IG5ldyBZRXJyb3IoUkVRVUlSRV9FUlJPUilcbiAgfSxcbiAgcmVxdWlyZURpcmVjdG9yeTogKCkgPT4ge1xuICAgIHRocm93IG5ldyBZRXJyb3IoUkVRVUlSRV9ESVJFQ1RPUllfRVJST1IpXG4gIH0sXG4gIHN0cmluZ1dpZHRoOiAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIFsuLi5zdHJdLmxlbmd0aFxuICB9LFxuICB5MThuOiB5MThuKHtcbiAgICBkaXJlY3Rvcnk6IHJlc29sdmUoX19kaXJuYW1lLCAnLi4vLi4vLi4vbG9jYWxlcycpLFxuICAgIHVwZGF0ZUZpbGVzOiBmYWxzZVxuICB9KVxufVxuIiwiLy8gVE9ETzogY29uc29saWRhdGUgb24gdXNpbmcgYSBoZWxwZXJzIGZpbGUgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLCB3aGljaFxuLy8gaXMgdGhlIGFwcHJvYWNoIGN1cnJlbnRseSB1c2VkIHRvIGV4cG9ydCBQYXJzZXIgYW5kIGFwcGx5RXh0ZW5kcyBmb3IgRVNNOlxuaW1wb3J0IHBrZyBmcm9tICcuL2J1aWxkL2luZGV4LmNqcyc7XG5jb25zdCB7YXBwbHlFeHRlbmRzLCBjanNQbGF0Zm9ybVNoaW0sIFBhcnNlciwgcHJvY2Vzc0FyZ3YsIFlhcmdzfSA9IHBrZztcbllhcmdzLmFwcGx5RXh0ZW5kcyA9IChjb25maWcsIGN3ZCwgbWVyZ2VFeHRlbmRzKSA9PiB7XG4gIHJldHVybiBhcHBseUV4dGVuZHMoY29uZmlnLCBjd2QsIG1lcmdlRXh0ZW5kcywgY2pzUGxhdGZvcm1TaGltKTtcbn07XG5ZYXJncy5oaWRlQmluID0gcHJvY2Vzc0FyZ3YuaGlkZUJpbjtcbllhcmdzLlBhcnNlciA9IFBhcnNlcjtcbmV4cG9ydCBkZWZhdWx0IFlhcmdzO1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0bG9hZGVkOiBmYWxzZSxcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG5cdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX187XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwidmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mID8gKG9iaikgPT4gKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSA6IChvYmopID0+IChvYmouX19wcm90b19fKTtcbnZhciBsZWFmUHJvdG90eXBlcztcbi8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLy8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLy8gbW9kZSAmIDE2OiByZXR1cm4gdmFsdWUgd2hlbiBpdCdzIFByb21pc2UtbGlrZVxuLy8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuX193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcblx0aWYobW9kZSAmIDEpIHZhbHVlID0gdGhpcyh2YWx1ZSk7XG5cdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG5cdGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUpIHtcblx0XHRpZigobW9kZSAmIDQpICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcblx0XHRpZigobW9kZSAmIDE2KSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHZhbHVlO1xuXHR9XG5cdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG5cdHZhciBkZWYgPSB7fTtcblx0bGVhZlByb3RvdHlwZXMgPSBsZWFmUHJvdG90eXBlcyB8fCBbbnVsbCwgZ2V0UHJvdG8oe30pLCBnZXRQcm90byhbXSksIGdldFByb3RvKGdldFByb3RvKV07XG5cdGZvcih2YXIgY3VycmVudCA9IG1vZGUgJiAyICYmIHZhbHVlOyB0eXBlb2YgY3VycmVudCA9PSAnb2JqZWN0JyAmJiAhfmxlYWZQcm90b3R5cGVzLmluZGV4T2YoY3VycmVudCk7IGN1cnJlbnQgPSBnZXRQcm90byhjdXJyZW50KSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGN1cnJlbnQpLmZvckVhY2goKGtleSkgPT4gKGRlZltrZXldID0gKCkgPT4gKHZhbHVlW2tleV0pKSk7XG5cdH1cblx0ZGVmWydkZWZhdWx0J10gPSAoKSA9PiAodmFsdWUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGRlZik7XG5cdHJldHVybiBucztcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5mID0ge307XG4vLyBUaGlzIGZpbGUgY29udGFpbnMgb25seSB0aGUgZW50cnkgY2h1bmsuXG4vLyBUaGUgY2h1bmsgbG9hZGluZyBmdW5jdGlvbiBmb3IgYWRkaXRpb25hbCBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18uZSA9IChjaHVua0lkKSA9PiB7XG5cdHJldHVybiBQcm9taXNlLmFsbChPYmplY3Qua2V5cyhfX3dlYnBhY2tfcmVxdWlyZV9fLmYpLnJlZHVjZSgocHJvbWlzZXMsIGtleSkgPT4ge1xuXHRcdF9fd2VicGFja19yZXF1aXJlX18uZltrZXldKGNodW5rSWQsIHByb21pc2VzKTtcblx0XHRyZXR1cm4gcHJvbWlzZXM7XG5cdH0sIFtdKSk7XG59OyIsIi8vIFRoaXMgZnVuY3Rpb24gYWxsb3cgdG8gcmVmZXJlbmNlIGFzeW5jIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy51ID0gKGNodW5rSWQpID0+IHtcblx0Ly8gcmV0dXJuIHVybCBmb3IgZmlsZW5hbWVzIGJhc2VkIG9uIHRlbXBsYXRlXG5cdHJldHVybiBcIlwiICsgY2h1bmtJZCArIFwiLmNqc1wiO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBjaHVua3Ncbi8vIFwiMVwiIG1lYW5zIFwibG9hZGVkXCIsIG90aGVyd2lzZSBub3QgbG9hZGVkIHlldFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJkZWZhdWx0X2luc3RhbGxhdGlvblwiOiAxXG59O1xuXG4vLyBubyBvbiBjaHVua3MgbG9hZGVkXG5cbnZhciBpbnN0YWxsQ2h1bmsgPSAoY2h1bmspID0+IHtcblx0dmFyIG1vcmVNb2R1bGVzID0gY2h1bmsubW9kdWxlcywgY2h1bmtJZHMgPSBjaHVuay5pZHMsIHJ1bnRpbWUgPSBjaHVuay5ydW50aW1lO1xuXHRmb3IodmFyIG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcblx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0fVxuXHR9XG5cdGlmKHJ1bnRpbWUpIHJ1bnRpbWUoX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBjaHVua0lkcy5sZW5ndGg7IGkrKylcblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHNbaV1dID0gMTtcblxufTtcblxuLy8gcmVxdWlyZSgpIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcbl9fd2VicGFja19yZXF1aXJlX18uZi5yZXF1aXJlID0gKGNodW5rSWQsIHByb21pc2VzKSA9PiB7XG5cdC8vIFwiMVwiIGlzIHRoZSBzaWduYWwgZm9yIFwiYWxyZWFkeSBsb2FkZWRcIlxuXHRpZighaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0aWYodHJ1ZSkgeyAvLyBhbGwgY2h1bmtzIGhhdmUgSlNcblx0XHRcdGluc3RhbGxDaHVuayhyZXF1aXJlKFwiLi9cIiArIF9fd2VicGFja19yZXF1aXJlX18udShjaHVua0lkKSkpO1xuXHRcdH0gZWxzZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAxO1xuXHR9XG59O1xuXG4vLyBubyBleHRlcm5hbCBpbnN0YWxsIGNodW5rXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3QiLCIiLCIvLyBtb2R1bGUgY2FjaGUgYXJlIHVzZWQgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvdGVzdHMvZGVmYXVsdF9pbnN0YWxsYXRpb24udHNcIik7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/dist/full_disk_encryption.cjs b/dist/full_disk_encryption.cjs index 2ae29eb..3e8db8b 100755 --- a/dist/full_disk_encryption.cjs +++ b/dist/full_disk_encryption.cjs @@ -94083,7 +94083,7 @@ const REQUIRE_DIRECTORY_ERROR = 'loading a directory of commands is not supporte let __dirname; try { - __dirname = (0,url__WEBPACK_IMPORTED_MODULE_5__.fileURLToPath)("file:///home/jrivera/Code/agama-integration-test-webpack/node_modules/yargs/lib/platform-shims/esm.mjs"); + __dirname = (0,url__WEBPACK_IMPORTED_MODULE_5__.fileURLToPath)("file:///srv/Work/agama-integration-test-webpack/node_modules/yargs/lib/platform-shims/esm.mjs"); } catch (e) { __dirname = process.cwd(); } @@ -94366,4 +94366,4 @@ module.exports = /*#__PURE__*/JSON.parse('{"name":"escodegen","description":"ECM /******/ /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLDZCQUE2QjtBQUMzRCxpQkFBaUI7QUFDakI7QUFDQSw4QkFBOEIsNkJBQTZCO0FBQzNELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsdUJBQXVCO0FBQy9DO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHVEQUF1RCxTQUFTO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0ZBQW9GLGtCQUFrQjtBQUN0RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBZTtBQUNmOzs7Ozs7Ozs7Ozs7QUMvUGE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLDJDQUEyQyxtQkFBTyxDQUFDLGdFQUFjO0FBQ2pFLHFDQUFxQyxtQkFBTyxDQUFDLG9EQUFRO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDVmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLHNDQUFzQyxtQkFBTyxDQUFDLDJEQUFjO0FBQzVELHVDQUF1QyxtQkFBTyxDQUFDLDZEQUFlO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDelNhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixzQ0FBc0MsbUJBQU8sQ0FBQywyREFBYztBQUM1RCx1Q0FBdUMsbUJBQU8sQ0FBQyw2REFBZTtBQUM5RCxxQ0FBcUMsbUJBQU8sQ0FBQyxvREFBUTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFlO0FBQ2Y7Ozs7Ozs7Ozs7OztBQ2hDYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0Isb0NBQW9DLG1CQUFPLENBQUMsa0RBQU87QUFDbkQsc0NBQXNDLG1CQUFPLENBQUMsMkRBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDZmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLHFDQUFxQyxtQkFBTyxDQUFDLG9EQUFRO0FBQ3JELHNDQUFzQyxtQkFBTyxDQUFDLDJEQUFjO0FBQzVELHVDQUF1QyxtQkFBTyxDQUFDLDZEQUFlO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGlDQUFpQztBQUMzRDtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDak5hO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixvQ0FBb0MsbUJBQU8sQ0FBQyxrREFBTztBQUNuRCxzQ0FBc0MsbUJBQU8sQ0FBQywyREFBYztBQUM1RCx1Q0FBdUMsbUJBQU8sQ0FBQyw2REFBZTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDakNhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixvQ0FBb0MsbUJBQU8sQ0FBQyxrREFBTztBQUNuRCxzQ0FBc0MsbUJBQU8sQ0FBQywyREFBYztBQUM1RCx1Q0FBdUMsbUJBQU8sQ0FBQyw2REFBZTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFlO0FBQ2Y7Ozs7Ozs7Ozs7OztBQ2hEYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0Isb0NBQW9DLG1CQUFPLENBQUMsa0RBQU87QUFDbkQsaURBQWlELG1CQUFPLENBQUMsNEVBQW9CO0FBQzdFLHNDQUFzQyxtQkFBTyxDQUFDLDJEQUFjO0FBQzVELHVDQUF1QyxtQkFBTyxDQUFDLDZEQUFlO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qix3QkFBd0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEZBQTBGLGtCQUFrQjtBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsYUFBYTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBZTtBQUNmOzs7Ozs7Ozs7Ozs7QUMxWmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLHNDQUFzQyxtQkFBTyxDQUFDLHNEQUFTO0FBQ3ZELDBDQUEwQyxtQkFBTyxDQUFDLDhEQUFhO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG1CQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFVBQVU7QUFDbEM7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGVBQWU7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsZ0JBQWdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFlO0FBQ2Y7Ozs7Ozs7Ozs7OztBQ3RWYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0Isc0NBQXNDLG1CQUFPLENBQUMsc0RBQVM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQXVCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFdBQVc7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFNBQVM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixTQUFTO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLHVCQUF1QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQXVCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsVUFBVTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qix1QkFBdUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qix1QkFBdUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFdBQVc7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixXQUFXO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDMVVhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixzQ0FBc0MsbUJBQU8sQ0FBQyxzREFBUztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGFBQWE7QUFDakMsb0JBQW9CLG1CQUFtQjtBQUN2Qyx3QkFBd0IsdUNBQXVDO0FBQy9ELHFCQUFxQixjQUFjO0FBQ25DLHNCQUFzQixvQkFBb0I7QUFDMUMsd0JBQXdCLFdBQVc7QUFDbkMscUJBQXFCLFdBQVc7QUFDaEMsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0EsZ0VBQWdFLFFBQVEsMEJBQTBCLFlBQVk7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFVBQVU7QUFDNUQ7QUFDQSxpQ0FBaUMsVUFBVTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxRQUFRLFlBQVksVUFBVTtBQUM3RTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxXQUFXLEVBQUUsVUFBVTtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDLDJGQUEyRjtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxRQUFRO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELGlCQUFpQjtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsMkJBQTJCLElBQUk7QUFDakcsa0RBQWtELHlCQUF5QjtBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLE1BQU07QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFdBQVc7QUFDN0M7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLDBGQUEwRixXQUFXO0FBQ3JHO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxzREFBc0QsV0FBVztBQUNqRSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7Ozs7Ozs7Ozs7O0FDNVdMO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3ZFYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQzs7Ozs7Ozs7Ozs7O0FDRGhEO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELG9CQUFvQjtBQUNwQixpQkFBaUIsbUJBQU8sQ0FBQyxzQkFBUTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7Ozs7Ozs7Ozs7OztBQ3RCUDtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxvQ0FBb0M7QUFDbkQ7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCw0QkFBNEIsR0FBRyw0QkFBNEI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0EsYUFBYSxtQkFBTyxDQUFDLHlEQUFVO0FBQy9CLGFBQWEsbUJBQU8sQ0FBQyxpRUFBYztBQUNuQyxhQUFhLG1CQUFPLENBQUMsNkRBQVk7QUFDakMsYUFBYSxtQkFBTyxDQUFDLCtEQUFhO0FBQ2xDLGFBQWEsbUJBQU8sQ0FBQyx5RUFBa0I7QUFDdkMsaUJBQWlCLG1CQUFPLENBQUMsNkRBQVk7QUFDckMsd0RBQXVELEVBQUUscUNBQXFDLDJDQUEyQyxFQUFDO0FBQzFJLHdEQUF1RCxFQUFFLHFDQUFxQywyQ0FBMkMsRUFBQzs7Ozs7Ozs7Ozs7O0FDM0I3SDtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCw0QkFBNEIsR0FBRyxxQkFBcUIsR0FBRyx1QkFBdUIsR0FBRyxtQkFBbUI7QUFDcEcsY0FBYyxtQkFBTyxDQUFDLGdCQUFLO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIscUJBQXFCLElBQUksa0JBQWtCO0FBQzlEO0FBQ0EsY0FBYyxxQkFBcUIsR0FBRyxrQkFBa0I7QUFDeEQ7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCOzs7Ozs7Ozs7Ozs7QUNsRWY7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsNEJBQTRCLEdBQUcsMEJBQTBCLEdBQUcsbUJBQW1CLEdBQUcsb0JBQW9CLEdBQUcsNEJBQTRCO0FBQ3JJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsTUFBTTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbEVhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9DQUFvQztBQUNuRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwwQ0FBMEMsNEJBQTRCO0FBQ3RFLENBQUM7QUFDRDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxpQkFBaUI7QUFDakIsK0JBQStCLG1CQUFPLENBQUMscUVBQWdCO0FBQ3ZELGdDQUFnQyxtQkFBTyxDQUFDLHVFQUFpQjtBQUN6RCxnQ0FBZ0MsbUJBQU8sQ0FBQyx1RUFBaUI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7Ozs7Ozs7Ozs7OztBQ3JFSjtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxxQkFBcUIsR0FBRyxpQkFBaUIsR0FBRyxnQkFBZ0I7QUFDNUQsbUJBQW1CLG1CQUFPLENBQUMsNkRBQVk7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsRUFBRTtBQUNsQjtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7Ozs7Ozs7Ozs7O0FDcERSO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELHFCQUFxQixHQUFHLHFCQUFxQixHQUFHLGlCQUFpQixHQUFHLGdCQUFnQjtBQUNwRixtQkFBbUIsbUJBQU8sQ0FBQyw2REFBWTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixTQUFTLFFBQVEsdUJBQXVCO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCOzs7Ozs7Ozs7Ozs7QUMzTFI7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QscUJBQXFCLEdBQUcsaUJBQWlCLEdBQUcsZ0JBQWdCO0FBQzVELG1CQUFtQixtQkFBTyxDQUFDLDZEQUFZO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxXQUFXO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxFQUFFLFFBQVEsSUFBSTtBQUMzQixhQUFhLElBQUksUUFBUSxFQUFFO0FBQzNCLGFBQWEsSUFBSSx3QkFBd0IsSUFBSTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxFQUFFO0FBQ3BDO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0phO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGtCQUFrQixHQUFHLGtCQUFrQixHQUFHLGlDQUFpQyxHQUFHLHlCQUF5QixHQUFHLDRCQUE0QixHQUFHLHlCQUF5QixHQUFHLDRCQUE0QjtBQUNqTSxtQkFBbUIsbUJBQU8sQ0FBQyw2REFBWTtBQUN2QyxpQkFBaUIsbUJBQU8sQ0FBQyxzQkFBUTtBQUNqQyxjQUFjLG1CQUFPLENBQUMsZ0JBQUs7QUFDM0IsK0JBQStCLG1CQUFPLENBQUMscUZBQXdCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxFQUFFO0FBQ3pDO0FBQ0EsMkRBQTJELFFBQVE7QUFDbkU7QUFDQTtBQUNBO0FBQ0EsaUZBQWlGLFFBQVE7QUFDekY7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsUUFBUTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0VBQStFLEtBQUssR0FBRyxLQUFLO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGtDQUFrQztBQUMzRDtBQUNBLDREQUE0RDtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtGQUFrRixpQkFBaUI7QUFDbkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsZ0JBQWdCLEVBQUUsa0JBQWtCO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyw2Q0FBNkMsR0FBRyx3Q0FBd0M7QUFDdkk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2I7QUFDQSw2RUFBNkU7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLDZDQUE2QyxHQUFHLHdDQUF3QztBQUN2STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQSw2RUFBNkU7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDM1NBLGFBQWEsb0RBQXdCOztBQUVyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7OztBQzlHYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1COzs7Ozs7Ozs7Ozs7QUNqQ047O0FBRWI7QUFDQSxtQkFBbUIsbUJBQU8sQ0FBQyw4REFBZ0I7QUFDM0MsRUFBRTtBQUNGLEVBQUUsK0ZBQXNDO0FBQ3hDOzs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQSxvQkFBb0IsbUJBQU8sQ0FBQyxzREFBWTs7QUFFeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsUUFBUSw0QkFBNEI7QUFDcEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTywyQkFBMkI7QUFDbEMsT0FBTyw2QkFBNkI7QUFDcEMsV0FBVyxpQ0FBaUM7QUFDNUMsVUFBVSxnQ0FBZ0M7QUFDMUMsV0FBVyxpQ0FBaUM7QUFDNUMsT0FBTyxxQ0FBcUM7QUFDNUMsU0FBUywyQ0FBMkM7QUFDcEQsUUFBUTtBQUNSOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxRQUFRLGtCQUFrQjtBQUMxQjtBQUNBO0FBQ0Esb0RBQW9ELGdCQUFnQjtBQUNwRSxrREFBa0QsY0FBYztBQUNoRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELFFBQVE7QUFDekQ7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLDRDQUE0Qzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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O0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxRQUFRO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdURBQXVELFFBQVE7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsUUFBUTtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSwyQ0FBMkM7QUFDM0MsMkJBQTJCO0FBQzNCO0FBQ0EsK0JBQStCLDZCQUE2QjtBQUM1RDtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQSw2REFBNkQsUUFBUTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QseURBQXlELFFBQVE7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQSx5REFBeUQsUUFBUTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBeUQsUUFBUTtBQUNqRTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsUUFBUTtBQUN6RDtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQSxtREFBbUQsUUFBUTtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsUUFBUTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsUUFBUTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0EsZ0NBQWdDLGdDQUFtQjs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGdCQUFnQixzQ0FBc0Msa0JBQWtCO0FBQ3BGLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsZ0RBQWdELGFBQWE7QUFDN0QsbUJBQW1CLGdDQUFtQjtBQUN0QyxlQUFlLGdDQUFtQjtBQUNsQyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDLFlBQVksZ0NBQW1CO0FBQy9CLGdCQUFnQixnQ0FBbUI7QUFDbkMsZUFBZSxnQ0FBbUI7QUFDbEMsd0JBQXdCLGdDQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQiw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQSxnQ0FBZ0MsZ0NBQW1COztBQUVuRDtBQUNBLGdEQUFnRCxhQUFhO0FBQzdELGdCQUFnQixnQ0FBbUI7QUFDbkMsdUJBQXVCLGdDQUFtQjtBQUMxQyxrQkFBa0IsZ0NBQW1CO0FBQ3JDLFlBQVksZ0NBQW1CO0FBQy9CLGlCQUFpQixnQ0FBbUI7QUFDcEMsZ0JBQWdCLGdDQUFtQjtBQUNuQyxlQUFlLGdDQUFtQjtBQUNsQztBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHVCQUF1QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdUJBQXVCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFCQUFxQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSwwQkFBMEI7QUFDMUIsOEJBQThCO0FBQzlCO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0QsMEJBQTBCO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCwwQkFBMEI7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMEJBQTBCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLDRCQUE0QjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsd0JBQXdCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLHdCQUF3QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsNkJBQTZCO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGlCQUFpQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMkJBQTJCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw2QkFBNkI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsbUJBQW1CO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxjQUFjO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RkFBOEYsY0FBYztBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qiw4QkFBOEI7QUFDOUI7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxjQUFjO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLGFBQWE7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLGFBQWE7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsb0JBQW9CO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELG1FQUFtRTtBQUMvSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQyx1QkFBdUI7QUFDdkIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsU0FBUztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsK0JBQStCO0FBQy9CLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsaUJBQWlCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLE1BQU0sSUFBSSxNQUFNO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxnQkFBZ0IsaUJBQWlCLEVBQUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsc0JBQXNCO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsK0ZBQStGO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxhQUFhO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBLGdDQUFnQyxpQ0FBbUI7O0FBRW5EO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0QsdUJBQXVCLGlDQUFtQjtBQUMxQyxpQkFBaUIsaUNBQW1CO0FBQ3BDLGVBQWUsaUNBQW1CO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFCQUFxQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7Ozs7Ozs7O0FDcGpOQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0QsUUFBUTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0QsUUFBUTtBQUMxRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsU0FBUztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1EQUFtRCxTQUFTO0FBQzVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxlQUFlOztBQUU1RDtBQUNBLENBQUM7QUFDRDs7Ozs7Ozs7Ozs7QUNweUJBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN2U1k7O0FBRVosV0FBVyxtQkFBTyxDQUFDLDhEQUFhO0FBQ2hDLGFBQWEsbUJBQU8sQ0FBQyxrQkFBTTtBQUMzQixtQkFBbUIsZ0dBQStCO0FBQ2xELHlCQUF5QiwwR0FBMEM7QUFDbkUsYUFBYSxtQkFBTyxDQUFDLDhEQUFjOztBQUVuQztBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2RUFBNkU7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVSxvQkFBb0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFLElBQUk7QUFDakYseUVBQXlFLElBQUk7QUFDN0UsbUNBQW1DLElBQUk7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osd0JBQXdCLEtBQUs7QUFDN0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxXQUFXO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxZQUFZLGtDQUFrQyxhQUFhO0FBQ2pHOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGFBQWEsVUFBVSxZQUFZO0FBQzlFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUNoS1k7O0FBRVosV0FBVyxtQkFBTyxDQUFDLHNEQUFPO0FBQzFCLGFBQWEsbUJBQU8sQ0FBQyxrQkFBTTtBQUMzQixRQUFRLFNBQVMsRUFBRSxtQkFBTyxDQUFDLDhEQUFXO0FBQ3RDLFFBQVEsYUFBYSxFQUFFLG1CQUFPLENBQUMsd0VBQWdCO0FBQy9DLFFBQVEsZUFBZSxFQUFFLG1CQUFPLENBQUMsa0VBQWdCO0FBQ2pELGFBQWEsbUJBQU8sQ0FBQyw4REFBYzs7QUFFbkMseUNBQXlDO0FBQ3pDO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFVBQVUsb0JBQW9COztBQUU5Qjs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdFQUF3RSxJQUFJO0FBQzVFLG9FQUFvRSxJQUFJO0FBQ3hFLG1DQUFtQyxJQUFJO0FBQ3ZDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixLQUFLO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxXQUFXOztBQUV2QjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLFlBQVksa0NBQWtDLGFBQWE7QUFDL0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsYUFBYSxVQUFVLFlBQVk7QUFDNUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7OztBQ2hMWTs7QUFFWixVQUFVLDZGQUFtQztBQUM3QztBQUNBLFVBQVUsbUJBQU8sQ0FBQyx3REFBUTtBQUMxQixZQUFZLG1CQUFPLENBQUMsa0VBQWE7QUFDakM7Ozs7Ozs7Ozs7OztBQ05ZOztBQUVaLFVBQVUsNkZBQW1DO0FBQzdDLFdBQVcsbUJBQU8sQ0FBQyxzREFBTztBQUMxQixhQUFhLG1CQUFPLENBQUMsa0JBQU07QUFDM0IsY0FBYyxtQkFBTyxDQUFDLDhEQUFXO0FBQ2pDLGVBQWUsbUJBQU8sQ0FBQyw4REFBVzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN0Q1k7O0FBRVosVUFBVSw2RkFBbUM7QUFDN0MsYUFBYSxtQkFBTyxDQUFDLGtCQUFNO0FBQzNCLFdBQVcsbUJBQU8sQ0FBQyxzREFBTztBQUMxQixjQUFjLG1CQUFPLENBQUMsOERBQVc7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDakVZOztBQUVaLFFBQVEsNkJBQTZCLEVBQUUsbUJBQU8sQ0FBQywwREFBUTtBQUN2RCxRQUFRLDZCQUE2QixFQUFFLG1CQUFPLENBQUMsMERBQVE7QUFDdkQsUUFBUSxtQ0FBbUMsRUFBRSxtQkFBTyxDQUFDLGdFQUFXOztBQUVoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUN0Qlk7O0FBRVosVUFBVSw2RkFBbUM7QUFDN0MsYUFBYSxtQkFBTyxDQUFDLGtCQUFNO0FBQzNCLFdBQVcsbUJBQU8sQ0FBQyxzREFBTztBQUMxQixjQUFjLG1CQUFPLENBQUMsOERBQVc7QUFDakMsUUFBUSxhQUFhLEVBQUUsbUJBQU8sQ0FBQyx3RUFBZ0I7QUFDL0MsUUFBUSxlQUFlLEVBQUUsbUJBQU8sQ0FBQyw4REFBYzs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQy9EWTs7QUFFWixhQUFhLG1CQUFPLENBQUMsa0JBQU07QUFDM0IsV0FBVyxtQkFBTyxDQUFDLHNEQUFPO0FBQzFCLFFBQVEsYUFBYSxFQUFFLG1CQUFPLENBQUMsd0VBQWdCOztBQUUvQyxVQUFVLDZGQUFtQzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNwR1k7O0FBRVosV0FBVyxtQkFBTyxDQUFDLHNEQUFPO0FBQzFCLFVBQVUsNkZBQW1DOztBQUU3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2pDWTs7QUFFWixVQUFVLDZGQUFtQztBQUM3QyxhQUFhLG1CQUFPLENBQUMsa0JBQU07QUFDM0IsV0FBVyxtQkFBTyxDQUFDLHNEQUFPOztBQUUxQixRQUFRLHFCQUFxQixFQUFFLG1CQUFPLENBQUMsOERBQVc7O0FBRWxELFFBQVEsaUNBQWlDLEVBQUUsbUJBQU8sQ0FBQyw0RUFBaUI7QUFDcEUsUUFBUSwrQkFBK0IsRUFBRSxtQkFBTyxDQUFDLDBFQUFnQjs7QUFFakUsUUFBUSxhQUFhLEVBQUUsbUJBQU8sQ0FBQyx3RUFBZ0I7O0FBRS9DLFFBQVEsZUFBZSxFQUFFLG1CQUFPLENBQUMsOERBQWM7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2xFWTtBQUNaO0FBQ0E7QUFDQSxVQUFVLDhGQUFvQztBQUM5QyxXQUFXLG1CQUFPLENBQUMsOERBQWE7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsbUJBQW1CO0FBQ25DLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHNCQUFzQjtBQUN0QyxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG9CQUFvQjtBQUNwQyxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QjtBQUN2QyxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxFQUFFLHVCQUF1QjtBQUN6QixFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0lZOztBQUVaO0FBQ0E7QUFDQSxLQUFLLG1CQUFPLENBQUMscURBQU07QUFDbkI7QUFDQSxLQUFLLG1CQUFPLENBQUMseURBQVE7QUFDckIsS0FBSyxtQkFBTyxDQUFDLDJEQUFTO0FBQ3RCLEtBQUssbUJBQU8sQ0FBQyw2REFBVTtBQUN2QixLQUFLLG1CQUFPLENBQUMseURBQVE7QUFDckIsS0FBSyxtQkFBTyxDQUFDLDZEQUFVO0FBQ3ZCLEtBQUssbUJBQU8sQ0FBQyx5REFBUTtBQUNyQixLQUFLLG1CQUFPLENBQUMsdUVBQWU7QUFDNUIsS0FBSyxtQkFBTyxDQUFDLHVFQUFlO0FBQzVCLEtBQUssbUJBQU8sQ0FBQyw2REFBVTtBQUN2Qjs7Ozs7Ozs7Ozs7O0FDZlk7O0FBRVosVUFBVSw2RkFBbUM7QUFDN0MsaUJBQWlCLG1CQUFPLENBQUMsZ0VBQVk7O0FBRXJDLHdCQUF3QixtQkFBTyxDQUFDLHNFQUFlO0FBQy9DLDBCQUEwQixtQkFBTyxDQUFDLGdGQUFvQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FDZlk7O0FBRVosaUJBQWlCLG1CQUFPLENBQUMsa0RBQVU7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNWWTs7QUFFWixRQUFRLFlBQVksRUFBRSxtQkFBTyxDQUFDLHdEQUFnQjtBQUM5QyxRQUFRLGlCQUFpQixFQUFFLG1CQUFPLENBQUMsd0VBQWdCOztBQUVuRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7OztBQ1hZOztBQUVaLFFBQVEsWUFBWSxFQUFFLG1CQUFPLENBQUMsd0RBQWdCO0FBQzlDLFFBQVEsYUFBYSxFQUFFLG1CQUFPLENBQUMsd0VBQWdCOztBQUUvQyxtREFBbUQ7QUFDbkQ7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FDWFk7QUFDWixVQUFVLDZGQUFtQztBQUM3QyxRQUFRLGlDQUFpQyxFQUFFLG1CQUFPLENBQUMsa0VBQVk7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNiWTtBQUNaLFdBQVcsbUJBQU8sQ0FBQyxzREFBTztBQUMxQixRQUFRLFlBQVksRUFBRSxtQkFBTyxDQUFDLDREQUFTOztBQUV2QztBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLFlBQVkseUJBQXlCO0FBQ3JDOztBQUVBLHNCQUFzQjtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDWTtBQUNaLGFBQWEsbUJBQU8sQ0FBQyxrQkFBTTs7QUFFM0I7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBOztBQUVBO0FBQ0EsbUVBQW1FLElBQUk7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDcEJZOztBQUVaLFVBQVUsNkZBQW1DO0FBQzdDO0FBQ0EsVUFBVSxtQkFBTyxDQUFDLHdEQUFRO0FBQzFCLFlBQVksbUJBQU8sQ0FBQyxrRUFBYTtBQUNqQzs7Ozs7Ozs7Ozs7O0FDTlk7O0FBRVosV0FBVyxtQkFBTyxDQUFDLDhEQUFhO0FBQ2hDLGFBQWEsbUJBQU8sQ0FBQyxrQkFBTTtBQUMzQixpQkFBaUIsMEZBQTJCO0FBQzVDLG1CQUFtQixnR0FBK0I7QUFDbEQsbUJBQW1CLGdHQUErQjtBQUNsRCxhQUFhLG1CQUFPLENBQUMsOERBQWM7O0FBRW5DO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLGtDQUFrQztBQUM1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUN0RFk7O0FBRVosV0FBVyxtQkFBTyxDQUFDLHNEQUFPO0FBQzFCLGFBQWEsbUJBQU8sQ0FBQyxrQkFBTTtBQUMzQixRQUFRLE9BQU8sRUFBRSxtQkFBTyxDQUFDLDBEQUFTO0FBQ2xDLFFBQVEsU0FBUyxFQUFFLG1CQUFPLENBQUMsOERBQVc7QUFDdEMsUUFBUSxTQUFTLEVBQUUsbUJBQU8sQ0FBQyw4REFBVztBQUN0QyxRQUFRLGFBQWEsRUFBRSxtQkFBTyxDQUFDLHdFQUFnQjtBQUMvQyxhQUFhLG1CQUFPLENBQUMsOERBQWM7O0FBRW5DLHlDQUF5QztBQUN6Qzs7QUFFQSxVQUFVLGtDQUFrQzs7QUFFNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FDMURZOztBQUVaLFVBQVUsNkZBQW1DO0FBQzdDLFdBQVcsbUJBQU8sQ0FBQyxzREFBTztBQUMxQixhQUFhLG1CQUFPLENBQUMsa0JBQU07QUFDM0IsY0FBYyxtQkFBTyxDQUFDLDhEQUFXO0FBQ2pDLG1CQUFtQiwwR0FBb0M7O0FBRXZEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM5Qlk7QUFDWixVQUFVLDZGQUFtQztBQUM3QyxXQUFXLG1CQUFPLENBQUMsc0RBQU87O0FBRTFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDWFk7O0FBRVosV0FBVyxtQkFBTyxDQUFDLDhEQUFhO0FBQ2hDLFVBQVUsOEZBQW9DOztBQUU5QztBQUNBLGdCQUFnQiw4QkFBOEI7QUFDOUM7O0FBRUE7QUFDQSxvQkFBb0IsOEJBQThCO0FBQ2xEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNoQlk7O0FBRVosV0FBVyxtQkFBTyxDQUFDLHNEQUFPO0FBQzFCLGFBQWEsbUJBQU8sQ0FBQyxrQkFBTTtBQUMzQixVQUFVLDZGQUFtQzs7QUFFN0M7QUFDQTtBQUNBLGdDQUFnQyxjQUFjO0FBQzlDLGlDQUFpQyxjQUFjO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsc0NBQXNDLG1CQUFtQjtBQUN6RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsY0FBYztBQUNsRCxxQ0FBcUMsY0FBYztBQUNuRDtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQSxVQUFVLG9CQUFvQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxLQUFLLG9CQUFvQixJQUFJO0FBQ3RGO0FBQ0E7QUFDQSxxREFBcUQsS0FBSyx3QkFBd0IsSUFBSTtBQUN0RjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQSxVQUFVLG9CQUFvQjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsS0FBSyxvQkFBb0IsSUFBSTtBQUN0RjtBQUNBO0FBQ0EscURBQXFELEtBQUssd0JBQXdCLElBQUk7QUFDdEY7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkNBQTJDLGNBQWM7QUFDekQsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsY0FBYztBQUN2RCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsVUFBVSxHQUFHLElBQUksa0NBQWtDLEtBQUs7QUFDM0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDN0pZOztBQUVaLFdBQVcsbUJBQU8sQ0FBQyxzREFBTztBQUMxQixVQUFVLDZGQUFtQzs7QUFFN0M7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDbkNhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNyQmE7QUFDYixPQUFPLGdDQUFnQyxFQUFFLG1CQUFPLENBQUMsc0JBQVE7O0FBRXpEO0FBQ0EsWUFBWTs7QUFFWixRQUFRLE9BQU87QUFDZixNQUFNLFVBQVU7QUFDaEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVDQUF1QyxXQUFXOztBQUVsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuRGE7QUFDYixPQUFPLDRCQUE0QixFQUFFLG1CQUFPLENBQUMsc0JBQVE7QUFDckQsYUFBYSxtQkFBTyxDQUFDLDBDQUFNO0FBQzNCLHFCQUFxQixtQkFBTyxDQUFDLG1FQUFpQjs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQVEsV0FBVzs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlCQUFzQjtBQUN0QixxQkFBcUIsMkNBQTJDLCtCQUErQjtBQUMvRixvQkFBb0IsMkNBQTJDLHdCQUF3QjtBQUN2Riw2QkFBNkI7Ozs7Ozs7Ozs7OztBQzNEaEI7QUFDYjtBQUNBLDZDQUE2QztBQUM3QztBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxZQUFZO0FBQ1osZ0NBQWdDLG1CQUFPLENBQUMsZ0RBQU87QUFDL0MsaUJBQWlCLG1CQUFPLENBQUMsc0JBQVE7QUFDakMsaUJBQWlCLG1CQUFPLENBQUMsc0JBQVE7QUFDakMsNkJBQTZCLG1CQUFPLENBQUMsMEVBQW9CO0FBQ3pELHNDQUFzQyxtQkFBTyxDQUFDLGlFQUFlO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixXQUFXLElBQUksUUFBUSxJQUFJO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFNBQVM7QUFDekI7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOzs7Ozs7Ozs7OztBQzFDYTtBQUNiO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELFlBQVk7QUFDWixnQ0FBZ0MsbUJBQU8sQ0FBQyxnREFBTztBQUMvQyxhQUFhLG1CQUFPLENBQUMsY0FBSTtBQUN6QixtQkFBbUIsbUJBQU8sQ0FBQyxzREFBVTtBQUNyQyxtQ0FBbUMsbUJBQU8sQ0FBQywyREFBWTtBQUN2RCxzQ0FBc0MsbUJBQU8sQ0FBQyxpRUFBZTtBQUM3RCxjQUFjLG1CQUFPLENBQUMsZ0JBQUs7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsV0FBVyxXQUFXO0FBQzVDLFlBQVk7QUFDWixPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDeERhO0FBQ2I7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsV0FBVztBQUNYLG9CQUFvQixtQkFBTyxDQUFDLHlEQUFXO0FBQ3ZDLGlCQUFpQixtQkFBTyxDQUFDLHNCQUFRO0FBQ2pDLGVBQWUsbUJBQU8sQ0FBQyxrQkFBTTtBQUM3QixnQ0FBZ0MsbUJBQU8sQ0FBQyxnREFBTztBQUMvQyxtQ0FBbUMsbUJBQU8sQ0FBQywyREFBWTtBQUN2RCxzQ0FBc0MsbUJBQU8sQ0FBQyxpRUFBZTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOzs7Ozs7Ozs7OztBQzVGYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxlQUFlLG1CQUFPLENBQUMsa0JBQU07QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isa0RBQWtEO0FBQzFFO0FBQ0E7QUFDQSxrQkFBZTtBQUNmOzs7Ozs7Ozs7OztBQ2RhO0FBQ2I7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsWUFBWTtBQUNaLCtCQUErQixtQkFBTyxDQUFDLGtCQUFNO0FBQzdDLGdDQUFnQyxtQkFBTyxDQUFDLG9CQUFPO0FBQy9DLGlCQUFpQixtQkFBTyxDQUFDLHNCQUFRO0FBQ2pDLGdDQUFnQyxtQkFBTyxDQUFDLGdEQUFPO0FBQy9DLHFDQUFxQyxtQkFBTyxDQUFDLCtEQUFjO0FBQzNELG1DQUFtQyxtQkFBTyxDQUFDLDJEQUFZO0FBQ3ZELHNDQUFzQyxtQkFBTyxDQUFDLGlFQUFlO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isa0JBQWtCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qiw0QkFBNEI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDOUxhO0FBQ2I7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsYUFBYTtBQUNiLGdDQUFnQyxtQkFBTyxDQUFDLG9CQUFPO0FBQy9DLGVBQWUsbUJBQU8sQ0FBQyxtREFBUTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxnQ0FBZ0M7QUFDbkU7QUFDQSxhQUFhO0FBQ2I7Ozs7Ozs7Ozs7O0FDZmE7QUFDYjtBQUNBLDZDQUE2QztBQUM3QztBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxjQUFjLEdBQUcsdUJBQXVCLEdBQUcsaUJBQWlCO0FBQzVELGdDQUFnQyxtQkFBTyxDQUFDLGdEQUFPO0FBQy9DO0FBQ0EsZUFBZSxtQkFBTyxDQUFDLG1EQUFRO0FBQy9CLGVBQWUsbUJBQU8sQ0FBQyxtREFBUTtBQUMvQixjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0IsZUFBZSxtQkFBTyxDQUFDLG1EQUFRO0FBQy9CLGdCQUFnQixtQkFBTyxDQUFDLHFEQUFTO0FBQ2pDO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsU0FBUyx1QkFBdUIsSUFBSTtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7Ozs7Ozs7Ozs7QUN4RGE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBZTtBQUNmOzs7Ozs7Ozs7OztBQ2ZhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBZTtBQUNmOzs7Ozs7Ozs7OztBQ2hCWTs7QUFFWjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7Ozs7Ozs7Ozs7QUN0QkEsU0FBUyxtQkFBTyxDQUFDLGNBQUk7QUFDckIsZ0JBQWdCLG1CQUFPLENBQUMsK0RBQWdCO0FBQ3hDLGFBQWEsbUJBQU8sQ0FBQyx5RUFBcUI7QUFDMUMsWUFBWSxtQkFBTyxDQUFDLHVEQUFZOztBQUVoQyxXQUFXLG1CQUFPLENBQUMsa0JBQU07O0FBRXpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsTUFBTSxpREFBdUI7QUFDN0IsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7Ozs7Ozs7Ozs7QUNyVWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsZUFBZTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFFBQVE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFFBQVE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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QUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN0REEsK0dBQStDOzs7Ozs7Ozs7OztBQ0EvQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxlQUFlO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGVBQWU7QUFDMUIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM09hO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9DQUFvQztBQUNuRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwwQ0FBMEMsNEJBQTRCO0FBQ3RFLENBQUM7QUFDRDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGtCQUFrQixHQUFHLGVBQWU7QUFDcEMsMEJBQTBCLG1CQUFPLENBQUMsa0JBQU07QUFDeEMsMkJBQTJCLG1CQUFPLENBQUMsb0JBQU87QUFDMUMsY0FBYyxtQkFBTyxDQUFDLGdCQUFLO0FBQzNCLG9DQUFvQyxtQkFBTyxDQUFDLG9EQUFXO0FBQ3ZELHFCQUFxQixtQkFBTyxDQUFDLDJEQUFZO0FBQ3pDLGdDQUFnQyxtQkFBTyxDQUFDLGdEQUFPO0FBQy9DLHlCQUF5QixtQkFBTyxDQUFDLDhEQUFnQjtBQUNqRCwwQkFBMEIsbUJBQU8sQ0FBQyxxRUFBaUI7QUFDbkQsMkJBQTJCLG1CQUFPLENBQUMsdUVBQWtCO0FBQ3JELDRCQUE0QixtQkFBTyxDQUFDLHlFQUFtQjtBQUN2RCw0QkFBNEIsbUJBQU8sQ0FBQyx5RUFBbUI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsU0FBUztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGlCQUFpQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsU0FBUyxJQUFJLEtBQUs7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixTQUFTLEdBQUcsTUFBTTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFLE1BQU07QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCOzs7Ozs7Ozs7OztBQ3JJYTs7QUFFYixlQUFlLDZDQUFvQjs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsZUFBZTtBQUMxQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7Ozs7Ozs7Ozs7O0FDM0d0QixXQUFXLG1CQUFPLENBQUMseUNBQU07QUFDekIsVUFBVSxtQkFBTyxDQUFDLDREQUFlO0FBQ2pDLFNBQVMsbUJBQU8sQ0FBQyxjQUFJOztBQUVyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsZUFBZSxxQ0FBcUM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2pGQTtBQUNBO0FBQ0EsSUFBSSxtQkFBTyxDQUFDLHVFQUFtQjs7Ozs7Ozs7Ozs7QUNGL0I7Ozs7Ozs7Ozs7OztBQ0FhOztBQUViLFNBQVMsbUJBQU8sQ0FBQyxjQUFJO0FBQ3JCLFNBQVMsOENBQW9CO0FBQzdCLFlBQVksaURBQXVCO0FBQ25DLFlBQVksaURBQXVCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qjs7Ozs7Ozs7Ozs7QUNyRnZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpREFBaUQsS0FBSztBQUN0RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEscUJBQXFCLG1CQUFPLENBQUMsa0ZBQTJCO0FBQ3hELFFBQVEsZ0JBQWdCLEVBQUUsbUJBQU8sQ0FBQyw0REFBZ0I7QUFDbEQsWUFBWSxtQkFBTyxDQUFDLGdFQUFrQjtBQUN0QyxjQUFjLG1CQUFPLENBQUMsa0VBQW1CO0FBQ3pDLGVBQWUsbUJBQU8sQ0FBQyx5REFBVTtBQUNqQyxjQUFjLG1CQUFPLENBQUMsdURBQVM7Ozs7Ozs7Ozs7O0FDNUkvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtREFBbUQsU0FBUztBQUM1RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHFCQUFxQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsd0VBQVc7QUFDL0Isd0JBQXdCLFdBQVc7O0FBRW5DLHFCQUFxQixtQkFBTyxDQUFDLGtGQUEyQjtBQUN4RCxtQkFBbUIsbUJBQU8sQ0FBQyxpRUFBYztBQUN6QyxjQUFjLG1CQUFPLENBQUMsa0VBQW1CO0FBQ3pDLGVBQWUsbUJBQU8sQ0FBQyx5REFBVTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEVBQUUsbUJBQU8sQ0FBQyw0REFBZ0I7QUFDNUIsUUFBUSxzQ0FBc0MsRUFBRSxtQkFBTyxDQUFDLDBFQUF1Qjs7QUFFL0U7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGlCQUFpQixFQUFFLFFBQVEsT0FBTztBQUNsQyxNQUFNO0FBQ047QUFDQSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTztBQUMxQyxNQUFNO0FBQ047QUFDQSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDaEMsUUFBUSxHQUFHLEVBQUUsR0FBRyxPQUFPO0FBQ3ZCLE1BQU07QUFDTjtBQUNBLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQzNCLFFBQVEsR0FBRyxFQUFFLEdBQUcsT0FBTztBQUN2Qjs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGlCQUFpQixFQUFFLE1BQU0sR0FBRyxHQUFHLE9BQU87QUFDdEMsTUFBTTtBQUNOO0FBQ0EsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPO0FBQ2hELFFBQVE7QUFDUixtQkFBbUIsRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsT0FBTztBQUMzQztBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDcEMsWUFBWSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTztBQUNoQyxVQUFVO0FBQ1YscUJBQXFCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQ3BDLFlBQVksR0FBRyxFQUFFLEdBQUcsT0FBTztBQUMzQjtBQUNBLFFBQVE7QUFDUixtQkFBbUIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDbEMsVUFBVSxHQUFHLE9BQU87QUFDcEI7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EscUJBQXFCLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDL0IsV0FBVyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU87QUFDcEMsVUFBVTtBQUNWLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQy9CLFdBQVcsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLE9BQU87QUFDL0I7QUFDQSxRQUFRO0FBQ1IsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDN0IsVUFBVSxHQUFHLE9BQU87QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGVBQWUsU0FBUyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRztBQUN2QyxNQUFNO0FBQ04saUJBQWlCLEVBQUUsTUFBTSxJQUFJLEdBQUcsT0FBTztBQUN2QyxNQUFNO0FBQ04saUJBQWlCLEVBQUUsR0FBRyxFQUFFLElBQUk7QUFDNUIsUUFBUSxHQUFHLEVBQUUsR0FBRyxPQUFPO0FBQ3ZCOztBQUVBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osZ0JBQWdCLEdBQUcsTUFBTSxrQkFBa0I7QUFDM0MsSUFBSTtBQUNKLGdCQUFnQixHQUFHLEdBQUcsR0FBRyxJQUFJLGtCQUFrQjtBQUMvQyxJQUFJO0FBQ0osZ0JBQWdCLEtBQUs7QUFDckIsSUFBSTtBQUNKLGdCQUFnQixLQUFLLEVBQUUsa0JBQWtCO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osYUFBYSxRQUFRO0FBQ3JCLElBQUk7QUFDSixhQUFhLEdBQUcsR0FBRyxRQUFRO0FBQzNCLElBQUk7QUFDSixjQUFjLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUk7QUFDcEMsSUFBSTtBQUNKLGFBQWEsR0FBRyxHQUFHLEdBQUcsR0FBRyxRQUFRO0FBQ2pDLElBQUk7QUFDSixjQUFjLEdBQUc7QUFDakI7O0FBRUEsWUFBWSxNQUFNLEVBQUUsR0FBRztBQUN2Qjs7QUFFQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDMWhCQSxjQUFjLG1CQUFPLENBQUMsa0VBQW1CO0FBQ3pDLFFBQVEsK0JBQStCLEVBQUUsbUJBQU8sQ0FBQywwRUFBdUI7QUFDeEUsUUFBUSxnQkFBZ0IsRUFBRSxtQkFBTyxDQUFDLDREQUFnQjs7QUFFbEQscUJBQXFCLG1CQUFPLENBQUMsa0ZBQTJCO0FBQ3hELFFBQVEscUJBQXFCLEVBQUUsbUJBQU8sQ0FBQyw4RUFBeUI7QUFDaEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ04sMEVBQTBFLGVBQWU7QUFDekY7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQyxZQUFZO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLFdBQVcsR0FBRyxXQUFXLEdBQUcsV0FBVztBQUM3RDtBQUNBLDBCQUEwQiwwQkFBMEI7QUFDcEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsUUFBUTtBQUMvRDtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IscUJBQXFCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQzdTQSxjQUFjLG1CQUFPLENBQUMseURBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNMQSxXQUFXLG1CQUFPLENBQUMsbURBQU07QUFDekIsWUFBWSxtQkFBTyxDQUFDLHFEQUFPO0FBQzNCLFdBQVcsbUJBQU8sQ0FBQyxtREFBTTtBQUN6QixZQUFZLG1CQUFPLENBQUMscURBQU87QUFDM0IsV0FBVyxtQkFBTyxDQUFDLG1EQUFNO0FBQ3pCLFlBQVksbUJBQU8sQ0FBQyxxREFBTzs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0MsR0FBRztBQUNsRDtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDbkRBLGVBQWUsbUJBQU8sQ0FBQyxrRUFBbUI7QUFDMUMsY0FBYyxtQkFBTyxDQUFDLHlEQUFTO0FBQy9CLFFBQVEsZ0JBQWdCLEVBQUUsbUJBQU8sQ0FBQyw0REFBZ0I7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRSxTQUFTO0FBQzFFLDREQUE0RCxTQUFTOztBQUVyRSxrQkFBa0IsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU07QUFDL0Q7QUFDQTs7Ozs7Ozs7Ozs7QUMzREEsZUFBZSxtQkFBTyxDQUFDLGtFQUFtQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDTkEsZ0JBQWdCLG1CQUFPLENBQUMsNkRBQVc7QUFDbkM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxlQUFlLG1CQUFPLENBQUMsa0VBQW1CO0FBQzFDO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDSkEsY0FBYyxtQkFBTyxDQUFDLDREQUFZOztBQUVsQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2hFQSxnQkFBZ0IsbUJBQU8sQ0FBQyw2REFBVztBQUNuQztBQUNBOzs7Ozs7Ozs7OztBQ0ZBLGdCQUFnQixtQkFBTyxDQUFDLDZEQUFXO0FBQ25DO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkEsZ0JBQWdCLG1CQUFPLENBQUMsNkRBQVc7QUFDbkM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxlQUFlLG1CQUFPLENBQUMsa0VBQW1COztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNsQkEsZ0JBQWdCLG1CQUFPLENBQUMsNkRBQVc7QUFDbkM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxnQkFBZ0IsbUJBQU8sQ0FBQyw2REFBVztBQUNuQztBQUNBOzs7Ozs7Ozs7OztBQ0ZBLGVBQWUsbUJBQU8sQ0FBQyxrRUFBbUI7QUFDMUM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxlQUFlLG1CQUFPLENBQUMsa0VBQW1CO0FBQzFDO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkEsZ0JBQWdCLG1CQUFPLENBQUMsNkRBQVc7QUFDbkM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxlQUFlLG1CQUFPLENBQUMsa0VBQW1CO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDZkEsZUFBZSxtQkFBTyxDQUFDLGtFQUFtQjtBQUMxQztBQUNBOzs7Ozs7Ozs7OztBQ0ZBLGNBQWMsbUJBQU8sQ0FBQyx5REFBUztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0xBLGdCQUFnQixtQkFBTyxDQUFDLDZEQUFXO0FBQ25DO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkEscUJBQXFCLG1CQUFPLENBQUMseUVBQWlCO0FBQzlDO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkEsY0FBYyxtQkFBTyxDQUFDLGdFQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNUQSxxQkFBcUIsbUJBQU8sQ0FBQyx5RUFBaUI7QUFDOUM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxjQUFjLG1CQUFPLENBQUMseURBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBLG1CQUFtQixtQkFBTyxDQUFDLDJEQUFlO0FBQzFDLGtCQUFrQixtQkFBTyxDQUFDLHlFQUFzQjtBQUNoRCxlQUFlLG1CQUFPLENBQUMsaUVBQWtCO0FBQ3pDLG9CQUFvQixtQkFBTyxDQUFDLDZFQUF3QjtBQUNwRCxjQUFjLG1CQUFPLENBQUMsbUVBQW1CO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDekMsY0FBYyxtQkFBTyxDQUFDLG1FQUFtQjtBQUN6QyxZQUFZLG1CQUFPLENBQUMsK0RBQWlCO0FBQ3JDLGFBQWEsbUJBQU8sQ0FBQyxpRUFBa0I7QUFDdkMsY0FBYyxtQkFBTyxDQUFDLG1FQUFtQjtBQUN6QyxjQUFjLG1CQUFPLENBQUMsbUVBQW1CO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDekMsbUJBQW1CLG1CQUFPLENBQUMsNkVBQXdCO0FBQ25ELGdCQUFnQixtQkFBTyxDQUFDLHVFQUFxQjtBQUM3QyxpQkFBaUIsbUJBQU8sQ0FBQyx5RUFBc0I7QUFDL0MscUJBQXFCLG1CQUFPLENBQUMsbUZBQTJCO0FBQ3hELHFCQUFxQixtQkFBTyxDQUFDLG1GQUEyQjtBQUN4RCxhQUFhLG1CQUFPLENBQUMsaUVBQWtCO0FBQ3ZDLGNBQWMsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDekMsV0FBVyxtQkFBTyxDQUFDLDZEQUFnQjtBQUNuQyxXQUFXLG1CQUFPLENBQUMsNkRBQWdCO0FBQ25DLFdBQVcsbUJBQU8sQ0FBQyw2REFBZ0I7QUFDbkMsWUFBWSxtQkFBTyxDQUFDLCtEQUFpQjtBQUNyQyxZQUFZLG1CQUFPLENBQUMsK0RBQWlCO0FBQ3JDLFlBQVksbUJBQU8sQ0FBQywrREFBaUI7QUFDckMsWUFBWSxtQkFBTyxDQUFDLCtEQUFpQjtBQUNyQyxlQUFlLG1CQUFPLENBQUMscUVBQW9CO0FBQzNDLG1CQUFtQixtQkFBTyxDQUFDLHlFQUFzQjtBQUNqRCxjQUFjLG1CQUFPLENBQUMsK0RBQWlCO0FBQ3ZDLGtCQUFrQixtQkFBTyxDQUFDLDJFQUF1QjtBQUNqRCxzQkFBc0IsbUJBQU8sQ0FBQywrRUFBeUI7QUFDdkQsc0JBQXNCLG1CQUFPLENBQUMsK0VBQXlCO0FBQ3ZELHNCQUFzQixtQkFBTyxDQUFDLCtFQUF5QjtBQUN2RCxtQkFBbUIsbUJBQU8sQ0FBQyx5RUFBc0I7QUFDakQsbUJBQW1CLG1CQUFPLENBQUMsNkRBQWdCO0FBQzNDLGdCQUFnQixtQkFBTyxDQUFDLGlFQUFrQjtBQUMxQyxZQUFZLG1CQUFPLENBQUMseURBQWM7QUFDbEMsWUFBWSxtQkFBTyxDQUFDLHlEQUFjO0FBQ2xDLG1CQUFtQixtQkFBTyxDQUFDLHVFQUFxQjtBQUNoRCxzQkFBc0IsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDakQsZUFBZSxtQkFBTyxDQUFDLCtEQUFpQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3hGQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3RCQTtBQUNBLG9DQUFvQyxhQUFhO0FBQ2pELG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxFQUFFLG1CQUFPLENBQUMsZ0VBQWE7QUFDekIsY0FBYyxtQkFBTyxDQUFDLHdEQUFTO0FBQy9COztBQUVBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLGVBQWUsY0FBYztBQUM3QixZQUFZLFdBQVc7QUFDdkIsVUFBVSxTQUFTO0FBQ25COztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE1BQU0sWUFBWSxPQUFPLElBQUksS0FBSztBQUNsRCxnQkFBZ0IsTUFBTSxZQUFZLE9BQU8sSUFBSSxLQUFLO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9EQUFvRCxpQkFBaUI7O0FBRXJFO0FBQ0E7O0FBRUEsK0JBQStCLHlCQUF5QjtBQUN4RCx1QkFBdUIseUJBQXlCO0FBQ2hELHVCQUF1Qix5QkFBeUI7O0FBRWhELG9DQUFvQyw4QkFBOEI7QUFDbEUsNEJBQTRCLDhCQUE4QjtBQUMxRCw0QkFBNEIsOEJBQThCOztBQUUxRDtBQUNBOztBQUVBLDBDQUEwQztBQUMxQyxDQUFDLEdBQUcsNEJBQTRCOztBQUVoQywrQ0FBK0M7QUFDL0MsQ0FBQyxHQUFHLDRCQUE0Qjs7QUFFaEM7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQyxDQUFDLFFBQVEsNEJBQTRCOztBQUVyQyx3Q0FBd0M7QUFDeEMsQ0FBQyxRQUFRLGlDQUFpQzs7QUFFMUM7QUFDQTs7QUFFQSxrQ0FBa0MsaUJBQWlCOztBQUVuRDtBQUNBO0FBQ0E7O0FBRUEsK0JBQStCO0FBQy9CLENBQUMsUUFBUSx1QkFBdUI7O0FBRWhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7QUFDOUIsQ0FBQyxFQUFFLGtCQUFrQjtBQUNyQixlQUFlOztBQUVmLHdCQUF3QixpQkFBaUI7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxDQUFDLEVBQUUsdUJBQXVCO0FBQzFCLGVBQWU7O0FBRWYseUJBQXlCLGtCQUFrQjs7QUFFM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLDhCQUE4QjtBQUN0RSxtQ0FBbUMseUJBQXlCOztBQUU1RCx1Q0FBdUMsd0JBQXdCO0FBQy9ELDZCQUE2Qix3QkFBd0I7QUFDckQsNkJBQTZCLHdCQUF3QjtBQUNyRCx5QkFBeUIsa0JBQWtCO0FBQzNDLGtDQUFrQztBQUNsQzs7QUFFQSw0Q0FBNEMsNkJBQTZCO0FBQ3pFLGtDQUFrQyw2QkFBNkI7QUFDL0Qsa0NBQWtDLDZCQUE2QjtBQUMvRCw4QkFBOEIsdUJBQXVCO0FBQ3JELHVDQUF1QztBQUN2Qzs7QUFFQSwwQkFBMEIsWUFBWSxNQUFNLG1CQUFtQjtBQUMvRCwrQkFBK0IsWUFBWSxNQUFNLHdCQUF3Qjs7QUFFekU7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QixvQkFBb0IsSUFBSSxFQUFFLDJCQUEyQjtBQUNyRCwwQkFBMEIsSUFBSSwyQkFBMkI7QUFDekQsMEJBQTBCLElBQUksMkJBQTJCO0FBQ3pELHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDLG9CQUFvQixhQUFhO0FBQ2pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDLGlCQUFpQjtBQUNuRCx3QkFBd0I7O0FBRXhCLHlCQUF5QixpQkFBaUIsRUFBRSxtQkFBbUI7QUFDL0QsOEJBQThCLGlCQUFpQixFQUFFLHdCQUF3Qjs7QUFFekU7QUFDQTtBQUNBOztBQUVBLGtDQUFrQyxpQkFBaUI7QUFDbkQsd0JBQXdCOztBQUV4Qix5QkFBeUIsaUJBQWlCLEVBQUUsbUJBQW1CO0FBQy9ELDhCQUE4QixpQkFBaUIsRUFBRSx3QkFBd0I7O0FBRXpFO0FBQ0EsbUNBQW1DLFlBQVksT0FBTyxrQkFBa0I7QUFDeEUsOEJBQThCLFlBQVksT0FBTyxpQkFBaUI7O0FBRWxFO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsQ0FBQyxPQUFPLGtCQUFrQixHQUFHLG1CQUFtQjtBQUNoRCw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLG1CQUFtQjtBQUN2RDtBQUNBLHVCQUF1QixtQkFBbUI7QUFDMUM7O0FBRUEseUNBQXlDLHdCQUF3QjtBQUNqRTtBQUNBLDRCQUE0Qix3QkFBd0I7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeE5ZOztBQUVaO0FBQ0EsZ0JBQWdCLG1CQUFPLENBQUMsa0RBQVM7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUIsa0JBQWtCO0FBQ2xCLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBLDJDQUEyQyxnQkFBZ0I7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkNBQTJDLGdCQUFnQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Qy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsU0FBUztBQUMvQix1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTO0FBQ2hDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsU0FBUztBQUMvQix1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTO0FBQ2hDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTO0FBQ2hDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGtDQUFrQyw4RkFBOEY7QUFDN0s7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxrREFBa0QsS0FBSyxvQ0FBb0M7QUFDM0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGlDQUFpQztBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLHFCQUFxQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQywrREFBK0QsS0FBSyxvQ0FBb0M7QUFDeEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsaUNBQWlDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx3REFBd0QsSUFBSSxzQ0FBc0M7QUFDbEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0dBQStHO0FBQy9HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGlDQUFpQztBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxpQ0FBaUM7QUFDdEU7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O0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsa0NBQWtDO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUF1RCxZQUFZO0FBQ25FO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsY0FBYztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHdDQUF3QztBQUNoRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxvQkFBb0I7QUFDcEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkNBQTJDLFNBQVM7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBCQUEwQjs7Ozs7Ozs7Ozs7QUN4YTFCLGlCQUFpQixvQkFBb0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsK0hBQW9EO0FBQzdFLFdBQVcsbUJBQU8sQ0FBQyxxREFBUTs7QUFFM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVE7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLFNBQVM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxTQUFTO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDLFNBQVM7QUFDbkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxjQUFjO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxXQUFXO0FBQ1g7O0FBRUEsa0JBQWtCOzs7Ozs7Ozs7OztBQzVabEIsaUJBQWlCLG9CQUFvQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLGNBQWM7O0FBRWQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7O0FBRVosa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJDQUEyQzs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EseUJBQXlCLGlGQUFpRixJQUFJO0FBQzlHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUIsaUZBQWlGLElBQUk7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHdCQUF3QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBZ0MsYUFBYTtBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGtDQUFrQztBQUM5RDtBQUNBOztBQUVB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QUFJO0FBQ3ZCLGFBQWEsbUJBQU8sQ0FBQyxrQkFBTTs7QUFFM0I7O0FBRUEsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBFQUEwRSxnRUFBZ0U7O0FBRTFJLG9DQUFvQztBQUNwQztBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGVBQWU7QUFDZjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FB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QUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUM5UkEsMkJBQTJCLG1CQUFPLENBQUMsMkZBQTRCO0FBQy9ELG9CQUFvQixtQkFBTyxDQUFDLDJFQUFvQjs7QUFFaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQzNEQSxZQUFZLG1CQUFPLENBQUMsd0NBQUs7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNkQSxZQUFZLG1CQUFP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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0ZBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07O0FBRU47QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixhQUFhO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msb0JBQW9CO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsMEJBQTBCLGFBQWE7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWMsOEJBQThCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLEtBQUs7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxnQ0FBZ0M7QUFDN0MsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsY0FBYyxvQkFBb0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQyxRQUFRO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FDanNCQSxzQ0FBc0MsZ0NBQWdDOztBQUV6RDs7QUFFYixRQUFRLFNBQVMsRUFBRSxtQkFBTyxDQUFDLHNCQUFRO0FBQ25DLFFBQVEsaUJBQWlCLEVBQUUsbUJBQU8sQ0FBQyxzQkFBUTs7QUFFM0MsMEJBQTBCLG1CQUFPLENBQUMseUVBQXNCO0FBQ3hELFFBQVEsaUNBQWlDLEVBQUUsbUJBQU8sQ0FBQyx1REFBYTtBQUNoRSxRQUFRLDRCQUE0QixFQUFFLG1CQUFPLENBQUMseURBQWM7QUFDNUQsUUFBUSw0QkFBNEIsRUFBRSxtQkFBTyxDQUFDLDJEQUFlOztBQUU3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsaUJBQWlCO0FBQzlCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsY0FBYyxtQkFBbUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLGlCQUFpQjtBQUM5QixhQUFhLFNBQVM7QUFDdEIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEdBQUc7QUFDaEIsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsR0FBRztBQUNoQixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFB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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxpQkFBaUI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEdBQUc7QUFDaEIsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxrQkFBa0I7QUFDM0UsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELE9BQU87QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFdBQVc7QUFDdEIsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsT0FBTztBQUNsQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQSxXQUFXLFVBQVU7QUFDckI7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQSxXQUFXLFVBQVU7QUFDckI7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QjtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx1Q0FBdUMsc0JBQXNCO0FBQzdELGdDQUFnQyw0QkFBNEI7QUFDNUQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxNQUFNO0FBQ04sNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsbUJBQW1CLEdBQUcsbUJBQW1CO0FBQzVEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDhCQUE4QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDhCQUE4QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekIscUNBQXFDO0FBQ3JDLHdDQUF3Qzs7QUFFeEM7QUFDQSxrQ0FBa0M7QUFDbEMsaUNBQWlDO0FBQ2pDLGdDQUFnQzs7QUFFaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsK0JBQStCO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyx3Q0FBd0M7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwrRUFBK0UsaUVBQWlFLEVBQUU7QUFDbEo7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0Esd0JBQXdCLFNBQVM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzN4QkE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUSxVQUFVO0FBQzFDLDhEQUE4RDtBQUM5RCw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRSxZQUFZO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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USxpQkFBaUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFdBQVc7QUFDN0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGNBQWMsU0FBUztBQUN2Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWMsUUFBUTtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixjQUFjLFNBQVM7QUFDdkI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxR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LE9BQU8sb0JBQW9CLFFBQVE7QUFDckQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sNEJBQTRCLFNBQVM7QUFDaEU7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBLFlBQVksd0JBQXdCO0FBQ3BDLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQix1QkFBdUI7QUFDbEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsK0JBQStCLElBQUk7QUFDaEQ7QUFDQSw4QkFBOEIsTUFBTTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYywrQkFBK0IsSUFBSTtBQUNqRDtBQUNBLDhCQUE4QixNQUFNO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQyxrQkFBa0I7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQyxrQkFBa0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsK0NBQStDLElBQUk7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksK0JBQStCLElBQUk7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsVUFBVTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFVBQVU7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix5Q0FBeUM7QUFDaEU7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsa0JBQWtCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FB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Q0FBZ0Msb0JBQW9CO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHlCQUF5QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxrQkFBa0I7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxtQ0FBbUM7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLDhCQUE4QjtBQUM3RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzSkFBc0osTUFBTTtBQUM1SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakMsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixvQkFBb0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLEdBQUc7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsSUFBSTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdCQUF3Qix3QkFBd0I7QUFDaEQsaUNBQWlDLHlCQUF5QjtBQUMxRDtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsZUFBZTtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBOEI7QUFDMUMsbUJBQW1CLHdFQUFRLElBQUksQ0FBQztBQUNoQztBQUNBLGFBQWEsRUFLSjtBQUNUO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUN6aENhLE1BQU0sbUJBQU8sQ0FBQyxzQkFBUSxFQUFFLHNCQUFzQixlQUFlLHFHQUFxRyxXQUFXLG9CQUFvQixJQUFJLFNBQVMsc0RBQXNELHVDQUF1Qyx5Q0FBeUMsV0FBVyxxQkFBcUIsMkJBQTJCLGNBQWMsU0FBUyxFQUFFLG1CQUFlLENBQUMsa0ZBQVMsR0FBRSxTQUFTLFNBQVMsYUFBYSxxRUFBcUUsRUFBRSxLQUFLLHVEQUF1RCxpRUFBUSxTQUFTLENBQUMsK0NBQStDLHFDQUFxQyxNQUFNLGdCQUFnQixXQUFXLGNBQWMsZ0RBQWdELG1CQUFtQiwyRUFBMkUsU0FBUyxjQUFjLHNCQUFzQixHQUFHLGtFQUFrRSw4Q0FBOEMsRUFBRSxHQUFHLFNBQVMsNkNBQTZDLDBCQUEwQixTQUFTLGdHQUFnRywwQ0FBMEMsbUJBQW1CLDBDQUEwQyxFQUFFLEtBQUssNERBQTRELGtCQUFrQixJQUFJLFFBQVEsa0NBQWtDLHdCQUF3QixnQkFBZ0IsRUFBRSwyQkFBMkIsS0FBSyxpQ0FBaUMsU0FBUyxvQkFBb0IsOEVBQThFLG1CQUFtQixlQUFlLFNBQVMsSUFBSSw0Q0FBNEMsZ0VBQWdFLEdBQUcsZUFBZSxFQUFFLElBQUksd0JBQXdCLHFCQUFxQixnRUFBZ0UsMkJBQTJCLHVCQUF1QixxQkFBcUIsZ0VBQWdFLEdBQUcsU0FBUyx1QkFBdUIsY0FBYyx5REFBeUQsa0JBQWtCLHVCQUF1QixpQkFBaUIscUJBQXFCLGdCQUFnQixlQUFlLEVBQUUsSUFBSSxjQUFjLCtDQUErQyxvQkFBb0IsK0JBQStCLGdCQUFnQix3Q0FBd0MsY0FBYyxzQkFBc0IsZUFBZSxhQUFhLFdBQVcseUJBQXlCLHVCQUF1QixLQUFLLGFBQWEsMERBQTBELGFBQWEseUJBQXlCLHFCQUFxQixtQ0FBbUMsc0JBQXNCLHFCQUFxQixFQUFFLG9CQUFvQixvRkFBb0YsNElBQTRJLHFEQUFxRCxzQkFBc0IsaUVBQWlFLG9GQUFvRiwySUFBMkksbURBQW1ELFFBQVEsZUFBZSxzREFBc0QsNkJBQTZCLGtHQUFrRyxZQUFZLFdBQVcsS0FBSyx3RUFBd0UsYUFBYSxxQ0FBcUMsb0RBQW9ELDhCQUE4QixVQUFVLCtFQUErRSxrQkFBa0IseUJBQXlCLGdDQUFnQywrREFBK0Qsd0JBQXdCLHVDQUF1Qyw2Q0FBNkMsZ0JBQWdCLDZCQUE2QixTQUFTLDhDQUE4QyxXQUFXLDJCQUEyQixzQ0FBc0MsUUFBUSxtRUFBbUUsb0JBQW9CLHlCQUF5Qix3Q0FBd0MsY0FBYyxzQkFBc0IsYUFBYSx5RkFBeUYsZUFBZSxnRUFBZ0UsS0FBSyxzQkFBc0IsUUFBUSxHQUFHLElBQUksbUNBQW1DLG1DQUFtQyxTQUFTLGFBQWEsdUJBQXVCLFFBQVEscUJBQXFCLDBDQUEwQyxpQkFBaUIsb0ZBQW9GLHNCQUFzQix5QkFBeUIsNkVBQTZFLGdEQUFnRCxrQkFBa0IsaUJBQWlCLE1BQU0scUNBQXFDLDRDQUE0QyxTQUFTLDZCQUE2QixxQkFBcUIsTUFBTSx3QkFBd0IsU0FBUyxvQkFBb0IsdURBQXVELElBQUksZUFBZSxrQ0FBa0Msd0NBQXdDLGVBQWUseUNBQXlDLEtBQUssZUFBZSw0Q0FBNEMsS0FBSyx3RkFBd0YsZ0pBQWdKLG9HQUFvRyx1QkFBdUIsYUFBYSx1QkFBdUIsU0FBUyw2REFBNkQsK0ZBQStGLHVCQUF1QiwrREFBK0QsZ0RBQWdELG9FQUFvRSxnREFBZ0QscUJBQXFCLHFCQUFxQixjQUFjLHFFQUFxRSxvQkFBb0IsNEJBQTRCLHdCQUF3QiwrSUFBK0ksd0RBQXdELHNFQUFzRSw2SkFBNkosaURBQWlELGtCQUFrQixRQUFRLFNBQVMsbURBQW1ELDZDQUE2QywyQkFBMkIsTUFBTSxrR0FBa0csR0FBRyxpQkFBaUIseUJBQXlCLGdJQUFnSSxpQkFBaUIsSUFBSSw2Q0FBNkMsaUNBQWlDLG9NQUFvTSxvRkFBb0YseUJBQXlCLHFDQUFxQyxLQUFLLHNDQUFzQyxxQkFBcUIscUlBQXFJLDJDQUEyQyxrR0FBa0csdUJBQXVCLFlBQVksRUFBRSw4Q0FBOEMsMkNBQTJDLG1FQUFtRSxxQkFBcUIsc0RBQXNELHNDQUFzQyxxREFBcUQscUVBQXFFLHFCQUFxQiw4QkFBOEIsa0lBQWtJLElBQUksdURBQXVELFdBQVcsR0FBRyxvREFBb0QsMkNBQTJDLFNBQVMsY0FBYyw2RUFBNkUsMkZBQTJGLCtIQUErSCw2QkFBNkIsaUNBQWlDLHVEQUF1RCx5REFBeUQsU0FBUyxFQUFFLGtCQUFrQiwrQkFBK0IsS0FBSyxTQUFTLEVBQUUsa0JBQWtCLCtCQUErQix5SEFBeUgsMEJBQTBCLGlCQUFpQixtRkFBbUYscUJBQXFCLFNBQVMsbUJBQW1CLFNBQVMsV0FBVyxRQUFRLCtCQUErQixvQkFBb0IsMEVBQTBFLDJCQUEyQixvQkFBb0IsMkRBQTJELEtBQUssZ0NBQWdDLHdCQUF3QixpQkFBaUIsNkNBQTZDLG1GQUFtRiw0Q0FBNEMsV0FBVywrQkFBK0IsY0FBYyxzRUFBc0UsRUFBRSxhQUFhLEdBQUcsb0JBQW9CLHdCQUF3QixrQkFBa0IsZ0JBQWdCLGdEQUFnRCxJQUFJLGdCQUFnQixHQUFHLG1GQUFtRixLQUFLLHVCQUF1Qiw0QkFBNEIsd0JBQXdCLG9DQUFvQyxpUkFBaVIsSUFBSSxpQkFBaUIsTUFBTSxVQUFVLGdCQUFnQix3SEFBd0gsaUJBQWlCLE1BQU0sZ0JBQWdCLGdCQUFnQixrSkFBa0osdUJBQXVCLCtCQUErQiw4QkFBOEIsbUlBQW1JLG1GQUFtRixvQ0FBb0MsdUJBQXVCLGtDQUFrQyxpQkFBaUIsR0FBRyxjQUFjLG9CQUFvQixHQUFHLEtBQTJCLENBQUMsRUFBWSw0QkFBNEIscUJBQWEsRUFBRSxXQUFXLFNBQVMscUJBQWEsOEJBQThCLFlBQVksSUFBSSwyREFBMkQscUJBQXFCLEdBQUcsNENBQTRDLHVCQUF1Qiw0REFBNEQsYUFBYSxnQ0FBZ0MsRUFBRSx1QkFBdUIsdUNBQXVDLGtCQUFrQixTQUFTLFNBQVMsbUJBQW1CLGlGQUFpRixFQUFFLFdBQVcsMkJBQTJCLHdCQUF3QixpRkFBaUYsSUFBSSxRQUFRLHVCQUF1QixpQkFBaUIsNERBQTRELGNBQWMsb0VBQW9FLGNBQWMsMkJBQTJCLGNBQWMsMEVBQTBFLFVBQVUsdUZBQXVGLEdBQUcsY0FBYywwQkFBMEIsZ0JBQWdCLHNCQUFzQixNQUFNLHFCQUFxQixXQUFXLHVCQUF1QixrQ0FBa0MsMkNBQTJDLGtFQUFrRSxTQUFTLHFCQUFxQixtREFBbUQsY0FBYyxpQ0FBaUMsOERBQThELGFBQWEsb0NBQW9DLHFEQUFxRCxnRUFBZ0UsUUFBUSxxQkFBcUIsS0FBSyxLQUFLLGFBQWEsU0FBUyxhQUFhLG9CQUFvQixnQkFBZ0IsY0FBYywwSkFBMEosU0FBUyxrQkFBa0IsbUJBQW1CLFNBQVMsaUNBQWlDLHVEQUF1RCxxQkFBcUIsU0FBUyx5QkFBeUIsZ0NBQWdDLGdCQUFnQixrREFBa0QsbUJBQW1CLFVBQVUseUJBQXlCLFNBQVMsYUFBYSxXQUFXLFdBQVcsV0FBVyxTQUFTLHFFQUFxRSxXQUFXLCtEQUErRCxZQUFZLDJCQUEyQixrQkFBa0IsUUFBUSwyRUFBMkUsOEJBQThCLEdBQUcsRUFBRSxRQUFRLHNCQUFzQix1REFBdUQsTUFBTSxjQUFjLDhGQUE4RixnQkFBZ0IsVUFBVSxlQUFlLEVBQUUsOEJBQThCLFVBQVUsc0JBQXNCLG9CQUFvQixFQUFFLEdBQUcsTUFBTSxrQ0FBa0MsTUFBTSxhQUFhLFNBQVMsRUFBRSxHQUFHLDJDQUEyQyxjQUFjLFlBQVksZ0RBQWdELHdDQUF3Qyx3QkFBd0Isd1FBQXdRLEdBQUcsR0FBRyxHQUFHLHFLQUFxSyxTQUFTLDJMQUEyTCxHQUFHLCtCQUErQixpQkFBaUIsRUFBRSxpQ0FBaUMsT0FBTyxRQUFRLHVCQUF1QixFQUFFLGVBQWUsUUFBUSxLQUFLLG9CQUFvQixFQUFFLFdBQVcsa0JBQWtCLFdBQVcsU0FBUyxHQUFHLEdBQUcsYUFBYSxRQUFRLEdBQUcsR0FBRyxhQUFhLGNBQWMsRUFBRSxHQUFHLHVDQUF1QyxzQkFBc0IsbUVBQW1FLHNCQUFzQixLQUFLLHFIQUFxSCxhQUFhLEdBQUcsS0FBSyxlQUFlLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSwwQkFBMEIsRUFBRSxRQUFRLHdDQUF3QyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFdBQVcsaUJBQWlCLGFBQWEsa0NBQWtDLGVBQWUsRUFBRSxnQkFBZ0IsNENBQTRDLHlCQUF5QixlQUFlLGdCQUFnQixxQkFBcUIsaURBQWlELFVBQVUsV0FBVyxnRkFBZ0YseUZBQXlGLHNCQUFzQixrQ0FBa0MsZ0JBQWdCLDRCQUE0QixpQkFBaUIsa0JBQWtCLGdFQUFnRSxHQUFHLGdCQUFnQixrRkFBa0YsbURBQW1ELDBCQUEwQixjQUFjLGtCQUFrQiw2Q0FBNkMsU0FBUyxHQUFHLGNBQWMsaUJBQWlCLHVCQUF1Qiw2QkFBNkIsSUFBSSxzT0FBc08sRUFBRSxPQUFPLHlDQUF5QyxHQUFHLGVBQWUsWUFBWSw0Q0FBNEMsNEJBQTRCLHlDQUF5QyxZQUFZLCtDQUErQyw0QkFBNEIsSUFBSSxlQUFlLFFBQVEsaUNBQWlDLHdDQUF3QyxFQUFFLHFCQUFxQixHQUFHLEdBQUcsZ0JBQWdCLHdDQUF3QyxJQUFJLHdCQUF3QixhQUFhLHNCQUFzQixvRUFBb0UsYUFBYSxnQ0FBZ0MsV0FBVyxpQ0FBaUMsWUFBWSxvQ0FBb0MsWUFBWSxnQ0FBZ0MsV0FBVyxpQ0FBaUMsWUFBWSxJQUFJLCtDQUErQyxzQkFBc0IsT0FBTyxnQkFBZ0Isc0JBQXNCLGNBQWMsb0NBQW9DLGVBQWUsRUFBRSxrQ0FBa0MsMkVBQTJFLE1BQU0sUUFBUSxnREFBZ0QsSUFBSSwwRUFBMEUsYUFBYSx1Q0FBdUMsVUFBVSxXQUFXLG1EQUFtRCw0QkFBNEIsa0JBQWtCLGlCQUFpQiw0QkFBNEIsU0FBUywyQ0FBMkMsRUFBRSxVQUFVLEVBQUUsd0JBQXdCLG1EQUFtRCxTQUFTLEVBQUUsS0FBSyx1Q0FBdUMsK0JBQStCLGNBQWMscUNBQXFDLFNBQVMsbUNBQW1DLFVBQVUsZ0JBQWdCLG1EQUFtRCxlQUFlLHdDQUF3QywySUFBMkksU0FBUywrQkFBK0IsbUNBQW1DLHNDQUFzQyxTQUFTLFdBQVcsY0FBYyxJQUFJLG1CQUFtQixtREFBbUQsZUFBZSxpQ0FBaUMscUJBQXFCLGlFQUFpRSxXQUFXLDJCQUEyQixRQUFRLHNHQUFzRyxFQUFFLDJCQUEyQixnQkFBZ0IsVUFBVSx1QkFBdUIsNkZBQTZGLHNHQUFzRyxLQUFLLEdBQUcsY0FBYyx5QkFBeUIsY0FBYyw0QkFBNEIsY0FBYyxxQkFBcUIsUUFBUSxxQkFBcUIsVUFBVSxvWEFBb1gsMkJBQTJCLDBDQUEwQyx1QkFBdUIsSUFBSSxpQ0FBaUMsd0JBQXdCLFNBQVMsNkJBQTZCLGdEQUFnRCx1QkFBdUIsV0FBVyxxS0FBcUssMEJBQTBCLDhEQUE4RCx1R0FBdUcsb0JBQW9CLHVDQUF1QyxpQkFBaUIsb0NBQW9DLGVBQWUsR0FBRywyQkFBMkIsMEVBQTBFLGtHQUFrRyxnQ0FBZ0MscUVBQXFFLHdIQUF3SCxJQUFJLHVDQUF1QyxrQ0FBa0Msc0NBQXNDLDZEQUE2RCwyQ0FBMkMsNERBQTRELGdNQUFnTSxhQUFhLCtDQUErQyxnRUFBZ0UseUJBQXlCLHFCQUFxQix5QkFBeUIsbUZBQW1GLDhGQUE4RixNQUFNLGdHQUFnRyxlQUFlLE1BQU0sbURBQW1ELHlCQUF5QixzQ0FBc0MsOEJBQThCLHNCQUFzQiwyREFBMkQsaUJBQWlCLGNBQWMsRUFBRSxZQUFZLGdFQUFnRSxTQUFTLDJCQUEyQixZQUFZLFFBQVEsa0JBQWtCLG1KQUFtSixhQUFhLHFDQUFxQyxpRkFBaUYsS0FBSyxzQkFBc0IsR0FBRywrREFBK0QsRUFBRSw0REFBNEQsaUNBQWlDLDBCQUEwQiwyRkFBMkYsMkNBQTJDLHdCQUF3QixpQ0FBaUMsVUFBVSxHQUFHLGNBQWMsaUNBQWlDLFlBQVksR0FBRyxhQUFhLG1CQUFtQixrQkFBa0IsZ0hBQWdILFVBQVUsMENBQTBDLFVBQVUsR0FBRyxtQkFBbUIsZ0tBQWdLLDJCQUEyQiw4QkFBOEIsZ0NBQWdDLFVBQVUsY0FBYyxVQUFVLDZFQUE2RSxhQUFhLHFCQUFxQix1QkFBdUIsYUFBYSxxQkFBcUIsOEJBQThCLFVBQVUsdUJBQXVCLGdJQUFnSSxXQUFXLDJCQUEyQixTQUFTLCtDQUErQyxhQUFhLFVBQVUscUJBQXFCLFVBQVUsWUFBWSxVQUFVLGlDQUFpQyxVQUFVLDZFQUE2RSxhQUFhLHFCQUFxQix3QkFBd0IsYUFBYSxxQkFBcUIsa0NBQWtDLFVBQVUsdUJBQXVCLHVEQUF1RCx1QkFBdUIsZ0JBQWdCLGNBQWMsa0VBQWtFLFdBQVcsMkJBQTJCLFFBQVEsc0NBQXNDLFVBQVUsT0FBTyxTQUFTLGlGQUFpRixlQUFlLFNBQVMsbURBQW1ELDJDQUEyQyxVQUFVLHFCQUFxQixVQUFVLFlBQVksVUFBVSxvQkFBb0IsbUNBQW1DLGlDQUFpQyxFQUFFLGtCQUFrQixVQUFVLHFCQUFxQixvQkFBb0IsbUJBQW1CLFVBQVUsTUFBTSxvQkFBb0IsZ0NBQWdDLGFBQWEsd0JBQXdCLGdCQUFnQixnQ0FBZ0MsZ0NBQWdDLFdBQVcsUUFBUSxRQUFRLFlBQVksYUFBYSxRQUFRLFlBQVksY0FBYyxRQUFRLFlBQVksWUFBWSxZQUFZLHFOQUFxTiw2QkFBNkIsd0JBQXdCLDRGQUE0Rixna0NBQWdrQyxTQUFTLHdCQUF3QiwwRkFBMEYsNEJBQTRCLDJHQUEyRyxnRUFBZ0UsMElBQTBJLG9EQUFvRCxnQkFBZ0IsNElBQTRJLDZWQUE2VixnQkFBZ0Isc1NBQXNTLFVBQVUsNEJBQTRCLHNCQUFzQix3RkFBd0YsMkNBQTJDLHFJQUFxSSxnQkFBZ0Isa0NBQWtDLFdBQVcseUhBQXlILFNBQVMscUZBQXFGLFdBQVcsdUZBQXVGLFdBQVcseVdBQXlXLGFBQWEsNkhBQTZILFlBQVksa0ZBQWtGLHNEQUFzRCxrQ0FBa0MsWUFBWSx1QkFBdUIsa0RBQWtELFlBQVksc0RBQXNELDJFQUEyRSxNQUFNLHlGQUF5RixPQUFPLHlFQUF5RSwyQ0FBMkMsU0FBUyxPQUFPLHVCQUF1QixLQUFLLFVBQVUsZUFBZSxxR0FBcUcsdUJBQXVCLGtSQUFrUiwrQkFBK0Isa0tBQWtLLGtCQUFrQix5UkFBeVIscUJBQXFCLG1MQUFtTCxzQkFBc0IsaUNBQWlDLGdCQUFnQiw4Q0FBOEMsK0NBQStDLDZFQUE2RSxTQUFTLHFGQUFxRixlQUFlLHVXQUF1VyxnQkFBZ0IsMkJBQTJCLHlCQUF5Qix1TUFBdU0sOEJBQThCLE1BQU0sY0FBYyx3Q0FBd0MsOENBQThDLGtKQUFrSiw4Q0FBOEMsMkZBQTJGLGtCQUFrQixvSUFBb0kscUJBQXFCLHdHQUF3RyxjQUFjLG1IQUFtSCxnQkFBZ0IsZ0VBQWdFLE9BQU8sNkhBQTZILFlBQVksd0VBQXdFLFVBQVUsd0JBQXdCLGFBQWEsZ0pBQWdKLFVBQVUsK0VBQStFLGtCQUFrQixnRUFBZ0UsUUFBUSx3SkFBd0oscUNBQXFDLGFBQWEsMENBQTBDLHlCQUF5Qiw4R0FBOEcsdUNBQXVDLFlBQVksR0FBRyxHQUFHLHFCQUFxQiw4Q0FBOEMsc0JBQXNCLCtDQUErQyx1QkFBdUIsZ0RBQWdELGtCQUFrQixxQkFBcUIsaUJBQWlCLHFCQUFxQixZQUFZLHVCQUF1QiwrQkFBK0IsVUFBVSw0REFBNEQsaUJBQWlCLG9EQUFvRCxtREFBbUQsZ0RBQWdELG1EQUFtRCw4Q0FBOEMsYUFBYSxzQkFBc0IsWUFBWSxzQkFBc0Isb0JBQW9CLHNCQUFzQixtQkFBbUIsc0JBQXNCLFlBQVksMEtBQTBLLCtEQUErRCxRQUFRLFdBQVcsb0RBQW9ELDRDQUE0Qyw0Q0FBNEMsV0FBVyw2RUFBNkUsUUFBUSxvRkFBb0YsYUFBYSwwR0FBMEcsVUFBVSwySkFBMkosa0JBQWtCLDRDQUE0QyxXQUFXLGtIQUFrSCxhQUFhLDZFQUE2RSxVQUFVLHNGQUFzRixZQUFZLHVHQUF1RyxxQkFBcUIsR0FBRyxLQUFLLHlCQUF5QixtZUFBbWUsa0NBQWtDLDZCQUE2Qix3Q0FBd0MsdzlCQUF3OUIsNkVBQTZFLDRJQUE0SSxZQUFZLGFBQWEsd0JBQXdCLGFBQWEsMFFBQTBRLHNDQUFzQyxzSkFBc0osMEVBQTBFLGlCQUFpQix5QkFBeUIseUdBQXlHLGtCQUFrQiwwQkFBMEIsaUNBQWlDLGlCQUFpQiwwQkFBMEIseUdBQXlHLFNBQVMsdUJBQXVCLGdFQUFnRSxhQUFhLDhDQUE4QyxXQUFXLG1DQUFtQyxtTUFBbU0sZ0JBQWdCLDhDQUE4Qyw2SUFBNkkseUZBQXlGLGdIQUFnSCxpQkFBaUIsV0FBVyxZQUFZLHlCQUF5QixhQUFhLDJFQUEyRSwwRUFBMEUsd0JBQXdCLGlFQUFpRSxnQkFBZ0IsMEJBQTBCLGVBQWUsMEJBQTBCLGVBQWUsb0tBQW9LLDBCQUEwQixtS0FBbUssWUFBWSx3R0FBd0csaUJBQWlCLG9EQUFvRCw0QkFBNEIsMkJBQTJCLFFBQVEsZ0RBQWdELDRCQUE0QiwyQkFBMkIsUUFBUSx1Q0FBdUMsY0FBYywrQ0FBK0Msb0JBQW9CLHFHQUFxRyxlQUFlLHNGQUFzRixrQkFBa0Isa0ZBQWtGLFVBQVUsc0VBQXNFLGtCQUFrQixzRUFBc0UsaUJBQWlCLHNFQUFzRSxVQUFVLHNGQUFzRixnQkFBZ0IsaURBQWlELGdCQUFnQiw2QkFBNkIsaUJBQWlCLG9HQUFvRyxlQUFlLHFIQUFxSCxvRkFBb0YsNkZBQTZGLG9DQUFvQyxzQkFBc0IsZ0VBQWdFLGVBQWUsa0JBQWtCLHdNQUF3TSw4QkFBOEIsc0JBQXNCLFFBQVEsMENBQTBDLDRNQUE0TSxRQUFRLHFGQUFxRixzZ0JBQXNnQiwyQkFBMkIsNEJBQTRCLElBQUksZUFBZSxVQUFVLFNBQVMsT0FBTyxPQUFPLGFBQWEsbUpBQW1KLGdCQUFnQix1SkFBdUosUUFBUSwrQkFBK0IsOEJBQThCLDBCQUEwQix5RkFBeUYsOENBQThDLFlBQVksZ0ZBQWdGLE9BQU8sb0JBQW9CLHVYQUF1WCxnR0FBZ0csT0FBTyxXQUFXLGlMQUFpTCxrQ0FBa0MsOERBQThELDBKQUEwSiwrREFBK0QsVUFBVSxPQUFPLHNCQUFzQixPQUFPLHNCQUFzQixPQUFPLHlCQUF5Qix5SkFBeUosb0NBQW9DLE9BQU8scUNBQXFDLFFBQVEsNEJBQTRCLGNBQWMsa0JBQWtCLDRGQUE0RixFQUFFLHVCQUF1QixTQUFTLFFBQVEsZUFBZSw4Q0FBOEMsU0FBUyxJQUFJLHFDQUFxQyx1RUFBdUUsMkZBQTJGLCtFQUErRSxVQUFVLDhCQUE4QixtQkFBbUIsVUFBVSw4QkFBOEIsd0NBQXdDLEdBQUcsY0FBYyw0QkFBNEIsdUJBQXVCLEdBQUcsY0FBYyw0QkFBNEIsMERBQTBELEdBQUcsZ0JBQWdCLG1DQUFtQyxPQUFPLEdBQUcsaUVBQWlFLHdCQUF3QixRQUFRLHNDQUFzQyxVQUFVLG9EQUFvRCxPQUFPLDRCQUE0Qiw0QkFBNEIsTUFBTSxpSEFBaUgsU0FBUyxhQUFhLGVBQWUsb0NBQW9DLGFBQWEsY0FBYyxlQUFlLGFBQWEsY0FBYyxlQUFlLGFBQWEsZUFBZSxrQkFBa0IsYUFBYSxjQUFjLGtCQUFrQixhQUFhLGNBQWMsa0NBQWtDLGFBQWEsZUFBZSx1QkFBdUIsYUFBYSxlQUFlLHNCQUFzQixhQUFhLGVBQWUsMEJBQTBCLGFBQWEsY0FBYyxnQkFBZ0IsYUFBYSxlQUFlLHFCQUFxQixhQUFhLGVBQWUsT0FBTyx5SUFBeUksVUFBVSwwQkFBMEIscUJBQXFCLE9BQU8saWxCQUFpbEIsT0FBTyxxQkFBcUIsT0FBTyxxQkFBcUIsT0FBTyxxQkFBcUIsT0FBTyxxQkFBcUIsT0FBTywwQkFBMEIsT0FBTyxzQkFBc0IsT0FBTyxzQkFBc0IsT0FBTyx1QkFBdUIsT0FBTyxxQkFBcUIsY0FBYyxjQUFjLGlCQUFpQixtQkFBbUIscUtBQXFLLFNBQVMsRUFBRSw0QkFBNEIsTUFBTSxXQUFXLGtGQUFrRixXQUFXLHFCQUFxQixnQ0FBZ0MsUUFBUSxHQUFHLDJFQUEyRSxnREFBZ0QsOEJBQThCLElBQUksY0FBYyxNQUFNLDhHQUE4RyxnREFBZ0Qsa0pBQWtKLHFDQUFxQyx1TUFBdU0sa0NBQWtDLDJCQUEyQiw0SEFBNEgsa21CQUFrbUIsK0JBQStCLG9KQUFvSixpQ0FBaUMsV0FBVyxnR0FBZ0csWUFBWSxNQUFNLFdBQVcsK0JBQStCLGFBQWEsNkJBQTZCLHNCQUFzQixhQUFhLEtBQUssK0hBQStILHlDQUF5QyxNQUFNLDZHQUE2RywrQkFBK0IsMExBQTBMLHNGQUFzRiwrQkFBK0IsTUFBTSxpR0FBaUcsd0NBQXdDLDZEQUE2RCxHQUFHLG9HQUFvRyxFQUFFLGtCQUFrQiw2QkFBNkIsNkdBQTZHLG1GQUFtRiwrQkFBK0Isa0dBQWtHLDJDQUEyQyx1REFBdUQsNEJBQTRCLCtFQUErRSw0QkFBNEIsNEJBQTRCLHlDQUF5Qyw0QkFBNEIsbUdBQW1HLHNFQUFzRSxHQUFHLEdBQUcsdUJBQXVCLG9CQUFvQiwyQkFBMkIsZUFBZSxVQUFVLHdHQUF3RyxFQUFFLGVBQWUsU0FBUyxnQkFBZ0Isa0JBQWtCLG1NQUFtTSx3QkFBd0IsaUhBQWlILGtCQUFrQiw4R0FBOEcseUJBQXlCLFNBQVMsNEJBQTRCLFdBQVcsK0JBQStCLFVBQVUsd0JBQXdCLFFBQVEsVUFBVSxvQ0FBb0MsR0FBRyxLQUFLLEVBQUUsR0FBRyxHQUFHLGFBQWEsU0FBUywwQkFBMEIsSUFBSSxlQUFlLEtBQUssZUFBZSxTQUFTLDBCQUEwQiwwR0FBMEcsb0JBQW9CLGdHQUFnRyxrREFBa0QsNEJBQTRCLHdCQUF3Qiw2RkFBNkYsR0FBRyxnR0FBZ0csa0JBQWtCLHFJQUFxSSxHQUFHLEdBQUcsbUNBQW1DLHFDQUFxQyxpQkFBaUIsY0FBYyxrQkFBa0IsS0FBSyxlQUFlLHFCQUFxQixtQ0FBbUMscUJBQXFCLDhDQUE4QyxXQUFXLDJCQUEyQixRQUFRLHdCQUF3QixFQUFFLHVCQUF1QixnQkFBZ0IsZ0JBQWdCLHdCQUF3QixJQUFJLEdBQUcseUdBQXlHLHNCQUFzQiw0R0FBNEcsc0JBQXNCLDJLQUEySyxVQUFVLHlDQUF5QyxxQkFBcUIsYUFBYSxxR0FBcUcsdUVBQXVFLCtCQUErQixnQkFBZ0IscURBQXFELGlCQUFpQixlQUFlLG9DQUFvQywwQ0FBMEMsTUFBTSxrQkFBa0IsY0FBYyw0QkFBNEIsOERBQThELDZFQUE2RSxJQUFJLDRDQUE0QyxrQkFBa0Isc0hBQXNILGlCQUFpQixpRkFBaUYsZUFBZSxhQUFhLE1BQU0saUJBQWlCLGdCQUFnQixLQUFLLHNEQUFzRCx5REFBeUQsNEJBQTRCLDBCQUEwQixJQUFJLE9BQU8saUdBQWlHLGdIQUFnSCwwQ0FBMEMsMERBQTBELDRCQUE0QixNQUFNLHFCQUFxQiw4Q0FBOEMsNEJBQTRCLE1BQU0sOENBQThDLDRCQUE0QixxQkFBcUIscUJBQXFCLGdCQUFnQix5QkFBeUIsdVNBQXVTLHdDQUF3QyxPQUFPLHFCQUFxQixVQUFVLHFKQUFxSixTQUFTLDZCQUE2QixpQ0FBaUMsc0NBQXNDLGNBQWMsU0FBUyw4QkFBOEIsV0FBVyw0QkFBNEIsdUVBQXVFLFNBQVMsMEtBQTBLLHVHQUF1RyxPQUFPLGlCQUFpQixRQUFRLCtDQUErQyxnREFBZ0QsVUFBVSxNQUFNLGdCQUFnQixDQUFDLG1CQUFPLENBQUMsY0FBSSxHQUFHLFdBQVcsQ0FBQyxtQkFBTyxDQUFDLGtCQUFNLEdBQUcsV0FBVyxDQUFDLG1CQUFPLENBQUMsa0JBQU0sS0FBSyxtQkFBTyxDQUFDLGlEQUFNLEtBQUssbUJBQU8sQ0FBQyxpRUFBYyxFQUFFLFdBQVcsUUFBUSwwREFBMEQsT0FBTyxtQkFBTyxDQUFDLG1EQUFPLFNBQVMsbUJBQU8sQ0FBQyw0REFBZSx5Q0FBeUMsbUJBQU8sQ0FBQyxnRUFBaUIsb0VBQW9FLE1BQWMsV0FBVyxnRUFBTyxRQUFRLDRDQUFZLGdGQUFnRixtQkFBTyxDQUFDLGtCQUFNLFdBQVcseUhBQXlILGdCQUFnQixrR0FBa0cseUJBQXlCLGdFQUFPLGtCQUFrQixtQkFBTyxDQUFDLG9FQUFtQixjQUFjLG1CQUFPLENBQUMsMERBQWMsV0FBVyxvREFBb0QsR0FBRyx1S0FBdUssNkJBQTZCLDhHQUE4RyxHQUFHLDhGQUE4RixTQUFTLG1CQUFPLENBQUMsaUVBQWMsRUFBRSxXQUFXLDZFQUE2RSx5QkFBeUIsdUNBQXVDLGdDQUFnQyx5QkFBeUIscUZBQXFGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBL3M1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQzJEO0FBQ3RCO0FBQ0Y7QUFDSztBQUNSO0FBQ2tEO0FBQy9DO0FBQ3lCO0FBQ3JCO0FBQ21EO0FBQzFGO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsMEVBQWU7QUFDbEQ7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLElBQUksd0JBQXdCO0FBQzFELFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLHVEQUFLLENBQUMsc0RBQU87QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYiw4REFBOEQsZ0JBQWdCO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLDhCQUE4Qix5RUFBcUI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FLGtCQUFrQjtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qyw2RUFBYztBQUN2RCxrQkFBa0Isb0RBQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLDJCQUEyQixrQkFBa0IsR0FBRyxzQkFBc0IsRUFBRSxpRUFBcUI7QUFDN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEVBQUU7QUFDZixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0JBQWtCLHVFQUEyQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixrQkFBa0IsaUVBQXFCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLFlBQVksa0RBQU07QUFDbEI7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBLHFEQUFxRCxnQkFBZ0I7QUFDckU7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLG1DQUFtQyxxREFBd0IsR0FBRyxLQUFLLG9EQUFRLCtDQUFFO0FBQzdFLDRGQUE0RixVQUFVO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsNENBQUs7QUFDdkM7QUFDQSwrQkFBK0IsVUFBVTtBQUN6QyxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIscUNBQVcsZ0JBQWdCLFNBQVMsRUFBRSxTQUFTLElBQUkseUJBQXlCO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLDBCQUEwQjtBQUN4QztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDalFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDb0I7QUFDQTtBQUNJO0FBQ0U7QUFDK0U7QUFDN0M7QUFDNUQsbUJBQW1CLGtDQUFLO0FBQ3hCO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxRQUFRLDZCQUE2QjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsc0NBQVM7QUFDeEI7QUFDQTtBQUNBLGVBQWUsc0NBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsYUFBYSwwQ0FBYTtBQUMxQixxQkFBcUI7QUFDckI7QUFDQTtBQUNBLGdDQUFnQyw0Q0FBZTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEseUNBQVksQ0FBQyx5Q0FBWSxrQkFBa0IsaUJBQWlCO0FBQ3BFLFFBQVEsNkNBQWdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZELHNCQUFzQixtRkFBb0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsc0NBQVMsK0JBQStCLFNBQVMsR0FBRyxRQUFRO0FBQzNFO0FBQ0E7QUFDQSxRQUFRLHNDQUFTO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHNDQUFTO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhLDBDQUFhO0FBQzFCO0FBQ0E7QUFDQSxzQkFBc0IsMkNBQWM7QUFDcEM7QUFDQSxpQ0FBaUMsa0VBQU87QUFDeEMsU0FBUztBQUNUO0FBQ0EsMEJBQTBCLDJDQUFjO0FBQ3hDO0FBQ0E7QUFDQSwrQ0FBK0Msc0NBQVM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBLDZCQUE2Qix5RUFBcUI7QUFDbEQ7QUFDQSxtRkFBbUYsd0NBQVcsSUFBSSxHQUFHLG9DQUFPLEdBQUc7QUFDL0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzQ0FBUyxrQkFBa0Isa0ZBQXVCO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiwwQ0FBYTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNrRTtBQUM1QjtBQUNZO0FBQ1I7QUFDRjtBQUNpRDtBQUNsRjtBQUNQLEtBQUssOENBQU8sZ0JBQWdCLGdFQUErQjtBQUMzRCxLQUFLLDhDQUFPLHVCQUF1Qix5RUFBc0M7QUFDekUsS0FBSyw4Q0FBTyxVQUFVLDBEQUF5QjtBQUMvQyxLQUFLLDhDQUFPLFlBQVksNERBQTJCO0FBQ25ELEtBQUssOENBQU8sV0FBVywyREFBMEI7QUFDakQ7QUFDTztBQUNQLEtBQUssOENBQU8sZ0JBQWdCLGlFQUFnQztBQUM1RCxLQUFLLDhDQUFPLHVCQUF1QiwwRUFBdUM7QUFDMUUsS0FBSyw4Q0FBTyxVQUFVLDJEQUEwQjtBQUNoRCxLQUFLLDhDQUFPLFlBQVksNkRBQTRCO0FBQ3BELEtBQUssOENBQU8sV0FBVyw0REFBMkI7QUFDbEQ7QUFDTztBQUNQLEtBQUssOENBQU8sZ0JBQWdCLG9FQUFtQztBQUMvRCxLQUFLLDhDQUFPLHVCQUF1Qiw2RUFBMEM7QUFDN0UsS0FBSyw4Q0FBTyxVQUFVLDhEQUE2QjtBQUNuRCxLQUFLLDhDQUFPLFlBQVksZ0VBQStCO0FBQ3ZELEtBQUssOENBQU8sV0FBVywrREFBOEI7QUFDckQ7QUFDTztBQUNQLEtBQUssOENBQU8sZ0JBQWdCLDZEQUE0QjtBQUN4RCxLQUFLLDhDQUFPLHVCQUF1QixzRUFBbUM7QUFDdEUsS0FBSyw4Q0FBTyxVQUFVLHVEQUFzQjtBQUM1QyxLQUFLLDhDQUFPLFlBQVkseURBQXdCO0FBQ2hELEtBQUssOENBQU8sV0FBVyx3REFBdUI7QUFDOUM7QUFDMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsOENBQU87QUFDcEI7QUFDQSxxQkFBcUIsaURBQVU7QUFDL0IsaUNBQWlDLHVEQUFzQixDQUFDLHVEQUFzQjtBQUM5RSxxQkFBcUIsaURBQVU7QUFDL0IsaUNBQWlDLHVEQUFzQixDQUFDLHVEQUFzQjtBQUM5RSxxQkFBcUIsaURBQVU7QUFDL0IsaUNBQWlDLHVEQUFzQixDQUFDLHVEQUFzQjtBQUM5RSxxQkFBcUIsaURBQVU7QUFDL0IsaUNBQWlDLHVEQUFzQixDQUFDLHVEQUFzQjtBQUM5RSxxQkFBcUIsaURBQVU7QUFDL0IsaUNBQWlDLHVEQUFzQixDQUFDLHVEQUFzQjtBQUM5RSxxQkFBcUIsaURBQVU7QUFDL0IsaUNBQWlDLHVEQUFzQixDQUFDLHVEQUFzQjtBQUM5RSxxQkFBcUIsaURBQVU7QUFDL0IscUJBQXFCLGlEQUFVO0FBQy9CLHVDQUF1QyxtQkFBbUI7QUFDMUQ7QUFDQSxhQUFhLDhDQUFPO0FBQ3BCO0FBQ0EscUJBQXFCLGlEQUFVO0FBQy9CLGlDQUFpQyxzREFBcUIsQ0FBQywyREFBb0I7QUFDM0UscUJBQXFCLGlEQUFVO0FBQy9CLGlDQUFpQyxzREFBcUIsQ0FBQywyREFBb0I7QUFDM0UscUJBQXFCLGlEQUFVO0FBQy9CLGlDQUFpQyxzREFBcUIsQ0FBQywyREFBb0I7QUFDM0UscUJBQXFCLGlEQUFVO0FBQy9CLGlDQUFpQyxzREFBcUIsQ0FBQywyREFBb0I7QUFDM0UscUJBQXFCLGlEQUFVO0FBQy9CLGlDQUFpQyxzREFBcUIsQ0FBQywyREFBb0I7QUFDM0UscUJBQXFCLGlEQUFVO0FBQy9CLHFCQUFxQixpREFBVTtBQUMvQixxQkFBcUIsaURBQVU7QUFDL0IsdUNBQXVDLG1CQUFtQjtBQUMxRDtBQUNBO0FBQ0EsYUFBYSw4Q0FBTztBQUNwQjtBQUNBLHFCQUFxQixpREFBVTtBQUMvQixxQkFBcUIsaURBQVU7QUFDL0IsaUNBQWlDLDREQUEyQixDQUFDLDJEQUFvQjtBQUNqRixxQkFBcUIsaURBQVU7QUFDL0IsaUNBQWlDLDREQUEyQixDQUFDLDJEQUFvQjtBQUNqRixxQkFBcUIsaURBQVU7QUFDL0IsaUNBQWlDLDREQUEyQixDQUFDLDJEQUFvQjtBQUNqRixxQkFBcUIsaURBQVU7QUFDL0IsaUNBQWlDLDREQUEyQixDQUFDLDJEQUFvQjtBQUNqRixxQkFBcUIsaURBQVU7QUFDL0IscUJBQXFCLGlEQUFVO0FBQy9CLHFCQUFxQixpREFBVTtBQUMvQix1Q0FBdUMsbUJBQW1CO0FBQzFEO0FBQ0E7QUFDQSxhQUFhLDhDQUFPO0FBQ3BCO0FBQ0EscUJBQXFCLGlEQUFVO0FBQy9CLHFCQUFxQixpREFBVTtBQUMvQixpQ0FBaUMscUVBQWtDLENBQUMsMkRBQW9CO0FBQ3hGLHFCQUFxQixpREFBVTtBQUMvQixpQ0FBaUMscUVBQWtDLENBQUMsMkRBQW9CO0FBQ3hGLHFCQUFxQixpREFBVTtBQUMvQixpQ0FBaUMscUVBQWtDLENBQUMsMkRBQW9CO0FBQ3hGLHFCQUFxQixpREFBVTtBQUMvQixpQ0FBaUMscUVBQWtDLENBQUMsMkRBQW9CO0FBQ3hGLHFCQUFxQixpREFBVTtBQUMvQixxQkFBcUIsaURBQVU7QUFDL0IscUJBQXFCLGlEQUFVO0FBQy9CLHVDQUF1QyxLQUFLO0FBQzVDO0FBQ0E7QUFDQSxhQUFhLDhDQUFPO0FBQ3BCO0FBQ0EscUJBQXFCLGlEQUFVO0FBQy9CLGlDQUFpQyx3REFBdUI7QUFDeEQscUJBQXFCLGlEQUFVO0FBQy9CLHFCQUFxQixpREFBVTtBQUMvQixxQkFBcUIsaURBQVU7QUFDL0IscUJBQXFCLGlEQUFVO0FBQy9CLHFCQUFxQixpREFBVTtBQUMvQixxQkFBcUIsaURBQVU7QUFDL0IscUJBQXFCLGlEQUFVO0FBQy9CLHVDQUF1QyxLQUFLO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxzQkFBc0IsaURBQVU7QUFDaEM7QUFDQTtBQUNBO0FBQ0EsYUFBYSw4Q0FBTztBQUNwQjtBQUNBLGFBQWEsOENBQU87QUFDcEIsdUNBQXVDLHNEQUFxQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsOENBQU87QUFDcEIsNkNBQTZDLDREQUEyQjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsOENBQU87QUFDcEIsb0RBQW9ELHFFQUFrQztBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsOENBQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGFBQWEsOENBQU87QUFDcEIseUJBQXlCLHNEQUFxQjtBQUM5QyxhQUFhLDhDQUFPO0FBQ3BCLGFBQWEsOENBQU87QUFDcEIsbUVBQW1FLFNBQVM7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxhQUFhLDhDQUFPO0FBQ3BCLGFBQWEsOENBQU87QUFDcEIsYUFBYSw4Q0FBTztBQUNwQixhQUFhLDhDQUFPO0FBQ3BCLDZFQUE2RSxTQUFTO0FBQ3RGLGFBQWEsOENBQU87QUFDcEIsbUJBQW1CLG1FQUFrQztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN3QjtBQUNxQjtBQUM3QztBQUNBO0FBQ0EsYUFBYSxzREFBZTtBQUM1QjtBQUNBLGFBQWEsc0RBQWU7QUFDNUI7QUFDQSxhQUFhLHNEQUFlO0FBQzVCO0FBQ0EsYUFBYSxzREFBZTtBQUM1QjtBQUNBLGFBQWEsc0RBQWU7QUFDNUI7QUFDQTtBQUNBO0FBQ087QUFDUCxjQUFjLFFBQVEsR0FBRyxpREFBaUQ7QUFDMUU7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxpQkFBaUI7QUFDbEQ7QUFDQTtBQUNPO0FBQ1A7QUFDQSxhQUFhLHNEQUFlO0FBQzVCLGFBQWEsc0RBQWU7QUFDNUIsbUJBQW1CLHNDQUFTO0FBQzVCLGFBQWEsc0RBQWU7QUFDNUIsbUJBQW1CLHNDQUFTO0FBQzVCLGFBQWEsc0RBQWU7QUFDNUIsYUFBYSxzREFBZTtBQUM1QixtQkFBbUIsc0NBQVM7QUFDNUI7QUFDQTtBQUM4RDtBQUM5RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDd0I7QUFDSTtBQUNhO0FBQzBCO0FBQ25FO0FBQ0E7QUFDQSxhQUFhLHNEQUFlO0FBQzVCO0FBQ0EsYUFBYSxzREFBZTtBQUM1QjtBQUNBLGFBQWEsc0RBQWU7QUFDNUI7QUFDQSxhQUFhLHNEQUFlO0FBQzVCO0FBQ0EsYUFBYSxzREFBZTtBQUM1QjtBQUNBO0FBQ0E7QUFDTztBQUNQLGNBQWMsUUFBUSxHQUFHLGlEQUFpRDtBQUMxRTtBQUNPO0FBQ1AsaURBQWlELGlCQUFpQjtBQUNsRTtBQUNPO0FBQ1A7QUFDQSxhQUFhLHNEQUFlO0FBQzVCLGFBQWEsc0RBQWU7QUFDNUIsbUJBQW1CLHNDQUFTO0FBQzVCLGFBQWEsc0RBQWU7QUFDNUIsbUJBQW1CLHNDQUFTO0FBQzVCLGFBQWEsc0RBQWU7QUFDNUIsYUFBYSxzREFBZTtBQUM1QixtQkFBbUIsc0NBQVM7QUFDNUI7QUFDQTtBQUNPO0FBQ1Asd0JBQXdCLHFEQUFPO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asd0JBQXdCLHFEQUFPO0FBQy9CO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFEQUFPO0FBQy9CO0FBQ0E7QUFDTztBQUNQLHNCQUFzQiwyREFBb0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGFBQWEsc0RBQWU7QUFDNUIsYUFBYSxzREFBZTtBQUM1QjtBQUNBLHFCQUFxQiwyREFBb0I7QUFDekMsOEJBQThCLDRCQUE0QjtBQUMxRCxxQkFBcUIsMkRBQW9CO0FBQ3pDLDhCQUE4Qiw0QkFBNEI7QUFDMUQscUJBQXFCLDJEQUFvQjtBQUN6Qyw4QkFBOEIsNEJBQTRCO0FBQzFELHFCQUFxQiwyREFBb0I7QUFDekMsOEJBQThCLDRCQUE0QjtBQUMxRDtBQUNBLGFBQWEsc0RBQWU7QUFDNUIsYUFBYSxzREFBZTtBQUM1QjtBQUNBLHFCQUFxQiwyREFBb0I7QUFDekM7QUFDQSxxQkFBcUIsMkRBQW9CO0FBQ3pDO0FBQ0EscUJBQXFCLDJEQUFvQjtBQUN6QztBQUNBLHFCQUFxQiwyREFBb0I7QUFDekM7QUFDQTtBQUNBLGFBQWEsc0RBQWU7QUFDNUI7QUFDQSxxQkFBcUIsMkRBQW9CO0FBQ3pDO0FBQ0EscUJBQXFCLDJEQUFvQjtBQUN6QztBQUNBLHFCQUFxQiwyREFBb0I7QUFDekM7QUFDQTtBQUNBO0FBQ0EscUVBQXFFLFFBQVEsT0FBTyxTQUFTO0FBQzdGO0FBQ087QUFDUCxTQUFTLHlDQUFZO0FBQ3JCLG1DQUFtQyxHQUFHO0FBQ3RDO0FBQ0EsU0FBUyx5Q0FBWTtBQUNyQixtQ0FBbUMsR0FBRztBQUN0QztBQUNBLFFBQVEsc0NBQVM7QUFDakI7QUFDQTtBQUNBLGFBQWEsc0NBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN3QjtBQUNxQjtBQUM3QztBQUNBO0FBQ0EsYUFBYSxzREFBZTtBQUM1QjtBQUNBLGFBQWEsc0RBQWU7QUFDNUI7QUFDQSxhQUFhLHNEQUFlO0FBQzVCO0FBQ0EsYUFBYSxzREFBZTtBQUM1QjtBQUNBLGFBQWEsc0RBQWU7QUFDNUI7QUFDQTtBQUNBO0FBQ087QUFDUCxjQUFjLFFBQVEsR0FBRyxpREFBaUQ7QUFDMUU7QUFDTztBQUNQLHVEQUF1RCxpQkFBaUI7QUFDeEU7QUFDTztBQUNQO0FBQ0EsYUFBYSxzREFBZTtBQUM1QixhQUFhLHNEQUFlO0FBQzVCLG1CQUFtQixzQ0FBUztBQUM1QixhQUFhLHNEQUFlO0FBQzVCLG1CQUFtQixzQ0FBUztBQUM1QixhQUFhLHNEQUFlO0FBQzVCLGFBQWEsc0RBQWU7QUFDNUIsbUJBQW1CLHNDQUFTO0FBQzVCO0FBQ0E7QUFDOEQ7QUFDOUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN3QjtBQUNpQjtBQUNJO0FBQzdDO0FBQ0E7QUFDQSxhQUFhLHNEQUFlO0FBQzVCO0FBQ0EsYUFBYSxzREFBZTtBQUM1QixhQUFhLHNEQUFlO0FBQzVCO0FBQ0EsYUFBYSxzREFBZTtBQUM1QixhQUFhLHNEQUFlO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsc0RBQWU7QUFDNUI7QUFDQSxhQUFhLHNEQUFlO0FBQzVCO0FBQ0EsYUFBYSxzREFBZTtBQUM1QjtBQUNBLGFBQWEsc0RBQWU7QUFDNUI7QUFDQSxhQUFhLHNEQUFlO0FBQzVCO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsY0FBYyxRQUFRLEdBQUcsaURBQWlEO0FBQzFFO0FBQ087QUFDUCwwQ0FBMEMsMkJBQTJCO0FBQ3JFO0FBQ087QUFDUDtBQUNBLGFBQWEsc0RBQWU7QUFDNUIsYUFBYSxzREFBZTtBQUM1QixtQkFBbUIsc0NBQVM7QUFDNUIsYUFBYSxzREFBZTtBQUM1QixtQkFBbUIsc0NBQVM7QUFDNUIsYUFBYSxzREFBZTtBQUM1QixhQUFhLHNEQUFlO0FBQzVCLG1CQUFtQixzQ0FBUztBQUM1QjtBQUNBO0FBQ087QUFDUCxpQkFBaUIscURBQU8sc0VBQXNFLGlCQUFpQjtBQUMvRztBQUNPO0FBQ1A7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDb0I7QUFDSTtBQUNpQjtBQUNJO0FBQzdDO0FBQ0E7QUFDQSxhQUFhLHNEQUFlO0FBQzVCLDhCQUE4QixRQUFRLFNBQVMsU0FBUztBQUN4RCxhQUFhLHNEQUFlO0FBQzVCLGFBQWEsc0RBQWU7QUFDNUIsOEJBQThCLFFBQVE7QUFDdEMsYUFBYSxzREFBZTtBQUM1QixhQUFhLHNEQUFlO0FBQzVCLDhCQUE4QixRQUFRLFNBQVMsU0FBUztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsc0RBQWU7QUFDNUIsOEJBQThCLFFBQVE7QUFDdEMsYUFBYSxzREFBZTtBQUM1QixhQUFhLHNEQUFlO0FBQzVCLDhCQUE4QixRQUFRO0FBQ3RDLGFBQWEsc0RBQWU7QUFDNUIsYUFBYSxzREFBZTtBQUM1QixvQ0FBb0MsUUFBUTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsc0RBQWU7QUFDNUI7QUFDQSxhQUFhLHNEQUFlO0FBQzVCLGFBQWEsc0RBQWU7QUFDNUI7QUFDQSxhQUFhLHNEQUFlO0FBQzVCLGFBQWEsc0RBQWU7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsUUFBUSxHQUFHLHlEQUF5RDtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixRQUFRLEdBQUcsZ0JBQWdCLEdBQUcsdUJBQXVCLFNBQVMsbUNBQW1DO0FBQ3ZIO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHNEQUFlO0FBQ3BDLHFCQUFxQixzREFBZTtBQUNwQywyQkFBMkIsc0NBQVM7QUFDcEMscUJBQXFCLHNEQUFlO0FBQ3BDLDJCQUEyQixzQ0FBUztBQUNwQyxxQkFBcUIsc0RBQWU7QUFDcEMscUJBQXFCLHNEQUFlO0FBQ3BDLDJCQUEyQixzQ0FBUztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsc0RBQWU7QUFDcEMscUJBQXFCLHNEQUFlO0FBQ3BDLDJCQUEyQixzQ0FBUztBQUNwQyxxQkFBcUIsc0RBQWU7QUFDcEMsMkJBQTJCLHNDQUFTO0FBQ3BDLHFCQUFxQixzREFBZTtBQUNwQyxxQkFBcUIsc0RBQWU7QUFDcEMsMkJBQTJCLHNDQUFTO0FBQ3BDO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyx3Q0FBd0M7QUFDbEM7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixxREFBTztBQUNuQztBQUNBO0FBQ0EsbUNBQW1DLFNBQVM7QUFDNUM7QUFDQTtBQUNBO0FBQ087QUFDUCxTQUFTLDBDQUFhO0FBQ3RCLGNBQWMsd0NBQVc7QUFDekI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsT0FBTztBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELE9BQU87QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLE9BQU87QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isc0NBQVM7QUFDL0I7QUFDQSw0QkFBNEIsb0JBQW9CLElBQUksc0JBQXNCLEVBQUU7QUFDNUUsS0FBSztBQUNMO0FBQ0E7QUFDQSxRQUFRLHdDQUFXLFdBQVcsc0NBQVM7QUFDdkM7QUFDQSxRQUFRLHdDQUFXLG1CQUFtQix5Q0FBWTtBQUNsRCxrQkFBa0Isd0NBQVcscUJBQXFCLHNDQUFTO0FBQzNELFNBQVM7QUFDVDtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQywwQkFBMEI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDBDQUEwQztBQUMzQztBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsZ0NBQWdDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsb0RBQW9EO0FBQ3JEOzs7Ozs7Ozs7Ozs7Ozs7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDMEI7QUFDVDtBQUNqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ29CO0FBQzZDO0FBQ2pFO0FBQ0E7QUFDQTtBQUNPO0FBQ1AscUJBQXFCLHdDQUFXO0FBQ2hDO0FBQ0E7QUFDQSxtQkFBbUIsb0NBQU87QUFDMUIsa0JBQWtCLDBFQUFlO0FBQ2pDLGtCQUFrQiwwRUFBZTtBQUNqQztBQUNBLG1CQUFtQiwwRUFBZTtBQUNsQztBQUNBLG1CQUFtQixvQ0FBTztBQUMxQjtBQUNBLGlCQUFpQixvQ0FBTyw4QkFBOEIsdUNBQVU7QUFDaEUsa0JBQWtCLDBFQUFlO0FBQ2pDLGtCQUFrQiwwRUFBZTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDb0U7QUFDOUI7QUFDTztBQUNoQjtBQUNJO0FBQ0k7QUFDWjtBQUNTO0FBQ2xDLGFBQWEsK0NBQVMsQ0FBQywrQ0FBZ0I7QUFDdkM7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGNBQWMsd0NBQVUsZ0JBQWdCLGlCQUFpQjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxrREFBSztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix3REFBUyw4QkFBOEIsV0FBVztBQUN6RTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLGlEQUFpRCxhQUFhLEtBQUssV0FBVyxJQUFJLGNBQWM7QUFDaEc7QUFDQTtBQUNBO0FBQ0EsdURBQXVELFlBQVk7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsMkNBQVc7QUFDckM7QUFDQTtBQUNBLDJCQUEyQixvREFBZ0I7QUFDM0Msd0JBQXdCLDJDQUFJO0FBQzVCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxTQUFTLHNEQUFzRCxRQUFRO0FBQ25GO0FBQ0E7QUFDQSx5REFBeUQsT0FBTztBQUNoRTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msb0RBQU87QUFDdkM7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLGtEQUFrRCxVQUFVO0FBQzVEO0FBQ0EsNEJBQTRCLHNDQUFTO0FBQ3JDLDZCQUE2QixZQUFZLEtBQUssV0FBVztBQUN6RDtBQUNBO0FBQ0Esc0NBQXNDLFVBQVU7QUFDaEQ7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN1QztBQUNWO0FBQ0U7QUFDYTtBQUNIO0FBQ2xDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLDJCQUEyQjtBQUMxRCxjQUFjLHFEQUFnQjtBQUM5QixtQkFBbUIsbURBQVU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLG9DQUFHO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsMENBQWE7QUFDdkIsVUFBVSx5Q0FBWTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlGQUFpRixvQkFBb0IsU0FBUyxJQUFJO0FBQ2xIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIscURBQWlCO0FBQzFDO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRCxvQkFBb0I7QUFDL0U7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQzRCO0FBQ0k7QUFDWTtBQUN4QjtBQUNJO0FBQ2lFO0FBQ3BDO0FBQ2xCO0FBQ3lCO0FBQ2Q7QUFDeUI7QUFDdkUscUJBQXFCLGdEQUFLO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0ZBQXdGO0FBQ3hGLGlDQUFpQyxNQUFNLElBQUksU0FBUztBQUNwRDtBQUNPO0FBQ1AseUJBQXlCLHlFQUFxQjtBQUM5QztBQUNBO0FBQ0EsK0VBQStFLHdDQUFXLElBQUksR0FBRyxvQ0FBTyxHQUFHO0FBQzNHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLElBQUk7QUFDbkQ7QUFDQSxpQkFBaUIsa0VBQU87QUFDeEIsaUJBQWlCLGtFQUFPO0FBQ3hCLGlCQUFpQixrRUFBTztBQUN4QjtBQUNBLHVDQUF1QyxzREFBTyxrRUFBa0UsZ0JBQWdCO0FBQ2hJO0FBQ0E7QUFDQSx5QkFBeUIsMEVBQWU7QUFDeEM7QUFDQTtBQUNBLHlCQUF5QiwwRUFBZTtBQUN4QztBQUNBO0FBQ0EseUJBQXlCLDBFQUFlO0FBQ3hDO0FBQ0E7QUFDQSx5QkFBeUIsMEVBQWU7QUFDeEM7QUFDQTtBQUNBLHlCQUF5QiwwRUFBZTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EscUVBQXFFLElBQUk7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIseUVBQXFCO0FBQzlDO0FBQ0EsK0VBQStFLHdDQUFXLElBQUksR0FBRyxvQ0FBTyxHQUFHO0FBQzNHO0FBQ0E7QUFDQSxJQUFJLG1DQUFNLGtEQUFrRCxJQUFJO0FBQ2hFLHNCQUFzQiw0Q0FBSztBQUMzQjtBQUNBLHdCQUF3QixzQ0FBUyxpQkFBaUIsZ0JBQWdCLEdBQUcsU0FBUztBQUM5RSxTQUFTLDhDQUFVO0FBQ25CLGNBQWMsa0RBQUssZ0JBQWdCLGlCQUFpQjtBQUNwRDtBQUNBO0FBQ0EsWUFBWSw4Q0FBVTtBQUN0QjtBQUNBO0FBQ0EsZ0RBQWdELElBQUk7QUFDcEQ7QUFDQSxjQUFjLDJEQUFZO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDhDQUFVO0FBQ3RCLHlDQUF5Qyx1REFBZ0I7QUFDekQsaUJBQWlCLDhDQUFVO0FBQzNCLHVEQUF1RCxXQUFXLCtCQUErQixnQ0FBZ0M7QUFDakk7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELElBQUk7QUFDcEQ7QUFDQTtBQUNBLGtCQUFrQiwyREFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxhQUFhLEtBQUssV0FBVztBQUNoRTtBQUNBO0FBQ0Esa0JBQWtCLDJEQUFhO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLHVEQUFnQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSw4Q0FBVTtBQUN0QixrQkFBa0IsbURBQU07QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLHlCQUF5Qix5RUFBcUI7QUFDOUM7QUFDQSxtRUFBbUUsd0NBQVcsSUFBSSxHQUFHLG9DQUFPLEdBQUc7QUFDL0Y7QUFDQSxRQUFRLDRDQUFLO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxlQUFlLDRDQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCx5QkFBeUIseUVBQXFCO0FBQzlDO0FBQ0EsK0VBQStFLHdDQUFXLElBQUksR0FBRyxvQ0FBTyxHQUFHO0FBQzNHO0FBQ0EsaUJBQWlCLDhEQUFlO0FBQ2hDO0FBQ0E7QUFDQSxtQkFBbUIsdUVBQVk7QUFDL0I7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3lDO0FBQ1Q7QUFDWjtBQUNZO0FBQzhDO0FBQzNDO0FBQ0E7QUFDeUI7QUFDNUQsb0JBQW9CLGdEQUFLO0FBQ3pCO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsZUFBZSw0Q0FBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AseUJBQXlCLHlFQUFxQjtBQUM5QztBQUNBLCtFQUErRSx3Q0FBVyxJQUFJLEdBQUcsb0NBQU8sR0FBRztBQUMzRztBQUNBLGlCQUFpQiwwRkFBMkI7QUFDNUM7QUFDQSxRQUFRLDhDQUFVO0FBQ2xCO0FBQ0E7QUFDQSxnRkFBZ0YsZ0JBQWdCLFFBQVEsS0FBSztBQUM3RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsaUNBQWlDLHNCQUFzQixFQUFFLHFCQUFxQjtBQUM5RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLElBQUk7QUFDakI7QUFDQSxTQUFTO0FBQ1QsK0JBQStCLGdEQUFrQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsZ0NBQWdDLHlCQUF5QjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQywwQkFBMEI7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyx5QkFBeUI7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsMEJBQTBCO0FBQ3pFO0FBQ0E7QUFDQSx3QkFBd0IsbURBQXFCLGtCQUFrQiwwQkFBMEI7QUFDekY7QUFDQTtBQUNBLCtDQUErQywwQkFBMEI7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQywwQkFBMEI7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywwQkFBMEIsaUJBQWlCLHlDQUF5QztBQUN2SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFEQUF3QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxpQ0FBaUM7QUFDN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRCxTQUFTO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25YQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3dMO0FBQ2xHO0FBQzFCO0FBQzBGO0FBQ2pHO0FBQ0E7QUFDckQ7Ozs7Ozs7Ozs7Ozs7Ozs7QUNYYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFFBQVEsVUFBVTtBQUMxQyw4REFBOEQ7QUFDOUQsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsWUFBWTtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsT0FBTztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQsVUFBVSxLQUFLO0FBQ1I7QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUk7QUFDM0M7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxQkE7QUFDNEM7QUFDaUI7O0FBRTlDO0FBQ2YsU0FBUywwREFBSztBQUNkO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsYUFBYTtBQUNiLFFBQVE7QUFDUixHQUFHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1ptQzs7QUFFbkM7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEVBQUUsc0NBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2YyQjtBQUNHOztBQUUzQyw2QkFBZSxvQ0FBVTtBQUN6QixXQUFXLDZDQUFPO0FBQ2xCLGtCQUFrQiw0Q0FBUTs7QUFFMUI7QUFDQSxRQUFRLDZDQUFPO0FBQ2Y7O0FBRUE7QUFDQSxzQkFBc0IsK0NBQVc7QUFDakMsa0JBQWtCLDZDQUFPO0FBQ3pCLFFBQVEsNkNBQU87QUFDZjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3dGO0FBQy9CO0FBQytCO0FBQ2Q7QUFDMUU7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxlQUFlO0FBQ25CO0FBQ0EsdUJBQXVCLHlCQUF5QjtBQUNoRCxrQkFBa0IsMkJBQTJCO0FBQzdDO0FBQ0EsSUFBSSxnQkFBZ0IsaUNBQWlDO0FBQ3JELHNCQUFzQixvQkFBb0I7QUFDMUM7QUFDQSxxQkFBcUIsZUFBZSxhQUFhLFdBQVc7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsY0FBYztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGtCQUFrQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxzQkFBc0IsaUVBQVk7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsdUJBQXVCO0FBQzdDO0FBQ0E7QUFDQSxnQ0FBZ0Msd0NBQXdDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DLGdCQUFnQixzQkFBc0I7QUFDdEMscUJBQXFCLHlFQUFjLENBQUMsZ0VBQUssQ0FBQyxpRUFBZ0IsMERBQTBELGlFQUFnQiwwREFBMEQsK0RBQUksdUJBQXVCLDREQUFXLGFBQWEsbUVBQVEsQ0FBQyx3REFBTztBQUNqUTtBQUNBO0FBQ0EsZ0NBQWdDLG9CQUFvQixhQUFhLGNBQWM7QUFDL0U7QUFDQSw2QkFBNkIsd0NBQXdDO0FBQ3JFLG9CQUFvQixvQkFBb0I7QUFDeEMsUUFBUSx3Q0FBd0M7QUFDaEQ7QUFDQSw2QkFBNkIsbUJBQW1CO0FBQ2hELHlEQUF5RCxrQkFBa0I7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSwrQ0FBK0Msd0JBQXdCO0FBQ3ZFO0FBQ0Esd0JBQXdCLGtDQUFrQztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyw4REFBYTtBQUNsQjtBQUNBLDJDQUEyQyx1REFBVTtBQUNyRDtBQUNBLDRDQUE0Qyx1REFBVTtBQUN0RDtBQUNBO0FBQ0EsS0FBSyxtRUFBa0I7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDd0Y7QUFDL0I7QUFDK0I7QUFDZDtBQUNqQztBQUN6QztBQUNBLElBQUksc0JBQXNCO0FBQzFCLElBQUksd0JBQXdCO0FBQzVCO0FBQ0EsV0FBVyx5QkFBeUI7QUFDcEMsSUFBSSx3Q0FBd0M7QUFDNUMsVUFBVSxtQ0FBbUM7QUFDN0M7QUFDQTtBQUNBLElBQUksdUJBQXVCLDRCQUE0QjtBQUN2RCxzQkFBc0IsMkJBQTJCO0FBQ2pEO0FBQ0EsU0FBUyxtQkFBbUIsZUFBZSxrQkFBa0I7QUFDN0QsdURBQXVEO0FBQ3ZELDRCQUE0QjtBQUM1QjtBQUNBLDRCQUE0Qix1Q0FBdUM7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDZCQUE2QixpRUFBWTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsaURBQUs7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHVCQUF1QjtBQUM3QztBQUNBO0FBQ0EsZ0NBQWdDLHdDQUF3QztBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQyxnQkFBZ0Isc0JBQXNCO0FBQ3RDLHFCQUFxQix5RUFBYyxDQUFDLGdFQUFLLENBQUMsaUVBQWdCLGlFQUFpRSxpRUFBZ0IsaUVBQWlFLCtEQUFJLHVCQUF1Qiw0REFBVyxhQUFhLG1FQUFRLENBQUMsd0RBQU87QUFDL1E7QUFDQTtBQUNBLHFCQUFxQix3Q0FBd0M7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qix1Q0FBdUM7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssOERBQWE7QUFDbEIsdUNBQXVDLHVEQUFVO0FBQ2pEO0FBQ0E7QUFDQSxLQUFLLG1FQUFrQjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsSHlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsMENBQTBDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsdUJBQXVCO0FBQy9EO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsUUFBUSwySEFBMkg7QUFDbkk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDTyx5QkFBeUIsaUVBQVk7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUMyQztBQUMzQztBQUNBLDJDQUEyQyxZQUFZO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx1REFBTTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHVEQUFNO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixTQUFJLElBQUksU0FBSTtBQUNyQztBQUNBLG9CQUFvQix5QkFBeUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsU0FBSSxJQUFJLFNBQUk7QUFDaEMseUJBQXlCLHVGQUF1RjtBQUNoSDtBQUNBO0FBQ0EsMkdBQTJHO0FBQzNHO0FBQ0Esd0NBQXdDLFFBQVE7QUFDaEQ7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQSxnREFBZ0QseUZBQXlGO0FBQ3pJLGdFQUFnRSwyQ0FBMkM7QUFDM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFNBQUksSUFBSSxTQUFJO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qiw4Q0FBOEM7QUFDdkU7QUFDQTtBQUNBLHlCQUF5QixhQUFhO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixTQUFJLElBQUksU0FBSTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJGQUEyRixTQUFTLGdCQUFnQjtBQUNwSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRCx5QkFBeUIsU0FBSSxJQUFJLFNBQUk7QUFDckM7QUFDQSw4Q0FBOEMseUVBQXlFO0FBQ3ZIO0FBQzBFO0FBQzNCO0FBQzRCO0FBQ2hDO0FBQ3NCO0FBQ1Q7QUFDSTtBQUNuQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxjQUFjO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsY0FBYyxrQ0FBa0M7QUFDaEQ7QUFDQTtBQUNBLHdEQUF3RCxrQkFBa0I7QUFDMUUsSUFBSSxxQkFBcUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isa0RBQVE7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLG9FQUFlO0FBQ3RELHlDQUF5QyxvRUFBZTtBQUN4RCxxQ0FBcUMsb0VBQWU7QUFDcEQsNkJBQTZCLG9FQUFlO0FBQzVDLDhCQUE4QixvRUFBZTtBQUM3QztBQUNBLDJDQUEyQyxvRUFBZTtBQUMxRCxxQ0FBcUMsb0VBQWU7QUFDcEQsb0NBQW9DLG9FQUFlO0FBQ25ELHFDQUFxQyxvRUFBZTtBQUNwRCwwQ0FBMEMsb0VBQWU7QUFDekQsaUNBQWlDLG9FQUFlO0FBQ2hELGlDQUFpQyxvRUFBZTtBQUNoRCxnQ0FBZ0Msb0VBQWU7QUFDL0MscUNBQXFDLG9FQUFlO0FBQ3BELG9DQUFvQyxvRUFBZTtBQUNuRCxnQ0FBZ0Msb0VBQWU7QUFDL0MsdUNBQXVDLG9FQUFlO0FBQ3RELGtDQUFrQyxvRUFBZTtBQUNqRCwrQkFBK0Isb0VBQWU7QUFDOUMsc0NBQXNDLG9FQUFlO0FBQ3JELHFDQUFxQyxvRUFBZTtBQUNwRCxvQ0FBb0Msb0VBQWU7QUFDbkQsaUNBQWlDLG9FQUFlO0FBQ2hELGdDQUFnQyxvRUFBZTtBQUMvQyxpQ0FBaUMsb0VBQWU7QUFDaEQsdUNBQXVDLG9FQUFlO0FBQ3RELG9DQUFvQyxvRUFBZTtBQUNuRCxzQ0FBc0Msb0VBQWU7QUFDckQsa0RBQWtELG9FQUFlO0FBQ2pFLDBDQUEwQyxvRUFBZTtBQUN6RCxnRUFBZ0UsOEVBQThFLCtEQUErRCx1QkFBdUI7QUFDcE8sa0VBQWtFLGdGQUFnRixtRUFBbUUsdUJBQXVCO0FBQzVPLDhEQUE4RCw0RUFBNEUsMkRBQTJELHVCQUF1QjtBQUM1TixzREFBc0Qsb0VBQW9FLDJDQUEyQyx1QkFBdUI7QUFDNUwsdURBQXVELHFFQUFxRSw2Q0FBNkMsdUJBQXVCO0FBQ2hNLDBEQUEwRDtBQUMxRDtBQUNBLGlCQUFpQixVQUFVLDRCQUE0QixxRUFBcUUsNkNBQTZDLHVCQUF1QjtBQUNoTSxvRUFBb0Usa0ZBQWtGLHVFQUF1RSx1QkFBdUI7QUFDcFAsOERBQThELDRFQUE0RSwyREFBMkQsdUJBQXVCO0FBQzVOLDZEQUE2RCwyRUFBMkUseURBQXlELHVCQUF1QjtBQUN4Tiw4REFBOEQsNEVBQTRFLDJEQUEyRCx1QkFBdUI7QUFDNU4sbUVBQW1FLGlGQUFpRixxRUFBcUUsdUJBQXVCO0FBQ2hQLDBEQUEwRCx3RUFBd0UsbURBQW1ELHVCQUF1QjtBQUM1TSwwREFBMEQsd0VBQXdFLG1EQUFtRCx1QkFBdUI7QUFDNU0seURBQXlELHVFQUF1RSxpREFBaUQsdUJBQXVCO0FBQ3hNLDhEQUE4RCw0RUFBNEUsMkRBQTJELHVCQUF1QjtBQUM1Tiw2REFBNkQsMkVBQTJFLHlEQUF5RCx1QkFBdUI7QUFDeE4seURBQXlELHVFQUF1RSxpREFBaUQsdUJBQXVCO0FBQ3hNLGdFQUFnRSw4RUFBOEUsK0RBQStELHVCQUF1QjtBQUNwTywyREFBMkQseUVBQXlFLHFEQUFxRCx1QkFBdUI7QUFDaE4sd0RBQXdELHNFQUFzRSwrQ0FBK0MsdUJBQXVCO0FBQ3BNLCtEQUErRCw2RUFBNkUsNkRBQTZELHVCQUF1QjtBQUNoTyw4REFBOEQsNEVBQTRFLDJEQUEyRCx1QkFBdUI7QUFDNU4sNkRBQTZELDJFQUEyRSx5REFBeUQsdUJBQXVCO0FBQ3hOLDBEQUEwRCx3RUFBd0UsbURBQW1ELHVCQUF1QjtBQUM1TSx5REFBeUQsdUVBQXVFLGlEQUFpRCx1QkFBdUI7QUFDeE0sMERBQTBELHdFQUF3RSxtREFBbUQsdUJBQXVCO0FBQzVNLGdFQUFnRSw4RUFBOEUsK0RBQStELHVCQUF1QjtBQUNwTyw2REFBNkQsMkVBQTJFLHlEQUF5RCx1QkFBdUI7QUFDeE4sK0RBQStELDZFQUE2RSw2REFBNkQsdUJBQXVCO0FBQ2hPLDJFQUEyRSx5RkFBeUYscUZBQXFGLHVCQUF1QjtBQUNoUixtRUFBbUUsaUZBQWlGLHFFQUFxRSx1QkFBdUI7QUFDaFAsMEVBQTBFLHdFQUF3RTtBQUNsSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxrREFBUTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsa0RBQVE7QUFDcEQ7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsa0RBQVE7QUFDckQ7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLHFFQUFnQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDZFQUE0QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsNkVBQTRCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVksOEVBQThFO0FBQzFGLFlBQVksNEZBQTRGO0FBQ3hHO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWSw4SEFBOEg7QUFDMUk7QUFDQSxZQUFZLGtGQUFrRjtBQUM5Rix1QkFBdUIsc0NBQXNDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQ0FBZ0MsRUFBRSxzRkFBMEI7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWSw4RUFBOEU7QUFDMUYsWUFBWSw0RkFBNEY7QUFDeEc7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZLDhIQUE4SDtBQUMxSTtBQUNBLFlBQVksa0ZBQWtGO0FBQzlGLGlDQUFpQyx1Q0FBdUM7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHdCQUF3QjtBQUM3QztBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSwrQkFBK0IsdUJBQXVCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdDQUFnQyxFQUFFLHNGQUEwQjtBQUNoRix5QkFBeUIseUVBQWlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVksOEVBQThFO0FBQzFGLFlBQVksNEZBQTRGO0FBQ3hHO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWSw4SEFBOEg7QUFDMUk7QUFDQSxZQUFZLGtGQUFrRjtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLCtCQUErQiw2RUFBNEI7QUFDM0Q7QUFDQTtBQUNBLHdGQUF3RixTQUFTO0FBQ2pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZLDhFQUE4RTtBQUMxRixZQUFZLDRGQUE0RjtBQUN4RztBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVksOEhBQThIO0FBQzFJO0FBQ0EsWUFBWSxrRkFBa0Y7QUFDOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSwrQkFBK0IsNkVBQTRCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsNEJBQTRCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRCxvQkFBb0IseUNBQXlDLEVBQUUsc0ZBQTBCO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsRUFBRSx1REFBTztBQUN0QjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGlHQUFpRztBQUMvRztBQUNBO0FBQ0EsY0FBYyw0R0FBNEc7QUFDMUg7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxpR0FBaUc7QUFDL0c7QUFDQTtBQUNBLGNBQWMsNEdBQTRHO0FBQzFIO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSx5REFBeUQsUUFBUTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0NBQWtDO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msa0NBQWtDO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHVEQUFNO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVEQUFNLENBQUMseURBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsZUFBZTtBQUMxRSw0REFBNEQsZUFBZTtBQUMzRTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxZQUFZLHVCQUF1QjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrRkFBa0Y7QUFDcEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDBCQUEwQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5Qyw4Q0FBOEMsV0FBVyxHQUFHO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxxQkFBcUIsS0FBSyxrQkFBa0I7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZ0JBQWdCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQ0FBZ0M7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsS0FBSztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxzQkFBc0IsMkJBQTJCO0FBQ2pELHNCQUFzQix3Q0FBd0M7QUFDOUQsc0JBQXNCLHNEQUFzRDtBQUM1RSxzQkFBc0IseUNBQXlDO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxvQkFBb0IsOEJBQThCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQywrQkFBK0I7QUFDMUU7QUFDQTtBQUNBO0FBQ0EsWUFBWSx1REFBTTtBQUNsQixZQUFZLHVEQUFNO0FBQ2xCLFlBQVksdURBQU07QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLENBQUM7QUFDd0I7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUN6ekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQOzs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1U7QUFDVjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixTQUFJLElBQUksU0FBSTtBQUNyQztBQUNBLG9CQUFvQix5QkFBeUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsU0FBSSxJQUFJLFNBQUk7QUFDaEMseUJBQXlCLHVGQUF1RjtBQUNoSDtBQUNBO0FBQ0EsMkdBQTJHO0FBQzNHO0FBQ0Esd0NBQXdDLFFBQVE7QUFDaEQ7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQSxnREFBZ0QseUZBQXlGO0FBQ3pJLGdFQUFnRSwyQ0FBMkM7QUFDM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFNBQUksSUFBSSxTQUFJO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qiw4Q0FBOEM7QUFDdkU7QUFDQTtBQUNBLHlCQUF5QixhQUFhO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixTQUFJLElBQUksU0FBSTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJGQUEyRixTQUFTLGdCQUFnQjtBQUNwSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDd0Q7QUFDaUI7QUFDSjtBQUNjO0FBQ3pDO0FBQ2E7QUFDZTtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGdDQUFnQztBQUNqQztBQUNBO0FBQ0E7QUFDTyx3QkFBd0Isb0VBQWU7QUFDOUMsK0NBQStDLFVBQVU7QUFDekQsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixvQkFBb0I7QUFDOUMsaUJBQWlCLHNCQUFzQixLQUFLLHlCQUF5QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQSxNQUFNO0FBQ04sTUFBTTtBQUNOLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixpRUFBWTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLCtFQUErRSxpRUFBaUUsdUJBQXVCO0FBQ3hPLG1FQUFtRSxpRkFBaUYscUVBQXFFLHVCQUF1QjtBQUNoUCw2REFBNkQsMkVBQTJFLHlEQUF5RCx1QkFBdUI7QUFDeE4sNERBQTRELDBFQUEwRSx1REFBdUQsdUJBQXVCO0FBQ3BOLHNEQUFzRCxvRUFBb0UsMkNBQTJDLHVCQUF1QjtBQUM1TCx1REFBdUQscUVBQXFFLDZDQUE2Qyx1QkFBdUI7QUFDaE0sMERBQTBELHdFQUF3RSxtREFBbUQsdUJBQXVCO0FBQzVNLDJEQUEyRCx5RUFBeUUscURBQXFELHVCQUF1QjtBQUNoTixvRUFBb0Usa0ZBQWtGLHVFQUF1RSx1QkFBdUI7QUFDcFAsb0VBQW9FLGtGQUFrRix1RUFBdUUsdUJBQXVCO0FBQ3BQLDREQUE0RCwwRUFBMEUsdURBQXVELHVCQUF1QjtBQUNwTixpRUFBaUUsK0VBQStFLGlFQUFpRSx1QkFBdUI7QUFDeE8sZ0VBQWdFLDhFQUE4RSwrREFBK0QsdUJBQXVCO0FBQ3BPLDBEQUEwRCx3RUFBd0UsbURBQW1ELHVCQUF1QjtBQUM1TSwwREFBMEQsd0VBQXdFLG1EQUFtRCx1QkFBdUI7QUFDNU0sMERBQTBELHdFQUF3RSxtREFBbUQsdUJBQXVCO0FBQzVNLDJEQUEyRCx5RUFBeUUscURBQXFELHVCQUF1QjtBQUNoTix3REFBd0Qsc0VBQXNFLCtDQUErQyx1QkFBdUI7QUFDcE0seURBQXlELHVFQUF1RSxpREFBaUQsdUJBQXVCO0FBQ3hNLDBEQUEwRCx3RUFBd0UsbURBQW1ELHVCQUF1QjtBQUM1TSwwRUFBMEUsd0VBQXdFO0FBQ2xKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQiw2Q0FBNkMsa0ZBQXVCO0FBQ3BFLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDJCQUEyQjtBQUM5RDtBQUNBO0FBQ0EsZ0JBQWdCLDJCQUEyQjtBQUMzQztBQUNBO0FBQ0EsMkJBQTJCLDZFQUE0QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMscUJBQXFCO0FBQ3hEO0FBQ0E7QUFDQSxnQkFBZ0IscUJBQXFCO0FBQ3JDO0FBQ0E7QUFDQSwyQkFBMkIsNkVBQTRCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDhEQUFXO0FBQ2xDO0FBQ0E7QUFDQSx1QkFBdUIsa0VBQWU7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWSw4RUFBOEU7QUFDMUYsWUFBWSw0RkFBNEY7QUFDeEc7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZLDhIQUE4SDtBQUMxSTtBQUNBLFlBQVksa0ZBQWtGO0FBQzlGO0FBQ0EsdUJBQXVCLHNDQUFzQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWSw4RUFBOEU7QUFDMUYsWUFBWSw0RkFBNEY7QUFDeEc7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZLDhIQUE4SDtBQUMxSTtBQUNBLFlBQVksa0ZBQWtGO0FBQzlGO0FBQ0EsaUNBQWlDLHVDQUF1QztBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZLDhFQUE4RTtBQUMxRixZQUFZLDRGQUE0RjtBQUN4RztBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVksOEhBQThIO0FBQzFJO0FBQ0EsWUFBWSxrRkFBa0Y7QUFDOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsNkVBQTRCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVksOEVBQThFO0FBQzFGLFlBQVksNEZBQTRGO0FBQ3hHO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWSw4SEFBOEg7QUFDMUk7QUFDQSxZQUFZLGtGQUFrRjtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiw2RUFBNEI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQsb0JBQW9CLHlDQUF5QyxFQUFFLHNGQUEwQjtBQUN6RjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHNCQUFzQjtBQUN0RDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isc0NBQXNDO0FBQzlEO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkMsb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsaUVBQWdCO0FBQ2pEO0FBQ0EsNENBQTRDLHdCQUF3QjtBQUNwRTtBQUNBO0FBQ0EsNEdBQTRHLHdCQUF3QjtBQUNwSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsSUFBSSxZQUFZO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLElBQUksWUFBWTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYSxJQUFJLDJCQUEyQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGVBQWU7QUFDakMsb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsaUVBQWdCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEdBQTRHLGNBQWM7QUFDMUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixJQUFJLFlBQVk7QUFDckM7QUFDQTtBQUNBLHFCQUFxQixJQUFJLFlBQVk7QUFDckM7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUMsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxnQkFBZ0IsdURBQU0sMkNBQTJDLFNBQVM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxnQkFBZ0IsdURBQU0sMkNBQTJDLFNBQVM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxnQkFBZ0IsdURBQU0sMkNBQTJDLFNBQVM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRCxrRUFBa0U7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBLGdCQUFnQix1REFBTSwyQ0FBMkMsU0FBUztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxnQkFBZ0IsdURBQU0sMkNBQTJDLFNBQVM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFCQUFxQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRCxxREFBcUQsV0FBVyxHQUFHO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0EsZ0JBQWdCLHVEQUFNLDJDQUEyQyxTQUFTO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxDQUFDO0FBQ2dCO0FBQ2pCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbjNCeUQ7QUFDZDtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHVEQUFNO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHVEQUFNO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx1REFBTTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCx5Q0FBeUM7QUFDekMsZ0JBQWdCLFNBQVM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsMkJBQTJCLFFBQVE7QUFDbkMsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsa0NBQWtDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdURBQU07QUFDZCxRQUFRLHVEQUFNO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsa0NBQWtDO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHVEQUFNO0FBQ2QsUUFBUSx1REFBTTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxrQ0FBa0M7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdURBQU07QUFDZCxRQUFRLHVEQUFNO0FBQ2QsUUFBUSx1REFBTTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qix5REFBUTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw4REFBOEQ7QUFDL0Q7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksMkRBQVU7QUFDZDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUMvY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVk7QUFDaEI7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3lEO0FBQ2Q7QUFDc0I7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHVEQUFNLHlEQUF5RCxVQUFVO0FBQ2pGO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDdUQ7QUFDRTtBQUNnQjtBQUNoQjtBQUNkO0FBQ2E7QUFDTjtBQUNFO0FBQ1k7QUFDaEU7QUFDQTtBQUNBO0FBQ08sNkJBQTZCLGlFQUFZO0FBQ2hEO0FB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QTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGFBQWEsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGFBQWEsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGFBQWEsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGFBQWEsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGFBQWEsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGFBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsYUFBYTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUMsdUNBQXVDLFNBQVM7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUMsdUNBQXVDLFNBQVM7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsR0FBRyxPQUFPO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLEdBQUcsT0FBTztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGVBQWUsT0FBTztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGVBQWUsT0FBTztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFEQUFxRCxlQUFlLFdBQVc7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxxREFBcUQsZUFBZSxXQUFXO0FBQy9FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EscURBQXFELGVBQWUsV0FBVztBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGFBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsYUFBYTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSw2Q0FBNkMsV0FBVyxtQkFBbUIsYUFBYSxlQUFlLEtBQUssT0FBTyxPQUFPO0FBQzFIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsNkNBQTZDLFdBQVcsbUJBQW1CLGFBQWEsZUFBZSxLQUFLLE9BQU8sT0FBTztBQUMxSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGFBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxZQUFZO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLFlBQVk7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsWUFBWTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxZQUFZO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLFlBQVk7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsWUFBWTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGFBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxtQkFBbUI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3I0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLG1EQUFtRDtBQUM5RSxJQUFJLDhDQUE4QztBQUNsRDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2tEO0FBQ0k7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLDRCQUE0QjtBQUN6RSxJQUFJLDhCQUE4QjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIscUVBQUk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSw4REFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyw4REFBYTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLDhEQUFhO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsK0JBQStCO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsMEZBQTBGO0FBQ2xHO0FB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Q2pPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUZBQW1GO0FBQ25GO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFh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LEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHVCQUF1QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHVCQUF1QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFLFVBQVU7QUFDcEY7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLGtCQUFrQjtBQUNsQixVQUFVO0FBQ1Y7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUNBQXVDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix5Q0FBeUM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsdUJBQXVCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsS0FBSyxFQUFFLEVBQWM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix3Q0FBd0M7QUFDNUQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRkFBa0Ysb0JBQW9CO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixjQUFjO0FBQ2QsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsdUJBQXVCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG9CQUFvQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQsMkRBQVM7QUFDdEU7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esc0RBQXNEO1dBQ3RELHNDQUFzQyxpRUFBaUU7V0FDdkc7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOzs7OztXQ3pCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBOzs7OztXQ1BBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRUFBRTtXQUNGOzs7OztXQ1JBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7Ozs7O1dDSkE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7OztXQ05BO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7Ozs7O1dDSkE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsZ0JBQWdCLHFCQUFxQjtXQUNyQzs7V0FFQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGFBQWE7V0FDYjtXQUNBLElBQUk7V0FDSjtXQUNBOztXQUVBOztXQUVBOztXQUVBOzs7OztVRXJDQTtVQUNBO1VBQ0E7VUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvbm9kZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2FzeW5jaWZ5LWhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9jb250ZXh0LWFzeW5jaWZ5LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvY29udGV4dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2RlYnVnLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvZGVmZXJyZWQtcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2Vycm9ycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2VzbUhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9nZW5lcmF0ZWQvZW1zY3JpcHRlbi1tb2R1bGUuV0FTTV9SRUxFQVNFX1NZTkMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9nZW5lcmF0ZWQvZmZpLldBU01fUkVMRUFTRV9TWU5DLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9saWZldGltZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L21lbW9yeS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L21vZHVsZS1hc3luY2lmeS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L21vZHVsZS10ZXN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvbW9kdWxlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvcnVudGltZS1hc3luY2lmeS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L3J1bnRpbWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC90eXBlcy1mZmkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC90eXBlcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L3ZhcmlhbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3Qvdm0taW50ZXJmYWNlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hZ2VudC1iYXNlL2Rpc3QvaGVscGVycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYWdlbnQtYmFzZS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hbnNpLXJlZ2V4L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hbnNpLXN0eWxlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi9iYWJlbC1jb3JlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2JhYmVsLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2NvcmUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvZXMtcHJvcG9zYWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2VzMjAyMC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi9lczYuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvZXM3LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2VzcHJpbWEuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvZmxvdy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi9qc3guanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvdHlwZS1hbm5vdGF0aW9ucy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi90eXBlc2NyaXB0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZm9yay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2dlbi9uYW1lZFR5cGVzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvbGliL2VxdWl2LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvbGliL25vZGUtcGF0aC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2xpYi9wYXRoLXZpc2l0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9saWIvcGF0aC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2xpYi9zY29wZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2xpYi9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9saWIvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9tYWluLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iNGEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L0NsaWVudC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvRmlsZUluZm8uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L0Z0cENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L1Byb2dyZXNzVHJhY2tlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvU3RyaW5nRW5jb2RpbmcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L1N0cmluZ1dyaXRlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L25ldFV0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC9wYXJzZUNvbnRyb2xSZXNwb25zZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvcGFyc2VMaXN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC9wYXJzZUxpc3RET1MuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L3BhcnNlTGlzdE1MU0QuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L3BhcnNlTGlzdFVuaXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L3RyYW5zZmVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9idWZmZXItY3JjMzIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2J1ZmZlcnV0aWwvZmFsbGJhY2suanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2J1ZmZlcnV0aWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvY29udmVyc2lvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvcm91dGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbG9yLW5hbWUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RhdGEtdXJpLXRvLWJ1ZmZlci9kaXN0L2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGF0YS11cmktdG8tYnVmZmVyL2Rpc3Qvbm9kZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9jb21tb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RlZ2VuZXJhdG9yL2Rpc3QvY29tcGlsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGVnZW5lcmF0b3IvZGlzdC9kZWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGVnZW5lcmF0b3IvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZW1vamktcmVnZXgvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VuZC1vZi1zdHJlYW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzY2FsYWRlL3N5bmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzY29kZWdlbi9lc2NvZGVnZW4uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzcHJpbWEvZGlzdC9lc3ByaW1hLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9lc3RyYXZlcnNlL2VzdHJhdmVyc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzdXRpbHMvbGliL2FzdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZXN1dGlscy9saWIvY29kZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZXN1dGlscy9saWIva2V5d29yZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZXN1dGlscy9saWIvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2V4dHJhY3QtemlwL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mYXN0LWZpZm8vZml4ZWQtc2l6ZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZmFzdC1maWZvL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mZC1zbGljZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9jb3B5L2NvcHktc3luYy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2NvcHkvY29weS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2NvcHkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9lbXB0eS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2Vuc3VyZS9maWxlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvZW5zdXJlL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvZW5zdXJlL2xpbmsuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9lbnN1cmUvc3ltbGluay1wYXRocy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2Vuc3VyZS9zeW1saW5rLXR5cGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9lbnN1cmUvc3ltbGluay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2ZzL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9qc29uL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvanNvbi9qc29uZmlsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2pzb24vb3V0cHV0LWpzb24tc3luYy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2pzb24vb3V0cHV0LWpzb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9ta2RpcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9ta2RpcnMvbWFrZS1kaXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9ta2RpcnMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9tb3ZlL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvbW92ZS9tb3ZlLXN5bmMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9tb3ZlL21vdmUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9vdXRwdXQtZmlsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL3BhdGgtZXhpc3RzL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvcmVtb3ZlL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvdXRpbC9zdGF0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvdXRpbC91dGltZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC1jYWxsZXItZmlsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXN0cmVhbS9idWZmZXItc3RyZWFtLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtc3RyZWFtL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtdXJpL2Rpc3QvZGF0YS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXVyaS9kaXN0L2ZpbGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC11cmkvZGlzdC9mdHAuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC11cmkvZGlzdC9odHRwLWVycm9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtdXJpL2Rpc3QvaHR0cC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXVyaS9kaXN0L2h0dHBzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtdXJpL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC11cmkvZGlzdC9ub3Rmb3VuZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXVyaS9kaXN0L25vdG1vZGlmaWVkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9ncmFjZWZ1bC1mcy9jbG9uZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ3JhY2VmdWwtZnMvZ3JhY2VmdWwtZnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dyYWNlZnVsLWZzL2xlZ2FjeS1zdHJlYW1zLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9ncmFjZWZ1bC1mcy9wb2x5ZmlsbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2hhcy1mbGFnL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9odHRwLXByb3h5LWFnZW50L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2h0dHBzLXByb3h5LWFnZW50L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2h0dHBzLXByb3h5LWFnZW50L2Rpc3QvcGFyc2UtcHJveHktcmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2lwLWFkZHJlc3MvZGlzdC9hZGRyZXNzLWVycm9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvY29tbW9uLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvaXAtYWRkcmVzcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvaXAtYWRkcmVzcy9kaXN0L2lwdjQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2lwLWFkZHJlc3MvZGlzdC9pcHY2LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvdjQvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvdjYvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvdjYvaGVscGVycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvaXAtYWRkcmVzcy9kaXN0L3Y2L3JlZ3VsYXItZXhwcmVzc2lvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9qc2JuL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9qc29uZmlsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvanNvbmZpbGUvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9uZXRtYXNrL2xpYi9uZXRtYXNrLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9ub2RlLWd5cC1idWlsZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvbm9kZS1neXAtYnVpbGQvbm9kZS1neXAtYnVpbGQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL29uY2Uvb25jZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXByb3h5LWFnZW50L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2RhdGVSYW5nZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvZG5zRG9tYWluSXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2Ruc0RvbWFpbkxldmVscy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvZG5zUmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2lwLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wYWMtcmVzb2x2ZXIvZGlzdC9pc0luTmV0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wYWMtcmVzb2x2ZXIvZGlzdC9pc1BsYWluSG9zdE5hbWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2lzUmVzb2x2YWJsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvbG9jYWxIb3N0T3JEb21haW5Jcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvbXlJcEFkZHJlc3MuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L3NoRXhwTWF0Y2guanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L3RpbWVSYW5nZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvdXRpbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3Qvd2Vla2RheVJhbmdlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wZW5kL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wcm9ncmVzcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHJvZ3Jlc3MvbGliL25vZGUtcHJvZ3Jlc3MuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Byb3h5LWFnZW50L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Byb3h5LWZyb20tZW52L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdW1wL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9xdWV1ZS10aWNrL3Byb2Nlc3MtbmV4dC10aWNrLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9xdWV1ZS10aWNrL3F1ZXVlLW1pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcmVxdWlyZS1kaXJlY3RvcnkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9jbGFzc2VzL2NvbXBhcmF0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9jbGFzc2VzL3JhbmdlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvY2xhc3Nlcy9zZW12ZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY2xlYW4uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY21wLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2NvZXJjZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLWJ1aWxkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUtbG9vc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9kaWZmLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2VxLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2d0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2d0ZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9pbmMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvbHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvbHRlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL21ham9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL21pbm9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL25lcS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9wYXJzZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9wYXRjaC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9wcmVyZWxlYXNlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3Jjb21wYXJlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3Jzb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3NhdGlzZmllcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9zb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3ZhbGlkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9kZWJ1Zy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL2lkZW50aWZpZXJzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvcGFyc2Utb3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL3JlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvbm9kZV9tb2R1bGVzL2xydS1jYWNoZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9ndHIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvaW50ZXJzZWN0cy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9sdHIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvbWF4LXNhdGlzZnlpbmcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvbWluLXNhdGlzZnlpbmcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvb3V0c2lkZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9zaW1wbGlmeS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9zdWJzZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvdG8tY29tcGFyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvdmFsaWQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NtYXJ0LWJ1ZmZlci9idWlsZC9zbWFydGJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc21hcnQtYnVmZmVyL2J1aWxkL3V0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb2Nrcy1wcm94eS1hZ2VudC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb2Nrcy9idWlsZC9jbGllbnQvc29ja3NjbGllbnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvY2tzL2J1aWxkL2NvbW1vbi9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvY2tzL2J1aWxkL2NvbW1vbi9oZWxwZXJzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb2Nrcy9idWlsZC9jb21tb24vcmVjZWl2ZWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc29ja3MvYnVpbGQvY29tbW9uL3V0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvY2tzL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2Jhc2U2NC12bHEuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2Jhc2U2NC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvbWFwcGluZy1saXN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9xdWljay1zb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwLWNvbnN1bWVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW5vZGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3V0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvc291cmNlLW1hcC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc3ByaW50Zi1qcy9zcmMvc3ByaW50Zi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc3RyZWFteC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc3RyaW5nLXdpZHRoL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zdHJpcC1hbnNpL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zdXBwb3J0cy1jb2xvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGFyLWZzL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGFyLXN0cmVhbS9leHRyYWN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL2hlYWRlcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Rhci1zdHJlYW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Rhci1zdHJlYW0vcGFjay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGV4dC1kZWNvZGVyL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90ZXh0LWRlY29kZXIvbGliL3Bhc3MtdGhyb3VnaC1kZWNvZGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90ZXh0LWRlY29kZXIvbGliL3V0ZjgtZGVjb2Rlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGhyb3VnaC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9zcmMvY29uZmlndXJhdGlvbi50cyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9zcmMvcGFnZXMvbG9naW4tYXMtcm9vdC1wYWdlLnRzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL3NyYy9wYWdlcy9zaWRlYmFyLXBhZ2UudHMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vc3JjL3BhZ2VzL3N0b3JhZ2UtZW5jcnlwdGlvbi1wYWdlLnRzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL3NyYy9wYWdlcy9zdG9yYWdlLXBhZ2UudHMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vc3JjL3Rlc3RzL2Z1bGxfZGlza19lbmNyeXB0aW9uLnRzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy91bmJ6aXAyLXN0cmVhbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdW5iemlwMi1zdHJlYW0vbGliL2JpdF9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdW5iemlwMi1zdHJlYW0vbGliL2J6aXAyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy91bml2ZXJzYWxpZnkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3V0Zi04LXZhbGlkYXRlL2ZhbGxiYWNrLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy91dGYtOC12YWxpZGF0ZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3JhcC1hbnNpL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cmFwcHkvd3JhcHB5LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cy9saWIvYnVmZmVyLXV0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9ldmVudC10YXJnZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9leHRlbnNpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9saW1pdGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cy9saWIvcGVybWVzc2FnZS1kZWZsYXRlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cy9saWIvcmVjZWl2ZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9zZW5kZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9zdHJlYW0uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9zdWJwcm90b2NvbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL3ZhbGlkYXRpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi93ZWJzb2NrZXQtc2VydmVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cy9saWIvd2Vic29ja2V0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YWxsaXN0L2l0ZXJhdG9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YWxsaXN0L3lhbGxpc3QuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC8gc3luYyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvIHN5bmMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhdXpsL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiYXNzZXJ0XCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJidWZmZXJcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImNoaWxkX3Byb2Nlc3NcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImNvbnN0YW50c1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiY3J5cHRvXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJkbnNcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImV2ZW50c1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiZnNcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImZzL3Byb21pc2VzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJodHRwXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJodHRwc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwibmV0XCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJub2RlOmFzc2VydC9zdHJpY3RcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwibm9kZTpldmVudHNcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm5vZGU6ZnNcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm5vZGU6cGF0aFwiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwibm9kZTpwcm9jZXNzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJub2RlOnRlc3RcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm9zXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJwYXRoXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJwcm9jZXNzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJyZWFkbGluZVwiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwic3RyZWFtXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJ0bHNcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInR0eVwiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwidXJsXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJ1dGlsXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJ6bGliXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NsaXVpL2J1aWxkL2luZGV4LmNqcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY29tbWFuZGVyL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jb21tYW5kZXIvbGliL2FyZ3VtZW50LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jb21tYW5kZXIvbGliL2NvbW1hbmQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvZXJyb3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvaGVscC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY29tbWFuZGVyL2xpYi9vcHRpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvc3VnZ2VzdFNpbWlsYXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2xydS1jYWNoZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveTE4bi9idWlsZC9pbmRleC5janMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9pbmRleC5janMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2luZGV4LmNqcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL0NMSS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL0NhY2hlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2Jyb3dzZXItZGF0YS9jaHJvbWUtaGVhZGxlc3Mtc2hlbGwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9icm93c2VyLWRhdGEvY2hyb21lLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vYnJvd3Nlci1kYXRhL2Nocm9tZWRyaXZlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2Jyb3dzZXItZGF0YS9jaHJvbWl1bS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2Jyb3dzZXItZGF0YS9maXJlZm94LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vYnJvd3Nlci1kYXRhL3R5cGVzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vZGVidWcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9kZXRlY3RQbGF0Zm9ybS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2ZpbGVVdGlsLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vaHR0cFV0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9pbnN0YWxsLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vbGF1bmNoLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vbWFpbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY2xpdWkvYnVpbGQvbGliL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jbGl1aS9idWlsZC9saWIvc3RyaW5nLXV0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jbGl1aS9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9lc20ubWpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9lc2NhbGFkZS9zeW5jL2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9Ccm93c2VyQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0NEUFNlc3Npb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9EaWFsb2cuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9FbGVtZW50SGFuZGxlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvRWxlbWVudEhhbmRsZVN5bWJvbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0Vudmlyb25tZW50LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvRnJhbWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9IVFRQUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0hUVFBSZXNwb25zZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0lucHV0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvSlNIYW5kbGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9QYWdlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvUmVhbG0uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9UYXJnZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9XZWJXb3JrZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9hcGkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9sb2NhdG9ycy9sb2NhdG9ycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYmlkaS9Ccm93c2VyQ29ubmVjdG9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQWNjZXNzaWJpbGl0eS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0FyaWFRdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9CaW5kaW5nLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0Jyb3dzZXJDb25uZWN0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9Ccm93c2VyQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0NEUFNlc3Npb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9DZHBQcmVsb2FkU2NyaXB0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQ2hyb21lVGFyZ2V0TWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0Nvbm5lY3Rpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9Db3ZlcmFnZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0RldmljZVJlcXVlc3RQcm9tcHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9EaWFsb2cuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9FbGVtZW50SGFuZGxlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRW11bGF0aW9uTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0V4ZWN1dGlvbkNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9FeHRlbnNpb25UcmFuc3BvcnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9GaXJlZm94VGFyZ2V0TWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0ZyYW1lLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRnJhbWVNYW5hZ2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRnJhbWVNYW5hZ2VyRXZlbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRnJhbWVUcmVlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvSFRUUFJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9IVFRQUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9JbnB1dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0lzb2xhdGVkV29ybGQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9Jc29sYXRlZFdvcmxkcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0pTSGFuZGxlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvTGlmZWN5Y2xlV2F0Y2hlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL05ldHdvcmtFdmVudE1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9OZXR3b3JrTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL1BhZ2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9QcmVkZWZpbmVkTmV0d29ya0NvbmRpdGlvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9UYXJnZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9UYXJnZXRNYW5hZ2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvVHJhY2luZy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL1dlYldvcmtlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL2NkcC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL3V0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQnJvd3NlckNvbm5lY3Rvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0Jyb3dzZXJXZWJTb2NrZXRUcmFuc3BvcnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9DU1NRdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9DYWxsYmFja1JlZ2lzdHJ5LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQ29uZmlndXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0Nvbm5lY3RPcHRpb25zLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQ29ubmVjdGlvblRyYW5zcG9ydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0NvbnNvbGVNZXNzYWdlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQ29va2llLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQ3VzdG9tUXVlcnlIYW5kbGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vRGVidWcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9EZXZpY2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9FcnJvcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9GaWxlQ2hvb3Nlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0dldFF1ZXJ5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0hhbmRsZUl0ZXJhdG9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vTGF6eUFyZy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL05ldHdvcmtNYW5hZ2VyRXZlbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vUERGT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1BRdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9QU2VsZWN0b3JQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9QaWVyY2VRdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9Qcm9kdWN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vUHVwcGV0ZWVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vUXVlcnlIYW5kbGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vU2NyaXB0SW5qZWN0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9TZWN1cml0eURldGFpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9UYXNrUXVldWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9UZXh0UXVlcnlIYW5kbGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vVGltZW91dFNldHRpbmdzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vVVNLZXlib2FyZExheW91dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1ZpZXdwb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vV2FpdFRhc2suanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9YUGF0aFF1ZXJ5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL3R5cGVzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vdXRpbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvZW52aXJvbm1lbnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2dlbmVyYXRlZC9pbmplY3RlZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvZ2VuZXJhdGVkL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2luZGV4LWJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL0Nocm9tZUxhdW5jaGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL0ZpcmVmb3hMYXVuY2hlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvbm9kZS9MYXVuY2hPcHRpb25zLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL05vZGVXZWJTb2NrZXRUcmFuc3BvcnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL25vZGUvUGlwZVRyYW5zcG9ydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvbm9kZS9Qcm9kdWN0TGF1bmNoZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL25vZGUvUHVwcGV0ZWVyTm9kZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvbm9kZS9TY3JlZW5SZWNvcmRlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvbm9kZS9ub2RlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL3V0aWwvZnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3B1cHBldGVlci1jb3JlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9yZXZpc2lvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvQXN5bmNJdGVyYWJsZVV0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvRGVmZXJyZWQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvRXJyb3JMaWtlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci91dGlsL0Z1bmN0aW9uLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci91dGlsL011dGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci91dGlsL2Fzc2VydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvdXRpbC9kZWNvcmF0b3JzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci91dGlsL2Rpc3Bvc2FibGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvdXRpbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS90aGlyZF9wYXJ0eS9taXR0L21pdHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vdGhpcmRfcGFydHkvcGFyc2VsLWpzL3BhcnNlbC1qcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL3dyYXBwZXIubWpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95MThuL2J1aWxkL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveTE4bi9idWlsZC9saWIvcGxhdGZvcm0tc2hpbXMvbm9kZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveTE4bi9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvc3RyaW5nLXV0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YXJncy1wYXJzZXIvYnVpbGQvbGliL3Rva2VuaXplLWFyZy1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIveWFyZ3MtcGFyc2VyLXR5cGVzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YXJncy1wYXJzZXIvYnVpbGQvbGliL3lhcmdzLXBhcnNlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL2FwcGx5LWV4dGVuZHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9wcm9jZXNzLWFyZ3YuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi95ZXJyb3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzL2hlbHBlcnMvaGVscGVycy5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzL2xpYi9wbGF0Zm9ybS1zaGltcy9lc20ubWpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YXJncy95YXJncy5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3Qvd2VicGFjay9ydW50aW1lL2NyZWF0ZSBmYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3Qvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3Qvd2VicGFjay9ydW50aW1lL2dldCBqYXZhc2NyaXB0IGNodW5rIGZpbGVuYW1lIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvcmVxdWlyZSBjaHVuayBsb2FkaW5nIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3N0YXJ0dXAiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSBsb2NhbHN0b3JhZ2UoKTtcbmV4cG9ydHMuZGVzdHJveSA9ICgoKSA9PiB7XG5cdGxldCB3YXJuZWQgPSBmYWxzZTtcblxuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGlmICghd2FybmVkKSB7XG5cdFx0XHR3YXJuZWQgPSB0cnVlO1xuXHRcdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdFx0fVxuXHR9O1xufSkoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG5cdCcjMDAwMENDJyxcblx0JyMwMDAwRkYnLFxuXHQnIzAwMzNDQycsXG5cdCcjMDAzM0ZGJyxcblx0JyMwMDY2Q0MnLFxuXHQnIzAwNjZGRicsXG5cdCcjMDA5OUNDJyxcblx0JyMwMDk5RkYnLFxuXHQnIzAwQ0MwMCcsXG5cdCcjMDBDQzMzJyxcblx0JyMwMENDNjYnLFxuXHQnIzAwQ0M5OScsXG5cdCcjMDBDQ0NDJyxcblx0JyMwMENDRkYnLFxuXHQnIzMzMDBDQycsXG5cdCcjMzMwMEZGJyxcblx0JyMzMzMzQ0MnLFxuXHQnIzMzMzNGRicsXG5cdCcjMzM2NkNDJyxcblx0JyMzMzY2RkYnLFxuXHQnIzMzOTlDQycsXG5cdCcjMzM5OUZGJyxcblx0JyMzM0NDMDAnLFxuXHQnIzMzQ0MzMycsXG5cdCcjMzNDQzY2Jyxcblx0JyMzM0NDOTknLFxuXHQnIzMzQ0NDQycsXG5cdCcjMzNDQ0ZGJyxcblx0JyM2NjAwQ0MnLFxuXHQnIzY2MDBGRicsXG5cdCcjNjYzM0NDJyxcblx0JyM2NjMzRkYnLFxuXHQnIzY2Q0MwMCcsXG5cdCcjNjZDQzMzJyxcblx0JyM5OTAwQ0MnLFxuXHQnIzk5MDBGRicsXG5cdCcjOTkzM0NDJyxcblx0JyM5OTMzRkYnLFxuXHQnIzk5Q0MwMCcsXG5cdCcjOTlDQzMzJyxcblx0JyNDQzAwMDAnLFxuXHQnI0NDMDAzMycsXG5cdCcjQ0MwMDY2Jyxcblx0JyNDQzAwOTknLFxuXHQnI0NDMDBDQycsXG5cdCcjQ0MwMEZGJyxcblx0JyNDQzMzMDAnLFxuXHQnI0NDMzMzMycsXG5cdCcjQ0MzMzY2Jyxcblx0JyNDQzMzOTknLFxuXHQnI0NDMzNDQycsXG5cdCcjQ0MzM0ZGJyxcblx0JyNDQzY2MDAnLFxuXHQnI0NDNjYzMycsXG5cdCcjQ0M5OTAwJyxcblx0JyNDQzk5MzMnLFxuXHQnI0NDQ0MwMCcsXG5cdCcjQ0NDQzMzJyxcblx0JyNGRjAwMDAnLFxuXHQnI0ZGMDAzMycsXG5cdCcjRkYwMDY2Jyxcblx0JyNGRjAwOTknLFxuXHQnI0ZGMDBDQycsXG5cdCcjRkYwMEZGJyxcblx0JyNGRjMzMDAnLFxuXHQnI0ZGMzMzMycsXG5cdCcjRkYzMzY2Jyxcblx0JyNGRjMzOTknLFxuXHQnI0ZGMzNDQycsXG5cdCcjRkYzM0ZGJyxcblx0JyNGRjY2MDAnLFxuXHQnI0ZGNjYzMycsXG5cdCcjRkY5OTAwJyxcblx0JyNGRjk5MzMnLFxuXHQnI0ZGQ0MwMCcsXG5cdCcjRkZDQzMzJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHQvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG5cdC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG5cdC8vIGV4cGxpY2l0bHlcblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmICh3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHdpbmRvdy5wcm9jZXNzLl9fbndqcykpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0IGNvbG9ycy5cblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVxcLyhcXGQrKS8pKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gSXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcblx0Ly8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcblx0cmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG5cdFx0Ly8gSXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuXHRcdCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG5cdFx0Ly8gSXMgZmlyZWZveCA+PSB2MzE/XG5cdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykgJiYgcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCkgPj0gMzEpIHx8XG5cdFx0Ly8gRG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKSk7XG59XG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdGFyZ3NbMF0gPSAodGhpcy51c2VDb2xvcnMgPyAnJWMnIDogJycpICtcblx0XHR0aGlzLm5hbWVzcGFjZSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyAlYycgOiAnICcpICtcblx0XHRhcmdzWzBdICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnJWMgJyA6ICcgJykgK1xuXHRcdCcrJyArIG1vZHVsZS5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cblx0aWYgKCF0aGlzLnVzZUNvbG9ycykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuXHRhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKTtcblxuXHQvLyBUaGUgZmluYWwgXCIlY1wiIGlzIHNvbWV3aGF0IHRyaWNreSwgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlclxuXHQvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG5cdC8vIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgaW5kZXggdG8gaW5zZXJ0IHRoZSBDU1MgaW50b1xuXHRsZXQgaW5kZXggPSAwO1xuXHRsZXQgbGFzdEMgPSAwO1xuXHRhcmdzWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZywgbWF0Y2ggPT4ge1xuXHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpbmRleCsrO1xuXHRcdGlmIChtYXRjaCA9PT0gJyVjJykge1xuXHRcdFx0Ly8gV2Ugb25seSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgKmxhc3QqICVjXG5cdFx0XHQvLyAodGhlIHVzZXIgbWF5IGhhdmUgcHJvdmlkZWQgdGhlaXIgb3duKVxuXHRcdFx0bGFzdEMgPSBpbmRleDtcblx0XHR9XG5cdH0pO1xuXG5cdGFyZ3Muc3BsaWNlKGxhc3RDLCAwLCBjKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGBjb25zb2xlLmRlYnVnKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGEgXCJmdW5jdGlvblwiLlxuICogSWYgYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhdmFpbGFibGUsIGZhbGxzIGJhY2tcbiAqIHRvIGBjb25zb2xlLmxvZ2AuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuZXhwb3J0cy5sb2cgPSBjb25zb2xlLmRlYnVnIHx8IGNvbnNvbGUubG9nIHx8ICgoKSA9PiB7fSk7XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcblx0dHJ5IHtcblx0XHRpZiAobmFtZXNwYWNlcykge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnNldEl0ZW0oJ2RlYnVnJywgbmFtZXNwYWNlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuXHRcdH1cblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbG9hZCgpIHtcblx0bGV0IHI7XG5cdHRyeSB7XG5cdFx0ciA9IGV4cG9ydHMuc3RvcmFnZS5nZXRJdGVtKCdkZWJ1ZycpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxuXG5cdC8vIElmIGRlYnVnIGlzbid0IHNldCBpbiBMUywgYW5kIHdlJ3JlIGluIEVsZWN0cm9uLCB0cnkgdG8gbG9hZCAkREVCVUdcblx0aWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG5cdFx0ciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG5cblx0cmV0dXJuIHI7XG59XG5cbi8qKlxuICogTG9jYWxzdG9yYWdlIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgbG9jYWxzdG9yYWdlLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc2FmYXJpIHRocm93c1xuICogd2hlbiBhIHVzZXIgZGlzYWJsZXMgY29va2llcy9sb2NhbHN0b3JhZ2VcbiAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG4gKlxuICogQHJldHVybiB7TG9jYWxTdG9yYWdlfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9jYWxzdG9yYWdlKCkge1xuXHR0cnkge1xuXHRcdC8vIFRWTUxLaXQgKEFwcGxlIFRWIEpTIFJ1bnRpbWUpIGRvZXMgbm90IGhhdmUgYSB3aW5kb3cgb2JqZWN0LCBqdXN0IGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHRcblx0XHQvLyBUaGUgQnJvd3NlciBhbHNvIGhhcyBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0LlxuXHRcdHJldHVybiBsb2NhbFN0b3JhZ2U7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9jb21tb24nKShleHBvcnRzKTtcblxuY29uc3Qge2Zvcm1hdHRlcnN9ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uICh2KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnJvci5tZXNzYWdlO1xuXHR9XG59O1xuIiwiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKi9cblxuZnVuY3Rpb24gc2V0dXAoZW52KSB7XG5cdGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmRlZmF1bHQgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuY29lcmNlID0gY29lcmNlO1xuXHRjcmVhdGVEZWJ1Zy5kaXNhYmxlID0gZGlzYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlID0gZW5hYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGVkID0gZW5hYmxlZDtcblx0Y3JlYXRlRGVidWcuaHVtYW5pemUgPSByZXF1aXJlKCdtcycpO1xuXHRjcmVhdGVEZWJ1Zy5kZXN0cm95ID0gZGVzdHJveTtcblxuXHRPYmplY3Qua2V5cyhlbnYpLmZvckVhY2goa2V5ID0+IHtcblx0XHRjcmVhdGVEZWJ1Z1trZXldID0gZW52W2tleV07XG5cdH0pO1xuXG5cdC8qKlxuXHQqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGRlYnVnIG1vZGUgbmFtZXMsIGFuZCBuYW1lcyB0byBza2lwLlxuXHQqL1xuXG5cdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0LyoqXG5cdCogTWFwIG9mIHNwZWNpYWwgXCIlblwiIGhhbmRsaW5nIGZ1bmN0aW9ucywgZm9yIHRoZSBkZWJ1ZyBcImZvcm1hdFwiIGFyZ3VtZW50LlxuXHQqXG5cdCogVmFsaWQga2V5IG5hbWVzIGFyZSBhIHNpbmdsZSwgbG93ZXIgb3IgdXBwZXItY2FzZSBsZXR0ZXIsIGkuZS4gXCJuXCIgYW5kIFwiTlwiLlxuXHQqL1xuXHRjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzID0ge307XG5cblx0LyoqXG5cdCogU2VsZWN0cyBhIGNvbG9yIGZvciBhIGRlYnVnIG5hbWVzcGFjZVxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBzdHJpbmcgZm9yIHRoZSBkZWJ1ZyBpbnN0YW5jZSB0byBiZSBjb2xvcmVkXG5cdCogQHJldHVybiB7TnVtYmVyfFN0cmluZ30gQW4gQU5TSSBjb2xvciBjb2RlIGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHNlbGVjdENvbG9yKG5hbWVzcGFjZSkge1xuXHRcdGxldCBoYXNoID0gMDtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBuYW1lc3BhY2UuY2hhckNvZGVBdChpKTtcblx0XHRcdGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNyZWF0ZURlYnVnLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGNyZWF0ZURlYnVnLmNvbG9ycy5sZW5ndGhdO1xuXHR9XG5cdGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yID0gc2VsZWN0Q29sb3I7XG5cblx0LyoqXG5cdCogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQHJldHVybiB7RnVuY3Rpb259XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gY3JlYXRlRGVidWcobmFtZXNwYWNlKSB7XG5cdFx0bGV0IHByZXZUaW1lO1xuXHRcdGxldCBlbmFibGVPdmVycmlkZSA9IG51bGw7XG5cdFx0bGV0IG5hbWVzcGFjZXNDYWNoZTtcblx0XHRsZXQgZW5hYmxlZENhY2hlO1xuXG5cdFx0ZnVuY3Rpb24gZGVidWcoLi4uYXJncykge1xuXHRcdFx0Ly8gRGlzYWJsZWQ/XG5cdFx0XHRpZiAoIWRlYnVnLmVuYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzZWxmID0gZGVidWc7XG5cblx0XHRcdC8vIFNldCBgZGlmZmAgdGltZXN0YW1wXG5cdFx0XHRjb25zdCBjdXJyID0gTnVtYmVyKG5ldyBEYXRlKCkpO1xuXHRcdFx0Y29uc3QgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuXHRcdFx0c2VsZi5kaWZmID0gbXM7XG5cdFx0XHRzZWxmLnByZXYgPSBwcmV2VGltZTtcblx0XHRcdHNlbGYuY3VyciA9IGN1cnI7XG5cdFx0XHRwcmV2VGltZSA9IGN1cnI7XG5cblx0XHRcdGFyZ3NbMF0gPSBjcmVhdGVEZWJ1Zy5jb2VyY2UoYXJnc1swXSk7XG5cblx0XHRcdGlmICh0eXBlb2YgYXJnc1swXSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cblx0XHRcdFx0YXJncy51bnNoaWZ0KCclTycpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuXHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCAobWF0Y2gsIGZvcm1hdCkgPT4ge1xuXHRcdFx0XHQvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG5cdFx0XHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0XHRcdHJldHVybiAnJSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0Y29uc3QgZm9ybWF0dGVyID0gY3JlYXRlRGVidWcuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXHRcdFx0XHRpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdGNvbnN0IHZhbCA9IGFyZ3NbaW5kZXhdO1xuXHRcdFx0XHRcdG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuXHRcdFx0XHRcdC8vIE5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcblx0XHRcdFx0XHRhcmdzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHRcdFx0aW5kZXgtLTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcblx0XHRcdGNyZWF0ZURlYnVnLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuXHRcdFx0Y29uc3QgbG9nRm4gPSBzZWxmLmxvZyB8fCBjcmVhdGVEZWJ1Zy5sb2c7XG5cdFx0XHRsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcblx0XHR9XG5cblx0XHRkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdFx0ZGVidWcudXNlQ29sb3JzID0gY3JlYXRlRGVidWcudXNlQ29sb3JzKCk7XG5cdFx0ZGVidWcuY29sb3IgPSBjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXHRcdGRlYnVnLmV4dGVuZCA9IGV4dGVuZDtcblx0XHRkZWJ1Zy5kZXN0cm95ID0gY3JlYXRlRGVidWcuZGVzdHJveTsgLy8gWFhYIFRlbXBvcmFyeS4gV2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVidWcsICdlbmFibGVkJywge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0aWYgKGVuYWJsZU92ZXJyaWRlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVuYWJsZU92ZXJyaWRlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChuYW1lc3BhY2VzQ2FjaGUgIT09IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMpIHtcblx0XHRcdFx0XHRuYW1lc3BhY2VzQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzO1xuXHRcdFx0XHRcdGVuYWJsZWRDYWNoZSA9IGNyZWF0ZURlYnVnLmVuYWJsZWQobmFtZXNwYWNlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBlbmFibGVkQ2FjaGU7XG5cdFx0XHR9LFxuXHRcdFx0c2V0OiB2ID0+IHtcblx0XHRcdFx0ZW5hYmxlT3ZlcnJpZGUgPSB2O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gRW52LXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGxvZ2ljIGZvciBkZWJ1ZyBpbnN0YW5jZXNcblx0XHRpZiAodHlwZW9mIGNyZWF0ZURlYnVnLmluaXQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNyZWF0ZURlYnVnLmluaXQoZGVidWcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWJ1Zztcblx0fVxuXG5cdGZ1bmN0aW9uIGV4dGVuZChuYW1lc3BhY2UsIGRlbGltaXRlcikge1xuXHRcdGNvbnN0IG5ld0RlYnVnID0gY3JlYXRlRGVidWcodGhpcy5uYW1lc3BhY2UgKyAodHlwZW9mIGRlbGltaXRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnOicgOiBkZWxpbWl0ZXIpICsgbmFtZXNwYWNlKTtcblx0XHRuZXdEZWJ1Zy5sb2cgPSB0aGlzLmxvZztcblx0XHRyZXR1cm4gbmV3RGVidWc7XG5cdH1cblxuXHQvKipcblx0KiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG5cdCogc2VwYXJhdGVkIGJ5IGEgY29sb24gYW5kIHdpbGRjYXJkcy5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcblx0XHRjcmVhdGVEZWJ1Zy5zYXZlKG5hbWVzcGFjZXMpO1xuXHRcdGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzO1xuXG5cdFx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0XHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdFx0bGV0IGk7XG5cdFx0Y29uc3Qgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuXHRcdGNvbnN0IGxlbiA9IHNwbGl0Lmxlbmd0aDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKCFzcGxpdFtpXSkge1xuXHRcdFx0XHQvLyBpZ25vcmUgZW1wdHkgc3RyaW5nc1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bmFtZXNwYWNlcyA9IHNwbGl0W2ldLnJlcGxhY2UoL1xcKi9nLCAnLio/Jyk7XG5cblx0XHRcdGlmIChuYW1lc3BhY2VzWzBdID09PSAnLScpIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcuc2tpcHMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMuc2xpY2UoMSkgKyAnJCcpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG5cdCpcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBkaXNhYmxlKCkge1xuXHRcdGNvbnN0IG5hbWVzcGFjZXMgPSBbXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5uYW1lcy5tYXAodG9OYW1lc3BhY2UpLFxuXHRcdFx0Li4uY3JlYXRlRGVidWcuc2tpcHMubWFwKHRvTmFtZXNwYWNlKS5tYXAobmFtZXNwYWNlID0+ICctJyArIG5hbWVzcGFjZSlcblx0XHRdLmpvaW4oJywnKTtcblx0XHRjcmVhdGVEZWJ1Zy5lbmFibGUoJycpO1xuXHRcdHJldHVybiBuYW1lc3BhY2VzO1xuXHR9XG5cblx0LyoqXG5cdCogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0KiBAcmV0dXJuIHtCb29sZWFufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuXHRcdGlmIChuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcqJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0bGV0IGk7XG5cdFx0bGV0IGxlbjtcblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQqIENvbnZlcnQgcmVnZXhwIHRvIG5hbWVzcGFjZVxuXHQqXG5cdCogQHBhcmFtIHtSZWdFeHB9IHJlZ3hlcFxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHRvTmFtZXNwYWNlKHJlZ2V4cCkge1xuXHRcdHJldHVybiByZWdleHAudG9TdHJpbmcoKVxuXHRcdFx0LnN1YnN0cmluZygyLCByZWdleHAudG9TdHJpbmcoKS5sZW5ndGggLSAyKVxuXHRcdFx0LnJlcGxhY2UoL1xcLlxcKlxcPyQvLCAnKicpO1xuXHR9XG5cblx0LyoqXG5cdCogQ29lcmNlIGB2YWxgLlxuXHQqXG5cdCogQHBhcmFtIHtNaXhlZH0gdmFsXG5cdCogQHJldHVybiB7TWl4ZWR9XG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcblx0XHRpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRcdHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHQvKipcblx0KiBYWFggRE8gTk9UIFVTRS4gVGhpcyBpcyBhIHRlbXBvcmFyeSBzdHViIGZ1bmN0aW9uLlxuXHQqIFhYWCBJdCBXSUxMIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblx0Ki9cblx0ZnVuY3Rpb24gZGVzdHJveSgpIHtcblx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0fVxuXG5cdGNyZWF0ZURlYnVnLmVuYWJsZShjcmVhdGVEZWJ1Zy5sb2FkKCkpO1xuXG5cdHJldHVybiBjcmVhdGVEZWJ1Zztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXR1cDtcbiIsIi8qKlxuICogRGV0ZWN0IEVsZWN0cm9uIHJlbmRlcmVyIC8gbndqcyBwcm9jZXNzLCB3aGljaCBpcyBub2RlLCBidXQgd2Ugc2hvdWxkXG4gKiB0cmVhdCBhcyBhIGJyb3dzZXIuXG4gKi9cblxuaWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJyB8fCBwcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgcHJvY2Vzcy5icm93c2VyID09PSB0cnVlIHx8IHByb2Nlc3MuX19ud2pzKSB7XG5cdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9icm93c2VyLmpzJyk7XG59IGVsc2Uge1xuXHRtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbm9kZS5qcycpO1xufVxuIiwiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbmNvbnN0IHR0eSA9IHJlcXVpcmUoJ3R0eScpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuZGVzdHJveSA9IHV0aWwuZGVwcmVjYXRlKFxuXHQoKSA9PiB7fSxcblx0J0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nXG4pO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFs2LCAyLCAzLCA0LCA1LCAxXTtcblxudHJ5IHtcblx0Ly8gT3B0aW9uYWwgZGVwZW5kZW5jeSAoYXMgaW4sIGRvZXNuJ3QgbmVlZCB0byBiZSBpbnN0YWxsZWQsIE5PVCBsaWtlIG9wdGlvbmFsRGVwZW5kZW5jaWVzIGluIHBhY2thZ2UuanNvbilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuXHRjb25zdCBzdXBwb3J0c0NvbG9yID0gcmVxdWlyZSgnc3VwcG9ydHMtY29sb3InKTtcblxuXHRpZiAoc3VwcG9ydHNDb2xvciAmJiAoc3VwcG9ydHNDb2xvci5zdGRlcnIgfHwgc3VwcG9ydHNDb2xvcikubGV2ZWwgPj0gMikge1xuXHRcdGV4cG9ydHMuY29sb3JzID0gW1xuXHRcdFx0MjAsXG5cdFx0XHQyMSxcblx0XHRcdDI2LFxuXHRcdFx0MjcsXG5cdFx0XHQzMixcblx0XHRcdDMzLFxuXHRcdFx0MzgsXG5cdFx0XHQzOSxcblx0XHRcdDQwLFxuXHRcdFx0NDEsXG5cdFx0XHQ0Mixcblx0XHRcdDQzLFxuXHRcdFx0NDQsXG5cdFx0XHQ0NSxcblx0XHRcdDU2LFxuXHRcdFx0NTcsXG5cdFx0XHQ2Mixcblx0XHRcdDYzLFxuXHRcdFx0NjgsXG5cdFx0XHQ2OSxcblx0XHRcdDc0LFxuXHRcdFx0NzUsXG5cdFx0XHQ3Nixcblx0XHRcdDc3LFxuXHRcdFx0NzgsXG5cdFx0XHQ3OSxcblx0XHRcdDgwLFxuXHRcdFx0ODEsXG5cdFx0XHQ5Mixcblx0XHRcdDkzLFxuXHRcdFx0OTgsXG5cdFx0XHQ5OSxcblx0XHRcdDExMixcblx0XHRcdDExMyxcblx0XHRcdDEyOCxcblx0XHRcdDEyOSxcblx0XHRcdDEzNCxcblx0XHRcdDEzNSxcblx0XHRcdDE0OCxcblx0XHRcdDE0OSxcblx0XHRcdDE2MCxcblx0XHRcdDE2MSxcblx0XHRcdDE2Mixcblx0XHRcdDE2Myxcblx0XHRcdDE2NCxcblx0XHRcdDE2NSxcblx0XHRcdDE2Nixcblx0XHRcdDE2Nyxcblx0XHRcdDE2OCxcblx0XHRcdDE2OSxcblx0XHRcdDE3MCxcblx0XHRcdDE3MSxcblx0XHRcdDE3Mixcblx0XHRcdDE3Myxcblx0XHRcdDE3OCxcblx0XHRcdDE3OSxcblx0XHRcdDE4NCxcblx0XHRcdDE4NSxcblx0XHRcdDE5Nixcblx0XHRcdDE5Nyxcblx0XHRcdDE5OCxcblx0XHRcdDE5OSxcblx0XHRcdDIwMCxcblx0XHRcdDIwMSxcblx0XHRcdDIwMixcblx0XHRcdDIwMyxcblx0XHRcdDIwNCxcblx0XHRcdDIwNSxcblx0XHRcdDIwNixcblx0XHRcdDIwNyxcblx0XHRcdDIwOCxcblx0XHRcdDIwOSxcblx0XHRcdDIxNCxcblx0XHRcdDIxNSxcblx0XHRcdDIyMCxcblx0XHRcdDIyMVxuXHRcdF07XG5cdH1cbn0gY2F0Y2ggKGVycm9yKSB7XG5cdC8vIFN3YWxsb3cgLSB3ZSBvbmx5IGNhcmUgaWYgYHN1cHBvcnRzLWNvbG9yYCBpcyBhdmFpbGFibGU7IGl0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbn1cblxuLyoqXG4gKiBCdWlsZCB1cCB0aGUgZGVmYXVsdCBgaW5zcGVjdE9wdHNgIG9iamVjdCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKlxuICogICAkIERFQlVHX0NPTE9SUz1ubyBERUJVR19ERVBUSD0xMCBERUJVR19TSE9XX0hJRERFTj1lbmFibGVkIG5vZGUgc2NyaXB0LmpzXG4gKi9cblxuZXhwb3J0cy5pbnNwZWN0T3B0cyA9IE9iamVjdC5rZXlzKHByb2Nlc3MuZW52KS5maWx0ZXIoa2V5ID0+IHtcblx0cmV0dXJuIC9eZGVidWdfL2kudGVzdChrZXkpO1xufSkucmVkdWNlKChvYmosIGtleSkgPT4ge1xuXHQvLyBDYW1lbC1jYXNlXG5cdGNvbnN0IHByb3AgPSBrZXlcblx0XHQuc3Vic3RyaW5nKDYpXG5cdFx0LnRvTG93ZXJDYXNlKClcblx0XHQucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGspID0+IHtcblx0XHRcdHJldHVybiBrLnRvVXBwZXJDYXNlKCk7XG5cdFx0fSk7XG5cblx0Ly8gQ29lcmNlIHN0cmluZyB2YWx1ZSBpbnRvIEpTIHZhbHVlXG5cdGxldCB2YWwgPSBwcm9jZXNzLmVudltrZXldO1xuXHRpZiAoL14oeWVzfG9ufHRydWV8ZW5hYmxlZCkkL2kudGVzdCh2YWwpKSB7XG5cdFx0dmFsID0gdHJ1ZTtcblx0fSBlbHNlIGlmICgvXihub3xvZmZ8ZmFsc2V8ZGlzYWJsZWQpJC9pLnRlc3QodmFsKSkge1xuXHRcdHZhbCA9IGZhbHNlO1xuXHR9IGVsc2UgaWYgKHZhbCA9PT0gJ251bGwnKSB7XG5cdFx0dmFsID0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHR2YWwgPSBOdW1iZXIodmFsKTtcblx0fVxuXG5cdG9ialtwcm9wXSA9IHZhbDtcblx0cmV0dXJuIG9iajtcbn0sIHt9KTtcblxuLyoqXG4gKiBJcyBzdGRvdXQgYSBUVFk/IENvbG9yZWQgb3V0cHV0IGlzIGVuYWJsZWQgd2hlbiBgdHJ1ZWAuXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHRyZXR1cm4gJ2NvbG9ycycgaW4gZXhwb3J0cy5pbnNwZWN0T3B0cyA/XG5cdFx0Qm9vbGVhbihleHBvcnRzLmluc3BlY3RPcHRzLmNvbG9ycykgOlxuXHRcdHR0eS5pc2F0dHkocHJvY2Vzcy5zdGRlcnIuZmQpO1xufVxuXG4vKipcbiAqIEFkZHMgQU5TSSBjb2xvciBlc2NhcGUgY29kZXMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuXHRjb25zdCB7bmFtZXNwYWNlOiBuYW1lLCB1c2VDb2xvcnN9ID0gdGhpcztcblxuXHRpZiAodXNlQ29sb3JzKSB7XG5cdFx0Y29uc3QgYyA9IHRoaXMuY29sb3I7XG5cdFx0Y29uc3QgY29sb3JDb2RlID0gJ1xcdTAwMUJbMycgKyAoYyA8IDggPyBjIDogJzg7NTsnICsgYyk7XG5cdFx0Y29uc3QgcHJlZml4ID0gYCAgJHtjb2xvckNvZGV9OzFtJHtuYW1lfSBcXHUwMDFCWzBtYDtcblxuXHRcdGFyZ3NbMF0gPSBwcmVmaXggKyBhcmdzWzBdLnNwbGl0KCdcXG4nKS5qb2luKCdcXG4nICsgcHJlZml4KTtcblx0XHRhcmdzLnB1c2goY29sb3JDb2RlICsgJ20rJyArIG1vZHVsZS5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZikgKyAnXFx1MDAxQlswbScpO1xuXHR9IGVsc2Uge1xuXHRcdGFyZ3NbMF0gPSBnZXREYXRlKCkgKyBuYW1lICsgJyAnICsgYXJnc1swXTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXREYXRlKCkge1xuXHRpZiAoZXhwb3J0cy5pbnNwZWN0T3B0cy5oaWRlRGF0ZSkge1xuXHRcdHJldHVybiAnJztcblx0fVxuXHRyZXR1cm4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpICsgJyAnO1xufVxuXG4vKipcbiAqIEludm9rZXMgYHV0aWwuZm9ybWF0KClgIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIHdyaXRlcyB0byBzdGRlcnIuXG4gKi9cblxuZnVuY3Rpb24gbG9nKC4uLmFyZ3MpIHtcblx0cmV0dXJuIHByb2Nlc3Muc3RkZXJyLndyaXRlKHV0aWwuZm9ybWF0KC4uLmFyZ3MpICsgJ1xcbicpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0cHJvY2Vzcy5lbnYuREVCVUcgPSBuYW1lc3BhY2VzO1xuXHR9IGVsc2Uge1xuXHRcdC8vIElmIHlvdSBzZXQgYSBwcm9jZXNzLmVudiBmaWVsZCB0byBudWxsIG9yIHVuZGVmaW5lZCwgaXQgZ2V0cyBjYXN0IHRvIHRoZVxuXHRcdC8vIHN0cmluZyAnbnVsbCcgb3IgJ3VuZGVmaW5lZCcuIEp1c3QgZGVsZXRlIGluc3RlYWQuXG5cdFx0ZGVsZXRlIHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcblx0cmV0dXJuIHByb2Nlc3MuZW52LkRFQlVHO1xufVxuXG4vKipcbiAqIEluaXQgbG9naWMgZm9yIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuICpcbiAqIENyZWF0ZSBhIG5ldyBgaW5zcGVjdE9wdHNgIG9iamVjdCBpbiBjYXNlIGB1c2VDb2xvcnNgIGlzIHNldFxuICogZGlmZmVyZW50bHkgZm9yIGEgcGFydGljdWxhciBgZGVidWdgIGluc3RhbmNlLlxuICovXG5cbmZ1bmN0aW9uIGluaXQoZGVidWcpIHtcblx0ZGVidWcuaW5zcGVjdE9wdHMgPSB7fTtcblxuXHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXhwb3J0cy5pbnNwZWN0T3B0cyk7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdGRlYnVnLmluc3BlY3RPcHRzW2tleXNbaV1dID0gZXhwb3J0cy5pbnNwZWN0T3B0c1trZXlzW2ldXTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlbyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGwgb24gYSBzaW5nbGUgbGluZS5cbiAqL1xuXG5mb3JtYXR0ZXJzLm8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpXG5cdFx0LnNwbGl0KCdcXG4nKVxuXHRcdC5tYXAoc3RyID0+IHN0ci50cmltKCkpXG5cdFx0LmpvaW4oJyAnKTtcbn07XG5cbi8qKlxuICogTWFwICVPIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbG93aW5nIG11bHRpcGxlIGxpbmVzIGlmIG5lZWRlZC5cbiAqL1xuXG5mb3JtYXR0ZXJzLk8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5hd2FpdEVhY2hZaWVsZGVkUHJvbWlzZSA9IGV4cG9ydHMubWF5YmVBc3luYyA9IGV4cG9ydHMubWF5YmVBc3luY0ZuID0gdm9pZCAwO1xuZnVuY3Rpb24qIGF3YWl0WWllbGQodmFsdWUpIHtcbiAgICByZXR1cm4gKHlpZWxkIHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGF3YWl0WWllbGRPZihnZW5lcmF0b3IpIHtcbiAgICByZXR1cm4gYXdhaXRZaWVsZChhd2FpdEVhY2hZaWVsZGVkUHJvbWlzZShnZW5lcmF0b3IpKTtcbn1cbmNvbnN0IEF3YWl0WWllbGQgPSBhd2FpdFlpZWxkO1xuQXdhaXRZaWVsZC5vZiA9IGF3YWl0WWllbGRPZjtcbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBhc3luYywgdXNpbmcgYSBnZW5lcmF0b3JcbiAqXG4gKiBXaXRoaW4gdGhlIGdlbmVyYXRvciwgY2FsbCBgeWllbGQqIGF3YWl0ZWQobWF5YmVQcm9taXNlKWAgdG8gYXdhaXQgYSB2YWx1ZVxuICogdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBhIHByb21pc2UuXG4gKlxuICogSWYgdGhlIGlubmVyIGZ1bmN0aW9uIG5ldmVyIHlpZWxkcyBhIHByb21pc2UsIGl0IHdpbGwgcmV0dXJuIHN5bmNocm9ub3VzbHkuXG4gKi9cbmZ1bmN0aW9uIG1heWJlQXN5bmNGbih0aGF0LCBmbikge1xuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCBnZW5lcmF0b3IgPSBmbi5jYWxsKHRoYXQsIEF3YWl0WWllbGQsIC4uLmFyZ3MpO1xuICAgICAgICByZXR1cm4gYXdhaXRFYWNoWWllbGRlZFByb21pc2UoZ2VuZXJhdG9yKTtcbiAgICB9O1xufVxuZXhwb3J0cy5tYXliZUFzeW5jRm4gPSBtYXliZUFzeW5jRm47XG5jbGFzcyBFeGFtcGxlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tYXliZUFzeW5jTWV0aG9kID0gbWF5YmVBc3luY0ZuKHRoaXMsIGZ1bmN0aW9uKiAoYXdhaXRlZCwgYSkge1xuICAgICAgICAgICAgeWllbGQqIGF3YWl0ZWQobmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgYSkpKTtcbiAgICAgICAgICAgIHJldHVybiA1O1xuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYXliZUFzeW5jKHRoYXQsIHN0YXJ0R2VuZXJhdG9yKSB7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gc3RhcnRHZW5lcmF0b3IuY2FsbCh0aGF0LCBBd2FpdFlpZWxkKTtcbiAgICByZXR1cm4gYXdhaXRFYWNoWWllbGRlZFByb21pc2UoZ2VuZXJhdG9yKTtcbn1cbmV4cG9ydHMubWF5YmVBc3luYyA9IG1heWJlQXN5bmM7XG5mdW5jdGlvbiBhd2FpdEVhY2hZaWVsZGVkUHJvbWlzZShnZW4pIHtcbiAgICBmdW5jdGlvbiBoYW5kbGVOZXh0U3RlcChzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGVwLnZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXAudmFsdWUudGhlbigodmFsdWUpID0+IGhhbmRsZU5leHRTdGVwKGdlbi5uZXh0KHZhbHVlKSksIChlcnJvcikgPT4gaGFuZGxlTmV4dFN0ZXAoZ2VuLnRocm93KGVycm9yKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVOZXh0U3RlcChnZW4ubmV4dChzdGVwLnZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVOZXh0U3RlcChnZW4ubmV4dCgpKTtcbn1cbmV4cG9ydHMuYXdhaXRFYWNoWWllbGRlZFByb21pc2UgPSBhd2FpdEVhY2hZaWVsZGVkUHJvbWlzZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzeW5jaWZ5LWhlbHBlcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlF1aWNrSlNBc3luY0NvbnRleHQgPSB2b2lkIDA7XG5jb25zdCBjb250ZXh0XzEgPSByZXF1aXJlKFwiLi9jb250ZXh0XCIpO1xuY29uc3QgZGVidWdfMSA9IHJlcXVpcmUoXCIuL2RlYnVnXCIpO1xuY29uc3QgdHlwZXNfMSA9IHJlcXVpcmUoXCIuL3R5cGVzXCIpO1xuLyoqXG4gKiBBc3luY2lmaWVkIHZlcnNpb24gb2YgW1tRdWlja0pTQ29udGV4dF1dLlxuICpcbiAqICpBc3luY2lmeSogYWxsb3dzIG5vcm1hbGx5IHN5bmNocm9ub3VzIGNvZGUgdG8gd2FpdCBmb3IgYXN5bmNocm9ub3VzIFByb21pc2VzXG4gKiBvciBjYWxsYmFja3MuIFRoZSBhc3luY2lmaWVkIHZlcnNpb24gb2YgUXVpY2tKU0NvbnRleHQgY2FuIHdhaXQgZm9yIGFzeW5jXG4gKiBob3N0IGZ1bmN0aW9ucyBhcyB0aG91Z2ggdGhleSB3ZXJlIHN5bmNocm9ub3VzLlxuICovXG5jbGFzcyBRdWlja0pTQXN5bmNDb250ZXh0IGV4dGVuZHMgY29udGV4dF8xLlF1aWNrSlNDb250ZXh0IHtcbiAgICAvKipcbiAgICAgKiBBc3luY2lmaWVkIHZlcnNpb24gb2YgW1tldmFsQ29kZV1dLlxuICAgICAqL1xuICAgIGFzeW5jIGV2YWxDb2RlQXN5bmMoY29kZSwgZmlsZW5hbWUgPSBcImV2YWwuanNcIiwgXG4gICAgLyoqIFNlZSBbW0V2YWxGbGFnc11dIGZvciBudW1iZXIgc2VtYW50aWNzICovXG4gICAgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBkZXRlY3RNb2R1bGUgPSAob3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gMSA6IDApO1xuICAgICAgICBjb25zdCBmbGFncyA9ICgwLCB0eXBlc18xLmV2YWxPcHRpb25zVG9GbGFncykob3B0aW9ucyk7XG4gICAgICAgIGxldCByZXN1bHRQdHIgPSAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0UHRyID0gYXdhaXQgdGhpcy5tZW1vcnlcbiAgICAgICAgICAgICAgICAubmV3SGVhcENoYXJQb2ludGVyKGNvZGUpXG4gICAgICAgICAgICAgICAgLmNvbnN1bWUoKGNoYXJIYW5kbGUpID0+IHRoaXMuZmZpLlFUU19FdmFsX01heWJlQXN5bmModGhpcy5jdHgudmFsdWUsIGNoYXJIYW5kbGUudmFsdWUsIGZpbGVuYW1lLCBkZXRlY3RNb2R1bGUsIGZsYWdzKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJRVFNfRXZhbF9NYXliZUFzeW5jIHRocmV3XCIsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVycm9yUHRyID0gdGhpcy5mZmkuUVRTX1Jlc29sdmVFeGNlcHRpb24odGhpcy5jdHgudmFsdWUsIHJlc3VsdFB0cik7XG4gICAgICAgIGlmIChlcnJvclB0cikge1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX0ZyZWVWYWx1ZVBvaW50ZXIodGhpcy5jdHgudmFsdWUsIHJlc3VsdFB0cik7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKGVycm9yUHRyKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocmVzdWx0UHRyKSB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1pbGFyIHRvIFtbbmV3RnVuY3Rpb25dXS5cbiAgICAgKiBDb252ZXJ0IGFuIGFzeW5jIGhvc3QgSmF2YXNjcmlwdCBmdW5jdGlvbiBpbnRvIGEgc3luY2hyb25vdXMgUXVpY2tKUyBmdW5jdGlvbiB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFdoZW5ldmVyIFF1aWNrSlMgY2FsbHMgdGhpcyBmdW5jdGlvbiwgdGhlIFZNJ3Mgc3RhY2sgd2lsbCBiZSB1bndvdW5kIHdoaWxlXG4gICAgICogd2FpdGluZyB0aGUgYXN5bmMgZnVuY3Rpb24gdG8gY29tcGxldGUsIGFuZCB0aGVuIHJlc3RvcmVkIHdoZW4gdGhlIHJldHVybmVkXG4gICAgICogcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgKlxuICAgICAqIEFzeW5jaWZpZWQgZnVuY3Rpb25zIG11c3QgbmV2ZXIgY2FsbCBvdGhlciBhc3luY2lmaWVkIGZ1bmN0aW9ucyBvclxuICAgICAqIGBpbXBvcnRgLCBldmVuIGluZGlyZWN0bHksIGJlY2F1c2UgdGhlIHN0YWNrIGNhbm5vdCBiZSB1bndvdW5kIHR3aWNlLlxuICAgICAqXG4gICAgICogU2VlIFtFbXNjcmlwdGVuJ3MgZG9jcyBvbiBBc3luY2lmeV0oaHR0cHM6Ly9lbXNjcmlwdGVuLm9yZy9kb2NzL3BvcnRpbmcvYXN5bmNpZnkuaHRtbCkuXG4gICAgICovXG4gICAgbmV3QXN5bmNpZmllZEZ1bmN0aW9uKG5hbWUsIGZuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ld0Z1bmN0aW9uKG5hbWUsIGZuKTtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNBc3luY0NvbnRleHQgPSBRdWlja0pTQXN5bmNDb250ZXh0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC1hc3luY2lmeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU0NvbnRleHQgPSB2b2lkIDA7XG5jb25zdCBkZWJ1Z18xID0gcmVxdWlyZShcIi4vZGVidWdcIik7XG5jb25zdCBkZWZlcnJlZF9wcm9taXNlXzEgPSByZXF1aXJlKFwiLi9kZWZlcnJlZC1wcm9taXNlXCIpO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi9lcnJvcnNcIik7XG5jb25zdCBsaWZldGltZV8xID0gcmVxdWlyZShcIi4vbGlmZXRpbWVcIik7XG5jb25zdCBtZW1vcnlfMSA9IHJlcXVpcmUoXCIuL21lbW9yeVwiKTtcbmNvbnN0IHR5cGVzXzEgPSByZXF1aXJlKFwiLi90eXBlc1wiKTtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ29udGV4dE1lbW9yeSBleHRlbmRzIG1lbW9yeV8xLk1vZHVsZU1lbW9yeSB7XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgY29uc3RydWN0b3IoYXJncykge1xuICAgICAgICBzdXBlcihhcmdzLm1vZHVsZSk7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBuZXcgbGlmZXRpbWVfMS5TY29wZSgpO1xuICAgICAgICB0aGlzLmNvcHlKU1ZhbHVlID0gKHB0cikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmZpLlFUU19EdXBWYWx1ZVBvaW50ZXIodGhpcy5jdHgudmFsdWUsIHB0cik7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZnJlZUpTVmFsdWUgPSAocHRyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZVZhbHVlUG9pbnRlcih0aGlzLmN0eC52YWx1ZSwgcHRyKTtcbiAgICAgICAgfTtcbiAgICAgICAgYXJncy5vd25lZExpZmV0aW1lcz8uZm9yRWFjaCgobGlmZXRpbWUpID0+IHRoaXMuc2NvcGUubWFuYWdlKGxpZmV0aW1lKSk7XG4gICAgICAgIHRoaXMub3duZXIgPSBhcmdzLm93bmVyO1xuICAgICAgICB0aGlzLm1vZHVsZSA9IGFyZ3MubW9kdWxlO1xuICAgICAgICB0aGlzLmZmaSA9IGFyZ3MuZmZpO1xuICAgICAgICB0aGlzLnJ0ID0gYXJncy5ydDtcbiAgICAgICAgdGhpcy5jdHggPSB0aGlzLnNjb3BlLm1hbmFnZShhcmdzLmN0eCk7XG4gICAgfVxuICAgIGdldCBhbGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGUuYWxpdmU7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJhY2sgYGxpZmV0aW1lYCBzbyB0aGF0IGl0IGlzIGRpc3Bvc2VkIHdoZW4gdGhpcyBzY29wZSBpcyBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBtYW5hZ2UobGlmZXRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGUubWFuYWdlKGxpZmV0aW1lKTtcbiAgICB9XG4gICAgY29uc3VtZUpTQ2hhclBvaW50ZXIocHRyKSB7XG4gICAgICAgIGNvbnN0IHN0ciA9IHRoaXMubW9kdWxlLlVURjhUb1N0cmluZyhwdHIpO1xuICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZUNTdHJpbmcodGhpcy5jdHgudmFsdWUsIHB0cik7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIGhlYXBWYWx1ZUhhbmRsZShwdHIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBsaWZldGltZV8xLkxpZmV0aW1lKHB0ciwgdGhpcy5jb3B5SlNWYWx1ZSwgdGhpcy5mcmVlSlNWYWx1ZSwgdGhpcy5vd25lcik7XG4gICAgfVxufVxuLyoqXG4gKiBRdWlja0pTQ29udGV4dCB3cmFwcyBhIFF1aWNrSlMgSmF2YXNjcmlwdCBjb250ZXh0IChKU0NvbnRleHQqKSB3aXRoaW4gYVxuICogcnVudGltZS4gVGhlIGNvbnRleHRzIHdpdGhpbiB0aGUgc2FtZSBydW50aW1lIG1heSBleGNoYW5nZSBvYmplY3RzIGZyZWVseS5cbiAqIFlvdSBjYW4gdGhpbmsgb2Ygc2VwYXJhdGUgcnVudGltZXMgbGlrZSBkaWZmZXJlbnQgZG9tYWlucyBpbiBhIGJyb3dzZXIsIGFuZFxuICogdGhlIGNvbnRleHRzIHdpdGhpbiBhIHJ1bnRpbWUgbGlrZSB0aGUgZGlmZmVyZW50IHdpbmRvd3Mgb3BlbiB0byB0aGUgc2FtZVxuICogZG9tYWluLiBUaGUge0BsaW5rIHJ1bnRpbWV9IHJlZmVyZW5jZXMgdGhlIGNvbnRleHQncyBydW50aW1lLlxuICpcbiAqIFRoaXMgY2xhc3MncyBtZXRob2RzIHJldHVybiB7QGxpbmsgUXVpY2tKU0hhbmRsZX0sIHdoaWNoIHdyYXAgQyBwb2ludGVycyAoSlNWYWx1ZSopLlxuICogSXQncyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2FsbCBgLmRpc3Bvc2UoKWAgb24gYW55XG4gKiBoYW5kbGVzIHlvdSBjcmVhdGUgdG8gZnJlZSBtZW1vcnkgb25jZSB5b3UncmUgZG9uZSB3aXRoIHRoZSBoYW5kbGUuXG4gKlxuICogVXNlIHtAbGluayBRdWlja0pTUnVudGltZS5uZXdDb250ZXh0fSBvciB7QGxpbmsgUXVpY2tKU1dBU01Nb2R1bGUubmV3Q29udGV4dH1cbiAqIHRvIGNyZWF0ZSBhIG5ldyBRdWlja0pTQ29udGV4dC5cbiAqXG4gKiBDcmVhdGUgUXVpY2tKUyB2YWx1ZXMgaW5zaWRlIHRoZSBpbnRlcnByZXRlciB3aXRoIG1ldGhvZHMgbGlrZVxuICogW1tuZXdOdW1iZXJdXSwgW1tuZXdTdHJpbmddXSwgW1tuZXdBcnJheV1dLCBbW25ld09iamVjdF1dLFxuICogW1tuZXdGdW5jdGlvbl1dLCBhbmQgW1tuZXdQcm9taXNlXV0uXG4gKlxuICogQ2FsbCBbW3NldFByb3BdXSBvciBbW2RlZmluZVByb3BdXSB0byBjdXN0b21pemUgb2JqZWN0cy4gVXNlIHRob3NlIG1ldGhvZHNcbiAqIHdpdGggW1tnbG9iYWxdXSB0byBleHBvc2UgdGhlIHZhbHVlcyB5b3UgY3JlYXRlIHRvIHRoZSBpbnRlcmlvciBvZiB0aGVcbiAqIGludGVycHJldGVyLCBzbyB0aGV5IGNhbiBiZSB1c2VkIGluIFtbZXZhbENvZGVdXS5cbiAqXG4gKiBVc2UgW1tldmFsQ29kZV1dIG9yIFtbY2FsbEZ1bmN0aW9uXV0gdG8gZXhlY3V0ZSBKYXZhc2NyaXB0IGluc2lkZSB0aGUgVk0uIElmXG4gKiB5b3UncmUgdXNpbmcgYXN5bmNocm9ub3VzIGNvZGUgaW5zaWRlIHRoZSBRdWlja0pTQ29udGV4dCwgeW91IG1heSBuZWVkIHRvIGFsc29cbiAqIGNhbGwgW1tleGVjdXRlUGVuZGluZ0pvYnNdXS4gRXhlY3V0aW5nIGNvZGUgaW5zaWRlIHRoZSBydW50aW1lIHJldHVybnMgYVxuICogcmVzdWx0IG9iamVjdCByZXByZXNlbnRpbmcgc3VjY2Vzc2Z1bCBleGVjdXRpb24gb3IgYW4gZXJyb3IuIFlvdSBtdXN0IGRpc3Bvc2VcbiAqIG9mIGFueSBzdWNoIHJlc3VsdHMgdG8gYXZvaWQgbGVha2luZyBtZW1vcnkgaW5zaWRlIHRoZSBWTS5cbiAqXG4gKiBJbXBsZW1lbnQgbWVtb3J5IGFuZCBDUFUgY29uc3RyYWludHMgYXQgdGhlIHJ1bnRpbWUgbGV2ZWwsIHVzaW5nIFtbcnVudGltZV1dLlxuICogU2VlIHtAbGluayBRdWlja0pTUnVudGltZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICovXG4vLyBUT0RPOiBNYW5hZ2Ugb3duIGNhbGxiYWNrIHJlZ2lzdHJhdGlvblxuY2xhc3MgUXVpY2tKU0NvbnRleHQge1xuICAgIC8qKlxuICAgICAqIFVzZSB7QGxpbmsgUXVpY2tKUy5jcmVhdGVWbX0gdG8gY3JlYXRlIGEgUXVpY2tKU0NvbnRleHQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYXJncykge1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5fdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5fbnVsbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuX2ZhbHNlID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5fdHJ1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuX2dsb2JhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuX0JpZ0ludCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuZm5OZXh0SWQgPSAtMzI3Njg7IC8vIG1pbiB2YWx1ZSBvZiBzaWduZWQgMTZiaXQgaW50IHVzZWQgYnkgUXVpY2tqc1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5mbk1hcHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNUb0hvc3RDYWxsYmFja3MgPSB7XG4gICAgICAgICAgICBjYWxsRnVuY3Rpb246IChjdHgsIHRoaXNfcHRyLCBhcmdjLCBhcmd2LCBmbl9pZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdHggIT09IHRoaXMuY3R4LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlF1aWNrSlNDb250ZXh0IGluc3RhbmNlIHJlY2VpdmVkIEMgLT4gSlMgY2FsbCB3aXRoIG1pc21hdGNoZWQgY3R4XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBmbiA9IHRoaXMuZ2V0RnVuY3Rpb24oZm5faWQpO1xuICAgICAgICAgICAgICAgIGlmICghZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBcInRocm93XCIgaXMgbm90IGNhdGNoLWFibGUgZnJvbSB0aGUgVFMgc2lkZS4gY291bGQgd2Ugc29tZWhvdyBoYW5kbGUgdGhpcyBoaWdoZXIgdXA/XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVpY2tKU0NvbnRleHQgaGFkIG5vIGNhbGxiYWNrIHdpdGggaWQgJHtmbl9pZH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlTWF5YmVBc3luYyh0aGlzLCBmdW5jdGlvbiogKGF3YWl0ZWQsIHNjb3BlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRoaXNIYW5kbGUgPSBzY29wZS5tYW5hZ2UobmV3IGxpZmV0aW1lXzEuV2Vha0xpZmV0aW1lKHRoaXNfcHRyLCB0aGlzLm1lbW9yeS5jb3B5SlNWYWx1ZSwgdGhpcy5tZW1vcnkuZnJlZUpTVmFsdWUsIHRoaXMucnVudGltZSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmdIYW5kbGVzID0gbmV3IEFycmF5KGFyZ2MpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ2M7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHRyID0gdGhpcy5mZmkuUVRTX0FyZ3ZHZXRKU1ZhbHVlQ29uc3RQb2ludGVyKGFyZ3YsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnSGFuZGxlc1tpXSA9IHNjb3BlLm1hbmFnZShuZXcgbGlmZXRpbWVfMS5XZWFrTGlmZXRpbWUocHRyLCB0aGlzLm1lbW9yeS5jb3B5SlNWYWx1ZSwgdGhpcy5tZW1vcnkuZnJlZUpTVmFsdWUsIHRoaXMucnVudGltZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCogYXdhaXRlZChmbi5hcHBseSh0aGlzSGFuZGxlLCBhcmdIYW5kbGVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwiZXJyb3JcIiBpbiByZXN1bHQgJiYgcmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBkZWJ1Z18xLmRlYnVnTG9nKShcInRocm93IGVycm9yXCIsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2NvcGUubWFuYWdlKHJlc3VsdCBpbnN0YW5jZW9mIGxpZmV0aW1lXzEuTGlmZXRpbWUgPyByZXN1bHQgOiByZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZmaS5RVFNfRHVwVmFsdWVQb2ludGVyKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvclRvSGFuZGxlKGVycm9yKS5jb25zdW1lKChlcnJvckhhbmRsZSkgPT4gdGhpcy5mZmkuUVRTX1Rocm93KHRoaXMuY3R4LnZhbHVlLCBlcnJvckhhbmRsZS52YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnJ1bnRpbWUgPSBhcmdzLnJ1bnRpbWU7XG4gICAgICAgIHRoaXMubW9kdWxlID0gYXJncy5tb2R1bGU7XG4gICAgICAgIHRoaXMuZmZpID0gYXJncy5mZmk7XG4gICAgICAgIHRoaXMucnQgPSBhcmdzLnJ0O1xuICAgICAgICB0aGlzLmN0eCA9IGFyZ3MuY3R4O1xuICAgICAgICB0aGlzLm1lbW9yeSA9IG5ldyBDb250ZXh0TWVtb3J5KHtcbiAgICAgICAgICAgIC4uLmFyZ3MsXG4gICAgICAgICAgICBvd25lcjogdGhpcy5ydW50aW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgYXJncy5jYWxsYmFja3Muc2V0Q29udGV4dENhbGxiYWNrcyh0aGlzLmN0eC52YWx1ZSwgdGhpcy5jVG9Ib3N0Q2FsbGJhY2tzKTtcbiAgICAgICAgdGhpcy5kdW1wID0gdGhpcy5kdW1wLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZ2V0U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5nZXROdW1iZXIgPSB0aGlzLmdldE51bWJlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlc29sdmVQcm9taXNlID0gdGhpcy5yZXNvbHZlUHJvbWlzZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICAvLyBAaW1wbGVtZW50IERpc3Bvc2FibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGdldCBhbGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmFsaXZlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIG9mIHRoaXMgVk0ncyB1bmRlcmx5aW5nIHJlc291cmNlcy5cbiAgICAgKlxuICAgICAqIEB0aHJvd3MgQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRob3V0IGRpc3Bvc2luZyBvZiBhbGwgY3JlYXRlZCBoYW5kbGVzXG4gICAgICogd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuXG4gICAgICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5tZW1vcnkuZGlzcG9zZSgpO1xuICAgIH1cbiAgICAvLyBHbG9iYWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFtgdW5kZWZpbmVkYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvdW5kZWZpbmVkKS5cbiAgICAgKi9cbiAgICBnZXQgdW5kZWZpbmVkKCkge1xuICAgICAgICBpZiAodGhpcy5fdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVuZGVmaW5lZCBpcyBhIGNvbnN0YW50LCBpbW11dGFibGUgdmFsdWUgaW4gUXVpY2tKUy5cbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5mZmkuUVRTX0dldFVuZGVmaW5lZCgpO1xuICAgICAgICByZXR1cm4gKHRoaXMuX3VuZGVmaW5lZCA9IG5ldyBsaWZldGltZV8xLlN0YXRpY0xpZmV0aW1lKHB0cikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbYG51bGxgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9udWxsKS5cbiAgICAgKi9cbiAgICBnZXQgbnVsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX251bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9udWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIE51bGwgaXMgYSBjb25zdGFudCwgaW1tdXRhYmxlIHZhbHVlIGluIFF1aWNrSlMuXG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMuZmZpLlFUU19HZXROdWxsKCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fbnVsbCA9IG5ldyBsaWZldGltZV8xLlN0YXRpY0xpZmV0aW1lKHB0cikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbYHRydWVgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy90cnVlKS5cbiAgICAgKi9cbiAgICBnZXQgdHJ1ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RydWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRydWUgaXMgYSBjb25zdGFudCwgaW1tdXRhYmxlIHZhbHVlIGluIFF1aWNrSlMuXG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMuZmZpLlFUU19HZXRUcnVlKCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fdHJ1ZSA9IG5ldyBsaWZldGltZV8xLlN0YXRpY0xpZmV0aW1lKHB0cikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbYGZhbHNlYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZmFsc2UpLlxuICAgICAqL1xuICAgIGdldCBmYWxzZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsc2UgaXMgYSBjb25zdGFudCwgaW1tdXRhYmxlIHZhbHVlIGluIFF1aWNrSlMuXG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMuZmZpLlFUU19HZXRGYWxzZSgpO1xuICAgICAgICByZXR1cm4gKHRoaXMuX2ZhbHNlID0gbmV3IGxpZmV0aW1lXzEuU3RhdGljTGlmZXRpbWUocHRyKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtgZ2xvYmFsYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMpLlxuICAgICAqIEEgaGFuZGxlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IGluc2lkZSB0aGUgaW50ZXJwcmV0ZXIuXG4gICAgICogWW91IGNhbiBzZXQgcHJvcGVydGllcyB0byBjcmVhdGUgZ2xvYmFsIHZhcmlhYmxlcy5cbiAgICAgKi9cbiAgICBnZXQgZ2xvYmFsKCkge1xuICAgICAgICBpZiAodGhpcy5fZ2xvYmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2xvYmFsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBnbG9iYWwgaXMgYSBKU1ZhbHVlLCBidXQgc2luY2UgaXQncyBsaWZldGltZSBpcyBhcyBsb25nIGFzIHRoZSBWTSdzLFxuICAgICAgICAvLyB3ZSBzaG91bGQgbWFuYWdlIGl0LlxuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLmZmaS5RVFNfR2V0R2xvYmFsT2JqZWN0KHRoaXMuY3R4LnZhbHVlKTtcbiAgICAgICAgLy8gQXV0b21hdGljYWxseSBjbGVhbiB1cCB0aGlzIHJlZmVyZW5jZSB3aGVuIHdlIGRpc3Bvc2VcbiAgICAgICAgdGhpcy5tZW1vcnkubWFuYWdlKHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShwdHIpKTtcbiAgICAgICAgLy8gVGhpcyBpc24ndCB0ZWNobmljYWxseSBhIHN0YXRpYyBsaWZldGltZSwgYnV0IHNpbmNlIGl0IGhhcyB0aGUgc2FtZVxuICAgICAgICAvLyBsaWZldGltZSBhcyB0aGUgVk0sIGl0J3Mgb2theSB0byBmYWtlIG9uZSBzaW5jZSB3aGVuIHRoZSBWTSBpc1xuICAgICAgICAvLyBkaXNwb3NlZCwgbm8gb3RoZXIgZnVuY3Rpb25zIHdpbGwgYWNjZXB0IHRoZSB2YWx1ZS5cbiAgICAgICAgdGhpcy5fZ2xvYmFsID0gbmV3IGxpZmV0aW1lXzEuU3RhdGljTGlmZXRpbWUocHRyLCB0aGlzLnJ1bnRpbWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2xvYmFsO1xuICAgIH1cbiAgICAvLyBOZXcgdmFsdWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgSmF2YXNjcmlwdCBudW1iZXIgaW50byBhIFF1aWNrSlMgdmFsdWUuXG4gICAgICovXG4gICAgbmV3TnVtYmVyKG51bSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHRoaXMuZmZpLlFUU19OZXdGbG9hdDY0KHRoaXMuY3R4LnZhbHVlLCBudW0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgUXVpY2tKUyBbc3RyaW5nXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcpIHZhbHVlLlxuICAgICAqL1xuICAgIG5ld1N0cmluZyhzdHIpIHtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5tZW1vcnlcbiAgICAgICAgICAgIC5uZXdIZWFwQ2hhclBvaW50ZXIoc3RyKVxuICAgICAgICAgICAgLmNvbnN1bWUoKGNoYXJIYW5kbGUpID0+IHRoaXMuZmZpLlFUU19OZXdTdHJpbmcodGhpcy5jdHgudmFsdWUsIGNoYXJIYW5kbGUudmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShwdHIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBRdWlja0pTIFtzeW1ib2xdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N5bWJvbCkgdmFsdWUuXG4gICAgICogTm8gdHdvIHN5bWJvbHMgY3JlYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSB0aGUgc2FtZSB2YWx1ZS5cbiAgICAgKi9cbiAgICBuZXdVbmlxdWVTeW1ib2woZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gKHR5cGVvZiBkZXNjcmlwdGlvbiA9PT0gXCJzeW1ib2xcIiA/IGRlc2NyaXB0aW9uLmRlc2NyaXB0aW9uIDogZGVzY3JpcHRpb24pID8/IFwiXCI7XG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMubWVtb3J5XG4gICAgICAgICAgICAubmV3SGVhcENoYXJQb2ludGVyKGtleSlcbiAgICAgICAgICAgIC5jb25zdW1lKChjaGFySGFuZGxlKSA9PiB0aGlzLmZmaS5RVFNfTmV3U3ltYm9sKHRoaXMuY3R4LnZhbHVlLCBjaGFySGFuZGxlLnZhbHVlLCAwKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocHRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEgc3ltYm9sIGZyb20gdGhlIFtnbG9iYWwgcmVnaXN0cnldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N5bWJvbCNzaGFyZWRfc3ltYm9sc19pbl90aGVfZ2xvYmFsX3N5bWJvbF9yZWdpc3RyeSkgZm9yIHRoZSBnaXZlbiBrZXkuXG4gICAgICogQWxsIHN5bWJvbHMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGtleSB3aWxsIGJlIHRoZSBzYW1lIHZhbHVlLlxuICAgICAqL1xuICAgIG5ld1N5bWJvbEZvcihrZXkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiA/IGtleS5kZXNjcmlwdGlvbiA6IGtleSkgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5tZW1vcnlcbiAgICAgICAgICAgIC5uZXdIZWFwQ2hhclBvaW50ZXIoZGVzY3JpcHRpb24pXG4gICAgICAgICAgICAuY29uc3VtZSgoY2hhckhhbmRsZSkgPT4gdGhpcy5mZmkuUVRTX05ld1N5bWJvbCh0aGlzLmN0eC52YWx1ZSwgY2hhckhhbmRsZS52YWx1ZSwgMSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHB0cik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIFF1aWNrSlMgW2JpZ2ludF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQmlnSW50KSB2YWx1ZS5cbiAgICAgKi9cbiAgICBuZXdCaWdJbnQobnVtKSB7XG4gICAgICAgIGlmICghdGhpcy5fQmlnSW50KSB7XG4gICAgICAgICAgICBjb25zdCBiaWdJbnRIYW5kbGUgPSB0aGlzLmdldFByb3AodGhpcy5nbG9iYWwsIFwiQmlnSW50XCIpO1xuICAgICAgICAgICAgdGhpcy5tZW1vcnkubWFuYWdlKGJpZ0ludEhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLl9CaWdJbnQgPSBuZXcgbGlmZXRpbWVfMS5TdGF0aWNMaWZldGltZShiaWdJbnRIYW5kbGUudmFsdWUsIHRoaXMucnVudGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmlnSW50SGFuZGxlID0gdGhpcy5fQmlnSW50O1xuICAgICAgICBjb25zdCBhc1N0cmluZyA9IFN0cmluZyhudW0pO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXdTdHJpbmcoYXNTdHJpbmcpLmNvbnN1bWUoKGhhbmRsZSkgPT4gdGhpcy51bndyYXBSZXN1bHQodGhpcy5jYWxsRnVuY3Rpb24oYmlnSW50SGFuZGxlLCB0aGlzLnVuZGVmaW5lZCwgaGFuZGxlKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBge31gLlxuICAgICAqIENyZWF0ZSBhIG5ldyBRdWlja0pTIFtvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9PYmplY3RfaW5pdGlhbGl6ZXIpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3RvdHlwZSAtIExpa2UgW2BPYmplY3QuY3JlYXRlYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2NyZWF0ZSkuXG4gICAgICovXG4gICAgbmV3T2JqZWN0KHByb3RvdHlwZSkge1xuICAgICAgICBpZiAocHJvdG90eXBlKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQocHJvdG90eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwdHIgPSBwcm90b3R5cGVcbiAgICAgICAgICAgID8gdGhpcy5mZmkuUVRTX05ld09iamVjdFByb3RvKHRoaXMuY3R4LnZhbHVlLCBwcm90b3R5cGUudmFsdWUpXG4gICAgICAgICAgICA6IHRoaXMuZmZpLlFUU19OZXdPYmplY3QodGhpcy5jdHgudmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHB0cik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGBbXWAuXG4gICAgICogQ3JlYXRlIGEgbmV3IFF1aWNrSlMgW2FycmF5XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheSkuXG4gICAgICovXG4gICAgbmV3QXJyYXkoKSB7XG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMuZmZpLlFUU19OZXdBcnJheSh0aGlzLmN0eC52YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocHRyKTtcbiAgICB9XG4gICAgbmV3UHJvbWlzZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBkZWZlcnJlZFByb21pc2UgPSBsaWZldGltZV8xLlNjb3BlLndpdGhTY29wZSgoc2NvcGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG11dGFibGVQb2ludGVyQXJyYXkgPSBzY29wZS5tYW5hZ2UodGhpcy5tZW1vcnkubmV3TXV0YWJsZVBvaW50ZXJBcnJheSgyKSk7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlUHRyID0gdGhpcy5mZmkuUVRTX05ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMuY3R4LnZhbHVlLCBtdXRhYmxlUG9pbnRlckFycmF5LnZhbHVlLnB0cik7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlSGFuZGxlID0gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHByb21pc2VQdHIpO1xuICAgICAgICAgICAgY29uc3QgW3Jlc29sdmVIYW5kbGUsIHJlamVjdEhhbmRsZV0gPSBBcnJheS5mcm9tKG11dGFibGVQb2ludGVyQXJyYXkudmFsdWUudHlwZWRBcnJheSkubWFwKChqc3ZhbHVlUHRyKSA9PiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUoanN2YWx1ZVB0cikpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBkZWZlcnJlZF9wcm9taXNlXzEuUXVpY2tKU0RlZmVycmVkUHJvbWlzZSh7XG4gICAgICAgICAgICAgICAgY29udGV4dDogdGhpcyxcbiAgICAgICAgICAgICAgICBwcm9taXNlSGFuZGxlLFxuICAgICAgICAgICAgICAgIHJlc29sdmVIYW5kbGUsXG4gICAgICAgICAgICAgICAgcmVqZWN0SGFuZGxlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3IFByb21pc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGRlZmVycmVkUHJvbWlzZS5yZXNvbHZlLCAoZXJyb3IpID0+IGVycm9yIGluc3RhbmNlb2YgbGlmZXRpbWVfMS5MaWZldGltZVxuICAgICAgICAgICAgICAgID8gZGVmZXJyZWRQcm9taXNlLnJlamVjdChlcnJvcilcbiAgICAgICAgICAgICAgICA6IHRoaXMubmV3RXJyb3IoZXJyb3IpLmNvbnN1bWUoZGVmZXJyZWRQcm9taXNlLnJlamVjdCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZlcnJlZFByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBKYXZhc2NyaXB0IGZ1bmN0aW9uIGludG8gYSBRdWlja0pTIGZ1bmN0aW9uIHZhbHVlLlxuICAgICAqIFNlZSBbW1ZtRnVuY3Rpb25JbXBsZW1lbnRhdGlvbl1dIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBBIFtbVm1GdW5jdGlvbkltcGxlbWVudGF0aW9uXV0gc2hvdWxkIG5vdCBmcmVlIGl0cyBhcmd1bWVudHMgb3IgaXRzIHJldHVyblxuICAgICAqIHZhbHVlLiBBIFZtRnVuY3Rpb25JbXBsZW1lbnRhdGlvbiBzaG91bGQgYWxzbyBub3QgcmV0YWluIGFueSByZWZlcmVuY2VzIHRvXG4gICAgICogaXRzIHJldHVybiB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFRvIGltcGxlbWVudCBhbiBhc3luYyBmdW5jdGlvbiwgY3JlYXRlIGEgcHJvbWlzZSB3aXRoIFtbbmV3UHJvbWlzZV1dLCB0aGVuXG4gICAgICogcmV0dXJuIHRoZSBkZWZlcnJlZCBwcm9taXNlIGhhbmRsZSBmcm9tIGBkZWZlcnJlZC5oYW5kbGVgIGZyb20geW91clxuICAgICAqIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uOlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogY29uc3QgZGVmZXJyZWQgPSB2bS5uZXdQcm9taXNlKClcbiAgICAgKiBzb21lTmF0aXZlQXN5bmNGdW5jdGlvbigpLnRoZW4oZGVmZXJyZWQucmVzb2x2ZSlcbiAgICAgKiByZXR1cm4gZGVmZXJyZWQuaGFuZGxlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbmV3RnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICAgICAgY29uc3QgZm5JZCA9ICsrdGhpcy5mbk5leHRJZDtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbihmbklkLCBmbik7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUodGhpcy5mZmkuUVRTX05ld0Z1bmN0aW9uKHRoaXMuY3R4LnZhbHVlLCBmbklkLCBuYW1lKSk7XG4gICAgfVxuICAgIG5ld0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9ySGFuZGxlID0gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHRoaXMuZmZpLlFUU19OZXdFcnJvcih0aGlzLmN0eC52YWx1ZSkpO1xuICAgICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXdTdHJpbmcoZXJyb3IubmFtZSkuY29uc3VtZSgoaGFuZGxlKSA9PiB0aGlzLnNldFByb3AoZXJyb3JIYW5kbGUsIFwibmFtZVwiLCBoYW5kbGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5ld1N0cmluZyhlcnJvci5tZXNzYWdlKS5jb25zdW1lKChoYW5kbGUpID0+IHRoaXMuc2V0UHJvcChlcnJvckhhbmRsZSwgXCJtZXNzYWdlXCIsIGhhbmRsZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBlcnJvciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5uZXdTdHJpbmcoZXJyb3IpLmNvbnN1bWUoKGhhbmRsZSkgPT4gdGhpcy5zZXRQcm9wKGVycm9ySGFuZGxlLCBcIm1lc3NhZ2VcIiwgaGFuZGxlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBzdXBwb3J0ZWQgaW4gdGhlIHR5cGUgc2lnbmF0dXJlIGJ1dCBtYXliZSBpdCB3aWxsIG1ha2UgbGlmZSBlYXNpZXIuXG4gICAgICAgICAgICB0aGlzLm5ld1N0cmluZyhTdHJpbmcoZXJyb3IpKS5jb25zdW1lKChoYW5kbGUpID0+IHRoaXMuc2V0UHJvcChlcnJvckhhbmRsZSwgXCJtZXNzYWdlXCIsIGhhbmRsZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnJvckhhbmRsZTtcbiAgICB9XG4gICAgLy8gUmVhZCB2YWx1ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBgdHlwZW9mYCBvcGVyYXRvci4gKipOb3QqKiBbc3RhbmRhcmRzIGNvbXBsaWFudF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL3R5cGVvZikuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIERvZXMgbm90IHN1cHBvcnQgQmlnSW50IHZhbHVlcyBjb3JyZWN0bHkuXG4gICAgICovXG4gICAgdHlwZW9mKGhhbmRsZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmNvbnN1bWVIZWFwQ2hhclBvaW50ZXIodGhpcy5mZmkuUVRTX1R5cGVvZih0aGlzLmN0eC52YWx1ZSwgaGFuZGxlLnZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBoYW5kbGVgIGludG8gYSBKYXZhc2NyaXB0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBgTmFOYCBvbiBlcnJvciwgb3RoZXJ3aXNlIGEgYG51bWJlcmAuXG4gICAgICovXG4gICAgZ2V0TnVtYmVyKGhhbmRsZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmZpLlFUU19HZXRGbG9hdDY0KHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgaGFuZGxlYCB0byBhIEphdmFzY3JpcHQgc3RyaW5nLlxuICAgICAqL1xuICAgIGdldFN0cmluZyhoYW5kbGUpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmFzc2VydE93bmVkKGhhbmRsZSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5jb25zdW1lSlNDaGFyUG9pbnRlcih0aGlzLmZmaS5RVFNfR2V0U3RyaW5nKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYGhhbmRsZWAgaW50byBhIEphdmFzY3JpcHQgc3ltYm9sLiBJZiB0aGUgc3ltYm9sIGlzIGluIHRoZSBnbG9iYWxcbiAgICAgKiByZWdpc3RyeSBpbiB0aGUgZ3Vlc3QsIGl0IHdpbGwgYmUgY3JlYXRlZCB3aXRoIFN5bWJvbC5mb3Igb24gdGhlIGhvc3QuXG4gICAgICovXG4gICAgZ2V0U3ltYm9sKGhhbmRsZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5tZW1vcnkuY29uc3VtZUpTQ2hhclBvaW50ZXIodGhpcy5mZmkuUVRTX0dldFN5bWJvbERlc2NyaXB0aW9uT3JLZXkodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSkpO1xuICAgICAgICBjb25zdCBpc0dsb2JhbCA9IHRoaXMuZmZpLlFUU19Jc0dsb2JhbFN5bWJvbCh0aGlzLmN0eC52YWx1ZSwgaGFuZGxlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGlzR2xvYmFsID8gU3ltYm9sLmZvcihrZXkpIDogU3ltYm9sKGtleSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBoYW5kbGVgIHRvIGEgSmF2YXNjcmlwdCBiaWdpbnQuXG4gICAgICovXG4gICAgZ2V0QmlnSW50KGhhbmRsZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgY29uc3QgYXNTdHJpbmcgPSB0aGlzLmdldFN0cmluZyhoYW5kbGUpO1xuICAgICAgICByZXR1cm4gQmlnSW50KGFzU3RyaW5nKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYFByb21pc2UucmVzb2x2ZSh2YWx1ZSlgLlxuICAgICAqIENvbnZlcnQgYSBoYW5kbGUgY29udGFpbmluZyBhIFByb21pc2UtbGlrZSB2YWx1ZSBpbnNpZGUgdGhlIFZNIGludG8gYW5cbiAgICAgKiBhY3R1YWwgcHJvbWlzZSBvbiB0aGUgaG9zdC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogWW91IG1heSBuZWVkIHRvIGNhbGwgW1tleGVjdXRlUGVuZGluZ0pvYnNdXSB0byBlbnN1cmUgdGhhdCB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9taXNlTGlrZUhhbmRsZSAtIEEgaGFuZGxlIHRvIGEgUHJvbWlzZS1saWtlIHZhbHVlIHdpdGggYSBgLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKWAgbWV0aG9kLlxuICAgICAqL1xuICAgIHJlc29sdmVQcm9taXNlKHByb21pc2VMaWtlSGFuZGxlKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChwcm9taXNlTGlrZUhhbmRsZSk7XG4gICAgICAgIGNvbnN0IHZtUmVzb2x2ZVJlc3VsdCA9IGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlKChzY29wZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgdm1Qcm9taXNlID0gc2NvcGUubWFuYWdlKHRoaXMuZ2V0UHJvcCh0aGlzLmdsb2JhbCwgXCJQcm9taXNlXCIpKTtcbiAgICAgICAgICAgIGNvbnN0IHZtUHJvbWlzZVJlc29sdmUgPSBzY29wZS5tYW5hZ2UodGhpcy5nZXRQcm9wKHZtUHJvbWlzZSwgXCJyZXNvbHZlXCIpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhbGxGdW5jdGlvbih2bVByb21pc2VSZXNvbHZlLCB2bVByb21pc2UsIHByb21pc2VMaWtlSGFuZGxlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh2bVJlc29sdmVSZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodm1SZXNvbHZlUmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlKChzY29wZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVIYW5kbGUgPSBzY29wZS5tYW5hZ2UodGhpcy5uZXdGdW5jdGlvbihcInJlc29sdmVcIiwgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyB2YWx1ZTogdmFsdWUgJiYgdmFsdWUuZHVwKCkgfSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdEhhbmRsZSA9IHNjb3BlLm1hbmFnZSh0aGlzLm5ld0Z1bmN0aW9uKFwicmVqZWN0XCIsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZXJyb3I6IGVycm9yICYmIGVycm9yLmR1cCgpIH0pO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlSGFuZGxlID0gc2NvcGUubWFuYWdlKHZtUmVzb2x2ZVJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZVRoZW5IYW5kbGUgPSBzY29wZS5tYW5hZ2UodGhpcy5nZXRQcm9wKHByb21pc2VIYW5kbGUsIFwidGhlblwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy51bndyYXBSZXN1bHQodGhpcy5jYWxsRnVuY3Rpb24ocHJvbWlzZVRoZW5IYW5kbGUsIHByb21pc2VIYW5kbGUsIHJlc29sdmVIYW5kbGUsIHJlamVjdEhhbmRsZSkpLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gUHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBgaGFuZGxlW2tleV1gLlxuICAgICAqIEdldCBhIHByb3BlcnR5IGZyb20gYSBKU1ZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgSlNWYWx1ZSBoYW5kbGUsIG9yIGFzIGFcbiAgICAgKiBKYXZhc2NyaXB0IHN0cmluZyAod2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgYXV0b21hdGljYWxseSkuXG4gICAgICovXG4gICAgZ2V0UHJvcChoYW5kbGUsIGtleSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5ib3Jyb3dQcm9wZXJ0eUtleShrZXkpLmNvbnN1bWUoKHF1aWNrSlNLZXkpID0+IHRoaXMuZmZpLlFUU19HZXRQcm9wKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUsIHF1aWNrSlNLZXkudmFsdWUpKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHB0cik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGBoYW5kbGVba2V5XSA9IHZhbHVlYC5cbiAgICAgKiBTZXQgYSBwcm9wZXJ0eSBvbiBhIEpTVmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIE5vdGUgdGhhdCB0aGUgUXVpY2tKUyBhdXRob3JzIHJlY29tbWVuZCB1c2luZyBbW2RlZmluZVByb3BdXSB0byBkZWZpbmUgbmV3XG4gICAgICogcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkgbWF5IGJlIHNwZWNpZmllZCBhcyBhIEpTVmFsdWUgaGFuZGxlLCBvciBhcyBhXG4gICAgICogSmF2YXNjcmlwdCBzdHJpbmcgb3IgbnVtYmVyICh3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5IHRvIGEgSlNWYWx1ZSkuXG4gICAgICovXG4gICAgc2V0UHJvcChoYW5kbGUsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmFzc2VydE93bmVkKGhhbmRsZSk7XG4gICAgICAgIC8vIGZyZWUgbmV3bHkgYWxsb2NhdGVkIHZhbHVlIGlmIGtleSB3YXMgYSBzdHJpbmcgb3IgbnVtYmVyLiBOby1vcCBpZiBzdHJpbmcgd2FzIGFscmVhZHlcbiAgICAgICAgLy8gYSBRdWlja0pTIGhhbmRsZS5cbiAgICAgICAgdGhpcy5ib3Jyb3dQcm9wZXJ0eUtleShrZXkpLmNvbnN1bWUoKHF1aWNrSlNLZXkpID0+IHRoaXMuZmZpLlFUU19TZXRQcm9wKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUsIHF1aWNrSlNLZXkudmFsdWUsIHZhbHVlLnZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtgT2JqZWN0LmRlZmluZVByb3BlcnR5KGhhbmRsZSwga2V5LCBkZXNjcmlwdG9yKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9kZWZpbmVQcm9wZXJ0eSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IG1heSBiZSBzcGVjaWZpZWQgYXMgYSBKU1ZhbHVlIGhhbmRsZSwgb3IgYXMgYVxuICAgICAqIEphdmFzY3JpcHQgc3RyaW5nIG9yIG51bWJlciAod2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgYXV0b21hdGljYWxseSB0byBhIEpTVmFsdWUpLlxuICAgICAqL1xuICAgIGRlZmluZVByb3AoaGFuZGxlLCBrZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmFzc2VydE93bmVkKGhhbmRsZSk7XG4gICAgICAgIGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlKChzY29wZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcXVpY2tKU0tleSA9IHNjb3BlLm1hbmFnZSh0aGlzLmJvcnJvd1Byb3BlcnR5S2V5KGtleSkpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkZXNjcmlwdG9yLnZhbHVlIHx8IHRoaXMudW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgY29uZmlndXJhYmxlID0gQm9vbGVhbihkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSk7XG4gICAgICAgICAgICBjb25zdCBlbnVtZXJhYmxlID0gQm9vbGVhbihkZXNjcmlwdG9yLmVudW1lcmFibGUpO1xuICAgICAgICAgICAgY29uc3QgaGFzVmFsdWUgPSBCb29sZWFuKGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgZ2V0ID0gZGVzY3JpcHRvci5nZXRcbiAgICAgICAgICAgICAgICA/IHNjb3BlLm1hbmFnZSh0aGlzLm5ld0Z1bmN0aW9uKGRlc2NyaXB0b3IuZ2V0Lm5hbWUsIGRlc2NyaXB0b3IuZ2V0KSlcbiAgICAgICAgICAgICAgICA6IHRoaXMudW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3Qgc2V0ID0gZGVzY3JpcHRvci5zZXRcbiAgICAgICAgICAgICAgICA/IHNjb3BlLm1hbmFnZSh0aGlzLm5ld0Z1bmN0aW9uKGRlc2NyaXB0b3Iuc2V0Lm5hbWUsIGRlc2NyaXB0b3Iuc2V0KSlcbiAgICAgICAgICAgICAgICA6IHRoaXMudW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX0RlZmluZVByb3AodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSwgcXVpY2tKU0tleS52YWx1ZSwgdmFsdWUudmFsdWUsIGdldC52YWx1ZSwgc2V0LnZhbHVlLCBjb25maWd1cmFibGUsIGVudW1lcmFibGUsIGhhc1ZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEV2YWx1YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogW2BmdW5jLmNhbGwodGhpc1ZhbCwgLi4uYXJncylgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9jYWxsKS5cbiAgICAgKiBDYWxsIGEgSlNWYWx1ZSBhcyBhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogU2VlIFtbdW53cmFwUmVzdWx0XV0sIHdoaWNoIHdpbGwgdGhyb3cgaWYgdGhlIGZ1bmN0aW9uIHJldHVybmVkIGFuIGVycm9yLCBvclxuICAgICAqIHJldHVybiB0aGUgcmVzdWx0IGhhbmRsZSBkaXJlY3RseS4gSWYgZXZhbHVhdGlvbiByZXR1cm5lZCBhIGhhbmRsZSBjb250YWluaW5nXG4gICAgICogYSBwcm9taXNlLCB1c2UgW1tyZXNvbHZlUHJvbWlzZV1dIHRvIGNvbnZlcnQgaXQgdG8gYSBuYXRpdmUgcHJvbWlzZSBhbmRcbiAgICAgKiBbW2V4ZWN1dGVQZW5kaW5nSm9ic11dIHRvIGZpbmlzaCBldmFsdWF0aW5nIHRoZSBwcm9taXNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSByZXN1bHQuIElmIHRoZSBmdW5jdGlvbiB0aHJldyBzeW5jaHJvbm91c2x5LCBgcmVzdWx0LmVycm9yYCBiZSBhXG4gICAgICogaGFuZGxlIHRvIHRoZSBleGNlcHRpb24uIE90aGVyd2lzZSBgcmVzdWx0LnZhbHVlYCB3aWxsIGJlIGEgaGFuZGxlIHRvIHRoZVxuICAgICAqIHZhbHVlLlxuICAgICAqL1xuICAgIGNhbGxGdW5jdGlvbihmdW5jLCB0aGlzVmFsLCAuLi5hcmdzKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChmdW5jKTtcbiAgICAgICAgY29uc3QgcmVzdWx0UHRyID0gdGhpcy5tZW1vcnlcbiAgICAgICAgICAgIC50b1BvaW50ZXJBcnJheShhcmdzKVxuICAgICAgICAgICAgLmNvbnN1bWUoKGFyZ3NBcnJheVB0cikgPT4gdGhpcy5mZmkuUVRTX0NhbGwodGhpcy5jdHgudmFsdWUsIGZ1bmMudmFsdWUsIHRoaXNWYWwudmFsdWUsIGFyZ3MubGVuZ3RoLCBhcmdzQXJyYXlQdHIudmFsdWUpKTtcbiAgICAgICAgY29uc3QgZXJyb3JQdHIgPSB0aGlzLmZmaS5RVFNfUmVzb2x2ZUV4Y2VwdGlvbih0aGlzLmN0eC52YWx1ZSwgcmVzdWx0UHRyKTtcbiAgICAgICAgaWYgKGVycm9yUHRyKSB7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZVZhbHVlUG9pbnRlcih0aGlzLmN0eC52YWx1ZSwgcmVzdWx0UHRyKTtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUoZXJyb3JQdHIpIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShyZXN1bHRQdHIpIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpa2UgW2BldmFsKGNvZGUpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZXZhbCNEZXNjcmlwdGlvbikuXG4gICAgICogRXZhbHVhdGVzIHRoZSBKYXZhc2NyaXB0IHNvdXJjZSBgY29kZWAgaW4gdGhlIGdsb2JhbCBzY29wZSBvZiB0aGlzIFZNLlxuICAgICAqIFdoZW4gd29ya2luZyB3aXRoIGFzeW5jIGNvZGUsIHlvdSBtYW55IG5lZWQgdG8gY2FsbCBbW2V4ZWN1dGVQZW5kaW5nSm9ic11dXG4gICAgICogdG8gZXhlY3V0ZSBjYWxsYmFja3MgcGVuZGluZyBhZnRlciBzeW5jaHJvbm91cyBldmFsdWF0aW9uIHJldHVybnMuXG4gICAgICpcbiAgICAgKiBTZWUgW1t1bndyYXBSZXN1bHRdXSwgd2hpY2ggd2lsbCB0aHJvdyBpZiB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYW4gZXJyb3IsIG9yXG4gICAgICogcmV0dXJuIHRoZSByZXN1bHQgaGFuZGxlIGRpcmVjdGx5LiBJZiBldmFsdWF0aW9uIHJldHVybmVkIGEgaGFuZGxlIGNvbnRhaW5pbmdcbiAgICAgKiBhIHByb21pc2UsIHVzZSBbW3Jlc29sdmVQcm9taXNlXV0gdG8gY29udmVydCBpdCB0byBhIG5hdGl2ZSBwcm9taXNlIGFuZFxuICAgICAqIFtbZXhlY3V0ZVBlbmRpbmdKb2JzXV0gdG8gZmluaXNoIGV2YWx1YXRpbmcgdGhlIHByb21pc2UuXG4gICAgICpcbiAgICAgKiAqTm90ZSo6IHRvIHByb3RlY3QgYWdhaW5zdCBpbmZpbml0ZSBsb29wcywgcHJvdmlkZSBhbiBpbnRlcnJ1cHQgaGFuZGxlciB0b1xuICAgICAqIFtbc2V0SW50ZXJydXB0SGFuZGxlcl1dLiBZb3UgY2FuIHVzZSBbW3Nob3VsZEludGVycnVwdEFmdGVyRGVhZGxpbmVdXSB0b1xuICAgICAqIGNyZWF0ZSBhIHRpbWUtYmFzZWQgZGVhZGxpbmUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbGFzdCBzdGF0ZW1lbnQncyB2YWx1ZS4gSWYgdGhlIGNvZGUgdGhyZXcgc3luY2hyb25vdXNseSxcbiAgICAgKiBgcmVzdWx0LmVycm9yYCB3aWxsIGJlIGEgaGFuZGxlIHRvIHRoZSBleGNlcHRpb24uIElmIGV4ZWN1dGlvbiB3YXNcbiAgICAgKiBpbnRlcnJ1cHRlZCwgdGhlIGVycm9yIHdpbGwgaGF2ZSBuYW1lIGBJbnRlcm5hbEVycm9yYCBhbmQgbWVzc2FnZVxuICAgICAqIGBpbnRlcnJ1cHRlZGAuXG4gICAgICovXG4gICAgZXZhbENvZGUoY29kZSwgZmlsZW5hbWUgPSBcImV2YWwuanNcIiwgXG4gICAgLyoqXG4gICAgICogSWYgbm8gb3B0aW9ucyBhcmUgcGFzc2VkLCBhIGhldXJpc3RpYyB3aWxsIGJlIHVzZWQgdG8gZGV0ZWN0IGlmIGBjb2RlYCBpc1xuICAgICAqIGFuIEVTIG1vZHVsZS5cbiAgICAgKlxuICAgICAqIFNlZSBbW0V2YWxGbGFnc11dIGZvciBudW1iZXIgc2VtYW50aWNzLlxuICAgICAqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZGV0ZWN0TW9kdWxlID0gKG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IDEgOiAwKTtcbiAgICAgICAgY29uc3QgZmxhZ3MgPSAoMCwgdHlwZXNfMS5ldmFsT3B0aW9uc1RvRmxhZ3MpKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZXN1bHRQdHIgPSB0aGlzLm1lbW9yeVxuICAgICAgICAgICAgLm5ld0hlYXBDaGFyUG9pbnRlcihjb2RlKVxuICAgICAgICAgICAgLmNvbnN1bWUoKGNoYXJIYW5kbGUpID0+IHRoaXMuZmZpLlFUU19FdmFsKHRoaXMuY3R4LnZhbHVlLCBjaGFySGFuZGxlLnZhbHVlLCBmaWxlbmFtZSwgZGV0ZWN0TW9kdWxlLCBmbGFncykpO1xuICAgICAgICBjb25zdCBlcnJvclB0ciA9IHRoaXMuZmZpLlFUU19SZXNvbHZlRXhjZXB0aW9uKHRoaXMuY3R4LnZhbHVlLCByZXN1bHRQdHIpO1xuICAgICAgICBpZiAoZXJyb3JQdHIpIHtcbiAgICAgICAgICAgIHRoaXMuZmZpLlFUU19GcmVlVmFsdWVQb2ludGVyKHRoaXMuY3R4LnZhbHVlLCByZXN1bHRQdHIpO1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShlcnJvclB0cikgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWx1ZTogdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHJlc3VsdFB0cikgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhyb3cgYW4gZXJyb3IgaW4gdGhlIFZNLCBpbnRlcnJ1cHRlZCB3aGF0ZXZlciBjdXJyZW50IGV4ZWN1dGlvbiBpcyBpbiBwcm9ncmVzcyB3aGVuIGV4ZWN1dGlvbiByZXN1bWVzLlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKi9cbiAgICB0aHJvdyhlcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvclRvSGFuZGxlKGVycm9yKS5jb25zdW1lKChoYW5kbGUpID0+IHRoaXMuZmZpLlFUU19UaHJvdyh0aGlzLmN0eC52YWx1ZSwgaGFuZGxlLnZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYm9ycm93UHJvcGVydHlLZXkoa2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uZXdOdW1iZXIoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV3U3RyaW5nKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8ga2V5IGlzIGFscmVhZHkgYSBKU1ZhbHVlLCBidXQgd2UncmUgYm9ycm93aW5nIGl0LiBSZXR1cm4gYSBzdGF0aWMgaGFuZGxlXG4gICAgICAgIC8vIGZvciBpbnRlcm5hbCB1c2Ugb25seS5cbiAgICAgICAgcmV0dXJuIG5ldyBsaWZldGltZV8xLlN0YXRpY0xpZmV0aW1lKGtleS52YWx1ZSwgdGhpcy5ydW50aW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRNZW1vcnkocnQpIHtcbiAgICAgICAgaWYgKHJ0ID09PSB0aGlzLnJ0LnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcml2YXRlIEFQSS4gQ2Fubm90IGdldCBtZW1vcnkgZnJvbSBhIGRpZmZlcmVudCBydW50aW1lXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogRHVtcCBhIEpTVmFsdWUgdG8gSmF2YXNjcmlwdCBpbiBhIGJlc3QtZWZmb3J0IGZhc2hpb24uXG4gICAgICogUmV0dXJucyBgaGFuZGxlLnRvU3RyaW5nKClgIGlmIGl0IGNhbm5vdCBiZSBzZXJpYWxpemVkIHRvIEpTT04uXG4gICAgICovXG4gICAgZHVtcChoYW5kbGUpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmFzc2VydE93bmVkKGhhbmRsZSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGVvZihoYW5kbGUpO1xuICAgICAgICBpZiAodHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKGhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QmlnSW50KGhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTeW1ib2woaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHIgPSB0aGlzLm1lbW9yeS5jb25zdW1lSlNDaGFyUG9pbnRlcih0aGlzLmZmaS5RVFNfRHVtcCh0aGlzLmN0eC52YWx1ZSwgaGFuZGxlLnZhbHVlKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVW53cmFwIGEgU3VjY2Vzc09yRmFpbCByZXN1bHQgc3VjaCBhcyBhIFtbVm1DYWxsUmVzdWx0XV0gb3IgYVxuICAgICAqIFtbRXhlY3V0ZVBlbmRpbmdKb2JzUmVzdWx0XV0sIHdoZXJlIHRoZSBmYWlsIGJyYW5jaCBjb250YWlucyBhIGhhbmRsZSB0byBhIFF1aWNrSlMgZXJyb3IgdmFsdWUuXG4gICAgICogSWYgdGhlIHJlc3VsdCBpcyBhIHN1Y2Nlc3MsIHJldHVybnMgdGhlIHZhbHVlLlxuICAgICAqIElmIHRoZSByZXN1bHQgaXMgYW4gZXJyb3IsIGNvbnZlcnRzIHRoZSBlcnJvciB0byBhIG5hdGl2ZSBvYmplY3QgYW5kIHRocm93cyB0aGUgZXJyb3IuXG4gICAgICovXG4gICAgdW53cmFwUmVzdWx0KHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gXCJjb250ZXh0XCIgaW4gcmVzdWx0LmVycm9yID8gcmVzdWx0LmVycm9yLmNvbnRleHQgOiB0aGlzO1xuICAgICAgICAgICAgY29uc3QgY2F1c2UgPSByZXN1bHQuZXJyb3IuY29uc3VtZSgoZXJyb3IpID0+IHRoaXMuZHVtcChlcnJvcikpO1xuICAgICAgICAgICAgaWYgKGNhdXNlICYmIHR5cGVvZiBjYXVzZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgY2F1c2UubWVzc2FnZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgbmFtZSwgc3RhY2sgfSA9IGNhdXNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IG5ldyBlcnJvcnNfMS5RdWlja0pTVW53cmFwRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFN0YWNrID0gZXhjZXB0aW9uLnN0YWNrO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24ubmFtZSA9IGNhdXNlLm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RhY2sgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLnN0YWNrID0gYCR7bmFtZX06ICR7bWVzc2FnZX1cXG4ke2NhdXNlLnN0YWNrfUhvc3Q6ICR7aG9zdFN0YWNrfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXhjZXB0aW9uLCB7IGNhdXNlLCBjb250ZXh0LCBtZXNzYWdlIH0pO1xuICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTVW53cmFwRXJyb3IoY2F1c2UsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldEZ1bmN0aW9uKGZuX2lkKSB7XG4gICAgICAgIGNvbnN0IG1hcF9pZCA9IGZuX2lkID4+IDg7XG4gICAgICAgIGNvbnN0IGZuTWFwID0gdGhpcy5mbk1hcHMuZ2V0KG1hcF9pZCk7XG4gICAgICAgIGlmICghZm5NYXApIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuTWFwLmdldChmbl9pZCk7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIHNldEZ1bmN0aW9uKGZuX2lkLCBoYW5kbGUpIHtcbiAgICAgICAgY29uc3QgbWFwX2lkID0gZm5faWQgPj4gODtcbiAgICAgICAgbGV0IGZuTWFwID0gdGhpcy5mbk1hcHMuZ2V0KG1hcF9pZCk7XG4gICAgICAgIGlmICghZm5NYXApIHtcbiAgICAgICAgICAgIGZuTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgdGhpcy5mbk1hcHMuc2V0KG1hcF9pZCwgZm5NYXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbk1hcC5zZXQoZm5faWQsIGhhbmRsZSk7XG4gICAgfVxuICAgIGVycm9yVG9IYW5kbGUoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgbGlmZXRpbWVfMS5MaWZldGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5ld0Vycm9yKGVycm9yKTtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNDb250ZXh0ID0gUXVpY2tKU0NvbnRleHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb250ZXh0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWJ1Z0xvZyA9IGV4cG9ydHMuUVRTX0RFQlVHID0gdm9pZCAwO1xuZXhwb3J0cy5RVFNfREVCVUcgPSBmYWxzZSB8fCBCb29sZWFuKHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MuZW52LlFUU19ERUJVRyk7XG5leHBvcnRzLmRlYnVnTG9nID0gZXhwb3J0cy5RVFNfREVCVUcgPyBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpIDogKCkgPT4geyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVidWcuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlF1aWNrSlNEZWZlcnJlZFByb21pc2UgPSB2b2lkIDA7XG4vKipcbiAqIFF1aWNrSlNEZWZlcnJlZFByb21pc2Ugd3JhcHMgYSBRdWlja0pTIHByb21pc2UgW1toYW5kbGVdXSBhbmQgYWxsb3dzXG4gKiBbW3Jlc29sdmVdXWluZyBvciBbW3JlamVjdF1daW5nIHRoYXQgcHJvbWlzZS4gVXNlIGl0IHRvIGJyaWRnZSBhc3luY2hyb25vdXNcbiAqIGNvZGUgb24gdGhlIGhvc3QgdG8gQVBJcyBpbnNpZGUgYSBRdWlja0pTQ29udGV4dC5cbiAqXG4gKiBNYW5hZ2luZyB0aGUgbGlmZXRpbWUgb2YgcHJvbWlzZXMgaXMgdHJpY2t5LiBUaGVyZSBhcmUgdGhyZWVcbiAqIFtbUXVpY2tKU0hhbmRsZV1dcyBpbnNpZGUgb2YgZWFjaCBkZWZlcnJlZCBwcm9taXNlIG9iamVjdDogKDEpIHRoZSBwcm9taXNlXG4gKiBpdHNlbGYsICgyKSB0aGUgYHJlc29sdmVgIGNhbGxiYWNrLCBhbmQgKDMpIHRoZSBgcmVqZWN0YCBjYWxsYmFjay5cbiAqXG4gKiAtIElmIHRoZSBwcm9taXNlIHdpbGwgYmUgZnVsZmlsbGVkIGJlZm9yZSB0aGUgZW5kIG9mIGl0J3MgW1tvd25lcl1dJ3MgbGlmZXRpbWUsXG4gKiAgIHRoZSBvbmx5IGNsZWFudXAgbmVjZXNzYXJ5IGlzIGBkZWZlcnJlZC5oYW5kbGUuZGlzcG9zZSgpYCwgYmVjYXVzZVxuICogICBjYWxsaW5nIFtbcmVzb2x2ZV1dIG9yIFtbcmVqZWN0XV0gd2lsbCBkaXNwb3NlIG9mIGJvdGggY2FsbGJhY2tzIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogLSBBcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgW1tWbUZ1bmN0aW9uSW1wbGVtZW50YXRpb25dXSwgcmV0dXJuIFtbaGFuZGxlXV0sXG4gKiAgIGFuZCBlbnN1cmUgdGhhdCBlaXRoZXIgW1tyZXNvbHZlXV0gb3IgW1tyZWplY3RdXSB3aWxsIGJlIGNhbGxlZC4gTm8gb3RoZXJcbiAqICAgY2xlYW4tdXAgaXMgbmVjZXNzYXJ5LlxuICpcbiAqIC0gSW4gb3RoZXIgY2FzZXMsIGNhbGwgW1tkaXNwb3NlXV0sIHdoaWNoIHdpbGwgZGlzcG9zZSBbW2hhbmRsZV1dIGFzIHdlbGwgYXMgdGhlXG4gKiAgIFF1aWNrSlMgaGFuZGxlcyB0aGF0IGJhY2sgW1tyZXNvbHZlXV0gYW5kIFtbcmVqZWN0XV0uIEZvciB0aGlzIG9iamVjdCxcbiAqICAgW1tkaXNwb3NlXV0gaXMgaWRlbXBvdGVudC5cbiAqL1xuY2xhc3MgUXVpY2tKU0RlZmVycmVkUHJvbWlzZSB7XG4gICAgLyoqXG4gICAgICogVXNlIFtbUXVpY2tKU0NvbnRleHQubmV3UHJvbWlzZV1dIHRvIGNyZWF0ZSBhIG5ldyBwcm9taXNlIGluc3RlYWQgb2YgY2FsbGluZ1xuICAgICAqIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAgICogQHVuc3RhYmxlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYXJncykge1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVzb2x2ZSBbW2hhbmRsZV1dIHdpdGggdGhlIGdpdmVuIHZhbHVlLCBpZiBhbnkuXG4gICAgICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgYWZ0ZXIgY2FsbGluZyBbW2Rpc3Bvc2VdXSBpcyBhIG5vLW9wLlxuICAgICAgICAgKlxuICAgICAgICAgKiBOb3RlIHRoYXQgYWZ0ZXIgcmVzb2x2aW5nIGEgcHJvbWlzZSwgeW91IG1heSBuZWVkIHRvIGNhbGxcbiAgICAgICAgICogW1tRdWlja0pTQ29udGV4dC5leGVjdXRlUGVuZGluZ0pvYnNdXSB0byBwcm9wYWdhdGUgdGhlIHJlc3VsdCB0byB0aGUgcHJvbWlzZSdzXG4gICAgICAgICAqIGNhbGxiYWNrcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVzb2x2ZSA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlc29sdmVIYW5kbGUuYWxpdmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICAgICAgICAgICAudW53cmFwUmVzdWx0KHRoaXMuY29udGV4dC5jYWxsRnVuY3Rpb24odGhpcy5yZXNvbHZlSGFuZGxlLCB0aGlzLmNvbnRleHQudW5kZWZpbmVkLCB2YWx1ZSB8fCB0aGlzLmNvbnRleHQudW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgICAuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlUmVzb2x2ZXJzKCk7XG4gICAgICAgICAgICB0aGlzLm9uU2V0dGxlZCgpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVqZWN0IFtbaGFuZGxlXV0gd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGlmIGFueS5cbiAgICAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBhZnRlciBjYWxsaW5nIFtbZGlzcG9zZV1dIGlzIGEgbm8tb3AuXG4gICAgICAgICAqXG4gICAgICAgICAqIE5vdGUgdGhhdCBhZnRlciByZWplY3RpbmcgYSBwcm9taXNlLCB5b3UgbWF5IG5lZWQgdG8gY2FsbFxuICAgICAgICAgKiBbW1F1aWNrSlNDb250ZXh0LmV4ZWN1dGVQZW5kaW5nSm9ic11dIHRvIHByb3BhZ2F0ZSB0aGUgcmVzdWx0IHRvIHRoZSBwcm9taXNlJ3NcbiAgICAgICAgICogY2FsbGJhY2tzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWplY3QgPSAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZWplY3RIYW5kbGUuYWxpdmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICAgICAgICAgICAudW53cmFwUmVzdWx0KHRoaXMuY29udGV4dC5jYWxsRnVuY3Rpb24odGhpcy5yZWplY3RIYW5kbGUsIHRoaXMuY29udGV4dC51bmRlZmluZWQsIHZhbHVlIHx8IHRoaXMuY29udGV4dC51bmRlZmluZWQpKVxuICAgICAgICAgICAgICAgIC5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VSZXNvbHZlcnMoKTtcbiAgICAgICAgICAgIHRoaXMub25TZXR0bGVkKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhbmRsZS5hbGl2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZVJlc29sdmVycygpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBhcmdzLmNvbnRleHQ7XG4gICAgICAgIHRoaXMub3duZXIgPSBhcmdzLmNvbnRleHQucnVudGltZTtcbiAgICAgICAgdGhpcy5oYW5kbGUgPSBhcmdzLnByb21pc2VIYW5kbGU7XG4gICAgICAgIHRoaXMuc2V0dGxlZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uU2V0dGxlZCA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc29sdmVIYW5kbGUgPSBhcmdzLnJlc29sdmVIYW5kbGU7XG4gICAgICAgIHRoaXMucmVqZWN0SGFuZGxlID0gYXJncy5yZWplY3RIYW5kbGU7XG4gICAgfVxuICAgIGdldCBhbGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLmFsaXZlIHx8IHRoaXMucmVzb2x2ZUhhbmRsZS5hbGl2ZSB8fCB0aGlzLnJlamVjdEhhbmRsZS5hbGl2ZTtcbiAgICB9XG4gICAgZGlzcG9zZVJlc29sdmVycygpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZUhhbmRsZS5hbGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlSGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWplY3RIYW5kbGUuYWxpdmUpIHtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0SGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU0RlZmVycmVkUHJvbWlzZSA9IFF1aWNrSlNEZWZlcnJlZFByb21pc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWZlcnJlZC1wcm9taXNlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWlja0pTTWVtb3J5TGVha0RldGVjdGVkID0gZXhwb3J0cy5RdWlja0pTQXN5bmNpZnlTdXNwZW5kZWQgPSBleHBvcnRzLlF1aWNrSlNBc3luY2lmeUVycm9yID0gZXhwb3J0cy5RdWlja0pTTm90SW1wbGVtZW50ZWQgPSBleHBvcnRzLlF1aWNrSlNVc2VBZnRlckZyZWUgPSBleHBvcnRzLlF1aWNrSlNXcm9uZ093bmVyID0gZXhwb3J0cy5RdWlja0pTVW53cmFwRXJyb3IgPSB2b2lkIDA7XG4vKipcbiAqIEVycm9yIHRocm93biBpZiBbW1F1aWNrSlNDb250ZXh0LnVud3JhcFJlc3VsdF1dIHVud3JhcHMgYW4gZXJyb3IgdmFsdWUgdGhhdCBpc24ndCBhbiBvYmplY3QuXG4gKi9cbmNsYXNzIFF1aWNrSlNVbndyYXBFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihjYXVzZSwgY29udGV4dCkge1xuICAgICAgICBzdXBlcihTdHJpbmcoY2F1c2UpKTtcbiAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlF1aWNrSlNVbndyYXBFcnJvclwiO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU1Vud3JhcEVycm9yID0gUXVpY2tKU1Vud3JhcEVycm9yO1xuY2xhc3MgUXVpY2tKU1dyb25nT3duZXIgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU1dyb25nT3duZXJcIjtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNXcm9uZ093bmVyID0gUXVpY2tKU1dyb25nT3duZXI7XG5jbGFzcyBRdWlja0pTVXNlQWZ0ZXJGcmVlIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlF1aWNrSlNVc2VBZnRlckZyZWVcIjtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNVc2VBZnRlckZyZWUgPSBRdWlja0pTVXNlQWZ0ZXJGcmVlO1xuY2xhc3MgUXVpY2tKU05vdEltcGxlbWVudGVkIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlF1aWNrSlNOb3RJbXBsZW1lbnRlZFwiO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU05vdEltcGxlbWVudGVkID0gUXVpY2tKU05vdEltcGxlbWVudGVkO1xuY2xhc3MgUXVpY2tKU0FzeW5jaWZ5RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU0FzeW5jaWZ5RXJyb3JcIjtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNBc3luY2lmeUVycm9yID0gUXVpY2tKU0FzeW5jaWZ5RXJyb3I7XG5jbGFzcyBRdWlja0pTQXN5bmNpZnlTdXNwZW5kZWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU0FzeW5jaWZ5U3VzcGVuZGVkXCI7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTQXN5bmNpZnlTdXNwZW5kZWQgPSBRdWlja0pTQXN5bmNpZnlTdXNwZW5kZWQ7XG5jbGFzcyBRdWlja0pTTWVtb3J5TGVha0RldGVjdGVkIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWRcIjtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQgPSBRdWlja0pTTWVtb3J5TGVha0RldGVjdGVkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51bndyYXBKYXZhc2NyaXB0ID0gZXhwb3J0cy51bndyYXBUeXBlc2NyaXB0ID0gdm9pZCAwO1xuLyoqIFR5cGVzY3JpcHQgdGhpbmtzIGltcG9ydCgnLi4uanMvLmQudHMnKSBuZWVkcyBtb2QuZGVmYXVsdC5kZWZhdWx0ICovXG5mdW5jdGlvbiBmYWtlVW53cmFwRGVmYXVsdChtb2QpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcImZha2VVbndyYXBEZWZhdWx0XCIsIG1vZClcbiAgICByZXR1cm4gbW9kLmRlZmF1bHQ7XG59XG4vKiogVHlwZXNjcmlwdCB0aGlua3MgaW1wb3J0KCcuLi50cycpIGRvZXNuJ3QgbmVlZCBtb2QuZGVmYXVsdC5kZWZhdWx0LCBidXQgZG9lcyAqL1xuZnVuY3Rpb24gYWN0dWFsVW53cmFwRGVmYXVsdChtb2QpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcImFjdHVhbFVud3JhcERlZmF1bHRcIiwgbW9kKVxuICAgIGNvbnN0IG1heWJlVW53cmFwID0gbW9kLmRlZmF1bHQ7XG4gICAgcmV0dXJuIG1heWJlVW53cmFwID8/IG1vZDtcbn1cbi8vIEknbSBub3Qgc3VyZSBpZiB0aGlzIGJlaGF2aW9yIGlzIG5lZWRlZCBpbiBhbGwgcnVudGltZXMsXG4vLyBvciBqdXN0IGZvciBtb2NoYSArIHRzLW5vZGUuXG5leHBvcnRzLnVud3JhcFR5cGVzY3JpcHQgPSBhY3R1YWxVbndyYXBEZWZhdWx0O1xuZXhwb3J0cy51bndyYXBKYXZhc2NyaXB0ID0gZmFrZVVud3JhcERlZmF1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lc21IZWxwZXJzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIFF1aWNrSlNSYXcgPSAoKCkgPT4ge1xuICAgIHZhciBfc2NyaXB0RGlyID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgX3NjcmlwdERpciA9IF9zY3JpcHREaXIgfHwgX19maWxlbmFtZTtcbiAgICByZXR1cm4gKGZ1bmN0aW9uIChRdWlja0pTUmF3ID0ge30pIHtcbiAgICAgICAgdmFyIGE7XG4gICAgICAgIGEgfHwgKGEgPSB0eXBlb2YgUXVpY2tKU1JhdyAhPT0gJ3VuZGVmaW5lZCcgPyBRdWlja0pTUmF3IDoge30pO1xuICAgICAgICB2YXIgbSwgbjtcbiAgICAgICAgYS5yZWFkeSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChiLCBjKSB7IG0gPSBiOyBuID0gYzsgfSk7XG4gICAgICAgIHZhciBwID0gT2JqZWN0LmFzc2lnbih7fSwgYSksIHQgPSBcIi4vdGhpcy5wcm9ncmFtXCIsIHUgPSBcIm9iamVjdFwiID09IHR5cGVvZiB3aW5kb3csIHYgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGltcG9ydFNjcmlwdHMsIHcgPSBcIm9iamVjdFwiID09IHR5cGVvZiBwcm9jZXNzICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMgJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLCB4ID0gXCJcIiwgeSwgeiwgQTtcbiAgICAgICAgaWYgKHcpIHtcbiAgICAgICAgICAgIHZhciBmcyA9IHJlcXVpcmUoXCJmc1wiKSwgQiA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICAgICAgICAgICAgeCA9IHYgPyBCLmRpcm5hbWUoeCkgKyBcIi9cIiA6IF9fZGlybmFtZSArIFwiL1wiO1xuICAgICAgICAgICAgeSA9IChiLCBjKSA9PiB7IHZhciBkID0gQyhiKTsgaWYgKGQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGMgPyBkIDogZC50b1N0cmluZygpOyBiID0gYi5zdGFydHNXaXRoKFwiZmlsZTovL1wiKSA/IG5ldyBVUkwoYikgOiBCLm5vcm1hbGl6ZShiKTsgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhiLCBjID8gdm9pZCAwIDogXCJ1dGY4XCIpOyB9O1xuICAgICAgICAgICAgQSA9IGIgPT4geyBiID0geShiLCAhMCk7IGIuYnVmZmVyIHx8IChiID0gbmV3IFVpbnQ4QXJyYXkoYikpOyByZXR1cm4gYjsgfTtcbiAgICAgICAgICAgIHogPSAoYiwgYywgZCkgPT4geyB2YXIgZSA9IEMoYik7IGUgJiYgYyhlKTsgYiA9IGIuc3RhcnRzV2l0aChcImZpbGU6Ly9cIikgPyBuZXcgVVJMKGIpIDogQi5ub3JtYWxpemUoYik7IGZzLnJlYWRGaWxlKGIsIGZ1bmN0aW9uIChmLCBnKSB7IGYgPyBkKGYpIDogYyhnLmJ1ZmZlcik7IH0pOyB9O1xuICAgICAgICAgICAgIWEudGhpc1Byb2dyYW0gJiYgMSA8IHByb2Nlc3MuYXJndi5sZW5ndGggJiYgKHQgPSBwcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikpO1xuICAgICAgICAgICAgcHJvY2Vzcy5hcmd2LnNsaWNlKDIpO1xuICAgICAgICAgICAgYS5pbnNwZWN0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJbRW1zY3JpcHRlbiBNb2R1bGUgb2JqZWN0XVwiOyB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHUgfHwgdilcbiAgICAgICAgICAgIHYgPyB4ID0gc2VsZi5sb2NhdGlvbi5ocmVmIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCAmJiAoeCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjKSwgX3NjcmlwdERpciAmJiAoeCA9IF9zY3JpcHREaXIpLCAwICE9PSB4LmluZGV4T2YoXCJibG9iOlwiKSA/IHggPSB4LnN1YnN0cigwLCB4LnJlcGxhY2UoL1s/I10uKi8sIFwiXCIpLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpIDogeCA9IFwiXCIsIHkgPSBiID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IG5ldyBYTUxIdHRwUmVxdWVzdDtcbiAgICAgICAgICAgICAgICAgICAgYy5vcGVuKFwiR0VUXCIsIGIsICExKTtcbiAgICAgICAgICAgICAgICAgICAgYy5zZW5kKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5yZXNwb25zZVRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChmKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiID0gQyhiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBiLmxlbmd0aDsgZCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBiW2RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSA8IGUgJiYgKGUgJj0gMjU1KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdiAmJiAoQSA9IGIgPT4geyB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBjID0gbmV3IFhNTEh0dHBSZXF1ZXN0O1xuICAgICAgICAgICAgICAgIGMub3BlbihcIkdFVFwiLCBiLCAhMSk7XG4gICAgICAgICAgICAgICAgYy5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XG4gICAgICAgICAgICAgICAgYy5zZW5kKG51bGwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShjLnJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGIgPSBDKGIpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjtcbiAgICAgICAgICAgICAgICB0aHJvdyBkO1xuICAgICAgICAgICAgfSB9KSwgeiA9IChiLCBjLCBkKSA9PiB7IHZhciBlID0gbmV3IFhNTEh0dHBSZXF1ZXN0OyBlLm9wZW4oXCJHRVRcIiwgYiwgITApOyBlLnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjsgZS5vbmxvYWQgPSAoKSA9PiB7IGlmICgyMDAgPT0gZS5zdGF0dXMgfHwgMCA9PSBlLnN0YXR1cyAmJiBlLnJlc3BvbnNlKVxuICAgICAgICAgICAgICAgIGMoZS5yZXNwb25zZSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IEMoYik7XG4gICAgICAgICAgICAgICAgZiA/IGMoZi5idWZmZXIpIDogZCgpO1xuICAgICAgICAgICAgfSB9OyBlLm9uZXJyb3IgPSBkOyBlLnNlbmQobnVsbCk7IH07XG4gICAgICAgIHZhciBhYSA9IGEucHJpbnQgfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwgRCA9IGEucHJpbnRFcnIgfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oYSwgcCk7XG4gICAgICAgIHAgPSBudWxsO1xuICAgICAgICBhLnRoaXNQcm9ncmFtICYmICh0ID0gYS50aGlzUHJvZ3JhbSk7XG4gICAgICAgIHZhciBFO1xuICAgICAgICBhLndhc21CaW5hcnkgJiYgKEUgPSBhLndhc21CaW5hcnkpO1xuICAgICAgICB2YXIgbm9FeGl0UnVudGltZSA9IGEubm9FeGl0UnVudGltZSB8fCAhMDtcbiAgICAgICAgXCJvYmplY3RcIiAhPSB0eXBlb2YgV2ViQXNzZW1ibHkgJiYgRihcIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWRcIik7XG4gICAgICAgIHZhciBHLCBIID0gITEsIEksIEosIEssIEw7XG4gICAgICAgIGZ1bmN0aW9uIE0oKSB7IHZhciBiID0gRy5idWZmZXI7IGEuSEVBUDggPSBJID0gbmV3IEludDhBcnJheShiKTsgYS5IRUFQMTYgPSBuZXcgSW50MTZBcnJheShiKTsgYS5IRUFQMzIgPSBLID0gbmV3IEludDMyQXJyYXkoYik7IGEuSEVBUFU4ID0gSiA9IG5ldyBVaW50OEFycmF5KGIpOyBhLkhFQVBVMTYgPSBuZXcgVWludDE2QXJyYXkoYik7IGEuSEVBUFUzMiA9IEwgPSBuZXcgVWludDMyQXJyYXkoYik7IGEuSEVBUEYzMiA9IG5ldyBGbG9hdDMyQXJyYXkoYik7IGEuSEVBUEY2NCA9IG5ldyBGbG9hdDY0QXJyYXkoYik7IH1cbiAgICAgICAgdmFyIGJhID0gW10sIGNhID0gW10sIGRhID0gW107XG4gICAgICAgIGZ1bmN0aW9uIGVhKCkgeyB2YXIgYiA9IGEucHJlUnVuLnNoaWZ0KCk7IGJhLnVuc2hpZnQoYik7IH1cbiAgICAgICAgdmFyIE4gPSAwLCBPID0gbnVsbCwgUCA9IG51bGw7XG4gICAgICAgIGZ1bmN0aW9uIEYoYikgeyBpZiAoYS5vbkFib3J0KVxuICAgICAgICAgICAgYS5vbkFib3J0KGIpOyBiID0gXCJBYm9ydGVkKFwiICsgYiArIFwiKVwiOyBEKGIpOyBIID0gITA7IGIgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGIgKyBcIi4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby5cIik7IG4oYik7IHRocm93IGI7IH1cbiAgICAgICAgdmFyIFEgPSBcImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCxcIiwgUjtcbiAgICAgICAgUiA9IFwiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LEFHRnpiUUVBQUFBQjlRWnhZQUovZndCZ0EzOS9md0YvWUFSL2ZuOS9BWDVnQW45L0FYOWdBWDhCZjJBRmYzNS9mMzhCZm1BRGYzOS9BR0FFZjM5L2Z3Ri9ZQUovZmdGK1lBRi9BR0FGZjM5L2YzOEJmMkFCZkFGOFlBSi9mZ0JnQW45L0FYNWdBbjkrQVg5Z0EzOS9mZ0YvWUFOL2ZuOEJmbUFEZjM1L0FHQUdmMzUvZjM5L0FYNWdCbjkvZjM5L2Z3Ri9ZQVIvZjM5L0FHQURmMzUvQVg5Z0JuOStmbjkvZndGK1lBUi9mMzUvQVg5Z0EzOStmZ0YrWUFOL2YzOEJmbUFGZjM5L2ZuNEJmMkFFZjM5L2ZnRi9ZQVIvZjM1K0FYOWdCWDkrZm41K0FHQUJmd0YrWUFOL2ZuNEJmMkFFZjM5L2Z3RitZQWQvZjM5L2YzOS9BWDlnQlg5L2YzOS9BWDVnQW54OEFYeGdBQUYvWUFWL2YzOS9md0JnQlg5K2YzNS9BWDlnQlg5K2ZuOS9BWDVnQVg0QmYyQUVmMzUrZndCZ0IzOStmMzUrZm44QmYyQUlmMzkvZjM5L2YzOEJmMkFGZjM1K2ZuOEJmMkFHZjM1L2ZuNS9BWDlnQkg5K2YzNEJmbUFFZjM1L2Z3QmdCSDkrZjM0QVlBWi9mMzkvZjM4QmZtQUVmMzUrZndGL1lBbC9mMzkvZjM5L2YzOEJmMkFFZjM1K2Z3RitZQVIvZm45L0FYOWdBMzkrZmdCZ0EzNS9md0YvWUFWL2ZuNS9md0JnQTM5L2ZnRitZQWQvZm45L2YzOS9BWDVnQUFCZ0EzOS9mZ0JnQkg5K2YzNEJmMkFGZjM5K2YzOEJmMkFFZjM1K2ZnRi9ZQWQvZjM5L2YzOS9BR0FDZkg4QmZHQUJmQUYvWUFOOGZIOEJmR0FDZjM4QmZHQUVmMzkrZndCZ0JIOStmbjRCZm1BQmZnRitZQUovZkFGL1lBWi9mSDkvZjM4QmYyQUFBWHhnQlg5K2YzNS9BWDVnQm45L2ZuNStmZ0YvWUFKK2Z3QmdBbjk4QUdBRWYzOStmd0YrWUFWL2YzOS9mZ0YrWUFkL2ZuNStmMzkvQVg1Z0JINStmbjRCZjJBSGYzOS9mMzkvZmdGK1lBcC9mMzkvZjM5L2YzOS9BWDlnQjM5L2ZuNS9mMzhCZjJBRmYzeC9mMzhCZm1BQ2ZuOEJmMkFHZkg5L2YzOS9BR0FGZjM1L2YzOEFZQVYvZjM1L2Z3QmdCbjkrZm41K2Z3Ri9ZQVYvZjM1K2Z3Ri9ZQVovZm45L2YzOEJmMkFEZjN4L0FYOWdCWDkrZjM5L0FYOWdCWDkvZm41K0FYNWdCWDkrZm41K0FYOWdCbjkvZm41L2Z3Ri9ZQWQvZjM5K2ZuNS9BWDlnQkg5L2YzNEJmbUFDZkg4QmYyQUdmMzkvZjM5L0FHQUlmMzkvZjM5L2YzOEFZQU4vZm53QmZtQUFBWDVnQW54OEFYOWdBbjUrQVh4Z0FYOEJmR0FEZm41K0FYOWdBMzkvZkFCZ0NIOStmbjUrZjM1K0FYNWdDWDkvZjM5L2YzOS9md0FDV3c4QllRRmhBQlFCWVFGaUFEc0JZUUZqQUFjQllRRmtBQVFCWVFGbEFBTUJZUUZtQUFNQllRRm5BQWNCWVFGb0FBRUJZUUZwQUFvQllRRnFBQVFCWVFGckFBWUJZUUZzQUFBQllRRnRBRW9CWVFGdUFBUUJZUUZ2QUFvRHlnbklDUXdBQUFRQVN3WUdBQU1tQUFrQkFBQUJQQ2N2REFrSURnRUlBd0FCQXcwZEp3NE9CQVllQ1I0SURnQUdBdzhCSGdRd0F3OEtBejBHQ0FBUUF4VUhHQWNCQmdjZktBQUVCRDRCQ0FZR0RRWUdBdzRCRFNVQUVCMHBBUUUvQ1FncUR3RWRGUVlZVEQ0TkR3b0FCd1FKQXdFT0JCY3hBeUF5UHc0REFBd0RBQWdLQmdFRURoVUdDZ1FlRHc0UUNRWk5BVE1IQUFRUEJqMFBBZ2NHQTA0QkZUUW1FQVFRRGhVckF3UUJBdzhQTWl4UFVBbEFFd29LQkFNQkdBTU9DZ2NJQVRFbUF5d0RBVFVQTEZFQVFUWUdBekFEUUFNSkdBb1BBUkFJQ1FFQUFGSUVKZ0ZUQkFrRFZBa0tJUU1mQVE0T0JRQUdCQU1EQUZVQUNBRUJOeklJRGlsV0VBQUdHUVJYT0FzSEFRQVBBQUVCQmdRQkF3UUtCZ1FCQ1FZQ0dBVUZBRFZDQkFNQkRRa0pBU0lJRGc4SVFpVTVBUU1YQVJnVUJnQUtXRmtIQ3cwVVF5TUVDd1phQUFjVEFRTUVFd01JSUFGRUJnUUhBUUFFQndjQkF3RUVBUU1FRGhBREUxc1BHUTRPR0VVQUNnQUFFQTRCQVFrWkFRQUVBeGtIWEFNTkl5TW5Cd01EQUYwdkFTUUJGQVluQlFNTlhnTUFLQWtFQXdzREFRb0VCd01DQkFFTEFRb0lBQTVmS0FRQkF3TUREd0VKQndrQkNnQUhCd016QXdjSEJ3UUREZ01lQ0J4Z0FpZ0VBd0poTkFBVlBBQUhEd2NLSVFFVUV4RUFDd0JpR1FZR0F3TVVDZ01BQkNrQkdBZ0RGd01HR1dNZENBNDNMVFlKRHhZSEFnZ1FBQUFERkFOR0Z3eGtHQW9KQm1VTEV4Um1Ld29KRXhNaEt6ZG5Cd2NEQkNzREJnRUdCd1FCQkFBQkFBRTdBZ0lJQkFRQkFRb09BUVVtQldnTlIwY0JBUVZwQWdRSkRBRUFBd1FEQVFFQUF3TUpBd0VUQXdFQUFBTVRNd29URkEwSkFTRUNBd0VCQndnRkJTNEJEd1pxQ0E4UUVBaEZOUUFCQUFBQUtROGxBUTRJRHdFREFRb0hFQVFBQVJBTkJBUUVDUkVKQ1FBUERRTURCQU1JRHdFREV3Y0RNQUVCQXdBZU1RRUJTQUVIQXg5ckh4QVhCZzhQS0JZbkFUb1hEZzBEQUI4R0FRTXNCUVVOSHhVQUVBZ1hSZ0FOQXdRZGJBQVpBQUJ0Q1JRR0FBRVpKUU1BQXlJZ0RRTWRBZ1UyQWk4UkJ3Z0RGQVFoUVVNZUtSMXVBUXNqQkFRQkZBY1RBd1FUQWdvSEpSUUhFeVVoQUFNSkJnY2hBd01CQXdRQkFRTWZid0lGQkFFQ0FnSUNBZ0lDQWdJQ0JRVUNBZ0lDQlFVRkFnSUNBZ0lGQlFVQ0FnSUNFZ0lDQ3dJQ0N5TUxCUUlDQlFJRkFnVUNBZ1VDQWdnQ0FnSUNFZ0lDQWdVQ0FnSUNBZ0lFQ1JZV0ZoWUNBZ0lDQWdJQ0FnSVFDQWdTQ0NJQ0FoRU1MUzRWS2hVYkd4Y1NBZ1VGRUFVYUJRVUZCUklDQlRrUURRME5EUTBORFEwRERRMEJBUUVCQVFFQkFRRUJCUVVCQWdJQ0FnVUNCUVVrQWdnRkFnZ0NKQUlHQlNRRkVCRWtEQkVNREF3UkRCSVNKQklDQWdJSUFnQVNCUUlTQlJrU0JSa0JBZ0lFQlFVRkJRTUNBUUFBRVF3UkRBd01FUXdSREF3UkRBd01FUXdFRVF3UkRCRU1EQkVNRVF3cUtoVVhGUU1BQUFBU0FTQWdJQWtCRWdRSkpCa0pBQWNCQ1FrREF3RUZBd1FEQ2dNRENuQVVBUUVFQXdNQkEwUklCQU1FQXdBQUFBQUpBaUliR2h3SUZoWVdGZ0lDQWdJRkZnSTZBZ0VBU1FJTEN3c0xFQXNMQVJBTEN3c0xDd3NqQ3dzTEN3c0xBUkFFQndJSEJ3b0tDZ0lDQmdZR0JnWUdCZ1lHQmdFRkFnSUZBZ0lDQlFJQ0FnSUNCUVVGR0FnQ0FnSUNBZ2dJQWdJQ0FnVUNCUUVDQWdJQ0JRSUNCUUlDQWdJQ0FnSUNCUVVDQWdJRkFnSUNDd1FGQVhBQW13TUZCd0VCZ0FLQWdBSUdDUUYvQVVHUTNzUUNDd2ZBQWp3QmNBSUFBWEVBdXdRQmNnQ3hBUUZ6QUtNSUFYUUFrZ2dCZFFDQUNBRjJBUHdIQVhjQTl3Y0JlQUNZQXdGNUFKZ0RBWG9BNmdjQlFRRGpCd0ZDQU5rSEFVTUExUWNCUkFEUkJ3RkZBTW9IQVVZQStnWUJSd0Q1QmdGSUFOY0lBVWtBMWdnQlNnQ2JBUUZMQU5VSUFVd0ExQWdCVFFEVENBRk9BTklJQVU4QTBRZ0JVQURRQ0FGUkFNOElBVklBemdnQlV3RE5DQUZVQU13SUFWVUE5d1VCVmdETENBRlhBTW9JQVZnQXlRZ0JXUURJQ0FGYUFNY0lBVjhBeGdnQkpBREZDQUpoWVFERUNBSmlZUUREQ0FKallRRENDQUprWVFEQkNBSmxZUURBQ0FKbVlRQy9DQUpuWVFDK0NBSm9ZUUM5Q0FKcFlRQ3NDQUpxWVFDWUF3SnJZUUNZQXdKc1lRQzdDQUp0WVFDNkNBSnVZUUM0Q0FKdllRQzNDQUp3WVFDMENBSnhZUUN6Q0FKeVlRRUFBbk5oQUxFSUFuUmhBTEFJQW5WaEFLOElDYnNHQVFCQkFRdWFBL2NJaXdiMkNOZ0QyQU95QjZnSG9BZVhCNDBIakFmMEJQNEcvUWI4QnZzRytBYkNCdFVKdlFtcENad0pyZ09RQ1k4Smx3YUpDZTRJNmdqcENKZ0U2QWpuQ1B3RjVnamxDT1FJNHdqNkJlSUk0UWpnQ044STNnajVCZDBJM0FqYkNOb0kyUWpZQ1BNRTh3ZThDTGtJdGdpMUNPc0k5QVN5Q05VRnJnaXRDS2NJcUFpbUNLVUlwQWowQjQ0SmpRbUtDWWdKakFud0IvRUg3Z2ZyQitRSDRnZmhCOU1Id1FlYUIvRUV2QW1iQ1pvSm1RbVlDWmNKbGdtVkNaUUprd21TQ1pFSml3bnRDT3dJblFpY0NKc0ltZ2laQ0tBRm1BaVhDSllJbFFpVUNKTUlrUWlRQ0k4SWpnaU5DSXdJaXdpS0NJa0lpQWlIQ0lZSTZRT0ZDT2tEaEFpRENJSUlnUWllQ0tFSW9BaWZDS0lJMlFQL0IvNEhrUWVRQjVrSG1BZVdCNVVIbEFlVEI1SUg0QWZmQjk0SDZRUGRCNkFGM0FmYkI5b0gyQWVyQ0tvSXFRai9Cb29IaVFlSUI0Y0hoZ2VGQjRRSGd3ZUNCNEVIZ0Fmb0I0c0hqd2VPQjVzSHBBZWhCNk1Ib2dlZkI1NEhuUWVjQjZVSDV3Zm1CK1VIL2dIc0Ira0g3UWZ2Qi9JSDlRYlBCUFFHOHdieUJ2RUd5QVR3QnU4Rzl3YlJCUFlHOWdmMUIvc0grZ2Y1Qi9nSC9RZW9DZU1HcHdubUJxWUpwUW1rQ2FNSjRRYmZCc1lFb2dtaENhQUpzUWFmQ1o0Sm5RbXdCcklKc1Ftd0NhOEpyZ210Q2F3SnF3bXFDYmdKblFPM0NiWUp0UW0wQ2JNSnhnbkpCOGdIeFFuRUNjTUp3Z25XQThFSndBbjNCUGdFdndtK0Nic0p1Z201Q2NrSnlBbkhDZEFKendtOUJMd0V6Z25OQ2N3Snl3bktDYlFHMUFuVENkSUowUW00QnJjR3RnYTFCcm9HdVFhOUJyd0d1d2JTQnRFRzBBYlBCczRHelFiTUJzc0d5Z2JKQnNnR3h3YkdCc1VHeEFiREJzRUd3QWEvQnI0RzB3YmNCb0FKK2dqN0NOc0dnd21FQ1lFSm5RVCtDUGtJNndQTUF0b0c5UWp4Q084STJRYjRDUFFJOEFpQ0NmOEkvUWlYQXFjRDFnbnlDUHdJMkFiWEJ0WUcxUWJVQnVnRzV3YmxCdVFHNGdiZ0J0NEczUWJyQnVvRzZRYnRCdXdHN2dhcEI2Y0hwZ2ZQQjRFRjF3ZUFCYzRIelFmTUI4c0h4d2ZHQjhVSHhBZkRCOElId0FlL0I5SUgwQWZXQjlRSHRBZXpCN0VIc0FldkI2NEhyUWVzQjZzSHFnZStCNzBIdkFlN0I3b0h1UWU0QjdjSHRnZTFCNGNKaFFtR0NkZ0Q4d2dLMTVZWHlBazFBUUYvQWtBZ0FVSWdpS2RCZFVrTkFDQUJweUlDSUFJb0FnQWlBa0VCYXpZQ0FDQUNRUUZLRFFBZ0FDZ0NFQ0FCRUpZRUN3dE5BUUovSUFBb0FrQWlBa0dBQW1vaEF5QUNLQUtjQWlBQUtBSUVSd1JBSUFOQndnRVFFU0FESUFBb0FnUVFIU0FDSUFBb0FnUTJBcHdDQ3lBQ0lBSW9Bb1FDTmdLWUFpQURJQUVRRVFzbUFRRi9Jd0JCRUdzaUFpUUFJQUlnQVRvQUR5QUFJQUpCRDJwQkFSQnlJQUpCRUdva0FBdi9Gd0lHZndKK0l3QkJFR3NpQWlRQUFuOENRQ0FBS0FJQUtBSVFLQUo0SUFKTEJFQWdBRUdOSWtFQUVCWU1BUXNnQUNBQVFSQnFJZ1FRL3dFZ0FDQUFLQUk0SWdFMkFqUWdBaUFCTmdJTUlBQkJBRFlDTUNBQUlBQW9BaFEyQWdRRFFDQUFJQUUyQWhnZ0FDQUFLQUlJSWdNMkFoUUNRQUpBQWtBQ1FBSkFBa0FDUUFKL0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBU3dBQUNJRlFmOEJjU0lHRG4wQUZ4Y1hGeGNYRnhjRUF3UUVBaGNYRnhjWEZ4Y1hGeGNYRnhjWEZ4Y1hGd1FTR2dnSERCTWFGeGNMRFJjT0NRVUtIUjBkSFIwZEhSMGRGeGNQRVJBV0Z3Y0hCd2NIQndjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NIQndjSEZ3WVhGQWNCQndjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NYRlJjTFFRQWhCU0FCSUFBb0FqeEpEUmdnQkVHc2Z6WUNBQXdnQ3lBQUlBRkJBV29RendNTkhTQUNJQUFvQWpnMkFnd01Id3NnQVVFQmFpQUJJQUV0QUFGQkNrWWJJUUVMSUFJZ0FVRUJhallDREF3ZUN5QUNJQUZCQVdvMkFnd01IZ3NDUUFKQUlBRXRBQUVpQTBFcVJ3UkFJQU5CTDBZTkFTQURRVDFIRFFJZ0FpQUJRUUpxTmdJTUlBUkJobjgyQWdBTUhnc2dBaUFCUVFKcUlnRTJBZ3dEUUFKQUFrQUNRQUpBQWtBQ1FDQUJMUUFBSWdOQkNtc09CQUVEQXdJQUN5QURRU3BIQkVBZ0F3MERJQUVnQUNnQ1BFa05CQ0FBUWRVc1FRQVFGZ3dpQ3lBQkxRQUJRUzlIRFFNZ0FpQUJRUUpxTmdJTURDVUxJQUJCQVRZQ01DQUFJQUFvQWdoQkFXbzJBZ2dnQWlBQlFRRnFOZ0lNREFNTElBQkJBVFlDTUNBQ0lBRkJBV28yQWd3TUFnc2dBOEJCQUU0TkFDQUJRUVlnQWtFTWFoQllJZ0ZCZm5GQnFNQUFSZ1JBSUFCQkFUWUNNQXdDQ3lBQlFYOUhEUUVnQWlBQ0tBSU1RUUZxTmdJTURBRUxJQUlnQVVFQmFqWUNEQXNnQWlnQ0RDRUJEQUFMQUFzZ0FVRUNhaUVCUVFBTUZ3c2dBaUFCUVFGcU5nSU1JQVJCTHpZQ0FBd2JDMEhjQUNFRklBRXRBQUZCOVFCSERSSWdBaUFCUVFGcU5nSUVJQUpCQkdwQkFSRDVBU0lHUVFCSURSSWdCaER2QWtVTkVpQUNJQUlvQWdRMkFnd2dBa0VCTmdJSURCY0xJQUpCQURZQ0NDQUNJQUZCQVdvMkFnd01GZ3NnQWlBQlFRSnFOZ0lFUWR3QUlRTUNRQ0FCTFFBQklnVkIzQUJHQkVBZ0FTMEFBa0gxQUVjTkFTQUNRUVJxUVFFUStRRWhBd3dCQ3lBRklnUEFRUUJPRFFBZ0FVRUJha0VHSUFKQkJHb1FXQ0VEQ3lBREVPOENSUVJBSUFCQnhPY0FRUUFRRmd3WEN5QUNJQUlvQWdRMkFnd2dBQ0FDUVF4cUlBSkJDR29nQTBFQkVPb0VJZ0ZGRFJZZ0FFR3JmellDRUNBQUlBRTJBaUFNR0F0QkxpRUZJQUV0QUFFaUEwRXVSdzBPSUFFdEFBSkJMa2NORHlBQ0lBRkJBMm8yQWd3Z0JFR25mellDQUF3WEN5QUJMUUFCUVRwclFYWkpEUklnQUNnQ1FDMEFia0VCY1VVTkVpQUFRZnZzQUVFQUVCWU1GQXRCS2lFRklBRXRBQUVpQTBFcVJ3UkFJQU5CUFVjTkRpQUNJQUZCQW1vMkFnd2dCRUdGZnpZQ0FBd1dDeUFCTFFBQ1FUMUdCRUFnQWlBQlFRTnFOZ0lNSUFSQmtYODJBZ0FNRmdzZ0FpQUJRUUpxTmdJTUlBUkJwWDgyQWdBTUZRdEJKU0VGSUFFdEFBRkJQVWNORENBQ0lBRkJBbW8yQWd3Z0JFR0hmellDQUF3VUMwRXJJUVVnQVMwQUFTSURRU3RIQkVBZ0EwRTlSdzBNSUFJZ0FVRUNhallDRENBRVFZaC9OZ0lBREJRTElBSWdBVUVDYWpZQ0RDQUVRWlovTmdJQURCTUxRUzBoQlNBQkxRQUJJZ1pCTFVjRVFDQUdRVDFIRFFzZ0FpQUJRUUpxTmdJTUlBUkJpWDgyQWdBTUV3c0NRQ0FBS0FKSVJRMEFJQUV0QUFKQlBrY05BQ0FBS0FJRUlBTkhEUTBMSUFJZ0FVRUNhallDRENBRVFaVi9OZ0lBREJJTEFrQUNRQUpBSUFFdEFBRWlBMEU4YXc0Q0FRQUNDeUFDSUFGQkFtbzJBZ3dnQkVHYmZ6WUNBQXdUQ3lBQkxRQUNRVDFHQkVBZ0FpQUJRUU5xTmdJTUlBUkJpbjgyQWdBTUV3c2dBaUFCUVFKcU5nSU1JQVJCbDM4MkFnQU1FZ3RCUENFRklBTkJJVWNOQ1NBQUtBSklSUTBKSUFFdEFBSkJMVWNOQ1NBQkxRQURRUzFHRFFzTUNRdEJQaUVGQWtBQ1FDQUJMUUFCUVQxckRnSUFBUW9MSUFJZ0FVRUNhallDRENBRVFaMS9OZ0lBREJFTEFrQUNRQUpBSUFFdEFBSkJQV3NPQWdFQUFnc2dBUzBBQTBFOVJnUkFJQUlnQVVFRWFqWUNEQ0FFUVl4L05nSUFEQk1MSUFJZ0FVRURhallDRENBRVFabC9OZ0lBREJJTElBSWdBVUVEYWpZQ0RDQUVRWXQvTmdJQURCRUxJQUlnQVVFQ2FqWUNEQ0FFUVpoL05nSUFEQkFMUVQwaEJRSkFBa0FnQVMwQUFVRTlhdzRDQUFFSkN5QUJMUUFDUVQxR0JFQWdBaUFCUVFOcU5nSU1JQVJCbjM4MkFnQU1FUXNnQWlBQlFRSnFOZ0lNSUFSQm5uODJBZ0FNRUFzZ0FpQUJRUUpxTmdJTUlBUkJwbjgyQWdBTUR3dEJJU0VGSUFFdEFBRkJQVWNOQmlBQkxRQUNRVDFHQkVBZ0FpQUJRUU5xTmdJTUlBUkJvWDgyQWdBTUR3c2dBaUFCUVFKcU5nSU1JQVJCb0g4MkFnQU1EZ3RCSmlFRklBRXRBQUVpQTBFbVJ3UkFJQU5CUFVjTkJpQUNJQUZCQW1vMkFnd2dCRUdOZnpZQ0FBd09DeUFCTFFBQ1FUMUdCRUFnQWlBQlFRTnFOZ0lNSUFSQmtuODJBZ0FNRGdzZ0FpQUJRUUpxTmdJTUlBUkJvbjgyQWdBTURRc0NRQ0FCTFFBQklnTkIzZ0JIQkVBZ0EwRTlSdzBCSUFJZ0FVRUNhallDRENBQUtBSkFMUUJ1UVFSeEJFQWdCRUdRZnpZQ0FBd1BDeUFFUVk1L05nSUFEQTRMSUFFdEFBSkJQVVlFUUNBQ0lBRkJBMm8yQWd3Z0JFR09mellDQUF3T0N5QUNJQUZCQW1vMkFnd2dCRUhlQURZQ0FBd05DeUFDSUFGQkFXbzJBZ3dnQUNnQ1FDMEFia0VFY1FSQUlBUkJwSDgyQWdBTURRc2dCRUhlQURZQ0FBd01DMEg4QUNFRklBRXRBQUVpQTBIOEFFY0VRQ0FEUVQxSERRUWdBaUFCUVFKcU5nSU1JQVJCajM4MkFnQU1EQXNnQVMwQUFrRTlSZ1JBSUFJZ0FVRURhallDRENBRVFaTi9OZ0lBREF3TElBSWdBVUVDYWpZQ0RDQUVRYU4vTmdJQURBc0xRVDhoQlNBQkxRQUJJZ05CTGtjRVFDQURRVDlIRFFNZ0FTMEFBa0U5UmdSQUlBSWdBVUVEYWpZQ0RDQUVRWlIvTmdJQURBd0xJQUlnQVVFQ2FqWUNEQ0FFUWFoL05nSUFEQXNMSUFFdEFBSkJNR3RCL3dGeFFRcEpEUUlnQWlBQlFRSnFOZ0lNSUFSQnFYODJBZ0FNQ2dzZ0JVRUFUZzBCSUFGQkJpQUNRUXhxRUZnaUJrRitjVUdvd0FCR0JFQWdBQ2dDQ0NFRERBc0xJQVlRaHdNTkN5QUdFTzhDQkVBZ0FrRUFOZ0lJREFjTElBQkIwY01BUVFBUUZnd0hDeUFEUVRCclFmOEJjVUVLU1EwRUN5QUVJQVZCL3dGeE5nSUFJQUlnQVVFQmFqWUNEQXdIQ3lBQUlBWkJBU0FCUVFGcUlBUWdBa0VNYWhEekFrVU5CZ3dFQzBFQkN5RURBMEFDZndKQUFrQUNRQUpBSUFORkJFQWdBaUFCTmdJTURBRUxJQUV0QUFBaUEwVU5BZ0pBSUFOQkNtc09CQTBBQUEwQUN5QUR3RUVBVGcwRElBRkJCaUFDUVF4cUVGZ2lBMEYrY1VHb3dBQkdEUXdnQWlnQ0RDRUJJQU5CZjBZTkFRdEJBU0VEREFRTElBRkJBV29NQWdzZ0FTQUFLQUk4VHcwSkN5QUJRUUZxQ3lFQlFRQWhBd3dBQ3dBTElBQW9Ba0F0QUc0aEF5QUFRU2hxSWdWQkFEWUNBQUpBSUFBb0FnQWdBU0FDUVF4cVFRQkI5QVpCOUFBZ0EwRUVjUnNnQlJDM0JTSUhRb0NBZ0lCd2d5SUlRb0NBZ0lEQWZsSUVRQ0FJUW9DQWdJRGdBRkVOQXlBQ0tBSU1RUVlnQWtFSWFoQllFTVVCUlEwQkN5QUFLQUlBSUFjUUR5QUFRZFhWQUVFQUVCWU1BZ3NnQUNBSE53TWdJQUJCZ0g4MkFoQU1Bd3NnQUNBQ1FReHFJQUpCQ0dvZ0JrRUFFT29FSWdGRkRRQWdBQ0FCTmdJZ0lBSW9BZ2doQlNBQVFRQTJBaWdnQUNBRk5nSWtBa0FnQVVFbFNRMEFJQUZCTFUwRVFDQUFLQUpBSWdNdEFHNUJBWEVOQVNBQlFTMUhEUU1nQXk4QmJDSUdRUUZ4RFFFZ0JrR0EvZ054UVlBR1J3MERJQU1vQW1RTkF5QURLQUlFSWdORkRRTWdBeTBBYkVFQmNRMEJEQU1MSUFGQkxrY05BaUFBS0FKRURRQWdBQ2dDUUNJREx3RnNJZ1pCQW5FTkFDQUdRWUQrQTNGQmdBWkhEUUlnQXlnQ1pBMENJQU1vQWdRaUEwVU5BaUFETFFCc1FRSnhSUTBDQ3lBRkJFQWdBRUdEZnpZQ0VDQUFRUUUyQWlnTUF3c2dCQ0FCUWRRQWF6WUNBQXdDQ3lBRVFhcC9OZ0lBREFVTElBUkJnMzgyQWdBTElBQWdBaWdDRERZQ09FRUFEQVFMSUFCQkFUWUNNQ0FBSUFOQkFXbzJBZ2dMSUFJb0Fnd2hBUXdBQ3dBTFFYOExJUUVnQWtFUWFpUUFJQUVMRlFBZ0FVSGVBVTRFUUNBQUtBSVFJQUVRNkFVTEM3b0hBZ1ovQVg0akFFRWdheUlISkFCQ2dJQ0FnT0FBSVFzQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUJRaUNJcHlJR1FRRnFEZ2dEQlFVQUFRVUZDUUlMSUFBZ0FrR0gxQUFRandFTUJnc2dBQ0FDUWZmNEFCQ1BBUXdGQ3lBR1FYbEdEUUVNQWdzZ0FhY2hCZ3dDQ3lBQnB5RUdJQUpCQUVnRVFDQUNRZi8vLy84SGNTSUZJQVlwQWdRaUM2ZEIvLy8vL3dkeFR3MEJJQVpCRUdvaEFpQUFBbjhnQzBLQWdJQ0FDSU5RUlFSQUlBSWdCVUVCZEdvdkFRQU1BUXNnQWlBRmFpMEFBQXRCLy84RGNSQ2ZBeUVMREFVTElBSkJNRWNOQUNBR0tRSUVRdi8vLy84SGd5RUxEQVFMSUFBZ0FSQ05CS2NpQmtVTkFnc2dBa0gvLy8vL0IzRWhDUU5BSUFZb0FoQWlCVUV3YWlFS0lBVWdCU2dDR0NBQ2NVRi9jMEVDZEdvb0FnQWhCUUpBQTBBZ0JVVU5BU0FDSUFvZ0JVRUJhMEVEZENJRmFpSUlLQUlFUndSQUlBZ29BZ0JCLy8vL0gzRWhCUXdCQ3dzZ0JpZ0NGQ0FGYWlFRkFrQUNRQUpBQWtBZ0NDZ0NBRUVlZGtFQmF3NERBQUVDQXdzZ0JTZ0NBQ0lDUlEwR0lBSWdBaWdDQUVFQmFqWUNBQ0FBSUFLdFFvQ0FnSUJ3aENBRFFRQkJBQkF2SVFzTUJ3c2dCU2dDQUNnQ0VDa0RBQ0lMUW9DQWdJQndnMEtBZ0lDQXdBQlJCRUFnQUNBQ0VOa0JEQVVMSUF0Q0lJaW5RWFZKRFFZZ0M2Y2lBQ0FBS0FJQVFRRnFOZ0lBREFZTElBQWdCaUFDSUFVZ0NCRElBa1VOQWd3REN5QUZLUU1BSWd0Q0lJaW5RWFZKRFFRZ0M2Y2lBQ0FBS0FJQVFRRnFOZ0lBREFRTEFrQWdCaTBBQlNJRlFRUnhSUTBBSUFWQkNIRUVRQ0FDUVFCSUJFQWdCaWdDS0NBSlN3UkFJQUFnQnExQ2dJQ0FnSENFSUFrUXNBRWhDd3dIQ3lBR0x3RUdRU0JyUWYvL0EzRkI5ZjhEVHcwRkRBSUxJQVl2QVFaQkZXdEIvLzhEY1VFS1N3MEJJQUFnQWhDZUF5SUZSUTBCUW9DQWdJRGdBRUtBZ0lDQU1DQUZRUUJJR3lFTERBVUxJQUFvQWhBb0FrUWdCaThCQmtFWWJHb29BaFFpQlVVTkFDQUZLQUlVSWdnRVFDQUdJQVlvQWdCQkFXbzJBZ0FnQUNBR3JVS0FnSUNBY0lRaUFTQUNJQU1nQ0JFdUFDRUxJQUFnQVJBUERBVUxJQVVvQWdBaUJVVU5BQ0FHSUFZb0FnQkJBV28yQWdBZ0FDQUhJQWF0UW9DQWdJQndoQ0lCSUFJZ0JSRVhBQ0VGSUFBZ0FSQVBJQVZCQUVnTkFpQUZSUTBBSUFjdEFBQkJFSEVFUUNBQUlBY3BBeGdRRHlBQUlBY3BBeEFnQTBFQVFRQVFMeUVMREFVTElBY3BBd2doQ3d3RUN5QUdLQUlRS0FJc0lnWU5BQXRDZ0lDQWdEQWhDeUFFUlEwQ0lBQWdBaERIQWd0Q2dJQ0FnT0FBSVFzTUFRdENnSUNBZ0RBaEN3c2dCMEVnYWlRQUlBc0xEUUFnQUNBQklBSkJCQkRPQWd0ZkFRTi9Jd0JCRUdzaUJDUUFJQUFvQWdBaEF5QUVJQUkyQWd3Z0EwRURJQUVnQWtFQUVQQUZJQU1nQXlnQ0VDa0RnQUVnQUNnQ0RDQUFLQUlJSUFBb0FrQWlBUVIvSUFFb0FtaEJBRWRCQVhRRlFRQUxFTW9DSUFSQkVHb2tBQXNNQUNBQVFZQUNhaUFCRUNvTEt3QWdBVUhlQVU0RVFDQUFLQUlRS0FJNElBRkJBblJxS0FJQUlnQWdBQ2dDQUVFQmFqWUNBQXNnQVFzcEFDQUFJQUVnQWlBRFFvQ0FnSUF3UW9DQWdJQXdJQVJCZ000QWNoQnRJUUlnQUNBREVBOGdBZ3NaQUNBQUtBSUFJQUVRR0NFQklBQkJRR3NvQWdBZ0FSQTVDeTBCQVg4Q1FDQUFLQUlBSWdGRkRRQWdBQ2dDRUNJQVJRMEFJQUVvQWdBZ0FFRUFJQUVvQWdRUkFRQWFDd3RjQVFGL0lBQkJRR3NvQWdBaUF4RG1Ba1VFUUVGL0R3c2dBa0VBU0FSQUlBTVFNaUVDQ3lBQUlBRkIvd0Z4RUJBZ0FFRkFheUlBS0FJQUlBSVFPU0FBS0FJQUtBS2tBaUFDUVJSc2FpSUFJQUFvQWdCQkFXbzJBZ0FnQWdzbUFRRi9Jd0JCRUdzaUFpUUFJQUlnQVRZQ0RDQUFJQUpCREdwQkJCQnlJQUpCRUdva0FBczVBQ0FCUVFCT0JFQWdBRUcyQVJBUUlBQkJRR3NpQUNnQ0FDQUJFRGtnQUNnQ0FDSUFLQUtrQWlBQlFSUnNhaUFBS0FLRUFqWUNCQXNMTXdFQmZ5QUNCRUFnQUNFREEwQWdBeUFCTFFBQU9nQUFJQU5CQVdvaEF5QUJRUUZxSVFFZ0FrRUJheUlDRFFBTEN5QUFDeGdCQVg0Z0FTa0RBQ0VESUFFZ0FqY0RBQ0FBSUFNUUR3c1hBQ0FBSUFFZ0FrS0FnSUNBTUNBRElBUkJBaERZQVF2QUJRSUNmZ1ovSXdCQjRBQnJJZ2trQUNBRFFRQWdBMEVBU2hzaEN3TkFJQW9nQzBaRkJFQWdBQ0FDSUFwQkJIUnFJZ01vQWdBUXRBVWhCaUFETFFBRUlRZENnSUNBZ0RBaEJBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQU10QUFVT0NnRUNBZ1VIQXdRSUJRQUdDeUFBSUFNb0FnZ1F0QVVoQ0FKK0FrQUNRQUpBSUFNb0FneEJBV29PQXdJQUFRa0xJQUFnQUNrRHdBRWlCQ0FJSUFSQkFCQVVEQUlMSUFBZ0FDZ0NLQ2tERUNJRUlBZ2dCRUVBRUJRTUFRc2dBQ0FCSUFnZ0FVRUFFQlFMSVFRZ0FDQUlFQk1nQmtIUUFVWUVRRUVCSVFjTUNBc2dCa0haQVVjTkIwRUFJUWNNQndzQ1FDQUdRZEFCUmdSQVFRRWhCd3dCQ3lBR1Fka0JSdzBBUVFBaEJ3c2dBQ0FCSUFaQkFpQURJQWNRbFFNYURBY0xRb0NBZ0lBd0lRVWdBeWdDQ0FSQUlBa2dBeWdDQURZQ0VDQUpRU0JxSWdoQndBQkJ6RHdnQ1VFUWFoQk9HaUFBSUFNb0FnZ2dDRUVBUVFwQkNDQURMUUFGUVFKR0d5QURMZ0VHRUlJQklRVUxJQU1vQWd3RVFDQUpJQU1vQWdBMkFnQWdDVUVnYWlJSVFjQUFRY1U4SUFrUVRob2dBQ0FES0FJTUlBaEJBVUVMUVFrZ0F5MEFCVUVDUmhzZ0F5NEJCaENDQVNFRUN5QUFJQUVnQmtLQWdJQ0FNQ0FGSUFRZ0IwR0FPbklRYlJvZ0FDQUZFQThnQUNBRUVBOE1CZ3NnQXlrRENDSUVRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUVRdi8vLy84UGd5RUVEQVVMUW9DQWdJREFmaUFFdWIwaUJFS0FnSUNBd0lHQS9QOEFmU0FFUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeUVFREFRTFFvQ0FnSURBZmlBREtRTUlJZ1JDZ0lDQWdNQ0JnUHovQUgwZ0JFTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzaEJBd0RDeUFBSUFFZ0JrRUNJQU1nQnhDVkF4b01Bd3NRQVFBTElBTTFBZ2doQkFzZ0FDQUJJQVlnQkNBSEVCa2FDeUFBSUFZUUV5QUtRUUZxSVFvTUFRc0xJQWxCNEFCcUpBQUxNZ0VCZndKQUlBRkNJSWluUVhWSkRRQWdBYWNpQWlBQ0tBSUFJZ0pCQVdzMkFnQWdBa0VCU2cwQUlBQWdBUkNXQkFzTEN3QWdBRUdBTVVFQUVCVUxvZ0lDQW40QmZ3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0JCQnlBQlFpQ0lweUlFSUFSQkIydEJia2tiUVF0cURoTUVBZ01JQmdBQUFBQUFBUVVIQUFBQUFBRUZBQXNnQUVHVk1FRUFFQlZDZ0lDQWdPQUFEd3NnQkVGMVNRMElJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FBd0lDeUFBUVNFUWRpRUNEQVlMSUFCQkloQjJJUUlNQlFzZ0FFRWtFSFloQWd3RUN5QUFRUVFRZGlFQ0RBTUxJQUFnQUVFRkVIWWlBa0V3SUFHbktRSUVRdi8vLy84SGcwRUFFQmthREFJTElBQkJCaEIySVFJTUFRc2dBRUVIRUhZaEFndENnSUNBZ09BQUlRTWdBa0tBZ0lDQWNJTkNnSUNBZ09BQVVnUitJQVJCZFU4RVFDQUJweUlFSUFRb0FnQkJBV28yQWdBTElBQWdBaUFCRU5zQklBSUZRb0NBZ0lEZ0FBc1BDeUFCQzlrQkFnSi9BWDVCZnlFQ0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQlFpQ0lweUlEUVF0cURoSUhCd2NGQWdVRkJRVUZCQUFCQVFFRkJRWUZDeUFCcDBFQVJ3OExJQUduRHdzZ0FhY3BBZ1FoQkNBQUlBRVFEeUFFUXYvLy8vOEhnMElBVWc4TEFBc2dBYWNzQUFVaEFpQUFJQUVRRHlBQ1FRQk9Ed3NnQTBFSGEwRnRUUVJBSUFGQ2dJQ0FnTUNCZ1B6L0FIeEMvLy8vLy8vLy8vLy9BSU5DQVgxQ2dJQ0FnSUNBZ1BqL0FGUVBDeUFBSUFFUUQwRUJJUUlMSUFJUEN5QUJweWdDRENFQ0lBQWdBUkFQSUFKQi8vLy8vd2RxUVg1SkM2Z0VBUXQvSUFBb0FnQWhCU01BUVJCcklnZ2dBallDREVGL0lRa0NRQU5BQWtBZ0NDQUNJZ05CQkdvaUFqWUNEQ0FES0FJQUlnZEJmMFlOQUNBQUtBSUVJUW9EUUNBQklnUWdDazROQXlBRUlBUWdCV29pREMwQUFDSUdRUUowSWcxQmdMZ0JhaTBBQUdvaUFTQUtTZzBESUFaQndnRkdCRUFnRENnQUFTRUpEQUVMQ3lBR0lBZEhCRUFnQmlBSFFmOEJjVVlnQmlBSFFRaDJRZjhCY1VaeUlBWWdCMEVRZGtIL0FYRkdja1VnQjBFWWRpQUdSM0VnQmtVZ0IwR0FBa2x5Y2cwRElBQWdCallDRUFzZ0JFRUJhaUVFQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FOUVlPNEFXb3RBQUJCQldzT0dBQUpBQWtKQVFrSkFRa0pBUUVCQWdJQ0FnUUZCZ2NKQXdrTElBUWdCV290QUFBaEJDQUlJQU5CQ0dvaUFqWUNEQ0FES0FJRUlnTkJmMFlFUUNBQUlBUTJBaFFNQ1FzZ0F5QUVSZzBJREFrTElBUWdCV292QUFBaEJDQUlJQU5CQ0dvaUFqWUNEQ0FES0FJRUlnTkJmMFlFUUNBQUlBUTJBaFFNQ0FzZ0F5QUVSZzBIREFnTElBQWdCQ0FGYWlnQUFEWUNHQXdHQ3lBQUlBUWdCV29pQXlnQUFEWUNHQ0FBSUFNdkFBUTJBaHdNQlFzZ0FDQUVJQVZxS0FBQU5nSWdEQVFMSUFBZ0JDQUZhaUlES0FBQU5nSWdJQUFnQXkwQUJEWUNIQXdEQ3lBQUlBUWdCV29pQXlnQUFEWUNJQ0FBSUFNdkFBUTJBaHdNQWdzZ0FDQUVJQVZxSWdNb0FBQTJBaUFnQUNBREtBQUVOZ0lZSUFBZ0F5MEFDRFlDSEF3QkN3c2dBQ0FKTmdJTUlBQWdBVFlDQ0VFQklRc0xJQXNMQ3dBZ0FDQUJRUUFRamdRTEpBRUJmeUFBS0FJUUlnSkJFR29nQVNBQ0tBSUFFUU1BSWdGRkJFQWdBQkI4Q3lBQkN5WUJBWDhqQUVFUWF5SUNKQUFnQWlBQk93RU9JQUFnQWtFT2FrRUNFSElnQWtFUWFpUUFDeWtCQVg4Z0FnUkFJQUFoQXdOQUlBTWdBVG9BQUNBRFFRRnFJUU1nQWtFQmF5SUNEUUFMQ3lBQUN6OEJBWDhqQUVFUWF5SUNKQUFDZnlBQklBQW9BaEJIQkVBZ0FpQUJOZ0lBSUFCQm9KZ0JJQUlRRmtGL0RBRUxJQUFRRWdzaEFDQUNRUkJxSkFBZ0FBc0xBQ0FBSUFGQkFSRG1CUXZEQ2dJRmZ3OStJd0JCNEFCcklnVWtBQ0FFUXYvLy8vLy8veitESVF3Z0FpQUVoVUtBZ0lDQWdJQ0FnSUIvZ3lFS0lBSkMvLy8vLy8vL1A0TWlEVUlnaUNFT0lBUkNNSWluUWYvL0FYRWhCd0pBQWtBZ0FrSXdpS2RCLy84QmNTSUpRZi8vQVd0QmdvQitUd1JBSUFkQi8vOEJhMEdCZ0g1TERRRUxJQUZRSUFKQy8vLy8vLy8vLy8vL0FJTWlDMEtBZ0lDQWdJREEvLzhBVkNBTFFvQ0FnSUNBZ01ELy93QlJHMFVFUUNBQ1FvQ0FnSUNBZ0NDRUlRb01BZ3NnQTFBZ0JFTC8vLy8vLy8vLy8vOEFneUlDUW9DQWdJQ0FnTUQvL3dCVUlBSkNnSUNBZ0lDQXdQLy9BRkViUlFSQUlBUkNnSUNBZ0lDQUlJUWhDaUFESVFFTUFnc2dBU0FMUW9DQWdJQ0FnTUQvL3dDRmhGQUVRQ0FDSUFPRVVBUkFRb0NBZ0lDQWdPRC8vd0FoQ2tJQUlRRU1Bd3NnQ2tLQWdJQ0FnSURBLy84QWhDRUtRZ0FoQVF3Q0N5QURJQUpDZ0lDQWdJQ0F3UC8vQUlXRVVBUkFJQUVnQzRRaEFrSUFJUUVnQWxBRVFFS0FnSUNBZ0lEZy8vOEFJUW9NQXdzZ0NrS0FnSUNBZ0lEQS8vOEFoQ0VLREFJTElBRWdDNFJRQkVCQ0FDRUJEQUlMSUFJZ0E0UlFCRUJDQUNFQkRBSUxJQXRDLy8vLy8vLy9QMWdFUUNBRlFkQUFhaUFCSUEwZ0FTQU5JQTFRSWdZYmVTQUdRUVowclh5bklnWkJEMnNRWjBFUUlBWnJJUVlnQlNrRFdDSU5RaUNJSVE0Z0JTa0RVQ0VCQ3lBQ1F2Ly8vLy8vL3o5V0RRQWdCVUZBYXlBRElBd2dBeUFNSUF4UUlnZ2JlU0FJUVFaMHJYeW5JZ2hCRDJzUVp5QUdJQWhyUVJCcUlRWWdCU2tEU0NFTUlBVXBBMEFoQXdzZ0EwSVBoaUlMUW9DQS92OFBneUlDSUFGQ0lJZ2lCSDRpRUNBTFFpQ0lJaE1nQVVMLy8vLy9ENE1pQVg1OElnOUNJSVlpRVNBQklBSitmQ0lMSUJGVXJTQUNJQTFDLy8vLy93K0RJZzErSWhVZ0JDQVRmbndpRVNBTVFnK0dJaElnQTBJeGlJUkMvLy8vL3crRElnTWdBWDU4SWhRZ0R5QVFWSzFDSUlZZ0QwSWdpSVI4SWc4Z0FpQU9Rb0NBQklRaURINGlGaUFOSUJOK2ZDSU9JQkpDSUloQ2dJQ0FnQWlFSWdJZ0FYNThJaEFnQXlBRWZud2lFa0lnaG53aUYzd2hBU0FISUFscUlBWnFRZi8vQUdzaEJnSkFJQUlnQkg0aUdDQU1JQk4rZkNJRUlCaFVyU0FFSUFRZ0F5QU5mbndpQkZhdGZDQUNJQXgrZkNBRUlBUWdFU0FWVkswZ0VTQVVWcTE4ZkNJRVZxMThJQU1nREg0aUF5QUNJQTErZkNJQ0lBTlVyVUlnaGlBQ1FpQ0loSHdnQkNBQ1FpQ0dmQ0lDSUFSVXJYd2dBaUFDSUJBZ0VsYXRJQTRnRmxTdElBNGdFRmF0Zkh4Q0lJWWdFa0lnaUlSOElnSldyWHdnQWlBQ0lBOGdGRlN0SUE4Z0YxYXRmSHdpQWxhdGZDSUVRb0NBZ0lDQWdNQUFnMUJGQkVBZ0JrRUJhaUVHREFFTElBdENQNGdoQXlBRVFnR0dJQUpDUDRpRUlRUWdBa0lCaGlBQlFqK0loQ0VDSUF0Q0FZWWhDeUFESUFGQ0FZYUVJUUVMSUFaQi8vOEJUZ1JBSUFwQ2dJQ0FnSUNBd1AvL0FJUWhDa0lBSVFFTUFRc0NmaUFHUVFCTUJFQkJBU0FHYXlJSFFmOEFUUVJBSUFWQk1Hb2dDeUFCSUFaQi93QnFJZ1lRWnlBRlFTQnFJQUlnQkNBR0VHY2dCVUVRYWlBTElBRWdCeENPQWlBRklBSWdCQ0FIRUk0Q0lBVXBBekFnQlNrRE9JUkNBRkt0SUFVcEF5QWdCU2tERUlTRUlRc2dCU2tES0NBRktRTVloQ0VCSUFVcEF3QWhBaUFGS1FNSURBSUxRZ0FoQVF3Q0N5QUVRdi8vLy8vLy96K0RJQWF0UWpDR2hBc2dDb1FoQ2lBTFVDQUJRZ0JaSUFGQ2dJQ0FnSUNBZ0lDQWYxRWJSUVJBSUFvZ0FrSUJmQ0lCVUsxOElRb01BUXNnQ3lBQlFvQ0FnSUNBZ0lDQWdIK0ZoRkJGQkVBZ0FpRUJEQUVMSUFvZ0FpQUNRZ0dEZkNJQklBSlVyWHdoQ2dzZ0FDQUJOd01BSUFBZ0NqY0RDQ0FGUWVBQWFpUUFDeUVBSUFBZ0FTQUNRb0NBZ0lBd0lBTWdCRUVDRU5nQklRSWdBQ0FCRUE4Z0FndW1BUUVFZnlBQVFRQTJBZ1FnQVZBRVFDQUFRWUNBZ0lCNE5nSUlJQUJCQUJCQkdrRUFEd3NDUUNBQlF2Ly8vLzhQV0FSQUlBQkJBUkJCRFFFZ0FDZ0NFQ0FCSUFHblp5SUNyWVkrQWdBZ0FFRWdJQUpyTmdJSVFRQVBDeUFBUVFJUVFRMEFJQUFvQWhBaUF5QUJweUlFSUFGQ0lJaW5JZ1ZuSWdKME5nSUFJQU1nQlNBQ2RDQUVRU0FnQW10MmNqWUNCQ0FBUWNBQUlBSnJOZ0lJUVFBUEN5QUFFRFZCSUF0L0FnSi9BWDRnQVVJZ2lLY2lBeUFCcHlJQ1FRQklja1VFUUNBQ1FZQ0FnSUI0Y2c4TElBTkJlRVlFUUNBQUlBQW9BaEFnQWhEQkFoQVlEd3NnQUNBQkVJTUVJZ0ZDZ0lDQWdIQ0RJZ1JDZ0lDQWdPQUFVUVJBUVFBUEN5QUVRb0NBZ0lDQWYxRUVRQ0FBS0FJUUlBRVFqUUlQQ3lBQUtBSVFJQUduRVB3REN3a0FJQUJCZnhESUF3dHFBUUovQWtBZ0FDZ0MyQUlpQTBVTkFDQUFLQUxnQWlJRUlBQW9BdHdDVGcwQUlBQW9BdWdDSUFGTERRQWdBQ2dDNUFJZ0FrWU5BQ0FESUFSQkEzUnFJZ01nQWpZQ0JDQURJQUUyQWdBZ0FDQUJOZ0xvQWlBQUlBUkJBV28yQXVBQ0lBQWdBallDNUFJTEN4QUFJQUFnQUNnQ0tDa0RDRUVCRUVrTEdRQWdBRUVBRUVFYUlBQkNnSUNBZ1BELy8vLy9BRGNDQkF1REFnSURmd0YrUW9DQWdJRGdBQ0VFSUFBb0FoUUVma0tBZ0lDQTRBQUZJQUFvQWdRaEFTQUFLQUlJSWdKRkJFQWdBQ2dDQUNnQ0VDSUNRUkJxSUFFZ0FpZ0NCQkVBQUNBQVFRQTJBZ1FnQUNnQ0FFRXZFQzBQQ3lBQUtBSU1JQUpLQkVBZ0FDZ0NBQ2dDRUNJRFFSQnFJQUVnQWlBQUtBSVFJZ0YwSUFGclFSRnFJQU1vQWdnUkFRQWlBVVVFUUNBQUtBSUVJUUVMSUFBZ0FUWUNCQXNnQVNBQUtBSVFJZ0lFZnlBQ0JTQUJJQUFvQWdocVFRQTZBQkFnQUNnQ0VBdEJIM1N0SUFFcEFnUkMvLy8vLzNlRGhDSUVOd0lFSUFFZ0JFS0FnSUNBZUlNZ0FEVUNDRUwvLy8vL0I0T0VOd0lFSUFCQkFEWUNCQ0FCclVLQWdJQ0FrSCtFQ3dzVUFRRitJQUFnQVJBb0lRSWdBQ0FCRUE4Z0FndExBUUovSUFGQ2dJQ0FnSEJhQkg4Z0FhY2lBeThCQmlJQ1FRMUdCRUJCQVE4TElBSkJNRVlFUUNBREtBSWdMUUFRRHdzZ0FDZ0NFQ2dDUkNBQ1FSaHNhaWdDRUVFQVJ3VkJBQXNMREFBZ0FFR0FBbW9nQVJBZEN5d0JBWDhqQUVFUWF5SURKQUFnQXlBQ05nSU1JQUJCM0FCcVFZQUJJQUVnQWhETEFob2dBMEVRYWlRQUMya0JBbjhDZnlBQUtBSUlJZ0lnQUNnQ0RFNEVRRUYvSUFBZ0FrRUJhaUFCRUxjQ0RRRWFJQUFvQWdnaEFnc2dBQ0FDUVFGcU5nSUlJQUFvQWdSQkVHb2hBd0pBSUFBb0FoQUVRQ0FESUFKQkFYUnFJQUU3QVFBTUFRc2dBaUFEYWlBQk9nQUFDMEVBQ3dzMUFDQUFJQUpCTUNBQ1FRQVFGQ0lDUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQVVJQU53TUFRWDhQQ3lBQUlBRWdBaENqQVFzTkFDQUFJQUVnQWtFQUVJb0RDeDhCQVg4Z0FDZ0NKQ0lCSUFFb0FnQkJBV28yQWdBZ0FDQUJRUUlRN3dVTGFRRURmd0pBSUFBaUFVRURjUVJBQTBBZ0FTMEFBRVVOQWlBQlFRRnFJZ0ZCQTNFTkFBc0xBMEFnQVNJQ1FRUnFJUUVnQWlnQ0FDSURRWDl6SUFOQmdZS0VDR3R4UVlDQmdvUjRjVVVOQUFzRFFDQUNJZ0ZCQVdvaEFpQUJMUUFBRFFBTEN5QUJJQUJyQ3g4QUlBQWdBU0FBSUFJUXFnRWlBaUFEUVlDQUFSRFFBUm9nQUNBQ0VCTUxUd0VCZndKL1FRQWdBQ2dDRENBQlJnMEFHaUFBS0FJQUlnSW9BZ0FnQUNnQ0VDQUJRUUowSUFJb0FnUVJBUUFoQWlBQkJFQkJmeUFDUlEwQkdnc2dBQ0FCTmdJTUlBQWdBallDRUVFQUN3c29BUUYvSUFKQ0lJaW5RWFZQQkVBZ0FxY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBRWdBaEJ1QzdJRUFRaC9Jd0JCSUdzaUJ5UUFJQUVnQWlBQktBSU1JQUlvQWd4SklnWWJJZ2dvQWdRZ0FpQUJJQVliSWdrb0FnUnpJUW9DUUFKQUlBZ29BZ3dpQWtVRVFBSkFJQWtvQWdnaUFVSC8vLy8vQjBjRVFDQUlLQUlJSWdKQi8vLy8vd2RIRFFFTElBQVFOVUVBSVFJTUF3c2dBVUgrLy8vL0IwY2dBa0grLy8vL0IwZHhSUVJBQWtBZ0FVSCsvLy8vQjBZRVFDQUNRWUNBZ0lCNFJnMEJEQVFMSUFGQmdJQ0FnSGhISUFKQi92Ly8vd2RIY2cwREN5QUFFRFZCQVNFQ0RBTUxJQUFnQ2hDSkFVRUFJUUlNQWdzZ0NTZ0NEQ0lHSVFVZ0FpRUJJQVJCQjNGQkJrWUVRQ0FDSUFOQklXcEJCWFlpQlNBQ0lBVklHeUVCSUFZZ0JTQUZJQVpLR3lFRkN5QUlLQUlRSUFKQkFuUnFJQUZCQW5ScklRc2dDU2dDRUNBR1FRSjBhaUFGUVFKMGF5RU1BbjhDUUFKQUFrQWdBVUhrQUU4RVFFRUFJUVlnQUNnQ0FDQUFJQXdnQlNBTElBRWdBQ0FKUmlJQlFRSnlJQUVnQUNBSVJoc1Fud1lOQVF3REN3Si9Ba0FnQUNBSlJnMEFRUUFoQmlBQUlBaEdEUUFnQUF3QkN5QUFLQUlBSVFJZ0IwSUFOd0lZSUFkQ2dJQ0FnSUNBZ0lDQWZ6Y0NFQ0FISUFJMkFnd2dBQ0VHSUFkQkRHb0xJZ0lnQVNBRmFoQkJSUTBCSUFJaEFBc2dBQkExUVNBTUFnc2dBaWdDRUNBTUlBVWdDeUFCRUo0R0lBSWhBQXNnQUNBS05nSUVJQUFnQ0NnQ0NDQUpLQUlJYWpZQ0NDQUFJQU1nQkJDekFnc2hBaUFBSUFkQkRHcEhEUUVnQmlBSFFReHFFS0FHREFFTElBQWdDaENNQVVFQUlRSUxJQWRCSUdva0FDQUNDMGdBSUFBZ0FVY0VRQ0FBSUFFb0Fnd1FRUVJBSUFBUU5VRWdEd3NnQUNBQktBSUVOZ0lFSUFBZ0FTZ0NDRFlDQ0NBQUtBSVFJQUVvQWhBZ0FTZ0NERUVDZEJBZkdndEJBQXNSQUNBQUlBRWdBaUFEUVlDQUFSRFFBUXNOQUNBQUlBRWdBa0VHRU00Q0N3b0FJQUFnQVVFQkVFa0xIUUFnQUNBQktRTVFFQThnQUNBQktRTVlFQThnQUNBQktRTUlFQThMcGdFQkEzOGdBQ2dDRUNJREtBTFVBU0FCcDBFQUlBRkMvLy8vLzI5V0d5SUVRWUdBM1BGNWJFSC8vNk9PQm1zaUJVRWdJQU1vQXNnQmEzWkJBblJxSVFNQ1FBSkFBMEFnQXlnQ0FDSURCRUFDUUNBREtBSVVJQVZIRFFBZ0F5Z0NMQ0FFUncwQUlBTW9BaUJGRFFNTElBTkJLR29oQXd3QkN3c2dBQ0FFUVFJUXhRUWlBdzBCUW9DQWdJRGdBQThMSUFNZ0F5Z0NBRUVCYWpZQ0FBc2dBQ0FESUFJUTd3VUxKZ0VCZndKQUlBQW9BaEJCZzM5SERRQWdBQ2dDSUNBQlJ3MEFJQUFvQWlSRklRSUxJQUlMT0FFQmZ3SkFBa0FnQVVLQWdJQ0FjRlFOQUNBQnB5SURMd0VHSUFKSERRQWdBeWdDSUNJRERRRUxJQUFnQWhDR0EwRUFJUU1MSUFNTGxRVUNBMzhCZmdKQUFrQUNRQUpBQWtBQ1FBTkFJQUlvQWhBaUJFRXdhaUVGSUFRZ0JDZ0NHQ0FEY1VGL2MwRUNkR29vQWdBaEJBTkFJQVJGRFFRZ0F5QUZJQVJCQVd0QkEzUWlCbW9pQkNnQ0JFY0VRQ0FFS0FJQVFmLy8veDl4SVFRTUFRc0xJQUlvQWhRZ0Jtb2hCU0FFS0FJQUlRWWdBVVVOQVNBQlFvQ0FnSUF3TndNWUlBRkNnSUNBZ0RBM0F4QWdBVUtBZ0lDQU1EY0RDQ0FCSUFaQkduWkJCM0VpQmpZQ0FBSkFBa0FDUUFKQUlBUW9BZ0JCSG5aQkFXc09Bd0FCQWdNTElBRWdCa0VRY2pZQ0FDQUZLQUlBSWdBRVFDQUFJQUFvQWdCQkFXbzJBZ0FnQVNBQXJVS0FnSUNBY0lRM0F4QUxJQVVvQWdRaUFFVU5DU0FBSUFBb0FnQkJBV28yQWdBZ0FTQUFyVUtBZ0lDQWNJUTNBeGhCQVE4TElBVW9BZ0FvQWhBcEF3QWlCMEtBZ0lDQWNJTkNnSUNBZ01BQVVRMEVJQWRDSUlpblFYVlBCRUFnQjZjaUFDQUFLQUlBUVFGcU5nSUFDeUFCSUFjM0F3Z01DQXNnQUNBQ0lBTWdCU0FFRU1nQ1JRMEJEQVlMQ3lBRktRTUFJZ2RDSUlpblFYVlBCRUFnQjZjaUFDQUFLQUlBUVFGcU5nSUFDeUFCSUFjM0F3Z01CUXRCQVNFRUlBWkJnSUNBZ0h4eFFZQ0FnSUI0UncwQ0lBVW9BZ0FvQWhBMUFnUkNJSVpDZ0lDQWdNQUFVZzBDQ3lBQUlBTVEyUUVNQWd0QkFDRUVJQUl0QUFVaUJVRUVjVVVOQUNBRlFRaHhCRUFnQTBFQVRnMEJJQU5CLy8vLy93ZHhJZ01nQWlnQ0tDSUZTU0VFSUFGRklBTWdCVTl5RFFFZ0FVS0FnSUNBTURjREdDQUJRb0NBZ0lBd053TVFJQUZCQnpZQ0FDQUJJQUFnQXExQ2dJQ0FnSENFSUFNUXNBRTNBd2dNQXdzZ0FDZ0NFQ2dDUkNBQ0x3RUdRUmhzYWlnQ0ZDSUZSUTBBSUFVb0FnQWlCVVVOQUNBQUlBRWdBcTFDZ0lDQWdIQ0VJQU1nQlJFWEFDRUVDeUFFRHd0QmZ3OExRUUVMb1FRQkFuOENRQUpBSUFGQ2dJQ0FnSEJVSUFKQy8vLy8vdzlXY2cwQUlBS25JZ1FnQWFjaUF5Z0NLRThOQUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBeThCQmtFQ2F3NGVBQXNMQ3dzTEFBc0xDd3NMQ3dzTEN3c0xDd0lCQWdNRUJRWUhDQWtLQ3dzZ0F5Z0NKQ0FFUVFOMGFpa0RBQ0lCUWlDSXAwRjFTUTBMSUFHbklnQWdBQ2dDQUVFQmFqWUNBQ0FCRHdzZ0F5Z0NKQ0FFYWpBQUFFTC8vLy8vRDRNUEN5QURLQUlrSUFScU1RQUFEd3NnQXlnQ0pDQUVRUUYwYWpJQkFFTC8vLy8vRDRNUEN5QURLQUlrSUFSQkFYUnFNd0VBRHdzZ0F5Z0NKQ0FFUVFKMGFqVUNBQThMSUFNb0FpUWdCRUVDZEdvb0FnQWlBRUVBVGdSQUlBQ3REd3RDZ0lDQWdNQitJQUM0dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJEd3NnQUNBREtBSWtJQVJCQTNScUtRTUFFSWNDRHdzZ0FDQURLQUlrSUFSQkEzUnFLUU1BRVBzRER3dENnSUNBZ01CK0lBTW9BaVFnQkVFQ2RHb3FBZ0M3dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJEd3RDZ0lDQWdNQitJQU1vQWlRZ0JFRURkR29wQXdBaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHdzhMSUFBZ0FoQXhJUU1nQUNBQ0VBOGdBMFVFUUVLQWdJQ0E0QUFQQ3lBQUlBRWdBeUFCUVFBUUZDRUJJQUFnQXhBVEN5QUJDeW9CQVg4akFFRVFheUlFSkFBZ0JDQUROZ0lNSUFBZ0FTQUNJQU1ReXdJaEFDQUVRUkJxSkFBZ0FBdU1BUUVDZnlBQktBSjhJZ1JCZ0lBRVRnUkFJQUJCalRwQkFCQkdRWDhQQzBGL0lRTWdBQ0FCUWZRQWFrRVFJQUZCK0FCcUlBUkJBV29RZUFSL1FYOEZJQUVnQVNnQ2ZDSURRUUZxTmdKOElBRW9BblFnQTBFRWRHb2lBMElBTndJQUlBTkNBRGNDQ0NBRElBQWdBaEFZTmdJQUlBTWdBeWdDREVHQS8vLy9CM0kyQWd3Z0FTZ0NmRUVCYXdzTERRQWdBQ0FCSUFKQkFSRE9BZ3VyQWdFRWZ3SkFJQUlnQTA4TkFDQURJQUpySVFVZ0FVRVFhaUVFSUFFdEFBZEJnQUZ4QkVCQkFDRURJQVZCQUNBRlFRQktHeUVHSUFRZ0FrRUJkR29oQVVFQUlRSURRQ0FDSUFaR1JRUkFJQU1nQVNBQ1FRRjBhaThCQUhJaEF5QUNRUUZxSVFJTUFRc0xBa0FnQUNnQ0NDQUZhaUlDSUFBb0Fnd2lCMG9FUUVGL0lRUWdBQ0FDSUFNUXR3SkZEUUVNQXdzZ0FDZ0NFQ0FEUVlBQ1NISU5BRUYvSVFRZ0FDQUhFUFVERFFJTEFrQWdBQ2dDRUVVRVFFRUFJUUlEUUNBQ0lBWkdEUUlnQUNnQ0JDQUFLQUlJSUFKcWFpQUJJQUpCQVhScUxRQUFPZ0FRSUFKQkFXb2hBZ3dBQ3dBTElBQW9BZ1FnQUNnQ0NFRUJkR3BCRUdvZ0FTQUZRUUYwRUI4YUN5QUFJQUFvQWdnZ0JXbzJBZ2hCQUE4TElBQWdBaUFFYWlBRkVJZ0NJUVFMSUFRTFJ3RUJmeUFCUWlDSXAwRjFUd1JBSUFHbklnTWdBeWdDQUVFQmFqWUNBQXNnQWtJZ2lLZEJkVThFUUNBQ3B5SURJQU1vQWdCQkFXbzJBZ0FMSUFBZ0FTQUNRUUVRdkFFTEZ3RUJmMEVJRUxFQklnRUVRQ0FCSUFBM0F3QUxJQUVMR1FBZ0FRUkFJQUFnQVVFUWE2MUNnSUNBZ0pCL2hCQVBDd3VDQXdJRWZ3SitBa0FnQUNrRGNDSUZVRVVnQlNBQUtRTjRJQUFvQWdRaUFTQUFLQUlzSWdKcnJId2lCbGR4UlFSQUl3QkJFR3NpQWlRQVFYOGhBUUpBQW44Z0FDQUFLQUpJSWdOQkFXc2dBM0kyQWtnZ0FDZ0NGQ0FBS0FJY1J3UkFJQUJCQUVFQUlBQW9BaVFSQVFBYUN5QUFRUUEyQWh3Z0FFSUFOd01RSUFBb0FnQWlBMEVFY1FSQUlBQWdBMEVnY2pZQ0FFRi9EQUVMSUFBZ0FDZ0NMQ0FBS0FJd2FpSUVOZ0lJSUFBZ0JEWUNCQ0FEUVJ0MFFSOTFDdzBBSUFBZ0FrRVBha0VCSUFBb0FpQVJBUUJCQVVjTkFDQUNMUUFQSVFFTElBSkJFR29rQUNBQklnTkJBRTROQVNBQUtBSUVJUUVnQUNnQ0xDRUNDeUFBUW44M0EzQWdBQ0FCTmdKb0lBQWdCaUFDSUFGcnJIdzNBM2hCZnc4TElBWkNBWHdoQmlBQUtBSUVJUUVnQUNnQ0NDRUNBa0FnQUNrRGNDSUZVQTBBSUFVZ0JuMGlCU0FDSUFGcnJGa05BQ0FCSUFXbmFpRUNDeUFBSUFJMkFtZ2dBQ0FHSUFBb0Fpd2lBQ0FCYTZ4OE53TjRJQUFnQVU4RVFDQUJRUUZySUFNNkFBQUxJQU1MQ1FBZ0FFRUJFTFlCQzJNQkFYOGdBa0lnaUtkQmRVOEVRQ0FDcHlJRklBVW9BZ0JCQVdvMkFnQUxBa0FnQUNBQklBSVFpd1VpQlEwQUFrQWdBU2dDQUNJQVFRQklCRUFnQUNBRWFpSUFRUUFnQUVFQVNoc2hBd3dCQ3lBQUlBTk1EUUVMSUFFZ0F6WUNBQXNnQlF2UkFRRUdmeUFBUVFGcUlRVUNRQUpBSUFBdEFBQWlBOEFpQjBFQVRnUkFJQVVoQVF3QkMwRi9JUVFnQjBGQWEwSC9BWEVpQTBFOVN3MEJJQU5CQW5SQjVKOEVhaWdDQUNJR0lBRk9EUUVnQmtFQmF5RUlJQUFnQm1wQkFXb2hBU0FISUFaQndwOEVhaTBBQUhFaEEwRUFJUUFEUUNBQUlBWkhCRUFnQlN3QUFDSUVRYjkvU2dSQVFYOFBCU0FFUVQ5eElBTkJCblJ5SVFNZ0FFRUJhaUVBSUFWQkFXb2hCUXdDQ3dBTEMwRi9JUVFnQXlBSVFRSjBRZENmQkdvb0FnQkpEUUVMSUFJZ0FUWUNBQ0FESVFRTElBUUxMUUFnQVVLQWdJQ0FZSU5DZ0lDQWdDQlJCRUFnQUVHNzBRQkJBQkFWUW9DQWdJRGdBQThMSUFBZ0FSQW9DMEVCQVg4Z0FRUkFBMEFnQWlBRFJrVUVRQ0FBSUFFZ0EwRURkR29vQWdRUUV5QURRUUZxSVFNTUFRc0xJQUFvQWhBaUFFRVFhaUFCSUFBb0FnUVJBQUFMQ3hnQUlBQXRBQUJCSUhGRkJFQWdBU0FDSUFBUXVnUWFDd3NMQUNBQUlBRkJBQkRtQlF1dUFnQUNRQUpBQWtBQ1FDQUNRUU5NQkVBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FVSFlBR3NPQ1FBQkFnTUVCUVlIQ0FvTElBQWdBa0U3YTBIL0FYRVFFUThMSUFBZ0FrRTNhMEgvQVhFUUVROExJQUFnQWtFemEwSC9BWEVRRVE4TElBQWdBa0V2YTBIL0FYRVFFUThMSUFBZ0FrRXJhMEgvQVhFUUVROExJQUFnQWtFbmEwSC9BWEVRRVE4TElBQWdBa0VqYTBIL0FYRVFFUThMSUFBZ0FrRWZhMEgvQVhFUUVROExJQUFnQWtFYmEwSC9BWEVRRVE4TElBSkIvd0ZMRFFFQ1FBSkFBa0FnQVVIWUFHc09Bd0FCQWdRTElBQkJ3Z0VRRVF3RkN5QUFRY01CRUJFTUJBc2dBRUhFQVJBUkRBTUxJQUZCSWtZTkFRc2dBQ0FCUWY4QmNSQVJJQUFnQWtILy93TnhFQ29QQ3lBQUlBSkJFbXRCL3dGeEVCRVBDeUFBSUFKQi93RnhFQkVMSVFBZ0FTQUNSZ1JBSUFFUUd3OExJQUFnQVVFRWE2MUNnSUNBZ1BCK2hCQVBDeXdCQVg4Z0FDZ0NFQ0lDUVJCcUlBRWdBaWdDQUJFREFDSUNCRUFnQWtFQUlBRVFLdzhMSUFBUWZDQUNDeHdCQVg4Z0FDQUJFRGdFZjBFQUJTQUFRWnZNQUVFQUVCVkJmd3NMUXdFRGZ3SkFJQUpGRFFBRFFDQUFMUUFBSWdRZ0FTMEFBQ0lGUmdSQUlBRkJBV29oQVNBQVFRRnFJUUFnQWtFQmF5SUNEUUVNQWdzTElBUWdCV3NoQXdzZ0F3c05BQ0FBSUFFZ0FSQS9FSk1DQzIwQkFYOGpBRUdBQW1zaUJTUUFJQVJCZ01BRWNTQUNJQU5NY2tVRVFDQUZJQUZCL3dGeElBSWdBMnNpQTBHQUFpQURRWUFDU1NJQkd4QXJHaUFCUlFSQUEwQWdBQ0FGUVlBQ0VGc2dBMEdBQW1zaUEwSC9BVXNOQUFzTElBQWdCU0FERUZzTElBVkJnQUpxSkFBTERBQWdBRUdBQW1vZ0FSQVJDNzRCQWdGK0FYOENRQUpBSUFGQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFBb0FpZ2dBa0VEZEdvcEF3QWlBMElnaUtkQmRFc05BUXdDQ3lBQUlBRkJPeUFCUVFBUUZDSURRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBdzhMSUFOQy8vLy8vMjlXRFFFZ0FDQURFQThnQUNBQkVJQURJZ1JGQkVCQ2dJQ0FnT0FBRHdzZ0JDZ0NLQ0FDUVFOMGFpa0RBQ0lEUWlDSXAwRjFTUTBCQ3lBRHB5SUVJQVFvQWdCQkFXbzJBZ0FMSUFBZ0F5QUNFRWtoQVNBQUlBTVFEeUFCQzNVQkFYNGdBQ0FCSUFSK0lBSWdBMzU4SUFOQ0lJZ2lBaUFCUWlDSUlnUitmQ0FEUXYvLy8vOFBneUlESUFGQy8vLy8vdytESWdGK0lnVkNJSWdnQXlBRWZud2lBMElnaUh3Z0FTQUNmaUFEUXYvLy8vOFBnM3dpQVVJZ2lIdzNBd2dnQUNBRlF2Ly8vLzhQZ3lBQlFpQ0doRGNEQUF0UUFRRitBa0FnQTBIQUFIRUVRQ0FCSUFOQlFHcXRoaUVDUWdBaEFRd0JDeUFEUlEwQUlBSWdBNjBpQklZZ0FVSEFBQ0FEYTYySWhDRUNJQUVnQklZaEFRc2dBQ0FCTndNQUlBQWdBamNEQ0F0VkFRTi9JQUVnQWtFRmRTSUVTd1JBSUFBZ0JFRUNkR29vQWdBaEF3c2dBa0VmY1NJQ0JIOGdBU0FFUVFGcUlnUkxCSDhnQUNBRVFRSjBhaWdDQUFWQkFBdEJBWFFnQWtFZmMzUWdBeUFDZG5JRklBTUxDMlFBQWtBQ1FDQUJRUUJJRFFBZ0FDZ0NyQUlnQVV3TkFDQUFLQUtrQWlBQlFSUnNhaUlBSUFBb0FnQWdBbW9pQURZQ0FDQUFRUUJJRFFFZ0FBOExRWVVwUWE3OEFFSElxQUZCbE5VQUVBQUFDMEdtamdGQnJ2d0FRY3VvQVVHVTFRQVFBQUFMWUFBZ0FDQUJJQUpDZ0lDQWdBaDhRdi8vLy84UFdBUitJQUpDLy8vLy93K0RCVUtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xJQU5CaDRBQkVMMEJDd3dBSUFCQmh2c0FRUUFRRlFzTEFDQUFJQUZCQVJEQkJRdlNFQUlNZndGK0l3QkJFR3NpQ2lRQUFrQUNRQ0FCUXYvLy8vOXZXQVJBSUFBUUpBd0JDeUFHUVlBd2NTSU9SU0FHSUFaQkNIWWlFSEVnRUVGL2MzSkJCM0VpRVVFSFJuRWhFaUFHUVlEQUFIRWhEQ0FDUWYvLy8vOEhjU0VOSUFHbklRa0NRQUpBQWtBQ1FBSkFBMEFnQ1NnQ0VDSUhRVEJxSVFnZ0J5QUhLQUlZSUFKeFFYOXpRUUowYWlnQ0FDRUhBa0FEUUNBSFJRMEJJQUlnQ0NBSFFRRnJRUU4wSWd0cUlnY29BZ1JIQkVBZ0J5Z0NBRUgvLy84ZmNTRUhEQUVMQ3lBSktBSVVJQXRxSVFnZ0NpQUhOZ0lNSUF4RklBY29BZ0FpQzBHQWdJQ0FBbkZGY2tVRVFDQURRaUNJcDBGMVR3UkFJQU9uSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dBQ0FLUVFocUlBTkJBQkRDQWcwSUFuNGdDaWdDQ0NJSFFRQk9CRUFnQjYwTUFRdENnSUNBZ01CK0lBZTR2U0lEUW9DQWdJREFnWUQ4L3dCOUlBTkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN5RURJQWtvQWhBaUIwRXdhaUVJSUFjZ0J5Z0NHQ0FDY1VGL2MwRUNkR29vQWdBaEJ3SkFBMEFnQndSQUlBZ2dCMEVCYTBFRGRDSUxhaUlIS0FJRUlBSkdEUUlnQnlnQ0FFSC8vLzhmY1NFSERBRUxDMEg0Z3dGQnJ2d0FRZGpHQUVIUEhCQUFBQXNnQ1NnQ0ZDQUxhaUVJSUFvZ0J6WUNEQ0FIS0FJQUlRc0xJQXRCR25ZaUR5QUdFSk1EUlEwR0lBOUJNSEVpRDBFd1JnUkFJQUFnQ1NBQ0lBZ2dCeERJQWtVTkFnd0lDeUFHUVlEMEFIRkZEUVVnRGdSQUlBU25JZzFCQUNBQUlBUVFPQnNoQWlBRnB5SU9RUUFnQUNBRkVEZ2JJUXdDUUNBTFFZQ0FnSUI4Y1VHQWdJQ0FCRWNFUUVGL0lRY2dBQ0FKSUFwQkRHb1ExQUVOQ3dKQUlBb29BZ3dvQWdCQmdJQ0FnSHh4UVlDQWdJQjRSZ1JBSUFBb0FoQWdDQ2dDQUJEckFRd0JDeUFBSUFncEF3QVFEd3NnQ2lnQ0RDSUhJQWNvQWdCQi8vLy92d0Z4UVlDQWdJQUVjallDQUNBSVFnQTNBd0FNQVFzZ0MwR0FnSUFnY1EwQUlBWkJnQkJ4QkVBZ0FpQUlLQUlBUncwSkN5QUdRWUFnY1VVTkFDQU1JQWdvQWdSSERRZ0xJQVpCZ0JCeEJFQWdDQ2dDQUNJSEJFQWdBQ0FIclVLQWdJQ0FjSVFRRHdzZ0FrVWdCRUlnaUtkQmRVbHlSUVJBSUEwZ0RTZ0NBRUVCYWpZQ0FBc2dDQ0FDTmdJQUN5QUdRWUFnY1VVTkJpQUlLQUlFSWdJRVFDQUFJQUt0UW9DQWdJQndoQkFQQ3lBTVJTQUZRaUNJcDBGMVNYSkZCRUFnRGlBT0tBSUFRUUZxTmdJQUN5QUlJQXcyQWdRTUJnc2dEMEVnUmcwRUlBOUJFRVlFUUVGL0lRY2dBQ0FKSUFwQkRHb1ExQUVOQ1NBSUtBSUFJZ0lFUUNBQUlBS3RRb0NBZ0lCd2hCQVBDeUFJS0FJRUlnSUVRQ0FBSUFLdFFvQ0FnSUJ3aEJBUEN5QUtLQUlNSWdJZ0FpZ0NBRUgvLy8rL0EzRTJBZ0FnQ0VLQWdJQ0FNRGNEQUNBS0tBSU1LQUlBSVFzTUJRc2dERVVnQzBHQWdJRGdBSEZ5RFFSQkFTRUhJQUFnQXlBSUtRTUFFRkpGRFFZTUNBc2dDa0VBTmdJTUlBa3RBQVZCQ0hGRkRRSWdDUzhCQmlJSFFRSkhEUUVnQWtFQVRnMENJQTBnQ1NnQ0tFOE5BaUFTUlFSQUlBQWdDUkNTQTBVTkFRd0hDd3RCQVNFSElBeEZEUVlnQ1NnQ0pDQU5RUU4wYWlFQ0lBTkNJSWluUVhWUEJFQWdBNmNpQmlBR0tBSUFRUUZxTmdJQUN5QUFJQUlnQXhBZ0RBWUxJQWRCRld0Qi8vOERjVUVLU3cwQUFrQUNRQ0FDUVFCT0JFQWdBQ0FDRU0wRklnRkNnSUNBZ0hDREloTkNnSUNBZ0RCUkRRTkJmeUVISUJOQ2dJQ0FnT0FBVVEwSUlBQWdBUkRNQlNJQ1FRQklCRUFnQUNBQkVBOE1DUXNnQWtVRVFDQUFJQUVRRHlBQUlBWkJ2aDRRYnlFSERBa0xRUUFoQndKQUFrQUNRQUpBQWtCQkJ5QUJRaUNJcHlJQ0lBSkJCMnRCYmtrYklnSkJDMm9PQXdNQkFnQUxJQUpCQjBjRVFDQUNEUVFnQVVLQWdJQ0FDSU5DSDRpbklRY01CQXNnQVVLQWdJQ0F3SUdBL1A4QWZFSS9pS2NoQnd3REN5QUJweUlDS0FJSVJRMENJQUlvQWd4QmdJQ0FnSGhISVFjTUFnc2dBYWNvQWdnaEJ3d0JDeUFCcHlnQ0NDRUhDeUFBSUFFUUR5QUhSUTBCSUFBZ0JrSGZIaEJ2SVFjTUNBc2dEU0FKS0FJZ0tBSVVJQWRCNWFZQmFpMEFBSFpKRFFFTElBQWdCa0g5SGhCdklRY01CZ3NnRGtVZ0VVRUhSbkZGQkVBZ0FDQUdRYmM0RUc4aEJ3d0dDMEVCSVFjZ0RFVU5CU0FEUWlDSXAwRjFUd1JBSUFPbklnSWdBaWdDQUVFQmFqWUNBQXNnQUNBQklBMnRJQU1nQmhEWEFTRUhEQVVMSUFBZ0NTQUNJQU1nQkNBRklBWVFnUVFoQnd3RUN5QUxRWUNBZ0lCOGNVR0FnSUNBZUVZRVFDQU1CRUFnQ1M4QkJrRUxSZ1JBSUFBZ0F5QUlLQUlBS0FJUUtRTUFFRkpGRFFRTElBZ29BZ0FvQWhBaEFpQURRaUNJcDBGMVR3UkFJQU9uSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dBQ0FDSUFNUUlBc2dCa0dDQkhGQmdBUkhEUUZCZnlFSElBQWdDU0FLUVF4cUVOUUJEUVFnQ0NnQ0FDSUhLQUlRS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQWlBQ0tBSUFRUUZxTmdJQUlBZ29BZ0FoQndzZ0FDZ0NFQ0FIRU9zQklBZ2dBVGNEQUNBS0tBSU1JZ0lnQWlnQ0FFSC8vLysvQTNFMkFnQU1BUXNnQzBHQWdJQ0FBbkVFUUVFQklRSWdEQVJBSUFOQ0lJaW5RWFZQQkVBZ0E2Y2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQUlBa2dBeUFHRU1zRklRSUxJQVpCZ2dSeFFZQUVSZ1JBSUFvZ0NTZ0NFQ0lHUVRCcU5nSU1RWDhoQnlBQUlBa2dDa0VNYWlBR0tBSXdRUnAyUVQxeEVKRUREUVVMSUFJaEJ3d0VDeUFNQkVBZ0FDQUlLUU1BRUE4Z0EwSWdpS2RCZFU4RVFDQURweUlDSUFJb0FnQkJBV28yQWdBTElBZ2dBemNEQUFzZ0JrR0FCSEZGRFFCQmZ5RUhJQUFnQ1NBS1FReHFJQW9vQWd3b0FnQkJHblpCUFhFZ0JrRUNjWElRa1FNTkF3dEJmMEVCSUFBZ0NTQUtRUXhxSUJCQkJYRWlBRUYvY3lBS0tBSU1LQUlBUVJwMmNTQUFJQVp4Y2hDUkF4c2hCd3dDQ3lBQUlBWkI0ZWtBRUc4aEJ3d0JDMEYvSVFjTElBcEJFR29rQUNBSEMvOEJBZ0ovQVh3akFFRVFheUlFSkFBQ1FDQUNRaUNJcHlJRFFRSk5CRUFnQVNBQ3A3YzVBd0JCQUNFQURBRUxJQU5CQjJ0QmJVMEVRQ0FCSUFKQ2dJQ0FnTUNCZ1B6L0FIdzNBd0JCQUNFQURBRUxBbjhnQUNBQ0VJMEJJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRVFBQUFBQUFBRDRmeUVGUVg4TUFRc0NmQUpBQWtCQkJ5QUNRaUNJcHlJRElBTkJCMnRCYmtrYklnTkJDbXBCQWs4RVFDQURRUWRHRFFJZ0F3MEJJQUtudHd3REN5QUNwMEVFYWlBRVFRaHFFTFVGSUFBZ0FoQVBJQVFyQXdnaEJVRUFEQU1MRUFFQUN5QUNRb0NBZ0lEQWdZRDgvd0I4dndzaEJVRUFDeUVBSUFFZ0JUa0RBQXNnQkVFUWFpUUFJQUFMWFFFQ2Z5TUFRUkJySWdNa0FBSkFJQUZCZ0lBQmNVVUVRQ0FCUVlDQUFuRkZEUUVnQUNnQ0VDZ0NqQUVpQVVVTkFTQUJMUUFvUVFGeFJRMEJDeUFEUVFBMkFnd2dBRUVFSUFKQkFCQ1NCRUYvSVFRTElBTkJFR29rQUNBRUM4WUpBZ1IvQlg0akFFSHdBR3NpQmlRQUlBUkMvLy8vLy8vLy8vLy9BSU1oQ1FKQUFrQWdBVkFpQlNBQ1F2Ly8vLy8vLy8vLy93Q0RJZ3BDZ0lDQWdJQ0F3UC8vQUgxQ2dJQ0FnSUNBd0lDQWYxUWdDbEFiUlFSQUlBTkNBRklnQ1VLQWdJQ0FnSURBLy84QWZTSUxRb0NBZ0lDQWdNQ0FnSDlXSUF0Q2dJQ0FnSUNBd0lDQWYxRWJEUUVMSUFVZ0NrS0FnSUNBZ0lEQS8vOEFWQ0FLUW9DQWdJQ0FnTUQvL3dCUkcwVUVRQ0FDUW9DQWdJQ0FnQ0NFSVFRZ0FTRUREQUlMSUFOUUlBbENnSUNBZ0lDQXdQLy9BRlFnQ1VLQWdJQ0FnSURBLy84QVVSdEZCRUFnQkVLQWdJQ0FnSUFnaENFRURBSUxJQUVnQ2tLQWdJQ0FnSURBLy84QWhZUlFCRUJDZ0lDQWdJQ0E0UC8vQUNBQ0lBRWdBNFVnQWlBRWhVS0FnSUNBZ0lDQWdJQi9oWVJRSWdVYklRUkNBQ0FCSUFVYklRTU1BZ3NnQXlBSlFvQ0FnSUNBZ01ELy93Q0ZoRkFOQVNBQklBcUVVQVJBSUFNZ0NZUkNBRklOQWlBQklBT0RJUU1nQWlBRWd5RUVEQUlMSUFNZ0NZUlFSUTBBSUFFaEF5QUNJUVFNQVFzZ0F5QUJJQUVnQTFRZ0NTQUtWaUFKSUFwUkd5SUlHeUVLSUFRZ0FpQUlHeUlMUXYvLy8vLy8veitESVFrZ0FpQUVJQWdiSWdKQ01JaW5RZi8vQVhFaEJ5QUxRakNJcDBILy93RnhJZ1ZGQkVBZ0JrSGdBR29nQ2lBSklBb2dDU0FKVUNJRkcza2dCVUVHZEsxOHB5SUZRUTlyRUdjZ0Jpa0RhQ0VKSUFZcEEyQWhDa0VRSUFWcklRVUxJQUVnQXlBSUd5RURJQUpDLy8vLy8vLy9QNE1oQkNBSFJRUkFJQVpCMEFCcUlBTWdCQ0FESUFRZ0JGQWlCeHQ1SUFkQkJuU3RmS2NpQjBFUGF4Qm5RUkFnQjJzaEJ5QUdLUU5ZSVFRZ0Jpa0RVQ0VEQ3lBRVFnT0dJQU5DUFlpRVFvQ0FnSUNBZ0lBRWhDRUJJQWxDQTRZZ0NrSTlpSVFoQkNBQ0lBdUZJUTBDZmlBRFFnT0dJZ0lnQlNBSFJnMEFHaUFGSUFkcklnZEIvd0JMQkVCQ0FDRUJRZ0VNQVFzZ0JrRkFheUFDSUFGQmdBRWdCMnNRWnlBR1FUQnFJQUlnQVNBSEVJNENJQVlwQXpnaEFTQUdLUU13SUFZcEEwQWdCaWtEU0lSQ0FGS3RoQXNoQ1NBRVFvQ0FnSUNBZ0lBRWhDRU1JQXBDQTRZaENnSkFJQTFDQUZNRVFFSUFJUU5DQUNFRUlBa2dDb1VnQVNBTWhZUlFEUUlnQ2lBSmZTRUNJQXdnQVgwZ0NTQUtWcTE5SWdSQy8vLy8vLy8vL3dOV0RRRWdCa0VnYWlBQ0lBUWdBaUFFSUFSUUlnY2JlU0FIUVFaMHJYeW5RUXhySWdjUVp5QUZJQWRySVFVZ0Jpa0RLQ0VFSUFZcEF5QWhBZ3dCQ3lBSklBcDhJZ0lnQ1ZTdElBRWdESHg4SWdSQ2dJQ0FnSUNBZ0FpRFVBMEFJQWxDQVlNZ0JFSS9oaUFDUWdHSWhJUWhBaUFGUVFGcUlRVWdCRUlCaUNFRUN5QUxRb0NBZ0lDQWdJQ0FnSCtESVFFZ0JVSC8vd0ZPQkVBZ0FVS0FnSUNBZ0lEQS8vOEFoQ0VFUWdBaEF3d0JDMEVBSVFjQ1FDQUZRUUJLQkVBZ0JTRUhEQUVMSUFaQkVHb2dBaUFFSUFWQi93QnFFR2NnQmlBQ0lBUkJBU0FGYXhDT0FpQUdLUU1BSUFZcEF4QWdCaWtER0lSQ0FGS3RoQ0VDSUFZcEF3Z2hCQXNnQXFkQkIzRWlCVUVFUzYwZ0JFSTloaUFDUWdPSWhDSUNmQ0lESUFKVXJTQUVRZ09JUXYvLy8vLy8veitESUFldFFqQ0doQ0FCaEh3aEJBSkFJQVZCQkVZRVFDQUVJQU5DQVlNaUFTQURmQ0lESUFGVXJYd2hCQXdCQ3lBRlJRMEJDd3NnQUNBRE53TUFJQUFnQkRjRENDQUdRZkFBYWlRQUM5MEJBUUovQWtBZ0FVS0FnSUNBY0ZvRVFDQUJweUVEQTBBQ1FDQURMUUFGUVFSeFJRMEFJQUFvQWhBb0FrUWdBeThCQmtFWWJHb29BaFFpQkVVTkFDQUVLQUlRSWdSRkRRQWdBeUFES0FJQVFRRnFOZ0lBSUFBZ0E2MUNnSUNBZ0hDRUlnRWdBaUFFRVJVQUlRSWdBQ0FCRUE4Z0FnOExJQU1nQXlnQ0FFRUJhallDQUNBQVFRQWdBeUFDRUV3aEJDQUFJQU90UW9DQWdJQndoQkFQSUFRTkFnSkFJQU12QVFaQkZXdEIvLzhEY1VFS1N3MEFJQUFnQWhDZUF5SUVSUTBBSUFSQkgzVVBDeUFES0FJUUtBSXNJZ01OQUFzTFFRQWhCQXNnQkF0TkFRSi9BbjhnQUNnQ0JDSURJQUpxSWdRZ0FDZ0NDRXNFZjBGL0lBQWdCQkRHQVEwQkdpQUFLQUlFQlNBREN5QUFLQUlBYWlBQklBSVFIeG9nQUNBQUtBSUVJQUpxTmdJRVFRQUxHZ3RFQVFGL0lBSkMvLy8vL3dkWUJFQWdBQ0FCSUFJUVRROExJQUFnQWhENEFpSURSUVJBUW9DQWdJRGdBQThMSUFBZ0FTQURJQUZCQUJBVUlRRWdBQ0FERUJNZ0FRdGpBUUYvSUFKQ0lJaW5RWFZQQkVBZ0FxY2lCaUFHS0FJQVFRRnFOZ0lBQ3dKQUlBQWdBU0FDRUpBRklnQU5BQ0FCS1FNQUlnSkNBRk1FUUNBQklBSWdCWHdpQWpjREFBc2dBaUFEV1FSQUlBUWlBeUFDV1EwQkN5QUJJQU0zQXdBTElBQUxYd0VEZnlNQVFTQnJJZ1VrQUNBQUtBSUFJUVlnQlVJQU53SVlJQVZDZ0lDQWdJQ0FnSUNBZnpjQ0VDQUZJQVkyQWd3Z0JVRU1haUlISUFJUXVnSWhCaUFBSUFFZ0J5QURJQVFReXdFaEFDQUhFQnNnQlVFZ2FpUUFJQUFnQm5JTEZnQWdBQ0FBS0FJb0lBRkJBM1JxS1FNQUlBRVFTUXNwQVFGL0lBSkNJSWluUVhWUEJFQWdBcWNpQXlBREtBSUFRUUZxTmdJQUN5QUFJQUVnQWhDWUFRdHdBUUYvSUFRZ0F5Z0NBRW9FZnlNQVFSQnJJZ1VrQUNBQUlBRW9BZ0FnQkNBREtBSUFRUU5zUVFKdElnQWdBQ0FFU0JzaUFDQUNiQ0FGUVF4cUVLZ0JJZ1FFZnlBRElBVW9BZ3dnQW00Z0FHbzJBZ0FnQVNBRU5nSUFRUUFGUVg4TElRQWdCVUVRYWlRQUlBQUZRUUFMQzM0Q0FuOEJmaU1BUVJCcklnTWtBQ0FBQW40Z0FVVUVRRUlBREFFTElBTWdBU0FCUVI5MUlnSnpJQUpySWdLdFFnQWdBbWNpQWtIUkFHb1FaeUFES1FNSVFvQ0FnSUNBZ01BQWhVR2VnQUVnQW11dFFqQ0dmQ0FCUVlDQWdJQjRjYTFDSUlhRUlRUWdBeWtEQUFzM0F3QWdBQ0FFTndNSUlBTkJFR29rQUF2ZEF3RUpmeUFCUVJCcUlRY0NRQUpBQW44Q1FBSkFJQUVvQWhBaUJDMEFFQVJBSUFBb0FoQWlDQ2dDMUFFZ0JDZ0NGQ0FDYWtHQmdOenhlV3dnQTJwQmdZRGM4WGxzSWd0QklDQUlLQUxJQVd0MlFRSjBhaUVHQWtBRFFDQUdLQUlBSWdWRkRRRUNRQUpBSUFVb0FoUWdDMGNOQUNBRktBSXNJQVFvQWl4SERRQkJBQ0VHSUFVb0FpQWdCQ2dDSUNJS1FRRnFSdzBBQTBBZ0JpQUtSd1JBSUFVZ0JrRURkQ0lKYWlJTUtBSTBJQVFnQ1dvaUNTZ0NORWNOQWlBR1FRRnFJUVlnQ1NnQ01DQU1LQUl3YzBHQWdJQWdTUTBCREFJTEN5QUZJQXBCQTNScUlnWW9BalFnQWtjTkFDQUdLQUl3UVJwMklBTkdEUUVMSUFWQktHb2hCZ3dCQ3dzZ0JTZ0NIQ0lDSUFRb0FoeEhCRUFnQUNBQktBSVVJQUpCQTNRUWlRSWlBa1VOQnlBQklBSTJBaFFnQUNnQ0VDRUlDeUFGSUFVb0FnQkJBV28yQWdBZ0J5QUZOZ0lBSUFnZ0JCQ1JBZ3dEQ3lBRUtBSUFRUUZHRFFFZ0FDQUVFTTRGSWdSRkRRVWdCRUVCT2dBUUlBQW9BaEFnQkJDVUF5QUFLQUlRSUFjb0FnQVFrUUlnQnlBRU5nSUFDeUFFS0FJQVFRRkhEUU1MUVFBZ0FDQUhJQUVnQWlBREVNTUVEUUVhSUFjb0FnQWhCUXNnQVNnQ0ZDQUZLQUlnUVFOMGFrRUlhd3NQQzBIOGpBRkJydndBUWN3K1FkY2FFQUFBQzBFQUM1RUJBZ04vQVg0Z0FDQUFLQUxzQVNJQlFRRnJOZ0xzQVNBQlFRRk1CSDlCQUNFQklBQkJrTTRBTmdMc0FRSkFJQUFvQWhBaUFpZ0NrQUVpQTBVTkFDQUNJQUlvQXBRQklBTVJBd0JGRFFBZ0FFRy85Z0JCQUJCR1FYOGhBU0FBS0FJUUtRT0FBU0lFUW9DQWdJQndWQTBBSUFTbklnQXZBUVpCQTBjTkFDQUFJQUF0QUFWQklISTZBQVVMSUFFRlFRQUxDeXdCQVg4Z0FDZ0NFQ0lCTFFDSUFVVUVRQ0FCUVFFNkFJZ0JJQUJCL2h4QkFCQkdJQUZCQURvQWlBRUxDNW9IQVFkL0l3QkI0QUJySWdRa0FDQUVJQUUyQWx3Q1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBMEFnQkNBQ1FRRnJJZ0ZCRkd4cUlRVURRQUpBSUFRZ0JDZ0NYQ0lEUVFScU5nSmNBa0FDUUFKQUFrQUNRQ0FES0FJQUlnY09DQUFCQWdNREF3UUlCUXNnQWtFRVRnMFFJQVFnQTBFSWFqWUNYQ0FES0FJRUlRVWdBQ2dDRUNFRElBUWdBa0VVYkdvaUFTQUFLQUlNTmdJTUlBRkJBRFlDQ0NBQlFnQTNBZ0FnQVNBRFFkY0FJQU1iTmdJUUlBSkJBV29oQWlBQklBVVFvUVpGRFFZTUNRc2dBa0VFVGcwT0lBUWdBMEVJYWpZQ1hDQURLQUlFSVFVZ0FDZ0NFQ0VESUFRZ0FrRVViR29pQVNBQUtBSU1OZ0lNSUFGQkFEWUNDQ0FCUWdBM0FnQWdBU0FEUWRjQUlBTWJOZ0lRSUFKQkFXb2hBaUFCSUFVUXBnWkZEUVVNQ0FzZ0FrRUVUZzBNSUFRZ0EwRUlhallDWENBREtBSUVJUVVnQUNnQ0VDRURJQVFnQWtFVWJHb2lBU0FBS0FJTU5nSU1JQUZCQURZQ0NDQUJRZ0EzQWdBZ0FTQURRZGNBSUFNYk5nSVFJQUpCQVdvaEFpQUJJQVVRclFORkRRUU1Cd3NnQWtFQlRBMEtJQUpCQkU4TkNTQUFLQUlNSVFZZ0JDQUNRUlJzYWlJRElBQW9BaEFpQ0VIWEFDQUlHellDRUNBRElBWTJBZ3dnQTBFQU5nSUlJQU5DQURjQ0FDQURJQU5CS0dzaUJpZ0NDQ0FHS0FJQUlBVW9BZ2dnQlNnQ0FDQUhRUU5yRU5zQ0RRVWdCQ0FDUVFKclFSUnNhaUlDS0FJTUlBWW9BZ2hCQUNBQ0tBSVFFUUVBR2lBRktBSU1JQVVvQWdoQkFDQUZLQUlRRVFFQUdpQUdJQU1vQWhBMkFoQWdCaUFES1FJSU53SUlJQVlnQXlrQ0FEY0NBQ0FCSVFJTUF3c2dBa0VBVEEwSElBVVEyZ0pGRFFFTUJRc0xDeEFCQUFzZ0FrRUJSdzBDQW44Z0FDQUVLQUlBSWdFUTJRSUVRQ0FFS0FJSUlRSkJmd3dCQ3lBQUtBSUlJQVFvQWdnaUFpQUJRUUowRUI4YUlBQWdBVFlDQUVFQUN5RUJJQVFvQWd3Z0FrRUFJQVFvQWhBUkFRQWFEQWtMSUFKQkFXb2hBZ3NnQWtFQUlBSkJBRW9iSVFKQkFDRUJBMEFnQVNBQ1JnUkFRWDhoQVF3SkJTQUVJQUZCRkd4cUlnQW9BZ3dnQUNnQ0NFRUFJQUFvQWhBUkFRQWFJQUZCQVdvaEFRd0JDd0FMQUF0Qm5JMEJRZVQ4QUVHbUNrR0ROaEFBQUF0QjFJd0JRZVQ4QUVHYkNrR0ROaEFBQUF0Qjk0QUJRZVQ4QUVHTUNrR0ROaEFBQUF0QjQ0c0JRZVQ4QUVHTENrR0ROaEFBQUF0Qjk0QUJRZVQ4QUVHQUNrR0ROaEFBQUF0Qjk0QUJRZVQ4QUVINUNVR0ROaEFBQUF0Qjk0QUJRZVQ4QUVIeUNVR0ROaEFBQUFzZ0JFSGdBR29rQUNBQkMya0JBbjhDZnlBQUtBSUFJZ05CQW1vaUJDQUFLQUlFU2dSQVFYOGdBQ0FFRU5rQ0RRRWFJQUFvQWdBaEF3c2dBQ0FEUVFGcU5nSUFJQUFvQWdnaUJDQURRUUowYWlBQk5nSUFJQUFnQUNnQ0FDSUFRUUZxTmdJQUlBUWdBRUVDZEdvZ0FqWUNBRUVBQ3d0MkFRRi9JQUFvQWhRRVFDQUFLQUlBSUFFUUQwRi9Ed3NDUUNBQlFvQ0FnSUJ3ZzBLQWdJQ0FrSDlSRFFBZ0FDZ0NBQ0FCRURjaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQUlBQVFnd05CZnc4TElBQWdBYWNpQWtFQUlBSW9BZ1JCLy8vLy93ZHhFRkVoQWlBQUtBSUFJQUVRRHlBQ0M3VUNBUWQvSXdCQkVHc2lCU1FBQWtBZ0FFRkFheWdDQUNJQlJRUkFEQUVMQWtBZ0FRSi9JQUVvQXNnQklnUWdBU2dDeEFFaUFrZ0VRQ0FCS0FMTUFTRURJQVFNQVFzZ0JFRUJhaUlESUFKQkEyeEJBbTBpQWlBQ0lBTklHeUlHUVFOMElRSWdBQ2dDQUNFREFrQWdBU2dDekFFaUJ5QUJRZEFCYWtZRVFDQURRUUFnQWlBRlFReHFFS2dCSWdORkRRTWdBeUFCS0FMTUFTQUJLQUxJQVVFRGRCQWZHZ3dCQ3lBRElBY2dBaUFGUVF4cUVLZ0JJZ05GRFFJTElBVW9BZ3doQWlBQklBTTJBc3dCSUFFZ0FrRURkaUFHYWpZQ3hBRWdBU2dDeUFFTFFRRnFOZ0xJQVNBRElBUkJBM1JxSWdJZ0FTZ0N2QUUyQWdBZ0FpQUJLQUxBQVRZQ0JDQUFRYlFCRUJBZ0FFRkFheWdDQUNBRVFmLy9BM0VRRnlBQklBUTJBcndCREFFTFFYOGhCQXNnQlVFUWFpUUFJQVFMb1FFQ0EzOEJmaU1BSVFZQ1FDQUNRb0NBZ0lCd1ZBMEFJQUtuSWdVdkFRWkJNRWNOQUNBRktBSWdJUVFMQW44Z0JpQUFLQUlRS0FKNFNRUkFJQUFRNlFGQkFBd0JDeUFFTFFBUkJFQWdBQkMyQWtFQURBRUxRUUFnQUNBRUtRTUlJZ0lnQXlBQ1FRQVFGQ0lIUW9DQWdJQndneUlDUW9DQWdJRGdBRkVOQUJvZ0FVS0FnSUNBTUNBSElBSkNnSUNBZ0NCUkd6Y0RBQ0FFQ3lFRklBWWtBQ0FGQ3hZQUlBQWdBU0FDSUFNZ0JDQUZJQUFwQXpBUThRRUxLUUVCZnlNQVFSQnJJZ0lrQUNBQ0lBQTJBZ3dnQWtFTWFpQUJFSk1FSVFBZ0FrRVFhaVFBSUFBTG5nSUNBMzhCZmlBQ0lBRXBBZ1FpQjZkQi8vLy8vd2R4SUFOSGNrVUVRQ0FCSUFFb0FnQkJBV28yQWdBZ0FhMUNnSUNBZ0pCL2hBOExJQUZCRUdvaEJTQUhRb0NBZ0lBSWcxQWdBeUFDYXlJRVFRQk1ja1VFUUNBRElBSWdBaUFEU0JzaEJrRUFJUU1nQWlFQkEwQWdBU0FHUmtVRVFDQUZJQUZCQVhScUx3RUFJQU55SVFNZ0FVRUJhaUVCREFFTEN5QURRZi8vQTNGQmdBSlBCRUFnQUNBRklBSkJBWFJxSUFRUTdnTVBDMEVBSVFFZ0FDQUVRUUFRNmdFaUFFVUVRRUtBZ0lDQTRBQVBDeUFBUVJCcUlRTURRQ0FCSUFSR1JRUkFJQUVnQTJvZ0JTQUJJQUpxUVFGMGFpMEFBRG9BQUNBQlFRRnFJUUVNQVFzTElBTWdCR3BCQURvQUFDQUFyVUtBZ0lDQWtIK0VEd3NnQUNBQ0lBVnFJQVFRaEFNTHVnRUJBbjhDUUFKQUlBSkMvLy8vL3dkWUJFQWdBQ0FCSUFLblFZQ0FnSUI0Y2hCeElnUkJBRXdOQVNBQUlBRWdBaEJOSWdKQ2dJQ0FnSENEUW9DQWdJRGdBRklOQWtGL0lRUU1BZ3NnQUNBQ0VQZ0NJZ1ZGQkVCQmZ5RUVEQUVMQWtBZ0FDQUJJQVVRY1NJRVFRQk1CRUJDZ0lDQWdEQWhBZ3dCQ3lBQUlBRWdCU0FCUVFBUUZDSUNRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRQkJmeUVFQ3lBQUlBVVFFd3dCQzBLQWdJQ0FNQ0VDQ3lBRElBSTNBd0FnQkF0S0FRSi9JQUpDLy8vLy93ZFlCRUFnQUNBQklBSWdBMEdBZ0FFUTF3RVBDeUFBSUFJUStBSWlCRVVFUUNBQUlBTVFEMEYvRHdzZ0FDQUJJQVFnQXhCRklRVWdBQ0FFRUJNZ0JRdUlBUUVCZjBGL0lRSWdBQ2dDRkFSL1FYOEZJQUZDZ0lDQWdIQ0RRb0NBZ0lDUWYxSUVRQ0FBS0FJQUlBRVFLQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUJDREEwRi9Ed3NnQUNBQnB5SUNRUUFnQWlnQ0JFSC8vLy8vQjNFUVVTRUNJQUFvQWdBZ0FSQVBJQUlQQ3lBQUlBR25JZ0JCQUNBQUtBSUVRZi8vLy84SGNSQlJDd3NOQUNBQUlBRWdBUkEvRUlnQ0N4c0FJQUJCQUJCQkdpQUFJQUUyQWdRZ0FFR0FnSUNBZURZQ0NBc1pBQ0FBSUFBb0FoQWlBQ2tEZ0FFUUR5QUFJQUUzQTRBQkM0UUNBUUYvQWtBZ0FDZ0NDQ0lDSUFBb0FneE9EUUFnQUNnQ0VBUkFJQUFnQWtFQmFqWUNDQ0FBS0FJRUlBSkJBWFJxSUFFN0FSQkJBQThMSUFGQi93RkxEUUFnQUNBQ1FRRnFOZ0lJSUFBb0FnUWdBbW9nQVRvQUVFRUFEd3NDZnlBQUtBSUlJZ0lnQUNnQ0RFNEVRRUYvSUFBZ0FrRUJhaUFCRUxjQ0RRRWFDd0pBSUFBb0FoQUVRQ0FBSUFBb0FnZ2lBa0VCYWpZQ0NDQUFLQUlFSUFKQkFYUnFJQUU3QVJBTUFRc2dBVUgvQVUwRVFDQUFJQUFvQWdnaUFrRUJhallDQ0NBQ0lBQW9BZ1JxSUFFNkFCQU1BUXRCZnlBQUlBQW9BZ3dROVFNTkFSb2dBQ0FBS0FJSUlnSkJBV28yQWdnZ0FDZ0NCQ0FDUVFGMGFpQUJPd0VRQzBFQUN3c2JBQ0FBUVFBUVFSb2dBQ0FCTmdJRUlBQkIvdi8vL3djMkFnZ0xDd0FnQUNBQlFRQVF3UVVMMmdvQ0VuOEJmaU1BUVRCcklnZ2tBQ0FCUVFBMkFnQWdBa0VBTmdJQUlBaEJBRFlDTENBSVFRQTJBaWdnQkVFd2NTRU5JQVJCRUhFaEVDQURLQUlRSWc1Qk1Hb2hCZ0pBQWtBQ1FBSkFBMEFnRGlnQ0lDQUpTZ1JBQWtBZ0JpZ0NCQ0lGUlEwQVFRQWdFQ0FHS0FJQVFZQ0FnSUFCY1JzZ0JDQUFJQVVRakFNaUIzWkJBWEZGY2cwQUFrQWdEVVVnQmlnQ0FFR0FnSUNBZkhGQmdJQ0FnSGhIY2cwQUlBTW9BaFFnQ1VFRGRHb29BZ0FvQWhBMUFnUkNJSVpDZ0lDQWdNQUFVZzBBSUFBZ0JpZ0NCQkRaQVVGL0lRa01CQXNnQUNBSVFTUnFJQVVRckFFRVFDQUxRUUZxSVFzTUFRc2dCMFVFUUNBTVFRRnFJUXdNQVFzZ0NrRUJhaUVLQ3lBR1FRaHFJUVlnQ1VFQmFpRUpEQUVMQzBFQUlRWUNRQ0FETFFBRklnVkJCSEZGRFFBZ0JVRUljUVJBSUFSQkFYRkZEUUVnQXlnQ0tDQUxhaUVMREFFTElBTXZBUVlpQlVFRlJnUkFJQVJCQVhGRkRRRkJBQ0VKSUFNcEF5QWlGMEtBZ0lDQWNJTkNnSUNBZ0pCL1VRUi9JQmVuS0FJRVFmLy8vLzhIY1FWQkFBc2dDMm9oQ3d3QkN5QUFLQUlRS0FKRUlBVkJHR3hxS0FJVUlnVkZEUUFnQlNnQ0JDSUZSUTBBUVg4aENTQUFJQWhCTEdvZ0NFRW9haUFEclVLQWdJQ0FjSVFnQlJFYkFBMEJRUUFoQlFOQUlBVWdDQ2dDS0U4TkFRSkFJQVFnQUNBRlFRTjBJZzRnQ0NnQ0xHb29BZ1FpQnhDTUEzWkJBWEVFUUFKQUlBMUZCRUJCQUNFSERBRUxJQUFnQ0NBRElBY1FUQ0lIUVFCSURRSWdCd1IvSUFnb0FnQWhCeUFBSUFnUVNDQUhRUUoyUVFGeEJVRUFDeUVISUFnb0Fpd2dEbW9nQnpZQ0FBc2dCaUFRUlNBSGNtb2hCZ3NnQlVFQmFpRUZEQUVMQ3lBQUlBZ29BaXdnQ0NnQ0tCQmFEQUVMSUFCQkFTQUxJQXhxSWhNZ0Ntb2dCbW9pRVNBUlFRRk1HMEVEZEJBcElnOUZCRUFnQUNBSUtBSXNJQWdvQWlnUVdrRi9JUWtNQVFzZ0F5Z0NFQ0lWUVRCcUlRWkJBQ0VGSUFzaERDQVRJUWRCQVNFVVFRQWhDUU5BSUFrZ0ZTZ0NJRTVGQkVBQ1FDQUdLQUlFSWhKRkRRQkJBQ0FRSUFZb0FnQkJnSUNBZ0FGeElnb2JJQVFnQUNBU0VJd0RJZzEyUVFGeFJYSU5BQ0FLUVJ4MklSWUNmeUFBSUFoQkpHb2dFaENzQVFSQUlBVkJBV29oQ2tFQUlSUWdCeUVPSUF3TUFRc2dEVVVFUUNBRklRb2dCeUVPSUF3aUJVRUJhZ3dCQ3lBSFFRRnFJUTRnQlNFS0lBY2hCU0FNQ3lFTklBQWdFaEFZSVFjZ0R5QUZRUU4wYWlJRklCWTJBZ0FnQlNBSE5nSUVJQW9oQlNBTklRd2dEaUVIQ3lBR1FRaHFJUVlnQ1VFQmFpRUpEQUVMQ3dKQUlBTXRBQVVpQ2tFRWNVVU5BQUovSUFwQkNIRUVRQ0FFUVFGeFJRMENJQU1vQWlnTUFRc2dBeThCQmtFRlJ3UkFRUUFoQmdOQUlBZ29BaXdoQXlBR0lBZ29BaWhQUlFSQUFrQkJBQ0FRSUFNZ0JrRURkR29pQ2lnQ0FDSURHeUFFSUFBZ0NpZ0NCQ0lLRUl3RGRrRUJjVVZ5UlFSQUlBOGdCMEVEZEdvaURTQUROZ0lBSUEwZ0NqWUNCQ0FIUVFGcUlRY01BUXNnQUNBS0VCTUxJQVpCQVdvaEJnd0JDd3NnQUNnQ0VDSUVRUkJxSUFNZ0JDZ0NCQkVBQUF3Q0N5QUVRUUZ4UlEwQlFRQWdBeWtESUNJWFFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFBYUlCZW5LQUlFUWYvLy8vOEhjUXNoQ1VFQUlRWWdDVUVBSUFsQkFFb2JJUU1EUUNBRElBWkdEUUVnRHlBRlFRTjBhaUlFUVFFMkFnQWdCQ0FHUVlDQWdJQjRjallDQkNBR1FRRnFJUVlnQlVFQmFpRUZEQUFMQUFzZ0JTQUxSdzBCSUF3Z0UwY05BaUFISUJGSERRTWdDMFVnRkhKRkJFQWdEeUFMUVFoQlB5QUFFTDRDQ3lBQklBODJBZ0FnQWlBUk5nSUFRUUFoQ1FzZ0NFRXdhaVFBSUFrUEMwRzhLRUd1L0FCQnlqdEJ6OVlBRUFBQUMwR1BLRUd1L0FCQnl6dEJ6OVlBRUFBQUMwSHRLRUd1L0FCQnpEdEJ6OVlBRUFBQUN6SUJBWDhqQUVIUUFHc2lBeVFBSUFNZ0FDZ0NFQ0FEUVJCcUlBRVFrQUUyQWdBZ0FDQUNJQU1RRlNBRFFkQUFhaVFBQ3dzQUlBQWdBU0FDRUlZRkN3a0FJQUJCQVJEWkJBczJBUUovUVg4aEF5QUFJQUZCQUJDVEFTSUNCSDhnQWlnQ0lDZ0NEQ2dDSUMwQUJBUkFJQUFRYTBGL0R3c2dBaWdDS0FWQmZ3c0xhUUVEZnlNQVFSQnJJZ01rQUFKQUFrQWdBVUtBZ0lDQWNGUU5BQ0FCcHlJRUx3RUdJUVVnQWdSQUlBVkJJRWNOQVF3Q0N5QUZRUlZyUWYvL0EzRkJDMGtOQVFzZ0EwRzdJa0hTSHlBQ0d6WUNBQ0FBUWZjOElBTVFGVUVBSVFRTElBTkJFR29rQUNBRUN5UUJBWDhqQUVFUWF5SURKQUFnQXlBQ05nSU1JQUFnQVNBQ0VKc0VJQU5CRUdva0FBc1NBQ0FBSUFFZ0FpQURJQVJCeGdBUXBBUUxEUUFnQUVFYVFTUkJHUkQvQlFzT0FDQUFRb0NBZ0lEZ2ZoQ0FCZ3V4QWdJQ2Z3RjhJd0JCRUdzaUJDUUFBbjhDUUFOQUFrQUNRQUpBQW44Q1FBSkFRUWNnQWtJZ2lLY2lBeUFEUVFkclFXNUpHeUlERGdnQUFBQUFCUVVGQVFRTElBS25EQUVMSUFKQ2dJQ0FnTUNCZ1B6L0FId2lBa0kwaUtkQi93OXhJZ0JCblFoTERRRWdBcjhpQlpsRUFBQUFBQUFBNEVGakJFQWdCYW9NQVF0QmdJQ0FnSGdMSVFOQkFBd0ZDMEVBSVFOQkFDQUFRZElJU3cwRUdrRUFJQUpDLy8vLy8vLy8vd2VEUW9DQWdJQ0FnSUFJaENBQVFaTUlhNjJHUWlDSXB5SURheUFESUFKQ0FGTWJJUU5CQUF3RUN5QURRWGRHRFFJTElBQWdBaENOQVNJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFBTFFRQWhBMEYvREFFTElBUkJER29nQXFkQkJHcEJBUkNwQVNBQUlBSVFEeUFFS0FJTUlRTkJBQXNoQUNBQklBTTJBZ0FnQkVFUWFpUUFJQUFMemdFQkEzOGpBRUVRYXlJRUpBQUNRQ0FCUW9DQWdJQndWQVJBREFFTElBR25JZ0l2QVFaQk1FWUVRQUpBSUFBZ0JFRUlhaUFCUWVFQUVJRUJJZ05GRFFBZ0JDa0RDQ0lCUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FBSUFNcEF3QVFtUUVoQWd3REN5QUFJQUVnQXlrRENFRUJJQU1RTHlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUJFQ1loQWlBQUlBTXBBd0FRbVFFaUEwRUFTQTBBSUFJZ0EwWU5BaUFBUVpEcEFFRUFFQlVMUVg4aEFnd0JDeUFDTFFBRlFRRnhJUUlMSUFSQkVHb2tBQ0FDQzRnREFnSitBbjhqQUVFUWF5SUdKQUFDUUNBQlFvQ0FnSUJ3VkFSQUlBRWhBd3dCQ3lBQ1FXOXhJUVVDUUFKQUFrQWdBa0VRY1EwQUlBQWdBVUhRQVNBQlFRQVFGQ0lFUW9DQWdJQndneUlEUW9DQWdJQWdVU0FEUW9DQWdJQXdVWElOQUNBRFFvQ0FnSURnQUZFTkFTQUdJQUJCeGdCQkZpQUZRUUZHRzBISUFDQUZHeEF0TndNSUlBQWdCQ0FCUVFFZ0JrRUlhaEF2SVFNZ0FDQUdLUU1JRUE4Z0EwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBQWdBUkFQSUFOQ2dJQ0FnSEJVRFFNZ0FDQURFQThnQUVHVzRRQkJBQkFWREFJTElBVkJBRWNoQlVFQUlRSURRQ0FDUVFKSEJFQWdBQ0FCUVRkQk9TQUNJQVZHR3lBQlFRQVFGQ0lEUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlDUUNBQUlBTVFPRVVOQUNBQUlBTWdBVUVBUVFBUUx5SURRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdBMEwvLy8vL2IxWU5BQ0FBSUFFUUR3d0ZDeUFBSUFNUUR5QUNRUUZxSVFJTUFRc0xJQUJCbHVFQVFRQVFGUXNnQUNBQkVBOExRb0NBZ0lEZ0FDRURDeUFHUVJCcUpBQWdBd3Z1Q3dFSGZ3SkFJQUJGRFFBZ0FFRUlheUlDSUFCQkJHc29BZ0FpQVVGNGNTSUFhaUVGQWtBZ0FVRUJjUTBBSUFGQkEzRkZEUUVnQWlBQ0tBSUFJZ0ZySWdKQndOQUVLQUlBU1EwQklBQWdBV29oQUVIRTBBUW9BZ0FnQWtjRVFDQUJRZjhCVFFSQUlBRkJBM1loQVNBQ0tBSU1JZ01nQWlnQ0NDSUVSZ1JBUWJEUUJFR3cwQVFvQWdCQmZpQUJkM0UyQWdBTUF3c2dCQ0FETmdJTUlBTWdCRFlDQ0F3Q0N5QUNLQUlZSVFZQ1FDQUNJQUlvQWd3aUFVY0VRQ0FDS0FJSUlnTWdBVFlDRENBQklBTTJBZ2dNQVFzQ1FDQUNRUlJxSWdRb0FnQWlBdzBBSUFKQkVHb2lCQ2dDQUNJRERRQkJBQ0VCREFFTEEwQWdCQ0VISUFNaUFVRVVhaUlFS0FJQUlnTU5BQ0FCUVJCcUlRUWdBU2dDRUNJRERRQUxJQWRCQURZQ0FBc2dCa1VOQVFKQUlBSW9BaHdpQkVFQ2RFSGcwZ1JxSWdNb0FnQWdBa1lFUUNBRElBRTJBZ0FnQVEwQlFiVFFCRUcwMEFRb0FnQkJmaUFFZDNFMkFnQU1Bd3NnQmtFUVFSUWdCaWdDRUNBQ1JodHFJQUUyQWdBZ0FVVU5BZ3NnQVNBR05nSVlJQUlvQWhBaUF3UkFJQUVnQXpZQ0VDQURJQUUyQWhnTElBSW9BaFFpQTBVTkFTQUJJQU0yQWhRZ0F5QUJOZ0lZREFFTElBVW9BZ1FpQVVFRGNVRURSdzBBUWJqUUJDQUFOZ0lBSUFVZ0FVRitjVFlDQkNBQ0lBQkJBWEkyQWdRZ0FDQUNhaUFBTmdJQUR3c2dBaUFGVHcwQUlBVW9BZ1FpQVVFQmNVVU5BQUpBSUFGQkFuRkZCRUJCeU5BRUtBSUFJQVZHQkVCQnlOQUVJQUkyQWdCQnZOQUVRYnpRQkNnQ0FDQUFhaUlBTmdJQUlBSWdBRUVCY2pZQ0JDQUNRY1RRQkNnQ0FFY05BMEc0MEFSQkFEWUNBRUhFMEFSQkFEWUNBQThMUWNUUUJDZ0NBQ0FGUmdSQVFjVFFCQ0FDTmdJQVFialFCRUc0MEFRb0FnQWdBR29pQURZQ0FDQUNJQUJCQVhJMkFnUWdBQ0FDYWlBQU5nSUFEd3NnQVVGNGNTQUFhaUVBQWtBZ0FVSC9BVTBFUUNBQlFRTjJJUUVnQlNnQ0RDSURJQVVvQWdnaUJFWUVRRUd3MEFSQnNOQUVLQUlBUVg0Z0FYZHhOZ0lBREFJTElBUWdBellDRENBRElBUTJBZ2dNQVFzZ0JTZ0NHQ0VHQWtBZ0JTQUZLQUlNSWdGSEJFQkJ3TkFFS0FJQUdpQUZLQUlJSWdNZ0FUWUNEQ0FCSUFNMkFnZ01BUXNDUUNBRlFSUnFJZ1FvQWdBaUF3MEFJQVZCRUdvaUJDZ0NBQ0lERFFCQkFDRUJEQUVMQTBBZ0JDRUhJQU1pQVVFVWFpSUVLQUlBSWdNTkFDQUJRUkJxSVFRZ0FTZ0NFQ0lERFFBTElBZEJBRFlDQUFzZ0JrVU5BQUpBSUFVb0Fod2lCRUVDZEVIZzBnUnFJZ01vQWdBZ0JVWUVRQ0FESUFFMkFnQWdBUTBCUWJUUUJFRzAwQVFvQWdCQmZpQUVkM0UyQWdBTUFnc2dCa0VRUVJRZ0JpZ0NFQ0FGUmh0cUlBRTJBZ0FnQVVVTkFRc2dBU0FHTmdJWUlBVW9BaEFpQXdSQUlBRWdBellDRUNBRElBRTJBaGdMSUFVb0FoUWlBMFVOQUNBQklBTTJBaFFnQXlBQk5nSVlDeUFDSUFCQkFYSTJBZ1FnQUNBQ2FpQUFOZ0lBSUFKQnhOQUVLQUlBUncwQlFialFCQ0FBTmdJQUR3c2dCU0FCUVg1eE5nSUVJQUlnQUVFQmNqWUNCQ0FBSUFKcUlBQTJBZ0FMSUFCQi93Rk5CRUFnQUVGNGNVSFkwQVJxSVFFQ2YwR3cwQVFvQWdBaUEwRUJJQUJCQTNaMElnQnhSUVJBUWJEUUJDQUFJQU55TmdJQUlBRU1BUXNnQVNnQ0NBc2hBQ0FCSUFJMkFnZ2dBQ0FDTmdJTUlBSWdBVFlDRENBQ0lBQTJBZ2dQQzBFZklRUWdBRUgvLy84SFRRUkFJQUJCSmlBQVFRaDJaeUlCYTNaQkFYRWdBVUVCZEd0QlBtb2hCQXNnQWlBRU5nSWNJQUpDQURjQ0VDQUVRUUowUWVEU0JHb2hCd0pBQWtBQ1FFRzAwQVFvQWdBaUEwRUJJQVIwSWdGeFJRUkFRYlRRQkNBQklBTnlOZ0lBSUFjZ0FqWUNBQ0FDSUFjMkFoZ01BUXNnQUVFWklBUkJBWFpyUVFBZ0JFRWZSeHQwSVFRZ0J5Z0NBQ0VCQTBBZ0FTSURLQUlFUVhoeElBQkdEUUlnQkVFZGRpRUJJQVJCQVhRaEJDQURJQUZCQkhGcUlnZEJFR29vQWdBaUFRMEFDeUFISUFJMkFoQWdBaUFETmdJWUN5QUNJQUkyQWd3Z0FpQUNOZ0lJREFFTElBTW9BZ2dpQUNBQ05nSU1JQU1nQWpZQ0NDQUNRUUEyQWhnZ0FpQUROZ0lNSUFJZ0FEWUNDQXRCME5BRVFkRFFCQ2dDQUVFQmF5SUFRWDhnQUJzMkFnQUxDMGNBSUFBZ0FVa0VRQ0FBSUFFZ0FoQWZHZzhMSUFJRVFDQUFJQUpxSVFBZ0FTQUNhaUVCQTBBZ0FFRUJheUlBSUFGQkFXc2lBUzBBQURvQUFDQUNRUUZySWdJTkFBc0xDeDRBSUFCQ2dJQ0FnSENEUW9DQWdJQ1FmMUVFUUNBQXB5QUJFTGNFQ3d1L0JRRUhmeU1BUVpBQ2F5SUdKQUFnQmtFQU9nQVFJQVlnQUNnQ0JEWUNBQ0FHSUFBb0FoUTJBZ1FnQmlBQUtBSVlOZ0lNSUFZZ0FDZ0NNRFlDQ0NBQVFSQnFJUWxCQVNFRUFrQUNRQU5BUVg0aENBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQ1NnQ0FDSURRZjRBYWc0RkFRa0pDUWNBQ3dKQUFrQUNRQUpBQWtBZ0EwRW9hdzRDQVFJQUN3SkFJQU5CTzJzT0F3Y05DUUFMQWtBZ0EwSGJBR3NPQXdFTkF3QUxBa0FnQTBIN0FHc09Bd0VOQkFBTElBTkJwMzlHRFFjZ0EwRXZSZzBKSUFOQnJIOUhEUXdNRUFzZ0JFSC9BVTBOQkF3T0N5QUVRUUZySWdRZ0JrRVFhbW90QUFCQktFY05EUXdKQ3lBRVFRRnJJZ1FnQmtFUWFtb3RBQUJCMndCSERRd01DQXRCL1FBaEJTQUVRUUZySWdRZ0JrRVFhbW90QUFBaUNFSDdBRVlOQ1VHc2Z5RURJQWhCNEFCSERRd2dBQ0FKRVA4QklBQkJBRFlDTUNBQUlBQW9BaFEyQWdRZ0FDQUFLQUk0RU04RERRd0xJQUFvQWloQjRBQkdEUVpCNEFBaEF5QUVRZjhCU3cwS0N5QUdRUkJxSUFScUlBTTZBQUFnQkVFQmFpRUVEQVVMSUFjZ0JFRUNSbkloQjBFN0lRVU1CZ3NnQjBFQ2NpQUhJQVJCQWtZYklRZEJwMzhoQlF3RkN5QUhRUVJ5SVFkQlBTRUZEQVFMUVg4aENBc2dCVUdBQVdvaUEwRVdUVUVBUVFFZ0EzUkJtNENBQTNFYkRRQWdCVUVwUmlBRlFkMEFSbklnQlVIVEFHb2lBMEVIVFVFQVFRRWdBM1JCaHdGeEczSWdCVUg5QUVaeURRQWdBQ0FBS0FJNElBaHFOZ0k0SUFBUTJBUU5CQXNnQ1NnQ0FDRURDeUFEUVlOL1J3UkFJQU1oQlF3QkMwRmJJUVVnQUVIREFCQktEUUFnQUVFdEVFb05BRUdEZnlFRkN5QUFFQklOQVNBRVFRRkxEUUFMUVZzZ0FDZ0NFQ0FBUWNNQUVFb2JJUU1nQWtVTkFVRUtJQU1nQUNnQ0JDQUFLQUlVUnhzaEF3d0JDMEdzZnlFREN5QUJCRUFnQVNBSE5nSUFDeUFBSUFZUTdnSWhBQ0FHUVpBQ2FpUUFRWDhnQXlBQUd3c1pBQ0FBSUFFZ0FrRUJJQU1nQkNBRklBWWdCeUFJRVBVQkM2b0dBUVovSUFBb0FnQWhCUUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUREZ2NFQUFBQUFBRUNBd3NnQVNBQ0lBRW9Bc0FCUVFFUXdRTWlDVUVBU0FSQUlBRW9BcndCSVFRTUJnc0NRQ0FKUWYvLy8vOERUUVJBSUFFb0FuUWlDQ0FKUVFSMGFpSUhLQUlFSWdZZ0FTZ0N2QUVpQkVZRVFDQURRUU5IRFFJZ0FTMEFia0VCY1EwQ0lBZ2dDVUVFZEdvb0FneEIrQUJ4UVFoSERRSU1DUXNnQnlnQ0RFSDRBSEZCR0VjZ0JrRUNhaUFFUjNJTkJ3d0JDeUFCS0FLOEFTSUVJQUVvQXZBQlJ3MEdDeUFBUVpERUFFRUFFQllNQndzZ0JTQUJJQUpCQXhEakFnOExJQUVnQWlBQktBTEFBVUVBRU1FRFFRQk9EUUlnQVNnQ0tBUkFBa0FnQVNBQ0VLSUNJZ05GRFFBZ0F5MEFCRUVDY1VVTkFDQURLQUlJSUFFb0Fyd0JSdzBBSUFFb0FpUkJBVVlOQkF0QmdJQ0FnQVJCZnlBRklBRWdBaERrQWhzUEN5QUJJQUlROUFFaUJFRUFUZzBJSUFVZ0FTQUNFRThpQkVFQVNBMElBa0FnQWtITkFFY05BQ0FCS0FKSVJRMEFJQUVnQkRZQ21BRUxJQUVvQW5RZ0JFRUVkR29nQVNnQ3ZBRTJBZ2dnQkE4TEVBRUFDeUFGSUFFZ0FrRUFFT01DSVFRTUJnc2dBRUdReEFCQkFCQVdEQUlMQWtBZ0EwRUNTdzBBSUFRZ0FTZ0M4QUZIRFFBZ0JDRUdJQUVnQWhEZ0JFRUFTQTBCSUFCQnkrWUFRUUFRRmd3Q0N5QUVJUVlMUVFBaEJDQUJLQUo4SWdkQkFDQUhRUUJLR3lFSEFrQURRQ0FFSUFkR0RRRUNRQUpBSUFFb0FuUWdCRUVFZEdvaUNDZ0NBQ0FDUncwQUlBZ29BZ1FOQUNBQklBZ29BZ2dnQmhEYUJBMEJDeUFFUVFGcUlRUU1BUXNMSUFSQkFFZ05BQ0FBUWVIcUFFRUFFQllNQVFzQ1FDQUJLQUlvUlEwQUlBRWdBaENpQWlJRVJRMEFJQUVnQkNnQ0NDQUdFTm9FUlEwQUlBQkI0OFFBUVFBUUZnd0JDeUFCS0FJZ1JRMENJQUVvQWlSQkFVc05BaUFHSUFFb0F2QUJSdzBDSUFVZ0FTQUNFT1FDSWdBTkFRdEJmdzhMSUFBZ0FDMEFCRUg1QVhGQkJrRUNJQU5CQWtZYmNqb0FCRUdBZ0lDQUJBOExJQVVnQVNBQ1FRRWdBMEVFUmtFQmRDQURRUU5HR3hEakFpSUVRUUJJRFFBZ0FTZ0NkQ0FFUVFSMGFpSUFJQUFvQWd4QmZIRWdBMEVDUm5KQkFuSTJBZ3dnQkE4TElBUUxzZ0VCQlg4Q1FBSkFJQUFvQWtBaUFpZ0NtQUlpQTBFQVNBMEFJQUlvQW9BQ0lnUWdBMm9pQlMwQUFDSUdRY0VCUndSQUlBWkJ6UUJIRFFFZ0FrRi9OZ0tZQWlBQ0lBTTJBb1FDSUFCQnpRQVFFQ0FBSUFFUUdnOExJQVFnQXlBRktBQUJhMEVCYWlJRGFpSUVMUUFBUWRZQVJ3MEJJQUFvQWdBZ0JDZ0FBUkFUSUFJb0FvQUNJQU5xSUFBb0FnQWdBUkFZTmdBQklBSkJmellDbUFJTER3dEIzVFJCcnZ3QVFkT3dBVUhONVFBUUFBQUwyUWtDQ0g4QmZpTUFRWkFCYXlJQ0pBQUNmd0pBSUFBb0FnQW9BaEFvQW5nZ0Frc0VRQ0FBUVkwaVFRQVFGZ3dCQ3lBQUlBQkJFR29pQmhEL0FTQUFJQUFvQWpnaUFUWUNOQ0FDSUFFMkFnUWdBQ0FBS0FJVU5nSUVBa0FEUUFKQUlBQWdBVFlDR0NBQUlBQW9BZ2dpQlRZQ0ZBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FTd0FBQ0lEUWY4QmNTSUVEbnNBQ1FrSkNRa0pDUWtHQkFVRkF3a0pDUWtKQ1FrSkNRa0pDUWtKQ1FrSkNRWUpBZ2tPQ1FrQkNRa0pDd2tLQ1FjSURBd01EQXdNREF3TUNRa0pDUWtKQ1E0T0RnNE9EZzRPRGc0T0RnNE9EZzRPRGc0T0RnNE9EZzRPQ1FrSkNRNEpEZzRPRGc0T0RnNE9EZzRPRGc0T0RnNE9EZzRPRGc0T0RnNEpDMEVBSVFNZ0FTQUFLQUk4U1EwTUlBWkJySDgyQWdBTURndEJKeUVESUFBb0FreEZEUXRCSnlFRUN5QUFJQVJCQVNBQlFRRnFJQVlnQWtFRWFoRHpBa1VOREF3UUN5QUJRUUZxSUFFZ0FTMEFBVUVLUmhzaEFRc2dBaUFCUVFGcUlnRTJBZ1FnQUNBRlFRRnFOZ0lJREEwTElBQW9Ba3hGRFFjTElBSWdBVUVCYWlJQk5nSUVEQXNMSUFBb0FreEZCRUJCTHlFRERBWUxRUzhoQXlBQkxRQUJJZ1JCTDBZTkNDQUVRU3BIRFFVZ0FVRUNhaUVCQTBBZ0FpQUJOZ0lFQTBBQ1FBSkFBa0FDUUNBQkxRQUFJZ05CQ21zT0JBRUNBZ01BQ3lBRFFTcEhCRUFnQXcwQ0lBRWdBQ2dDUEVrTkEwSFZMQ0VCREE4TElBRXRBQUZCTDBjTkFpQUNJQUZCQW1vaUFUWUNCQXdQQ3lBQUlBQW9BZ2hCQVdvMkFnZ01BUXNnQThCQkFFNE5BQ0FCUVFZZ0FrRUVhaEJZSVFNZ0FpZ0NCQ0VCSUFOQmYwY05BUXNMSUFGQkFXb2hBUXdBQ3dBTFFUQWhBeUFCTFFBQlFUcHJRWFpKRFFNTUJBc2dBMEVBVGcwRFFkSERBQ0VCREFjTFFTMGhBeUFCTFFBQlFUcHJRWFpKRFFJTUFRdEJLeUVESUFBb0FreEZEUUVnQVMwQUFVRTZhMEYyU1EwQkN5QUFLQUlBSUFFZ0FrRUVha0VBUVFvZ0FDZ0NUQ0lCR3lBQlFRQkhRUUowRUxnQ0lnbENnSUNBZ0hDRFFvQ0FnSURnQUZFTkJpQUFRWUIvTmdJUUlBQWdDVGNESUF3Q0N5QUdJQU5CL3dGeE5nSUFJQUlnQVVFQmFqWUNCQXdCQ3lBQ0lBRkJBV29pQnpZQ0JFR0FBU0VFSUFKQmdBRTJBZ2dnQWlBQ1FSQnFJZ1UyQWd4QkFDRUJBbjhEUUNBRVFRWnJJUWdDUUFOQUlBRWdCV29nQXpvQUFDQUJRUUZxSVFFZ0J5MEFBQ0lFd0NJRFFRQklEUUVnQkVFRGRrRWNjVUdnZ1FKcUtBSUFJQVIyUVFGeFJRMEJJQWRCQVdvaEJ5QUJJQWhKRFFBTElBQW9BZ0FnQWtFTWFpQUNRUWhxSUFKQkVHb1E5UVFoQkNBQ0tBSU1JUVZCQUNBRURRSWFJQUlvQWdnaEJBd0JDd3NnQUNnQ0FDQUZJQUVRaFFNTElRRWdBa0VRYWlBRlJ3UkFJQUFvQWdBb0FoQWlBMEVRYWlBRklBTW9BZ1FSQUFBTElBSWdCellDQkNBQlJRMEVJQUJDQURjQ0pDQUFRWU4vTmdJUUlBQWdBVFlDSUFzZ0FDQUNLQUlFTmdJNFFRQU1CUXNnQVVFQ2FpRUJBMEFnQWlBQk5nSUVBMEFDUUFKQUlBRXRBQUFpQXdSQUlBTkJDbXNPQkFZQkFRWUJDeUFCSUFBb0FqeFBEUVVNQVFzZ0E4QkJBRTROQUNBQlFRWWdBa0VFYWhCWUlnTkJmbkZCcU1BQVJnUkFJQUlvQWdRaEFRd0ZDeUFDS0FJRUlRRWdBMEYvUncwQkN3c2dBVUVCYWlFQkRBQUxBQXNMSUFBZ0FVRUFFQllMSUFaQnFuODJBZ0FMUVg4TElRRWdBa0dRQVdva0FDQUJDeUVBSUFBZ0FTQUNRZ0JDLy8vLy8vLy8vdzlDQUJCMElRRWdBQ0FDRUE4Z0FRc3FBUUYvSXdCQkVHc2lBeVFBSUFNZ0FqWUNEQ0FBSUFFZ0FrSGpBRUVBRUprRUdpQURRUkJxSkFBTFR3QWdBQ0FCSUFKQkFFNEVmaUFDclFWQ2dJQ0FnTUIrSUFLNHZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3lBRFFZQ0FBUkRYQVF0WkFRSi9Jd0JCRUdzaUF5UUFRWDhoQkNBQUlBTkJDR29nQWhEaUEwVUVRRUVBSVFRZ0FTQURLUU1JSWdKQ2dJQ0FnSUNBZ0JCYUJINGdBRUdBSUVFQUVGQkJmeUVFUWdBRklBSUxOd01BQ3lBRFFSQnFKQUFnQkFzUkFDQUFJQUVnQVNBQ0lBTkJBaENLQkF0VEFRRi9JQUFvQWhBaUJFRVFhaUFCSUFJZ0JDZ0NDQkVCQUNJQklBSkZja1VFUUNBQUVId2dBUThMSUFNRVFDQURJQUVnQUNnQ0VDZ0NEQkVFQUNJQUlBSnJJZ0pCQUNBQUlBSlBHellDQUFzZ0FRdkFBUUFnQUFKL0lBRW9BZ2dpQUVIKy8vLy9CMDRFUUVFQUlBSkJBWEVOQVJwQi8vLy8vd2NnQUVIKy8vLy9CMGNOQVJvZ0FTZ0NCRUgvLy8vL0Iyb01BUXRCQUNBQVFRQk1EUUFhSUFCQkgwMEVRRUVBSUFFb0FoQWdBU2dDREVFQ2RHcEJCR3NvQWdCQklDQUFhM1lpQW1zZ0FpQUJLQUlFR3d3QkN5QUNRUUZ4UlFSQVFZQ0FnSUI0UWYvLy8vOEhJQUVvQWdRYkRBRUxRUUFnQVNnQ0VDQUJLQUlNSWdJZ0FrRUZkQ0FBYXhCb0lnSnJJQUlnQVNnQ0JCc0xOZ0lBQ3cwQUlBQWdBU0FCRUQ4UWhRTUwrUUVDQTM0Q2Z5TUFRUkJySWdVa0FBSitJQUc5SWdOQy8vLy8vLy8vLy8vL0FJTWlBa0tBZ0lDQWdJQ0FDSDFDLy8vLy8vLy8vKy8vQUZnRVFDQUNRanlHSVFRZ0FrSUVpRUtBZ0lDQWdJQ0FnRHg4REFFTElBSkNnSUNBZ0lDQWdQai9BRm9FUUNBRFFqeUdJUVFnQTBJRWlFS0FnSUNBZ0lEQS8vOEFoQXdCQ3lBQ1VBUkFRZ0FNQVFzZ0JTQUNRZ0FnQTZkblFTQnFJQUpDSUlpblp5QUNRb0NBZ0lBUVZCc2lCa0V4YWhCbklBVXBBd0FoQkNBRktRTUlRb0NBZ0lDQWdNQUFoVUdNK0FBZ0JtdXRRakNHaEFzaEFpQUFJQVEzQXdBZ0FDQUNJQU5DZ0lDQWdJQ0FnSUNBZjRPRU53TUlJQVZCRUdva0FBdTJBUUVCZnlNQVFSQnJJZ01rQUFKQUFrQWdBa0VBU0FSQUlBRWdBa0gvLy8vL0IzRTJBZ0JCQVNFQ0RBRUxJQUFvQWhBaUFDZ0NMQ0FDVFEwQkFuOENRQ0FBS0FJNElBSkJBblJxS0FJQUlnQXBBZ1JDZ0lDQWdJQ0FnSUJBZzBLQWdJQ0FnSUNBZ01BQVVnMEFJQU5CREdvZ0FCQzlCVVVOQUVFQklBTW9BZ3dpQUVGL1J3MEJHZ3RCQUNFQVFRQUxJUUlnQVNBQU5nSUFDeUFEUVJCcUpBQWdBZzhMUWUvZkFFR3UvQUJCdnhoQnJ5QVFBQUFMMVFFQ0FuOERmZ0ovSUFKRkJFQkNnSUNBZ0RBaEJVRUFEQUVMSUFBb0FoQWlBeWtEZ0FFaEJTQURRb0NBZ0lBZ053T0FBVUYvQ3lFREFrQWdBQ0FCUVFZZ0FVRUFFQlFpQjBLQWdJQ0FjSU1pQmtLQWdJQ0FJRkVnQmtLQWdJQ0FNRkZ5UlFSQVFYOGhCQ0FHUW9DQWdJRGdBRkVOQVNBQUlBY2dBVUVBUVFBUUx5RUJBbjhnQXlBQ0RRQWFRWDhnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2lBRElBRkMvLy8vLzI5V0RRQWFJQUFRSkVGL0N5RUVJQUFnQVJBUERBRUxJQU1oQkFzZ0FnUkFJQUFnQlJDS0FRc2dCQXZGQVFJQmZnSi9Jd0JCRUdzaUJTUUFRb0NBZ0lEZ0FDRUVBa0FDUUNBQUlBRWdBa0VBUVFBZ0JVRU1haERIQlNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0JTZ0NEQ0lHUVFKSEJFQWdBeUFHTmdJQUlBRWhCQXdDQ3lBQUlBRkI2UUFnQVVFQUVCUWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQU1nQUNBQ0VDWWlBellDQUVLQWdJQ0FNQ0VFSUFORkJFQWdBQ0FCUWNBQUlBRkJBQkFVSVFRTElBQWdBUkFQREFFTElBQWdBUkFQSUFOQkFEWUNBQXNnQlVFUWFpUUFJQVFMVFFBZ0FDQUJJQUpCQUU0RWZpQUNyUVZDZ0lDQWdNQitJQUs0dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeUFESUFRUXZRRUxTQUFnQUNBQklBSkJBRTRFZmlBQ3JRVkNnSUNBZ01CK0lBSzR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4Qk5DNmNwQVF0L0l3QkJFR3NpQ3lRQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQVFmUUJUUVJBUWJEUUJDZ0NBQ0lKUVJBZ0FFRUxha0Y0Y1NBQVFRdEpHeUlHUVFOMklnRjJJZ0pCQTNFRVFBSkFJQUpCZjNOQkFYRWdBV29pQVVFRGRDSUFRZGpRQkdvaUFpQUFRZURRQkdvb0FnQWlBeWdDQ0NJQVJnUkFRYkRRQkNBSlFYNGdBWGR4TmdJQURBRUxJQUFnQWpZQ0RDQUNJQUEyQWdnTElBTkJDR29oQUNBRElBRkJBM1FpQWtFRGNqWUNCQ0FDSUFOcUlnSWdBaWdDQkVFQmNqWUNCQXdKQ3lBR1FialFCQ2dDQUNJS1RRMEJJQUlFUUFKQVFRSWdBWFFpQUVFQUlBQnJjaUFDSUFGMGNTSUFRUUFnQUd0eGFDSURRUU4wSWdCQjJOQUVhaUlDSUFCQjROQUVhaWdDQUNJSEtBSUlJZ0JHQkVCQnNOQUVJQWxCZmlBRGQzRWlDVFlDQUF3QkN5QUFJQUkyQWd3Z0FpQUFOZ0lJQ3lBSElBWkJBM0kyQWdRZ0JpQUhhaUlCSUFOQkEzUWlBQ0FHYXlJRVFRRnlOZ0lFSUFBZ0Iyb2dCRFlDQUNBS0JFQWdDa0Y0Y1VIWTBBUnFJUUJCeE5BRUtBSUFJUVVDZnlBSlFRRWdDa0VEZG5RaUFuRkZCRUJCc05BRUlBSWdDWEkyQWdBZ0FBd0JDeUFBS0FJSUN5RURJQUFnQlRZQ0NDQURJQVUyQWd3Z0JTQUFOZ0lNSUFVZ0F6WUNDQXNnQjBFSWFpRUFRY1RRQkNBQk5nSUFRYmpRQkNBRU5nSUFEQWtMUWJUUUJDZ0NBQ0lIUlEwQklBZEJBQ0FIYTNGb1FRSjBRZURTQkdvb0FnQWlBU2dDQkVGNGNTQUdheUVFSUFFaEFnTkFBa0FnQWlnQ0VDSUFSUVJBSUFJb0FoUWlBRVVOQVFzZ0FDZ0NCRUY0Y1NBR2F5SUNJQVFnQWlBRVNTSUNHeUVFSUFBZ0FTQUNHeUVCSUFBaEFnd0JDd3NnQVNnQ0dDRUlJQUVnQVNnQ0RDSURSd1JBUWNEUUJDZ0NBQm9nQVNnQ0NDSUFJQU0yQWd3Z0F5QUFOZ0lJREFnTElBRkJGR29pQWlnQ0FDSUFSUVJBSUFFb0FoQWlBRVVOQXlBQlFSQnFJUUlMQTBBZ0FpRUZJQUFpQTBFVWFpSUNLQUlBSWdBTkFDQURRUkJxSVFJZ0F5Z0NFQ0lBRFFBTElBVkJBRFlDQUF3SEMwRi9JUVlnQUVHL2Ywc05BQ0FBUVF0cUlnQkJlSEVoQmtHMDBBUW9BZ0FpQ0VVTkFFRUFJQVpySVFRQ1FBSkFBa0FDZjBFQUlBWkJnQUpKRFFBYVFSOGdCa0gvLy84SFN3MEFHaUFHUVNZZ0FFRUlkbWNpQUd0MlFRRnhJQUJCQVhSclFUNXFDeUlIUVFKMFFlRFNCR29vQWdBaUFrVUVRRUVBSVFBTUFRdEJBQ0VBSUFaQkdTQUhRUUYyYTBFQUlBZEJIMGNiZENFQkEwQUNRQ0FDS0FJRVFYaHhJQVpySWdVZ0JFOE5BQ0FDSVFNZ0JTSUVEUUJCQUNFRUlBSWhBQXdEQ3lBQUlBSW9BaFFpQlNBRklBSWdBVUVkZGtFRWNXb29BaEFpQWtZYklBQWdCUnNoQUNBQlFRRjBJUUVnQWcwQUN3c2dBQ0FEY2tVRVFFRUFJUU5CQWlBSGRDSUFRUUFnQUd0eUlBaHhJZ0JGRFFNZ0FFRUFJQUJyY1doQkFuUkI0TklFYWlnQ0FDRUFDeUFBUlEwQkN3TkFJQUFvQWdSQmVIRWdCbXNpQVNBRVNTRUZJQUVnQkNBRkd5RUVJQUFnQXlBRkd5RURJQUFvQWhBaUFnUi9JQUlGSUFBb0FoUUxJZ0FOQUFzTElBTkZEUUFnQkVHNDBBUW9BZ0FnQm10UERRQWdBeWdDR0NFSElBTWdBeWdDRENJQlJ3UkFRY0RRQkNnQ0FCb2dBeWdDQ0NJQUlBRTJBZ3dnQVNBQU5nSUlEQVlMSUFOQkZHb2lBaWdDQUNJQVJRUkFJQU1vQWhBaUFFVU5BeUFEUVJCcUlRSUxBMEFnQWlFRklBQWlBVUVVYWlJQ0tBSUFJZ0FOQUNBQlFSQnFJUUlnQVNnQ0VDSUFEUUFMSUFWQkFEWUNBQXdGQ3lBR1FialFCQ2dDQUNJQVRRUkFRY1RRQkNnQ0FDRURBa0FnQUNBR2F5SUNRUkJQQkVBZ0F5QUdhaUlCSUFKQkFYSTJBZ1FnQUNBRGFpQUNOZ0lBSUFNZ0JrRURjallDQkF3QkN5QURJQUJCQTNJMkFnUWdBQ0FEYWlJQUlBQW9BZ1JCQVhJMkFnUkJBQ0VCUVFBaEFndEJ1TkFFSUFJMkFnQkJ4TkFFSUFFMkFnQWdBMEVJYWlFQURBY0xJQVpCdk5BRUtBSUFJZ3BKQkVCQnZOQUVJQW9nQm1zaUFqWUNBRUhJMEFSQnlOQUVLQUlBSWdFZ0Jtb2lBRFlDQUNBQUlBSkJBWEkyQWdRZ0FTQUdRUU55TmdJRUlBRkJDR29oQUF3SEMwRUFJUUFnQmtFdmFpSUlBbjlCaU5RRUtBSUFCRUJCa05RRUtBSUFEQUVMUVpUVUJFSi9Od0lBUVl6VUJFS0FvSUNBZ0lBRU53SUFRWWpVQkNBTFFReHFRWEJ4UWRpcTFhb0ZjellDQUVHYzFBUkJBRFlDQUVIczB3UkJBRFlDQUVHQUlBc2lCR29pQjBFQUlBUnJJZ1Z4SWdJZ0JrME5Ca0hvMHdRb0FnQWlCQVJBUWVEVEJDZ0NBQ0lESUFKcUlnRWdBMDBnQVNBRVMzSU5Cd3NDUUVIczB3UXRBQUJCQkhGRkJFQUNRQUpBQWtBQ1FFSEkwQVFvQWdBaUF3UkFRZkRUQkNFRUEwQWdBeUFFS0FJQUlnRlBCRUFnQVNBRUtBSUVhaUFEU3cwREN5QUVLQUlJSWdRTkFBc0xRUUFRbEFJaUFVRi9SZzBESUFJaEIwR00xQVFvQWdBaUJFRUJheUlESUFGeEJFQWdBaUFCYXlBQklBTnFRUUFnQkd0eGFpRUhDeUFHSUFkUERRTkI2Tk1FS0FJQUlnVUVRRUhnMHdRb0FnQWlCQ0FIYWlJRElBUk5JQU1nQlV0eURRUUxJQWNRbEFJaUJDQUJSdzBCREFVTElBY2dDbXNnQlhFaUJ4Q1VBaUlCSUFRb0FnQWdCQ2dDQkdwR0RRRWdBU0VFQ3lBRVFYOUdEUUVnQnlBR1FUQnFUd1JBSUFRaEFRd0VDMEdRMUFRb0FnQWlBU0FJSUFkcmFrRUFJQUZyY1NJQkVKUUNRWDlHRFFFZ0FTQUhhaUVISUFRaEFRd0RDeUFCUVg5SERRSUxRZXpUQkVIczB3UW9BZ0JCQkhJMkFnQUxJQUlRbEFJaUFVRi9Sa0VBRUpRQ0lnSkJmMFp5SUFFZ0FrOXlEUWNnQWlBQmF5SUhJQVpCS0dwTkRRY0xRZURUQkVIZzB3UW9BZ0FnQjJvaUFEWUNBRUhrMHdRb0FnQWdBRWtFUUVIazB3UWdBRFlDQUFzQ1FFSEkwQVFvQWdBaUJRUkFRZkRUQkNFQUEwQWdBU0FBS0FJQUlnTWdBQ2dDQkNJQ2FrWU5BaUFBS0FJSUlnQU5BQXNNQkF0QndOQUVLQUlBSWdCQkFDQUFJQUZORzBVRVFFSEEwQVFnQVRZQ0FBdEJBQ0VBUWZUVEJDQUhOZ0lBUWZEVEJDQUJOZ0lBUWREUUJFRi9OZ0lBUWRUUUJFR0kxQVFvQWdBMkFnQkIvTk1FUVFBMkFnQURRQ0FBUVFOMElnTkI0TkFFYWlBRFFkalFCR29pQWpZQ0FDQURRZVRRQkdvZ0FqWUNBQ0FBUVFGcUlnQkJJRWNOQUF0QnZOQUVJQWRCS0dzaUEwRjRJQUZyUVFkeFFRQWdBVUVJYWtFSGNSc2lBR3NpQWpZQ0FFSEkwQVFnQUNBQmFpSUFOZ0lBSUFBZ0FrRUJjallDQkNBQklBTnFRU2cyQWdSQnpOQUVRWmpVQkNnQ0FEWUNBQXdFQ3lBQUxRQU1RUWh4SUFNZ0JVdHlJQUVnQlUxeURRSWdBQ0FDSUFkcU5nSUVRY2pRQkNBRlFYZ2dCV3RCQjNGQkFDQUZRUWhxUVFkeEd5SUFhaUlCTmdJQVFielFCRUc4MEFRb0FnQWdCMm9pQWlBQWF5SUFOZ0lBSUFFZ0FFRUJjallDQkNBQ0lBVnFRU2cyQWdSQnpOQUVRWmpVQkNnQ0FEWUNBQXdEQzBFQUlRTU1CQXRCQUNFQkRBSUxRY0RRQkNnQ0FDQUJTd1JBUWNEUUJDQUJOZ0lBQ3lBQklBZHFJUUpCOE5NRUlRQUNRQUpBQWtBQ1FBSkFBa0FEUUNBQ0lBQW9BZ0JIQkVBZ0FDZ0NDQ0lBRFFFTUFnc0xJQUF0QUF4QkNIRkZEUUVMUWZEVEJDRUFBMEFnQlNBQUtBSUFJZ0pQQkVBZ0FpQUFLQUlFYWlJRUlBVkxEUU1MSUFBb0FnZ2hBQXdBQ3dBTElBQWdBVFlDQUNBQUlBQW9BZ1FnQjJvMkFnUWdBVUY0SUFGclFRZHhRUUFnQVVFSWFrRUhjUnRxSWdjZ0JrRURjallDQkNBQ1FYZ2dBbXRCQjNGQkFDQUNRUWhxUVFkeEcyb2lDU0FHSUFkcUlnaHJJUUFnQlNBSlJnUkFRY2pRQkNBSU5nSUFRYnpRQkVHODBBUW9BZ0FnQUdvaUFEWUNBQ0FJSUFCQkFYSTJBZ1FNQXd0QnhOQUVLQUlBSUFsR0JFQkJ4TkFFSUFnMkFnQkJ1TkFFUWJqUUJDZ0NBQ0FBYWlJQU5nSUFJQWdnQUVFQmNqWUNCQ0FBSUFocUlBQTJBZ0FNQXdzZ0NTZ0NCQ0lFUVFOeFFRRkdCRUFnQkVGNGNTRUZBa0FnQkVIL0FVMEVRQ0FFUVFOMklRSWdDU2dDRENJQklBa29BZ2dpQTBZRVFFR3cwQVJCc05BRUtBSUFRWDRnQW5keE5nSUFEQUlMSUFNZ0FUWUNEQ0FCSUFNMkFnZ01BUXNnQ1NnQ0dDRUdBa0FnQ1NBSktBSU1JZ0ZIQkVBZ0NTZ0NDQ0lDSUFFMkFnd2dBU0FDTmdJSURBRUxBa0FnQ1VFVWFpSUVLQUlBSWdJTkFDQUpRUkJxSWdRb0FnQWlBZzBBUVFBaEFRd0JDd05BSUFRaEF5QUNJZ0ZCRkdvaUJDZ0NBQ0lDRFFBZ0FVRVFhaUVFSUFFb0FoQWlBZzBBQ3lBRFFRQTJBZ0FMSUFaRkRRQUNRQ0FKS0FJY0lnTkJBblJCNE5JRWFpSUNLQUlBSUFsR0JFQWdBaUFCTmdJQUlBRU5BVUcwMEFSQnROQUVLQUlBUVg0Z0EzZHhOZ0lBREFJTElBWkJFRUVVSUFZb0FoQWdDVVliYWlBQk5nSUFJQUZGRFFFTElBRWdCallDR0NBSktBSVFJZ0lFUUNBQklBSTJBaEFnQWlBQk5nSVlDeUFKS0FJVUlnSkZEUUFnQVNBQ05nSVVJQUlnQVRZQ0dBc2dCU0FKYWlJSktBSUVJUVFnQUNBRmFpRUFDeUFKSUFSQmZuRTJBZ1FnQ0NBQVFRRnlOZ0lFSUFBZ0NHb2dBRFlDQUNBQVFmOEJUUVJBSUFCQmVIRkIyTkFFYWlFQ0FuOUJzTkFFS0FJQUlnRkJBU0FBUVFOMmRDSUFjVVVFUUVHdzBBUWdBQ0FCY2pZQ0FDQUNEQUVMSUFJb0FnZ0xJUUFnQWlBSU5nSUlJQUFnQ0RZQ0RDQUlJQUkyQWd3Z0NDQUFOZ0lJREFNTFFSOGhCQ0FBUWYvLy93ZE5CRUFnQUVFbUlBQkJDSFpuSWdKcmRrRUJjU0FDUVFGMGEwRSthaUVFQ3lBSUlBUTJBaHdnQ0VJQU53SVFJQVJCQW5SQjROSUVhaUVEQWtCQnROQUVLQUlBSWdGQkFTQUVkQ0lDY1VVRVFFRzAwQVFnQVNBQ2NqWUNBQ0FESUFnMkFnQWdDQ0FETmdJWURBRUxJQUJCR1NBRVFRRjJhMEVBSUFSQkgwY2JkQ0VFSUFNb0FnQWhBUU5BSUFFaUFpZ0NCRUY0Y1NBQVJnMERJQVJCSFhZaEFTQUVRUUYwSVFRZ0FpQUJRUVJ4YWlJRFFSQnFLQUlBSWdFTkFBc2dBeUFJTmdJUUlBZ2dBallDR0FzZ0NDQUlOZ0lNSUFnZ0NEWUNDQXdDQzBHODBBUWdCMEVvYXlJRFFYZ2dBV3RCQjNGQkFDQUJRUWhxUVFkeEd5SUFheUlDTmdJQVFjalFCQ0FBSUFGcUlnQTJBZ0FnQUNBQ1FRRnlOZ0lFSUFFZ0EycEJLRFlDQkVITTBBUkJtTlFFS0FJQU5nSUFJQVVnQkVFbklBUnJRUWR4UVFBZ0JFRW5hMEVIY1J0cVFTOXJJZ0FnQUNBRlFSQnFTUnNpQTBFYk5nSUVJQU5CK05NRUtRSUFOd0lRSUFOQjhOTUVLUUlBTndJSVFmalRCQ0FEUVFocU5nSUFRZlRUQkNBSE5nSUFRZkRUQkNBQk5nSUFRZnpUQkVFQU5nSUFJQU5CR0dvaEFBTkFJQUJCQnpZQ0JDQUFRUWhxSVFJZ0FFRUVhaUVBSUFJZ0JFa05BQXNnQXlBRlJnMERJQU1nQXlnQ0JFRitjVFlDQkNBRklBTWdCV3NpQkVFQmNqWUNCQ0FESUFRMkFnQWdCRUgvQVUwRVFDQUVRWGh4UWRqUUJHb2hBQUovUWJEUUJDZ0NBQ0lCUVFFZ0JFRURkblFpQW5GRkJFQkJzTkFFSUFFZ0FuSTJBZ0FnQUF3QkN5QUFLQUlJQ3lFQ0lBQWdCVFlDQ0NBQ0lBVTJBZ3dnQlNBQU5nSU1JQVVnQWpZQ0NBd0VDMEVmSVFBZ0JFSC8vLzhIVFFSQUlBUkJKaUFFUVFoMlp5SUFhM1pCQVhFZ0FFRUJkR3RCUG1vaEFBc2dCU0FBTmdJY0lBVkNBRGNDRUNBQVFRSjBRZURTQkdvaEF3SkFRYlRRQkNnQ0FDSUJRUUVnQUhRaUFuRkZCRUJCdE5BRUlBRWdBbkkyQWdBZ0F5QUZOZ0lBSUFVZ0F6WUNHQXdCQ3lBRVFSa2dBRUVCZG10QkFDQUFRUjlIRzNRaEFDQURLQUlBSVFNRFFDQURJZ0lvQWdSQmVIRWdCRVlOQkNBQVFSMTJJUUVnQUVFQmRDRUFJQUlnQVVFRWNXb2lBVUVRYWlnQ0FDSUREUUFMSUFFZ0JUWUNFQ0FGSUFJMkFoZ0xJQVVnQlRZQ0RDQUZJQVUyQWdnTUF3c2dBaWdDQ0NJQUlBZzJBZ3dnQWlBSU5nSUlJQWhCQURZQ0dDQUlJQUkyQWd3Z0NDQUFOZ0lJQ3lBSFFRaHFJUUFNQkFzZ0FpZ0NDQ0lBSUFVMkFnd2dBaUFGTmdJSUlBVkJBRFlDR0NBRklBSTJBZ3dnQlNBQU5nSUlDMEVBSVFCQnZOQUVLQUlBSWdJZ0JrME5Ba0c4MEFRZ0FpQUdheUlDTmdJQVFjalFCRUhJMEFRb0FnQWlBU0FHYWlJQU5nSUFJQUFnQWtFQmNqWUNCQ0FCSUFaQkEzSTJBZ1FnQVVFSWFpRUFEQUlMQWtBZ0IwVU5BQUpBSUFNb0Fod2lBa0VDZEVIZzBnUnFJZ0FvQWdBZ0EwWUVRQ0FBSUFFMkFnQWdBUTBCUWJUUUJDQUlRWDRnQW5keElnZzJBZ0FNQWdzZ0IwRVFRUlFnQnlnQ0VDQURSaHRxSUFFMkFnQWdBVVVOQVFzZ0FTQUhOZ0lZSUFNb0FoQWlBQVJBSUFFZ0FEWUNFQ0FBSUFFMkFoZ0xJQU1vQWhRaUFFVU5BQ0FCSUFBMkFoUWdBQ0FCTmdJWUN3SkFJQVJCRDAwRVFDQURJQVFnQm1vaUFFRURjallDQkNBQUlBTnFJZ0FnQUNnQ0JFRUJjallDQkF3QkN5QURJQVpCQTNJMkFnUWdBeUFHYWlJRklBUkJBWEkyQWdRZ0JDQUZhaUFFTmdJQUlBUkIvd0ZOQkVBZ0JFRjRjVUhZMEFScUlRQUNmMEd3MEFRb0FnQWlBVUVCSUFSQkEzWjBJZ0p4UlFSQVFiRFFCQ0FCSUFKeU5nSUFJQUFNQVFzZ0FDZ0NDQXNoQkNBQUlBVTJBZ2dnQkNBRk5nSU1JQVVnQURZQ0RDQUZJQVEyQWdnTUFRdEJIeUVBSUFSQi8vLy9CMDBFUUNBRVFTWWdCRUVJZG1jaUFHdDJRUUZ4SUFCQkFYUnJRVDVxSVFBTElBVWdBRFlDSENBRlFnQTNBaEFnQUVFQ2RFSGcwZ1JxSVFFQ1FBSkFJQWhCQVNBQWRDSUNjVVVFUUVHMDBBUWdBaUFJY2pZQ0FDQUJJQVUyQWdBZ0JTQUJOZ0lZREFFTElBUkJHU0FBUVFGMmEwRUFJQUJCSDBjYmRDRUFJQUVvQWdBaEJnTkFJQVlpQWlnQ0JFRjRjU0FFUmcwQ0lBQkJIWFloQVNBQVFRRjBJUUFnQWlBQlFRUnhhaUlCUVJCcUtBSUFJZ1lOQUFzZ0FTQUZOZ0lRSUFVZ0FqWUNHQXNnQlNBRk5nSU1JQVVnQlRZQ0NBd0JDeUFDS0FJSUlnQWdCVFlDRENBQ0lBVTJBZ2dnQlVFQU5nSVlJQVVnQWpZQ0RDQUZJQUEyQWdnTElBTkJDR29oQUF3QkN3SkFJQWhGRFFBQ1FDQUJLQUljSWdKQkFuUkI0TklFYWlJQUtBSUFJQUZHQkVBZ0FDQUROZ0lBSUFNTkFVRzAwQVFnQjBGK0lBSjNjVFlDQUF3Q0N5QUlRUkJCRkNBSUtBSVFJQUZHRzJvZ0F6WUNBQ0FEUlEwQkN5QURJQWcyQWhnZ0FTZ0NFQ0lBQkVBZ0F5QUFOZ0lRSUFBZ0F6WUNHQXNnQVNnQ0ZDSUFSUTBBSUFNZ0FEWUNGQ0FBSUFNMkFoZ0xBa0FnQkVFUFRRUkFJQUVnQkNBR2FpSUFRUU55TmdJRUlBQWdBV29pQUNBQUtBSUVRUUZ5TmdJRURBRUxJQUVnQmtFRGNqWUNCQ0FCSUFacUlnVWdCRUVCY2pZQ0JDQUVJQVZxSUFRMkFnQWdDZ1JBSUFwQmVIRkIyTkFFYWlFQVFjVFFCQ2dDQUNFSEFuOUJBU0FLUVFOMmRDSUNJQWx4UlFSQVFiRFFCQ0FDSUFseU5nSUFJQUFNQVFzZ0FDZ0NDQXNoQXlBQUlBYzJBZ2dnQXlBSE5nSU1JQWNnQURZQ0RDQUhJQU0yQWdnTFFjVFFCQ0FGTmdJQVFialFCQ0FFTmdJQUN5QUJRUWhxSVFBTElBdEJFR29rQUNBQUN4OEFJQUFnQVNBQUlBSVFxZ0VpQWlBQlFRQVFGQ0VCSUFBZ0FoQVRJQUVMRFFBZ0FFRUFJQUZCQUJDVkJBdVlBUUVCZndKQUlBSkZJQUZDZ0lDQWdIQ0RRb0NBZ0lDUWYxSnlSUVJBSUFHbklnTWdBeWdDQUVFQmFqWUNBRUVFSVFJZ0FDZ0NBQ2dDRUNBREVQd0RJZ05CQUVvTkFRc2dBVUlnaUtkQmRVOEVRQ0FCcHlJQ0lBSW9BZ0JCQVdvMkFnQUxRUUloQWlBQUtBSUFJQUJCUUdzb0FnQWdBUkMrQXlJRFFRQk9EUUJCZnc4TElBQWdBaEFRSUFCQlFHc29BZ0FnQXhBNVFRQUxzUVVCQjM4Q1FBSkFBa0FnQUVGQWF5Z0NBQ0lMS0FLWUFpSU9RUUJJRFFCQkFpRU5Ba0FDUUNBTEtBS0FBaUFPYWlJTUxRQUFJZ2hCeHdCckRnUUVBZ0lCQUFzZ0NFSEJBRVlOQWlBSVFiNEJSd1JBSUFoQnVBRkhEUUlnRENnQUFTSUpRUWhHRFFJZ0RDOEFCU0VLSUFsQk9rY0VRQ0FKUWZFQVJnMERJQWxCelFCSERRVUxJQXN0QUc1QkFYRkZEUVFnQUVIUzZ3QkJBQkFXUVg4UEN5QU1Md0FGSVFvZ0RDZ0FBU0VKUVFFaERRd0RDMEVESVEwTUFnc2dCMEc5ZjBZRVFDQUFRWlB2QUVFQUVCWkJmdzhMSUFkQjZ3QnFRUUZOQkVBZ0FFSGE4d0JCQUJBV1FYOFBDeUFIUVY5eFFkc0FSZ1JBSUFCQmhTOUJBQkFXUVg4UEN5QUFRYlR2QUVFQUVCWkJmdzhMSUF3b0FBRWhDVUVCSVEwTFFYOGhCeUFMUVg4MkFwZ0NJQXNnRGpZQ2hBSUNRQUpBSUFZRVFBSkFBa0FDUUFKQUlBaEJ4d0JyRGdRQkF3TUNBQXNDUUNBSVFjRUFSd1JBSUFoQnZnRkdEUUVnQ0VHNEFVY05CQ0FMRURJaEJ5QUFRYnNCRUJBZ0FDQUpFQm9nQUVGQWF5SUdLQUlBSUFjUU9TQUdLQUlBSUFvUUZ5QUxJQWRCQVJCcEdrRThJUWdnQUVFOEVCQU1Cd3NnQUVIQ0FCQVFJQUFnQ1JBYVFjRUFJUWdNQmdzZ0FFRy9BUkFRSUFBZ0NSQWFJQUJCUUdzb0FnQWdDaEFYUWI0QklRZ01CUXNnQUVIeEFCQVFJQUJCRXhBUVFjY0FJUWdNQXdzZ0FFSHdBQkFRSUFCQkZCQVFRY29BSVFnTUFnc1FBUUFMQWtBQ1FBSkFJQWhCeHdCckRnUUJCQVFDQUFzZ0NFRzRBVWNOQXlBTEVESWhCeUFBUWJzQkVCQWdBQ0FKRUJvZ0FFRkFheUlBS0FJQUlBY1FPU0FBS0FJQUlBb1FGeUFMSUFkQkFSQnBHa0U4SVFnTUF3c2dBRUh4QUJBUVFjY0FJUWdNQWdzZ0FFSHdBQkFRUWNvQUlRZ01BUXNnQUNBSUVCQUxJQUVnQ0RZQ0FDQUNJQW8yQWdBZ0F5QUpOZ0lBSUFRZ0J6WUNBQ0FGQkVBZ0JTQU5OZ0lBQzBFQUM4Y01BUVovSXdCQklHc2lCQ1FBQWtBQ1FBSkFBa0FDUUFKQUFrQUNmeUFBS0FJUUlnSkJnMzlIQkVCQkFDQUNRVmxIRFFFYUlBQkJRR3NvQWdBaUFpMEFiRUVCY1VVRVFDQUFRWm54QUVFQUVCWU1Bd3NnQWlnQ1pFVUVRQ0FBUWF6TkFFRUFFQllNQXd0QmZ5RURJQUFRRWcwSUFrQUNRQUpBQWtBZ0FDZ0NFQ0lGUVNsckRnUUNBUUVDQUFzZ0JVSGRBRVlnQlVFNmEwRUNTWElnQlVIOUFFWnlEUUVMSUFBb0FqQU5BRUVBSVFJZ0JVRXFSZ1JBSUFBUUVnMExRUUVoQWdzZ0FDQUJFTFlCUlEwQkRBb0xJQUJCQmhBUVFRQWhBZ3NnQUVGQWF5SUZLQUlBSWdNdEFHd2hBU0FDQkVBZ0F4QXlJUU1nQlNnQ0FCQXlJUUlnQUVIK0FFSDlBQ0FCUVFOR0d4QVFJQUJCRGhBUUlBQkJCaEFRSUFCQkJoQVFJQUFnQXhBZUlBQkJoUUVRRUNBQlFRTkhJZ2RGQkVBZ0FFR0xBUkFRQ3lBQVFZRUJFQkFnQUVIQ0FCQVFJQUJCNlFBUUdpQUFRZW9BUVg4UUhDRUdJQUFnQWhBZVFZa0JJUVVnQUNBSEJIOUJpUUVGSUFCQndRQVFFQ0FBUWNBQUVCb2dBRUdMQVJBUVFZb0JDeEFRSUFCQkVSQVFJQUJCNmdCQmZ4QWNJUVVnQUVFT0VCQWdBRUhyQUNBREVCd2FJQUFnQlJBZUlBQkJBUkFRSUFCQlFHc2lBeWdDQUVFQ0VEa2dBRUdyQVJBUUlBQkI2Z0JCZnhBY0lRVWdBVUVEUnlJSFJRUkFJQUJCaXdFUUVBc2dBRUdHQVJBUUlBTW9BZ0JCQUJCa0lBQkI2Z0JCZnhBY0lRTWdCMFVFUUNBQVFZc0JFQkFMSUFCQmdRRVFFQ0FBUWNJQUVCQWdBRUhwQUJBYUlBQkI2UUFnQWhBY0dpQUFRY0VBRUJBZ0FFSEFBQkFhSUFBZ0F4QWVJQUJCRHhBUUlBQkJEeEFRSUFCQkR4QVFJQUJCQVJEbEFpQUFJQVVRSGlBQVFZWUJFQkFnQUVGQWF5SURLQUlBUVFFUVpDQUFRZW9BUVg4UUhDRUZJQUZCQTBjaUFVVUVRQ0FBUVlzQkVCQUxJQUJCZ1FFUUVDQUFRY0lBRUJBZ0FFSHBBQkFhSUFCQjZRQWdBaEFjR2lBQVFlc0FJQVlRSEJvZ0FDQUZFQjRnQUVHR0FSQVFJQU1vQWdCQkFoQmtJQUJCNmdCQmZ4QWNJUUlnQVVVRVFDQUFRWXNCRUJBTElBQWdBaEFlSUFCQk1CQVFRUUFoQXlBQVFRQVFHaUFBUVVCcktBSUFRUVFRWkNBQUlBWVFIaUFBUWNFQUVCQWdBRUhBQUJBYUlBQkJEeEFRSUFCQkR4QVFJQUJCRHhBUURBa0xJQUZCQTBZRVFDQUFRWXNCRUJBTElBQkJpQUVRRUNBQVFla0FRWDhRSENFQklBQkJBUkRsQWd3RUN5QUFLQUlnQ3lFRlFYOGhBeUFBUWFOL0lBRkJCSElRdWdNTkJpQUFLQUlRSWdKQnFIOUdCRUFnQVVGN2NTRUdJQUJCUUdzb0FnQVFNaUVDQTBBZ0FCQVNEUWdnQUVFUkVCQWdBRUd3QVJBUUlBQkI2UUFnQWhBY0dpQUFRUTRRRUNBQVFRZ2dCaENlQWcwSUlBQW9BaEJCcUg5R0RRQUxJQUFnQWhBZUlBQW9BaEFoQWdzZ0FrRS9SZ1JBSUFBUUVnMEhJQUJCNlFCQmZ4QWNJUUlnQUJCV0RRY2dBRUU2RUN3TkJ5QUFRZXNBUVg4UUhDRUdJQUFnQWhBZUlBQWdBVUVCY1JDMkFRMEhJQUFnQmhBZUlBQW9BaEFoQWdzZ0FrRTlSeUFDUWZzQWFpSURRUXhMY1VVRVFDQUFFQklOQVNBQUlBUkJIR29nQkVFWWFpQUVRUlJxSUFSQkVHcEJBQ0FDUVQxSElBSVF0UUZCQUVnTkFTQUFJQUVRdGdFRVFDQUFLQUlBSUFRb0FoUVFFd3dDQ3lBQ1FUMUdCRUFnQkNnQ0hDSUJRVHhIRFFjZ0JDZ0NGQ0FGUncwR0lBQWdCUkNoQVF3R0N5QUFRYkovSUFOQjhOSUJhaTBBQUNJQklBTkJBa1liSUFFZ0FDZ0NRQzBBYmtFRWNSdEIvd0Z4RUJBZ0JDZ0NIQ0VCREFZTFFRQWhBeUFDUWU0QWFrRUNTdzBHSUFBUUVnMEFJQUFnQkVFY2FpQUVRUmhxSUFSQkZHb2dCRUVRYWlBRVFReHFRUUVnQWhDMUFVRUFTQTBBSUFCQkVSQVFJQUpCbEg5R0JFQWdBRUd3QVJBUUN5QUFRZW9BUWVrQUlBSkJrMzlHRzBGL0VCd2hBaUFBUVE0UUVDQUFJQUVRdGdGRkRRRWdBQ2dDQUNBRUtBSVVFQk1MUVg4aEF3d0ZDeUFFS0FJY0lnRkJQRWNnQkNnQ0ZDSURJQVZIY2tVRVFDQUFJQVVRb1FFTElBUW9BZ3hCQVdzaUJVRURUdzBCSUFBZ0JVRVZha0gvQVhFUUVDQUFJQUVnQkNnQ0dDQURJQVFvQWhCQkFVRUFFTUVCSUFCQjZ3QkJmeEFjSVFFZ0FDQUNFQjRnQkNnQ0RDRURBMEFnQXdSQUlBQkJEeEFRSUFRZ0JDZ0NERUVCYXlJRE5nSU1EQUVMQ3dzZ0FDQUJFQjVCQUNFRERBTUxFQUVBQzBFOElRRUxRUUFoQXlBQUlBRWdCQ2dDR0NBRUtBSVVJQVFvQWhCQkFrRUFFTUVCQ3lBRVFTQnFKQUFnQXd0YUFRTi9Jd0JCRUdzaUFTUUFBa0FnQUNnQ0VDSURRYXgvUmcwQUlBTkJPMGNFUUNBRFFmMEFSZzBCSUFBb0FqQU5BU0FCUVRzMkFnQWdBRUdnbUFFZ0FSQVdRWDhoQWd3QkN5QUFFQkloQWdzZ0FVRVFhaVFBSUFJTEd3QWdBQ0FCUWY4QmNSQVJJQUFvQWdRaEFTQUFJQUlRSFNBQkN6c0FBbjhnQUNBQlFZQ0FCRThFZjBGL0lBQWdBVUdBZ0FSclFRcDJRWUN3QTJvUWl3RU5BUm9nQVVIL0IzRkJnTGdEY2dVZ0FRc1Fpd0VMQ3lrQkFYOGdBa0lnaUtkQmRVOEVRQ0FDcHlJRElBTW9BZ0JCQVdvMkFnQUxJQUFnQVNBQ0VJc0ZDeWtCQVg4Z0FrSWdpS2RCZFU4RVFDQUNweUlESUFNb0FnQkJBV28yQWdBTElBQWdBU0FDRUtzRkM0WUdBd2QvQW53Q2ZpTUFRVEJySWdja0FFRUhJQUpDSUlpbklnUWdCRUVIYTBGdVNSc2hCVUVBSVFRQ1FBSkFBa0FDUUFKQUFud0NRQUpBQWtBQ1FBSkFBa0FDUUVFSElBRkNJSWluSWdZZ0JrRUhhMEZ1U1JzaUJrRUxhZzRUQ2dnSkF3SUxDd3NMQ3dRRkFBRUJDd3NMQmdzTElBVkJBVWNOQ2lBQnB5QUNwMFloQkF3TEN5QUZJQVpHSVFRTUNRc2dCVUY1UncwSUlBR25JQUtuRUlNQ1JTRUVEQWdMSUFHbklBS25SaUFGUVhoR2NTRUVEQWNMSUFWQmYwY05CaUFCcHlBQ3AwWWhCQXdHQ3lBQnA3Y2hDeUFGUVFkSEJFQWdCUTBHSUFLbnR3d0NDeUFDUW9DQWdJREFnWUQ4L3dCOHZ3d0JDeUFCUW9DQWdJREFnWUQ4L3dCOHZ5RUxJQVVFUUNBRlFRZEhEUVVnQWtLQWdJQ0F3SUdBL1A4QWZMOE1BUXNnQXFlM0N5RU1Ba0FnQXdSQUlBeTlJZ0pDLy8vLy8vLy8vLy8vQUlNaUFVS0JnSUNBZ0lDQStQOEFWQ0FMdlNJTlF2Ly8vLy8vLy8vLy93Q0RJZzVDZ0lDQWdJQ0FnUGovQUZoeFJRUkFJQTVDZ1lDQWdJQ0FnUGovQUZRZ0FVS0FnSUNBZ0lDQStQOEFWbk1oQkF3SEN5QURRUUpIRFFFTElBc2dER0VoQkF3RkN5QUNJQTFSSVFRTUJBc2dCVUYyUncwQ0lBQWdCMEVjYWlJR0lBRVF1d0lpQXlBQUlBZEJDR29nQWhDN0FpSUZFSUlDSVFRZ0F5QUdSZ1JBSUFkQkhHb1FHd3NnQlNBSFFRaHFSdzBDSUFkQkNHb1FHd3dDQ3lBRlFYZEhEUUVnQXFjaUJVRUVhaUVJSUFHbklnWkJCR29oQ1FKQUFrQUNRQUpBQWtBQ1FBSkFJQU1PQXdZQkFBRUxJQVlvQWd3aUJFR0FnSUNBZUVjTkFVRUJJUVFnQlNnQ0RFR0FnSUNBZUVZTkJ5QUZLQUlNSVFOQmdJQ0FnSGdoQkF3Q0N5QUdLQUlNSVFRTElBVW9BZ3doQXlBRVFmLy8vLzhIUmcwQkN5QURRZi8vLy84SFJ5RUtRZi8vLy84SElRTWdDZzBCQ3lBRElBUkdJUVFNQXd0QkFDRUVJQVlvQWdnaUF5QUZLQUlJUncwQ1FRQWdDU0FJRU5NQklnUnJJQVFnQXh0RklRUU1BZ3NnQ1NBSUVJSUNJUVFNQVFzZ0JVRjFSdzBBSUFHblFRUnFJQUtuUVFScUVJZ0RSU0VFQ3lBQUlBRVFEeUFBSUFJUUR3c2dCMEV3YWlRQUlBUUxOd0VCZnlBQUlBSVFNU0VGSUFBZ0FoQVBJQVZGQkVBZ0FDQURFQTlCZnc4TElBQWdBU0FGSUFNZ0JCQVpJUVFnQUNBRkVCTWdCQXZDQVFFRmZ5TUFRU0JySWdVa0FBSitBa0FnQWtLQWdJQ0FjSU5DZ0lDQWdKQi9VZ1JBSUFBZ0FoQTNJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BUXNnQUNBRlFRaHFJQUVRUHlJSElBTVFQeUlJYWlBQ3B5SUdLQUlFSWdSQi8vLy8vd2R4YWlBRVFSOTJFSW9ERFFBZ0JVRUlhaUlFSUFFZ0J4Q0lBaG9nQkNBR1FRQWdCaWdDQkVILy8vLy9CM0VRVVJvZ0JDQURJQWdRaUFJYUlBQWdBaEFQSUFRUU5nd0JDeUFBSUFJUUQwS0FnSUNBNEFBTElRSWdCVUVnYWlRQUlBSUxJQUVCZmlBQUlBQWdBaUFCSUFOQkJFRUFFSUlCSWdVZ0FTQUVFTjRCSUFVTE5BRUJmeUFBUVVCcklnRW9BZ0FvQXFRQlFRQk9CRUFnQUVFR0VCQWdBRUhaQUJBUUlBRW9BZ0FpQUNBQUx3R2tBUkFYQ3d1SkF3QUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBRkJ4d0JyRGdRQkRRMENBQXNnQVVFOFJ3UkFJQUZCdmdGSEJFQWdBVUc0QVVZTkJ5QUJRY0VBUncwT0MwRVZJUVFDUUNBRkRnVUdCZ1VFQUE0TFFSc2hCQXdFQ3lBQUtBSUFJQU1RRXlBQUlBUVFIZ3RCc3dFaEJBSkFBa0FDUUNBRkRnVUZCZ0FCQWc0TFFSWWhCQXdFQzBFWklRUU1Bd3RCSFNFRURBSUxRUmNoQVFKQUlBVU9CUW9LQ1FnQUN3dEJIeUVCREFnTFFSZ2hCQXNnQUNBRUVCQUxBa0FnQVVISEFHc09CQU1JQ0FjQUN5QUJRVHhHRFFNZ0FVSEJBRVlOQ0NBQlFiNEJSZzBCSUFGQnVBRkhEUWNMSUFWQkFrOE5DQ0FBUWIwQlFia0JJQVliRUJBTUNRc2dBRUhBQVJBUURBZ0xJQUJCeVFBUUVBOExJQUJCUFJBUUR3dEJHaUVCQ3lBQUlBRVFFQXNnQUVITEFCQVFEd3NRQVFBTElBQkJ3d0FRRUNBQVFVQnJLQUlBSUFNUU9ROExRZjZFQVVHdS9BQkJ0N2tCUWFMaEFCQUFBQXNnQUVGQWF5SUFLQUlBSUFNUU9TQUFLQUlBSUFKQi8vOERjUkFYQzgwVEFRdC9Jd0JCUUdvaUJpUUFJQVJCQUVnRVFDQUFJQVpCS0dwQkFCQ2VBUm9nQmlnQ0tFRUNjU0VFQ3lBQVFVQnJJZ2NvQWdBUU1pRUxJQWNvQWdBUU1pRU1JQWNvQWdBb0FvUUNJUTRDUUNBREJFQWdBRUVSRUJBZ0FFRUdFQkFnQUVHckFSQVFJQUJCNmdBZ0N4QWNHaUFBSUF3UUhnd0JDeUFBUWVzQUlBc1FIQm9nQUNBTUVCNGdBRUVSRUJBTElBQkJRR3NvQWdBb0FvUUNJUThDUUFKQUFrQUNRQUpBSUFBb0FoQWlCMEhiQUVjRVFDQUhRZnNBUmdSQVFYOGhCeUFBRUJJTkJpQUFRZThBRUJBZ0JBUkFJQUJCQ3hBUUlBQkJHeEFRQ3lBQlFVdEdJQUZCVTBaeUlRMGdBVUd6ZjBjaEVBTkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQUtBSVFJZ2RCcDM5SEJFQWdCMEg5QUVZTkN5QUFJQVpCT0dwQkFFRUJRUUFReEFNaUIwRUFTQTBTSUFaQnVBRTJBakFnQmtFQU5nSTBJQUJCUUdzaUNTZ0NBQ0lLS0FLOEFTRUlJQVpCZnpZQ1BDQUdJQWcyQWl3Z0JrRUFOZ0lJSUFjTkFpQUFFQkpGRFFFZ0JpZ0NPQ0VIREFZTElBUkZCRUFnQUNnQ0FFR0kwUUJCQUJCR0RCSUxRWDhoQnlBQUVCSU5FZ0pBSUFFRVFDQUdJQUFnQWhDOEF5SUlOZ0kwSUFoRkRSUWdCa0c0QVRZQ01DQUFRVUJyS0FJQUtBSzhBU0VISUFaQmZ6WUNQQ0FHSUFjMkFpd2dCa0VBTmdJSURBRUxJQUFRb3dJTkV5QUFJQVpCTUdvZ0JrRXNhaUFHUVRScUlBWkJQR29nQmtFSWFrRUFRZnNBRUxVQkRSTUxJQUFvQWhCQi9RQkdEUUlnQUVIb0prRUFFQllNRUFzQ1FDQUFLQUlRUVNCeVFmc0FSdzBBSUFBZ0JrRW9ha0VBRUo0QklnZEJMRVlnQjBIOUFFWnlSU0FIUVQxSGNRMEFBa0FnQmlnQ09DSUhSUVJBSUFRRVFDQUFRZkFBRUJBZ0FFRVlFQkFnQUVFSEVCQWdBRUhSQUJBUUlBQkJHQkFRQ3lBQVFjZ0FFQkFNQVFzZ0JBUkFJQUJCR3hBUUlBQkJCeEFRSUFCQnpBQVFFQ0FBSUFjUUdpQUFRUnNRRUFzZ0FFSENBQkFRSUFrb0FnQWdCeEE1QzBGL0lRY2dBQ0FCSUFKQkFVRi9RUUVRd2dGQkFFZ05FaUFBS0FJUVFmMEFSZzBLSUFCQkxCQXNSUTBMREJJTEFrQUNmeUFHS0FJNElnZEZCRUFnQUVIeEFCQVFJQVJGQkVCQkVpRUlEQU1MUVJnaENpQUFRUmdRRUNBQVFRY1FFQ0FBUWRFQUVCQkJFZ3dCQ3lBRVJRUkFRUkVoQ0F3Q0MwRWJJUW9nQUVFYkVCQWdBRUVIRUJBZ0FFSE1BQkFRSUFBZ0J4QWFRUkVMSVFnZ0FDQUtFQkFMSUFBZ0NCQVFJQUVFUUNBR0lBQWdBaEM4QXlJSU5nSTBJQWhGRFFVZ0IwVU5CQXdHQ3lBQUVLTUNEUVFNQWdzQ1FDQUNCSDhnQUNBR0tBSTRJZ2NRMXdRTkJTQUpLQUlBQlNBS0N5MEFia0VCY1VVTkFDQUdLQUk0SWdkQnpRQkhJQWRCT2tkeERRQWdBRUdGTDBFQUVCWU1CQXNnQkFSQUlBQkJHeEFRSUFCQkJ4QVFJQUJCekFBUUVDQUFJQVlvQWpnUUdpQUFRUnNRRUFzZ0FVRUFJQkFiUlFSQUlBQkJFUkFRSUFCQnVBRVFFQ0FBSUFZb0FqZ2lCeEFhSUFrb0FnQWlDQ0FJTHdHOEFSQVhEQUlMSUFZZ0FDZ0NBQ0FHS0FJNEVCZ2lCellDTkNBQVFjSUFFQkFnQ1NnQ0FDQUhFRGtNQmdzZ0FFRUxFQkFnQUVIVEFCQVFJQUJCUUdzb0FnQWdCaWdDQ0NJSFFRSjBRUVJxSUFkQkJYUkJRR3R5UWZ3QmNSQmtEQVFMSUFBZ0JrRXdhaUFHUVN4cUlBWkJOR29nQmtFOGFpQUdRUWhxUVFCQit3QVF0UUVOQVNBR0tBSUlJUWdDUUFKQUlBZEZCRUJCSGlFSEFrQWdDRUVCYXc0REF3SUFCQXRCSUNFSElBQkJJQkFRREFJTElBaEJBV3NpQ0VFRFR3MEVJQUFnQ0VFQmRFRWJha0gvQVhFUUVBd0VDMEVjSVFjTElBQWdCeEFRQ3lBQVFjY0FFQkFNQWdzZ0FDZ0NBQ0FIRUJNTUNnc2dBRUhCQUJBUUlBa29BZ0FnQnhBNUN5QUJSUTBCSUFZb0FqUWhCd3NnQUNBSElBRVFvUUlOQnlBR0lBQkJRR3NvQWdBb0Fyd0JOZ0lzQ3dKQUlBQW9BaEJCUFVjRVFDQUdLQUl3SVFjTUFRc2dBRUVSRUJBZ0FFRUdFQkFnQUVHckFSQVFJQUJCNlFCQmZ4QWNJUWdnQUJBU0RRY2dBRUVPRUJBZ0FCQldEUWNnQmlnQ01DSUhRYmdCUnlBSFFUeEhjVVVFUUNBQUlBWW9BalFRb1FFTElBQWdDQkFlQ3lBQUlBY2dCaWdDTENBR0tBSTBJQVlvQWp4QkFTQU5FTUVCSUFBb0FoQkIvUUJHRFFCQmZ5RUhJQUJCTEJBc1JRMEJEQWdMQ3lBQVFRNFFFQ0FFQkVBZ0FFRU9FQkFMUVg4aEJ5QUFFQkpGRFFJTUJnc2dBRUhqSUVFQUVCWU1CQXNnQUJBU0RRTWdCaUFBUVVCcklna29BZ0FpQkNnQ3NBSTJBZ2dnQkNBR1FRaHFOZ0t3QWlBR1FYODJBaHdnQmtMLy8vLy9MemNDRkNBR1FvQ0FnSUJ3TndJTUlBUW9BcndCSVFRZ0JrRUJOZ0lrSUFZZ0JEWUNJQ0FBUWYwQUVCQWdBVUZMUmlBQlFWTkdjaUVOQTBBQ1FDQUFLQUlRSWdkQjNRQkdEUUFnQnlJRVFhZC9SeUlLUlFSQUlBQVFFZzBHUWNDUUFTRUlJQUFvQWhBaUJFRXNSaUFFUWQwQVJuSU5CQXNDUUFKQUlBUkIrd0JHSUFSQjJ3Qkdja1VFUUNBRVFTeEhEUUVnQUVHQUFSQVFJQWtvQWdCQkFCQmtJQUJCRGhBUUlBQkJEaEFRREFJTElBQWdCa0VvYWtFQUVKNEJJZ1JCTEVZZ0JFSGRBRVp5UlNBRVFUMUhjUTBBQWtBZ0NrVUVRQ0FFUVQxR0JFQkJ6T0VBSVFnTUNBc2dBRUVBRU5ZRURBRUxJQUJCZ0FFUUVDQUpLQUlBUVFBUVpDQUFRUTRRRUFzZ0FDQUJJQUpCQVNBR0tBSW9RUUp4UVFFUXdnRkJBRWdOQnd3QkN5QUdRUUEyQWpnZ0JrRUFOZ0kwQWtBZ0FRUkFJQVlnQUNBQ0VMd0RJZ1EyQWpRZ0JFVU5CeUFBSUFRZ0FSQ2hBZzBISUFaQnVBRTJBakFnQmlBSktBSUFLQUs4QVRZQ0xBd0JDeUFBRUtNQ0RRY2dBQ0FHUVRCcUlBWkJMR29nQmtFMGFpQUdRVHhxSUFaQk9HcEJBRUhiQUJDMUFRMEhDd0pBSUFwRkJFQWdBQ0FHS0FJNEVOWUVEQUVMSUFCQmdBRVFFQ0FKS0FJQUlBWXRBRGdRWkNBQVFRNFFFQ0FBS0FJUVFUMUhEUUFnQUVFUkVCQWdBRUVHRUJBZ0FFR3JBUkFRSUFCQjZRQkJmeEFjSVFRZ0FCQVNEUVlnQUVFT0VCQWdBQkJXRFFZZ0JpZ0NNQ0lJUWJnQlJ5QUlRVHhIY1VVRVFDQUFJQVlvQWpRUW9RRUxJQUFnQkJBZUN5QUFJQVlvQWpBZ0JpZ0NMQ0FHS0FJMElBWW9BanhCQVNBTkVNRUJDeUFBS0FJUVFkMEFSZzBBSUFkQnAzOUdCRUJCNmVRQUlRZ01CQXNnQUVFc0VDeEZEUUVNQlFzTElBQkJnd0VRRUNBQVFVQnJLQUlBSWdFZ0FTZ0NzQUlvQWdBMkFyQUNJQUFRRWcwREN3SkFJQVZGRFFBZ0FDZ0NFRUU5UncwQVFYOGhCeUFBUWVzQVFYOFFIQ0VCSUFBUUVnMEVJQUFnQ3hBZUlBTUVRQ0FBUVE0UUVBc2dBQkJXRFFRZ0FFSHJBQ0FNRUJ3YUlBQWdBUkFlUVFFaEJ3d0VDeUFEUlFSQUlBQkJoYzhBUVFBUUZnd0RDeUFBUVVCcklnQW9BZ0FvQW9BQ0lBNXFRYk1CSUE4Z0Rtc1FLeG9nQUNnQ0FDZ0NwQUlnQzBFVWJHb2lBQ0FBS0FJQVFRRnJOZ0lBUVFBaEJ3d0RDeUFBSUFoQkFCQVdEQUVMSUFBb0FnQWdCaWdDTkJBVEMwRi9JUWNMSUFaQlFHc2tBQ0FIQzQwQ0FRSi9Jd0JCTUdzaUJTUUFBbjhnQWlBQktBSUFUd1JBSUFVZ0FqWUNKQ0FGSUFNMkFpQWdBRUg3a2dFZ0JVRWdhaEJHUVg4TUFRc0NRQ0FCS0FJRUlBUk9EUUFnQVNBRU5nSUVJQVJCLy84RFNBMEFJQVVnQWpZQ0JDQUZJQU0yQWdBZ0FFR2prd0VnQlJCR1FYOE1BUXNnQVNnQ0NDQUNRUUYwYWlJREx3RUFJZ1pCLy84RFJ3UkFRUUFnQkNBR1JnMEJHaUFGSUFJMkFoZ2dCU0FFTmdJVUlBVWdCallDRUNBQVFkU1NBU0FGUVJCcUVFWkJmd3dCQ3lBRElBUTdBUUJCZnlBQUlBRkJER3BCQkNBQlFSUnFJQUVvQWhCQkFXb1FlQTBBR2lBQklBRW9BaEFpQUVFQmFqWUNFQ0FCS0FJTUlBQkJBblJxSUFJMkFnQkJBQXNoQXlBRlFUQnFKQUFnQXdzVEFDQUFJQUVnQWlBRElBUkJBRUVBRVBnQkN6a0FJQUJCL3dCTkJFQWdBRUVEZGtIOC8vLy9BWEZCb0lFQ2FpZ0NBQ0FBZGtFQmNROExJQUJCZm5GQmpNQUFSaUFBRU5JRVFRQkhjZ3RtQVFGL0FuOUJBQ0FBS0FJSUlnSWdBVThOQUJwQmZ5QUFLQUlNRFFBYUlBQW9BaFFnQUNnQ0FDQUNRUU5zUVFGMklnSWdBU0FCSUFKSkd5SUJJQUFvQWhBUkFRQWlBa1VFUUNBQVFRRTJBZ3hCZnc4TElBQWdBVFlDQ0NBQUlBSTJBZ0JCQUFzTHJBRUNBWDhCZmlBQUtRSUVJZ1NuUWYvLy8vOEhjU0VEQWtBQ1FDQUVRb0NBZ0lBSWcxQkZCRUFnQWlBRElBSWdBMG9iSVFNZ0FFRVFhaUVBQTBBZ0FpQURSZzBDSUFBZ0FrRUJkR292QVFBZ0FVWU5BeUFDUVFGcUlRSU1BQXNBQ3lBQlFmOEJTdzBBSUFJZ0F5QUNJQU5LR3lFRElBQkJFR29oQUNBQlFmOEJjU0VCQTBBZ0FpQURSZzBCSUFBZ0Ftb3RBQUFnQVVZTkFpQUNRUUZxSVFJTUFBc0FDMEYvSVFJTElBSUxwZ0VCQVg4akFFRVFheUlESkFBZ0F5QUNOd01JQWtBZ0FDQUJRWVlCSUFGQkFCQVVJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFJUU9BUkFJQUFnQWlBQlFRRWdBMEVJYWhBdklnSkMvLy8vLzI5V0lBSkNnSUNBZ0xCL2cwS0FnSUNBSUZGeURRRWdBQ0FDRUE4Z0FFR0swd0JCQUJBVlFvQ0FnSURnQUNFQ0RBRUxJQUFnQWhBUElBQWdBU0FESUFOQkNHb1E4UVFoQWdzZ0EwRVFhaVFBSUFJTG93RUNBMzhCZmlBQVFSQnFJUUlnQVNnQ0FDSUVRUUZxSVFNQ1FDQUFLUUlFSWdWQ2dJQ0FnQWlEVUVVRVFDQUNJQVJCQVhScUx3RUFJZ0JCZ1BnRGNVR0FzQU5ISUFNZ0JhZEIvLy8vL3dkeFRuSU5BU0FDSUFOQkFYUnFMd0VBSWdKQmdQZ0RjVUdBdUFOSERRRWdBRUVLZEVHQStEOXhJQUpCL3dkeGNrR0FnQVJxSVFBZ0JFRUNhaUVEREFFTElBSWdCR290QUFBaEFBc2dBU0FETmdJQUlBQUxVUUVEZndKQUEwQWdBVUtBZ0lDQWNGUU5BU0FCcHlJQ0x3RUdJZ1JCTUVZRVFDQUNLQUlnSWdKRkRRSWdBaTBBRVFSQUlBQVF0Z0pCZnc4TElBSXBBd0FoQVF3QkN3c2dCRUVDUmlFREN5QURDeElBSUFBZ0FTQUNJQU1nQkVIS0FCQ2tCQXRPQVFGL0lBQW9BZ3dpQkVVRVFFRUFEd3NnQUNBQUtBSUlRZi8vLy84RFFZR0FnSUI4SUFFZ0FVR0JnSUNBZkV3YklnRWdBVUgvLy8vL0EwNGJhallDQ0NBQUlBSWdBeUFFUVFBUXFnTUxKUUFnQUNBQklBQW9BaEFvQW93QklnQUVmeUFBS0FJb1FRSjJRUUZ4QlVFQUN4Q1dCUXNmQVFGL0lBQW9BZ3dpQTBVRVFFRUFEd3NnQUNBQklBSWdBMEVBRUtvREM5MEJBZ0ovQW40Q1FDQUFJQUFwQXpCQkR4QkpJZ2hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFSQkEzUkJDR29RS1NJR1JRUkFJQUFnQ0JBUERBRUxJQVlnQXpzQkJpQUdJQVE2QUFVZ0JpQUNPZ0FFSUFZZ0FUWUNBRUVBSVFNZ0JFRUFJQVJCQUVvYklRRURRQ0FCSUFOSEJFQWdCU0FEUVFOMElnUnFLUU1BSWdsQ0lJaW5RWFZQQkVBZ0NhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBRUlBWnFJQWszQXdnZ0EwRUJhaUVEREFFTEN5QUlRb0NBZ0lCd1dnUkFJQWluSUFZMkFpQUxJQUFnQ0VFdklBSVFsZ01nQ0E4TFFvQ0FnSURnQUF1REN3SUhmd0YrSXdCQklHc2lDU1FBQWtBQ1FBSkFBa0FDUUFKQUFuOENRQUpBQWtBQ1FBSkFJQUZDSUlpblFRRnFEZ1VEQWdJQUFRSUxJQUFnQXhBUElBQWdBa0htMHdBUWp3RkJmeUVGREFvTElBQWdBeEFQSUFBZ0FrSFIrQUFRandGQmZ5RUZEQWtMSUFBZ0FSQ05CS2NoQmd3QkN5QUJweUVHQWtBRFFDQUdLQUlRSWdkQk1Hb2hDQ0FISUFjb0FoZ2dBbkZCZjNOQkFuUnFLQUlBSVFVRFFDQUZSUVJBSUFZaEIwRUFEQVVMSUFJZ0NDQUZRUUZyUVFOMElnZHFJZ1VvQWdSSEJFQWdCU2dDQUVILy8vOGZjU0VGREFFTEN5QUdLQUlVSUFkcUlRY2dCU2dDQUNJSVFZQ0FnTUIrY1VHQWdJREFBRVlFUUNBQUlBY2dBeEFnREFVTEFrQWdDRUdBZ0lDQUFuRUVRQ0FHTHdFR1FRSkhEUUVnQWtFd1J3MERJQUFnQmlBRElBUVF5d1VoQlF3TEN5QUlRUnAyUVRCeElnaEJNRWNFUUNBSVFTQkhCRUFnQ0VFUVJ3MElJQUFnQnlnQ0JDQUJJQU1nQkJDTEF5RUZEQXdMSUFZdkFRWkJDMFlOQnlBQUlBY29BZ0FvQWhBZ0F4QWdEQVlMSUFBZ0JpQUNJQWNnQlJESUFrVU5BUXdKQ3d0QjJZQUJRYTc4QUVHUHdnQkJ1TllBRUFBQUMwSEsyQUJCcnZ3QVFaRENBRUc0MWdBUUFBQUxRUUVMSVFVRFFBSkFBa0FnQlVVRVFBSkFJQVl0QUFVaUJVRUVjVVVOQUFKQUlBVkJDSEVFUUNBQ1FRQklCRUFnQWtILy8vLy9CM0VpQlNBR0tBSW9UdzBDSUFZZ0IwY05CU0FBSUFFZ0JhMGdBeUFFRU5jQklRVU1EUXNnQmk4QkJrRVZhMEgvL3dOeFFRcExEUUlnQUNBQ0VKNERJZ2hGRFFKQmZ5RUZJQWhCQUU0TkNRd0tDeUFBS0FJUUtBSkVJQVl2QVFaQkdHeHFLQUlVSWdWRkRRRWdCU2dDR0NJSUJFQWdCaUFHS0FJQVFRRnFOZ0lBSUFBZ0JxMUNnSUNBZ0hDRUlnd2dBaUFESUFFZ0JDQUlFUzBBSVFVZ0FDQU1FQThNQ2dzZ0JTZ0NBQ0lGUlEwQklBWWdCaWdDQUVFQmFqWUNBQ0FBSUFrZ0JxMUNnSUNBZ0hDRUlnd2dBaUFGRVJjQUlRVWdBQ0FNRUE4Z0JVRUFTQTBKSUFWRkRRRWdDUzBBQUVFUWNRUkFJQUFnQ1NrREdDSU1wMEVBSUF4Q2dJQ0FnSENEUW9DQWdJQXdVaHNnQVNBRElBUVFpd01oQlNBQUlBa3BBeEFRRHlBQUlBa3BBeGdRRHd3TUN5QUFJQWtwQXdnUUR5QUpMUUFBUVFKeFJRMEhJQVlnQjBjTkF5QUFJQUVnQWlBRFFvQ0FnSUF3UW9DQWdJQXdRWURBQUJCdElRVU1DUXNnQmk4QkJrRVZhMEgvL3dOeFFRdEpEUWNMSUFZb0FoQW9BaXdoQmtFQklRVU1Bd3NnQmtVTkFBTkFJQVlvQWhBaUJVRXdhaUVLSUFVZ0JTZ0NHQ0FDY1VGL2MwRUNkR29vQWdBaEJRTkFJQVZGRFFNZ0FpQUtJQVZCQVd0QkEzUWlCV29pQ0NnQ0JFY0VRQ0FJS0FJQVFmLy8veDl4SVFVTUFRc0xJQVlvQWhRZ0JXb2hDZ0pBSUFnb0FnQWlCVUVhZGtFd2NTSUxRVEJIQkVBZ0MwRVFSdzBCSUFBZ0NpZ0NCQ0FCSUFNZ0JCQ0xBeUVGREFzTFFYOGhCU0FBSUFZZ0FpQUtJQWdReUFKRkRRRU1DZ3NMSUFWQmdJQ0F3QUJ4RFFFTUJBc2dCRUdBZ0FSeEJFQWdBQ0FERUE4Z0FDQUNFTWNDUVg4aEJRd0lDeUFIUlFSQUlBQWdBeEFQSUFBZ0JFR0FNUkJ2SVFVTUNBc2dCeTBBQlNJR1FRRnhSUVJBSUFBZ0F4QVBJQUFnQkVIMzZBQVFieUVGREFnTElBWkJCSEVFUUFKQUlBSkJBRTROQUNBR1FRaHhSU0FITHdFR1FRSkhjZzBBSUFjb0FpZ2dBa0gvLy8vL0IzRkhEUUFnQUNBSElBTWdCQkQ5QXlFRkRBa0xJQUFnQnlBQ0lBTkNnSUNBZ0RCQ2dJQ0FnREFnQkVHSHpnQnlFSUVFSVFVTUJnc2dBQ0FISUFKQkJ4QjZJZ0pGRFFZZ0FpQUROd01BREFJTFFRQWhCUXdBQ3dBTFFRRWhCUXdFQ3lBQUlBTVFEeUFBSUFRZ0FoREFBaUVGREFNTElBQWdBQ0FERUkwQklnRVFEMEYvSVFVZ0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ0lBQWdCRUdVSUJCdklRVU1BZ3NnQUNBREVBOE1BUXNnQUNBREVBOUJmeUVGQ3lBSlFTQnFKQUFnQlFzT0FDQUFRUUFnQVVFUWNoRE9BUXRoQUNBQUlBRWdBa0tBZ0lDQUNIeEMvLy8vL3c5WUJINGdBa0wvLy8vL0Q0TUZRb0NBZ0lEQWZpQUN1YjBpQWtLQWdJQ0F3SUdBL1A4QWZTQUNRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c2dBeUFFUVFkeUVMMEJDNnNCQVFoL0lBQW9BZ2dpQXlBQktBSUlJZ0pIQkVCQmYwRUJJQUlnQTBvYkR3c2dBU2dDRENJRklBQW9BZ3dpQmlBRklBVWdCa2diSWdKcklRZ2dCaUFDYXlFSkFuOERRRUVBSUFKQkFXc2lBa0VBU0EwQkdrRUFJUU5CQUNFRUlBSWdDV29pQnlBR1NRUkFJQUFvQWhBZ0IwRUNkR29vQWdBaEJBc2dBaUFJYWlJSElBVkpCRUFnQVNnQ0VDQUhRUUowYWlnQ0FDRURDeUFESUFSR0RRQUxRWDlCQVNBRElBUkxHd3NMaWdFQkFuOGdBU2dDRUNJRExRQVFSUVJBUVFBUEN3SkFJQU1vQWdCQkFVY0VRQ0FDQkg4Z0FpZ0NBQ0FEYTBFd2EwRURkUVZCQUFzaEJDQUFJQU1RemdVaUEwVUVRRUYvRHdzZ0FDZ0NFQ0FCS0FJUUVKRUNJQUVnQXpZQ0VDQUNSUTBCSUFJZ0F5QUVRUU4wYWtFd2FqWUNBRUVBRHdzZ0FDZ0NFQ0FERUpBRUlBTkJBRG9BRUF0QkFBdDdBUUYvUVg4aEJBSkFJQUFnQVJBbElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQUduSUFJUStRTWhCQ0FBSUFFUUR5QUVEUUFnQTBHQWdBRnhSUVJBUVFBaEJDQURRWUNBQW5GRkRRRWdBQ2dDRUNnQ2pBRWlBa1VOQVNBQ0xRQW9RUUZ4UlEwQkN5QUFRYXdiUVFBUUZVRi9JUVFMSUFRTE5RQWdBQ0FDUVRBZ0FrRUFFQlFpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFGQkFEWUNBRUYvRHdzZ0FDQUJJQUlRbUFFTHhBVUJCSDhqQUVFZ2F5SUlKQUFDUUFKQUFrQUNRQUpBSUFGQ2dJQ0FnSEJVSUFKQy8vLy8vdzlXY2cwQUlBS25JUVlDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQnB5SUZMd0VHUVFKckRoNEFDZ29LQ2dvSkNnb0tDZ29LQ2dvS0Nnb0tCd1lHQlFVRUJBTURBZ0VLQ3lBRktBSW9JZ2NnQmtzTkN5QUdJQWRIRFFrZ0JTMEFCVUVKY1VFSlJ3MEpJQVVvQWhBaEJnTkFBa0FnQmlnQ0xDSUhCRUFnQnlnQ0VDRUdBa0FnQnk4QkJrRUJhdzRDQUFJTkN5QUdMUUFSUlEwQ0RBd0xJQUFnQlNBRElBUVEvUU1oQnd3UEN5QUhMUUFGUVFoeERRQUxEQWtMUVg4aEJ5QUFJQWhCR0dvZ0F4QnVEUXdnQlNnQ0tDQUdUUTBHSUFVb0FpUWdCa0VEZEdvZ0NDc0RHRGtEQUF3TEMwRi9JUWNnQUNBSVFSaHFJQU1RYmcwTElBVW9BaWdnQmswTkJTQUZLQUlrSUFaQkFuUnFJQWdyQXhpMk9BSUFEQW9MSUFBZ0NFRUlhaUFERU1VRkRRY2dCU2dDS0NBR1RRMEVJQVVvQWlRZ0JrRURkR29nQ0NrRENEY0RBQXdKQzBGL0lRY2dBQ0FJUVJScUlBTVFtQUVOQ1NBRktBSW9JQVpORFFNZ0JTZ0NKQ0FHUVFKMGFpQUlLQUlVTmdJQURBZ0xRWDhoQnlBQUlBaEJGR29nQXhDWUFRMElJQVVvQWlnZ0JrME5Ba0VCSVFjZ0JTZ0NKQ0FHUVFGMGFpQUlLQUlVT3dFQURBZ0xRWDhoQnlBQUlBaEJGR29nQXhDWUFRMEhJQVVvQWlnZ0JrME5BU0FGS0FJa0lBWnFJQWdvQWhRNkFBQU1CZ3RCZnlFSElBQWdDRUVVYWlBREVNUUZEUVlnQlNnQ0tDQUdUUTBBSUFVb0FpUWdCbW9nQ0NnQ0ZEb0FBQXdGQ3lBQUlBUkJsQ0FRYnlFSERBVUxJQVVvQWlnZ0JrME5BQ0FBSUFVb0FpUWdCa0VEZEdvZ0F4QWdEQU1MSUFBZ0FoQXhJUVVnQUNBQ0VBOGdCVVVFUUNBQUlBTVFEd3dCQ3lBQUlBRWdCU0FESUFRUTBBRWhCeUFBSUFVUUV3d0RDMEYvSVFjTUFnc2dBQ0FGS0FJa0lBWkJBM1JxSUFNUUlBdEJBU0VIQ3lBSVFTQnFKQUFnQnd1dXlBRURKbjhIZmdOOEl3QkJvQUZySWdnaERpQUlKQUFnQUNnQ0VDRVdRb0NBZ0lEZ0FDRXVBa0FnQUJCN0RRQUNmd0pBQWtBQ1FBSkFBa0FnQVVMLy8vLy9iMWdFUUNBR1FRUnhSUTBCSUFHbklnY29BandoQ0NBSEtBSVlJaG9vQWlRaEZDQWFLQUlnSWhNb0FqQWhCaUFUTHdFcUlRMGdCMEVBTmdJOElBY2dGaWdDakFFMkFoQWdCeWdDSUNFVklBY29BakFoQ2lBSEtBSWtJUkVnRmlBSFFSQnFJaEkyQW93QklCRWdEVUVEZEdvaEhDQVZJUmNnQ2lFTklBY29BZ3hGRFFRTUJRc2dBYWNpR2k4QkJpSUhRUTFHRFFJZ0ZpZ0NSQ0FIUVJoc2FpZ0NFQ0lJRFFFTElBQkJtOHdBUVFBUUZRd0ZDeUFBSUFFZ0FpQUVJQVVnQmlBSUVSWUFJUzRNQkFzZ0ZpZ0NlQ0FPSUJvb0FpQWlFeThCTGlBVEx3RXFJZ3RxSUJNdkFTZ2lCeUFIUVFBZ0JDQUhTQnNnQmtFQ2NVRUJkaHNpQm1wQkEzUWlGV3RMQkVBZ0FCRHBBUXdFQ3lBVExRQVFJUW9nRGlBT1FjZ0FhaUlYTmdKTUlBNGdCRFlDVkNBT0lBbzJBbGdnRGlBWE5nSklJQTRnQVRjRE9DQWFLQUlrSVJRZ0NDQVZRUTlxUWZELy93RnhheUlYSkFBZ0JTRVZJQVlFUUNBSElBUWdCeUFFSUFkSUd5SUlRUUFnQ0VFQVNoc2lDR3NpRlVFQUlBY2dGVThiSVJFRFFBSkFJQWdnQ1VZRVFBTkFJQWdnRVVZTkFpQVhJQWhCQTNScVFvQ0FnSUF3TndNQUlBaEJBV29oQ0F3QUN3QUxJQVVnQ1VFRGRDSVZhaWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ29nQ2lnQ0FFRUJhallDQUFzZ0ZTQVhhaUFCTndNQUlCRkJBV29oRVNBSlFRRnFJUWtNQVFzTElBNGdCellDVkNBWElSVUxJQTRnRlRZQ1FDQU9JQmNnQmtFRGRHb2lFVFlDUkVFQUlRZ0RRQ0FJSUF0SEJFQWdFU0FJUVFOMGFrS0FnSUNBTURjREFDQUlRUUZxSVFnTUFRc0xJQk1vQWhRaENpQU9JQllvQW93Qk5nSXdJQllnRGtFd2FpSVNOZ0tNQVNBVEtBSXdJUVlnRVNBTFFRTjBhaUlJSVJ3TFFRQU1BUXRCQVFzaEJ3TkFBa0FDUUFKQUFrQWdCMFVFUUNBRVFRTjBJU2NnQTBLQWdJQ0FjSU1oTXlBUlFRaHFJUjBnRVVFUWFpRWVJQkZCR0dvaEh5QVZRUWhxSVNBZ0ZVRVFhaUVoSUJWQkdHb2hJaUFTUVJocUlTZ2dCa0hJQVdvaEd5QWNRUmhxSVNrZ0JrSEFBV29oR1NBQ1FpQ0lweUlrUVg1eElTb2dBMElnaUtjaEt5QUVyU0V5SUFPbklTVWdEa0V3YWlFc0lBNUI2QUJxSVNZZ0NDRUhBa0FEUUFKQUlBcEJBV29oRFVJQklTNUNnSUNBZ0RBaEFRSi9Ba0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUovQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQ2kwQUFDSUpRUUZyRHZVQkFBRWxDWklCQ2dzTURRNFBFQkVTRXhRVkdCWVhHUm9iSENFaUl5UWRJQjRmS1Njbktpb3JMTnNCK2dFdExpOHcyUUV4TWpNME5UWTNPRGs1T2pvN253R2lBVDA4UG84QmtBR1JBWk1CbEFHVkFaMEJuZ0doQWFBQm93R1dBWmNCbUFHWkFab0JwQUdtQWFjQm13R2JBWndCbkFFL1FFRkNRMFJzYlc1eWMzUjFiM0J4ZG4xOGVZQUJnUUdDQWNzQnpBSE5BYzRCemdIT0FjNEJ6Z0hPQVhkM2QzaURBWVVCaHdHRUFZWUJpUUdJQVlvQml3R01BWTBCMlFINUFkZ0IyQUhhQWJBQnJ3R3lBYkVCc3dHekFiVUJ0QUdwQWJZQmpnSElBY2tCeWdHckFhd0JyUUdvQWFvQnJnRzNBYmtCdUFHOUFiNEJ2d0hBQWNjQnhnSEJBY0lCd3dIRUFib0J2QUc3QWRRQnhRR3RBZk1CQWdJQ0FnSUNBZ0lDQXdRRkJnZEZSa2RJU1VwTFRFMU9UMUJSVWxOVVZWWlhXRmxhVzF4ZFhsOWdZV0pqWkdWbVoyaHBhbXNJZjM1N2VpWW1KaWJQQWRBQjBRSFNBZFlCQ3lBSUlBbzFBQUUzQXdBZ0NrRUZhaUVOSUFoQkNHb2hCd3p5QVFzZ0V5Z0NOQ0FOS0FBQVFRTjBhaWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQUJOd01BSUFwQkJXb2hEU0FJUVFocUlRY004UUVMSUFnZ0NVRzFBV3V0TndNQUlBaEJDR29oQnd6d0FRc2dDQ0FLTUFBQlF2Ly8vLzhQZ3pjREFDQUtRUUpxSVEwZ0NFRUlhaUVIRE84QkN5QUlJQW95QUFGQy8vLy8vdytETndNQUlBcEJBMm9oRFNBSVFRaHFJUWNNN2dFTElCTW9BalFnQ2kwQUFVRURkR29wQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBcEJBbW9oRFNBSUlBRTNBd0FnQ0VFSWFpRUhETzBCQ3lBVEtBSTBJQW90QUFGQkEzUnFLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBS1FRSnFJUTBnQ0NBR0lBRWdGQ0FTRUl3RUlnRTNBd0FnQ0VFSWFpRUhJQUZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU43QUVNN2dFTElBZ2dCa0V2RUMwM0F3QWdDRUVJYWlFSERPc0JDeUFHSUFoQkNHc2lCeWtEQUNJQlFUQWdBVUVBRUJRaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEzdUFTQUdJQWNwQXdBUUR5QUhJQUUzQXdBTTVBRUxJQWdnQmlBS0tBQUJFRnczQXdBZ0NrRUZhaUVOSUFoQkNHb2hCd3pwQVFzZ0NFS0FnSUNBTURjREFDQUlRUWhxSVFjTTZBRUxJQWhDZ0lDQWdDQTNBd0FnQ0VFSWFpRUhET2NCQ3dKQUFrQUNRQ0FrUVg5R0RRQWdFeTBBRUVFQmNRMEFJQ3BCQWtZRVFDQVpLUU1BSWk1Q0lJaW5RWFJMRFFJTUF3c2dCaUFDRUNVaUxrS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQ0RPMEJDeUFDSVM0Z0pFRjFTUTBCQ3lBdXB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0xqY0RBQ0FJUVFocUlRY001Z0VMSUFoQ2dJQ0FnQkEzQXdBZ0NFRUlhaUVIRE9VQkN5QUlRb0dBZ0lBUU53TUFJQWhCQ0dvaEJ3emtBUXNnQ0NBR0VEUWlBVGNEQUNBSVFRaHFJUWNnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZzNqQVF6bEFRc2dDa0VDYWlFTkFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBS0xRQUJEZ2NBQVFJREJBVUdCd3NDUUNBR0lBWW9BaWdwQXdoQkNCQkpJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FHSUFHbklndEJNRUVERUhvZ01qY0RBQ0FFUVFCTUJFQkJBQ0VKRE9zQkMwRUFJUWNnQmlBbkVDa2lDUTBCSUFZZ0FSQVBDeUFJUW9DQWdJRGdBRGNEQUNBSVFRaHFJUWdNN2dFTEEwQWdCQ0FIUmczcEFTQUZJQWRCQTNRaUNtb3BBd0FpTFVJZ2lLZEJkVThFUUNBdHB5SU1JQXdvQWdCQkFXbzJBZ0FMSUFrZ0Ntb2dMVGNEQUNBSFFRRnFJUWNNQUFzQUN5QVRMd0VvSVFrZ0JpQUdLQUlvS1FNSVFRa1FTU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEZVlCSUFZZ0FhY2lERUV3UVFNUWVpQXlOd01BUVFBaEJ5QUVJQWtnQkNBSlNCc2lDVUVBSUFsQkFFb2JJUThEUUNBSElBOUhCRUFnQmlBU0lBZEJBUkNMQkNJTFJRM25BU0FHSUF3Z0IwR0FnSUNBZUhKQkp4QjZJaEFFUUNBUUlBczJBZ0FnQjBFQmFpRUhEQUlGSUFZb0FoQWdDeERyQVF6b0FRc0FDd3NEUUNBRUlBbEhCRUFnQlNBSlFRTjBhaWtEQUNJdFFpQ0lwMEYxVHdSQUlDMm5JZ2NnQnlnQ0FFRUJhallDQUFzZ0JpQUJJQWtnTFVFSEVLOEJJUWNnQ1VFQmFpRUpJQWRCQUU0TkFRem5BUXNMSUFZcEE2Z0JJaTFDSUlpblFYVlBCRUFnTGFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUFGQjBRRWdMVUVERUJrYUlBWW9BaEFvQW93QktRTUlJaTFDSUlpblFYVlBCRUFnTGFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUFGQnpnQWdMVUVERUJrYUlBZ2dBVGNEQUNBSVFRaHFJUWNNNkFFTElCSXBBd2dpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0FUY0RBQ0FJUVFocUlRY001d0VMSUN0QmRVOEVRQ0FsSUNVb0FnQkJBV28yQWdBTElBZ2dBemNEQUNBSVFRaHFJUWNNNWdFTElBZ2dHaWdDS0NJSEJINGdCeUFIS0FJQVFRRnFOZ0lBSUFldFFvQ0FnSUJ3aEFWQ2dJQ0FnREFMTndNQUlBaEJDR29oQnd6bEFRc2dDQ0FHUW9DQWdJQWdFRWNpQVRjREFDQUlRUWhxSVFjZ0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcza0FRem1BUXNDUUNBR0VPSUZJZ2tFUUNBR0lBa1E0UVVoQnlBR0lBa1FFeUFIRFFFTElBWkJneVZCQUJBVklBaENnSUNBZ09BQU53TUFJQWhCQ0dvaENBem9BUXNnQnlrRGFDSXVRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUdRb0NBZ0lBZ0VFY2lMa0tBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQWhDZ0lDQWdPQUFOd01BSUFoQkNHb2hDQXpwQVFzZ0J5QXVOd05vQ3lBdVFpQ0lwMEYxVHdSQUlDNm5JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQXVOd01BSUFoQkNHb2hCeUF1UW9DQWdJQndnMEtBZ0lDQTRBQlNEZU1CRE9VQkN4QUJBQXNnQ2tFRGFpRU5JQW92QUFFaENRSkFJQVlRUGlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0JDQUpJQVFnQ1VvYklRc2dDU0VIQTBBZ0J5QUxSZzBDSUFVZ0IwRURkR29wQXdBaUxVSWdpS2RCZFU4RVFDQXRweUlNSUF3b0FnQkJBV28yQWdBTElBY2dDV3NoRENBSFFRRnFJUWNnQmlBQklBd2dMVUVIRUs4QlFRQk9EUUFMSUFZZ0FSQVBDeUFJUW9DQWdJRGdBRGNEQUNBSVFRaHFJUWdNNWdFTElBZ2dBVGNEQUNBSVFRaHFJUWNNNFFFTElBWWdDRUVJYXlJSEtRTUFFQThNNEFFTElBWWdDRUVRYXlJSEtRTUFFQThnQnlBSVFRaHJJZ2NwQXdBM0F3QU0zd0VMSUFZZ0NFRVlheUlIS1FNQUVBOGdCeUFJUVJCcklnY3BBd0EzQXdBZ0J5QUlRUWhySWdjcEF3QTNBd0FNM2dFTElBaEJDR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dBVGNEQUNBSVFRaHFJUWNNM1FFTElBaEJFR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dBVGNEQUNBSVFRaHJLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBSUlBRTNBd2dnQ0VFUWFpRUhETndCQ3lBSVFSaHJLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBSUlBRTNBd0FnQ0VFUWF5a0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnY2dCeWdDQUVFQmFqWUNBQXNnQ0NBQk53TUlJQWhCQ0dzcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnQVRjREVDQUlRUmhxSVFjTTJ3RUxJQWdnQ0VFSWF5SUhLUU1BTndNQUlBaEJFR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlLSUFvb0FnQkJBV28yQWdBTElBY2dBVGNEQUNBSVFRaHFJUWNNMmdFTElBZ2dDRUVJYXlJSEtRTUFJZ0UzQXdBZ0J5QUlRUkJySWdjcEF3QTNBd0FnQVVJZ2lLZEJkVThFUUNBQnB5SUtJQW9vQWdCQkFXbzJBZ0FMSUFjZ0FUY0RBQ0FJUVFocUlRY00yUUVMSUFnZ0NFRUlheUlIS1FNQUlnRTNBd0FnQ0VFUWF5SUtLUU1BSVMwZ0NpQUlRUmhySWdvcEF3QTNBd0FnQnlBdE53TUFJQUZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFLSUFFM0F3QWdDRUVJYWlFSEROZ0JDeUFJSUFoQkNHc2lCeWtEQUNJQk53TUFJQWhCRUdzaUNpa0RBQ0V0SUFvZ0NFRVlheUlLS1FNQU53TUFJQWNnTFRjREFDQUtJQWhCSUdzaUJ5a0RBRGNEQUNBQlFpQ0lwMEYxVHdSQUlBR25JZ29nQ2lnQ0FFRUJhallDQUFzZ0J5QUJOd01BSUFoQkNHb2hCd3pYQVFzZ0NFRVFheUlIS1FNQUlRRWdCeUFJUVJocklnY3BBd0EzQXdBZ0J5QUJOd01BRE5BQkN5QUlRUmhySWdjcEF3QWhBU0FISUFoQkVHc2lCeWtEQURjREFDQUlRUWhySWdvcEF3QWhMU0FLSUFFM0F3QWdCeUF0TndNQURNOEJDeUFJUVNCcklnY3BBd0FoQVNBSElBaEJHR3NpQnlrREFEY0RBQ0FJUVJCcklnb3BBd0FoTFNBS0lBaEJDR3NpQ2lrREFEY0RBQ0FISUMwM0F3QWdDaUFCTndNQURNNEJDeUFJUVNocklnY3BBd0FoQVNBSElBaEJJR3NpQnlrREFEY0RBQ0FJUVJocklnb3BBd0FoTFNBS0lBaEJFR3NpQ2lrREFEY0RBQ0FISUMwM0F3QWdDaUFJUVFocklnY3BBd0EzQXdBZ0J5QUJOd01BRE0wQkN5QUlRUWhySWdjcEF3QWhBU0FISUFoQkVHc2lCeWtEQURjREFDQUlRUmhySWdvcEF3QWhMU0FLSUFFM0F3QWdCeUF0TndNQURNd0JDeUFJUVJCcklnY3BBd0FoQVNBSElBaEJHR3NpQnlrREFEY0RBQ0FJUVNCcklnb3BBd0FoTFNBS0lBRTNBd0FnQnlBdE53TUFETXNCQ3lBSVFSQnJJZ2NwQXdBaEFTQUhJQWhCR0dzaUJ5a0RBRGNEQUNBSVFTQnJJZ29wQXdBaExTQUtJQWhCS0dzaUNpa0RBRGNEQUNBSElDMDNBd0FnQ2lBQk53TUFETW9CQ3lBSVFRaHJJZ2NwQXdBaEFTQUhJQWhCRUdzaUJ5a0RBRGNEQUNBSElBRTNBd0FNeVFFTElBaEJJR3NpQnlrREFDRUJJQWNnQ0VFUWF5SUhLUU1BTndNQUlBaEJDR3NpQ2lrREFDRXRJQW9nQ0VFWWF5SUtLUU1BTndNQUlBY2dBVGNEQUNBS0lDMDNBd0FNeUFFTElCTW9BalFnRFNnQUFFRURkR29wQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dCaUFCSUJRZ0VoQ01CQ0lCTndNQUlBaEJDR29oQnlBS1FRVnFJUTBnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTEvRE0wQkN5QUpRZTRCYXd3QkN5QUtRUU5xSVEwZ0NpOEFBUXNoQ3lBU0lBMDJBaUFnQmlBSUlBdEJBM1JySWd4QkNHc3BBd0JDZ0lDQWdEQkNnSUNBZ0RBZ0N5QU1RUUFRMkFFaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEzT0FVRi9JUWNnQ1VFalJnM1JBUU5BSUFjZ0MwY0VRQ0FHSUF3Z0IwRURkR29wQXdBUUR5QUhRUUZxSVFjTUFRc0xJQWdnQzBGL2MwRURkR29pQ0NBQk53TUFJQWhCQ0dvaEJ3ektBUXNnQ2k4QUFTRUpJQklnQ2tFRGFpSU5OZ0lnUVg0aEJ5QUdJQWdnQ1VFRGRHc2lDMEVRYXlrREFDQUxRUWhyS1FNQUlBa2dDMEVBRUlvRUlnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTnpRRURRQ0FISUFsSEJFQWdCaUFMSUFkQkEzUnFLUU1BRUE4Z0IwRUJhaUVIREFFTEN5QUlRWDRnQ1d0QkEzUnFJZ2dnQVRjREFDQUlRUWhxSVFjTXlRRUxJQW92QUFFaEN5QVNJQXBCQTJvaURUWUNJQ0FHSUFnZ0MwRURkR3NpREVFSWF5a0RBQ0FNUVJCcktRTUFRb0NBZ0lBd0lBc2dERUVBRU5nQklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTnpBRkJmaUVISUFsQkpVWU56d0VEUUNBSElBdEhCRUFnQmlBTUlBZEJBM1JxS1FNQUVBOGdCMEVCYWlFSERBRUxDeUFJUVg0Z0MydEJBM1JxSWdnZ0FUY0RBQ0FJUVFocUlRY015QUVMSUFwQkEyb2hEU0FLTHdBQklRc2dCaEErSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOeXdFZ0NDQUxRUU4wYXlFSlFRQWhCd0pBQTBBZ0J5QUxSZzBCSUFZZ0FTQUhRWUNBZ0lCNGNpQUpJQWRCQTNScUlnd3BBd0JCaDRBQkVCa2hEeUFNUW9DQWdJQXdOd01BSUFkQkFXb2hCeUFQUVFCT0RRQUxJQVlnQVJBUERNd0JDeUFKSUFFM0F3QWdDVUVJYWlFSERNY0JDeUFLUVFOcUlRMGdCaUFJUVJocklna3BBd0FnQ0NBSVFSQnJJZ2NnQ2k4QUFSQ2RBeUlCUW9DQWdJQndnMEtBZ0lDQTRBQlJEY29CSUFZZ0NTa0RBQkFQSUFZZ0J5a0RBQkFQSUFZZ0NFRUlheWtEQUJBUElBa2dBVGNEQUF6R0FRdENnSUNBZ0JBaExnSkFJQWhCQ0dzcEF3QWlBVUwvLy8vL2IxWU5BRUtCZ0lDQUVDRXVJQUZDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFJQUJCbFBnQVFRQVFGUXpLQVFzZ0NDQXVOd01BSUFoQkNHb2hCd3pGQVFzZ00wS0FnSUNBTUZJTnZnRWdCa0hSbEFGQkFCQVZETWdCQ3lBSVFRaHJLUU1BSWkxQy8vLy8vMjlZRGI4QklBaEJFR3NwQXdBaEFTQXRweUlITHdFR0VPNEJSUTIvQVNBSEtBSW9JZ2RGRGI4QklBY29BaEFpQ1VFd2FpRUxJQWtnQ1NnQ0dFRi9jMEVDZEVIQWVYSnFLQUlBSVFrQ1FBTkFJQWtFUUNBTElBbEJBV3RCQTNRaUNXb2lEQ2dDQkVIUEFVWU5BaUFNS0FJQVFmLy8veDl4SVFrTUFRc0xJQVpCbi9VQVFRQVFGUXpJQVFzZ0FVS0FnSUNBY0ZRTnZ3RWdCeWdDRkNBSmFpa0RBQ0l0UW9DQWdJQndnMEtBZ0lDQWdIOVNEYjhCSUFZb0FoQWdMUkNOQWlFSklBR25LQUlRSWdkQk1Hb2hDeUFISUFrZ0J5Z0NHSEZCZjNOQkFuUnFLQUlBSVFjRFFDQUhCRUFnQ3lBSFFRRnJRUU4wYWlJSEtBSUVJQWxHRGI4QklBY29BZ0JCLy8vL0gzRWhCd3dCQ3dzZ0JrR3VNRUVBRUJVTXh3RUxJQWhCQ0dzaURDa0RBQ0lCUXYvLy8vOXZXQTIrQVNBSVFSQnJJZ2twQXdBaExTQUJweUlMS0FJUUlnZEJNR29oRHlBSElBY29BaGhCZjNOQkFuUkJ3SGx5YWlnQ0FDRUhBa0FDUUFOQUlBY0VRQ0FQSUFkQkFXdEJBM1FpQjJvaUVDZ0NCRUhQQVVZTkFpQVFLQUlBUWYvLy94OXhJUWNNQVFzTElBWkI5d0FRNEFVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEzSUFTQUdJQXRCendGQkJ4QjZJZ2RGQkVBZ0JpQUJFQThNeVFFTElBRkNJSWluUVhWUEJFQWdBYWNpQ3lBTEtBSUFRUUZxTmdJQUN5QUhJQUUzQXdBTUFRc2dDeWdDRkNBSGFpa0RBQ0lCUWlDSXAwRjFTUTBBSUFHbklnY2dCeWdDQUVFQmFqWUNBQXNnQmlnQ0VDQUJFSTBDSVFjZ0xVTC8vLy8vYjFnRVFDQUdFQ1FnQmlBSEVCTU14d0VMSUFZZ0xhY2dCMEVIRUhvaEN5QUdJQWNRRXlBTFJRM0dBU0FMUW9DQWdJQXdOd01BSUFZZ0NTa0RBQkFQSUFZZ0RDa0RBQkFQSUFraEJ3ekNBUXNnQmlBSVFRaHJJZ2dwQXdBUWlnRU14UUVMSUFwQkJtb2hEU0FLS0FBQklRY0NRQUpBQWtBQ1FBSkFBa0FnQ2kwQUJTSUpEZ1VBQVFJREJBVUxJQVlnQjBIT0hSQ1BBUXpKQVFzZ0JpQUhFTjhGRE1nQkN5QUdJQWNRMlFFTXh3RUxJQVpCdnBjQlFRQVF4Z0lNeGdFTElBWkJ4dkVBUVFBUUZRekZBUXNnRGlBSk5nSVFJQVpCM2ZzQUlBNUJFR29RUmd6RUFRc2dDaThBQVNFSklBb3ZBQU1oRENBU0lBcEJCV29pRFRZQ0lFRi9JUWNDZmlBR0lBZ2dDVUVEZEdzaUMwRUlheUlQS1FNQUlBWXBBN2dCRUZJRVFDQUdRb0NBZ0lBd0lBa0VmaUFMS1FNQUJVS0FnSUNBTUF0QkFpQU1RUUZyRUp3RERBRUxJQVlnRHlrREFFS0FnSUNBTUVLQWdJQ0FNQ0FKSUF0QkFCRFlBUXNpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTNEQVFOQUlBY2dDVWNFUUNBR0lBc2dCMEVEZEdvcEF3QVFEeUFIUVFGcUlRY01BUXNMSUFnZ0NVRi9jMEVEZEdvaUNDQUJOd01BSUFoQkNHb2hCd3kvQVFzZ0NrRURhaUVOSUFvdkFBRWhEeUFHSUE1QjRBQnFJQWhCQ0dzaUJ5a0RBQkNKQkNJSlJRM0NBUUorSUFZZ0NFRVFheUlMS1FNQUlBWXBBN2dCRUZJRVFDQUdRb0NBZ0lBd0lBNG9BbUFpREFSK0lBa3BBd0FGUW9DQWdJQXdDMEVDSUE5QkFXc1FuQU1NQVFzZ0JpQUxLUU1BUW9DQWdJQXdJQTRvQW1BaURDQUpFQ0VMSVFFZ0JpQUpJQXdRbXdNZ0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEzQ0FTQUdJQXNwQXdBUUR5QUdJQWNwQXdBUUR5QUxJQUUzQXdBTXZnRUxJQWhCRUdzaUJ5QUdRb0NBZ0lBd0lBY3BBd0FnQ0VFSWF5SUhLUU1BRU40Rk53TUFETDBCQ3lBR0lBaEJDR3NpQnlrREFCRG9BU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEY0FCSUFZZ0J5a0RBQkFQSUFjZ0FUY0RBQXkyQVFzZ0NFRUlheUlIS1FNQUlRRUNRQ0FHRU9JRklnbEZCRUJDZ0lDQWdDQWhMZ3dCQ3lBR0lBa1FYQ0V1SUFZZ0NSQVRJQzVDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU53QUVMSUFZZ0RrR0FBV29RelFJaUxVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBWWdMaEFQRE1BQkN5QU9JQTRwQTRBQklpODNBMkFnRGlBQk53TjRJQTRnTGpjRGNDQU9JQTRwQTRnQklnRTNBMmdnQmtFOFFRUWdEa0hnQUdvUW1nTWdCaUF1RUE4Z0JpQXZFQThnQmlBQkVBOGdCaUFIS1FNQUVBOGdCeUF0TndNQURMVUJDeUFLUVFWcUlRMGdHeWdDQUNnQ0VDSUhRVEJxSVF3Z0J5QUtLQUFCSWdrZ0J5Z0NHSEZCZjNOQkFuUnFLQUlBSVFjQ1FBTkFJQWNFUUVFQklRc2dEQ0FIUVFGclFRTjBhaUlIS0FJRUlBbEdEUUlnQnlnQ0FFSC8vLzhmY1NFSERBRUxDeUFHSUFZcEE4QUJJQWtRY1NJTFFRQklEYjhCQ3lBSUlBdEJBRWV0UW9DQWdJQVFoRGNEQUNBSVFRaHFJUWNNdWdFTElBbEJOMnNoQ3lBS1FRVnFJUTBnR3lnQ0FDSU1LQUlRSWdkQk1Hb2hEeUFISUFvb0FBRWlDU0FIS0FJWWNVRi9jMEVDZEdvb0FnQWhCd0pBQWtBRFFDQUhSUTBCSUFrZ0R5QUhRUUZyUVFOMElnZHFJaEFvQWdSSEJFQWdFQ2dDQUVILy8vOGZjU0VIREFFTEN5QU1LQUlVSUFkcUtRTUFJaTVDZ0lDQWdIQ0RJZ0ZDZ0lDQWdNQUFVUVJBSUFZZ0NSRFpBUXpBQVFzZ0xrSWdpS2RCZFVrTkFTQXVweUlISUFjb0FnQkJBV28yQWdBTUFRc2dCaUFHS1FQQUFTSUJJQWtnQVNBTEVCUWlMa0tBZ0lDQWNJTWhBUXNnQVVLQWdJQ0E0QUJSRGIwQklBZ2dMamNEQUNBSVFRaHFJUWNNdVFFTElBcEJCV29oRFNBR0lBb29BQUVnQ0VFSWF5SUhLUU1BSUFsQk9Xc1EzUVZCQUVnTmFneTRBUXNnQ2tFRmFpRU5JQW9vQUFFaENTQUlRUkJySWdjb0FnQkZCRUFnQmlBSkVNY0NETHdCQ3lBR0lBa2dDRUVJYXlrREFFRUNFTjBGSWdoQkFFNE50d0VnQ0VFZWRrRUNjUXk0QVFzZ0NrRUdhaUVOSUJrb0FnQWlEQ2dDRUNJSlFUQnFJUThnQ1NBS0tBQUJJZ2NnQ1NnQ0dIRkJmM05CQW5ScUtBSUFJUWtnQ2l3QUJTRUxBa0FEUUNBSlJRMEJJQWNnQ1VFRGRDQVBha0VJYXlJSktBSUVSd1JBSUFrb0FnQkIvLy8vSDNFaENRd0JDd3NnQzBFQVNBUkFJQWt0QUFOQkJIRU5zUUVNc3dFTElBdEJ3QUJ4UlEyd0FTQUpLQUlBSWdsQmdJQ0FJSEVOc0FFZ0NVR0FnSUNBZkhGQmdJQ0FnQVJHRGE4QklBbEJnSUNBd0FGeFFZQ0FnTUFCUmcyd0FReXZBUXNnQzBFQVRnMnRBUXl2QVFzZ0Npd0FCU0lIUVFGeFFRWnlJQWRCQW5GQkJYSWdCMEVBVGlJSEd5RVFJQmtnR3lBSEd5Z0NBQ0lKS0FJUUlnd2dDaWdBQVNJUElBd29BaGh4UVg5elFRSjBhaWdDQUNFTElBcEJCbW9oRFNBTVFUQnFJUXdEUUNBTEJFQWdEQ0FMUVFGclFRTjBhaUlMS0FJRUlBOUdEYkVCSUFzb0FnQkIvLy8vSDNFaEN3d0JDd3NnQ1MwQUJVRUJjVVVOcndFZ0JpQUpJQThnRUJCNklnbEZEYmtCSUFsQ2dJQ0FnREJDZ0lDQWdNQUFJQWNiTndNQURLOEJDeUFLUVFacUlRMGdHU2tEQUNJQnB5Z0NFQ0lIUVRCcUlRd2dCeUFLS0FBQklnc2dCeWdDR0hGQmYzTkJBblJxS0FJQUlRY2dDaTBBQlNFUElBWWdBU0FMSUFoQkNHc2lDU2tEQUVLQWdJQ0FNRUtBZ0lDQU1BSi9Ba0FEUUNBSFJRMEJJQWRCQTNRZ0RHcEJDR3NpRUNnQ0FDRUhJQXNnRUNnQ0JFY0VRQ0FIUWYvLy94OXhJUWNNQVFzTFFZREFBU0FIUVlDQWdDQnhSUTBCR2dzZ0QwR0d6Z0Z5Q3hCdFFRQklEYmdCSUFZZ0NTa0RBQkFQSUFraEJ3eTBBUXNnRVNBS0x3QUJRUU4wYWlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDa0VEYWlFTklBZ2dBVGNEQUNBSVFRaHFJUWNNc3dFTElBWWdFU0FLTHdBQlFRTjBhaUFJUVFocklnY3BBd0FRSUNBS1FRTnFJUTBNc2dFTElCRWdDaThBQVVFRGRHb2hCeUFJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaURTQU5LQUlBUVFGcU5nSUFDeUFLUVFOcUlRMGdCaUFISUFFUUlBeXJBUXNnRlNBS0x3QUJRUU4wYWlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDa0VEYWlFTklBZ2dBVGNEQUNBSVFRaHFJUWNNc0FFTElBWWdGU0FLTHdBQlFRTjBhaUFJUVFocklnY3BBd0FRSUNBS1FRTnFJUTBNcndFTElCVWdDaThBQVVFRGRHb2hCeUFJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaURTQU5LQUlBUVFGcU5nSUFDeUFLUVFOcUlRMGdCaUFISUFFUUlBeW9BUXNnRVNBS0xRQUJRUU4wYWlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDa0VDYWlFTklBZ2dBVGNEQUNBSVFRaHFJUWNNclFFTElBWWdFU0FLTFFBQlFRTjBhaUFJUVFocklnY3BBd0FRSUNBS1FRSnFJUTBNckFFTElCRWdDaTBBQVVFRGRHb2hCeUFJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaURTQU5LQUlBUVFGcU5nSUFDeUFLUVFKcUlRMGdCaUFISUFFUUlBeWxBUXNnRVNrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDQ0FCTndNQUlBaEJDR29oQnd5cUFRc2dIU2tEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQUJOd01BSUFoQkNHb2hCd3lwQVFzZ0hpa0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnY2dCeWdDQUVFQmFqWUNBQXNnQ0NBQk53TUFJQWhCQ0dvaEJ3eW9BUXNnSHlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDQ0FCTndNQUlBaEJDR29oQnd5bkFRc2dCaUFSSUFoQkNHc2lCeWtEQUJBZ0RLWUJDeUFHSUIwZ0NFRUlheUlIS1FNQUVDQU1wUUVMSUFZZ0hpQUlRUWhySWdjcEF3QVFJQXlrQVFzZ0JpQWZJQWhCQ0dzaUJ5a0RBQkFnREtNQkN5QUlRUWhyS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUdJQkVnQVJBZ0RKd0JDeUFJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUIwZ0FSQWdESnNCQ3lBSVFRaHJLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBR0lCNGdBUkFnREpvQkN5QUlRUWhyS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUdJQjhnQVJBZ0RKa0JDeUFWS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUlJQUUzQXdBZ0NFRUlhaUVIREo0QkN5QWdLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBSUlBRTNBd0FnQ0VFSWFpRUhESjBCQ3lBaEtRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFJSUFFM0F3QWdDRUVJYWlFSERKd0JDeUFpS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUlJQUUzQXdBZ0NFRUlhaUVIREpzQkN5QUdJQlVnQ0VFSWF5SUhLUU1BRUNBTW1nRUxJQVlnSUNBSVFRaHJJZ2NwQXdBUUlBeVpBUXNnQmlBaElBaEJDR3NpQnlrREFCQWdESmdCQ3lBR0lDSWdDRUVJYXlJSEtRTUFFQ0FNbHdFTElBaEJDR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBWWdGU0FCRUNBTWtBRUxJQWhCQ0dzcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQVlnSUNBQkVDQU1qd0VMSUFoQkNHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFZZ0lTQUJFQ0FNamdFTElBaEJDR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBWWdJaUFCRUNBTWpRRUxJQlFvQWdBb0FoQXBBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0FUY0RBQ0FJUVFocUlRY01rZ0VMSUJRb0FnUW9BaEFwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dBVGNEQUNBSVFRaHFJUWNNa1FFTElCUW9BZ2dvQWhBcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnQVRjREFDQUlRUWhxSVFjTWtBRUxJQlFvQWd3b0FoQXBBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0FUY0RBQ0FJUVFocUlRY01qd0VMSUFZZ0ZDZ0NBQ2dDRUNBSVFRaHJJZ2NwQXdBUUlBeU9BUXNnQmlBVUtBSUVLQUlRSUFoQkNHc2lCeWtEQUJBZ0RJMEJDeUFHSUJRb0FnZ29BaEFnQ0VFSWF5SUhLUU1BRUNBTWpBRUxJQVlnRkNnQ0RDZ0NFQ0FJUVFocklnY3BBd0FRSUF5TEFRc2dGQ2dDQUNnQ0VDRUhJQWhCQ0dzcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJS0lBb29BZ0JCQVdvMkFnQUxJQVlnQnlBQkVDQU1oQUVMSUJRb0FnUW9BaEFoQnlBSVFRaHJLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lDaUFLS0FJQVFRRnFOZ0lBQ3lBR0lBY2dBUkFnRElNQkN5QVVLQUlJS0FJUUlRY2dDRUVJYXlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdvZ0NpZ0NBRUVCYWpZQ0FBc2dCaUFISUFFUUlBeUNBUXNnRkNnQ0RDZ0NFQ0VISUFoQkNHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUtJQW9vQWdCQkFXbzJBZ0FMSUFZZ0J5QUJFQ0FNZ1FFTElCUWdDaThBQVVFQ2RHb29BZ0FvQWhBcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQXBCQTJvaERTQUlJQUUzQXdBZ0NFRUlhaUVIRElZQkN5QUdJQlFnQ2k4QUFVRUNkR29vQWdBb0FoQWdDRUVJYXlJSEtRTUFFQ0FnQ2tFRGFpRU5ESVVCQ3lBVUlBb3ZBQUZCQW5ScUtBSUFLQUlRSVFjZ0NFRUlheWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZzBnRFNnQ0FFRUJhallDQUFzZ0NrRURhaUVOSUFZZ0J5QUJFQ0FNZmdzZ0NrRURhaUVOSUJRZ0NpOEFBU0lIUVFKMGFpZ0NBQ2dDRUNrREFDSUJRb0NBZ0lCd2cwS0FnSUNBd0FCU0JFQWdBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnQVRjREFDQUlRUWhxSVFjTWhBRUxJQVlnRXlBSFFRRVF4UUlNaHdFTElBcEJBMm9oRFNBVUlBb3ZBQUVpQjBFQ2RHb29BZ0FvQWhBaUNUVUNCRUlnaGtLQWdJQ0F3QUJTQkVBZ0JpQUpJQWhCQ0dzaUJ5a0RBQkFnRElNQkN5QUdJQk1nQjBFQkVNVUNESVlCQ3lBS1FRTnFJUTBnRkNBS0x3QUJJZ2RCQW5ScUtBSUFLQUlRSWdrMUFnUkNJSVpDZ0lDQWdNQUFVZ1JBSUFZZ0V5QUhRUUVReFFJTWhnRUxJQVlnQ1NBSVFRaHJJZ2NwQXdBUUlBeUJBUXNnQmlBUklBb3ZBQUZCQTNScVFvQ0FnSURBQUJBZ0lBcEJBMm9oRFF4NkN5QUtRUU5xSVEwZ0VTQUtMd0FCSWdkQkEzUnFLUU1BSWdGQ2dJQ0FnSENEUW9DQWdJREFBRklFUUNBQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQUJOd01BSUFoQkNHb2hCd3lBQVFzZ0JpQVRJQWRCQUJERkFneURBUXNnQ2tFRGFpRU5JQkVnQ2k4QUFTSUhRUU4wYWlJSk5RSUVRaUNHUW9DQWdJREFBRklFUUNBR0lBa2dDRUVJYXlJSEtRTUFFQ0FNZndzZ0JpQVRJQWRCQUJERkFneUNBUXNnQ2tFRGFpRU5JQkVnQ2k4QUFVRURkR29pQnpVQ0JFSWdoa0tBZ0lDQXdBQlNCRUFnQmtIazd3QkJBQkRHQWd5Q0FRc2dCaUFISUFoQkNHc2lCeWtEQUJBZ0RIMExJQklvQWh3aENTQU5Md0FBSVFzRFFDQUpJZ2NnS0VZTllTQUhLQUlFSVFrZ0IwRUNheThCQUNBTFJ3MEFJQWRCQTJzaURTMEFBRUVDY1EwQUlCSW9BaFFnQzBFRGRHb3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SU1JQXdvQWdCQkFXbzJBZ0FMSUFjZ0FUY0RFQ0FISUFkQkVHbzJBZ2dnQnlnQ0FDSU1JQWsyQWdRZ0NTQU1OZ0lBSUFkQkFEWUNBQ0FOSUEwdEFBQkJBWEk2QUFBZ0JpZ0NFQ0VOSUFkQkJHdEJBem9BQUNBTktBSlFJZ3dnQnpZQ0JDQUhJQTFCMEFCcU5nSUVJQWNnRERZQ0FDQU5JQWMyQWxBTUFBc0FDeUFLTHdBRklRc2dDaWdBQVNFTUlBZ2dCa0tBZ0lDQUlCQkhJZ0UzQXdBZ0NFRUlhaUVISUFwQkIyb2hEUUpBQWtBZ0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUFrQWdDVUg2QUVZRVFDQVVJQXRCQW5ScUtBSUFJZ2tnQ1NnQ0FFRUJhallDQUF3QkN5QUdJQklnQ3lBSlFma0FSaENMQkNJSlJRMEJDeUFHSUFnb0FnQWdERUVpRUhvaUN3MEJJQllnQ1JEckFRc2dCeUVJRElBQkN5QUxJQWsyQWdBZ0NDQUdJQXdRWERjRENDQUlRUkJxSVFjTWV3c2dDa0VGYWlFTklCc3BBd0FpTHFjaUN5Z0NFQ0lIUVRCcUlRd2dCeUFLS0FBQklna2dCeWdDR0hGQmYzTkJBblJxS0FJQUlRY0NRQUpBQWtBQ1FBTkFJQWRGRFFFZ0NTQU1JQWRCQVd0QkEzUWlEMm9pQnlnQ0JFY0VRQ0FIS0FJQVFmLy8veDl4SVFjTUFRc0xJQXNvQWhRZ0QybzFBZ1JDSUlaQ2dJQ0FnTUFBVVFSQUlBWWdDUkRaQVF5REFRc2dCeTBBQTBFSWNVVU5BeUF1UWlDSXAwRjBTdzBCREFJTElBWWdCaWtEd0FFZ0NSQnhJZ2RCQUVnTmdRRWdCMFVFUUVLQWdJQ0FNQ0V1REFJTElCa3BBd0FpTGtJZ2lLZEJkVWtOQVNBdXB5RUxDeUFMSUFzb0FnQkJBV28yQWdBTElBZ2dMamNEQUNBSUlBWWdDUkJjTndNSUlBaEJFR29oQnd4N0N5QUdJQWxCemgwUWp3RU1mZ3NnRFNBTktBQUFhaUVOSUFnaEJ5QUdFSHRGRFhrTWZRc2dEU0FOTGdBQWFpRU5JQWdoQnlBR0VIdEZEWGdNZkFzZ0RTQU5MQUFBYWlFTklBZ2hCeUFHRUh0RkRYY01ld3NnQ2tFRmFpRUpBbjhnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vejlZQkVBZ0FhY01BUXNnQmlBQkVDWUxCSDhnRFNnQUFDQUpha0VFYXdVZ0NRc2hEU0FHRUh0RkRYWU1LQXNnQ2tFRmFpRUpBbjhnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vejlZQkVBZ0FhY01BUXNnQmlBQkVDWUxCSDhnQ1FVZ0RTZ0FBQ0FKYWtFRWF3c2hEU0FHRUh0RkRYVU1Kd3NnQ2tFQ2FpRUpBbjhnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vejlZQkVBZ0FhY01BUXNnQmlBQkVDWUxCSDhnRFN3QUFDQUpha0VCYXdVZ0NRc2hEU0FHRUh0RkRYUU1KZ3NnQ2tFQ2FpRUpBbjhnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vejlZQkVBZ0FhY01BUXNnQmlBQkVDWUxCSDhnQ1FVZ0RTd0FBQ0FKYWtFQmF3c2hEU0FHRUh0RkRYTU1KUXNnQ0NBTklBb29BQUZxSUJNb0FoUnJyVUtBZ0lDQTBBQ0VOd01BSUFwQkJXb2hEU0FJUVFocUlRY01jZ3NnQ2lnQUFTRUhJQWdnQ2lBVEtBSVVhMEVGYXEwM0F3QWdCeUFOYWlFTklBaEJDR29oQnd4eEN3SkFJQWhCQ0dzaUJ5a0RBQ0lCUXYvLy8vOFBWZzBBSUFHbklna2dFeWdDR0U4TkFDQVRLQUlVSUFscUlRME1jUXNnQmtIMTRRQkJBQkJHREhRTElBaEJDR3NpRHlrREFDSXRRaUNJcHlJSFFRRnFJZ2xCQkUxQkFFRUJJQWwwUVJseEcwVUVRQ0FHSUMwUTNBVWhMUXNDUUNBR1FSZ1FLU0lKQkVBZ0JrS0FnSUNBSUVFUkVFa2lMa0tBZ0lDQWNJTkNnSUNBZ09BQVVnMEJJQVlvQWhBaUIwRVFhaUFKSUFjb0FnUVJBQUFMSUMwaExneGxDeUFKUVFBMkFoQWdDU0F0TndNQUlBbEJBRFlDQ0NBdXB5QUpOZ0lnSUFkQmZuRkJBa1lOWlNBdElnRkNJSWluSWdkQmRVOEVRQ0F0cHlJTElBc29BZ0JCQVdvMkFnQUxBMEFnQmlBQkVJd0NJZ0ZDZ0lDQWdIQ0RJaTlDZ0lDQWdDQlNCRUFnTDBLQWdJQ0E0QUJSRFdZZ0JpQU9RZUFBYWlBT1FZQUJhaUFCcDBFUkVJNEJEV1VnQmlBT0tBSmdJQTRvQW9BQklnc1FXaUFMQkVBZ0JpQUJFQThnQjBGMVNRMWxJQzJuSWdjZ0J5Z0NBRUVCYWpZQ0FBeGxDeUFHRUh0RkRRRU1aUXNMQWtBQ1FDQXRweUlNTFFBRlFRaHhSUTBBUVFBaEJ5QU1LQUlRSWdzb0FpQWlFRUVBSUJCQkFFb2JJUkFnQzBFd2FpRUxBMEFnQnlBUVJnMENJQXN0QUFOQkVIRU5BU0FMUVFocUlRc2dCMEVCYWlFSERBQUxBQXNnQmlBT1FlQUFhaUFPUVlBQmFpQU1RUkVRamdFTlpVRUFJUWNnRGlnQ1lDRUtJQTRvQW9BQklRa0RRQ0FISUFsSEJFQWdCaUF1SUFvZ0IwRURkR29vQWdSQ2dJQ0FnQ0JCQUJEUUFSb2dCMEVCYWlFSERBRUxDeUFHSUFvZ0NSQmFER1lMSUFsQkFUWUNDQ0FKSUF3b0FpZzJBZ3dNWlF0Q2dZQ0FnQkFoTGdKQUlBaEJDR3NwQXdBaUxVS0FnSUNBY0ZRTkFDQXRweUlMTHdFR1FSRkhEUUFnQ3lnQ0lDRUhBMEFDUUNBSEtBSUlCRUFnQnlnQ0VDSUpJQWNvQWd4UERRTWdCeUFKUVFGcU5nSVFJQWxCZ0lDQWdIaHlJUWtNQVFzZ0J5Z0NFQ0lNSUFzb0FoQWlDU2dDSUU4TkFpQUpRVEJxSUF4QkEzUnFJZzhvQWdRaENTQUhJQXhCQVdvMkFoQWdDVVVOQVNBUExRQURRUkJ4UlEwQkN5QUdJQWNwQXdBZ0NSQnhJZ3hCQUVnTmRDQU1SUTBBQzBLQWdJQ0FFQ0V1SUFZZ0NSQmNJUUVMSUFnZ0xqY0RDQ0FJSUFFM0F3QWdDRUVRYWlFSERHNExJQVlnQ0VFQUVKa0REWEVnQ0VLQWdJQ0EwQUEzQXdnZ0NFRVFhaUVIREcwTElBb3RBQUVoQ1VFQklRY2dEa0VCTmdKZ0lBcEJBbW9oRFVLQWdJQ0FNQ0V1SUFoQmZTQUphMEVEZEdvaUN5a0RBQ0lCUW9DQWdJQndnMEtBZ0lDQU1GRU5YaUFHSUFFZ0NFRitJQWxyUVFOMGFpa0RBQ0FPUWVBQWFoQ3VBU0l1UW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJCZnlFSElBNUJmellDWUF4ZUN5QU9LQUpnSWdjTlhVRUFJUWNNWGdzZ0JpQUlRUUVRbVFNTmJ5QUlRb0NBZ0lEUUFEY0RDQ0FJUVJCcUlRY01hd3NnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vMjlZQkVBZ0JrR09NVUVBRUJVTWJ3c2dCaUFCSUE1QjRBQnFFTnNGSWkxQ2dJQ0FnSENEUW9DQWdJRGdBRkVOYmlBR0lBRVFEeUFISUMwM0F3QWdDQ0FPS0FKZ1FRQkhyVUtBZ0lDQUVJUTNBd0FnQ0VFSWFpRUhER29MSUFoQkNHc3BBd0JDLy8vLy8yOVdEV01nQmtHT01VRUFFQlVNYlFzZ0JpQUlRUkJySWdrcEF3QVFEeUFJUVJocklnY3BBd0FpQVVLQWdJQ0FjSU5DZ0lDQWdEQlJEV2dnQmlBQlFRQVFyUUVFUUNBSklRZ01iUXNnQmlBSEtRTUFFQThNYUFzZ0NFRUlheUlJS1FNQUlRRURRQUpBSUFnZ0hFME5BQ0FJUVFocklnY3BBd0FpTFVLQWdJQ0FjSU5DZ0lDQWdOQUFVUTBBSUFZZ0xSQVBJQWNoQ0F3QkN3c2dDQ0FwU1FSQUlBWkIzY29BUVFBUVJpQUdJQUVRRHd4c0N5QUlJQWhCQ0dzaUJ5a0RBRGNEQUNBSVFSQnJJZ29wQXdBaExTQUtJQWhCR0dzaUNpa0RBRGNEQUNBSElDMDNBd0FnQ2lBQk53TUFJQWhCQ0dvaEJ3eG5DeUFHSUFoQkdHc3BBd0FnQ0VFZ2F5a0RBRUVCSUFoQkNHc2lCeEFoSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOYWlBR0lBY3BBd0FRRHlBSElBRTNBd0FNWUFzZ0NrRUNhaUVOSUFnZ0JpQUlRU0JySWdjcEF3QWlBVUVYUVFZZ0NpMEFBU0lKUVFGeEd5QUJRUUFRRkNJQlFvQ0FnSUJ3Z3lJdFFvQ0FnSUFnVVNBdFFvQ0FnSUF3VVhJRWZrS0JnSUNBRUFVZ0xVS0FnSUNBNEFCUkRXb2dCeWtEQUNFdEFuNGdDVUVDY1FSQUlBWWdBU0F0UVFCQkFCQXZEQUVMSUFZZ0FTQXRRUUVnQ0VFSWF4QXZDeUlCUW9DQWdJQndnMEtBZ0lDQTRBQlJEV29nQmlBSVFRaHJJZ2NwQXdBUUR5QUhJQUUzQXdCQ2dJQ0FnQkFMTndNQUlBaEJDR29oQnd4bEN3Si9JQWhCQ0dzaUJ5a0RBQ0lCUXYvLy8vOC9XQVJBSUFHblFRQkhEQUVMSUFZZ0FSQW1DeUVLSUFjZ0NrV3RRb0NBZ0lBUWhEY0RBQXhlQ3lBS1FRVnFJUTBnQmlBSVFRaHJJZ2NwQXdBaUFTQUtLQUFCSUFGQkFCQVVJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5aeUFHSUFjcEF3QVFEeUFISUFFM0F3QU1YUXNnQ2tFRmFpRU5JQVlnQ0VFSWF5a0RBQ0lCSUFvb0FBRWdBVUVBRUJRaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVExbUlBZ2dBVGNEQUNBSVFRaHFJUWNNWWdzZ0JpQUlRUkJySWdjcEF3QWdDaWdBQVNBSVFRaHJLUU1BUVlDQUFoRFFBU0VJSUFZZ0J5a0RBQkFQSUFwQkJXb2hEU0FJUVFCT0RXRU1Fd3NnQ2tFRmFpRU5JQVlnQ2lnQUFSRGdCU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEV1FnQ0NBQk53TUFJQWhCQ0dvaEJ3eGdDeUFJUVFocklRY0NRQ0FJUVJCcklna3BBd0FpQVVMLy8vLy9iMWdFUUNBR0VDUkNnSUNBZ09BQUlTNE1BUXNnQnlrREFDSXRRb0NBZ0lCd2cwS0FnSUNBZ0g5U0JFQWdCaENJQkVLQWdJQ0E0QUFoTGd3QkN5QUdLQUlRSUMwUWpRSWhDQ0FCcHlJTUtBSVFJZ3RCTUdvaER5QUxJQWdnQ3lnQ0dIRkJmM05CQW5ScUtBSUFJUXNDUUFOQUlBc0VRQ0FQSUF0QkFXdEJBM1FpQzJvaUVDZ0NCQ0FJUmcwQ0lCQW9BZ0JCLy8vL0gzRWhDd3dCQ3dzZ0JpQUlFTm9GUW9DQWdJRGdBQ0V1REFFTElBd29BaFFnQzJvcEF3QWlMa0lnaUtkQmRVa05BQ0F1cHlJSUlBZ29BZ0JCQVdvMkFnQUxJQVlnQnlrREFCQVBJQVlnQ1NrREFCQVBJQWtnTGpjREFDQXVRb0NBZ0lCd2cwS0FnSUNBNEFCU0RWOE1FUXNnQ0VFUWF5a0RBQ0VCSUFoQkNHc2hDUUpBQWtBZ0NFRVlheUlIS1FNQUlpMUMvLy8vLzI5WUJFQWdCaEFrREFFTElBa3BBd0FpTGtLQWdJQ0FjSU5DZ0lDQWdJQi9VZ1JBSUFZUWlBUU1BUXNnQmlnQ0VDQXVFSTBDSVFnZ0xhY2lEQ2dDRUNJTFFUQnFJUThnQ3lBSUlBc29BaGh4UVg5elFRSjBhaWdDQUNFTEEwQWdDd1JBSUE4Z0MwRUJhMEVEZENJTGFpSVFLQUlFSUFoR0RRTWdFQ2dDQUVILy8vOGZjU0VMREFFTEN5QUdJQWdRMmdVTElBWWdBUkFQSUFZZ0J5a0RBQkFQSUFZZ0NTa0RBQkFQSUFjaENBeGpDeUFHSUF3b0FoUWdDMm9nQVJBZ0lBWWdCeWtEQUJBUElBWWdDU2tEQUJBUERGNExJQWhCR0dzaEJ5QUlRUWhyS1FNQUlRRWdDRUVRYXlFSUFrQUNRQ0FIS1FNQUlpMUMvLy8vLzI5WUJFQWdCaEFrREFFTElBZ3BBd0FpTGtLQWdJQ0FjSU5DZ0lDQWdJQi9VZ1JBSUFZUWlBUU1BUXNnQmlnQ0VDQXVFSTBDSVFjZ0xhY2lDeWdDRUNJSlFUQnFJUXdnQ1NBSElBa29BaGh4UVg5elFRSjBhaWdDQUNFSkFrQURRQ0FKUlEwQklBY2dEQ0FKUVFGclFRTjBhaUlKS0FJRVJ3UkFJQWtvQWdCQi8vLy9IM0VoQ1F3QkN3c2dCaUFIUVpnekVJOEJEQUVMSUFZZ0N5QUhRUWNRZWlJSERRRUxJQVlnQVJBUElBWWdDQ2tEQUJBUERHSUxJQWNnQVRjREFDQUdJQWdwQXdBUUR3eFhDeUFLUVFWcUlRMGdCaUFJUVJCcktRTUFJQW9vQUFFZ0NFRUlheUlIS1FNQVFZZUFBUkFaUVFCT0RWd01EZ3NnQ2tFRmFpRU5JQWdoQnlBR0lBaEJDR3NwQXdBZ0NpZ0FBUkRaQlVFQVRnMWJERjhMSUFnaEJ5QUdJQWhCQ0dzcEF3QWdDRUVRYXlrREFCRFlCVUVBVGcxYURGNExJQWhCQ0dzaUJ5a0RBQ0lCUXYvLy8vOXZXQ0FCUW9DQWdJQndnMEtBZ0lDQUlGSnhSUVJBSUFZZ0NFRVFheWtEQUNBQlFRRVFpd0pCQUVnTlhnc2dCaUFCRUE4TVdRc2dCaUFJUVFocktRTUFJQWhCRUdzcEF3QVFod1FNVWdzZ0NBSi9JQWxCMVFCR0JFQkJmU0FHSUFoQkVHc3BBd0FRTVNJTERRRWFERjBMSUFwQkJXb2hEU0FLS0FBQklRdEJmZ3RCQTNScUlRY0NmZ0orQWtBQ1FBSkFJQTB0QUFBaURFRURjUTRDQUFFQ0MwR0R6Z0VoQ2lBSVFRaHJLUU1BSWdFaEwwS0FnSUNBTUF3Q0MwS0FnSUNBTUNFdlFZR2FBU0VLUW9DQWdJQXdJUzBnQ0VFSWF5a0RBQ0lCREFJTFFvQ0FnSUF3SVM5Qmdhb0JJUW9nQ0VFSWF5a0RBQ0lCQ3lFdFFvQ0FnSUF3Q3lFeElBY3BBd0FoTUVHMm1RRWhCeUFHSUFzUTF3VWhMZ0pBSUFwQmdCQnhSUVJBUWJHWkFTRUhJQXBCZ0NCeFJRMEJDeUFHSUFjZ0xrSE1uZ0VRdmdFaExnc2dDRUVJYXlFSEFuOUJmeUF1UW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFhUVg4Z0JpQUJRVFlnTGtFQkVCbEJBRWdOQUJvZ0JpQUJJREFRaHdRZ0JpQXdJQXNnTHlBeElDMGdDaUFNUVFSeGNoQnRDeUVLSUFZZ0J5a0RBQkFQSUExQkFXb2hEU0FJSUFsQjFRQkdCSDhnQmlBTEVCTWdCaUFJUVJCcktRTUFFQTlCZmdWQmZ3dEJBM1JxSVFjZ0NrRUFUZzFYSUFwQkhuWkJBbkVNV0FzZ0NrRUdhaUVOSUFoQkNHc2lEQ2tEQUNFeElBaEJFR3NoQ3lBS0tBQUJJUThDUUFKQUlBb3RBQVZCQVhFRVFFS0FnSUNBSUNFdElBc3BBd0FpTUVLQWdJQ0FjSU5DZ0lDQWdDQlJCRUFnQmlrRE1DSXdRaUNJcDBGMFN3MENEQU1MUW9DQWdJQXdJUzlCZ1Q0aEJ5QXdRb0NBZ0lCd1ZBMUdJRENuTFFBRlFSQnhSUTFHSUFZZ01FRTdJREJCQUJBVUlpMUNnSUNBZ0hDRElnRkNnSUNBZ0NCUkRRSWdBVUtBZ0lDQTRBQlJEVWdnTFVLQWdJQ0FjRm9OQWtHNzB3QWhCd3hIQ3lBR0tBSW9LUU1JSWkxQ0lJaW5RWFZQQkVBZ0xhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBR0tRTXdJakJDSUlpblFYVkpEUUVMSURDbklnY2dCeWdDQUVFQmFqWUNBQXRDZ0lDQWdPQUFJUzhnQmlBdEVFY2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMUZJREduSWdjdEFCRkJNSEVOUDBLQWdJQ0E0QUFoTGlBR0lEQkJEUkJKSWk5Q2dJQ0FnSENEUW9DQWdJRGdBRkVOUWtLQWdJQ0FNQ0V4SUFZZ0x5QUhJQlFnRWhEV0JTSXVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRVSWdCaUF1SUFFUWh3UWdMa0tBZ0lDQWNGb0VRQ0F1cHlJUUlCQXRBQVZCRUhJNkFBVUxJQVlnTGtFd0lBY3pBU3hCQVJBWkdnSkFJQWxCMXdCR0JFQWdCaUF1SUFoQkdHc3BBd0FRMkFWQkFFZ05SQXdCQ3lBR0lDNGdEeERaQlVFQVNBMURDeUF1UWlDSXAwRjFUd1JBSUM2bklnY2dCeWdDQUVFQmFqWUNBQXNnQmlBQlFUd2dMa0dEZ0FFUUdVRUFTQTFDSUFGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBR0lDNUJPeUFCUVlDQUFSQVpRUUJJRFVJZ0JpQXRFQThnQmlBd0VBOGdDeUF1TndNQUlBd2dBVGNEQUF4UUN5QUdJQWhCRUdzaUNTa0RBQ0FJUVFocklnY3BBd0FRVFNFQklBWWdDU2tEQUJBUElBa2dBVGNEQUNBQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFZVTUJ3c2dDRUVJYXlJSElBWWdDRUVRYXlrREFDQUhLUU1BRUUwaUFUY0RBQ0FJSVFjZ0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcxVURGZ0xJQWhCQ0dzcEF3QWhBU0FJUVJCcktRTUFJaTFDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQVlnQVJBeElnZEZEVmdnQmlBSEVNY0NJQVlnQnhBVERGZ0xJQUZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUMwZ0FSQk5JZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5WeUFJSUFFM0F3QWdDRUVJYWlFSERGTUxJQVlnQ0VFSWF5SU1LUU1BRURFaUNVVU5WaUFHSUFoQkVHc2lCeWtEQUNBSklBaEJHR3NpQ3lrREFFRUFFQlFoQVNBR0lBa1FFeUFCUW9DQWdJQndnMEtBZ0lDQTRBQlJEVllnQmlBTUtRTUFFQThnQmlBSEtRTUFFQThnQmlBTEtRTUFFQThnQ3lBQk53TUFERklMSUFZZ0NFRVlheUlIS1FNQUlBaEJFR3NwQXdBZ0NFRUlheWtEQUVHQWdBSVExd0VoQ0NBR0lBY3BBd0FRRHlBSVFRQk9EVkVNQXdzZ0JpZ0NFQ2dDakFFaENRSi9Ba0FnQ0VFWWF5SUhLUU1BSWk1Q2dJQ0FnSENEUW9DQWdJQXdVUVJBQWtBZ0NVVU5BQ0FKTFFBb1FRRnhSUTBBSUFZZ0NFRVFheWtEQUJBeElnZEZEVmdnQmlBSEVNY0NJQVlnQnhBVERGZ0xJQmtwQXdBaUxrSWdpS2RCZFU4RVFDQXVweUlLSUFvb0FnQkJBV28yQWdBTElBY2dMamNEQUF3QkN5QUpSUTBBUVlDQUJpQUpLQUlvUVFGeERRRWFDMEdBZ0FJTElRb2dCaUF1SUFoQkVHc3BBd0FnQ0VFSWF5a0RBQ0FLRU5jQklRZ2dCaUFIS1FNQUVBOGdDRUVBVGcxUUlBaEJIblpCQW5FTVVRc2dDRUVZYXlJSktRTUFRdi8vLy85dldBMUxJQVlnQ0VFUWF5SU1LUU1BRURFaUMwVU5VeUFHSUFrcEF3QWdDeUFJUVFocktRTUFJQWhCSUdzaUJ5a0RBRUdBZ0FJUWhnUWhDQ0FHSUFzUUV5QUdJQWNwQXdBUUR5QUdJQWtwQXdBUUR5QUdJQXdwQXdBUUR5QUlRUUJPRFU4Z0NFRWVka0VDY1F4UUN5QUlRUmhyS1FNQUlTMGdDRUVRYXlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dCaUF0SUFFZ0NFRUlheUlIS1FNQVFZZUFBUkM5QVVFQVRnMU9DeUFISVFnTVVRc2dDRUVRYXlJTUtRTUFJaTVDZ0lDQWdCQmFCRUFnQmtIMjhnQkJBQkJHREZFTElBWWdDRUVJYXlJSEtRTUFJZ0ZCMFFFZ0FVRUFFQlFpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTFRSUFGQlBVRUJFSVVFSVFzZ0JpQUJFQThnQmlBSEtRTUFRUUFRNXdFaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVExUUlBWWdBVUhxQUNBQlFRQVFGQ0l0UW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQmlBQkVBOE1VUXNnTHFjaENRSkFBa0FnQzBVTkFDQXRRVDVCQUJDRkJFVU5BQ0FIS1FNQUlpNGdEa0hnQUdvZ0RrR0FBV29RaWdKRkRRQWdCaUFPUVp3QmFpQXVFTllCRFRrZ0RpZ0NuQUVpRHlBT0tBS0FBVWNOQUNBSVFSaHJJUkJCQUNFTElBNG9BbUFoSXdOQUlBc2dEMFlOQWlBUUtRTUFJUzhnSXlBTFFRTjBhaWtEQUNJdVFpQ0lwMEYxVHdSQUlDNm5JaGdnR0NnQ0FFRUJhallDQUFzZ0JpQXZJQWtnTGtFSEVLOEJJUmdnQzBFQmFpRUxJQWxCQVdvaENTQVlRUUJPRFFBTEREa0xJQWhCR0dzaEN3TkFJQVlnQVNBdElBNUJuQUZxRUs0QklpNUNnSUNBZ0hDRFFvQ0FnSURnQUZFTk9TQU9LQUtjQVEwQklBWWdDeWtEQUNBSklDNUJCeEN2QVVFQVNBMDVJQWxCQVdvaENRd0FDd0FMSUF3Z0NhMDNBd0FnQmlBQkVBOGdCaUF0RUE4Z0JpQUhLUU1BRUE4TVRBc2dDa0VDYWlFTklBZ2hCeUFHSUFnZ0NpMEFBU0lKUVg5eklndEJBM1JCWUhKcUtRTUFJQWdnQzBFQmRFRkFja0Y0Y1dvcEF3QWdDQ0FKUVFWMlFYOXpRUU4wYWlrREFFRUFFTlFGUlExTERFOExBa0FnQ0VFSWF5SUhLUU1BSWdGQ0lJaW5JZ3NnQ0VFUWF5SUpLUU1BSWkxQ0lJaW5JZ3h5UlFSQUlBSEVJQzNFZkNJQlFvQ0FnSUFJZkVMLy8vLy9EMVlOQVNBSklBRkMvLy8vL3crRE53TUFERXdMSUF4QkIydEJiVXNnQzBFSGEwRnRTM0lOQUNBSlFvQ0FnSURBZmlBdFFvQ0FnSURBZ1lEOC93Qjh2eUFCUW9DQWdJREFnWUQ4L3dCOHY2QzlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzM0F3QU1Td3NnQmlBSUVOTUZSUTFLREU0TElBcEJBbW9oRFFKQUlBaEJDR3NpQ0NrREFDSXRJQkVnQ2kwQUFVRURkR29pQnlrREFDSUJoRUwvLy8vL0QxZ0VRQ0F0eENBQnhId2lMVUtBZ0lDQUNIeEMvLy8vL3c5V0RRRWdCeUF0UXYvLy8vOFBnemNEQUF4RkN5QUJRb0NBZ0lCd2cwS0FnSUNBa0g5U0RRQWdCaUF0UVFJUW1nRWlMVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMU9JQWNwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlKSUFrb0FnQkJBV28yQWdBTElBWWdBU0F0RU1RQ0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTlRpQUdJQWNnQVJBZ0RFUUxJQUZDSUlpblFYVlBCRUFnQWFjaUNTQUpLQUlBUVFGcU5nSUFDeUFPSUFFM0F5QWdEaUFJS1FNQU53TW9JQVlnTEJEVEJRMU5JQVlnQnlBT0tRTWdFQ0FNUXdzZ0NFRUlheUlIS1FNQUlnRkNJSWluSWd3Z0NFRVFheUlMS1FNQUlpMUNJSWluSWc5eVJRUkFJQzNFSUFIRWZTSUJRb0NBZ0lBSWZFTC8vLy8vRDFZTkJDQUxJQUZDLy8vLy93K0ROd01BREVrTElBOUJCMnRCYlVzZ0RFRUhhMEZ0UzNJTkF5QUxRb0NBZ0lEQWZpQXRRb0NBZ0lEQWdZRDgvd0I4dnlBQlFvQ0FnSURBZ1lEOC93Qjh2Nkc5SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoczNBd0FNU0FzQ2ZDQUlRUWhySWdjcEF3QWlMVUlnaUtjaURDQUlRUkJySWdzcEF3QWlMa0lnaUtjaUQzSkZCRUFnTGNRZ0xzUitJZ0ZDZ0lDQWdBaDhRb0NBZ0lBUVdnUkFJQkl0QUNoQkJIRkJBQ0FCUW9DQWdJQ0FnSUFRZlVLQmdJQ0FnSUNBWUZRYkRRVWdBYmtNQWd0RUFBQUFBQUFBQUlBZ0xTQXVoRUtBZ0lDQUNJTlFJQUZDQUZKeVJRMEJHaUFMSUFGQy8vLy8vdytETndNQURFa0xJQTlCQjJ0QmJVc2dERUVIYTBGdFMzSU5BeUFTTFFBb1FRUnhEUU1nTGtLQWdJQ0F3SUdBL1A4QWZMOGdMVUtBZ0lDQXdJR0EvUDhBZkwraUN5RTBJQXRDZ0lDQWdNQitJRFM5SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoczNBd0FNUndzZ0NFRUlheUlIS1FNQUlnRWdDRUVRYXlJTEtRTUFJaTJFUXYvLy8vOFBWZzBCSUJJdEFDaEJCSEVOQVNBTEFuNGdMYWUzSUFHbnQ2TWlOTDBpQVFKL0lEU1pSQUFBQUFBQUFPQkJZd1JBSURTcURBRUxRWUNBZ0lCNEN5SUl0NzFSQkVBZ0NLME1BUXRDZ0lDQWdNQitJQUZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTE53TUFERVlMSUFoQkNHc2lCeWtEQUNJQklBaEJFR3NpQ3lrREFDSXRoRUwvLy8vL0QxWU5BQ0F0cHlJTVFRQklEUUFnQWFjaUQwRUFUQTBBSUFzZ0RDQVBjSzAzQXdBTVJRc2pBRUVnYXlJSEpBQUNmd0pBQWtBQ1FBSkFBbjRDUUFKQUFrQUNRQUpBQWtBQ1FFRUhJQWhCRUdzaUN5a0RBQ0lCUWlDSXB5SU1JQXhCQjJ0QmJra2JJZ3hCQjBkQkJ5QUlRUWhySWlNcEF3QWlMa0lnaUtjaUR5QVBRUWRyUVc1Skd5SVBRUWRIY2tVRVFDQUhJQzVDZ0lDQWdNQ0JnUHovQUh3M0F3Z2dCeUFCUW9DQWdJREFnWUQ4L3dCOE53TVFEQUVMQWtBZ0RFRi9SaUFQUVg1eFFRSkhjVVVnREVGK2NVRUNSaUFQUVg5SGNuRU5BQ0FHSUFkQkdHb2dBU0F1SUFsQkFVRUFFSVVDSWd4RkRRQWdCaUFCRUE4Z0JpQXVFQThnREVFQVNBME1JQXNnQnlrREdEY0RBQXdKQ3lBR0lBRVFiQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUW9nQmlBdUVHd2lMa0tBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQVlnQVJBUERBd0xRUWNnQVVJZ2lLY2lEQ0FNUVFkclFXNUpHeUlNUVFjZ0xrSWdpS2NpRHlBUFFRZHJRVzVKR3lJUGNrVUVRQ0F1cHlFTUlBR25JUThDUUFKQUFrQUNRQUpBQWtBZ0NVR2FBV3NPQmdBQkFna0ZBd1FMSUM3RUlBSEVmaUV0QWtBZ0JpZ0NFQ0lRS0FLTUFTSVlSUTBBSUJndEFDaEJCSEZGRFFBZ0xVS0FnSUNBZ0lDQUVIMUNnWUNBZ0lDQWdHQlVEUWdMUWdBaEFTQXRRZ0JTRFFvZ0RDQVBja0VBVGcwTElBdENnSUNBZ01EKy93TTNBd0FNRGdzZ0JpZ0NFQ0lRS0FLTUFTSVlCRUFnR0MwQUtFRUVjUTBIQ3lBTFFvQ0FnSURBZmlBUHR5QU10Nk85SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoczNBd0FNRFFzZ0RFRUFTaUFQUVFCT2NVVUVRQ0FMQW40Z0Q3Y2dETGNRamdNaU5MMGlBUUovSURTWlJBQUFBQUFBQU9CQll3UkFJRFNxREFFTFFZQ0FnSUI0Q3lJSnQ3MVJCRUFnQ2EwTUFRdENnSUNBZ01CK0lBRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMTndNQURBMExJQThnREhDdElTME1DQXNnQmlnQ0VDSVFLQUtNQVNJWUJFQWdHQzBBS0VFRWNRMEZDeUFQdHlFMElBc0NmZ0o4SUF5M0lqVzlRb0NBZ0lDQWdJRDQvd0NEUW9DQWdJQ0FnSUQ0L3dCUkJFQkVBQUFBQUFBQStIOGdOSmxFQUFBQUFBQUE4RDloRFFFYUN5QTBJRFVRandNTElqUzlJZ0VDZnlBMG1VUUFBQUFBQUFEZ1FXTUVRQ0EwcWd3QkMwR0FnSUNBZUFzaUNiZTlVUVJBSUFtdERBRUxRb0NBZ0lEQWZpQUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3pjREFBd0xDeUFKUWJJQlJnMEZEQVFMSUFIRUlDN0VmU0V0REFVTElBeEJkVWNnRDBGMVIzRkZCRUFnQmlBSklBc2dBU0F1SUFZb0FoQW9BdGdDRVJvQURRd01DUXNnREVGM1J5QVBRWGRIY1VVRVFDQUdJQWtnQ3lBQklDNGdCaWdDRUNnQ3ZBSVJHZ0JGRFFrTURBc2dERUYyUnlBUFFYWkhjVVVFUUNBR0tBSVFJUkFNQWdzZ0JpQUhRUkJxSUFFUWJnMEtJQVlnQjBFSWFpQXVFRzROQ3dzQ1FDQUdLQUlRSWhBb0Fvd0JJZ3hGRFFBZ0RDMEFLRUVFY1VVTkFDQUhLd01RRUwwQ1JRMEFJQWNyQXdnUXZRSU5BUXNDUUFKQUFrQUNRQUpBQWtBQ1FDQUpRWm9CYXc0R0FBRUNDQVVFQXdzZ0J5c0RFQ0FIS3dNSW9pRTBEQVVMSUFjckF4QWdCeXNEQ0tNaE5Bd0VDeUFIS3dNUUlBY3JBd2dRamdNaE5Bd0RDeUFKUWJJQlJ3MEVJQWNyQXhBZ0J5c0RDSmtpTlJDT0F5STBSQUFBQUFBQUFBQUFZMFVOQWlBMUlEU2dJVFFNQWdzZ0J5c0RFQ0UxSUFjckF3Z2lOcjFDZ0lDQWdJQ0FnUGovQUlOQ2dJQ0FnSUNBZ1BqL0FGRUVRRVFBQUFBQUFBRDRmeUUwSURXWlJBQUFBQUFBQVBBL1lRMENDeUExSURZUWp3TWhOQXdCQ3lBSEt3TVFJQWNyQXdpaElUUUxJQXRDZ0lDQWdNQitJRFM5SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoczNBd0FNQndzZ0JpQUpJQXNnQVNBdUlCQW9BcUFDRVJvQVJRMEdEQWtMRUFFQUN5QU1SUTBGSUFIRUlDN0VJZ0dCSWkxQ0FGa05BQ0FNUVFCSUJFQWdMU0FCZlNFdERBRUxJQUVnTFh3aExRc2dMVUtBZ0lDQUNIeEMvLy8vL3c5V0RRRWdMU0VCQ3lBQlF2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0xibTlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElRRWdDeUFCTndNQUMwRUFEQU1MSUFaQkFoQ0VBZ3dCQ3lBR0lDNFFEd3NnQzBLQWdJQ0FNRGNEQUNBalFvQ0FnSUF3TndNQVFYOExJUWtnQjBFZ2FpUUFJQWtOU0NBSVFRaHJJUWNNUkFzZ0NFRUVheWdDQUNJSFJTQUhRUWRyUVc1SmNnMDlJQWdoQnlBR0lBaEJqUUVRNWdGRkRVTU1Sd3NDUUFKOElBaEJDR3NpQnlrREFDSUJRaUNJcHlJSlJRUkFSQUFBQUFBQUFBQ0FJQUduSWdwRkRRRWFSQUFBQUFBQUFPQkJJQXBCZ0lDQWdIaEdEUUVhSUFkQ0FDQUJmVUwvLy8vL0Q0TTNBd0FNUHdzZ0NVRUhhMEZ0U3cwQklBRkNnSUNBZ01EKy93Tjl2d3NoTkNBSFFvQ0FnSURBZmlBMHZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliTndNQUREMExJQWdoQnlBR0lBaEJqQUVRNWdGRkRVSU1SZ3NnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vdzlXSUFGQy8vLy8vdytEUXYvLy8vOEhVWEpGQkVBZ0J5QUJRZ0Y4UXYvLy8vOFBnemNEQUF3OEN5QUlJUWNnQmlBSVFZOEJFT1lCUlExQkRFVUxJQWhCQ0dzaUJ5a0RBQ0lCUXYvLy8vOFBWaUFCUXYvLy8vOFBnMEtBZ0lDQUNGRnlSUVJBSUFjZ0FVSUJmVUwvLy8vL0Q0TTNBd0FNT3dzZ0NDRUhJQVlnQ0VHT0FSRG1BVVVOUUF4RUN5QUdJQWhCQ0dzaUJ5a0RBQkJzSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBSFFvQ0FnSUF3TndNQURFUUxJQWNnQVRjREFDQUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDQ0FCTndNQUlBWWdDRUVJYWlJSElBbEJBbXNRNWdGRkRUOE1Rd3NnQ2tFQ2FpRU5JQkVnQ2kwQUFVRURkR29pQnlrREFDSUJRdi8vLy84UFZpQUJRdi8vLy84UGcwTC8vLy8vQjFGeVJRUkFJQWNnQVVJQmZFTC8vLy8vRDRNM0F3QU1PUXNnQVVJZ2lLZEJkVThFUUNBQnB5SUpJQWtvQWdCQkFXbzJBZ0FMSUE0Z0FUY0RZQ0FHSUNaQmp3RVE1Z0VOUWlBR0lBY2dEaWtEWUJBZ0REZ0xJQXBCQW1vaERTQVJJQW90QUFGQkEzUnFJZ2NwQXdBaUFVTC8vLy8vRDFZZ0FVTC8vLy8vRDROQ2dJQ0FnQWhSY2tVRVFDQUhJQUZDQVgxQy8vLy8vdytETndNQUREZ0xJQUZDSUlpblFYVlBCRUFnQWFjaUNTQUpLQUlBUVFGcU5nSUFDeUFPSUFFM0EyQWdCaUFtUVk0QkVPWUJEVUVnQmlBSElBNHBBMkFRSUF3M0N5QUlRUWhySWdjcEF3QWlBVUwvLy8vL0QxZ0VRQ0FISUFGQy8vLy8vdytGTndNQUREY0xJQWdoQnlNQVFSQnJJZ2trQUFKL0FrQUNRQUpBSUFoQkNHc2lDeWtEQUNJQlFvQ0FnSUJ3VkEwQUlBWWdDVUVJYWlBQlFaVUJFTUlGSWd4QkFFZ05BU0FNUlEwQUlBWWdBUkFQSUFzZ0NTa0RDRGNEQUF3Q0N3SkFJQVlnQVJCc0lnRkNnSUNBZ0hDRElpMUNnSUNBZ09BQVVRMEFJQVlvQWhBaURDZ0NqQUVpRHdSL0lBOHRBQ2hCQkhGQkFuWUZRUUFMUlNBdFFvQ0FnSURnZmxKeFJRUkFJQVlnQzBHVkFTQUJJQXdvQXB3Q0VSc0FEUUVNQXdzZ0JpQUpRUVJxSUFFUW1BRU5BQ0FMSUFrMUFnUkMvLy8vL3crRk53TUFEQUlMSUF0Q2dJQ0FnREEzQXdBTFFYOE1BUXRCQUFzaEN5QUpRUkJxSkFBZ0MwVU5QQXhBQ3dKQUFrQUNRQ0FJUVFocklnY3BBd0FpQVNBSVFSQnJJZ3NwQXdBaUxZUkMvLy8vL3c5V0RRQWdBYWNoQ1NBU0xRQW9RUVJ4UlEwQklBbEJIMHNOQUNBdElBR0dRb0NBZ0lBSWZFS0FnSUNBRUZRTkFnc2dCaUFJUWFBQkVNTUNSUTA5REVFTElBbEJIM0VoQ1FzZ0N5QXRweUFKZEswM0F3QU1Pd3NnQ0VFSWF5SUhLUU1BSWdFZ0NFRVFheUlKS1FNQUlpMkVRdi8vLy84UFdBUkFJQWtDZmlBdHB5QUJwM1lpQ0VFQVRnUkFJQWl0REFFTFFvQ0FnSURBZmlBSXVMMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzM0F3QU1Pd3NqQUVFUWF5SUpKQUFnQ0VFSWF5SU1LUU1BSVMwQ2Z3SkFBa0FnQmlBSVFSQnJJZ3NwQXdBUWJDSUJRb0NBZ0lCd2d5SXVRb0NBZ0lEZ0FGRUVRQ0FHSUMwUUR3d0JDeUFHSUMwUWJDSXRRb0NBZ0lCd2d5SXZRb0NBZ0lEZ0FGRUVRQ0FHSUFFUUR3d0JDeUFHS0FJUUtBS01BU0lQQkVBZ0R5MEFLRUVFY1EwQ0N5QXVRb0NBZ0lEZ2ZsSWdMMEtBZ0lDQTRINVNjUTBCSUFaQitvZ0JRUUFRRlNBR0lBRVFEeUFHSUMwUUR3c2dDMEtBZ0lDQU1EY0RBQ0FNUW9DQWdJQXdOd01BUVg4TUFRc2dCaUFKUVF4cUlBRVFtQUVhSUFZZ0NVRUlhaUF0RUpnQkdpQUxBbjRnQ1NnQ0RDQUpLQUlJZGlJTFFRQk9CRUFnQzYwTUFRdENnSUNBZ01CK0lBdTR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN6Y0RBRUVBQ3lFTElBbEJFR29rQUNBTFJRMDZERDRMQWtBZ0NFRUlheUlIS1FNQUlnRWdDRUVRYXlJSktRTUFJaTJFUXYvLy8vOFBWZzBBSUFrZ0xhY2dBYWNpQ1VFZ1R3Ui9JQkl0QUNoQkJIRU5BU0FKUVI5eEJTQUpDM1d0TndNQUREb0xJQVlnQ0VHaEFSRERBa1VOT1F3OUN5QUlRUWhySWdjcEF3QWlBU0FJUVJCcklna3BBd0FpTFlSQy8vLy8vdzlZQkVBZ0NTQUJJQzJETndNQUREa0xJQVlnQ0VHdEFSRERBa1VOT0F3OEN5QUlRUWhySWdjcEF3QWdDRUVRYXlJSktRTUFoQ0lCUXYvLy8vOFBXQVJBSUFrZ0FUY0RBQXc0Q3lBR0lBaEJyd0VRd3dKRkRUY01Pd3NnQ0VFSWF5SUhLUU1BSWdFZ0NFRVFheUlKS1FNQUlpMkVRdi8vLy84UFdBUkFJQWtnQVNBdGhUY0RBQXczQ3lBR0lBaEJyZ0VRd3dKRkRUWU1PZ3NnQ0VFSWF5SUhLUU1BSWdFZ0NFRVFheUlKS1FNQUlpMkVRdi8vLy84UFdBUkFJQWtnTGFjZ0FhZElyVUtBZ0lDQUVJUTNBd0FNTmdzZ0JpQUlRYU1CRUpjRFJRMDFERGtMSUFoQkNHc2lCeWtEQUNJQklBaEJFR3NpQ1NrREFDSXRoRUwvLy8vL0QxZ0VRQ0FKSUMybklBR25USzFDZ0lDQWdCQ0VOd01BRERVTElBWWdDRUdrQVJDWEEwVU5OQXc0Q3lBSVFRaHJJZ2NwQXdBaUFTQUlRUkJySWdrcEF3QWlMWVJDLy8vLy93OVlCRUFnQ1NBdHB5QUJwMHF0UW9DQWdJQVFoRGNEQUF3MEN5QUdJQWhCcFFFUWx3TkZEVE1NTndzZ0NFRUlheUlIS1FNQUlnRWdDRUVRYXlJSktRTUFJaTJFUXYvLy8vOFBXQVJBSUFrZ0xhY2dBYWRPclVLQWdJQ0FFSVEzQXdBTU13c2dCaUFJUWFZQkVKY0RSUTB5RERZTElBaEJDR3NpQnlrREFDSUJJQWhCRUdzaUNTa0RBQ0l0aEVMLy8vLy9EMWdFUUNBSklDMm5JQUduUnExQ2dJQ0FnQkNFTndNQURESUxJQVlnQ0VFQUVOSUZSUTB4RERVTElBaEJDR3NpQnlrREFDSUJJQWhCRUdzaUNTa0RBQ0l0aEVMLy8vLy9EMWdFUUNBSklDMm5JQUduUjYxQ2dJQ0FnQkNFTndNQURERUxJQVlnQ0VFQkVOSUZSUTB3RERRTElBaEJDR3NpQnlrREFDSUJJQWhCRUdzaUNpa0RBQ0l0aEVMLy8vLy9EMWdFUUNBS0lDMm5JQUduUnExQ2dJQ0FnQkNFTndNQUREQUxJQVlnQ0VFQUVORUZEQzhMSUFoQkNHc2lCeWtEQUNJQklBaEJFR3NpQ2lrREFDSXRoRUwvLy8vL0QxZ0VRQ0FLSUMybklBR25SNjFDZ0lDQWdCQ0VOd01BREM4TElBWWdDRUVCRU5FRkRDNExJQVlnQ0NBV0tBTElBaEVEQUEweElBaEJDR3NoQnd3dEN5QUlRUWhySWdjcEF3QWlBVUwvLy8vL2IxZ0VRQ0FHUWFIMEFFRUFFQlVNTVFzZ0JpQUlRUkJySWd3cEF3QWlMUkF4SWdsRkRUQWdCaUFCSUFrUWNTRUxJQVlnQ1JBVElBdEJBRWdOTUNBR0lDMFFEeUFHSUFFUUR5QU1JQXRCQUVldFFvQ0FnSUFRaERjREFBd3NDeUFHSUFoQkVHc2lDU2tEQUNJQklBaEJDR3NpQnlrREFDSXRFTkFGSWd0QkFFZ05MeUFHSUFFUUR5QUdJQzBRRHlBSklBdEJBRWV0UW9DQWdJQVFoRGNEQUF3ckN5QUdJQWhCQ0dzaUJ5a0RBQ0lCRUlRRUlRb2dCaUFCRUE4Z0J5QUdJQW9RTFRjREFBd2tDeUFJUVJCcklnd3BBd0FoQVNBR0lBaEJDR3NpQnlrREFDSXRFREVpQ1VVTkxTQUdJQUVnQ1VHQWdBSVExUUVoQ3lBR0lBa1FFeUFMUVFCSURTMGdCaUFCRUE4Z0JpQXRFQThnRENBTFFRQkhyVUtBZ0lDQUVJUTNBd0FNS1FzZ0NrRUZhaUVOSUFZZ0Jpa0R3QUVnQ2lnQUFVRUFFTlVCSWdkQkFFZ05MQ0FJSUFkQkFFZXRRb0NBZ0lBUWhEY0RBQ0FJUVFocUlRY01LQXNnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vMjlXRFNFZ0JpQUJFQ1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBySUFZZ0J5a0RBQkFQSUFjZ0FUY0RBQXdoQ3lBSVFRaHJJZ2NwQXdBaUFVSWdpS2RCQ0dvaUNVRUlUVUVBUVFFZ0NYUkJnd0p4R3cwZ0lBWWdBUkNEQkNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFNvZ0JpQUhLUU1BRUE4Z0J5QUJOd01BRENBTElBaEJFR3NwQXdCQ2dJQ0FnQkNFUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FHUVpZYlFRQVFGUXdxQ3lBSVFRaHJJZ2NwQXdBaUFVSWdpS2RCQ0dvaUNVRUlUVUVBUVFFZ0NYUkJnd0p4R3cwZklBWWdBUkNEQkNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFNrZ0JpQUhLUU1BRUE4Z0J5QUJOd01BREI4TElBcEJDbW9oRFNBS0xRQUpJUXNnQ2lnQUJTRVBJQVlnQ0VFSWF5SUhLUU1BSWdFZ0NpZ0FBU0lNRUhFaUVFRUFTQTBvQWtBZ0VFVU5BQ0FMQkVCQkFDRUxJQVlnQVVIYkFTQUJRUUFRRkNJdFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFNvZ0xVS0FnSUNBY0ZvRVFDQUdJQVlnTFNBTUlDMUJBQkFVRUNZaEN3c2dCaUF0RUE4Z0MwRUFTQTBxSUFzTkFRc0NRQUpBQWtBQ1FBSkFBa0FDUUNBSlFmSUFhdzRHQUFFQ0F3UUZCZ3NnQmlBQklBd2dBVUVBRUJRaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwdklBWWdCeUFCRUNBTUJRc2dCaUFCSUF3Z0NFRVFheUlJS1FNQVFZQ0FBaERRQVNFSklBWWdCeWtEQUJBUElBbEJBRTROQkF3dUN5QUdJQUVnREVFQUVOVUJJZ2xCQUVnTkxTQUdJQWNwQXdBUUR5QUhJQWxCQUVldFFvQ0FnSUFRaERjREFBd0RDeUFJSUFZZ0RCQmNOd01BSUFoQkNHb2hDQXdDQ3lBR0lBRWdEQ0FCUVFBUUZDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRTc2dDQ0FCTndNQUlBaEJDR29oQ0F3QkN5QUdJQUVnRENBQlFRQVFGQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEU29nQmlBSEtRTUFFQThnQjBLQWdJQ0FNRGNEQUNBSUlBRTNBd0FnQ0VFSWFpRUlDeUFOSUE5cVFRVnJJUTBNSHdzZ0JpQUhLUU1BRUE4TUpBc2dDRUVJYXlrREFDSXVRb0NBZ0lCd2cwS0FnSUNBTUZFTkRRd0ZDeUFJUVFocktRTUFJaTVDZ0lDQWdIQ0RRb0NBZ0lBZ1VRME1EQVFMSUFZZ0NFRUlheWtEQUNJdUVJUUVRY1VBUmcwQkRBTUxJQVlnQ0VFSWF5a0RBQ0l1RUlRRVFSdEhEUUlMSUFZZ0xoQVBEQWtMSUFoQkNHc3BBd0FpTGtLQWdJQ0FZSU5DZ0lDQWdDQlJEUWdMSUFZZ0xoQVBJQWhCQ0d0Q2dJQ0FnQkEzQXdBTUZ3c2dFeWdDRkNFSElBNGdDVFlDQkNBT0lBZEJmM01nRFdvMkFnQWdCa0dJSVNBT0VFWU1JQXNnQ2tFRGFpRU5EQlVMUWdJaExnd2dDMEtBZ0lDQU1DRXVEQjhMUWdBaExnd2VDeUFJUVFocklnZ3BBd0FoQVF3ZUMwSEloQUZCcnZ3QVFhajhBRUhLTkJBQUFBc2dDRUVJYTBLQmdJQ0FFRGNEQUF3UEN5QUdJQUZCQVJDdEFSb2dCaUFCRUE4Z0JpQXRFQThNR0FzZ0FTRXZEQU1MUW9DQWdJQXdJUzBMSUFZZ0IwRUFFQlVMUW9DQWdJQXdJUzRMSUFZZ01CQVBJQVlnTFJBUElBWWdNUkFQSUFZZ0x4QVBJQVlnTGhBUElBdENnSUNBZ0RBM0F3QWdERUtBZ0lDQU1EY0RBQXdUQ3lBR0lBc3BBd0FRRHlBTFFvQ0FnSUF3TndNQUlBZEJBRWdORWlBR0lDNFFEMEtBZ0lDQU1DRXVDeUFJSUM0M0F3QWdDQ0FIUVFCSHJVS0FnSUNBRUlRM0F3Z2dDRUVRYWlFSERBMExJQzBoQVFOQUlBWWdEa0hnQUdvZ0RrR0FBV29nQWFkQklSQ09BUTBCUVFBaEJ5QU9LQUpnSVFrZ0RpZ0NnQUVoQ3dOQUlBY2dDMGNFUUNBR0lDNGdDU0FIUVFOMGFpSU1LQUlFUW9DQWdJQWdJQXdvQWdCQkFFZEJBblFRR1JvZ0IwRUJhaUVIREFFTEN5QUdJQWtnQ3hCYUlBWWdBUkNNQWlJQlFvQ0FnSUJ3Z3lJdFFvQ0FnSUFnVVEwRElDMUNnSUNBZ09BQVVRMENJQVlRZTBVTkFBc0xJQVlnQVJBUEN5QUdJQzRRRHlBUFFvQ0FnSURnQURjREFBd09DeUFQSUM0M0F3QU1Bd3NnREMwQUJVRUJjUTBCQ3lBR0lBZEJoWmNCRUk4QkRBc0xJQnNvQWdBb0FoQWlDVUV3YWlFTElBa2dDU2dDR0NBSGNVRi9jMEVDZEdvb0FnQWhDUU5BSUFsRkRRRWdDeUFKUVFGclFRTjBhaUlKS0FJRUlBZEdEUUlnQ1NnQ0FFSC8vLzhmY1NFSkRBQUxBQXNnQ0NFSERBVUxJQVlnQnhEZkJRd0lDeUFHRUNRTUJ3c2dCaUFCRUE4TElBaENnSUNBZ09BQU53TUFJQWhCQ0dvaENBd0ZDeUFMSUFrMkFpUWdDeUFFTmdJb0lBWXBBNmdCSWkxQ0lJaW5RWFZQQkVBZ0xhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBR0lBRkIwUUVnTFVFREVCa2FJQVlnQVVIT0FFS0FnSUNBTUNBR0tRT3dBU0l0SUMxQmdEQVFiUm9nQ0NBQk53TUFJQWhCQ0dvaEJ3dEJBQXNoQ1NBSElRZ2dEU0VLSUFsRkRRRUxDeUFISVFnTFFRRWhCd3dGQ3dKQUFrQWdGaWtEZ0FFaUxrS0FnSUNBY0ZRTkFDQXVweUlITHdFR1FRTkhEUUFnQnlnQ0VDSUhRVEJxSVFvZ0J5QUhLQUlZUVg5elFRSjBRYWgrY21vb0FnQWhCd0pBQTBBZ0J3UkFJQW9nQjBFQmEwRURkR29pQnlnQ0JFRTFSZzBDSUFjb0FnQkIvLy8vSDNFaEJ3d0JDd3NnRWlBTk5nSWdJQVlnTGtFQVFRQkJBQkRLQWlBV0tRT0FBU0V1Q3lBdVFvQ0FnSUJ3VkEwQUlDNm5JZ2N2QVFaQkEwY05BQ0FITFFBRlFTQnhEUUVMQTBBZ0hDQUlJZ2RQRFFFZ0JpQUhRUWhySWdncEF3QWlBUkFQSUFGQ2dJQ0FnSENEUW9DQWdJRFFBRklOQUNBQnB5SUtEUVVnQmlBSFFSQnJJZ2dwQXdBUUR5QUdJQWRCR0dzcEF3QkJBUkN0QVJvTUFBc0FDMEtBZ0lDQTRBQWhMa0tBZ0lDQTRBQWhBU0FUTFFBUlFUQnhSUTBCQ3lBU0lBZzJBaXdnRWlBTk5nSWdEQUVMSUJJb0Fod2dFa0VZYWtjRVFDQVdJQklRendVTEEzNGdDQ0FYVFFSK0lBRUZJQVlnRnlrREFCQVBJQmRCQ0dvaEZ3d0JDd3NoTGdzZ0ZpQVNLQUlBTmdLTUFRd0NDeUFJSUJZcEE0QUJOd01BSUJaQ2dJQ0FnQ0EzQTRBQklCTW9BaFFnQ21vaENpQUhJUWhCQUNFSERBQUxBQXNnRGtHZ0FXb2tBQ0F1Q3o4QkFYOGpBRUhRQUdzaUFpUUFJQUlnQVFSL0lBQW9BaEFnQWtFUWFpQUJFSkFCQlVIUTZnQUxOZ0lBSUFCQnYvVUFJQUlReGdJZ0FrSFFBR29rQUF1b0FRQUNRQ0FCUVlBSVRnUkFJQUJFQUFBQUFBQUE0SCtpSVFBZ0FVSC9EMGtFUUNBQlFmOEhheUVCREFJTElBQkVBQUFBQUFBQTRIK2lJUUJCL1JjZ0FTQUJRZjBYVGh0Qi9nOXJJUUVNQVFzZ0FVR0JlRW9OQUNBQVJBQUFBQUFBQUdBRG9pRUFJQUZCdUhCTEJFQWdBVUhKQjJvaEFRd0JDeUFBUkFBQUFBQUFBR0FEb2lFQVFmQm9JQUVnQVVId2FFd2JRWklQYWlFQkN5QUFJQUZCL3dkcXJVSTBocitpQzNVQkEzOENRQUpBSUFGQ2dJQ0FnSEJhQkVBZ0FhY2lBeThCQmlJRVFRcHJJZ1ZCR2sxQkFFRUJJQVYwUVlHQWdDeHhHeUFFUVFSclFRUkpjZzBCQ3lBQUlBSVFEeUFCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQUVISDVBQkJBQkFWRHdzZ0FDQURLUU1nRUE4Z0F5QUNOd01nQ3dzYkFDQUFJQUZCL3dGeEVCRWdBQ0FDSUFBb0FnUnJRUVJyRUIwTGpnRUJBbjhqQUVFUWF5SUNKQUFDZnlBQkJFQWdBRUVnYWlBQUlBQkJ3UUJyUVJwSkd5QUFRZjhBVFEwQkdpQUNRUVJxSUFCQkFoQ3lBeG9nQWlnQ0JBd0JDeUFBUVNCcklBQWdBRUhoQUd0Qkdra2JJQUJCL3dCTkRRQWFJQUpCQkdvZ0FFRUFFTElESVFFZ0FpZ0NCQ0lESUFBZ0EwSC9BRXNiSUFBZ0FVRUJSaHNMSVFBZ0FrRVFhaVFBSUFBTFJ3SUJmZ0YvSUFBcEE4QUJJUVFnQVVJZ2lLZEJkVThFUUNBQnB5SUZJQVVvQWdCQkFXbzJBZ0FMSUFBZ0JDQUNJQUZCQXhEdkFSb2dBQ0FCSUFNUSt3VWdBQ0FCRUE4TGlBZ0NCWDhCZmlNQVFSQnJJZ01rQUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FBS0FJUUlnSkJ5d0JxRGdNRUFRTUFDeUFDUWVzQWFrRUNTUTBCQWtBZ0FrRXJhdzREQVFZQkFBc2dBa0ZhUmcwRUlBSkIvZ0JHRFFBZ0FrRWhSdzBGQzBGL0lRUWdBQkFTRFFrZ0FFRVFFTjhCRFFrQ1FBSkFBa0FDUUFKQUFrQWdBa0VyYXc0REFnVUJBQXNnQWtHMmYwWU5BeUFDUVNGR0RRSWdBa0grQUVjTkJDQUFRWlVCRUJBTURRc2dBRUdNQVJBUURBd0xJQUJCalFFUUVBd0xDeUFBUVpZQkVCQU1DZ3NnQUVFT0VCQWdBRUVHRUJBTUNRc1FBUUFMSUFBUUVnMEZJQUJCQUJEZkFRMEZJQUFnQTBFTWFpQURRUWhxSUFNZ0EwRUVha0VBUVFFZ0FoQzFBUTBGSUFBZ0FrRUhhMEgvQVhFUUVDQUFJQU1vQWd3Z0F5Z0NDQ0FES0FJQUlBTW9BZ1JCQWtFQUVNRUJEQVFMUVg4aEJDQUFFQklOQnlBQVFSQVEzd0VOQjBFQUlRUUNRQ0FBS0FKQUlnRW9BcGdDSWdKQkFFZ05BQ0FCS0FLQUFpQUNhaUlCTFFBQVFiZ0JSdzBBSUFGQnR3RTZBQUFMSUFCQmx3RVFFQXdIQ3lBQVFVQnJLQUlBSVFGQmZ5RUVJQUFRRWcwR0lBQkJFQkRmQVEwR1FRQWhCQUpBSUFFb0FwZ0NJZ0pCQUVnTkFBSkFBa0FDUUFKQUFrQUNRQ0FCS0FLQUFpQUNhaUlGTFFBQUlnWkJ4d0JyRGdRQkJnWUZBQXNnQmtHK0FVWU5BeUFHUWJnQlJnMENJQVpCd1FCSERRVWdCU2dBQVNFRlFYOGhCQ0FCUVg4MkFwZ0NJQUVnQWpZQ2hBSWdBQ0FBS0FJQUlBVVFYQ0lIUVFFUXRBRWhBU0FBS0FJQUlBY1FEeUFBS0FJQUlBVVFFeUFCUlEwQkRBd0xJQUZCZnpZQ21BSWdBU0FDTmdLRUFnc2dBRUdZQVJBUURBa0xJQVVvQUFFaUFrRUlSaUFDUWZFQVJuSU5BaUFCTFFCdVFRRnhCRUFnQUVHVjdBQkJBQkFXREFjTElBVkJ1Z0U2QUFBTUNBc2dBRUg3OUFCQkFCQVdEQVVMSUFCQk1CQVFJQUJCQUJBYUlBQkJRR3NvQWdCQkF4QmtEQWNMSUFCQkRoQVFJQUJCQ2hBUURBWUxJQUFvQWtBaUFTMEFiRUVDY1VVRVFDQUFRZjd3QUVFQUVCWU1Bd3NnQVNnQ1pFVUVRQ0FBUVpETkFFRUFFQllNQXd0QmZ5RUVJQUFRRWcwRklBQkJFQkRmQVEwRklBQkJpd0VRRUF3RUMwRi9JUVFnQUNBQlFRUnhRUUp5RUxzRERRUWdBQ2dDTUEwQUlBQW9BaEFpQWtIckFHcEJBVXNOQUNBQUlBTkJER29nQTBFSWFpQURJQU5CQkdwQkFFRUJJQUlRdFFFTkJDQUFJQUpCQld0Qi93RnhFQkFnQUNBREtBSU1JQU1vQWdnZ0F5Z0NBQ0FES0FJRVFRTkJBQkRCQVNBQUVCSU5CQXRCQUNFRUlBRkJHSEZGRFFNZ0FDZ0NFRUYrY1VHa2YwY05BeUFCUVJCeFJRMEJJQUFvQWtBdEFHNUJCSEVOQVNBQUtBSUFRYStZQVVFQUVJQUNDMEYvSVFRTUFndEJmeUVFSUFBUUVnMEJJQUJCQ0JEZkFRMEJJQUJCbndFUUVBdEJBQ0VFQ3lBRFFSQnFKQUFnQkF0Z0FDQUVRZklBSUFOQnhnQnJJQU5CdHdGR0cwSC9BWEVRRVNBRUlBQWdBaEFZRUIwZ0JTQUJJQVVvQWdBUXlBTWlBRFlDQUNBRUlBQVFIU0FFSUFaQi93RnhFQkVnQVNBRktBSUFRUUVRYVJvZ0FTQUJLQUxRQWtFQmFqWUMwQUlMOGlzQkVYOGpBRUdRQVdzaUF5UUFJQUFvQWdBaERnSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQUtBSVFJZ1JCZzM5SERRQWdBQ2dDS0EwQ0lBQW9BamhCQUJDREFVRTZSdzBCSUE0Z0FDZ0NJQkFZSVFrZ0FFRkFheWdDQUVHd0Ftb2hBZ0pBQTBBZ0FpZ0NBQ0lDUlEwQklBSW9BZ1FnQ1VjTkFBc2dBRUd2NXdCQkFCQVdEQnNMSUFBUUVnMGFJQUJCT2hBc0RSb2dBQ2dDRUNJRVFjVUFha0VEU1EwQUlBQkJRR3NpQlNnQ0FCQXlJUWNnQXlBRktBSUFJZ1FvQXJBQ05nSlFJQVFnQTBIUUFHbzJBckFDSUFOQmZ6WUNaQ0FEUXYvLy8vOFBOd0pjSUFNZ0J6WUNXQ0FESUFrMkFsUWdBeUFFS0FLOEFUWUNhRUVBSVFJZ0EwRUFOZ0pzSUFBZ0FVRWVkRUVmZFVFQVFRTWdCQzBBYmtFQmNSdHhFT0VCRFJvZ0FDQUhFQjRnQlNnQ0FDSUFJQUFvQXJBQ0tBSUFOZ0t3QWd3Y0N3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBUkIwQUJxRGlRREZBRWxGQlFVRkJRVUZBVUVCZ2NIQ0JRVUFna1VGQXdTQ3hFa0V4TVRGQlFVRkNRQUN5QUVRWU4vUmcwTUlBUkJPMFlOQ1NBRVFmc0FSdzBUSUFBUTRnSU5KUXdtQ3lBQUtBSkFLQUlnQkVBZ0FFR3F6QUJCQUJBV0RDVUxJQUFRRWcwa1FRQWhBaUFBQW45QkFDQUFLQUlRSWdSQk8wWU5BQnBCQUNBRVFmMEFSZzBBR2tFQUlBQW9BakFOQUJvZ0FCQ1JBUTBsUVFFTEVPVUNJQUFRdHdFTkpBd21DeUFBRUJJTkl5QUFLQUl3QkVBZ0FFSEpJVUVBRUJZTUpBc2dBQkNSQVEwaklBQkJMeEFRSUFBUXR3RkZEU1FNSXdzZ0FCQVNEU0lnQUJDQUFSb2dBQkRBQVNBQUVQSUJEU0lnQUVIcEFFRi9FQndoQVNBQUlBQW9Ba0F0QUc1QkFYRkZJZ0lRNFFFTklnSkFJQUFvQWhCQnNYOUhCRUFnQVNFRURBRUxJQUJCNndCQmZ4QWNJUVFnQUJBU0RTTWdBQ0FCRUI0Z0FDQUNFT0VCRFNNTElBQWdCQkFlREI4TElBQkJRR3NpQkNnQ0FCQXlJUUVnQkNnQ0FCQXlJUUlnQXlBRUtBSUFJZ1FvQXJBQ05nSlFJQVFnQTBIUUFHbzJBckFDSUFOQ2dJQ0FnSEEzQW1BZ0F5QUJOZ0pjSUFNZ0FqWUNXQ0FESUFrMkFsUWdCQ2dDdkFFaEJDQURRUUEyQW13Z0F5QUVOZ0pvSUFBUUVnMGhJQUFRd0FFZ0FDQUJFQjRnQUJEeUFRMGhJQUJCNlFBZ0FoQWNHaUFBRUtBQ0RTRWdBRUhyQUNBQkVCd2FJQUFnQWhBZUlBQkJRR3NvQWdBaUFDQUFLQUt3QWlnQ0FEWUNzQUlNSWdzZ0FFRkFheUlCS0FJQUVESWhBaUFCS0FJQUVESWhCQ0FCS0FJQUVESWhCU0FESUFFb0FnQWlBU2dDc0FJMkFsQWdBU0FEUWRBQWFqWUNzQUlnQTBLQWdJQ0FjRGNDWUNBRElBSTJBbHdnQXlBRU5nSllJQU1nQ1RZQ1ZDQUJLQUs4QVNFQklBTkJBRFlDYkNBRElBRTJBbWdnQUJBU0RTQWdBQ0FGRUI0Z0FCREFBU0FBRUtBQ0RTQWdBQ0FDRUI0Z0FFRzhmeEFzRFNBZ0FCRHlBUTBnSUFBb0FoQkJPMFlFUUNBQUVCSU5JUXNnQUVIcUFDQUZFQndhSUFBZ0JCQWVJQUJCUUdzb0FnQWlBQ0FBS0FLd0FpZ0NBRFlDc0FJTUlRc2dBQkFTRFI4Z0FCREFBU0FEUVFBMkFoZ0NRQ0FBS0FJUUlnSkJXa2NFUUVFQklRRWdBa0VvUncwQklBQWdBMEVZYWtFQUVKNEJHZ3dCQ3lBQUtBSkFMUUJzUVFKeFJRUkFJQUJCbVRaQkFCQVdEQ0VMSUFBUUVnMGdRUUFoQVFzZ0FFRW9FQ3dOSDBFQklRUWdBeTBBR0VFQmNVVUVRQ0FBS0FJQUlRb2dBRUZBYXlJQ0tBSUFJZ2dvQXJ3QklROGdDQkF5SVFjZ0FpZ0NBQkF5SVJBZ0FpZ0NBQkF5SVJFZ0FpZ0NBQkF5SVJJZ0FCQ0FBUm9nQXlBQ0tBSUFJZ1VvQXJBQ05nSlFJQVVnQTBIUUFHbzJBckFDSUFOQkFEWUNiQ0FEUW9HQWdJQndOd0pnSUFNZ0J6WUNYQ0FESUJFMkFsZ2dBeUFKTmdKVUlBTWdEellDYUNBQVFlc0FRWDhRSENFTUlBSW9BZ0FvQW9RQ0lRc2dBQ0FTRUI0Z0FDZ0NFQ0VDUVZNaEJRSkFBa0FDUUFKQUlBQkJCQkM5QXc0Q0FBRWtDeUFDUVV0R0lRMGdBa0ZUUmlFRUlBUWdBa0d6ZjBaeVJTQUNRVXRIY1EwQklBSWhCUXNnQUJBU0RTSWdBQ2dDRUNJQ1Fmc0FSaUFDUWRzQVJuSU5FZ0pBSUFKQmczOUdCRUFnQUNnQ0tFVU5BUXNnQUVISjl3QkJBQkFXRENNTElBb2dBQ2dDSUJBWUlRWWdBQkFTQkVBZ0FDZ0NBQ0FHRUJNTUl3c2dBQ0FHSUFVUW9RSUVRQ0FBS0FJQUlBWVFFd3dqQ3lBQVFiMEJRYjBCUWJrQklBUWJJQTBiRUJBZ0FDQUdFQm9nQUVGQWF5Z0NBQ0FJTHdHOEFSQVhEQUVMQWtBQ1FDQUFLQUlRUVNCeVFmc0FSdzBBSUFBZ0EwRkFhMEVBRUo0QklnUkJXMGNnQkVHNWYwZHhEUUFnQUVFQVFRQkJBU0FES0FKQVFRSnhRUUVRd2dGQkFFNE5BUXdqQ3lBQUVLTUNEU0lnQUNBRFFjZ0FhaUFEUWNRQWFpQURRY3dBYWlBRFFUeHFRUUJCQUVHOWZ4QzFBUTBpSUFBZ0F5Z0NTQ0FES0FKRUlBTW9Ba3dnQXlnQ1BFRUVRUUFRd1FFTElBSWhCUXRCQUNFQ0RCd0xJQUJCUUdzb0FnQW9BcndCSVFZZ0FCQ0FBUm9nQUNnQ0VDSUJRVHRHRFJwQlV5RUVBa0FnQUVFRUVMMEREZ0lBR1NBTElBRkJzMzlHSUFGQlUwWnlEUmNnQVNJRVFVdEdEUmdnQUVFQUVOa0VEUjhnQUVFT0VCQU1HUXNnQUJBU0RSNENRQ0FBS0FJd0RRQWdBQ2dDRUVHRGYwY05BQ0FBS0FJb0RRQWdBQ2dDSUNFSEN5QUFLQUpBSWdKQnNBSnFJUUVnQWlnQ3ZBRWhCU0FFUWI1L1JpRUdBa0FEUUNBQktBSUFJZ0VFUUNBQUlBVWdBU2dDR0JDZkFpQUJLQUlZSVFVQ1FDQUdSUVJBSUFFb0Fnd2lBa0YvUmcwQklBZEZEUVFnQVNnQ0JDQUhSdzBCREJrTElBRW9BZ2dpQWtGL1JnMEFJQWRGRFFNZ0FTZ0NCQ0FIUmcwWUN5QUJLQUljQkg4Z0FFR0RBUkFRUVFNRlFRQUxJUUlEUUNBQ0lBRW9BaEJPUlFSQUlBQkJEaEFRSUFKQkFXb2hBZ3dCQ3dzZ0FTZ0NGRUYvUmcwQklBQkJCaEFRSUFCQjdRQWdBU2dDRkJBY0dpQUFRUTRRRUF3QkN3c2dCMFVFUUNBRVFiNS9SZzBQSUFCQjA4a0FRUUFRRmd3Z0N5QUFRY0R5QUVFQUVCWU1Id3NnQUVIckFDQUNFQndhREJVTElBQVFFZzBkSUFBUXdBRWdBQkR5QVEwZElBQVFnQUVhSUFCQlFHc2lCQ2dDQUJBeUlRVWdBeUFFS0FJQUlnSW9BckFDTmdKUUlBSWdBMEhRQUdvMkFyQUNRWDhoQVNBRFFYODJBbVFnQTBMLy8vLy9IemNDWENBRElBVTJBbGdnQXlBSk5nSlVJQUlvQXJ3QklRSWdBMEVBTmdKc0lBTWdBallDYUNBQVFmc0FFQ3dOSFVGL0lRY0RRQUpBQWtBQ1FDQUFLQUlRSWdKQlAyb09BZ0FCQWdzZ0FVRUFTQVIvUVg4RklBQkI2d0JCZnhBY0N5RUNJQUFnQVJBZUEwQWdBQkFTRFNFZ0FFRVJFQkFnQUJDUkFRMGhJQUJCT2hBc0RTRWdBRUdyQVJBUUlBQW9BaEJCUVVZRVFDQUFRZW9BSUFJUUhDRUNEQUVMQ3lBQVFla0FRWDhRSENFQklBQWdBaEFlREFJTElBQVFFZzBmSUFCQk9oQXNEUjhnQjBFQVRnUkFRWmd0SVFJTUZRc2dBVUVBU0FSQUlBQkI2d0JCZnhBY0lRRUxJQUJCdGdFUUVDQUVLQUlBUVFBUU9TQUVLQUlBS0FLRUFrRUVheUVIREFFTElBSkIvUUJIQkVBZ0FVRUFTQVJBUWU4c0lRSU1GUXNnQUVFSEVPRUJSUTBCREI4TEN5QUFRZjBBRUN3TkhRSkFJQWRCQUU0RVFDQUFRVUJyS0FJQUlnSW9Bb0FDSUFkcUlBRTJBQUFnQWlnQ3BBSWdBVUVVYkdvZ0IwRUVhallDQkF3QkN5QUFJQUVRSGdzZ0FDQUZFQjRnQUVFT0VCQWdBRUZBYXlnQ0FDSUJJQUVvQXJBQ0tBSUFOZ0t3QWd3YUN5QUFFTUFCSUFBUUVnMGNJQUJCUUdzaUJDZ0NBQkF5SVFVZ0JDZ0NBQkF5SVFFZ0JDZ0NBQkF5SVFJZ0JDZ0NBQkF5SVFjZ0FFSHNBQ0FGRUJ3YUlBTWdCQ2dDQUNJR0tBS3dBallDVUNBR0lBTkIwQUJxTmdLd0FpQURRdi8vLy84Zk53SmNJQU5DZ0lDQWdIQTNBbFFnQmlnQ3ZBRWhCaUFEUVFBMkFtd2dBeUFHTmdKb0lBTWdBallDWkNBQUVPSUNEUndnQkNnQ0FDSUVJQVFvQXJBQ0tBSUFOZ0t3QWlBRUVPWUNCRUFnQUVFT0VCQWdBRUVHRUJBZ0FFSHRBQ0FDRUJ3YUlBQkJEaEFRSUFCQjZ3QWdCeEFjR2dzQ1FBSkFBa0FnQUNnQ0VFRTdhZzRDQUJNQkN5QUFFQklOSGlBQUVJQUJHaUFBSUFVUUhpQUFLQUlRUWZzQVJnUkFJQUJCRGhBUURCSUxJQUJCS0JBc0RSNGdBQ2dDRUNJRVFmc0FSaUFFUWRzQVJuSU5BUUpBSUFSQmczOUdCRUFnQUNnQ0tFVU5BUXNnQUVIZTlnQkJBQkFXREI4TElBNGdBQ2dDSUJBWUlRUUNRQ0FBRUJKRkJFQWdBQ0FFUVVVUW9RSkJBRTROQVFzZ0RpQUVFQk1NSHdzZ0FFRzVBUkFRSUFCQlFHc2lCU2dDQUNBRUVEa2dCU2dDQUNJRUlBUXZBYndCRUJjTUVBc2dBRUhnSFVFQUVCWU1IUXNnQUVGVFFRQkJBVUYvUVFFUXdnRkJBRTRORGd3Y0N5QUFFQkpGRFJ3TUd3c2dBRUZBYXlnQ0FDMEFia0VCY1FSQUlBQkJvTmdBUVFBUUZnd2JDeUFBRUJJTkdpQUFFUElCRFJvZ0FCQ0FBUm9nQUNBQVFVQnJJZ0VvQWdCQjFBQkJBQkNnQVNJQ1FRQklEUm9nQUVIdkFCQVFJQUJCMlFBUUVDQUJLQUlBSUFKQi8vOERjUkFYSUFBUXdBRWdBQkNnQWcwYURCY0xJQUZCQVhGRkRRTWdBVUVFY1EwS0lBQW9BamhCQUJDREFVRXFSZzBEREFvTElBQW9BaWhGRFFFTElBQVE0Z0VNRnd0QlV5RUVBa0FnQUNBQkVMMEREZ0lBRlJjTElBQkJoUUVRU2tVTkJDQUFLQUk0UVFFUWd3RkJSMGNOQkNBQlFRUnhEUWNMSUFCQm15TkJBQkFXREJVTElBRkJCSEZGQkVBZ0FFSGZJa0VBRUJZTUZRdEJmeUVCUVFBaEFpQUFRUUJCQUJEdEFrVU5GZ3dYQ3lBQUVCSU5FeUFBRUxjQlJRMFVEQk1MSUFNZ0FDZ0NBQ2dDRUNBRFFkQUFhaUFBS0FJZ0VKQUJOZ0lRSUFCQmdEMGdBMEVRYWhBV0RCSUxJQUFRa1FFTkVRSkFJQUJCUUdzaUFTZ0NBQ2dDcEFGQkFFNEVRQ0FBUWRrQUVCQWdBU2dDQUNJQklBRXZBYVFCRUJjTUFRc2dBRUVPRUJBTElBQVF0d0ZGRFJJTUVRc2dBRUhyMlFCQkFCQVdEQkFMUVFFaEFpQUFJQVZCQUVFQlFYOUJBQkRDQVVFQVRnMExEQThMUVFBaEFpQUFRUUZCQUNBQUtBSVlJQUFvQWhRUXhBRU5EZ3dRQ3lBQVFTa1FMQTBOQ3lBQVFld0FJQUVRSEJvZ0FCQ0FBUm9nQXlBQVFVQnJJZ1FvQWdBaUJTZ0NzQUkyQWxBZ0JTQURRZEFBYWpZQ3NBSWdBMEwvLy8vL0h6Y0NYQ0FEUW9DQWdJQndOd0pVSUFVb0Fyd0JJUVVnQTBFQU5nSnNJQU1nQlRZQ2FDQURJQUkyQW1RZ0FCRGlBZzBNSUFRb0FnQWlCU0FGS0FLd0FpZ0NBRFlDc0FJZ0FCRHpBU0FBRVBNQklBUW9BZ0FRNWdJRVFDQUFRUTRRRUNBQVFRWVFFQ0FBUWUwQUlBSVFIQm9nQUVFT0VCQWdBRUhyQUNBSEVCd2FDeUFCSVFVTElBQWdCUkFlSUFCQjdRQWdBaEFjR2lBQVFTOFFFQ0FBSUFJUUhpQUFLQUlRUVVaR0JFQWdBQkFTRFF3Z0F5QUFRVUJyS0FJQUlnSW9BckFDTmdKUUlBSWdBMEhRQUdvMkFyQUNJQU5CZnpZQ1pDQURRdi8vLy84dk53SmNJQU5DZ0lDQWdIQTNBbFFnQWlnQ3ZBRWhCRUVBSVFFZ0EwRUFOZ0pzSUFNZ0JEWUNhQ0FDS0FLa0FVRUFUZ1JBSUFBb0FnQWdBa0hSQUJCUElnRkJBRWdORFNBQVFkZ0FFQkFnQUVGQWF5SUNLQUlBSWdRZ0JDOEJwQUVRRnlBQVFka0FFQkFnQWlnQ0FDQUJRZi8vQTNFUUZ5QUFFTUFCQ3lBQUVPSUNEUXdnQUVGQWF5SUVLQUlBSWdJb0FxUUJRUUJPQkVBZ0FFSFlBQkFRSUFRb0FnQWdBVUgvL3dOeEVCY2dBRUhaQUJBUUlBUW9BZ0FpQVNBQkx3R2tBUkFYSUFRb0FnQWhBZ3NnQWlBQ0tBS3dBaWdDQURZQ3NBSUxJQUJCN2dBUUVDQUFJQWNRSGd3TUN5QUFJQUpCQUJBV0RBb0xJQUJCNndBZ0FoQWNHaUFBRUJJTkNRc2dBQkMzQVVVTkNRd0lDeUFCSVFRTElBQVFFZzBHSUFCQkFDQUVRUUFRekFNTkJnc2dBQ0FBUVVCcktBSUFLQUs4QVNBR0VKOENDeUFBUVRzUUxBMEVJQUJCUUdzaUFpZ0NBQkF5SVFVZ0FpZ0NBQkF5SVFRZ0FpZ0NBQkF5SVFFZ0FpZ0NBQkF5SVFjZ0F5QUNLQUlBSWdJb0FyQUNOZ0ljSUFJZ0EwRWNhallDc0FJZ0EwS0FnSUNBY0RjQ0xDQURJQVEyQWlnZ0F5QUhOZ0lrSUFNZ0NUWUNJQ0FDS0FLOEFTRUNJQU5CQURZQ09DQURJQUkyQWpRZ0FTRUNJQUFvQWhCQk8wY0VRQ0FBSUFVUUhpQUFFSkVCRFFVZ0FFSHBBQ0FIRUJ3YUlBVWhBZ3NnQUVFN0VDd05CQUpBSUFBb0FoQkJLVVlFUUNBRElBSTJBaWhCQUNFRklBSWhCQXdCQ3lBQVFlc0FJQUVRSEJvZ0FFRkFheWdDQUNnQ2hBSWhCU0FBSUFRUUhpQUFFSkVCRFFVZ0FFRU9FQkFnQVNBQ1JnMEFJQUJCNndBZ0FoQWNHZ3NnQUVFcEVDd05CQ0FBUVVCcklnZ29BZ0FvQW9RQ0lRc2dBQ0FCRUI0Z0FCQ2dBZzBFSUFBZ0NDZ0NBQ2dDdkFFZ0JoQ2ZBZ0pBSUFFZ0FrWWdBaUFFUm5KRkJFQWdBRUZBYXlJR0tBSUFJZ0ZCZ0FKcUlnZ2dBU2dDaEFJaUNpQUxJQVZySWdKcUVNWUJHaUFJSUFFb0FvQUNJQVZxSUFJUWNpQUJLQUtBQWlBRmFrR3pBU0FDRUNzYUlBWW9BZ0FpQWlBQktBS0VBa0VGYXpZQ21BSWdCQ0FDS0FLc0FpSUJJQUVnQkVnYklRWWdDaUFGYXlFSUEwQWdCQ0FHUmcwQ0lBSW9BcVFDSUFSQkZHeHFJZ29vQWdRaUFTQUZTQ0FCSUF0T2NrVUVRQ0FLSUFFZ0NHbzJBZ1FMSUFSQkFXb2hCQXdBQ3dBTElBQkI2d0FnQkJBY0dnc2dBQ0FIRUI0Z0FFRkFheWdDQUNJQklBRW9BckFDS0FJQU5nS3dBZ3dCQ3lBQVFlc0FJQkFRSEJvZ0FFRkFheWdDQUNnQ2hBSWhEU0FBSUF3UUhnSkFJQUFvQWhBaURFRTlSdzBBQWtBZ0FCQVNSUVJBSUFCQkFCQzJBVVVOQVFzZ0NpQUdFQk1NQlFzZ0JrVU5BQ0FBUWJrQkVCQWdBQ0FHRUJvZ0FFRkFheWdDQUNBSUx3RzhBUkFYQ3lBS0lBWVFFd0pBQWtBQ1FDQUFRY01BRUVvaUJBUkFJQU5CQVRZQ2JDQURJQU1vQW1CQkFtbzJBbUJCcWQwQUlRWWdERUU5UmcwQkRBTUxJQUFvQWhCQnVYOUhEUUVnQVVVRVFDQUFRZmFYQVVFQUVCWU1Cd3NnREVFOVJ3MENRY1RRQUNFR0lBVkJzMzlIRFFBZ0NDMEFia0VCY1VVZ0FrRi9jM0VOQWdzZ0F5QUdOZ0lBSUFCQi9jQUFJQU1RRmd3RkN5QUFRZFhPQUVFQUVCWU1CQXNnQUJBU0RRTUNRQ0FFQkVBZ0FCQldSUTBCREFVTElBQVFrUUVOQkFzZ0FDQUFRVUJySWdVb0FnQW9BcndCSUE4UW53SWdBRUg5QUVIK0FDQUJHMEg4QUNBRUd4QVFJQUJCNndBZ0J4QWNHaUFBUVNrUUxBMERJQVVvQWdBaUFrR0FBbW9pQ0NBQ0tBS0VBaUlLSUEwZ0Myc2lCbW9ReGdFYUlBZ2dBaWdDZ0FJZ0Myb2dCaEJ5SUFJb0FvQUNJQXRxUWJNQklBWVFLeG9nQlNnQ0FDSUZJQUlvQW9RQ1FRVnJOZ0tZQWlBSElBVW9BcXdDSWdJZ0FpQUhTQnNoQ0NBS0lBdHJJUW9nQnlFQ0EwQWdBaUFJUndSQUlBVW9BcVFDSUFKQkZHeHFJZ3dvQWdRaUJpQUxTQ0FHSUExT2NrVUVRQ0FNSUFZZ0NtbzJBZ1FMSUFKQkFXb2hBZ3dCQ3dzZ0FDQVFFQjRnQUJDZ0FnMERJQUFnQUVGQWF5Z0NBQ2dDdkFFZ0R4Q2ZBaUFBSUFjUUhnSi9JQVFFUUNBQlJRUkFJQUJCRkJBUUlBQkJEaEFRSUFCQkpCQVFJQUJCUUdzb0FnQkJBQkFYSUFCQml3RVFFQ0FBUVlJQkVCQkJnd0VNQWdzZ0FFR0FBUkFRSUFCQlFHc29BZ0JCQUJCa1FZTUJEQUVMSUFCQi93QVFFRUVPQ3lFQ0lBQkI2UUFnRWhBY0dpQUFRUTRRRUNBQUlCRVFIaUFBSUFJUUVDQUFRVUJyS0FJQUlnRWdBU2dDc0FJb0FnQTJBckFDQ3lBQUVQTUJEQU1MSUFGQkJIRU5BQ0FBUWRvalFRQVFGZ3dCQ3lBQUVCSU5BRUVBSVFJZ0FFRUJJQVJCQUJETUF3MEFJQUFRdHdGRkRRSUxRWDhoQWd3QkMwRUFJUUlMSUE0Z0NSQVRJQUloQVFzZ0EwR1FBV29rQUNBQkN6b0JBWDhqQUVIUUFHc2lBU1FBSUFFZ0FDZ0NBQ2dDRUNBQlFSQnFJQUFvQWlBUWtBRTJBZ0FnQUVHc3hRQWdBUkFXSUFGQjBBQnFKQUFMamdJQkFYNENRQUpBQWtBQ1FDQUJRdi8vLy85dldBMEFJQUFnQVVFOElBRkJBQkFVSWdGQ2dJQ0FnSENESWdOQ2dJQ0FnT0FBVVFSQUlBRVBDeUFEUW9DQWdJQXdVUVJBSUFKQ0lJaW5RWFZKRFFNTUJBc2dBVUwvLy8vL2IxZ0VRQ0FBSUFFUUR3d0JDeUFBSUFGQjJnRWdBVUVBRUJRaEF5QUFJQUVRRHdKQUFrQWdBMEtBZ0lDQWNJTWlBVUtBZ0lDQUlGSUVRQ0FCUW9DQWdJRGdBRkVOQWlBQlFvQ0FnSUF3VWcwQkN5QUNRaUNJcDBGMVNRMEVEQVVMSUFOQ2dJQ0FnSEJhQkVBZ0E2Y3RBQVZCRUhFTkFRc2dBQ0FERUE4Z0FFR2lQa0VBRUJVTUFnc2dBdzhMSUFBUUpBdENnSUNBZ09BQUlRSUxJQUlQQ3lBQ3B5SUFJQUFvQWdCQkFXbzJBZ0FnQWdzU0FDQUFJQUVnQWlBRElBUkJ4d0FRcEFRTERRQWdBQ0FCSUFKQkFCQ1ZCQXZzQkFNQ2ZnRjhBMzhqQUVFUWF5SUhKQUFDUUFKQUFrQUNRQUorQWtBQ1FBSkFBa0FnQVVFSWF5SUdLUU1BSWdSQ0lJaW5RUWRyUVc1SkRRQUNRQ0FFUW9DQWdJQndWQTBBSUFBZ0IwRUlhaUFFSUFJUXdnVWlBVUVBU0FSQVFYOGhBUXdLQ3lBQlJRMEFJQUFnQkJBUFFRQWhBU0FIS1FNSUlRTU1DQXRCZnlFQlFvQ0FnSUF3SVFNZ0FDQUVFR3dpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBIQWtBQ1FBSkFBa0FnQkVJZ2lLY2lDRUVMYWc0REF3RUNBQXNnQ0EwRElBVEVJUU1DUUFKQUFrQWdBa0dNQVdzT0JBQUNBUUVIQ3lBRVFpQ0dVQVJBUVFBaEFVS0FnSUNBd1A3L0F5RUREQTBMUWdBZ0EzMGhBd3dCQ3lBRElBSkJBWFJCblFKcnJId2hBd3NnQTBMLy8vLy9ENE1nQTBLQWdJQ0FDSHhDLy8vLy93OVlEUWNhUW9DQWdJREFmaUFEdWIwaUEwS0FnSUNBd0lHQS9QOEFmU0FEUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3dIQ3lBQUtBSVFJUUVNQndzZ0FDQUdJQUlnQkNBQUtBSVFLQUs0QWhFYkFFVU5Cd3dJQ3lBQUlBWWdBaUFFSUFBb0FoQW9BdFFDRVJzQURRY01CZ3NnQUNnQ0VDSUJLQUtNQVNJSUJFQWdDQzBBS0VFRWNRMEZDeUFFUW9DQWdJREFnWUQ4L3dCOHZ5RUZBa0FnQWtHTUFXc09CQUFEQWdJQkN5QUZtaUVGREFJTEVBRUFDeUFDUVFGMFFaMENhN2NnQmFBaEJRdENnSUNBZ01CK0lBVzlJZ05DZ0lDQWdNQ0JnUHovQUgwZ0EwTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElRTkJBQ0VCREFJTElBQWdCaUFDSUFRZ0FTZ0NuQUlSR3dCRkRRQkJmeUVCUW9DQWdJQXdJUU1NQVF0QkFDRUJEQUVMSUFZZ0F6Y0RBQXNnQjBFUWFpUUFJQUVMbmdNQ0EzNEJmd0pBQWtBZ0FnUkFJQUFnQVVIY0FTQUJRUUFRRkNJRFFvQ0FnSUJ3Z3lJRVFvQ0FnSUFnVWdSQUlBUkNnSUNBZ09BQVVRMERJQVJDZ0lDQWdEQlNEUUlMSUFBZ0FVSFJBU0FCUVFBUUZDSURRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSWdBQ0FCSUFNUStnTWhCQ0FBSUFNUUR5QUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdCQThMUW9DQWdJRGdBQ0VEQWtBZ0FDQUVRZW9BSUFSQkFCQVVJZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBUVRjUWRpSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQ0FGRUE4TUFRc2dBRUVRRUY4aUFrVUVRQ0FBSUFFUUR5QUFJQVVRRHd3QkN5QUVRaUNJcDBGMVR3UkFJQVNuSWdZZ0JpZ0NBRUVCYWpZQ0FBc2dBaUFGTndNSUlBSWdCRGNEQUNBQlFvQ0FnSUJ3V2dSQUlBR25JQUkyQWlBTElBRWhBd3NnQUNBRUVBOGdBdzhMSUFBZ0FVSFJBU0FCUVFBUUZDSURRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRUxJQUFnQXhBNFJRUkFJQUFnQXhBUElBQkIvdWtBUVFBUUZVS0FnSUNBNEFBUEN5QUFJQUVnQXhENkF5RUJJQUFnQXhBUElBRWhBd3NnQXd2L0FnSURmd0orSXdCQkVHc2lBeVFBQWtBQ1FDQUJRb0NBZ0lCd1dnUkFJQUduSWdJdkFRWkJNRVlFUUFKQUlBQWdBMEVJYWlBQlFkOEFFSUVCSWdKRkRRQWdBeWtEQ0NJQlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQUlBSXBBd0FRNkFFaEFRd0ZDeUFBSUFFZ0Fpa0RDRUVCSUFJUUx5SUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTUNRQUpBSUFWQ0lJaW5RUUZxRGdRQUFRRUFBUXNnQUNBQ0tRTUFFSmtCSWdSQkFFZ0VRQ0FBSUFVUUR3d0NDeUFFRFFSQ2dJQ0FnT0FBSVFFZ0FDQUNLUU1BRU9nQklnWkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUFJQVVRRHd3R0N5QUFJQVlRRHlBR3B5QUZwMFlOQkFzZ0FDQUZFQThnQUVHRTVBQkJBQkFWQzBLQWdJQ0E0QUFoQVF3REN5QUNLQUlRS0FJc0lnQkZCRUJDZ0lDQWdDQWhBUXdEQ3lBQUlBQW9BZ0JCQVdvMkFnQWdBSzFDZ0lDQWdIQ0VJUUVNQWdzZ0FDQUJFSTBFSWdGQ0lJaW5RWFZKRFFFZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBREFFTElBVWhBUXNnQTBFUWFpUUFJQUVMQ3dBZ0FFR05Ja0VBRUVZTEdnQWdBQ2dDRUNBQklBSVE3d1FpQVVVRVFDQUFFSHdMSUFFTGdBRUJBbjhDUUFKQUlBRkZEUUFnQVNnQ0FDSUNRUUJNRFFFZ0FTQUNRUUZySWdJMkFnQWdBZzBBSUFFdEFBVkJBWEVFUUNBQUlBRXBBeGdRSXdzZ0FTZ0NDQ0lDSUFFb0Fnd2lBellDQkNBRElBSTJBZ0FnQVVJQU53SUlJQUJCRUdvZ0FTQUFLQUlFRVFBQUN3OExRZGFOQVVHdS9BQkI5Q2hCNnQwQUVBQUFDeElBSUFGQjNnRk9CRUFnQUNBQkVPZ0ZDd3ZiQVFJQmZ3SitRUUVoQkFKQUlBQkNBRklnQVVMLy8vLy8vLy8vLy84QWd5SUZRb0NBZ0lDQWdNRC8vd0JXSUFWQ2dJQ0FnSUNBd1AvL0FGRWJEUUFnQWtJQVVpQURRdi8vLy8vLy8vLy8vd0NESWdaQ2dJQ0FnSUNBd1AvL0FGWWdCa0tBZ0lDQWdJREEvLzhBVVJzTkFDQUFJQUtFSUFVZ0JvU0VVQVJBUVFBUEN5QUJJQU9EUWdCWkJFQkJmeUVFSUFBZ0FsUWdBU0FEVXlBQklBTlJHdzBCSUFBZ0FvVWdBU0FEaFlSQ0FGSVBDMEYvSVFRZ0FDQUNWaUFCSUFOVklBRWdBMUViRFFBZ0FDQUNoU0FCSUFPRmhFSUFVaUVFQ3lBRUN5MEJBWDlCQVNFQkFrQUNRQUpBSUFCQkRXc09CQUlCQVFJQUN5QUFRVFJHRFFFTElBQkJPRVloQVFzZ0FRc2ZBQ0FBSUFFZ0FDQUNFS29CSWdJZ0F5QUVFQmtoQkNBQUlBSVFFeUFFQzBRQkFYOUJmeUVESUFBZ0FDZ0NCQ0FDYWhER0FRUi9RWDhGSUFBb0FnQWdBV29pQXlBQ2FpQURJQUFvQWdRZ0FXc1FuQUVnQUNBQUtBSUVJQUpxTmdJRVFRQUxDNDRCQVFGL0lBQWdCa0VNRUVraUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBQWdBQ2dDQUVFQmFqWUNBQ0FHcHlJSElBVTdBU29nQnlBRU9nQXBJQWNnQXpvQUtDQUhJQUUyQWlRZ0J5QUFOZ0lnSUFjZ0J5MEFCVUh2QVhFZ0JFRUNhMEVFU1VFRWRISTZBQVVnQUNBR0lBQWdBa0hNbmdFZ0Foc1FxZ0VpQVNBREVKWURJQUFnQVJBVEN5QUdDeWtCQVg5QmZ5RUJBa0FnQUVFb0VDd05BQ0FBRUpFQkRRQkJmMEVBSUFCQktSQXNHeUVCQ3lBQkM0SUJBUU4vSUFCQlFHc2lBeWdDQUNJQkJFQWdBU2dDdkFFaEFpQUFRYlVCRUJBZ0F5Z0NBQ0FDUWYvL0EzRVFGeUFCSUFFb0Fzd0JJZ01nQWtFRGRHb29BZ0FpQURZQ3ZBRURRQUpBSUFCQkFFZ0VRRUYvSVFBTUFRc2dBeUFBUVFOMGFpSUNLQUlFSWdCQkFFNE5BQ0FDS0FJQUlRQU1BUXNMSUFFZ0FEWUN3QUVMQzBjQkFuOGdBQ2dDZkNFQ0FrQURRQ0FDUVFCS0JFQWdBQ2dDZENBQ1FRRnJJZ0pCQkhScUlnTW9BZ0FnQVVjTkFTQURLQUlFRFFFTUFnc0xJQUFnQVJEZ0JDRUNDeUFDQzdZQkFRSi9Ba0FnQWlBQktBSUVJZ3BHQkVBZ0F5RUxEQUVMSUFBZ0NpQUNJQU1nQkNBRklBWWdCeUFJSUFrUTlRRWlCVUVBVGcwQVFYOFBDMEVBSVFJZ0FTZ0N3QUlpQTBFQUlBTkJBRW9iSVFNQ1FBTkFJQUlnQTBjRVFBSkFJQVVnQVNnQ3lBSWdBa0VEZEdvaUNpOEJBa2NOQUNBS0xRQUFJZ3BCQVhaQkFYRWdCRWNOQUNBTElBcEJBWEZHRFFNTElBSkJBV29oQWd3QkN3c2dBQ0FCSUFzZ0JDQUZJQVlnQnlBSUlBa1F5UU1oQWdzZ0FnczFBUUYvSUFBb0FnQWlBUVJBSUFBb0FoUWdBVUVBSUFBb0FoQVJBUUFhQ3lBQVFnQTNBZ0FnQUVJQU53SVFJQUJDQURjQ0NBdkVBUUVDZnlNQVFkQUFheUlGSkFBZ0FDZ0NBQ0VHQWtBZ0FTQURFSzBGQkVBZ0JTQUdLQUlRSUFWQkVHb2dBeENRQVRZQ0FDQUFRZVNWQVNBRkVCWkJBQ0VBREFFTFFRQWhBQ0FHSUFGQkhHcEJGQ0FCUVNScUlBRW9BaUJCQVdvUWVBMEFJQUVnQVNnQ0lDSUFRUUZxTmdJZ0lBRW9BaHdnQUVFVWJHb2lBRUlBTndJQUlBQkJFR3BCQURZQ0FDQUFRUWhxUWdBM0FnQWdBQ0FHSUFJUUdEWUNEQ0FHSUFNUUdDRUJJQUFnQkRZQ0NDQUFJQUUyQWhBTElBVkIwQUJxSkFBZ0FBdjNGZ0VNZnlNQVFSQnJJaEFrQUNBQVFVQnJLQUlBSVFnZ0FDZ0NBQ0VMQWtBQ1FBSkFJQUZCQWtzTkFBSkFJQUlOQUVFQUlRSWdBRUdGQVJCS1JRMEFJQUFvQWpoQkFSQ0RBVUVLUmcwQVFYOGhCeUFBRUJJTkEwRUNJUUlMUVg4aEJ5QUFFQklOQWlBQUtBSVFJZ2xCS2tZRVFDQUFFQklOQXlBQUtBSVFJUWtnQWtFQmNpRUNDd0pBQWtBQ1FBSkFBa0FnQ1VFbmFnNENBUUlBQ3lBSlFZTi9SdzBEQWtBZ0FDZ0NLQTBBSUFGQkFrY2lEQ0FDUVFGeFJYSkZJQUFvQWlBaUNVRXRSbkVOQUNBTUlBSkJBbkZGY2lBSlFTNUhjZzBEQ3lBQUVPSUJEQVlMSUFGQkFrY05BaUFJTFFCdVFRRnhSUTBCREFJTElBRkJBa2NOQVNBQUtBSkVEUUVMSUFzZ0FDZ0NJQkFZSVF3Z0FCQVNSUTBCREFJTElBRkJBa1lnQlVFQ1JuSU5BQ0FBUWJMM0FFRUFFQllNQWdzQ1FBSkFBa0FnQ0NnQ0lDSUhSU0FCUVFGTGNnMEFJQWdvQWlSQkFVY05BQ0FJSUF3UW9nSWlDVVVOQUNBSktBSUlJQWdvQXJ3QlJ3MEFJQUJCcCs0QVFRQVFGZ3dCQzBGL0lSRUNRQ0FCUVFGSEJFQU1BUXNDUUNBQ0RRQWdDQzBBYmtFQmNRMEFJQWdnRENBSUtBTEFBVUVBRU1FRFFRQk9EUUFnQ0NBTUVQUUJRWUNBZ0lCNmNVR0FnSUNBQWtZTkFDQU1RYzBBUmdSQUlBZ29Ba2dOQVF0QkFTRVBDd0pBSUFkRkRRQWdDQ2dDSkVFQlN3MEFJQWdvQXJ3QklnY2dDQ2dDOEFGSERRQWdDQ0FNRUtJQ0lnbEZEUUVnQ1NnQ0NDQUhSdzBCSUFCQjQ4UUFRUUFRRmd3Q0MwRi9JUWNnQUNBSUlBeEJCRUVESUFJYkVLQUJJaEZCQUVnTkF3c2dDeUFJUVFBZ0FVRUJTeUFBS0FJTUlBUVE2QU1pQkEwQkN5QUxJQXdRRTBGL0lRY01BZ3NnQmdSQUlBWWdCRFlDQUFzZ0FFRkFheUFFTmdJQUlBUWdBa1VnQVVFRFNYRTJBalFnQkNBTU5nSndJQVFnQVVFSVJpSUhOZ0pnSUFRZ0FVRURSeUlOTmdKTUlBUWdEVFlDU0NBRUlBY2dBVUY4Y1VFRVJuSWlDVFlDTUVFQklRaEJBU0VLSUExRkJFQWdCQ2dDQkNJSUtBSmNJUW9nQ0NnQ1dDRUpJQWdvQWxRaEJ5QUlLQUpRSVFnTElBUWdDallDWENBRUlBazJBbGdnQkNBSE5nSlVJQVFnQ0RZQ1VDQUVJQUpCL3dGeElBRkJDSFJ5T3dGc0FrQUNRQUpBQWtBQ1FDQUJRUWRyUVFGTkJFQWdBRUVyRUJBZ0FVRUhSZ1JBSUFBUXdBTUxJQVJDQVRjQ09DQUVRVHhxSVFrZ0JFRTRhaUVJREFFTElBUkNBVGNDT0NBRVFUeHFJUWtnQkVFNGFpRUlJQUZCQTBjTkFDQUFLQUlRUVlOL1J3MEFJQUFvQWlnTkF5QUxJQVFnQUNnQ0lCQy9BMEVBU0EwRUlBUkJBVFlDakFFTUFRc0NRQ0FBS0FJUVFTaEdCRUFnQUNBUVFReHFRUUFRbmdFYUlCQXRBQXhCQkhFRVFDQUpRUUUyQWdBTElBQVFFa1VOQVF3RkN5QUFRU2dRTEEwRUN5QUpLQUlBQkVCQmZ5RUhJQVJCZnpZQ3ZBRWdBQkNBQVVFQVNBMEdDeUFBUVVCcklRMUJBQ0VLQWtBRFFDQUFLQUlRSWdkQktVWU5BU0FIUWFkL1J5SU9SUVJBSUFoQkFEWUNBQ0FBRUJJTkJpQUFLQUlRSVFjTEFrQUNRQUpBQWtBZ0IwR0RmMGNFUUNBSFFmc0FSeUFIUWRzQVIzRU5CQ0FJUVFBMkFnQUNRQ0FPUlFSQUlBQkJEUkFRSUFRb0FvZ0JJUWNNQVFzZ0N5QUVRUUFRdndNaEJ5QUFRZHNBRUJBTElBMG9BZ0FnQjBILy93TnhFQmNnQUVGVFFiTi9JQWtvQWdBYlFRRkJBVUYvUVFFUXdnRWlCMEVBU0EwS0lBY2dDbkloQjBFQklRb2dCMFVFUUNBRUlBUW9Bb3dCUVFGcU5nS01BVUVBSVFvTElBNUZEUUVNQXdzZ0FDZ0NLQTBJSUFBb0FpQWlCMEV0UmdSQUlBUXRBR3hCQVVZTkNRc2dDU2dDQUFSQUlBQWdCQ0FIUVFFUW9BRkJBRWdOQ2dzZ0N5QUVJQWNRdndNaUVrRUFTQTBKSUFBUUVnMEpJQTROQVNBQVFRMFFFQ0FBUVVCcklnb29BZ0FnRWtILy93TnhJZzBRRnlBSktBSUFCRUFnQUVFUkVCQWdBRUc5QVJBUUlBQWdCeEFhSUFvb0FnQWdCQzhCdkFFUUZ3c2dBRUhjQUJBUUlBb29BZ0FnRFJBWElBaEJBRFlDQUFzZ0FDZ0NFRUVwUmcwRUlBQkJLUkFzR2d3SUN3SkFJQUFvQWhCQlBVWUVRQ0FJUVFBMkFnQWdBQkFTRFFrZ0RTZ0NBQkF5SVFvZ0FFSGJBQkFRSUEwb0FnQWdFa0gvL3dOeElnNFFGeUFBUVJFUUVDQUFRUVlRRUNBQVFhc0JFQkFnQUVIcEFDQUtFQndhSUFCQkRoQVFJQUFRVmcwSklBQWdCeENoQVNBQVFSRVFFQ0FBUWR3QUVCQWdEU2dDQUNBT0VCY2dBQ0FLRUI1QkFTRUtEQUVMSUFwRkJFQWdCQ0FFS0FLTUFVRUJhallDakFFTElBa29BZ0JGRFFFZ0FFSGJBQkFRSUEwb0FnQWdFa0gvL3dOeEVCY0xJQUJCdlFFUUVDQUFJQWNRR2lBTktBSUFJQVF2QWJ3QkVCY0xJQUFvQWhCQktVWU5BaUFBUVN3UUxFVU5BUXdHQ3dzZ0FFSFp3Z0JCQUJBV0RBUUxBa0FDUUNBQlFRUnJEZ0lCQUFJTElBUW9Bb2dCUVFGR0RRRU1BZ3NnQkNnQ2lBRU5BUXNnQ1NnQ0FBUkFJQVFvQXN3QklBUW9BcndCUVFOMGFrRUVhaUVISUFCQlFHc2hDQU5BQWtBZ0J5Z0NBQ0lKUVFCSURRQWdCQ2dDZENJSElBbEJCSFFpQ1dvaUNpZ0NCQ0FFS0FLOEFVY05BQ0FFSUFvb0FnQWlDaEQwQVVFQVNBUkFJQXNnQkNBS0VFOUJBRWdOQmlBRUtBSjBJUWNnQUVHNEFSQVFJQUFnQnlBSmFpSUtLQUlBRUJvZ0NDZ0NBQ0FFTHdHOEFSQVhJQUJCdVFFUUVDQUFJQW9vQWdBUUdpQUlLQUlBUVFBUUZ3c2dCeUFKYWtFSWFpRUhEQUVMQ3lBQVFiVUJFQkFnQUVGQWF5Z0NBQ0FFTHdHOEFSQVhJQVJCQURZQ3ZBRWdCQ0FFS0FMTUFTZ0NCRFlDd0FFTElBQVFFZzBDSUFKQmZYRkJBVVlFUUNBQVFZY0JFQkFMSUFSQkFUWUNaQ0FBRUlBQkdpQUVJQVFvQXJ3Qk5nTHdBUUpBQWtBZ0FDZ0NFRUdtZjBjTkFDQUFFQklOQkNBQUtBSVFRZnNBUmcwQUlBQWdCQ0FNRU5zRURRUWdBQkJXRFFRZ0FFRXVRU2dnQWhzUUVDQUVMUUJ1UVFKeERRRWdCQ0FBS0FJMElBTnJJZ0kyQXBBRElBUWdDeUFESUFJUWdRTWlBallDakFNZ0FnMEJEQVFMSUFCQit3QVFMQTBESUFBUW5RVU5BeUFBSUFRZ0RCRGJCQTBEQTBBZ0FDZ0NFRUg5QUVjRVFDQUFFSndGUlEwQkRBVUxDeUFFTFFCdVFRSnhSUVJBSUFRZ0FDZ0NPQ0FEYXlJQ05nS1FBeUFFSUFzZ0F5QUNFSUVESWdJMkFvd0RJQUpGRFFRTElBQVFFZzBESUFCQlFHc29BZ0FRNWdKRkRRQWdBRUVBRU9VQ0N5QUFRVUJySUFRb0FnUWlBellDQUNBRUtBSndJUUlnQkNBQUtBSUFJQU5DZ0lDQWdDQVF2Z01pQXpZQ0NDQUJRUUpQQkVCQkFDRUhJQUZCQ1d0QmZVc05CU0FBUVFNUUVDQUFRVUJySWdFb0FnQWdBeEE1SUFJTkJTQUFRYzBBRUJBZ0FTZ0NBRUVBRURrTUJRc2dBVUVCUmdSQUlBQkJBeEFRSUFCQlFHc2lBU2dDQUNBREVEa2dEd1JBQWtBZ0FTZ0NBQ0lCS0FJb0JFQWdDeUFCSUFJUTVBSWlBVVVOQmlBQlFRQTJBZ2dnQVNBQkxRQUVRZjRCY1NBQVFVQnJLQUlBTFFCdVFRRnhjam9BQkF3QkN5QUJJQUlROUFGQkFFNE5BQ0FMSUFFZ0FoQlBRUUJJRFFVTElBQkJFUkFRSUFCQnVRRVFFQ0FBSUFJUUdpQUFRVUJyS0FJQVFRQVFGd3RCQUNFSElCRkJBRTRFUUNBQVFVQnJLQUlBS0FKMElCRkJCSFJxSWdFZ0FTZ0NERUgvZ0lDQWVIRWdBMEVIZEVHQS8vLy9CM0Z5TmdJTUlBQkJEaEFRREFZTElBQkJ2UUVRRUNBQUlBSVFHaUFBUVVCcktBSUFJZ0FnQUM4QnZBRVFGd3dGQ3dKQUFrQWdBRUZBYXlnQ0FDSUJLQUlvUlFSQUlBQWdBU0FDUVFZUW9BRWlBVUVBU0EwRklBQkJRR3NvQWdBaEFDQUJRWUNBZ0lBQ2NRUkFJQUFvQW9BQklBRkJCSFJxSWdBZ0FDZ0NERUgvZ0lDQWVIRWdBMEVIZEVHQS8vLy9CM0Z5TmdJTURBSUxJQUFvQW5RZ0FVRUVkR29pQUNBQUtBSU1RZitBZ0lCNGNTQURRUWQwUVlELy8vOEhjWEkyQWd3TUFRc2dDeUFCSUFKQi9BQWdBaHNpQVJEa0FpSUNSUTBFSUFJZ0F6WUNBQ0FGRFFFTFFRQWhCd3dGQzBFQUlRY2dBQ0FBUVVCcktBSUFLQUtVQXlBQlFSWWdBU0FGUVFGSEcwRUFFUGNCRFFRTUFnc2dBRUdEd2dCQkFCQVdEQUVMSUFBUTRnRUxJQUJCUUdzZ0JDZ0NCRFlDQUNBTElBUVEvUUpCZnlFSElBWkZEUUVnQmtFQU5nSUFEQUVMSUFzZ0RCQVRDeUFRUVJCcUpBQWdCd3ZsQkFFR2Z5QUFLQUlBSWdSQkFXb2hBa0VJSVFNQ1FBSkFBa0FnQkMwQUFDSUdRVEJySWdkQkNFOEVRRUYrSVFVQ1FBSkFBa0FDUUFKQUFrQWdCa0h1QUdzT0N3RUpDUWtDQ1FNRkJBa0ZBQXNDUUNBR1FlSUFhdzRGQ0FrSkNRQUpDMEVNSVFNTUJ3dEJDaUVEREFZTFFRMGhBd3dGQzBFSklRTU1CQXRCQ3lFRERBTUxBa0FnQVVVTkFDQUNMUUFBUWZzQVJ3MEFJQVJCQW1vaEFpQUVMUUFDSVFSQkFDRURBMEFnQWlFQlFYOGhCU0FFRUxZRUlnSkJBRWdOQlNBQ0lBTkJCSFJ5SWdOQi8vL0RBRXNOQlNBQlFRRnFJZ0l0QUFBaUJFSDlBRWNOQUFzZ0FVRUNhaUVDREFNTElBUkJBa0VFSUFaQitBQkdHeUlIYWtFQmFpRUVRUUFoQTBFQUlRVURRQ0FGSUFkSEJFQWdBaTBBQUJDMkJDSUdRUUJJQkVCQmZ3OEZJQVZCQVdvaEJTQUNRUUZxSVFJZ0JpQURRUVIwY2lFRERBSUxBQXNMSUFGQkFrY2dBMEdBZUhGQmdMQURSM0lOQVNBRUxRQUFRZHdBUncwQklBUXRBQUZCOVFCSERRRkJBQ0VDUVFBaEJRTkFBa0FnQWtFRVJnMEFJQUlnQkdvdEFBSVF0Z1FpQVVFQVNBMEFJQUpCQVdvaEFpQUJJQVZCQkhSeUlRVU1BUXNMSUFKQkJFY2dCVUdBdUFOSmNpQUZRZisvQTB0eURRRWdBMEVLZEVHQStEOXhJQVZCL3dkeGNrR0FnQVJxSVFNZ0JFRUdhaUVDREFJTElBRkJBa1lFUUVGL0lRVWdCdzBEUVFBaEF5QUNMUUFBUVRwclFYWkpEUUlNQXdzZ0FpMEFBRUV3YXlJQlFRZExCRUFnQnlFRERBSUxJQVJCQW1vaEFpQUJJQWRCQTNSeUlnTkJIMHNOQVNBRUxRQUNRVEJySWdGQkIwc05BU0FFUVFOcUlRSWdBU0FEUVFOMGNpRUREQUVMSUFRaEFnc2dBQ0FDTmdJQUlBTWhCUXNnQlF0TkFRSi9JQUpDLy8vLy93ZFlCRUFnQUNBQklBS25RWUNBZ0lCNGNrR0FnQUVRMVFFUEN5QUFJQUlRK0FJaUEwVUVRRUYvRHdzZ0FDQUJJQU5CZ0lBQkVOVUJJUVFnQUNBREVCTWdCQXZnQVFFQ2Z5QUNRUUJISVFNQ1FBSkFBa0FnQUVFRGNVVWdBa1Z5RFFBZ0FVSC9BWEVoQkFOQUlBQXRBQUFnQkVZTkFpQUNRUUZySWdKQkFFY2hBeUFBUVFGcUlnQkJBM0ZGRFFFZ0FnMEFDd3NnQTBVTkFTQUFMUUFBSUFGQi93RnhSaUFDUVFSSmNrVUVRQ0FCUWY4QmNVR0Jnb1FJYkNFREEwQWdBQ2dDQUNBRGN5SUVRWDl6SUFSQmdZS0VDR3R4UVlDQmdvUjRjUTBDSUFCQkJHb2hBQ0FDUVFScklnSkJBMHNOQUFzTElBSkZEUUVMSUFGQi93RnhJUUVEUUNBQklBQXRBQUJHQkVBZ0FBOExJQUJCQVdvaEFDQUNRUUZySWdJTkFBc0xRUUFMR1FBZ0FDQUJFQThnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUXNtQVFGL0lBRkNJSWluUVhWUEJFQWdBYWNpQWlBQ0tBSUFRUUZxTmdJQUN5QUFJQUVRSmd1b0FnSUJmZ0YvSXdCQkVHc2lBaVFBQWtBZ0FVTC8vLy8vYjFnRVFDQUFFQ1JDZ0lDQWdPQUFJUVVNQVFzQ1FDQUVEUUFnQXlrREFDSUZRb0NBZ0lCd1ZBMEFJQVduSWdZdkFRWkJNVWNOQUNBR0tBSWdSUTBBSUFBZ0JVRThJQVZCQUJBVUlnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQVVnQVJCU0lRWWdBQ0FGRUE4Z0JrVU5BQ0FES1FNQUlnVkNJSWluUVhWSkRRRWdCYWNpQUNBQUtBSUFRUUZxTmdJQURBRUxJQUFnQWlBQkVMOENJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FBSUFJZ0JFRURkR29wQXdCQ2dJQ0FnREJCQVNBREVDRWhCU0FBSUFJcEF3QVFEeUFBSUFJcEF3Z1FEeUFGUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBQkVBOE1BZ3NnQUNBRkVBOExJQUVoQlFzZ0FrRVFhaVFBSUFVTGVRRUJmd0pBQWtBQ1FBSkFBa0FnQVNnQ0FDSUNRWUFCYWc0RkJBUUVBZ0FCQ3lBQUtBSUFJQUVwQXhBUUR5QUFLQUlBSUFFcEF4Z1FEdzhMSUFKQnEzOUhEUUVMSUFBb0FnQWdBU2dDRUJBVER3c2dBa0hUQUdwQkxVMEVRQ0FBS0FJQUlBRW9BaEFRRXdzUEN5QUFLQUlBSUFFcEF4QVFEd3NOQUNBQUlBRWdBa0VERU00Q0MzQUJBMzhqQUVFUWF5SUNKQUFnQUNFQkEwQUNRQ0FCTEFBQUlnTkJBRTRFUUNBRFFmOEJjVUVKYXlJRFFSZExRUUVnQTNSQm40Q0FCSEZGY2cwQklBRkJBV29oQVF3Q0N5QUJRUVlnQWtFTWFoQllFSWNEUlEwQUlBSW9BZ3doQVF3QkN3c2dBa0VRYWlRQUlBRWdBR3NMQ2dBZ0FDQUJFSWdEUlF0TkFRRi9Ba0FnQUNBQklBQW9BZ1JCLy8vLy93ZHhJZ0FnQVNnQ0JFSC8vLy8vQjNFaUFpQUFJQUpJR3hDN0JTSUJEUUJCQUNFQklBQWdBa1lOQUVGL1FRRWdBQ0FDU1JzaEFRc2dBUXRLQVFGL0l3QkJFR3NpQWlRQUFrQWdBVUVnY1FSQUlBQVFmQXdCQ3lBQ1FjVEtBRUhvekFCQi9DRWdBVUVCY1JzZ0FVRUNjUnMyQWdBZ0FFR1ZQU0FDRUZBTElBSkJFR29rQUF2MEJRSUdmd04rSXdCQklHc2lDU1FBQW45QkFDQUFMd0hvQVVHQUFra05BQnBDZ0lDQWdEQWhEa0VBSUFBZ0FrSGRBU0FDUVFBUUZDSVBRb0NBZ0lCd2d5SU5Rb0NBZ0lBd1VRMEFHZ0pBSUExQ2dJQ0FnT0FBVVEwQUlBQWdEMEVsRUVzaUNFVU5BQ0FBSUFOQjNRRWdBMEVBRUJRaURrS0FnSUNBY0lNaURVS0FnSUNBNEFCUkRRQWdEVUtBZ0lDQU1GRUVRQ0FBSUE4UUQwRUFEQUlMSUFBZ0RrRWxFRXNpQzBVTkFBSkFJQWdvQWdSRkRRQWdDeWdDQkVVTkFDQUFJQThRRHlBQUlBNFFEMEVBREFJTElBUVE5d01oQndKL0lBZ29BZ0FpQ2lBTEtBSUFJZ3hHQkVBZ0NDQUhRUUowYWlnQ0NBd0JDeUFLSUF4TEJFQWdDRUhVQUdvZ0RDQUhFTGdGREFFTElBdEIzQUJxSUFvZ0J4QzRCUXNpQ2tVRVFDQUpJQWRCQW5SQndNQUJhallDQUNBQVFaTDZBQ0FKRUJVTUFRc0NRQ0FJS0FJRUJFQUNmaUFGQkVBZ0FDQUNFTGtDREFFTElBQWdBaUFHRUpBQ0N5SUNRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRRU1BZ3NnQWtJZ2lLZEJkVWtOQUNBQ3B5SUlJQWdvQWdCQkFXbzJBZ0FMQWtBZ0N5Z0NCQVJBQW40Z0JRUkFJQUFnQXhDNUFnd0JDeUFBSUFNZ0JoQ1FBZ3NpQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBCSUFBZ0FoQVBEQUlMSUFOQ0lJaW5RWFZKRFFBZ0E2Y2lCU0FGS0FJQVFRRnFOZ0lBQ3lBS0lBb29BZ0JCQVdvMkFnQWdDU0FDSUFNZ0JFRitjVUdrQVVZZ0IwRU5SbkVpQlJzM0F4Z2dDU0FESUFJZ0JSczNBeEFnQUNBS3JVS0FnSUNBY0lSQ2dJQ0FnREJCQWlBSlFSQnFFQzhoRFNBQUlBSVFEeUFBSUFNUUR5QU5Rb0NBZ0lCd2d5SUNRb0NBZ0lEZ0FGRU5BQUorSUFkQkRFWUVRQ0FBSUEwUUppQUVRYW9CUmtldFFvQ0FnSUFRaEF3QkN5QU5JQWRCRFVjTkFCcENnSUNBZ0JBZ0FrS0FnSUNBTUZFTkFCb2dBQ0FORUNZZ0JFRjljVUdrQVVaSHJVS0FnSUNBRUlRTElRTWdBQ0FQRUE4Z0FDQU9FQThnQVNBRE53TUFRUUVNQVFzZ0FDQVBFQThnQUNBT0VBOGdBVUtBZ0lDQU1EY0RBRUYvQ3lFSElBbEJJR29rQUNBSEMyTUNBWDhCZmlNQVFSQnJJZ0lrQUNBQUFuNGdBVVVFUUVJQURBRUxJQUlnQWExQ0FDQUJaeUlCUWRFQWFoQm5JQUlwQXdoQ2dJQ0FnSUNBd0FDRlFaNkFBU0FCYTYxQ01JWjhJUU1nQWlrREFBczNBd0FnQUNBRE53TUlJQUpCRUdva0FBdkhBUUlCZmdGL0FrQWdBQ2dDRUNnQ2pBRWlBMFVnQVVMLy8vLy8vLy8vRDN4Qy92Ly8vLy8vL3g5V2NnMEFJQU1vQWloQkJIRkZEUUFnQVVLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQVVMLy8vLy9ENE1QQzBLQWdJQ0F3SDRnQWJtOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNQQ3lBQUVKY0JJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FDcDBFRWFpQUJFTG9DUlFSQUlBSVBDeUFBSUFJUUR5QUFFSHdMUW9DQWdJRGdBQXVUQVFFQ2Z3Si9JQUFvQWdnZ0Ftb2lCQ0FBS0FJTVNnUkFRWDhnQUNBRVFRQVF0d0lOQVJvTEFrQWdBQ2dDRUFSQUlBSkJBQ0FDUVFCS0d5RUVBMEFnQXlBRVJnMENJQUFvQWdRZ0FDZ0NDQ0FEYWtFQmRHb2dBU0FEYWkwQUFEc0JFQ0FEUVFGcUlRTU1BQXNBQ3lBQUtBSUVJQUFvQWdocVFSQnFJQUVnQWhBZkdnc2dBQ0FBS0FJSUlBSnFOZ0lJUVFBTEN5b0JBWDhnQUNnQ0VDSURRUkJxSUFFZ0FpQURLQUlJRVFFQUlnRWdBa1Z5UlFSQUlBQVFmQXNnQVF0RUFRSi9Ba0FnQUVLQWdJQ0FjRlFOQUNBQXB5SURMd0VHUVFKSERRQWdBeTBBQlVFSWNVVU5BQ0FDSUFNb0FpZzJBZ0FnQVNBREtBSWtOZ0lBUVFFaEJBc2dCQXVnQkFJRmZ3RitJd0JCSUdzaUJpUUFBa0FDUUFKQUFrQWdBd1JBSUFGQ2dJQ0FnR0NEUW9DQWdJQWdVZzBCREFJTElBRkNnSUNBZ0hCVURRRUxRUUVoQkFKQUFrQWdBa0lnaUtjaUNFRUJhZzRFQUFJQ0FRSUxJQUtuSVFVTElBRkMvLy8vLzI5WVFRQWdBeHNOQWdKQUlBR25JZ2N2QVFaQk1FWUVRQ0FBSUFaQkdHb2dBVUhnQUJDQkFTSUZSUTBESUFVcEF3QWhDU0FHS1FNWUlnRkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQWdDU0FDSUFNUWl3SWhCQXdGQ3lBR0lBSTNBd2dnQmlBSk53TUFJQUFnQVNBRktRTUlRUUlnQmhBdklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF5QUFJQUVRSmtVRVFDQURSUTBDSUFCQm91UUFRUUFRRlF3RUN5QUFJQVVwQXdBUW1RRWlBMEVBU0EwRElBTU5CQ0FBSUFVcEF3QVE2QUVpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBESUFBZ0FSQVBJQUtuSUFHblJnMEVJQUJCaE9RQVFRQVFGUXdEQ3lBSEtBSVFLQUlzSUFWR0RRTWdCeTBBQlVFQmNVVUVRQ0FEUlEwQklBQkI5K2dBUVFBUUZRd0RDd0pBSUFWRkRRQWdCU0VFQTBBZ0JDQUhSZ1JBSUFORkRRTWdBRUd1MEFCQkFCQVZEQVVMSUFRb0FoQW9BaXdpQkEwQUN5QUlRWFZKRFFBZ0FxY2lBeUFES0FJQVFRRnFOZ0lBQzBGL0lRUWdBQ0FIUVFBUTFBRU5BeUFIS0FJUUlnUW9BaXdpQXdSQUlBQWdBNjFDZ0lDQWdIQ0VFQThMSUFRZ0JUWUNMRUVCSVFRTUF3dEJBQ0VFREFJTElBQVFKQXRCZnlFRUN5QUdRU0JxSkFBZ0JBc1ZBUUYrSUFBZ0FSRG9BU0VDSUFBZ0FSQVBJQUlMQ2dBZ0FDQUJweERCQWd0UUFRRitBa0FnQTBIQUFIRUVRQ0FDSUFOQlFHcXRpQ0VCUWdBaEFnd0JDeUFEUlEwQUlBSkJ3QUFnQTJ1dGhpQUJJQU90SWdTSWhDRUJJQUlnQklnaEFnc2dBQ0FCTndNQUlBQWdBamNEQ0F2UkN3SUVmd1IrSXdCQm9BTnJJZ1VrQUFKQUlBRzlJZ2xDZ0lDQWdJQ0FnUGovQUlOQ2dJQ0FnSUNBZ1BqL0FGRUVRQ0FKUXYvLy8vLy8vLy8vL3dDRFFvR0FnSUNBZ0lENC93QmFCRUFnQlVIT3dya0NOZ0tnQWd3Q0N5QUZRYUFDYWlFRElBRkVBQUFBQUFBQUFBQmpCRUFnQlVFdE9nQ2dBaUFGUWFBQ2FrRUJjaUVEQ3lBRFFmMGNMUUFBT2dBSUlBTkI5UndwQUFBM0FBQU1BUXNDUUFKQUFrQWdCRVVFUUFKK0lBR1pSQUFBQUFBQUFPQkRZd1JBSUFHd0RBRUxRb0NBZ0lDQWdJQ0FnSDhMSWdwQ2dJQ0FnSUNBZ0JCOVFvR0FnSUNBZ0lCZ1ZDQUt1U0FCWW5JTkFTQUZRUUE2QU9VQklBb2dDa0kvaHlJSmhTQUpmU0VKSUFLdElRc2dCVUhsQVdvaEF3TkFJQU1pQWtFQmF5SURRVEJCMXdBZ0NTQUpJQXVBSWd3Z0MzNTlweUlFUVFwSUd5QUVham9BQUNBSklBdGFJUVFnRENFSklBUU5BQXNnQ2tJQVV3UkFJQUpCQW1zaUEwRXRPZ0FBQ3lBRlFhQUNhaUFERU9VRkRBUUxSQUFBQUFBQUFBQUFJQUVnQVVRQUFBQUFBQUFBQUdFYklRRWdCRUVDUmdSQUFrQWdCVUdnQW1vZ0FTQURRUUZxSWdJUW9BTWdCV290QUo4Q1FUVkhEUUFnQlVHZ0Ftb2dBU0FDRUtBRElnUWdCVUdnQVdvZ0FTQUNFS0FEUncwQUlBVkJvQUpxSUFWQm9BRnFJQVFRWVEwQUlBVXRBS0FDR2dzZ0JVR2dBbW9nQVNBREVLQURHZ3dFQ3lBRVFRTnhRUUZHRFFFTFFSRWhCa0VCSVFjRFFDQUdJQWROQkVCQkZTRUREQU1MSUFFZ0JpQUhha0VCZGlJRElBVkJIR29nQlVFZ2FpQUZRYUFCYWlBRlFhQUNhaUlDRU1rQ0lBSVE1QVVnQVdFRVFFRUJJQU1nQTBFQVNoc2hCZ05BSUFNaUFrRUNTQTBDSUFKQkFXc2lBeUFGUWFBQmFtb3RBQUJCTUVZTkFBc2dBaUVHQlNBRFFRRnFJUWNMREFBTEFBc2dBU0FEUVFGcUlnSWdCVUVjYWlBRlFSaHFJQVZCb0FGcUlnWWdCVUdnQW1vUXlRSUNRQ0FESUFacUxRQUFRVFZIRFFBZ0FTQUNJQVZCSEdvZ0JVRVlhaUFGUWFBQmFpSUdJQVZCb0FKcUlnY1F5UUlnQVNBQ0lBVkJGR29nQlVFUWFpQUZRU0JxSWdnZ0J4REpBaUFHSUFnZ0FoQmhEUUFnQlNnQ0hDQUZLQUlVUncwQUlBVW9BaGdhQ3lBRElRWUxJQUVnQmlBRlFSeHFJQVZCSUdvZ0JVR2dBV29nQlVHZ0Ftb1F5UUlnQlNnQ0lBUi9JQVZCTFRvQW9BSWdCVUdnQW1wQkFYSUZJQVZCb0FKcUN5RUNJQVVvQWh3aEJ3SkFJQVJCQkhFTkFDQURJQWRJSUFkQkFFeHlSUVJBSUFZZ0Iwd0VRRUVBSVFNZ0J5QUdheUlFUVFBZ0JFRUFTaHNoQkNBQ0lBVkJvQUZxSUFZUUh5QUdhaUVDQTBBZ0F5QUVSd1JBSUFKQk1Eb0FBQ0FEUVFGcUlRTWdBa0VCYWlFQ0RBRUxDeUFDUVFBNkFBQU1Bd3NnQWlBRlFhQUJhaUFIRUI4Z0Iyb2lBa0V1T2dBQVFRQWhBeUFHSUFkcklnUkJBQ0FFUVFCS0d5RUVBMEFnQWtFQmFpRUNJQU1nQkVjRVFDQUNJQVZCb0FGcUlBTWdCMnBxTFFBQU9nQUFJQU5CQVdvaEF3d0JDd3NnQWtFQU9nQUFEQUlMSUFkQkJXcEJCVXNOQUNBQ1FiRGNBRHNBQUVFQUlRTkJBQ0FIYXlFRUlBSkJBbW9oQWdOQUlBTWdCRWNFUUNBQ1FUQTZBQUFnQTBFQmFpRURJQUpCQVdvaEFnd0JDd3NnQWlBRlFhQUJhaUFHRUI4Z0JtcEJBRG9BQUF3QkN5QUNJQVV0QUtBQk9nQUFBa0FnQmtFQ1NBUkFJQUpCQVdvaEFnd0JDeUFDUVM0NkFBRWdBa0VDYWlFQ1FRRWhBd05BSUFNZ0JrWU5BU0FDSUFWQm9BRnFJQU5xTFFBQU9nQUFJQU5CQVdvaEF5QUNRUUZxSVFJTUFBc0FDeUFDUWVVQU9nQUFJQWRCQVdzaEF5QUhRUUJNQkg4Z0FrRUJhZ1VnQWtFck9nQUJJQUpCQW1vTElRSWdCU0FETmdJQUl3QkJFR3NpQkNRQUlBUWdCVFlDRENNQVFaQUJheUlESkFBZ0EwSEF4UVJCa0FFUUh5SURJQUkyQWl3Z0F5QUNOZ0lVSUFOQi8vLy8vd2RCZmlBQ2F5SUdJQVpCLy8vLy93ZFBHeUlHTmdJd0lBTWdBaUFHYWlJQ05nSWNJQU1nQWpZQ0VDQURRZlQ3QUNBRkVKc0VJQVlFUUNBREtBSVVJZ0lnQWlBREtBSVFSbXRCQURvQUFBc2dBMEdRQVdva0FDQUVRUkJxSkFBTElBQWdCVUdnQW1vUVlpRUpJQVZCb0FOcUpBQWdDUXNwQVFGL0lBRkNJSWluUVhWUEJFQWdBYWNpQXlBREtBSUFRUUZxTmdJQUN5QUFJQUVnQWhDYUFRdk1BUUVDZnlBQklBRW9BZ0FpQWtFQmF5SUROZ0lBQWtBZ0FrRUJUQVJBSUFNTkFTQUJMUUFRQkVBZ0FDQUJFSkFFQ3lBQktBSXNJZ0lFUUNBQUlBS3RRb0NBZ0lCd2hCQWpDeUFCUVRCcUlRSkJBQ0VEQTBBZ0F5QUJLQUlnVDBVRVFDQUFJQUlvQWdRUTdBRWdBMEVCYWlFRElBSkJDR29oQWd3QkN3c2dBU2dDQ0NJQ0lBRW9BZ3dpQXpZQ0JDQURJQUkyQWdBZ0FVSUFOd0lJSUFCQkVHb2dBU0FCS0FJWVFYOXpRUUowYWlBQUtBSUVFUUFBQ3c4TFFZNlBBVUd1L0FCQnd5SkJxNDBCRUFBQUM0UUJBUU4vSXdCQmtBRnJJZ01rQUNBRElBSTJBb3dCQWtBZ0EwR0FBU0FCSUFJUXl3SWlCRUgvQUUwRVFDQUFJQU1nQkJCeURBRUxJQUFnQkNBQUtBSUVha0VCYWhER0FRMEFJQU1nQWpZQ2pBRWdBQ2dDQkNJRklBQW9BZ0JxSUFBb0FnZ2dCV3NnQVNBQ0VNc0NHaUFBSUFBb0FnUWdCR28yQWdRTElBTkJrQUZxSkFBTG9BTUNCSDhCZmlNQVFTQnJJZ1FrQUNBQklBSnFJUVVnQVNFREEwQUNRQ0FESUFWUERRQWdBeXdBQUVFQVNBMEFJQU5CQVdvaEF3d0JDd3NDZmdKQUlBTWdBV3NpQmtHQWdJQ0FCRThFUUNBQVFjRGFBRUVBRUVZTUFRc2dBeUFGUmdSQUlBQWdBU0FDRUlRRERBSUxJQUFnQkVFRWFpQUNFRDFGQkVBZ0JFRUVhaUFCSUFZUWlBSWFBMEFnQXlBRlNRUkFJQU1zQUFBaUFFRUFUZ1JBSUFSQkJHb2dBRUgvQVhFUU94b2dBMEVCYWlFRERBSUZBa0FnQXlBRklBTnJJQVJCSEdvUVdDSUJRZi8vQTAwRVFDQUVLQUljSVFNTUFRc2dBVUgvLzhNQVRRUkFJQVFvQWh3aEF5QUVRUVJxSUFGQmdJQUVhMEVLZGtHQXNBTnFFSXNCR2lBQlFmOEhjVUdBdUFOeUlRRU1BUXNEUUVIOS93TWhBU0FESUFWUERRRWdBeXdBQUVGQVNBUkFJQU5CQVdvaEF3d0JDd3NEUUNBRklBTkJBV29pQTAwRVFDQUZJUU1NQWdzZ0F5d0FBRUZBU0EwQUN3c2dCRUVFYWlBQkVJc0JHZ3dDQ3dBTEN5QUVRUVJxRURZTUFnc2dCQ2dDQkNnQ0VDSUFRUkJxSUFRb0FnZ2dBQ2dDQkJFQUFBdENnSUNBZ09BQUN5RUhJQVJCSUdva0FDQUhDMDRCQTM5QjBNWUVLQUlBSWdJZ0FFRUhha0Y0Y1NJRGFpRUJRWDhoQUFKQUlBTkJBQ0FCSUFKTkd3MEFJQUUvQUVFUWRFc0VRQ0FCRUFsRkRRRUxRZERHQkNBQk5nSUFJQUloQUFzZ0FBdUZBUUlEZndGK0FrQWdBRUtBZ0lDQUVGUUVRQ0FBSVFVTUFRc0RRQ0FCUVFGcklnRWdBRUlLZ0NJRlF2WUJmaUFBZktkQk1ISTZBQUFnQUVMLy8vLy9ud0ZXSVFJZ0JTRUFJQUlOQUFzTElBV25JZ0lFUUFOQUlBRkJBV3NpQVNBQ1FRcHVJZ05COWdGc0lBSnFRVEJ5T2dBQUlBSkJDVXNoQkNBRElRSWdCQTBBQ3dzZ0FRdFdBUUYvSUFKQ0lJaW5RWFZQQkVBZ0FxY2lCU0FGS0FJQVFRRnFOZ0lBQ3lBQUlBRkJPeUFDSUFNUUdSb2dBVUlnaUtkQmRVOEVRQ0FCcHlJRElBTW9BZ0JCQVdvMkFnQUxJQUFnQWtFOElBRWdCQkFaR2d2bEJRTUVmQUYvQVg0Q1FBSkFBa0FDZkFKQUlBQzlJZ1pDSUlpblFmLy8vLzhIY1NJRlFmclFqWUlFVHdSQUlBQzlRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0RRVWdCa0lBVXdSQVJBQUFBQUFBQVBDL0R3c2dBRVR2T2ZyK1FpNkdRR1JGRFFFZ0FFUUFBQUFBQUFEZ2Y2SVBDeUFGUWNQYzJQNERTUTBDSUFWQnNjWEMvd05MRFFBZ0JrSUFXUVJBUVFFaEJVUjJQSGsxN3pucVBTRUJJQUJFQUFEZy9rSXU1citnREFJTFFYOGhCVVIyUEhrMTd6bnF2U0VCSUFCRUFBRGcva0l1NWorZ0RBRUxBbjhnQUVUK2dpdGxSeFgzUDZKRUFBQUFBQUFBNEQ4Z0FLYWdJZ0daUkFBQUFBQUFBT0JCWXdSQUlBR3FEQUVMUVlDQWdJQjRDeUlGdHlJQ1JIWThlVFh2T2VvOW9pRUJJQUFnQWtRQUFPRCtRaTdtdjZLZ0N5SUFJQUFnQWFFaUFLRWdBYUVoQVF3QkN5QUZRWUNBd09RRFNRMEJRUUFoQlFzZ0FDQUFSQUFBQUFBQUFPQS9vaUlEb2lJQ0lBSWdBaUFDSUFJZ0FrUXR3d2x1dC8yS3ZxSkVPVkxtaHNyUDBENmdva1MzMjZxZUdjNFV2NkNpUklWVi9obWdBVm8vb0tKRTlCQVJFUkVSb2IrZ29rUUFBQUFBQUFEd1A2QWlCRVFBQUFBQUFBQUlRQ0FFSUFPaW9TSURvVVFBQUFBQUFBQVlRQ0FBSUFPaW9hT2lJUU1nQlVVRVFDQUFJQUFnQTZJZ0FxR2hEd3NnQUNBRElBR2hvaUFCb1NBQ29TRUJBa0FDUUFKQUlBVkJBV29PQXdBQ0FRSUxJQUFnQWFGRUFBQUFBQUFBNEQraVJBQUFBQUFBQU9DL29BOExJQUJFQUFBQUFBQUEwTDlqQkVBZ0FTQUFSQUFBQUFBQUFPQS9vS0ZFQUFBQUFBQUFBTUNpRHdzZ0FDQUJvU0lBSUFDZ1JBQUFBQUFBQVBBL29BOExJQVZCL3dkcXJVSTBocjhoQWlBRlFUbFBCRUFnQUNBQm9VUUFBQUFBQUFEd1A2QWlBQ0FBb0VRQUFBQUFBQURnZjZJZ0FDQUNvaUFGUVlBSVJodEVBQUFBQUFBQThMK2dEd3RFQUFBQUFBQUE4RDlCL3djZ0JXdXRRalNHdnlJRG9TQUFJQUdob0NBQUlBRWdBNkNoUkFBQUFBQUFBUEEvb0NBRlFSTk5HeUFDb2lFQUN5QUFDMThCQlg4Z0EwRUFJQU5CQUVvYklRWkJBQ0VEQTBBZ0F5QUdSa1VFUUNBQUlBTkJBblFpQldvZ0FTQUZhaWdDQUNJSElBSWdCV29vQWdBaUJXc2lDQ0FFYXpZQ0FDQUZJQWRMSUFRZ0NFdHlJUVFnQTBFQmFpRUREQUVMQ3lBRUN5OEJBWDhDUUNBQ1FRQklEUUFnQVNBQ1FRVjFJZ0ZORFFBZ0FDQUJRUUowYWlnQ0FDQUNka0VCY1NFREN5QURDNXdCQVFSL0l3QkJFR3NpQWlRQUlBSkJKVG9BQ2tFQklRTWdBVUdBQWs0RVFDQUNRZlVBT2dBTElBSWdBVUVJZGtFUGNVR0ZoZ0ZxTFFBQU9nQU5JQUlnQVVFTWRrRVBjVUdGaGdGcUxRQUFPZ0FNUVFRaEF3c2dBa0VLYWlJRUlBTnFJZ1VnQVVFUGNVR0ZoZ0ZxTFFBQU9nQUJJQVVnQVVFRWRrRVBjVUdGaGdGcUxRQUFPZ0FBSUFBZ0JDQURRUUp5RUlnQ0dpQUNRUkJxSkFBTFRRRUJmd0pBSUFKQ2dJQ0FnSEJVRFFBZ0FxY2lBeThCQmtFS1J3MEFJQU1wQXlBaUFrSWdpS2NpQTBFQUlBTkJDMnBCRWtrYkRRQWdBQ0FCSUFJUVFnOExJQUJCclRGQkFCQVZRWDhMWndJQ2Z3RitJQUJCRUdvaEF5QUJLQUlBSVFJRFFBSkFJQUlnQUNrQ0JDSUVwMEgvLy8vL0IzRk9EUUFDZnlBRVFvQ0FnSUFJZzFCRkJFQWdBeUFDUVFGMGFpOEJBQXdCQ3lBQ0lBTnFMUUFBQzBFZ1J3MEFJQUVnQWtFQmFpSUNOZ0lBREFFTEN3dTNBUUlDZmdWL1FYOGhCUUpBSUFFb0FnQWlCaUFBS1FJRUlnT25RZi8vLy84SGNTSUhUZzBBSUFCQkVHb2hDQ0FEUW9DQWdJQUlneUVFUWdBaEF5QUdJUUFEUUFKQUFrQWdBQ0FIUmdSQUlBY2hBQXdCQ3dKL0lBUlFSUVJBSUFnZ0FFRUJkR292QVFBTUFRc2dBQ0FJYWkwQUFBc2lDVUV3YTBFS1NRMEJJQUFnQmtZTkF3c2dBaUFETndNQUlBRWdBRFlDQUVFQUlRVU1BZ3NnQUVFQmFpRUFJQW10SUFOQ0NuNThRakI5SVFNTUFBc0FDeUFGQzdzREFRVi9JQUZGQkVBZ0FDQUNRUVJ4UVFoeUVOOEJEd3RCZnlFREFrQUNRQ0FBSUFGQkFXc2lCQ0FDRUo0Q0RRQWdBa0Y3Y1NFRklBSkJBWEVoQmlBQlFRRnJJUWNEUUNBQUtBSVFJUUVDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBSERnY0FBUUlEQkFVR0J3c2dBVUVsUndSQVFab0JJUUlnQVVFcVJnMEpJQUZCTDBjTkRFR2JBU0VDREFrTFFiSi9RWngvSUFBb0FrQXRBRzVCQkhFYklRSU1DQXRCblFFaEFrRUFJUU1DUUNBQlFTdHJEZ01JQ2dBS0MwR2VBU0VDREFjTElBRkI2UUJxSWdGQkEwOE5DU0FCUWVBQWF5RUNEQVlMUVFBaEF3SkFBa0FDUUFKQUlBRkI1UUJxRGdNQkN3SUFDd0pBSUFGQnh3QnFEZ0lJQXdBTFFhTUJJUUlDUUNBQlFUeHJEZ01KQ3dBTEMwR2xBU0VDREFnTFFhUUJJUUlNQnd0QnBnRWhBZ3dHQzBHbkFTRUNEQVVMSUFGQjRnQnFJZ0ZCQkU4TkIwR3AxNnJsZWlBQlFRTjBkaUVDREFRTFFhMEJJUUlnQVVFbVJ3MEdEQU1MUWE0QklRSWdBVUhlQUVjTkJRd0NDMEd2QVNFQ0lBRkIvQUJIRFFRTUFRdEJxQUVoQWlBR1JRMENDMEYvSVFNZ0FCQVNEUUVnQUNBRUlBVVFuZ0lOQVNBQUlBSkIvd0Z4RUJBTUFBc0FDeUFERHd0QkFBdENBUUYvSUFCQlFHc2hBd05BSUFFZ0FreEZCRUFnQUVHMUFSQVFJQU1vQWdBZ0FVSC8vd054RUJjZ0F5Z0NBQ2dDekFFZ0FVRURkR29vQWdBaEFRd0JDd3NMQ1FBZ0FFRUFFT0VCQzlvQkFRRi9JQUFnQUNnQ1FDSURJQUVDZndKQUFrQUNRQUpBQWtBZ0FVRW5SZzBBSUFGQnpRQkdJQUZCT2taeVJRUkFJQUZCeFFCR0RRRWdBVUV0UncwQ0lBTXRBR3hCQVVjTkFpQUFRWTNGQUVFQUVCWkJmdzhMSUFNdEFHNUJBWEVFUUNBQVFmRHJBRUVBRUJaQmZ3OExJQUZCeFFCSERRRUxJQUpCczM5R0RRTWdBa0ZGUmcwQklBSkJVMGNnQWtGTFIzRU5BaUFBUWV6bkFFRUFFQlpCZnc4TElBSkJzMzlHRFFJZ0FrRkZSZzBBUVFFZ0FrRlRSZzBER2lBQ1FVdEhEUUZCQWd3REMwRUZEQUlMRUFFQUMwRUdDeENnQVVFZmRRdFRBUVIvSUFBb0F2UUJJZ0pCQUNBQ1FRQktHeUVFUVFBaEFnSkFBMEFnQWlBRVJnMEJJQUVnQUNnQy9BRWlCU0FDUVFSMGFpZ0NERWNFUUNBQ1FRRnFJUUlNQVFzTElBVWdBa0VFZEdvaEF3c2dBd3NKQUNBQVFRSVF1d01MN3dFQkJIOERRQUpBSUFJZ0Ewd05BQ0FCSUFOcUlnVXRBQUFpQmtFQ2RDSUhRWUM0QVdvdEFBQWhDQUpBQWtBZ0JrRzJBVWNFUUNBR1FjSUJSdzBCSUFRZ0JTZ0FBVFlDQUF3Q0N5QUFJQVVvQUFFaUJVRUFFR2tOQWlBQUtBS2tBaUFGUVJSc2FpZ0NFRVVOQVVHcmd3RkJydndBUVlqd0FVSE83UUFRQUFBTElBZEJnN2dCYWkwQUFDSUdRUnhMRFFCQkFTQUdkQ0lHUVlDQWdCeHhSUVJBSUFaQmdJQ0E0QUJ4UlFSQUlBWkJnSUNBZ2dGeFJRMENJQUFnQlNnQUFVRi9FR2thREFJTElBQWdCU2dBQlVGL0VHa2FDeUFBS0FJQUlBVW9BQUVRRXdzZ0F5QUlhaUVEREFFTEN5QURDeG9BSUFCQjNnQkIyQUFnQVJzUUVTQUFJQUpCLy84RGNSQXFDL3dCQVFkL0l3QkJFR3NpQkNRQUFrQWdCRUVNYWlBQVFiREtBMEViRUtRR0lnRkJBRWdOQUNBQlFaRExBMm9oQWlBRUtBSU1JUUVEUUNBQklRVWdBaTBBQUNJQndDSUhRUUJPQW44Z0FrRUJhaUFCUVQ5eElnRkJNRWtOQUJvZ0FVRUlkQ0VHSUFGQk4wMEVRQ0FHSUFJdEFBRnFRZERmQUdzaEFTQUNRUUpxREFFTElBSXRBQUlnQmtHQThBQnJJQUl0QUFGQkNIUnlha0d3RUdvaEFTQUNRUU5xQzJvaEFpQUJJQVZxUVFGcUlnRWdBRTBOQUFzQ1FBSkFBa0FnQjBIQUFYRkJCbllPQXdBQkF3SUxJQUpCQVdzdEFBQWhBd3dDQ3lBQ1FRRnJMUUFBSUFBZ0JXdHFJUU1NQVF0QjVnRWhBd3NnQkVFUWFpUUFJQU1McVFjQ0NYOEJmZ0pBQWtBQ1FBSi9JQUpCQWt3RVFDQUNJQUVwQWdRaURFSStpS2RHQkVBZ0FDQUJFTUVDSWdSQjNRRktEUVVnQVNBQktBSUFRUUZyTmdJQUlBUVBDeUFBS0FJMElBQW9BaVJCQVdzZ0FTQUNFTEFGUWYvLy8vOERjU0lIY1NJS1FRSjBhaUVESUF5blFmLy8vLzhIY1NFRkEwQWdBaUFES0FJQUlnUkZEUUlhQWtBZ0FDZ0NPQ0FFUVFKMGFpZ0NBQ0lES1FJRUlneENJSWluUWYvLy8vOERjU0FIUnlBTVFqNklweUFDUjNJZ0RLZEIvLy8vL3dkeElBVkhjZzBBSUFNZ0FTQUZFTHNGRFFBZ0JFSGVBVWdOQkNBRElBTW9BZ0JCQVdvMkFnQU1CQXNnQTBFTWFpRUREQUFMQUFzZ0FrRURSeUVIUVFNTElRVUNRQ0FBS0FJOERRQkJBQ0VFSUFCQkVHb2lDeUFBS0FJNFFkTUJJQUFvQWl4QkEyeEJBbTBpQWlBQ1FkTUJUQnNpQWtFQ2RDQUFLQUlJRVFFQUlnaEZEUUVnQUNnQ0xDSUpJUU1nQ1VVRVFDQUxRUkFnQUNnQ0FCRURBQ0lHUlFSQUlBc2dDQ0FBS0FJRUVRQUFEQU1MSUFaQ2dJQ0FnSUNBZ0lCQU53SUVJQVpCQVRZQ0FDQUdRUUEyQUF3Z0NDQUdOZ0lBSUFBZ0FDZ0NLRUVCYWpZQ0tFRUJJUU1MSUFBZ0F6WUNQQ0FBSUFnMkFqZ2dBQ0FDTmdJc0lBa2dBaUFDSUFsSkd5RUVJQUpCQVdzaEJnTkFJQU1nQkVZTkFTQUFLQUk0SUFOQkFuUnFRUUVnQTBFQmFpSUNRUUYwUVFGeUlBTWdCa1liTmdJQUlBSWhBd3dBQ3dBTEFrQWdBUVJBSUFFcEFnUWlERUwvLy8vLy8vLy8vejlZQkVBZ0FTQU1JQVd0UWo2R2hEY0NCQXdDQ3lBQVFSQnFJQXluSWdKQkgzVWdBa0gvLy8vL0IzRWdBa0VmZG5ScVFSRnFJQUFvQWdBUkF3QWlBa1VFUUVFQUlRUU1CQXNnQWtFQk5nSUFJQUlnQWlrQ0JFTC8vLy8vZDRNZ0FTa0NCRUtBZ0lDQUNJT0VJZ3czQWdRZ0FpQU1Rb0NBZ0lCNGd5QUJLUUlFUXYvLy8vOEhnNFEzQWdRZ0FrRVFhaUFCUVJCcUlBRW9BZ1FpQTBILy8vLy9CM0VnQTBFZmRuUWdBMEYvYzBFZmRtb1FIeG9nQUNBQkVQWURJQUloQVF3QkN5QUFRUkJxUVJBZ0FDZ0NBQkVEQUNJQlJRUkFRUUFQQ3lBQlFvR0FnSUNBZ0lDQWdIODNBZ0FMSUFBZ0FDZ0NPQ0FBS0FJOElnUkJBblJxSWdJb0FnQkJBWFkyQWp3Z0FpQUJOZ0lBSUFFZ0JEWUNEQ0FCSUFFMUFnUWdCNjFDSUlhRUlBV3RRajZHaERjQ0JDQUFJQUFvQWloQkFXbzJBaWdnQlVFRFJnMENJQUVnQUNnQ05DQUtRUUowYWlJQktBSUFOZ0lNSUFFZ0JEWUNBQ0FBS0FJb0lBQW9BakJJRFFJZ0FDQUFLQUlrUVFGMEVQSUVHZ3dDQ3lBQlJRMEJDeUFBSUFFUTlnTWdCQThMSUFRTEN3QWdBRUgrSEVFQUVEb0xGZ0FnQUNBQlFmOEJjUkFSSUFBZ0FrSC9BWEVRRVF1T0JBSUlmd04rSXdCQk1Hc2lCQ1FBUW9DQWdJRGdBQ0VOSUFBZ0FSQWxJZ3hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQUpBSUFBQ2ZrS0FnSUNBTUNBQUlBUkJMR29nQkVFb2FpQU1weUlJSUFKQmIzRVFqZ0VOQUJwQ2dJQ0FnT0FBSUFBUVBpSU5Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWFJQUpCRUhFaENTQUVLQUlzSVFVZ0JDZ0NLQ0VHSUFOQkFXc2hDa0VBSVFJQ1FBTkFJQUlnQmtZTkF5QUZJQUpCQTNScUtBSUVJUU1DUUFKQUlBa0VRQ0FBSUFSQkNHb2dDQ0FERUV3aUMwRUFTQTBFSUF0RkRRRWdBQ0FFUVFocUVFZ2dCQ2dDQ0VFRWNVVU5BUXNDUUFKQUFrQUNRQ0FLRGdJQkFnQUxJQUFnQXhCY0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZJTkFnd0dDeUFBSUF3Z0F5QU1RUUFRRkNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTUJRc2dBQkErSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQkNBQUlBTVFYQ0lPUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlnQUNBQlFnQWdEa0dIZ0FFUXZRRkJBRWdOQWlBQUlBd2dBeUFNUVFBUUZDSU9Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSWdBQ0FCUWdFZ0RrR0hnQUVRdlFGQkFFZ05BZ3NnQUNBTklBZXRJQUZCQUJEU0FVRUFTQTBESUFkQkFXb2hCd3NnQWtFQmFpRUNEQUVMQ3lBQUlBRVFEd3NnRFFzUUQwS0FnSUNBNEFBaERTQUVLQUlvSVFZZ0JDZ0NMQ0VGQ3lBQUlBVWdCaEJhSUFBZ0RCQVBDeUFFUVRCcUpBQWdEUXZRQWdFQ2Z5TUFRUkJySWdNa0FDQURJQUkzQXdnQ1FBSkFJQUFnQVJES0FTSUVRUUJJRFFBZ0JFVUVRQ0FBUW9DQWdJQXdRUUVnQTBFSWFoQ3VBeUVCREFJTElBQWdBVUU4SUFGQkFCQVVJZ0pDZ0lDQWdIQ0RJZ0ZDZ0lDQWdPQUFVUVJBSUFJaEFRd0NDd0pBQWtBZ0FrS0FnSUNBY0ZvRWZnSkFJQUtuTFFBRlFSQnhSUTBBSUFBZ0FoQ0FBeUlFUlFSQUlBQWdBaEFQREFVTElBQWdCRVlOQUNBQUlBSWdCQ2tEUUJCU1JRMEFJQUFnQWhBUERBSUxJQUFnQWtIYUFTQUNRUUFRRkNFQklBQWdBaEFQSUFGQ2dJQ0FnSENESWdKQ2dJQ0FnT0FBVVEwRVFvQ0FnSUF3SUFFZ0FrS0FnSUNBSUZFYklnSkNnSUNBZ0hDREJTQUJDMEtBZ0lDQU1GSU5BUXNnQUVLQWdJQ0FNRUVCSUFOQkNHb1FyZ01oQVF3Q0N5QUFJQUpCQVNBRFFRaHFFS2NCSVFFZ0FDQUNFQThNQVF0Q2dJQ0FnT0FBSVFFTElBTkJFR29rQUNBQkN6TUJBWDRnQUNBQklBSWdBVUVBRUJRaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSK0lBQWdCU0FCSUFNZ0JCQXZCU0FGQ3dzYkFRRitJQUFnQVNBQ0lBTWdCQkNzQWlFRklBQWdBUkFQSUFVTExBQWdBQ0FCS1FNSUVDTWdBQ0FCS1FNUUVDTWdBQ0FCS1FNWUVDTWdBRUVRYWlBQklBQW9BZ1FSQUFBTDBnUUNCMzhCZmlNQVFUQnJJZ1VrQUFKL1FRQWdBVUtBZ0lDQWNGUU5BQnBCQUNBQnB5SUVMd0VHUVRGSERRQWFJQVFvQWlBTElRY2dCVUlBTndJb0FrQURRQ0FHUVFKSEJFQkJBQ0VFSUFCQklCQmZJZ2hGQkVCQmZ5RUVJQVpCQVVjTkF5QUFLQUlRSUFVb0FpZ1FyZ0lNQXdzRFFDQUVRUUpIQkVBZ0F5QUVRUU4wSWdscUtRTUFJZ3RDSUlpblFYVlBCRUFnQzZjaUNpQUtLQUlBUVFGcU5nSUFDeUFJSUFscUlBczNBd2dnQkVFQmFpRUVEQUVMQ3lBQ0lBWkJBM1JxS1FNQUlndENnSUNBZ0RBZ0FDQUxFRGdiSWd0Q0lJaW5RWFZQQkVBZ0M2Y2lCQ0FFS0FJQVFRRnFOZ0lBQ3lBSUlBczNBeGdnQlVFb2FpQUdRUUowYWlBSU5nSUFJQVpCQVdvaEJnd0JDd3NDUUNBSEtBSUFJZ1JGQkVCQkFDRUVBMEFnQkVFQ1JnMENJQWNnQkVFRGRHb2lBa0VFYWlJREtBSUFJZ1lnQlVFb2FpQUVRUUowYWlnQ0FDSUFOZ0lFSUFBZ0F6WUNCQ0FBSUFZMkFnQWdBaUFBTmdJRUlBUkJBV29oQkF3QUN3QUxBa0FnQkVFQ1J3MEFRUUloQkNBSEtBSVVEUUFnQUNnQ0VDSUNLQUtZQVNJRFJRMEFJQUFnQVNBSEtRTVlRUUVnQWlnQ25BRWdBeEU0QUNBSEtBSUFJUVFMSUFVZ0JVRW9haUFFUVFGcklnTkJBblJxS0FJQUlnSXBBd2czQXdBZ0JTQUNLUU1RTndNSUlBVWdBaWtER0RjREVFRUFJUVFnQlNBRFFRQkhyVUtBZ0lDQUVJUTNBeGdnQlNBSEtRTVlOd01nSUFCQnl3QkJCU0FGRUpvREEwQWdCRUVDUmcwQklBQW9BaEFnQlVFb2FpQUVRUUowYWlnQ0FCQ3VBaUFFUVFGcUlRUU1BQXNBQ3lBSFFRRTJBaFJCQUNFRUN5QUZRVEJxSkFBZ0JBc0pBQ0FBdlVJMGlLY0xUQUVFZnlBQUtBSU1JUUlEUUFKQUlBRWdBa2NFZnlBQUtBSVFJQUZCQW5ScUtBSUFJZ1JGRFFFZ0FDZ0NDQ0FFYUNBQklBSnJRUVYwY21vRlFRQUxEd3NnQVVFQmFpRUJEQUFMQUFzTUFDQUFJQUVRaUFOQkgzWUx2Z0VCQjM4Z0FDZ0NEQ0lGSVFNQ1FBTkFJQU1pQkVVTkFTQUFLQUlRSWdrZ0JFRUJheUlEUVFKMGFpSUdLQUlBUlEwQUN5QUFJQUFvQWdnZ0JDQUZhMEVGZEdvMkFnZ2dCaWdDQUdjaUJ3UkFRU0FnQjJzaEJVRUFJUU1EUUNBRElBUkdSUVJBSUFrZ0EwRUNkR29pQmlBSUlBVjJJQVlvQWdBaUNDQUhkSEkyQWdBZ0EwRUJhaUVEREFFTEN5QUFJQUFvQWdnZ0IyczJBZ2dMSUFBZ0FTQUNJQVJCQUJDcUF3OExJQUJCZ0lDQWdIZzJBZ2dnQUVFQUVFRWFRUUFMVGdJQmZ3RitBbjRqQUNJQ0lBQW9BaEFvQW5oSkJFQWdBQkRwQVVLQWdJQ0E0QUFNQVFzZ0FDQUJyU0FCS1FNQVFvQ0FnSUF3SUFFb0FnZ2dBU2dDSUVFRUVOZ0JDeUVESUFJa0FDQURDd3dBSUFCQitzd0FRUUFRRlFzTEFDQUFRY01hUVFBUUZRdlZBUUVEZnlNQVFSQnJJZ1VrQUVGL0lRTUNRQ0FBS0FJVURRQUNRQUpBSUFGQmdJQ0FnQVJPQkVBZ0FDZ0NBRUhBMmdCQkFCQkdEQUVMSUFFZ0FDZ0NERUVEYkVFQ2JTSUVJQUVnQkVvYklRRWdBQ2dDRUNJRUlBSkJnQUpJY2tVRVFDQUFJQUVROVFNaEF3d0RDeUFBS0FJQUlBQW9BZ1FnQVNBRWRDQUVhMEVSYWlBRlFReHFFS2dCSWdJTkFRc2dBQkNEQXd3QkN5QUZLQUlNSVFNZ0FDQUNOZ0lFSUFCQi8vLy8vd01nQXlBQUtBSVFkaUFCYWlJQUlBQkIvLy8vL3dOT0d6WUNERUVBSVFNTElBVkJFR29rQUNBREN4RUFJQUFnQVNBQ0lBTWdCRUVBRUxjRkN5WUJBWDhnQVVJZ2lLZEJkVThFUUNBQnB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFBZ0FSQnNDeWNCQVg4Z0FVSUFVd1JBSUFCQ0FDQUJmUkF3SVFJZ0FFRUJOZ0lFSUFJUEN5QUFJQUVRTUF2c0FRRUJmd0pBQWtBQ1FBSkFBa0FDUUFKQVFRY2dBa0lnaUtjaUF5QURRUWRyUVc1Skd5SUREZ2dBQUFBRUJBUUVBUU1MSUFBb0F0Z0JJUUFnQVVJQU53SU1JQUZDZ0lDQWdJQ0FnSUNBZnpjQ0JDQUJJQUEyQWdBZ0FTQUN4QkM2QWcwQkRBUUxJQUFvQXRnQklRQWdBVUlBTndJTUlBRkNnSUNBZ0lDQWdJQ0FmemNDQkNBQklBQTJBZ0FnQVNBQ1FvQ0FnSURBZ1lEOC93Qjh2eEM2QlVVTkF3c2dBUkFiUVFBUEN5QURRUXBxUVFKSkRRSUxJQUFvQXRnQklRQWdBVUlBTndJTUlBRkNnSUNBZ0lDQWdJQ0FmemNDQkNBQklBQTJBZ0FnQVJBMUN5QUJEd3NnQXFkQkJHb0w1QUVCQkg4akFFRVFheUlDSkFBZ0FDQUNRUWhxSUFFUTVRRWhBeUFBSUFFUUR3SkFJQU5GQkVCQ2dJQ0FnT0FBSVFFTUFRc2dBaUFESUFNUWdRSWlCR29pQlRZQ0RBSkFJQUlvQWdnZ0JFWUVRQ0FBUWdBUWh3SWhBUXdCQ3lBQUlBVWdBa0VNYWtFQUFuOGdBQ2dDRUNnQ2pBRWlCQVJBUVlVRklBUW9BaWhCQkhFTkFSb0xRWVVCQ3hDNEFpRUJJQUlnQWlnQ0RCQ0JBaUFDS0FJTWFpSUVOZ0lNSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQ0tBSUlJQVFnQTJ0R0RRQWdBQ0FCRUE5Q2dJQ0FnTUIrSVFFTElBQWdBeEJVQ3lBQ1FSQnFKQUFnQVFzeUFDQUF2VUtBZ0lDQWdJQ0ErUDhBZzBLQWdJQ0FnSUNBK1A4QVVpQUFuQ0FBWVhFZ0FKbEUvLy8vLy8vL1AwTmxjUXVJQ0FFUGZ5TUFRZUFFYXlJTkpBQWdBQ0FDRUt3RUlRNGdBQ0FDUVlBQmNoQ3NCQ0VTQWtBZ0FrVWdBVUVDU1hJTkFDQU5JQUUyQWdRZ0RTQUFOZ0lBSUExQkFEWUNDRUVBSUFKcklROGdEVUVNY2lFSkEwQWdDU0FOVFEwQlFUSWdDVUVNYXlJSktBSUlJZ3dnREVFeVRCc2hFeUFKS0FJQUlRQWdDU2dDQkNFSEEwQUNRQ0FIUVFkSkRRQWdEQ0FUUmdSQUlBSWdCMndpQmlBQ2F5RUtJQWRCQVhZZ0Ftd2hCeUFBSUFJUXJBUWhDQU5BSUFjRVFDQUhJQUpySWdjaEJRTkFJQVZCQVhRZ0Ftb2lBU0FHVHcwQ0lBRWdDa2tFUUNBQklBSkJBQ0FBSUFGcUlnRWdBU0FDYWlBRUlBTVJBUUJCQUV3YmFpRUJDeUFBSUFWcUlnVWdBQ0FCYWlJTUlBUWdBeEVCQUVFQVNnMENJQVVnRENBQ0lBZ1JCZ0FnQVNFRkRBQUxBQXNMQTBBZ0JpQUNheUlHUlFSQVFRQWhCd3dEQ3lBQUlBQWdCbW9nQWlBSUVRWUFJQVlnQW1zaEIwRUFJUVVEUUNBRlFRRjBJQUpxSWdFZ0JrOE5BU0FCSUFkSkJFQWdBU0FDUVFBZ0FDQUJhaUlCSUFFZ0Ftb2dCQ0FERVFFQVFRQk1HMm9oQVFzZ0FDQUZhaUlGSUFBZ0FXb2lDaUFFSUFNUkFRQkJBRW9OQVNBRklBb2dBaUFJRVFZQUlBRWhCUXdBQ3dBTEFBc2dBQ0FIUVFKMklBSnNJZ1ZxSWdZZ0FDQUZRUUYwYWlJQklBUWdBeEVCQUNFS0lBRWdBQ0FGUVFOc2FpSUZJQVFnQXhFQkFDRUlBa0FnQ2tFQVNBUkFJQWhCQUVnTkFTQUZJQVlnQmlBRklBUWdBeEVCQUVFQVNCc2hBUXdCQ3lBSVFRQktEUUFnQmlBRklBWWdCU0FFSUFNUkFRQkJBRWdiSVFFTElBeEJBV29oRENBQUlBRWdBaUFPRVFZQVFRRWhCaUFBSUFJZ0IyeHFJZ2doQlNBSUlRb2dBQ0FDYWlJTElRRkJBU0VRQTBBQ1FBSkFJQUVnQlU4TkFDQUFJQUVnQkNBREVRRUFJaEZCQUVnTkFDQVJEUUVnQ3lBQklBSWdEaEVHQUNBQ0lBdHFJUXNnRUVFQmFpRVFEQUVMQWtBRFFDQUJJQVVnRDJvaUJVOE5BU0FBSUFVZ0JDQURFUUVBSWhGQkFFd0VRQ0FSRFFFZ0NpQVBhaUlLSUFVZ0FpQU9FUVlBSUFkQkFXc2hCd3dCQ3dzZ0FTQUZJQUlnRGhFR0FBd0JDeUFBSUFFZ0N5QUFheUlGSUFFZ0Myc2lDeUFGSUF0Skd5SUZheUFGSUJJUkJnQWdBU0FJSUFnZ0Ntc2lDeUFLSUFGcklnVWdCU0FMU3hzaUFXc2dBU0FTRVFZQUlBY2dCbXNoQVNBSUlBVnJJUVVDUUNBQklBWWdFR3NpQjBrRVFDQUFJUVlnQnlFSUlBVWhBQ0FCSVFjTUFRc2dCU0VHSUFFaENBc2dDU0FNTmdJSUlBa2dDRFlDQkNBSklBWTJBZ0FnQ1VFTWFpRUpEQU1MSUFFZ0Ftb2hBU0FHUVFGcUlRWU1BQXNBQ3dzZ0FDQUNJQWRzYWlFSElBQWhCZ05BSUFJZ0Jtb2lCaUVCSUFZZ0IwOE5BUU5BSUFBZ0FVOE5BU0FCSUE5cUlnVWdBU0FFSUFNUkFRQkJBRXdOQVNBQklBVWdBaUFPRVFZQUlBVWhBUXdBQ3dBTEFBc0FDeUFOUWVBRWFpUUFDK29DQWdSL0FuNGpBRUVnYXlJREpBQWdBMEtBZ0lDQU1EY0RHQ0FEUW9DQWdJQXdOd01RSUFNZ0FFSEFBRUVDUVFCQkFpQURRUkJxRU04QklnYzNBd2dnQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBUW9DQWdJRGdBQ0VISUFBQ2ZnSitJQUpDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUFnQWtFQUlBTkJDR29RK1FVTUFRc2dBQ0FDUVFFZ0EwRUlhaENuQVFzaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUFuOUJBQ0FES1FNSUlnaENnSUNBZ0hCVURRQWFRUUFnQ0tjaUJTOEJCa0VQUncwQUdpQUZLQUlnQ3lFR0EwQWdCRUVDUmdSQVFRQWhCQU5BSUFSQkFrY0VRQ0FHSUFSQkEzUWlCV29wQXdnaUIwSWdpS2RCZFU4RVFDQUhweUlBSUFBb0FnQkJBV28yQWdBTElBRWdCV29nQnpjREFDQUVRUUZxSVFRTUFRc0xJQUloQnlBREtRTUlEQU1MSUFSQkEzUWhCU0FFUVFGcUlRUWdBQ0FGSUFacUtRTUlFR0JGRFFBTEN5QUFJQU1wQXdnUUR5QUNDeEFQQ3lBRFFTQnFKQUFnQnd0RkFRRi9Ba0FnQVVHQWdBRnhSUVJBSUFGQmdJQUNjVVVOQVNBQUtBSVFLQUtNQVNJQlJRMEJJQUV0QUNoQkFYRkZEUUVMSUFBZ0FrSE9IUkNQQVVGL0lRTUxJQU1MZ1FFQ0FuOEJmZ0pBSUFFcEFnUWlCRUwvLy8vLy8vLy8vNzkvVmdSQUlBRW9BZ3doQUF3QkN5QUFLQUkwSUFSQ0lJaW5JQUFvQWlSQkFXdHhRUUowYWlFQ0lBQW9BamdoQXdOQUlBTWdBaWdDQUNJQVFRSjBhaWdDQUNJQ0lBRkdEUUVnQWtFTWFpRUNJQUFOQUF0Qm1aQUJRYTc4QUVINEZFSHVIeEFBQUFzZ0FBdWlBd0lEZndGOEl3QkJJR3NpQkNRQUFrQUNRQUpBSUFKQ0lJaW5JZ1ZCQTA4RVFDQUZRUXBxUVFKSkJFQWdCRUVjYWlBQ3AwRUVhaUlGUVFFUXFRRWdBQ2dDMkFFaEF5QUVRZ0EzQWhRZ0JFS0FnSUNBZ0lDQWdJQi9Od0lNSUFRZ0F6WUNDQ0FFUVFocUlnWWdCQ2dDSENJRHJSQXdHaUFHSUFVUWdnSWhCU0FHRUJzZ0FDQUNFQThnQlVVTkF3d0NDeUFGUVFkclFXMU5CRUFDZnlBQ1FvQ0FnSURBZ1lEOC93Qjh2eUlIUkFBQUFBQUFBUEJCWXlBSFJBQUFBQUFBQUFBQVpuRUVRQ0FIcXd3QkMwRUFDeUlEdUNBSFlnMEREQUlMSUFNRVFFRi9JUU1nQUNBQ0VJMEJJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQ0FBSUFSQkhHb2dBa0VCRU1JQ0RRUWdCQ2dDSENFRERBSUxJQUFnQkVFY2FpQUNFSGNFUUNBQUlBSVFEMEYvSVFNTUJBdEJmeUVESUFBZ0FoQ05BU0lDUW9DQWdJQndnMEtBZ0lDQTRBQlJEUU1nQUNBRVFRUnFJQUpCQUJEQ0FnMERJQVFvQWdRaUF5QUVLQUljUmcwQkRBSUxJQUtuSWdOQkFFZ05BUXNnQVNBRE5nSUFRUUFoQXd3QkN5QUFRZUhZQUVFQUVGQkJmeUVEQ3lBRVFTQnFKQUFnQXd1akJBSUZmd0orSXdCQkVHc2lBeVFBUVFjZ0FVRUlheUlHS1FNQUlnaENJSWluSWdRZ0JFRUhhMEZ1U1JzaEJBSi9Ba0FDUUFKQVFRY2dBVUVRYXlJQktRTUFJZ2xDSUlpbklnVWdCVUVIYTBGdVNSc2lCVUYvUmlBRVFYNXhRUUpIY1VVZ0JVRitjVUVDUmlBRVFYOUhjbkVOQUNBQUlBTkJDR29nQ1NBSUlBSkJBVUVBRUlVQ0lnUkZEUUFnQUNBSkVBOGdBQ0FJRUE4Z0JFRUFTQTBCSUFFZ0F5a0RDRGNEQUF3Q0N5QUFJQWtRYkNJSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUlFQThNQVFzZ0FDQUlFR3dpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFBZ0NSQVBEQUVMQWtBQ1FDQUFLQUlRSWdVb0Fvd0JJZ1FFUUNBRUxRQW9RUVJ4RFFFTElBbENJSWluSWdkQmRrY2dDRUlnaUtjaUJFRjJSM0VOQVNBRUlBZEdEUUFnQUNBSkVBOGdBQ0FJRUE4Z0FFR0ZMRUVBRUJVTUFnc2dBQ0FDSUFFZ0NTQUlJQVVvQXFBQ0VSb0FEUUVNQWdzZ0FDQURRUVJxSUFrUW1BRUVRQ0FBSUFnUUR3d0JDeUFBSUFNZ0NCQ1lBUTBBSUFFQ2Z3SkFBa0FDUUFKQUFrQUNRQ0FDUWEwQmF3NERBUU1DQUFzQ1FDQUNRYUFCYXc0Q0JRQUVDeUFES0FJRUlBTW9BZ0IxREFVTElBTW9BZ0FnQXlnQ0JIRU1CQXNnQXlnQ0FDQURLQUlFY2d3REN5QURLQUlBSUFNb0FnUnpEQUlMRUFFQUN5QURLQUlFSUFNb0FnQjBDNjAzQXdBTUFRc2dBVUtBZ0lDQU1EY0RBQ0FHUW9DQWdJQXdOd01BUVg4TUFRdEJBQXNoQUNBRFFSQnFKQUFnQUF1R0JRSUhmd0orQWtBZ0FVS0FnSUNBY0lOQ2dJQ0FnSkIvVWdSQVFvQ0FnSURnQUNFS0lBQWdBUkEzSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVFzQ1FDQUNRb0NBZ0lCd2cwS0FnSUNBa0g5UkRRQkNnSUNBZ09BQUlRb2dBQ0FDRURjaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQUlBRWhBZ3dCQ3dKQUlBS25JZ1VwQWdRaUNrTC8vLy8vQjROUURRQWdBYWNpQXlrQ0JDRUxBa0FnQXlnQ0FFRUJSeUFLSUF1RlFvQ0FnSUFJZzBJQVVuSU5BQ0FESUFBb0FoQW9BZ3dSQkFBZ0JTa0NCQ0lLcHlJRVFmLy8vLzhIY1NJSElBTXBBZ1FpQzZjaUJrSC8vLy8vQjNFaUNHb2dCRUVmZG5RZ0JrRWZkaUlKUVJGemFra05BQ0FGUVJCcUlRWWdBMEVRYWlFRUlBa0VRQ0FFSUFoQkFYUnFJQVlnQjBFQmRCQWZHaUFESUFNcEFnUWlDaUFGS1FJRWZFTC8vLy8vQjRNZ0NrS0FnSUNBZUlPRU53SUVEQUlMSUFRZ0NHb2dCaUFIRUI4YUlBTWdBeWtDQkNJS0lBVXBBZ1I4UXYvLy8vOEhneUlMSUFwQ2dJQ0FnSGlEaERjQ0JDQUVJQXVuYWtFQU9nQUFEQUVMQW40Q1FBSkFJQXVuUWYvLy8vOEhjU0FLcDBILy8vLy9CM0ZxSWdkQmdJQ0FnQVJQQkVBZ0FFSEEyZ0JCQUJCR0RBRUxJQUFnQnlBS0lBdUVweUlHUVI5MkVPb0JJZ2dOQVF0Q2dJQ0FnT0FBREFFTElBaEJFR29oQkFKQUlBWkJBRTRFUUNBRUlBTkJFR29nQXlnQ0JFSC8vLy8vQjNFUUh5SUVJQU1vQWdSQi8vLy8vd2R4YWlBRlFSQnFJQVVvQWdSQi8vLy8vd2R4RUI4YUlBUWdCMnBCQURvQUFBd0JDeUFFSUFNZ0F5Z0NCRUgvLy8vL0IzRVF3d1VnQkNBREtBSUVRUUYwYWlBRklBVW9BZ1JCLy8vLy93ZHhFTU1GQ3lBSXJVS0FnSUNBa0grRUN5RUtJQUFnQVJBUERBRUxJQUVoQ2dzZ0FDQUNFQThnQ2d0QUFDQUFBbjhDZnlBREJFQWdBU2dDSkNBQ1FRTjBha0VFYWd3QkMwRUFJQUVvQWlBaUEwVU5BUm9nQXlBQkx3RW9JQUpxUVFSMGFnc29BZ0FMRU5rQkN3MEFJQUFnQVNBQ1FRSVF6Z0lMTlFFQmZ5TUFRZEFBYXlJQ0pBQWdBaUFBS0FJUUlBSkJFR29nQVJDUUFUWUNBQ0FBUWVmNUFDQUNFTVlDSUFKQjBBQnFKQUFMb3dFQ0FYOEJmaU1BUVJCcklnVWtBQ0FGSUFRMkFneEJmeUVFSUFBZ0FTQUZRUXhxRU5RQlJRUkFJQU1vQWdBaUFFRjhjU0FCSUFJZ0F5Z0NCQ0FBUVFOeFFRSjBRWlRBQVdvb0FnQVJJQUFoQmlBREtBSUFFT29GSUFVb0Fnd2lBQ0FBS0FJQVFmLy8vLzhEY1RZQ0FDQURRb0NBZ0lBd0lBWWdCa0tBZ0lDQWNJTkNnSUNBZ09BQVVTSUFHemNEQUVGL1FRQWdBQnNoQkFzZ0JVRVFhaVFBSUFRTDlRRUJBMzhqQUVFUWF5SUdKQUFnQmlBQU9RTUlJQVlnQVVFQmF5SUhOZ0lBSUFWQmdBRkIrUEFBSUFZUVRob2dBeUFGTFFBQVFTMUdOZ0lBSUFRZ0JTMEFBVG9BQUNBQlFRSk9CRUFnQkVFQmFpQUZRUU5xSUFjUUh4b0xJQUVnQkdwQkFEb0FBQ0FDSVFnZ0FTQUZhaUFCUVFGS2FrRUNhaUVDUVFBaEEwRUFJUVFEUUNBQ0lnRkJBV29oQWlBQkxBQUFJZ1VRamdZTkFBc0NRQUpBQWtBZ0JVRXJhdzREQVFJQUFndEJBU0VFQ3lBQ0lRRUxBMEFnQVN3QUFDSUNFTkVDQkVBZ0FVRUJhaUVCSUFOQkNtd2dBbXRCTUdvaEF3d0JDd3NnQ0NBRFFRQWdBMnNnQkJ0QkFXbzJBZ0FnQmtFUWFpUUFDNWtIQWdwL0FYNGpBRUh3QUdzaUJTUUFJQUFvQWhBaEJpQUZRZ0EzQTFnZ0JVSUFOd05RSUFVZ0JqWUNaQ0FGUVRzMkFtQUNRQ0FDQkg4Z0JTQUNOZ0pBSUFWQjBBQnFRZE04SUFWQlFHc1FrZ0lnQTBGL1J3UkFJQVVnQXpZQ01DQUZRZEFBYWtIWit3QWdCVUV3YWhDU0Fnc2dCVUhRQUdwQkNoQVJJQUFnQVVFeElBQWdBaEJpUVFNUUdSb2dBQ0FCUVRJZ0E2MUJBeEFaR2lBRVFRSnhEUUVnQUNnQ0VBVWdCZ3RCakFGcUlRZ2dCRUVCY1VVaEN3TkFJQWdvQWdBaUNFVU5BU0FMUlFSQVFRRWhDd3dCQzBIZ2lBRWhBa0VBSVFZQ1FDQUlLUU1JSWc5Q2dJQ0FnSEJVRFFBZ0Q2Y2lCQ2dDRUNJRFFUQnFJUWNnQXlBREtBSVlRWDl6UVFKMFFhUitjbW9vQWdBaEF3TkFJQU5GRFFFZ0J5QURRUUZyUVFOMElnbHFJZ29vQWdBaEF5QUtLQUlFUVRaSEJFQWdBMEgvLy84ZmNTRUREQUVMQ3lBRFFmLy8vLzhEU3cwQUlBUW9BaFFnQ1dvcEF3QWlEMEtBZ0lDQWNJTkNnSUNBZ0pCL1VnMEFJQUFnRHhDekFTSURSUTBBSUFOQjRJZ0JJQU10QUFBYklRSWdBeUVHQ3lBRklBSTJBaUFnQlVIUUFHcEIwendnQlVFZ2FoQ1NBaUFBSUFZUVZBSkFJQWdvQWdnaUFpOEJCaER1QVFSQUlBSW9BaUFpQnk4QUVTSUNRUXQyUVFGeElRb2dBa0dBQ0hGRkRRRkJmeUVHQWtBZ0J5Z0NVQ0lDUlEwQUlBZ29BaUFnQnlnQ0ZFRi9jMm9oRGlBQ0lBY29Ba3hxSVFrZ0J5Z0NSQ0VFUVFBaERBTkFJQVFoQmlBQ0lBbFBEUUVnQWtFQmFpRURBbjhnQWkwQUFDSUNSUVJBQWtBZ0JVSG9BR29nQXlBSkVPNEZJZ0pCQUVnTkFDQUZLQUpvSVEwZ0JVSHNBR29nQWlBRGFpSUNJQWtRN2dVaUEwRUFTQTBBSUFVb0Ftd2lCRUVCZGtFQUlBUkJBWEZyY3lBR2FpRUVJQUlnQTJvTUFnc2dCeWdDUkNFR0RBTUxJQVlnQWtFQmF5SUNRZjhCY1VFRmJpSU5RWHRzSUFKcVFmOEJjV3BCQVdzaEJDQURDeUVDSUF3Z0RXb2lEQ0FPVFEwQUN3c2dCU0FBSUFjb0FrQVFrUVFpQWtIemlBRWdBaHMyQWhBZ0JVSFFBR3BCd0R3Z0JVRVFhaENTQWlBQUlBSVFWQ0FHUVg5SEJFQWdCU0FHTmdJQUlBVkIwQUJxUWRuN0FDQUZFSklDQ3lBRlFkQUFha0VwRUJFTUFRdEJBQ0VLSUFWQjBBQnFRYWVTQVVFQUVKSUNDeUFGUWRBQWFrRUtFQkVnQ2tVTkFBc0xJQVZCMEFCcVFRQVFFVUtBZ0lDQUlDRVBJQVVvQWxBaEFpQUZLQUpjUlFSQUlBQWdBaEJpSVE4TElBSUVRQ0FGS0FKa0lBSkJBQ0FGS0FKZ0VRRUFHZ3NnQUNBQlFUVWdEMEVERUJrYUlBVkI4QUJxSkFBTHBnRUJBMzhqQUVHZ0FXc2lCQ1FBSUFRZ0FDQUVRWjRCYWlBQkd5SUZOZ0tVQVVGL0lRQWdCQ0FCUVFGcklnWkJBQ0FCSUFaUEd6WUNtQUVnQkVFQVFaQUJFQ3NpQkVGL05nSk1JQVJCT2pZQ0pDQUVRWDgyQWxBZ0JDQUVRWjhCYWpZQ0xDQUVJQVJCbEFGcU5nSlVBa0FnQVVFQVNBUkFRYURVQkVFOU5nSUFEQUVMSUFWQkFEb0FBQ0FFSUFJZ0EwSGpBRUhrQUJDWkJDRUFDeUFFUWFBQmFpUUFJQUFMblFNREFYNERmd044QWtBQ1FBSkFBa0FnQUwwaUFVSUFXUVJBSUFGQ0lJaW5JZ0pCLy84L1N3MEJDeUFCUXYvLy8vLy8vLy8vL3dDRFVBUkFSQUFBQUFBQUFQQy9JQUFnQUtLakR3c2dBVUlBV1EwQklBQWdBS0ZFQUFBQUFBQUFBQUNqRHdzZ0FrSC8vNy8vQjBzTkFrR0FnTUQvQXlFRFFZRjRJUVFnQWtHQWdNRC9BMGNFUUNBQ0lRTU1BZ3NnQWFjTkFVUUFBQUFBQUFBQUFBOExJQUJFQUFBQUFBQUFVRU9pdlNJQlFpQ0lweUVEUWN0M0lRUUxJQVFnQTBIaXZpVnFJZ0pCRkhacXR5SUdSQUFBNFA1Q0x1WS9vaUFCUXYvLy8vOFBneUFDUWYvL1AzRkJuc0dhL3dOcXJVSWdob1MvUkFBQUFBQUFBUEMvb0NJQUlBQWdBRVFBQUFBQUFBQUFRS0NqSWdVZ0FDQUFSQUFBQUFBQUFPQS9vcUlpQnlBRklBV2lJZ1VnQmFJaUFDQUFJQUJFbjhaNDBBbWF3eitpUks5NGpoM0ZjY3cvb0tKRUJQcVhtWm1aMlQrZ29pQUZJQUFnQUNBQVJFUlNQdDhTOGNJL29rVGVBOHVXWkViSFA2Q2lSRm1USXBRa1NkSS9vS0pFazFWVlZWVlY1VCtnb3FDZ29pQUdSSFk4ZVRYdk9lbzlvcUFnQjZHZ29DRUFDeUFBQ3c4QUlBQWdBVUtBZ0lDQU1CQy9BZ3NtQVFGL0l3QkJFR3NpQkNRQUlBUWdBallDRENBQUlBTWdBU0FDRUpJRUlBUkJFR29rQUF1WkFRRURmQ0FBSUFDaUlnTWdBeUFEb3FJZ0EwUjgxYzlhT3RubFBhSkU2NXdyaXVibFdyNmdvaUFESUFORWZmNnhWK01keHo2aVJOVmh3Um1nQVNxL29LSkVwdmdRRVJFUmdUK2dvQ0VGSUFNZ0FLSWhCQ0FDUlFSQUlBUWdBeUFGb2tSSlZWVlZWVlhGdjZDaUlBQ2dEd3NnQUNBRElBRkVBQUFBQUFBQTREK2lJQVVnQktLaG9pQUJvU0FFUkVsVlZWVlZWY1Uvb3FDaEM1SUJBUU44UkFBQUFBQUFBUEEvSUFBZ0FLSWlBa1FBQUFBQUFBRGdQNklpQTZFaUJFUUFBQUFBQUFEd1B5QUVvU0FEb1NBQ0lBSWdBaUFDUkpBVnl4bWdBZm8rb2tSM1VjRVdiTUZXdjZDaVJFeFZWVlZWVmFVL29LSWdBaUFDb2lJRElBT2lJQUlnQWtUVU9JaSs2ZnFvdmFKRXhMRzB2Wjd1SVQ2Z29rU3RVcHlBVDM2U3ZxQ2lvS0lnQUNBQm9xR2dvQXNLQUNBQVFUQnJRUXBKQzQwQkFDQUFJQUFnQUNBQUlBQkVDZmY5RGVFOUFqK2lSSWl5QVhYZzcway9vS0pFTzQ5b3RTaUNwTCtnb2tSVlJJZ09WY0hKUDZDaVJIMXY2d01TMXRTL29LSkVWVlZWVlZWVnhUK2dJQUNpSUFBZ0FDQUFJQUJFZ3BJdXNjVzRzeitpUkZrQmpSdHNCdWEvb0tKRXlJcFpuT1VxQUVDZ29rUkxMWW9jSnpvRHdLQ2lSQUFBQUFBQUFQQS9vS01McXdJQkNIOGpBRUV3YXlJRUpBQWdBa0VIY1NFSklBQW9BZ0FpQlVFSWFpRUdRU0FoQndOQUlBVW9BaHdpQXlBQklBZHFJZ2hKQkVBQ1FDQUZLQUlVQkVBZ0JpZ0NBQ0VEREFFTElBQW9BZ0FoQXlBRlFnQTNBaFFnQlVLQWdJQ0FnSUNBZ0lCL053SU1JQVVnQXpZQ0NBc2dCRUlBTndJb0lBUkNnSUNBZ0lDQWdJQ0FmemNDSUNBRUlBTTJBaHdnQkVJQU53SVVJQVJDZ0lDQWdJQ0FnSUNBZnpjQ0RDQUVJQU0yQWdnZ0JpQUVRUnhxSWdvZ0JFRUlhaUlEUVFBZ0NFRVBha0VEYmtFQmFrRUFFS0FFSUFZZ0JpQURJQWhCQUJDVkFSb2dDaEFiSUFNUUd5QUZJQWcyQWh3Z0NDRURDeUFBSUFZUVJCb2dBRUVBTmdJRUlBQWdBU0FKSUFNUTRRTkZCRUFnQjBFQmRpQUhhaUVIREFFTEN5QUFJQUVnQWhET0FSb2dCRUV3YWlRQUMxY0JBbjhqQUVFZ2F5SUZKQUFnQUNnQ0FDRUdJQVZDQURjQ0dDQUZRb0NBZ0lDQWdJQ0FnSDgzQWhBZ0JTQUdOZ0lNSUFWQkRHb2lCaUFDRUxvQ0dpQUFJQUVnQmlBRElBUVFReG9nQmhBYklBVkJJR29rQUFzZUFDQUJCRUFnQUNnQ0FDSUFLQUlBSUFGQkFDQUFLQUlFRVFFQUdnc0xFQUFnQWEwZ0FLMStJQUlnQXhDb0JBdGlBUUYvSXdCQklHc2lCaVFBQWtBQ1FDQURJQVVnQXlBRlNCdEI1QUJPQkVBZ0JpQUJOZ0ljUVg4aEFTQUFJQVpCREdvZ0FpQURJQVFnQlVFRUVKOEdSUTBCREFJTElBRWdBaUFESUFRZ0JSQ2VCZ3RCQUNFQkN5QUdRU0JxSkFBZ0FRdFFBUUovSUFKQkFDQUNRUUJLR3lFQ0FrQURRQ0FDSUFSR0RRRWdBQ0FFUVFKMGFpSURJQU1vQWdBaUF5QUJhellDQUNBRVFRRnFJUVFnQVNBRFN5RURRUUVoQVNBRERRQUxRUUFoQVFzZ0FRdFRBUUYvSUFFZ0FDZ0NCQ0lDU2dSQUlBQW9BZ3dnQUNnQ0NDQUJJQUpCQTJ4QkFtMGlBaUFCSUFKS0d5SUJRUUowSUFBb0FoQVJBUUFpQWtVRVFFRi9Ed3NnQUNBQk5nSUVJQUFnQWpZQ0NBdEJBQXRaQVFOL1FYOGhBU0FBSUFBb0FnQWlBa0VDYWlJREVOa0NCSDlCZndVZ0FDZ0NDQ0lCUVFScUlBRWdBa0VDZENJQ0VKd0JJQUFvQWdnaUFVRUFOZ0lBSUFFZ0FtcEJmellDQkNBQUlBTTJBZ0FnQUJDaUJrRUFDd3VsQWdFRmZ3TkFBa0FDUUFKQUFrQUNmeUFDSUFkTUlna2dCQ0FHVEhKRkJFQWdBU0FIUVFKMGFpZ0NBQ0lJSUFNZ0JrRUNkR29vQWdBaUNVa0VRQ0FJREFJTElBZ2dDVWNOQXlBR1FRRnFJUVlnQjBFQmFpRUhJQWdoQ1F3RUN5QUpEUUVnQVNBSFFRSjBhaWdDQUFzaENTQUhRUUZxSVFjTUFnc2dCQ0FHVEEwQ0lBTWdCa0VDZEdvb0FnQWhDUXNnQmtFQmFpRUdDd0ovQWtBQ1FBSkFBa0FnQlE0REF3QUJBZ3NnQmlBSGNVRUJjUXdEQ3lBR0lBZHpRUUZ4REFJTEVBRUFDeUFHSUFkeVFRRnhDeUVLSUFvZ0FDZ0NBQ0lJUVFGeFJnMEJJQUFvQWdRZ0NFd0VRQ0FBSUFoQkFXb1EyUUlFUUVGL0R3c2dBQ2dDQUNFSUN5QUFJQWhCQVdvMkFnQWdBQ2dDQ0NBSVFRSjBhaUFKTmdJQURBRUxDeUFBRUtJR1FRQUxhd0lCZmdKL0lBQW9BZ0FoQXdOQUlBTXRBQUFpQkVFNmEwSC9BWEZCOWdGUEJFQWdBa0lLZmlBRXJVTC9BWU44UWpCOUlnSkMvLy8vL3dkVUlnUWdBWElFUUNBQ1F2Ly8vLzhISUFRYklRSWdBMEVCYWlFRERBSUZRWDhQQ3dBTEN5QUFJQU0yQWdBZ0FxY0xaQUVCZndKQUlBRkNJSWluSWdKRklBSkJDMnBCRVV0eURRQUNRQ0FCUW9DQWdJQndWQTBBSUFHbklnSXZBUVpCQkVjTkFDQUNLUU1nSWdGQ0lJaW5JZ0pGSUFKQkMycEJFVXR5RFFFTElBQkI5c2NBUVFBUUZVS0FnSUNBNEFBaEFRc2dBUXNSQUNBQUlBRWdBaUFEUVFCQkFCQ0NBUXUrQVFJR2Z3SitJQUVvQWdBaUF5QUFLUUlFSWdtblFmLy8vLzhIY1NJRUlBTWdCRW9iSUFOcklRY2dBRUVRYWlFRklBTkJBbW9oQ0NBSlFvQ0FnSUFJZ3lFS1FRQWhBRUlBSVFrQ1FBTkFJQUJCQWtjRVFFRi9JUVlnQUNBSFJnMENBbjhnQ2xCRkJFQWdCU0FEUVFGMGFpOEJBQXdCQ3lBRElBVnFMUUFBQ3lJRVFUQnJRUWxMRFFJZ0FFRUJhaUVBSUFOQkFXb2hBeUFFclNBSlFncCtmRUl3ZlNFSkRBRUxDeUFDSUFrM0F3QWdBU0FJTmdJQVFRQWhCZ3NnQmd1YUF3TUNmQU4vQVg0Q2Z5QUFLd01JSWdKRUFBQUFBQUFBS0VBUWpnTWlBNWxFQUFBQUFBQUE0RUZqQkVBZ0E2b01BUXRCZ0lDQWdIZ0xJZ1JCREdvZ0JDQUVRUUJJR3lJRVFRQktJUVlnQkVFQUlBWWJJUVlDZmlBQUt3TUFJQUpFQUFBQUFBQUFLRUNqbktBaUFwbEVBQUFBQUFBQTRFTmpCRUFnQXJBTUFRdENnSUNBZ0lDQWdJQ0Fmd3NpQnhETUJMa2hBZ05BSUFVZ0JrWkZCRUFnQlVFQ2RFR1EwZ0ZxS0FJQUlRUWdCVUVCUmdSQUlBUWdCeERMQktkcVFlMENheUVFQ3lBRlFRRnFJUVVnQWlBRXQ2QWhBZ3dCQ3dzZ0FpQUFLd01RUkFBQUFBQUFBUEMvb0tCRUFBQUFBSENabEVHaUlBQXJBekFnQUNzREtFUUFBQUFBQUVDUFFLSWdBQ3NER0VRQUFBQUFRSGRMUWFJZ0FDc0RJRVFBQUFBQUFFenRRS0tnb0tDZ0lRSWdBUVJBSUFJQ2ZpQUNtVVFBQUFBQUFBRGdRMk1FUUNBQ3NBd0JDMEtBZ0lDQWdJQ0FnSUIvQ3hDNEEwSGcxQU5zdDZBaEFnc2dBcDFFQUFBQUFBQUFBQUNnUkFBQUFBQUFBUGgvSUFKRUFBRGN3Z2l5UGtObEcwUUFBQUFBQUFENGZ5QUNSQUFBM01JSXNqN0RaaHNMZGdFQ2Z5QUJLQUlBUVFCSUJFQWdBU0FBUVVCcktBSUFFREkyQWdBTElBQkJFUkFRSUFCQnNBRVFFQ0FDUVFBZ0FrRUFTaHNoQWlBQVFla0FRWDhRSENFRUEwQWdBaUFEUmtVRVFDQUFRUTRRRUNBRFFRRnFJUU1NQVFzTElBQkJCaEFRSUFCQjZ3QWdBU2dDQUJBY0dpQUFJQVFRSGd0UEFRRi9RWDhoQVFKQUlBQkIrd0FRTEEwQUlBQW9BaEJCL1FCSEJFQWdBQkNBQVJvRFFDQUFRUWNRNFFFTkFpQUFLQUlRUWYwQVJ3MEFDeUFBRVBNQkMwRi9RUUFnQUJBU0d5RUJDeUFCQzJnQUlBQWdBU0FDRUU4aUFFRUFUZ1JBSUFFb0FuUWdBRUVFZEdvaUFpQUNLQUlNUVlkL2NTQURRUU4wUWZnQWNYSTJBZ3dnQWlBQktBSzhBU0lETmdJRUlBSWdBU2dDd0FFMkFnZ2dBU2dDekFFZ0EwRURkR29nQURZQ0JDQUJJQUEyQXNBQkN5QUFDMjBCQVg4Z0FDQUJRZndCYWtFUUlBRkIrQUZxSUFFb0F2UUJRUUZxRUhoRkJFQWdBU0FCS0FMMEFTSURRUUZxTmdMMEFTQUJLQUw4QVNBRFFRUjBhaUlEUVg4MkFnQWdBeUFETFFBRVFmZ0JjVG9BQkNBRElBRW9BcndCTmdJSUlBTWdBQ0FDRUJnMkFnd0xJQU1MeGdNQkJIOGdBRUZBYXlJRktBSUFRYkFDYWlFREEwQkJBQ0VDQWtBRFFDQURLQUlBSWdORkRRRWdBeWdDSEFSQUlBRkZCRUFnQUVFR0VCQUxJQUJCaEFFUUVFR0RBU0VDSUFBZ0JTZ0NBQzBBYkVFRFJnUi9JQUJCRGhBUUlBQkJEaEFRSUFCQndnQVFFQ0FBUVFZUUdpQUFRUkVRRUNBQVFiQUJFQkFnQUVIcUFFRi9FQndoQVNBQVFTUVFFQ0FGS0FJQVFRQVFGeUFBUVlFQkVCQWdBRUdMQVJBUUlBQkI2d0JCZnhBY0lRUWdBQ0FCRUI0Z0FFRU9FQkFnQUNBRUVCNUJEZ1ZCZ3dFTEVCQkJmU0VDUVFFaEFRc2dBeWdDRUNBQ2FpRUNJQU1vQWhSQmYwWU5BQXRCRDBFT0lBRWJJUVFEUUNBQ0JFQWdBQ0FFRUJBZ0FrRUJheUVDREFFTEN5QUJSUVJBSUFCQkJoQVFDeUFBUWUwQUlBTW9BaFFRSEJwQkFTRUJEQUVMQ3dKQUlBQkJRR3NvQWdBaUFpZ0NZQVJBQWtBZ0FVVUVRRUYvSVFJTUFRc2dBRUVxRUJBZ0FFSHBBRUYvRUJ3aEFpQUFRUTRRRUFzZ0FFRzRBUkFRSUFCQkNCQWFJQUJCUUdzb0FnQkJBQkFYSUFBZ0FoQWVRU2doQWd3QkN5QUNMUUJzSWdNRVFDQUJSUVJBSUFCQkJoQVFRUzRoQWd3Q0MwRXVJUUlnQTBFRFJ3MEJJQUJCaXdFUUVBd0JDMEVvUVNrZ0FSc2hBZ3NnQUNBQ0VCQUxYUUVDZndKQUFrQWdBQ2dDbUFJaUFVRUFTQTBBSUFBb0FvQUNJQUZxTFFBQUlnQkJJMnNpQVVFTlRVRUFRUUVnQVhSQjVmQUFjUnNOQVFKQUlBQkI2d0JyRGdRQ0FRRUNBQXNnQUVIc0FXdEJBa2tOQVF0QkFTRUNDeUFDQ3k4QUlBQWdBU0FDSUFNUTR3SWlBRUVBVGdSQUlBRW9BblFnQUVFRWRHb2lBU0FCS0FJTVFRTnlOZ0lNQ3lBQUN5NEFJQUJCREJBcElnQUVRQ0FBSUFNMkFnZ2dBQ0FDTmdJRUlBQWdBU2dDRURZQ0FDQUJJQUEyQWhBTElBQUxhd0VCZndKQUlBRW9BcUFCSWdOQkFFNE5BQ0FBSUFFZ0FoQlBJZ05CQUVnTkFDQUJJQU0yQXFBQklBTkJCSFFpQUNBQktBSjBhaUlDSUFJb0FneEJoMzl4UVNCeU5nSU1JQUV0QUc1QkFYRkZEUUFnQVNnQ2RDQUFhaUlBSUFBb0FneEJBWEkyQWd3TElBTUxMZ0VCZndKQUlBRW9BcGdCSWdKQkFFNE5BQ0FBSUFGQnpRQVFUeUlDUVFCSURRQWdBU0FDTmdLWUFRc2dBZ3VZQVFFRWZ5QUJLQUlVSWdWQkFDQUZRUUJLR3lFR0lBRkJFR29oQkFKQUEwQWdBeUFHUndSQUlBUW9BZ0FnQTBFRGRHb29BZ0FnQWtZTkFpQURRUUZxSVFNTUFRc0xRWDhoQXlBQUlBUkJDQ0FCUVJocUlBVkJBV29RZUEwQUlBRWdBU2dDRkNJRVFRRnFOZ0lVSUFFb0FoQWhBeUFBSUFJUUdDRUJJQU1nQkVFRGRHb2lBRUVBTmdJRUlBQWdBVFlDQUNBR0lRTUxJQU1MWlFFQmZ5QUFRZm9BRUVwRkJFQWdBRUdkOXdCQkFCQVdRUUFQQ3dKQUlBQVFFZzBBSUFBb0FoQkJnWDlIQkVBZ0FFR045d0JCQUJBV1FRQVBDeUFBS0FJQUlBQXBBeUFRTVNJQlJRMEFJQUFRRWtVRVFDQUJEd3NnQUNnQ0FDQUJFQk1MUVFBTDRCTUJHSDhqQUVIUUFHc2lCQ1FBSUFCQlFHc29BZ0FoQlNBQUtBSUFJUWNnQkVFQU5nSThJQUFvQWhnaEVpQUZJQVV0QUc0aUZVRUJjam9BYmdKL0FrQUNRQ0FBRUJJTkFBSkFBa0FnQUNnQ0VFR0RmMFlFUUNBQUtBSW9SUTBCSUFBUTRnRU1Bd3NnQVNBQ1FRSkdjZzBCSUFCQnh1Z0FRUUFRRmd3Q0N5QUhJQUFvQWlBUUdDRUpJQUFRRWcwQ0N5QUJSUVJBSUFjZ0NVSDhBQ0FKR3hBWUlRc0xJQUFRZ0FFYUFuOGdBQ2dDRUNJT1FVNUdCRUFnQUJBU0RRTWdBQkNqQWcwRFFRRU1BUXNnQUVFR0VCQkJBQXNoQVNBSkJFQWdBQ0FGSUFsQkFoQ2dBVUVBU0EwQ0N5QUFRZnNBRUN3TkFTQU9RVTVHSVJZZ0FCQ0FBUm9nQUVFQ0VCQWdCU2dDaEFJaEZ5QUFRVUJySWdNb0FnQkJBQkE1SUFCQjFnQVFFQ0FBSUFsQkZrRXZJQXNiSUFrYkVCb2dBeWdDQUNBQkVHUWdCU2dDbUFJaEdFRUFJUU1EUUNBRFFRSkdSUVJBSUFSQkVHb2dBMEVFZEdvaUFVRUFOZ0lJSUFGQ0FEY0RBQ0FEUVFGcUlRTU1BUXNMSUFSQkFEWUNORUVJUVFjZ0RrRk9SaHNoRXlBT1FVNUhJUmtnQUVGQWF5RUtBMEFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDZndKL0FrQWdBQ2dDRUNJRFFUdEhCRUFnQTBIOUFFWU5CRUVBSUFOQldFY05BaG9nQUJBU1JRMEJEQXdMUVFBaEF5QUFFQkpGRFF3TURnc0NRQUpBSUFBb0FoQkJPMnNPQXdBQkFBRUxRU3doQVNBRVFTdzJBandnQUNnQ0dDRVJRUUFoRDBFQUlRWkJBQXdDQ3lBQVFSc1FFRUVCQ3lFUElBQW9BaGdoRVNBQUlBUkJQR3BCQVVFQVFRRVF4QU1oQmlBRUtBSThJUUVnQmtFQVNBMEVJQU5CV0VZTElSQkJQQ0VEQWtBZ0FVRThSeUFRY2lJYVFRRWdCa0Z2Y1NJTkd3UkFJQUZCTzBZZ0VIRkZJQUZCK0FCSGNRMEJJQUVoQXdzZ0FFR0s2QUJCQUJBV0RBd0xJQVpCRUhFaERBSkFBa0FDUUNBR1FXNXhRUUpHQkVBZ0RFVU5CaUFGSUFFZ0JTZ0N2QUVRd3dNaUEwRUFUZ1JBSUFVb0FuUWdBMEVFZEdvaUJpZ0NEQ0lJUVFOMlFROXhJZ05CQ1UxQkFFRUJJQU4wUWVBRWNSc2dBeUFOUVFWcVJuSU5BaUFHSUFoQmgzOXhRY2dBY2pZQ0RBd0dDeUFBS0FJQUlBVWdBU0FOUVFWcUVPY0NRUUJPRFFVTUJ3dEJCaUVVUVFFaEEwRUFJUWhCQUNFR0FrQUNRQUpBQWtBQ1FBSkFJQTBPQndBQ0FnSUZBd0VDQ3lBQUtBSVFRU2hHRFFFZ0FVRTdhMEVCVFFSQUlBQkJzK2dBUVFBUUZnd01DeUFNQkVBZ0JTQUJJQVVvQXJ3QkVNTURRUUJPRFFZZ0FDZ0NBQ0FGSUFGQkJSRG5Ba0VBU0EwTUlBQkJCUkFRSUFBZ0FSQWFJQUJCdlFFUUVDQUFJQUVRR2lBS0tBSUFJZ01nQXk4QnZBRVFGd3NnQkVFUWFpQVBRUVIwYWlJSUtBSUFSUVJBSUFBZ0NCRGVCQTBNQ3lBQlJRUkFJQVFnQ0NnQ0JEWUNBQ0FFUVVCcklnWkJFRUhjSWlBRUVFNGFRUUFoQXlBSFFmVUFRZlFBSUJBYklBWVE0UVFpQmtVTkZDQUFJQVVnQmtFQ0VLQUJRUUJJQkVBZ0J5QUdFQk1NRlFzZ0FFSHdBQkFRSUFCQnZRRVFFQ0FBSUFZUUdpQUtLQUlBSWdNZ0F5OEJ2QUVRRndzZ0NpQUlLQUlBTmdJQUlBQkJ1QUVRRUNBQVFRZ1FHaUFLS0FJQVFRQVFGd0pBSUFGRkJFQWdBRUc0QVJBUUlBQWdCaEFhSUFvb0FnQWlBeUFETHdHOEFSQVhJQWdnQ0NnQ0JFRUJhallDQkNBSElBWVFFd3dCQ3lBTVJRMEFJQUJCdUFFUUVDQUFJQUVRR2lBS0tBSUFJZ01nQXk4QnZBRVFGd3NDUUNBQUtBSVFRVDFHQkVBZ0FCQVNEUTBnQUJCV0RRME1BUXNnQUVFR0VCQUxBa0FnREFSQUlBQVF3Z01nQUVIR0FCQVFEQUVMSUFGRkJFQWdBQkRDQXlBQVFkRUFFQkFnQUVFT0VCQU1BUXNnQUNBQkVLRUJJQUJCekFBUUVDQUFJQUVRR2dzZ0NpQUtLQUlBS0FJRU5nSUFJQUFRdHdFTkN3d1BDMEVESVFNTUFndEJBQ0VESUJvRVFBd0NDeUFXSVFnZ0dTRUdJQk1oRkNBRUtBSTBSUTBDSUFCQmlQQUFRUUFRRmtFOElRTU1FUXRCQWlFREN3c2dEQVJBSUFBZ0JFRVFhaUFQUVFSMGFoRGRCRUVBU0EwSEN5QUFJQlFnQXlBUklBQW9BaFJCQUNBRVFUaHFFUGdCRFFZZ0JpQUlja0VCUmdSQUlBUWdCQ2dDT0RZQ05Bd0xDeUFNUlEwQ0lBUW9BamhCQVRZQ3VBRWdCU0FCSUFVb0Fyd0JFTU1EUVFCSURRRUxJQUJCd1BrQVFRQVFGZ3dGQ3lBQUtBSUFJQVVnQVVFR0VPY0NRUUJJRFFRZ0FFSFFBQkFRSUFCQnpRQVFFQ0FBSUFFUUdpQUFRYjBCRUJBZ0FDQUJFQm9nQ2lnQ0FDSURJQU12QWJ3QkVCY01DQXNDUUNBQlJRUkFJQUJCMVFBUUVBd0JDeUFBUWRRQUVCQWdBQ0FCRUJvTElBb29BZ0JCQUJCa0RBY0xJQVFvQWpRaUEwVUVRQ0FFSUFBb0FnUTJBa0FnQkNBQUtBSVVJZ1kyQWtRZ0JDQUFLQUlZTmdKTUlBUWdBQ2dDTURZQ1NDQUFRYVVaUWFBWklBNUJUa1lpQVJzaUF6WUNPQ0FBS0FJOElRZ2dBQ0FEUVJoQkJDQUJHMm8yQWp4QmZ5RUJJQUFRRWtVRVFDQUFJQk5CQUNBRElBWkJBQ0FFUVRScUVQZ0JJUUVMSUFBZ0NEWUNQRUVBSVFNZ0FDQUVRVUJyRU80Q0lBRnlEUXNnQkNnQ05DRURDeUFGS0FLQUFpQVhhaUFES0FJSU5nQUFJQVV0QUc1QkFuRkZCRUFnQnlnQ0VDSUJRUkJxSUFNb0Fvd0RJQUVvQWdRUkFBQWdCQ2dDTkNBQUtBSTRJQkpySWdFMkFwQURJQWNnRWlBQkVJRURJUUVnQkNnQ05DQUJOZ0tNQXlBQlJRMElDMEVBSVFNZ0FCQVNEUW9nQUNBRlFmWUFRUUlRb0FGQkFFZ05DZ0pBSUFRb0FoQUVRQ0FBSUFSQkVHb1EzQVFNQVFzZ0FFRUdFQkFMSUFCQnZRRVFFQ0FBUWZZQUVCb2dBRUZBYXlJQktBSUFJZ01nQXk4QnZBRVFGeUFBUVE0UUVDQUVLQUlnQkVBZ0FFRVJFQkFnQUNBRVFTQnFFTndFSUFCQkpCQVFJQUVvQWdCQkFCQVhJQUJCRGhBUUN5QUpCRUFnQUVFUkVCQWdBRUc5QVJBUUlBQWdDUkFhSUFCQlFHc29BZ0FnQlM4QnZBRVFGd3NnQUJEekFTQUFFUE1CQWtBZ0N3UkFRUUFoQXlBQUlBVWdDMEVCRUtBQlFRQklEUXdnQUVHOUFSQVFJQUFnQ3hBYUlBQkJRR3NvQWdBZ0JTOEJ2QUVRRnd3QkN5QUpEUUFnQUVIQkFSQVFJQUJCUUdzb0FnQWdCU2dDbUFJZ0dHdEJBV29RT1F0QkFDQUNSUTBMR2tFQUlnTWdBQ0FGS0FLVUF5QUxRUllnQ3lBQ1FRRkhHMEVBRVBjQkRRc2FEQW9MSUFBZ0JFRVFhaUFQUVFSMGFoRGRCRUVBU0EwQkN5QUFJQTFCQW1wQkFDQVJJQUFvQWhSQkFDQUVRVUJyRVBnQkRRQWdERVVOQXlBRUtBSkFRUUUyQXJnQklBQkIwQUFRRUNBQVFiMEJFQkFnRFVFQ1JnMEJJQWNnQVJEbkJDSURSUTBBSUFBZ0F4QWFJQUFvQWdBZ0JTQURRUWdRNXdJaEJpQUhJQU1RRXlBR1FRQk9EUUlMSUFFaEF3d0hDeUFBSUFFUUdnc2dDaWdDQUNJRElBTXZBYndCRUJjTUFRc0NRQ0FCUlFSQUlBQkIxUUFRRUF3QkN5QUFRZFFBRUJBZ0FDQUJFQm9MSUFvb0FnQWdEVUVCYTBIL0FYRVFaQXNnRUFSQUlBQkJHeEFRQ3lBSElBRVFFeUFFUVFBMkFqd01BUXNMUVFBaEF3d0JDd3NnQnlBREVCTkJmd3NoQXlBSElBa1FFeUFISUFzUUV5QUZJQlU2QUc0Z0JFSFFBR29rQUNBREN5NEFJQUFnQVNnQ0FEWUNGQ0FBSUFFb0FnUTJBZ2dnQUNBQktBSU1OZ0k0SUFBZ0FTZ0NDRFlDTUNBQUVCSUxLd0FnQUVIL0FFMEVRQ0FBUVFOMlFmei8vLzhCY1VHUWdRSnFLQUlBSUFCMlFRRnhEd3NnQUJDNUF3c3VBUUYvQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlDTHdFR1FSSkhEUUFnQWtFZ2FnOExJQUJCRWhDR0EwRUFDMmNDQVg4QmZpTUFRUkJySWdNa0FBSitBa0FDUUNBQ1JRMEFJQUFwQWdRaUJFTC8vLy8vQjRNZ0FWY05BQ0FFUW9DQWdJQUlnMElBVWcwQkN5QUJRZ0Y4REFFTElBTWdBVDRDRENBQUlBTkJER29ReVFFYUlBTTBBZ3dMSVFFZ0EwRVFhaVFBSUFFTHpnRUJCSDhDUUNNQUlnVWdBQ2dDUUNnQ0VDZ0NlRWtFUUNBQVFZMGlRUUFRT2tGL0lRUU1BUXNnQUNnQ0JDRURRWDhoQkNBQUlBRVFyUVlOQUFOQUlBQW9BaGdpQWkwQUFFSDhBRWNFUUVFQUlRUU1BZ3NnQUNBQ1FRRnFOZ0lZSUFBb0FnUWhBaUFBSUFOQkJSRHdBUVJBSUFBUXFBSU1BZ3NnQUNnQ0FDQURha0VKT2dBQUlBQW9BZ0FnQTJvZ0FpQURhMEVGYWpZQUFTQUFRUWRCQUJDNEFTRUNJQUFnQVJDdEJnMEJJQUFvQWdBZ0Ftb2dBQ2dDQkNBQ2EwRUVhellBQUF3QUN3QUxJQVVrQUNBRUM1RUdBUVovSXdCQklHc2lCeVFBSUFjZ0F6WUNIQUovQWtBZ0FDZ0NBQ0FIUVFScVFTQVFQUTBBSUFGQjRBQkhJUXNEUUFKQUFrQUNRQUpBSUFNZ0FDZ0NQQ0lLVHcwQUFrQWdBeTBBQUNJR1FSOUxEUUFnQUNnQ1FFVUVRRUd2MndBaEJpQUNEUU1NQndzZ0MwVUVRQ0FHUVExSERRRkJDaUVHSUFOQkFXb2dBeUFETFFBQlFRcEdHeUVEREFFTElBWkJDbXNPQkFFQUFBRUFDeUFISUFOQkFXb2lDRFlDSEFKQUFrQUNRQUpBQWtBZ0FTQUdSd1JBSUFaQjNBQkdEUUVnQmtFa1J3MENRU1FoQmlBTERRa2dDQzBBQUVIN0FFY05DU0FEUVFKcUlRaEJKQ0VCQ3lBRVFZRi9OZ0lBSUFRZ0FUWUNHQ0FFSUFkQkJHb1FOamNERUNBRklBZzJBZ0JCQUF3TEMwRUJJUVlDUUFKQUFrQUNRQ0FJTFFBQUlnbEJDbXNPQkFJREF3RUFDeUFKUWR3QVJpQUpRU0pHY2lBSlFTZEdjZzBFSUFrTkFpQUlJQXBQRFFjZ0J5QURRUUpxTmdJY1FRQWhCZ3dLQzBFQ1FRRWdBeTBBQWtFS1Joc2hCZ3NnQnlBR0lBaHFJZ00yQWh3Z0FVSGdBRVlOQ1NBQUlBQW9BZ2hCQVdvMkFnZ01DUXNDUUFKQUFrQWdDY0FpQmtFd2EwSC9BWEZCQ1UwRVFDQUFLQUpBSWdwRkRRSWdBVUhnQUVjRVFDQUtMUUJ1UVFGeFJRMENDeUFCUWVBQVJpQUdRVEJHQkg4Z0F5MEFBa0V3YTBIL0FYRkJDazhOQzBFd0JTQUdDMEUzUzNJTkFrSEY3QUFoQmlBQ0RRa01EUXNnQmtFQVRnMEFJQWhCQmlBSEVGZ2lCa0dBZ01RQVR3MEdJQWNnQnlnQ0FDSUROZ0ljSUFaQmZuRkJxTUFBUmcwTERBb0xJQWRCSEdwQkFSRDVBU0lHUVg5SERRRUxRZXpWQUNFR0lBSU5CZ3dLQ3lBR1FRQk9EUWNnQnlBSEtBSWNRUUZxTmdJY0RBSUxJQWJBUVFCT0RRWWdBMEVHSUFjUVdDSUdRZi8vd3dCTERRSWdCeUFIS0FJQU5nSWNEQVlMSUFjZ0EwRUNhallDSEFzZ0NTRUdEQVFMUWJUd0FDRUdJQUlOQVF3RkMwR0oyd0FoQmlBQ1JRMEVDeUFBSUFaQkFCQVdEQU1MSUFjZ0EwRUNhallDSEVFQUlRWUxJQWRCQkdvZ0JoQzVBUTBCSUFjb0Fod2hBd3dBQ3dBTElBY29BZ1FvQWhBaUFFRVFhaUFIS0FJSUlBQW9BZ1FSQUFCQmZ3c2hCaUFIUVNCcUpBQWdCZ3VqQVFJRGZnTi9Jd0JCRUdzaUNTUUFJQVJDQUNBRVFnQlZHeUVJSUFWQkFFZ2hDZ05BQWtBZ0JpQUlVUVJBUVFBaEJRd0JDMEYvSVFVZ0FDQUJJQVpDZjRVZ0JId2dCaUFLR3lJSElBTjhJQWxCQ0dvUWhRRWlDMEVBU0EwQUlBSWdCM3doQndKQUlBc0VRQ0FBSUFFZ0J5QUpLUU1JRUlZQlFRQk9EUUVNQWdzZ0FDQUJJQWNRK2dGQkFFZ05BUXNnQmtJQmZDRUdEQUVMQ3lBSlFSQnFKQUFnQlF1a0FRSUZmd0YrSUFFb0FoQWlCQ0FCS0FJVVFRRnJJQUlRMXdOeFFRTjBJZ1pxUVFScUlRTWdBcWNoQlNBQ1FpQ0lwMEYxU1NFSEEzOGdBeWdDQUNJRElBUWdCbXBHQkVCQkFBOExJQU1wQXdnaUNFSWdpS2RCZFU4RVFDQUlweUlFSUFRb0FnQkJBV28yQWdBTElBZEZCRUFnQlNBRktBSUFRUUZxTmdJQUN5QUFJQWdnQWtFQ0VMd0JCSDhnQTBFWWF3VWdBMEVFYWlFRElBRW9BaEFoQkF3QkN3c0xrQUVDQW40QmZ5QUFJQUlwQXdBaUEwRUFFSk1CSWdWRkJFQkNnSUNBZ09BQUR3c2dBQ0FEUW9DQWdJQXdFT01CSWdOQ2dJQ0FnSENESWdSQ2dJQ0FnT0FBVVFSQUlBTVBDeUFDUVFocUlRSWdCRUtBZ0lDQU1GRUVRQ0FBUW9DQWdJQXdJQUFnQWlBRkx3RUdFUG9GRHdzZ0FDQURRUUVnQVNBQlFRRk1HMEVCYXlBQ0VOb0RJUVFnQUNBREVBOGdCQXN3QVFKL0FrQWdBQ0FCUVFBUWt3RWlBd1JBSUFNb0FpQW9BZ3dvQWlBdEFBUkZEUUVnQUJCckMwRi9JUUlMSUFJTGN3RUNmeU1BUVRCcklnSWtBQUovSUFHblFZQ0FnSUI0Y2lBQlF2Ly8vLzhIV0EwQUdpQUNJQUUzQXdBZ0FrRVFhaUlEUVJoQnl2UUFJQUlRVGhwQkFDQUFJQU1RWWlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBYUlBQW9BaEFnQWFkQkFSQ25BZ3NoQUNBQ1FUQnFKQUFnQUFzTkFDQUFJQUVnQWtFVEVOd0RDejhCQVg4Z0FrSWdpS2RCZFU4RVFDQUNweUlFSUFRb0FnQkJBV28yQWdBTElBQWdBaUFERVA4Q0lRSWdBQ0FCS0FKTUlBSkJBQkNEQlNBQUlBSVFEd3NNQUNBQUlBRWdBUkEvRUhJTGdnRUJBbjhqQUVFZ2F5SUZKQUFDUUNBQlFRcEhJQUpCQ1V0eVJRUkFJQUFnQWtFQ2RFR1FwUVJxTlFJQUVEQWhBZ3dCQ3lBQUtBSUFJUVlnQlVJQU53SVlJQVZDZ0lDQWdJQ0FnSUNBZnpjQ0VDQUZJQVkyQWd3Z0JVRU1haUlHSUFHdEVEQWdBQ0FHSUFJZ0F5QUVFS0lFY2lFQ0lBWVFHd3NnQlVFZ2FpUUFJQUlMbXdVQkEzOGdBVUVRYWlFRElBRW9BaFFoQWdOQUlBSWdBMFpGQkVBZ0FrRVlheUVFSUFJb0FnUWhBaUFBSUFRUS9RSU1BUXNMSUFBb0FoQWdBU2dDZ0FJZ0FTZ0NoQUlnQVNnQ29BSVE2d1VnQVVHQUFtb1E5Z0VnQUNnQ0VDSUNRUkJxSUFFb0Fzd0NJQUlvQWdRUkFBQWdBQ2dDRUNJQ1FSQnFJQUVvQXFRQ0lBSW9BZ1FSQUFBZ0FDZ0NFQ0lDUVJCcUlBRW9BdGdDSUFJb0FnUVJBQUJCQUNFQ0EwQWdBU2dDdEFJaEF5QUNJQUVvQXJnQ1RrVUVRQ0FBSUFNZ0FrRURkR29wQXdBUUR5QUNRUUZxSVFJTUFRc0xJQUFvQWhBaUFrRVFhaUFESUFJb0FnUVJBQUFnQUNBQktBSndFQk5CQUNFQ0EwQWdBU2dDZENFRElBSWdBU2dDZkU1RkJFQWdBQ0FESUFKQkJIUnFLQUlBRUJNZ0FrRUJhaUVDREFFTEN5QUFLQUlRSWdKQkVHb2dBeUFDS0FJRUVRQUFRUUFoQWdOQUlBRW9Bb0FCSVFNZ0FpQUJLQUtJQVU1RkJFQWdBQ0FESUFKQkJIUnFLQUlBRUJNZ0FrRUJhaUVDREFFTEN5QUFLQUlRSWdKQkVHb2dBeUFDS0FJRUVRQUFRUUFoQWdOQUlBRW9BdndCSVFNZ0FpQUJLQUwwQVU1RkJFQWdBQ0FESUFKQkJIUnFLQUlNRUJNZ0FrRUJhaUVDREFFTEN5QUFLQUlRSWdKQkVHb2dBeUFDS0FJRUVRQUFRUUFoQWdOQUlBRW9Bc2dDSVFNZ0FpQUJLQUxBQWs1RkJFQWdBQ0FESUFKQkEzUnFLQUlFRUJNZ0FrRUJhaUVDREFFTEN5QUFLQUlRSWdKQkVHb2dBeUFDS0FJRUVRQUFJQUVvQXN3QklnSWdBVUhRQVdwSEJFQWdBQ2dDRUNJRFFSQnFJQUlnQXlnQ0JCRUFBQXNnQUNBQktBTHNBaEFUSUFGQjlBSnFFUFlCSUFBb0FoQWlBa0VRYWlBQktBS01BeUFDS0FJRUVRQUFJQUVvQWdRRVFDQUJLQUlZSWdJZ0FTZ0NIQ0lETmdJRUlBTWdBallDQUNBQlFnQTNBaGdMSUFBb0FoQWlBRUVRYWlBQklBQW9BZ1FSQUFBTGdnRUJBbjhnQUNBQlFSQnFFTThGQWtBZ0FTZ0NJQ0lDQkVBZ0FTZ0NQQ0lEUlEwQkEwQWdBaUFEVDBVRVFDQUFJQUlwQXdBUUl5QUNRUWhxSVFJZ0FTZ0NQQ0VEREFFTEN5QUFRUkJxSUFFb0FpQWdBQ2dDQkJFQUFBc2dBQ0FCS1FNWUVDTWdBQ0FCS1FNQUVDTVBDMEdFaEFGQnJ2d0FRWW1VQVVIQzZ3QVFBQUFMYUFFQmZnSkFBa0FnQUJBMElnTkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUU1NQVFzZ0FDQURRY0FBSUFGQkJ4QVpRUUJJRFFBZ0FDQURRZWtBSUFKQkFFZXRRb0NBZ0lBUWhFRUhFQmxCQUU0TkFRc2dBQ0FERUE5Q2dJQ0FnT0FBSVFNTElBTUxqQUVCQW44Q1FBTkFJQUZDZ0lDQWdIQlVEUUVDUUFKQUFrQUNRQUpBQWtBZ0FhY2lBaThCQmlJRFFReHJEZ1VGQVFNSEFRQUxJQU5CTUVZTkFTQURRVFJyRGdVQUJnWUdBQVlMSUFJb0FpQW9BakFQQ3lBQ0tBSWdJZ0pGRFFRZ0FpMEFFVVVOQVNBQUVMWUNRUUFQQ3lBQ0tBSWdJUUlMSUFJcEF3QWhBUXdCQ3dzZ0FpZ0NJQ0VBQ3lBQUN5SUFJQUFnQWtFQmFoQXBJZ0FFUUNBQUlBRWdBaEFmSUFKcVFRQTZBQUFMSUFBTGpRTUNBMzRFZndKQUlBRW9BZ2dpQmtIKy8vLy9CMDRFUUVFQklRY2dBa0VCY1EwQlF2Ly8vLy8vLy8vLy93QWhBeUFHUWY3Ly8vOEhSdzBCSUFFMEFnUkMvLy8vLy8vLy8vLy9BSHdoQXd3QkN5QUdRUUJNQkVBTUFRc2dCa0UvVFFSQUlBRW9BaEFpQ1NBQktBSU1JZ0pCQW5ScVFRUnJLQUlBSVFoQ0FDQUdRU0JOQkg0Z0NFRWdJQVpyZHEwRklBSkJBazhFZmlBQ1FRSjBJQWxxUVFock5RSUFCVUlBQ3lBSXJVSWdob1JCd0FBZ0JtdXRpQXNpQTMwZ0F5QUJLQUlFR3lFRERBRUxJQUpCQVhGRkJFQWdBU2dDQkVVRVFFTC8vLy8vLy8vLy8vOEFJUU5CQVNFSERBSUxRb0NBZ0lDQWdJQ0FnSDhoQTBFQklRY2dCa0hBQUVjTkFTQUJLQUlRSUFFb0Fnd2lBVUVDZEdvaUFrRUVhelVDQUVJZ2hpRUVJQUZCQWs4RWZpQUNRUWhyTlFJQUJVSUFDeUFFaEVLQWdJQ0FnSUNBZ0lCL1VpRUhEQUVMUWdBZ0FTZ0NFQ0lJSUFFb0Fnd2lBaUFDUVFWMElBWnJJZ1lRYUswZ0NDQUNJQVpCSUdvUWFLMUNJSWFFSWdOOUlBTWdBU2dDQkJzaEF3c2dBQ0FETndNQUlBY0xNd0VCZnlBQUtBSUFLQUlRSWdGQkVHb2dBQ2dDQkNBQktBSUVFUUFBSUFCQkFEWUNEQ0FBUWdBM0FnUWdBRUYvTmdJVUMwWUFJQUpCQUV3RVFDQUFRUzhRTFE4TElBQWdBa0VBRU9vQklnQkZCRUJDZ0lDQWdPQUFEd3NnQUVFUWFpQUJJQUlRSHlBQ2FrRUFPZ0FBSUFDdFFvQ0FnSUNRZjRRTGJ3SUJmd0YrQWtBQ1FBSi9JQUpGQkVBZ0FDZ0NFQ0FCUVFBUXN3VU1BUXNnQVN3QUFFRTZhMEYyVHcwQklBQW9BaEFnQVNBQ0VMTUZDeUlERFFFTFFRQWhBeUFBSUFFZ0FoQ1RBaUlFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNnQ0VDQUVweEQ4QXlFREN5QURDeHdBSUFBZ0FDZ0NFQ2dDUkNBQlFSaHNhaWdDQkVITDlnQVFqd0VMU0FFQ2Z3SkFBMEFnQVVFS1JnMEJJQUZCQW5SQjRvQUNhaThCQUNBQVNnMEJJQUZCQVhRaEFpQUJRUUZxSVFFZ0FrRUJkRUhrZ0FKcUx3RUFJQUJNRFFBTFFRRVBDMEVBQzNRQkJIOUJBaUVDQWtBZ0FDZ0NDQ0lFUWYvLy8vOEhSZzBBSUFFb0FnZ2lCVUgvLy8vL0IwWU5BQ0FBS0FJRUlnTWdBU2dDQkVjRVFDQUVRWUNBZ0lCNFJnUkFRUUFoQWlBRlFZQ0FnSUI0UmcwQ0MwRUJJQU5CQVhSckR3dEJBQ0FBSUFFUTB3RWlBR3NnQUNBREd5RUNDeUFDQzRrQkFRUitJQUFRUGlJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0FVRUFJQUZCQUVvYnJTRUdBMEFnQXlBR1VRUkFJQVFQQ3lBQ0lBT25RUU4wYWlrREFDSUZRaUNJcDBGMVR3UkFJQVduSWdFZ0FTZ0NBRUVCYWpZQ0FBc2dBQ0FFSUFNZ0JVRUFFTklCSVFFZ0EwSUJmQ0VESUFGQkFFNE5BQXNnQUNBRUVBOExRb0NBZ0lEZ0FBdFBBUUYvSUFFZ0FqWUNEQ0FCSUFBMkFnQWdBVUVBTmdJVUlBRWdBellDRUNBQlFRQTJBZ2dnQVNBQUlBSWdBeERxQVNJQU5nSUVJQUFFZjBFQUJTQUJRWDgyQWhRZ0FVRUFOZ0lNUVg4TEM3d0JBUUYvSXdCQkVHc2lCU1FBSUFVZ0F6Y0RDQUpBSUFFRVFDQUJJQUVvQWdCQkFXbzJBZ0FnQUNBQnJVS0FnSUNBY0lRZ0FrRUJJQVZCQ0dvUUx5RUNJQUFnQlNrRENCQVBRWDhoQVNBQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FDQUNFQTlCQVNFQkRBRUxJQUFnQXhBUElBUkJnSUFCY1VVRVFFRUFJUUVnQkVHQWdBSnhSUTBCSUFBb0FoQW9Bb3dCSWdSRkRRRWdCQzBBS0VFQmNVVU5BUXNnQUVIL0drRUFFQlZCZnlFQkN5QUZRUkJxSkFBZ0FRdGhBZ0YvQVg0Q1FDQUJRUUJJRFFBQ1FBSkFBa0FnQUNnQ0VDZ0NPQ0FCUVFKMGFpZ0NBQ2tDQkNJRFFqNklwMEVCYXc0REF3SUFBUXRCQVNFQ0FrQWdBMElnaUtkQi8vLy8vd054RGdJREFBRUxRUUlQQ3hBQkFBdEJBU0VDQ3lBQ0M2Y0ZBZ2wvQW40akFFRWdheUlESkFBQ1FDQUJLUU5BSWd0Q2dJQ0FnSENEUW9DQWdJQXdVUVJBUW9DQWdJRGdBQ0VNSUFCQkN4QjJJZ3RDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FEUWdBM0F4Z2dBMElBTndNUUlBTkNBRGNEQ0NBQUlBTkJDR29nQVVFQUVLOEZJUVFnQUNnQ0VDSUNRUkJxSUFNb0FnZ2dBaWdDQkJFQUFBSkFBa0FnQkFSQUlBTW9BaFFoQmd3QkN5QUxweUVISUFNb0Fod2lDRUVBSUFoQkFFb2JJUWtnQXlnQ0ZDRUdRUUFoQkFKQUEwQWdCQ0FKUndSQUFrQUNRQUpBSUFZZ0JFRU1iR29pQWlnQ0NDSUZCRUFnQXlBQk5nSUFEQUVMQWtBZ0FDQURJQU5CQkdvZ0FTQUNLQUlBRVBRRElnVU9CQUFHQmdJR0N5QURLQUlFSVFVTElBVW9BZ3hCL1FCR0JFQWdBa0VDTmdJRUlBSWdBeWdDQUNnQ0VDQUZLQUlBUVFOMGFpZ0NCRFlDQ0F3Q0N5QUNRUUUyQWdRZ0JTZ0NCQ0lLQkVBZ0FpQUtOZ0lJREFJTElBSWdBeWdDQUNnQ1NDZ0NKQ0FGS0FJQVFRSjBhaWdDQURZQ0NBd0JDeUFDUVFBMkFnUUxJQVJCQVdvaEJBd0JDd3NnQmlBSVFReEJ3UUFnQUJDK0FrRUFJUVFEUUNBRUlBbEdEUU1DUUFKQUFrQWdCaUFFUVF4c2FpSUNLQUlFUVFGckRnSUFBUUlMSUFJb0FnZ2hCU0FBSUFjZ0FpZ0NBRUVtRUhvaUFrVU5CQ0FGSUFVb0FnQkJBV28yQWdBZ0FpQUZOZ0lBREFFTElBQWdDeUFDS0FJQVFRRWdBaWdDQ0VFR0VKVURRUUJJRFFNTElBUkJBV29oQkF3QUN3QUxJQUFnQlNBQklBSW9BZ0FROHdNTElBQW9BaEFpQVVFUWFpQUdJQUVvQWdRUkFBQWdBQ0FMRUE4TUFnc2dBQ2dDRUNJRVFSQnFJQVlnQkNnQ0JCRUFBQ0FBSUF0QjF3RWdBRUgrQUJBdFFRQVFHUm9nQnlBSExRQUZRZjRCY1RvQUJTQUJJQXMzQTBBTElBdENJSWluUVhWUEJFQWdDNmNpQUNBQUtBSUFRUUZxTmdJQUN5QUxJUXdMSUFOQklHb2tBQ0FNQzRrRUFnUitBbjhDUUFKQUlBRzlJZ1JDQVlZaUExQU5BQ0FCdlNFQ0lBQzlJZ1ZDTklpblFmOFBjU0lHUWY4UFJnMEFJQUpDLy8vLy8vLy8vLy8vQUlOQ2dZQ0FnSUNBZ1BqL0FGUU5BUXNnQUNBQm9pSUFJQUNqRHdzZ0F5QUZRZ0dHSWdKYUJFQWdBRVFBQUFBQUFBQUFBS0lnQUNBQ0lBTlJHdzhMSUFSQ05JaW5RZjhQY1NFSEFuNGdCa1VFUUVFQUlRWWdCVUlNaGlJQ1FnQlpCRUFEUUNBR1FRRnJJUVlnQWtJQmhpSUNRZ0JaRFFBTEN5QUZRUUVnQm11dGhnd0JDeUFGUXYvLy8vLy8vLzhIZzBLQWdJQ0FnSUNBQ0lRTElRSUNmaUFIUlFSQVFRQWhCeUFFUWd5R0lnTkNBRmtFUUFOQUlBZEJBV3NoQnlBRFFnR0dJZ05DQUZrTkFBc0xJQVJCQVNBSGE2MkdEQUVMSUFSQy8vLy8vLy8vL3dlRFFvQ0FnSUNBZ0lBSWhBc2hCQ0FHSUFkS0JFQURRQUpBSUFJZ0JIMGlBMElBVXcwQUlBTWlBa0lBVWcwQUlBQkVBQUFBQUFBQUFBQ2lEd3NnQWtJQmhpRUNJQVpCQVdzaUJpQUhTZzBBQ3lBSElRWUxBa0FnQWlBRWZTSURRZ0JURFFBZ0F5SUNRZ0JTRFFBZ0FFUUFBQUFBQUFBQUFLSVBDd0pBSUFKQy8vLy8vLy8vL3dkV0JFQWdBaUVEREFFTEEwQWdCa0VCYXlFR0lBSkNnSUNBZ0lDQWdBUlVJUWNnQWtJQmhpSURJUUlnQncwQUN3c2dCVUtBZ0lDQWdJQ0FnSUIvZ3lBRFFvQ0FnSUNBZ0lBSWZTQUdyVUkwaG9RZ0EwRUJJQVpycllnZ0JrRUFTaHVFdnd2b0R3TUhmQWgvQW41RUFBQUFBQUFBOEQ4aEF3SkFBa0FDUUNBQnZTSVJRaUNJcHlJUFFmLy8vLzhIY1NJSklCR25JZ3h5UlEwQUlBQzlJaEpDSUlpbklRb2dFcWNpRUVVZ0NrR0FnTUQvQTBaeERRQWdDa0gvLy8vL0IzRWlDMEdBZ01EL0Iwc2dDMEdBZ01EL0IwWWdFRUVBUjNGeUlBbEJnSURBL3dkTGNrVWdERVVnQ1VHQWdNRC9CMGR5Y1VVRVFDQUFJQUdnRHdzQ1FBSkFBa0FDUUFKQUFuOUJBQ0FTUWdCWkRRQWFRUUlnQ1VILy8vK1pCRXNOQUJwQkFDQUpRWUNBd1A4RFNRMEFHaUFKUVJSMklRMGdDVUdBZ0lDS0JFa05BVUVBSUF4QnN3Z2dEV3NpRG5ZaURTQU9kQ0FNUncwQUdrRUNJQTFCQVhGckN5RU9JQXdOQWlBSlFZQ0F3UDhIUncwQklBdEJnSURBL3dOcklCQnlSUTBGSUF0QmdJREEvd05KRFFNZ0FVUUFBQUFBQUFBQUFDQVJRZ0JaR3c4TElBd05BU0FKUVpNSUlBMXJJZ3gySWcwZ0RIUWdDVWNOQUVFQ0lBMUJBWEZySVE0TElBbEJnSURBL3dOR0JFQWdFVUlBV1FSQUlBQVBDMFFBQUFBQUFBRHdQeUFBb3c4TElBOUJnSUNBZ0FSR0JFQWdBQ0FBb2c4TElBOUJnSUNBL3dOSElCSkNBRk55RFFBZ0FKOFBDeUFBbVNFQ0lCQU5BUUpBSUFwQkFFZ0VRQ0FLUVlDQWdJQjRSaUFLUVlDQXdQOTdSbklnQ2tHQWdFQkdjZzBCREFNTElBcEZJQXBCZ0lEQS93ZEdjZzBBSUFwQmdJREEvd05IRFFJTFJBQUFBQUFBQVBBL0lBS2pJQUlnRVVJQVV4c2hBeUFTUWdCWkRRSWdEaUFMUVlDQXdQOERhM0pGQkVBZ0F5QURvU0lBSUFDakR3c2dBNW9nQXlBT1FRRkdHdzhMUkFBQUFBQUFBQUFBSUFHYUlCRkNBRmtiRHdzQ1FDQVNRZ0JaRFFBQ1FBSkFJQTRPQWdBQkFnc2dBQ0FBb1NJQUlBQ2pEd3RFQUFBQUFBQUE4TDhoQXdzQ2ZDQUpRWUdBZ0k4RVR3UkFJQWxCZ1lEQW53UlBCRUFnQzBILy83Ly9BMDBFUUVRQUFBQUFBQUR3ZjBRQUFBQUFBQUFBQUNBUlFnQlRHdzhMUkFBQUFBQUFBUEIvUkFBQUFBQUFBQUFBSUE5QkFFb2JEd3NnQzBIKy83Ly9BMDBFUUNBRFJKeDFBSWc4NURkK29rU2NkUUNJUE9RM2ZxSWdBMFJaOC9qQ0gyNmxBYUpFV2ZQNHdoOXVwUUdpSUJGQ0FGTWJEd3NnQzBHQmdNRC9BMDhFUUNBRFJKeDFBSWc4NURkK29rU2NkUUNJUE9RM2ZxSWdBMFJaOC9qQ0gyNmxBYUpFV2ZQNHdoOXVwUUdpSUE5QkFFb2JEd3NnQWtRQUFBQUFBQUR3djZBaUFFUkUzMTM0QzY1VVBxSWdBQ0FBb2tRQUFBQUFBQURnUHlBQUlBQkVBQUFBQUFBQTBMK2lSRlZWVlZWVlZkVS9vS0tob2tUK2dpdGxSeFgzdjZLZ0lnSWdBaUFBUkFBQUFHQkhGZmMvb2lJQ29MMUNnSUNBZ0hDRHZ5SUFJQUtob1F3QkN5QUNSQUFBQUFBQUFFQkRvaUlBSUFJZ0MwR0FnTUFBU1NJSkd5RUNJQUM5UWlDSXB5QUxJQWtiSWd4Qi8vOC9jU0lLUVlDQXdQOERjaUVMSUF4QkZIVkJ6SGRCZ1hnZ0NSdHFJUXhCQUNFSkFrQWdDa0dQc1E1SkRRQWdDa0g2N0M1SkJFQkJBU0VKREFFTElBcEJnSUNBL3dOeUlRc2dERUVCYWlFTUN5QUpRUU4wSWdwQmdCbHFLd01BSUFLOVF2Ly8vLzhQZ3lBTHJVSWdob1MvSWdRZ0NrSHdHR29yQXdBaUJhRWlCa1FBQUFBQUFBRHdQeUFGSUFTZ295SUhvaUlDdlVLQWdJQ0FjSU8vSWdBZ0FDQUFvaUlJUkFBQUFBQUFBQWhBb0NBSElBWWdBQ0FKUVJKMElBdEJBWFpxUVlDQW9JQUNhcTFDSUlhL0lnYWlvU0FBSUFRZ0JpQUZvYUdpb2FJaUJDQUNJQUNnb2lBQ0lBS2lJZ0FnQUtJZ0FDQUFJQUFnQUNBQVJPOU9SVW9vZnNvL29rUmwyOG1UU29iTlA2Q2lSQUZCSGFsZ2RORS9vS0pFVFNhUFVWVlYxVCtnb2tUL3EyL2J0bTNiUDZDaVJBTXpNek16TStNL29LS2dJZ1dndlVLQWdJQ0FjSU8vSWdDaUlnWWdCQ0FBb2lBQ0lBVWdBRVFBQUFBQUFBQUl3S0FnQ0tHaG9xQWlBcUM5UW9DQWdJQndnNzhpQUVUMUFWc1U0QzgrdnFJZ0FpQUFJQWFob1VUOUF6cmNDY2Z1UDZLZ29DSUNJQXBCa0JscUt3TUFJZ1FnQWlBQVJBQUFBT0FKeCs0L29pSUNvS0FnRExjaUJhQzlRb0NBZ0lCd2c3OGlBQ0FGb1NBRW9TQUNvYUVMSVFJZ0FTQVJRb0NBZ0lCd2c3OGlCS0VnQUtJZ0FpQUJvcUFpQWlBQUlBU2lJZ0dnSWdDOUloR25JUWtDUUNBUlFpQ0lweUlLUVlDQXdJUUVUZ1JBSUFwQmdJREFoQVJySUFseURRTWdBa1QrZ2l0bFJ4V1hQS0FnQUNBQm9XUkZEUUVNQXdzZ0NrR0ErUC8vQjNGQmdKakRoQVJKRFFBZ0NrR0E2THo3QTJvZ0NYSU5BeUFDSUFBZ0FhRmxSUTBBREFNTFFRQWhDU0FEQW53Z0NrSC8vLy8vQjNFaUMwR0JnSUQvQTA4RWZrRUFRWUNBd0FBZ0MwRVVka0grQjJ0MklBcHFJZ3BCLy84L2NVR0FnTUFBY2tHVENDQUtRUlIyUWY4UGNTSUxhM1lpQ1dzZ0NTQVJRZ0JUR3lFSklBSWdBVUdBZ0VBZ0MwSC9CMnQxSUFweHJVSWdocitoSWdHZ3ZRVWdFUXRDZ0lDQWdIQ0R2eUlBUkFBQUFBQkRMdVkvb2lJRElBSWdBQ0FCb2FGRTd6bjYva0l1NWoraUlBQkVPV3lvREdGY0lMNmlvQ0lDb0NJQUlBQWdBQ0FBSUFDaUlnRWdBU0FCSUFFZ0FVVFFwTDV5YVRkbVBxSkU4V3ZTeFVHOXU3Nmdva1FzM2lXdmFsWVJQNkNpUkpPOXZoWnN3V2Evb0tKRVBsVlZWVlZWeFQrZ29xRWlBYUlnQVVRQUFBQUFBQUFBd0tDaklBQWdBaUFBSUFPaG9TSUFvaUFBb0tHaFJBQUFBQUFBQVBBL29DSUF2U0lSUWlDSXB5QUpRUlIwYWlJS1FmLy9QMHdFUUNBQUlBa1EyZ0VNQVFzZ0VVTC8vLy8vRDRNZ0NxMUNJSWFFdnd1aUlRTUxJQU1QQ3lBRFJKeDFBSWc4NURkK29rU2NkUUNJUE9RM2ZxSVBDeUFEUkZueitNSWZicVVCb2tSWjgvakNIMjZsQWFJTEVRQWdBQ0FCSUFJZ0F5QUVRUUlRaWdRTFF3QUNmMEVBSUFJb0FnQW9BZ0JCR25ZZ0EwWU5BQnBCZnlBQUlBRWdBaERVQVEwQUdpQUNLQUlBSWdBZ0FDZ0NBRUgvLy84ZmNTQURRUnAwY2pZQ0FFRUFDd3U4QVFFRWYwRi9JUUlDUUNBQUlBRkJBQkRVQVEwQUlBRW9BaWdpQkNBQktBSVFJZ01vQWlCcUlnVWdBeWdDSEVzRVFDQUFJQUZCRUdvZ0FTQUZFTHdGRFFFTElBRW9BaVFoQTBFQUlRSURRQ0FDSUFSR1JRUkFJQUFnQVNBQ1FZQ0FnSUI0Y2tFSEVIb2dBeWtEQURjREFDQUNRUUZxSVFJZ0EwRUlhaUVEREFFTEN5QUFLQUlRSWdCQkVHb2dBU2dDSkNBQUtBSUVFUUFBUVFBaEFpQUJRUUEyQWlnZ0FVSUFOd01nSUFFZ0FTMEFCVUgzQVhFNkFBVUxJQUlMZEFFRGZ3SkFBa0FnQUVFQmNRMEFJQUZCZ1FKeFFZRUNSaUFCUVlBSWNVRUFJQUFnQVhOQkJIRWJjZzBCSUFGQmdQUUFjVVVOQUNBQVFUQnhJZ05CRUVZZ0FVR0FNSEVpQkVFQVIzTU5BU0FBUVFKeElBRkJnZ1J4UVlJRVIzSWdBMEVRUm5JTkFDQUVSUTBCQzBFQklRSUxJQUlMUFFFQmZ5QUJJQUFvQXRRQklBRW9BaFJCSUNBQUtBTElBV3QyUVFKMGFpSUNLQUlBTmdJb0lBSWdBVFlDQUNBQUlBQW9BdEFCUVFGcU5nTFFBUXZKQVFFRGZ3SkFJQUZDZ0lDQWdIQmFCRUFnQWFjaUJ5Z0NFQ0lHUVRCcUlRZ2dCaUFHS0FJWUlBSnhRWDl6UVFKMGFpZ0NBQ0VHQWtBRFFDQUdSUTBCSUFJZ0NDQUdRUUZyUVFOMGFpSUdLQUlFUndSQUlBWW9BZ0JCLy8vL0gzRWhCZ3dCQ3dzUUFRQUxJQUFnQnlBQ0lBVkJCM0ZCTUhJUWVpSUNSUVJBUVg4UEMwRUJJUVlnQUNBQUtBSUFRUUZxTmdJQUlBSWdBRFlDQUNBQVFRTnhEUUVnQWlBRU5nSUVJQUlnQUNBRGNqWUNBQXNnQmc4TFFjdVBBVUd1L0FCQjNzZ0FRZUFiRUFBQUN5RUFJQUFnQVVFd0lBT3RRUUVRR1JvZ0FDQUJRVFlnQUNBQ0VDMUJBUkFaR2d2RkJ3TUNmZ1YvQW53akFFRVFheUlHSkFCQkJ5QUJRUWhySWdncEF3QWlCRUlnaUtjaUJTQUZRUWRyUVc1Skd5RUZBbjhDUUFKQVFRY2dBVUVRYXlJSEtRTUFJZ05DSUlpbklnRWdBVUVIYTBGdVNSc2lBVUYvUmlBRlFYNXhRUUpIY1VVZ0FVRitjVUVDUmlBRlFYOUhjbkVOQUNBQUlBWkJDR29nQXlBRUlBSkJBRUVCRUlVQ0lnRkZEUUFnQUNBREVBOGdBQ0FFRUE4Z0FVRUFTQTBCSUFjZ0Jpa0RDRGNEQUVFQURBSUxBa0FnQUNBRFFRRVFtZ0VpQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFRaEF3d0JDeUFBSUFSQkFSQ2FBU0lFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFDUUVFSElBTkNJSWluSWdFZ0FVRUhhMEZ1U1JzaUJVRjVSMEVISUFSQ0lJaW5JZ0VnQVVFSGEwRnVTUnNpQVVGNVIzSkZCRUFnQTZjZ0JLY1Fnd0loQVFKL0FrQUNRQUpBQWtBZ0FrR2pBV3NPQXdBQkFnTUxJQUZCSDNZTUF3c2dBVUVBVEF3Q0N5QUJRUUJLREFFTElBRkJBRTRMSVFFZ0FDQURFQThnQUNBRUVBOE1BUXNDUUVFQklBVjBRWWNCY1VVZ0JVRUhTM0lnQVVFSFMzSkJBVUVCSUFGMFFZY0JjUnRGRFFBQ1FBSkFJQVZCZGtZZ0FVRjVSbkVnQVVGMlJpQUZRWGxHY1hKRkRRQWdBQ2dDRUNnQ2pBRWlDUVJBSUFrdEFDaEJCSEVOQVFzQ1FDQUZRWGxHQkVBZ0FDQURFTHdDSWdOQ2dJQ0FnSENEUW9DQWdJRGdmbElOQVFzZ0FVRjVSdzBDSUFBZ0JCQzhBaUlFUW9DQWdJQndnMEtBZ0lDQTRINVJEUUlMSUFBZ0F4QVBJQUFnQkJBUFFRQWhBUXdEQ3lBQUlBTVFiQ0lEUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQkNFRERBUUxJQUFnQkJCc0lnUkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF3c0NRRUVISUFOQ0lJaW5JZ0VnQVVFSGEwRnVTUnNpQlVGMVJ3UkFRUWNnQkVJZ2lLY2lBU0FCUVFkclFXNUpHeUlCUVhWSERRRUxJQUFnQWlBRElBUWdBQ2dDRUNnQzNBSVJIQUFpQVVFQVNBMEVEQUlMSUFWQmQwY2dBVUYzUjNGRkJFQWdBQ0FDSUFNZ0JDQUFLQUlRS0FMQUFoRWNBQ0lCUVFCSURRUU1BZ3NnQlVGMlJ5QUJRWFpIY1EwQUlBQWdBaUFESUFRZ0FDZ0NFQ2dDcEFJUkhBQWlBVUVBVGcwQkRBTUxJQVJDZ0lDQWdNQ0JnUHovQUh5L0lBU250eUFCUVFkR0d5RUtJQU5DZ0lDQWdNQ0JnUHovQUh5L0lBT250eUFGUVFkR0d5RUxBa0FDUUFKQUFrQWdBa0dqQVdzT0F3QUJBZ01MSUFvZ0MyUWhBUXdEQ3lBS0lBdG1JUUVNQWdzZ0NpQUxZeUVCREFFTElBb2dDMlVoQVFzZ0J5QUJRUUJIclVLQWdJQ0FFSVEzQXdCQkFBd0NDeUFBSUFNUUR3c2dCMEtBZ0lDQU1EY0RBQ0FJUW9DQWdJQXdOd01BUVg4TElRQWdCa0VRYWlRQUlBQUxCQUJCQUF0dEFnSitBbjlCZnlFRkFrQWdBQ0FCUVFocklnWXBBd0FpQkNBQ0VPY0JJZ05DZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFRUUR5QUdJQU0zQXdBZ0FDQURRZW9BSUFOQkFCQVVJZ05DZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FCSUFNM0F3QkJBQ0VGQ3lBRkM3RUJBZ04vQVg0Z0FDZ0NFQ0VGSUFBZ0FrRURkRUVZYWhBcElnUUVRQ0FFSUFJMkFoQWdCQ0FCTmdJTUlBUWdBRFlDQ0VFQUlRQWdBa0VBSUFKQkFFb2JJUUVEUUNBQUlBRkhCRUFnQXlBQVFRTjBJZ0pxS1FNQUlnZENJSWluUVhWUEJFQWdCNmNpQmlBR0tBSUFRUUZxTmdJQUN5QUNJQVJxSUFjM0F4Z2dBRUVCYWlFQURBRUxDeUFGS0FLZ0FTSUFJQVEyQWdRZ0JDQUZRYUFCYWpZQ0JDQUVJQUEyQWdBZ0JTQUVOZ0tnQVFzTFBBRUJmd05BSUFJZ0EwWkZCRUFnQUNBQklBTkJBM1JxS1FNQUVBOGdBMEVCYWlFRERBRUxDeUFBS0FJUUlnQkJFR29nQVNBQUtBSUVFUUFBQzRVQkFRSi9Jd0JCRUdzaUJTUUFBa0FnQWtLQWdJQ0FjSU5DZ0lDQWdKQi9VZ1JBSUFKQ0lJaW5RWFZKRFFFZ0FxY2lBQ0FBS0FJQVFRRnFOZ0lBREFFTElBQWdCVUVNYWlBQ0VPVUJJZ1pGQkVCQ2dJQ0FnT0FBSVFJTUFRc2dBQ0FCSUFZZ0JTZ0NERUhTaUFFZ0F5QUVFTW9GSVFJZ0FDQUdFRlFMSUFWQkVHb2tBQ0FDQzd3QkFnTitBWDhqQUVFUWF5SUNKQUJDZ0lDQWdPQUFJUVVDUUNBQUlBRVFZQTBBSUFNcEF3QWhCZ0pBQWtBZ0F5a0RDQ0lIUWlDSXB5SURRUU5IQkVBZ0JFRUNSZzBDSUFOQkFrWU5BUXdDQ3lBRVFRSkdEUUVMSUFBZ0FTQUdRUUJCQUJBaElRVU1BUXNnQUNBQ1FReHFJQWNRaVFRaUEwVU5BQ0FDS0FJTUlRZ0NmaUFFUVFGeEJFQWdBQ0FCSUFZZ0NDQURFSkFEREFFTElBQWdBU0FHSUFnZ0F4QWhDeUVGSUFBZ0F5QUlFSnNEQ3lBQ1FSQnFKQUFnQlFzOUFnRi9BbjRnQUNBQkVNMEZJZ05DZ0lDQWdIQ0RJZ1JDZ0lDQWdEQlNCSDhnQkVLQWdJQ0E0QUJTQkVBZ0FDQURFQTlCQVE4TFFYOEZRUUFMQzA0Q0FYOEJmaU1BUVJCcklnSWtBQUorSUFGQi93Rk5CRUFnQWlBQk9nQVBJQUFnQWtFUGFrRUJFSVFEREFFTElBSWdBVHNCRENBQUlBSkJER3BCQVJEdUF3c2hBeUFDUVJCcUpBQWdBd3ROQVFGL0l3QkJFR3NpQXlRQUlBTWdBVGtEQ0NBRElBSTJBZ0FnQUVHQUFVR1Yzd0FnQXhCT0lnQkJnQUZPQkVCQm9PQUFRYTc4QUVHRDJRQkJpWXdCRUFBQUN5QURRUkJxSkFBZ0FBdVlBZ0VDZndKL0lBRkIvd0JOQkVBZ0FDQUJPZ0FBSUFCQkFXb01BUXNDUUNBQlFmOFBUUVJBSUFBZ0FVRUdka0hBQVhJNkFBQWdBQ0VDREFFTEFuOGdBVUgvL3dOTkJFQWdBQ0FCUVF4MlFlQUJjam9BQUNBQVFRRnFEQUVMQWtBZ0FVSC8vLzhBVFFSQUlBQWdBVUVTZGtId0FYSTZBQUFnQUNFQ0RBRUxBbjhnQVVILy8vOGZUUVJBSUFGQkdIWkJlSEloQXlBQVFRRnFEQUVMSUFBZ0FVRVlka0UvY1VHQUFYSTZBQUVnQVVFZWRrRjhjaUVESUFCQkFtb0xJUUlnQUNBRE9nQUFJQUlnQVVFU2RrRS9jVUdBQVhJNkFBQUxJQUlnQVVFTWRrRS9jVUdBQVhJNkFBRWdBa0VDYWdzaUFpQUJRUVoyUVQ5eFFZQUJjam9BQUFzZ0FpQUJRVDl4UVlBQmNqb0FBU0FDUVFKcUN5QUFhd3VJQWdJRmZ3RitJQUVvQWd3aEFnSkFBa0FDUUNBQktRSUVJZ2RDZ0lDQWdJQ0FnSUJBV2dSQUlBQW9BamdoQkF3QkN3SkFJQUVnQUNnQ09DSUVJQUFvQWpRZ0IwSWdpS2NnQUNnQ0pFRUJhM0ZCQW5ScUlnTW9BZ0FpQlVFQ2RHb29BZ0FpQmtZRVFDQURJQUkyQWdBTUFRc0RRQ0FHSVFNZ0JVVU5BeUFFSUFNb0Fnd2lCVUVDZEdvb0FnQWlCaUFCUncwQUN5QURJQUkyQWd3TElBVWhBZ3NnQkNBQ1FRSjBhaUFBS0FJOFFRRjBRUUZ5TmdJQUlBQWdBallDUENBQVFSQnFJQUVnQUNnQ0JCRUFBQ0FBSUFBb0FpZ2lBRUVCYXpZQ0tDQUFRUUJNRFFFUEMwR1prQUZCcnZ3QVFkZ1dRY3d2RUFBQUMwR1NqZ0ZCcnZ3QVFld1dRY3d2RUFBQUN5a0JBbjhDUUNBQVFvQ0FnSUJ3VkEwQUlBQ25JZ0l2QVFZUTdnRkZEUUFnQWlnQ0lDRUJDeUFCQzRvREFRTi9JQUFnQUNnQ0FDSUJRUUZySWdJMkFnQUNRQ0FCUVFGS0RRQWdBa1VFUUNBQUtBSVFJUUpCQUNFQklBQkJBQkNQQkNBQUlBQXBBOEFCRUE4Z0FDQUFLUVBJQVJBUElBQWdBQ2tEc0FFUUR5QUFJQUFwQTdnQkVBOGdBQ0FBS1FPb0FSQVBBMEFnQVVFSVJnUkFRUUFoQVFOQUlBQW9BaWdoQXlBQklBSW9Ba0JPUlFSQUlBQWdBeUFCUVFOMGFpa0RBQkFQSUFGQkFXb2hBUXdCQ3dzZ0FrRVFhaUFESUFJb0FnUVJBQUFnQUNBQUtRT1lBUkFQSUFBZ0FDa0RvQUVRRHlBQUlBQXBBMUFRRHlBQUlBQXBBMEFRRHlBQUlBQXBBMGdRRHlBQUlBQXBBemdRRHlBQUlBQXBBekFRRHlBQUtBSWtJZ0VFUUNBQUtBSVFJQUVRa1FJTElBQW9BaFFpQVNBQUtBSVlJZ0kyQWdRZ0FpQUJOZ0lBSUFCQ0FEY0NGQ0FBS0FJSUlnRWdBQ2dDRENJQ05nSUVJQUlnQVRZQ0FDQUFRZ0EzQWdnZ0FDZ0NFQ0lCUVJCcUlBQWdBU2dDQkJFQUFBd0RCU0FBSUFBZ0FVRURkR29wQTFnUUR5QUJRUUZxSVFFTUFRc0FDd0FMUWZPT0FVR3UvQUJCNkJGQnJTVVFBQUFMQy9ZQkFRTi9Ba0FnQUVVRVFFR2d5UVFvQWdBRVFFR2d5UVFvQWdBUXBRTWhBUXRCaU1nRUtBSUFCRUJCaU1nRUtBSUFFS1VESUFGeUlRRUxRYVRVQkNnQ0FDSUFSUTBCQTBBZ0FDZ0NUQm9nQUNnQ0ZDQUFLQUljUndSQUlBQVFwUU1nQVhJaEFRc2dBQ2dDT0NJQURRQUxEQUVMSUFBb0FreEJBRTRoQWdKQUFrQWdBQ2dDRkNBQUtBSWNSZzBBSUFCQkFFRUFJQUFvQWlRUkFRQWFJQUFvQWhRTkFFRi9JUUVnQWcwQkRBSUxJQUFvQWdRaUFTQUFLQUlJSWdOSEJFQWdBQ0FCSUFOcnJFRUJJQUFvQWlnUkVBQWFDMEVBSVFFZ0FFRUFOZ0ljSUFCQ0FEY0RFQ0FBUWdBM0FnUWdBa1VOQVFzTElBRUw3d0VCQW44Q2Z3SkFJQUZCL3dGeElnTUVRQ0FBUVFOeEJFQURRQ0FBTFFBQUlnSkZJQUlnQVVIL0FYRkdjZzBESUFCQkFXb2lBRUVEY1EwQUN3c0NRQ0FBS0FJQUlnSkJmM01nQWtHQmdvUUlhM0ZCZ0lHQ2hIaHhEUUFnQTBHQmdvUUliQ0VEQTBBZ0FpQURjeUlDUVg5eklBSkJnWUtFQ0d0eFFZQ0Jnb1I0Y1EwQklBQW9BZ1FoQWlBQVFRUnFJUUFnQWtHQmdvUUlheUFDUVg5emNVR0FnWUtFZUhGRkRRQUxDd05BSUFBaUFpMEFBQ0lEQkVBZ0FrRUJhaUVBSUFNZ0FVSC9BWEZIRFFFTEN5QUNEQUlMSUFBUVB5QUFhZ3dCQ3lBQUN5SUFRUUFnQUMwQUFDQUJRZjhCY1VZYkM5UURBd0ovQkh3QmZpQUF2U0lIUWlDSXB5RUJBa0FDZkFKOEFrQWdBVUg1aE9yK0Ewc2dCMElBV1hGRkJFQWdBVUdBZ01EL2UwOEVRRVFBQUFBQUFBRHcveUFBUkFBQUFBQUFBUEMvWVEwRUdpQUFJQUNoUkFBQUFBQUFBQUFBb3c4TElBRkJBWFJCZ0lDQXlnZEpEUVFnQVVIRi9jcitlMDhOQVVRQUFBQUFBQUFBQUF3Q0N5QUJRZi8vdi84SFN3MERDeUFBUkFBQUFBQUFBUEEvb0NJRHZTSUhRaUNJcDBIaXZpVnFJZ0ZCRkhaQi93ZHJJUUlnQUNBRG9VUUFBQUFBQUFEd1A2QWdBQ0FEUkFBQUFBQUFBUEMvb0tFZ0FVSC8vNytBQkVzYklBT2pSQUFBQUFBQUFBQUFJQUZCLy8rL21nUk5HeUVGSUFkQy8vLy8vdytESUFGQi8vOC9jVUdld1pyL0EycXRRaUNHaEw5RUFBQUFBQUFBOEwrZ0lRQWdBcmNMSWdORUFBRGcva0l1NWoraUlBQWdBQ0FBUkFBQUFBQUFBQUJBb0tNaUJDQUFJQUJFQUFBQUFBQUE0RCtpb2lJR0lBUWdCS0lpQkNBRW9pSUFJQUFnQUVTZnhualFDWnJEUDZKRXIzaU9IY1Z4ekQrZ29rUUUrcGVabVpuWlA2Q2lJQVFnQUNBQUlBQkVSRkkrM3hMeHdqK2lSTjREeTVaa1JzYy9vS0pFV1pNaWxDUkowaitnb2tTVFZWVlZWVlhsUDZDaW9LQ2lJQU5FZGp4NU5lODU2ajJpSUFXZ29DQUdvYUNnQ3c4TElBQUxPUUVDZnlBQlFRQWdBVUVBU2hzaEFRTkFJQUVnQWtZRVFFRUFEd3NnQWtFQ2RDRURJQUpCQVdvaEFpQUFJQU5xS0FJQVJRMEFDMEVCQ3o4QkFuOERRQ0FCUlNBQ0lBTk5ja1VFUUNBQUlBTkJBblJxSWdRZ0FTQUVLQUlBSWdGcUlnUTJBZ0FnQVNBRVN5RUJJQU5CQVdvaEF3d0JDd3NnQVF1Q0J3RU1mMEVEUVlDQWdJQUNRUUZCSENBQ1FRVjJRVDl4SWdWcmRDQUZRVDlHR3lJT2F5RVBBa0FDUUFKQUFuOGdBa0VRY1FSQVFmLy8vLzhESUFGQi8vLy8vd05HRFFFYUlBQW9BZ2dnQVdvTUFRc2dBU0FBS0FJSUlnVWdEMDROQUJvZ0FTQUNRUWh4UlEwQUdpQUJRZi8vLy84RFJnMEJJQTVCQTJzZ0FXb2dCV29MSVFZZ0EwRUZkQ0VMQWtBQ1FDQUNRUWR4SWd4QkJrWUVRQ0FBS0FJUUlnY2dBeUFMSUFaQmYzTnFFSmtDSVFVTUFRc0NmeUFMUVg4Z0JpQUdRUUJJRzJ0QkFtc2lDRUVBU0FSQUlBQW9BaEFoQjBFQURBRUxRUUVoQ1NBQUtBSVFJZ2NnQ0VFRmRpSUZRUUowYWlnQ0FFRi9RWDRnQ0hSQmYzTWdDRUVmY1VFZlJodHhSUVJBQTBBZ0JVRUFTaUVKUVFBZ0JVRUFUQTBDR2lBSElBVkJBV3NpQlVFQ2RHb29BZ0JGRFFBTEMwRUJDeUFISUFNZ0N5QUdRWDl6YWhDWkFpSUljaUVLUVFBaEJRSkFBa0FDUUFKQUFrQUNRQ0FNRGdjQUJRUUVBZ0VDQXdzZ0NTQUlJZ1ZGY2cwRUlBY2dBeUFMSUFackVKa0NJUVVNQkF0QkFTRUZJQW9OQkNBR1FRQktEUWNNQ0FzZ0NDRUZJQW9OQXd3RUN4QUJBQXNnQ2tFQUlBQW9BZ1FnREVFQ1JrWWJJUVVMSUFwRkRRRUxJQVJCRUhJaEJBc2dCa0VBVEFSQUlBVkZEUU1nQUVFQkVFRWFJQUFvQWhCQmdJQ0FnSGcyQWdBZ0FDQUFLQUlJSUFaclFRRnFOZ0lJSUFSQkdISVBDeUFGUlEwQklBc2dCbXNpQlVFRmRTSUlJQU1nQXlBSVNSc2hERUVCSVFwQkFTQUZkQ0VKSUFnaEJRTkFJQVVnREVZRVFDQURJUVVEUUNBRlFRRnJJZ1VnQ0VoRkJFQWdCeUFGUVFKMGFpSUpJQXBCSDNRZ0NTZ0NBQ0lLUVFGMmNqWUNBQXdCQ3dzZ0FDQUFLQUlJUVFGcU5nSUlEQU1MSUFjZ0JVRUNkR29pRFNBTktBSUFJZzBnQ1dvaUVEWUNBRUVCSVFrZ0JVRUJhaUVGSUEwZ0VFc05BQXNNQVF0QjhJVUJRZFQ4QUVINUEwRzE4Z0FRQUFBTElBOGdBQ2dDQ0NJRlNnUkFJQUpCQ0hGRkRRRWdCRUVCZGtFSWNTQUVjaUVFQ3lBRklBNUtCRUFnQUNBQUtBSUVJQUVnQWhDckJBOExRUUFoQlFKQUlBc2dCbXNpQVVFQVNBMEFJQUZCQlhVaEJTQUJRUjl4SWdGRkRRQWdCeUFGUVFKMGFpSUNJQUlvQWdCQmYwRWdJQUZyZEVGL2N5QUJkSEUyQWdBTEEwQWdCU0lCUVFGcUlRVWdCeUFCUVFKMGFpSUNLQUlBUlEwQUN5QUJRUUJLQkVBZ0J5QUNJQU1nQVdzaUEwRUNkQkNjQVFzZ0FDQURFRUVhSUFRUEN5QUFJQUFvQWdRUWlRRWdCRUVZY2dzckFDQUFRWUFCVHdSL0lBQkJ6d0ZOQkVBZ0FFR0FCV29QQ3lBQVFRRjBRZjdHQTJvdkFRQUZJQUFMQzRzQ0FRTi9Jd0JCRUdzaUJDUUFBa0FnQkVFTWFpQUFJQUlnQXhDa0JpSUNRUUJJRFFBZ0FTQUNhaUVESUFRb0Fnd2hBUU5BSUFOQkFXb2hBZ0pBSUFNdEFBQWlCVUUvVFFSQUlBVkJBM1lnQVdwQkFXb2lBU0FBU3cwRElBUWdCVUVIY1NBQmFrRUJhaUlCTmdJTUlBWkJBWE1oQmd3QkN5QUZ3RUVBU0FSQUlBUWdBU0FGYWtIL0FHc2lBVFlDREF3QkN5QUNMUUFBSVFJZ0JVSGZBRTBFUUNBRUlBVkJDSFFnQW5JZ0FXcEIvLzhBYXlJQk5nSU1JQU5CQW1vaEFnd0JDeUFFSUFNdEFBSWdCVUVRZENBQ1FRaDBjbklnQVdwQi8vLy9BbXNpQVRZQ0RDQURRUU5xSVFJTElBQWdBVWtOQVNBR1FRRnpJUVlnQWlFRERBQUxBQXNnQkVFUWFpUUFJQVlMdlFJQkIzOENRQ0FCUlEwQUEwQWdBa0VEUmdSQUlBRkJBWEVpQlVVZ0FVRUdjVVZ5SVFjRFFDQUVRZWtDUmcwREFrQUNRQ0FESUFSQkFuUkJrSUlDYWlnQ0FDSUNRUVIyUVE5eElnWjJRUUZ4UlEwQUlBSkJEM1loQVNBQ1FRaDJRZjhBY1NFSUFrQUNRQUpBSUFaQkJHc09BZ0FCQWdzZ0IwVU5BU0FCSUFWcUlRWkJBQ0VDQTBBZ0FpQUlUdzBESUFJZ0Jtb2hBU0FDUVFKcUlRSWdBQ0FCSUFGQkFXb1Fma1VOQUFzTUF3c2dCMFVOQUNBQlFRRnFJUUlnQlVVRVFDQUFJQUVnQWhCK0RRTUxJQUFnQWlBQlFRSnFJZ0lRZmtVRVFDQUZSUTBDSUFBZ0FpQUJRUU5xRUg1RkRRSUxRWDhQQ3lBQUlBRWdBU0FJYWhCK0RRRUxJQVJCQVdvaEJBd0JDd3RCZnc4RklBRWdBblpCQVhFRVFDQUNRUUowUWJEK0Eyb29BZ0FnQTNJaEF3c2dBa0VCYWlFQ0RBRUxBQXNBQzBFQUM3QUNBZ04vQVg0akFFRVFheUlGSkFBQ1FDQUFJQUZCQWhCbElnZENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFBSkFBa0FnQWtFQlJ3MEFJQU1wQXdBaUFVSWdpS2NpQkVFQUlBUkJDMnBCRWtrYkRRQWdBQ0FGUVF4cUlBRkJBUkRDQWcwQklBQWdCMEV3QW40Z0JTZ0NEQ0lDUVFCT0JFQWdBcTBNQVF0Q2dJQ0FnTUIrSUFLNHZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCRlFRQklEUUVNQWd0QkFDRUVJQUpCQUNBQ1FRQktHeUVDQTBBZ0FpQUVSZzBDSUFNZ0JFRURkR29wQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlHSUFZb0FnQkJBV28yQWdBTElBQWdCeUFFSUFFUXBRRWhCaUFFUVFGcUlRUWdCa0VBVGcwQUN3c2dBQ0FIRUE5Q2dJQ0FnT0FBSVFjTElBVkJFR29rQUNBSEN4NEFJQUJCTUd0QkNra2dBRUZmY1VIQkFHdEJHa2x5SUFCQjN3QkdjZ3RNQVFKL0l3QkJFR3NpQXlRQUFuOGdBaUFCS0FJQUlnUXRBQUJIQkVBZ0F5QUNOZ0lBSUFCQm9KZ0JJQU1RT2tGL0RBRUxJQUVnQkVFQmFqWUNBRUVBQ3lFQklBTkJFR29rQUNBQkM2d0JBd0Y4QVg0QmZ5QUF2U0lDUWpTSXAwSC9EM0VpQTBHeUNFMEVmQ0FEUWYwSFRRUkFJQUJFQUFBQUFBQUFBQUNpRHdzQ2ZDQUFJQUNhSUFKQ0FGa2JJZ0JFQUFBQUFBQUFNRU9nUkFBQUFBQUFBREREb0NBQW9TSUJSQUFBQUFBQUFPQS9aQVJBSUFBZ0FhQkVBQUFBQUFBQThMK2dEQUVMSUFBZ0FhQWlBQ0FCUkFBQUFBQUFBT0MvWlVVTkFCb2dBRVFBQUFBQUFBRHdQNkFMSWdBZ0FKb2dBa0lBV1JzRklBQUxDNUFGQVFkL0FrQUNRQ0FCUWY4QVRRUkFJQUpGRFFFZ0FVRWdhaUFCSUFGQndRQnJRUnBKR3lFQkRBSUxJQUpCQUVjaENFSG9BaUVGQTBBZ0F5QUZTZzBDSUFFZ0F5QUZha0VCZGlJR1FRSjBRWkNDQW1vb0FnQWlCMEVQZGlJRVNRUkFJQVpCQVdzaEJRd0JDeUFCSUFkQkNIWkIvd0J4SUFScVR3UkFJQVpCQVdvaEF3d0JDd3NnQjBFSWRFR0FIbkVpQ1NBR1FjQ05BbW90QUFBaUJYSWhBd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FIUVFSMklnZEJEM0VpQmc0TkFBQUFBQUVDQXdRRkJnWUhCd2dMSUFKQkFrY2dCa0VDU1hJZ0FpQUhRUUZ4UjNFTkNTQUJJQVJySUFOQkFuUkJrSUlDYWlnQ0FFRVBkbW9oQVF3SkN5QUJJQVJySWdOQkFYRWdBa0VBUjBZTkNDQURRUUZ6SUFScUlRRU1DQXNnQVNBRWF5SUVRUUZHQkVCQkFVRi9JQUliSUFGcUlRRU1DQXNnQkNBQ1JVRUJkRWNOQjBFQ1FYNGdBaHNnQVdvaEFRd0hDeUFCSUFScklRRWdBa1VFUUNBQVFaa0hOZ0lFSUFBZ0FTQURRUVYyUWY0QWNVR3drQUpxTHdFQWFqWUNBRUVDRHdzZ0FTQUZRVDl4UVFGMFFiQ1FBbW92QVFCcUlRRU1CZ3NnQWtFQlJnMEZJQU1nQWtFQ1JrRUZkR29oQVF3RkN5QUNRUUZHRFFRZ0EwRUJkRUd3a0FKcUx3RUFJQUpCQWtacUlRRU1CQXNnQmtFSmF5QUlSdzBESUFOQkFYUkJzSkFDYWk4QkFDRUJEQU1MSUFaQkMyc2dBa2NOQWlBQUlBVkJQM0ZCQVhSQnNKQUNhaThCQURZQ0JDQUFJQU5CQlhaQi9nQnhRYkNRQW1vdkFRQWdBU0FFYTJvMkFnQkJBZzhMSUFJTkFTQUFJQWxCQjNaQnNKQUNhaThCQURZQ0FDQUFJQVZCRDNGQkFYUkJzSkFDYWk4QkFEWUNDQ0FBSUFWQkEzWkJIbkZCc0pBQ2FpOEJBRFlDQkVFRER3c2dBVUVnYXlBQklBRkI0UUJyUVJwSkd5RUJDeUFBSUFFMkFnQkJBUXVnQVFFR2Z5QUVRUUFnQkVFQVNoc2hDU0FCUVJCcUlRY2dBRUVRYWlFSUlBQWhDa0VBSVFRQ1FBTkFJQVFnQ1VZTkFTQUNJQVJxSVFBZ0F5QUVhaUVGSUFSQkFXb2hCQUovSUFvdEFBZEJnQUZ4QkVBZ0NDQUFRUUYwYWk4QkFBd0JDeUFBSUFocUxRQUFDeUlBQW44Z0FTMEFCMEdBQVhFRVFDQUhJQVZCQVhScUx3RUFEQUVMSUFVZ0Iyb3RBQUFMSWdWR0RRQUxJQUFnQldzaEJnc2dCZ3RzQVFGL0FrQUNRQ0FCUWlDSXB5SUNRWDlIQkVBZ0FrRjRSdzBCREFJTElBR25JZ0l2QVFaQkIwY05BQ0FDS1FNZ0lnRkNnSUNBZ0hDRFFvQ0FnSUNBZjFJTkFBd0JDeUFBUWZiU0FFRUFFQlZDZ0lDQWdPQUFEd3NnQWFjaUFDQUFLQUlBUVFGcU5nSUFJQUVMQ1FBZ0FDQUJFT3dEQzl3QkFRTi9Jd0JCRUdzaUJDUUFBa0FDUUNBQlFvQ0FnSUJ3VkEwQUlBR25JZ0l2QVFaQk1FWUVRQUpBSUFBZ0JFRUlhaUFCUWVJQUVJRUJJZ05GRFFBZ0JDa0RDQ0lCUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FBSUFNcEF3QVF0Z01oQWd3RUN5QUFJQUVnQXlrRENFRUJJQU1RTHlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUJFQ1lpQWtVTkFpQUFJQU1wQXdBUW1RRWlBMEVBU0EwQUlBTkZEUU1nQUVHVE4wRUFFQlVMUVg4aEFnd0NDeUFDSUFJdEFBVkIvZ0Z4T2dBRlFRRWhBZ3dCQzBFQUlRSUxJQVJCRUdva0FDQUNDN0FFQXdWK0EzOEJmQ01BUVJCcklnc2tBRUYvSVFvQ1FDQUFJQXRCQ0dvZ0FSQ2JBZzBBQW53Z0N5c0RDQ0lOdlVMLy8vLy8vLy8vLy84QWcwS0JnSUNBZ0lDQStQOEFXZ1JBSUFRRVFFSUFJUUZFQUFBQUFBQUFBQUFNQWd0QkFDRUtEQUlMQW40Z0RabEVBQUFBQUFBQTRFTmpCRUFnRGJBTUFRdENnSUNBZ0lDQWdJQ0Fmd3NoQVVRQUFBQUFBQUFBQUNBRFJRMEFHa0VBSUFFUXVBTnJJZ0NzUXVEVUEzNGdBWHdoQVNBQXR3c2hEU0FCSUFGQ2dMaVpLWUVpQVVJL2gwS0F1SmtwZ3lBQmZDSUZmVUtBdUprcGZ5SUlRcERPQUg0aUFTQUJRc24yM2dHQklnRjlJQUZDUDRkQ3Q0bWhmb044UXNuMjNnRi9RcklQZkNFQklBV25JZ3hCNE5RRGJTRUFJQWhDQkh4Q0I0RWhDUU5BQWtBZ0NDQUJFTXdFZlNJSFFnQlRCRUJDZnlFR0RBRUxRZ0VoQmlBSElBRVF5d1FpQlZvTkFDQUZRdTBDZlNFSUlBeEJnTjNiQVcwaENpQUF3VUU4YnlFRUlBeEI2QWR0SWdCQlBHOGhBeUFKUWorSFFnZURJQWw4SVFrZ0FFR1llR3dnREdvaEFFSUFJUVlEUUVJTElRVUNRQ0FHUWd0U0JFQWdCeUFHcDBFQ2RFR1EwZ0ZxTkFJQUlBaENBQ0FHUWdGUkczd2lCVmtOQVNBR0lRVUxJQUlnRFRrRFFDQUNJQW01T1FNNElBSWdBTGM1QXpBZ0FpQUR0emtES0NBQ0lBUzNPUU1nSUFJZ0NyYzVBeGdnQWlBRnVUa0RDQ0FDSUFHNU9RTUFJQUlnQjBJQmZMazVBeEJCQVNFS0RBUUxJQVpDQVh3aEJpQUhJQVY5SVFjTUFBc0FDeUFCSUFaOElRRU1BQXNBQ3lBTFFSQnFKQUFnQ2d0L0FRSi9Jd0JCUUdvaUFTUUFJQUVnQUVMb0IzODNBemdDUUVINDNRUXRBQUJCQVhFTkFFSDQzUVF0QUFCQkFYRU5BRUg4M1FSQmdONEVRWVRlQkJBS1FmamRCRUVCT2dBQUN5QUJRVGhxSUFGQkRHb1FDeUFCUVlqZUJFR0UzZ1FnQVNnQ0xCc29BZ0EyQWpRZ0FTZ0NNQ0VDSUFGQlFHc2tBQ0FDUVVSdEN4RUFJQUJCa0prQ1FiQ2hBa0VoRUt3REM5b0JBUU4vQWtBQ1FDQUJRYUovUmdSQVFYOGhBeUFBUVFnZ0FoQ2VBa1VOQVF3Q0MwRi9JUU1nQUVHaWZ5QUNFTG9ERFFFTFFRQWhBeUFBS0FJUUlBRkhEUUJCNlFCQjZnQWdBVUdpZjBZYklRVWdBa0Y3Y1NFQ0lBQkJRR3NvQWdBUU1pRUVBMEJCZnlFRElBQVFFZzBCSUFCQkVSQVFJQUFnQlNBRUVCd2FJQUJCRGhBUUFrQWdBVUdpZjBZRVFDQUFRUWdnQWhDZUFrVU5BUXdEQ3lBQVFhSi9JQUlRdWdNTkFnc2dBQ2dDRUNJRElBRkdEUUFMSUFOQnFIOUdCRUFnQUVIWEdVRUFFQlpCZnc4TElBQWdCQkFlUVFBaEF3c2dBd3UxSXdJS2Z3RitJd0JCSUdzaUJTUUFJQUZCQW5FaUJrRUJkaUVLUVg0aEJBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FDZ0NFQ0lEUVlBQmFnNEhBZ01QRFFFQkJRQUxBa0FnQTBIVEFHb09EQWtMREFFQkFRRUtBUUVCRWdBTEFrQWdBMEU1YWc0S0J3RUJDQUVCQVFFUUVRQUxJQU5CS0VZTkJTQURRUzlHRFFNZ0EwSGJBRVlnQTBIN0FFWnlEUTBMSUFBb0FqZ2hBU0FGSUFBb0FoZ2lBellDQkNBRklBRWdBMnMyQWdBZ0FFR09sUUVnQlJBV0RCWUxBa0FDUUFKQUlBQXBBeUFpREVJZ2lLY2lBVUYzUndSQUlBRU5BU0FBUVFFUUVDQUFRVUJyS0FJQUlBeW5FRGtNQXdzZ0FDQU1RUUFRdEFGQkFFNE5BUXdZQ3lBQUlBeEJBQkMwQVVFQVNBMFhEQUVMSUFBb0FpZ2hBU0FBUVFFUUVDQUFRVUJyS0FJQUlBRVFPU0FBUWJFQkVCQUxRWDhoQWlBQUVCSU5GZ3dUQzBGL0lRSWdBQ0FBS1FNZ1FRRVF0QUVORlNBQUVCSkZEUklNRlF0QmZ5RUVDeUFBSUFBb0FqZ2dCR28yQWpnZ0FDZ0NBQ2dDL0FGRkJFQWdBRUdtOWdCQkFCQVdEQk1MUVg4aEFpQUFFTmdFRFJOQkFDRUJJQUFnQUNrRElFRUFFTFFCR2lBQUtBSUFJZ01nQUNrRElDQUFLUU1vSUFNb0F2d0JFUmdBSWd4Q2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUtBSkFJZ01FUUNBREtBSm9RUUJIUVFGMElRRUxJQUFvQWdBaUF5QURLQUlRS1FPQUFTQUFLQUlNSUFBb0FoUWdBUkRLQWd3VUN5QUFJQXhCQUJDMEFTRUJJQUFvQWdBZ0RCQVBJQUVORXlBQVFUTVFFQ0FBRUJKRkRSQU1Fd3NDUUNBQlFRUnhSUTBBUVFBaEJDQUFRUUJCQVJDZUFVR21mMGNOQUVGL0lRSWdBRUVEUVFBZ0FDZ0NHQ0FBS0FJVUVNUUJSUTBSREJNTFFYOGhBaUFBRVBJQlJRMFBEQklMUVg4aEFrRUFJUVFnQUVFQ1FRQWdBQ2dDR0NBQUtBSVVFTVFCUlEwUERCRUxRWDhoQWtFQUlRUWdBRUVCUVFBUTdRSkZEUTRNRUF0QmZ5RUNJQUFRRWcwUElBQkJCeEFRREF3TFFYOGhBaUFBRUJJTkRpQUFRYmdCRUJBZ0FFRUlFQnBCQUNFRUlBQkJRR3NvQWdCQkFCQVhEQXdMUVg4aEFpQUFFQklORFNBQVFRa1FFQXdLQzBGL0lRSWdBQkFTRFF3Z0FFRUtFQkFNQ1FzZ0FDZ0NLQVJBSUFBUTRnRU1Dd3NDUUNBQlFRUnhJZ2RGRFFBZ0FDZ0NPRUVCRUlNQlFhWi9SdzBBUVg4aEFrRUFJUVFnQUVFRFFRQWdBQ2dDR0NBQUtBSVVFTVFCUlEwS0RBd0xBa0FnQUVHRkFSQktSUTBBSUFBb0FqaEJBUkNEQVVFS1JnMEFJQUFvQWhRaEFTQUFLQUlZSVFaQmZ5RUNJQUFRRWcwTUlBQW9BaEFpQTBGSFJnUkFJQUJCQWtFQ0lBWWdBUkRFQVVVTkNnd05DMEdGQVNFRUlBZEZEUWdDUUNBRFFTaEdCSDhnQUVFQVFRRVFuZ0ZCcG45R0RRRWdBQ2dDRUFVZ0F3dEJnMzlIRFFrZ0FDZ0NLQTBKSUFBb0FqaEJBUkNEQVVHbWYwY05DUXNnQUVFRFFRSWdCaUFCRU1RQlJRMEpEQXdMSUFBb0FpQWlCRUhOQUVjRVFDQUFLQUlBSUFRUUdCb01Cd3NnQUNnQ1FDZ0NYQTBHSUFCQndzRUFRUUFRRmd3S0N5QUFJQVZCR0dwQkFCQ2VBVUU5UmdSQUlBQkJBRUVBUVFBZ0JTZ0NHRUVDY1VFQkVNSUJRUUJJRFFvTUNBc2dBQ2dDRUVIN0FFWUVRRUVBSVFFZ0JVRUFOZ0ljSUFBUUVnMEZJQUJCQ3hBUUlBQkJRR3NoQWtFQUlRUUNRQU5BSUFBb0FoQWlBVUg5QUVZTkFRSkFBa0FnQVVHbmYwWUVRQ0FBRUJJTkR5QUFFRllORHlBQVFRY1FFQ0FBUWRNQUVCQWdBaWdDQUVFR0VHUWdBRUVPRUJBZ0FFRU9FQkFNQVFzZ0FDZ0NGQ0VISUFBb0FoZ2hDQ0FBSUFWQkhHcEJBVUVCUVFBUXhBTWlCa0VBU0EwQkFrQUNRQ0FHUVFGR0JFQWdBRUc0QVJBUUlBQWdCU2dDSENJQkVCb2dBaWdDQUNJRElBTXZBYndCRUJjTUFRc2dBQ2dDRUVFb1JnUkFJQUFDZnlBR1FYNXhJZ2xCQWtZRVFFRUFJUU1nQmtFQ2Fnd0JDeUFHUVFOclFRQWdCa0VFYTBFRFNSc2hBMEVHQ3lBRElBZ2dCeERFQVEwRUFrQWdCU2dDSENJQlJRUkFJQUJCMVFBUUVBd0JDeUFBUWRRQUVCQWdBQ0FCRUJvTElBSW9BZ0JCQkNBR1FRRnJRUVJ5SUFsQkFrY2JRZjhCY1JCa0RBSUxJQUJCT2hBc0RRTWdBQkJXRFFNQ1FDQUZLQUljSWdGQnhBQkhCRUFnQVEwQklBQVF3Z01nQUVIUkFCQVFJQUJCRGhBUVFRQWhBUXdEQ3lBRUJFQWdBRUdwNWdCQkFCQVdRY1FBSVFFTURRc2dBRUhQQUJBUVFRRWhCRUhFQUNFQkRBSUxJQUFnQVJDaEFRc2dBRUhNQUJBUUlBQWdBUkFhQ3lBQUtBSUFJQUVRRXdzZ0JVRUFOZ0ljSUFBb0FoQkJMRWNOQWlBQUVCSkZEUUVMQ3lBRktBSWNJUUVNQmd0QkFDRUJJQUJCL1FBUUxFVU5DQXdGQ3lBQUVCSU5DVUVBSVFFQ1FBTkFJQUFvQWhBaEFnSkFBMEFnQWtIZEFFWWdBVUVmUzNJZ0FrR25mMFp5SUFKQkxFWnlEUUVnQUJCV0RRMGdBVUVCYWlFQklBQW9BaEFpQWtIZEFFWU5BQXNnQWtFc1J3MENJQUFRRWcwTURBRUxDeUFBUVNZUUVDQUFRVUJySWdNb0FnQWdBVUgvL3dOeEVCZEJBQ0VFQWtBQ1FBTkFJQUFvQWhBaEFnSkFBMEFnQVVILy8vLy9CMFlOQVNBQ1FhZC9SZzBFSUFKQjNRQkdEUU1DUUNBQ1FTeEdCRUJCQVNFRUlBRkJBV29oQVF3QkN5QUFFRllORUNBQVFjd0FFQkFnQXlnQ0FDQUJRWUNBZ0lCNGNoQTVJQUZCQVdvaEFVRUFJUVFnQUNnQ0VDSUNRU3hIRFFFTEN5QUFFQklORGd3QkN3dEIvLy8vL3djaEFTQUNRZDBBUncwQkN5QUVSUTBCSUFCQkVSQVFJQUJCQVJBUUlBQkJRR3NvQWdBZ0FSQTVJQUJCd3dBUUVDQUFRVEFRR2d3QkN5QUFRUUVRRUNBQVFVQnJLQUlBSUFFUU9RTkFBa0FDUUFKQUlBQW9BaEFpQVVHbmYwY0VRRUdQQVNFQ0lBRkJMRWNOQVVFQklRUU1BZ3NnQUJBU0RRNUIwZ0FoQWlBQUVGWU5EZ3dCQ3lBQlFkMEFSZzBCSUFBUVZnME5JQUJCMFFBUUVFRUFJUVFMSUFBZ0FoQVFJQUFvQWhCQkxFY05BQ0FBRUJKRkRRRU1EQXNMSUFRRVFDQUFRUklRRUNBQVFjTUFFQkFnQUVFd0VCb01BUXNnQUVFT0VCQUxJQUJCM1FBUUxBMEpEQWNMUVg4aEFrRUFJUVFnQUVFQVFRQVExUVFOQ1F3SEMwRi9JUUlnQUJBU0RRZ2dBQ2dDRUVFdVJnUkFJQUFRRWcwSklBQkIrd0FRU2tVRVFDQUFRZUQzQUVFQUVCWU1DZ3NnQUNnQ1JFVUVRQ0FBUWVEdUFFRUFFQllNQ2dzZ0FCQVNEUWtnQUVFTUVCQWdBRUZBYXlnQ0FFRUdFR1FNQmdzZ0FFRW9FQ3dOQ0NBR1JRUkFJQUJCKzVnQlFRQVFGZ3dKQ3lBQUVGWU5DQ0FBUVNrUUxBMElJQUJCTlJBUVFRQWhCRUVCSVFvTUJndEJmeUVDSUFBUUVnMEhBa0FnQUNnQ0VDSUJRZHNBUmlBQlFTNUdja1VFUUNBQlFTaEhEUUZCQWlFRUlBQW9Ba0FvQWxRTkJ5QUFRY3c5UVFBUUZnd0pDeUFBUVVCcklnRW9BZ0FvQWxoRkJFQWdBRUdNOGdCQkFCQVdEQWtMSUFCQnVBRVFFQ0FBUVFnUUdrRUFJUVFnQVNnQ0FFRUFFQmNnQUVHNEFSQVFJQUJCOHdBUUdpQUJLQUlBUVFBUUZ5QUFRVFFRRUF3R0N5QUFRZCtYQVVFQUVCWU1Cd3RCZnlFQ0lBQVFFZzBHSUFBb0FoQkJMa1lFUUNBQUVCSU5CeUFBUWRZQUVFcEZCRUFnQUVIMExrRUFFQllNQ0FzZ0FFRkFheWdDQUNnQ1VFVUVRQ0FBUWNzMlFRQVFGZ3dJQ3lBQUVCSU5CeUFBUWJnQkVCQWdBRUh4QUJBYVFRQWhCQ0FBUVVCcktBSUFRUUFRRnd3RkN5QUFRUUFRdXdNTkJrRUJJUW9nQUNnQ0VFRW9SZ1JBUVFFaEJBd0ZDeUFBUVJFUUVDQUFRU0VRRUVFQUlRUWdBRUZBYXlnQ0FFRUFFQmNNQkFzZ0FDZ0NBQ0FCRUJNTUJBdEJmeUVDSUFBUUVnMEVDeUFBUWJnQkVCQWdBRUZBYXlJQktBSUFJQVFRT1NBQktBSUFJZ0VnQVM4QnZBRVFGd3RCQUNFRUN5QUZRWDgyQWh3Z0FFRkFheUVIQTBBZ0J5Z0NBQ0VHQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQW44Q1FDQUFLQUlRSWdGQnFYOUhJZ05GQkVBZ0FCQVNEUTBnQUNnQ0VDSUJRU2hHQkVCQkFTRUpJQW9OQWdzZ0FVSGJBRWNOQ0F3TEN5QUJRWUovUnlBRWNrVUVRRUVBSVFrZ0JTZ0NIRUVBU0FSQVFRQWhDRUVEREFNTElBQkIrczhBUVFBUUZnd05DeUFCUVNoSERRWkJBQ0VKSUFwRkRRWUxJQUFRRWcwTElBUU5BVUVCSVFoQkFBc2hCRUVBSVFOQkFTRUJBa0FDUUNBR0tBS1lBaUlDUVFCSURRQUNmd0ovQWtBQ1FBSkFBa0FnQmlnQ2dBSWdBbW9pQ3kwQUFDSUNRY2NBYXc0RUFRWUdBd0FMSUFKQndRQkdCRUJCd2dBaENDQUNEQVFMSUFKQnVBRkdEUUVnQWtHK0FVY05CVUcvQVNFSVFiNEJEQU1MUWNnQUlRaEJ4d0FNQWdzZ0NVVUVRRUV4SVFNZ0NDQUxLQUFCUVRwR2NRMEZDeUFMTHdBRklRSWdCaUVEQTBBZ0EwVUVRRUc0QVNFRERBVUxJQU1vQXN3QklBSkJBM1JxUVFScUlRSURRQ0FDS0FJQUlnSkJBRTRFUUNBREtBSjBJQUpCQkhScUlnSW9BZ0JCMUFCR0JFQkJ2QUVoQ0VHOEFTRURRUUVNQmdVZ0FrRUlhaUVDREFJTEFBc0xJQU1vQWd3aEFpQURLQUlFSVFNTUFBc0FDMEhIQUNFSVFjY0FDeUVEUVFJTElRRWdDeUFJT2dBQUN5QUpSUTBBSUFBZ0JVRWNhaUFCRU9FQ0MwRUFJUWtnQkVFRFJ3MEJJQUJCQVNBRlFSUnFFTlVFRFFvTUF3c2dCRUVDUmlFSlFRQWhBeUFFUVFKSERRQWdBRUc0QVJBUUlBQkI4Z0FRR2lBSEtBSUFRUUFRRnlBQVFUUVFFQ0FBUWJnQkVCQWdBRUh4QUJBYUlBY29BZ0JCQUJBWFFRQWhBUXdCQzBFQUlRRWdCRUVCUncwQUlBQkJFUkFRQ3dKQUEwQWdBQ2dDRUNJQ1FTbEdEUUVnQVVILy93TkdCRUFnQUVIVE0wRUFFQllNQ2dzZ0FrR25mMGNFUUVGL0lRSWdBQkJXRFFzZ0FVRUJhaUVCSUFBb0FoQkJLVVlOQWlBQVFTd1FMRVVOQVF3TEN3c2dCU0FCTmdJVUlBQkJKaEFRSUFjb0FnQWdBVUgvL3dOeEVCY2dBRUVCRUJBZ0J5Z0NBQ0FCRURrRFFBSkFBa0FnQUNnQ0VDSUJRYWQvUndSQUlBRkJLVVlOQWlBQUVGWU5EQ0FBUWRFQUVCQkJqd0VoQVF3QkMwRi9JUUlnQUJBU0RReEIwZ0FoQVNBQUVGWU5EQXNnQUNBQkVCQWdBQ2dDRUVFcFJnMEFRWDhoQWlBQVFTd1FMRVVOQVF3TEN3c2dBQkFTRFFnZ0FFRU9FQkFDUUFKQUFrQUNRQ0FEUWJ3QmF3NERBUU1CQUFzZ0EwRXhSZzBCSUFOQnh3QkdEUUFnQTBIQkFFY05BZ3NnQUVFWUVCQWdBRUVuRUJBZ0J5Z0NBQ0FFUVFGR0VCZEJBQ0VFREFrTElBQkJNaEFRREFZTElBa0VRQ0FBUVNjUUVDQUhLQUlBUVFFUUZ5QUFRUkVRRUNBQVFiMEJFQkFnQUVFSUVCcEJBQ0VFSUFjb0FnQkJBQkFYSUFBUXdBTU1DQXNnQkVFQlJnUkFJQUJCR0JBUUlBQkJKeEFRSUFjb0FnQkJBUkFYUVFBaEJBd0lDeUFBUVFZUUVDQUFRUnNRRUNBQVFTY1FFRUVBSVFRZ0J5Z0NBRUVBRUJjTUJ3c2dCU0FCTmdJVUlBQVFFZzBIQ3dKQUFrQUNRQUpBSUFOQnZBRnJEZ01CQXdFQUN5QURRVEZHRFFFZ0EwSEhBRVlOQUNBRFFjRUFSdzBDQ3lBQVFTUVFFQ0FIS0FJQUlBVXZBUlFRRjBFQUlRUU1Cd3NnQUVFeEVCQWdCeWdDQUNBRkx3RVVFQmNNQkFzQ1FBSkFBa0FnQkVFQmF3NENBUUFDQ3lBQVFTRVFFQ0FIS0FJQUlBVXZBUlFRRnlBQVFSRVFFQ0FBUWIwQkVCQWdBRUVJRUJwQkFDRUVJQWNvQWdCQkFCQVhJQUFRd0FNTUJ3c2dBRUVoRUJBZ0J5Z0NBQ0FGTHdFVUVCZEJBQ0VFREFZTElBQkJJaEFRSUFjb0FnQWdCUzhCRkJBWFFRQWhCQXdGQ3lBQlFkc0FSZzBESUFGQkxrY05BU0FBRUJJTkJTQUFLQUlRSVFFTEFrQWdBVUdyZjBZRVFBSkFJQVlvQXBnQ0lnRkJBRWdOQUNBR0tBS0FBaUFCYWkwQUFFRTBSdzBBSUFCQjVzTUFRUUFRRmd3SEN5QURSUVJBSUFBZ0JVRWNha0VCRU9FQ0N5QUFRYjRCRUJBZ0FDQUFLQUlnRUJvZ0J5Z0NBQ0lCSUFFdkFid0JFQmNNQVFzZ0FVR0RmMFlnQVVFbGFrRlJTM0pGQkVBZ0FFR2U2QUJCQUJBV0RBWUxBa0FnQmlnQ21BSWlBVUVBU0EwQUlBWW9Bb0FDSUFGcUxRQUFRVFJIRFFBZ0FDQUFLQUlBSUFBb0FpQVFYQ0lNUVFFUXRBRWhBU0FBS0FJQUlBd1FEeUFCRFFZZ0FFSEtBQkFRREFFTElBTkZCRUFnQUNBRlFSeHFRUUVRNFFJTElBQkJ3UUFRRUNBQUlBQW9BaUFRR2d0QmZ5RUNJQUFRRWtVTkF3d0ZDMEVBSVFJZ0JTZ0NIQ0lCUVFCSURRUWdBQ0FCRUI0TUJBc2dCeWdDQUNBR0x3RzhBUkFYSUFaQkFUWUNSRUVBSVFRTUFRdEJBQ0VCSUFZb0FwZ0NJZ0pCQUU0RVFDQUdLQUtBQWlBQ2FpMEFBQ0VCQ3lBRFJRUkFJQUFnQlVFY2FrRUJFT0VDQzBGL0lRSWdBQkFTRFFJZ0FCQ1JBUTBDSUFCQjNRQVFMQTBDSUFGQk5FWUVRQ0FBUWNvQUVCQUZJQUJCeHdBUUVBc01BQXNBQzBGL0lRSUxJQVZCSUdva0FDQUNDNEVCQVFGL0FrQUNRQ0FBS0FJUVFZTi9SdzBBSUFBb0FpZ05BQ0FBS0FJZ0lRSWdBQ2dDUUMwQWJrRUJjVVVOQVNBQ1FjMEFSZzBBSUFKQk9rY05BUXNnQUVHRkwwRUFFQlpCQUE4TElBQW9BZ0FnQWhBWUlRSUNRQUpBSUFFRVFDQUFJQUlRMXdRTkFRc2dBQkFTUlEwQkN5QUFLQUlBSUFJUUUwRUFJUUlMSUFJTHdBRUJBMzhqQUVFUWF5SUNKQUFnQUVFbkVFb0VmeUFDSUFBb0FnUTJBZ0FnQWlBQUtBSVVOZ0lFSUFJZ0FDZ0NHRFlDRENBQ0lBQW9BakEyQWdoQmZ3Si9RWDhnQUJBU0RRQWFBa0FnQUNnQ0VDSURRUzFxSWdSQkIwMUJBRUVCSUFSMFFjRUJjUnNnQTBIN0FFWnlSUVJBUVFFZ0EwSGJBRVlOQWhvZ0EwR0RmMGNOQVVFQUlBQW9BaWdOQWhvTElBRkJCSEZCQW5ZZ0FDZ0NCQ0FBS0FJVVJuSU1BUXRCQUFzZ0FDQUNFTzRDR3dWQkFBc2hBQ0FDUVJCcUpBQWdBQXRMQVFGL1FYOGhBeUFBSUFGQnRBSnFRUWdnQVVHOEFtb2dBU2dDdUFKQkFXb1FlRVVFUUNBQklBRW9BcmdDSWdOQkFXbzJBcmdDSUFFb0FyUUNJQU5CQTNScUlBSTNBd0FMSUFNTGtRRUJBbjhnQVNnQ2lBRWlCRUdBZ0FST0JFQWdBRUhBTTBFQUVFWkJmdzhMUVg4aEF5QUFJQUZCZ0FGcVFSQWdBVUdFQVdvZ0JFRUJhaEI0Qkg5QmZ3VWdBU0FCS0FLSUFTSURRUUZxTmdLSUFTQUJLQUtBQVNBRFFRUjBhaUlEUWdBM0FnQWdBMElBTndJSUlBTWdBQ0FDRUJnMkFnQWdBeUFES0FJTVFZRC8vLzhIY2pZQ0RDQUJLQUtJQVVFQmF3c0xiZ0VDZnlBQVFiZ0JFQkFnQUVIMkFCQWFJQUJCUUdzaUFpZ0NBQ0lCSUFFdkFid0JFQmNnQUVFUkVCQWdBRUhwQUVGL0VCd2hBU0FBUWJnQkVCQWdBRUVJRUJvZ0FpZ0NBRUVBRUJjZ0FFRWJFQkFnQUVFa0VCQWdBaWdDQUVFQUVCY2dBQ0FCRUI0Z0FFRU9FQkFMaGdFQkFuOENRQU5BSUFKQkFFNEVRQUpBSUFBb0FuUWdBa0VFZEdvaUJDZ0NBQ0FCUncwQUlBUW9BZ3dpQlVFQ2NRMERJQU5GRFFBZ0JVSDRBSEZCR0VZTkF3c2dCQ2dDQ0NFQ0RBRUxDMEYvSVFJZ0FDZ0NJRVVOQUNBQUtBSWtEUUFnQUNBQkVLSUNJZ0FFUUVHQWdJQ0FCQ0VDSUFBdEFBUkJBbkVOQVF0QmZ5RUNDeUFDQzVFQkFRVi9Ba0FDUUNBQUtBSkFJZ0VvQXBnQ0lnSkJBRWdOQUNBQktBS0FBaUlESUFKcUlnUXRBQUFpQlVIQkFVY0VRQ0FGUWMwQVJ3MEJJQUZCZnpZQ21BSWdBU0FDTmdLRUFpQUFRYzRBRUJBUEN5QUNJQVFvQUFGcklBTnFJZ0JCQVdvdEFBQkIxZ0JIRFFFZ0FFSFhBRG9BQVNBQlFYODJBcGdDQ3c4TFFkMDBRYTc4QUVIdHNBRkI0L1VBRUFBQUMxa0JBMzhnQUNnQ3pBRWdBa0VEZEdwQkJHb2hBd05BQWtCQmZ5RUVJQU1vQWdBaUEwRi9SZzBBSUFBb0FuUWdBMEVFZEdvaUJTZ0NCQ0FDUncwQUlBTWhCQ0FGS0FJQUlBRkdEUUFnQlVFSWFpRUREQUVMQ3lBRUM4b0ZBZ1IvQVg0Q1FBSkFBa0FDZndKQUFrQUNRQUpBQWtBZ0FrVU5BQUpBSUFCQndRQVFTa1VFUUNBQVFjSUFFRXBGRFFFTElBQW9BZ0FnQUNnQ0lCQVlJUVVnQUJBU0RRUkJBU0VIQWtBQ1FDQUFLQUlRSWdoQktHc09CUVFCQVFFRUFBc2dDRUU2UmlBSVFmMEFSbklOQXdzZ0FDZ0NBQ0FGRUJOQkEwRUNJQVZCd2dCR0d5RUdEQUVMSUFBb0FoQkJLa1lFUUNBQUVCSU5DRUVFSVFZTUFRc2dBRUdGQVJCS1JRMEFJQUFvQWpoQkFSQ0RBVUVLUmcwQUlBQW9BZ0FnQUNnQ0lCQVlJUVVnQUJBU0RRTkJBU0VIQWtBQ1FDQUFLQUlRSWdoQktHc09CUU1CQVFFREFBc2dDRUU2UmlBSVFmMEFSbklOQWdzZ0FDZ0NBQ0FGRUJOQkJTRUdJQUFvQWhCQktrY05BQ0FBRUJJTkIwRUdJUVlMSUFBb0FoQWlCVUdEZjBjZ0JVRWxha0ZTU1hFTkFVRUFJUWNnQlVHRGYwWUVRQ0FBS0FJb1JTRUhDeUFBS0FJQUlBQW9BaUFRR0NFRklBQVFFZzBDQzBFQUlBWWdBMFVnQjBWeWNnMERHaUFBS0FJUUlnQkJPa2NnQWtVZ0FFRW9SM0p4SVFaQkFDRUVEQVlMQWtBQ1FBSkFJQVZCZ0FGcURnSUJBQUlMSUFBb0FnQWdBQ2tESUJBeElnVkZEUVlnQUJBU0RRSU1Bd3NDUUNBQUtRTWdJZ2xDZ0lDQWdIQ0RRb0NBZ0lEd2ZsRUVRQ0FBS0FJQUlnSWdDYWRCQkdvZ0FEUUNLQ0FDS0FJUUtBTEVBaEU1QUNJSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFjZ0FDZ0NBQ0FKRURFaEJTQUFLQUlBSUFrUUR3d0JDeUFBS0FJQUlBa1FNU0VGQ3lBRlJRMEZJQUFRRWtVTkFnd0JDeUFGUWRzQVJ3UkFJQVJGSUFWQnEzOUhjZzBFSUFBb0FnQWdBQ2dDSUJBWUlRVWdBQkFTRFFGQkVBd0RDeUFBRUJJTkJDQUFFSkVCRFFRZ0FFSGRBQkFzRFFSQkFDRUZRUUFNQWdzZ0FDZ0NBQ0FGRUJNTUF3dEJBQXNoQkNBR1FRSkpEUUlnQUNnQ0VFRW9SZzBDSUFBb0FnQWdCUkFUQ3lBQVFaUG1BRUVBRUJZTElBRkJBRFlDQUVGL0R3c2dBU0FGTmdJQUlBUWdCbklMYVFBZ0FVRUJha0VJVFFSQUlBQWdBVUhMQUd0Qi93RnhFQkVQQ3lBQlFZQUJha0gvQVUwRVFDQUFRYjBCRUJFZ0FDQUJRZjhCY1JBUkR3c2dBVUdBZ0FKcVFmLy9BMDBFUUNBQVFiNEJFQkVnQUNBQlFmLy9BM0VRS2c4TElBQkJBUkFSSUFBZ0FSQWRDMThCQTM4Q1FBTkFJQUVnQWt3TkFRSkFBa0FnQUNBQ2FpSUZMUUFBSWdaQnRnRkhCRUFnQmtIQ0FVWU5BU0FHUWVzQVJ3MEVJQVVvQUFFZ0EwY05CQXdDQ3lBRktBQUJJQU5HRFFFTElBSkJCV29oQWd3QkN3dEJBU0VFQ3lBRUM0RUNBUVYvSUFBZ0FVRi9FR2thQWtBRFFDQUdRUXBHQkVCQjZ3QWhCQXdDQ3dKQUlBRkJBRWdOQUNBQklBQW9BcXdDVGcwQUlBQW9BcVFDSUFGQkZHeHFLQUlJSVFVZ0FDZ0NnQUloQndOQUFrQUNRQ0FGSUFkcUlnZ3RBQUFpQkVHMkFVWU5BQ0FFUWNJQlJ3UkFJQVJCRGtjTkFrRU9JUVFEUUNBSElBVkJBV29pQldvdEFBQWlBMEVPUmcwQUN5QURRU2xIRFFaQktTRUVEQVlMSUFORkRRQWdBeUFJS0FBQk5nSUFDeUFGSUFSQkFuUkJnTGdCYWkwQUFHb2hCUXdCQ3dzZ0JFSHJBRWNOQWlBR1FRRnFJUVlnQ0NnQUFTRUJEQUVMQzBHRktVR3UvQUJCLy9NQlFlTXVFQUFBQ3lBQ0lBUTJBZ0FnQUNBQlFRRVFhUm9nQVF0b0FBSkFJQUZCQUU0TkFFRi9JUUVnQUNnQ0FDQUFRYVFDYWtFVUlBQkJxQUpxSUFBb0Fxd0NRUUZxRUhnTkFDQUFJQUFvQXF3Q0lnRkJBV28yQXF3Q0lBQW9BcVFDSUFGQkZHeHFJZ0JCQURZQ0VDQUFRbjgzQWdnZ0FFS0FnSUNBY0RjQ0FBc2dBUXVrQVFFQ2Z5QUJLQUxBQWlJS1FZQ0FCRTRFUUNBQVFhWTZRUUFRUmtGL0R3dEJmeUVKSUFBZ0FVSElBbXBCQ0NBQlFjUUNhaUFLUVFGcUVIZ0VmMEYvQlNBQklBRW9Bc0FDSWdsQkFXbzJBc0FDSUFFb0FzZ0NJQWxCQTNScUlna2dCRHNCQWlBSklBZEJBM1JCQ0hFZ0JrRUNkRUVFY1NBRFFRRjBRUUp4SUFKQkFYRnljbklnQ0VFRWRISTZBQUFnQ1NBQUlBVVFHRFlDQkNBQktBTEFBa0VCYXdzTE5nQUNRQ0FBSUFGQkNCQlBJZ0JCQUVnTkFDQUJLQUpnUlEwQUlBRW9BblFnQUVFRWRHb2lBU0FCS0FJTVFRSnlOZ0lNQ3lBQUM0SUNBUVYvQWtBQ1FBSkFJQUpCelFCR0lBSkJPa1p5UlFSQUlBQW9BZ0FoQlNBQ1FSWkhEUUVnQUNnQ1FDRUdEQUlMSUFCQjhOd0FRUUFRRmd3Q0N5QUFLQUpBSWdZb0FzQUNJZ2RCQUNBSFFRQktHeUVIQTBBZ0JDQUhSZzBCSUFSQkEzUWhDQ0FFUVFGcUlRUWdDQ0FHS0FMSUFtb29BZ1FnQWtjTkFBc2dBRUhYM0FCQkFCQVdEQUVMSUFVZ0JpQURRZjBBUmtFQUlBRW9BamdnQWtFQlFRRkJBQkRKQXlJQVFRQklEUUFnQlNBQlFUUnFRUXdnQVVFOGFpQUJLQUk0UVFGcUVIZ05BQ0FCSUFFb0FqZ2lBa0VCYWpZQ09DQUJLQUkwSVFFZ0JTQURFQmdoQXlBQklBSkJER3hxSWdFZ0FEWUNBQ0FCSUFNMkFnUkJBQThMUVg4THZRUUJDSDhqQUVFUWF5SUZKQUFnQUVGQWF5SUdLQUlBSVFnZ0FDZ0NBQ0VISUFKQnMzOUhJUXBCdlg5QnZYOUJ1WDhnQWtGVFJpSUpHeUFDUVV0R0cwSC9BWEVoQ3dKL0FrQUNRQU5BQWtBQ1FDQUFLQUlRSWdSQmczOUdCRUFnQUNnQ0tBUkFJQUFRNGdFTUJnc2dDVVVnQWtGTFIzRWdCeUFBS0FJZ0VCZ2lCRUVuUjNKRkJFQWdBRUc3eEFCQkFCQVdRU2NoQkF3RkN5QUFFQklOQkNBQUlBUWdBaENoQWcwRUlBTUVRQ0FBSUFZb0FnQW9BcFFESUFRZ0JFRUFFUGNCUlEwRkN3SkFJQUFvQWhCQlBVWUVRQ0FBRUJJTkJpQUtSUVJBSUFCQnVBRVFFQ0FBSUFRUUdpQUdLQUlBSUFndkFid0JFQmNnQUNBRlFReHFJQVZCQ0dvZ0JTQUZRUVJxUVFCQkFFRTlFTFVCUVFCSURRY2dBQ0FCRUxZQkJFQWdCeUFGS0FJQUVCTU1DQXNnQUNBRUVLRUJJQUFnQlNnQ0RDQUZLQUlJSUFVb0FnQWdCU2dDQkVFQVFRQVF3UUVNQWdzZ0FDQUJFTFlCRFFZZ0FDQUVFS0VCSUFBZ0N4QVFJQUFnQkJBYUlBWW9BZ0FnQ0M4QnZBRVFGd3dCQ3lBSlJRUkFJQUpCUzBjTkFTQUFRYW5xQUVFQUVCWU1CZ3NnQUVFR0VCQWdBRUc5QVJBUUlBQWdCQkFhSUFZb0FnQWdDQzhCdkFFUUZ3c2dCeUFFRUJNTUFRc2dCRUVnY2tIN0FFY05BU0FBSUFWQkRHcEJBQkNlQVVFOVJ3MEJJQUJCQmhBUVFYOGdBQ0FDUVFCQkFTQUZLQUlNUVFKeFFRRVF3Z0ZCQUVnTkJSb0xRUUFnQUNnQ0VFRXNSdzBFR2lBQUVCSkZEUUVNQXdzTElBQkJ5ZmNBUVFBUUZnd0JDeUFISUFRUUV3dEJmd3NoQkNBRlFSQnFKQUFnQkF2SUF3RU9mMEdBZ0FRZ0Ftc2lDVUVBSUFsQmdJQUVUUnNoRENBRFFRQWdBMEVBU2hzaERTQUFRUkJxSVFzZ0FFSE1BR29oQ1NBQVFjZ0FhaUVPQTBBZ0JDQU5SZ1JBUVFBUEN3SkFJQVFnREVZTkFDQUJJQVJCREd4cUlnTW9BZ0FoQ2lBREtBSUlJUThnQXlnQ0JDRVFBa0FnQUNnQ1FDSURJQUlnQkdvaUJVc0VRQ0FBS0FKRUlnTWdCVUVZYkdvb0FnQkZEUUVNQWd0Qk9pQUZRUUZxSWdZZ0EwRURiRUVCZGlJRElBTWdCa2diSWdNZ0EwRTZUQnNpQmtFRGRDRVJJQWtoQXdOQUFrQWdBQ2dDQ0NFSElBTW9BZ0FpQ0NBT1JnMEFJQXNnQ0NnQ0ZDQVJJQWNSQVFBaUIwVU5BeUFBS0FKQUlRTURRQ0FESUFaT1JRUkFJQWNnQTBFRGRHcENnSUNBZ0NBM0F3QWdBMEVCYWlFRERBRUxDeUFJSUFjMkFoUWdDRUVFYWlFRERBRUxDeUFMSUFBb0FrUWdCa0VZYkNBSEVRRUFJZ05GRFFFZ0F5QUFLQUpBSWdoQkdHeHFRUUFnQmlBSWEwRVliQkFyR2lBQUlBWTJBa0FnQUNBRE5nSkVDeUFESUFWQkdHeHFJZ01nQlRZQ0FDQUtRZDRCVGdSQUlBQW9BamdnQ2tFQ2RHb29BZ0FpQlNBRktBSUFRUUZxTmdJQUN5QURRZ0EzQWhBZ0F5QVBOZ0lNSUFNZ0VEWUNDQ0FESUFvMkFnUWdCRUVCYWlFRURBRUxDMEYvQzFrQkFYOGdBQ0FBS0FKSUlnRkJBV3NnQVhJMkFrZ2dBQ2dDQUNJQlFRaHhCRUFnQUNBQlFTQnlOZ0lBUVg4UEN5QUFRZ0EzQWdRZ0FDQUFLQUlzSWdFMkFod2dBQ0FCTmdJVUlBQWdBU0FBS0FJd2FqWUNFRUVBQy9nQ0FnUi9BWDRqQUVFZ2F5SUNKQUFDZndKQUlBQW9BZ0FnQWtFSWFrRWdFRDBOQUFKQUEwQUNRQ0FCSWdNZ0FDZ0NQRThOQUNBRFFRRnFJUUVDUUFKQUFrQUNRQUpBSUFNdEFBQWlCVUhjQUdzT0JRSURBd01CQUFzZ0JVRWtSdzBDUVNRaEJDQUJMUUFBUWZzQVJ3MERJQU5CQW1vaEFRc2dBRUdDZnpZQ0VDQUFJQVUyQWlnZ0FrRUlhaEEySVFZZ0FDQUJOZ0k0SUFBZ0JqY0RJRUVBREFjTElBSkJDR3BCM0FBUU93MEZJQUVnQUNnQ1BFOE5BaUFEUVFKcUlRRWdBeTBBQVNFRkN3SkFBa0FDUUNBRklnUkJDbXNPQkFFQ0FnQUNDeUFCSUFFdEFBQkJDa1pxSVFFTElBQWdBQ2dDQ0VFQmFqWUNDRUVLSVFRTUFRc2dCTUJCQUU0TkFDQUJRUUZyUVFZZ0FrRUVhaEJZSWdSQi8vL0RBRXNOQXlBQ0tBSUVJUUVMSUFKQkNHb2dCQkM1QVVVTkFRd0RDd3NnQUVHSjJ3QkJBQkFXREFFTElBQkJ0UEFBUVFBUUZnc2dBaWdDQ0NnQ0VDSUFRUkJxSUFJb0Fnd2dBQ2dDQkJFQUFFRi9DeUVCSUFKQklHb2tBQ0FCQzFZQkFuNENmMEVBSUFGQ2dJQ0FnSEJVRFFBYUlBQWdBVUhTQVNBQlFRQVFGQ0lDUW9DQWdJQndneUlEUW9DQWdJQXdVZ1JBUVg4Z0EwS0FnSUNBNEFCUkRRRWFJQUFnQWhBbUR3c2dBYWN2QVFaQkVrWUxDMEFCQVg4akFFRVFheUlDSkFBQ2Z5QUJJQUFvQWhCSEJFQWdBaUFCTmdJQUlBQkJvSmdCSUFJUUZrRi9EQUVMSUFBUW9nRUxJUUFnQWtFUWFpUUFJQUFMendVQ0FuNEVmeU1BUVJCcklnWWtBQ0FBS0FJQUlRVUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFBb0FoQWlCRUdBQVdvT0JBSUJCUU1BQ3lBRVFheC9SZzBESUFSQjJ3QkhCRUFnQkVIN0FFY05CVUtBZ0lDQUlDRUJJQUFRb2dFTkNVS0FnSUNBNEFBaEFTQUZFRFFpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBKQWtBZ0FDZ0NFQ0lEUWYwQVJnMEFBMEFDUUNBRFFZRi9SZ1JBSUFVZ0FDa0RJQkF4SWdNTkFRd01DeUFBS0FKTVJTQURRWU4vUjNJTkNpQUZJQUFvQWlBUUdDRURDd0pBQWtBZ0FCQ2lBUTBBSUFCQk9oRFJBdzBBSUFBUTBnTWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJDeUFGSUFNUUV3d0xDeUFGSUFJZ0F5QUJRUWNRR1NFRUlBVWdBeEFUSUFSQkFFZ05DaUFBS0FJUVFTeEhEUUVnQUJDaUFRMEtJQUFvQWt4RklBQW9BaEFpQTBIOUFFZHlEUUFMQ3lBQ0lRRWdBRUg5QUJEUkF3MEpEQW9MUW9DQWdJQWdJUUVnQUJDaUFRMElRb0NBZ0lEZ0FDRUJJQVVRUGlJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFnQ1FDQUFLQUlRUWQwQVJnMEFBMEFnQUJEU0F5SUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRa2dCU0FDSUFNZ0FVRUhFSzhCUVFCSURRa2dBQ2dDRUVFc1J3MEJJQUFRb2dFTkNTQURRUUZxSVFNZ0FDZ0NURVVOQUNBQUtBSVFRZDBBUncwQUN3c2dBaUVCSUFCQjNRQVEwUU1OQ0F3SkN5QUFLUU1nSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCQ0FFS0FJQVFRRnFOZ0lBQ3lBQklRSWdBQkNpQVEwSERBZ0xJQUFwQXlBaUFTRUNJQUFRb2dFTkJnd0hDeUFBS0FJZ1FRRnJJZ1JCQWtzTkFTQUVRUU4wUWFqK0FXb3BBd0FpQVNFQ0lBQVFvZ0VOQlF3R0N5QUFRZm9sUVFBUUZnd0JDeUFBS0FJNElRTWdCaUFBS0FJWUlnUTJBZ1FnQmlBRElBUnJOZ0lBSUFCQnRaVUJJQVlRRmd0Q2dJQ0FnQ0FoQVF3Q0N5QUFRZDNsQUVFQUVCWUxJQUloQVFzZ0JTQUJFQTlDZ0lDQWdPQUFJUUlMSUFaQkVHb2tBQ0FDQ3hVQkFYNGdBQ0FCRVBZRUlRSWdBQ0FCRUE4Z0FndTREd0lFZndwK0l3QkJFR3NpQlNRQUlBVWdBamNEQ0FKQUFrQUNmZ0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRRUVISUFKQ0lJaW5JZ1FnQkVFSGEwRnVTUnRCQ21vT0VnY0VBZ01DQWdJQ0FnQUVCQVFDQWdJQ0FRSUxBa0FDUUFKQUFrQUNRQUpBSUFLbklnUXZBUVlpQmtFRWF3NERBZ0VEQUFzZ0JrRWhhdzRDQ3dNRUMwS0FnSUNBTUNFS0lBQWdBaEEzSWdKQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQ3lBQUlBSVEwd01pQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBMSUFFb0FpZ2dBaEIvSVFRTURndENnSUNBZ0RBaENpQUFJQUlRalFFaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwS0lBRW9BaWdnQWhCL0lRUU1EUXNnQVNnQ0tDQUVLUU1nRUljQklRUWdBQ0FDRUE4TURBc2dBU2dDS0NBQ0VIOGhCQXdMQzBLQWdJQ0FNQ0VMSUFBZ0FTa0RDRUVCSUFWQkNHb1ExZ01pQ0VLQWdJQ0E4QUNEUW9DQWdJRGdBRkVOQlNBQUlBZ1FKZ1JBSUFCQnkvQUFRUUFRRlF3R0N5QURRaUNJcDBGMVR3UkFJQU9uSWdRZ0JDZ0NBRUVCYWpZQ0FBc2dBU2tER0NJSVFpQ0lwMEYxVHdSQUlBaW5JZ1FnQkNnQ0FFRUJhallDQUFzQ1FBSkFBa0FDUUNBQUlBTWdDQkRFQWlJTVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVCQ2dJQ0FnREFoQ2d3QkN5QUJLUU1ZSWdoQ2dJQ0FnSENEUW9DQWdJQ1FmMUVFUUNBSXB5Z0NCRUgvLy8vL0IzRkZEUU1MSUF4Q0lJaW5RWFZQQkVBZ0RLY2lCQ0FFS0FJQVFRRnFOZ0lBQ3lBQVFjdWVBU0FNUWN5ZUFSQytBU0lLUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVMUW9DQWdJQXdJUTBNQndzZ0FFR0VtZ0VRWWlJTlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTUJnc2dBU2tESUNJS1FpQ0lwMEYxVHdSQUlBcW5JZ1FnQkNnQ0FFRUNhallDQUFzZ0NpRU5DeUFBSUFBZ0FTa0RDRUVCSUFWQkNHcEJBQkQ0QkJEOEFRMEVJQUFnQWhES0FTSUVRUUJJRFFRQ1FBSkFJQVFFUUNBQUlBVWdBaEE4RFFjZ0FTZ0NLRUhiQUJBN0dpQUZLUU1BSWc1Q0FDQU9RZ0JWR3lFUUlBRkJLR29oQmdKQUEwQWdDU0FRVVEwQklBRW9BaWdoQkFKQUFrQWdDVkJGQkVBZ0JFRXNFRHNhSUFFb0FpZ2dDaENIQVJvZ0FDQUNJQWtRY3lJUFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFF3Z0NVS0FnSUNBQ0ZvTkFTQUpJUWdNQWdzZ0JDQUtFSWNCR2tJQUlRZ2dBQ0FDUWdBUVRTSVBRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRc01BUXRDZ0lDQWdNQitJQW01dlNJSVFvQ0FnSURBZ1lEOC93QjlJQWhDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJJUWdMSUFBZ0NCQTNJZ2hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5EaUFBSUFFZ0FpQVBJQWdRMVFNaER5QUFJQWdRRHlBUFFvQ0FnSUJ3Z3lJUlFvQ0FnSURnQUZFTkNTQUpRZ0Y4SVFsQ2dJQ0FnREFoQ0NBQUlBRkNnSUNBZ0NBZ0R5QVJRb0NBZ0lBd1VSc2dEQkRVQTBVTkFBc01EUXNnRGtJQVZ3UkFRZDBBSVFSQ2dJQ0FnREFoQ0F3REN5QUJLUU1ZSWdsQ2dJQ0FnSENEUW9DQWdJQ1FmMUlFUUVIZEFDRUVRb0NBZ0lBd0lRZ01BZ3RCM1FBaEJFS0FnSUNBTUNFSUlBbW5LQUlFUWYvLy8vOEhjUTBCREFJTEFrQWdBU2tERUNJTFFvQ0FnSUJ3Z3lJSlFvQ0FnSUF3VWdSQUlBdENJSWluUVhWSkRRRWdDNmNpQkNBRUtBSUFRUUZxTmdJQURBRUxJQUFnQWtFUlFRQVFxZ0lpQzBLQWdJQ0FjSU1oQ1F0Q2dJQ0FnREFoQ0NBSlFvQ0FnSURnQUZFTkN5QUFJQVVnQ3hBOERRc2dBU2dDS0VIN0FCQTdHa0lBSVFrZ0JTa0RBQ0lJUWdBZ0NFSUFWUnNoRHlBQlFTaHFJUVpCQUNFRVFvQ0FnSUF3SVFnRFFDQUpJQTlTQkVBZ0FDQUlFQThnQUNBTElBa1FjeUlJUW9DQWdJQndnMEtBZ0lDQTRBQlJEUTBnQ0VJZ2lLZEJkVThFUUNBSXB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFBZ0FpQUlFRTBpRGtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBOSUFBZ0FTQUNJQTRnQ0JEVkF5SU9Rb0NBZ0lCd2d5SVFRb0NBZ0lBd1VnUkFJQkJDZ0lDQWdPQUFVUTBPSUFRRVFDQUJLQUlvUVN3UU94b0xJQUFnQ0JEVEF5SUlRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQ0FPRUE4TUR3c2dBU2dDS0NBS0VJY0JHaUFCS0FJb0lBZ1Fod0VhSUFFb0FpaEJPaEE3R2lBQktBSW9JQTBRaHdFYVFRRWhCQ0FBSUFFZ0RpQU1FTlFERFE0TElBbENBWHdoQ1F3QkN3c2dCRVVFUUVIOUFDRUVEQUlMUWYwQUlRUWdBU2dDR0NnQ0JFSC8vLy8vQjNGRkRRRUxJQVlvQWdCQkNoQTdHaUFHS0FJQUlBTVFod0VhQ3lBQktBSW9JQVFRT3hwQkFDRUVJQUFnQUNBQktRTUlJQVVnQlVFQUVQY0VFUHdCRFFrZ0FDQUNFQThnQUNBTEVBOGdBQ0FLRUE4Z0FDQU5FQThnQUNBTUVBOGdBQ0FJRUE4TUNndENnSUNBZ0NBZ0FpQUNRb0NBZ0lEQWdZRDgvd0I4UW9DQWdJQ0FnSUQ0L3dDRFFvQ0FnSUNBZ0lENC93QlJHeUVDREFJTElBQWdBaEFQUVFBaEJBd0lDMEtBZ0lDQU1DRUtRb0NBZ0lBd0lRMUNnSUNBZ0RBaEMwS0FnSUNBTUNFSVFvQ0FnSUF3SVF3Z0FDQUNFTk1ESWdKQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQmdzZ0FTZ0NLQ0FDRUg4aEJBd0dDMEtBZ0lDQU1DRUlEQVFMUW9DQWdJQXdJUXBDZ0lDQWdEQU1BZ3NnQUVHQ0hrRUFFQlZDZ0lDQWdEQWhDZ3RDZ0lDQWdEQWhDMEtBZ0lDQU1Bc2hEVUtBZ0lDQU1DRUlRb0NBZ0lBd0lRd0xJQUFnQWhBUElBQWdDeEFQSUFBZ0NoQVBJQUFnRFJBUElBQWdEQkFQSUFBZ0NCQVBRWDhoQkFzZ0JVRVFhaVFBSUFRTC9BSUNBWDhCZmlNQVFTQnJJZ1VrQUNBRklBUTNBeGdDUUFKQUFrQWdBMEtBZ0lDQWNJTkNnSUNBZ09CK1VpQURRdi8vLy85dldIRkZCRUJDZ0lDQWdPQUFJUVlnQUNBRFFaRUJJQU5CQUJBVUlnUkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQURJUVFNQXdzZ0FDQUVFRGdFUUNBQUlBUWdBMEVCSUFWQkdHb1FMeUVFSUFBZ0F4QVBJQVJDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5BZ3dEQ3lBQUlBUVFEd3NnQXlFRUN3SkFJQUVwQXdBaUEwS0FnSUNBY0lOQ2dJQ0FnREJSQkVBZ0JDRUREQUVMSUFVZ0JEY0RDQ0FGSUFVcEF4ZzNBd0FnQUNBRElBSkJBaUFGRUNFaEF5QUFJQVFRRDBLQWdJQ0E0QUFoQmlBRElRUWdBMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMEJDd0pBUVFjZ0EwSWdpS2NpQVNBQlFRZHJRVzVKRzBFS2FpSUJRUkZMRFFCQkFTQUJkRUdMdUF4eERRSWdBVUVKUncwQUlBTWhCRUtBZ0lDQU1DRUdJQUFnQXhBNFJRMENEQUVMSUFNaEJFS0FnSUNBTUNFR0N5QUFJQVFRRHlBR0lRTUxJQVZCSUdva0FDQURDNTREQWdWK0FuOGpBRUVnYXlJSkpBQkNnSUNBZ09BQUlRUUNRQ0FBSUFsQkdHb2dBQ0FCRUNVaUJ4QThEUUFDUUNBSktRTVlJZ1ZDQUZjTkFDQUpRZ0EzQXhBZ0FrRUNUZ1JBSUFBZ0NVRVFhaUFES1FNSVFnQWdCU0FGRUhRTkFnc0NRQUpBSUFjZ0NVRU1haUFKUVFocUVJb0NSUVJBSUFrcEF4QWhBUXdCQ3lBSktRTVFJZ0VnQ1RVQ0NDSUVJQUVnQkZVYklRZ2dDU2dDRENFQ0EwQWdBU0FJVVEwQklBTXBBd0FpQkVJZ2lLZEJkVThFUUNBRXB5SUtJQW9vQWdCQkFXbzJBZ0FMSUFJZ0FhZEJBM1JxS1FNQUlnWkNJSWluUVhWUEJFQWdCcWNpQ2lBS0tBSUFRUUZxTmdJQUN5QUFJQVFnQmtFQ0VMd0JEUUlnQVVJQmZDRUJEQUFMQUFzZ0FTQUZJQUVnQlZVYklRVURRQ0FCSUFWUkRRSkNnSUNBZ09BQUlRUWdBQ0FISUFFUWN5SUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdBeWtEQUNJRVFpQ0lwMEYxVHdSQUlBU25JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUVJQVpCQWhDOEFRMEJJQUZDQVh3aEFRd0FDd0FMUW9HQWdJQVFJUVFNQVF0Q2dJQ0FnQkFoQkFzZ0FDQUhFQThnQ1VFZ2FpUUFJQVFMdHdFQkFuOENRQUo4QWtBQ1FBSkFBa0FDUUVFSElBQkNJSWluSWdJZ0FrRUhhMEZ1U1JzaUFrRUlhZzRLQWdFR0JnWUdCZ0lEQUFRTElBQ25JUUVNQlFzZ0FLZEJBQkN3QlNFQkRBUUxJQUNuUWRzWWJDRUJEQU1MSUFDblFkc1liTGNNQVFzZ0FrRUhSdzBCUkFBQUFBQUFBUGgvSUFCQ2dJQ0FnTUNCZ1B6L0FId2lBTDhnQUVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMdlNJQVFpQ0lJQUNGcDBIYkdHd2hBUXNnQVNBQ2N3c0VBRUVBQzFnQkFuOGdBUVJBQWtBZ0FDZ0NDQ0FBS0FJRUlnTWdBV3BKRFFBZ0FSQ3hBU0lCUlEwQUlBQWdBMEVJYWpZQ0JDQUFJQUFvQWdCQkFXbzJBZ0FnQVNFQ0N5QUNEd3RCb0pBQlFhNzhBRUdpRFVINit3QVFBQUFMcEFFQ0FuOEJmaU1BUVJCcklnUWtBQUpBSUFBZ0FTQUNJQU1RcHdFaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUFrQWdBQ0FCRUpJQklnVkJBRWdOQUNBQ1FRRkhEUUVnQXlrREFDSUdRaUNJcDBGMVR3UkFJQWFuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dBQ0FFUVFocUlBWVFvd0VOQUNBRUtRTUlJQVd0VncwQklBQkIwTlFBUVFBUUZRc2dBQ0FCRUE5Q2dJQ0FnT0FBSVFFTElBUkJFR29rQUNBQkM1Z0JBUVIvSUFHbklnWXZBUVpCNWFZQmFqRUFBQ0VCSUFCQkdCQXBJZ1ZGQkVBZ0FDQUNFQTlCZnc4TElBS25JZ2NvQWlBaEFDQUZJQVFnQVlZK0FoUWdCU0FEcHlJSU5nSVFJQVVnQnpZQ0RDQUZJQVkyQWdnZ0FDZ0NEQ0lISUFVMkFnUWdCU0FBUVF4cU5nSUVJQVVnQnpZQ0FDQUFJQVUyQWd3Z0JpQUVQZ0lvSUFZZ0JUWUNJQ0FHSUFBb0FnZ2dDR28yQWlSQkFBdW9BZ0VFZnlBQUtBSVFJUVlDUUFKQUlBQWdBU0FERUdVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBSkNnSUNBZ0FoYUJFQWdBRUgyMkFCQkFCQlFEQUlMSUFCQkhCQXBJZ1JGQkVCQkFDRUVEQUlMSUFRZ0FxY2lCVFlDQUFKQUFrQWdBMEVVUncwQUlBWW9BcmdCSWdkRkRRQWdCQ0FHS0FMRUFVRUJJQVVnQlVFQlRCc2dCeEVEQUNJR05nSUlJQVpGRFFNZ0JrRUFJQVVRS3hvTUFRc2dCQ0FBUVFFZ0JTQUZRUUZNR3hCZklnVTJBZ2dnQlVVTkFnc2dCRUhTQURZQ0dDQUVRUUEyQWhRZ0JFRUFPZ0FFSUFRZ0JFRU1haUlBTmdJUUlBUWdBRFlDRENBRUlBTkJGRVk2QUFVZ0FVS0FnSUNBY0ZRTkFDQUJweUFFTmdJZ0N5QUJEd3NnQUNBQkVBOGdBQ2dDRUNJQVFSQnFJQVFnQUNnQ0JCRUFBRUtBZ0lDQTRBQUxHd0FnQVNnQ0lBUkFJQUFnQVVFb2FoRCtBaUFCUVFBMkFpQUxDMllDQW44QmZpTUFRUkJySWdNa0FFRi9JUVFDUUNBQUlBRkNBQkJOSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBTkJER29nQlJDWUFRMEFJQUFnQVVFQUlBTW9BZ3dnQW1vaUFLMFFwUUZCQUVnTkFDQUFSU0VFQ3lBRFFSQnFKQUFnQkFzTkFDQUFJQUVnQWtFQkVJTUZDeUVBSUFFb0FnUkJCVWNFUUNBQlFRVTJBZ1FnQUNnQ0VDQUJRUWhxRVA0Q0N3dVJBUUVEZndKQUlBQW9BZ2dpQkVIOS8vLy9CMG9OQUNBQ1FRWkdCRUFnQVNBRFNBOExJQVJCZ0lDQWdIaEdJQUZCQW1vZ0EwcHlEUUFnQUNnQ0VDSUdJQUFvQWd3aUJDQUJRWDl6SWdBZ0JFRUZkR29pQVJDWkFpQUNRWHR4UlhNaEFpQUFJQU5xSVFBRFFDQUFSUTBCSUFCQkFXc2hBQ0FHSUFRZ0FVRUJheUlCRUprQ0lBSkdEUUFMUVFFaEJRc2dCUXNwQVFGL0lBSkNJSWluUVhWUEJFQWdBcWNpQXlBREtBSUFRUUZxTmdJQUN5QUFJQUVnQWhDUUJRdWpCUUVNZnlNQVFUQnJJZ1FrQUFKQUFrQUNRQ0FBSUFGR0lBQWdBa1p5UlFSQUlBRW9BZ2hCQUVvRVFDQUJLQUlFSVFZTElBSW9BZ2hCQUVvRVFDQUNLQUlFSVFjTElBWkZCRUFnQVNFRkRBSUxJQUFvQWdBaEJTQUVRZ0EzQWhRZ0JFS0FnSUNBZ0lDQWdJQi9Od0lNSUFRZ0JUWUNDQ0FFUVFocUlRVWdCU0FCUWdGQi8vLy8vd05CQVJCMVJRMEJRUUFoQWd3Q0MwR3FqQUZCMVB3QVFab1NRZkRKQUJBQUFBc0NRQUpBQW44Z0IwVUVRRUVBSUFOQkFrOE5BUm9nQmtVaENTQUdJUWdNQWdzZ0FDZ0NBQ0VCSUFSQ0FEY0NLQ0FFUW9DQWdJQ0FnSUNBZ0g4M0FpQWdCQ0FCTmdJY0lBUkJIR29nQWtJQlFmLy8vLzhEUVFFUWRRUkFJQVJCSEdvaEFnd0VDeUFFUVJ4cUlRSWdCaUFISUFNUWtBWUxJZ2hGSVFrZ0EwRUNSeUFJY2cwQUFuOGdCaUFIY2tVRVFDQUZLQUlJSWdFZ0FpZ0NDQ0lJSUFFZ0NFZ2JEQUVMSUFaRkJFQWdCU2dDQ0F3QkN5QUNLQUlJQ3lFQlFRQWhDRUVCSVFrTUFRc2dCU2dDQ0NJQklBSW9BZ2dpQ2lBQklBcEtHeUVCQ3lBQVFRRWdBU0FCUVFGTUcwRWZhaUlLUVFWMklnc1FRUTBBUVFBaEFVRUFJQWhySVF4QkFDQUhheUVIUVFBZ0Jtc2hCaUFDS0FJTVFRVjBJQUlvQWdocklRMGdCU2dDREVFRmRDQUZLQUlJYXlFT0EwQWdBU0FMUmtVRVFDQUFLQUlRSUFGQkFuUnFJQVVvQWhBZ0JTZ0NEQ0FPSUFGQkJYUWlEMm9RYUNBR2N5QUNLQUlRSUFJb0Fnd2dEU0FQYWhCb0lBZHpJQU1Ra0FZZ0RITTJBZ0FnQVVFQmFpRUJEQUVMQ3lBQUlBZzJBZ1FnQUNBS1FXQnhOZ0lJSUFCQi8vLy8vd05CQVJDekFocEJBQ0VCSUFrTkFTQUFJQUJDZjBILy8vLy9BMEVCRUhWRkRRRUxJQUFRTlVFZ0lRRUxJQVJCQ0dvZ0JVWUVRQ0FFUVFocUVCc0xJQVJCSEdvZ0FrWUVRQ0FFUVJ4cUVCc0xJQVJCTUdva0FDQUJDLzRGQVFkL0l3QkJNR3NpQlNRQUFrQUNRQ0FBSUFKR0lBQWdBMFp5UlFSQUlBRWdBa1lnQVNBRFJuSU5BU0FBSUFGR0RRSUNRQUpBSUFJb0Fnd2lDQVJBSUFNb0Fnd2lDUTBCQzBFQUlRUWdBRUVBRUlrQkFrQWdBaWdDQ0NJQVFmLy8vLzhIUndSQUlBTW9BZ2dpQTBILy8vLy9CMGNOQVFzZ0FSQTFEQUlMSUFCQi92Ly8vd2RISUFOQmdJQ0FnSGhIY1VVRVFDQUJFRFZCQVNFRURBSUxJQUVnQWhCRUdpQUJRZi8vLy84RFFRRVF6Z0VoQkF3QkN5QUNLQUlFSWdjZ0F5Z0NCSE1oQ2dKQUFrQUNRQUpBQWtBZ0JFRUNhdzRGQUFFRUFnTUVDeUFLSVFZTUF3c2dDa0VCY3lFR0RBSUxRUUVoQmd3QkN5QUhJUVlMSUFVZ0FpZ0NDQ0lITmdJa0lBSW9BaEFoQ3lBRklBZzJBaWdnQlNBTE5nSXNJQVZCQURZQ0lDQUZJQU1vQWdnaUNEWUNFQ0FES0FJUUlRTWdCU0FKTmdJVUlBVWdBellDR0NBRlFRQTJBZ3dDUUNBRlFSeHFJQVZCQ0dvUTB3RkJBRWdFUUNBQVFnQVFNQm9nQVNBRlFSeHFFRVFhREFFTElBQWdCVUVjYWlJSklBVkJDR29pQzBFQklBY2dDR3NpQXlBRFFRRk1HMEVCYWtFQkVKVUJHaUFBUVFFUTBRRWFJQUVnQUNBTFFmLy8vLzhEUVFFUVF4b2dBU0FKSUFGQi8vLy8vd05CQVJEa0FSb0xBa0FnQUNnQ0NDSUhRZi8vLy84SFJnMEFJQUVvQWdoQi8vLy8vd2RHRFFBQ1FDQUJLQUlNUlEwQUFrQUNRQUpBSUFRT0JRQUJBUUVBQVFzZ0JTQUZLQUlRSWdaQkFXczJBaEFnQVNBRlFRaHFFTk1CSVFNZ0JTQUdOZ0lRSUFOQkFFb05BU0FERFFJZ0JFRUVSZzBCSUFBb0FoQWdBQ2dDRENJRElBTkJCWFFnQjJzUW1RSU5BUXdDQ3lBR1JRMEJDeUFBSUFCQ0FVSC8vLy8vQTBFQkVIVWdBU0FCSUFWQkNHcEIvLy8vL3dOQkFSRGtBWEpCSUhFTkFRc2dBU0FCS0FJRUlBSW9BZ1J6TmdJRUlBQWdDallDQkNBQlFmLy8vLzhEUVFFUXpnRWhCQXdCQ3lBQUVEVWdBUkExUVNBaEJBc2dCVUV3YWlRQUlBUVBDMEhEL1FCQjFQd0FRY3dOUWQvU0FCQUFBQXRCc3YwQVFkVDhBRUhORFVIZjBnQVFBQUFMUWZISUFFSFUvQUJCemcxQjM5SUFFQUFBQy9jQkFRUi9Jd0JCSUdzaUJ5UUFBa0FnQWtFQlJnUkFJQUFnQVRVQ0FCQXdJUU1NQVFzZ0JFRUJkQ0FEUVFGcUlnbDJRUUZxUVFGMklRZ2dCaUFEUVJSc2FpSUtLQUlNUlFSQUlBb2dCU0FJUWYvLy8vOERRUUVRL0FJaUF3MEJDeUFBSUFFZ0NFRUNkR29nQWlBSWF5QUpJQVFnQlNBR0VPVURJZ01OQUNBQUlBQWdDa0gvLy8vL0EwRUJFRU1pQXcwQUlBQW9BZ0FoQWlBSFFnQTNBaGdnQjBLQWdJQ0FnSUNBZ0lCL053SVFJQWNnQWpZQ0RDQUhRUXhxSUFFZ0NDQUpJQVFnQlNBR0VPVURJZ05GQkVBZ0FDQUFJQWRCREdwQi8vLy8vd05CQVJETEFTRURDeUFIUVF4cUVCc0xJQWRCSUdva0FDQURDNllCQVFWL1FYOGhCZ0pBSUFFb0FnQWlCRUVBU0FSQUlBQW9BZ0FpQlNnQ0FDQUFLQUlRSUFBb0Fnd2lBMEVCYWlJSElBTkJBMnhCQVhZaUF5QURJQWRJR3lJRFFRSjBJQVVvQWdRUkFRQWlCVVVOQVNBQUlBVTJBaEFnQlNBRElBQW9BZ3dpQm1zaUIwRUNkR29nQlNBR1FRSjBFSndCSUFBZ0F6WUNEQ0FFSUFkcUlRUUxJQUFvQWhBZ0JFRUNkR29nQWpZQ0FDQUJJQVJCQVdzMkFnQkJBQ0VHQ3lBR0MzWUJBbjhnQVNBQkxRQUFRWHh4UVFGeUlnUTZBQUFnQVNBQ0xRQU1RUUowUVFSeElBUkJlWEZ5SWdRNkFBQWdBU0FFUVhWeElBSXRBQXhCQW5SQkNIRnlJZ1E2QUFBZ0FpMEFEQ0VGSUFFZ0F6c0JBaUFCSUFSQkRYRWdCVUVCZEVId0FYRnlPZ0FBSUFFZ0FDQUNLQUlBRUJnMkFnUUx5d0lCQTM4Z0FFR1lBeEJmSWdZRVFDQUdJQUEyQWdBZ0JrRi9OZ0lJSUFZZ0FUWUNCQ0FHSUFaQkVHb2lCellDRkNBR0lBYzJBaEFnQVFSQUlBRW9BaEFpQnlBR1FSaHFJZ2cyQWdRZ0JpQUJRUkJxTmdJY0lBWWdCellDR0NBQklBZzJBaEFnQmlBQkxRQnVPZ0J1SUFZZ0FTZ0N2QUUyQWd3TElBWWdBellDTENBR0lBSTJBaUFnQUNnQ0VDRUJJQVpDQURjQ2lBSWdCa0lBTndLQUFpQUdJQUUyQXBRQ0lBWkJmellDbUFJZ0JrRTdOZ0tRQWlBR1FRQTJBbkFnQmtHUUFXcEIvd0ZCS0JBckdpQUdRb1NBZ0lBUU53TEVBU0FHSUFaQjBBRnFOZ0xNQVNBR1FuODNBdEFCSUFaQmZ6WUM4QUVnQmtLQWdJQ0FjRGNDdkFFZ0FDQUVFS29CSVFFZ0JpQUZOZ0x3QWlBR0lBRTJBdXdDSUFBb0FoQWhBQ0FHUWdBM0F2d0NJQVpDQURjQzlBSWdCaUFBTmdLSUF5QUdRVHMyQW9RRElBWWdCVFlDbkFJTElBWUxMQUVCZndKQUlBR25LQUlnSWdORkRRQWdBeWtEQUNJQlFvQ0FnSUJnVkEwQUlBQWdBYWNnQWhFQUFBc0xaUUVDZnlBQklBRW9BZ0JCQVdzaUFqWUNBQUpBSUFKRkJFQWdBU2dDQkVVTkFTQUJLQUlRSWdJZ0FTZ0NGQ0lETmdJRUlBTWdBallDQUNBQlFnQTNBaEFnQUVFUWFpQUJJQUFvQWdRUkFBQUxEd3RCNGh4QnJ2d0FRY2JsQWtHMDhRQVFBQUFMdkFRREEzd0Rmd0orQW53Q1FDQUFFTEFDUWY4UGNTSUZSQUFBQUFBQUFKQThFTEFDSWdSclJBQUFBQUFBQUlCQUVMQUNJQVJyU1FSQUlBVWhCQXdCQ3lBRUlBVkxCRUFnQUVRQUFBQUFBQUR3UDZBUEMwRUFJUVJFQUFBQUFBQUFrRUFRc0FJZ0JVc05BRVFBQUFBQUFBQUFBQ0FBdlNJSFFvQ0FnSUNBZ0lCNFVRMEJHa1FBQUFBQUFBRHdmeEN3QWlBRlRRUkFJQUJFQUFBQUFBQUE4RCtnRHdzZ0IwSUFVd1JBUkFBQUFBQUFBQUFRRUl3R0R3dEVBQUFBQUFBQUFIQVFqQVlQQzBHQUNDc0RBQ0FBb2tHSUNDc0RBQ0lCb0NJQ0lBR2hJZ0ZCbUFnckF3Q2lJQUZCa0FnckF3Q2lJQUNnb0NJQklBR2lJZ0FnQUtJZ0FVRzRDQ3NEQUtKQnNBZ3JBd0Nnb2lBQUlBRkJxQWdyQXdDaVFhQUlLd01Bb0tJZ0FyMGlCNmRCQkhSQjhBOXhJZ1ZCOEFocUt3TUFJQUdnb0tBaEFTQUZRZmdJYWlrREFDQUhRaTJHZkNFSUlBUkZCRUFDZkNBSFFvQ0FnSUFJZzFBRVFDQUlRb0NBZ0lDQWdJQ0lQMzIvSWdBZ0FhSWdBS0JFQUFBQUFBQUFBSCtpREFFTElBaENnSUNBZ0lDQWdQQS9mTDhpQWlBQm9pSUJJQUtnSWdORUFBQUFBQUFBOEQ5akJId2pBRUVRYXlJRUlRWWdCRUtBZ0lDQWdJQ0FDRGNEQ0NBR0lBUXJBd2hFQUFBQUFBQUFFQUNpT1FNSVJBQUFBQUFBQUFBQUlBTkVBQUFBQUFBQThEK2dJZ0FnQVNBQ0lBT2hvQ0FEUkFBQUFBQUFBUEEvSUFDaG9LQ2dSQUFBQUFBQUFQQy9vQ0lBSUFCRUFBQUFBQUFBQUFCaEd3VWdBd3RFQUFBQUFBQUFFQUNpQ3c4TElBaS9JZ0FnQWFJZ0FLQUxDeDRBSUFFb0FnQkJCRWNFUUNBQUlBRkJDR29RL2dJZ0FVRUVOZ0lBQ3d2ekFnRUZmeUFCSUFGQktHb2lCallDTENBQklBWTJBaWdnQVNBQ3B5SUhLQUlnSWdZdEFCQTJBamdnQVNBR0tBSVVOZ0l3SUFFZ0FFRUJJQVl2QVM0Z0JpOEJLQ0lBSUFRZ0FDQUVTaHNpQ0NBR0x3RXFhbW9pQUNBQVFRRk1HMEVEZEJBcElnQTJBaUFnQUVVRVFFRi9Ed3NnQWtJZ2lLZEJkVThFUUNBSElBY29BZ0JCQVdvMkFnQUxJQUVnQWpjREdDQURRaUNJcDBGMVR3UkFJQU9uSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dBU0FFTmdJSUlBRWdBemNEQUNBQklBZzJBalFnQVNBQUlBaEJBM1JxSWdjMkFpUWdBU0FISUFZdkFTb2lCa0VEZEdvMkFqeEJBQ0VCSUFSQkFDQUVRUUJLR3lFSEEwQWdBU0FIUndSQUlBVWdBVUVEZENJSmFpa0RBQ0lDUWlDSXAwRjFUd1JBSUFLbklnb2dDaWdDQUVFQmFqWUNBQXNnQUNBSmFpQUNOd01BSUFGQkFXb2hBUXdCQ3dzZ0JDQUdJQWhxSWdFZ0FTQUVTQnNoQVFOL0lBRWdCRVlFZjBFQUJTQUFJQVJCQTNScVFvQ0FnSUF3TndNQUlBUkJBV29oQkF3QkN3c0xNd0FnQUNBQ1FRRVE2Z0VpQUVVRVFFS0FnSUNBNEFBUEN5QUFRUkJxSUFFZ0FrRUJkQkFmR2lBQXJVS0FnSUNBa0grRUM0WUJBZ0YrQW44Z0FTa0RHQ0lEUW9DQWdJQmdXZ1JBSUFBZ0E2Y2dBaEVBQUFzZ0FTa0RBQ0lEUW9DQWdJQmdXZ1JBSUFBZ0E2Y2dBaEVBQUFzQ1FDQUJLQUk4SWdWRkRRQWdBU2dDSUNFRUEwQWdCQ0FGVHcwQklBUXBBd0FpQTBLQWdJQ0FZRm9FUUNBQUlBT25JQUlSQUFBZ0FTZ0NQQ0VGQ3lBRVFRaHFJUVFNQUFzQUN3dlZDUUlCZmdWL0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBUzBBQkVFUGNRNEdBQUVFQWdNRkNBc2dBQ0FCS0FJUUlnWWdBaEVBQUNBR1FUQnFJUWNEUUNBRUlBWW9BaUJPUlFSQUFrQWdCeWdDQkVVTkFDQUJLQUlVSUFSQkEzUnFJUVVDUUFKQUFrQUNRQ0FIS0FJQVFSNTJRUUZyRGdNQUFRSURDeUFGS0FJQUlnZ0VRQ0FBSUFnZ0FoRUFBQXNnQlNnQ0JDSUZSUTBESUFBZ0JTQUNFUUFBREFNTElBVW9BZ0FpQlMwQUJVRUJjVVVOQWlBQUlBVWdBaEVBQUF3Q0N5QUFJQVVvQWdCQmZIRWdBaEVBQUF3QkN5QUZLUU1BSWdOQ2dJQ0FnR0JVRFFBZ0FDQURweUFDRVFBQUN5QUVRUUZxSVFRZ0IwRUlhaUVIREFFTEN5QUJMd0VHSWdSQkFVWU5CU0FBS0FKRUlBUkJHR3hxS0FJTUlnUkZEUVVnQUNBQnJVS0FnSUNBY0lRZ0FpQUVFUkVBRHdzRFFDQUJLQUk0SUFSS0JFQWdBU2dDTkNBRVFRTjBhaWtEQUNJRFFvQ0FnSUJnV2dSQUlBQWdBNmNnQWhFQUFBc2dCRUVCYWlFRURBRUxDeUFCS0FJd0lnRkZEUVFnQUNBQklBSVJBQUFQQ3lBQkxRQUZRUUZ4UlEwRUlBRW9BaEFwQXdBaUEwS0FnSUNBWUZRTkF3d0dDeUFCS0FJZ0JFQWdBQ0FCUVNocUlBSVE3d01MSUFFcEF4QWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFcEF4Z2lBMEtBZ0lDQVlGUU5BZ3dGQ3lBQktBSXNJZ0ZGRFFFZ0FDQUJJQUlSQUFBUEN5QUJRZmdCYWlFRUlBRkI5QUZxSVFjRFFDQUhJQVFvQWdBaUJVY0VRRUVBSVFRRFFDQUVJQVVvQWhoT1JRUkFBa0FnQlNnQ0ZDQUVRUlJzYWlJR0tBSUlEUUFnQmlnQ0JDSUdSUTBBSUFBZ0JpQUNFUUFBQ3lBRVFRRnFJUVFNQVFzTElBVXBBemdpQTBLQWdJQ0FZRm9FUUNBQUlBT25JQUlSQUFBTElBVXBBMEFpQTBLQWdJQ0FZRm9FUUNBQUlBT25JQUlSQUFBTElBVXBBMWdpQTBLQWdJQ0FZRm9FUUNBQUlBT25JQUlSQUFBTElBVXBBMkFpQTBLQWdJQ0FZRm9FUUNBQUlBT25JQUlSQUFBTElBVkJCR29oQkF3QkN3c2dBU2tEd0FFaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQThnQklnTkNnSUNBZ0dCYUJFQWdBQ0FEcHlBQ0VRQUFDeUFCS1FPd0FTSURRb0NBZ0lCZ1dnUkFJQUFnQTZjZ0FoRUFBQXNnQVNrRHVBRWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMUVFBaEJDQUJLUU9vQVNJRFFvQ0FnSUJnV2dSQUlBQWdBNmNnQWhFQUFBc0RRQUpBSUFSQkNFWUVRRUVBSVFRRFFDQUVJQUFvQWtCT0RRSWdBU2dDS0NBRVFRTjBhaWtEQUNJRFFvQ0FnSUJnV2dSQUlBQWdBNmNnQWhFQUFBc2dCRUVCYWlFRURBQUxBQXNnQVNBRVFRTjBhaWtEV0NJRFFvQ0FnSUJnV2dSQUlBQWdBNmNnQWhFQUFBc2dCRUVCYWlFRURBRUxDeUFCS1FPWUFTSURRb0NBZ0lCZ1dnUkFJQUFnQTZjZ0FoRUFBQXNnQVNrRG9BRWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFcEExQWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFcEEwQWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFcEEwZ2lBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFcEF6Z2lBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFcEF6QWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFb0FpUWlBVVVOQUNBQUlBRWdBaEVBQUFzUEMwSHgrZ0JCcnZ3QVFZNHNRZURRQUJBQUFBc1FBUUFMSUFBZ0E2Y2dBaEVBQUF0OEFRSi9JQUJCSUJBcElnSUVRQ0FDUVFFMkFnQWdBa0tBZ0lDQXdBQkNnSUNBZ0RBZ0FSczNBeGdnQWlBQ1FSaHFOZ0lRSUFJZ0FpMEFCVUVCY2pvQUJTQUFLQUlRSVFBZ0FrRURPZ0FFSUFBb0FsQWlBU0FDUVFocUlnTTJBZ1FnQWlBQVFkQUFhallDRENBQ0lBRTJBZ2dnQUNBRE5nSlFDeUFDQzBvQkFuOENRQ0FBTFFBQUlnSkZJQUlnQVMwQUFDSURSM0lOQUFOQUlBRXRBQUVoQXlBQUxRQUJJZ0pGRFFFZ0FVRUJhaUVCSUFCQkFXb2hBQ0FDSUFOR0RRQUxDeUFDSUFOckMzc0JBbjhqQUVHUUFXc2lCQ1FBUWNDV0FTRUZBa0FDUUFKQUFrQWdBVUVCYWc0RkF3SUNBQUVDQzBHQmxnRWhCUXdCQzBId01pRUZDeUFBS0FJUUlBUkIwQUJxSUFNUWtBRWhBU0FFSUFBb0FoQWdCRUVRYWlBQ0tBSUVFSkFCTmdJRUlBUWdBVFlDQUNBQUlBVWdCQkNBQWdzZ0JFR1FBV29rQUF1SUFRRUNmeU1BUVJCcklnVWtBQ0FGUVFBMkFnd2dCVUlBTndJRUlBQWdBU0FDSUFNZ0JDQUZRUVJxRUs0RklRSWdCU2dDRENJQlFRQWdBVUVBU2hzaEF5QUZLQUlFSVFFRFFDQURJQVpHUlFSQUlBQWdBU0FHUVFOMGFpZ0NCQkFUSUFaQkFXb2hCZ3dCQ3dzZ0FDZ0NFQ0lBUVJCcUlBRWdBQ2dDQkJFQUFDQUZRUkJxSkFBZ0FndWxBUUVGZnlNQVFSQnJJZ01rQUVGL0lRSUNRQ0FBS0FJVURRQWdBQ2dDQUNBQUtBSUVJQUZCQVhSQkVHb2dBMEVNYWhDb0FTSUVSUVJBSUFBUWd3TU1BUXNnQkVFUWFpRUZJQUFvQWdnaEFpQURLQUlNSVFZRFFDQUNRUUJNUlFSQUlBVWdBa0VCYXlJQ1FRRjBhaUFDSUFWcUxRQUFPd0VBREFFTEN5QUFRUUUyQWhBZ0FDQUVOZ0lFSUFBZ0JrRUJkaUFCYWpZQ0RFRUFJUUlMSUFOQkVHb2tBQ0FDQzBZQkFYOGdBU0FCS0FJQUlnSkJBV3MyQWdBZ0FrRUJUQVJBSUFFcEFnUkNnSUNBZ0lDQWdJREFBRm9FUUNBQUlBRVFvZ01QQ3lBQVFSQnFJQUVnQUNnQ0JCRUFBQXNMTWdBZ0FFR01BV3NpQUVFblQwS1BnUCsvNWdrZ0FLMklRZ0dEVUhKRkJFQWdBRUVDZEVIQS9nRnFLQUlBRHdzUUFRQUxjUUVCZmdKQUlBQWdBU0FBSUFNUXFnRWlBeUFCUVFBUUZDSUVRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFJQUlnQXlBQ1FRQVFGQ0lDUW9DQWdJQndneUlFUW9DQWdJQXdVU0FFUW9DQWdJRGdBRkZ5RFFFZ0FDQUJJQU1nQWhDeEJRd0JDeUFBSUFRUUR3c2dBQ0FERUJNTGl3a0JDMzhqQUVFUWF5SUlKQUFDUUFKQUFrQUNRQUpBQWtBRFFDQUJLQUlRSWdOQk1Hb2hCaUFESUFNb0FoZ2dBbkZCZjNNaUNVRUNkR29vQWdBaEJFRUFJUU1EUUNBRUJFQWdDQ0FHSUFSQkFXc2lDa0VEZEdvaUJUWUNEQ0FGS0FJQUlRY2dBaUFGS0FJRVJnUkFRUUFoQkNBSFFZQ0FnQ0J4UlEwSlFYOGhCQ0FBSUFFZ0NFRU1haERVQVEwSklBRW9BaEFoQWdKQUlBTUVRQ0FDSUFNZ0JtdEJBM1ZCQUNBREcwRURkR29pQTBFd2FpQURLQUl3UVlDQWdHQnhJQWdvQWd3b0FnQkIvLy8vSDNGeU5nSUFJQWdvQWd3aENRd0JDeUFDSUFsQkFuUnFJQWdvQWd3aUNTZ0NBRUgvLy84ZmNUWUNBQXRCQVNFRUlBSWdBaWdDSkVFQmFqWUNKQ0FBS0FJUUlBRW9BaFFnQ2tFRGRHb2lBeUFKS0FJQVFScDJFT3dGSUFBZ0NDZ0NEQ2dDQkJBVElBZ29BZ3dpQlNBRktBSUFRZi8vL3g5eE5nSUFJQWdvQWd4QkFEWUNCQ0FEUW9DQWdJQXdOd01BSUFJb0FpUWlBMEVJU0EwSklBTWdBaWdDSUVFQmRra05DU0FCS0FJUUlnY3RBQkFOQlVFQ0lBY29BaUFnQnlnQ0pHc2lBaUFDUVFKTUd5SUtJQWNvQWh4TERRWWdCeWdDR0VFQmFpRUVBMEFnQkNJQ1FRRjJJZ1FnQ2s4TkFBc2dBQ0FLUVFOMElnMGdBa0VDZENJRmFrRXdhaEFwSWdSRkRRZ2dBa0VCYXlFTElBY29BZ2dpQWlBSEtBSU1JZ00yQWdRZ0F5QUNOZ0lBSUFkQ0FEY0NDQ0FFSUFWcUlBZEJNQkFmSVFZZ0FDZ0NFQ0lDS0FKUUlnTWdCa0VJYWlJSk5nSUVJQVlnQWtIUUFHbzJBZ3dnQmlBRE5nSUlJQUlnQ1RZQ1VFRUFJUU1nQkVFQUlBVVFLeG9nQjBFd2FpRUVJQVpCTUdvaEFpQUJLQUlVSVF4QkFDRUpBMEFnQ1NBR0tBSWdJZ1ZQUlFSQUlBUW9BZ1FpQlFSQUlBSWdCVFlDQkNBQ0lBUW9BZ0JCZ0lDQVlIRWlCU0FDS0FJQVFmLy8veDl4Y2pZQ0FDQUNJQVVnQmlBRUtBSUVJQXR4UVg5elFRSjBhaUlGS0FJQVFmLy8veDl4Y2pZQ0FDQUZJQU5CQVdvaUJUWUNBQ0FNSUFOQkEzUnFJQXdnQ1VFRGRHb3BBd0EzQXdBZ0JTRURJQUpCQ0dvaEFnc2dDVUVCYWlFSklBUkJDR29oQkF3QkN3c2dBeUFGSUFZb0FpUnJSdzBISUFaQkFEWUNKQ0FHSUFvMkFod2dCaUFMTmdJWUlBWWdBellDSUNBQklBWTJBaEFnQUNnQ0VDSUNRUkJxSUFjZ0J5Z0NHRUYvYzBFQ2RHb2dBaWdDQkJFQUFFRUJJUVFnQUNBQktBSVVJQTBRaVFJaUFFVU5DU0FCSUFBMkFoUU1DUVVnQjBILy8vOGZjU0VFSUFVaEF3d0NDd0FMQzBFQklRUWdBUzBBQlNJRFFRUnhSUTBHSUFOQkNIRkZEUUVnQUNBSVFRaHFJQUlRckFGRkRRWWdDQ2dDQ0NJRElBRW9BaWdpQlU4TkJpQUJMd0VHSWdSQkNFWWdCRUVDUm5KRkJFQkJBQ0VFREFjTElBVkJBV3NnQTBZRVFDQUFJQUVvQWlRZ0EwRURkR29wQXdBUUR5QUJJQU0yQWlnTUJnc2dBQ0FCRUpJRFJRMEFDMEYvSVFRTUJRc2dBQ2dDRUNnQ1JDQUJMd0VHUVJoc2FpZ0NGQ0lEUlEwRUlBTW9BZ2dpQTBVTkJDQUFJQUd0UW9DQWdJQndoQ0FDSUFNUkZRQWhCQXdFQzBIaStnQkJydndBUWEwalFjRTZFQUFBQzBHLzN3QkJydndBUWJFalFjRTZFQUFBQzBHcWtRRkJydndBUWRZalFjRTZFQUFBQzBFQklRUUxJQWhCRUdva0FDQUVDMEVBSUFBZ0FpQUJRUUJCQUJBaElnRkMvLy8vLzI5V0lBRkNnSUNBZ0hDRFFvQ0FnSURnQUZGeVJRUkFJQUFnQVJBUElBQVFKRUtBZ0lDQTRBQVBDeUFCQzY0QkFnRitBWDhDUUNBQUtBSVFLQUtNQVNJRFJTQUJRdi8vLy8vLy8vOFBWbklOQUNBREtBSW9RUVJ4UlEwQUlBRkNnSUNBZ0FoVUJFQWdBUThMUW9DQWdJREFmaUFCdWIwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHdzhMSUFBUWx3RWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQUtuUVFScUlBRVFNRVVFUUNBQ0R3c2dBQ0FDRUE4Z0FCQjhDMEtBZ0lDQTRBQUxVZ0VDZnlNQVFSQnJJZ0lrQUFKL0FrQWdBa0VNYWlBQkVMMEZSUTBBSUFJb0Fnd2lBMEVBU0EwQUlBQWdBUkQyQXlBRFFZQ0FnSUI0Y2d3QkN5QUFJQUZCQVJDbkFnc2hBU0FDUVJCcUpBQWdBUXVRQVFJRGZ3RitJQUVvQWhRaUJTa0RBQ0lIUXYvLy8vOFBWaUFCS0FJb0lnWkJBV29pQkNBSHAwMXlSUVJBSUFFb0FoQXRBRE5CQ0hGRkJFQWdBQ0FDRUE4Z0FDQURRVEFRd0FJUEN5QUZJQVN0TndNQUN3SkFJQVFnQVNnQ0lFME5BQ0FBSUFFZ0JCQ3NCVVVOQUNBQUlBSVFEMEYvRHdzZ0FTZ0NKQ0FHUVFOMGFpQUNOd01BSUFFZ0JEWUNLRUVCQzYwQkFnWi9BWDRDUUNBQktRSlVJZ2luUWY4QmNRMEFJQUVnQ0VLQWZvTkNBWVEzQWxRRFFDQUJLQUlVSUFKTUJFQkJBQThMSUFFb0FoQWdBa0VEZEdvaUJ5Z0NBQ0VEUVg4aEJpQUFJQUVvQWdRUWtRUWlCRVVOQVFKQUlBQWdBeENSQkNJRFJRUkFRUUFoQlF3QkN5QUFJQVFnQXhESkJTRUZJQUFnQkJCVUlBTWhCQXNnQUNBRUVGUWdCVVVOQVNBSElBVTJBZ1FnQWtFQmFpRUNJQUFnQlJEK0EwRUFUZzBBQ3dzZ0Jnc3pBUUYvSXdCQjBBQnJJZ01rQUNBRElBQW9BaEFnQTBFUWFpQUJFSkFCTmdJQUlBQWdBaUFERUlBQ0lBTkIwQUJxSkFBTE9nRUJmeUFBS0FJUUlnTWdBU0FDRUtjQ0lnRkZCRUFnQUJCOFFvQ0FnSURnQUE4TElBTW9BamdnQVVFQ2RHbzFBZ0JDZ0lDQWdJQi9oQXVPQmdJRGZ3RitJd0JCRUdzaUNDUUFBa0FDUUFKQUFrQUNRQ0FCTFFBRklnZEJCSEZGRFFBZ0FTOEJCaUlKUVFKR0JFQUNRQ0FIUVFoeEJFQUNRQ0FDUVFCSUJFQWdDQ0FDUWYvLy8vOEhjU0lKTmdJTUlBa2dBU2dDS0VjTkFTQUhRUUZ4UlEwR0lBWkJnREJ4SUFZZ0JrRUlkbkZCQjNGQkIwZHlEUUVnQTBJZ2lLZEJkVThFUUNBRHB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFBZ0FTQURJQVlRL1FNaEJ3d0pDeUFBSUFoQkRHb2dBaENzQVVVTkJBdEJmeUVISUFBZ0FSQ1NBMFVOQVF3SEN5QUFJQWhCREdvZ0FoQ3NBVVVOQWdzZ0FDQUlRUWhxSUFFb0FoUWlDU2tEQUJCM0dpQUlLQUlNUVFGcUlnY2dDQ2dDQ0UwTkFTQUJLQUlRTFFBelFRaHhSUVJBSUFBZ0JrRXdFTUFDSVFjTUJnc2dBQ0FKSUFkQkFFNEVmaUFIclFWQ2dJQ0FnTUIrSUFlNHZTSUtRb0NBZ0lEQWdZRDgvd0I5SUFwQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hBZ0RBRUxJQWxCRld0Qi8vOERjVUVLVFFSQUlBQWdBaENlQXlJSFJRMEJJQWRCQUVnTkJDQUFJQVpCbng4UWJ5RUhEQVVMSUFaQmdJQUljUTBBSUFBb0FoQW9Ba1FnQ1VFWWJHb29BaFFpQjBVTkFDQUJyVUtBZ0lDQWNJUWhDaUFIS0FJTUlnY0VRQ0FBSUFvZ0FpQURJQVFnQlNBR0lBY1JLZ0FoQnd3RkN5QUFJQW9RbVFFaUIwRUFTQTBESUFkRkRRRUxJQUV0QUFWQkFYRU5BUXNnQUNBR1FmZm9BQkJ2SVFjTUFnc2dBQ0FCSUFJZ0JrRUZjVUVRY2lBR1FRZHhJQVpCZ0RCeElnSWJFSG9pQVVVTkFDQUNCRUFnQVVFQU5nSUFBa0FnQmtHQUVIRkZEUUFnQUNBRUVEaEZEUUFnQktjaEFpQUVRaUNJcDBGMVR3UkFJQUlnQWlnQ0FFRUJhallDQUFzZ0FTQUNOZ0lBQ3lBQlFRQTJBZ1JCQVNFSElBWkJnQ0J4UlEwQ0lBQWdCUkE0UlEwQ0lBV25JUUFnQlVJZ2lLZEJkVThFUUNBQUlBQW9BZ0JCQVdvMkFnQUxJQUVnQURZQ0JBd0NDd0pBSUFaQmdNQUFjUVJBSUFOQ0lJaW5RWFZQQkVBZ0E2Y2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBQklBTTNBd0FNQVFzZ0FVS0FnSUNBTURjREFBdEJBU0VIREFFTFFYOGhCd3NnQ0VFUWFpUUFJQWNMUkFFQmZ5TUFRUkJySWdVa0FDQUZJQUVnQWlBRElBUkNnSUNBZ0lDQWdJQ0FmNFVRY0NBRktRTUFJUUVnQUNBRktRTUlOd01JSUFBZ0FUY0RBQ0FGUVJCcUpBQUxDd0FnQUNBQlFRRVFqZ1FMbHdFQkFuOUJpd0VoQWdKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRRUVISUFGQ0lJaW5JZ01nQTBFSGEwRnVTUnRCQzJvT0V3RUxBQWtFQ2dvS0Nnb0ZBZ01JQmdvS0NnSUtDMEdNQVE4TFFZMEJEd3RCeGdBUEMwSEhBQThMUWNnQUR3c2dBYWNzQUFWQkFFNE5BUXRCeFFBUEMwRWJJUUlnQUNBQkVEZ05Bd3RCeVFBUEMwSEtBQThMUWN3QUlRSUxJQUlMTlFFQ2Z3SkFJQUJDZ0lDQWdIQlVEUUFnQUtjaUJDOEJCa0VNUncwQUlBUW9BaVFnQVVjTkFDQUVMZ0VxSUFKR0lRTUxJQU1MbXdRQ0EzOEJmaU1BUVNCcklnY2tBQ0FCUWlDSXAwRjFUd1JBSUFHbklnWWdCaWdDQUVFQmFqWUNBQXNDUUFKQUFrQUNRQUpBQTBBQ1FBSkFBa0FnQWFjaUJpMEFCVUVFY1VVTkFDQUFLQUlRS0FKRUlBWXZBUVpCR0d4cUtBSVVJZ2hGRFFBZ0NDZ0NHQ0lJUlEwQUlBQWdBU0FDSUFNZ0JDQUZJQWdSTFFBaEJnd0JDeUFBSUFjZ0JpQUNFRXdpQmtFQVRnMEJDeUFBSUFFUUR3d0ZDd0pBSUFZRVFDQUhMUUFBUVJCeEJFQWdBQ0FIS1FNWUlnbW5RUUFnQ1VLQWdJQ0FjSU5DZ0lDQWdEQlNHeUFFSUFNZ0JSQ0xBeUVHSUFBZ0J5a0RFQkFQSUFBZ0J5a0RHQkFQSUFBZ0FSQVBEQWdMSUFBZ0J5a0RDQkFQSUFjdEFBQkJBbkVOQVNBQUlBRVFEd3dEQ3lBQUlBRVFqQUlpQVVLQWdJQ0FjSU5DZ0lDQWdDQlNEUUVMQ3lBQUlBRVFEeUFFUXYvLy8vOXZXQVJBSUFBZ0F4QVBJQUFnQlVIME1CQnZJUVlNQlFzZ0FDQUhJQVNuSWdnZ0FoQk1JZ1pCQUVnTkF5QUdSUTBDSUFjdEFBQkJFSEVFUUNBQUlBY3BBeEFRRHlBQUlBY3BBeGdRRHlBQUlBTVFEeUFBSUFWQnA5RUFFRzhoQmd3RkN5QUFJQWNwQXdnUUR5QUhMUUFBUVFKeFJRMEFJQWd2QVFaQkMwY05BUXNnQUNBREVBOGdBQ0FGSUFJUXdBSWhCZ3dEQ3lBQUlBUWdBaUFEUW9DQWdJQXdRb0NBZ0lBd1FZREFBQkJ0SVFZTUFRc2dBQ0FJSUFJZ0EwS0FnSUNBTUVLQWdJQ0FNQ0FGUVlmT0FISVFnUVFoQmdzZ0FDQURFQThMSUFkQklHb2tBQ0FHQzIwQkFuOENRQ0FCUW9DQWdJQndWQTBBSUFHbklnTXZBUVlRN2dGRkRRQWdBeWdDSUMwQUVVRUljVVVOQUNBREtBSW9JZ1FFUUNBQUlBU3RRb0NBZ0lCd2hCQVBDMEVBSVFBZ0FrS0FnSUNBY0ZvRVFDQUNweUlBSUFBb0FnQkJBV28yQWdBTElBTWdBRFlDS0FzTERBQWdBRUgyMGdCQkFCQVZDOEVDQWdaL0FYNGpBRUVRYXlJR0pBQUNRQ0FDUXYvLy8vOXZXQVJBSUFCQnZ6RkJBQkFWREFFTElBQWdCa0VNYWlBQ0VOWUJEUUFnQmlnQ0RDSUVRWUdBQkU4RVFDQUFRY0F6UVFBUVJnd0JDeUFBUVFFZ0JDQUVRUUZORzBFRGRCQmZJZ1ZGRFFBQ1FBSkFJQUtuSWdjdkFRWWlDRUVJUnlBSVFRSkhjUTBBSUFjdEFBVkJDSEZGRFFBZ0JDQUhLQUlvUncwQUEwQWdBeUFFUmcwQ0lBTkJBM1FpQ0NBSEtBSWthaWtEQUNJQ1FpQ0lwMEYxVHdSQUlBS25JZ0FnQUNnQ0FFRUJhallDQUFzZ0JTQUlhaUFDTndNQUlBTkJBV29oQXd3QUN3QUxBMEFnQXlBRVJnMEJJQUFnQWlBREVMQUJJZ2xDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FGSUFOQkEzUnFJQWszQXdBZ0EwRUJhaUVEREFFTEN5QUFJQVVnQXhDYkEwRUFJUU1NQVFzZ0FTQUVOZ0lBSUFVaEF3c2dCa0VRYWlRQUlBTUxuUUlDQW44QmZnSitRb0NBZ0lEZ0FDQUFFSHNOQUJvQ1FBSkFJQUZDZ0lDQWdIQmFCRUFnQWFjaUJ5MEFCVUVRY1VVRVFDQUFRYUkrUVFBUUZVS0FnSUNBNEFBUEN5QUZRUUZ5SVFZZ0J5OEJCaUlGUVExR0RRSWdBQ2dDRUNnQ1JDQUZRUmhzYWlnQ0VDSUZEUUVMSUFCQm04d0FRUUFRRlVLQWdJQ0E0QUFQQ3lBQUlBRWdBaUFESUFRZ0JpQUZFUllBRHdzZ0J5Z0NJQzBBRVVFRWNRUkFJQUFnQVVLQWdJQ0FNQ0FDSUFNZ0JDQUdFTmdCRHd0Q2dJQ0FnT0FBSUFBZ0FrRUJFR1VpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2lBQUlBRWdDQ0FDSUFNZ0JDQUdFTmdCSWdGQy8vLy8vMjlZSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkp4UlFSQUlBQWdDQkFQSUFFUEN5QUFJQUVRRHlBSUN3dm1BUUVEZnlBQlFSeHFJUVFnQVVFWWFpRUZBMEFnQlNBRUtBSUFJZ1JIQkVBQ1FDQUVRUUpyTHdFQUlBSkhEUUFnQkVFRGF5MEFBRUVCZGtFQmNTQURSdzBBSUFSQkNHc2lBQ0FBS0FJQVFRRnFOZ0lBSUFBUEN5QUVRUVJxSVFRTUFRc0xJQUJCSUJBcElnQkZCRUJCQUE4TElBQkJBVFlDQUNBQUlBSTdBUVlnQUNBQUxRQUZRZndCY1NBRFFRRjBRUUp4Y2pvQUJTQUJLQUlZSWdRZ0FFRUlhaUlHTmdJRUlBQWdCVFlDRENBQUlBUTJBZ2dnQVNBR05nSVlJQUZCRUVFVUlBTWJhaWdDQUNFQklBQkNnSUNBZ0RBM0F4Z2dBQ0FCSUFKQkEzUnFOZ0lRSUFBTGl3SUNBWDhCZmdKQUFrQWdBQ0FCcHlJRUx3QVJRUU4yUVFaeFFhN0FBV292QVFBUWRpSUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQU1BUXNDUUNBQUlBVWdCQ0FDSUFNUTFnVWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQVNBRUtBSWNJZ0pCTHlBQ0d5QUVMd0VzRUpZRElBUXZBQkVpQWtFUWNRUkFJQUFnQUNnQ0tFSElBMEg0QWlBQ1FUQnhRVEJHRzJvcEF3QVFSeUlGUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQUNBQlFUc2dCVUVDRUJrYUlBRVBDeUFDUVFGeFJRMENJQUZDZ0lDQWdIQmFCRUFnQWFjaUFpQUNMUUFGUVJCeU9nQUZDeUFBSUFGQk8wRUFRUUJCQWhDVkF4b2dBUThMQ3lBQUlBRVFEMEtBZ0lDQTRBQWhBUXNnQVF0WUFnRi9BWDVDZ0lDQWdDQWhBMEVTSUFGQ0lJaW5JZ0pCQzJvZ0FrRUhhMEZ1U1JzaUFrRVNTMEdmc0JBZ0FuWkJBWEZGY2dSK1FvQ0FnSUFnQlNBQUtBSW9JQUpCQW5SQnNQMEJhaWdDQUVFRGRHb3BBd0FMQzZjREFnRitBMzhqQUVFd2F5SUVKQUJCNVA4QUlRVkNnSUNBZ09BQUlRTUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0JCQnlBQlFpQ0lweUlHSUFaQkIydEJia2tiUVF0cURoTUtDQWtHQUFzTEN3c01CUUVDQXdRTEN3NEhDd3NnQmtGMVNRME1JQUduSWdBZ0FDZ0NBRUVCYWpZQ0FBd01DeUFFSUFFK0FnQWdCRUVRYWlJRlFTQkI5UHNBSUFRUVRob01DZ3NnQUVFRFFRSWdBYWNiRUMwaEF3d0xDeUFBUVFFUUxTRUREQW9MSUFCQnhRQVFMU0VEREFrTElBQWdBVUVBRUpBQ0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUU1NQ1FzZ0FDQUJJQUlRamdRaEF5QUFJQUVRRHd3SUN5QUNCRUFnQmtGMVNRMEhJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FBd0hDeUFBUWVuYUFFRUFFQlVNQndzZ0FDQUJRb0NBZ0lEQWdZRDgvd0I4djBFS1FRQkJBQkNQQWlFRERBWUxJQUFnQVNBQUtBSVFLQUtVQWhFSUFDRUREQVVMSUFBZ0FTQUFLQUlRS0FLd0FoRUlBQ0VEREFRTElBQWdBU0FBS0FJUUtBTE1BaEVJQUNFRERBTUxRZEgvQUNFRkN5QUFJQVVRWWlFRERBRUxJQUVoQXdzZ0JFRXdhaVFBSUFNTFhBRURmeUFBUWZRQmFpRUVJQUFvQXZnQklRTURRQ0FFSUFNaUFrY0VRQ0FDS0FJRUlRTUNRQUpBQWtBZ0FRNERBZ0FCQkFzZ0FpMEFUQTBEREFFTElBSXBBa3hDSUlaQ09JZW5EUUlMSUFBZ0FrRUlheERuQlF3QkN3c0xVQUVEZnlBQUtBTFVBU0FCS0FJVVFTQWdBQ2dDeUFGcmRrRUNkR29oQWdOQUlBSWlBeWdDQUNJRVFTaHFJUUlnQVNBRVJ3MEFDeUFESUFFb0FpZzJBZ0FnQUNBQUtBTFFBVUVCYXpZQzBBRUxNUUlCZndGK0lBQWdBUkF0SWdOQ2dJQ0FnSENEUW9DQWdJRGdBRklFUUNBQUlBTVFzd0VoQWlBQUlBTVFEd3NnQWdzM0FDQUFJQUVnQWlBREFuOUJBQ0FBS0FJUUlnQXRBSWdCRFFBYVFRRWdBQ2dDakFFaUFFVU5BQm9nQUNrRENCQ2pBMFVMRVBBRkMvb0VBUVYvSUFBb0FnQWhBd0pBQWtBRFFDQURMUUFBSVFRZ0F5RUNBa0FEUUNBQ1FRRnFJUU1nQkNJR1FTOUhCRUFnQmtFSmF5SUZRUmRMRFFSQkFTQUZkQ0lGUVkyQWdBUnhEUU1nQlVFU2NVVU5CQ0FCUlEwRERBSUxJQU10QUFBaUFrRXFSZ1JBSUFNaEFnTkFJQUlpQTBFQmFpRUNJQU10QUFFaUJFRU5Sd1JBSUFSRkRRTWdBVUVBSUFSQkNrWWJEUVFnQkVFcVJ3MEJJQU10QUFKQkwwY05BU0FEUVFOcUlRTU1CUXNnQVVVTkFBc01BZ3NMUVM4aEJTQUNRUzlIRFFOQkx5RUVJQUVOQUFOQUFrQUNRQ0FFSWdKQkNtc09CQVFCQVFRQUN5QUNSUTBEQ3lBRExRQUJJUVFnQTBFQmFpRUREQUFMQUFzTFFRb1BDMEU5SVFVQ2Z5QUdRVDFHQkVCQnBuOGdBeTBBQUVFK1JnMEJHZ3dDQ3lBRUlnVVE3d0pGRFFFQ1FBSkFBa0FDUUFKQUlBUWlBVUhsQUdzT0JRRUNCQVFBQXdzQ1FBSkFJQU10QUFCQjdRQnJEZ0lCQUFVTElBSXRBQUlReFFFTkJFRzVmdzhMSUFJdEFBSkI4QUJIRFFNZ0FpMEFBMEh2QUVjTkF5QUNMUUFFUWZJQVJ3MERJQUl0QUFWQjlBQkhEUU1nQWkwQUJoREZBUTBESUFBZ0FrRUdhallDQUVGUER3c2dBeTBBQUVINEFFY05BaUFDTFFBQ1FmQUFSdzBDSUFJdEFBTkI3d0JIRFFJZ0FpMEFCRUh5QUVjTkFpQUNMUUFGUWZRQVJ3MENJQUl0QUFZUXhRRU5BaUFBSUFKQkJtbzJBZ0JCVFE4TElBTXRBQUJCOVFCSERRRWdBaTBBQWtIdUFFY05BU0FDTFFBRFFlTUFSdzBCSUFJdEFBUkI5QUJIRFFFZ0FpMEFCVUhwQUVjTkFTQUNMUUFHUWU4QVJ3MEJJQUl0QUFkQjdnQkhEUUVnQWkwQUNCREZBUTBCUVVjUEN5QUJRZThBUncwQUlBTXRBQUJCNWdCSERRQWdBaTBBQWhERkFRMEFRVnNQQzBHRGZ3c1BDeUFGQzRVSkFnUi9DWDRqQUVIZ0FHc2lCQ1FBUW9DQWdJQXdJUXNnQkVLQWdJQ0FNRGNETUNBRVFvQ0FnSUF3TndNb0lBUkNnSUNBZ0RBM0F4Z2dCQ0FFUWNnQWFpSUdOZ0pBSUFRZ0FFRXZFQzBpQ2pjRE9DQUFJQVpCQUJBOUdpQUVJQUFRUGlJSU53TWdRb0NBZ0lEZ0FDRUpBa0FDUUNBSVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBQ1FBSkFJQUFnQWhBNEJFQWdCQ0FDTndNWURBRUxJQUFnQWhES0FTSUZRUUJJRFFJZ0JVVU5BQ0FFSUFBUVBpSU5Od01vSUExQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQWlBQUlBUkJDR29nQWhBOERRSWdCQ2tEQ0NJSlFnQWdDVUlBVlJzaEVBTkFJQXdnRUZFTkFTQUVJQUFnQWlBTUVITWlDRGNERUVLQWdJQ0E0QUFoQ1NBSVFvQ0FnSUJ3Z3lJUFFvQ0FnSURnQUZFTkF3SkFBa0FDUUNBSVFvQ0FnSUJ3V2dSQUlBaW5Md0VHUWY3L0EzRkJCRWNOQWlBRUlBQWdDQkEzSWdnM0F4QWdDRUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQVlMSUFoQ0lJaW5JZ1ZCQUNBRlFRdHFRUkpKRzBVRVFDQUVJQUFnQ0JBM0lnZzNBeEFnQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBHREFFTElBOUNnSUNBZ0pCL1VnMEJDeUFBSUExQkFTQUVRUkJxRU5ZRElnOUNnSUNBZ1BBQWcwS0FnSUNBNEFCUkJFQWdBQ0FJRUE4TUJnc2dBQ0FQRUNZTkFDQUFJQTBnRGlBSUVJWUJHaUFPUWdGOElRNE1BUXNnQUNBSUVBOExJQXhDQVh3aERBd0FDd0FMSUFOQ0lJaW5JZ1ZCZFU4RVFDQURweUlISUFjb0FnQkJBV28yQWdBTEFrQWdBMEtBZ0lDQWNGb0VRQUpBQWtBQ1FDQURweThCQmtFRWF3NENBQUVDQ3lBQUlBTVFqUUVoQXd3QkN5QUFJQU1RTnlFREMwS0FnSUNBNEFBaENTQURRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBMElnaUtjaEJRc0NRQ0FGUVFBZ0JVRUxha0VTU1J0RkJFQWdBQ0FFUVFScUlBTkJDa0VBRUZjTkF5QUVJQUJCKzVrQklBUW9BZ1FRa3dJaUFqY0RNQXdCQ3lBRFFvQ0FnSUJ3ZzBLQWdJQ0FrSDlSQkVBZ0JDQUFJQU9uSWdWQkFFRUtJQVVvQWdSQi8vLy8vd2R4SWdVZ0JVRUtUeHNRaEFFaUFqY0RNQXdCQ3lBS1FpQ0lwMEYxVHdSQUlBcW5JZ1VnQlNnQ0FFRUJhallDQUFzZ0JDQUtOd013SUFvaEFnc2dBQ0FERUE5Q2dJQ0FnT0FBSVFrZ0FrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ0lBQVFOQ0lMUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJDZ0lDQWdPQUFJUXNNQXdzZ0FVSWdpS2NpQlVGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dBQ0FMUVM4Z0FVRUhFQmxCQUVnTkFpQUZRWFZQQkVBZ0FhY2lCU0FGS0FJQVFRRnFOZ0lBQzBLQWdJQ0FNQ0VKSUFBZ0JFRVlhaUFMSUFFZ0NoRFZBeUlDUW9DQWdJQndneUlCUW9DQWdJQXdVUTBDUW9DQWdJRGdBQ0VKSUFGQ2dJQ0FnT0FBVVFSQUlBRWhDUXdEQ3lBQUlBUkJHR29nQWlBS0VOUURJUVVnQkNnQ1FDRUdJQVVOQWlBR0VEWWhDUXdEQ3lBQUlBTVFEd3dCQzBLQWdJQ0E0QUFoQ1FzZ0JpZ0NBQ2dDRUNJRlFSQnFJQVlvQWdRZ0JTZ0NCQkVBQUNBR1FRQTJBZ1FMSUFBZ0N4QVBJQUFnQkNrRE9CQVBJQUFnQkNrRE1CQVBJQUFnQkNrREtCQVBJQUFnQkNrRElCQVBJQVJCNEFCcUpBQWdDUXZGQkFJSWZ3RitBa0FDUUFKQUFrQUNRQ0FDUW9DQWdJQndnMEtBZ0lDQWtIOVNCRUFnQUNBQ0VDZ2lBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQUtuSVFRTUFRc2dBcWNpQkNBRUtBSUFRUUZxTmdJQUN5QUVRUkJxSVFjZ0JDa0NCQ0lNcDBILy8vLy9CM0VoQmdKQUlBeENnSUNBZ0FpRFVBUkFRUUFoQkVFQUlRTURRQ0FFSUFaR1JRUkFJQU1nQkNBSGFpMEFBRUVIZG1vaEF5QUVRUUZxSVFRTUFRc0xJQU5GQkVBZ0J5RUVJQUVOQkF3R0N5QUFJQU1nQm1wQkFCRHFBU0lJUlEwQ0lBaEJFR29oQkVFQUlRTURRQ0FESUFaR0RRSWdBeUFIYWl3QUFDSUZRUUJPQkg4Z0JFRUJhZ1VnQkNBRlFUOXhRWUFCY2pvQUFTQUZRY0FCY1VFR2RrRkFjaUVGSUFSQkFtb0xJUWtnQkNBRk9nQUFJQU5CQVdvaEF5QUpJUVFNQUFzQUN5QUFJQVpCQTJ4QkFCRHFBU0lJUlEwQklBaEJFR29oQkFOQUlBVWlDaUFHVGcwQklBcEJBV29oQlNBSElBcEJBWFJxTHdFQUlnbEIvd0JOQkVBZ0JDQUpPZ0FBSUFSQkFXb2hCQVVDUUNBSlFZRDRBM0ZCZ0xBRFJ5QURjaUFGSUFaT2NnMEFJQWNnQlVFQmRHb3ZBUUFpQzBHQStBTnhRWUM0QTBjTkFDQUpRUXAwUVlENFAzRWdDMEgvQjNGeVFZQ0FCR29oQ1NBS1FRSnFJUVVMSUFRZ0NSQ2hBeUFFYWlFRUN3d0FDd0FMSUFSQkFEb0FBQ0FJSUFRZ0NFRVFhaUlIYTBILy8vLy9CM0d0SUFncEFnUkNnSUNBZ0hpRGhEY0NCQ0FBSUFJUUR5QUJSUTBDSUFnb0FnUkIvLy8vL3dkeElRWU1BUXRCQUNFR1FRQWhCMEVBSVFRZ0FVVU5BZ3NnQVNBR05nSUFDeUFISVFRTElBUUxqd01CQkg4akFFRVFheUlFSkFBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUJRaUNJcHlJQ1FRdHFEZ3NEQWdJRUFBVUZCUVlCQVFVTElBR25JZ0lwQWdSQ2dJQ0FnSUNBZ0lEQUFGUU5CaUFBSUFJUW9nTU1Cd3NnQUMwQWFFRUNSZzBHSUFHbklnSW9BZ2dpQXlBQ0tBSU1JZ1UyQWdRZ0JTQUROZ0lBSUFKQkFEWUNEQ0FBS0FKY0lRTWdBQ0FDUVFocUlnVTJBbHdnQWlBRE5nSU1JQUlnQUVIWUFHb2lBallDQ0NBRElBVTJBZ0FnQUMwQWFBMEdJQUJCQVRvQWFBTkFJQUlnQUNnQ1hDSURSd1JBSUFOQkNHc2lBeWdDQUEwSklBQWdBeER0QlF3QkN3c2dBRUVBT2dCb0RBWUxJQUduSWdKQkJHb1FHeUFBUVJCcUlBSWdBQ2dDQkJFQUFBd0ZDeUFCcHlJQ1FRUnFFQnNnQUVFUWFpQUNJQUFvQWdRUkFBQU1CQXNnQUNBQnB4Q2lBd3dEQ3lBRUlBSTJBZ0FqQUVFUWF5SUFKQUFnQUNBRU5nSU1RWkRJQkVHVG13RWdCQkNiQkNBQVFSQnFKQUFMRUFFQUN5QUFRUkJxSUFJZ0FDZ0NCQkVBQUFzZ0JFRVFhaVFBRHd0QjRZNEJRYTc4QUVIYktrSFhKeEFBQUFzZ0FRRitJQUFnQUNBQ0lBRkJBVUVDUVFBUWdnRWlCQ0FCSUFNUTNnRWdCQXY5Q1FJTGZ3RitJd0JCd0FKcklnTWtBQUpBSUFKQ2dJQ0FnSENEUW9DQWdJQXdVZ1JBUW9DQWdJRGdBQ0VPSUFBZ0EwSGNBR29nQWhEbEFTSUdSUTBCSUFNb0Fsd2hDQU5BSUFRZ0NFY0VRQUpBSUFRZ0Jtb3NBQUJCNXdCclFSOTNJZ2RCQ1V0Qnl3VWdCM1pCQVhGRmNrVUVRQ0FIUVFKMFFmejlBV29vQWdBaUJ5QUZjVVVOQVFzZ0FDQUdFRlFnQUVIUU9FRUFFSUFDREFRTElBUkJBV29oQkNBRklBZHlJUVVNQVFzTElBQWdCaEJVQzBLQWdJQ0E0QUFoRGlBQUlBTkIzQUJxSUFFZ0JVRUVka0VCY1NJRVJSQ1ZCQ0lJUlEwQUlBTW9BbHdoQmlBRFFid0Jha0VBUVlBQkVDc2FJQU5DQURjRGFDQURRZ0EzQXF3QklBTWdBRFlDdUFFZ0EwRTBOZ0swQVNBRFFYODJBcHdCSUFOQ2dZQ0FnSEEzQXBRQklBTWdCRFlDaUFFZ0F5QUlOZ0tBQVNBRElBWWdDR28yQW53Z0F5QUlOZ0o0SUFNZ0FEWUNvQUVnQTBJQU53TmdJQU1nQURZQ2RDQURRZ0EzQXFRQklBTkJORFlDY0NBRElBVTJBb1FCSUFNZ0JVRURka0VCY1RZQ2tBRWdBeUFGUVFGMlFRRnhOZ0tNQVNBRFFlQUFhaUlFSUFWQi93RnhFQkVnQkVFQUVCRWdCRUVBRUJFZ0JFRUFFQjBnQlVFZ2NVVUVRQ0FEUWVBQWFpSUVRUWhCQmhDNEFSb2dCRUVFRUJFZ0JFRUhRWFVRdUFFYUN5QURRZUFBYWlJRVFRdEJBQkNwQWdKL0FrQWdCRUVBRVBJQ0RRQWdBMEhnQUdvaUJFRU1RUUFRcVFJZ0JFRUtFQkVnQXlnQ2VDMEFBQVJBSUFOQjRBQnFRWS96QUVFQUVEb01BUXNnQXlnQ2JBUkFJQU5CNEFCcUVLZ0NEQUVMSUFNb0FtUkJCMnNoQ3lBREtBSmdJZ3hCQjJvaERVRUFJUVJCQUNFRkFrQUNRQUpBQWtBQ1FBTkFJQVVnQzBnRVFDQUZJQTFxSWdZdEFBQWlDa0VkVHcwRUlBVWdDa0h3Z1FKcUxRQUFJZ2RxSUF0S0RRVUNRQUpBQWtBQ1FBSkFJQXBCRDJzT0RBQUJCQVFFQkFJREJBUUFBUVFMSUFSQkFXb2hCaUFFSUFsSUJFQWdCaUVFREFRTElBUkIvZ0ZLSVFvZ0JpSUVJUWtnQ2tVTkF3d0dDeUFFUVFCTURRa2dCRUVCYXlFRURBSUxJQVl2QUFGQkFuUWdCMm9oQnd3QkN5QUdMd0FCUVFOMElBZHFJUWNMSUFVZ0Iyb2hCUXdCQ3dzZ0NVRUFUZzBCQ3lBRFFlQUFha0hqTlVFQUVEb01CQXNnRENBREtBS1VBVG9BQVNBREtBSmdJQWs2QUFJZ0F5Z0NZQ0FES0FKa1FRZHJOZ0FESUFNb0FxZ0JJZ1FnQXlnQ2xBRkJBV3RMQkVBZ0EwSGdBR29nQXlnQ3BBRWdCQkJ5SUFNb0FtQWlCQ0FFTFFBQVFZQUJjam9BQUFzZ0F5Z0NwQUVpQkFSQUlBTW9BcmdCSUFSQkFDQURLQUswQVJFQkFCb0xJQU5CQURvQUVDQURLQUpnSVFVZ0F5Z0NaQXdFQzBHeGdRRkJ3UHdBUWZvTlFZVGdBQkFBQUF0Qjd0QUFRY0Q4QUVIN0RVR0U0QUFRQUFBTFFmU05BVUhBL0FCQmlBNUJoT0FBRUFBQUN5QURLQUpnSWdRRVFDQURLQUowSUFSQkFDQURLQUp3RVFFQUdnc2dBMElBTndOd0lBTkNBRGNEYUNBRFFnQTNBMkFnQXlnQ3BBRWlCQVJBSUFNb0FyZ0JJQVJCQUNBREtBSzBBUkVCQUJvTElBTkJwQUZxSWdSQ0FEY0NBQ0FFUWdBM0FoQWdCRUlBTndJSUlBTkJ2QUZxSVFSQkFDRUZBMEFnQTBFUWFpQUZhaUVHSUFRdEFBQWlCMFVnQlVFK1MzSkZCRUFnQmlBSE9nQUFJQVZCQVdvaEJTQUVRUUZxSVFRTUFRc0xJQVpCQURvQUFFRUFJUVZCQUFzaEJDQUFJQWdRVkNBRlJRUkFJQU1nQTBFUWFqWUNBQ0FBUVpVOUlBTVFnQUlNQVFzZ0FDQUZJQVFRaEFNaERpQUFLQUlRSWdCQkVHb2dCU0FBS0FJRUVRQUFDeUFEUWNBQ2FpUUFJQTRMMUFJQkJIOGpBRUhRQVdzaUJTUUFJQVVnQWpZQ3pBRWdCVUdnQVdvaUFrRUFRU2dRS3hvZ0JTQUZLQUxNQVRZQ3lBRUNRRUVBSUFFZ0JVSElBV29nQlVIUUFHb2dBaUFESUFRUWhBWkJBRWdFUUVGL0lRUU1BUXNnQUNnQ1RFRUFUaUVHSUFBb0FnQWhCeUFBS0FKSVFRQk1CRUFnQUNBSFFWOXhOZ0lBQ3dKL0FrQUNRQ0FBS0FJd1JRUkFJQUJCMEFBMkFqQWdBRUVBTmdJY0lBQkNBRGNERUNBQUtBSXNJUWdnQUNBRk5nSXNEQUVMSUFBb0FoQU5BUXRCZnlBQUVNNEREUUVhQ3lBQUlBRWdCVUhJQVdvZ0JVSFFBR29nQlVHZ0FXb2dBeUFFRUlRR0N5RUNJQWdFUUNBQVFRQkJBQ0FBS0FJa0VRRUFHaUFBUVFBMkFqQWdBQ0FJTmdJc0lBQkJBRFlDSENBQUtBSVVJUUVnQUVJQU53TVFJQUpCZnlBQkd5RUNDeUFBSUFBb0FnQWlBQ0FIUVNCeGNqWUNBRUYvSUFJZ0FFRWdjUnNoQkNBR1JRMEFDeUFGUWRBQmFpUUFJQVFMSkFBZ0FFSUFOd053SUFBZ0FDZ0NDRFlDYUNBQUlBQW9BaXdnQUNnQ0JHdXNOd040Q3hBQUlBQWdBU0FDUVFCQkFCQ1pCQm9MdFJnREZIOEVmQUYrSXdCQk1Hc2lDU1FBQWtBQ1FBSkFJQUM5SWhwQ0lJaW5JZ0pCLy8vLy93ZHhJZ05CK3RTOWdBUk5CRUFnQWtILy96OXhRZnZESkVZTkFTQURRZnl5aTRBRVRRUkFJQnBDQUZrRVFDQUJJQUJFQUFCQVZQc2grYitnSWdCRU1XTmlHbUcwMEwyZ0loWTVBd0FnQVNBQUlCYWhSREZqWWhwaHROQzlvRGtEQ0VFQklRSU1CUXNnQVNBQVJBQUFRRlQ3SWZrL29DSUFSREZqWWhwaHROQTlvQ0lXT1FNQUlBRWdBQ0FXb1VReFkySWFZYlRRUGFBNUF3aEJmeUVDREFRTElCcENBRmtFUUNBQklBQkVBQUJBVlBzaENjQ2dJZ0JFTVdOaUdtRzA0TDJnSWhZNUF3QWdBU0FBSUJhaFJERmpZaHBodE9DOW9Ea0RDRUVDSVFJTUJBc2dBU0FBUkFBQVFGVDdJUWxBb0NJQVJERmpZaHBodE9BOW9DSVdPUU1BSUFFZ0FDQVdvVVF4WTJJYVliVGdQYUE1QXdoQmZpRUNEQU1MSUFOQnU0enhnQVJOQkVBZ0EwRzgrOWVBQkUwRVFDQURRZnl5eTRBRVJnMENJQnBDQUZrRVFDQUJJQUJFQUFBd2YzelpFc0NnSWdCRXlwU1RwNUVPNmIyZ0loWTVBd0FnQVNBQUlCYWhSTXFVazZlUkR1bTlvRGtEQ0VFRElRSU1CUXNnQVNBQVJBQUFNSDk4MlJKQW9DSUFSTXFVazZlUkR1azlvQ0lXT1FNQUlBRWdBQ0FXb1VUS2xKT25rUTdwUGFBNUF3aEJmU0VDREFRTElBTkIrOFBrZ0FSR0RRRWdHa0lBV1FSQUlBRWdBRVFBQUVCVSt5RVp3S0FpQUVReFkySWFZYlR3dmFBaUZqa0RBQ0FCSUFBZ0ZxRkVNV05pR21HMDhMMmdPUU1JUVFRaEFnd0VDeUFCSUFCRUFBQkFWUHNoR1VDZ0lnQkVNV05pR21HMDhEMmdJaFk1QXdBZ0FTQUFJQmFoUkRGallocGh0UEE5b0RrRENFRjhJUUlNQXdzZ0EwSDZ3K1NKQkVzTkFRc2dBQ0FBUklQSXlXMHdYK1Evb2tRQUFBQUFBQUE0UTZCRUFBQUFBQUFBT01PZ0loZEVBQUJBVlBzaCtiK2lvQ0lXSUJkRU1XTmlHbUcwMEQyaUloaWhJaGxFR0MxRVZQc2g2YjlqSVFRQ2Z5QVhtVVFBQUFBQUFBRGdRV01FUUNBWHFnd0JDMEdBZ0lDQWVBc2hBZ0pBSUFRRVFDQUNRUUZySVFJZ0YwUUFBQUFBQUFEd3Y2QWlGMFF4WTJJYVliVFFQYUloR0NBQUlCZEVBQUJBVlBzaCtiK2lvQ0VXREFFTElCbEVHQzFFVlBzaDZUOWtSUTBBSUFKQkFXb2hBaUFYUkFBQUFBQUFBUEEvb0NJWFJERmpZaHBodE5BOW9pRVlJQUFnRjBRQUFFQlUreUg1djZLZ0lSWUxJQUVnRmlBWW9TSUFPUU1BQWtBZ0EwRVVkaUlFSUFDOVFqU0lwMEgvRDNGclFSRklEUUFnQVNBV0lCZEVBQUJnR21HMDBEMmlJZ0NoSWhrZ0YwUnpjQU11aWhtak82SWdGaUFab1NBQW9hRWlHS0VpQURrREFDQUVJQUM5UWpTSXAwSC9EM0ZyUVRKSUJFQWdHU0VXREFFTElBRWdHU0FYUkFBQUFDNktHYU03b2lJQW9TSVdJQmRFd1VrZ0pacURlem1pSUJrZ0ZxRWdBS0doSWhpaElnQTVBd0FMSUFFZ0ZpQUFvU0FZb1RrRENBd0JDeUFEUVlDQXdQOEhUd1JBSUFFZ0FDQUFvU0lBT1FNQUlBRWdBRGtEQ0VFQUlRSU1BUXNnR2tMLy8vLy8vLy8vQjROQ2dJQ0FnSUNBZ0xEQkFJUy9JUUJCQUNFQ1FRRWhCQU5BSUFsQkVHb2dBa0VEZEdvQ2Z5QUFtVVFBQUFBQUFBRGdRV01FUUNBQXFnd0JDMEdBZ0lDQWVBdTNJaFk1QXdBZ0FDQVdvVVFBQUFBQUFBQndRYUloQUVFQklRSWdCQ0VHUVFBaEJDQUdEUUFMSUFrZ0FEa0RJRUVDSVFJRFFDQUNJZ3BCQVdzaEFpQUpRUkJxSUFwQkEzUnFLd01BUkFBQUFBQUFBQUFBWVEwQUN5QUpRUkJxSVE0akFFR3dCR3NpQlNRQUlBTkJGSFpCbGdocklnSkJBMnRCR0cwaUJrRUFJQVpCQUVvYklnOUJhR3dnQW1vaEJrR1Vxd1FvQWdBaUN5QUtRUUZxSWd4QkFXc2lDR3BCQUU0RVFDQUxJQXhxSVFJZ0R5QUlheUVEQTBBZ0JVSEFBbW9nQkVFRGRHb2dBMEVBU0FSOFJBQUFBQUFBQUFBQUJTQURRUUowUWFDckJHb29BZ0MzQ3prREFDQURRUUZxSVFNZ0JFRUJhaUlFSUFKSERRQUxDeUFHUVJocklRcEJBQ0VDSUF0QkFDQUxRUUJLR3lFRUlBeEJBRXdoRFFOQUFrQWdEUVJBUkFBQUFBQUFBQUFBSVFBTUFRc2dBaUFJYWlFSFFRQWhBMFFBQUFBQUFBQUFBQ0VBQTBBZ0RpQURRUU4wYWlzREFDQUZRY0FDYWlBSElBTnJRUU4wYWlzREFLSWdBS0FoQUNBRFFRRnFJZ01nREVjTkFBc0xJQVVnQWtFRGRHb2dBRGtEQUNBQ0lBUkdJUU1nQWtFQmFpRUNJQU5GRFFBTFFTOGdCbXNoRTBFd0lBWnJJUkFnQmtFWlNDRVJJQVpCR1dzaEZDQUxJUUlDUUFOQUlBVWdBa0VEZEdvckF3QWhBRUVBSVFNZ0FpRUVJQUpCQUV3aUIwVUVRQU5BSUFWQjRBTnFJQU5CQW5ScUFuOENmeUFBUkFBQUFBQUFBSEErb2lJV21VUUFBQUFBQUFEZ1FXTUVRQ0FXcWd3QkMwR0FnSUNBZUF1M0loWkVBQUFBQUFBQWNNR2lJQUNnSWdDWlJBQUFBQUFBQU9CQll3UkFJQUNxREFFTFFZQ0FnSUI0Q3pZQ0FDQUZJQVJCQVdzaUJFRURkR29yQXdBZ0ZxQWhBQ0FEUVFGcUlnTWdBa2NOQUFzTEFuOGdBQ0FLRU5vQklnQWdBRVFBQUFBQUFBREFQNktjUkFBQUFBQUFBQ0RBb3FBaUFKbEVBQUFBQUFBQTRFRmpCRUFnQUtvTUFRdEJnSUNBZ0hnTElRZ2dBQ0FJdDZFaEFBSkFBa0FDUUFKL0lCRkZCRUFnQWtFQ2RDQUZhaUlFSUFRb0F0d0RJZ1FnQkNBUWRTSUVJQkIwYXlJRE5nTGNBeUFFSUFocUlRZ2dBeUFUZFF3QkN5QUtEUUVnQWtFQ2RDQUZhaWdDM0FOQkYzVUxJZzFCQUV3TkFnd0JDMEVDSVEwZ0FFUUFBQUFBQUFEZ1AyWU5BRUVBSVEwTUFRdEJBQ0VEUVFBaEJDQUhSUVJBQTBBZ0JVSGdBMm9nQTBFQ2RHb2lGU2dDQUNFU1FmLy8vd2NoQndKL0FrQWdCQTBBUVlDQWdBZ2hCeUFTRFFCQkFBd0JDeUFWSUFjZ0VtczJBZ0JCQVFzaEJDQURRUUZxSWdNZ0FrY05BQXNMQWtBZ0VRMEFRZi8vL3dNaEF3SkFBa0FnRkE0Q0FRQUNDMEgvLy84QklRTUxJQUpCQW5RZ0JXb2lCeUFIS0FMY0F5QURjVFlDM0FNTElBaEJBV29oQ0NBTlFRSkhEUUJFQUFBQUFBQUE4RDhnQUtFaEFFRUNJUTBnQkVVTkFDQUFSQUFBQUFBQUFQQS9JQW9RMmdHaElRQUxJQUJFQUFBQUFBQUFBQUJoQkVCQkFTRURRUUFoQnlBQ0lRUUNRQ0FDSUF0TURRQURRQ0FGUWVBRGFpQUVRUUZySWdSQkFuUnFLQUlBSUFkeUlRY2dCQ0FMU2cwQUN5QUhSUTBBSUFvaEJnTkFJQVpCR0dzaEJpQUZRZUFEYWlBQ1FRRnJJZ0pCQW5ScUtBSUFSUTBBQ3d3REN3TkFJQU1pQkVFQmFpRURJQVZCNEFOcUlBc2dCR3RCQW5ScUtBSUFSUTBBQ3lBQ0lBUnFJUVFEUUNBRlFjQUNhaUFDSUF4cUlnaEJBM1JxSUFKQkFXb2lBaUFQYWtFQ2RFR2dxd1JxS0FJQXR6a0RBRUVBSVFORUFBQUFBQUFBQUFBaEFDQU1RUUJLQkVBRFFDQU9JQU5CQTNScUt3TUFJQVZCd0FKcUlBZ2dBMnRCQTNScUt3TUFvaUFBb0NFQUlBTkJBV29pQXlBTVJ3MEFDd3NnQlNBQ1FRTjBhaUFBT1FNQUlBSWdCRWdOQUFzZ0JDRUNEQUVMQ3dKQUlBQkJHQ0FHYXhEYUFTSUFSQUFBQUFBQUFIQkJaZ1JBSUFWQjRBTnFJQUpCQW5ScUFuOENmeUFBUkFBQUFBQUFBSEErb2lJV21VUUFBQUFBQUFEZ1FXTUVRQ0FXcWd3QkMwR0FnSUNBZUFzaUE3ZEVBQUFBQUFBQWNNR2lJQUNnSWdDWlJBQUFBQUFBQU9CQll3UkFJQUNxREFFTFFZQ0FnSUI0Q3pZQ0FDQUNRUUZxSVFJTUFRc0NmeUFBbVVRQUFBQUFBQURnUVdNRVFDQUFxZ3dCQzBHQWdJQ0FlQXNoQXlBS0lRWUxJQVZCNEFOcUlBSkJBblJxSUFNMkFnQUxSQUFBQUFBQUFQQS9JQVlRMmdFaEFDQUNRUUJPQkVBZ0FpRUVBMEFnQlNBRUlnWkJBM1JxSUFBZ0JVSGdBMm9nQkVFQ2RHb29BZ0Mzb2prREFDQUVRUUZySVFRZ0FFUUFBQUFBQUFCd1BxSWhBQ0FHRFFBTElBSWhCQU5BUkFBQUFBQUFBQUFBSVFCQkFDRURJQXNnQWlBRWF5SUdJQVlnQzBvYklncEJBRTRFUUFOQUlBTkJBM1JCOE1BRWFpc0RBQ0FGSUFNZ0JHcEJBM1JxS3dNQW9pQUFvQ0VBSUFNZ0NrY2hEQ0FEUVFGcUlRTWdEQTBBQ3dzZ0JVR2dBV29nQmtFRGRHb2dBRGtEQUNBRVFRQktJUVlnQkVFQmF5RUVJQVlOQUFzTFJBQUFBQUFBQUFBQUlRQWdBa0VBVGdSQUlBSWhCQU5BSUFRaUJrRUJheUVFSUFBZ0JVR2dBV29nQmtFRGRHb3JBd0NnSVFBZ0JnMEFDd3NnQ1NBQW1pQUFJQTBiT1FNQUlBVXJBNkFCSUFDaElRQkJBU0VESUFKQkFFb0VRQU5BSUFBZ0JVR2dBV29nQTBFRGRHb3JBd0NnSVFBZ0FpQURSeUVFSUFOQkFXb2hBeUFFRFFBTEN5QUpJQUNhSUFBZ0RSczVBd2dnQlVHd0JHb2tBQ0FJUVFkeElRSWdDU3NEQUNFQUlCcENBRk1FUUNBQklBQ2FPUU1BSUFFZ0NTc0RDSm81QXdoQkFDQUNheUVDREFFTElBRWdBRGtEQUNBQklBa3JBd2c1QXdnTElBbEJNR29rQUNBQ0MvNERBd044QW44QmZpQUF2U0lHUWlDSXAwSC8vLy8vQjNFaUJFR0FnTUNnQkU4RVFDQUFSQmd0UkZUN0lmay9JQUNtSUFDOVF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3c4TEFrQUNmeUFFUWYvLzcvNERUUVJBUVg4Z0JFR0FnSUR5QTA4TkFSb01BZ3NnQUpraEFDQUVRZi8veS84RFRRUkFJQVJCLy8rWC93Tk5CRUFnQUNBQW9FUUFBQUFBQUFEd3Y2QWdBRVFBQUFBQUFBQUFRS0NqSVFCQkFBd0NDeUFBUkFBQUFBQUFBUEMvb0NBQVJBQUFBQUFBQVBBL29LTWhBRUVCREFFTElBUkIvLytOZ0FSTkJFQWdBRVFBQUFBQUFBRDR2NkFnQUVRQUFBQUFBQUQ0UDZKRUFBQUFBQUFBOEQrZ295RUFRUUlNQVF0RUFBQUFBQUFBOEw4Z0FLTWhBRUVEQ3lFRklBQWdBS0lpQWlBQ29pSUJJQUVnQVNBQklBRkVMMnhxTEVTMG9yK2lSSnI5M2xJdDNxMi9vS0pFYlpwMHIvS3dzNytnb2tSeEZpUCt4bkc4djZDaVJNVHJtSm1abWNtL29LSWhBeUFDSUFFZ0FTQUJJQUVnQVVRUjJpTGpPcTJRUDZKRTZ3MTJKRXQ3cVQrZ29rUlJQZENnWmcyeFA2Q2lSRzRnVE1YTlJiYy9vS0pFLzRNQWtpUkp3aitnb2tRTlZWVlZWVlhWUDZDaUlRRWdCRUgvLysvK0EwMEVRQ0FBSUFBZ0F5QUJvS0toRHdzZ0JVRURkQ0lFUVpDcUJHb3JBd0FnQUNBRElBR2dvaUFFUWJDcUJHb3JBd0NoSUFDaG9TSUFtaUFBSUFaQ0FGTWJJUUFMSUFBTGlBRUJCSDhDUUFKL0FrQWdBMEVIY1NJSVFRWkhCRUJCSUNFSEEwQWdBQ0FCSUFJZ0Iyb2lDU0FGSUFRUkJ3QWlCa0VzY1EwRUlBWkJFSEZGRFFJZ0IwRUJkQ0VISUFBZ0FpQUlJQWtRNFFORkRRQUxRUkFNQWdzZ0FDQUJJQUlnQlNBRUVRY0FHZ3RCQUFzaEJpQUFLQUlNSWdGRkRRQWdBQ0FDSUFNZ0FTQUdFS29ESVFZTElBWUw0Z0VCQW44akFFRWdheUlFSkFBZ0FDQUJSd1JBQWtBQ1FBSkFJQUVvQWd4RkJFQUNRQUpBSUFFb0FnaEIvdi8vL3dkckRnSUFBd0VMSUFFb0FnUU5BaUFBUVFBUWpBRU1CQXNnQUVFQkVJd0JEQU1MSUFFb0FnUkZEUUVMSUFBUU5Rd0JDeUFBS0FJQUlRVWdCRUlBTndJWUlBUkNnSUNBZ0lDQWdJQ0FmemNDRUNBRUlBVTJBZ3dnQkVFTWFpSUZRZ0VRTUJvZ0FTQUZFSUlDQkVBZ0FFRUFFSWtCSUFSQkRHb1FHd3dCQ3lBRVFReHFFQnNnQUNBQklBSWdBMEhpQUVFQUVKNEVHZ3NnQkVFZ2FpUUFEd3RCMlAwQVFkVDhBRUczSTBHcTJnQVFBQUFMOGdJQkEzOGpBRUZBYWlJR0pBQUNRQ0FFSUFOcklnaEJBVVlFUUFKQUlBTkZCRUFnQVVJREVEQWFEQUVMSUFFZ0E2MFFNQm9nQVVFQk5nSUVDeUFDSUFOQkFYUkJBWEt0RURBYUlBSWdBaWdDQ0VFQ2FqWUNDQ0FBSUFFUVJCb01BUXNnQUNnQ0FDRUhJQUFnQVNBQ0lBTWdDRUVCZGlBRGFpSURRUUVRb0FRZ0JrSUFOd0k0SUFaQ2dJQ0FnSUNBZ0lDQWZ6Y0NNQ0FHSUFjMkFpd2dCa0lBTndJa0lBWkNnSUNBZ0lDQWdJQ0FmemNDSENBR0lBYzJBaGdnQmtJQU53SVFJQVpDZ0lDQWdJQ0FnSUNBZnpjQ0NDQUdJQWMyQWdRZ0JrRXNhaUlISUFaQkdHb2dCa0VFYWlJSUlBTWdCQ0FGRUtBRUlBQWdBQ0FJUWYvLy8vOERRUUVRUXhvZ0J5QUhJQUZCLy8vLy93TkJBUkJER2lBQUlBQWdCMEgvLy8vL0EwRUJFTXNCR2lBRkJFQWdBU0FCSUFaQkdHcEIvLy8vL3dOQkFSQkRHZ3NnQWlBQ0lBWkJCR29pQUVILy8vLy9BMEVCRUVNYUlBWkJMR29RR3lBR1FSaHFFQnNnQUJBYkN5QUdRVUJySkFBTHpnVUNCMzhEZmlNQVFUQnJJZ2drQUFKL0FrQUNRQUpBQWtBQ1FDQUREZ01BQVFJREMwSGNqQUZCMVB3QVFiVWFRWmI4QUJBQUFBc2dBU0FDS0FJUUlBSW9BZ3dpQUNBQVFRVjBJQUlvQWdockVHZzJBZ0FNQWdzZ0FpZ0NFQ0lESUFJb0Fnd2lBQ0FBUVFWMElBSW9BZ2hySWdKQklHb1FhSzFDSUlZZ0F5QUFJQUlRYUsyRUlROGdCa0dBbE92Y0EwWUVRQ0FCSUE5Q2dKVHIzQU9BSWhBK0FnUWdBU0FRUW9Ec2xLTU1maUFQZkQ0Q0FBd0NDeUFCSUE4Z0JxMGlFSUFpRVQ0Q0JDQUJJQThnRUNBUmZuMCtBZ0FNQVFzZ0FpZ0NBQ0VLSUFoQ0FEY0NLQ0FJUW9DQWdJQ0FnSUNBZ0g4M0FpQWdDQ0FLTmdJY0lBaENBRGNDRkNBSVFvQ0FnSUNBZ0lDQWdIODNBZ3dnQ0NBS05nSUlJQU1nQlVFQmRDQUVRUUZxSWd0MlFRRnFRUUYySWdwcklRd2dBQ0FFUVFGMFFRRnlRUlJzYWlFTlFRQWhBeUFBSUFSQktHeHFJZ1FvQWd4RkJFQWdCQ0FHSUFwQi8vLy8vd05CQVJEOEFpQUlRUWhxSWdsQ0FSQXdjaUFOSUFrZ0JDQUtRUUZxSUFkc1FRSnFRUUFRbFFGeUlRa0xBa0FDUUNBSVFSeHFJZzRnQWlBTklBY2dER3hCQUJCRElBbHlJQTVCQVJEUkFYSWdDRUVJYWlJSklBNGdCRUgvLy8vL0EwRUJFRU55SUFrZ0FpQUpRZi8vLy84RFFRRVE1QUZ5UVNCeERRQURRQUpBSUFnb0FneEZEUUFnQ0NnQ0ZFVU5BQ0FJUVFocUlnSWdBaUFFUWYvLy8vOERRUUVReXdFTkFpQURRUUZySVFNTUFRc0xBMEFnQ0VFSWFpQUVFTk1CUVFCT0JFQWdDRUVJYWlJQ0lBSWdCRUgvLy8vL0EwRUJFT1FCRFFJZ0EwRUJhaUVEREFFTEN5QURCRUFnQ0VFY2FpSUNJQUlnQTZ4Qi8vLy8vd05CQVJCMURRRUxJQUFnQVNBS1FRSjBhaUFJUVJ4cUlBd2dDeUFGSUFZZ0J4Q2hCQTBBSUFBZ0FTQUlRUWhxSUFvZ0N5QUZJQVlnQnhDaEJFVU5BUXNnQ0VFY2FoQWJJQWhCQ0dvUUcwRi9EQUlMSUFoQkhHb1FHeUFJUVFocUVCc0xRUUFMSVFNZ0NFRXdhaVFBSUFNTGhBRUJBbjhDUUNBQUlBRkhCRUFnQWtVRVFDQUFRZ0VRTUNFRkRBSUxRUjRnQW1kcklRWWdBQ0FCRUVRaEJRTkFJQVpCQUVnTkFpQUFJQUFnQUNBRElBUVFReUFGY2lFRklBSWdCblpCQVhFRVFDQUFJQUFnQVNBRElBUVFReUFGY2lFRkN5QUdRUUZySVFZTUFBc0FDMEhZL1FCQjFQd0FRZG9SUWV6WEFCQUFBQXNnQlF0MUFnSjhBWDRnQUFKK0VBd2lBVVFBQUFBQUFFQ1BRS01pQXBsRUFBQUFBQUFBNEVOakJFQWdBckFNQVF0Q2dJQ0FnSUNBZ0lDQWZ3c2lBemNEQUNBQUFuOGdBU0FEUXVnSGZybWhSQUFBQUFBQVFJOUFvaUlCbVVRQUFBQUFBQURnUVdNRVFDQUJxZ3dCQzBHQWdJQ0FlQXMyQWdnTGZRRUNmeU1BUVNCcklnWWtBQUpBSUFBZ0FVY2dBQ0FDUjNGRkJFQWdBQ2dDQUNFSElBWkNBRGNDR0NBR1FvQ0FnSUNBZ0lDQWdIODNBaEFnQmlBSE5nSU1JQVpCREdvaUJ5QUJJQUlnQXlBRUlBVVJDZ0FoQVNBQUlBY1FvQVlNQVFzZ0FDQUJJQUlnQXlBRUlBVVJDZ0FoQVFzZ0JrRWdhaVFBSUFFTDVnb0NDMzhEZmlNQVFSQnJJZzBrQUNBRUlBVkJBV3NpQmtFQ2RHb29BZ0FoQndKQUFrQUNRQ0FGUVFGR0JFQkJBQ0VHSUExQkFEWUNEQUpBSUFOQkFrMEVRQ0FIclNFUkEwQWdBMEVBVEEwQ0lBRWdBMEVCYXlJRFFRSjBJZ0JxSUFBZ0FtbzFBZ0FnQnExQ0lJYUVJaElnRVlBaUV6NENBQ0FTSUJFZ0UzNTlweUVHREFBTEFBc2dCMEYvYzYxQ0lJWkMvLy8vL3crRUlBZXRnS2NoQUFOQUlBTkJBV3NpQTBFQVNBMEJJQUVnQTBFQ2RDSUVhaUFOUVF4cUlBWWdBaUFFYWlnQ0FDQUhJQUFRbUFZMkFnQWdEU2dDRENFR0RBQUxBQXNnQWlBR05nSUFEQUVMQWtBQ1FBSkFBa0FDUUNBRElBVnJJZ2dnQlNBRklBaEtHMEV5VGdSQUlBZ0VRQ0FBS0FJQVFRQWdDRUVCYWlJT0lBZ2dCU0FJU3hzaUNVRUJhaUlNUVFKMElBQW9BZ1FSQVFBaUMwVWdBQ2dDQUVFQUlBeEJBM1FnQUNnQ0JCRUJBQ0lIUlhJTkJTQUZJQWxMRFFJZ0NTQUZheUVQUVFBaEJnTkFJQW9nRDBZRVFBTkFJQVVnQmtZTkJpQUhJQVlnRDJwQkFuUnFJQVFnQmtFQ2RHb29BZ0EyQWdBZ0JrRUJhaUVHREFBTEFBVWdCeUFLUVFKMGFrRUFOZ0lBSUFwQkFXb2hDZ3dCQ3dBTEFBdEJ6SXdCUWRUOEFFR2tDMEdWNndBUUFBQUxJQWhCQTA4RVFDQUhRWDl6clVJZ2hrTC8vLy8vRDRRZ0I2MkFweUVKQ3dKQUFrQUNRQU5BSUFaQkFFZ05BU0FHUVFKMElRQWdCaUFJYWlFRElBWkJBV3NoQmlBQ0lBTkJBblJxS0FJQUlnTWdBQ0FFYWlnQ0FDSUFSZzBBQ3lBQklBaEJBblJxSUFBZ0EwMGlBRFlDQUNBQURRRU1BZ3NnQVNBSVFRSjBha0VCTmdJQUN5QUNJQWhCQW5ScUlnQWdBQ0FFSUFVUW1BSWFDeUFIclNFUkEwQWdDRUVCYXlJSVFRQklEUWdnQWlBSVFRSjBJZzVxSVF3Q2YwRi9JQWNnQWlBRklBaHFRUUowYWlJR0tBSUFJZ0JORFFBYUlBa0VRQ0FOUVFocUlBQWdCa0VFYXlnQ0FDQUhJQWtRbUFZTUFRc2dCa0VFYXpVQ0FDQUFyVUlnaG9RZ0VZQ25DeUlBclNFU1FRQWhDa0VBSVFNRFFDQURJQVZHUlFSQUlBd2dBMEVDZENJUGFpSVFJQkExQWdBZ0NxMGdCQ0FQYWpVQ0FDQVNmbng5SWhNK0FnQkJBQ0FUUWlDSXAyc2hDaUFEUVFGcUlRTU1BUXNMSUFZZ0JpZ0NBQ0lESUFwck5nSUFJQU1nQ2trRVFBTkFJQUJCQVdzaEFDQU1JQXdnQkNBRkVLb0VSUTBBSUFZZ0JpZ0NBRUVCYWlJRE5nSUFJQU1OQUFzTElBRWdEbW9nQURZQ0FBd0FDd0FMSUFVZ0NXc2hDa0VBSVFZRFFDQUdJQWxHUlFSQUlBY2dCa0VDZEdvZ0JDQUdJQXBxUVFKMGFpZ0NBRFlDQUNBR1FRRnFJUVlNQVFzTElBZEJBU0FKRUtrRFJRMEFJQXRCQUNBSlFRSjBJZ1lRS3lBR2FrRUJOZ0lBREFFTElBQWdDeUFISUFrUW1RWU5BUXNnQUNBSElBc2dEQ0FDSUFOQkFuUnFJQWxCZjNOQkFuUnFJQXdRMXdJTkFDQUlRWDl6SUF4QkFYUnFJUWhCQUNFR0EwQWdCaUFPUmtVRVFDQUJJQVpCQW5ScUlBY2dCaUFJYWtFQ2RHb29BZ0EyQWdBZ0JrRUJhaUVHREFFTEN5QUFLQUlBSUFkQkFDQUFLQUlFRVFFQUdpQUFLQUlBSUF0QkFDQUFLQUlFRVFFQUdpQUFLQUlBUVFBZ0EwRUNkRUVFYWlBQUtBSUVFUUVBSWdkRkRRTWdBQ0FISUFFZ0RpQUVJQVVRMXdJTkFTQUNJQUlnQnlBRlFRRnFFSmdDR2lBQUtBSUFJQWRCQUNBQUtBSUVFUUVBR2lBQ0lBVkJBblJxSVFBRFFDQUZJUU1DUUNBQUtBSUFEUUFEUUNBRFFRQk1EUUVnQWlBRFFRRnJJZ05CQW5RaUJtb29BZ0FpQ0NBRUlBWnFLQUlBSWdaR0RRQUxJQVlnQ0VzTkJBc2dBaUFDSUFRZ0JSQ1lBaUVESUFBZ0FDZ0NBQ0FEYXpZQ0FDQUJRUUVnRGhDcEF4b01BQXNBQ3lBTEJFQWdBQ2dDQUNBTFFRQWdBQ2dDQkJFQkFCb0xJQWRGRFFJTElBQW9BZ0FnQjBFQUlBQW9BZ1FSQVFBYURBRUxRUUFoQ3d3QkMwRi9JUXNMSUExQkVHb2tBQ0FMQzVZRkFoRi9BMzVCQVNBRWRDSVFRUUYySVJJZ0JrRUNkRUdRcVFScUtBSUFJaFZCQVhRaENrRUJJUXNEUUNBQ0lRd0NRQUpBSUJCQkFrWUVRRUVBSVFBRFFDQVJJQkpHRFFJZ0FTQVJRUUowSWdOcUlBd2dFU0FTYWtFQ2RDSUVhaWdDQUNJQ0lBTWdER29vQWdBaUEyb2lCU0FLUVFBZ0JTQUtUeHRyTmdJQUlBRWdCR29nQXlBQ2F5QUtRUUFnQWlBRFN4dHFOZ0lBSUJGQkFXb2hFUXdBQ3dBTFFRQWhBZ0pBSUFSQkUwb05BQ0FBSUFaQm9BRnNhaUFGUWRBQWJHb2dCRUVDZEdwQnFBMXFJZzBvQWdBaUFnMEFJQVpCQW5SQmtLa0VhaWdDQUNFSFFRQWhBaUFBS0FJQUlnZ29BZ0JCQUVFRUlBUjBJQWdvQWdRUkFRQWlDRVVOQUNBRVFRRnJJUTRnQUNBR1FhZ0JiR29nQlVIVUFHeHFJQVJCQW5ScUlnSTFBdUFHSVJnZ0FpZ0NHQ0VUSUFldElSbEJBU0VDUVFBaENRTkFJQWtnRG5aRkJFQWdDQ0FKUVFOMGFpSVBJQUkyQWdBZ0R5QUNyU0lhUWlDR0lCbUFQZ0lFSUFJZ0Uyd2dCeUFZSUJwK1FpQ0lwMnhySWdJZ0IwRUFJQUlnQjA4YmF5RUNJQWxCQVdvaENRd0JDd3NnRFNBSU5nSUFJQWdoQWdzZ0FpSUhEUUZCZnlFQUN5QUFEd3NnRUVFQmRpRVFJQXRCQVhRaENFRUFJUWxCQUNFTlFRQWhEZ05BSUFrZ0VFY0VRQ0FITlFJRUlSZ2dCeWdDQUNFVFFRQWhBZ05BSUFJZ0MwY0VRQ0FESUFJZ0Rtb2lEMEVDZEdvZ0RDQUNJQTFxSWhRZ0VtcEJBblJxS0FJQUloWWdEQ0FVUVFKMGFpZ0NBQ0lVYWlJWElBcEJBQ0FLSUJkTkcyczJBZ0FnQXlBTElBOXFRUUowYWlBVUlCWnJJQXBxSWc4Z0Uyd2dGU0FQclNBWWZrSWdpS2RzYXpZQ0FDQUNRUUZxSVFJTUFRc0xJQWxCQVdvaENTQUlJQTVxSVE0Z0N5QU5haUVOSUFkQkNHb2hCd3dCQ3dzZ0JFRUJheUVFSUFNaEFpQU1JUU1nQ0NFTERBQUxBQXZVQkFFSmZ3SkFJQUFvQWdBaUNTZ0NBRUVBSUFSQkFuUWdDU2dDQkJFQkFDSUxSUTBBQWtBZ0EwVUVRQ0FBSUFFZ0FTQUxJQUlnQmlBSEVLWUVSUTBCREFJTElBQW9BZ0FpQ1NnQ0FFRUFJQVJCQm5RZ0NTZ0NCQkVCQUNJSlJRMEJBa0FnQlVFUGNVVUVRQ0FBSUFkQnFBRnNhaUFHUWRRQWJHb2dBaUFEYWtFQ2RHb29BaGdoRUNBSFFRSjBJZ05Ca0trRWFpZ0NBQ0VPSUFBZ0Eyb29BZ1FoRDBFQklRMERRRUVBSVFNZ0JTQU1UUTBDQTBCQkFDRUtJQU1nQkVZRVFFRUFJUWdEUUFKQUlBaEJFRWNFUUNBSklBUWdDR3hCQW5ScUlRTUNRQ0FHUlFSQUlBQWdBeUFESUFzZ0FrRUFJQWNRcGdRTkFTQURJQVFnRFNBT0lBOFFtZ1lNQXdzZ0F5QUVJQTBnRGlBUEVKb0dJQUFnQXlBRElBc2dBa0VCSUFjUXBnUkZEUUlMSUFraENBd0pDd05BQWtBZ0JDQUtSd1JBSUFVZ0Ntd2dER29oQTBFQUlRZ0RRQ0FJUVJCR0RRSWdBU0FESUFocVFRSjBhaUFKSUFRZ0NHd2dDbXBCQW5ScUtBSUFOZ0lBSUFoQkFXb2hDQXdBQ3dBTElBeEJFR29oREF3R0N5QUtRUUZxSVFvTUFBc0FDeUFJUVFGcUlRZ2dEU0FRSUE0Z0R4RFdBaUVOREFBTEFBVWdBeUFGYkNBTWFpRUtRUUFoQ0FOQUlBaEJFRVpGQkVBZ0NTQUVJQWhzSUFOcVFRSjBhaUFCSUFnZ0NtcEJBblJxS0FJQU5nSUFJQWhCQVdvaENBd0JDd3NnQTBFQmFpRUREQUVMQUFzQUN3QUxRYldQQVVIVS9BQkI0VDFCaTljQUVBQUFDeUFBS0FJQUlnRW9BZ0FnQ1VFQUlBRW9BZ1FSQVFBYUN5QUFLQUlBSWdBb0FnQWdDMEVBSUFBb0FnUVJBUUFhUVFBUEN5QUFJQWdRMVFJZ0FDQUxFTlVDUVg4TFFBQWdBQ0FCUVFGMHJTQUJyU0FDclNBQVFoMklRdi8vLy84UGczNUNJSWgrZkgwaUFDQUFRaUNJcDBFQmRTQUJjYTE4SWdCQ0lJaW5JQUZ4SUFDbmFndjlBZ0lMZndKK0lBRkJBQ0FDSUFkc1FRSjBFQ3NoQ3lBQ0lBVWdCRUVGZEdwQkFXc2dCVzRpQVNBQklBSktHeUlCUVFBZ0FVRUFTaHNoREVGL0lBVjBRWDl6UVg4Z0JVRWZjUnNoQ2lBSFFRQWdCMEVBU2hzaERTQUZRU0JLSVE0Z0JVRStTQ0VQSUFWQlBVc2hFQ0FGUWNFQVNTRVJBMEFnQ1NBTVJrVUVRQ0FESUFRZ0JTQUpiQ0lCRUdnaEJ3SitJQTVGQkVBZ0J5QUtjYTBpRXd3QkN5QURJQVFnQVVFZ2FoQm9JUWdnRUVVRVFDQUhyU0lUSUFnZ0NuR3RRaUNHaEF3QkN3Si9JQkZGQkVBZ0F5QUVJQUZCUUdzUWFDQUtjUXdCQ3lBSUlBcHhJUWhCQUFzaEFTQUhRZi8vLy84SGNhMGhFeUFIUVI5MnJTQUlyVUlCaG9RZ0FhMUNJWWFFQ3lFVVFRQWhCd05BSUFjZ0RVWkZCRUFnRkNBR0lBZHFRUUowSWdGQmtLa0VhaWdDQUNJSUlBQWdBV29vQWdRaUVoQ29CQ0VCSUFzZ0FpQUhiQ0FKYWtFQ2RHb2dEd1IvSUFFRklBR3RRaCtHSUJPRUlBZ2dFaENvQkFzMkFnQWdCMEVCYWlFSERBRUxDeUFKUVFGcUlRa01BUXNMQzA4QkJIOERRQ0FESUFWR1JRUkFJQUFnQlVFQ2RDSUdhaUFFSUFJZ0Jtb29BZ0FpQnlBQklBWnFLQUlBYWlJRWFpSUdOZ0lBSUFRZ0Iwa2dCQ0FHUzNJaEJDQUZRUUZxSVFVTUFRc0xJQVFMNHdFQkEzOENRQUpBSUFOQkEzRkZJQU5CQjNFaUJFRUZSaUFDUWYvLy8vOERSbkp5SUFGQkFVWWdCRUVDUm5GeVJRUkFJQUVnQkVFRFIzSU5BUXNnQUNBQkVJd0JEQUVMSUFBZ0FrRWZha0VGZGlJRUVFRUVRQ0FBRURWQklBOExJQUFvQWhBaUJVRi9RU0JCQUNBQ2F5SUNRUjl4SWdacmRFRi9jeUFDZEVGL0lBWWJOZ0lBUVFFZ0JDQUVRUUZOR3lFRVFRRWhBZ05BSUFJZ0JFWkZCRUFnQlNBQ1FRSjBha0YvTmdJQUlBSkJBV29oQWd3QkN3c2dBQ0FCTmdJRUlBQkJnSUNBZ0FKQkFVRWNJQU5CQlhaQlAzRWlBR3QwSUFCQlAwWWJOZ0lJQzBFVUMyc0FBa0FDUUFKQUFrQUNRQ0FBSUFGeVFROXhEZzhBQkFNRUFnUURCQUVFQXdRQ0JBTUVDMEhZQUVIWkFDQUJRUkJHR3c4TFFkb0FRZHNBSUFGQkNFWWJEd3RCM0FCQjNRQWdBVUVFUmhzUEMwSGVBRUhmQUNBQlFRSkdHdzhMUWVBQVFlRUFJQUZCQVVZYkN6RUJBWDlCQVNFQkFrQUNRQUpBSUFCQkNtc09CQUlCQVFJQUN5QUFRYWpBQUVZTkFRc2dBRUdwd0FCR0lRRUxJQUVMdFFJQkEzOENRQUpBSUFBb0FqQWlDVUVCYWlJS0lBQW9BaXdpQ0UwRVFDQUFLQUlvSVFnTUFRc2dBQ2dDSUNnQ0VDSUpRUkJxSUFBb0FpaEJDQ0FJUVFOc1FRRjJJZ2dnQ0VFSVRSc2lDaUFBS0FJa2JDQUpLQUlJRVFFQUlnaEZCRUJCZnlFSURBSUxJQUFnQ0RZQ0tDQUFJQW8yQWl3Z0FDZ0NNQ0lKUVFGcUlRb0xJQUFnQ2pZQ01DQUlJQUFvQWlRZ0NXeHFJZ2dnQnpZQ0JDQUlJQVk2QUFBZ0NDQUVOZ0lNSUFnZ0JUWUNDQ0FJSUFNNkFBRWdDRUVRYWlFRUlBQW9BZ3hCQVhRaEJVRUFJUUFEUUNBQUlBVkdSUVJBSUFRZ0FFRUNkQ0lHYWlBQklBWnFLQUlBTmdJQUlBQkJBV29oQUF3QkN3c2dCQ0FGUVFKMGFpRUJRUUFoQ0VFQUlRQURRQ0FBSUFOR0RRRWdBU0FBUVFKMElnUnFJQUlnQkdvb0FnQTJBZ0FnQUVFQmFpRUFEQUFMQUFzZ0NBdHBBUVIvSUFFUVB5RURBMEFDUUNBQUxRQUFSUVJBUVg4aEFnd0JDd05BQW44Z0FFRXNFS1lESWdSRkJFQWdBQkEvREFFTElBUWdBR3NMSWdVZ0EwWUVRQ0FBSUFFZ0F4QmhSUTBDQ3lBQUlBVnFRUUZxSVFBZ0JBMEFDeUFDUVFGcUlRSU1BUXNMSUFJTFRBRUNmd0pBSUFBb0FnUWlBeUFDYWlJRUlBQW9BZ2hMQkg4Z0FDQUVFTVlCRFFFZ0FDZ0NCQVVnQXdzZ0FDZ0NBQ0lEYWlBQklBTnFJQUlRSHhvZ0FDQUFLQUlFSUFKcU5nSUVDd3ROQVFSL0lBQW9BZ2doQXlBQVFRQTJBZ2dnQUNnQ0FDRUVJQUJDQURjQ0FDQUFLQUlRSVFVZ0FDZ0NEQ0VHSUFBZ0F5QUVJQUVnQWtFQUVOc0NJUUFnQmlBRFFRQWdCUkVCQUJvZ0FBc1hBQ0FBSUFGQi93RnhFQkVnQUNBQ1FmLy9BM0VRS2d1akdnRU5meU1BUWRBRmF5SUVKQUFnQkNBQ0tBSUFJZ1UyQXB3RUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FGTFFBQUlnZ0VRQ0FJUWR3QVJ3MEdJQVZCQVdvaUJ5QUFLQUljVHcwQklBUWdCVUVDYWlJR05nS2NCQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFVdEFBRWlDRUhUQUdzT0JRUUJBUUVHQUFzQ1FDQUlRZU1BYXc0Q0NBY0FDd0pBSUFoQjh3QnJEZ1VEQVFFQkJRQUxJQWhCeEFCR0RRRWdDRUhRQUVZZ0NFSHdBRVp5RFFnTElBQW9BaWdoQVF3TkMwRUJJUWtNQkF0QkFpRUpEQU1MUVFNaENRd0NDMEVFSVFrTUFRdEJCU0VKQ3lBSlFRRjBRUXh4UWJDQkFtb29BZ0FpQmk4QkFDRUZJQUFvQWtBaEFDQUJRVFEyQWhBZ0FTQUFOZ0lNUVFBaEF5QUJRUUEyQWdnZ0FVSUFOd0lBSUFsQkFYRWhBQ0FHUVFKcUlRWWdCVUVCZENFSlFRQWhDQUpBQTBBZ0NDQUpSd1JBSUFZZ0NFRUJkR292QVFBaEJ5QUJLQUlBSWdVZ0FTZ0NCRTRFUUNBQklBVkJBV29RMlFJTkF5QUJLQUlBSVFVZ0FTZ0NDQ0VEQ3lBQklBVkJBV28yQWdBZ0F5QUZRUUowYWlBSE5nSUFJQWhCQVdvaENBd0JDd3RCZ0lDQWdBUWhDQ0FBUlEwTElBRVEyZ0pGRFFzTElBRW9BZ3dnQVNnQ0NFRUFJQUVvQWhBUkFRQWFEQXdMQWtBZ0JpMEFBQ0lCUWQ4QmNVSEJBR3RCL3dGeFFScFBCRUFnQUNnQ0tDRUdJQU5GSUFGQjN3QkdJQUZCTUd0Qi93RnhRUXBKY2tWeURRRWdCZzBNQ3lBRUlBVkJBMm8yQXB3RUlBRkJIM0VoQ0F3S0N5QUdEUW9nQkNBSE5nS2NCRUhjQUNFSURBa0xJQUFvQWloRkJFQkJBQ0VCREFZTElBWXRBQUJCK3dCSERRSWdCRUhnQkdvaEJRSkFBa0FDUUFKQUFrQURRQUpBSUFaQkFXb2hDU0FHTFFBQklnTVFyd05GRFFBZ0JTQUVRZUFFYW10QlBrc05BaUFGSUFNNkFBQWdCVUVCYWlFRklBa2hCZ3dCQ3dzZ0JVRUFPZ0FBSUFSQm9BUnFJUVVDUUNBSkxRQUFJZ05CUFVjTkFDQUdRUUpxSVFrZ0JFR2dCR29oQlFOQUlBa3RBQUFpQXhDdkEwVU5BU0FGSUFSQm9BUnFhMEUvVHdSQUlBQkJyZUVBUVFBUU9nd1NCU0FGSUFNNkFBQWdCVUVCYWlFRklBbEJBV29oQ1F3QkN3QUxBQXNnQlVFQU9nQUFJQU5CL1FCSEJFQWdBRUhEbEFGQkFCQTZEQkFMUVFFaEF3SkFBa0FnQkVIZ0JHcEJ5aWRCQnhCaFJRMEFJQVJCNEFScVFmZjdBRUVERUdGRkRRQkJBQ0VESUFSQjRBUnFRYmszUVJJUVlVVU5BQ0FFS0FMZ0JFSHp4dUVEUncwQkN5QUFLQUpBSVFZZ0FVRTBOZ0lRSUFFZ0JqWUNEQ0FCUVFBMkFnZ2dBVUlBTndJQVFlQ25BaUFFUWFBRWFoQ3ZCQ0lNUVFCSUJFQWdCa0VBUVFBUTh3UWFJQUJCc3lkQkFCQTZEQkVMSUFFaEJTQURSUVJBSUFSQk5EWUN6QVVnQkNBR05nTElCU0FFUVFBMkFzUUZJQVJDQURjQ3ZBVWdCRUUwTmdLNEJTQUVJQVkyQXJRRklBUkJBRFlDc0FVZ0JFSUFOd0tvQlNBRVFid0ZhaUVGQ3lBTVFRRnFJUTVCMExrQ0lRQkJBQ0VIQWtBRFFDQUFRWUhPQWtrRVFDQUhJUXNnQUMwQUFDSUd3Q0VOQW44Z0FFRUJhaUFHUWY4QWNTSUhRZUFBU1EwQUdpQUFMUUFCSVFvZ0IwSHZBRTBFUUNBSFFRaDBJQXB5UWFDL0FXc2hCeUFBUVFKcURBRUxJQUF0QUFJZ0IwRVFkSElnQ2tFSWRISkJvTisvQTJzaEJ5QUFRUU5xQ3lFR0lBMUJBRTRFUUNBSElBdHFRUUZxSVFjZ0JpRUFEQUlMSUFaQkFXb2hBQ0FISUF0cVFRRnFJUWNnRGlBR0xRQUFSdzBCSUFVZ0N5QUhFSDVGRFFFTUFnc0xJQU1OQzBHUXpnSWhBRUVBSVFZZ0RFRTJSaUVOSUF4QkdFY2hEd05BSUFCQnI5UUNTUVJBSUFZaEN5QUFMQUFBSWdaQi93RnhJUWNDZnlBQVFRRnFJQVpCQUU0TkFCb2dBQzBBQVNFS0lBWkJ2MzlOQkVBZ0IwRUlkQ0FLY2tHQS93RnJJUWNnQUVFQ2Fnd0JDeUFBTFFBQ0lBZEJFSFJ5SUFwQkNIUnlRWUQvL2dWcklRY2dBRUVEYWdzaUFFRUJhaUVLSUFjZ0MycEJBV29oQmlBQUxRQUFJUWNDUUFKQUlBMUZCRUJCQUNFQUlBOE5BUXNnQjBVTkFTQUVRYWdGYWlBTElBWVFma1VOQVF3RUN3TkFJQUFnQjBZTkFTQUFJQXBxSVJBZ0FFRUJhaUVBSUE0Z0VDMEFBRWNOQUFzZ0JFR29CV29nQ3lBR0VINE5Bd3NnQnlBS2FpRUFEQUVMQ3lBTVFUWkhJQXhCR0VkeFJRUkFJQVJCcUFWcUVOb0NEUUVnQVNBRktBSUlJQVVvQWdBZ0JDZ0NzQVVpQUNBRUtBS29CVUVCRU5zQ0RRRU1Dd3NnQVNBRktBSUlJQVVvQWdBZ0JDZ0NzQVVpQUNBRUtBS29CVUVBRU5zQ1JRMEtDeUFFS0FLd0JTRUFJQVFvQXJRRklRRWdCQ2dDdUFVaEFnTkFJQU1OQUNBRktBSU1JQVVvQWdoQkFDQUZLQUlRRVFFQUdpQUJJQUJCQUNBQ0VRRUFHZ3dBQ3dBTEFrQWdCRUhnQkdwQnJSMUJFUkJoQkVBZ0JFSGdCR3BCanZ3QVFRTVFZUTBCQ3lBQUtBSkFJUU1nQVVFME5nSVFJQUVnQXpZQ0RDQUJRUUEyQWdnZ0FVSUFOd0lBSUFFZ0JFR2dCR29RcHdZaUEwVU5DaUFCS0FJTUlBRW9BZ2hCQUNBQktBSVFFUUVBR2lBRFFYNUhEUVVnQUVHTUhVRUFFRG9NRUFzZ0JDMEFvQVFOQUNBQUtBSkFJUU1nQVVFME5nSVFJQUVnQXpZQ0RDQUJRUUEyQWdnZ0FVSUFOd0lBSUFFZ0JFSGdCR29RcHdZaUEwRi9SZzBESUFOQkFFNE5DUUpBUWZEWkFpQUVRZUFFYWhDdkJDSURRUUJJRFFBQ2Z3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQURRU0pyRGhNV0JSVUFCQTRNQ3c4TkNnWUhFQUlCQXdrSUVRc2dCRUtHZ0lDQThBQTNBd2dnQkVLQWdJQ0FFRGNEQUNBQklBUVFmUXdSQ3lBRVFvT0FnSUR3QURjRElDQUVRb0dBZ0lBUU53TVlJQVJDZ0lDQWdJQ0FCRGNERUNBQklBUkJFR29RZlF3UUN5QUVRVUJyUW9PQWdJRHdBRGNEQUNBRVFvR0FnSUF3TndNNElBUkNnSUNBZ01BQU53TXdJQUVnQkVFd2FoQjlEQThMSUFSQ2c0Q0FnUEFBTndOZ0lBUkNnWUNBZ01BQU53TllJQVJDZ0lDQWdDQTNBMUFnQVNBRVFkQUFhaEI5REE0TElBUkJCellDa0FFZ0JFS0RnSUNBTURjRGlBRWdCRUtEZ0lDQUVEY0RnQUVnQkVLQmdJQ0F3QUEzQTNnZ0JFS0FnSUNBNEFFM0EzQWdBU0FFUWZBQWFoQjlEQTBMSUFSQ2c0Q0FnUEFBTndQSUFTQUVRb0dBZ0lBZ053UEFBU0FFUW9PQWdJQXdOd080QVNBRVFvT0FnSUFRTndPd0FTQUVRb0dBZ0lEQUFEY0RxQUVnQkVLQWdJQ0E0SWNCTndPZ0FTQUJJQVJCb0FGcUVIME1EQXNnQkVFSE5nTG9BU0FFUW9PQWdJRGdBRGNENEFFZ0JFS0JnSUNBMEFBM0E5Z0JJQVJDZ0lDQWdKQ29nSUEvTndQUUFTQUJJQVJCMEFGcUVIME1Dd3NnQkVLRGdJQ0E4QUEzQTRBQ0lBUkNnWUNBZ05BQU53UDRBU0FFUW9DQWdJQ0FLRGNEOEFFZ0FTQUVRZkFCYWhCOURBb0xJQVJDaElDQWdQQUFOd1BJQWlBRVFvT0FnSURnQURjRHdBSWdCRUtCZ0lDQXNBRTNBN2dDSUFSQ25vQ0FnREEzQTdBQ0lBUkNuWUNBZ0JBM0E2Z0NJQVJDZzRDQWdCQTNBNkFDSUFSQ2dZQ0FnUEFBTndPWUFpQUVRb0NBZ0lEZ2h3RTNBNUFDSUFFZ0JFR1FBbW9RZlF3SkN5QUVRUWMyQXBnRElBUkNob0NBZ01BQU53T1FBeUFFUW95QWdJQXdOd09JQXlBRVFvT0FnSUFRTndPQUF5QUVRb0dBZ0lEZ0F6Y0QrQUlnQkVLQmdJQ0EwQU0zQS9BQ0lBUkNpSUNBZ0RBM0ErZ0NJQVJDZzRDQWdCQTNBK0FDSUFSQ2dZQ0FnUEFBTndQWUFpQUVRb0NBZ0lEZzM4RUFOd1BRQWlBQklBUkIwQUpxRUgwTUNBc2dBVUVCRUswRERBY0xJQUZCQWhDdEF3d0dDeUFCUVFjUXJRTU1CUXNnQkVLRmdJQ0E4QUEzQTdBRElBUkNnWUNBZ05BQk53T29BeUFFUW9LQWdJQVFOd09nQXlBQklBUkJvQU5xRUgwTUJBc2dCRUtGZ0lDQThBQTNBOUFESUFSQ2dZQ0FnT0FCTndQSUF5QUVRb0tBZ0lEQUFEY0R3QU1nQVNBRVFjQURhaEI5REFNTElBUkNoWUNBZ1BBQU53UHdBeUFFUW9HQWdJRHdBVGNENkFNZ0JFS0NnSUNBd0FBM0ErQURJQUVnQkVIZ0Eyb1FmUXdDQ3lBRVFvV0FnSUR3QURjRGtBUWdCRUtCZ0lDQW9BRTNBNGdFSUFSQ2dZQ0FnSUFHTndPQUJDQUJJQVJCZ0FScUVIME1BUXNnQTBFaFN3MEJJQUVnQTBFUWFoQ21CZ3RGRFFvTUJBc2dBU2dDRENBQktBSUlRUUFnQVNnQ0VCRUJBQm9MSUFCQjllVUFRUUFRT2d3T0N5QUJRUUJCZ0lERUFCQitEUUVNQndzZ0FVRUFRWUFCRUg1RkRRWUxJQUVvQWd3Z0FTZ0NDRUVBSUFFb0FoQVJBUUFhQ3lBQUVLZ0NEQW9MUVFBaENDQUZJQUFvQWh4SkRRWUxJQUJCeS9NQVFRQVFPZ3dJQ3lBQVFhZktBRUVBRURvTUJ3c2dCU2dDRENBRktBSUlRUUFnQlNnQ0VCRUJBQm9nQkNnQ3RBVWdBRUVBSUFRb0FyZ0ZFUUVBR2dzQ1FDQUlRZEFBUncwQUlBRVEyZ0pGRFFBZ0FTZ0NEQ0FCS0FJSVFRQWdBU2dDRUJFQkFCb01CZ3NnQkNBSlFRRnFOZ0tjQkVHQWdJQ0FCQ0VJREFNTElBUWdCellDbkFRZ0JFR2NCR29nQVVFQmRCRDVBU0lEUVFCT0JFQWdBeUVJREFNTEFrQWdBMEYrUncwQUlBUW9BcHdFSWdVdEFBQWlBMFVOQUVHcWtBRWdBMEVRRVBzQklBRkZjZzBCREFRTElBRU5BeUFFS0FLY0JDRUZDeUFJd0VFQVRnMEFJQVZCQmlBRVFad0VhaEJZSWdoQmdJQUVTUTBCSUFBb0FpZ05BU0FBUVk3SUFFRUFFRG9NQXdzZ0JDQUZRUUZxTmdLY0JBc2dBaUFFS0FLY0JEWUNBQXdDQ3lBQVFhZk9BRUVBRURvTFFYOGhDQXNnQkVIUUJXb2tBQ0FJQ3g4QkFYOGdBQ2dDUENJQlFRQklCSDhnQUJDcUJob2dBQ2dDUEFVZ0FRc0xnUU1CQkg4akFFRVFheUlFSkFBZ0JDQUJLQUlBSWdVMkFnd2dBa0VCZENFR0lBQWhBd0ovQTBBQ1FBSkFBa0FDZndKQUFrQWdCUzBBQUNJQ1Fkd0FSd1JBSUFKQlBrY05BU0FBSUFOR0RRWWdBMEVBT2dBQUlBRWdCQ2dDREVFQmFqWUNBRUVBREFnTElBUWdCVUVCYWpZQ0RDQUZMUUFCUWZVQVJnMEJEQVVMSUFMQVFRQk9EUUlnQlVFR0lBUkJER29RV0F3QkN5QUVRUXhxSUFZUStRRUxJZ0pCLy8vREFFc05BZ3dCQ3lBRUlBVkJBV28yQWd3TEFrQWdBQ0FEUmdSQUFuOGdBa0gvQUUwRVFDQUNRUU4yUWZ6Ly8vOEJjVUdRZ1FKcUtBSUFJQUoyUVFGeERBRUxJQUlRdVFNTFJRMENEQUVMQW44Z0FrSC9BRTBFUUNBQ1FRTjJRZnovLy84QmNVR2dnUUpxS0FJQUlBSjJRUUZ4REFFTElBSkIvdi8vQUhGQmpNQUFSaUFDRU5JRVFRQkhjZ3RGRFFFTElBTWdBR3RCK1FCS0RRQUNmeUFDUWY4QVRRUkFJQU1nQWpvQUFDQURRUUZxREFFTElBTWdBaENoQXlBRGFnc2hBeUFFS0FJTUlRVU1BUXNMUVg4TElRSWdCRUVRYWlRQUlBSUxEUUFnQUVFR1FYOUJCUkQvQlF0Z0FRRjhJQUFwQWdSQy8vLy8vLy8vLy84L1dBUkFJQUVnQVNzRENFUUFBQUFBQUFEd1B5QUFLQUlBdHlJQ282QTVBd2dnQVNBQkt3TVFJQUFvQWdRaUFFRWZkU0FBUWYvLy8vOEhjU0FBUVI5MmRHcEJFV3E0SUFLam9Ea0RFQXNMbWdFQkJIOGdBRUVRYWlFRklBQWhCZ0pBQTBBZ0FrRUFUQTBCQWtBQ1FBSi9JQVl0QUFkQmdBRnhCRUFnQlNBQlFRRjBhaThCQUF3QkN5QUJJQVZxTFFBQUN5SUFRVEJySWdSQkNra05BQ0FBUWNFQWEwRUZUUVJBSUFCQk4yc2hCQXdCQ3lBQVFlY0FhMEY2U1EwQklBQkIxd0JySVFRTElBSkJBV3NoQWlBQlFRRnFJUUVnQkNBRFFRUjBjaUVEREFFTEMwRi9JUU1MSUFNTEpnRUJmeU1BUVJCcklnSWtBQ0FDUVFBMkFnd2dBRUVGSUFGQkFCQ1NCQ0FDUVJCcUpBQUx3UUVCQTM4Q1FDQUJJQUlvQWhBaUF3Ui9JQU1GSUFJUXpnTU5BU0FDS0FJUUN5QUNLQUlVSWdWclN3UkFJQUlnQUNBQklBSW9BaVFSQVFBUEN3SkFJQUlvQWxCQkFFZ0VRRUVBSVFNTUFRc2dBU0VFQTBBZ0JDSURSUVJBUVFBaEF3d0NDeUFBSUFOQkFXc2lCR290QUFCQkNrY05BQXNnQWlBQUlBTWdBaWdDSkJFQkFDSUVJQU5KRFFFZ0FDQURhaUVBSUFFZ0Eyc2hBU0FDS0FJVUlRVUxJQVVnQUNBQkVCOGFJQUlnQWlnQ0ZDQUJhallDRkNBQklBTnFJUVFMSUFRTGl3RUJBMzhqQUVFUWF5SUFKQUFDUUNBQVFReHFJQUJCQ0dvUUJRMEFRWXplQkNBQUtBSU1RUUowUVFScUVMRUJJZ0UyQWdBZ0FVVU5BQ0FBS0FJSUVMRUJJZ0VFUUVHTTNnUW9BZ0FpQWlBQUtBSU1RUUowYWtFQU5nSUFJQUlnQVJBRVJRMEJDMEdNM2dSQkFEWUNBQXNnQUVFUWFpUUFRWWpWQkVITTFRUTJBZ0JCd05RRVFTbzJBZ0FMVkFBakFFRVFheUlDSkFBZ0FDQUNRUWhxSUFNcEF3QVFRZ1IrUW9DQWdJRGdBQVVnQWlrRENFS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVXExQ2dJQ0FnQkNFQ3lFQklBSkJFR29rQUNBQkMxUUFJd0JCRUdzaUFpUUFJQUFnQWtFSWFpQURLUU1BRUVJRWZrS0FnSUNBNEFBRklBSXBBd2hDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGYXRRb0NBZ0lBUWhBc2hBU0FDUVJCcUpBQWdBUXRWQVFGL0FrQUNRQUpBSUFGQ0lJaW5RUUZxRGdNQUFRSUJDeUFCcHlJQ0x3RUdRUVpIRFFBZ0Fpa0RJQ0lCUW9DQWdJQndnMEtBZ0lDQUVGRU5BUXNnQUVIazBRQkJBQkFWUW9DQWdJRGdBQ0VCQ3lBQkMyNEJCWDlCNkFJaEFRTkFJQUVnQWs0RVFDQUFJQUVnQW1wQkFYWWlBMEVDZEVHUWdnSnFLQUlBSWdSQkQzWWlCVWtFUUNBRFFRRnJJUUVNQWdzZ0FDQUVRUWgyUWY4QWNTQUZha2tFUUVFQkR3VWdBMEVCYWlFQ0RBSUxBQXNMSUFCQnNKRUNRZUNTQWtFR0VLd0RDeEVBSUFCQmdKTUNRY0NZQWtFV0VLd0RDMFlCQVg4Q1FDQUFLQUlJSUFKcUlnTWdBQ2dDREVvRVFDQUFJQU1nQVJDM0FnMEJDd05BSUFKQkFFd0VRRUVBRHdzZ0FrRUJheUVDSUFBZ0FSQ0xBVVVOQUFzTFFYOExtQUVDQlg4QmZpQUJLUUlFSWdpblFmLy8vLzhIY1NJRVJRUkFJQUlQQ3lBQUtBSUVJUU1DZnlBSVFvQ0FnSUFJZzFCRkJFQWdBUzhCRUF3QkN5QUJMUUFRQ3lFR0lBTkIvLy8vL3dkeElRVWdCRUVCYXlFSEFrQURRQ0FDSUFScUlBVktEUUVnQUNBR0lBSVF4d0VpQTBFQVNDQURJQVJxSUFWS2NnMEJJQUFnQVNBRFFRRnFJZ0pCQVNBSEVMTUREUUFMSUFNUEMwRi9DNVlDQVFSL0lBQW9BaEFoQmlBQktBSUFJZ1V0QUJBRWZ5QUdJQVVRa0FRZ0JTZ0NGQ0FEYWtHQmdOenhlV3dnQkdwQmdZRGM4WGxzQlVFQUN5RUhBbjhnQlNnQ0lDSUlJQVVvQWh4T0JFQWdBQ0FCSUFJZ0NFRUJhaEM4QlFSQVFYOGdCUzBBRUVVTkFob2dCaUFGRUpRRFFYOFBDeUFCS0FJQUlRVUxJQVV0QUJBRVFDQUZJQWMyQWhRZ0JpQUZFSlFEQ3lBRklBVW9BaUFpQVVFQmFqWUNJQ0FGSUFGQkEzUnFJZ0VnQUNBREVCZ2lBRFlDTkNBQklBRW9BakJCLy8vL0gzRWdCRUVhZEhJMkFqQWdCU0FGTFFBUklBQkJIM1p5T2dBUklBRWdBU2dDTUVHQWdJQmdjU0FGSUFBZ0JTZ0NHSEZCZjNOQkFuUnFJZ0FvQWdCQi8vLy9IM0Z5TmdJd0lBQWdCU2dDSURZQ0FFRUFDd3VuQVFJQ2Z3RitBa0FDUUNBQUlBRVEwQU1pQTBFQVNBMEFJQU5GRFFGQmxUQWhBaUFBSUFBZ0FVSHRBQ0FCUVFBUUZDSUVRb0NBZ0lCd2d5SUJRb0NBZ0lBZ1VTQUJRb0NBZ0lBd1VYSUVmMEdWTUFVZ0FVS0FnSUNBNEFCUkRRRWdBQ0FFRURjaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQlFRQWhBaUFCcDBIbkFFRUFFTWNCSVFNZ0FDQUJFQThnQTBFQVRnMENRWXZkQUF0QkFCQVZDMEYvSVFJTElBSUxxUU1CQzM4Q1FDQUFLQUlRSWdRb0F0QUJRUUYwUVFKcUlBUW9Bc3dCVEEwQUlBUkJFR29pQ1VFRUlBUW9Bc2dCSWdOQkFXb2lDSFFpQlNBRUtBSUFFUU1BSWdkRkRRQkJBU0FJZENFS0lBZEJBQ0FGRUNzaEJ5QUVLQUxNQVNJRlFRQWdCVUVBU2hzaEMwRWZJQU5ySVF3RFFDQUVLQUxVQVNFRElBWWdDMFpGQkVBZ0F5QUdRUUowYWlnQ0FDRURBMEFnQXdSQUlBTW9BaWdoQlNBRElBY2dBeWdDRkNBTWRrRUNkR29pRFNnQ0FEWUNLQ0FOSUFNMkFnQWdCU0VEREFFTEN5QUdRUUZxSVFZTUFRc0xJQWtnQXlBRUtBSUVFUUFBSUFRZ0J6WUMxQUVnQkNBS05nTE1BU0FFSUFnMkFzZ0JDeUFBSUFKQkEzUkJRR3NRS1NJRFJRUkFRUUFQQ3lBRFFRSTZBQlFnQTBFQk5nSVFJQVFvQWxBaUJTQURRUmhxSWdZMkFnUWdBeUFFUWRBQWFqWUNIQ0FESUFVMkFoZ2dCQ0FHTmdKUUlBRUVRQ0FCSUFFb0FnQkJBV28yQWdBTElBTkNBRGNDQUNBRElBRTJBandnQTBJQU53SXdJQU1nQWpZQ0xDQURRUU0yQWlnZ0EwRUJPd0VnSUFOQ0FEY0NDQ0FESUFGQmdZRGM4WGxzUWYvL280NEdhellDSkNBQUtBSVFJQU5CRUdvaUFCQ1VBeUFBQzQ0RUFRSitJd0JCSUdzaUFpUUFJQU1wQXdBaEJRSkFBa0FDUUNBRUJFQWdCVUwvLy8vL2IxZ0VRQ0FBRUNRTUF3c2dCYWNpQkNBRUtBSUFRUUZxTmdJQURBRUxJQUFnQlJBbElnVWhBU0FGUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlMQWtBZ0FDQURLUU1JRURFaUEwVU5BRUtBZ0lDQU1DRUJBa0FDUUNBRlFvQ0FnSUJ3VkEwQUlBQWdBaUFGcHlBREVFd2lCRUVBU0EwQ0lBUkZEUUFnQUJBMElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFRSkFJQUl0QUFCQkVIRUVRQ0FDS1FNUUlnWkNJSWluUVhWUEJFQWdCcWNpQkNBRUtBSUFRUUZxTmdJQUN5QUFJQUZCd1FBZ0JrR0hnQUVRR1VFQVNBMERJQUlwQXhnaUJrSWdpS2RCZFU4RVFDQUdweUlFSUFRb0FnQkJBV28yQWdBTElBQWdBVUhDQUNBR1FZZUFBUkFaUVFCT0RRRU1Bd3NnQWlrRENDSUdRaUNJcDBGMVR3UkFJQWFuSWdRZ0JDZ0NBRUVCYWpZQ0FBc2dBQ0FCUWNBQUlBWkJoNEFCRUJsQkFFZ05BaUFBSUFGQlBpQUNOUUlBUWdHSVFnR0RRb0NBZ0lBUWhFR0hnQUVRR1VFQVNBMENDeUFBSUFGQlB5QUNOUUlBUWdLSVFnR0RRb0NBZ0lBUWhFR0hnQUVRR1VFQVNBMEJJQUFnQVVFOUlBSTFBZ0JDQVlOQ2dJQ0FnQkNFUVllQUFSQVpRUUJJRFFFZ0FDQUNFRWdMSUFBZ0F4QVRJQUFnQlJBUERBTUxJQUFnQWhCSUlBQWdBUkFQQ3lBQUlBTVFFeUFBSUFVUUR3dENnSUNBZ09BQUlRRUxJQUpCSUdva0FDQUJDMVVCQVg4akFFRWdheUlGSkFBQ1FDQUFJQVVnQXhEN0JFRUFTQVJBUVg4aEJBd0JDeUFBSUFFZ0FpQUZLUU1JSUFVcEF4QWdCU2tER0NBRktBSUFJQVJ5RUcwaEJDQUFJQVVRU0FzZ0JVRWdhaVFBSUFRTGdnSURCSDhCZmdKOEl3QkI0QUJySWdZa0FFS0FnSUNBNEFBaENRSkFJQUFnQVNBR1FSQnFJQVJCRDNFaUNDQUVRUWgyUVE5eElnZEZFTGNESWdWQkFFZ05BRVFBQUFBQUFBRDRmeUVLQWtBZ0JVVWdBa0VBVEhJTkFFRUFJUVVnQkVFRWRrRVBjU0FIYXlJRUlBSWdBaUFFU2hzaUFrRUFJQUpCQUVvYklRSURRQ0FDSUFWSEJFQWdBQ0FHUVFocUlBTWdCVUVEZEdvcEF3QVFRZzBESUFZckF3Z2lDNzFDZ0lDQWdJQ0FnUGovQUlOQ2dJQ0FnSUNBZ1BqL0FGRU5BaUFHUVJCcUlBVWdCMnBCQTNScUlBdWRPUU1BSUFWQkFXb2hCUXdCQ3dzZ0JrRVFhaUFJRU9BQ0lRb0xJQUFnQVNBS0VNa0VJUWtMSUFaQjRBQnFKQUFnQ1F2SEFRRUJmd0pBQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlETHdFR1FRcEhEUUFnQUNBREtRTWdFQThnQXdKK0lBSzlJZ0VDZnlBQ21VUUFBQUFBQUFEZ1FXTUVRQ0FDcWd3QkMwR0FnSUNBZUFzaUFMZTlVUVJBSUFDdERBRUxRb0NBZ0lEQWZpQUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3lJQk53TWdJQUZDSUlpblFYVkpEUUVnQWFjaUFDQUFLQUlBUVFGcU5nSUFJQUVQQ3lBQVFhMHhRUUFRRlVLQWdJQ0E0QUFoQVFzZ0FRc3BBUUYrSUFBZ0FSQ3FBU0lCUlFSQVFvQ0FnSURnQUE4TElBQWdBUkF0SVFJZ0FDQUJFQk1nQWdzaEFDQUFRcEFEZ1ZDdFF1NENRdTBDSUFCQ0E0TlFHeUFBUXVRQWdWQ3RmWHdMV1FFQmZpQUFRdTBDZmlBQVFyRVBmVUlDaDN3Z0FFTHREbjBpQVNBQlF1UUFnU0lCZlNBQlFqK0hRcHgvZzN4Q25IOS9mQ0FBUXNFTWZTSUFJQUJDa0FPQklnQjlJQUJDUDRkQzhIeURmRUtRQTM5OFFzcnhLMzBMeFFFQ0NIOEJmaUFBSUFFUW5BSkJmeUVFQWtBZ0FTZ0NBQ0lIUVFOcUlnZ2dBQ2tDQkNJTHAwSC8vLy8vQjNGS0RRQWdBRUVRYWlFRklBdENnSUNBZ0FpRElRc0RRQ0FEUVF4R0RRRWdBMEVEYkNFSlFRQWhBQUpBQTBBZ0FFRURSZzBCSUFBZ0Iyb2hCaUFBSUFscUlRb2dBRUVCYWlFQUFuOGdDMUJGQkVBZ0JTQUdRUUYwYWk4QkFBd0JDeUFGSUFacUxRQUFDeUFLUWVEUkFXb3NBQUJHRFFBTElBTkJBV29oQXd3QkN3c2dBaUFEclRjREFDQUJJQWcyQWdCQkFDRUVDeUFFQzdRQkFnUi9BWDRqQUVFUWF5SURKQUFnQXlBQktBSUFJZ1EyQWd4QmZ5RUdJQUFwQWdRaUI2ZEIvLy8vL3dkeElBUktCRUFnQUVFUWFpRUZBa0FDUUFKL0lBZENnSUNBZ0FpRFVFVUVRQ0FGSUFSQkFYUnFMd0VBREFFTElBUWdCV290QUFBTElnVkJLMnNPQXdBQkFBRUxJQU1nQkVFQmFqWUNEQXNnQUNBRFFReHFJQUlRblFJaUJpQUZRUzFIY2tVRVFDQUNRZ0FnQWlrREFIMDNBd0FMSUFFZ0F5Z0NERFlDQUFzZ0EwRVFhaVFBSUFZTDhRa0RBWHdMZndGK0l3QkIwQUpySWdJa0FFS0FnSUNBNEFBaEVRSkFJQUFnQVNBQ1FjQUJhaUFFUVFSMklnTkJBWEZCQUJDM0F5SUdRUUJJRFFBZ0EwRVBjU0VOSUFaRkJFQWdEVUVDUmdSQUlBQkI4NElCUVFBUVVBd0NDeUFBUWQzaUFCQmlJUkVNQVFzQ2Z5QUNLd09BQWlJRm1VUUFBQUFBQUFEZ1FXTUVRQ0FGcWd3QkMwR0FnSUNBZUFzaERnSi9JQUlyQS9nQklnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEN5RVBBbjhnQWlzRDhBRWlCWmxFQUFBQUFBQUE0RUZqQkVBZ0Jhb01BUXRCZ0lDQWdIZ0xJUkFDZnlBQ0t3UG9BU0lGbVVRQUFBQUFBQURnUVdNRVFDQUZxZ3dCQzBHQWdJQ0FlQXNoQ1FKL0lBSXJBK0FCSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Q3lFS0FuOGdBaXNEMkFFaUJabEVBQUFBQUFBQTRFRmpCRUFnQmFvTUFRdEJnSUNBZ0hnTElRY0NmeUFDS3dQUUFTSUZtVVFBQUFBQUFBRGdRV01FUUNBRnFnd0JDMEdBZ0lDQWVBc2hDd0ovSUFJckE4Z0JJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDeUVNSUFSQkFYRWhDQUovSUFJckE4QUJJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDeUVHUVFBaEF3SkFJQWhGRFFBZ0JFRVBjU0VJQWtBQ1FBSkFBa0FnRFE0RUFBRUNBd1FMSUFJZ0JqWUNZQ0FDSUFzMkFsUWdBaUFHUVI5MlFRUnlOZ0pjSUFJZ0RFRURiRUhnMFFGcU5nSllJQUlnRDBFRGJFSEEwUUZxTmdKUUlBSkJrQUpxUWNBQVFkdVpBU0FDUWRBQWFoQk9JUU1NQXdzZ0FpQUdOZ0tBQVNBQ0lBczJBbmdnQWlBR1FSOTJRUVJ5TmdKOElBSWdERUVEYkVIZzBRRnFOZ0owSUFJZ0QwRURiRUhBMFFGcU5nSndJQUpCa0FKcVFjQUFRY1g3QUNBQ1FmQUFhaEJPSVFNZ0NFRURSdzBDSUFKQmtBSnFJQU5xUVNBNkFBQWdBMEVCYWlFRERBSUxJQUlnQmpZQ29BRWdBa0dRQW1vaUNFSEFBRUdvK3dCQm92c0FJQVpCa000QVNSc2dBa0dnQVdvUVRpRURJQUlnQ3pZQ2xBRWdBaUFNUVFGcU5nS1FBU0FESUFocVFjQUFJQU5yUVpXQkFTQUNRWkFCYWhCT0lBTnFJUU1NQVFzZ0FpQUxOZ0swQVNBQ0lBeEJBV28yQXJBQklBSWdCallDdkFFZ0FpQUdRUjkyUVFSeU5nSzRBU0FDUVpBQ2FrSEFBRUcyK3dBZ0FrR3dBV29RVGlFRElBaEJBMGNOQUNBQ1FaQUNhaUFEYWtHc3dBQTdBQUFnQTBFQ2FpRURDd0pBSUFSQkFuRkZEUUFDUUFKQUFrQUNRQ0FORGdRQUFRSURCQXNnQWlBSk5nSUlJQUlnQ2pZQ0JDQUNJQWMyQWdBZ0FrR1FBbW9nQTJwQndBQWdBMnRCMTRFQklBSVFUaUFEYWlFRERBTUxJQUlnQ1RZQ0tDQUNJQW8yQWlRZ0FpQUhOZ0lnSUFKQmtBSnFJZ2NnQTJwQndBQWdBMnRCMTRFQklBSkJJR29RVGlBRGFpSURJQWRxUVMxQkt5QU9RUUJJR3pvQUFDQUNJQTRnRGtFZmRTSUVjeUFFYXlJRVFUeHVJZ1kyQWhBZ0FpQUdRVVJzSUFScU5nSVVJQWNnQTBFQmFpSUVha0UvSUFOclFhMzdBQ0FDUVJCcUVFNGdCR29oQXd3Q0N5QUNJQkEyQWp3Z0FpQUpOZ0k0SUFJZ0NqWUNOQ0FDSUFjMkFqQWdBa0dRQW1vZ0EycEJ3QUFnQTJ0Qm9JQUJJQUpCTUdvUVRpQURhaUVEREFFTElBSWdDVFlDU0NBQ0lBbzJBa1FnQWtIQkFFSFFBQ0FIUVF4SUd6WUNUQ0FDSUFkQkFXcEJERzlCQVdzMkFrQWdBa0dRQW1vZ0EycEJ3QUFnQTJ0Qm1JTUJJQUpCUUdzUVRpQURhaUVEQ3lBQUlBSkJrQUpxSUFNUWt3SWhFUXNnQWtIUUFtb2tBQ0FSQ3pjQ0FuOEJmaU1BUVJCcklnQWtBQ0FBRUtNRUlBQXBBd0FoQWlBQUtBSUlJUUVnQUVFUWFpUUFJQUZCNkFkdHJDQUNRdWdIZm53TGxBd0RDMzhEZmdGOEl3QkJvQUZySWdRa0FDQUVRZUFBYWtFQVFUZ1FLeG9nQkVJQk53TndJQVJDQVRjRGFFS0FnSUNBNEFBaEFTQUFJQU1wQXdBUUtDSVJRb0NBZ0lCd2cwS0FnSUNBNEFCU0JFQWdCRUVBTmdJTUlCR25JZ1VwQWdRaUQwS0FnSUNBQ0lNaEVBSkFBa0FDUUFKQUlBOUMvLy8vL3dlRFVBMEFJQVZCRUdvaEJ3SkFBbjhnRUZBaURFVUVRQ0FITHdFQURBRUxJQWN0QUFBTElnTkJNR3RCQ2trTkFDQURRU3RyRGdNQUFRQUJDMEtBZ0lDQXdINGhBU0FGSUFSQkRHb2dCRUhnQUdvUXpnUU5BeUFQcDBILy8vLy9CM0VoQmtFQklRa0RRQUpBQWtBQ1FDQUpRUWRHSUFRb0Fnd2lBeUFHVG5JTkFDQUpRUUowUWRqL0FXb29BZ0FoQWdKL0lBeEZCRUFnQnlBRFFRRjBhaThCQUF3QkN5QURJQWRxTFFBQUN5QUNSdzBBSUFRZ0EwRUJhaUlJTmdJTUlBbEJCa2NOQVNBR0lBaE1EUWRCNkFjaEFrRUFJUXNnQ0NFREEwQUNRQUpBSUFNZ0JrWUVRQ0FHSVFNTUFRc0NmeUFNUlFSQUlBY2dBMEVCZEdvdkFRQU1BUXNnQXlBSGFpMEFBQXNpQ2tFd2F5SU5RUXBKRFFFZ0F5QUlSZzBLQ3lBRUlBTTJBZ3dnQkNBTHJEY0RrQUVNQkFzZ0FrRUJSaUVPSUEwZ0FrRUtiU0lDYkNBTGFpQU9JQXBCTkV0eGFpRUxJQU5CQVdvaEF3d0FDd0FMSUFRZ0JDa0RhRUlCZlRjRGFDQURJQVpPQkVBZ0NVRURTeUVLREFVTEFuOENRQUpBQW44Z0RFVUVRQ0FISUFOQkFYUnFMd0VBREFFTElBTWdCMm90QUFBTElnSkJLMnNPQXdFSkFRQUxJQUpCMmdCSERRaENBQ0VQSUFOQkFXb01BUXNnQkNBRFFRRnFJZ00yQWd3Z0JpQURheUlEUVFaclFYNUpEUWNnQlNBRVFReHFJQVJCR0dvUTN3SU5CeUFEUVFWR0JFQWdCQ2dDRENFREFuOGdERVVFUUNBSElBTkJBWFJxTHdFQURBRUxJQU1nQjJvdEFBQUxRVHBIRFFnZ0JDQURRUUZxTmdJTUN5QUZJQVJCREdvZ0JFRVFhaERmQWcwSFFnQWdCQ2tERUNBRUtRTVlRangrZkNJUGZTQVBJQUpCTFVZYklROGdCQ2dDREFzaEEwRUFJUW9nQXlBR1JnMEZEQVlMSUFVZ0JFRU1haUFFUWVBQWFpQUpRUU4wYWhDZEFnMEZDeUFKUVFGcUlRa01BQXNBQ3lBRlFSQnFJUWdnRDZkQi8vLy8vd2R4SVFaQkFDRUNBMEFDUUNBR0lBSWlBMFlFUUNBR0lRTU1BUXNnQTBFQmFpRUNBbjhnRUZCRkJFQWdDQ0FEUVFGMGFpOEJBQXdCQ3lBRElBaHFMUUFBQzBFZ1J3MEJDd3NnQkNBRE5nSU1JQVVnQkVFTWFoQ2NBa0tBZ0lDQXdINGhBU0FFS0FJTUlnSWdCazROQWlBRVFmQUFhaUVLSUFSQjRBQnFRUWh5SVFjQ1FBSi9JQkJRSWdsRkJFQWdDQ0FDUVFGMGFpOEJBQXdCQ3lBQ0lBaHFMUUFBQzBFd2EwRUpUUVJBSUFVZ0JFRU1haUFLRUowQ0RRUWdCU0FFUVF4cUlBY1F6UVJGRFFFTUJBc2dCU0FFUVF4cUlBY1F6UVFOQXlBRklBUkJER29pQWhDY0FpQUZJQUlnQ2hDZEFnMERDeUFGSUFSQkRHb2lBaENjQWlBRklBSWdCRUhnQUdvUXpnUU5BaUFGSUFSQkRHb1FuQUpCQUNFREEwQWdBMEVEUmdSQUlBUW9BZ3dpQXlBR0lBTWdCa29iSVFJRFFFRUFJUW9nQWlBRFJnMERBa0FDUUFKL0lBbEZCRUFnQ0NBRFFRRjBhaThCQUF3QkN5QURJQWhxTFFBQUN5SUxRU3RyRGdNQUFRQUJDeUFFSUFOQkFXbzJBZ3dnQlNBRVFReHFJQVJCR0dvUTN3SU5CaUFGSUFSQkRHb2dCRUVRYWhEZkFnMEdRZ0FnQkNrREVDQUVLUU1ZUWp4K2ZDSUJmU0FCSUF0QkxVWWJJUThNQlFzZ0EwRUJhaUVEREFBTEFBc2dBMEVCYTBFQlRRUkFJQVFvQWd3aUFpQUdUZzBFQW44Z0NVVUVRQ0FJSUFKQkFYUnFMd0VBREFFTElBSWdDR290QUFBTFFUcEhEUVFnQkNBQ1FRRnFOZ0lNQ3lBRFFRTjBJUUlnQTBFQmFpRURJQVVnQkVFTWFpQUNJQVJxUWZnQWFoQ2RBa1VOQUFzTUFndENBQ0VQQzBFQUlRTURRQ0FEUVFkR1JRUkFJQU5CQTNRaUFpQUVRU0JxYWlBRVFlQUFhaUFDYWlrREFMazVBd0FnQTBFQmFpRUREQUVMQ3lBRVFTQnFJQW9RNEFJZ0QwTGcxQU4rdWFFaUVyMGlBUUovSUJLWlJBQUFBQUFBQU9CQll3UkFJQktxREFFTFFZQ0FnSUI0Q3lJRHQ3MVJCRUFnQTYwaEFRd0JDMEtBZ0lDQXdINGdBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3lFQkN5QUFJQkVRRHdzZ0JFR2dBV29rQUNBQkN5SUJBWDlCQVNFQklBQVF1UU1FZjBFQkJTQUFRYUNpQWtHZ3B3SkJGQkNzQXdzTGZRRUNmeU1BUVJCcklnRWtBQ0FCUVFvNkFBOENRQUpBSUFBb0FoQWlBZ1IvSUFJRklBQVF6Z01OQWlBQUtBSVFDeUFBS0FJVUlnSkdEUUFnQUNnQ1VFRUtSZzBBSUFBZ0FrRUJhallDRkNBQ1FRbzZBQUFNQVFzZ0FDQUJRUTlxUVFFZ0FDZ0NKQkVCQUVFQlJ3MEFJQUV0QUE4YUN5QUJRUkJxSkFBTG13RUJCSDhqQUVFUWF5SURKQUFnQWFjaUJDZ0NFQ0lDUVRCcUlRVWdBaUFDS0FJWVFYOXpRUUowUWJ4K2Ntb29BZ0FoQWdKQUFrQURRQ0FDUlEwQklBSkJBM1FnQldwQkNHc2lBaWdDQkVFd1J3UkFJQUlvQWdCQi8vLy9IM0VoQWd3QkN3c2dBeUFDTmdJTUlBQWdCQ0FEUVF4cUlBSW9BZ0JCR25aQlBIRVFrUU1OQVFzZ0JDQUVMUUFGUWY0QmNUb0FCUXNnQTBFUWFpUUFDN2NGQWdaL0EzNGpBRUV3YXlJRUpBQWdBQ2dDQUNFRlFvQ0FnSUF3SVF0Q2dJQ0FnREFoQ2dKQUlBRUVRRUYvSVFNZ0JSQStJZ3BDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFwQkFCQzBBU0VHSUFVZ0NoQVBJQVlOQVNBRkVENGlDMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMEJJQVVnQ2tId0FDQUxRWUNBQVJBWlFRQklEUUVMSUFCQkVHb2hCa0VBSVFNQ1FBSkFBMEFnQmlnQ0FFR0NmMFlFUUNBQUtBSVlJUWNnQkNBR0tRTVlOd01vSUFRZ0Jpa0RFRGNESUNBRUlBWXBBd2czQXhnZ0JDQUdLUU1BTndNUUlBZEJBV29oQnlBQUtRTWdJUWtDUUFKQUFrQWdBUVJBSUFsQ0lJaW5RWFZQQkVBZ0NhY2lDQ0FJS0FJQVFRRnFOZ0lBQ3lBRklBc2dBeUFKUVlTQUFSQ3ZBVUVBU0EwQ0lBVWdDaUFEQW40Z0FFSGdBRUVBSUFjZ0JFRVFhaUFFUVF4cUVQTUNSUVJBSUFRcEF5QU1BUXNnQkVLQWdJQ0FNRGNESUVLQWdJQ0FNQXRCaElBQkVLOEJRUUJJRFFJZ0FDZ0NLRUhnQUVjTkFTQUZJQXNRMUFRZ0JTQUtFTlFFSUFJZ0EwRUJhallDQUF3SEN5QUZJQWtRRHlBQVFvQ0FnSUF3TndNZ0lBQkI0QUJCQVNBSElBUkJFR29nQkVFTWFoRHpBZzBCQWtBZ0JDa0RJQ0lKcHlnQ0JFSC8vLy8vQjNGQkFTQURHd1JBSUFBZ0NVRUJFTFFCSVFjZ0FDZ0NBQ0FKRUE4Z0J3MERJQU5GQkVBZ0FDZ0NLRUhnQUVZTkNTQUFRY0lBRUJBZ0FFSGNBQkFhQ3lBRFFRRnFJUU1NQVFzZ0FDZ0NBQ0FKRUE4TElBQW9BaWhCNEFCR0RRVUxJQUFRRWcwQUlBQVFrUUVOQUNBR0tBSUFRZjBBUndSQUlBQkJyczhBUVFBUUZnd0JDeUFBSUFZUS93RWdBRUVBTmdJd0lBQWdBQ2dDRkRZQ0JDQUFJQUFvQWpnUXp3TkZEUUVMUVg4aEF3d0ZDeUFEUVFGcUlRTU1BUXNMSUFCQmduOFFMQ0VEREFJTElBQkJKQkFRSUFCQlFHc29BZ0FnQTBFQmEwSC8vd054RUJjTElBQVFFaUVEQ3lBRVFUQnFKQUFnQXd1QUFRRUNmeUFBUVNZUUVDQUFRVUJySWdJb0FnQkJBQkFYSUFCQkFSQVFJQUlvQWdCQkFCQTVJQUFnQWlnQ0FCQXlJZ01RSGlBQVFZQUJFQkFnQWlnQ0FDQUJRUUpxUWY4QmNSQmtJQUJCNmdCQmZ4QWNJUUVnQUVIUkFCQVFJQUJCandFUUVDQUFRZXNBSUFNUUhCb2dBQ0FCRUI0Z0FFRU9FQkFnQUVFT0VCQUxuUUVCQlg4Z0FDZ0NRQ0lFS0FLSUFTSURRUUFnQTBFQVNoc2hBd0pBQTBBQ1FDQUNJQU5HQkVCQkFDRURJQVFvQW53aUFrRUFJQUpCQUVvYklRVkJBQ0VDQTBBZ0FpQUZSZzBFSUFKQkJIUWhCaUFDUVFGcUlRSWdCaUFFS0FKMGFpZ0NBQ0FCUncwQUN3d0JDeUFDUVFSMElRVWdBa0VCYWlFQ0lBVWdCQ2dDZ0FGcUtBSUFJQUZIRFFFTEN5QUFRYzBrUVFBUUZrRi9JUU1MSUFNTGhnVUNDSDhCZmlNQVFVQnFJZ0VrQUNBQUtBSTRJUUpCZnlFSUFrQWdBQ2dDQUNBQlFTaHFRU0FRUFEwQUFrQWdBQ2dDQUNBQlFSQnFRUUVRUFEwQUlBSkJBV29oQTBFQUlRSUNRQU5BSUFNaUJTQUFLQUk4VHcwQklBSWhCa0VCSVFJZ0JVRUJhaUVEQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FGTFFBQUlnUkIyd0JyRGdNR0F3RUFDeUFFUVM5SEJFQWdCRUVLYXc0RUJ3SUNCd0lMUVM4aEJDQUdEUVVEUUNBQklBTkJBV28yQWd3Q1FDQURMQUFBSWdKQkFFNEVRQ0FDUWY4QmNTRUNEQUVMSUFOQkJpQUJRUXhxRUZnaUFrR0FnTVFBVHcwR0N5QUNFTVVCQkVBZ0FVRVFhaUFDRUxrQkRRc2dBU2dDRENFRERBRUxDeUFBUVlSL05nSVFJQUFnQVVFb2FoQTJOd01nSUFGQkVHb1FOaUVKSUFBZ0F6WUNPQ0FBSUFrM0F5aEJBQ0VJREFvTFFkMEFJUVJCQUNFQ0RBUUxJQVRBUVFCT0RRRWdCVUVHSUFGQkNHb1FXQ0lFUVlDQXhBQlBEUUlnQkVGK2NVR293QUJHRFFRZ0FTZ0NDQ0VEREFFTElBRkJLR3BCM0FBUU93MEdJQVZCQW1vaEJ3SkFJQVV0QUFFaUJBUkFJQVJCQ21zT0JBVUJBUVVCQzBFQUlRUWdCaUVDSUFjaUF5QUFLQUk4VHcwR0RBTUxJQVRBUVFCT0JFQWdCaUVDSUFjaEF3d0RDMEVIUVFaQkFDQURRUVlnQVVFTWFoQllJZ1JCZm5GQnFNQUFSaHNnQkVILy84TUFTeUlDR3lJRFJRUkFJQWNnQVNnQ0RDQUNHeUVEREFFTElBTkJCbXNPQWdNQkJ3c2dCaUVDREFFTElBQkJ0UEFBUVFBUUZnd0VDeUFCUVNocUlBUVF1UUZGRFFFTUF3c0xJQUJCK01nQVFRQVFGZ3dCQ3lBQVFaM0pBRUVBRUJZTElBRW9BaWdvQWhBaUFFRVFhaUFCS0FJc0lBQW9BZ1FSQUFBZ0FTZ0NFQ2dDRUNJQVFSQnFJQUVvQWhRZ0FDZ0NCQkVBQUFzZ0FVRkFheVFBSUFnTFVRRUNmMEYvSVFKQkFTRURBMEFDUUNBQUlBRVF0Z0VOQUNBRFJRUkFJQUFvQWtCQmZ6WUNtQUlMSUFBb0FoQkJMRWNFUUVFQUlRSU1BUXNnQUJBU0RRQWdBRUVPRUJCQkFDRUREQUVMQ3lBQ0N6TUJBWDhEUUFKQUlBRkJBRTRFZnlBQklBSkhEUUZCQVFWQkFBc1BDeUFBS0FMTUFTQUJRUU4wYWlnQ0FDRUJEQUFMQUF1RUF3RUdmeUFCS0FJNElRTUNRQUpBQWtBZ0FTMEFia0VCY1FSQUlBTkZCRUJCOHNJQUlRTWdBU2dDUUEwREMwR0M3Z0FoQXlBQ1FUcEdJQUpCelFCR2NnMENRUUFoQWlBQktBS0lBU0lEUVFBZ0EwRUFTaHNoQkFOQUlBSWdCRVlOQWtIZDdRQWhBeUFCS0FLQUFTQUNRUVIwYWlnQ0FDSUdRVHBHSUFaQnpRQkdjZzBESUFKQkFXb2hBZ3dBQ3dBTElBTkZEUUFnQVM4QmJDSUNRWUlNUmcwQUlBSkJDSFpCQTJzT0JBQUNBZ0FDQzBFQUlRUWdBU2dDaUFFaUFrRUFJQUpCQUVvYklRaEJBQ0VEQTBBZ0F5QUlSZzBDUVFBaEFnSkFJQUVvQW9BQklnVWdBMEVFZEdvb0FnQWlCa1VOQUFOQUFrQWdBaUFEUmdSQVFRQWhBaUFCS0FKOElnVkJBQ0FGUVFCS0d5RUZBMEFnQWlBRlJnMEVJQVlnQVNnQ2RDQUNRUVIwYWlJSEtBSUFSZ1JBSUFjb0FnUkZEUU1MSUFKQkFXb2hBZ3dBQ3dBTElBSkJCSFFoQnlBQ1FRRnFJUUlnQlNBSGFpZ0NBQ0FHUncwQkN3dEJtQ1FoQXd3Q0N5QURRUUZxSVFNTUFBc0FDeUFBSUFOQkFCQVdRWDhoQkFzZ0JBdGFBUUovSUFCQlFHc2lBeUFCS0FJQU5nSUFJQUJCS1JBUUlBTWdBeWdDQUNnQ0JDSUNOZ0lBSUFBb0FnQWdBa0tBZ0lDQUlCQytBeUVDSUFFb0FnQWdBallDQ0NBQVFRTVFFQ0FES0FJQUlBSVFPU0FBUWRBQUVCQUxSd0VCZndKL1FRQWdBU2dDQ0EwQUdpQUJLQUlBSWdJRWZ5QUNCVUYvSUFBZ0FSRGVCQTBCR2lBQktBSUFDeWdDZ0FJZ0FTZ0NER3BCQ2pvQUFDQUJRUUUyQWdoQkFBc0wzQUVCQW44Z0FDZ0NBQ0FBUVVCcklnTW9BZ0JCQUVFQUlBQW9BZ3hCQUJEb0F5SUNSUVJBSUFGQkFEWUNBRUYvRHdzZ0FrRUFOZ0p3SUFKQkFEWUNZQ0FDUW9DQWdJQVFOd0pJSUFKQ0FUY0NNQ0FDUVlBTU93RnNJQUpDQVRjQ1dDQUNRZ0UzQWxBZ0FTQUNOZ0lBSUFNZ0FqWUNBQ0FBUVFrUUVDQUJJQUVvQWdBb0FwZ0NOZ0lNSUFCQjZRQkJmeEFjSVFFZ0FFRzRBUkFRSUFCQkNCQWFJQU1vQWdCQkFCQVhJQUJCdUFFUUVDQUFRZk1BRUJvZ0F5Z0NBRUVBRUJjZ0FFRXRFQkFnQUNBQkVCNGdBeUFES0FJQUtBSUVOZ0lBUVFBTDNnUUJDWDhqQUVFUWF5SUdKQUFnQUNBQUtRT0FBUkFqSUFCQkVHb2hBeUFBUWFBQmFpRUVJQUFvQXFRQklRRURRQ0FCSUFSR1JRUkFJQUVvQWdRaEJVRUFJUUlEUUNBQ0lBRW9BaEJPUlFSQUlBQWdBU0FDUVFOMGFpa0RHQkFqSUFKQkFXb2hBZ3dCQ3dzZ0F5QUJJQUFvQWdRUkFBQWdCU0VCREFFTEN5QUFJQVEyQXFRQklBQWdBRUdnQVdvMkFxQUJJQUFRb2dVZ0FDZ0NWQ0FBUWRBQWFrWUVRRUVBSVFJRFFBSkFJQUFvQWtRaEFTQUNJQUFvQWtCT0RRQWdBU0FDUVJoc2FpSUJLQUlBQkVBZ0FDQUJLQUlFRU93QkN5QUNRUUZxSVFJTUFRc0xJQU1nQVNBQUtBSUVFUUFBSUFBb0FwQUNJZ1FFUUVFQUlRRURRRUVBSVFVZ0FVRUZSa1VFUUFOQVFRQWhBaUFGUVFKR1JRUkFBMEFnQWtFVVJ3UkFJQVFnQVVHZ0FXeHFJQVZCMEFCc2FpQUNRUUowYWtHb0RXb2lCeWdDQUNJSUJFQWdCQ2dDQUNJSktBSUFJQWhCQUNBSktBSUVFUUVBR2lBSFFRQTJBZ0FMSUFKQkFXb2hBZ3dCQ3dzZ0JVRUJhaUVGREFFTEN5QUJRUUZxSVFFTUFRc0xJQUFvQXRnQklBUkJBQ0FBS0FMY0FSRUJBQm9nQUVFQU5nS1FBZ3NnQUVIZ0FXb1FvUVVnQUVINEFXb1FvUVZCQUNFQ0EwQUNRQ0FBS0FJNElRRWdBaUFBS0FJc1RnMEFJQUVnQWtFQ2RHb29BZ0FpQVVFQmNVVUVRQ0FESUFFZ0FDZ0NCQkVBQUFzZ0FrRUJhaUVDREFFTEN5QURJQUVnQUNnQ0JCRUFBQ0FESUFBb0FqUWdBQ2dDQkJFQUFDQURJQUFvQXRRQklBQW9BZ1FSQUFBZ0JpQURLUUlJTndNSUlBWWdBeWtDQURjREFDQUdJQUFnQUNnQ0JCRUFBQ0FHUVJCcUpBQVBDMEdOa1FGQnJ2d0FRYjhQUWFUbEFCQUFBQXREQVFKL0lBQW9Bb2dCSVFKQmZ5RURBa0FEUUNBQ1FRQk1EUUVnQUNnQ2dBRWdBa0VCYXlJQ1FRUjBhaWdDQUNBQlJ3MEFDeUFDUVlDQWdJQUNjaUVEQ3lBREM4WUJBZ1IvQVg0akFFRVFheUlESkFBZ0FDQUJFQzBpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBQWtBZ0FDQURRUXhxSUFjUTVRRWlCa1VFUUF3QkN3SkFJQUFnQWhBL0lnRWdBeWdDREdwQkFXb1FLU0lFUlFSQVFRQWhCQXdCQ3lBRUlBWWdBeWdDREJBZklnVWdBeWdDREdvZ0FpQUJFQjhhSUFVZ0F5Z0NEQ0FCYW1wQkFEb0FBQ0FBSUFVZ0F5Z0NEQ0FCYWhDRkF5RUVJQUFvQWhBaUFVRVFhaUFGSUFFb0FnUVJBQUFMSUFBZ0JoQlVDeUFBSUFjUUR3c2dBMEVRYWlRQUlBUUx2d0VCQVg4Z0FTQURhaTBBQUVFOFJnUkFJQUFnQkVIL0FYRVFFU0FBSUFWQi8vOERjUkFxSUFOQkFXb2hBd3NnQVNBQ0tBSUVJZ0JCQldzaUFtb2lCaTBBQUVHMkFVWUVRQ0FBSUFGcUxRQUFRUlpHQkVBZ0JrRVJPZ0FBSUFCQkJHc2hBZ3NnQUVFQ2FpRUFJQUVnQW1vaUJpQUZPd0FCSUFZZ0JFRUJham9BQUNBQ1FRTnFJUUlEUUNBQUlBSk1SUVJBSUFFZ0FtcEJzd0U2QUFBZ0FrRUJhaUVDREFFTEN5QUREd3RCb2RVQVFhNzhBRUhzNVFGQnRkNEFFQUFBQzBJQkFYOENRQ0FBSUFGcUlnQXRBQUZCUFVjTkFFRUJJUUlDUUFKQUlBQXRBQUFpQUVFV2F3NEVBZ0VCQWdBTElBQkJzd0ZHRFFFTElBQkJIVVloQWdzZ0FndXpBUUVCZjBGL0lRTUNRQ0FCS0FKTVJRMEFBa0FDUUFKQUFrQWdBa0h4QUdzT0F3SUJBQU1MSUFFb0FyUUJJZ05CQUU0TkF5QUJJQUFnQVVIekFCQlBJZ0EyQXJRQklBQVBDeUFCS0FLd0FTSURRUUJPRFFJZ0FTQUFJQUZCOGdBUVR5SUFOZ0t3QVNBQUR3c2dBU2dDckFFaUEwRUFUZzBCSUFFZ0FDQUJRZkVBRUU4aUFEWUNyQUVnQUE4TElBSkJDRWNOQUNBQktBS29BU0lEUVFCT0RRQWdBU0FBSUFFUXlnTWlBellDcUFFTElBTUxSUUFnQUNnQ3pBRWdBVUVEZEdwQkJHb2hBUU5BSUFFb0FnQWlBVUVBU0VVRVFDQUFLQUowSUFGQkJIUnFJZ0VnQVNnQ0RFRUVjallDRENBQlFRaHFJUUVNQVFzTEN6QUFBMEFnQVVHQUFVbEZCRUFnQUNBQlFZQUJja0gvQVhFUUVTQUJRUWQySVFFTUFRc0xJQUFnQVVIL0FYRVFFUXNOQUNBQUlBRkIyb2dCRU9FRUMva0NBUVIvUVFFaENTQURJUWNDUUFOQUlBY29Bc3dCSUFWQkEzUnFRUVJxSVFVQ1FBSkFBMEFnQlNnQ0FDSUZRUUJJRFFFZ0JDQUhLQUowSWdZZ0JVRUVkR29pQ0NnQ0FFY0VRQ0FJUVFocUlRVU1BUXNMSUFZZ0JVRUVkR29vQWd4QkEzWkJEM0VoQ0VFQklRWWdDUVJBUVFBaEJnd0NDeUFBSUFNZ0IwRUFJQVVnQkVFQlFRRkJBQkNmQVNJRlFRQk9EUUVNQXdzZ0J5Z0NCQ0lHUlFSQUFrQWdCeWdDSUVVTkFFRUFJUVVnQnlnQ3dBSWlCa0VBSUFaQkFFb2JJUVlEUUNBRklBWkdEUUVnQkNBSEtBTElBaUlJSUFWQkEzUnFLQUlFUmdSQUlBZ2dCVUVEZEdvdEFBQWlDVUVFZGlFSUlBTWdCMFlFUUVFQklRWU1CUXRCQVNFR0lBQWdBeUFIUVFBZ0NVRUJka0VCY1NBRklBUWdDVUVDZGtFQmNTQUpRUU4yUVFGeElBZ1E5UUVpQlVFQVNBMEdEQVFGSUFWQkFXb2hCUXdCQ3dBTEFBc2dBQ0FFUWFHWEFSRC9Bd3dEQ3lBSEtBSU1JUVZCQUNFSklBWWhCd3dCQ3dzZ0FTQUdOZ0lBSUFJZ0NEWUNBQ0FGRHd0QmZ3dkdGd0VHZnlNQVFSQnJJZ3drQUNBTVFYODJBZ3dDZjBFQklBSkI4UUJyUVFOSkRRQWFRUUVnQWtFSVJnMEFHa0VBQ3lFTElBRW9Bc3dCSUFOQkEzUnFRUVJxSVFNQ1FBSkFBa0FDUUFKQUFrQURRQ0FES0FJQUlnTkJBRTRFUUNBQ0lBRW9BblFpQ2lBRFFRUjBhaUlKS0FJQUlnMUdCRUFnQkVGOWNVRzVBVWNFUUNBRElRa01CQXNnQ2lBRElnbEJCSFJxTFFBTVFRRnhSUTBESUFWQk1CQVJJQVVnQUNBQ0VCZ1FIU0FGUVFBUUVRd0hDeUFMSUExQjFBQkhja1VFUUNBRlFkZ0FFQkVnQlNBRFFmLy9BM0VRS2lBQUlBRWdBaUFFSUFVZ0RFRU1ha0VCRU9BQkN5QUpRUWhxSVFNTUFRc0xRWDhoQ1NBRFFYNUhCRUFnQVNBQ0VQUUJJUWtMSUF0QkFYTWdDVUVBVG5KRkJFQWdBQ0FCSUFJUTVBUWhDUXNDUUNBQ1FjMEFSeUFKUVFCT2NrVUVRQ0FCS0FKSVJRMEJJQUFnQVJEcUFpRUpDeUFKUVFCT0RRRUxBa0FnQVNnQ0xBUkFJQUVvQW5BZ0FrWU5BUXNnQTBGK1J3MEREQVFMSUFBZ0FTQUNFT2tDSWdsQkFFZ05BUXNDUUFKQUFrQUNRQ0FFUWJjQmF3NEhBZ0lBQXdBQkFnY0xBa0FnQ1VHQWdJQ0FBbkVpQXcwQUlBRW9BblFnQ1VFRWRHb3RBQXhCQVhGRkRRQWdCVUV3RUJFZ0JTQUFJQUlRR0JBZElBVkJBQkFSREFjTEFrQWdCRUc1QVdzT0F3SURBQWNMQWtBZ0F3MEFJQUVvQW5RZ0NVRUVkR29vQWd4QitBQnhRU0JIRFFBZ0JVRUxFQkVnQlVIWUFCQVJJQVVnQ1VILy93TnhFQ29nQlVITUFCQVJJQVVnQUNBQ0VCZ2lBaEFkSUFWQkJCQVJJQVVnQUNBQ0VCZ1FIUXdIQ3dKQUlBd29BZ3hCZjBjTkFDQUdJQWNvQWdRUTR3UkZEUUFnQlNBR0lBY2dDQUovSUFNRVFDQUpRWUNBZ0lBQ2F5RUpRZHNBREFFTFFlSUFRZGdBSUFFb0FuUWdDVUVFZEdvdEFBeEJBbkViQ3lBSkVPSUVJUWdNQndzZ0F3UkFJQVZCK1FBUUVTQUZJQUFnQWhBWUVCMGdCU0FKUWYvL0EzRVFLZ3dIQ3lBRlFmZ0FFQkVnQlNBQUlBSVFHQkFkSUFVZ0NVSC8vd054RUNvTUJnc2dCVUVHRUJFTElBbEJnSUNBZ0FKeEJFQWdCVUhjQUVIY0FFSGJBQ0FFUWIwQlJoc2dCRUc1QVVZYkVCRWdCU0FKUWYvL0EzRVFLZ3dGQ3dKQUFrQUNRQ0FFUWJrQmF3NEZBQUVCQVFBQkMwSGpBRUhaQUNBQktBSjBJQWxCQkhScUtBSU1RUUp4SWdCQkFYWWJJUU1nQUVVZ0JFRzlBVWR5RFFGQjVBQkIyUUFnQWtFSVJoc2hBd3dCQzBIaUFFSFlBQ0FCS0FKMElBbEJCSFJxTFFBTVFRSnhHeUVEQ3lBRklBTVFFU0FGSUFsQi8vOERjUkFxREFRTElBVkJDUkFSREFNTElBTkJma1lOQVFzZ0N5QUJLQUtRQVVFQVNISU5BQ0FGUWRnQUVCRWdCU0FCTHdHUUFSQXFJQUFnQVNBQ0lBUWdCU0FNUVF4cVFRQVE0QUVMSUFzZ0FTSURLQUtVQVVFQVNISkZCRUFnQlVIWUFCQVJJQVVnQVM4QmxBRVFLaUFBSUFFZ0FpQUVJQVVnREVFTWFrRUFFT0FCQ3dKQUFrQUNmd0pBQWtBQ1FBTkFJQU1vQWdRaUNrVUVRQ0FESVFvTUF3c2dDaWdDekFFZ0F5Z0NERUVEZEdwQkJHb2hBd05BSUFNb0FnQWlDVUVBVGdSQUlBSWdDaWdDZENJTklBbEJCSFJxSWdNb0FnQWlEa1lFUUNBRVFYMXhRYmtCUndSQUlBa2hBd3dGQ3lBTklBa2lBMEVFZEdvdEFBeEJBWEZGRFFRZ0JVRXdFQkVnQlNBQUlBSVFHQkFkSUFWQkFCQVJEQW9GQWtBZ0N5QU9RZFFBUjNJTkFDQURJQU1vQWd4QkJISTJBZ3dnQUNBQklBcEJBQ0FKUWRRQVFRQkJBRUVBRUo4QklnbEJBRWdOQUNBRlFkNEFFQkVnQlNBSlFmLy9BM0VRS2lBQUlBRWdBaUFFSUFVZ0RFRU1ha0VCRU9BQkN5QURRUWhxSVFNTUFnc0FDd3NnQ1VGK1J3UkFJQW9nQWhEMEFTSURRUUJPRFFJTElBc0VRQ0FBSUFvZ0FoRGtCQ0lEUVFCT0RRSUxBa0FDUUNBQ1FjMEFSdzBBSUFvb0FraEZEUUFnQUNBS0VPb0NJUU1NQVFzQ1FDQUtLQUlzUlEwQUlBb29BbkFnQWtjTkFDQUFJQW9nQWhEcEFpRUREQUVMQWtBZ0NVRitSZzBBSUFzZ0NpZ0NrQUVpQTBFQVNISU5BQ0FLS0FKMElBTkJCSFJxSWdNZ0F5Z0NERUVFY2pZQ0RDQUFJQUVnQ2tFQUlBb29BcEFCSUFNb0FnQkJBRUVBUVFBUW53RWhBeUFGUWQ0QUVCRWdCU0FEUWYvL0EzRVFLaUFBSUFFZ0FpQUVJQVVnREVFTWFrRUFFT0FCQ3lBTElBb29BcFFCSWdOQkFFaHlSUVJBSUFvb0FuUWdBMEVFZEdvaUF5QURLQUlNUVFSeU5nSU1JQUFnQVNBS1FRQWdDaWdDbEFFZ0F5Z0NBRUVBUVFCQkFCQ2ZBU0VESUFWQjNnQVFFU0FGSUFOQi8vOERjUkFxSUFBZ0FTQUNJQVFnQlNBTVFReHFRUUFRNEFFTElBb2lBeWdDSUVVTkFRd0RDd3NnQTBFQVNBMEJDeUFEUVlDQWdJQUNjVVVOQVNBS0tBS0FBU0FEUVlDQWdJQUNheUlEUVFSMGFpSUpJQWtvQWd4QkJISTJBZ3dnQUNBQklBcEJBU0FESUFKQkFFRUFRUUFRbndFTUFnc2dDaWdDSUVVTkEwRUFJUU1EUUNBRElBb29Bc0FDVGcwRUlBSWdDaWdDeUFJZ0EwRURkR29pRGlnQ0JDSU5SZ1JBSUFFZ0NrWU5CQ0FBSUFFZ0NrRUFJQTR0QUFBaUNrRUJka0VCY1NBRElBSWdDa0VDZGtFQmNTQUtRUU4yUVFGeElBcEJCSFlROVFFaEF3d0VCUUpBQWtBZ0RVRitjVUhTQUVjRVFDQUxJQTFCMUFCSGNrVU5BUXdDQ3lBTERRRUxJQU1oQ1NBQklBcEhCRUFnQUNBQklBcEJBQ0FPTFFBQVFRRjJRUUZ4SUFNZ0RVRUFRUUJCQUJEMUFTRUpDeUFGUWQ0QUVCRWdCU0FKUWYvL0EzRVFLaUFBSUFFZ0FpQUVJQVVnREVFTWFpQU5RZFFBUmhEZ0FRc2dBMEVCYWlFRERBRUxBQXNBQ3lBRFFRUjBJZ2tnQ2lnQ2RHb2lDeUFMS0FJTVFRUnlOZ0lNSUFBZ0FTQUtRUUFnQXlBQ0lBb29BblFnQ1dvb0Fnd2lBMEVCY1NBRFFRRjJRUUZ4SUFOQkEzWkJEM0VRbndFTElnTkJBRWdOQVFzQ1FBSkFBa0FDUUFKQUFrQUNRQ0FFUWJjQmF3NEhBUUVBQmdBREFRZ0xJQUVvQXNnQ0lBTkJBM1JxTFFBQUlnbEJCSEVFUUNBRlFUQVFFU0FGSUFBZ0FoQVlFQjBnQlVFQUVCRU1DQXRCQUNFS0FrQWdCRUc1QVdzT0F3SUdBQWdMSUFsQjhBRnhRY0FBUmdSQUlBVkJDeEFSSUFWQjNnQVFFU0FGSUFOQi8vOERjUkFxSUFWQnpBQVFFU0FGSUFBZ0FoQVlJZ0lRSFNBRlFRUVFFU0FGSUFBZ0FoQVlFQjBNQ0FzQ1FDQU1LQUlNUVg5SERRQWdCaUFIS0FJRUVPTUVSUTBBSUFVZ0JpQUhJQWhCNVFCQjNnQWdDVUVJY1JzZ0F4RGlCQ0VJREFnTElBVkIrZ0FRRVNBRklBQWdBaEFZRUIwZ0JTQURRZi8vQTNFUUtnd0hDeUFFUWIwQlJpRUtJQVJCdVFGckRnVUFBZ0lDQUFJTFFlWUFRZDhBSUFFb0FzZ0NJQU5CQTNScUxRQUFRUWh4SWdCQkEzWWJJUWtnQUVVZ0NrVnlEUUpCNXdCQjN3QWdBa0VJUmhzaENRd0NDeUFGUVFZUUVRdEI1UUJCM2dBZ0FTZ0N5QUlnQTBFRGRHb3RBQUJCQ0hFYklRa0xJQVVnQ1JBUklBVWdBMEgvL3dOeEVDb01BZ3NnQlVFSkVCRU1BUXNDUUFKQUFrQUNRQUpBSUFSQnR3RnJEZ2NDQWdJRUFBRURCUXNDUUNBTUtBSU1RWDlIRFFBZ0J5Z0NCQ0FHYWlJRExRQUJRVDFIRFFBQ1FBSkFJQU10QUFBaUEwRVphdzRGQVFJQ0FnRUFDeUFEUWJNQlJnMEFJQU5CRmtjTkFRc2dBUzBBYmtFQmNTSUVCRUFnQlVFMkVCRWdCU0FBSUFJUUdCQWRDeUFHSUFocUxRQUFRVHhHQkVBZ0JVRTRFQkVnQlNBQUlBSVFHQkFkSUFoQkFXb2hDQXNnQmlBSEtBSUVJZ2RCQldzaUNtb2lDUzBBQUVHMkFVY05CaUFHSUFkcUxRQUFJUU1DUUFKQUlBUUVRRUU3SVFzQ1FBSkFBa0FDUUNBRFFSbHJEZ1VDQVFFQkF3QUxRUlVoQkNBRFFSWkdEUVFnQTBHekFVWU5CUXNRQVFBTFFSZ2hCQXdDQzBFYklRUU1BUXRCT1NFTFFSRWhCQ0FEUVJaSERRRUxJQWtnQkRvQUFDQUhRUVJySVFvTElBZEJBbW9oQkNBR0lBcHFJZ01nQ3pvQUFDQURJQUFnQWhBWU5nQUJJQXBCQldvaEF3TkFJQU1nQkU0TkJpQURJQVpxUWJNQk9nQUFJQU5CQVdvaEF3d0FDd0FMSUFWQit3QVFFU0FGSUFBZ0FoQVlFQjBNQkFzZ0JVRUdFQkVnQlVFNEVCRWdCU0FBSUFJUUdCQWREQU1MSUFVZ0JFR0FBWE5CL3dGeEVCRWdCU0FBSUFJUUdCQWREQUlMSUFWQk9oQVJJQVVnQUNBQ0VCZ1FIUXdCQ3lBRlFaa0JFQkVnQlNBQUlBSVFHQkFkQ3lBTUtBSU1JZ0JCQUU0RVFDQUZRYllCRUJFZ0JTQUFFQjBnQVNnQ3BBSWdBRUVVYkdvZ0JTZ0NCRFlDQ0FzZ0RFRVFhaVFBSUFnUEMwR2gxUUJCcnZ3QVFaM21BVUgzM1FBUUFBQUwxZ0lCQkg4akFFR2dBV3NpQlNRQUlBRW9BZ0FoQmlBRlFZQUJOZ0lJSUFVZ0JVRVFhallDRENBRUJIOGdCVUVqT2dBUVFRRUZRUUFMSVFRQ2Z3SkFBMEFDZnlBRFFmOEFUQVJBSUFVb0Fnd2lCeUFFYWlBRE9nQUFJQVJCQVdvTUFRc2dCU2dDRENJSElBUnFJQU1Rb1FNZ0JHb0xJUVFnQlNBR1FRRnFOZ0tjQVVIY0FDRURBa0FnQmkwQUFDSUlRZHdBUmdSQUlBWXRBQUZCOVFCSERRRWdCVUdjQVdwQkFSRDVBU0VESUFKQkFUWUNBQXdCQ3lBSUlnUEFRUUJPRFFBZ0JrRUdJQVZCbkFGcUVGZ2hBd3NnQXhERkFVVU5BU0FGS0FLY0FTRUdJQVFnQlNnQ0NFRUdhMGtOQUNBQUtBSUFJQVZCREdvZ0JVRUlhaUFGUVJCcUVQVUVSUTBBQ3lBRktBSU1JUWRCQUF3QkN5QUFLQUlBSUFjZ0JCQ0ZBd3NoQXlBRlFSQnFJQWRIQkVBZ0FDZ0NBQ2dDRUNJQVFSQnFJQWNnQUNnQ0JCRUFBQXNnQVNBR05nSUFJQVZCb0FGcUpBQWdBd3VhQmdFRWYwRUJJUWtnQWtFQmRFSGc5d0pxTHdFQUlRSWdCVVVFUUNBQUlBSTJBZ0JCQVE4TElBSkIwSUlEYWlFR1FSSWhCd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQVZCQVdzT0lnQUFBQUFBQUFBQkFRSUNBZ0lDQkFNREF3TURBd1VGQlFVRkJRVUZCZ2NJQ1FrTEN5QUdJQUVnQTJzZ0JXeEJBWFJxSVFGQkFDRUNBMEFnQWlBRlJnUkFJQVVQQ3lBQUlBSkJBblJxSUFFZ0FrRUJkR292QUFBaUF6WUNBQ0FDUVFGcUlRSWdBdzBBQ3d3TEN5QUZRUWRySWdnZ0FTQURhMndoQWlBRUlBaHNRUUYwSVFGQkFDRUhBMEFnQnlBSVJnMEtJQVlnQWtFQmRDSURhaThBQUNBR0lBSkJBbllnQVdwcUxRQUFJQU5CQm5GMlFSQjBRWUNBREhGeUlnTkZEUXNnQUNBSFFRSjBhaUFETmdJQUlBZEJBV29oQnlBQ1FRRnFJUUlNQUFzQUN5QUdJQVZCQ1dzaUNDQUJJQU5yYkdvaEFVRUFJUUlEUUNBQ0lBaEdEUWtnQUNBQ1FRSjBhaUFCSUFKcUxRQUFFS3NESWdNMkFnQWdBa0VCYWlFQ0lBTU5BQXNNQ1FzZ0JVRUJjU0FGUVJCcklnSkJBVXRxSVFnZ0FrRUJka0VDYWlFSkN5QUJJQU5ySVFGQkFDRUNBMEFnQWlBSlJnUkFJQWtQQlNBQUlBSkJBblJxSUFZZ0FrRUJkR292QUFBZ0FVRUFJQUlnQ0VZYmFqWUNBQ0FDUVFGcUlRSU1BUXNBQ3dBTElBVkJGV3NoQndzZ0J5QUJJQU5yYkNBR2FrRUNhaUVCSUFZdkFBQWhBMEVBSVFJRFFDQUNJQWRHQkVBZ0J3OEZJQUFnQWtFQ2RHcEJJQ0FESUFFZ0Ftb3RBQUFpQkdvZ0JFSC9BVVliTmdJQUlBSkJBV29oQWd3QkN3QUxBQXNnQUNBR0lBRWdBMnRCQTJ4cUlnRXZBQUFpQWpZQ0FDQUNSUTBESUFBZ0FTMEFBaENyQXpZQ0JBd0NDeUFBSUFZdkFBSTJBZ2dnQUNBR0x3QUFOZ0lBSUFBZ0FTQURhMEVCZENBR2FpOEFCRFlDQkVFRER3c2dBU0FEYXlFQkFuOGdCVUVoUmdSQUlBWWdBVUYrY1dvaUFrRUJhaUVESUFJdEFBQVFxd01NQVFzZ0JpQUJRUUYyUVFOc2FpSUNRUUpxSVFNZ0FpOEFBQXNoQWlBQVFTQkJJRUVCSUFKQmtBaHJRU0JKR3lBQ1FZQUNTUnNnQW1vZ0FpQUJRUUZ4R3pZQ0FDQUFJQU10QUFBUXF3TTJBZ1FMUVFJaENBc2dDQThMUVFBTHRBSUJDSDhqQUVIUUFHc2lCeVFBSUFKQkFDQUNRUUJLR3lFTEEwQUNRQUpBSUFZZ0MwY0VRQ0FCSUFaQkFuUnFLQUlBSWdWQmdOZ0NheUlDUWFQWEFFME5BVUd4QlNFQ1FRQWhCQUpBQTBBZ0FpQUVTQTBCSUFVZ0FpQUVha0VDYlNJSVFRSjBRWkRpQW1vb0FnQWlDVUVPZGlJS1NRUkFJQWhCQVdzaEFnd0JDeUFGSUFsQkIzWkIvd0J4SWdRZ0NtcFBCRUFnQ0VFQmFpRUVEQUVMQ3lBSlFRRnhJQU5MRFFBZ0J5QUZJQWdnQ2lBRUlBbEJBWFpCUDNFUTZ3UWlBa1VOQUNBQUlBY2dBaUFERU93RURBTUxJQUFnQlJBZERBSUxJQWRCMEFCcUpBQVBDeUFBSUFKQi8vOERjU0lGUWN3RWJpSUVRWUFpY2hBZElBQWdCRUcwZTJ3Z0FtcEIvLzhEY1VFY2JrSGhJbW9RSFNBRlFSeHdJZ0pGRFFBZ0FDQUNRYWNqYWhBZEN5QUdRUUZxSVFZTUFBc0FDOXNHQWd4L0JuNGpBRUV3YXlJQ0pBQUNmZ0pBQWtBZ0FTa0RLQ0lPUW9DQWdJQndnMEtBZ0lDQWtIOVJCRUFnQVNrRENDSVFRb0NBZ0lCd2cwS0FnSUNBa0g5UkRRRUxJQUJCb3RzQVFRQVFGUXdCQ3lBQktRTWdJUklnQVNrREdDRVBJQUVwQXdBaEV5QUFJQUpCREdwQkFCQTlHaUFDUVFBMkFpUUNRQ0FQUW9DQWdJQndnMEtBZ0lDQU1GSUVRQ0FBSUFKQkpHb2dEeERXQVEwQkN5QUFJQUpCS0dvZ0V4RFdBUTBBSUFBZ0FrRXNhaUFCS1FNUUVIZEJBRWdOQUNBUXB5RUlJQkpDZ0lDQWdIQ0RJUkFnQWlnQ0xDSU1JQUlvQWlocUlRMGdEcWNpQkVFUWFpRUhJQVFvQWdSQi8vLy8vd2R4SVFvZ0FpZ0NKQ0VMUVFBaEFRTkFBa0FDUUFKQUlBUkJKQ0FCRU1jQklnWkJBRWdOQUNBR1FRRnFJZ01nQ2s4TkFDQUNRUXhxSUFRZ0FTQUdFRkVhSUFaQkFtb2hBUUpBQWtBQ1FBSkFBbjhnQkNrQ0JFS0FnSUNBQ0lOUUlnbEZCRUFnQnlBRFFRRjBhaThCQUF3QkN5QURJQWRxTFFBQUN5SURRU1JyRGdRQUF3VUJBZ3NnQWtFTWFrRWtFRHNhREFZTElBSkJER29nQ0NBTklBZ29BZ1JCLy8vLy93ZHhFRkVhREFVTElBTkI0QUJHRFFNTEFrQWdBMEV3YXlJRlFRbE5CRUFDUUNBQklBcFBEUUFDZnlBSlJRUkFJQWNnQVVFQmRHb3ZBUUFNQVFzZ0FTQUhhaTBBQUFzaUEwRXdhMEVKU3cwQUlBWkJBMm9nQVNBRElBVkJDbXhxSWdGQk1Fc2dBVUV3YXlJRElBdEpjU0lKR3lFQklBTWdCU0FKR3lFRkN5QUZSU0FGSUF0UGNnMEJJQUFnRHlBRnJSQnpJZzVDZ0lDQWdIQ0RJaEZDZ0lDQWdEQlJEUVVnRVVLQWdJQ0E0QUJSRFFZZ0FrRU1haUFPRUg5RkRRVU1CZ3NnQTBFOFJ5QVFRb0NBZ0lBd1VYSU5BQ0FFUVQ0Z0FSREhBU0lEUVFCSURRQWdBQ0FFSUFFZ0F4Q0VBU0lPUW9DQWdJQndnMEtBZ0lDQTRBQlJEUVVnQUNBU0lBNFFUU0lPUW9DQWdJQndneUlSUW9DQWdJQXdVZ1JBSUJGQ2dJQ0FnT0FBVVEwR0lBSkJER29nRGhCL0RRWUxJQU5CQVdvaEFRd0VDeUFDUVF4cUlBUWdCaUFCRUZFYURBTUxJQUpCREdvaUFDQUVJQUVnQkNnQ0JFSC8vLy8vQjNFUVVSb2dBQkEyREFVTElBSkJER29nRXhDSEFVVU5BUXdDQ3lBQ1FReHFJQWhCQUNBTUVGRWFEQUFMQUFzZ0FpZ0NEQ2dDRUNJQVFSQnFJQUlvQWhBZ0FDZ0NCQkVBQUF0Q2dJQ0FnT0FBQ3lFUElBSkJNR29rQUNBUEMyOEJBMzhEUUNBQUtBSW9JZ0ZCQUV4RkJFQWdBQ0FCUVFGcklnRTJBaWdnQUNnQ0FDQUFLQUlFSUFGQkEzUnFLUU1BRUE4TUFRc0xJQUFvQWdRaUFTQUFRUWhxSWdKSEJFQWdBQ2dDQUNnQ0VDSURRUkJxSUFFZ0F5Z0NCQkVBQUFzZ0FFRUVOZ0lzSUFBZ0FqWUNCQXRFQUNBQVFSQnFJQUVnQW5RZ0FtdEJFV29nQUNnQ0FCRURBQ0lBQkVBZ0FFRUFOZ0lNSUFCQkFUWUNBQ0FBSUFGQi8vLy8vd2R4SUFKQkgzUnlyVGNDQkFzZ0FBdXBBZ0VFZnlNQVFVQnFJZ2NrQUNBSElBRXRBQUFpQ0VFQmRrRUJjVFlDSkNBSElBaEJBblpCQVhFMkFpQWdCeUFJUVFSMlFRRnhJZ2cyQWlnZ0J5QUJMUUFCSWdrMkFoZ2dBUzBBQWlFS0lBZEJBRFlDUENBSElBWTJBaXdnQnlBRlFRSWdCU0FJR3lBRlFRRkhHellDRkNBSElBSWdCQ0FGZEdvMkFoQWdCeUFDTmdJTUlBY2dDallDSENBSFFnQTNBalFnQnlBS1FRSjBJZ1lnQ1VFRGRHcEJFR28yQWpBZ0NVRUJkQ0VFUVFBaENBTkFJQVFnQ0VaRkJFQWdBQ0FJUVFKMGFrRUFOZ0lBSUFoQkFXb2hDQXdCQ3dzZ0J5QUdRUTlxUWZBUGNXc2lCQ1FBSUFkQkRHb2dBQ0FFUVFBZ0FVRUhhaUFDSUFNZ0JYUnFRUUFRcFFZaEFTQUhLQUlzS0FJUUlnQkJFR29nQnlnQ05FRUFJQUFvQWdnUkFRQWFJQWRCUUdza0FDQUJDL3dHQWdoL0EzNGpBRUVRYXlJR0pBQUNRQUpBSUFBZ0FSRHdBaUlDUlEwQUlBQWdBeWtEQUJBb0lnNUNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQU9JUUVNQWdzQ1FDQUFJQUZCMVFBZ0FVRUFFQlFpREVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0JrRUlhaUFNRUtNQkRRQWdBaWdDQkNJRkxRQVFRU0Z4SWdORkJFQWdCa0lBTndNSUN3SkFJQVV0QUJFaUNVVUVRRUVBSVFJTUFRc2dBQ0FKUVFOMEVDa2lBa1VOQVFzQ1FBSitBa0FDUUFKQUFrQUNRQUpBQWtBZ0Jpa0RDQ0lNSUE2bklnb3BBZ1FpRFVMLy8vLy9CNE5WRFFBZ0FpQUZRUkJxSUFwQkVHb2lCeUFNcHlBTnB5SUVRZi8vLy84SGNTQUVRUjkySWdnZ0FCRHdCQ0lFUVFGR0RRTWdCRUVBU0EwQklBTU5BQ0FFUVFKSERRSUxJQUFnQVVIVkFFSUFFRVZCQUU0TkFRd0ZDeUFBUVl2TEFFRUFFRVlNQkFzZ0FDQU9FQTlDZ0lDQWdDQWhBUXdCQ3lBREJFQWdBQ0FCUWRVQUlBSW9BZ1FnQjJzZ0NIV3RFRVZCQUVnTkF3dENnSUNBZ0RBaERVS0FnSUNBNEFBZ0FCQStJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BeHBCQUNFRFFRQWhCQ0FGTEFBUVFRQklCRUFnQlNnQUV5RUVJQUJDZ0lDQWdDQVFSeUlOUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJDZ0lDQWdPQUFJUTBNQXdzZ0JDQUZha0VYYWlFRUN3TkFJQU1nQ1VjRVFFS0FnSUNBTUNFTUFrQWdBaUFEUVFOMGFpZ0NBQ0lGUlEwQUlBSWdBMEVEZEVFRWNtb29BZ0FpQzBVTkFDQUFJQW9nQlNBSGF5QUlkU0FMSUFkcklBaDFFSVFCSWd4Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQkFzZ0JFVWdBMFZ5UlFSQUFrQWdCQzBBQUVVTkFDQU1RaUNJcDBGMVR3UkFJQXluSWdVZ0JTZ0NBRUVCYWpZQ0FBc2dBQ0FOSUFRZ0RFR0hnQUVRN3dGQkFFNE5BQ0FBSUF3UUR3d0ZDeUFFRUQ4Z0JHcEJBV29oQkFzZ0FDQUJJQU1nREVHSGdBRVFyd0VoQlNBRFFRRnFJUU1nQlVFQVRnMEJEQU1MQ3lBQUlBRkJod0VnRFVHSGdBRVFHVUVBU0EwQklBQWdBVUhYQUNBQ0tBSUFJQWRySUFoMXJVR0hnQUVRR1VFQVNBMEJJQUVoRENBQUlBRkIyQUFnRGtHSGdBRVFHVUVBU0EwRUN5QUFLQUlRSWdCQkVHb2dBaUFBS0FJRUVRQUFEQVlMSUFFTUFRdENnSUNBZ0RBaERVS0FnSUNBSUFzaERDQUFJQTBRRHlBQUlBNFFEd3NnQUNBTUVBOGdBQ2dDRUNJQVFSQnFJQUlnQUNnQ0JCRUFBQXdCQ3lBQUlBNFFEd3RDZ0lDQWdPQUFJUUVMSUFaQkVHb2tBQ0FCQy9VQkFRaC9RWDhoQWlBQklBRkJBV3R4UlFSQUlBQkJFR29pQ0NBQlFRSjBJZ01nQUNnQ0FCRURBQ0lGQkg4Z0JVRUFJQU1RS3lFR0lBRkIvLy8vL3dOcVFmLy8vLzhEY1NFSklBQW9BalFoQndOQUlBUWdBQ2dDSkU5RkJFQWdCeUFFUVFKMGFpZ0NBQ0VDQTBBZ0FnUkFJQUFvQWpnZ0FrRUNkR29vQWdBaUF5Z0NEQ0VGSUFNZ0JpQUpJQU1vQWdoeFFRSjBhaUlES0FJQU5nSU1JQU1nQWpZQ0FDQUZJUUlNQVFzTElBUkJBV29oQkF3QkN3c2dDQ0FISUFBb0FnUVJBQUFnQUNBQlFRRjBOZ0l3SUFBZ0FUWUNKQ0FBSUFZMkFqUkJBQVZCZndzUEMwSHVqd0ZCcnZ3QVFZQVVRYzNaQUJBQUFBc1lBQ0FBS0FJUUlnQkJFR29nQVNBQ0lBQW9BZ2dSQVFBTEV3QWdBRUVRYWlBQklBSWdBQ2dDQ0JFQkFBdHVBUVIvUVg4aEJrRi9JQUlvQWdBaUJFRUJkaUFFYWlBRVFhblZxdFY2U3hzaEJRSkFBa0FnQXlBQktBSUFJZ2RHQkVBZ0FDQUZFQ2tpQUVVTkFpQUFJQU1nQkJBZkdnd0JDeUFBSUFjZ0JSQ0pBaUlBUlEwQkN5QUJJQUEyQWdBZ0FpQUZOZ0lBUVFBaEJnc2dCZ3VOQXdFRGZ5TUFRVUJxSWdJa0FBSkFJQUFnQVJCWklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFBSkFJQUFnQWtFa2FpQUJweUlFS0FJRVFmLy8vLzhIY1VFQ2FoQTlEUUFnQWtFa2FrRWlFRHNOQUNBQ1FRQTJBandEUUNBRUtBSUVRZi8vLy84SGNTQURTZ1JBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0JDQUNRVHhxRU1rQklnTkJDR3NPQmdVQ0JBRUdBd0FMSUFOQklrWWdBMEhjQUVaeURRWUxJQU5CZ1BEL0FIRkJnTEFEUnlBRFFTQlBjUTBHSUFJZ0F6WUNBQ0FDUVJCcUlnTkJFRUdCSVNBQ0VFNGFJQUpCSkdvZ0F4Q0lBUTBLREFjTFFmUUFJUU1NQkF0QjhnQWhBd3dEQzBIdUFDRUREQUlMUWVJQUlRTU1BUXRCNWdBaEF3c2dBa0VrYWtIY0FCQTdEUVFnQWtFa2FpQURFRHRGRFFFTUJBc2dBa0VrYWlBREVMa0JEUU1MSUFJb0Fqd2hBd3dCQ3dzZ0FrRWtha0VpRURzTkFDQUFJQUVRRHlBQ1FTUnFFRFloQVF3QkN5QUFJQUVRRHlBQ0tBSWtLQUlRSWdCQkVHb2dBaWdDS0NBQUtBSUVFUUFBUW9DQWdJRGdBQ0VCQ3lBQ1FVQnJKQUFnQVF1S0F3SURmZ0ovSXdCQkVHc2lBaVFBUW9DQWdJQXdJUVlDUUFKQUlBQWdBa0VJYWlBQUlBRVFKU0lCRUR3TkFBSkFJQUlwQXdnaUIwSUFWd1JBREFFTElBZENBWDBoQlFKQUFrQUNRQUpBSUFFZ0FrRUVhaUFDRUlvQ1JRMEFJQWNnQWlnQ0FDSUlyVklOQUNBQnB5RUpJQUlvQWdRaEF5QUVSUTBCSUFNcEF3QWhCaUFESUFOQkNHb2dDRUVEZEVFSWF4Q2NBUXdDQ3dKQUlBUUVRQ0FBSUFGQ0FCQk5JZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CaUFBSUFGQ0FFSUJJQVZCQVJEMEFrVU5BUXdHQ3lBQUlBRWdCUkJ6SWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQlFzZ0FDQUJJQVVRK2dGQkFFNE5BZ3dFQ3lBSVFRTjBJQU5xUVFocktRTUFJUVlMSUFrZ0NTZ0NLRUVCYXpZQ0tBc2dCMEtCZ0lDQUNGUU5BRUtBZ0lDQXdINGdCYm05SWdWQ2dJQ0FnTUNCZ1B6L0FIMGdCVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2hCUXNnQUNBQlFUQWdCUkJGUVFCT0RRRUxJQUFnQmhBUFFvQ0FnSURnQUNFR0N5QUFJQUVRRHlBQ1FSQnFKQUFnQmd2a0JRSUdmZ1IvSXdCQkVHc2lEQ1FBQW40Q1FBSkFBa0FnQUNBQkVDVWlCa0tBZ0lDQWNGUU5BQ0FHcHlJTEx3RUdRUUpIRFFBZ0N5MEFCVUVKY1VFSlJ3MEFJQXNvQWhBdEFETkJDSEZGRFFBZ0N5Z0NGQ2tEQUNJQlF2Ly8vLzhQVmcwQUlBd2dBY1FpQnpjRENDQUhJQXMxQWloU0RRQWdCeUFDckh3aUJVTC8vLy8vQjFVTkFDQUxOUUlnSUFWVEJFQWdBQ0FMSUFXbkVLd0ZEUU1MQW44Z0JFVWdBa0VBVEhKRkJFQWdDeWdDSkNJRUlBSkJBM1JxSUFRZ0FhZEJBM1FRbkFGQkFBd0JDeUFCcHdzaERVRUFJUVFnQWtFQUlBSkJBRW9iSVFJRFFDQUNJQVJIQkVBZ0F5QUVRUU4wYWlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWc0Z0RpZ0NBRUVCYWpZQ0FBc2dDeWdDSkNBRUlBMXFRUU4wYWlBQk53TUFJQVJCQVdvaEJBd0JDd3NnQ3lBRlBnSW9JQXNvQWhRZ0JVTC8vLy8vRDRNM0F3QWdCVUtBZ0lDQUNId2hBUXdCQ3lBQUlBeEJDR29nQmhBOERRRWdEQ2tEQ0NJQklBS3NJZ2g4SWdWQ2dJQ0FnSUNBZ0JCWkJFQWdBRUhRMmdCQkFCQVZEQUlMQWtBZ0JFVWdBa0VBVEhKRkJFQkNBQ0VISUFBZ0JpQUlRZ0FnQVVGL0VQUUNEUU1NQVFzZ0FTRUhDeUFDUVFBZ0FrRUFTaHV0SVFsQ0FDRUJBMEFnQVNBSlVnUkFJQU1nQWFkQkEzUnFLUU1BSWdoQ0lJaW5RWFZQQkVBZ0NLY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQklBZDhJUW9nQVVJQmZDRUJJQUFnQmlBS0lBZ1FoZ0ZCQUU0TkFRd0RDd3NnQUNBR1FUQWdCVUtBZ0lDQUNId2lBVUwvLy8vL0QxZ0VmaUFGUXYvLy8vOFBnd1ZDZ0lDQWdNQitJQVc1dlNJSFFvQ0FnSURBZ1lEOC93QjlJQWRDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJGUVFCSURRRUxJQUFnQmhBUElBVkMvLy8vL3crRElBRkMvLy8vL3c5WURRRWFRb0NBZ0lEQWZpQUZ1YjBpQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3d0JDeUFBSUFZUUQwS0FnSUNBNEFBTElRRWdERUVRYWlRQUlBRUwwZ01DQjM4RGZpTUFRU0JySWdRa0FDQUVRUUEyQWd3Z0JFRUFOZ0lJQWtBQ1FDQUVJQUFvQWhBb0FuaEpCRUFnQUJEcEFRd0JDeUFBSUFFZ0FpQUJRUUFRRkNJTFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0N5RUJEQUlMQWtBQ1FDQUxRb0NBZ0lCd1ZBMEFJQUFnQ3hES0FTSUtRUUJJRFFFQ1FDQUtCRUFnQUNBRVFReHFJQXNRMWdGRkRRRU1Bd3NnQUNBRVFRaHFJQVJCREdvZ0M2ZEJFUkNPQVNFSklBUW9BZ2doQlNBSlFRQklEUUlMSUFRb0Fnd2hDQU5BSUFjZ0NFWU5BUUpBSUFvRVFDQUFJQWNRcVFVaUJrVU5CQXdCQ3lBQUlBVWdCMEVEZEdvb0FnUVFHQ0VHQ3dKL0FrQWdBQ0FMSUFZZ0F4RDVCQ0lOUW9DQWdJQndneUlNUW9DQWdJQXdVZ1JBSUF4Q2dJQ0FnT0FBVWcwQklBQWdCaEFUREFVTElBQWdDeUFHUVFBUTFRRU1BUXNnQUNBTElBWWdEVUVIRUJrTElRa2dBQ0FHRUJNZ0IwRUJhaUVISUFsQkFFNE5BQXNNQVFzZ0FDQUZJQWdRV2tFQUlRVWdBQ0FDRUZ3aURFS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBUWdDemNER0NBRUlBdzNBeEFnQUNBRElBRkJBaUFFUVJCcUVDRWhBU0FBSUF3UUR5QUFJQXNRRHd3Q0N5QUFJQVVnQkNnQ0RCQmFJQUFnQ3hBUEMwS0FnSUNBNEFBaEFRc2dCRUVnYWlRQUlBRUxQd0VCZnlBQlFRQWdBVUVBU2hzaEFRTkFBa0FnQVNBRFJnUkFRWDhoQXd3QkN5QUFJQU5CQTNScUtBSUVJQUpHRFFBZ0EwRUJhaUVEREFFTEN5QURDLzhFQWdKL0JINENRQ0FDUXYvLy8vOXZXQVJBSUFBUUpBd0JDd0pBSUFBZ0FrRTlFSEVFZjBLQWdJQ0FNQ0VGUW9DQWdJQXdJUVpDZ0lDQWdEQWhDQ0FBSUFKQlBTQUNRUUFRRkNJSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFGQmdRSkJnQUlnQUNBSEVDWWJCVUVBQ3lFRElBQWdBa0UrRUhFRVFFS0FnSUNBTUNFRlFvQ0FnSUF3SVFaQ2dJQ0FnREFoQ0NBQUlBSkJQaUFDUVFBUUZDSUhRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRkJnZ1JCZ0FRZ0FDQUhFQ1liSUFOeUlRTUxJQUFnQWtFL0VIRUVRRUtBZ0lDQU1DRUZRb0NBZ0lBd0lRWkNnSUNBZ0RBaENDQUFJQUpCUHlBQ1FRQVFGQ0lIUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUZCaEFoQmdBZ2dBQ0FIRUNZYklBTnlJUU1MUW9DQWdJQXdJUVlDUUNBQUlBSkJ3QUFRY1VVRVFFS0FnSUNBTUNFSURBRUxRb0NBZ0lBd0lRVWdBQ0FDUWNBQUlBSkJBQkFVSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUF3Q0N5QURRWURBQUhJaEF3c0NRQUpBSUFBZ0FrSEJBQkJ4UlEwQVFvQ0FnSUF3SVFVZ0EwR0FFSEloQXlBQUlBSkJ3UUFnQWtFQUVCUWlCa0tBZ0lDQWNJTWlCMEtBZ0lDQU1GRU5BRUhEd2dBaEJDQUhRb0NBZ0lEZ0FGRU5BU0FBSUFZUU9FVU5BUXNDUUNBQUlBSkJ3Z0FRY1VVRVFFS0FnSUNBTUNFRkRBRUxJQU5CZ0NCeUlRTWdBQ0FDUWNJQUlBSkJBQkFVSWdWQ2dJQ0FnSENESWdKQ2dJQ0FnREJSRFFCQnRNSUFJUVFnQWtLQWdJQ0E0QUJSRFFFZ0FDQUZFRGhGRFFFTElBTkJnREJ4QkVCQnNla0FJUVFnQTBHQXhBQnhEUUVMSUFFZ0JUY0RHQ0FCSUFZM0F4QWdBU0FJTndNSUlBRWdBellDQUVFQUR3c2dBQ0FFUVFBUUZRc2dBQ0FJRUE4Z0FDQUdFQThnQUNBRkVBOExRWDhMd2dFQkFuOGdBaWdDQkVVRVFDQUNLQUlZSWdNZ0FpZ0NIQ0lFTmdJRUlBUWdBellDQUNBQ1FnQTNBaGdDUUNBQktBSUFCRUFnQWhDZkJRd0JDeUFBSUFJcEF5QVFJd3NnQUNBQ0tRTW9FQ01nQWlBQ0tBSUFRUUZySWdNMkFnQUNRQ0FEUlFSQUlBSW9BaEFpQXlBQ0tBSVVJZ1EyQWdRZ0JDQUROZ0lBSUFKQ0FEY0NFQ0FBUVJCcUlBSWdBQ2dDQkJFQUFBd0JDeUFDUW9DQWdJQXdOd01vSUFKQ2dJQ0FnREEzQXlBZ0FrRUJOZ0lFQ3lBQklBRW9BZ3hCQVdzMkFnd0xDNVVCQVFOK0lBRzlJZ0pDLy8vLy8vLy8vLy8vQUlNaEF5QUF2U0lFUXYvLy8vLy8vLy8vL3dDRFFvR0FnSUNBZ0lENC93QmFCRUFnQTBLQmdJQ0FnSUNBK1A4QVZBOExBbjlCZnlBRFFvQ0FnSUNBZ0lENC93QldJQUFnQVdOeURRQWFRUUVnQUNBQlpBMEFHa0VBSUFCRUFBQUFBQUFBQUFCaURRQWFJQVJDQUZNRVFDQUNRaitIcDBGL2N3OExJQUpDUDRpbkN3c3dBQ0FCUW9DQWdJQVFoRUtBZ0lDQWNJTkNnSUNBZ0RCUkJFQWdBQ0FCRURjUEN5QUFJQUZCT0VFQVFRQVFyUUlMS1FFQmZ5QUNRaUNJcDBGMVR3UkFJQUtuSWdNZ0F5Z0NBRUVCYWpZQ0FBc2dBQ0FCSUFJUXhRVUxVZ0lCZndGK1FvQ0FnSURnQUNFRUlBQWdBU0FDRUpNQklnTUVmaUFES0FJZ0lnTW9BZ3dvQWlBdEFBUUVRQ0FDUlFSQVFnQVBDeUFBRUd0Q2dJQ0FnT0FBRHdzZ0F6VUNFQVZDZ0lDQWdPQUFDd3M0QUNBQUlBRWdBaENUQVNJQVJRUkFRb0NBZ0lEZ0FBOExJQUFvQWlBb0Fnd2lBQ0FBS0FJQVFRRnFOZ0lBSUFDdFFvQ0FnSUJ3aEF0UkFnRitBWDhnQUNBQUtRT1FBVUVERUVraUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBRkNJSWluUVhWUEJFQWdBYWNpQXlBREtBSUFRUUZxTmdJQUN5QUFJQUpCTkNBQlFRTVFHUm9MSUFJTGxRRUJBMzhqQUVFUWF5SUVKQUFnQkNBQ053TUlJQUVvQWdBaUJTQUJLQUlFSWdZMkFnUWdCaUFGTmdJQUlBRkNBRGNDQUNBQUlBQWdBVUVnYWlBRFFRTjBhaWtEQUVLQWdJQ0FNRUVCSUFSQkNHb1FJUkFQSUFBZ0FTa0RFQkFQSUFBZ0FTa0RHQkFQSUFBZ0FTa0RJQkFQSUFBZ0FTa0RLQkFQSUFBb0FoQWlBRUVRYWlBQklBQW9BZ1FSQUFBZ0JFRVFhaVFBQzQwQkFRTi9Jd0JCRUdzaUJDUUFJQVFnQVRjRENDQURRUUYwSVFaQkFDRURBMEFDUUFKQUlBTkJBa1lOQUNBQVFjd0FRUUVnQXlBR2FrRUJJQVJCQ0dvUXp3RWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJRWDhoQlNBRFFRRkhEUUFnQUNBQ0tRTUFFQThMSUFSQkVHb2tBQ0FGRHdzZ0FpQURRUU4wYWlBQk53TUFJQU5CQVdvaEF3d0FDd0FMeUFZQ0JuOENmaU1BUVRCcklnTWtBQ0FCUVFocUlRVWdBVUhJQUdvaEJnSkFBa0FDUUFKQUEwQWdBU2dDVENJQ0lBWkdEUVFDUUFKQUFuOENRQUpBQWtBQ1FDQUJLQUlFSWdRT0JnQUNBZ1VMQVFZTElBSW9BZ2hGRFFJZ0FDQUJFT0FEREFZTEFrQUNRQ0FDS0FJSURnSUlBQUVMSUFGQkJEWUNCQ0FESUFJcEF4QTNBeWdnQUNBQUtRTlFJQUVnQTBFb2FrRUFFUDRCSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQ2lBQUlBRTFBZ0JDZ0lDQWdIQ0VJQU5CQVJDRUJVVUVRQ0FEUW9DQWdJQXdOd01ZSUFOQ2dJQ0FnREEzQXhBZ0FDQUlJQU1nQTBFUWFoQ3ZBaG9nQUNBREtRTUFFQThnQUNBREtRTUlFQThMSUFBZ0NCQVBEQW9MSUFBZ0FpQUNLUU1RRU44RERBa0xJQUlwQXhBaUNFSWdpS2RCZFU4RVFDQUlweUlISUFjb0FnQkJBV28yQWdBTElBUkJBVWNnQWlnQ0NDSUVRUUpIY2tVRVFDQUFJQWdRaWdGQkFRd0NDeUFCS0FKRUlnSWdCSzAzQXdBZ0FrRUlheUFJTndNQUlBRWdBa0VJYWpZQ1JBdEJBQXNoQWlBQlFRTTJBZ1FnQVNBQ05nSVVDeUFBSUFVUXRBSWlDVUtBZ0lDQWNJTWlDRUtBZ0lDQTRBQlJCRUFnQUNnQ0VDSUNLUU9BQVNFSUlBSkNnSUNBZ0NBM0E0QUJJQUFnQVJEZ0F5QUFJQUVvQWt3Z0NCRGZBeUFBSUFnUUR3d0NDeUFKUXYvLy8vOFBXQVJBSUFFb0FrUkJDR3NpQWlrREFDRUlJQUpDZ0lDQWdEQTNBd0FDUUFKQUlBbW5JZ0lPQXdFQUFBTUxJQUVnQWpZQ0JDQUFJQUVnQ0VFQUVQb0NJQUFnQ0JBUERBTUxJQU1nQ0RjREtDQUFJQUFwQTFBZ0FTQURRU2hxUVFBUS9nRWlDVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEZJQUFnQVRVQ0FFS0FnSUNBY0lRZ0EwRVFha0VBRUlRRkJFQWdBQ0FKRUE4TUJnc2dBMEtBZ0lDQU1EY0RDQ0FEUW9DQWdJQXdOd01BSUFBZ0NTQURRUkJxSUFNUXJ3SWFJQUFnQ1JBUFFRQWhBUU5BSUFGQkFrWU5CaUFBSUFOQkVHb2dBVUVEZEdvcEF3QVFEeUFCUVFGcUlRRU1BQXNBQ3lBSVFvQ0FnSUF3VWcwRElBRW9Ba1JCQ0dzaUFpa0RBQ0VJSUFKQ2dJQ0FnREEzQXdBZ0FDQUJFT0FESUFBZ0FTQUlRUUVRK2dJZ0FDQUlFQThNQVFzTEVBRUFDeUFBSUFGQ2dJQ0FnREJCQVJENkFnd0NDMEhaa1FGQnJ2d0FRYldaQVVIYkpSQUFBQXNnQUNBSUVBOExJQU5CTUdva0FBdWxBd0lFZndGK0l3QkJFR3NpQmlRQUFrQUNRQUpBQWtBZ0FrRUFTQVJBSUFZZ0FrSC8vLy8vQjNFMkFnQWdBVUhBQUVIY0lpQUdFRTRhREFFTElBQW9BaXdnQWswTkFpQUNSUVJBSUFGQjlvZ0JLQUFBTmdBRElBRkI4NGdCS0FBQU5nQUFEQUVMSUFBb0FqZ2dBa0VDZEdvb0FnQWlCRUVCY1EwRElBRWhBZ0pBSUFSRkRRQWdCQ2tDQkNJSFFvQ0FnSUFJZzFBRVFDQUVRUkJxSVFNZ0I2ZEIvLy8vL3dkeElRVkJBQ0VDUVFBaEFBTkFJQUlnQlVaRkJFQWdBQ0FDSUFOcUxRQUFjaUVBSUFKQkFXb2hBZ3dCQ3dzZ0FFR0FBVWdOQXdzZ0JFRVFhaUVGUVFBaEFDQUJJUUlEUUNBQUlBZW5RZi8vLy84SGNVOE5BUUovSUFkQ2dJQ0FnQWlEVUVVRVFDQUZJQUJCQVhScUx3RUFEQUVMSUFBZ0JXb3RBQUFMSVFNZ0FpQUJhMEU1U2cwQkFuOGdBMEgvQUUwRVFDQUNJQU02QUFBZ0FrRUJhZ3dCQ3lBQ0lBTVFvUU1nQW1vTElRSWdBRUVCYWlFQUlBUXBBZ1FoQnd3QUN3QUxJQUpCQURvQUFBc2dBU0VEQ3lBR1FSQnFKQUFnQXc4TFFlL2ZBRUd1L0FCQjN4ZEJvWUVCRUFBQUMwR1BrZ0ZCcnZ3QVFla1hRYUdCQVJBQUFBdUhBUUVFZnlBQVFSQnFJUU1nQVVISUFHb2hCQ0FCS0FKTUlRSURRQ0FDSUFSR1JRUkFJQUlvQWdRaEJTQUFJQUlwQXhBUUl5QUFJQUlwQXhnUUl5QUFJQUlwQXlBUUl5QUFJQUlwQXlnUUl5QURJQUlnQUNnQ0JCRUFBQ0FGSVFJTUFRc0xJQUVvQWdSQmZuRkJCRWNFUUNBQUlBRkJDR29RL2dJTElBTWdBU0FBS0FJRUVRQUFDMkFCQW44Z0FTQUJLQUlBUVFGcklnSTJBZ0FnQWtVRVFDQUFJQUVRM1FNZ0FDQUJLUU1RRUNNZ0FDQUJLUU1ZRUNNZ0FTZ0NDQ0lDSUFFb0Fnd2lBellDQkNBRElBSTJBZ0FnQVVJQU53SUlJQUJCRUdvZ0FTQUFLQUlFRVFBQUN3dnpBd0lEZndKK0l3QkJNR3NpQWlRQUFrQUNRQ0FBSUFGQktHb1F0QUlpQlVLQWdJQ0FjSU1pQmtLQWdJQ0E0QUJSRFFBZ0FpQUJLQUprUVFocklnTXBBd0EzQXlBZ0EwS0FnSUNBTURjREFDQUdRb0NBZ0lBd1VRUkFJQUFnQUNBQktRTVFRb0NBZ0lBd1FRRWdBa0VnYWhBaEVBOGdBQ0FDS1FNZ0VBOGdBQ2dDRUNBQkVOMEREQUlMSUFBZ0JSQVBRUUFoQXlBQUlBQXBBMUFnQUNBQ1FTQnFRUUFRL2dFaEJTQUFJQUlwQXlBUUR5QUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQURRQUpBSUFOQkFrY0VRQ0FDUVJCcUlBTkJBM1JxSUFBZ0FDa0RNQ0FEUVRWcUVFa2lCamNEQUNBR1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFZ0EwRUJSZ1JBSUFBZ0Fpa0RFQkFQQ3lBQUlBVVFEd3dEQ3lBQ1FvQ0FnSUF3TndNSUlBSkNnSUNBZ0RBM0F3QWdBQ0FGSUFKQkVHb2dBaEN2QWlFRUlBQWdCUkFQUVFBaEF3TkFJQU5CQWtaRkJFQWdBQ0FDUVJCcUlBTkJBM1JxS1FNQUVBOGdBMEVCYWlFRERBRUxDeUFFRFFJTUF3c2dBU0FCS0FJQVFRRnFOZ0lBSUFhbklBRTJBaUFnQTBFQmFpRUREQUFMQUFzZ0FDZ0NFQ0lES1FPQUFTRUZJQU5DZ0lDQWdDQTNBNEFCSUFJZ0JUY0RLQ0FBSUFFcEF4aENnSUNBZ0RCQkFTQUNRU2hxRUNFaEJTQUFJQUlwQXlnUUR5QUFLQUlRSUFFUTNRTWdBQ0FGRUE4TElBSkJNR29rQUF1ZkF3SUhmd0YrSXdCQk1Hc2lCaVFBQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlFTHdFR1FURkhEUUFnQkNnQ0lDSUZSUTBBSUFVb0FnQU5BQ0FDUWlDSXAwRjFUd1JBSUFLbklnUWdCQ2dDQUVFQmFqWUNBQXNnQUNBRlFSaHFJQUlRSUNBRklBTkJBV29pQkRZQ0FBSkFJQVJCQWtjTkFDQUZLQUlVRFFBZ0FDZ0NFQ0lFS0FLWUFTSUhSUTBBSUFBZ0FTQUNRUUFnQkNnQ25BRWdCeEU0QUFzZ0EwRUFSNjFDZ0lDQWdCQ0VJUUVnQlNBRFFRTjBhaUlFUVFScUlRZ2dCQ2dDQ0NFRUEwQWdCQ0FJUmtVRVFDQUVLQUlFSVFjZ0JpQUVLUU1JTndNQUlBWWdCQ2tERURjRENDQUVLUU1ZSVFzZ0JpQUNOd01nSUFZZ0FUY0RHQ0FHSUFzM0F4QWdBRUhMQUVFRklBWVFtZ01nQkNnQ0FDSUpJQVFvQWdRaUNqWUNCQ0FLSUFrMkFnQWdCRUlBTndJQUlBQW9BaEFnQkJDdUFpQUhJUVFNQVFzTElBVkJBU0FEYTBFRGRHb2lBMEVFYWlFSElBTW9BZ2doQkFOQUlBUWdCMFlOQVNBRUtBSUFJZ1VnQkNnQ0JDSUROZ0lFSUFNZ0JUWUNBQ0FFUWdBM0FnQWdBQ2dDRUNBRUVLNENJQU1oQkF3QUN3QUxJQVpCTUdva0FBdW9BZ0lFZndGOEl3QkJFR3NpQlNRQUEwQUNRRUYvSVFRQ1FBSkFBa0FDUUVFSElBSkNJSWluSWdZZ0JrRUhhMEZ1U1J0QkNXb09FUUlEQXdNREF3TURBd0FBQUFBREF3UUJBd3NnQXFjaEEwRUFJUVFNQXd0QkFDRUVJQUpDZ0lDQWdNQ0JnUHovQUh3aUFrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmdSQURBTUxRWUNBZ0lCNElRTWdBcjhpQjBRQUFBQUFBQURnd1dNTkFrSC8vLy8vQnlFRElBZEVBQURBLy8vLzMwRmtEUUlnQjVsRUFBQUFBQUFBNEVGakJFQWdCNm9oQXd3REMwR0FnSUNBZUNFRERBSUxRUUFoQkNBRlFReHFJQUtuUVFScVFRQVFxUUVnQUNBQ0VBOGdCU2dDRENFRERBRUxJQUFnQWhDTkFTSUNRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRRUxDeUFCSUFNMkFnQWdCVUVRYWlRQUlBUUxzUVlCRFg4akFFSHdBR3NpQnlRQUFrQUNRQUovSUFJZ0FrRUJheUlGY1VVRVFDQUJLQUlNUVFWMElBRW9BZ2hCSUNBRloyc2lDVzhpQldzZ0NVRUFJQVZCQUVvYmFpRU5JQWxCSUNBSlFmOEJjVzRpREd3aERpQUJEQUVMSUFJUWx3VWhDQ0FCS0FJQUlRVWdCMElBTndJWUlBZENnSUNBZ0lDQWdJQ0FmemNDRUNBSElBVTJBZ3dnQjBFTWFpQURJQUpCM3FnRWFpMEFBQ0lNYWtFQmF5QU1iaUlORUVFTkFVRUFJUVVnQnlnQ0RDSUxLQUlBUVFCQkJFSEVBQ0FIS0FJWUlnbEJBV3RuUVFGMGF5QUpRUUpKR3lJS1FSUnNJQXNvQWdRUkFRQWlCa1VOQVFOQUlBVWdDa1pGQkVBZ0J5Z0NEQ0VRSUFZZ0JVRVViR29pRGtJQU53SU1JQTVDZ0lDQWdJQ0FnSUNBZnpjQ0JDQU9JQkEyQWdBZ0JVRUJhaUVGREFFTEMwRUFJUVVnQmlBSEtBSWNJQUVnQ1VFQUlBa2dDRUVnSUFoQkFXdG5hMEVBSUFoQkFrOGJFS0VFSVFnRFFDQUZJQXBHUlFSQUlBWWdCVUVVYkdvUUd5QUZRUUZxSVFVTUFRc0xRUUFoQ1NBTEtBSUFJQVpCQUNBTEtBSUVFUUVBR2lBSURRRWdEQ0FOYkNBRGF5RUxRUUVoRGlBSFFReHFDeUVJUVg4Z0NYUkJmM01oRUVFQUlRb2dBa0VLUnlFUklBd2hCUU5BSUFNZ0NrME5BaUFGSUF4R0JFQWdEU0FPYXlFTkFrQWdDVVVFUUVFQUlRVWdEU0FJS0FJTVNRUkFJQWdvQWhBZ0RVRUNkR29vQWdBaEJRc2dEQ0VHSUJGRkJFQURRQ0FHUVFCTURRTWdCa0VCYXlJR0lBZEJJR3BxSUFVZ0JVRUtiaUlGUWZZQmJHcEJNSEk2QUFBTUFBc0FDd05BSUFaQkFFd05BaUFHUVFGcklnWWdCMEVnYW1wQk1FSFhBQ0FGSUFVZ0FtNGlCU0FDYkdzaUQwRUtTQnNnRDJvNkFBQU1BQXNBQ3lBSUtBSVFJQWdvQWd3Z0RSQm9JUVlnRENFRkEwQWdCVUVBVEEwQklBVkJBV3NpQlNBSFFTQnFha0V3UWRjQUlBWWdFSEVpRDBFS1NCc2dEMm82QUFBZ0JpQUpkaUVHREFBTEFBc2dDeUVGUVFBaEN3c0NRQ0FLSUFRaUJra05BQ0FESVFZZ0JDQUtSdzBBSUFCQkxoQVJDeUFBSUFkQklHb2dCV29nRENBRmF5SVBJQVlnQ21zaUJpQUdJQTlLR3lJR0VISWdCaUFLYWlFS0lBVWdCbW9oQlF3QUN3QUxJQUJCQVRZQ0RDQUhRUXhxSVFnTElBRWdDRWNFUUNBSUVCc0xJQWRCOEFCcUpBQUx3Z0VDQTM4QmZpQUFJQUJCSDNVaUEzTWdBMnNoQTBFQUFuOGdBU0FCUVFGcklnUnhSUVJBUVNBZ0JHY2lCV3NoQkNBQ0JFQkJIeUFGYTBFQUlBQkJBRTRiSUFOcUlBUnVEQUlMSUFSQkFDQUJRUUpQR3lBRGJBd0JDeUFBUVg5elFSOTJJUVFnQVVFQ2F5RUJJQVFDZmlBQ0JFQWdBNjBpQmlBQlFRTjBJZ0ZCNUtFRWFqVUNBSDVDSUlnZ0FVSGdvUVJxTlFJQUlBWitmRUlmaUF3QkN5QUJRUUowUVlDa0JHbzFBZ0FnQTYxK1FoMklDNmRxQ3lJQmF5QUJJQUJCQUVnYkMwZ0JBbjhqQUVFUWF5SUNKQUJCZnlFREFrQWdBQ0FDUVF4cUlBRVF1Z0VOQUNBQ0tBSU1JZ05CSld0QlhFc05BQ0FBUWRtSkFVRUFFRkJCZnlFREN5QUNRUkJxSkFBZ0F3dDFBUUYvQWtBZ0FVS0FnSUNBY0lOQ2dJQ0FnT0IrVVFSQURBRUxBa0FnQVVLQWdJQ0FjRlFOQUNBQnB5SUNMd0VHUVNGSERRQWdBaWtESUNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0SDVTRFFBTUFRc2dBRUdpTEVFQUVCVkNnSUNBZ09BQUR3c2dBYWNpQUNBQUtBSUFRUUZxTmdJQUlBRUxyZ0lDQVh3QmZ3SkFBMEFDUUFKQUFrQUNRQUpBUVFjZ0FrSWdpS2NpQkNBRVFRZHJRVzVKRzBFSmFnNFJBZ01EQXdNREF3TURBQUFBQUFNREJBRURDeUFCSUFMRU53TUFEQVVMSUFKQ2dJQ0FnTUNCZ1B6L0FId2lBa0wvLy8vLy8vLy8vLzhBZzBLQmdJQ0FnSUNBK1A4QVdnUkFJQUZDQURjREFBd0ZDeUFDdnlJRFJBQUFBQUFBQU9ERFl3UkFJQUZDZ0lDQWdJQ0FnSUNBZnpjREFBd0ZDeUFEUkFBQUFBQUFBT0JEWkFSQUlBRkMvLy8vLy8vLy8vLy9BRGNEQUF3RkN5QUJBbjRnQTVsRUFBQUFBQUFBNEVOakJFQWdBN0FNQVF0Q2dJQ0FnSUNBZ0lDQWZ3czNBd0FNQkFzZ0FTQUNwMEVFYWtFQUVJSURHaUFBSUFJUUR3d0RDeUFBSUFJUWpRRWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVnMEJDd3NnQVVJQU53TUFRWDhQQzBFQUM3RUNBUUovSXdCQklHc2lCQ1FBQWtBQ1FBSkFJQUlvQWd4RkJFQUNRQUpBQWtBQ1FDQUNLQUlJUWY3Ly8vOEhhdzRDQVFBQ0N5QUFFRFVNQWdzZ0FpZ0NCQTBEQ3lBQUlBSVFSQm9MUVFBaEFpQUJSUTBESUFGQ0FCQXdHZ3dEQ3lBQ0tBSUVSUTBCQ3lBQUVEVkJBU0VDSUFGRkRRRWdBVUlBRURBYURBRUxJQUFnQWlBQ0tBSUlRUUZxUVFKdFFRRVFrUVlnQUVFQkVORUJHaUFCSWdORkJFQWdBQ2dDQUNFRElBUkNBRGNDR0NBRVFvQ0FnSUNBZ0lDQWdIODNBaEFnQkNBRE5nSU1JQVJCREdvaEF3c2dBeUFBSUFCQi8vLy8vd05CQVJCREdpQURJQU1vQWdSQkFYTTJBZ1FnQXlBRElBSkIvLy8vL3dOQkFSRExBUnBCSUNFQ0lBTW9BZ2hCLy8vLy93ZEhCRUFnQXlnQ0RFRUFSMEVFZENFQ0N5QUJEUUFnQXhBYkN5QUVRU0JxSkFBZ0Fnc01BQ0FBSUFFUWlBTkJBRXdMRFFBZ0FDQUJJQUpCQWhEakF3dlJEQUVJZnlNQVFZQUJheUlGSkFBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQVNnQ0RBUkFJQUlvQWd3TkFRc2dBaWdDQ0VHQWdJQ0FlRVlFUUNBQVFnRVFNQm9NQ3dzZ0FTZ0NDRUgvLy8vL0IwWU5DU0FBUWdFUU1Cb0NRQ0FCSUFBUTB3RWlBeUFFUVlDQUJIRkZja1VFUUNBQ0tBSUlRZjcvLy84SFRnMExEQUVMSUFNTkFnc2dBU2dDQkVVTkNpQUNLQUlJUWYvLy8vOEhSZzBKREFvTElBQW9BZ0FoQnlBRlFnQTNBandnQlVLQWdJQ0FnSUNBZ0lCL053STBJQVVnQnpZQ01DQUZRVEJxSUFFUVJCb2dBaEN4QWlFS0lBUWhDQ0FCS0FJRUJFQWdDa0VBU0FSQUlBQVFOU0FGUVRCcUVCdEJBU0VHREF3TElBVWdCU2dDTkVFQmN6WUNOQ0FLUlNJTUlBUkJCbkZCQWtaeElBUnpJUWdMSUFCQ0FSQXdHaUFGUVRCcUlBQVFnZ0lOQkNBRlFnQTNBaWdnQlVLQWdJQ0FnSUNBZ0lCL053SWdJQVVnQnpZQ0hDQUZRZ0EzQWhRZ0JVS0FnSUNBZ0lDQWdJQi9Od0lNSUFVZ0J6WUNDQ0FGUVJ4cUlnRWdCVUV3YWlJSlFTQkJBaENmQkNBRlFRaHFJZ1lnQ1VFZ1FRTVFud1FnQVNBQklBSkJJQ0FDS0FJRVFRSnpFRU1hSUFZZ0JpQUNRU0FnQWlnQ0JFRURjeEJER2tFQUlRWUNRQ0FGS0FJUVFRQk1EUUFnQlVJQU53SmtJQVZDZ0lDQWdJQ0FnSUNBZnpjQ1hDQUZJQWMyQWxnZ0JVSUFOd0pRSUFWQ2dJQ0FnSUNBZ0lDQWZ6Y0NTQ0FGSUFjMkFrUWdCVUhFQUdvaUNVRWdRUU1RMHdJZ0JVSUFOd0o0SUFWQ2dJQ0FnSUNBZ0lDQWZ6Y0NjQ0FGSUFVb0FsZzJBbXdnQlVIc0FHb2lCMEdBZ0lDQUFrRUJRUndnQ0VFRmRrRS9jU0lCYTNRZ0FVRS9SaHNpQWF3UU1Cb2dCVUhZQUdvaUN5QUpJQWRCSUVFREVFTWFJQWNRR3lBTElBVkJIR29Rc2dJRVFDQUZRZGdBYWhBYklBVkJ4QUJxRUJzZ0FFRUFJQU1nQ0JDckJDRUdEQUVMSUFWQnhBQnFJZ2RCSUVFQ0VOTUNJQVZCMkFCcUlna2dCMEVCSUFFZ0EwRUJheUFJUVJ4MFFSOTFjV29pQVd1c1FTQkJBaERVQWlBRlFRaHFJQWtRc2dJRVFDQUZRZGdBYWhBYklBVkJ4QUJxRUJzZ0NFRUhjVUVEUmdSQUlBQkNBUkF3R2lBQVFRTWdBV3MyQWdoQkdDRUdEQUlMSUFCQkFCQ0pBVUVZSVFZTUFRc2dCVUhFQUdvUUd5QUZRZGdBYWhBYkN5QUZRUnhxRUJzZ0JVRUlhaEFiSUFZTkJDQUVRUWR4SVFZZ0NrRUFUZzBDSUFaQkJrWU5BMEVBSVFjZ0FDZ0NBQ0VKSUFWQk1Hb1FzUUloQVFKQVFRQWdDbXNpQkVFZ1R3UkFJQUZGRFFFTUJRc2dBVUYvSUFSMFFYOXpjUTBFSUFFZ0JIVWhCd3NnQlNnQ1FDQUZLQUk4SWdzZ0FTQUZLQUk0YXlBTFFRVjBhaEJvUVFkeFFRRkhEUU1nQlVJQU53SjRJQVZDZ0lDQWdJQ0FnSUNBZnpjQ2NDQUZJQWsyQW13Z0JVSHNBR29nQlVFd2FoQkVHaUFGSUFVb0FuUWdBV3MyQW5SQkFDRUJBMEFnQVNBRVJnMENJQUVFUUNBRlFld0FhaUFBRUVRYUN5QUJRUUZxSVFFZ0FFRUFJQVZCN0FCcUVKRUZSUTBBQ3d3REN5QUNLQUlJUWY3Ly8vOEhhdzRDQmdjRkN5QUFJQUFvQWdnZ0IybzJBZ2dnQlVFd2FpQUFFRVFhSUFVZ0FpZ0NFRFlDZkNBRklBSW9BZ3cyQW5nZ0JTQUNLQUlFTmdKd0lBVWdBaWdDQ0NBS2F6WUNkQ0FGUWV3QWFpRUNDeUFGS0FJNElnRWdCVUV3YWhDeEFtc2lCRUVCUmdSQUlBVkJNR29pQkNBQ0lBRkJBV3VzUVNCQkFSRFVBaUFGUVFScUlBUkJBQkNwQVNBQVFnRVFNQm9nQUNBRktBSUVJQU1nQ0JETUFTRUdEQUlMSUFOQi8vLy8vd05HQkVBZ0JVSFlBR29nQWtFQUVLa0JJQUlvQWdRTkF5QUZLQUpZSWdGQi8vLy8vd0ZNQkVBZ0FDQUZRVEJxSUFGQi8vLy8vd05CQVJDaUJDRUdEQU1MSUFWQk1Hb1FHeUFBUVFCQi8vLy8vd01nQ0JDckJDRUdEQWdMSUFJb0FnaEJJRTRFUUNBR1FRWkdEUUVnQWlnQ0JBMEJJQUFnQWlBRVFRRnJyRUVnUVFFUTFBSWdCVUVFYWlBQVFRQVFxUUVnQlNnQ0JDQURTdzBCQ3lBQUlBVkJNR29nQXlBSVFjZ0FJQUlRbmdRaEJnd0JDeUFBSUFWQk1Hb2dBeUFJUWNrQUlBSVFuZ1FoQmdzZ0JVRXdhaEFiSUFBZ0REWUNCQXdGQzBITzBBQkIxUHdBUWFFbFFmRWhFQUFBQ3lBQktBSUVJQUlRc1FKRmNTRURJQUlvQWdRZ0FTZ0NDRUdBZ0lDQWVFWkdCRUFnQUNBREVJd0JRUUloQmlBQ0tBSUVSUTBEREFRTElBQWdBeENKQVF3Q0N5QUNLQUlFSUFOQkFFcEdCRUFnQUVFQUVJa0JEQUlMSUFCQkFCQ01BUXdCQ3lBQUVEVUxRUUFoQmdzZ0JVR0FBV29rQUNBR0MxTUJBbjhqQUVFZ2F5SUVKQUFnQUNnQ0FDRUZJQVJDQURjQ0dDQUVRb0NBZ0lDQWdJQ0FnSDgzQWhBZ0JDQUZOZ0lNSUFSQkRHb2lCU0FBSUFFZ0FpQURFT1FESVFBZ0JSQWJJQVJCSUdva0FDQUFDNGdDQWdKL0FYNGpBRUVRYXlJRUpBQUNRQUpBSUFGQ2dJQ0FnSENEUW9DQWdJRGdmbElOQUNBQnB5RURBa0FnQWtVTkFDQUVRUWhxSUFOQkJHcEJBQkNDQXcwQUlBUXBBd2dpQlVLQmdJQ0FnSUNBY0ZNZ0JVTC8vLy8vLy8vL0QxVnlEUUFnQUNBQkVBOGdCVUtBZ0lDQUNIeEMvLy8vL3c5WUJFQWdCVUwvLy8vL0Q0TWhBUXdDQzBLQWdJQ0F3SDRnQmJtOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNoQVF3QkN5QURLQUlNUVlDQWdJQjRSdzBBSUFNb0FnaEZEUUFnQXlnQ0FFRUJSdzBCSUFOQkFEWUNDQXNnQkVFUWFpUUFJQUVQQzBIampBRkJydndBUWJIZ0FFR1NqQUVRQUFBTFFBRURmMEVCSUFCQjNxZ0VhaTBBQUNJQklBRkJBVTBiSVFOQkFTRUNJQUFoQVFOQUlBSWdBMFpGQkVBZ0FrRUJhaUVDSUFBZ0FXd2hBUXdCQ3dzZ0FRdTJGUU1KZnd4K0Fud2pBRUZBYWlJQ0pBQWdBa0VBUWNBQUVDc2hCQ0FCUVFCQjBBRVFLeUlDSUFBMUFoQTNBeGdnQWlBQU5RSVVOd01BSUFBMUFoZ2hDeUFDUWdJM0F5QWdBaUFMTndNSUlBSWdBQ2dDUUVFRGRFSHdBbXF0TndNUUlBQkJ6QUJxSVFFZ0FFSElBR29oQ0FOQUlBRW9BZ0FpQlNBSVJrVUVRQ0FGS0FJUUlRRWdBaUFDS1FNZ1FnSjhOd01nSUFJZ0Fpa0RFQ0FBS0FKQVFRTjBRWWdDYXExOE53TVFJQUlnQWlrRHdBRWdCVE1CQ0h3M0E4QUJJQUlnQWlrRHlBRWdCVFFDREh3M0E4Z0JBa0FnQVVVTkFDQUJMUUFRRFFBZ0FTZ0NHQ0VESUFJZ0Fpa0RhRUlCZkRjRGFDQUNJQUlwQTNBZ0EwRUNkQ0FCS0FJY1FRTjBha0UwYXExOE53TndDeUFGUWVRQmFpRUJJQVZCNEFGcUlRa0RRQ0FKSUFFb0FnQWlBMGNFUUNBQ0lBSXBBeUFpRFVJQmZDSU1Od01nSUFJZ0Fpa0RFRUx3QUh3aUN6Y0RFQ0FES0FJSUJFQWdBaUFOUWdKOElndzNBeUFnQWlBTElBTW9BZ3hCQTNTdGZDSUxOd01RQ3dKQUlBTW9BaFJGRFFBZ0FpQU1RZ0Y4TndNZ0lBSWdDeUFES0FJWUlnWkJGR3l0ZkRjREVFRUFJUUVEUUNBQklBWk9EUUVDUUNBREtBSVVJQUZCRkd4cUlnY29BZ2dOQUNBSEtBSUVSUTBBSUFJZ0Fpa0RJRUlCZkRjRElDQUhLQUlFS1FNWUlBUVFuUUVnQXlnQ0dDRUdDeUFCUVFGcUlRRU1BQXNBQ3lBREtBSWdCRUFnQWlBQ0tRTWdRZ0Y4TndNZ0lBSWdBaWtERUNBREtBSWtRUUowclh3M0F4QUxJQU1vQWl3RVFDQUNJQUlwQXlCQ0FYdzNBeUFnQWlBQ0tRTVFJQU1vQWpCQkRHeXRmRGNERUFzZ0F5a0RPQ0FFRUowQklBTXBBMEFnQkJDZEFTQURRUVJxSVFFTUFRc0xJQVZCQkdvaEFRd0JDd3NnQUVIVUFHb2hBU0FBUWRBQWFpRUlBMEFnQVNnQ0FDSURJQWhHUlFSQUFrQUNRQUpBSUFOQkJHc3RBQUJCRDNFT0FnRUFBZ3NnQXlnQ0dBUi9JQU12QVNJZ0F5OEJJR3BCQkhSQlFHc0ZRY0FBQ3lFR0lBTW9BaXdFUUVFQUlRRWdBeWdDTUNJSElRVURRQ0FCSUFWT1JRUkFJQU1vQWl3Z0FVRURkR29wQXdBZ0JCQ2RBU0FCUVFGcUlRRWdBeWdDTUNFRkRBRUxDeUFIUVFOMElBWnFJUVlMSUFNb0Fod0VRQ0FES0FJMFFRTjBJQVpxSVFZTEFrQWdBeThBQ1NJRlFZQWdjUTBBSUFNb0FneEZEUUFnQkNBRUtRTW9JQU0wQWhCOE53TW9Dd0ovUVFBZ0JVR0FDSEZGRFFBYUFuOGdBeWdDVEVVRVFDQUdRUmhxSVFaQkFBd0JDeUFHSUFNb0FrQnFRUmxxSVFaQkFRc2lBU0FES0FKRUlnVkZEUUFhSUFRZ0JDa0RNRUlCZkRjRE1DQUVJQVFwQXpnZ0JheDhOd000SUFGQkFXb0xJUUVnQkNBRUtRTVlRZ0Y4TndNWUlBUWdCQ3NESUNBR3Q2QTVBeUFnQkNBRUt3TUFJQUczb0RrREFBd0JDeUFES0FJSUlRY2dBaUFDS1FOSVFnRjhOd05JQWtBZ0F5Z0NERVVOQUNBQ0lBSXBBeUJDQVh3M0F5QWdBaUFDS1FOZ0lBY29BaHhCQTNTdGZEY0RZQ0FDSUFJcEExZ2dCeWdDSUNJR3JIdzNBMWdnQjBFd2FpRUJRUUFoQlFOQUlBVWdCazROQVFKQUlBRW9BZ1JGRFFBZ0FTZ0NBRUgvLy8vL0Ewc05BQ0FES0FJTUlBVkJBM1JxS1FNQUlBUVFuUUVnQnlnQ0lDRUdDeUFGUVFGcUlRVWdBVUVJYWlFQkRBQUxBQXNnQnkwQUVFVUVRQ0FIS0FJWUlRRWdBaUFDS1FOb1FnRjhOd05vSUFJZ0Fpa0RjQ0FCUVFKMElBY29BaHhCQTNScVFUUnFyWHczQTNBTEFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBMEVDYXk4QkFFRUNhdzRqQUFrQkFRRUJBQWtCQ1FJREJBVUpCd1lJQ0FrSkNRa0pDUWtKQ1FrSkNRRUJDUUVKQ3lBQ0lBSXBBNmdCUWdGOE53T29BU0FEUVFOckxRQUFRUWh4UlEwSklBSWdBaWtEc0FGQ0FYdzNBN0FCSUFNb0FoeEZEUWtnQWlBQ0tRTWdRZ0Y4TndNZ0lBSWdBaWtERUNBREtBSWdRUU4wclh3M0F4QWdBaUFDS1FPNEFTQUROUUlnZkRjRHVBRkJBQ0VCQTBBZ0FTQURLQUlnVHcwS0lBTW9BaHdnQVVFRGRHb3BBd0FnQkJDZEFTQUJRUUZxSVFFTUFBc0FDeUFES1FNWUlBUVFuUUVNQ0FzZ0FpQUNLUU9nQVVJQmZEY0RvQUVNQndzZ0F5Z0NIQ0lKUlEwR0lBTW9BaGdoQnlBQ0lBSXBBeUJDQVh3M0F5QWdBaUFDS1FPQUFTQUhLQUk4SWdaQkFuU3RmRGNEZ0FGQkFDRUJBMEFnQVNBR1RnMEhBa0FnQ1NBQlFRSjBhaWdDQUNJRlJRMEFJQUlDZmtRQUFBQUFBQUR3UHlBRktBSUF0eUlYb3lBQ0tRTWd1YUFpR0psRUFBQUFBQUFBNEVOakJFQWdHTEFNQVF0Q2dJQ0FnSUNBZ0lDQWZ3czNBeUFnQWdKK1JBQUFBQUFBQUVCQUlCZWpJQUlwQTRBQnVhQWlGNWxFQUFBQUFBQUE0RU5qQkVBZ0Y3QU1BUXRDZ0lDQWdJQ0FnSUNBZndzM0E0QUJJQVVvQWhBaUNpQUZRUmhxUncwQUlBb3BBd0FnQkJDZEFTQUhLQUk4SVFZTElBRkJBV29oQVF3QUN3QUxJQU1vQWhnaEJrRUFJUUVEUUNBQklBWW9BaEFpQlU1RkJFQWdCaUFCUVFOMGFpa0RHQ0FFRUowQklBRkJBV29oQVF3QkN3c2dBaUFDS1FNZ1FnRjhOd01nSUFJZ0Fpa0RFQ0FGUVFOMFFSaHFyWHczQXhBTUJRc2dBeWdDR0NJR1JRMEVRUUFoQVFOQUlBRWdCaTBBQlNJRlQwVUVRQ0FHSUFGQkEzUnFLUU1JSUFRUW5RRWdBVUVCYWlFQkRBRUxDeUFDSUFJcEF5QkNBWHczQXlBZ0FpQUNLUU1RSUFXdFFnT0dmRUlJZkRjREVBd0VDeUFES0FJWUlBUVF0d1FnQXlnQ0hDQUVFTGNFREFNTElBTW9BaGdpQVVVTkFpQUJLUU1BSUFRUW5RRWdBaUFDS1FNZ1FnRjhOd01nSUFJZ0Fpa0RFRUlZZkRjREVBd0NDeUFES0FJWUlnRkZEUUVnQWlBQ0tRTWdJZ3RDQVh3M0F5QWdBaUFDS1FNUVFoeDhJZ3czQXhBZ0FTZ0NDRVVOQVNBQ0lBdENBbnczQXlBZ0FpQU1JQUUwQWdCOE53TVFEQUVMSUFNb0FoaEZEUUFnQWlBQ0tRTWdRZ0Y4TndNZ0N5QURRUVJxSVFFTUFRc0xJQUlnQWlrRFVDQUNLUU5JSWc1Q01INThJZzgzQTFBZ0FpQUNLUU1RSUFBb0Fzd0JJZ0ZCQW5TdGZDSVFOd01RUVFBaEJTQUJRUUFnQVVFQVNoc2hBeUFDS1FNZ0lRc0RRQ0FESUFWR1JRUkFJQUFvQXRRQklBVkJBblJxSVFFRFFDQUJLQUlBSWdFRVFDQUJLQUlZSVFZZ0FpQUNLUU5vUWdGOE53Tm9JQUlnQWlrRGNDQUdRUUowSUFFb0FoeEJBM1JxUVRScXJYdzNBM0FnQVVFb2FpRUJEQUVMQ3lBRlFRRnFJUVVNQVFzTElBSWdDMElEZkNJUk53TWdJQUlnQUNnQ0tDSUdyRGNES0NBQ0lBQW9BaXdpQXlBQUtBSWtha0VDZEswaUN6Y0RNRUVBSVFFZ0EwRUFJQU5CQUVvYklRVURRQ0FCSUFWSEJFQWdBQ2dDT0NBQlFRSjBhaWdDQUNJRFFRRnhSUVJBSUFJZ0N5QURLQUlFSWdOQkgzVWdBMEgvLy8vL0IzRWdBMEVmZG5ScVFSRnFyWHdpQ3pjRE1Bc2dBVUVCYWlFQkRBRUxDeUFDQW40Z0JDc0RDQkN4QXlJWG1VUUFBQUFBQUFEZ1EyTUVRQ0FYc0F3QkMwS0FnSUNBZ0lDQWdJQi9DeUlNTndNNElBSUNmaUFFS3dNUUVMRURJaGVaUkFBQUFBQUFBT0JEWXdSQUlCZXdEQUVMUW9DQWdJQ0FnSUNBZ0g4TElnMDNBMEFnQWlBRUtRTVlJaEkzQTNnZ0FnSitJQVFyQXlBUXNRTWlGNWxFQUFBQUFBQUE0RU5qQkVBZ0Y3QU1BUXRDZ0lDQWdJQ0FnSUNBZndzaUV6Y0RnQUVnQWlBRUtRTW9JaFEzQTRnQklBSWdCQ2tETUNJVk53T1FBU0FDSUFRcEF6Z2lGamNEbUFFZ0JDc0RBQ0VYSUFJZ0Fpa0RjQ0FDS1FOZ0lCWWdGQ0FQSUJCOElBMThJQk44Zkh3Z0MzeDhmRGNERUNBQ0FuNGdGeEN4QXlBR3Q2QWdETG1nSUE2NW9DQUNLUU5vdWFBZ0VybWdJQlc1b0NBUnVhQWlGNWxFQUFBQUFBQUE0RU5qQkVBZ0Y3QU1BUXRDZ0lDQWdJQ0FnSUNBZndzM0F5QWdCRUZBYXlRQUMxQUJBbjhEUUNBQkxBQUFJZ1FFUUNBRUlBQXNBQUFpQTBFZ2FpQURJQU5Cd1FCclFScEpHMGNFUUVFQUR3VWdBVUVCYWlFQklBQkJBV29oQUF3Q0N3QUxDeUFDQkVBZ0FpQUFOZ0lBQzBFQkM3MEhBZ3AvQVg0akFFSGdBR3NpQXlRQVFvQ0FnSURnQUNFTkFrQWdBQ0FEUVF4cUlBRVF1d0VpQmtVTkFDQUdLQUlFSWd3aEJTQUdLQUlJSWdSQmdJQ0FnSGhHQkVBZ0JrRUFOZ0lFUVFBaEJRc2dCaWdDQUNFS0lBTkNBRGNEVUNBRFFnQTNBMGdnQXlBS05nSmNJQU5CeFFBMkFsZ0Nmd0pBQWtBZ0JFSC8vLy8vQjBZRVFDQURRY2dBYWtHQmd3RVErd0lNQVFzZ0JRUkFJQU5CeUFCcVFTMFFFU0FHS0FJSUlRUUxJQVJCL3YvLy93ZEdCRUFnQTBISUFHcEI5UndRK3dJTUFRdEJBQ0VGSUFOQ0FEY0NRQ0FEUW9DQWdJQ0FnSUNBZ0g4M0FqZ2dBeUFLTmdJMElBSWdBa0VCYXlJSWNVVUVRRUVnSUFobmEwRUFJQUpCQWs4YklRVUxBa0FDUUFKQUFrQWdCUVJBSUFOQk5Hb2dCaEJFRFFFZ0EwRTBha0VBUVJFUXpnRkJJSEVOQVNBREtBSThJZ1FnQlVFQmEwRUFJQVJCQUU0YmFpQUZiU0VGSUFSQmdJQ0FnSGhHQkVBZ0EwSElBR3BCcUpBQkVQc0NEQVVMUVFBaEJDQUZRUUJLRFFJZ0EwSElBR3BCdlpBQkVQc0NRUUFnQldzaEFnTkFJQUlnQkVZTkJTQURRY2dBYWtFd0VCRWdCRUVCYWlFRURBQUxBQXNnQXlBR0tBSVFOZ0l3SUFNZ0JpZ0NEQ0lGTmdJc0lBTkJBRFlDSkNBRElBUTJBaWdnQkVFQUlBUkJBRW9iSUFKQkFSQ05CVUVCYWlFSUFrQWdCUVJBSUFnZ0FrRUFFSTBGSVFWQkVDRUVBMEFnQTBFMGFpSUxJQUpCQUNBRUlBVnFJZ2xCQVdvaUIwSGdEeEQ4QWlBTElBc2dBMEVnYWlBSFFlQVBFRU55SWdkQklIRU5BeUFIUVJCeFJRMENJQU5CTkdvZ0F5Z0NQRUVCSUFrUTRRTU5BaUFFUVFKdElBUnFJUVFNQUFzQUN5QURRVFJxSUFOQklHb1FSQTBCREFNTElBTkJOR3BCQVJEUkFVRWdjVVVOQWdzZ0EwRTBhaEFiREFRTElBTkJ5QUJxSUFOQk5Hb2dBaUFGSUFVUWpBVU1BUXNnQXlnQ1RDRUZJQU5CeUFCcUlBTkJOR29nQWlBSUlBZ1FqQVVnQXlnQ1RDSUpJQVZCQVdvaUFpQUNJQWxKRzBFQmF5RUlJQU1vQWtnaEJ5QUZJUVFEUUFKQUlBa2dCQ0lDUVFGcUlnUk5CRUFnQ0NFQ0RBRUxJQUlnQjJvdEFBQkJNRWNOQUNBRUlBZHFMUUFBUVM1SERRRUxDeUFDSUFWTkRRQWdCU0FIYWlBQ0lBZHFJQWtnQW1zUW5BRWdBeUFGSUFKcklBbHFOZ0pNQ3lBRFFUUnFFQnNMSUFOQnlBQnFRUUFRRVNBREtBSlVEUUFnQXlnQ1NBd0JDMEVBSUFNb0FrZ2lBa1VOQUJvZ0NpZ0NBQ0FDUVFBZ0NpZ0NCQkVCQUJwQkFBc2hCQ0FHSUF3MkFnUWdBQ0FHSUFOQkRHb1FYaUFFUlFSQUlBQVFmQXdCQ3lBQUlBUVFZaUVOSUFBb0F0Z0JJZ0FvQWdBZ0JFRUFJQUFvQWdRUkFRQWFDeUFEUWVBQWFpUUFJQTBMdzNVQ0VuOEJmaU1BUWFBR2F5SURKQUFnQVNnQ3lBRWlCRUVBSUFSQkFFb2JJUVlEUUNBQ0lBWkdSUVJBSUFFb0Fzd0JJQUpCQTNScVFYODJBZ1FnQWtFQmFpRUNEQUVMQ3lBQktBSThCRUFnQVNnQ3pBRkJmallDREF0QkFDRUNJQUVvQW53aUJrRUFJQVpCQUVvYklRWUNmZ0pBQWtBRFFDQUNJQVpHQkVBQ1FFRUNJUUpCQWlBRUlBUkJBa3diSVFnRFFBSkFJQUlnQ0VZRVFFRUFJUUlEUUNBQ0lBWkdEUUlDUUNBQktBSjBJQUpCQkhScUlnUW9BZ2hCQUU0TkFDQUVLQUlFSWdoQkFrZ05BQ0FFSUFFb0Fzd0JJZ1FnQkNBSVFRTjBhaWdDQUVFRGRHb29BZ1EyQWdnTElBSkJBV29oQWd3QUN3QUxJQUVvQXN3QklnY2dBa0VEZEdvaUJDZ0NCRUVBU0FSQUlBUWdCeUFFS0FJQVFRTjBhaWdDQkRZQ0JBc2dBa0VCYWlFQ0RBRUxDd0pBSUFFb0FrUkZEUUFDUUNBQktBSWdEUUFnQVMwQWJrRUJjUTBBSUFFZ0FDQUJRZElBRUU4MkFwQUJJQUVvQWp4RkRRQWdBU0FBSUFGQjB3QVFUellDbEFFTEFrQWdBU2dDVENJSVJRMEFJQUVvQXFnQlFRQklCRUFnQVNBQUlBRVF5Z00yQXFnQkN5QUJLQUtzQVVFQVNBUkFJQUVnQUNBQlFmRUFFRTgyQXF3QkN3SkFJQUVvQW1CRkRRQWdBU2dDc0FGQkFFNE5BQ0FCSUFBZ0FVSHlBQkJQTmdLd0FRc2dBU2dDTUVVTkFDQUJLQUswQVVFQVRnMEFJQUVnQUNBQlFmTUFFRTgyQXJRQkN3SkFJQUVvQWtnaUJFVU5BQ0FBSUFFUTZnSWFJQUVvQWp4RkRRQWdBUzBBYmtFQmNRMEFJQUVvQXB3QlFRQk9EUUFnQVNnQ3pBRkJER29oQWdOQUFrQWdBaWdDQUNJQ1FRQklEUUFnQVNnQ2RDQUNRUVIwYWlJQ0tBSUVRUUZIRFFBZ0FpZ0NBRUhOQUVZTkFpQUNRUWhxSVFJTUFRc0xJQUFnQVVITkFCQlBJZ0pCQUVnTkFDQUJLQUowSUFKQkJIUnFJZ1lnQVNnQ3pBRWlCMEVNYWlnQ0FEWUNDQ0FISUFJMkFnd2dCa0VCTmdJRUlBWWdCaWdDREVFQ2NqWUNEQ0FCSUFJMkFwd0JDd0pBSUFFb0FpeEZEUUFnQVNnQ2NDSUNSUTBBSUFBZ0FTQUNFT2tDR2dzQ1FDQUJLQUlnQkVBZ0FTRUZEQUVMSUFFaEJTQUJLQUxBQWcwQ0N3TkFJQVVvQWdRaUFrVU5BU0FGS0FJTUlRWUNRQ0FJRFFBZ0FpZ0NURVVFUUVFQUlRZ01BUXNnQWlnQ3FBRkJBRWdFUUNBQ0lBQWdBaERLQXpZQ3FBRUxJQUlvQXF3QlFRQklCRUFnQWlBQUlBSkI4UUFRVHpZQ3JBRUxBa0FnQWlnQ1lFVU5BQ0FDS0FLd0FVRUFUZzBBSUFJZ0FDQUNRZklBRUU4MkFyQUJDMEVCSVFnZ0FpZ0NNRVVOQUNBQ0tBSzBBVUVBVGcwQUlBSWdBQ0FDUWZNQUVFODJBclFCQ3dKQUlBUU5BQ0FDS0FKSVJRUkFRUUFoQkF3QkN5QUFJQUlRNmdJYVFRRWhCQXNDUUNBQ0tBSXNSUTBBSUFJb0FuQWlCMFVOQUNBQUlBSWdCeERwQWhvTElBSW9Bc3dCSUFaQkEzUnFRUVJxSVFVRFFDQUZLQUlBSWdaQkFFaEZCRUFnQWlnQ2RDQUdRUVIwYWlJSElBY29BZ3dpQlVFRWNqWUNEQ0FBSUFFZ0FrRUFJQVlnQnlnQ0FDQUZRUUZ4SUFWQkFYWkJBWEVnQlVFRGRrRVBjUkNmQVJvZ0IwRUlhaUVGREFFTEN3SkFJQVpCZmtjRVFFRUFJUVVEUUNBQ0tBS0lBU0FGVEFSQVFRQWhCUU5BSUFVZ0FpZ0NmRTROQkFKQUlBSW9BblFnQlVFRWRHb2lCaWdDQkEwQUlBWW9BZ0FpQmtVZ0JrSFJBRVp5RFFBZ0FDQUJJQUpCQUNBRklBWkJBRUVBUVFBUW53RWFDeUFGUVFGcUlRVU1BQXNBQ3lBQ0tBS0FBU0FGUVFSMGFpZ0NBQ0lHQkVBZ0FDQUJJQUpCQVNBRklBWkJBRUVBUVFBUW53RWFDeUFGUVFGcUlRVU1BQXNBQzBFQUlRVURRQ0FGSUFJb0FueE9EUUVDUUNBQ0tBSjBJQVZCQkhScUlnWW9BZ1FOQUNBR0VKNEZSUTBBSUFBZ0FTQUNRUUFnQlNBR0tBSUFRUUJCQUVFQUVKOEJHZ3NnQlVFQmFpRUZEQUFMQUFzZ0FpSUZLQUlnUlEwQVFRQWhCUU5BSUFJb0FzQUNJQVZNQkVBZ0FpRUZEQUlGSUFBZ0FTQUNRUUFnQWlnQ3lBSWdCVUVEZEdvaUJ5MEFBQ0lHUVFGMlFRRnhJQVVnQnlnQ0JDQUdRUUoyUVFGeElBWkJBM1pCQVhFZ0JrRUVkaEQxQVJvZ0JVRUJhaUVGREFFTEFBc0FDd0FMSUFFb0FwUURJZ1JGRFFOQkFDRUNBMEFnQVNnQzlBRWdBa3dFUUVFQUlRY0RRQ0FISUFRb0FpQk9EUVlnQkNnQ0hDQUhRUlJzYWlJR0tBSUlSUVJBUVFBaEFpQUJLQUxBQWlJSVFRQWdDRUVBU2hzaEJTQUdLQUlNSVFnQ1FBSkFBMEFnQWlBRlJnMEJJQWdnQVNnQ3lBSWdBa0VEZEdvb0FnUkhCRUFnQWtFQmFpRUNEQUVMQ3lBQ1FRQk9EUUVMSUFBZ0NFR1ZKaEQvQXd3SkN5QUdJQUkyQWdBTElBZEJBV29oQnd3QUN3QUxJQUFnQVVFQlFRQWdBaUFCS0FMOEFTQUNRUVIwYWlJR0tBSU1JQVl0QUFRaUJrRUNka0VCY1NBR1FRRjJRUUZ4UVFBUXlRTWhCaUFDUVFGcUlRSWdCa0VBVGcwQUN3d0VDd1VnQVNnQ2RDQUNRUVIwYWlJSUlBRW9Bc3dCSUFnb0FnUkJBM1JxSWdnb0FnUTJBZ2dnQ0NBQ05nSUVJQUpCQVdvaEFnd0JDd3RCdVk0QlFhNzhBRUcxN0FGQjZEa1FBQUFMSUFGQkVHb2hDQ0FCS0FJVUlRSUNRQU5BSUFJZ0NFY0VRQ0FDS0FJRUlRUWdBa0VRYXlnQ0FDRUdJQUFnQWtFWWF4Q2JCU0lVUW9DQWdJQndnMEtBZ0lDQTRBQlJEUU1nQmtFQVNBMENJQUVvQXJRQ0lBWkJBM1JxSUJRM0F3QWdCQ0VDREFFTEN5QURJQUVvQW9BQ0lnMDJBdHdGSUFNZ0FTZ0NoQUlpRGpZQzRBVWdBQ2dDRUNFQ0lBTkNBRGNEaUFZZ0EwSUFOd09BQmlBRElBSTJBcFFHSUFOQk96WUNrQVlnQVVHQUFtb2hERUVBSVFRRFFDQUJLQUwwQVNBRVRBUkFRUUFoQmtFQUlRZ0ZRUUFoQWlBQktBTEFBaUlHUVFBZ0JrRUFTaHNoQ0NBQktBTDhBU0FFUVFSMGFpRUdBa0FnQTBHQUJtb0Nmd05BSUFJZ0NFY0VRQ0FCS0FMSUFpQUNRUU4wYWlJSEtBSUVJZ1VnQmlnQ0RFWUVRQ0FCS0FJa1FRSkhEUVFnQnkwQUFFRUljVVVOQkNBRFFZQUdhaUlDUVRBUUVTQUNJQUFnQmlnQ0RCQVlFQjFCQVF3REN5QUZRWDV4UWRJQVJnMERJQUpCQVdvaEFnd0JDd3NnQTBHQUJtb2lBa0UvRUJFZ0FpQUFJQVlvQWd3UUdCQWRJQVl0QUFSQkJuUWlBa0dBZjNFZ0FrSEFBSElnQmlnQ0FFRUFTQnNMUWY4QmNSQVJDeUFFUVFGcUlRUU1BUXNMQTBBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0RpQUlJZ0pLQkVBZ0FpQUNJQTFxSWdrdEFBQWlCRUVDZEVHQXVBRnFMUUFBSWc5cUlRZ0NRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FFUWJNQmF3NFFGQVVOQkFFQkFRRUNBUUVEQXdNVUN3QUxJQVJCRVdzaUFrRWZTdzBPUVFFZ0FuUkJnSURRakh4eERROGdBa1VOQ3lBQ1FRVkhEUTRnQTBGL05nSVlJQU5DeWZxQWdPQUJOd01RSUFOQjNBVnFJQWdnQTBFUWFoQW5SUTBSSUFOQmdBWnFJQU10QU93RkVCRWdBeWdDNUFVaENDQURLQUxvQlNJQ1FYOUdJQUlnQmtaeURSTWdBU0FCS0FMY0FrRUJhallDM0FJZ0EwR0FCbW9pQkVIQ0FSQVJJQVFnQWhBZElBSWhCZ3dUQ3lBQUlBRWdDU2dBQVNJQ0lBa3ZBQVVnQkNBRFFZQUdha0VBUVFBZ0NCRHBCQ0VJSUFBZ0FoQVREQklMSUFrdkFBa2hCeUFKS0FBQklRSWdBU2dDcEFJZ0NTZ0FCVUVVYkdvaUJDQUVLQUlBUVFGck5nSUFJQUFnQVNBQ0lBZEJ1d0VnQTBHQUJtb2dEU0FFSUFnUTZRUWhDQ0FBSUFJUUV3d1JDeUFBSUFOQm1BWnFJQU5CbkFacUlBRWdDU2dBQVNJSElBa3ZBQVVpQ1JEb0JDSUZRUUJJRFFVZ0F5Z0NuQVlpQ2tVTkJBSkFBa0FDUUFKQUFrQWdCRUcrQVdzT0F3QUFBUUlMQWtBQ1FBSkFJQXBCQldzT0JRQUJBZ1VDQkFzZ0JFRy9BVVlFUUNBRFFZQUdha0VSRUJFTElBTkJnQVpxSWdJZ0F5Z0NtQVlnQlJDbEFpQUNRY1FBRUJFTUJRc2dBMEdBQm1vaUFpQURLQUtZQmlBRkVLVUNJQUpCTEJBUklBUkJ2d0ZHRFFRZ0EwR0FCbXBCRHhBUkRBUUxJQVJCdndGR0JFQWdBMEdBQm1wQkVSQVJDeUFEUVlBR2FpSUNJQU1vQXBnR0lBVVFwUUlnQWtFc0VCRWdBa0VrRUJFZ0FrRUFFQ29NQXdzQ1FBSkFBa0FnQ2tFRmF3NEZBQUVCQWdJREN5QURRWUFHYWlJQ0lBTW9BcGdHSUFVUXBRSWdBa0hGQUJBUkRBUUxJQU5CZ0FacUlnSkJNQkFSSUFJZ0FDQUhFQmdRSFNBQ1FRQVFFUXdEQ3lBQUlBY1E1d1FpQkVVTkNDQUFJQU5CbUFacUlBTkJuQVpxSUFFZ0JDQUpFT2dFSVFVZ0FDQUVFQk1nQlVFQVNBMElJQU1vQXB3R1FRaEhEUVlnQTBHQUJtb2lBaUFES0FLWUJpQUZFS1VDSUFKQkd4QVJJQUpCSGhBUklBSkJMQkFSSUFKQkhSQVJJQUpCSkJBUklBSkJBUkFxREFJTEVBRUFDeUFEUVlBR2FpSUNRVEFRRVNBQ0lBQWdCeEFZRUIwZ0FrRUFFQkVMSUFBZ0J4QVREQkFMSUFrb0FBRWlBa0VBU0EwQklBSWdBU2dDckFKT0RRRWdBU2dDcEFJZ0FrRVViR29nQXlnQ2hBWWdEMm8yQWdnTURRdEJBQ0VGUVFBaEFpQUpMd0FCSWc4Z0FTZ0M4QUZIRFFnRFFDQUJLQUtJQVNBQ1NnUkFJQUVvQW9BQklBSkJCSFJxSWdRdEFBOUJ3QUJ4UlFSQUlBTkJnQVpxSWdkQkF4QVJJQWNnQkNnQ0RFRUJkRUVJZFJBZElBZEIzQUFRRVNBSElBSkIvLzhEY1JBcUN5QUNRUUZxSVFJTUFRc0xBMEFnQlNBQktBSjhUa1VFUUFKQUlBRW9BblFnQlVFRWRHb2lBaWdDQkEwQUlBSXRBQTlCd0FCeERRQWdBMEdBQm1vaUJFRURFQkVnQkNBQ0tBSU1RUUYwUVFoMUVCMGdCRUhaQUJBUklBUWdCVUgvL3dOeEVDb0xJQVZCQVdvaEJRd0JDd3NDUUNBQktBS1VBMFVFUUVGL0lRc01BUXNnQVVGL0VNZ0RJUXNnQTBHQUJtb2lBa0VJRUJFZ0FrSHBBQkFSSUFJZ0N4QWRJQUVnQzBFQkVHa2FJQUVnQVNnQzBBSkJBV28yQXRBQ0MwRUFJUVFEUUFKQUFrQWdBU2dDOUFFZ0JFb0VRRUVBSVFJZ0FTZ0N3QUlpQjBFQUlBZEJBRW9iSVFjZ0FTZ0MvQUVnQkVFRWRHb2lDUzBBQkNJUVFRRnhJUW9DZndOQUlBSWdCMGNFUUNBQktBTElBaUFDUVFOMGFpZ0NCQ0lGSUFrb0FneEdCRUJCQUNFS0lBSWhCMEVDREFNTElBVkJmbkZCMGdCR0JFQWdBMEdBQm1vaUJVSGVBQkFSSUFVZ0FrSC8vd054RUNwQkFTRUtJQUloQjBFQkRBTUZJQUpCQVdvaEFnd0NDd0FMQ3lBQktBSWtRUUJISVJFZ0VFRUNjU0lDUlNBSktBSUFRUUJPY1EwQ0lBTkJnQVpxSWdWQlBoQVJJQVVnQUNBSktBSU1FQmdRSFNBRlFZQi9RWUovSUJCQkJIRWJRUUFnQWhzZ0VYSkJnd0Z4RUJGQkFBc2hCU0FLUlNBSktBSUFJZ0pCQUVoeERRSUNRQ0FDUVFCT0JFQWdBMEdBQm1vaUFrRURFQkVnQWlBSktBSUFFQjBnQ1NnQ0RFSDhBRWNOQVNBRFFZQUdhaUlDUWMwQUVCRWdBa0VXRUIwTUFRc2dBMEdBQm1wQkJoQVJDd0pBQWtBQ1FDQUZRUUZyRGdJQkFBSUxJQU5CZ0FacUlnSkIzd0FRRVNBQ0lBZEIvLzhEY1JBcURBUUxJQU5CZ0FacUlnSkJ6QUFRRVNBQ0lBQWdDU2dDREJBWUVCMGdBa0VPRUJFTUF3c2dBMEdBQm1vaUFrRTVFQkVnQWlBQUlBa29BZ3dRR0JBZERBSUxJQUVvQXBRREJFQWdBMEdBQm1vaUFrRXBFQkVnQWtHMkFSQVJJQUlnQ3hBZElBRW9BcVFDSUF0QkZHeHFJQU1vQW9RR05nSUlDeUFBS0FJUUlnSkJFR29nQVNnQy9BRWdBaWdDQkJFQUFDQUJRZ0EzQXZRQklBRkJBRFlDL0FFTUN3c2dBMEdBQm1vaUFrRURFQkVnQWlBSktBSUFFQjBnQWtIQUFCQVJJQUlnQUNBSktBSU1FQmdRSFNBQ0lCRVFFUXNnQUNBSktBSU1FQk1nQkVFQmFpRUVEQUFMQUF0QmhTbEJydndBUVl6eUFVSDdPUkFBQUF0Qm1vSUJRYTc4QUVIWTZ3RkIzL1FBRUFBQUMwR3VoQUZCcnZ3QVFadnJBVUhmOUFBUUFBQUxBMEFnQWlBT1RrVUVRQ0FEUVlBR2FpQUNJQTFxSWdRZ0JDMEFBRUVDZEVHQXVBRnFMUUFBSWdRUWNpQUNJQVJxSVFJTUFRc0xJQXdROWdFZ0RDQURLUU9RQmpjQ0VDQU1JQU1wQTRnR053SUlJQXdnQXlrRGdBWTNBZ0FNREFzZ0RCRDJBU0FNSUFNcEE1QUdOd0lRSUF3Z0F5a0RpQVkzQWdnZ0RDQURLUU9BQmpjQ0FBSkFJQUVvQW93Q0RRQWdBU2dDcEFJaERTQURJQUVvQXZBQ05nS1lCaUFESUFFb0FvQUNJZ2syQXR3RklBTWdBU2dDaEFJaUN6WUM0QVVnQUNnQ0VDRUNJQU5DQURjRGlBWWdBMElBTndPQUJpQURJQUkyQXBRR0lBTkJPellDa0FZZ0FTZ0MwQUlpQWdSQUlBRWdBU2dDQUNBQ1FRUjBFRjhpQWpZQ3pBSWdBa1VORFFzQ1FDQUJLQUxjQWlJQ1JRMEFJQUV0QUc1QkFuRU5BQ0FCSUFFb0FnQWdBa0VEZEJCZklnSTJBdGdDSUFKRkRRMGdBVUVBTmdMb0FpQUJJQUVvQXZBQ05nTGtBZ3NnQVNnQ3RBRkJBRTRFUUNBRFFZQUdhaUlDUVF3UUVTQUNRUVFRRVNBQ1Fka0FJQUVvQXJRQkVGMExJQUVvQXJBQlFRQk9CRUFnQTBHQUJtb2lBa0VNRUJFZ0FrRUNFQkVnQWtIWkFDQUJLQUt3QVJCZEN5QUJLQUtzQVVFQVRnUkFJQU5CZ0FacUlnSkJEQkFSSUFKQkF4QVJJQUpCMlFBZ0FTZ0NyQUVRWFFzQ1FDQUJLQUtvQVVFQVNBMEFJQUVvQW1BRVFDQURRWUFHYWlJQ1FlRUFFQkVnQWlBQkx3R29BUkFxREFFTElBTkJnQVpxSWdKQkNCQVJJQUpCMlFBZ0FTZ0NxQUVRWFFzZ0FTZ0NtQUZCQUU0RVFFRUFJUUlnQVMwQWJrRUJjVVVFUUNBQktBSTRRUUJISVFJTElBTkJnQVpxSWdSQkRCQVJJQVFnQWhBUklBRW9BcHdCSWdKQkFFNEVRQ0FEUVlBR2FrSGFBQ0FDRUYwTElBTkJnQVpxUWRrQUlBRW9BcGdCRUYwTElBRW9BcUFCUVFCT0JFQWdBMEdBQm1vaUFrRU1FQkVnQWtFQ0VCRWdBa0haQUNBQktBS2dBUkJkQ3lBQktBS1FBVUVBVGdSQUlBTkJnQVpxSWdKQkRCQVJJQUpCQlJBUklBSkIyUUFnQVNnQ2tBRVFYUXNnQVNnQ2xBRkJBRTRFUUNBRFFZQUdhaUlDUVF3UUVTQUNRUVVRRVNBQ1Fka0FJQUVvQXBRQkVGMExRUUFoQWdKQUEwQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQWlBTFRnUkFRUUFoQWlBQktBS3NBaUlFUVFBZ0JFRUFTaHNoQkFOQUlBSWdCRVlOQWlBQ1FSUnNJUVlnQWtFQmFpRUNJQVlnRFdvb0FoQkZEUUFMUWRXREFVR3UvQUJCL2ZvQlFaUTRFQUFBQ3lBQ0lBSWdDV29pQmkwQUFDSUZRUUowUVlDNEFXb3RBQUFpQjJvaEJBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQlVIWUFHc09JQkFTR2hFU0doRVNHaG9hR2hvYUdob2FCQVFCQXdJYUdnd01CUVVGQlFVRkFBc0NRQ0FGUVFGckRoVUpDZ29MR2cwSEdnZ0lHaG9hQmhvYUR4b2FHZzRBQ3lBRlFTSnJJZ2hCSDBzTkdFRUJJQWgwSWdwQndPRUJjUTBTSUFwQkJYRkZCRUFnQ0VFZlJ3MFpJQVlvQUFGQk1FY05HaUFCSUFNb0FvUUdJQU1vQXBnR0VETWdBMEdBQm1wQjZRRVFFU0FFSVFJTUl3c2dCaThBQVNFQ0lBTkNxSUNBZ0hBM0ExQWdBMEhjQldvZ0JDQURRZEFBYWhBbkJFQUNRQ0FES0FMb0JTSUVRUUJJQkVBZ0F5Z0NtQVloQkF3QkN5QURJQVEyQXBnR0N5QUJJQU1vQW9RR0lBUVFNeUFEUVlBR2FpQUZRUUZxSUFJUVhTQUJJQWtnQ3lBREtBTGtCU0FEUVpnR2FoQ2tBaUVDRENNTElBRWdBeWdDaEFZZ0F5Z0NtQVlRTXlBRFFZQUdhaUFGSUFJUVhTQUVJUUlNSWdzZ0JpZ0FBU0VGSUFRaEJnd1dDeUFHS0FBQklRZEI3UUFoQlF3VUN5QUdLQUFCSVFkQjdBQWhCUXdUQ3lBQklBWW9BQUVnQTBHY0JtcEJBQkRIQXlFSElBTW9BdHdGSUFNb0F1QUZJQVFnQnhER0F3UkFJQUVnQjBGL0VHa2FJQU5CZ0FacVFRNFFFU0FFSVFJTUh3c2dBMExyZ0lDQWNEY0RZQ0FEUWR3RmFpQUVJQU5CNEFCcUVDZEZEUklnQXlnQzZBVWhDQ0FES0FMY0JTQURLQUxnQlNBREtBTGtCU0lHSUFjUXhnTkZEUklnQ0VFQVRnUkFJQU1nQ0RZQ21BWUxJQUVnQjBGL0VHa2FJQVZCQTNNaEJTQURLQUwwQlNFSERCd0xJQVl0QUFraENDQUdLQUFCSVFjZ0FTQUdLQUFGSUFOQm5BWnFRUUFReHdNaUFrRUFTQTBQSUFJZ0FTZ0NyQUpPRFE4Z0FTQURLQUtFQmlBREtBS1lCaEF6SUFFZ0FTZ0MxQUlpQmtFQmFqWUMxQUlnQVNnQ3pBSWdCa0VFZEdvaUJrRUVOZ0lFSUFZZ0JUWUNBQ0FES0FLRUJpRUtJQVlnQWpZQ0RDQUdJQXBCQldvMkFnZ2dBMEdBQm1vaUJpQUZFQkVnQmlBSEVCMGdCaUFOSUFKQkZHeHFJZ0lvQWd3Z0F5Z0NoQVpyRUIwZ0FpZ0NERUYvUmdSQUlBQWdBaUFES0FLRUJrRUVhMEVFRU9nQ1JRMGRDeUFEUVlBR2FpQUlFQkVnQkNFQ0RCMExJQU5DcVlDQWdIQTNBM0FnQTBIY0JXb2dCQ0FEUWZBQWFoQW5SUTBUSUFRaEFpQURLQUxvQlNJRVFRQklEUndnQXlBRU5nS1lCZ3djQ3lBRFFxdUJnSUJ3TndPZ0FTQURRZHdGYWlBRUlBTkJvQUZxRUNjRVFBSkFJQU1vQXVnRklnSkJBRWdFUUNBREtBS1lCaUVDREFFTElBTWdBallDbUFZTElBRWdBeWdDaEFZZ0FoQXpJQU5CZ0FacVFmTUJFQkVNR0FzZ0EwRi9OZ0tZQVNBRFFxeUJnSUNRelJvM0E1QUJJQU5CM0FWcUlBUWdBMEdRQVdvUUowVU5BQUpBSUFNb0F1Z0ZJZ1ZCQUVnRVFDQURLQUtZQmlFRkRBRUxJQU1nQlRZQ21BWUxJQUVnQXlnQ2hBWWdCUkF6SUFOQmdBWnFRZk1CRUJFZ0F5Z0M3QVZCQTNNaEJRd1lDeUFEUXVuVWdZQndOd09BQVNBRFFkd0ZhaUFFSUFOQmdBRnFFQ2RGRFJFZ0JVRUtSaUVLREEwTEFrQWdCaWdBQVNJR1FZQ0FnSUI0Y2tHQWdJQ0FlRVlOQUNBRFFveUJnSUJ3TndQZ0FTQURRZHdGYWlBRUlBTkI0QUZxRUNkRkRRQWdBeWdDNkFVaUFrRUFUZ1JBSUFNZ0FqWUNtQVlMSUFOQ2pvQ0FnSEEzQTlBQklBTkIzQVZxSUFNb0F1UUZJQU5CMEFGcUVDY0VRQ0FES0FMb0JTSUNRUUJJRFJjZ0F5QUNOZ0tZQmd3WEN5QUJJQU1vQW9RR0lBTW9BcGdHRURNZ0EwR0FCbXBCQUNBR2F4REZBd3dXQ3lBRFFvNkFnSUJ3TndQQUFTQURRZHdGYWlBRUlBTkJ3QUZxRUNjRVFDQURLQUxvQlNJQ1FRQklEUllnQXlBQ05nS1lCZ3dXQ3lBRFF1blVnWUJ3TndPd0FTQURRZHdGYWlBRUlBTkJzQUZxRUNjRVFDQUdRUUJISVFvTURRc2dBU0FES0FLRUJpQURLQUtZQmhBeklBTkJnQVpxSUFZUXhRTWdCQ0VDREJrTElBWW9BQUVpQWtIL0FVb05EeUFCSUFNb0FvUUdJQU1vQXBnR0VETWdBMEdBQm1vaUJpQUZRY01BYTBIL0FYRVFFU0FHSUFKQi93RnhFQkVnQkNFQ0RCZ0xJQVlvQUFFaEFpQURRbzZBZ0lCd053UHdBU0FEUWR3RmFpQUVJQU5COEFGcUVDY0VRQ0FBSUFJUUV5QURLQUxvQlNJQ1FRQklEUlFnQXlBQ05nS1lCZ3dVQ3lBQ1FTOUhEUTRnQVNBREtBS0VCaUFES0FLWUJoQXpJQU5CZ0FacVFjRUJFQkVnQkNFQ0RCY0xJQU5DeVlDQWdIQTNBNmdDSUFOQzJMYjVnbkEzQTZBQ0lBTkIzQVZxSUFRaUFpQURRYUFDYWhBbkRSWWdBMEYvTmdLWUFpQURRb0dFa0lDUUNUY0RrQUlnQTBIY0JXb2dBaUFEUVpBQ2FoQW5EUllnQTBGL05nS0lBaUFEUW9hT3FNaVFDVGNEZ0FJZ0EwSGNCV29nQWlBRFFZQUNhaEFuRFJZTURRc2dBMEtPZ0lDQWNEY0Q4QUlnQTBIY0JXb2dCQ0FEUWZBQ2FoQW5CRUFnQXlnQzZBVWlBa0VBU0EwU0lBTWdBallDbUFZTUVnc2dBMEtvZ0lDQWNEY0Q0QUlnQTBIY0JXb2dCQ0FEUWVBQ2FoQW5CRUFDUUNBREtBTG9CU0lDUVFCSUJFQWdBeWdDbUFZaEFnd0JDeUFESUFJMkFwZ0dDeUFCSUFNb0FvUUdJQUlRTXlBRFFZQUdha0VwRUJFTUVnc2dBMExwMUlHQWNEY0QwQUpCQUNFS0lBTkIzQVZxSUFRZ0EwSFFBbW9RSncwSUlBTkNxNEdBZ0hBM0E4QUNJQU5CM0FWcUlBUWdBMEhBQW1vUUp3UkFBa0FnQXlnQzZBVWlBa0VBU0FSQUlBTW9BcGdHSVFJTUFRc2dBeUFDTmdLWUJnc2dBU0FES0FLRUJpQUNFRE1nQTBHQUJtcEI4Z0VRRVF3U0N5QURRWDgyQXJnQ0lBTkNySUdBZ0pETkdqY0RzQUlnQTBIY0JXb2dCQ0FEUWJBQ2FoQW5SUTBNQWtBZ0F5Z0M2QVVpQlVFQVNBUkFJQU1vQXBnR0lRVU1BUXNnQXlBRk5nS1lCZ3NnQVNBREtBS0VCaUFGRURNZ0EwR0FCbXBCOGdFUUVTQURLQUxzQlVFRGN5RUZEQklMSUFOQmZ6WUNpQU1nQTBMRDlvQ0E0QUUzQTRBRElBTkIzQVZxSUFRZ0EwR0FBMm9RSjBVTkN3SkFJQU1vQXVnRklnSkJBRWdFUUNBREtBS1lCaUVDREFFTElBTWdBallDbUFZTElBRWdBeWdDaEFZZ0FoQXpJQU5CZ0FacUlnSWdBeTBBN0FVUUVTQUNJQU1vQXZ3RkVCME1FQXNnQTBGL05nSzRBeUFEUXRtNC9ZSndOd093QXlBRFFkd0ZhaUFFSUFOQnNBTnFFQ2RGRFFvZ0F5Z0M2QVVpQWtFQVRnUkFJQU1nQWpZQ21BWUxJQU5Dam9DQWdIQTNBNkFESUFNb0F1d0ZJZ1ZCQVdvaEJnSkFJQU5CM0FWcUlBTW9BdVFGSWdJZ0EwR2dBMm9RSndSL0lBTW9BdWdGSWdKQkFFNEVRQ0FESUFJMkFwZ0dDeUFESUFNb0F2QUZOZ0tVQTBGL0lRUWdBMEYvTmdLWUF5QURJQVZCQVdzMkFwQURJQU5CM0FWcUlBTW9BdVFGSWdJZ0EwR1FBMm9RSjBVTkFTQURLQUxrQlNFQ0lBTW9BdWdGQlVGL0N5RUVJQVloQlFzZ0FTQURLQUtFQmlBREtBS1lCaEF6SUFOQmdBWnFJQVVnQXlnQzhBVVFYU0FFUVFCSURSTWdBeUFFTmdLWUJnd1RDeUFHTHdBQklnSkIvd0ZMRFFrZ0EwS09nSUNBY0RjQ3pBUWdBeUFDTmdMSUJDQURRcENqZ29DUUN6Y0R3QVFDUUNBRFFkd0ZhaUFFSUFOQndBUnFFQ2RGQkVBZ0EwS09nSUNBY0RjRHNBUWdBeUFDTmdLc0JDQURRZGtBTmdLb0JDQURRbzZmZ29DUUFqY0RvQVFnQTBIY0JXb2dCQ0FEUWFBRWFoQW5SUTBCQ3dKQUlBTW9BdWdGSWdWQkFFZ0VRQ0FES0FLWUJpRUZEQUVMSUFNZ0JUWUNtQVlMSUFFZ0F5Z0NoQVlnQlJBeklBTkJnQVpxSWdaQmt3RkJrd0ZCa2dFZ0F5Z0M3QVVpQkVHUkFVWWJJQVJCandGR0d4QVJJQVlnQWtIL0FYRVFFUXdQQ3lBRFFvNkFnSUJ3TndLVUJDQURJQUkyQXBBRUlBTkNrWUNBZ0pBTE53T0lCQ0FEUW9TQWdJRFFFemNEZ0FRZ0EwSGNCV29nQkNBRFFZQUVhaEFuQkVBQ1FDQURLQUxvQlNJRlFRQklCRUFnQXlnQ21BWWhCUXdCQ3lBRElBVTJBcGdHQ3lBQklBTW9Bb1FHSUFVUU13SkFJQU1vQXZ3RlFTOUdCRUFnQTBHQUJtcEJ3UUVRRVF3QkN5QURRWUFHYWlJRVFRUVFFU0FFSUFNb0F2d0ZFQjBMSUFOQmdBWnFJZ1JCbEFFUUVTQUVJQUpCL3dGeEVCRU1Ed3NnQTBLT2dJQ0FjRGNDOUFNZ0F5QUNOZ0x3QXlBRFFwR0FnSUNRQ3pjRDZBTWdBMEtCZ0lDQTBCTTNBK0FESUFOQjNBVnFJQVFnQTBIZ0Eyb1FKd1JBQWtBZ0F5Z0M2QVVpQlVFQVNBUkFJQU1vQXBnR0lRVU1BUXNnQXlBRk5nS1lCZ3NnQVNBREtBS0VCaUFGRURNZ0EwR0FCbW9pQkNBREtBTDBCUkRGQXlBRVFaUUJFQkVnQkNBQ1FmOEJjUkFSREE4TElBTkNqb0NBZ0hBM0E5Z0RJQU1nQWpZQzFBTWdBMEhaQURZQzBBTWdBMEtkZ1lDQWtBSTNBOGdESUFOQzJMYjVnbkEzQThBRElBTkIzQVZxSUFRZ0EwSEFBMm9RSndSQUFrQWdBeWdDNkFVaUJVRUFTQVJBSUFNb0FwZ0dJUVVNQVFzZ0F5QUZOZ0tZQmdzZ0FTQURLQUtFQmlBRkVETWdBMEdBQm1vaUJDQURLQUxzQlNBREtBTHdCUkJkSUFSQmxBRVFFU0FFSUFKQi93RnhFQkVNRHdzZ0FTQURLQUtFQmlBREtBS1lCaEF6SUFOQmdBWnFRZGdBSUFJUVhTQUVJUUlNRWdzZ0JpOEFBU0VDSUFFZ0F5Z0NoQVlnQXlnQ21BWVFNeUFEUVlBR2FpQUZJQUlRWFNBRUlRSU1FUXNnQXlBR0x3QUJJZ0kyQXVRRUlBTkJmellDNkFRZ0F5QUZRUUZyTmdMZ0JDQURRZHdGYWlBRUlBTkI0QVJxRUNjRVFBSkFJQU1vQXVnRklnUkJBRWdFUUNBREtBS1lCaUVFREFFTElBTWdCRFlDbUFZTElBRWdBeWdDaEFZZ0JCQXpJQU5CZ0FacUlBVkJBV29nQWhCZERBMExJQUVnQXlnQ2hBWWdBeWdDbUFZUU15QURRWUFHYWlBRklBSVFYU0FFSVFJTUVBc2dBU0FKSUFzZ0JDQURRWmdHYWhDa0FpRUVEQVlMSUFFb0F0UUNJUXNnQVNnQ3pBSWhCa0VBSVFwQkFDRUpBMEFDUUNBS0lBdElCRUJCQXlFSUlBWW9BZ0FpQWtIcEFHdEJBMDhFUUNBQ1FlMEJSdzBDUVFFaENBc0NRQ0FCS0FLa0FpQUdLQUlNUVJSc2FpZ0NEQ0FHS0FJSUlnVnJJZ1JCZ0g5SUlBUWdDRUgvQUdwS2NrVUVRQ0FHUVFFMkFnUWdBa0h0QVVZRVFFSHNBU0VDSUFaQjdBRTJBZ0FNQWdzZ0JpQUNRWUVCYWlJQ05nSUFEQUVMSUFKQjZ3QkhJQVJCZ0lBQ2FrSC8vd05MY2cwQ0lBWkM3WUdBZ0NBM0FnQkJBaUVJUWUwQklRSUxJQVVnQXlnQ2dBWnFRUUZySUFJNkFBQWdCaWdDQkNJQ0lBTW9Bb0FHSUFWcWFpSUVJQVFnQ0dvZ0F5Z0NoQVlnQlNBSWFpQUNhbXNRbkFFZ0F5QURLQUtFQmlBSWF6WUNoQVpCQUNFRUlBRW9BcXdDSWdKQkFDQUNRUUJLR3lFSElBRW9BcVFDSVFJRFFDQUVJQWRHQkVBZ0FTZ0MxQUloQ3lBR0lRY2dDaUVFQTBBQ1FDQUxJQVJCQVdvaUJFd0VRRUVBSVFJZ0FTZ0M0QUlpQkVFQUlBUkJBRW9iSVFRRFFDQUNJQVJHRFFJZ0JTQUJLQUxZQWlBQ1FRTjBhaUlIS0FJQUlnMUpCRUFnQnlBTklBaHJOZ0lBQ3lBQ1FRRnFJUUlNQUFzQUN5QUhJZ0pCRUdvaEJ5QUNLQUlZSWcwZ0JVd05BU0FDSUEwZ0NHczJBaGdNQVFzTElBbEJBV29oQ1F3REN5QUZJQUlvQWd3aUMwZ0VRQ0FDSUFzZ0NHczJBZ3dMSUFKQkZHb2hBaUFFUVFGcUlRUU1BQXNBQ3dKQUlBbEZEUUFnQVNnQ3pBSWhBa0VBSVFVRFFDQUZJQXRPRFFFZ0FTZ0NwQUlnQWlnQ0RFRVViR29vQWd3Z0FpZ0NDQ0lFYXlFR0FrQUNRQUpBQWtBZ0FpZ0NCRUVCYXc0RUFBRURBZ01MSUFNb0FvQUdJQVJxSUFZNkFBQWdBU2dDMUFJaEN3d0NDeUFES0FLQUJpQUVhaUFHT3dBQURBRUxJQU1vQW9BR0lBUnFJQVkyQUFBTElBSkJFR29oQWlBRlFRRnFJUVVNQUFzQUN5QUFLQUlRSWdKQkVHb2dBU2dDekFJZ0FpZ0NCQkVBQUNBQlFRQTJBc3dDSUFBb0FoQWlBa0VRYWlBQktBS2tBaUFDS0FJRUVRQUFJQUZCQURZQ3BBSUNRQ0FCTFFCdVFRSnhEUUFnQVNnQzJBSkZEUUFnQVNnQ0FDZ0NFQ0VDSUFGQ0FEY0M5QUlnQVVJQU53TDhBaUFCSUFJMkFvZ0RJQUZCT3pZQ2hBTWdBVUgwQW1vaEJTQUJLQUx3QWlFSFFRQWhBa0VBSVFnRFFDQUNJQUVvQXVBQ1RnMEJBa0FnQVNnQzJBSWdBa0VEZEdvaUJpZ0NCQ0lFUVFCSUlBUWdCMFp5RFFBZ0JpZ0NBQ0lHSUFocklncEJBRWdOQUFKQUlBUWdCMnNpQ0VFQmFpSUhRUVJMSUFwQk1rdHlSUVJBSUFVZ0J5QUtRUVZzYWtFQmFrSC9BWEVRRVF3QkN5QUZRUUFRRVNBRklBb1E1Z1FnQlNBSVFRRjBJQWhCSDNWekVPWUVDeUFHSVFnZ0JDRUhDeUFDUVFGcUlRSU1BQXNBQ3lBQUtBSVFJZ0pCRUdvZ0FTZ0MyQUlnQWlnQ0JCRUFBQ0FCUVFBMkF0Z0NJQXdROWdFZ0RDQURLUU9RQmpjQ0VDQU1JQU1wQTRnR053SUlJQXdnQXlrRGdBWTNBZ0FnQVVFQk5nS2dBaUFCS0FLTUFnMFNJQUVvQW9BQ0lRY2dBeUFCS0FLRUFpSUVOZ0xjQlNBRElBQWdCRUVCZEJBcElnWTJBdVFGSUFaRkRSNUJBQ0VDSUFSQkFDQUVRUUJLR3lFRUEwQWdBaUFFUmtVRVFDQUdJQUpCQVhScVFmLy9BenNCQUNBQ1FRRnFJUUlNQVFzTElBTkJBRFlDOEFVZ0EwSUFOd0xvQlNBRFFRQTJBdUFGQWtBZ0FDQURRZHdGYWtFQVFRQkJBQkREQVEwQUEwQUNRQUpBQWtBZ0F5Z0M3QVVpQWtFQVNnUkFJQU1nQWtFQmF5SUNOZ0xzQlNBSElBTW9BdWdGSUFKQkFuUnFLQUlBSWdScUlnZ3RBQUFpQWtFS2FrSC9BWEZCQzBrRVFFSGdrd0VoQlF3RUN5QUVJQUpCRDJvZ0FpQUNRYk1CU3hzaUJrRUNkQ0lLUVlDNEFXb3RBQUJxSWdrZ0F5Z0MzQVZLQkVCQis1SUJJUVVNQkFzZ0F5Z0M1QVVnQkVFQmRHb3ZBUUFoRENBS1FZRzRBV290QUFBaEJRSkFJQVpCSVdzaUMwRVFTMEVCSUF0MFFiK0FCSEZGY2tVRVFDQUlMd0FCSUFWcUlRVU1BUXNnQmtIOUFXdEJBMHNOQUNBQ0lBVnFRZTRCYXlFRkN5QUZJQXhLQkVCQndaTUJJUVVNQkFzQ1FDQUtRWUs0QVdvdEFBQWdCV3NnREdvaUJpQURLQUxnQlV3TkFDQURJQVkyQXVBRklBWkIvdjhEVEEwQVFhT1RBU0VGREFRTEFrQUNRQUpBQWtBQ1FBSkFBa0FnQWtIcEFHc09Ed0lDQVFJREN3a0pDUVFHQkFVRkJRQUxJQUpCSTJzaUJVRU5TdzBIUVFFZ0JYUkI1ZkFBY1EwS0RBY0xJQVFnQ0NnQUFXcEJBV29oQ1F3SEN5QUFJQU5CM0FWcUlBUWdDQ2dBQVdwQkFXb2dBaUFHRU1NQlJRMEdEQWtMSUFBZ0EwSGNCV29nQkNBSUtBQUJha0VCYWlBQ0lBWkJBV29Rd3dGRkRRVU1DQXNnQUNBRFFkd0ZhaUFFSUFnb0FBVnFRUVZxSUFJZ0JrRUJhaEREQVVVTkJBd0hDeUFBSUFOQjNBVnFJQVFnQ0NnQUJXcEJCV29nQWlBR1FRSnFFTU1CUlEwRERBWUxJQUFnQTBIY0JXb2dCQ0FJS0FBRmFrRUZhaUFDSUFaQkFXc1F3d0VOQlF3Q0N5QUFLQUlRSWdKQkVHb2dBeWdDNUFVZ0FpZ0NCQkVBQUNBQUtBSVFJZ0pCRUdvZ0F5Z0M2QVVnQWlnQ0JCRUFBRUhBQUVIWUFDQUJMUUJ1UVFKeElnUWJJZ2dnQVNnQ3VBSkJBM1JxSVFJZ0F5Z0M0QVVoQ2lBQUFuOGdCQVJBSUFJZ0FTZ0NSRVVOQVJvTElBRW9BbndnQVNnQ2lBRnFRUVIwSUFKcUN5SUhJQUVvQXNBQ1FRTjBhaUlFSUFFb0FvUUNhaEJmSWdaRkRTTWdCa0VCTmdJQUlBWWdCQ0FHYWlJRU5nSVVJQVlnQVNnQ2hBSWlCVFlDR0NBRUlBRW9Bb0FDSUFVUUh4b2dBQ2dDRUNJRVFSQnFJQUVvQW9BQ0lBUW9BZ1FSQUFBZ0FVRUFOZ0tBQWlBR0lBRW9BbkEyQWh3Z0FTZ0NmQ0lFSUFFb0FvZ0JJZ1ZxUVFCS0JFQUNRQUpBSUFFdEFHNUJBbkZGRFFBZ0FTZ0NSQTBBUVFBaEJRTkFJQVFnQlV3RVFFRUFJUVVEUUNBQktBS0lBU0FGVEFSQVFRQWhCUU5BSUFVZ0FTZ0N3QUpPRFFZZ0FDQUZRUU4wSWdJZ0FTZ0N5QUpxS0FJRUVCTWdBU2dDeUFJZ0FtcEJBRFlDQkNBRlFRRnFJUVVNQUFzQUJTQUFJQUVvQW9BQklBVkJCSFJxS0FJQUVCTWdCVUVCYWlFRkRBRUxBQXNBQlNBQUlBRW9BblFnQlVFRWRHb29BZ0FRRXlBRlFRRnFJUVVnQVNnQ2ZDRUVEQUVMQUFzQUN5QUdJQUlnQm1vaUFqWUNJQ0FDSUFFb0FvQUJJQVZCQkhRUUh4b2dCaWdDSUNBQktBS0lBVUVFZEdvZ0FTZ0NkQ0FCS0FKOFFRUjBFQjhhQ3lBR0lBRW9Bbnc3QVNvZ0JpQUJLQUtJQVRzQktDQUdJQUVvQW93Qk93RXNJQUFvQWhBaUFrRVFhaUFCS0FLQUFTQUNLQUlFRVFBQUlBQW9BaEFpQWtFUWFpQUJLQUowSUFJb0FnUVJBQUFMSUFZZ0FTZ0N1QUlpQWpZQ09DQUNCRUFnQmlBR0lBaHFJZ1EyQWpRZ0JDQUJLQUswQWlBQ1FRTjBFQjhhQ3lBQUtBSVFJZ0pCRUdvZ0FTZ0N0QUlnQWlnQ0JCRUFBQ0FCUVFBMkFyUUNJQVlnQ2pzQkxnSkFJQUV0QUc1QkFuRUVRQ0FBSUFFb0F1d0NFQk1nQVVIMEFtb1E5Z0VNQVFzZ0JpQUdMd0FSUVlBSWNqc0FFU0FHSUFFb0F1d0NOZ0pBSUFZZ0FTZ0M4QUkyQWtRZ0JpQUFJQUVvQXZRQ0lBRW9BdmdDRUlrQ0lnSTJBbEFnQWtVRVFDQUdJQUVvQXZRQ05nSlFDeUFHSUFFb0F2Z0NOZ0pNSUFZZ0FTZ0NqQU0yQWxRZ0JpQUJLQUtRQXpZQ1NBc2dBU2dDekFFaUFpQUJRZEFCYWtjRVFDQUFLQUlRSWdSQkVHb2dBaUFFS0FJRUVRQUFDeUFHSUFFb0FzQUNJZ0kyQWp3Z0FnUkFJQVlnQmlBSGFpSUVOZ0lrSUFRZ0FTZ0N5QUlnQWtFRGRCQWZHZ3NnQUNnQ0VDSUNRUkJxSUFFb0FzZ0NJQUlvQWdRUkFBQWdBVUVBTmdMSUFpQUdJQVl2QUJGQmZuRWdBUzhCTkVFQmNYSWlBanNBRVNBR0lBRXZBVGhCQVhSQkFuRWdBa0Y5Y1hJaUFqc0FFU0FHSUFFdEFHNDZBQkFnQmlBQkx3RmdRUUowUVFSeElBSkJlM0Z5SWdJN0FCRWdCaUFDUVU5eElBRXZBV3hCQkhSQk1IRnlJZ0k3QUJGQkNDRUZJQVlnQVNnQ3RBRkJBRWdFZnlBQktBSzRBVUVBUjBFRGRBVkJDQXNnQWtGM2NYSWlBanNBRVNBR0lBRXZBVkJCQm5SQndBQnhJQUpCdjM5eGNpSUNPd0FSSUFZZ0FrSC9mbkVnQVM4QlZFRUhkRUdBQVhGeUlnSTdBQkVnQmlBQ1FmOTljU0FCTHdGWVFRaDBRWUFDY1hJaUFqc0FFU0FHSUFKQi8zdHhJQUV2QVZ4QkNYUkJnQVJ4Y2lJQ093QVJJQVlnQWtILzd3TnhJQUV2QVdoQkMzUkJnQkJ4Y2pzQUVTQUFJQUFvQWdCQkFXbzJBZ0FnQmlBQU5nSXdJQUFvQWhBaEFpQUdRUUU2QUFRZ0FpZ0NVQ0lFSUFaQkNHb2lDRFlDQkNBR0lBSkIwQUJxTmdJTUlBWWdCRFlDQ0NBQ0lBZzJBbEFnQVNnQ0JBUkFJQUVvQWhnaUFpQUJLQUljSWdRMkFnUWdCQ0FDTmdJQUlBRkNBRGNDR0FzZ0FDZ0NFQ0lBUVJCcUlBRWdBQ2dDQkJFQUFDQUdyVUtBZ0lDQVlJUU1KQXNDUUFKQUFrQWdBa0hxQVdzT0JBSUNBUUFEQ3lBRUlBZ3VBQUZxUVFGcUlRa01BZ3NnQkVFQmFpSUVJQVFnQjJvc0FBQnFJUWtNQVFzZ0FDQURRZHdGYWlBRVFRRnFJZ1FnQkNBSGFpd0FBR29nQWlBR0VNTUJEUU1MSUFBZ0EwSGNCV29nQ1NBQ0lBWVF3d0ZGRFFFTUFnc0xJQU1nQkRZQzFBVWdBeUFDTmdMUUJTQUFJQVVnQTBIUUJXb1FSZ3NnQUNnQ0VDSUNRUkJxSUFNb0F1UUZJQUlvQWdRUkFBQWdBQ2dDRUNJQ1FSQnFJQU1vQXVnRklBSW9BZ1FSQUFBTUhnc2dCa0VRYWlFR0lBcEJBV29oQ2d3QUN3QUxRWVVwUWE3OEFFR3M5d0ZCbERnUUFBQUxJQU1vQXVnRklnUkJBRTRFUUNBRElBUTJBcGdHQ3lBREtBTDBCU0VGSUFNb0F1UUZJUVlnQXlnQzdBVkI2UUJySUFwR0RRRWdBU0FGUVg4UWFSb2dCaUVDREF3TElBUWhCZ3dKQ3lBRFFYODJBdGdGSUFFZ0JTQURRWndHYWlBRFFkZ0ZhaERIQXlFSElBTW9BdHdGSUFNb0F1QUZJQVlnQnhER0F3UkFJQUVnQjBGL0VHa2FJQVloQWd3TEN5QURLQUtjQmlJRVFTaHJJZ2hCQjB0QkFTQUlkRUdEQVhGRmNrVUVRQ0FCSUFkQmZ4QnBHaUFCSUFNb0FvUUdJQU1vQXBnR0VETWdBMEdBQm1vZ0JFSC9BWEVRRVNBQklBa2dDeUFHSUFOQm1BWnFFS1FDSVFJTUN3dEI2d0FoQlF3SUN3SkFJQVZCa0FGclFRSlBCRUFnQlVHWEFVWU5BU0FGUWJZQlJ3UkFJQVZCd2dGSERRTWdBeUFHS0FBQk5nS1lCaUFFSVFJTURBc2dCaWdBQVNJQ1FRQklEUU1nQWlBQktBS3NBazROQXlBTklBSkJGR3hxSWdnb0FneEJmMGNOQkNBSUlBTW9Bb1FHTmdJTUlBZ29BaEFoQndOQUlBY2lBZ1JBSUFnb0Fnd2dBaWdDQkNJRmF5RUdJQUlvQWdBaEJ3SkFBa0FDUUFKQUlBSW9BZ2hCQVdzT0JBSUJBd0FEQ3lBREtBS0FCaUFGYWlBR05nQUFEQUlMSUFaQmdJQUNha0dBZ0FSUERRa2dBeWdDZ0FZZ0JXb2dCanNBQUF3QkN5QUdRWUFCYWtHQUFrOE5DU0FES0FLQUJpQUZhaUFHT2dBQUN5QUFLQUlRSWdaQkVHb2dBaUFHS0FJRUVRQUFEQUVMQ3lBSVFRQTJBaEFnQkNFQ0RBc0xJQU5Dam9DQWdIQTNBNmdGSUFOQzJiajlnbkEzQTZBRklBTkIzQVZxSUFRZ0EwR2dCV29RSndSQUlBTW9BdWdGSWdKQkFFNEVRQ0FESUFJMkFwZ0dDeUFESUFNb0F2QUZJZ1kyQXBRRklBTkJmellDbUFVZ0F5QURLQUxzQlNJRVFRRnJOZ0tRQlNBRFFkd0ZhaUFES0FMa0JTSUNJQU5Ca0FWcUVDY0VRQ0FES0FMb0JTSUNRUUJPQkVBZ0F5QUNOZ0tZQmdzZ0JFRUJhaUVFSUFNb0F1UUZJUUlMSUFFZ0F5Z0NoQVlnQXlnQ21BWVFNeUFEUVlBR2FpSUhJQVZCQW10Qi93RnhFQkVnQnlBRUlBWVFYUXdMQ3lBRFFvNkFnSUJ3TndPSUJTQURRcGlBZ0lDdzZBNDNBNEFGSUFOQjNBVnFJQVFnQTBHQUJXb1FKd1JBQWtBZ0F5Z0M2QVVpQWtFQVNBUkFJQU1vQXBnR0lRSU1BUXNnQXlBQ05nS1lCZ3NnQVNBREtBS0VCaUFDRURNZ0EwR0FCbW9pQWlBRlFRSnJRZjhCY1JBUklBSWdBeTBBN0FVUUVTQUNJQU1vQXZ3RkVCME1Cd3NnQTBLT2dJQ0FjRGNEK0FRZ0EwS1pnSUNBa0FrM0EvQUVJQU5CM0FWcUlBUWdBMEh3QkdvUUowVU5BUUpBSUFNb0F1Z0ZJZ0pCQUVnRVFDQURLQUtZQmlFQ0RBRUxJQU1nQWpZQ21BWUxJQUVnQXlnQ2hBWWdBaEF6SUFOQmdBWnFJZ0lnQlVFQ2EwSC9BWEVRRVNBQ1Fja0FFQkVNQmdzZ0EwRi9OZ0xJQlNBRFFvU0FnSUN3bGV2VXFuODNBOEFGSUFOQjNBVnFJQVFnQTBIQUJXb1FKMFVOQUNBREtBTG9CU0lJUVFCT0JFQWdBeUFJTmdLWUJnc2dBeWdDN0FVaENDQURLQUw4QlNJRlFjVUFSZ1IvUWZRQkJTQUZRUnRIRFFGQjlRRUxJUW9nQ0VGOWNVR3BBVVlFUUNBQklBTW9Bb1FHSUFNb0FwZ0dFRE1nQTBHQUJtb2dDaEFSSUFBZ0F5Z0MvQVVRRXd3R0N5QURRdW1BZ0lCd053T3dCU0FEUWR3RmFpQURLQUxrQlNBRFFiQUZhaEFuUlEwQUFrQWdBeWdDNkFVaUJVRUFTQVJBSUFNb0FwZ0dJUVVNQVFzZ0F5QUZOZ0tZQmdzZ0FTQURLQUtFQmlBRkVETWdBMEdBQm1vZ0NoQVJJQUFnQXlnQy9BVVFFMEhxQUNFRkRBWUxJQUVnQXlnQ2hBWWdBeWdDbUFZUU15QURRWUFHYWlBR0lBY1FjaUFFSVFJTUNBdEJoU2xCcnZ3QVFlUDFBVUdVT0JBQUFBdEJ2WXdCUWE3OEFFSGw5UUZCbERnUUFBQUxRY1hkQUVHdS9BQkI4UFVCUVpRNEVBQUFDMEd3M1FCQnJ2d0FRZlQxQVVHVU9CQUFBQXNnQXlnQzVBVWhBZ3dEQ3lBREtBTDBCU0VISUFNb0F1UUZJUVlMSUFFZ0F5Z0NoQVlnQXlnQ21BWVFNeUFGUWVzQVJ5SUtSUVJBSUFFZ0NTQUxJQVlnQTBHWUJtb1FwQUloQmdzZ0IwRUFTQTBDSUFjZ0FTZ0NyQUpPRFFJZ0FTQUJLQUxVQWlJRVFRRnFOZ0xVQWlBQktBTE1BaUFFUVFSMGFpSUVRUVEyQWdRZ0JDQUZOZ0lBSUFNb0FvUUdJUTRnQkNBSE5nSU1JQVFnRGtFQmFqWUNDQUpBSUEwZ0IwRVViR29pQ0NnQ0RDSUhRWDlHQkVBZ0NDZ0NDQ0FDUVg5emFpSUNRZjhBU2lBRlFla0FhMEVDUzNKRkJFQWdCRUVCTmdJRUlBUWdCVUdCQVdvaUFqWUNBQ0FEUVlBR2FpSUVJQUpCL3dGeEVCRWdCRUVBRUJFZ0JpRUNJQUFnQ0NBREtBS0VCa0VCYTBFQkVPZ0NEUVFNQXdzZ0NpQUNRZi8vQVVweURRRWdCRUVDTmdJRUlBUkI3UUUyQWdBZ0EwR0FCbW9pQWtIdEFSQVJJQUpCQUJBcUlBWWhBaUFBSUFnZ0F5Z0NoQVpCQW10QkFoRG9BZzBEREFJTElBY2dEa0YvYzJvaUFrR0FBV3BCL3dGTElBVkI2UUJyUVFKTGNrVUVRQ0FFUVFFMkFnUWdCQ0FGUVlFQmFpSUVOZ0lBSUFOQmdBWnFJZ1VnQkVIL0FYRVFFU0FGSUFKQi93RnhFQkVnQmlFQ0RBTUxJQW9nQWtHQWdBSnFRZi8vQTB0eURRQWdCRUVDTmdJRUlBUkI3UUUyQWdBZ0EwR0FCbW9pQkVIdEFSQVJJQVFnQWtILy93TnhFQ29nQmlFQ0RBSUxJQU5CZ0FacUlnSWdCVUgvQVhFUUVTQUNJQWdvQWd3Z0F5Z0NoQVpyRUIwZ0JpRUNJQWdvQWd4QmYwY05BU0FBSUFnZ0F5Z0NoQVpCQkd0QkJCRG9BZzBCQ3dzZ0F5Z0NnQVlpQWtVTkRTQURLQUtVQmlBQ1FRQWdBeWdDa0FZUkFRQWFEQTBMUVlVcFFhNzhBRUhsOWdGQmxEZ1FBQUFMSUFBUWZBd0xDeUFKS0FBQklRWWdBU0FCS0FMY0FrRUJhallDM0FJTUJnc2dBMEYvTmdKSUlBTkM2ZFNCZ09BQk53TkFJQU5CM0FWcUlBZ2dBMEZBYXhBblJRMEZBa0FnQXlnQzlBVWlCMEVBU0EwQUlBY2dBU2dDckFKT0RRQWdBeWdDNkFVaEJDQURLQUxrQlNFS0lBTW9BdXdGSVJBZ0J5RUZBMEFnQVNnQ2dBSWhFU0FCS0FLa0FpRVNRUUFoQ3dOQUFrQWdDMEVVUmcwQUlCSWdCVUVVYkdvb0FnUWhBZ05BSUFJZ0VXb2lFeTBBQUNJRlFiWUJSaUFGUWNJQlJuSUVRQ0FDUVFWcUlRSU1BUVVnQlVIckFFY05BaUFMUVFGcUlRc2dFeWdBQVNFRkRBTUxBQXNBQ3dzZ0EwS09nSUNBY0RjRE9DQURJQkEyQWpRZ0EwRVJOZ0l3SUFOQjNBVnFJQUlnQTBFd2FoQW5CRUFnQXlnQzlBVWhCUXdCQ3dzZ0EwRi9OZ0lrSUFNZ0VEWUNJQ0FEUWR3RmFpQUNJQU5CSUdvUUowVU5CaUFCSUFFb0F0QUNRUUZxTmdMUUFpQUJJQWRCZnhCcEdpQUJJQU1vQXZRRklnSkJBUkJwR2lBRFFZQUdhaUlGSUJCQi93RnhFQkVnQlNBQ0VCMGdDaUVJSUFSQmYwWWdCQ0FHUm5JTkNDQUJJQUVvQXR3Q1FRRnFOZ0xjQWlBRFFZQUdhaUlDUWNJQkVCRWdBaUFFRUIwZ0JDRUdEQWdMUWFvcFFhNzhBRUhkOGdGQit6a1FBQUFMSUFFb0Fzd0JJQWt2QUFFaUIwRURkR3BCQkdvaEFnTkFJQUlvQWdBaUFrRUFTQTBISUFFb0FuUWdBa0VFZEdvaUJDZ0NCQ0FIUncwSElBUXRBQXhCQkhFRVFDQURRWUFHYWlJRlFlZ0FFQkVnQlNBQ1FmLy9BM0VRS2dzZ0JFRUlhaUVDREFBTEFBc2dBU2dDekFFZ0QwRURkR3BCQkdvaEFnTkFJQUlvQWdBaUFrRUFTQTBHSUFFb0FuUWdBa0VFZEdvaUJ5Z0NCQ0FQUncwR0lBRW9BcHdCSUFKSEJFQkI0UUFoQkNBRFFZQUdhaUlGSUFjb0FneEJBM1pCRDNGQkFXdEJBVTBFZnlBRFFZQUdhaUlFUVFNUUVTQUVJQWNvQWd4QkFYUkJDSFVRSFVIWkFBVkI0UUFMRUJFZ0JTQUNRZi8vQTNFUUtnc2dCMEVJYWlFQ0RBQUxBQXNDUUFKQUFrQWdCRUhwQUdzT0JnUUVBZ1FCQXdBTElBUkJNVVlFUUNBSkx3QUJJUUlnQVNBSkx3QURJZ1FRNVFRZ0EwR0FCbW9pQlVFeEVCRWdCU0FDRUNvZ0JTQUJLQUxNQVNBRVFRTjBhaThCQkVFQmFrSC8vd054RUNvTUJ3c2dCRUV5UndSQUlBUkJ6UUJIRFFVZ0NTZ0FBVVVOQnd3RkN5QUJJQWt2QUFFaUFoRGxCQ0FEUVlBR2FpSUVRVElRRVNBRUlBRW9Bc3dCSUFKQkEzUnFMd0VFUVFGcVFmLy9BM0VRS2d3R0N5QUJJQUVvQXRBQ1FRRnFOZ0xRQWlBSktBQUJJZ0pCQUVnTkJDQUNJQUVvQXF3Q1RnMEVJQUVvQXFRQ0lBSkJGR3hxSWdJb0FnUWhCQ0FEUXU2QWdJQndOd01BSUFOQjNBVnFJQVFnQXhBblJRMERJQUlnQWlnQ0FFRUJhellDQUF3RkN5QUJJQUVvQXRBQ1FRRnFOZ0xRQWdzZ0EwRi9OZ0tjQmlBRFFZQUdhaUFKSUE4UWNpQUJJQTBnRGlBSUlBTkJuQVpxRUtRQ0lnZ2dEazROQXlBREtBS2NCaUlDUVFCSUlBSWdCa1p5RFFNZ0FTQUJLQUxjQWtFQmFqWUMzQUlnQTBHQUJtb2lCRUhDQVJBUklBUWdBaEFkSUFJaEJnd0RDeUFCSUFFb0F0QUNRUUZxTmdMUUFnc2dBMEdBQm1vZ0NTQVBFSElNQVFzTFFZVXBRYTc4QUVHODhRRkIremtRQUFBTFFZT09BVUd1L0FCQmcvNEJRZjNMQUJBQUFBc2dBQ0FCRVAwQ1FvQ0FnSURnQUFzaEZDQURRYUFHYWlRQUlCUUx4dzBCQjM4Q1FBSkFBa0FDUUFKQUlBQW9BaEFpQTBGSFJ3UkFJQUJCUUdzb0FnQWhBU0FBUVlVQkVFcEZEUUVnQUNnQ09FRUJFSU1CUVVkSERRRUxRWDhoQmlBQVFRQkJBQ0FBS0FJWUlBQW9BaFFReEFGRkRRRU1BZ3NDUUFKQUFrQUNRQUpBQWtBZ0EwRXphZzREQUFJQkFnc2dBU2dDbEFNaUEwVU5BU0FBS0FJQUlRRkJmeUVHSUFBUUVnMEdBa0FDUUFKQUFrQWdBQ2dDRUNJQ1FUbHFEZ1FDQVFFQUFRc2dBRUVBUVFFUTdRSWhBQXdIQ3lBQVFZVUJFRXBGRFFFZ0FDZ0NPRUVCRUlNQlFVZEhEUUVMSUFCQkFFRUFJQUFvQWhnZ0FDZ0NGRUVCUVFBUStBRWhBQXdGQ3lBQUVCSU5CZ0pBQWtBZ0FrR3pmMFlOQUFKQUlBSkJRa2NFUUNBQ1FVdEdJQUpCVTBaeURRSWdBa0VxUndSQUlBSkIrd0JIRFFRZ0F5Z0NJQ0VFQTBBQ1FDQUFLQUlRSWdKQi9RQkdEUUFnQWtHRGYwWWdBa0VsYWtGUlMzSkZCRUFNRHd0QkFDRUNJQUVnQUNnQ0lCQVlJUVVDUUFKQUFrQWdBQkFTRFFBZ0FFSDVBQkJLUlEwQklBQVFFZzBBSUFBb0FoQWlBa0dEZjBZZ0FrRWxha0ZSUzNKRkJFQkJBQ0VDSUFCQjN2WUFRUUFRRmd3QkN5QUJJQUFvQWlBUUdDRUNJQUFRRWtVTkFnc2dBU0FGRUJNTURBc2dBU0FGRUJnaEFnc2dBQ0FESUFVZ0FrRUFFUGNCSVFjZ0FTQUZFQk1nQVNBQ0VCTWdCMFVORFNBQUtBSVFRU3hIRFFBZ0FCQVNSUTBCREEwTEN5QUFRZjBBRUN3TkN5QUFRZm9BRUVwRkRRSWdBQkRzQWlJQ1JRMExJQUVnQXlBQ0VPc0NJUVVnQVNBQ0VCTWdCVUVBU0EwTEEwQWdCQ0FES0FJZ1RnMERJQU1vQWh3Z0JFRVViR29pQVNBRk5nSUFJQUZCQVRZQ0NDQUVRUUZxSVFRTUFBc0FDeUFBUWZrQUVFb0VRQ0FBRUJJTkN5QUFLQUlRSWdKQmczOUdJQUpCSldwQlVVdHlSUVJBREEwTElBRWdBQ2dDSUJBWUlRSWdBQkFTRFFnZ0FCRHNBaUlFUlEwSUlBRWdBeUFFRU9zQ0lRVWdBU0FFRUJNZ0JVRUFTQTBJSUFBZ0EwSDlBQ0FDUVFFUTl3RWhBeUFCSUFJUUV5QURSUTBMSUFNZ0JUWUNBQXdDQ3lBQUVPd0NJZ0pGRFFvZ0FTQURJQUlRNndJaEJDQUJJQUlRRXlBRVFRQklEUW9nQVNBRFFTaHFRUVFnQTBFd2FpQURLQUlzUVFGcUVIZ05DaUFESUFNb0Fpd2lBVUVCYWpZQ0xDQURLQUlvSUFGQkFuUnFJQVEyQWdBTUFRc0NRQUpBQWtBQ1FDQUFLQUlRUVRscURnUUNBUUVBQVFzZ0FFRUFRUUlRN1FJaEFBd0tDeUFBUVlVQkVFcEZEUUVnQUNnQ09FRUJFSU1CUVVkSERRRUxJQUJCQUVFQUlBQW9BaGdnQUNnQ0ZFRUNRUUFRK0FFaEFBd0lDeUFBRUZZTkNTQUFRUllRb1FFZ0FDQUFRVUJySWdFb0FnQkIvQUJCQVJDZ0FVRUFTQTBKSUFCQnZRRVFFQ0FBUWZ3QUVCb2dBU2dDQUVFQUVCY2dBQ0FEUWZ3QVFSWkJBQkQzQVVVTkNRc2dBQkMzQVNFQURBWUxJQUJCQVNBQ1FRRVF6QU1oQUF3RkN5QUFRYzBnUVFBUUZnd0lDeUFCS0FLVUF5SUVSUTBBSUFBb0FqaEJBQkNEQVNJQlFTaEdJQUZCTGtaeURRQWdBQ2dDQUNFRFFYOGhCaUFBRUJJTkJTQUVLQUk0SVFVQ1FBSkFBa0FDUUFKQUlBQW9BaEFpQVVIL0FHb09Bd0FDQVFJTElBTWdBQ2tESUJBeElnSkZEUWtnQUJBU1JRMERJQU1nQWhBVERBc0xJQUFvQWlnRVFDQUFFT0lCREFzTFFSWWhBaUFESUFBb0FpQVFHQ0VCSUFBUUVnMEVJQUFnQkNBQlFSWVF5d01OQkNBRElBRVFFeUFBS0FJUVFTeEhEUUVnQUJBU0RRZ2dBQ2dDRUNFQkN5QUJRZnNBUndSQUlBRkJLa2NOQVNBQUVCSU5DQ0FBUWZrQUVFcEZCRUFnQUVIL2xBRkJBQkFXREFzTElBQVFFZzBJSUFBb0FoQWlBVUdEZjBZZ0FVRWxha0ZSUzNKRkJFQU1DZ3RCL1FBaEFpQURJQUFvQWlBUUdDRUJJQUFRRWcwRUlBQWdCQ0FCUWYwQUVNc0REUVFnQXlBQkVCTU1BUXNnQUJBU0RRY0RRQUpBSUFBb0FoQWlBVUg5QUVZTkFDQUJRWU4vUmlBQlFTVnFRVkZMY2tVRVFBd0xDMEVBSVFFZ0F5QUFLQUlnRUJnaEFpQUFFQklOQlFKQUlBQkIrUUFRU2dSQUlBQVFFZzBISUFBb0FoQWlBVUdEZjBZZ0FVRWxha0ZSUzNKRkJFQkJBQ0VCSUFCQjN2WUFRUUFRRmd3SUN5QURJQUFvQWlBUUdDRUJJQUFRRWtVTkFRd0hDeUFESUFJUUdDRUJDeUFBSUFRZ0FTQUNFTXNERFFVZ0F5QUJFQk1nQXlBQ0VCTWdBQ2dDRUVFc1J3MEFJQUFRRWtVTkFRd0pDd3NnQUVIOUFCQXNEUWNMSUFBUTdBSWlBa1VOQmdzZ0F5QUVJQUlRNndJaEFTQURJQUlRRXlBQlFRQklEUVVnQlNBRUtBSTRJZ01nQXlBRlNCc2hBd05BSUFNZ0JVWkZCRUFnQkNnQ05DQUZRUXhzYWlBQk5nSUlJQVZCQVdvaEJRd0JDd3NnQUJDM0FVVU5CQXdGQzBGL0lRWWdBRUVIRU9FQkRRUU1Bd3NnQXlBQkVCTWdBeUFDRUJNTUJRc2dBU0FDRUJNTUJBc2dBQTBCQzBFQUlRWUxJQVlQQ3lBQVFkNzJBRUVBRUJZTFFYOEx0UU1CQTM4akFFRkFhaUlCSkFBQ1FDQUFLQUlRUVlGL1J3MEFJQUVnQUNnQ0JEWUNFQ0FCSUFBb0FoUTJBaFFnQVNBQUtBSVlOZ0ljSUFFZ0FDZ0NNRFlDR0VHQmZ5RUNBMEFDUUNBQ1FZRi9SdzBBSUFBb0FqZ2hBaUFCSUFBb0FoZ2lBMEVCYWpZQ0JDQUJJQUlnQTJ0QkFtczJBZ0FnQVVFZ2FrRVVRYnM4SUFFUVRocEJmeUVDSUFBUUVnMENBa0FDUUFKQUlBQW9BaEFpQTBHQUFXb09XUUVCQVFFQkF3TURBd01EQXdNREF3TURBd01EQXdFQkF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBZ0VCQVFFREFRRUJBUU1CQVFNREFRRUJBd01CQXdNQkFRTURBUUVCQVFFQkFRTUJBUU1CQVFFQkFRRUJBQXNnQTBIOUFFWU5BU0FEUVR0SERRSWdBQkFTUlEwQkRBUUxJQUFvQWpCRkRRRUxBa0FDZnlBQlFTQnFRZDR2UVFzUVlVVUVRQ0FBS0FKQUlnSkJBVFlDUUVFQkRBRUxJQUZCSUdwQmljb0FRUW9RWVVVRVFDQUFLQUpBSVFKQkFnd0JDeUFBS0FJQUxRRG9BVVVOQVNBQlFTQnFRYlRaQUVFSkVHRU5BU0FBS0FKQUlRSkJCQXNoQXlBQ0lBSXRBRzRnQTNJNkFHNExJQUFvQWhBaEFnd0JDd3NnQUNBQlFSQnFFTzRDSVFJTElBRkJRR3NrQUNBQ0N6VUJBbjlCQVNFQ0lBQW9BZ0FpQVVIeEFHdEJBMGtnQVVFSVJuSWdBVUhUQUVaeUJIOUJBUVVnQUNnQ0RFSDRBSEZCSUVZTEMwd0JBMzhnQUNnQ0lFRVlhaUVCQWtBRFFDQUJJZ01vQWdBaUFrVU5BU0FDUVF4cUlRRWdBQ0FDUncwQUN5QURJQUFvQWd3MkFnQVBDMEdpaEFGQnJ2d0FRYVBsQWtHbDNnQVFBQUFMR0FFQmZ5QUJweWdDSUNJREJFQWdBQ0FESUFJUkFBQUxDeHNBSUFBUUd5QUFRZ0EzQWhBZ0FFSUFOd0lJSUFCQ0FEY0NBQXZFQkFFSWZ5QUFRZVFBYWlJSElBQkI0QUJxSWdNMkFnQWdBQ0FETmdKZ0lBQkIwQUJxSVFRZ0FFSFVBR29pQlNnQ0FDRUNBMEFnQkNBQ0lnRkdCRUFDUUFKQUEwQUNRQ0FFSUFVb0FnQWlBVVlFUUNBSElRRURRQ0FCS0FJQUlnRWdBMFlOQWlBQUlBRkJDR3RCd2dBUThBTWdBVUVFYWlFQkRBQUxBQXNnQVVFSWF5SUNLQUlBUVFCTURRSWdBVUVFYXlJRklBVXRBQUJCRDNFNkFBQWdBQ0FDUWNNQUVQQURJQUZCQkdvaEJRd0JDd3NnQUVFQ09nQm9JQUJCMkFCcUlRSURRQ0FESUFjb0FnQWlBVWNFUUNBQlFRUnJMUUFBUVE1eEJFQWdBU2dDQUNJRUlBRW9BZ1FpQlRZQ0JDQUZJQVEyQWdBZ0FVRUFOZ0lBSUFJb0FnQWlCQ0FCTmdJRUlBRWdBallDQkNBQklBUTJBZ0FnQWlBQk5nSUFEQUlGSUFBZ0FVRUlheER0QlF3Q0N3QUxDeUFBUVFBNkFHZ2dBRUVRYWlFRElBQW9BbHdoQVFOQUlBRWdBa2NFUUNBQlFRUnJMUUFBUVE1eERRTWdBU2dDQkNFSElBTWdBVUVJYXlBQUtBSUVFUUFBSUFjaEFRd0JDd3NnQUNBQ05nSmNJQUFnQUVIWUFHbzJBbGdQQzBIRmpRRkJydndBUWVjc1FmclJBQkFBQUF0QitZWUJRYTc4QUVHZExVSFpPUkFBQUFzZ0FVRUVheUlHTFFBQVFSQkpCRUFnQVNnQ0JDRUNJQUFnQVVFSWF5SUlRY1FBRVBBRElBWWdCaTBBQUVFUGNVRVFjam9BQUNBSUtBSUFEUUVnQVNnQ0FDSUdJQUVvQWdRaUNEWUNCQ0FJSUFZMkFnQWdBVUVBTmdJQUlBTW9BZ0FpQmlBQk5nSUVJQUVnQXpZQ0JDQUJJQVkyQWdBZ0F5QUJOZ0lBREFFTEMwR29qd0ZCcnZ3QVFjUXNRZURkQUJBQUFBc29BUUYvSUFFZ0FTZ0NBRUVCYXlJQ05nSUFJQUpGQkVBZ0FFRVFhaUFCSUFBb0FnUVJBQUFMQy9FQkFnWi9BWDRnQUVFSUVDa2lCRVVFUUVGL0R3c2dCRUlCTndJQUlBS25JUVlnQWtJZ2lLZEJkVWtoQ0FOQUFrQUNRQ0FEUVFKR0RRQWdBQ0FBS1FNd0lBTkJNbW9RU1NJSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0FFRVFFQ2tpQlEwQ0lBQWdDUkFQQzBGL0lRY2dBMFVOQUNBQUlBRXBBd0FRRHdzZ0FDZ0NFQ0FFRUtNRklBY1BDeUFFSUFRb0FnQkJBV28yQWdBZ0JTQUVOZ0lJSUFoRkJFQWdCaUFHS0FJQVFRRnFOZ0lBQ3lBRklBSTNBd0FnQ1VLQWdJQ0FjRm9FUUNBSnB5QUZOZ0lnQ3lBQUlBbEJMMEVCRUpZRElBRWdBMEVEZEdvZ0NUY0RBQ0FEUVFGcUlRTU1BQXNBQzVnREFnSitBbjlDZ0lDQWdEQWhBZ0pBQWtBZ0FTa0NWQ0lEUWhpR1FqaUhwdzBBSUFOQ0lJWkNPSWVuQkVBZ0EwSVFoa0k0aDZkRkRRRWdBU2tEWUNJQ1FpQ0lwMEYxVHdSQUlBS25JZ0VnQVNnQ0FFRUJhallDQUFzZ0FDQUNFSW9CUW9DQWdJRGdBQThMSUFFZ0EwTC8vLy8vajJDRFFvQ0FnSUFRaERjQ1ZBTkFJQUVvQWhRZ0JFb0VRQ0FCS0FJUUlBUkJBM1JxS0FJRUlnVXBBbFJDR0laQ09JZW5SUVJBSUFBZ0JSQ2xCU0lDUW9DQWdJQndnMEtBZ0lDQTRBQlJEUVFnQUNBQ0VBOExJQVJCQVdvaEJBd0JDd3NDUUNBQktBSlFJZ1FFUUVLQWdJQ0E0QUJDZ0lDQWdEQWdBQ0FCSUFRUkF3QkJBRWdiSVFJTUFRc2dBQ0FCS1FOSVFvQ0FnSUF3UVFCQkFCQXZJUUlnQVVLQWdJQ0FNRGNEU0FzZ0FrS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBRkJBVG9BV1NBQUtBSVFLUU9BQVNJRFFpQ0lwMEYxVHdSQUlBT25JZ0FnQUNnQ0FFRUJhallDQUFzZ0FTQUROd05nQ3lBQklBRXBBbFJDLy8vL2g0QmdnMEtBZ0lBSWhEY0NWQXNnQWc4TElBRWdBU2tDVkVMLy8vLy9qMkNETndKVUlBSUw1Z1VDQjM4QmZpTUFRUkJySWdVa0FBSkFJQUVwQWxRaUNVSW9oa0k0aDZjTkFDQUJJQWxDLy8rRGVJTkNnSUFFaERjQ1ZBTkFBa0FnQVNnQ0ZDQURUQVJBUVFBaEF3TkFJQUVvQWlBZ0Ewb0VRQUpBSUFFb0Fod2lCQ0FEUVJSc2FpSUNLQUlJUVFGSERRQWdBaWdDRENJSFFmMEFSZzBBSUFBZ0JVRUlhaUFGUVF4cUlBRW9BaEFnQWlnQ0FFRURkR29vQWdRZ0J4RDBBeUlDUlEwQUlBQWdBaUFCSUFRZ0EwRVViR29vQWhBUTh3TU1CQXNnQTBFQmFpRUREQUVMQzBFQUlRSWdBU2dDVUEwRElBRW9Ba2dvQWlRaENFRUFJUU5CQUNFRUEwQUNRQ0FCS0FJNElBUk1CRUFEUUNBRElBRW9BaUJPRFFJZ0FTZ0NIQ0FEUVJSc2FpSUNLQUlJUlFSQUlBZ2dBaWdDQUVFQ2RHb29BZ0FpQkNBRUtBSUFRUUZxTmdJQUlBSWdCRFlDQkFzZ0EwRUJhaUVEREFBTEFBc2dBU2dDRUNBQktBSTBJQVJCREd4cUlnY29BZ2hCQTNScUtBSUVJUUlDUUFKQUlBY29BZ1FpQmtIOUFFWUVRQ0FBSUFJUWpRTWlDVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQVlMSUFBZ0JVRUlhaUFGUVF4cUlBSWdCaEQwQXlJR0JFQWdBQ0FHSUFJZ0J5Z0NCQkR6QXd3R0N3SkFJQVVvQWd3aUJpZ0NERUg5QUVZRVFDQUFJQVVvQWdnb0FoQWdCaWdDQUVFRGRHb29BZ1FRalFNaUNVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwSElBQkJBUkR4QXlJQ1JRUkFJQUFnQ1JBUERBZ0xJQUFnQWtFWWFpQUpFQ0FNQVFzZ0JpZ0NCQ0lDUlFSQUlBVW9BZ2dvQWtnb0FpUWdCaWdDQUVFQ2RHb29BZ0FoQWdzZ0FpQUNLQUlBUVFGcU5nSUFDeUFJSUFjb0FnQkJBblJxSUFJMkFnQU1BUXNnQUNBSUlBY29BZ0JCQW5ScUtBSUFRUmhxSUFrUUlBc2dCRUVCYWlFRURBRUxDMEYvSVFJZ0FDQUJLUU5JUW9HQWdJQVFRUUJCQUJBaElnbENnSUNBZ0hDRFFvQ0FnSURnQUZFTkF5QUFJQWtRRDBFQUlRSU1Bd3NnQTBFRGRDRUVRWDhoQWlBRFFRRnFJUU1nQUNBRUlBRW9BaEJxS0FJRUVLWUZRUUJPRFFFTUFnc0xRWDhoQWdzZ0JVRVFhaVFBSUFJTC9nSUNCSDhDZmdKQUlBRXBBbFJDTUlaQ09JZW5EUUFDUUNBQktBSlFCRUFEUUNBQ0lBRW9BaUJPRFFJZ0FTZ0NIQ0FDUVJSc2FpSURLQUlJUlFSQUlBQkJBQkR4QXlJRVJRUkFRWDhQQ3lBRElBUTJBZ1FMSUFKQkFXb2hBZ3dBQ3dBTElBRXBBMGdoQjBGL0lRTWdBQ0FBS1FNd1FRMFFTU0lHUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQnFjaUFpQUhweUlETmdJZ0lBTWdBeWdDQUVFQmFqWUNBQ0FDUWdBM0FpUUNRQ0FES0FJOElnUkZEUUFDUUNBQUlBUkJBblFRWHlJRVJRMEFJQUlnQkRZQ0pFRUFJUUlEUUNBQ0lBTW9BanhPRFFJZ0F5Z0NKQ0FDUVFOMGFpMEFBQ0lGUVFGeEJFQWdBQ0FGUVFOMlFRRnhFUEVESWdWRkRRSWdCQ0FDUVFKMGFpQUZOZ0lBQ3lBQ1FRRnFJUUlNQUFzQUN5QUFJQVlRRDBGL0R3c2dBU0FHTndOSUlBQWdCeEFQQ3lBQlFRRTZBRlZCQUNFQ0EwQWdBU2dDRkNBQ1RBUkFRUUFQQ3lBQ1FRTjBJUVJCZnlFRElBSkJBV29oQWlBQUlBUWdBU2dDRUdvb0FnUVFwd1ZCQUU0TkFBc0xJQU1MTVFFQ2Z3Si9JQUFRUDBFQmFpRUJBMEJCQUNBQlJRMEJHaUFBSUFGQkFXc2lBV29pQWkwQUFFRXZSdzBBQ3lBQ0N3dHdBZ0ovQVg0akFFRVFheUlDSkFBQ1FDQUJRUUJPQkVBZ0FVR0FnSUNBZUhJaEF3d0JDeUFDSUFFMkFnQWdBa0VGYWlJQlFRdEIzQ0lnQWhCT0dpQUFJQUVRWWlJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDZ0NFQ0FFcDBFQkVLY0NJUU1MSUFKQkVHb2tBQ0FEQ3pJQUlBQWdBUkM4QWlJQlFvQ0FnSUJ3ZzBLQWdJQ0F3SDVSQkg0Z0FFRysxUUJCQUJDQUFrS0FnSUNBNEFBRklBRUxDOUFEQWdKL0FYNENRQU5BQWtBQ1FBSkFBa0FDUUFKQUFrQUNRRUVISUFKQ0lJaW5JZ01nQTBFSGEwRnVTUnRCQ21vT0VnTUVCd1VIQndjSEJ3WUFBUUFBQndjSEFnY0xJQUFvQWhBb0Fvd0JJZ05GRFFZZ0F5MEFLRUVFY1VVTkJnc2dBQ2dDMkFFaEFDQUJRZ0EzQWd3Z0FVS0FnSUNBZ0lDQWdJQi9Od0lFSUFFZ0FEWUNBQ0FCSUFMRUVMb0NHaUFCRHdzZ0FDZ0NFQ2dDakFFaUEwVU5CQ0FETFFBb1FRUnhSUTBFSUFKQ2dJQ0FnTUNCZ1B6L0FId2lCVUtBZ0lDQWdJQ0ErUDhBZzBLQWdJQ0FnSUNBK1A4QVVRMEVJQUFvQXRnQklRQWdBVUlBTndJTUlBRkNnSUNBZ0lDQWdJQ0FmemNDQkNBQklBQTJBZ0FnQVNBRnY1MFF1Z1VhSUFFUEN5QUNwMEVFYWc4TElBQW9BaEFvQW93QklnTkZEUUlnQXkwQUtFRUVjVVVOQWlBQ3B5SURLQUlNUWYzLy8vOEhTZzBDSUFBb0F0Z0JJUVFnQVVJQU53SU1JQUZDZ0lDQWdJQ0FnSUNBZnpjQ0JDQUJJQVEyQWdBZ0FTQURRUVJxRUVRYUlBRkJBUkRSQVJvZ0FDQUNFQThnQVE4TElBQWdBaENxQlNJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFJTUF3c2dBQ0FDUVFFUW1nRWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQUlMQ3lBQUlBSVFEeUFBUWV3clFRQVFGVUVBRHd0QkFBdG1BUUovSXdCQkVHc2lBeVFBSUFBZ0FTZ0NKQ0FDSUFFb0FpQkJBMnhCQVhZaUFDQUFJQUpJR3lJQVFRTjBJQU5CREdvUXFBRWlBZ1IvSUFNb0Fnd2hCQ0FCSUFJMkFpUWdBU0FFUVFOMklBQnFOZ0lnUVFBRlFYOExJUUVnQTBFUWFpUUFJQUVMVWdFRWZ5QUFLQUlnSWdKQkFDQUNRUUJLR3lFRVFRQWhBZ05BQWtBZ0FpQUVSd1IvSUFBb0Fod2lCU0FDUVJSc2FpZ0NFQ0FCUncwQklBVWdBa0VVYkdvRlFRQUxEd3NnQWtFQmFpRUNEQUFMQUF2aEF3RUdmeU1BUVJCcklnY2tBQ0FGUVFScUlRa0NRQUpBQTBCQkFDRUdJQUZCQURZQ0FDQUNRUUEyQWdBZ0JTZ0NDQ0lJUVFBZ0NFRUFTaHNoQ2dKQUEwQWdCaUFLUmcwQkFrQWdBeUFGS0FJQUlBWkJBM1JxSWdzb0FnQkdCRUFnQ3lnQ0JDQUVSZzBCQ3lBR1FRRnFJUVlNQVFzTElBWkJBRWdOQUVFQ0lRUU1Bd3NnQUNBRlFRZ2dDU0FJUVFGcUVIZ0VRRUYvSVFRTUF3c2dCU0FGS0FJSUlnWkJBV28yQWdnZ0JTZ0NBQ0FHUVFOMGFpSUdJQU0yQWdBZ0JpQUFJQVFRR0NJSU5nSUVJQU1nQ0JDdEJTSUdCRUFnQmlnQ0NFVU5BaUFHS0FJTUlnUkIvUUJHRFFJZ0F5Z0NFQ0FHS0FJQVFRTjBhaWdDQkNFRERBRUxDeUFJUVJaSEJFQkJBQ0VHQTBBZ0F5Z0NMQ0FHU2dSQUFrQUNRQ0FBSUFkQkRHb2dCMEVJYWlBREtBSVFJQU1vQWlnZ0JrRUNkR29vQWdCQkEzUnFLQUlFSUFnZ0JSQ3VCU0lFUVFGcURnVUdBQUVCQmdFTElBSW9BZ0FpQkFSQUlBRW9BZ0FnQnlnQ0RFWUVRQ0FIS0FJSUtBSU1JQVFvQWd4R0RRSUxJQUZCQURZQ0FDQUNRUUEyQWdCQkF5RUVEQVlMSUFFZ0J5Z0NERFlDQUNBQ0lBY29BZ2cyQWdBTElBWkJBV29oQmd3QkN3dEJBQ0VFSUFJb0FnQU5BZ3RCQVNFRURBRUxJQUVnQXpZQ0FDQUNJQVkyQWdCQkFDRUVDeUFIUVJCcUpBQWdCQXZDQXdFSmZ5QUJLQUlJSWdaQkFDQUdRUUJLR3lFRkFrQUNRQU5BSUFRZ0JVWU5BU0FFUVFKMElRY2dCRUVCYWlFRUlBY2dBU2dDQUdvb0FnQWdBa2NOQUF0QkFDRUZEQUVMUVg4aEJTQUFJQUZCQkNBQlFRUnFJQVpCQVdvUWVBMEFJQUVnQVNnQ0NDSUVRUUZxTmdJSUlBRW9BZ0FnQkVFQ2RHb2dBallDQUNBQlFSQnFJUWtnQVVFTWFpRUhRUUFoQlFOQUFrQWdBaWdDSUNBRlRBUkFRUUFoQlVFQUlRUURRQ0FFSUFJb0FpeE9EUVFnQkVFQ2RDRURJQVJCQVdvaEJDQUFJQUVnQWlnQ0VDQURJQUlvQWlocUtBSUFRUU4wYWlnQ0JFRUJFSzhGUlEwQUN3d0JDd0pBSUFOQkFDQUNLQUljSUFWQkZHeHFJZ1lvQWhBaUNrRVdSaHNOQUVFQUlRUWdBU2dDRkNJSVFRQWdDRUVBU2hzaEN3SkFBa0FEUUNBRUlBdEdEUUVnQ2lBSEtBSUFJQVJCREd4cUlnd29BZ0JIQkVBZ0JFRUJhaUVFREFFTEN5QUVRUUJPRFFFTElBQWdCMEVNSUFrZ0NFRUJhaEI0RFFJZ0FTQUJLQUlVSWdSQkFXbzJBaFFnQVNnQ0RDQUVRUXhzYWlJRUlBWW9BaEEyQWdBQ1FDQURSUVJBSUFZb0FnaEZEUUVMSUFSQkFEWUNDQXdDQ3lBRUlBWTJBZ2dNQVFzZ0RFRUFOZ0lJQ3lBRlFRRnFJUVVNQVFzTFFYOFBDeUFGQzJnQ0FuOEJmaUFBUVJCcUlRSWdBQ2tDQkNJRXAwSC8vLy8vQjNFaEF3SkFJQVJDZ0lDQWdBaURVRVVFUUVFQUlRQURRQ0FBSUFOR0RRSWdBaUFBUVFGMGFpOEJBQ0FCUVljQ2JHb2hBU0FBUVFGcUlRQU1BQXNBQ3lBQ0lBTWdBUkN5QlNFQkN5QUJDeElBSUFBZ0FTQUNJQU5CZ0lBQkVOQUJHZ3NzQVFGL0EwQWdBU0FEUmtVRVFDQUFJQU5xTFFBQUlBSkJod0pzYWlFQ0lBTkJBV29oQXd3QkN3c2dBZ3ZPQVFJRGZ3RitJQUVnQWtFQkVMSUZJZ05CLy8vLy93TnhJUVVnQUNnQ05DQUFLQUlrUVFGcklBTnhRUUowYWlFREEwQWdBeWdDQUNJRVJRUkFRUUFQQ3dKQUlBQW9BamdnQkVFQ2RHb29BZ0FpQXlrQ0JDSUdRaUNJcDBILy8vLy9BM0VnQlVjZ0JrS0FnSUNBZ0lDQWdFQ0RRb0NBZ0lDQWdJQ0F3QUJTY2lBR3AwSC8vLy8vQjNFZ0FrY2dCa0tBZ0lDQUNJTkNBRkp5Y2cwQUlBTkJFR29nQVNBQ0VHRU5BQ0FFUWQ0QlRnUkFJQU1nQXlnQ0FFRUJhallDQUFzZ0JBOExJQU5CREdvaEF3d0FDd0FMZndFRWZ5QUJMUUFBUWRzQVJnUkFJQUZCQVdvaUF4QS9RUUZySVFJZ0FDZ0NFQ2dDT0NFRVFkQUJJUUVEUUNBQlFkNEJSd1JBQWtBZ0JDQUJRUUowYWlnQ0FDSUZLQUlFUWYvLy8vOEhjU0FDUncwQUlBVkJFR29nQXlBQ0VHRU5BQ0FBSUFFUUdBOExJQUZCQVdvaEFRd0JDd3NRQVFBTElBQWdBUkNxQVF1c0FnTUNmd0orQVh3akFFRWdheUlDSkFCRUFBQUFBQUFBK0g4aEJpQUFLQUlJUWYvLy8vOEhSd1JBSUFBb0FnQWhBeUFDUWdBM0FoZ2dBa0tBZ0lDQWdJQ0FnSUIvTndJUUlBSWdBellDRENBQ1FReHFJQUFRUkJvQ2ZpQUNLQUlVSWdCQi9mLy8vd2RNQkVBZ0FrRU1ha0UxUWNnRUVNNEJHaUFDS0FJVUlRQUxRb0NBZ0lDQWdJRDQvd0FnQUVIKy8vLy9CMFlOQUJvZ0FFR0FnSUNBZUVZRVFFSUFEQUVMSUFJb0Fod2hBd0orSUFJb0FoaEJBa1lFUUNBREtRSUFEQUVMSUFNMUFnQkNJSVlMSVFRZ0FFR0NlRXdFUUNBRVFZNTRJQUJycllnaEJFSUFEQUVMSUFSQ0M0aEMvLy8vLy8vLy93ZURJUVFnQUVIK0IycXRRalNHQ3lFRklBUWdCWVFnQWpVQ0VFSS9ob1MvSVFZZ0FrRU1haEFiQ3lBQklBWTVBd0FnQWtFZ2FpUUFDdzRBSUFCQ2dJQ0FnUEIrRUlBR0MrNFBBd3QvQTM0QmZDTUFRVUJxSWhBa0FFSGZBRUdBQWlBRVFTQnhHeUVKSUFSQmdBTnhJUXNDUUFKQUFrQUNmd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FCTFFBQUlnWkJLMnNPQXdFREFBTUxRUUVoRGlBQlFRRnFJUUVNQVFzZ0FVRUJhaUVCQ3lBRVFZQUljVVVOQVNBQkxRQUFJUVlMSUFaQi93RnhRVEJIRFFBQ1FBSkFBa0FnQVMwQUFTSUhRZmdBUndSQUlBZEI3d0JHRFFJZ0IwSFlBRWNOQVFzZ0EwRnZjUTBGSUFGQkFtb2hCMEVRSVFNTUNRc2dBeUFIUWM4QVIzSU5BUXdGQ3lBRFJRMEVEQU1MQWtBQ1FDQUhRZUlBUndSQUlBTkZJQWRCd2dCR2NRMEJJQU1nQjBFd2EwSC9BWEZCQ1V0eURRUWdCRUVRY1EwQ0RBY0xJQU1OQkFzZ0JFRUVjVVVOQlVFQ0lRTWdBVUVDYWlFSERBY0xJQUZCQVdvaEIwRUJJUVlEUUNBQklBWnFJUU1nQmtFQmFpRUdJQU10QUFBaUNFSDRBWEZCTUVZTkFBdEJDQ0VEUVlBQ0lRbEJBU0VLSUFoQi9nRnhRVGhHRFFRTUJnc2dCRUVCY1NBTFFZQUNja0dBQWtkeURRQWdBVUVJYWlFSFFmVWNJUVlnQVNFSUEwQWdCa0g5SEVjRVFDQUlMUUFBSUFZdEFBQkhEUUlnQmtFQmFpRUdJQWhCQVdvaENBd0JDd3NnQzBHQUFrWUVRQ0FBRUxZRkloRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFS0FnSUNBNEFBaEVRd0pDeUFScDBFRWFpQU9FSXdCREFnTFJBQUFBQUFBQVBEL1JBQUFBQUFBQVBCL0lBNGJJaFM5SWhFQ2Z5QVVtVVFBQUFBQUFBRGdRV01FUUNBVXFnd0JDMEdBZ0lDQWVBc2lCcmU5VVFSQUlBYXRJUkVNQ0F0Q2dJQ0FnTUIrSUJGQ2dJQ0FnTUNCZ1B6L0FIMGdFVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2hFUXdIQ3lBQklnY2dBMFVOQXhvTUJRc2dBU0VIREFRTElBUkJCSEZGRFFBZ0FVRUNhaUVIUVFnaEF3d0NDeUFCQ3lFSFFRb2hBd3dCQzBLQWdJQ0F3SDRoRVNBSExRQUFFSllCSUFOUERRRUxRUUFoQmlBRFFRcEhJUXdnQnlFQkEwQUNRQ0FHSUFkcUlnMHRBQUFpQ01BaER5QUlFSllCSUFOT0JFQWdDU0FQUncwQkFrQWdEQ0FHUVFGSGNnMEFJQTFCQVdzdEFBQkJNRWNOQUVFQklRWU1BZ3NnRFMwQUFSQ1dBU0FEVGcwQkN5QUhJQVpCQVdvaUJtb2hBUXdCQ3d0QkFDRU1Ba0FDUUNBRVFRRnhEUUFDUUNBSVFTNUhEUUFnRFMwQUFTRUlJQVpGQkVBZ0NCQ1dBU0FEVGcwQkN5QU5RUUZxSVFGQ2dJQ0FnTUIrSVJFZ0NTQUl3RVlOQWdOQUFrQWdDRUgvQVhFUWxnRWdBMGdFUUNBQkxRQUJJUWdNQVF0QkFTRU1JQWtnQ01CSERRSWdBUzBBQVNJSUVKWUJJQU5PRFFJTElBRkJBV29oQVF3QUN3QUxJQUVnQjAwTkFBSkFJQUV0QUFBaUJrSGxBRWNFUUNBRFFRcEdJQVpCeFFCR2NRMEJJQVpCSUhKQjhBQkhJQU5CRUV0eURRSkJBU0FEZEVHRWdnUnhEUUVNQWdzZ0EwRUtSdzBCQzBFQklRd2dBVUVCYWlFR0FrQUNRQUpBSUFFdEFBRkJLMnNPQXdBQ0FRSUxJQUZCQW1vaEJnd0JDeUFCUVFKcUlRWUxJQVl0QUFCQk9tdEJka2tOQUNBR0lRRURRQ0FCSWdaQkFXb2hBU0FHTFFBQklnakFJUTBnQ0VFNmEwRjFTdzBBSUFrZ0RVY05BU0FHTFFBQ1FUcHJRWFZMRFFBTEN5QUJJQWRHQkVCQ2dJQ0FnTUIrSVJFTUFRc2dFQ0VKQWtBZ0FTQUhheUlOUVFKcUlnOUJ3UUJQQkVBZ0FDZ0NFQ0lHUVJCcUlBOGdCaWdDQUJFREFDSUpSUTBCQzBFQUlRWkJBQ0VJSUE0RVFDQUpRUzA2QUFCQkFTRUlDeUFOUVFBZ0RVRUFTaHNoRGdOQUlBWWdEa1pGQkVBZ0JpQUhhaTBBQUNJTlFkOEFSd1JBSUFnZ0NXb2dEVG9BQUNBSVFRRnFJUWdMSUFaQkFXb2hCZ3dCQ3dzZ0NDQUpha0VBT2dBQUFuNENRQUpBSUFSQndBQnhCRUFDUUFKQUFrQUNRQ0FCTFFBQVFld0FhdzREQVFJQUF3c2dBVUVCYWlFQlFZQUJJUXNNQlFzZ0FVRUJhaUVCUVlBQ0lRc01CQXNnQVVFQmFpRUJRWUFESVFzTUF3c2dCRUdBQkhFRVFFS0FnSUNBd0g0Z0NnMEVHaUFMUVlBQklBd2JJUXNNQXdzZ0EwRUtSdzBCREFJTElBc05BU0FFUVlBRWNRUkFRb0NBZ0lEQWZpQUtEUU1hSUF4RlFRZDBJUXNNQWd0QkFDRUxJQU5CQ2tZTkFRdENnSUNBZ01CK0lBd05BUm9MQWtBQ1FBSkFBa0FDUUFKQUlBdEJHWGNPQkFBQkFnTUVDd0o4SUF3Z0EwRUtSbkZGQkVBZ0NTQUpMUUFBSWdSQkxVWnFJUWNEUUNBSElnWkJBV29oQnlBR0xRQUFJZ2hCTUVZTkFBdENtTFBtekptejVzd1pJUklnQTBFS1J3UkFRUUFnQTJ1c0lBT3NnQ0VTQ3lBRHJTRVRRUUFoQjBJQUlSRURRQUpBSUFoQi93RnhJZ1ZGRFFBZ0JSQ1dBU0lGSUFOT0RRQWdFU0FGclNBUklCTitmQ0FSSUJKV0lnVWJJUkVnQlNBSGFpRUhJQVl0QUFFaENDQUdRUUZxSVFZTUFRc0xJQkc2SVJRZ0J3UkFJQU8zSUFlM0VJOERJQlNpSVJRTElCU2FJQlFnQkVFdFJoc01BUXNnQ1JEa0JRc2lGTDBoRVNBUkFuOGdGSmxFQUFBQUFBQUE0RUZqQkVBZ0ZLb01BUXRCZ0lDQWdIZ0xJZ2EzdlZJTkJDQUdyUXdGQzBLQWdJQ0F3SDRnQ2lBTWNnMEVHaUFBSUFrZ0F5QUVRUUFnQUNnQ0VDZ0NtQUlSSWdBTUJBdENnSUNBZ01CK0lBb05BeG9nQUNBSklBTWdCQ0FGSUFBb0FoQW9BclFDRVNJQURBTUxRb0NBZ0lEQWZpQURRUXBIRFFJYUlBQWdDVUVLSUFSQkFDQUFLQUlRS0FMUUFoRWlBQXdDQ3hBQkFBdENnSUNBZ01CK0lCRkNnSUNBZ01DQmdQei9BSDBnRVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMSVJFZ0QwSEJBRWtOQVNBQUtBSVFJZ0JCRUdvZ0NTQUFLQUlFRVFBQURBRUxJQUFRZkVLQWdJQ0E0QUFoRVFzZ0FTRUhDeUFDQkVBZ0FpQUhOZ0lBQ3lBUVFVQnJKQUFnRVF0YkFRUi9JQUFvQWdBaUEwRUFJQU5CQUVvYklRVkJBQ0VEQTBBQ1FDQURJQVZIQkg4Z0FDZ0NCQ0lHSUFOQlBHeHFLQUlBSUFGSERRRWdCaUFEUVR4c2FpQUNRUUowYWlnQ0JBVkJBQXNQQ3lBRFFRRnFJUU1NQUFzQUMwZ0JBMzhnQWtFQUlBSkJBRW9iSVFJRFFDQUNJQU5HQkVCQkFBOExJQUVnQTJvaEJDQURRUUYwSVFVZ0EwRUJhaUVESUFBZ0JXb3ZBUUFnQkMwQUFHc2lCRVVOQUFzZ0JBdS9BUUlDZmdKL0lBRzlJZ05DLy8vLy8vLy8vd2VESVFJZ0EwSS9pS2NoQkFKQUFrQWdBMEkwaUtkQi93OXhJZ1VFUUNBRlFmOFBSdzBCSUFKUVJRUkFJQUFRTlVFQUR3c2dBQ0FFRUl3QlFRQVBDeUFDVUFSQUlBQWdCQkNKQVVFQUR3c2dBa0lNaGlJQ0lBSjVJZ09HSVFKQkFDQURwMnNoQlF3QkN5QUNRZ3VHUW9DQWdJQ0FnSUNBZ0grRUlRSUxJQUFnQlVIK0IyczJBZ2dnQUVFQ0VFRkZCRUFnQUNnQ0VDQUNOd0lBSUFBZ0JEWUNCRUVBRHdzZ0FCQTFRU0FMcXdFQ0FYNENmeUFCS1FJRVFvQ0FnSUFJZ3lFRElBQXRBQWRCZ0FGeFJRUkFJQU5RQkVBZ0FFRVFhaUFCUVJCcUlBSVFZUThMUVFBZ0FVRVFhaUFBUVJCcUlBSVF1UVZyRHdzZ0FVRVFhaUVFSUFCQkVHb2hBQ0FEVUFSQUlBQWdCQ0FDRUxrRkR3c2dBa0VBSUFKQkFFb2JJUVZCQUNFQkEwQWdBU0FGUmdSQVFRQVBDeUFCUVFGMElRSWdBVUVCYWlFQklBQWdBbW92QVFBZ0FpQUVhaThCQUdzaUFrVU5BQXNnQWd2VEJBRUlmeUFESUFFb0FnQWlCQ2dDSEVFRGJFRUNiU0lGSUFNZ0JVb2JJUWdDUUNBQ0JFQWdBQ0FDS0FJVUlBaEJBM1FRaVFJaUEwVU5BU0FDSUFNMkFoUUxJQVFvQWhnaUJrRUJhaUlGSVFNRFFDQURJZ0pCQVhRaEF5QUNJQWhKRFFBTEFrQWdBaUFGUndSQUlBQWdBa0VDZENJSElBaEJBM1JxUVRCcUVDa2lDa1VOQWlBRUtBSUlJZ01nQkNnQ0RDSUZOZ0lFSUFVZ0F6WUNBQ0FFUWdBM0FnZ2dCeUFLYWlJR0lBUWdCQ2dDSUVFRGRFRXdhaEFmSVFVZ0FDZ0NFQ0lES0FKUUlna2dCVUVJYWlJTE5nSUVJQVVnQTBIUUFHbzJBZ3dnQlNBSk5nSUlJQU1nQ3pZQ1VDQUZJQUpCQVdzaUNUWUNHRUVBSVFNZ0NrRUFJQWNRS3hvZ0JVRXdhaUVDQTBBZ0F5QUZLQUlnVDBVRVFBSkFJQUlvQWdRaUIwVUVRQ0FEUVFGcUlRTU1BUXNnQWlBQ0tBSUFRWUNBZ0dCeElBVWdCeUFKY1VGL2MwRUNkR29pQnlnQ0FFSC8vLzhmY1hJMkFnQWdCeUFEUVFGcUlnTTJBZ0FMSUFKQkNHb2hBZ3dCQ3dzZ0FDZ0NFQ0lBUVJCcUlBUWdCQ2dDR0VGL2MwRUNkR29nQUNnQ0JCRUFBQXdCQ3lBRUtBSUlJZ0lnQkNnQ0RDSUROZ0lFSUFNZ0FqWUNBQ0FFUWdBM0FnZ2dBQ0FFSUFaQmYzTkJBblJxSUFWQkFuUWlBaUFJUVFOMGFrRXdhaENKQWlJRFJRUkFJQUFvQWhBaUFDZ0NVQ0lCSUFSQkNHb2lBallDQkNBRUlBQkIwQUJxTmdJTUlBUWdBVFlDQ0NBQUlBSTJBbEJCZnc4TElBQW9BaEFpQUNnQ1VDSUVJQUlnQTJvaUJrRUlhaUlDTmdJRUlBWWdBRUhRQUdvMkFnd2dCaUFFTmdJSUlBQWdBallDVUFzZ0FTQUdOZ0lBSUFZZ0NEWUNIRUVBRHd0QmZ3dlRBUUlGZndGK0FrQWdBU2tDQkNJSHAwSC8vLy8vQjNFaUJFRUxhMEYyU1EwQUlBRkJFR29oQWdKL0lBZENnSUNBZ0FpRFVDSUZSUVJBSUFJdkFRQU1BUXNnQWkwQUFBc2lBVUV3YXlJRFFRbExEUUFDZndKQUlBRkJNRWNFUUVFQklRRURRQ0FCSUFSR0RRSUNmeUFGUlFSQUlBSWdBVUVCZEdvdkFRQU1BUXNnQVNBQ2FpMEFBQXRCTUdzaUJrRUpTdzBFSUFGQkFXb2hBU0FHclNBRHJVSUtmbndpQjZjaEF5QUhRb0NBZ0lBUVZBMEFDd3dEQzBFQUlnTWdCRUVCUncwQkdnc2dBQ0FETmdJQVFRRUxEd3RCQUF1cEFnSURmd0YrQWtBZ0FDQUNFRGhGRFFBZ0FxY2lCQzhCQmtFT1JnUkFJQUFnQVNBRUtBSWdLUU1BRU5BRkR3c2dBVUtBZ0lDQWNGUU5BQUpBSUFBZ0FrRTdJQUpCQUJBVUlnSkMvLy8vLzI5WUJFQkJmeUVESUFKQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQVFjWXdRUUFRRlF3QkN5QUJweUVFSUFLbklRVUNRQU5BQWtBZ0JDZ0NFQ2dDTENJRFJRUkFRUUFoQXlBRUx3RUdRVEJIRFFRZ0JDQUVLQUlBUVFGcU5nSUFJQVN0UW9DQWdJQndoQ0VCQTBBZ0FDQUJFSXdDSWdGQ2dJQ0FnSENESWdaQ2dJQ0FnQ0JSRFFSQmZ5RURJQVpDZ0lDQWdPQUFVUTBGSUFHbklBVkdCRUFnQUNBQkVBOE1Bd3NnQUJCN1JRMEFDeUFBSUFFUUR3d0VDeUFESWdRZ0JVY05BUXNMUVFFaEF3d0JDMEVBSVFNTElBQWdBaEFQQ3lBREM5SURBZ0orQW44akFFRWdheUlFSkFBQ1FDQUJRdi8vLy8vLy8vLy8vd0NESWdOQ2dJQ0FnSUNBd0lBOGZTQURRb0NBZ0lDQWdNRC93d0I5VkFSQUlBRkNCSVlnQUVJOGlJUWhBeUFBUXYvLy8vLy8vLy8vRDRNaUFFS0JnSUNBZ0lDQWdBaGFCRUFnQTBLQmdJQ0FnSUNBZ01BQWZDRUNEQUlMSUFOQ2dJQ0FnSUNBZ0lCQWZTRUNJQUJDZ0lDQWdJQ0FnSUFJVWcwQklBSWdBMElCZzN3aEFnd0JDeUFBVUNBRFFvQ0FnSUNBZ01ELy93QlVJQU5DZ0lDQWdJQ0F3UC8vQUZFYlJRUkFJQUZDQklZZ0FFSThpSVJDLy8vLy8vLy8vd09EUW9DQWdJQ0FnSUQ4L3dDRUlRSU1BUXRDZ0lDQWdJQ0FnUGovQUNFQ0lBTkMvLy8vLy8vL3YvL0RBRllOQUVJQUlRSWdBMEl3aUtjaUJVR1I5d0JKRFFBZ0JFRVFhaUFBSUFGQy8vLy8vLy8vUDROQ2dJQ0FnSUNBd0FDRUlnSWdCVUdCOXdCckVHY2dCQ0FBSUFKQmdmZ0FJQVZyRUk0Q0lBUXBBd2hDQklZZ0JDa0RBQ0lBUWp5SWhDRUNJQVFwQXhBZ0JDa0RHSVJDQUZLdElBQkMvLy8vLy8vLy8vOFBnNFFpQUVLQmdJQ0FnSUNBZ0FoYUJFQWdBa0lCZkNFQ0RBRUxJQUJDZ0lDQWdJQ0FnSUFJVWcwQUlBSkNBWU1nQW53aEFnc2dCRUVnYWlRQUlBSWdBVUtBZ0lDQWdJQ0FnSUIvZzRTL0N3MEFJQUFnQVNBQ1FRQVF2QUVMdWdNQ0FYNERmeU1BUVJCcklnUWtBQUpBQWtBQ1FBSkFBa0FEUUFKQUlBRWhBd0pBQWtBQ1FBSkFBa0FDUUFKQVFRY2dBVUlnaUtjaUJTQUZRUWRyUVc1SkcwRUxhZzRUQUFFQ0NRY0tDZ29LQ2dZTkJRVUxDZ29ORFFvTElBSkJBVVlOQWlBQUlBRVFEeUFBUWRMSEFFRUFFQlVNQ3dzZ0FrRUJSZzBCSUFBZ0FSQVBJQUJCOE1ZQVFRQVFGUXdLQ3lBQ1FRRkhEUUVMSUFFaEF3d0pDeUFBSUFFUUR5QUFRWkRIQUVFQUVCVU1Cd3NnQVVMLy8vLy9ENE1oQXd3SEMwS0FnSUNBNEFBaEF5QUFJQUZCQVJDYUFTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRRU1CZ3NMSUFBZ0JFRUlhaUFCRU9VQklRSWdBQ0FCRUE4Z0FrVU5BeUFFSUFJZ0FoQ0JBaUlGYWlJR05nSU1RZ0FoQXdKQUlBVWdCQ2dDQ0VZTkFDQUFJQVlnQkVFTWFrRUFRUVFRdUFJaUEwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBUWdCQ2dDREJDQkFpQUVLQUlNYWlJRk5nSU1JQVFvQWdnZ0JTQUNhMFlOQUNBQUlBTVFEMEtBZ0lDQXdINGhBd3NnQUNBQ0VGUU1CQXNnQUNBQkVBOGdBRUd5eHdCQkFCQVZEQUlMSUFBZ0FSQVBDMEtBZ0lDQXdINGhBd3dCQzBLQWdJQ0E0QUFoQXdzZ0JFRVFhaVFBSUFNTGl3SUNBMzhCZmlNQVFSQnJJZ1VrQUNBRklBSTNBd2dDUUNBQUx3SG9BVUdBQWtrTkFDQUFJQUpCM1FFZ0FrRUFFQlFpQWtLQWdJQ0FjSU1pQjBLQWdJQ0FNRkVOQUFKQUlBZENnSUNBZ09BQVVRMEFJQUFnQWtFbEVFc2lCa1VOQUNBR0tBSUVCRUFnQUNBQ0VBOE1BZ3NnQmlBREVQY0RRUUowSWdScUtBSUlJZ05GQkVBZ0JTQUVRY0RBQVdvMkFnQWdBRUhkUENBRkVCVU1BUXRCQVNFRUlBTWdBeWdDQUVFQmFqWUNBQ0FBSUFPdFFvQ0FnSUJ3aEVLQWdJQ0FNRUVCSUFWQkNHb1FMeUlIUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBQ0VBOGdBU0FITndNQURBRUxJQUFnQWhBUElBRkNnSUNBZ0RBM0F3QkJmeUVFQ3lBRlFSQnFKQUFnQkF0ZkFRRi9JQUZCRUdvaEF3SkFJQUV0QUFkQmdBRnhCRUFnQUNBRElBSkJBWFFRSHhvTUFRdEJBQ0VCSUFKQkFDQUNRUUJLR3lFQ0EwQWdBU0FDUmcwQklBQWdBVUVCZEdvZ0FTQURhaTBBQURzQkFDQUJRUUZxSVFFTUFBc0FDd3Z2QWdJQmZ3RjhJd0JCSUdzaUF5UUFJQUVDZndKL0FrQUNRQU5BQWtBQ1FBSkFBa0JCQnlBQ1FpQ0lweUlCSUFGQkIydEJia2tiSWdFT0NBQUFBQUFEQXdNQkFnc2dBcWNNQmd0QkFDRUFJQUpDZ0lDQWdNQ0JnUHovQUh3aUFrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmcwRElBSy9JZ1JFQUFBQUFBQUFBQUJqRFFOQi93RWdCRVFBQUFBQUFPQnZRR1FOQmhvQ2Z5QUVuaUlFbVVRQUFBQUFBQURnUVdNRVFDQUVxZ3dCQzBHQWdJQ0FlQXNNQmdzZ0FVRjNSZzBEQ3lBQUlBSVFqUUVpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBBQzBGL0lRQUxRUUFNQWdzZ0FDZ0MyQUVoQVNBRFFnQTNBaFFnQTBLQWdJQ0FnSUNBZ0lCL053SU1JQU1nQVRZQ0NDQURRUWhxSWdFZ0FxZEJCR29RUkJvZ0FVRUFFTkVCR2lBRFFSeHFJQUZCQUJDcEFTQUJFQnNnQUNBQ0VBOGdBeWdDSEFzaEFVRUFJUUJCL3dFZ0FTQUJRZjhCVGhzaUFVRUFJQUZCQUVvYkN6WUNBQ0FEUVNCcUpBQWdBQXRQQVFKL0l3QkJJR3NpQXlRQUFuOGdBQ0FEUVF4cUlBSVFxd1VpQkVVRVFDQUJRZ0EzQXdCQmZ3d0JDeUFCSUFSQkFSQ0NBeG9nQUNBRUlBTkJER29RWGtFQUN5RUFJQU5CSUdva0FDQUFDNmdCQVFWL0lBQ25JZ01vQWhBaUFVRXdhaUVFSUFFZ0FTZ0NHRUYvYzBFQ2RFR2tmbkpxS0FJQUlRRURRQ0FCUlFSQVFRQVBDeUFFSUFGQkFXc2lCVUVEZEdvaUFTZ0NBQ0VDSUFFb0FnUkJOa2NFUUNBQ1FmLy8veDl4SVFFTUFRc0xRUUVoQVFKQUlBSkIvLy8vL3dOTERRQWdBeWdDRkNBRlFRTjBhaWtEQUNJQVFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFBZ0FLY29BZ1JCLy8vLy93ZHhRUUJISVFFTElBRUx5d0VDQW44QmZpTUFRUkJySWdZa0FBSkFBa0FnQWtLQWdJQ0FjRlFOQUNBQ3B5SUhMd0VHUVF4SERRQWdCeTBBS1VFTVJ3MEFJQUFnQVNBRElBTUVmeUFFQlNBR1FvQ0FnSUF3TndNSUlBWkJDR29MSUFVZ0J5NEJLaUFIS0FJa0VSSUFJUWdNQVF0Q2dJQ0FnT0FBSVFnQ1FDQUFJQUlnQVNBRElBUVFJU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlNCRUFnQVVMLy8vLy9iMVlOQVNBQUlBRVFEeUFBUVk0eFFRQVFGUXNnQlVFQU5nSUFEQUVMSUFWQkFqWUNBQ0FCSVFnTElBWkJFR29rQUNBSUM1Y0JBQUpBQWtBQ1FBSkFBa0FnQVVJZ2lLZEJBMm9PQWdFQUFnc2dBQ0FBSUFFZ0F5QUVFSXdFSUFKQkFFRUFFQzhQQ3lBQUlBRVFEd0pBSUFBZ0FhY2lBeENuQlVFQVNBMEFJQUFnQXhDbUJVRUFTQTBBSUFBZ0F4Q2xCU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlNEUU1MSUFCQkFoQ1BCQXdCQ3lBQUlBRVFEeUFBUWZMMkFFRUFFQlVMUW9DQWdJRGdBQ0VCQ3lBQkMrb0RBUVYvSXdCQkVHc2lCaVFBQWtBQ1FBSkFBbjhnQUNnQ0VDSUVLQUtvQVNJRFJRUkFJQUl0QUFCQkxrY0VRQ0FBSUFJUThRVU1BZ3NnQVJDb0JTRUZRUUFoQXlBQUlBSVFQeUFGSUFGclFRQWdCUnNpQldwQkFtb1FLU0lIUlEwRUlBY2dBU0FGRUI4aUFTQUZha0VBT2dBQUFrQURRQUpBSUFJdEFBQkJMa2NOQUVFQ0lRTUNRQUpBSUFJdEFBRkJMbXNPQWdBQkFnc2dBaTBBQWtFdlJ3MEJJQUV0QUFCRkRRTWdBUkNvQlNJRFFRRnFJQUVnQXhzaUEwSFprQUVROGdORkRRRWdBMEhZa0FFUThnTkZEUUVnQXlBQklBTkphMEVBT2dBQVFRTWhBd3NnQWlBRGFpRUNEQUVMQ3lBQkxRQUFSUTBBSUFFUVB5QUJha0V2T3dBQUN5QUJFRDhnQVdvZ0FoRGxCU0FCSVFJTUFnc2dBQ0FCSUFJZ0JDZ0NzQUVnQXhFSEFBc2lBa1VOQVFzZ0FDQUNFS29CSWdGRkJFQWdBQ2dDRUNJQVFSQnFJQUlnQUNnQ0JCRUFBQXdCQ3lBQUlBRVE0UVVpQXdSQUlBQW9BaEFpQkVFUWFpQUNJQVFvQWdRUkFBQWdBQ0FCRUJNTUFnc2dBQ0FCRUJNZ0JDZ0NyQUVpQVVVRVFDQUdJQUkyQWdBZ0FFSHFsZ0VnQmhER0FpQUFLQUlRSWdCQkVHb2dBaUFBS0FJRUVRQUFEQUVMSUFBZ0FpQUVLQUt3QVNBQkVRRUFJUU1nQUNnQ0VDSUFRUkJxSUFJZ0FDZ0NCQkVBQUF3QkMwRUFJUU1MSUFaQkVHb2tBQ0FEQ3pVQkFYOGdBQ2dDZ0FJaUIwVUVRQ0FBUVpEMkFFRUFFQlZDZ0lDQWdPQUFEd3NnQUNBQklBSWdBeUFFSUFVZ0JpQUhFVG9BQy80RUFRbC9Jd0JCRUdzaUJpUUFBbjlCZnlBQUlBWkJER29nQWtFQUVNSUNEUUFhSUFFb0FoQXRBRE5CQ0hGRkJFQWdBQ0FEUVRBUXdBSU1BUXNnQVMwQUJVRUljUVJBSUFZb0Fnd2lBeUFCS0FJb0lnVkpCRUFnQXlFRUEwQWdCQ0FGUmtVRVFDQUFJQUVvQWlRZ0JFRURkR29wQXdBUUR5QUVRUUZxSVFRTUFRc0xJQUVnQXpZQ0tBc2dBU2dDRkNBRFFRQk9CSDRnQTYwRlFvQ0FnSURBZmlBRHVMMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzM0F3QkJBUXdCQ3lBQUlBWkJCR29nQVNnQ0ZDa0RBQkIzR2lBR0tBSU1JZ2doQlFKQUlBWW9BZ1FpQnlBSVRRMEFJQUVvQWhBaUNpZ0NJQ0lFSUFjZ0NHdFBCRUFEUUNBSElnVWdDRTBOQWlBQUlBRWdBQ0FGUVFGcklnY1FxUVVpQ1JENUF5RUVJQUFnQ1JBVElBUU5BQXdDQ3dBTElBcEJNR29pQnlFTUEwQWdCQ0FKVEFSQUEwQWdCQ0FMVEEwREFrQWdCeWdDQkNJRVJRMEFJQUFnQmtFSWFpQUVFS3dCUlEwQUlBWW9BZ2dnQlVrTkFDQUFJQUVnQnlnQ0JCRDVBeG9nQVNnQ0VDSUtJQXRCQTNScVFUQnFJUWNMSUFkQkNHb2hCeUFMUVFGcUlRc2dDaWdDSUNFRURBQUxBQVVDUUNBTUtBSUVJZ1JGRFFBZ0FDQUdRUWhxSUFRUXJBRkZEUUFnQmlnQ0NDSUVJQVZKRFFBZ0JTQUVRUUZxSUF3dEFBTkJCSEViSVFVTElBeEJDR29oRENBSlFRRnFJUWtnQ2lnQ0lDRUVEQUVMQUFzQUN5QUFJQUVvQWhRZ0JVRUFUZ1IrSUFXdEJVS0FnSUNBd0g0Z0JiaTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVDQkJBU0FGSUFoTkRRQWFJQUFnQTBIdDZRQVFid3NoQkNBR1FSQnFKQUFnQkF0c0FnSi9BWHdqQUVFUWF5SUNKQUFDZnlBQlFpQ0lweUlEQkVCQkFDQURRUXRxUVJKSkRRRWFDMEYvSUFBZ0FrRUlhaUFCRUVJTkFCb2dBaXNEQ0NJRXZVS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVWlBRW5DQUVZWEVMSVFBZ0FrRVFhaVFBSUFBTDRBTUNCSDhDZmlBQlFRQklCRUFnQVVILy8vLy9CM0d0RHdzQ1FDQUJJQUFvQWhBaUJDZ0NMRWtFUUFKK0FrQWdCQ2dDT0NBQlFRSjBhaWdDQUNJQ0tRSUVJZ1pDZ0lDQWdJQ0FnSUJBZzBLQWdJQ0FnSUNBZ01BQVVnMEFJQUpCRUdvaEJDQUdwMEgvLy8vL0IzRWhCUUpBSUFaQ2dJQ0FnQWlEVUVVRVFDQUZSUTBDQWtBZ0JDSUJMd0VBSWdOQkxVY05BQ0FDUVJKcUlRRWdBaThCRWlJRFFUQkhEUUJDZ0lDQWdNRCsvd01nQlVFQ1JnMEVHZ3NnQTBFNmEwRjFTdzBCSUFOQnlRQkhJQVFnQlVFQmRHb2dBV3RCRUVkeURRSWdBVUVDYWtHZ3dBRkJEaEJoUlEwQkRBSUxJQVZGRFFFQ1FDQUVJZ0V0QUFBaUEwRXRSdzBBSUFKQkVXb2hBU0FDTFFBUklnTkJNRWNOQUVLQWdJQ0F3UDcvQXlBRlFRSkdEUU1hQ3lBRFFUcHJRWFZMRFFBZ0EwSEpBRWNnQkNBRmFpQUJhMEVJUjNJTkFTQUJRUUZxUWZZY1FRY1FZUTBCQ3lBQ0lBSW9BZ0JCQVdvMkFnQWdBQ0FDclVLQWdJQ0FrSCtFRUkwQklnWkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF5QUFJQVlRS0NJSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUdFQThnQnc4TElBSWdCNmNRZ3dJaEFTQUFJQWNRRHlBQlJRMERJQUFnQmhBUEMwS0FnSUNBTUFzUEMwSHYzd0JCcnZ3QVFka1lRZktMQVJBQUFBc2dCZ3ZiQVFFRGZ3SkFJQUFnQVNnQ0dFRUJha0VDZENJQ0lBRW9BaHhCQTNScVFUQnFJZ01RS1NJRVJRUkFRUUFoQWd3QkN5QUVJQUVnQVNnQ0dFRi9jMEVDZEdvZ0F4QWZJQUpxSWdKQkFUWUNBQ0FBS0FJUUlRRWdBa0VDT2dBRUlBRW9BbEFpQXlBQ1FRaHFJZ1EyQWdRZ0FpQUJRZEFBYWpZQ0RDQUNJQU0yQWdnZ0FTQUVOZ0pRUVFBaEFTQUNRUUE2QUJBZ0FpZ0NMQ0lEQkVBZ0F5QURLQUlBUVFGcU5nSUFDeUFDUVRCcUlRTURRQ0FCSUFJb0FpQlBEUUVnQUNBREtBSUVFQmdhSUFOQkNHb2hBeUFCUVFGcUlRRU1BQXNBQ3lBQ0Mrb0JBZ2QvQVg0Z0FDSURRZEFBYWlFR0lBRkJHR29oQnlBQktBSWNJUUFEUUNBQUlBZEdSUVJBSUFBb0FnUWhDQ0FBUVFKckx3RUFJUUlDUUFKQUlBQkJBMnNpQkMwQUFDSUZRUUp4QkVBZ0FTZ0NFQ0FDUVFOMGFpa0RBQ0lKUWlDSXAwRjBTdzBCREFJTElBRW9BaFFnQWtFRGRHb3BBd0FpQ1VJZ2lLZEJkVWtOQVFzZ0NhY2lBaUFDS0FJQVFRRnFOZ0lBSUFRdEFBQWhCUXNnQUNBSk53TVFJQUFnQUVFUWFqWUNDQ0FFSUFWQkFYSTZBQUFnQUVFRWEwRURPZ0FBSUFNb0FsQWlBaUFBTmdJRUlBQWdCallDQkNBQUlBSTJBZ0FnQXlBQU5nSlFJQWdoQUF3QkN3c0xvd0VDQVg4Q2ZpTUFRUkJySWdNa0FDQURJQUUzQXdnQ2Z3SkFJQUpDZ0lDQWdIQmFCRUFnQUNBQ1Fka0JJQUpCQUJBVUlnVkNnSUNBZ0hDRElnUkNnSUNBZ0NCUklBUkNnSUNBZ0RCUmNrVUVRRUYvSUFSQ2dJQ0FnT0FBVVEwREdpQUFJQUFnQlNBQ1FRRWdBMEVJYWhBdkVDWU1Bd3NnQUNBQ0VEZ05BUXNnQUVIKzh3QkJBQkFWUVg4TUFRc2dBQ0FCSUFJUXZnVUxJUUFnQTBFUWFpUUFJQUFMS3dFQmZ5QUJRUkJySWdNZ0FDQURLUU1BSUFGQkNHc3BBd0FRd0FVZ0FrZXRRb0NBZ0lBUWhEY0RBQXVWQ2dNRWZnbC9BbndqQUVFUWF5SUtKQUJCcWdGQnFRRWdBaHNoRGlBQlFRaHJJZzhwQXdBaEF5QUJRUkJySWd3cEF3QWhCUUpBQWtBQ1FBSkFBMEJCQnlBRFFpQ0lweUlCSUFGQkIydEJia2tiSVFjZ0JVTC8vLy8vRDRNaEJnSkFBa0FDUUFKQUFrQUNRQU5BQWtCQkJ5QUZJZ1JDSUlpbklnRWdBVUVIYTBGdVNSc2lBVUVMYWlJSVFSSkxRUUVnQ0hSQmg1QVFjVVZ5RFFBZ0IwRUxhaUlJUVJKTFFRRWdDSFJCaDVBUWNVVnlEUUFnQVNBSGNrVUVRQ0FFcHlBRHAwWWhDUXdNQ3dKQUFud0NmQ0FCUVFkR0JFQWdCMEVBSUFkQkIwY2JEUU1nQkVLQWdJQ0F3SUdBL1A4QWZMOGlFQ0FIUVFkR0RRRWFJQU9udHd3Q0N5QUhRUWRISUFGeURRSWdCS2UzQ3lFUUlBTkNnSUNBZ01DQmdQei9BSHkvQ3lFUklCQWdFV0VoQ1F3TUN5QUJRWFZISUFkQmRVZHhSUVJBSUFCQnFRRWdCQ0FESUFBb0FoQW9BdHdDRVJ3QUlnbEJBRTROREF3TEN5QUFLQUlRSVFnZ0FVRjNSeUFIUVhkSGNVVUVRQ0FBUWFrQklBUWdBeUFJS0FMQUFoRWNBQ0lKUVFCT0RRd01Dd3NnQUVHcEFTQUVJQU1nQ0NnQ3BBSVJIQUFpQ1VFQVRnMExEQW9MSUFFZ0IwWUVRQUpBSUFkQmYwY05BQ0FBSUFwQkNHb2dCQ0FESUE1QkFFRUNFSVVDSWdGRkRRQWdBQ0FFRUE4Z0FDQURFQThnQVVFQVNBMExJQXdnQ2lrRENEY0RBRUVBSVFFTURRc2dBQ0FFSUFOQkFCQzhBU0VKREFzTFFRRWhDU0FCUVFKR0lBZEJBMFp4SUFkQkFrWWdBVUVEUm5GeURRb0NRQUpBSUFGQmVVWUVRRUVBSVFsQmVTRUxJQWNpRFNFSUFrQWdCMEVMYWc0TkFnSUNCd2dIQndjSEJ3Y0NCUUFMSUFkQkIwWU5BUXdHQ3lBSFFYbEhEUUZCZVNFTklBWWhCU0FCSVFnQ1FBSkFJQUZCQVdvT0NRa0JCQWdJQ0FnSUFRQUxJQUZCQzJwQkEwa05BQXdIQ3lBQlFYWkdJUWxCZVNFSEN3SkFBa0FnQ1VVZ0IwRjJSM0VOQUNBQUtBSVFLQUtNQVNJSUJFQWdDQzBBS0VFRWNRMEJDd0pBQWtBZ0FVRjVSd1JBSUFRaEJRd0JDeUFBSUFRUXZBSWlCVUtBZ0lDQWNJTkNnSUNBZ09CK1VnMEJDeUFIUVhsSERRSWdBQ0FERUx3Q0lnTkNnSUNBZ0hDRFFvQ0FnSURnZmxFTkFnc2dBQ0FGRUE4Z0FDQURFQTlCQUNFSkRBMExJQUFnQkJCc0lnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkNDQUFJQU1RYkNJRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFvTElBQWdCU0FERU1BRklRa01Dd3NnQmlFRklBRkJBVVlOQUFzZ0IwRUJSdzBCQ3lBRFF2Ly8vLzhQZ3lFRElBUWhCUXdGQ3lBQklndEJmMGNOQUNBSFFRdHFJZ0ZCRWsxQkFFRUJJQUYwUVllUUVIRWJEUUpCZnlFTElBZEJmbkZCZUVZTkFnc2dCMEYvUndSL0lBY0ZJQXRCZm5GQmVFWWdDMEVMYWlJQlFSSk5RUUJCQVNBQmRFR0hrQkJ4RzNJTkFrRi9DeUVOSUFzaENBc0Nmd0pBSUFSQ2dJQ0FnSEJVRFFBZ0JLY3NBQVZCQUU0TkFFRUJJQTFCZm5GQkFrWU5BUm9MUVFBaEFTQURRb0NBZ0lCd1dnUi9JQU9uTEFBRlFRQklCVUVBQ3lBSVFYNXhRUUpHY1FzaENTQUFJQVFRRHlBQUlBTVFEd3dGQ3lBQUlBcEJDR29nQkNBRElBNUJBRUVDRUlVQ0lnZ0VRQ0FBSUFRUUR5QUFJQU1RRDBFQUlRRWdDRUVBU0EwRUlBd2dDaWtEQ0RjREFBd0dDeUFBSUFSQkFoQ2FBU0lGUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBRFFRSVFtZ0VpQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBCREFJTEN5QURJUVVMSUFBZ0JSQVBDeUFNUW9DQWdJQXdOd01BSUE5Q2dJQ0FnREEzQXdCQmZ5RUJEQUVMSUF3Z0FpQUpSNjFDZ0lDQWdCQ0VOd01BUVFBaEFRc2dDa0VRYWlRQUlBRUxoQWdDQW40RmZ5TUFRU0JySWdZa0FFRUhJQUZCQ0dzaUJ5a0RBQ0lEUWlDSXB5SUZJQVZCQjJ0QmJra2JJUVFDUUFKQUFrQUNRRUVISUFGQkVHc2lCU2tEQUNJQ1FpQ0lweUlCSUFGQkIydEJia2tiSWdGQkIwY2dCRUVIUjNKRkJFQWdCVUtBZ0lDQXdINGdBa0tBZ0lDQXdJR0EvUDhBZkw4Z0EwS0FnSUNBd0lHQS9QOEFmTCtndlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJOd01BREFFTElBRkJmMGNnQkVGL1IzRUVmeUFCQlFKQUFrQWdBVUYvUmdSQUlBUkJCMm9pQ0VFS1MwRUJJQWgwUVlFTWNVVnlEUUVMSUFSQmYwY05BU0FCUVFkcUlnRkJDa3NOQUVFQklBRjBRWUVNY1EwQkN5QUFJQVpCR0dvZ0FpQURRWjBCUVFCQkFoQ0ZBaUlCUlEwQUlBQWdBaEFQSUFBZ0F4QVBJQUZCQUVnTkJDQUZJQVlwQXhnM0F3QU1BZ3NnQUNBQ1FRSVFtZ0VpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBZ0EwRUNFSm9CSWdOQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUlBSVFEd3dFQzBFSElBTkNJSWluSWdFZ0FVRUhhMEZ1U1JzaEJFRUhJQUpDSUlpbklnRWdBVUVIYTBGdVNSc0xRWGxISUFSQmVVZHhSUVJBSUFVZ0FDQUNJQU1ReEFJaUFqY0RBRUVBSVFFZ0FrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRERBUUxJQUFnQWhCc0lnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQU1RYkNJRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUNFQThNQXd0QkJ5QUNRaUNJcHlJQklBRkJCMnRCYmtrYklnRkJCeUFEUWlDSXB5SUVJQVJCQjJ0QmJra2JJZ1J5UlFSQUlBVUNmaUFEeENBQ3hId2lBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDemNEQUF3QkN5QUJRWFZISUFSQmRVZHhSUVJBSUFCQm5RRWdCU0FDSUFNZ0FDZ0NFQ2dDMkFJUkdnQU5Bd3dCQ3lBQlFYZEhJQVJCZDBkeFJRUkFJQUJCblFFZ0JTQUNJQU1nQUNnQ0VDZ0N2QUlSR2dCRkRRRU1Bd3NDUUNBQlFYWkhJQVJCZGtkeFJRUkFJQUFvQWhBaEFRd0JDeUFBSUFaQkVHb2dBaEJ1QkVBZ0FDQURFQThNQkFzZ0FDQUdRUWhxSUFNUWJnMERBa0FnQUNnQ0VDSUJLQUtNQVNJRVJRMEFJQVF0QUNoQkJIRkZEUUFnQmlzREVCQzlBa1VOQUNBR0t3TUlFTDBDRFFFTElBVkNnSUNBZ01CK0lBWXJBeEFnQmlzRENLQzlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzM0F3QU1BUXNnQUVHZEFTQUZJQUlnQXlBQktBS2dBaEVhQUEwQ0MwRUFJUUVNQWdzZ0FDQURFQThMSUFWQ2dJQ0FnREEzQXdBZ0IwS0FnSUNBTURjREFFRi9JUUVMSUFaQklHb2tBQ0FCQzVBREFRbC9Jd0JCTUdzaUJ5UUFBa0FnQWtLQWdJQ0FjRlFOQUVFVElRVUNRQ0FDcHlJS0xRQUZRUVJ4UlEwQUlBQW9BaEFvQWtRZ0NpOEJCa0VZYkdvb0FoUWlDRVVOQUVFRFFSTWdDQ2dDQkJzaEJRdEJmeUVKSUFBZ0IwRXNhaUFIUVNocUlBb2dCUkNPQVEwQUlBT25RUUFnQTBMLy8vLy9iMVliSVF3Z0J5Z0NMQ0VJSUFjb0FpZ2hDeUFGUVE5TElRMUJBQ0VGQWtBRFFDQUZJQXRIQkVBQ1FBSkFJQXhGRFFBZ0FFRUFJQXdnQ0NBRlFRTjBhaWdDQkJCTUlnWkZEUUFnQmtFQVRnMEJEQVFMSUExRkJFQWdBQ0FIUVFocUlBb2dDQ0FGUVFOMGFpZ0NCQkJNSWdaQkFFZ05CQ0FHUlEwQklBY29BZ2doQmlBQUlBZEJDR29RU0NBR1FRUnhSUTBCQ3lBQUlBSWdDQ0FGUVFOMGFpSUdLQUlFSUFKQkFCQVVJZ05DZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BeUFHS0FJRUlRWUNmeUFFQkVBZ0FDQUJJQVlnQXhCRkRBRUxJQUFnQVNBR0lBTkJCeEFaQzBFQVNBMERDeUFGUVFGcUlRVU1BUXNMSUFBZ0NDQUxFRnBCQUNFSkRBRUxJQUFnQ0NBTEVGb0xJQWRCTUdva0FDQUpDNlVCQVFGK0FrQUNRQUorSUFSQkJIRUVRRUV0SVFJZ0FDQUJFRmtNQVF0QkxDRUNJQUFnQVJBbEN5SUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FDRUhZaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQkJFQkFwSWdJRVFDQUNRUUEyQWd3Z0FpQUVRUU54TmdJSUlBSWdBVGNEQUNBRlFvQ0FnSUJ3VkEwQ0lBV25JQUkyQWlBTUFnc2dBQ0FGRUE4TElBQWdBUkFQUW9DQWdJRGdBQThMSUFVTHhBRUJCSDhnQWFjaUJTQUNOZ0lnSUFWQ0FEY0NKQUpBSUFJb0Fqd2lCa1VOQUFKQUlBQWdCa0VDZEJCZklnaEZEUUFnQlNBSU5nSWtRUUFoQlFOQUlBVWdBaWdDUEU0TkFpQUNLQUlrSUFWQkEzUnFJZ2N2QVFJaEJnSkFJQWN0QUFBaUIwRUJjUVJBSUFBZ0JDQUdJQWRCQVhaQkFYRVFpd1FpQmcwQkRBTUxJQU1nQmtFQ2RHb29BZ0FpQmlBR0tBSUFRUUZxTmdJQUN5QUlJQVZCQW5ScUlBWTJBZ0FnQlVFQmFpRUZEQUFMQUFzZ0FDQUJFQTlDZ0lDQWdPQUFJUUVMSUFFTGlBRUJBbjRnQUNBQkVDMGhBZ0pBSUFGQkFFZ05BQ0FBS0FJUUtBSTRJQUZCQW5ScUtBSUFLUUlFSWdOQ2dJQ0FnSUNBZ0lCQWcwS0FnSUNBZ0lDQWdJQi9VaUFEUW9DQWdJRHcvLy8vUDROQ0FGSWdBMEtBZ0lDQWdJQ0FnRUJVY25FZ0EwTC8vLy8vRDROQ2dJQ0FnQWhSY2cwQUlBQkJub0FCSUFKQm5JQUJFTDRCSVFJTElBSUxaQUVDZndKQUFrQWdBVUtBZ0lDQWNGUU5BQ0FCRU1ZRkRRQkJmeUVESUFBZ0FoQXhJZ1JGRFFFZ0FDQUVFTmNGSVFJZ0FDQUVFQk1nQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCSUFBZ0FVRTJJQUpCQVJBWlFRQklEUUVMUVFBaEF3c2dBd3MxQUFKQUlBSkZJQUZDZ0lDQWdIQlVjZzBBSUFFUXhnVU5BQ0FBSUFGQk5pQUFJQUlRTFVFQkVCbEJBRTROQUVGL0R3dEJBQXNNQUNBQUlBRkJ1eVlRandFTGFBSUJmd0YrQWtBZ0FDQUJRZWtBSUFGQkFCQVVJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FBSUFRUUppRURJQUFnQVVIQUFDQUJRUUFRRkNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTFFRQWhBMEtBZ0lDQTRBQWhBUXNnQWlBRE5nSUFJQUVMRkFFQmZpQUFJQUVRSlNFQ0lBQWdBUkFQSUFJTDlnRUJCSDhnQUNnQ3lBRWlCU2dDRUNJRVFUQnFJUVlnQkNBRUtBSVlJQUZ4UVg5elFRSjBhaWdDQUNFRUFrQURRQ0FFUlEwQklBRWdCaUFFUVFGcklnZEJBM1JxSWdRb0FnUkhCRUFnQkNnQ0FFSC8vLzhmY1NFRURBRUxDeUFGS0FJVUlBZEJBM1JxSVFVQ1FDQURRUUZHRFFBZ0JUVUNCRUlnaGtLQWdJQ0F3QUJSQkVBZ0FDQUNFQThnQUNBRUtBSUVFTmtCUVg4UEN5QUVMUUFEUVFoeERRQWdBQ0FDRUE4Z0FDQUJRYzRkRUk4QlFYOFBDeUFBSUFVZ0FoQWdRUUFQQ3lBQUlBQXBBOEFCSUFFZ0FnSi9JQUFvQWhBb0Fvd0JJZ01FUUVHQWdBWWdBeWdDS0VFQmNRMEJHZ3RCZ0lBQ0N4RFFBUXVLQVFFQmZ3SkFJQUpDZ0lDQWdIQ0RRb0NBZ0lDUWYxRWdBMEtBZ0lDQWNJTkNnSUNBZ0pCL1VYRkZCRUFnQUVHTjl3QkJBQkFWREFFTElBQWdBVUVTRUdVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBR25JZ1FnQXo0Q0pDQUVJQUkrQWlBZ0FDQUJRZFVBUWdCQkFoQVpHaUFCRHdzZ0FDQURFQThnQUNBQ0VBOUNnSUNBZ09BQUN3MEFJQUFnQVVIT2xRRVEvd01MWndFQmZ3SkFJQUZCQUU0RVFDQUFLQUlRSWdJb0Fpd2dBVTBOQVNBQ0tBSTRJQUZCQW5ScUtBSUFJZ0VnQVNnQ0FFRUJhallDQUNBQUlBRkJCQkNBQkE4TFFmS1JBVUd1L0FCQnpoZEJtZElBRUFBQUMwSFozd0JCcnZ3QVFjOFhRWm5TQUJBQUFBdEVBUUYvSUFCQitBRnFJUUlnQUVIMEFXb2hBQU4vSUFBZ0FpZ0NBQ0lDUmdSQVFRQVBDeUFCSUFKQkJHc29BZ0JHQkg4Z0FrRUlhd1VnQWtFRWFpRUNEQUVMQ3d0U0FnSi9BWDRDUUNBQUtBSVFLQUtNQVNJQlJRMEFJQUVwQXdnaUEwS0FnSUNBY0ZRTkFDQURweUlCTHdFR0VPNEJSUTBBSUFFb0FpQWlBUzBBRWtFRWNVVU5BQ0FBSUFFb0FrQVFHQ0VDQ3lBQ0M2b1BBZ1YvRDM0akFFSFFBbXNpQlNRQUlBUkMvLy8vLy8vL1A0TWhDeUFDUXYvLy8vLy8veitESVFvZ0FpQUVoVUtBZ0lDQWdJQ0FnSUIvZ3lFTklBUkNNSWluUWYvL0FYRWhDQUpBQWtBZ0FrSXdpS2RCLy84QmNTSUpRZi8vQVd0QmdvQitUd1JBSUFoQi8vOEJhMEdCZ0g1TERRRUxJQUZRSUFKQy8vLy8vLy8vLy8vL0FJTWlERUtBZ0lDQWdJREEvLzhBVkNBTVFvQ0FnSUNBZ01ELy93QlJHMFVFUUNBQ1FvQ0FnSUNBZ0NDRUlRME1BZ3NnQTFBZ0JFTC8vLy8vLy8vLy8vOEFneUlDUW9DQWdJQ0FnTUQvL3dCVUlBSkNnSUNBZ0lDQXdQLy9BRkViUlFSQUlBUkNnSUNBZ0lDQUlJUWhEU0FESVFFTUFnc2dBU0FNUW9DQWdJQ0FnTUQvL3dDRmhGQUVRQ0FESUFKQ2dJQ0FnSUNBd1AvL0FJV0VVQVJBUWdBaEFVS0FnSUNBZ0lEZy8vOEFJUTBNQXdzZ0RVS0FnSUNBZ0lEQS8vOEFoQ0VOUWdBaEFRd0NDeUFESUFKQ2dJQ0FnSUNBd1AvL0FJV0VVQVJBUWdBaEFRd0NDeUFCSUF5RVVBUkFRb0NBZ0lDQWdPRC8vd0FnRFNBQ0lBT0VVQnNoRFVJQUlRRU1BZ3NnQWlBRGhGQUVRQ0FOUW9DQWdJQ0FnTUQvL3dDRUlRMUNBQ0VCREFJTElBeEMvLy8vLy8vL1AxZ0VRQ0FGUWNBQ2FpQUJJQW9nQVNBS0lBcFFJZ1liZVNBR1FRWjByWHluSWdaQkQyc1FaMEVRSUFacklRWWdCU2tEeUFJaENpQUZLUVBBQWlFQkN5QUNRdi8vLy8vLy96OVdEUUFnQlVHd0Ftb2dBeUFMSUFNZ0N5QUxVQ0lIRzNrZ0IwRUdkSzE4cHlJSFFROXJFR2NnQmlBSGFrRVFheUVHSUFVcEE3Z0NJUXNnQlNrRHNBSWhBd3NnQlVHZ0Ftb2dDMEtBZ0lDQWdJREFBSVFpRWtJUGhpQURRakdJaENJQ1FnQkNnSUNBZ0xEbXZJTDFBQ0FDZlNJRVFnQVFaaUFGUVpBQ2FrSUFJQVVwQTZnQ2ZVSUFJQVJDQUJCbUlBVkJnQUpxSUFVcEE1Z0NRZ0dHSUFVcEE1QUNRaitJaENJRVFnQWdBa0lBRUdZZ0JVSHdBV29nQkVJQVFnQWdCU2tEaUFKOVFnQVFaaUFGUWVBQmFpQUZLUVA0QVVJQmhpQUZLUVB3QVVJL2lJUWlCRUlBSUFKQ0FCQm1JQVZCMEFGcUlBUkNBRUlBSUFVcEErZ0JmVUlBRUdZZ0JVSEFBV29nQlNrRDJBRkNBWVlnQlNrRDBBRkNQNGlFSWdSQ0FDQUNRZ0FRWmlBRlFiQUJhaUFFUWdCQ0FDQUZLUVBJQVgxQ0FCQm1JQVZCb0FGcUlBSkNBQ0FGS1FPNEFVSUJoaUFGS1FPd0FVSS9pSVJDQVgwaUFrSUFFR1lnQlVHUUFXb2dBMElQaGtJQUlBSkNBQkJtSUFWQjhBQnFJQUpDQUVJQUlBVXBBNmdCSUFVcEE2QUJJZ3dnQlNrRG1BRjhJZ1FnREZTdGZDQUVRZ0ZXclh4OVFnQVFaaUFGUVlBQmFrSUJJQVI5UWdBZ0FrSUFFR1lnQmlBSklBaHJhaUVHQW44Z0JTa0RjQ0lUUWdHR0lnNGdCU2tEaUFFaUQwSUJoaUFGS1FPQUFVSS9pSVI4SWhCQzUrd0FmU0lVUWlDSUlnSWdDa0tBZ0lDQWdJREFBSVFpRlVJQmhpSVdRaUNJSWdSK0loRWdBVUlCaGlJTVFpQ0lJZ3NnRUNBVVZxMGdEaUFRVnEwZ0JTa0RlRUlCaGlBVFFqK0loQ0FQUWorSWZIeDhRZ0Y5SWhOQ0lJZ2lFSDU4SWc0Z0VWU3RJQTRnRGlBVFF2Ly8vLzhQZ3lJVElBRkNQNGdpRnlBS1FnR0doRUwvLy8vL0Q0TWlDbjU4SWc1V3JYd2dCQ0FRZm53Z0JDQVRmaUlSSUFvZ0VINThJZzhnRVZTdFFpQ0dJQTlDSUlpRWZDQU9JQTRnRDBJZ2hud2lEbGF0ZkNBT0lBNGdGRUwvLy8vL0Q0TWlGQ0FLZmlJUklBSWdDMzU4SWc4Z0VWU3RJQThnRHlBVElBeEMvdi8vL3crREloRitmQ0lQVnExOGZDSU9WcTE4SUE0Z0JDQVVmaUlZSUJBZ0VYNThJZ1FnQWlBS2Zud2lDaUFMSUJOK2ZDSVFRaUNJSUFvZ0VGYXRJQVFnR0ZTdElBUWdDbGF0Zkh4Q0lJYUVmQ0lFSUE1VXJYd2dCQ0FQSUFJZ0VYNGlBaUFMSUJSK2ZDSUxRaUNJSUFJZ0MxYXRRaUNHaEh3aUFpQVBWSzBnQWlBUVFpQ0dmQ0FDVksxOGZDSUNJQVJVclh3aUJFTC8vLy8vLy8vL0FGZ0VRQ0FXSUJlRUlSVWdCVUhRQUdvZ0FpQUVJQU1nRWhCbUlBRkNNWVlnQlNrRFdIMGdCU2tEVUNJQlFnQlNyWDBoQ2tJQUlBRjlJUXNnQmtIKy93QnFEQUVMSUFWQjRBQnFJQVJDUDRZZ0FrSUJpSVFpQWlBRVFnR0lJZ1FnQXlBU0VHWWdBVUl3aGlBRktRTm9mU0FGS1FOZ0lneENBRkt0ZlNFS1FnQWdESDBoQ3lBQklRd2dCa0gvL3dCcUN5SUdRZi8vQVU0RVFDQU5Rb0NBZ0lDQWdNRC8vd0NFSVExQ0FDRUJEQUVMQW40Z0JrRUFTZ1JBSUFwQ0FZWWdDMEkvaUlRaENpQUVRdi8vLy8vLy96K0RJQWF0UWpDR2hDRU1JQXRDQVlZTUFRc2dCa0dQZjB3RVFFSUFJUUVNQWdzZ0JVRkFheUFDSUFSQkFTQUdheENPQWlBRlFUQnFJQXdnRlNBR1FmQUFhaEJuSUFWQklHb2dBeUFTSUFVcEEwQWlBaUFGS1FOSUlnd1FaaUFGS1FNNElBVXBBeWhDQVlZZ0JTa0RJQ0lCUWorSWhIMGdCU2tETUNJRUlBRkNBWVlpQVZTdGZTRUtJQVFnQVgwTElRUWdCVUVRYWlBRElCSkNBMElBRUdZZ0JTQURJQkpDQlVJQUVHWWdEQ0FDSUFJZ0F5QUNRZ0dESWdFZ0JId2lBMVFnQ2lBQklBTldyWHdpQVNBU1ZpQUJJQkpSRzYxOElnSldyWHdpQkNBQ0lBSWdCRUtBZ0lDQWdJREEvLzhBVkNBRElBVXBBeEJXSUFFZ0JTa0RHQ0lFVmlBQklBUlJHM0d0ZkNJQ1ZxMThJZ1FnQWlBRVFvQ0FnSUNBZ01ELy93QlVJQU1nQlNrREFGWWdBU0FGS1FNSUlnTldJQUVnQTFFYmNhMThJZ0VnQWxTdGZDQU5oQ0VOQ3lBQUlBRTNBd0FnQUNBTk53TUlJQVZCMEFKcUpBQUx5RElERVg4SGZnRjhJd0JCRUdzaUVDUUFJd0JCb0FGcklnOGtBQ0FQSUFBMkFqd2dEeUFBTmdJVUlBOUJmellDR0NBUFFSQnFJZ0lRbWdRakFFRXdheUlPSkFBRFFBSi9JQUlvQWdRaUFDQUNLQUpvUndSQUlBSWdBRUVCYWpZQ0JDQUFMUUFBREFFTElBSVFWUXNpQlJDT0JnMEFDMEVCSVFNQ1FBSkFJQVZCSzJzT0F3QUJBQUVMUVg5QkFTQUZRUzFHR3lFRElBSW9BZ1FpQUNBQ0tBSm9Sd1JBSUFJZ0FFRUJhallDQkNBQUxRQUFJUVVNQVFzZ0FoQlZJUVVMQWtBQ1FBSkFBMEFnQmtIc0hHb3NBQUFnQlVFZ2NrWUVRQUpBSUFaQkJrc05BQ0FDS0FJRUlnQWdBaWdDYUVjRVFDQUNJQUJCQVdvMkFnUWdBQzBBQUNFRkRBRUxJQUlRVlNFRkN5QUdRUUZxSWdaQkNFY05BUXdDQ3dzZ0JrRURSd1JBSUFaQkNFWU5BU0FHUVFSSkRRSWdCa0VJUmcwQkN5QUNLUU53SWhKQ0FGa0VRQ0FDSUFJb0FnUkJBV3MyQWdRTElBWkJCRWtOQUNBU1FnQlRJUUFEUUNBQVJRUkFJQUlnQWlnQ0JFRUJhellDQkFzZ0JrRUJheUlHUVFOTERRQUxDMElBSVJJakFFRVFheUlGSkFBQ2ZpQURza01BQUlCL2xMd2lBMEgvLy8vL0IzRWlBRUdBZ0lBRWEwSC8vLy8zQjAwRVFDQUFyVUlaaGtLQWdJQ0FnSUNBd0Q5OERBRUxJQU90UWhtR1FvQ0FnSUNBZ01ELy93Q0VJQUJCZ0lDQS9BZFBEUUFhUWdBZ0FFVU5BQm9nQlNBQXJVSUFJQUJuSWdCQjBRQnFFR2NnQlNrREFDRVNJQVVwQXdoQ2dJQ0FnSUNBd0FDRlFZbi9BQ0FBYTYxQ01JYUVDeUVUSUE0Z0VqY0RBQ0FPSUJNZ0EwR0FnSUNBZUhHdFFpQ0doRGNEQ0NBRlFSQnFKQUFnRGlrRENDRVNJQTRwQXdBaEV3d0JDd0pBQWtBZ0JnMEFRUUFoQmdOQUlBWkI0TkVBYWl3QUFDQUZRU0J5UncwQkFrQWdCa0VCU3cwQUlBSW9BZ1FpQUNBQ0tBSm9Sd1JBSUFJZ0FFRUJhallDQkNBQUxRQUFJUVVNQVFzZ0FoQlZJUVVMSUFaQkFXb2lCa0VEUncwQUN3d0JDd0pBQWtBZ0JnNEVBQUVCQWdFTEFrQWdCVUV3UncwQUFuOGdBaWdDQkNJQUlBSW9BbWhIQkVBZ0FpQUFRUUZxTmdJRUlBQXRBQUFNQVFzZ0FoQlZDMEZmY1VIWUFFWUVRQ0FESVFCQkFDRURJd0JCc0FOcklnUWtBQUovQWtBZ0FpZ0NCQ0lGSUFJb0FtaEhCRUFnQWlBRlFRRnFOZ0lFSUFVdEFBQWhBd3dCQzBFQURBRUxRUUVMSVFZRFFBSkFBa0FDUUFKQUFuNENRQUpBQW44Z0JrVUVRQ0FDRUZVTUFRc2dBMEV3UndSQVFvQ0FnSUNBZ01EL1B5RVRJQU5CTGtZTkEwSUFEQVFMSUFJb0FnUWlCU0FDS0FKb1JnMEJRUUVoQ3lBQ0lBVkJBV28yQWdRZ0JTMEFBQXNoQTBFQklRWU1Cd3RCQVNFTERBUUxBbjhnQWlnQ0JDSURJQUlvQW1oSEJFQWdBaUFEUVFGcU5nSUVJQU10QUFBTUFRc2dBaEJWQ3lJRFFUQkdEUUZCQVNFTVFnQUxJUllNQVFzRFFDQVZRZ0Y5SVJWQkFTRU1BbjhnQWlnQ0JDSURJQUlvQW1oSEJFQWdBaUFEUVFGcU5nSUVJQU10QUFBTUFRc2dBaEJWQ3lJRFFUQkdEUUFMUVFFaEN3c0RRQ0FEUVNCeUlRb0NRQUpBSUFOQk1Hc2lCVUVLU1EwQUlBTkJMa1lnQ2tIaEFHdEJCa2x5UlFSQUlBTWhCZ3dGQzBFdUlRWWdBMEV1UncwQUlBd05CRUVCSVF3Z0VpRVZEQUVMSUFwQjF3QnJJQVVnQTBFNVNoc2hBd0pBSUJKQ0IxY0VRQ0FESUFkQkJIUnFJUWNNQVFzZ0VrSWNXQVJBSUFSQk1Hb2dBeEI1SUFSQklHb2dGeUFUUWdCQ2dJQ0FnSUNBd1AwL0VDNGdCRUVRYWlBRUtRTXdJQVFwQXpnZ0JDa0RJQ0lYSUFRcEF5Z2lFeEF1SUFRZ0JDa0RFQ0FFS1FNWUlCUWdGaEJ3SUFRcEF3Z2hGaUFFS1FNQUlSUU1BUXNnQTBVZ0NISU5BQ0FFUWRBQWFpQVhJQk5DQUVLQWdJQ0FnSUNBL3o4UUxpQUVRVUJySUFRcEExQWdCQ2tEV0NBVUlCWVFjQ0FFS1FOSUlSWkJBU0VJSUFRcEEwQWhGQXNnRWtJQmZDRVNRUUVoQ3dzZ0FpZ0NCQ0lESUFJb0FtaEhCSDhnQWlBRFFRRnFOZ0lFSUFNdEFBQUZJQUlRVlFzaEF3d0FDd0FMUVFBaEJnd0JDd3NDZmlBTFJRUkFBa0FnQWlrRGNFSUFVdzBBSUFJZ0FpZ0NCQ0lEUVFKck5nSUVJQXhGRFFBZ0FpQURRUU5yTmdJRUN5QUVRZUFBYWlBQXQwUUFBQUFBQUFBQUFLSVFxd0VnQkNrRFlDRVVJQVFwQTJnTUFRc2dFa0lIVndSQUlCSWhFd05BSUFkQkJIUWhCeUFUUWdGOEloTkNDRklOQUFzTEFrQUNRQUpBSUFaQlgzRkIwQUJHQkVBZ0FoQ0hCaUlUUW9DQWdJQ0FnSUNBZ0g5U0RRTWdBaWtEY0VJQVdRMEJEQUlMUWdBaEV5QUNLUU53UWdCVERRSUxJQUlnQWlnQ0JFRUJhellDQkF0Q0FDRVRDeUFIUlFSQUlBUkI4QUJxSUFDM1JBQUFBQUFBQUFBQW9oQ3JBU0FFS1FOd0lSUWdCQ2tEZUF3QkN5QVZJQklnREJ0Q0FvWWdFM3hDSUgwaUVrS3pDRmtFUUVHZzFBUkJ4QUEyQWdBZ0JFR2dBV29nQUJCNUlBUkJrQUZxSUFRcEE2QUJJQVFwQTZnQlFuOUMvLy8vLy8vL3YvLy9BQkF1SUFSQmdBRnFJQVFwQTVBQklBUXBBNWdCUW45Qy8vLy8vLy8vdi8vL0FCQXVJQVFwQTRBQklSUWdCQ2tEaUFFTUFRc2dFa0xzZFZrRVFDQUhRUUJPQkVBRFFDQUVRYUFEYWlBVUlCWkNBRUtBZ0lDQWdJREEvNzkvRUhBZ0ZDQVdRb0NBZ0lDQWdJRC9QeERwQlNFRElBUkJrQU5xSUJRZ0ZpQUVLUU9nQXlBVUlBTkJBRTRpQXhzZ0JDa0RxQU1nRmlBREd4QndJQkpDQVgwaEVpQUVLUU9ZQXlFV0lBUXBBNUFESVJRZ0IwRUJkQ0FEY2lJSFFRQk9EUUFMQ3dKK1FUVWdFa0xTQ0h3aUU2Y2lBMEVBSUFOQkFFb2JJQk5DTlZrYklnTkI4UUJQQkVBZ0JFR0FBMm9nQUJCNUlBUXBBNGdESVJVZ0JDa0RnQU1oRjBJQURBRUxJQVJCNEFKcVJBQUFBQUFBQVBBL1FaQUJJQU5yRU5vQkVLc0JJQVJCMEFKcUlBQVFlU0FFUWZBQ2FpQUVLUVBnQWlBRUtRUG9BaUFFS1FQUUFpSVhJQVFwQTlnQ0loVVFpUVlnQkNrRCtBSWhHQ0FFS1FQd0Fnc2hFeUFFUWNBQ2FpQUhJQWRCQVhGRklCUWdGa0lBUWdBUTdRRkJBRWNnQTBFZ1NYRnhJZ0JxRUlZQ0lBUkJzQUpxSUJjZ0ZTQUVLUVBBQWlBRUtRUElBaEF1SUFSQmtBSnFJQVFwQTdBQ0lBUXBBN2dDSUJNZ0dCQndJQVJCb0FKcUlCY2dGVUlBSUJRZ0FCdENBQ0FXSUFBYkVDNGdCRUdBQW1vZ0JDa0RvQUlnQkNrRHFBSWdCQ2tEa0FJZ0JDa0RtQUlRY0NBRVFmQUJhaUFFS1FPQUFpQUVLUU9JQWlBVElCZ1FnZ1FnQkNrRDhBRWlGU0FFS1FQNEFTSVRRZ0JDQUJEdEFVVUVRRUdnMUFSQnhBQTJBZ0FMSUFSQjRBRnFJQlVnRXlBU3B4Q0lCaUFFS1FQZ0FTRVVJQVFwQStnQkRBRUxRYURVQkVIRUFEWUNBQ0FFUWRBQmFpQUFFSGtnQkVIQUFXb2dCQ2tEMEFFZ0JDa0QyQUZDQUVLQWdJQ0FnSURBQUJBdUlBUkJzQUZxSUFRcEE4QUJJQVFwQThnQlFnQkNnSUNBZ0lDQXdBQVFMaUFFS1FPd0FTRVVJQVFwQTdnQkN5RVNJQTRnRkRjREVDQU9JQkkzQXhnZ0JFR3dBMm9rQUNBT0tRTVlJUklnRGlrREVDRVREQVFMSUFJcEEzQkNBRk1OQUNBQ0lBSW9BZ1JCQVdzMkFnUUxJQVVoQUNBRElRWkJBQ0VESXdCQmtNWUFheUlCSkFBQ1FBSi9BMEFnQUVFd1J3UkFBa0FnQUVFdVJ3MEVJQUlvQWdRaUFDQUNLQUpvUmcwQUlBSWdBRUVCYWpZQ0JDQUFMUUFBREFNTEJTQUNLQUlFSWdBZ0FpZ0NhRWNFZjBFQklRTWdBaUFBUVFGcU5nSUVJQUF0QUFBRlFRRWhBeUFDRUZVTElRQU1BUXNMSUFJUVZRc2hBRUVCSVFnZ0FFRXdSdzBBQTBBZ0VrSUJmU0VTQW44Z0FpZ0NCQ0lBSUFJb0FtaEhCRUFnQWlBQVFRRnFOZ0lFSUFBdEFBQU1BUXNnQWhCVkN5SUFRVEJHRFFBTFFRRWhBd3NnQVVFQU5nS1FCaUFPQW40Q1FBSkFBa0FnQUVFdVJpSUZJQUJCTUdzaURVRUpUWElFUUFOQUFrQWdCVUVCY1FSQUlBaEZCRUFnRXlFU1FRRWhDQXdDQ3lBRFJTRUZEQVFMSUJOQ0FYd2hFeUFIUWZ3UFRBUkFJQXNnRTZjZ0FFRXdSaHNoQ3lBQlFaQUdhaUFIUVFKMGFpSURJQW9FZnlBQUlBTW9BZ0JCQ214cVFUQnJCU0FOQ3pZQ0FFRUJJUU5CQUNBS1FRRnFJZ0FnQUVFSlJpSUFHeUVLSUFBZ0Iyb2hCd3dCQ3lBQVFUQkdEUUFnQVNBQktBS0FSa0VCY2pZQ2dFWkIzSThCSVFzTEFuOGdBaWdDQkNJQUlBSW9BbWhIQkVBZ0FpQUFRUUZxTmdJRUlBQXRBQUFNQVFzZ0FoQlZDeUlBUVM1R0lnVWdBRUV3YXlJTlFRcEpjZzBBQ3dzZ0VpQVRJQWdiSVJJZ0EwVWdBRUZmY1VIRkFFZHlSUVJBQWtBZ0FoQ0hCaUlVUW9DQWdJQ0FnSUNBZ0g5U0RRQkNBQ0VVSUFJcEEzQkNBRk1OQUNBQ0lBSW9BZ1JCQVdzMkFnUUxJQklnRkh3aEVnd0RDeUFEUlNFRklBQkJBRWdOQVFzZ0Fpa0RjRUlBVXcwQUlBSWdBaWdDQkVFQmF6WUNCQXNnQlVVTkFFR2cxQVJCSERZQ0FDQUNFSm9FUWdBaEUwSUFEQUVMSUFFb0FwQUdJZ0JGQkVBZ0FTQUd0MFFBQUFBQUFBQUFBS0lRcXdFZ0FTa0RBQ0VUSUFFcEF3Z01BUXNnRWlBVFVpQVRRZ2xWY2tVRVFDQUJRVEJxSUFZUWVTQUJRU0JxSUFBUWhnSWdBVUVRYWlBQktRTXdJQUVwQXpnZ0FTa0RJQ0FCS1FNb0VDNGdBU2tERUNFVElBRXBBeGdNQVFzZ0VrS2FCRmtFUUVHZzFBUkJ4QUEyQWdBZ0FVSGdBR29nQmhCNUlBRkIwQUJxSUFFcEEyQWdBU2tEYUVKL1F2Ly8vLy8vLzcvLy93QVFMaUFCUVVCcklBRXBBMUFnQVNrRFdFSi9Rdi8vLy8vLy83Ly8vd0FRTGlBQktRTkFJUk1nQVNrRFNBd0JDeUFTUXV0MVZ3UkFRYURVQkVIRUFEWUNBQ0FCUVpBQmFpQUdFSGtnQVVHQUFXb2dBU2tEa0FFZ0FTa0RtQUZDQUVLQWdJQ0FnSURBQUJBdUlBRkI4QUJxSUFFcEE0QUJJQUVwQTRnQlFnQkNnSUNBZ0lDQXdBQVFMaUFCS1FOd0lSTWdBU2tEZUF3QkN5QUtCRUFnQ2tFSVRBUkFJQUZCa0FacUlBZEJBblJxSWdBb0FnQWhDUU5BSUFsQkNtd2hDU0FLUVFGcUlncEJDVWNOQUFzZ0FDQUpOZ0lBQ3lBSFFRRnFJUWNMQWtBZ0N5QVNweUlJU2lBTFFRaEtjaUFJUVJGS2NnMEFJQWhCQ1VZRVFDQUJRY0FCYWlBR0VIa2dBVUd3QVdvZ0FTZ0NrQVlRaGdJZ0FVR2dBV29nQVNrRHdBRWdBU2tEeUFFZ0FTa0RzQUVnQVNrRHVBRVFMaUFCS1FPZ0FTRVRJQUVwQTZnQkRBSUxJQWhCQ0V3RVFDQUJRWkFDYWlBR0VIa2dBVUdBQW1vZ0FTZ0NrQVlRaGdJZ0FVSHdBV29nQVNrRGtBSWdBU2tEbUFJZ0FTa0RnQUlnQVNrRGlBSVFMaUFCUWVBQmFrRUFJQWhyUVFKMFFlREJCR29vQWdBUWVTQUJRZEFCYWlBQktRUHdBU0FCS1FQNEFTQUJLUVBnQVNBQktRUG9BUkRqQlNBQktRUFFBU0VUSUFFcEE5Z0JEQUlMSUFoQkVVNUJBQ0FCS0FLUUJpSUFJQWhCZld4QjBBQnFkaHNOQUNBQlFlQUNhaUFHRUhrZ0FVSFFBbW9nQUJDR0FpQUJRY0FDYWlBQktRUGdBaUFCS1FQb0FpQUJLUVBRQWlBQktRUFlBaEF1SUFGQnNBSnFJQWhCQW5SQm1NRUVhaWdDQUJCNUlBRkJvQUpxSUFFcEE4QUNJQUVwQThnQ0lBRXBBN0FDSUFFcEE3Z0NFQzRnQVNrRG9BSWhFeUFCS1FPb0Fnd0JDd05BSUFGQmtBWnFJQWNpQUVFQmF5SUhRUUowYWlnQ0FFVU5BQXNDUUNBSVFRbHZJZ05GQkVCQkFDRUtRUUFoQlF3QkMwRUFJUW9nQTBFSmFpQURJQWhCQUVnYklRUUNRQ0FBUlFSQVFRQWhCVUVBSVFBTUFRdEJnSlRyM0FOQkFDQUVhMEVDZEVIZ3dRUnFLQUlBSWd0dElReEJBQ0VOUVFBaENVRUFJUVVEUUNBQlFaQUdhaUFKUVFKMGFpSURJQTBnQXlnQ0FDSUNJQXR1SWdkcUlnTTJBZ0FnQlVFQmFrSC9EM0VnQlNBRFJTQUZJQWxHY1NJREd5RUZJQWhCQ1dzZ0NDQURHeUVJSUF3Z0FpQUhJQXRzYTJ3aERTQUpRUUZxSWdrZ0FFY05BQXNnRFVVTkFDQUJRWkFHYWlBQVFRSjBhaUFOTmdJQUlBQkJBV29oQUFzZ0NDQUVhMEVKYWlFSUN3TkFJQUZCa0FacUlBVkJBblJxSVF3Z0NFRWtTQ0VDQWtBRFFBSkFJQUlOQUNBSVFTUkhEUUlnRENnQ0FFSFE2ZmtFVFEwQVFTUWhDQXdDQ3lBQVFmOFBhaUVIUVFBaERTQUFJUU1EUUNBRElRQWdEYTBnQVVHUUJtb2dCMEgvRDNFaUMwRUNkR29pQXpVQ0FFSWRobndpRWtLQmxPdmNBMVFFZjBFQUJTQVNRb0NVNjl3RGdDSVRRb0RzbEtOOGZpQVNmQ0VTSUJPbkN5RU5JQU1nRXFjaUF6WUNBQ0FBSUFBZ0FDQUxJQU1iSUFVZ0MwWWJJQXNnQUVFQmEwSC9EM0ZIR3lFRElBdEJBV3NoQnlBRklBdEhEUUFMSUFwQkhXc2hDaUFOUlEwQUN5QURJQVZCQVd0Qi93OXhJZ1ZHQkVBZ0FVR1FCbW9pQnlBRFFmNFBha0gvRDNGQkFuUnFJZ0FnQUNnQ0FDQUhJQU5CQVd0Qi93OXhJZ0JCQW5ScUtBSUFjallDQUFzZ0NFRUphaUVJSUFGQmtBWnFJQVZCQW5ScUlBMDJBZ0FNQVFzTEFrQURRQ0FBUVFGcVFmOFBjU0VISUFGQmtBWnFJQUJCQVd0Qi93OXhRUUowYWlFTkEwQkJDVUVCSUFoQkxVb2JJUkVDUUFOQUlBVWhBMEVBSVFrQ1FBTkFBa0FnQXlBSmFrSC9EM0VpQlNBQVJnMEFJQUZCa0FacUlBVkJBblJxS0FJQUlnSWdDVUVDZEVHd3dRUnFLQUlBSWdWSkRRQWdBaUFGU3cwQ0lBbEJBV29pQ1VFRVJ3MEJDd3NnQ0VFa1J3MEFRZ0FoRWtFQUlRbENBQ0VUQTBBZ0FDQURJQWxxUWY4UGNTSUZSZ1JBSUFCQkFXcEIvdzl4SWdCQkFuUWdBV3BCQURZQ2pBWUxJQUZCZ0FacUlBRkJrQVpxSUFWQkFuUnFLQUlBRUlZQ0lBRkI4QVZxSUJJZ0UwSUFRb0NBZ0lEbG1yZU93QUFRTGlBQlFlQUZhaUFCS1FQd0JTQUJLUVA0QlNBQktRT0FCaUFCS1FPSUJoQndJQUVwQStnRklSTWdBU2tENEFVaEVpQUpRUUZxSWdsQkJFY05BQXNnQVVIUUJXb2dCaEI1SUFGQndBVnFJQklnRXlBQktRUFFCU0FCS1FQWUJSQXVJQUVwQThnRklSTkNBQ0VTSUFFcEE4QUZJUlJCTlNBS1FhTUphaUlDUVFBZ0FrRUFTaHNnQ2tHU2QwNGJJZ3hCOEFCTkRRSU1CUXNnQ2lBUmFpRUtJQUFoQlNBQUlBTkdEUUFMUVlDVTY5d0RJQkYySVFSQmZ5QVJkRUYvY3lFTFFRQWhDU0FESVFVRFFDQUJRWkFHYWlBRFFRSjBhaUlDSUFrZ0FpZ0NBQ0lNSUJGMmFpSUNOZ0lBSUFWQkFXcEIvdzl4SUFVZ0FrVWdBeUFGUm5FaUFoc2hCU0FJUVFscklBZ2dBaHNoQ0NBTElBeHhJQVJzSVFrZ0EwRUJha0gvRDNFaUF5QUFSdzBBQ3lBSlJRMEJJQVVnQjBjRVFDQUJRWkFHYWlBQVFRSjBhaUFKTmdJQUlBY2hBQXdEQ3lBTklBMG9BZ0JCQVhJMkFnQU1BUXNMQ3lBQlFaQUZha1FBQUFBQUFBRHdQMEhoQVNBTWF4RGFBUkNyQVNBQlFiQUZhaUFCS1FPUUJTQUJLUU9ZQlNBVUlCTVFpUVlnQVNrRHVBVWhGeUFCS1FPd0JTRVdJQUZCZ0FWcVJBQUFBQUFBQVBBL1FmRUFJQXhyRU5vQkVLc0JJQUZCb0FWcUlCUWdFeUFCS1FPQUJTQUJLUU9JQlJENEJTQUJRZkFFYWlBVUlCTWdBU2tEb0FVaUVpQUJLUU9vQlNJVkVJSUVJQUZCNEFScUlCWWdGeUFCS1FQd0JDQUJLUVA0QkJCd0lBRXBBK2dFSVJNZ0FTa0Q0QVFoRkFzZ0NrSHhBR29oQndKQUlBTkJCR3BCL3c5eElnVWdBRVlOQUFKQUlBRkJrQVpxSUFWQkFuUnFLQUlBSWdWQi84bTE3Z0ZOQkVBZ0JVVWdBMEVGYWtIL0QzRWdBRVp4RFFFZ0FVSHdBMm9nQnJkRUFBQUFBQUFBMEQraUVLc0JJQUZCNEFOcUlCSWdGU0FCS1FQd0F5QUJLUVA0QXhCd0lBRXBBK2dESVJVZ0FTa0Q0QU1oRWd3QkN5QUZRWURLdGU0QlJ3UkFJQUZCMEFScUlBYTNSQUFBQUFBQUFPZy9vaENyQVNBQlFjQUVhaUFTSUJVZ0FTa0QwQVFnQVNrRDJBUVFjQ0FCS1FQSUJDRVZJQUVwQThBRUlSSU1BUXNnQnJjaEdTQUFJQU5CQldwQi93OXhSZ1JBSUFGQmtBUnFJQmxFQUFBQUFBQUE0RCtpRUtzQklBRkJnQVJxSUJJZ0ZTQUJLUU9RQkNBQktRT1lCQkJ3SUFFcEE0Z0VJUlVnQVNrRGdBUWhFZ3dCQ3lBQlFiQUVhaUFaUkFBQUFBQUFBT2cvb2hDckFTQUJRYUFFYWlBU0lCVWdBU2tEc0FRZ0FTa0R1QVFRY0NBQktRT29CQ0VWSUFFcEE2QUVJUklMSUF4Qjd3QkxEUUFnQVVIUUEyb2dFaUFWUWdCQ2dJQ0FnSUNBd1A4L0VQZ0ZJQUVwQTlBRElBRXBBOWdEUWdCQ0FCRHRBUTBBSUFGQndBTnFJQklnRlVJQVFvQ0FnSUNBZ01EL1B4QndJQUVwQThnRElSVWdBU2tEd0FNaEVnc2dBVUd3QTJvZ0ZDQVRJQklnRlJCd0lBRkJvQU5xSUFFcEE3QURJQUVwQTdnRElCWWdGeENDQkNBQktRT29BeUVUSUFFcEE2QURJUlFDUUNBSFFmei8vLzhIY1VIOEIwa0VRQ0FLSVFBTUFRc2dBU0FUUXYvLy8vLy8vLy8vL3dDRE53T1lBeUFCSUJRM0E1QURJQUZCZ0FOcUlCUWdFMElBUW9DQWdJQ0FnSUQvUHhBdUlBRXBBNUFESUFFcEE1Z0RRb0NBZ0lDQWdJQzR3QUFRNlFVaEFDQUJLUU9JQXlBVElBQkJBRTRpQlJzaEV5QUJLUU9BQXlBVUlBVWJJUlFnRWlBVlFnQkNBQkR0QVNFRElBVWdDbW9pQUVHUEIwd0VRQ0FEUVFCSElBcEJrbmRJSWdNZ0FpQU1SM0VnQXlBRkczRkZEUUVMUWFEVUJFSEVBRFlDQUFzZ0FVSHdBbW9nRkNBVElBQVFpQVlnQVNrRDhBSWhFeUFCS1FQNEFnczNBeWdnRGlBVE53TWdJQUZCa01ZQWFpUUFJQTRwQXlnaEVpQU9LUU1nSVJNTUFnc2dBaWtEY0VJQVdRUkFJQUlnQWlnQ0JFRUJhellDQkF0Qm9OUUVRUncyQWdBZ0FoQ2FCQXdCQ3dKQUFuOGdBaWdDQkNJQUlBSW9BbWhIQkVBZ0FpQUFRUUZxTmdJRUlBQXRBQUFNQVFzZ0FoQlZDMEVvUmdSQVFRRWhCZ3dCQzBLQWdJQ0FnSURnLy84QUlSSWdBaWtEY0VJQVV3MEJJQUlnQWlnQ0JFRUJhellDQkF3QkN3TkFBbjhnQWlnQ0JDSUFJQUlvQW1oSEJFQWdBaUFBUVFGcU5nSUVJQUF0QUFBTUFRc2dBaEJWQ3lJQVFUQnJRUXBKSUFCQndRQnJRUnBKY2lBQVFkOEFSbkpGSUFCQjRRQnJRUnBQY1VVRVFDQUdRUUZxSVFZTUFRc0xRb0NBZ0lDQWdPRC8vd0FoRWlBQVFTbEdEUUFnQWlrRGNDSVZRZ0JaQkVBZ0FpQUNLQUlFUVFGck5nSUVDeUFHUlEwQUEwQWdCa0VCYXlFR0lCVkNBRmtFUUNBQ0lBSW9BZ1JCQVdzMkFnUUxJQVlOQUFzTElBOGdFemNEQUNBUElCSTNBd2dnRGtFd2FpUUFJQThwQXdBaEVpQVFJQThwQXdnM0F3Z2dFQ0FTTndNQUlBOUJvQUZxSkFBZ0VDa0RBQ0FRS1FNSUVMOEZJUmtnRUVFUWFpUUFJQmtMMFFFQkFYOENRQUpBSUFBZ0FYTkJBM0VFUUNBQkxRQUFJUUlNQVFzZ0FVRURjUVJBQTBBZ0FDQUJMUUFBSWdJNkFBQWdBa1VOQXlBQVFRRnFJUUFnQVVFQmFpSUJRUU54RFFBTEN5QUJLQUlBSWdKQmYzTWdBa0dCZ29RSWEzRkJnSUdDaEhoeERRQURRQ0FBSUFJMkFnQWdBU2dDQkNFQ0lBQkJCR29oQUNBQlFRUnFJUUVnQWtHQmdvUUlheUFDUVg5emNVR0FnWUtFZUhGRkRRQUxDeUFBSUFJNkFBQWdBa0gvQVhGRkRRQURRQ0FBSUFFdEFBRWlBam9BQVNBQVFRRnFJUUFnQVVFQmFpRUJJQUlOQUFzTEMvVUJBZ0YvQVg0akFFSFFBR3NpQXlRQUFrQUNmaUFCUVFCSUJFQWdBeUFCUWYvLy8vOEhjVFlDQUNBRFFSQnFJZ0ZCd0FCQjNDSWdBeEJPR2lBQUlBRVFZZ3dCQ3lBQUtBSVFJZ0FvQWl3Z0FVME5BUUpBQWtBZ0FDZ0NPQ0lBSUFGQkFuUnFLQUlBSWdFcEFnUWlCRUtBZ0lDQWdJQ0FnRUNEUW9DQWdJQ0FnSUNBd0FCUkRRQWdBa1VOQVNBRXAwR0FnSUNBZUVjTkFDQUFLQUs4QVNFQkN5QUJJQUVvQWdCQkFXbzJBZ0FnQWExQ2dJQ0FnSkIvaEF3QkN5QUJJQUVvQWdCQkFXbzJBZ0FnQWExQ2dJQ0FnSUIvaEFzaEJDQURRZEFBYWlRQUlBUVBDMEh2M3dCQnJ2d0FRWmdZUVlmaUFCQUFBQXZyQWdFQ2Z5QUFJQUVvQWdRUUV3TkFJQUVvQWhBaEF5QUNJQUVvQWhST1JRUkFJQUFnQXlBQ1FRTjBhaWdDQUJBVElBSkJBV29oQWd3QkN3c2dBQ2dDRUNJQ1FSQnFJQU1nQWlnQ0JCRUFBRUVBSVFJRFFBSkFJQUVvQWh3aEF5QUNJQUVvQWlCT0RRQWdBeUFDUVJSc2FpSURLQUlJUlFSQUlBQW9BaEFnQXlnQ0JCRHJBUXNnQUNBREtBSVFFQk1nQUNBREtBSU1FQk1nQWtFQmFpRUNEQUVMQ3lBQUtBSVFJZ0pCRUdvZ0F5QUNLQUlFRVFBQUlBQW9BaEFpQWtFUWFpQUJLQUlvSUFJb0FnUVJBQUJCQUNFQ0EwQWdBU2dDTkNFRElBSWdBU2dDT0U1RkJFQWdBQ0FESUFKQkRHeHFLQUlFRUJNZ0FrRUJhaUVDREFFTEN5QUFLQUlRSWdKQkVHb2dBeUFDS0FJRUVRQUFJQUFnQVNrRFFCQVBJQUFnQVNrRFNCQVBJQUFnQVNrRFlCQVBJQUFnQVNrRGFCQVBJQUVvQWdnaUFpQUJLQUlNSWdNMkFnUWdBeUFDTmdJQUlBRkNBRGNDQ0NBQUtBSVFJZ0JCRUdvZ0FTQUFLQUlFRVFBQUN6QUJBWDhnQUNnQ09DQUJRUUowYWlnQ0FDSUJJQUVvQWdBaUFrRUJhellDQUNBQ1FRRk1CRUFnQUNBQkVLSURDd3ZBQVFJQmZ3SitRWDhoQXdKQUlBQkNBRklnQVVMLy8vLy8vLy8vLy84QWd5SUVRb0NBZ0lDQWdNRC8vd0JXSUFSQ2dJQ0FnSUNBd1AvL0FGRWJEUUFnQWtMLy8vLy8vLy8vLy84QWd5SUZRb0NBZ0lDQWdNRC8vd0JXSUFWQ2dJQ0FnSUNBd1AvL0FGSnhEUUFnQUNBRUlBV0VoRkFFUUVFQUR3c2dBU0FDZzBJQVdRUkFJQUVnQWxJZ0FTQUNVM0VOQVNBQUlBRWdBb1dFUWdCU0R3c2dBRUlBVWlBQklBSlZJQUVnQWxFYkRRQWdBQ0FCSUFLRmhFSUFVaUVEQ3lBREN3b0FJQUJCZkhFUXBBTUxaUUVFZndOQUlBSWdCVW9FUUNBQklBVnFJZ1l0QUFBaUJFRVBhaUFFSUFSQnN3RkxHeUFFSUFNYlFRSjBJZ1JCZ0xnQmFpMEFBQ0VISUFSQmc3Z0JhaTBBQUVFWGEwSC9BWEZCQkUwRVFDQUFJQVlvQUFFUTdBRUxJQVVnQjJvaEJRd0JDd3NMY0FBQ1FBSkFBa0FDUUFKQUlBSkJCSFpCQTNGQkFXc09Bd0FCQWdNTElBRW9BZ0FpQWdSQUlBQWdBcTFDZ0lDQWdIQ0VFQ01MSUFFb0FnUWlBVVVOQXlBQUlBR3RRb0NBZ0lCd2hCQWpEd3NnQUNBQktBSUFFT3NCRHdzZ0FTZ0NBQkRxQlE4TElBQWdBU2tEQUJBakN3dkpCZ0VGZndKQUFrQUNRQUpBQWtBQ1FBSkFJQUV0QUFSQkQzRU9BZ0FCQlFzZ0FTQUJMUUFGUVFKeU9nQUZJQUVvQWhBaUJFRXdhaUVEQTBBZ0FTZ0NGQ0VGSUFJZ0JDZ0NJRTVGQkVBZ0FDQUZJQUpCQTNScUlBTW9BZ0JCR25ZUTdBVWdBa0VCYWlFQ0lBTkJDR29oQXd3QkN3c2dBRUVRYWlJR0lBVWdBQ2dDQkJFQUFDQUFJQVFRa1FJZ0FVSUFOd01RSUFFb0FoZ2lBZ1JBSUFJaEF3TkFJQU1FUUNBREtBSUlLQUlBUlEwRklBTW9BZ1FOQkNBREtBSVlJZ1FnQXlnQ0hDSUZOZ0lFSUFVZ0JEWUNBQ0FEUWdBM0FoZ2dBeWdDRUNJRUlBTW9BaFFpQlRZQ0JDQUZJQVEyQWdBZ0EwSUFOd0lRSUFNb0Fnd2hBd3dCQ3dzRFFDQUNCRUFnQWlnQ0RDRURJQUFnQWlrREtCQWpJQVlnQWlBQUtBSUVFUUFBSUFNaEFnd0JDd3NnQVVFQU5nSVlDeUFBS0FKRUlBRXZBUVpCR0d4cUtBSUlJZ0lFUUNBQUlBR3RRb0NBZ0lCd2hDQUNFUXdBQ3lBQlFnQTNBeUFnQVVFQU93RUdJQUZCQURZQ0tDQUJLQUlJSWdJZ0FTZ0NEQ0lETmdJRUlBTWdBallDQUNBQlFnQTNBZ2dnQUMwQWFFRUNSdzBESUFFb0FnQkZEUU1NQlFzZ0FDQUJLQUlVSUFFb0FoaEJBUkRyQlFKQUlBRW9BaUJGRFFBRFFDQUNJQUV2QVNvZ0FTOEJLR3BQRFFFZ0FDQUJLQUlnSUFKQkJIUnFLQUlBRU93QklBSkJBV29oQWd3QUN3QUxRUUFoQWdOQUlBRW9BamdnQWt3RVFFRUFJUUlEUUNBQ0lBRW9BanhPUlFSQUlBQWdBU2dDSkNBQ1FRTjBhaWdDQkJEc0FTQUNRUUZxSVFJTUFRc0xJQUVvQWpBaUFnUkFJQUlRcEFNTElBQWdBU2dDSEJEc0FTQUJMUUFTUVFSeEJFQWdBQ0FCS0FKQUVPd0JJQUJCRUdvaUFpQUJLQUpRSUFBb0FnUVJBQUFnQWlBQktBSlVJQUFvQWdRUkFBQUxJQUVvQWdnaUFpQUJLQUlNSWdNMkFnUWdBeUFDTmdJQUlBRkNBRGNDQ0FKQUlBQXRBR2hCQWtjTkFDQUJLQUlBUlEwQURBY0xJQUJCRUdvZ0FTQUFLQUlFRVFBQUR3VWdBQ0FCS0FJMElBSkJBM1JxS1FNQUVDTWdBa0VCYWlFQ0RBRUxBQXNBQzBIaEhFR3UvQUJCMXVVQ1FaYmVBQkFBQUF0QjRkY0FRYTc4QUVIVjVRSkJsdDRBRUFBQUN5QUdJQUVnQUNnQ0JCRUFBQThMRUFFQUN5QUFLQUpZSWdJZ0FVRUlhaUlETmdJRUlBRWdBRUhZQUdvMkFnd2dBU0FDTmdJSUlBQWdBellDV0F0Y0FRUi9JQUVoQXdKQUEwQWdBaUFEVFNBRVFRUkxjZzBCSUFNc0FBQWlCa0gvQUhFZ0JFRUhiSFFnQlhJaEJTQUVRUUZxSVFRZ0EwRUJhaUVESUFaQkFFZ05BQXNnQUNBRk5nSUFJQU1nQVdzUEN5QUFRUUEyQWdCQmZ3dkhBd0VDZnlBQUtBSVFJZ01vQWhSQk1Hb2dBeWdDYkVzRVFDQURFS0lGSUFNZ0F5Z0NGQ0lEUVFGMklBTnFOZ0pzQ3dKQUlBQkJNQkFwSWdNRVFDQURRUUEyQWlBZ0EwRUFOZ0lZSUFOQkFUb0FCU0FESUFJN0FRWWdBeUFCTmdJUUlBTWdBQ0FCS0FJY1FRTjBFQ2tpQkRZQ0ZDQUVEUUVnQUNnQ0VDSUNRUkJxSUFNZ0FpZ0NCQkVBQUFzZ0FDZ0NFQ0FCRUpFQ1FvQ0FnSURnQUE4TEFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQ1FRRnJEaVFIQUFZRUJBUUVBZ1lFQmdFR0JnWUdCZ1VHQmdJQ0FnSUNBZ0lDQWdJQ0F3UUVCZ1FHQ3lBRFFnQTNBeUFnQTBFQU5nSW9JQU1nQXkwQUJVRU1jam9BQlNBQklBQW9BaVJIQkg4Z0FDQURRVEJCQ2hCNkJTQUVDMElBTndNQURBWUxJQVJDZ0lDQWdEQTNBd0FNQlFzZ0EwSUFOd0lrSUFNZ0F5MEFCVUVNY2pvQUJRd0VDeUFEUWdBM0FpUU1Bd3NnQTBLQWdJQ0FNRGNESUF3QkN5QURRZ0EzQXlBTElBQW9BaEFvQWtRZ0FrRVliR29vQWhSRkRRQWdBeUFETFFBRlFRUnlPZ0FGQ3lBRFFRRTJBZ0FnQUNnQ0VDRUFJQU5CQURvQUJDQUFLQUpRSWdFZ0EwRUlhaUlDTmdJRUlBTWdBRUhRQUdvMkFnd2dBeUFCTmdJSUlBQWdBallDVUNBRHJVS0FnSUNBY0lRTGdRRUNBWDRCZnlNQVFZQUNheUlHSkFBZ0JrR0FBaUFDSUFNUXl3SWFBa0FnQUNBQUlBRkJBM1JxS1FOWVFRTVFTU0lGUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJDZ0lDQWdDQWhCUXdCQ3lBQUlBVkJNeUFBSUFZUVlrRURFQmthQ3lBRUJFQWdBQ0FGUVFCQkFFRUFFTW9DQ3lBQUlBVVFpZ0VnQmtHQUFtb2tBQXNOQUNBQUlBRWdBUkEvRUlFREM2b0xBUVovSUFBZ0FXb2hCUUpBQWtBZ0FDZ0NCQ0lDUVFGeERRQWdBa0VEY1VVTkFTQUFLQUlBSWdJZ0FXb2hBUUpBSUFBZ0Ftc2lBRUhFMEFRb0FnQkhCRUFnQWtIL0FVMEVRQ0FDUVFOMklRSWdBQ2dDQ0NJRUlBQW9BZ3dpQTBjTkFrR3cwQVJCc05BRUtBSUFRWDRnQW5keE5nSUFEQU1MSUFBb0FoZ2hCZ0pBSUFBZ0FDZ0NEQ0lDUndSQVFjRFFCQ2dDQUJvZ0FDZ0NDQ0lESUFJMkFnd2dBaUFETmdJSURBRUxBa0FnQUVFVWFpSUVLQUlBSWdNTkFDQUFRUkJxSWdRb0FnQWlBdzBBUVFBaEFnd0JDd05BSUFRaEJ5QURJZ0pCRkdvaUJDZ0NBQ0lERFFBZ0FrRVFhaUVFSUFJb0FoQWlBdzBBQ3lBSFFRQTJBZ0FMSUFaRkRRSUNRQ0FBS0FJY0lnUkJBblJCNE5JRWFpSURLQUlBSUFCR0JFQWdBeUFDTmdJQUlBSU5BVUcwMEFSQnROQUVLQUlBUVg0Z0JIZHhOZ0lBREFRTElBWkJFRUVVSUFZb0FoQWdBRVliYWlBQ05nSUFJQUpGRFFNTElBSWdCallDR0NBQUtBSVFJZ01FUUNBQ0lBTTJBaEFnQXlBQ05nSVlDeUFBS0FJVUlnTkZEUUlnQWlBRE5nSVVJQU1nQWpZQ0dBd0NDeUFGS0FJRUlnSkJBM0ZCQTBjTkFVRzQwQVFnQVRZQ0FDQUZJQUpCZm5FMkFnUWdBQ0FCUVFGeU5nSUVJQVVnQVRZQ0FBOExJQVFnQXpZQ0RDQURJQVEyQWdnTEFrQWdCU2dDQkNJQ1FRSnhSUVJBUWNqUUJDZ0NBQ0FGUmdSQVFjalFCQ0FBTmdJQVFielFCRUc4MEFRb0FnQWdBV29pQVRZQ0FDQUFJQUZCQVhJMkFnUWdBRUhFMEFRb0FnQkhEUU5CdU5BRVFRQTJBZ0JCeE5BRVFRQTJBZ0FQQzBIRTBBUW9BZ0FnQlVZRVFFSEUwQVFnQURZQ0FFRzQwQVJCdU5BRUtBSUFJQUZxSWdFMkFnQWdBQ0FCUVFGeU5nSUVJQUFnQVdvZ0FUWUNBQThMSUFKQmVIRWdBV29oQVFKQUlBSkIvd0ZOQkVBZ0FrRURkaUVDSUFVb0Fnd2lBeUFGS0FJSUlnUkdCRUJCc05BRVFiRFFCQ2dDQUVGK0lBSjNjVFlDQUF3Q0N5QUVJQU0yQWd3Z0F5QUVOZ0lJREFFTElBVW9BaGdoQmdKQUlBVWdCU2dDRENJQ1J3UkFRY0RRQkNnQ0FCb2dCU2dDQ0NJRElBSTJBZ3dnQWlBRE5nSUlEQUVMQWtBZ0JVRVVhaUlES0FJQUlnUU5BQ0FGUVJCcUlnTW9BZ0FpQkEwQVFRQWhBZ3dCQ3dOQUlBTWhCeUFFSWdKQkZHb2lBeWdDQUNJRURRQWdBa0VRYWlFRElBSW9BaEFpQkEwQUN5QUhRUUEyQWdBTElBWkZEUUFDUUNBRktBSWNJZ1JCQW5SQjROSUVhaUlES0FJQUlBVkdCRUFnQXlBQ05nSUFJQUlOQVVHMDBBUkJ0TkFFS0FJQVFYNGdCSGR4TmdJQURBSUxJQVpCRUVFVUlBWW9BaEFnQlVZYmFpQUNOZ0lBSUFKRkRRRUxJQUlnQmpZQ0dDQUZLQUlRSWdNRVFDQUNJQU0yQWhBZ0F5QUNOZ0lZQ3lBRktBSVVJZ05GRFFBZ0FpQUROZ0lVSUFNZ0FqWUNHQXNnQUNBQlFRRnlOZ0lFSUFBZ0FXb2dBVFlDQUNBQVFjVFFCQ2dDQUVjTkFVRzQwQVFnQVRZQ0FBOExJQVVnQWtGK2NUWUNCQ0FBSUFGQkFYSTJBZ1FnQUNBQmFpQUJOZ0lBQ3lBQlFmOEJUUVJBSUFGQmVIRkIyTkFFYWlFQ0FuOUJzTkFFS0FJQUlnTkJBU0FCUVFOMmRDSUJjVVVFUUVHdzBBUWdBU0FEY2pZQ0FDQUNEQUVMSUFJb0FnZ0xJUUVnQWlBQU5nSUlJQUVnQURZQ0RDQUFJQUkyQWd3Z0FDQUJOZ0lJRHd0Qkh5RUVJQUZCLy8vL0IwMEVRQ0FCUVNZZ0FVRUlkbWNpQW10MlFRRnhJQUpCQVhSclFUNXFJUVFMSUFBZ0JEWUNIQ0FBUWdBM0FoQWdCRUVDZEVIZzBnUnFJUWNDUUFKQVFiVFFCQ2dDQUNJRFFRRWdCSFFpQW5GRkJFQkJ0TkFFSUFJZ0EzSTJBZ0FnQnlBQU5nSUFJQUFnQnpZQ0dBd0JDeUFCUVJrZ0JFRUJkbXRCQUNBRVFSOUhHM1FoQkNBSEtBSUFJUUlEUUNBQ0lnTW9BZ1JCZUhFZ0FVWU5BaUFFUVIxMklRSWdCRUVCZENFRUlBTWdBa0VFY1dvaUIwRVFhaWdDQUNJQ0RRQUxJQWNnQURZQ0VDQUFJQU0yQWhnTElBQWdBRFlDRENBQUlBQTJBZ2dQQ3lBREtBSUlJZ0VnQURZQ0RDQURJQUEyQWdnZ0FFRUFOZ0lZSUFBZ0F6WUNEQ0FBSUFFMkFnZ0xDLzhIQVF4L0lBQkZCRUFnQVJDeEFROExBa0FnQVVHL2Ywc05BQUovUVJBZ0FVRUxha0Y0Y1NBQlFRdEpHeUVGSUFCQkNHc2lCQ2dDQkNJSVFYaHhJUUlDUUNBSVFRTnhSUVJBUVFBZ0JVR0FBa2tOQWhvZ0JVRUVhaUFDVFFSQUlBUWhBeUFDSUFWclFaRFVCQ2dDQUVFQmRFME5BZ3RCQUF3Q0N5QUNJQVJxSVFZQ1FDQUNJQVZQQkVBZ0FpQUZheUlEUVJCSkRRRWdCQ0FJUVFGeElBVnlRUUp5TmdJRUlBUWdCV29pQWlBRFFRTnlOZ0lFSUFZZ0JpZ0NCRUVCY2pZQ0JDQUNJQU1ROGdVTUFRdEJ5TkFFS0FJQUlBWkdCRUJCdk5BRUtBSUFJQUpxSWdJZ0JVME5BaUFFSUFoQkFYRWdCWEpCQW5JMkFnUWdCQ0FGYWlJRElBSWdCV3NpQWtFQmNqWUNCRUc4MEFRZ0FqWUNBRUhJMEFRZ0F6WUNBQXdCQzBIRTBBUW9BZ0FnQmtZRVFFRzQwQVFvQWdBZ0Ftb2lBaUFGU1EwQ0FrQWdBaUFGYXlJRFFSQlBCRUFnQkNBSVFRRnhJQVZ5UVFKeU5nSUVJQVFnQldvaUJ5QURRUUZ5TmdJRUlBSWdCR29pQWlBRE5nSUFJQUlnQWlnQ0JFRitjVFlDQkF3QkN5QUVJQWhCQVhFZ0FuSkJBbkkyQWdRZ0FpQUVhaUlESUFNb0FnUkJBWEkyQWdSQkFDRURDMEhFMEFRZ0J6WUNBRUc0MEFRZ0F6WUNBQXdCQ3lBR0tBSUVJZ2RCQW5FTkFTQUhRWGh4SUFKcUlna2dCVWtOQVNBSklBVnJJUXNDUUNBSFFmOEJUUVJBSUFZb0Fnd2lBeUFHS0FJSUlnSkdCRUJCc05BRVFiRFFCQ2dDQUVGK0lBZEJBM1ozY1RZQ0FBd0NDeUFDSUFNMkFnd2dBeUFDTmdJSURBRUxJQVlvQWhnaENnSkFJQVlnQmlnQ0RDSUNSd1JBUWNEUUJDZ0NBQm9nQmlnQ0NDSURJQUkyQWd3Z0FpQUROZ0lJREFFTEFrQWdCa0VVYWlJSEtBSUFJZ01OQUNBR1FSQnFJZ2NvQWdBaUF3MEFRUUFoQWd3QkN3TkFJQWNoRENBRElnSkJGR29pQnlnQ0FDSUREUUFnQWtFUWFpRUhJQUlvQWhBaUF3MEFDeUFNUVFBMkFnQUxJQXBGRFFBQ1FDQUdLQUljSWdOQkFuUkI0TklFYWlJSEtBSUFJQVpHQkVBZ0J5QUNOZ0lBSUFJTkFVRzAwQVJCdE5BRUtBSUFRWDRnQTNkeE5nSUFEQUlMSUFwQkVFRVVJQW9vQWhBZ0JrWWJhaUFDTmdJQUlBSkZEUUVMSUFJZ0NqWUNHQ0FHS0FJUUlnTUVRQ0FDSUFNMkFoQWdBeUFDTmdJWUN5QUdLQUlVSWdORkRRQWdBaUFETmdJVUlBTWdBallDR0FzZ0MwRVBUUVJBSUFRZ0NFRUJjU0FKY2tFQ2NqWUNCQ0FFSUFscUlnTWdBeWdDQkVFQmNqWUNCQXdCQ3lBRUlBaEJBWEVnQlhKQkFuSTJBZ1FnQkNBRmFpSURJQXRCQTNJMkFnUWdCQ0FKYWlJQ0lBSW9BZ1JCQVhJMkFnUWdBeUFMRVBJRkN5QUVJUU1MSUFNTElnTUVRQ0FEUVFocUR3c2dBUkN4QVNJRFJRMEFJQU1nQUVGOFFYZ2dBRUVFYXlnQ0FDSUVRUU54R3lBRVFYaHhhaUlFSUFFZ0FTQUVTeHNRSHhvZ0FCQ2JBU0FESVEwTElBMExNUUFnQkVFQ2NRUkFRYlNHQVVHdS9BQkJ2SWNDUWFNNEVBQUFDeUFBSUFBcEE4QUJJQUVnQWlBRElBUkJmeERLQlF1dkFRSUJmd0YrSXdCQjBBQnJJZ1FrQUNBRVFRQkIwQUFRS3lJRUlBTTJBZ3dnQkNBQU5nSUFJQVJCQVRZQ0NDQUVRcUNBZ0lBUU53TVFJQVFnQVRZQ09DQUVJQUVnQW1vMkFqeENnSUNBZ0RBaEJRSkFBa0FnQkJDaUFRMEFJQVFRMGdNaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBUW9BaEJCckg5R0RRRWdCRUd3OHdCQkFCQVdDeUFBSUFVUUR5QUVJQVJCRUdvUS93RkNnSUNBZ09BQUlRVUxJQVJCMEFCcUpBQWdCUXRpQWdOK0FYOGdBQ2tEd0FFaUFrSWdpS2RCZFU4RVFDQUNweUlGSUFVb0FnQkJBV28yQWdBTElBQWdBa0dEMHdBUXNnRWhBeUFBSUFJUUR5QUFJQUFnQTBIZHdBQVFzZ0VpQWlBRFFRRWdBUkFoSVFRZ0FDQUNFQThnQUNBREVBOGdCQXNNQUNBQUlBRXBBd0FRc3dFTHlnWUNCSDhEZmlNQVFZQUJheUlGSkFBQ1FBSkFBa0FnQXlBRVFnQkNBQkR0QVVVTkFBSi9JQVJDLy8vLy8vLy9QNE1oQ2dKL0lBUkNNSWluUWYvL0FYRWlCa0gvL3dGSEJFQkJCQ0FHRFFFYVFRSkJBeUFESUFxRVVCc01BZ3NnQXlBS2hGQUxDeUVHSUFKQ01JaW5JZ2hCLy84QmNTSUhRZi8vQVVZTkFDQUdEUUVMSUFWQkVHb2dBU0FDSUFNZ0JCQXVJQVVnQlNrREVDSUNJQVVwQXhnaUFTQUNJQUVRNHdVZ0JTa0RDQ0VDSUFVcEF3QWhCQXdCQ3lBQklBSkMvLy8vLy8vLy8vLy9BSU1pQ2lBRElBUkMvLy8vLy8vLy8vLy9BSU1pQ1JEdEFVRUFUQVJBSUFFZ0NpQURJQWtRN1FFRVFDQUJJUVFNQWdzZ0JVSHdBR29nQVNBQ1FnQkNBQkF1SUFVcEEzZ2hBaUFGS1FOd0lRUU1BUXNnQkVJd2lLZEIvLzhCY1NFR0lBY0VmaUFCQlNBRlFlQUFhaUFCSUFwQ0FFS0FnSUNBZ0lEQXU4QUFFQzRnQlNrRGFDSUtRakNJcDBINEFHc2hCeUFGS1FOZ0N5RUVJQVpGQkVBZ0JVSFFBR29nQXlBSlFnQkNnSUNBZ0lDQXdMdkFBQkF1SUFVcEExZ2lDVUl3aUtkQitBQnJJUVlnQlNrRFVDRURDeUFKUXYvLy8vLy8veitEUW9DQWdJQ0FnTUFBaENFTElBcEMvLy8vLy8vL1A0TkNnSUNBZ0lDQXdBQ0VJUW9nQmlBSFNBUkFBMEFDZmlBS0lBdDlJQU1nQkZhdGZTSUpRZ0JaQkVBZ0NTQUVJQU45SWdTRVVBUkFJQVZCSUdvZ0FTQUNRZ0JDQUJBdUlBVXBBeWdoQWlBRktRTWdJUVFNQlFzZ0NVSUJoaUFFUWorSWhBd0JDeUFLUWdHR0lBUkNQNGlFQ3lFS0lBUkNBWVloQkNBSFFRRnJJZ2NnQmtvTkFBc2dCaUVIQ3dKQUlBb2dDMzBnQXlBRVZxMTlJZ2xDQUZNRVFDQUtJUWtNQVFzZ0NTQUVJQU45SWdTRVFnQlNEUUFnQlVFd2FpQUJJQUpDQUVJQUVDNGdCU2tET0NFQ0lBVXBBekFoQkF3QkN5QUpRdi8vLy8vLy96OVlCRUFEUUNBRVFqK0lJUUVnQjBFQmF5RUhJQVJDQVlZaEJDQUJJQWxDQVlhRUlnbENnSUNBZ0lDQXdBQlVEUUFMQ3lBSVFZQ0FBbkVoQmlBSFFRQk1CRUFnQlVGQWF5QUVJQWxDLy8vLy8vLy9QNE1nQjBINEFHb2dCbkt0UWpDR2hFSUFRb0NBZ0lDQWdNRERQeEF1SUFVcEEwZ2hBaUFGS1FOQUlRUU1BUXNnQ1VMLy8vLy8vLzgvZ3lBR0lBZHlyVUl3aG9RaEFnc2dBQ0FFTndNQUlBQWdBamNEQ0NBRlFZQUJhaVFBQzRzREFnSitBMzhqQUVFZ2F5SUNKQUJDZ0lDQWdPQUFJUVFDUUNBQUlBTXBBd0FpQlJCZ0RRQWdBQ0FCUVRFUVpTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQUorQWtBZ0FFRWdFRjhpQmtVTkFFRUFJUU1nQmtFQU5nSVVJQVpCQURZQ0FBTkFJQU5CQWtaRkJFQWdCaUFEUVFOMGFpSUhJQWRCQkdvaUNEWUNDQ0FISUFnMkFnUWdBMEVCYWlFRERBRUxDeUFHUW9DQWdJQXdOd01ZSUFGQ2dJQ0FnSEJhQkVBZ0FhY2dCallDSUFzZ0FDQUNRUkJxSUFFUXBBVU5BQUpBSUFBZ0JVS0FnSUNBTUVFQ0lBSkJFR29RSVNJRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDZ0NFQ0lES1FPQUFTRUVJQU5DZ0lDQWdDQTNBNEFCSUFJZ0JEY0RDQ0FBSUFJcEF4aENnSUNBZ0RCQkFTQUNRUWhxRUNFaEJDQUFJQUlwQXdnUUR5QUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBQ0FFRUE4TElBQWdCUkFQSUFBZ0Fpa0RFQkFQSUFFaEJDQUNLUU1ZREFJTElBQWdBaWtERUJBUElBQWdBaWtER0JBUFFvQ0FnSURnQUNFRUN5QUJDeEFQQ3lBQ1FTQnFKQUFnQkF1U0N3SUhmZ1YvSXdCQkVHc2lBaVFBSUFSQjVhWUJhaTBBQUNJTnJTRUpBa0FDUUFKQUlBTXBBd0FpQmtMLy8vLy9iMWdFUUVLQWdJQ0E0QUFoQlNBQUlBSkJDR29nQmhDbUFRMERJQUJDZ0lDQWdEQWdBaWtEQ0NJSElBbUdFUGtDSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXd3QkN3SkFBa0FnQnFjaURDOEJCaUlPUVJOclFmLy9BM0ZCQVUwRVFDQU1LQUlnSVF4Q2dJQ0FnT0FBSVFVZ0FDQUNJQU1wQXdnUXBnRU5CU0FNTFFBRURRSUNRQ0FDS1FNQUlnaEJmeUFOZEVGL2N5SU5ySU5RQkVBZ0NDQU1LQUlBSWc2c0lnWllEUUVMSUFCQitDMUJBQkJRREFZTEFrQWdBeWtERUNJSFFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBTklBNXhEUUVnQmlBSWZTQUppQ0VIREFNTElBQWdBa0VJYWlBSEVLWUJEUVlnREMwQUJBMERJQXcwQWdBZ0Fpa0RDQ0lISUFtR0lBaDhXZzBDQ3lBQVFaTFpBRUVBRUZBTUJRc0NmZ0pBQWtBZ0FFS0FnSUNBTUFKK0FrQUNRQUorQWtBQ1FBSkFJQTVCRld0Qi8vOERjVUVLVFFSQUlBQWdBU0FFRUdVaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwUEFrQUNRQ0FNS0FJZ0lnOG9BZ3dpQXlnQ0lDSU5MUUFFUlFSQUlBd29BaWdoRGtLQWdJQ0FNQ0VCSUEwdEFBVkZCRUFnQUNBRHJVS0FnSUNBY0lSQ2dJQ0FnREFRNHdFaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwREN5QUFJQUVnRHEwaUNDQUpoaEQ1QWlFSElBQWdBUkFQSUFkQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQWlBTUtBSWdLQUlNS0FJZ0xRQUVSUTBCSUFBZ0J4QVBDeUFBRUdzTUFRdEJBQ0VEQWtBZ0IwS0FnSUNBY0ZRTkFDQUhweUlRTHdFR1FSTkhEUUFnRUNnQ0lDRURDeUFBSUFVZ0IwSUFJQWdRMndNTkFDQU1Md0VHSUFSR0RRSkJBQ0VFQTBBZ0JDQU9SZzBSSUFBZ0JpQUVFTEFCSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBVWdCQ0FCRUtVQklRTWdCRUVCYWlFRUlBTkJBRTROQUFzTElBQWdCUkFQREE0TFFvQ0FnSURnQUNFRklBQWdBU0FFRUdVaUNrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwT1FvQ0FnSUF3SVFVZ0FDQUdRZEVCSUFaQkFCQVVJZ3RDZ0lDQWdIQ0RJZ2RDZ0lDQWdDQlJJQWRDZ0lDQWdEQlJjZzBCUW9DQWdJRGdBQ0VCSUFkQ2dJQ0FnT0FBVVEwSVFRQWhBeUFBRUQ0aUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRklBQWdCaUFMRVBvRElnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFS0FnSUNBTUF3RUN5QUFJQVZCNmdBZ0JVRUFFQlFpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDUVFBaEJBTkFJQUFnQlNBR0lBSkJDR29RcmdFaUNFS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRElBSW9BZ2dFUUNBRUlRTWdCeUVCREFZTElBQWdCeUFFclNBSVFZQ0FBUkRTQVVFQVNBUkFJQVloQ0NBRklRWWdCeUVGREFZRklBUkJBV29oQkF3QkN3QUxBQXNnQXlnQ0NDQU5LQUlJSUE4b0FoQnFJQU1vQWdBUUh4b01EUXNnQUNBQ1FRaHFJQVlRUEEwR0lBd2dEQ2dDQUVFQmFqWUNBQ0FHSVFFZ0Fpa0RDQXdFQ3lBR0N5RUlJQVVoQmlBSElRVUxJQUFnQ0JBUElBQWdCaEFQSUFBZ0JSQVBDeUFBSUFzUUR5QUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBNjBMSWdVZ0NZWVErUUlpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0NpQUdRZ0FnQlJEYkF3MEFRUUFoQkFOQUlBb2dCSzBnQlZrTkF4b2dBQ0FCSUFRUXNBRWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEJJQUFnQ2lBRUlBWVFwUUVoQXlBRVFRRnFJUVFnQTBFQVRnMEFDd3NnQVNFRkN5QUFJQVVRRHlBS0lRRkNnSUNBZ09BQUN5RUZJQUFnQVJBUERBUUxJQU1wQXdBaUJrSWdpS2RCZFVrTkFTQUdweUlESUFNb0FnQkJBV28yQWdBTUFRc2dBQkJyREFJTElBQWdBU0FFRUdVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBQWdCaEFQREFJTElBQWdBU0FHSUFnZ0J4RGJBMFVFUUNBQklRVU1BZ3NnQUNBQkVBOExRb0NBZ0lEZ0FDRUZDeUFDUVJCcUpBQWdCUXNQQUNBQUlBRWdBa0VBUVFNUWxnSUw5QUVDQTM0QmZ3SkFJQU1wQXdBaUJFS0FnSUNBY0ZvRVFDQURLUU1JSWdWQy8vLy8vMjlXRFFFTElBQVFKRUtBZ0lDQTRBQVBDMEtBZ0lDQTRBQWhCaUFBUW9DQWdJQWdRVEFRU1NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkg0Z0FFRVlFQ2tpQWtVRVFDQUFJQUVRRDBLQWdJQ0E0QUFQQ3lBRXB5SURJQU1vQWdCQkFXbzJBZ0FnQWlBRU53TUFJQVduSWdjZ0J5Z0NBRUVCYWpZQ0FDQUNJQVUzQXdnZ0FDQUVFRGdoQUNBQ1FRQTZBQkVnQWlBQU9nQVFJQUZDZ0lDQWdIQmFCRUFnQWFjaUFDQUNOZ0lnSUFBZ0FDMEFCVUh2QVhFZ0F5MEFCVUVRY1hJNkFBVUxJQUVGUW9DQWdJRGdBQXNMWGdFQmZ3SkFJQUZDZ0lDQWdIQlVEUUFnQWFjaUJDOEJCaUFEUncwQUlBUW9BaUFpQkVVTkFDQUVLUU1BSWdGQ2dJQ0FnR0JhQkVBZ0FDQUJweUFDRVFBQUN5QUVLUU1JSWdGQ2dJQ0FnR0JVRFFBZ0FDQUJweUFDRVFBQUN3dEtBUUYvQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlETHdFR0lBSkhEUUFnQXlnQ0lDSURSUTBBSUFBZ0F5a0RBQkFqSUFBZ0F5a0RDQkFqSUFCQkVHb2dBeUFBS0FJRUVRQUFDd3M0QVFGL0lBQkJNR3NpQkVFS1R3Ui9JQUJCd1FCcklBTk5CRUFnQUVFM2F3OExJQUlnQUVIWEFHc2dBRUhoQUdzZ0FVOGJCU0FFQ3d0TEFRRi9JQUJCR0JBcElnSkZCRUJDZ0lDQWdPQUFEd3NnQWtFQk5nSUFJQUFvQXRnQklRQWdBa0lBTndJUUlBSkNnSUNBZ0lDQWdJQ0FmemNDQ0NBQ0lBQTJBZ1FnQXEwZ0FZUUxrUUlBSUFCRkJFQkJBQThMQW44Q1FDQUJRZjhBVFEwQUFrQkJpTlVFS0FJQUtBSUFSUVJBSUFGQmdIOXhRWUMvQTBZTkFnd0JDeUFCUWY4UFRRUkFJQUFnQVVFL2NVR0FBWEk2QUFFZ0FDQUJRUVoyUWNBQmNqb0FBRUVDREFNTElBRkJnRUJ4UVlEQUEwY2dBVUdBc0FOUGNVVUVRQ0FBSUFGQlAzRkJnQUZ5T2dBQ0lBQWdBVUVNZGtIZ0FYSTZBQUFnQUNBQlFRWjJRVDl4UVlBQmNqb0FBVUVEREFNTElBRkJnSUFFYTBILy96OU5CRUFnQUNBQlFUOXhRWUFCY2pvQUF5QUFJQUZCRW5aQjhBRnlPZ0FBSUFBZ0FVRUdka0UvY1VHQUFYSTZBQUlnQUNBQlFReDJRVDl4UVlBQmNqb0FBVUVFREFNTEMwR2cxQVJCR1RZQ0FFRi9EQUVMSUFBZ0FUb0FBRUVCQ3d2RUFnQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUJRUWxyRGhJQUNnc01DZ3NDQXdRRkRBc01EQW9MQndnSkN5QUNJQUlvQWdBaUFVRUVhallDQUNBQUlBRW9BZ0EyQWdBUEN3QUxJQUlnQWlnQ0FDSUJRUVJxTmdJQUlBQWdBVElCQURjREFBOExJQUlnQWlnQ0FDSUJRUVJxTmdJQUlBQWdBVE1CQURjREFBOExJQUlnQWlnQ0FDSUJRUVJxTmdJQUlBQWdBVEFBQURjREFBOExJQUlnQWlnQ0FDSUJRUVJxTmdJQUlBQWdBVEVBQURjREFBOExBQXNnQWlBQ0tBSUFRUWRxUVhoeElnRkJDR28yQWdBZ0FDQUJLd01BT1FNQUR3c2dBQ0FDSUFNUkFBQUxEd3NnQWlBQ0tBSUFJZ0ZCQkdvMkFnQWdBQ0FCTkFJQU53TUFEd3NnQWlBQ0tBSUFJZ0ZCQkdvMkFnQWdBQ0FCTlFJQU53TUFEd3NnQWlBQ0tBSUFRUWRxUVhoeElnRkJDR28yQWdBZ0FDQUJLUU1BTndNQUMxNEJCSDhnQUNnQ0FDRUNBMEFnQWl3QUFDSURFTkVDQkVCQmZ5RUVJQUFnQWtFQmFpSUNOZ0lBSUFGQnpKbXo1Z0JOQkg5QmZ5QURRVEJySWdNZ0FVRUtiQ0lFYWlBRElBUkIvLy8vL3dkelNoc0ZRWDhMSVFFTUFRc0xJQUVMM0JJQ0VuOEJmaU1BUWRBQWF5SUlKQUFnQ0NBQk5nSk1JQWhCTjJvaEZ5QUlRVGhxSVJJQ1FBSkFBa0FDUUFOQUlBRWhEQ0FISUE1Qi8vLy8vd2R6U2cwQklBY2dEbW9oRGdKQUFrQUNRQ0FNSWdjdEFBQWlDUVJBQTBBQ1FBSkFJQWxCL3dGeElnRkZCRUFnQnlFQkRBRUxJQUZCSlVjTkFTQUhJUWtEUUNBSkxRQUJRU1ZIQkVBZ0NTRUJEQUlMSUFkQkFXb2hCeUFKTFFBQ0lRb2dDVUVDYWlJQklRa2dDa0VsUmcwQUN3c2dCeUFNYXlJSElBNUIvLy8vL3dkekloaEtEUWNnQUFSQUlBQWdEQ0FIRUZzTElBY05CaUFJSUFFMkFrd2dBVUVCYWlFSFFYOGhEd0pBSUFFc0FBRWlDaERSQWtVTkFDQUJMUUFDUVNSSERRQWdBVUVEYWlFSElBcEJNR3NoRDBFQklSTUxJQWdnQnpZQ1RFRUFJUTBDUUNBSExBQUFJZ2xCSUdzaUFVRWZTd1JBSUFjaENnd0JDeUFISVFwQkFTQUJkQ0lCUVluUkJIRkZEUUFEUUNBSUlBZEJBV29pQ2pZQ1RDQUJJQTF5SVEwZ0J5d0FBU0lKUVNCcklnRkJJRThOQVNBS0lRZEJBU0FCZENJQlFZblJCSEVOQUFzTEFrQWdDVUVxUmdSQUFuOENRQ0FLTEFBQklnRVEwUUpGRFFBZ0NpMEFBa0VrUncwQUlBRkJBblFnQkdwQndBRnJRUW8yQWdBZ0NrRURhaUVKUVFFaEV5QUtMQUFCUVFOMElBTnFRWUFEYXlnQ0FBd0JDeUFURFFZZ0NrRUJhaUVKSUFCRkJFQWdDQ0FKTmdKTVFRQWhFMEVBSVJBTUF3c2dBaUFDS0FJQUlnRkJCR28yQWdCQkFDRVRJQUVvQWdBTElSQWdDQ0FKTmdKTUlCQkJBRTROQVVFQUlCQnJJUkFnRFVHQXdBQnlJUTBNQVFzZ0NFSE1BR29RZ3dZaUVFRUFTQTBJSUFnb0Frd2hDUXRCQUNFSFFYOGhDd0ovSUFrdEFBQkJMa2NFUUNBSklRRkJBQXdCQ3lBSkxRQUJRU3BHQkVBQ2Z3SkFJQWtzQUFJaUFSRFJBa1VOQUNBSkxRQURRU1JIRFFBZ0FVRUNkQ0FFYWtIQUFXdEJDallDQUNBSlFRUnFJUUVnQ1N3QUFrRURkQ0FEYWtHQUEyc29BZ0FNQVFzZ0V3MEdJQWxCQW1vaEFVRUFJQUJGRFFBYUlBSWdBaWdDQUNJS1FRUnFOZ0lBSUFvb0FnQUxJUXNnQ0NBQk5nSk1JQXRCZjNOQkgzWU1BUXNnQ0NBSlFRRnFOZ0pNSUFoQnpBQnFFSU1HSVFzZ0NDZ0NUQ0VCUVFFTElSUURRQ0FISVJWQkhDRUtJQUVpRVN3QUFDSUhRZnNBYTBGR1NRMEpJQkZCQVdvaEFTQUhJQlZCT214cVFaL0JCR290QUFBaUIwRUJhMEVJU1EwQUN5QUlJQUUyQWt3Q1FBSkFJQWRCRzBjRVFDQUhSUTBMSUE5QkFFNEVRQ0FFSUE5QkFuUnFJQWMyQWdBZ0NDQURJQTlCQTNScUtRTUFOd05BREFJTElBQkZEUWdnQ0VGQWF5QUhJQUlnQmhDQ0Jnd0NDeUFQUVFCT0RRb0xRUUFoQnlBQVJRMEhDeUFOUWYvL2UzRWlDU0FOSUExQmdNQUFjUnNoRFVFQUlROUJyQ0VoRmlBU0lRb0NRQUpBQWtBQ2Z3SkFBa0FDUUFKQUFuOENRQUpBQWtBQ1FBSkFBa0FDUUNBUkxBQUFJZ2RCWDNFZ0J5QUhRUTl4UVFOR0d5QUhJQlViSWdkQjJBQnJEaUVFRkJRVUZCUVVGQlFPRkE4R0RnNE9GQVlVRkJRVUFnVURGQlFKRkFFVUZBUUFDd0pBSUFkQndRQnJEZ2NPRkFzVURnNE9BQXNnQjBIVEFFWU5DUXdUQ3lBSUtRTkFJUmxCckNFTUJRdEJBQ0VIQWtBQ1FBSkFBa0FDUUFKQUFrQWdGVUgvQVhFT0NBQUJBZ01FR2dVR0dnc2dDQ2dDUUNBT05nSUFEQmtMSUFnb0FrQWdEallDQUF3WUN5QUlLQUpBSUE2c053TUFEQmNMSUFnb0FrQWdEanNCQUF3V0N5QUlLQUpBSUE0NkFBQU1GUXNnQ0NnQ1FDQU9OZ0lBREJRTElBZ29Ba0FnRHF3M0F3QU1Fd3RCQ0NBTElBdEJDRTBiSVFzZ0RVRUljaUVOUWZnQUlRY0xJQkloRENBSFFTQnhJUkVnQ0NrRFFDSVpVRVVFUUFOQUlBeEJBV3NpRENBWnAwRVBjVUd3eFFScUxRQUFJQkZ5T2dBQUlCbENEMVloQ1NBWlFnU0lJUmtnQ1EwQUN3c2dEVUVJY1VVZ0NDa0RRRkJ5RFFNZ0IwRUVka0dzSVdvaEZrRUNJUThNQXdzZ0VpRUhJQWdwQTBBaUdWQkZCRUFEUUNBSFFRRnJJZ2NnR2FkQkIzRkJNSEk2QUFBZ0dVSUhWaUVNSUJsQ0E0Z2hHU0FNRFFBTEN5QUhJUXdnRFVFSWNVVU5BaUFMSUJJZ0RHc2lCMEVCYWlBSElBdElHeUVMREFJTElBZ3BBMEFpR1VJQVV3UkFJQWhDQUNBWmZTSVpOd05BUVFFaEQwR3NJUXdCQ3lBTlFZQVFjUVJBUVFFaEQwR3RJUXdCQzBHdUlVR3NJU0FOUVFGeElnOGJDeUVXSUJrZ0VoQ1ZBaUVNQ3lBVVFRQWdDMEVBU0JzTkRpQU5RZi8vZTNFZ0RTQVVHeUVOSUFncEEwQWlHVUlBVWlBTGNrVUVRQ0FTSVF4QkFDRUxEQXdMSUFzZ0dWQWdFaUFNYTJvaUJ5QUhJQXRJR3lFTERBc0xJQWdvQWtBaUIwR2drZ0VnQnhzaURFRUFRZi8vLy84SElBc2dDMEgvLy8vL0IwOGJJZ29RK3dFaUJ5QU1heUFLSUFjYklnY2dER29oQ2lBTFFRQk9CRUFnQ1NFTklBY2hDd3dMQ3lBSklRMGdCeUVMSUFvdEFBQU5EUXdLQ3lBTEJFQWdDQ2dDUUF3Q0MwRUFJUWNnQUVFZ0lCQkJBQ0FORUdNTUFnc2dDRUVBTmdJTUlBZ2dDQ2tEUUQ0Q0NDQUlJQWhCQ0dvaUJ6WUNRRUYvSVFzZ0J3c2hDVUVBSVFjQ1FBTkFJQWtvQWdBaURFVU5BU0FJUVFScUlBd1FnUVlpQ2tFQVNDSU1JQW9nQ3lBSGEwdHlSUVJBSUFsQkJHb2hDU0FMSUFjZ0Ntb2lCMHNOQVF3Q0N3c2dEQTBOQzBFOUlRb2dCMEVBU0EwTElBQkJJQ0FRSUFjZ0RSQmpJQWRGQkVCQkFDRUhEQUVMUVFBaENpQUlLQUpBSVFrRFFDQUpLQUlBSWd4RkRRRWdDRUVFYWlBTUVJRUdJZ3dnQ21vaUNpQUhTdzBCSUFBZ0NFRUVhaUFNRUZzZ0NVRUVhaUVKSUFjZ0Nrc05BQXNMSUFCQklDQVFJQWNnRFVHQXdBQnpFR01nRUNBSElBY2dFRWdiSVFjTUNBc2dGRUVBSUF0QkFFZ2JEUWhCUFNFS0lBQWdDQ3NEUUNBUUlBc2dEU0FISUFVUlNRQWlCMEVBVGcwSERBa0xJQWdnQ0NrRFFEd0FOMEVCSVFzZ0Z5RU1JQWtoRFF3RUN5QUhMUUFCSVFrZ0IwRUJhaUVIREFBTEFBc2dBQTBISUJORkRRSkJBU0VIQTBBZ0JDQUhRUUowYWlnQ0FDSUFCRUFnQXlBSFFRTjBhaUFBSUFJZ0JoQ0NCa0VCSVE0Z0IwRUJhaUlIUVFwSERRRU1DUXNMUVFFaERpQUhRUXBQRFFjRFFDQUVJQWRCQW5ScUtBSUFEUUVnQjBFQmFpSUhRUXBIRFFBTERBY0xRUndoQ2d3RUN5QUxJQW9nREdzaUVTQUxJQkZLR3lJSklBOUIvLy8vL3dkelNnMENRVDBoQ2lBUUlBa2dEMm9pQ3lBTElCQklHeUlISUJoS0RRTWdBRUVnSUFjZ0N5QU5FR01nQUNBV0lBOFFXeUFBUVRBZ0J5QUxJQTFCZ0lBRWN4QmpJQUJCTUNBSklCRkJBQkJqSUFBZ0RDQVJFRnNnQUVFZ0lBY2dDeUFOUVlEQUFITVFZd3dCQ3d0QkFDRU9EQU1MUVQwaENndEJvTlFFSUFvMkFnQUxRWDhoRGdzZ0NFSFFBR29rQUNBT0MzOENBWDhCZmlBQXZTSURRalNJcDBIL0QzRWlBa0gvRDBjRWZDQUNSUVJBSUFFZ0FFUUFBQUFBQUFBQUFHRUVmMEVBQlNBQVJBQUFBQUFBQVBCRG9pQUJFSVVHSVFBZ0FTZ0NBRUZBYWdzMkFnQWdBQThMSUFFZ0FrSCtCMnMyQWdBZ0EwTC8vLy8vLy8vL2g0Qi9nMEtBZ0lDQWdJQ0E4RCtFdndVZ0FBc0xxQU1EQW53RGZ3RitJQUM5SWdoQ0lJaW5JZ1ZCK1AvLy93ZHhRYWlvbHY4RFNTSUdSUVJBUkJndFJGVDdJZWsvSUFBZ0FKb2dDRUlBV1NJSEc2RkVCMXdVTXlhbWdUd2dBU0FCbWlBSEc2R2dJUUFnQlVFZmRpRUZSQUFBQUFBQUFBQUFJUUVMSUFBZ0FDQUFJQUNpSWdTaUlnTkVZMVZWVlZWVjFUK2lJQVFnQXlBRUlBU2lJZ01nQXlBRElBTWdBMFJ6VTJEYnkzWHp2cUpFcHBJM29JaCtGRCtnb2tRQlpmTHkyRVJEUDZDaVJDZ0RWc2tpYlcwL29LSkVOOVlHaFBSa2xqK2dva1I2L2hBUkVSSEJQNkFnQkNBRElBTWdBeUFESUFORTFIcS9kSEFxK3o2aVJPbW44RElQdUJJL29LSkVhQkNOR3ZjbU1EK2dva1FWZytEK3lOdFhQNkNpUkpPRWJ1bmpKb0kvb0tKRS9rR3pHN3FocXorZ29xQ2lJQUdnb2lBQm9LQWlBNkFoQVNBR1JRUkFRUUVnQWtFQmRHdTNJZ1FnQUNBRElBRWdBYUlnQVNBRW9LT2hvQ0lBSUFDZ29TSUFtaUFBSUFVYkR3c2dBZ1I4UkFBQUFBQUFBUEMvSUFHaklnUWdCTDFDZ0lDQWdIQ0R2eUlFSUFNZ0FiMUNnSUNBZ0hDRHZ5SUJJQUNob2FJZ0JDQUJva1FBQUFBQUFBRHdQNkNnb2lBRW9BVWdBUXNMOXdNQ0JIOEJmZ0pBQWtBQ1FBSkFBa0FDUUFKQUFuOGdBQ2dDQkNJQklBQW9BbWhIQkVBZ0FDQUJRUUZxTmdJRUlBRXRBQUFNQVFzZ0FCQlZDeUlDUVN0ckRnTUFBUUFCQ3dKL0lBQW9BZ1FpQVNBQUtBSm9Sd1JBSUFBZ0FVRUJhallDQkNBQkxRQUFEQUVMSUFBUVZRc2lBVUU2YTBGMVN3UkFJQUpCTFVZaEJDQUJJUUlNQWdzZ0FDa0RjRUlBV1EwQ0RBVUxJQUpCT210QmRra05BZ3NnQWtFd2F5SURRUXBKQkVCQkFDRUJBMEFnQWlBQlFRcHNhaUVCSUFGQk1Hc2lBVUhNbWJQbUFFZ0NmeUFBS0FJRUlnSWdBQ2dDYUVjRVFDQUFJQUpCQVdvMkFnUWdBaTBBQUF3QkN5QUFFRlVMSWdKQk1Hc2lBMEVKVFhFTkFBc2dBYXdoQlFzQ1FDQURRUXBQRFFBRFFDQUNyU0FGUWdwK2ZFSXdmU0VGQW44Z0FDZ0NCQ0lCSUFBb0FtaEhCRUFnQUNBQlFRRnFOZ0lFSUFFdEFBQU1BUXNnQUJCVkN5SUNRVEJySWdOQkNVc05BU0FGUXE2UGhkZkh3dXVqQVZNTkFBc0xJQU5CQ2trRVFBTkFBbjhnQUNnQ0JDSUJJQUFvQW1oSEJFQWdBQ0FCUVFGcU5nSUVJQUV0QUFBTUFRc2dBQkJWQzBFd2EwRUtTUTBBQ3dzZ0FDa0RjRUlBV1FSQUlBQWdBQ2dDQkVFQmF6WUNCQXRDQUNBRmZTQUZJQVFiRHdzZ0FDQUFLQUlFUVFGck5nSUVEQUVMSUFBcEEzQkNBRk1OQVFzZ0FDQUFLQUlFUVFGck5nSUVDMEtBZ0lDQWdJQ0FnSUIvQzc4Q0FRRi9Jd0JCMEFCcklnUWtBQUpBSUFOQmdJQUJUZ1JBSUFSQklHb2dBU0FDUWdCQ2dJQ0FnSUNBZ1AvL0FCQXVJQVFwQXlnaEFpQUVLUU1nSVFFZ0EwSC8vd0ZKQkVBZ0EwSC8vd0JySVFNTUFnc2dCRUVRYWlBQklBSkNBRUtBZ0lDQWdJQ0EvLzhBRUM1Qi9mOENJQU1nQTBIOS93Sk9HMEgrL3dGcklRTWdCQ2tER0NFQ0lBUXBBeEFoQVF3QkN5QURRWUdBZjBvTkFDQUVRVUJySUFFZ0FrSUFRb0NBZ0lDQWdJQTVFQzRnQkNrRFNDRUNJQVFwQTBBaEFTQURRZlNBZmtzRVFDQURRWTMvQUdvaEF3d0JDeUFFUVRCcUlBRWdBa0lBUW9DQWdJQ0FnSUE1RUM1QjZJRjlJQU1nQTBIb2dYMU1HMEdhL2dGcUlRTWdCQ2tET0NFQ0lBUXBBekFoQVFzZ0JDQUJJQUpDQUNBRFFmLy9BR3F0UWpDR0VDNGdBQ0FFS1FNSU53TUlJQUFnQkNrREFEY0RBQ0FFUWRBQWFpUUFDelVBSUFBZ0FUY0RBQ0FBSUFKQy8vLy8vLy8vUDRNZ0JFSXdpS2RCZ0lBQ2NTQUNRakNJcDBILy93RnhjcTFDTUlhRU53TUlDMFVCQW53Z0FDQUNJQUtpSWdRNUF3QWdBU0FDSUFKRUFBQUFBZ0FBb0VHaUlnTWdBaUFEb2FBaUFxRWlBeUFEb2lBQ0lBS2dJQU9pSUFJZ0FxSWdCS0dnb0RrREFBdmFBUUVFZnlBQUtBSlVJUU1DUUNBQUtBSVVJZ1lnQUNnQ0hDSUZSd1JBSUFBZ0JUWUNGQ0FBSUFVZ0JpQUZheUlGRUlzR0lBVkpEUUVMQWtBZ0F5Z0NFRUhoQUVjRVFDQURLQUlBSVFRTUFRc2dBeUFES0FJRUlnUTJBZ0FMSUFNb0Fnd2dCR29nQVNBREtBSUlJQVJySWdFZ0FpQUJJQUpKR3lJRUVCOGFJQU1nQXlnQ0FDQUVhaUlCTmdJQUlBRWdBeWdDQkUwTkFDQURJQUUyQWdRQ2Z5QURLQUlJSWdJZ0FVc0VRQ0FES0FJTUlBRnFEQUVMSUFBdEFBQkJCSEZGSUFKRmNnMEJJQUlnQXlnQ0RHcEJBV3NMUVFBNkFBQUxJQVFMR0FFQmZ5TUFRUkJySWdFZ0FEa0RDQ0FCS3dNSUlBQ2lDeWdBSUFGRUFBQUFBQUFBd0graUlBQkVpOTBhRldZZ2xzQ2dFT3NEb2tRQUFBQUFBQURBZjZJTEVBQWdBRUVnUmlBQVFRbHJRUVZKY2dzV0FDQUFSUVJBUVFBUEMwR2cxQVFnQURZQ0FFRi9DeU1BQWtBQ1FBSkFJQUlPQWdBQkFnc2dBQ0FCY2c4TElBQWdBWE1QQ3lBQUlBRnhDNDRFQVFwL0l3QkJJR3NpQ1NRQUlBQWdBVWNFUUFKQUFrQUNRQ0FCS0FJTVJRUkFBa0FDUUNBQktBSUlRZjcvLy84SGF3NENBQU1CQ3lBQktBSUVEUUlMSUFBZ0FSQkVHZ3dEQ3lBQktBSUVEUUFnQVNnQ0FDRUZJQUFnQWtFQmRFSERBR29pREVFR2RpSUlFRUVOQUNBRktBSUFRUUFnQ0VFRGRDSUVJQVVvQWdRUkFRQWlCa1VOQUNBRUlBWkJBQ0FJUVFGMElnY2dCeUFCS0FJTUlnUWdCQ0FIU2hzaUMydEJBblFRS3lJR2FpQUxRUUowSWdScklBRW9BaEFnQVNnQ0RFRUNkR29nQkdzZ0JCQWZHaUFCTFFBSVFRRnhCRUFnQmlBR0lBZEJBQkNTQmlFS0N5QUFLQUlRSVEwZ0NTRUVBa0FnREVHQUNFOEVRQ0FGS0FJQVFRQWdCMEg4Ly84L2NVRUVhaUFGS0FJRUVRRUFJZ1JGRFFFTElBVWdEU0FHSUFnZ0JDQUdJQWhCQW5ScUVKTUdJUWNnQkNBSlJ3UkFJQVVvQWdBZ0JFRUFJQVVvQWdRUkFRQWFDeUFIUlEwQ0N5QUZLQUlBSUFaQkFDQUZLQUlFRVFFQUdnc2dBQkExREFFTEFrQUNRQ0FLUlFSQUlBWWdDRUVCYWhDb0F5RUVJQVVvQWdBZ0JrRUFJQVVvQWdRUkFRQWFJQVFOQVNBQktBSVFJQUVvQWd3Z0Myc1FxQU1OQVF3Q0N5QUZLQUlBSUFaQkFDQUZLQUlFRVFFQUdnc2dBQ2dDRUNJRUlBUW9BZ0JCQVhJMkFnQUxJQUJCQURZQ0JDQUFJQUVvQWdoQkFXcEJBWFUyQWdnZ0FDQUNJQU1RemdFYUN5QUpRU0JxSkFBUEMwSFkvUUJCMVB3QVFkTVFRWTRuRUFBQUN6d0JBWDhEUUNBQ1FRQk1SUVJBSUFBZ0FrRUJheUlDUVFKMElnUnFJQU5CSDNRZ0FTQUVhaWdDQUNJRFFRRjJjallDQUF3QkN3c2dBMEVCY1F1ZUJBSU1md0orSXdCQkVHc2lDQ1FBQWtBQ1FDQURRUUZHQkVBZ0FpZ0NBQ0VBSUFoQkRHb2dBaWdDQkJDVUJpRURJQUJCLy84RGNhMGdBRUVRZHEwZ0NEVUNERUlRaG9RaUVpQVNJQU5CQVhTdEloT0FJaElnRTM1OVFoQ0doQ0VUSUFOQkVIUWhBQ0FTcHlJRFFZQ0FCRThFZmlBVFFvQ0FnSUFRZlFVZ0V5QVNJQkorUXYzLy8vOFBnMzBMSVJJZ0FDQURhaUVHSUJKQ0FGTUVRQ0FTSUFaQkFXc2lCcTFDQVlaOFFnRjhJUklMSUFFZ0JqWUNBQ0FDSUJJK0FnQWdFa0lnaUtjaEJnd0JDMEYvSVEwZ0FDQUJJQU5CQVhZaUIwRUNkR29pQ1NBQ0lBTkJmbkVpRDBFQ2RHb2lEQ0FESUFkcklnb2dCQ0FJUVFocUVKTUdEUUVnQ0NnQ0NDSUxCRUFnRENBTUlBa2dDaENZQWhvTElBQWdCQ0FDSUFkQkFuUWlCbW9pRGlBRElBa2dDaENsQkEwQklBUWdCbW9vQWdBaEVFRUFJUVlEUUNBR0lBZEdSUVJBSUFFZ0JrRUNkQ0lSYWlBRUlCRnFLQUlBTmdJQUlBWkJBV29oQmd3QkN3c2dDeUFRYWlJTFFRRjJJUVlnQVNBQklBY2dDMEVCY1JDU0JnUi9JQTRnRGlBSklBb1FxZ1FGUVFBTElRUWdDU0FHSUFvUXFRTWFJQVFnRENBTFFRRk5CSDhnQUNBQ0lBTkJBblJxSWdBZ0FTQUhJQUVnQnhEWEFnMENJQUlnQWlBQUlBOFFtQUlGSUFZTElBTkJBWEVRMkFKcklnWkJBRTROQUNBQlFRRWdBeERZQWhvZ0FpQUJJQU5CQWhDY0JpQUdhaUFDUVFFZ0F4Q3BBMm9oQmdzZ0JTQUdOZ0lBUVFBaERRc2dDRUVRYWlRQUlBMExtQUVCQW44Z0FDQUJRZjhCY1NBQlFRaDJRZjhCY1NBQlFSZDJRZjREY1VIZ3BBUnFMd0VBSWdCQkFYUWlBa0YvYzBFQUlBRkJFSFlnQUNBQWJHc2lBU0FDU3lJQ0d5QUJha0VJZEhJaUFTQUFJQUpxSWdKQkFYUWlBMjRpQUNBQWJHc2dBU0FBSUFOc2EwRUlkR29pQVVFZmRTQUNRUWgwSUFCcUlnQkJBV3NpQWtFQmRFRUJjbkVnQVdvMkFnQWdBaUFBSUFGQkFFZ2JDemtCQVg4akFFRVFheUlCSkFBZ0FBUi9JQUZCREdvZ0FDQUFaeUlBUVI1eGRCQ1VCaUFBUVFGMmRnVkJBQXNoQUNBQlFSQnFKQUFnQUF2ZUNBRVFmeUFDSUFFZ0FTQUNFTk1CSWdsQkFFZ2lCeHNoQ0FKQUlBa2dBaWdDQkNBRmN5SUZJQUVvQWdRaUJuTWlEa1Z5RFFBZ0NDZ0NDRUg5Ly8vL0Iwb05BQ0FBSUFSQkIzRkJBa1lRaVFGQkFBOExJQVVnQmlBSEd5RUZJQUVnQWlBSEd5RUpBa0FDUUFKQUlBZ29BZ3dpQmdSQUlBa29BZ3dpQ3cwQkN5QUlLQUlJSWdGQi92Ly8vd2RPQkVBZ0FVSC8vLy8vQjBZRVFDQUFFRFZCQUE4TElBNUZJQWtvQWdoQi92Ly8vd2RIY2tVRVFDQUFFRFZCQVE4TElBQWdCUkNNQVVFQUR3c2dBQ0FJRUVRYUlBQWdCVFlDQkF3QkN5QUFJQVUyQWdRZ0FDQUlLQUlJTmdJSUlBZ29BZ2dpQVNBSktBSUlJZ2RySVFvQ1FDQU9SUVJBUVFBaEJRd0JDMEVCSVFVZ0NrRUJTZzBBSUFaQkJYUkJBV3NoQWlBTElBWnJRUVYwSUFGcUlBZHJRUjlySVE4Z0NTZ0NFQ0VRUVFBaEJRTkFRUUFoQVNBQ1FRVjFJZ2NnQmtrRVFDQUlLQUlRSUFkQkFuUnFLQUlBSVFFTElCQWdDeUFDSUE5cUVHZ2lCeUFCUmdSQUlBSkJJR3NoQWlBRlFTQnFJUVVNQVFzTElBRWdCM01pRFdjaUVVRUJhaUVNQWtBZ0RVRUNTUVJBSUFVZ0RHb2hCUXdCQ3lBRklBRkJmMEVmSUJGcklnMTBRWDl6SWdWeFp5SUJJQVVnQjBGL2MzRm5JZ1VnQVNBRlNCc2lBV29oQlNBQklBeHJJQTFIRFFFTEEwQWdCU0VIUVFBaEFTQUNRU0JySWdKQkJYVWlCU0FHU1FSQUlBZ29BaEFnQlVFQ2RHb29BZ0FoQVFzZ0VDQUxJQUlnRDJvUWFDRU1JQUZGQkVBZ0IwRWdhaUVGSUF4QmYwWU5BUXNMSUFGbklnRWdERUYvYzJjaUFpQUJJQUpJR3lBSGFpRUZDeUFBSUFNZ0JXcEJJV3BCQlhZaUFpQUdJQXBCSDJwQklHMGdDMm9pQVNBQklBWklHeUlCSUFFZ0Frb2JJZ2NRUVEwQlFRQWdDQ2dDRENJVElBZHJJZzlySWdKQkgzVWdBbkVoRkNBSElBRnJJUUpCQUNBT2F5RVFJQWtvQWd3aURFRUZkQ0VOUVFBZ0RDQUhhMEVGZENBS2FpSVJhMEVGZFNFU0lBNGhBVUVBSVFzRFFDQUNRUUJPQkVBQ1FFRUFJUUlEUUNBQ0lBZEdEUUZCQUNFRklBQW9BaEFnQWtFQ2RHb2dBU0FDSUE5cUlnWWdDQ2dDREVrRWZ5QUlLQUlRSUFaQkFuUnFLQUlBQlVFQUN5QUpLQUlRSUFrb0Fnd2dBa0VGZENBUmFoQm9JQkJ6SWdWcUlnRnFJZ1kyQWdBZ0FTQUZTU0FCSUFaTGNpRUJJQUpCQVdvaEFnd0FDd0FMQlNBQ1FRVjBJQkZxSVFZQ1FBSi9Ba0FnQWlBUGFpSUtRUUJPSUFvZ0UwbHhSUVJBSUFaQllVZ2lGVVVFUUVFQUlRVWdCaUFOU0EwQ0N5QUtRUjkxSUJSeElnSWdFaUFDSUJKSUd5QUNJQlViSVFKQkFDRUZRUUFoQ2d3REN5QUlLQUlRSUFwQkFuUnFLQUlBSVFWQkFDQUdRV0ZJSUFZZ0RVNXlEUUVhQ3lBSktBSVFJQXdnQmhCb0N5RUtJQUpCQVdvaEFnc2dDaUFRY3lJR0lBVnFJZ1VnQmtrZ0JTQUJJQVZxSWdWTGNpRUJJQVVnQzNJaEN3d0JDd3NnQUNnQ0VDSUNJQUlvQWdBZ0MwRUFSM0kyQWdBZ0RpQUJSWElOQUNBQUlBZEJBV29RUVEwQklBQW9BaEFnQjBFQ2RHcEJBVFlDQUNBQUlBQW9BZ2hCSUdvMkFnZ0xJQUFnQXlBRUVMTUNEd3NnQUJBMVFTQUwyZ0VCQW40Q1FBSkFJQUpGQkVBZ0FVS0FnSUNBY0lNaEJTQUFRUzhRTFNFRURBRUxBbjRnQVVLQWdJQ0FjSU1pQlVLQWdJQ0FNRklnQXlrREFDSUVRb0NBZ0lCd2cwS0FnSUNBZ0g5U2NrVUVRQ0FBUWJ1VUFTQUFJQUFvQWhBZ0JLY1F3UUlRTFVHdGxBRVF2Z0VNQVFzZ0FDQUVFQ2dMSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVFzZ0JVS0FnSUNBTUZFTkFDQUFJQUZCQlJCbElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUFJQUVnQkJEYkFTQUFJQUZCTUNBRXB5a0NCRUwvLy8vL0I0TkJBQkFaR2dzZ0FTRUVDeUFFQzFVQkFYNGdBQ0FEclNBRXJTQUJJQUpCSDNVaUFHdXRmaUFBSUFOeElBSnFyWHhDSUlpbklBRnFJZ0N0UW4rRmZpQUNyU0FCclVJZ2hvUjhJZ1ZDSUlpbklnRWdBM0VnQmFkcU5nSUFJQUFnQVdwQkFXb0x0Z1VCQzM4Q1FBSkFBa0FDUUFKQUFrQWdBMEVDVFFSQUlBQW9BZ0JCQUNBRFFRRjBJZ2RCQVhJaUNFRUNkQ0FBS0FJRUVRRUFJUVlnQUNnQ0FFRUFJQU5CQW5SQkNHb2dBQ2dDQkJFQkFDSUZSU0FHUlhJTkFnTkFJQVFnQjBaRkJFQWdCaUFFUVFKMGFrRUFOZ0lBSUFSQkFXb2hCQXdCQ3dzZ0JpQUhRUUowYWtFQk5nSUFJQUFnQlNBR0lBZ2dBaUFERUtVRURRSWdBMEVCYWlFQ1FRQWhCQU5BSUFJZ0JFWkZCRUFnQVNBRVFRSjBJZ2RxSUFVZ0Iyb29BZ0EyQWdBZ0JFRUJhaUVFREFFTEN5QUdJQU1RcUFNTkFTQUJRUUVnQWhEWUFob01BUXNnQUNnQ0FFRUFJQU1nQTBFQmEwRUJkaUlIYXlJSUlBTnFJZ1JCQVdvaURFRUNkQ0FBS0FJRUVRRUFJZ1ZGSUFBb0FnQkJBQ0FJUVF4c1FRaHFJQUFvQWdRUkFRQWlCa1Z5RFFFZ0FDQUJJQWRCQW5RaUNXb2lDaUFDSUFscUlBZ1FtUVlOQWlBQUlBVWdBaUFESUFvZ0NFRUJhaUlKRU5jQ0RRSWdCU0FEUVFKMGFpRUxJQVVnQkVFQ2RHb2hEUU5BSUEwb0FnQUVRQ0FLUVFFZ0NSRFlBaG9nQ3lBRklBVWdBaUFERUpnQ0lBa1EyQUlhREFFTEN5QU1RUUFnREVFQVNoc2hBMEVBSVFKQkFDRUVBMEFnQXlBRVJrVUVRQ0FGSUFSQkFuUnFJZ3RCQUNBTEtBSUFJZ3RySWc0Z0FtczJBZ0FnQzBFQVJ5QUNJQTVMY2lFQ0lBUkJBV29oQkF3QkN3c2dEU0FOS0FJQVFRRnFOZ0lBSUFBZ0JpQUZJQWRCQW5ScUlBd2dCMnNnQ2lBSkVOY0NEUUlnQ0VFQmRDSUNJQWRySVFOQkFDRUVBMEFnQkNBSFJrVUVRQ0FCSUFSQkFuUnFJQVlnQXlBRWFrRUNkR29vQWdBMkFnQWdCRUVCYWlFRURBRUxDeUFLSUFvZ0JpQUNRUUowYWlBSUVLb0VHZ3RCQUNFRUlBQW9BZ0FnQlVFQUlBQW9BZ1FSQVFBYURBTUxJQVZGRFFFTElBQW9BZ0FnQlVFQUlBQW9BZ1FSQVFBYUMwRi9JUVFnQmtVTkFRc2dBQ2dDQUNBR1FRQWdBQ2dDQkJFQkFCb0xJQVFMYndJRGZ3RitJQUt0UWlDR0lBT3RnRUwvLy8vL0Q0TWhDRUVCSVFVRFFDQUJJQVpHUlFSQUlBQWdCa0VDZEdvaUJ5QUhLQUlBSUFVZ0F5QUVFTllDTmdJQUlBSWdCV3dnQ0NBRnJYNUNJSWluSUFOc2F5SUZJQU5CQUNBRElBVk5HMnNoQlNBR1FRRnFJUVlNQVFzTEMxOEJBbjhnQWtFZmNTRUVJQUVnQWtFRmRTSUNTd1JBSUFBZ0FrRUNkR29pQlNBRktBSUFJQU1nQkhSeU5nSUFDd0pBSUFSRkRRQWdBU0FDUVFGcUlnRk5EUUFnQUNBQlFRSjBhaUlBSUFBb0FnQWdBMEVnSUFScmRuSTJBZ0FMQzFRQ0EzOENmaUFEclNFSFFRQWhBd05BSUFJZ0EwWkZCRUFnQUNBRFFRSjBJZ1ZxSWdZZ0JqVUNBQ0FFclNBQklBVnFOUUlBSUFkK2ZId2lDRDRDQUNBSVFpQ0lweUVFSUFOQkFXb2hBd3dCQ3dzZ0JBdlZBZ0lKZndGK1FYOGhCZ0pBSUFBZ0FTQURRUk1nQTBFQmRpSUhJQWRCRTA4YklBTkJGRWdiSWdjZ0F5QUhheUlJUVFFZ0IzUWlDVUVCSUFoMElneEJBQ0FGRUtjRURRQWdBQ0FDSUFjZ0NDQUpJQXhCQUNBRkVLY0VEUUFDUUNBRElBZEhCRUJCQUNFR0EwQWdCaUFKUmcwQ0lBQWdBU0FHSUFoMFFRSjBJZ05xSUFJZ0Eyb2dDQ0FFSUFVUW5RWWFJQVpCQVdvaEJnd0FDd0FMSUFBZ0JVR29BV3hxSUFSQkEzUnFJZ1JCekJOcU5RSUFJUThnQkVISUUyb29BZ0FoRFNBRlFRSjBJZ1pCa0trRWFpZ0NBQ0VFSUFBZ0Jtb29BZ1FoRGtFQUlRWURRQ0FHSUFOMkRRRWdBU0FHUVFKMElncHFJZ3NnQ3lnQ0FDSUxJQVJCQUNBRUlBdE5HMnNnQWlBS2FpZ0NBQ0FFSUE0UTFnSWlDaUFOYkNBRUlBcXRJQTkrUWlDSXAyeHJOZ0lBSUFaQkFXb2hCZ3dBQ3dBTFFYOUJBQ0FBSUFFZ0J5QUlJQWtnREVFQklBVVFwd1FiSVFZTElBWUxvUUVDQTM4Q2ZpQUROUUlBSVFnRFFDQUNJQVZHUlFSQUlBQWdCVUVDZENJSGFpQUdyU0FCSUFkcU5RSUFJQWgrZkNJSlBnSUFJQVZCQVdvaEJTQUpRaUNJcHlFR0RBRUxDeUFBSUFKQkFuUnFJQVkyQWdCQkFTQUVJQVJCQVUwYklRUkJBU0VGQTBBZ0JDQUZSa1VFUUNBQUlBSWdCV3BCQW5ScUlBQWdCVUVDZENJR2FpQUJJQUlnQXlBR2FpZ0NBQkNjQmpZQ0FDQUZRUUZxSVFVTUFRc0xDNVVTQWhwL0FuNENRQ0FBS0FJNElnb05BQ0FBS0FJQVFRQkJ1Qm9nQUNnQ0JCRUJBQ0lLUlFSQVFYOFBDeUFLUVFScVFRQkJ0Qm9RS3hvZ0FDQUtOZ0k0SUFvZ0FEWUNBQU5BSUFsQkJVWUVRRUVBSVFkQkFDRUlBMEFnQjBFRVJnMERJQWRCQVdvaUJ5RUFBMEFnQUVFRlJnMEJJQW9nQ0VFQ2RDSU5ha0dRR21vZ0RVSGdxUVJxTlFJQVFpQ0dJQUJCQW5SQmtLa0VhalVDQUlBK0FnQWdBRUVCYWlFQUlBaEJBV29oQ0F3QUN3QUxBQXNnQ2lBSlFRSjBJZ3RxUW9DQWdJQ0FnSUNBSUNBTFFaQ3BCR29vQWdBaURhMGlJWUNuSWc0MkFnUkJBU0VJSUExQkFXcEJBWFloREVFQUlRZEJBQ0VBQTBBZ0FFRVZSd1JBSUFvZ0NVR29BV3hxSUFCQkEzUnFJaEJCekJOcUlBaXRRaUNHSUNHQVBnSUFJQkJCeUJOcUlBZzJBZ0FnQUVFQmFpRUFJQWdnRENBTklBNFExZ0loQ0F3QkN3c0RRQUpBSUFkQkFrY0VRQ0FIUVJSc0lBdHFRYkNwQkdvb0FnQWhBRUVBSVFnRFFDQUlRUlJHRFFJZ0NpQUpRYWdCYkdvZ0IwSFVBR3hxUVJRZ0NHdEJBblJxSWd3Z0FLMUNJSVlnSVlBK0F1QUdJQXdnQURZQ0dDQUlRUUZxSVFnZ0FDQUFJQTBnRGhEV0FpRUFEQUFMQUFzZ0NVRUJhaUVKREFJTElBZEJBV29oQnd3QUN3QUxBQXNnQXlBRmFpSVFRUVYwSVE5QkJDRUxRUU1oQ1VFQUlRZEJBQ0VPUVg4aERRTkFJQWxCQmtjRVFFSGNBRUVBSUFsclFRSjBRZFNsQkdvb0FnQWlFVUVFYTBFQ2JTSUFJQUJCM0FCT0d5RUFBMEFDUUVFZ0lBQkJBV3NpQ0NBUGFpQUFiaUlNUVFGcloydEJBQ0FNUVFKUEd5SU1RUlJMRFFBZ0VTQU1JQUJCQVhScVRnUkFJQXhCQVdvZ0RIUWdDV3dpQ0NBTlR3MEJJQUFoQnlBTUlRNGdDU0VMSUFnaERRd0JDeUFJSWdBTkFRc0xJQWxCQVdvaENRd0JDd3NnQndSQUFrQUNRQUpBSUFaQkEzRkZCRUFnQmtFRWNRMEJJQUZCQUJCQkdnd0JDeUFHUVFKeERRRUxJQVVoRENBRUlRME1BUXNnQXlFTUlBSWhEU0FGSVFNZ0JDRUNDeUFLS0FJQUlnQW9BZ0JCQUNBTFFRUWdEblFpQ0d3aUVTQUFLQUlFRVFFQUlnUUVmeUFLSUFSQkFTQU9kQ0lGSUFJZ0EwRTlJQWRCUFNBT2RDQVBUeHNnQnlBSFFUMUtHeUlDUVFVZ0Myc2lCeUFMRUtrRUlBWkJCM0ZCQVVZRVFDQUJRUUFRUVJvTElBWkJCSEVoQXlBS0tBSUFJZ0FvQWdBaEJpQUFLQUlFSVFrQ1FBSkFBa0FDUUNBT1FRMU5CRUJCQUNFQUlBWkJBQ0FSSUFrUkFRQWlDVVVOQWlBS0lBa2dCU0FOSUF3Z0FpQUhJQXNRcVFRZ0F3MEJJQUZCQUJCQkdnd0JDMEVBSVFBZ0JrRUFJQWdnQ1JFQkFDSUpSUTBCQ3lBTFFRQWdDMEVBU2hzaEJ5QU9RUTVKSVE4Q1FBTkFJQUFnQjBZTkFRSi9JQTlGQkVBZ0NpQUpJQVVnRFNBTUlBSWdBQ0FMYTBFRmFpSUlRUUVRcVFRZ0FDQU9kQ0VHSUFrTUFRc2dBQ0FMYTBFRmFpRUlJQWtnQUNBT2RDSUdRUUowYWdzaEVTQUFRUUZxSVFBZ0NpQUVJQVpCQW5ScUlCRWdEaUFPSUFnUW5RWkZEUUFMSUFraEFBd0JDeUFERFFGQkFDRUFJQUZCQUJCQkdpQUtJQWtRMVFJZ0FTQVFFRUZGRFFJTElBb29BZ0FpQVNnQ0FDQUVRUUFnQVNnQ0JCRUJBQm9nQ2lBQUVOVUNRWDhQQ3lBS0lBa1ExUUlMSUFFb0FoQWhBeUFRSVFVZ0JDRUpRUUFoQUVFQUlSQWpBRUhnQUdzaUJ5UUFJQUlpQmtFZmNTRUlRWDhnQW5SQmYzTWhCQ0FMUVFGcklnRWdDMnhCZm0xQkNtb2hGQU5BSUFCQkJVWUVRQUpBSUFaQkFXc2hBa0VBSUF0cklROUJBQ0VBQTBBZ0FFRUZSd1JBSUFkQklHb2dBRUVDZEdwQkFEWUNBQ0FBUVFGcUlRQU1BUXNMSUFOQkFDQUZRUUowRUNzaEVVRUJJQTUwSWdBZ0FpQUZRUVYwYWlBR2JpSURJQUFnQTBnYklnQkJBQ0FBUVFCS0d5RVZJQVJCZnlBSUd5RVdJQUpCQlhZaUF5QUJJQUVnQTBnYklSY2dBVUVBSUFGQkFFb2JJUmdnQzBFQUlBdEJBRW9iSVJrZ0MwRUNheUVNSUFOQkFXb2hEU0FQUVFKMFFhU3BCR29oRHlBVVFRSjBJZ0JCNEtrRWFpRVVJQUFnQ21wQmtCcHFJUm9nQVVFQ2RDSUFJQWRCSUdvaUFtb2hHeUFIUVVCcklBQnFJUndnQTBFQ2RDQUNhaUVkSUFjZ0FTQURhMEVDZEdvaEhpQUlRUjl6SVI4RFFFRUFJUUFnRUNBVlJnMEJBMEFnQUNBWlJnUkFRUUFoQUVFQUlRRURRQ0FBSUJoSEJFQWdCMEZBYXlBQVFRSjBhaUVTSUFCQkFXb2lBaUVBQTBBZ0FDQUxUZ1JBSUFJaEFBd0RCU0FBUVFKMElnUWdCMEZBYTJvaUV5QUVJQTlxS0FJQUlnUWdFeWdDQUNBU0tBSUFhMm9pRXlBVUlBRkJBblFpSUdvb0FnQnNJQVFnR2lBZ2FqVUNBQ0FUclg1Q0lJaW5iR3NpRXlBRVFRQWdCQ0FUVFJ0ck5nSUFJQUJCQVdvaEFDQUJRUUZxSVFFTUFRc0FDd0FMQ3lBSElCd29BZ0EyQWlCQkFTRUJJQXdoQkFOQUlBUkJBRW9FUUNBUElBUkJBblFpQUdvMUFnQWhJU0FIUVVCcklBQnFLQUlBSVFKQkFDRUFBMEFnQUNBQlJ3UkFJQWRCSUdvZ0FFRUNkR29pRWlBQ3JTQWhJQkkxQWdCK2ZDSWlQZ0lBSUFCQkFXb2hBQ0FpUWlDSXB5RUNEQUVMQ3lBSFFTQnFJQUZCQW5ScUlBSTJBZ0FnQkVFQmF5RUVJQUZCQVdvaEFRd0JDd3NnRHlBRVFRSjBhalVDQUNFaFFRQWhBQ0FIS0FKQUlRSURRQ0FBSUFGSkJFQWdBRUVDZENJRUlBZEJJR3BxSWhJZ0JDQUhhalVDQUNBQ3JTQWhJQkkxQWdCK2ZId2lJajRDQUNBaVFpQ0lweUVDSUFCQkFXb2hBQXdCQ3dzZ0FVRUNkQ0lBSUFkQklHcHFJQUFnQjJvb0FnQWdBbW8yQWdBZ0JpQVFiQ0VDUVFBaEFBTkFJQUFnQTBjRVFDQVJJQVVnQWlBSFFTQnFJQUJCQW5ScUtBSUFFSnNHSUFCQkFXb2hBQ0FDUVNCcUlRSU1BUXNMSUJFZ0JTQUNJQjBvQWdBaUFTQVdjUkNiQmlBTklRSWdBeUVBQWtBZ0NFVUVRQU5BSUFJZ0MwNE5BaUFISUFJZ0RXdEJBblJxSUFkQklHb2dBa0VDZEdvb0FnQTJBZ0FnQWtFQmFpRUNEQUFMQUFzRFFDQUFJQmRIQkVBZ0J5QUFJQU5yUVFKMGFpQUhRU0JxSUFCQkFXb2lBRUVDZEdvb0FnQWlBa0VCZENBZmRDQUJJQWgyY2pZQ0FDQUNJUUVNQVFzTElCNGdHeWdDQUNBSWRqWUNBQXNnRUVFQmFpRVFEQUlGSUFCQkFuUWlBU0FIUVVCcmFpQUpJQUFnRG5RZ0VHcEJBblJxS0FJQUlnSWdBU0FQYWlnQ0FDSUJRUUFnQVNBQ1RSdHJOZ0lBSUFCQkFXb2hBQXdCQ3dBTEFBc0FDd1VnQnlBQVFRSjBha0VBTmdJQUlBQkJBV29oQUF3QkN3c2dCMEhnQUdva0FDQUtLQUlBSWdBb0FnQWdDVUVBSUFBb0FnUVJBUUFhUVFBRlFYOExEd3NRQVFBTFN3RUNmeUFBSUFGSEJFQWdBQ2dDRUNJQ0JFQWdBQ2dDQUNJREtBSUFJQUpCQUNBREtBSUVFUUVBR2dzZ0FDQUJLUUlBTndJQUlBQWdBU2dDRURZQ0VDQUFJQUVwQWdnM0FnZ0xDNlFDQVFsL0lBRkJCbkVoQmlBQlFRSjJRUUZ4SVFwQjRPQURJUU1DUUFOQUlBTkJydjREVHcwQklBSWhCQ0FETFFBQUlnSkJIM0VoQlFKL0lBTkJBV29nQWtFRmRpSUNRUWRIRFFBYUlBTXNBQUVpQ0VIL0FYRWhBaUFJUVFCT0JFQWdBa0VIYWlFQ0lBTkJBbW9NQVFzZ0F5MEFBaUVKSUFoQnYzOU5CRUFnQWtFSWRDQUpja0g1L2dGcklRSWdBMEVEYWd3QkN5QURMUUFESUFKQkVIUnlJQWxCQ0hSeVFmbisvZ1ZySVFJZ0EwRUVhZ3NoQXlBQ0lBUnFRUUZxSVFJQ1FBSkFJQVZCSDBZRVFDQUdSUTBESUFaQkJrWU5BU0FFSUFwcUlRUURRQ0FDSUFSTkRRUWdBQ0FFSUFSQkFXb1FmaUVGSUFSQkFtb2hCQ0FGUlEwQUN3d0NDeUFCSUFWMlFRRnhSUTBDQ3lBQUlBUWdBaEIrUlEwQkN3dEJmeUVIQ3lBSEM3VUJBUWQvSUFBb0FnQWhCU0FBS0FJSUlRSURRQ0FCUVFGcUlnTWdCVTVGQkVBQ1FDQUNJQUZCQW5ScUtBSUFJZ2NnQWlBRFFRSjBhaWdDQUVZRVFDQUJJUU1NQVFzRFFBSkFJQUVpQTBFQmFpRUdJQUZCQTJvZ0JVNE5BQ0FDSUFaQkFuUnFLQUlBSUFJZ0EwRUNhaUlCUVFKMGFpZ0NBRVlOQVFzTElBSWdCRUVDZEdvaUFTQUhOZ0lBSUFFZ0FpQUdRUUowYWlnQ0FEWUNCQ0FFUVFKcUlRUUxJQU5CQW1vaEFRd0JDd3NnQUNBRU5nSUFDek1BSUFFQ2Z5QUNLQUpNUVFCSUJFQWdBQ0FCSUFJUXVnUU1BUXNnQUNBQklBSVF1Z1FMSWdCR0JFQVBDeUFBSUFGdUdndlBBUUVEZnlBQklBSXZBQUFnQWkwQUFrRVFkRUdBZ1B3QWNYSkpCRUFnQUVFQU5nSUFRUUFQQzBGL0lRVWdBU0FDSUFOQkFXc2lCRUVEYkdvaUF5OEFBQ0FETFFBQ1FSQjBja2tFZjBFQUlRTURRQ0FFSUFOclFRSklSUVJBSUFNZ0JHcEJBbTBpQlNBRUlBSWdCVUVEYkdvaUJDOEFBQ0FFTFFBQ1FSQjBRWUNBL0FCeGNpQUJTeUlHR3lFRUlBTWdCU0FHR3lFRERBRUxDeUFBSUFJZ0EwRURiR29pQUM4QUFDQUFMUUFDSWdCQkVIUkJnSUQ4QUhGeU5nSUFJQU5CQlhRZ0FFRUZkbkpCSUdvRlFYOExDOW9hQVFwL0lBQW9BZ1FoRFNBQUtBSUlJUXdEUUNBRklRY2dCRUVCYWlFSUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSi9Ba0FDUUFKQUlBUXRBQUFpQ1VFQmF3NGNBZ0VJQ1FZSEJSVVZBQW9LQ3c0TURSRVJFaElhR1FRRUR4QVlGeFlMUVFFaENTQUdSUTBmSUFjUEMwRUZJUW9nQ0NnQUFBd0JDMEVESVFvZ0NDOEFBQXNoQ0NBSElBMVBEUnNDUUNBTVJRUkFJQWRCQVdvaEJTQUhMUUFBSVFrTUFRc2dCeThCQUNJSlFZRDRBM0ZCZ0xBRFJ5QU1RUUpIY2lBTklBZEJBbW9pQlUxeURRQWdCUzhCQUNJTFFZRDRBM0ZCZ0xnRFJ3MEFJQWxCQ25SQmdQZy9jU0FMUWY4SGNYSkJnSUFFYWlFSklBZEJCR29oQlFzZ0JDQUthaUVFSUFBb0FoZ0VmeUFKSUFBb0Fod1EzUUVGSUFrTElBaEdEU0FNR3dzZ0FDQUJJQUlnQXlBRUtBQUJJQVJCQldvaUJHb2dCeUFKUVJaclFRQVFyZ1JCQUU0Tkh3d1pDeUFJS0FBQUlBaHFRUVJxSVFRTUZ3c2dDQ0VFSUFVZ0FDZ0NBQ0lIUmcwZElBQW9BaFJGRFJnQ1FDQU1SUVJBSUFWQkFXc3RBQUFoQ2d3QkN5QUZRUUpyTHdFQUlncEJnUGdEY1VHQXVBTkhJQXhCQWtkeURRQWdCeUFGUVFScklnZExEUUFnQnk4QkFDSUhRWUQ0QTNGQmdMQURSdzBBSUFwQi93ZHhJQWRCL3dkeFFRcDBja0dBZ0FScUlRb0xJQW9RclFRTkhRd1lDeUFJSVFRZ0J5QU5JZ1ZHRFJ3Z0FDZ0NGRVVORndKQUlBeEZCRUFnQnkwQUFDRUpEQUVMSUFjdkFRQWlDVUdBK0FOeFFZQ3dBMGNnREVFQ1IzSWdCMEVDYWlBTlQzSU5BQ0FITHdFQ0lnVkJnUGdEY1VHQXVBTkhEUUFnQ1VFS2RFR0ErRDl4SUFWQi93ZHhja0dBZ0FScUlRa0xJQWNoQlNBSkVLMEVEUndNRndzZ0J5QU5SZzBXQWtBZ0RFVUVRQ0FIUVFGcUlRVWdCeTBBQUNFSkRBRUxJQWN2QVFBaUNVR0ErQU54UVlDd0EwY2dERUVDUjNJZ0RTQUhRUUpxSWdWTmNnMEFJQVV2QVFBaUJFR0ErQU54UVlDNEEwY05BQ0FKUVFwMFFZRDRQM0VnQkVIL0IzRnlRWUNBQkdvaENTQUhRUVJxSVFVTElBZ2hCQ0FKRUswRVJRMGJEQllMSUFjZ0RVWU5GU0FNUlFSQUlBZEJBV29oQlNBSUlRUU1Hd3NnQjBFQ2FpRUZJQWdoQkNBSEx3RUFRWUQ0QTNGQmdMQURSeUFNUVFKSGNnMGFJQVVnRFU4TkdpQUhRUVJxSUFVZ0J5OEJBa0dBK0FOeFFZQzRBMFliSVFVTUdnc2dDQzBBQUNJRklBQW9BZ3hQRFFrZ0NTQUZRUUYwYWtFQ2RDQUJha0VzYXlBSE5nSUFJQVJCQW1vaEJBd1NDeUFFTFFBQ0lna2dBQ2dDREU4TkJ5QUVRUU5xSVFRZ0NDMEFBQ0VGQTBBZ0JTQUpTdzBTSUFFZ0JVRURkR3BDQURjQ0FDQUZRUUZxSVFVTUFBc0FDeUFDSUFOQkFuUnFJQVFvQUFFMkFnQWdBMEVCYWlFRElBUkJCV29oQkF3UUN5QURRUUZySVFNTURnc2dCQ2dBQVNFRklBTkJBblFnQW1wQkJHc2lDQ0FJS0FJQVFRRnJJZ2cyQWdBZ0JDQUZRUUFnQ0J0cVFRVnFJUVFNRGdzZ0FpQURRUUowYWlBSE5nSUFJQU5CQVdvaEF3d01DeUFFSUFRb0FBRkJBQ0FDSUFOQkFXc2lBMEVDZEdvb0FnQWdCMGNiYWtFRmFpRUVEQXdMUVFBaEMwRUFJUW9nQUNnQ0FDSUVJQWRIQkVBQ1FDQU1SUVJBSUFkQkFXc3RBQUFoQlF3QkN5QUhRUUpyTHdFQUlnVkJnUGdEY1VHQXVBTkhJQXhCQWtkeURRQWdCQ0FIUVFScklnUkxEUUFnQkM4QkFDSUVRWUQ0QTNGQmdMQURSdzBBSUFWQi93ZHhJQVJCL3dkeFFRcDBja0dBZ0FScUlRVUxJQVVRcndNaENnc2dCeUFOU1FSQUFrQWdERVVFUUNBSExRQUFJUVVNQVFzZ0J5OEJBQ0lGUVlENEEzRkJnTEFEUnlBTVFRSkhjaUFIUVFKcUlBMVBjZzBBSUFjdkFRSWlCRUdBK0FOeFFZQzRBMGNOQUNBRlFRcDBRWUQ0UDNFZ0JFSC9CM0Z5UVlDQUJHb2hCUXNnQlJDdkF5RUxDeUFISVFVZ0NDRUVRUklnQ1dzZ0NpQUxjMFlORWd3TkN5QUVMUUFCSWdnZ0FDZ0NERThORENBRVFRSnFJUVFnQVNBSVFRTjBhaUlIS0FJQUlnaEZEUkVnQnlnQ0JDSUtSUTBSSUFsQkUwWU5DQU5BSUFnZ0NrOE5FaUFGSUFBb0FnQWlEa1lORFFKQUFrQUNRQ0FNQkVBZ0NrRUNheUlITHdFQUlnbEJnUGdEY1VHQXVBTkhJQXhCQWtkeUlBY2dDRTF5RFFFZ0NrRUVheUlLTHdFQUlndEJnUGdEY1VHQXNBTkhEUUVnQ1VIL0IzRWdDMEgvQjNGQkNuUnlRWUNBQkdvaENRd0NDeUFGUVFGcklnVXRBQUFoQ3lBS1FRRnJJZ290QUFBaENRd0NDeUFISVFvTEFrQWdCVUVDYXlJSEx3RUFJZ3RCZ1BnRGNVR0F1QU5ISUF4QkFrZHlJQWNnRGsxeURRQWdCVUVFYXlJRkx3RUFJZzVCZ1BnRGNVR0FzQU5IRFFBZ0MwSC9CM0VnRGtIL0IzRkJDblJ5UVlDQUJHb2hDd3dCQ3lBSElRVUxJQUFvQWhnRWZ5QUpJQUFvQWh3aUJ4RGRBU0VKSUFzZ0J4RGRBUVVnQ3dzZ0NVWU5BQXNNREF0QjdpbEJ3UHdBUWQwUlFjN1hBQkFBQUF0QjF5bEJ3UHdBUWRRUlFjN1hBQkFBQUFzZ0JFRUZhaUlJSUFnZ0JDZ0FBV29pQ2lBSlFRbEdJZ3NiSVFSQmZ5RUpJQUFnQVNBQ0lBTWdDaUFJSUFzYklBZEJBRUVBRUs0RVFRQk9EUTRNQ3dzUUFRQUxJQVJCRVdvaUVDQUVLQUFCYWlFTElBUW9BQWtoRHlBRUtBQUZJUTVCQUNFS0EwQUNRQUpBSUFBZ0FTQUNJQU1nRUNBRlFRRVFwUVlpQ1VFQmFnNENEQUVBQ3lBS1FRRnFJUW9nQ1NFRklBOUIvLy8vL3dkR0lBb2dEMGx5RFFFTEN5QUtJQTVKRFFjZ0N5RUVJQW9nRGswTkRDQUFJQUVnQWlBRElBZ2dCVUVESUFvZ0Rtc1FyZ1JCQUU0TkRBd0dDeUFISUFBb0FnQWlDVVlOQmlBTVJRUkFJQWRCQVdzaEJTQUlJUVFNREFzZ0IwRUNheUVGSUFnaEJDQU1RUUpIRFFzZ0JTOEJBRUdBK0FOeFFZQzRBMGNnQlNBSlRYSU5DeUFIUVFScklnY2dCU0FITHdFQVFZRDRBM0ZCZ0xBRFJoc2hCUXdMQ3lBSElBMVBEUVVDUUNBTVJRUkFJQWRCQVdvaEJTQUhMUUFBSVFnTUFRc2dCeThCQUNJSVFZRDRBM0ZCZ0xBRFJ5QU1RUUpIY2lBTklBZEJBbW9pQlUxeURRQWdCUzhCQUNJSlFZRDRBM0ZCZ0xnRFJ3MEFJQWhCQ25SQmdQZy9jU0FKUWY4SGNYSkJnSUFFYWlFSUlBZEJCR29oQlFzZ0JDOEFBU0VISUFBb0FoZ0VRQ0FJSUFBb0Fod1EzUUVoQ0FzZ0NDQUVRUU5xSWdvb0FBQkpEUVZCQUNFTElBZ2dCQ0FIUVFGcklnbEJBM1JxS0FBSFN3MEZBMEFnQ1NBTFNRMEdJQW9nQ1NBTGFrRUJkaUlFUVFOMGFpSU9LQUFBSUFoTEJFQWdCRUVCYXlFSkRBRUxJQTRvQUFRZ0NFa0VRQ0FFUVFGcUlRc01BUXNMSUFvZ0IwRURkR29oQkF3S0N5QUhJQTFQRFFRQ1FDQU1SUVJBSUFkQkFXb2hCU0FITFFBQUlRZ01BUXNnQnk4QkFDSUlRWUQ0QTNGQmdMQURSeUFNUVFKSGNpQU5JQWRCQW1vaUJVMXlEUUFnQlM4QkFDSUpRWUQ0QTNGQmdMZ0RSdzBBSUFoQkNuUkJnUGcvY1NBSlFmOEhjWEpCZ0lBRWFpRUlJQWRCQkdvaEJRc2dCQzhBQVNFSElBQW9BaGdFUUNBSUlBQW9BaHdRM1FFaENBc2dDQ0FFUVFOcUlnb3ZBQUJKRFFRQ1FDQUVJQWRCQVdzaUNVRUNkR292QUFVaUJFSC8vd05HSUFoQi8vOERUM0VOQUNBRUlBaEpEUVZCQUNFRUEwQWdCQ0FKU3cwR0lBaEIvLzhEY1NJT0lBb2dCQ0FKYWtFQmRpSUxRUUowYWlJUEx3QUFTUVJBSUF0QkFXc2hDUXdCQ3lBUEx3QUNJQTVQRFFFZ0MwRUJhaUVFREFBTEFBc2dDaUFIUVFKMGFpRUVEQWtMQTBBZ0NDQUtUdzBKSUFVZ0RVOE5CQUovQW44Q1FDQU1CRUFnQ0M4QkFDSUpRWUQ0QTNGQmdMQURSeUFNUVFKSGNpQUlRUUpxSWdjZ0NrOXlEUUVnQnk4QkFDSUxRWUQ0QTNGQmdMZ0RSdzBCSUFsQkNuUkJnUGcvY1NBTFFmOEhjWEpCZ0lBRWFpRUpJQWhCQkdvTUFnc2dCUzBBQUNFTElBZ3RBQUFoQ1NBSVFRRnFJUWdnQlVFQmFnd0NDeUFIQ3lFSUFrQWdCUzhCQUNJTFFZRDRBM0ZCZ0xBRFJ5QU1RUUpIY2lBRlFRSnFJZ2NnRFU5eURRQWdCeThCQUNJT1FZRDRBM0ZCZ0xnRFJ3MEFJQXRCQ25SQmdQZy9jU0FPUWY4SGNYSkJnSUFFYWlFTElBVkJCR29NQVFzZ0J3c2hCU0FBS0FJWUJIOGdDU0FBS0FJY0lnY1EzUUVoQ1NBTElBY1EzUUVGSUFzTElBbEdEUUFMREFNTElBZ2hCQXdIQ3lBSElRVU1CZ3RCZnc4TFFRQWhDU0FHRFFFTElBQW9BakFoQlFOQUlBa2hBeUFGUlFSQUlBTVBDd0pBQWtBQ1FBSkFJQUFvQWlnZ0JVRUJheUlGSUFBb0FpUnNhaUlJTFFBQUlnUU9CQUFDQWdFQ0MwRUJJUWtnQXcwQ0RBVUxRUUVoQ1NBRERRRWdBU0FJUVJCcUlnTWdBQ2dDREVFRGRCQWZHaUFDSUFNZ0FDZ0NERUVEZEdvZ0NDMEFBU0lEUVFKMEVCOGFJQWdvQWdnaEJTQUlLQUlNSWdrb0FBd2hDa0VBSVFRRFFBSi9Ba0FnQkNBS1J3UkFJQVZCQVdzZ0RFVU5BaG9nQlVFQ2F5RUhJQXhCQWtjTkFTQUhMd0VBUVlENEEzRkJnTGdEUncwQklBY2dBQ2dDQUUwTkFTQUZRUVJySWdVZ0J5QUZMd0VBUVlENEEzRkJnTEFEUmhzTUFnc2dDU2dBQUNFRUlBZ2dCVFlDQ0NBSUlBZ29BZ1JCQVdzaUJ6WUNCQ0FFSUFscVFSQnFJUVFnQncwSklBQWdBQ2dDTUVFQmF6WUNNQXdKQ3lBSEN5RUZJQVJCQVdvaEJBd0FDd0FMSUFOQkFDQUVRUUZHR3cwRVFRQWhDU0FERFFBZ0JFRUNSZzBEQ3lBQUlBVTJBakFNQUFzQUN5QUpEd3NnQVNBSVFSQnFJQUFvQWd4QkEzUVFIeG9MSUFnb0FnZ2hCU0FJS0FJTUlRUWdBaUFJSUFBb0FneEJBM1JxUVJCcUlBZ3RBQUVpQTBFQ2RCQWZHaUFBSUFBb0FqQkJBV3MyQWpBTUFBc0FDNHNDQVFkL0lBRkJBblJCd1A0RGFpZ0NBQ0lDSUFGQkFYUkJrSUFFYWk4QkFHb2hDRUVBSVFFQ1FBTkFJQUlnQ0U4TkFTQUNRUUZxSVFZQ1FBSkFJQUl0QUFBaUJFRS9UUVJBSUFNZ0JFRURkbXBCQVdvaEFpQUJCRUFnQUNBRElBSVFmZzBEQ3lBQlFRRnpJUUVnQkVFSGNTQUNha0VCYWlFRkRBRUxBbjhnQXlBRWFrSC9BR3NnQk1CQkFFZ05BQm9nQmkwQUFDRUZJQVJCM3dCTkJFQWdBa0VDYWlFR0lBTWdCRUVJZEdvZ0JXcEIvLzhBYXd3QkN5QUNRUU5xSVFZZ0FpMEFBaUFESUFSQkVIUnFJQVZCQ0hScWFrSC8vLzhDYXdzaEJTQURJUUlMSUFFRVFDQUFJQUlnQlJCK0RRRUxJQUZCQVhNaEFTQUdJUUlnQlNFRERBRUxDMEYvSVFjTElBY0xPQUJCc05RQ0lBRVFyd1FpQVVFQVNBUkFRWDRQQ3lBQUlBRkJIVTBFZjBJQklBR3RocWNGSUFGQkFuUkIyTmdDYWlnQ0FBc1FvUVlMTlFFQmZ5TUFRUkJySWdNa0FDQURJQUUyQWdnZ0F5QUNRUUZxTmdJTUlBQWdBMEVJYWtFQ0VMRUVJUUFnQTBFUWFpUUFJQUFMbHdJQkEzOGdBU2dDQUNJQ1FmNy9CMDhFUUNBQVFZWTdRUUFRT2tGL0R3c0NRQ0FDUVFGTkJFQWdBRUVDUVg4UXVBRWFEQUVMSUFFb0FnZ2dBa0VDZEdvaUJFRUVheWdDQUNJRFFYOUdCRUFnQkVFSWF5Z0NBQ0VEQ3lBQ1FRRjJJUUlnQTBILy93Tk5CRUFnQUVFVklBSVFzZ1JCQUNFQ0EwQWdBaUFCS0FJQVRnMENJQUFnQWtFQ2RDSURJQUVvQWdocUx3RUFFQ29nQUVGL0lBRW9BZ2dnQTBFRWNtb29BZ0JCQVdzaUF5QURRWDVHRzBILy93TnhFQ29nQWtFQ2FpRUNEQUFMQUFzZ0FFRVdJQUlRc2dSQkFDRUNBMEFnQWlBQktBSUFUZzBCSUFBZ0FrRUNkQ0lESUFFb0FnaHFLQUlBRUIwZ0FDQUJLQUlJSUFOQkJISnFLQUlBUVFGckVCMGdBa0VDYWlFQ0RBQUxBQXRCQUFzbUFRRi9JQUFvQWpnaUFVRUFTQVJBSUFBZ0FDQUFRVHhxUVFBUXF3WWlBVFlDT0FzZ0FRdmdBZ0VGZnlNQVFaQUJheUlFSkFBZ0FVRUFOZ0lBSUFBb0FpQWhBMEVCSVFZRFFDQUVJQU0yQW93QkFrQUNRQUpBSUFBb0Fod2lCeUFEVFFSQUlBWWhCUXdCQ3dKQUFrQUNRQUpBSUFNdEFBQWlCVUhiQUdzT0FnRUNBQXNnQlVFb1J3MEZJQU10QUFGQlAwY05BaUFETFFBQ1FUeEhEUVVnQXkwQUF5SUZRU0ZHSUFWQlBVWnlEUVVnQVVFQk5nSUFBa0FnQWtVTkFDQUVJQU5CQTJvMkFvd0JJQVFnQkVHTUFXb2dBQ2dDS0JDMUJBMEFJQVFnQWhEeUEwVU5CUXNnQmtFQmFpRUZJQVpCL1FGS0RRTWdCQ2dDakFFaEF5QUZJUVlNQlFzRFFDQUVJQU1pQlVFQmFpSUROZ0tNQVNBRElBZFBEUVVDUUNBRExRQUFRZHdBYXc0Q0FBWUJDeUFFSUFWQkFtb2lBellDakFFTUFBc0FDeUFFSUFOQkFXb2lBellDakFFTUF3c2dCa0g5QVVvaEJ5QUdRUUZxSWdVaEJpQUhSUTBDQzBGL0lBVWdBaHNoQmdzZ0JFR1FBV29rQUNBR0R3c2dBMEVCYWlFRERBQUxBQXRWQVFOL0lBQWdBV29oQkNBQ0VEOGhBMEVCSVFFRFFBSkFJQUFnQkU4RVFFRi9JUUVNQVFzZ0F5QUFFRDhpQlVZRVFDQUNJQUFnQXhCaFJRMEJDeUFCUVFGcUlRRWdBQ0FGYWtFQmFpRUFEQUVMQ3lBQkMrUWhBUmQvSXdCQjRBSnJJZ0lrQUVFTUlBRnJJUllnQVVFTGFpRVhJQUJCeEFCcUlSSWdBVUVUYWlFWUlBQkIzQUJxSVE4Z0FDZ0NCQ0VUQWtBQ1FBSkFBMEFnQUNnQ0dDSURJQUFvQWh4UERRTWdBeTBBQUNJRVFTbEdJQVJCL0FCR2NnMERJQUFvQWdRaEVDQUNJQU0yQWh3Q1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ2Z3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQVJCMndCckRnUUNBUU1JQUFzQ1FBSkFBa0FDUUFKQUlBUkJKR3NPQ3dFSkNRa0VDUmtaQ1FrQ0FBc2dCRUg3QUdzT0F3SUlCZ2NMSUFJZ0EwRUJhaUlJTmdJY0lBQkJCaEFSREJRTElBSWdBMEVCYWpZQ0hDQUFLQUkwSVFvZ0FVVU5DQ0FBUVJzUUVTQUFRUVJCQXlBQUtBSXdHeEFSREF3TElBQW9BaWdFUUNBQVFkVS9RUUFRT2d3WEN5QURMUUFCUVRwclFYWkpEUVVnQWlBRFFRRnFOZ0lnSUFKQklHcEJBUkRjQWhvQ1FDQUNLQUlnSWdNdEFBQWlCVUVzUncwQUlBSWdBMEVCYWpZQ0lDQURMUUFCSWdWQk9tdEJka2tOQUNBQ1FTQnFRUUVRM0FJYUlBSW9BaUF0QUFBaEJRc2dCVUgvQVhGQi9RQkhEUVVNRlFzQ1FDQURMUUFCUVQ5R0JFQkJBeUVIUVFBaENrRUFJUVZCQUNFR0FrQUNRQUpBQWtBZ0F5MEFBaUlFUVRwckRnUUFBd0VTQWdzZ0FDQURRUU5xTmdJWUlBQW9BalFoQ2lBQUlBRVE4Z0lOR2lBQ0lBQW9BaGcyQWh3Z0VDRURJQUFnQWtFY2FrRXBFTEFEUlEwU0RCb0xRUUVoQlVFRUlRY2dBeTBBQXlJRVFUMUdCRUJCQVNFR0RCRUxRUUVoQmlBRVFTRkdEUkFnQWlBRFFRTnFOZ0ljSUE4Z0FrRWNhaUFBS0FJb0VMVUVCRUFnQUVHYzV3QkJBQkE2REJvTElCSW9BZ0FnQUNnQ1NDQVBFS3dHUVFCS0JFQWdBRUdINXdCQkFCQTZEQm9MSUJJZ0R5QVBFRDlCQVdvUWNpQUFRUUUyQWp3TUF3c2dCRUVoUmcwUEN5QUFRY0hKQUVFQUVEb01Gd3NnQWlBRFFRRnFOZ0ljSUJKQkFCQVJDeUFBS0FJMElncEIvd0ZPQkVBZ0FFR3FPVUVBRURvTUZnc2dBQ0FLUVFGcU5nSTBJQUFvQWdRaEF5QUFJQmNnQ2hDcEFpQUFJQUlvQWh3MkFoZ2dBQ0FCRVBJQ0RSVWdBaUFBS0FJWU5nSWNJQUFnRmlBS0VLa0NJQUFnQWtFY2FrRXBFTEFEUlEwTkRCVUxBa0FDUUFKQUFrQUNRQUpBQWtBZ0F5MEFBU0lFUVRCckRoTURCQVFFQkFRRUJBUUVDZ29LQ2dvS0Nnb0JBQXNnQkVIckFFWU5BU0FFUWVJQVJ3MEpDeUFBUVJGQkVpQUVRZUlBUmhzUUVTQURRUUpxSVFnTUVnc0NRQ0FETFFBQ1FUeEhCRUJCOHVZQUlRVWdBQ2dDS0EwQklBQVF0QVFOQVF3SkN5QUNJQU5CQTJvMkFpQWdEeUFDUVNCcUlBQW9BaWdRdFFRRVFFR2M1d0FoQlNBQUtBSW9EUUVnQUJDMEJBMEJEQWtMSUJJb0FnQWdBQ2dDU0NBUEVLd0dJZ1JCQUU0TkF5QUFJQUpCd0FKcUlBOFFxd1lpQkVFQVRnMERRZnY1QUNFRklBQW9BaWdOQUNBQUVMUUVSUTBJQ3lBQUlBVkJBQkE2REJnTElBSWdBMEVDYWpZQ0hDQURMUUFDSVFZZ0FDZ0NLQVJBUVFBaEJDQUdRVHByUVhaSkRRZ2dBRUhJelFCQkFCQTZEQmdMUVFBaEJDQUdRZmdCY1VFd1J3MEhJQUlnQTBFRGFqWUNIQ0FHUVRCcklRUWdBeTBBQXlJR1FmZ0JjVUV3UncwSElBSWdBMEVFYWpZQ0hDQUVRUU4wSUFacVFUQnJJUVFNQndzZ0FpQURRUUZxSWdVMkFod2dBa0VjYWtFQUVOd0NJZ1JCQUU0RVFDQUVJQUFvQWpSSURRSWdBQkNxQmlBRVNnMENDeUFBS0FJb1JRUkFJQUlnQlRZQ0hDQUZMUUFBSWdSQk4wMEVRRUVBSVFZZ0JFRXpUUVJBSUFJZ0EwRUNhaUlGTmdJY0lBUkJNR3NoQmlBRExRQUNJUVFMSUFSQitBRnhRVEJIQkVBZ0JpRUVEQWtMSUFJZ0JVRUJhallDSENBRVFmOEJjU0FHUVFOMGFrRXdheUVFSUFVdEFBRWlBMEg0QVhGQk1FY05DQ0FDSUFWQkFtbzJBaHdnQkVFRGRDQURha0V3YXlFRURBZ0xJQUlnQTBFQ2FqWUNIQXdIQ3lBQVFmWE5BRUVBRURvTUZnc2dBaUFDS0FJZ05nSWNDeUFBS0FJMElRb2dBQ2dDQkNFRElBQWdHQ0FFRUtrQ0RBd0xJQUFvQWpRaENpQUJCRUFnQUVFYkVCRUxJQUFvQWtBaEJDQUNRVFEyQXRBQ0lBSWdCRFlDekFJZ0FrRUFOZ0xJQWlBQ1FnQTNBc0FDSUFJZ0EwRUJhaUlITmdMVUFpQURMUUFCSWdSQjNnQkhJZ2dOQmlBQ0lBTkJBbW9pQnpZQzFBSkJBQXdIQ3lBQUtBSW9SUTBCSUFCQjFUOUJBQkE2REJJTElBUkJQMFlORUFzZ0FDQUNRUWhxSUFKQkhHcEJBQkN6QkNJRVFRQklEUkFMSUFBb0FqUWhDaUFBS0FJRUlRTWdBUVJBSUFCQkd4QVJDd0pBSUFSQmdJQ0FnQVJPQkVBZ0FDQUNRUWhxRUtrR0lRUWdBaWdDRkNBQ0tBSVFRUUFnQWlnQ0dCRUJBQm9nQkVVTkFRd1JDeUFBS0FJc0JFQWdCQ0FBS0FJb0VOMEJJUVFMSUFSQi8vOERUQVJBSUFCQkFTQUVFTElFREFFTElBQkJBaUFFRUxnQkdnc2dBVVVOQnlBQVFSc1FFUXdIQ3lBQVFRUkJBeUFBS0FJd0d4QVJEQVFMSUFJZ0EwRUJhaUlJTmdJY0lBQkJCUkFSREFrTFFRRUxJUVVEUUNBRlJRUkFJQWN0QUFBaEJFRUJJUVVNQVFzQ1FBSkFBa0FDUUNBRVFmOEJjVUhkQUVjRVFDQUFJQUpCckFKcUlBSkIxQUpxUVFFUXN3UWlBMEVBU0EwREFrQUNRQUpBQWtBZ0FpZ0MxQUlpQnkwQUFFRXRSdzBBSUFjdEFBRkIzUUJHRFFBZ0FpQUhRUUZxTmdJZ0lBTkJnSUNBZ0FSUEJFQWdBQ2dDS0VVTkFTQUNLQUs0QWlBQ0tBSzBBa0VBSUFJb0Fyd0NFUUVBR2d3REN5QUFJQUpCckFKcUlBSkJJR3BCQVJDekJDSUdRUUJJRFFjZ0JrR0FnSUNBQkVrTkFTQUNLQUs0QWlBQ0tBSzBBa0VBSUFJb0Fyd0NFUUVBR2lBQUtBSW9EUUlMSUFOQmdJQ0FnQVJKRFFJZ0FrSEFBbW9nQWlnQ3RBSWlBeUFDS0FLc0FoQ3hCQ0VHSUFJb0FyZ0NJQU5CQUNBQ0tBSzhBaEVCQUJvZ0JrVU5Cd3dGQ3lBQ0lBSW9BaUFpQnpZQzFBSWdBeUFHVFEwREN5QUFRYWJyQUVFQUVEb01CQXNnQWtIQUFtb2dBeUFERUtnR1JRMEVEQUlMSUFBb0Fpd0VRQ0FDUVRRMkFqQWdBaUFDS0FMTUFqWUNMQ0FDUVFBMkFpZ2dBa0lBTndJZ0lBSkM0WUNBZ0xBUE53TFlBa0VCSVFVZ0FrRWdhaUFDS0FMSUFpQUNLQUxBQWlBQ1FkZ0Nha0VDUVFFUTJ3SWhCQ0FDS0FJb0lRTWdCRVVFUUVFQUlRVWdBaWdDSUNJRVFRQWdCRUVBU2hzaEJnTkFJQVVnQmtaRkJFQWdBeUFGUVFKMGFpSUpJQWtvQWdCQklHczJBZ0FnQlVFQmFpRUZEQUVMQ3lBQ1FjQUNhaUFESUFRUXNRUWhCUXNnQWlnQ0xDQURRUUFnQWlnQ01CRUJBQm9nQlEwQ0N5QUlSUVJBSUFKQndBSnFFTm9DRFFJTElBQWdBa0hBQW1vUXFRWU5BaUFDS0FMTUFpQUNLQUxJQWtFQUlBSW9BdEFDRVFFQUdpQUNJQWRCQVdvMkFod2dBVVVOQmd3RkN5QUNRY0FDYWlBRElBWVFxQVpGRFFJTElBQVFxQUlMSUFJb0Fzd0NJQUlvQXNnQ1FRQWdBaWdDMEFJUkFRQWFEQTBMUVFBaEJRd0FDd0FMSUFCQkd4QVJDeUFRSVFNTUFRc2dBeUFIYWlFSFFYOGhBd0pBSUFVTkFDQUFLQUlvRFFBZ0FDZ0NOQ0VLSUJBaEF3c2dBRUVZUVJjZ0JFRWhSaHRCQUJDNEFTRUVJQUFnQnpZQ0dDQUFJQVlROGdJTkNDQUNJQUFvQWhnMkFod2dBQ0FDUVJ4cVFTa1FzQU1OQ0NBQVFRb1FFU0FBS0FJTURRZ2dBQ2dDQUNBRWFpQUFLQUlFSUFSclFRUnJOZ0FBQ3lBQ0tBSWNJUWdnQTBFQVNBMERBa0FDUUFKQUFrQUNRQ0FJTFFBQUlnUkJLbXNPQWdFQ0FBc2dCRUUvUmcwQ0lBUkIrd0JIRFFjZ0NDMEFBVUU2YTBGMVN3MERJQUFvQWloRkRRY01DQXNnQ0VFQmFpRUlRUUFoQzBILy8vLy9CeUVKREFVTFFRRWhDeUFJUVFGcUlRaEIvLy8vL3djaENRd0VDMEVCSVFrZ0FpQUlRUUZxSWdnMkFoeEJBQ0VMREFNTElBSWdDRUVCYWpZQ0hDQUNRUnhxUVFFUTNBSWlDeUVKQWtBZ0FpZ0NIQ0lFTFFBQUlnVkJMRWNOQUNBQ0lBUkJBV28yQWh4Qi8vLy8vd2NoQ1NBRUxRQUJJZ1ZCT210QmRra05BQ0FDUVJ4cVFRRVEzQUlpQ1NBTFNBMEZJQUlvQWh3dEFBQWhCUXNnQlVIL0FYRkIvUUJHRFFFZ0FDZ0NLQTBCQ3lBQ0lBZzJBaHdNQWdzZ0FDQUNRUnhxUWYwQUVMQUREUVVnQWlnQ0hDRUlDd0pBQW44Z0NDMEFBRUUvUmdSQUlBSWdDRUVCYWlJSU5nSWNJQUFvQWdRZ0Eyc2hCMEVBSVFWQkFBd0JDeUFBS0FJTUlRUUNRQ0FKUVFCS0JFQWdCQTBESUFBb0FnUWdBMnNoQnlBQUtBSUFJaEVnQTJvaERVRUFJUVZCQUNFTUEwQWdCU0FIU0FSQUlBVWdEV29pRGkwQUFDSVVRZkNCQW1vdEFBQWhCRUVDSVFZQ1FBSkFBa0FDUUNBVVFRRnJEaFlDQWdJQ0F3TUhCd2NIQndjSEJ3Y0hBd01IQndFQUJ3dEJBeUVHQ3lBT0x3QUJJQVowSUFScUlRUUxJQXhCQVdvaERBc2dCQ0FGYWlFRkRBRUxDeUFNUVFCTURRRWdBRUVLRUJFZ0FDQURRUkVROEFFTkF5QUFLQUlBSUFOcVFSdzZBQUFnQUNnQ0JDRUdJQU1nQUNnQ0FHb2lCQ0FNTmdBTklBUWdDVFlBQ1NBRUlBczJBQVVnQkNBR0lBTnJRUkZyTmdBQkRBUUxJQVFOQWlBQUtBSUVJQU5ySVFjZ0FDZ0NBQ0VSQzBFQUlRUWdBa0VnYWtFQVFmOEJFQ3NhSUFNZ0VXb2hGRUYrSVExQkFDRVJBMEFnQkNBSFRrVUVRQ0FFSUJScUlnNHRBQUFpQlVId2dRSnFMUUFBSVFaQkFpRU1Ba0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUZRUUZyRGhzQ0FnSUNCd2NHQmdZR0F3TUVCZ2NIQndjRkJRRUFCZ1lIQmdjR0MwRURJUXdMSUE0dkFBRWdESFFnQm1vaEJndEJBU0FOSUExQmZrWWJJUTBNQkFzZ0RpMEFBU0FDUVNCcWFpSUZJQVV0QUFCQkFYSTZBQUFNQXdzZ0RpMEFBU0lGSUE0dEFBSWlEQ0FGSUF4TEd5RU1BMEFnQlNBTVJnMERJQUpCSUdvZ0JXb2lEaUFPTFFBQVFRRnlPZ0FBSUFWQkFXb2hCUXdBQ3dBTFFRRWhFU0FPTFFBQklBSkJJR3BxSWdVZ0JTMEFBRUVDY2pvQUFBd0JDeUFOUVFBZ0RVRitSeHNoRFFzZ0JDQUdhaUVFREFFTEMwRUFJUVVDZndKQUlCRkZEUUFEUUNBRlFmOEJSZzBCSUFKQklHb2dCV29oQkNBRlFRRnFJUVVnQkMwQUFFRURSdzBBQzBGL0RBRUxJQTFCQUNBTlFYNUhHd3RGSVFWQkFRc2hCQUpBSUF0RkJFQWdBQ2dDTkNBS1J3UkFJQUFnQTBFREVQQUJEUU1nQUNnQ0FDQURha0VOT2dBQUlBTWdBQ2dDQUdvZ0Nqb0FBU0FESUFBb0FnQnFJQUF0QURSQkFXczZBQUlnQTBFRGFpRURDd0pBQWtBQ1FDQUpEZ0lBQVFJTElBQWdBellDQkF3RkN5QUFJQU5CQlJEd0FRMERJQUFvQWdBZ0Eyb2dCRUVJY2pvQUFDQUFLQUlBSUFOcUlBYzJBQUVNQkFzZ0NVSC8vLy8vQjBZTkFTQUFJQU5CQ2hEd0FRMENJQUFvQWdBZ0EycEJEem9BQUNBQUtBSUFJZ1lnQTBFRmFpSUZhaUFFUVFoeU9nQUFJQU1nQm1vZ0NUWUFBU0FESUFBb0FnQnFJQWRCQldvMkFBWWdBRUVPSUFVUTNBRWdBRUVRRUJFTUF3c2dCU0FMUVFGSElBbEIvLy8vL3dkSGNuSkZCRUFnQUNBRVFRbHpJQU1RM0FFTUF3c2dDMEVCUndSQUlBQWdBMEVGRVBBQkRRSWdBQ2dDQUNBRGFrRVBPZ0FBSUFBb0FnQWdBMm9nQ3pZQUFTQUFRUTRnQTBFRmFpSURFTndCSUFCQkVCQVJDeUFKUWYvLy8vOEhSZ1JBSUFBb0FnUWhCaUFBSUFSQkNISWdCU0FIYWtFRmFoQzRBUm9nQlFSQUlBQkJHUkFSSUFBZ0F5QUhFTEFFSUFCQkdpQUdFTndCREFRTElBQWdBeUFIRUxBRUlBQkJCeUFHRU53QkRBTUxJQWtnQzB3TkFpQUFRUThnQ1NBTGF4QzRBUm9nQUNnQ0JDRUdJQUFnQkVFSWNpQUhRUVZxRUxnQkdpQUFJQU1nQnhDd0JDQUFRUTRnQmhEY0FTQUFRUkFRRVF3Q0N5QUFJQU1nQlVFRmFoRHdBUTBBSUFBb0FnQWdBMm9nQkVFSWNqb0FBQ0FBS0FJQUlBTnFJZ1FnQlNBSGFrRUZhallBQVNBRkJFQWdCRUVaT2dBRklBQkJHaUFERU53QkRBSUxJQUJCQnlBREVOd0JEQUVMSUFBUXFBSU1CQXNnQUNBSU5nSVlJQUZGRFFFZ0FDQUFLQUlFSWdNZ0VHc2lFQ0FEYWhER0FRMERJQUFvQWdBZ0Uyb2lCQ0FRYWlBRUlBTWdFMnNRbkFFZ0FDZ0NBQ0lFSUJOcUlBTWdCR29nRUJBZkdnd0JDd3NnQUVIM0trRUFFRG9NQVFzZ0FFSHVNVUVBRURvTFFYOGhGUXNnQWtIZ0Ftb2tBQ0FWQzQ0Q0FnWi9BWDRqQUVFUWF5SURKQUFDUUNBQlF2Ly8vLzl2V0FSQUlBQVFKRUYvSVFRTUFRdEJmeUVFSUFBZ0FoQWxJZ2xDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQUpBSUFBZ0EwRU1haUFEUVFocUlBbW5RUk1RamdGQkFFZ0VRRUtBZ0lDQU1DRUNJQU1vQWdnaEJpQURLQUlNSVFjTUFRdEJBQ0VFUW9DQWdJQXdJUUlnQXlnQ0RDRUhJQU1vQWdnaEJnTkFJQVVnQmtZTkFTQUFJQUlRRHlBQUlBa2dCeUFGUVFOMGFpSUlLQUlFSUFsQkFCQVVJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FGUVFGcUlRVWdBQ0FCSUFnb0FnUWdBa0dBZ0FFUXh3UkJBRTROQVFzTFFYOGhCQXNnQUNBSElBWVFXaUFBSUFrUUR5QUFJQUlRRHdzZ0EwRVFhaVFBSUFRTDJnTUNBMzhFZmlNQVFUQnJJZ2drQUFKQUlBQW9BaEFvQW5nZ0NFMEVRQ0FEUWdBZ0EwSUFWUnNoRFNBRlFRRnJJUWtnQmtLQWdJQ0FjSU1oRGlBRlFRQk1JUXBDQUNFREEwQWdBeUFOVVFSQUlBUWhEQXdEQzBKL0lRd2dBQ0FDSUFNZ0NFRW9haENGQVNJRlFRQklEUUlDUUNBRlJRMEFJQTVDZ0lDQWdEQlNCRUFnQ0NBSUtRTW9Od01BSUFNaEN5QUlJQUkzQXhBZ0NDQURRb0NBZ0lBSVdnUitRb0NBZ0lEQWZpQUR1YjBpQzBLQWdJQ0F3SUdBL1A4QWZTQUxRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3VWdDd3MzQXdnZ0NDQUFJQVlnQjBFRElBZ1FJU0lMTndNb0lBQWdDQ2tEQUJBUElBQWdDQ2tEQ0JBUElBdENnSUNBZ0hDRFFvQ0FnSURnQUZFTkJBc0NRQUpBQWtBZ0NnMEFJQUFnQ0NrREtDSUxFTW9CSWdWQkFFZ05BU0FGUlEwQUlBQWdDRUVnYWlBTEVEeEJBRWdOQVNBQUlBRWdDeUFJS1FNZ0lBUWdDVUtBZ0lDQU1FS0FnSUNBTUJDdkJpSUVRZ0JURFFFZ0FDQUxFQThNQXdzZ0JFTC8vLy8vLy8vL0QxTU5BU0FBUWJIYUFFRUFFQlVnQ0NrREtDRUxDeUFBSUFzUUR3d0VDeUFBSUFFZ0JDQUlLUU1vRUdwQkFFZ05BeUFFUWdGOElRUUxJQU5DQVh3aEF3d0FDd0FMSUFBUTZRRkNmeUVNQ3lBSVFUQnFKQUFnREF1WkFnRUJmZ0pBQWtBQ1FDQUJRb0NBZ0lCd2d5SUVRb0NBZ0lBd1VnUkFJQVJDZ0lDQWdDQlNEUUVnQUVHcDFBQVFZaUVFREFJTElBQkJ0dmtBRUdJaEJBd0JDeUFBSUFFUUpTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBQ0FCRU1vQklnTkJBRWdFUUNBQUlBRVFEMEtBZ0lDQTRBQVBDd0ovUVpNQklBTU5BQnBCblFFZ0FDQUJFRGdOQUJwQmtnRWdBYWN2QVFZaUEwRVNTMEVCSUFOMFFmaU9FSEZGY2cwQUdpQUFLQUlRS0FKRUlBTkJHR3hxS0FJRUN5RUNJQUFnQVVIWEFTQUJRUUFRRkNFRUlBQWdBUkFQSUFSQ2dJQ0FnSENESWdGQ2dJQ0FnSkIvVVEwQUlBRkNnSUNBZ09BQVVRMEJJQUFnQkJBUElBQWdBaEF0SVFRTElBQkJ1NWtCSUFSQm5JQUJFTDRCSVFFTElBRUwwQUlDQm44QmZpTUFRVEJySWdJa0FBSkFBa0FnQXlrREFDSUJRdi8vLy85dldBUkFJQUZDSUlpblFYVkpEUUVnQWFjaUFDQUFLQUlBUVFGcU5nSUFEQUVMUW9DQWdJRGdBQ0VMSUFBZ0FSQzJBeUlEUVFCSURRRWdBMFVFUUNBQVFmamlBRUVBRUJVTUFnc2dBQ0FDUVN4cUlBSkJLR29nQWFjaUJrRURFSTRCRFFFZ0FpZ0NMQ0VISUFJb0FpZ2hDRUVBSVFNQ1FBTkFJQU1nQ0VjRVFDQUhJQU5CQTNScUtBSUVJUWxCZ0lJQklRVUNRQ0FFUlEwQUlBQWdBa0VJYWlBR0lBa1FUQ0lLUVFCSURRTWdDa1VOQUNBQ0tBSUlJUVVnQUNBQ1FRaHFFRWhCZ0lZQlFZQ0NBU0FGUVFKeEd5RUZDeUFBSUFFZ0NVS0FnSUNBTUVLQWdJQ0FNRUtBZ0lDQU1DQUZFRzFCQUVnTkFpQURRUUZxSVFNTUFRc0xJQUFnQnlBSUVGb2dCaUFHS0FJQVFRRnFOZ0lBREFFTElBQWdCeUFJRUZvTUFRc2dBU0VMQ3lBQ1FUQnFKQUFnQ3dzUUFFR2ltUUVnQUVFTEVQc0JRUUJIQzRrQkFnTi9BWDVCbFprQklRTUNRQUpBSUFFcEFnUWlCcWRCLy8vLy93ZHhJZ1VnQWt3TkFDQUJRUkJxSVFRQ2Z5QUdRb0NBZ0lBSWcxQkZCRUFnQkNBQ1FRRjBhaThCQUF3QkN5QUNJQVJxTFFBQUMwRWxSdzBBUWIwdElRTWdBa0VDYWlBRlRnMEFJQUVnQWtFQmFrRUNFTGdFSWdKQkFFNE5BUXNnQUNBREVMa0VRWDhoQWdzZ0FndUxBZ0lCZmdGOEl3QkJFR3NpQWlRQVFvQ0FnSURnQUNFRUFrQWdBQ0FCRU4wQ0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUVFNQVFzZ0FDQUNJQUVRYmcwQUlBQWdBa0VNYWlBREtRTUFFTG9CRFFBZ0Fpc0RBQ0lGdlNJQlFvQ0FnSUNBZ0lENC93Q0RRb0NBZ0lDQWdJRDQvd0JSQkVBZ0FFS0FnSUNBd0g0Z0FVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeEEzSVFRTUFRc2dBelVDQkVJZ2hrS0FnSUNBTUZFRVFDQUFJQVZCQ2tFQVFRUVFqd0loQkF3QkN5QUNLQUlNSWdOQjVRQlBCRUFnQUVHS05FRUFFRkFNQVFzZ0FDQUZRUW9nQTBFQmFrRUZFSThDSVFRTElBSkJFR29rQUNBRUMxOEFJd0JCRUdzaUFpUUFBbjRnQXlrREFDSUJRaUNJcHlJREJFQkNnSUNBZ0JBZ0EwRUxha0VTU1EwQkdndENnSUNBZ09BQUlBQWdBa0VJYWlBQkVFSU5BQm9nQWlzRENCQzlBcTFDZ0lDQWdCQ0VDeUVCSUFKQkVHb2tBQ0FCQ3lZQVFvQ0FnSURnQUNBQUlBTXBBd0FRekFVaUFFRUFSNjFDZ0lDQWdCQ0VJQUJCQUVnYkN5OEJBWDRDZmlBREtBSUVJZ0lFUUVLQWdJQ0FFQ0lFSUFKQkMycEJFa2tOQVJvTElBQWdCQ0FESUFNUXZBUUxDeThCQVg0Q2ZpQURLQUlFSWdJRVFFS0FnSUNBRUNJRUlBSkJDMnBCRWtrTkFSb0xJQUFnQkNBRElBTVF2UVFMQ3drQUlBQWdBUkMrQkFzc0FDQUFJQUVRdmdRaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSK0lBQkJBMEVDSUFHbkd4QXRCU0FCQ3d2TUFnSUJmd2QrSXdCQklHc2lCQ1FBSUFBZ0JFRUlha0VBRUQwYVFvQ0FnSURnQUNFSVFvQ0FnSUF3SVFVQ1FBSkFBa0FnQUNBREtRTUFFQ1VpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0FDQUdRZkFBSUFaQkFCQVVFTndGSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBUWdCUkE4UVFCSURRQkNBQ0VCSUFRcEF3QWlCMElBSUFkQ0FGVWJJUWtnQjBJQmZTRUhJQUtzSVFvRFFDQUJJQWxSRFFJZ0FDQUFJQVVnQVJCekVEY2lDMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMEJJQVJCQ0dvZ0N4Qi9HaUFCSUFkWklRSWdBVUlCZkNFQklBRWdDbGtnQW5JTkFDQUVRUWhxSUFNZ0FhZEJBM1JxS1FNQUVJY0JSUTBBQ3dzZ0FDQUdFQThnQUNBRkVBOGdCQ2dDQ0NnQ0VDSUFRUkJxSUFRb0Fnd2dBQ2dDQkJFQUFBd0JDeUFBSUFZUUR5QUFJQVVRRHlBRVFRaHFFRFloQ0FzZ0JFRWdhaVFBSUFnTGd3SUNBMzhCZkNNQVFTQnJJZ1FrQUFKK0FrQWdBQ0FFSUFJUVBRMEFJQUpCQUNBQ1FRQktHeUVHQWtBRFFDQUZJQVpIQkVBQ1FDQURJQVZCQTNScUtRTUFJZ0ZDLy8vLy93OVlCRUFnQWFjaUFrSC8vOE1BVFEwQkRBUUxJQUFnQkVFWWFpQUJFRUlOQkNBRUt3TVlJZ2RFQUFBQUFBQUFBQUJqSUFkRUFBQUFBUC8vTUVGa2NnMERJQWNDZnlBSG1VUUFBQUFBQUFEZ1FXTUVRQ0FIcWd3QkMwR0FnSUNBZUFzaUFyZGlEUU1MSUFWQkFXb2hCU0FFSUFJUXVRRkZEUUVNQXdzTElBUVFOZ3dDQ3lBQVFaVXJRUUFRVUFzZ0JDZ0NBQ2dDRUNJQVFSQnFJQVFvQWdRZ0FDZ0NCQkVBQUVLQWdJQ0E0QUFMSVFFZ0JFRWdhaVFBSUFFTG5BRUJBbjhqQUVFZ2F5SUVKQUFnQUNBRVFRaHFJQUlRUFJvZ0FrRUFJQUpCQUVvYklRSUNmZ05BSUFJZ0JVY0VRQUpBSUFBZ0JFRUVhaUFESUFWQkEzUnFLUU1BRUhkRkJFQWdCRUVJYWlBRUx3RUVFSXNCUlEwQkN5QUVLQUlJS0FJUUlnQkJFR29nQkNnQ0RDQUFLQUlFRVFBQVFvQ0FnSURnQUF3REN5QUZRUUZxSVFVTUFRc0xJQVJCQ0dvUU5nc2hBU0FFUVNCcUpBQWdBUXViQXdJRGZ3SitJd0JCSUdzaUFpUUFRb0NBZ0lEZ0FDRUlBa0FnQUNBQkVGa2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQWtFSWFpSUZRUWNRUFJvZ0JVRThFRHNhSUFVZ0JFRURkQ0lGUVlEckFXb29BZ0FpQmhDSUFScEJuajBnQkhaQkFYRkZCRUFnQWtFSWFpSUVRU0FRT3hvZ0JDQUZRWVRyQVdvb0FnQVFpQUVhSUFSQnJwa0JFSWdCR2lBQUlBTXBBd0FRV1NJSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUJFQThnQWlnQ0NDZ0NFQ0lBUVJCcUlBSW9BZ3dnQUNnQ0JCRUFBQXdDQ3lBSnB5SUhRUkJxSVFWQkFDRUVBMEFnQkNBSEtRSUVJZ2luUWYvLy8vOEhjVTlGQkVBQ1FBSi9JQWhDZ0lDQWdBaURVRVVFUUNBRklBUkJBWFJxTHdFQURBRUxJQVFnQldvdEFBQUxJZ05CSWtZRVFDQUNRUWhxUWFDSkFSQ0lBUm9NQVFzZ0FrRUlhaUFERUlzQkdnc2dCRUVCYWlFRURBRUxDeUFBSUFrUUR5QUNRUWhxUVNJUU94b0xJQUpCQ0dvaUFFRStFRHNhSUFBZ0FSQi9HaUFBUWJxUUFSQ0lBUm9nQUNBR0VJZ0JHaUFDUVFocVFUNFFPeG9nQUJBMklRZ0xJQUpCSUdva0FDQUlDNU1FQWdoL0FYNGpBRUV3YXlJRkpBQUNRQ0FBSUFFUVdTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBYWNpQnlnQ0JFSC8vLy8vQjNFaUFrVU5BQUpBSUFBZ0JVRVVhaUFDRUQwTkFFRUFJUUlnQlVFQU5nSVFJQWRCRUdvaENBTkFBa0FnQnlrQ0JDSU5wMEgvLy8vL0IzRWlDU0FDU2dSQUFuOENRQ0FFUlNBSElBVkJFR29ReVFFaUNrR2pCMGR5RFFBZ0JTZ0NFQ0lMUVFGcklRSURRQUpBSUFKQkFFd0VRRUVBSVFZTUFRc2dBa0VCYXlFREFrQWdEVUtBZ0lDQUNJTlFSUVJBSUFnZ0EwRUJkR292QVFBaUJrR0ErQU54UVlDNEEwY2dBa0VDU1hJTkFTQUlJQUpCQW1zaUFrRUJkR292QVFBaURFR0EwQUJxUWYvL0EzRkJnQWhMRFFFZ0JrSC9CM0VnREVIL0IzRkJDblJ5UVlDQUJHb2hCZ3dDQ3lBRElBaHFMUUFBSVFZTElBTWhBZ3NnQmhEQUJBMEFDeUFHRUw4RVJRMEFJQVVnQ3pZQ0xBSkFBMEFnQlNnQ0xDQUpUZzBCSUFjZ0JVRXNhaERKQVNJQ0VNQUVEUUFMSUFJUXZ3UU5BUXNnQlVIQ0J6WUNCRUVCREFFTElBVkJCR29nQ2lBRUVMSURDeUVEUVFBaEFnTkFJQUlnQTBZTkFpQUNRUUowSVFZZ0FrRUJhaUVDSUFWQkZHb2dCaUFGUVFScWFpZ0NBQkM1QVVVTkFBc01Bd3NnQUNBQkVBOGdCVUVVYWhBMklRRU1Bd3NnQlNnQ0VDRUNEQUFMQUFzZ0FDQUJFQThnQlNnQ0ZDZ0NFQ0lBUVJCcUlBVW9BaGdnQUNnQ0JCRUFBRUtBZ0lDQTRBQWhBUXNnQlVFd2FpUUFJQUVMZEFFQmZrS0FnSUNBNEFBaEJDQUFJQUVRV1NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkg0Z0FDQURLUU1BRUNnaUJFS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBQWdBUkFQUW9DQWdJRGdBQThMSUFHbklBU25FSU1DSVFJZ0FDQUJFQThnQUNBRUVBOGdBcTBGUW9DQWdJRGdBQXNMQ1FBZ0FDQUJFUFlFQ3hJQUlBQkJzalJCQUJBVlFvQ0FnSURnQUF0cUFBSkFBa0FnQVVJZ2lLY2lBa0YvUndSQUlBSkJlVWNOQVF3Q0N5QUJweUlDTHdFR1FRVkhEUUFnQWlrRElDSUJRb0NBZ0lCd2cwS0FnSUNBa0g5U0RRQU1BUXNnQUVHaTJ3QkJBQkFWUW9DQWdJRGdBQThMSUFHbklnQWdBQ2dDQUVFQmFqWUNBQ0FCQzRRQ0FnSi9BbjRnQUNBQkVGa2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQUVQQ3lBQnB5SUdLUUlFSWdlblFmLy8vLzhIY1NFQ0FrQWdCRUVCY1VVTkFDQUdRUkJxSVFNZ0IwS0FnSUNBQ0lNaENBTkFJQUlnQlVZRVFDQUNJUVVNQWdzQ2Z5QUlVRVVFUUNBRElBVkJBWFJxTHdFQURBRUxJQU1nQldvdEFBQUxFSWNEUlEwQklBVkJBV29oQlF3QUN3QUxBa0FnQkVFQ2NVVUVRQ0FDSVFNTUFRc2dCa0VRYWlFRUlBZENnSUNBZ0FpRElRY0RRQ0FDSWdNZ0JVd05BU0FEUVFGcklRSUNmeUFIVUVVRVFDQUVJQUpCQVhScUx3RUFEQUVMSUFJZ0JHb3RBQUFMRUljRERRQUxDeUFBSUFZZ0JTQURFSVFCSVFjZ0FDQUJFQThnQnd2cUF3SUdmd04rSXdCQklHc2lCU1FBUW9DQWdJRGdBQ0VNQWtBZ0FDQUJFRmtpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBQWtBQ1FDQUFJQVZCQkdvZ0F5a0RBQkM2QVEwQUlBVW9BZ1FpQnlBQnB5SUpLQUlFUWYvLy8vOEhjU0lJVEEwQlFTQWhDa0tBZ0lDQU1DRUxBa0FnQWtFQ1NBMEFJQU1wQXdnaURVS0FnSUNBY0lOQ2dJQ0FnREJSRFFBZ0FDQU5FQ2dpQzBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCQWtBQ1FDQUxweUlHS1FJRUlnMm5RZi8vLy84SGNRNENBQUVDQ3lBQUlBc1FEd3dEQ3dKL0lBMUNnSUNBZ0FpRFVFVUVRQ0FHTHdFUURBRUxJQVl0QUJBTElRcEJBQ0VHQ3lBSFFZQ0FnSUFFVGdSQUlBQkJ3Tm9BUVFBUVJnd0JDeUFBSUFWQkNHb2dCeEE5UlFSQUFrQWdCQVJBSUFWQkNHb2dDVUVBSUFnUVVRMEJDeUFISUFocklRTUNRQ0FHQkVBRFFDQURRUUJNRFFJZ0F5QURJQVlvQWdSQi8vLy8vd2R4SWdJZ0FpQURTaHNpQW1zaEF5QUZRUWhxSUFaQkFDQUNFRkZGRFFBTUF3c0FDeUFGUVFocUlBb2dBeERCQkEwQkN5QUVSUVJBSUFWQkNHb2dDVUVBSUFnUVVRMEJDeUFBSUFzUUR5QUFJQUVRRHlBRlFRaHFFRFloREF3RUN5QUZLQUlJS0FJUUlnSkJFR29nQlNnQ0RDQUNLQUlFRVFBQUN5QUFJQXNRRHdzZ0FDQUJFQThNQVFzZ0FTRU1DeUFGUVNCcUpBQWdEQXVCQmdJRmZnVi9Jd0JCMEFCcklnSWtBQUpBQWtBQ1FBSkFJQUZDZ0lDQWdCQ0VRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFRWlV3UVFBUUZRd0JDeUFES1FNSUlRa2dBeWtEQUNJRlFvQ0FnSUFRaEVLQWdJQ0FjSU5DZ0lDQWdEQlJEUUlnQkVVTkFTQUFJQVVReEFSQkFFNE5BUXRDZ0lDQWdPQUFJUVlNQWdzZ0FDQUZRZFFCSUFWQkFCQVVJZ2RDZ0lDQWdIQ0RJZ1pDZ0lDQWdDQlJJQVpDZ0lDQWdEQlJjZzBBSUFaQ2dJQ0FnT0FBVVEwQklBSWdDVGNES0NBQ0lBRTNBeUFnQUNBSElBVkJBaUFDUVNCcUVDOGhCZ3dCQ3lBQUlBSkJDR3BCQUJBOUdrS0FnSUNBNEFBaEJrS0FnSUNBTUNFSUFrQWdBQ0FCRUNnaUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQVFvQ0FnSUF3SVFVTUFRc2dBQ0FGRUNnaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdDUkE0SWc1RkJFQWdBQ0FKRUNnaUNFS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQkN5QUhweUVMSUFXbklnMHBBZ1FoQVFOQUFrQUNRQ0FCUXYvLy8vOEhnMUFFUUVFQUlRTWdERVVOQVNBS0lBc29BZ1JCLy8vLy93ZHhUdzBDSUFwQkFXb2hBd3dCQ3lBTElBMGdDaERDQkNJRFFRQk9EUUFnREEwQklBSW9BZ2dvQWhBaUEwRVFhaUFDS0FJTUlBTW9BZ1FSQUFBZ0FDQUZFQThnQUNBSUVBOGdCeUVHREFRTElBSWdCVGNESUFKK0lBNEVRQ0FDSUFjM0F6QWdBaUFEclRjREtDQUFJQUFnQ1VLQWdJQ0FNRUVESUFKQklHb1FJUkEzREFFTElBSWdDRGNEU0NBQ1FvQ0FnSUF3TndOQUlBSkNnSUNBZ0RBM0F6Z2dBaUFITndNb0lBSWdBNjAzQXpBZ0FDQUNRU0JxRU8wRUN5SUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSWdBa0VJYWlJTUlBc2dDaUFERUZFYUlBd2dBUkIvR2lBTktRSUVJZ0duUWYvLy8vOEhjU0FEYWlFS1FRRWhEQ0FFRFFFTEN5QUNRUWhxSWdNZ0N5QUtJQXNvQWdSQi8vLy8vd2R4RUZFYUlBQWdCUkFQSUFBZ0NCQVBJQUFnQnhBUElBTVFOaUVHREFFTElBSW9BZ2dvQWhBaUEwRVFhaUFDS0FJTUlBTW9BZ1FSQUFBZ0FDQUZFQThnQUNBSUVBOGdBQ0FIRUE4TElBSkIwQUJxSkFBZ0JndTRBZ0lEZndOK0l3QkJJR3NpQWlRQVFvQ0FnSURnQUNFSEFrQUNRQUpBSUFBZ0FSQlpJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFJZ0F5a0RBQkRpQXcwQUlBSXBBd0FpQ0VLQWdJQ0FDRm9FUUNBQVFlSXFRUUFRVUF3QkN5QUJweUlFS1FJRUlnbW5JZ1pCLy8vLy93ZHhJZ1ZGRFFFZ0NLY2lBMEVCUmcwQklBbEMvLy8vL3dlRElBaCtRb0NBZ0lBRVdnUkFJQUJCd05vQVFRQVFSZ3dCQ3lBQUlBSkJDR29nQXlBRmJDQUdRUjkyRUlvRERRQUNRQ0FGUVFGSEJFQURRQ0FEUVFCTURRSWdBa0VJYWlBRVFRQWdCUkJSR2lBRFFRRnJJUU1NQUFzQUN5QUNRUWhxQW44Z0JDMEFCMEdBQVhFRVFDQUVMd0VRREFFTElBUXRBQkFMSUFNUXdRUWFDeUFBSUFFUUR5QUNRUWhxRURZaEJ3d0NDeUFBSUFFUUR3d0JDeUFCSVFjTElBSkJJR29rQUNBSEM4RUJBZ0ovQW40akFFRVFheUlFSkFCQ2dJQ0FnT0FBSVFZQ1FDQUFJQUVRV1NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FTRUdEQUVMQWtBZ0FDQUVRUXhxSUFNcEF3QWdBYWNpQlNnQ0JFSC8vLy8vQjNFaUFpQUNFRmNOQUNBRUlBSTJBZ2dnQXlrRENDSUhRb0NBZ0lCd2cwS0FnSUNBTUZJRVFDQUFJQVJCQ0dvZ0J5QUNJQUlRVncwQklBUW9BZ2doQWdzZ0FDQUZJQVFvQWd3aUF5QUNJQU1nQWlBRFNoc1FoQUVoQmdzZ0FDQUJFQThMSUFSQkVHb2tBQ0FHQzhBQkFnTi9BbjRqQUVFUWF5SUNKQUJDZ0lDQWdPQUFJUWNDUUNBQUlBRVFXU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQVNFSERBRUxBa0FnQUNBQ1FReHFJQU1wQXdBZ0FhY2lCaWdDQkVILy8vLy9CM0VpQkNBRUVGY05BQ0FDSUFRZ0FpZ0NEQ0lGYXlJRU5nSUlJQUFnQmlBRklBTXBBd2dpQ0VLQWdJQ0FjSU5DZ0lDQWdEQlNCSDhnQUNBQ1FRaHFJQWdnQkVFQUVGY05BU0FDS0FJSUJTQUVDeUFGYWhDRUFTRUhDeUFBSUFFUUR3c2dBa0VRYWlRQUlBY0wwd0VDQW44Q2ZpTUFRUkJySWdJa0FFS0FnSUNBNEFBaEJnSkFJQUFnQVJCWklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUVlNQVFzQ1FDQUFJQUpCREdvZ0F5a0RBQ0FCcHlJRktBSUVRZi8vLy84SGNVRUFFRmNOQUNBQ0lBVW9BZ1JCLy8vLy93ZHhJZ1EyQWdnZ0F5a0RDQ0lIUW9DQWdJQndnMEtBZ0lDQU1GSUVRQ0FBSUFKQkNHb2dCeUFFUVFBUVZ3MEJJQUlvQWdnaEJBc2dBQ0FGSUFJb0Fnd2lBeUFFSUFNZ0JFZ2JJQU1nQkNBRElBUktHeENFQVNFR0N5QUFJQUVRRHdzZ0FrRVFhaVFBSUFZTHFBVUNDMzRDZnlNQVFSQnJJZ0lrQUFKQUlBRkNnSUNBZ0JDRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQVFaVXdRUUFRRlVLQWdJQ0E0QUFoQnd3QkN5QURLUU1JSVFZQ1FDQURLUU1BSWdSQ2dJQ0FnSENESWdsQ2dJQ0FnQkNFUW9DQWdJQXdVUTBBSUFBZ0JFSFdBU0FFUVFBUUZDSUZRb0NBZ0lCd2d5SUhRb0NBZ0lBZ1VTQUhRb0NBZ0lBd1VYSU5BQ0FIUW9DQWdJRGdBRkVOQVNBQ0lBWTNBd2dnQWlBQk53TUFJQUFnQlNBRVFRSWdBaEF2SVFjTUFRdENnSUNBZ09BQUlRZENnSUNBZ0RBaENDQUFBbjVDZ0lDQWdEQWdBQ0FCRUNnaUNrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUdrS0FnSUNBNEFBZ0FCQStJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQm9DUUFKQUlBWkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBSkJmellDQUF3QkN5QUFJQUlnQmhCM1FRQklEUUVMSUFxbklnTXBBZ1FoQ3lBQUlBUVFLQ0lJUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFDUUNBQ0tBSUFJZzlGRFFCQ0FDRUVBa0FnQ1VLQWdJQ0FNRkVFUUVJQUlRVU1BUXNnQ0tjaUVDa0NCRUwvLy8vL0I0TWhCaUFMUXYvLy8vOEhneUlGVUVVRVFDQUZJQVo5SUFaUXJTSUpmU0VNSUErdElRMUNBQ0VGQTBBQ1FDQUVJQWw4SWc0Z0RGVU5BQ0FESUJBZ0RxY1F3Z1FpRDBFQVNBMEFJQUFnQXlBRXB5QVBFSVFCSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQlNBQUlBRWdCU0FFUVFBUTBnRkJBRWdOQlNBR0lBK3NmQ0VFSUFWQ0FYd2lCU0FOVWcwQkRBUUxDeUFGUXYvLy8vOFBneUVGREFFTFFnQWhCU0FHVUEwQkN5QUFJQU1nQktjZ0M2ZEIvLy8vL3dkeEVJUUJJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFFZ0JTQUVRUUFRMGdGQkFFZ05BUXNnQUNBS0VBOGdBQ0FJRUE4Z0FTRUhEQUlMSUFFTEVBOGdBQ0FLRUE4Z0FDQUlFQThMSUFKQkVHb2tBQ0FIQzZBREFRUitJd0JCTUdzaUFpUUFJQUlnQVRjREtBSkFJQUZDZ0lDQWdCQ0VRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFRWlV3UVFBUUZVS0FnSUNBNEFBaEJnd0JDd0pBSUFNcEF3QWlCVUtBZ0lDQUVJUkNnSUNBZ0hDRFFvQ0FnSUF3VVEwQVFvQ0FnSURnQUNFR0lBQWdCU0FFSUFWQkFCQVVJZ2RDZ0lDQWdIQ0RJZ2hDZ0lDQWdPQUFVUTBCQWtBZ0JFSFRBVWNOQUNBQUlBVVF4QVJCQUU0TkFDQUFJQWNRRHd3Q0N5QUlRb0NBZ0lBUWhFS0FnSUNBTUZFTkFDQUFJQWNnQlVFQklBSkJLR29RTHlFR0RBRUxJQUlnQUNBQkVDZ2lCemNEQ0VLQWdJQ0E0QUFoQmlBSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FpQUZOd01RQWtBQ1FBSi9JQVJCMHdGSEJFQkNnSUNBZ0RBaEFVRUJEQUVMSUFCQnA5MEFFR0lpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCSUFJZ0FUY0RHRUVDQ3lFRElBQWdBQ2tEU0NBRElBSkJFR29RcHdFaEJTQUFJQUVRRHlBRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTElBQWdCeEFQREFFTElBQWdCU0FFUVFFZ0FrRUlhaEN0QWlFR0lBQWdBaWtEQ0JBUEN5QUNRVEJxSkFBZ0JndVlBd0lGZndOK0l3QkJFR3NpQmlRQUFrQWdBQ0FCRUZraUNrS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBb2hBUXdCQ3dKQUlBQWdBeWtEQUJEUUF5SUZCRUJDZ0lDQWdPQUFJUUZDZ0lDQWdEQWhDeUFGUVFCTURRRWdBRUg4OVFCQkFCQVZEQUVMUW9DQWdJRGdBQ0VCSUFBZ0F5a0RBQkFvSWd0Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBTHB5SUhLQUlFSVFnZ0JpQUtweUlKS0FJRVFmLy8vLzhIY1NJRlFRQWdCRUVDUmhzMkFnd0NRQ0FDUVFKSURRQWdBeWtEQ0NJTVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQUNBQUlBWkJER29nRENBRlFRQVFWdzBCQ3lBRklBaEIvLy8vL3dkeElnVnJJUUlDUUFKQUFrQUNRQ0FFRGdJQUFRSUxJQVlvQWd3aEF3d0NDeUFHS0FJTUlnTWdBa29oQkVLQWdJQ0FFQ0VCSUFNaEFpQUVSUTBCREFJTElBWW9BZ3dnQldzaUF5RUNDMEtBZ0lDQUVDRUJJQU5CQUVnZ0FpQURTSElOQUFOQUlBa2dCeUFEUVFBZ0JSQ3pBMFVFUUVLQmdJQ0FFQ0VCREFJTElBSWdBMGNoQkNBRFFRRnFJUU1nQkEwQUN3c2dBQ0FLRUE4Z0FDQUxFQThMSUFaQkVHb2tBQ0FCQzdBREF3ZC9BWHdCZmlNQVFSQnJJZ1VrQUFKQUlBQWdBUkJaSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUFKQUFrQWdBQ0FES1FNQUVDZ2lEVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQTJuSWdrb0FnUkIvLy8vL3dkeElRWWdBYWNpQ2lnQ0JFSC8vLy8vQjNFaEJ3SkFJQVFFUUNBRklBY2dCbXNpQ3pZQ0RFRi9JUWhCQUNFRUlBSkJBa2dOQVNBQUlBVWdBeWtEQ0JCQ0RRSWdCU3NEQUNJTXZVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmcwQklBeEVBQUFBQUFBQUFBQmxCRUFnQlVFQU5nSU1EQUlMSUF3Z0M3ZGpSUTBCSUFVQ2Z5QU1tVVFBQUFBQUFBRGdRV01FUUNBTXFnd0JDMEdBZ0lDQWVBczJBZ3dNQVFzZ0JVRUFOZ0lNSUFKQkFrNEVRQ0FBSUFWQkRHb2dBeWtEQ0NBSFFRQVFWdzBDQ3lBSElBWnJJUVJCQVNFSUMwRi9JUUlnQmlBSFN3MEJJQVFnQlNnQ0RDSURheUFJYkVFQVNBMEJBMEFnQ2lBSklBTkJBQ0FHRUxNRFJRUkFJQU1oQWd3REN5QURJQVJHRFFJZ0F5QUlhaUVEREFBTEFBc2dBQ0FCRUE4Z0FDQU5FQTlDZ0lDQWdPQUFJUUVNQVFzZ0FDQUJFQThnQUNBTkVBOGdBcTBoQVFzZ0JVRVFhaVFBSUFFTGt3RUNBWDRCZnlNQVFSQnJJZ0lrQUVLQWdJQ0E0QUFoQkFKQUlBQWdBUkJaSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRUU1BUXNDUUNBQUlBSkJER29nQXlrREFCQzZBUTBBUW9DQWdJQXdJUVFnQWlnQ0RDSURRUUJJRFFBZ0F5QUJweUlGS0FJRVFmLy8vLzhIY1U4TkFDQUZJQUpCREdvUXlRR3RJUVFMSUFBZ0FSQVBDeUFDUVJCcUpBQWdCQXRwQWdKL0FYNGdBQ0FCRUZraEFRTkFJQUlnQkV3Z0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVhKRkJFQWdBeUFFUVFOMGFpa0RBQ0lHUWlDSXAwRjFUd1JBSUFhbklnVWdCU2dDQUVFQmFqWUNBQXNnQkVFQmFpRUVJQUFnQVNBR0VNUUNJUUVNQVFzTElBRUx5QUVDQVg0QmZ5TUFRUkJySWdJa0FFS0FnSUNBNEFBaEJBSkFJQUFnQVJCWklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUVFNQVFzQ1FDQUFJQUpCREdvZ0F5a0RBQkM2QVEwQUFrQWdBaWdDRENJRFFRQk9CRUFnQXlBQnB5SUZLUUlFSWdTblFmLy8vLzhIY1VrTkFRc2dBRUV2RUMwaEJBd0JDeUFGUVJCcUlRVWdBQUovSUFSQ2dJQ0FnQWlEVUVVRVFDQUZJQU5CQVhScUx3RUFEQUVMSUFNZ0JXb3RBQUFMUWYvL0EzRVFud01oQkFzZ0FDQUJFQThMSUFKQkVHb2tBQ0FFQzdnQkFnSitBWDhqQUVFUWF5SUNKQUJDZ0lDQWdPQUFJUVFDUUNBQUlBRVFXU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQVNFRURBRUxBa0FnQUNBQ1FReHFJQU1wQXdBUXVnRU5BRUtBZ0lDQXdINGhCQ0FDS0FJTUlnTkJBRWdOQUNBRElBR25JZ1lwQWdRaUJhZEIvLy8vL3dkeFR3MEFJQVpCRUdvaEJpQUZRb0NBZ0lBSWcxQkZCRUFnQmlBRFFRRjBhak1CQUNFRURBRUxJQU1nQm1veEFBQWhCQXNnQUNBQkVBOExJQUpCRUdva0FDQUVDK01CQWdGK0FuOGpBRUVRYXlJQ0pBQUNRQ0FBSUFGQkxSQkxJZ05GQkVBZ0JFRUFOZ0lBUW9DQWdJRGdBQ0VCREFFTFFvQ0FnSUF3SVFFQ1FDQURLUU1BSWdaQ2dJQ0FnSENEUW9DQWdJQXdVZ1JBSUFJZ0F5Z0NEQ0lGTmdJTUlBVWdCcWNpQnlnQ0JFSC8vLy8vQjNGSkRRRWdBQ0FHRUE4Z0EwS0FnSUNBTURjREFBc2dCRUVCTmdJQURBRUxJQWNnQWtFTWFoREpBU0VJSUFNZ0FpZ0NERFlDRENBRVFRQTJBZ0FnQ0VILy93Tk5CRUFnQUNBSVFmLy9BM0VRbndNaEFRd0JDeUFBSUFjZ0JVRUJkR3BCRUdwQkFoRHVBeUVCQ3lBQ1FSQnFKQUFnQVFzM0FDTUFRUkJySWdJa0FDQUFJQUpCREdvZ0F5a0RBQkIzSVFBZ0FpZ0NEQ0VESUFKQkVHb2tBRUtBZ0lDQTRBQWdBMmV0SUFBYkMwNEFJd0JCRUdzaUFpUUFRb0NBZ0lEZ0FDRUJBa0FnQUNBQ1FReHFJQU1wQXdBUWR3MEFJQUFnQWtFSWFpQURLUU1JRUhjTkFDQUNLQUlJSUFJb0FneHNyU0VCQ3lBQ1FSQnFKQUFnQVFzR0FDQUF0cnNMZndBZ0FDQUFLUVBRQVNJQlFneUlJQUdGSWdGQ0dZWWdBWVVpQVVJYmlDQUJoU0lCTndQUUFVS0FnSUNBd0g0Z0FVS2R1clA3bEpMOW9pVitRZ3lJUW9DQWdJQ0FnSUQ0UDRTL1JBQUFBQUFBQVBDL29MMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3d1akJBTURmQVYvQTM0akFFRVFheUlJSkFBZ0NFSUFOd01JQWtBQ1FDQUNRUUJNRFFCQ2dJQ0FnT0FBSVFFZ0FDQUlRUWhxSUFNcEF3QVFRZzBCUVFFaENTQUlLd01JSVFRZ0FrRUJSd1JBQTBBZ0FpQUpSZzBDSUFBZ0NDQURJQWxCQTNScUtRTUFFRUlOQXlBSlFRRnFJUWtnQ0NzREFDRUZJd0JCSUdzaUJ5UUFJQVM5UXYvLy8vLy8vLy8vL3dDRElnMGdCYjFDLy8vLy8vLy8vLy8vQUlNaURDQU1JQTFXR3lJT3Z5RUVBa0FnRGtJMGlLY2lDa0gvRDBZTkFDQU5JQXdnRENBTlZCc2lETDhoQlFKQUlBNVFEUUFnREVJMGlLY2lDMEgvRDBZTkFDQUxJQXByUWNFQVRnUkFJQVVnQktBaEJBd0NDd0o4SUF0Qi9ndFBCRUFnQkVRQUFBQUFBQUF3RktJaEJDQUZSQUFBQUFBQUFEQVVvaUVGUkFBQUFBQUFBTEJyREFFTFJBQUFBQUFBQVBBL0lBcEJ2QVJMRFFBYUlBUkVBQUFBQUFBQXNHdWlJUVFnQlVRQUFBQUFBQUN3YTZJaEJVUUFBQUFBQUFBd0ZBc2hCaUFIUVJocUlBZEJFR29nQlJDS0JpQUhRUWhxSUFjZ0JCQ0tCaUFHSUFjckF3QWdCeXNERUtBZ0J5c0RDS0FnQnlzREdLQ2ZvaUVFREFFTElBVWhCQXNnQjBFZ2FpUUFEQUFMQUFzZ0JKa2hCQXNnQkwwaUFRSi9JQVNaUkFBQUFBQUFBT0JCWXdSQUlBU3FEQUVMUVlDQWdJQjRDeUlBdDcxUkJFQWdBSzBoQVF3QkMwS0FnSUNBd0g0Z0FVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeUVCQ3lBSVFSQnFKQUFnQVF0T0FDQUFJQUJFQUFBQUFBQUE4TDlFQUFBQUFBQUE4RDhnQUVRQUFBQUFBQUFBQUdNYklBQzlRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d5QUFSQUFBQUFBQUFBQUFZUnNMUXdBQ2ZDQUJ2VUtBZ0lDQWdJQ0ErUDhBZzBLQWdJQ0FnSUNBK1A4QVVRUkFSQUFBQUFBQUFQaC9JQUNaUkFBQUFBQUFBUEEvWVEwQkdnc2dBQ0FCRUk4REN3dURBUUlDZmdGL0lBQzlJZ0ZDTklpblFmOFBjU0lEUWY0SFRRUkFJQUZDZ0lDQWdJQ0FnSUNBZjRNaEFpQURRZjRIUnlBQlFvQ0FnSUNBZ0lEd3YzOVJja1VFUUNBQ1FvQ0FnSUNBZ0lENFA0Uy9Ed3NnQXI4UEN5QURRYklJVFFSOElBRkNQNGNnQVh4Q0FVR3pDQ0FEYTYyR0lnRkNBWWg4UWdBZ0FYMkR2d1VnQUFzTGdnVURBbndGZndGK0l3QkJFR3NpQ1NRQUFuNUNnSUNBZ01EKy8vdi9BRUtBZ0lDQXdQNy9leUFFR3lBQ1JRMEFHZ0o4SUFNcEF3QWlBVUwvLy8vL0QxZ0VRRUVCSUFJZ0FrRUJUQnNoQ2lBQnB5RUlRUUVoQndOQUlBY2dDa2NFUUNBSXR5QURJQWRCQTNScUtRTUFJZ0ZDZ0lDQWdCQmFEUU1hSUFnZ0FhY2lDeUFJSUF0S0d5QUlJQXNnQ0NBTFNCc2dCQnNoQ0NBSFFRRnFJUWNNQVFzTElBaXREQUlMUW9DQWdJRGdBQ0FBSUFsQkNHb2dBUkJDRFFFYVFRRWhCeUFKS3dNSUN5RUZJQWNnQWlBQ0lBZElHeUVDQTBBZ0FpQUhSd1JBUW9DQWdJRGdBQ0FBSUFrZ0F5QUhRUU4wYWlrREFCQkNEUUlhQWtBZ0JiMGlERUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZnMEFJQWtyQXdBaUJyMGlBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZnUkFJQVloQlF3QkN5QUZSQUFBQUFBQUFBQUFZU0FHUkFBQUFBQUFBQUFBWVhFaENpQUVCRUFnQ2dSQUlBRWdESU8vSVFVTUFnc2dCU0FGSUFhbElBYTlRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d5QUdJQVc5UXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QllHeUVGREFFTElBb0VRQ0FCSUF5RXZ5RUZEQUVMSUFVZ0JTQUdwQ0FHdlVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNnQmlBRnZVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBV0JzaEJRc2dCMEVCYWlFSERBRUxDeUFGdlNJQkFuOGdCWmxFQUFBQUFBQUE0RUZqQkVBZ0Jhb01BUXRCZ0lDQWdIZ0xJZ0MzdlZFRVFDQUFyUXdCQzBLQWdJQ0F3SDRnQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c2hBU0FKUVJCcUpBQWdBUXN0QUVLQWdJQ0E0QUFnQUNBREtRTUFJQU1wQXdoQkFCQ0xBaUlBUVFCSHJVS0FnSUNBRUlRZ0FFRUFTQnNMb0FFQkEzNGdBeWtEQUNJRklRUWdBa0VFVGdSQUlBTXBBeGdoQkFzZ0JVTC8vLy8vYjFnRVFDQUFFQ1JDZ0lDQWdPQUFEd3NnQXlrREVDRUJRb0NBZ0lEZ0FDRUdBa0FnQUNBREtRTUlFREVpQWtVTkFDQUJRaUNJcDBGMVR3UkFJQUduSWdNZ0F5Z0NBRUVCYWpZQ0FBc2dBQ0FGSUFJZ0FTQUVRUUFRaGdRaEF5QUFJQUlRRXlBRFFRQklEUUFnQTBFQVI2MUNnSUNBZ0JDRUlRWUxJQVlMandFQUFrQUNRQ0FES1FNQUlnRkMvLy8vLzI5WUJFQWdCQVJBSUFBUUpBd0RDeUFCUWlDSXAwRjFTUTBCSUFHbklnQWdBQ2dDQUVFQmFqWUNBQ0FCRHdzZ0FDQUJFTFlESWdKQkFFZ05BU0FFQkVBZ0FrRUFSNjFDZ0lDQWdCQ0VEd3NnQWtVRVFDQUFRZmppQUVFQUVCVU1BZ3NnQWFjaUFDQUFLQUlBUVFGcU5nSUFDeUFCRHd0Q2dJQ0FnT0FBQ3lvQUlBTXBBd0FpQVVMLy8vLy9iMWdFUUNBQUVDUkNnSUNBZ09BQUR3c2dBQ0FCUVFOQkFCQ3FBZ3RQQUFKQUFrQWdBeWtEQUNJQlF2Ly8vLzl2V0FSQUlBUkZCRUJDZ0lDQWdCQVBDeUFBRUNRTUFRc2dBQ0FCRUprQklnQkJBRTROQVF0Q2dJQ0FnT0FBRHdzZ0FFRUFSNjFDZ0lDQWdCQ0VDMk1CQVg0Z0F5a0RBQ0lFUXYvLy8vOXZXQVJBSUFBUUpFS0FnSUNBNEFBUEMwS0FnSUNBNEFBaEFRSkFJQUFnQXlrRENCQXhJZ0pGRFFBZ0FDQUVJQUlRY1NFRElBQWdBaEFUSUFOQkFFZ05BQ0FEUVFCSHJVS0FnSUNBRUlRaEFRc2dBUXMyQUNBREtRTUFJZ0ZDSUlpbklnSkJmMFlnQkVVZ0FrRitjVUVDUjNGeVJRUkFJQUFRSkVLQWdJQ0E0QUFQQ3lBQUlBRVE2QUVMWXdFQ2ZnSkFBa0FnQXlrREFDSUJRdi8vLy85dldBUkFJQUFRSkF3QkN5QURLUU1JSVFVZ0FTRUVJQUpCQTA0RVFDQURLUU1RSVFRTElBQWdCUkF4SWdJTkFRdENnSUNBZ09BQUR3c2dBQ0FCSUFJZ0JFRUFFQlFoQVNBQUlBSVFFeUFCQzJZQkFYNGdBeWtEQUNJRVF2Ly8vLzl2V0FSQUlBQVFKRUtBZ0lDQTRBQVBDMEtBZ0lDQTRBQWhBUUpBSUFBZ0F5a0RDQkF4SWdKRkRRQWdBQ0FFSUFKQkFCRFZBU0VESUFBZ0FoQVRJQU5CQUVnTkFDQURRUUJIclVLQWdJQ0FFSVFoQVFzZ0FRdUxBUUVDZmlBREtRTUFJZ0ZDLy8vLy8yOVlCRUFnQUJBa1FvQ0FnSURnQUE4TElBTXBBeEFoQmtLQWdJQ0E0QUFoQlFKQUlBQWdBeWtEQ0JBeElnSkZEUUFnQUNBQklBSWdCaUFFUlVFT2RCREhCQ0VESUFBZ0FoQVRJQU5CQUVnTkFDQUVCRUFnQTBFQVI2MUNnSUNBZ0JDRUR3c2dBYWNpQUNBQUtBSUFRUUZxTmdJQUlBRWhCUXNnQlF1YUFRSUJmd0orSXdCQkVHc2lCQ1FBSUFNcEF3Z2hCU0FES1FNQUlnWWhBUUpBQWtBQ1FBSkFJQUpCQTBnTkFDQURLUU1RSWdGQ2dJQ0FnSEJhQkVBZ0FhY3RBQVZCRUhFTkFRc2dBRUdpUGtFQUVCVU1BUXNnQUNBRVFReHFJQVVRaVFRaUFnMEJDMEtBZ0lDQTRBQWhBUXdCQ3lBQUlBWWdBU0FFS0FJTUlnTWdBaENRQXlFQklBQWdBaUFERUpzREN5QUVRUkJxSkFBZ0FRc1ZBQ0FBSUFNcEF3QWdBeUFEUVFocVFRSVFuUU1MVmdJQmZnRi9JQUFnQVJDMEF5SUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBUThMUW9DQWdJQXdJUUlnQWFjaUF5Z0NCRUdBZ0lDQWVFY0VRQ0FBSUFBb0FoQWdBeERCQWhBdElRSUxJQUFnQVJBUElBSUxDUUFnQUNBQkVMUURDMXNCQVg0akFFRVFheUlDSkFBZ0FpQUFJQUVRdEFNaUFUY0RDQUpBSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRUU1BUXNnQUVLQWdJQ0FNRUVCSUFKQkNHb1Fsd1loQkNBQUlBRVFEd3NnQWtFUWFpUUFJQVFMZmdFQmZpQURLUU1BSWdGQ2dJQ0FnSENEUW9DQWdJQ0FmMUlFUUNBQVFmYlNBRUVBRUJWQ2dJQ0FnT0FBRHd0Q2dJQ0FnREFoQkNBQnB5SUFLUUlFUW9DQWdJQ0FnSUNBUUlOQ2dJQ0FnSUNBZ0lDQWYxRUVmaUFBSUFBb0FnQkJBV28yQWdBZ0FVTC8vLy8vRDROQ2dJQ0FnSkIvaEFWQ2dJQ0FnREFMQ3p3QkFYNUNnSUNBZ09BQUlRRWdBQ0FES1FNQUVDZ2lCRUtBZ0lDQWNJTkNnSUNBZ09BQVVnUitJQUFnQktkQkFoQ0FCQVZDZ0lDQWdPQUFDd3VCQkFJQmZnRi9Ba0FDUUFKQUFrQUNRQ0FCUW9DQWdJQndXZ1JBSUFHbklnSXZBUVpCTDBZTkFRc2dCRUVCTmdJQURBRUxJQUlvQWlBaEFpQUVRUUUyQWdBZ0FnMEJDeUFBUWJZL1FRQVFGUXdCQ3dKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQWlnQ0FDSUhRUUZyRGdRQ0FnY0JBQXNnQlVVTkFpQUFLQUlRSUFJUXRRTUxRb0NBZ0lBd0lRRWdCVUVCYXc0Q0F3UUhDeUFES1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQXlBREtBSUFRUUZxTmdJQUN3SkFJQVZCQWtjTkFFRUJJUU1nQjBFQlJ3MEFJQUFnQVJDS0FRd0NDeUFDS0FKRUlnTWdCYTAzQXdBZ0EwRUlheUFCTndNQUlBSWdBMEVJYWpZQ1JBdEJBQ0VEQ3lBQ1FRTTJBZ0FnQWlBRE5nSVVJQUFnQWtFSWFoQzBBaUVCSUFKQkFUWUNBQ0FCUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNnQ0VDQUNFTFVESUFFUEN5QUNLQUpFUVFocklnTXBBd0FoQmlBRFFvQ0FnSUF3TndNQUlBRkMvLy8vL3c5WUJFQWdBVUlDVVFSQUlBSkJBallDQUNBRVFRSTJBZ0FnQmc4TElBUkJBRFlDQUNBR0R3c2dBQ0FCRUE4Z0FDZ0NFQ0FDRUxVRElBWVBDeUFES1FNQUlnRkNJSWluUVhWSkRRTWdBYWNpQUNBQUtBSUFRUUZxTmdJQUlBRVBDeUFES1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQWlBQ0tBSUFRUUZxTmdJQUN5QUFJQUVRaWdFTUFRc2dBRUdVUDBFQUVCVUxRb0NBZ0lEZ0FDRUJDeUFCQys4QkFRTitJd0JCRUdzaUFpUUFRb0NBZ0lEZ0FDRUVBa0FnQUNBQUlBRVFKU0lCUVFFUWtBSWlCVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQVZDSUlpbklnTkJBQ0FEUVF0cVFSSkpHMFVFUUNBQUlBSkJDR29nQlJCQ1FRQklEUUZDZ0lDQWdDQWhCQ0FDS1FNSVFvQ0FnSUNBZ0lENC93Q0RRb0NBZ0lDQWdJRDQvd0JSRFFFTFFvQ0FnSURnQUNFRUlBQWdBVUcvM0FBUXNnRWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQmhBNFJRUkFJQUJCN1BFQVFRQVFGU0FBSUFZUUR3d0JDeUFBSUFZZ0FVRUFRUUFRTHlFRUN5QUFJQUVRRHlBQUlBVVFEeUFDUVJCcUpBQWdCQXVOQWdJQmZBRitJd0JCRUdzaUFpUUFRb0NBZ0lEZ0FDRUZBa0FnQUNBQ1FRaHFJQUVRbXdJTkFDQUFJQUpCQ0dvZ0F5a0RBQkJDRFFBZ0FnSitJQUlyQXdnaUJMMGlCVUtBZ0lDQWdJQ0ErUDhBZzBLQWdJQ0FnSUNBK1A4QVVnUkFJQVNkSWdSRUFBQUFBQUN3blVDZ0lBUWdCRVFBQUFBQUFBQlpRR01iSUFRZ0JFUUFBQUFBQUFBQUFHWWJJZ1M5SVFVTEFuOGdCSmxFQUFBQUFBQUE0RUZqQkVBZ0JLb01BUXRCZ0lDQWdIZ0xJZ08zdlNBRlVRUkFJQU90REFFTFFvQ0FnSURBZmlBRlFvQ0FnSURBZ1lEOC93QjlJQVZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDemNEQUNBQUlBRkJBU0FDUVJFUXlBUWhCUXNnQWtFUWFpUUFJQVVMaVFFQ0FYNEJmQ01BUVJCcklnSWtBRUtBZ0lDQTRBQWhCQUpBSUFBZ0FrRUlhaUFCRUpzQ0RRQWdBQ0FDUVFocUlBTXBBd0FRUWcwQUlBQWdBU0FDS3dNSUlnV2RSQUFBQUFBQUFBQUFvRVFBQUFBQUFBRDRmeUFGUkFBQTNNSUlzajVEWlJ0RUFBQUFBQUFBK0g4Z0JVUUFBTnpDQ0xJK3cyWWJFTWtFSVFRTElBSkJFR29rQUNBRUM5Y0JBUUY4SXdCQjBBQnJJZ0lrQUFKK1FvQ0FnSURnQUNBQUlBRWdBaUFFUVE5eFFRQVF0d01pQUVFQVNBMEFHa0tBZ0lDQXdINGdBRVVOQUJvZ0JFR0FBbkVFUUNBQ0lBSXJBd0JFQUFBQUFBQ3duY0NnT1FNQUN5QUNJQVJCQkhaQkQzRkJBM1JxS3dNQUlnVzlJZ0VDZnlBRm1VUUFBQUFBQUFEZ1FXTUVRQ0FGcWd3QkMwR0FnSUNBZUFzaUJMZTlVUVJBSUFTdERBRUxRb0NBZ0lEQWZpQUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3lFQklBSkIwQUJxSkFBZ0FRdUZBUUVCZkNNQVFSQnJJZ0lrQUFKK1FvQ0FnSURnQUNBQUlBSkJDR29nQVJDYkFnMEFHa0tBZ0lDQXdINGdBaXNEQ0NJRXZVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmcwQUdnSitJQVNkSWdTWlJBQUFBQUFBQU9CRFl3UkFJQVN3REFFTFFvQ0FnSUNBZ0lDQWdIOExFTGdEclFzaEFTQUNRUkJxSkFBZ0FRdUdBUUVCZmdKQUlBRkMvLy8vLzI5WUJFQWdBQkFrREFFTEFrQWdBeWtEQUNJRVFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFBZ0FDQUVFREVpQWtVTkFTQUFJQUlRRTBFUklRTUNRQUpBQWtBZ0FrSEdBR3NPQmdJREFRTURBZ0FMSUFKQkZrY05BZ3RCRUNFREN5QUFJQUVnQXhDUUFnOExJQUJCdGl0QkFCQVZDMEtBZ0lDQTRBQUxsZ0VCQVh3akFFRVFheUlDSkFBQ2ZrS0FnSUNBNEFBZ0FDQUNRUWhxSUFFUW13SU5BQm9nQWlzRENDSUV2U0lCQW44Z0JKbEVBQUFBQUFBQTRFRmpCRUFnQktvTUFRdEJnSUNBZ0hnTElnQzN2VkVFUUNBQXJRd0JDMEtBZ0lDQXdINGdBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzaEFTQUNRUkJxSkFBZ0FRdnNBZ0lEZndGOEl3QkIwQUJySWdRa0FDQUVRUkJxUVFCQk9CQXJHaUFFUW9DQWdJQ0FnSUQ0UHpjRElFS0FnSUNBd0g0aEFRSkFJQUpGRFFCQkJ5QUNJQUpCQjA0YklnSkJBQ0FDUVFCS0d5RUNBMEFnQWlBRlJ3UkFJQUFnQkVFSWFpQURJQVZCQTNRaUJtb3BBd0FRUWdSQVFvQ0FnSURnQUNFQkRBTUxJQVFyQXdnaUI3MUNnSUNBZ0lDQWdQai9BSU5DZ0lDQWdJQ0FnUGovQUZFTkFpQUVRUkJxSUFacUlBZWRPUU1BQWtBZ0JRMEFJQVFyQXhBaUIwUUFBQUFBQUFBQUFHWkZJQWRFQUFBQUFBQUFXVUJqUlhJTkFDQUVJQWRFQUFBQUFBQ3duVUNnT1FNUUN5QUZRUUZxSVFVTUFRc0xJQVJCRUdwQkFCRGdBaUlIdlNJQkFuOGdCNWxFQUFBQUFBQUE0RUZqQkVBZ0I2b01BUXRCZ0lDQWdIZ0xJZ1czdlZFRVFDQUZyU0VCREFFTFFvQ0FnSURBZmlBQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJJUUVMSUFSQjBBQnFKQUFnQVF0V0FCRFFCQ0lCUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FCUXYvLy8vOFBndzhMUW9DQWdJREFmaUFCdWIwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NJQUVLQWdJQ0FNQXVxSFFJR2Z3UitJd0JCMEFCcklnWWtBQUpBQWtBZ0FFRVFhaUlEUVlnQ0lBQW9BZ0FSQXdBaUFVVU5BQ0FCUVFWcVFRQkJnd0lRS3hvZ0FVRUZPZ0FFSUFGQkFUWUNBQ0FBS0FKUUlnUWdBVUVJYWlJRk5nSUVJQUVnQUVIUUFHbzJBZ3dnQVNBRU5nSUlJQUFnQlRZQ1VDQUJJQU1nQUNnQ1FFRURkQ0FBS0FJQUVRTUFJZ1EyQWlnZ0JFVUVRQ0FESUFFZ0FDZ0NCQkVBQUF3QkN5QUJJQUEyQWhBZ0FDZ0NTQ0lESUFGQkZHb2lCVFlDQkNBQklBQkJ5QUJxTmdJWUlBRWdBellDRkNBQUlBVTJBa2dnQVVMeGdJQ0FnRGszQXR3QklBRWdBRUhZQVdvMkF0Z0JJQUFvQWtBaUFFRUFJQUJCQUVvYklRQURRQ0FBSUFKR1JRUkFJQVFnQWtFRGRHcENnSUNBZ0NBM0F3QWdBa0VCYWlFQ0RBRUxDeUFCUW9DQWdJQWdOd05RSUFGQ2dJQ0FnQ0EzQTBnZ0FVS0FnSUNBSURjRFFDQUJJQUZCOUFGcUlnQTJBdmdCSUFFZ0FEWUM5QUVnQVVLQWdJQ0FJQkJISVFjZ0FTZ0NLQ0FITndNSVFRQWhBaUFCSUFGQkVVSE1uZ0ZCQUVFQVFRQWdCeER4QVNJSE53TXdJQWRDSUlpblFYVlBCRUFnQjZjaUFDQUFLQUlBUVFGcU5nSUFDeUFCS0FJb0lBYzNBMmdnQVJBMElRY2dBU2dDS0NBSE53TVlJQUVnQjBHUTFRRkJBeEFpQTBBZ0FTZ0NLQ0VBSUFKQkNFWkZCRUFnQWtFQ2RFR1FwZ0ZxS0FJQUlRTWdBU0FCSUFBcEF4Z1FSeUlIUVRZZ0FTQURFTW9FUVFNUUdSb2dBU0FIUVRNZ0FVRXZFQzFCQXhBWkdpQUJJQUpCQTNScUlBYzNBMWdnQWtFQmFpRUNEQUVMQ3lBQklBQXBBd2hCQWhCSklRY2dBU2dDS0NBSE53TVFRUUFoQWlBQklBRWdCNmRCQUNBSFF2Ly8vLzl2Vmh0QkFSREZCRFlDSkNBQklBRkJKR3BCQUVFd1FRb1F3d1FhSUFFZ0FVRVNRUUJCQUJEZUFqY0RzQUVnQVVFVFFRQkJBQkRlQWlFSElBRWdBU2tETUVIUEFFS0FnSUNBTUNBSElBRXBBN0FCUVlFeUVHMGFJQUVnQVNrRE1FSE5BRUtBZ0lDQU1DQUhJQUVwQTdBQlFZRXlFRzBhSUFFZ0J4QVBJQUVnQVNBSElBRWdBVUd3QVdwQkFSQ3hCaEFQSUFFZ0FSQTBOd1BBQVNBQklBRkNnSUNBZ0NBUVJ6Y0R5QUVnQVNBQlFjNHhRUlJCQVNBQktBSW9LUU1JRUw4QlFjRFZBVUVXRUNJZ0FTQUJLQUlvS1FNSVFhRFlBVUVMRUNJZ0FTQUJLUU13UWREWkFVRUhFQ0lnQVNBQlFSVkIzOHdBUVFGQkJVRUFFSUlCSWdjM0F6Z2dCMElnaUtkQmRVOEVRQ0FIcHlJQUlBQW9BZ0JCQVdvMkFnQUxJQUVnQjBIZnpBQWdBU2tETUJEZUFTQUJJQUZCRmtHOHdBQkJBVUVGUVg4UWdnRWlCMEc4d0FBZ0FTZ0NLQ2tER0JEZUFRTkFJQUpCQ0VaRkJFQWdBU0FCUVJZZ0FrRUNkRUdRcGdGcUtBSUFJZ0JCQWtFQklBSkJCMFliUVFVZ0FpQUhFUEVCSUFBZ0FTQUNRUU4wYWlrRFdCRGVBU0FDUVFGcUlRSU1BUXNMSUFFZ0FSQTBJZ2MzQTVnQklBRWdCMEhBMmdGQkFSQWlJQUVnQVNnQ0tDa0RFRUhRMmdGQklCQWlJQUZCMXg5QkYwRUJJQUVvQWlncEF4QVF2d0VpQjBJZ2lLZEJkVThFUUNBSHB5SUFJQUFvQWdCQkFXbzJBZ0FMSUFFZ0J6Y0RRQ0FCSUFkQjBONEJRUVFRSWlBR1FiQ21BVUhLQUJBZklnTWhBa0hqQUNFQUlBRkNnSUNBZ0NBUVJ5RUhBMEFnQUVIL0FYRUVRQ0FCSUFjZ0FrS0JnSUNBRUVFSEVPOEJHaUFDRUQ4Z0FtcEJBV29pQWkwQUFDRUFEQUVMQ3lBQklBRW9BaWdwQXhCQjJ3RWdCMEVCRUJrYUlBRWdBU0FCS0FJb0tRTVFJZ2RCNndBZ0IwRUFFQlEzQTZnQklBRWdBU2tEbUFFUVJ5RUhJQUVvQWlnZ0J6Y0Q0QUlnQVNBSFFaRGZBVUVDRUNJZ0FTQUJLUVBBQVVHdzN3RkJEaEFpSUFFZ0FTZ0NLQ2tEQ0VFRUVFa2hCeUFCS0FJb0lBYzNBeUFnQVNBSFFnQVEyd0VnQVNBQktBSW9LUU1nUWVEaEFVRUdFQ0lnQVNBQlFZZklBRUVZUVFFZ0FTZ0NLQ2tESUJDL0FVSEE0Z0ZCRGhBaUlBRWdBU2dDS0NrRENFRUdFRWtoQnlBQktBSW9JQWMzQXpBZ0FTQUhRb0NBZ0lBUUVOc0JJQUVnQVNnQ0tDa0RNRUdnNUFGQkFoQWlJQUZCOHRFQVFSbEJBU0FCS0FJb0tRTXdFTDhCR2lBQklBRW9BaWdwQXdoQkJSQkpJUWNnQVNnQ0tDQUhOd01vSUFFZ0J5QUJRUzhRTFJEYkFTQUJJQUZCME53QVFScEJBU0FCS0FJb0tRTW9FTDhCUWNEa0FVRURFQ0lnQVNBQktBSW9LUU1vUWZEa0FVRXhFQ0lnQVNBQktRT1lBUkJISVFjZ0FTZ0NLQ0FITndQb0FpQUJJQWRCOE9zQlFRSVFJaUFERUtNRUlBRkNBU0FETkFJSUlBTXBBd0JDd0lROWZud2lCeUFIUWdGWUd6Y0QwQUVnQVNBQktRUEFBVUdRN0FGQkFSQWlJQUVnQVNrRHdBRkI0UEVCUVFFUUlpQUJFRFFoQnlBQktBSW9JQWMzQXpnZ0FTQUhRZER6QVVFRkVDSWdBU0FCUVlQVEFFRWJRUUFnQVNnQ0tDa0RPQkMvQVNJSFFhRDBBVUVDRUNKQjBBRWhBaUFCSVFBRFFDQUNRZDRCUmtVRVFDQUFJQWNnQUNnQ0VDQURJQUlRa0FFaUJFRXVFS1lESWdWQkFXb2dCQ0FGR3lBQUlBSVFYRUVBRU84QkdpQUNRUUZxSVFJTUFRc0xJQUFnQUNrRG1BRVFSeUVISUFBb0FpZ2dCemNEK0FJZ0FDQUhRY0QwQVVFRUVDSWdBQ0FBS1FNd0VFY2hCeUFBS0FJb0lBYzNBNEFCSUFCQkZVSEl6QUJCQVVFRlFRRVFnZ0VoQnlBQUlBQW9BaWdwQTRBQlFZRDFBVUVCRUNJZ0FDQUFLQUlvSWdJcEE0QUJJQUlwQS9nQ1FRRkJBUkNXQWlBQUlBY2dBQ2dDS0NrRGdBRkJBRUVCRUpZQ0lBQWdCeEFQSUFBZ0FFRWNRYm5WQUVFQkVONENJZ2MzQTdnQklBQXBBOEFCSVFnZ0IwSWdpS2RCZFU4RVFDQUhweUlDSUFJb0FnQkJBV28yQWdBTElBQWdDRUU2SUFkQkF4QVpHaUFBS1FQQUFTSUhRaUNJcDBGMVR3UkFJQWVuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dBQ0FIUVlvQklBZEJBeEFaR2lBQUVEUWhCeUFBS0FJb0lBYzNBMUFnQUNBSFFkRExBVUV2RUNJZ0FDQUFRZVhpQUVFZFFRY2dBQ2dDS0NrRFVCQy9BVUhBMGdGQkF4QWlJQUJCSGpZQ2dBSWdBQ0FBS0FJb0tRTW9RWkRCQVVFQkVDSWdBRUVmTmdMOEFTQUFFRFFoQnlBQUtBSW9JQWMzQTVBQklBQWdCMEdnd1FGQkVSQWlJQUJCdHNrQVFTQkJBaUFBS0FJb0tRT1FBUkMvQVNJSFFpQ0lwMEYxVHdSQUlBZW5JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUhOd05JSUFBZ0IwR3d3d0ZCQVJBaUlBQWdBQ2tEbUFFUVJ5RUhJQUFvQWlnZ0J6Y0Q4QUlnQUNBSFFjRERBVUVDRUNJZ0FDQUFLUVBBQVVIZ3d3RkJBUkFpQWtBZ0FDZ0NFQ0lDS0FKQVFURlBCRUFnQWlnQ1JDZ0NnQWtOQVFzZ0FrSFlwQUZCTUVFQkVNMERHaUFDS0FKRUlnSkJrQWxxUVNFMkFnQWdBa0dVQ1dwQjVLUUJOZ0lBQ3lBQVFTSkIwUnBCQWtFQ1FRQVFnZ0VpQjBLQWdJQ0FjRm9FUUNBSHB5SUNJQUl0QUFWQkVISTZBQVVMSUFBZ0IwR2d4QUZCQVJBaUlBQWdBQ2tEd0FGQjBSb2dCMEVERU84QkdrRUFJUUlEUUFKQUlBSkJCRVlFUUVFQUlRSURRQ0FDUVFKR0RRSWdBQ0FBS1FPWUFSQkhJUWNnQUNnQ0tDQUNRUU4wYWlBSE53UFFBaUFBSUFjZ0FrRUNkRUdRcFFGcUtBSUFJQUpCbktVQmFpMEFBQkFpSUFKQkFXb2hBZ3dBQ3dBTElBQW9BaEFnQXlBQ1FiVUJhaENRQVNFRUlBQVFOQ0VISUFKQkptcEJBM1FpQlNBQUtBSW9haUFITndNQUlBQWdCeUFDUVFKMFFZQ2xBV29vQWdBZ0FrR1lwUUZxTFFBQUVDSWdBRUVqSUFSQkFFRURJQUlRZ2dFaEJ5QUNRUUZOQkVBZ0FDQUhRZkRJQVVFQkVDSUxJQUFnQnlBRUlBQW9BaWdnQldvcEF3QVEzZ0VnQWtFQmFpRUNEQUVMQ3lBQUVEUWhCeUFBS0FJb0lBYzNBNWdCSUFBZ0IwR1E5UUZCQXhBaUlBQWdBRUhreGdCQkpDQUFLQUlvS1FPWUFSQ1hCRUhBOVFGQkFoQWlJQUFRTkNFSElBQW9BaWdnQnpjRG9BRWdBQ0FIUWVEMUFVRURFQ0lnQUNBQVFiM0dBRUVsSUFBb0FpZ3BBNkFCRUpjRVFaRDJBVUVCRUNJZ0FDQUFFRFFpQjBHZzlnRkJIaEFpSUFBZ0IwRTNJQUFnQUNnQ0tDa0RFQ0lJUVRjZ0NFRUFFQlJCQXhBWkdpQUFJQUJCSmtIU0gwRUFFTjRDSWdoQmdQb0JRUU1RSWlBQUlBZ2dCeEQ3QlVFVklRSURRQ0FDUVNCR1JRUkFJQUVnQnhCSElRa2dBa0VEZENJQUlBRW9BaWhxSUFrM0F3QWdBU0FKUWNXQkFVRUJJQUpCNWFZQmFpMEFBSFN0SWdsQkFCRHZBUm9nQVNBQlFTY2dBU2dDRUNBRElBSkJqZ0ZxRUpBQklnUkJBMEVESUFJZ0NCRHhBU0lLSUFRZ0FTZ0NLQ0FBYWlrREFCRGVBU0FCSUFwQnhZRUJJQWxCQUJEdkFSb2dBa0VCYWlFQ0RBRUxDeUFCSUFjUUR5QUJJQWdRRHlBQkVEUWhCeUFCS0FJb0lBYzNBNEFDSUFFZ0IwR3crZ0ZCR0JBaUlBRkJ1eUpCS0NBQktBSW9LUU9BQWhDWEJCb0NRQ0FCS0FJUUlnQW9Ba0JCTWs4RVFDQUFLQUpFS0FLWUNRMEJDeUFBUWFDbEFVRXhRUWtRelFNYUlBQW9Ba1FpQUVIUUNtcEJLVFlDQUNBQVFhQUtha0VxTmdJQUlBQkJpQXBxUVNvMkFnQWdBRUh3Q1dwQkt6WUNBQ0FBUWRnSmFrRXNOZ0lBSUFCQndBbHFRU3cyQWdBTElBRVFOQ0VISUFFb0FpZ2dCemNEaUFNZ0FTQUhRWURKQVVFRUVDSWdBVUV0UWFmakFFRUJRUUpCQUJDQ0FTSUhRaUNJcDBGMVR3UkFJQWVuSWdBZ0FDZ0NBRUVCYWpZQ0FBc2dBU0FITndOUUlBRWdCMEhBeVFGQkJ4QWlJQUVnQjBHbjR3QWdBU2dDS0NrRGlBTVEzZ0VnQVNBQktRTXdFRWNoQnlBQktBSW9JQWMzQTZBRElBRkJGVUhhekFCQkFVRUZRUUlnQVNrRE9CRHhBU0VISUFFZ0FTZ0NLQ2tEb0FOQnNNb0JRUUVRSWlBQklBY2dBU2dDS0NrRG9BTkJBRUVCRUpZQ0lBRWdCeEFQSUFFZ0FSQTBJZ2MzQTZBQklBRWdCMEhBeWdGQkFSQWlJQUVnQVNrRG9BRVFSeUVISUFFb0FpZ2dCemNEdUFNZ0FTQUhRZERLQVVFREVDSWdBU0FCS1FPZ0FSQkhJUWNnQVNnQ0tDQUhOd1BJQXlBQklBZEJnTXNCUVFRUUlpQUJJQUVwQXpBUVJ5RUhJQUVvQWlnZ0J6Y0R3QU1nQVVFVlFjUE1BRUVCUVFWQkF5QUJLUU00RVBFQklRY2dBU0FCS0FJb0tRUEFBMEhBeXdGQkFSQWlJQUVnQVNnQ0tDSUFLUVBBQXlBQUtRUElBMEVCUVFFUWxnSWdBU0FISUFFb0FpZ3BBOEFEUVFCQkFSQ1dBaUFCSUFjUUR5QUJLQUlRSWdCQkxqWUNsQUlnQUVFdk5nS2tBaUFBUVRBMkFxQUNJQUJCTVRZQ25BSWdBRUV5TmdLWUFpQUJFRFFoQnlBQktBSW9JQWMzQTRnQ0lBRWdCMEdBMHdGQkF4QWlJQUVnQVVHSUxVRXpRUUVnQVNnQ0tDa0RpQUlRdndGQnNOTUJRUTRRSWd3QkMwRUFJUUVMSUFaQjBBQnFKQUFnQVFzSEFDQUFFTjhFQzRjQ0FRaC9BbjRnQUNnQ0VDZ0NlQ01BSWdjaURDQUJweWdDSUNJSUtBSVFJZ2tnQTJvaUMwRURkQ0lLYTBzRVFDQUFFT2tCUW9DQWdJRGdBQXdCQ3lBSlFRQWdDVUVBU2hzaERTQUhJQXBCRDJwQmNIRnJJZ2NrQUFOK0lBWWdEVVlFZmtFQUlRWWdBMEVBSUFOQkFFb2JJUU1EUUNBRElBWkdSUVJBSUFjZ0JpQUpha0VEZEdvZ0JDQUdRUU4wYWlrREFEY0RBQ0FHUVFGcUlRWU1BUXNMSUFWQkFYRUVRQ0FBSUFFZ0FoQlNJUU1nQUNBSUtRTUFJZ0VnQVNBQ0lBTWJJQXNnQnhDUUF3d0RDeUFBSUFncEF3QWdDQ2tEQ0NBTElBY1FJUVVnQnlBR1FRTjBJZ3BxSUFnZ0Ntb3BBeGczQXdBZ0JrRUJhaUVHREFFTEN3c2hBU0FNSkFBZ0FRdXhBUUVCZnlBQVFjZ0FFRjhpQlFSQUlBVkJBRFlDQUFKQUlBQWdCVUVJYWlJR0lBRWdBaUFESUFRUTdRTUVRQ0FGUVFRMkFnQU1BUXNnQUNBR0VMUUNJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFJUUR5QUFJQUZCTHhCbElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUJRb0NBZ0lCd1dnUkFJQUduSUFVMkFpQUxJQUVQQ3lBQUtBSVFJQVVRN0FNZ0FDZ0NFQ0lBUVJCcUlBVWdBQ2dDQkJFQUFBdENnSUNBZ09BQUM0Z0hBZ2wvQVh3akFFRkFhaUlHSkFBQ1FDQUFLQUlRSWdvb0FuZ2dCaUFCcHlJSUxRQW9JZ3RCQTNRaURHdExCRUFnQUJEcEFVS0FnSUNBNEFBaEFRd0JDeUFJTFFBcElRMGdCaUFLS0FLTUFTSUFOZ0lRSUFvZ0JrRVFhallDakFFZ0FBUi9JQUFvQWloQkJIRUZRUUFMSVFBZ0NDZ0NJQ0VISUFZZ0FUY0RHQ0FHSUFBMkFqZ2dCaUFETmdJMEFrQWdBeUFMVGdSQUlBUWhBQXdCQ3lBRFFRQWdBMEVBU2hzaERpQUdJQXhCRDJwQjhCOXhheUlBSkFBRFFDQUpJQTVHQkVBZ0F5RUVBMEFnQkNBTFJrVUVRQ0FBSUFSQkEzUnFRb0NBZ0lBd053TUFJQVJCQVdvaEJBd0JDd3NnQmlBTE5nSTBCU0FBSUFsQkEzUWlER29nQkNBTWFpa0RBRGNEQUNBSlFRRnFJUWtNQVFzTEN5QUdJQUEyQWlBZ0NDZ0NKQ0VFQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBME9EUXNDQUFFQUFRY0lBd1FGQmdrS0N5QUZRUUZ4RFFwQ2dJQ0FnREFoQWlBTlFRSkhEUW9NQ3dzZ0JVRUJjUTBBUW9DQWdJQXdJUUlnRFVFRFJnMEtDeUFISUFJZ0F5QUFJQWd1QVNvZ0JCRUZBQ0VCREFzTElBY2dBaUFFRVFnQUlRRU1DZ3NnQnlBQ0lBQXBBd0FnQkJFWUFDRUJEQWtMSUFjZ0FpQUlMZ0VxSUFRUkVBQWhBUXdJQ3lBSElBSWdBQ2tEQUNBSUxnRXFJQVFSTkFBaEFRd0hDeUFISUFaQkNHb2dBQ2tEQUJCQ0RRVWdCaXNEQ0NBRUVRc0FJZys5SWdFQ2Z5QVBtVVFBQUFBQUFBRGdRV01FUUNBUHFnd0JDMEdBZ0lDQWVBc2lBTGU5VVFSQUlBQ3RJUUVNQnd0Q2dJQ0FnTUIrSUFGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2hBUXdHQzBLQWdJQ0E0QUFoQVNBSElBWkJDR29nQUNrREFCQkNEUVVnQnlBR0lBQXBBd2dRUWcwRklBWXJBd2dnQmlzREFDQUVFU01BSWcrOUlnRUNmeUFQbVVRQUFBQUFBQURnUVdNRVFDQVBxZ3dCQzBHQWdJQ0FlQXNpQUxlOVVRUkFJQUN0SVFFTUJndENnSUNBZ01CK0lBRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNoQVF3RkN5QUhJQUlnQXlBQUlBWkJDR29nQ0M0QktpQUVFUklBSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQkNBR0tBSUlJZ0JCQWtZTkJDQUhJQUVnQUJEL0FpRUJEQVFMRUFFQUN5QUhJQUlnQXlBQUlBUVJBZ0FoQVF3Q0N5QUhRWndpUVFBUUZRdENnSUNBZ09BQUlRRUxJQW9nQmlnQ0VEWUNqQUVMSUFaQlFHc2tBQ0FCQzlVQkFRVi9Jd0FpQlNFSUFrQWdBVUtBZ0lDQWNGUU5BQ0FCcHlJR0x3RUdRUTlIRFFBZ0JpZ0NJQ0VIQ3lBQUlBSWdBeUFESUFjdEFBUWlBRWdFZjBFQUlRWWdBMEVBSUFOQkFFb2JJUWtnQlNBQVFRTjBRUTlxUWZBZmNXc2lCU1FBQTM4Z0JpQUpSZ1IvSUFNaEJBTi9JQUFnQkVZRWZ5QUZCU0FGSUFSQkEzUnFRb0NBZ0lBd053TUFJQVJCQVdvaEJBd0JDd3NGSUFVZ0JrRURkQ0lLYWlBRUlBcHFLUU1BTndNQUlBWkJBV29oQmd3QkN3c0ZJQVFMSUFjdkFRWWdCMEVJYWlBSEtBSUFFUklBSVFFZ0NDUUFJQUVMMHdvQ0QzOEJmaU1BUVRCcklnVWtBQUpBSUFBZ0FSQlpJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQUpBSUFBZ0FSQW9JaE5DZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRUYvSVFRTUFRc0NRQ0FBUVFFZ0U2Y2lEQ2dDQkVILy8vLy9CM0VpQmlBR1FRRk5HMEVDZEJBcElndEZCRUJCZnlFRURBRUxJQVZCQURZQ0VBTkFJQVlnQjB3TkFTQUxJQVJCQW5ScUlBd2dCVUVRYWhESkFUWUNBQ0FFUVFGcUlRUWdCU2dDRUNFSERBQUxBQXNnQUNBVEVBOExJQUFnQVJBUFFvQ0FnSURnQUNFQklBUkJBRWdOQUFKQUFrQWdBa1VOQUNBREtRTUFJaE5DZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFBa0FnQUNBRlFReHFJQk1RNVFFaUFnUkFBa0FnQWkwQUFFSE9BRWNOQUNBQ0xRQUJRY1lBUncwQUlBSkJBMEVDSUFJdEFBSkJ5d0JHSWdNYmFpMEFBQ0lHUWNNQWEwSC9BWEZCQVVzTkFDQUZLQUlNSUFKQkEyb2dBa0VDYWlBREd5QUNhMEVCYWtZTkFnc2dBQ0FDRUZRZ0FFR0MwZ0JCQUJCUUN5QUFRUkJxSVJBZ0N5RUdEQUlMSUFBZ0FoQlVJQVlnQTBFQmRHcEJ3d0JySVFnTElBQW9BaEFoQWlBRlFnQTNBeGdnQlVJQU53TVFJQVVnQWpZQ0pDQUZRVHMyQWlBZ0FDSU1RUkJxSVJCQmZ5RUFBa0FnQlVFUWFpQUVRUUowSWdJUXhnRUVRRUVBSVFZTUFRc0NRQ0FJUlFSQVFRQWhCeUFFUVFBZ0JFRUFTaHNoQXdOQUlBTWdCMFlOQWlBSFFRSjBJUVlnQjBFQmFpRUhJQVlnQzJvb0FnQkIvd0ZORFFBTEN5QUZRUkJxSUFzZ0JDQUlRUUYyRU93RVFRQWhCaUFGS0FJY0RRRWdCU2dDRkNJSFFRSjJJZ0JCQVdzaENrRUFJUUlnQlNnQ0VDRUdBMEFDUUNBQUlBSktCRUFnQmlBQ0lnUkJBblJxS0FJQUVLWUNSUTBCQTBBZ0JDQUtSZ1JBSUFBaEFnd0RDeUFHSUFSQkFXb2lBMEVDZEdvb0FnQWlEUkNtQWlJSkJFQURRQUpBSUFJZ0JFb05BQ0FHSUFSQkFuUnFJZzRvQWdBaUR4Q21BaUFKVEEwQUlBNGdEellDQkNBRVFRRnJJUVFNQVFzTElBUkJBblFnQm1vZ0RUWUNCQ0FESVFRTUFRVWdBeUVDREFNTEFBc0FDeUFJUVFGeElBZEJDRWx5RFFOQkFTQUFJQUJCQVUwYklRNUJBU0VJUVFFaEFBTkFJQWdnRGtZTkJDQUdJQWhCQW5ScUtBSUFJZ01RcGdJaEJ5QUFJUVFDUUFKQUEwQWdCRUVBVEEwQklBWWdCRUVCYXlJRVFRSjBhaUlQS0FJQUlnSVFwZ0lpQ2dSQUlBY2dDa29oQWtHQUFpRUhJQUlOQVF3Q0N3c0NRQ0FEUWVFaWEwRVVTeUFDUVlBaWEwRVNTM0pGQkVBZ0EwRWNiQ0FDUWN3RWJHcEJuSTJoQVdzaEJ3d0JDd0pBSUFKQmdOZ0NheUlFUWFQWEFFc05BQ0FFUWYvL0EzRkJISEFnQTBHbkkyc2lCRUViUzNJTkFDQUNJQVJxSVFjTUFRdEJzQWNoQkVFQUlRb0RRQ0FFSUFwSURRSWdCVUVvYWlBRUlBcHFRUUp0SWcxQkFYUkI4TkVEYWk4QkFDSUhRUVoySWhGQkFuUkJrT0lDYWlnQ0FDSUpRUTUySWhJZ0IwRS9jV29pQnlBUklCSWdDVUVIZGtIL0FIRWdDVUVCZGtFL2NSRHJCQm9nQXlBRktBSXNheUFDSUFVb0FpZ2lDV3NnQWlBSlJoc2lDVUVBU0FSQUlBMUJBV3NoQkF3QkN5QUpCRUFnRFVFQmFpRUtEQUVMQ3lBSFJRMEJDeUFQSUFjMkFnQU1BUXNnQmlBQVFRSjBhaUFETmdJQUlBQkJBV29oQUFzZ0NFRUJhaUVJREFBTEFBc2dBa0VCYWlFQ0RBQUxBQXNnQlNnQ0VDSUdJQXNnQWhBZkdpQUVJUUFMSUF3b0FoQWlBa0VRYWlBTElBSW9BZ1FSQUFBZ0FFRUFTQTBCSUF3Z0JVRVFhaUFBRUQwTkFFRUFJUVFDUUFOQUlBQWdCRVlOQVNBRVFRSjBJUUlnQkVFQmFpRUVJQVZCRUdvZ0FpQUdhaWdDQUJDNUFVVU5BQXNnQlNnQ0VDZ0NFQ0lBUVJCcUlBVW9BaFFnQUNnQ0JCRUFBQXdCQ3lBRlFSQnFFRFloQVFzZ0VDZ0NBQ0lBUVJCcUlBWWdBQ2dDQkJFQUFBc2dCVUV3YWlRQUlBRUw3QWNDQzM0RWZ5TUFRVEJySWc4a0FBSkFJQUZDLy8vLy8yOVlCRUFnQUJBa1FvQ0FnSURnQUNFQkRBRUxRb0NBZ0lBd0lRWUNRQUpBSUFBZ0F5a0RBQkFvSWd0Q2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0FNQ0VIUW9DQWdJQXdJUUZDZ0lDQWdEQWhDVUtBZ0lDQU1DRU1EQUVMSUFBZ0FTQUFLUU5JRU9NQklneENnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFS0FnSUNBTUNFSFFvQ0FnSUF3SVFGQ2dJQ0FnREFoQ1F3QkN3SkFBa0FnQUNBQUlBRkI3UUFnQVVFQUVCUVFOeUlKUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQ2FjaUFrSDFBRUVBRU1jQklSSWdBa0g1QUVFQUVNY0JRUUJJQkVBZ0FFSE1uZ0VnQ1VIc0h4QytBU0lKUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVMSUE4Z0NUY0RLQ0FQSUFFM0F5QWdBQ0FNUVFJZ0QwRWdhaENuQVNJSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FCQStJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRUtBZ0lDQTRBQWhBUXdEQzBGL0lRSUNRQ0FES1FNSUlnUkNnSUNBZ0hDRFFvQ0FnSUF3VVEwQUlBQWdEMEVjYWlBRUVIZEJBRWdOQXlBUEtBSWNJZ0lOQUF3RUN3SitJQXVuSWhBcEFnUWlCS2RCLy8vLy93ZHhJaEVFUUNBU1FYOXpRUjkySVJJZ0JFTC8vLy8vQjRNaERTQUNyU0VPUVFBaEFnTkFJQUt0SVFRZ0FpRURBMEFnQXlBUlR3UkFJQUFnRUNBQ0lCRWdBaUFSU1JzZ0VSQ0VBUXdFQ3lBQUlBZEIxUUFnQTYwaUNoQkZRUUJJRFFZZ0FDQUdFQThDUUNBQUlBY2dDeERJQVNJR1FvQ0FnSUJ3Z3lJRlFvQ0FnSUFnVWdSQUlBVkNnSUNBZ09BQVVRMElJQUFnRDBFUWFpQUFJQWRCMVFBZ0IwRUFFQlFRb3dFTkNDQVBJQThwQXhBaUJTQU5JQVVnRFZNYklnVTNBeEFnQkNBRlVnMEJDeUFRSUFvZ0VoRHhBcWNoQXd3QkN3c2dBQ0FRSUFJZ0F4Q0VBU0lFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUVVnQUNBQklBZ2dCQkJxUVFCSURRVWdDRUlCZkNJRUlBNVJEUVlnQUNBUFFRaHFJQVlRUEEwRklBV25JUUpDQVNFRklBaENBU0FQS1FNSUlnb2dDa0lCVnh0OElRZ0RRQ0FFSUFoUkJFQWdCQ0VJREFJTElBQWdBQ0FHSUFVUWN4QTNJZ3BDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CaUFBSUFFZ0JDQUtFR3BCQUVnTkJpQUZRZ0Y4SVFVZ0JFSUJmQ0lFSUE1U0RRQUxDd3dGQ3lBQUlBY2dDeERJQVNJR1FvQ0FnSUJ3Z3lJRVFvQ0FnSURnQUZFTkF5QUVRb0NBZ0lBZ1VnMEVJQUFnRUVFQVFRQVFoQUVMSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQWlBQUlBRWdDQ0FFRUdwQkFFNE5Bd3dDQzBLQWdJQ0FNQ0VIQzBLQWdJQ0FNQ0VCQ3lBQUlBRVFEMEtBZ0lDQTRBQWhBUXNnQUNBTEVBOGdBQ0FNRUE4Z0FDQUhFQThnQUNBSkVBOGdBQ0FHRUE4TElBOUJNR29rQUNBQkMrQUNBUVorSUFGQy8vLy8vMjlZQkVBZ0FCQWtRb0NBZ0lEZ0FBOExRb0NBZ0lEZ0FDRUlRb0NBZ0lBd0lRWUNRQUpBQWtBZ0FDQURLUU1BRUNnaUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQVFvQ0FnSUF3SVFRTUFRc2dBQ0FCUWRVQUlBRkJBQkFVSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBUkNBQkJTUlFSQUlBQWdBVUhWQUVJQUVFVkJBRWdOQVFzZ0FDQUJJQWNReUFFaUJVS0FnSUNBY0lNaUNVS0FnSUNBNEFCUkRRRWdBQ0FCUWRVQUlBRkJBQkFVSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVFKQUlBQWdCaUFFRUZJRVFDQUFJQVFRRHd3QkN5QUFJQUZCMVFBZ0JCQkZRUUJPRFFCQ2dJQ0FnREFoQkF3Q0N5QUFJQWNRRHlBQUlBWVFEMEwvLy8vL0R5RUlJQWxDZ0lDQWdDQlJEUUlnQUNBRlFkY0FJQVZCQUJBVUlRRWdBQ0FGRUE4Z0FROExRb0NBZ0lBd0lRVUxJQUFnQlJBUElBQWdCeEFQSUFBZ0JoQVBJQUFnQkJBUEN5QUlDODBFQWdaK0FYOGpBRUVnYXlJQ0pBQUNRQ0FCUXYvLy8vOXZXQVJBSUFBUUpFS0FnSUNBNEFBaEJ3d0JDMEtBZ0lDQTRBQWhCMEtBZ0lDQU1DRUlBa0FnQUNBREtRTUFFQ2dpQ1VLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBUW9DQWdJQXdJUVJDZ0lDQWdEQWhCVUtBZ0lDQU1DRUdEQUVMQWtBQ1FDQUFJQUVnQUNrRFNCRGpBU0lHUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJDZ0lDQWdEQWhCQXdCQ3lBQUlBQWdBVUh0QUNBQlFRQVFGQkEzSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRklOQVF0Q2dJQ0FnREFoQlF3QkN5QUNJQVEzQXhnZ0FpQUJOd01RSUFBZ0JrRUNJQUpCRUdvUXB3RWlCVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQWtFSWFpQUFJQUZCMVFBZ0FVRUFFQlFRb3dFTkFDQUFJQVZCMVFBQ2ZpQUNLUU1JSWdGQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFGQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBQnViMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVJVRUFTQTBBUW9DQWdJRGdBQ0VJSUFCQkxoQjJJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBUVNBUUtTSURSUVJBSUFFaENBd0JDeUFESUFrM0F3Z2dBeUFGTndNQUlBTWdCS2NpQ2tIbkFFRUFFTWNCUVg5elFSOTJOZ0lRSUFwQjlRQkJBQkRIQVNFS0lBTkJBRFlDR0NBRElBcEJmM05CSDNZMkFoUWdBVUtBZ0lDQWNGb0VRQ0FCcHlBRE5nSWdDeUFBSUFZUUR5QUFJQVFRRHlBQklRY01BUXNnQUNBSkVBOGdBQ0FHRUE4Z0FDQUVFQThnQUNBRkVBOGdBQ0FJRUE4TElBSkJJR29rQUNBSEM3NEVBZ2QrQW44akFFRVFheUlDSkFBQ1FDQUJRdi8vLy85dldBUkFJQUFRSkVLQWdJQ0E0QUFoQmd3QkMwS0FnSUNBNEFBaEJrS0FnSUNBTUNFRkFrQWdBQUorQWtBZ0FDQURLUU1BRUNnaUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdBQ0FCUWU0QUlBRkJBQkFVRUNZaUEwRUFTQTBBSUFORkJFQWdBQ0FCSUFjUXlBRWhCZ3dEQ3lBQUlBQWdBVUh2QUNBQlFRQVFGQkFtSWd0QkFFZ05BQ0FBSUFGQjFRQkNBQkJGUVFCSURRQkNnSUNBZ09BQUlBQVFQaUlJUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVhSUFlbklRd0NRQU5BSUFBZ0JSQVBJQUFnQVNBSEVNZ0JJZ1ZDZ0lDQWdIQ0RJZ1JDZ0lDQWdDQlJEUUVDUUNBRVFvQ0FnSURnQUZFTkFBSi9JQUFnQUNBRlFnQVFUUkEzSWdSQ2dJQ0FnSENESWdwQ2dJQ0FnSkIvVWdSQVFRQWdDa0tBZ0lDQTRBQlNEUUVhREFJTElBU25LQUlFUWYvLy8vOEhjVVVMSVFNZ0FDQUlJQWtnQkJDR0FVRUFTQTBBSUFsQ0FYd2hDU0FEUlEwQklBQWdBa0VJYWlBQUlBRkIxUUFnQVVFQUVCUVFvd0ZCQUVnTkFDQUFJQUZCMVFBQ2ZpQU1JQUlwQXdnZ0N4RHhBaUlFUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FFUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQkxtOUlnUkNnSUNBZ01DQmdQei9BSDBnQkVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUVWQkFFNE5BUXNMSUFnTUFnc2dDYWNFUUNBSUlRWU1Bd3NnQUNBSUVBOUNnSUNBZ0NBaEJnd0NDMEtBZ0lDQU1Bc1FEd3NnQUNBRkVBOGdBQ0FIRUE4TElBSkJFR29rQUNBR0M0MFZBZ3AvRFg0akFFR1FBV3NpQkNRQUFrQWdBVUwvLy8vL2IxZ0VRQ0FBRUNSQ2dJQ0FnT0FBSVJBTUFRc2dBeWtEQ0NFWklBQWdCRUU0YWtFQUVEMGFJQVJCQURZQ01DQUVRb0NBZ0lEQUFEY0RLQ0FFSUFBMkFnQWdCQ0FFUVFocUlnbzJBZ1JDZ0lDQWdPQUFJUkJDZ0lDQWdEQWhFUUpBQWtBZ0FDQURLUU1BRUNnaUZFS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQVFvQ0FnSUF3SVJOQ2dJQ0FnREFoQVVLQWdJQ0FNQ0VQUW9DQWdJQXdJUmNNQVF0Q2dJQ0FnREFoRndKQUlBQWdHUkE0SWdoRkJFQWdBQ0FaRUNnaUYwS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQURBSUxJQmVuSVFVTElBQWdBQ0FCUWU0QUlBRkJBQkFVRUNZaURFRUFTQTBBSUF3RVFDQUFJQUFnQVVIdkFDQUJRUUFRRkJBbUlnMUJBRWdOQVNBQUlBRkIxUUJDQUJCRlFRQklEUUVMSUJTbklRbENnSUNBZ0RBaER3SkFBa0FDUUFKQUlBVkZEUUFnREVVTkFDQUZLUUlFUXYvLy8vOEhnMElBVWcwQUFrQWdBQ0FCUVR3Z0FVRUFFQlFpRGtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0RpQUFLUU5JRUZJaEFpQUFJQTRRRHlBQ1JRMEJJQUFnQVVHR0FTQUJRUUFRRkNJT1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0RrSFZBRUVBRUlVRUlRSWdBQ0FPRUE4Z0FrVU5BUXNnQUNBQkVQQUNJZ0pGRFFOQkFDRURJQUFnQkVIUUFHcEJBQkE5R2lBQUlCUVFLQ0lTUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlDUUNBQ0tBSUVJZ2N0QUJBaUJrRWhjU0lLUlFSQUlBUkNBRGNEZ0FFTUFRc2dBQ0FCUWRVQUlBRkJBQkFVSWc1Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQUlBUkJnQUZxSUE0UW93RU5Bd3RCQUNFSUFrQWdCeTBBRVNJQ1JRMEFJQUFnQWtFRGRCQXBJZ01OQUVFQUlRTU1Bd3NnQjBFUWFpRU1JQVpCRUhFaERTQUdRUUZ4SVFjZ0VxY2lDMEVRYWlFRklBc3BBZ1FpRDZkQkgzWWhDU0FFS1FPQUFTRVJBMEFnRVNBUFF2Ly8vLzhIZzFVTkFnSkFJQU1nRENBRklCR25JQStuUWYvLy8vOEhjU0FKSUFBUThBUWlBa0VCUndSQUlBSkJBRWdOQVNBS1JTQUNRUUpIY1EwRUlBQWdBVUhWQUVJQUVFVkJBRWdOQlF3RUN5QURLQUlBSVFZZ0JDQURLQUlFSUFWcklBbDFJZ0kyQW93QklBWWdCV3NnQ1hVaUJpQUlTZ1JBSUFSQjBBQnFJQXNnQ0NBR0VGRU5CUXNnQjBVRVFDQUFJQUZCMVFBZ0FpSUlyUkJGUVFCT0RRUU1CUXNnQWlFSUFrQWdBaUFHUncwQUFrQUNRQ0FOUlEwQUlBWWdDeWtDQkNJT3AwSC8vLy8vQjNGUERRQWdEa0tBZ0lDQUNJTkNBRklOQVFzZ0JDQUdRUUZxSWdnMkFvd0JEQUVMSUFzZ0JFR01BV29ReVFFYUlBUW9Bb3dCSVFnTElBc3BBZ1FoRHlBSXJDRVJJQUloQ0F3QkN3c2dBRUdMeXdCQkFCQkdEQUlMQWtBQ1FBSkFBMEFDUUNBQUlBRWdGQkRJQVNJU1FvQ0FnSUJ3Z3lJT1FvQ0FnSUFnVWdSQUlBNUNnSUNBZ09BQVVRUkFJQTRoRUF3RkN5QUVLQUl3RFFRQ1FDQUVLQUlvSWdNZ0JDZ0NMRWdFUUNBRUtBSUVJUVVNQVFzZ0F5QURRUUYxYWtFZmFrRnZjU0lEUVFOMElRY2dCQ2dDQUNFR0FrQUNRQ0FLSUFRb0FnUWlBa1lFUUNBR1FRQWdCeUFFUWRBQWFoQ29BU0lGUlEwQklBVWdDaWtEQURjREFDQUZJQW9wQXhnM0F4Z2dCU0FLS1FNUU53TVFJQVVnQ2lrRENEY0RDQXdDQ3lBR0lBSWdCeUFFUWRBQWFoQ29BU0lGRFFFTElBUVE3Z1FnQkNnQ0FDQVNFQThnQkVGL05nSXdEQVlMSUFRZ0JUWUNCQ0FFSUFRb0FsQkJBM1lnQTJvMkFpd2dCQ2dDS0NFREN5QUVJQU5CQVdvMkFpZ2dCU0FEUVFOMGFpQVNOd01BSUF3TkFVS0FnSUNBTUNFUEN5QVVRaUNJcDBGMVNTRURRUUFoQjBFQUlRVkNnSUNBZ0RBaEUwS0FnSUNBTUNFQkEwQWdCQ2dDS0NBRlNnUkFJQUFnQkVHTUFXb2dCQ2dDQkNBRlFRTjBhaWtEQUNJV0VOWUJRUUJJRFFRZ0FDQVBFQThnQUNBQUlCWkNBQkJORURjaUQwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwTElBQWdCRUdBQVdvZ0FDQVdRZGNBSUJaQkFCQVVFS01CRFFzQ1FDQUVLUU9BQVNJU0lBa3BBZ1JDLy8vLy93ZURJaEJWQkVBZ0JDQVFOd09BQVNBUUlSSU1BUXNnRWtJQVdRMEFRZ0FoRWlBRVFnQTNBNEFCQ3lBQUlBRVFEMEtBZ0lDQTRBQWhFQ0FBRUQ0aUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQVFvQ0FnSURnQUNFQkRBd0xJQTlDSUlpblFYVlBCRUFnRDZjaUFpQUNLQUlBUVFGcU5nSUFDeUFBSUFGQ0FDQVBRWWVBQVJDOUFVRUFTQTBMUVFFZ0JDZ0NqQUVpQWlBQ1FRRk5HeUlHclNFYVFnRWhHQU5BSUJnZ0dsSUVRQ0FBSUJZZ0dCQnpJaFZDZ0lDQWdIQ0RJZzVDZ0lDQWdEQlNCRUFnRGtLQWdJQ0E0QUJSQkVBZ0RpRVFEQThMSUFBZ0ZSQTNJaFZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5Cd3NnQUNBQklCZ2dGUkJxSVFJZ0dFSUJmQ0VZSUFKQkFFNE5BUXdOQ3dzZ0FDQVJFQThnQUNBV1FZY0JJQlpCQUJBVUloRkNnSUNBZ0hDRElnNUNnSUNBZ09BQVVRMExBa0FnQ0FSQUlBQWdBU0FhSUJKQy8vLy8vdytERUdwQkFFZ05EU0FEUlFSQUlBa2dDU2dDQUVFQmFqWUNBQXNnQUNBQklBWkJBV3F0SUJRUWFrRUFTQTBOSUE1Q2dJQ0FnREJTQkVBZ0VVSWdpS2RCZFU4RVFDQVJweUlDSUFJb0FnQkJBV28yQWdBTElBQWdBU0FHUVFKcXJTQVJFR3BCQUVnTkRnc2dCQ0FCTndOWUlBUkNnSUNBZ0RBM0ExQWdBQ0FURUE4Z0FDQUFJQmtnQkNBRVFkQUFha0VBRUowREVEY2hFd3dCQzBLQWdJQ0FNQ0VWSUE1Q2dJQ0FnREJTQkVBZ0FDQVJFQ1VpRlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBOQ3lBRUlCYzNBM2dnQkNBVk53TndJQVFnQVRjRGFDQUVJQlEzQTFnZ0JDQVBOd05RSUFRZ0VrTC8vLy8vRDRNM0EyQWdBQ0FURUE4Z0FDQUVRZEFBYWhEdEJDRVRJQUFnRlJBUEN5QVRRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRc2dCNndnRWxjRVFDQUVRVGhxSWdJZ0NTQUhJQktuRUZFYUlBSWdFeENIQVJvZ0Q2Y3BBZ1JDLy8vLy93ZURJQko4cHlFSEN5QUZRUUZxSVFVTUFRc0xJQVJCT0dvaUFpQUpJQWNnQ1NnQ0JFSC8vLy8vQjNFUVVSb2dBaEEySVJBTUNnc2dBQ0FQRUE5Q2dJQ0FnREFoRXdKQUFuOENRQ0FBSUFBZ0VrSUFFRTBRTnlJUFFvQ0FnSUJ3Z3lJT1FvQ0FnSUNRZjFJRVFDQU9Rb0NBZ0lEZ0FGSU5BU0FPSVJBTUF3c2dENmNvQWdSQi8vLy8vd2R4RFFBZ0FDQUVRZEFBYWlBQUlBRkIxUUFnQVVFQUVCUVFvd0ZCQUVnTkFpQUFJQUZCMVFBQ2ZpQUpJQVFwQTFBZ0RSRHhBaUlPUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FPUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnRHJtOUlnNUNnSUNBZ01DQmdQei9BSDBnRGtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUVVaUFrRUFUZzBBSUFKQkhuWkJBbkVNQVF0QkFBdEZEUUVMQ3d3Q0N3d0dDMEtBZ0lDQU1DRVRDMEtBZ0lDQU1DRUJEQVFMSUFSQjBBQnFJQXNnQ0NBTEtBSUVRZi8vLy84SGNSQlJEUUFnQUNBU0VBOGdBQ2dDRUNJQ1FSQnFJQU1nQWlnQ0JCRUFBQ0FFUWRBQWFoQTJJUkFNQVFzZ0FDQVNFQThnQUNnQ0VDSUNRUkJxSUFNZ0FpZ0NCQkVBQUNBRUtBSlFLQUlRSWdKQkVHb2dCQ2dDVkNBQ0tBSUVFUUFBQzBLQWdJQ0FNQ0VSQzBLQWdJQ0FNQ0VUUW9DQWdJQXdJUUZDZ0lDQWdEQWhEd3NnQkNnQ09DZ0NFQ0lDUVJCcUlBUW9BandnQWlnQ0JCRUFBQXNnQkJEdUJDQUFJQmNRRHlBQUlBOFFEeUFBSUFFUUR5QUFJQk1RRHlBQUlCRVFEeUFBSUJRUUR3c2dCRUdRQVdva0FDQVFDNklCQUNNQVFTQnJJZ0lrQUFKK0FrQWdBVUwvLy8vL2IxZ0VRQ0FBRUNRTUFRc2dBQ0FDUVFocUlnTkJBQkE5R2lBRFFTOFFPeG9DUUNBRElBQWdBVUhzQUNBQlFRQVFGQkIvRFFBZ0FrRUlhaUlEUVM4UU94b2dBeUFBSUFGQjdRQWdBVUVBRUJRUWZ3MEFJQUpCQ0dvUU5nd0NDeUFDS0FJSUtBSVFJZ0JCRUdvZ0FpZ0NEQ0FBS0FJRUVRQUFDMEtBZ0lDQTRBQUxJUUVnQWtFZ2FpUUFJQUVMVGdFQ2ZrS0FnSUNBNEFBaEJDQUFJQUVnQXlrREFCRElBU0lCUW9DQWdJQndneUlGUW9DQWdJRGdBRklFZmlBQUlBRVFEeUFGUW9DQWdJQWdVcTFDZ0lDQWdCQ0VCVUtBZ0lDQTRBQUxDL2dDQWdOK0FYOENRQUpBSUFBZ0FSRHdBaUlDUlEwQUlBTXBBd2doQmdKQUFrQUNRQ0FES1FNQUlnUkNnSUNBZ0hCVURRQWdCS2NpQXk4QkJrRVNSdzBBSUFaQ2dJQ0FnSENEUW9DQWdJQXdVZ1JBSUFCQm52a0FRUUFRRlVLQWdJQ0E0QUFQQ3lBREtBSWdJZ2NnQnlnQ0FFRUJhallDQUNBREtBSWtJZ01nQXlnQ0FFRUJhallDQUNBSHJVS0FnSUNBa0grRUlRUWdBNjFDZ0lDQWdKQi9oQ0VGREFFTFFvQ0FnSUF3SVFVQ2ZpQUVRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFRUzhRTFF3QkN5QUFJQVFRS0FzaUJFS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBQWdCQ0FHRUpnRUlnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFRc2dBQ0FDTlFJQVFvQ0FnSUNRZjRRUUR5QUFJQUkxQWdSQ2dJQ0FnSkIvaEJBUElBSWdCVDRDQkNBQ0lBUStBZ0FnQUNBQlFkVUFRZ0FRUlVFQVNBMEJJQUZDSUlpblFYVkpEUUlnQWFjaUFDQUFLQUlBUVFGcU5nSUFEQUlMSUFBZ0JCQVBJQUFnQlJBUEMwS0FnSUNBNEFBUEN5QUJDMm9CQVg4Z0FVTC8vLy8vYjFnRVFDQUFFQ1JDZ0lDQWdPQUFEd3NDZmlBQnB5SURMd0VHUVJKSEJFQkNnSUNBZ0RBZ0FDQUJJQUFvQWlncEE1QUJFRklOQVJvZ0FFRVNFSVlEUW9DQWdJRGdBQThMSUFNb0FpUXRBQkFnQW5GQkFFZXRRb0NBZ0lBUWhBc0x2UVFCQ1g4akFFRWdheUlISkFBQ1FBSkFBa0FDUUFKQUlBRkMvLy8vLzI5WUJFQWdBQkFrREFFTElBQWdBU0FBS0FJb0tRT1FBUkJTRFFJZ0FDQUJFUEFDSWdJTkFRdENnSUNBZ09BQUlRRU1Bd3NnQWlnQ0FDSUlLQUlFSWdKQi8vLy8vd2R4SWdNTkFRc2dBRUgra3dFUVlpRUJEQUVMSUFBZ0IwRUlhaUFESUFKQkgzWVFpZ01hSUFoQkVHb2hCaUFJS0FJRVFmLy8vLzhIY1NFSlFRQWhBQU5BQWtBQ1FDQUFJQWxJQkVBZ0FFRUJhaUVDUVg4aEJRSkFBbjhDUUFKQUFrQUNRQUpBQWtBQ1FBSi9JQWdwQWdSQ2dJQ0FnQWlESWdGUUlncEZCRUFnQmlBQVFRRjBhaThCQUF3QkN5QUFJQVpxTFFBQUN5SURRZHNBYXc0REF3RUNBQXNnQWlFQUFrQWdBMEVLYXc0RUJBc0xCUUFMSUFOQkwwY05CeUFFUlEwRlFRRWhCRUV2SVFNTUJ3dEIzQUFoQXlBQ0lBbE9EUVlnQUVFQ2FpRUFJQXBGQkVBZ0JpQUNRUUYwYWk4QkFDRUZEQW9MSUFJZ0Jtb3RBQUFoQlF3SkMwRUFJUVJCM1FBaEF3d0ZDMEhiQUNFRElBUWdBaUFKVG5JTkJpQUFRUUpxSVFBZ0FWQUVRRUhkQUVGL0lBSWdCbW90QUFCQjNRQkdJZ1FiSVFVZ0FDQUNJQVFiSVFCQkFTRUVEQWdMUVFFaEJFSGRBRUYvSUFZZ0FrRUJkR292QVFCQjNRQkdJZ29iSVFVZ0FDQUNJQW9iSVFBTUJ3dEI3Z0FNQWd0QjhnQU1BUXRCQUNFRVFTOExJUVZCM0FBaEF3c2dBaUVBREFJTElBZEJDR29RTmlFQkRBTUxJQUloQUVFQklRUUxJQWRCQ0dvZ0F4Q0xBUm9nQlVFQVNBMEFJQWRCQ0dvZ0JSQ0xBUm9NQUFzQUN5QUhRU0JxSkFBZ0FRdldBZ0lEZndGK0l3QkJFR3NpQkNRQUFrQWdBVUwvLy8vL2IxZ0VRQ0FBRUNSQ2dJQ0FnT0FBSVFVTUFRdENnSUNBZ09BQUlRVWdBQ0FBSUFGQjdnQWdBVUVBRUJRUUppSUNRUUJJRFFBZ0FnUi9JQVJCNXdBNkFBZ2dCRUVKYWdVZ0JFRUlhZ3NoQWlBQUlBQWdBVUhyNHdBUXNnRVFKaUlEUVFCSURRQWdBd1JBSUFKQjZRQTZBQUFnQWtFQmFpRUNDeUFBSUFBZ0FVR0w1UUFRc2dFUUppSURRUUJJRFFBZ0F3UkFJQUpCN1FBNkFBQWdBa0VCYWlFQ0N5QUFJQUFnQVVIMDFBQVFzZ0VRSmlJRFFRQklEUUFnQXdSQUlBSkI4d0E2QUFBZ0FrRUJhaUVDQ3lBQUlBQWdBVUh2QUNBQlFRQVFGQkFtSWdOQkFFZ05BQ0FEQkVBZ0FrSDFBRG9BQUNBQ1FRRnFJUUlMSUFBZ0FDQUJRZnNkRUxJQkVDWWlBMEVBU0EwQUlBQWdCRUVJYWlJQUlBTUVmeUFDUWZrQU9nQUFJQUpCQVdvRklBSUxJQUJyRUpNQ0lRVUxJQVJCRUdva0FDQUZDNlVEQVFSK0l3QkJFR3NpQXlRQUlBUUNmd0pBQWtBQ1FBSkFJQUFnQVVFdUVFc2lBa1VFUUVLQWdJQ0FNQ0VCREFFTElBSW9BaGdFUUVLQWdJQ0FNQ0VCUVFFTUJRc2dBQ0FDS1FNQUlnZ2dBaWtEQ0NJR0VNZ0JJZ0ZDZ0lDQWdIQ0RJZ2RDZ0lDQWdPQUFVZzBCQzBLQWdJQ0FNQ0VIREFFTElBZENnSUNBZ0NCUkJFQWdBa0VCTmdJWVFvQ0FnSUF3SVFGQkFRd0RDeUFDS0FJUUJFQWdBQ0FBSUFGQ0FCQk5FRGNpQjBLQWdJQ0FjSU1pQ1VLQWdJQ0E0QUJSRFFFQ1FDQUpRb0NBZ0lDUWYxSU5BQ0FIcHlnQ0JFSC8vLy8vQjNFTkFDQUFJQU5CQ0dvZ0FDQUlRZFVBSUFoQkFCQVVFS01CUVFCSURRSWdBQ0FJUWRVQUFuNGdCcWNnQXlrRENDQUNLQUlVRVBFQ0lnWkNnSUNBZ0FoOFF2Ly8vLzhQV0FSQUlBWkMvLy8vL3crRERBRUxRb0NBZ0lEQWZpQUd1YjBpQmtLQWdJQ0F3SUdBL1A4QWZTQUdRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c1FSVUVBU0EwQ0N5QUFJQWNRRHd3Q0N5QUNRUUUyQWhnTUFRc2dBQ0FCRUE4Z0FDQUhFQTlDZ0lDQWdPQUFJUUVMUVFBTE5nSUFJQU5CRUdva0FDQUJDdzRBSUFBUXRRSkNnSUNBZ09BQUN3a0FRb0NBZ0lEQWZnc1dBQ0FBSUFNcEF3QWdBeWtEQ0NBREtRTVFFSlFFQzlFQkFnTitBbjhqQUVFUWF5SUhKQUFDUUNBQUlBZEJER29nQXlrREFCRGxBU0lJUlFSQVFvQ0FnSURnQUNFRURBRUxJQUFnQ0NBSEtBSU1RZEtJQVJEMUJTRUJJQUFnQ0JCVUFrQWdBa0VDU0NBQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSY2cwQUlBQWdBeWtEQ0NJR0VEaEZEUUJDZ0lDQWdPQUFJUVFDUUNBQUVEUWlCVUtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQUVoQlF3QkN5QUFJQVZCTHlBQlFRY1FHVUVBU0EwQUlBQWdCVUV2SUFZUStRUWhCQXNnQUNBRkVBOE1BUXNnQVNFRUN5QUhRUkJxSkFBZ0JBc05BQ0FBSUFFZ0FrRXdFUDBGQ3dzQUlBQWdBVUV3RVA0RkM3UURBZ04vQW40akFFSFFBR3NpQmlRQVFYOGhCd0pBSUFBZ0JrSElBR29nQVVIQ0FCQ0JBU0lJUlEwQUlBWXBBMGdpQVVLQWdJQ0FjSU5DZ0lDQWdEQlJCRUFnQ0NrREFDRUJJQU5DSUlpblFYVlBCRUFnQTZjaUJ5QUhLQUlBUVFGcU5nSUFDeUFBSUFFZ0FpQURJQVFnQlJDR0JDRUhEQUVMSUFBZ0FoQmNJZ2xDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FBSUFFUUR3d0JDeUFJS1FNQUlRb2dCaUFFTndNNElBWWdBemNETUNBR0lBazNBeWdnQmlBS053TWdJQUFnQVNBSUtRTUlRUVFnQmtFZ2FoQXZJUUVnQUNBSkVBOGdBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFBa0FDUUNBQUlBRVFKaUlIQkVBZ0FDQUdJQWdvQWdBZ0FoQk1JZ0pCQUVnTkFTQUNSUTBEQWtBZ0JpZ0NBQ0lDUVJOeFJRUkFJQUFnQmlrRENDQURFRkpGRFFFTUJBc2dBa0VSY1VFUVJ3MERJQVkxQWh4Q0lJWkNnSUNBZ0RCU0RRTUxJQUFnQmhCSUlBQkJ5eTVCQUJBVkRBRUxJQVZCZ0lBQmNVVUVRRUVBSVFjZ0JVR0FnQUp4UlEwRElBQW9BaEFvQW93QklnSkZEUU1nQWkwQUtFRUJjVVVOQXdzZ0FFSGtHa0VBRUJVTFFYOGhCd3dCQ3lBQUlBWVFTQXNnQmtIUUFHb2tBQ0FIQzlRQ0FnSi9BbjRqQUVGQWFpSUVKQUFDUUFKQUlBQWdCRUU0YWlBQlFjRUFFSUVCSWdWRkRRQWdCQ2tET0NJQlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQUlBVXBBd0FnQWlBRFFRQVFGQ0VCREFJTElBQWdBaEJjSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUlBRVFEd3dCQ3lBRktRTUFJUWNnQkNBRE53TXdJQVFnQmpjREtDQUVJQWMzQXlBZ0FDQUJJQVVwQXdoQkF5QUVRU0JxRUM4aEFTQUFJQVlRRHlBQlFvQ0FnSUJ3Z3lJRFFvQ0FnSURnQUZFTkFDQUFJQVFnQlNnQ0FDQUNFRXdpQWtFQVNBMEFJQUpGRFFFQ1FBSkFJQVFvQWdBaUFrRVRjVVVFUUNBQUlBUXBBd2dnQVJCU1JRMEJEQUlMSUFKQkVYRkJFRWNOQVNBRFFvQ0FnSUF3VVNBRU5RSVVRaUNHUW9DQWdJQXdVbklOQVFzZ0FDQUVFRWdnQUNBQkVBOGdBRUdpTDBFQUVCVU1BUXNnQUNBRUVFZ01BUXRDZ0lDQWdPQUFJUUVMSUFSQlFHc2tBQ0FCQzVrQ0FnTi9BbjRqQUVGQWFpSURKQUJCZnlFRUFrQWdBQ0FEUVRocUlBRkI0d0FRZ1FFaUJVVU5BQ0FES1FNNElnRkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQWdCU2tEQUNBQ0VIRWhCQXdCQ3lBQUlBSVFYQ0lHUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBQkVBOE1BUXNnQlNrREFDRUhJQU1nQmpjREtDQURJQWMzQXlBZ0FDQUJJQVVwQXdoQkFpQURRU0JxRUM4aEFTQUFJQVlRRHlBQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUJFQ1lpQkEwQUFrQWdBQ0FESUFVb0FnQWlCQ0FDRUV3aUFrRUFUZ1JBSUFKRkRRRWdBeWdDQUNFQ0lBQWdBeEJJSUFKQkFYRUVRQ0FFTFFBRlFRRnhEUUlMSUFCQm96eEJBQkFWQzBGL0lRUU1BUXRCQUNFRUN5QURRVUJySkFBZ0JBdWVCZ0lIZndOK0l3QkJRR29pQnlRQVFYOGhDQUpBSUFBZ0IwRTRhaUFCUWVVQUVJRUJJZ2xGRFFBZ0J5a0RPQ0lPUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FBSUFrcEF3QWdBaUFESUFRZ0JTQUdFRzBoQ0F3QkN5QUFJQUlRWENJUFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0FCQTBJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FHUVlBUWNTSU5CRUFnQkVJZ2lLZEJkVThFUUNBRXB5SUtJQW9vQWdCQkFXbzJBZ0FMSUFBZ0FVSEJBQ0FFUVFjUUdSb0xJQVpCZ0NCeElnb0VRQ0FGUWlDSXAwRjFUd1JBSUFXbklnc2dDeWdDQUVFQmFqWUNBQXNnQUNBQlFjSUFJQVZCQnhBWkdnc2dCa0dBd0FCeElnc0VRQ0FEUWlDSXAwRjFUd1JBSUFPbklnd2dEQ2dDQUVFQmFqWUNBQXNnQUNBQlFjQUFJQU5CQnhBWkdnc2dCa0dBQkhFaURBUkFJQUFnQVVFK0lBWkJBWFpCQVhHdFFvQ0FnSUFRaEVFSEVCa2FDeUFHUVlBSWNRUkFJQUFnQVVFL0lBWkJBblpCQVhHdFFvQ0FnSUFRaEVFSEVCa2FDeUFHUVlBQ2NRUkFJQUFnQVVFOUlBWkJBWEd0UW9DQWdJQVFoRUVIRUJrYUN5QUpLUU1BSVJBZ0J5QUJOd013SUFjZ0R6Y0RLQ0FISUJBM0F5QWdBQ0FPSUFrcEF3aEJBeUFIUVNCcUVDOGhEaUFBSUE4UUR5QUFJQUVRRHlBT1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJZ0FDQU9FQ1pGQkVCQkFDRUlJQVpCZ0lBQmNVVU5BeUFBUWJuTEFFRUFFQlZCZnlFSURBTUxJQUFnQnlBSktBSUFJZ2tnQWhCTUlnSkJBRWdOQWlBR1FZRUNjU0VJQWtBQ1FDQUNSUVJBSUFoQmdBSkdEUUZCQVNFSUlBa3RBQVZCQVhGRkRRRU1CUXNDUUNBSEtBSUFJZ0lnQmhDVEEwVWdBa0VCY1NBSVFZQUNSbkZ5RFFBQ1FDQUdRWUF3Y1FSQUlBSkJFWEZCRUVjTkFTQU5CRUFnQUNBRUlBY3BBeEFRVWtVTkF3c2dDa1VOQVNBQUlBVWdCeWtER0JCU0RRRU1BZ3NnQzBVTkFDQUdRUUp4UlNBQ1FRTnhJZ0pCQWtaeERRRWdBZzBBSUFBZ0F5QUhLUU1JRUZKRkRRRUxJQXhGRFFJZ0J5Z0NBRUVUY1VFQ1J3MENDeUFBSUFjUVNBc2dBRUdzSEVFQUVCVkJmeUVJREFNTElBQWdCeEJJUVFFaENBd0NDeUFBSUE4UUR3c2dBQ0FPRUE4TElBZEJRR3NrQUNBSUM2NENBZ04vQW40akFFRkFhaUlESkFCQmZ5RUVBa0FnQUNBRFFUaHFJQUZCNUFBUWdRRWlCVVVOQUNBREtRTTRJZ0ZDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUFnQlNrREFDQUNRUUFRMVFFaEJBd0JDeUFBSUFJUVhDSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQ0FCRUE4TUFRc2dCU2tEQUNFSElBTWdCamNES0NBRElBYzNBeUFnQUNBQklBVXBBd2hCQWlBRFFTQnFFQzhoQVNBQUlBWVFEeUFCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBQkVDWWlCRVVFUUVFQUlRUU1BUXNDUUNBQUlBTWdCU2dDQUNBQ0VFd2lBa0VBVGdSQUlBSkZEUUlDUUNBRExRQUFRUUZ4QkVBZ0FDQUZLUU1BRUprQklnSkJBRWdOQVNBQ0RRTUxJQUJCaVJ4QkFCQVZDeUFBSUFNUVNBdEJmeUVFREFFTElBQWdBeEJJQ3lBRFFVQnJKQUFnQkFzUEFDQUFJQU1RRHlBQUVMVUNRWDhMbEFZQ0MzOENmaU1BUVVCcUlnVWtBRUYvSVFzQ1FDQUFJQVZCT0dvZ0EwSG5BQkNCQVNJR1JRMEFJQVVwQXpnaUEwS0FnSUNBY0lOQ2dJQ0FnREJSQkVBZ0FDQUJJQUlnQmlnQ0FFRURFSTRCSVFzTUFRc2dBQ0FESUFZcEF3aEJBU0FHRUM4aUEwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBVkJBRFlDTENBRlFRQTJBalFnQlVFQU5nSXdJQUFnQlVFMGFpQURFTllCSVFjZ0JTZ0NOQ0VLQWtBZ0J3MEFBa0FnQ2tVTkFDQUFJQXBCQTNRUVh5SUpEUUJCQUNFSkRBRUxBbjhDUUFOQUFrQWdCQ0FLUmdSQVFRRWdDaUFLUVFGTkd5RUlRUUVoQkFOQUlBUWdDRVlOQWlBSklBUWdDU0FFUVFOMGFpZ0NCQkQ2QkNFSElBUkJBV29oQkNBSFFRQklEUUFMSUFCQnhodEJBQkFWUVFBTUJBc2dBQ0FESUFRUXNBRWlEMEtBZ0lDQWNJTWlFRUtBZ0lDQWdIOVJJQkJDZ0lDQWdKQi9VWEpGQkVCQkFDQVFRb0NBZ0lEZ0FGRU5CQm9nQUNBUEVBOGdBRUhSTjBFQUVCVkJBQXdFQ3lBQUlBOFFNU0VJSUFBZ0R4QVBJQWhGRFFJZ0NTQUVRUU4wYWlJSFFRQTJBZ0FnQnlBSU5nSUVJQVJCQVdvaEJBd0JDd3RCQUNBQUlBWXBBd0FRbVFFaURFRUFTQTBCR2lBR0xRQVJCRUFnQUJDMkFnd0JDeUFBSUFWQkxHb2dCVUV3YWlBR0tBSUFRUU1RamdFRVFDQUZLQUl3SVFRZ0JTZ0NMQ0VJREFNTElBVW9BaXdoQ0NBRktBSXdJUVJCQUNFSEEwQWdCQ0FIUndSQUlBWXRBQkVFUUNBQUVMWUNEQVVMSUFBZ0JVRUlhaUFHS0FJQUlBZ2dCMEVEZEdvaURTZ0NCQkJNSWc1QkFFZ05CQUpBSUE1RkRRQWdBQ0FGUVFocUVFZ2dCUzBBQ0VFQmNVRUFJQXdiRFFBZ0NTQUtJQTBvQWdRUStnUWlEVUVBU0FSQUlBQkJxakpCQUJBVkRBWUxJQXdOQUNBSklBMUJBM1JxUVFFMkFnQUxJQWRCQVdvaEJ3d0JDd3NDUUNBTURRQkJBQ0VHQTBBZ0JpQUtSZzBCSUFaQkEzUWhCeUFHUVFGcUlRWWdCeUFKYWlnQ0FBMEFDeUFBUWZjWlFRQVFGUXdEQ3lBQUlBZ2dCQkJhSUFBZ0F4QVBJQUVnQ1RZQ0FDQUNJQW8yQWdCQkFDRUxEQU1MUVFBTElRUkJBQ0VJQ3lBQUlBZ2dCQkJhSUFBZ0NTQUtFRm9nQUNBREVBOExJQVZCUUdza0FDQUxDNjhFQWdSL0FuNGpBRUhnQUdzaUJDUUFRWDhoQlFKQUlBQWdCRUhZQUdvZ0FrSG1BQkNCQVNJR1JRMEFJQVlvQWdBaEJ5QUVLUU5ZSWdKQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFBZ0FTQUhJQU1RVENFRkRBRUxJQUFnQXhCY0lnaENnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUFJQUlRRHd3QkN5QUdLUU1BSVFrZ0JDQUlOd05JSUFRZ0NUY0RRQ0FBSUFJZ0Jpa0RDRUVDSUFSQlFHc1FMeUVDSUFBZ0NCQVBJQUpDZ0lDQWdIQ0RJZ2hDZ0lDQWdPQUFVUTBBQWtBQ1FBSkFJQWhDZ0lDQWdEQlJJQUpDLy8vLy8yOVdja1VFUUNBQUlBSVFEd3dCQ3lBQUlBUWdCeUFERUV3aUEwRUFTQTBDQWtBZ0EwVUVRRUVBSVFVZ0NFS0FnSUNBTUZFTkJRd0JDeUFBSUFRUVNDQUlRb0NBZ0lBd1VnMEFJQVF0QUFCQkFYRkZEUUZCQUNFRklBY3RBQVZCQVhGRkRRRU1CQXRCZnlFRklBQWdCaWtEQUJDWkFTSUdRUUJJRFFJZ0FDQUVRU0JxSUFJUSt3UWhCeUFBSUFJUUR5QUhRUUJJRFFNQ1FDQURCRUFnQkNnQ0FDSUZRWUE2UVlET0FDQUVLQUlnSWdOQkVIRWJJQU55RUpNRFJRMEJJQU5CQVhFTkF5QUZRUUZ4RFFFZ0EwRVNjUTBESUFWQkFuRU5BUXdEQ3lBR1JRMEFJQVF0QUNCQkFYRU5BZ3NnQUNBRVFTQnFFRWdMSUFCQm56MUJBQkFWUVg4aEJRd0NDd0pBSUFFRVFDQUJJQVFwQXlBM0F3QWdBU0FFS1FNNE53TVlJQUVnQkNrRE1EY0RFQ0FCSUFRcEF5ZzNBd2dNQVFzZ0FDQUVRU0JxRUVnTFFRRWhCUXdCQ3lBQUlBSVFEd3NnQkVIZ0FHb2tBQ0FGQzBvQUFrQWdCU2tEQUNJQlFvQ0FnSUJ3VkEwQUlBR25JZ0l2QVFaQk1FY05BQ0FDS0FJZ0lnSkZEUUFnQWtFQk9nQVJJQUFnQVJBUElBVkNnSUNBZ0NBM0F3QUxRb0NBZ0lBd0M4OEJBUU4rSXdCQkVHc2lBaVFBUW9DQWdJRGdBQ0VGQWtBQ1FBSitRb0NBZ0lBd0lBQkNnSUNBZ0RBZ0FDQURFUHdGSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUJvZ0FpQUVOd01JUW9DQWdJRGdBQ0FBUWRRQVFRQkJBRUVCSUFKQkNHb1F6d0VpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2lBQUVEUWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJJQVlMSVFFZ0FDQUVFQThnQUNBQkVBOE1BUXNnQUNBQlFZTUJJQVJCQnhBWkdpQUFJQUZCaEFFZ0JrRUhFQmthSUFFaEJRc2dBa0VRYWlRQUlBVUxzZ0VCQW40Z0FDQUJJQVJCQTNFaUFrRW1haEJMUlFSQVFvQ0FnSURnQUE4TFFvQ0FnSURnQUNFR0lBQWdBa0VxYWhCMklnVkNnSUNBZ0hDRFFvQ0FnSURnQUZJRWZpQUFRUkFRS1NJQ1JRUkFJQUFnQlJBUFFvQ0FnSURnQUE4TElBRkNJSWluUVhWUEJFQWdBYWNpQUNBQUtBSUFRUUZxTmdJQUN5QUNRUUEyQWd3Z0FpQUVRUUoxTmdJSUlBSWdBVGNEQUNBRlFvQ0FnSUJ3V2dSQUlBV25JQUkyQWlBTElBVUZRb0NBZ0lEZ0FBc0wwZ0lDQTM0RGZ5TUFRU0JySWdna0FFS0FnSUNBNEFBaEJRSkFJQUFnQVNBRVFTWnFFRXNpQ1VVTkFDQURLUU1BSVFkQ2dJQ0FnREFoQmlBQ1FRSk9CRUFnQXlrRENDRUdDeUFBSUFjUVlBMEFJQWxCQkdvaENpQUpLQUlJSVFNRFFDQURJQXBHQkVCQ2dJQ0FnREFoQlF3Q0N5QURRUXhyS0FJQUJFQWdBeWdDQkNFREJTQURRUkJySWdJZ0FpZ0NBRUVCYWpZQ0FDQURLUU1RSWdWQ0lJaW5RWFZQQkVBZ0JhY2lDU0FKS0FJQVFRRnFOZ0lBQ3lBSUlBVTNBd2dDUUNBRURRQWdBeWtER0NJRlFpQ0lwMEYxU1EwQUlBV25JZ2tnQ1NnQ0FFRUJhallDQUFzZ0NDQUJOd01RSUFnZ0JUY0RBQ0FBSUFjZ0JrRURJQWdRSVNFRklBQWdDQ2tEQUJBUElBUkZCRUFnQUNBSUtRTUlFQThMSUFNb0FnUWhBeUFBS0FJUUlBSVE2Z01nQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBZ0JSQVBDd3dBQ3dBTElBaEJJR29rQUNBRkMyQUFJQUFnQVNBQ1FTWnFFRXNpQUVVRVFFS0FnSUNBNEFBUEN5QUFLQUlNSWdCQkFFNEVRQ0FBclE4TFFvQ0FnSURBZmlBQXVMMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3d0WkFRRi9JQUFnQVNBRVFTWnFFRXNpQWtVRVFFS0FnSUNBNEFBUEN5QUNRUVJxSVFNZ0FpZ0NDQ0VFQTM0Z0F5QUVSZ1IrUW9DQWdJQXdCU0FFUVJCcklRVWdCQ2dDQkNFRUlBQW9BaEFnQWlBRkVQd0VEQUVMQ3dzVkFDQUFJQU1RRHlBQUlBUVFEeUFBRUxVQ1FYOExoZ0VBSUFBZ0FTQUVRU1pxRUVzaUFrVUVRRUtBZ0lDQTRBQVBDeUFBSUFJZ0F5a0RBQ0lCUWdBZ0FVSWdpS2RCQjJ0QmJrOGJJQUVnQVVLQWdJQ0F3SUdBL1A4QWZFTC8vLy8vLy8vLy8vOEFnMUFiRVBVQ0lnQkZCRUJDZ0lDQWdEQVBDeUFBS1FNb0lnRkNJSWluUVhWUEJFQWdBYWNpQUNBQUtBSUFRUUZxTmdJQUN5QUJDM1VBSUFBZ0FTQUVRU1pxRUVzaUFrVUVRRUtBZ0lDQTRBQVBDeUFBSUFJZ0F5a0RBQ0lCUWdBZ0FVSWdpS2RCQjJ0QmJrOGJJQUVnQVVLQWdJQ0F3SUdBL1A4QWZFTC8vLy8vLy8vLy8vOEFnMUFiRVBVQ0lnTkZCRUJDZ0lDQWdCQVBDeUFBS0FJUUlBSWdBeEQ4QkVLQmdJQ0FFQXRoQUNBQUlBRWdCRUVtYWhCTElnSkZCRUJDZ0lDQWdPQUFEd3NnQUNBQ0lBTXBBd0FpQVVJQUlBRkNJSWluUVFkclFXNVBHeUFCSUFGQ2dJQ0FnTUNCZ1B6L0FIeEMvLy8vLy8vLy8vLy9BSU5RR3hEMUFrRUFSNjFDZ0lDQWdCQ0VDN3NGQWdOK0IzOGpBRUVRYXlJTEpBQkNnSUNBZ09BQUlRY0NRQ0FBSUFFZ0JFRW1haEJMSWdKRkRRQWdBaWdDQUVVZ0F5a0RBQ0lGUWdBZ0JVSWdpS2RCQjJ0QmJrOGJJQVVnQlVLQWdJQ0F3SUdBL1A4QWZFTC8vLy8vLy8vLy8vOEFnMUFiSWdWQy8vLy8vMjlXY2tVRVFDQUFFQ1FNQVF0Q2dJQ0FnREFoQmlBRVFRRnhSUVJBSUFNcEF3Z2hCZ3NDUUNBQUlBSWdCUkQxQWlJREJFQWdBQ0FES1FNb0VBOE1BUXNnQUVFd0VDa2lBMFVOQVNBRElBSTJBZ2dnQTBJQk53TUFBa0FnQWlnQ0FBUkFJQU1nQmFjaUJDZ0NHRFlDRENBRUlBTTJBaGdNQVFzZ0JVSWdpS2RCZFVrTkFDQUZweUlFSUFRb0FnQkJBV28yQWdBTElBTWdCVGNESUNBQ0tBSVFJZ2tnQWlnQ0ZDSUVRUUZySUFVUTF3TnhRUU4wYWlJSUtBSUFJZ29nQTBFWWFpSU1OZ0lFSUFNZ0NEWUNIQ0FESUFvMkFoZ2dDQ0FNTmdJQUlBSW9BZ1FpQ0NBRFFSQnFJZ28yQWdRZ0F5QUNRUVJxSWd3MkFoUWdBeUFJTmdJUUlBSWdDallDQkNBQ0lBSW9BZ3hCQVdvaUNEWUNEQ0FJSUFJb0FoaEpEUUFnQUNBSlFRUWdCRUVCZENBRVFRRkdHeUlBUVFOMElBdEJER29RcUFFaUNFVU5BQ0FMS0FJTVFRTjJJQUJxSVFSQkFDRUFBMEFnQUNBRVJrVUVRQ0FJSUFCQkEzUnFJZ2tnQ1RZQ0JDQUpJQWsyQWdBZ0FFRUJhaUVBREFFTEN5QUVRUUZySVFvZ0FrRUlhaUVBQTBBZ0RDQUFLQUlBSWdCSEJFQWdBRUVNYXlnQ0FFVUVRQ0FJSUFBcEF4QVExd01nQ25GQkEzUnFJZ2tvQWdBaURTQUFRUWhxSWc0MkFnUWdBQ0FKTmdJTUlBQWdEVFlDQ0NBSklBNDJBZ0FMSUFCQkJHb2hBQXdCQ3dzZ0FpQUVOZ0lVSUFJZ0NEWUNFQ0FDSUFSQkFYUTJBaGdMSUFaQ0lJaW5RWFZQQkVBZ0JxY2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBRElBWTNBeWdnQVVJZ2lLZEJkVThFUUNBQnB5SUFJQUFvQWdCQkFXbzJBZ0FMSUFFaEJ3c2dDMEVRYWlRQUlBY0xxd01DQTM4QmZpTUFRUkJySWdja0FBSkFJQUFnQVNBRlFTcHFFRXNpQTBVRVFDQUVRUUEyQWdCQ2dJQ0FnT0FBSVFFTUFRdENnSUNBZ0RBaEFRSkFJQU1wQXdBaUNVS0FnSUNBY0lOQ2dJQ0FnREJSRFFBQ1FDQUpRb0NBZ0lCd1ZBMEFJQW1uSWdJdkFRWWdCVUVtYWtjTkFDQUNLQUlnSWdaRkRRQUNRQ0FES0FJTUlnaEZCRUFnQmlnQ0NDRUNEQUVMSUFnb0FoUWhBaUFBS0FJUUlBZ1E2Z01MSUFaQkJHb2hCZ05BSUFJZ0JrWUVRQ0FEUVFBMkFnd2dBQ0FES1FNQUVBOGdBMEtBZ0lDQU1EY0RBQXdEQ3lBQ1FReHJLQUlBQkVBZ0FpZ0NCQ0VDREFFTEN5QUNRUkJySWdZZ0JpZ0NBRUVCYWpZQ0FDQURJQVkyQWd3Z0JFRUFOZ0lBSUFNb0FnZ2lBMFVFUUNBQ0tRTVFJZ0ZDSUlpblFYVkpEUU1nQWFjaUFDQUFLQUlBUVFGcU5nSUFEQU1MSUFjZ0Fpa0RFQ0lCTndNQUlBVkZCRUFnQWlrREdDRUJDeUFISUFFM0F3Z2dBMEVCUmdSQUlBRkNJSWluUVhWSkRRTWdBYWNpQUNBQUtBSUFRUUZxTmdJQURBTUxJQUJCQWlBSEVJa0RJUUVNQWd0QitvTUJRYTc4QUVIOTV3SkJ4aVVRQUFBTElBUkJBVFlDQUFzZ0IwRVFhaVFBSUFFTFBRRUJma0tBZ0lDQUVDRUJJQU1wQXdBaUJFS0FnSUNBY0ZvRWZpQUVweThCQmtFVmEwSC8vd054UVF4SnJVS0FnSUNBRUlRRlFvQ0FnSUFRQ3d2cUF3SUVmZ0YvSXdCQklHc2lBaVFBUW9DQWdJRGdBQ0VGQWtBZ0FDQUJJQVFRU3lJSlJRMEFJQWt0QUFRRVFDQUFFR3NNQVFzZ0FDQUNRUmhxSUFNcEF3QkNBQ0FKTkFJQUlnWWdCaEIwRFFBZ0FpQUdOd01RSUFNcEF3Z2lCMEtBZ0lDQWNJTkNnSUNBZ0RCU0JFQWdBQ0FDUVJCcUlBZENBQ0FHSUFZUWRBMEJJQUlwQXhBaEJnc2dBaWtER0NFSUlBQWdBVUtBZ0lDQU1CRGpBU0lIUW9DQWdJQndneUlGUW9DQWdJRGdBRkVFUUNBSElRVU1BUXNnQmlBSWZTSUdRZ0FnQmtJQVZSc2hCZ0pBSUFWQ2dJQ0FnREJSQkVBZ0FFS0FnSUNBTUNBR0lBUVEzQU1oQlF3QkN5QUNJQVlpQlVLQWdJQ0FDRm9FZmtLQWdJQ0F3SDRnQnJtOUlnVkNnSUNBZ01DQmdQei9BSDBnQlVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNGSUFVTE53TUlJQUFnQjBFQklBSkJDR29RcHdFaEJTQUFJQWNRRHlBQUlBSXBBd2dRRHdzZ0JVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUFrQWdBQ0FGSUFRUVN5SURSUTBBSUFBZ0JTQUJFRklFUUNBQVFjL0dBRUVBRUJVTUFRc0NRQ0FETFFBRURRQWdBelFDQUNBR1V3UkFJQUJCczlRQVFRQVFGUXdDQ3lBSkxRQUVEUUFnQXlnQ0NDQUpLQUlJSUFpbmFpQUdweEFmR2d3Q0N5QUFFR3NMSUFBZ0JSQVBRb0NBZ0lEZ0FDRUZDeUFDUVNCcUpBQWdCUXNPQUNBQUVMVUNRb0NBZ0lEZ0FBdGRBQ0FBSUFFZ0FoQkxJZ0JGQkVCQ2dJQ0FnT0FBRHdzZ0FDZ0NBQ0lBUVFCT0JFQWdBSzBQQzBLQWdJQ0F3SDRnQUxpOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMT1FFQmZrS0FnSUNBd0g0Z0FTa0RBQ0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN6c0JBWDVDZ0lDQWdNQitJQUVxQWdDN3ZTSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3d3QUlBQWdBU2tEQUJEN0F3c01BQ0FBSUFFcEF3QVFod0lMU1FFQmZpQUJLQUlBSWdCQkFFNEVRQ0FBclE4TFFvQ0FnSURBZmlBQXVMMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzSEFDQUJOUUlBQ3djQUlBRXpBUUFMRGdBZ0FUSUJBRUwvLy8vL0Q0TUxDUUFnQUJDMUFrRi9DdzRBSUFFd0FBQkMvLy8vL3crREN3Y0FJQUV4QUFBTER3QWdBQ3NEQUNBQkt3TUFFUDBFQ3hFQUlBQXFBZ0M3SUFFcUFnQzdFUDBFQ3hrQkFuNGdBU2tEQUNJRElBQXBBd0FpQkZRZ0F5QUVWbXNMR1FFQ2ZpQUJLUU1BSWdNZ0FDa0RBQ0lFVXlBRElBUlZhd3NYQUNBQktBSUFJZ0VnQUNnQ0FDSUFTU0FBSUFGSmF3c1hBQ0FCS0FJQUlnRWdBQ2dDQUNJQVNDQUFJQUZJYXdzTkFDQUFMd0VBSUFFdkFRQnJDdzBBSUFBdUFRQWdBUzRCQUdzTERRQWdBQ3dBQUNBQkxBQUFhd3NOQUNBQUxRQUFJQUV0QUFCckM4d05CQWQvQVh3QmZnRjlJd0JCSUdzaUJpUUFRb0NBZ0lEZ0FDRU5Ba0FnQUNBQkVKSUJJZ3BCQUVnTkFFRi9JUVVDUUFKQUFrQWdDa1VOQUVFQklRZ0NRQUpBSUFSQkFVWUVRRUYvSVFnZ0JpQUtRUUZySWdVMkFod2dBa0VDU0EwQklBQWdCa0VJYWlBREtRTUlFRUlOQmlBR0t3TUlJZ3k5UXYvLy8vLy8vLy8vL3dDRFFvR0FnSUNBZ0lENC93QmFCRUFnQmtFQU5nSWNEQUlMSUF4RUFBQUFBQUFBQUFCbUJFQWdEQ0FGdDJORkRRSWdCZ0ovSUF5WlJBQUFBQUFBQU9CQll3UkFJQXlxREFFTFFZQ0FnSUI0Q3pZQ0hBd0NDMEYvSVFVZ0RDQUt0NkFpREVRQUFBQUFBQUFBQUdNTkJDQUdBbjhnREpsRUFBQUFBQUFBNEVGakJFQWdES29NQVF0QmdJQ0FnSGdMTmdJY0RBRUxJQVpCQURZQ0hDQUNRUUpJQkVBZ0NpRUNEQUlMSUFBZ0JrRWNhaUFES1FNSUlBb2lBaUFDRUZjTkJRd0JDMEYvSVFJTElBR25JZ2tvQWlBb0Fnd29BaUF0QUFRRVFFRi9JUVVnQkVGL1J3MENRWDlCQUNBRE5RSUVRaUNHUW9DQWdJQXdVaHNoQlF3REN5QUdRZ0EzQXhBQ2YwRUhJQU1wQXdBaUFVSWdpS2NpQXlBRFFRZHJRVzVKR3lJRFFYWkhCRUFnQTBFSFJ3UkFRWDhoQlNBRERRTWdCaUFCeENJQk53TVFJQUc1SVF4QkFTRUhRUUVNQWdzZ0JnSitJQUZDZ0lDQWdNQ0JnUHovQUh5L0lneVpSQUFBQUFBQUFPQkRZd1JBSUF5d0RBRUxRb0NBZ0lDQWdJQ0FnSDhMSWcwM0F4QkJBU0VISUF3Z0RibGhEQUVMSUFHbklRTkJmeUVGQW44Q1FBSkFJQWt2QVFaQkhHc09BZ0FCQkF0QkFDQUdRUkJxSUFOQkJHcEJBQkNDQTBVTkFSb01Bd3NnQXlnQ0RDSUhRZi8vLy84SFJnMENJQVlDZmtJQUlBZEJBRXdOQUJvZ0F5Z0NDQTBESUFkQndBQkxEUU1nQXlnQ0ZDSUxJQU1vQWhBaUEwRUNkR3BCQkdzb0FnQWhCU0FGUVNBZ0IydDJyU0FIUVNCTkRRQWFRZ0FoRFNBRFFRSlBCSDRnQTBFQ2RDQUxha0VJYXpVQ0FBVkNBQXNnQmExQ0lJYUVRY0FBSUFkcnJZZ0xOd01RUVFBTElRZEVBQUFBQUFBQUFBQWhERUVBQ3lFRFFYOGhCUUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBSkx3RUdRUlZyRGdzQkFBRURCQVlIQ3d3SkNnOExJQU5GRFE0Z0Jpa0RFQ0lOUW9BQmZFS0FBbG9ORGd3QkN5QURSUTBOSUFZcEF4QWlEVUwvQVZZTkRRc2dDU2dDSkNFQUlBUkJBVVlFUUNBTnAwSC8vd054SVFNZ0JpZ0NIQ0VGQTBBZ0FpQUZSZzBOSUFNZ0FDQUZhaTBBQUVZTkRpQUZJQWhxSVFVTUFBc0FDeUFBSUFZb0Fod2lBbW9nRGFkQi8vOERjU0FLSUFKckVQc0JJZ0pGRFF3Z0FpQUFheUVGREF3TElBTkZEUXNnQmlrREVDSU5Rb0NBQW54Q2dJQUVXZzBMREFFTElBTkZEUW9nQmlrREVDSU5Rdi8vQTFZTkNnc2dDU2dDSkNFQUlBWW9BaHdoQlNBTnAwSC8vd054SVFNRFFDQUNJQVZHRFFrZ0FDQUZRUUYwYWk4QkFDQURSZzBLSUFVZ0NHb2hCUXdBQ3dBTElBTkZEUWdnQmlrREVDSU5Rb0NBZ0lBSWZFS0FnSUNBRUZvTkNBd0JDeUFEUlEwSElBWXBBeEFpRFVMLy8vLy9EMVlOQndzZ0RhY2hBQ0FKS0FJa0lRTWdCaWdDSENFRkEwQWdBaUFGUmcwR0lBTWdCVUVDZEdvb0FnQWdBRVlOQnlBRklBaHFJUVVNQUFzQUN5QUhSUTBGSUF5OVF2Ly8vLy8vLy8vLy93Q0RRb0dBZ0lDQWdJRDQvd0JhQkVBZ0JFRi9SdzBISUFrb0FpUWhBQ0FHS0FJY0lRVURRQ0FDSUFWR0RRWWdBQ0FGUVFKMGFpZ0NBRUgvLy8vL0IzRkJnSUNBL0FkTERRY2dCU0FJYWlFRkRBQUxBQXNnRENBTXRpSU91MklOQlNBSktBSWtJUUFnQmlnQ0hDRUZBMEFnQWlBRlJnMEZJQUFnQlVFQ2RHb3FBZ0FnRGxzTkJpQUZJQWhxSVFVTUFBc0FDeUFIUlEwRUlBa29BaVFoQUNBTXZVTC8vLy8vLy8vLy8vOEFnMEtCZ0lDQWdJQ0ErUDhBV2dSQUlBUkJmMGNOQmlBR0tBSWNJUVVEUUNBQ0lBVkdEUVVnQUNBRlFRTjBhaWtEQUVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWZzBHSUFVZ0NHb2hCUXdBQ3dBTElBWW9BaHdoQlFOQUlBSWdCVVlOQkNBQUlBVkJBM1JxS3dNQUlBeGhEUVVnQlNBSWFpRUZEQUFMQUFzZ0IwVU5BU0FBS0FJUUtBS01BU0lBQkg4Z0FDMEFLRUVFY1VFQ2RnVkJBQXRGRFFNZ0EwVU5BeUFHS1FNUUlnRkNnWUNBZ0lDQWdIQlREUU1nQVVLQWdJQ0FnSUNBRUZrTkF3d0JDeUFIUlEwQUlBQW9BaEFvQW93QklnQUVmeUFBTFFBb1FRUnhRUUoyQlVFQUMwVU5BaUFEUlEwQ0lBWXBBeEFpQVVJQVV3MENJQUZDLy8vLy8vLy8vdzlWRFFJTElBa29BaVFoQUNBR0tBSWNJUVVnQmlrREVDRUJBMEFnQWlBRlJnMEJJQUFnQlVFRGRHb3BBd0FnQVZFTkFpQUZJQWhxSVFVTUFBc0FDMEYvSVFVTElBUkJmMFlOQVFzZ0JhMGhEUXdCQ3lBRlFRQk9yVUtBZ0lDQUVJUWhEUXNnQmtFZ2FpUUFJQTBMZ2dNQ0JIOERmaU1BUVNCcklnVWtBQUorSUFBZ0FSQ1NBU0lJUVFCT0JFQkJMQ0VIQWtBZ0FrRUFUQ0FFY2tVRVFFS0FnSUNBTUNFSklBTXBBd0FpQ2tLQWdJQ0FjSU5DZ0lDQWdEQlJEUUZDZ0lDQWdPQUFJQUFnQ2hBb0lnbENnSUNBZ0hDRFFvQ0FnSURnQUZFTkF4cEJmeUVISUFtbklnWW9BZ1JCQVVjTkFTQUdMUUFRSVFjTUFRdENnSUNBZ0RBaENRc2dBQ0FGUVFocVFRQVFQUnBCQUNFQ0FrQURRQ0FDSUFoSEJFQUNRQ0FDUlEwQUlBZEJBRTRFUUNBRlFRaHFJQWNRTzBVTkFRd0VDeUFGUVFocUlBWkJBQ0FHS0FJRVFmLy8vLzhIY1JCUkRRTUxJQUFnQVNBQ0VMQUJJZ3RDZ0lDQWdIQ0RJZ3BDZ0lDQWdDQlJJQXBDZ0lDQWdEQlJja1VFUUNBS1FvQ0FnSURnQUZFTkF5QUZRUWhxSUFRRWZpQUFJQXNRL2dRRklBc0xFSDhOQXdzZ0FrRUJhaUVDREFFTEN5QUFJQWtRRHlBRlFRaHFFRFlNQWdzZ0JTZ0NDQ2dDRUNJQ1FSQnFJQVVvQWd3Z0FpZ0NCQkVBQUNBQUlBa1FEd3RDZ0lDQWdPQUFDeUVMSUFWQklHb2tBQ0FMQzdnQ0F3Ti9BWDRCZkNNQVFTQnJJZ01rQUNBQ0tBSUVSUVJBSUFFb0FnQWhCU0FESUFJb0FnQWlBU0FDS0FJY0lBQW9BZ0FpQUNBQ0tBSWdiR29nQWlnQ0dCRU5BRGNERUNBRElBRWdBaWdDSENBRklBSW9BaUJzYWlBQ0tBSVlFUTBBTndNWUFrQWdBU0FDS1FNUVFvQ0FnSUF3UVFJZ0EwRVFhaEFoSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQ1FRRTJBZ1FNQVFzQ1FBSi9JQVpDLy8vLy93OVlCRUFnQnFjaUJFRWZkU0FFUVFCSGNnd0JDeUFCSUFOQkNHb2dCaEJ1UVFCSURRRWdBeXNEQ0NJSFJBQUFBQUFBQUFBQVpDQUhSQUFBQUFBQUFBQUFZMnNMSWdSRkJFQWdBQ0FGU3lBQUlBVkpheUVFQ3lBQklBSXBBd2dROXdKQkFFNE5BU0FDUVFFMkFnUU1BUXNnQWtFQk5nSUVDeUFCSUFNcEF4QVFEeUFCSUFNcEF4Z1FEd3NnQTBFZ2FpUUFJQVFMdHdVQ0JYOERmaU1BUVRCcklnSWtBQ0FDSUFFM0F4QWdBaUFBTmdJSUlBSkJBRFlDRENBQ0lBTXBBd0FpQ1RjREdFS0FnSUNBNEFBaENnSkFBa0FnQUNBQkVKSUJJZ1ZCQUVnTkFDQUpRb0NBZ0lCd2d5SUxRb0NBZ0lBd1VnUkFJQUFnQ1JCZ0RRRUxBa0FnQlVFQ1NRMEFJQUduSWdNdkFRWkJGV3NpQkVILy93TnhRUXRQRFFJZ0FpQUVRUUowUWZ6L0QzRWlCRUdBZ0FKcUtBSUFOZ0lnUVFFZ0F5OEJCa0hscGdGcUxRQUFJZ1owSVFnZ0F5Z0NKQ0VISUF0Q2dJQ0FnREJTQkVBZ0FDQUZRUUowRUNraUJFVU5Ba0VBSVFNRFFDQURJQVZHUlFSQUlBUWdBMEVDZEdvZ0F6WUNBQ0FEUVFGcUlRTU1BUXNMSUFJZ0NEWUNLQ0FDSUFjMkFpUWdCQ0FGUVFSQjB3QWdBa0VJYWhDK0FnSkFJQUlvQWd4RkJFQWdBQ0FGSUFaMElnTVFLU0lHRFFFTElBQW9BaEFpQUVFUWFpQUVJQUFvQWdRUkFBQU1Bd3NnQmlBSElBTVFIeUVHUVFBaEF3SkFBa0FDUUFKQUFrQWdDRUVCYXc0SUFBRUlBZ2dJQ0FNSUN3TkFJQU1nQlVZTkJDQURJQWRxSUFZZ0JDQURRUUowYWlnQ0FHb3RBQUE2QUFBZ0EwRUJhaUVEREFBTEFBc0RRQ0FESUFWR0RRTWdCeUFEUVFGMGFpQUdJQVFnQTBFQ2RHb29BZ0JCQVhScUx3RUFPd0VBSUFOQkFXb2hBd3dBQ3dBTEEwQWdBeUFGUmcwQ0lBY2dBMEVDZENJSWFpQUdJQVFnQ0dvb0FnQkJBblJxS0FJQU5nSUFJQU5CQVdvaEF3d0FDd0FMQTBBZ0F5QUZSZzBCSUFjZ0EwRURkR29nQmlBRUlBTkJBblJxS0FJQVFRTjBhaWtEQURjREFDQURRUUZxSVFNTUFBc0FDeUFBS0FJUUlnTkJFR29nQmlBREtBSUVFUUFBSUFBb0FoQWlBRUVRYWlBRUlBQW9BZ1FSQUFBTUFRc2dCeUFGSUFnZ0JFR3NnQUpxS0FJQUlBSkJDR29RdmdJZ0FpZ0NEQTBCQ3lBQlFpQ0lwMEYxVHdSQUlBR25JZ0FnQUNnQ0FFRUJhallDQUFzZ0FTRUtDeUFDUVRCcUpBQWdDZzhMRUFFQUM2RUNBZ0ovQTM0akFFRXdheUlDSkFCQ2dJQ0FnT0FBSVFZQ1FDQUFJQUZCQUJDVEFTSUZSUTBBSUFBZ0FrRU1haUFES1FNQUlBVW9BaWdpQkNBRUVGY05BQ0FDSUFRMkFnZ2dBeWtEQ0NJSFFvQ0FnSUJ3ZzBLQWdJQ0FNRklFUUNBQUlBSkJDR29nQnlBRUlBUVFWdzBCSUFJb0FnZ2hCQXNnQWlnQ0RDRURJQUFnQVVFQUVJQUZJZ2RDZ0lDQWdQQUFnMEtBZ0lDQTRBQlJEUUFnQlM4QkJpRUZJQUFnQnhBUElBQWdBVUVBRUlFRklnaENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUZRZVdtQVdvdEFBQWhCU0FDSUFnM0F4Z2dBaUFCTndNUUlBSWdCQ0FEYXlJRVFRQWdCRUVBU2h1dE53TW9JQUlnQjZjZ0F5QUZkR3F0TndNZ0lBQkJCQ0FDUVJCcUVQWUNJUVlnQUNBSUVBOExJQUpCTUdva0FDQUdDOElEQWdWL0JINGpBRUVnYXlJQ0pBQkNnSUNBZ0RBaENRSkFBa0FnQUNBQkVKSUJJZ1JCQUVnTkFDQUFJQUpCREdvZ0F5a0RBQ0FFSUFRUVZ3MEFJQUlnQkRZQ0NDQURLUU1JSWdwQ2dJQ0FnSENEUW9DQWdJQXdVZ1JBSUFBZ0FrRUlhaUFLSUFRZ0JCQlhEUUVnQWlnQ0NDRUVDeUFDS0FJTUlRTWdBQ0FCUVFBUWt3RWlCa1VOQUNBR0x3RUdJUWNnQWlBRUlBTnJJZ1ZCQUNBRlFRQktHeUlFclNJTE53TVlJQUlnQVRjREVDQUFRUUlnQWtFUWFoRDJBaUlKUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQlVFQVRBMEJJQWRCNWFZQmFpMEFBQ0VISUFBZ0FSRDNBZzBBSUFBZ0NSRDNBZzBBUWdBaENnSkFJQUFnQ1VFQUVKTUJJZ1ZGRFFBZ0JpOEJCaUlJSUFVdkFRWkhEUUFnQlNnQ0lDZ0NGQ0FJUWVXbUFXb3RBQUFpQ0hZZ0JFa05BQ0FESUFScUlBWW9BaUFvQWhRZ0NIWkxEUUFnQlNnQ0pDQUdLQUlrSUFNZ0IzUnFJQVFnQjNRUUh4b01BZ3NEUUNBS0lBdFJEUUlnQUNBQklBTWdDcWRxclJCTklneENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQWtnQ2lBTVFZQ0FBUkRYQVNFRUlBcENBWHdoQ2lBRVFRQk9EUUFMQ3lBQUlBa1FEMEtBZ0lDQTRBQWhDUXNnQWtFZ2FpUUFJQWtMNXdJQkFYNGdBQ0FCRUpJQklnSkJBRWdFUUVLQWdJQ0E0QUFQQ3dKQUlBSkZEUUFDUUFKQUFrQUNRQUpBSUFHbklnQXZBUVpCNWFZQmFpMEFBQTRFQUFFQ0F3UUxJQUFvQWlRaUFDQUNhaUVDQTBBZ0FDQUNRUUZySWdKUERRVWdBQzBBQUNFRElBQWdBaTBBQURvQUFDQUNJQU02QUFBZ0FFRUJhaUVBREFBTEFBc2dBQ2dDSkNJQUlBSkJBWFJxSVFJRFFDQUFJQUpCQW1zaUFrOE5CQ0FBTHdFQUlRTWdBQ0FDTHdFQU93RUFJQUlnQXpzQkFDQUFRUUpxSVFBTUFBc0FDeUFBS0FJa0lnQWdBa0VDZEdvaEFnTkFJQUFnQWtFRWF5SUNUdzBESUFBb0FnQWhBeUFBSUFJb0FnQTJBZ0FnQWlBRE5nSUFJQUJCQkdvaEFBd0FDd0FMSUFBb0FpUWlBQ0FDUVFOMGFpRUNBMEFnQUNBQ1FRaHJJZ0pQRFFJZ0FDa0RBQ0VFSUFBZ0Fpa0RBRGNEQUNBQ0lBUTNBd0FnQUVFSWFpRUFEQUFMQUFzUUFRQUxJQUZDSUlpblFYVlBCRUFnQWFjaUFDQUFLQUlBUVFGcU5nSUFDeUFCQzRjQ0FnWitBbjhqQUVFZ2F5SUxKQUJDZ0lDQWdEQWhCZ0pBQWtBZ0FDQUJFSklCSWd4QkFFZ05BQ0FBSUFNcEF3QWlDQkJnRFFCQ2dJQ0FnREFoQnlBQ1FRSk9CRUFnQXlrRENDRUhDeUFNclNFSkEwQWdCU0FKVWdSQUlBQWdBU0FGRUUwaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ0lBc2dBVGNERUNBTElBVTNBd2dnQ3lBR053TUFJQUFnQ0NBSFFRTWdDeEFoSWdwQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQWlBQUlBb1FKZ1JBSUFSRkJFQWdCaUVGREFVTElBQWdCaEFQREFRRklBQWdCaEFQSUFWQ0FYd2hCUXdDQ3dBTEMwTC8vLy8vRDBLQWdJQ0FNQ0FFR3lFRkRBRUxJQUFnQmhBUFFvQ0FnSURnQUNFRkN5QUxRU0JxSkFBZ0JRdWZCUUlFZndKK0l3QkJJR3NpQkNRQVFvQ0FnSURnQUNFSUFrQWdBQ0FCRUpJQklnWkJBRWdOQUFKQUlBR25JZ1V2QVFZaUIwRVZSZ1JBSUFNcEF3QWlDVUlnaUtkQmRVOEVRQ0FKcHlJSElBY29BZ0JCQVdvMkFnQUxJQUFnQkVFSWFpQUpFTVFGRFFJZ0JDQUVOQUlJTndNUURBRUxJQWRCRzAwRVFDQUFJQVJCQ0dvZ0F5a0RBQkIzRFFJZ0JDQUVOUUlJTndNUURBRUxJQWRCSFUwRVFDQUFJQVJCRUdvZ0F5a0RBQkQvQkVVTkFRd0NDeUFBSUFSQkNHb2dBeWtEQUJCQ0RRRWdCQUorSUFVdkFRWkJIa1lFUUNBRUt3TUl0cnl0REFFTElBUXBBd2dMTndNUUN5QUVRUUEyQWdnQ1FDQUNRUUZNQkVBZ0JDQUdOZ0ljREFFTElBQWdCRUVJYWlBREtRTUlJQVlnQmhCWERRRWdCQ0FHTmdJY0lBSkJBMGtOQUNBREtRTVFJZ2xDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFJQUFnQkVFY2FpQUpJQVlnQmhCWERRRUxJQVVvQWlBb0Fnd29BaUF0QUFRRVFDQUFFR3NNQVFzQ1FBSkFBa0FDUUFKQUFrQWdCUzhCQmtIbHBnRnFMUUFBRGdRQUFRSURCQXNnQkNnQ0hDSUNJQVFvQWdnaUFFd05CQ0FGS0FJa0lBQnFJQVF0QUJBZ0FpQUFheEFyR2d3RUN5QUVLQUlJSWdBZ0JDZ0NIQ0lDSUFBZ0Frb2JJUUlnQkM4QkVDRURBMEFnQUNBQ1JnMEVJQVVvQWlRZ0FFRUJkR29nQXpzQkFDQUFRUUZxSVFBTUFBc0FDeUFFS0FJSUlnQWdCQ2dDSENJQ0lBQWdBa29iSVFJZ0JDZ0NFQ0VEQTBBZ0FDQUNSZzBESUFVb0FpUWdBRUVDZEdvZ0F6WUNBQ0FBUVFGcUlRQU1BQXNBQ3lBRUtBSUlJZ0FnQkNnQ0hDSUNJQUFnQWtvYklRSWdCQ2tERUNFSUEwQWdBQ0FDUmcwQ0lBVW9BaVFnQUVFRGRHb2dDRGNEQUNBQVFRRnFJUUFNQUFzQUN4QUJBQXNnQVVJZ2lLZEJkVThFUUNBRklBVW9BZ0JCQVdvMkFnQUxJQUVoQ0FzZ0JFRWdhaVFBSUFnTDJ3VUNBMzhJZmlNQVFVQnFJZ1VrQUVLQWdJQ0FNQ0VMSUFWQ2dJQ0FnREEzQXpnZ0JVS0FnSUNBTURjRE1BSkFBa0FDUUNBRVFRaHhJZ2NFUUNBQlFpQ0lwMEYxVHdSQUlBR25JZ1lnQmlnQ0FFRUJhallDQUFzZ0JTQUFJQUVRa2dFaUJxdzNBd2dnQmtFQVRnMEJEQUlMSUFBZ0JVRUlhaUFBSUFFUUpTSUJFRHdOQVFzZ0FDQURLUU1BSWcwUVlBMEFBa0FnQWtFQlRBUkFJQVVwQXdnaURFSUFJQXhDQUZVYklRb2dCRUVCY1NFRUEwQWdDQ0FLVVFSQUlBQkJzaDVCQUJBVkRBUUxJQXdnQ0VKL2hYd2dDQ0FFR3lFSklBaENBWHdoQ0NBSEJFQWdCU0FBSUFFZ0NSQnpJZ2szQXpBZ0NVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRURBTUxJQUFnQVNBSklBVkJNR29RaFFFaUFrRUFTQTBESUFKRkRRQUxJQVVwQXpBaENRd0JDeUFES1FNSUlnbENJSWluUVhWUEJFQWdDYWNpQWlBQ0tBSUFRUUZxTmdJQUN5QUVRUUZ4SVFRZ0JTa0RDQ0VNQ3lBSUlBd2dDQ0FNVlJzaERnTkFJQWdnRGxFTkFpQU1JQWhDZjRWOElBZ2dCQnNoQ2dKQUFrQUNRQ0FIQkVBZ0JTQUFJQUVnQ2hCeklnczNBemdnQzBLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBCREFNTElBQWdBU0FLSUFWQk9Hb1FoUUVpQWtFQVNBMENJQUpGRFFFTElBcENnSUNBZ0FoOFF2Ly8vLzhQV0FSK0lBcEMvLy8vL3crREJVS0FnSUNBd0g0Z0NybTlJZ3BDZ0lDQWdNQ0JnUHovQUgwZ0NrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElndENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUZJQWszQXhBZ0JTQUJOd01vSUFVZ0N6Y0RJQ0FGSUFVcEF6Z2lEemNER0NBQUlBMUNnSUNBZ0RCQkJDQUZRUkJxRUNFaENpQUFJQXNRRHlBQUlBOFFEeUFGUW9DQWdJQXdOd000SUFwQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBa1FEeUFLSVFrTElBaENBWHdoQ0F3QkN3c2dCU0FKTndNd0lBVXBBemdoQ3dzZ0FDQUZLUU13RUE4Z0FDQUxFQTlDZ0lDQWdPQUFJUWtMSUFBZ0FSQVBJQVZCUUdza0FDQUpDNndJQWdOL0NYNGpBRUV3YXlJRkpBQkNnSUNBZ0RBaENTQUZRb0NBZ0lBd053TW9Ba0FDUUFKQUFrQWdCRUVJY1NJSEJFQWdBVUlnaUtkQmRVOEVRQ0FCcHlJR0lBWW9BZ0JCQVdvMkFnQUxJQVVnQUNBQkVKSUJJZ2FzTndNSUlBWkJBRTROQVF3Q0N5QUFJQVZCQ0dvZ0FDQUJFQ1VpQVJBOERRRUxJQU1wQXdBaEQwS0FnSUNBTUNFT0lBSkJBazRFUUNBREtRTUlJUTRMSUFBZ0R4QmdEUUFDUUFKQUFrQUNRQUpBQWtBQ1FDQUVEZzBGQUFZQkFnWUdCZ1VBQmdNRUJndENnSUNBZ0JBaENRd0ZDeUFBSUFFQ2ZpQUZLUU1JSWdoQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFoQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBSXViMGlDRUtBZ0lDQXdJR0EvUDhBZlNBSVF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUXF3SWlDVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEVEQVVMSUFBZ0FVSUFFS3NDSWdsQ2dJQ0FnSENEUW9DQWdJRGdBRklOQXd3RUN5QUZJQUUzQXhBZ0JTQUZOUUlJTndNWUlBQkJBaUFGUVJCcUVQWUNJZ2xDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5BZ3dEQ3lBQUVENGlDVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJRb0NBZ0lEZ0FDRUpEQUlMUW9HQWdJQVFJUWtMUWdBaENDQUZLUU1JSWdwQ0FDQUtRZ0JWR3lFUUEwQWdDQ0FRVWdSQUFrQUNRQ0FIQkVBZ0JTQUFJQUVnQ0JCeklnbzNBeWdnQ2tLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBCREFVTElBQWdBU0FJSUFWQktHb1FoUUVpQWtFQVNBMEVJQUpGRFFFTElBZ2hDaUFJUW9DQWdJQUlXZ1JBUW9DQWdJREFmaUFJdWIwaUNrS0FnSUNBd0lHQS9QOEFmU0FLUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeUVLQ3lBS1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFNZ0JTQUJOd01nSUFVZ0NqY0RHQ0FGSUFVcEF5Z2lEVGNERUNBQUlBOGdEa0VESUFWQkVHb1FJU0VMSUFBZ0NoQVBJQXRDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5Bd0pBQWtBQ1FBSkFBa0FDUUFKQUlBUU9EUUFCQlFJRUJRVUZBQUVGQXdRRkN5QUFJQXNRSmcwRlFvQ0FnSUFRSVFnTUN3c2dBQ0FMRUNaRkRRUkNnWUNBZ0JBaENBd0tDeUFBSUFrZ0NDQUxFR3BCQUU0TkF3d0hDeUFBSUFrZ0NFTC8vLy8vRDRNZ0MwR0FnQUVRMXdGQkFFNE5BZ3dHQ3lBQUlBc1FKa1VOQVNBTlFpQ0lwMEYxVHdSQUlBMm5JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUpJQXdnRFJCcVFRQklEUVVnREVJQmZDRU1EQUVMSUFBZ0N4QVBDeUFBSUEwUUR5QUZRb0NBZ0lBd053TW9DeUFJUWdGOElRZ01BUXNMSUFSQkRFY0VRQ0FKSVFnTUF3c2dCU0FCTndNUUlBVWdERUwvLy8vL0Q0TTNBeGdnQUVFQ0lBVkJFR29ROWdJaUNFS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBVWdDVGNERUNBQUlBQWdDRUhDQUVFQklBVkJFR29RckFJUS9BRkZEUUVMUW9DQWdJRGdBQ0VJQ3lBQUlBa1FEd3NnQUNBRktRTW9FQThnQUNBQkVBOGdCVUV3YWlRQUlBZ0wrQVVDQjM4Q2ZpTUFRUkJySWdJa0FDQUNRZ0EzQXdBZ0FrTC8vLy8vRHpjRENBSkFJQUpCOEFJUTJRTWlBRVVFUUF3QkN5QUFRU0JxUVFCQjBBSVFLeG9nQUVHZ3BBRXBBZ0EzQWdnZ0FFR1lwQUVwQWdBM0FnQWdBRUVGTmdJTUlBSXBBd2doQnlBQ0tRTUFJUWdnQUVHQWdCQTJBbXdnQUNBSU53TVFJQUFnQnpjREdDQUFRZUFCYWtFQVFUUVFLeG9nQUVFR05nTGtBaUFBUVFjMkF1QUNJQUJCQ0RZQzJBSWdBRUVKTmdMVUFpQUFRUW8yQXRBQ0lBQkJDellDekFJZ0FFRUdOZ0xJQWlBQVFRYzJBc1FDSUFCQkNEWUN2QUlnQUVFSk5nSzRBaUFBUVFvMkFyUUNJQUJCQ3pZQ3NBSWdBRUVHTmdLc0FpQUFRUWMyQXFnQ0lBQkJDRFlDb0FJZ0FFRUpOZ0tjQWlBQVFRbzJBcGdDSUFCQkN6WUNsQUlnQUVFTU5nTGNBU0FBSUFBMkF0Z0JJQUFnQUVHZ0FXb2lBVFlDcEFFZ0FDQUJOZ0tnQVNBQVFRQTZBR2dnQUNBQVFkZ0FhaUlCTmdKY0lBQWdBVFlDV0NBQUlBQkIwQUJxSWdFMkFsUWdBQ0FCTmdKUUlBQWdBRUhJQUdvaUFUWUNUQ0FBSUFFMkFrZ2dBRUVBTmdJa0lBQkJBRFlDTkNBQVFRQTJBandnQUVJQU53TW9Ba0FDUUNBQVFZQUNFUElFRFFCQmtLY0JJUVJCQVNFQkEwQWdBVUhlQVVjRVFDQUFJQVFRUHlJRlFRQVE3d1FpQmtVTkFpQUdRUkJxSUFRZ0JSQWZJQVZxUVFBNkFBQWdBQ0FHUVFSQkEwRUJJQUZCendGTEd5QUJRYzhCUmhzUXB3SkZEUUlnQVVFQmFpRUJJQVFnQldwQkFXb2hCQXdCQ3dzZ0FFR1Fud0ZCQVVFdkVNMERRUUJJRFFBZ0FDZ0NSQ0lCUVEwMkF2Z0NJQUZCRGpZQ3NBSWdBVUg4b3dFMkFwd0NJQUZCNEtNQk5nS01BU0FCUWNTakFUWUMxQUVnQVVFUE5nS1FBeUFCUVJBMkF1QUNJQUJCQURZQzBBRWdBRUtFZ0lDQWdBSTNBOGdCSUFCQkVHcEJ3QUFnQUNnQ0FCRURBQ0lCRFFFZ0FFRUFOZ0xVQVFzZ0FCRGZCQXdCQ3lBQlFRQkJ3QUFRS3lFRElBQkNnSUNBZ0NBM0E0QUJJQUFnQWtHQWdCQnJOZ0o0SUFBZ0FqWUNkQ0FBUVlDQUVEWUNjQ0FBSUFNMkF0UUJJQUFoQXdzZ0FrRVFhaVFBSUFNTHBnSUNCSDhDZmlNQVFSQnJJZ1VrQUVLQWdJQ0E0QUFoQ0FKQUlBQWdBUkNTQVNJRVFRQklEUUFnQUNBRlFReHFJQU1wQXdBZ0JDQUVFRmNOQUNBQUlBVkJDR29nQXlrRENDQUVJQVFRVncwQUlBVWdCRFlDQkFKL0lBUWdBa0VEU0EwQUdpQUVJQU1wQXhBaUNVS0FnSUNBY0lOQ2dJQ0FnREJSRFFBYUlBQWdCVUVFYWlBSklBUWdCQkJYRFFFZ0JTZ0NCQXNnQlNnQ0NDSUhheUlHSUFRZ0JTZ0NEQ0lEYXlJQ0lBSWdCa29iSWdKQkFFb0VRQ0FCcHlJR0tBSWdLQUlNS0FJZ0xRQUVCRUFnQUJCckRBSUxJQVlvQWlRaUFDQURJQVl2QVFaQjVhWUJhaTBBQUNJRGRHb2dBQ0FISUFOMGFpQUNJQU4wRUp3QkN5QUJRaUNJcDBGMVR3UkFJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FBc2dBU0VJQ3lBRlFSQnFKQUFnQ0F0S0FnRitBWDlDZ0lDQWdEQWhBZ0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY3ZBUVlpQTBFVmEwSC8vd054UVFwTERRQWdBQ0FBS0FJUUtBSkVJQU5CR0d4cUtBSUVFQzBoQWdzZ0Fnc3NBUUYrUW9DQWdJRGdBQ0VGSUFBZ0FSRDNBZ1IrUW9DQWdJRGdBQVVnQUNBQklBQWdBQ0FFRU5VRkN3dkNBd0lFZmdSL0l3QkJFR3NpQ0NRQVFvQ0FnSUF3SVFWQ2dJQ0FnREFoQkNBQ1FRSk9CRUFnQXlrRENDRUVDeUFES1FNQUlRWkNnSUNBZ09BQUlRY0NRQ0FBSUFGQkFCQ1RBU0lDUlEwQUlBQWdDQ0FFRU9JRERRQUNRQUpBQWtBQ1FBSkFJQWdwQXdBaUJFSUFVd1JBREFFTElBSW9BaUFvQWd3b0FpQXRBQVFOQkNBQUlBWVFKU0lGUW9DQWdJQndnMEtBZ0lDQTRBQlJEUU1nQmFjaUF5OEJCaUlKUVJWclFmLy9BM0ZCQ2swRVFDQURLQUlnSWdvb0Fnd29BaUFpQ3kwQUJBMEZJQVFnQWpVQ0tDQUROUUlvSWdaOVZRMEJJQWtnQWk4QkJpSURSdzBDSUFRZ0EwSGxwZ0ZxTVFBQUlnR0dweUFDS0FJZ0lnSW9BZ3dvQWlBb0FnZ2dBaWdDRUdwcUlBc29BZ2dnQ2lnQ0VHb2dCaUFCaHFjUW5BRU1Bd3NnQUNBSVFRaHFJQVVRUEEwRElBUWdBalVDS0NBSUtRTUlJZ1o5VncwQkN5QUFRZUhZQUVFQUVGQU1CQXNnQktjaEFrRUFJUU1EUUNBR0lBT3RWdzBCSUFBZ0JTQURFTEFCSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQkNBQ0lBTnFJUWtnQTBFQmFpRURJQUFnQVNBSklBUVFwUUZCQUU0TkFBc01Bd3RDZ0lDQWdEQWhCd3dDQ3d3QkN5QUFFR3NMSUFBZ0JSQVBJQWhCRUdva0FDQUhDeDRBSUFBZ0FVRUFFSk1CSWdCRkJFQkNnSUNBZ09BQUR3c2dBRFVDS0F1ckFRSURmd0YrSXdCQkVHc2lCU1FBSUFVZ0FxMDNBd2dDUUNBQUlBRkJBU0FGUVFocUVOb0RJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FDUVFBZ0FrRUFTaHNoQWdOQUlBSWdCRVlOQVNBRElBUkJBM1JxS1FNQUlnZENJSWluUVhWUEJFQWdCNmNpQmlBR0tBSUFRUUZxTmdJQUN5QUFJQUVnQkNBSEVLVUJJUVlnQkVFQmFpRUVJQVpCQUU0TkFBc2dBQ0FCRUE5Q2dJQ0FnT0FBSVFFTElBVkJFR29rQUNBQkN3WUFRZkRHQkF1Q0J3SUpmZ0ovSXdCQk1Hc2lEU1FBSUFNcEF3QWhCQ0FOUW9DQWdJQXdOd01ZUVFFaERnSkFBa0FDZmlBQ1FRSklCRUJDZ0lDQWdEQWhDa0tBZ0lDQU1Bd0JDMEtBZ0lDQU1DQURLUU1JSWdwQ2dJQ0FnSENEUW9DQWdJQXdVUTBBR2tLQWdJQ0FNQ0VKUW9DQWdJQXdJUVpDZ0lDQWdEQWhCMEtBZ0lDQU1DRUZJQUFnQ2hCZ0RRRkJBQ0VPUW9DQWdJQXdJQUpCQTBrTkFCb2dBeWtERUFzaEN3SkFBa0FnQUNBRVFkRUJJQVJCQUJBVUlnWkNnSUNBZ0hDRElnVkNnSUNBZ0RCU0JFQWdCVUtBZ0lDQTRBQlJCRUJDZ0lDQWdEQWhDVUtBZ0lDQU1DRUdRb0NBZ0lBd0lRY01Bd3NnQUNBR0VBOGdBQkErSWdkQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0FNQ0VKUW9DQWdJQXdJUVpDZ0lDQWdPQUFJUWNNQXdzZ0JFSWdpS2RCZFU4RVFDQUVweUlDSUFJb0FnQkJBV28yQWdBTElBMGdCRGNERUNBQUlBMUJFR3BCQ0hKQkFCQ1pBeUVDSUEwcEF4Z2hDU0FOS1FNUUlRWWdBZzBDUWdBaEJRTkFJQUFnQmlBSklBMUJCR29RcmdFaUJFS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBMG9BZ1FOQXlBQUlBY2dCU0FFRUdvaEFpQUZRZ0Y4SVFVZ0FrRUFUZzBCQ3d0Q2dJQ0FnREFoQlNBR1FvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQXlBQUlBWkJBUkN0QVJvTUF3dENnSUNBZ0RBaENVS0FnSUNBTUNFR1FvQ0FnSUF3SVFVZ0FDQUVFQ1VpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDQ3lBQUlBMUJDR29nQnhBOFFRQklEUUFnRFFKK0lBMHBBd2dpQkVLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQkVMLy8vLy9ENE1NQVF0Q2dJQ0FnTUIrSUFTNXZTSUZRb0NBZ0lEQWdZRDgvd0I5SUFWQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3lJSU53TWdJQUFnQVVFQklBMUJJR29RMmdNaEJTQUFJQWdRRHdKQUlBVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFFSUFJUWdnQkVJQUlBUkNBRlViSVF3RFFDQUlJQXhSRFFRZ0FDQUhJQWdRY3lJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFQ1FDQU9CRUFnQkNFQkRBRUxJQTBnQkRjRElDQU5JQWhDLy8vLy93K0ROd01vSUFBZ0NpQUxRUUlnRFVFZ2FoQWhJUUVnQUNBRUVBOGdBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMENDeUFBSUFVZ0NDQUJFSVlCSVFJZ0NFSUJmQ0VJSUFKQkFFNE5BQXNMREFFTFFvQ0FnSUF3SVFVTElBQWdCUkFQUW9DQWdJRGdBQ0VGQ3lBQUlBY1FEeUFBSUFZUUR5QUFJQWtRRHlBTlFUQnFKQUFnQlFzUkFDQUFRUkJxSUFJZ0FDZ0NCQkVBQUF1bkJBSUVmd0YrSXdCQklHc2lCU1FBUW9DQWdJRGdBQ0VKQWtBZ0FDQUJRU0FRU3lJSFJRMEFJQVJCNWFZQmFpMEFBQ0VJSUFBZ0JVRUlhaUFES1FNQUVLWUJEUUFnQXlrRENDRUJJQVZDQURjREdDQUZRUUEyQWhRQ1FDQUVRUnRNQkVBZ0FDQUZRUlJxSUFFUWQwVU5BUXdDQ3lBRVFSMU5CRUFnQUNBRlFSaHFJQUVRL3dSRkRRRU1BZ3NnQUNBRklBRVFRZzBCSUFSQkhrWUVRQ0FGSUFVckF3QzJPQUlVREFFTElBVWdCU2tEQURjREdBdEJBU0VHSUFKQkEwNEVRQ0FBSUFNcEF4QVEvUUZCQVhNaEJnc2dCeWdDRENnQ0lDSUNMUUFFQkVBZ0FCQnJEQUVMSUFjMUFoUWdCU2tEQ0NJQlFRRWdDSFNzZkZRRVFDQUFRZC95QUVFQUVGQU1BUXNnQWFjZ0FpZ0NDQ0FIS0FJUWFtb2hBQUpBQWtBQ1FBSkFBa0FnQkVFV2F3NEtBQUFCQVFJQ0F3TUNBd1FMSUFBZ0JTZ0NGRG9BQUVLQWdJQ0FNQ0VKREFRTElBQWdCUzhCRkNJQVFRaDBJQUJCQ0haeUlBQWdCaHM3QUFCQ2dJQ0FnREFoQ1F3REN5QUFJQVVvQWhRaUFFRVlkQ0FBUVlEK0EzRkJDSFJ5SUFCQkNIWkJnUDREY1NBQVFSaDJjbklnQUNBR0d6WUFBRUtBZ0lDQU1DRUpEQUlMSUFBZ0JTa0RHQ0lCUWppR0lBRkNnUDREZzBJb2hvUWdBVUtBZ1B3SGcwSVloaUFCUW9DQWdQZ1BnMElJaG9TRUlBRkNDSWhDZ0lDQStBK0RJQUZDR0loQ2dJRDhCNE9FSUFGQ0tJaENnUDREZ3lBQlFqaUloSVNFSUFFZ0JoczNBQUJDZ0lDQWdEQWhDUXdCQ3hBQkFBc2dCVUVnYWlRQUlBa0xCZ0JCNk1ZRUM2SUhBZ0YrQkg4akFFRVFheUlISkFCQ2dJQ0FnT0FBSVFVQ1FDQUFJQUZCSUJCTElnaEZEUUFnQkVIbHBnRnFMUUFBSVFrZ0FDQUhRUWhxSUFNcEF3QVFwZ0VOQUVFQklRWWdBa0VDVGdSQUlBQWdBeWtEQ0JEOUFVRUJjeUVHQ3lBSUtBSU1LQUlnSWdJdEFBUUVRQ0FBRUdzTUFRc2dDRFVDRkNBSEtRTUlJZ0ZCQVNBSmRLeDhWQVJBSUFCQjMvSUFRUUFRVUF3QkN5QUJweUFDS0FJSUlBZ29BaEJxYWlFQ0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FFUVJackRnb0tBQUVDQXdRRkJnY0lDUXNnQWpFQUFDRUZEQW9MSUFJdkFBQWlBRUVJZENBQVFRaDJjaUFBSUFZYnJjTkMvLy8vL3crRElRVU1DUXNnQWk4QUFDSUFRUWgwSUFCQkNIWnlJQUFnQmh1dFF2Ly9BNE1oQlF3SUN5QUNLQUFBSWdCQkdIUWdBRUdBL2dOeFFRaDBjaUFBUVFoMlFZRCtBM0VnQUVFWWRuSnlJQUFnQmh1dElRVU1Cd3NnQWlnQUFDSUFRUmgwSUFCQmdQNERjVUVJZEhJZ0FFRUlka0dBL2dOeElBQkJHSFp5Y2lBQUlBWWJJZ0JCQUU0RVFDQUFyU0VGREFjTFFvQ0FnSURBZmlBQXVMMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3lFRkRBWUxJQUFnQWlrQUFDSUJRamlHSUFGQ2dQNERnMElvaG9RZ0FVS0FnUHdIZzBJWWhpQUJRb0NBZ1BnUGcwSUlob1NFSUFGQ0NJaENnSUNBK0ErRElBRkNHSWhDZ0lEOEI0T0VJQUZDS0loQ2dQNERneUFCUWppSWhJU0VJQUVnQmhzUWh3SWhCUXdGQ3lBQUlBSXBBQUFpQVVJNGhpQUJRb0QrQTROQ0tJYUVJQUZDZ0lEOEI0TkNHSVlnQVVLQWdJRDRENE5DQ0lhRWhDQUJRZ2lJUW9DQWdQZ1BneUFCUWhpSVFvQ0EvQWVEaENBQlFpaUlRb0QrQTRNZ0FVSTRpSVNFaENBQklBWWJFUHNESVFVTUJBdENnSUNBZ01CK0lBSW9BQUFpQUVFWWRDQUFRWUQrQTNGQkNIUnlJQUJCQ0haQmdQNERjU0FBUVJoMmNuSWdBQ0FHRzc2N3ZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliSVFVTUF3dENnSUNBZ01CK0lBSXBBQUFpQVVJNGhpQUJRb0QrQTROQ0tJYUVJQUZDZ0lEOEI0TkNHSVlnQVVLQWdJRDRENE5DQ0lhRWhDQUJRZ2lJUW9DQWdQZ1BneUFCUWhpSVFvQ0EvQWVEaENBQlFpaUlRb0QrQTRNZ0FVSTRpSVNFaENBQklBWWJJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzaEJRd0NDeEFCQUFzZ0FqQUFBRUwvLy8vL0Q0TWhCUXNnQjBFUWFpUUFJQVVMVWdJQmZ3RitRb0NBZ0lEZ0FDRUVJQUFnQVNBQ0VKTUJJZ01FZmlBREtBSWdJZ01vQWd3b0FpQXRBQVFFUUNBQ1JRUkFRZ0FQQ3lBQUVHdENnSUNBZ09BQUR3c2dBelVDRkFWQ2dJQ0FnT0FBQ3d2WEFRRURmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBeThCQmtFNVJ3MEFJQU1vQWlBaUJFVU5BQ0FFUWN3QWFpRURJQVJCeUFCcUlRVURRQ0FGSUFNb0FnQWlBMGNFUUNBREtRTVFJZ0ZDZ0lDQWdHQmFCRUFnQUNBQnB5QUNFUUFBQ3lBREtRTVlJZ0ZDZ0lDQWdHQmFCRUFnQUNBQnB5QUNFUUFBQ3lBREtRTWdJZ0ZDZ0lDQWdHQmFCRUFnQUNBQnB5QUNFUUFBQ3lBREtRTW9JZ0ZDZ0lDQWdHQmFCRUFnQUNBQnB5QUNFUUFBQ3lBRFFRUnFJUU1NQVFzTElBUW9BZ1JCZm5GQkJFWU5BQ0FBSUFSQkNHb2dBaER2QXdzTEJnQkI0TVlFQ3pBQkFYOENRQ0FCUW9DQWdJQndWQTBBSUFHbklnSXZBUVpCT1VjTkFDQUNLQUlnSWdKRkRRQWdBQ0FDRUljRkN3c05BQ0FBSUFFZ0FrRTNFUDBGQ3dzQUlBQWdBVUUzRVA0RkN4WUJBWDhnQWFjb0FpQWlBZ1JBSUFBZ0FoQ0lCUXNMTVFFQmZ5QUJweWdDSUNJQ0JFQWdBQ0FDS0FJSUVLTUZJQUFnQWlrREFCQWpJQUJCRUdvZ0FpQUFLQUlFRVFBQUN3dmNBUUVFZndKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQkM4QkJrRXhSdzBBSUFRb0FpQWlCa1VOQUVFQUlRUURRQ0FFUVFKR1JRUkFJQVlnQkVFRGRHb2lCVUVJYWlFRElBVkJCR29oQlFOQUlBVWdBeWdDQUNJRFJ3UkFJQU1wQXdnaUFVS0FnSUNBWUZvRVFDQUFJQUduSUFJUkFBQUxJQU1wQXhBaUFVS0FnSUNBWUZvRVFDQUFJQUduSUFJUkFBQUxJQU1wQXhnaUFVS0FnSUNBWUZvRVFDQUFJQUduSUFJUkFBQUxJQU5CQkdvaEF3d0JDd3NnQkVFQmFpRUVEQUVMQ3lBR0tRTVlJZ0ZDZ0lDQWdHQlVEUUFnQUNBQnB5QUNFUUFBQ3d1TUFRRUZmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBaThCQmtFeFJ3MEFJQUlvQWlBaUJFVU5BQU5BSUFOQkFrWkZCRUFnQkNBRFFRTjBhaUlDUVFScUlRVWdBaWdDQ0NFQ0EwQWdBaUFGUmtVRVFDQUNLQUlFSVFZZ0FDQUNFSzRDSUFZaEFnd0JDd3NnQTBFQmFpRUREQUVMQ3lBQUlBUXBBeGdRSXlBQVFSQnFJQVFnQUNnQ0JCRUFBQXNMSlFBZ0JTa0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnQWdBQ2dDQUVFQmFqWUNBQXNnQVFzeEFDQUZLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQUlBRVFpZ0ZDZ0lDQWdPQUFDd1lBUWRqR0JBdllBUUVDZmlNQVFSQnJJZ0lrQUNBRktRTUFJUVlnQWlBQUlBVXBBd2hDZ0lDQWdEQkJBRUVBRUNFaUFUY0RDQUpBSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBWWdBaUFDUVFocVFRQVEvZ0VoQmlBQUlBSXBBd2dRRHlBR1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0JpRUJEQUVMSUFJZ0FFSFFBRUhSQUNBRUcwRUFRUUJCQVNBREVNOEJJZ2MzQXdCQ2dJQ0FnT0FBSVFFZ0FDQUhRb0NBZ0lCd2cwS0FnSUNBNEFCU0JINGdBQ0FHUWY4QVFRRWdBaEN0QWlFQklBSXBBd0FGSUFZTEVBOExJQUpCRUdva0FDQUJDNklDQVFKK0l3QkJJR3NpQWlRQUlBTXBBd0FoQkFKQUlBQWdBVUtBZ0lDQU1CRGpBU0lGUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFDUUNBQUlBUVFPRVVFUUNBRVFpQ0lwMEYxVHdSQUlBU25JZ01nQXlnQ0FFRUNhallDQUFzZ0FpQUVOd01ZSUFJZ0JEY0RFQXdCQ3lBQ0lBUTNBd2dnQWlBRk53TUFRUUFoQXdOQUlBTkJBa1lOQVNBQ1FSQnFJQU5CQTNScUlBQkJ6d0JCQVNBRFFRSWdBaERQQVNJRU53TUFJQVJDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FEUVFGR0JFQWdBQ0FDS1FNUUVBOExJQUFnQlJBUFFvQ0FnSURnQUNFRkRBTUZJQU5CQVdvaEF3d0JDd0FMQUFzZ0FDQUZFQThnQUNBQlFmOEFRUUlnQWtFUWFoQ3NBaUVGSUFBZ0Fpa0RFQkFQSUFBZ0Fpa0RHQkFQQ3lBQ1FTQnFKQUFnQlFzNUFDTUFRUkJySWdJa0FDQUNRb0NBZ0lBd053TUFJQUlnQXlrREFEY0RDQ0FBSUFGQi93QkJBaUFDRUt3Q0lRRWdBa0VRYWlRQUlBRUx1QUVDQW40Q2Z5TUFRUkJySWdZa0FBSkFBa0FnQUNBQlFURVFTd1JBSUFBZ0FVS0FnSUNBTUJEakFTSUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSWdBQ0FHSUFRUXZ3SWhCU0FBSUFRUUR5QUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBQ0FCSUFNZ0JoQ3ZBaUVDQTBBZ0IwRUNSa1VFUUNBQUlBWWdCMEVEZEdvcEF3QVFEeUFIUVFGcUlRY01BUXNMSUFKRkRRRWdBQ0FGRUE4TFFvQ0FnSURnQUNFRURBRUxJQVVoQkFzZ0JrRVFhaVFBSUFRTElBQWdBVUlnaUtkQmRVOEVRQ0FCcHlJQUlBQW9BZ0JCQVdvMkFnQUxJQUVMNVFNQkJYNGpBRUV3YXlJQ0pBQUNRQ0FCUXYvLy8vOXZXQVJBSUFBUUpFS0FnSUNBNEFBaEJRd0JDeUFBSUFKQklHb2dBUkMvQWlJRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFCQ2dJQ0FnREFoQmtLQWdJQ0FNQ0VFQWtBQ1FDQUFJQUZCZ0FFZ0FVRUFFQlFpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0NCQmdEUUFnQUNBREtRTUFRUUFRNXdFaUJFS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQURBRUxJQUFnQkVIcUFDQUVRUUFRRkNJR1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBRFFDQUNJQUFnQkNBR0lBSkJGR29RcmdFaUJ6Y0RHQ0FIUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQWlnQ0ZBMENJQUFnQ0NBQlFRRWdBa0VZYWhBaElRY2dBQ0FDS1FNWUVBOGdCMEtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQUFnQUNBSFFmOEFRUUlnQWtFZ2FoQ3RBaEQ4QVVVTkFRc0xJQUFnQkVFQkVLMEJHZ3NnQUNnQ0VDSURLUU9BQVNFQklBTkNnSUNBZ0NBM0E0QUJJQUlnQVRjRENDQUFJQUlwQXloQ2dJQ0FnREJCQVNBQ1FRaHFFQ0VoQVNBQUlBSXBBd2dRRHlBQUlBVWdBU0FCUW9DQWdJQndnMEtBZ0lDQTRBQlJJZ01iRUE5Q2dJQ0FnT0FBSUFVZ0F4c2hCUXNnQUNBSUVBOGdBQ0FHRUE4Z0FDQUVFQThnQUNBQ0tRTWdFQThnQUNBQ0tRTW9FQThMSUFKQk1Hb2tBQ0FGQ3g0QUlBQWdBVFlDY0NBQUlBRUVmeUFBS0FKMElBRnJCVUVBQ3pZQ2VBdnpBd0lGZmdGL0l3QkJJR3NpQWlRQUlBQWdCU2tEQUJEOUFTRUxJQUlnQlNrREVDSUlOd01ZSUFVcEF5QWhDaUFGS1FNWUlRa0NRQUpBSUFBZ0FrRVVhaUFGS1FNSUVIY05BQUpBSUFzTkFDQUZRb0dBZ0lBUU53TUFBa0FnQkVFRGNTSUZRUUZHQkVCQ2dJQ0FnT0FBSVFFZ0FCQTBJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQUpBSUFCQjd2Y0FRYjc2QUNBRVFRUnhJZ1FiRUdJaUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdCa0dJQVNBSFFRY1FHVUVBU0EwQUlBTXBBd0FpQjBJZ2lLZEJkVThFUUNBSHB5SURJQU1vQWdCQkFXbzJBZ0FMSUFBZ0JrR0pBVUhBQUNBRUd5QUhRUWNRR1VFQVRnMENDeUFBSUFZUUR3d0VDeUFES1FNQUlnWkNJSWluUVhWSkRRQWdCcWNpQXlBREtBSUFRUUZxTmdJQUN5QUFJQWdnQWlnQ0ZDQUdRUWNRcndGQkFFZ05BVUtBZ0lDQTRBQWhBU0FBSUFwQmZ4RGVBeUlEUVFCSURRSWdBMFVOQUFKQUlBVkJBa1lFUUNBQ0lBQWdDQkNDQlNJR053TUlJQVpDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQ0FBSUFsQ2dJQ0FnREJCQVNBQ1FRaHFFQ0VoQVNBQUlBSXBBd2dRRHd3QkN5QUFJQWxDZ0lDQWdEQkJBU0FDUVJocUVDRWhBUXNnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBZ0FSQVBDMEtBZ0lDQU1DRUJEQUVMUW9DQWdJRGdBQ0VCQ3lBQ1FTQnFKQUFnQVF1cENBSURmdzErSXdCQjhBQnJJZ1VrQUNBRlFvQ0FnSUF3TndOUUFrQWdBVUwvLy8vL2IxZ0VRQ0FBRUNSQ2dJQ0FnT0FBSVF3TUFRc2dBQ0FGUWVBQWFpQUJFTDhDSWd4Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQUVLQWdJQ0FNQ0VOUW9DQWdJQXdJUWhDZ0lDQWdEQWhDd0pBQWtBZ0FDQUJRWUFCSUFGQkFCQVVJaEpDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUJJUVlBMEFBa0FnQUNBREtRTUFRUUFRNXdFaUMwS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQURBRUxJQUFnQzBIcUFDQUxRUUFRRkNJTlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0JTQUFFRDRpRGpjRFVDQU9Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQkErSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0E0QUFoQ0F3Q0N5QUFJQWhDQUVJQlFRY1F2UUZCQUVnTkFTQUZRZUFBYWlBRVFRSkdRUU4wY2lFR0lBVXBBMkFpRTBJZ2lLZEJkRXNoQnlBRktRTm9JaFJDSUlpblFYVkpJUU1DUUFKQUFrQURRQ0FGSUFBZ0N5QU5JQVZCREdvUXJnRWlDVGNEV0NBSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFVZ0JTZ0NERVVFUUNBQUlCSWdBVUVCSUFWQjJBQnFFQ0VoRVNBQUlBVXBBMWdRRHlBUlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFRZ0JTQU9Od01nSUFVZ0VEY0RHQ0FGUW9DQWdJQVFOd01RSUFZcEF3QWhDU0FGSUFnM0F6QWdCU0FKTndNb0lBQkJ6Z0JCQVNBRVFRVWdCVUVRYWhEUEFTSUtRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSUNRQ0FFUVFGR0JFQWdDaUVQSUFCQnpnQkJBVUVGUVFVZ0JVRVFhaERQQVNJS1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFRTUFRc0NRQ0FFUVFKR0JFQWdBQ0FPSUJDblFvQ0FnSUF3UVFjUXJ3RkJBRWdOQnlBVElna2hEeUFIRFFFTUFnc2dDaUVQSUJRaUNTRUtJQU1OQVFzZ0NhY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQUlBaEJBUkRlQTBFQVNBUkFJQUFnRVJBUElBQWdEeEFQREFRTElBVWdDamNEU0NBRklBODNBMEFnQUNBUlFmOEFRUUlnQlVGQWF4Q3RBaUVKSUFBZ0R4QVBJQUFnQ2hBUElCQkNBWHdoRUNBQUlBa1EvQUZGRFFFTUJBc0xJQUFnQ0VGL0VONERJZ0pCQUVnTkJDQUNSUTBGSUFSQkFrWUVRQ0FBSUE0UWdnVWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEZJQUFnRGhBUElBVWdBVGNEVUFzZ0FDQUFJQVlwQXdCQ2dJQ0FnREJCQVNBRlFkQUFhaEFoRVB3QkRRUU1CUXNnRVNFS0N5QUFJQW9RRHdzZ0FDQUxRUUVRclFFYURBRUxDeUFBS0FJUUlnSXBBNEFCSVFFZ0FrS0FnSUNBSURjRGdBRWdCU0FCTndNQUlBQWdCU2tEYUNJVVFvQ0FnSUF3UVFFZ0JSQWhJUUVnQUNBRktRTUFFQThnQUNBTUlBRWdBVUtBZ0lDQWNJTkNnSUNBZ09BQVVTSUNHeEFQUW9DQWdJRGdBQ0FNSUFJYklRd2dCU2tEWUNFVEN5QUFJQklRRHlBQUlBZ1FEeUFBSUFVcEExQVFEeUFBSUEwUUR5QUFJQXNRRHlBQUlCTVFEeUFBSUJRUUR3c2dCVUh3QUdva0FDQU1DeUFBSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBQkN6UUFJQU1wQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlDSUFJb0FnQkJBV28yQWdBTElBQWdBU0FBSUFVcEF3QVEvUUVRL3dJTG9BWUNBbjhEZmlNQVFVQnFJZ1VrQUVLQWdJQ0E0QUFoQndKQUlBQWdCVUVnYWhETkFpSUlRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQUNRQ0FBSUFWQklHb0Nmd0pBQWtBQ1FBSkFJQUZDZ0lDQWdIQlVEUUFnQWFjaUJpOEJCa0UzUncwQUlBWW9BaUFpQmcwQkN5QUFRZlErUVFBUUZRd0JDd0pBSUFSRkJFQWdCaWtEQ0NJSFFpQ0lwMEYxU1EwQklBZW5JZ1FnQkNnQ0FFRUJhallDQUF3QkN5QUFJQVlwQXdBaUFVRUdRUmNnQkVFQlJoc2dBVUVBRUJRaUIwS0FnSUNBY0lNaUFVS0FnSUNBSUZJRVFDQUJRb0NBZ0lEZ0FGRU5BaUFCUW9DQWdJQXdVZzBCQ3lBREtRTUFJZ0ZDSUlpbklRSWdCRUVCUmdSQUlBSkJkVThFUUNBQnB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFVZ0FDQUJRUUVRL3dJM0F3QkJBQXdFQ3lBQ1FYVlBCRUFnQWFjaUFpQUNLQUlBUVFGcU5nSUFDd3dDQ3lBRklBQWdCaWtEQUNBSElBSkJBRW9nQXlBRlFSUnFFTWNGSWdFM0F4Z2dBQ0FIRUE4Z0FVS0FnSUNBY0lNaUIwS0FnSUNBNEFCUkRRQWdCU2dDRkVFQ1JnUkFJQVVnQUNBQklBVkJGR29RMndVaUJ6Y0RHQ0FBSUFFUUR5QUhRb0NBZ0lCd2d5SUhRb0NBZ0lEZ0FGRU5BUXNnQjBLQWdJQ0E0QUJSRFFBZ0FDQUFLUU5RSUFVZ0JVRVlha0VBRVA0QklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUFJQVVwQXhnUUR3d0JDeUFGSUFVb0FoUkJBRWV0UW9DQWdJQVFoRGNET0NBRklBQkJ6UUJCQVVFQVFRRWdCVUU0YWhEUEFTSUpOd01BUW9DQWdJRGdBQ0VISUFsQ2dJQ0FnSENEUW9DQWdJRGdBRklFUUNBQUlBVXBBeGdRRHlBRlFvQ0FnSUF3TndNSUlBQWdBU0FGSUFWQklHb1Fyd0loQWlBQUlBa1FEeUFBSUFFUUR5QUFJQVVwQXlBUUR5QUFJQVVwQXlnUUR5QUNSUTBFSUFBZ0NCQVBEQVVMSUFBZ0FSQVBJQUFnQlNrREdCQVBJQUFnQlNrRElCQVBJQUFnQlNrREtCQVBJQUFnQ0JBUERBUUxJQUFvQWhBaUFpa0RnQUVoQVNBQ1FvQ0FnSUFnTndPQUFRc2dCU0FCTndNQVFRRUxRUU4wY2lrREFFS0FnSUNBTUVFQklBVVFJU0VCSUFBZ0JTa0RBQkFQSUFBZ0FSQVBJQUFnQlNrRElCQVBJQUFnQlNrREtCQVBDeUFJSVFjTElBVkJRR3NrQUNBSEM5QUNBZ04rQW44akFFRVFheUlHSkFBZ0FVRUZSZ1JBSUFJcEF4QWhCQ0FBSUFJcEF4Z1EvUUVoQnlBR0lBSXBBeUFpQXpjRENBSi9Ba0FDUUNBRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBRFFpQ0lweUVCSUFjRVFDQUJRWFZQQkVBZ0E2Y2lBU0FCS0FJQVFRRnFOZ0lBQ3lBQUlBTVFpZ0VNQXdzZ0FVRjFTUTBCSUFPbklnRWdBU2dDQUVFQmFqWUNBQXdCQ3lBQUlBUkNnSUNBZ0RCQkFTQUdRUWhxRUNFaEF3c2dCaUFETndNQVFRQWdBMEtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJHZ3NnQUNnQ0VDSUJLUU9BQVNFRElBRkNnSUNBZ0NBM0E0QUJJQVlnQXpjREFFRUJDeUVCUW9DQWdJQXdJUVFnQUNBQ0lBRkJBM1JxS1FNQUlnVkNnSUNBZ0hDRFFvQ0FnSUF3VWdSK0lBQWdCVUtBZ0lDQU1FRUJJQVlRSVNFRUlBWXBBd0FGSUFNTEVBOGdCa0VRYWlRQUlBUVBDMEdlaWdGQnJ2d0FRZGZwQWtIOS9BQVFBQUFMbmdJQkFYOUJBQ0VDQWtBZ0JTa0RBQ0lCUW9DQWdJQndWQTBBSUFHbklnVXZBUVpCT1VjTkFDQUZLQUlnSVFJTElBUkJBWEVoQlNBQ0tBSUVJUVlnQXlrREFDRUJBa0FDUUFKQUlBUkJBazRFUUNBR1FYNXhRUVJIRFFJZ0FrRUZOZ0lFSUFVRVFDQUFJQUlvQWt3Z0FSRGZBd3dDQ3lBQUlBSWdBVUVCRVBvQ0RBRUxJQVpCQTBjTkFpQUNJQVUyQWhRZ0FVSWdpS2NoQXdKQUlBVUVRQ0FEUVhWUEJFQWdBYWNpQXlBREtBSUFRUUZxTmdJQUN5QUFJQUVRaWdFTUFRc2dBMEYxVHdSQUlBR25JZ01nQXlnQ0FFRUJhallDQUFzZ0FpZ0NSRUVJYXlBQk53TUFDeUFBSUFJUWhRVUxRb0NBZ0lBd0R3dEI1NGNCUWE3OEFFSFRtUUZCMmNzQUVBQUFDMEhCaFFGQnJ2d0FRZHlaQVVIWnl3QVFBQUFMamdNQ0FuOENmaU1BUVNCcklnSWtBQUpBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lCUzhCQmtFNVJ3MEFJQVVvQWlBaEJnc0NRQ0FBSUFKQkVHb1F6UUlpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBSUFaRkJFQWdBRUg0TDBFQUVCVWdBQ2dDRUNJREtRT0FBU0VISUFOQ2dJQ0FnQ0EzQTRBQklBSWdCemNEQ0NBQUlBSXBBeGdpQjBLQWdJQ0FNRUVCSUFKQkNHb1FJU0VJSUFBZ0Fpa0RDQkFQSUFBZ0NCQVBJQUFnQWlrREVCQVBJQUFnQnhBUERBSUxJQUJCTUJCZklnVUVRQ0FGSUFRMkFnZ2dBeWtEQUNJSFFpQ0lwMEYxVHdSQUlBZW5JZ01nQXlnQ0FFRUJhallDQUFzZ0JTQUhOd01RSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBeUFES0FJQVFRRnFOZ0lBQ3lBRklBRTNBeGdnQlNBQ0tRTVFOd01nSUFVZ0Fpa0RHRGNES0NBR0tBSklJZ01nQlRZQ0JDQUZJQVpCeUFCcU5nSUVJQVVnQXpZQ0FDQUdJQVUyQWtnZ0JpZ0NCRUVEUmcwQ0lBQWdCaENGQlF3Q0N5QUFJQUlwQXhBUUR5QUFJQUlwQXhnUUR5QUFJQUVRRHd0Q2dJQ0FnT0FBSVFFTElBSkJJR29rQUNBQkM5c0JBZ0YvQW40akFFRWdheUlESkFBZ0FVRURSZ1JBSUFJcEF4QWhCQ0FDS1FNSUlRVUNRQ0FBSUFOQkVHb2dBaWtEQUJDa0JVRUFTQVJBUW9DQWdJRGdBQ0VFREFFTElBQWdCQ0FGUVFJZ0EwRVFhaEFoSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUtBSVFJZ0VwQTRBQklRUWdBVUtBZ0lDQUlEY0RnQUVnQXlBRU53TUlJQUFnQXlrREdFS0FnSUNBTUVFQklBTkJDR29RSVNFRUlBQWdBeWtEQ0JBUEN5QUFJQU1wQXhBUUR5QUFJQU1wQXhnUUR3c2dBMEVnYWlRQUlBUVBDMEh3aWdGQnJ2d0FRYnZxQWtHUy9RQVFBQUFMRXdBZ0FDZ0NBQ0FCSUFJZ0FDZ0NCQkVCQUFzSkFDQUFJQUVRandVTGRBSUJmZ0YvSUFBZ0FSQ1BCU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQVE4TFFRb2hCUUorQWtBZ0FrVU5BQ0FES1FNQUlnUkNnSUNBZ0hDRFFvQ0FnSUF3VVEwQUlBQWdCQkNPQlNJRlFRQk9EUUJDZ0lDQWdPQUFEQUVMSUFBZ0FTQUZFSm9GQ3lFRUlBQWdBUkFQSUFRTHpSQUNDbjhDZmlNQVFhQUlheUlCSkFBQ2YwR0FDQkN4QVNJSUlRUkJ4aUpCS3hDbUF5RUZBa0FDUUVIVS9RQkI5d0FRcGdORkJFQkJvTlFFUVJ3MkFnQU1BUXRCc0FsQnNCRWdCQnNRc1FFaUFnMEJDMEVBREFFTElBSkJBRUdrQVJBckdpQUNRWDgyQWxBZ0FrRi9OZ0k4SUFJZ0FrR1FBV28yQWxRZ0FrR0FDRFlDTUNBQ0lBSkJyQUZxTmdJc0lBUkZCRUFnQWtHc0NXb2lCRUVBUVlBSUVDc2FDeUFDUWZjQU5nS2dBU0FDUVlBSU5nS1lBU0FDSUFRMkFwd0JBa0FnQlVVRVFDQUNRUVEyQWdBTUFRc2dCRUVBT2dBQUN5QUNRUUUyQWlnZ0FrRUNOZ0lrSUFKQkF6WUNJQ0FDUVFRMkFneEJyZFVFTFFBQVJRUkFJQUpCZnpZQ1RBc2dBa0drMUFRb0FnQWlCRFlDT0NBRUJFQWdCQ0FDTmdJMEMwR2sxQVFnQWpZQ0FDQUNDeUVDSUFBZ0FVR2dCR29RbUFVZ0FVRWdOZ0tRQkNBQklBRTBBcWdFTndPWUJDQUNRZjJkQVNBQlFaQUVhaENVQVNBQUJFQWdBRUVRYWlFRkEwQWdBMEVGUndSQUlBVWdBMEVEZENJSlFiU2tBV29vQWdBaUJDQUFLQUlBRVFNQUlnWUVRQ0FFSUFZZ0FDZ0NEQkVFQUNJS1RRUkFJQUVnQ1VHd3BBRnFLQUlBTmdLSUJDQUJJQVEyQW9BRUlBRWdDaUFFYXpZQ2hBUWdBa0cvbWdFZ0FVR0FCR29RbEFGQkFTRUhDeUFGSUFZZ0FDZ0NCQkVBQUFzZ0EwRUJhaUVEREFFTEN5QUhSUVJBUWRHYUFVRWhJQUlRb3dZTElBRkJzQVpxUVFCQjdBRVFLeG9nQUVIVUFHb2hBeUFBUWRBQWFpRUVBMEFnQkNBREtBSUFJZ05IQkVBZ0EwRUVheTBBQUVFUGNVVUVRQ0FCUWJBR2FrRTZJQU5CQW1zdkFRQWlCU0FGUVRwUEcwRUNkR29pQlNBRktBSUFRUUZxTmdJQUN5QURRUVJxSVFNTUFRc0xRUUVoQTBHTW1nRkJFaUFDRUtNR0lBRW9BckFHSWdRRVFDQUJRZVRrQURZQytBTWdBVUVBTmdMMEF5QUJJQVEyQXZBRElBSkJycG9CSUFGQjhBTnFFSlFCQ3dOQUlBTkJPa2NFUUNBQlFiQUdhaUFEUVFKMGFpZ0NBQ0lFQkVBZ0FTQUFJQUZCOEFWcUlBTkJER3hCaEo4QmFpZ0NBQkNHQlRZQzZBTWdBU0FETmdMa0F5QUJJQVEyQXVBRElBSkJycG9CSUFGQjRBTnFFSlFCQ3lBRFFRRnFJUU1NQVFzTElBRW9BcGdJSWdBRVFDQUJRY3JGQURZQzJBTWdBVUVBTmdMVUF5QUJJQUEyQXRBRElBSkJycG9CSUFGQjBBTnFFSlFCQ3dKQUFrQWdBaWdDVENJQVFRQk9CRUFnQUVVTkFVSEExQVFvQWdBZ0FFSC8vLy8vZTNGSERRRUxBa0FnQWlnQ1VFRUtSZzBBSUFJb0FoUWlBQ0FDS0FJUVJnMEFJQUlnQUVFQmFqWUNGQ0FBUVFvNkFBQU1BZ3NnQWhEVEJBd0JDeUFDSUFJb0Frd2lBRUgvLy8vL0F5QUFHellDVEFKQUFrQWdBaWdDVUVFS1JnMEFJQUlvQWhRaUFDQUNLQUlRUmcwQUlBSWdBRUVCYWpZQ0ZDQUFRUW82QUFBTUFRc2dBaERUQkFzZ0FpZ0NUQm9nQWtFQU5nSk1Dd3NnQVVHV2hnRTJBc2dESUFGQnY0RUJOZ0xFQXlBQlFhK0dBVFlDd0FNZ0FrR2ZtZ0VnQVVIQUEyb1FsQUVnQVNrRHVBUWlDMUJGQkVBZ0FTQUJLUU9nQkNJTU53T3dBeUFCSUFzM0E2Z0RJQUVnRExrZ0M3bWpPUU80QXlBQlFmZjNBRFlDb0FNZ0FrSFRuQUVnQVVHZ0Eyb1FwQUVnQVVFSU5nS0lBeUFCSUFFcEE3QUVJZ3MzQTRBRElBRWdBU2tEb0FRZ0MzMjVJQUVwQThBRUlndTVvemtEa0FNZ0FVR0krQUEyQXZBQ0lBRWdDemNEK0FJZ0FrSDVuQUVnQVVId0Ftb1FwQUVMSUFFcEE4Z0VJZ3RRUlFSQUlBRWdBU2tEMEFRaUREY0Q0QUlnQVNBTE53UFlBaUFCSUF5NUlBdTVvemtENkFJZ0FVSExOellDMEFJZ0FrR3VuQUVnQVVIUUFtb1FwQUVMSUFFcEE5Z0VJZ3RRUlFSQUlBRWdBU2tENEFRaUREY0R3QUlnQVNBTE53TzRBaUFCSUF5NUlBdTVvemtEeUFJZ0FVR3ZPRFlDc0FJZ0FrR3duUUVnQVVHd0Ftb1FwQUVMSUFFcEErZ0VJZ3RRUlFSQUlBRWdBU2tEOEFRaUREY0RvQUlnQVNBTE53T1lBaUFCSUF5NUlBdTVvemtEcUFJZ0FVR3FORFlDa0FJZ0FrSGVtd0VnQVVHUUFtb1FwQUVnQVNBQktRT0FCVGNEZ0FJZ0FTQUJLUVA0QkNJTHVTQUJLUVBvQkxtak9RT0lBaUFCUWRRNk5nTHdBU0FCSUFzM0EvZ0JJQUpCM3BzQklBRkI4QUZxRUtRQklBRWdBU2tEa0FVaUN6Y0Q0QUVnQVNBTHVTQUJLUU9JQlNJTHVhTTVBK2dCSUFGQnZEazJBdEFCSUFFZ0N6Y0QyQUVnQWtIWG5RRWdBVUhRQVdvUXBBRUxBa0FnQVNrRG1BVWlDMUFOQUNBQklBRXBBNkFGTndQQUFTQUJRZlEyTmdLd0FTQUJJQXMzQTdnQklBSkJnSnNCSUFGQnNBRnFFSlFCSUFFZ0FTa0RxQVVpQ3pjRG9BRWdBU0FMdVNBQktRT1lCU0lMdWFNNUE2Z0JJQUZCc08wQU5nS1FBU0FCSUFzM0E1Z0JJQUpCaFp3QklBRkJrQUZxRUtRQklBRXBBN0FGSWd0UURRQWdBU0FCS1FPNEJTSU1Od09BQVNBQklBczNBM2dnQVNBTXVTQUx1YU01QTRnQklBRkJsZVVBTmdKd0lBSkJoWndCSUFGQjhBQnFFS1FCQ3lBQktRUEFCU0lMVUVVRVFDQUJJQXMzQTJnZ0FVR0hOellDWUNBQ1FmT2FBU0FCUWVBQWFoQ1VBUXNDUUNBQktRUElCU0lMVUEwQUlBRWdDemNEV0NBQlFla3lOZ0pRSUFKQjg1b0JJQUZCMEFCcUVKUUJJQUVwQTlBRklndFFEUUFnQVNBTE53TklJQUZCNGpJMkFrQWdBa0h6bWdFZ0FVRkFheENVQVNBQklBRXBBOWdGSWd0Q0E0WTNBekFnQVNBTHVTQUJLUVBRQmJtak9RTTRJQUZCL3pNMkFpQWdBU0FMTndNb0lBSkJzNXNCSUFGQklHb1FwQUVMSUFFcEErQUZJZ3RRUlFSQUlBRWdBU2tENkFVM0F4QWdBVUdqTkRZQ0FDQUJJQXMzQXdnZ0FrR0Ftd0VnQVJDVUFRc2dBaWdDVEJvZ0FoQ2xBeG9nQWlBQ0tBSU1FUVFBR2lBQ0xRQUFRUUZ4UlFSQUlBSW9BalFpQUFSQUlBQWdBaWdDT0RZQ09Bc2dBaWdDT0NJREJFQWdBeUFBTmdJMEN5QUNRYVRVQkNnQ0FFWUVRRUdrMUFRZ0F6WUNBQXNnQWlnQ1lCQ2JBU0FDRUpzQkN5QUJRYUFJYWlRQUlBZ0xtQUVCQVg4akFFRWdheUlGSkFBQ1FDQUFJQVZCREdvZ0F5a0RBQkM3QVNJQ0JINENRQUpBQWtBZ0JBNENBQUVFQzBKL0lRRWdBaWdDQkEwQklBSW9BZ2dpQTBFQVRBMEJJQU5CQVd1dElRRU1BUXRDZnlFQklBSW9BZ2hCZ0lDQWdIaEdEUUFnQWhDeEFxd2hBUXNnQUNBQ0lBVkJER29RWGlBQUlBRVFod0lGUW9DQWdJRGdBQXNoQVNBRlFTQnFKQUFnQVE4TEVBRUFDL29CQWdOK0FYOGpBRUVnYXlJQ0pBQkNnSUNBZ09BQUlRRUNRQ0FBRUpjQklnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFFSmNCSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUFKQUlBQWdBa0VNYWlBREtRTUFFTHNCSWdORkRRQWdCYWRCQkdvZ0JxZEJCR29nQXhDUkJTRUlJQUFnQXlBQ1FReHFFRjRnQ0VFdmNRUkFJQUFnQ0JDRUFnd0JDeUFBSUFVUXpRRWhCU0FFQkVBZ0FCQStJZ2RDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFkQkFDQUZFS1VCR2lBQUlBZEJBU0FBSUFZUXpRRVFwUUVhSUFjaEFRd0NDeUFBSUFZUUR5QUZJUUVNQVFzZ0FDQUZFQThnQUNBR0VBOExJQUpCSUdva0FDQUJDNjRDQWdOK0FuOGpBRUV3YXlJQ0pBQkNnSUNBZ09BQUlRRUNRQ0FBRUpjQklnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFBSkFJQUFRbHdFaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdBa0VjYWlBREtRTUFFTHNCSWdoRkRRQWdBQ0FDUVFocUlBTXBBd2dRdXdFaUEwVUVRQ0FBSUFnZ0FrRWNhaEJlREFFTElBV25RUVJxSUFhblFRUnFJQWdnQXlBRVFROXhFT1FESVFrZ0FDQUlJQUpCSEdvUVhpQUFJQU1nQWtFSWFoQmVJQWtFUUNBQUlBa1FoQUlNQVFzZ0FDQUZFTTBCSVFVZ0JFRVFjUVJBSUFBUVBpSUhRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBQ0FIUVFBZ0JSQ2xBUm9nQUNBSFFRRWdBQ0FHRU0wQkVLVUJHaUFISVFFTUFnc2dBQ0FHRUE4Z0JTRUJEQUVMSUFBZ0JSQVBJQUFnQmhBUEN5QUNRVEJxSkFBZ0FRdkRBZ0lCZmdKL0l3QkJNR3NpQWlRQVFvQ0FnSURnQUNFQkFrQWdBQ0FDUVNocUlBTXBBd0FRcGdFTkFDQUFFSmNCSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBSkJGR29nQXlrRENCQzdBU0lHUlFSQUlBQWdCUkFQREFFTElBQW9BdGdCSVFNZ0FrSUFOd0lNSUFKQ2dJQ0FnSUNBZ0lDQWZ6Y0NCQ0FDSUFNMkFnQWdBa0lCRURBYUlBSWdBaWtES0NJQnB5SUhRZi8vLy84RFFRRVF6QUVhSUFJZ0FrSi9RZi8vLy84RFFRRVFkUm9nQmFkQkJHb2lBeUFHSUFJUWt3VWFBa0FnQkVVZ0FWQnlEUUFnQWtJQkVEQWFJQUlnQjBFQmEwSC8vLy8vQTBFQkVNd0JHaUFESUFJUTB3RkJBRWdOQUNBQ1FnRVFNQm9nQWlBSFFmLy8vLzhEUVFFUXpBRWFJQU1nQXlBQ1FmLy8vLzhEUVFFUTVBRWFDeUFDRUJzZ0FDQUdJQUpCRkdvUVhpQUFJQVVRelFFaEFRc2dBa0V3YWlRQUlBRUw2aE1DQW40QmZ5TUFRZEFCYXlJRUpBQWdBQ0FFRUpnRklBRWdBUkEwSWdOQnFpMENmaUFFS1FNSUlnSkNnSUNBZ0FoOFF2Ly8vLzhQV0FSQUlBSkMvLy8vL3crRERBRUxRb0NBZ0lEQWZpQUN1YjBpQWtLQWdJQ0F3SUdBL1A4QWZTQUNRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c1FRQ0FCSUFOQjMrQUFBbjRnQkNrREVDSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFib3FBbjRnQkNrREdDSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFhZ3FBbjRnQkNrRElDSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFmb29BbjRnQkNrREtDSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFmcmZBQUorSUFRcEF6QWlBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFFZ0EwSFlLQUorSUFRcEF6Z2lBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFFZ0EwRzIzd0FDZmlBRUtRTkFJZ0pDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQUpDLy8vLy93K0REQUVMUW9DQWdJREFmaUFDdWIwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUUNBQklBTkJ6U2tDZmlBRUtRTklJZ0pDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQUpDLy8vLy93K0REQUVMUW9DQWdJREFmaUFDdWIwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUUNBQklBTkJsK0FBQW40Z0JDa0RVQ0lDUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FDUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQXJtOUlnSkNnSUNBZ01DQmdQei9BSDBnQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUVBZ0FTQURRZUlvQW40Z0JDa0RXQ0lDUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FDUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQXJtOUlnSkNnSUNBZ01DQmdQei9BSDBnQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUVBZ0FTQURRYy9mQUFKK0lBUXBBMkFpQWtLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQWtMLy8vLy9ENE1NQVF0Q2dJQ0FnTUIrSUFLNXZTSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCQUlBRWdBMEdHS2dKK0lBUXBBMmdpQWtLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQWtMLy8vLy9ENE1NQVF0Q2dJQ0FnTUIrSUFLNXZTSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCQUlBRWdBMEd0NEFBQ2ZpQUVLUU53SWdKQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFKQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBQ3ViMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVFDQUJJQU5CeHlvQ2ZpQUVLUU40SWdKQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFKQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBQ3ViMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVFDQUJJQU5COE9BQUFuNGdCQ2tEZ0FFaUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkFJQUVnQTBITjRBQUNmaUFFS1FPSUFTSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFaSXFBbjRnQkNrRGtBRWlBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFFZ0EwRzQ0QUFDZmlBRUtRT1lBU0lDUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FDUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQXJtOUlnSkNnSUNBZ01DQmdQei9BSDBnQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUVBZ0FTQURRZFVxQW40Z0JDa0RvQUVpQWtLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQWtMLy8vLy9ENE1NQVF0Q2dJQ0FnTUIrSUFLNXZTSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCQUlBRWdBMEh2SndKK0lBUXBBNmdCSWdKQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFKQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBQ3ViMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVFDQUJJQU5CNmljQ2ZpQUVLUU93QVNJQ1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBQ1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVFQWdBU0FEUWVzekFuNGdCQ2tEdUFFaUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkFJQUVnQTBIN0p3SitJQVFwQThBQklnSkNnSUNBZ0FoOFF2Ly8vLzhQV0FSQUlBSkMvLy8vL3crRERBRUxRb0NBZ0lEQWZpQUN1YjBpQWtLQWdJQ0F3SUdBL1A4QWZTQUNRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c1FRQ0FCSUFOQm85OEFBbjRnQkNrRHlBRWlBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFNUVV5RUFJQVJCMEFGcUpBQWdBQXVmQWdFRGZpQUJRdi8vLy85dldBUkFJQUFRSkVLQWdJQ0E0QUFQQzBLQWdJQ0E0QUFoQlFKK0lBQWdBVUUySUFGQkFCQVVJZ1JDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUJCbEFFUUxRd0JDeUFBSUFRUU53c2lCRUtBZ0lDQWNJTWlCa0tBZ0lDQTRBQlNCSDRDZmlBQUlBRkJNeUFCUVFBUUZDSUJRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFRUzhRTFF3QkN5QUFJQUVRTndzaUFVS0FnSUNBY0lNaUJVS0FnSUNBNEFCUkJFQWdBQ0FFRUE5Q2dJQ0FnT0FBRHdzQ1FDQUdRb0NBZ0lDUWYxRUVRQ0FFcHlnQ0JFSC8vLy8vQjNGRkRRRUxJQVZDZ0lDQWdKQi9VUVJBSUFHbktBSUVRZi8vLy84SGNVVU5BUXNnQUVITW5nRWdCRUg0bVFFUXZnRWhCQXNnQUNBRUlBRVF4QUlGUW9DQWdJRGdBQXNMWHdFQmZ3SkFJQUZGQkVBZ0FrVU5BU0FBSUFJUTJRTVBDeUFDUlFSQUlBQWdBQ2dDQUVFQmF6WUNBQ0FBSUFBb0FnUkJDR3MyQWdRZ0FSQ2JBUXdCQ3lBQUtBSUlJQUFvQWdRZ0FtcFBCSDhnQVNBQ0VQTUZCVUVBQ3c4TFFRQUxKZ0FnQVFSQUlBQWdBQ2dDQUVFQmF6WUNBQ0FBSUFBb0FnUkJDR3MyQWdRZ0FSQ2JBUXNMQ1FBZ0FDQUJOZ0lZQ3lnQkFYOENRQ0FCcHlnQ0lDSURSUTBBSUFNb0FnQkJCRVlOQUNBQUlBTkJDR29nQWhEdkF3c0xQd0VCZndKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQWk4QkJrRXZSdzBBSUFJb0FpQWlBa1VOQUNBQUlBSVE3QU1nQUVFUWFpQUNJQUFvQWdRUkFBQUxDMGNCQVg4Q1FDQUJweWdDSUNJRFJRMEFJQU1wQXdBaUFVS0FnSUNBWUZvRVFDQUFJQUduSUFJUkFBQUxJQU1wQXdnaUFVS0FnSUNBWUZRTkFDQUFJQUduSUFJUkFBQUxDekFCQVg4Z0FhY29BaUFpQWdSQUlBQWdBaWtEQUJBaklBQWdBaWtEQ0JBaklBQkJFR29nQWlBQUtBSUVFUUFBQ3dzbkFRRi9JQUduS0FJZ0lnSUVRQ0FBSUFJcEF3QVFJeUFBUVJCcUlBSWdBQ2dDQkJFQUFBc0xXZ0VDZnlBQnB5Z0NJQ0lDQkVBQ1FDQUNLUU1BSWdGQ2dJQ0FnSEJVRFFBZ0FhY3RBQVZCQW5FTkFDQUNLQUlNSWdORkRRQWdBQ0FERU9vRElBSXBBd0FoQVFzZ0FDQUJFQ01nQUVFUWFpQUNJQUFvQWdRUkFBQUxDM2dCQTM4Q1FDQUJweWdDSUNJRVJRMEFJQVJCQ0dvaEF5QUVRUVJxSVFVRFFDQURLQUlBSWdNZ0JVWU5BUUpBSUFRb0FnQU5BQ0FES1FNUUlnRkNnSUNBZ0dCVURRQWdBQ0FCcHlBQ0VRQUFDeUFES1FNWUlnRkNnSUNBZ0dCYUJFQWdBQ0FCcHlBQ0VRQUFDeUFEUVFScUlRTU1BQXNBQ3d1YUFRRUdmeUFCcHlnQ0lDSURCRUFnQUVFUWFpRUVJQU5CQkdvaEJpQURLQUlJSVFJRFFDQUNJQVpIQkVBZ0FpZ0NCQ0VISUFKQkVHc2hCU0FDUVF4cktBSUFSUVJBQWtBZ0F5Z0NBQVJBSUFVUW53VU1BUXNnQUNBQ0tRTVFFQ01MSUFBZ0Fpa0RHQkFqQ3lBRUlBVWdBQ2dDQkJFQUFDQUhJUUlNQVFzTElBUWdBeWdDRUNBQUtBSUVFUUFBSUFRZ0F5QUFLQUlFRVFBQUN3dVVBZ0VGZndKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQXk4QkJrRWxSdzBBSUFNb0FpQWlCVVVOQUVFQUlRTURRQUpBSUFOQkUwWUVRRUVBSVFRTUFRc2dCU0FEUVFKMGFpZ0NDQ0lFQkVBZ0FDQUVJQUlSQUFBTElBTkJBV29oQXd3QkN3c0RRQ0FGS0FKVUlBUk1CRUJCQUNFRUEwQWdCQ0FGS0FKY1RnMERJQVVvQW1BaEJrRUFJUU1EUUNBRFFRNUhCRUFnQmlBRVFUeHNhaUFEUVFKMGFpZ0NCQ0lIQkVBZ0FDQUhJQUlSQUFBTElBTkJBV29oQXd3QkN3c2dCRUVCYWlFRURBQUxBQVVnQlNnQ1dDRUdRUUFoQXdOQUlBTkJEa2NFUUNBR0lBUkJQR3hxSUFOQkFuUnFLQUlFSWdjRVFDQUFJQWNnQWhFQUFBc2dBMEVCYWlFRERBRUxDeUFFUVFGcUlRUU1BUXNBQ3dBTEM4MENBUVovQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlDTHdFR1FTVkhEUUFnQWlnQ0lDSUVSUTBBUVFBaEFnTkFJQUpCRTBZRVFFRUFJUU1EUUNBRUtBSllJUVZCQUNFQ0lBUW9BbFFnQTB3RVFDQUFRUkJxSWdZZ0JTQUFLQUlFRVFBQVFRQWhBd05BSUFRb0FtQWhCVUVBSVFJZ0JDZ0NYQ0FEVEFSQUlBWWdCU0FBS0FJRUVRQUFJQVlnQkNBQUtBSUVFUUFBREFZRkEwQWdBa0VPUndSQUlBVWdBMEU4YkdvZ0FrRUNkR29vQWdRaUJ3UkFJQUFnQjYxQ2dJQ0FnSENFRUNNTElBSkJBV29oQWd3QkN3c2dBMEVCYWlFRERBRUxBQXNBQlFOQUlBSkJEa2NFUUNBRklBTkJQR3hxSUFKQkFuUnFLQUlFSWdZRVFDQUFJQWF0UW9DQWdJQndoQkFqQ3lBQ1FRRnFJUUlNQVFzTElBTkJBV29oQXd3QkN3QUxBQXNnQkNBQ1FRSjBhaWdDQ0NJREJFQWdBQ0FEclVLQWdJQ0FjSVFRSXdzZ0FrRUJhaUVDREFBTEFBc0xOUUVDZndKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQXk4QkJrRWpSdzBBSUFNb0FpQWhBZ3NnQUVFUWFpQUNJQUFvQWdRUkFBQUxHd0VCZnlBQnB5Z0NJQ0lEQkVBZ0FDQURLQUlNSUFJUkFBQUxDMkFCQTM4Z0FhY29BaUFpQWdSQUlBSW9BZ3dpQTYxQ2dJQ0FnSENFSVFFZ0F5MEFCVUVDY1VVRVFDQUNLQUlBSWdNZ0FpZ0NCQ0lFTmdJRUlBUWdBellDQUNBQ1FnQTNBZ0FMSUFBZ0FSQWpJQUJCRUdvZ0FpQUFLQUlFRVFBQUN3dGtBUUovSUFHbktBSWdJZ0lFUUFKQUFrQWdBaTBBQlVVTkFDQUFLQUs4QVNJRFJRMEFJQUFvQXNRQklBSW9BZ2dnQXhFQUFBd0JDeUFDS0FJWUlnTkZEUUFnQUNBQ0tBSVVJQUlvQWdnZ0F4RUdBQXNnQUVFUWFpQUNJQUFvQWdRUkFBQUxDeWtCQVg4Z0FDQUJweUlDTlFJa1FvQ0FnSUNRZjRRUUl5QUFJQUkxQWlCQ2dJQ0FnSkIvaEJBakN5RUFJQUduS0FJZ0tRTUFJZ0ZDZ0lDQWdHQmFCRUFnQUNBQnB5QUNFUUFBQ3dzaUFRRi9JQUFnQWFjb0FpQWlBaWtEQUJBaklBQkJFR29nQWlBQUtBSUVFUUFBQ3dvQUlBQkJBeEIyRUZNTFpRRUNmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBeThCQmtFUFJ3MEFJQU1vQWlBaUJFVU5BRUVBSVFNRFFDQURJQVF0QUFWUERRRWdCQ0FEUVFOMGFpa0RDQ0lCUW9DQWdJQmdXZ1JBSUFBZ0FhY2dBaEVBQUFzZ0EwRUJhaUVEREFBTEFBc0xZd0VDZndKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQWk4QkJrRVBSdzBBSUFJb0FpQWlBMFVOQUVFQUlRSURRQ0FDSUFNdEFBVlBSUVJBSUFBZ0F5QUNRUU4wYWlrRENCQWpJQUpCQVdvaEFnd0JDd3NnQUVFUWFpQURJQUFvQWdRUkFBQUxDM2dCQW44Z0FhY29BaUFpQkNrREFDSUJRb0NBZ0lCZ1dnUkFJQUFnQWFjZ0FoRUFBQXNnQkNrRENDSUJRb0NBZ0lCZ1dnUkFJQUFnQWFjZ0FoRUFBQXNEUUNBRUtBSVFJQU5LQkVBZ0JDQURRUU4wYWlrREdDSUJRb0NBZ0lCZ1dnUkFJQUFnQWFjZ0FoRUFBQXNnQTBFQmFpRUREQUVMQ3d0U0FRSi9JQUFnQWFjb0FpQWlBaWtEQUJBaklBQWdBaWtEQ0JBakEwQWdBeUFDS0FJUVRrVUVRQ0FBSUFJZ0EwRURkR29wQXhnUUl5QURRUUZxSVFNTUFRc0xJQUJCRUdvZ0FpQUFLQUlFRVFBQUM0QUJBUVIvSUFHbklnTW9BaUFoQkNBREtBSWtJUVVnQXlnQ0tDSURCRUFnQUNBRElBSVJBQUFMSUFRRVFBSkFJQVZGRFFCQkFDRURBMEFnQXlBRUtBSThUZzBCQWtBZ0JTQURRUUowYWlnQ0FDSUdSUTBBSUFZdEFBVkJBWEZGRFFBZ0FDQUdJQUlSQUFBTElBTkJBV29oQXd3QUN3QUxJQUFnQkNBQ0VRQUFDd3Q4QVFOL0lBR25JZ0lvQWlnaUF3UkFJQUFnQTYxQ2dJQ0FnSENFRUNNTElBSW9BaUFpQXdSQUlBSW9BaVFpQkFSQVFRQWhBZ05BSUFJZ0F5Z0NQRTVGQkVBZ0FDQUVJQUpCQW5ScUtBSUFFT3NCSUFKQkFXb2hBZ3dCQ3dzZ0FFRVFhaUFFSUFBb0FnUVJBQUFMSUFBZ0E2MUNnSUNBZ0dDRUVDTUxDeElBSUFHbktBSWdJZ0FFUUNBQUVLUURDd3NlQUNBQnB5a0RJQ0lCUW9DQWdJQmdXZ1JBSUFBZ0FhY2dBaEVBQUFzTEdRQWdBQ0FCcHlJQUtRTWdFQ01nQUVLQWdJQ0FNRGNESUF0RUFRSi9JQUduSVFRRFFDQUVLQUlvSUFOTEJFQWdCQ2dDSkNBRFFRTjBhaWtEQUNJQlFvQ0FnSUJnV2dSQUlBQWdBYWNnQWhFQUFBc2dBMEVCYWlFRERBRUxDd3RHQVFOL0lBR25JUU1EUUNBREtBSWtJUVFnQWlBREtBSW9UMFVFUUNBQUlBUWdBa0VEZEdvcEF3QVFJeUFDUVFGcUlRSU1BUXNMSUFCQkVHb2dCQ0FBS0FJRUVRQUFDMmtCQW44akFFRVFheUlISkFBQ2Z3SkFJQUduSWdndEFBVkJDSEZGRFFBZ0FDQUhRUXhxSUFJUXJBRkZEUUFnQnlnQ0RDQUlLQUlvVHcwQVFYOGdBQ0FJRUpJRERRRWFDeUFBSUFFZ0FpQURJQVFnQlNBR1FZQ0FDSElRYlFzaEFDQUhRUkJxSkFBZ0FBdUJBZ0lEZndGK0FrQUNRQ0FDUVFCT0RRQWdBYWNwQXlBaUNrS0FnSUNBY0lOQ2dJQ0FnSkIvVWcwQUlBSkIvLy8vL3dkeElnZ2dDcWNpQnlrQ0JDSUtwMEgvLy8vL0IzRlBEUUFDUUVFRUlBWVFrd05GRFFCQkFTRUNJQVpCZ01BQWNVVU5BaUFEUW9DQWdJQndnMEtBZ0lDQWtIOVNEUUFnQTZjaUNTa0NCQ0lCUXYvLy8vOEhnMElCVWcwQUlBZEJFR29oQndKL0lBcENnSUNBZ0FpRFVFVUVRQ0FISUFoQkFYUnFMd0VBREFFTElBY2dDR290QUFBTEFuOGdBVUtBZ0lDQUNJTlFSUVJBSUFrdkFSQU1BUXNnQ1MwQUVBdEdEUUlMSUFBZ0JrSGg2UUFRYnc4TElBQWdBU0FDSUFNZ0JDQUZJQVpCZ0lBSWNoQnRJUUlMSUFJTFJnQUNmd0pBSUFKQkFFNE5BQ0FCcHlrRElDSUJRb0NBZ0lCd2cwS0FnSUNBa0g5U0RRQkJBQ0FDUWYvLy8vOEhjU0FCcHlnQ0JFSC8vLy8vQjNGSkRRRWFDMEVCQ3d1ekFRRUNmd0pBSUFOQkFFNE5BQ0FDcHlrRElDSUNRb0NBZ0lCd2cwS0FnSUNBa0g5U0RRQWdBMEgvLy8vL0IzRWlBeUFDcHlJRUtRSUVJZ0tuUWYvLy8vOEhjVThOQUVFQklRVWdBVVVOQUNBRVFSQnFJUVFDZnlBQ1FvQ0FnSUFJZzFCRkJFQWdCQ0FEUVFGMGFpOEJBQXdCQ3lBRElBUnFMUUFBQ3lFRElBRkJCRFlDQUNBQUlBTkIvLzhEY1JDZkF5RUNJQUZDZ0lDQWdEQTNBeGdnQVVLQWdJQ0FNRGNERUNBQklBSTNBd2dMSUFVTFd3RUNmeUFCcHlnQ0VDSUFRVEJxSVFNZ0FDQUFLQUlZSUFKeFFYOXpRUUowYWlnQ0FDRUFBMEFDUUNBQVJRMEFJQU1nQUVFQmEwRURkR29pQkNnQ0JDQUNSZzBBSUFRb0FnQkIvLy8vSDNFaEFBd0JDd3NnQUVFQVJ3czFBUUYrSUFFcEF3QWlBa0lnaUtkQmRVOEVRQ0FDcHlJQklBRW9BZ0JCQVdvMkFnQUxJQUFnQWhDS0FVS0FnSUNBNEFBUVV3dU9BUUVDZnlBQktBSUFJZ0pCQUVvRVFDQUJJQUpCQVdzaUFqWUNBQUpBSUFJTkFDQUJMUUFFUWZBQmNVRVFSdzBBSUFFb0FnZ2lBaUFCS0FJTUlnTTJBZ1FnQXlBQ05nSUFJQUZCQURZQ0NDQUFLQUpnSWdJZ0FVRUlhaUlETmdJRUlBRWdBRUhnQUdvMkFnd2dBU0FDTmdJSUlBQWdBellDWUFzUEMwSEZqUUZCcnZ3QVFiQXNRYy8wQUJBQUFBdHZBUUovSUFFZ0FTZ0NBQ0lDUVFGcU5nSUFJQUpGQkVBZ0FTZ0NDQ0lDSUFFb0Fnd2lBellDQkNBRElBSTJBZ0FnQVVFQU5nSUlJQUFvQWxBaUFpQUJRUWhxSWdNMkFnUWdBU0FBUWRBQWFqWUNEQ0FCSUFJMkFnZ2dBQ0FETmdKUUlBRWdBUzBBQkVFUGNUb0FCQXNMRHdBZ0FTQUJLQUlBUVFGcU5nSUFDNGdCQWdGK0FYOUJBQ0VDUW9DQWdJQXdJUUVEUUFKQUlBSkJBa2NFZmlBRklBSkJBM1FpQkdvaUJ6VUNCRUlnaGtLQWdJQ0FNRkVOQVNBQVFhd3VRUUFRRlVLQWdJQ0E0QUFGUW9DQWdJQXdDdzhMSUFNZ0JHb3BBd0FpQmtJZ2lLZEJkVThFUUNBR3B5SUVJQVFvQWdCQkFXbzJBZ0FMSUFjZ0JqY0RBQ0FDUVFGcUlRSU1BQXNBQzF3QkFuNGdBaUFBS0FJQUVDMGhBMEVBSVFBZ0EwS0FnSUNBY0lOQ2dJQ0FnT0FBVVNBQ0lBRW9BZ0FRTFNJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSY2tVRVFDQURweUFFcHhDREFpRUFDeUFDSUFNUUR5QUNJQVFRRHlBQUMyc0JBWDRDUUFKQUFrQUNRQUpBSUFNdEFBVWlBUTRFQXdJQ0FBRUxJQUFnQXlnQ0NCREtCQThMSUFGQkNFWU5BZ3NRQVFBTElBQWdBeWdDRENBREtBSUFJQU10QUFnZ0F5MEFDU0FETGdFR0VJSUJEd3NnQUNBQUVEUWlCQ0FES0FJSUlBTW9BZ3dRSWlBRUN3a0FJQUFnQXhDTkF3dFRBUUYrSUFBUU5DSUVRb0NBZ0lCd2cwS0FnSUNBNEFCU0JFQWdBU0FCS0FJQVFRRnFOZ0lBSUFBZ0JFRThJQUd0UW9DQWdJQndoRUVERUJsQkFFNEVRQ0FFRHdzZ0FDQUVFQThMUW9DQWdJRGdBQXNEQUFFTGFnRUJmeU1BUVJCcklnTWtBQ0FCS0FJRUlRRWdBaUFEUVF4cUlBQW9BZ1FRckFGQkFDQUNJQU5CQ0dvZ0FSQ3NBUnRGQkVCQjBNVUFRYTc4QUVHRE9rSDh5UUFRQUFBTElBTW9BZ2doQUNBREtBSU1JUUVnQTBFUWFpUUFRWDhnQUNBQlJ5QUFJQUZMR3d2YUF3SUNmZ0YvSXdCQklHc2lCU1FBQWtBQ1FDQUFJQUZCTEJCTElnSkZEUUJDZ0lDQWdEQWhBUUpBSUFJcEF3QWlCa0tBZ0lDQWNJTkNnSUNBZ0RCU0JFQUNmd0pBSUFhbklnTXZBUVpCRld0Qi8vOERjVUVLVFFSQUlBTW9BaUFvQWd3b0FpQXRBQVJGRFFFZ0FCQnJEQVVMSUFBZ0JVRWNhaUFHRU5ZQkRRUWdCVUVjYWd3QkN5QURRU2hxQ3lFSUlBSW9BZ3dpQXlBSUtBSUFTUTBCSUFBZ0Fpa0RBQkFQSUFKQ2dJQ0FnREEzQXdBTElBUkJBVFlDQUF3Q0N5QUNJQU5CQVdvMkFnd2dCRUVBTmdJQUlBSW9BZ2hGQkVBZ0EwRUFUZ1JBSUFPdElRRU1Bd3RDZ0lDQWdNQitJQU80dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJJUUVNQWd0Q2dJQ0FnT0FBSVFFZ0FDQUNLUU1BSUFNUXNBRWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEJJQUlvQWdoQkFVWUVRQ0FHSVFFTUFnc2dCU0FHTndNSUlBVWdBMEVBVGdSK0lBT3RCVUtBZ0lDQXdINGdBN2k5SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xJZ2MzQXdBZ0FFRUNJQVVRaVFNaEFTQUFJQVlRRHlBQUlBY1FEd3dCQ3lBRVFRQTJBZ0JDZ0lDQWdPQUFJUUVMSUFWQklHb2tBQ0FCQ3hBQUl3QWdBR3RCY0hFaUFDUUFJQUFMQmdBZ0FDUUFDd1FBSXdBTDdnSUNCSDhDZmlNQVFSQnJJZ01rQUFKQUFrQWdBaWtERUNJSFFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTQkVBZ0FFR0RsQUZCQUJBVkRBRUxJQUlwQXhnaENDQUFJQWNRc3dFaUJFVUVRRUVBSVFRTUFRc2dBQ0FJRUxNQklnWkZEUUFDUUNBQUlBUWdCaERKQlNJQlJRMEFJQUFnQVJEK0EwRUFTQVJBSUFCQkFSQ1BCQXdCQ3lBQklBRW9BZ0JCQVdvMkFnQWdBQ0FCclVLQWdJQ0FVSVFnQUNrRHdBRkJBRUVBRU1nRklnZENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQWNRRHlBQklRVUxJQUFnQmhCVUlBVkZEUUFnQXlBQUlBVVFqUU1pQnpjREFDQUhRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FBSUFJcEF3QkNnSUNBZ0RCQkFTQURFQ0VRRHlBQUlBTXBBd0FRRHd3QkN5QUFLQUlRSWdFcEE0QUJJUWNnQVVLQWdJQ0FJRGNEZ0FFZ0F5QUhOd01JSUFBZ0FDQUNLUU1JUW9DQWdJQXdRUUVnQTBFSWFoQWhFQThnQUNBREtRTUlFQThMSUFBZ0JCQlVJQU5CRUdva0FFS0FnSUNBTUFzU0FDQUFRUUEyQXJBQklBQkNBRGNEcUFFTEh3QWdBRUVBTmdLd0FTQUFRVGcyQXF3QklBQkJPVUVBSUFFYk5nS29BUXNmQUNBQUlBQW9BaEFnQUNBQklBSVFCaUlBRVBFRklRRWdBQkNiQVNBQkMwOENBWDhCZmlBQUtBSVFJQUFnQVJBSElnSkZCRUJCQUE4TElBQWdBaUFDRUQ4Z0FVRWhFUFFGSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRklFUUNBQUlBUVFEeUFFcHlFREN5QUNFSnNCSUFNTENnQWdBRUlBTndPUUFRc1NBQ0FBUVFBMkFwUUJJQUJCTnpZQ2tBRUxCZ0FnQUJBTkN3b0FJQUFnQVVFRGRHb0xFd0FnQUVFMklBSkJBRUVCSUFFUWdnRVFVd3RMQVFGL0l3QkJFR3NpQlNRQUlBVWdBVGNEQ0FKQUlBQWdCVUVJYWlBQ0lBTWdCQkFPSWdCRkJFQkNnSUNBZ0RBaEFRd0JDeUFBS1FNQUlRRWdBQkNiQVFzZ0JVRVFhaVFBSUFFTFB3SUJmd0YrSXdCQkVHc2lBaVFBSUFBZ0FoRE5BaUVESUFFZ0Fpa0RBQkJUTmdJQUlBRWdBaWtEQ0JCVE5nSUVJQU1RVXlFQUlBSkJFR29rQUNBQUN5b0JBWDRnQUNrRHdBRWlBVUlnaUtkQmRVOEVRQ0FCcHlJQUlBQW9BZ0JCQVdvMkFnQUxJQUVRVXd2WEFRSUNmZ0YvQW45Qi9NY0FJQUVwQXdBaUFrSWdpS2NpQVVVZ0FVRUxha0VSUzNJTkFCb0NRQUpBSUFKQ2dJQ0FnSENESWdOQ2dJQ0FnTkIrVWdSQVFhZ3NJQU5DZ0lDQWdPQitVUTBER2lBRFFvQ0FnSUR3ZmxJRVFFRzZ6QUFnQUNBQ0VEZ05CQm9nQTBLQWdJQ0FnQUY4UWlDSXB5SUFRUTFKRFFJTUF3dEIxVEVNQXd0QmdOY0FEQUlMUVlNOElBQjJRUUZ4UlEwQUlBQkJBblJCMEo0QmFpZ0NBQXdCQzBIVnlnQkJ4VEVnQWtLQWdJQ0FjRlFiQ3lJQUVEOUJBV29pQVJDeEFTSUVCSDhnQkNBQUlBRVFId1ZCQUFzTGVRRUJmeU1BUVJCcklnVWtBQ0FEQkVBZ0JTQUJOZ0lNUVFFaEF3SkFBa0FDUUNBRlFReHFRUUFRa3dSQk0yb09Bd0lCQUFFTElBVkJER3BCQUJDVEJDSURRUzVISUFOQktFZHhJUU1NQVF0QkFDRURDeUFESUFSeUlRUUxJQUFnQVNBQkVEOGdBaUFFRVBRRkVGTWhBQ0FGUVJCcUpBQWdBQXZVQVFJQ2ZnRi9Ba0FnQUNBQktRTUFRb0NBZ0lBd1FvQ0FnSUF3RUpRRUlnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQUlRc3dFaEJDQUFJQUlRRHlBRVJRMEFJQUFnQkNBRUVEOUI3SWdCRVBVRklRSWdBQ0FFRUZRZ0FrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdBaUFCS1FNQVFlSG9BQkQ0QXlBQUlBSWdBU2tEQUVHNjZ3QVErQU1nQUNBQ0lBRXBBd0JCeU5jQUVQZ0RJQUFnQWtLQWdJQ0FNRUtBZ0lDQU1CQ1VCQ0VESUFBZ0FoQVBJQUFnQXhDekFTRUJJQUFnQXhBUElBRVBDeUFBSUFFUTl3VUxPUUlCZndGK0lBRTFBZ1JDSUlaQ2dJQ0FnT0FBVVFSL0lBQW9BaEFpQUNrRGdBRWhBeUFBUW9DQWdJQWdOd09BQVNBREVGTUZRUUFMQzNJQkJIOGpBQ0lHSVFjZ0EwRUFJQU5CQUVvYklRZ2dCaUFEUVFOMFFROXFRWEJ4YXlJR0pBQURRQ0FGSUFoR1JRUkFJQVlnQlVFRGRHb2dCQ0FGUVFKMGFpZ0NBQ2tEQURjREFDQUZRUUZxSVFVTUFRc0xJQUFnQVNrREFDQUNLUU1BSUFNZ0JoQWhFRk1oQUNBSEpBQWdBQXVOQVFFQ2ZpQUFJQUlwQXdBUU1TRUNJQUFnQVNrREFDQUNJQU1wQXdBZ0JDa0RBQ0lKSUFVcEF3QWlDa0dCQWtFQklBZ2JRUUFnQmh0QmhBaEJCQ0FJRzBFQUlBY2JjaUlCSUFGQmdCQnlJQWxDZ0lDQWdIQ0RRb0NBZ0lBd1VSc2lBU0FCUVlBZ2NpQUtRb0NBZ0lCd2cwS0FnSUNBTUZFYklnRkJnTUFBY2lBQklBZ2JFRzBhSUFBZ0FoQVRDMFFCQVg0Z0FDQUNLUU1BRURFaEFpQURLUU1BSWdSQ0lJaW5RWFZQQkVBZ0JLY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBRXBBd0FnQWlBRUVMRUZJQUFnQWhBVEN5d0JBWDRnQUNBQ0tRTUFFREVoQWlBQUlBRXBBd0FpQXlBQ0lBTkJBQkFVSVFNZ0FDQUNFQk1nQXhCVEMvUUJBZ1YvQVg0Z0FFR2dBV29oQndKQUEwQUNRQ0FCSUFaR0RRQWdBQ2dDcEFFaUF5QUhSZzBBSUFNb0FnQWlCU0FES0FJRUlnUTJBZ1FnQkNBRk5nSUFJQU5DQURjQ0FFRUFJUVFnQXlnQ0NDSUZJQU1vQWhBZ0EwRVlhaUFES0FJTUVSa0FJUWdEUUNBRUlBTW9BaEJPUlFSQUlBVWdBeUFFUVFOMGFpa0RHQkFQSUFSQkFXb2hCQXdCQ3dzZ0JTQUlFQThnQlNnQ0VDSUVRUkJxSUFNZ0JDZ0NCQkVBQUNBQ0lBVTJBZ0FnQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFVb0FoQWlBQ2tEZ0FFaENDQUFRb0NBZ0lBZ053T0FBUXdEQlNBR1FRRnFJUVlNQWdzQUN3c2dCcTBoQ0FzZ0NCQlRDdzhBSUFBb0FxUUJJQUJCb0FGcVJ3c2hBUUYrSUFBZ0FDQUJFUFlGSWdJUUR5QUNRb0NBZ0lCd2cwS0FnSUNBTUZJTFB3RUJmaUFBSUFFUTlnVWlBa0tBZ0lDQWNJTkNnSUNBZ0RCUkJFQWdBQ0FCS1FNQVFhM0xBQkN5QVNFQ0N5QUFJQUlRc3dFaEFTQUFJQUlRRHlBQkM3VUJBZ0ovQTM0akFFRVFheUlESkFBZ0FDa0R3QUVpQlVJZ2lLZEJkVThFUUNBRnB5SUVJQVFvQWdCQkFXbzJBZ0FMSUFBZ0JVR0Qwd0FRc2dFaEJpQUFJQVVRRHlBRElBQWdBUkJpTndNSUFrQWdBZ1JBSUFBZ0FDQUdRZG5BQUJDeUFTSUZJQVpCQVNBRFFRaHFFQ0VoQnlBQUlBTXBBd2dRRHd3QkN5QUFJQVpDZ0lDQWdEQkJBU0FEUVFocUVDRWhCeUFES1FNSUlRVUxJQUFnQlJBUElBQWdCaEFQSUFjUVV5RUFJQU5CRUdva0FDQUFDd29BSUFBZ0FSQmlFRk1MUGdJQmZ3RjhJd0JCRUdzaUFpUUFJQUpDZ0lDQWdJQ0FnUHovQURjRENDQUFJQUpCQ0dvZ0FTa0RBQkJDR2lBQ0t3TUlJUU1nQWtFUWFpUUFJQU1MYVFFQmZnSitJQUc5SWdJQ2Z5QUJtVVFBQUFBQUFBRGdRV01FUUNBQnFnd0JDMEdBZ0lDQWVBc2lBTGU5VVFSQUlBQ3REQUVMUW9DQWdJREFmaUFDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QlRDd2dBSUFBUVBoQlRDdzBBSUFBZ0FTa0RBQkJIRUZNTENBQWdBQkEwRUZNTEtRRUJmaUFCS1FNQUlnSkNJSWluUVhWUEJFQWdBcWNpQUNBQUtBSUFRUUZxTmdJQUN5QUNFRk1MQ0FBZ0FDQUJFRlFMRmdBZ0FDZ0NFQ0lBUVJCcUlBRWdBQ2dDQkJFQUFBcytBZ0YvQVg0Q1FDQUJLUU1BSWdOQ0lJaW5RWFZKRFFBZ0E2Y2lBaUFDS0FJQUlnSkJBV3MyQWdBZ0FrRUJTZzBBSUFBZ0F4Q1dCQXNnQVJDYkFRc1FBQ0FBSUFFcEF3QVFEeUFCRUpzQkN3Y0FJQUFRcEFNTDJRTUNBbjhCZmlNQVFTQnJJZ0lrQUFKQUFrQWdBVUtBZ0lDQWNJTkNnSUNBZ0RCU0JFQWdBRUdpUGtFQUVCVU1BUXNnQXlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdNZ0F5Z0NBRUVCYWpZQ0FBc0RRQUpBQWtBQ1FBSkFBa0FDUUVFSElBRkNJSWluSWdNZ0EwRUhhMEZ1U1J0QkMyb09Fd0lJQVFVREJRVUZCUVVFQUFBRkJRVUZCUUVGQ3lBQUlBSEVFSWNDSVFFTUJ3c0NRQUorSUFBZ0FrRU1haUFCRUxzQ0lnTW9BZ2hCL3YvLy93ZE9CRUFnQUNBQkVBOGdBRUhESzBFQUVGQkNnSUNBZ09BQURBRUxJQUFRbHdFaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBYW5RUVJxSWdRZ0F4QkVJUVVnQkVFQkVORUJJUVFnQUNBQkVBOGdCQ0FGY2lJRVFTQnhCRUFnQUNBR0VBOGdBQkI4UW9DQWdJRGdBQXdCQ3lBRVFSQnhCRUFnQUNBR0VBOGdBRUgxeFFCQkFCQlFRb0NBZ0lEZ0FBd0JDeUFBSUFZUXpRRUxJUUVnQXlBQ1FReHFSdzBISUFKQkRHb1FHd3dIQ3lBQUlBRVFEd3dGQ3lBQUlBRVFOeUlCUW9DQWdJQndnMEtBZ0lDQTRBQlNEUU1NQlFzZ0FDQUJFS29GSVFFTUJBc2dBQ0FCUVFFUW1nRWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQU1MQ3lBQUlBRVFEeUFBUWV3clFRQVFGUXRDZ0lDQWdPQUFJUUVMSUFKQklHb2tBQ0FCQzU0T0FnMS9BbjRqQUVIUUFHc2lCU1FBUW9DQWdJRGdBQ0VUQWtBZ0FCQ1hBU0lTUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQlNBQk5nSTRJQktuUVFScUlRb0NRQUpBQWtBQ1FBSkFJQUpCRUV3RVFDQUJRZURSQUNBRlFUaHFFSmtGRFFFZ0JTZ0NPQ0VCQ3dKQUFrQUNRQ0FCTFFBQUlnUkJLMnNPQXdFQ0FBSUxRUUVoRUFzZ0JTQUJRUUZxSWd3MkFqZ2dBUzBBQVNFRUlBd2hBUXNDUUFKQUFrQUNRQ0FFUWY4QmNVRXdSZ1JBQWtBQ1FDQUJMUUFCSWdSQitBQkhCRUFnQkVIdkFFWU5CU0FFUWRnQVJ3MEJDeUFDUVc5eFJRUkFJQVVnQVVFQ2FqWUNPRUVRSVFJZ0FTMEFBaENXQVVFUVNRMEhEQWdMSUFSQjd3QkdEUVlnQWtVaEJnd0JDeUFDUlNFR0lBSU5BQ0FFUWM4QVJnMEVDeUFFUWVJQVJnMEJJQVlnQkVIQ0FFWnhEUU1NQWdzZ0FrRVFTZzBESUFGQnJOMEFJQVZCT0dvUW1RVkZEUUVNQndzZ0JpQUNSWEpGRFFJTUFRc2dBZzBCQzBFS0lRSUxBbjhnQWlBQ1FRRnJJZ1J4QkVBZ0NpZ0NBQ0VFSUFWQ0FEY0NMQ0FGUW9DQWdJQ0FnSUNBZ0g4M0FpUWdCU0FFTmdJZ0lBVkJJR29NQVF0QklDQUVaMnRCQUNBQ1FRSlBHeUVKSUFvTElRMGdCU2dDT0NFRUEwQWdCQzBBQUVFd1IwVUVRQ0FGSUFSQkFXb2lCRFlDT0F3QkN3dEJJQ0VNSUFsRkJFQWdBa0hlcUFScUxRQUFJUXdMSUExQkFSQkJHaUFGUVFBMkFqUWdEQ0VFUVFBaEJnSkFBa0FDUUFKQUEwQUNRQUpBSUFVb0FqZ2lDQzBBQUNJUlFTNUhEUUFnQVNBSVR3UkFRUzRoRVNBSUxBQUJFSllCSUFKT0RRRUxJQTROQTBFQklRNGdCU0FJUVFGcUlnYzJBamdnQ0MwQUFTRVJJQXNoRHd3QkN5QUlJUWNMSUFJZ0VjQVFsZ0VpQ0VzRVFDQUZJQWRCQVdvMkFqZ2dDMEVCYWlFTElBa0VRQ0FFSUFscklnUkJBRXdFUUNBTklBVkJOR29nQ0VFQUlBUnJkaUFHY2hEbUF3MEdJQVJCSDNVZ0NDQUVRU0JxSWdSMGNTRUdEQU1MSUFnZ0JIUWdCbkloQmd3Q0N5QUlJQUlnQm14cUlRWWdCRUVCYXlJRURRRWdEU0FGUVRScUlBWVE1Z01oQnlBTUlRUkJBQ0VHSUFkRkRRRU1Bd3NMSUE4Z0N5QU9HeUVQQ3lBRUlBeEdEUUlnQ1NBRVJYSkZCRUFEUUNBQ0lBWnNJUVlnQkVFQmF5SUVEUUFMQ3lBTklBVkJOR29nQmhEbUEwVU5BaUFKRFFFTElBMFFHd3NnQ2hBMURBTUxJQTBvQWhCQkFDQUZLQUkwSWc1QkFuUkJCR29RS3hvZ0JTZ0NPQ0lJSUFGSERRRWdDUTBBSUEwUUd3c2dDaEExREFNTElBZ3RBQUFoQkFKQUFrQUNmd0ovQWtBZ0FrRUtSZ1JBSUFRaUIwRWdja0hsQUVZTkFVRUFJUXRCQUF3Q0MwSEFBQ0VISUFSQndBQkdEUUFnQ1VVRVFFRUFJUVlNQkFzZ0JDSUhRU0J5UWZBQVJnMEFRUUFoQmlBSkRBSUxRUUFoQzBFQUlBRWdDRThOQUJvZ0JTQUlRUUZxSWdZMkFqZ2dCMEhmQVhFaEFVRUJJUWNDUUFKQUFrQWdDQzBBQVVFcmF3NERBQUlCQWdzZ0JTQUlRUUpxSWdZMkFqZ01BUXNnQlNBSVFRSnFJZ1kyQWpoQkFDRUhDeUFCUWRBQVJpRUxRUUFoQkFOQUlBWXNBQUFRbGdFaUFVRUpUUVJBSUFSQnpKbXo1Z0JPQkVBZ0J3MElJQW9nRUJDSkFRd0pCU0FGSUFaQkFXb2lCallDT0NBQklBUkJDbXhxSVFRTUFnc0FDd3NnQkVFQUlBUnJJQWNiQ3lFR0lBbEZEUUZCQVNBSklBc2JDeUVFSUEwZ0VEWUNCQ0FOSUFRZ0Jtd2dDU0FQYkdvMkFnZ2dEVUgvLy8vL0EwRUJFTE1DSVFRTUFRc0NRQ0FOS0FJTUlnY2dEa0VCYWlJTFJnUkFJQW9nRUJDSkFVRUFJUVFNQVFzZ0NpZ0NBQ0VCSUFWQ0FEY0NHQ0FGUW9DQWdJQ0FnSUNBZ0g4M0FoQWdCU0FCTmdJTUlBMG9BaEFoRGlBQ0VKY0ZJUkZCQUNFRUFrQUNRQ0FCS0FJQVFRQkJBa0VpSUFjZ0Myc2lCMEVCYTJkcklBZEJBa2tiSWdoQkZHd2dBU2dDQkJFQkFDSUpCRUFnRGlBTFFRSjBhaUVPSUE4Z0J5QU1iR3NnQm1vaERBTkFJQVFnQ0VaRkJFQWdCU2dDRENFUElBa2dCRUVVYkdvaUMwSUFOd0lNSUF0Q2dJQ0FnSUNBZ0lDQWZ6Y0NCQ0FMSUE4MkFnQWdCRUVCYWlFRURBRUxDMEVBSVFRZ0JVRU1haUFPSUFkQkFDQUhJQkVnQ1JEbEF5RUhBMEFnQkNBSVJrVUVRQ0FKSUFSQkZHeHFFQnNnQkVFQmFpRUVEQUVMQ3lBQktBSUFJQWxCQUNBQktBSUVFUUVBR2lBSFJRMEJDeUFLRURWQklDRUVEQUVMSUFVZ0VEWUNFQ0FGS0FJWVJRUkFJQW9nQlVFTWFoQkVJUVFNQVFzZ0RFVUVRQ0FLSUFWQkRHb1FSQ0FLUWYvLy8vOERRUUVRemdGeUlRUU1BUXNnQ2lnQ0FDRUJJQVZDQURjQ1NDQUZRb0NBZ0lDQWdJQ0FnSDgzQWtBZ0JTQUJOZ0k4SUFWQlBHb2dBaUFNSUF4QkgzVWlBWE1nQVd0Qi8vLy8vd05CQUJEOEFpRUJBbjhnREVFQVNBUkFJQW9nQlVFTWFpQUZRVHhxSUFVb0FoaEJCWFJCQUJDVkFRd0JDeUFLSUFWQkRHb2dCVUU4YWtILy8vLy9BMEVBRUVNTElBRnlJUVFnQlVFOGFoQWJDeUFGUVF4cUVCc0xJQTBRR3dzZ0JFRWdjVVVOQWdzZ0FDQVNFQThnQUJCOERBSUxJQW9nRUJDTUFRc2dBQ0FTSUFOQkNYWkJBWEVRbGdVaEV3c2dCVUhRQUdva0FDQVRDOFVDQWdSL0FYNGpBRUVnYXlJSEpBQUNmd0pBQWtBQ1FDQUNRWTBCUncwQUlBQW9BaEFvQW93QklnUUVRQ0FFTFFBb1FRUnhEUUVMSUFCQjI1QUJRUUFRRlF3QkN5QUFFSmNCSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRklOQVFzZ0FDQURFQTlCZnd3QkN5QUlweUlGUVFScUlRWWdBQ0FIUVF4cUlBTVF1d0VoQkFKQUFrQUNRQUpBQWtBQ1FDQUNRWXdCYXc0S0FRQUVCQU1EQXdNREFnTUxJQVlnQkJCRUlRSU1CQXNnQmlBRUVFUWhBaUFGSUFVb0FnaEJBWE0yQWdnTUF3c2dCaUFFUWdGQi8vLy8vd05CQVJCMUlRSWdCU0FGS0FJSVFRRnpOZ0lJREFJTEVBRUFDeUFHSUFRZ0FrRUJkRUdkQW11c1FmLy8vLzhEUVFFUWRTRUNDeUFBSUFRZ0IwRU1haEJlSUFBZ0F4QVBJQUlFUUNBQUlBZ1FEeUFBSUFJUWhBSkJmd3dCQ3lBQklBQWdDQkROQVRjREFFRUFDeUVBSUFkQklHb2tBQ0FBQzdZSkFnWi9CSDRqQUVGQWFpSUdKQUJDZ0lDQWdPQUFJUXdDZndKQUFrQWdBQkNYQVNJTFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBQ1FDQUFJQVpCTEdvZ0F4QzdBU0lIUlEwQUlBQWdCa0VZYWlBRUVMc0JJZ2hGQkVBZ0FDQUhJQVpCTEdvUVhnd0JDeUFMcDBFRWFpRUpBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FVR2FBV3NPR1FFQ0JBMEFCUWdJREF3TURBd01EQXdNREF3SkN3b01EQU1NQ3lBSklBY2dDRUgvLy8vL0EwRUJFT1FCSVFVTURRc2dDU0FISUFoQi8vLy8vd05CQVJCRElRVU1EQXNnQUNnQ0VDZ0NqQUVpQlFSQUlBVXRBQ2hCQkhFTkJBc2dBQ2dDMkFFaEFTQUdRZ0EzQWd3Z0JrS0FnSUNBZ0lDQWdJQi9Od0lFSUFZZ0FUWUNBQ0FKSUFZZ0J5QUlRUUVRNUFNaEJTQUdFQnNNQ3dzZ0NTQUhJQWhCQmhDVkJVRUJjU0VGREFvTElBa2dCeUFJUVFFUWxRVkJBWEVoQlF3SkN5QUlLQUlFUlEwQlFRRWhCU0FBS0FJUUtBS01BU0lKUlEwSUlBa3RBQ2hCQkhGRkRRZ0xJQUFnQ3hBUEFrQUNmd0pBQWtBZ0FDQUFLQUlvS1FPSUFpSUxRZDBCSUF0QkFCQVVJZ3RDZ0lDQWdIQ0RJZ3hDZ0lDQWdEQlNCRUFnREVLQWdJQ0E0QUJSRFFJZ0FDQUxRU1VRU3lJRlJRMENJQVVnQVJEM0EwRUNkR29vQWdnaUJRMEJJQUFnQ3hBUEMwS0FnSUNBNEFBaERDQUFFTFlGSWd0Q2dJQ0FnSENEUW9DQWdJRGdBRklOQXlBQUlBY2dCa0VzYWhCZUlBQWdDQ0FHUVJocUVGNE1EZ3NnQUNBREVMa0NJZ3hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFRUXVRSWlEa0tBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQUFnREJBUERBRUxJQVVnQlNnQ0FFRUJhallDQUNBR0lBNDNBd2dnQmlBTU53TUFJQUFnQmExQ2dJQ0FnSENFUW9DQWdJQXdRUUlnQmhBdklRMGdBQ0FNRUE4Z0FDQU9FQTlCQUNBTlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFYUMwS0FnSUNBTUNFTlFRRUxJUUVnQUNBTEVBOGdBQ0FISUFaQkxHb1FYaUFBSUFnZ0JrRVlhaEJlSUFBZ0F4QVBJQUFnQkJBUFFYOGdBUTBOR2lBQ0lBMDNBd0FNQ1FzZ0M2ZEJCR29oQlNBQUtBTGdBU0VKSUFBb0F0d0JJUW9DZnlBQlFac0JSZ1JBSUFVZ0J5QUlJQW9nQ1JDVkFRd0JDeUFGSUFjZ0NDQUtJQWxCZ0lBRWNoQ1VCUXNoQVNBQUlBY2dCa0VzYWhCZUlBQWdDQ0FHUVJocUVGNGdBQ0FERUE4Z0FDQUVFQThnQVVFZ2NTSUJCRUFnQUNBTEVBOGdBQ0FCRUlRQ0RBd0xJQUlnQ3pjREFBd0lDeUFKSUFjZ0NFSC8vLy8vQTBHQmdBUVFsQVVoQlF3R0N5QUdJQWhCQUJDcEFTQUdLQUlBSVFVZ0NTQUhFRVFnQ1VFQVFZR0FnSUI0SUFVZ0JVR0JnSUNBZUV3YklnVnJJQVVnQVVHaEFVWWJJZ0ZCLy8vLy93TkJBUkRNQVhJaEJTQUJRUUJPRFFVZ0NVRUNFTkVCUVNSeElBVnlJUVVNQlFzZ0NTQUhJQWdRa3dVaEJRd0VDeUFKSUFjZ0NFRUFFT01ESVFVTUF3c2dDU0FISUFoQkFSRGpBeUVGREFJTEVBRUFDeUFKSUFjZ0NFSC8vLy8vQTBFQkVNc0JJUVVMSUFBZ0J5QUdRU3hxRUY0Z0FDQUlJQVpCR0dvUVhpQUFJQU1RRHlBQUlBUVFEeUFGQkVBZ0FDQUxFQThnQUNBRkVJUUNEQVFMSUFJZ0FDQUxFTTBCTndNQUMwRUFEQU1MSUFzaERBc2dBQ0FNRUE4Z0FDQURFQThnQUNBRUVBOExRWDhMSVFBZ0JrRkFheVFBSUFBTDRRRUJCSDhqQUVFd2F5SUVKQUJCZnlFSEFrQWdBQ0FFUVJ4cUlBSVF1d0lpQlVVTkFBSkFJQUFnQkVFSWFpQURFTHNDSWdaRkJFQWdCU0FFUVJ4cVJ3MEJJQVJCSEdvUUd3d0JDd0ovQWtBQ1FBSkFBa0FDUUFKQUlBRkJvd0ZyRGdjRkFBRUNCQVFEQkFzZ0JTQUdFSklGREFVTElBWWdCUkN5QWd3RUN5QUdJQVVRa2dVTUF3c2dCU0FHRUlJQ0RBSUxFQUVBQ3lBRklBWVFzZ0lMSVFjZ0JFRWNhaUFGUmdSQUlBUkJIR29RR3dzZ0JFRUlhaUFHUmdSQUlBUkJDR29RR3dzZ0FDQUNFQThNQVFzZ0FpRURDeUFBSUFNUUR5QUVRVEJxSkFBZ0J3c0xBQ0FBSUFGQkNoQ2FCUXV1QWdJRGZ3RitJd0JCSUdzaUJTUUFBa0FnQWFjaUJ5Z0NJQ0lHUlEwQUlBWW9BZ2dpQ0NnQ0JBMEFJQWhCQVRZQ0JDQUhMd0VHUVRKcklRY0NRQUpBSUFOQkFFd0VRRUtBZ0lDQU1DRUJEQUVMSUFjZ0JDa0RBQ0lCUW9DQWdJQndWSElOQUFKQUFrQWdBQ0FCSUFZcEF3QVFVZ1JBSUFCQjg4b0FRUUFRRlF3QkN5QUFJQUZCL3dBZ0FVRUFFQlFpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBCQ3lBQUtBSVFJZ01wQTRBQklRRWdBMEtBZ0lDQUlEY0RnQUVnQUNBR0tRTUFJQUZCQVJDS0JTQUFJQUVRRHd3REN5QUFJQUlRT0EwQklBQWdBaEFQQ3lBQUlBWXBBd0FnQVNBSEVJb0ZEQUVMSUFZcEF3QWhDU0FGSUFJM0F4QWdCU0FCTndNSUlBVWdDVGNEQUNBQVFUVkJBeUFGRUpvRElBQWdBaEFQQ3lBRlFTQnFKQUJDZ0lDQWdEQUwzd0VDQTM4Q2ZpQUFRZWdBRUY4aUJVVUVRRUtBZ0lDQTRBQVBDeUFGUVFFMkFnQWdBQ2dDRUNFR0lBVkJCRG9BQkNBR0tBSlFJZ2NnQlVFSWFpSUlOZ0lFSUFVZ0JrSFFBR28yQWd3Z0JTQUhOZ0lJSUFZZ0NEWUNVQ0FGUW9DQWdJQXdOd01ZSUFWQ2dJQ0FnREEzQXhBZ0JVRUFOZ0lnUW9DQWdJRGdBQ0VKQWtBQ1FDQUFJQVZCRUdvUXpRSWlDa0tBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQUFnQlVFb2FpQUJJQUlnQXlBRUVPMERSUTBCQ3lBQUlBb1FEd3dCQ3lBRlFRRTJBaUFnQUNBRkVJa0ZJQW9oQ1FzZ0FDZ0NFQ0FGRUlnRklBa0xtQUVCQVg4Z0FhY2lCUzhCQmtFMWF5RUdJQVVvQWlBaEJTQURRUUJNQkg1Q2dJQ0FnREFGSUFRcEF3QUxJUUVnQlNBR05nSTBJQUZDSUlpbklRTUNRQ0FHQkVBZ0EwRjFUd1JBSUFHbklnTWdBeWdDQUVFQmFqWUNBQXNnQUNBQkVJb0JEQUVMSUFOQmRVOEVRQ0FCcHlJRElBTW9BZ0JCQVdvMkFnQUxJQVVvQW1SQkNHc2dBVGNEQUFzZ0FDQUZFSWtGUW9DQWdJQXdDN29CQVFGL0lBQkIwQUFRWHlJRkJFQWdCVUVBTmdJRUlBVWdCVUhJQUdvaUJqWUNUQ0FGSUFZMkFrZ0NRQ0FBSUFWQkNHb2lCaUFCSUFJZ0F5QUVFTzBEQkVBZ0JVRUZOZ0lFREFFTElBQWdCaEMwQWlJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUNFQThnQUNBQlFUa1FaU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQlNBQnB5SUFOZ0lBSUFGQ2dJQ0FnSEJhQkVBZ0FDQUZOZ0lnQ3lBQkR3c2dBQ2dDRUNBRkVJY0ZDMEtBZ0lDQTRBQUxzZ01DQlg4RGZpTUFRUkJySWdRa0FBSkFBa0FnQXlrREFDSUxRb0NBZ0lCd1dnUkFJQXVuSWdjdkFRWkJFMnRCLy84RGNVRUNTUTBCQ3lBQVFSTVFoZ05DZ0lDQWdPQUFJUW9NQVF0Q2dJQ0FnT0FBSVFvZ0J5Z0NJQ0lGUlEwQUlBUkNBRGNEQ0NBQ1FRSk9CRUFnQUNBRVFRaHFJQU1wQXdnUXBnRU5BUXNnQlMwQUJBUkFJQUFRYXd3QkN5QUVLUU1JSWdrZ0JTZ0NBQ0lHckZZRVFDQUFRWWN1UVFBUVVBd0JDeUFHSUFtbklnaHJJUVlDUUNBQ1FRTklEUUFnQXlrREVDSUpRb0NBZ0lCd2cwS0FnSUNBTUZFTkFDQUFJQVFnQ1JDbUFRMEJJQVFwQXdBaUNTQUdyVllFUUNBQVFhSFpBRUVBRUZBTUFnc2dDYWNoQmdzZ0FDQUJRU0FRWlNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBQ1FBSkFJQVV0QUFRRVFDQUFFR3NNQVFzZ0FFRVlFQ2tpQWcwQkN5QUFJQUVRRHd3QkN5QUNJQUduSWdBMkFnZ2dDMElnaUtkQmRVOEVRQ0FISUFjb0FnQkJBV28yQWdBTElBSWdCallDRkNBQ0lBZzJBaEFnQWlBSE5nSU1JQVVvQWd3aUF5QUNOZ0lFSUFJZ0JVRU1hallDQkNBQ0lBTTJBZ0FnQlNBQ05nSU1JQUFnQWpZQ0lDQUJJUW9MSUFSQkVHb2tBQ0FLQ3hNQUlBQkJ5UG9BUVFBUUZVS0FnSUNBNEFBTFFnRUJmaU1BUVJCcklnSWtBRUtBZ0lDQTRBQWhCQ0FBSUFKQkNHb2dBeWtEQUJDbUFVVUVRQ0FBSUFFZ0Fpa0RDRUVVRU53RElRUUxJQUpCRUdva0FDQUVDMEFCQVg0akFFRVFheUlDSkFCQ2dJQ0FnT0FBSVFRZ0FDQUNRUWhxSUFNcEF3QVFwZ0ZGQkVBZ0FDQUJJQUlwQXdnUStRSWhCQXNnQWtFUWFpUUFJQVFMaEFZQ0EzOEhmaU1BUVNCcklnVWtBRUtBZ0lDQTRBQWhEUUpBSUFBZ0FTQUVRU1pxRUdVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQVFvQ0FnSUF3SVFvQ1FBSkFBa0FDUUNBQVFSd1FYeUlHUlEwQUlBWWdCRUVCZGtFQmNUWUNBQ0FHSUFaQkJHb2lCellDQ0NBR0lBYzJBZ1FnQVVLQWdJQ0FjRm9FUUNBQnB5QUdOZ0lnQ3lBR1FRRTJBaFFnQmlBQVFRZ1FLU0lITmdJUVFvQ0FnSUF3SVF0Q2dJQ0FnREFoQ0NBSFJRMENJQWNnQnpZQ0JDQUhJQWMyQWdBZ0JrRUVOZ0lZSUFKQkFFd05BeUFES1FNQUlnaENnSUNBZ0JDRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQXlBQUlBRkI2QUJCd2dBZ0JFRUJjU0lDR3lBQlFRQVFGQ0lLUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBS0VEZ05BU0FBUVpETUFFRUFFQlVMUW9DQWdJQXdJUXRDZ0lDQWdEQWhDQXdCQ3lBQUlBaEJBQkRuQVNJSVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBTUFRc0NRQ0FBSUFoQjZnQWdDRUVBRUJRaUMwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUFrQURRQ0FGSUFBZ0NDQUxJQVZCRkdvUXJnRWlDVGNER0NBSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJZ0JTZ0NGRVVFUUFKQUlBSUVRQ0FBSUFvZ0FVRUJJQVZCR0dvUUlTSU9Rb0NBZ0lCd2cwS0FnSUNBNEFCU0RRRWdBQ0FGS1FNWUVBOE1CUXNDUUFKQUlBbEMvLy8vLzI5WUJFQWdBQkFrUW9DQWdJQXdJUWtNQVFzZ0FDQUpRZ0FRVFNJSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTFFvQ0FnSUF3SVF3TUJBc2dBQ0FGS1FNWVFnRVFUU0lNUW9DQWdJQndnMEtBZ0lDQTRBQlJEUU1nQlNBTU53TUlJQVVnQ1RjREFDQUFJQW9nQVVFQ0lBVVFJU0lPUW9DQWdJQndnMEtBZ0lDQTRBQlJEUU1nQUNBSkVBOGdBQ0FNRUE4TElBQWdEaEFQSUFBZ0JTa0RHQkFQREFFTEN5QUFJQWtRRHlBQUlBc1FEeUFBSUFnUUR5QUFJQW9RRHd3REN5QUFJQVVwQXhnUUR5QUFJQWtRRHlBQUlBd1FEd3NnQ0VLQWdJQ0FjRlFOQUNBQUlBaEJBUkN0QVJvTElBQWdDeEFQSUFBZ0NCQVBJQUFnQ2hBUElBQWdBUkFQREFFTElBRWhEUXNnQlVFZ2FpUUFJQTBMMXdNQ0FYOERmaU1BUVNCcklnWWtBQUpBQWtBQ1FDQUZRUUZ4QkVCQ2dJQ0FnT0FBSVFjZ0FDQUdRUmhxSUFGQjNnQVFnUUVpQlVVTkF3SkFJQVVwQXdBaUFVS0FnSUNBY0ZvRVFDQUJweTBBQlVFUWNRMEJDeUFBUWFJK1FRQVFGUXdFQ3lBR0tRTVlJZ2hDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUFnQVNBQ0lBTWdCQkNRQXlFSERBUUxJQUFnQXlBRUVJa0RJZ2xDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BaUFGS1FNQUlRRWdCaUFDTndNUUlBWWdDVGNEQ0NBR0lBRTNBd0FnQUNBSUlBVXBBd2hCQXlBR0VDRWlBVUwvLy8vL2IxWU5BU0FCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQUNBQkVBOGdBQkFrREFJTFFvQ0FnSURnQUNFSElBQWdCa0VZYWlBQlFkb0FFSUVCSWdWRkRRSWdCaWtER0NFQklBVXRBQkJGQkVBZ0FDQUJFQThnQUVHYnpBQkJBQkFWREFNTElBRkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQWdCU2tEQUNBQ0lBTWdCQkFoSVFjTUF3c2dBQ0FESUFRUWlRTWlDRUtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQVVwQXdBaEJ5QUdJQWczQXhBZ0JpQUNOd01JSUFZZ0J6Y0RBQ0FBSUFFZ0JTa0RDRUVESUFZUUlTRUhDeUFBSUFFUUR5QUFJQWdRRHd3Q0N5QUJJUWNMSUFBZ0NCQVBJQUFnQ1JBUEN5QUdRU0JxSkFBZ0J3dUNCUUVEZmlBREtRTUlJUVlDUUNBQUlBTXBBd0FpQkJEUUF5SUNRUUJPQkVBQ1FDQUJRb0NBZ0lCd2cwS0FnSUNBTUZJTkFDQUFLQUlRS0FLTUFTa0RDQ0VCSUFKRklBWkNnSUNBZ0hDRFFvQ0FnSUF3VW5JTkFDQUFJQVJCUENBRVFRQVFGQ0lGUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQlE4TElBQWdCU0FCRUZJaEF5QUFJQVVRRHlBRFJRMEFJQVJDSUlpblFYVkpEUUlnQktjaUFDQUFLQUlBUVFGcU5nSUFEQUlMQWtBQ1FBSkFBa0FDUUNBRVFvQ0FnSUJ3VkEwQUlBU25JZ012QVFaQkVrY05BQ0FES0FJZ0lnSWdBaWdDQUVFQmFqWUNBQ0FDclVLQWdJQ0FrSCtFSVFVZ0JrS0FnSUNBY0lOQ2dJQ0FnREJTRFFFZ0F5Z0NKQ0lDSUFJb0FnQkJBV28yQWdBZ0FxMUNnSUNBZ0pCL2hDRUVEQU1MQWtBQ1FBSkFJQUlFUUNBQUlBUkI3QUFnQkVFQUVCUWlCVUtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFRb0NBZ0lBd0lRWU1DQXNnQmtLQWdJQ0FjSU5DZ0lDQWdEQlJCRUFnQUNBRVFlMEFJQVJCQUJBVUlnWkNnSUNBZ0hDRFFvQ0FnSURnQUZJTkJBd0lDeUFGSVFRZ0JrSWdpS2RCZEVzTkFRd0RDeUFFUWlDSXAwRjFUd1JBSUFTbklnSWdBaWdDQUVFQmFqWUNBQXNnQmtJZ2lLZEJkVWtOQVFzZ0JxY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBRUlRVUxJQVZDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUJCTHhBdElRVU1BZ3NnQUNBRkVDZ2hCQ0FBSUFVUUR5QUVJZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5Bd3dCQ3lBQUlBWVFLQ0lHUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlMSUFBZ0JTQUdFSmdFSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBWVFEd3NnQUNBQklBVWdCQkRlQlE4TElBQWdCUkFQSUFBZ0JoQVBDMEtBZ0lDQTRBQVBDeUFFQzZJT0FnZC9BWDRqQUVIZ0FHc2lCeVFBSUFkQkNHcEJBRUhRQUJBckdpQUhJQVEyQWhRZ0J5QUFOZ0lJSUFjZ0FpQURhaUlETmdKRUlBY2dBallDUUNBSFFRRTJBaEFnQjBLZ2dJQ0FFRGNER0FKQUlBSXRBQUJCSTBjTkFDQUNMUUFCUVNGSERRQWdCeUFDUVFKcUlnSTJBbHdEUUFKQUFrQUNRQ0FDSUFOUERRQUNRQ0FDTFFBQUlnaEJDbXNPQkFFQUFBRUFDeUFJd0VFQVRnMENJQUpCQmlBSFFkd0FhaEJZSWdoQmZuRkJxTUFBUncwQklBY29BbHdoQWdzZ0J5QUNOZ0pBREFNTElBY29BbHdoQWlBSVFYOUhEUUVMSUFjZ0FrRUJhaUlDTmdKY0RBQUxBQXNDUUFKQUFrQUNRQUpBQWtBQ2Z3SkFBa0FDUUFKQUFuOGdCVUVEY1NJS1FRSkdCRUFnQUNnQ0VDZ0NqQUVpQzBVTkJDQUxLUU1JSWc1Qy8vLy8vMjlZRFFNZ0RxY2lBaThCQmhEdUFVVU5BaUFDS0FJa0lReEJBQ0VJSUFJb0FpQWlBeTBBRUF3QkN5QUZRUU4ySVFJZ0NrRUJSd1JBUVFBaEEwRUFJUWdnQWtFRGNRd0JDMEtBZ0lDQTRBQWhEaUFBSUFRUXFnRWlBMFVOQ3lBQVFmQUFFRjhpQ0VVRVFDQUFJQU1RRXd3TUN5QUlRb0NBZ0lBd053Tm9JQWhDZ0lDQWdEQTNBMkFnQ0VLQWdJQ0FNRGNEU0NBSVFvQ0FnSUF3TndOQUlBZ2dBellDQkNBSVFRRTJBZ0FnQUNnQzlBRWlBeUFJUVFocUlnazJBZ1FnQ0NBQVFmUUJhallDRENBSUlBTTJBZ2dnQUNBSk5nTDBBVUVBSVFNZ0FrRUNjVUVCY2dzaENTQUFRUUJCQVVFQUlBUkJBUkRvQXlJQ1JRMEhJQWNnQWpZQ1NDQUNJQXBCQWtjaUJEWUNUQ0FDSUFvMkFpUWdBaUFGUVFaMlFRRnhOZ0pvQWtBZ0JFVUVRQ0FDSUFNdkFCRkJCblpCQVhFMkFsQWdBaUFETHdBUlFRZDJRUUZ4TmdKVUlBSWdBeTBBRWtFQmNUWUNXQ0FETHdBUklRUWdBa0hRQURZQ2NDQUNJQWs2QUc0Z0FpQUVRUWwyUVFGeE5nSmNEQUVMSUFKQjBBQTJBbkFnQWlBSk9nQnVJQUpDZ0lDQWdCQTNBbGdnQWtJQU53SlFJQUlnQTBVTkJSb0xJQU1vQWp3aEJDQURMd0VxSVFrZ0F5OEJLQ0VLSUFKQkFEWUN3QUlnQWtFQU5nTElBaUFDSUFRZ0NTQUthbW9pQ1RZQ3hBSWdBaUFKUlEwRUdpQUNJQUFnQ1VFRGRCQXBJZ1EyQXNnQ0lBUkZEUVVEUUNBR1FRQk9CRUFnQXlnQ0lDQUdJQU12QVNocVFRUjBhaUlFS0FJRVFRQktCRUFnQWlBQ0tBTEFBaUlKUVFGcU5nTEFBaUFBSUFJb0FzZ0NJQWxCQTNScUlBUWdCaERuQXdzZ0JDZ0NDQ0VHREFFTEMwRUFJUVFnQmtGK1JnUkFBMEFnQkNBREx3RXFUdzBGQWtBZ0F5Z0NJQ0FFSUFNdkFTaHFRUVIwYWlJR0tBSUVEUUFnQmhDZUJVVU5BQ0FDSUFJb0FzQUNJZ2xCQVdvMkFzQUNJQUFnQWlnQ3lBSWdDVUVEZEdvZ0JpQUVFT2NEQ3lBRVFRRnFJUVFNQUFzQUN3TkFJQU12QVNnZ0JFMEVRRUVBSVFRRFFDQUVJQU12QVNwUERRWUNRQ0FES0FJZ0lBUWdBeThCS0dwQkJIUnFJZ1lvQWdRTkFDQUdLQUlBUWRFQVJnMEFJQUlnQWlnQ3dBSWlDVUVCYWpZQ3dBSWdBQ0FDS0FMSUFpQUpRUU4wYWlBR0lBUVE1d01MSUFSQkFXb2hCQXdBQ3dBRklBSWdBaWdDd0FJaUJrRUJhallDd0FJZ0F5Z0NJQ0VKSUFJb0FzZ0NJQVpCQTNScUlnWWdCRHNCQWlBR1FRTTZBQUFnQmlBQUlBa2dCRUVFZEdvb0FnQVFHRFlDQkNBRVFRRnFJUVFNQVFzQUN3QUxRYkdTQVVHdS9BQkJ3SVlDUWU3V0FCQUFBQXRCNm9FQlFhNzhBRUcraGdKQjd0WUFFQUFBQzBHWGhBRkJydndBUWIyR0FrSHUxZ0FRQUFBTFFRQWhCZ05BSUFZZ0F5Z0NQRTVGQkVBZ0F5Z0NKQ0VKSUFJZ0FpZ0N3QUlpQkVFQmFqWUN3QUlnQWlnQ3lBSWdCRUVEZEdvaUJDQUVMUUFBSWdwQi9nRnhPZ0FBSUFRZ0NTQUdRUU4wYWlJSkxRQUFRUUp4SUFwQi9BRnhjaUlLT2dBQUlBUWdDa0g2QVhFZ0NTMEFBRUVFY1hJaUNqb0FBQ0FFSUFwQjlnRnhJQWt0QUFCQkNIRnlJZ282QUFBZ0NTMEFBQ0VOSUFRZ0Jqc0JBaUFFSUFwQkRuRWdEVUh3QVhGeU9nQUFJQVFnQUNBSktBSUVFQmcyQWdRZ0JrRUJhaUVHREFFTEN5QUhLQUpJQ3lFRUlBSWdDRFlDbEFNZ0J5QUlSVFlDVUNBSElBaEJBRWMyQWt3Z0IwRUlhaUlERUlBQkdpQUNJQUlvQXJ3Qk5nTHdBU0FERUJJTkFDQUhRUWhxRUowRkRRQkJBU0VESUFRZ0JDZ0NKRUVDVHdSL0lBUXRBRzVCQVhFRlFRQUxSVFlDS0NBSEtBSk1SUVJBSUFRZ0J5Z0NDQ0FFUWRFQUVFOGlBellDcEFFZ0EwRUFTQTBCQ3dOQUlBY29BaGhCckg5R0RRSWdCMEVJYWhDY0JVVU5BQXNMSUFkQkNHb2dCMEVZYWhEL0FTQUFJQUlRL1FJTUFRdEJLU0VESUFkQkNHb2dCeWdDVEFSL1FTa0ZJQWRCQ0dwQjJBQVFFQ0FIS0FKSVFZQUNhaUFFTHdHa0FSQXFRU2dMRUJBZ0FDQUNFSnNGSWc1Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBSUJFQWdDQ0FPTndOSUlBQWdDQkQrQTBFQVNBMENJQWdnQ0NnQ0FFRUJhallDQUNBSXJVS0FnSUNBVUlRaERnc2dCVUVnY1EwRElBQWdEaUFCSUF3Z0N4RElCU0VPREFNTElBaEZEUUVMSUFBZ0NCRG5CUXRDZ0lDQWdPQUFJUTRMSUFkQjRBQnFKQUFnRGd2YkJRTUZmd04rQVh3akFFRkFhaUlGSkFBQ1FBSjhBa0FDUUFKQUFrQUNRQ0FDUVFBZ0FVS0FnSUNBY0lNaUMwS0FnSUNBTUZJYklnSU9BZ0lBQVFzQ1FDQURLUU1BSWdsQ2dJQ0FnSEJVRFFBZ0NhY2lCQzhCQmtFS1J3MEFJQVFwQXlBaUNrSWdpS2NpQkVFQUlBUkJDMnBCRWtrYkRRQWdBQ0FGSUFvUVFnMEREQVFMSUFVZ0FDQUpRUUlRa0FJaUNUY0RPQ0FKUW9DQWdJQndnMEtBZ0lDQWtIOVJCRUFnQUNBQklBUWdCVUU0YWhEUkJDRUtJQUFnQ1JBUElBcENnSUNBZ0hDRFFvQ0FnSURnQUZFTkF5QUFJQVVnQ2hCdVJRMEVEQU1MSUFBZ0JTQUpFRzVGRFFNTUFnc2dCVUVBUVRnUUt5SUdRb0NBZ0lDQWdJRDRQemNERUVFSElBSWdBa0VIVGhzaUIwRUFJQWRCQUVvYklRSURRQUpBSUFJZ0JFY0VRQ0FBSUFaQk9Hb2dBeUFFUVFOMElnaHFLUU1BRUVJTkJDQUdLd000SWd5OVFvQ0FnSUNBZ0lENC93Q0RRb0NBZ0lDQWdJRDQvd0JTRFFFZ0JDRUNDMFFBQUFBQUFBRDRmeUFDSUFkSERRVWFJQVpCQVJEZ0Fnd0ZDeUFHSUFocUlBeWRPUU1BQWtBZ0JBMEFJQVlyQXdBaURFUUFBQUFBQUFBQUFHWkZJQXhFQUFBQUFBQUFXVUJqUlhJTkFDQUdJQXhFQUFBQUFBQ3duVUNnT1FNQUN5QUVRUUZxSVFRTUFBc0FDeERRQkxrTUFndENnSUNBZ09BQUlRRU1BZ3NnQlNzREFDSU1uVVFBQUFBQUFBQUFBS0JFQUFBQUFBQUErSDhnREVRQUFOekNDTEkrUTJVYlJBQUFBQUFBQVBoL0lBeEVBQURjd2dpeVBzTm1Hd3NoREFKQUlBQWdBVUVLRUdVaUNVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdDUUorSUF5OUlnRUNmeUFNbVVRQUFBQUFBQURnUVdNRVFDQU1xZ3dCQzBHQWdJQ0FlQXNpQkxlOVVRUkFJQVN0REFFTFFvQ0FnSURBZmlBQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeERiQVNBTFFvQ0FnSUF3VWcwQUlBQWdDU0FFSUFSQkV4RFBCQ0VCSUFBZ0NSQVBEQUVMSUFraEFRc2dCVUZBYXlRQUlBRUxxQUVCQlg4Z0FDZ0NWQ0lES0FJQUlRVWdBeWdDQkNJRUlBQW9BaFFnQUNnQ0hDSUhheUlHSUFRZ0Jra2JJZ1lFUUNBRklBY2dCaEFmR2lBRElBTW9BZ0FnQm1vaUJUWUNBQ0FESUFNb0FnUWdCbXNpQkRZQ0JBc2dCQ0FDSUFJZ0JFc2JJZ1FFUUNBRklBRWdCQkFmR2lBRElBTW9BZ0FnQkdvaUJUWUNBQ0FESUFNb0FnUWdCR3MyQWdRTElBVkJBRG9BQUNBQUlBQW9BaXdpQVRZQ0hDQUFJQUUyQWhRZ0Fnc3BBQ0FCSUFFb0FnQkJCMnBCZUhFaUFVRVFhallDQUNBQUlBRXBBd0FnQVNrRENCQy9CVGtEQUF1VEdBTVNmd0Y4QTM0akFFR3dCR3NpRENRQUlBeEJBRFlDTEFKQUlBRzlJaGxDQUZNRVFFRUJJUkZCdGlFaEV5QUJtaUlCdlNFWkRBRUxJQVJCZ0JCeEJFQkJBU0VSUWJraElSTU1BUXRCdkNGQnR5RWdCRUVCY1NJUkd5RVRJQkZGSVJVTEFrQWdHVUtBZ0lDQWdJQ0ErUDhBZzBLQWdJQ0FnSUNBK1A4QVVRUkFJQUJCSUNBQ0lCRkJBMm9pQXlBRVFmLy9lM0VRWXlBQUlCTWdFUkJiSUFCQjRORUFRWlNEQVNBRlFTQnhJZ1ViUWF6ZEFFR0JoZ0VnQlJzZ0FTQUJZaHRCQXhCYklBQkJJQ0FDSUFNZ0JFR0F3QUJ6RUdNZ0F5QUNJQUlnQTBnYklRa01BUXNnREVFUWFpRVNBa0FDZndKQUlBRWdERUVzYWhDRkJpSUJJQUdnSWdGRUFBQUFBQUFBQUFCaUJFQWdEQ0FNS0FJc0lnWkJBV3MyQWl3Z0JVRWdjaUlPUWVFQVJ3MEJEQU1MSUFWQklISWlEa0hoQUVZTkFpQU1LQUlzSVFwQkJpQURJQU5CQUVnYkRBRUxJQXdnQmtFZGF5SUtOZ0lzSUFGRUFBQUFBQUFBc0VHaUlRRkJCaUFESUFOQkFFZ2JDeUVMSUF4Qk1HcEJvQUpCQUNBS1FRQk9HMm9pRFNFSEEwQWdCd0ovSUFGRUFBQUFBQUFBOEVGaklBRkVBQUFBQUFBQUFBQm1jUVJBSUFHckRBRUxRUUFMSWdNMkFnQWdCMEVFYWlFSElBRWdBN2loUkFBQUFBQmx6YzFCb2lJQlJBQUFBQUFBQUFBQVlnMEFDd0pBSUFwQkFFd0VRQ0FLSVFNZ0J5RUdJQTBoQ0F3QkN5QU5JUWdnQ2lFREEwQkJIU0FESUFOQkhVNGJJUU1DUUNBSFFRUnJJZ1lnQ0VrTkFDQURyU0VhUWdBaEdRTkFJQVlnR1VMLy8vLy9ENE1nQmpVQ0FDQWFobndpRzBLQWxPdmNBNEFpR1VLQTdKU2pESDRnRzN3K0FnQWdCa0VFYXlJR0lBaFBEUUFMSUJtbklnWkZEUUFnQ0VFRWF5SUlJQVkyQWdBTEEwQWdDQ0FISWdaSkJFQWdCa0VFYXlJSEtBSUFSUTBCQ3dzZ0RDQU1LQUlzSUFOcklnTTJBaXdnQmlFSElBTkJBRW9OQUFzTElBTkJBRWdFUUNBTFFSbHFRUWx1UVFGcUlROGdEa0htQUVZaEVBTkFRUWxCQUNBRGF5SURJQU5CQ1U0YklRa0NRQ0FHSUFoTkJFQWdDQ2dDQUNFSERBRUxRWUNVNjl3RElBbDJJUlJCZnlBSmRFRi9jeUVXUVFBaEF5QUlJUWNEUUNBSElBTWdCeWdDQUNJWElBbDJhallDQUNBV0lCZHhJQlJzSVFNZ0IwRUVhaUlISUFaSkRRQUxJQWdvQWdBaEJ5QURSUTBBSUFZZ0F6WUNBQ0FHUVFScUlRWUxJQXdnRENnQ0xDQUphaUlETmdJc0lBMGdDQ0FIUlVFQ2RHb2lDQ0FRR3lJSElBOUJBblJxSUFZZ0JpQUhhMEVDZFNBUFNoc2hCaUFEUVFCSURRQUxDMEVBSVFNQ1FDQUdJQWhORFFBZ0RTQUlhMEVDZFVFSmJDRURRUW9oQnlBSUtBSUFJZ2xCQ2trTkFBTkFJQU5CQVdvaEF5QUpJQWRCQ213aUIwOE5BQXNMSUFzZ0EwRUFJQTVCNWdCSEcyc2dEa0huQUVZZ0MwRUFSM0ZySWdjZ0JpQU5hMEVDZFVFSmJFRUphMGdFUUVFRVFhUUNJQXBCQUVnYklBeHFJQWRCZ01nQWFpSUpRUWx0SWc5QkFuUnFRZEFmYXlFS1FRb2hCeUFQUVhkc0lBbHFJZ2xCQjB3RVFBTkFJQWRCQ213aEJ5QUpRUUZxSWdsQkNFY05BQXNMQWtBZ0NpZ0NBQ0lRSUJBZ0IyNGlEeUFIYkNJSlJpQUtRUVJxSWhRZ0JrWnhEUUFnRUNBSmF5RVFBa0FnRDBFQmNVVUVRRVFBQUFBQUFBQkFReUVCSUFkQmdKVHIzQU5ISUFnZ0NrOXlEUUVnQ2tFRWF5MEFBRUVCY1VVTkFRdEVBUUFBQUFBQVFFTWhBUXRFQUFBQUFBQUE0RDlFQUFBQUFBQUE4RDlFQUFBQUFBQUErRDhnQmlBVVJodEVBQUFBQUFBQStEOGdFQ0FIUVFGMkloUkdHeUFRSUJSSkd5RVlBa0FnRlEwQUlCTXRBQUJCTFVjTkFDQVltaUVZSUFHYUlRRUxJQW9nQ1RZQ0FDQUJJQmlnSUFGaERRQWdDaUFISUFscUlnTTJBZ0FnQTBHQWxPdmNBMDhFUUFOQUlBcEJBRFlDQUNBSUlBcEJCR3NpQ2tzRVFDQUlRUVJySWdoQkFEWUNBQXNnQ2lBS0tBSUFRUUZxSWdNMkFnQWdBMEgvayt2Y0Ewc05BQXNMSUEwZ0NHdEJBblZCQ1d3aEEwRUtJUWNnQ0NnQ0FDSUpRUXBKRFFBRFFDQURRUUZxSVFNZ0NTQUhRUXBzSWdkUERRQUxDeUFLUVFScUlnY2dCaUFHSUFkTEd5RUdDd05BSUFZaUJ5QUlUU0lKUlFSQUlBZEJCR3NpQmlnQ0FFVU5BUXNMQWtBZ0RrSG5BRWNFUUNBRVFRaHhJUW9NQVFzZ0EwRi9jMEYvSUF0QkFTQUxHeUlHSUFOS0lBTkJlMHB4SWdvYklBWnFJUXRCZjBGK0lBb2JJQVZxSVFVZ0JFRUljU0lLRFFCQmR5RUdBa0FnQ1EwQUlBZEJCR3NvQWdBaURrVU5BRUVLSVFsQkFDRUdJQTVCQ25BTkFBTkFJQVlpQ2tFQmFpRUdJQTRnQ1VFS2JDSUpjRVVOQUFzZ0NrRi9jeUVHQ3lBSElBMXJRUUoxUVFsc0lRa2dCVUZmY1VIR0FFWUVRRUVBSVFvZ0N5QUdJQWxxUVFscklnWkJBQ0FHUVFCS0d5SUdJQVlnQzBvYklRc01BUXRCQUNFS0lBc2dBeUFKYWlBR2FrRUpheUlHUVFBZ0JrRUFTaHNpQmlBR0lBdEtHeUVMQzBGL0lRa2dDMEg5Ly8vL0IwSCsvLy8vQnlBS0lBdHlJaEFiU2cwQklBc2dFRUVBUjJwQkFXb2hEZ0pBSUFWQlgzRWlGVUhHQUVZRVFDQURJQTVCLy8vLy93ZHpTZzBESUFOQkFDQURRUUJLR3lFR0RBRUxJQklnQXlBRFFSOTFJZ1p6SUFacnJTQVNFSlVDSWdaclFRRk1CRUFEUUNBR1FRRnJJZ1pCTURvQUFDQVNJQVpyUVFKSURRQUxDeUFHUVFKcklnOGdCVG9BQUNBR1FRRnJRUzFCS3lBRFFRQklHem9BQUNBU0lBOXJJZ1lnRGtILy8vLy9CM05LRFFJTElBWWdEbW9pQXlBUlFmLy8vLzhIYzBvTkFTQUFRU0FnQWlBRElCRnFJZ1VnQkJCaklBQWdFeUFSRUZzZ0FFRXdJQUlnQlNBRVFZQ0FCSE1RWXdKQUFrQUNRQ0FWUWNZQVJnUkFJQXhCRUdvaUJrRUljaUVESUFaQkNYSWhDaUFOSUFnZ0NDQU5TeHNpQ1NFSUEwQWdDRFVDQUNBS0VKVUNJUVlDUUNBSUlBbEhCRUFnQmlBTVFSQnFUUTBCQTBBZ0JrRUJheUlHUVRBNkFBQWdCaUFNUVJCcVN3MEFDd3dCQ3lBR0lBcEhEUUFnREVFd09nQVlJQU1oQmdzZ0FDQUdJQW9nQm1zUVd5QUlRUVJxSWdnZ0RVME5BQXNnRUFSQUlBQkIyWkFCUVFFUVd3c2dDMEVBVENBSElBaE5jZzBCQTBBZ0NEVUNBQ0FLRUpVQ0lnWWdERUVRYWtzRVFBTkFJQVpCQVdzaUJrRXdPZ0FBSUFZZ0RFRVFha3NOQUFzTElBQWdCa0VKSUFzZ0MwRUpUaHNRV3lBTFFRbHJJUVlnQ0VFRWFpSUlJQWRQRFFNZ0MwRUpTaUVESUFZaEN5QUREUUFMREFJTEFrQWdDMEVBU0EwQUlBY2dDRUVFYWlBSElBaExHeUVKSUF4QkVHb2lCa0VJY2lFRElBWkJDWEloRFNBSUlRY0RRQ0FOSUFjMUFnQWdEUkNWQWlJR1JnUkFJQXhCTURvQUdDQURJUVlMQWtBZ0J5QUlSd1JBSUFZZ0RFRVFhazBOQVFOQUlBWkJBV3NpQmtFd09nQUFJQVlnREVFUWFrc05BQXNNQVFzZ0FDQUdRUUVRV3lBR1FRRnFJUVlnQ2lBTGNrVU5BQ0FBUWRtUUFVRUJFRnNMSUFBZ0JpQUxJQTBnQm1zaUJpQUdJQXRLR3hCYklBc2dCbXNoQ3lBSFFRUnFJZ2NnQ1U4TkFTQUxRUUJPRFFBTEN5QUFRVEFnQzBFU2FrRVNRUUFRWXlBQUlBOGdFaUFQYXhCYkRBSUxJQXNoQmdzZ0FFRXdJQVpCQ1dwQkNVRUFFR01MSUFCQklDQUNJQVVnQkVHQXdBQnpFR01nQlNBQ0lBSWdCVWdiSVFrTUFRc2dFeUFGUVJwMFFSOTFRUWx4YWlFSUFrQWdBMEVMU3cwQVFRd2dBMnNoQmtRQUFBQUFBQUF3UUNFWUEwQWdHRVFBQUFBQUFBQXdRS0loR0NBR1FRRnJJZ1lOQUFzZ0NDMEFBRUV0UmdSQUlCZ2dBWm9nR0tHZ21pRUJEQUVMSUFFZ0dLQWdHS0VoQVFzZ0VVRUNjaUVMSUFWQklIRWhEU0FTSUF3b0Fpd2lCeUFIUVI5MUlnWnpJQVpyclNBU0VKVUNJZ1pHQkVBZ0RFRXdPZ0FQSUF4QkQyb2hCZ3NnQmtFQ2F5SUtJQVZCRDJvNkFBQWdCa0VCYTBFdFFTc2dCMEVBU0JzNkFBQWdCRUVJY1NFR0lBeEJFR29oQndOQUlBY2lCUUovSUFHWlJBQUFBQUFBQU9CQll3UkFJQUdxREFFTFFZQ0FnSUI0Q3lJSFFiREZCR290QUFBZ0RYSTZBQUFnQmlBRFFRQktja1VnQVNBSHQ2RkVBQUFBQUFBQU1FQ2lJZ0ZFQUFBQUFBQUFBQUJoY1NBRlFRRnFJZ2NnREVFUWFtdEJBVWR5UlFSQUlBVkJMam9BQVNBRlFRSnFJUWNMSUFGRUFBQUFBQUFBQUFCaURRQUxRWDhoQ1VIOS8vLy9CeUFMSUJJZ0Ntc2lCbW9pRFdzZ0EwZ05BQ0FBUVNBZ0FpQU5JQU5CQW1vZ0J5QU1RUkJxSWdkcklnVWdCVUVDYXlBRFNCc2dCU0FER3lJSmFpSURJQVFRWXlBQUlBZ2dDeEJiSUFCQk1DQUNJQU1nQkVHQWdBUnpFR01nQUNBSElBVVFXeUFBUVRBZ0NTQUZhMEVBUVFBUVl5QUFJQW9nQmhCYklBQkJJQ0FDSUFNZ0JFR0F3QUJ6RUdNZ0F5QUNJQUlnQTBnYklRa0xJQXhCc0FScUpBQWdDUXNXQUNBQUlBQXBBOEFCSUFNcEF3QkJBMEYvRUp3REN3VUFJQUNkQzk0QkF3RjhBWDhCZmlBQW1TRUJBa0FnQUwwaUEwS0FnSUNBOFAvLy8vOEFnMElnaUtjaUFrSHJwNGIvQTA4RVFDQUNRWUdBMElFRVR3UkFSQUFBQUFBQUFBQ0FJQUdqUkFBQUFBQUFBUEEvb0NFQkRBSUxSQUFBQUFBQUFQQS9SQUFBQUFBQUFBQkFJQUVnQWFBUWx3SkVBQUFBQUFBQUFFQ2dvNkVoQVF3QkN5QUNRYSt4d2Y0RFR3UkFJQUVnQWFBUWx3SWlBQ0FBUkFBQUFBQUFBQUJBb0tNaEFRd0JDeUFDUVlDQXdBQkpEUUFnQVVRQUFBQUFBQUFBd0tJUWx3SWlBSm9nQUVRQUFBQUFBQUFBUUtDaklRRUxJQUdhSUFFZ0EwSUFVeHNMaEFFQkFuOGpBRUVRYXlJQkpBQUNRQ0FBdlVJZ2lLZEIvLy8vL3dkeElnSkIrOE9rL3dOTkJFQWdBa0dBZ0lEeUEwa05BU0FBUkFBQUFBQUFBQUFBUVFBUWhnWWhBQXdCQ3lBQ1FZQ0F3UDhIVHdSQUlBQWdBS0VoQUF3QkN5QUFJQUVRbkFRaEFpQUJLd01BSUFFckF3Z2dBa0VCY1JDR0JpRUFDeUFCUVJCcUpBQWdBQXZtQXdNR2ZBRitBMzhDUUFKQUFrQUNRQ0FBdlNJSFFnQlpCRUFnQjBJZ2lLY2lDRUgvL3o5TERRRUxJQWRDLy8vLy8vLy8vLy8vQUlOUUJFQkVBQUFBQUFBQThMOGdBQ0FBb3FNUEN5QUhRZ0JaRFFFZ0FDQUFvVVFBQUFBQUFBQUFBS01QQ3lBSVFmLy92LzhIU3cwQ1FZQ0F3UDhESVFsQmdYZ2hDaUFJUVlDQXdQOERSd1JBSUFnaENRd0NDeUFIcHcwQlJBQUFBQUFBQUFBQUR3c2dBRVFBQUFBQUFBQlFRNks5SWdkQ0lJaW5JUWxCeTNjaENnc2dDaUFKUWVLK0pXb2lDRUVVZG1xM0lnVkVBR0NmVUJORTB6K2lJZ0VnQjBMLy8vLy9ENE1nQ0VILy96OXhRWjdCbXY4RGFxMUNJSWFFdjBRQUFBQUFBQUR3djZBaUFDQUFJQUJFQUFBQUFBQUE0RCtpb2lJRG9iMUNnSUNBZ0hDRHZ5SUVSQUFBSUJWN3k5cy9vaUlDb0NJR0lBSWdBU0FHb2FBZ0FDQUFSQUFBQUFBQUFBQkFvS01pQVNBRElBRWdBYUlpQWlBQ29pSUJJQUVnQVVTZnhualFDWnJEUDZKRXIzaU9IY1Z4ekQrZ29rUUUrcGVabVpuWlA2Q2lJQUlnQVNBQklBRkVSRkkrM3hMeHdqK2lSTjREeTVaa1JzYy9vS0pFV1pNaWxDUkowaitnb2tTVFZWVlZWVlhsUDZDaW9LQ2lJQUFnQktFZ0E2R2dJZ0JFQUFBZ0ZYdkwyeitpSUFWRU5pdnhFZlArV1QyaUlBQWdCS0JFMWEyYXlqaVV1ejJpb0tDZ29DRUFDeUFBQ3dRQVFnQUxtUUVDQW53QmYwUUFBQUFBQUFEZ1B5QUFwaUVDSUFDWklRRUNRQ0FBdlVLQWdJQ0E4UC8vLy84QWcwSWdpS2NpQTBIQjNKaUVCRTBFUUNBQkVKY0NJUUVnQTBILy83Ly9BMDBFUUNBRFFZQ0F3UElEU1EwQ0lBSWdBU0FCb0NBQklBR2lJQUZFQUFBQUFBQUE4RCtnbzZHaUR3c2dBaUFCSUFFZ0FVUUFBQUFBQUFEd1A2Q2pvS0lQQ3lBQklBSWdBcUFRalFZaEFBc2dBQXZMQVFFQ2Z5TUFRUkJySWdFa0FBSkFJQUM5UWlDSXAwSC8vLy8vQjNFaUFrSDd3NlQvQTAwRVFDQUNRWUNBd1BJRFNRMEJJQUJFQUFBQUFBQUFBQUJCQUJEUEFpRUFEQUVMSUFKQmdJREEvd2RQQkVBZ0FDQUFvU0VBREFFTEFrQUNRQUpBQWtBZ0FDQUJFSndFUVFOeERnTUFBUUlEQ3lBQkt3TUFJQUVyQXdoQkFSRFBBaUVBREFNTElBRXJBd0FnQVNzRENCRFFBaUVBREFJTElBRXJBd0FnQVNzRENFRUJFTThDbWlFQURBRUxJQUVyQXdBZ0FTc0RDQkRRQXBvaEFBc2dBVUVRYWlRQUlBQUxvUUVCQkg4Z0FpQUFLQUpVSWdNb0FnUWlCQ0FES0FJQUlnVnJJZ1pCQUNBRUlBWlBHeUlFU3dSQUlBQWdBQ2dDQUVFUWNqWUNBQ0FFSVFJTElBRWdBeWdDRENBRmFpQUNFQjhhSUFNZ0F5Z0NBQ0FDYWlJRk5nSUFJQUFnQUNnQ0xDSUJOZ0lFSUFBZ0FTQUVJQUpySWdRZ0FDZ0NNQ0lBSUFBZ0JFc2JJZ0JxTmdJSUlBRWdBeWdDRENBRmFpQUFFQjhhSUFNZ0F5Z0NBQ0FBYWpZQ0FDQUNDNHNCQVFGL0l3QkJFR3NpQXlRQUFuNENRQ0FDUVFOUERRQWdBQ2dDVkNFQUlBTkJBRFlDQkNBRElBQW9BZ0EyQWdnZ0F5QUFLQUlFTmdJTVFRQWdBMEVFYWlBQ1FRSjBhaWdDQUNJQ2E2d2dBVlVOQUNBQUtBSUlJQUpyckNBQlV3MEFJQUFnQWlBQnAyb2lBRFlDQUNBQXJRd0JDMEdnMUFSQkhEWUNBRUovQ3lFQklBTkJFR29rQUNBQkM2SUJBZ0Y4QVg4Z0FKa2hBUUo4SUFDOVFvQ0FnSUR3Ly8vLy93Q0RRaUNJcHlJQ1FjSGNtUDhEVFFSQVJBQUFBQUFBQVBBL0lBSkJnSURBOGdOSkRRRWFJQUVRbHdJaUFDQUFvaUFBUkFBQUFBQUFBUEEvb0NJQUlBQ2dvMFFBQUFBQUFBRHdQNkFQQ3lBQ1FjSGNtSVFFVFFSQUlBRVE2d01pQUVRQUFBQUFBQUR3UHlBQW82QkVBQUFBQUFBQTREK2lEd3NnQVVRQUFBQUFBQUR3UHhDTkJnc0x4d0VCQW44akFFRVFheUlCSkFBQ2ZDQUF2VUlnaUtkQi8vLy8vd2R4SWdKQis4T2svd05OQkVCRUFBQUFBQUFBOEQ4Z0FrR2V3WnJ5QTBrTkFSb2dBRVFBQUFBQUFBQUFBQkRRQWd3QkN5QUFJQUNoSUFKQmdJREEvd2RQRFFBYUFrQUNRQUpBQWtBZ0FDQUJFSndFUVFOeERnTUFBUUlEQ3lBQkt3TUFJQUVyQXdnUTBBSU1Bd3NnQVNzREFDQUJLd01JUVFFUXp3S2FEQUlMSUFFckF3QWdBU3NEQ0JEUUFwb01BUXNnQVNzREFDQUJLd01JUVFFUXp3SUxJUUFnQVVFUWFpUUFJQUFMQlFBZ0FKd0xCUUFnQUpzTGd3SURBbndDZndGK0lBQzlJZ1ZDSUlpblFmLy8vLzhIY1NJRFFZQ0F3UDhIVHdSQUlBQWdBS0FQQzBHVDhmM1VBaUVFQWtBZ0EwSC8vejlOQkVCQmsvSDl5d0loQkNBQVJBQUFBQUFBQUZCRG9yMGlCVUlnaUtkQi8vLy8vd2R4SWdORkRRRUxJQVZDZ0lDQWdJQ0FnSUNBZjRNZ0EwRURiaUFFYXExQ0lJYUV2eUlDSUFLaUlBSWdBS09pSWdFZ0FTQUJvcUlnQVVUWDdlVFVBTERDUDZKRTJWSG52c3RFNkwrZ29pQUJJQUZFd3RaSlNtRHgrVCtpUkNBazhKTGdLUDYvb0tKRWt1WmhEK1lEL2orZ29DQUNvcjFDZ0lDQWdIeURRb0NBZ0lBSWZMOGlBU0FBSUFFZ0FhS2pJZ0FnQWFFZ0FTQUJvQ0FBb0tPaUlBR2dJUUFMSUFBTGV3TUJmQUYrQVg4Z0FKa2hBUUpBQW53Z0FMMGlBa0kwaUtkQi93OXhJZ05CL1FkTkJFQWdBMEhmQjBrTkFpQUJJQUdnSWdBZ0FDQUJva1FBQUFBQUFBRHdQeUFCb2FPZ0RBRUxJQUZFQUFBQUFBQUE4RDhnQWFHaklnQWdBS0FMRUtjRFJBQUFBQUFBQU9BL29pRUJDeUFCbWlBQklBSkNBRk1iQzZnREFnVi9BWDRnQUwxQy8vLy8vLy8vLy8vL0FJTkNnWUNBZ0lDQWdQai9BRlFnQWIxQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRmh4UlFSQUlBQWdBYUFQQ3lBQnZTSUhRaUNJcHlJQ1FZQ0F3UDhEYXlBSHB5SUZja1VFUUNBQUVKMEVEd3NnQWtFZWRrRUNjU0lHSUFDOUlnZENQNGluY2lFREFrQWdCMElnaUtkQi8vLy8vd2R4SWdRZ0I2ZHlSUVJBQWtBQ1FDQURRUUpyRGdJQUFRTUxSQmd0UkZUN0lRbEFEd3RFR0MxRVZQc2hDY0FQQ3lBQ1FmLy8vLzhIY1NJQ0lBVnlSUVJBUkJndFJGVDdJZmsvSUFDbUR3c0NRQ0FDUVlDQXdQOEhSZ1JBSUFSQmdJREEvd2RIRFFFZ0EwRURkRUhRcWdScUt3TUFEd3NnQkVHQWdNRC9CMGNnQWtHQWdJQWdhaUFFVDNGRkJFQkVHQzFFVlBzaCtUOGdBS1lQQ3dKOElBWUVRRVFBQUFBQUFBQUFBQ0FFUVlDQWdDQnFJQUpKRFFFYUN5QUFJQUdqbVJDZEJBc2hBQUpBQWtBQ1FDQUREZ01FQUFFQ0N5QUFtZzhMUkJndFJGVDdJUWxBSUFCRUIxd1VNeWFtb2J5Z29ROExJQUJFQjF3VU15YW1vYnlnUkJndFJGVDdJUW5Bb0E4TElBTkJBM1JCOEtvRWFpc0RBQ0VBQ3lBQUM2WUJBd0Y4QVg4QmZpQUFtU0VCQWtBZ0FMMGlBMEkwaUtkQi93OXhJZ0pCbVFoUEJFQWdBUkRNQWtUdk9mcitRaTdtUDZBaEFRd0JDeUFDUVlBSVR3UkFJQUVnQWFCRUFBQUFBQUFBOEQ4Z0FTQUJva1FBQUFBQUFBRHdQNkNmSUFHZ282QVF6QUloQVF3QkN5QUNRZVVIU1EwQUlBRWdBYUlpQUNBQVJBQUFBQUFBQVBBL29KOUVBQUFBQUFBQThEK2dveUFCb0JDbkF5RUJDeUFCbWlBQklBTkNBRk1iQ3dVQUlBQ1pDN2tDQXdGL0Ezd0JmaUFBdlNJRlFpQ0lwMEgvLy8vL0IzRWlBVUdBZ01EL0EwOEVRQ0FGcHlBQlFZQ0F3UDhEYTNKRkJFQWdBRVFZTFVSVSt5SDVQNkpFQUFBQUFBQUFjRGlnRHd0RUFBQUFBQUFBQUFBZ0FDQUFvYU1QQ3dKQUlBRkIvLy8vL2dOTkJFQWdBVUdBZ0VCcVFZQ0FnUElEU1EwQklBQWdBQ0FBb2hEU0FxSWdBS0FQQzBRQUFBQUFBQUR3UHlBQW1hRkVBQUFBQUFBQTREK2lJZ09mSVFBZ0F4RFNBaUVFQW53Z0FVR3o1cnovQTA4RVFFUVlMVVJVK3lINVB5QUFJQVNpSUFDZ0lnQWdBS0JFQjF3VU15YW1rYnlnb1F3QkMwUVlMVVJVK3lIcFB5QUF2VUtBZ0lDQWNJTy9JZ0lnQXFDaElBQWdBS0FnQktKRUIxd1VNeWFta1R3Z0F5QUNJQUtpb1NBQUlBS2dveUlBSUFDZ29hR2hSQmd0UkZUN0llay9vQXNpQUpvZ0FDQUZRZ0JUR3lFQUN5QUFDM1lCQVg4Z0FMMUNOSWluUWY4UGNTSUJRZjhIVFFSQUlBQkVBQUFBQUFBQThMK2dJZ0FnQUNBQW9pQUFJQUNnb0orZ0VLY0REd3NnQVVHWUNFMEVRQ0FBSUFDZ1JBQUFBQUFBQVBDL0lBQWdBS0pFQUFBQUFBQUE4TCtnbnlBQW9LT2dFTXdDRHdzZ0FCRE1Ba1R2T2ZyK1FpN21QNkFMQlFBZ0FKOExyZ0lEQVh3QmZnRi9JQUM5SWdKQ0lJaW5RZi8vLy84SGNTSURRWUNBd1A4RFR3UkFJQUtuSUFOQmdJREEvd05yY2tVRVFFUUFBQUFBQUFBQUFFUVlMVVJVK3lFSlFDQUNRZ0JaR3c4TFJBQUFBQUFBQUFBQUlBQWdBS0dqRHdzQ2ZDQURRZi8vLy80RFRRUkFSQmd0UkZUN0lmay9JQU5CZ1lDQTR3TkpEUUVhUkFkY0ZETW1wcEU4SUFBZ0FDQUFvaERTQXFLaElBQ2hSQmd0UkZUN0lmay9vQThMSUFKQ0FGTUVRRVFZTFVSVSt5SDVQeUFBUkFBQUFBQUFBUEEvb0VRQUFBQUFBQURnUDZJaUFKOGlBU0FCSUFBUTBnS2lSQWRjRkRNbXBwRzhvS0NoSWdBZ0FLQVBDMFFBQUFBQUFBRHdQeUFBb1VRQUFBQUFBQURnUDZJaUFKOGlBU0FBRU5JQ29pQUFJQUc5UW9DQWdJQndnNzhpQUNBQW9xRWdBU0FBb0tPZ0lBQ2dJZ0FnQUtBTEM3NENBUWQvSXdCQklHc2lBeVFBSUFNZ0FDZ0NIQ0lFTmdJUUlBQW9BaFFoQlNBRElBSTJBaHdnQXlBQk5nSVlJQU1nQlNBRWF5SUJOZ0lVSUFFZ0Ftb2hCVUVDSVFZZ0EwRVFhaUVCQW44RFFBSkFBa0FDUUNBQUtBSThJQUVnQmlBRFFReHFFQUlRandaRkJFQWdCU0FES0FJTUlnZEdEUUVnQjBFQVRnMENEQU1MSUFWQmYwY05BZ3NnQUNBQUtBSXNJZ0UyQWh3Z0FDQUJOZ0lVSUFBZ0FTQUFLQUl3YWpZQ0VDQUNEQU1MSUFFZ0J5QUJLQUlFSWdoTElnbEJBM1JxSWdRZ0J5QUlRUUFnQ1J0cklnZ2dCQ2dDQUdvMkFnQWdBVUVNUVFRZ0NSdHFJZ0VnQVNnQ0FDQUlhellDQUNBRklBZHJJUVVnQmlBSmF5RUdJQVFoQVF3QkN3c2dBRUVBTmdJY0lBQkNBRGNERUNBQUlBQW9BZ0JCSUhJMkFnQkJBQ0FHUVFKR0RRQWFJQUlnQVNnQ0JHc0xJUVFnQTBFZ2FpUUFJQVFMUmdFQmZ5QUFLQUk4SVFNakFFRVFheUlBSkFBZ0F5QUJweUFCUWlDSXB5QUNRZjhCY1NBQVFRaHFFQWdRandZaEFpQUFLUU1JSVFFZ0FFRVFhaVFBUW44Z0FTQUNHd3NKQUNBQUtBSThFQU1MdmdRQ0JIOEJmaU1BUVVCcUlnUWtBQ0FBS0FJQUlRWWdCRUlBTndJTUlBUkNnSUNBZ0lDQWdJQ0FmemNDQkNBRUlBWTJBZ0FnQkNBQklBSkJJR29pQVVIbUR4Q2ZCQ0FFSUFRZ0F5QUJRZVlQRUVNYUFrQUNRQ0FFS0FJSUlnRkIvLy8vL3dkR0JFQWdBQkExREFFTElBQWdCRVlOQVNBQUtBSUFJUWNnQkVJQU53STRJQVJDZ0lDQWdJQ0FnSUNBZnpjQ01DQUVJQWMyQWl3Q2Z5QUJRUUJJQkVCQmYwRUFJQVFvQWdRYkRBRUxJQVJCTEdvaUFVRWdRUUVRMHdJZ0FTQUVJQUZCSUVFQ0VKVUJHaUFFUVNocUlBRkJBQkNwQVNBRUtBSUlJUUVnQkNnQ0tBc2hCaUFFUVN4cUlnVWdBaUFCUVFBZ0FVRUFTaHRxSUFKQkgyb2dBa0VoYWtFQmRoQ1ZCaUlEYmtFQmFpSUJJQU5xUVFGMGFrRTZhaUlDUVFZUTB3SWdCU0FGSUFhc0lBSkJBQkRVQWlBRklBUWdCU0FDUVFBUTVBRWFJQVZCQUNBRGEwSC8vLy8vQTBFQkVNd0JHaUFFUWdBM0FpQWdCRUtBZ0lDQWdJQ0FnSUIvTndJWUlBUWdCellDRkNBQVFnRVFNQm9nQWEwaENBTkFJQWluUVFCTVJRUkFJQVJCRkdvaUFTQUlFREFhSUFFZ0JFRXNhaUFCSUFKQkFCQ1ZBUm9nQUNBQUlBRWdBa0VBRUVNYUlBQWdBRUlCSUFKQkFCQjFHaUFJUWdGOUlRZ01BUXNMUVFBaEFTQURRUUFnQTBFQVNoc2hBeUFFUVJScUVCc2dCRUVzYWhBYkEwQWdBU0FEUmtVRVFDQUFJQUFnQUNBQ1FlQVBFRU1hSUFGQkFXb2hBUXdCQ3dzZ0FDQUdRZi8vLy84RFFlRVBFTXdCR2dzZ0JCQWJJQVJCUUdza0FFRVFEd3RCMlAwQVFkVDhBRUcrSVVHWTFnQVFBQUFMZVFFQmZ5QUJRb0NBZ0lCd2cwS0FnSUNBTUZJRVFDQUFRYUkrUVFBUUZVS0FnSUNBNEFBUEN3SitBa0FnQWtVTkFDQURLUU1BSWdGQ2dJQ0FnSENEUW9DQWdJQXdVUTBBUW9DQWdJRGdBQ0FBSUFFUUtDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWFJQUduSVFRTElBQWdCRUVERUlBRUN3dXZBUUVDZnlNQVFTQnJJZ1FrQUNBQUtBSUFJUVVnQkVFSWFpQURRUUFRcVFFZ0FDQUJJQVFvQWdnaUFTQUJRUjkxSWdGeklBRnJJZ0VnQWtIQUFDQUJRUUZyWjBFQmRHdEJBQ0FCUVFKUEcycEJDR29pQWtIZ0R4Q2lCQ0VCSUFNb0FnUUVRQ0FFUWdBM0FoZ2dCRUtBZ0lDQWdJQ0FnSUIvTndJUUlBUWdCVFlDRENBRVFReHFJZ05DQVJBd0dpQUFJQU1nQUNBQ1FlQVBFSlVCSUFGeUlRRWdBeEFiQ3lBRVFTQnFKQUFnQVF1UUJnSUlmd0YrSXdCQjhBQnJJZ01rQUNBQUlBRkhCRUFnQUNnQ0FDRUVJQU5DQURjQ2FDQURRb0NBZ0lDQWdJQ0FnSDgzQW1BZ0F5QUVOZ0pjSUFOQjNBQnFJZ1VnQVJCRUdpQURRZ0EzQWxRZ0EwS0FnSUNBZ0lDQWdJQi9Od0pNSUFNZ0JEWUNTQ0FES0FKa0lRWWdBMEVBTmdKa0lBTkJ5QUJxSWdGQ3F0V3ExUW9RTUJvZ0EwRUFOZ0pRSUFVZ0FSQ3lBZ1JBSUFNZ0F5Z0NaRUVCYWpZQ1pDQUdRUUZySVFZTElBTkJ5QUJxRUJzZ0FrRUJha0VCZGhDVkJpRUZJQU5DQURjQ1ZDQURRb0NBZ0lDQWdJQ0FnSDgzQWt3Z0F5QUVOZ0pJSUFOQ0FEY0NRQ0FEUW9DQWdJQ0FnSUNBZ0g4M0FqZ2dBeUFFTmdJMElBTkIzQUJxSWdFZ0FVSi9RZi8vLy84RFFRQVFkUm9nQlVFQUlBVkJBRW9iSVFrZ0FpQUZhaUFDSUFWQkFYUnVRUUZxSWdwQkFYUnFRU0JxSVFKQkFDRUJBMEFnQVNBSlJrVUVRQ0FEUWNnQWFpSUhJQU5CM0FCcUlnaENBU0FDUVFBUWRSb2dBMEUwYWlJTElBY2dBa0VHRUpFR0lBY2dDMElCSUFKQkFCQjFHaUFJSUFnZ0J5QUNRUUFRbFFFYUlBRkJBV29oQVF3QkN3c2dBMElBTndJc0lBTkNnSUNBZ0lDQWdJQ0FmemNDSkNBRElBUTJBaUFnQTBJQU53SVlJQU5DZ0lDQWdJQ0FnSUNBZnpjQ0VDQURJQVEyQWd3Z0EwRWdhaUlCSUFOQjNBQnFJZ1JDQWlBQ1FRQVFkUm9nQVNBRUlBRWdBa0VBRUpVQkdpQURRUXhxSUFFZ0FTQUNRUUFRUXhvZ0FFSUFFREFhSUFxc0lRd0RRQ0FNUWdCWFJRUkFJQU5CeUFCcUlnRkNBUkF3R2lBRFFUUnFJZ1FnREtkQkFYUkJBWEtzRURBYUlBRWdBU0FFSUFKQkFCQ1ZBUm9nQUNBQUlBRWdBa0VBRU1zQkdpQUFJQUFnQTBFTWFpQUNRUUFRUXhvZ0RFSUJmU0VNREFFTEN5QUFJQUJDQVNBQ1FRQVFkUm9nQUNBQUlBTkJJR29pQVNBQ1FRQVFReG9nQVJBYklBTkJER29RR3lBRFFUUnFFQnNnQTBISUFHb1FHeUFBSUFWQkFXcEIvLy8vL3dOQkFSRE1BUm9nQTBIY0FHb2lBU0FDUVFZUTB3SWdBU0FCSUFhc0lBSkJBQkRVQWlBQUlBQWdBU0FDUVFBUXl3RWFJQUVRR3lBRFFmQUFhaVFBUVJBUEMwSFkvUUJCMVB3QVFkY2lRYWpXQUJBQUFBc1JBQ0FBSUFFZ0FpQURJQVJCQUJDV0Jnc1JBQ0FBSUFFZ0FpQURJQVJCQVJDV0JndllBd0VIZnlBQ0tBSUVJQUVvQWdSeklRY0NRQUpBQWtBQ1FBSkFBa0FDUUNBQktBSUlJZ1pCL2YvLy93ZE1CRUFnQWlnQ0NDSUZRZjMvLy84SFNnMEJJQVpCZ0lDQWdIaEhEUVlnQlVHQWdJQ0FlRVlOQkF3SEN5QUdRZi8vLy84SFJnMEJJQUlvQWdnaEJRc2dCVUgvLy8vL0IwY05BUXNnQUJBMVFRQVBDeUFHUWY3Ly8vOEhSeUlCSUFWQi92Ly8vd2RIY2cwQkN5QUFFRFZCQVE4TElBRU5BU0FBSUFjUWpBRkJBQThMSUFWQmdJQ0FnSGhHQkVBZ0FDQUhFSXdCUVFJUEN3SkFJQUFvQWdBaUJTZ0NBRUVBSUFFb0Fnd2lCaUFEUVNGcVFRVjJJZ2dnQmlBSVNoc2lDaUFDS0FJTUlnaHFJZ2xCQW5SQkJHb2dCU2dDQkJFQkFDSUdCRUFnQmtFQUlBa2dBU2dDREd0QkFuUWlDeEFySWdZZ0Myb2dBU2dDRUNBQktBSU1RUUowRUI4YUlBQWdDa0VCYWhCQlJRUkFJQVVnQUNnQ0VDQUdJQWtnQWlnQ0VDQUlFS1VFUlEwQ0N5QUZLQUlBSUFaQkFDQUZLQUlFRVFFQUdnc2dBQkExUVNBUEN5QUdJQWdRcUFNRVFDQUFLQUlRSWdVZ0JTZ0NBRUVCY2pZQ0FBc2dBQ2dDQUNJRktBSUFJQVpCQUNBRktBSUVFUUVBR2lBQ0tBSUlJUUlnQVNnQ0NDRUJJQUFnQnpZQ0JDQUFJQUVnQW10QklHbzJBZ2dnQUNBRElBUVFzd0lQQ3lBQUlBY1FpUUZCQUF0WUFRRitJQUFnQXlrREFCRDlBVUVBUjYxQ2dJQ0FnQkNFSVFRZ0FVS0FnSUNBY0lOQ2dJQ0FnREJSQkVBZ0JBOExJQUFnQVVFR0VHVWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQUFnQVNBRUVOc0JDeUFCQzVNQ0FnRitBWDhqQUVFUWF5SUZKQUFDUUFKQUlBSkZCRUFNQVFzZ0FDQURLUU1BRUxrQ0lnUkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFRSkFBa0FnQkVJZ2lLZEJDMm9PQXdFQUFBSUxJQVNuUVFScUlBVkJDR29RdFFVZ0FDQUVFQTlDZ0lDQWdNQitJQVVwQXdnaUJFS0FnSUNBd0lHQS9QOEFmU0FFUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeUVFREFFTElBQWdCQkEzSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBUVFqUUVpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCQ3lBQlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQUNBQUlBRkJCQkJsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRklFUUNBQUlBRWdCQkRiQVFzZ0FTRUVDeUFGUVJCcUpBQWdCQXM3QVFGL0EwQWdBZ1JBSUFBdEFBQWhBeUFBSUFFdEFBQTZBQUFnQVNBRE9nQUFJQUZCQVdvaEFTQUFRUUZxSVFBZ0FrRUJheUVDREFFTEN3c2FBQ0FBTFFBQUlRSWdBQ0FCTFFBQU9nQUFJQUVnQWpvQUFBdENBUUYvSUFKQkFYWWhBZ05BSUFJRVFDQUFMd0VBSVFNZ0FDQUJMd0VBT3dFQUlBRWdBenNCQUNBQlFRSnFJUUVnQUVFQ2FpRUFJQUpCQVdzaEFnd0JDd3NMR2dBZ0FDOEJBQ0VDSUFBZ0FTOEJBRHNCQUNBQklBSTdBUUFMUWdFQmZ5QUNRUUoySVFJRFFDQUNCRUFnQUNnQ0FDRURJQUFnQVNnQ0FEWUNBQ0FCSUFNMkFnQWdBVUVFYWlFQklBQkJCR29oQUNBQ1FRRnJJUUlNQVFzTEN4b0FJQUFvQWdBaEFpQUFJQUVvQWdBMkFnQWdBU0FDTmdJQUMwSUJBWDRnQWtFRGRpRUNBMEFnQWdSQUlBQXBBd0FoQXlBQUlBRXBBd0EzQXdBZ0FTQUROd01BSUFGQkNHb2hBU0FBUVFocUlRQWdBa0VCYXlFQ0RBRUxDd3NjQVFGK0lBQXBBd0FoQXlBQUlBRXBBd0EzQXdBZ0FTQUROd01BQzFvQkFuNGdBa0VFZGlFQ0EwQWdBZ1JBSUFBcEF3QWhBeUFBSUFFcEF3QTNBd0FnQUNrRENDRUVJQUFnQVNrRENEY0RDQ0FCSUFRM0F3Z2dBU0FETndNQUlBRkJFR29oQVNBQVFSQnFJUUFnQWtFQmF5RUNEQUVMQ3dzMEFRSitJQUFwQXdBaEF5QUFJQUVwQXdBM0F3QWdBQ2tEQ0NFRUlBQWdBU2tEQ0RjRENDQUJJQVEzQXdnZ0FTQUROd01BQ3drQUlBRWdBaER6QlF2a0JBSUdmZ0YvSXdCQkVHc2lBaVFBSUFGQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFBb0FoQW9Bb3dCS1FNSUlRRUxBa0FnQUNBQlFUc2dBVUVBRUJRaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBVWhBUXdCQ3dKQUFrQWdCVUwvLy8vL2IxWU5BQ0FBSUFVUUR5QUFJQUVRZ0FNaUMwVU5BUUovSUFSQkFFZ0VRQ0FMS0FJb1FSaHFEQUVMSUFzZ0JFRURkR3BCMkFCcUN5a0RBQ0lGUWlDSXAwRjFTUTBBSUFXbklnc2dDeWdDQUVFQmFqWUNBQXNnQUNBRlFRTVFTU0VCSUFBZ0JSQVBJQUZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQUpBSUFNZ0JFRUhSa0VEZEdvcEF3QWlCVUtBZ0lDQWNJTkNnSUNBZ0RCU0JFQWdBQ0FGRUNnaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBQWdBVUV6SUFWQkF4QVpHZ3NnQkVFSFJnUkFRb0NBZ0lEZ0FDRUhRb0NBZ0lBd0lRVUNRQUpBSUFBZ0F5a0RBRUVBRU9jQklnWkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFS0FnSUNBTUNFSURBRUxJQUFnQmtIcUFDQUdRUUFRRkNJSVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FCQStJZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRUtBZ0lDQTRBQWhCUXdCQ3dOQUlBQWdCaUFJSUFKQkRHb1FyZ0VpQ2tLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBSUFJb0Fnd0VRQ0FGSVFjTUJBc2dBQ0FGSUFrZ0NoQnFJUU1nQ1VJQmZDRUpJQU5CQUU0TkFRc0xJQUFnQmtFQkVLMEJHZ3NnQUNBRkVBOExJQUFnQ0JBUElBQWdCaEFQSUFkQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBRkJOQ0FIUVFNUUdSb0xJQUFnQVVFQVFRQkJBUkRLQWd3Q0N5QUFJQUVRRHd0Q2dJQ0FnT0FBSVFFTElBSkJFR29rQUNBQkMrc0NBUVorSXdCQkVHc2lBaVFBSUFNcEF3QWhBVUtBZ0lDQTRBQWhCU0FBRURRaUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQVFvQ0FnSUF3SVFRQ1FDQUFJQUZCQUJEbkFTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCU0JFQUNRQ0FBSUFGQjZnQWdBVUVBRUJRaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUEwQWdBQ0FCSUFZZ0FrRU1haEN1QVNJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FpZ0NEQVJBSUFjaEJRd0VDd0pBQWtBZ0JFTC8vLy8vYjFnRVFDQUFFQ1FNQVFzZ0FDQUVRZ0FRVFNJSVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUVRZ0VRVFNJSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUlFQThNQVFzZ0FDQUhJQWdnQ1VHSGdBRVF2UUZCQUU0TkFRc2dBQ0FFRUE4TUFnc2dBQ0FFRUE4TUFBc0FDeUFCUW9DQWdJQndXZ1JBSUFBZ0FVRUJFSzBCR2dzZ0JpRUVDeUFCSVFZZ0J5RUJDeUFBSUFRUUR5QUFJQVlRRHlBQUlBRVFEd3NnQWtFUWFpUUFJQVVMU2dCQkx5RUNJQUFnQXlrREFDSUJRb0NBZ0lCd1dnUi9JQUduTHdFR0lnSkJNRVlFUUVFTlFUQWdBQ0FCRURnYklRSUxJQUFvQWhBb0FrUWdBa0VZYkdvb0FnUUZRUzhMRUMwTDhnRUNCSDhCZmlNQVFUQnJJZ0lrQUVLQmdJQ0FFQ0VCQWtBZ0F5a0RBQ0lKUW9DQWdJQndWQTBBUW9DQWdJRGdBQ0VCSUFBZ0FrRXNhaUFDUVNocUlBbW5JZ2hCQXhDT0FRMEFJQUlvQWl3aEJpQUNLQUlvSVFkQkFDRURBa0FEUUNBRElBZEhCRUFnQUNBQ1FRaHFJQWdnQmlBRFFRTjBhaWdDQkJCTUlnVkJBRWdOQWdKQUlBVkZEUUFnQUNBQ1FRaHFFRWdnQWlnQ0NDSUZRUUZ4UlNBRVJTQUZRUUp4UlhKeERRQkNnSUNBZ0JBaEFRd0RDeUFEUVFGcUlRTU1BUXNMSUFBZ0NSQ1pBU0lEUVFCSURRRWdBMEVCUjYxQ2dJQ0FnQkNFSVFFTElBQWdCaUFIRUZvTElBSkJNR29rQUNBQkM3OEJBZ0YrQVg5Q2dJQ0FnREFoQVFKQUlBQWdBeWtEQUJBbElnUkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFFRUJJQUlnQWtFQlRCc2hCVUVCSVFJRFFDQUNJQVZHQkVBZ0JBOExJQU1nQWtFRGRHb3BBd0FpQVVLQWdJQ0FFSVJDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFJQUFnQVJBbElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFpQUFJQVFnQVVLQWdJQ0FNRUVCRU5RRkRRSWdBQ0FCRUE4TElBSkJBV29oQWd3QUN3QUxJQUFnQkJBUElBQWdBUkFQUW9DQWdJRGdBQXNZQUNBQUlBTXBBd0FnQXlrRENCQlNyVUtBZ0lDQUVJUUw0Z0lDQTM0RGZ5TUFRU0JySWdJa0FFS0FnSUNBNEFBaEJDQUFJQU1wQXdBUUpTSUZRb0NBZ0lCd2cwS0FnSUNBNEFCU0JFQkNnSUNBZ0RBaEFRSkFBa0FnQUNBQ1FSeHFJQUpCR0dvZ0JhZEJBeENPQVEwQVFvQ0FnSURnQUNFQklBQVFOQ0lFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQWlnQ0hDRUhJQUlvQWhnaENFRUFJUU1EUUNBRElBaEhCRUFDUUFKQUlBQWdCeUFEUVFOMGFpSUpLQUlFRUZ3aUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBSWdBVGNEQ0NBQ0lBVTNBd0FnQUNBRUlBQWdBa0VBRU1ZRUlRWWdBQ0FCRUE4Z0JrS0FnSUNBY0lNaUFVS0FnSUNBTUZFTkFTQUJRb0NBZ0lEZ0FGRU5BQ0FBSUFRZ0NTZ0NCQ0FHUVllQUFSQVpRUUJPRFFFTElBUWhBUXdEQ3lBRFFRRnFJUU1NQVFzTElBQWdCeUFJRUZvZ0JTRUJEQUVMSUFBZ0FpZ0NIQ0FDS0FJWUVGb2dBQ0FGRUE5Q2dJQ0FnT0FBSVFRTElBQWdBUkFQQ3lBQ1FTQnFKQUFnQkFzUUFDQUFJQU1wQXdCQkVTQUVFS29DQ3hBQUlBQWdBeWtEQUVFQ1FRQVFxZ0lMRUFBZ0FDQURLUU1BUVFGQkFCQ3FBZ3RIQVFGK1FvQ0FnSURnQUNFRUlBQWdBeWtEQUNJQklBTXBBd2dRcmdZRWZrS0FnSUNBNEFBRklBRkNJSWluUVhWUEJFQWdBYWNpQUNBQUtBSUFRUUZxTmdJQUN5QUJDd3RCQUNBQUlBTXBBd0FpQVNBREtRTUlRUUVRaXdKQkFFZ0VRRUtBZ0lDQTRBQVBDeUFCUWlDSXAwRjFUd1JBSUFHbklnQWdBQ2dDQUVFQmFqWUNBQXNnQVF1SkFRRUJmaUFES1FNQUlnRkMvLy8vLzI5V0lBRkNnSUNBZ0hDRFFvQ0FnSUFnVVhKRkJFQWdBRUczNUFCQkFCQVZRb0NBZ0lEZ0FBOExBa0FnQUNBQkVFY2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQU1wQXdnaUJFS0FnSUNBY0lOQ2dJQ0FnREJSRFFFZ0FDQUJJQVFRcmdaRkRRRWdBQ0FCRUE4TFFvQ0FnSURnQUE4TElBRUxwUVFDQlg4Q2ZpTUFRU0JySWdVa0FDQUFJQVZCQ0dvaUJrRUFFRDBhSUFaQktCQTdHaUFFUVg1eFFRSkdCRUFnQlVFSWFrSHhtUUVRaUFFYUN5QUZRUWhxUWJyTUFCQ0lBUm9nQkVGOWNVRUJSZ1JBSUFWQkNHcEJLaEE3R2dzZ0JVRUlha0d2bEFFUWlBRWFRUUFoQmlBQ1FRRnJJZ2RCQUNBSFFRQktHeUVJQWtBQ1FBSkFBMEFnQmlBSVJ3UkFJQVlFUUNBRlFRaHFRU3dRT3hvTElBWkJBM1FoQ1NBR1FRRnFJUVlnQlVFSWFpQURJQWxxS1FNQUVJY0JSUTBCREFJTEN5QUZRUWhxUVlhYUFSQ0lBUm9nQWtFQVNnUkFJQVZCQ0dvZ0F5QUhRUU4wYWlrREFCQ0hBUTBCQ3lBRlFRaHFJZ0pCaVpFQkVJZ0JHa0tBZ0lDQU1DRUxJQUlRTmlJS1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FDQUFLUVBBQVNBS1FRTkJmeENjQXlFTElBQWdDaEFQSUF0Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQWlBQUlBRkJPeUFCUVFBUUZDSUtRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRUNRQ0FLUXYvLy8vOXZWZzBBSUFBZ0NoQVBJQUFnQVJDQUF5SUNSUTBDSUFJb0FpZ2dCRUVCZEVHdXdBRnFMd0VBUVFOMGFpa0RBQ0lLUWlDSXAwRjFTUTBBSUFxbklnSWdBaWdDQUVFQmFqWUNBQXNnQUNBTElBcEJBUkNMQWlFQ0lBQWdDaEFQSUFKQkFFNE5BZ3dCQ3lBRktBSUlLQUlRSWdKQkVHb2dCU2dDRENBQ0tBSUVFUUFBUW9DQWdJQXdJUXNMSUFBZ0N4QVBRb0NBZ0lEZ0FDRUxDeUFGUVNCcUpBQWdDd3VBQWdJQ2ZnRi9Jd0JCSUdzaUJ5UUFRb0NBZ0lEZ0FDRUZBa0FDUUNBQUlBRVFKU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBREtRTUFFREVpQTBVTkFBTkFJQUFnQnlBQnB5QURFRXdpQWtFQVNBMENJQUlFUUVLQWdJQ0FNQ0VGQWtBZ0J5MEFBRUVRY1VVTkFDQUhRUmhCRUNBRUcyb3BBd0FpQlVJZ2lLZEJkVWtOQUNBRnB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFBZ0J4QklEQU1MSUFBZ0FSQ01BaUlCUW9DQWdJQndneUlHUW9DQWdJQWdVZ1JBSUFaQ2dJQ0FnT0FBVVFSQUlBWWhCUXdFQ3lBQUVIdEZEUUVNQXdzTFFvQ0FnSUF3SVFVTUFRdEJBQ0VEQ3lBQUlBTVFFeUFBSUFFUUR5QUhRU0JxSkFBZ0JRdXhBUUVEZmlBREtRTUlJUVVnQXlrREFDRUdRb0NBZ0lEZ0FDRUhBa0FnQUNBQkVDVWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnUitJQUFnQlJCZ0RRRWdBQ0FHRURFaUFrVU5BU0FBSUFFZ0FrS0FnSUNBTUVLQWdJQ0FNQ0FGSUFRYklBVkNnSUNBZ0RBZ0JCdEJoYW9CUVlXYUFTQUVHeEJ0SVFNZ0FDQUJFQThnQUNBQ0VCTkNnSUNBZ09BQVFvQ0FnSUF3SUFOQkFFZ2JCVUtBZ0lDQTRBQUxEd3NnQUNBQkVBOUNnSUNBZ09BQUMzSUJBWDVDZ0lDQWdEQWhBeUFCUW9DQWdJQVFoRUtBZ0lDQWNJTkNnSUNBZ0RCUkJFQWdBQkFrUW9DQWdJRGdBQThMSUFKQ2dJQ0FnSENEUW9DQWdJQWdVaUFDUXYvLy8vOXZXSEVFZmtLQWdJQ0FNQVZDZ0lDQWdPQUFRb0NBZ0lBd0lBQWdBU0FDUVFFUWl3SkJBRWdiQ3dzeUFRRitJQUFnQVJBbElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJEd3NnQUNBQkVPZ0JJUUlnQUNBQkVBOGdBZ3VnQVFJQmZnRi9Jd0JCSUdzaUFpUUFRb0NBZ0lEZ0FDRUVBa0FDUUNBQUlBRVFKU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBREtRTUFFREVpQTBVTkFDQUFJQUlnQWFjZ0F4Qk1JZ1ZCQUVnTkFTQUZSUVJBUW9DQWdJQVFJUVFNQWdzZ0FqVUNBQ0VFSUFBZ0FoQklJQVJDQW9oQ0FZTkNnSUNBZ0JDRUlRUU1BUXRCQUNFREN5QUFJQU1RRXlBQUlBRVFEeUFDUVNCcUpBQWdCQXZCQVFFQ2ZnSkFBbjVDZ0lDQWdCQWdBeWtEQUNJRVFvQ0FnSUJ3VkEwQUdrS0FnSUNBNEFBZ0FDQUJFQ1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2lBRXB5SUNJQUlvQWdCQkFXbzJBZ0FnQWFjaEFnTkFJQUFnQkJDTUFpSUVRb0NBZ0lCd2d5SUZRb0NBZ0lEZ0FGSUVRQ0FDSUFTblJpQUZRb0NBZ0lBZ1VYSU5BeUFBRUh0RkRRRUxDeUFBSUFRUUR5QUFJQUVRRDBLQWdJQ0E0QUFMRHdzZ0FDQUVFQThnQUNBQkVBOGdCVUtBZ0lDQUlGS3RRb0NBZ0lBUWhBdDZBUUYrSUFBZ0F5a0RBQkF4SWdKRkJFQkNnSUNBZ09BQUR3dENnSUNBZ09BQUlRUWdBQ0FCRUNVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBQWdBaEFUSUFFUEN5QUFRUUFnQWFjZ0FoQk1JUU1nQUNBQ0VCTWdBQ0FCRUE5Q2dJQ0FnT0FBSUFOQkFFZXRRb0NBZ0lBUWhDQURRUUJJR3dzSUFDQUFJQUVRSlFzUEFDQUFJQUZCTjBFQVFRQVFyQUlMTFFFQmZrS0FnSUNBTUNFQ0FrQWdBUkNqQXlJQVJRMEFJQUF0QUJKQkJIRkZEUUFnQURVQ1JDRUNDeUFDQ3pNQ0FYNEJmMEtBZ0lDQU1DRUNBa0FnQVJDakF5SURSUTBBSUFNdEFCSkJCSEZGRFFBZ0FDQURLQUpBRUMwaEFnc2dBZ3NvQUVLQWdJQ0E0QUFnQUNBREtRTUFJQUVRdmdVaUFFRUFSNjFDZ0lDQWdCQ0VJQUJCQUVnYkM3Y0JBZ0YrQW45Q2dJQ0FnT0FBSVFRZ0FDQUJFR0FFZmtLQWdJQ0E0QUFGUWNxWkFTRUNBa0FnQWFjaUF5OEJCaER1QVVVTkFBSkFJQU1vQWlBaUF5OEFFU0lGUVlBSWNVVU5BQ0FES0FKVUlnWkZEUUFnQUNBR0lBTW9Ba2dRa3dJUEN5QUZRUVIyUVFOeFFRRnJJZ05CQWtzTkFDQURRUUowUWZUL0FXb29BZ0FoQWdzZ0FDQUNJQUFnQVVFMklBRkJBQkFVSWdGQ2dJQ0FnSENEUW9DQWdJQXdVUVIrSUFCQkx4QXRCU0FCQzBHK0dSQytBUXNMNlFVREEzNEdmd044QWtBQ2ZrS0FnSUNBNEFBZ0FDQUJFR0FOQUJwQ2dJQ0FnT0FBSUFBZ0FDa0RNRUVPRUVraUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUdpQUZweUlLSUFGQ2dJQ0FnSEJhQkg4Z0FhY3RBQVZCRUhFRlFRQUxJQW90QUFWQjd3Rnhjam9BQlNBQVFRRWdBaUFDUVFGTUd5SUxRUUZySWdoQkEzUkJHR29RS1NJSFJRMEJJQUZDSUlpblFYVlBCRUFnQWFjaUFpQUNLQUlBUVFGcU5nSUFDeUFISUFFM0F3QWdBeWtEQUNJRVFpQ0lwMEYxVHdSQUlBU25JZ0lnQWlnQ0FFRUJhallDQUFzZ0J5QUlOZ0lRSUFjZ0JEY0RDRUVBSVFJRFFDQUNJQWhIQkVBZ0F5QUNRUUZxSWdsQkEzUnFLUU1BSWdSQ0lJaW5RWFZQQkVBZ0JLY2lEQ0FNS0FJQVFRRnFOZ0lBQ3lBSElBSkJBM1JxSUFRM0F4Z2dDU0VDREFFTEN5QUtJQWMyQWlBZ0FVTC8vLy8vYjFnRVFDQUFFQ1FNQWdzZ0FFRUFJQUduUVRBUVRDSUNRUUJJRFFGQ0FDRUVBa0FnQWtVTkFDQUFJQUZCTUNBQlFRQVFGQ0lHUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlnQmtMLy8vLy9EMWdFUUNBR3B5SUNJQWhyUVFBZ0FpQUxUaHV0SVFRTUFRc2dCa0lnaUtkQkIydEJiVTBFUUFKQUlBWkNnSUNBZ01DQmdQei9BSHdpQkVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWZzBBSUFTL25TSU9JQWkzSWc5bERRQWdEaUFQb1NFTkN5QU52U0lFQW44Z0RabEVBQUFBQUFBQTRFRmpCRUFnRGFvTUFRdEJnSUNBZ0hnTElnSzN2VkVFUUNBQ3JTRUVEQUlMUW9DQWdJREFmaUFFUW9DQWdJREFnWUQ4L3dCOUlBUkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYklRUU1BUXNnQUNBR0VBOExJQUFnQlVFd0lBUkJBUkFaR2lBQVFkU1pBU0FBSUFGQk5pQUJRUUFRRkNJRVFvQ0FnSUJ3Z3lJQlFvQ0FnSUNRZjFJRWZpQUJRb0NBZ0lEZ0FGRU5BaUFBSUFRUUR5QUFRUzhRTFFVZ0JBdEJ6SjRCRUw0QklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQVZCTmlBQlFRRVFHUm9nQlFzUEN5QUFJQVVRRDBLQWdJQ0E0QUFMTUFBZ0FrRUFUQVJBSUFBZ0FVS0FnSUNBTUVFQVFRQVFJUThMSUFBZ0FTQURLUU1BSUFKQkFXc2dBMEVJYWhBaEM2TUNBZ0YvQkg0akFFRVFheUlGSkFCQ2dJQ0FnREFoQmdKQUFrQWdBQ0FGUVFocUlBQWdBUkFsSWdrUVBBMEFJQVZCQVRZQ0JBSkFJQVFFUUNBREtRTUFJUWhDZ0lDQWdEQWhCeUFDUVFKT0JFQWdBeWtEQ0NFSEN5QUFJQWdRWUVVTkFRd0NDeUFDUVFCTUJFQkNnSUNBZ0RBaENFS0FnSUNBTUNFSERBRUxRb0NBZ0lBd0lRaENnSUNBZ0RBaEJ5QURLUU1BSWdGQ2dJQ0FnSENEUW9DQWdJQXdVUTBBSUFBZ0JVRUVhaUFCRUxvQlFRQklEUUVMSUFBZ0NVSUFFS3NDSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRWU1BUXNnQVNFR0lBQWdBU0FKSUFVcEF3aENBQ0FGS0FJRUlBZ2dCeEN2QmtJQVV3MEFJQWtoQmd3QkN5QUFJQWtRRDBLQWdJQ0E0QUFoQVFzZ0FDQUdFQThnQlVFUWFpUUFJQUVMK1FFQ0JINEJmeU1BUVNCcklnZ2tBQUpBQWtBZ0FDQUlRUmhxSUFBZ0FSQWxJZ0VRUEEwQUlBQWdDRUVJYWlBREtRTUFRZ0FnQ0NrREdDSUVJQVFRZEEwQUlBQWdDRUVRYWlBREtRTUlRZ0FnQkNBRUVIUU5BQ0FJSUFRM0F3QUNmaUFFSUFKQkEwZ05BQm9nQkNBREtRTVFJZ1ZDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFHaUFBSUFnZ0JVSUFJQVFnQkJCMERRRWdDQ2tEQUFzaEJpQUFJQUVnQ0NrRENDSUZJQWdwQXhBaUJ5QUdJQWQ5SWdZZ0JDQUZmU0lFSUFRZ0JsVWJJZ1JCQVVGL1FRRWdCU0FFSUFkOFV4c2dCU0FIVnhzUTlBSkZEUUVMSUFBZ0FSQVBRb0NBZ0lEZ0FDRUJDeUFJUVNCcUpBQWdBUXV5Q0FJSmZnTi9Jd0JCTUdzaURpUUFRb0NBZ0lBd0lRVUNRQUpBSUFBZ0RrRWdhaUFBSUFFUUpTSUtFRHdOQUNBQUlBNUJHR29nQXlrREFFSUFJQTRwQXlBaUJ5QUhFSFFOQUFKQUlBUUVRQUpBQWtBQ1FDQUNEZ0lDQUFFTElBY2dEaWtER0gwaENFRUFJUUlNQVFzZ0FDQU9RUkJxSUFNcEF3aENBQ0FISUE0cEF4aDlRZ0FRZEEwRElBSkJBbXNoQWlBT0tRTVFJUWdMSUFjZ0FxMThJQWg5UW9DQWdJQ0FnSUFRVXcwQklBQkIwTm9BUVFBUUZRd0NDeUFPSUFjM0F4QWdCeUVCSUFNcEF3Z2lDMEtBZ0lDQWNJTkNnSUNBZ0RCU0JINGdBQ0FPUVJCcUlBdENBQ0FISUFjUWRBMENJQTRwQXhBRklBRUxJQTRwQXhoOUlnRkNBQ0FCUWdCVkd5RUlRUUFoQWdzZ0FDQUtJQWhDZ0lDQWdBaDhRdi8vLy84UFdBUitJQWhDLy8vLy93K0RCVUtBZ0lDQXdINGdDTG05SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xJZ1VRcXdJaEFTQUFJQVVRRHdKQUlBRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQU9LUU1ZSWdzZ0NId2hDUUpBQWtBZ0NpQU9RUXhxSUE1QkNHb1FpZ0pGSUFGQy8vLy8vMjlZY2cwQUlBR25JZzh2QVFaQkFrY05BQ0FMSVFVZ0R5MEFCVUVJY1VVTkFTQU9LQUlNSVE4Z0RqVUNDQ0VOQTBBZ0JTQUpXU0FGSUExWmNnMENJQThnQmFkQkEzUnFLUU1BSWd4Q0lJaW5RWFZQQkVBZ0RLY2lFQ0FRS0FJQVFRRnFOZ0lBQ3lBQUlBRWdCaUFNUVlDQUFSRFNBVUVBU0EwRElBWkNBWHdoQmlBRlFnRjhJUVVNQUFzQUN5QUxJUVVMSUFVZ0NTQUZJQWxWR3lFSkEwQWdCU0FKVWdSQUlBQWdDaUFGSUE1QktHb1FoUUVpRDBFQVNBMENJQThFUUNBQUlBRWdCaUFPS1FNb1FZQ0FBUkRTQVVFQVNBMERDeUFHUWdGOElRWWdCVUlCZkNFRkRBRUxDeUFBSUFGQk1DQUdRb0NBZ0lBSVdnUitRb0NBZ0lEQWZpQUd1YjBpQlVLQWdJQ0F3SUdBL1A4QWZTQUZRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3VWdCZ3NRUlVFQVNBMEFJQVFFUUNBSElBS3RJZ1o4SUFoOUlRbENBQ0VGQWtBZ0JpQUlVUTBBSUFBZ0NpQUdJQXQ4SUFnZ0Mzd2lEQ0FISUF4OVFYOUJBU0FHSUFoVkd4RDBBa0VBU0EwQ0EwQWdCeUFKVncwQklBQWdDaUFIUWdGOUlnY1ErZ0ZCQUU0TkFBc01BZ3NEUUNBRklBWlNCRUFnQmFkQkEzUWdBMm9wQXhBaUIwSWdpS2RCZFU4RVFDQUhweUlDSUFJb0FnQkJBV28yQWdBTElBVWdDM3doQ0NBRlFnRjhJUVVnQUNBS0lBZ2dCeENHQVVFQVRnMEJEQU1MQ3lBSlFvQ0FnSUFJZkVMLy8vLy9EMWdFZmlBSlF2Ly8vLzhQZ3dWQ2dJQ0FnTUIrSUFtNXZTSUZRb0NBZ0lEQWdZRDgvd0I5SUFWQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3lFR0lBRWhCU0FBSUFwQk1DQUdFRVZCQUVnTkFnc2dDaUVGREFJTElBRWhCUXNnQUNBS0VBOUNnSUNBZ09BQUlRRUxJQUFnQlJBUElBNUJNR29rQUNBQkMrSUNBd0orQlg4QmZDTUFRU0JySWdVa0FBSkFJQUlvQWdRTkFDQUNLQUlBSVFZQ1FBSkFBbjhnQWlnQ0NBUkFJQUFnQVVFSUVHRkZEUUlnQlNBQUtRTUFOd01RSUFVZ0FTa0RBRGNER0NBR0lBSXBBeEJDZ0lDQWdEQkJBaUFGUVJCcUVDRWlBMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMERJQU5DLy8vLy93OVlCRUFnQTZjaUFrRWZkU0FDUVFCSGNnd0NDeUFHSUFWQkNHb2dBeEJ1UVFCSURRTWdCU3NEQ0NJS1JBQUFBQUFBQUFBQVpDQUtSQUFBQUFBQUFBQUFZMnNNQVFzZ0FDZ0NDQ0lJUlFSQUlBWWdBQ2tEQUJBb0lnTkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF5QUFJQU9uSWdnMkFnZ0xJQUVvQWdnaUNRUi9JQWdGSUFZZ0FTa0RBQkFvSWdOQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQklBT25JZ2syQWdnZ0FDZ0NDQXNnQ1JDREFnc2lCdzBDQ3lBQUtRTVFJZ01nQVNrREVDSUVWU0FESUFSVGF5RUhEQUVMSUFKQkFUWUNCQXNnQlVFZ2FpUUFJQWNMWFFBQ1FDQUJRb0NBZ0lCd2cwS0FnSUNBTUZFTkFDQUFLQUlRS0FLTUFTZ0NDQ0FCcDBZTkFDQUFJQUZCQVJCbER3c2dBeWtEQUNJQlFpQ0lweUlDUVF0cVFSRkxJQUpCZm5GQkFrZHlSUVJBSUFBUU5BOExJQUFnQVJBbEM2NEZBZ1YrQkg4akFFRXdheUlMSkFBZ0MwSUFOd0ljSUFzZ0FEWUNHQ0FMSUFNcEF3QWlCRGNES0VLQWdJQ0FNQ0VHQWtBQ1FBSi9JQVJDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFRUUFoQWtFQUlBQWdCQkJnRFFFYUlBdEJBVFlDSUF0QkFDRUNBa0FnQUNBTFFSQnFJQUFnQVJBbElnWVFQQVJBREFFTFFnQWhCQU5BSUFzcEF4QWlDQ0FGVlFSQUlBa2dDazhFUUNBQUlBSWdDaUFLUVFGMmFrRWZha0Z3Y1NJS1FSaHNJQXRCREdvUXFBRWlBMFVOQXlBTEtBSU1RUmh1SUFwcUlRb2dBeUVDQzBFQUlBQWdCaUFGSUFJZ0NVRVliR29pREJDRkFTSURRUUJJRFFNYUFrQWdBMFVOQUNBTU5RSUVRaUNHUW9DQWdJQXdVUVJBSUFSQ0FYd2hCQXdCQ3lBTUlBVTNBeEFnREVFQU5nSUlJQWxCQVdvaENRc2dCVUlCZkNFRkRBRUxDeUFDSUFsQkdFSFdBQ0FMUVJocUVMNENRUUFnQ3lnQ0hBMEJHaUFFSUFtdElnRjhJQVJDUDRjZ0JJTjlJUVJDQUNFRkEwQUNRQ0FCSUFWU0JFQWdBaUFGcHlJS1FSaHNhaUlES0FJSUlnd0VRQ0FBSUF5dFFvQ0FnSUNRZjRRUUR3c2dBeWtEQUNFSElBVWdBeWtERUZFRVFDQUFJQWNRRHd3Q0N5QUFJQVlnQlNBSEVJWUJRUUJPRFFFZ0NrRUJhZ3dFQ3lBQUtBSVFJZ05CRUdvZ0FpQURLQUlFRVFBQUEwQWdBU0FFVVFSQUEwQWdCQ0FJV1EwSUlBQWdCaUFFRVBvQklRSWdCRUlCZkNFRUlBSkJBRTROQUF3SEN3QUxJQUFnQmlBQlFvQ0FnSUF3RUlZQklRSWdBVUlCZkNFQklBSkJBRTROQUFzTUJBc2dCVUlCZkNFRkRBQUxBQXRCQUFzaEF5QUpJQU1nQXlBSlNSc2hDUU5BSUFNZ0NVY0VRQ0FBSUFJZ0EwRVliR29pQ2lrREFCQVBJQW9vQWdnaUNnUkFJQUFnQ3ExQ2dJQ0FnSkIvaEJBUEN5QURRUUZxSVFNTUFRc0xJQUFvQWhBaUEwRVFhaUFDSUFNb0FnUVJBQUFMSUFBZ0JoQVBRb0NBZ0lEZ0FDRUdDeUFMUVRCcUpBQWdCZ3V3QXdJRGZnSi9Jd0JCTUdzaUFpUUFRb0NBZ0lBd0lRWWdBa0tBZ0lDQU1EY0RLQUpBQWtBZ0FDQUNRUkJxSUFBZ0FSQWxJZ0VRUEEwQUFrQWdBU0FDUVJ4cUlBSkJER29RaWdKRkJFQWdBaWtERUNFRkRBRUxJQUlwQXhBaUJTQUNLQUlNSWdPdFVnMEFJQU5CQWtrTkFrRUFJUUFnQWlnQ0hDRUhBMEFnQUNBRFFRRnJJZ05QRFFNZ0J5QUFRUU4wYWlJSUtRTUFJUVFnQ0NBSElBTkJBM1JxSWdncEF3QTNBd0FnQ0NBRU53TUFJQUJCQVdvaEFBd0FDd0FMQTBBZ0JDQUZRZ0Y5SWdWWkRRSUNRQUpBSUFBZ0FTQUVJQUpCS0dvUWhRRWlBMEVBU0EwQUlBQWdBU0FGSUFKQklHb1FoUUVpQjBFQVNBMEFBa0FnQndSQUlBQWdBU0FFSUFJcEF5QVFoZ0ZCQUVnTkFpQURSUTBCSUFBZ0FTQUZJQUlwQXlnUWhnRkJBRWdOQlNBQ1FvQ0FnSUF3TndNb0RBTUxJQU5GRFFJZ0FDQUJJQVFRK2dGQkFFZ05BU0FBSUFFZ0JTQUNLUU1vRUlZQlFRQklEUVFnQWtLQWdJQ0FNRGNES0F3Q0N5QUFJQUVnQlJENkFVRUFUZzBCQ3lBQ0tRTW9JUVlNQWdzZ0JFSUJmQ0VFREFBTEFBc2dBQ0FHRUE4Z0FDQUJFQTlDZ0lDQWdPQUFJUUVMSUFKQk1Hb2tBQ0FCQzRVQkFRRitRb0NBZ0lEZ0FDRUVJQUFnQVJBbElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFBSitRb0NBZ0lEZ0FDQUFJQUZCMndBZ0FVRUFFQlFpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2lBQUlBUVFPRVVFUUNBQUlBUVFEeUFBSUFFZ0FDQUFFTEFHREFFTElBQWdCQ0FCUVFCQkFCQXZDeUVFSUFBZ0FSQVBDeUFFQzZFREFnSi9CWDRqQUVFZ2F5SUZKQUFDZmdKQUlBQWdCU0FBSUFFUUpTSUpFRHdOQUVFc0lRWUNRQ0FDUVFCTUlBUnlSUVJBUW9DQWdJQXdJUWRCQUNFQ0lBTXBBd0FpQVVLQWdJQ0FjSU5DZ0lDQWdEQlJEUUVnQUNBQkVDZ2lCMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMENRWDhoQmlBSHB5SUNLQUlFUVFGSERRRWdBaTBBRUNFR0RBRUxRb0NBZ0lBd0lRZEJBQ0VDQ3lBQUlBVkJDR3BCQUJBOUdrSUFJUUVnQlNrREFDSUlRZ0FnQ0VJQVZSc2hDd0pBQTBBZ0FTQUxVZ1JBQWtBZ0FWQU5BQ0FHUVFCT0JFQWdCVUVJYWlBR0VEc2FEQUVMSUFWQkNHb2dBa0VBSUFJb0FnUkIvLy8vL3dkeEVGRWFDeUFBSUFrZ0FhY1FzQUVpQ0VLQWdJQ0FjSU1pQ2tLQWdJQ0FJRkVnQ2tLQWdJQ0FNRkZ5UlFSQUlBcENnSUNBZ09BQVVRMERJQVZCQ0dvZ0JBUitJQUFnQ0JEK0JBVWdDQXNRZncwREN5QUJRZ0Y4SVFFTUFRc0xJQUFnQnhBUElBQWdDUkFQSUFWQkNHb1FOZ3dDQ3lBRktBSUlLQUlRSWdKQkVHb2dCU2dDRENBQ0tBSUVFUUFBSUFBZ0J4QVBDeUFBSUFrUUQwS0FnSUNBNEFBTElRRWdCVUVnYWlRQUlBRUx4UUlDQVg4RGZpTUFRU0JySWdRa0FBSitBa0FDUUNBQUlBUkJFR29nQUNBQkVDVWlCeEE4RFFCQ2Z5RUdJQVFwQXhBaUJVSUFWdzBCSUFRZ0JVSUJmU0lCTndNSUlBSkJBazRFUUNBQUlBUkJDR29nQXlrRENFSi9JQUVnQlJCMERRRWdCQ2tEQ0NFQkN3TkFJQUZDQUZNTkFpQUFJQWNnQVNBRVFSaHFFSVVCSWdKQkFFZ05BUUpBSUFKRkRRQWdBeWtEQUNJRlFpQ0lwMEYxVHdSQUlBV25JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUZJQVFwQXhoQkFCQzhBVVVOQUNBQklRWU1Bd3NnQVVJQmZTRUJEQUFMQUFzZ0FDQUhFQTlDZ0lDQWdPQUFEQUVMSUFBZ0J4QVBJQVpDLy8vLy93K0RJQVpDZ0lDQWdBaDhRdi8vLy84UFdBMEFHa0tBZ0lDQXdINGdCcm05SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xJUUVnQkVFZ2FpUUFJQUVMNVFNQ0FuOEdmaU1BUVNCcklnUWtBQUorQWtBZ0FDQUVRUkJxSUFBZ0FSQWxJZ2dRUEEwQVFuOGhDUUpBSUFRcEF4QWlCa0lBVncwQUlBUkNBRGNEQ0NBQ1FRSk9CRUFnQUNBRVFRaHFJQU1wQXdoQ0FDQUdJQVlRZEEwQ0N3SkFBa0FnQ0NBRVFRUnFJQVFRaWdKRkJFQWdCQ2tEQ0NFQkRBRUxJQVFwQXdnaUFTQUVOUUlBSWdjZ0FTQUhWUnNoQ3lBRUtBSUVJUUlEUUNBQklBdFJEUUVnQXlrREFDSUhRaUNJcDBGMVR3UkFJQWVuSWdVZ0JTZ0NBRUVCYWpZQ0FBc2dBaUFCcDBFRGRHb3BBd0FpQ2tJZ2lLZEJkVThFUUNBS3B5SUZJQVVvQWdCQkFXbzJBZ0FMSUFBZ0J5QUtRUUFRdkFFTkFpQUJRZ0Y4SVFFTUFBc0FDeUFCSUFZZ0FTQUdWUnNoQndOQUlBRWdCMUVOQWlBQUlBZ2dBU0FFUVJocUVJVUJJZ0pCQUVnTkF5QUNCRUFnQXlrREFDSUdRaUNJcDBGMVR3UkFJQWFuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dBQ0FHSUFRcEF4aEJBQkM4QVEwQ0N5QUJRZ0Y4SVFFTUFBc0FDeUFCSVFrTElBQWdDQkFQSUFsQy8vLy8vdytESUFsQ2dJQ0FnQWg4UXYvLy8vOFBXQTBCR2tLQWdJQ0F3SDRnQ2JtOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNNQVFzZ0FDQUlFQTlDZ0lDQWdPQUFDeUVCSUFSQklHb2tBQ0FCQzY0REFnaCtBWDhqQUVFd2F5SU5KQUJDZ0lDQWdEQWhCZ0pBQWtBZ0FDQU5RUWhxSUFBZ0FSQWxJZ2NRUEFSQVFvQ0FnSUF3SVFVTUFRdENnSUNBZ0RBaEJTQUFJQU1wQXdBaUNoQmdEUUJDZ0lDQWdEQWhDU0FDUVFKT0JFQWdBeWtEQ0NFSkN5QU5LUU1JSWdWQ0FDQUZRZ0JWR3lFTEEwQWdDQ0FMVWdSQUlBZ2lCVUtBZ0lDQUNGb0VRRUtBZ0lDQXdINGdDTG05SWdWQ2dJQ0FnTUNCZ1B6L0FIMGdCVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2hCUXNnQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBZ0J5QUZFRTBpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUEwZ0FUY0RJQ0FOSUFVM0F4Z2dEU0FHTndNUUlBQWdDaUFKUVFNZ0RVRVFhaEFoSWd4Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQWlBQUlBd1FKZ1JBSUFRRVFDQUFJQVlRRHlBQUlBY1FEd3dGQ3lBQUlBVVFEeUFBSUFjUUR5QUdJUVVNQkFVZ0FDQUdFQThnQUNBRkVBOGdDRUlCZkNFSURBSUxBQXNMSUFBZ0J4QVBRdi8vLy84UFFvQ0FnSUF3SUFRYklRVU1BUXNnQUNBRkVBOGdBQ0FHRUE4Z0FDQUhFQTlDZ0lDQWdPQUFJUVVMSUExQk1Hb2tBQ0FGQzZJQ0FnTitBWDhqQUVFZ2F5SUhKQUFDUUFKQUlBQWdCMEVZYWlBQUlBRVFKU0lGRUR3TkFDQUhRZ0EzQXhBQ1FDQUNRUUZNQkVBZ0J5a0RHQ0VFREFFTElBY3BBeGdoQkNBREtRTUlJZ0ZDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFJQUFnQjBFUWFpQUJRZ0FnQkNBRUVIUU5BZ3NnQnlBRU53TUlJQUpCQTBrTkFDQURLUU1RSWdGQ2dJQ0FnSENEUW9DQWdJQXdVUTBBSUFBZ0IwRUlhaUFCUWdBZ0JDQUVFSFFOQVNBSEtRTUlJUVFMSUFRZ0J5a0RFQ0lCSUFFZ0JGTWJJUVlEUUNBQklBWlJEUUlnQXlrREFDSUVRaUNJcDBGMVR3UkFJQVNuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dBQ0FGSUFFZ0JCQ0dBVUVBU0EwQklBRkNBWHdoQVF3QUN3QUxJQUFnQlJBUFFvQ0FnSURnQUNFRkN5QUhRU0JxSkFBZ0JRdXVCQUlGZmdOL0l3QkJFR3NpQ1NRQVFvQ0FnSUF3SVFZQ1FBSkFJQUFnQVJBbElnaENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQWhDQUJDckFpSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQkJmeUVLUVg4Z0FpQUNRUUJJR3lFTEFrQURRQ0FLSUF0SEJFQWdDQ0VGSUFwQkFFNEVRQ0FESUFwQkEzUnFLUU1BSVFVTEFrQUNRQ0FGUW9DQWdJQndWQTBBQW44Z0FDQUZRZGdCSUFWQkFCQVVJZ0ZDZ0lDQWdIQ0RJZ2RDZ0lDQWdEQlNCRUFnQjBLQWdJQ0E0QUJSRFFjZ0FDQUJFQ1lNQVFzZ0FDQUZFTW9CQ3lJQ1FRQklEUVVnQWtVTkFDQUFJQWtnQlJBOERRVWdDU2tEQUNJSElBUjhRdi8vLy8vLy8vOFBWUTBFUWdBaEFTQUhRZ0FnQjBJQVZSc2hCd05BSUFFZ0IxRU5BaUFBSUFVZ0FTQUpRUWhxRUlVQklnSkJBRWdOQmlBQ0JFQWdBQ0FHSUFRZ0NTa0RDQkJxUVFCSURRY0xJQVJDQVh3aEJDQUJRZ0Y4SVFFTUFBc0FDeUFFUXY3Ly8vLy8vLzhQVlEwRElBVkNJSWluUVhWUEJFQWdCYWNpQWlBQ0tBSUFRUUZxTmdJQUN5QUFJQVlnQkNBRkVHcEJBRWdOQkNBRVFnRjhJUVFMSUFwQkFXb2hDZ3dCQ3dzZ0FDQUdRVEFnQkVLQWdJQ0FDSHhDLy8vLy93OVlCSDRnQkVMLy8vLy9ENE1GUW9DQWdJREFmaUFFdWIwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUlVFQVNBMEJEQUlMSUFCQjBOb0FRUUFRRlFzZ0FDQUdFQTlDZ0lDQWdPQUFJUVlMSUFBZ0NCQVBJQWxCRUdva0FDQUdDN0VDQWdSK0FuOGpBRUVRYXlJSUpBQkNnSUNBZ09BQUlRVUNRQUorQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweTBBQlVFUWNVVU5BQ0FJSUFLdE53TUlJQUFnQVVFQklBaEJDR29RcHdFTUFRc2dBQkErQ3lJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FrRUFJQUpCQUVvYnJTRUhRZ0FoQVFKQUEwQWdBU0FIVWdSQUlBTWdBYWRCQTNScUtRTUFJZ1pDSUlpblFYVlBCRUFnQnFjaUNTQUpLQUlBUVFGcU5nSUFDeUFBSUFRZ0FTQUdRWUNBQVJEU0FTRUpJQUZDQVh3aEFTQUpRUUJPRFFFTUFnc0xJQUFnQkVFd0lBSkJBRTRFZmlBQ3JRVkNnSUNBZ01CK0lBSzR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkZRUUJJRFFBZ0JDRUZEQUVMSUFBZ0JCQVBDeUFJUVJCcUpBQWdCUXU2Q1FJQ2Z3aCtJd0JCTUdzaUJDUUFJQU1wQXdBaEJpQUVRb0NBZ0lBd053TVlRUUVoQlFKQUFrQUNmaUFDUVFKSUJFQkNnSUNBZ0RBaERFS0FnSUNBTUF3QkMwS0FnSUNBTUNBREtRTUlJZ3hDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFHa0tBZ0lDQU1DRUtRb0NBZ0lBd0lRbENnSUNBZ0RBaENFS0FnSUNBTUNFTElBQWdEQkJnRFFGQkFDRUZRb0NBZ0lBd0lBSkJBMGtOQUJvZ0F5a0RFQXNoRFFKQUFrQUNRQUpBSUFBZ0JrSFJBU0FHUVFBUUZDSUhRb0NBZ0lCd2d5SUlRb0NBZ0lBd1VnUkFBa0FDUUNBSVFvQ0FnSURnQUZFRVFFS0FnSUNBTUNFS1FvQ0FnSUF3SVFsQ2dJQ0FnREFoQ0F3QkN5QUFJQWNRRHdKK0FrQWdBVUtBZ0lDQWNGUU5BQ0FCcHkwQUJVRVFjVVVOQUNBQUlBRkJBRUVBRUtjQkRBRUxJQUFRUGdzaUNFS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQVFvQ0FnSUF3SVFwQ2dJQ0FnREFoQ1F3QkN5QUdRaUNJcDBGMVR3UkFJQWFuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dCQ0FHTndNUUlBQWdCRUVRYWtFSWNrRUFFSmtESVFJZ0JDa0RHQ0VLSUFRcEF4QWhDU0FDUlEwQkMwS0FnSUNBTUNFTERBWUxRZ0FoQndOQUlBQWdDU0FLSUFSQkNHb1FyZ0VpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFRb0FnZ0VRRUtBZ0lDQU1DRUxEQVlMQWtBZ0JRUkFJQVloQVF3QkN5QUVJQVkzQXlBZ0JDQUhRdi8vLy84UGd6Y0RLQ0FBSUF3Z0RVRUNJQVJCSUdvUUlTRUJJQUFnQmhBUElBRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF3c2dBQ0FJSUFjZ0FSQnFRUUJJRFFJZ0IwSUJmQ0VIREFBTEFBc2dBQ0FHRUNVaUMwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ0lBQWdCRUVJYWlBTEVEeEJBRWdOQWlBRUFuNGdCQ2tEQ0NJR1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBR1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0JybTlJZ2RDZ0lDQWdNQ0JnUHovQUgwZ0IwTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElnYzNBeUFDZmdKQUlBRkNnSUNBZ0hCVURRQWdBYWN0QUFWQkVIRkZEUUFnQUNBQlFRRWdCRUVnYWhDbkFRd0JDeUFBUW9DQWdJQXdRUUVnQkVFZ2FoQ3VBd3NoQ0NBQUlBY1FEeUFJUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJDZ0lDQWdEQWhDZ3dDQzBJQUlRY2dCa0lBSUFaQ0FGVWJJUWtEUUNBSElBbFJCRUJDZ0lDQWdEQWhDa0tBZ0lDQU1DRUpEQVVMUW9DQWdJQXdJUW9nQUNBTElBY1FjeUlHUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlDUUNBRkJFQWdCaUVCREFFTElBUWdCamNESUNBRUlBZEMvLy8vL3crRE53TW9JQUFnRENBTlFRSWdCRUVnYWhBaElRRWdBQ0FHRUE4Z0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwREN5QUFJQWdnQnlBQkVHcEJBRWdOQWlBSFFnRjhJUWNNQUFzQUMwS0FnSUNBTUNFTElBbENnSUNBZ0hDRFFvQ0FnSUF3VVEwRElBQWdDVUVCRUswQkdnd0RDMEtBZ0lDQU1DRUpEQUlMUW9DQWdJQXdJUXBDZ0lDQWdEQWhDVUtBZ0lDQU1DRUlEQUVMSUFBZ0NFRXdJQWVuSWdKQkFFNEVmaUFIUXYvLy8vOFBnd1ZDZ0lDQWdNQitJQUs0dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJGUVFCT0RRRUxJQUFnQ0JBUFFvQ0FnSURnQUNFSUN5QUFJQXNRRHlBQUlBa1FEeUFBSUFvUUR5QUVRVEJxSkFBZ0NBc21BRUtBZ0lDQTRBQWdBQ0FES1FNQUVNb0JJZ0JCQUVldFFvQ0FnSUFRaENBQVFRQklHd3VBQVFBakFFRVFheUlBSkFBZ0FCQ2pCQUorSUFBMEFnZ2dBQ2tEQUVMQWhEMStmQ0lCUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FCUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQWJtOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMSVFFZ0FFRVFhaVFBSUFFTHh3SUJCWDhqQUVFZ2F5SUVKQUFnQUNBREtRTUFFQ2dpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBSUFBZ0JFRUlha0VBRUQwYUlBR25JZ1ZCRUdvaEJpQUZLQUlFUWYvLy8vOEhjU0VIUVFBaEF3TkFJQU1nQjA1RkJFQUNRQUovSUFVcEFnUkNnSUNBZ0FpRFVDSUlSUVJBSUFZZ0EwRUJkR292QVFBTUFRc2dBeUFHYWkwQUFBc2lBa0VsUncwQUFrQWdBMEVHYWlBSFNnMEFJQU5CQVdvaEFnSi9JQWhGQkVBZ0JpQUNRUUYwYWk4QkFBd0JDeUFDSUFacUxRQUFDMEgxQUVjTkFDQUZJQU5CQW1wQkJCQzRCQ0lDUVFCSURRQWdBMEVGYWlFRERBRUxRU1VoQWlBRFFRTnFJQWRLRFFBZ0JTQURRUUZxUVFJUXVBUWlBa0VsSUFKQkFFNGlDQnNoQWlBRFFRSnFJQU1nQ0JzaEF3c2dCRUVJYWlBQ0VJc0JHaUFEUVFGcUlRTU1BUXNMSUFBZ0FSQVBJQVJCQ0dvUU5pRUJDeUFFUVNCcUpBQWdBUXZrQVFFRWZ5TUFRU0JySWdJa0FDQUFJQU1wQXdBUUtDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCU0JFQWdBQ0FDUVFocUlBR25JZ1VvQWdSQi8vLy8vd2R4RUQwYUlBVkJFR29oQmlBRktBSUVRZi8vLy84SGNTRUhRUUFoQXdOQUlBTWdCMFpGQkVBQ1FBSkFBa0FnQlMwQUIwR0FBWEZGQkVBZ0F5QUdhaTBBQUNFRURBRUxJQVlnQTBFQmRHb3ZBUUFpQkVIL0FVc05BUXRCa09FQklBUkJ4UUFRK3dGRkRRQWdBa0VJYWlBRUVJc0JHZ3dCQ3lBQ1FRaHFJQVFRbWdJTElBTkJBV29oQXd3QkN3c2dBQ0FCRUE4Z0FrRUlhaEEySVFFTElBSkJJR29rQUNBQkM4NEVBZ1ovQVg0akFFRWdheUlHSkFBQ1FDQUFJQU1wQXdBUUtDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FHUVFocUlBR25JZ2tvQWdSQi8vLy8vd2R4RUQwYUlBbEJFR29oQ0VFQUlRSUNRQU5BSUFrcEFnUWlDNmRCLy8vLy93ZHhJZ29nQWtvRVFDQUNRUUZxSVFVQ1FBSkFJQXRDZ0lDQWdBaURJZ3RRQkVBZ0FpQUlhaTBBQUNFRERBRUxJQWdnQWtFQmRHb3ZBUUFpQTBIL0FVc05BUXNDUUNBRFFUQnJRUXBKSUFOQjMvOERjVUhCQUd0QkdrbHlEUUJCcFpRQklBTkJDUkQ3QVEwQUlBUU5BU0FERUxJR1JRMEJDeUFHUVFocUlBTVFpd0VhSUFVaEFnd0NDd0ovQW44Q1FDQURRWUQ0QTNFaUIwR0FzQU5IQkVBZ0IwR0F1QU5IRFFGQnY4TUFJUWNNQmd0QjVNQUFJUWNnQlNBS1RnMEZBbjhnQzFCRkJFQWdDQ0FGUVFGMGFpOEJBQXdCQ3lBRklBaHFMUUFBQ3lJRlFZREFBMnRCZ0hoSkRRVWdCa0VJYWlBRlFmOEhjU0FEUVFwMFFZRDRQM0Z5UVlDQUJHb2lBMEVTZGtId0FYSVFtZ0lnQTBFTWRrRS9jVUdBQVhJaEJ5QUNRUUpxREFFTElBTkIvd0JOQkVBZ0JrRUlhaUFERUpvQ0lBVWhBZ3dFQ3lBRFFmOFBUUVJBSUFVaEFpQURRUVoyUWNBQmNnd0NDeUFEUVF4MlFlQUJjaUVISUFVTElRSWdCa0VJYWlBSEVKb0NJQU5CQm5aQlAzRkJnQUZ5Q3lFSElBWkJDR29pQlNBSEVKb0NJQVVnQTBFL2NVR0FBWElRbWdJTUFRc0xJQUFnQVJBUElBWkJDR29RTmlFQkRBRUxJQUFnQnhDNUJDQUFJQUVRRHlBR0tBSUlLQUlRSWdCQkVHb2dCaWdDRENBQUtBSUVFUUFBUW9DQWdJRGdBQ0VCQ3lBR1FTQnFKQUFnQVF1VkJBSUdmd0YrSXdCQklHc2lCU1FBQWtBZ0FDQURLUU1BRUNnaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdCVUVJYWtFQUVEMGFJQUduSWdoQkVHb2hDVUVBSVFJRFFBSkFBa0FDUUNBSUtRSUVJZ3VuUWYvLy8vOEhjU0FDU2dSQUFuOGdDMEtBZ0lDQUNJTlFSUVJBSUFrZ0FrRUJkR292QVFBTUFRc2dBaUFKYWkwQUFBc2lBMEVsUmdSQUlBQWdDQ0FDRUxNR0lnTkJBRWdOQXlBQ1FRTnFJUVlnQTBIL0FFMEVRQ0FFQkVBZ0JpRUNEQVlMUVNVZ0F5QURFTElHSWdjYklRTWdBa0VCYWlBR0lBY2JJUUlNQlFzQ2Z5QURRV0J4UWNBQlJnUkFJQU5CSDNFaEEwR0FBU0VIUVFFTUFRc2dBMEZ3Y1VIZ0FVWUVRQ0FEUVE5eElRTkJnQkFoQjBFQ0RBRUxJQU5CZUhGQjhBRkhCRUJCQVNFSFFRQWhBMEVBREFFTElBTkJCM0VoQTBHQWdBUWhCMEVEQ3lFQ0EwQWdBa0VBVEEwRElBQWdDQ0FHRUxNR0lncEJBRWdOQkNBR1FRTnFJUVlnQ2tIQUFYRkJnQUZIQkVCQkFDRUREQVFGSUFKQkFXc2hBaUFLUVQ5eElBTkJCblJ5SVFNTUFRc0FDd0FMSUFKQkFXb2hBZ3dEQ3lBQUlBRVFEeUFGUVFocUVEWWhBUXdFQ3lBR0lRSWdBeUFIU0NBRFFmLy93d0JLY2tVZ0EwR0FjSEZCZ0xBRFIzRU5BU0FBUWNtSkFSQzVCQXNnQUNBQkVBOGdCU2dDQ0NnQ0VDSUFRUkJxSUFVb0Fnd2dBQ2dDQkJFQUFFS0FnSUNBNEFBaEFRd0NDeUFGUVFocUlBTVF1UUVhREFBTEFBc2dCVUVnYWlRQUlBRUxOd0FnQUNBREtRTUFFTE1CSWdKRkJFQkNnSUNBZ09BQUR3c2dBQ0FDRUlFQ0lBSnFRUUJCQ2tFQUVMZ0NJUUVnQUNBQ0VGUWdBUXVIQVFFQmZ5TUFRUkJySWdJa0FBSkFJQUFnQXlrREFCQ3pBU0lFUlFSQVFvQ0FnSURnQUNFQkRBRUxBbjVDZ0lDQWdPQUFJQUFnQWtFTWFpQURLUU1JRUhjTkFCb2dBaWdDRENJREJFQkNnSUNBZ01CK0lBTkJKV3RCWFVrTkFSb0xJQUFnQkJDQkFpQUVha0VBSUFOQmdRZ1F1QUlMSVFFZ0FDQUVFRlFMSUFKQkVHb2tBQ0FCQ3drQUlBQWdBUkRkQWd1akFRSUJmZ0YvSXdCQkVHc2lBaVFBQW40Z0FDQUJFTjBDSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBRkRBRUxRUW9oQmdKQUFrQWdCQTBBSUFNcEF3QWlBVUtBZ0lDQWNJTkNnSUNBZ0RCUkRRQWdBQ0FCRUk0RklnWkJBRWdOQVF0Q2dJQ0FnT0FBSUFBZ0FrRUlhaUFGRUc0TkFSb2dBQ0FDS3dNSUlBWkJBRUVBRUk4Q0RBRUxJQUFnQlJBUFFvQ0FnSURnQUFzaEFTQUNRUkJxSkFBZ0FRdU1BZ0lCZmdGOEl3QkJFR3NpQWlRQVFvQ0FnSURnQUNFRUFrQWdBQ0FCRU4wQ0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUVFNQVFzZ0FDQUNJQUVRYmcwQUFrQUNRQ0FES1FNQUlnRkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBSXBBd0FoQVF3QkN5QUFJQUpCREdvZ0FSQzZBUTBDSUFJckF3QWlCYjBpQVVLQWdJQ0FnSUNBK1A4QWcwS0FnSUNBZ0lDQStQOEFVZzBCQ3lBQVFvQ0FnSURBZmlBQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJFRGNoQkF3QkN5QUNLQUlNSWdOQjVRQnJRWnQvVFFSQUlBQkJpalJCQUJCUURBRUxJQUFnQlVFS0lBTkJBUkNQQWlFRUN5QUNRUkJxSkFBZ0JBdllBUUlCZmdGOEl3QkJFR3NpQWlRQVFvQ0FnSURnQUNFRUFrQWdBQ0FCRU4wQ0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUVFNQVFzZ0FDQUNJQUVRYmcwQUlBQWdBa0VNYWlBREtRTUFFTG9CRFFBZ0FpZ0NEQ0lEUWVVQVR3UkFJQUJCaWpSQkFCQlFEQUVMSUFJckF3QWlCWmxFVU8vaTF1UWFTMFJtQkVBZ0FFS0FnSUNBd0g0Z0JiMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3hBM0lRUU1BUXNnQUNBRlFRb2dBMEVDRUk4Q0lRUUxJQUpCRUdva0FDQUVDejBBQW40Q1FDQUJFS01ESWdKRkRRQWdBaTBBRUVFQmNRMEFRb0NBZ0lBd0lBSXRBQkZCQVhFTkFSb0xJQUJCc2pSQkFCQVZRb0NBZ0lEZ0FBc0x6UU1EQlh3QmZnTi9Ba0FDUUFKQUFrQWdBTDBpQmtJQVdRUkFJQVpDSUlpbklnZEIvLzgvU3cwQkN5QUdRdi8vLy8vLy8vLy8vd0NEVUFSQVJBQUFBQUFBQVBDL0lBQWdBS0tqRHdzZ0JrSUFXUTBCSUFBZ0FLRkVBQUFBQUFBQUFBQ2pEd3NnQjBILy83Ly9CMHNOQWtHQWdNRC9BeUVJUVlGNElRa2dCMEdBZ01EL0EwY0VRQ0FISVFnTUFnc2dCcWNOQVVRQUFBQUFBQUFBQUE4TElBQkVBQUFBQUFBQVVFT2l2U0lHUWlDSXB5RUlRY3QzSVFrTElBWkMvLy8vL3crRElBaEI0cjRsYWlJSFFmLy9QM0ZCbnNHYS93TnFyVUlnaG9TL1JBQUFBQUFBQVBDL29DSUFJQUFnQUVRQUFBQUFBQURnUDZLaUlnT2h2VUtBZ0lDQWNJTy9JZ1JFQUFBZ1pVY1Y5eitpSWdFZ0NTQUhRUlIyYXJjaUFxQWlCU0FCSUFJZ0JhR2dJQUFnQUVRQUFBQUFBQUFBUUtDaklnRWdBeUFCSUFHaUlnSWdBcUlpQVNBQklBRkVuOFo0MEFtYXd6K2lSSzk0amgzRmNjdy9vS0pFQlBxWG1abVoyVCtnb2lBQ0lBRWdBU0FCUkVSU1B0OFM4Y0kvb2tUZUE4dVdaRWJIUDZDaVJGbVRJcFFrU2RJL29LSkVrMVZWVlZWVjVUK2dvcUNnb2lBQUlBU2hJQU9ob0NJQUlBU2dSQUNpN3k3OEJlYzlvaUFBUkFBQUlHVkhGZmMvb3FDZ29DRUFDeUFBQ3d2bHVnUmxBRUdBQ0F0dy9vSXJaVWNWWjBBQUFBQUFBQUE0UXdBQSt2NUNMbmEvT2p1ZXZKcjNETDI5L2YvLy8vL2ZQenhVVlZWVlZjVS9rU3NYejFWVnBUOFgwS1JuRVJHQlB3QUFBQUFBQU1oQzd6bjYva0l1NWo4a3hJTC92Yi9PUDdYMEROY0lhNncvekZCRzBxdXlneitFT2s2YjROZFZQd0JCL2dnTGtoRHdQMjYvaUJwUE81czhOVFA3cVQzMjd6OWQzTmljRTJCeHZHR0FkejZhN084LzBXYUhFSHBla0x5RmYyN29GZVB2UHhQMlp6VlMwb3c4ZElVVjA3RFo3ei82anZramdNNkx2TjcyM1NscjBPOC9ZY2ptWVU3M1lEekltM1VZUmNmdlA1blRNMXZrbzVBOGcvUEd5ajYrN3o5dGU0TmRwcHFYUEErSitXeFl0ZTgvL08vOWtocTFqanozUjNJcmtxenZQOUdjTDNBOXZqNDhvdEhUTXV5ajd6OExicENKTkFOcXZCdlQvcTltbSs4L0RyMHZLbEpXbGJ4Uld4TFFBWlB2UDFYcVRvenZnRkM4ekRGc3dMMks3ejhXOU5XNUk4bVJ2T0F0cWE2YWd1OC9yMVZjNmVQVGdEeFJqcVhJbUhydlAwaVRwZW9WRzRDOGUxRjlQTGh5N3o4OU10NVY4QitQdk9xTmpEajVhdTgvdjFNVFA0eUppengxeTIvclcyUHZQeWJyRVhhYzJaYTgxRndFaE9CYjd6OWdMem8rOSt5YVBLcTVhREdIVk84L25UaUd5NExuajd3ZDJmd2lVRTN2UDQzRHBrUkJiNG84MW94aWlEdEc3ejk5Qk9Td0JYcUFQSmJjZlpGSlArOC9sS2lvNC8yT2xqdzRZblZ1ZWpqdlAzMUlkUElZWG9jOFA2YXlUODR4N3oveTV4K1lLMGVBUE4xODRtVkZLKzgvWGdoeFAzdTRscnlCWS9YaDN5VHZQekdyQ1czaDk0STg0ZDRmOVowZTd6LzZ2MjhhbXlFOXZKRFoydEIvR084L3RBb01jb0kzaXp3TEErU21oUkx2UDQvTHpvbVNGRzQ4Vmk4K3FhOE03eisycTdCTmRVMkRQQlczTVFyK0J1OC9USFNzNGdGQ2hqd3gyRXo4Y0FIdlAwcjQwMTA1M1k4OC94WmtzZ2o4N2o4RVc0NDdnS09HdlBHZmtsL0Y5dTQvYUZCTHpPMUtrcnpMcVRvM3AvSHVQNDR0VVJ2NEI1bThadGdGYmE3czdqL1NOcFErNk5GeHZQZWY1VFRiNSs0L0ZSdk9zeGtabWJ6bHFCUERMZVB1UDIxTUtxZEluNFU4SWpRU1RLYmU3aitLYVNoNllCS1R2QnlBckFSRjJ1NC9XNGtYU0krbldMd3FMdmNoQ3RidVB4dWFTV2ViTEh5OGw2aFEyZlhSN2o4UnJNSmc3V05EUEMySllXQUl6dTQvNzJRR093bG1sanhYQUIzdFFjcnVQM2tEb2RyaHpHNDgwRHpCdGFMRzdqOHdFZzgvanYrVFBON1QxL0Fxdys0L3NLOTZ1ODZRZGp3bktqYlYyci91UDNmZ1ZPdTlIWk04RGQzOW1iSzg3aitPbzNFQU5KU1B2S2NzblhheXVlNC9TYU9UM016ZWg3eENacytpMnJidVAxODRENzNHM25pOGdrK2RWaXUwN2ovMlhIdnNSaEtHdkErU1hjcWtzZTQvanRmOUdBVTFrenphSjdVMlI2L3VQd1diaWkrM21IczgvY2VYMUJLdDdqOEpWQnppNFdPUVBDbFVTTjBIcSs0LzZzWVpVSVhITkR5M1JsbUtKcW51UHpYQVpDdm1NcFE4U0NHdEZXK243aitmZHBsaFN1U012QW5jZHJuaHBlNC9xRTN2TzhVempMeUZWVHF3ZnFUdVA2N3BLNGw0VTRTOElNUE1ORWFqN2o5WVdGWjQzYzZUdkNVaVZZSTRvdTQvWkJsK2dLb1FWenh6cVV6VVZhSHVQeWdpWHIvdnM1Tzh6VHQvWnA2ZzdqK0N1VFNIclJKcXZML2FDM1VTb080LzdxbHR1TzluWTd3dkdtVThzcC91UDFHSTRGUTkzSUM4aEpSUitYMmY3ai9QUGxwK1pCOTR2SFJmN09oMW4rNC9zSDJMd0VydWhyeDBnYVZJbXAvdVA0cm1WUjR5R1lhOHlXZENWdXVmN2ovVDFBbGV5NXlRUEQ5ZDNrOXBvTzQvSGFWTnVkd3llN3lIQWV0ekZLSHVQMnZBWjFUOTdKUThNc0V3QWUyaDdqOVZiTmFyNGV0bFBHSk96emJ6b3U0L1FzK3pMOFdoaUx3U0dqNVVKNlR1UHpRM08vRzJhWk84RTg1TW1ZbWw3ajhlL3hrNmhGNkF2SzNISTBZYXArNC9ibGR5MkZEVWxMenRra1NiMmFqdVB3Q0tEbHRuclpBOG1XYUsyY2VxN2orMDZ2REJMN2VOUE51Z0trTGxyTzQvLytmRm5HQzJaYnlNUkxVV01xL3VQMFJmODFtRDluczhObmNWbWE2eDdqK0RQUjZuSHdtVHZNYi9rUXRidE80L0tSNXNpN2lwWGJ6bHhjMndON2Z1UDFtNWtIejVJMnk4RDFMSXkwUzY3aitxK2ZRaVEwT1N2RkJPM3ArQ3ZlNC9TNDVtMTJ6S2hieTZCOHB3OGNEdVB5Zk9rU3Y4cjNFOGtQQ2pncEhFN2orN2N3cmhOZEp0UENNajR4bGp5TzQvWXlKaUlnVEZoN3hsNVYxN1pzenVQOVV4NHVPR0hJczhNeTFLN0p2UTdqOFZ1N3pUMGJ1UnZGMGxQcklEMWU0LzBqSHVuREhNa0R4WXN6QVRudG51UDdOYWMyNkVhWVE4di8xNVZXdmU3aiswblk2WHpkK0N2SHJ6MDc5cjQrNC9oelBMa25jYWpEeXQwMXFabitqdVAvclowVXFQZTVDOFpyYU5LUWZ1N2orNnJ0eFcyY05WdlBzVlQ3aWk4KzQvUVBhbVBRNmtrTHc2V2VXTmN2bnVQelNUclRqMDFtaThSMTc3OG5iLzdqODFpbGhyNHU2UnZFb0dvVEN3QmU4L3pkMWZDdGYvZER6U3dVdVFIZ3p2UDZ5WWt2cjd2Wkc4Q1I3WFc4SVM3eit6REs4d3JtNXpQSnhTaGQyYkdlOC9sUDJmWERMampqeDYwUDlmcXlEdlA2eFpDZEdQNElROFM5RlhMdkVuN3o5bkdrNDRyODFqUExYbkJwUnRMKzgvYUJtU2JDeHJaenhwa08vY0lEZnZQOUsxeklNWWlvQzgrc05kVlFzLzd6OXYrdjgvWGEyUHZIeUpCMG90Uis4L1NhbDFPSzROa0x6eWlRMEloMC92UDZjSFBhYUZvM1E4aDZUNzNCaFk3ejhQSWtBZ25wR0N2SmlEeVJiallPOC9ySkxCMVZCYWpqeUZNdHNENW1udlAwdHJBYXhaT29ROFlMUUI4eUZ6N3o4ZlByUUhJZFdDdkYrYmV6T1hmTzgveVExSE83a3FpYndwb2ZVVVJvYnZQOU9JT21BRXRuUTg5aitMNXk2UTd6OXhjcDFSN01XRFBJTk14L3RSbXU4LzhKSFRqeEwzajd6YWtLU2lyNlR2UDMxMEkrS1lybzI4OFdlT0xVaXY3ejhJSUtwQnZNT09QQ2RhWWU0YnV1OC9NdXVwdzVRcmhEeVh1bXMzSzhYdlArNkYwVEdwWklvOFFFVnVXM2JRN3ovdDR6dmt1amVPdkJTK25LMzkyKzgvbmMyUlRUdUpkenpZa0o2QndlZnZQNG5NWUVIQkJWTTg4WEdQSzhMejd6OEFBQUFBQUFEd1B3QUFBQUFBQVBnL0FBQUFBQUFBQUFBRzBNOUQ2LzFNUGdCQm14a0w1NFVCUUFPNDRqOG9LWHQ5QUNncGUzTjFjR1Z5S0M0dUxtRnlaM1Z0Wlc1MGN5azdmUUFvS1NCN0NpQWdJQ0JiYm1GMGFYWmxJR052WkdWZENuMEFZMkZ1Ym05MElHMXBlQ0EvUHlCM2FYUm9JQ1ltSUc5eUlIeDhBR04wZWdCd2NtOTRlVG9nY0hKdmNHVnlkSGtnYm05MElIQnlaWE5sYm5RZ2FXNGdkR0Z5WjJWMElIZGxjbVVnY21WMGRYSnVaV1FnWW5rZ2JtOXVJR1Y0ZEdWdWMybGliR1VnY0hKdmVIa0FjbVYyYjJ0bFpDQndjbTk0ZVFCUWNtOTRlUUJoWkdSZmNISnZjR1Z5ZEhrQWNISnZlSGs2SUdOaGJtNXZkQ0J6WlhRZ2NISnZjR1Z5ZEhrQWJtOGdjMlYwZEdWeUlHWnZjaUJ3Y205d1pYSjBlUUIyWVd4MVpTQm9ZWE1nYm04Z2NISnZjR1Z5ZEhrQVkyOTFiR1FnYm05MElHUmxiR1YwWlNCd2NtOXdaWEowZVFCd2NtOTRlVG9nWkhWd2JHbGpZWFJsSUhCeWIzQmxjblI1QUVwVFgwUmxabWx1WlVGMWRHOUpibWwwVUhKdmNHVnlkSGtBYUdGelQzZHVVSEp2Y0dWeWRIa0FjSEp2ZUhrNklHbHVZMjl1YzJsemRHVnVkQ0JrWld4bGRHVlFjbTl3WlhKMGVRQndjbTk0ZVRvZ2FXNWpiMjV6YVhOMFpXNTBJR1JsWm1sdVpWQnliM0JsY25SNUFFcFRYMFJsWm1sdVpWQnliM0JsY25SNUFDRnRjaTArWlcxd2RIa0FhVzVtYVc1cGRIa0FTVzVtYVc1cGRIa0FiM1YwSUc5bUlHMWxiVzl5ZVFCMWJtdHViM2R1SUhWdWFXTnZaR1VnWjJWdVpYSmhiQ0JqWVhSbFoyOXllUUJIWlc1bGNtRnNYME5oZEdWbmIzSjVBR1YyWlhKNUFHRnVlUUJoY0hCc2VRQW5KWE1uSUdseklISmxZV1F0YjI1c2VRQmxlSEJsWTNScGJtY2dZMkYwWTJnZ2IzSWdabWx1WVd4c2VRQnpkR2xqYTNrQVltbG5hVzUwSUdGeVpTQm1iM0ppYVdSa1pXNGdhVzRnU2xOUFRpNXpkSEpwYm1kcFpua0FjM1ZpWVhKeVlYa0FaVzF3ZEhrZ1lYSnlZWGtBYm05dUlHbHVkR1ZuWlhJZ2FXNWtaWGdnYVc0Z2RIbHdaV1FnWVhKeVlYa0FibVZuWVhScGRtVWdhVzVrWlhnZ2FXNGdkSGx3WldRZ1lYSnlZWGtBYjNWMExXOW1MV0p2ZFc1a0lHbHVaR1Y0SUdsdUlIUjVjR1ZrSUdGeWNtRjVBR05oYm01dmRDQmpjbVZoZEdVZ2JuVnRaWEpwWXlCcGJtUmxlQ0JwYmlCMGVYQmxaQ0JoY25KaGVRQnBjMEZ5Y21GNUFGUjVjR1ZrUVhKeVlYa0FaMlYwUkdGNUFHZGxkRlZVUTBSaGVRQnFjMTluWlhSZllYUnZiVjlwYm1SbGVBQnBiblpoYkdsa0lHRnljbUY1SUdsdVpHVjRBRzkxZEMxdlppMWliM1Z1WkNCdWRXMWxjbWxqSUdsdVpHVjRBRXBUWDBGMGIyMUpjMEZ5Y21GNVNXNWtaWGdBWm1sdVpFbHVaR1Y0QUdsdWRtRnNhV1FnWlhod2IzSjBJSE41Ym5SaGVBQnBiblpoYkdsa0lHRnpjMmxuYm0xbGJuUWdjM2x1ZEdGNEFHMWhlQUJjZFNVd05IZ0FhVzUyWVd4cFpDQnZjR052WkdVNklIQmpQU1YxSUc5d1kyOWtaVDB3ZUNVd01uZ0FMU3NnSUNBd1dEQjRBQzB3V0Nzd1dDQXdXQzB3ZUNzd2VDQXdlQUJzYVc1bElIUmxjbTFwYm1GMGIzSWdibTkwSUdGc2JHOTNaV1FnWVdaMFpYSWdkR2h5YjNjQVltWmZjRzkzQUc1dmR3QnBiblJsWjJWeUlHOTJaWEptYkc5M0FITjBZV05ySUc5MlpYSm1iRzkzQUcxMWMzUWdZbVVnWTJGc2JHVmtJSGRwZEdnZ2JtVjNBR2x6Vm1sbGR3QkVZWFJoVm1sbGR3QnlZWGNBZEdScGRnQm1aR2wyQUdWa2FYWUFZMlJwZGdBbGRRQmpiR0Z6Y3lCa1pXTnNZWEpoZEdsdmJuTWdZMkZ1SjNRZ1lYQndaV0Z5SUdsdUlITnBibWRzWlMxemRHRjBaVzFsYm5RZ1kyOXVkR1Y0ZEFCbWRXNWpkR2x2YmlCa1pXTnNZWEpoZEdsdmJuTWdZMkZ1SjNRZ1lYQndaV0Z5SUdsdUlITnBibWRzWlMxemRHRjBaVzFsYm5RZ1kyOXVkR1Y0ZEFCc1pYaHBZMkZzSUdSbFkyeGhjbUYwYVc5dWN5QmpZVzRuZENCaGNIQmxZWElnYVc0Z2MybHVaMnhsTFhOMFlYUmxiV1Z1ZENCamIyNTBaWGgwQUdSMWNHeHBZMkYwWlNCaGNtZDFiV1Z1ZENCdVlXMWxjeUJ1YjNRZ1lXeHNiM2RsWkNCcGJpQjBhR2x6SUdOdmJuUmxlSFFBWkhWd2JHbGpZWFJsSUhCaGNtRnRaWFJsY2lCdVlXMWxjeUJ1YjNRZ1lXeHNiM2RsWkNCcGJpQjBhR2x6SUdOdmJuUmxlSFFBYVcxd2IzSjBMbTFsZEdFZ2JtOTBJSE4xY0hCdmNuUmxaQ0JwYmlCMGFHbHpJR052Ym5SbGVIUUFTbE5mUm5KbFpVTnZiblJsZUhRQVNsTkRiMjUwWlhoMEFHcHpYMjFoY0Y5cGRHVnlZWFJ2Y2w5dVpYaDBBR3B6WDJGemVXNWpYMmRsYm1WeVlYUnZjbDl5WlhOMWJXVmZibVY0ZEFCMWJtVjRjR1ZqZEdWa0lHVnVaQ0J2WmlCcGJuQjFkQUIwZEFCbGVIQnZjblJsWkNCMllYSnBZV0pzWlNBbkpYTW5JR1J2WlhNZ2JtOTBJR1Y0YVhOMEFIQnlhWFpoZEdVZ1kyeGhjM01nWm1sbGJHUWdKeVZ6SnlCa2IyVnpJRzV2ZENCbGVHbHpkQUIwWlhOMEFHRnpjMmxuYm0xbGJuUWdjbVZ6ZENCd2NtOXdaWEowZVNCdGRYTjBJR0psSUd4aGMzUUFZbVpmYzNGeWRBQnpiM0owQUdOaWNuUUFkSEpwYlZOMFlYSjBBSEJoWkZOMFlYSjBBSFZ1YTI1dmQyNGdkVzVwWTI5a1pTQnpZM0pwY0hRQVUyTnlhWEIwQUdoNWNHOTBBR1p5WldWZmVtVnliMTl5WldaamIzVnVkQUJtWVhOMFgyRnljbUY1WDJOdmRXNTBBR0pwYm1GeWVWOXZZbXBsWTNSZlkyOTFiblFBYzNSeVgybHVaR1Y0SUQwOUlHNTFiVjlyWlhselgyTnZkVzUwSUNzZ2MzUnlYMnRsZVhOZlkyOTFiblFBYm5WdFgybHVaR1Y0SUQwOUlHNTFiVjlyWlhselgyTnZkVzUwQUhOMGNsOWpiM1Z1ZEFCd2NtOXdYMk52ZFc1MEFITjViVjlwYm1SbGVDQTlQU0JoZEc5dFgyTnZkVzUwQUd4aFltVnNJRDQ5SURBZ0ppWWdiR0ZpWld3Z1BDQnpMVDVzWVdKbGJGOWpiM1Z1ZEFCc1lXSXhJRDQ5SURBZ0ppWWdiR0ZpTVNBOElITXRQbXhoWW1Wc1gyTnZkVzUwQUc5aWFsOWpiM1Z1ZEFCMllXd2dQQ0J6TFQ1allYQjBkWEpsWDJOdmRXNTBBSFpoYkRJZ1BDQnpMVDVqWVhCMGRYSmxYMk52ZFc1MEFITm9ZWEJsWDJOdmRXNTBBR3B6WDJaMWJtTmZjR015YkdsdVpWOWpiM1Z1ZEFCdFpXMXZjbmxmZFhObFpGOWpiM1Z1ZEFCdFlXeHNiMk5mWTI5MWJuUUFhbk5mWm5WdVkxOWpiM1Z1ZEFCalgyWjFibU5mWTI5MWJuUUFhVzUyWVd4cFpDQnlaWEJsWVhRZ1kyOTFiblFBYVc1MllXeHBaQ0J5WlhCbGRHbDBhVzl1SUdOdmRXNTBBR1p2Ym5RQWFXNTJZV3hwWkNCamIyUmxJSEJ2YVc1MEFHWnliMjFEYjJSbFVHOXBiblFBYVc1MllXeHBaQ0JvYVc1MEFHTmhibTV2ZENCamIyNTJaWEowSUU1aFRpQnZjaUJKYm1acGJtbDBlU0IwYnlCaWFXZHBiblFBWTJGdWJtOTBJR052Ym5abGNuUWdkRzhnWW1sbmFXNTBBR0p2ZEdnZ2IzQmxjbUZ1WkhNZ2JYVnpkQ0JpWlNCaWFXZHBiblFBYm05MElHRWdZbWxuYVc1MEFHVnVZMjlrWlZWU1NVTnZiWEJ2Ym1WdWRBQmtaV052WkdWVlVrbERiMjF3YjI1bGJuUUFkVzVsZUhCbFkzUmxaQ0JsYm1RZ2IyWWdZMjl0YldWdWRBQnBiblpoYkdsa0lITjNhWFJqYUNCemRHRjBaVzFsYm5RQVFtbG5TVzUwQUhCaGNuTmxTVzUwQUdSMWNHeHBZMkYwWlNCa1pXWmhkV3gwQUcxaGJHeHZZMTlzYVcxcGRBQnpjR3hwZEFCbGVIQmxZM1JwYm1jZ2FHVjRJR1JwWjJsMEFIUnlhVzFTYVdkb2RBQnlaV1IxWTJWU2FXZG9kQUIxYm5Ob2FXWjBBSFJ5YVcxTVpXWjBBR2x1ZG1Gc2FXUWdiMlptYzJWMEFHbHVkbUZzYVdRZ1lubDBaVTltWm5ObGRBQm5aWFJVYVcxbGVtOXVaVTltWm5ObGRBQnlaWE52YkhacGJtY2dablZ1WTNScGIyNGdZV3h5WldGa2VTQnpaWFFBY0hKdmVIazZJR2x1WTI5dWMybHpkR1Z1ZENCelpYUUFabWx1WkY5cWRXMXdYM1JoY21kbGRBQmxlSEJsWTNScGJtY2dkR0Z5WjJWMEFHbHVkbUZzYVdRZ1pHVnpkSEoxWTNSMWNtbHVaeUIwWVhKblpYUUFjSEp2ZUhrNklHbHVZMjl1YzJsemRHVnVkQ0JuWlhRQVYyVmhhMU5sZEFCamIyNXpkSEoxWTNRQVNsTmZSbkpsWlVGMGIyMVRkSEoxWTNRQWRYTmxJSE4wY21samRBQlNaV1pzWldOMEFISmxhbVZqZEFCdWIzUWdZVzRnUVhONWJtTkhaVzVsY21GMGIzSWdiMkpxWldOMEFHTmhibTV2ZENCamIyNTJaWEowSUhSdklHOWlhbVZqZEFCcGJuWmhiR2xrSUdKeVlXNWtJRzl1SUc5aWFtVmpkQUJ2Y0dWeVlXNWtJQ2R3Y205MGIzUjVjR1VuSUhCeWIzQmxjblI1SUdseklHNXZkQ0JoYmlCdlltcGxZM1FBY21WalpXbDJaWElnYVhNZ2JtOTBJR0Z1SUc5aWFtVmpkQUJwZEdWeVlYUnZjaUJ0ZFhOMElISmxkSFZ5YmlCaGJpQnZZbXBsWTNRQWJtOTBJR0VnUkdGMFpTQnZZbXBsWTNRQWJtOTBJR0VnYjJKcVpXTjBBRXBUVDJKcVpXTjBBR0pwWjJac2IyRjBBSEJoY25ObFJteHZZWFFBWm14aGRBQnViM1JvYVc1bklIUnZJSEpsY0dWaGRBQmpiMjVqWVhRQVkyOWtaVkJ2YVc1MFFYUUFZMmhoY2tGMEFHTm9ZWEpEYjJSbFFYUUFhMlY1Y3dCd2NtOTRlVG9nZEdGeVoyVjBJSEJ5YjNCbGNuUjVJRzExYzNRZ1ltVWdjSEpsYzJWdWRDQnBiaUJ3Y205NGVTQnZkMjVMWlhsekFDQWdabUZ6ZENCaGNuSmhlWE1BWlhod2IzSjBJQ2NsY3ljZ2FXNGdiVzlrZFd4bElDY2xjeWNnYVhNZ1lXMWlhV2QxYjNWekFIQnlhWFpoZEdVZ1kyeGhjM01nWm1sbGJHUWdKeVZ6SnlCaGJISmxZV1I1SUdWNGFYTjBjd0IwYjI4Z2JXRnVlU0JoY21kMWJXVnVkSE1BVkc5dklHMWhibmtnWTJGc2JDQmhjbWQxYldWdWRITUFabUZ6ZEY5aGNuSmhlVjlsYkdWdFpXNTBjd0FnSUdWc1pXMWxiblJ6QUdsdWRtRnNhV1FnYm5WdFltVnlJRzltSUdScFoybDBjd0JpYVc1aGNua2diMkpxWldOMGN3QnBiblpoYkdsa0lIQnliM0JsY25SNUlHRmpZMlZ6Y3dCcWMxOXZjRjlrWldacGJtVmZZMnhoYzNNQVptUXRQbUo1ZEdWZlkyOWtaUzVpZFdaYlpHVm1hVzVsWDJOc1lYTnpYM0J2YzEwZ1BUMGdUMUJmWkdWbWFXNWxYMk5zWVhOekFGOWZaMlYwUTJ4aGMzTUFjMlYwU0c5MWNuTUFaMlYwU0c5MWNuTUFjMlYwVlZSRFNHOTFjbk1BWjJWMFZWUkRTRzkxY25NQVoyVjBUM2R1VUhKdmNHVnlkSGxFWlhOamNtbHdkRzl5Y3dCMGIyOGdiV0Z1ZVNCcGJXSnlhV05oZEdWa0lIRjFZVzUwYVdacFpYSnpBSFZ1YVdOdlpHVmZjSEp2Y0Y5dmNITUFZV052Y3dCbWIzSWdZWGRoYVhRZ2FYTWdiMjVzZVNCMllXeHBaQ0JwYmlCaGMzbHVZMmh5YjI1dmRYTWdablZ1WTNScGIyNXpBRzVsZHk1MFlYSm5aWFFnYjI1c2VTQmhiR3h2ZDJWa0lIZHBkR2hwYmlCbWRXNWpkR2x2Ym5NQVlubDBaV052WkdVZ1puVnVZM1JwYjI1ekFFTWdablZ1WTNScGIyNXpBSEJ5YjNoNU9pQnBibU52Ym5OcGMzUmxiblFnY0hKbGRtVnVkRVY0ZEdWdWMybHZibk1BVTJOeWFYQjBYMFY0ZEdWdWMybHZibk1BWVhSdmJYTUFjSEp2ZUhrNklIQnliM0JsY25ScFpYTWdiWFZ6ZENCaVpTQnpkSEpwYm1keklHOXlJSE41YldKdmJITUFaMlYwVDNkdVVISnZjR1Z5ZEhsVGVXMWliMnh6QUhKbGMyOXNkbVZmYkdGaVpXeHpBRXBUWDBWMllXeFVhR2x6QUhOMGNtbHVaM01BYVc1MllXeHBaQ0JrWlhOamNtbHdkRzl5SUdac1lXZHpBR2x1ZG1Gc2FXUWdjbVZuZFd4aGNpQmxlSEJ5WlhOemFXOXVJR1pzWVdkekFIWmhiSFZsY3dCelpYUk5hVzUxZEdWekFHZGxkRTFwYm5WMFpYTUFjMlYwVlZSRFRXbHVkWFJsY3dCblpYUlZWRU5OYVc1MWRHVnpBSFJ2YnlCdFlXNTVJR05oY0hSMWNtVnpBQ0FnYzJoaGNHVnpBR2RsZEU5M2JsQnliM0JsY25SNVRtRnRaWE1BWjJOZlpuSmxaVjlqZVdOc1pYTUFZV1JrWDJWMllXeGZkbUZ5YVdGaWJHVnpBSEpsYzI5c2RtVmZkbUZ5YVdGaWJHVnpBSFJ2YnlCdFlXNTVJR3h2WTJGc0lIWmhjbWxoWW14bGN3QjBiMjhnYldGdWVTQmpiRzl6ZFhKbElIWmhjbWxoWW14bGN3QmpiMjF3WVdOMFgzQnliM0JsY25ScFpYTUFJQ0J3Y205d1pYSjBhV1Z6QUdSbFptbHVaVkJ5YjNCbGNuUnBaWE1BWlc1MGNtbGxjd0JtY205dFJXNTBjbWxsY3dCMGIyOGdiV0Z1ZVNCeVlXNW5aWE1BYVc1amJIVmtaWE1BYzJWMFRXbHNiR2x6WldOdmJtUnpBR2RsZEUxcGJHeHBjMlZqYjI1a2N3QnpaWFJWVkVOTmFXeHNhWE5sWTI5dVpITUFaMlYwVlZSRFRXbHNiR2x6WldOdmJtUnpBSE5sZEZObFkyOXVaSE1BWjJWMFUyVmpiMjVrY3dCelpYUlZWRU5UWldOdmJtUnpBR2RsZEZWVVExTmxZMjl1WkhNQWFYUmhiR2xqY3dCaFluTUFjSEp2ZUhrNklHbHVZMjl1YzJsemRHVnVkQ0JvWVhNQUpTNHFjd0FnS0NWekFITmxkQ0FsY3dCblpYUWdKWE1BSUNBZ0lHRjBJQ1Z6QUc1dklHOTJaWEpzYjJGa1pXUWdiM0JsY21GMGIzSWdKWE1BYm05MElHRWdKWE1BZFc1emRYQndiM0owWldRZ2EyVjVkMjl5WkRvZ0pYTUFjM1ZpYzNSeUFIQnliM2g1T2lCcGJtTnZibk5wYzNSbGJuUWdaMlYwVDNkdVVISnZjR1Z5ZEhsRVpYTmpjbWx3ZEc5eUFITjFjR1Z5S0NrZ2FYTWdiMjVzZVNCMllXeHBaQ0JwYmlCaElHUmxjbWwyWldRZ1kyeGhjM01nWTI5dWMzUnlkV04wYjNJQWNHRnlaVzUwSUdOc1lYTnpJRzExYzNRZ1ltVWdZMjl1YzNSeWRXTjBiM0lBYm05MElHRWdZMjl1YzNSeWRXTjBiM0lBUVhKeVlYa2dTWFJsY21GMGIzSUFVMlYwSUVsMFpYSmhkRzl5QUUxaGNDQkpkR1Z5WVhSdmNnQlNaV2RGZUhBZ1UzUnlhVzVuSUVsMFpYSmhkRzl5QUc1dmRDQmhiaUJCYzNsdVl5MW1jbTl0TFZONWJtTWdTWFJsY21GMGIzSUFZMkZ1Ym05MElHbHVkbTlyWlNCaElISjFibTVwYm1jZ1oyVnVaWEpoZEc5eUFHNXZkQ0JoSUdkbGJtVnlZWFJ2Y2dCQmMzbHVZMGRsYm1WeVlYUnZjZ0J6ZVc1MFlYZ2daWEp5YjNJQVUzbHVkR0Y0UlhKeWIzSUFSWFpoYkVWeWNtOXlBRWx1ZEdWeWJtRnNSWEp5YjNJQVFXZG5jbVZuWVhSbFJYSnliM0lBVkhsd1pVVnljbTl5QUZKaGJtZGxSWEp5YjNJQVVtVm1aWEpsYm1ObFJYSnliM0lBVlZKSlJYSnliM0lBWm14dmIzSUFabTl1ZEdOdmJHOXlBR0Z1WTJodmNnQm1iM0lBYTJWNVJtOXlBR1Y0Y0dWamRHbHVaeUJ6ZFhKeWIyZGhkR1VnY0dGcGNnQmhJR1JsWTJ4aGNtRjBhVzl1SUdsdUlIUm9aU0JvWldGa0lHOW1JR0VnWm05eUxTVnpJR3h2YjNBZ1kyRnVKM1FnYUdGMlpTQmhiaUJwYm1sMGFXRnNhWHBsY2dBbllYSm5kVzFsYm5Sekp5QnBaR1Z1ZEdsbWFXVnlJR2x6SUc1dmRDQmhiR3h2ZDJWa0lHbHVJR05zWVhOeklHWnBaV3hrSUdsdWFYUnBZV3hwZW1WeUFHbHVkbUZzYVdRZ2JuVnRZbVZ5SUc5bUlHRnlaM1Z0Wlc1MGN5Qm1iM0lnWjJWMGRHVnlJRzl5SUhObGRIUmxjZ0JwYm5aaGJHbGtJSE5sZEhSbGNnQnBiblpoYkdsa0lHZGxkSFJsY2dCbWFXeDBaWElBYldsemMybHVaeUJtYjNKdFlXd2djR0Z5WVcxbGRHVnlBQ0oxYzJVZ2MzUnlhV04wSWlCdWIzUWdZV3hzYjNkbFpDQnBiaUJtZFc1amRHbHZiaUIzYVhSb0lHUmxabUYxYkhRZ2IzSWdaR1Z6ZEhKMVkzUjFjbWx1WnlCd1lYSmhiV1YwWlhJQWFXNTJZV3hwWkNCamFHRnlZV04wWlhJQWRXNWxlSEJsWTNSbFpDQmphR0Z5WVdOMFpYSUFjSEpwZG1GMFpTQmpiR0Z6Y3lCbWFXVnNaQ0JtYjNKaWFXUmtaVzRnWVdaMFpYSWdjM1Z3WlhJQWFXNTJZV3hwWkNCeVpXUmxabWx1YVhScGIyNGdiMllnYkdWNGFXTmhiQ0JwWkdWdWRHbG1hV1Z5QUNkc1pYUW5JR2x6SUc1dmRDQmhJSFpoYkdsa0lHeGxlR2xqWVd3Z2FXUmxiblJwWm1sbGNnQnBiblpoYkdsa0lISmxaR1ZtYVc1cGRHbHZiaUJ2WmlCbmJHOWlZV3dnYVdSbGJuUnBabWxsY2dCNWFXVnNaQ0JwY3lCaElISmxjMlZ5ZG1Wa0lHbGtaVzUwYVdacFpYSUFKeVZ6SnlCcGN5QmhJSEpsYzJWeWRtVmtJR2xrWlc1MGFXWnBaWElBYjNSb1pYSUFZWFJ2YlRGZmFYTmZhVzUwWldkbGNpQW1KaUJoZEc5dE1sOXBjMTlwYm5SbFoyVnlBR05oYm01dmRDQmpiMjUyWlhKMElIUnZJR0pwWjJsdWREb2dibTkwSUdGdUlHbHVkR1ZuWlhJQWFYTkpiblJsWjJWeUFHbHpVMkZtWlVsdWRHVm5aWElBWW5WbVptVnlBRk5vWVhKbFpFRnljbUY1UW5WbVptVnlBR05oYm01dmRDQjFjMlVnYVdSbGJuUnBZMkZzSUVGeWNtRjVRblZtWm1WeUFHTmhibTV2ZENCamIyNTJaWEowSUdKcFoybHVkQ0IwYnlCdWRXMWlaWElBWTJGdWJtOTBJR052Ym5abGNuUWdZbWxuWm14dllYUWdkRzhnYm5WdFltVnlBR05oYm01dmRDQmpiMjUyWlhKMElITjViV0p2YkNCMGJ5QnVkVzFpWlhJQVkyRnVibTkwSUdOdmJuWmxjblFnWW1sblpHVmphVzFoYkNCMGJ5QnVkVzFpWlhJQWJtOTBJR0VnYm5WdFltVnlBR3hwYm1WT2RXMWlaWElBYldGc1ptOXliV1ZrSUhWdWFXTnZaR1VnWTJoaGNnQmpiR1ZoY2dCelpYUlpaV0Z5QUdkbGRGbGxZWElBYzJWMFJuVnNiRmxsWVhJQVoyVjBSblZzYkZsbFlYSUFjMlYwVlZSRFJuVnNiRmxsWVhJQVoyVjBWVlJEUm5Wc2JGbGxZWElBY1NBaFBTQnlBSFZ1Wlhod1pXTjBaV1FnYkdsdVpTQjBaWEp0YVc1aGRHOXlJR2x1SUhKbFoyVjRjQUIxYm1WNGNHVmpkR1ZrSUdWdVpDQnZaaUJ5WldkbGVIQUFVbVZuUlhod0FITjFjQUJwYm5aaGJHbGtJR2R5YjNWd0FIQnZjQUJqYjI1MGFXNTFaU0J0ZFhOMElHSmxJR2x1YzJsa1pTQnNiMjl3QUdKbVgyeHZaMmxqWDI5d0FHNTFiVjlyWlhselgyTnRjQUIxYzJVZ2MzUnlhWEFBYldGd0FHWnNZWFJOWVhBQVYyVmhhMDFoY0FCbGVIQmxZM1JwYm1jZ0ozc25JR0ZtZEdWeUlGeHdBR3h2WnpGd0FHUnBkbWx6YVc5dUlHSjVJSHBsY204QWRXNXJibTkzYmdCcGRHVnlZWFJ2Y2w5amJHOXpaVjl5WlhSMWNtNEFjSEp2YldselpTQnpaV3htSUhKbGMyOXNkWFJwYjI0QWIzVjBJRzltSUcxbGJXOXllU0JwYmlCeVpXZGxlSEFnWlhobFkzVjBhVzl1QUdSbGMyTnlhWEIwYVc5dUFIQnliM2g1T2lCa1pXWnBibVZRY205d1pYSjBlU0JsZUdObGNIUnBiMjRBYW5OZllYTjVibU5mWjJWdVpYSmhkRzl5WDNKbGMyOXNkbVZmWm5WdVkzUnBiMjRBYW5OZlkzSmxZWFJsWDJaMWJtTjBhVzl1QUhObGRDOWhaR1FnYVhNZ2JtOTBJR0VnWm5WdVkzUnBiMjRBY21WMGRYSnVJRzV2ZENCcGJpQmhJR1oxYm1OMGFXOXVBRUZ6ZVc1alIyVnVaWEpoZEc5eVJuVnVZM1JwYjI0QVFYTjVibU5HZFc1amRHbHZiZ0JwYm5aaGJHbGtJRzl3WlhKaGRHbHZiZ0IxYm5OMWNIQnZjblJsWkNCdmNHVnlZWFJwYjI0QVlYZGhhWFFnYVc0Z1pHVm1ZWFZzZENCbGVIQnlaWE56YVc5dUFIbHBaV3hrSUdsdUlHUmxabUYxYkhRZ1pYaHdjbVZ6YzJsdmJnQnBiblpoYkdsa0lHUmxZMmx0WVd3Z1pYTmpZWEJsSUdsdUlISmxaM1ZzWVhJZ1pYaHdjbVZ6YzJsdmJnQmlZV05ySUhKbFptVnlaVzVqWlNCdmRYUWdiMllnY21GdVoyVWdhVzRnY21WbmRXeGhjaUJsZUhCeVpYTnphVzl1QUdsdWRtRnNhV1FnWlhOallYQmxJSE5sY1hWbGJtTmxJR2x1SUhKbFozVnNZWElnWlhod2NtVnpjMmx2YmdCbGVIQmxZM1JsWkNBbmIyWW5JRzl5SUNkcGJpY2dhVzRnWm05eUlHTnZiblJ5YjJ3Z1pYaHdjbVZ6YzJsdmJnQjBiMjhnWTI5dGNHeHBZMkYwWldRZ1pHVnpkSEoxWTNSMWNtbHVaeUJsZUhCeVpYTnphVzl1QUdWNGNHVmpkR1ZrSUNkOUp5QmhablJsY2lCMFpXMXdiR0YwWlNCbGVIQnlaWE56YVc5dUFIUnZVSEpsWTJsemFXOXVBR0Z6YVc0QWFtOXBiZ0J0YVc0QVkyOXdlVmRwZEdocGJnQjBaVzF3YkdGMFpTQnNhWFJsY21Gc0lHTmhibTV2ZENCaGNIQmxZWElnYVc0Z1lXNGdiM0IwYVc5dVlXd2dZMmhoYVc0QVkybHlZM1ZzWVhJZ2NISnZkRzkwZVhCbElHTm9ZV2x1QUdGemMybG5iZ0FoZVMwK2MybG5iZ0JwYzBaeWIzcGxiZ0J0WVhKclgyTm9hV3hrY21WdUFDaHdiM01nS3lCc1pXNHBJRHc5SUdKalgySjFabDlzWlc0QWRXNWxlSEJsWTNSbFpDQmxiR3hwY0hOcGN5QjBiMnRsYmdCMGFHVnVBSE5sZEhSbGNpQnBjeUJtYjNKaWFXUmtaVzRBYm5Wc2JDQnZjaUIxYm1SbFptbHVaV1FnWVhKbElHWnZjbUpwWkdSbGJnQmhkR0Z1QUc1aGJnQnViM1FnWVNCaWIyOXNaV0Z1QUVKdmIyeGxZVzRBWjJOZmMyTmhiZ0JpWVdRZ2JtOXliV0ZzYVhwaGRHbHZiaUJtYjNKdEFFcFRYMDVsZDFONWJXSnZiRVp5YjIxQmRHOXRBR1p5YjIwQWNtRnVaRzl0QUhSeWFXMEFkR1JwZG5KbGJRQm1aR2wyY21WdEFHVmthWFp5WlcwQVkyUnBkbkpsYlFCaVpsOWthWFp5WlcwQWMzRnlkSEpsYlFCcGJYVnNBRzV2ZENCaElITjViV0p2YkFCVGVXMWliMndBVW1WblJYaHdJR1Y0WldNZ2JXVjBhRzlrSUcxMWMzUWdjbVYwZFhKdUlHRnVJRzlpYW1WamRDQnZjaUJ1ZFd4c0FIQmhjbVZ1ZENCd2NtOTBiM1I1Y0dVZ2JYVnpkQ0JpWlNCaGJpQnZZbXBsWTNRZ2IzSWdiblZzYkFCallXNXViM1FnYzJWMElIQnliM0JsY25SNUlDY2xjeWNnYjJZZ2JuVnNiQUJqWVc1dWIzUWdjbVZoWkNCd2NtOXdaWEowZVNBbkpYTW5JRzltSUc1MWJHd0FUblZzYkFCbWFXeHNBRzVsZHlCQmNuSmhlVUoxWm1abGNpQnBjeUIwYjI4Z2MyMWhiR3dBVkhsd1pXUkJjbkpoZVNCc1pXNW5kR2dnYVhNZ2RHOXZJSE50WVd4c0FHTmhiR3dBWkc5MFFXeHNBRzFoZEdOb1FXeHNBSEpsY0d4aFkyVkJiR3dBWTJWcGJBQjFjR1JoZEdWZmJHRmlaV3dBWW1OZlluVm1XM0J2YzEwZ1BUMGdUMUJmYkdGaVpXd0FaWFpoYkFCcGJuWmhiR2xrSUdKcFoybHVkQ0JzYVhSbGNtRnNBR2x1ZG1Gc2FXUWdiblZ0WW1WeUlHeHBkR1Z5WVd3QWJXRnNabTl5YldWa0lHVnpZMkZ3WlNCelpYRjFaVzVqWlNCcGJpQnpkSEpwYm1jZ2JHbDBaWEpoYkFCaVpsOWxlSEJmYVc1MFpYSnVZV3dBWW1aZmJHOW5YMmx1ZEdWeWJtRnNBRXBUWDFObGRGQnliM0JsY25SNVNXNTBaWEp1WVd3QVNsTmZSMlYwVDNkdVVISnZjR1Z5ZEhsT1lXMWxjMGx1ZEdWeWJtRnNBRjlmU2xOZlJYWmhiRWx1ZEdWeWJtRnNBR0pwWjJSbFkybHRZV3dBYm5SMFgyWm1kRjl3WVhKMGFXRnNBSFJ2Ulhod2IyNWxiblJwWVd3QWMyVmhiQUJuYkc5aVlXd0FZbXhwYm1zQVgxOWtZWFJsWDJOc2IyTnJBSE4wWVdOckFHeHlaVjlsZUdWalgySmhZMnQwY21GamF3QnpMVDVwYzE5M1pXRnJBR0ptWDNCdmQxOTFhUUJ6WlhSTmIyNTBhQUJuWlhSTmIyNTBhQUJ6WlhSVlZFTk5iMjUwYUFCblpYUlZWRU5OYjI1MGFBQnBiblpoYkdsa0lHdGxlWGR2Y21RNklIZHBkR2dBYzNSaGNuUnpWMmwwYUFCbGJtUnpWMmwwYUFCd2NtOXdJRDA5SUVwVFgwRlVUMDFmYkdWdVozUm9BR2x1ZG1Gc2FXUWdZWEp5WVhrZ2JHVnVaM1JvQUdsdWRtRnNhV1FnWVhKeVlYa2dZblZtWm1WeUlHeGxibWQwYUFCcGJuWmhiR2xrSUd4bGJtZDBhQUJwYm5aaGJHbGtJR0o1ZEdWTVpXNW5kR2dBZFhObElHMWhkR2dBVFdGMGFBQndkWE5vQUdGamIzTm9BRXBUWDFKbGMybDZaVUYwYjIxSVlYTm9BR0Z6YVc1b0FHRjBZVzVvQUdKeVpXRnJJRzExYzNRZ1ltVWdhVzV6YVdSbElHeHZiM0FnYjNJZ2MzZHBkR05vQUcxaGRHTm9BR05oZEdOb0FITmxZWEpqYUFCbWIzSkZZV05vQUdKbVgyeHZad0JCY25KaGVTQjBiMjhnYkc5dVp3QnpkSEpwYm1jZ2RHOXZJR3h2Ym1jQVFYSnlZWGtnYkc5dklHeHZibWNBYzNWaWMzUnlhVzVuQUdOaGJtNXZkQ0JqYjI1MlpYSjBJSE41YldKdmJDQjBieUJ6ZEhKcGJtY0FkVzVsZUhCbFkzUmxaQ0JsYm1RZ2IyWWdjM1J5YVc1bkFHNXZkQ0JoSUhOMGNtbHVad0JwYm5aaGJHbGtJR05vWVhKaFkzUmxjaUJwYmlCaElFcFRUMDRnYzNSeWFXNW5BSFJ2VTNSeWFXNW5BSFJ2UkdGMFpWTjBjbWx1WndCMGIweHZZMkZzWlVSaGRHVlRkSEpwYm1jQWRHOVVhVzFsVTNSeWFXNW5BSFJ2VEc5allXeGxWR2x0WlZOMGNtbHVad0IwYjB4dlkyRnNaVk4wY21sdVp3QjBiMGROVkZOMGNtbHVad0JLVTFOMGNtbHVad0IwYjBsVFQxTjBjbWx1WndCMGIxVlVRMU4wY21sdVp3QmtkWEJzYVdOaGRHVWdhVzF3YjNKMElHSnBibVJwYm1jQWFXNTJZV3hwWkNCcGJYQnZjblFnWW1sdVpHbHVad0JpYVdjQWNtVm5aWGh3SUcxMWMzUWdhR0YyWlNCMGFHVWdKMmNuSUdac1lXY0FiMllBYVc1bUFHUnBabVlnUFQwZ0tHbHVkRGhmZENsa2FXWm1BR1JwWm1ZZ1BUMGdLR2x1ZERFMlgzUXBaR2xtWmdCb2NtVm1BR2RqWDJSbFkzSmxaZ0JtY21WbFgzWmhjbDl5WldZQWIzQjBhVzFwZW1WZmMyTnZjR1ZmYldGclpWOW5iRzlpWVd4ZmNtVm1BSEpsYzJWMFgzZGxZV3RmY21WbUFHUmxiR1YwWlY5M1pXRnJYM0psWmdCdmNIUnBiV2w2WlY5elkyOXdaVjl0WVd0bFgzSmxaZ0JwYm1SbGVFOW1BR3hoYzNSSmJtUmxlRTltQUhaaGJIVmxUMllBYzJWMFVISnZkRzkwZVhCbFQyWUFaMlYwVUhKdmRHOTBlWEJsVDJZQWFYTlFjbTkwYjNSNWNHVlBaZ0FsTGlwbUFHWnZiblJ6YVhwbEFHSnBibUZ5ZVY5dlltcGxZM1JmYzJsNlpRQnpkSEpmYzJsNlpRQnVaWGRmYzJsNlpTQThQU0J6YUMwK2NISnZjRjl6YVhwbEFHUmxjMk55SUR3Z2NuUXRQbUYwYjIxZmMybDZaUUJoZEc5dElEd2djblF0UG1GMGIyMWZjMmw2WlFCamIyMXdkWFJsWDNOMFlXTnJYM05wZW1VQWIySnFYM05wZW1VQWJpQThJR0oxWmw5emFYcGxBSE5vWVhCbFgzTnBlbVVBYW5OZlpuVnVZMTl3WXpKc2FXNWxYM05wZW1VQWFuTmZablZ1WTE5amIyUmxYM05wZW1VQWJXVnRiM0o1WDNWelpXUmZjMmw2WlFCcWMxOW1kVzVqWDNOcGVtVUFibTl5YldGc2FYcGxBR1p5WldWNlpRQnlaWE52YkhabEFIUnZVSEpwYldsMGFYWmxBSEIxZEY5c2RtRnNkV1VBZFc1cmJtOTNiaUIxYm1samIyUmxJSEJ5YjNCbGNuUjVJSFpoYkhWbEFISmxjM1FnWld4bGJXVnVkQ0JqWVc1dWIzUWdhR0YyWlNCaElHUmxabUYxYkhRZ2RtRnNkV1VBYVc1MllXeHBaQ0J5WlhRZ2RtRnNkV1VBWDE5S1UxOUJkRzl0Vkc5V1lXeDFaUUJmWDNGMWIzUmxBR2x6Um1sdWFYUmxBR1JsYkdWMFpRQmpjbVZoZEdVQWMyVjBSR0YwWlFCblpYUkVZWFJsQUhObGRGVlVRMFJoZEdVQVoyVjBWVlJEUkdGMFpRQkpiblpoYkdsa0lFUmhkR1VBY21WMlpYSnpaUUJ3WVhKelpRQndjbTk0ZVNCd2NtVjJaVzUwUlhoMFpXNXphVzl1Y3lCb1lXNWtiR1Z5SUhKbGRIVnlibVZrSUdaaGJITmxBRkJ5YjIxcGMyVUFkRzlNYjNkbGNrTmhjMlVBZEc5TWIyTmhiR1ZNYjNkbGNrTmhjMlVBZEc5VmNIQmxja05oYzJVQWRHOU1iMk5oYkdWVmNIQmxja05oYzJVQWFXZHViM0psUTJGelpRQnNiMk5oYkdWRGIyMXdZWEpsQUhCeWIzaDVPaUJwYm1OdmJuTnBjM1JsYm5RZ2NISnZkRzkwZVhCbEFIQnliM2g1T2lCaVlXUWdjSEp2ZEc5MGVYQmxBRzV2ZENCaElIQnliM1J2ZEhsd1pRQnBiblpoYkdsa0lHOWlhbVZqZENCMGVYQmxBSFZ1WlhOallYQmxBRzV2Ym1VQWNtVnpkQ0JsYkdWdFpXNTBJRzExYzNRZ1ltVWdkR2hsSUd4aGMzUWdiMjVsQUcxMWJIUnBiR2x1WlFBZ0lIQmpNbXhwYm1VQWMyOXRaUUJLVTE5R2NtVmxVblZ1ZEdsdFpRQktVMUoxYm5ScGJXVUFjMlYwVkdsdFpRQm5aWFJVYVcxbEFITmxkRjl2WW1wbFkzUmZibUZ0WlFCbGVIQmxZM1JwYm1jZ2NISnZjR1Z5ZEhrZ2JtRnRaUUIxYm10dWIzZHVJSFZ1YVdOdlpHVWdjSEp2Y0dWeWRIa2dibUZ0WlFCcGJuWmhiR2xrSUhCeWIzQmxjblI1SUc1aGJXVUFaSFZ3YkdsallYUmxJRjlmY0hKdmRHOWZYeUJ3Y205d1pYSjBlU0J1WVcxbEFHbHVkbUZzYVdRZ2NtVmtaV1pwYm1sMGFXOXVJRzltSUhCaGNtRnRaWFJsY2lCdVlXMWxBR1Y0Y0dWamRHbHVaeUJuY205MWNDQnVZVzFsQUdSMWNHeHBZMkYwWlNCbmNtOTFjQ0J1WVcxbEFHbHVkbUZzYVdRZ1ozSnZkWEFnYm1GdFpRQmtkWEJzYVdOaGRHVWdiR0ZpWld3Z2JtRnRaUUJwYm5aaGJHbGtJR1pwY25OMElHTm9ZWEpoWTNSbGNpQnZaaUJ3Y21sMllYUmxJRzVoYldVQWFXNTJZV3hwWkNCc1pYaHBZMkZzSUhaaGNtbGhZbXhsSUc1aGJXVUFhVzUyWVd4cFpDQnRaWFJvYjJRZ2JtRnRaUUJsZUhCbFkzUnBibWNnWm1sbGJHUWdibUZ0WlFCcGJuWmhiR2xrSUdacFpXeGtJRzVoYldVQVkyeGhjM01nYzNSaGRHVnRaVzUwSUhKbGNYVnBjbVZ6SUdFZ2JtRnRaUUJtYVd4bFRtRnRaUUJqYjIxd2FXeGxBRzlpYW1WamRDQnBjeUJ1YjNRZ1pYaDBaVzV6YVdKc1pRQndjbTk0ZVRvZ2FXNWpiMjV6YVhOMFpXNTBJR2x6UlhoMFpXNXphV0pzWlFCallXNXViM1FnYUdGMlpTQnpaWFIwWlhJdloyVjBkR1Z5SUdGdVpDQjJZV3gxWlNCdmNpQjNjbWwwWVdKc1pRQndjbTl3WlhKMGVTQnBjeUJ1YjNRZ1kyOXVabWxuZFhKaFlteGxBSFpoYkhWbElHbHpJRzV2ZENCcGRHVnlZV0pzWlFCd2NtOXdaWEowZVVselJXNTFiV1Z5WVdKc1pRQnRhWE56YVc1bklHbHVhWFJwWVd4cGVtVnlJR1p2Y2lCamIyNXpkQ0IyWVhKcFlXSnNaUUJzWlhocFkyRnNJSFpoY21saFlteGxBR2x1ZG1Gc2FXUWdjbVZrWldacGJtbDBhVzl1SUc5bUlHRWdkbUZ5YVdGaWJHVUFjbVYyYjJOaFlteGxBSE4wY21sclpRQnRjRjlrYVhadWIzSnRYMnhoY21kbEFHbHVkbUZzYVdRZ1kyeGhjM01nY21GdVoyVUFiV1Z6YzJGblpRQmhjM2x1WTE5bWRXNWpYMlp5WldVQWFXNTJZV3hwWkNCc2RtRnNkV1VnYVc0Z2MzUnlhV04wSUcxdlpHVUFhVzUyWVd4cFpDQjJZWEpwWVdKc1pTQnVZVzFsSUdsdUlITjBjbWxqZENCdGIyUmxBR05oYm01dmRDQmtaV3hsZEdVZ1lTQmthWEpsWTNRZ2NtVm1aWEpsYm1ObElHbHVJSE4wY21samRDQnRiMlJsQUc5amRHRnNJR1Z6WTJGd1pTQnpaWEYxWlc1alpYTWdZWEpsSUc1dmRDQmhiR3h2ZDJWa0lHbHVJSE4wY21samRDQnRiMlJsQUc5amRHRnNJR3hwZEdWeVlXeHpJR0Z5WlNCa1pYQnlaV05oZEdWa0lHbHVJSE4wY21samRDQnRiMlJsQUhWdWFXTnZaR1VBSUNCaWVYUmxZMjlrWlFCS1UwWjFibU4wYVc5dVFubDBaV052WkdVQWMydHBjRjlrWldGa1gyTnZaR1VBYVc1MllXeHBaQ0JoY21kMWJXVnVkQ0J1WVcxbElHbHVJSE4wY21samRDQmpiMlJsQUdsdWRtRnNhV1FnWm5WdVkzUnBiMjRnYm1GdFpTQnBiaUJ6ZEhKcFkzUWdZMjlrWlFCcGJuWmhiR2xrSUhKbFpHVm1hVzVwZEdsdmJpQnZaaUJuYkc5aVlXd2dhV1JsYm5ScFptbGxjaUJwYmlCdGIyUjFiR1VnWTI5a1pRQnBiWEJ2Y25RdWJXVjBZU0J2Ym14NUlIWmhiR2xrSUdsdUlHMXZaSFZzWlNCamIyUmxBR1p5YjIxRGFHRnlRMjlrWlFCcGJuWmhiR2xrSUdadmNpQnBiaTl2WmlCc1pXWjBJR2hoYm1RdGMybGtaUUJwYm5aaGJHbGtJR0Z6YzJsbmJtMWxiblFnYkdWbWRDMW9ZVzVrSUhOcFpHVUFjbVZrZFdObEFITnZkWEpqWlFBbmRHaHBjeWNnWTJGdUlHSmxJR2x1YVhScFlXeHBlbVZrSUc5dWJIa2diMjVqWlFCd2NtOXdaWEowZVNCamIyNXpkSEoxWTNSdmNpQmhjSEJsWVhKeklHMXZjbVVnZEdoaGJpQnZibU5sQUdsdWRtRnNhV1FnVlZSR0xUZ2djMlZ4ZFdWdVkyVUFZMmx5WTNWc1lYSWdjbVZtWlhKbGJtTmxBSE5zYVdObEFITndiR2xqWlFCeVlXTmxBSEpsY0d4aFkyVUFKU3N1S21VQWRXNWxlSEJsWTNSbFpDQW5ZWGRoYVhRbklHdGxlWGR2Y21RQWRXNWxlSEJsWTNSbFpDQW5lV2xsYkdRbklHdGxlWGR2Y21RQWJXRndYMlJsWTNKbFpsOXlaV052Y21RQWFYUmxjbUYwYjNJZ1pHOWxjeUJ1YjNRZ2FHRjJaU0JoSUhSb2NtOTNJRzFsZEdodlpBQnZZbXBsWTNRZ2JtVmxaSE1nZEc5SlUwOVRkSEpwYm1jZ2JXVjBhRzlrQUNkemRYQmxjaWNnYVhNZ2IyNXNlU0IyWVd4cFpDQnBiaUJoSUcxbGRHaHZaQUJtY205MWJtUUFYMTlpWmw5eWIzVnVaQUJpY21WaGF5OWpiMjUwYVc1MVpTQnNZV0psYkNCdWIzUWdabTkxYm1RQWIzVjBJRzltSUdKdmRXNWtBR1pwYm1RQVltbHVaQUJwYm5aaGJHbGtJR2x1WkdWNElHWnZjaUJoY0hCbGJtUUFaWGgwY21GdVpXOTFjeUJqYUdGeVlXTjBaWEp6SUdGMElIUm9aU0JsYm1RQWRXNWxlSEJsWTNSbFpDQmtZWFJoSUdGMElIUm9aU0JsYm1RQWRXNWxlSEJsWTNSbFpDQmxibVFBYVc1MllXeHBaQ0JwYm1OeVpXMWxiblF2WkdWamNtVnRaVzUwSUc5d1pYSmhibVFBYVc1MllXeHBaQ0FuYVc1emRHRnVZMlZ2WmljZ2NtbG5hSFFnYjNCbGNtRnVaQUJwYm5aaGJHbGtJQ2RwYmljZ2IzQmxjbUZ1WkFCMGNtbHRSVzVrQUhCaFpFVnVaQUJpYjJ4a0FDVnNiR1FBWjJOZlpHVmpjbVZtWDJOb2FXeGtBSEpsYzI5c2RtVmZjMk52Y0dWZmNISnBkbUYwWlY5bWFXVnNaQUJqWVc1dWIzUWdaR1ZzWlhSbElHRWdjSEpwZG1GMFpTQmpiR0Z6Y3lCbWFXVnNaQUJsZUhCbFkzUnBibWNnUEdKeVlXNWtQaUJ3Y21sMllYUmxJR1pwWld4a0FDVnpJR2x6SUc1dmRDQnBibWwwYVdGc2FYcGxaQUJtYVhobFpBQjBiMFpwZUdWa0FITmxkRjl2WW1wbFkzUmZibUZ0WlY5amIyMXdkWFJsWkFCeVpXZGxlQ0J1YjNRZ2MzVndjRzl5ZEdWa0FHVjJZV3dnYVhNZ2JtOTBJSE4xY0hCdmNuUmxaQUJTWldkRmVIQWdZWEpsSUc1dmRDQnpkWEJ3YjNKMFpXUUFhVzUwWlhKeWRYQjBaV1FBSlhNZ2IySnFaV04wSUdWNGNHVmpkR1ZrQUdsa1pXNTBhV1pwWlhJZ1pYaHdaV04wWldRQVlubDBaV052WkdVZ1puVnVZM1JwYjI0Z1pYaHdaV04wWldRQWMzUnlhVzVuSUdWNGNHVmpkR1ZrQUdaeWIyMGdZMnhoZFhObElHVjRjR1ZqZEdWa0FHWjFibU4wYVc5dUlHNWhiV1VnWlhod1pXTjBaV1FBZG1GeWFXRmliR1VnYm1GdFpTQmxlSEJsWTNSbFpBQnRaWFJoSUdWNGNHVmpkR1ZrQUhKbGFtVmpkR1ZrQUcxbGJXOXllU0JoYkd4dlkyRjBaV1FBYldWdGIzSjVJSFZ6WldRQVpHVnlhWFpsWkNCamJHRnpjeUJqYjI1emRISjFZM1J2Y2lCdGRYTjBJSEpsZEhWeWJpQmhiaUJ2WW1wbFkzUWdiM0lnZFc1a1pXWnBibVZrQUdOaGJtNXZkQ0J6WlhRZ2NISnZjR1Z5ZEhrZ0p5VnpKeUJ2WmlCMWJtUmxabWx1WldRQVkyRnVibTkwSUhKbFlXUWdjSEp2Y0dWeWRIa2dKeVZ6SnlCdlppQjFibVJsWm1sdVpXUUFabXhoWjNNZ2JYVnpkQ0JpWlNCMWJtUmxabWx1WldRQVZXNWtaV1pwYm1Wa0FIQnlhWFpoZEdVZ1kyeGhjM01nWm1sbGJHUWdhWE1nWVd4eVpXRmtlU0JrWldacGJtVmtBQ2NsY3ljZ2FYTWdibTkwSUdSbFptbHVaV1FBWjNKdmRYQWdibUZ0WlNCdWIzUWdaR1ZtYVc1bFpBQnZjR1Z5WVhSdmNpQWxjem9nYm04Z1puVnVZM1JwYjI0Z1pHVm1hVzVsWkFCaGJHeFRaWFIwYkdWa0FHWjFiR1pwYkd4bFpBQmpZVzV1YjNRZ1ltVWdZMkZzYkdWa0FHbHpVMlZoYkdWa0FDRnphQzArYVhOZmFHRnphR1ZrQUhaaGNsOXlaV1l0UG1selgyUmxkR0ZqYUdWa0FFRnljbUY1UW5WbVptVnlJR2x6SUdSbGRHRmphR1ZrQUdGa1pBQWxLekEzWkFBbE1EUmtBQ1V3TW1RbE1ESmtBQ1V3TW1RdkpUQXlaQzhsTUNwa0FDVXVNM01nSlM0emN5QWxNREprSUNVd0ttUUFPaVZrQUdsdWRtRnNhV1FnZEdoeWIzY2dkbUZ5SUhSNWNHVWdKV1FBYzJNQWFuTmZaR1ZtWDIxaGJHeHZZd0IwY25WdVl3Qm5Zd0JsZUdWakFHSm1YMmx1ZEdWblpYSmZkRzlmY21Ga2FYaGZjbVZqQUhGMWFXTnJhbk12Y1hWcFkydHFjeTVqQUhGMWFXTnJhbk12YkdsaWNtVm5aWGh3TG1NQWNYVnBZMnRxY3k5c2FXSmlaaTVqQUhGMWFXTnJhbk12YkdsaWRXNXBZMjlrWlM1akFITjFZZ0J3Y205dGFYTmxYM0psWVdOMGFXOXVYMnB2WWdCcWMxOXdjbTl0YVhObFgzSmxjMjlzZG1WZmRHaGxibUZpYkdWZmFtOWlBSElnSVQwZ1lTQW1KaUJ5SUNFOUlHSUFjU0FoUFNCaElDWW1JSEVnSVQwZ1lnQnlkMkVBY2lBaFBTQmhBRjlmYkc5dmEzVndVMlYwZEdWeVgxOEFYMTlrWldacGJtVlRaWFIwWlhKZlh3QmZYMnh2YjJ0MWNFZGxkSFJsY2w5ZkFGOWZaR1ZtYVc1bFIyVjBkR1Z5WDE4QVgxOXdjbTkwYjE5ZkFGdFRlVzFpYjJ3dWMzQnNhWFJkQUZ0VGVXMWliMnd1YzNCbFkybGxjMTBBVzFONWJXSnZiQzVwZEdWeVlYUnZjbDBBVzFONWJXSnZiQzVoYzNsdVkwbDBaWEpoZEc5eVhRQmJVM2x0WW05c0xtMWhkR05vUVd4c1hRQmJVM2x0WW05c0xtMWhkR05vWFFCYlUzbHRZbTlzTG5ObFlYSmphRjBBVzFONWJXSnZiQzUwYjFOMGNtbHVaMVJoWjEwQVcxTjViV0p2YkM1MGIxQnlhVzFwZEdsMlpWMEFXM1Z1YzNWd2NHOXlkR1ZrSUhSNWNHVmRBRnRtZFc1amRHbHZiaUJpZVhSbFkyOWtaVjBBVzFONWJXSnZiQzVvWVhOSmJuTjBZVzVqWlYwQVcxTjViV0p2YkM1eVpYQnNZV05sWFFCYkFDVXdNbVE2SlRBeVpEb2xNREprTGlVd00yUmFBRkJQVTBsVVNWWkZYMGxPUmtsT1NWUlpBRTVGUjBGVVNWWkZYMGxPUmtsT1NWUlpBSEF0UG1Oc1lYTnpYMmxrSUQwOUlFcFRYME5NUVZOVFgwRlNVa0ZaQUhOMFlXTnJYMnhsYmlBOElGQlBVRjlUVkVGRFMxOU1SVTVmVFVGWUFDMGxNREprTFNVd01tUlVBRXBUWDBGMGIyMUhaWFJUZEhKU1ZBQnZjR052WkdVZ1BDQlNSVTlRWDBOUFZVNVVBRUpaVkVWVFgxQkZVbDlGVEVWTlJVNVVBQ1V3TW1RNkpUQXlaRG9sTURKa0lFZE5WQUJLVTE5V1FVeFZSVjlIUlZSZlZFRkhLSE5tTFQ1amRYSmZablZ1WXlrZ1BUMGdTbE5mVkVGSFgwOUNTa1ZEVkFCMllYSmZhMmx1WkNBOVBTQktVMTlXUVZKZlVGSkpWa0ZVUlY5VFJWUlVSVklBVFVGWVgxTkJSa1ZmU1U1VVJVZEZVZ0JOU1U1ZlUwRkdSVjlKVGxSRlIwVlNBR0Z6VldsdWRFNEFZWE5KYm5ST0FHbHpUbUZPQUVSaGRHVWdkbUZzZFdVZ2FYTWdUbUZPQUhSdlNsTlBUZ0JGVUZOSlRFOU9BRTVCVGdBbE1ESmtPaVV3TW1RNkpUQXlaQ0FsWTAwQWN5MCtiR0ZpWld4ZmMyeHZkSE5iYkdGaVpXeGRMbVpwY25OMFgzSmxiRzlqSUQwOUlFNVZURXdBYkdGaVpXeGZjMnh2ZEhOYmFWMHVabWx5YzNSZmNtVnNiMk1nUFQwZ1RsVk1UQUJ3Y25NZ0lUMGdUbFZNVEFCelppMCtZM1Z5WDNOd0lDRTlJRTVWVEV3QWMyWWdJVDBnVGxWTVRBQnRjakVnSVQwZ1RsVk1UQUIyWVhKZmEybHVaQ0FoUFNCS1UxOVdRVkpmVGs5U1RVRk1BR0l0UG1aMWJtTmZhMmx1WkNBOVBTQktVMTlHVlU1RFgwNVBVazFCVEFCbGJtTnZaR1ZWVWtrQVpHVmpiMlJsVlZKSkFGQkpBSE53WldOcFlXd2dQVDBnVUZWVVgweFdRVXhWUlY5T1QwdEZSVkFnZkh3Z2MzQmxZMmxoYkNBOVBTQlFWVlJmVEZaQlRGVkZYMDVQUzBWRlVGOUVSVkJVU0FCekxUNXpkR0YwWlNBOVBTQktVMTlCVTFsT1ExOUhSVTVGVWtGVVQxSmZVMVJCVkVWZlJWaEZRMVZVU1U1SEFIQnlaV014SUNFOUlFSkdYMUJTUlVOZlNVNUdBREF4TWpNME5UWTNPRGxCUWtORVJVWUFVMGxhUlFCTlFWaGZWa0ZNVlVVQVRVbE9YMVpCVEZWRkFFNUJUVVVBWlhaaGJGOTBlWEJsSUQwOUlFcFRYMFZXUVV4ZlZGbFFSVjlIVEU5Q1FVd2dmSHdnWlhaaGJGOTBlWEJsSUQwOUlFcFRYMFZXUVV4ZlZGbFFSVjlOVDBSVlRFVUFjQzArWjJOZmIySnFYM1I1Y0dVZ1BUMGdTbE5mUjBOZlQwSktYMVJaVUVWZlNsTmZUMEpLUlVOVUlIeDhJSEF0UG1kalgyOWlhbDkwZVhCbElEMDlJRXBUWDBkRFgwOUNTbDlVV1ZCRlgwWlZUa05VU1U5T1gwSlpWRVZEVDBSRkFFeFBSekpGQUV4UFJ6RXdSUUJ6TFQ1emRHRjBaU0E5UFNCS1UxOUJVMWxPUTE5SFJVNUZVa0ZVVDFKZlUxUkJWRVZmUVZkQlNWUkpUa2RmVWtWVVZWSk9JSHg4SUhNdFBuTjBZWFJsSUQwOUlFcFRYMEZUV1U1RFgwZEZUa1ZTUVZSUFVsOVRWRUZVUlY5RFQwMVFURVZVUlVRQVZWUkRBRHhwYm5CMWRENEFQSE5sZEQ0QVBHRnViMjU1Ylc5MWN6NEFQR1IxYlhBK0FEeHVkV3hzUGdCaWFXZHBiblFnYjNCbGNtRnVaSE1nWVhKbElHWnZjbUpwWkdSbGJpQm1iM0lnUGo0K0FDWnhkVzkwT3dCelpYUlZhVzUwT0FCblpYUlZhVzUwT0FCelpYUkpiblE0QUdkbGRFbHVkRGdBYldGc1ptOXliV1ZrSUZWVVJpMDRBSEpoWkdsNElHMTFjM1FnWW1VZ1ltVjBkMlZsYmlBeUlHRnVaQ0F6TmdCelpYUlZhVzUwTVRZQVoyVjBWV2x1ZERFMkFITmxkRWx1ZERFMkFHZGxkRWx1ZERFMkFHRnlaMk1nUFQwZ05RQnpaWFJDYVdkVmFXNTBOalFBWjJWMFFtbG5WV2x1ZERZMEFITmxkRUpwWjBsdWREWTBBR2RsZEVKcFowbHVkRFkwQUhObGRFWnNiMkYwTmpRQVoyVjBSbXh2WVhRMk5BQmhjbWRqSUQwOUlETUFZWFJoYmpJQWJHOW5NZ0JtYkc5dmNreHZaeklBVTFGU1ZERmZNZ0JUVVZKVU1nQk1UaklBWTJ4Nk16SUFjMlYwVldsdWRETXlBR2RsZEZWcGJuUXpNZ0J6WlhSSmJuUXpNZ0JuWlhSSmJuUXpNZ0J6WlhSR2JHOWhkRE15QUdkbGRFWnNiMkYwTXpJQWMzUmhZMnRmYkdWdUlENDlJRElBU2xOZlFYUnZiVWx6VG5WdFpYSnBZMGx1WkdWNE1RQnFjMTltWTNaME1RQktVMTlEYjIxd1lXTjBRbWxuU1c1ME1RQmxlSEJ0TVFCeUlDRTlJR0V4SUNZbUlISWdJVDBnWWpFQWJITXRQbUZrWkhJZ1BUMGdMVEVBYm5FZ1BqMGdNUUJ6ZEdGamExOXNaVzRnUGowZ01RQndMVDVvWldGa1pYSXVjbVZtWDJOdmRXNTBJRDA5SURFQWNDMCtjMmhoY0dVdFBtaGxZV1JsY2k1eVpXWmZZMjkxYm5RZ1BUMGdNUUJ6ZEdGamExOXNaVzRnUFQwZ01RQnFjMTltY21WbFgzTm9ZWEJsTUFCc2IyY3hNQUJNVGpFd0FIQXRQbkpsWmw5amIzVnVkQ0ErSURBQWRtRnlYM0psWmkwK2FHVmhaR1Z5TG5KbFpsOWpiM1Z1ZENBK0lEQUFjM1JoWTJ0ZmMybDZaU0ErSURBQVkzQnZiMnhmYVdSNElENDlJREFBY25RdFBtRjBiMjFmWTI5MWJuUWdQajBnTUFCc2N5MCtjbVZtWDJOdmRXNTBJRDQ5SURBQWN5MCthWE5mWlhaaGJDQjhmQ0J6TFQ1amJHOXpkWEpsWDNaaGNsOWpiM1Z1ZENBOVBTQXdBSEF0UG5KbFpsOWpiM1Z1ZENBOVBTQXdBR04wZUMwK2FHVmhaR1Z5TG5KbFpsOWpiM1Z1ZENBOVBTQXdBSE5vTFQ1b1pXRmtaWEl1Y21WbVgyTnZkVzUwSUQwOUlEQUFjQzArYldGeWF5QTlQU0F3QUNodU1pQWxJSE4wY21sd1gyeGxiaWtnUFQwZ01BQW9jSEl0UG5VdWFXNXBkQzV5WldGc2JWOWhibVJmYVdRZ0ppQXpLU0E5UFNBd0FDaHVaWGRmYUdGemFGOXphWHBsSUNZZ0tHNWxkMTlvWVhOb1gzTnBlbVVnTFNBeEtTa2dQVDBnTUFCcElDRTlJREFBYzJsNlpTQWhQU0F3QUY0a1hDNHFLejhvS1Z0ZGUzMThMd0E4THdBd0xnQnRhWE56YVc1bklHSnBibVJwYm1jZ2NHRjBkR1Z5Ymk0dUxnQmlhV2RwYm5RZ1lYSm5kVzFsYm5RZ2QybDBhQ0IxYm1GeWVTQXJBR0Z6ZVc1aklHWjFibU4wYVc5dUlDb0FDbjBwQUd4cGMzUmZaVzF3ZEhrb0puSjBMVDVuWTE5dlltcGZiR2x6ZENrQWFpQTlQU0FvYzJndFBuQnliM0JmWTI5MWJuUWdMU0J6YUMwK1pHVnNaWFJsWkY5d2NtOXdYMk52ZFc1MEtRQktVMTlKYzFWdVpHVm1hVzVsWkNobWRXNWpYM0psZENrQUlWOWZTbE5mUVhSdmJVbHpWR0ZuWjJWa1NXNTBLR1JsYzJOeUtRQWhZWFJ2YlY5cGMxOW1jbVZsS0hBcEFDaHVkV3hzS1FBZ0tHNWhkR2wyWlNrQWFuTmZZMnhoYzNOZmFHRnpYMko1ZEdWamIyUmxLSEF0UG1Oc1lYTnpYMmxrS1FCMWJtTnZibk5wYzNSbGJuUWdjM1JoWTJzZ2MybDZaVG9nSldRZ0pXUWdLSEJqUFNWa0tRQmllWFJsWTI5a1pTQmlkV1ptWlhJZ2IzWmxjbVpzYjNjZ0tHOXdQU1ZrTENCd1l6MGxaQ2tBYzNSaFkyc2diM1psY21ac2IzY2dLRzl3UFNWa0xDQndZejBsWkNrQWMzUmhZMnNnZFc1a1pYSm1iRzkzSUNodmNEMGxaQ3dnY0dNOUpXUXBBR2x1ZG1Gc2FXUWdiM0JqYjJSbElDaHZjRDBsWkN3Z2NHTTlKV1FwQUNnL09pa0FibThnWm5WdVkzUnBiMjRnWm1sc1pXNWhiV1VnWm05eUlHbHRjRzl5ZENncEFDMWZMaUYrS2ljb0tRQWdZVzV2Ym5sdGIzVnpLQUJUZVcxaWIyd29BR1Y0Y0dWamRHbHVaeUFuZlNjQVkyeGhjM01nWTI5dWMzUnlkV04wYjNKeklHMTFjM1FnWW1VZ2FXNTJiMnRsWkNCM2FYUm9JQ2R1WlhjbkFHVjRjR1ZqZEdsdVp5QW5ZWE1uQUhWdVpYaHdaV04wWldRZ2RHOXJaVzRnYVc0Z1pYaHdjbVZ6YzJsdmJqb2dKeVV1S25NbkFIVnVaWGh3WldOMFpXUWdkRzlyWlc0NklDY2xMaXB6SndCeVpXUmxZMnhoY21GMGFXOXVJRzltSUNjbGN5Y0FaSFZ3YkdsallYUmxJR1Y0Y0c5eWRHVmtJRzVoYldVZ0p5VnpKd0JqYVhKamRXeGhjaUJ5WldabGNtVnVZMlVnZDJobGJpQnNiMjlyYVc1bklHWnZjaUJsZUhCdmNuUWdKeVZ6SnlCcGJpQnRiMlIxYkdVZ0p5VnpKd0JEYjNWc1pDQnViM1FnWm1sdVpDQmxlSEJ2Y25RZ0p5VnpKeUJwYmlCdGIyUjFiR1VnSnlWekp3QmpiM1ZzWkNCdWIzUWdiRzloWkNCdGIyUjFiR1VnSnlWekp3QmpZVzV1YjNRZ1pHVm1hVzVsSUhaaGNtbGhZbXhsSUNjbGN5Y0FkVzVrWldacGJtVmtJSEJ5YVhaaGRHVWdabWxsYkdRZ0p5VnpKd0IxYm5OMWNIQnZjblJsWkNCeVpXWmxjbVZ1WTJVZ2RHOGdKM04xY0dWeUp3QnBiblpoYkdsa0lIVnpaU0J2WmlBbmMzVndaWEluQUNkbWIzSWdZWGRoYVhRbklHeHZiM0FnYzJodmRXeGtJR0psSUhWelpXUWdkMmwwYUNBbmIyWW5BR1Y0Y0dWamRHbHVaeUFuSldNbkFIVnVjR0Z5Wlc1MGFHVnphWHBsWkNCMWJtRnllU0JsZUhCeVpYTnphVzl1SUdOaGJpZDBJR0Z3Y0dWaGNpQnZiaUIwYUdVZ2JHVm1kQzFvWVc1a0lITnBaR1VnYjJZZ0p5b3FKd0JwYm5aaGJHbGtJSFZ6WlNCdlppQW5hVzF3YjNKMEtDa25BR1Y0Y0dWamRHbHVaeUFsSlFBN0x6ODZRQ1k5S3lRc0l3QTlJZ0J6WlhRZ0FHZGxkQ0FBVzI5aWFtVmpkQ0FBWVhONWJtTWdablZ1WTNScGIyNGdBR0p2ZFc1a0lBQWxMak56TENBbE1ESmtJQ1V1TTNNZ0pUQXFaQ0FBWVhONWJtTWdBRG9nQUNBZ0lDQWdJQ0FnSUNBQUNpa2dld29BQ2twVFQySnFaV04wSUdOc1lYTnpaWE1LQUNVdE1qQnpJQ1U0Y3lBbE9ITUtBQ0FnSlRWa0lDQWxNaTR3WkNBbGN3b0FJQ0FsTTNVZ0t5QWxMVEoxSUNBbGN3b0FJQ0J0WVd4c2IyTmZkWE5oWW14bFgzTnBlbVVnZFc1aGRtRnBiR0ZpYkdVS0FDVXRNakJ6SUNVNGJHeGtDZ0FsTFRJd2N5QWxPR3hzWkNBbE9HeHNaQW9BWDE5S1UxOUdjbVZsVm1Gc2RXVTZJSFZ1YTI1dmQyNGdkR0ZuUFNWa0NnQWxMVEl3Y3lBbE9HeHNaQ0FsT0d4c1pDQWdLQ1V3TGpGbUlIQmxjaUJtWVhOMElHRnljbUY1S1FvQUpTMHlNSE1nSlRoc2JHUWdKVGhzYkdRZ0lDZ2xNQzR4WmlCd1pYSWdiMkpxWldOMEtRb0FKUzB5TUhNZ0pUaHNiR1FnSlRoc2JHUWdJQ2dsTUM0eFppQndaWElnWm5WdVkzUnBiMjRwQ2dBbExUSXdjeUFsT0d4c1pDQWxPR3hzWkNBZ0tDVXdMakZtSUhCbGNpQmhkRzl0S1FvQUpTMHlNSE1nSlRoc2JHUWdKVGhzYkdRZ0lDZ2xNQzR4WmlCd1pYSWdZbXh2WTJzcENnQWxMVEl3Y3lBbE9HeHNaQ0FsT0d4c1pDQWdLQ1ZrSUc5MlpYSm9aV0ZrTENBbE1DNHhaaUJoZG1WeVlXZGxJSE5zWVdOcktRb0FKUzB5TUhNZ0pUaHNiR1FnSlRoc2JHUWdJQ2dsTUM0eFppQndaWElnYzNSeWFXNW5LUW9BSlMweU1ITWdKVGhzYkdRZ0pUaHNiR1FnSUNnbE1DNHhaaUJ3WlhJZ2MyaGhjR1VwQ2dCUmRXbGphMHBUSUcxbGJXOXllU0IxYzJGblpTQXRMU0JDYVdkT2RXMGdNakF5TVMwd015MHlOeUIyWlhKemFXOXVMQ0FsWkMxaWFYUXNJRzFoYkd4dll5QnNhVzFwZERvZ0pXeHNaQW9LQUFBQUFId3BBQURMTFFBQTZpZ0FBT29vQUFEcUtBQUE2aWdBQU9vb0FBRHFLQUFBNmlnQUFPb29BQURGR0FBQXJEd0FBS3c4QUVHUW53RUxBWklBUVp5ZkFRc05rd0FBQUdVQUFBQm1BQUFBbEFCQnRKOEJDejJWQUFBQVp3QUFBR2dBQUFDV0FBQUFad0FBQUdnQUFBQ1hBQUFBWndBQUFHZ0FBQUNZQUFBQVp3QUFBR2dBQUFDWkFBQUFaUUFBQUdZQUFBQ1pBRUg4bndFTERad0FBQUJuQUFBQWFBQUFBSklBUVpTZ0FRdXRBNTBBQUFCcEFBQUFhZ0FBQUowQUFBQnJBQUFBYkFBQUFKMEFBQUJ0QUFBQWJnQUFBSjBBQUFCdkFBQUFjQUFBQUo0QUFBQnJBQUFBYkFBQUFKOEFBQUJ4QUFBQWNnQUFBS0FBQUFCekFBQUFBQUFBQUtFQUFBQjBBQUFBQUFBQUFLSUFBQUIwQUFBQUFBQUFBS01BQUFCMUFBQUFkZ0FBQUtRQUFBQjFBQUFBZGdBQUFLVUFBQUIxQUFBQWRnQUFBS1lBQUFCMUFBQUFkZ0FBQUtjQUFBQjFBQUFBZGdBQUFLZ0FBQUIxQUFBQWRnQUFBS2tBQUFCMUFBQUFkZ0FBQUtvQUFBQjFBQUFBZGdBQUFLc0FBQUIxQUFBQWRnQUFBS3dBQUFCMUFBQUFkZ0FBQUswQUFBQjFBQUFBZGdBQUFLNEFBQUIxQUFBQWRnQUFBSzhBQUFCbkFBQUFhQUFBQUxBQUFBQm5BQUFBYUFBQUFMRUFBQUIzQUFBQUFBQUFBTElBQUFCbkFBQUFhQUFBQUxNQUFBQjRBQUFBZVFBQUFMVUFBQUI2QUFBQWV3QUFBTFlBQUFCNkFBQUFld0FBQUxjQUFBQjZBQUFBZXdBQUFMZ0FBQUI2QUFBQWV3QUFBTGtBQUFCOEFBQUFmUUFBQUxvQUFBQjhBQUFBZlFBQUFMc0FBQUIrQUFBQWZ3QUFBTHdBQUFCK0FBQUFmd0FBQUwwQUFBQ0FBQUFBZ1FBQUFMNEFBQUNDQUFBQWd3QkIwS01CQ3dHRUFFSGdvd0VMRFlVQUFBQUFBQUFBaGdBQUFJY0FRWXlrQVFzQmlBQkJtS1FCQ3dtSkFBQUFpZ0FBQUlzQVFiQ2tBUXZWQXJNeUFBQndBUUFBdkJJQUFBZ0JBQURNR0FBQU1BQUFBRFl1QUFBUUFBQUF1ellBQUZnQUFBQ1NBQUFBakFBQUFJMEFBQUNPQUFBQWp3QUFBSkFBQUFDUkFBQUFrZ0FBQUpNQUFBQ1VBQUFBTUdJQUFQQmlBQUNnWXdBQThHTUFBREJrQUFCUVpBQUFEQXNGQkFJQ0FBREFBQUFBbFFBQUFKWUFBQURCQUFBQWx3QUFBSmdBQUFEQ0FBQUFsd0FBQUpnQUFBRERBQUFBYXdBQUFHd0FBQURFQUFBQW1RQUFBSm9BQUFERkFBQUFtUUFBQUpvQUFBQXZBQUFBbXdBQUFKd0FBQURHQUFBQWF3QUFBR3dBQUFESEFBQUFuUUFBQUo0QUFBQUFBQUFBN2g4QUFCOGdBQUFxSUFBQTRoOEFBQlVnQUFBNUlBQUErQjhBQUFZZ0FBQmpiM0I1VjJsMGFHbHVBR1Z1ZEhKcFpYTUFabWxzYkFCbWFXNWtBR1pwYm1SSmJtUmxlQUJtYkdGMEFHWnNZWFJOWVhBQWFXNWpiSFZrWlhNQWEyVjVjd0IyWVd4MVpYTUFBQUFBQUFFQkFnSURBd0lEQUVHUXB3RUwzeEJ1ZFd4c0FHWmhiSE5sQUhSeWRXVUFhV1lBWld4elpRQnlaWFIxY200QWRtRnlBSFJvYVhNQVpHVnNaWFJsQUhadmFXUUFkSGx3Wlc5bUFHNWxkd0JwYmdCcGJuTjBZVzVqWlc5bUFHUnZBSGRvYVd4bEFHWnZjZ0JpY21WaGF3QmpiMjUwYVc1MVpRQnpkMmwwWTJnQVkyRnpaUUJrWldaaGRXeDBBSFJvY205M0FIUnllUUJqWVhSamFBQm1hVzVoYkd4NUFHWjFibU4wYVc5dUFHUmxZblZuWjJWeUFIZHBkR2dBWTJ4aGMzTUFZMjl1YzNRQVpXNTFiUUJsZUhCdmNuUUFaWGgwWlc1a2N3QnBiWEJ2Y25RQWMzVndaWElBYVcxd2JHVnRaVzUwY3dCcGJuUmxjbVpoWTJVQWJHVjBBSEJoWTJ0aFoyVUFjSEpwZG1GMFpRQndjbTkwWldOMFpXUUFjSFZpYkdsakFITjBZWFJwWXdCNWFXVnNaQUJoZDJGcGRBQUFiR1Z1WjNSb0FHWnBiR1ZPWVcxbEFHeHBibVZPZFcxaVpYSUFiV1Z6YzJGblpRQmxjbkp2Y25NQWMzUmhZMnNBYm1GdFpRQjBiMU4wY21sdVp3QjBiMHh2WTJGc1pWTjBjbWx1WndCMllXeDFaVTltQUdWMllXd0FjSEp2ZEc5MGVYQmxBR052Ym5OMGNuVmpkRzl5QUdOdmJtWnBaM1Z5WVdKc1pRQjNjbWwwWVdKc1pRQmxiblZ0WlhKaFlteGxBSFpoYkhWbEFHZGxkQUJ6WlhRQWIyWUFYMTl3Y205MGIxOWZBSFZ1WkdWbWFXNWxaQUJ1ZFcxaVpYSUFZbTl2YkdWaGJnQnpkSEpwYm1jQWIySnFaV04wQUhONWJXSnZiQUJwYm5SbFoyVnlBSFZ1YTI1dmQyNEFZWEpuZFcxbGJuUnpBR05oYkd4bFpRQmpZV3hzWlhJQVBHVjJZV3crQUR4eVpYUStBRHgyWVhJK0FEeGhjbWRmZG1GeVBnQThkMmwwYUQ0QWJHRnpkRWx1WkdWNEFIUmhjbWRsZEFCcGJtUmxlQUJwYm5CMWRBQmtaV1pwYm1WUWNtOXdaWEowYVdWekFHRndjR3g1QUdwdmFXNEFZMjl1WTJGMEFITndiR2wwQUdOdmJuTjBjblZqZEFCblpYUlFjbTkwYjNSNWNHVlBaZ0J6WlhSUWNtOTBiM1I1Y0dWUFpnQnBjMFY0ZEdWdWMybGliR1VBY0hKbGRtVnVkRVY0ZEdWdWMybHZibk1BYUdGekFHUmxiR1YwWlZCeWIzQmxjblI1QUdSbFptbHVaVkJ5YjNCbGNuUjVBR2RsZEU5M2JsQnliM0JsY25SNVJHVnpZM0pwY0hSdmNnQnZkMjVMWlhsekFHRmtaQUJrYjI1bEFHNWxlSFFBZG1Gc2RXVnpBSE52ZFhKalpRQm1iR0ZuY3dCbmJHOWlZV3dBZFc1cFkyOWtaUUJ5WVhjQWJtVjNMblJoY21kbGRBQjBhR2x6TG1GamRHbDJaVjltZFc1akFEeG9iMjFsWDI5aWFtVmpkRDRBUEdOdmJYQjFkR1ZrWDJacFpXeGtQZ0E4YzNSaGRHbGpYMk52YlhCMWRHVmtYMlpwWld4a1BnQThZMnhoYzNOZlptbGxiR1J6WDJsdWFYUStBRHhpY21GdVpENEFJMk52Ym5OMGNuVmpkRzl5QUdGekFHWnliMjBBYldWMFlRQXFaR1ZtWVhWc2RDb0FLZ0JOYjJSMWJHVUFkR2hsYmdCeVpYTnZiSFpsQUhKbGFtVmpkQUJ3Y205dGFYTmxBSEJ5YjNoNUFISmxkbTlyWlFCaGMzbHVZd0JsZUdWakFHZHliM1Z3Y3dCemRHRjBkWE1BY21WaGMyOXVBR2RzYjJKaGJGUm9hWE1BWW1sbmFXNTBBR0pwWjJac2IyRjBBR0pwWjJSbFkybHRZV3dBY205MWJtUnBibWROYjJSbEFHMWhlR2x0ZFcxVGFXZHVhV1pwWTJGdWRFUnBaMmwwY3dCdFlYaHBiWFZ0Um5KaFkzUnBiMjVFYVdkcGRITUFkRzlLVTA5T0FFOWlhbVZqZEFCQmNuSmhlUUJGY25KdmNnQk9kVzFpWlhJQVUzUnlhVzVuQUVKdmIyeGxZVzRBVTNsdFltOXNBRUZ5WjNWdFpXNTBjd0JOWVhSb0FFcFRUMDRBUkdGMFpRQkdkVzVqZEdsdmJnQkhaVzVsY21GMGIzSkdkVzVqZEdsdmJnQkdiM0pKYmtsMFpYSmhkRzl5QUZKbFowVjRjQUJCY25KaGVVSjFabVpsY2dCVGFHRnlaV1JCY25KaGVVSjFabVpsY2dCVmFXNTBPRU5zWVcxd1pXUkJjbkpoZVFCSmJuUTRRWEp5WVhrQVZXbHVkRGhCY25KaGVRQkpiblF4TmtGeWNtRjVBRlZwYm5ReE5rRnljbUY1QUVsdWRETXlRWEp5WVhrQVZXbHVkRE15UVhKeVlYa0FRbWxuU1c1ME5qUkJjbkpoZVFCQ2FXZFZhVzUwTmpSQmNuSmhlUUJHYkc5aGRETXlRWEp5WVhrQVJteHZZWFEyTkVGeWNtRjVBRVJoZEdGV2FXVjNBRUpwWjBsdWRBQkNhV2RHYkc5aGRBQkNhV2RHYkc5aGRFVnVkZ0JDYVdkRVpXTnBiV0ZzQUU5d1pYSmhkRzl5VTJWMEFFOXdaWEpoZEc5eWN3Qk5ZWEFBVTJWMEFGZGxZV3ROWVhBQVYyVmhhMU5sZEFCTllYQWdTWFJsY21GMGIzSUFVMlYwSUVsMFpYSmhkRzl5QUVGeWNtRjVJRWwwWlhKaGRHOXlBRk4wY21sdVp5QkpkR1Z5WVhSdmNnQlNaV2RGZUhBZ1UzUnlhVzVuSUVsMFpYSmhkRzl5QUVkbGJtVnlZWFJ2Y2dCUWNtOTRlUUJRY205dGFYTmxBRkJ5YjIxcGMyVlNaWE52YkhabFJuVnVZM1JwYjI0QVVISnZiV2x6WlZKbGFtVmpkRVoxYm1OMGFXOXVBRUZ6ZVc1alJuVnVZM1JwYjI0QVFYTjVibU5HZFc1amRHbHZibEpsYzI5c2RtVUFRWE41Ym1OR2RXNWpkR2x2YmxKbGFtVmpkQUJCYzNsdVkwZGxibVZ5WVhSdmNrWjFibU4wYVc5dUFFRnplVzVqUjJWdVpYSmhkRzl5QUVWMllXeEZjbkp2Y2dCU1lXNW5aVVZ5Y205eUFGSmxabVZ5Wlc1alpVVnljbTl5QUZONWJuUmhlRVZ5Y205eUFGUjVjR1ZGY25KdmNnQlZVa2xGY25KdmNnQkpiblJsY201aGJFVnljbTl5QUR4aWNtRnVaRDRBVTNsdFltOXNMblJ2VUhKcGJXbDBhWFpsQUZONWJXSnZiQzVwZEdWeVlYUnZjZ0JUZVcxaWIyd3ViV0YwWTJnQVUzbHRZbTlzTG0xaGRHTm9RV3hzQUZONWJXSnZiQzV5WlhCc1lXTmxBRk41YldKdmJDNXpaV0Z5WTJnQVUzbHRZbTlzTG5Od2JHbDBBRk41YldKdmJDNTBiMU4wY21sdVoxUmhad0JUZVcxaWIyd3VhWE5EYjI1allYUlRjSEpsWVdSaFlteGxBRk41YldKdmJDNW9ZWE5KYm5OMFlXNWpaUUJUZVcxaWIyd3VjM0JsWTJsbGN3QlRlVzFpYjJ3dWRXNXpZMjl3WVdKc1pYTUFVM2x0WW05c0xtRnplVzVqU1hSbGNtRjBiM0lBVTNsdFltOXNMbTl3WlhKaGRHOXlVMlYwQUVHQXVBRUx0UWdCQUFBQUJRQUJGQVVBQVJVRkFBRVZCUUFCRndVQUFSY0JBQUVBQVFBQkFBRUFBUUFCQUFFQUFRQUJBQUVBQVFBQ0FBRUZBd0FCQ2dFQkFBQUJBZ0VBQVFNQ0FBRUJBZ0FCQWdNQUFRSUVBQUVEQmdBQkFnTUFBUU1FQUFFRUJRQUJBd01BQVFRRUFBRUZCUUFCQWdJQUFRUUVBQUVEQXdBQkF3TUFBUVFFQUFFRkJRQURBZ0VOQXdFQkRRTUJBQTBEQWdFTkF3SUFEUU1BQVEwREF3RUtBUUVBQUFFQUFBQUJBUUlBQVFBQUFBRUNBZ0FCQWdBQUFRRUFBQUVCQUFBR0FBQVlCUUVCRHdNQ0FRb0JBZ0VBQVFFQkFBRUJBUUFGQUFFWEJRQUJGd1VBQVJjRkFRQVhCUUVBRndVQ0FCY0JBZ01BQVFNQUFBWUFBQmdHQUFBWUJnRUFHQVVCQVJjRkFRSVhCUUlBRndFQ0FRQUJBd0FBQVFNQkFBRUNBUUFCQWdJQUFRTUFBQUVEQVFBQkJBQUFCUUlCRndVQkFSY0JBZ0lBQVFJQkFBRUNBZ0FCQXdJQUFRTUNBQUlEQXdVR0FnRVlBZ01CQlFZQ0FoZ0dBd01ZQXdBQkVBTUJBQkFEQVFFUUF3QUJFUU1CQUJFREFRRVJBd0FCRWdNQkFCSURBUUVTQXdBQUVBTUFBUkFEQVFBUUF3RUFFQU1BQVJJREFRQVNBd0VBRWdNQUFCQUZBUUFXQlFFQUZnVUFBQllGQUFFV0JRQUFGZ0VCQUFBQkFRRUFBUUVCQUFFQ0FnQUtBUUFhQ2dJQkdnb0JBQm9LQVFBYUNnRUFHZ29CQUJvSEFBSVpCd0FDR1FjQUFoa0ZBQUlYQVFFQkFBRUJBd0FCQVFNQUFRRURBQUlEQlFVQkFRRUFBUUVDQUFFREFBQUJCQVFBQVFRRUFBSUVCUVVCQUFBQUFRRUNBQUVCQWdBQkFRSUFBUUVCQUFFQkFRQUJBUUVBQVFFQkFBRUJBUUFCQVFJQUFRRUNBQUlBQUFjQ0FBQUhBZ0VBQndFQkFRQUJBUUVBQVFFQkFBRUNBUUFGQUFFWEFRSUJBQUVDQVFBQkFnRUFBUUlCQUFFQ0FRQUJBZ0VBQVFJQkFBRUNBUUFCQWdFQUFRSUJBQUVDQVFBQkFnRUFBUUlCQUFFQ0FRQUJBZ0VBQVFJQkFBRUNBUUFCQWdFQUFRSUJBQUVDQVFBQkFnRUFBUUlCQUFFQkFRQUJBZ0VBQVFJQkFBRUFBQUFEQUFBS0F3QUFDZ1VBQUJZSEFBRVpCd0FCR1FjQkFCa0hBQUVaQ3dBQ0d3Y0FBaGtIQUFJWkJ3RUJHUWNCQWhrSEFRRVpCUUVCRXdVQUFCTUJBQUVCQVFBQkFRRUFBUUVCQUFFQkFRQUJBUUVBQVFFQkFBRUJBUUFCQVFFQUFRRUNBQUVHQXdBQkN3SUFBUWdDQUFFSUFRQUJBQUlBQVFjQ0FRQUhBZ0VCQndFQUFRSUJBQUVDQVFBQkFnRUFBUUlCQVFBQ0FRRUFBZ0VCQUFJQkFRQUNBUUVCQWdFQkFRSUJBUUVDQVFFQkFnRUFBUU1CQUFFREFRQUJBd0VBQVFNQkFRQURBUUVBQXdFQkFBTUJBUUFEQVFFQkF3RUJBUU1CQVFFREFRRUJBd0VBQVFRQkFBRUVBUUFCQkFFQUFRUUJBUUFFQVFFQUJBRUJBQVFCQVFBRUFRRUJCQUVCQVFRQkFRRUVBUUVCQkFFQkFRQUNBUUFKQWdFQUNRSUFBQWtEQUFBTUFRRUJEZ0VCQVE0QkFRRU9BUUVCRGdFQkFRQUJBUUVBQVFFQkFBRUJBUUNmQUFBQW9BQUFBS0VBQUFCdUFHWUFhUUJ1QUdrQWRBQjVBQTBBRUFBMEFEZ0FRY0RBQVF1VkVTc0FBQUF0QUFBQUtnQUFBQzhBQUFBbEFBQUFLaW9BQUh3QUFBQW1BQUFBWGdBQUFEdzhBQUErUGdBQVBqNCtBRDA5QUFBOEFBQUFjRzl6QUc1bFp3QXJLd0FBTFMwQUFINEFBQUFBQUFBQWZUQUFBQU1BQUFBQUFBQUFvZ0FBQUdzY0FBQUJBUUFBb3dBQUFBQUFBQURkTndBQUFRRUFBS1FBQUFBQUFBQUFyaXNBQUFFQ0FRQ2xBQUFBQUFBQUFPc3hBQUFCQWdJQXBRQUFBQUFBQUFDTE1nQUFBUUlFQUtVQUFBQUFBQUFBZENvQUFBRUNDQUNsQUFBQUFBQUFBS2cyQUFBQkFoQUFwUUFBQUFBQUFBRDdEZ0FBQVFJZ0FLVUFBQUFBQUFBQUVUNEFBQU1BQUFBQkFBQUFWUUFBQUc4MEFBQURBQUFBQWdBQUFLWUFBQUJqRXdBQUF3QUFBQUVBQUFDbkFBQUEwaTBBQUFNQUFBQUFBQUFBcUFBQUFBMUFBQUFEQUFBQUFnQUFBS2tBQUFDSVB3QUFBd0FBQUFFQUFBQ3FBQUFBZGo4QUFBTUFBQUFCQUFBQXF3QUFBSmMvQUFBREFBQUFBUUFBQUt3QUFBQXRQd0FBQXdBQUFBSUFBQUN0QUFBQVBEOEFBQUVCQUFDdUFBQUFBQUFBQVBVU0FBQURBQUFBQUF3QUFLOEFBQUNuUHdBQUFRTUFBRjBmQUFBQUFBQUFoMEVBQUFNSUFBRHdZUUFBQXdBQUFISXhBQUFEQUFBQUFnQUFBTEFBQUFBZkR3QUFBd0FBQUFNQUFBQ3hBQUFBcHo4QUFBRURBQUNIUVFBQUFBQUFBSVExQUFBREFBQUFBZ0FBQUxJQUFBQmZGd0FBQXdBQUFBSUJBQUN6QUFBQXRoY0FBQU1BQUFBQkFRQUF0QUFBQURjZUFBQURBQUFBQVFFQUFMVUFBQUFwTVFBQUF3QUFBQUVCQUFDMkFBQUFKU1FBQUFNQUFBQUFBUUFBdHdBQUFIZ3dBQUFCQWdBQXVBQUFBQUFBQUFBaUxRQUFBd0FBQUFFQkFBQzVBQUFBY1J3QUFBTUFCQUFBQVFBQXVnQUFBQ1VaQUFBREFBQUFBQUVBQUxvQUFBQnlIUUFBQXdBSUFBQUJBQUM2QUFBQVRUOEFBQU1KQUFCeUhRQUEvLy8vLzZjL0FBQUJBd0FBSXlVQUFBQUFBQUNlUFFBQUF3QUJBQUVCQUFDekFBQUFOeDRBQUFNQUFRQUJBUUFBdFFBQUFDa3hBQUFEQUFFQUFRRUFBTFlBQUFBbEpBQUFBd0FCQUFBQkFBQzNBQUFBZURBQUFBRUNBUUM0QUFBQUFBQUFBQ0l0QUFBREFBRUFBUUVBQUxrQUFBQnhIQUFBQXdBQkFBQUJBQUM2QUFBQUpSa0FBQU1KQUFCeEhBQUEvLy8vLzAwL0FBQURDUUFBY1J3QUFQLy8vLzl5SFFBQUF3QUpBQUFCQUFDNkFBQUFwejhBQUFFREFBQytGd0FBQUFBQUFGOFhBQUFEQUFJQUFnRUFBTE1BQUFDMkZ3QUFBd0FDQUFFQkFBQzBBQUFBTng0QUFBTUFBZ0FCQVFBQXRRQUFBQ2t4QUFBREFBSUFBUUVBQUxZQUFBQ25Qd0FBQVFNQUFCOGxBQUFBQUFBQW5qMEFBQU1BQXdBQkFRQUFzd0FBQURjZUFBQURBQU1BQVFFQUFMVUFBQUFwTVFBQUF3QURBQUVCQUFDMkFBQUFwejhBQUFFREFBQzZGd0FBQUFBQUFQVVNBQUFEQUFBQUFBd0FBTHNBQUFDblB3QUFBUU1BQUZBZkFBQUFBQUFBOVJJQUFBTUFBUUFBREFBQXV3QUFBS2MvQUFBQkF3QUFReDhBQUFBQUFBQThQd0FBQVFFQUFLNEFBQUFBQUFBQW9pZ0FBQU1BQUFBQ0FBQUF2QUFBQUJVdEFBQURBQUFBQVFBQUFMMEFBQUR6RGdBQUF3QUFBQUVBQUFDK0FBQUFwejhBQUFFREFBQ25NUUFBQUFBQUFJNHdBQUFEQUFBQUFRRUFBTDhBQUFEeEZ3QUFBd0FCQUFFQkFBQy9BQUFBY0NvQUFBTUFBQUFCQVFBQXdBQUFBRE05QUFBREFBRUFBUUVBQU1BQUFBREVEZ0FBQXdBQ0FBRUJBQURBQUFBQWF6Z0FBQU1BQUFBQkFBQUF3UUFBQUR3L0FBQUJBUUFBcmdBQUFBQUFBQUNuUHdBQUFRTUFBRm9tQUFBQUFBQUFYejhBQUFNQUFBQUFBQUFBd2dBQUFQVVNBQUFEQUFBQUFRRUFBTU1BQUFCc0pRQUFBd0FCQUFFQkFBRERBQUFBNnhBQUFBTUFBZ0FCQVFBQXd3QUFBUFVTQUFBREFBQUFBUUVBQU1RQUFBQnNKUUFBQXdBQkFBRUJBQURFQUFBQTZ4QUFBQU1BQWdBQkFRQUF4QUFBQUtjL0FBQUJBd0FBeGg4QUFBQUFBQUNuUHdBQUFRTUFBRU1tQUFBQUFBQUFZUzhBQUFNQUFBQUFBQUFBeFFBQUFOSXRBQUFEQUJNQUFBRUFBTVlBQUFDOFB3QUFBd0FBQUFFQUFBREhBQUFBU3k0QUFBTUFBd0FBQVFBQXhnQUFBQ291QUFBRENRQUFTeTRBQVAvLy8vOC9MZ0FBQXdBakFBQUJBQURHQUFBQTJ5MEFBQU1BRVFBQUFRQUF4Z0FBQVBzdEFBQURBQklBQUFFQUFNWUFBQUFiTGdBQUF3QXpBQUFCQUFER0FBQUE2QzBBQUFNQU1RQUFBUUFBeGdBQUFBZ3VBQUFEQURJQUFBRUFBTVlBQUFBYUZ3QUFBd0FBQUFBQUFBRElBQUFBeFRJQUFBTUFBQUFBQUFBQXhRQUFBRE1rQUFBREFBRUJBQUVBQU1rQUFBQkhKQUFBQXdBQkFBQUJBQURKQUFBQVlpUUFBQU1BQUFBQUFRQUF5UUFBQVA4ckFBQURBQkVBQUFFQUFNa0FBQUFVTEFBQUF3QVFBQUFCQUFESkFBQUFQekVBQUFNQUlRQUFBUUFBeVFBQUFGSXhBQUFEQUNBQUFBRUFBTWtBQUFDb0dnQUFBd0F4QUFBQkFBREpBQUFBdlJvQUFBTUFNQUFBQVFBQXlRQUFBSU1jQUFBREFFRUFBQUVBQU1rQUFBQ2NIQUFBQXdCQUFBQUJBQURKQUFBQThCMEFBQU1BVVFBQUFRQUF5UUFBQUFrZUFBQURBRkFBQUFFQUFNa0FBQUN2SFFBQUF3QmhBQUFCQUFESkFBQUEwaDBBQUFNQVlBQUFBUUFBeVFBQUFOMFBBQUFEQUhFQUFBRUFBTWtBQUFEa0R3QUFBd0J3QUFBQkFBREpBQUFBdlRJQUFBTUFBQUFCQUFBQXlnQUFBSjhkQUFBREFIRUdBUUVBQU1zQUFBQy9IUUFBQXdCd0JnRUJBQURMQUFBQTVSMEFBQU1BY1FVQ0FRQUF5d0FBQVBzZEFBQURBSEFGQWdFQUFNc0FBQUI0SEFBQUF3QnhCQU1CQUFETEFBQUFqaHdBQUFNQWNBUURBUUFBeXdBQUFKOGFBQUFEQUhFREJBRUFBTXNBQUFDeEdnQUFBd0J3QXdRQkFBRExBQUFBTnpFQUFBTUFNUUlCQVFBQXl3QUFBRWN4QUFBREFEQUNBUUVBQU1zQUFBRDJLd0FBQXdBeEFRSUJBQURMQUFBQUNDd0FBQU1BTUFFQ0FRQUF5d0FBQUNza0FBQURBQUFBQVFBQUFNd0FBQUE3SkFBQUF3QXhBQU1CQUFETEFBQUFVeVFBQUFNQU1BQURBUUFBeXdBQUFJVkJBQUFEQUFBQUFRQUFBTTBBQUFCVGRXNU5iMjVVZFdWWFpXUlVhSFZHY21sVFlYUUFRZURSQVFza1NtRnVSbVZpVFdGeVFYQnlUV0Y1U25WdVNuVnNRWFZuVTJWd1QyTjBUbTkyUkdWakFFR1EwZ0VMNWc0ZkFBQUFIQUFBQUI4QUFBQWVBQUFBSHdBQUFCNEFBQUFmQUFBQUh3QUFBQjRBQUFBZkFBQUFIZ0FBQUI4QUFBRDRFQUFBQXdBQUFBQUFBQURPQUFBQWNqRUFBQU1BQUFBQkFBQUF6d0FBQUU1RUFBQURBQUFBQndBQUFOQUFBQUNhbTV5ZG5xQ2hvcTJ1cjUrZkFBQUEwaTBBQUFNQUFBQUFBQUFBMFFBQUFHRXZBQUFEQUFBQUFBQUFBTklBQUFDblB3QUFBUU1BQUlnV0FBQUFBQUFBWGtFQUFBTUFBQUFDQVFBQTB3QUFBR1pCQUFBREFBRUFBZ0VBQU5NQUFBQklFUUFBQXdBQkFBSUJBQURVQUFBQVRSRUFBQU1BQWdBQ0FRQUExQUFBQUZjUkFBQURBQU1BQWdFQUFOUUFBQUJTRVFBQUF3QUdBQUlCQUFEVUFBQUFQeWtBQUFNQUVRQUNBUUFBMUFBQUFFY3BBQUFEQUJJQUFnRUFBTlFBQUFCWEtRQUFBd0FUQUFJQkFBRFVBQUFBVHlrQUFBTUFGZ0FDQVFBQTFBQUFBSkVUQUFBREFBQUFBUUVBQU5VQUFBQnBLUUFBQXdBQkFBRUJBQURWQUFBQWhVVUFBQU1BQUFBQkFRQUExZ0FBQVBNTUFBQURBQUVBQVFFQUFOWUFBQURTTFFBQUF3QUFBQUFBQUFEWEFBQUFZVFFBQUFNREFBQThJQUFBQUFBQUFMbzFBQUFEQXdBQVRFOEFBQUFBQUFBd01RQUFBd0FBQUFJQUFBRFlBQUFBZUM4QUFBTUFBQUFCQVFBQTJRQUFBR2t2QUFBREFBQUFBZ0FBQU5vQUFBQkFEZ0FBQXdBQUFBTUJBQURiQUFBQVlSMEFBQU1BQUFBQ0FBQUEzQUFBQU1VY0FBQURBQUFBQVFBQUFOMEFBQUQrR3dBQUF3QUFBQUVBQUFEZUFBQUFKUmtBQUFNQUFBQUJBUUFBM3dBQUFIRWNBQUFEQUFFQUFRRUFBTjhBQUFCeUhRQUFBd0FDQUFFQkFBRGZBQUFBcERRQUFBTUFBQUFCQVFBQTRBQUFBS2NiQUFBREFBQUFBUUVBQU9FQUFBQ3pIZ0FBQXdBQUFBSUJBQURpQUFBQXlSb0FBQU1BQUFBQkFBQUE0d0FBQUN3Y0FBQURBQUFBQWdBQUFPUUFBQUJIS0FBQUF3QUFBQUlBQUFEbEFBQUFxU3NBQUFNQUFBQUJBUUFBNWdBQUFJY3dBQUFEQUFFQUFRRUFBT1lBQUFCWlBRQUFBd0FBQUFFQkFBRG5BQUFBVnlnQUFBTUFBUUFCQVFBQTV3QUFBSlFhQUFBREFBQUFBUUFBQU9nQUFBQjZIUUFBQXdBQUFBRUFBQURwQUFBQTBpMEFBQU1BQUFBQUFBQUE2Z0FBQUJzdUFBQURBQUFBQUFBQUFPc0FBQUJoTHdBQUF3QUFBQUFBQUFEc0FBQUErZzBBQUFNQUFBQUJBQUFBN1FBQUFJY3ZBQUFEQUFBQUFRQUFBTzRBQUFBVU5RQUFBd0FBQUFFQUFBRHZBQUFBSXo4QUFBRUJBQUR3QUFBQThRQUFBQkkvQUFBREFBQUFBZ0VBQVBJQUFBRHdQZ0FBQXdBQkFBSUJBQUR5QUFBQUFUOEFBQU1BQUFBQkFRQUE4d0FBQU44K0FBQURBQUVBQVFFQUFQTUFBQUJ2S2dBQUF3QUFBQUVBQUFEMEFBQUF5QTRBQUFNQUFBQUNBUUFBOVFBQUFIRTVBQUFEQUFBQUFRQUFBUFlBQUFEU0xRQUFBd0FBQUFBQUFBRDNBQUFBK0Q4QUFBTUFBQUFCQUFBQStBQUFBR1kwQUFBQkFRQUErUUFBQUFBQUFBQURKQUFBQVFFQUFQb0FBQUFBQUFBQVRUOEFBQU1BQUFBQUFBQUF3Z0FBQUFBWkFBQURBQUFBQVFBQUFQc0FBQUMrRGdBQUF3QUFBQUVCQUFEOEFBQUFueklBQUFNQUFRQUJBUUFBL0FBQUFDSXRBQUFEQUFJQUFRRUFBUHdBQUFBVEpRQUFBd0FEQUFFQkFBRDhBQUFBVWlFQUFBTUFCQUFCQVFBQS9BQUFBTlkzQUFBREFBQUFBUUVBQVAwQUFBRGJGZ0FBQXdBQkFBRUJBQUQ5QUFBQUxpb0FBQU1BQUFBQkFBQUEvZ0FBQUd3NUFBQURBQUFBQVFFQUFQOEFBQUJERUFBQUF3QUJBQUVCQUFEL0FBQUFUUzhBQUFNQUFBQUJBQUFBQUFFQUFGVXZBQUFEQUFBQUFRQUFBQUVCQUFDV0hRQUFBd0FBQUFFQUFBQUNBUUFBNWljQUFBTUFBQUFCQVFBQUF3RUFBTkl0QUFBREFBQUFBQUFBQUFRQkFBQWJMZ0FBQXdBQkFBQUJBQUFEQVFBQXp5UUFBQU1BQUFBQUFRQUFCUUVBQU1Jc0FBQURBQUFBQVFFQUFBWUJBQURwRmdBQUF3QUJBQUFCQUFBRkFRQUE1eFlBQUFNQUFRQUJBUUFBQmdFQUFHb3hBQUFEQUFBQUFBQUFBQWNCQUFDV0V3QUFBd0FBQUFFQUFBQUlBUUFBWGpnQUFBTUFBQUFDQVFBQUNRRUFBR1E0QUFBREFBRUFBZ0VBQUFrQkFBRHZKd0FBQXdBQUFBSUFBQUFLQVFBQUZ5VUFBQU1BQVFBQkFRQUFDd0VBQU9rWUFBQURBQUFBQUFFQUFBc0JBQUJ4SEFBQUF3QUJBQUFCQUFBOUFBQUFUVDhBQUFNSkFBQnhIQUFBLy8vLy95VVpBQUFEQUFBQUFBRUFBRDBBQUFCeUhRQUFBd0FDQUFBQkFBQTlBQUFBeWc4QUFBTUFBQUFCQUFBQURBRUFBQzRwQUFBREFBQUFBUUFBQUEwQkFBQ3BMZ0FBQXdBQUFBQUFBQUFPQVFBQVBEOEFBQUVCQUFDdUFBQUFBQUFBQVBVU0FBQURBQUFBQUF3QUFENEFBQUNuUHdBQUFRTUFBRFFmQUFBQUFBQUFqeFlBQUFNQUFBQUNBQUFBRHdFQUFONFlBQUFEQUFBQUFRQUFBQkFCQUFCdFFRQUFBd0FBQUFFQUFBQVJBUUFBSURFQUFBTUFBQUFCQUFBQUVnRUFBSEZDQUFBREFBQUFBUUVBQUJNQkFBQkNGZ0FBQXdBQkFBRUJBQUFUQVFBQVowSUFBQU1BQUFBQkFRQUFGQUVBQUM4V0FBQURBQUVBQVFFQUFCUUJBQUJkTWdBQUF3QUFBQUVBQUFBVkFRQUFXeklBQUFNQUFBQUJBQUFBRmdFQUFIVU9BQUFBQmdBQUFBQUFBQUFBOEgrQlFRQUFBQVlBQUFBQUFBQUFBUGgvckR3QUFBQUhBRUdBNFFFTFZic3JBQUFEQUFBQUFBQUFBQmNCQUFCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV21GaVkyUmxabWRvYVdwcmJHMXViM0J4Y25OMGRYWjNlSGw2TURFeU16UTFOamM0T1VBcVh5c3RMaThBUWVEaEFRdVdBNXNyQUFBREFBQUFBUUFBQUJnQkFBRGJPZ0FBQXdBQUFBRUFBQUFaQVFBQTFTY0FBQU1BQUFBQkFBQUFHZ0VBQU5JdEFBQURBQUFBQVFFQUFCc0JBQUFiTGdBQUF3QUJBQUFCQUFBYkFRQUFZUzhBQUFNQUFBQUFBQUFBSEFFQUFJOFdBQUFEQ1FBQWp4WUFBQUFBQUFEZUdBQUFBd2tBQU40WUFBQUFBQUFBYlVFQUFBTUFBQUFCQUFBQUhRRUFBQ0F4QUFBREFBQUFBUUFBQUI0QkFBQWVJd0FBQXdBQUFBRUFBQUFmQVFBQUtDTUFBQU1BQUFBQkFBQUFJQUVBQUJ0REFBQUFCZ0FBLy8vLy8vLy83MzhsUXdBQUFBWUFBQUVBQUFBQUFBQUFnVUVBQUFBR0FBQUFBQUFBQUFENGYwZEFBQUFBQmdBQUFBQUFBQUFBOFA4MVFBQUFBQVlBQUFBQUFBQUFBUEIvakVFQUFBQUdBQUFBQUFBQUFBQ3dQRHhCQUFBQUJnQUEvLy8vLy8vL1AwTk5RUUFBQUFZQUFQLy8vLy8vL3ovRDBpMEFBQU1BQUFBQUFBQUFJUUVBQUdFdkFBQURBQUFBQUFBQUFDSUJBQUNHTndBQUF3QUFBQUVBQUFBakFRQUFxQlVBQUFNQUFBQUJBQUFBSkFFQUFFUVJBQUFEQUFBQUFRQUFBQ1VCQUFDYUxBQUFBUVFBUVlEbEFRdmlCaG9aQUFBREFBQUFBUUFBQUNZQkFBQVRHUUFBQXdBQUFBRUFBQUFuQVFBQUFCa0FBQU1BQUFBQkFBQUFLQUVBQUFjWkFBQURBQUFBQVFBQUFDa0JBQUJOTHdBQUF3QUFBQUVCQUFBcUFRQUFWUzhBQUFNQUFRQUJBUUFBS2dFQUFKWWRBQUFEQUFBQUFRRUFBQ3NCQUFCQkxBQUFBd0FDQUFFQkFBQXJBUUFBTml3QUFBTUFBUUFCQVFBQUt3RUFBQTh0QUFBREFOSUFBUUVBQUN3QkFBQjdLZ0FBQXdEVEFBRUJBQUFzQVFBQUd5MEFBQU1BMVFBQkFRQUFMQUVBQUxjV0FBQURBQUFBQWdBQUFDMEJBQUJmTFFBQUF3QUFBQUlBQUFBdUFRQUFtQjRBQUFNQUFBQUNBQUFBTHdFQUFGNDRBQUFEQUFBQUFnQUFBREFCQUFENUdBQUFBd0FBQUFFQUFBQXhBUUFBY0RnQUFBTUFBQUFDQVFBQU1nRUFBSVFxQUFBREFBRUFBZ0VBQURJQkFBQStPZ0FBQXdBQkFBRUJBQUF6QVFBQXFoTUFBQU1BQUFBQkFRQUFNd0VBQURvcEFBQURBQU1BQUFFQUFEUUJBQUEyT2dBQUF3QUNBQUFCQUFBMEFRQUEwUllBQUFNSkFBQTJPZ0FBLy8vLy82QVRBQUFEQUFFQUFBRUFBRFFCQUFEdkZnQUFBd2tBQUtBVEFBRC8vLy8vMGkwQUFBTUFBQUFBQUFBQU5RRUFBR0V2QUFBREFBQUFBQUFBQURVQkFBQVlNUUFBQXdBQUFBRUFBQUEyQVFBQTlqRUFBQU1BQUFBQkFBQUFOd0VBQUs4eEFBQURBQUVBQUFFQUFEZ0JBQUROTVFBQUF3QUFBQUFCQUFBNEFRQUF1ekVBQUFNQUFRQUFBUUFBT0FFQUFOa3hBQUFEQUFBQUFBRUFBRGdCQUFCTlB3QUFBd0FGQUFBQkFBQTlBQUFBVWlBQUFBTUFBQUFCQVFBQU9RRUFBSWN1QUFBREFBRUFBQUVBQURrQkFBQzFLd0FBQXdBQ0FBQUJBQUE1QVFBQVJUb0FBQU1BQXdBQUFRQUFPUUVBQU5VNkFBQURBQVFBQUFFQUFEa0JBQUJJSUFBQUF3QUZBQUVCQUFBNUFRQUFtaThBQUFNQUJnQUJBUUFBT1FFQUFCY2VBQUFEQUFjQUFBRUFBRGtCQUFDMkt3QUFBd0FJQUFFQkFBQTVBUUFBYVNvQUFBTUFDUUFBQVFBQU9RRUFBSTQxQUFBREFBb0FBQUVBQURrQkFBQjVQZ0FBQXdBTEFBQUJBQUE1QVFBQXZTUUFBQU1BREFBQUFRQUFPUUVBQU4wK0FBQmhOQUFBaHk0QUFBQUFBQUMxS3dBQUFBQUFBTkkrQUFBQUFBQUFFaE1BQUFBQUFBQ1FGUUFBVENBQUFKQVZBQUI0TUFBQTlDc0FBQUFBQUFEZFBnQUEyeTRBQUdrcUFBQUFBQUFBampVQUFBQUFBQUI1UGdBQUFBQUFBTDBrQUVIdzZ3RUxzUkwxRWdBQUF3QUFBQUFNQUFBNkFRQUFwejhBQUFFREFBQmtId0FBQUFBQUFMMHNBQUFEQ0FBQUlIWUFBQ3dBQUFEckp3QUFBd0FBQUFJQkFBQTdBUUFBZlJBQUFBTUFBUUFDQVFBQU93RUFBQjhlQUFBREFBQUFBUVlBQUR3QkFBQkNJQUFBQXdBQUFBRUdBQUE5QVFBQWp5b0FBQU1BQUFBQkJnQUFQZ0VBQURvNUFBQURBQUFBQVFZQUFEOEJBQUNSRXdBQUF3QUFBQUVHQUFCQUFRQUFGQnNBQUFNQUFBQUJCZ0FBUVFFQUFPRW5BQUFEQUFBQUFRWUFBRUlCQUFEYktBQUFBd0FBQUFFR0FBQkRBUUFBZWtVQUFBTUFBQUFDQndBQVJBRUFBQlViQUFBREFBQUFBUVlBQUVVQkFBQ3lKQUFBQXdBQUFBRUdBQUJHQVFBQUxTMEFBQU1BQUFBQkJnQUFSd0VBQVBRUUFBQURBQUFBQWdjQUFFZ0JBQURpSndBQUF3QUFBQUVHQUFCSkFRQUEzQ2dBQUFNQUFBQUJCZ0FBU2dFQUFBZytBQUFEQUFBQUFRWUFBRXNCQUFCU0tBQUFBd0FBQUFFR0FBQk1BUUFBeUN3QUFBTUFBQUFCQmdBQVRRRUFBT0FzQUFBREFBQUFBUVlBQUU0QkFBRG1MQUFBQXdBQUFBRUdBQUJQQVFBQXh5d0FBQU1BQUFBQkJnQUFVQUVBQU44c0FBQURBQUFBQVFZQUFGRUJBQURsTEFBQUF3QUFBQUVHQUFCU0FRQUFKRVlBQUFNQUFBQUJCZ0FBVXdFQUFENGxBQUFEQUFBQUFRWUFBRlFCQUFDQVJRQUFBd0FBQUFFR0FBQlZBUUFBdWtZQUFBTUFBQUFCQmdBQVZnRUFBSnNUQUFBREFBQUFBUVlBQUZjQkFBRFJFd0FBQXdBQUFBSUFBQUJZQVFBQU15a0FBQU1BQUFBQUFBQUFXUUVBQUM0NUFBQURBQUFBQVFZQUFGb0JBQUJ4S1FBQUF3QUFBQUlBQUFCYkFRQUFvVVVBQUFNQUFBQUJBQUFBWEFFQUFLYy9BQUFCQXdBQXZTd0FBQUFBQUFEbFF3QUFBQVlBQUdsWEZJc0t2d1ZBd0VZQUFBQUdBQUFXVmJXN3NXc0NRSjFGQUFBQUJnQUE3em42L2tJdTVqL2FRd0FBQUFZQUFQNkNLMlZIRmZjLzRFTUFBQUFHQUFBTzVTWVZlOHZiUDN0Q0FBQUFCZ0FBR0MxRVZQc2hDVUNQUlFBQUFBWUFBTTA3ZjJhZW9PWS9sMFVBQUFBR0FBRE5PMzltbnFEMlAra1hBQUFEQ0FBQThIZ0FBQTRBQUFESURnQUFBd0FBQUFNQUFBQmRBUUFBd2hjQUFBTUFBQUFDQUFBQVhnRUFBRUFPQUFBREFBRUFBd0VBQU5zQUFBQWREZ0FBQXdBQUFBSUFBQUJmQVFBQXRoY0FBQU1BQUFBQ0FBQUFZQUVBQUxNZUFBQURBQUVBQWdFQUFPSUFBQUI0THdBQUF3QUJBQUVCQUFEWkFBQUFOeDRBQUFNQUFBQUNBQUFBWVFFQUFLUTBBQUFEQUFFQUFRRUFBT0FBQUFCYUdRQUFBd0FBQUFFQUFBQmlBUUFBcHhzQUFBTUFBUUFCQVFBQTRRQUFBRjhYQUFBREFBQUFBd0FBQUdNQkFBQnBMd0FBQXdBQUFBSUFBQUJrQVFBQXB6OEFBQUVEQUFEcEZ3QUFBQUFBQU5JdEFBQURBQUFBQUFBQUFHVUJBQUJoTHdBQUF3QUFBQUFBQUFCbUFRQUF2RDhBQUFNQUFBQUJBQUFBWmdFQUFLYy9BQUFCQXdBQWd5a0FBQUFBQUFDdEpRQUFBUUVBQUdjQkFBQUFBQUFBV1NBQUFBTUFBQUFCQUFBQWFBRUFBRjBnQUFBREFBQUFBUUFBQUdrQkFBRDFFZ0FBQXdBQUFBRU1BQUJxQVFBQWJDVUFBQU1BQVFBQkRBQUFhZ0VBQU9zUUFBQURBQUlBQVF3QUFHb0JBQUNuUHdBQUFRTUFBTXNmQUFBQUFBQUFwejhBQUFFREFBQklKZ0FBQUFBQUFLa3NBQUFCQWhNQWF3RUFBQUFBQUFCZU9BQUFBd0FUQUFJQkFBQnNBUUFBcHo4QUFBRURBQUJrSXdBQUFBQUFBRFFSQUFBREFBQUFBUUFBQUcwQkFBQThQd0FBQVFFQUFLNEFBQUFBQUFBQXFTd0FBQUVDRkFCckFRQUFBQUFBQUY0NEFBQURBQlFBQWdFQUFHd0JBQUNuUHdBQUFRTUFBRDBqQUFBQUFBQUFQRDhBQUFFQkFBQ3VBQUFBQUFBQUFKb3NBQUFCQVFBQWJnRUFBQUFBQUFBMkl3QUFBUUlBQUc4QkFBQUFBQUFBcVN3QUFBRUNBQUJ3QVFBQUFBQUFBQThYQUFBQkFnQUFjUUVBQUFBQUFBQmZGd0FBQXdBQUFBRUFBQUJ5QVFBQWNSd0FBQU1BQVFBQUFRQUFjd0VBQUUwL0FBQURDUUFBY1J3QUFQLy8vLzhsR1FBQUF3QUFBQUFCQUFCekFRQUFjaDBBQUFNQUFnQUFBUUFBY3dFQUFLYy9BQUFCQVFBQWRBRUFBQUFBQUFEdkp3QUFBd0FBQUFJQUFBQjFBUUFBdmc0QUFBTUFDQUFCQVFBQS9BQUFBSjh5QUFBREFBa0FBUUVBQVB3QUFBQWlMUUFBQXdBS0FBRUJBQUQ4QUFBQUV5VUFBQU1BQ3dBQkFRQUEvQUFBQUZJaEFBQURBQXdBQVFFQUFQd0FBQURXTndBQUF3QUlBQUVCQUFEOUFBQUEyeFlBQUFNQUNRQUJBUUFBL1FBQUFDNHFBQUFEQUFBQUFRQUFBSFlCQUFCc09RQUFBd0FBQUFFQkFBQjNBUUFBUXhBQUFBTUFBUUFCQVFBQWR3RUFBR294QUFBREFBQUFBQUFBQUhnQkFBQmVPQUFBQXdBQUFBSUFBQUI1QVFBQUtROEFBQU1BQUFBQ0FBQUFlZ0VBQUpZVEFBQURBQUFBQVFBQUFIc0JBQURtSndBQUF3QUFBQUVCQUFCOEFRQUFHeTRBQUFNQUFRQUFBUUFBZkFFQUFFMHZBQUFEQUFBQUFRRUFBSDBCQUFCVkx3QUFBd0FCQUFFQkFBQjlBUUFBbGgwQUFBTUEvLzhCQVFBQWZRRUFBQzRwQUFBREFBQUFBUUFBQUg0QkFBQ3BMZ0FBQXdBQUFBQUFBQUIvQVFBQVBEOEFBQUVCQUFDdUFBQUFBQUFBQURZakFBQUJBZ0VBYndFQUFBQUFBQUNwTEFBQUFRSUJBSEFCQUFBQUFBQUFEeGNBQUFFQ0FRQnhBUUFBQUFBQUFNRkVBQUFEQUJZQUFRRUFBSUFCQUFDd1JBQUFBd0FYQUFFQkFBQ0FBUUFBRlVVQUFBTUFHQUFCQVFBQWdBRUFBQUpGQUFBREFCa0FBUUVBQUlBQkFBREVSUUFBQXdBYUFBRUJBQUNBQVFBQXNVVUFBQU1BR3dBQkFRQUFnQUVBQUU1RkFBQURBQndBQVFFQUFJQUJBQUExUlFBQUF3QWRBQUVCQUFDQUFRQUEyRVVBQUFNQUhnQUJBUUFBZ0FFQUFHVkZBQUFEQUI4QUFRRUFBSUFCQUFDNVJBQUFBd0FXQUFJQkFBQ0JBUUFBcDBRQUFBTUFGd0FDQVFBQWdRRUFBQXhGQUFBREFCZ0FBZ0VBQUlFQkFBRDRSQUFBQXdBWkFBSUJBQUNCQVFBQXUwVUFBQU1BR2dBQ0FRQUFnUUVBQUtkRkFBQURBQnNBQWdFQUFJRUJBQUJDUlFBQUF3QWNBQUlCQUFDQkFRQUFLRVVBQUFNQUhRQUNBUUFBZ1FFQUFNMUZBQUFEQUI0QUFnRUFBSUVCQUFCYVJRQUFBd0FmQUFJQkFBQ0JBUUFBcHo4QUFBRURBQUE3RVFBQUFBQUFBQ1FBQUFBaEFBQUFJZ0FBQUFjQUFBQUZBQUFBSVFBQUFDRUFBQUFoQUFBQUlRQUFBQ0VBQUFBaEFBQUFCQUFBQUFZQUFBQWhBQUFBSVFBQUFDRUFBQUFoQUFBQUlRQUFBQVFBQUFBQkFBQUFBZ0FBQUFFQUFBQUVBQUFBQVFBQUFBRUFBQUFJQUFBQUVBQUFBQUVBQUFBZ0FFR3MvZ0VMSVFJQUFBQUFBQUFBQVFBQUFBRUFBQUFCQUFBQUR3QUFBQTRBQUFBUkFBQUFFQUJCK1A0QkN6RUNBQUFBQXdBQUFBUUFBQUFBQUFBQUFRQUFBQVVBQUFBSkFBQUFDZ0FBQUFzQUFBQU5BQUFBRFFBQUFBMEFBQUFOQUVHMC93RUxCUXdBQUFBTUFFSEUvd0VMQ1FjQUFBQUlBQUFBQmdCQjJQOEJDMzRFQUFBQUxRQUFBQzBBQUFCVUFBQUFPZ0FBQURvQUFBQXVBQUFBZmtnQUFNUk1BQUI0U0FBQWdnRUFBSU1CQUFDQ0FRQUFoQUVBQUlVQkFBQ0dBUUFBaHdFQUFJZ0JBQUNKQVFBQWlnRUFBSXNCQUFDTUFRQUFqUUVBQUl3QkFBQ09BUUFBandFQUFKQUJBQUNSQVFBQWtnRUFBSk1CQUFDVUFRQUFsUUVBUWVDQUFnc3FDZ0FKQUE0QUlBQWhBS0FBb1FDQUZvRVdBQ0FMSUNnZ0tpQXZJREFnWHlCZ0lBQXdBVEQvL2dEL0FFR1VnUUlMTFJBQUFBRCsvLytIL3YvL0J3QUFBQUFRQVA4RC92Ly9oLzcvL3dlOGdBQUFZSUFBQU5DQUFBQUJBREFBT2dCQjBJRUNDeEVFQURBQU9nQkJBRnNBWHdCZ0FHRUFld0JCOElFQ0M4UUxBUU1GQVFFQkFRVUZCUUVDQWdNRkJRRUJBUUlDQXdNRkJRRUZBUkVBQUFBd21pQUFBSm93QUhPQldnQXdGMkFBTUFkc0FMT0Jid0FBRjNBQUFBZDhBQUNCZndCQU1JQUF3d0dZQUpDQm1BQkFCcGtBUUpDY0FMU0JwQUJBTHFVQU1BRzhBRUNHdkFCd2diOEFBQUhBQURDQndBQkFCTUVBTUFIREFFQ0N3d0F3Z3NRQVFJTEZBREFCeHdBd2djY0FNQUhJQUVDQ3lBQXdnY2tBTUFIS0FBQ0J5Z0F3QWNzQU1JSExBRUFDekFBQUFjMEFNQUhPQURDQnpnQUFBYzhBTUlIUEFFQUcwQUF3QWRNQVFJTFRBRENCMUFCQUF0WUFNQUhYQUVDQzF3QXdndGdBUUlUWkFEQ0Iyd0JBQXR3QVFBTGVBQUNCM3dCUUErSUFVSVBqQUZBRDVRQkFrT1lBQUlIdUFFQVM3d0MwQWZnQVVJUDRBRUFDK2dBd0Fmc0FNSUg3QUVBby9BQXdBUkFCUUJJUkFURUJIUUZBZ2gwQk1JRWVBVEVCSHdFQmdoOEJRSUlnQVRDQklRRXdBU0lCTUlFaUFVQUtJd0VCQVNnQkFZRW9BUUVCS1FFQWdTa0JBQUVxQVFBQ0t3RUFnU3dCQUlFdEFRRUJMZ0VBQVRBQkFZRXdBUUNCTVFFQmdUSUJBUUV6QVFBQk5BRUFnVFFCQVFFMUFRR0JOUUVCQVRZQkFJRTNBUUdCT0FFQUFUa0JBSUU2QVFHQlBnRUFBVUFCQVFGQkFRQ0JRUUVCZ1VNQkFBRkVBUUNCUkFFQUFrVUJBQUZHQVFBQlNRRUJnVTRCQVFGUEFYT0JvZ0ZBQkxnQlFBSzdBUUNEdlFFd2diOEJNQUhEQVRBRHhBRXdBY1lCTUFMSEFkQUJ5QUV3a2NnQk1JblJBUUFCMWdFQWc5WUIwd0hZQVFDUjJBRnpBZUVCQUluaEFRQUI1Z0VBZ3VZQk1JSG5BWE1CNkFGemdlZ0JjNEhxQVhNQjZ3RUFnZXNCUUJqc0FYTUIrQUZ6Z2ZnQkFBSDVBUUNCK1FHZ0Fmb0JjNEg2QVVDQyt3RXdnZndCUUFMOUFUQ0QvZ0V3RUFBQ01DQUlBZ0FnR0FJQUVDZ0NRQ0l3QWtBMlJRSXdBV0FDUUk1Z0FnQ0Jad0pBWUdnQ01LYVlBZ0Ntc0FLMWdjTUNNU1pRQ0RHQll3Z3hnV1lJQUN0b0NBQ0RmZ2dSVU5BSkVBYjRDU0FHL0FsMEFVQU9kSUZBRG5RQlFRNTBnVUVPZEFGQ0RuU0JRZzUwQVVNT2dJRkREb0FCUkE0d0swZ09NSU5lRGdHQnZBNEJnYjRPQVFISERrQitBQTlBR0Q4UHRRRkxEN2FCU3crMkFVd1B0b0ZNRDdjQlRRK0FnVTBQTUFGUEQwQmdVQThBQ0lBUE1BaUVEd0FHaUE4d0Jvd1BBQWlRRHpBSWxBOEFDSmdQTUFpY0R3QUdvQTh3QnFRUHNBR29Ed0NCcUEvVEFha1BBSUdwRDlNQnFnOEFnYW9QMHdHckR3Q0Jxdzh3Z2F3UE1JR3REekNCcmc4d2dhOFBBQWl3RHpBSXRBOEFBcmdQQUFTNUR3QUN1dzhCQXJ3UEFRSzlEd0VDdmcrM0NNQVBad2pFRDdnSXlBOW9DTXdQdUFqUUQyZ0kxQThBQXRnUHVRSFpEN0dCMlErNUFkb1BzUUhiRDllQjJ3OHdBdHdQTUFMZEQyRUIzZzl6QWQ4UHVRSGhEN0tCNFErNkFlSVBzZ0hqRDlpQjR3OHdCT1FQWWdIbUR3QUM2QS9RQWVrUDBJSHBEN0FCNncvUWdlc1BNQUxzRHpBQzdROEJBdkFQMHdIeEQ5T0I4USs2QWZJUEFZSHlEN0FCOHcvVGdmTVBNQUwwRHpBQzlROHhBZllQdWdINUQ3S0IrUSs3QWZvUHNnSDdEOW1CK3c4d0F2d1BNQUw5RDJJQi9nK2dBWk1Rb0FHVkVLQ0JsUkF4QVprUUFRR25FREVRc0JBQkVMZ1FRSUxCRURFYVd4SUJHbWdTTVM4QUZnRXZHQlpBQWpBV01BRXhGakNCTVJZd0FUSVdBSUV5RmdBQk14WkFoak1XTUlFMkZqQUJOeFl3Z1RjV01BRTRGa0FDT1JaQWdqb1dNQUkvRmtCa1FCWkFoSFVXUUFKNUZnQW1nQllBZ1pNV0FJR1dGa0F1SUZOQUhFQlRRQTZSVTBBK21WTkFoTHhUTUlHK1UwQUt2MU5BZ3NWVE1JSEdVMEFFeUZNQkFjcFRRQlRMVXpBQjFWTXdnZFZUTUFIV1V6Q0IxbE13QWRkVE1BSFlVekNCMkZNd0FkbFRNWUhaVTBBTTJsTkFBdUZUTVFIaVV6Q0I0bE13QWVOVFFJVGpVMENDK2xNQmdhbFZJRkM0VmJJQmdIMnlnWUI5c2dHQmZkcUJnWDNhQVlKOXM0R0NmYk1CZzMyN2dZbDl1d0dLZmJ1QmluMjhBWXQ5dTRHTGZUR2FrSDhCbXFCL01TZ0FnZ0VvRklJeEpGaUNBU1JzZ2pFelFJWUJNMkNHTVNCUWpBRWdZSXd4SUNDM0FTQXd0ekVpZ1BRQklwSDBBRUhBalFJTDR3TUJBSndHQjAwREJCQUFqd3NBQUJFQUNBQlRTbEVBVWdCVEFEcFVWUUJYV1Q5ZFhBQkdZV05DWkFCbUFHZ0FhZ0JzQUc0QUFFQUFBQUFBR2dDVEFBQWdOUUFuQUNFQUpDSXFBQk5yYlFBbUpDY1VGaGdiSEQ0ZVB4ODVQU0loUVI1QUpTVW1LQ0FxU1N4RExrc3dUREpFUXBrQUFKV1BmWDZEaEJLQWduWjNFbnVqZkhoNWlwS1lwcUNGQUpxaGszVXpsUUNPQUhTWm1KZVdBQUNlQUp3QW9hQVZMaTh3dExWT3Fxa1NGQjRoSWlJcU5EV21wellmU2dBQWx3RmEyaDAyQlFERXc4YkZ5TWZLeWN6THhOVkYxa0xYUnRqTzBOTFUydG51OXY0T0J3K0Fud0FoZ0tQdEFNQkF4bURuMithWndBQUFCbURjS2YwVkVnWVcrTjBHRlJLRUNNWVcvOThEd0VBQVJtRGU0RzAzT0RrVkZCY1dBQm9aSEJzQVg3ZGxSRWNBVDJKT1VBQUFTQUFBQUtPa3BRQUFBQUFBdGdBQVdnQklBRnRXV0dCZWNHbHZUUUFBTzJlNEFBQkZxSXFMakt1c1dGaXZsTEJ2c2x4YlhsMWdYMkpoWkdObVpXaG5BQUFBQUFBQUFKa0RDQU1CQTZVREV3TUFBMElEa1FPWEE2a0RSZ0JKQUV3QVV3QnBBQWNEdkFKT0FFb0FEQU0xQlZJRlNBQXhBMVFBVndBS0Exa0FRUUMrQWdnZmdCOG9INUFmYUIrZ0g3b2ZoZ096SDhvZmlRUERINkVEK2grUEEvTWZSQVZHQlRzRlRnVTlCYmdEWWdSS3BtQWV5UU5yQU9VQVFiQ1JBZ3ZDQVVDcGdJNkEvSURUZ0l5QWpZR05Bb0RoZ0pHRm1nRUFBUkVBQVFRSUFRZ3dDQUVWSUFBNW1UR2RoRUNVZ05hQ3BvQkJZb0NtZ0ZkMitBS0FqNEN3UU5zSWdFSFFnSXlBajR6a0F3R0pBQlFvRUJFQ0FSZ0xKRXNtQVFHRzVZQmdlYmFCUUpHQnZZaVVCWUNZZ01lQ1F6U2lCb0NNWVNpVzFJREdBUWdKQzRDTEFBYUF3QU1QQm9DYkF3UUFGb0JCVTRHWWdKaUFub0NZZ0o2QW1JQ2VnSmlBbm9DWUIxbGptWVdaaFprQUFBQUF1UUxnb0I1QW5xWkF1dFFCaWRjQml2RUJBRUdBa3dJTHRBV21CWUNLZ0tJQWdNWURBQU1CZ1VIMlFMOFpHSWdJZ0VENmhrRE9CSUN3ckFBQkFRQ3JnSXFGaVlvQW9vQ0psSStBNURpSkE2QUFnSjJhMm9xNWloZ0lsNWVxZ3ZhdnRnQURPd0tHaVlHTWdJNkF1UU1mZ0pPQm1RR0J1QU1MQ1JLQW5RcUFpb0c0QXlBTGdKT0JsU2lBdVFFQUh3YUJpb0dkZ0x5QWk0Q3hBb0M0RkJBZWdZcUJuSUM1QVFVRWdaT0JtNEc0Q3grQWs0R2NnTWNHRUlEWkFZYUtpT0VCaUlnQWhjbUJtZ0FBZ0xhTkJBR0Vpb0NqaUlEbEdDZ0pnWmdMZ28rRGpBRU5nSTZBM1lCQ1g0SkRzWUtjZ3B5Qm5ZRy9DRGNCaWhBZ3JJT3pnTUNCb1lEMUU0R0lCWUpBMmdtQXVRQXdBQUU5aVFpbUI1QytnNjhBSUFTQXA0aUxnWjhaQ0lLM0FBb0Fncms1Z2IrRjBSQ01CaGdvRWJHK2pJQ2gzZ1JCdkFDQ2lvS01nb3lDaklHTEo0R0pBUUdFc0NDSkFJeUFqNHl5b0V1S2dmQ0MvSUNPZ04rZnJvQkIxSUNqR2lTQTNJWGNnbUJ2RllCRTRZVkJEWURoR0lrQW00UFBnWTJoellDV2d1d1BBZ09BbUF5QVFKYUJtWkdNZ0tXSG1JcXRncThCR1lHUWdKU0J3U2tKZ1lzSGdLS0Fpb0N5QUJFTUNJQ2FnSTBNQ0lEamhJaUMrQUVEZ0dCUEw0QkFrbzlDUFk4UWk0K2hBWUJBcUFZRmdJcUFvZ0NBcm9Dc2djS0FsSUpDQUlCQTRZQkFsSVJHaFJBTWc2Y1RnRUNrZ1VJOGcwR0NnVUNZaWtDdmdMV090NEt3R1FtQWpvQ3hncU1naDcyQWk0R3ppSWtaZ040UkFBMkFRSjhDaDVTQnVBcUFwREtFUU1JNUVJQ1dnTk1vQXdpQlFPMGRDSUdhZ2RRNUFJSHBBQUVvZ09RUkdJUkJBb2dCUVA4SUE0QkFqeGtMZ0orSnB5a2ZnSWdwZ3EyTUFVR1ZNQ2lBMFpVT0FRSDVLZ0FJTUlESENnQ0FRVnFCVlRxSVlEYTJoTHFHaUlORUNvQytrTDhJZ1dCTXR3aURWTUtDaUk4T25ZTkFrNEpIdXJhRHNUaU5nSlVnamtWUE1KQU9BUVJCQkkxQnJZTkYzNGJzaDBxdWhHd01BSUNkMy85QTd3QkJ3SmdDQzBLK0JRRCtCd0JTQ2lBRkRDQTdEa0JoRUVBUEdDQkRHMkI1SFFEeElBQU5wa0F1cVNEZXFnQVAveURuQ2tHQ0VTSEVGR0ZFR1FGSUhTR2t2QUUrNFFId0FRNEFRWkNaQWd1VkNNQ1poWm11Z0lrREJKYUFub0JCeVlPTGpTWUFnRUNBSUFrWUJRQVFBSk9BMG9CQWlvZEFwWUNsQ0lXb3hwb2JyS3FpQ09JQWpnNkJpUkdBandDZG5OaUtnSmVnaUFzRWxSaUlBb0NXbUlhS3RKU0FrYnUxRUpFR2lZNlBId21CbFFZQUV4Q1BnSXdJZ28yQmlRY3JDWlVHQVFFQm5oaUFrb0tQaUFLQWxRWUJCQkNSZ0k2QmxvQ0tPUW1WQmdFRUVKMElnbzZBa0FBcUVCb0lBQW9LRW91VmdMTTRFSmFBanhDWkZJR2RBemdRbG9DSkJCQ2ZBSUdPZ1pDSUFvQ29DSThFRjRLWExKR0NsNENJQUE2NXJ3R0xocmtJQUNDWEFJQ0pBWWdCSUlDVWc1K0F2amlqbW9UeXFwT0FqeXNhQWc0VGpJdUFrS1VBSUlHcWdFRk1BdzRBQTRHb0E0R2dBdzRBQTRHT2dMZ0RnY0trajQvVkRZSkNhNEdRZ0ptRXlvS0tob3dEalpHTmtZMk1BbzZ6b2dPQXd0aUdxQUNFeFltZXNKME1pcXVEbWJXV2lMVFJnTnl1a0lhMm5ZeUJpYXVabzZpQ2lhT0JpSWFxQ3FnWUtBb0VRTCsvUVJVTmdhVU5Ed0FBQUlDZWdiUUdBQklHRXcyRGpDSUc4NENNZ0krTTVBTUJpUUFOS0FBQWdJOExKQmlRcUVwMnJvQ3VnRUNFS3hHTHBRQWdnYmN3ajVhSU1EQXdNREF3TUlaQ0pZS1lpRFFNZzlVY2dOa0RoS3FBM1pDZnI0OUIvMW0vdjJCUi9JSkVqTUt0Z1VFTWdvK0pnWk91ajU2Qno2YUlnZWFCdElHSXFZd0NBNENXbkxPTnNiMHFBSUdLbTRtV21KeUdycHVBanlDSmlTQ29saENIazVZUWdyRUFFUXdJQUpjUmlqS0xLU21GaURBd3FvQ05oZktjWUN1amk1YURzR0FoQTBGdGdlbWxob3NrQUltQWpBUUFBUUdBNjZCQmFwRy9nYlduaS9NZ1FJYWptWVdaaXRnVkRRMEtvb3VBbVlDU0FZQ09nWTJoK3NTMFFRcWNnckN1bjR5ZGhLV0puWUdqSHdTcFFKMlJvNE9qZzZlSHMwQ2JRVGFJbFltSFFKY3BBS3NCRUlHV2laYUluc0NTQVltVmlabkZ0eW0vZ0k0WUVKeXBuSUtjb2ppYm1yV0psWW1TakpIdHlMYXlqTEtNbzBGYnFTbk5uSWtIbGVtVW1wYUx0TXFzbjVpWm81d0JCNklRaTYrTmc1UUFnS0tSZ0pqVE1BQVlqb0NKaHE2bE9RbVZCZ0VFRUpHQWk0UkFuYlNSZzVPQ25hK1RDSUJBdDY2b2c2T3ZrNEM2cW95QXhwcEE1S3Z6djU0NUFUZ0lsNDRBZ04wNXBvOEFnSnVBaWFjd2xJQ0tyWktBb2JoQkJvaUFwSkNBc0ozdk1BaWxsSUNZS0FpZmpZQkJScEpBdklET1E1bmw3cEJBdzBxN1JDNVAwRUpHWUNHNFFqaUdudkNka2ErUGc1NlVoSkpDcjcvL3lpREJqTDhJZ0p0WDk0ZEUxYW1JWUNMMlFSNndncEFmUVl0SkErcUVqSUtJaG9sWFpkU0F4Z0VJQ1F1QWl3QUdnTUFERHdhQW13TUVBQmFBUVZPQm1JQ1lnSjZBbUlDZWdKaUFub0NZZ0o2QW1BZEpNNnlKaG8rQVFYQ3JSUk5BeExyRE1FU3pHSm9CQUFpQWlRTUFBQ2dZQUFBQ0FRQUlBQUFBQUFFQUN3WURBd0NBaVlDUUlnU0FrRkZEWUtiZG9WQTBpa0RkZ1ZhQmpWMHdUQjVDSFVYaFUwb0FRYkNoQWd0ajlnTWdwZ2NBcVFrQXRBb0F1Z3NBUGcwQTRBNGdWeElBNnhZQXloa2d3QjFnZ0NBQUxpMEF3REVnaWFjZzhLa0E0NnNBUHYwQSt3QWhOd2RoQVFvQkhROGhMQklCeUJRaDBSa2hSeDBCT1dvaENZMEJ2TlFCcWRjaE91NEIzcVlpU3hNREFFR2dvZ0lMOGdTdmlhU0Exb0JDUisrV2dFRDZoRUVJckFBQkFRREhpcStlS09ReEtRZ1ppWmFBblpyYWlvNkpvSWlJZ0pjWWlBSUVxb0wyam9DZ3RSQ1JCb2tKaVpDQ3R3QXhDWUtJZ0lrSmlZMEJncmNBSXdrU2dKT0xFSXFDdHdBNEVJS1RDWW1KS0lLM0FERUpGb0tKQ1ltUmdMb2lFSU9JZ0kySmo0UzRNQkFlZ1lvSmlaQ0N0d0F3RUI2QmlnbUpqNE8yQ0RBUWc0aUFpUW1Ka0lMRkF5Z0FQWWtKdkFHR2l6aUoxZ0dJaWltSnZRMkppZ0FBQTRHd2t3R0Vpb0NqaUlEams0Q0ppeHNRRVRLRGpJdUFqa0srZ29pSVE1K0NuSUtjZ1oyQnY1K0lBWW1nRVlsQWpvRDFpNE9MaVluL2lydUV1SW1BbklHS2hZbVZqUUcraEs2UWlvbVFpSXVDbll5QmlhdU5yNU9IaVlXSjlSQ1VHQ2dLUU1XNUJFSStnWktBK293WWdvdEwvWUpBaklEZm4wSXBoZWlCWUhXRWljUURpWitCejRGQkR3SURnSllqZ05LQnNaR0ppWVdSaklxYmg1aU1xNE91alk2SmlvQ0ppYTZOaXdjSmlhQ0NzUUFSREFpQXFDU0JRT3M0Q1lsZ1R5T0FRdUNQajQ4Umw0SkF2NG1rZ0VLOGdFRGhnRUNVaEVFa2lVVldFQXlEcHhPQVFLU0JRandmaVVGd2dVQ1lpa0N1Z3JTT25vbU9nNnlLdElrcW80MkFpU0dyZ0l1Q3I0MDdnSXZSaXloQW40dUVpU3UyQ0RFSmdvaUFpUWt5aEVDL2tZaUpHTkNUaTRsQTFER0ltb0hSa0k2SjBJeUhpZEtPZzRsQThZNUFwSW5GS0FrWUFJR0xpZll4TW9DYmlhY3dINENJaXEyUFFaUTRoNCtKdDVXQWpma3FBQWd3QjRtdklBZ25pVUZJZzJCTGFJbEFoWVM2aHBpSlEvUUF0alBRZ0lxQllFeXFnVlRGSWk4NWhwMkRRSk9DUllpeFFmKzJnN0U0allDVklJNUZUekNRRGdFRVFRU0dpSWxCb1kxRjFZYnNOSWxTbFlsc0JRVkE3d0JCb0tjQ0M2TVMrZ1lBaEFrQThBb0FjQXdBOUEwQVNoQWdHaGdnZEJzZzNTQUFES2dBV3FvZ0d2OEFyUTRCT0JJaHdSVWg1UmtocWgwaGpORkJTdUVoOEFFT0FBQUFBRUZrYkdGdExFRmtiRzBBUVdodmJTeEJhRzl0QUVGdVlYUnZiR2xoYmw5SWFXVnliMmRzZVhCb2N5eEliSFYzQUVGeVlXSnBZeXhCY21GaUFFRnliV1Z1YVdGdUxFRnliVzRBUVhabGMzUmhiaXhCZG5OMEFFSmhiR2x1WlhObExFSmhiR2tBUW1GdGRXMHNRbUZ0ZFFCQ1lYTnpZVjlXWVdnc1FtRnpjd0JDWVhSaGF5eENZWFJyQUVKbGJtZGhiR2tzUW1WdVp3QkNhR0ZwYTNOMWEya3NRbWhyY3dCQ2IzQnZiVzltYnl4Q2IzQnZBRUp5WVdodGFTeENjbUZvQUVKeVlXbHNiR1VzUW5KaGFRQkNkV2RwYm1WelpTeENkV2RwQUVKMWFHbGtMRUoxYUdRQVEyRnVZV1JwWVc1ZlFXSnZjbWxuYVc1aGJDeERZVzV6QUVOaGNtbGhiaXhEWVhKcEFFTmhkV05oYzJsaGJsOUJiR0poYm1saGJpeEJaMmhpQUVOb1lXdHRZU3hEWVd0dEFFTm9ZVzBzUTJoaGJRQkRhR1Z5YjJ0bFpTeERhR1Z5QUVOb2IzSmhjMjFwWVc0c1EyaHljd0JEYjIxdGIyNHNXbmw1ZVFCRGIzQjBhV01zUTI5d2RDeFJZV0ZqQUVOMWJtVnBabTl5YlN4WWMzVjRBRU41Y0hKcGIzUXNRM0J5ZEFCRGVYSnBiR3hwWXl4RGVYSnNBRVJsYzJWeVpYUXNSSE55ZEFCRVpYWmhibUZuWVhKcExFUmxkbUVBUkdsMlpYTmZRV3QxY25Vc1JHbGhhd0JFYjJkeVlTeEViMmR5QUVSMWNHeHZlV0Z1TEVSMWNHd0FSV2Q1Y0hScFlXNWZTR2xsY205bmJIbHdhSE1zUldkNWNBQkZiR0poYzJGdUxFVnNZbUVBUld4NWJXRnBZeXhGYkhsdEFFVjBhR2x2Y0dsakxFVjBhR2tBUjJWdmNtZHBZVzRzUjJWdmNnQkhiR0ZuYjJ4cGRHbGpMRWRzWVdjQVIyOTBhR2xqTEVkdmRHZ0FSM0poYm5Sb1lTeEhjbUZ1QUVkeVpXVnJMRWR5WldzQVIzVnFZWEpoZEdrc1IzVnFjZ0JIZFc1cVlXeGhYMGR2Ym1ScExFZHZibWNBUjNWeWJYVnJhR2tzUjNWeWRRQklZVzRzU0dGdWFRQklZVzVuZFd3c1NHRnVad0JJWVc1cFptbGZVbTlvYVc1bmVXRXNVbTlvWndCSVlXNTFibTl2TEVoaGJtOEFTR0YwY21GdUxFaGhkSElBU0dWaWNtVjNMRWhsWW5JQVNHbHlZV2RoYm1Fc1NHbHlZUUJKYlhCbGNtbGhiRjlCY21GdFlXbGpMRUZ5YldrQVNXNW9aWEpwZEdWa0xGcHBibWdzVVdGaGFRQkpibk5qY21sd2RHbHZibUZzWDFCaGFHeGhkbWtzVUdoc2FRQkpibk5qY21sd2RHbHZibUZzWDFCaGNuUm9hV0Z1TEZCeWRHa0FTbUYyWVc1bGMyVXNTbUYyWVFCTFlXbDBhR2tzUzNSb2FRQkxZVzV1WVdSaExFdHVaR0VBUzJGMFlXdGhibUVzUzJGdVlRQkxZWGxoYUY5TWFTeExZV3hwQUV0b1lYSnZjMmgwYUdrc1MyaGhjZ0JMYUcxbGNpeExhRzF5QUV0b2IycHJhU3hMYUc5cUFFdG9hWFJoYmw5VGJXRnNiRjlUWTNKcGNIUXNTMmwwY3dCTGFIVmtZWGRoWkdrc1UybHVaQUJNWVc4c1RHRnZid0JNWVhScGJpeE1ZWFJ1QUV4bGNHTm9ZU3hNWlhCakFFeHBiV0oxTEV4cGJXSUFUR2x1WldGeVgwRXNUR2x1WVFCTWFXNWxZWEpmUWl4TWFXNWlBRXhwYzNVc1RHbHpkUUJNZVdOcFlXNHNUSGxqYVFCTWVXUnBZVzRzVEhsa2FRQk5ZV3RoYzJGeUxFMWhhMkVBVFdGb1lXcGhibWtzVFdGb2FnQk5ZV3hoZVdGc1lXMHNUV3g1YlFCTllXNWtZV2xqTEUxaGJtUUFUV0Z1YVdOb1lXVmhiaXhOWVc1cEFFMWhjbU5vWlc0c1RXRnlZd0JOWVhOaGNtRnRYMGR2Ym1ScExFZHZibTBBVFdWa1pXWmhhV1J5YVc0c1RXVmtaZ0JOWldWMFpXbGZUV0Y1Wldzc1RYUmxhUUJOWlc1a1pWOUxhV3RoYTNWcExFMWxibVFBVFdWeWIybDBhV05mUTNWeWMybDJaU3hOWlhKakFFMWxjbTlwZEdsalgwaHBaWEp2WjJ4NWNHaHpMRTFsY204QVRXbGhieXhRYkhKa0FFMXZaR2tzVFc5a2FRQk5iMjVuYjJ4cFlXNHNUVzl1WndCTmNtOHNUWEp2YndCTmRXeDBZVzVwTEUxMWJIUUFUWGxoYm0xaGNpeE5lVzF5QUU1aFltRjBZV1ZoYml4T1ltRjBBRTVoYm1ScGJtRm5ZWEpwTEU1aGJtUUFUbVYzWDFSaGFWOU1kV1VzVkdGc2RRQk9aWGRoTEU1bGQyRUFUbXR2TEU1cmIyOEFUblZ6YUhVc1RuTm9kUUJPZVdsaGEyVnVaMTlRZFdGamFIVmxYMGh0YjI1bkxFaHRibkFBVDJkb1lXMHNUMmRoYlFCUGJGOURhR2xyYVN4UGJHTnJBRTlzWkY5SWRXNW5ZWEpwWVc0c1NIVnVad0JQYkdSZlNYUmhiR2xqTEVsMFlXd0FUMnhrWDA1dmNuUm9YMEZ5WVdKcFlXNHNUbUZ5WWdCUGJHUmZVR1Z5YldsakxGQmxjbTBBVDJ4a1gxQmxjbk5wWVc0c1dIQmxid0JQYkdSZlUyOW5aR2xoYml4VGIyZHZBRTlzWkY5VGIzVjBhRjlCY21GaWFXRnVMRk5oY21JQVQyeGtYMVIxY210cFl5eFBjbXRvQUU5eWFYbGhMRTl5ZVdFQVQzTmhaMlVzVDNOblpRQlBjMjFoYm5saExFOXpiV0VBVUdGb1lYZG9YMGh0YjI1bkxFaHRibWNBVUdGc2JYbHlaVzVsTEZCaGJHMEFVR0YxWDBOcGJsOUlZWFVzVUdGMVl3QlFhR0ZuYzE5UVlTeFFhR0ZuQUZCb2IyVnVhV05wWVc0c1VHaHVlQUJRYzJGc2RHVnlYMUJoYUd4aGRta3NVR2hzY0FCU1pXcGhibWNzVW1wdVp3QlNkVzVwWXl4U2RXNXlBRk5oYldGeWFYUmhiaXhUWVcxeUFGTmhkWEpoYzJoMGNtRXNVMkYxY2dCVGFHRnlZV1JoTEZOb2NtUUFVMmhoZG1saGJpeFRhR0YzQUZOcFpHUm9ZVzBzVTJsa1pBQlRhV2R1VjNKcGRHbHVaeXhUWjI1M0FGTnBibWhoYkdFc1UybHVhQUJUYjJka2FXRnVMRk52WjJRQVUyOXlZVjlUYjIxd1pXNW5MRk52Y21FQVUyOTViMjFpYnl4VGIzbHZBRk4xYm1SaGJtVnpaU3hUZFc1a0FGTjViRzkwYVY5T1lXZHlhU3hUZVd4dkFGTjVjbWxoWXl4VGVYSmpBRlJoWjJGc2IyY3NWR2RzWndCVVlXZGlZVzUzWVN4VVlXZGlBRlJoYVY5TVpTeFVZV3hsQUZSaGFWOVVhR0Z0TEV4aGJtRUFWR0ZwWDFacFpYUXNWR0YyZEFCVVlXdHlhU3hVWVd0eUFGUmhiV2xzTEZSaGJXd0FWR0Z1WjNWMExGUmhibWNBVkdWc2RXZDFMRlJsYkhVQVZHaGhZVzVoTEZSb1lXRUFWR2hoYVN4VWFHRnBBRlJwWW1WMFlXNHNWR2xpZEFCVWFXWnBibUZuYUN4VVptNW5BRlJwY21oMWRHRXNWR2x5YUFCVloyRnlhWFJwWXl4VloyRnlBRlpoYVN4V1lXbHBBRmRoYm1Ob2J5eFhZMmh2QUZkaGNtRnVaMTlEYVhScExGZGhjbUVBV1dWNmFXUnBMRmxsZW1rQVdXa3NXV2xwYVFCYVlXNWhZbUY2WVhKZlUzRjFZWEpsTEZwaGJtSUFRZEM1QWd1eEZNQVptVVdGR1psRnJobUFSWTRaZ0VXRUdaWkZnQm1lUllBWjRXQkZwaG1FUllRWmdRMlRHZUFQTjRNcmdCbUNLd0dESzRBWmdDc0RnQ3VBR1lBcmdCbUNLd0NBS3dDVEt3QytLNDBhanl2Z0pCMkJOK0JJSFFDbEJRR3hCUUdDQlFDMk5BZWFOQU9GTkFxRUJJQVpoUVNBR1kwRWdCbUFCQUNBQklBWm53U0FHWWtFaWplWkJJQTM0QXNFZ0JtaEJJMkhBTHVIQVlLSHJ3U3hrUTI2WXdHQ1k2MTdBWTU3QUp0UUFZQlFBSXFITkpRRUFKRUVDbzRFZ0JtY0JOQWZnemVPSDRFWm1SK0RDd0NIQ3dHQkN3R1ZDd0NHQ3dDQUN3S0RDd0dJQ3dHQkN3R0RDd2VBQ3dPQkN3Q0VDd0dZQ3dHQ0xnQ0ZMZ09CTGdHVkxnQ0dMZ0NCTGdDQkxnQ0JMZ0dBTGdDRUxnT0JMZ0dDTGdLQUxnYURMZ0NBTGdhUUxnbUNMQUNJTEFDQ0xBQ1ZMQUNHTEFDQkxBQ0VMQUdKTEFDQ0xBQ0NMQUdBTEE2RExBR0xMQWFHTEFDQ2NBQ0hjQUdCY0FHVmNBQ0djQUNCY0FDRWNBR0ljQUdCY0FHQ2NBYUNjQU9CY0FDRWNBR1JjQW1CamdDRmpnS0NqZ0NEamdLQmpnQ0FqZ0NCamdLQmpnS0NqZ0tMamdPRWpnS0NqZ0NEamdHQWpnV0FqZzJVamdTTWtBQ0NrQUNXa0FDUGtBS0hrQUNDa0FDRGtBYUJrQUNDa0FTRGtBR0prQWFJa0l3OEFJSThBSlk4QUlrOEFJUThBWWc4QUlJOEFJTThCb0U4Qm9BOEFJTThBWWs4QUlFOERJeFBBSUpQQUxKUEFJSlBBSVZQQTQ5UEFabFBBSUtCQUpHQkFwZUJBSWlCQUlDQkFZYUJBb0NCQTRXQkFJQ0JBSWVCQlltQkFZS0JDN21TQTRBWm01SWtnVVFBZ0VRQWhFUUFsMFFBZ0VRQWxrUUJoRVFBZ0VRQWhVUUJpVVFCZzBRZng1TUFvNU1EcHBNQW81TUFqcE1BaHBPREdZR1RKT0EvWHFVbkFJQW5CSUFuQWFvbmdCbURKK0NmTU1nbUFJTW1BWVltQUlBbUFJTW1BYWdtQUlNbUFhQW1BSU1tQVlZbUFJQW1BSU1tQVk0bUFMZ21BSU1tQWNJbUFaOG1BcGttQmRVWEFZVVhBZUlmRXB4bUFzcDZnaG1LZWdhTWlBQ0dpQXFVTW9FWkNKTVJDNHlKQUlLSkFJR0pDOTFBQVlsQUJZbEFCWUZiZ1JtQVc0QVppRnNBaVZzRjJGc0dxbHNFeFJJSm5rY0FpMGNEaTBjRGdFY0NpMGVkaWdHRWlncXJZUU9aWVFXS1lRS0JZWjlBbXhBQmdSQytpd0NjaXdHS2l3V0ppd1dOaXdHUU56N0xCd09zQndLL2hiTUtCNE1LdDBZQ2prWUNna2F2WjRnZEJxb25BWUluaDRVSGdqZUFHWXczZ0JtR040TVpnRGVGR1lBM2dobUJONEFaQktWRmhDdUFIYkJGaEN1RFJZUXJqRVdBSGNWRmdDdTVOd0NFTitDZlJaVXJBWVVyQWFVckFZVXJBWWNyQUlBckFJQXJBSUFyQUo0ckFiUXJBSTRyQUkwckFZVXJBSklyQVlJckFJZ3JBSXNaZ1RmV0dRQ0tHWUJGQVlvWmdFV09HUUNNUlFLZkdRK2dOdzZsR1lBcmdobUJSWVVaZ0VXYUdZQkZrQm1vUllJWkErSTJHUmlLR1JUalB4bmdudy9pRXhrQm54a0E0QWdacmlnQXJpZ0FuMFhnRXhvRWhocWxKd0NBSndTQUp3RzNsQWFCbEEyQWxKWW1DSVltQUlZbUFJWW1BSVltQUlZbUFJWW1BSVltQUlZbUFKOGQwaGtzbVM4QTJDOEw0SFV2R1lzWkE0UVpnQytBR1lBdm1CbUlMNE0zZ1RDSEdZTXZneGtBMVRVQmdUZUJHWUkxZ0JuWlBZRVpnajBFcWcwQTNUQUFqeG1mRGFNWkM0ODluakFBdnhtZU1OQVpyajJBR2RjOTRFY1o4QWxmTDc4WjhFR2NMd0xrTEpzQ3Rwc0lyMHJneTVjVDN4M1hDQWVoR2VBRlJZSVp0RVVCaUVVcGlrV3NoZ0tKR1FXM2RnZkZmQWVMZkFXZkg2MCtnQm1BUHFONUNvQjVuREFDelRvQWdCbUpPZ09CT3A1ZUFMWVdDSTBXQVlrV0FZTVduMTdDakJlRWpKWlZDWVVtQVlVbUFZVW1DSVltQUlZbUFLcEZnQm1JUllBcmcwV0JHUVBQRjYxVkFZbFZCZkFiUXpBTGxqQURzREJ3RUtQaERTOEI0QWt2SllaRkM0UUZCSmswQUlRMEFJQTBBSUUwQUlFMEFJazA0QkVFRU9FS0JJRVpENzhFQWJVRUo0MEVBWTgzaVJrRmpUZUJIYUlaQUpJWkFJTVpBNFFFQU9BbUJBR0FHUUNmR1psRmhSbVpSWW9aaVQyQUdhdzlnUm1lTUFLRk1BR0ZNQUdGTUFHQ01BS0dHUUNHR1FtRUdRR0xTUUNaU1FDU1NRQ0JTUUNPU1FHTlNTSGdHa2tFZ2hrRHJCa0NpQm5PS3dDTUdRS0FLeTZzR1lBM1lDR2NTd0t3RXc2QU41b1pBNk5wQ0lKcG1pa0VxbXNFblpZQWdKYWpiQU9OYkNuUEhxOStuWElCaVhJRm8zRURvM0VEcHlRSHN4UUtnQlJnTCtEV1NBaVZTQW1IU0dBM2hSd0JnQndBcXh3QWdSd0NnQndCZ0J5Vk5nQ0lOcDkwbmw4SGlGOHZrak1BZ1RNRWhET2Jkd0tBZDVsTUJJQk1QNTlZbDFjRGsxY0JyVmVEUHdDQlB3U0hQd0NDUHdDY1B3R0NQd09KUHdhSVB3YWZicDlxSDZaUkE0dFJDTFVHQW9ZR2xUa0Joem1TT0FTSE9KRjRCb040QzRaNFQ4aHZOckpvRExKb0JvVm9wekVIaVRGZ3haNEVBS21hQUlLYUFZR2FUYWR0QjZtQ1Zac1lFNVlsQ00wT0E1ME9Eb0FPd1RzS2dEc0JtSU1HaVlNRnRCVUFrUlVIcGs0STMzMEFrNEVLa1VFQXEwRkFobDBBZ0YwQWcxMEFqbDBBaWwwRnVrTUVpVU1GZ3lvQWh5b0JnU29CbFNvQWhpb0FnU29BaENvQWdEZUlLZ0dCS2dHQ0tnR0FLZ1dBS2dTR0tnR0dLZ0tFS21BcTIySUFoR0lkeDVVSGlaVmdSYlYvQWFWL0ljUmFDb2xhQll4YkVyaU5Cb21OTlpvQ0FZNENBNDhDWUYrN0lXQUQwcGtMZ0ptR0lBR0FJQUdISUFDQklBQ2RJQUNCSUFHTElBaUpJRVdIWUFHdFlBR0tZQnJIbkFmU2hCeTRkV0NtaUF3QXJBd0FqUXdKbkF3Q24xSUJsVklBalZKSWhsTUFnVk1BcTFNQ2dGTUFnVk1BaUZNSGlWTUZoUzBBZ1MwQXBDMEFnUzBBaFMwR2lTMWcxWmhOWUZhQVNnNnhqZ3lBanVNNUcyQUY0QTRiQUlRYkN1QmpHMnBiNDg0akFJZ2piMmJoNWdOd0VWamgyQWdHbmx3QWlWd0RnVnhmblFrQmhRa0p4WE1KaVhNQWhuTUFsSE1Fa25OaVQ5cFVZQVRLV1FPNFdRYVFXVCtBajRCa2dSbUFRZ3FCTHczd0I1ZVBCK0tmaitGMVFpbUlqM0FTbG9BOTRMMDFNSUkxRUlNOUIrRXJaR2lqNEFvaUJJd2lBb2dpQm9raUFZTWlneGx3QXZ2Z2xSa0pwaGtCdlJtQ041QVpoemVCR1lZM25SbURON29aRnNVcllEbVRHUXZXR1FpWUdXQW0xQmtBeGhrQWdSa0JnQmtCZ1JrQmd4a0FpeGtBZ0JrQWhoa0F3QmtBZ3hrQmh4a0FoaGtBbXhrQWd4a0FoQmtBZ0JrQ2hoa0E0UE1aQWVEREdRR3hHZUlyZ0E2RWdBQ09nR1R2aGlnQWtDZ0JoaWdBZ1NnQWhDaGdkS3hsQW8xbEFZbGxBNEZsWVErNW1BU0FtR1NmNEdSV0FZOVdLTXNCQTRrQkE0RUJZckRER1V1OEdXQmhnd1FBbWdRQWdRUUFnQVFCZ0FRQWlRUUFnd1FBZ0FRQWdBUUZnQVFEZ0FRQWdBUUFnQVFBZ2dRQWdRUUFnQVFCZ0FRQWdBUUFnQVFBZ0FRQWdBUUFnUVFBZ0FRQmd3UUFoZ1FBZ3dRQWd3UUFnQVFBaVFRQWtBUUVnZ1FBaEFRQWtBUXpnUVJncmFzWkErQURHUXVPR1FHT0dRQ09HUUNrR1FuZ1RSazNtUm1BTllFWkRLc1pBNGdaQm9FWkRZVVpZRG5qZHhrSGpCa0NqQmtDNEJNWkM5Z1pCb3NaRTRzWkE3Y1pCNGtaQmFjWkI1MFpBWUVaVGVBWUdRRFJHUURnSmhrTGpSa0JoQmtDZ2hrRWhoa0ltQmtHaGhrSWdoa01oaGtvNERJWkFMWVpKSWtaWTZYd2xuMHZJZS9VTHdyZ2ZTOEI4QVloTHczd0ROQXZhNzdodlM5bGdmQUM2aTk2M0ZXQUdSM2ZHV0FmNEk4M0FFR1F6Z0lMc2d1Q3dRQUFBU3NCQUFBQkt4d0FEQUZGZ0pJQUFBSWRhd0FDSFNnQkFoMUZBQUlkS0lFREFBQUZCREdIa1pvTkFBQUZCREdIa1pvQUF3U0hrUUVBQUFVRU1ZZVJtaDhBQUFnQkJGQlJlREdDaHdrQUNnSUVod2tBQ1FNRWtab0ZBQUFDQklkaUFBQUNCREdCK3dBQURRc2ZLaXd1UEVWUGNIMk9rSlVBREFzZktpd3VQRVZQY0k2UWxSQUFBQlFMSHlFdFV5b3NManhPVDJCd1E0R0dqWTZRbFFBVkN4OGhMVk1xTEM0OFIwNVBZSEJEZ1lhTmpwQ1ZDUVFmSVR0T2RRQUpBd3NWaG5VQUNRSXVYWFVBQ1FJc1FZQjFBQTBDS282QWNRQUpBanhnZ3M4QUNRTVZYb3FBTUFBQUFpZEZoYmdBQVFRUk1vbUlnRW9BQVFKYmRnQUFBQUpiZG9SSkFBQUVDeDhxUEFBQkh3QUVDeDhxUEFBQ0h5b0FBUjhCQWdzZkFBSWZmUUFDQ3g4QUFoOTlBQVlmUEU5d2pwQUFBUjhCQWg5OUFRRWZBQUlmZlFBQ0N4OEdBUjhBQWg5Z0FBSUxId0VCSHdBQ0N4OERBUjhBQ0FzZktqeGdjSkNWQUFJZktnQURIeW84QVFJTEh3QUJDd0VDSHlvQUFXQ0FSQUFCQVNzMUFBQUNIWWVCdFFBQUFrVmJnRDhBQUFNZktrV00wUUFBQWgwb2dUd0FBUVlOTUM4MVBac0FCUTB3THpVOUFRQUFBUzhBQUFrR0RUQXZOVDJiQUFBQUJRMHdMelU5QndZTk1DODFQWnNEQlEwd0x6VTlDUUFEQWcwdkFRQUFCUTB3THpVOUJBSTFQUUFBQUFVTk1DODFQUU1BQVFNdk5UMEJBUzlZQUFNQ05UMENBQUFDTlQxWkFBQUdEVEF2TlQyYkFBSTFQWUFTQUE4Qkx4OEFJd0V2T3dBbkFTODNBREFCTHc0QUN3RXZNZ0FBQVM5WEFCZ0JMd2tBQkFFdlh3QWVBUy9BTWU4QUFBSWRLSUFQQUFjQ0wwV0Fwd0FDRGg4aExDNUJQRHRPVDFwZ1E0MlZBZzBmSVN3dVFUdzdUbHBnUTQyVkF3c2ZJU3d1UVR0T1drT05sWUEyQUFBQ0N4OEFBQUFDSDQ0NUFBQURQa1ZlZ0I4QUFBSVFPc0FUb1FBQUFnU1JDUUFBQWdTUlJnQUJCUTB3THpVOWdKa0FCQVlOTUM4MVBac0pBQUFDTlQwc0FBRUNOVDJBM3dBQ0FoeEpBd0FzQXh4SVNRSUFDQUljU1lFZkFCc0NCQnFQaEFBQUFpcU9BQUFBQWlxT05nQUJBaXFPakJJQUFRSXFqZ0FBQUFJcWpzQmNTd0FEQVNLV093QVJBUytlWFFBQkFTL096UzBBQUVOdUxGVnVZWE56YVdkdVpXUUFUSFVzVlhCd1pYSmpZWE5sWDB4bGRIUmxjZ0JNYkN4TWIzZGxjbU5oYzJWZlRHVjBkR1Z5QUV4MExGUnBkR3hsWTJGelpWOU1aWFIwWlhJQVRHMHNUVzlrYVdacFpYSmZUR1YwZEdWeUFFeHZMRTkwYUdWeVgweGxkSFJsY2dCTmJpeE9iMjV6Y0dGamFXNW5YMDFoY21zQVRXTXNVM0JoWTJsdVoxOU5ZWEpyQUUxbExFVnVZMnh2YzJsdVoxOU5ZWEpyQUU1a0xFUmxZMmx0WVd4ZlRuVnRZbVZ5TEdScFoybDBBRTVzTEV4bGRIUmxjbDlPZFcxaVpYSUFUbThzVDNSb1pYSmZUblZ0WW1WeUFGTnRMRTFoZEdoZlUzbHRZbTlzQUZOakxFTjFjbkpsYm1ONVgxTjViV0p2YkFCVGF5eE5iMlJwWm1sbGNsOVRlVzFpYjJ3QVUyOHNUM1JvWlhKZlUzbHRZbTlzQUZCakxFTnZibTVsWTNSdmNsOVFkVzVqZEhWaGRHbHZiZ0JRWkN4RVlYTm9YMUIxYm1OMGRXRjBhVzl1QUZCekxFOXdaVzVmVUhWdVkzUjFZWFJwYjI0QVVHVXNRMnh2YzJWZlVIVnVZM1IxWVhScGIyNEFVR2tzU1c1cGRHbGhiRjlRZFc1amRIVmhkR2x2YmdCUVppeEdhVzVoYkY5UWRXNWpkSFZoZEdsdmJnQlFieXhQZEdobGNsOVFkVzVqZEhWaGRHbHZiZ0JhY3l4VGNHRmpaVjlUWlhCaGNtRjBiM0lBV213c1RHbHVaVjlUWlhCaGNtRjBiM0lBV25Bc1VHRnlZV2R5WVhCb1gxTmxjR0Z5WVhSdmNnQkRZeXhEYjI1MGNtOXNMR051ZEhKc0FFTm1MRVp2Y20xaGRBQkRjeXhUZFhKeWIyZGhkR1VBUTI4c1VISnBkbUYwWlY5VmMyVUFURU1zUTJGelpXUmZUR1YwZEdWeUFFd3NUR1YwZEdWeUFFMHNUV0Z5YXl4RGIyMWlhVzVwYm1kZlRXRnlhd0JPTEU1MWJXSmxjZ0JUTEZONWJXSnZiQUJRTEZCMWJtTjBkV0YwYVc5dUxIQjFibU4wQUZvc1UyVndZWEpoZEc5eUFFTXNUM1JvWlhJQVFkRFpBZ3V3Q0E0QUFBQStBQUFBd0FFQUFBQU9BQUFBOEFBQUFBQi9BQUFBZ0FNQkFBQThRVk5EU1VsZlNHVjRYMFJwWjJsMExFRklaWGdBUW1sa2FWOURiMjUwY205c0xFSnBaR2xmUXdCRVlYTm9BRVJsY0hKbFkyRjBaV1FzUkdWd0FFUnBZV055YVhScFl5eEVhV0VBUlhoMFpXNWtaWElzUlhoMEFFaGxlRjlFYVdkcGRDeElaWGdBU1VSVFgwSnBibUZ5ZVY5UGNHVnlZWFJ2Y2l4SlJGTkNBRWxFVTE5VWNtbHVZWEo1WDA5d1pYSmhkRzl5TEVsRVUxUUFTV1JsYjJkeVlYQm9hV01zU1dSbGJ3QktiMmx1WDBOdmJuUnliMndzU205cGJsOURBRXh2WjJsallXeGZUM0prWlhKZlJYaGpaWEIwYVc5dUxFeFBSUUJPYjI1amFHRnlZV04wWlhKZlEyOWtaVjlRYjJsdWRDeE9RMmhoY2dCUVlYUjBaWEp1WDFONWJuUmhlQ3hRWVhSZlUzbHVBRkJoZEhSbGNtNWZWMmhwZEdWZlUzQmhZMlVzVUdGMFgxZFRBRkYxYjNSaGRHbHZibDlOWVhKckxGRk5ZWEpyQUZKaFpHbGpZV3dBVW1WbmFXOXVZV3hmU1c1a2FXTmhkRzl5TEZKSkFGTmxiblJsYm1ObFgxUmxjbTFwYm1Gc0xGTlVaWEp0QUZOdlpuUmZSRzkwZEdWa0xGTkVBRlJsY20xcGJtRnNYMUIxYm1OMGRXRjBhVzl1TEZSbGNtMEFWVzVwWm1sbFpGOUpaR1Z2WjNKaGNHZ3NWVWxrWlc4QVZtRnlhV0YwYVc5dVgxTmxiR1ZqZEc5eUxGWlRBRmRvYVhSbFgxTndZV05sTEhOd1lXTmxBRUpwWkdsZlRXbHljbTl5WldRc1FtbGthVjlOQUVWdGIycHBBRVZ0YjJwcFgwTnZiWEJ2Ym1WdWRDeEZRMjl0Y0FCRmJXOXFhVjlOYjJScFptbGxjaXhGVFc5a0FFVnRiMnBwWDAxdlpHbG1hV1Z5WDBKaGMyVXNSVUpoYzJVQVJXMXZhbWxmVUhKbGMyVnVkR0YwYVc5dUxFVlFjbVZ6QUVWNGRHVnVaR1ZrWDFCcFkzUnZaM0poY0docFl5eEZlSFJRYVdOMEFFUmxabUYxYkhSZlNXZHViM0poWW14bFgwTnZaR1ZmVUc5cGJuUXNSRWtBU1VSZlUzUmhjblFzU1VSVEFFTmhjMlZmU1dkdWIzSmhZbXhsTEVOSkFFRlRRMGxKQUVGc2NHaGhZbVYwYVdNc1FXeHdhR0VBUVc1NUFFRnpjMmxuYm1Wa0FFTmhjMlZrQUVOb1lXNW5aWE5mVjJobGJsOURZWE5sWm05c1pHVmtMRU5YUTBZQVEyaGhibWRsYzE5WGFHVnVYME5oYzJWdFlYQndaV1FzUTFkRFRRQkRhR0Z1WjJWelgxZG9aVzVmVEc5M1pYSmpZWE5sWkN4RFYwd0FRMmhoYm1kbGMxOVhhR1Z1WDA1R1MwTmZRMkZ6WldadmJHUmxaQ3hEVjB0RFJnQkRhR0Z1WjJWelgxZG9aVzVmVkdsMGJHVmpZWE5sWkN4RFYxUUFRMmhoYm1kbGMxOVhhR1Z1WDFWd2NHVnlZMkZ6WldRc1ExZFZBRWR5WVhCb1pXMWxYMEpoYzJVc1IzSmZRbUZ6WlFCSGNtRndhR1Z0WlY5RmVIUmxibVFzUjNKZlJYaDBBRWxFWDBOdmJuUnBiblZsTEVsRVF3Qk1iM2RsY21OaGMyVXNURzkzWlhJQVRXRjBhQUJWY0hCbGNtTmhjMlVzVlhCd1pYSUFXRWxFWDBOdmJuUnBiblZsTEZoSlJFTUFXRWxFWDFOMFlYSjBMRmhKUkZNQVFaRGlBZ3UwSUlFQUtBQ1hBQ29BZ1lBcUFKZkFLd0FWZ1N3QWx3QXRBSUZBTFFDWEFDNEFGVUV1QUprQkx3QVdJREFBUWdoQUFFS0tSQUJDQkVvQWxnQk1BQmVCVEFCQ0FrMEFRa05PQUMvQlR3QkN3MUFBdjBCU0FFSURVd0JDQ1ZVQVFnaGFBSllBWGdCQ1ExNEFnY0JmQUVJQmFBQkN3V3NBaFFGeEFCZkRjUUJFU0hNQVJJTjNBRUtEZVFDK0Fuc0FsMEY4QUVJQmZRQkVCSDRBUWc2QUFFS0Jod0JFaDRrQWd3U3NBQmNEdGdDREFyZ0FGQUxRQUpZQTBRQ0FBTjBBbDREZUFJQ0Ezd0NYQU9FQVBrSGhBSURBNFFDK0JPSUFyb1BxQUs2QzhnQ3RBZlFBTHNIMEFBTkI5UUFEQS93QWdVRCtBRDRDQUFHK3dBRUJ2Z0VEQWI1QUJnRytRQTRCUGdJVUFiN0FGUUcrQVJjQlJJRWRBVVJCTUFGRUFqUUJSSUUxQVVTRE5nRkVnemdCUklZNkFVUUJQZ0dGd0dFQnJvS0lBUzlDblFHRUFiQUJoTUMwQVlSQVNnS0VRRXdDaEFCTkFpNEVWZ0l1d1hJQ0lBRjNBb1RBZHdLRXdJd0NoSUNOQXE1QmxnS0VnSmNDaEFEU0FpN0IwZ0lnQWRjQ2hBRGxBcTZCOGdLRUFCSURoQUF3QXlMQk1RTXVnVElEcm9GU0E0U0FkZ091QVhjRGhjQ01BNFhBckFNdkFiY0RnUUREQTRUQTBBT0VRTk1EaElEVUE0VEExUU9FQU5jRGhFRGFBNFRBM0FNdVFkMERoY0RkQTRRQTNnT0ZRTjREaEVEZ0E0VEE1QU9FUU9jRGhJRG9BNFRBNlFPRUFPc0RoRUR1QTRTQUNRU0JBRDhFaElUQkJvU0F4QWFFd2M0R0lBSFFCb1RBMEFhREEwc0hIOFJNQjRNWFR3ZUJBRjRIZzlKbUIwUWRnQWRDaVk0SFJCaVRCMElObndjV2dxVUhoWUNtQjc3QXBnZEVEYWdIUktDdUJ5SUJ3QWRFZzhBSElnSENCMFNEd2djaUFjUUhSSUxFQnlJQnhnZEVnc1lIUGhISUIwU0MwQWNpQWRJSFJJTFNCeUlCMUFkRWc5UUhQa3pXQjRCQTNBZStnTndIZ01EY0I3NEEzUWVBUU4wSHZvRGRCNERBM1FlK0FONEhnRURlQjc2QTNnZUF3TjRIdmdEZkI0QkEzd2NnQ09BSElBamtCeUFJNkFlK0Jld0hnTUR1Qjc0QTd3ZVhRTzhIZ0lEdkJ4ZkI3d2MrUlBBSGdFRHlCNzZBOGdlQXdQSUh2Z1B6QjREQTlBZXVndlVIZ01EMkJ6NUQ5d2VBd1BnSHJnUDVCNERBK2djK0Fmc0hBb0g3Qjc2RC9BZUFRUDRIdm9EK0I0REEvZ2UrQVA4SGdFRC9CNWVBL3djZUFRQUlsWVFBQ0lGQUJBaVh3QVVJZ1FBSkNKZEFDUWlaZ0FrSWdjQUxDSVhBREFpeEFBMEloWUFOQ0xIQURRaVhBUThJbDhFUkNMUEFGUWlCd0JjSWxRVWNDSUhBSGdnVkFoOElId1VnQ0lPRklnZ1ZSQ1VJbHdBcUNCa0JRQWlCZ0VBSXY4QkFDQmxCUVFpQndFRUl2MEJDQ0MyRlFnaUJRRVVJbDRCRkNKVkNSZ2lYQUVnSW1VQklDSmVBU0FpQkFFa0lnSUJKQ0lFQVNnZ0NnVW9JbFFSTENCOUNUUWlCUUU0SW1jQk9DSU1DVHdpVlFsRUlHUUZVQ0p1QVZBZ1p4bFFJbDhCWENJRUFXQWlYUUZnSW1ZQllDSmZBV0FpQkFGa0lsMEJaQ0ptQVdRaWJ3RmtJbHdCYUNJRkFXZ2lYZ0ZvSW1jQmFDSlVDV3dpWFFGd0ltWUJjQ0pmQVhBaUJBRjBJbDBCZENKbUFYUWlid0YwSWx3QmVDSUZBWGdpWGdGNEltY0JlQ0JVQ1h3aVpRR0lJUG9GbUNMNkFhd2krUVhNSXZnQ0JDTDVBZ2dpK0FJTUl2Z0dKQ0lVQWl3aXhRSXNJaGNDTENMRUFqQWkrUUpBSXZnQ1JDTDdCa1FpK0FaZ0l2a0tiQ0VRQm5RaEVBWjRJUkFHZ0NFUUJvUWhFQWFJSVBnS3JDRVFDdUFnZ2dyb0lIa0hLQ0o4RUdBa2pSUm9KbDhBY0NhVUVIUWtyUlI4Sm04QWhDYUVFSWdrbFJTUUptY0FtQ1NVTkp3a2ZqUzBKSHcwMENZR0FPZ216QUlNS21RQ2RDcGRBblFxWmdKMEt2Z0MzQ2hVQkh3dUJ3RnNMZ2NDbkM0SEF2QXV0Qk1BTHJVVENDNjJFeEF1RDg4WUxMWVhnQ3dNZDR3c3RpUEVMZ1FBQURJT0NEUXlFQ3hNTWhFSVpEQ0lCSEF3aXdSd01Jb0VkRENKQkhnd2lBUjhNaEFBbERDUEJKZ3lFZ0NjTWhjQW5ESVFMS3d5RVFqRU1JZ0UwRENMQk5Bd2lnVFVNSWtFMkRDSUJOd3lFQUQwTUlNSTlESVNBUHd5RndEOE1MVXBNREI5RlVReWZ5bE1NclJWWkRBT0haQXhCQjRBTWlZQ0REQ25CZ3d5cFFZUU1pUUNGRENsQmhReXB3b1VNaVFDSERJOUFod3lOZ0ljTVFSS0lEQU1Da1F5WkFKUU1vMFNVRENPRGxnd3RCNWdNcjRTYkRLSENuUXkxQUo4TXMwQ2ZESVdBbnd5REdLQU1JMEtzRENORnJReVh3SzhNb1FTd0RLVkJzZ3lYQUxNTW1VQ3pESmVBc3d5WndMTU1yUmUwRElYQXZ3eXpBY0FNc2NEQURMTUF3UXd4UWNFTXRjREJETE1Bd2d5eFFjSU1Nd0hERERHQnd3eUZBTVFNc1VERURET0J4QXlGQU1VTXRVREZETGVBeFF5MXdNVU1zUURHRERWQnhneXp3TVlNc1FISERMUEF4d3kxQU1nTXMwRElETEdCeUF3dlFza01NVUhLRExYQXlneXhBTXNNczBETERMV0F5d3l4d01zTUx3SE1ETFdBekF5endNd010UURORExGQXpReTFnTTBNaGNETkRMRUN6Z3l6UU04TXNZRFBESVhBend5eEFkQU1zOERRRExFQjBReTF3TkVNc3dEU0RJVkEwZ3kxZ05JTWhjRFNERE1CMHd5eGdkTU1zMERVRElXQTFBeXh3TlFNc3dEVkRJVkExUXkxZ05VTXNjRFZEQ0VGMWd3bGhkZ01wUUxiREpsQTNBd1hnZHdNbVFEZERKZEIzUXduQWQ0TWhZTGVESW5BM3d3L0JPQU1tUURpREp0QTRneS9nK0lNR1VMa0RBVkM1UXcvUStZTU1jSG5ESVZBNkF5eGdlZ01oVURwREFlQjZReUpBT29NbDBEcURCbUM2Z3lkZ09zTWpjRHJERDhJN0F3RkFmQU1tNER3REpmQjhBeWJnUEVNbWNEeERCY0Y4Z3laZ1BRTUY4SDBEQmxCOVF5WHdQVU1td0QyREpsQTlnd1hndllNR1lIM0RLRUUrQXdsUmZvTUpjWDhEQ1ZCL3d5WndQOE1Bd0duS1lFQTNDa0RBZjRwQXdMWEtvRkEyaXFDRkVBK2duOUtQb0kvYWo0Q29ZbytFQUdiUG9Jdm5ENlF4Yk0rbHdIQVBobkJ3RDQvUWNFK3I4TEVQb1JCeHo2dEJNZytnVURLUGdTRHlqNmdBOHcrb0FMT1BvU0F6ejRnQWRBK0lNSFFQcTZFMFQ2RndOTStMVEhVUHEzTDlENHZpZm8rTFFML1BpOHZBRCtsZ2hjL3NjQVlQNjhIR1Qrdi94dy9wWUU4UDY5a1BUOHhJRlEvTVp0a1B6RUJmRCt6ZzN3L3NVQitQNzJBZmorN3dINC9zd0IvUHdNRmhEK3RBWXcvRmNPTVB5MUdqajhEekpFL2xjYVhQNjhCbkQrRkFKMC9MNFdkUDYwNm9EOHZSTDAvSDIvQVB4L0Ixeit0WDlnL2dRRG9QeDlQNkQ4ZmcvQS9INFB5UHgrRDlEK2ZnZlkvZ3dmNFA1S0JKa1NTd0NwRUVvRkxSQkxCMGtRU3dpNUZFb0Z1UlpJQVRrYVNnMWQwRXNOdWRCOE5BSFVmalFaMUh3ME5kWitERTNVZmlSVjFIdzBhZFIrTklIVVZFQ2QxbjBNdmRaOUZNWFVmRFRSMUg0MDZkWlVEUVhVZlJFTjFuNE5GZFIrTlIzV1ZCMDUxbjROU2RSK05WSFVmRFZ0MUg0MWhkUjhOYUhVZmpXNTFIdzExZFIrTmUzVWZEWUoxSDQySWRSOE5qM1VmalpWMUh3MmNkUitOb25VREFhbDFud2lxZFlGQXJuV2ZnNjUxZ1VDd2RaK01zSFdCd0xaMUxRTzNkWitJdUhXQndMeDFud085ZFlIQXZuV2ZETDkxZ1VERmRTMkR4WFdmQ01kMWdVRExkWitEeTNXQlFNMTFuNHpOZFlIQTAzVXRBOVIxbjRqVmRZSEEyWFdmQTlwMWdjRGJkWjhNM0hXQlFPSjFMWVBpZFo4STVIV0JRT2gxbjRQb2RZRkE2bldmak9wMWdjRHdkUzBFOFhVZmhmTjFId1gyZFIrRitIVWZCZnQxSDRYOWRTMENnSHV0VFlGN0EwS0llNEhBaVhzdFJZcDdBd1NOZTRHQWtIc0QzSkY3TFFXZ2U2M0lvbnVEUktoN3JjaXFlNWNBUUh3aFJVQjhKUTFFZkllQVNud1Z3VXA4RjBGTGZCOE5USHdYZ2xKOG1ZQlRmSmZBVTN5WGdWcDhsd0JrZkM4QmdIeUJnSUI4QXhhRWZNRUVrSHdEQVpSOEh3WDhmcXdCQUw0UTBRQytyRWNKdmhBNURiNHNoeW0rTEFJdHZwQTNMcjZRLzBtK0VMeHB2Z0FBQUFBQUFBQUFJQUFBQUdFQUFnQUVBQVlBdkFNSUFBb0FEQUFWQUpVQXBRQzVBTUVBd3dESEFNc0EwUURYQU4wQTRBRG1BUGdBQ0FFS0FYTUFFQUVTQVJRQklBRXNBVVFCVFFGVEFXSUJhQUZxQVhZQmtnR1VBYWtCdXdISEFkRUIxUUc1QXRjQk93RFpBZHNCdHdEaEFmd0JEQUlZQWgwQ0l3SW5BcU1ETXdJL0FrSUNTd0pPQWxFQ1hRSmdBbWtDYkFKdkFuVUNlQUtCQW9vQ25BS2ZBcU1DcndLNUFzVUN5UUxOQXRFQzFRTG5BdTBDOFFMMUF2a0MvUUlGQXdrRERRTVRBeGNER3dNakF5Y0RLd012QXpVRFBRTkJBMGtEVFFOUkF3c1BWd05iQTE4RFl3Tm5BMnNEYndOekEza0RmUU9CQTRVRGlRT05BNUVEbFFPWkE1MERvUVBjRUtVRHlRUE5BOWtEM1FQaEErOEQ4UU05QkU4RW1RVHdCQUlGU2dWa0JXd0ZjQVZ6QlpvRitnWCtCUWNHQ3dZVUJoZ0dIZ1lpQmlnR2pnYVVCcGdHbmdhaUJxc0dyQVB6QnEwRDlnYXVBL2tHcndQOEJzd0Qvd2JOQXdJSHpnTUZCd2tIRFFjUkI0WURNZ2MxQjdrRE53YzdCNGdEVXdlSkExWUhrQU5yQjRvRGR3ZXdBNGtIamdPWkI1OEhvd2VNQTdnSGp3TzdCN1FBdmdmQUI4SUhFQ0RMQnk0QXpRZlBCeUFBMGdmV0I5c0gzd2ZrQitvSDhBY2dBUFlIRWlJQkNBVUlCd2dkQ0NVSUp3aERBQzBJTUFpUUFUWUlPUWhPQUVVSVJ3aE1DRTRJVVFoYUFLa0RXZ0JUQ0ZjSVlBaHBBR0lJWlFodkNIUUllZ2grQ0tJSVNRQ2tDS1lJcVFoV0FLc0lyUWl3Q0xRSVdBQzJDTGdJdXdqQUNNSUl4UWgyQU1jSXlRak1DTkFJZUFEU0NOUUkxd2piQ040STVBam5DUEFJOHdqMkNQa0lBZ2tHQ1FzSkR3a1VDUmNKR2drakNTd0pPd2srQ1VFSlJBbEhDVW9KVmdsY0NXQUpZZ2xrQ1dnSmFnbHdDWGdKZkFtQUNZWUppUW1QQ1pFSk1BQ1RDWmtKbkFtZUNhRUpwQWxoTGMxcm41K21DYkVKdkFuSENaVUtvUW9WQ3lBQUp3c3hDNDBMb1F1bEM2a0xyUXV4QzdVTHVRdTlDOEVMeFFzaEREVU1PUXc5REVFTVJReEpERTBNVVF4VkRGa01id3h4REhNTW9BeThETndNNUF6c0RQUU0vQXdFRFF3TkZBMGlEUzROZWcyQ0RZVU5pUTJORFowTnNRMjFEYndOd2czR0RTZ09MQTR3RGpJT05nNDhEajRPUVE1RERrWU9kdzU3RG9rT2pnNlVEcHdPb3c2cERyUU92ZzdHRHNvT3p3N1pEdDBPNUE3c0R2TU8rQTRFRHdvUEZROGJEeUlQS0E4ekR6MFBSUTlNRDFFUFZ3OWVEMk1QYVE5d0QzWVBmUStDRDRrUGpRK2VENlFQcVErdEQ3Z1B2Zy9KRDlBUDFnL2FEK0VQNVEvdkQvb1BBQkFFRUFrUUR4QVRFQm9RSHhBakVDa1FMeEF5RURZUU9SQS9FRVVRV1JCaEVIa1FmQkNBRUpVUW9SQ3hFTU1ReXhEUEVOb1EzaERxRVBJUTlCQUFFUVVSRVJGQkVVa1JUUkZURVZjUldoRnVFWEVSZFJGN0VYMFJnUkdFRVl3UmtoR1dFWndSb2hHb0Vhc1JiNmV2RWJNUmpRSzdFUTBTQ3hNSkZJMFVraFJRRldrVmJ4VjFGWHNWaHhXVEZTc0FuaFcyRmJvVnZoWENGY1lWeWhYZUZlSVZSaFpmRm9VV2l4WkpGMDhYVkJkMEYzUVllaGdPR2RBWmRCcDhHcG9hbnhxekdyMGF3eHJYR3R3YTRocndHaUFiTFJzMUd6a2JUeHZHRzlnYjJodmNHMlF4SFJ3ZkhDRWNJeHdsSENjY1JSeFRIRmdjWVJ4cUhId2NoUnlLSEtvY3hSekhITWtjeXh6TkhNOGMwUnpUSFBNYzlSejNIUGtjK3h3Q0hRUWRCaDBJSFJjZEdSMGJIUjBkSHgwaEhTTWRKUjBuSFNrZEt4MHRIUzhkTVIwekhUY2Q5QU01SFFjaU94MENJajBkUlIzMEEwY2RCeUpKSFFJaVN4MVRIZlFEVlIwSElsY2RBaUpaSFdFZDlBTmpIUWNpWlIwQ0ltY2RieDMwQTNFZEJ5SnpIUUlpZFIxL0hZRWRneDJGSFljZGlSMlBIYXdkTFFhMEhjQWRMQWJRSFVBZVRCNWZIbkVlaEI2R0hvb2VrQjZXSHBnZW5CNmVIcVllcVI2ckhyRWVzeDYxTUxrZUVSOG5IeXNmTFI4eUgzOGZrQitSSUtFZ3B5Q2hJYjhpQUVIUWdnTUwwa2NnaUNDRU1qTWdnU0NuTVc4eDBEUXgwREl6MERSQmdFR0JRWUpCZzBHSVFZb0FBRU9uUllCRmdVV0NSWWhKZ0VtQlNZSkppQUFBVG9OUGdFK0JUNEpQZzArSUFBQUFBRldBVllGVmdsV0lXWUVBQUFBQVlZQmhnV0dDWVlOaGlHR0tBQUJqcDJXQVpZRmxnbVdJYVlCcGdXbUNhWWdBQUc2RGI0QnZnVytDYjROdmlBQUFBQUIxZ0hXQmRZSjFpSG1CQUFCNWlFR0VRWVpCcUVPQlE0SkRoME9NUkl4RmhFV0dSWWRGcUVXTVI0Skhoa2VIUjZkSWdrbURTWVJKaGttb1NZZEpTbWxxU29KTHAweUJUS2RNakV3QUFHc2dhMDZCVHFkT2pMd0NiaytFVDRaUGkxS0JVcWRTakZPQlU0SlRwMU9NVktkVWpGV0RWWVJWaGxXS1ZZdFZxRmVDV1lKWmlGcUJXb2RhakUrYlZadEVBSDBCUkFCK0FXUUFmZ0ZNU2t4cWJHcE9TazVxYm1wQkFJeEpBSXhQQUl4VkFJemNBSVRjQUlIY0FJemNBSURFQUlRbUFvVEdBSVJIakV1TVQ2anFBWVRyQVlTM0FZeVNBb3hxQUl4RVdrUjZaSHBIZ1U0QWdNVUFnY1lBZ2RnQWdVR1BRWkZGajBXUlNZOUprVStQVDVGU2oxS1JWWTlWa1ZPbVZLWklqRUVBaDBVQXA5WUFoTlVBaEU4QWh5NENoRmtBaEdnQVpnSnFBSElBZVFKN0FvRUNkd0I1QUNDR0lJY2dpaUNvSUlNZ2kyTUNiQUJ6QUhnQWxRS0FnUUNUaUlFZ3hTQ0JxQUNCa1FPQmxRT0Jsd09CbVFPQkFBQUFud09CQUFBQXBRT0JxUU9CeWdPQkFRT1lCNlFIc0FDMEFMWUF1QURLQUFFRHVBZkVCNzRBeEFESUFLVUREUk1BQVFQUkFORUh4Z1BBQTdvRHdRUENBd0FBbUFPMUF4VUVnQlVFaUFBQUFCTUVnUVlFaUJvRWdSZ0VnQ01FaGhnRWhqZ0VoalVFZ0RVRWlBQUFBRE1FZ1ZZRWlEb0VnVGdFZ0VNRWhuUUVqeFlFaGhBRWhoQUVpQlVFaHRnRWlCWUVpQmNFaUJnRWhCZ0VpQjRFaU9nRWlDMEVpQ01FaENNRWlDTUVpeWNFaUNzRWlHVUZnZ1VuQmdBc0FDMGhMUUF1SXkwbkJnQk5JVTJnVFNOTjFRWlVCZ0FBQUFEQkJsUUcwZ1pVQmlnSlBBa3dDVHdKTXdrOENSVUpBQ2NCSndJbkJ5Y01KdzBuRmljYUo3NEpDUUFKR2FFSnZBbXZDYndKTWdvOENqZ0tQQW9XQ2dBbUFTWUdKaXNLUEFwSEMxWUxQZ3NKQUFrWklRczhDNUlMMXd1K0N3Z0FDUUFJR1VZTVZneS9ETlVNeGd6VkRNSU1CQUFJRXo0TkNBQUpBQWdaMlEzS0Rjb05Ed1VTQUE4VlRRNHlEczBPc2c2WkRoSUFFZ2hDRDdjUFRBKzNEMUVQdHc5V0Q3Y1BXdyszRDBBUHRROXhEM0lQY1E4QUEwRVBzZytCRDdNUGdBK3pENEVQY1ErQUQ1SVB0dytjRDdjUG9RKzNENllQdHcrckQ3Y1BrQSsxRHlVUUxoQUZHelViQUFBQUFBY2JOUnNBQUFBQUNSczFHd0FBQUFBTEd6VWJBQUFBQUEwYk5Sc1JHelViT2hzMUd3QUFBQUE4R3pVYlBoczFHMEliTlJ0QkFNWUFRZ0FBQUVRQVJRQ09BVWNBVHdBaUFsQUFVZ0JVQUZVQVZ3QmhBRkFDVVFJQ0hXSUFaQUJsQUZrQ1d3SmNBbWNBQUFCckFHMEFTd0Z2QUZRQ0ZoMFhIWEFBZEFCMUFCMGRid0oyQUNVZHNnT3pBN1FEeGdQSEEya0FjZ0IxQUhZQXNnT3pBOEVEeGdQSEExSUNZd0JWQXZBQVhBSm1BRjhDWVFKbEFtZ0NhUUpxQW5zZG5RSnRBb1VkbndKeEFuQUNjZ0p6QW5RQ2RRSjRBb0lDZ3dLckFZa0NpZ0ljSFlzQ2pBSjZBSkFDa1FLU0FyZ0RRUUNsUWdDSFFnQ2pRZ0N4eHdDQlJBQ0hSQUNqUkFDeFJBQ25SQUN0RWdHQUVnR0JSUUN0UlFDd0tBS0dSZ0NIUndDRVNBQ0hTQUNqU0FDSVNBQ25TQUN1U1FDd3p3Q0JTd0NCU3dDalN3Q3hUQUNqTmg2RVRMRk1yVTJCVFlkTm8wNkhUcU5Pc1U2dDFRQ0IxUUNJVEFHQVRBR0JVQUNCVUFDSFVnQ0hVZ0NqV2g2RVVnQ3hVd0NIVXdDaldnR0hZQUdIWWg2SFZBQ0hWQUNqVkFDeFZBQ3RWUUNrVlFDd1ZRQ3RhQUdCYWdHSVZvTldvMWVBVjRGWGlGZUhWNk5ZaDFpSVdZZGFnbHFqV3JGb3NYU0lkNHA1aW1FQXZnSi9BWWRCQUtOQkFJbkNBSUhDQUlEQ0FJbkNBSU9nSG9JQ0FZRUNBWUFDQVlrQ0FZT2dIb1pGQUtORkFJbEZBSVBLQUlIS0FJREtBSW5LQUlPNEhvSkpBSWxKQUtOUEFLTlBBSW5VQUlIVUFJRFVBSW5VQUlQTUhvS2dBWUdnQVlDZ0FZbWdBWU9nQWFOVkFLTlZBSW12QVlHdkFZQ3ZBWW12QVlPdkFhTlpBSUJaQUtOWkFJbFpBSU94QXhNREFCK0FBQitCQUIvQ2tRTVRBd2dmZ0FnZmdRZ2Z3clVERXdNUUg0QVFINEdWQXhNREdCK0FHQitCdHdPVHR3T1VJQitBSVIrQUlCK0JJUitCSUIvQ0lSL0Nsd09UbHdPVUtCK0FLUitBS0IrQktSK0JLQi9DS1IvQ3VRT1R1UU9VTUIrQU1SK0FNQitCTVIrQk1CL0NNUi9DbVFPVG1RT1VPQitBT1IrQU9CK0JPUitCT0IvQ09SL0N2d09UdndPVVFCK0FRQitCbndNVEEwZ2ZnRWdmZ2NVREV3TlFINEJRSDRGUUg4S2xBNVFBQUFCWkg0QUFBQUJaSDRFQUFBQlpIOExKQTVQSkE1UmdINEJoSDRCZ0g0RmhINEZnSDhKaEg4S3BBNU9wQTVSb0g0QnBINEJvSDRGcEg0Rm9IOEpwSDhLeEE0QzFBNEMzQTRDNUE0Qy9BNERGQTRESkE0QUFIMFVESUI5RkEyQWZSUU94QTRheEE0UndIOFd4QThXc0E4VUFBQUN4QThLMkg4V1JBNGFSQTRTUkE0Q1JBOFVna3lDVElNS29BTUowSDhXM0E4V3VBOFVBQUFDM0E4TEdIOFdWQTRDWEE0Q1hBOFcvSDRDL0g0Ry9IOEs1QTRhNUE0VEtBNEFBQTdsQ3lrS1pCcGtFbVFEK0g0RCtINEgrSDhMRkE0YkZBNFRMQTRBQUE4RVR3UlRGUXN0Q3BRYWxCS1VBb1FPVXFBQ0FoUU5nQUh3Znhja0R4YzREeFFBQUFNa0R3dllmeFo4RGdLa0RnS2tEeFNDVUFpQWdJQ0FnSUNBZ0lDQWdzeTR1TGk0dU1pQXlJRElnQUFBQU5TQTFJRFVnQUFBQUlTRUFBQ0NGUHo4L0lTRS9NaUFBQUFBQU1Ha0FBRFExTmpjNE9TczlLQ2x1TUFBckFCSWlQUUFvQUNrQUFBQmhBR1VBYndCNEFGa0NhR3RzYlc1d2MzUlNjMkV2WTJFdmM3QUFRMk12YjJNdmRiQUFSa2dBSHdBQUFDRGZBUUVFSkU1dlVGRlNVbEpUVFZSRlRGUk5Td0RGQUVKREFHVkZSZ0JOYjlBRlJrRll3QU96QTVNRG9BTVJJa1JrWldscU1kQTNNZEE1TWRBeE1ESFFNekxRTXpIUU5UTFFOVFBRTlRUUU5USFFOalhRTmpIUU9EUFFPRFhRT0RmUU9ESFFTVWxKU1VsSlZsWkpWa2xKVmtsSlNVbFlXRWxZU1VsTVEwUk5hV2xwYVdscGFYWjJhWFpwYVhacGFXbHBlSGhwZUdscGJHTmtiVERRTTVBaHVKSWh1SlFodU5BaHVOUWh1TklodUFNaXVBZ2l1QXNpdUNNaXVBQUFBQ1VpdUNzaUt5SXJJZ0FBQUM0aUxpSXVJZ0FBQUR3aXVFTWl1RVVpdUFBQUFFZ2l1RDBBdUFBQUFHRWl1RTBpdUR3QXVENEF1R1FpdUdVaXVISWl1SFlpdUhvaXVJSWl1SVlpdUtJaXVLZ2l1S2tpdUtzaXVId2l1SkVpdUxJaU9BTUlNREVBTVFBd0FESXdLQUF4QUNrQUtBQXhBREFBS1FBb01qQXBNUUF1QURFQU1BQXVBREl3TGlnQVlRQXBBRUVBWVFBcklnQUFBQUE2T2owOVBUMDlQZDBxdUdwV0FFNEFLRFkvV1lXTW9Mby9VUUFtTEVOWGJLRzJ3WnRTQUY1NmY1Mm13YzdudGxQSVUrTlQxMVlmVit0WUFsa0tXUlZaSjFseldWQmJnRnY0V3c5Y0lsdzRYRzVjY1Z6YlhlVmQ4VjMrWFhKZWVsNS9YdlJlL2w0TFh4TmZVRjloWDNOZncxOElZalppUzJJdlpUUmxoMldYWmFSbHVXWGdaZVZsOEdZSVp5aG5JR3RpYTNscnMydkxhOVJyMjJzUGJCUnNOR3hyY0NweU5uSTdjajl5UjNKWmNsdHlySEtFYzRsejNIVG1kQmgxSDNVb2RUQjFpM1dTZFhaMmZYYXVkcjkyN25iYmQrSjM4M2M2ZWJoNXZubDBlc3Q2K1hwemZQaDhObjlSZjRwL3ZYOEJnQXlBRW9BemdIK0FpWURqZ1FBSEVCa3BPRHlMajVWTmhtdUdRSWhNaUdPSWZvbUxpZEtKQUlvM2pFYU1WWXg0akoyTVpJMXdqYk9OcTQ3S2pwdVBzSSsxajVHUVNaSEdrY3lSMFpGM2xZQ1ZISmEybHJtVzZKWlJsMTZYWXBkcGw4dVg3WmZ6bHdHWXFKamJtTitZbHBtWm1heVpxSnJZbXQrYUpac3ZtektiUEp0YW0rV2NkWjUvbnFXZUFCWWVLQ3hVV0dsdWU1YWxyZWozK3hJd0FBQkJVMFJUUlZOTE1Ka3dBQUFBQUUwd21UQUFBQUFBVHpDWk1BQUFBQUJSTUprd0FBQUFBRk13bVRBQUFBQUFWVENaTUFBQUFBQlhNSmt3QUFBQUFGa3dtVEFBQUFBQVd6Q1pNQUFBQUFCZE1Ka3dBQUFBQUY4d21UQUFBQUFBWVRDWk1HUXdtVEFBQUFBQVpqQ1pNQUFBQUFCb01Ka3diekNaTUhJd21UQjFNSmt3ZURDWk1Ic3dtVEJHTUprd0lBQ1pNSjB3bVRDSU1Jb3dxekNaTUFBQUFBQ3RNSmt3QUFBQUFLOHdtVEFBQUFBQXNUQ1pNQUFBQUFDek1Ka3dBQUFBQUxVd21UQUFBQUFBdHpDWk1BQUFBQUM1TUprd0FBQUFBTHN3bVRBQUFBQUF2VENaTUFBQUFBQy9NSmt3QUFBQUFNRXdtVERFTUprd0FBQUFBTVl3bVRBQUFBQUF5RENaTU04d21URFNNSmt3MVRDWk1OZ3dtVERiTUprd3BqQ1pNTzh3bVREOU1Ka3dzekRJTUFBUkFBR3FBcXl0QXdRRnNMR3lzN1MxR2dZSENDRUpFV0VSRkJGTUFBR3p0TGk2djhQRkNNbkxDUW9NRGc4VEZSY1lHUm9iSGlJc016amQza05FUlhCeGRIMStnSXFOQUU2TVRnbE8yMVlLVGkxT0MwNHlkVmxPR1U0QlRpbFpNRmU2VGlnQUtRQUFFUUlSQXhFRkVRWVJCeEVKRVFzUkRCRU9FUThSRUJFUkVSSVJLQUFBRVdFUktRQW9BQUlSWVJFcEFDZ0FCUkZoRVNrQUtBQUpFV0VSS1FBb0FBc1JZUkVwQUNnQURoRmhFU2tBS0FBTUVXNFJLUUFvQUFzUmFSRU1FV1VScXhFcEFDZ0FDeEZwRVJJUmJoRXBBQ2dBS1FBQVRveE9DVTdiVnBST2JWRURUbXRSWFU1QlV3aG5hM0EwYkNobjBaRWZWK1ZsS21nSlp6NTVEVlI1Y3FHTVhYbTBVdU5PZkZSbVcrTjJBVS9IakZSVGJYa1JUK3FCODRGUFZYeGVoMldQZTFCVVJUSUFNUUF6QURBQUFCRUFBZ01GQmdjSkN3d09EeEFSRWdBUkFHRUNZUU5oQldFR1lRZGhDV0VMWVF4aERoRmhFUUFSRG1HM0FHa0xFUUZqQUdrTEVXNFJBRTZNVGdsTzIxYVVUbTFSQTA1clVWMU9RVk1JWjJ0d05Hd29aOUdSSDFmbFpTcG9DV2MrZVExVWVYS2hqRjE1dEZMWWVUZDFjMWxwa0NwUmNGUG9iQVdZRVUrWlVXTnJDazR0VGd0TzVsM3pVenRUbDF0bVcrTjJBVS9IakZSVEhGa3pBRFlBTkFBd0FEVXdNUUFJWnpFQU1BQUlaMGhuWlhKblpWWk1WRVNpTUFBQ0JBWUlDUXNORHhFVEZSY1pHeDBmSWlRbUtDa3FLeXd0TURNMk9UdzlQajlBUWtSR1IwaEpTa3ROVGs5UTVFNk1WS0V3QVRCYkp3RktOQUFCVWprQm9qQUFXa21rTUFBblR3eWtNQUJQSFFJRlQ2Z3dBQkVIVkNHb01BQlVBMVNrTUFaUEZRWllQQWNBUnFzd0FENFlIUUJDUDFHc01BQkJSd0JITXE0d3JEQ3VNQUFkVHEwd0FEZzlUd0UrRTArdE1PMHdyVEFBUUFNOE02MHdBRUEwVHhzK3JUQUFRRUlXRzdBd0FEa3dwREFNUlR3a1R3dEhHQUJKcnpBQVBrMGVzVEFBU3dnQ09oa0NTeXlrTUJFQUMwZTFNQUErREVjcnNEQUhPa01BdVRBQ09nZ0NPZzhIUXdDM01CQUFFalFSUEJNWHBEQXFIeVFyQUNDN01CWkJBRGdOeERBTk9BRFFNQUFzSEJ1aU1ESUFGeVpKcnpBbEFEeXpNQ0VBSURpaE1EUUFTQ0lvb3pBeUFGa2xwekF2SEJBQVJOVXdBQlFlcnpBcEFCQk5QTm93dlRDNE1DSVRHaUF6RENJN0FTSkVBQ0ZFQjZRd09RQlBKTWd3RkNNQTJ6RHpNTWt3RkNvQUVqTWlFak1xcERBNkFBdEpwREE2QUVjNkh5czZSd3UzTUNjOEFEQThyekF3QUQ1RTN6RHFNTkF3RHhvQUxCdmhNS3d3ckRBMUFCeEhOVkFjUDZJd1Fsb25RbHBKUkFCUnd6QW5BQVVvNmpEcE1OUXdGd0FvMWpBVkpnQVY3RERnTUxJd09rRVdBRUhETUN3QUJUQUF1WEF4QURBQXVYQXlBREFBdVhCb1VHRmtZVUZWWW1GeWIxWndZMlJ0WkFCdEFMSUFTUUJWQUhOZUVHSXRab3hVSjFsamF3NW11MndxYUE5ZkdrOCtlWEFBUVc0QVFid0RRVzBBUVdzQVFVc0FRazBBUWtjQVFtTmhiR3RqWVd4d0FFWnVBRWE4QTBhOEEyZHRBR2RyQUdkSUFIcHJTSHBOU0hwSFNIcFVTSHE4QXhNaGJRQVRJV1FBRXlGckFCTWhaZ0J0YmdCdHZBTnRiUUJ0WXdCdGF3QnRZd0FLQ2s4QUNrOXRBTElBWXdBSUNrOEtDbEFBQ2xCdEFMTUFhd0J0QUxNQWJRQVZJbk1BYlFBVkluTUFzZ0JRWVd0UVlVMVFZVWRRWVhKaFpISmhaTkZ6Y2dCaEFHUUFGU0p6QUxJQWNBQnpiZ0J6dkFOemJRQnpjQUJXYmdCV3ZBTldiUUJXYXdCV1RRQldjQUJYYmdCWHZBTlhiUUJYYXdCWFRRQlhhd0NwQTAwQXFRTmhMbTB1UW5GalkyTmtROUZyWjBOdkxtUkNSM2xvWVVoUWFXNUxTMHROYTNSc2JXeHViRzluYkhodFltMXBiRzF2YkZCSWNDNXRMbEJRVFZCU2MzSlRkbGRpVnRGdFFkRnRNUURsWlRFQU1BRGxaVElBTUFEbFpUTUFNQURsWldkaGJFb0VUQVFtQVZNQko2YzNxMnNDVXF0SWpQUm15bzdJak5GdU1rN2xVNXlmbko5UldkR1JoMVZJV2ZaaGFYYUZmeitHdW9mNGlJK1FBbW9iYmRsdzNuTTloR3FSOFptQ1RuVlRCR3NiY2kyR0hwNVFYZXR2ellWa2ljbGkySUVmaU1wZUYyZHFiZnh5enBDR1Q3ZFIzbExFWk5OcUVITG5kZ0dBQm9aY2h1K05NcGR2bS9xZGpIaC9lYUI5eVlNRWszK2Uxb3JmV0FSZllIeCtnR0p5eW5qQ2pQZVcyRmhpWEJOcTJtMFBieTk5TjM1TGx0SlNpNERjVWN4UkhIcStmZkdEZFphQWk4OWlBbXIraWpsTzUxc1NZSWR6Y0hVWFUvdDR2MCtwWHcxT3pHeDRaU0o5dzFOZVdBRjNTWVNxaXJwcnNJK0liUDVpNVlLZ1kyVjFyazVwVWNsUmdXam5mRytDMG9yUGtmVlNRbFJ6V2V4ZXhXWCtieXA1clpWcW1wZWV6cDZiVXNabWQydGlqM1Jla0dFQVlwcGtJMjlKY1lsMHlubjBmVytBSm8vdWhDT1FTcE1YVXFOU3ZWVEljTUtJcW9ySlh2VmZlMk91YXo1OGRYUGtUdmxXNTF1NlhSeGdzbk5wZEpwL1JvQTBrdmFXU0pjWW1JdFBybm0wa2JpVzRXQ0dUdHBRN2xzL1hKbGxBbXJPY1VKMi9JUjhrSTJmaUdZdWxvbFNlMmZ6WjBGdG5HNEpkRmwxYTNnUWZWNlliVkV1WW5pV0sxQVpYZXB0S28rTFgwUmhGMmlIYzRhV0tWSVBWR1ZjRTJaT1o2aG81V3dHZE9KMWVYL1BpT0dJekpIaWxqOVR1bTRkVk5CeG1IVDZoYU9XVjV5Zm5wZG55MjNvZ2N0NklIdVNmTUJ5bVhCWWk4Qk9Ob002VWdkU3BsN1RZdFo4aFZzZWJiUm1PNDlNaUUyV2k0blRYa0JSd0ZVQUFBQUFXbGdBQUhSbUFBQUFBTjVSS25QS2RqeDVYbmxsZVk5NVZwZStmTDEvQUFBU2hnQUErSW9BQUFBQU9KRDlrTytZL0pnb21iU2QzcEMzbHE1UDUxQk5VY2xTNUZKUlU1MVZCbFpvVmtCWXFGaGtYRzVjbEdCb1lZNWg4bUZQWmVKbGtXYUZhSGR0R200aWIyNXhLM0lpZEpGNFBubEplVWg1VUhsV2VWMTVqWG1PZVVCNmdYckFlL1I5Q1g1QmZuSi9CWUR0Z1htQ2VZSlhoQkNKbG9rQml6bUwwNHdJamJhUE9KRGpsditYTzVoMVlPNUNHSUlDSms2MVVXaFJnRTlGVVlCUngxTDZVcDFWVlZXWlZlSlZXbGl6V0VSWlZGbGlXaWhiMGw3WlhtbGZyVi9ZWUU1aENHR09ZV0JoOG1FMFlzUmpIR1JTWkZabGRHWVhaeHRuVm1kNWE3cHJRVzNiYnN0dUltOGVjRzV4cDNjMWNxOXlLbk54ZEFaMU8zVWRkaDkyeW5iYmR2UjJTbmRBZDh4NHNYckFlM3Q4VzMzMGZUNS9CWUJTZysrRGVZZEJpWWFKbG9tL2l2aUt5NG9CaS82SzdZbzVpNHFMQ0kwNGozS1FtWkYya255VzQ1WldsOXVYLzVjTG1EdVlFcHVjbjBvb1JDalZNNTA3R0VBNVFFbFMwRnpUZmtPZmpwOHFvQUptWm1acFpteG1abWxtWm14L0FYUnpBSFJsQlE4UkR3QVBCaGtSRHdqWkJiUUZBQUFBQVBJRnR3WFFCUklBQXdRTERBMFlHdWtGd1FYcEJjSUZTZnZCQlVuN3dnWFFCYmNGMEFXNEJkQUZ2QVhZQmJ3RjNnVzhCZUFGdkFYakJid0Z1UVV0QXk0REx3TXdBekVESEFBWUJpSUdLd2JRQmR3RmNRWUFBQW9LQ2dvTkRRME5EdzhQRHdrSkNRa09EZzRPQ0FnSUNETXpNek0xTlRVMUV4TVRFeElTRWhJVkZSVVZGaFlXRmh3Y0d4c2RIUmNYSnljZ0lEZzRPRGcrUGo0K1FrSkNRa0JBUUVCSlNVcEtTa3BQVDFCUVVGQk5UVTFOWVdGaVlra0daR1JrWkg1K2ZYMS9meTZDZ254OGdJQ0hoNGVIQUFBbUJnQUJBQUVBcndDdkFDSUFJZ0NoQUtFQW9BQ2dBS0lBb2dDcUFLb0FxZ0FqQUNNQUk4d0dBQUFBQUNZR0FBWUFCd0FmQUNNQUpBSUdBZ2NDQ0FJZkFpTUNKQVFHQkFjRUNBUWZCQ01FSkFVR0JSOEZJd1VrQmdjR0h3Y0dCeDhJQmdnSENCOE5CZzBIRFFnTkh3OEhEeDhRQmhBSEVBZ1FIeEVIRVI4U0h4TUdFeDhVQmhRZkd3WWJCeHNJR3g4Ykl4c2tIQWNjSHh3akhDUWRBUjBHSFFjZENCMGVIUjhkSXgwa0hnWWVCeDRJSGg4ZUl4NGtId1lmQng4SUh4OGZJeDhrSUFZZ0J5QUlJQjhnSXlBa0lRWWhIeUVqSVNRa0JpUUhKQWdrSHlRakpDUUtTZ3RLSTBvZ0FFd0dVUVpSQnY4QUh5WUdBQXNBREFBZkFDQUFJd0FrQWdzQ0RBSWZBaUFDSXdJa0JBc0VEQVFmSmdZRUlBUWpCQ1FGQ3dVTUJSOEZJQVVqQlNRYkl4c2tIQ01jSkIwQkhSNGRIeDBqSFNRZUh4NGpIaVFmQVI4ZklBc2dEQ0FmSUNBZ0l5QWtJMG9rQ3lRTUpCOGtJQ1FqSkNRQUJnQUhBQWdBSHdBaEFnWUNCd0lJQWg4Q0lRUUdCQWNFQ0FRZkJDRUZId1lIQmg4SEJnY2ZDQVlJSHcwR0RRY05DQTBmRHdjUENBOGZFQVlRQnhBSUVCOFJCeElmRXdZVEh4UUdGQjhiQmhzSEd3Z2JIeHdISEI4ZEJoMEhIUWdkSGgwZkhnWWVCeDRJSGg4ZUlSOEdId2NmQ0I4ZklBWWdCeUFJSUI4Z0lTRUdJUjhoU2lRR0pBY2tDQ1FmSkNFQUh3QWhBaDhDSVFRZkJDRUZId1VoRFI4TklRNGZEaUVkSGgwZkhoOGdIeUFoSkI4a0lVQUdUZ1pSQmljR0VDSVFJeElpRWlNVEloTWpEQ0lNSXcwaURTTUdJZ1lqQlNJRkl3Y2lCeU1PSWc0akR5SVBJdzBGRFFZTkJ3MGVEUW9NQ2c0S0R3b1FJaEFqRWlJU0l4TWlFeU1NSWd3akRTSU5Jd1lpQmlNRklnVWpCeUlISXc0aURpTVBJZzhqRFFVTkJnMEhEUjROQ2d3S0Rnb1BDZzBGRFFZTkJ3MGVEQ0FOSUJBZURBVU1CZ3dIRFFVTkJnMEhFQjRSSGdBa0FDUXFCZ0FDR3dBREFnQURBZ0FER3dBRUd3QWJBZ0FiQXdBYkJBSWJBd0liQXdNYklBTWJId2tEQWdrQ0F3a0NId2tiQXdrYkF3a2JBZ2tiR3drYkd3c0RBd3NEQXdzYkd3b0RHd29ER3dvQ0lBb2JCQW9iQkFvYkd3b2JHd3dESHd3RUd3d0VHdzBiQXcwYkF3MGJHdzBiSUE4Q0d3OGJHdzhiR3c4Ykh4QWJHeEFiSUJBYkh4Y0VHeGNFR3hnYkF4Z2JHeG9ER3hvRElCb0RIeG9DQWhvQ0Fob0VHeG9FR3hvYkF4b2JBeHNEQWhzREd4c0RJQnNDQXhzQ0d4c0VBaHNFR3lnR0hRUUdIeDBFSHgwZEhnVWRIZ1VoSGdRZEhnUWRIZ1FoSGgwaUhoMGhJaDBkSWgwZEFBWWlBZ1FpQWdRaEFnWWlBZ1loQWgwaUFoMGhCQjBpQkFVaEJCMGhDd1loRFFVaURBVWlEZ1VpSEFRaUhCMGlJZ1VpSWdRaUloMGlIUjBpR2gwaUhnVWlHaDBGSEFVZEVSMGlHeDBpSGdRRkhRWWlIQVFkR3gwZEhBUWRIZ1FGQkFVaUJRUWlIUVFpR1IwaUFBVWlHeDBkRVFRZERSMGRDd1lpSGdRaU5RWUFENTBORDUwbkJnQWRIU0FBSEFFS0hnWWVDQTRkRWg0S0RDRWRFaDBqSUNFTUhSNDFCZ0FQRkNjR0RoMGkvd0FkSFNEL0VoMGpJUDhoREIwZUp3WUZIZjhGSFFBZElDY0dDcVVBSFN3QUFUQUNNRG9BT3dBaEFEOEFGakFYTUNZZ0V5QVNBUUJmWHlncGUzMElNQXdOQ0FrQ0F3QUJCQVVHQjFzQVhRQStJRDRnUGlBK0lGOEFYd0JmQUN3QUFUQXVBQUFBT3dBNkFEOEFJUUFVSUNnQUtRQjdBSDBBRkRBVk1DTW1LaXN0UEQ0OUFGd2tKVUJBQnY4TEFBdi9EQ0FBVFFaQUJ2OE9BQTcvRHdBUC94QUFFUDhSQUJIL0VnQVNJUVlBQVFFQ0FnTURCQVFGQlFVRkJnWUhCd2NIQ0FnSkNRa0pDZ29LQ2dzTEN3c01EQXdNRFEwTkRRNE9EdzhRRUJFUkVoSVNFaE1URXhNVUZCUVVGUlVWRlJZV0ZoWVhGeGNYR0JnWUdCa1pHUmtnSUNBZ0lTRWhJU0lpSWlJakl5TWpKQ1FrSkNVbEpTVW1KaVltSnljb0tDa3BLU2tpQmlJQUlnQWlBU0lCSWdNaUF5SUZJZ1VoQUlVcEFUQUJDd3dBK3ZHZ29xU21xT0xrNXNMN29hT2xwNm1xcks2d3NyUzJ1THE4dnNERHhjZkp5c3ZNemM3UjFOZmEzZDdmNE9IajVlZm82ZXJyN083eW1Ka3hNVTh4VlRGYk1XRXhvZ0NqQUt3QXJ3Q21BS1VBcVNBQUFBSWxrQ0dSSVpJaGt5R2dKY3NsbVJDNkVBQUFBQUNiRUxvUUJRV2xFTG9RQlRFUkp4RXlFU2NSVlVjVFBoTkhFMWNUVmJrVXVoUzVGTEFVQUFBQUFMa1V2UlJWVUxnVnJ4VzVGYThWVlRVWk1Ca0ZWOUZsMFZqUlpkRmYwVzdSWDlGdjBWL1JjTkZmMFhIUlg5RnkwVlZWVlFXNTBXWFJ1dEZsMGJ2UmJ0RzgwVzdSdTlGdjBielJiOUZWVlZWQkFHRUFRUUJoQUdrQVFRQmhBRUVBUTBRQUFFY0FBRXBMQUFCT1QxQlJBRk5VVlZaWFdGbGFZV0pqWkFCbWFBQndBRUVBWVFCQlFnQkVSVVpIU2dCVEFHRUFRVUlBUkVWR1J3QkpTa3RNVFFCUFV3QmhBRUVBWVFCQkFHRUFRUUJoQUVFQVlRQkJBR0VBUVFCaEFERUJOd0tSQTZNRHNRUFJBeVFBSHdRZ0JaRURvd094QTlFREpBQWZCQ0FGa1FPakE3RUQwUU1rQUI4RUlBV1JBNk1Ec1FQUkF5UUFId1FnQlpFRG93T3hBOUVESkFBZkJDQUZDd3d3QURBQU1BQXdBREFBSndZQUFRVUlLZ1llQ0FNTklCa2FHeHdKRHhjTEdBY0tBQUVFQmd3T0VFU1FkMFVvQml3R0FBQkhCak1HRnhBUkVoTUFCZzRDRHpRR0tnWXJCaTRHQUFBMkJnQUFPZ1l0QmdBQVNnWUFBRVFHQUFCR0JqTUdPUVlBQURVR1FnWUFBRFFHQUFBQUFDNEdBQUEyQmdBQU9nWUFBTG9HQUFCdkJnQUFLQVlzQmdBQVJ3WUFBQUFBTFFZM0Jrb0dRd1lBQUVVR1JnWXpCamtHUVFZMUJrSUdBQUEwQmlvR0t3WXVCZ0FBTmdZNEJqb0diZ1lBQUtFR0p3WUFBUVVJSUNFTEJoQWpLZ1lhR3h3SkR4Y0xHQWNLQUFFRUJnd09FQ2dHTEFZdkJnQUFTQVl5QmkwR053WktCaW9HR2hzY0NROFhDeGdIQ2dBQkJBWU1EaEF3TGpBQUxBQW9BRUVBS1FBVU1GTUFGVEJEVWtORVYxcEJBRWhXVFZaVFJGTlRVRkJXVjBOTlEwMUVUVkpFU2tzd01BQm9hRXRpVjF2TVU4Y3dqRTRhV2VPSktWbWtUaUJtSVhHWlpVMVNqRitOVWJCbEhWSkNmUjkxcVl6d1dEbFVGRytWWWxWakFFNEpUa3FRNWwwdFR2TlRCMk53alZOaWdYbDZlZ2hVZ0c0Slp3aG5NM1Z5VXJaVlRaRVVNQlV3TEdjSlRveE9pVnU1Y0ZOaTEzYmRVbGRsbDEvdlV6QUFPRTRGQUFraUFXQlByays3VHdKUWVsQ1pVT2RRejFDZU5Eb0dUVkZVVVdSUmQxRWNCYmswWjFHTlVVc0ZsMUdrVWN4T3JGRzFVZCtSOVZFRFV0ODBPMUpHVW5KU2QxSVZOUUlBSUlDQUFBZ0FBTWRTQUFJZE16NC9VSUtLazZ5MnVMaTRMQXB3Y01wVDMxTmpDK3RUOFZNR1ZKNVVPRlJJVkdoVW9sVDJWQkJWVTFWalZZUlZoRldaVmF0VnMxWENWUlpYQmxZWFYxRldkRllIVXU1WXpsZjBWdzFZaTFjeVdERllyRmprRlBKWTkxZ0dXUnBaSWxsaVdhZ1c2aGJzV1J0YUoxcllXV1phN2piOE5naGJQbHMrVzhnWncxdllXK2RiODFzWUcvOWJCbHhUWHlKY2dUZGdYRzVjd0Z5TlhPUWRRMTNtSFc1ZGExMThYZUZkNGwwdk9QMWRLRjQ5WG1sZVlqaURJWHc0c0Y2elhyWmV5bDZTby81ZU1TTXhJd0dDSWw4aVg4YzR1RExhWVdKZmExL2pPSnBmelYvWFgvbGZnV0E2T1J3NWxHRFVKc2RnQWdJQUFBQUFBQUFBQ0FBS0FBQUNDQUNBQ0FBQUNJQW9nQUlBQUFKSVlRQUVCZ1F5Um1wY1o1YXFyc2pUWFdJQVZIZnpEQ3M5WS94aWFHT0RZK1JqOFNzaVpNVmpxV011T21sa2ZtU2RaSGRrYkRwUFpXeGxDakRqWmZobVNXWVpPNUZtQ0R2a09wSlJsVkVBWjV4bXJZRFpReGRuRzJjaFoxNW5VMmZETTBrNyttZUZaMUpvaFdodE5JNW9IMmdVYVowN1FtbWphZXBwcUdxak50dHFHRHdoYTZjNFZHdE9QSEpybjJ1NmE3dHJqVG9MSGZvNlRteThQTDlzeld4bmJCWnRQbTEzYlVGdGFXMTRiWVZ0SGowMGJTOXVibTR6UGN0dXgyN1JQdmx0Ym05ZVA0NC94bTg1Y0I1d0czQ1dQVXB3ZlhCM2NLMXdKUVZGY1dOQ25IR3JReWh5TlhKUWNnaEdnSEtWY2pWSEFpQUFBQ0FBQUFBQUNJQUFBQUlDZ0lvQUFDQUFDQW9BZ0lpQUlCUkllbk9MYzZ3K3BYTzRQcmcrUjNSY2RIRjBoWFRLZEJzL0pIVTJURDUxa2t4d2RaOGhFSGFoVDdoUFJGRDhQd2hBOUhielVQSlFHVkV6VVI1M0gzY2ZkMHAzT1VDTGQwWkFsa0FkVkU1NGpIak1lT05BSmxaV2VacFd4VmFQZWV0NUwwRkFla3A2VDNwOFdhZGFwMXJ1ZWdKQ3ExdkdlOGw3SjBLQVhOSjhvRUxvZk9OOEFIMkdYMk45QVVQSGZRSitSWDQwUXloaVIySlpROWxpZW44K1k1Vi8rbjhGZ05wa0kyVmdnS2hsY0lCZk05VkRzb0FEZ1F0RVBvRzFXcWRudFdlVE01d3pBWUlFZ3A2UGEwU1Jnb3VDbllLelVyR0NzNEs5Z3VhQ1BHdmxnaDJEWTRPdGd5T0R2WVBuZzFlRVU0UEtnOHlEM0lNMmJHdHRBZ0FBSUNJcW9Bb0FJSUFvQUtnZ0lBQUNnQ0lDaWdnQXFnQUFBQUlBQUNqVmJDdEY4WVR6aEJhRnluTmtoU3h2WFVWaFJiRnYwbkJyUlZDR1hJWm5obW1HcVlhSWhnNkg0b1o1aHlpSGE0ZUdoOWRGNFljQmlQbEZZSWhqaUdkMjE0amVpRFZHK29pN05LNTRabm0rUnNkR29JcnRpb3FMVll5b2ZLdU13WXdialhlTkwzOEVDTXVOdkkzd2pkNEkxSTQ0ajlLRjdZV1VrUEdRRVpFdWh4dVJPSkxYa3RpU2ZKTDVreFdVK291TGxaVkp0NVYzamVaSnc1YXlYU09YUlpFYWttNUtka3JnbHdxVXNrcVdsQXVZQzVncG1MYVY0cGd6U3ltWnA1bkNtZjZaemtzd214S2JRSno5bk01TTdVeG5uYzZnK0V3Rm9RNmlrYUs3bmxaTitaNytuZ1dmRDU4V256dWZBS1lDaUtBQUFBQUFnQUFvQUFpZ2dLQ0FBSUNBQUFxSWdBQ0FBQ0FxQUlBQVJDQVZJZ0JCc01vREMxRk5Bd0NYQlNER0JRRG5CZ0JGQndEaUNBQlRDUUROQ3lBNERnQnpEeUJkRXlCZ0dpQ3FHd0QwSEFEK0hTQi9MU0R3cGdDeXFnRCtBUUdyRGdGekVTRndFd0c0RmdHYUdnR2Z2QUVpNEFGTDZRRUFRWkRMQXd2VEJyTFAxQURvQTl3QTZBRFlCTndCeWdQY0Fjb0szQVFCQTl6SEFQREFBdHpDQWR5QXdnUGN3QURvQWR6QVFla0E2a0hwQU9vQTZjeXc0c1N3MkFEY3d3RGN3Z0RlQU56RkJkekJBTnpCQU40QTVNQkpDa01UZ0FBWGdFRVlnTUFBM0lBQUVyQVh4MEllcjBjYndRSGN4QURjd1FEY2p3QWpzRFRHZ2NNQTNNQ0J3WUFBM01FQTNLSUFKSjNBQU56QkFOekJBdHpBQWR6QUFOekNBTnpBQU56QUFOekFBTnpCc0cvR0FOekFpQURjbDhPQXlJRENnTVNxQXR5d1JnRGN6WUFBM01FQTNNRUEzTUlDM0VJYndnRGN3UUhjeExBTEFBZVBBQW1Dd0FEY3diQTJBQWVQQUFtdndMQU1BQWVQQUFtd1BRQUhqd0FKc0QwQUI0OEFDYkJPQUFtd1RnQUpoZ0JVQUZ1d05BQUhqd0FKc0R3QkNZOEFDYkJMQUFtd1BBRm5BQW1NQTJ1d093RjJBQW1NQTNxd0d3SGNtZ0RjZ0FEY2dBRFlzQVpCZ1lBQWhJUURnb0VBZ29EQkFBbUF3YkFOQU55d1B3QUhnQUVKc0NFQTNMS2V3ck9EQUFtZUFBbXdiQUFKaWNDd21nRGtzRjRBM3NBQTNMQ3F3QURjc0JZQUNaUEhnUURjcjhRRjNNRUEzSUFCM0xCQ0FBZU9BQW1sd0FEY3hyQUZBUW13Q1FBSGlnRUpzQklBQjdCbndrRUFCTnpCQTl6QVFRQUZBWU1BM0lYQWdzR3dsY0VBM01ZQTNNRUE2Z0RXQU53QXl1UUE2QUhrQU55QXdBRHBBTnpBQU55eW44RUJBY01DQWNHRHdJSUJBY0FBM01BQkFRUGN3TGdEemNLd1hBQUpzQy9mc2ZrQTJnRGtBT2dBM2dIZ3NEZ0JDTGh0bzhDRHlaL0JzQi9Cc09NQUNhUUFDYkJtQUFtYTBiQUlBdHlrQUFtd0xnQUhpd0FKc0w3QWdNRUEzSUhCaE1HQXdMQURBQW13eFFBSnVFYi9BQnF5ME1ZRzNNR3puQURjc0xFQTNMQmt4TFpoQU55QXdLZkFBQUVBM0lNQUNiQjB3QURjc2d6RHNWTEJzR2dCM01JQTNNQUQzTERFQUFtd0J3QUpzQWdBQ1FBSHNCVENyd0VKc0EwQUI3QWJBQW1JQUFld09RQUpBQWV3Z1FBSEFBbXdId0VIandBSmw4YUN4TENjQUFtQ0FBZVd3TEF5QUFrQUI3REtBQWtBQjdCTkFBbXdSUUFKQUFld1FnQUpzTndBQ1FBSHNORUJDWU1BQjdCckFBbXdJZ0FKa1FBSnNDQUFDYkYwQUFtdzBRQUhnQUVKc0NBQUNiaEZKd1FCc0FyR3RJZ0JCcmhFZXdBQnVBeVZBZGdDQVlJQTRnVFlod2ZjZ2NRQjNKM0RzR1BDdUFXS3hvRFFnY2FBd1lERXNOVEdzWVREdGE4RzNMQTh4UUFIQUVIdzBRTUw0ZzRCU3NCSkFrcUFBb0VDZ2dLREFzQUN3Z0lBQ29RQ1FpU0ZBc0FIZ0FtQ0NVQWtnQ0xFQW9JaWhDS0dJc1lDeUFMS0Fzd0Nod0tLSXM0Q2pDS1FJcElpamlLSUFva0NpZ0tDSkFBREFnTUVBNHNDZ0NRSUE0UUpoZ2xZSkFJS0JnT1lJcG9pbmlJQUNRb0RvQ0lNQXc0RFFBZ1FBeElEb2lLbUlzQUpwQ0tvSXFvaWpBS05BbzRDUUFOQ0EwUURnQU9QQW80a3dnZUlDWW9Ka0NSR0E2d2lBQVN3SWtJSXNpSUNCTFFpUUFSRUJMWWlRZ1RDSXNBaXhDTEdJc2dpUUFuQUJKRUN5aUxFQk13aXdnVFFJczRpa2dLVEFwUUNsUUpBQlVJRkNBcVdBcFFrUkFYRUI0d0pqZ25BQnBJa1JBZ0lJd29qZ0FVTUk0UUZrQW1TQ1E0amdnVVNJNFlGaUFVVUk0d0ZGaU9ZQ1lvRkhpT1FCU0FqbWdtT0JTUWpJaU9aQXBvQ213TEFCY0lGeEFXY0Fxd2t4Z1hJQmNZSGxBbVdDUUFIcWlRbUk4b0ZLaU1vSTBBalFpTkVJMFlqekFWS0kwZ2pUQ05PSTFBanVDU2RBczRGdmlRTUNsSWpBQWE4Skxva1FBWlVJMElHUkFaV0kxZ2pvQUtoQXFJQ293TEJBc01DQVFxa0FrTWtwUUxCQjRFSmd3bEJKSUVpeFFLRElvVWloeUxIQXNrQ3l3TE5BcWNDaXlMUEFvMGlrU0tUSW84aXFBS3BBcW9DZ3lRQkF3TURCUU9yQW9Fa0NRT0ZDWWNKV1NRRENnY0RtU0tiSXA4aUFRa0xBNkVpRFFNUEEwRUlFUU1UQTZNaXB5TEJDYVVpcVNLcklvQWpyQUt0QXE0Q1FRTkRBMFVEcndLUEpNTUhpUW1MQ1pFa1J3T3RJZ0VFaEFpeElrTUlzeUlEQkxVaVFRUkZCTGNpUXdURElzRWl4U0xISXNraVFRbkJCTEVDeXlMRkJNMGl3d1RSSXM4aXNnS3pBclFDdFFKQkJVTUZDUXEyQXBVa1JRWEZCNDBKanduQkJwTWtSUWdKSXdzamdRVU5JNFVGa1FtVENROGpnd1VUSTRjRmlRVVZJNDBGRnlPWkNZc0ZIeU9CSTVFRklTT2JDWThGSlNNakk3a0N1Z0s3QXNFRnd3WEZCYndDclNUSEJja0Z4d2VWQ1pjSkFRZXJKQ2NqeXdVckl5a2pRU05ESTBValJ5UE5CVXNqU1NPQ0kwMGpUeU5SSTdra3ZRTFBCYjhrRFFwVEk3OEN2U1NESTdza1FRWlZJME1HUlFaWEkxa2pBVEdBREFBdVJpUkVKRW9rU0NRQUNFSUpSQWtFQ0lnaWhpU0VKSW9raUNTdUlwZ2tsaVNjSkpva0FDTUdDZ0lqQkFwR0NjNEh5Z2ZJQjh3SFJ5UkZKRXNrU1NRQkNFTUpSUWtGQ0lraWh5U0ZKSXNraVNTdklwa2tseVNkSkpza0FTTUhDZ01qQlFwSENjOEh5d2ZKQjgwSFVDUk9KRlFrVWlSUkpFOGtWU1JUSkpRaWxpS1ZJcGNpQkNNR0l3VWpCeU1ZSXhrakdpTWJJeXdqTFNNdUl5OGpBQ1NpSktBa3BpU2tKS2drb3lTaEpLY2twU1NwSkxBa3JpUzBKTElrdGlTeEpLOGt0U1N6Skxja2dnaUFDSUVJQWdnRENKd2luU0lLQ2dzS2d3aEFDNG9zZ1F5SkxJZ3NRQ1ZCSlFBdEJ5NEFEVUFtUVNhQUxnRU55Q2JKSmdBdmhDOENEWU12Z2k5QURkZ20yU2FHTVFRTlFDZEJKd0F4aGpBR0RZVXdoREJCRFVBb0FESUhEVThvVUNpQU1vUXNBeTVYS0VJTmdTeUFMTUFrd1NTR0xJTXN3Q2hERGNBbHdTVkFLVVFOd0NiQkpnVXVBaTdBS1VVTkJTOEVMNEFOMENiUkpvQXZRQ3FDRGVBbTRTYUFNSUV3d0NxRERRUXdBekNCRGNBbndTZUNNRUFyaEExSEtFZ29oREdCTVFZdkNBMkJMd1V3UmcyRE1JSXhBQTRCRGtBUGdCR0NFUU1QQUEvQUVRRVBRQkVDRWdRU2dROUFFc0FQUWhLQUQwUVNoQktDRDRZU2lCS0tFc0FTZ2hLQkVZTVJReEJBRU1FUlFSQkJFUU1TQlJMQkVFRVNBQkJERXNBUVJSS0ZFc0lRaHhLSkVvc1N3UktERW9BUUFCRUJFUUFTQVJLQUVvRVNRQk5CRTBNVFFoTkVFOElUQUJUQUUwQVVnQlRBRkVBVlFSVkFGd0FYUVJmQUZ3QVlBaGdCR0VBWWdCZ0FHY0FZd1JnQkdVQVpRaGxCR1lBWndCbkNHY0VaZ0J6QUhNQWRnQjhBSUFJZ0JDQUdJQWdnUUNDQUlJSWd3Q0RCSUFBaHVDSzVJaEFqRVNNY0l4MGpUQ1JXSkUwa1Z5U01KSTBrbmlTZkpBQWxBaVVFSmNBckFTVURKUVVsd1N2Q0s4TXJ4Q3ZGSzhZcnh5dUFKWUlsaENYSUs0RWxneVdGSmNrcnlpdkxLOHdyelN2T0s4OHJBQ1lDSmdFbUF5YUFKb0ltZ1NhREpzSW14Q2JHSmdBc3d5YkZKc2NtQVN3Q0xBTXNCQ3dGTEFZc0J5ektKc3dtemlZSUxNc216U2JQSmdrc0Npd0xMQXdzRFN3T0xBOHMwaWJVSnRZbTB5YlZKdGNtMmliY0p0NG0yeWJkSnQ4bUFDY0NKd0VuQXllQUo0SW5nU2VESndBb0FpZ0VLQUVvQXlnRktFSW9SQ2hHS0Vrb1N5aE5LRUFzU2loTUtFNG9RU3hDTEVNc1JDeEZMRVlzUnl4UktGTW9WU2hJTEZJb1ZDaFdLRWtzU2l4TExFd3NUU3hPTEU4c2dpd0JMb0F4aHl3Qkx3SXZBeThHTG9VeEFEQUJNQUl3UUVaQlJvQkd3RWJDUnNGR0FFZEFSNEJId0VmQ1J3QkpRRW1BU1lKSkFFckNTUU5LQkVwQVNrRktnRXFCU3NCS3dVckFTOEZMQUVzQlMwQkxRVXZDUzhOTGdFdUJTNEpMZzBzQVRBRk1Ba3dEVEFCV1FGUkNWRVJVUmxSSVZFcFVURlJPVkZCVVVsUlVWRlpVZ0ZTQ1ZJUlV3RlRCVkFCVkFWVkFWVUZWZ0ZXQlZjQlZ3VldBVnNCWUFGY0NWd1JYQmxjSVZ3cFhERmNPVnhCWEVsY1VWeFpYUUZkQ1YwUlhnRmVCVjhCWHdWY0FXQUZZUUZoQldJQllnVmdBV1FGWkFsa0RXVUJaZ0k2Q2pzQ09BSThCajBDUFFZK0JqNENQZzQvQWo4R1BBSkFBUWVEZ0F3dW1IL29ZRjFZTlZoSVRGZ3dXRVRicEFqWk1OdUVTRWhZVERoQU80aElTREJNTStoa1hGbTBQRmc0UEJSUU1HdzhPRHd3ckRnSTJEZ3NGRlVzVzRROE13ZUlRRE9JQS96QUMvd2dDL3llL0lpRUNYMThoSW1FQ0lRSkJRaUVDSVFLZmZ3SmZYeUVDWHo4Q0JUOGlaUUVEQWdFREFnRURBdjhJQXY4S0FnRURBbDhoQXY4eW9pRUNJU0pmUVFML0FPSThCZUlUNUFwdTVBVHVCb1RPQkE0RTdnbm1hSDhFRGo4Z0JFSVdBV0F1QVJaQkFBRUFJUUxoQ1FEaEFlSWJQd0pCUXY4UVlqOE1YejhDNFN2aUtQOGFENFlvL3kvL0JnTC9XQURoSGlBRXR1SWhGaEVnTHcwQTVpVVJCaFltRmlZV0J1QUE1Uk5nWlRiZ0E3dE1OZzAyTCtZREZoc0FOdVVZQk9VQzVnM3BBbllsQnVWYkZnWEdHdyttSkNZUFppWHBBa1V2QmZZR0FCc0ZCdVVXNWhNZzVWSG1Bd1hnQnVrQzVSbm1BU1FQVmdRZ0JpM2xEbVlFNWdFRVJnU0dJUFlIQU9VUlJpQVdBT1VENEMzbERRRGxDdUFENWdjYjVoZ0g1UzRHQndZRlIrWUFad1luQmNibEFpWTI2UUlXQk9VSEJpY0E1UUFnSlNEbERnREZBQVZBWlNBR0JVZG1JQ2NnSndZRjRBQUhZQ1VBUlNZZzZRSWxMYXNQRFFVV0JpQW1Cd0NsWUNVZzVRNEF4UUFsQUNVQUpTQUdBRWNtWUNZZ1JrQUd3R1VBQmNEcEFpWkZCaGJnQWlZSEFPVUJBRVVBNVE0QXhRQWxBSVVnQmdWSGhnQW1Cd0FuQmlBRjRBY2xKaURwQWhZTndBV21BQVluQU9VQUlDVWc1UTRBeFFBbEFJVWdCZ1VIQmdkbUlDY2dKd2JBSmdkZ0pRQkZKaURwQWc4RnErQUNCZ1VBcFVCRkFHVkFKUUFGQUNWQUpVQkZRT1VFWUNjR0owQkhBRWNHSUFXZ0IrQUc2UUpMcncwUGdBWkhCdVVBQUVVQTVROEE1UWhBQlVabkFFWUFac0FtQUVXQUpTWWc2UUxBRnNzUEJRWW5GdVVBQUVVQTVROEE1UUlBaFNBR0JRY0dod0FHSndBbkpzQW53QVVBSlNZZzZRSUFKZUFGSmlmbEFRQkZBT1VoSmdWSFpnQkhBRWNHQlE5Z1JRZkxSU1lnNlFMckFRK2xBQVluQU9VS1FPVVFBT1VCQUFVZ3hVQUdZRWRHQUFZQTV3Q2c2UUlnSnhiZ0JPVW9CaVhHWUEybEJPWUFGdWtDTnVBZEpRQUZBSVVBNVJBQUJRRGxBZ1lsNWdFRklJVUFCQUNtSU9rQ0lHWGdHQVZQOWdjUEZrOG1yK2tDNndJUEJnOEdEd1lTRXhJVEorVUFBT1VjWU9ZR0I0WVdKb1htQXdEbUhBRHZBQWF2QUMrV2J6YmdIZVVqSjJZSHBnY21KeVlGNlFLMnBTY21aVVlGUnlYSFJXYmxCUVluSnFjR0JRZnBBa2NHTCtFZUFBR0FBU0RpSXhZRVF1V0F3UUJsSU1VQUJRQmxJT1VoQUdVZzVSa0FaU0RGQUFVQVpTRGxCd0RsTVFCbElPVTdJRWIyQWVzTVFPVUk3d0tnNFU0Z29pQVI1WUhrRHhibENSZmxFaElUUU9WRFZrcmxBTURsQlFCbFJ1QUQ1UXBHTnVBQjVRb200QVRsQlFCRkFDYmdCT1VzSmdmRzV3QUdKK1lEVmdSV0RRVUdJT2tDb09zQ29MWVJka1liQU9rQ29PVWJCT1V0d0lVbTVSb0dCWURsUHVBQzVSY0FSbWNtUjJBbkJxZEdZQTlBTnVrQzVSWWdoZUFENVNSZzVSS2c2UUlMUU84YTVROG1Kd1lnTnVVdEJ3WUh4Z0FHQndZbjVnQ241Z0lnQnVrQ29Pa0NvTllFdGlEbUJnZ200RGRtQitVbkJnZUdCd2FIQmlmRllPa0MxdThDNWdIdkFVQW1CK1VXQjJZbkpnZEdKZWtDNVNRR0J5WkhCZ2RHSitBQWR1VWM1d0RtQUNjbVFKYnBBa0JGNlFMbEZxUTI0Z0hBNFNNZ1FmWUE0QUJHRnVZRkI4WmxCcVVHSlFjbUJZRGlKT1EzNGdVRTRocmtIZVl5QUliL2dBN2lBUDlhNGdEaEFLSWdvU0RpQU9FQTRnRGhBS0lnb1NEaUFBQUJBQUVBQVFBL3d1RUE0Z1lnNGdEakFPSUE0d0RpQU9NQWdnQWlZUU1PQWs1Q0FDSmhBMDVpSUNKaEFFN2lBSUZPSUVJQUltRURMZ0QzQTV1eE5oUVZFalFWRWhUMkFCZ1pteGYyQVJRVmRqQldEQklUOWdNTUZoRDJBaGViQVBzQ0N3UWdxMHdTRXdUckFrd1NFd0RrQlVEdEdPQUk1Z1ZvQmtqbUJPQUhMd0Z2QVM4Q1FTSkJBZzhCTHd5QnJ3RVBBUThCRDJFUEFtRUNaUUl2SWlHTVAwSVBEQzhDRCtzSTZocy9hZ3N2WUl5UExHOE1Md3d2RE04TTd4Y3NMd3dQRE84WDdJQ0U3d0FTRXhJVDd3d3N6eElUNzBrTTd4YnNFZThnck84OTRCSHZBK0FONnpUdlJ1c083NEF2RE84QkRPOHU3QUR2Wnd6dmdIQVNFeElURWhNU0V4SVRFaE1TRStzVzd5U01FaFBzRnhJVEVoTVNFeElURWhQc0NPK0FlT3g3RWhNU0V4SVRFaE1TRXhJVEVoTVNFeElURWhNU0UrdzNFaE1TRSt3WUVoUHNnSHJ2S093Tkw2enZIeUR2R0FEdlllRW5BT0luQUY4aEl0OUJBajhDUDRJa1FRTC9XZ0t2ZjBZL2dIWUxOdUllQUFLQUFpRGxNTUFFRnVBR0J1VVA0QUhGQU1VQXhRREZBTVVBeFFERkFNVUE1aGcyRkJVVUZWWVVGUllVRmZZQkVUWVJGaFFWTmhRVkVoTVNFeElURWhPV0JQWUNNWFlSRmhMMkJTOFc0Q1h2RWdEdlVlQUU3NEJPNEJMdkJHQVhWZzhFQlFvU0V4SVRFaE1TRXhJVEx4SVRFaE1TRXhJVEVSSXpEK29CWmljUmhDOUtCQVVXTHdEbFRpQW1MaVFGRWVWU0ZrUUZnT1VqQU9WV0FDOXI3d0xsR084YzRBVGxDTzhYQU9zQzd4YnJBQS9yQis4WTZ3THZIK3NINzRDNDVaazQ3empsd0JGMVFPVU5CT1dENzBEdkwrQUI1U0NrTnVXQWhBUlc1UWpwQWlYZ0RQOG1CUVpJRnVZQ0ZnVC9GQ1FtNVQ3cUFpYTI0QUR1RCtRQkx2OEdJdjgyQk9JQW4vOENCQzUvQlg4aS93MWhBb0VDL3dJZ1gwRUNQK0FpUHdVa0FzVUdSUVpsQnVVUEp5WUhid1pBcXk4TkQ2RGxMSGJnQUNmbEt1Y0lKdUFBTnVrQ29PWUtwVllGRmlVRzZRTGxGT1lBTnVVUDVnTW40QU1XNVJWQVJnZmxKd1luWmljbVIvWUZBQVRwQW1BMmhRWUU1UUhwQW9VQTVTR21KeVluSnVBQlJRYmxBQVlISU9rQ0lIYmxDQVNsVHdVSEJnZmxLZ1lGUmlVbWhTWUZCZ1hnRUNVRU51VURCeVluTmdVa0J3YmdBcVVncFNDbDRBSEZBTVVBNGlNT1pPSUJCQzVnNGtqbEd5Y0dKd1luRmdjR0lPa0NvT1dySE9BRTVROWc1U2xnL0lkNC9aaDQ1WURtSU9WaTRCN0M0QVNDZ0FVRzVRSU01UVVBaFFBRkFDVUFKUURsWk80STRBbmxnT01URXVBSTVUZ2c1UzdnSU9VRURROGc1Z2pXRWhNV29PWUlGakV3RWhNU0V4SVRFaE1TRXhJVEVoTVNFellTRTNaUVZnQjJFUklURWhNU0UxWU1FVXdBRmcwMllJVUE1WDhnR3dCV0RWWVNFeFlNRmhFMjZRSTJURGJoRWhJV0V3NFFEdUlTRWd3VERCSVRGaElUTnVVQ0JPVWxKT1VYUUtVZ3BTQ2xJRVZBTFF3T0R5MEFEMnd2NEFKYkx5RGxCQURsRWdEbEN3QWxBT1VISU9VRzRCcmxjNEJXWU9zbFFPOEI2aTFyN3drclR3RHZCVUFQNENmdkpRYmdldVVWUU9VcDRBY0c2eE5nNVJocjRBSGxEQXJsQUFxQTVSNkdnT1VXQUJibEhHRGxBQmFLNENMaElPSWc1VVlnNlFLZzRSeGc0aHhnNVNEZ0FPVXM0QU1XNElBSTVZQ3Y0QUhsRHVBQzVRRGdnQkNsSUFVQTVTUUFKVUFGSU9VUEFCYnJBT1VQTDh2bEYrQUE2d0hnS09VTEFDV0FpK1VPcTBBVzVSS0FGdUE0NVRCZ0t5WHJDQ0RySmdWR0FDYUFabVVBUlFEbEZTQkdZQWJyQWNEMkFjRGxGU3NXNVJWTDRCamxBQS9sRkNaZ2k5YmdBZVV1UU5ibERpRHJBT1VMZ09zQTVRckFkdUFFeStCSTVVSGdMK0VyNEFYaUs4Q3I1UnhtNEFEcEF1Q0FudXNYQU9VaUFDWVJJQ1hnUnVVVjZ3SUY0QURsRHVZRGE1YmdUdVVOeStBTTVRL2dBUWNHQitVdDVnZldZT3NNNlFMZ0IwWUg1U1ZIWmljbU5odDI0QU1iSU9VUndPa0NvRWJsSElZSDVnQUE2UUoyQlNjRjRBRGxHd1kyQmVBQkpnZmxLRWZtQVNkbGRtWVdCd2JwQWdVV0JWWUE2d3pnQStVS0FPVVJSMFluQmdjbXRnYmdPY1VBQlFCbEFPVUhBT1VDRnFEbEp3Wkg1Z0NBNlFLZ0ppY0E1UUFnSlNEbERnREZBQ1VBaFFBbUJTY0daeUFuSUVjZ0JhQUhnSVVuSU1aQWh1Q0FBK1V0UitZQUowWUhCbVdXNlFJMkFCWUdSZUFXNVNoSHBnY0daeVlISmlVV0JlQUE2UUxnZ0I3bEowZG1JR2NtQnliMkQyVW00QnJsS0VmbUFDY0dCeVpXQmVBRDZRS2c5Z1hnQytVakJnY0dKNllIQmdYQTZRTGdMdVVUSUVZblpnZUdZT2tDSzFZUDRJQTQ1U1JINWdFSEpoYmdYT0VZNGhqcEF1c0I0QVRsQUNBRklPVUFBQ1VBNVJDbkFDY2dKZ2NHQlFjRkJ3Wlc0QUhwQXVBKzVRQWc1UjlIWmlBbVp3WUZGZ1VINEJNRjVnTGxJS1lIQldiMkFBYmdBQVdtSjBibEp1WUZCeVpXQlpiZ0ZlVXg0SUIvNVFFQTVSMEh4Z0NtQndZRmx1QUM2UUxyQzBBMjVSWWc1ZzRBQjhZSEpnY200RUhGQUNVQTVSNm1RQVlBSmdER0JRYmdBT2tDb0tVQUpRRGxHSWNBSmdBbkJnY0dCY0RwQXVDQXJ1VUxKaWMyNElBdkJlQUg2dzN2QUczdkNlQUZGdVdERXVCZTZtY0FsdUFENVlBODRJbzA1WU9uQVBzQjRJOC81WUcvNEtFeDVZR3h3T1VYQU9rQ1lEYmdXT1VXSUlZVzRBTGxLTWFXYjJRV0QrQUM2UUlBeXdEbERZRGxDK0NDS09FWTRoanJEM2JnWGVWRFlBWUY1eS9BWnVRRjREZ2tGZ1FHNEFNbjRBYmxsM0RnQU9XRVR1QWk1UUhnb20vbGdKZmdLVVhnQ1dYZ0FPV0JCT0NJZk9WamdPVUZRT1VCd09VQ0lBOG1GbnZna3RUdmdHN2dBdThmSU84MEowWlBwL3NBNWdBdnh1OFdadTh6NEEvdk9rWVA0SUFTNnd6Z0JPOVA0QUhyRWVCLzRSTGlFdUVTd2dEaUN1RVM0aElCQUNFZ0FTQWhJR0VBNFFCaUFBSUF3Z0RpQStFUzRoSWhBR0VnNFFBQXdRRGlFaUVBWVFDQkFBRkF3UURpRXVFUzRoTGhFdUlTNFJMaUV1RVM0aExoRXVJUzRSTGlGQ0RoRVF6aUVReWk0UkVNNGhFTW91RVJET0lSREtMaEVRemlFUXlpNFJFTTRoRU1vajhnNlNydmdYam1MMi9tS3U4QUJ1OEdCaStXNEFlR0FPWUg0SVRJeGdEbUNTREdBQ1lBaHVDQVRlVWxRTWJFSU9rQ1lBVVA0SURvNVNSbTZRS0FEZUNFZU9XQVBTRHJBY2JnSWVFYTRockdCR0RwQW1BMjRJS0o2ek1QU3cxcjRFVHJKUS9yQitDQU9tVUE1Uk1BSlFBRklBVUE1UUlBWlFBRkFBV2dCV0FGQUFVQUJRQkZBQ1VBQlNBRkFBVUFCUUFGQUFVQUpRQUZJR1VBeFFCbEFHVUFCUURsQWdEbENZQkZBSVVBNVFuZ0xDemdnSWJ2SkdEdlhPQUU3d2NnN3djQTd3Y0E3eDNnQXVzRjc0QVo0RER2RmVBRjd5Umc3d0hBTCtBR3IrQ0FFdStBYzQ3dmdsRGdBTzhGUU84RlFPOXM0QVR2VWNEdkJPQU03d1JnN3pEZ0FPOENvTzhnNEFEdkZpQXY0RWJ2Y1FEdlNnRHZmK0FFN3dZZ2owQlBnTS9nQWU4UndNL2dBVS9nQmMvZ0llK0FDd0R2TCtBZDZRTGdnMzdsd0daVzRCcmxqNjNnQStXQVZpRGxsZnJnQnVXY3FlQ0xsK1dCbHVDRld1V1N3K0RLckM0YjRCYjdXT0I0NW9CbzRNQzlpUDNBdjNZZy9jQy9kaUFBQVBVckFBQjZGQUFBL0FVQUFBQUFBQUNBQUFFQW9BQUJBSEFCQVFBUUF3RUFRd01CQUdBREFRQ3dBd0VBMEFNQkFOc0RBUUR3QXdFQUlKRUFBQkFFQVFBd0JBRUFVQVFCQUhBRUFRQ2dCQUVBV1FZQkFGNEdBUUJ3QmdFQXNBWUJBTkFHQVFCQUNBRUFtUWdCQUtVSUFRQ3FDQUVBc0FnQkFQSUlBUUQyQ0FFQUVBa0JBR0FKQVFDYUNRRUFzQWtCQU04SkFRRFlDUUVBNEFrQkFLQUtBUUR3Q2dFQThBc0JBQm9NQVFBd0RBRUFVQXdCQUFBTkFRRHdEUUVBREE0QkFCQU9BUUJnRGdFQThBNEJBSkFQQVFDUWpBQUFnSWtBUVpDQUJBdGtIQURJQUpzQk13QVBBRUVBSUFBTEFBd0FFUUJ5QWg4QUZ3QVdBQ0VBdVFFRkFBb0FOUUFYQUdZQldRQU1BQVVBQkFCQ0FBUUFEd0JIQURvQUN3QWZBQWtBQkFDOEFFY0E4UUFxQUF3QUZnQ3JBTzRBSEFBRUFFSUFrQUNjQURNQUZRUzBBZ0JCZ0lFRUM5SUZySUQrZ0VUYmdGSjZnRWdJZ1U0RWdFTGlnR0ROWm9CQXFJRFdnQUFBQUFEZGdFTndFWUNaQ1lGY0g0Q2Fnb3FBbjRPWGdZMkJ3SXdZRVJ5UkF3R0pBQlFvRVFrQ0JSTWt5aUVZQ0FnQUlRc0xrUWtBQmdBcFFTR0RRS2NJZ0plQWtJQkJ2SUdMaUNRaENSU05BQUdGbDRHNEFJQ2NnNGlCUVZXQm5vbEJrcFcrZzUrQllOUmlBQU9BUU5JQWdHRFV3TlNBeGdFSUNRdUFpd0FHZ01BRER3YUFtd01FQUJhQVFWT0JtSUNZZ0o2QW1JQ2VnSmlBbm9DWWdKNkFtQWVCc1ZYL0dKb0JBQWlBaVFNQUFDZ1lBQUFDQVFBSUFBQUFBQUVBQ3dZREF3Q0FpWUNRSWdTQWtBQUFBQUFBQUFBQVEwU0FRbW1OQUFFQkFNZUtyNHdHajREa014a0xnS0tBblkvbGl1UUtpQUlEUUthTEZvV1R0UW1PQVNLSmdaeUN1VEVKZ1ltQWlZR2NncmtqQ1F1QW5RcUFpb0s1T0JDQmxJR1ZFNEs1TVFtQmlJR0pnWjJBdWlJUWdvbUFwNE81TUJBWGdZcUJuSUs1TUJBWGdZcUJtNE81TUJDQ2lZQ0pnWnlDeWlnQWg1R0J2QUdHa1lEaUFTaUJqNEJBb3BDS2lvQ2o3WXNBQzVZYkVCRXlnNHlMQUltRFJuT0JuWUdkZ1oyQndaSkF1NEdoZ1BXTGc0aEEzWVM0aVlHVHlZRytoSytPdTRLZGlBbTRpckdTUWErTlJzQ3pTUFdmWUhoemg2R0JRV0VIZ0phRTE0R3hqd0M0Z0tXRW00dXNnNitMcElEQ2pZc0hnYXlDc1FBUkRJQ3JKSUJBN0lkZ1R6S0FTRmFFUm9VUURJTkRFNE5CZ29GQlVvSzBqYnVBcklqR2dxT0xrWUc0Z3ErTWpZSGJpQWdvUUorSmxvTzVNUW1CaVlDSmdVRFFqQUxwa1VEc01ZYWNnZEdPQU9tSzVvMUJBSXhBOWlnSkNnQ0FRSTB4SzRDYmlha2dnNUdLclkxQmxqaUcwcFdBamZrcUFBZ1FBb0RCSUFpRFFWdURZRkJYQUxZejNJRmdUS3VBWUNOZ01KQU9BUVJKRzRCSDU1bUZtWVdaQUFBQUFBQkFxWUNPZ0VIMGlER2RoTitBczRCWnNMNk1nS0drUXJDQWpJQ1BqRURTajBOUG1VZVJnV0I2SFlGQTBZQkFob0ZEWVlOZ0lWK1BRMFdaWWN4Zm1ZV1poWmtBUWVDR0JBdEJTYjJBbDRCQlpZQ1hnT1dBbDRCQTZZQ1JnZWFBbDREMmdJNkFUVlNBUk5XQVVDQ0JZTTl0Z1ZPZGdKZUFRVmVBaTRCQThJQkRmNEJndURNSGhHd3VyTjhBUWJDSEJBczNRMDZBVGc2QlJsS0JTSzZBVVAyQVlNNDZnTTZJYlFBR0FKM2YvMER2VGc5WWhJRklrSUNVZ0U5cmdVQzJnRUxPZ0UvZ2lFWm5nQUJCOEljRUN4RkYvNFZBMW9Dd2dFSFJnR0VIMllDT2dBQkJrSWdFQ3pkRGVZQkt0NEQrZ0dBaDVvRmd5OENGUVpXQjh3QUFBQUFBQUFDQVFSNkJBRU41Z0dBdEg0Rmd5OENGUVpXQjh3QUFBQUFBQUFDQUFFSFFpQVFMRmtIRENBaUJwSUZPM0tvS1RvYy9QNGVMZ0k2QXJvQUFRZkNJQkFzaFFONkF6NENYZ0VROGdGa1JnRURrUHorSGlSRUZBaEdBcVJHQVlOc0hob3VFQUVHZ2lRUUxoUVJBbndZQUFRQUJFaENDbjREUEFZQ0xCNEQ3QVFHQXBZQkF1NGllS1lUYUNJR0pnS01FQWdRSWdNbUNuSUJCazRCQWs0RFhnMExlaC9zSWdOSUJnS0VSZ0VEOGdVTFVnUDZBcDRHdGdMV0FpQU1EQTRDTGdJZ0FKb0NRZ0lnREF3T0FpNEJCUVlEaGdVWlNnZFNEUlJ3UWlvQ1JnSnVNZ0tHa1FObUFRTlVBQUFBQUFBQUJQeitIaVJFRUFDa0VFb0NJRW9DSUVSRUVDSThBSUlzU0tnZ0xBQWVDakFhU2dacUFqSXFBMWhnUWlnRU1DZ0FRRVFJR0JSeUZqNCtQaUlCQW9RaUJRUGVCUVRUVm1acEZJSURtZ3VTQVFaNkJRUENBUVM2QTBvQ0xRTldwZ0xRQWd0OEpnTjZBc04yQ2pkK2VnS2VIcm9CQmYyQnltNEZBMFlCQWhvRkRZWU9JZ0dCTmxVRU5DQUNCaVFBQUNZTERnZW1saG9za0FKY0VBQUVCZ091Z1FXcVJ2NEcxcDR5Q21aV1VnWXVBa2dNYUFJQkFoZ2lBbjVsQWd4VU5EUW9XQm9DSVlMeW1nMVM1aG8ySHY0VkNQdFNBeGdFSUNRdUFpd0FHZ01BRER3YUFtd01FQUJhQVFWT0JRU09Cc1ZYL0dKb0JBQWlBaVFNQUFDZ1lBQUFDQVFBSUFBQUFBQUVBQ3dZREF3Q0FpWUNRSWdTQWtFSkRpb1NlZ0orWmdxS0E3b0tNcTRPSU1VbWRpV0Q4QlVJZGF3WGhULyt2aVRXWmhVWWJnRm53Z1ptRXRvTUFBQUFBQUFBQUFLeUFSVnVBc29CT1FJQkVCSUJJQ0lXOGdLYUFqb0JCaFlCTUF3R0FuZ3VBUWRxQWtvRHVnR0ROajRHa2dJbUFRS2lBVDU2QUFFR3dqUVFMRjBGSWdFVW9nRWtDQUlCSUtJRkl4SVZDdUlGdDNOV0FBRUhRalFRTDVnTGRBSURHQlFNQmdVSDJRSjRISlpBTGdJaUJRUHlFUU5DQXRwQ0FtZ0FCQUVDRk80RkFoUXNLZ3NLYTJvcTVpcUdCUU1pYnZJQ1BBb09iZ01tQWo0RHRnSStBN1lDUGdLNkN1NENQQm9EMmdQNkE3WUNQZ095Qmo0RDdnUHNvZ09xQWpJVEtnWm9BQUFPQndSQ0J2WUR2QUlHbkM0U1lNSUNKZ1VMQWdrUm9pb2lBUVZxQ1FUZzVnSytOOVlDT2dLV0l0WUZBaVlHL2hkR1lHQ2dLc2I3WWk2UWlna0c4QUlLS2dveUNqSUtNZ1V6dmdrRThnRUg1aGVpRDNvQmdkWEdBaXdpQW00SFJnWTJoNVlMc2dVREpnSnFSdUlPamdONkFpNENqZ0VDVWdzQ0Rzb0RqaElpQy80RmdUeStBUXdDUFFRMEFnSzZBcklIQ2dFTDdnRWdEZ1VJNmhVSWRpa0ZuZ2ZlQnZZRExnSWlDNTRGQXNZSFFnSStBbHpLRVFNd0NnUHFCUVBxQi9ZRDFnZktBUVF5QlFRRUxnRUNiZ05LQWtZRFFnRUdrZ0VFQkFJSFFnR0JOVjRTNmhrUlhrTStCWUdGMEVpODVocDJEVDRHR1FiU0RSZCtHN0JDQ0FFSEFrQVFMeFFGQXRvQkNGNEZEYllCQnVJQkRXWUJDNzREK2dFbENnTGVBUW1LQVFZMkF3NEJUaUlDcWhPYUIzSUpnYnhXQVJmV0FROEdBbFlCQWlJRHJnSlNCWUZSNmdGUHJnRUpuZ2tUT2dHQlFxSUZFbXdpQVlIRlhnVWdGZ3ErSk5abUZZUDZvaVRXWmhXQXY3d21IWUMveGdRQUFZREFGZ1ppSWpZSkR4Rm0vdjJCUi9HQlpBa0Z0Z2VsZ2RRbUFtbGYzaDBUVnFZaGdKR1pCaTJCTkEyQ20zYUZRTklwQTNZRldnWTFkTUV3ZVFoMUY0Vk5LWUNBTGdVNC9oUHFFU3U4UmdHQ1ErUWtBZ1FCQmtKSUVDMGRnL2MrZlFnMkJZUC85Z1dELy9ZRmcvLzJCWVAvOWdXRC8vWUZnLy8yQllQLzlnV0QvL1lGZy8vMkJZUC85Z1dELy9ZRmcvLzJCWVAvOWdXRC8vWUZnLy8yQllQLzlnUUJCNEpJRUMwV2dqb21HbVJpQW1ZT2hNQUFJQUFzREFvQ1dnSjZBWHhlWGg0NkJrb0NKUVRCQ3owQ2ZRbldkUkd0Qi8vOUJnQk9Zam9CZ3pReUJRUVNCaUlTUmdPT0FYNGVCbDRFQVFiQ1RCQXUzQXFFRGdFQ0NnSTZBWDF1SG1JRk9Cb0JCeUlPTWdtRE9JSU5BdkFPQTJZRmdMbitaZ05pTFFOVmg4ZVdaQUFBQUFLQ0FpNENQZ0VWSWdFQ1RnVUN6Z0txQ1FQV0F2QUFDZ1VFa2dVYmpnVU1WQTRGREJJQkF4WUZBeXdTQVFUbUJRV0dEUUswSmdVRGFnY0NCUTd1QmlJSk40NENNZ0VIRWdHQjArNEJCRFlGQTRnS0FRWDJCMVlIZWdFQ1hnVUNTZ2tDUGdVRDRnR0JTWlFLQlFLaUFpNENQZ01DQVN2T0JSUHlFUU95QjlJUCtna0NBRFlDUGdkY0lnZXVBUWFDQlFYUU1qdWlCUVBpQ1FnUUFnRUQ2Z2RhQlFhT0JRck9CWUV0MGdVQ0VnTUNCaW9CRFVvQmdUZ1dBWGVlQUFBQUFBT2lCUU1PQVFSaUFuWUN6Z0pPQVFUK0E0UUNBV1FpQXNvQ01Bb0JBZzRCQW5JQkJwSUJBMVlGTE1ZQmhwNlNCc1lHeGdiR0JzWUd4Z2JHQnNZR3hnYkdCc1lHeGdiR0JBRUh3bFFRTDhRR2dnSWtBZ0lvS2dFTTlCNEJDQUlDNGdNZUFqUUdCUUxPQXFvb0FRT3FCdFk2ZWdFRUVnVVR6Z1VDckE0VkJOb0ZERklkREJJRDdnc2FCUUp3U2dLWVpnVUU1Z1VGaGcwQ3RDSUpBMm9TOWdVTzdnWWlDVGVPQWpBT0FpUUNCUWJDQllIVDZnVUVNZ2tEaWhFRjlnZFdCM29CQWxvSkFrb0wrZ0krQlFQaUFZRkpqRUlOQXFJQ0pBSUNLQ29EQUFZQkVPWUN2Z0VTRmdFREdnRUUxZ1VDWGhjT0YySU5EdDRSQTdJYnZnLzZDUUlBTmdJK0IxNFRyZ0VHZ2dvdUJRV1VhanVpQlFQaUNRZ1FBZ0VENmdkWUxnVUdkZ3F5QVFvU0JSWGFFWUVYNGdVQ0VnTUNDaVlCRFVZRmdUZ1dBWGVhREFFSHdsd1FMTm1Bei8xbS92MkJSL0dCYUVBZ0FnWWtBQUFtQ1lRWFZZS2Jkb1ZBMGlrRGRnVmFCalYwd1ZCNVRTbGdLZ21EbDhZOXRBdTlBN3dCQnNKZ0VDeGFJaEpHQTQ0Q1pnRlhlZ0VsK2lwd01nSzZBVDUrQUFFSFFtQVFMZ2dTbmdaRUFnSnNBZ0p3QWdLeUFqb0JPZllOSFhJRkptNEdKZ2JXQmpZRkFzSUJBdnhvcUFnb1lHQUFEaUNDQWtTT0lDQUE1bmdzZ2lBbVNJWWdoQzVlQmp6dVREb0ZFUEkzSkFSZ0lGQndTalVHU2xRMkFqVGcxRUJ3QkRCZ0NDWWtwZ1l1U0F3Z0FDQU1oS3BlQmlnc1lDUXVxRDRDbklBQVVJaGdVQUVEL2dFSUNHZ2lCalFtSlFkMkpEMkRPUEN5QlFLR0JrUUNBbXdDQW5BQUFDSUZnMTNhQXVJQzRnTGlBdUlBQUFBQUFBS0lGQkludUE0QmZqSUNMZ0VEWGdKV0EyWVdPZ1VGdWdZdUFRS1dBbUlvYVFNYUFRT2FCaVlDSWdMa1loSWdCQVFrREFRQUpBZ0lQRkFBRWk0b0pBQWlBa1FHQmtTZ0FDZ3dCQzRHS0RBa0VDQUNCa3d3b0dRTUJBU2dCQUFBRkFnV0FpWUdPQVFNQUF4Q0Fpb0d2Z29pQWpZQ05nRUZ6Z1VIT2dwS0JzZ09BUk5tQWk0QkNXQUNBWWIxcGdFREpnRUNmZ1l1QmpRR0p5cGtCbG9DVEFZaVVnVUN0b1lIdkNRS0IwZ3FBUVFhQXZvb29sekVQaXdFWkE0R01DUWVCaUFTQ2l4Y1JBQU1GQWdYVnI4VW5DajBRQVJDQmlVRGlpMEVmcm9DSmdMR0EwWUN5N3lJVWhvaVlOb2lDaklZQUFLSUZCSWxmMG9CQTFJQmczU3FBWVBQVm1VSDZoRVd2ZzJ3R2E5OWg4L3FFWUNZY2dFRGFnSStEWWN4MmdMc1JBWUwwQ1lxVWtoQWFBakFBbDRCQXlBdUFsQU9CUUswU2hOS0FqNEtJZ0lxQVFqNEJCejJBaUlrS3Q0QzhDQWlBa0JDTUFFSGduQVFMK1FSZ0l4bUJRTXdhQVlCQ0NJR1VnYkdMcW9DU2dJd0hnWkFNRHdTQWxBWUlBd0VHQTRHYmdLSUFBeENBdklLWGdJMkFRMXFCc2dPQVljU3RnRURKZ0VDOUFZbkttUUNYZ0pNQklJS1VnVUN0b0l1SWdNV0FsWXVxSEl1UUVJTEdBSUJBdW9HK2pCaVhrWUNaZ1l5QTFkU3Z4U2dTQ3BJT2lFRGlpMEVmcm9DSmdMR0EwWUN5N3lJVWhvaVlOb2lDaklaQXFBT0FYNHlBaTRCQTE0Q1ZnTm1Gam9GQmJvR0xnTjZBeFlDWWlocEF4b0JBNW9HSmdJaUF1UmdvaTREeGlmV0JpZ0FBS0JBb2lZR09BUU1BQXhDQWlvU3Nnb2lBallDTmdFRnpnVUhPZ3BLQnNnT0FSTm1BaTRCQ1dBQ0FZYjFsUVArTWdwNkF1NFdMZ1kwQmlaRzRtbzZKZ0pNQmlBT0lRYkdFUVQySFFRbXYvL09MMUtxTGc3ZUhpWVduaDUzUmk2NkFpWUJCdUVEL1EvMEFBQUFBUUt5QVFxQ0FRc3VBUzBHQlJsS0IxSU5IKzRTWmhMQ1BVUE9BWU15YWowRHVnRUNmZ002SVlMeW1nMVRPaDJ3dWhFLy9IdzhIQXdFQUFBQUFBQUFBQUlBQUFBQUFDQUFBQUFBQkFBQUFJQUFBQUFBRUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUNBQUFBQWdBQUFBSUFBQUFDQUFBQUFnQUFBQUlBQUFBQ0FBQUFBZ0FBQUFJQUFBQUNBQUFBQWdBQUFBSUFBQUFDQUFBQUFnQUFBQUlBQUFBQ0FBQUFBd0FBQUFNQUFBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQlFBQUFBVUFRZU9oQkF1VkFvQUFBQUFBWUU3Q1VLZjAxTlFBQUFCQUFBQUFBTkpvSURmSzVSNEtqV1NFTVhvK0ZiaDFNcGd0eEdsVG5hcXFxaXFycXFxcU1DZGhLRlI2YW1xaEpvZ201djN6UG9NVEFDVkVwOGk2Qm1lMEl3bkh3SUx4S1pjaTdUM0lzdjEvbmlFclY2MmxpRHZESUtzcGZOb0FBQUFnQUFBQUFINjFVQit6aEZpc3hpeXlIbS9pcG9vWTRTRWVzcXBkRENITm5SM2tOSmhEZUV3a0hXVU5lamFKQmJRY0RENFhyRnZaU3h3Tks5ZW9hTmZxRzB6TytKaHBOSkFiNVhJUEJUOURPeHNWYjdBdWRXL3JHamo4UnB6ck9LQWFGLzA3RG1Jd1dScFdqSTJ6dy9RVkd1YWlsU3ZjTU5ZWitkNTl6Sm1abVJtYW1abVpnT3hmR1RHVVlJcDc3aWdaK1NKUEM4OXE5QmdZNHdhTVJqTENHRDJmQ3R3QVFZT2tCQXZPQVNCSEE3Z3lBQUFBUUNZOFRVcEhBN2hTL2RuVldRQUFBR0NPQm5CbEpqeE5hdkNwczI1SEE3aHlqZ0JxZHYzWjFYbHRQd1Y5QUFBQWdOOSt6SUtPQm5DRnJnWHZoeVk4VFlwRjNZMk04S216amdFRndaQkhBN2lTVEhpYWxJNEFhcGJXQ1NpWS9kblZtWStVZEp0dFB3V2RzOGFJbmdBQUFLQTNyV3VoMzM3TW9pTVdJNlNPQm5DbEFBQUFBQUVBQUFBS0FBQUFaQUFBQU9nREFBQVFKd0FBb0lZQkFFQkNEd0NBbHBnQUFPSDFCUURLbWpzQUFBQUFBQUFBQUpRQUFBQjNBQUFBV1FBQUFEc0FBQUFkQUVIZ3BRUUxvd09BQUlBQWdRQ0NBSU1BaEFDRkFJWUFod0NJQUlrQWlnQ0xBSXdBalFDT0FJOEFrQUNRQUpFQWtnQ1RBSlFBbFFDV0FKWUFsd0NZQUprQW1nQ2JBSnNBbkFDZEFKNEFud0NnQUtBQW9RQ2lBS01Bb3dDa0FLVUFwZ0NuQUtjQXFBQ3BBS29BcWdDckFLd0FyUUN0QUs0QXJ3Q3dBTEFBc1FDeUFMSUFzd0MwQUxVQXRRQzJBTGNBdHdDNEFMa0F1UUM2QUxzQXV3QzhBTDBBdlFDK0FMOEF3QURBQU1FQXdRRENBTU1Bd3dERUFNVUF4UURHQU1jQXh3RElBTWtBeVFES0FNc0F5d0RNQU13QXpRRE9BTTRBendEUUFOQUEwUURSQU5JQTB3RFRBTlFBMUFEVkFOWUExZ0RYQU5jQTJBRFpBTmtBMmdEYUFOc0Eyd0RjQU4wQTNRRGVBTjRBM3dEZ0FPQUE0UURoQU9JQTRnRGpBT01BNUFEbEFPVUE1Z0RtQU9jQTV3RG9BT2dBNlFEcUFPb0E2d0RyQU93QTdBRHRBTzBBN2dEdUFPOEE4QUR3QVBFQThRRHlBUElBOHdEekFQUUE5QUQxQVBVQTlnRDJBUGNBOXdENEFQZ0ErUUQ1QVBvQStnRDdBUHNBL0FEOEFQMEEvUUQrQVA0QS93QWdGQkFOREFzS0Nna0pDQWdJQ0FnSEJ3Y0hCd2NIQmdZR0JnWUdCZ1lHQmdZR0JnQkJrS2tFQ3hRQkFMQXlBUUJ3TXdFQTBEWUJBREEzQVFCUVBnQkJzS2tFQzhBQk1WOVNNamM3NndXZjJtNGtBVm55TldoWEx3SWF1aDRGRHVGN0VPQjAxUnptQmpnRm1ML1dMQUFBQUFBQUFBQUFtbFZKQktsc3VoNUdqc0V1Q3haZ0NBY1RNZzBnRWZVTE9DbG1EejZyTWduNDdrQXZCUWwyTGdBQUFBQUFBQUFBVDd0aEJXZXMzVDhZTFVSVSt5SHBQNXYyZ2RJTGMrOC9HQzFFVlBzaCtUL2laUzhpZnl0NlBBZGNGRE1tcG9FOHZjdndlb2dIY0R3SFhCUXpKcWFSUEJndFJGVDdJZWsvR0MxRVZQc2g2Yi9TSVROL2ZOa0NRTkloTTM5ODJRTEFBRUgvcWdRTDZCV0FHQzFFVlBzaENVQVlMVVJVK3lFSndBTUFBQUFFQUFBQUJBQUFBQVlBQUFDRCthSUFSRTV1QVB3cEZRRFJWeWNBM1RUMUFHTGJ3QUE4bVpVQVFaQkRBR05SL2dDNzNxc0F0MkhGQURwdUpBRFNUVUlBU1FiZ0FBbnFMZ0Fja3RFQTZ4MytBQ214SEFEb1BxY0E5VFdDQUVTN0xnQ2M2WVFBdENad0FFRitYd0RXa1RrQVU0TTVBSnowT1FDTFg0UUFLUG05QVBnZk93RGUvNWNBRDVnRkFCRXY3d0FLV29zQWJSOXRBTTkrTmdBSnl5Y0FSayszQUo1bVB3QXQ2bDhBdWlkMUFPWHJ4d0E5ZS9FQTl6a0hBSkpTaWdEN2Erb0FIN0ZmQUFoZGpRQXdBMVlBZS94R0FQQ3Jhd0Fndk04QU52U2FBT09wSFFCZVlaRUFDQnZtQUlXWlpRQ2dGRjhBalVCb0FJRFkvd0FuYzAwQUJnWXhBTXBXRlFESnFITUFlK0pnQUd1TXdBQVp4RWNBeldmREFBbm8zQUJaZ3lvQWkzYkVBS1ljbGdCRXI5MEFHVmZSQUtVK0JRQUZCLzhBTTM0L0FNSXk2QUNZVDk0QXUzMHlBQ1k5d3dBZWErOEFuL2hlQURVZk9nQi84c29BOFljZEFIeVFJUUJxSkh3QTFXNzZBREF0ZHdBVk8wTUF0UlRHQU1NWm5RQ3R4TUlBTEUxQkFBd0FYUUNHZlVZQTQzRXRBSnZHbWdBellnQUF0Tko4QUxTbmx3QTNWZFVBMXo3MkFLTVFHQUJOZHZ3QVpKMHFBSERYcXdCamZQZ0FlckJYQUJjVjV3REFTVllBTzliWkFLZUVPQUFrSThzQTFvcDNBRnBVSXdBQUg3a0E4UW9iQUJuTzN3Q2ZNZjhBWmg1cUFKbFhZUUNzKzBjQWZuL1lBQ0psdHdBeTZJa0E1cjlnQU8vRXpRQnNOZ2tBWFQvVUFCYmUxd0JZTzk0QTNwdVNBTklpS0FBb2h1Z0E0bGhOQU1iS01nQUk0eFlBNEgzTEFCZkFVQUR6SGFjQUdPQmJBQzRUTkFDREVtSUFnMGdCQVBXT1d3Q3RzSDhBSHVueUFFaEtRd0FRWjlNQXF0M1lBSzVmUWdCcVljNEFDaWlrQU5PWnRBQUdwdklBWEhkL0FLUENnd0JoUElnQWluTjRBSytNV2dCdjE3MEFMYVpqQVBTL3l3Q05nZThBSnNGbkFGWEtSUURLMlRZQUtLalNBTUpoalFBU3lYY0FCQ1lVQUJKR213REVXY1FBeU1WRUFFMnlrUUFBRi9NQTFFT3RBQ2xKNVFEOTFSQUFBTDc4QUI2VXpBQnd6dTRBRXo3MUFPenhnQUN6NThNQXgvZ29BSk1GbEFEQmNUNEFMZ216QUF0Rjh3Q0lFcHdBcXlCN0FDNjFud0JIa3NJQWV6SXZBQXhWYlFCeXA1QUFhK2NmQURITGxnQjVGa29BUVhuaUFQVGZpUURvbEpjQTR1YUVBSmt4bHdDSTdXc0FYMTgyQUx2OURnQkltclFBWjZSc0FIRnlRZ0NOWFRJQW54VzRBTHpsQ1FDTk1TVUE5M1E1QURBRkhBQU5EQUVBU3dob0FDenVXQUJIcXBBQWRPY0NBTDNXSkFEM2ZhWUFia2h5QUo4Vzd3Q09sS1lBdEpIMkFORlRVUURQQ3ZJQUlKZ3pBUFZMZmdDeVkyZ0EzVDVmQUVCZEF3Q0ZpWDhBVlZJcEFEZGt3QUJ0MkJBQU1rZ3lBRnRNZFFCT2NkUUFSVlJ1QUFzSndRQXE5V2tBRkdiVkFDY0huUUJkQkZBQXREdmJBT3AyeFFDSCtSY0FTV3Q5QUIwbnVnQ1dhU2tBeHN5c0FLMFVWQUNRNG1vQWlObUpBQ3h5VUFBRXBMNEFkd2VVQVBNd2NBQUEvQ2NBNm5Hb0FHYkNTUUJrNEQwQWw5MkRBS00vbHdCRGxQMEFEWWFNQURGQjNnQ1NPWjBBM1hDTUFCZTM1d0FJM3pzQUZUY3JBRnlBb0FCYWdKTUFFQkdTQUEvbzJBQnNnSzhBMi85TEFEaVFEd0JaR0hZQVlxVVZBR0hMdXdESGlia0FFRUM5QU5MeUJBQkpkU2NBNjdiMkFOc2l1d0FLRktvQWlTWXZBR1NEZGdBSk96TUFEcFFhQUZFNnFnQWRvOElBcisydUFGd21FZ0J0d2swQUxYcWNBTUJXbHdBRFA0TUFDZkQyQUN0QWpBQnRNWmtBT2JRSEFBd2dGUURZdzFzQTlaTEVBTWF0U3dCT3lxVUFwemZOQU9hcE5nQ3JrcFFBM1VKb0FCbGozZ0Iyak84QWFJdFNBUHpiTndDdW9hc0EzeFV4QUFDdW9RQU0rOW9BWkUxbUFPMEZ0d0FwWlRBQVYxYS9BRWYvT2dCcStia0FkYjd6QUNpVDN3Q3JnREFBWm96MkFBVExGUUQ2SWdZQTJlUWRBRDJ6cEFCWEc0OEFOczBKQUU1QzZRQVR2cVFBTXlPMUFQQ3FHZ0JQWmFnQTBzR2xBQXMvRHdCYmVNMEFJL2wyQUh1TEJBQ0pGM0lBeHFaVEFHOXU0Z0R2NndBQW0wcFlBTVRhdHdDcVpyb0Fkcy9QQU5FQ0hRQ3g4UzBBakpuQkFNT3Rkd0NHU05vQTkxMmdBTWFBOUFDczhDOEEzZXlhQUQ5Y3ZBRFEzbTBBa01jZkFDcmJ0Z0NqSlRvQUFLK2FBSzFUa3dDMlZ3UUFLUzIwQUV1QWZnRGFCNmNBZHFvT0FIdFpvUUFXRWlvQTNMY3RBUHJsL1FDSjIvNEFpYjc5QU9SMmJBQUdxZndBUG9Cd0FJVnVGUUQ5aC84QUtENEhBR0ZuTXdBcUdJWUFUYjNxQUxQbnJ3Q1BiVzRBbFdjNUFERy9Xd0NFMTBnQU1OOFdBTWN0UXdBbFlUVUF5WERPQURETHVBQy9iUDBBcEFDaUFBVnM1QUJhM2FBQUlXOUhBR0lTMGdDNVhJUUFjR0ZKQUd0VzRBQ1pVZ0VBVUZVM0FCN1Z0d0F6OGNRQUUyNWZBRjB3NUFDRkxxa0FIYkxEQUtFeU5nQUl0NlFBNnJIVUFCYjNJUUNQYWVRQUovOTNBQXdEZ0FDTlFDMEFUODJnQUNDbG1RQ3pvdE1BTDEwS0FMVDVRZ0FSMnNzQWZiN1FBSnZid1FDckY3MEF5cUtCQUFocVhBQXVWUmNBSndCVkFIOFU4QURoQjRZQUZBdGtBSlpCalFDSHZ0NEEydjBxQUdzbHRnQjdpVFFBQmZQK0FMbS9uZ0JvYWs4QVNpcW9BRS9FV2dBdCtMd0ExMXFZQVBUSGxRQU5UWTBBSURxbUFLUlhYd0FVUDdFQWdEaVZBTXdnQVFCeDNZWUF5ZDYyQUw5ZzlRQk5aUkVBQVFkckFJeXdyQUN5d05BQVVWVklBQjc3RGdDVmNzTUFvd1k3QU1CQU5RQUczSHNBNEVYTUFFNHArZ0RXeXNnQTZQTkJBSHhrM2dDYlpOZ0EyYjR4QUtTWHd3QjNXTlFBYWVQRkFQRGFFd0M2T2p3QVJoaEdBRlYxWHdEU3ZmVUFicExHQUt3dVhRQU9STzBBSEQ1Q0FHSEVod0FwL2VrQTU5YnpBQ0o4eWdCdmtUVUFDT0RGQVAvWGpRQnVhdUlBc1AzR0FKTUl3UUI4WFhRQWE2MnlBTTF1blFBK2Nuc0F4aEZxQVBmUHFRQXBjOThBdGNtNkFMY0FVUURpc2cwQWRMb2tBT1Y5WUFCMDJJb0FEUlVzQUlFWURBQitacFFBQVNrV0FKOTZkZ0Q5L2I0QVZrWHZBTmwrTmdEczJSTUFpN3E1QU1TWC9BQXhxQ2NBOFc3REFKVEZOZ0RZcUZZQXRLaTFBTS9NRGdBU2lTMEFiMWMwQUN4V2lRQ1p6dU1BMWlDNUFHdGVxZ0ErS3B3QUVWL01BUDBMU2dEaDlQc0FqanR0QU9LR0xBRHAxSVFBL0xTcEFPL3UwUUF1TmNrQUx6bGhBRGdoUkFBYjJjZ0FnZndLQVB0S2FnQXZITmdBVTdTRUFFNlpqQUJVSXN3QUtsWGNBTURHMWdBTEdaWUFHbkM0QUdtVlpBQW1XbUFBUDFMdUFIOFJEd0QwdFJFQS9NdjFBRFM4TFFBMHZPNEE2RjNNQU4xZVlBQm5qcHNBa2pQdkFNa1h1QUJoV0pzQTRWZThBRkdEeGdEWVBoQUEzWEZJQUMwYzNRQ3ZHS0VBSVN4R0FGbnoxd0RaZXBnQW5sVEFBRStHK2dCV0J2d0E1WG11QUlraU5nQTRyU0lBWjVQY0FGWG9xZ0NDSmpnQXl1ZWJBRkVOcEFDWk03RUFxZGNPQUdrRlNBQmxzdkFBZjRpbkFJaE1sd0Q1MFRZQUlaS3pBSHVDU2dDWXp5RUFRSi9jQU54SFZRRGhkRG9BWit0Q0FQNmQzd0JlMUY4QWUyZWtBTHFzZWdCVjlxSUFLNGdqQUVHNlZRQlpiZ2dBSVNxR0FEbEhnd0NKNCtZQTVaN1VBRW43UUFEL1Z1a0FIQS9LQU1WWmlnQ1UraXNBMDhIRkFBL0Z6d0RiV3E0QVI4V0dBSVZEWWdBaGhqc0FMSG1VQUJCaGh3QXFUSHNBZ0N3YUFFTy9FZ0NJSnBBQWVEeUpBS2pFNUFEbDIzc0F4RHJDQUNiMDZnRDNaNG9BRFpLL0FHV2pLd0E5azdFQXZYd0xBS1JSM0FBbjNXTUFhZUhkQUpxVUdRQ29LWlVBYU00b0FBbnR0QUJFbnlBQVRwaktBSENDWXdCK2ZDTUFEN2t5QUtmMWpnQVVWdWNBSWZFSUFMV2RLZ0J2ZmswQXBSbFJBTFg1cXdDQzM5WUFsdDFoQUJZMkFnREVPcDhBZzZLaEFITHRiUUE1alhvQWdyaXBBR3N5WEFCR0oxc0FBRFR0QU5JQWR3RDg5RlVBQVZsTkFPQnhnQUJCODhBRUM2NEJRUHNoK1Q4QUFBQUFMVVIwUGdBQUFJQ1lSdmc4QUFBQVlGSE1lRHNBQUFDQWd4dndPUUFBQUVBZ0pYbzRBQUFBZ0NLQzR6WUFBQUFBSGZOcE5kRjBuZ0JYbmIwcWdIQlNELy8vUGljS0FBQUFaQUFBQU9nREFBQVFKd0FBb0lZQkFFQkNEd0NBbHBnQUFPSDFCUmtBQ2dBWkdSa0FBQUFBQlFBQUFBQUFBQWtBQUFBQUN3QUFBQUFBQUFBQUdRQVJDaGtaR1FNS0J3QUJBQWtMR0FBQUNRWUxBQUFMQUFZWkFBQUFHUmtaQUVHeHdnUUxJUTRBQUFBQUFBQUFBQmtBQ2cwWkdSa0FEUUFBQWdBSkRnQUFBQWtBRGdBQURnQkI2OElFQ3dFTUFFSDN3Z1FMRlJNQUFBQUFFd0FBQUFBSkRBQUFBQUFBREFBQURBQkJwY01FQ3dFUUFFR3h3d1FMRlE4QUFBQUVEd0FBQUFBSkVBQUFBQUFBRUFBQUVBQkIzOE1FQ3dFU0FFSHJ3d1FMSGhFQUFBQUFFUUFBQUFBSkVnQUFBQUFBRWdBQUVnQUFHZ0FBQUJvYUdnQkJvc1FFQ3c0YUFBQUFHaG9hQUFBQUFBQUFDUUJCMDhRRUN3RVVBRUhmeEFRTEZSY0FBQUFBRndBQUFBQUpGQUFBQUFBQUZBQUFGQUJCamNVRUN3RVdBRUdaeFFRTEp4VUFBQUFBRlFBQUFBQUpGZ0FBQUFBQUZnQUFGZ0FBTURFeU16UTFOamM0T1VGQ1EwUkZSZ0JCNU1VRUN3RTZBRUdNeGdRTENQLy8vLy8vLy8vL0FFSFF4Z1FMQXhBdlVRQkIzTVlFQ3gwREFBQUFBQUFBQUFJQUFBQUFBQUFBQVFBQUFBRUFBQUFCQUFBQUJRQkJoTWNFQ3dLV0FRQkJuTWNFQ3d1WEFRQUFtQUVBQU93cUFRQkJ0TWNFQ3dFQ0FFSEV4d1FMQ1AvLy8vLy8vLy8vQUVHSXlBUUxDWGdqQVFBQUFBQUFCUUJCbk1nRUN3S1pBUUJCdE1nRUN3NlhBUUFBbWdFQUFQZ3FBUUFBQkFCQnpNZ0VDd0VCQUVIY3lBUUxCZi8vLy84S0FFR2d5UVFMQXhBa0FRPT1cIjtcbiAgICAgICAgaWYgKCFSLnN0YXJ0c1dpdGgoUSkpIHtcbiAgICAgICAgICAgIHZhciBmYSA9IFI7XG4gICAgICAgICAgICBSID0gYS5sb2NhdGVGaWxlID8gYS5sb2NhdGVGaWxlKGZhLCB4KSA6IHggKyBmYTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYShiKSB7IHRyeSB7XG4gICAgICAgICAgICBpZiAoYiA9PSBSICYmIEUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEUpO1xuICAgICAgICAgICAgdmFyIGMgPSBDKGIpO1xuICAgICAgICAgICAgaWYgKGMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICBpZiAoQSlcbiAgICAgICAgICAgICAgICByZXR1cm4gQShiKTtcbiAgICAgICAgICAgIHRocm93IFwiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWRcIjtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZCkge1xuICAgICAgICAgICAgRihkKTtcbiAgICAgICAgfSB9XG4gICAgICAgIGZ1bmN0aW9uIGlhKGIpIHsgaWYgKCFFICYmICh1IHx8IHYpKSB7XG4gICAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBmZXRjaCAmJiAhYi5zdGFydHNXaXRoKFwiZmlsZTovL1wiKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2goYiwgeyBjcmVkZW50aWFsczogXCJzYW1lLW9yaWdpblwiIH0pLnRoZW4oZnVuY3Rpb24gKGMpIHsgaWYgKCFjLm9rKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBcImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJ1wiICsgYiArIFwiJ1wiOyByZXR1cm4gYy5hcnJheUJ1ZmZlcigpOyB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBoYShiKTsgfSk7XG4gICAgICAgICAgICBpZiAoeilcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGMsIGQpIHsgeihiLCBmdW5jdGlvbiAoZSkgeyBjKG5ldyBVaW50OEFycmF5KGUpKTsgfSwgZCk7IH0pO1xuICAgICAgICB9IHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGhhKGIpOyB9KTsgfVxuICAgICAgICBmdW5jdGlvbiBqYShiLCBjLCBkKSB7IHJldHVybiBpYShiKS50aGVuKGZ1bmN0aW9uIChlKSB7IHJldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLCBjKTsgfSkudGhlbihmdW5jdGlvbiAoZSkgeyByZXR1cm4gZTsgfSkudGhlbihkLCBmdW5jdGlvbiAoZSkgeyBEKFwiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogXCIgKyBlKTsgRihlKTsgfSk7IH1cbiAgICAgICAgZnVuY3Rpb24ga2EoYiwgYykgeyB2YXIgZCA9IFI7IHJldHVybiBFIHx8IFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcgfHwgZC5zdGFydHNXaXRoKFEpIHx8IGQuc3RhcnRzV2l0aChcImZpbGU6Ly9cIikgfHwgdyB8fCBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGZldGNoID8gamEoZCwgYiwgYykgOiBmZXRjaChkLCB7IGNyZWRlbnRpYWxzOiBcInNhbWUtb3JpZ2luXCIgfSkudGhlbihmdW5jdGlvbiAoZSkgeyByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcoZSwgYikudGhlbihjLCBmdW5jdGlvbiAoZikgeyBEKFwid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6IFwiICsgZik7IEQoXCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvblwiKTsgcmV0dXJuIGphKGQsIGIsIGMpOyB9KTsgfSk7IH1cbiAgICAgICAgZnVuY3Rpb24gUyhiKSB7IGZvciAoOyAwIDwgYi5sZW5ndGg7KVxuICAgICAgICAgICAgYi5zaGlmdCgpKGEpOyB9XG4gICAgICAgIHZhciBsYSA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFRleHREZWNvZGVyID8gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKSA6IHZvaWQgMDtcbiAgICAgICAgZnVuY3Rpb24gbmEoYiwgYywgZCkgeyB2YXIgZSA9IGMgKyBkOyBmb3IgKGQgPSBjOyBiW2RdICYmICEoZCA+PSBlKTspXG4gICAgICAgICAgICArK2Q7IGlmICgxNiA8IGQgLSBjICYmIGIuYnVmZmVyICYmIGxhKVxuICAgICAgICAgICAgcmV0dXJuIGxhLmRlY29kZShiLnN1YmFycmF5KGMsIGQpKTsgZm9yIChlID0gXCJcIjsgYyA8IGQ7KSB7XG4gICAgICAgICAgICB2YXIgZiA9IGJbYysrXTtcbiAgICAgICAgICAgIGlmIChmICYgMTI4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGcgPSBiW2MrK10gJiA2MztcbiAgICAgICAgICAgICAgICBpZiAoMTkyID09IChmICYgMjI0KSlcbiAgICAgICAgICAgICAgICAgICAgZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChmICYgMzEpIDw8IDYgfCBnKTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBiW2MrK10gJiA2MztcbiAgICAgICAgICAgICAgICAgICAgZiA9IDIyNCA9PSAoZiAmIDI0MCkgPyAoZiAmIDE1KSA8PCAxMiB8IGcgPDwgNiB8IGggOiAoZiAmIDcpIDw8IDE4IHwgZyA8PCAxMiB8IGggPDwgNiB8IGJbYysrXSAmIDYzO1xuICAgICAgICAgICAgICAgICAgICA2NTUzNiA+IGYgPyBlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZikgOiAoZiAtPSA2NTUzNiwgZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgZiA+PiAxMCwgNTYzMjAgfCBmICYgMTAyMykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZik7XG4gICAgICAgIH0gcmV0dXJuIGU7IH1cbiAgICAgICAgZnVuY3Rpb24gVChiLCBjKSB7IHJldHVybiBiID8gbmEoSiwgYiwgYykgOiBcIlwiOyB9XG4gICAgICAgIHZhciBvYSA9IFswLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNV0sIHBhID0gWzAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0XTtcbiAgICAgICAgZnVuY3Rpb24gVShiKSB7IGZvciAodmFyIGMgPSAwLCBkID0gMDsgZCA8IGIubGVuZ3RoOyArK2QpIHtcbiAgICAgICAgICAgIHZhciBlID0gYi5jaGFyQ29kZUF0KGQpO1xuICAgICAgICAgICAgMTI3ID49IGUgPyBjKysgOiAyMDQ3ID49IGUgPyBjICs9IDIgOiA1NTI5NiA8PSBlICYmIDU3MzQzID49IGUgPyAoYyArPSA0LCArK2QpIDogYyArPSAzO1xuICAgICAgICB9IHJldHVybiBjOyB9XG4gICAgICAgIGZ1bmN0aW9uIFYoYiwgYywgZCkgeyB2YXIgZSA9IEo7IGlmICghKDAgPCBkKSlcbiAgICAgICAgICAgIHJldHVybiAwOyB2YXIgZiA9IGM7IGQgPSBjICsgZCAtIDE7IGZvciAodmFyIGcgPSAwOyBnIDwgYi5sZW5ndGg7ICsrZykge1xuICAgICAgICAgICAgdmFyIGggPSBiLmNoYXJDb2RlQXQoZyk7XG4gICAgICAgICAgICBpZiAoNTUyOTYgPD0gaCAmJiA1NzM0MyA+PSBoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSBiLmNoYXJDb2RlQXQoKytnKTtcbiAgICAgICAgICAgICAgICBoID0gNjU1MzYgKyAoKGggJiAxMDIzKSA8PCAxMCkgfCBrICYgMTAyMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgxMjcgPj0gaCkge1xuICAgICAgICAgICAgICAgIGlmIChjID49IGQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGVbYysrXSA9IGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoMjA0NyA+PSBoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjICsgMSA+PSBkKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGVbYysrXSA9IDE5MiB8IGggPj4gNjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICg2NTUzNSA+PSBoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyArIDIgPj0gZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVbYysrXSA9IDIyNCB8IGggPj4gMTI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyArIDMgPj0gZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVbYysrXSA9IDI0MCB8IGggPj4gMTg7XG4gICAgICAgICAgICAgICAgICAgICAgICBlW2MrK10gPSAxMjggfCBoID4+IDEyICYgNjM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZVtjKytdID0gMTI4IHwgaCA+PiA2ICYgNjM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVbYysrXSA9IDEyOCB8IGggJiA2MztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlW2NdID0gMDsgcmV0dXJuIGMgLSBmOyB9XG4gICAgICAgIGZ1bmN0aW9uIHFhKGIpIHsgdmFyIGMgPSBVKGIpICsgMSwgZCA9IHJhKGMpOyBkICYmIFYoYiwgZCwgYyk7IHJldHVybiBkOyB9XG4gICAgICAgIHZhciBXID0ge307XG4gICAgICAgIGZ1bmN0aW9uIHNhKCkgeyBpZiAoIVgpIHtcbiAgICAgICAgICAgIHZhciBiID0geyBVU0VSOiBcIndlYl91c2VyXCIsIExPR05BTUU6IFwid2ViX3VzZXJcIiwgUEFUSDogXCIvXCIsIFBXRDogXCIvXCIsIEhPTUU6IFwiL2hvbWUvd2ViX3VzZXJcIiwgTEFORzogKFwib2JqZWN0XCIgPT0gdHlwZW9mIG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0gfHwgXCJDXCIpLnJlcGxhY2UoXCItXCIsIFwiX1wiKSArIFwiLlVURi04XCIsIF86IHQgfHwgXCIuL3RoaXMucHJvZ3JhbVwiIH0sIGM7XG4gICAgICAgICAgICBmb3IgKGMgaW4gVylcbiAgICAgICAgICAgICAgICB2b2lkIDAgPT09IFdbY10gPyBkZWxldGUgYltjXSA6IGJbY10gPSBXW2NdO1xuICAgICAgICAgICAgdmFyIGQgPSBbXTtcbiAgICAgICAgICAgIGZvciAoYyBpbiBiKVxuICAgICAgICAgICAgICAgIGQucHVzaChjICsgXCI9XCIgKyBiW2NdKTtcbiAgICAgICAgICAgIFggPSBkO1xuICAgICAgICB9IHJldHVybiBYOyB9XG4gICAgICAgIHZhciBYLCB0YSA9IFtudWxsLCBbXSwgW11dO1xuICAgICAgICBmdW5jdGlvbiB1YShiLCBjLCBkLCBlKSB7IHZhciBmID0geyBzdHJpbmc6IGwgPT4geyB2YXIgcSA9IDA7IGlmIChudWxsICE9PSBsICYmIHZvaWQgMCAhPT0gbCAmJiAwICE9PSBsKSB7XG4gICAgICAgICAgICAgICAgcSA9IFUobCkgKyAxO1xuICAgICAgICAgICAgICAgIHZhciBtYSA9IFkocSk7XG4gICAgICAgICAgICAgICAgVihsLCBtYSwgcSk7XG4gICAgICAgICAgICAgICAgcSA9IG1hO1xuICAgICAgICAgICAgfSByZXR1cm4gcTsgfSwgYXJyYXk6IGwgPT4geyB2YXIgcSA9IFkobC5sZW5ndGgpOyBJLnNldChsLCBxKTsgcmV0dXJuIHE7IH0gfTsgYiA9IGFbXCJfXCIgKyBiXTsgdmFyIGcgPSBbXSwgaCA9IDA7IGlmIChlKVxuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBlLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHIgPSBmW2Rba11dO1xuICAgICAgICAgICAgICAgIHIgPyAoMCA9PT0gaCAmJiAoaCA9IHZhKCkpLCBnW2tdID0gcihlW2tdKSkgOiBnW2tdID0gZVtrXTtcbiAgICAgICAgICAgIH0gZCA9IGIuYXBwbHkobnVsbCwgZyk7IHJldHVybiBkID0gZnVuY3Rpb24gKGwpIHsgMCAhPT0gaCAmJiB3YShoKTsgcmV0dXJuIFwic3RyaW5nXCIgPT09IGMgPyBUKGwpIDogXCJib29sZWFuXCIgPT09IGMgPyAhIWwgOiBsOyB9KGQpOyB9XG4gICAgICAgIHZhciB4YSA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgYXRvYiA/IGF0b2IgOiBmdW5jdGlvbiAoYikge1xuICAgICAgICAgICAgdmFyIGMgPSBcIlwiLCBkID0gMDtcbiAgICAgICAgICAgIGIgPSBiLnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvPV0vZywgXCJcIik7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCIuaW5kZXhPZihiLmNoYXJBdChkKyspKTtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIi5pbmRleE9mKGIuY2hhckF0KGQrKykpO1xuICAgICAgICAgICAgICAgIHZhciBnID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiLmluZGV4T2YoYi5jaGFyQXQoZCsrKSk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCIuaW5kZXhPZihiLmNoYXJBdChkKyspKTtcbiAgICAgICAgICAgICAgICBlID0gZSA8PCAyIHwgZiA+PiA0O1xuICAgICAgICAgICAgICAgIGYgPSAoZiAmIDE1KSA8PCA0IHwgZyA+PiAyO1xuICAgICAgICAgICAgICAgIHZhciBrID0gKGcgJiAzKSA8PCA2IHwgaDtcbiAgICAgICAgICAgICAgICBjICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZSk7XG4gICAgICAgICAgICAgICAgNjQgIT09IGcgJiYgKGMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShmKSk7XG4gICAgICAgICAgICAgICAgNjQgIT09IGggJiYgKGMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShrKSk7XG4gICAgICAgICAgICB9IHdoaWxlIChkIDwgYi5sZW5ndGgpO1xuICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIEMoYikgeyBpZiAoYi5zdGFydHNXaXRoKFEpKSB7XG4gICAgICAgICAgICBiID0gYi5zbGljZShRLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoXCJib29sZWFuXCIgPT0gdHlwZW9mIHcgJiYgdykge1xuICAgICAgICAgICAgICAgIHZhciBjID0gQnVmZmVyLmZyb20oYiwgXCJiYXNlNjRcIik7XG4gICAgICAgICAgICAgICAgYyA9IG5ldyBVaW50OEFycmF5KGMuYnVmZmVyLCBjLmJ5dGVPZmZzZXQsIGMuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB4YShiKSwgZSA9IG5ldyBVaW50OEFycmF5KGQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IGQubGVuZ3RoOyArK2IpXG4gICAgICAgICAgICAgICAgICAgICAgICBlW2JdID0gZC5jaGFyQ29kZUF0KGIpO1xuICAgICAgICAgICAgICAgICAgICBjID0gZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJDb252ZXJ0aW5nIGJhc2U2NCBzdHJpbmcgdG8gYnl0ZXMgZmFpbGVkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgfSB9XG4gICAgICAgIHZhciB5YSA9IHsgYTogZnVuY3Rpb24gKGIsIGMsIGQsIGUpIHsgRihcIkFzc2VydGlvbiBmYWlsZWQ6IFwiICsgVChiKSArIFwiLCBhdDogXCIgKyBbYyA/IFQoYykgOiBcInVua25vd24gZmlsZW5hbWVcIiwgZCwgZSA/IFQoZSkgOiBcInVua25vd24gZnVuY3Rpb25cIl0pOyB9LCBsOiBmdW5jdGlvbiAoYiwgYykge1xuICAgICAgICAgICAgICAgIGIgPSBuZXcgRGF0ZSgxRTMgKiAoTFtiID4+IDJdICsgNDI5NDk2NzI5NiAqIEtbYiArIDQgPj4gMl0pKTtcbiAgICAgICAgICAgICAgICBLW2MgPj4gMl0gPSBiLmdldFNlY29uZHMoKTtcbiAgICAgICAgICAgICAgICBLW2MgKyA0ID4+IDJdID0gYi5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgICAgICAgS1tjICsgOCA+PiAyXSA9IGIuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgICAgICBLW2MgKyAxMiA+PiAyXSA9IGIuZ2V0RGF0ZSgpO1xuICAgICAgICAgICAgICAgIEtbYyArIDE2ID4+IDJdID0gYi5nZXRNb250aCgpO1xuICAgICAgICAgICAgICAgIEtbYyArIDIwID4+IDJdID0gYi5nZXRGdWxsWWVhcigpIC0gMTkwMDtcbiAgICAgICAgICAgICAgICBLW2MgKyAyNCA+PiAyXSA9IGIuZ2V0RGF5KCk7XG4gICAgICAgICAgICAgICAgdmFyIGQgPSBiLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICAgICAgS1tjICsgMjggPj4gMl0gPSAoMCAhPT0gZCAlIDQgfHwgMCA9PT0gZCAlIDEwMCAmJiAwICE9PSBkICUgNDAwID8gcGEgOiBvYSlbYi5nZXRNb250aCgpXSArIGIuZ2V0RGF0ZSgpIC0gMSB8IDA7XG4gICAgICAgICAgICAgICAgS1tjICsgMzYgPj4gMl0gPSAtKDYwICogYi5nZXRUaW1lem9uZU9mZnNldCgpKTtcbiAgICAgICAgICAgICAgICBkID0gKG5ldyBEYXRlKGIuZ2V0RnVsbFllYXIoKSwgNiwgMSkpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSAobmV3IERhdGUoYi5nZXRGdWxsWWVhcigpLCAwLCAxKSkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgICAgICAgICBLW2MgKyAzMiA+PiAyXSA9IChkICE9IGUgJiYgYi5nZXRUaW1lem9uZU9mZnNldCgpID09IE1hdGgubWluKGUsIGQpKSB8IDA7XG4gICAgICAgICAgICB9LCBrOiBmdW5jdGlvbiAoYiwgYywgZCkgeyBmdW5jdGlvbiBlKHIpIHsgcmV0dXJuIChyID0gci50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXFwoKFtBLVphLXogXSspXFwpJC8pKSA/IHJbMV0gOiBcIkdNVFwiOyB9IHZhciBmID0gKG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLCBnID0gbmV3IERhdGUoZiwgMCwgMSksIGggPSBuZXcgRGF0ZShmLCA2LCAxKTsgZiA9IGcuZ2V0VGltZXpvbmVPZmZzZXQoKTsgdmFyIGsgPSBoLmdldFRpbWV6b25lT2Zmc2V0KCk7IExbYiA+PiAyXSA9IDYwICogTWF0aC5tYXgoZiwgayk7IEtbYyA+PiAyXSA9IE51bWJlcihmICE9IGspOyBiID0gZShnKTsgYyA9IGUoaCk7IGIgPSBxYShiKTsgYyA9IHFhKGMpOyBrIDwgZiA/IChMW2QgPj4gMl0gPSBiLCBMW2QgKyA0ID4+IDJdID0gYykgOiAoTFtkID4+IDJdID0gYywgTFtkICsgNCA+PiAyXSA9IGIpOyB9LCBiOiBmdW5jdGlvbiAoKSB7IEYoXCJcIik7IH0sXG4gICAgICAgICAgICBtOiBmdW5jdGlvbiAoKSB7IHJldHVybiBEYXRlLm5vdygpOyB9LCBqOiBmdW5jdGlvbiAoYikgeyB2YXIgYyA9IEoubGVuZ3RoOyBiID4+Pj0gMDsgaWYgKDIxNDc0ODM2NDggPCBiKVxuICAgICAgICAgICAgICAgIHJldHVybiAhMTsgZm9yICh2YXIgZCA9IDE7IDQgPj0gZDsgZCAqPSAyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSBjICogKDEgKyAuMiAvIGQpO1xuICAgICAgICAgICAgICAgIGUgPSBNYXRoLm1pbihlLCBiICsgMTAwNjYzMjk2KTtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IE1hdGgsIGcgPSBmLm1pbjtcbiAgICAgICAgICAgICAgICBlID0gTWF0aC5tYXgoYiwgZSk7XG4gICAgICAgICAgICAgICAgZSArPSAoNjU1MzYgLSBlICUgNjU1MzYpICUgNjU1MzY7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IEcuYnVmZmVyO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgRy5ncm93KGcuY2FsbChmLCAyMTQ3NDgzNjQ4LCBlKSAtIGguYnl0ZUxlbmd0aCArIDY1NTM1ID4+PiAxNik7XG4gICAgICAgICAgICAgICAgICAgICAgICBNKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgayA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChyKSB7IH1cbiAgICAgICAgICAgICAgICAgICAgayA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH0gcmV0dXJuICExOyB9LCBlOiBmdW5jdGlvbiAoYiwgYykge1xuICAgICAgICAgICAgICAgIHZhciBkID0gMDtcbiAgICAgICAgICAgICAgICBzYSgpLmZvckVhY2goZnVuY3Rpb24gKGUsIGYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBjICsgZDtcbiAgICAgICAgICAgICAgICAgICAgZiA9IExbYiArIDQgKiBmID4+IDJdID0gZztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChnID0gMDsgZyA8IGUubGVuZ3RoOyArK2cpXG4gICAgICAgICAgICAgICAgICAgICAgICBJW2YrKyA+PiAwXSA9IGUuY2hhckNvZGVBdChnKTtcbiAgICAgICAgICAgICAgICAgICAgSVtmID4+IDBdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZCArPSBlLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAxO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfSwgZjogZnVuY3Rpb24gKGIsIGMpIHsgdmFyIGQgPSBzYSgpOyBMW2IgPj4gMl0gPSBkLmxlbmd0aDsgdmFyIGUgPSAwOyBkLmZvckVhY2goZnVuY3Rpb24gKGYpIHsgZSArPSBmLmxlbmd0aCArIDE7IH0pOyBMW2MgPj4gMl0gPSBlOyByZXR1cm4gMDsgfSwgZDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNTI7IH0sIGk6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDcwOyB9LCBjOiBmdW5jdGlvbiAoYiwgYywgZCwgZSkgeyBmb3IgKHZhciBmID0gMCwgZyA9IDA7IGcgPCBkOyBnKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IExbYyA+PiAyXSwgayA9IExbYyArIDQgPj4gMl07XG4gICAgICAgICAgICAgICAgYyArPSA4O1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgazsgcisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsID0gSltoICsgcl0sIHEgPSB0YVtiXTtcbiAgICAgICAgICAgICAgICAgICAgMCA9PT0gbCB8fCAxMCA9PT0gbCA/ICgoMSA9PT0gYiA/IGFhIDogRCkobmEocSwgMCkpLCBxLmxlbmd0aCA9IDApIDogcS5wdXNoKGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmICs9IGs7XG4gICAgICAgICAgICB9IExbZSA+PiAyXSA9IGY7IHJldHVybiAwOyB9LCBvOiBmdW5jdGlvbiAoYiwgYywgZCwgZSwgZikgeyByZXR1cm4gYS5jYWxsYmFja3MuY2FsbEZ1bmN0aW9uKHZvaWQgMCwgYiwgYywgZCwgZSwgZik7IH0sIG46IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEuY2FsbGJhY2tzLnNob3VsZEludGVycnVwdCh2b2lkIDAsIGIpO1xuICAgICAgICAgICAgfSwgaDogZnVuY3Rpb24gKGIsIGMsIGQpIHsgZCA9IFQoZCk7IHJldHVybiBhLmNhbGxiYWNrcy5sb2FkTW9kdWxlU291cmNlKHZvaWQgMCwgYiwgYywgZCk7IH0sIGc6IGZ1bmN0aW9uIChiLCBjLCBkLCBlKSB7IGQgPSBUKGQpOyBlID0gVChlKTsgcmV0dXJuIGEuY2FsbGJhY2tzLm5vcm1hbGl6ZU1vZHVsZSh2b2lkIDAsIGIsIGMsIGQsIGUpOyB9IH07XG4gICAgICAgIChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGIoZCkgeyBkID0gZC5leHBvcnRzOyBhLmFzbSA9IGQ7IEcgPSBhLmFzbS5wOyBNKCk7IGNhLnVuc2hpZnQoYS5hc20ucSk7IE4tLTsgYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzICYmIGEubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhOKTsgaWYgKDAgPT0gTiAmJiAobnVsbCAhPT0gTyAmJiAoY2xlYXJJbnRlcnZhbChPKSwgTyA9IG51bGwpLCBQKSkge1xuICAgICAgICAgICAgdmFyIGUgPSBQO1xuICAgICAgICAgICAgUCA9IG51bGw7XG4gICAgICAgICAgICBlKCk7XG4gICAgICAgIH0gcmV0dXJuIGQ7IH0gdmFyIGMgPSB7IGE6IHlhIH07IE4rKzsgYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzICYmIGEubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhOKTsgaWYgKGEuaW5zdGFudGlhdGVXYXNtKVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5pbnN0YW50aWF0ZVdhc20oYywgYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZCkge1xuICAgICAgICAgICAgICAgIEQoXCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiBcIiArIGQpLCBuKGQpO1xuICAgICAgICAgICAgfSBrYShjLCBmdW5jdGlvbiAoZCkgeyBiKGQuaW5zdGFuY2UpOyB9KS5jYXRjaChuKTsgcmV0dXJuIHt9OyB9KSgpO1xuICAgICAgICB2YXIgcmEgPSBhLl9tYWxsb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAocmEgPSBhLl9tYWxsb2MgPSBhLmFzbS5yKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfVGhyb3cgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1Rocm93ID0gYS5hc20ucykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld0Vycm9yID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19OZXdFcnJvciA9IGEuYXNtLnQpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SdW50aW1lU2V0TWVtb3J5TGltaXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1J1bnRpbWVTZXRNZW1vcnlMaW1pdCA9IGEuYXNtLnUpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SdW50aW1lQ29tcHV0ZU1lbW9yeVVzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19SdW50aW1lQ29tcHV0ZU1lbW9yeVVzYWdlID0gYS5hc20udikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVEdW1wTWVtb3J5VXNhZ2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1J1bnRpbWVEdW1wTWVtb3J5VXNhZ2UgPSBhLmFzbS53KS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfUmVjb3ZlcmFibGVMZWFrQ2hlY2sgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1JlY292ZXJhYmxlTGVha0NoZWNrID0gYS5hc20ueCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0J1aWxkSXNTYW5pdGl6ZUxlYWsgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0J1aWxkSXNTYW5pdGl6ZUxlYWsgPSBhLmFzbS55KS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfUnVudGltZVNldE1heFN0YWNrU2l6ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUnVudGltZVNldE1heFN0YWNrU2l6ZSA9IGEuYXNtLnopLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRVbmRlZmluZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldFVuZGVmaW5lZCA9IGEuYXNtLkEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXROdWxsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19HZXROdWxsID0gYS5hc20uQikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldEZhbHNlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19HZXRGYWxzZSA9IGEuYXNtLkMpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRUcnVlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19HZXRUcnVlID0gYS5hc20uRCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld1J1bnRpbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld1J1bnRpbWUgPSBhLmFzbS5FKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRnJlZVJ1bnRpbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0ZyZWVSdW50aW1lID0gYS5hc20uRikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld0NvbnRleHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld0NvbnRleHQgPSBhLmFzbS5HKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRnJlZUNvbnRleHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0ZyZWVDb250ZXh0ID0gYS5hc20uSCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0ZyZWVWYWx1ZVBvaW50ZXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0ZyZWVWYWx1ZVBvaW50ZXIgPSBhLmFzbS5JKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9mcmVlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX2ZyZWUgPSBhLmFzbS5KKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRnJlZVZhbHVlUG9pbnRlclJ1bnRpbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0ZyZWVWYWx1ZVBvaW50ZXJSdW50aW1lID0gYS5hc20uSykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0ZyZWVWb2lkUG9pbnRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRnJlZVZvaWRQb2ludGVyID0gYS5hc20uTCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0ZyZWVDU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19GcmVlQ1N0cmluZyA9IGEuYXNtLk0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19EdXBWYWx1ZVBvaW50ZXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0R1cFZhbHVlUG9pbnRlciA9IGEuYXNtLk4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19OZXdPYmplY3QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld09iamVjdCA9IGEuYXNtLk8pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19OZXdPYmplY3RQcm90byA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3T2JqZWN0UHJvdG8gPSBhLmFzbS5QKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3QXJyYXkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld0FycmF5ID0gYS5hc20uUSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld0Zsb2F0NjQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld0Zsb2F0NjQgPSBhLmFzbS5SKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfR2V0RmxvYXQ2NCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfR2V0RmxvYXQ2NCA9IGEuYXNtLlMpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19OZXdTdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld1N0cmluZyA9IGEuYXNtLlQpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRTdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldFN0cmluZyA9IGEuYXNtLlUpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19OZXdTeW1ib2wgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld1N5bWJvbCA9IGEuYXNtLlYpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRTeW1ib2xEZXNjcmlwdGlvbk9yS2V5ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19HZXRTeW1ib2xEZXNjcmlwdGlvbk9yS2V5ID0gYS5hc20uVykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0lzR2xvYmFsU3ltYm9sID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19Jc0dsb2JhbFN5bWJvbCA9IGEuYXNtLlgpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19Jc0pvYlBlbmRpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0lzSm9iUGVuZGluZyA9IGEuYXNtLlkpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19FeGVjdXRlUGVuZGluZ0pvYiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRXhlY3V0ZVBlbmRpbmdKb2IgPSBhLmFzbS5aKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfR2V0UHJvcCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfR2V0UHJvcCA9IGEuYXNtLl8pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19TZXRQcm9wID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19TZXRQcm9wID0gYS5hc20uJCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0RlZmluZVByb3AgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0RlZmluZVByb3AgPSBhLmFzbS5hYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0NhbGwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0NhbGwgPSBhLmFzbS5iYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1Jlc29sdmVFeGNlcHRpb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1Jlc29sdmVFeGNlcHRpb24gPSBhLmFzbS5jYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0R1bXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0R1bXAgPSBhLmFzbS5kYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0V2YWwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0V2YWwgPSBhLmFzbS5lYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1R5cGVvZiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfVHlwZW9mID0gYS5hc20uZmEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRHbG9iYWxPYmplY3QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldEdsb2JhbE9iamVjdCA9IGEuYXNtLmdhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld1Byb21pc2VDYXBhYmlsaXR5ID0gYS5hc20uaGEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19UZXN0U3RyaW5nQXJnID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19UZXN0U3RyaW5nQXJnID0gYS5hc20uaWEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19CdWlsZElzRGVidWcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0J1aWxkSXNEZWJ1ZyA9IGEuYXNtLmphKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfQnVpbGRJc0FzeW5jaWZ5ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19CdWlsZElzQXN5bmNpZnkgPSBhLmFzbS5rYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld0Z1bmN0aW9uID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19OZXdGdW5jdGlvbiA9IGEuYXNtLmxhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfQXJndkdldEpTVmFsdWVDb25zdFBvaW50ZXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0FyZ3ZHZXRKU1ZhbHVlQ29uc3RQb2ludGVyID0gYS5hc20ubWEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SdW50aW1lRW5hYmxlSW50ZXJydXB0SGFuZGxlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUnVudGltZUVuYWJsZUludGVycnVwdEhhbmRsZXIgPSBhLmFzbS5uYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVEaXNhYmxlSW50ZXJydXB0SGFuZGxlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUnVudGltZURpc2FibGVJbnRlcnJ1cHRIYW5kbGVyID0gYS5hc20ub2EpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SdW50aW1lRW5hYmxlTW9kdWxlTG9hZGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19SdW50aW1lRW5hYmxlTW9kdWxlTG9hZGVyID0gYS5hc20ucGEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SdW50aW1lRGlzYWJsZU1vZHVsZUxvYWRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUnVudGltZURpc2FibGVNb2R1bGVMb2FkZXIgPSBhLmFzbS5xYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgZnVuY3Rpb24gdmEoKSB7IHJldHVybiAodmEgPSBhLmFzbS5zYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuICAgICAgICBmdW5jdGlvbiB3YSgpIHsgcmV0dXJuICh3YSA9IGEuYXNtLnRhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG4gICAgICAgIGZ1bmN0aW9uIFkoKSB7IHJldHVybiAoWSA9IGEuYXNtLnVhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG4gICAgICAgIGEuX19fc3RhcnRfZW1fanMgPSA3NDkxNjtcbiAgICAgICAgYS5fX19zdG9wX2VtX2pzID0gNzU4MTg7XG4gICAgICAgIGEuY3dyYXAgPSBmdW5jdGlvbiAoYiwgYywgZCwgZSkgeyB2YXIgZiA9ICFkIHx8IGQuZXZlcnkoZyA9PiBcIm51bWJlclwiID09PSBnIHx8IFwiYm9vbGVhblwiID09PSBnKTsgcmV0dXJuIFwic3RyaW5nXCIgIT09IGMgJiYgZiAmJiAhZSA/IGFbXCJfXCIgKyBiXSA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVhKGIsIGMsIGQsIGFyZ3VtZW50cyk7IH07IH07XG4gICAgICAgIGEuVVRGOFRvU3RyaW5nID0gVDtcbiAgICAgICAgYS5zdHJpbmdUb1VURjggPSBmdW5jdGlvbiAoYiwgYywgZCkgeyByZXR1cm4gVihiLCBjLCBkKTsgfTtcbiAgICAgICAgYS5sZW5ndGhCeXRlc1VURjggPSBVO1xuICAgICAgICB2YXIgWjtcbiAgICAgICAgUCA9IGZ1bmN0aW9uIHphKCkgeyBaIHx8IEFhKCk7IFogfHwgKFAgPSB6YSk7IH07XG4gICAgICAgIGZ1bmN0aW9uIEFhKCkgeyBmdW5jdGlvbiBiKCkgeyBpZiAoIVogJiYgKFogPSAhMCwgYS5jYWxsZWRSdW4gPSAhMCwgIUgpKSB7XG4gICAgICAgICAgICBTKGNhKTtcbiAgICAgICAgICAgIG0oYSk7XG4gICAgICAgICAgICBpZiAoYS5vblJ1bnRpbWVJbml0aWFsaXplZClcbiAgICAgICAgICAgICAgICBhLm9uUnVudGltZUluaXRpYWxpemVkKCk7XG4gICAgICAgICAgICBpZiAoYS5wb3N0UnVuKVxuICAgICAgICAgICAgICAgIGZvciAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBhLnBvc3RSdW4gJiYgKGEucG9zdFJ1biA9IFthLnBvc3RSdW5dKTsgYS5wb3N0UnVuLmxlbmd0aDspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhLnBvc3RSdW4uc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZGEudW5zaGlmdChjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBTKGRhKTtcbiAgICAgICAgfSB9IGlmICghKDAgPCBOKSkge1xuICAgICAgICAgICAgaWYgKGEucHJlUnVuKVxuICAgICAgICAgICAgICAgIGZvciAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBhLnByZVJ1biAmJiAoYS5wcmVSdW4gPSBbYS5wcmVSdW5dKTsgYS5wcmVSdW4ubGVuZ3RoOylcbiAgICAgICAgICAgICAgICAgICAgZWEoKTtcbiAgICAgICAgICAgIFMoYmEpO1xuICAgICAgICAgICAgMCA8IE4gfHwgKGEuc2V0U3RhdHVzID8gKGEuc2V0U3RhdHVzKFwiUnVubmluZy4uLlwiKSwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBhLnNldFN0YXR1cyhcIlwiKTsgfSwgMSk7IGIoKTsgfSwgMSkpIDogYigpKTtcbiAgICAgICAgfSB9XG4gICAgICAgIGlmIChhLnByZUluaXQpXG4gICAgICAgICAgICBmb3IgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgYS5wcmVJbml0ICYmIChhLnByZUluaXQgPSBbYS5wcmVJbml0XSk7IDAgPCBhLnByZUluaXQubGVuZ3RoOylcbiAgICAgICAgICAgICAgICBhLnByZUluaXQucG9wKCkoKTtcbiAgICAgICAgQWEoKTtcbiAgICAgICAgcmV0dXJuIFF1aWNrSlNSYXcucmVhZHk7XG4gICAgfSk7XG59KSgpO1xuaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JylcbiAgICBtb2R1bGUuZXhwb3J0cyA9IFF1aWNrSlNSYXc7XG5lbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pXG4gICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBRdWlja0pTUmF3OyB9KTtcbmVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JylcbiAgICBleHBvcnRzW1wiUXVpY2tKU1Jhd1wiXSA9IFF1aWNrSlNSYXc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbXNjcmlwdGVuLW1vZHVsZS5XQVNNX1JFTEVBU0VfU1lOQy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU0ZGSSA9IHZvaWQgMDtcbi8qKlxuICogTG93LWxldmVsIEZGSSBiaW5kaW5ncyB0byBRdWlja0pTJ3MgRW1zY3JpcHRlbiBtb2R1bGUuXG4gKiBTZWUgaW5zdGVhZCBbW1F1aWNrSlNDb250ZXh0XV0sIHRoZSBwdWJsaWMgSmF2YXNjcmlwdCBpbnRlcmZhY2UgZXhwb3NlZCBieSB0aGlzXG4gKiBsaWJyYXJ5LlxuICpcbiAqIEB1bnN0YWJsZSBUaGUgRkZJIGludGVyZmFjZSBpcyBjb25zaWRlcmVkIHByaXZhdGUgYW5kIG1heSBjaGFuZ2UuXG4gKi9cbmNsYXNzIFF1aWNrSlNGRkkge1xuICAgIGNvbnN0cnVjdG9yKG1vZHVsZSkge1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTtcbiAgICAgICAgLyoqIFNldCBhdCBjb21waWxlIHRpbWUuICovXG4gICAgICAgIHRoaXMuREVCVUcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5RVFNfVGhyb3cgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19UaHJvd1wiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19OZXdFcnJvciA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld0Vycm9yXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVTZXRNZW1vcnlMaW1pdCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX1J1bnRpbWVTZXRNZW1vcnlMaW1pdFwiLCBudWxsLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19SdW50aW1lQ29tcHV0ZU1lbW9yeVVzYWdlID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZUNvbXB1dGVNZW1vcnlVc2FnZVwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19SdW50aW1lRHVtcE1lbW9yeVVzYWdlID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZUR1bXBNZW1vcnlVc2FnZVwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19SZWNvdmVyYWJsZUxlYWtDaGVjayA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX1JlY292ZXJhYmxlTGVha0NoZWNrXCIsIFwibnVtYmVyXCIsIFtdKTtcbiAgICAgICAgdGhpcy5RVFNfQnVpbGRJc1Nhbml0aXplTGVhayA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0J1aWxkSXNTYW5pdGl6ZUxlYWtcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19SdW50aW1lU2V0TWF4U3RhY2tTaXplID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZVNldE1heFN0YWNrU2l6ZVwiLCBudWxsLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19HZXRVbmRlZmluZWQgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19HZXRVbmRlZmluZWRcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19HZXROdWxsID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0TnVsbFwiLCBcIm51bWJlclwiLCBbXSk7XG4gICAgICAgIHRoaXMuUVRTX0dldEZhbHNlID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0RmFsc2VcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19HZXRUcnVlID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0VHJ1ZVwiLCBcIm51bWJlclwiLCBbXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld1J1bnRpbWUgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdSdW50aW1lXCIsIFwibnVtYmVyXCIsIFtdKTtcbiAgICAgICAgdGhpcy5RVFNfRnJlZVJ1bnRpbWUgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19GcmVlUnVudGltZVwiLCBudWxsLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19OZXdDb250ZXh0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3Q29udGV4dFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19GcmVlQ29udGV4dCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0ZyZWVDb250ZXh0XCIsIG51bGwsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0ZyZWVWYWx1ZVBvaW50ZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19GcmVlVmFsdWVQb2ludGVyXCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0ZyZWVWYWx1ZVBvaW50ZXJSdW50aW1lID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRnJlZVZhbHVlUG9pbnRlclJ1bnRpbWVcIiwgbnVsbCwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfRnJlZVZvaWRQb2ludGVyID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRnJlZVZvaWRQb2ludGVyXCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0ZyZWVDU3RyaW5nID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRnJlZUNTdHJpbmdcIiwgbnVsbCwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfRHVwVmFsdWVQb2ludGVyID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRHVwVmFsdWVQb2ludGVyXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld09iamVjdCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld09iamVjdFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19OZXdPYmplY3RQcm90byA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld09iamVjdFByb3RvXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld0FycmF5ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3QXJyYXlcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3RmxvYXQ2NCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld0Zsb2F0NjRcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfR2V0RmxvYXQ2NCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0dldEZsb2F0NjRcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3U3RyaW5nID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3U3RyaW5nXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0dldFN0cmluZyA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0dldFN0cmluZ1wiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19OZXdTeW1ib2wgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdTeW1ib2xcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfR2V0U3ltYm9sRGVzY3JpcHRpb25PcktleSA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0dldFN5bWJvbERlc2NyaXB0aW9uT3JLZXlcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfSXNHbG9iYWxTeW1ib2wgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19Jc0dsb2JhbFN5bWJvbFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19Jc0pvYlBlbmRpbmcgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19Jc0pvYlBlbmRpbmdcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfRXhlY3V0ZVBlbmRpbmdKb2IgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19FeGVjdXRlUGVuZGluZ0pvYlwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19HZXRQcm9wID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0UHJvcFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19TZXRQcm9wID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfU2V0UHJvcFwiLCBudWxsLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19EZWZpbmVQcm9wID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRGVmaW5lUHJvcFwiLCBudWxsLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCIsIFwiYm9vbGVhblwiLCBcImJvb2xlYW5cIl0pO1xuICAgICAgICB0aGlzLlFUU19DYWxsID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfQ2FsbFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19SZXNvbHZlRXhjZXB0aW9uID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUmVzb2x2ZUV4Y2VwdGlvblwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19EdW1wID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRHVtcFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19FdmFsID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRXZhbFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19UeXBlb2YgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19UeXBlb2ZcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfR2V0R2xvYmFsT2JqZWN0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0R2xvYmFsT2JqZWN0XCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld1Byb21pc2VDYXBhYmlsaXR5ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3UHJvbWlzZUNhcGFiaWxpdHlcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfVGVzdFN0cmluZ0FyZyA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX1Rlc3RTdHJpbmdBcmdcIiwgbnVsbCwgW1wic3RyaW5nXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfQnVpbGRJc0RlYnVnID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfQnVpbGRJc0RlYnVnXCIsIFwibnVtYmVyXCIsIFtdKTtcbiAgICAgICAgdGhpcy5RVFNfQnVpbGRJc0FzeW5jaWZ5ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfQnVpbGRJc0FzeW5jaWZ5XCIsIFwibnVtYmVyXCIsIFtdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3RnVuY3Rpb24gPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdGdW5jdGlvblwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJzdHJpbmdcIl0pO1xuICAgICAgICB0aGlzLlFUU19Bcmd2R2V0SlNWYWx1ZUNvbnN0UG9pbnRlciA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0FyZ3ZHZXRKU1ZhbHVlQ29uc3RQb2ludGVyXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVFbmFibGVJbnRlcnJ1cHRIYW5kbGVyID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZUVuYWJsZUludGVycnVwdEhhbmRsZXJcIiwgbnVsbCwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfUnVudGltZURpc2FibGVJbnRlcnJ1cHRIYW5kbGVyID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZURpc2FibGVJbnRlcnJ1cHRIYW5kbGVyXCIsIG51bGwsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVFbmFibGVNb2R1bGVMb2FkZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lRW5hYmxlTW9kdWxlTG9hZGVyXCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVEaXNhYmxlTW9kdWxlTG9hZGVyID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZURpc2FibGVNb2R1bGVMb2FkZXJcIiwgbnVsbCwgW1wibnVtYmVyXCJdKTtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNGRkkgPSBRdWlja0pTRkZJO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmZpLldBU01fUkVMRUFTRV9TWU5DLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zaG91bGRJbnRlcnJ1cHRBZnRlckRlYWRsaW5lID0gZXhwb3J0cy5uZXdBc3luY0NvbnRleHQgPSBleHBvcnRzLm5ld0FzeW5jUnVudGltZSA9IGV4cG9ydHMuZ2V0UXVpY2tKU1N5bmMgPSBleHBvcnRzLmdldFF1aWNrSlMgPSBleHBvcnRzLmVycm9ycyA9IGV4cG9ydHMuUkVMRUFTRV9TWU5DID0gZXhwb3J0cy5SRUxFQVNFX0FTWU5DID0gZXhwb3J0cy5ERUJVR19TWU5DID0gZXhwb3J0cy5ERUJVR19BU1lOQyA9IGV4cG9ydHMubmV3UXVpY2tKU0FzeW5jV0FTTU1vZHVsZSA9IGV4cG9ydHMubmV3UXVpY2tKU1dBU01Nb2R1bGUgPSB2b2lkIDA7XG4vLyBCdWlsZCB2YXJpYW50c1xuY29uc3QgdmFyaWFudHNfMSA9IHJlcXVpcmUoXCIuL3ZhcmlhbnRzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibmV3UXVpY2tKU1dBU01Nb2R1bGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhcmlhbnRzXzEubmV3UXVpY2tKU1dBU01Nb2R1bGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJuZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2YXJpYW50c18xLm5ld1F1aWNrSlNBc3luY1dBU01Nb2R1bGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJERUJVR19BU1lOQ1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFyaWFudHNfMS5ERUJVR19BU1lOQzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRFQlVHX1NZTkNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhcmlhbnRzXzEuREVCVUdfU1lOQzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJFTEVBU0VfQVNZTkNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhcmlhbnRzXzEuUkVMRUFTRV9BU1lOQzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJFTEVBU0VfU1lOQ1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFyaWFudHNfMS5SRUxFQVNFX1NZTkM7IH0gfSk7XG4vLyBFeHBvcnQgaGVscGVyc1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3ZtLWludGVyZmFjZVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vbGlmZXRpbWVcIiksIGV4cG9ydHMpO1xuLyoqIENvbGxlY3RzIHRoZSBpbmZvcm1hdGl2ZSBlcnJvcnMgdGhpcyBsaWJyYXJ5IG1heSB0aHJvdy4gKi9cbmV4cG9ydHMuZXJyb3JzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2Vycm9yc1wiKSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZGVmZXJyZWQtcHJvbWlzZVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vbW9kdWxlLXRlc3RcIiksIGV4cG9ydHMpO1xubGV0IHNpbmdsZXRvbiA9IHVuZGVmaW5lZDtcbmxldCBzaW5nbGV0b25Qcm9taXNlID0gdW5kZWZpbmVkO1xuLyoqXG4gKiBHZXQgYSBzaGFyZWQgc2luZ2xldG9uIHtAbGluayBRdWlja0pTV0FTTU1vZHVsZX0uIFVzZSB0aGlzIHRvIGV2YWx1YXRlIGNvZGVcbiAqIG9yIGNyZWF0ZSBKYXZhc2NyaXB0IGVudmlyb25tZW50cy5cbiAqXG4gKiBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgZW50cnlwb2ludCBmb3IgdGhlIHF1aWNranMtZW1zY3JpcHRlbiBsaWJyYXJ5LlxuICpcbiAqIElmIHlvdSBuZWVkIHN0cmljdGVzdCBwb3NzaWJsZSBpc29sYXRpb24gZ3VhcmFudGVlcywgeW91IG1heSBjcmVhdGUgYVxuICogc2VwYXJhdGUge0BsaW5rIFF1aWNrSlNXQVNNTW9kdWxlfSB2aWEge0BsaW5rIG5ld1F1aWNrSlNXQVNNTW9kdWxlfS5cbiAqXG4gKiBUbyB3b3JrIHdpdGggdGhlIGFzeW5jaWZpZWQgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnksIHNlZSB0aGVzZSBmdW5jdGlvbnM6XG4gKlxuICogLSB7QGxpbmsgbmV3QXN5bmNSdW50aW1lfS5cbiAqIC0ge0BsaW5rIG5ld0FzeW5jQ29udGV4dH0uXG4gKiAtIHtAbGluayBuZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlfS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UXVpY2tKUygpIHtcbiAgICBzaW5nbGV0b25Qcm9taXNlID8/IChzaW5nbGV0b25Qcm9taXNlID0gKDAsIHZhcmlhbnRzXzEubmV3UXVpY2tKU1dBU01Nb2R1bGUpKCkudGhlbigoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgc2luZ2xldG9uID0gaW5zdGFuY2U7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9KSk7XG4gICAgcmV0dXJuIGF3YWl0IHNpbmdsZXRvblByb21pc2U7XG59XG5leHBvcnRzLmdldFF1aWNrSlMgPSBnZXRRdWlja0pTO1xuLyoqXG4gKiBQcm92aWRlcyBzeW5jaHJvbm91cyBhY2Nlc3MgdG8gdGhlIHNoYXJlZCB7QGxpbmsgUXVpY2tKU1dBU01Nb2R1bGV9IGluc3RhbmNlIHJldHVybmVkIGJ5IHtAbGluayBnZXRRdWlja0pTfSwgYXMgbG9uZyBhc1xuICogbGVhc3Qgb25jZS5cbiAqIEB0aHJvd3MgSWYgY2FsbGVkIGJlZm9yZSBgZ2V0UXVpY2tKU2AgcmVzb2x2ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFF1aWNrSlNTeW5jKCkge1xuICAgIGlmICghc2luZ2xldG9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlF1aWNrSlMgbm90IGluaXRpYWxpemVkLiBBd2FpdCBnZXRRdWlja0pTKCkgYXQgbGVhc3Qgb25jZS5cIik7XG4gICAgfVxuICAgIHJldHVybiBzaW5nbGV0b247XG59XG5leHBvcnRzLmdldFF1aWNrSlNTeW5jID0gZ2V0UXVpY2tKU1N5bmM7XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBbW1F1aWNrSlNBc3luY1J1bnRpbWVdXSBpbiBhIHNlcGFyYXRlIFdlYkFzc2VtYmx5IG1vZHVsZS5cbiAqXG4gKiBFYWNoIHJ1bnRpbWUgaXMgaXNvbGF0ZWQgaW4gYSBzZXBhcmF0ZSBXZWJBc3NlbWJseSBtb2R1bGUsIHNvIHRoYXQgZXJyb3JzIGluXG4gKiBvbmUgcnVudGltZSBjYW5ub3QgY29udGFtaW5hdGUgYW5vdGhlciBydW50aW1lLCBhbmQgZWFjaCBydW50aW1lIGNhbiBleGVjdXRlXG4gKiBhbiBhc3luY2hyb25vdXMgYWN0aW9uIHdpdGhvdXQgY29uZmxpY3RzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBhIGhhcmQgbGltaXQgb24gdGhlIG51bWJlciBvZiBXZWJBc3NlbWJseSBtb2R1bGVzIGluIG9sZGVyXG4gKiB2ZXJzaW9ucyBvZiB2ODpcbiAqIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTEyMDc2XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5ld0FzeW5jUnVudGltZShvcHRpb25zKSB7XG4gICAgY29uc3QgbW9kdWxlID0gYXdhaXQgKDAsIHZhcmlhbnRzXzEubmV3UXVpY2tKU0FzeW5jV0FTTU1vZHVsZSkoKTtcbiAgICByZXR1cm4gbW9kdWxlLm5ld1J1bnRpbWUob3B0aW9ucyk7XG59XG5leHBvcnRzLm5ld0FzeW5jUnVudGltZSA9IG5ld0FzeW5jUnVudGltZTtcbi8qKlxuICogQ3JlYXRlIGEgbmV3IFtbUXVpY2tKU0FzeW5jQ29udGV4dF1dICh3aXRoIGFuIGFzc29jaWF0ZWQgcnVudGltZSkgaW4gYW5cbiAqIHNlcGFyYXRlIFdlYkFzc2VtYmx5IG1vZHVsZS5cbiAqXG4gKiBFYWNoIGNvbnRleHQgaXMgaXNvbGF0ZWQgaW4gYSBzZXBhcmF0ZSBXZWJBc3NlbWJseSBtb2R1bGUsIHNvIHRoYXQgZXJyb3JzIGluXG4gKiBvbmUgcnVudGltZSBjYW5ub3QgY29udGFtaW5hdGUgYW5vdGhlciBydW50aW1lLCBhbmQgZWFjaCBydW50aW1lIGNhbiBleGVjdXRlXG4gKiBhbiBhc3luY2hyb25vdXMgYWN0aW9uIHdpdGhvdXQgY29uZmxpY3RzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBhIGhhcmQgbGltaXQgb24gdGhlIG51bWJlciBvZiBXZWJBc3NlbWJseSBtb2R1bGVzIGluIG9sZGVyXG4gKiB2ZXJzaW9ucyBvZiB2ODpcbiAqIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTEyMDc2XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5ld0FzeW5jQ29udGV4dChvcHRpb25zKSB7XG4gICAgY29uc3QgbW9kdWxlID0gYXdhaXQgKDAsIHZhcmlhbnRzXzEubmV3UXVpY2tKU0FzeW5jV0FTTU1vZHVsZSkoKTtcbiAgICByZXR1cm4gbW9kdWxlLm5ld0NvbnRleHQob3B0aW9ucyk7XG59XG5leHBvcnRzLm5ld0FzeW5jQ29udGV4dCA9IG5ld0FzeW5jQ29udGV4dDtcbi8qKlxuICogUmV0dXJucyBhbiBpbnRlcnJ1cHQgaGFuZGxlciB0aGF0IGludGVycnVwdHMgSmF2YXNjcmlwdCBleGVjdXRpb24gYWZ0ZXIgYSBkZWFkbGluZSB0aW1lLlxuICpcbiAqIEBwYXJhbSBkZWFkbGluZSAtIEludGVycnVwdCBleGVjdXRpb24gaWYgaXQncyBzdGlsbCBydW5uaW5nIGFmdGVyIHRoaXMgdGltZS5cbiAqICAgTnVtYmVyIHZhbHVlcyBhcmUgY29tcGFyZWQgYWdhaW5zdCBgRGF0ZS5ub3coKWBcbiAqL1xuZnVuY3Rpb24gc2hvdWxkSW50ZXJydXB0QWZ0ZXJEZWFkbGluZShkZWFkbGluZSkge1xuICAgIGNvbnN0IGRlYWRsaW5lQXNOdW1iZXIgPSB0eXBlb2YgZGVhZGxpbmUgPT09IFwibnVtYmVyXCIgPyBkZWFkbGluZSA6IGRlYWRsaW5lLmdldFRpbWUoKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3coKSA+IGRlYWRsaW5lQXNOdW1iZXI7XG4gICAgfTtcbn1cbmV4cG9ydHMuc2hvdWxkSW50ZXJydXB0QWZ0ZXJEZWFkbGluZSA9IHNob3VsZEludGVycnVwdEFmdGVyRGVhZGxpbmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU2NvcGUgPSBleHBvcnRzLldlYWtMaWZldGltZSA9IGV4cG9ydHMuU3RhdGljTGlmZXRpbWUgPSBleHBvcnRzLkxpZmV0aW1lID0gdm9pZCAwO1xuY29uc3QgYXN5bmNpZnlfaGVscGVyc18xID0gcmVxdWlyZShcIi4vYXN5bmNpZnktaGVscGVyc1wiKTtcbmNvbnN0IGRlYnVnXzEgPSByZXF1aXJlKFwiLi9kZWJ1Z1wiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuLyoqXG4gKiBBIGxpZmV0aW1lIHByZXZlbnRzIGFjY2VzcyB0byBhIHZhbHVlIGFmdGVyIHRoZSBsaWZldGltZSBoYXMgYmVlblxuICogW1tkaXNwb3NlXV1lZC5cbiAqXG4gKiBUeXBpY2FsbHksIHF1aWNranMtZW1zY3JpcHRlbiB1c2VzIExpZmV0aW1lcyB0byBwcm90ZWN0IEMgbWVtb3J5IHBvaW50ZXJzLlxuICovXG5jbGFzcyBMaWZldGltZSB7XG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgTGlmZXRpbWUgaXMgZGlzcG9zZWQsIGl0IHdpbGwgY2FsbCBgZGlzcG9zZXIoX3ZhbHVlKWAuIFVzZSB0aGVcbiAgICAgKiBkaXNwb3NlciBmdW5jdGlvbiB0byBpbXBsZW1lbnQgd2hhdGV2ZXIgY2xlYW51cCBuZWVkcyB0byBoYXBwZW4gYXQgdGhlIGVuZFxuICAgICAqIG9mIGB2YWx1ZWAncyBsaWZldGltZS5cbiAgICAgKlxuICAgICAqIGBfb3duZXJgIGlzIG5vdCB1c2VkIG9yIGNvbnRyb2xsZWQgYnkgdGhlIGxpZmV0aW1lLiBJdCdzIGp1c3QgbWV0YWRhdGEgZm9yXG4gICAgICogdGhlIGNyZWF0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX3ZhbHVlLCBjb3BpZXIsIGRpc3Bvc2VyLCBfb3duZXIpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7XG4gICAgICAgIHRoaXMuY29waWVyID0gY29waWVyO1xuICAgICAgICB0aGlzLmRpc3Bvc2VyID0gZGlzcG9zZXI7XG4gICAgICAgIHRoaXMuX293bmVyID0gX293bmVyO1xuICAgICAgICB0aGlzLl9hbGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuX2NvbnN0cnVjdG9yU3RhY2sgPSBkZWJ1Z18xLlFUU19ERUJVRyA/IG5ldyBFcnJvcihcIkxpZmV0aW1lIGNvbnN0cnVjdGVkXCIpLnN0YWNrIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgYWxpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGl2ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIHRoaXMgTGlmZXRpbWUgcHJvdGVjdHMuIFlvdSBtdXN0IG5ldmVyIHJldGFpbiB0aGUgdmFsdWUgLSBpdFxuICAgICAqIG1heSBiZWNvbWUgaW52YWxpZCwgbGVhZGluZyB0byBtZW1vcnkgZXJyb3JzLlxuICAgICAqXG4gICAgICogQHRocm93cyBJZiB0aGUgbGlmZXRpbWUgaGFzIGJlZW4gW1tkaXNwb3NlXV1kIGFscmVhZHkuXG4gICAgICovXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICB0aGlzLmFzc2VydEFsaXZlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgZ2V0IG93bmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3duZXI7XG4gICAgfVxuICAgIGdldCBkdXBhYmxlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmNvcGllcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGhhbmRsZSBwb2ludGluZyB0byB0aGUgc2FtZSBbW3ZhbHVlXV0uXG4gICAgICovXG4gICAgZHVwKCkge1xuICAgICAgICB0aGlzLmFzc2VydEFsaXZlKCk7XG4gICAgICAgIGlmICghdGhpcy5jb3BpZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi1kdXBhYmxlIGxpZmV0aW1lXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTGlmZXRpbWUodGhpcy5jb3BpZXIodGhpcy5fdmFsdWUpLCB0aGlzLmNvcGllciwgdGhpcy5kaXNwb3NlciwgdGhpcy5fb3duZXIpO1xuICAgIH1cbiAgICBjb25zdW1lKG1hcCkge1xuICAgICAgICB0aGlzLmFzc2VydEFsaXZlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG1hcCh0aGlzKTtcbiAgICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc3Bvc2Ugb2YgW1t2YWx1ZV1dIGFuZCBwZXJmb3JtIGNsZWFudXAuXG4gICAgICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5hc3NlcnRBbGl2ZSgpO1xuICAgICAgICBpZiAodGhpcy5kaXNwb3Nlcikge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3Nlcih0aGlzLl92YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYWxpdmUgPSBmYWxzZTtcbiAgICB9XG4gICAgYXNzZXJ0QWxpdmUoKSB7XG4gICAgICAgIGlmICghdGhpcy5hbGl2ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnN0cnVjdG9yU3RhY2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuUXVpY2tKU1VzZUFmdGVyRnJlZShgTGlmZXRpbWUgbm90IGFsaXZlXFxuJHt0aGlzLl9jb25zdHJ1Y3RvclN0YWNrfVxcbkxpZmV0aW1lIHVzZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTVXNlQWZ0ZXJGcmVlKFwiTGlmZXRpbWUgbm90IGFsaXZlXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5MaWZldGltZSA9IExpZmV0aW1lO1xuLyoqXG4gKiBBIExpZmV0aW1lIHRoYXQgbGl2ZXMgZm9yZXZlci4gVXNlZCBmb3IgY29uc3RhbnRzLlxuICovXG5jbGFzcyBTdGF0aWNMaWZldGltZSBleHRlbmRzIExpZmV0aW1lIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSwgb3duZXIpIHtcbiAgICAgICAgc3VwZXIodmFsdWUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBvd25lcik7XG4gICAgfVxuICAgIC8vIFN0YXRpYyBsaWZldGltZSBkb2Vzbid0IG5lZWQgYSBjb3BpZXIgdG8gYmUgY29waWFibGVcbiAgICBnZXQgZHVwYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIENvcHkgcmV0dXJucyB0aGUgc2FtZSBpbnN0YW5jZS5cbiAgICBkdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBEaXNwb3NlIGRvZXMgbm90aGluZy5cbiAgICBkaXNwb3NlKCkgeyB9XG59XG5leHBvcnRzLlN0YXRpY0xpZmV0aW1lID0gU3RhdGljTGlmZXRpbWU7XG4vKipcbiAqIEEgTGlmZXRpbWUgdGhhdCBkb2VzIG5vdCBvd24gaXRzIGB2YWx1ZWAuIEEgV2Vha0xpZmV0aW1lIG5ldmVyIGNhbGxzIGl0c1xuICogYGRpc3Bvc2VyYCBmdW5jdGlvbiwgYnV0IGNhbiBiZSBgZHVwYGVkIHRvIHByb2R1Y2UgcmVndWxhciBsaWZldGltZXMgdGhhdFxuICogZG8uXG4gKlxuICogVXNlZCBmb3IgZnVuY3Rpb24gYXJndW1lbnRzLlxuICovXG5jbGFzcyBXZWFrTGlmZXRpbWUgZXh0ZW5kcyBMaWZldGltZSB7XG4gICAgY29uc3RydWN0b3IodmFsdWUsIGNvcGllciwgZGlzcG9zZXIsIG93bmVyKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IGNhcmUgaWYgdGhlIGRpc3Bvc2VyIGRvZXNuJ3Qgc3VwcG9ydCBmcmVlaW5nIFRcbiAgICAgICAgc3VwZXIodmFsdWUsIGNvcGllciwgZGlzcG9zZXIsIG93bmVyKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5fYWxpdmUgPSBmYWxzZTtcbiAgICB9XG59XG5leHBvcnRzLldlYWtMaWZldGltZSA9IFdlYWtMaWZldGltZTtcbmZ1bmN0aW9uIHNjb3BlRmluYWxseShzY29wZSwgYmxvY2tFcnJvcikge1xuICAgIC8vIGNvbnNvbGUubG9nKCdzY29wZUZpbmFsbHknLCBzY29wZSwgYmxvY2tFcnJvcilcbiAgICBsZXQgZGlzcG9zZUVycm9yO1xuICAgIHRyeSB7XG4gICAgICAgIHNjb3BlLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGRpc3Bvc2VFcnJvciA9IGVycm9yO1xuICAgIH1cbiAgICBpZiAoYmxvY2tFcnJvciAmJiBkaXNwb3NlRXJyb3IpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihibG9ja0Vycm9yLCB7XG4gICAgICAgICAgICBtZXNzYWdlOiBgJHtibG9ja0Vycm9yLm1lc3NhZ2V9XFxuIFRoZW4sIGZhaWxlZCB0byBkaXNwb3NlIHNjb3BlOiAke2Rpc3Bvc2VFcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICBkaXNwb3NlRXJyb3IsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBibG9ja0Vycm9yO1xuICAgIH1cbiAgICBpZiAoYmxvY2tFcnJvciB8fCBkaXNwb3NlRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgYmxvY2tFcnJvciB8fCBkaXNwb3NlRXJyb3I7XG4gICAgfVxufVxuLyoqXG4gKiBTY29wZSBoZWxwcyByZWR1Y2UgdGhlIGJ1cmRlbiBvZiBtYW51YWxseSB0cmFja2luZyBhbmQgZGlzcG9zaW5nIG9mXG4gKiBMaWZldGltZXMuIFNlZSBbW3dpdGhTY29wZV1dLiBhbmQgW1t3aXRoU2NvcGVBc3luY11dLlxuICovXG5jbGFzcyBTY29wZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2FibGVzID0gbmV3IExpZmV0aW1lKG5ldyBTZXQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJ1biBgYmxvY2tgIHdpdGggYSBuZXcgU2NvcGUgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIGRpc3Bvc2VkIGFmdGVyIHRoZSBibG9jayByZXR1cm5zLlxuICAgICAqIEluc2lkZSBgYmxvY2tgLCBjYWxsIGBzY29wZS5tYW5hZ2VgIG9uIGVhY2ggbGlmZXRpbWUgeW91IGNyZWF0ZSB0byBoYXZlIHRoZSBsaWZldGltZVxuICAgICAqIGF1dG9tYXRpY2FsbHkgZGlzcG9zZWQgYWZ0ZXIgdGhlIGJsb2NrIHJldHVybnMuXG4gICAgICpcbiAgICAgKiBAd2FybmluZyBEbyBub3QgdXNlIHdpdGggYXN5bmMgZnVuY3Rpb25zLiBJbnN0ZWFkLCB1c2UgW1t3aXRoU2NvcGVBc3luY11dLlxuICAgICAqL1xuICAgIHN0YXRpYyB3aXRoU2NvcGUoYmxvY2spIHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBuZXcgU2NvcGUoKTtcbiAgICAgICAgbGV0IGJsb2NrRXJyb3I7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvY2soc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYmxvY2tFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzY29wZUZpbmFsbHkoc2NvcGUsIGJsb2NrRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyB3aXRoU2NvcGVNYXliZUFzeW5jKF90aGlzLCBibG9jaykge1xuICAgICAgICByZXR1cm4gKDAsIGFzeW5jaWZ5X2hlbHBlcnNfMS5tYXliZUFzeW5jKSh1bmRlZmluZWQsIGZ1bmN0aW9uKiAoYXdhaXRlZCkge1xuICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBuZXcgU2NvcGUoKTtcbiAgICAgICAgICAgIGxldCBibG9ja0Vycm9yO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIGF3YWl0ZWQub2YoYmxvY2suY2FsbChfdGhpcywgYXdhaXRlZCwgc2NvcGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGJsb2NrRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNjb3BlRmluYWxseShzY29wZSwgYmxvY2tFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gYGJsb2NrYCB3aXRoIGEgbmV3IFNjb3BlIGluc3RhbmNlIHRoYXQgd2lsbCBiZSBkaXNwb3NlZCBhZnRlciB0aGVcbiAgICAgKiBibG9jaydzIHJldHVybmVkIHByb21pc2Ugc2V0dGxlcy4gSW5zaWRlIGBibG9ja2AsIGNhbGwgYHNjb3BlLm1hbmFnZWAgb24gZWFjaFxuICAgICAqIGxpZmV0aW1lIHlvdSBjcmVhdGUgdG8gaGF2ZSB0aGUgbGlmZXRpbWUgYXV0b21hdGljYWxseSBkaXNwb3NlZCBhZnRlciB0aGVcbiAgICAgKiBibG9jayByZXR1cm5zLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyB3aXRoU2NvcGVBc3luYyhibG9jaykge1xuICAgICAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZSgpO1xuICAgICAgICBsZXQgYmxvY2tFcnJvcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBibG9jayhzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBibG9ja0Vycm9yID0gZXJyb3I7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNjb3BlRmluYWxseShzY29wZSwgYmxvY2tFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJhY2sgYGxpZmV0aW1lYCBzbyB0aGF0IGl0IGlzIGRpc3Bvc2VkIHdoZW4gdGhpcyBzY29wZSBpcyBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBtYW5hZ2UobGlmZXRpbWUpIHtcbiAgICAgICAgdGhpcy5fZGlzcG9zYWJsZXMudmFsdWUuYWRkKGxpZmV0aW1lKTtcbiAgICAgICAgcmV0dXJuIGxpZmV0aW1lO1xuICAgIH1cbiAgICBnZXQgYWxpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwb3NhYmxlcy5hbGl2ZTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgY29uc3QgbGlmZXRpbWVzID0gQXJyYXkuZnJvbSh0aGlzLl9kaXNwb3NhYmxlcy52YWx1ZS52YWx1ZXMoKSkucmV2ZXJzZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGxpZmV0aW1lIG9mIGxpZmV0aW1lcykge1xuICAgICAgICAgICAgaWYgKGxpZmV0aW1lLmFsaXZlKSB7XG4gICAgICAgICAgICAgICAgbGlmZXRpbWUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2FibGVzLmRpc3Bvc2UoKTtcbiAgICB9XG59XG5leHBvcnRzLlNjb3BlID0gU2NvcGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saWZldGltZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTW9kdWxlTWVtb3J5ID0gdm9pZCAwO1xuY29uc3QgbGlmZXRpbWVfMSA9IHJlcXVpcmUoXCIuL2xpZmV0aW1lXCIpO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBNb2R1bGVNZW1vcnkge1xuICAgIGNvbnN0cnVjdG9yKG1vZHVsZSkge1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTtcbiAgICB9XG4gICAgdG9Qb2ludGVyQXJyYXkoaGFuZGxlQXJyYXkpIHtcbiAgICAgICAgY29uc3QgdHlwZWRBcnJheSA9IG5ldyBJbnQzMkFycmF5KGhhbmRsZUFycmF5Lm1hcCgoaGFuZGxlKSA9PiBoYW5kbGUudmFsdWUpKTtcbiAgICAgICAgY29uc3QgbnVtQnl0ZXMgPSB0eXBlZEFycmF5Lmxlbmd0aCAqIHR5cGVkQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMubW9kdWxlLl9tYWxsb2MobnVtQnl0ZXMpO1xuICAgICAgICB2YXIgaGVhcEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5tb2R1bGUuSEVBUFU4LmJ1ZmZlciwgcHRyLCBudW1CeXRlcyk7XG4gICAgICAgIGhlYXBCeXRlcy5zZXQobmV3IFVpbnQ4QXJyYXkodHlwZWRBcnJheS5idWZmZXIpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBsaWZldGltZV8xLkxpZmV0aW1lKHB0ciwgdW5kZWZpbmVkLCAocHRyKSA9PiB0aGlzLm1vZHVsZS5fZnJlZShwdHIpKTtcbiAgICB9XG4gICAgbmV3TXV0YWJsZVBvaW50ZXJBcnJheShsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgemVyb3MgPSBuZXcgSW50MzJBcnJheShuZXcgQXJyYXkobGVuZ3RoKS5maWxsKDApKTtcbiAgICAgICAgY29uc3QgbnVtQnl0ZXMgPSB6ZXJvcy5sZW5ndGggKiB6ZXJvcy5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5tb2R1bGUuX21hbGxvYyhudW1CeXRlcyk7XG4gICAgICAgIGNvbnN0IHR5cGVkQXJyYXkgPSBuZXcgSW50MzJBcnJheSh0aGlzLm1vZHVsZS5IRUFQVTguYnVmZmVyLCBwdHIsIGxlbmd0aCk7XG4gICAgICAgIHR5cGVkQXJyYXkuc2V0KHplcm9zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBsaWZldGltZV8xLkxpZmV0aW1lKHsgdHlwZWRBcnJheSwgcHRyIH0sIHVuZGVmaW5lZCwgKHZhbHVlKSA9PiB0aGlzLm1vZHVsZS5fZnJlZSh2YWx1ZS5wdHIpKTtcbiAgICB9XG4gICAgbmV3SGVhcENoYXJQb2ludGVyKHN0cmluZykge1xuICAgICAgICBjb25zdCBudW1CeXRlcyA9IHRoaXMubW9kdWxlLmxlbmd0aEJ5dGVzVVRGOChzdHJpbmcpICsgMTtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5tb2R1bGUuX21hbGxvYyhudW1CeXRlcyk7XG4gICAgICAgIHRoaXMubW9kdWxlLnN0cmluZ1RvVVRGOChzdHJpbmcsIHB0ciwgbnVtQnl0ZXMpO1xuICAgICAgICByZXR1cm4gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUocHRyLCB1bmRlZmluZWQsICh2YWx1ZSkgPT4gdGhpcy5tb2R1bGUuX2ZyZWUodmFsdWUpKTtcbiAgICB9XG4gICAgY29uc3VtZUhlYXBDaGFyUG9pbnRlcihwdHIpIHtcbiAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5tb2R1bGUuVVRGOFRvU3RyaW5nKHB0cik7XG4gICAgICAgIHRoaXMubW9kdWxlLl9mcmVlKHB0cik7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxufVxuZXhwb3J0cy5Nb2R1bGVNZW1vcnkgPSBNb2R1bGVNZW1vcnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlF1aWNrSlNBc3luY1dBU01Nb2R1bGUgPSB2b2lkIDA7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuL2Vycm9yc1wiKTtcbmNvbnN0IGxpZmV0aW1lXzEgPSByZXF1aXJlKFwiLi9saWZldGltZVwiKTtcbmNvbnN0IG1vZHVsZV8xID0gcmVxdWlyZShcIi4vbW9kdWxlXCIpO1xuY29uc3QgcnVudGltZV9hc3luY2lmeV8xID0gcmVxdWlyZShcIi4vcnVudGltZS1hc3luY2lmeVwiKTtcbi8qKlxuICogQXN5bmNpZmllZCB2ZXJzaW9uIG9mIFtbUXVpY2tKU1dBU01Nb2R1bGVdXS5cbiAqXG4gKiBEdWUgdG8gbGltaXRhdGlvbnMgb2YgRW1zY3JpcHRlbidzIEFTWU5DSUZZIHByb2Nlc3MsIG9ubHkgYSBzaW5nbGUgYXN5bmNcbiAqIGZ1bmN0aW9uIGNhbGwgY2FuIGhhcHBlbiBhdCBhIHRpbWUgYWNyb3NzIHRoZSBlbnRpcmUgV2ViQXNzZW1ibHkgbW9kdWxlLlxuICpcbiAqIFRoYXQgbWVhbnMgdGhhdCBhbGwgcnVudGltZXMsIGNvbnRleHRzLCBmdW5jdGlvbnMsIGV0YyBjcmVhdGVkIGluc2lkZSB0aGlzXG4gKiBXZWJBc3NlbWJseSBhcmUgbGltaXRlZCB0byBhIHNpbmdsZSBjb25jdXJyZW50IGFzeW5jIGFjdGlvbi5cbiAqICoqTXVsdGlwbGUgY29uY3VycmVudCBhc3luYyBhY3Rpb25zIGlzIGFuIGVycm9yLioqXG4gKlxuICogVG8gYWxsb3cgZm9yIG11bHRpcGxlIGNvbmN1cnJlbnQgYXN5bmMgYWN0aW9ucywgeW91IG11c3QgY3JlYXRlIG11bHRpcGxlIFdlYkFzc2VtYmx5XG4gKiBtb2R1bGVzLlxuICovXG5jbGFzcyBRdWlja0pTQXN5bmNXQVNNTW9kdWxlIGV4dGVuZHMgbW9kdWxlXzEuUXVpY2tKU1dBU01Nb2R1bGUge1xuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGNvbnN0cnVjdG9yKG1vZHVsZSwgZmZpKSB7XG4gICAgICAgIHN1cGVyKG1vZHVsZSwgZmZpKTtcbiAgICAgICAgdGhpcy5mZmkgPSBmZmk7XG4gICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgYXN5bmMgcnVudGltZSBpbnNpZGUgdGhpcyBXZWJBc3NlbWJseSBtb2R1bGUuIEFsbCBydW50aW1lcyBpbnNpZGUgYVxuICAgICAqIG1vZHVsZSBhcmUgbGltaXRlZCB0byBhIHNpbmdsZSBhc3luYyBjYWxsIGF0IGEgdGltZS4gRm9yIG11bHRpcGxlXG4gICAgICogY29uY3VycmVudCBhc3luYyBhY3Rpb25zLCBjcmVhdGUgbXVsdGlwbGUgV2ViQXNzZW1ibHkgbW9kdWxlcy5cbiAgICAgKi9cbiAgICBuZXdSdW50aW1lKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBydCA9IG5ldyBsaWZldGltZV8xLkxpZmV0aW1lKHRoaXMuZmZpLlFUU19OZXdSdW50aW1lKCksIHVuZGVmaW5lZCwgKHJ0X3B0cikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3MuZGVsZXRlUnVudGltZShydF9wdHIpO1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX0ZyZWVSdW50aW1lKHJ0X3B0cik7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBydW50aW1lID0gbmV3IHJ1bnRpbWVfYXN5bmNpZnlfMS5RdWlja0pTQXN5bmNSdW50aW1lKHtcbiAgICAgICAgICAgIG1vZHVsZTogdGhpcy5tb2R1bGUsXG4gICAgICAgICAgICBmZmk6IHRoaXMuZmZpLFxuICAgICAgICAgICAgcnQsXG4gICAgICAgICAgICBjYWxsYmFja3M6IHRoaXMuY2FsbGJhY2tzLFxuICAgICAgICB9KTtcbiAgICAgICAgKDAsIG1vZHVsZV8xLmFwcGx5QmFzZVJ1bnRpbWVPcHRpb25zKShydW50aW1lLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKG9wdGlvbnMubW9kdWxlTG9hZGVyKSB7XG4gICAgICAgICAgICBydW50aW1lLnNldE1vZHVsZUxvYWRlcihvcHRpb25zLm1vZHVsZUxvYWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJ1bnRpbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2ltcGxpZmllZCBBUEkgdG8gY3JlYXRlIGEgbmV3IFtbUXVpY2tKU1J1bnRpbWVdXSBhbmQgYVxuICAgICAqIFtbUXVpY2tKU0NvbnRleHRdXSBpbnNpZGUgdGhhdCBydW50aW1lIGF0IHRoZSBzYW1lIHRpbWUuIFRoZSBydW50aW1lIHdpbGxcbiAgICAgKiBiZSBkaXNwb3NlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIG5ld0NvbnRleHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLm5ld1J1bnRpbWUoKTtcbiAgICAgICAgY29uc3QgbGlmZXRpbWVzID0gb3B0aW9ucy5vd25lZExpZmV0aW1lcyA/IG9wdGlvbnMub3duZWRMaWZldGltZXMuY29uY2F0KFtydW50aW1lXSkgOiBbcnVudGltZV07XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBydW50aW1lLm5ld0NvbnRleHQoeyAuLi5vcHRpb25zLCBvd25lZExpZmV0aW1lczogbGlmZXRpbWVzIH0pO1xuICAgICAgICBydW50aW1lLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG4gICAgLyoqIFN5bmNocm9ub3VzIGV2YWxDb2RlIGlzIG5vdCBzdXBwb3J0ZWQuICovXG4gICAgZXZhbENvZGUoKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTTm90SW1wbGVtZW50ZWQoXCJRdWlja0pTV0FTTU1vZHVsZUFzeW5jaWZ5LmV2YWxDb2RlOiB1c2UgZXZhbENvZGVBc3luYyBpbnN0ZWFkXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbmUtb2ZmIGV2YWx1YXRlIGNvZGUgd2l0aG91dCBuZWVkaW5nIHRvIGNyZWF0ZSBhIFtbUXVpY2tKU1J1bnRpbWVBc3luY11dIG9yXG4gICAgICogW1tRdWlja0pTQ29udGV4dFN5bmNdXSBleHBsaWNpdGx5LlxuICAgICAqXG4gICAgICogVGhpcyB2ZXJzaW9uIGFsbG93cyBmb3IgYXN5bmNocm9ub3VzIEVjbWFzY3JpcHQgbW9kdWxlIGxvYWRpbmcuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgb25seSBhIHNpbmdsZSBhc3luYyBhY3Rpb24gY2FuIG9jY3VyIGF0IGEgdGltZSBpbnNpZGUgdGhlIGVudGlyZSBXZWJBc3NlbWJseSBtb2R1bGUuXG4gICAgICogKipNdWx0aXBsZSBjb25jdXJyZW50IGFzeW5jIGFjdGlvbnMgaXMgYW4gZXJyb3IuKipcbiAgICAgKlxuICAgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgW1tRdWlja0pTV0FTTU1vZHVsZS5ldmFsQ29kZV1dIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgZXZhbENvZGVBc3luYyhjb2RlLCBvcHRpb25zKSB7XG4gICAgICAgIC8vIFRPRE86IHdlIHNob3VsZCByZWFsbHkgZmlndXJlIG91dCBnZW5lcmF0b3IgZm9yIHRoZSBQcm9taXNlIG1vbmFkLi4uXG4gICAgICAgIHJldHVybiBsaWZldGltZV8xLlNjb3BlLndpdGhTY29wZUFzeW5jKGFzeW5jIChzY29wZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgdm0gPSBzY29wZS5tYW5hZ2UodGhpcy5uZXdDb250ZXh0KCkpO1xuICAgICAgICAgICAgKDAsIG1vZHVsZV8xLmFwcGx5TW9kdWxlRXZhbFJ1bnRpbWVPcHRpb25zKSh2bS5ydW50aW1lLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZtLmV2YWxDb2RlQXN5bmMoY29kZSwgXCJldmFsLmpzXCIpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubWVtb3J5TGltaXRCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG1lbW9yeSBsaW1pdCBzbyB3ZSBjYW4gZHVtcCB0aGUgcmVzdWx0IHdpdGhvdXQgZXhjZWVkaW5nIGl0LlxuICAgICAgICAgICAgICAgIHZtLnJ1bnRpbWUuc2V0TWVtb3J5TGltaXQoLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdm0uZHVtcChzY29wZS5tYW5hZ2UocmVzdWx0LmVycm9yKSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZtLmR1bXAoc2NvcGUubWFuYWdlKHJlc3VsdC52YWx1ZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNBc3luY1dBU01Nb2R1bGUgPSBRdWlja0pTQXN5bmNXQVNNTW9kdWxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW9kdWxlLWFzeW5jaWZ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UZXN0UXVpY2tKU1dBU01Nb2R1bGUgPSB2b2lkIDA7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuL2Vycm9yc1wiKTtcbmNvbnN0IGxpZmV0aW1lXzEgPSByZXF1aXJlKFwiLi9saWZldGltZVwiKTtcbi8qKlxuICogQSB0ZXN0IHdyYXBwZXIgb2YgW1tRdWlja0pTV0FTTU1vZHVsZV1dIHRoYXQga2VlcHMgYSByZWZlcmVuY2UgdG8gZWFjaFxuICogY29udGV4dCBvciBydW50aW1lIGNyZWF0ZWQuXG4gKlxuICogQ2FsbCBbW2Rpc3Bvc2VBbGxdXSB0byByZXNldCB0aGVzZSBzZXRzIGFuZCBjYWxscyBgZGlzcG9zZWAgb24gYW55IGxlZnQgYWxpdmVcbiAqICh3aGljaCBtYXkgdGhyb3cgYW4gZXJyb3IpLlxuICpcbiAqIENhbGwgW1thc3NlcnROb01lbW9yeUFsbG9jYXRlZF1dIGF0IHRoZSBlbmQgb2YgYSB0ZXN0LCB3aGVuIHlvdSBleHBlY3QgdGhhdCB5b3UndmVcbiAqIGZyZWVkIGFsbCB0aGUgbWVtb3J5IHlvdSd2ZSBldmVyIGFsbG9jYXRlZC5cbiAqL1xuY2xhc3MgVGVzdFF1aWNrSlNXQVNNTW9kdWxlIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuY29udGV4dHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMucnVudGltZXMgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIG5ld1J1bnRpbWUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBydW50aW1lID0gdGhpcy5wYXJlbnQubmV3UnVudGltZSh7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgb3duZWRMaWZldGltZXM6IFtcbiAgICAgICAgICAgICAgICBuZXcgbGlmZXRpbWVfMS5MaWZldGltZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgKCkgPT4gdGhpcy5ydW50aW1lcy5kZWxldGUocnVudGltZSkpLFxuICAgICAgICAgICAgICAgIC4uLihvcHRpb25zPy5vd25lZExpZmV0aW1lcyA/PyBbXSksXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ydW50aW1lcy5hZGQocnVudGltZSk7XG4gICAgICAgIHJldHVybiBydW50aW1lO1xuICAgIH1cbiAgICBuZXdDb250ZXh0KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMucGFyZW50Lm5ld0NvbnRleHQoe1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIG93bmVkTGlmZXRpbWVzOiBbXG4gICAgICAgICAgICAgICAgbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUodW5kZWZpbmVkLCB1bmRlZmluZWQsICgpID0+IHRoaXMuY29udGV4dHMuZGVsZXRlKGNvbnRleHQpKSxcbiAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucz8ub3duZWRMaWZldGltZXMgPz8gW10pLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udGV4dHMuYWRkKGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG4gICAgZXZhbENvZGUoY29kZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZXZhbENvZGUoY29kZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGRpc3Bvc2VBbGwoKSB7XG4gICAgICAgIGNvbnN0IGFsbERpc3Bvc2FibGVzID0gWy4uLnRoaXMuY29udGV4dHMsIC4uLnRoaXMucnVudGltZXNdO1xuICAgICAgICB0aGlzLnJ1bnRpbWVzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuY29udGV4dHMuY2xlYXIoKTtcbiAgICAgICAgYWxsRGlzcG9zYWJsZXMuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGQuYWxpdmUpIHtcbiAgICAgICAgICAgICAgICBkLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzc2VydE5vTWVtb3J5QWxsb2NhdGVkKCkge1xuICAgICAgICBjb25zdCBsZWFrc0RldGVjdGVkID0gdGhpcy5nZXRGRkkoKS5RVFNfUmVjb3ZlcmFibGVMZWFrQ2hlY2soKTtcbiAgICAgICAgaWYgKGxlYWtzRGV0ZWN0ZWQpIHtcbiAgICAgICAgICAgIC8vIE5vdGU6IHRoaXMgaXMgY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIHdoZW4gYnVpbGRpbmcgZnJvbSBzb3VyY2VcbiAgICAgICAgICAgIC8vIHdpdGggZGVidWcgYnVpbGRzLlxuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQoXCJMZWFrIHNhbml0aXplciBkZXRlY3RlZCB1bi1mcmVlZCBtZW1vcnlcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGV4dHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTTWVtb3J5TGVha0RldGVjdGVkKGAke3RoaXMuY29udGV4dHMuc2l6ZX0gY29udGV4dHMgbGVha2VkYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucnVudGltZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTTWVtb3J5TGVha0RldGVjdGVkKGAke3RoaXMucnVudGltZXMuc2l6ZX0gcnVudGltZXMgbGVha2VkYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0RkZJKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0RkZJKCk7XG4gICAgfVxufVxuZXhwb3J0cy5UZXN0UXVpY2tKU1dBU01Nb2R1bGUgPSBUZXN0UXVpY2tKU1dBU01Nb2R1bGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2R1bGUtdGVzdC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU1dBU01Nb2R1bGUgPSBleHBvcnRzLmFwcGx5TW9kdWxlRXZhbFJ1bnRpbWVPcHRpb25zID0gZXhwb3J0cy5hcHBseUJhc2VSdW50aW1lT3B0aW9ucyA9IGV4cG9ydHMuUXVpY2tKU01vZHVsZUNhbGxiYWNrcyA9IHZvaWQgMDtcbmNvbnN0IGRlYnVnXzEgPSByZXF1aXJlKFwiLi9kZWJ1Z1wiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuY29uc3QgbGlmZXRpbWVfMSA9IHJlcXVpcmUoXCIuL2xpZmV0aW1lXCIpO1xuY29uc3QgcnVudGltZV8xID0gcmVxdWlyZShcIi4vcnVudGltZVwiKTtcbmNvbnN0IHR5cGVzXzEgPSByZXF1aXJlKFwiLi90eXBlc1wiKTtcbmNsYXNzIFF1aWNrSlNFbXNjcmlwdGVuTW9kdWxlQ2FsbGJhY2tzIHtcbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIHRoaXMuY2FsbEZ1bmN0aW9uID0gYXJncy5jYWxsRnVuY3Rpb247XG4gICAgICAgIHRoaXMuc2hvdWxkSW50ZXJydXB0ID0gYXJncy5zaG91bGRJbnRlcnJ1cHQ7XG4gICAgICAgIHRoaXMubG9hZE1vZHVsZVNvdXJjZSA9IGFyZ3MubG9hZE1vZHVsZVNvdXJjZTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVNb2R1bGUgPSBhcmdzLm5vcm1hbGl6ZU1vZHVsZTtcbiAgICB9XG59XG4vKipcbiAqIFdlIHVzZSBzdGF0aWMgZnVuY3Rpb25zIHBlciBtb2R1bGUgdG8gZGlzcGF0Y2ggcnVudGltZSBvciBjb250ZXh0IGNhbGxzIGZyb21cbiAqIEMgdG8gdGhlIGhvc3QuICBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGluZGlyZWN0aW9uIGZyb20gYSBzcGVjaWZpYyBydW50aW1lIG9yXG4gKiBjb250ZXh0IHBvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrIGhhbmRsZXIuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgUXVpY2tKU01vZHVsZUNhbGxiYWNrcyB7XG4gICAgY29uc3RydWN0b3IobW9kdWxlKSB7XG4gICAgICAgIHRoaXMuY29udGV4dENhbGxiYWNrcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5ydW50aW1lQ2FsbGJhY2tzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnN1c3BlbmRlZENvdW50ID0gMDtcbiAgICAgICAgdGhpcy5jVG9Ib3N0Q2FsbGJhY2tzID0gbmV3IFF1aWNrSlNFbXNjcmlwdGVuTW9kdWxlQ2FsbGJhY2tzKHtcbiAgICAgICAgICAgIGNhbGxGdW5jdGlvbjogKGFzeW5jaWZ5LCBjdHgsIHRoaXNfcHRyLCBhcmdjLCBhcmd2LCBmbl9pZCkgPT4gdGhpcy5oYW5kbGVBc3luY2lmeShhc3luY2lmeSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZtID0gdGhpcy5jb250ZXh0Q2FsbGJhY2tzLmdldChjdHgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1aWNrSlNDb250ZXh0KGN0eCA9ICR7Y3R4fSkgbm90IGZvdW5kIGZvciBDIGZ1bmN0aW9uIGNhbGwgXCIke2ZuX2lkfVwiYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZtLmNhbGxGdW5jdGlvbihjdHgsIHRoaXNfcHRyLCBhcmdjLCBhcmd2LCBmbl9pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0MgdG8gaG9zdCBlcnJvcjogcmV0dXJuaW5nIG51bGxdXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzaG91bGRJbnRlcnJ1cHQ6IChhc3luY2lmeSwgcnQpID0+IHRoaXMuaGFuZGxlQXN5bmNpZnkoYXN5bmNpZnksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2bSA9IHRoaXMucnVudGltZUNhbGxiYWNrcy5nZXQocnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1aWNrSlNSdW50aW1lKHJ0ID0gJHtydH0pIG5vdCBmb3VuZCBmb3IgQyBpbnRlcnJ1cHRgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm0uc2hvdWxkSW50ZXJydXB0KHJ0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQyB0byBob3N0IGludGVycnVwdDogcmV0dXJuaW5nIGVycm9yXVwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbG9hZE1vZHVsZVNvdXJjZTogKGFzeW5jaWZ5LCBydCwgY3R4LCBtb2R1bGVOYW1lKSA9PiB0aGlzLmhhbmRsZUFzeW5jaWZ5KGFzeW5jaWZ5LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVudGltZUNhbGxiYWNrcyA9IHRoaXMucnVudGltZUNhbGxiYWNrcy5nZXQocnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bnRpbWVDYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVpY2tKU1J1bnRpbWUocnQgPSAke3J0fSkgbm90IGZvdW5kIGZvciBDIG1vZHVsZSBsb2FkZXJgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkTW9kdWxlID0gcnVudGltZUNhbGxiYWNrcy5sb2FkTW9kdWxlU291cmNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxvYWRNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVpY2tKU1J1bnRpbWUocnQgPSAke3J0fSkgZG9lcyBub3Qgc3VwcG9ydCBtb2R1bGUgbG9hZGluZ2ApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2FkTW9kdWxlKHJ0LCBjdHgsIG1vZHVsZU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltDIHRvIGhvc3QgbW9kdWxlIGxvYWRlciBlcnJvcjogcmV0dXJuaW5nIG51bGxdXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBub3JtYWxpemVNb2R1bGU6IChhc3luY2lmeSwgcnQsIGN0eCwgbW9kdWxlQmFzZU5hbWUsIG1vZHVsZU5hbWUpID0+IHRoaXMuaGFuZGxlQXN5bmNpZnkoYXN5bmNpZnksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBydW50aW1lQ2FsbGJhY2tzID0gdGhpcy5ydW50aW1lQ2FsbGJhY2tzLmdldChydCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcnVudGltZUNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWlja0pTUnVudGltZShydCA9ICR7cnR9KSBub3QgZm91bmQgZm9yIEMgbW9kdWxlIGxvYWRlcmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZU1vZHVsZSA9IHJ1bnRpbWVDYWxsYmFja3Mubm9ybWFsaXplTW9kdWxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vcm1hbGl6ZU1vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWlja0pTUnVudGltZShydCA9ICR7cnR9KSBkb2VzIG5vdCBzdXBwb3J0IG1vZHVsZSBsb2FkaW5nYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZU1vZHVsZShydCwgY3R4LCBtb2R1bGVCYXNlTmFtZSwgbW9kdWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0MgdG8gaG9zdCBtb2R1bGUgbG9hZGVyIGVycm9yOiByZXR1cm5pbmcgbnVsbF1cIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlO1xuICAgICAgICB0aGlzLm1vZHVsZS5jYWxsYmFja3MgPSB0aGlzLmNUb0hvc3RDYWxsYmFja3M7XG4gICAgfVxuICAgIHNldFJ1bnRpbWVDYWxsYmFja3MocnQsIGNhbGxiYWNrcykge1xuICAgICAgICB0aGlzLnJ1bnRpbWVDYWxsYmFja3Muc2V0KHJ0LCBjYWxsYmFja3MpO1xuICAgIH1cbiAgICBkZWxldGVSdW50aW1lKHJ0KSB7XG4gICAgICAgIHRoaXMucnVudGltZUNhbGxiYWNrcy5kZWxldGUocnQpO1xuICAgIH1cbiAgICBzZXRDb250ZXh0Q2FsbGJhY2tzKGN0eCwgY2FsbGJhY2tzKSB7XG4gICAgICAgIHRoaXMuY29udGV4dENhbGxiYWNrcy5zZXQoY3R4LCBjYWxsYmFja3MpO1xuICAgIH1cbiAgICBkZWxldGVDb250ZXh0KGN0eCkge1xuICAgICAgICB0aGlzLmNvbnRleHRDYWxsYmFja3MuZGVsZXRlKGN0eCk7XG4gICAgfVxuICAgIGhhbmRsZUFzeW5jaWZ5KGFzeW5jaWZ5LCBmbikge1xuICAgICAgICBpZiAoYXN5bmNpZnkpIHtcbiAgICAgICAgICAgIC8vIFdlIG11c3QgYWx3YXlzIGNhbGwgYXN5bmNpZnkuaGFuZGxlU3luYyBhcm91bmQgb3VyIGZ1bmN0aW9uLlxuICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgYXN5bmNpZnkgdG8gcmVzdW1lIHN1c3BlbmRlZCBleGVjdXRpb24gb24gdGhlIHNlY29uZCBjYWxsLlxuICAgICAgICAgICAgLy8gQXN5bmNpZnkgaW50ZXJuYWxseSBjYW4gZGV0ZWN0IHN5bmMgYmVoYXZpb3IsIGFuZCBhdm9pZCBzdXNwZW5kaW5nLlxuICAgICAgICAgICAgcmV0dXJuIGFzeW5jaWZ5LmhhbmRsZVNsZWVwKChkb25lKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICgwLCBkZWJ1Z18xLmRlYnVnTG9nKShcImFzeW5jaWZ5LmhhbmRsZVNsZWVwOiBub3Qgc3VzcGVuZGluZzpcIiwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJcyBwcm9taXNlLCB3ZSBpbnRlbmQgdG8gc3VzcGVuZC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3VzcGVuZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuUXVpY2tKU0FzeW5jaWZ5RXJyb3IoYEFscmVhZHkgc3VzcGVuZGVkIGF0OiAke3RoaXMuc3VzcGVuZGVkLnN0YWNrfVxcbkF0dGVtcHRlZCB0byBzdXNwZW5kIGF0OmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWQgPSBuZXcgZXJyb3JzXzEuUXVpY2tKU0FzeW5jaWZ5U3VzcGVuZGVkKGAoJHt0aGlzLnN1c3BlbmRlZENvdW50Kyt9KWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwiYXN5bmNpZnkuaGFuZGxlU2xlZXA6IHN1c3BlbmRpbmc6XCIsIHRoaXMuc3VzcGVuZGVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlbigocmVzb2x2ZWRSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VzcGVuZGVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwiYXN5bmNpZnkuaGFuZGxlU2xlZXA6IHJlc29sdmVkOlwiLCByZXNvbHZlZFJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKHJlc29sdmVkUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJhc3luY2lmeS5oYW5kbGVTbGVlcDogcmVqZWN0ZWQ6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJRdWlja0pTOiBjYW5ub3QgaGFuZGxlIGVycm9yIGluIHN1c3BlbmRlZCBmdW5jdGlvblwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1c3BlbmRlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJhc3luY2lmeS5oYW5kbGVTbGVlcDogZXJyb3I6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGFzeW5jaWZ5IC0gd2Ugc2hvdWxkIG5ldmVyIHJldHVybiBhIHByb21pc2UuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZm4oKTtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvbWlzZSByZXR1cm4gdmFsdWUgbm90IHN1cHBvcnRlZCBpbiBub24tYXN5bmNpZnkgY29udGV4dC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU01vZHVsZUNhbGxiYWNrcyA9IFF1aWNrSlNNb2R1bGVDYWxsYmFja3M7XG4vKipcbiAqIFByb2Nlc3MgUnVudGltZU9wdGlvbnMgYW5kIGFwcGx5IHRoZW0gdG8gYSBRdWlja0pTUnVudGltZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5QmFzZVJ1bnRpbWVPcHRpb25zKHJ1bnRpbWUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5pbnRlcnJ1cHRIYW5kbGVyKSB7XG4gICAgICAgIHJ1bnRpbWUuc2V0SW50ZXJydXB0SGFuZGxlcihvcHRpb25zLmludGVycnVwdEhhbmRsZXIpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5tYXhTdGFja1NpemVCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJ1bnRpbWUuc2V0TWF4U3RhY2tTaXplKG9wdGlvbnMubWF4U3RhY2tTaXplQnl0ZXMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5tZW1vcnlMaW1pdEJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcnVudGltZS5zZXRNZW1vcnlMaW1pdChvcHRpb25zLm1lbW9yeUxpbWl0Qnl0ZXMpO1xuICAgIH1cbn1cbmV4cG9ydHMuYXBwbHlCYXNlUnVudGltZU9wdGlvbnMgPSBhcHBseUJhc2VSdW50aW1lT3B0aW9ucztcbi8qKlxuICogUHJvY2VzcyBNb2R1bGVFdmFsT3B0aW9ucyBhbmQgYXBwbHkgdGhlbSB0byBhIFF1aWNrSlNSdW50aW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYXBwbHlNb2R1bGVFdmFsUnVudGltZU9wdGlvbnMocnVudGltZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLm1vZHVsZUxvYWRlcikge1xuICAgICAgICBydW50aW1lLnNldE1vZHVsZUxvYWRlcihvcHRpb25zLm1vZHVsZUxvYWRlcik7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNob3VsZEludGVycnVwdCkge1xuICAgICAgICBydW50aW1lLnNldEludGVycnVwdEhhbmRsZXIob3B0aW9ucy5zaG91bGRJbnRlcnJ1cHQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5tZW1vcnlMaW1pdEJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcnVudGltZS5zZXRNZW1vcnlMaW1pdChvcHRpb25zLm1lbW9yeUxpbWl0Qnl0ZXMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5tYXhTdGFja1NpemVCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJ1bnRpbWUuc2V0TWF4U3RhY2tTaXplKG9wdGlvbnMubWF4U3RhY2tTaXplQnl0ZXMpO1xuICAgIH1cbn1cbmV4cG9ydHMuYXBwbHlNb2R1bGVFdmFsUnVudGltZU9wdGlvbnMgPSBhcHBseU1vZHVsZUV2YWxSdW50aW1lT3B0aW9ucztcbi8qKlxuICogVGhpcyBjbGFzcyBwcmVzZW50cyBhIEphdmFzY3JpcHQgaW50ZXJmYWNlIHRvIFF1aWNrSlMsIGEgSmF2YXNjcmlwdCBpbnRlcnByZXRlclxuICogdGhhdCBzdXBwb3J0cyBFY21hU2NyaXB0IDIwMjAgKEVTMjAyMCkuXG4gKlxuICogSXQgd3JhcHMgYSBzaW5nbGUgV2ViQXNzZW1ibHkgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIFF1aWNrSlMgbGlicmFyeSBhbmRcbiAqIGFzc29jaWF0ZWQgaGVscGVyIEMgY29kZS4gV2ViQXNzZW1ibHkgbW9kdWxlcyBhcmUgY29tcGxldGVseSBpc29sYXRlZCBmcm9tXG4gKiBlYWNoIG90aGVyIGJ5IHRoZSBob3N0J3MgV2ViQXNzZW1ibHkgcnVudGltZS4gU2VwYXJhdGUgV2ViQXNzZW1ibHkgbW9kdWxlc1xuICogaGF2ZSB0aGUgbW9zdCBpc29sYXRpb24gZ3VhcmFudGVlcyBwb3NzaWJsZSB3aXRoIHRoaXMgbGlicmFyeS5cbiAqXG4gKiBUaGUgc2ltcGxlc3Qgd2F5IHRvIHN0YXJ0IHJ1bm5pbmcgY29kZSBpcyB7QGxpbmsgZXZhbENvZGV9LiBUaGlzIHNob3J0Y3V0XG4gKiBtZXRob2Qgd2lsbCBldmFsdWF0ZSBKYXZhc2NyaXB0IHNhZmVseSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBuYXRpdmVcbiAqIEphdmFzY3JpcHQgdmFsdWUuXG4gKlxuICogRm9yIG1vcmUgY29udHJvbCBvdmVyIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQsIG9yIHRvIGludGVyYWN0IHdpdGggdmFsdWVzXG4gKiBpbnNpZGUgUXVpY2tKUywgY3JlYXRlIGEgY29udGV4dCB3aXRoIHtAbGluayBuZXdDb250ZXh0fSBvciBhIHJ1bnRpbWUgd2l0aFxuICoge0BsaW5rIG5ld1J1bnRpbWV9LlxuICovXG5jbGFzcyBRdWlja0pTV0FTTU1vZHVsZSB7XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgY29uc3RydWN0b3IobW9kdWxlLCBmZmkpIHtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGU7XG4gICAgICAgIHRoaXMuZmZpID0gZmZpO1xuICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBRdWlja0pTTW9kdWxlQ2FsbGJhY2tzKG1vZHVsZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHJ1bnRpbWUuXG4gICAgICogVXNlIHRoZSBydW50aW1lIHRvIHNldCBsaW1pdHMgb24gQ1BVIGFuZCBtZW1vcnkgdXNhZ2UgYW5kIGNvbmZpZ3VyZSBtb2R1bGVcbiAgICAgKiBsb2FkaW5nIGZvciBvbmUgb3IgbW9yZSBbW1F1aWNrSlNDb250ZXh0XV1zIGluc2lkZSB0aGUgcnVudGltZS5cbiAgICAgKi9cbiAgICBuZXdSdW50aW1lKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBydCA9IG5ldyBsaWZldGltZV8xLkxpZmV0aW1lKHRoaXMuZmZpLlFUU19OZXdSdW50aW1lKCksIHVuZGVmaW5lZCwgKHJ0X3B0cikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3MuZGVsZXRlUnVudGltZShydF9wdHIpO1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX0ZyZWVSdW50aW1lKHJ0X3B0cik7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBydW50aW1lID0gbmV3IHJ1bnRpbWVfMS5RdWlja0pTUnVudGltZSh7XG4gICAgICAgICAgICBtb2R1bGU6IHRoaXMubW9kdWxlLFxuICAgICAgICAgICAgY2FsbGJhY2tzOiB0aGlzLmNhbGxiYWNrcyxcbiAgICAgICAgICAgIGZmaTogdGhpcy5mZmksXG4gICAgICAgICAgICBydCxcbiAgICAgICAgfSk7XG4gICAgICAgIGFwcGx5QmFzZVJ1bnRpbWVPcHRpb25zKHJ1bnRpbWUsIG9wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucy5tb2R1bGVMb2FkZXIpIHtcbiAgICAgICAgICAgIHJ1bnRpbWUuc2V0TW9kdWxlTG9hZGVyKG9wdGlvbnMubW9kdWxlTG9hZGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnVudGltZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzaW1wbGlmaWVkIEFQSSB0byBjcmVhdGUgYSBuZXcgW1tRdWlja0pTUnVudGltZV1dIGFuZCBhXG4gICAgICogW1tRdWlja0pTQ29udGV4dF1dIGluc2lkZSB0aGF0IHJ1bnRpbWUgYXQgdGhlIHNhbWUgdGltZS4gVGhlIHJ1bnRpbWUgd2lsbFxuICAgICAqIGJlIGRpc3Bvc2VkIHdoZW4gdGhlIGNvbnRleHQgaXMgZGlzcG9zZWQuXG4gICAgICovXG4gICAgbmV3Q29udGV4dChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgcnVudGltZSA9IHRoaXMubmV3UnVudGltZSgpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gcnVudGltZS5uZXdDb250ZXh0KHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBvd25lZExpZmV0aW1lczogKDAsIHR5cGVzXzEuY29uY2F0KShydW50aW1lLCBvcHRpb25zLm93bmVkTGlmZXRpbWVzKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJ1bnRpbWUuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbmUtb2ZmIGV2YWx1YXRlIGNvZGUgd2l0aG91dCBuZWVkaW5nIHRvIGNyZWF0ZSBhIFtbUXVpY2tKU1J1bnRpbWVdXSBvclxuICAgICAqIFtbUXVpY2tKU0NvbnRleHRdXSBleHBsaWNpdGx5LlxuICAgICAqXG4gICAgICogVG8gcHJvdGVjdCBhZ2FpbnN0IGluZmluaXRlIGxvb3BzLCB1c2UgdGhlIGBzaG91bGRJbnRlcnJ1cHRgIG9wdGlvbi4gVGhlXG4gICAgICogW1tzaG91bGRJbnRlcnJ1cHRBZnRlckRlYWRsaW5lXV0gZnVuY3Rpb24gd2lsbCBjcmVhdGUgYSB0aW1lLWJhc2VkIGRlYWRsaW5lLlxuICAgICAqXG4gICAgICogSWYgeW91IG5lZWQgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb2RlIGV4ZWN1dGVzLCBjcmVhdGUgYVxuICAgICAqIFtbUXVpY2tKU1J1bnRpbWVdXSAod2l0aCBbW25ld1J1bnRpbWVdXSkgb3IgYSBbW1F1aWNrSlNDb250ZXh0XV0gKHdpdGhcbiAgICAgKiBbW25ld0NvbnRleHRdXSBvciBbW1F1aWNrSlNSdW50aW1lLm5ld0NvbnRleHRdXSksIGFuZCB1c2UgaXRzXG4gICAgICogW1tRdWlja0pTQ29udGV4dC5ldmFsQ29kZV1dIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEFzeW5jaHJvbm91cyBjYWxsYmFja3MgbWF5IG5vdCBydW4gZHVyaW5nIHRoZSBmaXJzdCBjYWxsIHRvIGBldmFsQ29kZWAuIElmXG4gICAgICogeW91IG5lZWQgdG8gd29yayB3aXRoIGFzeW5jIGNvZGUgaW5zaWRlIFF1aWNrSlMsIGNyZWF0ZSBhIHJ1bnRpbWUgYW5kIHVzZVxuICAgICAqIFtbUXVpY2tKU1J1bnRpbWUuZXhlY3V0ZVBlbmRpbmdKb2JzXV0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IGlzIGNvZXJjZWQgdG8gYSBuYXRpdmUgSmF2YXNjcmlwdCB2YWx1ZSB1c2luZyBKU09OXG4gICAgICogc2VyaWFsaXphdGlvbiwgc28gcHJvcGVydGllcyBhbmQgdmFsdWVzIHVuc3VwcG9ydGVkIGJ5IEpTT04gd2lsbCBiZSBkcm9wcGVkLlxuICAgICAqXG4gICAgICogQHRocm93cyBJZiBgY29kZWAgdGhyb3dzIGR1cmluZyBldmFsdWF0aW9uLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmVcbiAgICAgKiBjb252ZXJ0ZWQgaW50byBhIG5hdGl2ZSBKYXZhc2NyaXB0IHZhbHVlIGFuZCB0aHJvd24uXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIGlmIGBvcHRpb25zLnNob3VsZEludGVycnVwdGAgaW50ZXJydXB0ZWQgZXhlY3V0aW9uLCB3aWxsIHRocm93IGEgRXJyb3JcbiAgICAgKiB3aXRoIG5hbWUgYFwiSW50ZXJuYWxFcnJvclwiYCBhbmQgIG1lc3NhZ2UgYFwiaW50ZXJydXB0ZWRcImAuXG4gICAgICovXG4gICAgZXZhbENvZGUoY29kZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBsaWZldGltZV8xLlNjb3BlLndpdGhTY29wZSgoc2NvcGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZtID0gc2NvcGUubWFuYWdlKHRoaXMubmV3Q29udGV4dCgpKTtcbiAgICAgICAgICAgIGFwcGx5TW9kdWxlRXZhbFJ1bnRpbWVPcHRpb25zKHZtLnJ1bnRpbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdm0uZXZhbENvZGUoY29kZSwgXCJldmFsLmpzXCIpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubWVtb3J5TGltaXRCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG1lbW9yeSBsaW1pdCBzbyB3ZSBjYW4gZHVtcCB0aGUgcmVzdWx0IHdpdGhvdXQgZXhjZWVkaW5nIGl0LlxuICAgICAgICAgICAgICAgIHZtLnJ1bnRpbWUuc2V0TWVtb3J5TGltaXQoLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdm0uZHVtcChzY29wZS5tYW5hZ2UocmVzdWx0LmVycm9yKSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZtLmR1bXAoc2NvcGUubWFuYWdlKHJlc3VsdC52YWx1ZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEgbG93LWxldmVsIGludGVyZmFjZSB0byB0aGUgUXVpY2tKUyBmdW5jdGlvbnMgaW4gdGhpcyBXZWJBc3NlbWJseVxuICAgICAqIG1vZHVsZS5cbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICogQHVuc3RhYmxlIE5vIHdhcnJhbnR5IGlzIHByb3ZpZGVkIHdpdGggdGhpcyBBUEkuIEl0IGNvdWxkIGNoYW5nZSBhdCBhbnkgdGltZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldEZGSSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmZpO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU1dBU01Nb2R1bGUgPSBRdWlja0pTV0FTTU1vZHVsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZHVsZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU0FzeW5jUnVudGltZSA9IHZvaWQgMDtcbmNvbnN0IF8xID0gcmVxdWlyZShcIi5cIik7XG5jb25zdCBjb250ZXh0X2FzeW5jaWZ5XzEgPSByZXF1aXJlKFwiLi9jb250ZXh0LWFzeW5jaWZ5XCIpO1xuY29uc3QgcnVudGltZV8xID0gcmVxdWlyZShcIi4vcnVudGltZVwiKTtcbmNvbnN0IHR5cGVzXzEgPSByZXF1aXJlKFwiLi90eXBlc1wiKTtcbmNsYXNzIFF1aWNrSlNBc3luY1J1bnRpbWUgZXh0ZW5kcyBydW50aW1lXzEuUXVpY2tKU1J1bnRpbWUge1xuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MpIHtcbiAgICAgICAgc3VwZXIoYXJncyk7XG4gICAgfVxuICAgIG5ld0NvbnRleHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmludHJpbnNpY3MgJiYgb3B0aW9ucy5pbnRyaW5zaWNzICE9PSB0eXBlc18xLkRlZmF1bHRJbnRyaW5zaWNzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUT0RPOiBDdXN0b20gaW50cmluc2ljcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3R4ID0gbmV3IF8xLkxpZmV0aW1lKHRoaXMuZmZpLlFUU19OZXdDb250ZXh0KHRoaXMucnQudmFsdWUpLCB1bmRlZmluZWQsIChjdHhfcHRyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNYXAuZGVsZXRlKGN0eF9wdHIpO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3MuZGVsZXRlQ29udGV4dChjdHhfcHRyKTtcbiAgICAgICAgICAgIHRoaXMuZmZpLlFUU19GcmVlQ29udGV4dChjdHhfcHRyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgY29udGV4dF9hc3luY2lmeV8xLlF1aWNrSlNBc3luY0NvbnRleHQoe1xuICAgICAgICAgICAgbW9kdWxlOiB0aGlzLm1vZHVsZSxcbiAgICAgICAgICAgIGN0eCxcbiAgICAgICAgICAgIGZmaTogdGhpcy5mZmksXG4gICAgICAgICAgICBydDogdGhpcy5ydCxcbiAgICAgICAgICAgIG93bmVkTGlmZXRpbWVzOiBbXSxcbiAgICAgICAgICAgIHJ1bnRpbWU6IHRoaXMsXG4gICAgICAgICAgICBjYWxsYmFja3M6IHRoaXMuY2FsbGJhY2tzLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb250ZXh0TWFwLnNldChjdHgudmFsdWUsIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG4gICAgc2V0TW9kdWxlTG9hZGVyKG1vZHVsZUxvYWRlciwgbW9kdWxlTm9ybWFsaXplcikge1xuICAgICAgICBzdXBlci5zZXRNb2R1bGVMb2FkZXIobW9kdWxlTG9hZGVyLCBtb2R1bGVOb3JtYWxpemVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBtYXggc3RhY2sgc2l6ZSBmb3IgdGhpcyBydW50aW1lIGluIGJ5dGVzLlxuICAgICAqIFRvIHJlbW92ZSB0aGUgbGltaXQsIHNldCB0byBgMGAuXG4gICAgICpcbiAgICAgKiBTZXR0aW5nIHRoaXMgbGltaXQgYWxzbyBhZGp1c3RzIHRoZSBnbG9iYWwgYEFTWU5DSUZZX1NUQUNLX1NJWkVgIGZvciB0aGUgZW50aXJlIHtAbGluayBRdWlja0pTQXN5bmNXQVNNTW9kdWxlfS5cbiAgICAgKiBTZWUgdGhlIFtwdWxsIHJlcXVlc3RdKGh0dHBzOi8vZ2l0aHViLmNvbS9qdXN0amFrZS9xdWlja2pzLWVtc2NyaXB0ZW4vcHVsbC8xMTQpIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgc2V0TWF4U3RhY2tTaXplKHN0YWNrU2l6ZSkge1xuICAgICAgICByZXR1cm4gc3VwZXIuc2V0TWF4U3RhY2tTaXplKHN0YWNrU2l6ZSk7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTQXN5bmNSdW50aW1lID0gUXVpY2tKU0FzeW5jUnVudGltZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJ1bnRpbWUtYXN5bmNpZnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlF1aWNrSlNSdW50aW1lID0gdm9pZCAwO1xuY29uc3QgYXN5bmNpZnlfaGVscGVyc18xID0gcmVxdWlyZShcIi4vYXN5bmNpZnktaGVscGVyc1wiKTtcbmNvbnN0IGNvbnRleHRfMSA9IHJlcXVpcmUoXCIuL2NvbnRleHRcIik7XG5jb25zdCBkZWJ1Z18xID0gcmVxdWlyZShcIi4vZGVidWdcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuL2Vycm9yc1wiKTtcbmNvbnN0IGxpZmV0aW1lXzEgPSByZXF1aXJlKFwiLi9saWZldGltZVwiKTtcbmNvbnN0IG1lbW9yeV8xID0gcmVxdWlyZShcIi4vbWVtb3J5XCIpO1xuY29uc3QgdHlwZXNfMSA9IHJlcXVpcmUoXCIuL3R5cGVzXCIpO1xuLyoqXG4gKiBBIHJ1bnRpbWUgcmVwcmVzZW50cyBhIEphdmFzY3JpcHQgcnVudGltZSBjb3JyZXNwb25kaW5nIHRvIGFuIG9iamVjdCBoZWFwLlxuICogU2V2ZXJhbCBydW50aW1lcyBjYW4gZXhpc3QgYXQgdGhlIHNhbWUgdGltZSBidXQgdGhleSBjYW5ub3QgZXhjaGFuZ2Ugb2JqZWN0cy5cbiAqIEluc2lkZSBhIGdpdmVuIHJ1bnRpbWUsIG5vIG11bHRpLXRocmVhZGluZyBpcyBzdXBwb3J0ZWQuXG4gKlxuICogWW91IGNhbiB0aGluayBvZiBzZXBhcmF0ZSBydW50aW1lcyBsaWtlIGRpZmZlcmVudCBkb21haW5zIGluIGEgYnJvd3NlciwgYW5kXG4gKiB0aGUgY29udGV4dHMgd2l0aGluIGEgcnVudGltZSBsaWtlIHRoZSBkaWZmZXJlbnQgd2luZG93cyBvcGVuIHRvIHRoZSBzYW1lXG4gKiBkb21haW4uXG4gKlxuICogQ3JlYXRlIGEgcnVudGltZSB2aWEge0BsaW5rIFF1aWNrSlNXQVNNTW9kdWxlLm5ld1J1bnRpbWV9LlxuICpcbiAqIFlvdSBzaG91bGQgY3JlYXRlIHNlcGFyYXRlIHJ1bnRpbWUgaW5zdGFuY2VzIGZvciB1bnRydXN0ZWQgY29kZSBmcm9tXG4gKiBkaWZmZXJlbnQgc291cmNlcyBmb3IgaXNvbGF0aW9uLiBIb3dldmVyLCBzdHJvbmdlciBpc29sYXRpb24gaXMgYWxzb1xuICogYXZhaWxhYmxlIChhdCB0aGUgY29zdCBvZiBtZW1vcnkgdXNhZ2UpLCBieSBjcmVhdGluZyBzZXBhcmF0ZSBXZWJBc3NlbWJseVxuICogbW9kdWxlcyB0byBmdXJ0aGVyIGlzb2xhdGUgdW50cnVzdGVkIGNvZGUuXG4gKiBTZWUge0BsaW5rIG5ld1F1aWNrSlNXQVNNTW9kdWxlfS5cbiAqXG4gKiBJbXBsZW1lbnQgbWVtb3J5IGFuZCBDUFUgY29uc3RyYWludHMgd2l0aCBbW3NldEludGVycnVwdEhhbmRsZXJdXVxuICogKGNhbGxlZCByZWd1bGFybHkgd2hpbGUgdGhlIGludGVycHJldGVyIHJ1bnMpLCBbW3NldE1lbW9yeUxpbWl0XV0sIGFuZFxuICogW1tzZXRNYXhTdGFja1NpemVdXS5cbiAqIFVzZSBbW2NvbXB1dGVNZW1vcnlVc2FnZV1dIG9yIFtbZHVtcE1lbW9yeVVzYWdlXV0gdG8gZ3VpZGUgbWVtb3J5IGxpbWl0XG4gKiB0dW5pbmcuXG4gKlxuICogQ29uZmlndXJlIEVTIG1vZHVsZSBsb2FkaW5nIHdpdGggW1tzZXRNb2R1bGVMb2FkZXJdXS5cbiAqL1xuY2xhc3MgUXVpY2tKU1J1bnRpbWUge1xuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MpIHtcbiAgICAgICAgLyoqIEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuc2NvcGUgPSBuZXcgbGlmZXRpbWVfMS5TY29wZSgpO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5jb250ZXh0TWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmNUb0hvc3RDYWxsYmFja3MgPSB7XG4gICAgICAgICAgICBzaG91bGRJbnRlcnJ1cHQ6IChydCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChydCAhPT0gdGhpcy5ydC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJRdWlja0pTQ29udGV4dCBpbnN0YW5jZSByZWNlaXZlZCBDIC0+IEpTIGludGVycnVwdCB3aXRoIG1pc21hdGNoZWQgcnRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZuID0gdGhpcy5pbnRlcnJ1cHRIYW5kbGVyO1xuICAgICAgICAgICAgICAgIGlmICghZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUXVpY2tKU0NvbnRleHQgaGFkIG5vIGludGVycnVwdCBoYW5kbGVyXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZm4odGhpcykgPyAxIDogMDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2FkTW9kdWxlU291cmNlOiAoMCwgYXN5bmNpZnlfaGVscGVyc18xLm1heWJlQXN5bmNGbikodGhpcywgZnVuY3Rpb24qIChhd2FpdGVkLCBydCwgY3R4LCBtb2R1bGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlTG9hZGVyID0gdGhpcy5tb2R1bGVMb2FkZXI7XG4gICAgICAgICAgICAgICAgaWYgKCFtb2R1bGVMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVudGltZSBoYXMgbm8gbW9kdWxlIGxvYWRlclwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ0ICE9PSB0aGlzLnJ0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bnRpbWUgcG9pbnRlciBtaXNtYXRjaFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dE1hcC5nZXQoY3R4KSA/P1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0NvbnRleHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dFBvaW50ZXI6IGN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQqIGF3YWl0ZWQobW9kdWxlTG9hZGVyKG1vZHVsZU5hbWUsIGNvbnRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgJiYgXCJlcnJvclwiIGluIHJlc3VsdCAmJiByZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICgwLCBkZWJ1Z18xLmRlYnVnTG9nKShcImNUb0hvc3RMb2FkTW9kdWxlOiBsb2FkZXIgcmV0dXJuZWQgZXJyb3JcIiwgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVTb3VyY2UgPSB0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiID8gcmVzdWx0IDogXCJ2YWx1ZVwiIGluIHJlc3VsdCA/IHJlc3VsdC52YWx1ZSA6IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5Lm5ld0hlYXBDaGFyUG9pbnRlcihtb2R1bGVTb3VyY2UpLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwiY1RvSG9zdExvYWRNb2R1bGU6IGNhdWdodCBlcnJvclwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudGhyb3coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZU1vZHVsZTogKDAsIGFzeW5jaWZ5X2hlbHBlcnNfMS5tYXliZUFzeW5jRm4pKHRoaXMsIGZ1bmN0aW9uKiAoYXdhaXRlZCwgcnQsIGN0eCwgYmFzZU1vZHVsZU5hbWUsIG1vZHVsZU5hbWVSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlTm9ybWFsaXplciA9IHRoaXMubW9kdWxlTm9ybWFsaXplcjtcbiAgICAgICAgICAgICAgICBpZiAoIW1vZHVsZU5vcm1hbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVudGltZSBoYXMgbm8gbW9kdWxlIG5vcm1hbGl6ZXJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChydCAhPT0gdGhpcy5ydC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdW50aW1lIHBvaW50ZXIgbWlzbWF0Y2hcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHRNYXAuZ2V0KGN0eCkgPz9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXdDb250ZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IERvZXMgdGhpcyBoYXBwZW4/IEFyZSB3ZSByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nPyBJIGRvbid0IHRoaW5rIHNvICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0UG9pbnRlcjogY3R4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCogYXdhaXRlZChtb2R1bGVOb3JtYWxpemVyKGJhc2VNb2R1bGVOYW1lLCBtb2R1bGVOYW1lUmVxdWVzdCwgY29udGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiBcImVycm9yXCIgaW4gcmVzdWx0ICYmIHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwiY1RvSG9zdE5vcm1hbGl6ZU1vZHVsZTogbm9ybWFsaXplciByZXR1cm5lZCBlcnJvclwiLCByZXN1bHQuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiID8gcmVzdWx0IDogcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRNZW1vcnkodGhpcy5ydC52YWx1ZSkubmV3SGVhcENoYXJQb2ludGVyKG5hbWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwibm9ybWFsaXplTW9kdWxlOiBjYXVnaHQgZXJyb3JcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnRocm93KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICAgIGFyZ3Mub3duZWRMaWZldGltZXM/LmZvckVhY2goKGxpZmV0aW1lKSA9PiB0aGlzLnNjb3BlLm1hbmFnZShsaWZldGltZSkpO1xuICAgICAgICB0aGlzLm1vZHVsZSA9IGFyZ3MubW9kdWxlO1xuICAgICAgICB0aGlzLm1lbW9yeSA9IG5ldyBtZW1vcnlfMS5Nb2R1bGVNZW1vcnkodGhpcy5tb2R1bGUpO1xuICAgICAgICB0aGlzLmZmaSA9IGFyZ3MuZmZpO1xuICAgICAgICB0aGlzLnJ0ID0gYXJncy5ydDtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MgPSBhcmdzLmNhbGxiYWNrcztcbiAgICAgICAgdGhpcy5zY29wZS5tYW5hZ2UodGhpcy5ydCk7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLnNldFJ1bnRpbWVDYWxsYmFja3ModGhpcy5ydC52YWx1ZSwgdGhpcy5jVG9Ib3N0Q2FsbGJhY2tzKTtcbiAgICAgICAgdGhpcy5leGVjdXRlUGVuZGluZ0pvYnMgPSB0aGlzLmV4ZWN1dGVQZW5kaW5nSm9icy5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBnZXQgYWxpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlLmFsaXZlO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIG5ld0NvbnRleHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmludHJpbnNpY3MgJiYgb3B0aW9ucy5pbnRyaW5zaWNzICE9PSB0eXBlc18xLkRlZmF1bHRJbnRyaW5zaWNzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUT0RPOiBDdXN0b20gaW50cmluc2ljcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3R4ID0gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUob3B0aW9ucy5jb250ZXh0UG9pbnRlciB8fCB0aGlzLmZmaS5RVFNfTmV3Q29udGV4dCh0aGlzLnJ0LnZhbHVlKSwgdW5kZWZpbmVkLCAoY3R4X3B0cikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0TWFwLmRlbGV0ZShjdHhfcHRyKTtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzLmRlbGV0ZUNvbnRleHQoY3R4X3B0cik7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZUNvbnRleHQoY3R4X3B0cik7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gbmV3IGNvbnRleHRfMS5RdWlja0pTQ29udGV4dCh7XG4gICAgICAgICAgICBtb2R1bGU6IHRoaXMubW9kdWxlLFxuICAgICAgICAgICAgY3R4LFxuICAgICAgICAgICAgZmZpOiB0aGlzLmZmaSxcbiAgICAgICAgICAgIHJ0OiB0aGlzLnJ0LFxuICAgICAgICAgICAgb3duZWRMaWZldGltZXM6IG9wdGlvbnMub3duZWRMaWZldGltZXMsXG4gICAgICAgICAgICBydW50aW1lOiB0aGlzLFxuICAgICAgICAgICAgY2FsbGJhY2tzOiB0aGlzLmNhbGxiYWNrcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udGV4dE1hcC5zZXQoY3R4LnZhbHVlLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbG9hZGVyIGZvciBFY21hU2NyaXB0IG1vZHVsZXMgcmVxdWVzdGVkIGJ5IGFueSBjb250ZXh0IGluIHRoaXNcbiAgICAgKiBydW50aW1lLlxuICAgICAqXG4gICAgICogVGhlIGxvYWRlciBjYW4gYmUgcmVtb3ZlZCB3aXRoIFtbcmVtb3ZlTW9kdWxlTG9hZGVyXV0uXG4gICAgICovXG4gICAgc2V0TW9kdWxlTG9hZGVyKG1vZHVsZUxvYWRlciwgbW9kdWxlTm9ybWFsaXplcikge1xuICAgICAgICB0aGlzLm1vZHVsZUxvYWRlciA9IG1vZHVsZUxvYWRlcjtcbiAgICAgICAgdGhpcy5tb2R1bGVOb3JtYWxpemVyID0gbW9kdWxlTm9ybWFsaXplcjtcbiAgICAgICAgdGhpcy5mZmkuUVRTX1J1bnRpbWVFbmFibGVNb2R1bGVMb2FkZXIodGhpcy5ydC52YWx1ZSwgdGhpcy5tb2R1bGVOb3JtYWxpemVyID8gMSA6IDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIHRoZSBsb2FkZXIgc2V0IGJ5IFtbc2V0TW9kdWxlTG9hZGVyXV0uIFRoaXMgZGlzYWJsZXMgbW9kdWxlIGxvYWRpbmcuXG4gICAgICovXG4gICAgcmVtb3ZlTW9kdWxlTG9hZGVyKCkge1xuICAgICAgICB0aGlzLm1vZHVsZUxvYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5mZmkuUVRTX1J1bnRpbWVEaXNhYmxlTW9kdWxlTG9hZGVyKHRoaXMucnQudmFsdWUpO1xuICAgIH1cbiAgICAvLyBSdW50aW1lIG1hbmFnZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEluIFF1aWNrSlMsIHByb21pc2VzIGFuZCBhc3luYyBmdW5jdGlvbnMgY3JlYXRlIHBlbmRpbmdKb2JzLiBUaGVzZSBkbyBub3QgZXhlY3V0ZVxuICAgICAqIGltbWVkaWF0ZWx5IGFuZCBuZWVkIHRvIGJlIHJ1biBieSBjYWxsaW5nIFtbZXhlY3V0ZVBlbmRpbmdKb2JzXV0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBlbmRpbmdKb2IgcXVldWVkIHVwLlxuICAgICAqL1xuICAgIGhhc1BlbmRpbmdKb2IoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuZmZpLlFUU19Jc0pvYlBlbmRpbmcodGhpcy5ydC52YWx1ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgYSBjYWxsYmFjayB3aGljaCBpcyByZWd1bGFybHkgY2FsbGVkIGJ5IHRoZSBRdWlja0pTIGVuZ2luZSB3aGVuIGl0IGlzXG4gICAgICogZXhlY3V0aW5nIGNvZGUuIFRoaXMgY2FsbGJhY2sgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGFuIGV4ZWN1dGlvblxuICAgICAqIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgY2FuIGJlIHJlbW92ZWQgd2l0aCBbW3JlbW92ZUludGVycnVwdEhhbmRsZXJdXS5cbiAgICAgKi9cbiAgICBzZXRJbnRlcnJ1cHRIYW5kbGVyKGNiKSB7XG4gICAgICAgIGNvbnN0IHByZXZJbnRlcnJ1cHRIYW5kbGVyID0gdGhpcy5pbnRlcnJ1cHRIYW5kbGVyO1xuICAgICAgICB0aGlzLmludGVycnVwdEhhbmRsZXIgPSBjYjtcbiAgICAgICAgaWYgKCFwcmV2SW50ZXJydXB0SGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX1J1bnRpbWVFbmFibGVJbnRlcnJ1cHRIYW5kbGVyKHRoaXMucnQudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIGlmIGFueS5cbiAgICAgKiBTZWUgW1tzZXRJbnRlcnJ1cHRIYW5kbGVyXV0uXG4gICAgICovXG4gICAgcmVtb3ZlSW50ZXJydXB0SGFuZGxlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJydXB0SGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX1J1bnRpbWVEaXNhYmxlSW50ZXJydXB0SGFuZGxlcih0aGlzLnJ0LnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJydXB0SGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIHBlbmRpbmdKb2JzIG9uIHRoZSBydW50aW1lIHVudGlsIGBtYXhKb2JzVG9FeGVjdXRlYCBqb2JzIGFyZVxuICAgICAqIGV4ZWN1dGVkIChkZWZhdWx0IGFsbCBwZW5kaW5nSm9icyksIHRoZSBxdWV1ZSBpcyBleGhhdXN0ZWQsIG9yIHRoZSBydW50aW1lXG4gICAgICogZW5jb3VudGVycyBhbiBleGNlcHRpb24uXG4gICAgICpcbiAgICAgKiBJbiBRdWlja0pTLCBwcm9taXNlcyBhbmQgYXN5bmMgZnVuY3Rpb25zICppbnNpZGUgdGhlIHJ1bnRpbWUqIGNyZWF0ZVxuICAgICAqIHBlbmRpbmdKb2JzLiBUaGVzZSBkbyBub3QgZXhlY3V0ZSBpbW1lZGlhdGVseSBhbmQgbmVlZCB0byB0cmlnZ2VyZWQgdG8gcnVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1heEpvYnNUb0V4ZWN1dGUgLSBXaGVuIG5lZ2F0aXZlLCBydW4gYWxsIHBlbmRpbmcgam9icy4gT3RoZXJ3aXNlIGV4ZWN1dGVcbiAgICAgKiBhdCBtb3N0IGBtYXhKb2JzVG9FeGVjdXRlYCBiZWZvcmUgcmV0dXJuaW5nLlxuICAgICAqXG4gICAgICogQHJldHVybiBPbiBzdWNjZXNzLCB0aGUgbnVtYmVyIG9mIGV4ZWN1dGVkIGpvYnMuIE9uIGVycm9yLCB0aGUgZXhjZXB0aW9uXG4gICAgICogdGhhdCBzdG9wcGVkIGV4ZWN1dGlvbiwgYW5kIHRoZSBjb250ZXh0IGl0IG9jY3VycmVkIGluLiBOb3RlIHRoYXRcbiAgICAgKiBleGVjdXRlUGVuZGluZ0pvYnMgd2lsbCBub3Qgbm9ybWFsbHkgcmV0dXJuIGVycm9ycyB0aHJvd24gaW5zaWRlIGFzeW5jXG4gICAgICogZnVuY3Rpb25zIG9yIHJlamVjdGVkIHByb21pc2VzLiBUaG9zZSBlcnJvcnMgYXJlIGF2YWlsYWJsZSBieSBjYWxsaW5nXG4gICAgICogW1tyZXNvbHZlUHJvbWlzZV1dIG9uIHRoZSBwcm9taXNlIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgYXN5bmMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZXhlY3V0ZVBlbmRpbmdKb2JzKG1heEpvYnNUb0V4ZWN1dGUgPSAtMSkge1xuICAgICAgICBjb25zdCBjdHhQdHJPdXQgPSB0aGlzLm1lbW9yeS5uZXdNdXRhYmxlUG9pbnRlckFycmF5KDEpO1xuICAgICAgICBjb25zdCB2YWx1ZVB0ciA9IHRoaXMuZmZpLlFUU19FeGVjdXRlUGVuZGluZ0pvYih0aGlzLnJ0LnZhbHVlLCBtYXhKb2JzVG9FeGVjdXRlID8/IC0xLCBjdHhQdHJPdXQudmFsdWUucHRyKTtcbiAgICAgICAgY29uc3QgY3R4UHRyID0gY3R4UHRyT3V0LnZhbHVlLnR5cGVkQXJyYXlbMF07XG4gICAgICAgIGN0eFB0ck91dC5kaXNwb3NlKCk7XG4gICAgICAgIGlmIChjdHhQdHIgPT09IDApIHtcbiAgICAgICAgICAgIC8vIE5vIGpvYnMgZXhlY3V0ZWQuXG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZVZhbHVlUG9pbnRlclJ1bnRpbWUodGhpcy5ydC52YWx1ZSwgdmFsdWVQdHIpO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IDAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0TWFwLmdldChjdHhQdHIpID8/XG4gICAgICAgICAgICB0aGlzLm5ld0NvbnRleHQoe1xuICAgICAgICAgICAgICAgIGNvbnRleHRQb2ludGVyOiBjdHhQdHIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0VmFsdWUgPSBjb250ZXh0LmdldE1lbW9yeSh0aGlzLnJ0LnZhbHVlKS5oZWFwVmFsdWVIYW5kbGUodmFsdWVQdHIpO1xuICAgICAgICBjb25zdCB0eXBlT2ZSZXQgPSBjb250ZXh0LnR5cGVvZihyZXN1bHRWYWx1ZSk7XG4gICAgICAgIGlmICh0eXBlT2ZSZXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkSm9icyA9IGNvbnRleHQuZ2V0TnVtYmVyKHJlc3VsdFZhbHVlKTtcbiAgICAgICAgICAgIHJlc3VsdFZhbHVlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBleGVjdXRlZEpvYnMgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gT2JqZWN0LmFzc2lnbihyZXN1bHRWYWx1ZSwgeyBjb250ZXh0IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBtYXggbWVtb3J5IHRoaXMgcnVudGltZSBjYW4gYWxsb2NhdGUuXG4gICAgICogVG8gcmVtb3ZlIHRoZSBsaW1pdCwgc2V0IHRvIGAtMWAuXG4gICAgICovXG4gICAgc2V0TWVtb3J5TGltaXQobGltaXRCeXRlcykge1xuICAgICAgICBpZiAobGltaXRCeXRlcyA8IDAgJiYgbGltaXRCeXRlcyAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgbWVtb3J5IGxpbWl0IHRvIG5lZ2F0aXZlIG51bWJlci4gVG8gdW5zZXQsIHBhc3MgLTFcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mZmkuUVRTX1J1bnRpbWVTZXRNZW1vcnlMaW1pdCh0aGlzLnJ0LnZhbHVlLCBsaW1pdEJ5dGVzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSBtZW1vcnkgdXNhZ2UgZm9yIHRoaXMgcnVudGltZS4gUmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgaGFuZGxlIHRvIGFcbiAgICAgKiBKU1ZhbHVlIG9iamVjdC4gVXNlIFtbUXVpY2tKU0NvbnRleHQuZHVtcF1dIHRvIGNvbnZlcnQgdG8gYSBuYXRpdmUgb2JqZWN0LlxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBhbGxvY2F0ZSBtb3JlIG1lbW9yeSBpbnNpZGUgdGhlIHJ1bnRpbWUuIFRoZSBpbmZvcm1hdGlvblxuICAgICAqIGlzIGFjY3VyYXRlIGFzIG9mIGp1c3QgYmVmb3JlIHRoZSBjYWxsIHRvIGBjb21wdXRlTWVtb3J5VXNhZ2VgLlxuICAgICAqIEZvciBhIGh1bWFuLWRpZ2VzdGlibGUgcmVwcmVzZW50YXRpb24sIHNlZSBbW2R1bXBNZW1vcnlVc2FnZV1dLlxuICAgICAqL1xuICAgIGNvbXB1dGVNZW1vcnlVc2FnZSgpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZUNvbnRleHRNZW1vcnkgPSB0aGlzLmdldFN5c3RlbUNvbnRleHQoKS5nZXRNZW1vcnkodGhpcy5ydC52YWx1ZSk7XG4gICAgICAgIHJldHVybiBzZXJ2aWNlQ29udGV4dE1lbW9yeS5oZWFwVmFsdWVIYW5kbGUodGhpcy5mZmkuUVRTX1J1bnRpbWVDb21wdXRlTWVtb3J5VXNhZ2UodGhpcy5ydC52YWx1ZSwgc2VydmljZUNvbnRleHRNZW1vcnkuY3R4LnZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgbWVtb3J5IHVzYWdlIGluIHRoaXMgcnVudGltZS5cbiAgICAgKiBGb3IgcHJvZ3JhbW1hdGljIGFjY2VzcyB0byB0aGlzIGluZm9ybWF0aW9uLCBzZWUgW1tjb21wdXRlTWVtb3J5VXNhZ2VdXS5cbiAgICAgKi9cbiAgICBkdW1wTWVtb3J5VXNhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5jb25zdW1lSGVhcENoYXJQb2ludGVyKHRoaXMuZmZpLlFUU19SdW50aW1lRHVtcE1lbW9yeVVzYWdlKHRoaXMucnQudmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBtYXggc3RhY2sgc2l6ZSBmb3IgdGhpcyBydW50aW1lLCBpbiBieXRlcy5cbiAgICAgKiBUbyByZW1vdmUgdGhlIGxpbWl0LCBzZXQgdG8gYDBgLlxuICAgICAqL1xuICAgIHNldE1heFN0YWNrU2l6ZShzdGFja1NpemUpIHtcbiAgICAgICAgaWYgKHN0YWNrU2l6ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgbWVtb3J5IGxpbWl0IHRvIG5lZ2F0aXZlIG51bWJlci4gVG8gdW5zZXQsIHBhc3MgMC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mZmkuUVRTX1J1bnRpbWVTZXRNYXhTdGFja1NpemUodGhpcy5ydC52YWx1ZSwgc3RhY2tTaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXNzZXJ0IHRoYXQgYGhhbmRsZWAgaXMgb3duZWQgYnkgdGhpcyBydW50aW1lLlxuICAgICAqIEB0aHJvd3MgUXVpY2tKU1dyb25nT3duZXIgaWYgb3duZWQgYnkgYSBkaWZmZXJlbnQgcnVudGltZS5cbiAgICAgKi9cbiAgICBhc3NlcnRPd25lZChoYW5kbGUpIHtcbiAgICAgICAgaWYgKGhhbmRsZS5vd25lciAmJiBoYW5kbGUub3duZXIucnQgIT09IHRoaXMucnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTV3JvbmdPd25lcihgSGFuZGxlIGlzIG5vdCBvd25lZCBieSB0aGlzIHJ1bnRpbWU6ICR7aGFuZGxlLm93bmVyLnJ0LnZhbHVlfSAhPSAke3RoaXMucnQudmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0U3lzdGVtQ29udGV4dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIFdlIG93biB0aGlzIGNvbnRleHQgYW5kIHNob3VsZCBkaXNwb3NlIG9mIGl0LlxuICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5zY29wZS5tYW5hZ2UodGhpcy5uZXdDb250ZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQ7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTUnVudGltZSA9IFF1aWNrSlNSdW50aW1lO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnVudGltZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRXZhbEZsYWdzID0gZXhwb3J0cy5hc3NlcnRTeW5jID0gdm9pZCAwO1xuZnVuY3Rpb24gYXNzZXJ0U3luYyhmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiBtdXN0QmVTeW5jKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oLi4uYXJncyk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiByZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGdW5jdGlvbiB1bmV4cGVjdGVkbHkgcmV0dXJuZWQgYSBQcm9taXNlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn1cbmV4cG9ydHMuYXNzZXJ0U3luYyA9IGFzc2VydFN5bmM7XG4vKiogQml0ZmllbGQgb3B0aW9ucyBmb3IgSlNfRXZhbCgpIEMgZnVuY3Rpb24uICovXG5leHBvcnRzLkV2YWxGbGFncyA9IHtcbiAgICAvKiogZ2xvYmFsIGNvZGUgKGRlZmF1bHQpICovXG4gICAgSlNfRVZBTF9UWVBFX0dMT0JBTDogMCA8PCAwLFxuICAgIC8qKiBtb2R1bGUgY29kZSAqL1xuICAgIEpTX0VWQUxfVFlQRV9NT0RVTEU6IDEgPDwgMCxcbiAgICAvKiogZGlyZWN0IGNhbGwgKGludGVybmFsIHVzZSkgKi9cbiAgICBKU19FVkFMX1RZUEVfRElSRUNUOiAyIDw8IDAsXG4gICAgLyoqIGluZGlyZWN0IGNhbGwgKGludGVybmFsIHVzZSkgKi9cbiAgICBKU19FVkFMX1RZUEVfSU5ESVJFQ1Q6IDMgPDwgMCxcbiAgICBKU19FVkFMX1RZUEVfTUFTSzogMyA8PCAwLFxuICAgIC8qKiBmb3JjZSAnc3RyaWN0JyBtb2RlICovXG4gICAgSlNfRVZBTF9GTEFHX1NUUklDVDogMSA8PCAzLFxuICAgIC8qKiBmb3JjZSAnc3RyaXAnIG1vZGUgKi9cbiAgICBKU19FVkFMX0ZMQUdfU1RSSVA6IDEgPDwgNCxcbiAgICAvKipcbiAgICAgKiBjb21waWxlIGJ1dCBkbyBub3QgcnVuLiBUaGUgcmVzdWx0IGlzIGFuIG9iamVjdCB3aXRoIGFcbiAgICAgKiBKU19UQUdfRlVOQ1RJT05fQllURUNPREUgb3IgSlNfVEFHX01PRFVMRSB0YWcuIEl0IGNhbiBiZSBleGVjdXRlZFxuICAgICAqIHdpdGggSlNfRXZhbEZ1bmN0aW9uKCkuXG4gICAgICovXG4gICAgSlNfRVZBTF9GTEFHX0NPTVBJTEVfT05MWTogMSA8PCA1LFxuICAgIC8qKiBkb24ndCBpbmNsdWRlIHRoZSBzdGFjayBmcmFtZXMgYmVmb3JlIHRoaXMgZXZhbCBpbiB0aGUgRXJyb3IoKSBiYWNrdHJhY2VzICovXG4gICAgSlNfRVZBTF9GTEFHX0JBQ0tUUkFDRV9CQVJSSUVSOiAxIDw8IDYsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMtZmZpLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jb25jYXQgPSBleHBvcnRzLmV2YWxPcHRpb25zVG9GbGFncyA9IGV4cG9ydHMuRGVmYXVsdEludHJpbnNpY3MgPSB2b2lkIDA7XG5jb25zdCB0eXBlc19mZmlfMSA9IHJlcXVpcmUoXCIuL3R5cGVzLWZmaVwiKTtcbmNvbnN0IFVuc3RhYmxlU3ltYm9sID0gU3ltYm9sKFwiVW5zdGFibGVcIik7XG4vLyBGb3IgaW5mb3JtYXRpb25hbCBwdXJwb3Nlc1xuY29uc3QgRGVmYXVsdEludHJpbnNpY3NMaXN0ID0gW1xuICAgIFwiQmFzZU9iamVjdHNcIixcbiAgICBcIkRhdGVcIixcbiAgICBcIkV2YWxcIixcbiAgICBcIlN0cmluZ05vcm1hbGl6ZVwiLFxuICAgIFwiUmVnRXhwXCIsXG4gICAgXCJKU09OXCIsXG4gICAgXCJQcm94eVwiLFxuICAgIFwiTWFwU2V0XCIsXG4gICAgXCJUeXBlZEFycmF5c1wiLFxuICAgIFwiUHJvbWlzZVwiLFxuXTtcbi8qKlxuICogV29yayBpbiBwcm9ncmVzcy5cbiAqL1xuZXhwb3J0cy5EZWZhdWx0SW50cmluc2ljcyA9IFN5bWJvbChcIkRlZmF1bHRJbnRyaW5zaWNzXCIpO1xuLyoqIENvbnZlcnQgW1tDb250ZXh0RXZhbE9wdGlvbnNdXSB0byBhIGJpdGZpZWxkIGZsYWdzICovXG5mdW5jdGlvbiBldmFsT3B0aW9uc1RvRmxhZ3MoZXZhbE9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIGV2YWxPcHRpb25zID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBldmFsT3B0aW9ucztcbiAgICB9XG4gICAgaWYgKGV2YWxPcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IHsgdHlwZSwgc3RyaWN0LCBzdHJpcCwgY29tcGlsZU9ubHksIGJhY2t0cmFjZUJhcnJpZXIgfSA9IGV2YWxPcHRpb25zO1xuICAgIGxldCBmbGFncyA9IDA7XG4gICAgaWYgKHR5cGUgPT09IFwiZ2xvYmFsXCIpXG4gICAgICAgIGZsYWdzIHw9IHR5cGVzX2ZmaV8xLkV2YWxGbGFncy5KU19FVkFMX1RZUEVfR0xPQkFMO1xuICAgIGlmICh0eXBlID09PSBcIm1vZHVsZVwiKVxuICAgICAgICBmbGFncyB8PSB0eXBlc19mZmlfMS5FdmFsRmxhZ3MuSlNfRVZBTF9UWVBFX01PRFVMRTtcbiAgICBpZiAoc3RyaWN0KVxuICAgICAgICBmbGFncyB8PSB0eXBlc19mZmlfMS5FdmFsRmxhZ3MuSlNfRVZBTF9GTEFHX1NUUklDVDtcbiAgICBpZiAoc3RyaXApXG4gICAgICAgIGZsYWdzIHw9IHR5cGVzX2ZmaV8xLkV2YWxGbGFncy5KU19FVkFMX0ZMQUdfU1RSSVA7XG4gICAgaWYgKGNvbXBpbGVPbmx5KVxuICAgICAgICBmbGFncyB8PSB0eXBlc19mZmlfMS5FdmFsRmxhZ3MuSlNfRVZBTF9GTEFHX0NPTVBJTEVfT05MWTtcbiAgICBpZiAoYmFja3RyYWNlQmFycmllcilcbiAgICAgICAgZmxhZ3MgfD0gdHlwZXNfZmZpXzEuRXZhbEZsYWdzLkpTX0VWQUxfRkxBR19CQUNLVFJBQ0VfQkFSUklFUjtcbiAgICByZXR1cm4gZmxhZ3M7XG59XG5leHBvcnRzLmV2YWxPcHRpb25zVG9GbGFncyA9IGV2YWxPcHRpb25zVG9GbGFncztcbmZ1bmN0aW9uIGNvbmNhdCguLi52YWx1ZXMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnRzLmNvbmNhdCA9IGNvbmNhdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlJFTEVBU0VfQVNZTkMgPSBleHBvcnRzLkRFQlVHX0FTWU5DID0gZXhwb3J0cy5SRUxFQVNFX1NZTkMgPSBleHBvcnRzLkRFQlVHX1NZTkMgPSBleHBvcnRzLm1lbW9pemVQcm9taXNlRmFjdG9yeSA9IGV4cG9ydHMubmV3UXVpY2tKU0FzeW5jV0FTTU1vZHVsZSA9IGV4cG9ydHMubmV3UXVpY2tKU1dBU01Nb2R1bGUgPSB2b2lkIDA7XG5jb25zdCBlc21IZWxwZXJzXzEgPSByZXF1aXJlKFwiLi9lc21IZWxwZXJzXCIpO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcsIGNvbXBsZXRlbHkgaXNvbGF0ZWQgV2ViQXNzZW1ibHkgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIFF1aWNrSlMgbGlicmFyeS5cbiAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiBbW1F1aWNrSlNXQVNNTW9kdWxlXV0uXG4gKlxuICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgaGFyZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIFdlYkFzc2VtYmx5IG1vZHVsZXMgaW4gb2xkZXJcbiAqIHZlcnNpb25zIG9mIHY4OlxuICogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTIwNzZcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbmV3UXVpY2tKU1dBU01Nb2R1bGUoXG4vKipcbiAqIE9wdGlvbmFsbHksIHBhc3MgYSB7QGxpbmsgU3luY0J1aWxkVmFyaWFudH0gdG8gY29uc3RydWN0IGEgZGlmZmVyZW50IFdlYkFzc2VtYmx5IG1vZHVsZS5cbiAqL1xudmFyaWFudCA9IGV4cG9ydHMuUkVMRUFTRV9TWU5DKSB7XG4gICAgY29uc3QgW3dhc21Nb2R1bGVMb2FkZXIsIFF1aWNrSlNGRkksIHsgUXVpY2tKU1dBU01Nb2R1bGUgfV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHZhcmlhbnQuaW1wb3J0TW9kdWxlTG9hZGVyKCksXG4gICAgICAgIHZhcmlhbnQuaW1wb3J0RkZJKCksXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL21vZHVsZS5qc1wiKSkpLnRoZW4oZXNtSGVscGVyc18xLnVud3JhcFR5cGVzY3JpcHQpLFxuICAgIF0pO1xuICAgIGNvbnN0IHdhc21Nb2R1bGUgPSBhd2FpdCB3YXNtTW9kdWxlTG9hZGVyKCk7XG4gICAgd2FzbU1vZHVsZS50eXBlID0gXCJzeW5jXCI7XG4gICAgY29uc3QgZmZpID0gbmV3IFF1aWNrSlNGRkkod2FzbU1vZHVsZSk7XG4gICAgcmV0dXJuIG5ldyBRdWlja0pTV0FTTU1vZHVsZSh3YXNtTW9kdWxlLCBmZmkpO1xufVxuZXhwb3J0cy5uZXdRdWlja0pTV0FTTU1vZHVsZSA9IG5ld1F1aWNrSlNXQVNNTW9kdWxlO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcsIGNvbXBsZXRlbHkgaXNvbGF0ZWQgV2ViQXNzZW1ibHkgbW9kdWxlIGNvbnRhaW5pbmcgYSB2ZXJzaW9uIG9mIHRoZSBRdWlja0pTIGxpYnJhcnlcbiAqIGNvbXBpbGVkIHdpdGggRW1zY3JpcHRlbidzIFtBU1lOQ0lGWV0oaHR0cHM6Ly9lbXNjcmlwdGVuLm9yZy9kb2NzL3BvcnRpbmcvYXN5bmNpZnkuaHRtbCkgdHJhbnNmb3JtLlxuICpcbiAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBvZmZlcnMgZmVhdHVyZXMgdGhhdCBlbmFibGUgc3luY2hyb25vdXMgY29kZVxuICogaW5zaWRlIHRoZSBWTSB0byBpbnRlcmFjdCB3aXRoIGFzeW5jaHJvbm91cyBjb2RlIGluIHRoZSBob3N0IGVudmlyb25tZW50LlxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIFtbUXVpY2tKU0FzeW5jV0FTTU1vZHVsZV1dLCBbW1F1aWNrSlNBc3luY1J1bnRpbWVdXSxcbiAqIGFuZCBbW1F1aWNrSlNBc3luY0NvbnRleHRdXS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlcmUgaXMgYSBoYXJkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgV2ViQXNzZW1ibHkgbW9kdWxlcyBpbiBvbGRlclxuICogdmVyc2lvbnMgb2Ygdjg6XG4gKiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMjA3NlxuICovXG5hc3luYyBmdW5jdGlvbiBuZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlKFxuLyoqXG4gKiBPcHRpb25hbGx5LCBwYXNzIGEge0BsaW5rIEFzeW5jQnVpbGRWYXJpYW50fSB0byBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgV2ViQXNzZW1ibHkgbW9kdWxlLlxuICovXG52YXJpYW50ID0gZXhwb3J0cy5SRUxFQVNFX0FTWU5DKSB7XG4gICAgY29uc3QgW3dhc21Nb2R1bGVMb2FkZXIsIFF1aWNrSlNBc3luY0ZGSSwgeyBRdWlja0pTQXN5bmNXQVNNTW9kdWxlIH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB2YXJpYW50LmltcG9ydE1vZHVsZUxvYWRlcigpLFxuICAgICAgICB2YXJpYW50LmltcG9ydEZGSSgpLFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9tb2R1bGUtYXN5bmNpZnkuanNcIikpKS50aGVuKGVzbUhlbHBlcnNfMS51bndyYXBUeXBlc2NyaXB0KSxcbiAgICBdKTtcbiAgICBjb25zdCB3YXNtTW9kdWxlID0gYXdhaXQgd2FzbU1vZHVsZUxvYWRlcigpO1xuICAgIHdhc21Nb2R1bGUudHlwZSA9IFwiYXN5bmNcIjtcbiAgICBjb25zdCBmZmkgPSBuZXcgUXVpY2tKU0FzeW5jRkZJKHdhc21Nb2R1bGUpO1xuICAgIHJldHVybiBuZXcgUXVpY2tKU0FzeW5jV0FTTU1vZHVsZSh3YXNtTW9kdWxlLCBmZmkpO1xufVxuZXhwb3J0cy5uZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlID0gbmV3UXVpY2tKU0FzeW5jV0FTTU1vZHVsZTtcbi8qKlxuICogSGVscGVyIGludGVuZGVkIHRvIG1lbW9pemUgdGhlIGNyZWF0aW9uIG9mIGEgV2ViQXNzZW1ibHkgbW9kdWxlLlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZ2V0RGVidWdNb2R1bGUgPSBtZW1vaXplUHJvbWlzZUZhY3RvcnkoKCkgPT4gbmV3UXVpY2tKU1dBU01Nb2R1bGUoREVCVUdfU1lOQykpXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZVByb21pc2VGYWN0b3J5KGZuKSB7XG4gICAgbGV0IHByb21pc2U7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgcmV0dXJuIChwcm9taXNlID8/IChwcm9taXNlID0gZm4oKSkpO1xuICAgIH07XG59XG5leHBvcnRzLm1lbW9pemVQcm9taXNlRmFjdG9yeSA9IG1lbW9pemVQcm9taXNlRmFjdG9yeTtcbi8qKlxuICogVGhpcyBidWlsZCB2YXJpYW50IGlzIGNvbXBpbGVkIHdpdGggYC1mc2FuaXRpemU9bGVha2AuIEl0IGluc3RydW1lbnRzIGFsbFxuICogbWVtb3J5IGFsbG9jYXRpb25zIGFuZCB3aGVuIGNvbWJpbmVkIHdpdGggc291cmNlbWFwcywgY2FuIHByZXNlbnQgc3RhY2sgdHJhY2VcbiAqIGxvY2F0aW9ucyB3aGVyZSBtZW1vcnkgbGVha3Mgb2NjdXIuXG4gKlxuICogU2VlIFtbVGVzdFF1aWNrSlNXQVNNTW9kdWxlXV0gd2hpY2ggcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBsZWFrIHNhbml0aXplciB2aWFcbiAqIHtAbGluayBUZXN0UXVpY2tKU1dBU01Nb2R1bGUuYXNzZXJ0Tm9NZW1vcnlBbGxvY2F0ZWR9LlxuICpcbiAqIFRoZSBkb3duc2lkZSBpcyB0aGF0IGl0J3MgMTAwLTEwMDB4IHNsb3dlciB0aGFuIHRoZSBvdGhlciB2YXJpYW50cy5cbiAqIFN1Z2dlc3RlZCB1c2UgY2FzZTogYXV0b21hdGVkIHRlc3RpbmcsIHJlZ3Jlc3Npb24gdGVzdGluZywgYW5kIGludGVyYWN0aXZlXG4gKiBkZWJ1Z2dpbmcuXG4gKi9cbmV4cG9ydHMuREVCVUdfU1lOQyA9IHtcbiAgICB0eXBlOiBcInN5bmNcIixcbiAgICBhc3luYyBpbXBvcnRGRkkoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgLy8gY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KFwiLi9nZW5lcmF0ZWQvZmZpLldBU01fREVCVUdfU1lOQy5qc1wiKVxuICAgICAgICAvLyByZXR1cm4gdW53cmFwVHlwZXNjcmlwdChtb2QpLlF1aWNrSlNGRklcbiAgICB9LFxuICAgIGFzeW5jIGltcG9ydE1vZHVsZUxvYWRlcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICAvLyBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoXCIuL2dlbmVyYXRlZC9lbXNjcmlwdGVuLW1vZHVsZS5XQVNNX0RFQlVHX1NZTkMuanNcIilcbiAgICAgICAgLy8gcmV0dXJuIHVud3JhcEphdmFzY3JpcHQobW9kKS5kZWZhdWx0XG4gICAgfSxcbn07XG4vKipcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgKHN5bmNocm9ub3VzKSBidWlsZCB2YXJpYW50LlxuICoge0BsaW5rIGdldFF1aWNrSlN9IHJldHVybnMgYSBtZW1vaXplZCBpbnN0YW5jZSBvZiB0aGlzIGJ1aWxkIHZhcmlhbnQuXG4gKi9cbmV4cG9ydHMuUkVMRUFTRV9TWU5DID0ge1xuICAgIHR5cGU6IFwic3luY1wiLFxuICAgIGFzeW5jIGltcG9ydEZGSSgpIHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vZ2VuZXJhdGVkL2ZmaS5XQVNNX1JFTEVBU0VfU1lOQy5qc1wiKSkpO1xuICAgICAgICByZXR1cm4gKDAsIGVzbUhlbHBlcnNfMS51bndyYXBUeXBlc2NyaXB0KShtb2QpLlF1aWNrSlNGRkk7XG4gICAgfSxcbiAgICBhc3luYyBpbXBvcnRNb2R1bGVMb2FkZXIoKSB7XG4gICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2dlbmVyYXRlZC9lbXNjcmlwdGVuLW1vZHVsZS5XQVNNX1JFTEVBU0VfU1lOQy5qc1wiKSkpO1xuICAgICAgICByZXR1cm4gKDAsIGVzbUhlbHBlcnNfMS51bndyYXBKYXZhc2NyaXB0KShtb2QpO1xuICAgIH0sXG59O1xuLyoqXG4gKiBUaGUgYXN5bmMgZGVidWcgYnVpbGQgdmFyaWFudCBtYXkgb3IgbWF5IG5vdCBoYXZlIHRoZSBzYW5pdGl6ZXIgZW5hYmxlZC5cbiAqIEl0IGRvZXMgcHJpbnQgYSBsb3Qgb2YgZGVidWcgbG9ncy5cbiAqXG4gKiBTdWdnZXN0ZWQgdXNlIGNhc2U6IGludGVyYWN0aXZlIGRlYnVnZ2luZyBvbmx5LlxuICovXG5leHBvcnRzLkRFQlVHX0FTWU5DID0ge1xuICAgIHR5cGU6IFwiYXN5bmNcIixcbiAgICBhc3luYyBpbXBvcnRGRkkoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgLy8gY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KFwiLi9nZW5lcmF0ZWQvZmZpLldBU01fREVCVUdfQVNZTkNJRlkuanNcIilcbiAgICAgICAgLy8gcmV0dXJuIHVud3JhcFR5cGVzY3JpcHQobW9kKS5RdWlja0pTQXN5bmNGRklcbiAgICB9LFxuICAgIGFzeW5jIGltcG9ydE1vZHVsZUxvYWRlcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICAvLyBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoXCIuL2dlbmVyYXRlZC9lbXNjcmlwdGVuLW1vZHVsZS5XQVNNX0RFQlVHX0FTWU5DSUZZLmpzXCIpXG4gICAgICAgIC8vIHJldHVybiB1bndyYXBKYXZhc2NyaXB0KG1vZCkuZGVmYXVsdFxuICAgIH0sXG59O1xuLyoqXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGFzeW5jaWZpZWQgYnVpbGQgdmFyaWFudC5cbiAqL1xuZXhwb3J0cy5SRUxFQVNFX0FTWU5DID0ge1xuICAgIHR5cGU6IFwiYXN5bmNcIixcbiAgICBhc3luYyBpbXBvcnRGRkkoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgLy8gY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KFwiLi9nZW5lcmF0ZWQvZmZpLldBU01fUkVMRUFTRV9BU1lOQ0lGWS5qc1wiKVxuICAgICAgICAvLyByZXR1cm4gdW53cmFwVHlwZXNjcmlwdChtb2QpLlF1aWNrSlNBc3luY0ZGSVxuICAgIH0sXG4gICAgYXN5bmMgaW1wb3J0TW9kdWxlTG9hZGVyKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgIC8vIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChcIi4vZ2VuZXJhdGVkL2Vtc2NyaXB0ZW4tbW9kdWxlLldBU01fUkVMRUFTRV9BU1lOQ0lGWS5qc1wiKVxuICAgICAgICAvLyByZXR1cm4gdW53cmFwSmF2YXNjcmlwdChtb2QpLmRlZmF1bHRcbiAgICB9LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZhcmlhbnRzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0ZhaWwgPSBleHBvcnRzLmlzU3VjY2VzcyA9IHZvaWQgMDtcbmZ1bmN0aW9uIGlzU3VjY2VzcyhzdWNjZXNzT3JGYWlsKSB7XG4gICAgcmV0dXJuIFwiZXJyb3JcIiBpbiBzdWNjZXNzT3JGYWlsID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuaXNTdWNjZXNzID0gaXNTdWNjZXNzO1xuZnVuY3Rpb24gaXNGYWlsKHN1Y2Nlc3NPckZhaWwpIHtcbiAgICByZXR1cm4gXCJlcnJvclwiIGluIHN1Y2Nlc3NPckZhaWwgPT09IHRydWU7XG59XG5leHBvcnRzLmlzRmFpbCA9IGlzRmFpbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZtLWludGVyZmFjZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZXEgPSBleHBvcnRzLmpzb24gPSBleHBvcnRzLnRvQnVmZmVyID0gdm9pZCAwO1xuY29uc3QgaHR0cCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiaHR0cFwiKSk7XG5jb25zdCBodHRwcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiaHR0cHNcIikpO1xuYXN5bmMgZnVuY3Rpb24gdG9CdWZmZXIoc3RyZWFtKSB7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBzdHJlYW0pIHtcbiAgICAgICAgbGVuZ3RoICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MsIGxlbmd0aCk7XG59XG5leHBvcnRzLnRvQnVmZmVyID0gdG9CdWZmZXI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuYXN5bmMgZnVuY3Rpb24ganNvbihzdHJlYW0pIHtcbiAgICBjb25zdCBidWYgPSBhd2FpdCB0b0J1ZmZlcihzdHJlYW0pO1xuICAgIGNvbnN0IHN0ciA9IGJ1Zi50b1N0cmluZygndXRmOCcpO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0cik7XG4gICAgfVxuICAgIGNhdGNoIChfZXJyKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IF9lcnI7XG4gICAgICAgIGVyci5tZXNzYWdlICs9IGAgKGlucHV0OiAke3N0cn0pYDtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn1cbmV4cG9ydHMuanNvbiA9IGpzb247XG5mdW5jdGlvbiByZXEodXJsLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBocmVmID0gdHlwZW9mIHVybCA9PT0gJ3N0cmluZycgPyB1cmwgOiB1cmwuaHJlZjtcbiAgICBjb25zdCByZXEgPSAoaHJlZi5zdGFydHNXaXRoKCdodHRwczonKSA/IGh0dHBzIDogaHR0cCkucmVxdWVzdCh1cmwsIG9wdHMpO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlcVxuICAgICAgICAgICAgLm9uY2UoJ3Jlc3BvbnNlJywgcmVzb2x2ZSlcbiAgICAgICAgICAgIC5vbmNlKCdlcnJvcicsIHJlamVjdClcbiAgICAgICAgICAgIC5lbmQoKTtcbiAgICB9KTtcbiAgICByZXEudGhlbiA9IHByb21pc2UudGhlbi5iaW5kKHByb21pc2UpO1xuICAgIHJldHVybiByZXE7XG59XG5leHBvcnRzLnJlcSA9IHJlcTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhlbHBlcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFnZW50ID0gdm9pZCAwO1xuY29uc3QgbmV0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJuZXRcIikpO1xuY29uc3QgaHR0cCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiaHR0cFwiKSk7XG5jb25zdCBodHRwc18xID0gcmVxdWlyZShcImh0dHBzXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2hlbHBlcnNcIiksIGV4cG9ydHMpO1xuY29uc3QgSU5URVJOQUwgPSBTeW1ib2woJ0FnZW50QmFzZUludGVybmFsU3RhdGUnKTtcbmNsYXNzIEFnZW50IGV4dGVuZHMgaHR0cC5BZ2VudCB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpc1tJTlRFUk5BTF0gPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhbiBgaHR0cGAgb3IgYGh0dHBzYCByZXF1ZXN0LlxuICAgICAqL1xuICAgIGlzU2VjdXJlRW5kcG9pbnQob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgdGhlIGBzZWN1cmVFbmRwb2ludGAgcHJvcGVydHkgZXhwbGljaXRseSwgc2luY2UgdGhpc1xuICAgICAgICAgICAgLy8gbWVhbnMgdGhhdCBhIHBhcmVudCBgQWdlbnRgIGlzIFwicGFzc2luZyB0aHJvdWdoXCIgdG8gdGhpcyBpbnN0YW5jZS5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VjdXJlRW5kcG9pbnQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnNlY3VyZUVuZHBvaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gZXhwbGljaXQgYHNlY3VyZWAgZW5kcG9pbnQsIGNoZWNrIGlmIGBwcm90b2NvbGAgcHJvcGVydHkgaXNcbiAgICAgICAgICAgIC8vIHNldC4gVGhpcyB3aWxsIHVzdWFsbHkgYmUgdGhlIGNhc2Ugc2luY2UgdXNpbmcgYSBmdWxsIHN0cmluZyBVUkxcbiAgICAgICAgICAgIC8vIG9yIGBVUkxgIGluc3RhbmNlIHNob3VsZCBiZSB0aGUgbW9zdCBjb21tb24gdXNhZ2UuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucHJvdG9jb2wgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZpbmFsbHksIGlmIG5vIGBwcm90b2NvbGAgcHJvcGVydHkgd2FzIHNldCwgdGhlbiBmYWxsIGJhY2sgdG9cbiAgICAgICAgLy8gY2hlY2tpbmcgdGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBjdXJyZW50IGNhbGwgc3RhY2ssIGFuZCB0cnkgdG9cbiAgICAgICAgLy8gZGV0ZWN0IHRoZSBcImh0dHBzXCIgbW9kdWxlLlxuICAgICAgICBjb25zdCB7IHN0YWNrIH0gPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzdGFjayAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBzdGFja1xuICAgICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgLnNvbWUoKGwpID0+IGwuaW5kZXhPZignKGh0dHBzLmpzOicpICE9PSAtMSB8fFxuICAgICAgICAgICAgbC5pbmRleE9mKCdub2RlOmh0dHBzOicpICE9PSAtMSk7XG4gICAgfVxuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgYXN5bmMgc2lnbmF0dXJlcyBpbiBgY29ubmVjdCgpYCBhbmQgTm9kZSdzIG5hdGl2ZVxuICAgIC8vIGNvbm5lY3Rpb24gcG9vbGluZyBpbiBgaHR0cC5BZ2VudGAsIHRoZSBhcnJheSBvZiBzb2NrZXRzIGZvciBlYWNoIG9yaWdpblxuICAgIC8vIGhhcyB0byBiZSB1cGRhdGVkIHN5bmNocm9ub3VzbHkuIFRoaXMgaXMgc28gdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgaXNcbiAgICAvLyBhY2N1cmF0ZSB3aGVuIGBhZGRSZXF1ZXN0KClgIGlzIG5leHQgY2FsbGVkLiBXZSBhY2hpZXZlIHRoaXMgYnkgY3JlYXRpbmcgYVxuICAgIC8vIGZha2Ugc29ja2V0IGFuZCBhZGRpbmcgaXQgdG8gYHNvY2tldHNbb3JpZ2luXWAgYW5kIGluY3JlbWVudGluZ1xuICAgIC8vIGB0b3RhbFNvY2tldENvdW50YC5cbiAgICBpbmNyZW1lbnRTb2NrZXRzKG5hbWUpIHtcbiAgICAgICAgLy8gSWYgYG1heFNvY2tldHNgIGFuZCBgbWF4VG90YWxTb2NrZXRzYCBhcmUgYm90aCBJbmZpbml0eSB0aGVuIHRoZXJlIGlzIG5vXG4gICAgICAgIC8vIG5lZWQgdG8gY3JlYXRlIGEgZmFrZSBzb2NrZXQgYmVjYXVzZSBOb2RlLmpzIG5hdGl2ZSBjb25uZWN0aW9uIHBvb2xpbmdcbiAgICAgICAgLy8gd2lsbCBuZXZlciBiZSBpbnZva2VkLlxuICAgICAgICBpZiAodGhpcy5tYXhTb2NrZXRzID09PSBJbmZpbml0eSAmJiB0aGlzLm1heFRvdGFsU29ja2V0cyA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsbCBpbnN0YW5jZXMgb2YgYHNvY2tldHNgIGFyZSBleHBlY3RlZCBUeXBlU2NyaXB0IGVycm9ycy4gVGhlXG4gICAgICAgIC8vIGFsdGVybmF0aXZlIGlzIHRvIGFkZCBpdCBhcyBhIHByaXZhdGUgcHJvcGVydHkgb2YgdGhpcyBjbGFzcyBidXQgdGhhdFxuICAgICAgICAvLyB3aWxsIGJyZWFrIFR5cGVTY3JpcHQgc3ViY2xhc3NpbmcuXG4gICAgICAgIGlmICghdGhpcy5zb2NrZXRzW25hbWVdKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBzb2NrZXRzYCBpcyByZWFkb25seSBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgICAgICB0aGlzLnNvY2tldHNbbmFtZV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmYWtlU29ja2V0ID0gbmV3IG5ldC5Tb2NrZXQoeyB3cml0YWJsZTogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuc29ja2V0c1tuYW1lXS5wdXNoKGZha2VTb2NrZXQpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGB0b3RhbFNvY2tldENvdW50YCBpc24ndCBkZWZpbmVkIGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgdGhpcy50b3RhbFNvY2tldENvdW50Kys7XG4gICAgICAgIHJldHVybiBmYWtlU29ja2V0O1xuICAgIH1cbiAgICBkZWNyZW1lbnRTb2NrZXRzKG5hbWUsIHNvY2tldCkge1xuICAgICAgICBpZiAoIXRoaXMuc29ja2V0c1tuYW1lXSB8fCBzb2NrZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb2NrZXRzID0gdGhpcy5zb2NrZXRzW25hbWVdO1xuICAgICAgICBjb25zdCBpbmRleCA9IHNvY2tldHMuaW5kZXhPZihzb2NrZXQpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBzb2NrZXRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yICBgdG90YWxTb2NrZXRDb3VudGAgaXNuJ3QgZGVmaW5lZCBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgICAgICB0aGlzLnRvdGFsU29ja2V0Q291bnQtLTtcbiAgICAgICAgICAgIGlmIChzb2NrZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYHNvY2tldHNgIGlzIHJlYWRvbmx5IGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zb2NrZXRzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEluIG9yZGVyIHRvIHByb3Blcmx5IHVwZGF0ZSB0aGUgc29ja2V0IHBvb2wsIHdlIG5lZWQgdG8gY2FsbCBgZ2V0TmFtZSgpYCBvblxuICAgIC8vIHRoZSBjb3JlIGBodHRwcy5BZ2VudGAgaWYgaXQgaXMgYSBzZWN1cmVFbmRwb2ludC5cbiAgICBnZXROYW1lKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgc2VjdXJlRW5kcG9pbnQgPSB0eXBlb2Ygb3B0aW9ucy5zZWN1cmVFbmRwb2ludCA9PT0gJ2Jvb2xlYW4nXG4gICAgICAgICAgICA/IG9wdGlvbnMuc2VjdXJlRW5kcG9pbnRcbiAgICAgICAgICAgIDogdGhpcy5pc1NlY3VyZUVuZHBvaW50KG9wdGlvbnMpO1xuICAgICAgICBpZiAoc2VjdXJlRW5kcG9pbnQpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYGdldE5hbWUoKWAgaXNuJ3QgZGVmaW5lZCBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgICAgICByZXR1cm4gaHR0cHNfMS5BZ2VudC5wcm90b3R5cGUuZ2V0TmFtZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYGdldE5hbWUoKWAgaXNuJ3QgZGVmaW5lZCBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgIHJldHVybiBzdXBlci5nZXROYW1lKG9wdGlvbnMpO1xuICAgIH1cbiAgICBjcmVhdGVTb2NrZXQocmVxLCBvcHRpb25zLCBjYikge1xuICAgICAgICBjb25zdCBjb25uZWN0T3B0cyA9IHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBzZWN1cmVFbmRwb2ludDogdGhpcy5pc1NlY3VyZUVuZHBvaW50KG9wdGlvbnMpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5nZXROYW1lKGNvbm5lY3RPcHRzKTtcbiAgICAgICAgY29uc3QgZmFrZVNvY2tldCA9IHRoaXMuaW5jcmVtZW50U29ja2V0cyhuYW1lKTtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuY29ubmVjdChyZXEsIGNvbm5lY3RPcHRzKSlcbiAgICAgICAgICAgIC50aGVuKChzb2NrZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50U29ja2V0cyhuYW1lLCBmYWtlU29ja2V0KTtcbiAgICAgICAgICAgIGlmIChzb2NrZXQgaW5zdGFuY2VvZiBodHRwLkFnZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgYWRkUmVxdWVzdCgpYCBpc24ndCBkZWZpbmVkIGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgICAgICAgICByZXR1cm4gc29ja2V0LmFkZFJlcXVlc3QocmVxLCBjb25uZWN0T3B0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzW0lOVEVSTkFMXS5jdXJyZW50U29ja2V0ID0gc29ja2V0O1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgY3JlYXRlU29ja2V0KClgIGlzbid0IGRlZmluZWQgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICAgICAgc3VwZXIuY3JlYXRlU29ja2V0KHJlcSwgb3B0aW9ucywgY2IpO1xuICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudFNvY2tldHMobmFtZSwgZmFrZVNvY2tldCk7XG4gICAgICAgICAgICBjYihlcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY3JlYXRlQ29ubmVjdGlvbigpIHtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdGhpc1tJTlRFUk5BTF0uY3VycmVudFNvY2tldDtcbiAgICAgICAgdGhpc1tJTlRFUk5BTF0uY3VycmVudFNvY2tldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFzb2NrZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc29ja2V0IHdhcyByZXR1cm5lZCBpbiB0aGUgYGNvbm5lY3QoKWAgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc29ja2V0O1xuICAgIH1cbiAgICBnZXQgZGVmYXVsdFBvcnQoKSB7XG4gICAgICAgIHJldHVybiAodGhpc1tJTlRFUk5BTF0uZGVmYXVsdFBvcnQgPz9cbiAgICAgICAgICAgICh0aGlzLnByb3RvY29sID09PSAnaHR0cHM6JyA/IDQ0MyA6IDgwKSk7XG4gICAgfVxuICAgIHNldCBkZWZhdWx0UG9ydCh2KSB7XG4gICAgICAgIGlmICh0aGlzW0lOVEVSTkFMXSkge1xuICAgICAgICAgICAgdGhpc1tJTlRFUk5BTF0uZGVmYXVsdFBvcnQgPSB2O1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBwcm90b2NvbCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzW0lOVEVSTkFMXS5wcm90b2NvbCA/P1xuICAgICAgICAgICAgKHRoaXMuaXNTZWN1cmVFbmRwb2ludCgpID8gJ2h0dHBzOicgOiAnaHR0cDonKSk7XG4gICAgfVxuICAgIHNldCBwcm90b2NvbCh2KSB7XG4gICAgICAgIGlmICh0aGlzW0lOVEVSTkFMXSkge1xuICAgICAgICAgICAgdGhpc1tJTlRFUk5BTF0ucHJvdG9jb2wgPSB2O1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BZ2VudCA9IEFnZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICh7b25seUZpcnN0ID0gZmFsc2V9ID0ge30pID0+IHtcblx0Y29uc3QgcGF0dGVybiA9IFtcblx0XHQnW1xcXFx1MDAxQlxcXFx1MDA5Ql1bW1xcXFxdKCkjOz9dKig/Oig/Oig/Oig/OjtbLWEtekEtWlxcXFxkXFxcXC8jJi46PT8lQH5fXSspKnxbYS16QS1aXFxcXGRdKyg/OjtbLWEtekEtWlxcXFxkXFxcXC8jJi46PT8lQH5fXSopKik/XFxcXHUwMDA3KScsXG5cdFx0Jyg/Oig/OlxcXFxkezEsNH0oPzo7XFxcXGR7MCw0fSkqKT9bXFxcXGRBLVBSLVRaY2YtbnRxcnk9Pjx+XSkpJ1xuXHRdLmpvaW4oJ3wnKTtcblxuXHRyZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuLCBvbmx5Rmlyc3QgPyB1bmRlZmluZWQgOiAnZycpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3Qgd3JhcEFuc2kxNiA9IChmbiwgb2Zmc2V0KSA9PiAoLi4uYXJncykgPT4ge1xuXHRjb25zdCBjb2RlID0gZm4oLi4uYXJncyk7XG5cdHJldHVybiBgXFx1MDAxQlske2NvZGUgKyBvZmZzZXR9bWA7XG59O1xuXG5jb25zdCB3cmFwQW5zaTI1NiA9IChmbiwgb2Zmc2V0KSA9PiAoLi4uYXJncykgPT4ge1xuXHRjb25zdCBjb2RlID0gZm4oLi4uYXJncyk7XG5cdHJldHVybiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTs1OyR7Y29kZX1tYDtcbn07XG5cbmNvbnN0IHdyYXBBbnNpMTZtID0gKGZuLCBvZmZzZXQpID0+ICguLi5hcmdzKSA9PiB7XG5cdGNvbnN0IHJnYiA9IGZuKC4uLmFyZ3MpO1xuXHRyZXR1cm4gYFxcdTAwMUJbJHszOCArIG9mZnNldH07Mjske3JnYlswXX07JHtyZ2JbMV19OyR7cmdiWzJdfW1gO1xufTtcblxuY29uc3QgYW5zaTJhbnNpID0gbiA9PiBuO1xuY29uc3QgcmdiMnJnYiA9IChyLCBnLCBiKSA9PiBbciwgZywgYl07XG5cbmNvbnN0IHNldExhenlQcm9wZXJ0eSA9IChvYmplY3QsIHByb3BlcnR5LCBnZXQpID0+IHtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHtcblx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdGNvbnN0IHZhbHVlID0gZ2V0KCk7XG5cblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCB7XG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHR9KTtcbn07XG5cbi8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnY29sb3ItY29udmVydCcpfSAqL1xubGV0IGNvbG9yQ29udmVydDtcbmNvbnN0IG1ha2VEeW5hbWljU3R5bGVzID0gKHdyYXAsIHRhcmdldFNwYWNlLCBpZGVudGl0eSwgaXNCYWNrZ3JvdW5kKSA9PiB7XG5cdGlmIChjb2xvckNvbnZlcnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdGNvbG9yQ29udmVydCA9IHJlcXVpcmUoJ2NvbG9yLWNvbnZlcnQnKTtcblx0fVxuXG5cdGNvbnN0IG9mZnNldCA9IGlzQmFja2dyb3VuZCA/IDEwIDogMDtcblx0Y29uc3Qgc3R5bGVzID0ge307XG5cblx0Zm9yIChjb25zdCBbc291cmNlU3BhY2UsIHN1aXRlXSBvZiBPYmplY3QuZW50cmllcyhjb2xvckNvbnZlcnQpKSB7XG5cdFx0Y29uc3QgbmFtZSA9IHNvdXJjZVNwYWNlID09PSAnYW5zaTE2JyA/ICdhbnNpJyA6IHNvdXJjZVNwYWNlO1xuXHRcdGlmIChzb3VyY2VTcGFjZSA9PT0gdGFyZ2V0U3BhY2UpIHtcblx0XHRcdHN0eWxlc1tuYW1lXSA9IHdyYXAoaWRlbnRpdHksIG9mZnNldCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2Ygc3VpdGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRzdHlsZXNbbmFtZV0gPSB3cmFwKHN1aXRlW3RhcmdldFNwYWNlXSwgb2Zmc2V0KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gc3R5bGVzO1xufTtcblxuZnVuY3Rpb24gYXNzZW1ibGVTdHlsZXMoKSB7XG5cdGNvbnN0IGNvZGVzID0gbmV3IE1hcCgpO1xuXHRjb25zdCBzdHlsZXMgPSB7XG5cdFx0bW9kaWZpZXI6IHtcblx0XHRcdHJlc2V0OiBbMCwgMF0sXG5cdFx0XHQvLyAyMSBpc24ndCB3aWRlbHkgc3VwcG9ydGVkIGFuZCAyMiBkb2VzIHRoZSBzYW1lIHRoaW5nXG5cdFx0XHRib2xkOiBbMSwgMjJdLFxuXHRcdFx0ZGltOiBbMiwgMjJdLFxuXHRcdFx0aXRhbGljOiBbMywgMjNdLFxuXHRcdFx0dW5kZXJsaW5lOiBbNCwgMjRdLFxuXHRcdFx0aW52ZXJzZTogWzcsIDI3XSxcblx0XHRcdGhpZGRlbjogWzgsIDI4XSxcblx0XHRcdHN0cmlrZXRocm91Z2g6IFs5LCAyOV1cblx0XHR9LFxuXHRcdGNvbG9yOiB7XG5cdFx0XHRibGFjazogWzMwLCAzOV0sXG5cdFx0XHRyZWQ6IFszMSwgMzldLFxuXHRcdFx0Z3JlZW46IFszMiwgMzldLFxuXHRcdFx0eWVsbG93OiBbMzMsIDM5XSxcblx0XHRcdGJsdWU6IFszNCwgMzldLFxuXHRcdFx0bWFnZW50YTogWzM1LCAzOV0sXG5cdFx0XHRjeWFuOiBbMzYsIDM5XSxcblx0XHRcdHdoaXRlOiBbMzcsIDM5XSxcblxuXHRcdFx0Ly8gQnJpZ2h0IGNvbG9yXG5cdFx0XHRibGFja0JyaWdodDogWzkwLCAzOV0sXG5cdFx0XHRyZWRCcmlnaHQ6IFs5MSwgMzldLFxuXHRcdFx0Z3JlZW5CcmlnaHQ6IFs5MiwgMzldLFxuXHRcdFx0eWVsbG93QnJpZ2h0OiBbOTMsIDM5XSxcblx0XHRcdGJsdWVCcmlnaHQ6IFs5NCwgMzldLFxuXHRcdFx0bWFnZW50YUJyaWdodDogWzk1LCAzOV0sXG5cdFx0XHRjeWFuQnJpZ2h0OiBbOTYsIDM5XSxcblx0XHRcdHdoaXRlQnJpZ2h0OiBbOTcsIDM5XVxuXHRcdH0sXG5cdFx0YmdDb2xvcjoge1xuXHRcdFx0YmdCbGFjazogWzQwLCA0OV0sXG5cdFx0XHRiZ1JlZDogWzQxLCA0OV0sXG5cdFx0XHRiZ0dyZWVuOiBbNDIsIDQ5XSxcblx0XHRcdGJnWWVsbG93OiBbNDMsIDQ5XSxcblx0XHRcdGJnQmx1ZTogWzQ0LCA0OV0sXG5cdFx0XHRiZ01hZ2VudGE6IFs0NSwgNDldLFxuXHRcdFx0YmdDeWFuOiBbNDYsIDQ5XSxcblx0XHRcdGJnV2hpdGU6IFs0NywgNDldLFxuXG5cdFx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRcdGJnQmxhY2tCcmlnaHQ6IFsxMDAsIDQ5XSxcblx0XHRcdGJnUmVkQnJpZ2h0OiBbMTAxLCA0OV0sXG5cdFx0XHRiZ0dyZWVuQnJpZ2h0OiBbMTAyLCA0OV0sXG5cdFx0XHRiZ1llbGxvd0JyaWdodDogWzEwMywgNDldLFxuXHRcdFx0YmdCbHVlQnJpZ2h0OiBbMTA0LCA0OV0sXG5cdFx0XHRiZ01hZ2VudGFCcmlnaHQ6IFsxMDUsIDQ5XSxcblx0XHRcdGJnQ3lhbkJyaWdodDogWzEwNiwgNDldLFxuXHRcdFx0YmdXaGl0ZUJyaWdodDogWzEwNywgNDldXG5cdFx0fVxuXHR9O1xuXG5cdC8vIEFsaWFzIGJyaWdodCBibGFjayBhcyBncmF5IChhbmQgZ3JleSlcblx0c3R5bGVzLmNvbG9yLmdyYXkgPSBzdHlsZXMuY29sb3IuYmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5iZ0NvbG9yLmJnR3JheSA9IHN0eWxlcy5iZ0NvbG9yLmJnQmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5jb2xvci5ncmV5ID0gc3R5bGVzLmNvbG9yLmJsYWNrQnJpZ2h0O1xuXHRzdHlsZXMuYmdDb2xvci5iZ0dyZXkgPSBzdHlsZXMuYmdDb2xvci5iZ0JsYWNrQnJpZ2h0O1xuXG5cdGZvciAoY29uc3QgW2dyb3VwTmFtZSwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKHN0eWxlcykpIHtcblx0XHRmb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhncm91cCkpIHtcblx0XHRcdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdFx0XHRvcGVuOiBgXFx1MDAxQlske3N0eWxlWzBdfW1gLFxuXHRcdFx0XHRjbG9zZTogYFxcdTAwMUJbJHtzdHlsZVsxXX1tYFxuXHRcdFx0fTtcblxuXHRcdFx0Z3JvdXBbc3R5bGVOYW1lXSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG5cdFx0XHRjb2Rlcy5zZXQoc3R5bGVbMF0sIHN0eWxlWzFdKTtcblx0XHR9XG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCBncm91cE5hbWUsIHtcblx0XHRcdHZhbHVlOiBncm91cCxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fSk7XG5cdH1cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCAnY29kZXMnLCB7XG5cdFx0dmFsdWU6IGNvZGVzLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdH0pO1xuXG5cdHN0eWxlcy5jb2xvci5jbG9zZSA9ICdcXHUwMDFCWzM5bSc7XG5cdHN0eWxlcy5iZ0NvbG9yLmNsb3NlID0gJ1xcdTAwMUJbNDltJztcblxuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmNvbG9yLCAnYW5zaScsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMTYsICdhbnNpMTYnLCBhbnNpMmFuc2ksIGZhbHNlKSk7XG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuY29sb3IsICdhbnNpMjU2JywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kyNTYsICdhbnNpMjU2JywgYW5zaTJhbnNpLCBmYWxzZSkpO1xuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmNvbG9yLCAnYW5zaTE2bScsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMTZtLCAncmdiJywgcmdiMnJnYiwgZmFsc2UpKTtcblx0c2V0TGF6eVByb3BlcnR5KHN0eWxlcy5iZ0NvbG9yLCAnYW5zaScsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMTYsICdhbnNpMTYnLCBhbnNpMmFuc2ksIHRydWUpKTtcblx0c2V0TGF6eVByb3BlcnR5KHN0eWxlcy5iZ0NvbG9yLCAnYW5zaTI1NicsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMjU2LCAnYW5zaTI1NicsIGFuc2kyYW5zaSwgdHJ1ZSkpO1xuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmJnQ29sb3IsICdhbnNpMTZtJywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kxNm0sICdyZ2InLCByZ2IycmdiLCB0cnVlKSk7XG5cblx0cmV0dXJuIHN0eWxlcztcbn1cblxuLy8gTWFrZSB0aGUgZXhwb3J0IGltbXV0YWJsZVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgJ2V4cG9ydHMnLCB7XG5cdGVudW1lcmFibGU6IHRydWUsXG5cdGdldDogYXNzZW1ibGVTdHlsZXNcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xudmFyIHNoYXJlZF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi9zaGFyZWRcIikpO1xudmFyIGVzN18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZXM3XCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoZXM3XzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICBkZWYoXCJOb29wXCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJEb0V4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgW2RlZihcIlN0YXRlbWVudFwiKV0pO1xuICAgIGRlZihcIlN1cGVyXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiQmluZEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvYmplY3RcIiwgXCJjYWxsZWVcIilcbiAgICAgICAgLmZpZWxkKFwib2JqZWN0XCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJjYWxsZWVcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiRGVjb3JhdG9yXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIlByb3BlcnR5XCIpXG4gICAgICAgIC5maWVsZChcImRlY29yYXRvcnNcIiwgb3IoW2RlZihcIkRlY29yYXRvclwiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIk1ldGhvZERlZmluaXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwiZGVjb3JhdG9yc1wiLCBvcihbZGVmKFwiRGVjb3JhdG9yXCIpXSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiTWV0YVByb3BlcnR5XCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwibWV0YVwiLCBcInByb3BlcnR5XCIpXG4gICAgICAgIC5maWVsZChcIm1ldGFcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydHlcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25cIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiSW1wb3J0U3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJpbXBvcnRlZFwiLCBcImxvY2FsXCIpXG4gICAgICAgIC5maWVsZChcImltcG9ydGVkXCIsIGRlZihcIklkZW50aWZpZXJcIikpO1xuICAgIGRlZihcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTW9kdWxlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5idWlsZChcImxvY2FsXCIpO1xuICAgIGRlZihcIkltcG9ydE5hbWVzcGFjZVNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJNb2R1bGVTcGVjaWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwibG9jYWxcIik7XG4gICAgZGVmKFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcImRlY2xhcmF0aW9uXCIsIG9yKGRlZihcIkRlY2xhcmF0aW9uXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSk7XG4gICAgZGVmKFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJkZWNsYXJhdGlvblwiLCBcInNwZWNpZmllcnNcIiwgXCJzb3VyY2VcIilcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyYXRpb25cIiwgb3IoZGVmKFwiRGVjbGFyYXRpb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJzcGVjaWZpZXJzXCIsIFtkZWYoXCJFeHBvcnRTcGVjaWZpZXJcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiRXhwb3J0U3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJsb2NhbFwiLCBcImV4cG9ydGVkXCIpXG4gICAgICAgIC5maWVsZChcImV4cG9ydGVkXCIsIGRlZihcIklkZW50aWZpZXJcIikpO1xuICAgIGRlZihcIkV4cG9ydE5hbWVzcGFjZVNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJTcGVjaWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwb3J0ZWRcIilcbiAgICAgICAgLmZpZWxkKFwiZXhwb3J0ZWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiRXhwb3J0RGVmYXVsdFNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJTcGVjaWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwb3J0ZWRcIilcbiAgICAgICAgLmZpZWxkKFwiZXhwb3J0ZWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwb3J0ZWRcIiwgXCJzb3VyY2VcIilcbiAgICAgICAgLmZpZWxkKFwiZXhwb3J0ZWRcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInNvdXJjZVwiLCBkZWYoXCJMaXRlcmFsXCIpKTtcbiAgICBkZWYoXCJDb21tZW50QmxvY2tcIilcbiAgICAgICAgLmJhc2VzKFwiQ29tbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCAvKm9wdGlvbmFsOiovIFwibGVhZGluZ1wiLCBcInRyYWlsaW5nXCIpO1xuICAgIGRlZihcIkNvbW1lbnRMaW5lXCIpXG4gICAgICAgIC5iYXNlcyhcIkNvbW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIiwgLypvcHRpb25hbDoqLyBcImxlYWRpbmdcIiwgXCJ0cmFpbGluZ1wiKTtcbiAgICBkZWYoXCJEaXJlY3RpdmVcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJEaXJlY3RpdmVMaXRlcmFsXCIpKTtcbiAgICBkZWYoXCJEaXJlY3RpdmVMaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIiwgXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIFN0cmluZywgZGVmYXVsdHNbXCJ1c2Ugc3RyaWN0XCJdKTtcbiAgICBkZWYoXCJJbnRlcnByZXRlckRpcmVjdGl2ZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIFN0cmluZyk7XG4gICAgZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbZGVmKFwiU3RhdGVtZW50XCIpXSlcbiAgICAgICAgLmZpZWxkKFwiZGlyZWN0aXZlc1wiLCBbZGVmKFwiRGlyZWN0aXZlXCIpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSk7XG4gICAgZGVmKFwiUHJvZ3JhbVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbZGVmKFwiU3RhdGVtZW50XCIpXSlcbiAgICAgICAgLmZpZWxkKFwiZGlyZWN0aXZlc1wiLCBbZGVmKFwiRGlyZWN0aXZlXCIpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwiaW50ZXJwcmV0ZXJcIiwgb3IoZGVmKFwiSW50ZXJwcmV0ZXJEaXJlY3RpdmVcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIC8vIFNwbGl0IExpdGVyYWxcbiAgICBkZWYoXCJTdHJpbmdMaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIkxpdGVyYWxcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJOdW1lcmljTGl0ZXJhbFwiKVxuICAgICAgICAuYmFzZXMoXCJMaXRlcmFsXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIE51bWJlcilcbiAgICAgICAgLmZpZWxkKFwicmF3XCIsIG9yKFN0cmluZywgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiZXh0cmFcIiwge1xuICAgICAgICByYXdWYWx1ZTogTnVtYmVyLFxuICAgICAgICByYXc6IFN0cmluZ1xuICAgIH0sIGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYXdWYWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgICAgICAgIHJhdzogdGhpcy52YWx1ZSArIFwiXCJcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBkZWYoXCJCaWdJbnRMaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIkxpdGVyYWxcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLy8gT25seSBTdHJpbmcgcmVhbGx5IHNlZW1zIGFwcHJvcHJpYXRlIGhlcmUsIHNpbmNlIEJpZ0ludCB2YWx1ZXNcbiAgICAgICAgLy8gb2Z0ZW4gZXhjZWVkIHRoZSBsaW1pdHMgb2YgSlMgbnVtYmVycy5cbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgb3IoU3RyaW5nLCBOdW1iZXIpKVxuICAgICAgICAuZmllbGQoXCJleHRyYVwiLCB7XG4gICAgICAgIHJhd1ZhbHVlOiBTdHJpbmcsXG4gICAgICAgIHJhdzogU3RyaW5nXG4gICAgfSwgZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhd1ZhbHVlOiBTdHJpbmcodGhpcy52YWx1ZSksXG4gICAgICAgICAgICByYXc6IHRoaXMudmFsdWUgKyBcIm5cIlxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGRlZihcIk51bGxMaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIkxpdGVyYWxcIilcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgbnVsbCwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJCb29sZWFuTGl0ZXJhbFwiKVxuICAgICAgICAuYmFzZXMoXCJMaXRlcmFsXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIEJvb2xlYW4pO1xuICAgIGRlZihcIlJlZ0V4cExpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiTGl0ZXJhbFwiKVxuICAgICAgICAuYnVpbGQoXCJwYXR0ZXJuXCIsIFwiZmxhZ3NcIilcbiAgICAgICAgLmZpZWxkKFwicGF0dGVyblwiLCBTdHJpbmcpXG4gICAgICAgIC5maWVsZChcImZsYWdzXCIsIFN0cmluZylcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgUmVnRXhwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHRoaXMucGF0dGVybiwgdGhpcy5mbGFncyk7XG4gICAgfSk7XG4gICAgdmFyIE9iamVjdEV4cHJlc3Npb25Qcm9wZXJ0eSA9IG9yKGRlZihcIlByb3BlcnR5XCIpLCBkZWYoXCJPYmplY3RNZXRob2RcIiksIGRlZihcIk9iamVjdFByb3BlcnR5XCIpLCBkZWYoXCJTcHJlYWRQcm9wZXJ0eVwiKSwgZGVmKFwiU3ByZWFkRWxlbWVudFwiKSk7XG4gICAgLy8gU3BsaXQgUHJvcGVydHkgLT4gT2JqZWN0UHJvcGVydHkgYW5kIE9iamVjdE1ldGhvZFxuICAgIGRlZihcIk9iamVjdEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJwcm9wZXJ0aWVzXCIpXG4gICAgICAgIC5maWVsZChcInByb3BlcnRpZXNcIiwgW09iamVjdEV4cHJlc3Npb25Qcm9wZXJ0eV0pO1xuICAgIC8vIE9iamVjdE1ldGhvZCBob2lzdCAudmFsdWUgcHJvcGVydGllcyB0byBvd24gcHJvcGVydGllc1xuICAgIGRlZihcIk9iamVjdE1ldGhvZFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIsIFwiRnVuY3Rpb25cIilcbiAgICAgICAgLmJ1aWxkKFwia2luZFwiLCBcImtleVwiLCBcInBhcmFtc1wiLCBcImJvZHlcIiwgXCJjb21wdXRlZFwiKVxuICAgICAgICAuZmllbGQoXCJraW5kXCIsIG9yKFwibWV0aG9kXCIsIFwiZ2V0XCIsIFwic2V0XCIpKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInBhcmFtc1wiLCBbZGVmKFwiUGF0dGVyblwiKV0pXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIikpXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImdlbmVyYXRvclwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJhc3luY1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJhY2Nlc3NpYmlsaXR5XCIsIC8vIFR5cGVTY3JpcHRcbiAgICBvcihkZWYoXCJMaXRlcmFsXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJkZWNvcmF0b3JzXCIsIG9yKFtkZWYoXCJEZWNvcmF0b3JcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJPYmplY3RQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImtleVwiLCBcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgZGVmKFwiUGF0dGVyblwiKSkpXG4gICAgICAgIC5maWVsZChcImFjY2Vzc2liaWxpdHlcIiwgLy8gVHlwZVNjcmlwdFxuICAgIG9yKGRlZihcIkxpdGVyYWxcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIHZhciBDbGFzc0JvZHlFbGVtZW50ID0gb3IoZGVmKFwiTWV0aG9kRGVmaW5pdGlvblwiKSwgZGVmKFwiVmFyaWFibGVEZWNsYXJhdG9yXCIpLCBkZWYoXCJDbGFzc1Byb3BlcnR5RGVmaW5pdGlvblwiKSwgZGVmKFwiQ2xhc3NQcm9wZXJ0eVwiKSwgZGVmKFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIiksIGRlZihcIkNsYXNzTWV0aG9kXCIpLCBkZWYoXCJDbGFzc1ByaXZhdGVNZXRob2RcIikpO1xuICAgIC8vIE1ldGhvZERlZmluaXRpb24gLT4gQ2xhc3NNZXRob2RcbiAgICBkZWYoXCJDbGFzc0JvZHlcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIFtDbGFzc0JvZHlFbGVtZW50XSk7XG4gICAgZGVmKFwiQ2xhc3NNZXRob2RcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJGdW5jdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJraW5kXCIsIFwia2V5XCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcImNvbXB1dGVkXCIsIFwic3RhdGljXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSk7XG4gICAgZGVmKFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiRnVuY3Rpb25cIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcImtpbmRcIiwgXCJjb21wdXRlZFwiLCBcInN0YXRpY1wiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgZGVmKFwiUHJpdmF0ZU5hbWVcIikpO1xuICAgIFtcIkNsYXNzTWV0aG9kXCIsXG4gICAgICAgIFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIsXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlTmFtZSkge1xuICAgICAgICBkZWYodHlwZU5hbWUpXG4gICAgICAgICAgICAuZmllbGQoXCJraW5kXCIsIG9yKFwiZ2V0XCIsIFwic2V0XCIsIFwibWV0aG9kXCIsIFwiY29uc3RydWN0b3JcIiksIGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwibWV0aG9kXCI7IH0pXG4gICAgICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkJsb2NrU3RhdGVtZW50XCIpKVxuICAgICAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgICAgIC5maWVsZChcInN0YXRpY1wiLCBvcihCb29sZWFuLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwiYWJzdHJhY3RcIiwgb3IoQm9vbGVhbiwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgICAgIC5maWVsZChcImFjY2Vzc1wiLCBvcihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgICAgIC5maWVsZChcImFjY2Vzc2liaWxpdHlcIiwgb3IoXCJwdWJsaWNcIiwgXCJwcml2YXRlXCIsIFwicHJvdGVjdGVkXCIsIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgICAgICAuZmllbGQoXCJkZWNvcmF0b3JzXCIsIG9yKFtkZWYoXCJEZWNvcmF0b3JcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgb3IoQm9vbGVhbiwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgfSk7XG4gICAgZGVmKFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiQ2xhc3NQcm9wZXJ0eVwiKVxuICAgICAgICAuYnVpbGQoXCJrZXlcIiwgXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgZGVmKFwiUHJpdmF0ZU5hbWVcIikpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlByaXZhdGVOYW1lXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIiwgXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpO1xuICAgIHZhciBPYmplY3RQYXR0ZXJuUHJvcGVydHkgPSBvcihkZWYoXCJQcm9wZXJ0eVwiKSwgZGVmKFwiUHJvcGVydHlQYXR0ZXJuXCIpLCBkZWYoXCJTcHJlYWRQcm9wZXJ0eVBhdHRlcm5cIiksIGRlZihcIlNwcmVhZFByb3BlcnR5XCIpLCAvLyBVc2VkIGJ5IEVzcHJpbWFcbiAgICBkZWYoXCJPYmplY3RQcm9wZXJ0eVwiKSwgLy8gQmFiZWwgNlxuICAgIGRlZihcIlJlc3RQcm9wZXJ0eVwiKSAvLyBCYWJlbCA2XG4gICAgKTtcbiAgICAvLyBTcGxpdCBpbnRvIFJlc3RQcm9wZXJ0eSBhbmQgU3ByZWFkUHJvcGVydHlcbiAgICBkZWYoXCJPYmplY3RQYXR0ZXJuXCIpXG4gICAgICAgIC5iYXNlcyhcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwicHJvcGVydGllc1wiKVxuICAgICAgICAuZmllbGQoXCJwcm9wZXJ0aWVzXCIsIFtPYmplY3RQYXR0ZXJuUHJvcGVydHldKVxuICAgICAgICAuZmllbGQoXCJkZWNvcmF0b3JzXCIsIG9yKFtkZWYoXCJEZWNvcmF0b3JcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJTcHJlYWRQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIlJlc3RQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIkZvckF3YWl0U3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgb3IoZGVmKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInJpZ2h0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiU3RhdGVtZW50XCIpKTtcbiAgICAvLyBUaGUgY2FsbGVlIG5vZGUgb2YgYSBkeW5hbWljIGltcG9ydCguLi4pIGV4cHJlc3Npb24uXG4gICAgZGVmKFwiSW1wb3J0XCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKCk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgYmFiZWxfY29yZV8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vYmFiZWwtY29yZVwiKSk7XG52YXIgZmxvd18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZmxvd1wiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIGZvcmsudXNlKGJhYmVsX2NvcmVfMS5kZWZhdWx0KTtcbiAgICBmb3JrLnVzZShmbG93XzEuZGVmYXVsdCk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xudmFyIHNoYXJlZF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi9zaGFyZWRcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBUeXBlID0gdHlwZXMuVHlwZTtcbiAgICB2YXIgZGVmID0gVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gVHlwZS5vcjtcbiAgICB2YXIgc2hhcmVkID0gZm9yay51c2Uoc2hhcmVkXzEuZGVmYXVsdCk7XG4gICAgdmFyIGRlZmF1bHRzID0gc2hhcmVkLmRlZmF1bHRzO1xuICAgIHZhciBnZXEgPSBzaGFyZWQuZ2VxO1xuICAgIC8vIEFic3RyYWN0IHN1cGVydHlwZSBvZiBhbGwgc3ludGFjdGljIGVudGl0aWVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gaGF2ZSBhXG4gICAgLy8gLmxvYyBmaWVsZC5cbiAgICBkZWYoXCJQcmludGFibGVcIilcbiAgICAgICAgLmZpZWxkKFwibG9jXCIsIG9yKGRlZihcIlNvdXJjZUxvY2F0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdLCB0cnVlKTtcbiAgICBkZWYoXCJOb2RlXCIpXG4gICAgICAgIC5iYXNlcyhcIlByaW50YWJsZVwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlXCIsIFN0cmluZylcbiAgICAgICAgLmZpZWxkKFwiY29tbWVudHNcIiwgb3IoW2RlZihcIkNvbW1lbnRcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdLCB0cnVlKTtcbiAgICBkZWYoXCJTb3VyY2VMb2NhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJzdGFydFwiLCBkZWYoXCJQb3NpdGlvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiZW5kXCIsIGRlZihcIlBvc2l0aW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgb3IoU3RyaW5nLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJQb3NpdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJsaW5lXCIsIGdlcSgxKSlcbiAgICAgICAgLmZpZWxkKFwiY29sdW1uXCIsIGdlcSgwKSk7XG4gICAgZGVmKFwiRmlsZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInByb2dyYW1cIiwgXCJuYW1lXCIpXG4gICAgICAgIC5maWVsZChcInByb2dyYW1cIiwgZGVmKFwiUHJvZ3JhbVwiKSlcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBvcihTdHJpbmcsIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlByb2dyYW1cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgW2RlZihcIlN0YXRlbWVudFwiKV0pO1xuICAgIGRlZihcIkZ1bmN0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJQYXR0ZXJuXCIpXSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJCbG9ja1N0YXRlbWVudFwiKSlcbiAgICAgICAgLmZpZWxkKFwiZ2VuZXJhdG9yXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImFzeW5jXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIlN0YXRlbWVudFwiKS5iYXNlcyhcIk5vZGVcIik7XG4gICAgLy8gVGhlIGVtcHR5IC5idWlsZCgpIGhlcmUgbWVhbnMgdGhhdCBhbiBFbXB0eVN0YXRlbWVudCBjYW4gYmUgY29uc3RydWN0ZWRcbiAgICAvLyAoaS5lLiBpdCdzIG5vdCBhYnN0cmFjdCkgYnV0IHRoYXQgaXQgbmVlZHMgbm8gYXJndW1lbnRzLlxuICAgIGRlZihcIkVtcHR5U3RhdGVtZW50XCIpLmJhc2VzKFwiU3RhdGVtZW50XCIpLmJ1aWxkKCk7XG4gICAgZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbZGVmKFwiU3RhdGVtZW50XCIpXSk7XG4gICAgLy8gVE9ETyBGaWd1cmUgb3V0IGhvdyB0byBzaWxlbnRseSBjb2VyY2UgRXhwcmVzc2lvbnMgdG9cbiAgICAvLyBFeHByZXNzaW9uU3RhdGVtZW50cyB3aGVyZSBhIFN0YXRlbWVudCB3YXMgZXhwZWN0ZWQuXG4gICAgZGVmKFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIklmU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJ0ZXN0XCIsIFwiY29uc2VxdWVudFwiLCBcImFsdGVybmF0ZVwiKVxuICAgICAgICAuZmllbGQoXCJ0ZXN0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImNvbnNlcXVlbnRcIiwgZGVmKFwiU3RhdGVtZW50XCIpKVxuICAgICAgICAuZmllbGQoXCJhbHRlcm5hdGVcIiwgb3IoZGVmKFwiU3RhdGVtZW50XCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJMYWJlbGVkU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJsYWJlbFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwibGFiZWxcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIGRlZihcIkJyZWFrU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJsYWJlbFwiKVxuICAgICAgICAuZmllbGQoXCJsYWJlbFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJDb250aW51ZVN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwibGFiZWxcIilcbiAgICAgICAgLmZpZWxkKFwibGFiZWxcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiV2l0aFN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwib2JqZWN0XCIsIFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJvYmplY3RcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIGRlZihcIlN3aXRjaFN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiZGlzY3JpbWluYW50XCIsIFwiY2FzZXNcIiwgXCJsZXhpY2FsXCIpXG4gICAgICAgIC5maWVsZChcImRpc2NyaW1pbmFudFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJjYXNlc1wiLCBbZGVmKFwiU3dpdGNoQ2FzZVwiKV0pXG4gICAgICAgIC5maWVsZChcImxleGljYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiUmV0dXJuU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSk7XG4gICAgZGVmKFwiVGhyb3dTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIlRyeVN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiYmxvY2tcIiwgXCJoYW5kbGVyXCIsIFwiZmluYWxpemVyXCIpXG4gICAgICAgIC5maWVsZChcImJsb2NrXCIsIGRlZihcIkJsb2NrU3RhdGVtZW50XCIpKVxuICAgICAgICAuZmllbGQoXCJoYW5kbGVyXCIsIG9yKGRlZihcIkNhdGNoQ2xhdXNlXCIpLCBudWxsKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycyAmJiB0aGlzLmhhbmRsZXJzWzBdIHx8IG51bGw7XG4gICAgfSlcbiAgICAgICAgLmZpZWxkKFwiaGFuZGxlcnNcIiwgW2RlZihcIkNhdGNoQ2xhdXNlXCIpXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyID8gW3RoaXMuaGFuZGxlcl0gOiBbXTtcbiAgICB9LCB0cnVlKSAvLyBJbmRpY2F0ZXMgdGhpcyBmaWVsZCBpcyBoaWRkZW4gZnJvbSBlYWNoRmllbGQgaXRlcmF0aW9uLlxuICAgICAgICAuZmllbGQoXCJndWFyZGVkSGFuZGxlcnNcIiwgW2RlZihcIkNhdGNoQ2xhdXNlXCIpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwiZmluYWxpemVyXCIsIG9yKGRlZihcIkJsb2NrU3RhdGVtZW50XCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJDYXRjaENsYXVzZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtXCIsIFwiZ3VhcmRcIiwgXCJib2R5XCIpXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9wdGlvbmFsLWNhdGNoLWJpbmRpbmdcbiAgICAgICAgLmZpZWxkKFwicGFyYW1cIiwgb3IoZGVmKFwiUGF0dGVyblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiZ3VhcmRcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJCbG9ja1N0YXRlbWVudFwiKSk7XG4gICAgZGVmKFwiV2hpbGVTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcInRlc3RcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcInRlc3RcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIGRlZihcIkRvV2hpbGVTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIiwgXCJ0ZXN0XCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiU3RhdGVtZW50XCIpKVxuICAgICAgICAuZmllbGQoXCJ0ZXN0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIkZvclN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiaW5pdFwiLCBcInRlc3RcIiwgXCJ1cGRhdGVcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImluaXRcIiwgb3IoZGVmKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInRlc3RcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInVwZGF0ZVwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIGRlZihcIkZvckluU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgb3IoZGVmKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInJpZ2h0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiU3RhdGVtZW50XCIpKTtcbiAgICBkZWYoXCJEZWJ1Z2dlclN0YXRlbWVudFwiKS5iYXNlcyhcIlN0YXRlbWVudFwiKS5idWlsZCgpO1xuICAgIGRlZihcIkRlY2xhcmF0aW9uXCIpLmJhc2VzKFwiU3RhdGVtZW50XCIpO1xuICAgIGRlZihcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRnVuY3Rpb25cIiwgXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInBhcmFtc1wiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiRnVuY3Rpb25FeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZ1bmN0aW9uXCIsIFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInBhcmFtc1wiLCBcImJvZHlcIik7XG4gICAgZGVmKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJraW5kXCIsIFwiZGVjbGFyYXRpb25zXCIpXG4gICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJ2YXJcIiwgXCJsZXRcIiwgXCJjb25zdFwiKSlcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyYXRpb25zXCIsIFtkZWYoXCJWYXJpYWJsZURlY2xhcmF0b3JcIildKTtcbiAgICBkZWYoXCJWYXJpYWJsZURlY2xhcmF0b3JcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImluaXRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiUGF0dGVyblwiKSlcbiAgICAgICAgLmZpZWxkKFwiaW5pdFwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJFeHByZXNzaW9uXCIpLmJhc2VzKFwiTm9kZVwiKTtcbiAgICBkZWYoXCJUaGlzRXhwcmVzc2lvblwiKS5iYXNlcyhcIkV4cHJlc3Npb25cIikuYnVpbGQoKTtcbiAgICBkZWYoXCJBcnJheUV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJlbGVtZW50c1wiKVxuICAgICAgICAuZmllbGQoXCJlbGVtZW50c1wiLCBbb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCldKTtcbiAgICBkZWYoXCJPYmplY3RFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwicHJvcGVydGllc1wiKVxuICAgICAgICAuZmllbGQoXCJwcm9wZXJ0aWVzXCIsIFtkZWYoXCJQcm9wZXJ0eVwiKV0pO1xuICAgIC8vIFRPRE8gTm90IGluIHRoZSBNb3ppbGxhIFBhcnNlciBBUEksIGJ1dCB1c2VkIGJ5IEVzcHJpbWEuXG4gICAgZGVmKFwiUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKSAvLyBXYW50IHRvIGJlIGFibGUgdG8gdmlzaXQgUHJvcGVydHkgTm9kZXMuXG4gICAgICAgIC5idWlsZChcImtpbmRcIiwgXCJrZXlcIiwgXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJraW5kXCIsIG9yKFwiaW5pdFwiLCBcImdldFwiLCBcInNldFwiKSlcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIGRlZihcIklkZW50aWZpZXJcIikpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJTZXF1ZW5jZUV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uc1wiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uc1wiLCBbZGVmKFwiRXhwcmVzc2lvblwiKV0pO1xuICAgIHZhciBVbmFyeU9wZXJhdG9yID0gb3IoXCItXCIsIFwiK1wiLCBcIiFcIiwgXCJ+XCIsIFwidHlwZW9mXCIsIFwidm9pZFwiLCBcImRlbGV0ZVwiKTtcbiAgICBkZWYoXCJVbmFyeUV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvcGVyYXRvclwiLCBcImFyZ3VtZW50XCIsIFwicHJlZml4XCIpXG4gICAgICAgIC5maWVsZChcIm9wZXJhdG9yXCIsIFVuYXJ5T3BlcmF0b3IpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC8vIEVzcHJpbWEgZG9lc24ndCBib3RoZXIgd2l0aCB0aGlzIGZpZWxkLCBwcmVzdW1hYmx5IGJlY2F1c2UgaXQnc1xuICAgICAgICAvLyBhbHdheXMgdHJ1ZSBmb3IgdW5hcnkgb3BlcmF0b3JzLlxuICAgICAgICAuZmllbGQoXCJwcmVmaXhcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJ0cnVlXCJdKTtcbiAgICB2YXIgQmluYXJ5T3BlcmF0b3IgPSBvcihcIj09XCIsIFwiIT1cIiwgXCI9PT1cIiwgXCIhPT1cIiwgXCI8XCIsIFwiPD1cIiwgXCI+XCIsIFwiPj1cIiwgXCI8PFwiLCBcIj4+XCIsIFwiPj4+XCIsIFwiK1wiLCBcIi1cIiwgXCIqXCIsIFwiL1wiLCBcIiVcIiwgXCIqKlwiLCBcIiZcIiwgLy8gVE9ETyBNaXNzaW5nIGZyb20gdGhlIFBhcnNlciBBUEkuXG4gICAgXCJ8XCIsIFwiXlwiLCBcImluXCIsIFwiaW5zdGFuY2VvZlwiKTtcbiAgICBkZWYoXCJCaW5hcnlFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwib3BlcmF0b3JcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgQmluYXJ5T3BlcmF0b3IpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgdmFyIEFzc2lnbm1lbnRPcGVyYXRvciA9IG9yKFwiPVwiLCBcIis9XCIsIFwiLT1cIiwgXCIqPVwiLCBcIi89XCIsIFwiJT1cIiwgXCI8PD1cIiwgXCI+Pj1cIiwgXCI+Pj49XCIsIFwifD1cIiwgXCJePVwiLCBcIiY9XCIpO1xuICAgIGRlZihcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwib3BlcmF0b3JcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgQXNzaWdubWVudE9wZXJhdG9yKVxuICAgICAgICAuZmllbGQoXCJsZWZ0XCIsIG9yKGRlZihcIlBhdHRlcm5cIiksIGRlZihcIk1lbWJlckV4cHJlc3Npb25cIikpKVxuICAgICAgICAuZmllbGQoXCJyaWdodFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICB2YXIgVXBkYXRlT3BlcmF0b3IgPSBvcihcIisrXCIsIFwiLS1cIik7XG4gICAgZGVmKFwiVXBkYXRlRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9wZXJhdG9yXCIsIFwiYXJndW1lbnRcIiwgXCJwcmVmaXhcIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgVXBkYXRlT3BlcmF0b3IpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInByZWZpeFwiLCBCb29sZWFuKTtcbiAgICB2YXIgTG9naWNhbE9wZXJhdG9yID0gb3IoXCJ8fFwiLCBcIiYmXCIpO1xuICAgIGRlZihcIkxvZ2ljYWxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwib3BlcmF0b3JcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgTG9naWNhbE9wZXJhdG9yKVxuICAgICAgICAuZmllbGQoXCJsZWZ0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInJpZ2h0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInRlc3RcIiwgXCJjb25zZXF1ZW50XCIsIFwiYWx0ZXJuYXRlXCIpXG4gICAgICAgIC5maWVsZChcInRlc3RcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29uc2VxdWVudFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJhbHRlcm5hdGVcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiTmV3RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImNhbGxlZVwiLCBcImFyZ3VtZW50c1wiKVxuICAgICAgICAuZmllbGQoXCJjYWxsZWVcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLy8gVGhlIE1vemlsbGEgUGFyc2VyIEFQSSBnaXZlcyB0aGlzIHR5cGUgYXMgW29yKGRlZihcIkV4cHJlc3Npb25cIiksXG4gICAgICAgIC8vIG51bGwpXSwgYnV0IG51bGwgdmFsdWVzIGRvbid0IHJlYWxseSBtYWtlIHNlbnNlIGF0IHRoZSBjYWxsIHNpdGUuXG4gICAgICAgIC8vIFRPRE8gUmVwb3J0IHRoaXMgbm9uc2Vuc2UuXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50c1wiLCBbZGVmKFwiRXhwcmVzc2lvblwiKV0pO1xuICAgIGRlZihcIkNhbGxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiY2FsbGVlXCIsIFwiYXJndW1lbnRzXCIpXG4gICAgICAgIC5maWVsZChcImNhbGxlZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAvLyBTZWUgY29tbWVudCBmb3IgTmV3RXhwcmVzc2lvbiBhYm92ZS5cbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRzXCIsIFtkZWYoXCJFeHByZXNzaW9uXCIpXSk7XG4gICAgZGVmKFwiTWVtYmVyRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9iamVjdFwiLCBcInByb3BlcnR5XCIsIFwiY29tcHV0ZWRcIilcbiAgICAgICAgLmZpZWxkKFwib2JqZWN0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInByb3BlcnR5XCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIkV4cHJlc3Npb25cIikpKVxuICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0eXBlID0gdGhpcy5wcm9wZXJ0eS50eXBlO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ0xpdGVyYWwnIHx8XG4gICAgICAgICAgICB0eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicgfHxcbiAgICAgICAgICAgIHR5cGUgPT09ICdCaW5hcnlFeHByZXNzaW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIGRlZihcIlBhdHRlcm5cIikuYmFzZXMoXCJOb2RlXCIpO1xuICAgIGRlZihcIlN3aXRjaENhc2VcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJ0ZXN0XCIsIFwiY29uc2VxdWVudFwiKVxuICAgICAgICAuZmllbGQoXCJ0ZXN0XCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJjb25zZXF1ZW50XCIsIFtkZWYoXCJTdGF0ZW1lbnRcIildKTtcbiAgICBkZWYoXCJJZGVudGlmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIiwgXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcIm5hbWVcIilcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBTdHJpbmcpXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIkxpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBvcihTdHJpbmcsIEJvb2xlYW4sIG51bGwsIE51bWJlciwgUmVnRXhwKSlcbiAgICAgICAgLmZpZWxkKFwicmVnZXhcIiwgb3Ioe1xuICAgICAgICBwYXR0ZXJuOiBTdHJpbmcsXG4gICAgICAgIGZsYWdzOiBTdHJpbmdcbiAgICB9LCBudWxsKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgdmFyIGZsYWdzID0gXCJcIjtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLmlnbm9yZUNhc2UpXG4gICAgICAgICAgICAgICAgZmxhZ3MgKz0gXCJpXCI7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZS5tdWx0aWxpbmUpXG4gICAgICAgICAgICAgICAgZmxhZ3MgKz0gXCJtXCI7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZS5nbG9iYWwpXG4gICAgICAgICAgICAgICAgZmxhZ3MgKz0gXCJnXCI7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhdHRlcm46IHRoaXMudmFsdWUuc291cmNlLFxuICAgICAgICAgICAgICAgIGZsYWdzOiBmbGFnc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICAvLyBBYnN0cmFjdCAobm9uLWJ1aWxkYWJsZSkgY29tbWVudCBzdXBlcnR5cGUuIE5vdCBhIE5vZGUuXG4gICAgZGVmKFwiQ29tbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJQcmludGFibGVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgU3RyaW5nKVxuICAgICAgICAvLyBBIC5sZWFkaW5nIGNvbW1lbnQgY29tZXMgYmVmb3JlIHRoZSBub2RlLCB3aGVyZWFzIGEgLnRyYWlsaW5nXG4gICAgICAgIC8vIGNvbW1lbnQgY29tZXMgYWZ0ZXIgaXQuIFRoZXNlIHR3byBmaWVsZHMgc2hvdWxkIG5vdCBib3RoIGJlIHRydWUsXG4gICAgICAgIC8vIGJ1dCB0aGV5IG1pZ2h0IGJvdGggYmUgZmFsc2Ugd2hlbiB0aGUgY29tbWVudCBmYWxscyBpbnNpZGUgYSBub2RlXG4gICAgICAgIC8vIGFuZCB0aGUgbm9kZSBoYXMgbm8gY2hpbGRyZW4gZm9yIHRoZSBjb21tZW50IHRvIGxlYWQgb3IgdHJhaWwsXG4gICAgICAgIC8vIGUuZy4geyAvKmRhbmdsaW5nKi8gfS5cbiAgICAgICAgLmZpZWxkKFwibGVhZGluZ1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcInRydWVcIl0pXG4gICAgICAgIC5maWVsZChcInRyYWlsaW5nXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3R5cGVzXCIpKTtcbnZhciBzaGFyZWRfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvc2hhcmVkXCIpKTtcbnZhciBjb3JlXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9jb3JlXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoY29yZV8xLmRlZmF1bHQpO1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIFR5cGUgPSB0eXBlcy5UeXBlO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICB2YXIgb3IgPSBUeXBlLm9yO1xuICAgIHZhciBzaGFyZWQgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmYXVsdHMgPSBzaGFyZWQuZGVmYXVsdHM7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb3B0aW9uYWwtY2hhaW5pbmdcbiAgICAvLyBgYT8uYmAgYXMgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9lc3RyZWUvZXN0cmVlL2lzc3Vlcy8xNDZcbiAgICBkZWYoXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiTWVtYmVyRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvYmplY3RcIiwgXCJwcm9wZXJ0eVwiLCBcImNvbXB1dGVkXCIsIFwib3B0aW9uYWxcIilcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJ0cnVlXCJdKTtcbiAgICAvLyBhPy5iKClcbiAgICBkZWYoXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkNhbGxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImNhbGxlZVwiLCBcImFyZ3VtZW50c1wiLCBcIm9wdGlvbmFsXCIpXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1widHJ1ZVwiXSk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgLy8gYGEgPz8gYmAgYXMgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJ5bG9uL3B1bGwvNzYxL2ZpbGVzXG4gICAgdmFyIExvZ2ljYWxPcGVyYXRvciA9IG9yKFwifHxcIiwgXCImJlwiLCBcIj8/XCIpO1xuICAgIGRlZihcIkxvZ2ljYWxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcIm9wZXJhdG9yXCIsIExvZ2ljYWxPcGVyYXRvcik7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgZXM3XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9lczdcIikpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3R5cGVzXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoZXM3XzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgZGVmKFwiSW1wb3J0RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInNvdXJjZVwiKVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgY29yZV8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vY29yZVwiKSk7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xudmFyIHNoYXJlZF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi9zaGFyZWRcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICBmb3JrLnVzZShjb3JlXzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICBkZWYoXCJGdW5jdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJnZW5lcmF0b3JcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJkZWZhdWx0c1wiLCBbb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCldLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAvLyBUT0RPIFRoaXMgY291bGQgYmUgcmVwcmVzZW50ZWQgYXMgYSBSZXN0RWxlbWVudCBpbiAucGFyYW1zLlxuICAgICAgICAuZmllbGQoXCJyZXN0XCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIC8vIFRoZSBFU1RyZWUgd2F5IG9mIHJlcHJlc2VudGluZyBhIC4uLnJlc3QgcGFyYW1ldGVyLlxuICAgIGRlZihcIlJlc3RFbGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwiYXJndW1lbnRcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiUGF0dGVyblwiKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgLy8gZm9yIEJhYnlsb24uIEZsb3cgcGFyc2VyIHB1dHMgaXQgb24gdGhlIGlkZW50aWZpZXJcbiAgICBvcihkZWYoXCJUeXBlQW5ub3RhdGlvblwiKSwgZGVmKFwiVFNUeXBlQW5ub3RhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiU3ByZWFkRWxlbWVudFBhdHRlcm5cIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJQYXR0ZXJuXCIpKTtcbiAgICBkZWYoXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcImdlbmVyYXRvclwiLCBcImV4cHJlc3Npb25cIik7XG4gICAgZGVmKFwiRnVuY3Rpb25FeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcImdlbmVyYXRvclwiLCBcImV4cHJlc3Npb25cIik7XG4gICAgLy8gVGhlIFBhcnNlciBBUEkgY2FsbHMgdGhpcyBBcnJvd0V4cHJlc3Npb24sIGJ1dCBFc3ByaW1hIGFuZCBhbGwgb3RoZXJcbiAgICAvLyBhY3R1YWwgcGFyc2VycyB1c2UgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24uXG4gICAgZGVmKFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRnVuY3Rpb25cIiwgXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtc1wiLCBcImJvZHlcIiwgXCJleHByZXNzaW9uXCIpXG4gICAgICAgIC8vIFRoZSBmb3JjZWQgbnVsbCB2YWx1ZSBoZXJlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3ZlcnJpZGRlblxuICAgICAgICAvLyBkZWZpbml0aW9uIG9mIHRoZSBcImlkXCIgZmllbGQgaW4gdGhlIEZ1bmN0aW9uIGludGVyZmFjZS5cbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgbnVsbCwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAvLyBBcnJvdyBmdW5jdGlvbiBib2RpZXMgYXJlIGFsbG93ZWQgdG8gYmUgZXhwcmVzc2lvbnMuXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgb3IoZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIiksIGRlZihcIkV4cHJlc3Npb25cIikpKVxuICAgICAgICAvLyBUaGUgY3VycmVudCBzcGVjIGZvcmJpZHMgYXJyb3cgZ2VuZXJhdG9ycywgc28gSSBoYXZlIHRha2VuIHRoZVxuICAgICAgICAvLyBsaWJlcnR5IG9mIGVuZm9yY2luZyB0aGF0LiBUT0RPIFJlcG9ydCB0aGlzLlxuICAgICAgICAuZmllbGQoXCJnZW5lcmF0b3JcIiwgZmFsc2UsIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIkZvck9mU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgb3IoZGVmKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSwgZGVmKFwiUGF0dGVyblwiKSkpXG4gICAgICAgIC5maWVsZChcInJpZ2h0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiU3RhdGVtZW50XCIpKTtcbiAgICBkZWYoXCJZaWVsZEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiLCBcImRlbGVnYXRlXCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJkZWxlZ2F0ZVwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJHZW5lcmF0b3JFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiLCBcImJsb2Nrc1wiLCBcImZpbHRlclwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImJsb2Nrc1wiLCBbZGVmKFwiQ29tcHJlaGVuc2lvbkJsb2NrXCIpXSlcbiAgICAgICAgLmZpZWxkKFwiZmlsdGVyXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKTtcbiAgICBkZWYoXCJDb21wcmVoZW5zaW9uRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIiwgXCJibG9ja3NcIiwgXCJmaWx0ZXJcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJibG9ja3NcIiwgW2RlZihcIkNvbXByZWhlbnNpb25CbG9ja1wiKV0pXG4gICAgICAgIC5maWVsZChcImZpbHRlclwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSk7XG4gICAgZGVmKFwiQ29tcHJlaGVuc2lvbkJsb2NrXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwibGVmdFwiLCBcInJpZ2h0XCIsIFwiZWFjaFwiKVxuICAgICAgICAuZmllbGQoXCJsZWZ0XCIsIGRlZihcIlBhdHRlcm5cIikpXG4gICAgICAgIC5maWVsZChcInJpZ2h0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImVhY2hcIiwgQm9vbGVhbik7XG4gICAgZGVmKFwiUHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIkV4cHJlc3Npb25cIikpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBkZWYoXCJQYXR0ZXJuXCIpKSlcbiAgICAgICAgLmZpZWxkKFwibWV0aG9kXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcInNob3J0aGFuZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJPYmplY3RQcm9wZXJ0eVwiKVxuICAgICAgICAuZmllbGQoXCJzaG9ydGhhbmRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiUHJvcGVydHlQYXR0ZXJuXCIpXG4gICAgICAgIC5iYXNlcyhcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIsIFwicGF0dGVyblwiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInBhdHRlcm5cIiwgZGVmKFwiUGF0dGVyblwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiT2JqZWN0UGF0dGVyblwiKVxuICAgICAgICAuYmFzZXMoXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcInByb3BlcnRpZXNcIilcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydGllc1wiLCBbb3IoZGVmKFwiUHJvcGVydHlQYXR0ZXJuXCIpLCBkZWYoXCJQcm9wZXJ0eVwiKSldKTtcbiAgICBkZWYoXCJBcnJheVBhdHRlcm5cIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJlbGVtZW50c1wiKVxuICAgICAgICAuZmllbGQoXCJlbGVtZW50c1wiLCBbb3IoZGVmKFwiUGF0dGVyblwiKSwgbnVsbCldKTtcbiAgICBkZWYoXCJNZXRob2REZWZpbml0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImtpbmRcIiwgXCJrZXlcIiwgXCJ2YWx1ZVwiLCBcInN0YXRpY1wiKVxuICAgICAgICAuZmllbGQoXCJraW5kXCIsIG9yKFwiY29uc3RydWN0b3JcIiwgXCJtZXRob2RcIiwgXCJnZXRcIiwgXCJzZXRcIikpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJGdW5jdGlvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwic3RhdGljXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIlNwcmVhZEVsZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJBcnJheUV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiZWxlbWVudHNcIiwgW29yKGRlZihcIkV4cHJlc3Npb25cIiksIGRlZihcIlNwcmVhZEVsZW1lbnRcIiksIGRlZihcIlJlc3RFbGVtZW50XCIpLCBudWxsKV0pO1xuICAgIGRlZihcIk5ld0V4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRzXCIsIFtvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBkZWYoXCJTcHJlYWRFbGVtZW50XCIpKV0pO1xuICAgIGRlZihcIkNhbGxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50c1wiLCBbb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgZGVmKFwiU3ByZWFkRWxlbWVudFwiKSldKTtcbiAgICAvLyBOb3RlOiB0aGlzIG5vZGUgdHlwZSBpcyAqbm90KiBhbiBBc3NpZ25tZW50RXhwcmVzc2lvbiB3aXRoIGEgUGF0dGVybiBvblxuICAgIC8vIHRoZSBsZWZ0LWhhbmQgc2lkZSEgVGhlIGV4aXN0aW5nIEFzc2lnbm1lbnRFeHByZXNzaW9uIHR5cGUgYWxyZWFkeVxuICAgIC8vIHN1cHBvcnRzIGRlc3RydWN0dXJpbmcgYXNzaWdubWVudHMuIEFzc2lnbm1lbnRQYXR0ZXJuIG5vZGVzIG1heSBhcHBlYXJcbiAgICAvLyB3aGVyZXZlciBhIFBhdHRlcm4gaXMgYWxsb3dlZCwgYW5kIHRoZSByaWdodC1oYW5kIHNpZGUgcmVwcmVzZW50cyBhXG4gICAgLy8gZGVmYXVsdCB2YWx1ZSB0byBiZSBkZXN0cnVjdHVyZWQgYWdhaW5zdCB0aGUgbGVmdC1oYW5kIHNpZGUsIGlmIG5vXG4gICAgLy8gdmFsdWUgaXMgb3RoZXJ3aXNlIHByb3ZpZGVkLiBGb3IgZXhhbXBsZTogZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzLlxuICAgIGRlZihcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpXG4gICAgICAgIC5iYXNlcyhcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwibGVmdFwiLCBcInJpZ2h0XCIpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgZGVmKFwiUGF0dGVyblwiKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgdmFyIENsYXNzQm9keUVsZW1lbnQgPSBvcihkZWYoXCJNZXRob2REZWZpbml0aW9uXCIpLCBkZWYoXCJWYXJpYWJsZURlY2xhcmF0b3JcIiksIGRlZihcIkNsYXNzUHJvcGVydHlEZWZpbml0aW9uXCIpLCBkZWYoXCJDbGFzc1Byb3BlcnR5XCIpKTtcbiAgICBkZWYoXCJDbGFzc1Byb3BlcnR5XCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImtleVwiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIkNsYXNzUHJvcGVydHlEZWZpbml0aW9uXCIpIC8vIHN0YXRpYyBwcm9wZXJ0eVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJkZWZpbml0aW9uXCIpXG4gICAgICAgIC8vIFllcywgVmlyZ2luaWEsIGNpcmN1bGFyIGRlZmluaXRpb25zIGFyZSBwZXJtaXR0ZWQuXG4gICAgICAgIC5maWVsZChcImRlZmluaXRpb25cIiwgQ2xhc3NCb2R5RWxlbWVudCk7XG4gICAgZGVmKFwiQ2xhc3NCb2R5XCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbQ2xhc3NCb2R5RWxlbWVudF0pO1xuICAgIGRlZihcIkNsYXNzRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJib2R5XCIsIFwic3VwZXJDbGFzc1wiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJDbGFzc0JvZHlcIikpXG4gICAgICAgIC5maWVsZChcInN1cGVyQ2xhc3NcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiQ2xhc3NFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJib2R5XCIsIFwic3VwZXJDbGFzc1wiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkNsYXNzQm9keVwiKSlcbiAgICAgICAgLmZpZWxkKFwic3VwZXJDbGFzc1wiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICAvLyBTcGVjaWZpZXIgYW5kIE1vZHVsZVNwZWNpZmllciBhcmUgYWJzdHJhY3Qgbm9uLXN0YW5kYXJkIHR5cGVzXG4gICAgLy8gaW50cm9kdWNlZCBmb3IgZGVmaW5pdGlvbmFsIGNvbnZlbmllbmNlLlxuICAgIGRlZihcIlNwZWNpZmllclwiKS5iYXNlcyhcIk5vZGVcIik7XG4gICAgLy8gVGhpcyBzdXBlcnR5cGUgaXMgc2hhcmVkL2FidXNlZCBieSBib3RoIGRlZi9iYWJlbC5qcyBhbmRcbiAgICAvLyBkZWYvZXNwcmltYS5qcy4gSW4gdGhlIGZ1dHVyZSwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBsb2FkIG9ubHkgb25lIHNldFxuICAgIC8vIG9mIGRlZmluaXRpb25zIGFwcHJvcHJpYXRlIGZvciBhIGdpdmVuIHBhcnNlciwgYnV0IHVudGlsIHRoZW4gd2UgbXVzdFxuICAgIC8vIHJlbHkgb24gZGVmYXVsdCBmdW5jdGlvbnMgdG8gcmVjb25jaWxlIHRoZSBjb25mbGljdGluZyBBU1QgZm9ybWF0cy5cbiAgICBkZWYoXCJNb2R1bGVTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiU3BlY2lmaWVyXCIpXG4gICAgICAgIC8vIFRoaXMgbG9jYWwgZmllbGQgaXMgdXNlZCBieSBCYWJlbC9BY29ybi4gSXQgc2hvdWxkIG5vdCB0ZWNobmljYWxseVxuICAgICAgICAvLyBiZSBvcHRpb25hbCBpbiB0aGUgQmFiZWwvQWNvcm4gQVNUIGZvcm1hdCwgYnV0IGl0IG11c3QgYmUgb3B0aW9uYWxcbiAgICAgICAgLy8gaW4gdGhlIEVzcHJpbWEgQVNUIGZvcm1hdC5cbiAgICAgICAgLmZpZWxkKFwibG9jYWxcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLy8gVGhlIGlkIGFuZCBuYW1lIGZpZWxkcyBhcmUgdXNlZCBieSBFc3ByaW1hLiBUaGUgaWQgZmllbGQgc2hvdWxkIG5vdFxuICAgICAgICAvLyB0ZWNobmljYWxseSBiZSBvcHRpb25hbCBpbiB0aGUgRXNwcmltYSBBU1QgZm9ybWF0LCBidXQgaXQgbXVzdCBiZVxuICAgICAgICAvLyBvcHRpb25hbCBpbiB0aGUgQmFiZWwvQWNvcm4gQVNUIGZvcm1hdC5cbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICAvLyBMaWtlIE1vZHVsZVNwZWNpZmllciwgZXhjZXB0IHR5cGU6XCJJbXBvcnRTcGVjaWZpZXJcIiBhbmQgYnVpbGRhYmxlLlxuICAgIC8vIGltcG9ydCB7PGlkIFthcyBuYW1lXT59IGZyb20gLi4uO1xuICAgIGRlZihcIkltcG9ydFNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJNb2R1bGVTcGVjaWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJuYW1lXCIpO1xuICAgIC8vIGltcG9ydCA8KiBhcyBpZD4gZnJvbSAuLi47XG4gICAgZGVmKFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiKTtcbiAgICAvLyBpbXBvcnQgPGlkPiBmcm9tIC4uLjtcbiAgICBkZWYoXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiKTtcbiAgICBkZWYoXCJJbXBvcnREZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJzcGVjaWZpZXJzXCIsIFwic291cmNlXCIsIFwiaW1wb3J0S2luZFwiKVxuICAgICAgICAuZmllbGQoXCJzcGVjaWZpZXJzXCIsIFtvcihkZWYoXCJJbXBvcnRTcGVjaWZpZXJcIiksIGRlZihcIkltcG9ydE5hbWVzcGFjZVNwZWNpZmllclwiKSwgZGVmKFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiKSldLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgZGVmKFwiTGl0ZXJhbFwiKSlcbiAgICAgICAgLmZpZWxkKFwiaW1wb3J0S2luZFwiLCBvcihcInZhbHVlXCIsIFwidHlwZVwiKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJ2YWx1ZVwiO1xuICAgIH0pO1xuICAgIGRlZihcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInRhZ1wiLCBcInF1YXNpXCIpXG4gICAgICAgIC5maWVsZChcInRhZ1wiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJxdWFzaVwiLCBkZWYoXCJUZW1wbGF0ZUxpdGVyYWxcIikpO1xuICAgIGRlZihcIlRlbXBsYXRlTGl0ZXJhbFwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInF1YXNpc1wiLCBcImV4cHJlc3Npb25zXCIpXG4gICAgICAgIC5maWVsZChcInF1YXNpc1wiLCBbZGVmKFwiVGVtcGxhdGVFbGVtZW50XCIpXSlcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvbnNcIiwgW2RlZihcIkV4cHJlc3Npb25cIildKTtcbiAgICBkZWYoXCJUZW1wbGF0ZUVsZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCBcInRhaWxcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgeyBcImNvb2tlZFwiOiBTdHJpbmcsIFwicmF3XCI6IFN0cmluZyB9KVxuICAgICAgICAuZmllbGQoXCJ0YWlsXCIsIEJvb2xlYW4pO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIGVzNl8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZXM2XCIpKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIGZvcmsudXNlKGVzNl8xLmRlZmF1bHQpO1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIGRlZiA9IHR5cGVzLlR5cGUuZGVmO1xuICAgIHZhciBvciA9IHR5cGVzLlR5cGUub3I7XG4gICAgdmFyIGRlZmF1bHRzID0gZm9yay51c2Uoc2hhcmVkXzEuZGVmYXVsdCkuZGVmYXVsdHM7XG4gICAgZGVmKFwiRnVuY3Rpb25cIilcbiAgICAgICAgLmZpZWxkKFwiYXN5bmNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiU3ByZWFkUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJPYmplY3RFeHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcInByb3BlcnRpZXNcIiwgW29yKGRlZihcIlByb3BlcnR5XCIpLCBkZWYoXCJTcHJlYWRQcm9wZXJ0eVwiKSwgZGVmKFwiU3ByZWFkRWxlbWVudFwiKSldKTtcbiAgICBkZWYoXCJTcHJlYWRQcm9wZXJ0eVBhdHRlcm5cIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJQYXR0ZXJuXCIpKTtcbiAgICBkZWYoXCJPYmplY3RQYXR0ZXJuXCIpXG4gICAgICAgIC5maWVsZChcInByb3BlcnRpZXNcIiwgW29yKGRlZihcIlByb3BlcnR5XCIpLCBkZWYoXCJQcm9wZXJ0eVBhdHRlcm5cIiksIGRlZihcIlNwcmVhZFByb3BlcnR5UGF0dGVyblwiKSldKTtcbiAgICBkZWYoXCJBd2FpdEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiLCBcImFsbFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwiYWxsXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIGVzN18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZXM3XCIpKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIGZvcmsudXNlKGVzN18xLmRlZmF1bHQpO1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIGRlZmF1bHRzID0gZm9yay51c2Uoc2hhcmVkXzEuZGVmYXVsdCkuZGVmYXVsdHM7XG4gICAgdmFyIGRlZiA9IHR5cGVzLlR5cGUuZGVmO1xuICAgIHZhciBvciA9IHR5cGVzLlR5cGUub3I7XG4gICAgZGVmKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJhdGlvbnNcIiwgW29yKGRlZihcIlZhcmlhYmxlRGVjbGFyYXRvclwiKSwgZGVmKFwiSWRlbnRpZmllclwiKSAvLyBFc3ByaW1hIGRldmlhdGlvbi5cbiAgICAgICAgKV0pO1xuICAgIGRlZihcIlByb3BlcnR5XCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIGRlZihcIlBhdHRlcm5cIikgLy8gRXNwcmltYSBkZXZpYXRpb24uXG4gICAgKSk7XG4gICAgZGVmKFwiQXJyYXlQYXR0ZXJuXCIpXG4gICAgICAgIC5maWVsZChcImVsZW1lbnRzXCIsIFtvcihkZWYoXCJQYXR0ZXJuXCIpLCBkZWYoXCJTcHJlYWRFbGVtZW50XCIpLCBudWxsKV0pO1xuICAgIGRlZihcIk9iamVjdFBhdHRlcm5cIilcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydGllc1wiLCBbb3IoZGVmKFwiUHJvcGVydHlcIiksIGRlZihcIlByb3BlcnR5UGF0dGVyblwiKSwgZGVmKFwiU3ByZWFkUHJvcGVydHlQYXR0ZXJuXCIpLCBkZWYoXCJTcHJlYWRQcm9wZXJ0eVwiKSAvLyBVc2VkIGJ5IEVzcHJpbWEuXG4gICAgICAgICldKTtcbiAgICAvLyBMaWtlIE1vZHVsZVNwZWNpZmllciwgZXhjZXB0IHR5cGU6XCJFeHBvcnRTcGVjaWZpZXJcIiBhbmQgYnVpbGRhYmxlLlxuICAgIC8vIGV4cG9ydCB7PGlkIFthcyBuYW1lXT59IFtmcm9tIC4uLl07XG4gICAgZGVmKFwiRXhwb3J0U3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcIm5hbWVcIik7XG4gICAgLy8gZXhwb3J0IDwqPiBmcm9tIC4uLjtcbiAgICBkZWYoXCJFeHBvcnRCYXRjaFNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJTcGVjaWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiRXhwb3J0RGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZGVmYXVsdFwiLCBcImRlY2xhcmF0aW9uXCIsIFwic3BlY2lmaWVyc1wiLCBcInNvdXJjZVwiKVxuICAgICAgICAuZmllbGQoXCJkZWZhdWx0XCIsIEJvb2xlYW4pXG4gICAgICAgIC5maWVsZChcImRlY2xhcmF0aW9uXCIsIG9yKGRlZihcIkRlY2xhcmF0aW9uXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpLCAvLyBJbXBsaWVzIGRlZmF1bHQuXG4gICAgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInNwZWNpZmllcnNcIiwgW29yKGRlZihcIkV4cG9ydFNwZWNpZmllclwiKSwgZGVmKFwiRXhwb3J0QmF0Y2hTcGVjaWZpZXJcIikpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwic291cmNlXCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkJsb2NrXCIpXG4gICAgICAgIC5iYXNlcyhcIkNvbW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIiwgLypvcHRpb25hbDoqLyBcImxlYWRpbmdcIiwgXCJ0cmFpbGluZ1wiKTtcbiAgICBkZWYoXCJMaW5lXCIpXG4gICAgICAgIC5iYXNlcyhcIkNvbW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIiwgLypvcHRpb25hbDoqLyBcImxlYWRpbmdcIiwgXCJ0cmFpbGluZ1wiKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciBlczdfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2VzN1wiKSk7XG52YXIgdHlwZV9hbm5vdGF0aW9uc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdHlwZS1hbm5vdGF0aW9uc1wiKSk7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xudmFyIHNoYXJlZF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi9zaGFyZWRcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICBmb3JrLnVzZShlczdfMS5kZWZhdWx0KTtcbiAgICBmb3JrLnVzZSh0eXBlX2Fubm90YXRpb25zXzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICAvLyBCYXNlIHR5cGVzXG4gICAgZGVmKFwiRmxvd1wiKS5iYXNlcyhcIk5vZGVcIik7XG4gICAgZGVmKFwiRmxvd1R5cGVcIikuYmFzZXMoXCJGbG93XCIpO1xuICAgIC8vIFR5cGUgYW5ub3RhdGlvbnNcbiAgICBkZWYoXCJBbnlUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIk1peGVkVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiVm9pZFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIk51bWJlclR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCBcInJhd1wiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBOdW1iZXIpXG4gICAgICAgIC5maWVsZChcInJhd1wiLCBTdHJpbmcpO1xuICAgIC8vIEJhYnlsb24gNiBkaWZmZXJzIGluIEFTVCBmcm9tIEZsb3dcbiAgICAvLyBzYW1lIGFzIE51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvblxuICAgIGRlZihcIk51bWVyaWNMaXRlcmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIiwgXCJyYXdcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgTnVtYmVyKVxuICAgICAgICAuZmllbGQoXCJyYXdcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJTdHJpbmdUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJTdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIiwgXCJyYXdcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgU3RyaW5nKVxuICAgICAgICAuZmllbGQoXCJyYXdcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJCb29sZWFuVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiQm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCBcInJhd1wiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBCb29sZWFuKVxuICAgICAgICAuZmllbGQoXCJyYXdcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIkZsb3dUeXBlXCIpKTtcbiAgICBkZWYoXCJOdWxsYWJsZVR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIkZsb3dUeXBlXCIpKTtcbiAgICBkZWYoXCJOdWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIk51bGxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJUaGlzVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiRXhpc3RzVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiRXhpc3RlbnRpYWxUeXBlUGFyYW1cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbXNcIiwgXCJyZXR1cm5UeXBlXCIsIFwicmVzdFwiLCBcInR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5maWVsZChcInBhcmFtc1wiLCBbZGVmKFwiRnVuY3Rpb25UeXBlUGFyYW1cIildKVxuICAgICAgICAuZmllbGQoXCJyZXR1cm5UeXBlXCIsIGRlZihcIkZsb3dUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJyZXN0XCIsIG9yKGRlZihcIkZ1bmN0aW9uVHlwZVBhcmFtXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLCBudWxsKSk7XG4gICAgZGVmKFwiRnVuY3Rpb25UeXBlUGFyYW1cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIsIFwidHlwZUFubm90YXRpb25cIiwgXCJvcHRpb25hbFwiKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIkZsb3dUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBCb29sZWFuKTtcbiAgICBkZWYoXCJBcnJheVR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImVsZW1lbnRUeXBlXCIpXG4gICAgICAgIC5maWVsZChcImVsZW1lbnRUeXBlXCIsIGRlZihcIkZsb3dUeXBlXCIpKTtcbiAgICBkZWYoXCJPYmplY3RUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJwcm9wZXJ0aWVzXCIsIFwiaW5kZXhlcnNcIiwgXCJjYWxsUHJvcGVydGllc1wiKVxuICAgICAgICAuZmllbGQoXCJwcm9wZXJ0aWVzXCIsIFtcbiAgICAgICAgb3IoZGVmKFwiT2JqZWN0VHlwZVByb3BlcnR5XCIpLCBkZWYoXCJPYmplY3RUeXBlU3ByZWFkUHJvcGVydHlcIikpXG4gICAgXSlcbiAgICAgICAgLmZpZWxkKFwiaW5kZXhlcnNcIiwgW2RlZihcIk9iamVjdFR5cGVJbmRleGVyXCIpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwiY2FsbFByb3BlcnRpZXNcIiwgW2RlZihcIk9iamVjdFR5cGVDYWxsUHJvcGVydHlcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJpbmV4YWN0XCIsIG9yKEJvb2xlYW4sIHZvaWQgMCksIGRlZmF1bHRzW1widW5kZWZpbmVkXCJdKVxuICAgICAgICAuZmllbGQoXCJleGFjdFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJpbnRlcm5hbFNsb3RzXCIsIFtkZWYoXCJPYmplY3RUeXBlSW50ZXJuYWxTbG90XCIpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSk7XG4gICAgZGVmKFwiVmFyaWFuY2VcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJraW5kXCIpXG4gICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJwbHVzXCIsIFwibWludXNcIikpO1xuICAgIHZhciBMZWdhY3lWYXJpYW5jZSA9IG9yKGRlZihcIlZhcmlhbmNlXCIpLCBcInBsdXNcIiwgXCJtaW51c1wiLCBudWxsKTtcbiAgICBkZWYoXCJPYmplY3RUeXBlUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJrZXlcIiwgXCJ2YWx1ZVwiLCBcIm9wdGlvbmFsXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpKSlcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgZGVmKFwiRmxvd1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIEJvb2xlYW4pXG4gICAgICAgIC5maWVsZChcInZhcmlhbmNlXCIsIExlZ2FjeVZhcmlhbmNlLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIk9iamVjdFR5cGVJbmRleGVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJrZXlcIiwgXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgZGVmKFwiRmxvd1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIGRlZihcIkZsb3dUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJ2YXJpYW5jZVwiLCBMZWdhY3lWYXJpYW5jZSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJPYmplY3RUeXBlQ2FsbFByb3BlcnR5XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgZGVmKFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiKSlcbiAgICAgICAgLmZpZWxkKFwic3RhdGljXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwicXVhbGlmaWNhdGlvblwiLCBcImlkXCIpXG4gICAgICAgIC5maWVsZChcInF1YWxpZmljYXRpb25cIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiUXVhbGlmaWVkVHlwZUlkZW50aWZpZXJcIikpKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKTtcbiAgICBkZWYoXCJHZW5lcmljVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJRdWFsaWZpZWRUeXBlSWRlbnRpZmllclwiKSkpXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJzXCIsIG9yKGRlZihcIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLCBudWxsKSk7XG4gICAgZGVmKFwiTWVtYmVyVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwib2JqZWN0XCIsIFwicHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwib2JqZWN0XCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcInByb3BlcnR5XCIsIG9yKGRlZihcIk1lbWJlclR5cGVBbm5vdGF0aW9uXCIpLCBkZWYoXCJHZW5lcmljVHlwZUFubm90YXRpb25cIikpKTtcbiAgICBkZWYoXCJVbmlvblR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVzXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVzXCIsIFtkZWYoXCJGbG93VHlwZVwiKV0pO1xuICAgIGRlZihcIkludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVzXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVzXCIsIFtkZWYoXCJGbG93VHlwZVwiKV0pO1xuICAgIGRlZihcIlR5cGVvZlR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkZsb3dUeXBlXCIpKTtcbiAgICBkZWYoXCJPYmplY3RUeXBlU3ByZWFkUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJGbG93VHlwZVwiKSk7XG4gICAgZGVmKFwiT2JqZWN0VHlwZUludGVybmFsU2xvdFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwidmFsdWVcIiwgXCJvcHRpb25hbFwiLCBcInN0YXRpY1wiLCBcIm1ldGhvZFwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJGbG93VHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbilcbiAgICAgICAgLmZpZWxkKFwic3RhdGljXCIsIEJvb2xlYW4pXG4gICAgICAgIC5maWVsZChcIm1ldGhvZFwiLCBCb29sZWFuKTtcbiAgICBkZWYoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbXNcIilcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJUeXBlUGFyYW1ldGVyXCIpXSk7XG4gICAgZGVmKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbXNcIilcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJGbG93VHlwZVwiKV0pO1xuICAgIGRlZihcIlR5cGVQYXJhbWV0ZXJcIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwibmFtZVwiLCBcInZhcmlhbmNlXCIsIFwiYm91bmRcIilcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBTdHJpbmcpXG4gICAgICAgIC5maWVsZChcInZhcmlhbmNlXCIsIExlZ2FjeVZhcmlhbmNlLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcImJvdW5kXCIsIG9yKGRlZihcIlR5cGVBbm5vdGF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJDbGFzc1Byb3BlcnR5XCIpXG4gICAgICAgIC5maWVsZChcInZhcmlhbmNlXCIsIExlZ2FjeVZhcmlhbmNlLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkNsYXNzSW1wbGVtZW50c1wiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcInN1cGVyQ2xhc3NcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkludGVyZmFjZVR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIiwgXCJleHRlbmRzXCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiT2JqZWN0VHlwZUFubm90YXRpb25cIikpXG4gICAgICAgIC5maWVsZChcImV4dGVuZHNcIiwgb3IoW2RlZihcIkludGVyZmFjZUV4dGVuZHNcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImJvZHlcIiwgXCJleHRlbmRzXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJzXCIsIG9yKGRlZihcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJPYmplY3RUeXBlQW5ub3RhdGlvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiZXh0ZW5kc1wiLCBbZGVmKFwiSW50ZXJmYWNlRXh0ZW5kc1wiKV0pO1xuICAgIGRlZihcIkRlY2xhcmVJbnRlcmZhY2VcIilcbiAgICAgICAgLmJhc2VzKFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJib2R5XCIsIFwiZXh0ZW5kc1wiKTtcbiAgICBkZWYoXCJJbnRlcmZhY2VFeHRlbmRzXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlR5cGVBbGlhc1wiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInR5cGVQYXJhbWV0ZXJzXCIsIFwicmlnaHRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRmxvd1R5cGVcIikpO1xuICAgIGRlZihcIk9wYXF1ZVR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcImltcGx0eXBlXCIsIFwic3VwZXJ0eXBlXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJzXCIsIG9yKGRlZihcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcImltcGx0eXBlXCIsIGRlZihcIkZsb3dUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJzdXBlcnR5cGVcIiwgZGVmKFwiRmxvd1R5cGVcIikpO1xuICAgIGRlZihcIkRlY2xhcmVUeXBlQWxpYXNcIilcbiAgICAgICAgLmJhc2VzKFwiVHlwZUFsaWFzXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJyaWdodFwiKTtcbiAgICBkZWYoXCJEZWNsYXJlT3BhcXVlVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUeXBlQWxpYXNcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInN1cGVydHlwZVwiKTtcbiAgICBkZWYoXCJUeXBlQ2FzdEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uXCIsIFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBkZWYoXCJUeXBlQW5ub3RhdGlvblwiKSk7XG4gICAgZGVmKFwiVHVwbGVUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ0eXBlc1wiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlc1wiLCBbZGVmKFwiRmxvd1R5cGVcIildKTtcbiAgICBkZWYoXCJEZWNsYXJlVmFyaWFibGVcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpO1xuICAgIGRlZihcIkRlY2xhcmVGdW5jdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiRGVjbGFyZUNsYXNzXCIpXG4gICAgICAgIC5iYXNlcyhcIkludGVyZmFjZURlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpO1xuICAgIGRlZihcIkRlY2xhcmVNb2R1bGVcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJMaXRlcmFsXCIpKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJCbG9ja1N0YXRlbWVudFwiKSk7XG4gICAgZGVmKFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlR5cGVBbm5vdGF0aW9uXCIpKTtcbiAgICBkZWYoXCJEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZGVmYXVsdFwiLCBcImRlY2xhcmF0aW9uXCIsIFwic3BlY2lmaWVyc1wiLCBcInNvdXJjZVwiKVxuICAgICAgICAuZmllbGQoXCJkZWZhdWx0XCIsIEJvb2xlYW4pXG4gICAgICAgIC5maWVsZChcImRlY2xhcmF0aW9uXCIsIG9yKGRlZihcIkRlY2xhcmVWYXJpYWJsZVwiKSwgZGVmKFwiRGVjbGFyZUZ1bmN0aW9uXCIpLCBkZWYoXCJEZWNsYXJlQ2xhc3NcIiksIGRlZihcIkZsb3dUeXBlXCIpLCAvLyBJbXBsaWVzIGRlZmF1bHQuXG4gICAgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInNwZWNpZmllcnNcIiwgW29yKGRlZihcIkV4cG9ydFNwZWNpZmllclwiKSwgZGVmKFwiRXhwb3J0QmF0Y2hTcGVjaWZpZXJcIikpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwic291cmNlXCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJzb3VyY2VcIilcbiAgICAgICAgLmZpZWxkKFwic291cmNlXCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkZsb3dQcmVkaWNhdGVcIikuYmFzZXMoXCJGbG93XCIpO1xuICAgIGRlZihcIkluZmVycmVkUHJlZGljYXRlXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dQcmVkaWNhdGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiRGVjbGFyZWRQcmVkaWNhdGVcIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1ByZWRpY2F0ZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJDYWxsRXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQXJndW1lbnRzXCIsIG9yKG51bGwsIGRlZihcIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJOZXdFeHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBcmd1bWVudHNcIiwgb3IobnVsbCwgZGVmKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIikpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIGVzN18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZXM3XCIpKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIGZvcmsudXNlKGVzN18xLmRlZmF1bHQpO1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIGRlZiA9IHR5cGVzLlR5cGUuZGVmO1xuICAgIHZhciBvciA9IHR5cGVzLlR5cGUub3I7XG4gICAgdmFyIGRlZmF1bHRzID0gZm9yay51c2Uoc2hhcmVkXzEuZGVmYXVsdCkuZGVmYXVsdHM7XG4gICAgZGVmKFwiSlNYQXR0cmlidXRlXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwibmFtZVwiLCBcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgb3IoZGVmKFwiSlNYSWRlbnRpZmllclwiKSwgZGVmKFwiSlNYTmFtZXNwYWNlZE5hbWVcIikpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCAvLyBhdHRyPVwidmFsdWVcIlxuICAgIGRlZihcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIiksIC8vIGF0dHI9e3ZhbHVlfVxuICAgIG51bGwgLy8gYXR0cj0gb3IganVzdCBhdHRyXG4gICAgKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJKU1hJZGVudGlmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIklkZW50aWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwibmFtZVwiKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIFN0cmluZyk7XG4gICAgZGVmKFwiSlNYTmFtZXNwYWNlZE5hbWVcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJuYW1lc3BhY2VcIiwgXCJuYW1lXCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVzcGFjZVwiLCBkZWYoXCJKU1hJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIGRlZihcIkpTWElkZW50aWZpZXJcIikpO1xuICAgIGRlZihcIkpTWE1lbWJlckV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiTWVtYmVyRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvYmplY3RcIiwgXCJwcm9wZXJ0eVwiKVxuICAgICAgICAuZmllbGQoXCJvYmplY3RcIiwgb3IoZGVmKFwiSlNYSWRlbnRpZmllclwiKSwgZGVmKFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInByb3BlcnR5XCIsIGRlZihcIkpTWElkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGRlZmF1bHRzLmZhbHNlKTtcbiAgICB2YXIgSlNYRWxlbWVudE5hbWUgPSBvcihkZWYoXCJKU1hJZGVudGlmaWVyXCIpLCBkZWYoXCJKU1hOYW1lc3BhY2VkTmFtZVwiKSwgZGVmKFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiSlNYU3ByZWFkQXR0cmlidXRlXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYXJndW1lbnRcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgdmFyIEpTWEF0dHJpYnV0ZXMgPSBbb3IoZGVmKFwiSlNYQXR0cmlidXRlXCIpLCBkZWYoXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIikpXTtcbiAgICBkZWYoXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIkpTWEVsZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvcGVuaW5nRWxlbWVudFwiLCBcImNsb3NpbmdFbGVtZW50XCIsIFwiY2hpbGRyZW5cIilcbiAgICAgICAgLmZpZWxkKFwib3BlbmluZ0VsZW1lbnRcIiwgZGVmKFwiSlNYT3BlbmluZ0VsZW1lbnRcIikpXG4gICAgICAgIC5maWVsZChcImNsb3NpbmdFbGVtZW50XCIsIG9yKGRlZihcIkpTWENsb3NpbmdFbGVtZW50XCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJjaGlsZHJlblwiLCBbb3IoZGVmKFwiSlNYRWxlbWVudFwiKSwgZGVmKFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiKSwgZGVmKFwiSlNYRnJhZ21lbnRcIiksIGRlZihcIkpTWFRleHRcIiksIGRlZihcIkxpdGVyYWxcIikgLy8gVE9ETyBFc3ByaW1hIHNob3VsZCByZXR1cm4gSlNYVGV4dCBpbnN0ZWFkLlxuICAgICAgICApXSwgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBKU1hFbGVtZW50TmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBMaXR0bGUta25vd24gZmFjdDogdGhlIGB0aGlzYCBvYmplY3QgaW5zaWRlIGEgZGVmYXVsdCBmdW5jdGlvblxuICAgICAgICAvLyBpcyBub25lIG90aGVyIHRoYW4gdGhlIHBhcnRpYWxseS1idWlsdCBvYmplY3QgaXRzZWxmLCBhbmQgYW55XG4gICAgICAgIC8vIGZpZWxkcyBpbml0aWFsaXplZCBkaXJlY3RseSBmcm9tIGJ1aWxkZXIgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICAgIC8vIChsaWtlIG9wZW5pbmdFbGVtZW50LCBjbG9zaW5nRWxlbWVudCwgYW5kIGNoaWxkcmVuKSBhcmVcbiAgICAgICAgLy8gZ3VhcmFudGVlZCB0byBiZSBhdmFpbGFibGUuXG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdFbGVtZW50Lm5hbWU7XG4gICAgfSwgdHJ1ZSkgLy8gaGlkZGVuIGZyb20gdHJhdmVyc2FsXG4gICAgICAgIC5maWVsZChcInNlbGZDbG9zaW5nXCIsIEJvb2xlYW4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0VsZW1lbnQuc2VsZkNsb3Npbmc7XG4gICAgfSwgdHJ1ZSkgLy8gaGlkZGVuIGZyb20gdHJhdmVyc2FsXG4gICAgICAgIC5maWVsZChcImF0dHJpYnV0ZXNcIiwgSlNYQXR0cmlidXRlcywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nRWxlbWVudC5hdHRyaWJ1dGVzO1xuICAgIH0sIHRydWUpOyAvLyBoaWRkZW4gZnJvbSB0cmF2ZXJzYWxcbiAgICBkZWYoXCJKU1hPcGVuaW5nRWxlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpIC8vIFRPRE8gRG9lcyB0aGlzIG1ha2Ugc2Vuc2U/IENhbid0IHJlYWxseSBiZSBhbiBKU1hFbGVtZW50LlxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIsIFwiYXR0cmlidXRlc1wiLCBcInNlbGZDbG9zaW5nXCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgSlNYRWxlbWVudE5hbWUpXG4gICAgICAgIC5maWVsZChcImF0dHJpYnV0ZXNcIiwgSlNYQXR0cmlidXRlcywgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwic2VsZkNsb3NpbmdcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiSlNYQ2xvc2luZ0VsZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKSAvLyBUT0RPIFNhbWUgY29uY2Vybi5cbiAgICAgICAgLmJ1aWxkKFwibmFtZVwiKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIEpTWEVsZW1lbnROYW1lKTtcbiAgICBkZWYoXCJKU1hGcmFnbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9wZW5pbmdFbGVtZW50XCIsIFwiY2xvc2luZ0VsZW1lbnRcIiwgXCJjaGlsZHJlblwiKVxuICAgICAgICAuZmllbGQoXCJvcGVuaW5nRWxlbWVudFwiLCBkZWYoXCJKU1hPcGVuaW5nRnJhZ21lbnRcIikpXG4gICAgICAgIC5maWVsZChcImNsb3NpbmdFbGVtZW50XCIsIGRlZihcIkpTWENsb3NpbmdGcmFnbWVudFwiKSlcbiAgICAgICAgLmZpZWxkKFwiY2hpbGRyZW5cIiwgW29yKGRlZihcIkpTWEVsZW1lbnRcIiksIGRlZihcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIiksIGRlZihcIkpTWEZyYWdtZW50XCIpLCBkZWYoXCJKU1hUZXh0XCIpLCBkZWYoXCJMaXRlcmFsXCIpIC8vIFRPRE8gRXNwcmltYSBzaG91bGQgcmV0dXJuIEpTWFRleHQgaW5zdGVhZC5cbiAgICAgICAgKV0sIGRlZmF1bHRzLmVtcHR5QXJyYXkpO1xuICAgIGRlZihcIkpTWE9wZW5pbmdGcmFnbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpIC8vIFRPRE8gU2FtZSBjb25jZXJuLlxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJKU1hDbG9zaW5nRnJhZ21lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKSAvLyBUT0RPIFNhbWUgY29uY2Vybi5cbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiSlNYVGV4dFwiKVxuICAgICAgICAuYmFzZXMoXCJMaXRlcmFsXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIFN0cmluZyk7XG4gICAgZGVmKFwiSlNYRW1wdHlFeHByZXNzaW9uXCIpLmJhc2VzKFwiRXhwcmVzc2lvblwiKS5idWlsZCgpO1xuICAgIC8vIFRoaXMgUFIgaGFzIGNhdXNlZCBtYW55IHBlb3BsZSBpc3N1ZXMsIGJ1dCBzdXBwb3J0aW5nIGl0IHNlZW1zIGxpa2UgYVxuICAgIC8vIGdvb2QgaWRlYSBhbnl3YXk6IGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9wdWxsLzQ5ODhcbiAgICBkZWYoXCJKU1hTcHJlYWRDaGlsZFwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG4vKipcbiAqIFR5cGUgYW5ub3RhdGlvbiBkZWZzIHNoYXJlZCBiZXR3ZWVuIEZsb3cgYW5kIFR5cGVTY3JpcHQuXG4gKiBUaGVzZSBkZWZzIGNvdWxkIG5vdCBiZSBkZWZpbmVkIGluIC4vZmxvdy50cyBvciAuL3R5cGVzY3JpcHQudHMgZGlyZWN0bHlcbiAqIGJlY2F1c2UgdGhleSB1c2UgdGhlIHNhbWUgbmFtZS5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xudmFyIHNoYXJlZF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi9zaGFyZWRcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICB2YXIgb3IgPSB0eXBlcy5UeXBlLm9yO1xuICAgIHZhciBkZWZhdWx0cyA9IGZvcmsudXNlKHNoYXJlZF8xLmRlZmF1bHQpLmRlZmF1bHRzO1xuICAgIHZhciBUeXBlQW5ub3RhdGlvbiA9IG9yKGRlZihcIlR5cGVBbm5vdGF0aW9uXCIpLCBkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLCBudWxsKTtcbiAgICB2YXIgVHlwZVBhcmFtRGVjbCA9IG9yKGRlZihcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSwgZGVmKFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiksIG51bGwpO1xuICAgIGRlZihcIklkZW50aWZpZXJcIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgVHlwZUFubm90YXRpb24sIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiT2JqZWN0UGF0dGVyblwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBUeXBlQW5ub3RhdGlvbiwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJGdW5jdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJyZXR1cm5UeXBlXCIsIFR5cGVBbm5vdGF0aW9uLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJzXCIsIFR5cGVQYXJhbURlY2wsIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiQ2xhc3NQcm9wZXJ0eVwiKVxuICAgICAgICAuYnVpbGQoXCJrZXlcIiwgXCJ2YWx1ZVwiLCBcInR5cGVBbm5vdGF0aW9uXCIsIFwic3RhdGljXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJzdGF0aWNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgVHlwZUFubm90YXRpb24sIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgW1wiQ2xhc3NEZWNsYXJhdGlvblwiLFxuICAgICAgICBcIkNsYXNzRXhwcmVzc2lvblwiLFxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAodHlwZU5hbWUpIHtcbiAgICAgICAgZGVmKHR5cGVOYW1lKVxuICAgICAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgVHlwZVBhcmFtRGVjbCwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwic3VwZXJUeXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSwgZGVmKFwiVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgICAgIC5maWVsZChcImltcGxlbWVudHNcIiwgb3IoW2RlZihcIkNsYXNzSW1wbGVtZW50c1wiKV0sIFtkZWYoXCJUU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50c1wiKV0pLCBkZWZhdWx0cy5lbXB0eUFycmF5KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciBiYWJlbF9jb3JlXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9iYWJlbC1jb3JlXCIpKTtcbnZhciB0eXBlX2Fubm90YXRpb25zXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90eXBlLWFubm90YXRpb25zXCIpKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIC8vIFNpbmNlIFR5cGVTY3JpcHQgaXMgcGFyc2VkIGJ5IEJhYnlsb24sIGluY2x1ZGUgdGhlIGNvcmUgQmFieWxvbiB0eXBlc1xuICAgIC8vIGJ1dCBvbWl0IHRoZSBGbG93LXJlbGF0ZWQgdHlwZXMuXG4gICAgZm9yay51c2UoYmFiZWxfY29yZV8xLmRlZmF1bHQpO1xuICAgIGZvcmsudXNlKHR5cGVfYW5ub3RhdGlvbnNfMS5kZWZhdWx0KTtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBuID0gdHlwZXMubmFtZWRUeXBlcztcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICB2YXIgU3RyaW5nTGl0ZXJhbCA9IHR5cGVzLlR5cGUuZnJvbShmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgaWYgKG4uU3RyaW5nTGl0ZXJhbCAmJlxuICAgICAgICAgICAgbi5TdHJpbmdMaXRlcmFsLmNoZWNrKHZhbHVlLCBkZWVwKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4uTGl0ZXJhbCAmJlxuICAgICAgICAgICAgbi5MaXRlcmFsLmNoZWNrKHZhbHVlLCBkZWVwKSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlLnZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSwgXCJTdHJpbmdMaXRlcmFsXCIpO1xuICAgIGRlZihcIlRTVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpO1xuICAgIHZhciBUU0VudGl0eU5hbWUgPSBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJUU1F1YWxpZmllZE5hbWVcIikpO1xuICAgIGRlZihcIlRTVHlwZVJlZmVyZW5jZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZU5hbWVcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlTmFtZVwiLCBUU0VudGl0eU5hbWUpO1xuICAgIC8vIEFuIGFic3RyYWN0IChub24tYnVpbGRhYmxlKSBiYXNlIHR5cGUgdGhhdCBwcm92aWRlIGEgY29tbW9ubHktbmVlZGVkXG4gICAgLy8gb3B0aW9uYWwgLnR5cGVQYXJhbWV0ZXJzIGZpZWxkLlxuICAgIGRlZihcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICAvLyBBbiBhYnN0cmFjdCAobm9uLWJ1aWxkYWJsZSkgYmFzZSB0eXBlIHRoYXQgcHJvdmlkZSBhIGNvbW1vbmx5LW5lZWRlZFxuICAgIC8vIG9wdGlvbmFsIC50eXBlUGFyYW1ldGVycyBmaWVsZC5cbiAgICBkZWYoXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlcnNcIilcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiksIG51bGwsIHZvaWQgMCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgLy8gQW4gYWJzdHJhY3QgKG5vbi1idWlsZGFibGUpIGJhc2UgdHlwZSB0aGF0IHByb3ZpZGUgYSBjb21tb25seS1uZWVkZWRcbiAgICAvLyBvcHRpb25hbCAudHlwZUFubm90YXRpb24gZmllbGQuXG4gICAgZGVmKFwiVFNIYXNPcHRpb25hbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIG9yKGRlZihcIlRTVHlwZUFubm90YXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTUXVhbGlmaWVkTmFtZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImxlZnRcIiwgXCJyaWdodFwiKVxuICAgICAgICAuZmllbGQoXCJsZWZ0XCIsIFRTRW50aXR5TmFtZSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgVFNFbnRpdHlOYW1lKTtcbiAgICBkZWYoXCJUU0FzRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIsIFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uXCIsIFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBkZWYoXCJUU1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcImV4dHJhXCIsIG9yKHsgcGFyZW50aGVzaXplZDogQm9vbGVhbiB9LCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJUU05vbk51bGxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIiwgXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBbXG4gICAgICAgIFwiVFNBbnlLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNCaWdJbnRLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNCb29sZWFuS2V5d29yZFwiLFxuICAgICAgICBcIlRTTmV2ZXJLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNOdWxsS2V5d29yZFwiLFxuICAgICAgICBcIlRTTnVtYmVyS2V5d29yZFwiLFxuICAgICAgICBcIlRTT2JqZWN0S2V5d29yZFwiLFxuICAgICAgICBcIlRTU3RyaW5nS2V5d29yZFwiLFxuICAgICAgICBcIlRTU3ltYm9sS2V5d29yZFwiLFxuICAgICAgICBcIlRTVW5kZWZpbmVkS2V5d29yZFwiLFxuICAgICAgICBcIlRTVW5rbm93bktleXdvcmRcIixcbiAgICAgICAgXCJUU1ZvaWRLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNUaGlzVHlwZVwiLFxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoa2V5d29yZFR5cGUpIHtcbiAgICAgICAgZGVmKGtleXdvcmRUeXBlKVxuICAgICAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgICAgICAuYnVpbGQoKTtcbiAgICB9KTtcbiAgICBkZWYoXCJUU0FycmF5VHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiZWxlbWVudFR5cGVcIilcbiAgICAgICAgLmZpZWxkKFwiZWxlbWVudFR5cGVcIiwgZGVmKFwiVFNUeXBlXCIpKTtcbiAgICBkZWYoXCJUU0xpdGVyYWxUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJsaXRlcmFsXCIpXG4gICAgICAgIC5maWVsZChcImxpdGVyYWxcIiwgb3IoZGVmKFwiTnVtZXJpY0xpdGVyYWxcIiksIGRlZihcIlN0cmluZ0xpdGVyYWxcIiksIGRlZihcIkJvb2xlYW5MaXRlcmFsXCIpLCBkZWYoXCJUZW1wbGF0ZUxpdGVyYWxcIiksIGRlZihcIlVuYXJ5RXhwcmVzc2lvblwiKSkpO1xuICAgIFtcIlRTVW5pb25UeXBlXCIsXG4gICAgICAgIFwiVFNJbnRlcnNlY3Rpb25UeXBlXCIsXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlTmFtZSkge1xuICAgICAgICBkZWYodHlwZU5hbWUpXG4gICAgICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgICAgIC5idWlsZChcInR5cGVzXCIpXG4gICAgICAgICAgICAuZmllbGQoXCJ0eXBlc1wiLCBbZGVmKFwiVFNUeXBlXCIpXSk7XG4gICAgfSk7XG4gICAgZGVmKFwiVFNDb25kaXRpb25hbFR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImNoZWNrVHlwZVwiLCBcImV4dGVuZHNUeXBlXCIsIFwidHJ1ZVR5cGVcIiwgXCJmYWxzZVR5cGVcIilcbiAgICAgICAgLmZpZWxkKFwiY2hlY2tUeXBlXCIsIGRlZihcIlRTVHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwiZXh0ZW5kc1R5cGVcIiwgZGVmKFwiVFNUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJ0cnVlVHlwZVwiLCBkZWYoXCJUU1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcImZhbHNlVHlwZVwiLCBkZWYoXCJUU1R5cGVcIikpO1xuICAgIGRlZihcIlRTSW5mZXJUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ0eXBlUGFyYW1ldGVyXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJcIiwgZGVmKFwiVFNUeXBlUGFyYW1ldGVyXCIpKTtcbiAgICBkZWYoXCJUU1BhcmVudGhlc2l6ZWRUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBkZWYoXCJUU1R5cGVcIikpO1xuICAgIHZhciBQYXJhbWV0ZXJzVHlwZSA9IFtvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJSZXN0RWxlbWVudFwiKSwgZGVmKFwiQXJyYXlQYXR0ZXJuXCIpLCBkZWYoXCJPYmplY3RQYXR0ZXJuXCIpKV07XG4gICAgW1wiVFNGdW5jdGlvblR5cGVcIixcbiAgICAgICAgXCJUU0NvbnN0cnVjdG9yVHlwZVwiLFxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAodHlwZU5hbWUpIHtcbiAgICAgICAgZGVmKHR5cGVOYW1lKVxuICAgICAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJzXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgICAgICAuYnVpbGQoXCJwYXJhbWV0ZXJzXCIpXG4gICAgICAgICAgICAuZmllbGQoXCJwYXJhbWV0ZXJzXCIsIFBhcmFtZXRlcnNUeXBlKTtcbiAgICB9KTtcbiAgICBkZWYoXCJUU0RlY2xhcmVGdW5jdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInBhcmFtc1wiLCBcInJldHVyblR5cGVcIilcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyZVwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJhc3luY1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJnZW5lcmF0b3JcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJQYXR0ZXJuXCIpXSlcbiAgICAgICAgLy8gdFNGdW5jdGlvblR5cGVBbm5vdGF0aW9uQ29tbW9uXG4gICAgICAgIC5maWVsZChcInJldHVyblR5cGVcIiwgb3IoZGVmKFwiVFNUeXBlQW5ub3RhdGlvblwiKSwgZGVmKFwiTm9vcFwiKSwgLy8gU3RpbGwgdXNlZD9cbiAgICBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJUU0RlY2xhcmVNZXRob2RcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlcnNcIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIsIFwicGFyYW1zXCIsIFwicmV0dXJuVHlwZVwiKVxuICAgICAgICAuZmllbGQoXCJhc3luY1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJnZW5lcmF0b3JcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJQYXR0ZXJuXCIpXSlcbiAgICAgICAgLy8gY2xhc3NNZXRob2RPclByb3BlcnR5Q29tbW9uXG4gICAgICAgIC5maWVsZChcImFic3RyYWN0XCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImFjY2Vzc2liaWxpdHlcIiwgb3IoXCJwdWJsaWNcIiwgXCJwcml2YXRlXCIsIFwicHJvdGVjdGVkXCIsIHZvaWQgMCksIGRlZmF1bHRzW1widW5kZWZpbmVkXCJdKVxuICAgICAgICAuZmllbGQoXCJzdGF0aWNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIlN0cmluZ0xpdGVyYWxcIiksIGRlZihcIk51bWVyaWNMaXRlcmFsXCIpLCBcbiAgICAvLyBPbmx5IGFsbG93ZWQgaWYgLmNvbXB1dGVkIGlzIHRydWUuXG4gICAgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC8vIGNsYXNzTWV0aG9kT3JEZWNsYXJlTWV0aG9kQ29tbW9uXG4gICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJnZXRcIiwgXCJzZXRcIiwgXCJtZXRob2RcIiwgXCJjb25zdHJ1Y3RvclwiKSwgZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIFwibWV0aG9kXCI7IH0pXG4gICAgICAgIC5maWVsZChcImFjY2Vzc1wiLCAvLyBOb3QgXCJhY2Nlc3NpYmlsaXR5XCI/XG4gICAgb3IoXCJwdWJsaWNcIiwgXCJwcml2YXRlXCIsIFwicHJvdGVjdGVkXCIsIHZvaWQgMCksIGRlZmF1bHRzW1widW5kZWZpbmVkXCJdKVxuICAgICAgICAuZmllbGQoXCJkZWNvcmF0b3JzXCIsIG9yKFtkZWYoXCJEZWNvcmF0b3JcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAvLyB0U0Z1bmN0aW9uVHlwZUFubm90YXRpb25Db21tb25cbiAgICAgICAgLmZpZWxkKFwicmV0dXJuVHlwZVwiLCBvcihkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLCBkZWYoXCJOb29wXCIpLCAvLyBTdGlsbCB1c2VkP1xuICAgIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTTWFwcGVkVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZVBhcmFtZXRlclwiLCBcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInJlYWRvbmx5XCIsIG9yKEJvb2xlYW4sIFwiK1wiLCBcIi1cIiksIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJcIiwgZGVmKFwiVFNUeXBlUGFyYW1ldGVyXCIpKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBvcihCb29sZWFuLCBcIitcIiwgXCItXCIpLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBvcihkZWYoXCJUU1R5cGVcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTVHVwbGVUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJlbGVtZW50VHlwZXNcIilcbiAgICAgICAgLmZpZWxkKFwiZWxlbWVudFR5cGVzXCIsIFtvcihkZWYoXCJUU1R5cGVcIiksIGRlZihcIlRTTmFtZWRUdXBsZU1lbWJlclwiKSldKTtcbiAgICBkZWYoXCJUU05hbWVkVHVwbGVNZW1iZXJcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImxhYmVsXCIsIFwiZWxlbWVudFR5cGVcIiwgXCJvcHRpb25hbFwiKVxuICAgICAgICAuZmllbGQoXCJsYWJlbFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJlbGVtZW50VHlwZVwiLCBkZWYoXCJUU1R5cGVcIikpO1xuICAgIGRlZihcIlRTUmVzdFR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgZGVmKFwiVFNPcHRpb25hbFR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgZGVmKFwiVFNJbmRleGVkQWNjZXNzVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwib2JqZWN0VHlwZVwiLCBcImluZGV4VHlwZVwiKVxuICAgICAgICAuZmllbGQoXCJvYmplY3RUeXBlXCIsIGRlZihcIlRTVHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwiaW5kZXhUeXBlXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgZGVmKFwiVFNUeXBlT3BlcmF0b3JcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcIm9wZXJhdG9yXCIpXG4gICAgICAgIC5maWVsZChcIm9wZXJhdG9yXCIsIFN0cmluZylcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiVFNUeXBlXCIpKTtcbiAgICBkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgb3IoZGVmKFwiVFNUeXBlXCIpLCBkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpKSk7XG4gICAgZGVmKFwiVFNJbmRleFNpZ25hdHVyZVwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbWV0ZXJzXCIsIFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwicGFyYW1ldGVyc1wiLCBbZGVmKFwiSWRlbnRpZmllclwiKV0pIC8vIExlbmd0aCA9PT0gMVxuICAgICAgICAuZmllbGQoXCJyZWFkb25seVwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJUU1Byb3BlcnR5U2lnbmF0dXJlXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImtleVwiLCBcInR5cGVBbm5vdGF0aW9uXCIsIFwib3B0aW9uYWxcIilcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcInJlYWRvbmx5XCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImluaXRpYWxpemVyXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTTWV0aG9kU2lnbmF0dXJlXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJzXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImtleVwiLCBcInBhcmFtZXRlcnNcIiwgXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwicGFyYW1ldGVyc1wiLCBQYXJhbWV0ZXJzVHlwZSk7XG4gICAgZGVmKFwiVFNUeXBlUHJlZGljYXRlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZUFubm90YXRpb25cIiwgXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwicGFyYW1ldGVyTmFtZVwiLCBcInR5cGVBbm5vdGF0aW9uXCIsIFwiYXNzZXJ0c1wiKVxuICAgICAgICAuZmllbGQoXCJwYXJhbWV0ZXJOYW1lXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIlRTVGhpc1R5cGVcIikpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBvcihkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJhc3NlcnRzXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIFtcIlRTQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsXG4gICAgICAgIFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiLFxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAodHlwZU5hbWUpIHtcbiAgICAgICAgZGVmKHR5cGVOYW1lKVxuICAgICAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlcnNcIiwgXCJUU0hhc09wdGlvbmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgICAgIC5idWlsZChcInBhcmFtZXRlcnNcIiwgXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAgICAgLmZpZWxkKFwicGFyYW1ldGVyc1wiLCBQYXJhbWV0ZXJzVHlwZSk7XG4gICAgfSk7XG4gICAgZGVmKFwiVFNFbnVtTWVtYmVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJpbml0aWFsaXplclwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBTdHJpbmdMaXRlcmFsKSlcbiAgICAgICAgLmZpZWxkKFwiaW5pdGlhbGl6ZXJcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNUeXBlUXVlcnlcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJOYW1lXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJOYW1lXCIsIG9yKFRTRW50aXR5TmFtZSwgZGVmKFwiVFNJbXBvcnRUeXBlXCIpKSk7XG4gICAgLy8gSW5mZXJyZWQgZnJvbSBCYWJ5bG9uJ3MgdHNQYXJzZVR5cGVNZW1iZXIgbWV0aG9kLlxuICAgIHZhciBUU1R5cGVNZW1iZXIgPSBvcihkZWYoXCJUU0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvblwiKSwgZGVmKFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiKSwgZGVmKFwiVFNJbmRleFNpZ25hdHVyZVwiKSwgZGVmKFwiVFNNZXRob2RTaWduYXR1cmVcIiksIGRlZihcIlRTUHJvcGVydHlTaWduYXR1cmVcIikpO1xuICAgIGRlZihcIlRTVHlwZUxpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcIm1lbWJlcnNcIilcbiAgICAgICAgLmZpZWxkKFwibWVtYmVyc1wiLCBbVFNUeXBlTWVtYmVyXSk7XG4gICAgZGVmKFwiVFNUeXBlUGFyYW1ldGVyXCIpXG4gICAgICAgIC5iYXNlcyhcIklkZW50aWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwibmFtZVwiLCBcImNvbnN0cmFpbnRcIiwgXCJkZWZhdWx0XCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgU3RyaW5nKVxuICAgICAgICAuZmllbGQoXCJjb25zdHJhaW50XCIsIG9yKGRlZihcIlRTVHlwZVwiKSwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pXG4gICAgICAgIC5maWVsZChcImRlZmF1bHRcIiwgb3IoZGVmKFwiVFNUeXBlXCIpLCB2b2lkIDApLCBkZWZhdWx0c1tcInVuZGVmaW5lZFwiXSk7XG4gICAgZGVmKFwiVFNUeXBlQXNzZXJ0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIiwgXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIsIFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBkZWYoXCJUU1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25cIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiZXh0cmFcIiwgb3IoeyBwYXJlbnRoZXNpemVkOiBCb29sZWFuIH0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtc1wiKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIlRTVHlwZVBhcmFtZXRlclwiKV0pO1xuICAgIGRlZihcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbXNcIilcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJUU1R5cGVcIildKTtcbiAgICBkZWYoXCJUU0VudW1EZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcIm1lbWJlcnNcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29uc3RcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyZVwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJtZW1iZXJzXCIsIFtkZWYoXCJUU0VudW1NZW1iZXJcIildKVxuICAgICAgICAuZmllbGQoXCJpbml0aWFsaXplclwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJUU1R5cGVBbGlhc0RlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyZVwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBkZWYoXCJUU1R5cGVcIikpO1xuICAgIGRlZihcIlRTTW9kdWxlQmxvY2tcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgW2RlZihcIlN0YXRlbWVudFwiKV0pO1xuICAgIGRlZihcIlRTTW9kdWxlRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIG9yKFN0cmluZ0xpdGVyYWwsIFRTRW50aXR5TmFtZSkpXG4gICAgICAgIC5maWVsZChcImRlY2xhcmVcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiZ2xvYmFsXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgb3IoZGVmKFwiVFNNb2R1bGVCbG9ja1wiKSwgZGVmKFwiVFNNb2R1bGVEZWNsYXJhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNJbXBvcnRUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiLCBcInF1YWxpZmllclwiLCBcInR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIFN0cmluZ0xpdGVyYWwpXG4gICAgICAgIC5maWVsZChcInF1YWxpZmllclwiLCBvcihUU0VudGl0eU5hbWUsIHZvaWQgMCksIGRlZmF1bHRzW1widW5kZWZpbmVkXCJdKTtcbiAgICBkZWYoXCJUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwibW9kdWxlUmVmZXJlbmNlXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcImlzRXhwb3J0XCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcIm1vZHVsZVJlZmVyZW5jZVwiLCBvcihUU0VudGl0eU5hbWUsIGRlZihcIlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2VcIikpKTtcbiAgICBkZWYoXCJUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBTdHJpbmdMaXRlcmFsKTtcbiAgICBkZWYoXCJUU0V4cG9ydEFzc2lnbm1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJUU05hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpO1xuICAgIGRlZihcIlRTSW50ZXJmYWNlQm9keVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbVFNUeXBlTWVtYmVyXSk7XG4gICAgZGVmKFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIiwgXCJ0eXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIFRTRW50aXR5TmFtZSk7XG4gICAgZGVmKFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgVFNFbnRpdHlOYW1lKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJlXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImV4dGVuZHNcIiwgb3IoW2RlZihcIlRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXCIpXSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJUU0ludGVyZmFjZUJvZHlcIikpO1xuICAgIGRlZihcIlRTUGFyYW1ldGVyUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbWV0ZXJcIilcbiAgICAgICAgLmZpZWxkKFwiYWNjZXNzaWJpbGl0eVwiLCBvcihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pXG4gICAgICAgIC5maWVsZChcInJlYWRvbmx5XCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcInBhcmFtZXRlclwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJBc3NpZ25tZW50UGF0dGVyblwiKSkpO1xuICAgIGRlZihcIkNsYXNzUHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwiYWNjZXNzXCIsIC8vIE5vdCBcImFjY2Vzc2liaWxpdHlcIj9cbiAgICBvcihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pO1xuICAgIC8vIERlZmluZWQgYWxyZWFkeSBpbiBlczYgYW5kIGJhYmVsLWNvcmUuXG4gICAgZGVmKFwiQ2xhc3NCb2R5XCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgW29yKGRlZihcIk1ldGhvZERlZmluaXRpb25cIiksIGRlZihcIlZhcmlhYmxlRGVjbGFyYXRvclwiKSwgZGVmKFwiQ2xhc3NQcm9wZXJ0eURlZmluaXRpb25cIiksIGRlZihcIkNsYXNzUHJvcGVydHlcIiksIGRlZihcIkNsYXNzUHJpdmF0ZVByb3BlcnR5XCIpLCBkZWYoXCJDbGFzc01ldGhvZFwiKSwgZGVmKFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIpLCBcbiAgICAgICAgLy8gSnVzdCBuZWVkIHRvIGFkZCB0aGVzZSB0eXBlczpcbiAgICAgICAgZGVmKFwiVFNEZWNsYXJlTWV0aG9kXCIpLCBUU1R5cGVNZW1iZXIpXSk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2xpYi90eXBlc1wiKSk7XG52YXIgcGF0aF92aXNpdG9yXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9saWIvcGF0aC12aXNpdG9yXCIpKTtcbnZhciBlcXVpdl8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbGliL2VxdWl2XCIpKTtcbnZhciBwYXRoXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9saWIvcGF0aFwiKSk7XG52YXIgbm9kZV9wYXRoXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9saWIvbm9kZS1wYXRoXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShkZWZzKSB7XG4gICAgdmFyIGZvcmsgPSBjcmVhdGVGb3JrKCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICBkZWZzLmZvckVhY2goZm9yay51c2UpO1xuICAgIHR5cGVzLmZpbmFsaXplKCk7XG4gICAgdmFyIFBhdGhWaXNpdG9yID0gZm9yay51c2UocGF0aF92aXNpdG9yXzEuZGVmYXVsdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgVHlwZTogdHlwZXMuVHlwZSxcbiAgICAgICAgYnVpbHRJblR5cGVzOiB0eXBlcy5idWlsdEluVHlwZXMsXG4gICAgICAgIG5hbWVkVHlwZXM6IHR5cGVzLm5hbWVkVHlwZXMsXG4gICAgICAgIGJ1aWxkZXJzOiB0eXBlcy5idWlsZGVycyxcbiAgICAgICAgZGVmaW5lTWV0aG9kOiB0eXBlcy5kZWZpbmVNZXRob2QsXG4gICAgICAgIGdldEZpZWxkTmFtZXM6IHR5cGVzLmdldEZpZWxkTmFtZXMsXG4gICAgICAgIGdldEZpZWxkVmFsdWU6IHR5cGVzLmdldEZpZWxkVmFsdWUsXG4gICAgICAgIGVhY2hGaWVsZDogdHlwZXMuZWFjaEZpZWxkLFxuICAgICAgICBzb21lRmllbGQ6IHR5cGVzLnNvbWVGaWVsZCxcbiAgICAgICAgZ2V0U3VwZXJ0eXBlTmFtZXM6IHR5cGVzLmdldFN1cGVydHlwZU5hbWVzLFxuICAgICAgICBnZXRCdWlsZGVyTmFtZTogdHlwZXMuZ2V0QnVpbGRlck5hbWUsXG4gICAgICAgIGFzdE5vZGVzQXJlRXF1aXZhbGVudDogZm9yay51c2UoZXF1aXZfMS5kZWZhdWx0KSxcbiAgICAgICAgZmluYWxpemU6IHR5cGVzLmZpbmFsaXplLFxuICAgICAgICBQYXRoOiBmb3JrLnVzZShwYXRoXzEuZGVmYXVsdCksXG4gICAgICAgIE5vZGVQYXRoOiBmb3JrLnVzZShub2RlX3BhdGhfMS5kZWZhdWx0KSxcbiAgICAgICAgUGF0aFZpc2l0b3I6IFBhdGhWaXNpdG9yLFxuICAgICAgICB1c2U6IGZvcmsudXNlLFxuICAgICAgICB2aXNpdDogUGF0aFZpc2l0b3IudmlzaXQsXG4gICAgfTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbmZ1bmN0aW9uIGNyZWF0ZUZvcmsoKSB7XG4gICAgdmFyIHVzZWQgPSBbXTtcbiAgICB2YXIgdXNlZFJlc3VsdCA9IFtdO1xuICAgIGZ1bmN0aW9uIHVzZShwbHVnaW4pIHtcbiAgICAgICAgdmFyIGlkeCA9IHVzZWQuaW5kZXhPZihwbHVnaW4pO1xuICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgaWR4ID0gdXNlZC5sZW5ndGg7XG4gICAgICAgICAgICB1c2VkLnB1c2gocGx1Z2luKTtcbiAgICAgICAgICAgIHVzZWRSZXN1bHRbaWR4XSA9IHBsdWdpbihmb3JrKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXNlZFJlc3VsdFtpZHhdO1xuICAgIH1cbiAgICB2YXIgZm9yayA9IHsgdXNlOiB1c2UgfTtcbiAgICByZXR1cm4gZm9yaztcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubmFtZWRUeXBlcyA9IHZvaWQgMDtcbnZhciBuYW1lZFR5cGVzO1xuKGZ1bmN0aW9uIChuYW1lZFR5cGVzKSB7XG59KShuYW1lZFR5cGVzID0gZXhwb3J0cy5uYW1lZFR5cGVzIHx8IChleHBvcnRzLm5hbWVkVHlwZXMgPSB7fSkpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3R5cGVzXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZ2V0RmllbGROYW1lcyA9IHR5cGVzLmdldEZpZWxkTmFtZXM7XG4gICAgdmFyIGdldEZpZWxkVmFsdWUgPSB0eXBlcy5nZXRGaWVsZFZhbHVlO1xuICAgIHZhciBpc0FycmF5ID0gdHlwZXMuYnVpbHRJblR5cGVzLmFycmF5O1xuICAgIHZhciBpc09iamVjdCA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5vYmplY3Q7XG4gICAgdmFyIGlzRGF0ZSA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5EYXRlO1xuICAgIHZhciBpc1JlZ0V4cCA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5SZWdFeHA7XG4gICAgdmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4gICAgZnVuY3Rpb24gYXN0Tm9kZXNBcmVFcXVpdmFsZW50KGEsIGIsIHByb2JsZW1QYXRoKSB7XG4gICAgICAgIGlmIChpc0FycmF5LmNoZWNrKHByb2JsZW1QYXRoKSkge1xuICAgICAgICAgICAgcHJvYmxlbVBhdGgubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByb2JsZW1QYXRoID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJlRXF1aXZhbGVudChhLCBiLCBwcm9ibGVtUGF0aCk7XG4gICAgfVxuICAgIGFzdE5vZGVzQXJlRXF1aXZhbGVudC5hc3NlcnQgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICB2YXIgcHJvYmxlbVBhdGggPSBbXTtcbiAgICAgICAgaWYgKCFhc3ROb2Rlc0FyZUVxdWl2YWxlbnQoYSwgYiwgcHJvYmxlbVBhdGgpKSB7XG4gICAgICAgICAgICBpZiAocHJvYmxlbVBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZXMgbXVzdCBiZSBlcXVhbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBkaWZmZXIgaW4gdGhlIGZvbGxvd2luZyBwYXRoOiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHByb2JsZW1QYXRoLm1hcChzdWJzY3JpcHRGb3JQcm9wZXJ0eSkuam9pbihcIlwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIHN1YnNjcmlwdEZvclByb3BlcnR5KHByb3BlcnR5KSB7XG4gICAgICAgIGlmICgvW18kYS16XVtfJGEtejAtOV0qL2kudGVzdChwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgIHJldHVybiBcIi5cIiArIHByb3BlcnR5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIltcIiArIEpTT04uc3RyaW5naWZ5KHByb3BlcnR5KSArIFwiXVwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhcmVFcXVpdmFsZW50KGEsIGIsIHByb2JsZW1QYXRoKSB7XG4gICAgICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBcnJheS5jaGVjayhhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5c0FyZUVxdWl2YWxlbnQoYSwgYiwgcHJvYmxlbVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc09iamVjdC5jaGVjayhhKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdHNBcmVFcXVpdmFsZW50KGEsIGIsIHByb2JsZW1QYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEYXRlLmNoZWNrKGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNEYXRlLmNoZWNrKGIpICYmICgrYSA9PT0gK2IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JlZ0V4cC5jaGVjayhhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzUmVnRXhwLmNoZWNrKGIpICYmIChhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiZcbiAgICAgICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiZcbiAgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgICAgICBhLmlnbm9yZUNhc2UgPT09IGIuaWdub3JlQ2FzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGEgPT0gYjtcbiAgICB9XG4gICAgZnVuY3Rpb24gYXJyYXlzQXJlRXF1aXZhbGVudChhLCBiLCBwcm9ibGVtUGF0aCkge1xuICAgICAgICBpc0FycmF5LmFzc2VydChhKTtcbiAgICAgICAgdmFyIGFMZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgICAgaWYgKCFpc0FycmF5LmNoZWNrKGIpIHx8IGIubGVuZ3RoICE9PSBhTGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAocHJvYmxlbVBhdGgpIHtcbiAgICAgICAgICAgICAgICBwcm9ibGVtUGF0aC5wdXNoKFwibGVuZ3RoXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYUxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAocHJvYmxlbVBhdGgpIHtcbiAgICAgICAgICAgICAgICBwcm9ibGVtUGF0aC5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgaW4gYSAhPT0gaSBpbiBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFhcmVFcXVpdmFsZW50KGFbaV0sIGJbaV0sIHByb2JsZW1QYXRoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9ibGVtUGF0aFRhaWwgPSBwcm9ibGVtUGF0aC5wb3AoKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvYmxlbVBhdGhUYWlsICE9PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiICsgcHJvYmxlbVBhdGhUYWlsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9iamVjdHNBcmVFcXVpdmFsZW50KGEsIGIsIHByb2JsZW1QYXRoKSB7XG4gICAgICAgIGlzT2JqZWN0LmFzc2VydChhKTtcbiAgICAgICAgaWYgKCFpc09iamVjdC5jaGVjayhiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgYSBjb21tb24gcHJvcGVydHkgb2YgQVNUIG5vZGVzLlxuICAgICAgICBpZiAoYS50eXBlICE9PSBiLnR5cGUpIHtcbiAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgICAgIHByb2JsZW1QYXRoLnB1c2goXCJ0eXBlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhTmFtZXMgPSBnZXRGaWVsZE5hbWVzKGEpO1xuICAgICAgICB2YXIgYU5hbWVDb3VudCA9IGFOYW1lcy5sZW5ndGg7XG4gICAgICAgIHZhciBiTmFtZXMgPSBnZXRGaWVsZE5hbWVzKGIpO1xuICAgICAgICB2YXIgYk5hbWVDb3VudCA9IGJOYW1lcy5sZW5ndGg7XG4gICAgICAgIGlmIChhTmFtZUNvdW50ID09PSBiTmFtZUNvdW50KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFOYW1lQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgICAgIHZhciBuYW1lID0gYU5hbWVzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBhQ2hpbGQgPSBnZXRGaWVsZFZhbHVlKGEsIG5hbWUpO1xuICAgICAgICAgICAgICAgIHZhciBiQ2hpbGQgPSBnZXRGaWVsZFZhbHVlKGIsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9ibGVtUGF0aC5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWFyZUVxdWl2YWxlbnQoYUNoaWxkLCBiQ2hpbGQsIHByb2JsZW1QYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvYmxlbVBhdGhUYWlsID0gcHJvYmxlbVBhdGgucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aFRhaWwgIT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiICsgcHJvYmxlbVBhdGhUYWlsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcHJvYmxlbVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5jZSBhTmFtZUNvdW50ICE9PSBiTmFtZUNvdW50LCB3ZSBuZWVkIHRvIGZpbmQgc29tZSBuYW1lIHRoYXQnc1xuICAgICAgICAvLyBtaXNzaW5nIGluIGFOYW1lcyBidXQgcHJlc2VudCBpbiBiTmFtZXMsIG9yIHZpY2UtdmVyc2EuXG4gICAgICAgIHZhciBzZWVuTmFtZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYU5hbWVDb3VudDsgKytpKSB7XG4gICAgICAgICAgICBzZWVuTmFtZXNbYU5hbWVzW2ldXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGJOYW1lQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgbmFtZSA9IGJOYW1lc1tpXTtcbiAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwoc2Vlbk5hbWVzLCBuYW1lKSkge1xuICAgICAgICAgICAgICAgIHByb2JsZW1QYXRoLnB1c2gobmFtZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIHNlZW5OYW1lc1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKG5hbWUgaW4gc2Vlbk5hbWVzKSB7XG4gICAgICAgICAgICBwcm9ibGVtUGF0aC5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gYXN0Tm9kZXNBcmVFcXVpdmFsZW50O1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90eXBlc1wiKSk7XG52YXIgcGF0aF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGF0aFwiKSk7XG52YXIgc2NvcGVfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3Njb3BlXCIpKTtcbmZ1bmN0aW9uIG5vZGVQYXRoUGx1Z2luKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBuID0gdHlwZXMubmFtZWRUeXBlcztcbiAgICB2YXIgYiA9IHR5cGVzLmJ1aWxkZXJzO1xuICAgIHZhciBpc051bWJlciA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5udW1iZXI7XG4gICAgdmFyIGlzQXJyYXkgPSB0eXBlcy5idWlsdEluVHlwZXMuYXJyYXk7XG4gICAgdmFyIFBhdGggPSBmb3JrLnVzZShwYXRoXzEuZGVmYXVsdCk7XG4gICAgdmFyIFNjb3BlID0gZm9yay51c2Uoc2NvcGVfMS5kZWZhdWx0KTtcbiAgICB2YXIgTm9kZVBhdGggPSBmdW5jdGlvbiBOb2RlUGF0aCh2YWx1ZSwgcGFyZW50UGF0aCwgbmFtZSkge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlUGF0aCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgaW52b2tlZCB3aXRob3V0ICduZXcnXCIpO1xuICAgICAgICB9XG4gICAgICAgIFBhdGguY2FsbCh0aGlzLCB2YWx1ZSwgcGFyZW50UGF0aCwgbmFtZSk7XG4gICAgfTtcbiAgICB2YXIgTlBwID0gTm9kZVBhdGgucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShQYXRoLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgICAgdmFsdWU6IE5vZGVQYXRoLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTlBwLCB7XG4gICAgICAgIG5vZGU6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5vZGVcIiwge1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9jb21wdXRlTm9kZSgpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcGFyZW50OiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJwYXJlbnRcIiwge1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9jb21wdXRlUGFyZW50KClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJzY29wZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2NvbXB1dGVTY29wZSgpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBOUHAucmVwbGFjZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMubm9kZTtcbiAgICAgICAgZGVsZXRlIHRoaXMucGFyZW50O1xuICAgICAgICBkZWxldGUgdGhpcy5zY29wZTtcbiAgICAgICAgcmV0dXJuIFBhdGgucHJvdG90eXBlLnJlcGxhY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIE5QcC5wcnVuZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlbWFpbmluZ05vZGVQYXRoID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgIHRoaXMucmVwbGFjZSgpO1xuICAgICAgICByZXR1cm4gY2xlYW5VcE5vZGVzQWZ0ZXJQcnVuZShyZW1haW5pbmdOb2RlUGF0aCk7XG4gICAgfTtcbiAgICAvLyBUaGUgdmFsdWUgb2YgdGhlIGZpcnN0IGFuY2VzdG9yIFBhdGggd2hvc2UgdmFsdWUgaXMgYSBOb2RlLlxuICAgIE5QcC5fY29tcHV0ZU5vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGlmIChuLk5vZGUuY2hlY2sodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBwID0gdGhpcy5wYXJlbnRQYXRoO1xuICAgICAgICByZXR1cm4gcHAgJiYgcHAubm9kZSB8fCBudWxsO1xuICAgIH07XG4gICAgLy8gVGhlIGZpcnN0IGFuY2VzdG9yIFBhdGggd2hvc2UgdmFsdWUgaXMgYSBOb2RlIGRpc3RpbmN0IGZyb20gdGhpcy5ub2RlLlxuICAgIE5QcC5fY29tcHV0ZVBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgdmFyIHBwID0gdGhpcy5wYXJlbnRQYXRoO1xuICAgICAgICBpZiAoIW4uTm9kZS5jaGVjayh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHdoaWxlIChwcCAmJiAhbi5Ob2RlLmNoZWNrKHBwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHBwID0gcHAucGFyZW50UGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcCkge1xuICAgICAgICAgICAgICAgIHBwID0gcHAucGFyZW50UGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAocHAgJiYgIW4uTm9kZS5jaGVjayhwcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHBwID0gcHAucGFyZW50UGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHAgfHwgbnVsbDtcbiAgICB9O1xuICAgIC8vIFRoZSBjbG9zZXN0IGVuY2xvc2luZyBzY29wZSB0aGF0IGdvdmVybnMgdGhpcyBub2RlLlxuICAgIE5QcC5fY29tcHV0ZVNjb3BlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICB2YXIgcHAgPSB0aGlzLnBhcmVudFBhdGg7XG4gICAgICAgIHZhciBzY29wZSA9IHBwICYmIHBwLnNjb3BlO1xuICAgICAgICBpZiAobi5Ob2RlLmNoZWNrKHZhbHVlKSAmJlxuICAgICAgICAgICAgU2NvcGUuaXNFc3RhYmxpc2hlZEJ5KHZhbHVlKSkge1xuICAgICAgICAgICAgc2NvcGUgPSBuZXcgU2NvcGUodGhpcywgc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY29wZSB8fCBudWxsO1xuICAgIH07XG4gICAgTlBwLmdldFZhbHVlUHJvcGVydHkgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdHlwZXMuZ2V0RmllbGRWYWx1ZSh0aGlzLnZhbHVlLCBuYW1lKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoaXMubm9kZSBuZWVkcyB0byBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIGluIG9yZGVyXG4gICAgICogZm9yIGEgcGFyc2VyIHRvIHJlcHJvZHVjZSB0aGUgc2FtZSBsb2NhbCBBU1Qgc3RydWN0dXJlLlxuICAgICAqXG4gICAgICogRm9yIGluc3RhbmNlLCBpbiB0aGUgZXhwcmVzc2lvbiBgKDEgKyAyKSAqIDNgLCB0aGUgQmluYXJ5RXhwcmVzc2lvblxuICAgICAqIHdob3NlIG9wZXJhdG9yIGlzIFwiK1wiIG5lZWRzIHBhcmVudGhlc2VzLCBiZWNhdXNlIGAxICsgMiAqIDNgIHdvdWxkXG4gICAgICogcGFyc2UgZGlmZmVyZW50bHkuXG4gICAgICpcbiAgICAgKiBJZiBhc3N1bWVFeHByZXNzaW9uQ29udGV4dCA9PT0gdHJ1ZSwgd2UgZG9uJ3Qgd29ycnkgYWJvdXQgZWRnZSBjYXNlc1xuICAgICAqIGxpa2UgYW4gYW5vbnltb3VzIEZ1bmN0aW9uRXhwcmVzc2lvbiBhcHBlYXJpbmcgbGV4aWNhbGx5IGZpcnN0IGluIGl0c1xuICAgICAqIGVuY2xvc2luZyBzdGF0ZW1lbnQgYW5kIHRodXMgbmVlZGluZyBwYXJlbnRoZXNlcyB0byBhdm9pZCBiZWluZyBwYXJzZWRcbiAgICAgKiBhcyBhIEZ1bmN0aW9uRGVjbGFyYXRpb24gd2l0aCBhIG1pc3NpbmcgbmFtZS5cbiAgICAgKi9cbiAgICBOUHAubmVlZHNQYXJlbnMgPSBmdW5jdGlvbiAoYXNzdW1lRXhwcmVzc2lvbkNvbnRleHQpIHtcbiAgICAgICAgdmFyIHBwID0gdGhpcy5wYXJlbnRQYXRoO1xuICAgICAgICBpZiAoIXBwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAvLyBPbmx5IGV4cHJlc3Npb25zIG5lZWQgcGFyZW50aGVzZXMuXG4gICAgICAgIGlmICghbi5FeHByZXNzaW9uLmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWRlbnRpZmllcnMgbmV2ZXIgbmVlZCBwYXJlbnRoZXNlcy5cbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoIW4uTm9kZS5jaGVjayhwcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHBwID0gcHAucGFyZW50UGF0aDtcbiAgICAgICAgICAgIGlmICghcHApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudCA9IHBwLnZhbHVlO1xuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcIlVuYXJ5RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJTcHJlYWRQcm9wZXJ0eVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5uYW1lID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICYmIHBhcmVudC5vYmplY3QgPT09IG5vZGU7XG4gICAgICAgICAgICBjYXNlIFwiQmluYXJ5RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQ2FsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWUgPT09IFwiY2FsbGVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXJlbnQuY2FsbGVlID09PSBub2RlO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJTcHJlYWRFbGVtZW50XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJTcHJlYWRQcm9wZXJ0eVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGFyZW50Lm9iamVjdCA9PT0gbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkJpbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuXzEgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvID0gcGFyZW50Lm9wZXJhdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBwXzEgPSBQUkVDRURFTkNFW3BvXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBubyA9IG5fMS5vcGVyYXRvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBucCA9IFBSRUNFREVOQ0Vbbm9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBwXzEgPiBucCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBwXzEgPT09IG5wICYmIHRoaXMubmFtZSA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5yaWdodCAhPT0gbl8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVzIG11c3QgYmUgZXF1YWxcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcIlNlcXVlbmNlRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkZvclN0YXRlbWVudFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWx0aG91Z2ggcGFyZW50aGVzZXMgd291bGRuJ3QgaHVydCBhcm91bmQgc2VxdWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3Npb25zIGluIHRoZSBoZWFkIG9mIGZvciBsb29wcywgdHJhZGl0aW9uYWwgc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpY3RhdGVzIHRoYXQgZS5nLiBpKyssIGorKyBzaG91bGQgbm90IGJlIHdyYXBwZWQgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50aGVzZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJFeHByZXNzaW9uU3RhdGVtZW50XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lICE9PSBcImV4cHJlc3Npb25cIjtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBlcnIgb24gdGhlIHNpZGUgb2Ygb3ZlcnBhcmVudGhlc2l6YXRpb24sIGFkZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgZXhjZXB0aW9ucyBhYm92ZSBpZiB0aGlzIHByb3ZlcyBvdmVyemVhbG91cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJZaWVsZEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJCaW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJMb2dpY2FsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJTcHJlYWRFbGVtZW50XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJTcHJlYWRQcm9wZXJ0eVwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQ2FsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk5ld0V4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiWWllbGRFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiTGl0ZXJhbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgaXNOdW1iZXIuY2hlY2sobm9kZS52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5uYW1lID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICYmIHBhcmVudC5vYmplY3QgPT09IG5vZGU7XG4gICAgICAgICAgICBjYXNlIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNwcmVhZFByb3BlcnR5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJCaW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJMb2dpY2FsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA9PT0gXCJjYWxsZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBhcmVudC5jYWxsZWUgPT09IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWUgPT09IFwidGVzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGFyZW50LnRlc3QgPT09IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGFyZW50Lm9iamVjdCA9PT0gbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJOZXdFeHByZXNzaW9uXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lID09PSBcImNhbGxlZVwiICYmXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5jYWxsZWUgPT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zQ2FsbEV4cHJlc3Npb24obm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhc3N1bWVFeHByZXNzaW9uQ29udGV4dCAhPT0gdHJ1ZSAmJlxuICAgICAgICAgICAgIXRoaXMuY2FuQmVGaXJzdEluU3RhdGVtZW50KCkgJiZcbiAgICAgICAgICAgIHRoaXMuZmlyc3RJblN0YXRlbWVudCgpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGlzQmluYXJ5KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG4uQmluYXJ5RXhwcmVzc2lvbi5jaGVjayhub2RlKVxuICAgICAgICAgICAgfHwgbi5Mb2dpY2FsRXhwcmVzc2lvbi5jaGVjayhub2RlKTtcbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZSAnaXNVbmFyeUxpa2UnIGlzIGRlY2xhcmVkIGJ1dCBpdHMgdmFsdWUgaXMgbmV2ZXIgcmVhZC4gWzYxMzNdXG4gICAgZnVuY3Rpb24gaXNVbmFyeUxpa2Uobm9kZSkge1xuICAgICAgICByZXR1cm4gbi5VbmFyeUV4cHJlc3Npb24uY2hlY2sobm9kZSlcbiAgICAgICAgICAgIC8vIEkgY29uc2lkZXJlZCBtYWtpbmcgU3ByZWFkRWxlbWVudCBhbmQgU3ByZWFkUHJvcGVydHkgc3VidHlwZXNcbiAgICAgICAgICAgIC8vIG9mIFVuYXJ5RXhwcmVzc2lvbiwgYnV0IHRoZXkncmUgbm90IHJlYWxseSBFeHByZXNzaW9uIG5vZGVzLlxuICAgICAgICAgICAgfHwgKG4uU3ByZWFkRWxlbWVudCAmJiBuLlNwcmVhZEVsZW1lbnQuY2hlY2sobm9kZSkpXG4gICAgICAgICAgICB8fCAobi5TcHJlYWRQcm9wZXJ0eSAmJiBuLlNwcmVhZFByb3BlcnR5LmNoZWNrKG5vZGUpKTtcbiAgICB9XG4gICAgdmFyIFBSRUNFREVOQ0UgPSB7fTtcbiAgICBbW1wifHxcIl0sXG4gICAgICAgIFtcIiYmXCJdLFxuICAgICAgICBbXCJ8XCJdLFxuICAgICAgICBbXCJeXCJdLFxuICAgICAgICBbXCImXCJdLFxuICAgICAgICBbXCI9PVwiLCBcIj09PVwiLCBcIiE9XCIsIFwiIT09XCJdLFxuICAgICAgICBbXCI8XCIsIFwiPlwiLCBcIjw9XCIsIFwiPj1cIiwgXCJpblwiLCBcImluc3RhbmNlb2ZcIl0sXG4gICAgICAgIFtcIj4+XCIsIFwiPDxcIiwgXCI+Pj5cIl0sXG4gICAgICAgIFtcIitcIiwgXCItXCJdLFxuICAgICAgICBbXCIqXCIsIFwiL1wiLCBcIiVcIl1cbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKHRpZXIsIGkpIHtcbiAgICAgICAgdGllci5mb3JFYWNoKGZ1bmN0aW9uIChvcCkge1xuICAgICAgICAgICAgUFJFQ0VERU5DRVtvcF0gPSBpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBjb250YWluc0NhbGxFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKG4uQ2FsbEV4cHJlc3Npb24uY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FycmF5LmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5zb21lKGNvbnRhaW5zQ2FsbEV4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuLk5vZGUuY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlcy5zb21lRmllbGQobm9kZSwgZnVuY3Rpb24gKF9uYW1lLCBjaGlsZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc0NhbGxFeHByZXNzaW9uKGNoaWxkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgTlBwLmNhbkJlRmlyc3RJblN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGU7XG4gICAgICAgIHJldHVybiAhbi5GdW5jdGlvbkV4cHJlc3Npb24uY2hlY2sobm9kZSlcbiAgICAgICAgICAgICYmICFuLk9iamVjdEV4cHJlc3Npb24uY2hlY2sobm9kZSk7XG4gICAgfTtcbiAgICBOUHAuZmlyc3RJblN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0SW5TdGF0ZW1lbnQodGhpcyk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBmaXJzdEluU3RhdGVtZW50KHBhdGgpIHtcbiAgICAgICAgZm9yICh2YXIgbm9kZSwgcGFyZW50OyBwYXRoLnBhcmVudDsgcGF0aCA9IHBhdGgucGFyZW50KSB7XG4gICAgICAgICAgICBub2RlID0gcGF0aC5ub2RlO1xuICAgICAgICAgICAgcGFyZW50ID0gcGF0aC5wYXJlbnQubm9kZTtcbiAgICAgICAgICAgIGlmIChuLkJsb2NrU3RhdGVtZW50LmNoZWNrKHBhcmVudCkgJiZcbiAgICAgICAgICAgICAgICBwYXRoLnBhcmVudC5uYW1lID09PSBcImJvZHlcIiAmJlxuICAgICAgICAgICAgICAgIHBhdGgubmFtZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuYm9keVswXSAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLkV4cHJlc3Npb25TdGF0ZW1lbnQuY2hlY2socGFyZW50KSAmJlxuICAgICAgICAgICAgICAgIHBhdGgubmFtZSA9PT0gXCJleHByZXNzaW9uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50LmV4cHJlc3Npb24gIT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZXMgbXVzdCBiZSBlcXVhbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobi5TZXF1ZW5jZUV4cHJlc3Npb24uY2hlY2socGFyZW50KSAmJlxuICAgICAgICAgICAgICAgIHBhdGgucGFyZW50Lm5hbWUgPT09IFwiZXhwcmVzc2lvbnNcIiAmJlxuICAgICAgICAgICAgICAgIHBhdGgubmFtZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuZXhwcmVzc2lvbnNbMF0gIT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZXMgbXVzdCBiZSBlcXVhbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobi5DYWxsRXhwcmVzc2lvbi5jaGVjayhwYXJlbnQpICYmXG4gICAgICAgICAgICAgICAgcGF0aC5uYW1lID09PSBcImNhbGxlZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5jYWxsZWUgIT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZXMgbXVzdCBiZSBlcXVhbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobi5NZW1iZXJFeHByZXNzaW9uLmNoZWNrKHBhcmVudCkgJiZcbiAgICAgICAgICAgICAgICBwYXRoLm5hbWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Lm9iamVjdCAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLkNvbmRpdGlvbmFsRXhwcmVzc2lvbi5jaGVjayhwYXJlbnQpICYmXG4gICAgICAgICAgICAgICAgcGF0aC5uYW1lID09PSBcInRlc3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQudGVzdCAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0JpbmFyeShwYXJlbnQpICYmXG4gICAgICAgICAgICAgICAgcGF0aC5uYW1lID09PSBcImxlZnRcIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQubGVmdCAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLlVuYXJ5RXhwcmVzc2lvbi5jaGVjayhwYXJlbnQpICYmXG4gICAgICAgICAgICAgICAgIXBhcmVudC5wcmVmaXggJiZcbiAgICAgICAgICAgICAgICBwYXRoLm5hbWUgPT09IFwiYXJndW1lbnRcIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuYXJndW1lbnQgIT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZXMgbXVzdCBiZSBlcXVhbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBydW5pbmcgY2VydGFpbiBub2RlcyB3aWxsIHJlc3VsdCBpbiBlbXB0eSBvciBpbmNvbXBsZXRlIG5vZGVzLCBoZXJlIHdlIGNsZWFuIHRob3NlIG5vZGVzIHVwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsZWFuVXBOb2Rlc0FmdGVyUHJ1bmUocmVtYWluaW5nTm9kZVBhdGgpIHtcbiAgICAgICAgaWYgKG4uVmFyaWFibGVEZWNsYXJhdGlvbi5jaGVjayhyZW1haW5pbmdOb2RlUGF0aC5ub2RlKSkge1xuICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHJlbWFpbmluZ05vZGVQYXRoLmdldCgnZGVjbGFyYXRpb25zJykudmFsdWU7XG4gICAgICAgICAgICBpZiAoIWRlY2xhcmF0aW9ucyB8fCBkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZ05vZGVQYXRoLnBydW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobi5FeHByZXNzaW9uU3RhdGVtZW50LmNoZWNrKHJlbWFpbmluZ05vZGVQYXRoLm5vZGUpKSB7XG4gICAgICAgICAgICBpZiAoIXJlbWFpbmluZ05vZGVQYXRoLmdldCgnZXhwcmVzc2lvbicpLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZ05vZGVQYXRoLnBydW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobi5JZlN0YXRlbWVudC5jaGVjayhyZW1haW5pbmdOb2RlUGF0aC5ub2RlKSkge1xuICAgICAgICAgICAgY2xlYW5VcElmU3RhdGVtZW50QWZ0ZXJQcnVuZShyZW1haW5pbmdOb2RlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbWFpbmluZ05vZGVQYXRoO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjbGVhblVwSWZTdGF0ZW1lbnRBZnRlclBydW5lKGlmU3RhdGVtZW50KSB7XG4gICAgICAgIHZhciB0ZXN0RXhwcmVzc2lvbiA9IGlmU3RhdGVtZW50LmdldCgndGVzdCcpLnZhbHVlO1xuICAgICAgICB2YXIgYWx0ZXJuYXRlID0gaWZTdGF0ZW1lbnQuZ2V0KCdhbHRlcm5hdGUnKS52YWx1ZTtcbiAgICAgICAgdmFyIGNvbnNlcXVlbnQgPSBpZlN0YXRlbWVudC5nZXQoJ2NvbnNlcXVlbnQnKS52YWx1ZTtcbiAgICAgICAgaWYgKCFjb25zZXF1ZW50ICYmICFhbHRlcm5hdGUpIHtcbiAgICAgICAgICAgIHZhciB0ZXN0RXhwcmVzc2lvblN0YXRlbWVudCA9IGIuZXhwcmVzc2lvblN0YXRlbWVudCh0ZXN0RXhwcmVzc2lvbik7XG4gICAgICAgICAgICBpZlN0YXRlbWVudC5yZXBsYWNlKHRlc3RFeHByZXNzaW9uU3RhdGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghY29uc2VxdWVudCAmJiBhbHRlcm5hdGUpIHtcbiAgICAgICAgICAgIHZhciBuZWdhdGVkVGVzdEV4cHJlc3Npb24gPSBiLnVuYXJ5RXhwcmVzc2lvbignIScsIHRlc3RFeHByZXNzaW9uLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChuLlVuYXJ5RXhwcmVzc2lvbi5jaGVjayh0ZXN0RXhwcmVzc2lvbikgJiYgdGVzdEV4cHJlc3Npb24ub3BlcmF0b3IgPT09ICchJykge1xuICAgICAgICAgICAgICAgIG5lZ2F0ZWRUZXN0RXhwcmVzc2lvbiA9IHRlc3RFeHByZXNzaW9uLmFyZ3VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWZTdGF0ZW1lbnQuZ2V0KFwidGVzdFwiKS5yZXBsYWNlKG5lZ2F0ZWRUZXN0RXhwcmVzc2lvbik7XG4gICAgICAgICAgICBpZlN0YXRlbWVudC5nZXQoXCJjb25zZXF1ZW50XCIpLnJlcGxhY2UoYWx0ZXJuYXRlKTtcbiAgICAgICAgICAgIGlmU3RhdGVtZW50LmdldChcImFsdGVybmF0ZVwiKS5yZXBsYWNlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE5vZGVQYXRoO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gbm9kZVBhdGhQbHVnaW47XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3R5cGVzXCIpKTtcbnZhciBub2RlX3BhdGhfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL25vZGUtcGF0aFwiKSk7XG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIHBhdGhWaXNpdG9yUGx1Z2luKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBOb2RlUGF0aCA9IGZvcmsudXNlKG5vZGVfcGF0aF8xLmRlZmF1bHQpO1xuICAgIHZhciBpc0FycmF5ID0gdHlwZXMuYnVpbHRJblR5cGVzLmFycmF5O1xuICAgIHZhciBpc09iamVjdCA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5vYmplY3Q7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlcy5idWlsdEluVHlwZXMuZnVuY3Rpb247XG4gICAgdmFyIHVuZGVmaW5lZDtcbiAgICB2YXIgUGF0aFZpc2l0b3IgPSBmdW5jdGlvbiBQYXRoVmlzaXRvcigpIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhdGhWaXNpdG9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aFZpc2l0b3IgY29uc3RydWN0b3IgY2Fubm90IGJlIGludm9rZWQgd2l0aG91dCAnbmV3J1wiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQZXJtYW5lbnQgc3RhdGUuXG4gICAgICAgIHRoaXMuX3JldXNhYmxlQ29udGV4dFN0YWNrID0gW107XG4gICAgICAgIHRoaXMuX21ldGhvZE5hbWVUYWJsZSA9IGNvbXB1dGVNZXRob2ROYW1lVGFibGUodGhpcyk7XG4gICAgICAgIHRoaXMuX3Nob3VsZFZpc2l0Q29tbWVudHMgPVxuICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcy5fbWV0aG9kTmFtZVRhYmxlLCBcIkJsb2NrXCIpIHx8XG4gICAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcy5fbWV0aG9kTmFtZVRhYmxlLCBcIkxpbmVcIik7XG4gICAgICAgIHRoaXMuQ29udGV4dCA9IG1ha2VDb250ZXh0Q29uc3RydWN0b3IodGhpcyk7XG4gICAgICAgIC8vIFN0YXRlIHJlc2V0IGV2ZXJ5IHRpbWUgUGF0aFZpc2l0b3IucHJvdG90eXBlLnZpc2l0IGlzIGNhbGxlZC5cbiAgICAgICAgdGhpcy5fdmlzaXRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY2hhbmdlUmVwb3J0ZWQgPSBmYWxzZTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXRob2ROYW1lVGFibGUodmlzaXRvcikge1xuICAgICAgICB2YXIgdHlwZU5hbWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yICh2YXIgbWV0aG9kTmFtZSBpbiB2aXNpdG9yKSB7XG4gICAgICAgICAgICBpZiAoL152aXNpdFtBLVpdLy50ZXN0KG1ldGhvZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdHlwZU5hbWVzW21ldGhvZE5hbWUuc2xpY2UoXCJ2aXNpdFwiLmxlbmd0aCldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgc3VwZXJ0eXBlVGFibGUgPSB0eXBlcy5jb21wdXRlU3VwZXJ0eXBlTG9va3VwVGFibGUodHlwZU5hbWVzKTtcbiAgICAgICAgdmFyIG1ldGhvZE5hbWVUYWJsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHZhciB0eXBlTmFtZUtleXMgPSBPYmplY3Qua2V5cyhzdXBlcnR5cGVUYWJsZSk7XG4gICAgICAgIHZhciB0eXBlTmFtZUNvdW50ID0gdHlwZU5hbWVLZXlzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlTmFtZUNvdW50OyArK2kpIHtcbiAgICAgICAgICAgIHZhciB0eXBlTmFtZSA9IHR5cGVOYW1lS2V5c1tpXTtcbiAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBcInZpc2l0XCIgKyBzdXBlcnR5cGVUYWJsZVt0eXBlTmFtZV07XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbi5jaGVjayh2aXNpdG9yW21ldGhvZE5hbWVdKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZE5hbWVUYWJsZVt0eXBlTmFtZV0gPSBtZXRob2ROYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRob2ROYW1lVGFibGU7XG4gICAgfVxuICAgIFBhdGhWaXNpdG9yLmZyb21NZXRob2RzT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU1ldGhvZHNPYmplY3QobWV0aG9kcykge1xuICAgICAgICBpZiAobWV0aG9kcyBpbnN0YW5jZW9mIFBhdGhWaXNpdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzT2JqZWN0LmNoZWNrKG1ldGhvZHMpKSB7XG4gICAgICAgICAgICAvLyBBbiBlbXB0eSB2aXNpdG9yP1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXRoVmlzaXRvcjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgVmlzaXRvciA9IGZ1bmN0aW9uIFZpc2l0b3IoKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVmlzaXRvcikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWaXNpdG9yIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBpbnZva2VkIHdpdGhvdXQgJ25ldydcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBQYXRoVmlzaXRvci5jYWxsKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgVnAgPSBWaXNpdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoUFZwKTtcbiAgICAgICAgVnAuY29uc3RydWN0b3IgPSBWaXNpdG9yO1xuICAgICAgICBleHRlbmQoVnAsIG1ldGhvZHMpO1xuICAgICAgICBleHRlbmQoVmlzaXRvciwgUGF0aFZpc2l0b3IpO1xuICAgICAgICBpc0Z1bmN0aW9uLmFzc2VydChWaXNpdG9yLmZyb21NZXRob2RzT2JqZWN0KTtcbiAgICAgICAgaXNGdW5jdGlvbi5hc3NlcnQoVmlzaXRvci52aXNpdCk7XG4gICAgICAgIHJldHVybiBuZXcgVmlzaXRvcjtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChzb3VyY2UsIHByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wZXJ0eV0gPSBzb3VyY2VbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIFBhdGhWaXNpdG9yLnZpc2l0ID0gZnVuY3Rpb24gdmlzaXQobm9kZSwgbWV0aG9kcykge1xuICAgICAgICByZXR1cm4gUGF0aFZpc2l0b3IuZnJvbU1ldGhvZHNPYmplY3QobWV0aG9kcykudmlzaXQobm9kZSk7XG4gICAgfTtcbiAgICB2YXIgUFZwID0gUGF0aFZpc2l0b3IucHJvdG90eXBlO1xuICAgIFBWcC52aXNpdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Zpc2l0aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWN1cnNpdmVseSBjYWxsaW5nIHZpc2l0b3IudmlzaXQocGF0aCkgcmVzZXRzIHZpc2l0b3Igc3RhdGUuIFwiICtcbiAgICAgICAgICAgICAgICBcIlRyeSB0aGlzLnZpc2l0KHBhdGgpIG9yIHRoaXMudHJhdmVyc2UocGF0aCkgaW5zdGVhZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJpdmF0ZSBzdGF0ZSB0aGF0IG5lZWRzIHRvIGJlIHJlc2V0IGJlZm9yZSBldmVyeSB0cmF2ZXJzYWwuXG4gICAgICAgIHRoaXMuX3Zpc2l0aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY2hhbmdlUmVwb3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYWJvcnRSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGFyZ2MgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmdjKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdjOyArK2kpIHtcbiAgICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoYXJnc1swXSBpbnN0YW5jZW9mIE5vZGVQYXRoKSkge1xuICAgICAgICAgICAgYXJnc1swXSA9IG5ldyBOb2RlUGF0aCh7IHJvb3Q6IGFyZ3NbMF0gfSkuZ2V0KFwicm9vdFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYWxsZWQgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgYXMgLnZpc2l0LlxuICAgICAgICB0aGlzLnJlc2V0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB2YXIgZGlkTm90VGhyb3c7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgcm9vdCA9IHRoaXMudmlzaXRXaXRob3V0UmVzZXQoYXJnc1swXSk7XG4gICAgICAgICAgICBkaWROb3RUaHJvdyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl92aXNpdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFkaWROb3RUaHJvdyAmJiB0aGlzLl9hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMudmlzaXRXaXRob3V0UmVzZXQgdGhyZXcgYW4gZXhjZXB0aW9uIGFuZFxuICAgICAgICAgICAgICAgIC8vIHRoaXMuX2Fib3J0UmVxdWVzdGVkIHdhcyBzZXQgdG8gdHJ1ZSwgcmV0dXJuIHRoZSByb290IG9mXG4gICAgICAgICAgICAgICAgLy8gdGhlIEFTVCBpbnN0ZWFkIG9mIGxldHRpbmcgdGhlIGV4Y2VwdGlvbiBwcm9wYWdhdGUsIHNvIHRoYXRcbiAgICAgICAgICAgICAgICAvLyBjbGllbnQgY29kZSBkb2VzIG5vdCBoYXZlIHRvIHByb3ZpZGUgYSB0cnktY2F0Y2ggYmxvY2sgdG9cbiAgICAgICAgICAgICAgICAvLyBpbnRlcmNlcHQgdGhlIEFib3J0UmVxdWVzdCBleGNlcHRpb24uICBPdGhlciBraW5kcyBvZlxuICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbnMgd2lsbCBwcm9wYWdhdGUgd2l0aG91dCBiZWluZyBpbnRlcmNlcHRlZCBhbmRcbiAgICAgICAgICAgICAgICAvLyByZXRocm93biBieSBhIGNhdGNoIGJsb2NrLCBzbyB0aGVpciBzdGFja3Mgd2lsbCBhY2N1cmF0ZWx5XG4gICAgICAgICAgICAgICAgLy8gcmVmbGVjdCB0aGUgb3JpZ2luYWwgdGhyb3dpbmcgY29udGV4dC5cbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnc1swXS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9O1xuICAgIFBWcC5BYm9ydFJlcXVlc3QgPSBmdW5jdGlvbiBBYm9ydFJlcXVlc3QoKSB7IH07XG4gICAgUFZwLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmlzaXRvciA9IHRoaXM7XG4gICAgICAgIHZpc2l0b3IuX2Fib3J0UmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgdmlzaXRvci5BYm9ydFJlcXVlc3QoKTtcbiAgICAgICAgLy8gSWYgeW91IGRlY2lkZSB0byBjYXRjaCB0aGlzIGV4Y2VwdGlvbiBhbmQgc3RvcCBpdCBmcm9tIHByb3BhZ2F0aW5nLFxuICAgICAgICAvLyBtYWtlIHN1cmUgdG8gY2FsbCBpdHMgY2FuY2VsIG1ldGhvZCB0byBhdm9pZCBzaWxlbmNpbmcgb3RoZXJcbiAgICAgICAgLy8gZXhjZXB0aW9ucyB0aGF0IG1pZ2h0IGJlIHRocm93biBsYXRlciBpbiB0aGUgdHJhdmVyc2FsLlxuICAgICAgICByZXF1ZXN0LmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZpc2l0b3IuX2Fib3J0UmVxdWVzdGVkID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIHRocm93IHJlcXVlc3Q7XG4gICAgfTtcbiAgICBQVnAucmVzZXQgPSBmdW5jdGlvbiAoX3BhdGggLyosIGFkZGl0aW9uYWwgYXJndW1lbnRzICovKSB7XG4gICAgICAgIC8vIEVtcHR5IHN0dWI7IG1heSBiZSByZWFzc2lnbmVkIG9yIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy5cbiAgICB9O1xuICAgIFBWcC52aXNpdFdpdGhvdXRSZXNldCA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSB7XG4gICAgICAgICAgICAvLyBTaW5jZSB0aGlzLkNvbnRleHQucHJvdG90eXBlID09PSB0aGlzLCB0aGVyZSdzIGEgY2hhbmNlIHdlXG4gICAgICAgICAgICAvLyBtaWdodCBhY2NpZGVudGFsbHkgY2FsbCBjb250ZXh0LnZpc2l0V2l0aG91dFJlc2V0LiBJZiB0aGF0XG4gICAgICAgICAgICAvLyBoYXBwZW5zLCByZS1pbnZva2UgdGhlIG1ldGhvZCBhZ2FpbnN0IGNvbnRleHQudmlzaXRvci5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0b3IudmlzaXRXaXRob3V0UmVzZXQocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocGF0aCBpbnN0YW5jZW9mIE5vZGVQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhdGgudmFsdWU7XG4gICAgICAgIHZhciBtZXRob2ROYW1lID0gdmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlLnR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIHRoaXMuX21ldGhvZE5hbWVUYWJsZVt2YWx1ZS50eXBlXTtcbiAgICAgICAgaWYgKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5hY3F1aXJlQ29udGV4dChwYXRoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuaW52b2tlVmlzaXRvck1ldGhvZChtZXRob2ROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVsZWFzZUNvbnRleHQoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXMgbm8gdmlzaXRvciBtZXRob2QgdG8gY2FsbCwgdmlzaXQgdGhlIGNoaWxkcmVuIG9mXG4gICAgICAgICAgICAvLyB0aGlzIG5vZGUgZ2VuZXJpY2FsbHkuXG4gICAgICAgICAgICByZXR1cm4gdmlzaXRDaGlsZHJlbihwYXRoLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgZnVuY3Rpb24gdmlzaXRDaGlsZHJlbihwYXRoLCB2aXNpdG9yKSB7XG4gICAgICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh2aXNpdG9yIGluc3RhbmNlb2YgUGF0aFZpc2l0b3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlID0gcGF0aC52YWx1ZTtcbiAgICAgICAgaWYgKGlzQXJyYXkuY2hlY2sodmFsdWUpKSB7XG4gICAgICAgICAgICBwYXRoLmVhY2godmlzaXRvci52aXNpdFdpdGhvdXRSZXNldCwgdmlzaXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0LmNoZWNrKHZhbHVlKSkge1xuICAgICAgICAgICAgLy8gTm8gY2hpbGRyZW4gdG8gdmlzaXQuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgY2hpbGROYW1lcyA9IHR5cGVzLmdldEZpZWxkTmFtZXModmFsdWUpO1xuICAgICAgICAgICAgLy8gVGhlIC5jb21tZW50cyBmaWVsZCBvZiB0aGUgTm9kZSB0eXBlIGlzIGhpZGRlbiwgc28gd2Ugb25seVxuICAgICAgICAgICAgLy8gdmlzaXQgaXQgaWYgdGhlIHZpc2l0b3IgZGVmaW5lcyB2aXNpdEJsb2NrIG9yIHZpc2l0TGluZSwgYW5kXG4gICAgICAgICAgICAvLyB2YWx1ZS5jb21tZW50cyBpcyBkZWZpbmVkLlxuICAgICAgICAgICAgaWYgKHZpc2l0b3IuX3Nob3VsZFZpc2l0Q29tbWVudHMgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZS5jb21tZW50cyAmJlxuICAgICAgICAgICAgICAgIGNoaWxkTmFtZXMuaW5kZXhPZihcImNvbW1lbnRzXCIpIDwgMCkge1xuICAgICAgICAgICAgICAgIGNoaWxkTmFtZXMucHVzaChcImNvbW1lbnRzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNoaWxkQ291bnQgPSBjaGlsZE5hbWVzLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBjaGlsZFBhdGhzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZE5hbWUgPSBjaGlsZE5hbWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwodmFsdWUsIGNoaWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbY2hpbGROYW1lXSA9IHR5cGVzLmdldEZpZWxkVmFsdWUodmFsdWUsIGNoaWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoaWxkUGF0aHMucHVzaChwYXRoLmdldChjaGlsZE5hbWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdFdpdGhvdXRSZXNldChjaGlsZFBhdGhzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aC52YWx1ZTtcbiAgICB9XG4gICAgUFZwLmFjcXVpcmVDb250ZXh0ID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JldXNhYmxlQ29udGV4dFN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLkNvbnRleHQocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JldXNhYmxlQ29udGV4dFN0YWNrLnBvcCgpLnJlc2V0KHBhdGgpO1xuICAgIH07XG4gICAgUFZwLnJlbGVhc2VDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCEoY29udGV4dCBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXVzYWJsZUNvbnRleHRTdGFjay5wdXNoKGNvbnRleHQpO1xuICAgICAgICBjb250ZXh0LmN1cnJlbnRQYXRoID0gbnVsbDtcbiAgICB9O1xuICAgIFBWcC5yZXBvcnRDaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9jaGFuZ2VSZXBvcnRlZCA9IHRydWU7XG4gICAgfTtcbiAgICBQVnAud2FzQ2hhbmdlUmVwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFuZ2VSZXBvcnRlZDtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIG1ha2VDb250ZXh0Q29uc3RydWN0b3IodmlzaXRvcikge1xuICAgICAgICBmdW5jdGlvbiBDb250ZXh0KHBhdGgpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXRoVmlzaXRvcikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShwYXRoIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwidmlzaXRvclwiLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZpc2l0b3IsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYXRoID0gcGF0aDtcbiAgICAgICAgICAgIHRoaXMubmVlZFRvQ2FsbFRyYXZlcnNlID0gdHJ1ZTtcbiAgICAgICAgICAgIE9iamVjdC5zZWFsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHZpc2l0b3IgaW5zdGFuY2VvZiBQYXRoVmlzaXRvcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIHZpc2l0b3Igb2JqZWN0IGlzIHRoZSBwcm90b3R5cGUgb2YgQ29udGV4dC5wcm90b3R5cGUsXG4gICAgICAgIC8vIHNvIGFsbCB2aXNpdG9yIG1ldGhvZHMgYXJlIGluaGVyaXRlZCBieSBjb250ZXh0IG9iamVjdHMuXG4gICAgICAgIHZhciBDcCA9IENvbnRleHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh2aXNpdG9yKTtcbiAgICAgICAgQ3AuY29uc3RydWN0b3IgPSBDb250ZXh0O1xuICAgICAgICBleHRlbmQoQ3AsIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMpO1xuICAgICAgICByZXR1cm4gQ29udGV4dDtcbiAgICB9XG4gICAgLy8gRXZlcnkgUGF0aFZpc2l0b3IgaGFzIGEgZGlmZmVyZW50IHRoaXMuQ29udGV4dCBjb25zdHJ1Y3RvciBhbmRcbiAgICAvLyB0aGlzLkNvbnRleHQucHJvdG90eXBlIG9iamVjdCwgYnV0IHRob3NlIHByb3RvdHlwZXMgY2FuIGFsbCB1c2UgdGhlXG4gICAgLy8gc2FtZSByZXNldCwgaW52b2tlVmlzaXRvck1ldGhvZCwgYW5kIHRyYXZlcnNlIGZ1bmN0aW9uIG9iamVjdHMuXG4gICAgdmFyIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMucmVzZXQgPVxuICAgICAgICBmdW5jdGlvbiByZXNldChwYXRoKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYXRoID0gcGF0aDtcbiAgICAgICAgICAgIHRoaXMubmVlZFRvQ2FsbFRyYXZlcnNlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMuaW52b2tlVmlzaXRvck1ldGhvZCA9XG4gICAgICAgIGZ1bmN0aW9uIGludm9rZVZpc2l0b3JNZXRob2QobWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISh0aGlzLmN1cnJlbnRQYXRoIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMudmlzaXRvclttZXRob2ROYW1lXS5jYWxsKHRoaXMsIHRoaXMuY3VycmVudFBhdGgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAvLyBWaXNpdG9yIG1ldGhvZHMgcmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhleSBoYXZlIGhhbmRsZWRcbiAgICAgICAgICAgICAgICAvLyB0aGVpciBvd24gdHJhdmVyc2FsIG5lZWRzLCBhbmQgd2Ugc2hvdWxkIG5vdCBjb21wbGFpbiBpZlxuICAgICAgICAgICAgICAgIC8vIHRoaXMubmVlZFRvQ2FsbFRyYXZlcnNlIGlzIHN0aWxsIHRydWUuXG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gQW55IG90aGVyIG5vbi11bmRlZmluZWQgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgdmlzaXRvciBtZXRob2RcbiAgICAgICAgICAgICAgICAvLyBpcyBpbnRlcnByZXRlZCBhcyBhIHJlcGxhY2VtZW50IHZhbHVlLlxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhdGggPSB0aGlzLmN1cnJlbnRQYXRoLnJlcGxhY2UocmVzdWx0KVswXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcy50cmF2ZXJzZSBzdGlsbCBoYXNuJ3QgYmVlbiBjYWxsZWQsIHZpc2l0IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBjaGlsZHJlbiBvZiB0aGUgcmVwbGFjZW1lbnQgbm9kZS5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmF2ZXJzZSh0aGlzLmN1cnJlbnRQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBlaXRoZXIgY2FsbCB0aGlzLnRyYXZlcnNlIG9yIHJldHVybiBmYWxzZSBpbiBcIiArIG1ldGhvZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgICAgICAgICAgcmV0dXJuIHBhdGggJiYgcGF0aC52YWx1ZTtcbiAgICAgICAgfTtcbiAgICBzaGFyZWRDb250ZXh0UHJvdG9NZXRob2RzLnRyYXZlcnNlID1cbiAgICAgICAgZnVuY3Rpb24gdHJhdmVyc2UocGF0aCwgbmV3VmlzaXRvcikge1xuICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShwYXRoIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEodGhpcy5jdXJyZW50UGF0aCBpbnN0YW5jZW9mIE5vZGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmVlZFRvQ2FsbFRyYXZlcnNlID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdmlzaXRDaGlsZHJlbihwYXRoLCBQYXRoVmlzaXRvci5mcm9tTWV0aG9kc09iamVjdChuZXdWaXNpdG9yIHx8IHRoaXMudmlzaXRvcikpO1xuICAgICAgICB9O1xuICAgIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMudmlzaXQgPVxuICAgICAgICBmdW5jdGlvbiB2aXNpdChwYXRoLCBuZXdWaXNpdG9yKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISh0aGlzLmN1cnJlbnRQYXRoIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBQYXRoVmlzaXRvci5mcm9tTWV0aG9kc09iamVjdChuZXdWaXNpdG9yIHx8IHRoaXMudmlzaXRvcikudmlzaXRXaXRob3V0UmVzZXQocGF0aCk7XG4gICAgICAgIH07XG4gICAgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcy5yZXBvcnRDaGFuZ2VkID0gZnVuY3Rpb24gcmVwb3J0Q2hhbmdlZCgpIHtcbiAgICAgICAgdGhpcy52aXNpdG9yLnJlcG9ydENoYW5nZWQoKTtcbiAgICB9O1xuICAgIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMuYWJvcnQgPSBmdW5jdGlvbiBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52aXNpdG9yLmFib3J0KCk7XG4gICAgfTtcbiAgICByZXR1cm4gUGF0aFZpc2l0b3I7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBwYXRoVmlzaXRvclBsdWdpbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdHlwZXNcIikpO1xudmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIHBhdGhQbHVnaW4oZm9yaykge1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIGlzQXJyYXkgPSB0eXBlcy5idWlsdEluVHlwZXMuYXJyYXk7XG4gICAgdmFyIGlzTnVtYmVyID0gdHlwZXMuYnVpbHRJblR5cGVzLm51bWJlcjtcbiAgICB2YXIgUGF0aCA9IGZ1bmN0aW9uIFBhdGgodmFsdWUsIHBhcmVudFBhdGgsIG5hbWUpIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhdGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBpbnZva2VkIHdpdGhvdXQgJ25ldydcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudFBhdGgpIHtcbiAgICAgICAgICAgIGlmICghKHBhcmVudFBhdGggaW5zdGFuY2VvZiBQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudFBhdGggPSBudWxsO1xuICAgICAgICAgICAgbmFtZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHZhbHVlIGVuY2Fwc3VsYXRlZCBieSB0aGlzIFBhdGgsIGdlbmVyYWxseSBlcXVhbCB0b1xuICAgICAgICAvLyBwYXJlbnRQYXRoLnZhbHVlW25hbWVdIGlmIHdlIGhhdmUgYSBwYXJlbnRQYXRoLlxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIC8vIFRoZSBpbW1lZGlhdGUgcGFyZW50IFBhdGggb2YgdGhpcyBQYXRoLlxuICAgICAgICB0aGlzLnBhcmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb2YgcGFyZW50UGF0aC52YWx1ZSB0aHJvdWdoIHdoaWNoIHRoaXNcbiAgICAgICAgLy8gUGF0aCdzIHZhbHVlIHdhcyByZWFjaGVkLlxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAvLyBDYWxsaW5nIHBhdGguZ2V0KFwiY2hpbGRcIikgbXVsdGlwbGUgdGltZXMgYWx3YXlzIHJldHVybnMgdGhlIHNhbWVcbiAgICAgICAgLy8gY2hpbGQgUGF0aCBvYmplY3QsIGZvciBib3RoIHBlcmZvcm1hbmNlIGFuZCBjb25zaXN0ZW5jeSByZWFzb25zLlxuICAgICAgICB0aGlzLl9fY2hpbGRDYWNoZSA9IG51bGw7XG4gICAgfTtcbiAgICB2YXIgUHAgPSBQYXRoLnByb3RvdHlwZTtcbiAgICBmdW5jdGlvbiBnZXRDaGlsZENhY2hlKHBhdGgpIHtcbiAgICAgICAgLy8gTGF6aWx5IGNyZWF0ZSB0aGUgY2hpbGQgY2FjaGUuIFRoaXMgYWxzbyBjaGVhcGVucyBjYWNoZVxuICAgICAgICAvLyBpbnZhbGlkYXRpb24sIHNpbmNlIHlvdSBjYW4ganVzdCByZXNldCBwYXRoLl9fY2hpbGRDYWNoZSB0byBudWxsLlxuICAgICAgICByZXR1cm4gcGF0aC5fX2NoaWxkQ2FjaGUgfHwgKHBhdGguX19jaGlsZENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldENoaWxkUGF0aChwYXRoLCBuYW1lKSB7XG4gICAgICAgIHZhciBjYWNoZSA9IGdldENoaWxkQ2FjaGUocGF0aCk7XG4gICAgICAgIHZhciBhY3R1YWxDaGlsZFZhbHVlID0gcGF0aC5nZXRWYWx1ZVByb3BlcnR5KG5hbWUpO1xuICAgICAgICB2YXIgY2hpbGRQYXRoID0gY2FjaGVbbmFtZV07XG4gICAgICAgIGlmICghaGFzT3duLmNhbGwoY2FjaGUsIG5hbWUpIHx8XG4gICAgICAgICAgICAvLyBFbnN1cmUgY29uc2lzdGVuY3kgYmV0d2VlbiBjYWNoZSBhbmQgcmVhbGl0eS5cbiAgICAgICAgICAgIGNoaWxkUGF0aC52YWx1ZSAhPT0gYWN0dWFsQ2hpbGRWYWx1ZSkge1xuICAgICAgICAgICAgY2hpbGRQYXRoID0gY2FjaGVbbmFtZV0gPSBuZXcgcGF0aC5jb25zdHJ1Y3RvcihhY3R1YWxDaGlsZFZhbHVlLCBwYXRoLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGRQYXRoO1xuICAgIH1cbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvXG4gICAgLy8gaGFuZGxlIG1pc3NpbmcgcHJvcGVydGllcywgZXRjLlxuICAgIFBwLmdldFZhbHVlUHJvcGVydHkgPSBmdW5jdGlvbiBnZXRWYWx1ZVByb3BlcnR5KG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVbbmFtZV07XG4gICAgfTtcbiAgICBQcC5nZXQgPSBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHZhciBuYW1lcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgbmFtZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGF0aCA9IHRoaXM7XG4gICAgICAgIHZhciBjb3VudCA9IG5hbWVzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICAgICAgICBwYXRoID0gZ2V0Q2hpbGRQYXRoKHBhdGgsIG5hbWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9O1xuICAgIFBwLmVhY2ggPSBmdW5jdGlvbiBlYWNoKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBjaGlsZFBhdGhzID0gW107XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAvLyBDb2xsZWN0IGFsbCB0aGUgb3JpZ2luYWwgY2hpbGQgcGF0aHMgYmVmb3JlIGludm9raW5nIHRoZSBjYWxsYmFjay5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKHRoaXMudmFsdWUsIGkpKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRQYXRoc1tpXSA9IHRoaXMuZ2V0KGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEludm9rZSB0aGUgY2FsbGJhY2sgb24ganVzdCB0aGUgb3JpZ2luYWwgY2hpbGQgcGF0aHMsIHJlZ2FyZGxlc3Mgb2ZcbiAgICAgICAgLy8gYW55IG1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGUgYXJyYXkgYnkgdGhlIGNhbGxiYWNrLiBJIGNob3NlIHRoZXNlXG4gICAgICAgIC8vIHNlbWFudGljcyBvdmVyIGNsZXZlcmx5IGludm9raW5nIHRoZSBjYWxsYmFjayBvbiBuZXcgZWxlbWVudHMgYmVjYXVzZVxuICAgICAgICAvLyB0aGlzIHdheSBpcyBtdWNoIGVhc2llciB0byByZWFzb24gYWJvdXQuXG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXM7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGNoaWxkUGF0aHMsIGkpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBjaGlsZFBhdGhzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUHAubWFwID0gZnVuY3Rpb24gbWFwKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChjaGlsZFBhdGgpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNhbGxiYWNrLmNhbGwodGhpcywgY2hpbGRQYXRoKSk7XG4gICAgICAgIH0sIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgUHAuZmlsdGVyID0gZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChjaGlsZFBhdGgpIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjay5jYWxsKHRoaXMsIGNoaWxkUGF0aCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGVtcHR5TW92ZXMoKSB7IH1cbiAgICBmdW5jdGlvbiBnZXRNb3ZlcyhwYXRoLCBvZmZzZXQsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaXNBcnJheS5hc3NlcnQocGF0aC52YWx1ZSk7XG4gICAgICAgIGlmIChvZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBlbXB0eU1vdmVzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsZW5ndGggPSBwYXRoLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBlbXB0eU1vdmVzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhcmdjID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgaWYgKGFyZ2MgPT09IDIpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmdjID09PSAzKSB7XG4gICAgICAgICAgICBzdGFydCA9IE1hdGgubWF4KHN0YXJ0LCAwKTtcbiAgICAgICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoc3RhcnQsIDApO1xuICAgICAgICAgICAgZW5kID0gTWF0aC5taW4oZW5kLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlzTnVtYmVyLmFzc2VydChzdGFydCk7XG4gICAgICAgIGlzTnVtYmVyLmFzc2VydChlbmQpO1xuICAgICAgICB2YXIgbW92ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB2YXIgY2FjaGUgPSBnZXRDaGlsZENhY2hlKHBhdGgpO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKHBhdGgudmFsdWUsIGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkUGF0aCA9IHBhdGguZ2V0KGkpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZFBhdGgubmFtZSAhPT0gaSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBuZXdJbmRleCA9IGkgKyBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgY2hpbGRQYXRoLm5hbWUgPSBuZXdJbmRleDtcbiAgICAgICAgICAgICAgICBtb3Zlc1tuZXdJbmRleF0gPSBjaGlsZFBhdGg7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBjYWNoZS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBuZXdJbmRleCBpbiBtb3Zlcykge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZFBhdGggPSBtb3Zlc1tuZXdJbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkUGF0aC5uYW1lICE9PSArbmV3SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWNoZVtuZXdJbmRleF0gPSBjaGlsZFBhdGg7XG4gICAgICAgICAgICAgICAgcGF0aC52YWx1ZVtuZXdJbmRleF0gPSBjaGlsZFBhdGgudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIFBwLnNoaWZ0ID0gZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgICAgIHZhciBtb3ZlID0gZ2V0TW92ZXModGhpcywgLTEpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy52YWx1ZS5zaGlmdCgpO1xuICAgICAgICBtb3ZlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBQcC51bnNoaWZ0ID0gZnVuY3Rpb24gdW5zaGlmdCgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbW92ZSA9IGdldE1vdmVzKHRoaXMsIGFyZ3MubGVuZ3RoKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMudmFsdWUudW5zaGlmdC5hcHBseSh0aGlzLnZhbHVlLCBhcmdzKTtcbiAgICAgICAgbW92ZSgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgUHAucHVzaCA9IGZ1bmN0aW9uIHB1c2goKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaXNBcnJheS5hc3NlcnQodGhpcy52YWx1ZSk7XG4gICAgICAgIGRlbGV0ZSBnZXRDaGlsZENhY2hlKHRoaXMpLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUucHVzaC5hcHBseSh0aGlzLnZhbHVlLCBhcmdzKTtcbiAgICB9O1xuICAgIFBwLnBvcCA9IGZ1bmN0aW9uIHBvcCgpIHtcbiAgICAgICAgaXNBcnJheS5hc3NlcnQodGhpcy52YWx1ZSk7XG4gICAgICAgIHZhciBjYWNoZSA9IGdldENoaWxkQ2FjaGUodGhpcyk7XG4gICAgICAgIGRlbGV0ZSBjYWNoZVt0aGlzLnZhbHVlLmxlbmd0aCAtIDFdO1xuICAgICAgICBkZWxldGUgY2FjaGUubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5wb3AoKTtcbiAgICB9O1xuICAgIFBwLmluc2VydEF0ID0gZnVuY3Rpb24gaW5zZXJ0QXQoaW5kZXgpIHtcbiAgICAgICAgdmFyIGFyZ2MgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICB2YXIgbW92ZSA9IGdldE1vdmVzKHRoaXMsIGFyZ2MgLSAxLCBpbmRleCk7XG4gICAgICAgIGlmIChtb3ZlID09PSBlbXB0eU1vdmVzICYmIGFyZ2MgPD0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSBNYXRoLm1heChpbmRleCwgMCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlW2luZGV4ICsgaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgICAgIG1vdmUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBQcC5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbiBpbnNlcnRCZWZvcmUoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBwID0gdGhpcy5wYXJlbnRQYXRoO1xuICAgICAgICB2YXIgYXJnYyA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICB2YXIgaW5zZXJ0QXRBcmdzID0gW3RoaXMubmFtZV07XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnYzsgKytpKSB7XG4gICAgICAgICAgICBpbnNlcnRBdEFyZ3MucHVzaChhcmdzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHAuaW5zZXJ0QXQuYXBwbHkocHAsIGluc2VydEF0QXJncyk7XG4gICAgfTtcbiAgICBQcC5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uIGluc2VydEFmdGVyKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcCA9IHRoaXMucGFyZW50UGF0aDtcbiAgICAgICAgdmFyIGFyZ2MgPSBhcmdzLmxlbmd0aDtcbiAgICAgICAgdmFyIGluc2VydEF0QXJncyA9IFt0aGlzLm5hbWUgKyAxXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdjOyArK2kpIHtcbiAgICAgICAgICAgIGluc2VydEF0QXJncy5wdXNoKGFyZ3NbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcC5pbnNlcnRBdC5hcHBseShwcCwgaW5zZXJ0QXRBcmdzKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHJlcGFpclJlbGF0aW9uc2hpcFdpdGhQYXJlbnQocGF0aCkge1xuICAgICAgICBpZiAoIShwYXRoIGluc3RhbmNlb2YgUGF0aCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHAgPSBwYXRoLnBhcmVudFBhdGg7XG4gICAgICAgIGlmICghcHApIHtcbiAgICAgICAgICAgIC8vIE9ycGhhbiBwYXRocyBoYXZlIG5vIHJlbGF0aW9uc2hpcCB0byByZXBhaXIuXG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50VmFsdWUgPSBwcC52YWx1ZTtcbiAgICAgICAgdmFyIHBhcmVudENhY2hlID0gZ2V0Q2hpbGRDYWNoZShwcCk7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSBwYXJlbnRDYWNoZVtwYXRoLm5hbWVdIGlzIHBvcHVsYXRlZC5cbiAgICAgICAgaWYgKHBhcmVudFZhbHVlW3BhdGgubmFtZV0gPT09IHBhdGgudmFsdWUpIHtcbiAgICAgICAgICAgIHBhcmVudENhY2hlW3BhdGgubmFtZV0gPSBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkuY2hlY2socGFyZW50VmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBTb21ldGhpbmcgY2F1c2VkIHBhdGgubmFtZSB0byBiZWNvbWUgb3V0IG9mIGRhdGUsIHNvIGF0dGVtcHQgdG9cbiAgICAgICAgICAgIC8vIHJlY292ZXIgYnkgc2VhcmNoaW5nIGZvciBwYXRoLnZhbHVlIGluIHBhcmVudFZhbHVlLlxuICAgICAgICAgICAgdmFyIGkgPSBwYXJlbnRWYWx1ZS5pbmRleE9mKHBhdGgudmFsdWUpO1xuICAgICAgICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICAgICAgICAgIHBhcmVudENhY2hlW3BhdGgubmFtZSA9IGldID0gcGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHBhdGgudmFsdWUgZGlzYWdyZWVzIHdpdGggcGFyZW50VmFsdWVbcGF0aC5uYW1lXSwgYW5kXG4gICAgICAgICAgICAvLyBwYXRoLm5hbWUgaXMgbm90IGFuIGFycmF5IGluZGV4LCBsZXQgcGF0aC52YWx1ZSBiZWNvbWUgdGhlIG5ld1xuICAgICAgICAgICAgLy8gcGFyZW50VmFsdWVbcGF0aC5uYW1lXSBhbmQgdXBkYXRlIHBhcmVudENhY2hlIGFjY29yZGluZ2x5LlxuICAgICAgICAgICAgcGFyZW50VmFsdWVbcGF0aC5uYW1lXSA9IHBhdGgudmFsdWU7XG4gICAgICAgICAgICBwYXJlbnRDYWNoZVtwYXRoLm5hbWVdID0gcGF0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50VmFsdWVbcGF0aC5uYW1lXSAhPT0gcGF0aC52YWx1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLnBhcmVudFBhdGguZ2V0KHBhdGgubmFtZSkgIT09IHBhdGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgUHAucmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2UocmVwbGFjZW1lbnQpIHtcbiAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICAgICAgdmFyIHBhcmVudFZhbHVlID0gdGhpcy5wYXJlbnRQYXRoLnZhbHVlO1xuICAgICAgICB2YXIgcGFyZW50Q2FjaGUgPSBnZXRDaGlsZENhY2hlKHRoaXMucGFyZW50UGF0aCk7XG4gICAgICAgIHZhciBjb3VudCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIHJlcGFpclJlbGF0aW9uc2hpcFdpdGhQYXJlbnQodGhpcyk7XG4gICAgICAgIGlmIChpc0FycmF5LmNoZWNrKHBhcmVudFZhbHVlKSkge1xuICAgICAgICAgICAgdmFyIG9yaWdpbmFsTGVuZ3RoID0gcGFyZW50VmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIG1vdmUgPSBnZXRNb3Zlcyh0aGlzLnBhcmVudFBhdGgsIGNvdW50IC0gMSwgdGhpcy5uYW1lICsgMSk7XG4gICAgICAgICAgICB2YXIgc3BsaWNlQXJncyA9IFt0aGlzLm5hbWUsIDFdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICAgICAgICAgICAgc3BsaWNlQXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3BsaWNlZE91dCA9IHBhcmVudFZhbHVlLnNwbGljZS5hcHBseShwYXJlbnRWYWx1ZSwgc3BsaWNlQXJncyk7XG4gICAgICAgICAgICBpZiAoc3BsaWNlZE91dFswXSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJlbnRWYWx1ZS5sZW5ndGggIT09IChvcmlnaW5hbExlbmd0aCAtIDEgKyBjb3VudCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtb3ZlKCk7XG4gICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcGFyZW50Q2FjaGVbdGhpcy5uYW1lXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9fY2hpbGRDYWNoZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50VmFsdWVbdGhpcy5uYW1lXSAhPT0gcmVwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAhPT0gcmVwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHJlcGxhY2VtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY2hpbGRDYWNoZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLnBhcmVudFBhdGguZ2V0KHRoaXMubmFtZSArIGkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdHNbMF0gIT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgIT09IHJlcGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fX2NoaWxkQ2FjaGUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHBhcmVudFZhbHVlW3RoaXMubmFtZV0gPSByZXBsYWNlbWVudDtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgZGVsZXRlIHBhcmVudFZhbHVlW3RoaXMubmFtZV07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX19jaGlsZENhY2hlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIExlYXZlIHRoaXMgcGF0aCBjYWNoZWQgYXMgcGFyZW50Q2FjaGVbdGhpcy5uYW1lXSwgZXZlbiB0aG91Z2hcbiAgICAgICAgICAgIC8vIGl0IG5vIGxvbmdlciBoYXMgYSB2YWx1ZSBkZWZpbmVkLlxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IHJlcGxhY2UgcGF0aFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9O1xuICAgIHJldHVybiBQYXRoO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gcGF0aFBsdWdpbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdHlwZXNcIikpO1xudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5mdW5jdGlvbiBzY29wZVBsdWdpbihmb3JrKSB7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgVHlwZSA9IHR5cGVzLlR5cGU7XG4gICAgdmFyIG5hbWVkVHlwZXMgPSB0eXBlcy5uYW1lZFR5cGVzO1xuICAgIHZhciBOb2RlID0gbmFtZWRUeXBlcy5Ob2RlO1xuICAgIHZhciBFeHByZXNzaW9uID0gbmFtZWRUeXBlcy5FeHByZXNzaW9uO1xuICAgIHZhciBpc0FycmF5ID0gdHlwZXMuYnVpbHRJblR5cGVzLmFycmF5O1xuICAgIHZhciBiID0gdHlwZXMuYnVpbGRlcnM7XG4gICAgdmFyIFNjb3BlID0gZnVuY3Rpb24gU2NvcGUocGF0aCwgcGFyZW50U2NvcGUpIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNjb3BlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2NvcGUgY29uc3RydWN0b3IgY2Fubm90IGJlIGludm9rZWQgd2l0aG91dCAnbmV3J1wiKTtcbiAgICAgICAgfVxuICAgICAgICBTY29wZVR5cGUuYXNzZXJ0KHBhdGgudmFsdWUpO1xuICAgICAgICB2YXIgZGVwdGg7XG4gICAgICAgIGlmIChwYXJlbnRTY29wZSkge1xuICAgICAgICAgICAgaWYgKCEocGFyZW50U2NvcGUgaW5zdGFuY2VvZiBTY29wZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZXB0aCA9IHBhcmVudFNjb3BlLmRlcHRoICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudFNjb3BlID0gbnVsbDtcbiAgICAgICAgICAgIGRlcHRoID0gMDtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBwYXRoOiB7IHZhbHVlOiBwYXRoIH0sXG4gICAgICAgICAgICBub2RlOiB7IHZhbHVlOiBwYXRoLnZhbHVlIH0sXG4gICAgICAgICAgICBpc0dsb2JhbDogeyB2YWx1ZTogIXBhcmVudFNjb3BlLCBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgICAgICAgICBkZXB0aDogeyB2YWx1ZTogZGVwdGggfSxcbiAgICAgICAgICAgIHBhcmVudDogeyB2YWx1ZTogcGFyZW50U2NvcGUgfSxcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7IHZhbHVlOiB7fSB9LFxuICAgICAgICAgICAgdHlwZXM6IHsgdmFsdWU6IHt9IH0sXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIHNjb3BlVHlwZXMgPSBbXG4gICAgICAgIC8vIFByb2dyYW0gbm9kZXMgaW50cm9kdWNlIGdsb2JhbCBzY29wZXMuXG4gICAgICAgIG5hbWVkVHlwZXMuUHJvZ3JhbSxcbiAgICAgICAgLy8gRnVuY3Rpb24gaXMgdGhlIHN1cGVydHlwZSBvZiBGdW5jdGlvbkV4cHJlc3Npb24sXG4gICAgICAgIC8vIEZ1bmN0aW9uRGVjbGFyYXRpb24sIEFycm93RXhwcmVzc2lvbiwgZXRjLlxuICAgICAgICBuYW1lZFR5cGVzLkZ1bmN0aW9uLFxuICAgICAgICAvLyBJbiBjYXNlIHlvdSBkaWRuJ3Qga25vdywgdGhlIGNhdWdodCBwYXJhbWV0ZXIgc2hhZG93cyBhbnkgdmFyaWFibGVcbiAgICAgICAgLy8gb2YgdGhlIHNhbWUgbmFtZSBpbiBhbiBvdXRlciBzY29wZS5cbiAgICAgICAgbmFtZWRUeXBlcy5DYXRjaENsYXVzZVxuICAgIF07XG4gICAgdmFyIFNjb3BlVHlwZSA9IFR5cGUub3IuYXBwbHkoVHlwZSwgc2NvcGVUeXBlcyk7XG4gICAgU2NvcGUuaXNFc3RhYmxpc2hlZEJ5ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFNjb3BlVHlwZS5jaGVjayhub2RlKTtcbiAgICB9O1xuICAgIHZhciBTcCA9IFNjb3BlLnByb3RvdHlwZTtcbiAgICAvLyBXaWxsIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgYW4gaW5zdGFuY2UgbGF6aWx5IGNhbGxzIHNjYW5TY29wZS5cbiAgICBTcC5kaWRTY2FuID0gZmFsc2U7XG4gICAgU3AuZGVjbGFyZXMgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB0aGlzLnNjYW4oKTtcbiAgICAgICAgcmV0dXJuIGhhc093bi5jYWxsKHRoaXMuYmluZGluZ3MsIG5hbWUpO1xuICAgIH07XG4gICAgU3AuZGVjbGFyZXNUeXBlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdGhpcy5zY2FuKCk7XG4gICAgICAgIHJldHVybiBoYXNPd24uY2FsbCh0aGlzLnR5cGVzLCBuYW1lKTtcbiAgICB9O1xuICAgIFNwLmRlY2xhcmVUZW1wb3JhcnkgPSBmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgICAgIGlmIChwcmVmaXgpIHtcbiAgICAgICAgICAgIGlmICghL15bYS16JF9dL2kudGVzdChwcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJlZml4ID0gXCJ0JFwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIEluY2x1ZGUgdGhpcy5kZXB0aCBpbiB0aGUgbmFtZSB0byBtYWtlIHN1cmUgdGhlIG5hbWUgZG9lcyBub3RcbiAgICAgICAgLy8gY29sbGlkZSB3aXRoIGFueSB2YXJpYWJsZXMgaW4gbmVzdGVkL2VuY2xvc2luZyBzY29wZXMuXG4gICAgICAgIHByZWZpeCArPSB0aGlzLmRlcHRoLnRvU3RyaW5nKDM2KSArIFwiJFwiO1xuICAgICAgICB0aGlzLnNjYW4oKTtcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKHRoaXMuZGVjbGFyZXMocHJlZml4ICsgaW5kZXgpKSB7XG4gICAgICAgICAgICArK2luZGV4O1xuICAgICAgICB9XG4gICAgICAgIHZhciBuYW1lID0gcHJlZml4ICsgaW5kZXg7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzW25hbWVdID0gdHlwZXMuYnVpbGRlcnMuaWRlbnRpZmllcihuYW1lKTtcbiAgICB9O1xuICAgIFNwLmluamVjdFRlbXBvcmFyeSA9IGZ1bmN0aW9uIChpZGVudGlmaWVyLCBpbml0KSB7XG4gICAgICAgIGlkZW50aWZpZXIgfHwgKGlkZW50aWZpZXIgPSB0aGlzLmRlY2xhcmVUZW1wb3JhcnkoKSk7XG4gICAgICAgIHZhciBib2R5UGF0aCA9IHRoaXMucGF0aC5nZXQoXCJib2R5XCIpO1xuICAgICAgICBpZiAobmFtZWRUeXBlcy5CbG9ja1N0YXRlbWVudC5jaGVjayhib2R5UGF0aC52YWx1ZSkpIHtcbiAgICAgICAgICAgIGJvZHlQYXRoID0gYm9keVBhdGguZ2V0KFwiYm9keVwiKTtcbiAgICAgICAgfVxuICAgICAgICBib2R5UGF0aC51bnNoaWZ0KGIudmFyaWFibGVEZWNsYXJhdGlvbihcInZhclwiLCBbYi52YXJpYWJsZURlY2xhcmF0b3IoaWRlbnRpZmllciwgaW5pdCB8fCBudWxsKV0pKTtcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gICAgfTtcbiAgICBTcC5zY2FuID0gZnVuY3Rpb24gKGZvcmNlKSB7XG4gICAgICAgIGlmIChmb3JjZSB8fCAhdGhpcy5kaWRTY2FuKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuYmluZGluZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBFbXB0eSBvdXQgdGhpcy5iaW5kaW5ncywganVzdCBpbiBjYXNlcy5cbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5iaW5kaW5nc1tuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjYW5TY29wZSh0aGlzLnBhdGgsIHRoaXMuYmluZGluZ3MsIHRoaXMudHlwZXMpO1xuICAgICAgICAgICAgdGhpcy5kaWRTY2FuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3AuZ2V0QmluZGluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2NhbigpO1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kaW5ncztcbiAgICB9O1xuICAgIFNwLmdldFR5cGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNjYW4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZXM7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBzY2FuU2NvcGUocGF0aCwgYmluZGluZ3MsIHNjb3BlVHlwZXMpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBwYXRoLnZhbHVlO1xuICAgICAgICBTY29wZVR5cGUuYXNzZXJ0KG5vZGUpO1xuICAgICAgICBpZiAobmFtZWRUeXBlcy5DYXRjaENsYXVzZS5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgLy8gQSBjYXRjaCBjbGF1c2UgZXN0YWJsaXNoZXMgYSBuZXcgc2NvcGUgYnV0IHRoZSBvbmx5IHZhcmlhYmxlXG4gICAgICAgICAgICAvLyBib3VuZCBpbiB0aGF0IHNjb3BlIGlzIHRoZSBjYXRjaCBwYXJhbWV0ZXIuIEFueSBvdGhlclxuICAgICAgICAgICAgLy8gZGVjbGFyYXRpb25zIGNyZWF0ZSBiaW5kaW5ncyBpbiB0aGUgb3V0ZXIgc2NvcGUuXG4gICAgICAgICAgICB2YXIgcGFyYW0gPSBwYXRoLmdldChcInBhcmFtXCIpO1xuICAgICAgICAgICAgaWYgKHBhcmFtLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkUGF0dGVybihwYXJhbSwgYmluZGluZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdXJzaXZlU2NhblNjb3BlKHBhdGgsIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVTY2FuU2NvcGUocGF0aCwgYmluZGluZ3MsIHNjb3BlVHlwZXMpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBwYXRoLnZhbHVlO1xuICAgICAgICBpZiAocGF0aC5wYXJlbnQgJiZcbiAgICAgICAgICAgIG5hbWVkVHlwZXMuRnVuY3Rpb25FeHByZXNzaW9uLmNoZWNrKHBhdGgucGFyZW50Lm5vZGUpICYmXG4gICAgICAgICAgICBwYXRoLnBhcmVudC5ub2RlLmlkKSB7XG4gICAgICAgICAgICBhZGRQYXR0ZXJuKHBhdGgucGFyZW50LmdldChcImlkXCIpLCBiaW5kaW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICAvLyBOb25lIG9mIHRoZSByZW1haW5pbmcgY2FzZXMgbWF0dGVyIGlmIG5vZGUgaXMgZmFsc3kuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNBcnJheS5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgcGF0aC5lYWNoKGZ1bmN0aW9uIChjaGlsZFBhdGgpIHtcbiAgICAgICAgICAgICAgICByZWN1cnNpdmVTY2FuQ2hpbGQoY2hpbGRQYXRoLCBiaW5kaW5ncywgc2NvcGVUeXBlcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLkZ1bmN0aW9uLmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoLmdldChcInBhcmFtc1wiKS5lYWNoKGZ1bmN0aW9uIChwYXJhbVBhdGgpIHtcbiAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuKHBhcmFtUGF0aCwgYmluZGluZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZWN1cnNpdmVTY2FuQ2hpbGQocGF0aC5nZXQoXCJib2R5XCIpLCBiaW5kaW5ncywgc2NvcGVUeXBlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKG5hbWVkVHlwZXMuVHlwZUFsaWFzICYmIG5hbWVkVHlwZXMuVHlwZUFsaWFzLmNoZWNrKG5vZGUpKSB8fFxuICAgICAgICAgICAgKG5hbWVkVHlwZXMuSW50ZXJmYWNlRGVjbGFyYXRpb24gJiYgbmFtZWRUeXBlcy5JbnRlcmZhY2VEZWNsYXJhdGlvbi5jaGVjayhub2RlKSkgfHxcbiAgICAgICAgICAgIChuYW1lZFR5cGVzLlRTVHlwZUFsaWFzRGVjbGFyYXRpb24gJiYgbmFtZWRUeXBlcy5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uLmNoZWNrKG5vZGUpKSB8fFxuICAgICAgICAgICAgKG5hbWVkVHlwZXMuVFNJbnRlcmZhY2VEZWNsYXJhdGlvbiAmJiBuYW1lZFR5cGVzLlRTSW50ZXJmYWNlRGVjbGFyYXRpb24uY2hlY2sobm9kZSkpKSB7XG4gICAgICAgICAgICBhZGRUeXBlUGF0dGVybihwYXRoLmdldChcImlkXCIpLCBzY29wZVR5cGVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLlZhcmlhYmxlRGVjbGFyYXRvci5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgYWRkUGF0dGVybihwYXRoLmdldChcImlkXCIpLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICByZWN1cnNpdmVTY2FuQ2hpbGQocGF0aC5nZXQoXCJpbml0XCIpLCBiaW5kaW5ncywgc2NvcGVUeXBlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSBcIkltcG9ydFNwZWNpZmllclwiIHx8XG4gICAgICAgICAgICBub2RlLnR5cGUgPT09IFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIgfHxcbiAgICAgICAgICAgIG5vZGUudHlwZSA9PT0gXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4oXG4gICAgICAgICAgICAvLyBFc3ByaW1hIHVzZWQgdG8gdXNlIHRoZSAubmFtZSBmaWVsZCB0byByZWZlciB0byB0aGUgbG9jYWxcbiAgICAgICAgICAgIC8vIGJpbmRpbmcgaWRlbnRpZmllciBmb3IgSW1wb3J0U3BlY2lmaWVyIG5vZGVzLCBidXQgLmlkIGZvclxuICAgICAgICAgICAgLy8gSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyIGFuZCBJbXBvcnREZWZhdWx0U3BlY2lmaWVyIG5vZGVzLlxuICAgICAgICAgICAgLy8gRVNUcmVlL0Fjb3JuL0VTcHJlZSB1c2UgLmxvY2FsIGZvciBhbGwgdGhyZWUgbm9kZSB0eXBlcy5cbiAgICAgICAgICAgIHBhdGguZ2V0KG5vZGUubG9jYWwgPyBcImxvY2FsXCIgOlxuICAgICAgICAgICAgICAgIG5vZGUubmFtZSA/IFwibmFtZVwiIDogXCJpZFwiKSwgYmluZGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKE5vZGUuY2hlY2sobm9kZSkgJiYgIUV4cHJlc3Npb24uY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIHR5cGVzLmVhY2hGaWVsZChub2RlLCBmdW5jdGlvbiAobmFtZSwgY2hpbGQpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRQYXRoID0gcGF0aC5nZXQobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXRoSGFzVmFsdWUoY2hpbGRQYXRoLCBjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWN1cnNpdmVTY2FuQ2hpbGQoY2hpbGRQYXRoLCBiaW5kaW5ncywgc2NvcGVUeXBlcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwYXRoSGFzVmFsdWUocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHBhdGgudmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbXB0eSBhcnJheXMgYXJlIHByb2JhYmx5IHByb2R1Y2VkIGJ5IGRlZmF1bHRzLmVtcHR5QXJyYXksIGluIHdoaWNoXG4gICAgICAgIC8vIGNhc2UgaXMgbWFrZXMgc2Vuc2UgdG8gcmVnYXJkIHRoZW0gYXMgZXF1aXZhbGVudCwgaWYgbm90ID09PS5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aC52YWx1ZSkgJiZcbiAgICAgICAgICAgIHBhdGgudmFsdWUubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgICAgICAgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZVNjYW5DaGlsZChwYXRoLCBiaW5kaW5ncywgc2NvcGVUeXBlcykge1xuICAgICAgICB2YXIgbm9kZSA9IHBhdGgudmFsdWU7XG4gICAgICAgIGlmICghbm9kZSB8fCBFeHByZXNzaW9uLmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZmFsc3kgdmFsdWVzIGFuZCBFeHByZXNzaW9ucy5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLkZ1bmN0aW9uRGVjbGFyYXRpb24uY2hlY2sobm9kZSkgJiZcbiAgICAgICAgICAgIG5vZGUuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocGF0aC5nZXQoXCJpZFwiKSwgYmluZGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuQ2xhc3NEZWNsYXJhdGlvbiAmJlxuICAgICAgICAgICAgbmFtZWRUeXBlcy5DbGFzc0RlY2xhcmF0aW9uLmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICBhZGRQYXR0ZXJuKHBhdGguZ2V0KFwiaWRcIiksIGJpbmRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChTY29wZVR5cGUuY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIGlmIChuYW1lZFR5cGVzLkNhdGNoQ2xhdXNlLmNoZWNrKG5vZGUpICYmXG4gICAgICAgICAgICAgICAgLy8gVE9ETyBCcm9hZGVuIHRoaXMgdG8gYWNjZXB0IGFueSBwYXR0ZXJuLlxuICAgICAgICAgICAgICAgIG5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhub2RlLnBhcmFtKSkge1xuICAgICAgICAgICAgICAgIHZhciBjYXRjaFBhcmFtTmFtZSA9IG5vZGUucGFyYW0ubmFtZTtcbiAgICAgICAgICAgICAgICB2YXIgaGFkQmluZGluZyA9IGhhc093bi5jYWxsKGJpbmRpbmdzLCBjYXRjaFBhcmFtTmFtZSk7XG4gICAgICAgICAgICAgICAgLy8gQW55IGRlY2xhcmF0aW9ucyB0aGF0IG9jY3VyIGluc2lkZSB0aGUgY2F0Y2ggYm9keSB0aGF0IGRvXG4gICAgICAgICAgICAgICAgLy8gbm90IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUgY2F0Y2ggcGFyYW1ldGVyIHNob3VsZCBjb3VudFxuICAgICAgICAgICAgICAgIC8vIGFzIGJpbmRpbmdzIGluIHRoZSBvdXRlciBzY29wZS5cbiAgICAgICAgICAgICAgICByZWN1cnNpdmVTY2FuU2NvcGUocGF0aC5nZXQoXCJib2R5XCIpLCBiaW5kaW5ncywgc2NvcGVUeXBlcyk7XG4gICAgICAgICAgICAgICAgLy8gSWYgYSBuZXcgYmluZGluZyBtYXRjaGluZyB0aGUgY2F0Y2ggcGFyYW1ldGVyIG5hbWUgd2FzXG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlZCB3aGlsZSBzY2FubmluZyB0aGUgY2F0Y2ggYm9keSwgaWdub3JlIGl0IGJlY2F1c2UgaXRcbiAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSByZWZlcnMgdG8gdGhlIGNhdGNoIHBhcmFtZXRlciBhbmQgbm90IHRoZSBvdXRlclxuICAgICAgICAgICAgICAgIC8vIHNjb3BlIHRoYXQgd2UncmUgY3VycmVudGx5IHNjYW5uaW5nLlxuICAgICAgICAgICAgICAgIGlmICghaGFkQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgYmluZGluZ3NbY2F0Y2hQYXJhbU5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5TY29wZShwYXRoLCBiaW5kaW5ncywgc2NvcGVUeXBlcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkUGF0dGVybihwYXR0ZXJuUGF0aCwgYmluZGluZ3MpIHtcbiAgICAgICAgdmFyIHBhdHRlcm4gPSBwYXR0ZXJuUGF0aC52YWx1ZTtcbiAgICAgICAgbmFtZWRUeXBlcy5QYXR0ZXJuLmFzc2VydChwYXR0ZXJuKTtcbiAgICAgICAgaWYgKG5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhwYXR0ZXJuKSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGJpbmRpbmdzLCBwYXR0ZXJuLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgYmluZGluZ3NbcGF0dGVybi5uYW1lXS5wdXNoKHBhdHRlcm5QYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJpbmRpbmdzW3BhdHRlcm4ubmFtZV0gPSBbcGF0dGVyblBhdGhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuQXNzaWdubWVudFBhdHRlcm4gJiZcbiAgICAgICAgICAgIG5hbWVkVHlwZXMuQXNzaWdubWVudFBhdHRlcm4uY2hlY2socGF0dGVybikpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocGF0dGVyblBhdGguZ2V0KCdsZWZ0JyksIGJpbmRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLk9iamVjdFBhdHRlcm4gJiZcbiAgICAgICAgICAgIG5hbWVkVHlwZXMuT2JqZWN0UGF0dGVybi5jaGVjayhwYXR0ZXJuKSkge1xuICAgICAgICAgICAgcGF0dGVyblBhdGguZ2V0KCdwcm9wZXJ0aWVzJykuZWFjaChmdW5jdGlvbiAocHJvcGVydHlQYXRoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gcHJvcGVydHlQYXRoLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lZFR5cGVzLlBhdHRlcm4uY2hlY2socHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocHJvcGVydHlQYXRoLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuUHJvcGVydHkuY2hlY2socHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocHJvcGVydHlQYXRoLmdldCgndmFsdWUnKSwgYmluZGluZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLlNwcmVhZFByb3BlcnR5ICYmXG4gICAgICAgICAgICAgICAgICAgIG5hbWVkVHlwZXMuU3ByZWFkUHJvcGVydHkuY2hlY2socHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocHJvcGVydHlQYXRoLmdldCgnYXJndW1lbnQnKSwgYmluZGluZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuQXJyYXlQYXR0ZXJuICYmXG4gICAgICAgICAgICBuYW1lZFR5cGVzLkFycmF5UGF0dGVybi5jaGVjayhwYXR0ZXJuKSkge1xuICAgICAgICAgICAgcGF0dGVyblBhdGguZ2V0KCdlbGVtZW50cycpLmVhY2goZnVuY3Rpb24gKGVsZW1lbnRQYXRoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50UGF0aC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZWRUeXBlcy5QYXR0ZXJuLmNoZWNrKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4oZWxlbWVudFBhdGgsIGJpbmRpbmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZWRUeXBlcy5TcHJlYWRFbGVtZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIG5hbWVkVHlwZXMuU3ByZWFkRWxlbWVudC5jaGVjayhlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuKGVsZW1lbnRQYXRoLmdldChcImFyZ3VtZW50XCIpLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZWRUeXBlcy5Qcm9wZXJ0eVBhdHRlcm4gJiZcbiAgICAgICAgICAgIG5hbWVkVHlwZXMuUHJvcGVydHlQYXR0ZXJuLmNoZWNrKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICBhZGRQYXR0ZXJuKHBhdHRlcm5QYXRoLmdldCgncGF0dGVybicpLCBiaW5kaW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKG5hbWVkVHlwZXMuU3ByZWFkRWxlbWVudFBhdHRlcm4gJiZcbiAgICAgICAgICAgIG5hbWVkVHlwZXMuU3ByZWFkRWxlbWVudFBhdHRlcm4uY2hlY2socGF0dGVybikpIHx8XG4gICAgICAgICAgICAobmFtZWRUeXBlcy5TcHJlYWRQcm9wZXJ0eVBhdHRlcm4gJiZcbiAgICAgICAgICAgICAgICBuYW1lZFR5cGVzLlNwcmVhZFByb3BlcnR5UGF0dGVybi5jaGVjayhwYXR0ZXJuKSkpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocGF0dGVyblBhdGguZ2V0KCdhcmd1bWVudCcpLCBiaW5kaW5ncyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkVHlwZVBhdHRlcm4ocGF0dGVyblBhdGgsIHR5cGVzKSB7XG4gICAgICAgIHZhciBwYXR0ZXJuID0gcGF0dGVyblBhdGgudmFsdWU7XG4gICAgICAgIG5hbWVkVHlwZXMuUGF0dGVybi5hc3NlcnQocGF0dGVybik7XG4gICAgICAgIGlmIChuYW1lZFR5cGVzLklkZW50aWZpZXIuY2hlY2socGF0dGVybikpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbCh0eXBlcywgcGF0dGVybi5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHR5cGVzW3BhdHRlcm4ubmFtZV0ucHVzaChwYXR0ZXJuUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0eXBlc1twYXR0ZXJuLm5hbWVdID0gW3BhdHRlcm5QYXRoXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBTcC5sb29rdXAgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBmb3IgKHZhciBzY29wZSA9IHRoaXM7IHNjb3BlOyBzY29wZSA9IHNjb3BlLnBhcmVudClcbiAgICAgICAgICAgIGlmIChzY29wZS5kZWNsYXJlcyhuYW1lKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH07XG4gICAgU3AubG9va3VwVHlwZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGZvciAodmFyIHNjb3BlID0gdGhpczsgc2NvcGU7IHNjb3BlID0gc2NvcGUucGFyZW50KVxuICAgICAgICAgICAgaWYgKHNjb3BlLmRlY2xhcmVzVHlwZShuYW1lKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH07XG4gICAgU3AuZ2V0R2xvYmFsU2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzY29wZSA9IHRoaXM7XG4gICAgICAgIHdoaWxlICghc2NvcGUuaXNHbG9iYWwpXG4gICAgICAgICAgICBzY29wZSA9IHNjb3BlLnBhcmVudDtcbiAgICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH07XG4gICAgcmV0dXJuIFNjb3BlO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gc2NvcGVQbHVnaW47XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3R5cGVzXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgVHlwZSA9IHR5cGVzLlR5cGU7XG4gICAgdmFyIGJ1aWx0aW4gPSB0eXBlcy5idWlsdEluVHlwZXM7XG4gICAgdmFyIGlzTnVtYmVyID0gYnVpbHRpbi5udW1iZXI7XG4gICAgLy8gQW4gZXhhbXBsZSBvZiBjb25zdHJ1Y3RpbmcgYSBuZXcgdHlwZSB3aXRoIGFyYml0cmFyeSBjb25zdHJhaW50cyBmcm9tXG4gICAgLy8gYW4gZXhpc3RpbmcgdHlwZS5cbiAgICBmdW5jdGlvbiBnZXEodGhhbikge1xuICAgICAgICByZXR1cm4gVHlwZS5mcm9tKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gaXNOdW1iZXIuY2hlY2sodmFsdWUpICYmIHZhbHVlID49IHRoYW47IH0sIGlzTnVtYmVyICsgXCIgPj0gXCIgKyB0aGFuKTtcbiAgICB9XG4gICAgO1xuICAgIC8vIERlZmF1bHQgdmFsdWUtcmV0dXJuaW5nIGZ1bmN0aW9ucyB0aGF0IG1heSBvcHRpb25hbGx5IGJlIHBhc3NlZCBhcyBhXG4gICAgLy8gdGhpcmQgYXJndW1lbnQgdG8gRGVmLnByb3RvdHlwZS5maWVsZC5cbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICAgIC8vIEZ1bmN0aW9ucyB3ZXJlIHVzZWQgYmVjYXVzZSAoYW1vbmcgb3RoZXIgcmVhc29ucykgdGhhdCdzIHRoZSBtb3N0XG4gICAgICAgIC8vIGVsZWdhbnQgd2F5IHRvIGFsbG93IGZvciB0aGUgZW1wdHlBcnJheSBvbmUgYWx3YXlzIHRvIGdpdmUgYSBuZXdcbiAgICAgICAgLy8gYXJyYXkgaW5zdGFuY2UuXG4gICAgICAgIFwibnVsbFwiOiBmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICBcImVtcHR5QXJyYXlcIjogZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH0sXG4gICAgICAgIFwiZmFsc2VcIjogZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH0sXG4gICAgICAgIFwidHJ1ZVwiOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9LFxuICAgICAgICBcInVuZGVmaW5lZFwiOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIFwidXNlIHN0cmljdFwiOiBmdW5jdGlvbiAoKSB7IHJldHVybiBcInVzZSBzdHJpY3RcIjsgfVxuICAgIH07XG4gICAgdmFyIG5haXZlSXNQcmltaXRpdmUgPSBUeXBlLm9yKGJ1aWx0aW4uc3RyaW5nLCBidWlsdGluLm51bWJlciwgYnVpbHRpbi5ib29sZWFuLCBidWlsdGluLm51bGwsIGJ1aWx0aW4udW5kZWZpbmVkKTtcbiAgICB2YXIgaXNQcmltaXRpdmUgPSBUeXBlLmZyb20oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgICAgIHR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sIG5haXZlSXNQcmltaXRpdmUudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2VxOiBnZXEsXG4gICAgICAgIGRlZmF1bHRzOiBkZWZhdWx0cyxcbiAgICAgICAgaXNQcmltaXRpdmU6IGlzUHJpbWl0aXZlLFxuICAgIH07XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkRlZiA9IHZvaWQgMDtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBvYmpUb1N0ciA9IE9wLnRvU3RyaW5nO1xudmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xudmFyIEJhc2VUeXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2VUeXBlKCkge1xuICAgIH1cbiAgICBCYXNlVHlwZS5wcm90b3R5cGUuYXNzZXJ0ID0gZnVuY3Rpb24gKHZhbHVlLCBkZWVwKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGVjayh2YWx1ZSwgZGVlcCkpIHtcbiAgICAgICAgICAgIHZhciBzdHIgPSBzaGFsbG93U3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIgKyBcIiBkb2VzIG5vdCBtYXRjaCB0eXBlIFwiICsgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBCYXNlVHlwZS5wcm90b3R5cGUuYXJyYXlPZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVsZW1UeXBlID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBBcnJheVR5cGUoZWxlbVR5cGUpO1xuICAgIH07XG4gICAgcmV0dXJuIEJhc2VUeXBlO1xufSgpKTtcbnZhciBBcnJheVR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoQXJyYXlUeXBlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFycmF5VHlwZShlbGVtVHlwZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5lbGVtVHlwZSA9IGVsZW1UeXBlO1xuICAgICAgICBfdGhpcy5raW5kID0gXCJBcnJheVR5cGVcIjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBBcnJheVR5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJbXCIgKyB0aGlzLmVsZW1UeXBlICsgXCJdXCI7XG4gICAgfTtcbiAgICBBcnJheVR5cGUucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24gKHZhbHVlLCBkZWVwKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShmdW5jdGlvbiAoZWxlbSkgeyByZXR1cm4gX3RoaXMuZWxlbVR5cGUuY2hlY2soZWxlbSwgZGVlcCk7IH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEFycmF5VHlwZTtcbn0oQmFzZVR5cGUpKTtcbnZhciBJZGVudGl0eVR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoSWRlbnRpdHlUeXBlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElkZW50aXR5VHlwZSh2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBfdGhpcy5raW5kID0gXCJJZGVudGl0eVR5cGVcIjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBJZGVudGl0eVR5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgSWRlbnRpdHlUeXBlLnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWUgPT09IHRoaXMudmFsdWU7XG4gICAgICAgIGlmICghcmVzdWx0ICYmIHR5cGVvZiBkZWVwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGRlZXAodGhpcywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICByZXR1cm4gSWRlbnRpdHlUeXBlO1xufShCYXNlVHlwZSkpO1xudmFyIE9iamVjdFR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoT2JqZWN0VHlwZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPYmplY3RUeXBlKGZpZWxkcykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgICAgIF90aGlzLmtpbmQgPSBcIk9iamVjdFR5cGVcIjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBPYmplY3RUeXBlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwieyBcIiArIHRoaXMuZmllbGRzLmpvaW4oXCIsIFwiKSArIFwiIH1cIjtcbiAgICB9O1xuICAgIE9iamVjdFR5cGUucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24gKHZhbHVlLCBkZWVwKSB7XG4gICAgICAgIHJldHVybiAob2JqVG9TdHIuY2FsbCh2YWx1ZSkgPT09IG9ialRvU3RyLmNhbGwoe30pICYmXG4gICAgICAgICAgICB0aGlzLmZpZWxkcy5ldmVyeShmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQudHlwZS5jaGVjayh2YWx1ZVtmaWVsZC5uYW1lXSwgZGVlcCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0VHlwZTtcbn0oQmFzZVR5cGUpKTtcbnZhciBPclR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoT3JUeXBlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE9yVHlwZSh0eXBlcykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50eXBlcyA9IHR5cGVzO1xuICAgICAgICBfdGhpcy5raW5kID0gXCJPclR5cGVcIjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBPclR5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlcy5qb2luKFwiIHwgXCIpO1xuICAgIH07XG4gICAgT3JUeXBlLnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlcy5zb21lKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS5jaGVjayh2YWx1ZSwgZGVlcCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIE9yVHlwZTtcbn0oQmFzZVR5cGUpKTtcbnZhciBQcmVkaWNhdGVUeXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKFByZWRpY2F0ZVR5cGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUHJlZGljYXRlVHlwZShuYW1lLCBwcmVkaWNhdGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIF90aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICAgICAgX3RoaXMua2luZCA9IFwiUHJlZGljYXRlVHlwZVwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFByZWRpY2F0ZVR5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH07XG4gICAgUHJlZGljYXRlVHlwZS5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMucHJlZGljYXRlKHZhbHVlLCBkZWVwKTtcbiAgICAgICAgaWYgKCFyZXN1bHQgJiYgdHlwZW9mIGRlZXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZGVlcCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHJldHVybiBQcmVkaWNhdGVUeXBlO1xufShCYXNlVHlwZSkpO1xudmFyIERlZiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZWYodHlwZSwgdHlwZU5hbWUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lO1xuICAgICAgICB0aGlzLmJhc2VOYW1lcyA9IFtdO1xuICAgICAgICB0aGlzLm93bkZpZWxkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIEluY2x1ZGVzIG93biB0eXBlTmFtZS4gUG9wdWxhdGVkIGR1cmluZyBmaW5hbGl6YXRpb24uXG4gICAgICAgIHRoaXMuYWxsU3VwZXJ0eXBlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIExpbmVhciBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFBvcHVsYXRlZCBkdXJpbmcgZmluYWxpemF0aW9uLlxuICAgICAgICB0aGlzLnN1cGVydHlwZUxpc3QgPSBbXTtcbiAgICAgICAgLy8gSW5jbHVkZXMgaW5oZXJpdGVkIGZpZWxkcy5cbiAgICAgICAgdGhpcy5hbGxGaWVsZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyBOb24taGlkZGVuIGtleXMgb2YgYWxsRmllbGRzLlxuICAgICAgICB0aGlzLmZpZWxkTmFtZXMgPSBbXTtcbiAgICAgICAgLy8gVGhpcyBwcm9wZXJ0eSB3aWxsIGJlIG92ZXJyaWRkZW4gYXMgdHJ1ZSBieSBpbmRpdmlkdWFsIERlZiBpbnN0YW5jZXNcbiAgICAgICAgLy8gd2hlbiB0aGV5IGFyZSBmaW5hbGl6ZWQuXG4gICAgICAgIHRoaXMuZmluYWxpemVkID0gZmFsc2U7XG4gICAgICAgIC8vIEZhbHNlIGJ5IGRlZmF1bHQgdW50aWwgLmJ1aWxkKC4uLikgaXMgY2FsbGVkIG9uIGFuIGluc3RhbmNlLlxuICAgICAgICB0aGlzLmJ1aWxkYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJ1aWxkUGFyYW1zID0gW107XG4gICAgfVxuICAgIERlZi5wcm90b3R5cGUuaXNTdXBlcnR5cGVPZiA9IGZ1bmN0aW9uICh0aGF0KSB7XG4gICAgICAgIGlmICh0aGF0IGluc3RhbmNlb2YgRGVmKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5maW5hbGl6ZWQgIT09IHRydWUgfHxcbiAgICAgICAgICAgICAgICB0aGF0LmZpbmFsaXplZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYXNPd24uY2FsbCh0aGF0LmFsbFN1cGVydHlwZXMsIHRoaXMudHlwZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoYXQgKyBcIiBpcyBub3QgYSBEZWZcIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlZi5wcm90b3R5cGUuY2hlY2tBbGxGaWVsZHMgPSBmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgdmFyIGFsbEZpZWxkcyA9IHRoaXMuYWxsRmllbGRzO1xuICAgICAgICBpZiAodGhpcy5maW5hbGl6ZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiICsgdGhpcy50eXBlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tGaWVsZEJ5TmFtZShuYW1lKSB7XG4gICAgICAgICAgICB2YXIgZmllbGQgPSBhbGxGaWVsZHNbbmFtZV07XG4gICAgICAgICAgICB2YXIgdHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5nZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS5jaGVjayhjaGlsZCwgZGVlcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFsbEZpZWxkcykuZXZlcnkoY2hlY2tGaWVsZEJ5TmFtZSk7XG4gICAgfTtcbiAgICBEZWYucHJvdG90eXBlLmJhc2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3VwZXJ0eXBlTmFtZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHN1cGVydHlwZU5hbWVzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJhc2VzID0gdGhpcy5iYXNlTmFtZXM7XG4gICAgICAgIGlmICh0aGlzLmZpbmFsaXplZCkge1xuICAgICAgICAgICAgaWYgKHN1cGVydHlwZU5hbWVzLmxlbmd0aCAhPT0gYmFzZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdXBlcnR5cGVOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChzdXBlcnR5cGVOYW1lc1tpXSAhPT0gYmFzZXNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVydHlwZU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKGJhc2VOYW1lKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGluZGV4T2YgbG9va3VwIG1heSBiZSBPKG4pLCBidXQgdGhlIHR5cGljYWwgbnVtYmVyIG9mIGJhc2VcbiAgICAgICAgICAgIC8vIG5hbWVzIGlzIHZlcnkgc21hbGwsIGFuZCBpbmRleE9mIGlzIGEgbmF0aXZlIEFycmF5IG1ldGhvZC5cbiAgICAgICAgICAgIGlmIChiYXNlcy5pbmRleE9mKGJhc2VOYW1lKSA8IDApIHtcbiAgICAgICAgICAgICAgICBiYXNlcy5wdXNoKGJhc2VOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzOyAvLyBGb3IgY2hhaW5pbmcuXG4gICAgfTtcbiAgICByZXR1cm4gRGVmO1xufSgpKTtcbmV4cG9ydHMuRGVmID0gRGVmO1xudmFyIEZpZWxkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZpZWxkKG5hbWUsIHR5cGUsIGRlZmF1bHRGbiwgaGlkZGVuKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuZGVmYXVsdEZuID0gZGVmYXVsdEZuO1xuICAgICAgICB0aGlzLmhpZGRlbiA9ICEhaGlkZGVuO1xuICAgIH1cbiAgICBGaWVsZC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLm5hbWUpICsgXCI6IFwiICsgdGhpcy50eXBlO1xuICAgIH07XG4gICAgRmllbGQucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICB2YXIgdmFsdWUgPSBvYmpbdGhpcy5uYW1lXTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZWZhdWx0Rm4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmRlZmF1bHRGbi5jYWxsKG9iaik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgcmV0dXJuIEZpZWxkO1xufSgpKTtcbmZ1bmN0aW9uIHNoYWxsb3dTdHJpbmdpZnkodmFsdWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFwiW1wiICsgdmFsdWUubWFwKHNoYWxsb3dTdHJpbmdpZnkpLmpvaW4oXCIsIFwiKSArIFwiXVwiO1xuICAgIH1cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBcInsgXCIgKyBPYmplY3Qua2V5cyh2YWx1ZSkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXkgKyBcIjogXCIgKyB2YWx1ZVtrZXldO1xuICAgICAgICB9KS5qb2luKFwiLCBcIikgKyBcIiB9XCI7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG59XG5mdW5jdGlvbiB0eXBlc1BsdWdpbihfZm9yaykge1xuICAgIHZhciBUeXBlID0ge1xuICAgICAgICBvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHR5cGVzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIHR5cGVzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IE9yVHlwZSh0eXBlcy5tYXAoZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIFR5cGUuZnJvbSh0eXBlKTsgfSkpO1xuICAgICAgICB9LFxuICAgICAgICBmcm9tOiBmdW5jdGlvbiAodmFsdWUsIG5hbWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5VHlwZSB8fFxuICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgSWRlbnRpdHlUeXBlIHx8XG4gICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBPYmplY3RUeXBlIHx8XG4gICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBPclR5cGUgfHxcbiAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIFByZWRpY2F0ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgRGVmIHR5cGUgaXMgdXNlZCBhcyBhIGhlbHBlciBmb3IgY29uc3RydWN0aW5nIGNvbXBvdW5kXG4gICAgICAgICAgICAvLyBpbnRlcmZhY2UgdHlwZXMgZm9yIEFTVCBub2Rlcy5cbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERlZikge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3VwcG9ydCBbRWxlbVR5cGVdIHN5bnRheC5cbiAgICAgICAgICAgIGlmIChpc0FycmF5LmNoZWNrKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwib25seSBvbmUgZWxlbWVudCB0eXBlIGlzIHBlcm1pdHRlZCBmb3IgdHlwZWQgYXJyYXlzXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5VHlwZShUeXBlLmZyb20odmFsdWVbMF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFN1cHBvcnQgeyBzb21lRmllbGQ6IEZpZWxkVHlwZSwgLi4uIH0gc3ludGF4LlxuICAgICAgICAgICAgaWYgKGlzT2JqZWN0LmNoZWNrKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0VHlwZShPYmplY3Qua2V5cyh2YWx1ZSkubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGQobmFtZSwgVHlwZS5mcm9tKHZhbHVlW25hbWVdLCBuYW1lKSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJpY2ZJbmRleCA9IGJ1aWx0SW5DdG9yRm5zLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChiaWNmSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbHRJbkN0b3JUeXBlc1tiaWNmSW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibWlzc2luZyBuYW1lXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZVR5cGUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXMgYSBsYXN0IHJlc29ydCwgdG9UeXBlIHJldHVybnMgYSB0eXBlIHRoYXQgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdFxuICAgICAgICAgICAgLy8gaXMgPT09IGZyb20uIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgbGl0ZXJhbCB2YWx1ZXMgbGlrZVxuICAgICAgICAgICAgLy8gdG9UeXBlKG51bGwpLCBidXQgaXQgaGFzIHRoZSBhZGRpdGlvbmFsIGFkdmFudGFnZSBvZiBhbGxvd2luZ1xuICAgICAgICAgICAgLy8gdG9UeXBlIHRvIGJlIGEgdG90YWwgZnVuY3Rpb24uXG4gICAgICAgICAgICByZXR1cm4gbmV3IElkZW50aXR5VHlwZSh2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIERlZmluZSBhIHR5cGUgd2hvc2UgbmFtZSBpcyByZWdpc3RlcmVkIGluIGEgbmFtZXNwYWNlICh0aGUgZGVmQ2FjaGUpIHNvXG4gICAgICAgIC8vIHRoYXQgZnV0dXJlIGRlZmluaXRpb25zIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHR5cGUgZ2l2ZW4gdGhlIHNhbWUgbmFtZS5cbiAgICAgICAgLy8gSW4gcGFydGljdWxhciwgdGhpcyBzeXN0ZW0gYWxsb3dzIGZvciBjaXJjdWxhciBhbmQgZm9yd2FyZCBkZWZpbml0aW9ucy5cbiAgICAgICAgLy8gVGhlIERlZiBvYmplY3QgZCByZXR1cm5lZCBmcm9tIFR5cGUuZGVmIG1heSBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGVcbiAgICAgICAgLy8gdHlwZSBkLnR5cGUgYnkgY2FsbGluZyBtZXRob2RzIHN1Y2ggYXMgZC5iYXNlcywgZC5idWlsZCwgYW5kIGQuZmllbGQuXG4gICAgICAgIGRlZjogZnVuY3Rpb24gKHR5cGVOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFzT3duLmNhbGwoZGVmQ2FjaGUsIHR5cGVOYW1lKVxuICAgICAgICAgICAgICAgID8gZGVmQ2FjaGVbdHlwZU5hbWVdXG4gICAgICAgICAgICAgICAgOiBkZWZDYWNoZVt0eXBlTmFtZV0gPSBuZXcgRGVmSW1wbCh0eXBlTmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhc0RlZjogZnVuY3Rpb24gKHR5cGVOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFzT3duLmNhbGwoZGVmQ2FjaGUsIHR5cGVOYW1lKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIGJ1aWx0SW5DdG9yRm5zID0gW107XG4gICAgdmFyIGJ1aWx0SW5DdG9yVHlwZXMgPSBbXTtcbiAgICBmdW5jdGlvbiBkZWZCdWlsdEluVHlwZShuYW1lLCBleGFtcGxlKSB7XG4gICAgICAgIHZhciBvYmpTdHIgPSBvYmpUb1N0ci5jYWxsKGV4YW1wbGUpO1xuICAgICAgICB2YXIgdHlwZSA9IG5ldyBQcmVkaWNhdGVUeXBlKG5hbWUsIGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gb2JqVG9TdHIuY2FsbCh2YWx1ZSkgPT09IG9ialN0cjsgfSk7XG4gICAgICAgIGlmIChleGFtcGxlICYmIHR5cGVvZiBleGFtcGxlLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGJ1aWx0SW5DdG9yRm5zLnB1c2goZXhhbXBsZS5jb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICBidWlsdEluQ3RvclR5cGVzLnB1c2godHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICAgIC8vIFRoZXNlIHR5cGVzIGNoZWNrIHRoZSB1bmRlcmx5aW5nIFtbQ2xhc3NdXSBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuXG4gICAgLy8gdmFsdWUsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBwcm9ibGVtYXRpYyB0eXBlb2Ygb3BlcmF0b3IuIE5vdGUgaG93ZXZlclxuICAgIC8vIHRoYXQgbm8gc3VidHlwaW5nIGlzIGNvbnNpZGVyZWQ7IHNvLCBmb3IgaW5zdGFuY2UsIGlzT2JqZWN0LmNoZWNrXG4gICAgLy8gcmV0dXJucyBmYWxzZSBmb3IgW10sIC8uLywgbmV3IERhdGUsIGFuZCBudWxsLlxuICAgIHZhciBpc1N0cmluZyA9IGRlZkJ1aWx0SW5UeXBlKFwic3RyaW5nXCIsIFwidHJ1dGh5XCIpO1xuICAgIHZhciBpc0Z1bmN0aW9uID0gZGVmQnVpbHRJblR5cGUoXCJmdW5jdGlvblwiLCBmdW5jdGlvbiAoKSB7IH0pO1xuICAgIHZhciBpc0FycmF5ID0gZGVmQnVpbHRJblR5cGUoXCJhcnJheVwiLCBbXSk7XG4gICAgdmFyIGlzT2JqZWN0ID0gZGVmQnVpbHRJblR5cGUoXCJvYmplY3RcIiwge30pO1xuICAgIHZhciBpc1JlZ0V4cCA9IGRlZkJ1aWx0SW5UeXBlKFwiUmVnRXhwXCIsIC8uLyk7XG4gICAgdmFyIGlzRGF0ZSA9IGRlZkJ1aWx0SW5UeXBlKFwiRGF0ZVwiLCBuZXcgRGF0ZSgpKTtcbiAgICB2YXIgaXNOdW1iZXIgPSBkZWZCdWlsdEluVHlwZShcIm51bWJlclwiLCAzKTtcbiAgICB2YXIgaXNCb29sZWFuID0gZGVmQnVpbHRJblR5cGUoXCJib29sZWFuXCIsIHRydWUpO1xuICAgIHZhciBpc051bGwgPSBkZWZCdWlsdEluVHlwZShcIm51bGxcIiwgbnVsbCk7XG4gICAgdmFyIGlzVW5kZWZpbmVkID0gZGVmQnVpbHRJblR5cGUoXCJ1bmRlZmluZWRcIiwgdW5kZWZpbmVkKTtcbiAgICB2YXIgYnVpbHRJblR5cGVzID0ge1xuICAgICAgICBzdHJpbmc6IGlzU3RyaW5nLFxuICAgICAgICBmdW5jdGlvbjogaXNGdW5jdGlvbixcbiAgICAgICAgYXJyYXk6IGlzQXJyYXksXG4gICAgICAgIG9iamVjdDogaXNPYmplY3QsXG4gICAgICAgIFJlZ0V4cDogaXNSZWdFeHAsXG4gICAgICAgIERhdGU6IGlzRGF0ZSxcbiAgICAgICAgbnVtYmVyOiBpc051bWJlcixcbiAgICAgICAgYm9vbGVhbjogaXNCb29sZWFuLFxuICAgICAgICBudWxsOiBpc051bGwsXG4gICAgICAgIHVuZGVmaW5lZDogaXNVbmRlZmluZWQsXG4gICAgfTtcbiAgICAvLyBJbiBvcmRlciB0byByZXR1cm4gdGhlIHNhbWUgRGVmIGluc3RhbmNlIGV2ZXJ5IHRpbWUgVHlwZS5kZWYgaXMgY2FsbGVkXG4gICAgLy8gd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSwgdGhvc2UgaW5zdGFuY2VzIG5lZWQgdG8gYmUgc3RvcmVkIGluIGEgY2FjaGUuXG4gICAgdmFyIGRlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmdW5jdGlvbiBkZWZGcm9tVmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSB2YWx1ZS50eXBlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgaGFzT3duLmNhbGwoZGVmQ2FjaGUsIHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGQgPSBkZWZDYWNoZVt0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAoZC5maW5hbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgRGVmSW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgdHNsaWJfMS5fX2V4dGVuZHMoRGVmSW1wbCwgX3N1cGVyKTtcbiAgICAgICAgZnVuY3Rpb24gRGVmSW1wbCh0eXBlTmFtZSkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbmV3IFByZWRpY2F0ZVR5cGUodHlwZU5hbWUsIGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkgeyByZXR1cm4gX3RoaXMuY2hlY2sodmFsdWUsIGRlZXApOyB9KSwgdHlwZU5hbWUpIHx8IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgICAgIH1cbiAgICAgICAgRGVmSW1wbC5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmFsaXplZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInByZW1hdHVyZWx5IGNoZWNraW5nIHVuZmluYWxpemVkIHR5cGUgXCIgKyB0aGlzLnR5cGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEEgRGVmIHR5cGUgY2FuIG9ubHkgbWF0Y2ggYW4gb2JqZWN0IHZhbHVlLlxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2RGVmID0gZGVmRnJvbVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIGlmICghdkRlZikge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IGluZmVyIHRoZSBEZWYgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAvLyBhbmQgd2UgZXhwZWN0ZWQgaXQgdG8gYmUgYSBTb3VyY2VMb2NhdGlvbiBvciBhIFBvc2l0aW9uLCBpdCB3YXNcbiAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSBqdXN0IG1pc3NpbmcgYSBcInR5cGVcIiBmaWVsZCAoYmVjYXVzZSBFc3ByaW1hIGRvZXMgbm90XG4gICAgICAgICAgICAgICAgLy8gYXNzaWduIGEgdHlwZSBwcm9wZXJ0eSB0byBzdWNoIG5vZGVzKS4gQmUgb3B0aW1pc3RpYyBhbmQgbGV0XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5jaGVja0FsbEZpZWxkcyBtYWtlIHRoZSBmaW5hbCBkZWNpc2lvbi5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy50eXBlTmFtZSA9PT0gXCJTb3VyY2VMb2NhdGlvblwiIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZU5hbWUgPT09IFwiUG9zaXRpb25cIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGVja0FsbEZpZWxkcyh2YWx1ZSwgZGVlcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENhbGxpbmcgdGhpcy5jaGVja0FsbEZpZWxkcyBmb3IgYW55IG90aGVyIHR5cGUgb2Ygbm9kZSBpcyBib3RoXG4gICAgICAgICAgICAgICAgLy8gYmFkIGZvciBwZXJmb3JtYW5jZSBhbmQgd2F5IHRvbyBmb3JnaXZpbmcuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgY2hlY2tpbmcgZGVlcGx5IGFuZCB2RGVmID09PSB0aGlzLCB0aGVuIHdlIG9ubHkgbmVlZCB0byBjYWxsXG4gICAgICAgICAgICAvLyBjaGVja0FsbEZpZWxkcyBvbmNlLiBDYWxsaW5nIGNoZWNrQWxsRmllbGRzIGlzIHRvbyBzdHJpY3Qgd2hlbiBkZWVwXG4gICAgICAgICAgICAvLyBpcyBmYWxzZSwgYmVjYXVzZSB0aGVuIHdlIG9ubHkgY2FyZSBhYm91dCB0aGlzLmlzU3VwZXJ0eXBlT2YodkRlZikuXG4gICAgICAgICAgICBpZiAoZGVlcCAmJiB2RGVmID09PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tBbGxGaWVsZHModmFsdWUsIGRlZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW4gbW9zdCBjYXNlcyB3ZSByZWx5IGV4Y2x1c2l2ZWx5IG9uIGlzU3VwZXJ0eXBlT2YgdG8gbWFrZSBPKDEpXG4gICAgICAgICAgICAvLyBzdWJ0eXBpbmcgZGV0ZXJtaW5hdGlvbnMuIFRoaXMgc3VmZmljZXMgaW4gbW9zdCBzaXR1YXRpb25zIG91dHNpZGVcbiAgICAgICAgICAgIC8vIG9mIHVuaXQgdGVzdHMsIHNpbmNlIGludGVyZmFjZSBjb25mb3JtYW5jZSBpcyBjaGVja2VkIHdoZW5ldmVyIG5ld1xuICAgICAgICAgICAgLy8gaW5zdGFuY2VzIGFyZSBjcmVhdGVkIHVzaW5nIGJ1aWxkZXIgZnVuY3Rpb25zLlxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU3VwZXJ0eXBlT2YodkRlZikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgZXhjZXB0aW9uIGlzIHdoZW4gZGVlcCBpcyB0cnVlOyB0aGVuLCB3ZSByZWN1cnNpdmVseSBjaGVjayBhbGxcbiAgICAgICAgICAgIC8vIGZpZWxkcy5cbiAgICAgICAgICAgIGlmICghZGVlcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVXNlIHRoZSBtb3JlIHNwZWNpZmljIERlZiAodkRlZikgdG8gcGVyZm9ybSB0aGUgZGVlcCBjaGVjaywgYnV0XG4gICAgICAgICAgICAvLyBzaGFsbG93LWNoZWNrIGZpZWxkcyBkZWZpbmVkIGJ5IHRoZSBsZXNzIHNwZWNpZmljIERlZiAodGhpcykuXG4gICAgICAgICAgICByZXR1cm4gdkRlZi5jaGVja0FsbEZpZWxkcyh2YWx1ZSwgZGVlcClcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmNoZWNrQWxsRmllbGRzKHZhbHVlLCBmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIERlZkltcGwucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciBidWlsZFBhcmFtcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBidWlsZFBhcmFtc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2FsbGluZyBEZWYucHJvdG90eXBlLmJ1aWxkIG11bHRpcGxlIHRpbWVzIGhhcyB0aGUgZWZmZWN0IG9mIG1lcmVseVxuICAgICAgICAgICAgLy8gcmVkZWZpbmluZyB0aGlzIHByb3BlcnR5LlxuICAgICAgICAgICAgdGhpcy5idWlsZFBhcmFtcyA9IGJ1aWxkUGFyYW1zO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRhYmxlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBEZWYgaXMgYWxyZWFkeSBidWlsZGFibGUsIHVwZGF0ZSBzZWxmLmJ1aWxkUGFyYW1zIGFuZFxuICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHVzaW5nIHRoZSBvbGQgYnVpbGRlciBmdW5jdGlvbi5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEV2ZXJ5IGJ1aWxkYWJsZSB0eXBlIHdpbGwgaGF2ZSBpdHMgXCJ0eXBlXCIgZmllbGQgZmlsbGVkIGluXG4gICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5LiBUaGlzIGluY2x1ZGVzIHR5cGVzIHRoYXQgYXJlIG5vdCBzdWJ0eXBlcyBvZiBOb2RlLFxuICAgICAgICAgICAgLy8gbGlrZSBTb3VyY2VMb2NhdGlvbiwgYnV0IHRoYXQgc2VlbXMgaGFybWxlc3MgKFRPRE8/KS5cbiAgICAgICAgICAgIHRoaXMuZmllbGQoXCJ0eXBlXCIsIFN0cmluZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMudHlwZU5hbWU7IH0pO1xuICAgICAgICAgICAgLy8gT3ZlcnJpZGUgRHAuYnVpbGRhYmxlIGZvciB0aGlzIERlZiBpbnN0YW5jZS5cbiAgICAgICAgICAgIHRoaXMuYnVpbGRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBhZGRQYXJhbSA9IGZ1bmN0aW9uIChidWlsdCwgcGFyYW0sIGFyZywgaXNBcmdBdmFpbGFibGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoYnVpbHQsIHBhcmFtKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHZhciBhbGwgPSBfdGhpcy5hbGxGaWVsZHM7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPd24uY2FsbChhbGwsIHBhcmFtKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIiArIHBhcmFtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gYWxsW3BhcmFtXTtcbiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChpc0FyZ0F2YWlsYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGFyZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQuZGVmYXVsdEZuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgcGFydGlhbGx5LWJ1aWx0IG9iamVjdCB0byB0aGUgZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBhcyBpdHMgYHRoaXNgIG9iamVjdC5cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmaWVsZC5kZWZhdWx0Rm4uY2FsbChidWlsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IFwibm8gdmFsdWUgb3IgZGVmYXVsdCBmdW5jdGlvbiBnaXZlbiBmb3IgZmllbGQgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocGFyYW0pICsgXCIgb2YgXCIgKyBfdGhpcy50eXBlTmFtZSArIFwiKFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmJ1aWxkUGFyYW1zLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiLCBcIikgKyBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuY2hlY2sodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzaGFsbG93U3RyaW5naWZ5KHZhbHVlKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiBkb2VzIG5vdCBtYXRjaCBmaWVsZCBcIiArIGZpZWxkICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIG9mIHR5cGUgXCIgKyBfdGhpcy50eXBlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1aWx0W3BhcmFtXSA9IHZhbHVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIENhbGxpbmcgdGhlIGJ1aWxkZXIgZnVuY3Rpb24gd2lsbCBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhlIERlZixcbiAgICAgICAgICAgIC8vIHdpdGggcG9zaXRpb25hbCBhcmd1bWVudHMgbWFwcGVkIHRvIHRoZSBmaWVsZHMgb3JpZ2luYWwgcGFzc2VkIHRvIC5idWlsZC5cbiAgICAgICAgICAgIC8vIElmIG5vdCBlbm91Z2ggYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSByZW1haW5pbmcgZmllbGRzXG4gICAgICAgICAgICAvLyB3aWxsIGJlIHVzZWQuXG4gICAgICAgICAgICB2YXIgYnVpbGRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGFyZ2MgPSBhcmdzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoIV90aGlzLmZpbmFsaXplZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdHRlbXB0aW5nIHRvIGluc3RhbnRpYXRlIHVuZmluYWxpemVkIHR5cGUgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYnVpbHQgPSBPYmplY3QuY3JlYXRlKG5vZGVQcm90b3R5cGUpO1xuICAgICAgICAgICAgICAgIF90aGlzLmJ1aWxkUGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpIDwgYXJnYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW0oYnVpbHQsIHBhcmFtLCBhcmdzW2ldLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtKGJ1aWx0LCBwYXJhbSwgbnVsbCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoX3RoaXMuYWxsRmllbGRzKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtKGJ1aWx0LCBwYXJhbSwgbnVsbCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBcInR5cGVcIiBmaWVsZCB3YXMgZmlsbGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICAgICAgICAgICAgaWYgKGJ1aWx0LnR5cGUgIT09IF90aGlzLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWx0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIENhbGxpbmcgLmZyb20gb24gdGhlIGJ1aWxkZXIgZnVuY3Rpb24gd2lsbCBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhlIERlZixcbiAgICAgICAgICAgIC8vIHVzaW5nIGZpZWxkIHZhbHVlcyBmcm9tIHRoZSBwYXNzZWQgb2JqZWN0LiBGb3IgZmllbGRzIG1pc3NpbmcgZnJvbSB0aGUgcGFzc2VkIG9iamVjdCxcbiAgICAgICAgICAgIC8vIHRoZWlyIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLlxuICAgICAgICAgICAgYnVpbGRlci5mcm9tID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIGlmICghX3RoaXMuZmluYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImF0dGVtcHRpbmcgdG8gaW5zdGFudGlhdGUgdW5maW5hbGl6ZWQgdHlwZSBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy50eXBlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBidWlsdCA9IE9iamVjdC5jcmVhdGUobm9kZVByb3RvdHlwZSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoX3RoaXMuYWxsRmllbGRzKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwob2JqLCBwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtKGJ1aWx0LCBwYXJhbSwgb2JqW3BhcmFtXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbShidWlsdCwgcGFyYW0sIG51bGwsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBcInR5cGVcIiBmaWVsZCB3YXMgZmlsbGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICAgICAgICAgICAgaWYgKGJ1aWx0LnR5cGUgIT09IF90aGlzLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWx0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShidWlsZGVycywgZ2V0QnVpbGRlck5hbWUodGhpcy50eXBlTmFtZSksIHtcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBidWlsZGVyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgICAgICAvLyBUaGUgcmVhc29uIGZpZWxkcyBhcmUgc3BlY2lmaWVkIHVzaW5nIC5maWVsZCguLi4pIGluc3RlYWQgb2YgYW4gb2JqZWN0XG4gICAgICAgIC8vIGxpdGVyYWwgc3ludGF4IGlzIHNvbWV3aGF0IHN1YnRsZTogdGhlIG9iamVjdCBsaXRlcmFsIHN5bnRheCB3b3VsZFxuICAgICAgICAvLyBzdXBwb3J0IG9ubHkgb25lIGtleSBhbmQgb25lIHZhbHVlLCBidXQgd2l0aCAuZmllbGQoLi4uKSB3ZSBjYW4gcGFzc1xuICAgICAgICAvLyBhbnkgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBmaWVsZC5cbiAgICAgICAgRGVmSW1wbC5wcm90b3R5cGUuZmllbGQgPSBmdW5jdGlvbiAobmFtZSwgdHlwZSwgZGVmYXVsdEZuLCBoaWRkZW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmFsaXplZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZGVmaW5lIGZpZWxkIFwiICtcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZSkgKyBcIiBvZiBmaW5hbGl6ZWQgdHlwZSBcIiArXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMudHlwZU5hbWUpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3duRmllbGRzW25hbWVdID0gbmV3IEZpZWxkKG5hbWUsIFR5cGUuZnJvbSh0eXBlKSwgZGVmYXVsdEZuLCBoaWRkZW4pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7IC8vIEZvciBjaGFpbmluZy5cbiAgICAgICAgfTtcbiAgICAgICAgRGVmSW1wbC5wcm90b3R5cGUuZmluYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgLy8gSXQncyBub3QgYW4gZXJyb3IgdG8gZmluYWxpemUgYSB0eXBlIG1vcmUgdGhhbiBvbmNlLCBidXQgb25seSB0aGVcbiAgICAgICAgICAgIC8vIGZpcnN0IGNhbGwgdG8gLmZpbmFsaXplIGRvZXMgYW55dGhpbmcuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZmluYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFsbEZpZWxkcyA9IHRoaXMuYWxsRmllbGRzO1xuICAgICAgICAgICAgICAgIHZhciBhbGxTdXBlcnR5cGVzID0gdGhpcy5hbGxTdXBlcnR5cGVzO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlZiA9IGRlZkNhY2hlW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmIGluc3RhbmNlb2YgRGVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWYuZmluYWxpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZChhbGxGaWVsZHMsIGRlZi5hbGxGaWVsZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKGFsbFN1cGVydHlwZXMsIGRlZi5hbGxTdXBlcnR5cGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gXCJ1bmtub3duIHN1cGVydHlwZSBuYW1lIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuYW1lKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgZm9yIHN1YnR5cGUgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KF90aGlzLnR5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gV2FybiBpZiBmaWVsZHMgYXJlIG92ZXJyaWRkZW4gd2l0aCBpbmNvbXBhdGlibGUgdHlwZXMuXG4gICAgICAgICAgICAgICAgZXh0ZW5kKGFsbEZpZWxkcywgdGhpcy5vd25GaWVsZHMpO1xuICAgICAgICAgICAgICAgIGFsbFN1cGVydHlwZXNbdGhpcy50eXBlTmFtZV0gPSB0aGlzO1xuICAgICAgICAgICAgICAgIHRoaXMuZmllbGROYW1lcy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGZpZWxkTmFtZSBpbiBhbGxGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGFsbEZpZWxkcywgZmllbGROYW1lKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWFsbEZpZWxkc1tmaWVsZE5hbWVdLmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZE5hbWVzLnB1c2goZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUeXBlcyBhcmUgZXhwb3J0ZWQgb25seSBvbmNlIHRoZXkgaGF2ZSBiZWVuIGZpbmFsaXplZC5cbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmFtZWRUeXBlcywgdGhpcy50eXBlTmFtZSwge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy50eXBlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maW5hbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEEgbGluZWFyaXphdGlvbiBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LlxuICAgICAgICAgICAgICAgIHBvcHVsYXRlU3VwZXJ0eXBlTGlzdCh0aGlzLnR5cGVOYW1lLCB0aGlzLnN1cGVydHlwZUxpc3QpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkYWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVydHlwZUxpc3QubGFzdEluZGV4T2YoXCJFeHByZXNzaW9uXCIpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgd3JhcEV4cHJlc3Npb25CdWlsZGVyV2l0aFN0YXRlbWVudCh0aGlzLnR5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBEZWZJbXBsO1xuICAgIH0oRGVmKSk7XG4gICAgLy8gTm90ZSB0aGF0IHRoZSBsaXN0IHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gaXMgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbFxuICAgIC8vIHN1cGVydHlwZUxpc3QsICp3aXRob3V0KiB0aGUgdHlwZU5hbWUgaXRzZWxmIGFzIHRoZSBmaXJzdCBlbGVtZW50LlxuICAgIGZ1bmN0aW9uIGdldFN1cGVydHlwZU5hbWVzKHR5cGVOYW1lKSB7XG4gICAgICAgIGlmICghaGFzT3duLmNhbGwoZGVmQ2FjaGUsIHR5cGVOYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkID0gZGVmQ2FjaGVbdHlwZU5hbWVdO1xuICAgICAgICBpZiAoZC5maW5hbGl6ZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZC5zdXBlcnR5cGVMaXN0LnNsaWNlKDEpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCBtYXBwaW5nIGZyb20gZXZlcnkga25vd24gdHlwZSBpbiB0aGUgZGVmQ2FjaGUgdG8gdGhlXG4gICAgLy8gbW9zdCBzcGVjaWZpYyBzdXBlcnR5cGUgd2hvc2UgbmFtZSBpcyBhbiBvd24gcHJvcGVydHkgb2YgdGhlIGNhbmRpZGF0ZXNcbiAgICAvLyBvYmplY3QuXG4gICAgZnVuY3Rpb24gY29tcHV0ZVN1cGVydHlwZUxvb2t1cFRhYmxlKGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgdmFyIHRhYmxlID0ge307XG4gICAgICAgIHZhciB0eXBlTmFtZXMgPSBPYmplY3Qua2V5cyhkZWZDYWNoZSk7XG4gICAgICAgIHZhciB0eXBlTmFtZUNvdW50ID0gdHlwZU5hbWVzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlTmFtZUNvdW50OyArK2kpIHtcbiAgICAgICAgICAgIHZhciB0eXBlTmFtZSA9IHR5cGVOYW1lc1tpXTtcbiAgICAgICAgICAgIHZhciBkID0gZGVmQ2FjaGVbdHlwZU5hbWVdO1xuICAgICAgICAgICAgaWYgKGQuZmluYWxpemVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIgKyB0eXBlTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGQuc3VwZXJ0eXBlTGlzdC5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIHZhciBzdXBlclR5cGVOYW1lID0gZC5zdXBlcnR5cGVMaXN0W2pdO1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChjYW5kaWRhdGVzLCBzdXBlclR5cGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB0YWJsZVt0eXBlTmFtZV0gPSBzdXBlclR5cGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cbiAgICB2YXIgYnVpbGRlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIC8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgYXMgcHJvdG90eXBlIGZvciBhbnkgbm9kZSBjcmVhdGVkIGJ5IGEgYnVpbGRlci5cbiAgICB2YXIgbm9kZVByb3RvdHlwZSA9IHt9O1xuICAgIC8vIENhbGwgdGhpcyBmdW5jdGlvbiB0byBkZWZpbmUgYSBuZXcgbWV0aG9kIHRvIGJlIHNoYXJlZCBieSBhbGwgQVNUXG4gICAgLy8gbm9kZXMuIFRoZSByZXBsYWNlZCBtZXRob2QgKGlmIGFueSkgaXMgcmV0dXJuZWQgZm9yIGVhc3kgd3JhcHBpbmcuXG4gICAgZnVuY3Rpb24gZGVmaW5lTWV0aG9kKG5hbWUsIGZ1bmMpIHtcbiAgICAgICAgdmFyIG9sZCA9IG5vZGVQcm90b3R5cGVbbmFtZV07XG4gICAgICAgIC8vIFBhc3MgdW5kZWZpbmVkIGFzIGZ1bmMgdG8gZGVsZXRlIG5vZGVQcm90b3R5cGVbbmFtZV0uXG4gICAgICAgIGlmIChpc1VuZGVmaW5lZC5jaGVjayhmdW5jKSkge1xuICAgICAgICAgICAgZGVsZXRlIG5vZGVQcm90b3R5cGVbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpc0Z1bmN0aW9uLmFzc2VydChmdW5jKTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlUHJvdG90eXBlLCBuYW1lLCB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvbGQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEJ1aWxkZXJOYW1lKHR5cGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0eXBlTmFtZS5yZXBsYWNlKC9eW0EtWl0rLywgZnVuY3Rpb24gKHVwcGVyQ2FzZVByZWZpeCkge1xuICAgICAgICAgICAgdmFyIGxlbiA9IHVwcGVyQ2FzZVByZWZpeC5sZW5ndGg7XG4gICAgICAgICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBpbml0aWFsIGNhcGl0YWwgbGV0dGVyLCBqdXN0IGxvd2VyLWNhc2UgaXQuXG4gICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gdXBwZXJDYXNlUHJlZml4LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIGluaXRpYWwgY2FwaXRhbCBsZXR0ZXIsIGxvd2VyLWNhc2VcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGJ1dCB0aGUgbGFzdCBvbmUsIHNvIHRoYXQgWE1MRGVmYXVsdERlY2xhcmF0aW9uIChmb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZSkgYmVjb21lcyB4bWxEZWZhdWx0RGVjbGFyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1cHBlckNhc2VQcmVmaXguc2xpY2UoMCwgbGVuIC0gMSkudG9Mb3dlckNhc2UoKSArXG4gICAgICAgICAgICAgICAgICAgICAgICB1cHBlckNhc2VQcmVmaXguY2hhckF0KGxlbiAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U3RhdGVtZW50QnVpbGRlck5hbWUodHlwZU5hbWUpIHtcbiAgICAgICAgdHlwZU5hbWUgPSBnZXRCdWlsZGVyTmFtZSh0eXBlTmFtZSk7XG4gICAgICAgIHJldHVybiB0eXBlTmFtZS5yZXBsYWNlKC8oRXhwcmVzc2lvbik/JC8sIFwiU3RhdGVtZW50XCIpO1xuICAgIH1cbiAgICB2YXIgbmFtZWRUeXBlcyA9IHt9O1xuICAgIC8vIExpa2UgT2JqZWN0LmtleXMsIGJ1dCBhd2FyZSBvZiB3aGF0IGZpZWxkcyBlYWNoIEFTVCB0eXBlIHNob3VsZCBoYXZlLlxuICAgIGZ1bmN0aW9uIGdldEZpZWxkTmFtZXMob2JqZWN0KSB7XG4gICAgICAgIHZhciBkID0gZGVmRnJvbVZhbHVlKG9iamVjdCk7XG4gICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICByZXR1cm4gZC5maWVsZE5hbWVzLnNsaWNlKDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcInR5cGVcIiBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImRpZCBub3QgcmVjb2duaXplIG9iamVjdCBvZiB0eXBlIFwiICtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShvYmplY3QudHlwZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBwcm9wZXJ0eSwgdGFraW5nIG9iamVjdC50eXBlIGFuZCBkZWZhdWx0XG4gICAgLy8gZnVuY3Rpb25zIGludG8gYWNjb3VudC5cbiAgICBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlKG9iamVjdCwgZmllbGROYW1lKSB7XG4gICAgICAgIHZhciBkID0gZGVmRnJvbVZhbHVlKG9iamVjdCk7XG4gICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICB2YXIgZmllbGQgPSBkLmFsbEZpZWxkc1tmaWVsZE5hbWVdO1xuICAgICAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldFZhbHVlKG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdCAmJiBvYmplY3RbZmllbGROYW1lXTtcbiAgICB9XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBkZWZpbmVkIGZpZWxkcyBvZiBhbiBvYmplY3QsIGluY2x1ZGluZyB0aG9zZSBtaXNzaW5nXG4gICAgLy8gb3IgdW5kZWZpbmVkLCBwYXNzaW5nIGVhY2ggZmllbGQgbmFtZSBhbmQgZWZmZWN0aXZlIHZhbHVlIChhcyByZXR1cm5lZFxuICAgIC8vIGJ5IGdldEZpZWxkVmFsdWUpIHRvIHRoZSBjYWxsYmFjay4gSWYgdGhlIG9iamVjdCBoYXMgbm8gY29ycmVzcG9uZGluZ1xuICAgIC8vIERlZiwgdGhlIGNhbGxiYWNrIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLlxuICAgIGZ1bmN0aW9uIGVhY2hGaWVsZChvYmplY3QsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICAgIGdldEZpZWxkTmFtZXMob2JqZWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIG5hbWUsIGdldEZpZWxkVmFsdWUob2JqZWN0LCBuYW1lKSk7XG4gICAgICAgIH0sIGNvbnRleHQpO1xuICAgIH1cbiAgICAvLyBTaW1pbGFyIHRvIGVhY2hGaWVsZCwgZXhjZXB0IHRoYXQgaXRlcmF0aW9uIHN0b3BzIGFzIHNvb24gYXMgdGhlXG4gICAgLy8gY2FsbGJhY2sgcmV0dXJucyBhIHRydXRoeSB2YWx1ZS4gTGlrZSBBcnJheS5wcm90b3R5cGUuc29tZSwgdGhlIGZpbmFsXG4gICAgLy8gcmVzdWx0IGlzIGVpdGhlciB0cnVlIG9yIGZhbHNlIHRvIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjYWxsYmFja1xuICAgIC8vIHJldHVybmVkIHRydWUgZm9yIGFueSBlbGVtZW50IG9yIG5vdC5cbiAgICBmdW5jdGlvbiBzb21lRmllbGQob2JqZWN0LCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gZ2V0RmllbGROYW1lcyhvYmplY3QpLnNvbWUoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG5hbWUsIGdldEZpZWxkVmFsdWUob2JqZWN0LCBuYW1lKSk7XG4gICAgICAgIH0sIGNvbnRleHQpO1xuICAgIH1cbiAgICAvLyBBZGRzIGFuIGFkZGl0aW9uYWwgYnVpbGRlciBmb3IgRXhwcmVzc2lvbiBzdWJ0eXBlc1xuICAgIC8vIHRoYXQgd3JhcHMgdGhlIGJ1aWx0IEV4cHJlc3Npb24gaW4gYW4gRXhwcmVzc2lvblN0YXRlbWVudHMuXG4gICAgZnVuY3Rpb24gd3JhcEV4cHJlc3Npb25CdWlsZGVyV2l0aFN0YXRlbWVudCh0eXBlTmFtZSkge1xuICAgICAgICB2YXIgd3JhcHBlck5hbWUgPSBnZXRTdGF0ZW1lbnRCdWlsZGVyTmFtZSh0eXBlTmFtZSk7XG4gICAgICAgIC8vIHNraXAgaWYgdGhlIGJ1aWxkZXIgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgaWYgKGJ1aWxkZXJzW3dyYXBwZXJOYW1lXSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gdGhlIGJ1aWxkZXIgZnVuY3Rpb24gdG8gd3JhcCB3aXRoIGJ1aWxkZXJzLkV4cHJlc3Npb25TdGF0ZW1lbnRcbiAgICAgICAgdmFyIHdyYXBwZWQgPSBidWlsZGVyc1tnZXRCdWlsZGVyTmFtZSh0eXBlTmFtZSldO1xuICAgICAgICAvLyBza2lwIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gd3JhcFxuICAgICAgICBpZiAoIXdyYXBwZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBidWlsZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXJzLmV4cHJlc3Npb25TdGF0ZW1lbnQod3JhcHBlZC5hcHBseShidWlsZGVycywgYXJncykpO1xuICAgICAgICB9O1xuICAgICAgICBidWlsZGVyLmZyb20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlcnMuZXhwcmVzc2lvblN0YXRlbWVudCh3cmFwcGVkLmZyb20uYXBwbHkoYnVpbGRlcnMsIGFyZ3MpKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnVpbGRlcnNbd3JhcHBlck5hbWVdID0gYnVpbGRlcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wdWxhdGVTdXBlcnR5cGVMaXN0KHR5cGVOYW1lLCBsaXN0KSB7XG4gICAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgICAgbGlzdC5wdXNoKHR5cGVOYW1lKTtcbiAgICAgICAgdmFyIGxhc3RTZWVuID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yICh2YXIgcG9zID0gMDsgcG9zIDwgbGlzdC5sZW5ndGg7ICsrcG9zKSB7XG4gICAgICAgICAgICB0eXBlTmFtZSA9IGxpc3RbcG9zXTtcbiAgICAgICAgICAgIHZhciBkID0gZGVmQ2FjaGVbdHlwZU5hbWVdO1xuICAgICAgICAgICAgaWYgKGQuZmluYWxpemVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgd2Ugc2F3IHR5cGVOYW1lIGVhcmxpZXIgaW4gdGhlIGJyZWFkdGgtZmlyc3QgdHJhdmVyc2FsLFxuICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSBsYXN0LXNlZW4gb2NjdXJyZW5jZS5cbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChsYXN0U2VlbiwgdHlwZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGxpc3RbbGFzdFNlZW5bdHlwZU5hbWVdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlY29yZCB0aGUgbmV3IGluZGV4IG9mIHRoZSBsYXN0LXNlZW4gb2NjdXJyZW5jZSBvZiB0eXBlTmFtZS5cbiAgICAgICAgICAgIGxhc3RTZWVuW3R5cGVOYW1lXSA9IHBvcztcbiAgICAgICAgICAgIC8vIEVucXVldWUgdGhlIGJhc2UgbmFtZXMgb2YgdGhpcyB0eXBlLlxuICAgICAgICAgICAgbGlzdC5wdXNoLmFwcGx5KGxpc3QsIGQuYmFzZU5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb21wYWN0aW9uIGxvb3AgdG8gcmVtb3ZlIGFycmF5IGhvbGVzLlxuICAgICAgICBmb3IgKHZhciB0byA9IDAsIGZyb20gPSB0bywgbGVuID0gbGlzdC5sZW5ndGg7IGZyb20gPCBsZW47ICsrZnJvbSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGxpc3QsIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgbGlzdFt0bysrXSA9IGxpc3RbZnJvbV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGlzdC5sZW5ndGggPSB0bztcbiAgICB9XG4gICAgZnVuY3Rpb24gZXh0ZW5kKGludG8sIGZyb20pIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZnJvbSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgaW50b1tuYW1lXSA9IGZyb21bbmFtZV07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW50bztcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluYWxpemUoKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGRlZkNhY2hlKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICBkZWZDYWNoZVtuYW1lXS5maW5hbGl6ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgVHlwZTogVHlwZSxcbiAgICAgICAgYnVpbHRJblR5cGVzOiBidWlsdEluVHlwZXMsXG4gICAgICAgIGdldFN1cGVydHlwZU5hbWVzOiBnZXRTdXBlcnR5cGVOYW1lcyxcbiAgICAgICAgY29tcHV0ZVN1cGVydHlwZUxvb2t1cFRhYmxlOiBjb21wdXRlU3VwZXJ0eXBlTG9va3VwVGFibGUsXG4gICAgICAgIGJ1aWxkZXJzOiBidWlsZGVycyxcbiAgICAgICAgZGVmaW5lTWV0aG9kOiBkZWZpbmVNZXRob2QsXG4gICAgICAgIGdldEJ1aWxkZXJOYW1lOiBnZXRCdWlsZGVyTmFtZSxcbiAgICAgICAgZ2V0U3RhdGVtZW50QnVpbGRlck5hbWU6IGdldFN0YXRlbWVudEJ1aWxkZXJOYW1lLFxuICAgICAgICBuYW1lZFR5cGVzOiBuYW1lZFR5cGVzLFxuICAgICAgICBnZXRGaWVsZE5hbWVzOiBnZXRGaWVsZE5hbWVzLFxuICAgICAgICBnZXRGaWVsZFZhbHVlOiBnZXRGaWVsZFZhbHVlLFxuICAgICAgICBlYWNoRmllbGQ6IGVhY2hGaWVsZCxcbiAgICAgICAgc29tZUZpZWxkOiBzb21lRmllbGQsXG4gICAgICAgIGZpbmFsaXplOiBmaW5hbGl6ZSxcbiAgICB9O1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gdHlwZXNQbHVnaW47XG47XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudmlzaXQgPSBleHBvcnRzLnVzZSA9IGV4cG9ydHMuVHlwZSA9IGV4cG9ydHMuc29tZUZpZWxkID0gZXhwb3J0cy5QYXRoVmlzaXRvciA9IGV4cG9ydHMuUGF0aCA9IGV4cG9ydHMuTm9kZVBhdGggPSBleHBvcnRzLm5hbWVkVHlwZXMgPSBleHBvcnRzLmdldFN1cGVydHlwZU5hbWVzID0gZXhwb3J0cy5nZXRGaWVsZFZhbHVlID0gZXhwb3J0cy5nZXRGaWVsZE5hbWVzID0gZXhwb3J0cy5nZXRCdWlsZGVyTmFtZSA9IGV4cG9ydHMuZmluYWxpemUgPSBleHBvcnRzLmVhY2hGaWVsZCA9IGV4cG9ydHMuZGVmaW5lTWV0aG9kID0gZXhwb3J0cy5idWlsdEluVHlwZXMgPSBleHBvcnRzLmJ1aWxkZXJzID0gZXhwb3J0cy5hc3ROb2Rlc0FyZUVxdWl2YWxlbnQgPSB2b2lkIDA7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciBmb3JrXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9mb3JrXCIpKTtcbnZhciBjb3JlXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvY29yZVwiKSk7XG52YXIgZXM2XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvZXM2XCIpKTtcbnZhciBlczdfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9lczdcIikpO1xudmFyIGVzMjAyMF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZGVmL2VzMjAyMFwiKSk7XG52YXIganN4XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvanN4XCIpKTtcbnZhciBmbG93XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvZmxvd1wiKSk7XG52YXIgZXNwcmltYV8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZGVmL2VzcHJpbWFcIikpO1xudmFyIGJhYmVsXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvYmFiZWxcIikpO1xudmFyIHR5cGVzY3JpcHRfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi90eXBlc2NyaXB0XCIpKTtcbnZhciBlc19wcm9wb3NhbHNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9lcy1wcm9wb3NhbHNcIikpO1xudmFyIG5hbWVkVHlwZXNfMSA9IHJlcXVpcmUoXCIuL2dlbi9uYW1lZFR5cGVzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibmFtZWRUeXBlc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmFtZWRUeXBlc18xLm5hbWVkVHlwZXM7IH0gfSk7XG52YXIgX2EgPSBmb3JrXzEuZGVmYXVsdChbXG4gICAgLy8gVGhpcyBjb3JlIG1vZHVsZSBvZiBBU1QgdHlwZXMgY2FwdHVyZXMgRVM1IGFzIGl0IGlzIHBhcnNlZCB0b2RheSBieVxuICAgIC8vIGdpdDovL2dpdGh1Yi5jb20vYXJpeWEvZXNwcmltYS5naXQjbWFzdGVyLlxuICAgIGNvcmVfMS5kZWZhdWx0LFxuICAgIC8vIEZlZWwgZnJlZSB0byBhZGQgdG8gb3IgcmVtb3ZlIGZyb20gdGhpcyBsaXN0IG9mIGV4dGVuc2lvbiBtb2R1bGVzIHRvXG4gICAgLy8gY29uZmlndXJlIHRoZSBwcmVjaXNlIHR5cGUgaGllcmFyY2h5IHRoYXQgeW91IG5lZWQuXG4gICAgZXM2XzEuZGVmYXVsdCxcbiAgICBlczdfMS5kZWZhdWx0LFxuICAgIGVzMjAyMF8xLmRlZmF1bHQsXG4gICAganN4XzEuZGVmYXVsdCxcbiAgICBmbG93XzEuZGVmYXVsdCxcbiAgICBlc3ByaW1hXzEuZGVmYXVsdCxcbiAgICBiYWJlbF8xLmRlZmF1bHQsXG4gICAgdHlwZXNjcmlwdF8xLmRlZmF1bHQsXG4gICAgZXNfcHJvcG9zYWxzXzEuZGVmYXVsdCxcbl0pLCBhc3ROb2Rlc0FyZUVxdWl2YWxlbnQgPSBfYS5hc3ROb2Rlc0FyZUVxdWl2YWxlbnQsIGJ1aWxkZXJzID0gX2EuYnVpbGRlcnMsIGJ1aWx0SW5UeXBlcyA9IF9hLmJ1aWx0SW5UeXBlcywgZGVmaW5lTWV0aG9kID0gX2EuZGVmaW5lTWV0aG9kLCBlYWNoRmllbGQgPSBfYS5lYWNoRmllbGQsIGZpbmFsaXplID0gX2EuZmluYWxpemUsIGdldEJ1aWxkZXJOYW1lID0gX2EuZ2V0QnVpbGRlck5hbWUsIGdldEZpZWxkTmFtZXMgPSBfYS5nZXRGaWVsZE5hbWVzLCBnZXRGaWVsZFZhbHVlID0gX2EuZ2V0RmllbGRWYWx1ZSwgZ2V0U3VwZXJ0eXBlTmFtZXMgPSBfYS5nZXRTdXBlcnR5cGVOYW1lcywgbiA9IF9hLm5hbWVkVHlwZXMsIE5vZGVQYXRoID0gX2EuTm9kZVBhdGgsIFBhdGggPSBfYS5QYXRoLCBQYXRoVmlzaXRvciA9IF9hLlBhdGhWaXNpdG9yLCBzb21lRmllbGQgPSBfYS5zb21lRmllbGQsIFR5cGUgPSBfYS5UeXBlLCB1c2UgPSBfYS51c2UsIHZpc2l0ID0gX2EudmlzaXQ7XG5leHBvcnRzLmFzdE5vZGVzQXJlRXF1aXZhbGVudCA9IGFzdE5vZGVzQXJlRXF1aXZhbGVudDtcbmV4cG9ydHMuYnVpbGRlcnMgPSBidWlsZGVycztcbmV4cG9ydHMuYnVpbHRJblR5cGVzID0gYnVpbHRJblR5cGVzO1xuZXhwb3J0cy5kZWZpbmVNZXRob2QgPSBkZWZpbmVNZXRob2Q7XG5leHBvcnRzLmVhY2hGaWVsZCA9IGVhY2hGaWVsZDtcbmV4cG9ydHMuZmluYWxpemUgPSBmaW5hbGl6ZTtcbmV4cG9ydHMuZ2V0QnVpbGRlck5hbWUgPSBnZXRCdWlsZGVyTmFtZTtcbmV4cG9ydHMuZ2V0RmllbGROYW1lcyA9IGdldEZpZWxkTmFtZXM7XG5leHBvcnRzLmdldEZpZWxkVmFsdWUgPSBnZXRGaWVsZFZhbHVlO1xuZXhwb3J0cy5nZXRTdXBlcnR5cGVOYW1lcyA9IGdldFN1cGVydHlwZU5hbWVzO1xuZXhwb3J0cy5Ob2RlUGF0aCA9IE5vZGVQYXRoO1xuZXhwb3J0cy5QYXRoID0gUGF0aDtcbmV4cG9ydHMuUGF0aFZpc2l0b3IgPSBQYXRoVmlzaXRvcjtcbmV4cG9ydHMuc29tZUZpZWxkID0gc29tZUZpZWxkO1xuZXhwb3J0cy5UeXBlID0gVHlwZTtcbmV4cG9ydHMudXNlID0gdXNlO1xuZXhwb3J0cy52aXNpdCA9IHZpc2l0O1xuLy8gUG9wdWxhdGUgdGhlIGV4cG9ydGVkIGZpZWxkcyBvZiB0aGUgbmFtZWRUeXBlcyBuYW1lc3BhY2UsIHdoaWxlIHN0aWxsXG4vLyByZXRhaW5pbmcgaXRzIG1lbWJlciB0eXBlcy5cbk9iamVjdC5hc3NpZ24obmFtZWRUeXBlc18xLm5hbWVkVHlwZXMsIG4pO1xuIiwiZnVuY3Rpb24gaXNCdWZmZXIgKHZhbHVlKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheVxufVxuXG5mdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICByZXR1cm4gQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gQnVmZmVyLmFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAoc2l6ZSkge1xuICByZXR1cm4gQnVmZmVyLmFsbG9jVW5zYWZlKHNpemUpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlU2xvdyAoc2l6ZSkge1xuICByZXR1cm4gQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyhzaXplKVxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIHJldHVybiBCdWZmZXIuY29tcGFyZShhLCBiKVxufVxuXG5mdW5jdGlvbiBjb25jYXQgKGJ1ZmZlcnMsIHRvdGFsTGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMsIHRvdGFsTGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBjb3B5IChzb3VyY2UsIHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKHNvdXJjZSkuY29weSh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKVxufVxuXG5mdW5jdGlvbiBlcXVhbHMgKGEsIGIpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGEpLmVxdWFscyhiKVxufVxuXG5mdW5jdGlvbiBmaWxsIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuZmlsbCh2YWx1ZSwgb2Zmc2V0LCBlbmQsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBpbmNsdWRlcyAoYnVmZmVyLCB2YWx1ZSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuaW5jbHVkZXModmFsdWUsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBpbmRleE9mIChidWZmZXIsIHZhbHVlLCBieWZlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5pbmRleE9mKHZhbHVlLCBieWZlT2Zmc2V0LCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gbGFzdEluZGV4T2YgKGJ1ZmZlciwgdmFsdWUsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLmxhc3RJbmRleE9mKHZhbHVlLCBieXRlT2Zmc2V0LCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gc3dhcDE2IChidWZmZXIpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuc3dhcDE2KClcbn1cblxuZnVuY3Rpb24gc3dhcDMyIChidWZmZXIpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuc3dhcDMyKClcbn1cblxuZnVuY3Rpb24gc3dhcDY0IChidWZmZXIpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuc3dhcDY0KClcbn1cblxuZnVuY3Rpb24gdG9CdWZmZXIgKGJ1ZmZlcikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGJ1ZmZlcikpIHJldHVybiBidWZmZXJcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ1ZmZlci5idWZmZXIsIGJ1ZmZlci5ieXRlT2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbn1cblxuZnVuY3Rpb24gdG9TdHJpbmcgKGJ1ZmZlciwgZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikudG9TdHJpbmcoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlIChidWZmZXIsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZUxFIChidWZmZXIsIHZhbHVlLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGVEb3VibGVMRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0TEUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZUZsb2F0TEUodmFsdWUsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlVUludDMyTEUodmFsdWUsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gd3JpdGVJbnQzMkxFIChidWZmZXIsIHZhbHVlLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGVJbnQzMkxFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWREb3VibGVMRSAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikucmVhZERvdWJsZUxFKG9mZnNldClcbn1cblxuZnVuY3Rpb24gcmVhZEZsb2F0TEUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWRGbG9hdExFKG9mZnNldClcbn1cblxuZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkVUludDMyTEUob2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkSW50MzJMRSAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikucmVhZEludDMyTEUob2Zmc2V0KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNCdWZmZXIsXG4gIGlzRW5jb2RpbmcsXG4gIGFsbG9jLFxuICBhbGxvY1Vuc2FmZSxcbiAgYWxsb2NVbnNhZmVTbG93LFxuICBieXRlTGVuZ3RoLFxuICBjb21wYXJlLFxuICBjb25jYXQsXG4gIGNvcHksXG4gIGVxdWFscyxcbiAgZmlsbCxcbiAgZnJvbSxcbiAgaW5jbHVkZXMsXG4gIGluZGV4T2YsXG4gIGxhc3RJbmRleE9mLFxuICBzd2FwMTYsXG4gIHN3YXAzMixcbiAgc3dhcDY0LFxuICB0b0J1ZmZlcixcbiAgdG9TdHJpbmcsXG4gIHdyaXRlLFxuICB3cml0ZURvdWJsZUxFLFxuICB3cml0ZUZsb2F0TEUsXG4gIHdyaXRlVUludDMyTEUsXG4gIHdyaXRlSW50MzJMRSxcbiAgcmVhZERvdWJsZUxFLFxuICByZWFkRmxvYXRMRSxcbiAgcmVhZFVJbnQzMkxFLFxuICByZWFkSW50MzJMRVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNsaWVudCA9IHZvaWQgMDtcbmNvbnN0IGZzXzEgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCBwYXRoXzEgPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IHRsc18xID0gcmVxdWlyZShcInRsc1wiKTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCJ1dGlsXCIpO1xuY29uc3QgRnRwQ29udGV4dF8xID0gcmVxdWlyZShcIi4vRnRwQ29udGV4dFwiKTtcbmNvbnN0IHBhcnNlTGlzdF8xID0gcmVxdWlyZShcIi4vcGFyc2VMaXN0XCIpO1xuY29uc3QgUHJvZ3Jlc3NUcmFja2VyXzEgPSByZXF1aXJlKFwiLi9Qcm9ncmVzc1RyYWNrZXJcIik7XG5jb25zdCBTdHJpbmdXcml0ZXJfMSA9IHJlcXVpcmUoXCIuL1N0cmluZ1dyaXRlclwiKTtcbmNvbnN0IHBhcnNlTGlzdE1MU0RfMSA9IHJlcXVpcmUoXCIuL3BhcnNlTGlzdE1MU0RcIik7XG5jb25zdCBuZXRVdGlsc18xID0gcmVxdWlyZShcIi4vbmV0VXRpbHNcIik7XG5jb25zdCB0cmFuc2Zlcl8xID0gcmVxdWlyZShcIi4vdHJhbnNmZXJcIik7XG5jb25zdCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xID0gcmVxdWlyZShcIi4vcGFyc2VDb250cm9sUmVzcG9uc2VcIik7XG4vLyBVc2UgcHJvbWlzaWZ5IHRvIGtlZXAgdGhlIGxpYnJhcnkgY29tcGF0aWJsZSB3aXRoIE5vZGUgOC5cbmNvbnN0IGZzUmVhZERpciA9ICgwLCB1dGlsXzEucHJvbWlzaWZ5KShmc18xLnJlYWRkaXIpO1xuY29uc3QgZnNNa0RpciA9ICgwLCB1dGlsXzEucHJvbWlzaWZ5KShmc18xLm1rZGlyKTtcbmNvbnN0IGZzU3RhdCA9ICgwLCB1dGlsXzEucHJvbWlzaWZ5KShmc18xLnN0YXQpO1xuY29uc3QgZnNPcGVuID0gKDAsIHV0aWxfMS5wcm9taXNpZnkpKGZzXzEub3Blbik7XG5jb25zdCBmc0Nsb3NlID0gKDAsIHV0aWxfMS5wcm9taXNpZnkpKGZzXzEuY2xvc2UpO1xuY29uc3QgZnNVbmxpbmsgPSAoMCwgdXRpbF8xLnByb21pc2lmeSkoZnNfMS51bmxpbmspO1xuY29uc3QgTElTVF9DT01NQU5EU19ERUZBVUxUID0gKCkgPT4gW1wiTElTVCAtYVwiLCBcIkxJU1RcIl07XG5jb25zdCBMSVNUX0NPTU1BTkRTX01MU0QgPSAoKSA9PiBbXCJNTFNEXCIsIFwiTElTVCAtYVwiLCBcIkxJU1RcIl07XG4vKipcbiAqIEhpZ2gtbGV2ZWwgQVBJIHRvIGludGVyYWN0IHdpdGggYW4gRlRQIHNlcnZlci5cbiAqL1xuY2xhc3MgQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBJbnN0YW50aWF0ZSBhbiBGVFAgY2xpZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHRpbWVvdXQgIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCB1c2UgMCBmb3Igbm8gdGltZW91dC4gT3B0aW9uYWwsIGRlZmF1bHQgaXMgMzAgc2Vjb25kcy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0aW1lb3V0ID0gMzAwMDApIHtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVMaXN0Q29tbWFuZHMgPSBMSVNUX0NPTU1BTkRTX0RFRkFVTFQoKTtcbiAgICAgICAgdGhpcy5mdHAgPSBuZXcgRnRwQ29udGV4dF8xLkZUUENvbnRleHQodGltZW91dCk7XG4gICAgICAgIHRoaXMucHJlcGFyZVRyYW5zZmVyID0gdGhpcy5fZW50ZXJGaXJzdENvbXBhdGlibGVNb2RlKFt0cmFuc2Zlcl8xLmVudGVyUGFzc2l2ZU1vZGVJUHY2LCB0cmFuc2Zlcl8xLmVudGVyUGFzc2l2ZU1vZGVJUHY0XSk7XG4gICAgICAgIHRoaXMucGFyc2VMaXN0ID0gcGFyc2VMaXN0XzEucGFyc2VMaXN0O1xuICAgICAgICB0aGlzLl9wcm9ncmVzc1RyYWNrZXIgPSBuZXcgUHJvZ3Jlc3NUcmFja2VyXzEuUHJvZ3Jlc3NUcmFja2VyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjbGllbnQgYW5kIGFsbCBvcGVuIHNvY2tldCBjb25uZWN0aW9ucy5cbiAgICAgKlxuICAgICAqIENsb3NlIHRoZSBjbGllbnQgYW5kIGFsbCBvcGVuIHNvY2tldCBjb25uZWN0aW9ucy4gVGhlIGNsaWVudCBjYW7igJl0IGJlIHVzZWQgYW55bW9yZSBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLFxuICAgICAqIHlvdSBoYXZlIHRvIGVpdGhlciByZWNvbm5lY3Qgd2l0aCBgYWNjZXNzYCBvciBgY29ubmVjdGAgb3IgaW5zdGFudGlhdGUgYSBuZXcgaW5zdGFuY2UgdG8gY29udGludWUgYW55IHdvcmsuXG4gICAgICogQSBjbGllbnQgaXMgYWxzbyBjbG9zZWQgYXV0b21hdGljYWxseSBpZiBhbnkgdGltZW91dCBvciBjb25uZWN0aW9uIGVycm9yIG9jY3Vycy5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5mdHAuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3NUcmFja2VyLnN0b3AoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjbGllbnQgaXMgY2xvc2VkIGFuZCBjYW4ndCBiZSB1c2VkIGFueW1vcmUuXG4gICAgICovXG4gICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnRwLmNsb3NlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29ubmVjdCAob3IgcmVjb25uZWN0KSB0byBhbiBGVFAgc2VydmVyLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhbiBpbnN0YW5jZSBtZXRob2QgYW5kIHRodXMgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgdGhlIGxpZmVjeWNsZSBvZiBhIGBDbGllbnRgXG4gICAgICogaW5zdGFuY2UuIFdoZW5ldmVyIHlvdSBkbywgdGhlIGNsaWVudCBpcyByZXNldCB3aXRoIGEgbmV3IGNvbnRyb2wgY29ubmVjdGlvbi4gVGhpcyBhbHNvIGltcGxpZXMgdGhhdFxuICAgICAqIHlvdSBjYW4gcmVvcGVuIGEgYENsaWVudGAgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIHdoZW4gcmVjb25uZWN0aW5nIHdpdGggdGhpc1xuICAgICAqIG1ldGhvZC4gSW4gZmFjdCwgcmVjb25uZWN0aW5nIGlzIHRoZSBvbmx5IHdheSB0byBjb250aW51ZSB1c2luZyBhIGNsb3NlZCBgQ2xpZW50YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBob3N0ICBIb3N0IHRoZSBjbGllbnQgc2hvdWxkIGNvbm5lY3QgdG8uIE9wdGlvbmFsLCBkZWZhdWx0IGlzIFwibG9jYWxob3N0XCIuXG4gICAgICogQHBhcmFtIHBvcnQgIFBvcnQgdGhlIGNsaWVudCBzaG91bGQgY29ubmVjdCB0by4gT3B0aW9uYWwsIGRlZmF1bHQgaXMgMjEuXG4gICAgICovXG4gICAgY29ubmVjdChob3N0ID0gXCJsb2NhbGhvc3RcIiwgcG9ydCA9IDIxKSB7XG4gICAgICAgIHRoaXMuZnRwLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZnRwLnNvY2tldC5jb25uZWN0KHtcbiAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICBwb3J0LFxuICAgICAgICAgICAgZmFtaWx5OiB0aGlzLmZ0cC5pcEZhbWlseVxuICAgICAgICB9LCAoKSA9PiB0aGlzLmZ0cC5sb2coYENvbm5lY3RlZCB0byAkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlQWRkcmVzcykodGhpcy5mdHAuc29ja2V0KX0gKCR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVUTFMpKHRoaXMuZnRwLnNvY2tldCl9KWApKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUNvbm5lY3RSZXNwb25zZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcyBgY29ubmVjdGAgYnV0IHVzaW5nIGltcGxpY2l0IFRMUy4gSW1wbGljaXQgVExTIGlzIG5vdCBhbiBGVFAgc3RhbmRhcmQgYW5kIGhhcyBiZWVuIHJlcGxhY2VkIGJ5XG4gICAgICogZXhwbGljaXQgVExTLiBUaGVyZSBhcmUgc3RpbGwgRlRQIHNlcnZlcnMgdGhhdCBzdXBwb3J0IG9ubHkgaW1wbGljaXQgVExTLCB0aG91Z2guXG4gICAgICovXG4gICAgY29ubmVjdEltcGxpY2l0VExTKGhvc3QgPSBcImxvY2FsaG9zdFwiLCBwb3J0ID0gMjEsIHRsc09wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmZ0cC5yZXNldCgpO1xuICAgICAgICB0aGlzLmZ0cC5zb2NrZXQgPSAoMCwgdGxzXzEuY29ubmVjdCkocG9ydCwgaG9zdCwgdGxzT3B0aW9ucywgKCkgPT4gdGhpcy5mdHAubG9nKGBDb25uZWN0ZWQgdG8gJHsoMCwgbmV0VXRpbHNfMS5kZXNjcmliZUFkZHJlc3MpKHRoaXMuZnRwLnNvY2tldCl9ICgkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlVExTKSh0aGlzLmZ0cC5zb2NrZXQpfSlgKSk7XG4gICAgICAgIHRoaXMuZnRwLnRsc09wdGlvbnMgPSB0bHNPcHRpb25zO1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlQ29ubmVjdFJlc3BvbnNlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGZpcnN0IHJlcG9uc2UgYnkgYW4gRlRQIHNlcnZlciBhZnRlciB0aGUgc29ja2V0IGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuXG4gICAgICovXG4gICAgX2hhbmRsZUNvbm5lY3RSZXNwb25zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnRwLmhhbmRsZSh1bmRlZmluZWQsIChyZXMsIHRhc2spID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZCBieSB0aGUgRlRQQ29udGV4dCBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgICAgIHRhc2sucmVqZWN0KHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgoMCwgcGFyc2VDb250cm9sUmVzcG9uc2VfMS5wb3NpdGl2ZUNvbXBsZXRpb24pKHJlcy5jb2RlKSkge1xuICAgICAgICAgICAgICAgIHRhc2sucmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVqZWN0IGFsbCBvdGhlciBjb2RlcywgaW5jbHVkaW5nIDEyMCBcIlNlcnZpY2UgcmVhZHkgaW4gbm5uIG1pbnV0ZXNcIi5cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IHN0YXkgY29ubmVjdGVkIGJ1dCBkb24ndCByZXBsYWNlIHRoZSBzb2NrZXQgeWV0IGJ5IHVzaW5nIHJlc2V0KClcbiAgICAgICAgICAgICAgICAvLyBzbyB0aGUgdXNlciBjYW4gaW5zcGVjdCBwcm9wZXJ0aWVzIG9mIHRoaXMgaW5zdGFuY2UuXG4gICAgICAgICAgICAgICAgdGFzay5yZWplY3QobmV3IEZ0cENvbnRleHRfMS5GVFBFcnJvcihyZXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYW4gRlRQIGNvbW1hbmQgYW5kIGhhbmRsZSB0aGUgZmlyc3QgcmVzcG9uc2UuXG4gICAgICovXG4gICAgc2VuZChjb21tYW5kLCBpZ25vcmVFcnJvckNvZGVzREVQUkVDQVRFRCA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChpZ25vcmVFcnJvckNvZGVzREVQUkVDQVRFRCkgeyAvLyBEZXByZWNhdGVkIHN0YXJ0aW5nIGZyb20gMy45LjBcbiAgICAgICAgICAgIHRoaXMuZnRwLmxvZyhcIkRlcHJlY2F0ZWQgY2FsbCB1c2luZyBzZW5kKGNvbW1hbmQsIGZsYWcpIHdpdGggYm9vbGVhbiBmbGFnIHRvIGlnbm9yZSBlcnJvcnMuIFVzZSBzZW5kSWdub3JpbmdFcnJvcihjb21tYW5kKS5cIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kSWdub3JpbmdFcnJvcihjb21tYW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5mdHAucmVxdWVzdChjb21tYW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhbiBGVFAgY29tbWFuZCBhbmQgaWdub3JlIGFuIEZUUCBlcnJvciByZXNwb25zZS4gQW55IG90aGVyIGtpbmQgb2YgZXJyb3Igb3IgdGltZW91dCB3aWxsIHN0aWxsIHJlamVjdCB0aGUgUHJvbWlzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb21tYW5kXG4gICAgICovXG4gICAgc2VuZElnbm9yaW5nRXJyb3IoY29tbWFuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mdHAuaGFuZGxlKGNvbW1hbmQsIChyZXMsIHRhc2spID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBGdHBDb250ZXh0XzEuRlRQRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0YXNrLnJlc29sdmUoeyBjb2RlOiByZXMuY29kZSwgbWVzc2FnZTogcmVzLm1lc3NhZ2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRhc2sucmVqZWN0KHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXNrLnJlc29sdmUocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZ3JhZGUgdGhlIGN1cnJlbnQgc29ja2V0IGNvbm5lY3Rpb24gdG8gVExTLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgIFRMUyBvcHRpb25zIGFzIGluIGB0bHMuY29ubmVjdChvcHRpb25zKWAsIG9wdGlvbmFsLlxuICAgICAqIEBwYXJhbSBjb21tYW5kICBTZXQgdGhlIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmQuIE9wdGlvbmFsLCBkZWZhdWx0IGlzIFwiQVVUSCBUTFNcIi5cbiAgICAgKi9cbiAgICBhc3luYyB1c2VUTFMob3B0aW9ucyA9IHt9LCBjb21tYW5kID0gXCJBVVRIIFRMU1wiKSB7XG4gICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IHRoaXMuc2VuZChjb21tYW5kKTtcbiAgICAgICAgdGhpcy5mdHAuc29ja2V0ID0gYXdhaXQgKDAsIG5ldFV0aWxzXzEudXBncmFkZVNvY2tldCkodGhpcy5mdHAuc29ja2V0LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5mdHAudGxzT3B0aW9ucyA9IG9wdGlvbnM7IC8vIEtlZXAgdGhlIFRMUyBvcHRpb25zIGZvciBsYXRlciBkYXRhIGNvbm5lY3Rpb25zIHRoYXQgc2hvdWxkIHVzZSB0aGUgc2FtZSBvcHRpb25zLlxuICAgICAgICB0aGlzLmZ0cC5sb2coYENvbnRyb2wgc29ja2V0IGlzIHVzaW5nOiAkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlVExTKSh0aGlzLmZ0cC5zb2NrZXQpfWApO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2dpbiBhIHVzZXIgd2l0aCBhIHBhc3N3b3JkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXIgIFVzZXJuYW1lIHRvIHVzZSBmb3IgbG9naW4uIE9wdGlvbmFsLCBkZWZhdWx0IGlzIFwiYW5vbnltb3VzXCIuXG4gICAgICogQHBhcmFtIHBhc3N3b3JkICBQYXNzd29yZCB0byB1c2UgZm9yIGxvZ2luLiBPcHRpb25hbCwgZGVmYXVsdCBpcyBcImd1ZXN0XCIuXG4gICAgICovXG4gICAgbG9naW4odXNlciA9IFwiYW5vbnltb3VzXCIsIHBhc3N3b3JkID0gXCJndWVzdFwiKSB7XG4gICAgICAgIHRoaXMuZnRwLmxvZyhgTG9naW4gc2VjdXJpdHk6ICR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVUTFMpKHRoaXMuZnRwLnNvY2tldCl9YCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZ0cC5oYW5kbGUoXCJVU0VSIFwiICsgdXNlciwgKHJlcywgdGFzaykgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGFzay5yZWplY3QocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCgwLCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xLnBvc2l0aXZlQ29tcGxldGlvbikocmVzLmNvZGUpKSB7IC8vIFVzZXIgbG9nZ2VkIGluIHByb2NlZWQgT1IgQ29tbWFuZCBzdXBlcmZsdW91c1xuICAgICAgICAgICAgICAgIHRhc2sucmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzLmNvZGUgPT09IDMzMSkgeyAvLyBVc2VyIG5hbWUgb2theSwgbmVlZCBwYXNzd29yZFxuICAgICAgICAgICAgICAgIHRoaXMuZnRwLnNlbmQoXCJQQVNTIFwiICsgcGFzc3dvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIEFsc28gcmVwb3J0IGVycm9yIG9uIDMzMiAoTmVlZCBhY2NvdW50KVxuICAgICAgICAgICAgICAgIHRhc2sucmVqZWN0KG5ldyBGdHBDb250ZXh0XzEuRlRQRXJyb3IocmVzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHVzdWFsIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgICpcbiAgICAgKiBTZXR0aW5ncyB1c2VkOlxuICAgICAqICogQmluYXJ5IG1vZGUgKFRZUEUgSSlcbiAgICAgKiAqIEZpbGUgc3RydWN0dXJlIChTVFJVIEYpXG4gICAgICogKiBBZGRpdGlvbmFsIHNldHRpbmdzIGZvciBGVFBTIChQQlNaIDAsIFBST1QgUClcbiAgICAgKi9cbiAgICBhc3luYyB1c2VEZWZhdWx0U2V0dGluZ3MoKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gYXdhaXQgdGhpcy5mZWF0dXJlcygpO1xuICAgICAgICAvLyBVc2UgTUxTRCBkaXJlY3RvcnkgbGlzdGluZyBpZiBwb3NzaWJsZS4gU2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNjU5I3NlY3Rpb24tNy44OlxuICAgICAgICAvLyBcIlRoZSBwcmVzZW5jZSBvZiB0aGUgTUxTVCBmZWF0dXJlIGluZGljYXRlcyB0aGF0IGJvdGggTUxTVCBhbmQgTUxTRCBhcmUgc3VwcG9ydGVkLlwiXG4gICAgICAgIGNvbnN0IHN1cHBvcnRzTUxTRCA9IGZlYXR1cmVzLmhhcyhcIk1MU1RcIik7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGlzdENvbW1hbmRzID0gc3VwcG9ydHNNTFNEID8gTElTVF9DT01NQU5EU19NTFNEKCkgOiBMSVNUX0NPTU1BTkRTX0RFRkFVTFQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kKFwiVFlQRSBJXCIpOyAvLyBCaW5hcnkgbW9kZVxuICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiU1RSVSBGXCIpOyAvLyBVc2UgZmlsZSBzdHJ1Y3R1cmVcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kSWdub3JpbmdFcnJvcihcIk9QVFMgVVRGOCBPTlwiKTsgLy8gU29tZSBzZXJ2ZXJzIGV4cGVjdCBVVEYtOCB0byBiZSBlbmFibGVkIGV4cGxpY2l0bHkgYW5kIHNldHRpbmcgYmVmb3JlIGxvZ2luIG1pZ2h0IG5vdCBoYXZlIHdvcmtlZC5cbiAgICAgICAgaWYgKHN1cHBvcnRzTUxTRCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kSWdub3JpbmdFcnJvcihcIk9QVFMgTUxTVCB0eXBlO3NpemU7bW9kaWZ5O3VuaXF1ZTt1bml4Lm1vZGU7dW5peC5vd25lcjt1bml4Lmdyb3VwO3VuaXgub3duZXJuYW1lO3VuaXguZ3JvdXBuYW1lO1wiKTsgLy8gTWFrZSBzdXJlIE1MU0QgbGlzdGluZ3MgaW5jbHVkZSBhbGwgd2UgY2FuIHBhcnNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZnRwLmhhc1RMUykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kSWdub3JpbmdFcnJvcihcIlBCU1ogMFwiKTsgLy8gU2V0IHRvIDAgZm9yIFRMU1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kSWdub3JpbmdFcnJvcihcIlBST1QgUFwiKTsgLy8gUHJvdGVjdCBjaGFubmVsIChhbHNvIGZvciBkYXRhIGNvbm5lY3Rpb25zKVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNhbGxzIGBjb25uZWN0YCwgYHVzZVRMU2AsIGBsb2dpbmAgYW5kIGB1c2VEZWZhdWx0U2V0dGluZ3NgLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhbiBpbnN0YW5jZSBtZXRob2QgYW5kIHRodXMgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgdGhlIGxpZmVjeWNsZSBvZiBhIGBDbGllbnRgXG4gICAgICogaW5zdGFuY2UuIFdoZW5ldmVyIHlvdSBkbywgdGhlIGNsaWVudCBpcyByZXNldCB3aXRoIGEgbmV3IGNvbnRyb2wgY29ubmVjdGlvbi4gVGhpcyBhbHNvIGltcGxpZXMgdGhhdFxuICAgICAqIHlvdSBjYW4gcmVvcGVuIGEgYENsaWVudGAgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIHdoZW4gcmVjb25uZWN0aW5nIHdpdGggdGhpc1xuICAgICAqIG1ldGhvZC4gSW4gZmFjdCwgcmVjb25uZWN0aW5nIGlzIHRoZSBvbmx5IHdheSB0byBjb250aW51ZSB1c2luZyBhIGNsb3NlZCBgQ2xpZW50YC5cbiAgICAgKi9cbiAgICBhc3luYyBhY2Nlc3Mob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IHVzZUV4cGxpY2l0VExTID0gb3B0aW9ucy5zZWN1cmUgPT09IHRydWU7XG4gICAgICAgIGNvbnN0IHVzZUltcGxpY2l0VExTID0gb3B0aW9ucy5zZWN1cmUgPT09IFwiaW1wbGljaXRcIjtcbiAgICAgICAgbGV0IHdlbGNvbWU7XG4gICAgICAgIGlmICh1c2VJbXBsaWNpdFRMUykge1xuICAgICAgICAgICAgd2VsY29tZSA9IGF3YWl0IHRoaXMuY29ubmVjdEltcGxpY2l0VExTKG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0LCBvcHRpb25zLnNlY3VyZU9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2VsY29tZSA9IGF3YWl0IHRoaXMuY29ubmVjdChvcHRpb25zLmhvc3QsIG9wdGlvbnMucG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZUV4cGxpY2l0VExTKSB7XG4gICAgICAgICAgICAvLyBGaXhlcyBodHRwczovL2dpdGh1Yi5jb20vcGF0cmlja2p1Y2hsaS9iYXNpYy1mdHAvaXNzdWVzLzE2NiBieSBtYWtpbmcgc3VyZVxuICAgICAgICAgICAgLy8gaG9zdCBpcyBzZXQgZm9yIGFueSBmdXR1cmUgZGF0YSBjb25uZWN0aW9uIGFzIHdlbGwuXG4gICAgICAgICAgICBjb25zdCBzZWN1cmVPcHRpb25zID0gKF9hID0gb3B0aW9ucy5zZWN1cmVPcHRpb25zKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fTtcbiAgICAgICAgICAgIHNlY3VyZU9wdGlvbnMuaG9zdCA9IChfYiA9IHNlY3VyZU9wdGlvbnMuaG9zdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogb3B0aW9ucy5ob3N0O1xuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VUTFMoc2VjdXJlT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IFVURi04IG9uIGJlZm9yZSBsb2dpbiBpbiBjYXNlIHRoZXJlIGFyZSBub24tYXNjaWkgY2hhcmFjdGVycyBpbiB1c2VyIG9yIHBhc3N3b3JkLlxuICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtaWdodCBub3Qgd29yayBiZWZvcmUgbG9naW4gZGVwZW5kaW5nIG9uIHNlcnZlci5cbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kSWdub3JpbmdFcnJvcihcIk9QVFMgVVRGOCBPTlwiKTtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dpbihvcHRpb25zLnVzZXIsIG9wdGlvbnMucGFzc3dvcmQpO1xuICAgICAgICBhd2FpdCB0aGlzLnVzZURlZmF1bHRTZXR0aW5ncygpO1xuICAgICAgICByZXR1cm4gd2VsY29tZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIGFzeW5jIHB3ZCgpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZW5kKFwiUFdEXCIpO1xuICAgICAgICAvLyBUaGUgZGlyZWN0b3J5IGlzIHBhcnQgb2YgdGhlIHJldHVybiBtZXNzYWdlLCBmb3IgZXhhbXBsZTpcbiAgICAgICAgLy8gMjU3IFwiL3RoaXMvdGhhdFwiIGlzIGN1cnJlbnQgZGlyZWN0b3J5LlxuICAgICAgICBjb25zdCBwYXJzZWQgPSByZXMubWVzc2FnZS5tYXRjaCgvXCIoLispXCIvKTtcbiAgICAgICAgaWYgKHBhcnNlZCA9PT0gbnVsbCB8fCBwYXJzZWRbMV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBwYXJzZSByZXNwb25zZSB0byBjb21tYW5kICdQV0QnOiAke3Jlcy5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWRbMV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhIGRlc2NyaXB0aW9uIG9mIHN1cHBvcnRlZCBmZWF0dXJlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgc2VuZHMgdGhlIEZFQVQgY29tbWFuZCBhbmQgcGFyc2VzIHRoZSByZXN1bHQgaW50byBhIE1hcCB3aGVyZSBrZXlzIGNvcnJlc3BvbmQgdG8gYXZhaWxhYmxlIGNvbW1hbmRzXG4gICAgICogYW5kIHZhbHVlcyBob2xkIGZ1cnRoZXIgaW5mb3JtYXRpb24uIEJlIGF3YXJlIHRoYXQgeW91ciBGVFAgc2VydmVycyBtaWdodCBub3Qgc3VwcG9ydCB0aGlzXG4gICAgICogY29tbWFuZCBpbiB3aGljaCBjYXNlIHRoaXMgbWV0aG9kIHdpbGwgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBidXQganVzdCByZXR1cm4gYW4gZW1wdHkgTWFwLlxuICAgICAqL1xuICAgIGFzeW5jIGZlYXR1cmVzKCkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiRkVBVFwiKTtcbiAgICAgICAgY29uc3QgZmVhdHVyZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIE5vdCBzdXBwb3J0aW5nIGFueSBzcGVjaWFsIGZlYXR1cmVzIHdpbGwgYmUgcmVwb3J0ZWQgd2l0aCBhIHNpbmdsZSBsaW5lLlxuICAgICAgICBpZiAocmVzLmNvZGUgPCA0MDAgJiYgKDAsIHBhcnNlQ29udHJvbFJlc3BvbnNlXzEuaXNNdWx0aWxpbmUpKHJlcy5tZXNzYWdlKSkge1xuICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGFuZCBsYXN0IGxpbmUgd3JhcCB0aGUgbXVsdGlsaW5lIHJlc3BvbnNlLCBpZ25vcmUgdGhlbS5cbiAgICAgICAgICAgIHJlcy5tZXNzYWdlLnNwbGl0KFwiXFxuXCIpLnNsaWNlKDEsIC0xKS5mb3JFYWNoKGxpbmUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEEgdHlwaWNhbCBsaW5lcyBsb29rcyBsaWtlOiBcIiBSRVNUIFNUUkVBTVwiIG9yIFwiIE1EVE1cIi5cbiAgICAgICAgICAgICAgICAvLyBTZXJ2ZXJzIG1pZ2h0IG5vdCB1c2UgYW4gaW5kZW50YXRpb24gdGhvdWdoLlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gbGluZS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzLnNldChlbnRyeVswXSwgZW50cnlbMV0gfHwgXCJcIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgYXN5bmMgY2QocGF0aCkge1xuICAgICAgICBjb25zdCB2YWxpZFBhdGggPSBhd2FpdCB0aGlzLnByb3RlY3RXaGl0ZXNwYWNlKHBhdGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKFwiQ1dEIFwiICsgdmFsaWRQYXRoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3dpdGNoIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICBhc3luYyBjZHVwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKFwiQ0RVUFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgYSBmaWxlLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZXZlcnkgRlRQIHNlcnZlciwgaW4gd2hpY2ggY2FzZVxuICAgICAqIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gICAgICovXG4gICAgYXN5bmMgbGFzdE1vZChwYXRoKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkUGF0aCA9IGF3YWl0IHRoaXMucHJvdGVjdFdoaXRlc3BhY2UocGF0aCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VuZChgTURUTSAke3ZhbGlkUGF0aH1gKTtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHJlcy5tZXNzYWdlLnNsaWNlKDQpO1xuICAgICAgICByZXR1cm4gKDAsIHBhcnNlTGlzdE1MU0RfMS5wYXJzZU1MU3hEYXRlKShkYXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzaXplIG9mIGEgZmlsZS5cbiAgICAgKi9cbiAgICBhc3luYyBzaXplKHBhdGgpIHtcbiAgICAgICAgY29uc3QgdmFsaWRQYXRoID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShwYXRoKTtcbiAgICAgICAgY29uc3QgY29tbWFuZCA9IGBTSVpFICR7dmFsaWRQYXRofWA7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VuZChjb21tYW5kKTtcbiAgICAgICAgLy8gVGhlIHNpemUgaXMgcGFydCBvZiB0aGUgcmVzcG9uc2UgbWVzc2FnZSwgZm9yIGV4YW1wbGU6IFwiMjEzIDU1NTU1NVwiLiBJdCdzXG4gICAgICAgIC8vIHBvc3NpYmxlIHRoYXQgdGhlcmUgaXMgYSBjb21tbWVudGFyeSBhcHBlbmRlZCBsaWtlIFwiMjEzIDU1NTUsIHNvbWUgY29tbWVudGFyeVwiLlxuICAgICAgICBjb25zdCBzaXplID0gcGFyc2VJbnQocmVzLm1lc3NhZ2Uuc2xpY2UoNCksIDEwKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihzaXplKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBwYXJzZSByZXNwb25zZSB0byBjb21tYW5kICcke2NvbW1hbmR9JyBhcyBhIG51bWVyaWNhbCB2YWx1ZTogJHtyZXMubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVuYW1lIGEgZmlsZS5cbiAgICAgKlxuICAgICAqIERlcGVuZGluZyBvbiB0aGUgRlRQIHNlcnZlciB0aGlzIG1pZ2h0IGFsc28gYmUgdXNlZCB0byBtb3ZlIGEgZmlsZSBmcm9tIG9uZVxuICAgICAqIGRpcmVjdG9yeSB0byBhbm90aGVyIGJ5IHByb3ZpZGluZyBmdWxsIHBhdGhzLlxuICAgICAqL1xuICAgIGFzeW5jIHJlbmFtZShzcmNQYXRoLCBkZXN0UGF0aCkge1xuICAgICAgICBjb25zdCB2YWxpZFNyYyA9IGF3YWl0IHRoaXMucHJvdGVjdFdoaXRlc3BhY2Uoc3JjUGF0aCk7XG4gICAgICAgIGNvbnN0IHZhbGlkRGVzdCA9IGF3YWl0IHRoaXMucHJvdGVjdFdoaXRlc3BhY2UoZGVzdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmQoXCJSTkZSIFwiICsgdmFsaWRTcmMpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKFwiUk5UTyBcIiArIHZhbGlkRGVzdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGZpbGUgZnJvbSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gaWdub3JlIEZUUCBlcnJvciByZXR1cm4gY29kZXMgd2hpY2ggd29uJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGUuZy5cbiAgICAgKiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuICAgIGFzeW5jIHJlbW92ZShwYXRoLCBpZ25vcmVFcnJvckNvZGVzID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgdmFsaWRQYXRoID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShwYXRoKTtcbiAgICAgICAgaWYgKGlnbm9yZUVycm9yQ29kZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKGBERUxFICR7dmFsaWRQYXRofWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoYERFTEUgJHt2YWxpZFBhdGh9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlcG9ydCB0cmFuc2ZlciBwcm9ncmVzcyBmb3IgYW55IHVwbG9hZCBvciBkb3dubG9hZCB0byBhIGdpdmVuIGhhbmRsZXIuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxzbyByZXNldCB0aGUgb3ZlcmFsbCB0cmFuc2ZlciBjb3VudGVyIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG11bHRpcGxlIHRyYW5zZmVycy4gWW91IGNhblxuICAgICAqIGFsc28gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aG91dCBhIGhhbmRsZXIgdG8gc3RvcCByZXBvcnRpbmcgdG8gYW4gZWFybGllciBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaGFuZGxlciAgSGFuZGxlciBmdW5jdGlvbiB0byBjYWxsIG9uIHRyYW5zZmVyIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHRyYWNrUHJvZ3Jlc3MoaGFuZGxlcikge1xuICAgICAgICB0aGlzLl9wcm9ncmVzc1RyYWNrZXIuYnl0ZXNPdmVyYWxsID0gMDtcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3NUcmFja2VyLnJlcG9ydFRvKGhhbmRsZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGxvYWQgZGF0YSBmcm9tIGEgcmVhZGFibGUgc3RyZWFtIG9yIGEgbG9jYWwgZmlsZSB0byBhIHJlbW90ZSBmaWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZSAgUmVhZGFibGUgc3RyZWFtIG9yIHBhdGggdG8gYSBsb2NhbCBmaWxlLlxuICAgICAqIEBwYXJhbSB0b1JlbW90ZVBhdGggIFBhdGggdG8gYSByZW1vdGUgZmlsZSB0byB3cml0ZSB0by5cbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWRGcm9tKHNvdXJjZSwgdG9SZW1vdGVQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwbG9hZFdpdGhDb21tYW5kKHNvdXJjZSwgdG9SZW1vdGVQYXRoLCBcIlNUT1JcIiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwbG9hZCBkYXRhIGZyb20gYSByZWFkYWJsZSBzdHJlYW0gb3IgYSBsb2NhbCBmaWxlIGJ5IGFwcGVuZGluZyBpdCB0byBhbiBleGlzdGluZyBmaWxlLiBJZiB0aGUgZmlsZSBkb2Vzbid0XG4gICAgICogZXhpc3QgdGhlIEZUUCBzZXJ2ZXIgc2hvdWxkIGNyZWF0ZSBpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzb3VyY2UgIFJlYWRhYmxlIHN0cmVhbSBvciBwYXRoIHRvIGEgbG9jYWwgZmlsZS5cbiAgICAgKiBAcGFyYW0gdG9SZW1vdGVQYXRoICBQYXRoIHRvIGEgcmVtb3RlIGZpbGUgdG8gd3JpdGUgdG8uXG4gICAgICovXG4gICAgYXN5bmMgYXBwZW5kRnJvbShzb3VyY2UsIHRvUmVtb3RlUGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGxvYWRXaXRoQ29tbWFuZChzb3VyY2UsIHRvUmVtb3RlUGF0aCwgXCJBUFBFXCIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX3VwbG9hZFdpdGhDb21tYW5kKHNvdXJjZSwgcmVtb3RlUGF0aCwgY29tbWFuZCwgb3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VwbG9hZExvY2FsRmlsZShzb3VyY2UsIHJlbW90ZVBhdGgsIGNvbW1hbmQsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl91cGxvYWRGcm9tU3RyZWFtKHNvdXJjZSwgcmVtb3RlUGF0aCwgY29tbWFuZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBfdXBsb2FkTG9jYWxGaWxlKGxvY2FsUGF0aCwgcmVtb3RlUGF0aCwgY29tbWFuZCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBmZCA9IGF3YWl0IGZzT3Blbihsb2NhbFBhdGgsIFwiclwiKTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gKDAsIGZzXzEuY3JlYXRlUmVhZFN0cmVhbSkoXCJcIiwge1xuICAgICAgICAgICAgZmQsXG4gICAgICAgICAgICBzdGFydDogb3B0aW9ucy5sb2NhbFN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBvcHRpb25zLmxvY2FsRW5kSW5jbHVzaXZlLFxuICAgICAgICAgICAgYXV0b0Nsb3NlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91cGxvYWRGcm9tU3RyZWFtKHNvdXJjZSwgcmVtb3RlUGF0aCwgY29tbWFuZCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBpZ25vcmVFcnJvcigoKSA9PiBmc0Nsb3NlKGZkKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGFzeW5jIF91cGxvYWRGcm9tU3RyZWFtKHNvdXJjZSwgcmVtb3RlUGF0aCwgY29tbWFuZCkge1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKGVycikgPT4gdGhpcy5mdHAuY2xvc2VXaXRoRXJyb3IoZXJyKTtcbiAgICAgICAgc291cmNlLm9uY2UoXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkUGF0aCA9IGF3YWl0IHRoaXMucHJvdGVjdFdoaXRlc3BhY2UocmVtb3RlUGF0aCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByZXBhcmVUcmFuc2Zlcih0aGlzLmZ0cCk7XG4gICAgICAgICAgICAvLyBLZWVwIHRoZSBrZXl3b3JkIGBhd2FpdGAgb3IgdGhlIGBmaW5hbGx5YCBjbGF1c2UgYmVsb3cgcnVucyB0b28gZWFybHlcbiAgICAgICAgICAgIC8vIGFuZCByZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5lciBmb3IgdGhlIHNvdXJjZSBzdHJlYW0gdG9vIGVhcmx5LlxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0ICgwLCB0cmFuc2Zlcl8xLnVwbG9hZEZyb20pKHNvdXJjZSwge1xuICAgICAgICAgICAgICAgIGZ0cDogdGhpcy5mdHAsXG4gICAgICAgICAgICAgICAgdHJhY2tlcjogdGhpcy5fcHJvZ3Jlc3NUcmFja2VyLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgcmVtb3RlUGF0aDogdmFsaWRQYXRoLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwidXBsb2FkXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRG93bmxvYWQgYSByZW1vdGUgZmlsZSBhbmQgcGlwZSBpdHMgZGF0YSB0byBhIHdyaXRhYmxlIHN0cmVhbSBvciB0byBhIGxvY2FsIGZpbGUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIG9wdGlvbmFsbHkgZGVmaW5lIGF0IHdoaWNoIHBvc2l0aW9uIG9mIHRoZSByZW1vdGUgZmlsZSB5b3UnZCBsaWtlIHRvIHN0YXJ0XG4gICAgICogZG93bmxvYWRpbmcuIElmIHRoZSBkZXN0aW5hdGlvbiB5b3UgcHJvdmlkZSBpcyBhIGZpbGUsIHRoZSBvZmZzZXQgd2lsbCBiZSBhcHBsaWVkXG4gICAgICogdG8gaXQgYXMgd2VsbC4gRm9yIGV4YW1wbGU6IFRvIHJlc3VtZSBhIGZhaWxlZCBkb3dubG9hZCwgeW91J2QgcmVxdWVzdCB0aGUgc2l6ZSBvZlxuICAgICAqIHRoZSBsb2NhbCwgcGFydGlhbGx5IGRvd25sb2FkZWQgZmlsZSBhbmQgdXNlIHRoYXQgYXMgdGhlIG9mZnNldC4gQXNzdW1pbmcgdGhlIHNpemVcbiAgICAgKiBpcyAyMywgeW91J2QgZG93bmxvYWQgdGhlIHJlc3QgdXNpbmcgYGRvd25sb2FkVG8oXCJsb2NhbC50eHRcIiwgXCJyZW1vdGUudHh0XCIsIDIzKWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gIFN0cmVhbSBvciBwYXRoIGZvciBhIGxvY2FsIGZpbGUgdG8gd3JpdGUgdG8uXG4gICAgICogQHBhcmFtIGZyb21SZW1vdGVQYXRoICBQYXRoIG9mIHRoZSByZW1vdGUgZmlsZSB0byByZWFkIGZyb20uXG4gICAgICogQHBhcmFtIHN0YXJ0QXQgIFBvc2l0aW9uIHdpdGhpbiB0aGUgcmVtb3RlIGZpbGUgdG8gc3RhcnQgZG93bmxvYWRpbmcgYXQuIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBhIGZpbGUsIHRoaXMgb2Zmc2V0IGlzIGFsc28gYXBwbGllZCB0byBpdC5cbiAgICAgKi9cbiAgICBhc3luYyBkb3dubG9hZFRvKGRlc3RpbmF0aW9uLCBmcm9tUmVtb3RlUGF0aCwgc3RhcnRBdCA9IDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkZXN0aW5hdGlvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rvd25sb2FkVG9GaWxlKGRlc3RpbmF0aW9uLCBmcm9tUmVtb3RlUGF0aCwgc3RhcnRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rvd25sb2FkVG9TdHJlYW0oZGVzdGluYXRpb24sIGZyb21SZW1vdGVQYXRoLCBzdGFydEF0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGFzeW5jIF9kb3dubG9hZFRvRmlsZShsb2NhbFBhdGgsIHJlbW90ZVBhdGgsIHN0YXJ0QXQpIHtcbiAgICAgICAgY29uc3QgYXBwZW5kaW5nVG9Mb2NhbEZpbGUgPSBzdGFydEF0ID4gMDtcbiAgICAgICAgY29uc3QgZmlsZVN5c3RlbUZsYWdzID0gYXBwZW5kaW5nVG9Mb2NhbEZpbGUgPyBcInIrXCIgOiBcIndcIjtcbiAgICAgICAgY29uc3QgZmQgPSBhd2FpdCBmc09wZW4obG9jYWxQYXRoLCBmaWxlU3lzdGVtRmxhZ3MpO1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9ICgwLCBmc18xLmNyZWF0ZVdyaXRlU3RyZWFtKShcIlwiLCB7XG4gICAgICAgICAgICBmZCxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydEF0LFxuICAgICAgICAgICAgYXV0b0Nsb3NlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9kb3dubG9hZFRvU3RyZWFtKGRlc3RpbmF0aW9uLCByZW1vdGVQYXRoLCBzdGFydEF0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbEZpbGVTdGF0cyA9IGF3YWl0IGlnbm9yZUVycm9yKCgpID0+IGZzU3RhdChsb2NhbFBhdGgpKTtcbiAgICAgICAgICAgIGNvbnN0IGhhc0Rvd25sb2FkZWREYXRhID0gbG9jYWxGaWxlU3RhdHMgJiYgbG9jYWxGaWxlU3RhdHMuc2l6ZSA+IDA7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRSZW1vdmVMb2NhbEZpbGUgPSAhYXBwZW5kaW5nVG9Mb2NhbEZpbGUgJiYgIWhhc0Rvd25sb2FkZWREYXRhO1xuICAgICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUxvY2FsRmlsZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGlnbm9yZUVycm9yKCgpID0+IGZzVW5saW5rKGxvY2FsUGF0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgYXdhaXQgaWdub3JlRXJyb3IoKCkgPT4gZnNDbG9zZShmZCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBfZG93bmxvYWRUb1N0cmVhbShkZXN0aW5hdGlvbiwgcmVtb3RlUGF0aCwgc3RhcnRBdCkge1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKGVycikgPT4gdGhpcy5mdHAuY2xvc2VXaXRoRXJyb3IoZXJyKTtcbiAgICAgICAgZGVzdGluYXRpb24ub25jZShcImVycm9yXCIsIG9uRXJyb3IpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRQYXRoID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShyZW1vdGVQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVRyYW5zZmVyKHRoaXMuZnRwKTtcbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIGtleXdvcmQgYGF3YWl0YCBvciB0aGUgYGZpbmFsbHlgIGNsYXVzZSBiZWxvdyBydW5zIHRvbyBlYXJseVxuICAgICAgICAgICAgLy8gYW5kIHJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgc291cmNlIHN0cmVhbSB0b28gZWFybHkuXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgKDAsIHRyYW5zZmVyXzEuZG93bmxvYWRUbykoZGVzdGluYXRpb24sIHtcbiAgICAgICAgICAgICAgICBmdHA6IHRoaXMuZnRwLFxuICAgICAgICAgICAgICAgIHRyYWNrZXI6IHRoaXMuX3Byb2dyZXNzVHJhY2tlcixcbiAgICAgICAgICAgICAgICBjb21tYW5kOiBzdGFydEF0ID4gMCA/IGBSRVNUICR7c3RhcnRBdH1gIDogYFJFVFIgJHt2YWxpZFBhdGh9YCxcbiAgICAgICAgICAgICAgICByZW1vdGVQYXRoOiB2YWxpZFBhdGgsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJkb3dubG9hZFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcik7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IGZpbGVzIGFuZCBkaXJlY3RvcmllcyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgZnJvbSBgcGF0aGAgaWYgc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIFtwYXRoXSAgUGF0aCB0byByZW1vdGUgZmlsZSBvciBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgYXN5bmMgbGlzdChwYXRoID0gXCJcIikge1xuICAgICAgICBjb25zdCB2YWxpZFBhdGggPSBhd2FpdCB0aGlzLnByb3RlY3RXaGl0ZXNwYWNlKHBhdGgpO1xuICAgICAgICBsZXQgbGFzdEVycm9yO1xuICAgICAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiB0aGlzLmF2YWlsYWJsZUxpc3RDb21tYW5kcykge1xuICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9IHZhbGlkUGF0aCA9PT0gXCJcIiA/IGNhbmRpZGF0ZSA6IGAke2NhbmRpZGF0ZX0gJHt2YWxpZFBhdGh9YDtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVRyYW5zZmVyKHRoaXMuZnRwKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkTGlzdCA9IGF3YWl0IHRoaXMuX3JlcXVlc3RMaXN0V2l0aENvbW1hbmQoY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHN1Y2Nlc3NmdWwgY2FuZGlkYXRlIGZvciBhbGwgc3Vic2VxdWVudCByZXF1ZXN0cy5cbiAgICAgICAgICAgICAgICB0aGlzLmF2YWlsYWJsZUxpc3RDb21tYW5kcyA9IFtjYW5kaWRhdGVdO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRMaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZFRyeU5leHQgPSBlcnIgaW5zdGFuY2VvZiBGdHBDb250ZXh0XzEuRlRQRXJyb3I7XG4gICAgICAgICAgICAgICAgaWYgKCFzaG91bGRUcnlOZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFzdEVycm9yID0gZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IGxhc3RFcnJvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGFzeW5jIF9yZXF1ZXN0TGlzdFdpdGhDb21tYW5kKGNvbW1hbmQpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFN0cmluZ1dyaXRlcl8xLlN0cmluZ1dyaXRlcigpO1xuICAgICAgICBhd2FpdCAoMCwgdHJhbnNmZXJfMS5kb3dubG9hZFRvKShidWZmZXIsIHtcbiAgICAgICAgICAgIGZ0cDogdGhpcy5mdHAsXG4gICAgICAgICAgICB0cmFja2VyOiB0aGlzLl9wcm9ncmVzc1RyYWNrZXIsXG4gICAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgICAgcmVtb3RlUGF0aDogXCJcIixcbiAgICAgICAgICAgIHR5cGU6IFwibGlzdFwiXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0ZXh0ID0gYnVmZmVyLmdldFRleHQodGhpcy5mdHAuZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmZ0cC5sb2codGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlTGlzdCh0ZXh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZGlyZWN0b3J5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVtb3RlRGlyUGF0aCAgVGhlIHBhdGggb2YgdGhlIHJlbW90ZSBkaXJlY3RvcnkgdG8gZGVsZXRlLlxuICAgICAqIEBleGFtcGxlIGNsaWVudC5yZW1vdmVEaXIoXCJmb29cIikgLy8gUmVtb3ZlIGRpcmVjdG9yeSAnZm9vJyB1c2luZyBhIHJlbGF0aXZlIHBhdGguXG4gICAgICogQGV4YW1wbGUgY2xpZW50LnJlbW92ZURpcihcImZvby9iYXJcIikgLy8gUmVtb3ZlIGRpcmVjdG9yeSAnYmFyJyB1c2luZyBhIHJlbGF0aXZlIHBhdGguXG4gICAgICogQGV4YW1wbGUgY2xpZW50LnJlbW92ZURpcihcIi9mb28vYmFyXCIpIC8vIFJlbW92ZSBkaXJlY3RvcnkgJ2JhcicgdXNpbmcgYW4gYWJzb2x1dGUgcGF0aC5cbiAgICAgKiBAZXhhbXBsZSBjbGllbnQucmVtb3ZlRGlyKFwiL1wiKSAvLyBSZW1vdmUgZXZlcnl0aGluZy5cbiAgICAgKi9cbiAgICBhc3luYyByZW1vdmVEaXIocmVtb3RlRGlyUGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhpdEF0Q3VycmVudERpcmVjdG9yeShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNkKHJlbW90ZURpclBhdGgpO1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSB0YXJnZXQgYmVjYXVzZSByZW1vdGVEaXJQYXRoIG1pZ2h0IGJlIGEgcmVsYXRpdmUgcGF0aCwgZXZlbiBgLi4vYCBpcyBwb3NzaWJsZS5cbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlRGlyUGF0aCA9IGF3YWl0IHRoaXMucHdkKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFyV29ya2luZ0RpcigpO1xuICAgICAgICAgICAgY29uc3QgZGlySXNSb290ID0gYWJzb2x1dGVEaXJQYXRoID09PSBcIi9cIjtcbiAgICAgICAgICAgIGlmICghZGlySXNSb290KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZHVwKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVFbXB0eURpcihhYnNvbHV0ZURpclBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdpdGhvdXQgcmVtb3ZpbmdcbiAgICAgKiB0aGUgd29ya2luZyBkaXJlY3RvcnkgaXRzZWxmLlxuICAgICAqL1xuICAgIGFzeW5jIGNsZWFyV29ya2luZ0RpcigpIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHRoaXMubGlzdCgpKSB7XG4gICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2QoZmlsZS5uYW1lKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFyV29ya2luZ0RpcigpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2R1cCgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlRW1wdHlEaXIoZmlsZS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlKGZpbGUubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBsb2FkIHRoZSBjb250ZW50cyBvZiBhIGxvY2FsIGRpcmVjdG9yeSB0byB0aGUgcmVtb3RlIHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWVzIGFuZCByZXVzZSBleGlzdGluZyBkaXJlY3Rvcmllcy5cbiAgICAgKiBVbnJlbGF0ZWQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHdpbGwgcmVtYWluIHVudG91Y2hlZC4gWW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYSBgcmVtb3RlRGlyUGF0aGBcbiAgICAgKiB0byBwdXQgdGhlIGNvbnRlbnRzIGluc2lkZSBhIGRpcmVjdG9yeSB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5IGluY2x1ZGluZyBhbGxcbiAgICAgKiBpbnRlcm1lZGlhdGUgZGlyZWN0b3JpZXMuIElmIHlvdSBkaWQgcHJvdmlkZSBhIHJlbW90ZURpclBhdGggdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdpbGwgc3RheVxuICAgICAqIHRoZSBzYW1lIGFzIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvY2FsRGlyUGF0aCAgTG9jYWwgcGF0aCwgZS5nLiBcImZvby9iYXJcIiBvciBcIi4uL3Rlc3RcIlxuICAgICAqIEBwYXJhbSBbcmVtb3RlRGlyUGF0aF0gIFJlbW90ZSBwYXRoIG9mIGEgZGlyZWN0b3J5IHRvIHVwbG9hZCB0by4gV29ya2luZyBkaXJlY3RvcnkgaWYgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZEZyb21EaXIobG9jYWxEaXJQYXRoLCByZW1vdGVEaXJQYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGl0QXRDdXJyZW50RGlyZWN0b3J5KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZW1vdGVEaXJQYXRoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVEaXIocmVtb3RlRGlyUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXBsb2FkVG9Xb3JraW5nRGlyKGxvY2FsRGlyUGF0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX3VwbG9hZFRvV29ya2luZ0Rpcihsb2NhbERpclBhdGgpIHtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmc1JlYWREaXIobG9jYWxEaXJQYXRoKTtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9ICgwLCBwYXRoXzEuam9pbikobG9jYWxEaXJQYXRoLCBmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnNTdGF0KGZ1bGxQYXRoKTtcbiAgICAgICAgICAgIGlmIChzdGF0cy5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBsb2FkRnJvbShmdWxsUGF0aCwgZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3BlbkRpcihmaWxlKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl91cGxvYWRUb1dvcmtpbmdEaXIoZnVsbFBhdGgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2R1cCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERvd25sb2FkIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgb2YgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIGEgbG9jYWwgZGlyZWN0b3J5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvY2FsRGlyUGF0aCAgVGhlIGxvY2FsIGRpcmVjdG9yeSB0byBkb3dubG9hZCB0by5cbiAgICAgKiBAcGFyYW0gcmVtb3RlRGlyUGF0aCAgUmVtb3RlIGRpcmVjdG9yeSB0byBkb3dubG9hZC4gQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpZiBub3Qgc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIGFzeW5jIGRvd25sb2FkVG9EaXIobG9jYWxEaXJQYXRoLCByZW1vdGVEaXJQYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGl0QXRDdXJyZW50RGlyZWN0b3J5KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZW1vdGVEaXJQYXRoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZChyZW1vdGVEaXJQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9kb3dubG9hZEZyb21Xb3JraW5nRGlyKGxvY2FsRGlyUGF0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX2Rvd25sb2FkRnJvbVdvcmtpbmdEaXIobG9jYWxEaXJQYXRoKSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZUxvY2FsRGlyZWN0b3J5KGxvY2FsRGlyUGF0aCk7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCB0aGlzLmxpc3QoKSkge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxQYXRoID0gKDAsIHBhdGhfMS5qb2luKShsb2NhbERpclBhdGgsIGZpbGUubmFtZSk7XG4gICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2QoZmlsZS5uYW1lKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kb3dubG9hZEZyb21Xb3JraW5nRGlyKGxvY2FsUGF0aCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZHVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChmaWxlLmlzRmlsZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZG93bmxvYWRUbyhsb2NhbFBhdGgsIGZpbGUubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZSBzdXJlIGEgZ2l2ZW4gcmVtb3RlIHBhdGggZXhpc3RzLCBjcmVhdGluZyBhbGwgZGlyZWN0b3JpZXMgYXMgbmVjZXNzYXJ5LlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjaGFuZ2VzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBnaXZlbiBwYXRoLlxuICAgICAqL1xuICAgIGFzeW5jIGVuc3VyZURpcihyZW1vdGVEaXJQYXRoKSB7XG4gICAgICAgIC8vIElmIHRoZSByZW1vdGVEaXJQYXRoIHdhcyBhYnNvbHV0ZSBnbyB0byByb290IGRpcmVjdG9yeS5cbiAgICAgICAgaWYgKHJlbW90ZURpclBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2QoXCIvXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hbWVzID0gcmVtb3RlRGlyUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKG5hbWUgPT4gbmFtZSAhPT0gXCJcIik7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3BlbkRpcihuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcnkgdG8gY3JlYXRlIGEgZGlyZWN0b3J5IGFuZCBlbnRlciBpdC4gVGhpcyB3aWxsIG5vdCByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGRpcmVjdG9yeVxuICAgICAqIGNvdWxkbid0IGJlIGNyZWF0ZWQgaWYgZm9yIGV4YW1wbGUgaXQgYWxyZWFkeSBleGlzdHMuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGFzeW5jIF9vcGVuRGlyKGRpck5hbWUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kSWdub3JpbmdFcnJvcihcIk1LRCBcIiArIGRpck5hbWUpO1xuICAgICAgICBhd2FpdCB0aGlzLmNkKGRpck5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYW4gZW1wdHkgZGlyZWN0b3J5LCB3aWxsIGZhaWwgaWYgbm90IGVtcHR5LlxuICAgICAqL1xuICAgIGFzeW5jIHJlbW92ZUVtcHR5RGlyKHBhdGgpIHtcbiAgICAgICAgY29uc3QgdmFsaWRQYXRoID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShwYXRoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZChgUk1EICR7dmFsaWRQYXRofWApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGVFAgc2VydmVycyBjYW4ndCBoYW5kbGUgZmlsZW5hbWVzIHRoYXQgaGF2ZSBsZWFkaW5nIHdoaXRlc3BhY2UuIFRoaXMgbWV0aG9kIHRyYW5zZm9ybXNcbiAgICAgKiBhIGdpdmVuIHBhdGggdG8gZml4IHRoYXQgaXNzdWUgZm9yIG1vc3QgY2FzZXMuXG4gICAgICovXG4gICAgYXN5bmMgcHJvdGVjdFdoaXRlc3BhY2UocGF0aCkge1xuICAgICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChcIiBcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSBsZWFkaW5nIHdoaXRlc3BhY2UgYnkgcHJlcGVuZGluZyB0aGUgYWJzb2x1dGUgcGF0aDpcbiAgICAgICAgLy8gXCIgdGVzdC50eHRcIiB3aGlsZSBiZWluZyBpbiB0aGUgcm9vdCBkaXJlY3RvcnkgYmVjb21lcyBcIi8gdGVzdC50eHRcIi5cbiAgICAgICAgY29uc3QgcHdkID0gYXdhaXQgdGhpcy5wd2QoKTtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoUHJlZml4ID0gcHdkLmVuZHNXaXRoKFwiL1wiKSA/IHB3ZCA6IHB3ZCArIFwiL1wiO1xuICAgICAgICByZXR1cm4gYWJzb2x1dGVQYXRoUHJlZml4ICsgcGF0aDtcbiAgICB9XG4gICAgYXN5bmMgX2V4aXRBdEN1cnJlbnREaXJlY3RvcnkoZnVuYykge1xuICAgICAgICBjb25zdCB1c2VyRGlyID0gYXdhaXQgdGhpcy5wd2QoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmdW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaWdub3JlRXJyb3IoKCkgPT4gdGhpcy5jZCh1c2VyRGlyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJ5IGFsbCBhdmFpbGFibGUgdHJhbnNmZXIgc3RyYXRlZ2llcyBhbmQgcGljayB0aGUgZmlyc3Qgb25lIHRoYXQgd29ya3MuIFVwZGF0ZSBgY2xpZW50YCB0b1xuICAgICAqIHVzZSB0aGUgd29ya2luZyBzdHJhdGVneSBmb3IgYWxsIHN1Y2Nlc3NpdmUgdHJhbnNmZXIgcmVxdWVzdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCB0cnkgdGhlIHByb3ZpZGVkIHN0cmF0ZWdpZXMuXG4gICAgICovXG4gICAgX2VudGVyRmlyc3RDb21wYXRpYmxlTW9kZShzdHJhdGVnaWVzKSB7XG4gICAgICAgIHJldHVybiBhc3luYyAoZnRwKSA9PiB7XG4gICAgICAgICAgICBmdHAubG9nKFwiVHJ5aW5nIHRvIGZpbmQgb3B0aW1hbCB0cmFuc2ZlciBzdHJhdGVneS4uLlwiKTtcbiAgICAgICAgICAgIGxldCBsYXN0RXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0cmF0ZWd5IG9mIHN0cmF0ZWdpZXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzdHJhdGVneShmdHApO1xuICAgICAgICAgICAgICAgICAgICBmdHAubG9nKFwiT3B0aW1hbCB0cmFuc2ZlciBzdHJhdGVneSBmb3VuZC5cIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJlcGFyZVRyYW5zZmVyID0gc3RyYXRlZ3k7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0aGUgbmV4dCBjYW5kaWRhdGUgbm8gbWF0dGVyIHRoZSBleGFjdCBlcnJvci4gSXQncyBwb3NzaWJsZSB0aGF0IGEgc2VydmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFuc3dlcmVkIGluY29ycmVjdGx5IHRvIGEgc3RyYXRlZ3ksIGZvciBleGFtcGxlIGEgUEFTViBhbnN3ZXIgdG8gYW4gRVBTVi5cbiAgICAgICAgICAgICAgICAgICAgbGFzdEVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9uZSBvZiB0aGUgYXZhaWxhYmxlIHRyYW5zZmVyIHN0cmF0ZWdpZXMgd29yay4gTGFzdCBlcnJvciByZXNwb25zZSB3YXMgJyR7bGFzdEVycm9yfScuYCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERFUFJFQ0FURUQsIHVzZSBgdXBsb2FkRnJvbWAuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWQoc291cmNlLCB0b1JlbW90ZVBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmZ0cC5sb2coXCJXYXJuaW5nOiB1cGxvYWQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCB1c2UgdXBsb2FkRnJvbSgpLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkRnJvbShzb3VyY2UsIHRvUmVtb3RlUGF0aCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERFUFJFQ0FURUQsIHVzZSBgYXBwZW5kRnJvbWAuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBhcHBlbmQoc291cmNlLCB0b1JlbW90ZVBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmZ0cC5sb2coXCJXYXJuaW5nOiBhcHBlbmQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCB1c2UgYXBwZW5kRnJvbSgpLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwZW5kRnJvbShzb3VyY2UsIHRvUmVtb3RlUGF0aCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERFUFJFQ0FURUQsIHVzZSBgZG93bmxvYWRUb2AuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBkb3dubG9hZChkZXN0aW5hdGlvbiwgZnJvbVJlbW90ZVBhdGgsIHN0YXJ0QXQgPSAwKSB7XG4gICAgICAgIHRoaXMuZnRwLmxvZyhcIldhcm5pbmc6IGRvd25sb2FkKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgdXNlIGRvd25sb2FkVG8oKS5cIik7XG4gICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkVG8oZGVzdGluYXRpb24sIGZyb21SZW1vdGVQYXRoLCBzdGFydEF0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRCwgdXNlIGB1cGxvYWRGcm9tRGlyYC5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZERpcihsb2NhbERpclBhdGgsIHJlbW90ZURpclBhdGgpIHtcbiAgICAgICAgdGhpcy5mdHAubG9nKFwiV2FybmluZzogdXBsb2FkRGlyKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgdXNlIHVwbG9hZEZyb21EaXIoKS5cIik7XG4gICAgICAgIHJldHVybiB0aGlzLnVwbG9hZEZyb21EaXIobG9jYWxEaXJQYXRoLCByZW1vdGVEaXJQYXRoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRCwgdXNlIGBkb3dubG9hZFRvRGlyYC5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFzeW5jIGRvd25sb2FkRGlyKGxvY2FsRGlyUGF0aCkge1xuICAgICAgICB0aGlzLmZ0cC5sb2coXCJXYXJuaW5nOiBkb3dubG9hZERpcigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHVzZSBkb3dubG9hZFRvRGlyKCkuXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZFRvRGlyKGxvY2FsRGlyUGF0aCk7XG4gICAgfVxufVxuZXhwb3J0cy5DbGllbnQgPSBDbGllbnQ7XG5hc3luYyBmdW5jdGlvbiBlbnN1cmVMb2NhbERpcmVjdG9yeShwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnNTdGF0KHBhdGgpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGF3YWl0IGZzTWtEaXIocGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxufVxuYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3IoZnVuYykge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmdW5jKCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gSWdub3JlXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkZpbGVJbmZvID0gZXhwb3J0cy5GaWxlVHlwZSA9IHZvaWQgMDtcbnZhciBGaWxlVHlwZTtcbihmdW5jdGlvbiAoRmlsZVR5cGUpIHtcbiAgICBGaWxlVHlwZVtGaWxlVHlwZVtcIlVua25vd25cIl0gPSAwXSA9IFwiVW5rbm93blwiO1xuICAgIEZpbGVUeXBlW0ZpbGVUeXBlW1wiRmlsZVwiXSA9IDFdID0gXCJGaWxlXCI7XG4gICAgRmlsZVR5cGVbRmlsZVR5cGVbXCJEaXJlY3RvcnlcIl0gPSAyXSA9IFwiRGlyZWN0b3J5XCI7XG4gICAgRmlsZVR5cGVbRmlsZVR5cGVbXCJTeW1ib2xpY0xpbmtcIl0gPSAzXSA9IFwiU3ltYm9saWNMaW5rXCI7XG59KShGaWxlVHlwZSB8fCAoZXhwb3J0cy5GaWxlVHlwZSA9IEZpbGVUeXBlID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIGEgZmlsZSwgZGlyZWN0b3J5IG9yIHN5bWJvbGljIGxpbmsuXG4gKi9cbmNsYXNzIEZpbGVJbmZvIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudHlwZSA9IEZpbGVUeXBlLlVua25vd247XG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbnBhcnNlZCwgcmF3IG1vZGlmaWNhdGlvbiBkYXRlIGFzIGEgc3RyaW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiBJZiBgbW9kaWZpZWRBdGAgaXMgdW5kZWZpbmVkLCB0aGUgRlRQIHNlcnZlciB5b3UncmUgY29ubmVjdGVkIHRvIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbW9yZSBtb2Rlcm5cbiAgICAgICAgICogTUxTRCBjb21tYW5kIGZvciBtYWNoaW5lLXJlYWRhYmxlIGRpcmVjdG9yeSBsaXN0aW5ncy4gVGhlIG9sZGVyIGNvbW1hbmQgTElTVCBpcyB0aGVuIHVzZWQgcmV0dXJuaW5nXG4gICAgICAgICAqIHJlc3VsdHMgdGhhdCB2YXJ5IGEgbG90IGJldHdlZW4gc2VydmVycyBhcyB0aGUgZm9ybWF0IGhhc24ndCBiZWVuIHN0YW5kYXJkaXplZC4gSGVyZSwgZGlyZWN0b3J5IGxpc3RpbmdzXG4gICAgICAgICAqIGFuZCBlc3BlY2lhbGx5IG1vZGlmaWNhdGlvbiBkYXRlcyB3ZXJlIG1lYW50IHRvIGJlIGh1bWFuLXJlYWRhYmxlIGZpcnN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBCZSBjYXJlZnVsIHdoZW4gc3RpbGwgdHJ5aW5nIHRvIHBhcnNlIHRoaXMgYnkgeW91cnNlbGYuIFBhcnNpbmcgZGF0ZXMgZnJvbSBsaXN0aW5ncyB1c2luZyBMSVNUIGlzXG4gICAgICAgICAqIHVucmVsaWFibGUuIFRoaXMgbGlicmFyeSBkZWNpZGVzIHRvIG9mZmVyIHBhcnNlZCBkYXRlcyBvbmx5IHdoZW4gdGhleSdyZSBhYnNvbHV0ZWx5IHJlbGlhYmxlIGFuZCBzYWZlIHRvXG4gICAgICAgICAqIHVzZSBlLmcuIGZvciBjb21wYXJpc29ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmF3TW9kaWZpZWRBdCA9IFwiXCI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYXJzZWQgbW9kaWZpY2F0aW9uIGRhdGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEF2YWlsYWJsZSBpZiB0aGUgRlRQIHNlcnZlciBzdXBwb3J0cyB0aGUgTUxTRCBjb21tYW5kLiBPbmx5IE1MU0QgZ3VhcmFudGVlcyBkYXRlcyB0aGFuIGNhbiBiZSByZWxpYWJseVxuICAgICAgICAgKiBwYXJzZWQgd2l0aCB0aGUgY29ycmVjdCB0aW1lem9uZSBhbmQgYSByZXNvbHV0aW9uIGRvd24gdG8gc2Vjb25kcy4gU2VlIGByYXdNb2RpZmllZEF0YCBwcm9wZXJ0eSBmb3IgdGhlIHVucGFyc2VkXG4gICAgICAgICAqIGRhdGUgdGhhdCBpcyBhbHdheXMgYXZhaWxhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tb2RpZmllZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogVW5peCBwZXJtaXNzaW9ucyBpZiBwcmVzZW50LiBJZiB0aGUgdW5kZXJseWluZyBGVFAgc2VydmVyIGlzIG5vdCBydW5uaW5nIG9uIFVuaXggdGhpcyB3aWxsIGJlIHVuZGVmaW5lZC5cbiAgICAgICAgICogSWYgc2V0LCB5b3UgbWlnaHQgYmUgYWJsZSB0byBlZGl0IHBlcm1pc3Npb25zIHdpdGggdGhlIEZUUCBjb21tYW5kIGBTSVRFIENITU9EYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYXJkIGxpbmsgY291bnQgaWYgYXZhaWxhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oYXJkTGlua0NvdW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogTGluayBuYW1lIGZvciBzeW1ib2xpYyBsaW5rcyBpZiBhdmFpbGFibGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxpbmsgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbml4IGdyb3VwIGlmIGF2YWlsYWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ3JvdXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbml4IHVzZXIgaWYgYXZhaWxhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51c2VyID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogVW5pcXVlIElEIGlmIGF2YWlsYWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudW5pcXVlSUQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIGdldCBpc0RpcmVjdG9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gRmlsZVR5cGUuRGlyZWN0b3J5O1xuICAgIH1cbiAgICBnZXQgaXNTeW1ib2xpY0xpbmsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09IEZpbGVUeXBlLlN5bWJvbGljTGluaztcbiAgICB9XG4gICAgZ2V0IGlzRmlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gRmlsZVR5cGUuRmlsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCwgbGVnYWN5IEFQSS4gVXNlIGByYXdNb2RpZmllZEF0YCBpbnN0ZWFkLlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZ2V0IGRhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhd01vZGlmaWVkQXQ7XG4gICAgfVxuICAgIHNldCBkYXRlKHJhd01vZGlmaWVkQXQpIHtcbiAgICAgICAgdGhpcy5yYXdNb2RpZmllZEF0ID0gcmF3TW9kaWZpZWRBdDtcbiAgICB9XG59XG5leHBvcnRzLkZpbGVJbmZvID0gRmlsZUluZm87XG5GaWxlSW5mby5Vbml4UGVybWlzc2lvbiA9IHtcbiAgICBSZWFkOiA0LFxuICAgIFdyaXRlOiAyLFxuICAgIEV4ZWN1dGU6IDFcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRlRQQ29udGV4dCA9IGV4cG9ydHMuRlRQRXJyb3IgPSB2b2lkIDA7XG5jb25zdCBuZXRfMSA9IHJlcXVpcmUoXCJuZXRcIik7XG5jb25zdCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xID0gcmVxdWlyZShcIi4vcGFyc2VDb250cm9sUmVzcG9uc2VcIik7XG4vKipcbiAqIERlc2NyaWJlcyBhbiBGVFAgc2VydmVyIGVycm9yIHJlc3BvbnNlIGluY2x1ZGluZyB0aGUgRlRQIHJlc3BvbnNlIGNvZGUuXG4gKi9cbmNsYXNzIEZUUEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHJlcykge1xuICAgICAgICBzdXBlcihyZXMubWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgdGhpcy5jb2RlID0gcmVzLmNvZGU7XG4gICAgfVxufVxuZXhwb3J0cy5GVFBFcnJvciA9IEZUUEVycm9yO1xuZnVuY3Rpb24gZG9Ob3RoaW5nKCkge1xuICAgIC8qKiBEbyBub3RoaW5nICovXG59XG4vKipcbiAqIEZUUENvbnRleHQgaG9sZHMgdGhlIGNvbnRyb2wgYW5kIGRhdGEgc29ja2V0cyBvZiBhbiBGVFAgY29ubmVjdGlvbiBhbmQgcHJvdmlkZXMgYVxuICogc2ltcGxpZmllZCB3YXkgdG8gaW50ZXJhY3Qgd2l0aCBhbiBGVFAgc2VydmVyLCBoYW5kbGUgcmVzcG9uc2VzLCBlcnJvcnMgYW5kIHRpbWVvdXRzLlxuICpcbiAqIEl0IGRvZXNuJ3QgaW1wbGVtZW50IG9yIHVzZSBhbnkgRlRQIGNvbW1hbmRzLiBJdCdzIG9ubHkgYSBmb3VuZGF0aW9uIHRvIG1ha2Ugd3JpdGluZyBhbiBGVFBcbiAqIGNsaWVudCBhcyBlYXN5IGFzIHBvc3NpYmxlLiBZb3Ugd29uJ3QgdXN1YWxseSBpbnN0YW50aWF0ZSB0aGlzLCBidXQgdXNlIGBDbGllbnRgLlxuICovXG5jbGFzcyBGVFBDb250ZXh0IHtcbiAgICAvKipcbiAgICAgKiBJbnN0YW50aWF0ZSBhbiBGVFAgY29udGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aW1lb3V0IC0gVGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gYXBwbHkgdG8gY29udHJvbCBhbmQgZGF0YSBjb25uZWN0aW9ucy4gVXNlIDAgZm9yIG5vIHRpbWVvdXQuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIC0gRW5jb2RpbmcgdG8gdXNlIGZvciBjb250cm9sIGNvbm5lY3Rpb24uIFVURi04IGJ5IGRlZmF1bHQuIFVzZSBcImxhdGluMVwiIGZvciBvbGRlciBzZXJ2ZXJzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHRpbWVvdXQgPSAwLCBlbmNvZGluZyA9IFwidXRmOFwiKSB7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgIC8qKiBEZWJ1Zy1sZXZlbCBsb2dnaW5nIG9mIGFsbCBzb2NrZXQgY29tbXVuaWNhdGlvbi4gKi9cbiAgICAgICAgdGhpcy52ZXJib3NlID0gZmFsc2U7XG4gICAgICAgIC8qKiBJUCB2ZXJzaW9uIHRvIHByZWZlciAoNDogSVB2NCwgNjogSVB2NiwgdW5kZWZpbmVkOiBhdXRvbWF0aWMpLiAqL1xuICAgICAgICB0aGlzLmlwRmFtaWx5ID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogT3B0aW9ucyBmb3IgVExTIGNvbm5lY3Rpb25zLiAqL1xuICAgICAgICB0aGlzLnRsc09wdGlvbnMgPSB7fTtcbiAgICAgICAgLyoqIEEgbXVsdGlsaW5lIHJlc3BvbnNlIG1pZ2h0IGJlIHJlY2VpdmVkIGFzIG11bHRpcGxlIGNodW5rcy4gKi9cbiAgICAgICAgdGhpcy5fcGFydGlhbFJlc3BvbnNlID0gXCJcIjtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgLy8gSGVscCBUeXBlc2NyaXB0IHVuZGVyc3RhbmQgdGhhdCB3ZSBkbyBpbmRlZWQgc2V0IF9zb2NrZXQgaW4gdGhlIGNvbnN0cnVjdG9yIGJ1dCB1c2UgdGhlIHNldHRlciBtZXRob2QgdG8gZG8gc28uXG4gICAgICAgIHRoaXMuX3NvY2tldCA9IHRoaXMuc29ja2V0ID0gdGhpcy5fbmV3U29ja2V0KCk7XG4gICAgICAgIHRoaXMuX2RhdGFTb2NrZXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjb250ZXh0LlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICAvLyBJbnRlcm5hbGx5LCBjbG9zaW5nIGEgY29udGV4dCBpcyBhbHdheXMgZGVzY3JpYmVkIHdpdGggYW4gZXJyb3IuIElmIHRoZXJlIGlzIHN0aWxsIGEgdGFzayBydW5uaW5nLCBpdCB3aWxsXG4gICAgICAgIC8vIGFib3J0IHdpdGggYW4gZXhjZXB0aW9uIHRoYXQgdGhlIHVzZXIgY2xvc2VkIHRoZSBjbGllbnQgZHVyaW5nIGEgdGFzay4gSWYgbm8gdGFzayBpcyBydW5uaW5nLCBubyBleGNlcHRpb24gaXNcbiAgICAgICAgLy8gdGhyb3duIGJ1dCBhbGwgbmV3bHkgc3VibWl0dGVkIHRhc2tzIGFmdGVyIHRoYXQgd2lsbCBhYm9ydCB0aGUgZXhjZXB0aW9uIHRoYXQgdGhlIGNsaWVudCBoYXMgYmVlbiBjbG9zZWQuXG4gICAgICAgIC8vIEluIGFkZGl0aW9uIHRoZSB1c2VyIHdpbGwgZ2V0IGEgc3RhY2sgdHJhY2UgcG9pbnRpbmcgdG8gd2hlcmUgZXhhY3RseSB0aGUgY2xpZW50IGhhcyBiZWVuIGNsb3NlZC4gU28gaW4gYW55XG4gICAgICAgIC8vIGNhc2UgdXNlIF9jbG9zaW5nRXJyb3IgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBjb250ZXh0IGlzIGNsb3NlZC4gVGhpcyBhbHNvIGFsbG93cyB1cyB0byBoYXZlIGEgc2luZ2xlIGNvZGUtcGF0aFxuICAgICAgICAvLyBmb3IgY2xvc2luZyBhIGNvbnRleHQgbWFraW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBlYXNpZXIuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl90YXNrID8gXCJVc2VyIGNsb3NlZCBjbGllbnQgZHVyaW5nIHRhc2tcIiA6IFwiVXNlciBjbG9zZWQgY2xpZW50XCI7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihlcnIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgY29udGV4dCB3aXRoIGFuIGVycm9yLlxuICAgICAqL1xuICAgIGNsb3NlV2l0aEVycm9yKGVycikge1xuICAgICAgICAvLyBJZiB0aGlzIGNvbnRleHQgYWxyZWFkeSBoYXMgYmVlbiBjbG9zZWQsIGRvbid0IG92ZXJ3cml0ZSB0aGUgcmVhc29uLlxuICAgICAgICBpZiAodGhpcy5fY2xvc2luZ0Vycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2xvc2luZ0Vycm9yID0gZXJyO1xuICAgICAgICAvLyBDbG9zZSB0aGUgc29ja2V0cyBidXQgZG9uJ3QgZnVsbHkgcmVzZXQgdGhpcyBjb250ZXh0IHRvIHByZXNlcnZlIGB0aGlzLl9jbG9zaW5nRXJyb3JgLlxuICAgICAgICB0aGlzLl9jbG9zZUNvbnRyb2xTb2NrZXQoKTtcbiAgICAgICAgdGhpcy5fY2xvc2VTb2NrZXQodGhpcy5fZGF0YVNvY2tldCk7XG4gICAgICAgIC8vIEdpdmUgdGhlIHVzZXIncyB0YXNrIGEgY2hhbmNlIHRvIHJlYWN0LCBtYXliZSBjbGVhbnVwIHJlc291cmNlcy5cbiAgICAgICAgdGhpcy5fcGFzc1RvSGFuZGxlcihlcnIpO1xuICAgICAgICAvLyBUaGUgdGFzayBtaWdodCBub3QgaGF2ZSBiZWVuIHJlamVjdGVkIGJ5IHRoZSB1c2VyIGFmdGVyIHJlY2VpdmluZyB0aGUgZXJyb3IuXG4gICAgICAgIHRoaXMuX3N0b3BUcmFja2luZ1Rhc2soKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29udGV4dCBoYXMgYmVlbiBjbG9zZWQgb3IgaGFzbid0IGJlZW4gY29ubmVjdGVkIHlldC4gWW91IGNhbiByZW9wZW4gaXQgd2l0aCBgYWNjZXNzYC5cbiAgICAgKi9cbiAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXQucmVtb3RlQWRkcmVzcyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX2Nsb3NpbmdFcnJvciAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldCB0aGlzIGNvbnRleCBhbmQgYWxsIG9mIGl0cyBzdGF0ZS5cbiAgICAgKi9cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSB0aGlzLl9uZXdTb2NrZXQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBGVFAgY29udHJvbCBzb2NrZXQuXG4gICAgICovXG4gICAgZ2V0IHNvY2tldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvY2tldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzb2NrZXQgZm9yIHRoZSBjb250cm9sIGNvbm5lY3Rpb24uIFRoaXMgd2lsbCBvbmx5IGNsb3NlIHRoZSBjdXJyZW50IGNvbnRyb2wgc29ja2V0XG4gICAgICogaWYgdGhlIG5ldyBvbmUgaXMgbm90IGFuIHVwZ3JhZGUgdG8gdGhlIGN1cnJlbnQgb25lLlxuICAgICAqL1xuICAgIHNldCBzb2NrZXQoc29ja2V0KSB7XG4gICAgICAgIC8vIE5vIGRhdGEgc29ja2V0IHNob3VsZCBiZSBvcGVuIGluIGFueSBjYXNlIHdoZXJlIHRoZSBjb250cm9sIHNvY2tldCBpcyBzZXQgb3IgdXBncmFkZWQuXG4gICAgICAgIHRoaXMuZGF0YVNvY2tldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gVGhpcyBiZWluZyBhIHJlc2V0LCByZXNldCBhbnkgb3RoZXIgc3RhdGUgYXBhcnQgZnJvbSB0aGUgc29ja2V0LlxuICAgICAgICB0aGlzLnRsc09wdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5fcGFydGlhbFJlc3BvbnNlID0gXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2tldCkge1xuICAgICAgICAgICAgY29uc3QgbmV3U29ja2V0VXBncmFkZXNFeGlzdGluZyA9IHNvY2tldC5sb2NhbFBvcnQgPT09IHRoaXMuX3NvY2tldC5sb2NhbFBvcnQ7XG4gICAgICAgICAgICBpZiAobmV3U29ja2V0VXBncmFkZXNFeGlzdGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVNvY2tldExpc3RlbmVycyh0aGlzLnNvY2tldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZUNvbnRyb2xTb2NrZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc29ja2V0KSB7XG4gICAgICAgICAgICAvLyBTZXR0aW5nIGEgY29tcGxldGVseSBuZXcgY29udHJvbCBzb2NrZXQgaXMgaW4gZXNzZW5jZSBzb21ldGhpbmcgbGlrZSBhIHJlc2V0LiBUaGF0J3NcbiAgICAgICAgICAgIC8vIHdoeSB3ZSBhbHNvIGNsb3NlIGFueSBvcGVuIGRhdGEgY29ubmVjdGlvbiBhYm92ZS4gV2UgY2FuIGdvIG9uZSBzdGVwIGZ1cnRoZXIgYW5kIHJlc2V0XG4gICAgICAgICAgICAvLyBhIHBvc3NpYmxlIGNsb3NpbmcgZXJyb3IuIFRoYXQgbWVhbnMgdGhhdCBhIGNsb3NlZCBGVFBDb250ZXh0IGNhbiBiZSBcInJlb3BlbmVkXCIgYnlcbiAgICAgICAgICAgIC8vIHNldHRpbmcgYSBuZXcgY29udHJvbCBzb2NrZXQuXG4gICAgICAgICAgICB0aGlzLl9jbG9zaW5nRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBEb24ndCBzZXQgYSB0aW1lb3V0IHlldC4gVGltZW91dCBmb3IgY29udHJvbCBzb2NrZXRzIGlzIG9ubHkgYWN0aXZlIGR1cmluZyBhIHRhc2ssIHNlZSBoYW5kbGUoKSBiZWxvdy5cbiAgICAgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgICAgICAgICAgc29ja2V0LnNldEVuY29kaW5nKHRoaXMuX2VuY29kaW5nKTtcbiAgICAgICAgICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSk7XG4gICAgICAgICAgICBzb2NrZXQub24oXCJkYXRhXCIsIGRhdGEgPT4gdGhpcy5fb25Db250cm9sU29ja2V0RGF0YShkYXRhKSk7XG4gICAgICAgICAgICAvLyBTZXJ2ZXIgc2VuZGluZyBhIEZJTiBwYWNrZXQgaXMgdHJlYXRlZCBhcyBhbiBlcnJvci5cbiAgICAgICAgICAgIHNvY2tldC5vbihcImVuZFwiLCAoKSA9PiB0aGlzLmNsb3NlV2l0aEVycm9yKG5ldyBFcnJvcihcIlNlcnZlciBzZW50IEZJTiBwYWNrZXQgdW5leHBlY3RlZGx5LCBjbG9zaW5nIGNvbm5lY3Rpb24uXCIpKSk7XG4gICAgICAgICAgICAvLyBDb250cm9sIGJlaW5nIGNsb3NlZCB3aXRob3V0IGVycm9yIGJ5IHNlcnZlciBpcyB0cmVhdGVkIGFzIGFuIGVycm9yLlxuICAgICAgICAgICAgc29ja2V0Lm9uKFwiY2xvc2VcIiwgaGFkRXJyb3IgPT4geyBpZiAoIWhhZEVycm9yKVxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IEVycm9yKFwiU2VydmVyIGNsb3NlZCBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS5cIikpOyB9KTtcbiAgICAgICAgICAgIHRoaXMuX3NldHVwRGVmYXVsdEVycm9ySGFuZGxlcnMoc29ja2V0LCBcImNvbnRyb2wgc29ja2V0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IEZUUCBkYXRhIGNvbm5lY3Rpb24gaWYgcHJlc2VudC5cbiAgICAgKi9cbiAgICBnZXQgZGF0YVNvY2tldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFTb2NrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgc29ja2V0IGZvciB0aGUgZGF0YSBjb25uZWN0aW9uLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBjbG9zZSB0aGUgZm9ybWVyIGRhdGEgc29ja2V0LlxuICAgICAqL1xuICAgIHNldCBkYXRhU29ja2V0KHNvY2tldCkge1xuICAgICAgICB0aGlzLl9jbG9zZVNvY2tldCh0aGlzLl9kYXRhU29ja2V0KTtcbiAgICAgICAgaWYgKHNvY2tldCkge1xuICAgICAgICAgICAgLy8gRG9uJ3Qgc2V0IGEgdGltZW91dCB5ZXQuIFRpbWVvdXQgZGF0YSBzb2NrZXQgc2hvdWxkIGJlIGFjdGl2YXRlZCB3aGVuIGRhdGEgdHJhbnNtaXNzaW9uIHN0YXJ0c1xuICAgICAgICAgICAgLy8gYW5kIHRpbWVvdXQgb24gY29udHJvbCBzb2NrZXQgaXMgZGVhY3RpdmF0ZWQuXG4gICAgICAgICAgICBzb2NrZXQuc2V0VGltZW91dCgwKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHVwRGVmYXVsdEVycm9ySGFuZGxlcnMoc29ja2V0LCBcImRhdGEgc29ja2V0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RhdGFTb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudGx5IHVzZWQgZW5jb2RpbmcuXG4gICAgICovXG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgdGhlIGNvbnRyb2wgc29ja2V0LlxuICAgICAqXG4gICAgICogU2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvYnVmZmVyLmh0bWwjYnVmZmVyX2J1ZmZlcnNfYW5kX2NoYXJhY3Rlcl9lbmNvZGluZ3MgZm9yIHdoYXQgZW5jb2RpbmdzXG4gICAgICogYXJlIHN1cHBvcnRlZCBieSBOb2RlLlxuICAgICAqL1xuICAgIHNldCBlbmNvZGluZyhlbmNvZGluZykge1xuICAgICAgICB0aGlzLl9lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgICAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNldEVuY29kaW5nKGVuY29kaW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGFuIEZUUCBjb21tYW5kIHdpdGhvdXQgd2FpdGluZyBmb3Igb3IgaGFuZGxpbmcgdGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBzZW5kKGNvbW1hbmQpIHtcbiAgICAgICAgY29uc3QgY29udGFpbnNQYXNzd29yZCA9IGNvbW1hbmQuc3RhcnRzV2l0aChcIlBBU1NcIik7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjb250YWluc1Bhc3N3b3JkID8gXCI+IFBBU1MgIyMjXCIgOiBgPiAke2NvbW1hbmR9YDtcbiAgICAgICAgdGhpcy5sb2cobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuX3NvY2tldC53cml0ZShjb21tYW5kICsgXCJcXHJcXG5cIiwgdGhpcy5lbmNvZGluZyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYW4gRlRQIGNvbW1hbmQgYW5kIGhhbmRsZSB0aGUgZmlyc3QgcmVzcG9uc2UuIFVzZSB0aGlzIGlmIHlvdSBoYXZlIGEgc2ltcGxlXG4gICAgICogcmVxdWVzdC1yZXNwb25zZSBzaXR1YXRpb24uXG4gICAgICovXG4gICAgcmVxdWVzdChjb21tYW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZShjb21tYW5kLCAocmVzLCB0YXNrKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0YXNrLnJlamVjdChyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFzay5yZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGFuIEZUUCBjb21tYW5kIGFuZCBoYW5kbGUgYW55IHJlc3BvbnNlIHVudGlsIHlvdSByZXNvbHZlL3JlamVjdC4gVXNlIHRoaXMgaWYgeW91IGV4cGVjdCBtdWx0aXBsZSByZXNwb25zZXNcbiAgICAgKiB0byBhIHJlcXVlc3QuIFRoaXMgcmV0dXJucyBhIFByb21pc2UgdGhhdCB3aWxsIGhvbGQgd2hhdGV2ZXIgdGhlIHJlc3BvbnNlIGhhbmRsZXIgcGFzc2VkIG9uIHdoZW4gcmVzb2x2aW5nL3JlamVjdGluZyBpdHMgdGFzay5cbiAgICAgKi9cbiAgICBoYW5kbGUoY29tbWFuZCwgcmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgIGlmICh0aGlzLl90YXNrKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXCJVc2VyIGxhdW5jaGVkIGEgdGFzayB3aGlsZSBhbm90aGVyIG9uZSBpcyBzdGlsbCBydW5uaW5nLiBGb3Jnb3QgdG8gdXNlICdhd2FpdCcgb3IgJy50aGVuKCknP1wiKTtcbiAgICAgICAgICAgIGVyci5zdGFjayArPSBgXFxuUnVubmluZyB0YXNrIGxhdW5jaGVkIGF0OiAke3RoaXMuX3Rhc2suc3RhY2t9YDtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIC8vIERvbid0IHJldHVybiBoZXJlLCBjb250aW51ZSB3aXRoIHJldHVybmluZyB0aGUgUHJvbWlzZSB0aGF0IHdpbGwgdGhlbiBiZSByZWplY3RlZFxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29udGV4dCBjbG9zZWQgYWxyZWFkeS4gVGhhdCB3YXksIHVzZXJzIHdpbGwgcmVjZWl2ZSBhbiBleGNlcHRpb24gd2hlcmVcbiAgICAgICAgICAgIC8vIHRoZXkgY2FsbGVkIHRoaXMgbWV0aG9kIGJ5IG1pc3Rha2UuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlVGFzaywgcmVqZWN0VGFzaykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdGFzayA9IHtcbiAgICAgICAgICAgICAgICBzdGFjazogbmV3IEVycm9yKCkuc3RhY2sgfHwgXCJVbmtub3duIGNhbGwgc3RhY2tcIixcbiAgICAgICAgICAgICAgICByZXNwb25zZUhhbmRsZXIsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogYXJnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0b3BUcmFja2luZ1Rhc2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVUYXNrKGFyZyk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdDogZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0b3BUcmFja2luZ1Rhc2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdFRhc2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5fY2xvc2luZ0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBjbGllbnQgaGFzIGJlZW4gY2xvc2VkLiBQcm92aWRlIGFuIGVycm9yIHRoYXQgZGVzY3JpYmVzIHRoaXMgb25lIGFzIGJlaW5nIGNhdXNlZFxuICAgICAgICAgICAgICAgIC8vIGJ5IGBfY2xvc2luZ0Vycm9yYCwgaW5jbHVkZSBzdGFjayB0cmFjZXMgZm9yIGJvdGguXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBDbGllbnQgaXMgY2xvc2VkIGJlY2F1c2UgJHt0aGlzLl9jbG9zaW5nRXJyb3IubWVzc2FnZX1gKTsgLy8gVHlwZSAnRXJyb3InIGlzIG5vdCBjb3JyZWN0bHkgZGVmaW5lZCwgZG9lc24ndCBoYXZlICdjb2RlJy5cbiAgICAgICAgICAgICAgICBlcnIuc3RhY2sgKz0gYFxcbkNsb3NpbmcgcmVhc29uOiAke3RoaXMuX2Nsb3NpbmdFcnJvci5zdGFja31gO1xuICAgICAgICAgICAgICAgIGVyci5jb2RlID0gdGhpcy5fY2xvc2luZ0Vycm9yLmNvZGUgIT09IHVuZGVmaW5lZCA/IHRoaXMuX2Nsb3NpbmdFcnJvci5jb2RlIDogXCIwXCI7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFzc1RvSGFuZGxlcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE9ubHkgdHJhY2sgY29udHJvbCBzb2NrZXQgdGltZW91dCBkdXJpbmcgdGhlIGxpZmVjeWNsZSBvZiBhIHRhc2suIFRoaXMgYXZvaWRzIHRpbWVvdXRzIG9uIGlkbGUgc29ja2V0cyxcbiAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IHNvY2tldCBiZWhhdmlvdXIgd2hpY2ggaXMgbm90IGV4cGVjdGVkIGJ5IG1vc3QgdXNlcnMuXG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZXRUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICAgICAgICBpZiAoY29tbWFuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZChjb21tYW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZyBtZXNzYWdlIGlmIHNldCB0byBiZSB2ZXJib3NlLlxuICAgICAqL1xuICAgIGxvZyhtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29udHJvbCBzb2NrZXQgaXMgdXNpbmcgVExTLiBUaGlzIGRvZXMgbm90IG1lYW4gdGhhdCBhIHNlc3Npb25cbiAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIG5lZ290aWF0ZWQuXG4gICAgICovXG4gICAgZ2V0IGhhc1RMUygpIHtcbiAgICAgICAgcmV0dXJuIFwiZW5jcnlwdGVkXCIgaW4gdGhpcy5fc29ja2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHJlZmVyZW5jZSB0byBjdXJyZW50IHRhc2sgYW5kIGhhbmRsZXIuIFRoaXMgd29uJ3QgcmVzb2x2ZSBvciByZWplY3QgdGhlIHRhc2suXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIF9zdG9wVHJhY2tpbmdUYXNrKCkge1xuICAgICAgICAvLyBEaXNhYmxlIHRpbWVvdXQgb24gY29udHJvbCBzb2NrZXQgaWYgdGhlcmUgaXMgbm8gdGFzayBhY3RpdmUuXG4gICAgICAgIHRoaXMuc29ja2V0LnNldFRpbWVvdXQoMCk7XG4gICAgICAgIHRoaXMuX3Rhc2sgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBpbmNvbWluZyBkYXRhIG9uIHRoZSBjb250cm9sIHNvY2tldC4gVGhlIGNodW5rIGlzIGdvaW5nIHRvIGJlIG9mIHR5cGUgYHN0cmluZ2BcbiAgICAgKiBiZWNhdXNlIHdlIGxldCBgc29ja2V0YCBoYW5kbGUgZW5jb2Rpbmcgd2l0aCBgc2V0RW5jb2RpbmdgLlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBfb25Db250cm9sU29ja2V0RGF0YShjaHVuaykge1xuICAgICAgICB0aGlzLmxvZyhgPCAke2NodW5rfWApO1xuICAgICAgICAvLyBUaGlzIGNodW5rIG1pZ2h0IGNvbXBsZXRlIGFuIGVhcmxpZXIgcGFydGlhbCByZXNwb25zZS5cbiAgICAgICAgY29uc3QgY29tcGxldGVSZXNwb25zZSA9IHRoaXMuX3BhcnRpYWxSZXNwb25zZSArIGNodW5rO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSAoMCwgcGFyc2VDb250cm9sUmVzcG9uc2VfMS5wYXJzZUNvbnRyb2xSZXNwb25zZSkoY29tcGxldGVSZXNwb25zZSk7XG4gICAgICAgIC8vIFJlbWVtYmVyIGFueSBpbmNvbXBsZXRlIHJlbWFpbmRlci5cbiAgICAgICAgdGhpcy5fcGFydGlhbFJlc3BvbnNlID0gcGFyc2VkLnJlc3Q7XG4gICAgICAgIC8vIEVhY2ggcmVzcG9uc2UgZ3JvdXAgaXMgcGFzc2VkIGFsb25nIGluZGl2aWR1YWxseS5cbiAgICAgICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHBhcnNlZC5tZXNzYWdlcykge1xuICAgICAgICAgICAgY29uc3QgY29kZSA9IHBhcnNlSW50KG1lc3NhZ2Uuc3Vic3RyKDAsIDMpLCAxMCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHsgY29kZSwgbWVzc2FnZSB9O1xuICAgICAgICAgICAgY29uc3QgZXJyID0gY29kZSA+PSA0MDAgPyBuZXcgRlRQRXJyb3IocmVzcG9uc2UpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fcGFzc1RvSGFuZGxlcihlcnIgPyBlcnIgOiByZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGUgY3VycmVudCBoYW5kbGVyIGEgcmVzcG9uc2UuIFRoaXMgaXMgdXN1YWxseSBhIGNvbnRyb2wgc29ja2V0IHJlc3BvbnNlXG4gICAgICogb3IgYSBzb2NrZXQgZXZlbnQsIGxpa2UgYW4gZXJyb3Igb3IgdGltZW91dC5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgX3Bhc3NUb0hhbmRsZXIocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Rhc2spIHtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2sucmVzcG9uc2VIYW5kbGVyKHJlc3BvbnNlLCB0aGlzLl90YXNrLnJlc29sdmVyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFcnJvcnMgb3RoZXIgdGhhbiBGVFBFcnJvciBhbHdheXMgY2xvc2UgdGhlIGNsaWVudC4gSWYgdGhlcmUgaXNuJ3QgYW4gYWN0aXZlIHRhc2sgdG8gaGFuZGxlIHRoZSBlcnJvcixcbiAgICAgICAgLy8gdGhlIG5leHQgb25lIHN1Ym1pdHRlZCB3aWxsIHJlY2VpdmUgaXQgdXNpbmcgYF9jbG9zaW5nRXJyb3JgLlxuICAgICAgICAvLyBUaGVyZSBpcyBvbmx5IG9uZSBlZGdlLWNhc2U6IElmIHRoZXJlIGlzIGFuIEZUUEVycm9yIHdoaWxlIG5vIHRhc2sgaXMgYWN0aXZlLCB0aGUgZXJyb3Igd2lsbCBiZSBkcm9wcGVkLlxuICAgICAgICAvLyBCdXQgdGhhdCBtZWFucyB0aGF0IHRoZSB1c2VyIHNlbnQgYW4gRlRQIGNvbW1hbmQgd2l0aCBubyBpbnRlbnRpb24gb2YgaGFuZGxpbmcgdGhlIHJlc3VsdC4gU28gd2h5IHNob3VsZCB0aGVcbiAgICAgICAgLy8gZXJyb3IgYmUgaGFuZGxlZD8gTWF5YmUgbG9nIGl0IGF0IGxlYXN0PyBEZWJ1ZyBsb2dnaW5nIHdpbGwgYWxyZWFkeSBkbyB0aGF0IGFuZCB0aGUgY2xpZW50IHN0YXlzIHVzZWFibGUgYWZ0ZXJcbiAgICAgICAgLy8gRlRQRXJyb3IuIFNvIG1heWJlIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZS5cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0dXAgYWxsIGVycm9yIGhhbmRsZXJzIGZvciBhIHNvY2tldC5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgX3NldHVwRGVmYXVsdEVycm9ySGFuZGxlcnMoc29ja2V0LCBpZGVudGlmaWVyKSB7XG4gICAgICAgIHNvY2tldC5vbmNlKFwiZXJyb3JcIiwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgZXJyb3IubWVzc2FnZSArPSBgICgke2lkZW50aWZpZXJ9KWA7XG4gICAgICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNvY2tldC5vbmNlKFwiY2xvc2VcIiwgaGFkRXJyb3IgPT4ge1xuICAgICAgICAgICAgaWYgKGhhZEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihuZXcgRXJyb3IoYFNvY2tldCBjbG9zZWQgZHVlIHRvIHRyYW5zbWlzc2lvbiBlcnJvciAoJHtpZGVudGlmaWVyfSlgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzb2NrZXQub25jZShcInRpbWVvdXRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IEVycm9yKGBUaW1lb3V0ICgke2lkZW50aWZpZXJ9KWApKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjb250cm9sIHNvY2tldC4gU2VuZHMgUVVJVCwgdGhlbiBGSU4sIGFuZCBpZ25vcmVzIGFueSByZXNwb25zZSBvciBlcnJvci5cbiAgICAgKi9cbiAgICBfY2xvc2VDb250cm9sU29ja2V0KCkge1xuICAgICAgICB0aGlzLl9yZW1vdmVTb2NrZXRMaXN0ZW5lcnModGhpcy5fc29ja2V0KTtcbiAgICAgICAgdGhpcy5fc29ja2V0Lm9uKFwiZXJyb3JcIiwgZG9Ob3RoaW5nKTtcbiAgICAgICAgdGhpcy5zZW5kKFwiUVVJVFwiKTtcbiAgICAgICAgdGhpcy5fY2xvc2VTb2NrZXQodGhpcy5fc29ja2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgYSBzb2NrZXQsIGlnbm9yZXMgYW55IGVycm9yLlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBfY2xvc2VTb2NrZXQoc29ja2V0KSB7XG4gICAgICAgIGlmIChzb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZVNvY2tldExpc3RlbmVycyhzb2NrZXQpO1xuICAgICAgICAgICAgc29ja2V0Lm9uKFwiZXJyb3JcIiwgZG9Ob3RoaW5nKTtcbiAgICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCBkZWZhdWx0IGxpc3RlbmVycyBmb3Igc29ja2V0LlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBfcmVtb3ZlU29ja2V0TGlzdGVuZXJzKHNvY2tldCkge1xuICAgICAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIC8vIEJlZm9yZSBOb2RlLmpzIDEwLjMuMCwgdXNpbmcgYHNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoKWAgd2l0aG91dCBhbnkgbmFtZSBkaWQgbm90IHdvcms6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMjA5MjMuXG4gICAgICAgIHNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJ0aW1lb3V0XCIpO1xuICAgICAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKFwiZGF0YVwiKTtcbiAgICAgICAgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycyhcImVuZFwiKTtcbiAgICAgICAgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycyhcImVycm9yXCIpO1xuICAgICAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKFwiY2xvc2VcIik7XG4gICAgICAgIHNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJjb25uZWN0XCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm92aWRlIGEgbmV3IHNvY2tldCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEludGVybmFsIHVzZSBvbmx5LCByZXBsYWNlZCBmb3IgdW5pdCB0ZXN0cy5cbiAgICAgKi9cbiAgICBfbmV3U29ja2V0KCkge1xuICAgICAgICByZXR1cm4gbmV3IG5ldF8xLlNvY2tldCgpO1xuICAgIH1cbn1cbmV4cG9ydHMuRlRQQ29udGV4dCA9IEZUUENvbnRleHQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUcmFja2VyID0gdm9pZCAwO1xuLyoqXG4gKiBUcmFja3MgcHJvZ3Jlc3Mgb2Ygb25lIHNvY2tldCBkYXRhIHRyYW5zZmVyIGF0IGEgdGltZS5cbiAqL1xuY2xhc3MgUHJvZ3Jlc3NUcmFja2VyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ieXRlc092ZXJhbGwgPSAwO1xuICAgICAgICB0aGlzLmludGVydmFsTXMgPSA1MDA7XG4gICAgICAgIHRoaXMub25TdG9wID0gbm9vcDtcbiAgICAgICAgdGhpcy5vbkhhbmRsZSA9IG5vb3A7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgbmV3IGhhbmRsZXIgZm9yIHByb2dyZXNzIGluZm8uIFVzZSBgdW5kZWZpbmVkYCB0byBkaXNhYmxlIHJlcG9ydGluZy5cbiAgICAgKi9cbiAgICByZXBvcnRUbyhvbkhhbmRsZSA9IG5vb3ApIHtcbiAgICAgICAgdGhpcy5vbkhhbmRsZSA9IG9uSGFuZGxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydCB0cmFja2luZyB0cmFuc2ZlciBwcm9ncmVzcyBvZiBhIHNvY2tldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzb2NrZXQgIFRoZSBzb2NrZXQgdG8gb2JzZXJ2ZS5cbiAgICAgKiBAcGFyYW0gbmFtZSAgQSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2dyZXNzIHRyYWNraW5nLCBlLmcuIGEgZmlsZW5hbWUuXG4gICAgICogQHBhcmFtIHR5cGUgIFRoZSB0eXBlIG9mIHRoZSB0cmFuc2ZlciwgdHlwaWNhbGx5IFwidXBsb2FkXCIgb3IgXCJkb3dubG9hZFwiLlxuICAgICAqL1xuICAgIHN0YXJ0KHNvY2tldCwgbmFtZSwgdHlwZSkge1xuICAgICAgICBsZXQgbGFzdEJ5dGVzID0gMDtcbiAgICAgICAgdGhpcy5vblN0b3AgPSBwb2xsKHRoaXMuaW50ZXJ2YWxNcywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBzb2NrZXQuYnl0ZXNSZWFkICsgc29ja2V0LmJ5dGVzV3JpdHRlbjtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXNPdmVyYWxsICs9IGJ5dGVzIC0gbGFzdEJ5dGVzO1xuICAgICAgICAgICAgbGFzdEJ5dGVzID0gYnl0ZXM7XG4gICAgICAgICAgICB0aGlzLm9uSGFuZGxlKHtcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgYnl0ZXMsXG4gICAgICAgICAgICAgICAgYnl0ZXNPdmVyYWxsOiB0aGlzLmJ5dGVzT3ZlcmFsbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9wIHRyYWNraW5nIHRyYW5zZmVyIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHN0b3AoKSB7XG4gICAgICAgIHRoaXMub25TdG9wKGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCB0aGUgcHJvZ3Jlc3MgaGFuZGxlciBvbmUgbW9yZSB0aW1lLCB0aGVuIHN0b3AgdHJhY2tpbmcuXG4gICAgICovXG4gICAgdXBkYXRlQW5kU3RvcCgpIHtcbiAgICAgICAgdGhpcy5vblN0b3AodHJ1ZSk7XG4gICAgfVxufVxuZXhwb3J0cy5Qcm9ncmVzc1RyYWNrZXIgPSBQcm9ncmVzc1RyYWNrZXI7XG4vKipcbiAqIFN0YXJ0cyBjYWxsaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24gYXQgYSByZWd1bGFyIGludGVydmFsLiBUaGUgZmlyc3QgY2FsbCB3aWxsIGdvIG91dFxuICogaW1tZWRpYXRlbHkuIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgZnVuY3Rpb24gdG8gc3RvcCB0aGUgcG9sbGluZy5cbiAqL1xuZnVuY3Rpb24gcG9sbChpbnRlcnZhbE1zLCB1cGRhdGVGdW5jKSB7XG4gICAgY29uc3QgaWQgPSBzZXRJbnRlcnZhbCh1cGRhdGVGdW5jLCBpbnRlcnZhbE1zKTtcbiAgICBjb25zdCBzdG9wRnVuYyA9IChzdG9wV2l0aFVwZGF0ZSkgPT4ge1xuICAgICAgICBjbGVhckludGVydmFsKGlkKTtcbiAgICAgICAgaWYgKHN0b3BXaXRoVXBkYXRlKSB7XG4gICAgICAgICAgICB1cGRhdGVGdW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJldmVudCByZXBlYXRlZCBjYWxscyB0byBzdG9wIGNhbGxpbmcgaGFuZGxlci5cbiAgICAgICAgdXBkYXRlRnVuYyA9IG5vb3A7XG4gICAgfTtcbiAgICB1cGRhdGVGdW5jKCk7XG4gICAgcmV0dXJuIHN0b3BGdW5jO1xufVxuZnVuY3Rpb24gbm9vcCgpIHsgfVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU3RyaW5nV3JpdGVyID0gdm9pZCAwO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY2xhc3MgU3RyaW5nV3JpdGVyIGV4dGVuZHMgc3RyZWFtXzEuV3JpdGFibGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmJ1ZiA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICB9XG4gICAgX3dyaXRlKGNodW5rLCBfLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoY2h1bmsgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmID0gQnVmZmVyLmNvbmNhdChbdGhpcy5idWYsIGNodW5rXSk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihcIlN0cmluZ1dyaXRlciBleHBlY3RzIGNodW5rcyBvZiB0eXBlICdCdWZmZXInLlwiKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0VGV4dChlbmNvZGluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5idWYudG9TdHJpbmcoZW5jb2RpbmcpO1xuICAgIH1cbn1cbmV4cG9ydHMuU3RyaW5nV3JpdGVyID0gU3RyaW5nV3JpdGVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZW50ZXJQYXNzaXZlTW9kZUlQdjYgPSBleHBvcnRzLmVudGVyUGFzc2l2ZU1vZGVJUHY0ID0gdm9pZCAwO1xuLyoqXG4gKiBQdWJsaWMgQVBJXG4gKi9cbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9DbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0Z0cENvbnRleHRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0ZpbGVJbmZvXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9wYXJzZUxpc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1N0cmluZ0VuY29kaW5nXCIpLCBleHBvcnRzKTtcbnZhciB0cmFuc2Zlcl8xID0gcmVxdWlyZShcIi4vdHJhbnNmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJlbnRlclBhc3NpdmVNb2RlSVB2NFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJhbnNmZXJfMS5lbnRlclBhc3NpdmVNb2RlSVB2NDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImVudGVyUGFzc2l2ZU1vZGVJUHY2XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cmFuc2Zlcl8xLmVudGVyUGFzc2l2ZU1vZGVJUHY2OyB9IH0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlwSXNQcml2YXRlVjRBZGRyZXNzID0gZXhwb3J0cy51cGdyYWRlU29ja2V0ID0gZXhwb3J0cy5kZXNjcmliZUFkZHJlc3MgPSBleHBvcnRzLmRlc2NyaWJlVExTID0gdm9pZCAwO1xuY29uc3QgdGxzXzEgPSByZXF1aXJlKFwidGxzXCIpO1xuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVuY3J5cHRpb24gb24gYSBnaXZlbiBzb2NrZXQgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlVExTKHNvY2tldCkge1xuICAgIGlmIChzb2NrZXQgaW5zdGFuY2VvZiB0bHNfMS5UTFNTb2NrZXQpIHtcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBzb2NrZXQuZ2V0UHJvdG9jb2woKTtcbiAgICAgICAgcmV0dXJuIHByb3RvY29sID8gcHJvdG9jb2wgOiBcIlNlcnZlciBzb2NrZXQgb3IgZGlzY29ubmVjdGVkIGNsaWVudCBzb2NrZXRcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwiTm8gZW5jcnlwdGlvblwiO1xufVxuZXhwb3J0cy5kZXNjcmliZVRMUyA9IGRlc2NyaWJlVExTO1xuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHJlbW90ZSBhZGRyZXNzIG9mIGEgc29ja2V0LlxuICovXG5mdW5jdGlvbiBkZXNjcmliZUFkZHJlc3Moc29ja2V0KSB7XG4gICAgaWYgKHNvY2tldC5yZW1vdGVGYW1pbHkgPT09IFwiSVB2NlwiKSB7XG4gICAgICAgIHJldHVybiBgWyR7c29ja2V0LnJlbW90ZUFkZHJlc3N9XToke3NvY2tldC5yZW1vdGVQb3J0fWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtzb2NrZXQucmVtb3RlQWRkcmVzc306JHtzb2NrZXQucmVtb3RlUG9ydH1gO1xufVxuZXhwb3J0cy5kZXNjcmliZUFkZHJlc3MgPSBkZXNjcmliZUFkZHJlc3M7XG4vKipcbiAqIFVwZ3JhZGUgYSBzb2NrZXQgY29ubmVjdGlvbiB3aXRoIFRMUy5cbiAqL1xuZnVuY3Rpb24gdXBncmFkZVNvY2tldChzb2NrZXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB0bHNPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xuICAgICAgICAgICAgc29ja2V0XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0bHNTb2NrZXQgPSAoMCwgdGxzXzEuY29ubmVjdCkodGxzT3B0aW9ucywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0Q2VydGlmaWNhdGUgPSB0bHNPcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZCAhPT0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZXhwZWN0Q2VydGlmaWNhdGUgJiYgIXRsc1NvY2tldC5hdXRob3JpemVkKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHRsc1NvY2tldC5hdXRob3JpemF0aW9uRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGVycm9yIGxpc3RlbmVyIGFkZGVkIGJlbG93LlxuICAgICAgICAgICAgICAgIHRsc1NvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJlcnJvclwiKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRsc1NvY2tldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLm9uY2UoXCJlcnJvclwiLCBlcnJvciA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBncmFkZVNvY2tldCA9IHVwZ3JhZGVTb2NrZXQ7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbiBJUCBpcyBhIHByaXZhdGUgYWRkcmVzcyBhY2NvcmRpbmcgdG8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5MTgjc2VjdGlvbi0zLlxuICogVGhpcyB3aWxsIGhhbmRsZSBJUHY0LW1hcHBlZCBJUHY2IGFkZHJlc3NlcyBjb3JyZWN0bHkgYnV0IHJldHVybiBmYWxzZSBmb3IgYWxsIG90aGVyIElQdjYgYWRkcmVzc2VzLlxuICpcbiAqIEBwYXJhbSBpcCAgVGhlIElQIGFzIGEgc3RyaW5nLCBlLmcuIFwiMTkyLjE2OC4wLjFcIlxuICovXG5mdW5jdGlvbiBpcElzUHJpdmF0ZVY0QWRkcmVzcyhpcCA9IFwiXCIpIHtcbiAgICAvLyBIYW5kbGUgSVB2NC1tYXBwZWQgSVB2NiBhZGRyZXNzZXMgbGlrZSA6OmZmZmY6MTkyLjE2OC4wLjFcbiAgICBpZiAoaXAuc3RhcnRzV2l0aChcIjo6ZmZmZjpcIikpIHtcbiAgICAgICAgaXAgPSBpcC5zdWJzdHIoNyk7IC8vIFN0cmlwIDo6ZmZmZjogcHJlZml4XG4gICAgfVxuICAgIGNvbnN0IG9jdGV0cyA9IGlwLnNwbGl0KFwiLlwiKS5tYXAobyA9PiBwYXJzZUludChvLCAxMCkpO1xuICAgIHJldHVybiBvY3RldHNbMF0gPT09IDEwIC8vIDEwLjAuMC4wIC0gMTAuMjU1LjI1NS4yNTVcbiAgICAgICAgfHwgKG9jdGV0c1swXSA9PT0gMTcyICYmIG9jdGV0c1sxXSA+PSAxNiAmJiBvY3RldHNbMV0gPD0gMzEpIC8vIDE3Mi4xNi4wLjAgLSAxNzIuMzEuMjU1LjI1NVxuICAgICAgICB8fCAob2N0ZXRzWzBdID09PSAxOTIgJiYgb2N0ZXRzWzFdID09PSAxNjgpIC8vIDE5Mi4xNjguMC4wIC0gMTkyLjE2OC4yNTUuMjU1XG4gICAgICAgIHx8IGlwID09PSBcIjEyNy4wLjAuMVwiO1xufVxuZXhwb3J0cy5pcElzUHJpdmF0ZVY0QWRkcmVzcyA9IGlwSXNQcml2YXRlVjRBZGRyZXNzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBvc2l0aXZlSW50ZXJtZWRpYXRlID0gZXhwb3J0cy5wb3NpdGl2ZUNvbXBsZXRpb24gPSBleHBvcnRzLmlzTXVsdGlsaW5lID0gZXhwb3J0cy5pc1NpbmdsZUxpbmUgPSBleHBvcnRzLnBhcnNlQ29udHJvbFJlc3BvbnNlID0gdm9pZCAwO1xuY29uc3QgTEYgPSBcIlxcblwiO1xuLyoqXG4gKiBQYXJzZSBhbiBGVFAgY29udHJvbCByZXNwb25zZSBhcyBhIGNvbGxlY3Rpb24gb2YgbWVzc2FnZXMuIEEgbWVzc2FnZSBpcyBhIGNvbXBsZXRlXG4gKiBzaW5nbGUtIG9yIG11bHRpbGluZSByZXNwb25zZS4gQSByZXNwb25zZSBjYW4gYWxzbyBjb250YWluIG11bHRpcGxlIG11bHRpbGluZSByZXNwb25zZXNcbiAqIHRoYXQgd2lsbCBlYWNoIGJlIHJlcHJlc2VudGVkIGJ5IGEgbWVzc2FnZS4gQSByZXNwb25zZSBjYW4gYWxzbyBiZSBpbmNvbXBsZXRlXG4gKiBhbmQgYmUgY29tcGxldGVkIG9uIHRoZSBuZXh0IGluY29taW5nIGRhdGEgY2h1bmsgZm9yIHdoaWNoIGNhc2UgdGhpcyBmdW5jdGlvbiBhbHNvXG4gKiBkZXNjcmliZXMgYSBgcmVzdGAuIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYWxsIENSTEYgdG8gTEYuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ29udHJvbFJlc3BvbnNlKHRleHQpIHtcbiAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoaXNOb3RCbGFuayk7XG4gICAgY29uc3QgbWVzc2FnZXMgPSBbXTtcbiAgICBsZXQgc3RhcnRBdCA9IDA7XG4gICAgbGV0IHRva2VuUmVnZXg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07XG4gICAgICAgIC8vIE5vIGdyb3VwIGhhcyBiZWVuIG9wZW5lZC5cbiAgICAgICAgaWYgKCF0b2tlblJlZ2V4KSB7XG4gICAgICAgICAgICBpZiAoaXNNdWx0aWxpbmUobGluZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBPcGVuIGEgZ3JvdXAgYnkgc2V0dGluZyBhbiBleHBlY3RlZCB0b2tlbi5cbiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbiA9IGxpbmUuc3Vic3RyKDAsIDMpO1xuICAgICAgICAgICAgICAgIHRva2VuUmVnZXggPSBuZXcgUmVnRXhwKGBeJHt0b2tlbn0oPzokfCApYCk7XG4gICAgICAgICAgICAgICAgc3RhcnRBdCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc1NpbmdsZUxpbmUobGluZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5nbGUgbGluZXMgY2FuIGJlIGdyb3VwZWQgaW1tZWRpYXRlbHkuXG4gICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBHcm91cCBoYXMgYmVlbiBvcGVuZWQsIGV4cGVjdCBjbG9zaW5nIHRva2VuLlxuICAgICAgICBlbHNlIGlmICh0b2tlblJlZ2V4LnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgIHRva2VuUmVnZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBtZXNzYWdlcy5wdXNoKGxpbmVzLnNsaWNlKHN0YXJ0QXQsIGkgKyAxKS5qb2luKExGKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVGhlIGxhc3QgZ3JvdXAgbWlnaHQgbm90IGhhdmUgYmVlbiBjbG9zZWQsIHJlcG9ydCBpdCBhcyBhIHJlc3QuXG4gICAgY29uc3QgcmVzdCA9IHRva2VuUmVnZXggPyBsaW5lcy5zbGljZShzdGFydEF0KS5qb2luKExGKSArIExGIDogXCJcIjtcbiAgICByZXR1cm4geyBtZXNzYWdlcywgcmVzdCB9O1xufVxuZXhwb3J0cy5wYXJzZUNvbnRyb2xSZXNwb25zZSA9IHBhcnNlQ29udHJvbFJlc3BvbnNlO1xuZnVuY3Rpb24gaXNTaW5nbGVMaW5lKGxpbmUpIHtcbiAgICByZXR1cm4gL15cXGRcXGRcXGQoPzokfCApLy50ZXN0KGxpbmUpO1xufVxuZXhwb3J0cy5pc1NpbmdsZUxpbmUgPSBpc1NpbmdsZUxpbmU7XG5mdW5jdGlvbiBpc011bHRpbGluZShsaW5lKSB7XG4gICAgcmV0dXJuIC9eXFxkXFxkXFxkLS8udGVzdChsaW5lKTtcbn1cbmV4cG9ydHMuaXNNdWx0aWxpbmUgPSBpc011bHRpbGluZTtcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgYW4gRlRQIHJldHVybiBjb2RlIGRlc2NyaWJlcyBhIHBvc2l0aXZlIGNvbXBsZXRpb24uXG4gKi9cbmZ1bmN0aW9uIHBvc2l0aXZlQ29tcGxldGlvbihjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPj0gMjAwICYmIGNvZGUgPCAzMDA7XG59XG5leHBvcnRzLnBvc2l0aXZlQ29tcGxldGlvbiA9IHBvc2l0aXZlQ29tcGxldGlvbjtcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgYW4gRlRQIHJldHVybiBjb2RlIGRlc2NyaWJlcyBhIHBvc2l0aXZlIGludGVybWVkaWF0ZSByZXNwb25zZS5cbiAqL1xuZnVuY3Rpb24gcG9zaXRpdmVJbnRlcm1lZGlhdGUoY29kZSkge1xuICAgIHJldHVybiBjb2RlID49IDMwMCAmJiBjb2RlIDwgNDAwO1xufVxuZXhwb3J0cy5wb3NpdGl2ZUludGVybWVkaWF0ZSA9IHBvc2l0aXZlSW50ZXJtZWRpYXRlO1xuZnVuY3Rpb24gaXNOb3RCbGFuayhzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRyaW0oKSAhPT0gXCJcIjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlTGlzdCA9IHZvaWQgMDtcbmNvbnN0IGRvc1BhcnNlciA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wYXJzZUxpc3RET1NcIikpO1xuY29uc3QgdW5peFBhcnNlciA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wYXJzZUxpc3RVbml4XCIpKTtcbmNvbnN0IG1sc2RQYXJzZXIgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vcGFyc2VMaXN0TUxTRFwiKSk7XG4vKipcbiAqIEF2YWlsYWJsZSBkaXJlY3RvcnkgbGlzdGluZyBwYXJzZXJzLiBUaGVzZSBhcmUgY2FuZGlkYXRlcyB0aGF0IHdpbGwgYmUgdGVzdGVkXG4gKiBpbiB0aGUgb3JkZXIgcHJlc2VudGVkLiBUaGUgZmlyc3QgY2FuZGlkYXRlIHdpbGwgYmUgdXNlZCB0byBwYXJzZSB0aGUgd2hvbGUgbGlzdC5cbiAqL1xuY29uc3QgYXZhaWxhYmxlUGFyc2VycyA9IFtcbiAgICBkb3NQYXJzZXIsXG4gICAgdW5peFBhcnNlcixcbiAgICBtbHNkUGFyc2VyIC8vIEtlZXAgTUxTRCBsYXN0LCBtYXkgYWNjZXB0IGZpbGVuYW1lIG9ubHlcbl07XG5mdW5jdGlvbiBmaXJzdENvbXBhdGlibGVQYXJzZXIobGluZSwgcGFyc2Vycykge1xuICAgIHJldHVybiBwYXJzZXJzLmZpbmQocGFyc2VyID0+IHBhcnNlci50ZXN0TGluZShsaW5lKSA9PT0gdHJ1ZSk7XG59XG5mdW5jdGlvbiBpc05vdEJsYW5rKHN0cikge1xuICAgIHJldHVybiBzdHIudHJpbSgpICE9PSBcIlwiO1xufVxuZnVuY3Rpb24gaXNOb3RNZXRhKHN0cikge1xuICAgIHJldHVybiAhc3RyLnN0YXJ0c1dpdGgoXCJ0b3RhbFwiKTtcbn1cbmNvbnN0IFJFR0VYX05FV0xJTkUgPSAvXFxyP1xcbi87XG4vKipcbiAqIFBhcnNlIHJhdyBkaXJlY3RvcnkgbGlzdGluZy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VMaXN0KHJhd0xpc3QpIHtcbiAgICBjb25zdCBsaW5lcyA9IHJhd0xpc3RcbiAgICAgICAgLnNwbGl0KFJFR0VYX05FV0xJTkUpXG4gICAgICAgIC5maWx0ZXIoaXNOb3RCbGFuaylcbiAgICAgICAgLmZpbHRlcihpc05vdE1ldGEpO1xuICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCB0ZXN0TGluZSA9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHBhcnNlciA9IGZpcnN0Q29tcGF0aWJsZVBhcnNlcih0ZXN0TGluZSwgYXZhaWxhYmxlUGFyc2Vycyk7XG4gICAgaWYgKCFwYXJzZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBsaWJyYXJ5IG9ubHkgc3VwcG9ydHMgTUxTRCwgVW5peC0gb3IgRE9TLXN0eWxlIGRpcmVjdG9yeSBsaXN0aW5nLiBZb3VyIEZUUCBzZXJ2ZXIgc2VlbXMgdG8gYmUgdXNpbmcgYW5vdGhlciBmb3JtYXQuIFlvdSBjYW4gc2VlIHRoZSB0cmFuc21pdHRlZCBsaXN0aW5nIHdoZW4gc2V0dGluZyBgY2xpZW50LmZ0cC52ZXJib3NlID0gdHJ1ZWAuIFlvdSBjYW4gdGhlbiBwcm92aWRlIGEgY3VzdG9tIHBhcnNlciB0byBgY2xpZW50LnBhcnNlTGlzdGAsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy5cIik7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVzID0gbGluZXNcbiAgICAgICAgLm1hcChwYXJzZXIucGFyc2VMaW5lKVxuICAgICAgICAuZmlsdGVyKChpbmZvKSA9PiBpbmZvICE9PSB1bmRlZmluZWQpO1xuICAgIHJldHVybiBwYXJzZXIudHJhbnNmb3JtTGlzdChmaWxlcyk7XG59XG5leHBvcnRzLnBhcnNlTGlzdCA9IHBhcnNlTGlzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50cmFuc2Zvcm1MaXN0ID0gZXhwb3J0cy5wYXJzZUxpbmUgPSBleHBvcnRzLnRlc3RMaW5lID0gdm9pZCAwO1xuY29uc3QgRmlsZUluZm9fMSA9IHJlcXVpcmUoXCIuL0ZpbGVJbmZvXCIpO1xuLyoqXG4gKiBUaGlzIHBhcnNlciBpcyBiYXNlZCBvbiB0aGUgRlRQIGNsaWVudCBsaWJyYXJ5IHNvdXJjZSBjb2RlIGluIEFwYWNoZSBDb21tb25zIE5ldCBwcm92aWRlZFxuICogdW5kZXIgdGhlIEFwYWNoZSAyLjAgbGljZW5zZS4gSXQgaGFzIGJlZW4gc2ltcGxpZmllZCBhbmQgcmV3cml0dGVuIHRvIGJldHRlciBmaXQgdGhlIEphdmFzY3JpcHQgbGFuZ3VhZ2UuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jb21tb25zLW5ldC9ibG9iL21hc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9uZXQvZnRwL3BhcnNlci9OVEZUUEVudHJ5UGFyc2VyLmphdmFcbiAqL1xuY29uc3QgUkVfTElORSA9IG5ldyBSZWdFeHAoXCIoXFxcXFMrKVxcXFxzKyhcXFxcUyspXFxcXHMrXCIgLy8gTU0tZGQteXkgd2hpdGVzcGFjZSBoaDptbWF8a2s6bW0gc3dhbGxvdyB0cmFpbGluZyBzcGFjZXNcbiAgICArIFwiKD86KDxESVI+KXwoWzAtOV0rKSlcXFxccytcIiAvLyA8RElSPiBvciBkZGRkZCBzd2FsbG93IHRyYWlsaW5nIHNwYWNlc1xuICAgICsgXCIoXFxcXFMuKilcIiAvLyBGaXJzdCBub24tc3BhY2UgZm9sbG93ZWQgYnkgcmVzdCBvZiBsaW5lIChuYW1lKVxuKTtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgZ2l2ZW4gbGluZSBtaWdodCBiZSBhIERPUy1zdHlsZSBsaXN0aW5nLlxuICpcbiAqIC0gRXhhbXBsZTogYDEyLTA1LTk2ICAwNTowM1BNICAgICAgIDxESVI+ICAgICAgICAgIG15RGlyYFxuICovXG5mdW5jdGlvbiB0ZXN0TGluZShsaW5lKSB7XG4gICAgcmV0dXJuIC9eXFxkezJ9Ly50ZXN0KGxpbmUpICYmIFJFX0xJTkUudGVzdChsaW5lKTtcbn1cbmV4cG9ydHMudGVzdExpbmUgPSB0ZXN0TGluZTtcbi8qKlxuICogUGFyc2UgYSBzaW5nbGUgbGluZSBvZiBhIERPUy1zdHlsZSBkaXJlY3RvcnkgbGlzdGluZy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VMaW5lKGxpbmUpIHtcbiAgICBjb25zdCBncm91cHMgPSBsaW5lLm1hdGNoKFJFX0xJTkUpO1xuICAgIGlmIChncm91cHMgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGdyb3Vwc1s1XTtcbiAgICBpZiAobmFtZSA9PT0gXCIuXCIgfHwgbmFtZSA9PT0gXCIuLlwiKSB7IC8vIElnbm9yZSBwYXJlbnQgZGlyZWN0b3J5IGxpbmtzXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZUluZm9fMS5GaWxlSW5mbyhuYW1lKTtcbiAgICBjb25zdCBmaWxlVHlwZSA9IGdyb3Vwc1szXTtcbiAgICBpZiAoZmlsZVR5cGUgPT09IFwiPERJUj5cIikge1xuICAgICAgICBmaWxlLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLkRpcmVjdG9yeTtcbiAgICAgICAgZmlsZS5zaXplID0gMDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZpbGUudHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuRmlsZTtcbiAgICAgICAgZmlsZS5zaXplID0gcGFyc2VJbnQoZ3JvdXBzWzRdLCAxMCk7XG4gICAgfVxuICAgIGZpbGUucmF3TW9kaWZpZWRBdCA9IGdyb3Vwc1sxXSArIFwiIFwiICsgZ3JvdXBzWzJdO1xuICAgIHJldHVybiBmaWxlO1xufVxuZXhwb3J0cy5wYXJzZUxpbmUgPSBwYXJzZUxpbmU7XG5mdW5jdGlvbiB0cmFuc2Zvcm1MaXN0KGZpbGVzKSB7XG4gICAgcmV0dXJuIGZpbGVzO1xufVxuZXhwb3J0cy50cmFuc2Zvcm1MaXN0ID0gdHJhbnNmb3JtTGlzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZU1MU3hEYXRlID0gZXhwb3J0cy50cmFuc2Zvcm1MaXN0ID0gZXhwb3J0cy5wYXJzZUxpbmUgPSBleHBvcnRzLnRlc3RMaW5lID0gdm9pZCAwO1xuY29uc3QgRmlsZUluZm9fMSA9IHJlcXVpcmUoXCIuL0ZpbGVJbmZvXCIpO1xuZnVuY3Rpb24gcGFyc2VTaXplKHZhbHVlLCBpbmZvKSB7XG4gICAgaW5mby5zaXplID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbn1cbi8qKlxuICogUGFyc2VycyBmb3IgTUxTRCBmYWN0cy5cbiAqL1xuY29uc3QgZmFjdEhhbmRsZXJzQnlOYW1lID0ge1xuICAgIFwic2l6ZVwiOiBwYXJzZVNpemUsIC8vIEZpbGUgc2l6ZVxuICAgIFwic2l6ZFwiOiBwYXJzZVNpemUsIC8vIERpcmVjdG9yeSBzaXplXG4gICAgXCJ1bmlxdWVcIjogKHZhbHVlLCBpbmZvKSA9PiB7XG4gICAgICAgIGluZm8udW5pcXVlSUQgPSB2YWx1ZTtcbiAgICB9LFxuICAgIFwibW9kaWZ5XCI6ICh2YWx1ZSwgaW5mbykgPT4ge1xuICAgICAgICBpbmZvLm1vZGlmaWVkQXQgPSBwYXJzZU1MU3hEYXRlKHZhbHVlKTtcbiAgICAgICAgaW5mby5yYXdNb2RpZmllZEF0ID0gaW5mby5tb2RpZmllZEF0LnRvSVNPU3RyaW5nKCk7XG4gICAgfSxcbiAgICBcInR5cGVcIjogKHZhbHVlLCBpbmZvKSA9PiB7XG4gICAgICAgIC8vIFRoZXJlIHNlZW1zIHRvIGJlIGNvbmZ1c2lvbiBvbiBob3cgdG8gaGFuZGxlIHN5bWJvbGljIGxpbmtzIGZvciBVbml4LiBSRkMgMzY1OSBkb2Vzbid0IGRlc2NyaWJlXG4gICAgICAgIC8vIHRoaXMgYnV0IG1lbnRpb25zIHNvbWUgZXhhbXBsZXMgdXNpbmcgdGhlIHN5bnRheCBgdHlwZT1PUy51bml4PXNsaW5rOjx0YXJnZXQ+YC4gQnV0IGFjY29yZGluZyB0b1xuICAgICAgICAvLyBhbiBlbnRyeSBpbiB0aGUgRXJyYXRhIChodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9lcnJhdGEvZWlkMTUwMCkgdGhpcyBzeW50YXggY2FuJ3QgYmUgdmFsaWQuXG4gICAgICAgIC8vIEluc3RlYWQgaXQgcHJvcG9zZXMgdG8gdXNlIGB0eXBlPU9TLnVuaXg9c3ltbGlua2AgYW5kIHRvIHRoZW4gbGlzdCB0aGUgYWN0dWFsIHRhcmdldCBvZiB0aGVcbiAgICAgICAgLy8gc3ltYm9saWMgbGluayBhcyBhbm90aGVyIGVudHJ5IGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZy4gVGhlIHVuaXF1ZSBpZGVudGlmaWVycyBjYW4gdGhlbiBiZSB1c2VkXG4gICAgICAgIC8vIHRvIGRlcml2ZSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIGxpbmsocykgYW5kIHRhcmdldC4gV2UnbGwgaGF2ZSB0byBoYW5kbGUgYm90aCBjYXNlcyBhcyB0aGVyZVxuICAgICAgICAvLyBhcmUgZGlmZmVyaW5nIG9waW5pb25zIG9uIGhvdyB0byBkZWFsIHdpdGggdGhpcy4gSGVyZSBhcmUgc29tZSBsaW5rcyBvbiB0aGlzIHRvcGljOlxuICAgICAgICAvLyAtIFByb0ZUUEQgc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vcHJvZnRwZC9wcm9mdHBkL2Jsb2IvNTZlNmRmYTU5OGNiZDRlZjVjNmNiYTQzOWJjYmNkNTNhNjNlM2IyMS9tb2R1bGVzL21vZF9mYWN0cy5jI0w1MzFcbiAgICAgICAgLy8gLSBQcm9GVFBEIGJ1ZzogaHR0cDovL2J1Z3MucHJvZnRwZC5vcmcvc2hvd19idWcuY2dpP2lkPTMzMThcbiAgICAgICAgLy8gLSBQcm9GVFBEIHN0YXRlbWVudDogaHR0cDovL3d3dy5wcm9mdHBkLm9yZy9kb2NzL21vZHVsZXMvbW9kX2ZhY3RzLmh0bWxcbiAgICAgICAgLy8g4oCTIEZpbGVaaWxsYSBidWc6IGh0dHBzOi8vdHJhYy5maWxlemlsbGEtcHJvamVjdC5vcmcvdGlja2V0LzkzMTBcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCJPUy51bml4PXNsaW5rXCIpKSB7XG4gICAgICAgICAgICBpbmZvLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLlN5bWJvbGljTGluaztcbiAgICAgICAgICAgIGluZm8ubGluayA9IHZhbHVlLnN1YnN0cih2YWx1ZS5pbmRleE9mKFwiOlwiKSArIDEpO1xuICAgICAgICAgICAgcmV0dXJuIDEgLyogRmFjdEhhbmRsZXJSZXN1bHQuQ29udGludWUgKi87XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgICAgICAgICBpbmZvLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLkZpbGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZGlyXCI6XG4gICAgICAgICAgICAgICAgaW5mby50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5EaXJlY3Rvcnk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiT1MudW5peD1zeW1saW5rXCI6XG4gICAgICAgICAgICAgICAgaW5mby50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5TeW1ib2xpY0xpbms7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBvZiB0aGUgc3ltYm9saWMgbGluayBtaWdodCBiZSBkZWZpbmVkIGluIGFub3RoZXIgbGluZSBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcuXG4gICAgICAgICAgICAgICAgLy8gV2UnbGwgaGFuZGxlIHRoaXMgaW4gYHRyYW5zZm9ybUxpc3QoKWAgYmVsb3cuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiY2RpclwiOiAvLyBDdXJyZW50IGRpcmVjdG9yeSBiZWluZyBsaXN0ZWRcbiAgICAgICAgICAgIGNhc2UgXCJwZGlyXCI6IC8vIFBhcmVudCBkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICByZXR1cm4gMiAvKiBGYWN0SGFuZGxlclJlc3VsdC5JZ25vcmVGaWxlICovOyAvLyBEb24ndCBpbmNsdWRlIHRoZXNlIGVudHJpZXMgaW4gdGhlIGxpc3RpbmdcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaW5mby50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5Vbmtub3duO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAxIC8qIEZhY3RIYW5kbGVyUmVzdWx0LkNvbnRpbnVlICovO1xuICAgIH0sXG4gICAgXCJ1bml4Lm1vZGVcIjogKHZhbHVlLCBpbmZvKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpZ2l0cyA9IHZhbHVlLnN1YnN0cigtMyk7XG4gICAgICAgIGluZm8ucGVybWlzc2lvbnMgPSB7XG4gICAgICAgICAgICB1c2VyOiBwYXJzZUludChkaWdpdHNbMF0sIDEwKSxcbiAgICAgICAgICAgIGdyb3VwOiBwYXJzZUludChkaWdpdHNbMV0sIDEwKSxcbiAgICAgICAgICAgIHdvcmxkOiBwYXJzZUludChkaWdpdHNbMl0sIDEwKVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgXCJ1bml4Lm93bmVybmFtZVwiOiAodmFsdWUsIGluZm8pID0+IHtcbiAgICAgICAgaW5mby51c2VyID0gdmFsdWU7XG4gICAgfSxcbiAgICBcInVuaXgub3duZXJcIjogKHZhbHVlLCBpbmZvKSA9PiB7XG4gICAgICAgIGlmIChpbmZvLnVzZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGluZm8udXNlciA9IHZhbHVlO1xuICAgIH0sXG4gICAgZ2V0IFwidW5peC51aWRcIigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbXCJ1bml4Lm93bmVyXCJdO1xuICAgIH0sXG4gICAgXCJ1bml4Lmdyb3VwbmFtZVwiOiAodmFsdWUsIGluZm8pID0+IHtcbiAgICAgICAgaW5mby5ncm91cCA9IHZhbHVlO1xuICAgIH0sXG4gICAgXCJ1bml4Lmdyb3VwXCI6ICh2YWx1ZSwgaW5mbykgPT4ge1xuICAgICAgICBpZiAoaW5mby5ncm91cCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgaW5mby5ncm91cCA9IHZhbHVlO1xuICAgIH0sXG4gICAgZ2V0IFwidW5peC5naWRcIigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbXCJ1bml4Lmdyb3VwXCJdO1xuICAgIH1cbiAgICAvLyBSZWdhcmRpbmcgdGhlIGZhY3QgXCJwZXJtXCI6XG4gICAgLy8gV2UgZG9uJ3QgaGFuZGxlIHBlcm1pc3Npb24gaW5mb3JtYXRpb24gc3RvcmVkIGluIFwicGVybVwiIGJlY2F1c2UgaXRzIGluZm9ybWF0aW9uIGlzIGNvbmNlcHR1YWxseVxuICAgIC8vIGRpZmZlcmVudCBmcm9tIHdoYXQgdXNlcnMgb2YgRlRQIGNsaWVudHMgdXN1YWxseSBhc3NvY2lhdGUgd2l0aCBcInBlcm1pc3Npb25zXCIuIFRob3NlIHRoYXQgaGF2ZVxuICAgIC8vIHNvbWUgZXhwZWN0YXRpb25zIChhbmQgcHJvYmFibHkgd2FudCB0byBlZGl0IHRoZW0gd2l0aCBhIFNJVEUgY29tbWFuZCkgb2Z0ZW4gdW5rbm93aW5nbHkgZXhwZWN0XG4gICAgLy8gdGhlIFVuaXggcGVybWlzc2lvbiBzeXN0ZW0uIFRoZSBpbmZvcm1hdGlvbiBwYXNzZWQgYnkgXCJwZXJtXCIgZGVzY3JpYmVzIHdoYXQgRlRQIGNvbW1hbmRzIGNhbiBiZVxuICAgIC8vIGV4ZWN1dGVkIHdpdGggYSBmaWxlL2RpcmVjdG9yeS4gQnV0IGV2ZW4gdGhpcyBjYW4gYmUgZWl0aGVyIGluY29tcGxldGUgb3IganVzdCBtZWFudCBhcyBhIFwiZ3VpZGVcIlxuICAgIC8vIGFzIHRoZSBzcGVjIG1lbnRpb25zLiBGcm9tIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNjU5I3NlY3Rpb24tNy41LjU6IFwiVGhlIHBlcm1pc3Npb25zIGFyZVxuICAgIC8vIGRlc2NyaWJlZCBoZXJlIGFzIHRoZXkgYXBwbHkgdG8gRlRQIGNvbW1hbmRzLiBUaGV5IG1heSBub3QgbWFwIGVhc2lseSBpbnRvIHBhcnRpY3VsYXIgcGVybWlzc2lvbnNcbiAgICAvLyBhdmFpbGFibGUgb24gdGhlIHNlcnZlcidzIG9wZXJhdGluZyBzeXN0ZW0uXCIgVGhlIHBhcnNlciBieSBBcGFjaGUgQ29tbW9ucyB0cmllcyB0byB0cmFuc2xhdGUgdGhlc2VcbiAgICAvLyB0byBVbml4IHBlcm1pc3Npb25zIOKAkyB0aGlzIGlzIG1pc2xlYWRpbmcgdXNlcnMgYW5kIG1pZ2h0IG5vdCBldmVuIGJlIGNvcnJlY3QuXG59O1xuLyoqXG4gKiBTcGxpdCBhIHN0cmluZyBvbmNlIGF0IHRoZSBmaXJzdCBwb3NpdGlvbiBvZiBhIGRlbGltaXRlci4gRm9yIGV4YW1wbGVcbiAqIGBzcGxpdFN0cmluZ09uY2UoXCJhIGIgYyBkXCIsIFwiIFwiKWAgcmV0dXJucyBgW1wiYVwiLCBcImIgYyBkXCJdYC5cbiAqL1xuZnVuY3Rpb24gc3BsaXRTdHJpbmdPbmNlKHN0ciwgZGVsaW1pdGVyKSB7XG4gICAgY29uc3QgcG9zID0gc3RyLmluZGV4T2YoZGVsaW1pdGVyKTtcbiAgICBjb25zdCBhID0gc3RyLnN1YnN0cigwLCBwb3MpO1xuICAgIGNvbnN0IGIgPSBzdHIuc3Vic3RyKHBvcyArIGRlbGltaXRlci5sZW5ndGgpO1xuICAgIHJldHVybiBbYSwgYl07XG59XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhIGdpdmVuIGxpbmUgbWlnaHQgYmUgcGFydCBvZiBhbiBNTFNEIGxpc3RpbmcuXG4gKlxuICogLSBFeGFtcGxlIDE6IGBzaXplPTE1MjI3O3R5cGU9ZGlyO3Blcm09ZWw7bW9kaWZ5PTIwMTkwNDE5MDY1NzMwOyB0ZXN0IG9uZWBcbiAqIC0gRXhhbXBsZSAyOiBgIGZpbGUgbmFtZWAgKGxlYWRpbmcgc3BhY2UpXG4gKi9cbmZ1bmN0aW9uIHRlc3RMaW5lKGxpbmUpIHtcbiAgICByZXR1cm4gL15cXFMrPVxcUys7Ly50ZXN0KGxpbmUpIHx8IGxpbmUuc3RhcnRzV2l0aChcIiBcIik7XG59XG5leHBvcnRzLnRlc3RMaW5lID0gdGVzdExpbmU7XG4vKipcbiAqIFBhcnNlIHNpbmdsZSBsaW5lIGFzIE1MU0QgbGlzdGluZywgc2VlIHNwZWNpZmljYXRpb24gYXQgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM2NTkjc2VjdGlvbi03LlxuICovXG5mdW5jdGlvbiBwYXJzZUxpbmUobGluZSkge1xuICAgIGNvbnN0IFtwYWNrZWRGYWN0cywgbmFtZV0gPSBzcGxpdFN0cmluZ09uY2UobGluZSwgXCIgXCIpO1xuICAgIGlmIChuYW1lID09PSBcIlwiIHx8IG5hbWUgPT09IFwiLlwiIHx8IG5hbWUgPT09IFwiLi5cIikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBpbmZvID0gbmV3IEZpbGVJbmZvXzEuRmlsZUluZm8obmFtZSk7XG4gICAgY29uc3QgZmFjdHMgPSBwYWNrZWRGYWN0cy5zcGxpdChcIjtcIik7XG4gICAgZm9yIChjb25zdCBmYWN0IG9mIGZhY3RzKSB7XG4gICAgICAgIGNvbnN0IFtmYWN0TmFtZSwgZmFjdFZhbHVlXSA9IHNwbGl0U3RyaW5nT25jZShmYWN0LCBcIj1cIik7XG4gICAgICAgIGlmICghZmFjdFZhbHVlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmYWN0SGFuZGxlciA9IGZhY3RIYW5kbGVyc0J5TmFtZVtmYWN0TmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgaWYgKCFmYWN0SGFuZGxlcikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZmFjdEhhbmRsZXIoZmFjdFZhbHVlLCBpbmZvKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gMiAvKiBGYWN0SGFuZGxlclJlc3VsdC5JZ25vcmVGaWxlICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xufVxuZXhwb3J0cy5wYXJzZUxpbmUgPSBwYXJzZUxpbmU7XG5mdW5jdGlvbiB0cmFuc2Zvcm1MaXN0KGZpbGVzKSB7XG4gICAgLy8gQ3JlYXRlIGEgbWFwIG9mIGFsbCBmaWxlcyB0aGF0IGFyZSBub3Qgc3ltYm9saWMgbGlua3MgYnkgdGhlaXIgdW5pcXVlIElEXG4gICAgY29uc3Qgbm9uTGlua3NCeUlEID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBpZiAoIWZpbGUuaXNTeW1ib2xpY0xpbmsgJiYgZmlsZS51bmlxdWVJRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBub25MaW5rc0J5SUQuc2V0KGZpbGUudW5pcXVlSUQsIGZpbGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkRmlsZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGFzc29jaWF0ZSB1bnJlc29sdmVkIHN5bWJvbGljIGxpbmtzIHdpdGggYSB0YXJnZXQgZmlsZS9kaXJlY3RvcnkuXG4gICAgICAgIGlmIChmaWxlLmlzU3ltYm9saWNMaW5rICYmIGZpbGUudW5pcXVlSUQgIT09IHVuZGVmaW5lZCAmJiBmaWxlLmxpbmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gbm9uTGlua3NCeUlELmdldChmaWxlLnVuaXF1ZUlEKTtcbiAgICAgICAgICAgIGlmICh0YXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZpbGUubGluayA9IHRhcmdldC5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSB0YXJnZXQgb2YgYSBzeW1ib2xpYyBsaW5rIGlzIGxpc3RlZCBhcyBhbiBlbnRyeSBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcgYnV0IG1pZ2h0XG4gICAgICAgIC8vIGhhdmUgYSBwYXRoIHBvaW50aW5nIG91dHNpZGUgb2YgdGhpcyBkaXJlY3RvcnkuIEluIHRoYXQgY2FzZSB3ZSBkb24ndCB3YW50IHRoaXMgZW50cnlcbiAgICAgICAgLy8gdG8gYmUgcGFydCBvZiB0aGUgbGlzdGluZy4gV2UgZ2VuZXJhbGx5IGRvbid0IHdhbnQgdGhlc2Uga2luZCBvZiBlbnRyaWVzIGF0IGFsbC5cbiAgICAgICAgY29uc3QgaXNQYXJ0T2ZEaXJlY3RvcnkgPSAhZmlsZS5uYW1lLmluY2x1ZGVzKFwiL1wiKTtcbiAgICAgICAgaWYgKGlzUGFydE9mRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICByZXNvbHZlZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkRmlsZXM7XG59XG5leHBvcnRzLnRyYW5zZm9ybUxpc3QgPSB0cmFuc2Zvcm1MaXN0O1xuLyoqXG4gKiBQYXJzZSBkYXRlIGFzIHNwZWNpZmllZCBpbiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzY1OSNzZWN0aW9uLTIuMy5cbiAqXG4gKiBNZXNzYWdlIGNvbnRhaW5zIHJlc3BvbnNlIGNvZGUgYW5kIG1vZGlmaWVkIHRpbWUgaW4gdGhlIGZvcm1hdDogWVlZWU1NRERISE1NU1NbLnNzc11cbiAqIEZvciBleGFtcGxlIGAxOTk5MTAwNTIxMzEwMmAgb3IgYDE5OTgwNjE1MTAwMDQ1LjAxNGAuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTUxTeERhdGUoZmFjdCkge1xuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQygrZmFjdC5zbGljZSgwLCA0KSwgLy8gWWVhclxuICAgICtmYWN0LnNsaWNlKDQsIDYpIC0gMSwgLy8gTW9udGhcbiAgICArZmFjdC5zbGljZSg2LCA4KSwgLy8gRGF0ZVxuICAgICtmYWN0LnNsaWNlKDgsIDEwKSwgLy8gSG91cnNcbiAgICArZmFjdC5zbGljZSgxMCwgMTIpLCAvLyBNaW51dGVzXG4gICAgK2ZhY3Quc2xpY2UoMTIsIDE0KSwgLy8gU2Vjb25kc1xuICAgICtmYWN0LnNsaWNlKDE1LCAxOCkgLy8gTWlsbGlzZWNvbmRzXG4gICAgKSk7XG59XG5leHBvcnRzLnBhcnNlTUxTeERhdGUgPSBwYXJzZU1MU3hEYXRlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnRyYW5zZm9ybUxpc3QgPSBleHBvcnRzLnBhcnNlTGluZSA9IGV4cG9ydHMudGVzdExpbmUgPSB2b2lkIDA7XG5jb25zdCBGaWxlSW5mb18xID0gcmVxdWlyZShcIi4vRmlsZUluZm9cIik7XG5jb25zdCBKQV9NT05USCA9IFwiXFx1NjcwOFwiO1xuY29uc3QgSkFfREFZID0gXCJcXHU2NWU1XCI7XG5jb25zdCBKQV9ZRUFSID0gXCJcXHU1ZTc0XCI7XG4vKipcbiAqIFRoaXMgcGFyc2VyIGlzIGJhc2VkIG9uIHRoZSBGVFAgY2xpZW50IGxpYnJhcnkgc291cmNlIGNvZGUgaW4gQXBhY2hlIENvbW1vbnMgTmV0IHByb3ZpZGVkXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlLiBJdCBoYXMgYmVlbiBzaW1wbGlmaWVkIGFuZCByZXdyaXR0ZW4gdG8gYmV0dGVyIGZpdCB0aGUgSmF2YXNjcmlwdCBsYW5ndWFnZS5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvbW1vbnMtbmV0L2Jsb2IvbWFzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL25ldC9mdHAvcGFyc2VyL1VuaXhGVFBFbnRyeVBhcnNlci5qYXZhXG4gKlxuICogQmVsb3cgaXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGJ5IHRoaXMgcGFyc2VyLlxuICpcbiAqIFBlcm1pc3Npb25zOlxuICogICAgciAgIHRoZSBmaWxlIGlzIHJlYWRhYmxlXG4gKiAgICB3ICAgdGhlIGZpbGUgaXMgd3JpdGFibGVcbiAqICAgIHggICB0aGUgZmlsZSBpcyBleGVjdXRhYmxlXG4gKiAgICAtICAgdGhlIGluZGljYXRlZCBwZXJtaXNzaW9uIGlzIG5vdCBncmFudGVkXG4gKiAgICBMICAgbWFuZGF0b3J5IGxvY2tpbmcgb2NjdXJzIGR1cmluZyBhY2Nlc3MgKHRoZSBzZXQtZ3JvdXAtSUQgYml0IGlzXG4gKiAgICAgICAgb24gYW5kIHRoZSBncm91cCBleGVjdXRpb24gYml0IGlzIG9mZilcbiAqICAgIHMgICB0aGUgc2V0LXVzZXItSUQgb3Igc2V0LWdyb3VwLUlEIGJpdCBpcyBvbiwgYW5kIHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICAgICAgdXNlciBvciBncm91cCBleGVjdXRpb24gYml0IGlzIGFsc28gb25cbiAqICAgIFMgICB1bmRlZmluZWQgYml0LXN0YXRlICh0aGUgc2V0LXVzZXItSUQgYml0IGlzIG9uIGFuZCB0aGUgdXNlclxuICogICAgICAgIGV4ZWN1dGlvbiBiaXQgaXMgb2ZmKVxuICogICAgdCAgIHRoZSAxMDAwIChvY3RhbCkgYml0LCBvciBzdGlja3kgYml0LCBpcyBvbiBbc2VlIGNobW9kKDEpXSwgYW5kXG4gKiAgICAgICAgZXhlY3V0aW9uIGlzIG9uXG4gKiAgICBUICAgdGhlIDEwMDAgYml0IGlzIHR1cm5lZCBvbiwgYW5kIGV4ZWN1dGlvbiBpcyBvZmYgKHVuZGVmaW5lZCBiaXQtXG4gKiAgICAgICAgc3RhdGUpXG4gKiAgICBlICAgei9PUyBleHRlcm5hbCBsaW5rIGJpdFxuICogICAgRmluYWwgbGV0dGVyIG1heSBiZSBhcHBlbmRlZDpcbiAqICAgICsgICBmaWxlIGhhcyBleHRlbmRlZCBzZWN1cml0eSBhdHRyaWJ1dGVzIChlLmcuIEFDTClcbiAqICAgIE5vdGU6IGxvY2FsIGxpc3RpbmdzIG9uIE1hY09TWCBhbHNvIHVzZSAnQCdcbiAqICAgIHRoaXMgaXMgbm90IGFsbG93ZWQgZm9yIGhlcmUgYXMgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHNob3duIGJ5IEZUUCBzZXJ2ZXJzXG4gKiAgICB7QGNvZGUgQH0gICBmaWxlIGhhcyBleHRlbmRlZCBhdHRyaWJ1dGVzXG4gKi9cbmNvbnN0IFJFX0xJTkUgPSBuZXcgUmVnRXhwKFwiKFtiY2RlbGZtcFNzLV0pXCIgLy8gZmlsZSB0eXBlXG4gICAgKyBcIigoKHJ8LSkod3wtKShbeHNTdFRMLV0pKSgocnwtKSh3fC0pKFt4c1N0VEwtXSkpKChyfC0pKHd8LSkoW3hzU3RUTC1dPykpKVxcXFwrP1wiIC8vIHBlcm1pc3Npb25zXG4gICAgKyBcIlxcXFxzKlwiIC8vIHNlcGFyYXRvciBUT0RPIHdoeSBhbGxvdyBpdCB0byBiZSBvbWl0dGVkPz9cbiAgICArIFwiKFxcXFxkKylcIiAvLyBsaW5rIGNvdW50XG4gICAgKyBcIlxcXFxzK1wiIC8vIHNlcGFyYXRvclxuICAgICsgXCIoPzooXFxcXFMrKD86XFxcXHNcXFxcUyspKj8pXFxcXHMrKT9cIiAvLyBvd25lciBuYW1lIChvcHRpb25hbCBzcGFjZXMpXG4gICAgKyBcIig/OihcXFxcUysoPzpcXFxcc1xcXFxTKykqKVxcXFxzKyk/XCIgLy8gZ3JvdXAgbmFtZSAob3B0aW9uYWwgc3BhY2VzKVxuICAgICsgXCIoXFxcXGQrKD86LFxcXFxzKlxcXFxkKyk/KVwiIC8vIHNpemUgb3IgbixtXG4gICAgKyBcIlxcXFxzK1wiIC8vIHNlcGFyYXRvclxuICAgIC8qKlxuICAgICAqIG51bWVyaWMgb3Igc3RhbmRhcmQgZm9ybWF0IGRhdGU6XG4gICAgICogICB5eXl5LW1tLWRkIChleHBlY3RpbmcgaGg6bW0gdG8gZm9sbG93KVxuICAgICAqICAgTU1NIFtkXWRcbiAgICAgKiAgIFtkXWQgTU1NXG4gICAgICogICBOLkIuIHVzZSBub24tc3BhY2UgZm9yIE1NTSB0byBhbGxvdyBmb3IgbGFuZ3VhZ2VzIHN1Y2ggYXMgR2VybWFuIHdoaWNoIHVzZVxuICAgICAqICAgZGlhY3JpdGljcyAoZS5nLiB1bWxhdXQpIGluIHNvbWUgYWJicmV2aWF0aW9ucy5cbiAgICAgKiAgIEphcGFuZXNlIHVzZXMgbnVtZXJpYyBkYXkgYW5kIG1vbnRoIHdpdGggc3VmZml4ZXMgdG8gZGlzdGluZ3Vpc2ggdGhlbVxuICAgICAqICAgW2RdZFhYIFtkXWRaWlxuICAgICAqL1xuICAgICsgXCIoXCIgK1xuICAgIFwiKD86XFxcXGQrWy0vXVxcXFxkK1stL11cXFxcZCspXCIgKyAvLyB5eXl5LW1tLWRkXG4gICAgXCJ8KD86XFxcXFN7M31cXFxccytcXFxcZHsxLDJ9KVwiICsgLy8gTU1NIFtkXWRcbiAgICBcInwoPzpcXFxcZHsxLDJ9XFxcXHMrXFxcXFN7M30pXCIgKyAvLyBbZF1kIE1NTVxuICAgIFwifCg/OlxcXFxkezEsMn1cIiArIEpBX01PTlRIICsgXCJcXFxccytcXFxcZHsxLDJ9XCIgKyBKQV9EQVkgKyBcIilcIiArXG4gICAgXCIpXCJcbiAgICArIFwiXFxcXHMrXCIgLy8gc2VwYXJhdG9yXG4gICAgLyoqXG4gICAgICogeWVhciAoZm9yIG5vbi1yZWNlbnQgc3RhbmRhcmQgZm9ybWF0KSAtIHl5eXlcbiAgICAgKiBvciB0aW1lIChmb3IgbnVtZXJpYyBvciByZWNlbnQgc3RhbmRhcmQgZm9ybWF0KSBbaF1oOm1tXG4gICAgICogb3IgSmFwYW5lc2UgeWVhciAtIHl5eXlYWFxuICAgICAqL1xuICAgICsgXCIoKD86XFxcXGQrKD86OlxcXFxkKyk/KXwoPzpcXFxcZHs0fVwiICsgSkFfWUVBUiArIFwiKSlcIiAvLyAoMjApXG4gICAgKyBcIlxcXFxzXCIgLy8gc2VwYXJhdG9yXG4gICAgKyBcIiguKilcIik7IC8vIHRoZSByZXN0ICgyMSlcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgZ2l2ZW4gbGluZSBtaWdodCBiZSBhIFVuaXgtc3R5bGUgbGlzdGluZy5cbiAqXG4gKiAtIEV4YW1wbGU6IGAtcnctci0tci0tKyAgIDEgcGF0cmljayAgc3RhZmYgICAxMDU3IERlYyAxMSAxNDozNSB0ZXN0LnR4dGBcbiAqL1xuZnVuY3Rpb24gdGVzdExpbmUobGluZSkge1xuICAgIHJldHVybiBSRV9MSU5FLnRlc3QobGluZSk7XG59XG5leHBvcnRzLnRlc3RMaW5lID0gdGVzdExpbmU7XG4vKipcbiAqIFBhcnNlIGEgc2luZ2xlIGxpbmUgb2YgYSBVbml4LXN0eWxlIGRpcmVjdG9yeSBsaXN0aW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZUxpbmUobGluZSkge1xuICAgIGNvbnN0IGdyb3VwcyA9IGxpbmUubWF0Y2goUkVfTElORSk7XG4gICAgaWYgKGdyb3VwcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gZ3JvdXBzWzIxXTtcbiAgICBpZiAobmFtZSA9PT0gXCIuXCIgfHwgbmFtZSA9PT0gXCIuLlwiKSB7IC8vIElnbm9yZSBwYXJlbnQgZGlyZWN0b3J5IGxpbmtzXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZUluZm9fMS5GaWxlSW5mbyhuYW1lKTtcbiAgICBmaWxlLnNpemUgPSBwYXJzZUludChncm91cHNbMThdLCAxMCk7XG4gICAgZmlsZS51c2VyID0gZ3JvdXBzWzE2XTtcbiAgICBmaWxlLmdyb3VwID0gZ3JvdXBzWzE3XTtcbiAgICBmaWxlLmhhcmRMaW5rQ291bnQgPSBwYXJzZUludChncm91cHNbMTVdLCAxMCk7XG4gICAgZmlsZS5yYXdNb2RpZmllZEF0ID0gZ3JvdXBzWzE5XSArIFwiIFwiICsgZ3JvdXBzWzIwXTtcbiAgICBmaWxlLnBlcm1pc3Npb25zID0ge1xuICAgICAgICB1c2VyOiBwYXJzZU1vZGUoZ3JvdXBzWzRdLCBncm91cHNbNV0sIGdyb3Vwc1s2XSksXG4gICAgICAgIGdyb3VwOiBwYXJzZU1vZGUoZ3JvdXBzWzhdLCBncm91cHNbOV0sIGdyb3Vwc1sxMF0pLFxuICAgICAgICB3b3JsZDogcGFyc2VNb2RlKGdyb3Vwc1sxMl0sIGdyb3Vwc1sxM10sIGdyb3Vwc1sxNF0pLFxuICAgIH07XG4gICAgLy8gU2V0IGZpbGUgdHlwZVxuICAgIHN3aXRjaCAoZ3JvdXBzWzFdLmNoYXJBdCgwKSkge1xuICAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICAgICAgZmlsZS50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5EaXJlY3Rvcnk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImVcIjogLy8gTkVULTM5ID0+IHovT1MgZXh0ZXJuYWwgbGlua1xuICAgICAgICAgICAgZmlsZS50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5TeW1ib2xpY0xpbms7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImxcIjpcbiAgICAgICAgICAgIGZpbGUudHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuU3ltYm9saWNMaW5rO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJiXCI6XG4gICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgICBmaWxlLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLkZpbGU7IC8vIFRPRE8gY2hhbmdlIHRoaXMgaWYgREVWSUNFX1RZUEUgaW1wbGVtZW50ZWRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZlwiOlxuICAgICAgICBjYXNlIFwiLVwiOlxuICAgICAgICAgICAgZmlsZS50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5GaWxlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBBICd3aGl0ZW91dCcgZmlsZSBpcyBhbiBBUlRJRklDSUFMIGVudHJ5IGluIGFueSBvZiBzZXZlcmFsIHR5cGVzIG9mXG4gICAgICAgICAgICAvLyAndHJhbnNsdWNlbnQnIGZpbGVzeXN0ZW1zLCBvZiB3aGljaCBhICd1bmlvbicgZmlsZXN5c3RlbSBpcyBvbmUuXG4gICAgICAgICAgICBmaWxlLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLlVua25vd247XG4gICAgfVxuICAgIC8vIFNlcGFyYXRlIG91dCB0aGUgbGluayBuYW1lIGZvciBzeW1ib2xpYyBsaW5rc1xuICAgIGlmIChmaWxlLmlzU3ltYm9saWNMaW5rKSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IG5hbWUuaW5kZXhPZihcIiAtPiBcIik7XG4gICAgICAgIGlmIChlbmQgIT09IC0xKSB7XG4gICAgICAgICAgICBmaWxlLm5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBlbmQpO1xuICAgICAgICAgICAgZmlsZS5saW5rID0gbmFtZS5zdWJzdHJpbmcoZW5kICsgNCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbGU7XG59XG5leHBvcnRzLnBhcnNlTGluZSA9IHBhcnNlTGluZTtcbmZ1bmN0aW9uIHRyYW5zZm9ybUxpc3QoZmlsZXMpIHtcbiAgICByZXR1cm4gZmlsZXM7XG59XG5leHBvcnRzLnRyYW5zZm9ybUxpc3QgPSB0cmFuc2Zvcm1MaXN0O1xuZnVuY3Rpb24gcGFyc2VNb2RlKHIsIHcsIHgpIHtcbiAgICBsZXQgdmFsdWUgPSAwO1xuICAgIGlmIChyICE9PSBcIi1cIikge1xuICAgICAgICB2YWx1ZSArPSBGaWxlSW5mb18xLkZpbGVJbmZvLlVuaXhQZXJtaXNzaW9uLlJlYWQ7XG4gICAgfVxuICAgIGlmICh3ICE9PSBcIi1cIikge1xuICAgICAgICB2YWx1ZSArPSBGaWxlSW5mb18xLkZpbGVJbmZvLlVuaXhQZXJtaXNzaW9uLldyaXRlO1xuICAgIH1cbiAgICBjb25zdCBleGVjVG9rZW4gPSB4LmNoYXJBdCgwKTtcbiAgICBpZiAoZXhlY1Rva2VuICE9PSBcIi1cIiAmJiBleGVjVG9rZW4udG9VcHBlckNhc2UoKSAhPT0gZXhlY1Rva2VuKSB7XG4gICAgICAgIHZhbHVlICs9IEZpbGVJbmZvXzEuRmlsZUluZm8uVW5peFBlcm1pc3Npb24uRXhlY3V0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRvd25sb2FkVG8gPSBleHBvcnRzLnVwbG9hZEZyb20gPSBleHBvcnRzLmNvbm5lY3RGb3JQYXNzaXZlVHJhbnNmZXIgPSBleHBvcnRzLnBhcnNlUGFzdlJlc3BvbnNlID0gZXhwb3J0cy5lbnRlclBhc3NpdmVNb2RlSVB2NCA9IGV4cG9ydHMucGFyc2VFcHN2UmVzcG9uc2UgPSBleHBvcnRzLmVudGVyUGFzc2l2ZU1vZGVJUHY2ID0gdm9pZCAwO1xuY29uc3QgbmV0VXRpbHNfMSA9IHJlcXVpcmUoXCIuL25ldFV0aWxzXCIpO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY29uc3QgdGxzXzEgPSByZXF1aXJlKFwidGxzXCIpO1xuY29uc3QgcGFyc2VDb250cm9sUmVzcG9uc2VfMSA9IHJlcXVpcmUoXCIuL3BhcnNlQ29udHJvbFJlc3BvbnNlXCIpO1xuLyoqXG4gKiBQcmVwYXJlIGEgZGF0YSBzb2NrZXQgdXNpbmcgcGFzc2l2ZSBtb2RlIG92ZXIgSVB2Ni5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW50ZXJQYXNzaXZlTW9kZUlQdjYoZnRwKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZnRwLnJlcXVlc3QoXCJFUFNWXCIpO1xuICAgIGNvbnN0IHBvcnQgPSBwYXJzZUVwc3ZSZXNwb25zZShyZXMubWVzc2FnZSk7XG4gICAgaWYgKCFwb3J0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHBhcnNlIEVQU1YgcmVzcG9uc2U6IFwiICsgcmVzLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sSG9zdCA9IGZ0cC5zb2NrZXQucmVtb3RlQWRkcmVzcztcbiAgICBpZiAoY29udHJvbEhvc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250cm9sIHNvY2tldCBpcyBkaXNjb25uZWN0ZWQsIGNhbid0IGdldCByZW1vdGUgYWRkcmVzcy5cIik7XG4gICAgfVxuICAgIGF3YWl0IGNvbm5lY3RGb3JQYXNzaXZlVHJhbnNmZXIoY29udHJvbEhvc3QsIHBvcnQsIGZ0cCk7XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuZW50ZXJQYXNzaXZlTW9kZUlQdjYgPSBlbnRlclBhc3NpdmVNb2RlSVB2Njtcbi8qKlxuICogUGFyc2UgYW4gRVBTViByZXNwb25zZS4gUmV0dXJucyBvbmx5IHRoZSBwb3J0IGFzIGluIEVQU1YgdGhlIGhvc3Qgb2YgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBpcyB1c2VkLlxuICovXG5mdW5jdGlvbiBwYXJzZUVwc3ZSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgLy8gR2V0IHBvcnQgZnJvbSBFUFNWIHJlc3BvbnNlLCBlLmcuIFwiMjI5IEVudGVyaW5nIEV4dGVuZGVkIFBhc3NpdmUgTW9kZSAofHx8NjQ0NnwpXCJcbiAgICAvLyBTb21lIEZUUCBTZXJ2ZXJzIHN1Y2ggYXMgdGhlIG9uZSBvbiBJQk0gaSAoT1MvNDAwKSB1c2UgISBpbnN0ZWFkIG9mIHwgaW4gdGhlaXIgRVBTViByZXNwb25zZS5cbiAgICBjb25zdCBncm91cHMgPSBtZXNzYWdlLm1hdGNoKC9bfCFdezN9KC4rKVt8IV0vKTtcbiAgICBpZiAoZ3JvdXBzID09PSBudWxsIHx8IGdyb3Vwc1sxXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgcGFyc2UgcmVzcG9uc2UgdG8gJ0VQU1YnOiAke21lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludChncm91cHNbMV0sIDEwKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHBvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgcGFyc2UgcmVzcG9uc2UgdG8gJ0VQU1YnLCBwb3J0IGlzIG5vdCBhIG51bWJlcjogJHttZXNzYWdlfWApO1xuICAgIH1cbiAgICByZXR1cm4gcG9ydDtcbn1cbmV4cG9ydHMucGFyc2VFcHN2UmVzcG9uc2UgPSBwYXJzZUVwc3ZSZXNwb25zZTtcbi8qKlxuICogUHJlcGFyZSBhIGRhdGEgc29ja2V0IHVzaW5nIHBhc3NpdmUgbW9kZSBvdmVyIElQdjQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVudGVyUGFzc2l2ZU1vZGVJUHY0KGZ0cCkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZ0cC5yZXF1ZXN0KFwiUEFTVlwiKTtcbiAgICBjb25zdCB0YXJnZXQgPSBwYXJzZVBhc3ZSZXNwb25zZShyZXMubWVzc2FnZSk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgcGFyc2UgUEFTViByZXNwb25zZTogXCIgKyByZXMubWVzc2FnZSk7XG4gICAgfVxuICAgIC8vIElmIHRoZSBob3N0IGluIHRoZSBQQVNWIHJlc3BvbnNlIGhhcyBhIGxvY2FsIGFkZHJlc3Mgd2hpbGUgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBoYXNuJ3QsXG4gICAgLy8gd2UgYXNzdW1lIGEgTkFUIGlzc3VlIGFuZCB1c2UgdGhlIElQIG9mIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gYXMgdGhlIHRhcmdldCBmb3IgdGhlIGRhdGEgY29ubmVjdGlvbi5cbiAgICAvLyBXZSBjYW4ndCBhbHdheXMgcGVyZm9ybSB0aGlzIHJlcGxhY2VtZW50IGJlY2F1c2UgaXQncyBwb3NzaWJsZSAoYWx0aG91Z2ggdW5saWtlbHkpIHRoYXQgdGhlIEZUUCBzZXJ2ZXJcbiAgICAvLyBpbmRlZWQgdXNlcyBhIGRpZmZlcmVudCBob3N0IGZvciBkYXRhIGNvbm5lY3Rpb25zLlxuICAgIGNvbnN0IGNvbnRyb2xIb3N0ID0gZnRwLnNvY2tldC5yZW1vdGVBZGRyZXNzO1xuICAgIGlmICgoMCwgbmV0VXRpbHNfMS5pcElzUHJpdmF0ZVY0QWRkcmVzcykodGFyZ2V0Lmhvc3QpICYmIGNvbnRyb2xIb3N0ICYmICEoMCwgbmV0VXRpbHNfMS5pcElzUHJpdmF0ZVY0QWRkcmVzcykoY29udHJvbEhvc3QpKSB7XG4gICAgICAgIHRhcmdldC5ob3N0ID0gY29udHJvbEhvc3Q7XG4gICAgfVxuICAgIGF3YWl0IGNvbm5lY3RGb3JQYXNzaXZlVHJhbnNmZXIodGFyZ2V0Lmhvc3QsIHRhcmdldC5wb3J0LCBmdHApO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnRzLmVudGVyUGFzc2l2ZU1vZGVJUHY0ID0gZW50ZXJQYXNzaXZlTW9kZUlQdjQ7XG4vKipcbiAqIFBhcnNlIGEgUEFTViByZXNwb25zZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VQYXN2UmVzcG9uc2UobWVzc2FnZSkge1xuICAgIC8vIEdldCBob3N0IGFuZCBwb3J0IGZyb20gUEFTViByZXNwb25zZSwgZS5nLiBcIjIyNyBFbnRlcmluZyBQYXNzaXZlIE1vZGUgKDE5MiwxNjgsMSwxMDAsMTAsMjI5KVwiXG4gICAgY29uc3QgZ3JvdXBzID0gbWVzc2FnZS5tYXRjaCgvKFstXFxkXSssWy1cXGRdKyxbLVxcZF0rLFstXFxkXSspLChbLVxcZF0rKSwoWy1cXGRdKykvKTtcbiAgICBpZiAoZ3JvdXBzID09PSBudWxsIHx8IGdyb3Vwcy5sZW5ndGggIT09IDQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBwYXJzZSByZXNwb25zZSB0byAnUEFTVic6ICR7bWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaG9zdDogZ3JvdXBzWzFdLnJlcGxhY2UoLywvZywgXCIuXCIpLFxuICAgICAgICBwb3J0OiAocGFyc2VJbnQoZ3JvdXBzWzJdLCAxMCkgJiAyNTUpICogMjU2ICsgKHBhcnNlSW50KGdyb3Vwc1szXSwgMTApICYgMjU1KVxuICAgIH07XG59XG5leHBvcnRzLnBhcnNlUGFzdlJlc3BvbnNlID0gcGFyc2VQYXN2UmVzcG9uc2U7XG5mdW5jdGlvbiBjb25uZWN0Rm9yUGFzc2l2ZVRyYW5zZmVyKGhvc3QsIHBvcnQsIGZ0cCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBzb2NrZXQgPSBmdHAuX25ld1NvY2tldCgpO1xuICAgICAgICBjb25zdCBoYW5kbGVDb25uRXJyID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSBcIkNhbid0IG9wZW4gZGF0YSBjb25uZWN0aW9uIGluIHBhc3NpdmUgbW9kZTogXCIgKyBlcnIubWVzc2FnZTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoYW5kbGVUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRpbWVvdXQgd2hlbiB0cnlpbmcgdG8gb3BlbiBkYXRhIGNvbm5lY3Rpb24gdG8gJHtob3N0fToke3BvcnR9YCkpO1xuICAgICAgICB9O1xuICAgICAgICBzb2NrZXQuc2V0VGltZW91dChmdHAudGltZW91dCk7XG4gICAgICAgIHNvY2tldC5vbihcImVycm9yXCIsIGhhbmRsZUNvbm5FcnIpO1xuICAgICAgICBzb2NrZXQub24oXCJ0aW1lb3V0XCIsIGhhbmRsZVRpbWVvdXQpO1xuICAgICAgICBzb2NrZXQuY29ubmVjdCh7IHBvcnQsIGhvc3QsIGZhbWlseTogZnRwLmlwRmFtaWx5IH0sICgpID0+IHtcbiAgICAgICAgICAgIGlmIChmdHAuc29ja2V0IGluc3RhbmNlb2YgdGxzXzEuVExTU29ja2V0KSB7XG4gICAgICAgICAgICAgICAgc29ja2V0ID0gKDAsIHRsc18xLmNvbm5lY3QpKE9iamVjdC5hc3NpZ24oe30sIGZ0cC50bHNPcHRpb25zLCB7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldCxcbiAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2UgdGhlIFRMUyBzZXNzaW9uIG5lZ290aWF0ZWQgZWFybGllciB3aGVuIHRoZSBjb250cm9sIGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gd2FzIHVwZ3JhZGVkLiBTZXJ2ZXJzIGV4cGVjdCB0aGlzIGJlY2F1c2UgaXQgcHJvdmlkZXMgYWRkaXRpb25hbFxuICAgICAgICAgICAgICAgICAgICAvLyBzZWN1cml0eTogSWYgYSBjb21wbGV0ZWx5IG5ldyBzZXNzaW9uIHdvdWxkIGJlIG5lZ290aWF0ZWQsIGEgaGFja2VyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvdWxkIGd1ZXNzIHRoZSBwb3J0IGFuZCBjb25uZWN0IHRvIHRoZSBuZXcgZGF0YSBjb25uZWN0aW9uIGJlZm9yZSB3ZSBkb1xuICAgICAgICAgICAgICAgICAgICAvLyBieSBqdXN0IHN0YXJ0aW5nIGhpcy9oZXIgb3duIFRMUyBzZXNzaW9uLlxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uOiBmdHAuc29ja2V0LmdldFNlc3Npb24oKVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAvLyBJdCdzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdHJhbnNmZXIgdGFzayB0byB3YWl0IHVudGlsIHRoZVxuICAgICAgICAgICAgICAgIC8vIFRMUyBzb2NrZXQgaXNzdWVkIHRoZSBldmVudCAnc2VjdXJlQ29ubmVjdCcuIFdlIGNhbid0IGRvIHRoaXNcbiAgICAgICAgICAgICAgICAvLyBoZXJlIGJlY2F1c2Ugc29tZSBzZXJ2ZXJzIHdpbGwgc3RhcnQgdXBncmFkaW5nIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNwZWNpZmljIHRyYW5zZmVyIHJlcXVlc3QgaGFzIGJlZW4gbWFkZS4gTGlzdCBhbmQgZG93bmxvYWQgZG9uJ3RcbiAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIHdhaXQgZm9yIHRoaXMgZXZlbnQgYmVjYXVzZSB0aGUgc2VydmVyIHNlbmRzIHdoZW5ldmVyIGl0XG4gICAgICAgICAgICAgICAgLy8gaXMgcmVhZHkuIEJ1dCBmb3IgdXBsb2FkIHRoaXMgaGFzIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCxcbiAgICAgICAgICAgICAgICAvLyBzZWUgdGhlIGRldGFpbHMgaW4gdGhlIHVwbG9hZCgpIGZ1bmN0aW9uIGJlbG93LlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTGV0IHRoZSBGVFBDb250ZXh0IGxpc3RlbiB0byBlcnJvcnMgZnJvbSBub3cgb24sIHJlbW92ZSBsb2NhbCBoYW5kbGVyLlxuICAgICAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgaGFuZGxlQ29ubkVycik7XG4gICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoXCJ0aW1lb3V0XCIsIGhhbmRsZVRpbWVvdXQpO1xuICAgICAgICAgICAgZnRwLmRhdGFTb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jb25uZWN0Rm9yUGFzc2l2ZVRyYW5zZmVyID0gY29ubmVjdEZvclBhc3NpdmVUcmFuc2Zlcjtcbi8qKlxuICogSGVscHMgcmVzb2x2aW5nL3JlamVjdGluZyB0cmFuc2ZlcnMuXG4gKlxuICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkgZm9yIGFsbCBGVFAgdHJhbnNmZXJzLiBGb3IgZXhhbXBsZSB3aGVuIGRvd25sb2FkaW5nLCB0aGUgc2VydmVyIG1pZ2h0IGNvbmZpcm1cbiAqIHdpdGggXCIyMjYgVHJhbnNmZXIgY29tcGxldGVcIiB3aGVuIGluIGZhY3QgdGhlIGRvd25sb2FkIG9uIHRoZSBkYXRhIGNvbm5lY3Rpb24gaGFzIG5vdCBmaW5pc2hlZFxuICogeWV0LiBXaXRoIGFsbCB0cmFuc2ZlcnMgd2UgbWFrZSBzdXJlIHRoYXQgYSkgdGhlIHJlc3VsdCBhcnJpdmVkIGFuZCBiKSBoYXMgYmVlbiBjb25maXJtZWQgYnlcbiAqIGUuZy4gdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4gV2UganVzdCBkb24ndCBrbm93IGluIHdoaWNoIG9yZGVyIHRoaXMgd2lsbCBoYXBwZW4uXG4gKi9cbmNsYXNzIFRyYW5zZmVyUmVzb2x2ZXIge1xuICAgIC8qKlxuICAgICAqIEluc3RhbnRpYXRlIGEgVHJhbnNmZXJSZXNvbHZlclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGZ0cCwgcHJvZ3Jlc3MpIHtcbiAgICAgICAgdGhpcy5mdHAgPSBmdHA7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5kYXRhVHJhbnNmZXJEb25lID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1hcmsgdGhlIGJlZ2lubmluZyBvZiBhIHRyYW5zZmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgLSBOYW1lIG9mIHRoZSB0cmFuc2ZlciwgdXN1YWxseSB0aGUgZmlsZW5hbWUuXG4gICAgICogQHBhcmFtIHR5cGUgLSBUeXBlIG9mIHRyYW5zZmVyLCB1c3VhbGx5IFwidXBsb2FkXCIgb3IgXCJkb3dubG9hZFwiLlxuICAgICAqL1xuICAgIG9uRGF0YVN0YXJ0KG5hbWUsIHR5cGUpIHtcbiAgICAgICAgLy8gTGV0IHRoZSBkYXRhIHNvY2tldCBiZSBpbiBjaGFyZ2Ugb2YgdHJhY2tpbmcgdGltZW91dHMgZHVyaW5nIHRyYW5zZmVyLlxuICAgICAgICAvLyBUaGUgY29udHJvbCBzb2NrZXQgc2l0cyBpZGxlIGR1cmluZyB0aGlzIHRpbWUgYW55d2F5IGFuZCBtaWdodCBwcm92b2tlXG4gICAgICAgIC8vIGEgdGltZW91dCB1bm5lY2Vzc2FyaWx5LiBUaGUgY29udHJvbCBjb25uZWN0aW9uIHdpbGwgdGFrZSBjYXJlXG4gICAgICAgIC8vIG9mIHRpbWVvdXRzIGFnYWluIG9uY2UgZGF0YSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBvciBmYWlsZWQuXG4gICAgICAgIGlmICh0aGlzLmZ0cC5kYXRhU29ja2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRhdGEgdHJhbnNmZXIgc2hvdWxkIHN0YXJ0IGJ1dCB0aGVyZSBpcyBubyBkYXRhIGNvbm5lY3Rpb24uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZnRwLnNvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgICAgICB0aGlzLmZ0cC5kYXRhU29ja2V0LnNldFRpbWVvdXQodGhpcy5mdHAudGltZW91dCk7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3Muc3RhcnQodGhpcy5mdHAuZGF0YVNvY2tldCwgbmFtZSwgdHlwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIGNvbm5lY3Rpb24gaGFzIGZpbmlzaGVkIHRoZSB0cmFuc2Zlci5cbiAgICAgKi9cbiAgICBvbkRhdGFEb25lKHRhc2spIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzcy51cGRhdGVBbmRTdG9wKCk7XG4gICAgICAgIC8vIEhhbmQtb3ZlciB0aW1lb3V0IHRyYWNraW5nIGJhY2sgdG8gdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4gSXQncyBwb3NzaWJsZSB0aGF0XG4gICAgICAgIC8vIHdlIGRvbid0IHJlY2VpdmUgdGhlIHJlc3BvbnNlIG92ZXIgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiB0aGF0IHRoZSB0cmFuc2ZlciBpc1xuICAgICAgICAvLyBkb25lLiBJbiB0aGlzIGNhc2UsIHdlIHdhbnQgdG8gY29ycmVjdGx5IGFzc29jaWF0ZSB0aGUgcmVzdWx0aW5nIHRpbWVvdXQgd2l0aFxuICAgICAgICAvLyB0aGUgY29udHJvbCBjb25uZWN0aW9uLlxuICAgICAgICB0aGlzLmZ0cC5zb2NrZXQuc2V0VGltZW91dCh0aGlzLmZ0cC50aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuZnRwLmRhdGFTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuZnRwLmRhdGFTb2NrZXQuc2V0VGltZW91dCgwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFUcmFuc2ZlckRvbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyeVJlc29sdmUodGFzayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb250cm9sIGNvbm5lY3Rpb24gcmVwb3J0cyB0aGUgdHJhbnNmZXIgYXMgZmluaXNoZWQuXG4gICAgICovXG4gICAgb25Db250cm9sRG9uZSh0YXNrLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMudHJ5UmVzb2x2ZSh0YXNrKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgYW5kIHRoZSB0YXNrIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKi9cbiAgICBvbkVycm9yKHRhc2ssIGVycikge1xuICAgICAgICB0aGlzLnByb2dyZXNzLnVwZGF0ZUFuZFN0b3AoKTtcbiAgICAgICAgdGhpcy5mdHAuc29ja2V0LnNldFRpbWVvdXQodGhpcy5mdHAudGltZW91dCk7XG4gICAgICAgIHRoaXMuZnRwLmRhdGFTb2NrZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRhc2sucmVqZWN0KGVycik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnRyb2wgY29ubmVjdGlvbiBzZW50IGFuIHVuZXhwZWN0ZWQgcmVxdWVzdCByZXF1aXJpbmcgYSByZXNwb25zZSBmcm9tIG91ciBwYXJ0LiBXZVxuICAgICAqIGNhbid0IHByb3ZpZGUgdGhhdCAoYmVjYXVzZSB1bmtub3duKSBhbmQgaGF2ZSB0byBjbG9zZSB0aGUgY29udHJleHQgd2l0aCBhbiBlcnJvciBiZWNhdXNlXG4gICAgICogdGhlIEZUUCBzZXJ2ZXIgaXMgbm93IGNhdWdodCB1cCBpbiBhIHN0YXRlIHdlIGNhbid0IHJlc29sdmUuXG4gICAgICovXG4gICAgb25VbmV4cGVjdGVkUmVxdWVzdChyZXNwb25zZSkge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgRlRQIHJlc3BvbnNlIGlzIHJlcXVlc3RpbmcgYW4gYW5zd2VyOiAke3Jlc3BvbnNlLm1lc3NhZ2V9YCk7XG4gICAgICAgIHRoaXMuZnRwLmNsb3NlV2l0aEVycm9yKGVycik7XG4gICAgfVxuICAgIHRyeVJlc29sdmUodGFzaykge1xuICAgICAgICAvLyBUbyByZXNvbHZlLCB3ZSBuZWVkIGJvdGggY29udHJvbCBhbmQgZGF0YSBjb25uZWN0aW9uIHRvIHJlcG9ydCB0aGF0IHRoZSB0cmFuc2ZlciBpcyBkb25lLlxuICAgICAgICBjb25zdCBjYW5SZXNvbHZlID0gdGhpcy5kYXRhVHJhbnNmZXJEb25lICYmIHRoaXMucmVzcG9uc2UgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGNhblJlc29sdmUpIHtcbiAgICAgICAgICAgIHRoaXMuZnRwLmRhdGFTb2NrZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0YXNrLnJlc29sdmUodGhpcy5yZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB1cGxvYWRGcm9tKHNvdXJjZSwgY29uZmlnKSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSBuZXcgVHJhbnNmZXJSZXNvbHZlcihjb25maWcuZnRwLCBjb25maWcudHJhY2tlcik7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBgJHtjb25maWcuY29tbWFuZH0gJHtjb25maWcucmVtb3RlUGF0aH1gO1xuICAgIHJldHVybiBjb25maWcuZnRwLmhhbmRsZShmdWxsQ29tbWFuZCwgKHJlcywgdGFzaykgPT4ge1xuICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJlc29sdmVyLm9uRXJyb3IodGFzaywgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZXMuY29kZSA9PT0gMTUwIHx8IHJlcy5jb2RlID09PSAxMjUpIHsgLy8gUmVhZHkgdG8gdXBsb2FkXG4gICAgICAgICAgICBjb25zdCBkYXRhU29ja2V0ID0gY29uZmlnLmZ0cC5kYXRhU29ja2V0O1xuICAgICAgICAgICAgaWYgKCFkYXRhU29ja2V0KSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZXIub25FcnJvcih0YXNrLCBuZXcgRXJyb3IoXCJVcGxvYWQgc2hvdWxkIGJlZ2luIGJ1dCBubyBkYXRhIGNvbm5lY3Rpb24gaXMgYXZhaWxhYmxlLlwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIFRMUywgd2UgaGF2ZSB0byB3YWl0IHVudGlsIHRoZSBkYXRhU29ja2V0IGlzc3VlZFxuICAgICAgICAgICAgLy8gJ3NlY3VyZUNvbm5lY3QnLiBJZiB0aGlzIGhhc24ndCBoYXBwZW5lZCB5ZXQsIGdldENpcGhlcigpIHJldHVybnMgdW5kZWZpbmVkLlxuICAgICAgICAgICAgY29uc3QgY2FuVXBsb2FkID0gXCJnZXRDaXBoZXJcIiBpbiBkYXRhU29ja2V0ID8gZGF0YVNvY2tldC5nZXRDaXBoZXIoKSAhPT0gdW5kZWZpbmVkIDogdHJ1ZTtcbiAgICAgICAgICAgIG9uQ29uZGl0aW9uT3JFdmVudChjYW5VcGxvYWQsIGRhdGFTb2NrZXQsIFwic2VjdXJlQ29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmZ0cC5sb2coYFVwbG9hZGluZyB0byAkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlQWRkcmVzcykoZGF0YVNvY2tldCl9ICgkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlVExTKShkYXRhU29ja2V0KX0pYCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZXIub25EYXRhU3RhcnQoY29uZmlnLnJlbW90ZVBhdGgsIGNvbmZpZy50eXBlKTtcbiAgICAgICAgICAgICAgICAoMCwgc3RyZWFtXzEucGlwZWxpbmUpKHNvdXJjZSwgZGF0YVNvY2tldCwgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIub25FcnJvcih0YXNrLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIub25EYXRhRG9uZSh0YXNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKDAsIHBhcnNlQ29udHJvbFJlc3BvbnNlXzEucG9zaXRpdmVDb21wbGV0aW9uKShyZXMuY29kZSkpIHsgLy8gVHJhbnNmZXIgY29tcGxldGVcbiAgICAgICAgICAgIHJlc29sdmVyLm9uQ29udHJvbERvbmUodGFzaywgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoMCwgcGFyc2VDb250cm9sUmVzcG9uc2VfMS5wb3NpdGl2ZUludGVybWVkaWF0ZSkocmVzLmNvZGUpKSB7XG4gICAgICAgICAgICByZXNvbHZlci5vblVuZXhwZWN0ZWRSZXF1ZXN0KHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWdub3JlIGFsbCBvdGhlciBwb3NpdGl2ZSBwcmVsaW1pbmFyeSByZXNwb25zZSBjb2RlcyAoPCAyMDApXG4gICAgfSk7XG59XG5leHBvcnRzLnVwbG9hZEZyb20gPSB1cGxvYWRGcm9tO1xuZnVuY3Rpb24gZG93bmxvYWRUbyhkZXN0aW5hdGlvbiwgY29uZmlnKSB7XG4gICAgaWYgKCFjb25maWcuZnRwLmRhdGFTb2NrZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRG93bmxvYWQgd2lsbCBiZSBpbml0aWF0ZWQgYnV0IG5vIGRhdGEgY29ubmVjdGlvbiBpcyBhdmFpbGFibGUuXCIpO1xuICAgIH1cbiAgICBjb25zdCByZXNvbHZlciA9IG5ldyBUcmFuc2ZlclJlc29sdmVyKGNvbmZpZy5mdHAsIGNvbmZpZy50cmFja2VyKTtcbiAgICByZXR1cm4gY29uZmlnLmZ0cC5oYW5kbGUoY29uZmlnLmNvbW1hbmQsIChyZXMsIHRhc2spID0+IHtcbiAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXNvbHZlci5vbkVycm9yKHRhc2ssIHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVzLmNvZGUgPT09IDE1MCB8fCByZXMuY29kZSA9PT0gMTI1KSB7IC8vIFJlYWR5IHRvIGRvd25sb2FkXG4gICAgICAgICAgICBjb25zdCBkYXRhU29ja2V0ID0gY29uZmlnLmZ0cC5kYXRhU29ja2V0O1xuICAgICAgICAgICAgaWYgKCFkYXRhU29ja2V0KSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZXIub25FcnJvcih0YXNrLCBuZXcgRXJyb3IoXCJEb3dubG9hZCBzaG91bGQgYmVnaW4gYnV0IG5vIGRhdGEgY29ubmVjdGlvbiBpcyBhdmFpbGFibGUuXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25maWcuZnRwLmxvZyhgRG93bmxvYWRpbmcgZnJvbSAkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlQWRkcmVzcykoZGF0YVNvY2tldCl9ICgkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlVExTKShkYXRhU29ja2V0KX0pYCk7XG4gICAgICAgICAgICByZXNvbHZlci5vbkRhdGFTdGFydChjb25maWcucmVtb3RlUGF0aCwgY29uZmlnLnR5cGUpO1xuICAgICAgICAgICAgKDAsIHN0cmVhbV8xLnBpcGVsaW5lKShkYXRhU29ja2V0LCBkZXN0aW5hdGlvbiwgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLm9uRXJyb3IodGFzaywgZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLm9uRGF0YURvbmUodGFzayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVzLmNvZGUgPT09IDM1MCkgeyAvLyBSZXN0YXJ0aW5nIGF0IHN0YXJ0QXQuXG4gICAgICAgICAgICBjb25maWcuZnRwLnNlbmQoXCJSRVRSIFwiICsgY29uZmlnLnJlbW90ZVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCgwLCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xLnBvc2l0aXZlQ29tcGxldGlvbikocmVzLmNvZGUpKSB7IC8vIFRyYW5zZmVyIGNvbXBsZXRlXG4gICAgICAgICAgICByZXNvbHZlci5vbkNvbnRyb2xEb25lKHRhc2ssIHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKDAsIHBhcnNlQ29udHJvbFJlc3BvbnNlXzEucG9zaXRpdmVJbnRlcm1lZGlhdGUpKHJlcy5jb2RlKSkge1xuICAgICAgICAgICAgcmVzb2x2ZXIub25VbmV4cGVjdGVkUmVxdWVzdChyZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElnbm9yZSBhbGwgb3RoZXIgcG9zaXRpdmUgcHJlbGltaW5hcnkgcmVzcG9uc2UgY29kZXMgKDwgMjAwKVxuICAgIH0pO1xufVxuZXhwb3J0cy5kb3dubG9hZFRvID0gZG93bmxvYWRUbztcbi8qKlxuICogQ2FsbHMgYSBmdW5jdGlvbiBpbW1lZGlhdGVseSBpZiBhIGNvbmRpdGlvbiBpcyBtZXQgb3Igc3Vic2NyaWJlcyB0byBhbiBldmVudCBhbmQgY2FsbHNcbiAqIGl0IG9uY2UgdGhlIGV2ZW50IGlzIGVtaXR0ZWQuXG4gKlxuICogQHBhcmFtIGNvbmRpdGlvbiAgVGhlIGNvbmRpdGlvbiB0byB0ZXN0LlxuICogQHBhcmFtIGVtaXR0ZXIgIFRoZSBlbWl0dGVyIHRvIHVzZSBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBAcGFyYW0gZXZlbnROYW1lICBUaGUgZXZlbnQgdG8gc3Vic2NyaWJlIHRvIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIEBwYXJhbSBhY3Rpb24gIFRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBvbkNvbmRpdGlvbk9yRXZlbnQoY29uZGl0aW9uLCBlbWl0dGVyLCBldmVudE5hbWUsIGFjdGlvbikge1xuICAgIGlmIChjb25kaXRpb24gPT09IHRydWUpIHtcbiAgICAgICAgYWN0aW9uKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBlbWl0dGVyLm9uY2UoZXZlbnROYW1lLCAoKSA9PiBhY3Rpb24oKSk7XG4gICAgfVxufVxuIiwidmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIENSQ19UQUJMRSA9IFtcbiAgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhlZTBlNjEyYywgMHg5OTA5NTFiYSwgMHgwNzZkYzQxOSxcbiAgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywgMHgwZWRiODgzMiwgMHg3OWRjYjhhNCxcbiAgMHhlMGQ1ZTkxZSwgMHg5N2QyZDk4OCwgMHgwOWI2NGMyYiwgMHg3ZWIxN2NiZCwgMHhlN2I4MmQwNyxcbiAgMHg5MGJmMWQ5MSwgMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSxcbiAgMHgxYWRhZDQ3ZCwgMHg2ZGRkZTRlYiwgMHhmNGQ0YjU1MSwgMHg4M2QzODVjNywgMHgxMzZjOTg1NixcbiAgMHg2NDZiYThjMCwgMHhmZDYyZjk3YSwgMHg4YTY1YzllYywgMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSxcbiAgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwgMHgzYjZlMjBjOCwgMHg0YzY5MTA1ZSwgMHhkNTYwNDFlNCxcbiAgMHhhMjY3NzE3MiwgMHgzYzAzZTRkMSwgMHg0YjA0ZDQ0NywgMHhkMjBkODVmZCwgMHhhNTBhYjU2YixcbiAgMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwgMHgzMmQ4NmNlMyxcbiAgMHg0NWRmNWM3NSwgMHhkY2Q2MGRjZiwgMHhhYmQxM2Q1OSwgMHgyNmQ5MzBhYywgMHg1MWRlMDAzYSxcbiAgMHhjOGQ3NTE4MCwgMHhiZmQwNjExNiwgMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OSxcbiAgMHhiOGJkYTUwZiwgMHgyODAyYjg5ZSwgMHg1ZjA1ODgwOCwgMHhjNjBjZDliMiwgMHhiMTBiZTkyNCxcbiAgMHgyZjZmN2M4NywgMHg1ODY4NGMxMSwgMHhjMTYxMWRhYiwgMHhiNjY2MmQzZCwgMHg3NmRjNDE5MCxcbiAgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwgMHg3MWIxODU4OSwgMHgwNmI2YjUxZixcbiAgMHg5ZmJmZTRhNSwgMHhlOGI4ZDQzMywgMHg3ODA3YzlhMiwgMHgwZjAwZjkzNCwgMHg5NjA5YTg4ZSxcbiAgMHhlMTBlOTgxOCwgMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSxcbiAgMHg2YjZiNTFmNCwgMHgxYzZjNjE2MiwgMHg4NTY1MzBkOCwgMHhmMjYyMDA0ZSwgMHg2YzA2OTVlZCxcbiAgMHgxYjAxYTU3YiwgMHg4MjA4ZjRjMSwgMHhmNTBmYzQ1NywgMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCxcbiAgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywgMHg2MmRkMWRkZiwgMHgxNWRhMmQ0OSwgMHg4Y2QzN2NmMyxcbiAgMHhmYmQ0NGM2NSwgMHg0ZGIyNjE1OCwgMHgzYWI1NTFjZSwgMHhhM2JjMDA3NCwgMHhkNGJiMzBlMixcbiAgMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwgMHg0MzY5ZTk2YSxcbiAgMHgzNDZlZDlmYywgMHhhZDY3ODg0NiwgMHhkYTYwYjhkMCwgMHg0NDA0MmQ3MywgMHgzMzAzMWRlNSxcbiAgMHhhYTBhNGM1ZiwgMHhkZDBkN2NjOSwgMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMCxcbiAgMHhjOTBjMjA4NiwgMHg1NzY4YjUyNSwgMHgyMDZmODViMywgMHhiOTY2ZDQwOSwgMHhjZTYxZTQ5ZixcbiAgMHg1ZWRlZjkwZSwgMHgyOWQ5Yzk5OCwgMHhiMGQwOTgyMiwgMHhjN2Q3YThiNCwgMHg1OWIzM2QxNyxcbiAgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwgMHhlZGI4ODMyMCwgMHg5YWJmYjNiNixcbiAgMHgwM2I2ZTIwYywgMHg3NGIxZDI5YSwgMHhlYWQ1NDczOSwgMHg5ZGQyNzdhZiwgMHgwNGRiMjYxNSxcbiAgMHg3M2RjMTY4MywgMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCxcbiAgMHhlNDBlY2YwYiwgMHg5MzA5ZmY5ZCwgMHgwYTAwYWUyNywgMHg3ZDA3OWViMSwgMHhmMDBmOTM0NCxcbiAgMHg4NzA4YTNkMiwgMHgxZTAxZjI2OCwgMHg2OTA2YzJmZSwgMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYixcbiAgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywgMHhmZWQ0MWI3NiwgMHg4OWQzMmJlMCwgMHgxMGRhN2E1YSxcbiAgMHg2N2RkNGFjYywgMHhmOWI5ZGY2ZiwgMHg4ZWJlZWZmOSwgMHgxN2I3YmU0MywgMHg2MGIwOGVkNSxcbiAgMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwgMHhkMWJiNjdmMSxcbiAgMHhhNmJjNTc2NywgMHgzZmI1MDZkZCwgMHg0OGIyMzY0YiwgMHhkODBkMmJkYSwgMHhhZjBhMWI0YyxcbiAgMHgzNjAzNGFmNiwgMHg0MTA0N2E2MCwgMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZixcbiAgMHg0NjY5YmU3OSwgMHhjYjYxYjM4YywgMHhiYzY2ODMxYSwgMHgyNTZmZDJhMCwgMHg1MjY4ZTIzNixcbiAgMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwgMHhjNWJhM2JiZSxcbiAgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwgMHhjMmQ3ZmZhNywgMHhiNWQwY2YzMSxcbiAgMHgyY2Q5OWU4YiwgMHg1YmRlYWUxZCwgMHg5YjY0YzJiMCwgMHhlYzYzZjIyNiwgMHg3NTZhYTM5YyxcbiAgMHgwMjZkOTMwYSwgMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMyxcbiAgMHg5NWJmNGE4MiwgMHhlMmI4N2ExNCwgMHg3YmIxMmJhZSwgMHgwY2I2MWIzOCwgMHg5MmQyOGU5YixcbiAgMHhlNWQ1YmUwZCwgMHg3Y2RjZWZiNywgMHgwYmRiZGYyMSwgMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MixcbiAgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwgMHg4MWJlMTZjZCwgMHhmNmI5MjY1YiwgMHg2ZmIwNzdlMSxcbiAgMHgxOGI3NDc3NywgMHg4ODA4NWFlNiwgMHhmZjBmNmE3MCwgMHg2NjA2M2JjYSwgMHgxMTAxMGI1YyxcbiAgMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwgMHhhMDBhZTI3OCxcbiAgMHhkNzBkZDJlZSwgMHg0ZTA0ODM1NCwgMHgzOTAzYjNjMiwgMHhhNzY3MjY2MSwgMHhkMDYwMTZmNyxcbiAgMHg0OTY5NDc0ZCwgMHgzZTZlNzdkYiwgMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NixcbiAgMHgzN2Q4M2JmMCwgMHhhOWJjYWU1MywgMHhkZWJiOWVjNSwgMHg0N2IyY2Y3ZiwgMHgzMGI1ZmZlOSxcbiAgMHhiZGJkZjIxYywgMHhjYWJhYzI4YSwgMHg1M2IzOTMzMCwgMHgyNGI0YTNhNiwgMHhiYWQwMzYwNSxcbiAgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwgMHhiMzY2N2EyZSwgMHhjNDYxNGFiOCxcbiAgMHg1ZDY4MWIwMiwgMHgyYTZmMmI5NCwgMHhiNDBiYmUzNywgMHhjMzBjOGVhMSwgMHg1YTA1ZGYxYixcbiAgMHgyZDAyZWY4ZFxuXTtcblxuaWYgKHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICBDUkNfVEFCTEUgPSBuZXcgSW50MzJBcnJheShDUkNfVEFCTEUpO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVCdWZmZXIoaW5wdXQpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dCkpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICB2YXIgaGFzTmV3QnVmZmVyQVBJID1cbiAgICAgIHR5cGVvZiBCdWZmZXIuYWxsb2MgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgdHlwZW9mIEJ1ZmZlci5mcm9tID09PSBcImZ1bmN0aW9uXCI7XG5cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBoYXNOZXdCdWZmZXJBUEkgPyBCdWZmZXIuYWxsb2MoaW5wdXQpIDogbmV3IEJ1ZmZlcihpbnB1dCk7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGhhc05ld0J1ZmZlckFQSSA/IEJ1ZmZlci5mcm9tKGlucHV0KSA6IG5ldyBCdWZmZXIoaW5wdXQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcImlucHV0IG11c3QgYmUgYnVmZmVyLCBudW1iZXIsIG9yIHN0cmluZywgcmVjZWl2ZWQgXCIgK1xuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgaW5wdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1ZmZlcml6ZUludChudW0pIHtcbiAgdmFyIHRtcCA9IGVuc3VyZUJ1ZmZlcig0KTtcbiAgdG1wLndyaXRlSW50MzJCRShudW0sIDApO1xuICByZXR1cm4gdG1wO1xufVxuXG5mdW5jdGlvbiBfY3JjMzIoYnVmLCBwcmV2aW91cykge1xuICBidWYgPSBlbnN1cmVCdWZmZXIoYnVmKTtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihwcmV2aW91cykpIHtcbiAgICBwcmV2aW91cyA9IHByZXZpb3VzLnJlYWRVSW50MzJCRSgwKTtcbiAgfVxuICB2YXIgY3JjID0gfn5wcmV2aW91cyBeIC0xO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IGJ1Zi5sZW5ndGg7IG4rKykge1xuICAgIGNyYyA9IENSQ19UQUJMRVsoY3JjIF4gYnVmW25dKSAmIDB4ZmZdIF4gKGNyYyA+Pj4gOCk7XG4gIH1cbiAgcmV0dXJuIChjcmMgXiAtMSk7XG59XG5cbmZ1bmN0aW9uIGNyYzMyKCkge1xuICByZXR1cm4gYnVmZmVyaXplSW50KF9jcmMzMi5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcbn1cbmNyYzMyLnNpZ25lZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIF9jcmMzMi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufTtcbmNyYzMyLnVuc2lnbmVkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2NyYzMyLmFwcGx5KG51bGwsIGFyZ3VtZW50cykgPj4+IDA7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyYzMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1hc2tzIGEgYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBtYXNrLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBzb3VyY2UgVGhlIGJ1ZmZlciB0byBtYXNrXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayBUaGUgbWFzayB0byB1c2VcbiAqIEBwYXJhbSB7QnVmZmVyfSBvdXRwdXQgVGhlIGJ1ZmZlciB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdG8gc3RhcnQgd3JpdGluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIG1hc2suXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IG1hc2sgPSAoc291cmNlLCBtYXNrLCBvdXRwdXQsIG9mZnNldCwgbGVuZ3RoKSA9PiB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBvdXRwdXRbb2Zmc2V0ICsgaV0gPSBzb3VyY2VbaV0gXiBtYXNrW2kgJiAzXTtcbiAgfVxufTtcblxuLyoqXG4gKiBVbm1hc2tzIGEgYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBtYXNrLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byB1bm1hc2tcbiAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIFRoZSBtYXNrIHRvIHVzZVxuICogQHB1YmxpY1xuICovXG5jb25zdCB1bm1hc2sgPSAoYnVmZmVyLCBtYXNrKSA9PiB7XG4gIC8vIFJlcXVpcmVkIHVudGlsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvOTAwNiBpcyByZXNvbHZlZC5cbiAgY29uc3QgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGJ1ZmZlcltpXSBePSBtYXNrW2kgJiAzXTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7IG1hc2ssIHVubWFzayB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG50cnkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ25vZGUtZ3lwLWJ1aWxkJykoX19kaXJuYW1lKTtcbn0gY2F0Y2ggKGUpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhbGxiYWNrJyk7XG59XG4iLCIvKiBNSVQgbGljZW5zZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbWl4ZWQtb3BlcmF0b3JzICovXG5jb25zdCBjc3NLZXl3b3JkcyA9IHJlcXVpcmUoJ2NvbG9yLW5hbWUnKTtcblxuLy8gTk9URTogY29udmVyc2lvbnMgc2hvdWxkIG9ubHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXMgKGkuZS4gYXJyYXlzLCBvclxuLy8gICAgICAgdmFsdWVzIHRoYXQgZ2l2ZSBjb3JyZWN0IGB0eXBlb2ZgIHJlc3VsdHMpLlxuLy8gICAgICAgZG8gbm90IHVzZSBib3ggdmFsdWVzIHR5cGVzIChpLmUuIE51bWJlcigpLCBTdHJpbmcoKSwgZXRjLilcblxuY29uc3QgcmV2ZXJzZUtleXdvcmRzID0ge307XG5mb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjc3NLZXl3b3JkcykpIHtcblx0cmV2ZXJzZUtleXdvcmRzW2Nzc0tleXdvcmRzW2tleV1dID0ga2V5O1xufVxuXG5jb25zdCBjb252ZXJ0ID0ge1xuXHRyZ2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAncmdiJ30sXG5cdGhzbDoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdoc2wnfSxcblx0aHN2OiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzdid9LFxuXHRod2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHdiJ30sXG5cdGNteWs6IHtjaGFubmVsczogNCwgbGFiZWxzOiAnY215ayd9LFxuXHR4eXo6IHtjaGFubmVsczogMywgbGFiZWxzOiAneHl6J30sXG5cdGxhYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdsYWInfSxcblx0bGNoOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xjaCd9LFxuXHRoZXg6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2hleCddfSxcblx0a2V5d29yZDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsna2V5d29yZCddfSxcblx0YW5zaTE2OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydhbnNpMTYnXX0sXG5cdGFuc2kyNTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kyNTYnXX0sXG5cdGhjZzoge2NoYW5uZWxzOiAzLCBsYWJlbHM6IFsnaCcsICdjJywgJ2cnXX0sXG5cdGFwcGxlOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydyMTYnLCAnZzE2JywgJ2IxNiddfSxcblx0Z3JheToge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnZ3JheSddfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0O1xuXG4vLyBIaWRlIC5jaGFubmVscyBhbmQgLmxhYmVscyBwcm9wZXJ0aWVzXG5mb3IgKGNvbnN0IG1vZGVsIG9mIE9iamVjdC5rZXlzKGNvbnZlcnQpKSB7XG5cdGlmICghKCdjaGFubmVscycgaW4gY29udmVydFttb2RlbF0pKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHR9XG5cblx0aWYgKCEoJ2xhYmVscycgaW4gY29udmVydFttb2RlbF0pKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWwgbGFiZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHR9XG5cblx0aWYgKGNvbnZlcnRbbW9kZWxdLmxhYmVscy5sZW5ndGggIT09IGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdjaGFubmVsIGFuZCBsYWJlbCBjb3VudHMgbWlzbWF0Y2g6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHRjb25zdCB7Y2hhbm5lbHMsIGxhYmVsc30gPSBjb252ZXJ0W21vZGVsXTtcblx0ZGVsZXRlIGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzO1xuXHRkZWxldGUgY29udmVydFttb2RlbF0ubGFiZWxzO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdjaGFubmVscycsIHt2YWx1ZTogY2hhbm5lbHN9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbbW9kZWxdLCAnbGFiZWxzJywge3ZhbHVlOiBsYWJlbHN9KTtcbn1cblxuY29udmVydC5yZ2IuaHNsID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCByID0gcmdiWzBdIC8gMjU1O1xuXHRjb25zdCBnID0gcmdiWzFdIC8gMjU1O1xuXHRjb25zdCBiID0gcmdiWzJdIC8gMjU1O1xuXHRjb25zdCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcblx0Y29uc3QgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XG5cdGNvbnN0IGRlbHRhID0gbWF4IC0gbWluO1xuXHRsZXQgaDtcblx0bGV0IHM7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0aCA9IDA7XG5cdH0gZWxzZSBpZiAociA9PT0gbWF4KSB7XG5cdFx0aCA9IChnIC0gYikgLyBkZWx0YTtcblx0fSBlbHNlIGlmIChnID09PSBtYXgpIHtcblx0XHRoID0gMiArIChiIC0gcikgLyBkZWx0YTtcblx0fSBlbHNlIGlmIChiID09PSBtYXgpIHtcblx0XHRoID0gNCArIChyIC0gZykgLyBkZWx0YTtcblx0fVxuXG5cdGggPSBNYXRoLm1pbihoICogNjAsIDM2MCk7XG5cblx0aWYgKGggPCAwKSB7XG5cdFx0aCArPSAzNjA7XG5cdH1cblxuXHRjb25zdCBsID0gKG1pbiArIG1heCkgLyAyO1xuXG5cdGlmIChtYXggPT09IG1pbikge1xuXHRcdHMgPSAwO1xuXHR9IGVsc2UgaWYgKGwgPD0gMC41KSB7XG5cdFx0cyA9IGRlbHRhIC8gKG1heCArIG1pbik7XG5cdH0gZWxzZSB7XG5cdFx0cyA9IGRlbHRhIC8gKDIgLSBtYXggLSBtaW4pO1xuXHR9XG5cblx0cmV0dXJuIFtoLCBzICogMTAwLCBsICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmhzdiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0bGV0IHJkaWY7XG5cdGxldCBnZGlmO1xuXHRsZXQgYmRpZjtcblx0bGV0IGg7XG5cdGxldCBzO1xuXG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cdGNvbnN0IHYgPSBNYXRoLm1heChyLCBnLCBiKTtcblx0Y29uc3QgZGlmZiA9IHYgLSBNYXRoLm1pbihyLCBnLCBiKTtcblx0Y29uc3QgZGlmZmMgPSBmdW5jdGlvbiAoYykge1xuXHRcdHJldHVybiAodiAtIGMpIC8gNiAvIGRpZmYgKyAxIC8gMjtcblx0fTtcblxuXHRpZiAoZGlmZiA9PT0gMCkge1xuXHRcdGggPSAwO1xuXHRcdHMgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSBkaWZmIC8gdjtcblx0XHRyZGlmID0gZGlmZmMocik7XG5cdFx0Z2RpZiA9IGRpZmZjKGcpO1xuXHRcdGJkaWYgPSBkaWZmYyhiKTtcblxuXHRcdGlmIChyID09PSB2KSB7XG5cdFx0XHRoID0gYmRpZiAtIGdkaWY7XG5cdFx0fSBlbHNlIGlmIChnID09PSB2KSB7XG5cdFx0XHRoID0gKDEgLyAzKSArIHJkaWYgLSBiZGlmO1xuXHRcdH0gZWxzZSBpZiAoYiA9PT0gdikge1xuXHRcdFx0aCA9ICgyIC8gMykgKyBnZGlmIC0gcmRpZjtcblx0XHR9XG5cblx0XHRpZiAoaCA8IDApIHtcblx0XHRcdGggKz0gMTtcblx0XHR9IGVsc2UgaWYgKGggPiAxKSB7XG5cdFx0XHRoIC09IDE7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFtcblx0XHRoICogMzYwLFxuXHRcdHMgKiAxMDAsXG5cdFx0diAqIDEwMFxuXHRdO1xufTtcblxuY29udmVydC5yZ2IuaHdiID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCByID0gcmdiWzBdO1xuXHRjb25zdCBnID0gcmdiWzFdO1xuXHRsZXQgYiA9IHJnYlsyXTtcblx0Y29uc3QgaCA9IGNvbnZlcnQucmdiLmhzbChyZ2IpWzBdO1xuXHRjb25zdCB3ID0gMSAvIDI1NSAqIE1hdGgubWluKHIsIE1hdGgubWluKGcsIGIpKTtcblxuXHRiID0gMSAtIDEgLyAyNTUgKiBNYXRoLm1heChyLCBNYXRoLm1heChnLCBiKSk7XG5cblx0cmV0dXJuIFtoLCB3ICogMTAwLCBiICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmNteWsgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cblx0Y29uc3QgayA9IE1hdGgubWluKDEgLSByLCAxIC0gZywgMSAtIGIpO1xuXHRjb25zdCBjID0gKDEgLSByIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cdGNvbnN0IG0gPSAoMSAtIGcgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0Y29uc3QgeSA9ICgxIC0gYiAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXG5cdHJldHVybiBbYyAqIDEwMCwgbSAqIDEwMCwgeSAqIDEwMCwgayAqIDEwMF07XG59O1xuXG5mdW5jdGlvbiBjb21wYXJhdGl2ZURpc3RhbmNlKHgsIHkpIHtcblx0Lypcblx0XHRTZWUgaHR0cHM6Ly9lbi5tLndpa2lwZWRpYS5vcmcvd2lraS9FdWNsaWRlYW5fZGlzdGFuY2UjU3F1YXJlZF9FdWNsaWRlYW5fZGlzdGFuY2Vcblx0Ki9cblx0cmV0dXJuIChcblx0XHQoKHhbMF0gLSB5WzBdKSAqKiAyKSArXG5cdFx0KCh4WzFdIC0geVsxXSkgKiogMikgK1xuXHRcdCgoeFsyXSAtIHlbMl0pICoqIDIpXG5cdCk7XG59XG5cbmNvbnZlcnQucmdiLmtleXdvcmQgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHJldmVyc2VkID0gcmV2ZXJzZUtleXdvcmRzW3JnYl07XG5cdGlmIChyZXZlcnNlZCkge1xuXHRcdHJldHVybiByZXZlcnNlZDtcblx0fVxuXG5cdGxldCBjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cdGxldCBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG5cblx0Zm9yIChjb25zdCBrZXl3b3JkIG9mIE9iamVjdC5rZXlzKGNzc0tleXdvcmRzKSkge1xuXHRcdGNvbnN0IHZhbHVlID0gY3NzS2V5d29yZHNba2V5d29yZF07XG5cblx0XHQvLyBDb21wdXRlIGNvbXBhcmF0aXZlIGRpc3RhbmNlXG5cdFx0Y29uc3QgZGlzdGFuY2UgPSBjb21wYXJhdGl2ZURpc3RhbmNlKHJnYiwgdmFsdWUpO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgaXRzIGxlc3MsIGlmIHNvIHNldCBhcyBjbG9zZXN0XG5cdFx0aWYgKGRpc3RhbmNlIDwgY3VycmVudENsb3Nlc3REaXN0YW5jZSkge1xuXHRcdFx0Y3VycmVudENsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuXHRcdFx0Y3VycmVudENsb3Nlc3RLZXl3b3JkID0ga2V5d29yZDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY3VycmVudENsb3Nlc3RLZXl3b3JkO1xufTtcblxuY29udmVydC5rZXl3b3JkLnJnYiA9IGZ1bmN0aW9uIChrZXl3b3JkKSB7XG5cdHJldHVybiBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcbn07XG5cbmNvbnZlcnQucmdiLnh5eiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0bGV0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGxldCBnID0gcmdiWzFdIC8gMjU1O1xuXHRsZXQgYiA9IHJnYlsyXSAvIDI1NTtcblxuXHQvLyBBc3N1bWUgc1JHQlxuXHRyID0gciA+IDAuMDQwNDUgPyAoKChyICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNCkgOiAociAvIDEyLjkyKTtcblx0ZyA9IGcgPiAwLjA0MDQ1ID8gKCgoZyArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQpIDogKGcgLyAxMi45Mik7XG5cdGIgPSBiID4gMC4wNDA0NSA/ICgoKGIgKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40KSA6IChiIC8gMTIuOTIpO1xuXG5cdGNvbnN0IHggPSAociAqIDAuNDEyNCkgKyAoZyAqIDAuMzU3NikgKyAoYiAqIDAuMTgwNSk7XG5cdGNvbnN0IHkgPSAociAqIDAuMjEyNikgKyAoZyAqIDAuNzE1MikgKyAoYiAqIDAuMDcyMik7XG5cdGNvbnN0IHogPSAociAqIDAuMDE5MykgKyAoZyAqIDAuMTE5MikgKyAoYiAqIDAuOTUwNSk7XG5cblx0cmV0dXJuIFt4ICogMTAwLCB5ICogMTAwLCB6ICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmxhYiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgeHl6ID0gY29udmVydC5yZ2IueHl6KHJnYik7XG5cdGxldCB4ID0geHl6WzBdO1xuXHRsZXQgeSA9IHh5elsxXTtcblx0bGV0IHogPSB4eXpbMl07XG5cblx0eCAvPSA5NS4wNDc7XG5cdHkgLz0gMTAwO1xuXHR6IC89IDEwOC44ODM7XG5cblx0eCA9IHggPiAwLjAwODg1NiA/ICh4ICoqICgxIC8gMykpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuXHR5ID0geSA+IDAuMDA4ODU2ID8gKHkgKiogKDEgLyAzKSkgOiAoNy43ODcgKiB5KSArICgxNiAvIDExNik7XG5cdHogPSB6ID4gMC4wMDg4NTYgPyAoeiAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuXHRjb25zdCBsID0gKDExNiAqIHkpIC0gMTY7XG5cdGNvbnN0IGEgPSA1MDAgKiAoeCAtIHkpO1xuXHRjb25zdCBiID0gMjAwICogKHkgLSB6KTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5oc2wucmdiID0gZnVuY3Rpb24gKGhzbCkge1xuXHRjb25zdCBoID0gaHNsWzBdIC8gMzYwO1xuXHRjb25zdCBzID0gaHNsWzFdIC8gMTAwO1xuXHRjb25zdCBsID0gaHNsWzJdIC8gMTAwO1xuXHRsZXQgdDI7XG5cdGxldCB0Mztcblx0bGV0IHZhbDtcblxuXHRpZiAocyA9PT0gMCkge1xuXHRcdHZhbCA9IGwgKiAyNTU7XG5cdFx0cmV0dXJuIFt2YWwsIHZhbCwgdmFsXTtcblx0fVxuXG5cdGlmIChsIDwgMC41KSB7XG5cdFx0dDIgPSBsICogKDEgKyBzKTtcblx0fSBlbHNlIHtcblx0XHR0MiA9IGwgKyBzIC0gbCAqIHM7XG5cdH1cblxuXHRjb25zdCB0MSA9IDIgKiBsIC0gdDI7XG5cblx0Y29uc3QgcmdiID0gWzAsIDAsIDBdO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdHQzID0gaCArIDEgLyAzICogLShpIC0gMSk7XG5cdFx0aWYgKHQzIDwgMCkge1xuXHRcdFx0dDMrKztcblx0XHR9XG5cblx0XHRpZiAodDMgPiAxKSB7XG5cdFx0XHR0My0tO1xuXHRcdH1cblxuXHRcdGlmICg2ICogdDMgPCAxKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqIDYgKiB0Mztcblx0XHR9IGVsc2UgaWYgKDIgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQyO1xuXHRcdH0gZWxzZSBpZiAoMyAqIHQzIDwgMikge1xuXHRcdFx0dmFsID0gdDEgKyAodDIgLSB0MSkgKiAoMiAvIDMgLSB0MykgKiA2O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YWwgPSB0MTtcblx0XHR9XG5cblx0XHRyZ2JbaV0gPSB2YWwgKiAyNTU7XG5cdH1cblxuXHRyZXR1cm4gcmdiO1xufTtcblxuY29udmVydC5oc2wuaHN2ID0gZnVuY3Rpb24gKGhzbCkge1xuXHRjb25zdCBoID0gaHNsWzBdO1xuXHRsZXQgcyA9IGhzbFsxXSAvIDEwMDtcblx0bGV0IGwgPSBoc2xbMl0gLyAxMDA7XG5cdGxldCBzbWluID0gcztcblx0Y29uc3QgbG1pbiA9IE1hdGgubWF4KGwsIDAuMDEpO1xuXG5cdGwgKj0gMjtcblx0cyAqPSAobCA8PSAxKSA/IGwgOiAyIC0gbDtcblx0c21pbiAqPSBsbWluIDw9IDEgPyBsbWluIDogMiAtIGxtaW47XG5cdGNvbnN0IHYgPSAobCArIHMpIC8gMjtcblx0Y29uc3Qgc3YgPSBsID09PSAwID8gKDIgKiBzbWluKSAvIChsbWluICsgc21pbikgOiAoMiAqIHMpIC8gKGwgKyBzKTtcblxuXHRyZXR1cm4gW2gsIHN2ICogMTAwLCB2ICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHN2LnJnYiA9IGZ1bmN0aW9uIChoc3YpIHtcblx0Y29uc3QgaCA9IGhzdlswXSAvIDYwO1xuXHRjb25zdCBzID0gaHN2WzFdIC8gMTAwO1xuXHRsZXQgdiA9IGhzdlsyXSAvIDEwMDtcblx0Y29uc3QgaGkgPSBNYXRoLmZsb29yKGgpICUgNjtcblxuXHRjb25zdCBmID0gaCAtIE1hdGguZmxvb3IoaCk7XG5cdGNvbnN0IHAgPSAyNTUgKiB2ICogKDEgLSBzKTtcblx0Y29uc3QgcSA9IDI1NSAqIHYgKiAoMSAtIChzICogZikpO1xuXHRjb25zdCB0ID0gMjU1ICogdiAqICgxIC0gKHMgKiAoMSAtIGYpKSk7XG5cdHYgKj0gMjU1O1xuXG5cdHN3aXRjaCAoaGkpIHtcblx0XHRjYXNlIDA6XG5cdFx0XHRyZXR1cm4gW3YsIHQsIHBdO1xuXHRcdGNhc2UgMTpcblx0XHRcdHJldHVybiBbcSwgdiwgcF07XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cmV0dXJuIFtwLCB2LCB0XTtcblx0XHRjYXNlIDM6XG5cdFx0XHRyZXR1cm4gW3AsIHEsIHZdO1xuXHRcdGNhc2UgNDpcblx0XHRcdHJldHVybiBbdCwgcCwgdl07XG5cdFx0Y2FzZSA1OlxuXHRcdFx0cmV0dXJuIFt2LCBwLCBxXTtcblx0fVxufTtcblxuY29udmVydC5oc3YuaHNsID0gZnVuY3Rpb24gKGhzdikge1xuXHRjb25zdCBoID0gaHN2WzBdO1xuXHRjb25zdCBzID0gaHN2WzFdIC8gMTAwO1xuXHRjb25zdCB2ID0gaHN2WzJdIC8gMTAwO1xuXHRjb25zdCB2bWluID0gTWF0aC5tYXgodiwgMC4wMSk7XG5cdGxldCBzbDtcblx0bGV0IGw7XG5cblx0bCA9ICgyIC0gcykgKiB2O1xuXHRjb25zdCBsbWluID0gKDIgLSBzKSAqIHZtaW47XG5cdHNsID0gcyAqIHZtaW47XG5cdHNsIC89IChsbWluIDw9IDEpID8gbG1pbiA6IDIgLSBsbWluO1xuXHRzbCA9IHNsIHx8IDA7XG5cdGwgLz0gMjtcblxuXHRyZXR1cm4gW2gsIHNsICogMTAwLCBsICogMTAwXTtcbn07XG5cbi8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzcy1jb2xvci8jaHdiLXRvLXJnYlxuY29udmVydC5od2IucmdiID0gZnVuY3Rpb24gKGh3Yikge1xuXHRjb25zdCBoID0gaHdiWzBdIC8gMzYwO1xuXHRsZXQgd2ggPSBod2JbMV0gLyAxMDA7XG5cdGxldCBibCA9IGh3YlsyXSAvIDEwMDtcblx0Y29uc3QgcmF0aW8gPSB3aCArIGJsO1xuXHRsZXQgZjtcblxuXHQvLyBXaCArIGJsIGNhbnQgYmUgPiAxXG5cdGlmIChyYXRpbyA+IDEpIHtcblx0XHR3aCAvPSByYXRpbztcblx0XHRibCAvPSByYXRpbztcblx0fVxuXG5cdGNvbnN0IGkgPSBNYXRoLmZsb29yKDYgKiBoKTtcblx0Y29uc3QgdiA9IDEgLSBibDtcblx0ZiA9IDYgKiBoIC0gaTtcblxuXHRpZiAoKGkgJiAweDAxKSAhPT0gMCkge1xuXHRcdGYgPSAxIC0gZjtcblx0fVxuXG5cdGNvbnN0IG4gPSB3aCArIGYgKiAodiAtIHdoKTsgLy8gTGluZWFyIGludGVycG9sYXRpb25cblxuXHRsZXQgcjtcblx0bGV0IGc7XG5cdGxldCBiO1xuXHQvKiBlc2xpbnQtZGlzYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSxuby1tdWx0aS1zcGFjZXMgKi9cblx0c3dpdGNoIChpKSB7XG5cdFx0ZGVmYXVsdDpcblx0XHRjYXNlIDY6XG5cdFx0Y2FzZSAwOiByID0gdjsgIGcgPSBuOyAgYiA9IHdoOyBicmVhaztcblx0XHRjYXNlIDE6IHIgPSBuOyAgZyA9IHY7ICBiID0gd2g7IGJyZWFrO1xuXHRcdGNhc2UgMjogciA9IHdoOyBnID0gdjsgIGIgPSBuOyBicmVhaztcblx0XHRjYXNlIDM6IHIgPSB3aDsgZyA9IG47ICBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA0OiByID0gbjsgIGcgPSB3aDsgYiA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgNTogciA9IHY7ICBnID0gd2g7IGIgPSBuOyBicmVhaztcblx0fVxuXHQvKiBlc2xpbnQtZW5hYmxlIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lLG5vLW11bHRpLXNwYWNlcyAqL1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0LmNteWsucmdiID0gZnVuY3Rpb24gKGNteWspIHtcblx0Y29uc3QgYyA9IGNteWtbMF0gLyAxMDA7XG5cdGNvbnN0IG0gPSBjbXlrWzFdIC8gMTAwO1xuXHRjb25zdCB5ID0gY215a1syXSAvIDEwMDtcblx0Y29uc3QgayA9IGNteWtbM10gLyAxMDA7XG5cblx0Y29uc3QgciA9IDEgLSBNYXRoLm1pbigxLCBjICogKDEgLSBrKSArIGspO1xuXHRjb25zdCBnID0gMSAtIE1hdGgubWluKDEsIG0gKiAoMSAtIGspICsgayk7XG5cdGNvbnN0IGIgPSAxIC0gTWF0aC5taW4oMSwgeSAqICgxIC0gaykgKyBrKTtcblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC54eXoucmdiID0gZnVuY3Rpb24gKHh5eikge1xuXHRjb25zdCB4ID0geHl6WzBdIC8gMTAwO1xuXHRjb25zdCB5ID0geHl6WzFdIC8gMTAwO1xuXHRjb25zdCB6ID0geHl6WzJdIC8gMTAwO1xuXHRsZXQgcjtcblx0bGV0IGc7XG5cdGxldCBiO1xuXG5cdHIgPSAoeCAqIDMuMjQwNikgKyAoeSAqIC0xLjUzNzIpICsgKHogKiAtMC40OTg2KTtcblx0ZyA9ICh4ICogLTAuOTY4OSkgKyAoeSAqIDEuODc1OCkgKyAoeiAqIDAuMDQxNSk7XG5cdGIgPSAoeCAqIDAuMDU1NykgKyAoeSAqIC0wLjIwNDApICsgKHogKiAxLjA1NzApO1xuXG5cdC8vIEFzc3VtZSBzUkdCXG5cdHIgPSByID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogKHIgKiogKDEuMCAvIDIuNCkpKSAtIDAuMDU1KVxuXHRcdDogciAqIDEyLjkyO1xuXG5cdGcgPSBnID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogKGcgKiogKDEuMCAvIDIuNCkpKSAtIDAuMDU1KVxuXHRcdDogZyAqIDEyLjkyO1xuXG5cdGIgPSBiID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogKGIgKiogKDEuMCAvIDIuNCkpKSAtIDAuMDU1KVxuXHRcdDogYiAqIDEyLjkyO1xuXG5cdHIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCByKSwgMSk7XG5cdGcgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBnKSwgMSk7XG5cdGIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBiKSwgMSk7XG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQueHl6LmxhYiA9IGZ1bmN0aW9uICh4eXopIHtcblx0bGV0IHggPSB4eXpbMF07XG5cdGxldCB5ID0geHl6WzFdO1xuXHRsZXQgeiA9IHh5elsyXTtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gKHggKiogKDEgLyAzKSkgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG5cdHkgPSB5ID4gMC4wMDg4NTYgPyAoeSAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/ICh6ICoqICgxIC8gMykpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGNvbnN0IGwgPSAoMTE2ICogeSkgLSAxNjtcblx0Y29uc3QgYSA9IDUwMCAqICh4IC0geSk7XG5cdGNvbnN0IGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmxhYi54eXogPSBmdW5jdGlvbiAobGFiKSB7XG5cdGNvbnN0IGwgPSBsYWJbMF07XG5cdGNvbnN0IGEgPSBsYWJbMV07XG5cdGNvbnN0IGIgPSBsYWJbMl07XG5cdGxldCB4O1xuXHRsZXQgeTtcblx0bGV0IHo7XG5cblx0eSA9IChsICsgMTYpIC8gMTE2O1xuXHR4ID0gYSAvIDUwMCArIHk7XG5cdHogPSB5IC0gYiAvIDIwMDtcblxuXHRjb25zdCB5MiA9IHkgKiogMztcblx0Y29uc3QgeDIgPSB4ICoqIDM7XG5cdGNvbnN0IHoyID0geiAqKiAzO1xuXHR5ID0geTIgPiAwLjAwODg1NiA/IHkyIDogKHkgLSAxNiAvIDExNikgLyA3Ljc4Nztcblx0eCA9IHgyID4gMC4wMDg4NTYgPyB4MiA6ICh4IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cdHogPSB6MiA+IDAuMDA4ODU2ID8gejIgOiAoeiAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXG5cdHggKj0gOTUuMDQ3O1xuXHR5ICo9IDEwMDtcblx0eiAqPSAxMDguODgzO1xuXG5cdHJldHVybiBbeCwgeSwgel07XG59O1xuXG5jb252ZXJ0LmxhYi5sY2ggPSBmdW5jdGlvbiAobGFiKSB7XG5cdGNvbnN0IGwgPSBsYWJbMF07XG5cdGNvbnN0IGEgPSBsYWJbMV07XG5cdGNvbnN0IGIgPSBsYWJbMl07XG5cdGxldCBoO1xuXG5cdGNvbnN0IGhyID0gTWF0aC5hdGFuMihiLCBhKTtcblx0aCA9IGhyICogMzYwIC8gMiAvIE1hdGguUEk7XG5cblx0aWYgKGggPCAwKSB7XG5cdFx0aCArPSAzNjA7XG5cdH1cblxuXHRjb25zdCBjID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpO1xuXG5cdHJldHVybiBbbCwgYywgaF07XG59O1xuXG5jb252ZXJ0LmxjaC5sYWIgPSBmdW5jdGlvbiAobGNoKSB7XG5cdGNvbnN0IGwgPSBsY2hbMF07XG5cdGNvbnN0IGMgPSBsY2hbMV07XG5cdGNvbnN0IGggPSBsY2hbMl07XG5cblx0Y29uc3QgaHIgPSBoIC8gMzYwICogMiAqIE1hdGguUEk7XG5cdGNvbnN0IGEgPSBjICogTWF0aC5jb3MoaHIpO1xuXHRjb25zdCBiID0gYyAqIE1hdGguc2luKGhyKTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5yZ2IuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MsIHNhdHVyYXRpb24gPSBudWxsKSB7XG5cdGNvbnN0IFtyLCBnLCBiXSA9IGFyZ3M7XG5cdGxldCB2YWx1ZSA9IHNhdHVyYXRpb24gPT09IG51bGwgPyBjb252ZXJ0LnJnYi5oc3YoYXJncylbMl0gOiBzYXR1cmF0aW9uOyAvLyBIc3YgLT4gYW5zaTE2IG9wdGltaXphdGlvblxuXG5cdHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAvIDUwKTtcblxuXHRpZiAodmFsdWUgPT09IDApIHtcblx0XHRyZXR1cm4gMzA7XG5cdH1cblxuXHRsZXQgYW5zaSA9IDMwXG5cdFx0KyAoKE1hdGgucm91bmQoYiAvIDI1NSkgPDwgMilcblx0XHR8IChNYXRoLnJvdW5kKGcgLyAyNTUpIDw8IDEpXG5cdFx0fCBNYXRoLnJvdW5kKHIgLyAyNTUpKTtcblxuXHRpZiAodmFsdWUgPT09IDIpIHtcblx0XHRhbnNpICs9IDYwO1xuXHR9XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0Lmhzdi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHQvLyBPcHRpbWl6YXRpb24gaGVyZTsgd2UgYWxyZWFkeSBrbm93IHRoZSB2YWx1ZSBhbmQgZG9uJ3QgbmVlZCB0byBnZXRcblx0Ly8gaXQgY29udmVydGVkIGZvciB1cy5cblx0cmV0dXJuIGNvbnZlcnQucmdiLmFuc2kxNihjb252ZXJ0Lmhzdi5yZ2IoYXJncyksIGFyZ3NbMl0pO1xufTtcblxuY29udmVydC5yZ2IuYW5zaTI1NiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdGNvbnN0IHIgPSBhcmdzWzBdO1xuXHRjb25zdCBnID0gYXJnc1sxXTtcblx0Y29uc3QgYiA9IGFyZ3NbMl07XG5cblx0Ly8gV2UgdXNlIHRoZSBleHRlbmRlZCBncmV5c2NhbGUgcGFsZXR0ZSBoZXJlLCB3aXRoIHRoZSBleGNlcHRpb24gb2Zcblx0Ly8gYmxhY2sgYW5kIHdoaXRlLiBub3JtYWwgcGFsZXR0ZSBvbmx5IGhhcyA0IGdyZXlzY2FsZSBzaGFkZXMuXG5cdGlmIChyID09PSBnICYmIGcgPT09IGIpIHtcblx0XHRpZiAociA8IDgpIHtcblx0XHRcdHJldHVybiAxNjtcblx0XHR9XG5cblx0XHRpZiAociA+IDI0OCkge1xuXHRcdFx0cmV0dXJuIDIzMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gTWF0aC5yb3VuZCgoKHIgLSA4KSAvIDI0NykgKiAyNCkgKyAyMzI7XG5cdH1cblxuXHRjb25zdCBhbnNpID0gMTZcblx0XHQrICgzNiAqIE1hdGgucm91bmQociAvIDI1NSAqIDUpKVxuXHRcdCsgKDYgKiBNYXRoLnJvdW5kKGcgLyAyNTUgKiA1KSlcblx0XHQrIE1hdGgucm91bmQoYiAvIDI1NSAqIDUpO1xuXG5cdHJldHVybiBhbnNpO1xufTtcblxuY29udmVydC5hbnNpMTYucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0bGV0IGNvbG9yID0gYXJncyAlIDEwO1xuXG5cdC8vIEhhbmRsZSBncmV5c2NhbGVcblx0aWYgKGNvbG9yID09PSAwIHx8IGNvbG9yID09PSA3KSB7XG5cdFx0aWYgKGFyZ3MgPiA1MCkge1xuXHRcdFx0Y29sb3IgKz0gMy41O1xuXHRcdH1cblxuXHRcdGNvbG9yID0gY29sb3IgLyAxMC41ICogMjU1O1xuXG5cdFx0cmV0dXJuIFtjb2xvciwgY29sb3IsIGNvbG9yXTtcblx0fVxuXG5cdGNvbnN0IG11bHQgPSAofn4oYXJncyA+IDUwKSArIDEpICogMC41O1xuXHRjb25zdCByID0gKChjb2xvciAmIDEpICogbXVsdCkgKiAyNTU7XG5cdGNvbnN0IGcgPSAoKChjb2xvciA+PiAxKSAmIDEpICogbXVsdCkgKiAyNTU7XG5cdGNvbnN0IGIgPSAoKChjb2xvciA+PiAyKSAmIDEpICogbXVsdCkgKiAyNTU7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQuYW5zaTI1Ni5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHQvLyBIYW5kbGUgZ3JleXNjYWxlXG5cdGlmIChhcmdzID49IDIzMikge1xuXHRcdGNvbnN0IGMgPSAoYXJncyAtIDIzMikgKiAxMCArIDg7XG5cdFx0cmV0dXJuIFtjLCBjLCBjXTtcblx0fVxuXG5cdGFyZ3MgLT0gMTY7XG5cblx0bGV0IHJlbTtcblx0Y29uc3QgciA9IE1hdGguZmxvb3IoYXJncyAvIDM2KSAvIDUgKiAyNTU7XG5cdGNvbnN0IGcgPSBNYXRoLmZsb29yKChyZW0gPSBhcmdzICUgMzYpIC8gNikgLyA1ICogMjU1O1xuXHRjb25zdCBiID0gKHJlbSAlIDYpIC8gNSAqIDI1NTtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5yZ2IuaGV4ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Y29uc3QgaW50ZWdlciA9ICgoTWF0aC5yb3VuZChhcmdzWzBdKSAmIDB4RkYpIDw8IDE2KVxuXHRcdCsgKChNYXRoLnJvdW5kKGFyZ3NbMV0pICYgMHhGRikgPDwgOClcblx0XHQrIChNYXRoLnJvdW5kKGFyZ3NbMl0pICYgMHhGRik7XG5cblx0Y29uc3Qgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbn07XG5cbmNvbnZlcnQuaGV4LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdGNvbnN0IG1hdGNoID0gYXJncy50b1N0cmluZygxNikubWF0Y2goL1thLWYwLTldezZ9fFthLWYwLTldezN9L2kpO1xuXHRpZiAoIW1hdGNoKSB7XG5cdFx0cmV0dXJuIFswLCAwLCAwXTtcblx0fVxuXG5cdGxldCBjb2xvclN0cmluZyA9IG1hdGNoWzBdO1xuXG5cdGlmIChtYXRjaFswXS5sZW5ndGggPT09IDMpIHtcblx0XHRjb2xvclN0cmluZyA9IGNvbG9yU3RyaW5nLnNwbGl0KCcnKS5tYXAoY2hhciA9PiB7XG5cdFx0XHRyZXR1cm4gY2hhciArIGNoYXI7XG5cdFx0fSkuam9pbignJyk7XG5cdH1cblxuXHRjb25zdCBpbnRlZ2VyID0gcGFyc2VJbnQoY29sb3JTdHJpbmcsIDE2KTtcblx0Y29uc3QgciA9IChpbnRlZ2VyID4+IDE2KSAmIDB4RkY7XG5cdGNvbnN0IGcgPSAoaW50ZWdlciA+PiA4KSAmIDB4RkY7XG5cdGNvbnN0IGIgPSBpbnRlZ2VyICYgMHhGRjtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5yZ2IuaGNnID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCByID0gcmdiWzBdIC8gMjU1O1xuXHRjb25zdCBnID0gcmdiWzFdIC8gMjU1O1xuXHRjb25zdCBiID0gcmdiWzJdIC8gMjU1O1xuXHRjb25zdCBtYXggPSBNYXRoLm1heChNYXRoLm1heChyLCBnKSwgYik7XG5cdGNvbnN0IG1pbiA9IE1hdGgubWluKE1hdGgubWluKHIsIGcpLCBiKTtcblx0Y29uc3QgY2hyb21hID0gKG1heCAtIG1pbik7XG5cdGxldCBncmF5c2NhbGU7XG5cdGxldCBodWU7XG5cblx0aWYgKGNocm9tYSA8IDEpIHtcblx0XHRncmF5c2NhbGUgPSBtaW4gLyAoMSAtIGNocm9tYSk7XG5cdH0gZWxzZSB7XG5cdFx0Z3JheXNjYWxlID0gMDtcblx0fVxuXG5cdGlmIChjaHJvbWEgPD0gMCkge1xuXHRcdGh1ZSA9IDA7XG5cdH0gZWxzZVxuXHRpZiAobWF4ID09PSByKSB7XG5cdFx0aHVlID0gKChnIC0gYikgLyBjaHJvbWEpICUgNjtcblx0fSBlbHNlXG5cdGlmIChtYXggPT09IGcpIHtcblx0XHRodWUgPSAyICsgKGIgLSByKSAvIGNocm9tYTtcblx0fSBlbHNlIHtcblx0XHRodWUgPSA0ICsgKHIgLSBnKSAvIGNocm9tYTtcblx0fVxuXG5cdGh1ZSAvPSA2O1xuXHRodWUgJT0gMTtcblxuXHRyZXR1cm4gW2h1ZSAqIDM2MCwgY2hyb21hICogMTAwLCBncmF5c2NhbGUgKiAxMDBdO1xufTtcblxuY29udmVydC5oc2wuaGNnID0gZnVuY3Rpb24gKGhzbCkge1xuXHRjb25zdCBzID0gaHNsWzFdIC8gMTAwO1xuXHRjb25zdCBsID0gaHNsWzJdIC8gMTAwO1xuXG5cdGNvbnN0IGMgPSBsIDwgMC41ID8gKDIuMCAqIHMgKiBsKSA6ICgyLjAgKiBzICogKDEuMCAtIGwpKTtcblxuXHRsZXQgZiA9IDA7XG5cdGlmIChjIDwgMS4wKSB7XG5cdFx0ZiA9IChsIC0gMC41ICogYykgLyAoMS4wIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2hzbFswXSwgYyAqIDEwMCwgZiAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmhzdi5oY2cgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG5cdGNvbnN0IHYgPSBoc3ZbMl0gLyAxMDA7XG5cblx0Y29uc3QgYyA9IHMgKiB2O1xuXHRsZXQgZiA9IDA7XG5cblx0aWYgKGMgPCAxLjApIHtcblx0XHRmID0gKHYgLSBjKSAvICgxIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2hzdlswXSwgYyAqIDEwMCwgZiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5yZ2IgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGggPSBoY2dbMF0gLyAzNjA7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0aWYgKGMgPT09IDAuMCkge1xuXHRcdHJldHVybiBbZyAqIDI1NSwgZyAqIDI1NSwgZyAqIDI1NV07XG5cdH1cblxuXHRjb25zdCBwdXJlID0gWzAsIDAsIDBdO1xuXHRjb25zdCBoaSA9IChoICUgMSkgKiA2O1xuXHRjb25zdCB2ID0gaGkgJSAxO1xuXHRjb25zdCB3ID0gMSAtIHY7XG5cdGxldCBtZyA9IDA7XG5cblx0LyogZXNsaW50LWRpc2FibGUgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUgKi9cblx0c3dpdGNoIChNYXRoLmZsb29yKGhpKSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gdjsgcHVyZVsyXSA9IDA7IGJyZWFrO1xuXHRcdGNhc2UgMTpcblx0XHRcdHB1cmVbMF0gPSB3OyBwdXJlWzFdID0gMTsgcHVyZVsyXSA9IDA7IGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRcdHB1cmVbMF0gPSAwOyBwdXJlWzFdID0gMTsgcHVyZVsyXSA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgMzpcblx0XHRcdHB1cmVbMF0gPSAwOyBwdXJlWzFdID0gdzsgcHVyZVsyXSA9IDE7IGJyZWFrO1xuXHRcdGNhc2UgNDpcblx0XHRcdHB1cmVbMF0gPSB2OyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IDE7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRwdXJlWzBdID0gMTsgcHVyZVsxXSA9IDA7IHB1cmVbMl0gPSB3O1xuXHR9XG5cdC8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUgKi9cblxuXHRtZyA9ICgxLjAgLSBjKSAqIGc7XG5cblx0cmV0dXJuIFtcblx0XHQoYyAqIHB1cmVbMF0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzFdICsgbWcpICogMjU1LFxuXHRcdChjICogcHVyZVsyXSArIG1nKSAqIDI1NVxuXHRdO1xufTtcblxuY29udmVydC5oY2cuaHN2ID0gZnVuY3Rpb24gKGhjZykge1xuXHRjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuXHRjb25zdCBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdGNvbnN0IHYgPSBjICsgZyAqICgxLjAgLSBjKTtcblx0bGV0IGYgPSAwO1xuXG5cdGlmICh2ID4gMC4wKSB7XG5cdFx0ZiA9IGMgLyB2O1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIGYgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHNsID0gZnVuY3Rpb24gKGhjZykge1xuXHRjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuXHRjb25zdCBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdGNvbnN0IGwgPSBnICogKDEuMCAtIGMpICsgMC41ICogYztcblx0bGV0IHMgPSAwO1xuXG5cdGlmIChsID4gMC4wICYmIGwgPCAwLjUpIHtcblx0XHRzID0gYyAvICgyICogbCk7XG5cdH0gZWxzZVxuXHRpZiAobCA+PSAwLjUgJiYgbCA8IDEuMCkge1xuXHRcdHMgPSBjIC8gKDIgKiAoMSAtIGwpKTtcblx0fVxuXG5cdHJldHVybiBbaGNnWzBdLCBzICogMTAwLCBsICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLmh3YiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0Y29uc3QgYyA9IGhjZ1sxXSAvIDEwMDtcblx0Y29uc3QgZyA9IGhjZ1syXSAvIDEwMDtcblx0Y29uc3QgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHRyZXR1cm4gW2hjZ1swXSwgKHYgLSBjKSAqIDEwMCwgKDEgLSB2KSAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmh3Yi5oY2cgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdGNvbnN0IHcgPSBod2JbMV0gLyAxMDA7XG5cdGNvbnN0IGIgPSBod2JbMl0gLyAxMDA7XG5cdGNvbnN0IHYgPSAxIC0gYjtcblx0Y29uc3QgYyA9IHYgLSB3O1xuXHRsZXQgZyA9IDA7XG5cblx0aWYgKGMgPCAxKSB7XG5cdFx0ZyA9ICh2IC0gYykgLyAoMSAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtod2JbMF0sIGMgKiAxMDAsIGcgKiAxMDBdO1xufTtcblxuY29udmVydC5hcHBsZS5yZ2IgPSBmdW5jdGlvbiAoYXBwbGUpIHtcblx0cmV0dXJuIFsoYXBwbGVbMF0gLyA2NTUzNSkgKiAyNTUsIChhcHBsZVsxXSAvIDY1NTM1KSAqIDI1NSwgKGFwcGxlWzJdIC8gNjU1MzUpICogMjU1XTtcbn07XG5cbmNvbnZlcnQucmdiLmFwcGxlID0gZnVuY3Rpb24gKHJnYikge1xuXHRyZXR1cm4gWyhyZ2JbMF0gLyAyNTUpICogNjU1MzUsIChyZ2JbMV0gLyAyNTUpICogNjU1MzUsIChyZ2JbMl0gLyAyNTUpICogNjU1MzVdO1xufTtcblxuY29udmVydC5ncmF5LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHJldHVybiBbYXJnc1swXSAvIDEwMCAqIDI1NSwgYXJnc1swXSAvIDEwMCAqIDI1NSwgYXJnc1swXSAvIDEwMCAqIDI1NV07XG59O1xuXG5jb252ZXJ0LmdyYXkuaHNsID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFswLCAwLCBhcmdzWzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oc3YgPSBjb252ZXJ0LmdyYXkuaHNsO1xuXG5jb252ZXJ0LmdyYXkuaHdiID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFswLCAxMDAsIGdyYXlbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmNteWsgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gWzAsIDAsIDAsIGdyYXlbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmxhYiA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbZ3JheVswXSwgMCwgMF07XG59O1xuXG5jb252ZXJ0LmdyYXkuaGV4ID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0Y29uc3QgdmFsID0gTWF0aC5yb3VuZChncmF5WzBdIC8gMTAwICogMjU1KSAmIDB4RkY7XG5cdGNvbnN0IGludGVnZXIgPSAodmFsIDw8IDE2KSArICh2YWwgPDwgOCkgKyB2YWw7XG5cblx0Y29uc3Qgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbn07XG5cbmNvbnZlcnQucmdiLmdyYXkgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHZhbCA9IChyZ2JbMF0gKyByZ2JbMV0gKyByZ2JbMl0pIC8gMztcblx0cmV0dXJuIFt2YWwgLyAyNTUgKiAxMDBdO1xufTtcbiIsImNvbnN0IGNvbnZlcnNpb25zID0gcmVxdWlyZSgnLi9jb252ZXJzaW9ucycpO1xuY29uc3Qgcm91dGUgPSByZXF1aXJlKCcuL3JvdXRlJyk7XG5cbmNvbnN0IGNvbnZlcnQgPSB7fTtcblxuY29uc3QgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5mdW5jdGlvbiB3cmFwUmF3KGZuKSB7XG5cdGNvbnN0IHdyYXBwZWRGbiA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG5cdFx0Y29uc3QgYXJnMCA9IGFyZ3NbMF07XG5cdFx0aWYgKGFyZzAgPT09IHVuZGVmaW5lZCB8fCBhcmcwID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gYXJnMDtcblx0XHR9XG5cblx0XHRpZiAoYXJnMC5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gYXJnMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm4oYXJncyk7XG5cdH07XG5cblx0Ly8gUHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5mdW5jdGlvbiB3cmFwUm91bmRlZChmbikge1xuXHRjb25zdCB3cmFwcGVkRm4gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuXHRcdGNvbnN0IGFyZzAgPSBhcmdzWzBdO1xuXG5cdFx0aWYgKGFyZzAgPT09IHVuZGVmaW5lZCB8fCBhcmcwID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gYXJnMDtcblx0XHR9XG5cblx0XHRpZiAoYXJnMC5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gYXJnMDtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHQgPSBmbihhcmdzKTtcblxuXHRcdC8vIFdlJ3JlIGFzc3VtaW5nIHRoZSByZXN1bHQgaXMgYW4gYXJyYXkgaGVyZS5cblx0XHQvLyBzZWUgbm90aWNlIGluIGNvbnZlcnNpb25zLmpzOyBkb24ndCB1c2UgYm94IHR5cGVzXG5cdFx0Ly8gaW4gY29udmVyc2lvbiBmdW5jdGlvbnMuXG5cdFx0aWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRmb3IgKGxldCBsZW4gPSByZXN1bHQubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdHJlc3VsdFtpXSA9IE1hdGgucm91bmQocmVzdWx0W2ldKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdC8vIFByZXNlcnZlIC5jb252ZXJzaW9uIHByb3BlcnR5IGlmIHRoZXJlIGlzIG9uZVxuXHRpZiAoJ2NvbnZlcnNpb24nIGluIGZuKSB7XG5cdFx0d3JhcHBlZEZuLmNvbnZlcnNpb24gPSBmbi5jb252ZXJzaW9uO1xuXHR9XG5cblx0cmV0dXJuIHdyYXBwZWRGbjtcbn1cblxubW9kZWxzLmZvckVhY2goZnJvbU1vZGVsID0+IHtcblx0Y29udmVydFtmcm9tTW9kZWxdID0ge307XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbZnJvbU1vZGVsXSwgJ2NoYW5uZWxzJywge3ZhbHVlOiBjb252ZXJzaW9uc1tmcm9tTW9kZWxdLmNoYW5uZWxzfSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W2Zyb21Nb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0ubGFiZWxzfSk7XG5cblx0Y29uc3Qgcm91dGVzID0gcm91dGUoZnJvbU1vZGVsKTtcblx0Y29uc3Qgcm91dGVNb2RlbHMgPSBPYmplY3Qua2V5cyhyb3V0ZXMpO1xuXG5cdHJvdXRlTW9kZWxzLmZvckVhY2godG9Nb2RlbCA9PiB7XG5cdFx0Y29uc3QgZm4gPSByb3V0ZXNbdG9Nb2RlbF07XG5cblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0gPSB3cmFwUm91bmRlZChmbik7XG5cdFx0Y29udmVydFtmcm9tTW9kZWxdW3RvTW9kZWxdLnJhdyA9IHdyYXBSYXcoZm4pO1xuXHR9KTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG4iLCJjb25zdCBjb252ZXJzaW9ucyA9IHJlcXVpcmUoJy4vY29udmVyc2lvbnMnKTtcblxuLypcblx0VGhpcyBmdW5jdGlvbiByb3V0ZXMgYSBtb2RlbCB0byBhbGwgb3RoZXIgbW9kZWxzLlxuXG5cdGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgcm91dGVkIGhhdmUgYSBwcm9wZXJ0eSBgLmNvbnZlcnNpb25gIGF0dGFjaGVkXG5cdHRvIHRoZSByZXR1cm5lZCBzeW50aGV0aWMgZnVuY3Rpb24uIFRoaXMgcHJvcGVydHkgaXMgYW4gYXJyYXlcblx0b2Ygc3RyaW5ncywgZWFjaCB3aXRoIHRoZSBzdGVwcyBpbiBiZXR3ZWVuIHRoZSAnZnJvbScgYW5kICd0bydcblx0Y29sb3IgbW9kZWxzIChpbmNsdXNpdmUpLlxuXG5cdGNvbnZlcnNpb25zIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSBzaW1wbHkgYXJlIG5vdCBpbmNsdWRlZC5cbiovXG5cbmZ1bmN0aW9uIGJ1aWxkR3JhcGgoKSB7XG5cdGNvbnN0IGdyYXBoID0ge307XG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS9vYmplY3Qta2V5cy12cy1mb3ItaW4td2l0aC1jbG9zdXJlLzNcblx0Y29uc3QgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5cdGZvciAobGV0IGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRncmFwaFttb2RlbHNbaV1dID0ge1xuXHRcdFx0Ly8gaHR0cDovL2pzcGVyZi5jb20vMS12cy1pbmZpbml0eVxuXHRcdFx0Ly8gbWljcm8tb3B0LCBidXQgdGhpcyBpcyBzaW1wbGUuXG5cdFx0XHRkaXN0YW5jZTogLTEsXG5cdFx0XHRwYXJlbnQ6IG51bGxcblx0XHR9O1xuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CcmVhZHRoLWZpcnN0X3NlYXJjaFxuZnVuY3Rpb24gZGVyaXZlQkZTKGZyb21Nb2RlbCkge1xuXHRjb25zdCBncmFwaCA9IGJ1aWxkR3JhcGgoKTtcblx0Y29uc3QgcXVldWUgPSBbZnJvbU1vZGVsXTsgLy8gVW5zaGlmdCAtPiBxdWV1ZSAtPiBwb3BcblxuXHRncmFwaFtmcm9tTW9kZWxdLmRpc3RhbmNlID0gMDtcblxuXHR3aGlsZSAocXVldWUubGVuZ3RoKSB7XG5cdFx0Y29uc3QgY3VycmVudCA9IHF1ZXVlLnBvcCgpO1xuXHRcdGNvbnN0IGFkamFjZW50cyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zW2N1cnJlbnRdKTtcblxuXHRcdGZvciAobGV0IGxlbiA9IGFkamFjZW50cy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGNvbnN0IGFkamFjZW50ID0gYWRqYWNlbnRzW2ldO1xuXHRcdFx0Y29uc3Qgbm9kZSA9IGdyYXBoW2FkamFjZW50XTtcblxuXHRcdFx0aWYgKG5vZGUuZGlzdGFuY2UgPT09IC0xKSB7XG5cdFx0XHRcdG5vZGUuZGlzdGFuY2UgPSBncmFwaFtjdXJyZW50XS5kaXN0YW5jZSArIDE7XG5cdFx0XHRcdG5vZGUucGFyZW50ID0gY3VycmVudDtcblx0XHRcdFx0cXVldWUudW5zaGlmdChhZGphY2VudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG5mdW5jdGlvbiBsaW5rKGZyb20sIHRvKSB7XG5cdHJldHVybiBmdW5jdGlvbiAoYXJncykge1xuXHRcdHJldHVybiB0byhmcm9tKGFyZ3MpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gd3JhcENvbnZlcnNpb24odG9Nb2RlbCwgZ3JhcGgpIHtcblx0Y29uc3QgcGF0aCA9IFtncmFwaFt0b01vZGVsXS5wYXJlbnQsIHRvTW9kZWxdO1xuXHRsZXQgZm4gPSBjb252ZXJzaW9uc1tncmFwaFt0b01vZGVsXS5wYXJlbnRdW3RvTW9kZWxdO1xuXG5cdGxldCBjdXIgPSBncmFwaFt0b01vZGVsXS5wYXJlbnQ7XG5cdHdoaWxlIChncmFwaFtjdXJdLnBhcmVudCkge1xuXHRcdHBhdGgudW5zaGlmdChncmFwaFtjdXJdLnBhcmVudCk7XG5cdFx0Zm4gPSBsaW5rKGNvbnZlcnNpb25zW2dyYXBoW2N1cl0ucGFyZW50XVtjdXJdLCBmbik7XG5cdFx0Y3VyID0gZ3JhcGhbY3VyXS5wYXJlbnQ7XG5cdH1cblxuXHRmbi5jb252ZXJzaW9uID0gcGF0aDtcblx0cmV0dXJuIGZuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmcm9tTW9kZWwpIHtcblx0Y29uc3QgZ3JhcGggPSBkZXJpdmVCRlMoZnJvbU1vZGVsKTtcblx0Y29uc3QgY29udmVyc2lvbiA9IHt9O1xuXG5cdGNvbnN0IG1vZGVscyA9IE9iamVjdC5rZXlzKGdyYXBoKTtcblx0Zm9yIChsZXQgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdGNvbnN0IHRvTW9kZWwgPSBtb2RlbHNbaV07XG5cdFx0Y29uc3Qgbm9kZSA9IGdyYXBoW3RvTW9kZWxdO1xuXG5cdFx0aWYgKG5vZGUucGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHQvLyBObyBwb3NzaWJsZSBjb252ZXJzaW9uLCBvciB0aGlzIG5vZGUgaXMgdGhlIHNvdXJjZSBtb2RlbC5cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnZlcnNpb25bdG9Nb2RlbF0gPSB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCk7XG5cdH1cblxuXHRyZXR1cm4gY29udmVyc2lvbjtcbn07XG5cbiIsIid1c2Ugc3RyaWN0J1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0XCJhbGljZWJsdWVcIjogWzI0MCwgMjQ4LCAyNTVdLFxyXG5cdFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsIDIzNSwgMjE1XSxcclxuXHRcImFxdWFcIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImFxdWFtYXJpbmVcIjogWzEyNywgMjU1LCAyMTJdLFxyXG5cdFwiYXp1cmVcIjogWzI0MCwgMjU1LCAyNTVdLFxyXG5cdFwiYmVpZ2VcIjogWzI0NSwgMjQ1LCAyMjBdLFxyXG5cdFwiYmlzcXVlXCI6IFsyNTUsIDIyOCwgMTk2XSxcclxuXHRcImJsYWNrXCI6IFswLCAwLCAwXSxcclxuXHRcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsIDIzNSwgMjA1XSxcclxuXHRcImJsdWVcIjogWzAsIDAsIDI1NV0sXHJcblx0XCJibHVldmlvbGV0XCI6IFsxMzgsIDQzLCAyMjZdLFxyXG5cdFwiYnJvd25cIjogWzE2NSwgNDIsIDQyXSxcclxuXHRcImJ1cmx5d29vZFwiOiBbMjIyLCAxODQsIDEzNV0sXHJcblx0XCJjYWRldGJsdWVcIjogWzk1LCAxNTgsIDE2MF0sXHJcblx0XCJjaGFydHJldXNlXCI6IFsxMjcsIDI1NSwgMF0sXHJcblx0XCJjaG9jb2xhdGVcIjogWzIxMCwgMTA1LCAzMF0sXHJcblx0XCJjb3JhbFwiOiBbMjU1LCAxMjcsIDgwXSxcclxuXHRcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsIDE0OSwgMjM3XSxcclxuXHRcImNvcm5zaWxrXCI6IFsyNTUsIDI0OCwgMjIwXSxcclxuXHRcImNyaW1zb25cIjogWzIyMCwgMjAsIDYwXSxcclxuXHRcImN5YW5cIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImRhcmtibHVlXCI6IFswLCAwLCAxMzldLFxyXG5cdFwiZGFya2N5YW5cIjogWzAsIDEzOSwgMTM5XSxcclxuXHRcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwgMTM0LCAxMV0sXHJcblx0XCJkYXJrZ3JheVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJrZ3JlZW5cIjogWzAsIDEwMCwgMF0sXHJcblx0XCJkYXJrZ3JleVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJra2hha2lcIjogWzE4OSwgMTgzLCAxMDddLFxyXG5cdFwiZGFya21hZ2VudGFcIjogWzEzOSwgMCwgMTM5XSxcclxuXHRcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwgMTA3LCA0N10sXHJcblx0XCJkYXJrb3JhbmdlXCI6IFsyNTUsIDE0MCwgMF0sXHJcblx0XCJkYXJrb3JjaGlkXCI6IFsxNTMsIDUwLCAyMDRdLFxyXG5cdFwiZGFya3JlZFwiOiBbMTM5LCAwLCAwXSxcclxuXHRcImRhcmtzYWxtb25cIjogWzIzMywgMTUwLCAxMjJdLFxyXG5cdFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsIDE4OCwgMTQzXSxcclxuXHRcImRhcmtzbGF0ZWJsdWVcIjogWzcyLCA2MSwgMTM5XSxcclxuXHRcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrdHVycXVvaXNlXCI6IFswLCAyMDYsIDIwOV0sXHJcblx0XCJkYXJrdmlvbGV0XCI6IFsxNDgsIDAsIDIxMV0sXHJcblx0XCJkZWVwcGlua1wiOiBbMjU1LCAyMCwgMTQ3XSxcclxuXHRcImRlZXBza3libHVlXCI6IFswLCAxOTEsIDI1NV0sXHJcblx0XCJkaW1ncmF5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRpbWdyZXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZG9kZ2VyYmx1ZVwiOiBbMzAsIDE0NCwgMjU1XSxcclxuXHRcImZpcmVicmlja1wiOiBbMTc4LCAzNCwgMzRdLFxyXG5cdFwiZmxvcmFsd2hpdGVcIjogWzI1NSwgMjUwLCAyNDBdLFxyXG5cdFwiZm9yZXN0Z3JlZW5cIjogWzM0LCAxMzksIDM0XSxcclxuXHRcImZ1Y2hzaWFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcImdhaW5zYm9yb1wiOiBbMjIwLCAyMjAsIDIyMF0sXHJcblx0XCJnaG9zdHdoaXRlXCI6IFsyNDgsIDI0OCwgMjU1XSxcclxuXHRcImdvbGRcIjogWzI1NSwgMjE1LCAwXSxcclxuXHRcImdvbGRlbnJvZFwiOiBbMjE4LCAxNjUsIDMyXSxcclxuXHRcImdyYXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiZ3JlZW5cIjogWzAsIDEyOCwgMF0sXHJcblx0XCJncmVlbnllbGxvd1wiOiBbMTczLCAyNTUsIDQ3XSxcclxuXHRcImdyZXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiaG9uZXlkZXdcIjogWzI0MCwgMjU1LCAyNDBdLFxyXG5cdFwiaG90cGlua1wiOiBbMjU1LCAxMDUsIDE4MF0sXHJcblx0XCJpbmRpYW5yZWRcIjogWzIwNSwgOTIsIDkyXSxcclxuXHRcImluZGlnb1wiOiBbNzUsIDAsIDEzMF0sXHJcblx0XCJpdm9yeVwiOiBbMjU1LCAyNTUsIDI0MF0sXHJcblx0XCJraGFraVwiOiBbMjQwLCAyMzAsIDE0MF0sXHJcblx0XCJsYXZlbmRlclwiOiBbMjMwLCAyMzAsIDI1MF0sXHJcblx0XCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsIDI0MCwgMjQ1XSxcclxuXHRcImxhd25ncmVlblwiOiBbMTI0LCAyNTIsIDBdLFxyXG5cdFwibGVtb25jaGlmZm9uXCI6IFsyNTUsIDI1MCwgMjA1XSxcclxuXHRcImxpZ2h0Ymx1ZVwiOiBbMTczLCAyMTYsIDIzMF0sXHJcblx0XCJsaWdodGNvcmFsXCI6IFsyNDAsIDEyOCwgMTI4XSxcclxuXHRcImxpZ2h0Y3lhblwiOiBbMjI0LCAyNTUsIDI1NV0sXHJcblx0XCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLCAyNTAsIDIxMF0sXHJcblx0XCJsaWdodGdyYXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRncmVlblwiOiBbMTQ0LCAyMzgsIDE0NF0sXHJcblx0XCJsaWdodGdyZXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRwaW5rXCI6IFsyNTUsIDE4MiwgMTkzXSxcclxuXHRcImxpZ2h0c2FsbW9uXCI6IFsyNTUsIDE2MCwgMTIyXSxcclxuXHRcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLCAxNzgsIDE3MF0sXHJcblx0XCJsaWdodHNreWJsdWVcIjogWzEzNSwgMjA2LCAyNTBdLFxyXG5cdFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwgMTk2LCAyMjJdLFxyXG5cdFwibGlnaHR5ZWxsb3dcIjogWzI1NSwgMjU1LCAyMjRdLFxyXG5cdFwibGltZVwiOiBbMCwgMjU1LCAwXSxcclxuXHRcImxpbWVncmVlblwiOiBbNTAsIDIwNSwgNTBdLFxyXG5cdFwibGluZW5cIjogWzI1MCwgMjQwLCAyMzBdLFxyXG5cdFwibWFnZW50YVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwibWFyb29uXCI6IFsxMjgsIDAsIDBdLFxyXG5cdFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLCAyMDUsIDE3MF0sXHJcblx0XCJtZWRpdW1ibHVlXCI6IFswLCAwLCAyMDVdLFxyXG5cdFwibWVkaXVtb3JjaGlkXCI6IFsxODYsIDg1LCAyMTFdLFxyXG5cdFwibWVkaXVtcHVycGxlXCI6IFsxNDcsIDExMiwgMjE5XSxcclxuXHRcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwgMTc5LCAxMTNdLFxyXG5cdFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsIDEwNCwgMjM4XSxcclxuXHRcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLCAyNTAsIDE1NF0sXHJcblx0XCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLCAyMDksIDIwNF0sXHJcblx0XCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwgMjEsIDEzM10sXHJcblx0XCJtaWRuaWdodGJsdWVcIjogWzI1LCAyNSwgMTEyXSxcclxuXHRcIm1pbnRjcmVhbVwiOiBbMjQ1LCAyNTUsIDI1MF0sXHJcblx0XCJtaXN0eXJvc2VcIjogWzI1NSwgMjI4LCAyMjVdLFxyXG5cdFwibW9jY2FzaW5cIjogWzI1NSwgMjI4LCAxODFdLFxyXG5cdFwibmF2YWpvd2hpdGVcIjogWzI1NSwgMjIyLCAxNzNdLFxyXG5cdFwibmF2eVwiOiBbMCwgMCwgMTI4XSxcclxuXHRcIm9sZGxhY2VcIjogWzI1MywgMjQ1LCAyMzBdLFxyXG5cdFwib2xpdmVcIjogWzEyOCwgMTI4LCAwXSxcclxuXHRcIm9saXZlZHJhYlwiOiBbMTA3LCAxNDIsIDM1XSxcclxuXHRcIm9yYW5nZVwiOiBbMjU1LCAxNjUsIDBdLFxyXG5cdFwib3JhbmdlcmVkXCI6IFsyNTUsIDY5LCAwXSxcclxuXHRcIm9yY2hpZFwiOiBbMjE4LCAxMTIsIDIxNF0sXHJcblx0XCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsIDIzMiwgMTcwXSxcclxuXHRcInBhbGVncmVlblwiOiBbMTUyLCAyNTEsIDE1Ml0sXHJcblx0XCJwYWxldHVycXVvaXNlXCI6IFsxNzUsIDIzOCwgMjM4XSxcclxuXHRcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwgMTEyLCAxNDddLFxyXG5cdFwicGFwYXlhd2hpcFwiOiBbMjU1LCAyMzksIDIxM10sXHJcblx0XCJwZWFjaHB1ZmZcIjogWzI1NSwgMjE4LCAxODVdLFxyXG5cdFwicGVydVwiOiBbMjA1LCAxMzMsIDYzXSxcclxuXHRcInBpbmtcIjogWzI1NSwgMTkyLCAyMDNdLFxyXG5cdFwicGx1bVwiOiBbMjIxLCAxNjAsIDIyMV0sXHJcblx0XCJwb3dkZXJibHVlXCI6IFsxNzYsIDIyNCwgMjMwXSxcclxuXHRcInB1cnBsZVwiOiBbMTI4LCAwLCAxMjhdLFxyXG5cdFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLCA1MSwgMTUzXSxcclxuXHRcInJlZFwiOiBbMjU1LCAwLCAwXSxcclxuXHRcInJvc3licm93blwiOiBbMTg4LCAxNDMsIDE0M10sXHJcblx0XCJyb3lhbGJsdWVcIjogWzY1LCAxMDUsIDIyNV0sXHJcblx0XCJzYWRkbGVicm93blwiOiBbMTM5LCA2OSwgMTldLFxyXG5cdFwic2FsbW9uXCI6IFsyNTAsIDEyOCwgMTE0XSxcclxuXHRcInNhbmR5YnJvd25cIjogWzI0NCwgMTY0LCA5Nl0sXHJcblx0XCJzZWFncmVlblwiOiBbNDYsIDEzOSwgODddLFxyXG5cdFwic2Vhc2hlbGxcIjogWzI1NSwgMjQ1LCAyMzhdLFxyXG5cdFwic2llbm5hXCI6IFsxNjAsIDgyLCA0NV0sXHJcblx0XCJzaWx2ZXJcIjogWzE5MiwgMTkyLCAxOTJdLFxyXG5cdFwic2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDIzNV0sXHJcblx0XCJzbGF0ZWJsdWVcIjogWzEwNiwgOTAsIDIwNV0sXHJcblx0XCJzbGF0ZWdyYXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic2xhdGVncmV5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNub3dcIjogWzI1NSwgMjUwLCAyNTBdLFxyXG5cdFwic3ByaW5nZ3JlZW5cIjogWzAsIDI1NSwgMTI3XSxcclxuXHRcInN0ZWVsYmx1ZVwiOiBbNzAsIDEzMCwgMTgwXSxcclxuXHRcInRhblwiOiBbMjEwLCAxODAsIDE0MF0sXHJcblx0XCJ0ZWFsXCI6IFswLCAxMjgsIDEyOF0sXHJcblx0XCJ0aGlzdGxlXCI6IFsyMTYsIDE5MSwgMjE2XSxcclxuXHRcInRvbWF0b1wiOiBbMjU1LCA5OSwgNzFdLFxyXG5cdFwidHVycXVvaXNlXCI6IFs2NCwgMjI0LCAyMDhdLFxyXG5cdFwidmlvbGV0XCI6IFsyMzgsIDEzMCwgMjM4XSxcclxuXHRcIndoZWF0XCI6IFsyNDUsIDIyMiwgMTc5XSxcclxuXHRcIndoaXRlXCI6IFsyNTUsIDI1NSwgMjU1XSxcclxuXHRcIndoaXRlc21va2VcIjogWzI0NSwgMjQ1LCAyNDVdLFxyXG5cdFwieWVsbG93XCI6IFsyNTUsIDI1NSwgMF0sXHJcblx0XCJ5ZWxsb3dncmVlblwiOiBbMTU0LCAyMDUsIDUwXVxyXG59O1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubWFrZURhdGFVcmlUb0J1ZmZlciA9IHZvaWQgMDtcbi8qKlxuICogUmV0dXJucyBhIGBCdWZmZXJgIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIGRhdGEgVVJJIGB1cmlgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgRGF0YSBVUkkgdG8gdHVybiBpbnRvIGEgQnVmZmVyIGluc3RhbmNlXG4gKi9cbmNvbnN0IG1ha2VEYXRhVXJpVG9CdWZmZXIgPSAoY29udmVydCkgPT4gKHVyaSkgPT4ge1xuICAgIHVyaSA9IFN0cmluZyh1cmkpO1xuICAgIGlmICghL15kYXRhOi9pLnRlc3QodXJpKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgdXJpYCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSBEYXRhIFVSSSAobXVzdCBiZWdpbiB3aXRoIFwiZGF0YTpcIiknKTtcbiAgICB9XG4gICAgLy8gc3RyaXAgbmV3bGluZXNcbiAgICB1cmkgPSB1cmkucmVwbGFjZSgvXFxyP1xcbi9nLCAnJyk7XG4gICAgLy8gc3BsaXQgdGhlIFVSSSB1cCBpbnRvIHRoZSBcIm1ldGFkYXRhXCIgYW5kIHRoZSBcImRhdGFcIiBwb3J0aW9uc1xuICAgIGNvbnN0IGZpcnN0Q29tbWEgPSB1cmkuaW5kZXhPZignLCcpO1xuICAgIGlmIChmaXJzdENvbW1hID09PSAtMSB8fCBmaXJzdENvbW1hIDw9IDQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWFsZm9ybWVkIGRhdGE6IFVSSScpO1xuICAgIH1cbiAgICAvLyByZW1vdmUgdGhlIFwiZGF0YTpcIiBzY2hlbWUgYW5kIHBhcnNlIHRoZSBtZXRhZGF0YVxuICAgIGNvbnN0IG1ldGEgPSB1cmkuc3Vic3RyaW5nKDUsIGZpcnN0Q29tbWEpLnNwbGl0KCc7Jyk7XG4gICAgbGV0IGNoYXJzZXQgPSAnJztcbiAgICBsZXQgYmFzZTY0ID0gZmFsc2U7XG4gICAgY29uc3QgdHlwZSA9IG1ldGFbMF0gfHwgJ3RleHQvcGxhaW4nO1xuICAgIGxldCB0eXBlRnVsbCA9IHR5cGU7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtZXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChtZXRhW2ldID09PSAnYmFzZTY0Jykge1xuICAgICAgICAgICAgYmFzZTY0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXRhW2ldKSB7XG4gICAgICAgICAgICB0eXBlRnVsbCArPSBgOyR7bWV0YVtpXX1gO1xuICAgICAgICAgICAgaWYgKG1ldGFbaV0uaW5kZXhPZignY2hhcnNldD0nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBtZXRhW2ldLnN1YnN0cmluZyg4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBkZWZhdWx0cyB0byBVUy1BU0NJSSBvbmx5IGlmIHR5cGUgaXMgbm90IHByb3ZpZGVkXG4gICAgaWYgKCFtZXRhWzBdICYmICFjaGFyc2V0Lmxlbmd0aCkge1xuICAgICAgICB0eXBlRnVsbCArPSAnO2NoYXJzZXQ9VVMtQVNDSUknO1xuICAgICAgICBjaGFyc2V0ID0gJ1VTLUFTQ0lJJztcbiAgICB9XG4gICAgLy8gZ2V0IHRoZSBlbmNvZGVkIGRhdGEgcG9ydGlvbiBhbmQgZGVjb2RlIFVSSS1lbmNvZGVkIGNoYXJzXG4gICAgY29uc3QgZGF0YSA9IHVuZXNjYXBlKHVyaS5zdWJzdHJpbmcoZmlyc3RDb21tYSArIDEpKTtcbiAgICBjb25zdCBidWZmZXIgPSBiYXNlNjQgPyBjb252ZXJ0LmJhc2U2NFRvQXJyYXlCdWZmZXIoZGF0YSkgOiBjb252ZXJ0LnN0cmluZ1RvQnVmZmVyKGRhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHR5cGVGdWxsLFxuICAgICAgICBjaGFyc2V0LFxuICAgICAgICBidWZmZXIsXG4gICAgfTtcbn07XG5leHBvcnRzLm1ha2VEYXRhVXJpVG9CdWZmZXIgPSBtYWtlRGF0YVVyaVRvQnVmZmVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbW9uLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kYXRhVXJpVG9CdWZmZXIgPSB2b2lkIDA7XG5jb25zdCBjb21tb25fMSA9IHJlcXVpcmUoXCIuL2NvbW1vblwiKTtcbmZ1bmN0aW9uIG5vZGVCdWZmZXJ0b0FycmF5QnVmZmVyKG5vZGVCdWYpIHtcbiAgICBpZiAobm9kZUJ1Zi5ieXRlTGVuZ3RoID09PSBub2RlQnVmLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBub2RlQnVmLmJ1ZmZlcjsgLy8gbGFyZ2Ugc3RyaW5ncyBtYXkgZ2V0IHRoZWlyIG93biBtZW1vcnkgYWxsb2NhdGlvblxuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIobm9kZUJ1Zi5ieXRlTGVuZ3RoKTtcbiAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICB2aWV3LnNldChub2RlQnVmKTtcbiAgICByZXR1cm4gYnVmZmVyO1xufVxuZnVuY3Rpb24gYmFzZTY0VG9BcnJheUJ1ZmZlcihiYXNlNjQpIHtcbiAgICByZXR1cm4gbm9kZUJ1ZmZlcnRvQXJyYXlCdWZmZXIoQnVmZmVyLmZyb20oYmFzZTY0LCAnYmFzZTY0JykpO1xufVxuZnVuY3Rpb24gc3RyaW5nVG9CdWZmZXIoc3RyKSB7XG4gICAgcmV0dXJuIG5vZGVCdWZmZXJ0b0FycmF5QnVmZmVyKEJ1ZmZlci5mcm9tKHN0ciwgJ2FzY2lpJykpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgYEJ1ZmZlcmAgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gZGF0YSBVUkkgYHVyaWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVyaSBEYXRhIFVSSSB0byB0dXJuIGludG8gYSBCdWZmZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0cy5kYXRhVXJpVG9CdWZmZXIgPSAoMCwgY29tbW9uXzEubWFrZURhdGFVcmlUb0J1ZmZlcikoeyBzdHJpbmdUb0J1ZmZlciwgYmFzZTY0VG9BcnJheUJ1ZmZlciB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vZGUuanMubWFwIiwiLyogZXNsaW50LWVudiBicm93c2VyICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gbG9jYWxzdG9yYWdlKCk7XG5leHBvcnRzLmRlc3Ryb3kgPSAoKCkgPT4ge1xuXHRsZXQgd2FybmVkID0gZmFsc2U7XG5cblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoIXdhcm5lZCkge1xuXHRcdFx0d2FybmVkID0gdHJ1ZTtcblx0XHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHRcdH1cblx0fTtcbn0pKCk7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuXHQnIzAwMDBDQycsXG5cdCcjMDAwMEZGJyxcblx0JyMwMDMzQ0MnLFxuXHQnIzAwMzNGRicsXG5cdCcjMDA2NkNDJyxcblx0JyMwMDY2RkYnLFxuXHQnIzAwOTlDQycsXG5cdCcjMDA5OUZGJyxcblx0JyMwMENDMDAnLFxuXHQnIzAwQ0MzMycsXG5cdCcjMDBDQzY2Jyxcblx0JyMwMENDOTknLFxuXHQnIzAwQ0NDQycsXG5cdCcjMDBDQ0ZGJyxcblx0JyMzMzAwQ0MnLFxuXHQnIzMzMDBGRicsXG5cdCcjMzMzM0NDJyxcblx0JyMzMzMzRkYnLFxuXHQnIzMzNjZDQycsXG5cdCcjMzM2NkZGJyxcblx0JyMzMzk5Q0MnLFxuXHQnIzMzOTlGRicsXG5cdCcjMzNDQzAwJyxcblx0JyMzM0NDMzMnLFxuXHQnIzMzQ0M2NicsXG5cdCcjMzNDQzk5Jyxcblx0JyMzM0NDQ0MnLFxuXHQnIzMzQ0NGRicsXG5cdCcjNjYwMENDJyxcblx0JyM2NjAwRkYnLFxuXHQnIzY2MzNDQycsXG5cdCcjNjYzM0ZGJyxcblx0JyM2NkNDMDAnLFxuXHQnIzY2Q0MzMycsXG5cdCcjOTkwMENDJyxcblx0JyM5OTAwRkYnLFxuXHQnIzk5MzNDQycsXG5cdCcjOTkzM0ZGJyxcblx0JyM5OUNDMDAnLFxuXHQnIzk5Q0MzMycsXG5cdCcjQ0MwMDAwJyxcblx0JyNDQzAwMzMnLFxuXHQnI0NDMDA2NicsXG5cdCcjQ0MwMDk5Jyxcblx0JyNDQzAwQ0MnLFxuXHQnI0NDMDBGRicsXG5cdCcjQ0MzMzAwJyxcblx0JyNDQzMzMzMnLFxuXHQnI0NDMzM2NicsXG5cdCcjQ0MzMzk5Jyxcblx0JyNDQzMzQ0MnLFxuXHQnI0NDMzNGRicsXG5cdCcjQ0M2NjAwJyxcblx0JyNDQzY2MzMnLFxuXHQnI0NDOTkwMCcsXG5cdCcjQ0M5OTMzJyxcblx0JyNDQ0NDMDAnLFxuXHQnI0NDQ0MzMycsXG5cdCcjRkYwMDAwJyxcblx0JyNGRjAwMzMnLFxuXHQnI0ZGMDA2NicsXG5cdCcjRkYwMDk5Jyxcblx0JyNGRjAwQ0MnLFxuXHQnI0ZGMDBGRicsXG5cdCcjRkYzMzAwJyxcblx0JyNGRjMzMzMnLFxuXHQnI0ZGMzM2NicsXG5cdCcjRkYzMzk5Jyxcblx0JyNGRjMzQ0MnLFxuXHQnI0ZGMzNGRicsXG5cdCcjRkY2NjAwJyxcblx0JyNGRjY2MzMnLFxuXHQnI0ZGOTkwMCcsXG5cdCcjRkY5OTMzJyxcblx0JyNGRkNDMDAnLFxuXHQnI0ZGQ0MzMydcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0Ly8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuXHQvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuXHQvLyBleHBsaWNpdGx5XG5cdGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiAod2luZG93LnByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCB3aW5kb3cucHJvY2Vzcy5fX253anMpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBJbnRlcm5ldCBFeHBsb3JlciBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydCBjb2xvcnMuXG5cdGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcXC8oXFxkKykvKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGxldCBtO1xuXG5cdC8vIElzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG5cdC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG5cdHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuXHRcdC8vIElzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcblx0XHQodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuXHRcdC8vIElzIGZpcmVmb3ggPj0gdjMxP1xuXHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIChtID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykpICYmIHBhcnNlSW50KG1bMV0sIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGRlYnVnIGluc3RhbmNlIHRvIGJlIGNvbG9yZWRcblx0KiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBBbiBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG5cdFx0bGV0IGhhc2ggPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcblx0XHR9XG5cblx0XHRyZXR1cm4gY3JlYXRlRGVidWcuY29sb3JzW01hdGguYWJzKGhhc2gpICUgY3JlYXRlRGVidWcuY29sb3JzLmxlbmd0aF07XG5cdH1cblx0Y3JlYXRlRGVidWcuc2VsZWN0Q29sb3IgPSBzZWxlY3RDb2xvcjtcblxuXHQvKipcblx0KiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblx0XHRsZXQgcHJldlRpbWU7XG5cdFx0bGV0IGVuYWJsZU92ZXJyaWRlID0gbnVsbDtcblx0XHRsZXQgbmFtZXNwYWNlc0NhY2hlO1xuXHRcdGxldCBlbmFibGVkQ2FjaGU7XG5cblx0XHRmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG5cdFx0XHQvLyBEaXNhYmxlZD9cblx0XHRcdGlmICghZGVidWcuZW5hYmxlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNlbGYgPSBkZWJ1ZztcblxuXHRcdFx0Ly8gU2V0IGBkaWZmYCB0aW1lc3RhbXBcblx0XHRcdGNvbnN0IGN1cnIgPSBOdW1iZXIobmV3IERhdGUoKSk7XG5cdFx0XHRjb25zdCBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG5cdFx0XHRzZWxmLmRpZmYgPSBtcztcblx0XHRcdHNlbGYucHJldiA9IHByZXZUaW1lO1xuXHRcdFx0c2VsZi5jdXJyID0gY3Vycjtcblx0XHRcdHByZXZUaW1lID0gY3VycjtcblxuXHRcdFx0YXJnc1swXSA9IGNyZWF0ZURlYnVnLmNvZXJjZShhcmdzWzBdKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdFx0XHRhcmdzLnVuc2hpZnQoJyVPJyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0YXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIChtYXRjaCwgZm9ybWF0KSA9PiB7XG5cdFx0XHRcdC8vIElmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcblx0XHRcdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuICclJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZXIgPSBjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cdFx0XHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gYXJnc1tpbmRleF07XG5cdFx0XHRcdFx0bWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG5cdFx0XHRcdFx0Ly8gTm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuXHRcdFx0XHRcdGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdFx0XHRpbmRleC0tO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtYXRjaDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuXHRcdFx0Y3JlYXRlRGVidWcuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG5cdFx0XHRjb25zdCBsb2dGbiA9IHNlbGYubG9nIHx8IGNyZWF0ZURlYnVnLmxvZztcblx0XHRcdGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdH1cblxuXHRcdGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblx0XHRkZWJ1Zy51c2VDb2xvcnMgPSBjcmVhdGVEZWJ1Zy51c2VDb2xvcnMoKTtcblx0XHRkZWJ1Zy5jb2xvciA9IGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cdFx0ZGVidWcuZXh0ZW5kID0gZXh0ZW5kO1xuXHRcdGRlYnVnLmRlc3Ryb3kgPSBjcmVhdGVEZWJ1Zy5kZXN0cm95OyAvLyBYWFggVGVtcG9yYXJ5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWJ1ZywgJ2VuYWJsZWQnLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoZW5hYmxlT3ZlcnJpZGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW5hYmxlT3ZlcnJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5hbWVzcGFjZXNDYWNoZSAhPT0gY3JlYXRlRGVidWcubmFtZXNwYWNlcykge1xuXHRcdFx0XHRcdG5hbWVzcGFjZXNDYWNoZSA9IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXM7XG5cdFx0XHRcdFx0ZW5hYmxlZENhY2hlID0gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVuYWJsZWRDYWNoZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cdFx0Y3JlYXRlRGVidWcubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zbGljZSgxKSArICckJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLm1hcCh0b05hbWVzcGFjZSksXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5za2lwcy5tYXAodG9OYW1lc3BhY2UpLm1hcChuYW1lc3BhY2UgPT4gJy0nICsgbmFtZXNwYWNlKVxuXHRcdF0uam9pbignLCcpO1xuXHRcdGNyZWF0ZURlYnVnLmVuYWJsZSgnJyk7XG5cdFx0cmV0dXJuIG5hbWVzcGFjZXM7XG5cdH1cblxuXHQvKipcblx0KiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHQqIEByZXR1cm4ge0Jvb2xlYW59XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG5cdFx0aWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRsZXQgaTtcblx0XHRsZXQgbGVuO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCogQ29udmVydCByZWdleHAgdG8gbmFtZXNwYWNlXG5cdCpcblx0KiBAcGFyYW0ge1JlZ0V4cH0gcmVneGVwXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gdG9OYW1lc3BhY2UocmVnZXhwKSB7XG5cdFx0cmV0dXJuIHJlZ2V4cC50b1N0cmluZygpXG5cdFx0XHQuc3Vic3RyaW5nKDIsIHJlZ2V4cC50b1N0cmluZygpLmxlbmd0aCAtIDIpXG5cdFx0XHQucmVwbGFjZSgvXFwuXFwqXFw/JC8sICcqJyk7XG5cdH1cblxuXHQvKipcblx0KiBDb2VyY2UgYHZhbGAuXG5cdCpcblx0KiBAcGFyYW0ge01peGVkfSB2YWxcblx0KiBAcmV0dXJuIHtNaXhlZH1cblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0cmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxuXG5cdC8qKlxuXHQqIFhYWCBETyBOT1QgVVNFLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0dWIgZnVuY3Rpb24uXG5cdCogWFhYIEl0IFdJTEwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXHQqL1xuXHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHR9XG5cblx0Y3JlYXRlRGVidWcuZW5hYmxlKGNyZWF0ZURlYnVnLmxvYWQoKSk7XG5cblx0cmV0dXJuIGNyZWF0ZURlYnVnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHVwO1xuIiwiLyoqXG4gKiBEZXRlY3QgRWxlY3Ryb24gcmVuZGVyZXIgLyBud2pzIHByb2Nlc3MsIHdoaWNoIGlzIG5vZGUsIGJ1dCB3ZSBzaG91bGRcbiAqIHRyZWF0IGFzIGEgYnJvd3Nlci5cbiAqL1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8IHByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCBwcm9jZXNzLmJyb3dzZXIgPT09IHRydWUgfHwgcHJvY2Vzcy5fX253anMpIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Jyb3dzZXIuanMnKTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9ub2RlLmpzJyk7XG59XG4iLCIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxuY29uc3QgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5kZXN0cm95ID0gdXRpbC5kZXByZWNhdGUoXG5cdCgpID0+IHt9LFxuXHQnSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLidcbik7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gWzYsIDIsIDMsIDQsIDUsIDFdO1xuXG50cnkge1xuXHQvLyBPcHRpb25hbCBkZXBlbmRlbmN5IChhcyBpbiwgZG9lc24ndCBuZWVkIHRvIGJlIGluc3RhbGxlZCwgTk9UIGxpa2Ugb3B0aW9uYWxEZXBlbmRlbmNpZXMgaW4gcGFja2FnZS5qc29uKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5cdGNvbnN0IHN1cHBvcnRzQ29sb3IgPSByZXF1aXJlKCdzdXBwb3J0cy1jb2xvcicpO1xuXG5cdGlmIChzdXBwb3J0c0NvbG9yICYmIChzdXBwb3J0c0NvbG9yLnN0ZGVyciB8fCBzdXBwb3J0c0NvbG9yKS5sZXZlbCA+PSAyKSB7XG5cdFx0ZXhwb3J0cy5jb2xvcnMgPSBbXG5cdFx0XHQyMCxcblx0XHRcdDIxLFxuXHRcdFx0MjYsXG5cdFx0XHQyNyxcblx0XHRcdDMyLFxuXHRcdFx0MzMsXG5cdFx0XHQzOCxcblx0XHRcdDM5LFxuXHRcdFx0NDAsXG5cdFx0XHQ0MSxcblx0XHRcdDQyLFxuXHRcdFx0NDMsXG5cdFx0XHQ0NCxcblx0XHRcdDQ1LFxuXHRcdFx0NTYsXG5cdFx0XHQ1Nyxcblx0XHRcdDYyLFxuXHRcdFx0NjMsXG5cdFx0XHQ2OCxcblx0XHRcdDY5LFxuXHRcdFx0NzQsXG5cdFx0XHQ3NSxcblx0XHRcdDc2LFxuXHRcdFx0NzcsXG5cdFx0XHQ3OCxcblx0XHRcdDc5LFxuXHRcdFx0ODAsXG5cdFx0XHQ4MSxcblx0XHRcdDkyLFxuXHRcdFx0OTMsXG5cdFx0XHQ5OCxcblx0XHRcdDk5LFxuXHRcdFx0MTEyLFxuXHRcdFx0MTEzLFxuXHRcdFx0MTI4LFxuXHRcdFx0MTI5LFxuXHRcdFx0MTM0LFxuXHRcdFx0MTM1LFxuXHRcdFx0MTQ4LFxuXHRcdFx0MTQ5LFxuXHRcdFx0MTYwLFxuXHRcdFx0MTYxLFxuXHRcdFx0MTYyLFxuXHRcdFx0MTYzLFxuXHRcdFx0MTY0LFxuXHRcdFx0MTY1LFxuXHRcdFx0MTY2LFxuXHRcdFx0MTY3LFxuXHRcdFx0MTY4LFxuXHRcdFx0MTY5LFxuXHRcdFx0MTcwLFxuXHRcdFx0MTcxLFxuXHRcdFx0MTcyLFxuXHRcdFx0MTczLFxuXHRcdFx0MTc4LFxuXHRcdFx0MTc5LFxuXHRcdFx0MTg0LFxuXHRcdFx0MTg1LFxuXHRcdFx0MTk2LFxuXHRcdFx0MTk3LFxuXHRcdFx0MTk4LFxuXHRcdFx0MTk5LFxuXHRcdFx0MjAwLFxuXHRcdFx0MjAxLFxuXHRcdFx0MjAyLFxuXHRcdFx0MjAzLFxuXHRcdFx0MjA0LFxuXHRcdFx0MjA1LFxuXHRcdFx0MjA2LFxuXHRcdFx0MjA3LFxuXHRcdFx0MjA4LFxuXHRcdFx0MjA5LFxuXHRcdFx0MjE0LFxuXHRcdFx0MjE1LFxuXHRcdFx0MjIwLFxuXHRcdFx0MjIxXG5cdFx0XTtcblx0fVxufSBjYXRjaCAoZXJyb3IpIHtcblx0Ly8gU3dhbGxvdyAtIHdlIG9ubHkgY2FyZSBpZiBgc3VwcG9ydHMtY29sb3JgIGlzIGF2YWlsYWJsZTsgaXQgZG9lc24ndCBoYXZlIHRvIGJlLlxufVxuXG4vKipcbiAqIEJ1aWxkIHVwIHRoZSBkZWZhdWx0IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiAgICQgREVCVUdfQ09MT1JTPW5vIERFQlVHX0RFUFRIPTEwIERFQlVHX1NIT1dfSElEREVOPWVuYWJsZWQgbm9kZSBzY3JpcHQuanNcbiAqL1xuXG5leHBvcnRzLmluc3BlY3RPcHRzID0gT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmZpbHRlcihrZXkgPT4ge1xuXHRyZXR1cm4gL15kZWJ1Z18vaS50ZXN0KGtleSk7XG59KS5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XG5cdC8vIENhbWVsLWNhc2Vcblx0Y29uc3QgcHJvcCA9IGtleVxuXHRcdC5zdWJzdHJpbmcoNilcblx0XHQudG9Mb3dlckNhc2UoKVxuXHRcdC5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgaykgPT4ge1xuXHRcdFx0cmV0dXJuIGsudG9VcHBlckNhc2UoKTtcblx0XHR9KTtcblxuXHQvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlIGludG8gSlMgdmFsdWVcblx0bGV0IHZhbCA9IHByb2Nlc3MuZW52W2tleV07XG5cdGlmICgvXih5ZXN8b258dHJ1ZXxlbmFibGVkKSQvaS50ZXN0KHZhbCkpIHtcblx0XHR2YWwgPSB0cnVlO1xuXHR9IGVsc2UgaWYgKC9eKG5vfG9mZnxmYWxzZXxkaXNhYmxlZCkkL2kudGVzdCh2YWwpKSB7XG5cdFx0dmFsID0gZmFsc2U7XG5cdH0gZWxzZSBpZiAodmFsID09PSAnbnVsbCcpIHtcblx0XHR2YWwgPSBudWxsO1xuXHR9IGVsc2Uge1xuXHRcdHZhbCA9IE51bWJlcih2YWwpO1xuXHR9XG5cblx0b2JqW3Byb3BdID0gdmFsO1xuXHRyZXR1cm4gb2JqO1xufSwge30pO1xuXG4vKipcbiAqIElzIHN0ZG91dCBhIFRUWT8gQ29sb3JlZCBvdXRwdXQgaXMgZW5hYmxlZCB3aGVuIGB0cnVlYC5cbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdHJldHVybiAnY29sb3JzJyBpbiBleHBvcnRzLmluc3BlY3RPcHRzID9cblx0XHRCb29sZWFuKGV4cG9ydHMuaW5zcGVjdE9wdHMuY29sb3JzKSA6XG5cdFx0dHR5LmlzYXR0eShwcm9jZXNzLnN0ZGVyci5mZCk7XG59XG5cbi8qKlxuICogQWRkcyBBTlNJIGNvbG9yIGVzY2FwZSBjb2RlcyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdGNvbnN0IHtuYW1lc3BhY2U6IG5hbWUsIHVzZUNvbG9yc30gPSB0aGlzO1xuXG5cdGlmICh1c2VDb2xvcnMpIHtcblx0XHRjb25zdCBjID0gdGhpcy5jb2xvcjtcblx0XHRjb25zdCBjb2xvckNvZGUgPSAnXFx1MDAxQlszJyArIChjIDwgOCA/IGMgOiAnODs1OycgKyBjKTtcblx0XHRjb25zdCBwcmVmaXggPSBgICAke2NvbG9yQ29kZX07MW0ke25hbWV9IFxcdTAwMUJbMG1gO1xuXG5cdFx0YXJnc1swXSA9IHByZWZpeCArIGFyZ3NbMF0uc3BsaXQoJ1xcbicpLmpvaW4oJ1xcbicgKyBwcmVmaXgpO1xuXHRcdGFyZ3MucHVzaChjb2xvckNvZGUgKyAnbSsnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKSArICdcXHUwMDFCWzBtJyk7XG5cdH0gZWxzZSB7XG5cdFx0YXJnc1swXSA9IGdldERhdGUoKSArIG5hbWUgKyAnICcgKyBhcmdzWzBdO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldERhdGUoKSB7XG5cdGlmIChleHBvcnRzLmluc3BlY3RPcHRzLmhpZGVEYXRlKSB7XG5cdFx0cmV0dXJuICcnO1xuXHR9XG5cdHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgKyAnICc7XG59XG5cbi8qKlxuICogSW52b2tlcyBgdXRpbC5mb3JtYXRXaXRoT3B0aW9ucygpYCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIGFuZCB3cml0ZXMgdG8gc3RkZXJyLlxuICovXG5cbmZ1bmN0aW9uIGxvZyguLi5hcmdzKSB7XG5cdHJldHVybiBwcm9jZXNzLnN0ZGVyci53cml0ZSh1dGlsLmZvcm1hdFdpdGhPcHRpb25zKGV4cG9ydHMuaW5zcGVjdE9wdHMsIC4uLmFyZ3MpICsgJ1xcbicpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0cHJvY2Vzcy5lbnYuREVCVUcgPSBuYW1lc3BhY2VzO1xuXHR9IGVsc2Uge1xuXHRcdC8vIElmIHlvdSBzZXQgYSBwcm9jZXNzLmVudiBmaWVsZCB0byBudWxsIG9yIHVuZGVmaW5lZCwgaXQgZ2V0cyBjYXN0IHRvIHRoZVxuXHRcdC8vIHN0cmluZyAnbnVsbCcgb3IgJ3VuZGVmaW5lZCcuIEp1c3QgZGVsZXRlIGluc3RlYWQuXG5cdFx0ZGVsZXRlIHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcblx0cmV0dXJuIHByb2Nlc3MuZW52LkRFQlVHO1xufVxuXG4vKipcbiAqIEluaXQgbG9naWMgZm9yIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuICpcbiAqIENyZWF0ZSBhIG5ldyBgaW5zcGVjdE9wdHNgIG9iamVjdCBpbiBjYXNlIGB1c2VDb2xvcnNgIGlzIHNldFxuICogZGlmZmVyZW50bHkgZm9yIGEgcGFydGljdWxhciBgZGVidWdgIGluc3RhbmNlLlxuICovXG5cbmZ1bmN0aW9uIGluaXQoZGVidWcpIHtcblx0ZGVidWcuaW5zcGVjdE9wdHMgPSB7fTtcblxuXHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXhwb3J0cy5pbnNwZWN0T3B0cyk7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdGRlYnVnLmluc3BlY3RPcHRzW2tleXNbaV1dID0gZXhwb3J0cy5pbnNwZWN0T3B0c1trZXlzW2ldXTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlbyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGwgb24gYSBzaW5nbGUgbGluZS5cbiAqL1xuXG5mb3JtYXR0ZXJzLm8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpXG5cdFx0LnNwbGl0KCdcXG4nKVxuXHRcdC5tYXAoc3RyID0+IHN0ci50cmltKCkpXG5cdFx0LmpvaW4oJyAnKTtcbn07XG5cbi8qKlxuICogTWFwICVPIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbG93aW5nIG11bHRpcGxlIGxpbmVzIGlmIG5lZWRlZC5cbiAqL1xuXG5mb3JtYXR0ZXJzLk8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jb21waWxlID0gdm9pZCAwO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcInV0aWxcIik7XG5jb25zdCBkZWdlbmVyYXRvcl8xID0gcmVxdWlyZShcIi4vZGVnZW5lcmF0b3JcIik7XG5mdW5jdGlvbiBjb21waWxlKHFqcywgY29kZSwgcmV0dXJuTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgY29tcGlsZWQgPSAoMCwgZGVnZW5lcmF0b3JfMS5kZWdlbmVyYXRvcikoY29kZSwgb3B0aW9ucy5uYW1lcyA/PyBbXSk7XG4gICAgY29uc3Qgdm0gPSBxanMubmV3Q29udGV4dCgpO1xuICAgIC8vIEFkZCBmdW5jdGlvbnMgdG8gZ2xvYmFsXG4gICAgaWYgKG9wdGlvbnMuc2FuZGJveCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5zYW5kYm94KSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBcImZ1bmN0aW9uXCIgZm9yIHNhbmRib3ggcHJvcGVydHkgXFxgJHtuYW1lfVxcYCwgYnV0IGdvdCBcIiR7dHlwZW9mIHZhbHVlfVwiYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmbkhhbmRsZSA9IHZtLm5ld0Z1bmN0aW9uKG5hbWUsICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUoLi4uYXJncy5tYXAoKGFyZykgPT4gcXVpY2tKU0hhbmRsZVRvSG9zdCh2bSwgYXJnKSkpO1xuICAgICAgICAgICAgICAgIHZtLnJ1bnRpbWUuZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvc3RUb1F1aWNrSlNIYW5kbGUodm0sIHJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZuSGFuZGxlLmNvbnN1bWUoKGhhbmRsZSkgPT4gdm0uc2V0UHJvcCh2bS5nbG9iYWwsIG5hbWUsIGhhbmRsZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGZuUmVzdWx0ID0gdm0uZXZhbENvZGUoYCR7Y29tcGlsZWR9OyR7cmV0dXJuTmFtZX1gLCBvcHRpb25zLmZpbGVuYW1lKTtcbiAgICBjb25zdCBmbiA9IHZtLnVud3JhcFJlc3VsdChmblJlc3VsdCk7XG4gICAgY29uc3QgdCA9IHZtLnR5cGVvZihmbik7XG4gICAgaWYgKHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIFwiZnVuY3Rpb25cIiBuYW1lZCBcXGAke3JldHVybk5hbWV9XFxgIHRvIGJlIGRlZmluZWQsIGJ1dCBnb3QgXCIke3R9XCJgKTtcbiAgICB9XG4gICAgY29uc3QgciA9IGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGxldCBwcm9taXNlSGFuZGxlO1xuICAgICAgICBsZXQgcmVzb2x2ZWRIYW5kbGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB2bS5jYWxsRnVuY3Rpb24oZm4sIHZtLnVuZGVmaW5lZCwgLi4uYXJncy5tYXAoKGFyZykgPT4gaG9zdFRvUXVpY2tKU0hhbmRsZSh2bSwgYXJnKSkpO1xuICAgICAgICAgICAgcHJvbWlzZUhhbmRsZSA9IHZtLnVud3JhcFJlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRSZXN1bHRQID0gdm0ucmVzb2x2ZVByb21pc2UocHJvbWlzZUhhbmRsZSk7XG4gICAgICAgICAgICB2bS5ydW50aW1lLmV4ZWN1dGVQZW5kaW5nSm9icygpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRSZXN1bHQgPSBhd2FpdCByZXNvbHZlZFJlc3VsdFA7XG4gICAgICAgICAgICByZXNvbHZlZEhhbmRsZSA9IHZtLnVud3JhcFJlc3VsdChyZXNvbHZlZFJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm4gcXVpY2tKU0hhbmRsZVRvSG9zdCh2bSwgcmVzb2x2ZWRIYW5kbGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIgJiYgdHlwZW9mIGVyciA9PT0gJ29iamVjdCcgJiYgJ2NhdXNlJyBpbiBlcnIgJiYgZXJyLmNhdXNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnIuY2F1c2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgICdzdGFjaycgaW4gZXJyLmNhdXNlICYmXG4gICAgICAgICAgICAgICAgICAgICduYW1lJyBpbiBlcnIuY2F1c2UgJiZcbiAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnIGluIGVyci5jYXVzZSAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZXJyLmNhdXNlLnN0YWNrID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZXJyLmNhdXNlLm5hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBlcnIuY2F1c2UubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUXVpY2tKUyBFcnJvciBgc3RhY2tgIGRvZXMgbm90IGluY2x1ZGUgdGhlIG5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlLCBzbyBwYXRjaCB0aG9zZSBpbiB0byBiZWhhdmUgbW9yZSBsaWtlIFY4XG4gICAgICAgICAgICAgICAgICAgIGVyci5jYXVzZS5zdGFjayA9IGAke2Vyci5jYXVzZS5uYW1lfTogJHtlcnIuY2F1c2UubWVzc2FnZX1cXG4ke2Vyci5jYXVzZS5zdGFja31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnIuY2F1c2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBwcm9taXNlSGFuZGxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXNvbHZlZEhhbmRsZT8uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgJ3RvU3RyaW5nJywge1xuICAgICAgICB2YWx1ZTogKCkgPT4gY29tcGlsZWQsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByO1xufVxuZXhwb3J0cy5jb21waWxlID0gY29tcGlsZTtcbmZ1bmN0aW9uIHF1aWNrSlNIYW5kbGVUb0hvc3Qodm0sIHZhbCkge1xuICAgIHJldHVybiB2bS5kdW1wKHZhbCk7XG59XG5mdW5jdGlvbiBob3N0VG9RdWlja0pTSGFuZGxlKHZtLCB2YWwpIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHZtLnVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2bS5udWxsO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdm0ubmV3U3RyaW5nKHZhbCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2bS5uZXdOdW1iZXIodmFsKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgcmV0dXJuIHZtLm5ld0JpZ0ludCh2YWwpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbCA/IHZtLnRydWUgOiB2bS5mYWxzZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodXRpbF8xLnR5cGVzLmlzUHJvbWlzZSh2YWwpKSB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB2bS5uZXdQcm9taXNlKCk7XG4gICAgICAgIHByb21pc2Uuc2V0dGxlZC50aGVuKHZtLnJ1bnRpbWUuZXhlY3V0ZVBlbmRpbmdKb2JzKTtcbiAgICAgICAgdmFsLnRoZW4oKHIpID0+IHtcbiAgICAgICAgICAgIHByb21pc2UucmVzb2x2ZShob3N0VG9RdWlja0pTSGFuZGxlKHZtLCByKSk7XG4gICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KGhvc3RUb1F1aWNrSlNIYW5kbGUodm0sIGVycikpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2UuaGFuZGxlO1xuICAgIH1cbiAgICBlbHNlIGlmICh1dGlsXzEudHlwZXMuaXNOYXRpdmVFcnJvcih2YWwpKSB7XG4gICAgICAgIHJldHVybiB2bS5uZXdFcnJvcih2YWwpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHZhbHVlOiAke3ZhbH1gKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbXBpbGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlZ2VuZXJhdG9yID0gdm9pZCAwO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcInV0aWxcIik7XG5jb25zdCBlc2NvZGVnZW5fMSA9IHJlcXVpcmUoXCJlc2NvZGVnZW5cIik7XG5jb25zdCBlc3ByaW1hXzEgPSByZXF1aXJlKFwiZXNwcmltYVwiKTtcbmNvbnN0IGFzdF90eXBlc18xID0gcmVxdWlyZShcImFzdC10eXBlc1wiKTtcbi8qKlxuICogQ29tcGlsZXMgc3luYyBKYXZhU2NyaXB0IGNvZGUgaW50byBKYXZhU2NyaXB0IHdpdGggYXN5bmMgRnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBjb2RlIEphdmFTY3JpcHQgc3RyaW5nIHRvIGNvbnZlcnRcbiAqIEBwYXJhbSB7QXJyYXl9IG5hbWVzIEFycmF5IG9mIGZ1bmN0aW9uIG5hbWVzIHRvIGFkZCBgYXdhaXRgIG9wZXJhdG9ycyB0b1xuICogQHJldHVybiB7U3RyaW5nfSBDb252ZXJ0ZWQgSmF2YVNjcmlwdCBzdHJpbmcgd2l0aCBhc3luYy9hd2FpdCBpbmplY3RlZFxuICogQGFwaSBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gZGVnZW5lcmF0b3IoY29kZSwgX25hbWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KF9uYW1lcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYW4gYXJyYXkgb2YgYXN5bmMgZnVuY3Rpb24gXCJuYW1lc1wiIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIC8vIER1cGxpY2F0ZSB0aGUgYG5hbWVzYCBhcnJheSBzaW5jZSBpdCdzIHJ1ZGUgdG8gYXVnbWVudCB0aGUgdXNlciBhcmdzXG4gICAgY29uc3QgbmFtZXMgPSBfbmFtZXMuc2xpY2UoMCk7XG4gICAgY29uc3QgYXN0ID0gKDAsIGVzcHJpbWFfMS5wYXJzZVNjcmlwdCkoY29kZSk7XG4gICAgLy8gRmlyc3QgcGFzcyBpcyB0byBmaW5kIHRoZSBgZnVuY3Rpb25gIG5vZGVzIGFuZCB0dXJuIHRoZW0gaW50byBhc3luYyBvclxuICAgIC8vIGdlbmVyYXRvciBmdW5jdGlvbnMgb25seSBpZiB0aGVpciBib2R5IGluY2x1ZGVzIGBDYWxsRXhwcmVzc2lvbnNgIHRvXG4gICAgLy8gZnVuY3Rpb24gaW4gYG5hbWVzYC4gV2UgYWxzbyBhZGQgdGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbnMgdG8gdGhlIGBuYW1lc2BcbiAgICAvLyBhcnJheS4gV2UnbGwgaXRlcmF0ZSBzZXZlcmFsIHRpbWUsIGFzIGV2ZXJ5IGl0ZXJhdGlvbiBtaWdodCBhZGQgbmV3IGl0ZW1zXG4gICAgLy8gdG8gdGhlIGBuYW1lc2AgYXJyYXksIHVudGlsIG5vIG5ldyBuYW1lcyB3ZXJlIGFkZGVkIGluIHRoZSBpdGVyYXRpb24uXG4gICAgbGV0IGxhc3ROYW1lc0xlbmd0aCA9IDA7XG4gICAgZG8ge1xuICAgICAgICBsYXN0TmFtZXNMZW5ndGggPSBuYW1lcy5sZW5ndGg7XG4gICAgICAgICgwLCBhc3RfdHlwZXNfMS52aXNpdCkoYXN0LCB7XG4gICAgICAgICAgICB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24ocGF0aCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoLm5vZGUuZGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5ub2RlLmRlY2xhcmF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjbGFyYXRpb24gPSBwYXRoLm5vZGUuZGVjbGFyYXRpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFzdF90eXBlc18xLm5hbWVkVHlwZXMuVmFyaWFibGVEZWNsYXJhdG9yLmNoZWNrKGRlY2xhcmF0aW9uKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdF90eXBlc18xLm5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhkZWNsYXJhdGlvbi5pbml0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdF90eXBlc18xLm5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhkZWNsYXJhdGlvbi5pZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja05hbWUoZGVjbGFyYXRpb24uaW5pdC5uYW1lLCBuYW1lcykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tOYW1lKGRlY2xhcmF0aW9uLmlkLm5hbWUsIG5hbWVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLnB1c2goZGVjbGFyYXRpb24uaWQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpc2l0QXNzaWdubWVudEV4cHJlc3Npb24ocGF0aCkge1xuICAgICAgICAgICAgICAgIGlmIChhc3RfdHlwZXNfMS5uYW1lZFR5cGVzLklkZW50aWZpZXIuY2hlY2socGF0aC5ub2RlLmxlZnQpICYmXG4gICAgICAgICAgICAgICAgICAgIGFzdF90eXBlc18xLm5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhwYXRoLm5vZGUucmlnaHQpICYmXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrTmFtZShwYXRoLm5vZGUucmlnaHQubmFtZSwgbmFtZXMpICYmXG4gICAgICAgICAgICAgICAgICAgICFjaGVja05hbWUocGF0aC5ub2RlLmxlZnQubmFtZSwgbmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWVzLnB1c2gocGF0aC5ub2RlLmxlZnQubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2aXNpdEZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgICAgICAgICBpZiAocGF0aC5ub2RlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaG91bGREZWdlbmVyYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICgwLCBhc3RfdHlwZXNfMS52aXNpdCkocGF0aC5ub2RlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpdENhbGxFeHByZXNzaW9uKHBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tOYW1lcyhwYXRoLm5vZGUsIG5hbWVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGREZWdlbmVyYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkRGVnZW5lcmF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEdvdCBhIFwiZnVuY3Rpb25cIiBleHByZXNzaW9uL3N0YXRlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCBpdCBpbnRvIGFuIGFzeW5jIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgIHBhdGgubm9kZS5hc3luYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBmdW5jdGlvbiBuYW1lIHRvIGBuYW1lc2AgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja05hbWUocGF0aC5ub2RlLmlkLm5hbWUsIG5hbWVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMucHVzaChwYXRoLm5vZGUuaWQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50cmF2ZXJzZShwYXRoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH0gd2hpbGUgKGxhc3ROYW1lc0xlbmd0aCAhPT0gbmFtZXMubGVuZ3RoKTtcbiAgICAvLyBTZWNvbmQgcGFzcyBpcyBmb3IgYWRkaW5nIGBhd2FpdGAgc3RhdGVtZW50cyB0byBhbnkgZnVuY3Rpb25cbiAgICAvLyBpbnZvY2F0aW9ucyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBgbmFtZXNgIGFycmF5LlxuICAgICgwLCBhc3RfdHlwZXNfMS52aXNpdCkoYXN0LCB7XG4gICAgICAgIHZpc2l0Q2FsbEV4cHJlc3Npb24ocGF0aCkge1xuICAgICAgICAgICAgaWYgKGNoZWNrTmFtZXMocGF0aC5ub2RlLCBuYW1lcykpIHtcbiAgICAgICAgICAgICAgICAvLyBBIFwiZnVuY3Rpb24gaW52b2NhdGlvblwiIGV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBpbmplY3QgYW4gYEF3YWl0RXhwcmVzc2lvbmBcbiAgICAgICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgcGFyZW50OiB7IG5vZGU6IHBOb2RlIH0sIH0gPSBwYXRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cHIgPSBhc3RfdHlwZXNfMS5idWlsZGVycy5hd2FpdEV4cHJlc3Npb24ocGF0aC5ub2RlLCBkZWxlZ2F0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFzdF90eXBlc18xLm5hbWVkVHlwZXMuQ2FsbEV4cHJlc3Npb24uY2hlY2socE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBOb2RlLmFyZ3VtZW50c1tuYW1lXSA9IGV4cHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwTm9kZVtuYW1lXSA9IGV4cHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cmF2ZXJzZShwYXRoKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gKDAsIGVzY29kZWdlbl8xLmdlbmVyYXRlKShhc3QpO1xufVxuZXhwb3J0cy5kZWdlbmVyYXRvciA9IGRlZ2VuZXJhdG9yO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBgbm9kZWAgaGFzIGEgbWF0Y2hpbmcgbmFtZSB0byBvbmUgb2YgdGhlIGVudHJpZXMgaW4gdGhlXG4gKiBgbmFtZXNgIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7dHlwZXMuTm9kZX0gbm9kZVxuICogQHBhcmFtIHtBcnJheX0gbmFtZXMgQXJyYXkgb2YgZnVuY3Rpb24gbmFtZXMgdG8gcmV0dXJuIHRydWUgZm9yXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTmFtZXMoeyBjYWxsZWUgfSwgbmFtZXMpIHtcbiAgICBsZXQgbmFtZTtcbiAgICBpZiAoYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKGNhbGxlZSkpIHtcbiAgICAgICAgbmFtZSA9IGNhbGxlZS5uYW1lO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3RfdHlwZXNfMS5uYW1lZFR5cGVzLk1lbWJlckV4cHJlc3Npb24uY2hlY2soY2FsbGVlKSkge1xuICAgICAgICBpZiAoYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKGNhbGxlZS5vYmplY3QpICYmXG4gICAgICAgICAgICBhc3RfdHlwZXNfMS5uYW1lZFR5cGVzLklkZW50aWZpZXIuY2hlY2soY2FsbGVlLnByb3BlcnR5KSkge1xuICAgICAgICAgICAgbmFtZSA9IGAke2NhbGxlZS5vYmplY3QubmFtZX0uJHtjYWxsZWUucHJvcGVydHkubmFtZX1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzdF90eXBlc18xLm5hbWVkVHlwZXMuRnVuY3Rpb25FeHByZXNzaW9uLmNoZWNrKGNhbGxlZSkpIHtcbiAgICAgICAgaWYgKGNhbGxlZS5pZCkge1xuICAgICAgICAgICAgbmFtZSA9IGNhbGxlZS5pZC5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERvbid0IGtub3cgaG93IHRvIGdldCBuYW1lIGZvcjogJHtjYWxsZWUudHlwZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoZWNrTmFtZShuYW1lLCBuYW1lcyk7XG59XG5mdW5jdGlvbiBjaGVja05hbWUobmFtZSwgbmFtZXMpIHtcbiAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSBgbmFtZWAsIGNoZWNrIGlmIGFueSBlbnRyaWVzIG1hdGNoIGluIHRoZSBgbmFtZXNgIGFycmF5XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBuID0gbmFtZXNbaV07XG4gICAgICAgIGlmICh1dGlsXzEudHlwZXMuaXNSZWdFeHAobikpIHtcbiAgICAgICAgICAgIGlmIChuLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lID09PSBuKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWdlbmVyYXRvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2RlZ2VuZXJhdG9yXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9jb21waWxlXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gaHR0cHM6Ly9tdGhzLmJlL2Vtb2ppXG4gIHJldHVybiAvXFx1RDgzQ1xcdURGRjRcXHVEQjQwXFx1REM2N1xcdURCNDBcXHVEQzYyKD86XFx1REI0MFxcdURDNjVcXHVEQjQwXFx1REM2RVxcdURCNDBcXHVEQzY3fFxcdURCNDBcXHVEQzczXFx1REI0MFxcdURDNjNcXHVEQjQwXFx1REM3NHxcXHVEQjQwXFx1REM3N1xcdURCNDBcXHVEQzZDXFx1REI0MFxcdURDNzMpXFx1REI0MFxcdURDN0Z8XFx1RDgzRFxcdURDNjgoPzpcXHVEODNDXFx1REZGQ1xcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OFxcdUQ4M0NcXHVERkZCfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRlxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZFXSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZFXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkRdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkRcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkJcXHVERkZDXSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdTIwMEQoPzpcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REM4QlxcdTIwMEQpP1xcdUQ4M0RcXHVEQzY4fCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKVxcdTIwMEQoPzpcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSkpfFxcdUQ4M0RcXHVEQzY2XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY3XFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKXwoPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSlcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pfFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdXFx1RkUwRnxcXHVEODNEW1xcdURDNjZcXHVEQzY3XXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8KD86XFx1RDgzQ1xcdURGRkJcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkZcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkVcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkRcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkNcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF0pXFx1RkUwRnxcXHVEODNDXFx1REZGQlxcdTIwMEQoPzpcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXwoPzpcXHVEODNFXFx1REREMVxcdUQ4M0NcXHVERkZCXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkNcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjkpXFx1RDgzQ1xcdURGRkJ8XFx1RDgzRVxcdURERDEoPzpcXHVEODNDXFx1REZGRlxcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8XFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxKXwoPzpcXHVEODNFXFx1REREMVxcdUQ4M0NcXHVERkZFXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkZcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZFXSl8KD86XFx1RDgzRVxcdURERDFcXHVEODNDXFx1REZGQ1xcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNFXFx1REREMXxcXHVEODNEXFx1REM2OVxcdUQ4M0NcXHVERkZEXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY5KSg/OlxcdUQ4M0NbXFx1REZGQlxcdURGRkNdKXxcXHVEODNEXFx1REM2OSg/OlxcdUQ4M0NcXHVERkZFXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkRcXHVERkZGXSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZDXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCXFx1REZGRC1cXHVERkZGXSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZCXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZDLVxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkRcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkJcXHVERkZDXFx1REZGRVxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1MjAwRCg/OlxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKXxcXHVEODNEW1xcdURDNjhcXHVEQzY5XSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZGXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKSl8XFx1RDgzRFxcdURDNjlcXHUyMDBEXFx1RDgzRFxcdURDNjlcXHUyMDBEKD86XFx1RDgzRFxcdURDNjZcXHUyMDBEXFx1RDgzRFxcdURDNjZ8XFx1RDgzRFxcdURDNjdcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pKXwoPzpcXHVEODNFXFx1REREMVxcdUQ4M0NcXHVERkZEXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkVcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjkpKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkRdKXxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2OVxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8KD86XFx1RDgzRFxcdURDNDFcXHVGRTBGXFx1MjAwRFxcdUQ4M0RcXHVEREU4fFxcdUQ4M0RcXHVEQzY5KD86XFx1RDgzQ1xcdURGRkZcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkVcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkNcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkJcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkRcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdKXwoPzooPzpcXHUyNkY5fFxcdUQ4M0NbXFx1REZDQlxcdURGQ0NdfFxcdUQ4M0RcXHVERDc1KVxcdUZFMEZ8XFx1RDgzRFxcdURDNkZ8XFx1RDgzRVtcXHVERDNDXFx1RERERVxcdUREREZdKVxcdTIwMERbXFx1MjY0MFxcdTI2NDJdfCg/OlxcdTI2Rjl8XFx1RDgzQ1tcXHVERkNCXFx1REZDQ118XFx1RDgzRFxcdURENzUpKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKVxcdTIwMERbXFx1MjY0MFxcdTI2NDJdfCg/OlxcdUQ4M0NbXFx1REZDM1xcdURGQzRcXHVERkNBXXxcXHVEODNEW1xcdURDNkVcXHVEQzcxXFx1REM3M1xcdURDNzdcXHVEQzgxXFx1REM4MlxcdURDODZcXHVEQzg3XFx1REU0NS1cXHVERTQ3XFx1REU0QlxcdURFNERcXHVERTRFXFx1REVBM1xcdURFQjQtXFx1REVCNl18XFx1RDgzRVtcXHVERDI2XFx1REQzNy1cXHVERDM5XFx1REQzRFxcdUREM0VcXHVEREI4XFx1RERCOVxcdUREQ0QtXFx1RERDRlxcdURERDYtXFx1RERERF0pKD86KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKVxcdTIwMERbXFx1MjY0MFxcdTI2NDJdfFxcdTIwMERbXFx1MjY0MFxcdTI2NDJdKXxcXHVEODNDXFx1REZGNFxcdTIwMERcXHUyNjIwKVxcdUZFMEZ8XFx1RDgzRFxcdURDNjlcXHUyMDBEXFx1RDgzRFxcdURDNjdcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pfFxcdUQ4M0NcXHVERkYzXFx1RkUwRlxcdTIwMERcXHVEODNDXFx1REYwOHxcXHVEODNEXFx1REMxNVxcdTIwMERcXHVEODNFXFx1RERCQXxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2N3xcXHVEODNDXFx1RERGRFxcdUQ4M0NcXHVEREYwfFxcdUQ4M0NcXHVEREY0XFx1RDgzQ1xcdURERjJ8XFx1RDgzQ1xcdURERjZcXHVEODNDXFx1RERFNnxbI1xcKjAtOV1cXHVGRTBGXFx1MjBFM3xcXHVEODNDXFx1RERFNyg/OlxcdUQ4M0NbXFx1RERFNlxcdURERTdcXHVEREU5LVxcdURERUZcXHVEREYxLVxcdURERjRcXHVEREY2LVxcdURERjlcXHVEREZCXFx1RERGQ1xcdURERkVcXHVEREZGXSl8XFx1RDgzQ1xcdURERjkoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFOVxcdURERUItXFx1RERFRFxcdURERUYtXFx1RERGNFxcdURERjdcXHVEREY5XFx1RERGQlxcdURERkNcXHVEREZGXSl8XFx1RDgzQ1xcdURERUEoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFQVxcdURERUNcXHVEREVEXFx1RERGNy1cXHVEREZBXSl8XFx1RDgzRVxcdURERDEoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfFxcdUQ4M0NcXHVEREY3KD86XFx1RDgzQ1tcXHVEREVBXFx1RERGNFxcdURERjhcXHVEREZBXFx1RERGQ10pfFxcdUQ4M0RcXHVEQzY5KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXxcXHVEODNDXFx1RERGMig/OlxcdUQ4M0NbXFx1RERFNlxcdURERTgtXFx1RERFRFxcdURERjAtXFx1RERGRl0pfFxcdUQ4M0NcXHVEREU2KD86XFx1RDgzQ1tcXHVEREU4LVxcdURERUNcXHVEREVFXFx1RERGMVxcdURERjJcXHVEREY0XFx1RERGNi1cXHVEREZBXFx1RERGQ1xcdURERkRcXHVEREZGXSl8XFx1RDgzQ1xcdURERjAoPzpcXHVEODNDW1xcdURERUFcXHVEREVDLVxcdURERUVcXHVEREYyXFx1RERGM1xcdURERjVcXHVEREY3XFx1RERGQ1xcdURERkVcXHVEREZGXSl8XFx1RDgzQ1xcdURERUQoPzpcXHVEODNDW1xcdURERjBcXHVEREYyXFx1RERGM1xcdURERjdcXHVEREY5XFx1RERGQV0pfFxcdUQ4M0NcXHVEREU5KD86XFx1RDgzQ1tcXHVEREVBXFx1RERFQ1xcdURERUZcXHVEREYwXFx1RERGMlxcdURERjRcXHVEREZGXSl8XFx1RDgzQ1xcdURERkUoPzpcXHVEODNDW1xcdURERUFcXHVEREY5XSl8XFx1RDgzQ1xcdURERUMoPzpcXHVEODNDW1xcdURERTZcXHVEREU3XFx1RERFOS1cXHVEREVFXFx1RERGMS1cXHVEREYzXFx1RERGNS1cXHVEREZBXFx1RERGQ1xcdURERkVdKXxcXHVEODNDXFx1RERGOCg/OlxcdUQ4M0NbXFx1RERFNi1cXHVEREVBXFx1RERFQy1cXHVEREY0XFx1RERGNy1cXHVEREY5XFx1RERGQlxcdURERkQtXFx1RERGRl0pfFxcdUQ4M0NcXHVEREVCKD86XFx1RDgzQ1tcXHVEREVFLVxcdURERjBcXHVEREYyXFx1RERGNFxcdURERjddKXxcXHVEODNDXFx1RERGNSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERUEtXFx1RERFRFxcdURERjAtXFx1RERGM1xcdURERjctXFx1RERGOVxcdURERkNcXHVEREZFXSl8XFx1RDgzQ1xcdURERkIoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFQVxcdURERUNcXHVEREVFXFx1RERGM1xcdURERkFdKXxcXHVEODNDXFx1RERGMyg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREVBLVxcdURERUNcXHVEREVFXFx1RERGMVxcdURERjRcXHVEREY1XFx1RERGN1xcdURERkFcXHVEREZGXSl8XFx1RDgzQ1xcdURERTgoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFOVxcdURERUItXFx1RERFRVxcdURERjAtXFx1RERGNVxcdURERjdcXHVEREZBLVxcdURERkZdKXxcXHVEODNDXFx1RERGMSg/OlxcdUQ4M0NbXFx1RERFNi1cXHVEREU4XFx1RERFRVxcdURERjBcXHVEREY3LVxcdURERkJcXHVEREZFXSl8XFx1RDgzQ1xcdURERkYoPzpcXHVEODNDW1xcdURERTZcXHVEREYyXFx1RERGQ10pfFxcdUQ4M0NcXHVEREZDKD86XFx1RDgzQ1tcXHVEREVCXFx1RERGOF0pfFxcdUQ4M0NcXHVEREZBKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFQ1xcdURERjJcXHVEREYzXFx1RERGOFxcdURERkVcXHVEREZGXSl8XFx1RDgzQ1xcdURERUUoPzpcXHVEODNDW1xcdURERTgtXFx1RERFQVxcdURERjEtXFx1RERGNFxcdURERjYtXFx1RERGOV0pfFxcdUQ4M0NcXHVEREVGKD86XFx1RDgzQ1tcXHVEREVBXFx1RERGMlxcdURERjRcXHVEREY1XSl8KD86XFx1RDgzQ1tcXHVERkMzXFx1REZDNFxcdURGQ0FdfFxcdUQ4M0RbXFx1REM2RVxcdURDNzFcXHVEQzczXFx1REM3N1xcdURDODFcXHVEQzgyXFx1REM4NlxcdURDODdcXHVERTQ1LVxcdURFNDdcXHVERTRCXFx1REU0RFxcdURFNEVcXHVERUEzXFx1REVCNC1cXHVERUI2XXxcXHVEODNFW1xcdUREMjZcXHVERDM3LVxcdUREMzlcXHVERDNEXFx1REQzRVxcdUREQjhcXHVEREI5XFx1RERDRC1cXHVERENGXFx1RERENi1cXHVEREREXSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OlxcdTI2Rjl8XFx1RDgzQ1tcXHVERkNCXFx1REZDQ118XFx1RDgzRFxcdURENzUpKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXwoPzpbXFx1MjYxRFxcdTI3MEEtXFx1MjcwRF18XFx1RDgzQ1tcXHVERjg1XFx1REZDMlxcdURGQzddfFxcdUQ4M0RbXFx1REM0MlxcdURDNDNcXHVEQzQ2LVxcdURDNTBcXHVEQzY2XFx1REM2N1xcdURDNkItXFx1REM2RFxcdURDNzBcXHVEQzcyXFx1REM3NC1cXHVEQzc2XFx1REM3OFxcdURDN0NcXHVEQzgzXFx1REM4NVxcdURDQUFcXHVERDc0XFx1REQ3QVxcdUREOTBcXHVERDk1XFx1REQ5NlxcdURFNENcXHVERTRGXFx1REVDMFxcdURFQ0NdfFxcdUQ4M0VbXFx1REQwRlxcdUREMTgtXFx1REQxQ1xcdUREMUVcXHVERDFGXFx1REQzMC1cXHVERDM2XFx1RERCNVxcdUREQjZcXHVEREJCXFx1REREMi1cXHVEREQ1XSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OltcXHUyMzFBXFx1MjMxQlxcdTIzRTktXFx1MjNFQ1xcdTIzRjBcXHUyM0YzXFx1MjVGRFxcdTI1RkVcXHUyNjE0XFx1MjYxNVxcdTI2NDgtXFx1MjY1M1xcdTI2N0ZcXHUyNjkzXFx1MjZBMVxcdTI2QUFcXHUyNkFCXFx1MjZCRFxcdTI2QkVcXHUyNkM0XFx1MjZDNVxcdTI2Q0VcXHUyNkQ0XFx1MjZFQVxcdTI2RjJcXHUyNkYzXFx1MjZGNVxcdTI2RkFcXHUyNkZEXFx1MjcwNVxcdTI3MEFcXHUyNzBCXFx1MjcyOFxcdTI3NENcXHUyNzRFXFx1Mjc1My1cXHUyNzU1XFx1Mjc1N1xcdTI3OTUtXFx1Mjc5N1xcdTI3QjBcXHUyN0JGXFx1MkIxQlxcdTJCMUNcXHUyQjUwXFx1MkI1NV18XFx1RDgzQ1tcXHVEQzA0XFx1RENDRlxcdUREOEVcXHVERDkxLVxcdUREOUFcXHVEREU2LVxcdURERkZcXHVERTAxXFx1REUxQVxcdURFMkZcXHVERTMyLVxcdURFMzZcXHVERTM4LVxcdURFM0FcXHVERTUwXFx1REU1MVxcdURGMDAtXFx1REYyMFxcdURGMkQtXFx1REYzNVxcdURGMzctXFx1REY3Q1xcdURGN0UtXFx1REY5M1xcdURGQTAtXFx1REZDQVxcdURGQ0YtXFx1REZEM1xcdURGRTAtXFx1REZGMFxcdURGRjRcXHVERkY4LVxcdURGRkZdfFxcdUQ4M0RbXFx1REMwMC1cXHVEQzNFXFx1REM0MFxcdURDNDItXFx1RENGQ1xcdURDRkYtXFx1REQzRFxcdURENEItXFx1REQ0RVxcdURENTAtXFx1REQ2N1xcdUREN0FcXHVERDk1XFx1REQ5NlxcdUREQTRcXHVEREZCLVxcdURFNEZcXHVERTgwLVxcdURFQzVcXHVERUNDXFx1REVEMC1cXHVERUQyXFx1REVENVxcdURFRUJcXHVERUVDXFx1REVGNC1cXHVERUZBXFx1REZFMC1cXHVERkVCXXxcXHVEODNFW1xcdUREMEQtXFx1REQzQVxcdUREM0MtXFx1REQ0NVxcdURENDctXFx1REQ3MVxcdURENzMtXFx1REQ3NlxcdUREN0EtXFx1RERBMlxcdUREQTUtXFx1RERBQVxcdUREQUUtXFx1RERDQVxcdUREQ0QtXFx1RERGRlxcdURFNzAtXFx1REU3M1xcdURFNzgtXFx1REU3QVxcdURFODAtXFx1REU4MlxcdURFOTAtXFx1REU5NV0pfCg/OlsjXFwqMC05XFx4QTlcXHhBRVxcdTIwM0NcXHUyMDQ5XFx1MjEyMlxcdTIxMzlcXHUyMTk0LVxcdTIxOTlcXHUyMUE5XFx1MjFBQVxcdTIzMUFcXHUyMzFCXFx1MjMyOFxcdTIzQ0ZcXHUyM0U5LVxcdTIzRjNcXHUyM0Y4LVxcdTIzRkFcXHUyNEMyXFx1MjVBQVxcdTI1QUJcXHUyNUI2XFx1MjVDMFxcdTI1RkItXFx1MjVGRVxcdTI2MDAtXFx1MjYwNFxcdTI2MEVcXHUyNjExXFx1MjYxNFxcdTI2MTVcXHUyNjE4XFx1MjYxRFxcdTI2MjBcXHUyNjIyXFx1MjYyM1xcdTI2MjZcXHUyNjJBXFx1MjYyRVxcdTI2MkZcXHUyNjM4LVxcdTI2M0FcXHUyNjQwXFx1MjY0MlxcdTI2NDgtXFx1MjY1M1xcdTI2NUZcXHUyNjYwXFx1MjY2M1xcdTI2NjVcXHUyNjY2XFx1MjY2OFxcdTI2N0JcXHUyNjdFXFx1MjY3RlxcdTI2OTItXFx1MjY5N1xcdTI2OTlcXHUyNjlCXFx1MjY5Q1xcdTI2QTBcXHUyNkExXFx1MjZBQVxcdTI2QUJcXHUyNkIwXFx1MjZCMVxcdTI2QkRcXHUyNkJFXFx1MjZDNFxcdTI2QzVcXHUyNkM4XFx1MjZDRVxcdTI2Q0ZcXHUyNkQxXFx1MjZEM1xcdTI2RDRcXHUyNkU5XFx1MjZFQVxcdTI2RjAtXFx1MjZGNVxcdTI2RjctXFx1MjZGQVxcdTI2RkRcXHUyNzAyXFx1MjcwNVxcdTI3MDgtXFx1MjcwRFxcdTI3MEZcXHUyNzEyXFx1MjcxNFxcdTI3MTZcXHUyNzFEXFx1MjcyMVxcdTI3MjhcXHUyNzMzXFx1MjczNFxcdTI3NDRcXHUyNzQ3XFx1Mjc0Q1xcdTI3NEVcXHUyNzUzLVxcdTI3NTVcXHUyNzU3XFx1Mjc2M1xcdTI3NjRcXHUyNzk1LVxcdTI3OTdcXHUyN0ExXFx1MjdCMFxcdTI3QkZcXHUyOTM0XFx1MjkzNVxcdTJCMDUtXFx1MkIwN1xcdTJCMUJcXHUyQjFDXFx1MkI1MFxcdTJCNTVcXHUzMDMwXFx1MzAzRFxcdTMyOTdcXHUzMjk5XXxcXHVEODNDW1xcdURDMDRcXHVEQ0NGXFx1REQ3MFxcdURENzFcXHVERDdFXFx1REQ3RlxcdUREOEVcXHVERDkxLVxcdUREOUFcXHVEREU2LVxcdURERkZcXHVERTAxXFx1REUwMlxcdURFMUFcXHVERTJGXFx1REUzMi1cXHVERTNBXFx1REU1MFxcdURFNTFcXHVERjAwLVxcdURGMjFcXHVERjI0LVxcdURGOTNcXHVERjk2XFx1REY5N1xcdURGOTktXFx1REY5QlxcdURGOUUtXFx1REZGMFxcdURGRjMtXFx1REZGNVxcdURGRjctXFx1REZGRl18XFx1RDgzRFtcXHVEQzAwLVxcdURDRkRcXHVEQ0ZGLVxcdUREM0RcXHVERDQ5LVxcdURENEVcXHVERDUwLVxcdURENjdcXHVERDZGXFx1REQ3MFxcdURENzMtXFx1REQ3QVxcdUREODdcXHVERDhBLVxcdUREOERcXHVERDkwXFx1REQ5NVxcdUREOTZcXHVEREE0XFx1RERBNVxcdUREQThcXHVEREIxXFx1RERCMlxcdUREQkNcXHVEREMyLVxcdUREQzRcXHVEREQxLVxcdURERDNcXHVERERDLVxcdUREREVcXHVEREUxXFx1RERFM1xcdURERThcXHVEREVGXFx1RERGM1xcdURERkEtXFx1REU0RlxcdURFODAtXFx1REVDNVxcdURFQ0ItXFx1REVEMlxcdURFRDVcXHVERUUwLVxcdURFRTVcXHVERUU5XFx1REVFQlxcdURFRUNcXHVERUYwXFx1REVGMy1cXHVERUZBXFx1REZFMC1cXHVERkVCXXxcXHVEODNFW1xcdUREMEQtXFx1REQzQVxcdUREM0MtXFx1REQ0NVxcdURENDctXFx1REQ3MVxcdURENzMtXFx1REQ3NlxcdUREN0EtXFx1RERBMlxcdUREQTUtXFx1RERBQVxcdUREQUUtXFx1RERDQVxcdUREQ0QtXFx1RERGRlxcdURFNzAtXFx1REU3M1xcdURFNzgtXFx1REU3QVxcdURFODAtXFx1REU4MlxcdURFOTAtXFx1REU5NV0pXFx1RkUwRnwoPzpbXFx1MjYxRFxcdTI2RjlcXHUyNzBBLVxcdTI3MERdfFxcdUQ4M0NbXFx1REY4NVxcdURGQzItXFx1REZDNFxcdURGQzdcXHVERkNBLVxcdURGQ0NdfFxcdUQ4M0RbXFx1REM0MlxcdURDNDNcXHVEQzQ2LVxcdURDNTBcXHVEQzY2LVxcdURDNzhcXHVEQzdDXFx1REM4MS1cXHVEQzgzXFx1REM4NS1cXHVEQzg3XFx1REM4RlxcdURDOTFcXHVEQ0FBXFx1REQ3NFxcdURENzVcXHVERDdBXFx1REQ5MFxcdUREOTVcXHVERDk2XFx1REU0NS1cXHVERTQ3XFx1REU0Qi1cXHVERTRGXFx1REVBM1xcdURFQjQtXFx1REVCNlxcdURFQzBcXHVERUNDXXxcXHVEODNFW1xcdUREMEZcXHVERDE4LVxcdUREMUZcXHVERDI2XFx1REQzMC1cXHVERDM5XFx1REQzQy1cXHVERDNFXFx1RERCNVxcdUREQjZcXHVEREI4XFx1RERCOVxcdUREQkJcXHVERENELVxcdUREQ0ZcXHVEREQxLVxcdURERERdKS9nO1xufTtcbiIsInZhciBvbmNlID0gcmVxdWlyZSgnb25jZScpO1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uKCkge307XG5cbnZhciBpc1JlcXVlc3QgPSBmdW5jdGlvbihzdHJlYW0pIHtcblx0cmV0dXJuIHN0cmVhbS5zZXRIZWFkZXIgJiYgdHlwZW9mIHN0cmVhbS5hYm9ydCA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbnZhciBpc0NoaWxkUHJvY2VzcyA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuXHRyZXR1cm4gc3RyZWFtLnN0ZGlvICYmIEFycmF5LmlzQXJyYXkoc3RyZWFtLnN0ZGlvKSAmJiBzdHJlYW0uc3RkaW8ubGVuZ3RoID09PSAzXG59O1xuXG52YXIgZW9zID0gZnVuY3Rpb24oc3RyZWFtLCBvcHRzLCBjYWxsYmFjaykge1xuXHRpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHJldHVybiBlb3Moc3RyZWFtLCBudWxsLCBvcHRzKTtcblx0aWYgKCFvcHRzKSBvcHRzID0ge307XG5cblx0Y2FsbGJhY2sgPSBvbmNlKGNhbGxiYWNrIHx8IG5vb3ApO1xuXG5cdHZhciB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcblx0dmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXHR2YXIgcmVhZGFibGUgPSBvcHRzLnJlYWRhYmxlIHx8IChvcHRzLnJlYWRhYmxlICE9PSBmYWxzZSAmJiBzdHJlYW0ucmVhZGFibGUpO1xuXHR2YXIgd3JpdGFibGUgPSBvcHRzLndyaXRhYmxlIHx8IChvcHRzLndyaXRhYmxlICE9PSBmYWxzZSAmJiBzdHJlYW0ud3JpdGFibGUpO1xuXHR2YXIgY2FuY2VsbGVkID0gZmFsc2U7XG5cblx0dmFyIG9ubGVnYWN5ZmluaXNoID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCFzdHJlYW0ud3JpdGFibGUpIG9uZmluaXNoKCk7XG5cdH07XG5cblx0dmFyIG9uZmluaXNoID0gZnVuY3Rpb24oKSB7XG5cdFx0d3JpdGFibGUgPSBmYWxzZTtcblx0XHRpZiAoIXJlYWRhYmxlKSBjYWxsYmFjay5jYWxsKHN0cmVhbSk7XG5cdH07XG5cblx0dmFyIG9uZW5kID0gZnVuY3Rpb24oKSB7XG5cdFx0cmVhZGFibGUgPSBmYWxzZTtcblx0XHRpZiAoIXdyaXRhYmxlKSBjYWxsYmFjay5jYWxsKHN0cmVhbSk7XG5cdH07XG5cblx0dmFyIG9uZXhpdCA9IGZ1bmN0aW9uKGV4aXRDb2RlKSB7XG5cdFx0Y2FsbGJhY2suY2FsbChzdHJlYW0sIGV4aXRDb2RlID8gbmV3IEVycm9yKCdleGl0ZWQgd2l0aCBlcnJvciBjb2RlOiAnICsgZXhpdENvZGUpIDogbnVsbCk7XG5cdH07XG5cblx0dmFyIG9uZXJyb3IgPSBmdW5jdGlvbihlcnIpIHtcblx0XHRjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyKTtcblx0fTtcblxuXHR2YXIgb25jbG9zZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHByb2Nlc3MubmV4dFRpY2sob25jbG9zZW5leHR0aWNrKTtcblx0fTtcblxuXHR2YXIgb25jbG9zZW5leHR0aWNrID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuXHRcdGlmIChyZWFkYWJsZSAmJiAhKHJzICYmIChycy5lbmRlZCAmJiAhcnMuZGVzdHJveWVkKSkpIHJldHVybiBjYWxsYmFjay5jYWxsKHN0cmVhbSwgbmV3IEVycm9yKCdwcmVtYXR1cmUgY2xvc2UnKSk7XG5cdFx0aWYgKHdyaXRhYmxlICYmICEod3MgJiYgKHdzLmVuZGVkICYmICF3cy5kZXN0cm95ZWQpKSkgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBuZXcgRXJyb3IoJ3ByZW1hdHVyZSBjbG9zZScpKTtcblx0fTtcblxuXHR2YXIgb25yZXF1ZXN0ID0gZnVuY3Rpb24oKSB7XG5cdFx0c3RyZWFtLnJlcS5vbignZmluaXNoJywgb25maW5pc2gpO1xuXHR9O1xuXG5cdGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkge1xuXHRcdHN0cmVhbS5vbignY29tcGxldGUnLCBvbmZpbmlzaCk7XG5cdFx0c3RyZWFtLm9uKCdhYm9ydCcsIG9uY2xvc2UpO1xuXHRcdGlmIChzdHJlYW0ucmVxKSBvbnJlcXVlc3QoKTtcblx0XHRlbHNlIHN0cmVhbS5vbigncmVxdWVzdCcsIG9ucmVxdWVzdCk7XG5cdH0gZWxzZSBpZiAod3JpdGFibGUgJiYgIXdzKSB7IC8vIGxlZ2FjeSBzdHJlYW1zXG5cdFx0c3RyZWFtLm9uKCdlbmQnLCBvbmxlZ2FjeWZpbmlzaCk7XG5cdFx0c3RyZWFtLm9uKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKTtcblx0fVxuXG5cdGlmIChpc0NoaWxkUHJvY2VzcyhzdHJlYW0pKSBzdHJlYW0ub24oJ2V4aXQnLCBvbmV4aXQpO1xuXG5cdHN0cmVhbS5vbignZW5kJywgb25lbmQpO1xuXHRzdHJlYW0ub24oJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblx0aWYgKG9wdHMuZXJyb3IgIT09IGZhbHNlKSBzdHJlYW0ub24oJ2Vycm9yJywgb25lcnJvcik7XG5cdHN0cmVhbS5vbignY2xvc2UnLCBvbmNsb3NlKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0Y2FuY2VsbGVkID0gdHJ1ZTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2NvbXBsZXRlJywgb25maW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignYWJvcnQnLCBvbmNsb3NlKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ3JlcXVlc3QnLCBvbnJlcXVlc3QpO1xuXHRcdGlmIChzdHJlYW0ucmVxKSBzdHJlYW0ucmVxLnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmxlZ2FjeWZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2V4aXQnLCBvbmV4aXQpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG5cdH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVvcztcbiIsImNvbnN0IHsgZGlybmFtZSwgcmVzb2x2ZSB9ID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgeyByZWFkZGlyU3luYywgc3RhdFN5bmMgfSA9IHJlcXVpcmUoJ2ZzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0YXJ0LCBjYWxsYmFjaykge1xuXHRsZXQgZGlyID0gcmVzb2x2ZSgnLicsIHN0YXJ0KTtcblx0bGV0IHRtcCwgc3RhdHMgPSBzdGF0U3luYyhkaXIpO1xuXG5cdGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuXHRcdGRpciA9IGRpcm5hbWUoZGlyKTtcblx0fVxuXG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0dG1wID0gY2FsbGJhY2soZGlyLCByZWFkZGlyU3luYyhkaXIpKTtcblx0XHRpZiAodG1wKSByZXR1cm4gcmVzb2x2ZShkaXIsIHRtcCk7XG5cdFx0ZGlyID0gZGlybmFtZSh0bXAgPSBkaXIpO1xuXHRcdGlmICh0bXAgPT09IGRpcikgYnJlYWs7XG5cdH1cbn1cbiIsIi8qXG4gIENvcHlyaWdodCAoQykgMjAxMi0yMDE0IFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDE1IEluZ3ZhciBTdGVwYW55YW4gPG1lQHJyZXZlcnNlci5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxNCBJdmFuIE5pa3VsaW4gPGlmYWFhbkBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIE1pY2hhZWwgRmljYXJyYSA8ZXNjb2RlZ2VuLmNvcHlyaWdodEBtaWNoYWVsLmZpY2FycmEubWU+XG4gIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIE1hdGhpYXMgQnluZW5zIDxtYXRoaWFzQHFpd2kuYmU+XG4gIENvcHlyaWdodCAoQykgMjAxMyBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTIgUm9iZXJ0IEd1c3QtQmFyZG9uIDxkb25hdGVAcm9iZXJ0Lmd1c3QtYmFyZG9uLm9yZz5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIEpvaG4gRnJlZW1hbiA8amZyZWVtYW4wOEBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIEFyaXlhIEhpZGF5YXQgPGFyaXlhLmhpZGF5YXRAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTIgSm9vc3QtV2ltIEJvZWtlc3RlaWpuIDxqb29zdC13aW1AYm9la2VzdGVpam4ubmw+XG4gIENvcHlyaWdodCAoQykgMjAxMiBLcmlzIEtvd2FsIDxrcmlzLmtvd2FsQGNpeGFyLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIEFycGFkIEJvcnNvcyA8YXJwYWQuYm9yc29zQGdvb2dsZW1haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbi8qZ2xvYmFsIGV4cG9ydHM6dHJ1ZSwgcmVxdWlyZTp0cnVlLCBnbG9iYWw6dHJ1ZSovXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBTeW50YXgsXG4gICAgICAgIFByZWNlZGVuY2UsXG4gICAgICAgIEJpbmFyeVByZWNlZGVuY2UsXG4gICAgICAgIFNvdXJjZU5vZGUsXG4gICAgICAgIGVzdHJhdmVyc2UsXG4gICAgICAgIGVzdXRpbHMsXG4gICAgICAgIGJhc2UsXG4gICAgICAgIGluZGVudCxcbiAgICAgICAganNvbixcbiAgICAgICAgcmVudW1iZXIsXG4gICAgICAgIGhleGFkZWNpbWFsLFxuICAgICAgICBxdW90ZXMsXG4gICAgICAgIGVzY2FwZWxlc3MsXG4gICAgICAgIG5ld2xpbmUsXG4gICAgICAgIHNwYWNlLFxuICAgICAgICBwYXJlbnRoZXNlcyxcbiAgICAgICAgc2VtaWNvbG9ucyxcbiAgICAgICAgc2FmZUNvbmNhdGVuYXRpb24sXG4gICAgICAgIGRpcmVjdGl2ZSxcbiAgICAgICAgZXh0cmEsXG4gICAgICAgIHBhcnNlLFxuICAgICAgICBzb3VyY2VNYXAsXG4gICAgICAgIHNvdXJjZUNvZGUsXG4gICAgICAgIHByZXNlcnZlQmxhbmtMaW5lcyxcbiAgICAgICAgRk9STUFUX01JTklGWSxcbiAgICAgICAgRk9STUFUX0RFRkFVTFRTO1xuXG4gICAgZXN0cmF2ZXJzZSA9IHJlcXVpcmUoJ2VzdHJhdmVyc2UnKTtcbiAgICBlc3V0aWxzID0gcmVxdWlyZSgnZXN1dGlscycpO1xuXG4gICAgU3ludGF4ID0gZXN0cmF2ZXJzZS5TeW50YXg7XG5cbiAgICAvLyBHZW5lcmF0aW9uIGlzIGRvbmUgYnkgZ2VuZXJhdGVFeHByZXNzaW9uLlxuICAgIGZ1bmN0aW9uIGlzRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICAgIHJldHVybiBDb2RlR2VuZXJhdG9yLkV4cHJlc3Npb24uaGFzT3duUHJvcGVydHkobm9kZS50eXBlKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0aW9uIGlzIGRvbmUgYnkgZ2VuZXJhdGVTdGF0ZW1lbnQuXG4gICAgZnVuY3Rpb24gaXNTdGF0ZW1lbnQobm9kZSkge1xuICAgICAgICByZXR1cm4gQ29kZUdlbmVyYXRvci5TdGF0ZW1lbnQuaGFzT3duUHJvcGVydHkobm9kZS50eXBlKTtcbiAgICB9XG5cbiAgICBQcmVjZWRlbmNlID0ge1xuICAgICAgICBTZXF1ZW5jZTogMCxcbiAgICAgICAgWWllbGQ6IDEsXG4gICAgICAgIEFzc2lnbm1lbnQ6IDEsXG4gICAgICAgIENvbmRpdGlvbmFsOiAyLFxuICAgICAgICBBcnJvd0Z1bmN0aW9uOiAyLFxuICAgICAgICBDb2FsZXNjZTogMyxcbiAgICAgICAgTG9naWNhbE9SOiA0LFxuICAgICAgICBMb2dpY2FsQU5EOiA1LFxuICAgICAgICBCaXR3aXNlT1I6IDYsXG4gICAgICAgIEJpdHdpc2VYT1I6IDcsXG4gICAgICAgIEJpdHdpc2VBTkQ6IDgsXG4gICAgICAgIEVxdWFsaXR5OiA5LFxuICAgICAgICBSZWxhdGlvbmFsOiAxMCxcbiAgICAgICAgQml0d2lzZVNISUZUOiAxMSxcbiAgICAgICAgQWRkaXRpdmU6IDEyLFxuICAgICAgICBNdWx0aXBsaWNhdGl2ZTogMTMsXG4gICAgICAgIEV4cG9uZW50aWF0aW9uOiAxNCxcbiAgICAgICAgQXdhaXQ6IDE1LFxuICAgICAgICBVbmFyeTogMTUsXG4gICAgICAgIFBvc3RmaXg6IDE2LFxuICAgICAgICBPcHRpb25hbENoYWluaW5nOiAxNyxcbiAgICAgICAgQ2FsbDogMTgsXG4gICAgICAgIE5ldzogMTksXG4gICAgICAgIFRhZ2dlZFRlbXBsYXRlOiAyMCxcbiAgICAgICAgTWVtYmVyOiAyMSxcbiAgICAgICAgUHJpbWFyeTogMjJcbiAgICB9O1xuXG4gICAgQmluYXJ5UHJlY2VkZW5jZSA9IHtcbiAgICAgICAgJz8/JzogUHJlY2VkZW5jZS5Db2FsZXNjZSxcbiAgICAgICAgJ3x8JzogUHJlY2VkZW5jZS5Mb2dpY2FsT1IsXG4gICAgICAgICcmJic6IFByZWNlZGVuY2UuTG9naWNhbEFORCxcbiAgICAgICAgJ3wnOiBQcmVjZWRlbmNlLkJpdHdpc2VPUixcbiAgICAgICAgJ14nOiBQcmVjZWRlbmNlLkJpdHdpc2VYT1IsXG4gICAgICAgICcmJzogUHJlY2VkZW5jZS5CaXR3aXNlQU5ELFxuICAgICAgICAnPT0nOiBQcmVjZWRlbmNlLkVxdWFsaXR5LFxuICAgICAgICAnIT0nOiBQcmVjZWRlbmNlLkVxdWFsaXR5LFxuICAgICAgICAnPT09JzogUHJlY2VkZW5jZS5FcXVhbGl0eSxcbiAgICAgICAgJyE9PSc6IFByZWNlZGVuY2UuRXF1YWxpdHksXG4gICAgICAgICdpcyc6IFByZWNlZGVuY2UuRXF1YWxpdHksXG4gICAgICAgICdpc250JzogUHJlY2VkZW5jZS5FcXVhbGl0eSxcbiAgICAgICAgJzwnOiBQcmVjZWRlbmNlLlJlbGF0aW9uYWwsXG4gICAgICAgICc+JzogUHJlY2VkZW5jZS5SZWxhdGlvbmFsLFxuICAgICAgICAnPD0nOiBQcmVjZWRlbmNlLlJlbGF0aW9uYWwsXG4gICAgICAgICc+PSc6IFByZWNlZGVuY2UuUmVsYXRpb25hbCxcbiAgICAgICAgJ2luJzogUHJlY2VkZW5jZS5SZWxhdGlvbmFsLFxuICAgICAgICAnaW5zdGFuY2VvZic6IFByZWNlZGVuY2UuUmVsYXRpb25hbCxcbiAgICAgICAgJzw8JzogUHJlY2VkZW5jZS5CaXR3aXNlU0hJRlQsXG4gICAgICAgICc+Pic6IFByZWNlZGVuY2UuQml0d2lzZVNISUZULFxuICAgICAgICAnPj4+JzogUHJlY2VkZW5jZS5CaXR3aXNlU0hJRlQsXG4gICAgICAgICcrJzogUHJlY2VkZW5jZS5BZGRpdGl2ZSxcbiAgICAgICAgJy0nOiBQcmVjZWRlbmNlLkFkZGl0aXZlLFxuICAgICAgICAnKic6IFByZWNlZGVuY2UuTXVsdGlwbGljYXRpdmUsXG4gICAgICAgICclJzogUHJlY2VkZW5jZS5NdWx0aXBsaWNhdGl2ZSxcbiAgICAgICAgJy8nOiBQcmVjZWRlbmNlLk11bHRpcGxpY2F0aXZlLFxuICAgICAgICAnKionOiBQcmVjZWRlbmNlLkV4cG9uZW50aWF0aW9uXG4gICAgfTtcblxuICAgIC8vRmxhZ3NcbiAgICB2YXIgRl9BTExPV19JTiA9IDEsXG4gICAgICAgIEZfQUxMT1dfQ0FMTCA9IDEgPDwgMSxcbiAgICAgICAgRl9BTExPV19VTlBBUkFUSF9ORVcgPSAxIDw8IDIsXG4gICAgICAgIEZfRlVOQ19CT0RZID0gMSA8PCAzLFxuICAgICAgICBGX0RJUkVDVElWRV9DVFggPSAxIDw8IDQsXG4gICAgICAgIEZfU0VNSUNPTE9OX09QVCA9IDEgPDwgNSxcbiAgICAgICAgRl9GT1VORF9DT0FMRVNDRSA9IDEgPDwgNjtcblxuICAgIC8vRXhwcmVzc2lvbiBmbGFnIHNldHNcbiAgICAvL05PVEU6IEZsYWcgb3JkZXI6XG4gICAgLy8gRl9BTExPV19JTlxuICAgIC8vIEZfQUxMT1dfQ0FMTFxuICAgIC8vIEZfQUxMT1dfVU5QQVJBVEhfTkVXXG4gICAgdmFyIEVfRlRUID0gRl9BTExPV19DQUxMIHwgRl9BTExPV19VTlBBUkFUSF9ORVcsXG4gICAgICAgIEVfVFRGID0gRl9BTExPV19JTiB8IEZfQUxMT1dfQ0FMTCxcbiAgICAgICAgRV9UVFQgPSBGX0FMTE9XX0lOIHwgRl9BTExPV19DQUxMIHwgRl9BTExPV19VTlBBUkFUSF9ORVcsXG4gICAgICAgIEVfVEZGID0gRl9BTExPV19JTixcbiAgICAgICAgRV9GRlQgPSBGX0FMTE9XX1VOUEFSQVRIX05FVyxcbiAgICAgICAgRV9URlQgPSBGX0FMTE9XX0lOIHwgRl9BTExPV19VTlBBUkFUSF9ORVc7XG5cbiAgICAvL1N0YXRlbWVudCBmbGFnIHNldHNcbiAgICAvL05PVEU6IEZsYWcgb3JkZXI6XG4gICAgLy8gRl9BTExPV19JTlxuICAgIC8vIEZfRlVOQ19CT0RZXG4gICAgLy8gRl9ESVJFQ1RJVkVfQ1RYXG4gICAgLy8gRl9TRU1JQ09MT05fT1BUXG4gICAgdmFyIFNfVEZGRiA9IEZfQUxMT1dfSU4sXG4gICAgICAgIFNfVEZGVCA9IEZfQUxMT1dfSU4gfCBGX1NFTUlDT0xPTl9PUFQsXG4gICAgICAgIFNfRkZGRiA9IDB4MDAsXG4gICAgICAgIFNfVEZURiA9IEZfQUxMT1dfSU4gfCBGX0RJUkVDVElWRV9DVFgsXG4gICAgICAgIFNfVFRGRiA9IEZfQUxMT1dfSU4gfCBGX0ZVTkNfQk9EWTtcblxuICAgIGZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCkge1xuICAgICAgICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGVudDogbnVsbCxcbiAgICAgICAgICAgIGJhc2U6IG51bGwsXG4gICAgICAgICAgICBwYXJzZTogbnVsbCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGZhbHNlLFxuICAgICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICAgICAgaW5kZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiAnICAgICcsXG4gICAgICAgICAgICAgICAgICAgIGJhc2U6IDAsXG4gICAgICAgICAgICAgICAgICAgIGFkanVzdE11bHRpbGluZUNvbW1lbnQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXdsaW5lOiAnXFxuJyxcbiAgICAgICAgICAgICAgICBzcGFjZTogJyAnLFxuICAgICAgICAgICAgICAgIGpzb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlbnVtYmVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBoZXhhZGVjaW1hbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgcXVvdGVzOiAnc2luZ2xlJyxcbiAgICAgICAgICAgICAgICBlc2NhcGVsZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb21wYWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwYXJlbnRoZXNlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZW1pY29sb25zOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNhZmVDb25jYXRlbmF0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwcmVzZXJ2ZUJsYW5rTGluZXM6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW96OiB7XG4gICAgICAgICAgICAgICAgY29tcHJlaGVuc2lvbkV4cHJlc3Npb25TdGFydHNXaXRoQXNzaWdubWVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc3Rhcmxlc3NHZW5lcmF0b3I6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc291cmNlTWFwOiBudWxsLFxuICAgICAgICAgICAgc291cmNlTWFwUm9vdDogbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZU1hcFdpdGhDb2RlOiBmYWxzZSxcbiAgICAgICAgICAgIGRpcmVjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICByYXc6IHRydWUsXG4gICAgICAgICAgICB2ZXJiYXRpbTogbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZUNvZGU6IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdHJpbmdSZXBlYXQoc3RyLCBudW0pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuXG4gICAgICAgIGZvciAobnVtIHw9IDA7IG51bSA+IDA7IG51bSA+Pj49IDEsIHN0ciArPSBzdHIpIHtcbiAgICAgICAgICAgIGlmIChudW0gJiAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHN0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFzTGluZVRlcm1pbmF0b3Ioc3RyKSB7XG4gICAgICAgIHJldHVybiAoL1tcXHJcXG5dL2cpLnRlc3Qoc3RyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHN0cikge1xuICAgICAgICB2YXIgbGVuID0gc3RyLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGxlbiAmJiBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihzdHIuY2hhckNvZGVBdChsZW4gLSAxKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2UodGFyZ2V0LCBvdmVycmlkZSkge1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGtleSBpbiBvdmVycmlkZSkge1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IG92ZXJyaWRlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVEZWVwbHkodGFyZ2V0LCBvdmVycmlkZSkge1xuICAgICAgICB2YXIga2V5LCB2YWw7XG5cbiAgICAgICAgZnVuY3Rpb24gaXNIYXNoT2JqZWN0KHRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnICYmIHRhcmdldCBpbnN0YW5jZW9mIE9iamVjdCAmJiAhKHRhcmdldCBpbnN0YW5jZW9mIFJlZ0V4cCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGtleSBpbiBvdmVycmlkZSkge1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBvdmVycmlkZVtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChpc0hhc2hPYmplY3QodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNIYXNoT2JqZWN0KHRhcmdldFtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRGVlcGx5KHRhcmdldFtrZXldLCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB1cGRhdGVEZWVwbHkoe30sIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZU51bWJlcih2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0LCBwb2ludCwgdGVtcCwgZXhwb25lbnQsIHBvcztcblxuICAgICAgICBpZiAodmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ051bWVyaWMgbGl0ZXJhbCB3aG9zZSB2YWx1ZSBpcyBOYU4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOdW1lcmljIGxpdGVyYWwgd2hvc2UgdmFsdWUgaXMgbmVnYXRpdmUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gMSAvIDApIHtcbiAgICAgICAgICAgIHJldHVybiBqc29uID8gJ251bGwnIDogcmVudW1iZXIgPyAnMWU0MDAnIDogJzFlKzQwMCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSAnJyArIHZhbHVlO1xuICAgICAgICBpZiAoIXJlbnVtYmVyIHx8IHJlc3VsdC5sZW5ndGggPCAzKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgcG9pbnQgPSByZXN1bHQuaW5kZXhPZignLicpO1xuICAgICAgICBpZiAoIWpzb24gJiYgcmVzdWx0LmNoYXJDb2RlQXQoMCkgPT09IDB4MzAgIC8qIDAgKi8gJiYgcG9pbnQgPT09IDEpIHtcbiAgICAgICAgICAgIHBvaW50ID0gMDtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICB0ZW1wID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgnZSsnLCAnZScpO1xuICAgICAgICBleHBvbmVudCA9IDA7XG4gICAgICAgIGlmICgocG9zID0gdGVtcC5pbmRleE9mKCdlJykpID4gMCkge1xuICAgICAgICAgICAgZXhwb25lbnQgPSArdGVtcC5zbGljZShwb3MgKyAxKTtcbiAgICAgICAgICAgIHRlbXAgPSB0ZW1wLnNsaWNlKDAsIHBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvaW50ID49IDApIHtcbiAgICAgICAgICAgIGV4cG9uZW50IC09IHRlbXAubGVuZ3RoIC0gcG9pbnQgLSAxO1xuICAgICAgICAgICAgdGVtcCA9ICsodGVtcC5zbGljZSgwLCBwb2ludCkgKyB0ZW1wLnNsaWNlKHBvaW50ICsgMSkpICsgJyc7XG4gICAgICAgIH1cbiAgICAgICAgcG9zID0gMDtcbiAgICAgICAgd2hpbGUgKHRlbXAuY2hhckNvZGVBdCh0ZW1wLmxlbmd0aCArIHBvcyAtIDEpID09PSAweDMwICAvKiAwICovKSB7XG4gICAgICAgICAgICAtLXBvcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zICE9PSAwKSB7XG4gICAgICAgICAgICBleHBvbmVudCAtPSBwb3M7XG4gICAgICAgICAgICB0ZW1wID0gdGVtcC5zbGljZSgwLCBwb3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHBvbmVudCAhPT0gMCkge1xuICAgICAgICAgICAgdGVtcCArPSAnZScgKyBleHBvbmVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRlbXAubGVuZ3RoIDwgcmVzdWx0Lmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgICAgICAoaGV4YWRlY2ltYWwgJiYgdmFsdWUgPiAxZTEyICYmIE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZSAmJiAodGVtcCA9ICcweCcgKyB2YWx1ZS50b1N0cmluZygxNikpLmxlbmd0aCA8IHJlc3VsdC5sZW5ndGgpKSAmJlxuICAgICAgICAgICAgICAgICt0ZW1wID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGVtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgdmFsaWQgUmVnRXhwIGV4cHJlc3Npb24uXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vQ29uc3RlbGxhdGlvbi9pdiBFbmdpbmVcblxuICAgIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cENoYXJhY3RlcihjaCwgcHJldmlvdXNJc0JhY2tzbGFzaCkge1xuICAgICAgICAvLyBub3QgaGFuZGxpbmcgJ1xcJyBhbmQgaGFuZGxpbmcgXFx1MjAyOCBvciBcXHUyMDI5IHRvIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlXG4gICAgICAgIGlmICgoY2ggJiB+MSkgPT09IDB4MjAyOCkge1xuICAgICAgICAgICAgcmV0dXJuIChwcmV2aW91c0lzQmFja3NsYXNoID8gJ3UnIDogJ1xcXFx1JykgKyAoKGNoID09PSAweDIwMjgpID8gJzIwMjgnIDogJzIwMjknKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMTAgfHwgY2ggPT09IDEzKSB7ICAvLyBcXG4sIFxcclxuICAgICAgICAgICAgcmV0dXJuIChwcmV2aW91c0lzQmFja3NsYXNoID8gJycgOiAnXFxcXCcpICsgKChjaCA9PT0gMTApID8gJ24nIDogJ3InKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVSZWdFeHAocmVnKSB7XG4gICAgICAgIHZhciBtYXRjaCwgcmVzdWx0LCBmbGFncywgaSwgaXosIGNoLCBjaGFyYWN0ZXJJbkJyYWNrLCBwcmV2aW91c0lzQmFja3NsYXNoO1xuXG4gICAgICAgIHJlc3VsdCA9IHJlZy50b1N0cmluZygpO1xuXG4gICAgICAgIGlmIChyZWcuc291cmNlKSB7XG4gICAgICAgICAgICAvLyBleHRyYWN0IGZsYWcgZnJvbSB0b1N0cmluZyByZXN1bHRcbiAgICAgICAgICAgIG1hdGNoID0gcmVzdWx0Lm1hdGNoKC9cXC8oW14vXSopJC8pO1xuICAgICAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsYWdzID0gbWF0Y2hbMV07XG4gICAgICAgICAgICByZXN1bHQgPSAnJztcblxuICAgICAgICAgICAgY2hhcmFjdGVySW5CcmFjayA9IGZhbHNlO1xuICAgICAgICAgICAgcHJldmlvdXNJc0JhY2tzbGFzaCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSByZWcuc291cmNlLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICBjaCA9IHJlZy5zb3VyY2UuY2hhckNvZGVBdChpKTtcblxuICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNJc0JhY2tzbGFzaCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVySW5CcmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSA5MykgeyAgLy8gXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckluQnJhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gNDcpIHsgIC8vIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gOTEpIHsgIC8vIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJJbkJyYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gZXNjYXBlUmVnRXhwQ2hhcmFjdGVyKGNoLCBwcmV2aW91c0lzQmFja3NsYXNoKTtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNJc0JhY2tzbGFzaCA9IGNoID09PSA5MjsgIC8vIFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbmV3IFJlZ0V4cChcIlxcXFxcXG4nKSBpcyBwcm92aWRlZCwgY3JlYXRlIC9cXG4vXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBlc2NhcGVSZWdFeHBDaGFyYWN0ZXIoY2gsIHByZXZpb3VzSXNCYWNrc2xhc2gpO1xuICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGxpa2UgL1xcXFxbL10vXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSXNCYWNrc2xhc2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAnLycgKyByZXN1bHQgKyAnLycgKyBmbGFncztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlQWxsb3dlZENoYXJhY3Rlcihjb2RlLCBuZXh0KSB7XG4gICAgICAgIHZhciBoZXg7XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MDggIC8qIFxcYiAqLykge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcYic7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gMHgwQyAgLyogXFxmICovKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxmJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDA5ICAvKiBcXHQgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHQnO1xuICAgICAgICB9XG5cbiAgICAgICAgaGV4ID0gY29kZS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKGpzb24gfHwgY29kZSA+IDB4RkYpIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHUnICsgJzAwMDAnLnNsaWNlKGhleC5sZW5ndGgpICsgaGV4O1xuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MDAwMCAmJiAhZXN1dGlscy5jb2RlLmlzRGVjaW1hbERpZ2l0KG5leHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFwwJztcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDAwMEIgIC8qIFxcdiAqLykgeyAvLyAnXFx2J1xuICAgICAgICAgICAgcmV0dXJuICdcXFxceDBCJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHgnICsgJzAwJy5zbGljZShoZXgubGVuZ3RoKSArIGhleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVzY2FwZURpc2FsbG93ZWRDaGFyYWN0ZXIoY29kZSkge1xuICAgICAgICBpZiAoY29kZSA9PT0gMHg1QyAgLyogXFwgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXFxcXFwnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MEEgIC8qIFxcbiAqLykge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcbic7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gMHgwRCAgLyogXFxyICovKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxyJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDIwMjgpIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHUyMDI4JztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDIwMjkpIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHUyMDI5JztcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0bHkgY2xhc3NpZmllZCBjaGFyYWN0ZXInKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlc2NhcGVEaXJlY3RpdmUoc3RyKSB7XG4gICAgICAgIHZhciBpLCBpeiwgY29kZSwgcXVvdGU7XG5cbiAgICAgICAgcXVvdGUgPSBxdW90ZXMgPT09ICdkb3VibGUnID8gJ1wiJyA6ICdcXCcnO1xuICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0ci5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gMHgyNyAgLyogJyAqLykge1xuICAgICAgICAgICAgICAgIHF1b3RlID0gJ1wiJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyMiAgLyogXCIgKi8pIHtcbiAgICAgICAgICAgICAgICBxdW90ZSA9ICdcXCcnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDVDICAvKiBcXCAqLykge1xuICAgICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdW90ZSArIHN0ciArIHF1b3RlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHIpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICcnLCBpLCBsZW4sIGNvZGUsIHNpbmdsZVF1b3RlcyA9IDAsIGRvdWJsZVF1b3RlcyA9IDAsIHNpbmdsZSwgcXVvdGU7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gMHgyNyAgLyogJyAqLykge1xuICAgICAgICAgICAgICAgICsrc2luZ2xlUXVvdGVzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDIyICAvKiBcIiAqLykge1xuICAgICAgICAgICAgICAgICsrZG91YmxlUXVvdGVzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDJGICAvKiAvICovICYmIGpzb24pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihjb2RlKSB8fCBjb2RlID09PSAweDVDICAvKiBcXCAqLykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBlc2NhcGVEaXNhbGxvd2VkQ2hhcmFjdGVyKGNvZGUpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUoY29kZSkgJiYgKGpzb24gJiYgY29kZSA8IDB4MjAgIC8qIFNQICovIHx8ICFqc29uICYmICFlc2NhcGVsZXNzICYmIChjb2RlIDwgMHgyMCAgLyogU1AgKi8gfHwgY29kZSA+IDB4N0UgIC8qIH4gKi8pKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBlc2NhcGVBbGxvd2VkQ2hhcmFjdGVyKGNvZGUsIHN0ci5jaGFyQ29kZUF0KGkgKyAxKSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNpbmdsZSA9ICEocXVvdGVzID09PSAnZG91YmxlJyB8fCAocXVvdGVzID09PSAnYXV0bycgJiYgZG91YmxlUXVvdGVzIDwgc2luZ2xlUXVvdGVzKSk7XG4gICAgICAgIHF1b3RlID0gc2luZ2xlID8gJ1xcJycgOiAnXCInO1xuXG4gICAgICAgIGlmICghKHNpbmdsZSA/IHNpbmdsZVF1b3RlcyA6IGRvdWJsZVF1b3RlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBxdW90ZSArIHJlc3VsdCArIHF1b3RlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSBxdW90ZTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmICgoY29kZSA9PT0gMHgyNyAgLyogJyAqLyAmJiBzaW5nbGUpIHx8IChjb2RlID09PSAweDIyICAvKiBcIiAqLyAmJiAhc2luZ2xlKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQgKyBxdW90ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBmbGF0dGVuIGFuIGFycmF5IHRvIGEgc3RyaW5nLCB3aGVyZSB0aGUgYXJyYXkgY2FuIGNvbnRhaW5cbiAgICAgKiBlaXRoZXIgc3RyaW5ncyBvciBuZXN0ZWQgYXJyYXlzXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlblRvU3RyaW5nKGFycikge1xuICAgICAgICB2YXIgaSwgaXosIGVsZW0sIHJlc3VsdCA9ICcnO1xuICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGFyci5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICBlbGVtID0gYXJyW2ldO1xuICAgICAgICAgICAgcmVzdWx0ICs9IEFycmF5LmlzQXJyYXkoZWxlbSkgPyBmbGF0dGVuVG9TdHJpbmcoZWxlbSkgOiBlbGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29udmVydCBnZW5lcmF0ZWQgdG8gYSBTb3VyY2VOb2RlIHdoZW4gc291cmNlIG1hcHMgYXJlIGVuYWJsZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChnZW5lcmF0ZWQsIG5vZGUpIHtcbiAgICAgICAgaWYgKCFzb3VyY2VNYXApIHtcbiAgICAgICAgICAgIC8vIHdpdGggbm8gc291cmNlIG1hcHMsIGdlbmVyYXRlZCBpcyBlaXRoZXIgYW5cbiAgICAgICAgICAgIC8vIGFycmF5IG9yIGEgc3RyaW5nLiAgaWYgYW4gYXJyYXksIGZsYXR0ZW4gaXQuXG4gICAgICAgICAgICAvLyBpZiBhIHN0cmluZywganVzdCByZXR1cm4gaXRcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGdlbmVyYXRlZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmxhdHRlblRvU3RyaW5nKGdlbmVyYXRlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGdlbmVyYXRlZCBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubG9jID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU291cmNlTm9kZShudWxsLCBudWxsLCBzb3VyY2VNYXAsIGdlbmVyYXRlZCwgbm9kZS5uYW1lIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU291cmNlTm9kZShub2RlLmxvYy5zdGFydC5saW5lLCBub2RlLmxvYy5zdGFydC5jb2x1bW4sIChzb3VyY2VNYXAgPT09IHRydWUgPyBub2RlLmxvYy5zb3VyY2UgfHwgbnVsbCA6IHNvdXJjZU1hcCksIGdlbmVyYXRlZCwgbm9kZS5uYW1lIHx8IG51bGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vRW1wdHlTcGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIChzcGFjZSkgPyBzcGFjZSA6ICcgJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBqb2luKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIHZhciBsZWZ0U291cmNlLFxuICAgICAgICAgICAgcmlnaHRTb3VyY2UsXG4gICAgICAgICAgICBsZWZ0Q2hhckNvZGUsXG4gICAgICAgICAgICByaWdodENoYXJDb2RlO1xuXG4gICAgICAgIGxlZnRTb3VyY2UgPSB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGxlZnQpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChsZWZ0U291cmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtyaWdodF07XG4gICAgICAgIH1cblxuICAgICAgICByaWdodFNvdXJjZSA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmlnaHQpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChyaWdodFNvdXJjZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbbGVmdF07XG4gICAgICAgIH1cblxuICAgICAgICBsZWZ0Q2hhckNvZGUgPSBsZWZ0U291cmNlLmNoYXJDb2RlQXQobGVmdFNvdXJjZS5sZW5ndGggLSAxKTtcbiAgICAgICAgcmlnaHRDaGFyQ29kZSA9IHJpZ2h0U291cmNlLmNoYXJDb2RlQXQoMCk7XG5cbiAgICAgICAgaWYgKChsZWZ0Q2hhckNvZGUgPT09IDB4MkIgIC8qICsgKi8gfHwgbGVmdENoYXJDb2RlID09PSAweDJEICAvKiAtICovKSAmJiBsZWZ0Q2hhckNvZGUgPT09IHJpZ2h0Q2hhckNvZGUgfHxcbiAgICAgICAgICAgIGVzdXRpbHMuY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1KGxlZnRDaGFyQ29kZSkgJiYgZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUocmlnaHRDaGFyQ29kZSkgfHxcbiAgICAgICAgICAgIGxlZnRDaGFyQ29kZSA9PT0gMHgyRiAgLyogLyAqLyAmJiByaWdodENoYXJDb2RlID09PSAweDY5ICAvKiBpICovKSB7IC8vIGluZml4IHdvcmQgb3BlcmF0b3JzIGFsbCBzdGFydCB3aXRoIGBpYFxuICAgICAgICAgICAgcmV0dXJuIFtsZWZ0LCBub0VtcHR5U3BhY2UoKSwgcmlnaHRdO1xuICAgICAgICB9IGVsc2UgaWYgKGVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UobGVmdENoYXJDb2RlKSB8fCBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihsZWZ0Q2hhckNvZGUpIHx8XG4gICAgICAgICAgICAgICAgZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShyaWdodENoYXJDb2RlKSB8fCBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihyaWdodENoYXJDb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtsZWZ0LCByaWdodF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtsZWZ0LCBzcGFjZSwgcmlnaHRdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZEluZGVudChzdG10KSB7XG4gICAgICAgIHJldHVybiBbYmFzZSwgc3RtdF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2l0aEluZGVudChmbikge1xuICAgICAgICB2YXIgcHJldmlvdXNCYXNlO1xuICAgICAgICBwcmV2aW91c0Jhc2UgPSBiYXNlO1xuICAgICAgICBiYXNlICs9IGluZGVudDtcbiAgICAgICAgZm4oYmFzZSk7XG4gICAgICAgIGJhc2UgPSBwcmV2aW91c0Jhc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlU3BhY2VzKHN0cikge1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgZm9yIChpID0gc3RyLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICBpZiAoZXN1dGlscy5jb2RlLmlzTGluZVRlcm1pbmF0b3Ioc3RyLmNoYXJDb2RlQXQoaSkpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzdHIubGVuZ3RoIC0gMSkgLSBpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkanVzdE11bHRpbGluZUNvbW1lbnQodmFsdWUsIHNwZWNpYWxCYXNlKSB7XG4gICAgICAgIHZhciBhcnJheSwgaSwgbGVuLCBsaW5lLCBqLCBzcGFjZXMsIHByZXZpb3VzQmFzZSwgc247XG5cbiAgICAgICAgYXJyYXkgPSB2YWx1ZS5zcGxpdCgvXFxyXFxufFtcXHJcXG5dLyk7XG4gICAgICAgIHNwYWNlcyA9IE51bWJlci5NQVhfVkFMVUU7XG5cbiAgICAgICAgLy8gZmlyc3QgbGluZSBkb2Vzbid0IGhhdmUgaW5kZW50YXRpb25cbiAgICAgICAgZm9yIChpID0gMSwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGxpbmUgPSBhcnJheVtpXTtcbiAgICAgICAgICAgIGogPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGogPCBsaW5lLmxlbmd0aCAmJiBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGxpbmUuY2hhckNvZGVBdChqKSkpIHtcbiAgICAgICAgICAgICAgICArK2o7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3BhY2VzID4gaikge1xuICAgICAgICAgICAgICAgIHNwYWNlcyA9IGo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHNwZWNpYWxCYXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gcGF0dGVybiBsaWtlXG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyAgIHZhciB0ID0gMjA7ICAvKlxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICogdGhpcyBpcyBjb21tZW50XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHByZXZpb3VzQmFzZSA9IGJhc2U7XG4gICAgICAgICAgICBpZiAoYXJyYXlbMV1bc3BhY2VzXSA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgc3BlY2lhbEJhc2UgKz0gJyAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmFzZSA9IHNwZWNpYWxCYXNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNwYWNlcyAmIDEpIHtcbiAgICAgICAgICAgICAgICAvLyAvKlxuICAgICAgICAgICAgICAgIC8vICAqXG4gICAgICAgICAgICAgICAgLy8gICovXG4gICAgICAgICAgICAgICAgLy8gSWYgc3BhY2VzIGFyZSBvZGQgbnVtYmVyLCBhYm92ZSBwYXR0ZXJuIGlzIGNvbnNpZGVyZWQuXG4gICAgICAgICAgICAgICAgLy8gV2Ugd2FzdGUgMSBzcGFjZS5cbiAgICAgICAgICAgICAgICAtLXNwYWNlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZpb3VzQmFzZSA9IGJhc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAxLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgc24gPSB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGFkZEluZGVudChhcnJheVtpXS5zbGljZShzcGFjZXMpKSk7XG4gICAgICAgICAgICBhcnJheVtpXSA9IHNvdXJjZU1hcCA/IHNuLmpvaW4oJycpIDogc247XG4gICAgICAgIH1cblxuICAgICAgICBiYXNlID0gcHJldmlvdXNCYXNlO1xuXG4gICAgICAgIHJldHVybiBhcnJheS5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCwgc3BlY2lhbEJhc2UpIHtcbiAgICAgICAgaWYgKGNvbW1lbnQudHlwZSA9PT0gJ0xpbmUnKSB7XG4gICAgICAgICAgICBpZiAoZW5kc1dpdGhMaW5lVGVybWluYXRvcihjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnLy8nICsgY29tbWVudC52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQWx3YXlzIHVzZSBMaW5lVGVybWluYXRvclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnLy8nICsgY29tbWVudC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIXByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1xcbic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dHJhLmZvcm1hdC5pbmRlbnQuYWRqdXN0TXVsdGlsaW5lQ29tbWVudCAmJiAvW1xcblxccl0vLnRlc3QoY29tbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBhZGp1c3RNdWx0aWxpbmVDb21tZW50KCcvKicgKyBjb21tZW50LnZhbHVlICsgJyovJywgc3BlY2lhbEJhc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnLyonICsgY29tbWVudC52YWx1ZSArICcqLyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkQ29tbWVudHMoc3RtdCwgcmVzdWx0KSB7XG4gICAgICAgIHZhciBpLCBsZW4sIGNvbW1lbnQsIHNhdmUsIHRhaWxpbmdUb1N0YXRlbWVudCwgc3BlY2lhbEJhc2UsIGZyYWdtZW50LFxuICAgICAgICAgICAgZXh0UmFuZ2UsIHJhbmdlLCBwcmV2UmFuZ2UsIHByZWZpeCwgaW5maXgsIHN1ZmZpeCwgY291bnQ7XG5cbiAgICAgICAgaWYgKHN0bXQubGVhZGluZ0NvbW1lbnRzICYmIHN0bXQubGVhZGluZ0NvbW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNhdmUgPSByZXN1bHQ7XG5cbiAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJsYW5rTGluZXMpIHtcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC5sZWFkaW5nQ29tbWVudHNbMF07XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgICAgICAgICAgICBleHRSYW5nZSA9IGNvbW1lbnQuZXh0ZW5kZWRSYW5nZTtcbiAgICAgICAgICAgICAgICByYW5nZSA9IGNvbW1lbnQucmFuZ2U7XG5cbiAgICAgICAgICAgICAgICBwcmVmaXggPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhleHRSYW5nZVswXSwgcmFuZ2VbMF0pO1xuICAgICAgICAgICAgICAgIGNvdW50ID0gKHByZWZpeC5tYXRjaCgvXFxuL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdHJpbmdSZXBlYXQoJ1xcbicsIGNvdW50KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcmVmaXgpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByZXZSYW5nZSA9IHJhbmdlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMSwgbGVuID0gc3RtdC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IHN0bXQubGVhZGluZ0NvbW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGNvbW1lbnQucmFuZ2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaW5maXggPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhwcmV2UmFuZ2VbMV0sIHJhbmdlWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgY291bnQgPSAoaW5maXgubWF0Y2goL1xcbi9nKSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdHJpbmdSZXBlYXQoJ1xcbicsIGNvdW50KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpKTtcblxuICAgICAgICAgICAgICAgICAgICBwcmV2UmFuZ2UgPSByYW5nZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdWZmaXggPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhyYW5nZVsxXSwgZXh0UmFuZ2VbMV0pO1xuICAgICAgICAgICAgICAgIGNvdW50ID0gKHN1ZmZpeC5tYXRjaCgvXFxuL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3RyaW5nUmVwZWF0KCdcXG4nLCBjb3VudCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC5sZWFkaW5nQ29tbWVudHNbMF07XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgaWYgKHNhZmVDb25jYXRlbmF0aW9uICYmIHN0bXQudHlwZSA9PT0gU3ludGF4LlByb2dyYW0gJiYgc3RtdC5ib2R5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlQ29tbWVudChjb21tZW50KSk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMSwgbGVuID0gc3RtdC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IHN0bXQubGVhZGluZ0NvbW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IFtnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LnB1c2goJ1xcbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudChmcmFnbWVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KHNhdmUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdG10LnRyYWlsaW5nQ29tbWVudHMpIHtcblxuICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdG10LnRyYWlsaW5nQ29tbWVudHNbMF07XG4gICAgICAgICAgICAgICAgZXh0UmFuZ2UgPSBjb21tZW50LmV4dGVuZGVkUmFuZ2U7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBjb21tZW50LnJhbmdlO1xuXG4gICAgICAgICAgICAgICAgcHJlZml4ID0gc291cmNlQ29kZS5zdWJzdHJpbmcoZXh0UmFuZ2VbMF0sIHJhbmdlWzBdKTtcbiAgICAgICAgICAgICAgICBjb3VudCA9IChwcmVmaXgubWF0Y2goL1xcbi9nKSB8fCBbXSkubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdHJpbmdSZXBlYXQoJ1xcbicsIGNvdW50KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcmVmaXgpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFpbGluZ1RvU3RhdGVtZW50ID0gIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIHNwZWNpYWxCYXNlID0gc3RyaW5nUmVwZWF0KCcgJywgY2FsY3VsYXRlU3BhY2VzKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoW2Jhc2UsIHJlc3VsdCwgaW5kZW50XSkudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHN0bXQudHJhaWxpbmdDb21tZW50cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC50cmFpbGluZ0NvbW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFpbGluZ1RvU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhc3N1bWUgdGFyZ2V0IGxpa2UgZm9sbG93aW5nIHNjcmlwdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhciB0ID0gMjA7ICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgKiBUaGlzIGlzIGNvbW1lbnQgb2YgdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW3Jlc3VsdCwgaW5kZW50XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW3Jlc3VsdCwgc3BlY2lhbEJhc2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVDb21tZW50KGNvbW1lbnQsIHNwZWNpYWxCYXNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbcmVzdWx0LCBhZGRJbmRlbnQoZ2VuZXJhdGVDb21tZW50KGNvbW1lbnQpKV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT09IGxlbiAtIDEgJiYgIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbcmVzdWx0LCAnXFxuJ107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlQmxhbmtMaW5lcyhzdGFydCwgZW5kLCByZXN1bHQpIHtcbiAgICAgICAgdmFyIGosIG5ld2xpbmVDb3VudCA9IDA7XG5cbiAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPCBlbmQ7IGorKykge1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNvZGVbal0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgbmV3bGluZUNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGogPSAxOyBqIDwgbmV3bGluZUNvdW50OyBqKyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyZW50aGVzaXplKHRleHQsIGN1cnJlbnQsIHNob3VsZCkge1xuICAgICAgICBpZiAoY3VycmVudCA8IHNob3VsZCkge1xuICAgICAgICAgICAgcmV0dXJuIFsnKCcsIHRleHQsICcpJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVWZXJiYXRpbVN0cmluZyhzdHJpbmcpIHtcbiAgICAgICAgdmFyIGksIGl6LCByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IHN0cmluZy5zcGxpdCgvXFxyXFxufFxcbi8pO1xuICAgICAgICBmb3IgKGkgPSAxLCBpeiA9IHJlc3VsdC5sZW5ndGg7IGkgPCBpejsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHRbaV0gPSBuZXdsaW5lICsgYmFzZSArIHJlc3VsdFtpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlVmVyYmF0aW0oZXhwciwgcHJlY2VkZW5jZSkge1xuICAgICAgICB2YXIgdmVyYmF0aW0sIHJlc3VsdCwgcHJlYztcbiAgICAgICAgdmVyYmF0aW0gPSBleHByW2V4dHJhLnZlcmJhdGltXTtcblxuICAgICAgICBpZiAodHlwZW9mIHZlcmJhdGltID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50aGVzaXplKGdlbmVyYXRlVmVyYmF0aW1TdHJpbmcodmVyYmF0aW0pLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHZlcmJhdGltIGlzIG9iamVjdFxuICAgICAgICAgICAgcmVzdWx0ID0gZ2VuZXJhdGVWZXJiYXRpbVN0cmluZyh2ZXJiYXRpbS5jb250ZW50KTtcbiAgICAgICAgICAgIHByZWMgPSAodmVyYmF0aW0ucHJlY2VkZW5jZSAhPSBudWxsKSA/IHZlcmJhdGltLnByZWNlZGVuY2UgOiBQcmVjZWRlbmNlLlNlcXVlbmNlO1xuICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50aGVzaXplKHJlc3VsdCwgcHJlYywgcHJlY2VkZW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQsIGV4cHIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIENvZGVHZW5lcmF0b3IoKSB7XG4gICAgfVxuXG4gICAgLy8gSGVscGVycy5cblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLm1heWJlQmxvY2sgPSBmdW5jdGlvbihzdG10LCBmbGFncykge1xuICAgICAgICB2YXIgcmVzdWx0LCBub0xlYWRpbmdDb21tZW50LCB0aGF0ID0gdGhpcztcblxuICAgICAgICBub0xlYWRpbmdDb21tZW50ID0gIWV4dHJhLmNvbW1lbnQgfHwgIXN0bXQubGVhZGluZ0NvbW1lbnRzO1xuXG4gICAgICAgIGlmIChzdG10LnR5cGUgPT09IFN5bnRheC5CbG9ja1N0YXRlbWVudCAmJiBub0xlYWRpbmdDb21tZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gW3NwYWNlLCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQsIGZsYWdzKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RtdC50eXBlID09PSBTeW50YXguRW1wdHlTdGF0ZW1lbnQgJiYgbm9MZWFkaW5nQ29tbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuICc7JztcbiAgICAgICAgfVxuXG4gICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgIG5ld2xpbmUsXG4gICAgICAgICAgICAgICAgYWRkSW5kZW50KHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdCwgZmxhZ3MpKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUubWF5YmVCbG9ja1N1ZmZpeCA9IGZ1bmN0aW9uIChzdG10LCByZXN1bHQpIHtcbiAgICAgICAgdmFyIGVuZHMgPSBlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHN0bXQudHlwZSA9PT0gU3ludGF4LkJsb2NrU3RhdGVtZW50ICYmICghZXh0cmEuY29tbWVudCB8fCAhc3RtdC5sZWFkaW5nQ29tbWVudHMpICYmICFlbmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW3Jlc3VsdCwgc3BhY2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW3Jlc3VsdCwgYmFzZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtyZXN1bHQsIG5ld2xpbmUsIGJhc2VdO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZUlkZW50aWZpZXIobm9kZSkge1xuICAgICAgICByZXR1cm4gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChub2RlLm5hbWUsIG5vZGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlQXN5bmNQcmVmaXgobm9kZSwgc3BhY2VSZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4gbm9kZS5hc3luYyA/ICdhc3luYycgKyAoc3BhY2VSZXF1aXJlZCA/IG5vRW1wdHlTcGFjZSgpIDogc3BhY2UpIDogJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVTdGFyU3VmZml4KG5vZGUpIHtcbiAgICAgICAgdmFyIGlzR2VuZXJhdG9yID0gbm9kZS5nZW5lcmF0b3IgJiYgIWV4dHJhLm1vei5zdGFybGVzc0dlbmVyYXRvcjtcbiAgICAgICAgcmV0dXJuIGlzR2VuZXJhdG9yID8gJyonICsgc3BhY2UgOiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZU1ldGhvZFByZWZpeChwcm9wKSB7XG4gICAgICAgIHZhciBmdW5jID0gcHJvcC52YWx1ZSwgcHJlZml4ID0gJyc7XG4gICAgICAgIGlmIChmdW5jLmFzeW5jKSB7XG4gICAgICAgICAgICBwcmVmaXggKz0gZ2VuZXJhdGVBc3luY1ByZWZpeChmdW5jLCAhcHJvcC5jb21wdXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZ1bmMuZ2VuZXJhdG9yKSB7XG4gICAgICAgICAgICAvLyBhdm9pZCBzcGFjZSBiZWZvcmUgbWV0aG9kIG5hbWVcbiAgICAgICAgICAgIHByZWZpeCArPSBnZW5lcmF0ZVN0YXJTdWZmaXgoZnVuYykgPyAnKicgOiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJlZml4O1xuICAgIH1cblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlUGF0dGVybiA9IGZ1bmN0aW9uIChub2RlLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSBTeW50YXguSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlSWRlbnRpZmllcihub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24obm9kZSwgcHJlY2VkZW5jZSwgZmxhZ3MpO1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZUZ1bmN0aW9uUGFyYW1zID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIGksIGl6LCByZXN1bHQsIGhhc0RlZmF1bHQ7XG5cbiAgICAgICAgaGFzRGVmYXVsdCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IFN5bnRheC5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICFub2RlLnJlc3QgJiYgKCFub2RlLmRlZmF1bHRzIHx8IG5vZGUuZGVmYXVsdHMubGVuZ3RoID09PSAwKSAmJlxuICAgICAgICAgICAgICAgIG5vZGUucGFyYW1zLmxlbmd0aCA9PT0gMSAmJiBub2RlLnBhcmFtc1swXS50eXBlID09PSBTeW50YXguSWRlbnRpZmllcikge1xuICAgICAgICAgICAgLy8gYXJnID0+IHsgfSBjYXNlXG4gICAgICAgICAgICByZXN1bHQgPSBbZ2VuZXJhdGVBc3luY1ByZWZpeChub2RlLCB0cnVlKSwgZ2VuZXJhdGVJZGVudGlmaWVyKG5vZGUucGFyYW1zWzBdKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBub2RlLnR5cGUgPT09IFN5bnRheC5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiA/IFtnZW5lcmF0ZUFzeW5jUHJlZml4KG5vZGUsIGZhbHNlKV0gOiBbXTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcoJyk7XG4gICAgICAgICAgICBpZiAobm9kZS5kZWZhdWx0cykge1xuICAgICAgICAgICAgICAgIGhhc0RlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBub2RlLnBhcmFtcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlZmF1bHQgJiYgbm9kZS5kZWZhdWx0c1tpXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVBc3NpZ25tZW50KG5vZGUucGFyYW1zW2ldLCBub2RlLmRlZmF1bHRzW2ldLCAnPScsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlUGF0dGVybihub2RlLnBhcmFtc1tpXSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9kZS5yZXN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyYW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcuLi4nKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUlkZW50aWZpZXIobm9kZS5yZXN0KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcpJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZUZ1bmN0aW9uQm9keSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciByZXN1bHQsIGV4cHI7XG5cbiAgICAgICAgcmVzdWx0ID0gdGhpcy5nZW5lcmF0ZUZ1bmN0aW9uUGFyYW1zKG5vZGUpO1xuXG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IFN5bnRheC5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJz0+Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICBleHByID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24obm9kZS5ib2R5LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKTtcbiAgICAgICAgICAgIGlmIChleHByLnRvU3RyaW5nKCkuY2hhckF0KDApID09PSAneycpIHtcbiAgICAgICAgICAgICAgICBleHByID0gWycoJywgZXhwciwgJyknXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGV4cHIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKG5vZGUuYm9keSwgU19UVEZGKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZUl0ZXJhdGlvbkZvclN0YXRlbWVudCA9IGZ1bmN0aW9uIChvcGVyYXRvciwgc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFsnZm9yJyArIChzdG10LmF3YWl0ID8gbm9FbXB0eVNwYWNlKCkgKyAnYXdhaXQnIDogJycpICsgc3BhY2UgKyAnKCddLCB0aGF0ID0gdGhpcztcbiAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoc3RtdC5sZWZ0LnR5cGUgPT09IFN5bnRheC5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0bXQubGVmdC5raW5kICsgbm9FbXB0eVNwYWNlKCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KHN0bXQubGVmdC5kZWNsYXJhdGlvbnNbMF0sIFNfRkZGRikpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmxlZnQsIFByZWNlZGVuY2UuQ2FsbCwgRV9UVFQpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIG9wZXJhdG9yKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IFtqb2luKFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnJpZ2h0LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKVxuICAgICAgICAgICAgKSwgJyknXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIGZsYWdzKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlUHJvcGVydHlLZXkgPSBmdW5jdGlvbiAoZXhwciwgY29tcHV0ZWQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICAgIGlmIChjb21wdXRlZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ1snKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpKTtcblxuICAgICAgICBpZiAoY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCddJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZUFzc2lnbm1lbnQgPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQsIG9wZXJhdG9yLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICBpZiAoUHJlY2VkZW5jZS5Bc3NpZ25tZW50IDwgcHJlY2VkZW5jZSkge1xuICAgICAgICAgICAgZmxhZ3MgfD0gRl9BTExPV19JTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24obGVmdCwgUHJlY2VkZW5jZS5DYWxsLCBmbGFncyksXG4gICAgICAgICAgICAgICAgc3BhY2UgKyBvcGVyYXRvciArIHNwYWNlLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHJpZ2h0LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGZsYWdzKVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFByZWNlZGVuY2UuQXNzaWdubWVudCxcbiAgICAgICAgICAgIHByZWNlZGVuY2VcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuc2VtaWNvbG9uID0gZnVuY3Rpb24gKGZsYWdzKSB7XG4gICAgICAgIGlmICghc2VtaWNvbG9ucyAmJiBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnOyc7XG4gICAgfTtcblxuICAgIC8vIFN0YXRlbWVudHMuXG5cbiAgICBDb2RlR2VuZXJhdG9yLlN0YXRlbWVudCA9IHtcblxuICAgICAgICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmFuZ2UsIGNvbnRlbnQsIHJlc3VsdCA9IFsneycsIG5ld2xpbmVdLCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGZ1bmN0aW9ucyB3aXRob3V0IGFueSBjb2RlXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuYm9keS5sZW5ndGggPT09IDAgJiYgcHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gc3RtdC5yYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlWzFdIC0gcmFuZ2VbMF0gPiAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gc291cmNlQ29kZS5zdWJzdHJpbmcocmFuZ2VbMF0gKyAxLCByYW5nZVsxXSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRbMF0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gWyd7J107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBpLCBpeiwgZnJhZ21lbnQsIGJvZHlGbGFncztcbiAgICAgICAgICAgICAgICBib2R5RmxhZ3MgPSBTX1RGRkY7XG4gICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRl9GVU5DX0JPRFkpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keUZsYWdzIHw9IEZfRElSRUNUSVZFX0NUWDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0bXQuYm9keS5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJsYW5rTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYmVmb3JlIHRoZSBmaXJzdCBsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmJvZHlbMF0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gc3RtdC5ib2R5WzBdLmxlYWRpbmdDb21tZW50c1swXS5leHRlbmRlZFJhbmdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gc291cmNlQ29kZS5zdWJzdHJpbmcocmFuZ2VbMF0sIHJhbmdlWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRbMF0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ3snXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVswXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQucmFuZ2VbMF0sIHN0bXQuYm9keVswXS5yYW5nZVswXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYmV0d2VlbiBsaW5lc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaSAtIDFdLnRyYWlsaW5nQ29tbWVudHMgICYmICFzdG10LmJvZHlbaV0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlQmxhbmtMaW5lcyhzdG10LmJvZHlbaSAtIDFdLnJhbmdlWzFdLCBzdG10LmJvZHlbaV0ucmFuZ2VbMF0sIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGl6IC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUZsYWdzIHw9IEZfU0VNSUNPTE9OX09QVDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmJvZHlbaV0ubGVhZGluZ0NvbW1lbnRzICYmIHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGF0LmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuYm9keVtpXSwgYm9keUZsYWdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gYWRkSW5kZW50KHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5ib2R5W2ldLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoZnJhZ21lbnQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzICYmIGkgPCBpeiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhZGQgYSBuZXcgbGluZSBpZiB0aGVyZSBhcmUgbGVhZGluZyBjb21lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG5leHQgc3RhdGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaSArIDFdLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBhZnRlciB0aGUgbGFzdCBsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaV0udHJhaWxpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUJsYW5rTGluZXMoc3RtdC5ib2R5W2ldLnJhbmdlWzFdLCBzdG10LnJhbmdlWzFdLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXN1bHQucHVzaChhZGRJbmRlbnQoJ30nKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEJyZWFrU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChzdG10LmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdicmVhayAnICsgc3RtdC5sYWJlbC5uYW1lICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICdicmVhaycgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ29udGludWVTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgaWYgKHN0bXQubGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbnRpbnVlICcgKyBzdG10LmxhYmVsLm5hbWUgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ2NvbnRpbnVlJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDbGFzc0JvZHk6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsgJ3snLCBuZXdsaW5lXSwgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKGluZGVudCkge1xuICAgICAgICAgICAgICAgIHZhciBpLCBpejtcblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5ib2R5Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5ib2R5W2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYmFzZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnfScpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBDbGFzc0RlY2xhcmF0aW9uOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50O1xuICAgICAgICAgICAgcmVzdWx0ICA9IFsnY2xhc3MnXTtcbiAgICAgICAgICAgIGlmIChzdG10LmlkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuaWQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RtdC5zdXBlckNsYXNzKSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBqb2luKCdleHRlbmRzJywgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zdXBlckNsYXNzLCBQcmVjZWRlbmNlLlVuYXJ5LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuYm9keSwgU19URkZUKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIERpcmVjdGl2ZVN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoZXh0cmEucmF3ICYmIHN0bXQucmF3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0bXQucmF3ICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVzY2FwZURpcmVjdGl2ZShzdG10LmRpcmVjdGl2ZSkgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRG9XaGlsZVN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICAvLyBCZWNhdXNlIGBkbyA0MiB3aGlsZSAoY29uZClgIGlzIFN5bnRheCBFcnJvci4gV2UgbmVlZCBzZW1pY29sb24uXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gam9pbignZG8nLCB0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBTX1RGRkYpKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChzdG10LmJvZHksIHJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm4gam9pbihyZXN1bHQsIFtcbiAgICAgICAgICAgICAgICAnd2hpbGUnICsgc3BhY2UgKyAnKCcsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC50ZXN0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgJyknICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDYXRjaENsYXVzZTogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBndWFyZDtcblxuICAgICAgICAgICAgICAgIGlmIChzdG10LnBhcmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjYXRjaCcgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQucGFyYW0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICcpJ1xuICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdG10Lmd1YXJkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBndWFyZCA9IHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuZ3VhcmQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zcGxpY2UoMiwgMCwgJyBpZiAnLCBndWFyZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ2NhdGNoJ107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBTX1RGRkYpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRGVidWdnZXJTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuICdkZWJ1Z2dlcicgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRW1wdHlTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuICc7JztcbiAgICAgICAgfSxcblxuICAgICAgICBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsgJ2V4cG9ydCcgXSwgYm9keUZsYWdzO1xuXG4gICAgICAgICAgICBib2R5RmxhZ3MgPSAoZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQpID8gU19URkZUIDogU19URkZGO1xuXG4gICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBIb2lzdGFibGVEZWNsYXJhdGlvbltEZWZhdWx0XVxuICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgQXNzaWdubWVudEV4cHJlc3Npb25bSW5dIDtcbiAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCAnZGVmYXVsdCcpO1xuICAgICAgICAgICAgaWYgKGlzU3RhdGVtZW50KHN0bXQuZGVjbGFyYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5kZWNsYXJhdGlvbiwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmRlY2xhcmF0aW9uLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsgJ2V4cG9ydCcgXSwgYm9keUZsYWdzLCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgYm9keUZsYWdzID0gKGZsYWdzICYgRl9TRU1JQ09MT05fT1BUKSA/IFNfVEZGVCA6IFNfVEZGRjtcblxuICAgICAgICAgICAgLy8gZXhwb3J0IFZhcmlhYmxlU3RhdGVtZW50XG4gICAgICAgICAgICAvLyBleHBvcnQgRGVjbGFyYXRpb25bRGVmYXVsdF1cbiAgICAgICAgICAgIGlmIChzdG10LmRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuZGVjbGFyYXRpb24sIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBleHBvcnQgRXhwb3J0Q2xhdXNlW05vUmVmZXJlbmNlXSBGcm9tQ2xhdXNlIDtcbiAgICAgICAgICAgIC8vIGV4cG9ydCBFeHBvcnRDbGF1c2UgO1xuICAgICAgICAgICAgaWYgKHN0bXQuc3BlY2lmaWVycykge1xuICAgICAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCAneycgKyBzcGFjZSArICd9Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdG10LnNwZWNpZmllcnNbMF0udHlwZSA9PT0gU3ludGF4LkV4cG9ydEJhdGNoU3BlY2lmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbMF0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsICd7Jyk7XG4gICAgICAgICAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKGluZGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0bXQuc3BlY2lmaWVycy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgbmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYmFzZSArICd9Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAnZnJvbScgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vZHVsZVNwZWNpZmllclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zb3VyY2UsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VtaWNvbG9uKGZsYWdzKVxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbWljb2xvbihmbGFncykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRXhwb3J0QWxsRGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgLy8gZXhwb3J0ICogRnJvbUNsYXVzZSA7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICdleHBvcnQnICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgJyonICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgJ2Zyb20nICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zb3VyY2UsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbWljb2xvbihmbGFncylcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBmcmFnbWVudDtcblxuICAgICAgICAgICAgZnVuY3Rpb24gaXNDbGFzc1ByZWZpeGVkKGZyYWdtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZGU7XG4gICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50LnNsaWNlKDAsIDUpICE9PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29kZSA9IGZyYWdtZW50LmNoYXJDb2RlQXQoNSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUgPT09IDB4N0IgIC8qICd7JyAqLyB8fCBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGNvZGUpIHx8IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGNvZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uUHJlZml4ZWQoZnJhZ21lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZTtcbiAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuc2xpY2UoMCwgOCkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2RlID0gZnJhZ21lbnQuY2hhckNvZGVBdCg4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZSA9PT0gMHgyOCAvKiAnKCcgKi8gfHwgZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShjb2RlKSB8fCBjb2RlID09PSAweDJBICAvKiAnKicgKi8gfHwgZXN1dGlscy5jb2RlLmlzTGluZVRlcm1pbmF0b3IoY29kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGlzQXN5bmNQcmVmaXhlZChmcmFnbWVudCkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlLCBpLCBpejtcbiAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuc2xpY2UoMCwgNSkgIT09ICdhc3luYycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UoZnJhZ21lbnQuY2hhckNvZGVBdCg1KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSA2LCBpeiA9IGZyYWdtZW50Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGZyYWdtZW50LmNoYXJDb2RlQXQoaSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuc2xpY2UoaSwgaSArIDgpICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29kZSA9IGZyYWdtZW50LmNoYXJDb2RlQXQoaSArIDgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlID09PSAweDI4IC8qICcoJyAqLyB8fCBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGNvZGUpIHx8IGNvZGUgPT09IDB4MkEgIC8qICcqJyAqLyB8fCBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihjb2RlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuZXhwcmVzc2lvbiwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXTtcbiAgICAgICAgICAgIC8vIDEyLjQgJ3snLCAnZnVuY3Rpb24nLCAnY2xhc3MnIGlzIG5vdCBhbGxvd2VkIGluIHRoaXMgcG9zaXRpb24uXG4gICAgICAgICAgICAvLyB3cmFwIGV4cHJlc3Npb24gd2l0aCBwYXJlbnRoZXNlc1xuICAgICAgICAgICAgZnJhZ21lbnQgPSB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmIChmcmFnbWVudC5jaGFyQ29kZUF0KDApID09PSAweDdCICAvKiAneycgKi8gfHwgIC8vIE9iamVjdEV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgaXNDbGFzc1ByZWZpeGVkKGZyYWdtZW50KSB8fFxuICAgICAgICAgICAgICAgICAgICBpc0Z1bmN0aW9uUHJlZml4ZWQoZnJhZ21lbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgIGlzQXN5bmNQcmVmaXhlZChmcmFnbWVudCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSAmJiAoZmxhZ3MgJiBGX0RJUkVDVElWRV9DVFgpICYmIHN0bXQuZXhwcmVzc2lvbi50eXBlID09PSBTeW50YXguTGl0ZXJhbCAmJiB0eXBlb2Ygc3RtdC5leHByZXNzaW9uLnZhbHVlID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbJygnLCByZXN1bHQsICcpJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuc2VtaWNvbG9uKGZsYWdzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEltcG9ydERlY2xhcmF0aW9uOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIC8vIEVTNjogMTUuMi4xIHZhbGlkIGltcG9ydCBkZWNsYXJhdGlvbnM6XG4gICAgICAgICAgICAvLyAgICAgLSBpbXBvcnQgSW1wb3J0Q2xhdXNlIEZyb21DbGF1c2UgO1xuICAgICAgICAgICAgLy8gICAgIC0gaW1wb3J0IE1vZHVsZVNwZWNpZmllciA7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBjdXJzb3IsIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyBJZiBubyBJbXBvcnRDbGF1c2UgaXMgcHJlc2VudCxcbiAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIGJlIGBpbXBvcnQgTW9kdWxlU3BlY2lmaWVyYCBzbyBza2lwIGBmcm9tYFxuICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyIGlzIFN0cmluZ0xpdGVyYWwuXG4gICAgICAgICAgICBpZiAoc3RtdC5zcGVjaWZpZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGltcG9ydCBNb2R1bGVTcGVjaWZpZXIgO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICdpbXBvcnQnLFxuICAgICAgICAgICAgICAgICAgICBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc291cmNlLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VtaWNvbG9uKGZsYWdzKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGltcG9ydCBJbXBvcnRDbGF1c2UgRnJvbUNsYXVzZSA7XG4gICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgJ2ltcG9ydCdcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBjdXJzb3IgPSAwO1xuXG4gICAgICAgICAgICAvLyBJbXBvcnRlZEJpbmRpbmdcbiAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnNbY3Vyc29yXS50eXBlID09PSBTeW50YXguSW1wb3J0RGVmYXVsdFNwZWNpZmllcikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbY3Vyc29yXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgKytjdXJzb3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnNbY3Vyc29yXSkge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5zcGVjaWZpZXJzW2N1cnNvcl0udHlwZSA9PT0gU3ludGF4LkltcG9ydE5hbWVzcGFjZVNwZWNpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBOYW1lU3BhY2VJbXBvcnRcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbY3Vyc29yXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5hbWVkSW1wb3J0c1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSArICd7Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChzdG10LnNwZWNpZmllcnMubGVuZ3RoIC0gY3Vyc29yKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0IHsgLi4uIH0gZnJvbSBcIi4uLlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zcGVjaWZpZXJzW2N1cnNvcl0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSArICd9JyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcG9ydCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAuLi4sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAuLi4sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGZyb20gXCIuLi5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKGluZGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBpejtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBjdXJzb3IsIGl6ID0gc3RtdC5zcGVjaWZpZXJzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zcGVjaWZpZXJzW2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgbmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJhc2UgKyAnfScgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbXG4gICAgICAgICAgICAgICAgJ2Zyb20nICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zb3VyY2UsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbWljb2xvbihmbGFncylcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3I6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIGl0ZW1GbGFncyA9IChmbGFncyAmIEZfQUxMT1dfSU4pID8gRV9UVFQgOiBFX0ZUVDtcbiAgICAgICAgICAgIGlmIChzdG10LmluaXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmlkLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGl0ZW1GbGFncyksXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAnPScsXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmluaXQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgaXRlbUZsYWdzKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVBhdHRlcm4oc3RtdC5pZCwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBpdGVtRmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgLy8gVmFyaWFibGVEZWNsYXJhdG9yIGlzIHR5cGVkIGFzIFN0YXRlbWVudCxcbiAgICAgICAgICAgIC8vIGJ1dCBqb2luZWQgd2l0aCBjb21tYSAobm90IExpbmVUZXJtaW5hdG9yKS5cbiAgICAgICAgICAgIC8vIFNvIGlmIGNvbW1lbnQgaXMgYXR0YWNoZWQgdG8gdGFyZ2V0IG5vZGUsIHdlIHNob3VsZCBzcGVjaWFsaXplLlxuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXosIG5vZGUsIGJvZHlGbGFncywgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IFsgc3RtdC5raW5kIF07XG5cbiAgICAgICAgICAgIGJvZHlGbGFncyA9IChmbGFncyAmIEZfQUxMT1dfSU4pID8gU19URkZGIDogU19GRkZGO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBibG9jaygpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gc3RtdC5kZWNsYXJhdGlvbnNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnQgJiYgbm9kZS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJ1xcbicpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChhZGRJbmRlbnQodGhhdC5nZW5lcmF0ZVN0YXRlbWVudChub2RlLCBib2R5RmxhZ3MpKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9FbXB0eVNwYWNlKCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KG5vZGUsIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDEsIGl6ID0gc3RtdC5kZWNsYXJhdGlvbnMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gc3RtdC5kZWNsYXJhdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHRyYS5jb21tZW50ICYmIG5vZGUubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KG5vZGUsIGJvZHlGbGFncykpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQobm9kZSwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdG10LmRlY2xhcmF0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgd2l0aEluZGVudChibG9jayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJsb2NrKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuc2VtaWNvbG9uKGZsYWdzKSk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVGhyb3dTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIFtqb2luKFxuICAgICAgICAgICAgICAgICd0aHJvdycsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5hcmd1bWVudCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXG4gICAgICAgICAgICApLCB0aGlzLnNlbWljb2xvbihmbGFncyldO1xuICAgICAgICB9LFxuXG4gICAgICAgIFRyeVN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpeiwgZ3VhcmRlZEhhbmRsZXJzO1xuXG4gICAgICAgICAgICByZXN1bHQgPSBbJ3RyeScsIHRoaXMubWF5YmVCbG9jayhzdG10LmJsb2NrLCBTX1RGRkYpXTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChzdG10LmJsb2NrLCByZXN1bHQpO1xuXG4gICAgICAgICAgICBpZiAoc3RtdC5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgIC8vIG9sZCBpbnRlcmZhY2VcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0bXQuaGFuZGxlcnMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmhhbmRsZXJzW2ldLCBTX1RGRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuZmluYWxpemVyIHx8IGkgKyAxICE9PSBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KHN0bXQuaGFuZGxlcnNbaV0uYm9keSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ3VhcmRlZEhhbmRsZXJzID0gc3RtdC5ndWFyZGVkSGFuZGxlcnMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGd1YXJkZWRIYW5kbGVycy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KGd1YXJkZWRIYW5kbGVyc1tpXSwgU19URkZGKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmZpbmFsaXplciB8fCBpICsgMSAhPT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChndWFyZGVkSGFuZGxlcnNbaV0uYm9keSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIG5ldyBpbnRlcmZhY2VcbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5oYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0bXQuaGFuZGxlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5oYW5kbGVyLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmhhbmRsZXJbaV0sIFNfVEZGRikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmZpbmFsaXplciB8fCBpICsgMSAhPT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KHN0bXQuaGFuZGxlcltpXS5ib2R5LCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuaGFuZGxlciwgU19URkZGKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RtdC5maW5hbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1heWJlQmxvY2tTdWZmaXgoc3RtdC5oYW5kbGVyLmJvZHksIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RtdC5maW5hbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgWydmaW5hbGx5JywgdGhpcy5tYXliZUJsb2NrKHN0bXQuZmluYWxpemVyLCBTX1RGRkYpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFN3aXRjaFN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBmcmFnbWVudCwgaSwgaXosIGJvZHlGbGFncywgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICdzd2l0Y2gnICsgc3BhY2UgKyAnKCcsXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuZGlzY3JpbWluYW50LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgICcpJyArIHNwYWNlICsgJ3snICsgbmV3bGluZVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChzdG10LmNhc2VzKSB7XG4gICAgICAgICAgICAgICAgYm9keUZsYWdzID0gU19URkZGO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5jYXNlcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBpeiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlGbGFncyB8PSBGX1NFTUlDT0xPTl9PUFQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBhZGRJbmRlbnQodGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmNhc2VzW2ldLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KCd9JykpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBTd2l0Y2hDYXNlOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50LCBpLCBpeiwgYm9keUZsYWdzLCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChzdG10LnRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgam9pbignY2FzZScsIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQudGVzdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICc6J1xuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsnZGVmYXVsdDonXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgICAgICBpeiA9IHN0bXQuY29uc2VxdWVudC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGl6ICYmIHN0bXQuY29uc2VxdWVudFswXS50eXBlID09PSBTeW50YXguQmxvY2tTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGF0Lm1heWJlQmxvY2soc3RtdC5jb25zZXF1ZW50WzBdLCBTX1RGRkYpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGkgPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpICE9PSBpeiAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYm9keUZsYWdzID0gU19URkZGO1xuICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXogLSAxICYmIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5RmxhZ3MgfD0gRl9TRU1JQ09MT05fT1BUO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gYWRkSW5kZW50KHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5jb25zZXF1ZW50W2ldLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgIT09IGl6ICYmICFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoZnJhZ21lbnQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBJZlN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBib2R5RmxhZ3MsIHNlbWljb2xvbk9wdGlvbmFsLCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ2lmJyArIHNwYWNlICsgJygnLFxuICAgICAgICAgICAgICAgICAgICB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnRlc3QsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VtaWNvbG9uT3B0aW9uYWwgPSBmbGFncyAmIEZfU0VNSUNPTE9OX09QVDtcbiAgICAgICAgICAgIGJvZHlGbGFncyA9IFNfVEZGRjtcbiAgICAgICAgICAgIGlmIChzZW1pY29sb25PcHRpb25hbCkge1xuICAgICAgICAgICAgICAgIGJvZHlGbGFncyB8PSBGX1NFTUlDT0xPTl9PUFQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RtdC5hbHRlcm5hdGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5jb25zZXF1ZW50LCBTX1RGRkYpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1heWJlQmxvY2tTdWZmaXgoc3RtdC5jb25zZXF1ZW50LCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmIChzdG10LmFsdGVybmF0ZS50eXBlID09PSBTeW50YXguSWZTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFsnZWxzZSAnLCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuYWx0ZXJuYXRlLCBib2R5RmxhZ3MpXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGpvaW4oJ2Vsc2UnLCB0aGlzLm1heWJlQmxvY2soc3RtdC5hbHRlcm5hdGUsIGJvZHlGbGFncykpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmNvbnNlcXVlbnQsIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBGb3JTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ2ZvcicgKyBzcGFjZSArICcoJ107XG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuaW5pdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RtdC5pbml0LnR5cGUgPT09IFN5bnRheC5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuaW5pdCwgU19GRkZGKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGX0FMTE9XX0lOIGJlY29tZXMgZmFsc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmluaXQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfRlRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnOycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzsnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RtdC50ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC50ZXN0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnOycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc7Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQudXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC51cGRhdGUsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcpJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJyknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKHN0bXQuYm9keSwgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQgPyBTX1RGRlQgOiBTX1RGRkYpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRm9ySW5TdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJdGVyYXRpb25Gb3JTdGF0ZW1lbnQoJ2luJywgc3RtdCwgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQgPyBTX1RGRlQgOiBTX1RGRkYpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEZvck9mU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlSXRlcmF0aW9uRm9yU3RhdGVtZW50KCdvZicsIHN0bXQsIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUID8gU19URkZUIDogU19URkZGKTtcbiAgICAgICAgfSxcblxuICAgICAgICBMYWJlbGVkU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBbc3RtdC5sYWJlbC5uYW1lICsgJzonLCB0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCA/IFNfVEZGVCA6IFNfVEZGRildO1xuICAgICAgICB9LFxuXG4gICAgICAgIFByb2dyYW06IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQsIGksIGl6LCBib2R5RmxhZ3M7XG4gICAgICAgICAgICBpeiA9IHN0bXQuYm9keS5sZW5ndGg7XG4gICAgICAgICAgICByZXN1bHQgPSBbc2FmZUNvbmNhdGVuYXRpb24gJiYgaXogPiAwID8gJ1xcbicgOiAnJ107XG4gICAgICAgICAgICBib2R5RmxhZ3MgPSBTX1RGVEY7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmICghc2FmZUNvbmNhdGVuYXRpb24gJiYgaSA9PT0gaXogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHlGbGFncyB8PSBGX1NFTUlDT0xPTl9PUFQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgc3BhY2VzIGJlZm9yZSB0aGUgZmlyc3QgbGluZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbMF0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQucmFuZ2VbMF0sIHN0bXQuYm9keVtpXS5yYW5nZVswXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYmV0d2VlbiBsaW5lc1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RtdC5ib2R5W2kgLSAxXS50cmFpbGluZ0NvbW1lbnRzICYmICFzdG10LmJvZHlbaV0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQuYm9keVtpIC0gMV0ucmFuZ2VbMV0sIHN0bXQuYm9keVtpXS5yYW5nZVswXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gYWRkSW5kZW50KHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5ib2R5W2ldLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXogJiYgIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaSArIDFdLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYWZ0ZXIgdGhlIGxhc3QgbGluZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpXS50cmFpbGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQuYm9keVtpXS5yYW5nZVsxXSwgc3RtdC5yYW5nZVsxXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRnVuY3Rpb25EZWNsYXJhdGlvbjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXN5bmNQcmVmaXgoc3RtdCwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZVN0YXJTdWZmaXgoc3RtdCkgfHwgbm9FbXB0eVNwYWNlKCksXG4gICAgICAgICAgICAgICAgc3RtdC5pZCA/IGdlbmVyYXRlSWRlbnRpZmllcihzdG10LmlkKSA6ICcnLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoc3RtdClcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgUmV0dXJuU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChzdG10LmFyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtqb2luKFxuICAgICAgICAgICAgICAgICAgICAncmV0dXJuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5hcmd1bWVudCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXG4gICAgICAgICAgICAgICAgKSwgdGhpcy5zZW1pY29sb24oZmxhZ3MpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbJ3JldHVybicgKyB0aGlzLnNlbWljb2xvbihmbGFncyldO1xuICAgICAgICB9LFxuXG4gICAgICAgIFdoaWxlU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAnd2hpbGUnICsgc3BhY2UgKyAnKCcsXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQudGVzdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCA/IFNfVEZGVCA6IFNfVEZGRikpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBXaXRoU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAnd2l0aCcgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5vYmplY3QsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKHN0bXQuYm9keSwgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQgPyBTX1RGRlQgOiBTX1RGRkYpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBtZXJnZShDb2RlR2VuZXJhdG9yLnByb3RvdHlwZSwgQ29kZUdlbmVyYXRvci5TdGF0ZW1lbnQpO1xuXG4gICAgLy8gRXhwcmVzc2lvbnMuXG5cbiAgICBDb2RlR2VuZXJhdG9yLkV4cHJlc3Npb24gPSB7XG5cbiAgICAgICAgU2VxdWVuY2VFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGksIGl6O1xuICAgICAgICAgICAgaWYgKFByZWNlZGVuY2UuU2VxdWVuY2UgPCBwcmVjZWRlbmNlKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRl9BTExPV19JTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLmV4cHJlc3Npb25zLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmV4cHJlc3Npb25zW2ldLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGZsYWdzKSk7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUFzc2lnbm1lbnQoZXhwci5sZWZ0LCBleHByLnJpZ2h0LCBleHByLm9wZXJhdG9yLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZSh0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIpLCBQcmVjZWRlbmNlLkFycm93RnVuY3Rpb24sIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoUHJlY2VkZW5jZS5Db25kaXRpb25hbCA8IHByZWNlZGVuY2UpIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSBGX0FMTE9XX0lOO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIudGVzdCwgUHJlY2VkZW5jZS5Db2FsZXNjZSwgZmxhZ3MpLFxuICAgICAgICAgICAgICAgICAgICBzcGFjZSArICc/JyArIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmNvbnNlcXVlbnQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgZmxhZ3MpLFxuICAgICAgICAgICAgICAgICAgICBzcGFjZSArICc6JyArIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmFsdGVybmF0ZSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBmbGFncylcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIFByZWNlZGVuY2UuQ29uZGl0aW9uYWwsXG4gICAgICAgICAgICAgICAgcHJlY2VkZW5jZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcblxuICAgICAgICBMb2dpY2FsRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoZXhwci5vcGVyYXRvciA9PT0gJz8/Jykge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZfRk9VTkRfQ09BTEVTQ0U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5CaW5hcnlFeHByZXNzaW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBCaW5hcnlFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGxlZnRQcmVjZWRlbmNlLCByaWdodFByZWNlZGVuY2UsIGN1cnJlbnRQcmVjZWRlbmNlLCBmcmFnbWVudCwgbGVmdFNvdXJjZTtcbiAgICAgICAgICAgIGN1cnJlbnRQcmVjZWRlbmNlID0gQmluYXJ5UHJlY2VkZW5jZVtleHByLm9wZXJhdG9yXTtcbiAgICAgICAgICAgIGxlZnRQcmVjZWRlbmNlID0gZXhwci5vcGVyYXRvciA9PT0gJyoqJyA/IFByZWNlZGVuY2UuUG9zdGZpeCA6IGN1cnJlbnRQcmVjZWRlbmNlO1xuICAgICAgICAgICAgcmlnaHRQcmVjZWRlbmNlID0gZXhwci5vcGVyYXRvciA9PT0gJyoqJyA/IGN1cnJlbnRQcmVjZWRlbmNlIDogY3VycmVudFByZWNlZGVuY2UgKyAxO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFByZWNlZGVuY2UgPCBwcmVjZWRlbmNlKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRl9BTExPV19JTjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmxlZnQsIGxlZnRQcmVjZWRlbmNlLCBmbGFncyk7XG5cbiAgICAgICAgICAgIGxlZnRTb3VyY2UgPSBmcmFnbWVudC50b1N0cmluZygpO1xuXG4gICAgICAgICAgICBpZiAobGVmdFNvdXJjZS5jaGFyQ29kZUF0KGxlZnRTb3VyY2UubGVuZ3RoIC0gMSkgPT09IDB4MkYgLyogLyAqLyAmJiBlc3V0aWxzLmNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShleHByLm9wZXJhdG9yLmNoYXJDb2RlQXQoMCkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW2ZyYWdtZW50LCBub0VtcHR5U3BhY2UoKSwgZXhwci5vcGVyYXRvcl07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4oZnJhZ21lbnQsIGV4cHIub3BlcmF0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucmlnaHQsIHJpZ2h0UHJlY2VkZW5jZSwgZmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoZXhwci5vcGVyYXRvciA9PT0gJy8nICYmIGZyYWdtZW50LnRvU3RyaW5nKCkuY2hhckF0KDApID09PSAnLycgfHxcbiAgICAgICAgICAgIGV4cHIub3BlcmF0b3Iuc2xpY2UoLTEpID09PSAnPCcgJiYgZnJhZ21lbnQudG9TdHJpbmcoKS5zbGljZSgwLCAzKSA9PT0gJyEtLScpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiAnLycgY29uY2F0cyB3aXRoICcvJyBvciBgPGAgY29uY2F0cyB3aXRoIGAhLS1gLCBpdCBpcyBpbnRlcnByZXRlZCBhcyBjb21tZW50IHN0YXJ0XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9FbXB0eVNwYWNlKCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGZyYWdtZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIub3BlcmF0b3IgPT09ICdpbicgJiYgIShmbGFncyAmIEZfQUxMT1dfSU4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnKCcsIHJlc3VsdCwgJyknXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZXhwci5vcGVyYXRvciA9PT0gJ3x8JyB8fCBleHByLm9wZXJhdG9yID09PSAnJiYnKSAmJiAoZmxhZ3MgJiBGX0ZPVU5EX0NPQUxFU0NFKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbJygnLCByZXN1bHQsICcpJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgY3VycmVudFByZWNlZGVuY2UsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIENhbGxFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGksIGl6O1xuXG4gICAgICAgICAgICAvLyBGX0FMTE9XX1VOUEFSQVRIX05FVyBiZWNvbWVzIGZhbHNlLlxuICAgICAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuY2FsbGVlLCBQcmVjZWRlbmNlLkNhbGwsIEVfVFRGKV07XG5cbiAgICAgICAgICAgIGlmIChleHByLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJz8uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcoJyk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHJbJ2FyZ3VtZW50cyddLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByWydhcmd1bWVudHMnXVtpXSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnKScpO1xuXG4gICAgICAgICAgICBpZiAoIShmbGFncyAmIEZfQUxMT1dfQ0FMTCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWycoJywgcmVzdWx0LCAnKSddO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5DYWxsLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDaGFpbkV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgaWYgKFByZWNlZGVuY2UuT3B0aW9uYWxDaGFpbmluZyA8IHByZWNlZGVuY2UpIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSBGX0FMTE9XX0NBTEw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmV4cHJlc3Npb24sIFByZWNlZGVuY2UuT3B0aW9uYWxDaGFpbmluZywgZmxhZ3MpO1xuXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5PcHRpb25hbENoYWluaW5nLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBOZXdFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGxlbmd0aCwgaSwgaXosIGl0ZW1GbGFncztcbiAgICAgICAgICAgIGxlbmd0aCA9IGV4cHJbJ2FyZ3VtZW50cyddLmxlbmd0aDtcblxuICAgICAgICAgICAgLy8gRl9BTExPV19DQUxMIGJlY29tZXMgZmFsc2UuXG4gICAgICAgICAgICAvLyBGX0FMTE9XX1VOUEFSQVRIX05FVyBtYXkgYmVjb21lIGZhbHNlLlxuICAgICAgICAgICAgaXRlbUZsYWdzID0gKGZsYWdzICYgRl9BTExPV19VTlBBUkFUSF9ORVcgJiYgIXBhcmVudGhlc2VzICYmIGxlbmd0aCA9PT0gMCkgPyBFX1RGVCA6IEVfVEZGO1xuXG4gICAgICAgICAgICByZXN1bHQgPSBqb2luKFxuICAgICAgICAgICAgICAgICduZXcnLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuY2FsbGVlLCBQcmVjZWRlbmNlLk5ldywgaXRlbUZsYWdzKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBGX0FMTE9XX1VOUEFSQVRIX05FVykgfHwgcGFyZW50aGVzZXMgfHwgbGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcoJyk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBsZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHJbJ2FyZ3VtZW50cyddW2ldLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJyknKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuTmV3LCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBNZW1iZXJFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50O1xuXG4gICAgICAgICAgICAvLyBGX0FMTE9XX1VOUEFSQVRIX05FVyBiZWNvbWVzIGZhbHNlLlxuICAgICAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIub2JqZWN0LCBQcmVjZWRlbmNlLkNhbGwsIChmbGFncyAmIEZfQUxMT1dfQ0FMTCkgPyBFX1RURiA6IEVfVEZGKV07XG5cbiAgICAgICAgICAgIGlmIChleHByLmNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cHIub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJz8uJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJ1snKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnByb3BlcnR5LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBmbGFncyAmIEZfQUxMT1dfQ0FMTCA/IEVfVFRUIDogRV9URlQpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnXScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4cHIub3B0aW9uYWwgJiYgZXhwci5vYmplY3QudHlwZSA9PT0gU3ludGF4LkxpdGVyYWwgJiYgdHlwZW9mIGV4cHIub2JqZWN0LnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWxsIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgMS4gTm8gZmxvYXRpbmcgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gICAyLiBEb24ndCBoYXZlIGV4cG9uZW50c1xuICAgICAgICAgICAgICAgICAgICAvLyAgIDMuIFRoZSBsYXN0IGNoYXJhY3RlciBpcyBhIGRlY2ltYWwgZGlnaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gICA0LiBOb3QgaGV4YWRlY2ltYWwgT1Igb2N0YWwgbnVtYmVyIGxpdGVyYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGFkZCBhIGZsb2F0aW5nIHBvaW50LlxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQuaW5kZXhPZignLicpIDwgMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEvW2VFeFhdLy50ZXN0KGZyYWdtZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdXRpbHMuY29kZS5pc0RlY2ltYWxEaWdpdChmcmFnbWVudC5jaGFyQ29kZUF0KGZyYWdtZW50Lmxlbmd0aCAtIDEpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoZnJhZ21lbnQubGVuZ3RoID49IDIgJiYgZnJhZ21lbnQuY2hhckNvZGVBdCgwKSA9PT0gNDgpICAvLyAnMCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcgJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZXhwci5vcHRpb25hbCA/ICc/LicgOiAnLicpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlSWRlbnRpZmllcihleHByLnByb3BlcnR5KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLk1lbWJlciwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgTWV0YVByb3BlcnR5OiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHR5cGVvZiBleHByLm1ldGEgPT09IFwic3RyaW5nXCIgPyBleHByLm1ldGEgOiBnZW5lcmF0ZUlkZW50aWZpZXIoZXhwci5tZXRhKSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnLicpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godHlwZW9mIGV4cHIucHJvcGVydHkgPT09IFwic3RyaW5nXCIgPyBleHByLnByb3BlcnR5IDogZ2VuZXJhdGVJZGVudGlmaWVyKGV4cHIucHJvcGVydHkpKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLk1lbWJlciwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVW5hcnlFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50LCByaWdodENoYXJDb2RlLCBsZWZ0U291cmNlLCBsZWZ0Q2hhckNvZGU7XG4gICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYXJndW1lbnQsIFByZWNlZGVuY2UuVW5hcnksIEVfVFRUKTtcblxuICAgICAgICAgICAgaWYgKHNwYWNlID09PSAnJykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4oZXhwci5vcGVyYXRvciwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbZXhwci5vcGVyYXRvcl07XG4gICAgICAgICAgICAgICAgaWYgKGV4cHIub3BlcmF0b3IubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUsIHZvaWQsIHR5cGVvZlxuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYHR5cGVvZiBbXWAsIG5vdCBgdHlwZW9mW11gXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCBpbnNlcnRpbmcgc3BhY2VzIGJldHdlZW4gb3BlcmF0b3IgYW5kIGFyZ3VtZW50IGlmIGl0IGlzIHVubmVjZXNzYXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGxpa2UsIGAhY29uZGBcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNvdXJjZSA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBsZWZ0Q2hhckNvZGUgPSBsZWZ0U291cmNlLmNoYXJDb2RlQXQobGVmdFNvdXJjZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRDaGFyQ29kZSA9IGZyYWdtZW50LnRvU3RyaW5nKCkuY2hhckNvZGVBdCgwKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKChsZWZ0Q2hhckNvZGUgPT09IDB4MkIgIC8qICsgKi8gfHwgbGVmdENoYXJDb2RlID09PSAweDJEICAvKiAtICovKSAmJiBsZWZ0Q2hhckNvZGUgPT09IHJpZ2h0Q2hhckNvZGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVzdXRpbHMuY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1KGxlZnRDaGFyQ29kZSkgJiYgZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUocmlnaHRDaGFyQ29kZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub0VtcHR5U3BhY2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5VbmFyeSwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgWWllbGRFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZXhwci5kZWxlZ2F0ZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICd5aWVsZConO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAneWllbGQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHIuYXJndW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYXJndW1lbnQsIFByZWNlZGVuY2UuWWllbGQsIEVfVFRUKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5ZaWVsZCwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXdhaXRFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBqb2luKFxuICAgICAgICAgICAgICAgIGV4cHIuYWxsID8gJ2F3YWl0KicgOiAnYXdhaXQnLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYXJndW1lbnQsIFByZWNlZGVuY2UuQXdhaXQsIEVfVFRUKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLkF3YWl0LCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBVcGRhdGVFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChleHByLnByZWZpeCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUoXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIub3BlcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmFyZ3VtZW50LCBQcmVjZWRlbmNlLlVuYXJ5LCBFX1RUVClcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgUHJlY2VkZW5jZS5VbmFyeSxcbiAgICAgICAgICAgICAgICAgICAgcHJlY2VkZW5jZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5hcmd1bWVudCwgUHJlY2VkZW5jZS5Qb3N0Zml4LCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgIGV4cHIub3BlcmF0b3JcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIFByZWNlZGVuY2UuUG9zdGZpeCxcbiAgICAgICAgICAgICAgICBwcmVjZWRlbmNlXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXN5bmNQcmVmaXgoZXhwciwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChleHByLmlkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVTdGFyU3VmZml4KGV4cHIpIHx8IG5vRW1wdHlTcGFjZSgpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUlkZW50aWZpZXIoZXhwci5pZCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZVN0YXJTdWZmaXgoZXhwcikgfHwgc3BhY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUZ1bmN0aW9uQm9keShleHByKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEFycmF5UGF0dGVybjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5BcnJheUV4cHJlc3Npb24oZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MsIHRydWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEFycmF5RXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzLCBpc1BhdHRlcm4pIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIG11bHRpbGluZSwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICBpZiAoIWV4cHIuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbXSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtdWx0aWxpbmUgPSBpc1BhdHRlcm4gPyBmYWxzZSA6IGV4cHIuZWxlbWVudHMubGVuZ3RoID4gMTtcbiAgICAgICAgICAgIHJlc3VsdCA9IFsnWycsIG11bHRpbGluZSA/IG5ld2xpbmUgOiAnJ107XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uIChpbmRlbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSwgaXo7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLmVsZW1lbnRzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleHByLmVsZW1lbnRzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobXVsdGlsaW5lID8gaW5kZW50IDogJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5lbGVtZW50c1tpXSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyAobXVsdGlsaW5lID8gbmV3bGluZSA6IHNwYWNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChtdWx0aWxpbmUgJiYgIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChtdWx0aWxpbmUgPyBiYXNlIDogJycpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ10nKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgUmVzdEVsZW1lbnQ6IGZ1bmN0aW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gJy4uLicgKyB0aGlzLmdlbmVyYXRlUGF0dGVybihleHByLmFyZ3VtZW50KTtcbiAgICAgICAgfSxcblxuICAgICAgICBDbGFzc0V4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQ7XG4gICAgICAgICAgICByZXN1bHQgPSBbJ2NsYXNzJ107XG4gICAgICAgICAgICBpZiAoZXhwci5pZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmlkLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHIuc3VwZXJDbGFzcykge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gam9pbignZXh0ZW5kcycsIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuc3VwZXJDbGFzcywgUHJlY2VkZW5jZS5VbmFyeSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZVN0YXRlbWVudChleHByLmJvZHksIFNfVEZGVCkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBNZXRob2REZWZpbml0aW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50O1xuICAgICAgICAgICAgaWYgKGV4cHJbJ3N0YXRpYyddKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gWydzdGF0aWMnICsgc3BhY2VdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHByLmtpbmQgPT09ICdnZXQnIHx8IGV4cHIua2luZCA9PT0gJ3NldCcpIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IFtcbiAgICAgICAgICAgICAgICAgICAgam9pbihleHByLmtpbmQsIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCkpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIudmFsdWUpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBbXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlTWV0aG9kUHJlZml4KGV4cHIpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvcGVydHlLZXkoZXhwci5rZXksIGV4cHIuY29tcHV0ZWQpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIudmFsdWUpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFByb3BlcnR5OiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChleHByLmtpbmQgPT09ICdnZXQnIHx8IGV4cHIua2luZCA9PT0gJ3NldCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICBleHByLmtpbmQsIG5vRW1wdHlTcGFjZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvcGVydHlLZXkoZXhwci5rZXksIGV4cHIuY29tcHV0ZWQpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIudmFsdWUpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIuc2hvcnRoYW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cHIudmFsdWUudHlwZSA9PT0gXCJBc3NpZ25tZW50UGF0dGVyblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkFzc2lnbm1lbnRQYXR0ZXJuKGV4cHIudmFsdWUsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleHByLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlTWV0aG9kUHJlZml4KGV4cHIpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvcGVydHlLZXkoZXhwci5rZXksIGV4cHIuY29tcHV0ZWQpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIudmFsdWUpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvcGVydHlLZXkoZXhwci5rZXksIGV4cHIuY29tcHV0ZWQpLFxuICAgICAgICAgICAgICAgICc6JyArIHNwYWNlLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIudmFsdWUsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9LFxuXG4gICAgICAgIE9iamVjdEV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIG11bHRpbGluZSwgcmVzdWx0LCBmcmFnbWVudCwgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgICAgIGlmICghZXhwci5wcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAne30nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbXVsdGlsaW5lID0gZXhwci5wcm9wZXJ0aWVzLmxlbmd0aCA+IDE7XG5cbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5wcm9wZXJ0aWVzWzBdLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFtdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBpc3N1ZXMgNFxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCB0cmFuc2Zvcm0gZnJvbVxuICAgICAgICAgICAgICAgIC8vICAgZGVqYXZ1LkNsYXNzLmRlY2xhcmUoe1xuICAgICAgICAgICAgICAgIC8vICAgICAgIG1ldGhvZDI6IGZ1bmN0aW9uICgpIHt9XG4gICAgICAgICAgICAgICAgLy8gICB9KTtcbiAgICAgICAgICAgICAgICAvLyB0b1xuICAgICAgICAgICAgICAgIC8vICAgZGVqYXZ1LkNsYXNzLmRlY2xhcmUoe21ldGhvZDI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICB9fSk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGZyYWdtZW50KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyAneycsIHNwYWNlLCBmcmFnbWVudCwgc3BhY2UsICd9JyBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsgJ3snLCBuZXdsaW5lLCBpbmRlbnQsIGZyYWdtZW50IF07XG5cbiAgICAgICAgICAgICAgICBpZiAobXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAxLCBpeiA9IGV4cHIucHJvcGVydGllcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5wcm9wZXJ0aWVzW2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChiYXNlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCd9Jyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEFzc2lnbm1lbnRQYXR0ZXJuOiBmdW5jdGlvbihleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVBc3NpZ25tZW50KGV4cHIubGVmdCwgZXhwci5yaWdodCwgJz0nLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgT2JqZWN0UGF0dGVybjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpeiwgbXVsdGlsaW5lLCBwcm9wZXJ0eSwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICBpZiAoIWV4cHIucHJvcGVydGllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3t9JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbXVsdGlsaW5lID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZXhwci5wcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gZXhwci5wcm9wZXJ0aWVzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkudHlwZSA9PT0gU3ludGF4LlByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICYmIHByb3BlcnR5LnZhbHVlLnR5cGUgIT09IFN5bnRheC5JZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpbGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHIucHJvcGVydGllcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gZXhwci5wcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS50eXBlID09PSBTeW50YXguUHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICYmICFwcm9wZXJ0eS5zaG9ydGhhbmRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgPSBbJ3snLCBtdWx0aWxpbmUgPyBuZXdsaW5lIDogJycgXTtcblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZXhwci5wcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobXVsdGlsaW5lID8gaW5kZW50IDogJycpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnByb3BlcnRpZXNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyAobXVsdGlsaW5lID8gbmV3bGluZSA6IHNwYWNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG11bHRpbGluZSAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG11bHRpbGluZSA/IGJhc2UgOiAnJyk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnfScpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBUaGlzRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3RoaXMnO1xuICAgICAgICB9LFxuXG4gICAgICAgIFN1cGVyOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiAnc3VwZXInO1xuICAgICAgICB9LFxuXG4gICAgICAgIElkZW50aWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlSWRlbnRpZmllcihleHByKTtcbiAgICAgICAgfSxcblxuICAgICAgICBJbXBvcnREZWZhdWx0U3BlY2lmaWVyOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUlkZW50aWZpZXIoZXhwci5pZCB8fCBleHByLmxvY2FsKTtcbiAgICAgICAgfSxcblxuICAgICAgICBJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsnKiddO1xuICAgICAgICAgICAgdmFyIGlkID0gZXhwci5pZCB8fCBleHByLmxvY2FsO1xuICAgICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UgKyAnYXMnICsgbm9FbXB0eVNwYWNlKCkgKyBnZW5lcmF0ZUlkZW50aWZpZXIoaWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgSW1wb3J0U3BlY2lmaWVyOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciBpbXBvcnRlZCA9IGV4cHIuaW1wb3J0ZWQ7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gWyBpbXBvcnRlZC5uYW1lIF07XG4gICAgICAgICAgICB2YXIgbG9jYWwgPSBleHByLmxvY2FsO1xuICAgICAgICAgICAgaWYgKGxvY2FsICYmIGxvY2FsLm5hbWUgIT09IGltcG9ydGVkLm5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub0VtcHR5U3BhY2UoKSArICdhcycgKyBub0VtcHR5U3BhY2UoKSArIGdlbmVyYXRlSWRlbnRpZmllcihsb2NhbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBFeHBvcnRTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIGxvY2FsID0gZXhwci5sb2NhbDtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbIGxvY2FsLm5hbWUgXTtcbiAgICAgICAgICAgIHZhciBleHBvcnRlZCA9IGV4cHIuZXhwb3J0ZWQ7XG4gICAgICAgICAgICBpZiAoZXhwb3J0ZWQgJiYgZXhwb3J0ZWQubmFtZSAhPT0gbG9jYWwubmFtZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vRW1wdHlTcGFjZSgpICsgJ2FzJyArIG5vRW1wdHlTcGFjZSgpICsgZ2VuZXJhdGVJZGVudGlmaWVyKGV4cG9ydGVkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIExpdGVyYWw6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJhdztcbiAgICAgICAgICAgIGlmIChleHByLmhhc093blByb3BlcnR5KCdyYXcnKSAmJiBwYXJzZSAmJiBleHRyYS5yYXcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByYXcgPSBwYXJzZShleHByLnJhdykuYm9keVswXS5leHByZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmF3LnR5cGUgPT09IFN5bnRheC5MaXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3LnZhbHVlID09PSBleHByLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cHIucmF3O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBub3QgdXNlIHJhdyBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIucmVnZXgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICcvJyArIGV4cHIucmVnZXgucGF0dGVybiArICcvJyArIGV4cHIucmVnZXguZmxhZ3M7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwci52YWx1ZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwci52YWx1ZS50b1N0cmluZygpICsgJ24nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBgZXhwci52YWx1ZWAgY2FuIGJlIG51bGwgaWYgYGV4cHIuYmlnaW50YCBleGlzdHMuIFdlIG5lZWQgdG8gY2hlY2tcbiAgICAgICAgICAgIC8vIGBleHByLmJpZ2ludGAgZmlyc3QuXG4gICAgICAgICAgICBpZiAoZXhwci5iaWdpbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwci5iaWdpbnQgKyAnbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleHByLnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHByLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVTdHJpbmcoZXhwci52YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwci52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVOdW1iZXIoZXhwci52YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwci52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cHIudmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVSZWdFeHAoZXhwci52YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgR2VuZXJhdG9yRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5Db21wcmVoZW5zaW9uRXhwcmVzc2lvbihleHByLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ29tcHJlaGVuc2lvbkV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgLy8gR2VuZXJhdG9yRXhwcmVzc2lvbiBzaG91bGQgYmUgcGFyZW50aGVzaXplZCB3aXRoICguLi4pLCBDb21wcmVoZW5zaW9uRXhwcmVzc2lvbiB3aXRoIFsuLi5dXG4gICAgICAgICAgICAvLyBEdWUgdG8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODgzNDY4IHBvc2l0aW9uIG9mIGV4cHIuYm9keSBjYW4gZGlmZmVyIGluIFNwaWRlcm1vbmtleSBhbmQgRVM2XG5cbiAgICAgICAgICAgIHZhciByZXN1bHQsIGksIGl6LCBmcmFnbWVudCwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXN1bHQgPSAoZXhwci50eXBlID09PSBTeW50YXguR2VuZXJhdG9yRXhwcmVzc2lvbikgPyBbJygnXSA6IFsnWyddO1xuXG4gICAgICAgICAgICBpZiAoZXh0cmEubW96LmNvbXByZWhlbnNpb25FeHByZXNzaW9uU3RhcnRzV2l0aEFzc2lnbm1lbnQpIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYm9keSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLmJsb2Nrcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYmxvY2tzW2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDAgfHwgZXh0cmEubW96LmNvbXByZWhlbnNpb25FeHByZXNzaW9uU3RhcnRzV2l0aEFzc2lnbm1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIuZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsICdpZicgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmZpbHRlciwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbICcoJywgZnJhZ21lbnQsICcpJyBdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFleHRyYS5tb3ouY29tcHJlaGVuc2lvbkV4cHJlc3Npb25TdGFydHNXaXRoQXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5ib2R5LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKTtcblxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChleHByLnR5cGUgPT09IFN5bnRheC5HZW5lcmF0b3JFeHByZXNzaW9uKSA/ICcpJyA6ICddJyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIENvbXByZWhlbnNpb25CbG9jazogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgZnJhZ21lbnQ7XG4gICAgICAgICAgICBpZiAoZXhwci5sZWZ0LnR5cGUgPT09IFN5bnRheC5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBbXG4gICAgICAgICAgICAgICAgICAgIGV4cHIubGVmdC5raW5kLCBub0VtcHR5U3BhY2UoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChleHByLmxlZnQuZGVjbGFyYXRpb25zWzBdLCBTX0ZGRkYpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmxlZnQsIFByZWNlZGVuY2UuQ2FsbCwgRV9UVFQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcmFnbWVudCA9IGpvaW4oZnJhZ21lbnQsIGV4cHIub2YgPyAnb2YnIDogJ2luJyk7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGpvaW4oZnJhZ21lbnQsIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucmlnaHQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG5cbiAgICAgICAgICAgIHJldHVybiBbICdmb3InICsgc3BhY2UgKyAnKCcsIGZyYWdtZW50LCAnKScgXTtcbiAgICAgICAgfSxcblxuICAgICAgICBTcHJlYWRFbGVtZW50OiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgJy4uLicsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5hcmd1bWVudCwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVClcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciBpdGVtRmxhZ3MgPSBFX1RURjtcbiAgICAgICAgICAgIGlmICghKGZsYWdzICYgRl9BTExPV19DQUxMKSkge1xuICAgICAgICAgICAgICAgIGl0ZW1GbGFncyA9IEVfVEZGO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnRhZywgUHJlY2VkZW5jZS5DYWxsLCBpdGVtRmxhZ3MpLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucXVhc2ksIFByZWNlZGVuY2UuUHJpbWFyeSwgRV9GRlQpXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuVGFnZ2VkVGVtcGxhdGUsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFRlbXBsYXRlRWxlbWVudDogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB1c2UgXCJjb29rZWRcIi4gU2luY2UgdGFnZ2VkIHRlbXBsYXRlIGNhbiB1c2UgcmF3IHRlbXBsYXRlXG4gICAgICAgICAgICAvLyByZXByZXNlbnRhdGlvbi4gU28gaWYgd2UgZG8gc28sIGl0IGJyZWFrcyB0aGUgc2NyaXB0IHNlbWFudGljcy5cbiAgICAgICAgICAgIHJldHVybiBleHByLnZhbHVlLnJhdztcbiAgICAgICAgfSxcblxuICAgICAgICBUZW1wbGF0ZUxpdGVyYWw6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXo7XG4gICAgICAgICAgICByZXN1bHQgPSBbICdgJyBdO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLnF1YXNpcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5xdWFzaXNbaV0sIFByZWNlZGVuY2UuUHJpbWFyeSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnJHsnICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmV4cHJlc3Npb25zW2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSArICd9Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ2AnKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgTW9kdWxlU3BlY2lmaWVyOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkxpdGVyYWwoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEltcG9ydEV4cHJlc3Npb246IGZ1bmN0aW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWcpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUoW1xuICAgICAgICAgICAgICAgICdpbXBvcnQoJyxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnNvdXJjZSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCksXG4gICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICBdLCBQcmVjZWRlbmNlLkNhbGwsIHByZWNlZGVuY2UpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG1lcmdlKENvZGVHZW5lcmF0b3IucHJvdG90eXBlLCBDb2RlR2VuZXJhdG9yLkV4cHJlc3Npb24pO1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgIHZhciByZXN1bHQsIHR5cGU7XG5cbiAgICAgICAgdHlwZSA9IGV4cHIudHlwZSB8fCBTeW50YXguUHJvcGVydHk7XG5cbiAgICAgICAgaWYgKGV4dHJhLnZlcmJhdGltICYmIGV4cHIuaGFzT3duUHJvcGVydHkoZXh0cmEudmVyYmF0aW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVWZXJiYXRpbShleHByLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IHRoaXNbdHlwZV0oZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpO1xuXG5cbiAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGFkZENvbW1lbnRzKGV4cHIsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0LCBleHByKTtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICAgIGZyYWdtZW50O1xuXG4gICAgICAgIHJlc3VsdCA9IHRoaXNbc3RtdC50eXBlXShzdG10LCBmbGFncyk7XG5cbiAgICAgICAgLy8gQXR0YWNoIGNvbW1lbnRzXG5cbiAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGFkZENvbW1lbnRzKHN0bXQsIHJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICBmcmFnbWVudCA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpO1xuICAgICAgICBpZiAoc3RtdC50eXBlID09PSBTeW50YXguUHJvZ3JhbSAmJiAhc2FmZUNvbmNhdGVuYXRpb24gJiYgbmV3bGluZSA9PT0gJycgJiYgIGZyYWdtZW50LmNoYXJBdChmcmFnbWVudC5sZW5ndGggLSAxKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZU1hcCA/IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS5yZXBsYWNlUmlnaHQoL1xccyskLywgJycpIDogZnJhZ21lbnQucmVwbGFjZSgvXFxzKyQvLCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQsIHN0bXQpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZUludGVybmFsKG5vZGUpIHtcbiAgICAgICAgdmFyIGNvZGVnZW47XG5cbiAgICAgICAgY29kZWdlbiA9IG5ldyBDb2RlR2VuZXJhdG9yKCk7XG4gICAgICAgIGlmIChpc1N0YXRlbWVudChub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVnZW4uZ2VuZXJhdGVTdGF0ZW1lbnQobm9kZSwgU19URkZGKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0V4cHJlc3Npb24obm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2RlZ2VuLmdlbmVyYXRlRXhwcmVzc2lvbihub2RlLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlOiAnICsgbm9kZS50eXBlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZShub2RlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCksIHJlc3VsdCwgcGFpcjtcblxuICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBPYnNvbGV0ZSBvcHRpb25zXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gICBgb3B0aW9ucy5pbmRlbnRgXG4gICAgICAgICAgICAvLyAgIGBvcHRpb25zLmJhc2VgXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiB0aGVtLCB3ZSBjYW4gdXNlIGBvcHRpb24uZm9ybWF0LmluZGVudGAuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuaW5kZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRPcHRpb25zLmZvcm1hdC5pbmRlbnQuc3R5bGUgPSBvcHRpb25zLmluZGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5iYXNlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRPcHRpb25zLmZvcm1hdC5pbmRlbnQuYmFzZSA9IG9wdGlvbnMuYmFzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnMgPSB1cGRhdGVEZWVwbHkoZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaW5kZW50ID0gb3B0aW9ucy5mb3JtYXQuaW5kZW50LnN0eWxlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJhc2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgYmFzZSA9IG9wdGlvbnMuYmFzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYmFzZSA9IHN0cmluZ1JlcGVhdChpbmRlbnQsIG9wdGlvbnMuZm9ybWF0LmluZGVudC5iYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICAgICAgICAgIGluZGVudCA9IG9wdGlvbnMuZm9ybWF0LmluZGVudC5zdHlsZTtcbiAgICAgICAgICAgIGJhc2UgPSBzdHJpbmdSZXBlYXQoaW5kZW50LCBvcHRpb25zLmZvcm1hdC5pbmRlbnQuYmFzZSk7XG4gICAgICAgIH1cbiAgICAgICAganNvbiA9IG9wdGlvbnMuZm9ybWF0Lmpzb247XG4gICAgICAgIHJlbnVtYmVyID0gb3B0aW9ucy5mb3JtYXQucmVudW1iZXI7XG4gICAgICAgIGhleGFkZWNpbWFsID0ganNvbiA/IGZhbHNlIDogb3B0aW9ucy5mb3JtYXQuaGV4YWRlY2ltYWw7XG4gICAgICAgIHF1b3RlcyA9IGpzb24gPyAnZG91YmxlJyA6IG9wdGlvbnMuZm9ybWF0LnF1b3RlcztcbiAgICAgICAgZXNjYXBlbGVzcyA9IG9wdGlvbnMuZm9ybWF0LmVzY2FwZWxlc3M7XG4gICAgICAgIG5ld2xpbmUgPSBvcHRpb25zLmZvcm1hdC5uZXdsaW5lO1xuICAgICAgICBzcGFjZSA9IG9wdGlvbnMuZm9ybWF0LnNwYWNlO1xuICAgICAgICBpZiAob3B0aW9ucy5mb3JtYXQuY29tcGFjdCkge1xuICAgICAgICAgICAgbmV3bGluZSA9IHNwYWNlID0gaW5kZW50ID0gYmFzZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudGhlc2VzID0gb3B0aW9ucy5mb3JtYXQucGFyZW50aGVzZXM7XG4gICAgICAgIHNlbWljb2xvbnMgPSBvcHRpb25zLmZvcm1hdC5zZW1pY29sb25zO1xuICAgICAgICBzYWZlQ29uY2F0ZW5hdGlvbiA9IG9wdGlvbnMuZm9ybWF0LnNhZmVDb25jYXRlbmF0aW9uO1xuICAgICAgICBkaXJlY3RpdmUgPSBvcHRpb25zLmRpcmVjdGl2ZTtcbiAgICAgICAgcGFyc2UgPSBqc29uID8gbnVsbCA6IG9wdGlvbnMucGFyc2U7XG4gICAgICAgIHNvdXJjZU1hcCA9IG9wdGlvbnMuc291cmNlTWFwO1xuICAgICAgICBzb3VyY2VDb2RlID0gb3B0aW9ucy5zb3VyY2VDb2RlO1xuICAgICAgICBwcmVzZXJ2ZUJsYW5rTGluZXMgPSBvcHRpb25zLmZvcm1hdC5wcmVzZXJ2ZUJsYW5rTGluZXMgJiYgc291cmNlQ29kZSAhPT0gbnVsbDtcbiAgICAgICAgZXh0cmEgPSBvcHRpb25zO1xuXG4gICAgICAgIGlmIChzb3VyY2VNYXApIHtcbiAgICAgICAgICAgIGlmICghZXhwb3J0cy5icm93c2VyKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgYXNzdW1lIGVudmlyb25tZW50IGlzIG5vZGUuanNcbiAgICAgICAgICAgICAgICAvLyBBbmQgcHJldmVudCBmcm9tIGluY2x1ZGluZyBzb3VyY2UtbWFwIGJ5IGJyb3dzZXJpZnlcbiAgICAgICAgICAgICAgICBTb3VyY2VOb2RlID0gcmVxdWlyZSgnc291cmNlLW1hcCcpLlNvdXJjZU5vZGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIFNvdXJjZU5vZGUgPSBnbG9iYWwuc291cmNlTWFwLlNvdXJjZU5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSBnZW5lcmF0ZUludGVybmFsKG5vZGUpO1xuXG4gICAgICAgIGlmICghc291cmNlTWFwKSB7XG4gICAgICAgICAgICBwYWlyID0ge2NvZGU6IHJlc3VsdC50b1N0cmluZygpLCBtYXA6IG51bGx9O1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc291cmNlTWFwV2l0aENvZGUgPyBwYWlyIDogcGFpci5jb2RlO1xuICAgICAgICB9XG5cblxuICAgICAgICBwYWlyID0gcmVzdWx0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7XG4gICAgICAgICAgICBmaWxlOiBvcHRpb25zLmZpbGUsXG4gICAgICAgICAgICBzb3VyY2VSb290OiBvcHRpb25zLnNvdXJjZU1hcFJvb3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc291cmNlQ29udGVudCkge1xuICAgICAgICAgICAgcGFpci5tYXAuc2V0U291cmNlQ29udGVudChvcHRpb25zLnNvdXJjZU1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zb3VyY2VDb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnNvdXJjZU1hcFdpdGhDb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFpcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYWlyLm1hcC50b1N0cmluZygpO1xuICAgIH1cblxuICAgIEZPUk1BVF9NSU5JRlkgPSB7XG4gICAgICAgIGluZGVudDoge1xuICAgICAgICAgICAgc3R5bGU6ICcnLFxuICAgICAgICAgICAgYmFzZTogMFxuICAgICAgICB9LFxuICAgICAgICByZW51bWJlcjogdHJ1ZSxcbiAgICAgICAgaGV4YWRlY2ltYWw6IHRydWUsXG4gICAgICAgIHF1b3RlczogJ2F1dG8nLFxuICAgICAgICBlc2NhcGVsZXNzOiB0cnVlLFxuICAgICAgICBjb21wYWN0OiB0cnVlLFxuICAgICAgICBwYXJlbnRoZXNlczogZmFsc2UsXG4gICAgICAgIHNlbWljb2xvbnM6IGZhbHNlXG4gICAgfTtcblxuICAgIEZPUk1BVF9ERUZBVUxUUyA9IGdldERlZmF1bHRPcHRpb25zKCkuZm9ybWF0O1xuXG4gICAgZXhwb3J0cy52ZXJzaW9uID0gcmVxdWlyZSgnLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO1xuICAgIGV4cG9ydHMuZ2VuZXJhdGUgPSBnZW5lcmF0ZTtcbiAgICBleHBvcnRzLmF0dGFjaENvbW1lbnRzID0gZXN0cmF2ZXJzZS5hdHRhY2hDb21tZW50cztcbiAgICBleHBvcnRzLlByZWNlZGVuY2UgPSB1cGRhdGVEZWVwbHkoe30sIFByZWNlZGVuY2UpO1xuICAgIGV4cG9ydHMuYnJvd3NlciA9IGZhbHNlO1xuICAgIGV4cG9ydHMuRk9STUFUX01JTklGWSA9IEZPUk1BVF9NSU5JRlk7XG4gICAgZXhwb3J0cy5GT1JNQVRfREVGQVVMVFMgPSBGT1JNQVRfREVGQVVMVFM7XG59KCkpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZXNwcmltYVwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJlc3ByaW1hXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuXG5cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdC8qXG5cdCAgQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycywgaHR0cHM6Ly9qcy5mb3VuZGF0aW9uL1xuXG5cdCAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG5cdCAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cblx0ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcblx0ICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXHQgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuXHQgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG5cdCAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cblx0ICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuXHQgIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcblx0ICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuXHQgIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcblx0ICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuXHQgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcblx0ICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcblx0ICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuXHQgIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuXHQgIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG5cdCovXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIGNvbW1lbnRfaGFuZGxlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0dmFyIGpzeF9wYXJzZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cdHZhciBwYXJzZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG5cdHZhciB0b2tlbml6ZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xuXHRmdW5jdGlvbiBwYXJzZShjb2RlLCBvcHRpb25zLCBkZWxlZ2F0ZSkge1xuXHQgICAgdmFyIGNvbW1lbnRIYW5kbGVyID0gbnVsbDtcblx0ICAgIHZhciBwcm94eURlbGVnYXRlID0gZnVuY3Rpb24gKG5vZGUsIG1ldGFkYXRhKSB7XG5cdCAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG5cdCAgICAgICAgICAgIGRlbGVnYXRlKG5vZGUsIG1ldGFkYXRhKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGNvbW1lbnRIYW5kbGVyKSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnRIYW5kbGVyLnZpc2l0KG5vZGUsIG1ldGFkYXRhKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgdmFyIHBhcnNlckRlbGVnYXRlID0gKHR5cGVvZiBkZWxlZ2F0ZSA9PT0gJ2Z1bmN0aW9uJykgPyBwcm94eURlbGVnYXRlIDogbnVsbDtcblx0ICAgIHZhciBjb2xsZWN0Q29tbWVudCA9IGZhbHNlO1xuXHQgICAgaWYgKG9wdGlvbnMpIHtcblx0ICAgICAgICBjb2xsZWN0Q29tbWVudCA9ICh0eXBlb2Ygb3B0aW9ucy5jb21tZW50ID09PSAnYm9vbGVhbicgJiYgb3B0aW9ucy5jb21tZW50KTtcblx0ICAgICAgICB2YXIgYXR0YWNoQ29tbWVudCA9ICh0eXBlb2Ygb3B0aW9ucy5hdHRhY2hDb21tZW50ID09PSAnYm9vbGVhbicgJiYgb3B0aW9ucy5hdHRhY2hDb21tZW50KTtcblx0ICAgICAgICBpZiAoY29sbGVjdENvbW1lbnQgfHwgYXR0YWNoQ29tbWVudCkge1xuXHQgICAgICAgICAgICBjb21tZW50SGFuZGxlciA9IG5ldyBjb21tZW50X2hhbmRsZXJfMS5Db21tZW50SGFuZGxlcigpO1xuXHQgICAgICAgICAgICBjb21tZW50SGFuZGxlci5hdHRhY2ggPSBhdHRhY2hDb21tZW50O1xuXHQgICAgICAgICAgICBvcHRpb25zLmNvbW1lbnQgPSB0cnVlO1xuXHQgICAgICAgICAgICBwYXJzZXJEZWxlZ2F0ZSA9IHByb3h5RGVsZWdhdGU7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgdmFyIGlzTW9kdWxlID0gZmFsc2U7XG5cdCAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5zb3VyY2VUeXBlID09PSAnc3RyaW5nJykge1xuXHQgICAgICAgIGlzTW9kdWxlID0gKG9wdGlvbnMuc291cmNlVHlwZSA9PT0gJ21vZHVsZScpO1xuXHQgICAgfVxuXHQgICAgdmFyIHBhcnNlcjtcblx0ICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLmpzeCA9PT0gJ2Jvb2xlYW4nICYmIG9wdGlvbnMuanN4KSB7XG5cdCAgICAgICAgcGFyc2VyID0gbmV3IGpzeF9wYXJzZXJfMS5KU1hQYXJzZXIoY29kZSwgb3B0aW9ucywgcGFyc2VyRGVsZWdhdGUpO1xuXHQgICAgfVxuXHQgICAgZWxzZSB7XG5cdCAgICAgICAgcGFyc2VyID0gbmV3IHBhcnNlcl8xLlBhcnNlcihjb2RlLCBvcHRpb25zLCBwYXJzZXJEZWxlZ2F0ZSk7XG5cdCAgICB9XG5cdCAgICB2YXIgcHJvZ3JhbSA9IGlzTW9kdWxlID8gcGFyc2VyLnBhcnNlTW9kdWxlKCkgOiBwYXJzZXIucGFyc2VTY3JpcHQoKTtcblx0ICAgIHZhciBhc3QgPSBwcm9ncmFtO1xuXHQgICAgaWYgKGNvbGxlY3RDb21tZW50ICYmIGNvbW1lbnRIYW5kbGVyKSB7XG5cdCAgICAgICAgYXN0LmNvbW1lbnRzID0gY29tbWVudEhhbmRsZXIuY29tbWVudHM7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyc2VyLmNvbmZpZy50b2tlbnMpIHtcblx0ICAgICAgICBhc3QudG9rZW5zID0gcGFyc2VyLnRva2Vucztcblx0ICAgIH1cblx0ICAgIGlmIChwYXJzZXIuY29uZmlnLnRvbGVyYW50KSB7XG5cdCAgICAgICAgYXN0LmVycm9ycyA9IHBhcnNlci5lcnJvckhhbmRsZXIuZXJyb3JzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGFzdDtcblx0fVxuXHRleHBvcnRzLnBhcnNlID0gcGFyc2U7XG5cdGZ1bmN0aW9uIHBhcnNlTW9kdWxlKGNvZGUsIG9wdGlvbnMsIGRlbGVnYXRlKSB7XG5cdCAgICB2YXIgcGFyc2luZ09wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHQgICAgcGFyc2luZ09wdGlvbnMuc291cmNlVHlwZSA9ICdtb2R1bGUnO1xuXHQgICAgcmV0dXJuIHBhcnNlKGNvZGUsIHBhcnNpbmdPcHRpb25zLCBkZWxlZ2F0ZSk7XG5cdH1cblx0ZXhwb3J0cy5wYXJzZU1vZHVsZSA9IHBhcnNlTW9kdWxlO1xuXHRmdW5jdGlvbiBwYXJzZVNjcmlwdChjb2RlLCBvcHRpb25zLCBkZWxlZ2F0ZSkge1xuXHQgICAgdmFyIHBhcnNpbmdPcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0ICAgIHBhcnNpbmdPcHRpb25zLnNvdXJjZVR5cGUgPSAnc2NyaXB0Jztcblx0ICAgIHJldHVybiBwYXJzZShjb2RlLCBwYXJzaW5nT3B0aW9ucywgZGVsZWdhdGUpO1xuXHR9XG5cdGV4cG9ydHMucGFyc2VTY3JpcHQgPSBwYXJzZVNjcmlwdDtcblx0ZnVuY3Rpb24gdG9rZW5pemUoY29kZSwgb3B0aW9ucywgZGVsZWdhdGUpIHtcblx0ICAgIHZhciB0b2tlbml6ZXIgPSBuZXcgdG9rZW5pemVyXzEuVG9rZW5pemVyKGNvZGUsIG9wdGlvbnMpO1xuXHQgICAgdmFyIHRva2Vucztcblx0ICAgIHRva2VucyA9IFtdO1xuXHQgICAgdHJ5IHtcblx0ICAgICAgICB3aGlsZSAodHJ1ZSkge1xuXHQgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGlmICghdG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICAgICAgdG9rZW4gPSBkZWxlZ2F0ZSh0b2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIGNhdGNoIChlKSB7XG5cdCAgICAgICAgdG9rZW5pemVyLmVycm9ySGFuZGxlci50b2xlcmF0ZShlKTtcblx0ICAgIH1cblx0ICAgIGlmICh0b2tlbml6ZXIuZXJyb3JIYW5kbGVyLnRvbGVyYW50KSB7XG5cdCAgICAgICAgdG9rZW5zLmVycm9ycyA9IHRva2VuaXplci5lcnJvcnMoKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0b2tlbnM7XG5cdH1cblx0ZXhwb3J0cy50b2tlbml6ZSA9IHRva2VuaXplO1xuXHR2YXIgc3ludGF4XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHRleHBvcnRzLlN5bnRheCA9IHN5bnRheF8xLlN5bnRheDtcblx0Ly8gU3luYyB3aXRoICouanNvbiBtYW5pZmVzdHMuXG5cdGV4cG9ydHMudmVyc2lvbiA9ICc0LjAuMSc7XG5cblxuLyoqKi8gfSxcbi8qIDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdHZhciBzeW50YXhfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdHZhciBDb21tZW50SGFuZGxlciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDb21tZW50SGFuZGxlcigpIHtcblx0ICAgICAgICB0aGlzLmF0dGFjaCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuY29tbWVudHMgPSBbXTtcblx0ICAgICAgICB0aGlzLnN0YWNrID0gW107XG5cdCAgICAgICAgdGhpcy5sZWFkaW5nID0gW107XG5cdCAgICAgICAgdGhpcy50cmFpbGluZyA9IFtdO1xuXHQgICAgfVxuXHQgICAgQ29tbWVudEhhbmRsZXIucHJvdG90eXBlLmluc2VydElubmVyQ29tbWVudHMgPSBmdW5jdGlvbiAobm9kZSwgbWV0YWRhdGEpIHtcblx0ICAgICAgICAvLyAgaW5ubmVyQ29tbWVudHMgZm9yIHByb3BlcnRpZXMgZW1wdHkgYmxvY2tcblx0ICAgICAgICAvLyAgYGZ1bmN0aW9uIGEoKSB7LyoqIGNvbW1lbnRzICoqXFwvfWBcblx0ICAgICAgICBpZiAobm9kZS50eXBlID09PSBzeW50YXhfMS5TeW50YXguQmxvY2tTdGF0ZW1lbnQgJiYgbm9kZS5ib2R5Lmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgICAgICB2YXIgaW5uZXJDb21tZW50cyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5sZWFkaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLmxlYWRpbmdbaV07XG5cdCAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEuZW5kLm9mZnNldCA+PSBlbnRyeS5zdGFydCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlubmVyQ29tbWVudHMudW5zaGlmdChlbnRyeS5jb21tZW50KTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmxlYWRpbmcuc3BsaWNlKGksIDEpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhaWxpbmcuc3BsaWNlKGksIDEpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChpbm5lckNvbW1lbnRzLmxlbmd0aCkge1xuXHQgICAgICAgICAgICAgICAgbm9kZS5pbm5lckNvbW1lbnRzID0gaW5uZXJDb21tZW50cztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBDb21tZW50SGFuZGxlci5wcm90b3R5cGUuZmluZFRyYWlsaW5nQ29tbWVudHMgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcblx0ICAgICAgICB2YXIgdHJhaWxpbmdDb21tZW50cyA9IFtdO1xuXHQgICAgICAgIGlmICh0aGlzLnRyYWlsaW5nLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJhaWxpbmcubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBlbnRyeV8xID0gdGhpcy50cmFpbGluZ1tpXTtcblx0ICAgICAgICAgICAgICAgIGlmIChlbnRyeV8xLnN0YXJ0ID49IG1ldGFkYXRhLmVuZC5vZmZzZXQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ0NvbW1lbnRzLnVuc2hpZnQoZW50cnlfMS5jb21tZW50KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLnRyYWlsaW5nLmxlbmd0aCA9IDA7XG5cdCAgICAgICAgICAgIHJldHVybiB0cmFpbGluZ0NvbW1lbnRzO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG5cdCAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5Lm5vZGUudHJhaWxpbmdDb21tZW50cykge1xuXHQgICAgICAgICAgICB2YXIgZmlyc3RDb21tZW50ID0gZW50cnkubm9kZS50cmFpbGluZ0NvbW1lbnRzWzBdO1xuXHQgICAgICAgICAgICBpZiAoZmlyc3RDb21tZW50ICYmIGZpcnN0Q29tbWVudC5yYW5nZVswXSA+PSBtZXRhZGF0YS5lbmQub2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICB0cmFpbGluZ0NvbW1lbnRzID0gZW50cnkubm9kZS50cmFpbGluZ0NvbW1lbnRzO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIGVudHJ5Lm5vZGUudHJhaWxpbmdDb21tZW50cztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdHJhaWxpbmdDb21tZW50cztcblx0ICAgIH07XG5cdCAgICBDb21tZW50SGFuZGxlci5wcm90b3R5cGUuZmluZExlYWRpbmdDb21tZW50cyA9IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuXHQgICAgICAgIHZhciBsZWFkaW5nQ29tbWVudHMgPSBbXTtcblx0ICAgICAgICB2YXIgdGFyZ2V0O1xuXHQgICAgICAgIHdoaWxlICh0aGlzLnN0YWNrLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdO1xuXHQgICAgICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkuc3RhcnQgPj0gbWV0YWRhdGEuc3RhcnQub2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICB0YXJnZXQgPSBlbnRyeS5ub2RlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0YXJnZXQpIHtcblx0ICAgICAgICAgICAgdmFyIGNvdW50ID0gdGFyZ2V0LmxlYWRpbmdDb21tZW50cyA/IHRhcmdldC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoIDogMDtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IGNvdW50IC0gMTsgaSA+PSAwOyAtLWkpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0gdGFyZ2V0LmxlYWRpbmdDb21tZW50c1tpXTtcblx0ICAgICAgICAgICAgICAgIGlmIChjb21tZW50LnJhbmdlWzFdIDw9IG1ldGFkYXRhLnN0YXJ0Lm9mZnNldCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGxlYWRpbmdDb21tZW50cy51bnNoaWZ0KGNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRhcmdldC5sZWFkaW5nQ29tbWVudHMuc3BsaWNlKGksIDEpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICh0YXJnZXQubGVhZGluZ0NvbW1lbnRzICYmIHRhcmdldC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0LmxlYWRpbmdDb21tZW50cztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gbGVhZGluZ0NvbW1lbnRzO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5sZWFkaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG5cdCAgICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMubGVhZGluZ1tpXTtcblx0ICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0IDw9IG1ldGFkYXRhLnN0YXJ0Lm9mZnNldCkge1xuXHQgICAgICAgICAgICAgICAgbGVhZGluZ0NvbW1lbnRzLnVuc2hpZnQoZW50cnkuY29tbWVudCk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmxlYWRpbmcuc3BsaWNlKGksIDEpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBsZWFkaW5nQ29tbWVudHM7XG5cdCAgICB9O1xuXHQgICAgQ29tbWVudEhhbmRsZXIucHJvdG90eXBlLnZpc2l0Tm9kZSA9IGZ1bmN0aW9uIChub2RlLCBtZXRhZGF0YSkge1xuXHQgICAgICAgIGlmIChub2RlLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5Qcm9ncmFtICYmIG5vZGUuYm9keS5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5pbnNlcnRJbm5lckNvbW1lbnRzKG5vZGUsIG1ldGFkYXRhKTtcblx0ICAgICAgICB2YXIgdHJhaWxpbmdDb21tZW50cyA9IHRoaXMuZmluZFRyYWlsaW5nQ29tbWVudHMobWV0YWRhdGEpO1xuXHQgICAgICAgIHZhciBsZWFkaW5nQ29tbWVudHMgPSB0aGlzLmZpbmRMZWFkaW5nQ29tbWVudHMobWV0YWRhdGEpO1xuXHQgICAgICAgIGlmIChsZWFkaW5nQ29tbWVudHMubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICBub2RlLmxlYWRpbmdDb21tZW50cyA9IGxlYWRpbmdDb21tZW50cztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRyYWlsaW5nQ29tbWVudHMubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICBub2RlLnRyYWlsaW5nQ29tbWVudHMgPSB0cmFpbGluZ0NvbW1lbnRzO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnN0YWNrLnB1c2goe1xuXHQgICAgICAgICAgICBub2RlOiBub2RlLFxuXHQgICAgICAgICAgICBzdGFydDogbWV0YWRhdGEuc3RhcnQub2Zmc2V0XG5cdCAgICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgQ29tbWVudEhhbmRsZXIucHJvdG90eXBlLnZpc2l0Q29tbWVudCA9IGZ1bmN0aW9uIChub2RlLCBtZXRhZGF0YSkge1xuXHQgICAgICAgIHZhciB0eXBlID0gKG5vZGUudHlwZVswXSA9PT0gJ0wnKSA/ICdMaW5lJyA6ICdCbG9jayc7XG5cdCAgICAgICAgdmFyIGNvbW1lbnQgPSB7XG5cdCAgICAgICAgICAgIHR5cGU6IHR5cGUsXG5cdCAgICAgICAgICAgIHZhbHVlOiBub2RlLnZhbHVlXG5cdCAgICAgICAgfTtcblx0ICAgICAgICBpZiAobm9kZS5yYW5nZSkge1xuXHQgICAgICAgICAgICBjb21tZW50LnJhbmdlID0gbm9kZS5yYW5nZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKG5vZGUubG9jKSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnQubG9jID0gbm9kZS5sb2M7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY29tbWVudHMucHVzaChjb21tZW50KTtcblx0ICAgICAgICBpZiAodGhpcy5hdHRhY2gpIHtcblx0ICAgICAgICAgICAgdmFyIGVudHJ5ID0ge1xuXHQgICAgICAgICAgICAgICAgY29tbWVudDoge1xuXHQgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG5cdCAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5vZGUudmFsdWUsXG5cdCAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IFttZXRhZGF0YS5zdGFydC5vZmZzZXQsIG1ldGFkYXRhLmVuZC5vZmZzZXRdXG5cdCAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IG1ldGFkYXRhLnN0YXJ0Lm9mZnNldFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBpZiAobm9kZS5sb2MpIHtcblx0ICAgICAgICAgICAgICAgIGVudHJ5LmNvbW1lbnQubG9jID0gbm9kZS5sb2M7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgbm9kZS50eXBlID0gdHlwZTtcblx0ICAgICAgICAgICAgdGhpcy5sZWFkaW5nLnB1c2goZW50cnkpO1xuXHQgICAgICAgICAgICB0aGlzLnRyYWlsaW5nLnB1c2goZW50cnkpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBDb21tZW50SGFuZGxlci5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAobm9kZSwgbWV0YWRhdGEpIHtcblx0ICAgICAgICBpZiAobm9kZS50eXBlID09PSAnTGluZUNvbW1lbnQnKSB7XG5cdCAgICAgICAgICAgIHRoaXMudmlzaXRDb21tZW50KG5vZGUsIG1ldGFkYXRhKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnQmxvY2tDb21tZW50Jykge1xuXHQgICAgICAgICAgICB0aGlzLnZpc2l0Q29tbWVudChub2RlLCBtZXRhZGF0YSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMuYXR0YWNoKSB7XG5cdCAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUsIG1ldGFkYXRhKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIENvbW1lbnRIYW5kbGVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLkNvbW1lbnRIYW5kbGVyID0gQ29tbWVudEhhbmRsZXI7XG5cblxuLyoqKi8gfSxcbi8qIDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdGV4cG9ydHMuU3ludGF4ID0ge1xuXHQgICAgQXNzaWdubWVudEV4cHJlc3Npb246ICdBc3NpZ25tZW50RXhwcmVzc2lvbicsXG5cdCAgICBBc3NpZ25tZW50UGF0dGVybjogJ0Fzc2lnbm1lbnRQYXR0ZXJuJyxcblx0ICAgIEFycmF5RXhwcmVzc2lvbjogJ0FycmF5RXhwcmVzc2lvbicsXG5cdCAgICBBcnJheVBhdHRlcm46ICdBcnJheVBhdHRlcm4nLFxuXHQgICAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246ICdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbicsXG5cdCAgICBBd2FpdEV4cHJlc3Npb246ICdBd2FpdEV4cHJlc3Npb24nLFxuXHQgICAgQmxvY2tTdGF0ZW1lbnQ6ICdCbG9ja1N0YXRlbWVudCcsXG5cdCAgICBCaW5hcnlFeHByZXNzaW9uOiAnQmluYXJ5RXhwcmVzc2lvbicsXG5cdCAgICBCcmVha1N0YXRlbWVudDogJ0JyZWFrU3RhdGVtZW50Jyxcblx0ICAgIENhbGxFeHByZXNzaW9uOiAnQ2FsbEV4cHJlc3Npb24nLFxuXHQgICAgQ2F0Y2hDbGF1c2U6ICdDYXRjaENsYXVzZScsXG5cdCAgICBDbGFzc0JvZHk6ICdDbGFzc0JvZHknLFxuXHQgICAgQ2xhc3NEZWNsYXJhdGlvbjogJ0NsYXNzRGVjbGFyYXRpb24nLFxuXHQgICAgQ2xhc3NFeHByZXNzaW9uOiAnQ2xhc3NFeHByZXNzaW9uJyxcblx0ICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbjogJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbicsXG5cdCAgICBDb250aW51ZVN0YXRlbWVudDogJ0NvbnRpbnVlU3RhdGVtZW50Jyxcblx0ICAgIERvV2hpbGVTdGF0ZW1lbnQ6ICdEb1doaWxlU3RhdGVtZW50Jyxcblx0ICAgIERlYnVnZ2VyU3RhdGVtZW50OiAnRGVidWdnZXJTdGF0ZW1lbnQnLFxuXHQgICAgRW1wdHlTdGF0ZW1lbnQ6ICdFbXB0eVN0YXRlbWVudCcsXG5cdCAgICBFeHBvcnRBbGxEZWNsYXJhdGlvbjogJ0V4cG9ydEFsbERlY2xhcmF0aW9uJyxcblx0ICAgIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjogJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbicsXG5cdCAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uOiAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbicsXG5cdCAgICBFeHBvcnRTcGVjaWZpZXI6ICdFeHBvcnRTcGVjaWZpZXInLFxuXHQgICAgRXhwcmVzc2lvblN0YXRlbWVudDogJ0V4cHJlc3Npb25TdGF0ZW1lbnQnLFxuXHQgICAgRm9yU3RhdGVtZW50OiAnRm9yU3RhdGVtZW50Jyxcblx0ICAgIEZvck9mU3RhdGVtZW50OiAnRm9yT2ZTdGF0ZW1lbnQnLFxuXHQgICAgRm9ySW5TdGF0ZW1lbnQ6ICdGb3JJblN0YXRlbWVudCcsXG5cdCAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiAnRnVuY3Rpb25EZWNsYXJhdGlvbicsXG5cdCAgICBGdW5jdGlvbkV4cHJlc3Npb246ICdGdW5jdGlvbkV4cHJlc3Npb24nLFxuXHQgICAgSWRlbnRpZmllcjogJ0lkZW50aWZpZXInLFxuXHQgICAgSWZTdGF0ZW1lbnQ6ICdJZlN0YXRlbWVudCcsXG5cdCAgICBJbXBvcnREZWNsYXJhdGlvbjogJ0ltcG9ydERlY2xhcmF0aW9uJyxcblx0ICAgIEltcG9ydERlZmF1bHRTcGVjaWZpZXI6ICdJbXBvcnREZWZhdWx0U3BlY2lmaWVyJyxcblx0ICAgIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogJ0ltcG9ydE5hbWVzcGFjZVNwZWNpZmllcicsXG5cdCAgICBJbXBvcnRTcGVjaWZpZXI6ICdJbXBvcnRTcGVjaWZpZXInLFxuXHQgICAgTGl0ZXJhbDogJ0xpdGVyYWwnLFxuXHQgICAgTGFiZWxlZFN0YXRlbWVudDogJ0xhYmVsZWRTdGF0ZW1lbnQnLFxuXHQgICAgTG9naWNhbEV4cHJlc3Npb246ICdMb2dpY2FsRXhwcmVzc2lvbicsXG5cdCAgICBNZW1iZXJFeHByZXNzaW9uOiAnTWVtYmVyRXhwcmVzc2lvbicsXG5cdCAgICBNZXRhUHJvcGVydHk6ICdNZXRhUHJvcGVydHknLFxuXHQgICAgTWV0aG9kRGVmaW5pdGlvbjogJ01ldGhvZERlZmluaXRpb24nLFxuXHQgICAgTmV3RXhwcmVzc2lvbjogJ05ld0V4cHJlc3Npb24nLFxuXHQgICAgT2JqZWN0RXhwcmVzc2lvbjogJ09iamVjdEV4cHJlc3Npb24nLFxuXHQgICAgT2JqZWN0UGF0dGVybjogJ09iamVjdFBhdHRlcm4nLFxuXHQgICAgUHJvZ3JhbTogJ1Byb2dyYW0nLFxuXHQgICAgUHJvcGVydHk6ICdQcm9wZXJ0eScsXG5cdCAgICBSZXN0RWxlbWVudDogJ1Jlc3RFbGVtZW50Jyxcblx0ICAgIFJldHVyblN0YXRlbWVudDogJ1JldHVyblN0YXRlbWVudCcsXG5cdCAgICBTZXF1ZW5jZUV4cHJlc3Npb246ICdTZXF1ZW5jZUV4cHJlc3Npb24nLFxuXHQgICAgU3ByZWFkRWxlbWVudDogJ1NwcmVhZEVsZW1lbnQnLFxuXHQgICAgU3VwZXI6ICdTdXBlcicsXG5cdCAgICBTd2l0Y2hDYXNlOiAnU3dpdGNoQ2FzZScsXG5cdCAgICBTd2l0Y2hTdGF0ZW1lbnQ6ICdTd2l0Y2hTdGF0ZW1lbnQnLFxuXHQgICAgVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uOiAnVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uJyxcblx0ICAgIFRlbXBsYXRlRWxlbWVudDogJ1RlbXBsYXRlRWxlbWVudCcsXG5cdCAgICBUZW1wbGF0ZUxpdGVyYWw6ICdUZW1wbGF0ZUxpdGVyYWwnLFxuXHQgICAgVGhpc0V4cHJlc3Npb246ICdUaGlzRXhwcmVzc2lvbicsXG5cdCAgICBUaHJvd1N0YXRlbWVudDogJ1Rocm93U3RhdGVtZW50Jyxcblx0ICAgIFRyeVN0YXRlbWVudDogJ1RyeVN0YXRlbWVudCcsXG5cdCAgICBVbmFyeUV4cHJlc3Npb246ICdVbmFyeUV4cHJlc3Npb24nLFxuXHQgICAgVXBkYXRlRXhwcmVzc2lvbjogJ1VwZGF0ZUV4cHJlc3Npb24nLFxuXHQgICAgVmFyaWFibGVEZWNsYXJhdGlvbjogJ1ZhcmlhYmxlRGVjbGFyYXRpb24nLFxuXHQgICAgVmFyaWFibGVEZWNsYXJhdG9yOiAnVmFyaWFibGVEZWNsYXJhdG9yJyxcblx0ICAgIFdoaWxlU3RhdGVtZW50OiAnV2hpbGVTdGF0ZW1lbnQnLFxuXHQgICAgV2l0aFN0YXRlbWVudDogJ1dpdGhTdGF0ZW1lbnQnLFxuXHQgICAgWWllbGRFeHByZXNzaW9uOiAnWWllbGRFeHByZXNzaW9uJ1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdHZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG5cdCAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuXHQgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xuXHQgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG5cdCAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcblx0ICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cblx0ICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG5cdCAgICB9O1xuXHR9KSgpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdHZhciBjaGFyYWN0ZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cdHZhciBKU1hOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0dmFyIGpzeF9zeW50YXhfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cdHZhciBOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcblx0dmFyIHBhcnNlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblx0dmFyIHRva2VuXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblx0dmFyIHhodG1sX2VudGl0aWVzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcblx0dG9rZW5fMS5Ub2tlbk5hbWVbMTAwIC8qIElkZW50aWZpZXIgKi9dID0gJ0pTWElkZW50aWZpZXInO1xuXHR0b2tlbl8xLlRva2VuTmFtZVsxMDEgLyogVGV4dCAqL10gPSAnSlNYVGV4dCc7XG5cdC8vIEZ1bGx5IHF1YWxpZmllZCBlbGVtZW50IG5hbWUsIGUuZy4gPHN2ZzpwYXRoPiByZXR1cm5zIFwic3ZnOnBhdGhcIlxuXHRmdW5jdGlvbiBnZXRRdWFsaWZpZWRFbGVtZW50TmFtZShlbGVtZW50TmFtZSkge1xuXHQgICAgdmFyIHF1YWxpZmllZE5hbWU7XG5cdCAgICBzd2l0Y2ggKGVsZW1lbnROYW1lLnR5cGUpIHtcblx0ICAgICAgICBjYXNlIGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYSWRlbnRpZmllcjpcblx0ICAgICAgICAgICAgdmFyIGlkID0gZWxlbWVudE5hbWU7XG5cdCAgICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSBpZC5uYW1lO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYTmFtZXNwYWNlZE5hbWU6XG5cdCAgICAgICAgICAgIHZhciBucyA9IGVsZW1lbnROYW1lO1xuXHQgICAgICAgICAgICBxdWFsaWZpZWROYW1lID0gZ2V0UXVhbGlmaWVkRWxlbWVudE5hbWUobnMubmFtZXNwYWNlKSArICc6JyArXG5cdCAgICAgICAgICAgICAgICBnZXRRdWFsaWZpZWRFbGVtZW50TmFtZShucy5uYW1lKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWE1lbWJlckV4cHJlc3Npb246XG5cdCAgICAgICAgICAgIHZhciBleHByID0gZWxlbWVudE5hbWU7XG5cdCAgICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSBnZXRRdWFsaWZpZWRFbGVtZW50TmFtZShleHByLm9iamVjdCkgKyAnLicgK1xuXHQgICAgICAgICAgICAgICAgZ2V0UXVhbGlmaWVkRWxlbWVudE5hbWUoZXhwci5wcm9wZXJ0eSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdCAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcXVhbGlmaWVkTmFtZTtcblx0fVxuXHR2YXIgSlNYUGFyc2VyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcblx0ICAgIF9fZXh0ZW5kcyhKU1hQYXJzZXIsIF9zdXBlcik7XG5cdCAgICBmdW5jdGlvbiBKU1hQYXJzZXIoY29kZSwgb3B0aW9ucywgZGVsZWdhdGUpIHtcblx0ICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgY29kZSwgb3B0aW9ucywgZGVsZWdhdGUpIHx8IHRoaXM7XG5cdCAgICB9XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlUHJpbWFyeUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2goJzwnKSA/IHRoaXMucGFyc2VKU1hSb290KCkgOiBfc3VwZXIucHJvdG90eXBlLnBhcnNlUHJpbWFyeUV4cHJlc3Npb24uY2FsbCh0aGlzKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnN0YXJ0SlNYID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIC8vIFVud2luZCB0aGUgc2Nhbm5lciBiZWZvcmUgdGhlIGxvb2thaGVhZCB0b2tlbi5cblx0ICAgICAgICB0aGlzLnNjYW5uZXIuaW5kZXggPSB0aGlzLnN0YXJ0TWFya2VyLmluZGV4O1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyID0gdGhpcy5zdGFydE1hcmtlci5saW5lO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5saW5lU3RhcnQgPSB0aGlzLnN0YXJ0TWFya2VyLmluZGV4IC0gdGhpcy5zdGFydE1hcmtlci5jb2x1bW47XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5maW5pc2hKU1ggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy8gUHJpbWUgdGhlIG5leHQgbG9va2FoZWFkLlxuXHQgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5yZWVudGVySlNYID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuc3RhcnRKU1goKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgnfScpO1xuXHQgICAgICAgIC8vIFBvcCB0aGUgY2xvc2luZyAnfScgYWRkZWQgZnJvbSB0aGUgbG9va2FoZWFkLlxuXHQgICAgICAgIGlmICh0aGlzLmNvbmZpZy50b2tlbnMpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2tlbnMucG9wKCk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUuY3JlYXRlSlNYTm9kZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmNvbGxlY3RDb21tZW50cygpO1xuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIGluZGV4OiB0aGlzLnNjYW5uZXIuaW5kZXgsXG5cdCAgICAgICAgICAgIGxpbmU6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBjb2x1bW46IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnRcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUuY3JlYXRlSlNYQ2hpbGROb2RlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIGluZGV4OiB0aGlzLnNjYW5uZXIuaW5kZXgsXG5cdCAgICAgICAgICAgIGxpbmU6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBjb2x1bW46IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnRcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUuc2NhblhIVE1MRW50aXR5ID0gZnVuY3Rpb24gKHF1b3RlKSB7XG5cdCAgICAgICAgdmFyIHJlc3VsdCA9ICcmJztcblx0ICAgICAgICB2YXIgdmFsaWQgPSB0cnVlO1xuXHQgICAgICAgIHZhciB0ZXJtaW5hdGVkID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIG51bWVyaWMgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgaGV4ID0gZmFsc2U7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKCkgJiYgdmFsaWQgJiYgIXRlcm1pbmF0ZWQpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zY2FubmVyLnNvdXJjZVt0aGlzLnNjYW5uZXIuaW5kZXhdO1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09IHF1b3RlKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0ZXJtaW5hdGVkID0gKGNoID09PSAnOycpO1xuXHQgICAgICAgICAgICByZXN1bHQgKz0gY2g7XG5cdCAgICAgICAgICAgICsrdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICBpZiAoIXRlcm1pbmF0ZWQpIHtcblx0ICAgICAgICAgICAgICAgIHN3aXRjaCAocmVzdWx0Lmxlbmd0aCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiAnJiMxMjM7J1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljID0gKGNoID09PSAnIycpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1lcmljKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuICcmI3g0MTsnXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXggPSAoY2ggPT09ICd4Jyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGhleCB8fCBjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQoY2guY2hhckNvZGVBdCgwKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljID0gbnVtZXJpYyAmJiAhaGV4O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgIShudW1lcmljICYmICFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQoY2guY2hhckNvZGVBdCgwKSkpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmICEoaGV4ICYmICFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNIZXhEaWdpdChjaC5jaGFyQ29kZUF0KDApKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh2YWxpZCAmJiB0ZXJtaW5hdGVkICYmIHJlc3VsdC5sZW5ndGggPiAyKSB7XG5cdCAgICAgICAgICAgIC8vIGUuZy4gJyYjeDQxOycgYmVjb21lcyBqdXN0ICcjeDQxJ1xuXHQgICAgICAgICAgICB2YXIgc3RyID0gcmVzdWx0LnN1YnN0cigxLCByZXN1bHQubGVuZ3RoIC0gMik7XG5cdCAgICAgICAgICAgIGlmIChudW1lcmljICYmIHN0ci5sZW5ndGggPiAxKSB7XG5cdCAgICAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDEwKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoaGV4ICYmIHN0ci5sZW5ndGggPiAyKSB7XG5cdCAgICAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KCcwJyArIHN0ci5zdWJzdHIoMSksIDE2KSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoIW51bWVyaWMgJiYgIWhleCAmJiB4aHRtbF9lbnRpdGllc18xLlhIVE1MRW50aXRpZXNbc3RyXSkge1xuXHQgICAgICAgICAgICAgICAgcmVzdWx0ID0geGh0bWxfZW50aXRpZXNfMS5YSFRNTEVudGl0aWVzW3N0cl07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdDtcblx0ICAgIH07XG5cdCAgICAvLyBTY2FuIHRoZSBuZXh0IEpTWCB0b2tlbi4gVGhpcyByZXBsYWNlcyBTY2FubmVyI2xleCB3aGVuIGluIEpTWCBtb2RlLlxuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5sZXhKU1ggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNwID0gdGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuc2Nhbm5lci5pbmRleCk7XG5cdCAgICAgICAgLy8gPCA+IC8gOiA9IHsgfVxuXHQgICAgICAgIGlmIChjcCA9PT0gNjAgfHwgY3AgPT09IDYyIHx8IGNwID09PSA0NyB8fCBjcCA9PT0gNTggfHwgY3AgPT09IDYxIHx8IGNwID09PSAxMjMgfHwgY3AgPT09IDEyNSkge1xuXHQgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleCsrXTtcblx0ICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgIHR5cGU6IDcgLyogUHVuY3R1YXRvciAqLyxcblx0ICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcblx0ICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLnNjYW5uZXIubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuc2Nhbm5lci5pbmRleCAtIDEsXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuc2Nhbm5lci5pbmRleFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBcIiAnXG5cdCAgICAgICAgaWYgKGNwID09PSAzNCB8fCBjcCA9PT0gMzkpIHtcblx0ICAgICAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICB2YXIgcXVvdGUgPSB0aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleCsrXTtcblx0ICAgICAgICAgICAgdmFyIHN0ciA9ICcnO1xuXHQgICAgICAgICAgICB3aGlsZSAoIXRoaXMuc2Nhbm5lci5lb2YoKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zY2FubmVyLnNvdXJjZVt0aGlzLnNjYW5uZXIuaW5kZXgrK107XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09IHF1b3RlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gJyYnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RyICs9IHRoaXMuc2NhblhIVE1MRW50aXR5KHF1b3RlKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0ciArPSBjaDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogOCAvKiBTdHJpbmdMaXRlcmFsICovLFxuXHQgICAgICAgICAgICAgICAgdmFsdWU6IHN0cixcblx0ICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLnNjYW5uZXIubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnNjYW5uZXIuaW5kZXhcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gLi4uIG9yIC5cblx0ICAgICAgICBpZiAoY3AgPT09IDQ2KSB7XG5cdCAgICAgICAgICAgIHZhciBuMSA9IHRoaXMuc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLnNjYW5uZXIuaW5kZXggKyAxKTtcblx0ICAgICAgICAgICAgdmFyIG4yID0gdGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuc2Nhbm5lci5pbmRleCArIDIpO1xuXHQgICAgICAgICAgICB2YXIgdmFsdWUgPSAobjEgPT09IDQ2ICYmIG4yID09PSA0NikgPyAnLi4uJyA6ICcuJztcblx0ICAgICAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICB0aGlzLnNjYW5uZXIuaW5kZXggKz0gdmFsdWUubGVuZ3RoO1xuXHQgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogNyAvKiBQdW5jdHVhdG9yICovLFxuXHQgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuXHQgICAgICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMuc2Nhbm5lci5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuc2Nhbm5lci5pbmRleFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBgXG5cdCAgICAgICAgaWYgKGNwID09PSA5Nikge1xuXHQgICAgICAgICAgICAvLyBPbmx5IHBsYWNlaG9sZGVyLCBzaW5jZSBpdCB3aWxsIGJlIHJlc2Nhbm5lZCBhcyBhIHJlYWwgYXNzaWdubWVudCBleHByZXNzaW9uLlxuXHQgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogMTAgLyogVGVtcGxhdGUgKi8sXG5cdCAgICAgICAgICAgICAgICB2YWx1ZTogJycsXG5cdCAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5zY2FubmVyLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnNjYW5uZXIuaW5kZXgsXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuc2Nhbm5lci5pbmRleFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBJZGVudGlmZXIgY2FuIG5vdCBjb250YWluIGJhY2tzbGFzaCAoY2hhciBjb2RlIDkyKS5cblx0ICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KGNwKSAmJiAoY3AgIT09IDkyKSkge1xuXHQgICAgICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgICsrdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICB3aGlsZSAoIXRoaXMuc2Nhbm5lci5lb2YoKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuc2Nhbm5lci5pbmRleCk7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclBhcnQoY2gpICYmIChjaCAhPT0gOTIpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gNDUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBIeXBoZW4gKGNoYXIgY29kZSA0NSkgY2FuIGJlIHBhcnQgb2YgYW4gaWRlbnRpZmllci5cblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuc2Nhbm5lci5zb3VyY2Uuc2xpY2Uoc3RhcnQsIHRoaXMuc2Nhbm5lci5pbmRleCk7XG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiAxMDAgLyogSWRlbnRpZmllciAqLyxcblx0ICAgICAgICAgICAgICAgIHZhbHVlOiBpZCxcblx0ICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLnNjYW5uZXIubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnNjYW5uZXIuaW5kZXhcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuc2Nhbm5lci5sZXgoKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLm5leHRKU1hUb2tlbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmNvbGxlY3RDb21tZW50cygpO1xuXHQgICAgICAgIHRoaXMuc3RhcnRNYXJrZXIuaW5kZXggPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlci5saW5lID0gdGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlci5jb2x1bW4gPSB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0O1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubGV4SlNYKCk7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmluZGV4ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlci5saW5lID0gdGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmNvbHVtbiA9IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnQ7XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLnRva2Vucykge1xuXHQgICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMuY29udmVydFRva2VuKHRva2VuKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLm5leHRKU1hUZXh0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuc3RhcnRNYXJrZXIuaW5kZXggPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlci5saW5lID0gdGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlci5jb2x1bW4gPSB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0O1xuXHQgICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICB2YXIgdGV4dCA9ICcnO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4XTtcblx0ICAgICAgICAgICAgaWYgKGNoID09PSAneycgfHwgY2ggPT09ICc8Jykge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgKyt0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIHRleHQgKz0gY2g7XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgKyt0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgdGhpcy5zY2FubmVyLnNvdXJjZVt0aGlzLnNjYW5uZXIuaW5kZXhdID09PSAnXFxuJykge1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmxpbmVTdGFydCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuaW5kZXggPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuY29sdW1uID0gdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydDtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB7XG5cdCAgICAgICAgICAgIHR5cGU6IDEwMSAvKiBUZXh0ICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogdGV4dCxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5zY2FubmVyLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuc2Nhbm5lci5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICAgICAgaWYgKCh0ZXh0Lmxlbmd0aCA+IDApICYmIHRoaXMuY29uZmlnLnRva2Vucykge1xuXHQgICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMuY29udmVydFRva2VuKHRva2VuKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBlZWtKU1hUb2tlbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnNjYW5uZXIuc2F2ZVN0YXRlKCk7XG5cdCAgICAgICAgdGhpcy5zY2FubmVyLnNjYW5Db21tZW50cygpO1xuXHQgICAgICAgIHZhciBuZXh0ID0gdGhpcy5sZXhKU1goKTtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIucmVzdG9yZVN0YXRlKHN0YXRlKTtcblx0ICAgICAgICByZXR1cm4gbmV4dDtcblx0ICAgIH07XG5cdCAgICAvLyBFeHBlY3QgdGhlIG5leHQgSlNYIHRva2VuIHRvIG1hdGNoIHRoZSBzcGVjaWZpZWQgcHVuY3R1YXRvci5cblx0ICAgIC8vIElmIG5vdCwgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLlxuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5leHBlY3RKU1ggPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRKU1hUb2tlbigpO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlICE9PSA3IC8qIFB1bmN0dWF0b3IgKi8gfHwgdG9rZW4udmFsdWUgIT09IHZhbHVlKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmV4dCBKU1ggdG9rZW4gbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHB1bmN0dWF0b3IuXG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLm1hdGNoSlNYID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgdmFyIG5leHQgPSB0aGlzLnBlZWtKU1hUb2tlbigpO1xuXHQgICAgICAgIHJldHVybiBuZXh0LnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiBuZXh0LnZhbHVlID09PSB2YWx1ZTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYSWRlbnRpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYTm9kZSgpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dEpTWFRva2VuKCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09IDEwMCAvKiBJZGVudGlmaWVyICovKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hJZGVudGlmaWVyKHRva2VuLnZhbHVlKSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEVsZW1lbnROYW1lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdmFyIGVsZW1lbnROYW1lID0gdGhpcy5wYXJzZUpTWElkZW50aWZpZXIoKTtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaEpTWCgnOicpKSB7XG5cdCAgICAgICAgICAgIHZhciBuYW1lc3BhY2UgPSBlbGVtZW50TmFtZTtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJzonKTtcblx0ICAgICAgICAgICAgdmFyIG5hbWVfMSA9IHRoaXMucGFyc2VKU1hJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIGVsZW1lbnROYW1lID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hOYW1lc3BhY2VkTmFtZShuYW1lc3BhY2UsIG5hbWVfMSkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoSlNYKCcuJykpIHtcblx0ICAgICAgICAgICAgd2hpbGUgKHRoaXMubWF0Y2hKU1goJy4nKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIG9iamVjdCA9IGVsZW1lbnROYW1lO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJy4nKTtcblx0ICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IHRoaXMucGFyc2VKU1hJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYTWVtYmVyRXhwcmVzc2lvbihvYmplY3QsIHByb3BlcnR5KSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGVsZW1lbnROYW1lO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hBdHRyaWJ1dGVOYW1lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWU7XG5cdCAgICAgICAgdmFyIGlkZW50aWZpZXIgPSB0aGlzLnBhcnNlSlNYSWRlbnRpZmllcigpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoSlNYKCc6JykpIHtcblx0ICAgICAgICAgICAgdmFyIG5hbWVzcGFjZSA9IGlkZW50aWZpZXI7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0SlNYKCc6Jyk7XG5cdCAgICAgICAgICAgIHZhciBuYW1lXzIgPSB0aGlzLnBhcnNlSlNYSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hOYW1lc3BhY2VkTmFtZShuYW1lc3BhY2UsIG5hbWVfMikpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgYXR0cmlidXRlTmFtZSA9IGlkZW50aWZpZXI7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hTdHJpbmdMaXRlcmFsQXR0cmlidXRlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0SlNYVG9rZW4oKTtcblx0ICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gOCAvKiBTdHJpbmdMaXRlcmFsICovKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcmF3ID0gdGhpcy5nZXRUb2tlblJhdyh0b2tlbik7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuTGl0ZXJhbCh0b2tlbi52YWx1ZSwgcmF3KSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEV4cHJlc3Npb25BdHRyaWJ1dGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgneycpO1xuXHQgICAgICAgIHRoaXMuZmluaXNoSlNYKCk7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IoJ0pTWCBhdHRyaWJ1dGVzIG11c3Qgb25seSBiZSBhc3NpZ25lZCBhIG5vbi1lbXB0eSBleHByZXNzaW9uJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBleHByZXNzaW9uID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdGhpcy5yZWVudGVySlNYKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYRXhwcmVzc2lvbkNvbnRhaW5lcihleHByZXNzaW9uKSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEF0dHJpYnV0ZVZhbHVlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLm1hdGNoSlNYKCd7JykgPyB0aGlzLnBhcnNlSlNYRXhwcmVzc2lvbkF0dHJpYnV0ZSgpIDpcblx0ICAgICAgICAgICAgdGhpcy5tYXRjaEpTWCgnPCcpID8gdGhpcy5wYXJzZUpTWEVsZW1lbnQoKSA6IHRoaXMucGFyc2VKU1hTdHJpbmdMaXRlcmFsQXR0cmlidXRlKCk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWE5hbWVWYWx1ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYTm9kZSgpO1xuXHQgICAgICAgIHZhciBuYW1lID0gdGhpcy5wYXJzZUpTWEF0dHJpYnV0ZU5hbWUoKTtcblx0ICAgICAgICB2YXIgdmFsdWUgPSBudWxsO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoSlNYKCc9JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJz0nKTtcblx0ICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlSlNYQXR0cmlidXRlVmFsdWUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYQXR0cmlidXRlKG5hbWUsIHZhbHVlKSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWFNwcmVhZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0SlNYKCd7Jyk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJy4uLicpO1xuXHQgICAgICAgIHRoaXMuZmluaXNoSlNYKCk7XG5cdCAgICAgICAgdmFyIGFyZ3VtZW50ID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdGhpcy5yZWVudGVySlNYKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYU3ByZWFkQXR0cmlidXRlKGFyZ3VtZW50KSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBbXTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2hKU1goJy8nKSAmJiAhdGhpcy5tYXRjaEpTWCgnPicpKSB7XG5cdCAgICAgICAgICAgIHZhciBhdHRyaWJ1dGUgPSB0aGlzLm1hdGNoSlNYKCd7JykgPyB0aGlzLnBhcnNlSlNYU3ByZWFkQXR0cmlidXRlKCkgOlxuXHQgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUpTWE5hbWVWYWx1ZUF0dHJpYnV0ZSgpO1xuXHQgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWE9wZW5pbmdFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJzwnKTtcblx0ICAgICAgICB2YXIgbmFtZSA9IHRoaXMucGFyc2VKU1hFbGVtZW50TmFtZSgpO1xuXHQgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5wYXJzZUpTWEF0dHJpYnV0ZXMoKTtcblx0ICAgICAgICB2YXIgc2VsZkNsb3NpbmcgPSB0aGlzLm1hdGNoSlNYKCcvJyk7XG5cdCAgICAgICAgaWYgKHNlbGZDbG9zaW5nKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0SlNYKCcvJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0SlNYKCc+Jyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYT3BlbmluZ0VsZW1lbnQobmFtZSwgc2VsZkNsb3NpbmcsIGF0dHJpYnV0ZXMpKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYQm91bmRhcnlFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJzwnKTtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaEpTWCgnLycpKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0SlNYKCcvJyk7XG5cdCAgICAgICAgICAgIHZhciBuYW1lXzMgPSB0aGlzLnBhcnNlSlNYRWxlbWVudE5hbWUoKTtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJz4nKTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYQ2xvc2luZ0VsZW1lbnQobmFtZV8zKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBuYW1lID0gdGhpcy5wYXJzZUpTWEVsZW1lbnROYW1lKCk7XG5cdCAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLnBhcnNlSlNYQXR0cmlidXRlcygpO1xuXHQgICAgICAgIHZhciBzZWxmQ2xvc2luZyA9IHRoaXMubWF0Y2hKU1goJy8nKTtcblx0ICAgICAgICBpZiAoc2VsZkNsb3NpbmcpIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJy8nKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJz4nKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hPcGVuaW5nRWxlbWVudChuYW1lLCBzZWxmQ2xvc2luZywgYXR0cmlidXRlcykpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hFbXB0eUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWENoaWxkTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuY29sbGVjdENvbW1lbnRzKCk7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmluZGV4ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlci5saW5lID0gdGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmNvbHVtbiA9IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYRW1wdHlFeHByZXNzaW9uKCkpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hFeHByZXNzaW9uQ29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJ3snKTtcblx0ICAgICAgICB2YXIgZXhwcmVzc2lvbjtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaEpTWCgnfScpKSB7XG5cdCAgICAgICAgICAgIGV4cHJlc3Npb24gPSB0aGlzLnBhcnNlSlNYRW1wdHlFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0SlNYKCd9Jyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmZpbmlzaEpTWCgpO1xuXHQgICAgICAgICAgICBleHByZXNzaW9uID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgIHRoaXMucmVlbnRlckpTWCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hFeHByZXNzaW9uQ29udGFpbmVyKGV4cHJlc3Npb24pKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYQ2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNoaWxkcmVuID0gW107XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKCkpIHtcblx0ICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWENoaWxkTm9kZSgpO1xuXHQgICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRKU1hUZXh0KCk7XG5cdCAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8IHRva2VuLmVuZCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hUZXh0KHRva2VuLnZhbHVlLCByYXcpKTtcblx0ICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleF0gPT09ICd7Jykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMucGFyc2VKU1hFeHByZXNzaW9uQ29udGFpbmVyKCk7XG5cdCAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGNvbnRhaW5lcik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gY2hpbGRyZW47XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNvbXBsZXhKU1hFbGVtZW50ID0gZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgdmFyIHN0YWNrID0gW107XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKCkpIHtcblx0ICAgICAgICAgICAgZWwuY2hpbGRyZW4gPSBlbC5jaGlsZHJlbi5jb25jYXQodGhpcy5wYXJzZUpTWENoaWxkcmVuKCkpO1xuXHQgICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYQ2hpbGROb2RlKCk7XG5cdCAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5wYXJzZUpTWEJvdW5kYXJ5RWxlbWVudCgpO1xuXHQgICAgICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWE9wZW5pbmdFbGVtZW50KSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgb3BlbmluZyA9IGVsZW1lbnQ7XG5cdCAgICAgICAgICAgICAgICBpZiAob3BlbmluZy5zZWxmQ2xvc2luZykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYRWxlbWVudChvcGVuaW5nLCBbXSwgbnVsbCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIGVsLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChlbCk7XG5cdCAgICAgICAgICAgICAgICAgICAgZWwgPSB7IG5vZGU6IG5vZGUsIG9wZW5pbmc6IG9wZW5pbmcsIGNsb3Npbmc6IG51bGwsIGNoaWxkcmVuOiBbXSB9O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYQ2xvc2luZ0VsZW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgIGVsLmNsb3NpbmcgPSBlbGVtZW50O1xuXHQgICAgICAgICAgICAgICAgdmFyIG9wZW5fMSA9IGdldFF1YWxpZmllZEVsZW1lbnROYW1lKGVsLm9wZW5pbmcubmFtZSk7XG5cdCAgICAgICAgICAgICAgICB2YXIgY2xvc2VfMSA9IGdldFF1YWxpZmllZEVsZW1lbnROYW1lKGVsLmNsb3NpbmcubmFtZSk7XG5cdCAgICAgICAgICAgICAgICBpZiAob3Blbl8xICE9PSBjbG9zZV8xKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKCdFeHBlY3RlZCBjb3JyZXNwb25kaW5nIEpTWCBjbG9zaW5nIHRhZyBmb3IgJTAnLCBvcGVuXzEpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmZpbmFsaXplKGVsLm5vZGUsIG5ldyBKU1hOb2RlLkpTWEVsZW1lbnQoZWwub3BlbmluZywgZWwuY2hpbGRyZW4sIGVsLmNsb3NpbmcpKTtcblx0ICAgICAgICAgICAgICAgICAgICBlbCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuXHQgICAgICAgICAgICAgICAgICAgIGVsLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGVsO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdmFyIG9wZW5pbmcgPSB0aGlzLnBhcnNlSlNYT3BlbmluZ0VsZW1lbnQoKTtcblx0ICAgICAgICB2YXIgY2hpbGRyZW4gPSBbXTtcblx0ICAgICAgICB2YXIgY2xvc2luZyA9IG51bGw7XG5cdCAgICAgICAgaWYgKCFvcGVuaW5nLnNlbGZDbG9zaW5nKSB7XG5cdCAgICAgICAgICAgIHZhciBlbCA9IHRoaXMucGFyc2VDb21wbGV4SlNYRWxlbWVudCh7IG5vZGU6IG5vZGUsIG9wZW5pbmc6IG9wZW5pbmcsIGNsb3Npbmc6IGNsb3NpbmcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9KTtcblx0ICAgICAgICAgICAgY2hpbGRyZW4gPSBlbC5jaGlsZHJlbjtcblx0ICAgICAgICAgICAgY2xvc2luZyA9IGVsLmNsb3Npbmc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWEVsZW1lbnQob3BlbmluZywgY2hpbGRyZW4sIGNsb3NpbmcpKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYUm9vdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAvLyBQb3AgdGhlIG9wZW5pbmcgJzwnIGFkZGVkIGZyb20gdGhlIGxvb2thaGVhZC5cblx0ICAgICAgICBpZiAodGhpcy5jb25maWcudG9rZW5zKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9rZW5zLnBvcCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnN0YXJ0SlNYKCk7XG5cdCAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLnBhcnNlSlNYRWxlbWVudCgpO1xuXHQgICAgICAgIHRoaXMuZmluaXNoSlNYKCk7XG5cdCAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5pc1N0YXJ0T2ZFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmlzU3RhcnRPZkV4cHJlc3Npb24uY2FsbCh0aGlzKSB8fCB0aGlzLm1hdGNoKCc8Jyk7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIEpTWFBhcnNlcjtcblx0fShwYXJzZXJfMS5QYXJzZXIpKTtcblx0ZXhwb3J0cy5KU1hQYXJzZXIgPSBKU1hQYXJzZXI7XG5cblxuLyoqKi8gfSxcbi8qIDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdC8vIFNlZSBhbHNvIHRvb2xzL2dlbmVyYXRlLXVuaWNvZGUtcmVnZXguanMuXG5cdHZhciBSZWdleCA9IHtcblx0ICAgIC8vIFVuaWNvZGUgdjguMC4wIE5vbkFzY2lpSWRlbnRpZmllclN0YXJ0OlxuXHQgICAgTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQ6IC9bXFx4QUFcXHhCNVxceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzNzAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM3RlxcdTAzODZcXHUwMzg4LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4QS1cXHUwNTJGXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MjAtXFx1MDY0QVxcdTA2NkVcXHUwNjZGXFx1MDY3MS1cXHUwNkQzXFx1MDZENVxcdTA2RTVcXHUwNkU2XFx1MDZFRVxcdTA2RUZcXHUwNkZBLVxcdTA2RkNcXHUwNkZGXFx1MDcxMFxcdTA3MTItXFx1MDcyRlxcdTA3NEQtXFx1MDdBNVxcdTA3QjFcXHUwN0NBLVxcdTA3RUFcXHUwN0Y0XFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MTVcXHUwODFBXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwOEEwLVxcdTA4QjRcXHUwOTA0LVxcdTA5MzlcXHUwOTNEXFx1MDk1MFxcdTA5NTgtXFx1MDk2MVxcdTA5NzEtXFx1MDk4MFxcdTA5ODUtXFx1MDk4Q1xcdTA5OEZcXHUwOTkwXFx1MDk5My1cXHUwOUE4XFx1MDlBQS1cXHUwOUIwXFx1MDlCMlxcdTA5QjYtXFx1MDlCOVxcdTA5QkRcXHUwOUNFXFx1MDlEQ1xcdTA5RERcXHUwOURGLVxcdTA5RTFcXHUwOUYwXFx1MDlGMVxcdTBBMDUtXFx1MEEwQVxcdTBBMEZcXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMlxcdTBBMzNcXHUwQTM1XFx1MEEzNlxcdTBBMzhcXHUwQTM5XFx1MEE1OS1cXHUwQTVDXFx1MEE1RVxcdTBBNzItXFx1MEE3NFxcdTBBODUtXFx1MEE4RFxcdTBBOEYtXFx1MEE5MVxcdTBBOTMtXFx1MEFBOFxcdTBBQUEtXFx1MEFCMFxcdTBBQjJcXHUwQUIzXFx1MEFCNS1cXHUwQUI5XFx1MEFCRFxcdTBBRDBcXHUwQUUwXFx1MEFFMVxcdTBBRjlcXHUwQjA1LVxcdTBCMENcXHUwQjBGXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzJcXHUwQjMzXFx1MEIzNS1cXHUwQjM5XFx1MEIzRFxcdTBCNUNcXHUwQjVEXFx1MEI1Ri1cXHUwQjYxXFx1MEI3MVxcdTBCODNcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5XFx1MEI5QVxcdTBCOUNcXHUwQjlFXFx1MEI5RlxcdTBCQTNcXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI5XFx1MEJEMFxcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzOVxcdTBDM0RcXHUwQzU4LVxcdTBDNUFcXHUwQzYwXFx1MEM2MVxcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkRcXHUwQ0RFXFx1MENFMFxcdTBDRTFcXHUwQ0YxXFx1MENGMlxcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0RcXHUwRDRFXFx1MEQ1Ri1cXHUwRDYxXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4NS1cXHUwRDk2XFx1MEQ5QS1cXHUwREIxXFx1MERCMy1cXHUwREJCXFx1MERCRFxcdTBEQzAtXFx1MERDNlxcdTBFMDEtXFx1MEUzMFxcdTBFMzJcXHUwRTMzXFx1MEU0MC1cXHUwRTQ2XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjBcXHUwRUIyXFx1MEVCM1xcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGNDAtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGODgtXFx1MEY4Q1xcdTEwMDAtXFx1MTAyQVxcdTEwM0ZcXHUxMDUwLVxcdTEwNTVcXHUxMDVBLVxcdTEwNURcXHUxMDYxXFx1MTA2NVxcdTEwNjZcXHUxMDZFLVxcdTEwNzBcXHUxMDc1LVxcdTEwODFcXHUxMDhFXFx1MTBBMC1cXHUxMEM1XFx1MTBDN1xcdTEwQ0RcXHUxMEQwLVxcdTEwRkFcXHUxMEZDLVxcdTEyNDhcXHUxMjRBLVxcdTEyNERcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1QS1cXHUxMjVEXFx1MTI2MC1cXHUxMjg4XFx1MTI4QS1cXHUxMjhEXFx1MTI5MC1cXHUxMkIwXFx1MTJCMi1cXHUxMkI1XFx1MTJCOC1cXHUxMkJFXFx1MTJDMFxcdTEyQzItXFx1MTJDNVxcdTEyQzgtXFx1MTJENlxcdTEyRDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1QVxcdTEzODAtXFx1MTM4RlxcdTEzQTAtXFx1MTNGNVxcdTEzRjgtXFx1MTNGRFxcdTE0MDEtXFx1MTY2Q1xcdTE2NkYtXFx1MTY3RlxcdTE2ODEtXFx1MTY5QVxcdTE2QTAtXFx1MTZFQVxcdTE2RUUtXFx1MTZGOFxcdTE3MDAtXFx1MTcwQ1xcdTE3MEUtXFx1MTcxMVxcdTE3MjAtXFx1MTczMVxcdTE3NDAtXFx1MTc1MVxcdTE3NjAtXFx1MTc2Q1xcdTE3NkUtXFx1MTc3MFxcdTE3ODAtXFx1MTdCM1xcdTE3RDdcXHUxN0RDXFx1MTgyMC1cXHUxODc3XFx1MTg4MC1cXHUxOEE4XFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5NTAtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QjAtXFx1MTlDOVxcdTFBMDAtXFx1MUExNlxcdTFBMjAtXFx1MUE1NFxcdTFBQTdcXHUxQjA1LVxcdTFCMzNcXHUxQjQ1LVxcdTFCNEJcXHUxQjgzLVxcdTFCQTBcXHUxQkFFXFx1MUJBRlxcdTFCQkEtXFx1MUJFNVxcdTFDMDAtXFx1MUMyM1xcdTFDNEQtXFx1MUM0RlxcdTFDNUEtXFx1MUM3RFxcdTFDRTktXFx1MUNFQ1xcdTFDRUUtXFx1MUNGMVxcdTFDRjVcXHUxQ0Y2XFx1MUQwMC1cXHUxREJGXFx1MUUwMC1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjEwMlxcdTIxMDdcXHUyMTBBLVxcdTIxMTNcXHUyMTE1XFx1MjExOC1cXHUyMTFEXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyQS1cXHUyMTM5XFx1MjEzQy1cXHUyMTNGXFx1MjE0NS1cXHUyMTQ5XFx1MjE0RVxcdTIxNjAtXFx1MjE4OFxcdTJDMDAtXFx1MkMyRVxcdTJDMzAtXFx1MkM1RVxcdTJDNjAtXFx1MkNFNFxcdTJDRUItXFx1MkNFRVxcdTJDRjJcXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ4MC1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDI5XFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5Qi1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OURcXHVBNkEwLVxcdUE2RUZcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QURcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MEEtXFx1QTkyNVxcdUE5MzAtXFx1QTk0NlxcdUE5NjAtXFx1QTk3Q1xcdUE5ODQtXFx1QTlCMlxcdUE5Q0ZcXHVBOUUwLVxcdUE5RTRcXHVBOUU2LVxcdUE5RUZcXHVBOUZBLVxcdUE5RkVcXHVBQTAwLVxcdUFBMjhcXHVBQTQwLVxcdUFBNDJcXHVBQTQ0LVxcdUFBNEJcXHVBQTYwLVxcdUFBNzZcXHVBQTdBXFx1QUE3RS1cXHVBQUFGXFx1QUFCMVxcdUFBQjVcXHVBQUI2XFx1QUFCOS1cXHVBQUJEXFx1QUFDMFxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUFcXHVBQUYyLVxcdUFBRjRcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRTJcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFEXFx1RkIxRi1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjIxLVxcdUZGM0FcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdfFxcdUQ4MDBbXFx1REMwMC1cXHVEQzBCXFx1REMwRC1cXHVEQzI2XFx1REMyOC1cXHVEQzNBXFx1REMzQ1xcdURDM0RcXHVEQzNGLVxcdURDNERcXHVEQzUwLVxcdURDNURcXHVEQzgwLVxcdURDRkFcXHVERDQwLVxcdURENzRcXHVERTgwLVxcdURFOUNcXHVERUEwLVxcdURFRDBcXHVERjAwLVxcdURGMUZcXHVERjMwLVxcdURGNEFcXHVERjUwLVxcdURGNzVcXHVERjgwLVxcdURGOURcXHVERkEwLVxcdURGQzNcXHVERkM4LVxcdURGQ0ZcXHVERkQxLVxcdURGRDVdfFxcdUQ4MDFbXFx1REMwMC1cXHVEQzlEXFx1REQwMC1cXHVERDI3XFx1REQzMC1cXHVERDYzXFx1REUwMC1cXHVERjM2XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjY3XXxcXHVEODAyW1xcdURDMDAtXFx1REMwNVxcdURDMDhcXHVEQzBBLVxcdURDMzVcXHVEQzM3XFx1REMzOFxcdURDM0NcXHVEQzNGLVxcdURDNTVcXHVEQzYwLVxcdURDNzZcXHVEQzgwLVxcdURDOUVcXHVEQ0UwLVxcdURDRjJcXHVEQ0Y0XFx1RENGNVxcdUREMDAtXFx1REQxNVxcdUREMjAtXFx1REQzOVxcdUREODAtXFx1RERCN1xcdUREQkVcXHVEREJGXFx1REUwMFxcdURFMTAtXFx1REUxM1xcdURFMTUtXFx1REUxN1xcdURFMTktXFx1REUzM1xcdURFNjAtXFx1REU3Q1xcdURFODAtXFx1REU5Q1xcdURFQzAtXFx1REVDN1xcdURFQzktXFx1REVFNFxcdURGMDAtXFx1REYzNVxcdURGNDAtXFx1REY1NVxcdURGNjAtXFx1REY3MlxcdURGODAtXFx1REY5MV18XFx1RDgwM1tcXHVEQzAwLVxcdURDNDhcXHVEQzgwLVxcdURDQjJcXHVEQ0MwLVxcdURDRjJdfFxcdUQ4MDRbXFx1REMwMy1cXHVEQzM3XFx1REM4My1cXHVEQ0FGXFx1RENEMC1cXHVEQ0U4XFx1REQwMy1cXHVERDI2XFx1REQ1MC1cXHVERDcyXFx1REQ3NlxcdUREODMtXFx1RERCMlxcdUREQzEtXFx1RERDNFxcdUREREFcXHVERERDXFx1REUwMC1cXHVERTExXFx1REUxMy1cXHVERTJCXFx1REU4MC1cXHVERTg2XFx1REU4OFxcdURFOEEtXFx1REU4RFxcdURFOEYtXFx1REU5RFxcdURFOUYtXFx1REVBOFxcdURFQjAtXFx1REVERVxcdURGMDUtXFx1REYwQ1xcdURGMEZcXHVERjEwXFx1REYxMy1cXHVERjI4XFx1REYyQS1cXHVERjMwXFx1REYzMlxcdURGMzNcXHVERjM1LVxcdURGMzlcXHVERjNEXFx1REY1MFxcdURGNUQtXFx1REY2MV18XFx1RDgwNVtcXHVEQzgwLVxcdURDQUZcXHVEQ0M0XFx1RENDNVxcdURDQzdcXHVERDgwLVxcdUREQUVcXHVEREQ4LVxcdUREREJcXHVERTAwLVxcdURFMkZcXHVERTQ0XFx1REU4MC1cXHVERUFBXFx1REYwMC1cXHVERjE5XXxcXHVEODA2W1xcdURDQTAtXFx1RENERlxcdURDRkZcXHVERUMwLVxcdURFRjhdfFxcdUQ4MDhbXFx1REMwMC1cXHVERjk5XXxcXHVEODA5W1xcdURDMDAtXFx1REM2RVxcdURDODAtXFx1REQ0M118W1xcdUQ4MENcXHVEODQwLVxcdUQ4NjhcXHVEODZBLVxcdUQ4NkNcXHVEODZGLVxcdUQ4NzJdW1xcdURDMDAtXFx1REZGRl18XFx1RDgwRFtcXHVEQzAwLVxcdURDMkVdfFxcdUQ4MTFbXFx1REMwMC1cXHVERTQ2XXxcXHVEODFBW1xcdURDMDAtXFx1REUzOFxcdURFNDAtXFx1REU1RVxcdURFRDAtXFx1REVFRFxcdURGMDAtXFx1REYyRlxcdURGNDAtXFx1REY0M1xcdURGNjMtXFx1REY3N1xcdURGN0QtXFx1REY4Rl18XFx1RDgxQltcXHVERjAwLVxcdURGNDRcXHVERjUwXFx1REY5My1cXHVERjlGXXxcXHVEODJDW1xcdURDMDBcXHVEQzAxXXxcXHVEODJGW1xcdURDMDAtXFx1REM2QVxcdURDNzAtXFx1REM3Q1xcdURDODAtXFx1REM4OFxcdURDOTAtXFx1REM5OV18XFx1RDgzNVtcXHVEQzAwLVxcdURDNTRcXHVEQzU2LVxcdURDOUNcXHVEQzlFXFx1REM5RlxcdURDQTJcXHVEQ0E1XFx1RENBNlxcdURDQTktXFx1RENBQ1xcdURDQUUtXFx1RENCOVxcdURDQkJcXHVEQ0JELVxcdURDQzNcXHVEQ0M1LVxcdUREMDVcXHVERDA3LVxcdUREMEFcXHVERDBELVxcdUREMTRcXHVERDE2LVxcdUREMUNcXHVERDFFLVxcdUREMzlcXHVERDNCLVxcdUREM0VcXHVERDQwLVxcdURENDRcXHVERDQ2XFx1REQ0QS1cXHVERDUwXFx1REQ1Mi1cXHVERUE1XFx1REVBOC1cXHVERUMwXFx1REVDMi1cXHVERURBXFx1REVEQy1cXHVERUZBXFx1REVGQy1cXHVERjE0XFx1REYxNi1cXHVERjM0XFx1REYzNi1cXHVERjRFXFx1REY1MC1cXHVERjZFXFx1REY3MC1cXHVERjg4XFx1REY4QS1cXHVERkE4XFx1REZBQS1cXHVERkMyXFx1REZDNC1cXHVERkNCXXxcXHVEODNBW1xcdURDMDAtXFx1RENDNF18XFx1RDgzQltcXHVERTAwLVxcdURFMDNcXHVERTA1LVxcdURFMUZcXHVERTIxXFx1REUyMlxcdURFMjRcXHVERTI3XFx1REUyOS1cXHVERTMyXFx1REUzNC1cXHVERTM3XFx1REUzOVxcdURFM0JcXHVERTQyXFx1REU0N1xcdURFNDlcXHVERTRCXFx1REU0RC1cXHVERTRGXFx1REU1MVxcdURFNTJcXHVERTU0XFx1REU1N1xcdURFNTlcXHVERTVCXFx1REU1RFxcdURFNUZcXHVERTYxXFx1REU2MlxcdURFNjRcXHVERTY3LVxcdURFNkFcXHVERTZDLVxcdURFNzJcXHVERTc0LVxcdURFNzdcXHVERTc5LVxcdURFN0NcXHVERTdFXFx1REU4MC1cXHVERTg5XFx1REU4Qi1cXHVERTlCXFx1REVBMS1cXHVERUEzXFx1REVBNS1cXHVERUE5XFx1REVBQi1cXHVERUJCXXxcXHVEODY5W1xcdURDMDAtXFx1REVENlxcdURGMDAtXFx1REZGRl18XFx1RDg2RFtcXHVEQzAwLVxcdURGMzRcXHVERjQwLVxcdURGRkZdfFxcdUQ4NkVbXFx1REMwMC1cXHVEQzFEXFx1REMyMC1cXHVERkZGXXxcXHVEODczW1xcdURDMDAtXFx1REVBMV18XFx1RDg3RVtcXHVEQzAwLVxcdURFMURdLyxcblx0ICAgIC8vIFVuaWNvZGUgdjguMC4wIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6XG5cdCAgICBOb25Bc2NpaUlkZW50aWZpZXJQYXJ0OiAvW1xceEFBXFx4QjVcXHhCN1xceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzMDAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM3RlxcdTAzODYtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDgzLVxcdTA0ODdcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDU5MS1cXHUwNUJEXFx1MDVCRlxcdTA1QzFcXHUwNUMyXFx1MDVDNFxcdTA1QzVcXHUwNUM3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYxMC1cXHUwNjFBXFx1MDYyMC1cXHUwNjY5XFx1MDY2RS1cXHUwNkQzXFx1MDZENS1cXHUwNkRDXFx1MDZERi1cXHUwNkU4XFx1MDZFQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTAtXFx1MDc0QVxcdTA3NEQtXFx1MDdCMVxcdTA3QzAtXFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MkRcXHUwODQwLVxcdTA4NUJcXHUwOEEwLVxcdTA4QjRcXHUwOEUzLVxcdTA5NjNcXHUwOTY2LVxcdTA5NkZcXHUwOTcxLVxcdTA5ODNcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJDLVxcdTA5QzRcXHUwOUM3XFx1MDlDOFxcdTA5Q0ItXFx1MDlDRVxcdTA5RDdcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFM1xcdTA5RTYtXFx1MDlGMVxcdTBBMDEtXFx1MEEwM1xcdTBBMDUtXFx1MEEwQVxcdTBBMEZcXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMlxcdTBBMzNcXHUwQTM1XFx1MEEzNlxcdTBBMzhcXHUwQTM5XFx1MEEzQ1xcdTBBM0UtXFx1MEE0MlxcdTBBNDdcXHUwQTQ4XFx1MEE0Qi1cXHUwQTREXFx1MEE1MVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTY2LVxcdTBBNzVcXHUwQTgxLVxcdTBBODNcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkMtXFx1MEFDNVxcdTBBQzctXFx1MEFDOVxcdTBBQ0ItXFx1MEFDRFxcdTBBRDBcXHUwQUUwLVxcdTBBRTNcXHUwQUU2LVxcdTBBRUZcXHUwQUY5XFx1MEIwMS1cXHUwQjAzXFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0MtXFx1MEI0NFxcdTBCNDdcXHUwQjQ4XFx1MEI0Qi1cXHUwQjREXFx1MEI1NlxcdTBCNTdcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2M1xcdTBCNjYtXFx1MEI2RlxcdTBCNzFcXHUwQjgyXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkJFLVxcdTBCQzJcXHUwQkM2LVxcdTBCQzhcXHUwQkNBLVxcdTBCQ0RcXHUwQkQwXFx1MEJEN1xcdTBCRTYtXFx1MEJFRlxcdTBDMDAtXFx1MEMwM1xcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzOVxcdTBDM0QtXFx1MEM0NFxcdTBDNDYtXFx1MEM0OFxcdTBDNEEtXFx1MEM0RFxcdTBDNTVcXHUwQzU2XFx1MEM1OC1cXHUwQzVBXFx1MEM2MC1cXHUwQzYzXFx1MEM2Ni1cXHUwQzZGXFx1MEM4MS1cXHUwQzgzXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCQy1cXHUwQ0M0XFx1MENDNi1cXHUwQ0M4XFx1MENDQS1cXHUwQ0NEXFx1MENENVxcdTBDRDZcXHUwQ0RFXFx1MENFMC1cXHUwQ0UzXFx1MENFNi1cXHUwQ0VGXFx1MENGMVxcdTBDRjJcXHUwRDAxLVxcdTBEMDNcXHUwRDA1LVxcdTBEMENcXHUwRDBFLVxcdTBEMTBcXHUwRDEyLVxcdTBEM0FcXHUwRDNELVxcdTBENDRcXHUwRDQ2LVxcdTBENDhcXHUwRDRBLVxcdTBENEVcXHUwRDU3XFx1MEQ1Ri1cXHUwRDYzXFx1MEQ2Ni1cXHUwRDZGXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4MlxcdTBEODNcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MERDQVxcdTBEQ0YtXFx1MERENFxcdTBERDZcXHUwREQ4LVxcdTBEREZcXHUwREU2LVxcdTBERUZcXHUwREYyXFx1MERGM1xcdTBFMDEtXFx1MEUzQVxcdTBFNDAtXFx1MEU0RVxcdTBFNTAtXFx1MEU1OVxcdTBFODFcXHUwRTgyXFx1MEU4NFxcdTBFODdcXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUFcXHUwRUFCXFx1MEVBRC1cXHUwRUI5XFx1MEVCQi1cXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEVDNlxcdTBFQzgtXFx1MEVDRFxcdTBFRDAtXFx1MEVEOVxcdTBFREMtXFx1MEVERlxcdTBGMDBcXHUwRjE4XFx1MEYxOVxcdTBGMjAtXFx1MEYyOVxcdTBGMzVcXHUwRjM3XFx1MEYzOVxcdTBGM0UtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGNzEtXFx1MEY4NFxcdTBGODYtXFx1MEY5N1xcdTBGOTktXFx1MEZCQ1xcdTBGQzZcXHUxMDAwLVxcdTEwNDlcXHUxMDUwLVxcdTEwOURcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM1RC1cXHUxMzVGXFx1MTM2OS1cXHUxMzcxXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzE0XFx1MTcyMC1cXHUxNzM0XFx1MTc0MC1cXHUxNzUzXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc3MlxcdTE3NzNcXHUxNzgwLVxcdTE3RDNcXHUxN0Q3XFx1MTdEQ1xcdTE3RERcXHUxN0UwLVxcdTE3RTlcXHUxODBCLVxcdTE4MERcXHUxODEwLVxcdTE4MTlcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QUFcXHUxOEIwLVxcdTE4RjVcXHUxOTAwLVxcdTE5MUVcXHUxOTIwLVxcdTE5MkJcXHUxOTMwLVxcdTE5M0JcXHUxOTQ2LVxcdTE5NkRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5QUJcXHUxOUIwLVxcdTE5QzlcXHUxOUQwLVxcdTE5REFcXHUxQTAwLVxcdTFBMUJcXHUxQTIwLVxcdTFBNUVcXHUxQTYwLVxcdTFBN0NcXHUxQTdGLVxcdTFBODlcXHUxQTkwLVxcdTFBOTlcXHUxQUE3XFx1MUFCMC1cXHUxQUJEXFx1MUIwMC1cXHUxQjRCXFx1MUI1MC1cXHUxQjU5XFx1MUI2Qi1cXHUxQjczXFx1MUI4MC1cXHUxQkYzXFx1MUMwMC1cXHUxQzM3XFx1MUM0MC1cXHUxQzQ5XFx1MUM0RC1cXHUxQzdEXFx1MUNEMC1cXHUxQ0QyXFx1MUNENC1cXHUxQ0Y2XFx1MUNGOFxcdTFDRjlcXHUxRDAwLVxcdTFERjVcXHUxREZDLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjAwQ1xcdTIwMERcXHUyMDNGXFx1MjA0MFxcdTIwNTRcXHUyMDcxXFx1MjA3RlxcdTIwOTAtXFx1MjA5Q1xcdTIwRDAtXFx1MjBEQ1xcdTIwRTFcXHUyMEU1LVxcdTIwRjBcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE4LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ3Ri1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MkRFMC1cXHUyREZGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDJGXFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5OS1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjJCXFx1QTY0MC1cXHVBNjZGXFx1QTY3NC1cXHVBNjdEXFx1QTY3Ri1cXHVBNkYxXFx1QTcxNy1cXHVBNzFGXFx1QTcyMi1cXHVBNzg4XFx1QTc4Qi1cXHVBN0FEXFx1QTdCMC1cXHVBN0I3XFx1QTdGNy1cXHVBODI3XFx1QTg0MC1cXHVBODczXFx1QTg4MC1cXHVBOEM0XFx1QThEMC1cXHVBOEQ5XFx1QThFMC1cXHVBOEY3XFx1QThGQlxcdUE4RkRcXHVBOTAwLVxcdUE5MkRcXHVBOTMwLVxcdUE5NTNcXHVBOTYwLVxcdUE5N0NcXHVBOTgwLVxcdUE5QzBcXHVBOUNGLVxcdUE5RDlcXHVBOUUwLVxcdUE5RkVcXHVBQTAwLVxcdUFBMzZcXHVBQTQwLVxcdUFBNERcXHVBQTUwLVxcdUFBNTlcXHVBQTYwLVxcdUFBNzZcXHVBQTdBLVxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUZcXHVBQUYyLVxcdUFBRjZcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRUFcXHVBQkVDXFx1QUJFRFxcdUFCRjAtXFx1QUJGOVxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMUQtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkUwMC1cXHVGRTBGXFx1RkUyMC1cXHVGRTJGXFx1RkUzM1xcdUZFMzRcXHVGRTRELVxcdUZFNEZcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjEwLVxcdUZGMTlcXHVGRjIxLVxcdUZGM0FcXHVGRjNGXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXXxcXHVEODAwW1xcdURDMDAtXFx1REMwQlxcdURDMEQtXFx1REMyNlxcdURDMjgtXFx1REMzQVxcdURDM0NcXHVEQzNEXFx1REMzRi1cXHVEQzREXFx1REM1MC1cXHVEQzVEXFx1REM4MC1cXHVEQ0ZBXFx1REQ0MC1cXHVERDc0XFx1RERGRFxcdURFODAtXFx1REU5Q1xcdURFQTAtXFx1REVEMFxcdURFRTBcXHVERjAwLVxcdURGMUZcXHVERjMwLVxcdURGNEFcXHVERjUwLVxcdURGN0FcXHVERjgwLVxcdURGOURcXHVERkEwLVxcdURGQzNcXHVERkM4LVxcdURGQ0ZcXHVERkQxLVxcdURGRDVdfFxcdUQ4MDFbXFx1REMwMC1cXHVEQzlEXFx1RENBMC1cXHVEQ0E5XFx1REQwMC1cXHVERDI3XFx1REQzMC1cXHVERDYzXFx1REUwMC1cXHVERjM2XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjY3XXxcXHVEODAyW1xcdURDMDAtXFx1REMwNVxcdURDMDhcXHVEQzBBLVxcdURDMzVcXHVEQzM3XFx1REMzOFxcdURDM0NcXHVEQzNGLVxcdURDNTVcXHVEQzYwLVxcdURDNzZcXHVEQzgwLVxcdURDOUVcXHVEQ0UwLVxcdURDRjJcXHVEQ0Y0XFx1RENGNVxcdUREMDAtXFx1REQxNVxcdUREMjAtXFx1REQzOVxcdUREODAtXFx1RERCN1xcdUREQkVcXHVEREJGXFx1REUwMC1cXHVERTAzXFx1REUwNVxcdURFMDZcXHVERTBDLVxcdURFMTNcXHVERTE1LVxcdURFMTdcXHVERTE5LVxcdURFMzNcXHVERTM4LVxcdURFM0FcXHVERTNGXFx1REU2MC1cXHVERTdDXFx1REU4MC1cXHVERTlDXFx1REVDMC1cXHVERUM3XFx1REVDOS1cXHVERUU2XFx1REYwMC1cXHVERjM1XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjcyXFx1REY4MC1cXHVERjkxXXxcXHVEODAzW1xcdURDMDAtXFx1REM0OFxcdURDODAtXFx1RENCMlxcdURDQzAtXFx1RENGMl18XFx1RDgwNFtcXHVEQzAwLVxcdURDNDZcXHVEQzY2LVxcdURDNkZcXHVEQzdGLVxcdURDQkFcXHVEQ0QwLVxcdURDRThcXHVEQ0YwLVxcdURDRjlcXHVERDAwLVxcdUREMzRcXHVERDM2LVxcdUREM0ZcXHVERDUwLVxcdURENzNcXHVERDc2XFx1REQ4MC1cXHVEREM0XFx1RERDQS1cXHVERENDXFx1REREMC1cXHVERERBXFx1REREQ1xcdURFMDAtXFx1REUxMVxcdURFMTMtXFx1REUzN1xcdURFODAtXFx1REU4NlxcdURFODhcXHVERThBLVxcdURFOERcXHVERThGLVxcdURFOURcXHVERTlGLVxcdURFQThcXHVERUIwLVxcdURFRUFcXHVERUYwLVxcdURFRjlcXHVERjAwLVxcdURGMDNcXHVERjA1LVxcdURGMENcXHVERjBGXFx1REYxMFxcdURGMTMtXFx1REYyOFxcdURGMkEtXFx1REYzMFxcdURGMzJcXHVERjMzXFx1REYzNS1cXHVERjM5XFx1REYzQy1cXHVERjQ0XFx1REY0N1xcdURGNDhcXHVERjRCLVxcdURGNERcXHVERjUwXFx1REY1N1xcdURGNUQtXFx1REY2M1xcdURGNjYtXFx1REY2Q1xcdURGNzAtXFx1REY3NF18XFx1RDgwNVtcXHVEQzgwLVxcdURDQzVcXHVEQ0M3XFx1RENEMC1cXHVEQ0Q5XFx1REQ4MC1cXHVEREI1XFx1RERCOC1cXHVEREMwXFx1REREOC1cXHVEREREXFx1REUwMC1cXHVERTQwXFx1REU0NFxcdURFNTAtXFx1REU1OVxcdURFODAtXFx1REVCN1xcdURFQzAtXFx1REVDOVxcdURGMDAtXFx1REYxOVxcdURGMUQtXFx1REYyQlxcdURGMzAtXFx1REYzOV18XFx1RDgwNltcXHVEQ0EwLVxcdURDRTlcXHVEQ0ZGXFx1REVDMC1cXHVERUY4XXxcXHVEODA4W1xcdURDMDAtXFx1REY5OV18XFx1RDgwOVtcXHVEQzAwLVxcdURDNkVcXHVEQzgwLVxcdURENDNdfFtcXHVEODBDXFx1RDg0MC1cXHVEODY4XFx1RDg2QS1cXHVEODZDXFx1RDg2Ri1cXHVEODcyXVtcXHVEQzAwLVxcdURGRkZdfFxcdUQ4MERbXFx1REMwMC1cXHVEQzJFXXxcXHVEODExW1xcdURDMDAtXFx1REU0Nl18XFx1RDgxQVtcXHVEQzAwLVxcdURFMzhcXHVERTQwLVxcdURFNUVcXHVERTYwLVxcdURFNjlcXHVERUQwLVxcdURFRURcXHVERUYwLVxcdURFRjRcXHVERjAwLVxcdURGMzZcXHVERjQwLVxcdURGNDNcXHVERjUwLVxcdURGNTlcXHVERjYzLVxcdURGNzdcXHVERjdELVxcdURGOEZdfFxcdUQ4MUJbXFx1REYwMC1cXHVERjQ0XFx1REY1MC1cXHVERjdFXFx1REY4Ri1cXHVERjlGXXxcXHVEODJDW1xcdURDMDBcXHVEQzAxXXxcXHVEODJGW1xcdURDMDAtXFx1REM2QVxcdURDNzAtXFx1REM3Q1xcdURDODAtXFx1REM4OFxcdURDOTAtXFx1REM5OVxcdURDOURcXHVEQzlFXXxcXHVEODM0W1xcdURENjUtXFx1REQ2OVxcdURENkQtXFx1REQ3MlxcdUREN0ItXFx1REQ4MlxcdUREODUtXFx1REQ4QlxcdUREQUEtXFx1RERBRFxcdURFNDItXFx1REU0NF18XFx1RDgzNVtcXHVEQzAwLVxcdURDNTRcXHVEQzU2LVxcdURDOUNcXHVEQzlFXFx1REM5RlxcdURDQTJcXHVEQ0E1XFx1RENBNlxcdURDQTktXFx1RENBQ1xcdURDQUUtXFx1RENCOVxcdURDQkJcXHVEQ0JELVxcdURDQzNcXHVEQ0M1LVxcdUREMDVcXHVERDA3LVxcdUREMEFcXHVERDBELVxcdUREMTRcXHVERDE2LVxcdUREMUNcXHVERDFFLVxcdUREMzlcXHVERDNCLVxcdUREM0VcXHVERDQwLVxcdURENDRcXHVERDQ2XFx1REQ0QS1cXHVERDUwXFx1REQ1Mi1cXHVERUE1XFx1REVBOC1cXHVERUMwXFx1REVDMi1cXHVERURBXFx1REVEQy1cXHVERUZBXFx1REVGQy1cXHVERjE0XFx1REYxNi1cXHVERjM0XFx1REYzNi1cXHVERjRFXFx1REY1MC1cXHVERjZFXFx1REY3MC1cXHVERjg4XFx1REY4QS1cXHVERkE4XFx1REZBQS1cXHVERkMyXFx1REZDNC1cXHVERkNCXFx1REZDRS1cXHVERkZGXXxcXHVEODM2W1xcdURFMDAtXFx1REUzNlxcdURFM0ItXFx1REU2Q1xcdURFNzVcXHVERTg0XFx1REU5Qi1cXHVERTlGXFx1REVBMS1cXHVERUFGXXxcXHVEODNBW1xcdURDMDAtXFx1RENDNFxcdURDRDAtXFx1RENENl18XFx1RDgzQltcXHVERTAwLVxcdURFMDNcXHVERTA1LVxcdURFMUZcXHVERTIxXFx1REUyMlxcdURFMjRcXHVERTI3XFx1REUyOS1cXHVERTMyXFx1REUzNC1cXHVERTM3XFx1REUzOVxcdURFM0JcXHVERTQyXFx1REU0N1xcdURFNDlcXHVERTRCXFx1REU0RC1cXHVERTRGXFx1REU1MVxcdURFNTJcXHVERTU0XFx1REU1N1xcdURFNTlcXHVERTVCXFx1REU1RFxcdURFNUZcXHVERTYxXFx1REU2MlxcdURFNjRcXHVERTY3LVxcdURFNkFcXHVERTZDLVxcdURFNzJcXHVERTc0LVxcdURFNzdcXHVERTc5LVxcdURFN0NcXHVERTdFXFx1REU4MC1cXHVERTg5XFx1REU4Qi1cXHVERTlCXFx1REVBMS1cXHVERUEzXFx1REVBNS1cXHVERUE5XFx1REVBQi1cXHVERUJCXXxcXHVEODY5W1xcdURDMDAtXFx1REVENlxcdURGMDAtXFx1REZGRl18XFx1RDg2RFtcXHVEQzAwLVxcdURGMzRcXHVERjQwLVxcdURGRkZdfFxcdUQ4NkVbXFx1REMwMC1cXHVEQzFEXFx1REMyMC1cXHVERkZGXXxcXHVEODczW1xcdURDMDAtXFx1REVBMV18XFx1RDg3RVtcXHVEQzAwLVxcdURFMURdfFxcdURCNDBbXFx1REQwMC1cXHVEREVGXS9cblx0fTtcblx0ZXhwb3J0cy5DaGFyYWN0ZXIgPSB7XG5cdCAgICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1iaXR3aXNlICovXG5cdCAgICBmcm9tQ29kZVBvaW50OiBmdW5jdGlvbiAoY3ApIHtcblx0ICAgICAgICByZXR1cm4gKGNwIDwgMHgxMDAwMCkgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKSA6XG5cdCAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODAwICsgKChjcCAtIDB4MTAwMDApID4+IDEwKSkgK1xuXHQgICAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSgweERDMDAgKyAoKGNwIC0gMHgxMDAwMCkgJiAxMDIzKSk7XG5cdCAgICB9LFxuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtd2hpdGUtc3BhY2Vcblx0ICAgIGlzV2hpdGVTcGFjZTogZnVuY3Rpb24gKGNwKSB7XG5cdCAgICAgICAgcmV0dXJuIChjcCA9PT0gMHgyMCkgfHwgKGNwID09PSAweDA5KSB8fCAoY3AgPT09IDB4MEIpIHx8IChjcCA9PT0gMHgwQykgfHwgKGNwID09PSAweEEwKSB8fFxuXHQgICAgICAgICAgICAoY3AgPj0gMHgxNjgwICYmIFsweDE2ODAsIDB4MjAwMCwgMHgyMDAxLCAweDIwMDIsIDB4MjAwMywgMHgyMDA0LCAweDIwMDUsIDB4MjAwNiwgMHgyMDA3LCAweDIwMDgsIDB4MjAwOSwgMHgyMDBBLCAweDIwMkYsIDB4MjA1RiwgMHgzMDAwLCAweEZFRkZdLmluZGV4T2YoY3ApID49IDApO1xuXHQgICAgfSxcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxpbmUtdGVybWluYXRvcnNcblx0ICAgIGlzTGluZVRlcm1pbmF0b3I6IGZ1bmN0aW9uIChjcCkge1xuXHQgICAgICAgIHJldHVybiAoY3AgPT09IDB4MEEpIHx8IChjcCA9PT0gMHgwRCkgfHwgKGNwID09PSAweDIwMjgpIHx8IChjcCA9PT0gMHgyMDI5KTtcblx0ICAgIH0sXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1uYW1lcy1hbmQta2V5d29yZHNcblx0ICAgIGlzSWRlbnRpZmllclN0YXJ0OiBmdW5jdGlvbiAoY3ApIHtcblx0ICAgICAgICByZXR1cm4gKGNwID09PSAweDI0KSB8fCAoY3AgPT09IDB4NUYpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDQxICYmIGNwIDw9IDB4NUEpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDYxICYmIGNwIDw9IDB4N0EpIHx8XG5cdCAgICAgICAgICAgIChjcCA9PT0gMHg1QykgfHxcblx0ICAgICAgICAgICAgKChjcCA+PSAweDgwKSAmJiBSZWdleC5Ob25Bc2NpaUlkZW50aWZpZXJTdGFydC50ZXN0KGV4cG9ydHMuQ2hhcmFjdGVyLmZyb21Db2RlUG9pbnQoY3ApKSk7XG5cdCAgICB9LFxuXHQgICAgaXNJZGVudGlmaWVyUGFydDogZnVuY3Rpb24gKGNwKSB7XG5cdCAgICAgICAgcmV0dXJuIChjcCA9PT0gMHgyNCkgfHwgKGNwID09PSAweDVGKSB8fFxuXHQgICAgICAgICAgICAoY3AgPj0gMHg0MSAmJiBjcCA8PSAweDVBKSB8fFxuXHQgICAgICAgICAgICAoY3AgPj0gMHg2MSAmJiBjcCA8PSAweDdBKSB8fFxuXHQgICAgICAgICAgICAoY3AgPj0gMHgzMCAmJiBjcCA8PSAweDM5KSB8fFxuXHQgICAgICAgICAgICAoY3AgPT09IDB4NUMpIHx8XG5cdCAgICAgICAgICAgICgoY3AgPj0gMHg4MCkgJiYgUmVnZXguTm9uQXNjaWlJZGVudGlmaWVyUGFydC50ZXN0KGV4cG9ydHMuQ2hhcmFjdGVyLmZyb21Db2RlUG9pbnQoY3ApKSk7XG5cdCAgICB9LFxuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbGl0ZXJhbHMtbnVtZXJpYy1saXRlcmFsc1xuXHQgICAgaXNEZWNpbWFsRGlnaXQ6IGZ1bmN0aW9uIChjcCkge1xuXHQgICAgICAgIHJldHVybiAoY3AgPj0gMHgzMCAmJiBjcCA8PSAweDM5KTsgLy8gMC4uOVxuXHQgICAgfSxcblx0ICAgIGlzSGV4RGlnaXQ6IGZ1bmN0aW9uIChjcCkge1xuXHQgICAgICAgIHJldHVybiAoY3AgPj0gMHgzMCAmJiBjcCA8PSAweDM5KSB8fFxuXHQgICAgICAgICAgICAoY3AgPj0gMHg0MSAmJiBjcCA8PSAweDQ2KSB8fFxuXHQgICAgICAgICAgICAoY3AgPj0gMHg2MSAmJiBjcCA8PSAweDY2KTsgLy8gYS4uZlxuXHQgICAgfSxcblx0ICAgIGlzT2N0YWxEaWdpdDogZnVuY3Rpb24gKGNwKSB7XG5cdCAgICAgICAgcmV0dXJuIChjcCA+PSAweDMwICYmIGNwIDw9IDB4MzcpOyAvLyAwLi43XG5cdCAgICB9XG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdHZhciBqc3hfc3ludGF4XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuXHQvKiB0c2xpbnQ6ZGlzYWJsZTptYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuXHR2YXIgSlNYQ2xvc2luZ0VsZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYQ2xvc2luZ0VsZW1lbnQobmFtZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYQ2xvc2luZ0VsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hDbG9zaW5nRWxlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hDbG9zaW5nRWxlbWVudCA9IEpTWENsb3NpbmdFbGVtZW50O1xuXHR2YXIgSlNYRWxlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hFbGVtZW50KG9wZW5pbmdFbGVtZW50LCBjaGlsZHJlbiwgY2xvc2luZ0VsZW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWEVsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5vcGVuaW5nRWxlbWVudCA9IG9wZW5pbmdFbGVtZW50O1xuXHQgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcblx0ICAgICAgICB0aGlzLmNsb3NpbmdFbGVtZW50ID0gY2xvc2luZ0VsZW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYRWxlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hFbGVtZW50ID0gSlNYRWxlbWVudDtcblx0dmFyIEpTWEVtcHR5RXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hFbXB0eUV4cHJlc3Npb24oKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hFbXB0eUV4cHJlc3Npb247XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYRW1wdHlFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWEVtcHR5RXhwcmVzc2lvbiA9IEpTWEVtcHR5RXhwcmVzc2lvbjtcblx0dmFyIEpTWEV4cHJlc3Npb25Db250YWluZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYRXhwcmVzc2lvbkNvbnRhaW5lcihleHByZXNzaW9uKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hFeHByZXNzaW9uQ29udGFpbmVyO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYRXhwcmVzc2lvbkNvbnRhaW5lcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hFeHByZXNzaW9uQ29udGFpbmVyID0gSlNYRXhwcmVzc2lvbkNvbnRhaW5lcjtcblx0dmFyIEpTWElkZW50aWZpZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYSWRlbnRpZmllcihuYW1lKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hJZGVudGlmaWVyO1xuXHQgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYSWRlbnRpZmllcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hJZGVudGlmaWVyID0gSlNYSWRlbnRpZmllcjtcblx0dmFyIEpTWE1lbWJlckV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYTWVtYmVyRXhwcmVzc2lvbihvYmplY3QsIHByb3BlcnR5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hNZW1iZXJFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXHQgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hNZW1iZXJFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWE1lbWJlckV4cHJlc3Npb24gPSBKU1hNZW1iZXJFeHByZXNzaW9uO1xuXHR2YXIgSlNYQXR0cmlidXRlID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEpTWEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYQXR0cmlidXRlO1xuXHQgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEpTWEF0dHJpYnV0ZTtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hBdHRyaWJ1dGUgPSBKU1hBdHRyaWJ1dGU7XG5cdHZhciBKU1hOYW1lc3BhY2VkTmFtZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hOYW1lc3BhY2VkTmFtZShuYW1lc3BhY2UsIG5hbWUpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWE5hbWVzcGFjZWROYW1lO1xuXHQgICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXHQgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYTmFtZXNwYWNlZE5hbWU7XG5cdH0oKSk7XG5cdGV4cG9ydHMuSlNYTmFtZXNwYWNlZE5hbWUgPSBKU1hOYW1lc3BhY2VkTmFtZTtcblx0dmFyIEpTWE9wZW5pbmdFbGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEpTWE9wZW5pbmdFbGVtZW50KG5hbWUsIHNlbGZDbG9zaW5nLCBhdHRyaWJ1dGVzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hPcGVuaW5nRWxlbWVudDtcblx0ICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHQgICAgICAgIHRoaXMuc2VsZkNsb3NpbmcgPSBzZWxmQ2xvc2luZztcblx0ICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEpTWE9wZW5pbmdFbGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWE9wZW5pbmdFbGVtZW50ID0gSlNYT3BlbmluZ0VsZW1lbnQ7XG5cdHZhciBKU1hTcHJlYWRBdHRyaWJ1dGUgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYU3ByZWFkQXR0cmlidXRlKGFyZ3VtZW50KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hTcHJlYWRBdHRyaWJ1dGU7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEpTWFNwcmVhZEF0dHJpYnV0ZTtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hTcHJlYWRBdHRyaWJ1dGUgPSBKU1hTcHJlYWRBdHRyaWJ1dGU7XG5cdHZhciBKU1hUZXh0ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEpTWFRleHQodmFsdWUsIHJhdykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYVGV4dDtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgICAgdGhpcy5yYXcgPSByYXc7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYVGV4dDtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hUZXh0ID0gSlNYVGV4dDtcblxuXG4vKioqLyB9LFxuLyogNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0ZXhwb3J0cy5KU1hTeW50YXggPSB7XG5cdCAgICBKU1hBdHRyaWJ1dGU6ICdKU1hBdHRyaWJ1dGUnLFxuXHQgICAgSlNYQ2xvc2luZ0VsZW1lbnQ6ICdKU1hDbG9zaW5nRWxlbWVudCcsXG5cdCAgICBKU1hFbGVtZW50OiAnSlNYRWxlbWVudCcsXG5cdCAgICBKU1hFbXB0eUV4cHJlc3Npb246ICdKU1hFbXB0eUV4cHJlc3Npb24nLFxuXHQgICAgSlNYRXhwcmVzc2lvbkNvbnRhaW5lcjogJ0pTWEV4cHJlc3Npb25Db250YWluZXInLFxuXHQgICAgSlNYSWRlbnRpZmllcjogJ0pTWElkZW50aWZpZXInLFxuXHQgICAgSlNYTWVtYmVyRXhwcmVzc2lvbjogJ0pTWE1lbWJlckV4cHJlc3Npb24nLFxuXHQgICAgSlNYTmFtZXNwYWNlZE5hbWU6ICdKU1hOYW1lc3BhY2VkTmFtZScsXG5cdCAgICBKU1hPcGVuaW5nRWxlbWVudDogJ0pTWE9wZW5pbmdFbGVtZW50Jyxcblx0ICAgIEpTWFNwcmVhZEF0dHJpYnV0ZTogJ0pTWFNwcmVhZEF0dHJpYnV0ZScsXG5cdCAgICBKU1hUZXh0OiAnSlNYVGV4dCdcblx0fTtcblxuXG4vKioqLyB9LFxuLyogNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIHN5bnRheF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0LyogdHNsaW50OmRpc2FibGU6bWF4LWNsYXNzZXMtcGVyLWZpbGUgKi9cblx0dmFyIEFycmF5RXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBBcnJheUV4cHJlc3Npb24oZWxlbWVudHMpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQXJyYXlFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50cztcblx0ICAgIH1cblx0ICAgIHJldHVybiBBcnJheUV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQXJyYXlFeHByZXNzaW9uID0gQXJyYXlFeHByZXNzaW9uO1xuXHR2YXIgQXJyYXlQYXR0ZXJuID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFycmF5UGF0dGVybihlbGVtZW50cykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5BcnJheVBhdHRlcm47XG5cdCAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFycmF5UGF0dGVybjtcblx0fSgpKTtcblx0ZXhwb3J0cy5BcnJheVBhdHRlcm4gPSBBcnJheVBhdHRlcm47XG5cdHZhciBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihwYXJhbXMsIGJvZHksIGV4cHJlc3Npb24pIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQXJyb3dGdW5jdGlvbkV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5pZCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5hc3luYyA9IGZhbHNlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFycm93RnVuY3Rpb25FeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkFycm93RnVuY3Rpb25FeHByZXNzaW9uID0gQXJyb3dGdW5jdGlvbkV4cHJlc3Npb247XG5cdHZhciBBc3NpZ25tZW50RXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBBc3NpZ25tZW50RXhwcmVzc2lvbihvcGVyYXRvciwgbGVmdCwgcmlnaHQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudEV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuXHQgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7XG5cdCAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFzc2lnbm1lbnRFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkFzc2lnbm1lbnRFeHByZXNzaW9uID0gQXNzaWdubWVudEV4cHJlc3Npb247XG5cdHZhciBBc3NpZ25tZW50UGF0dGVybiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBBc3NpZ25tZW50UGF0dGVybihsZWZ0LCByaWdodCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Bc3NpZ25tZW50UGF0dGVybjtcblx0ICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuXHQgICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBBc3NpZ25tZW50UGF0dGVybjtcblx0fSgpKTtcblx0ZXhwb3J0cy5Bc3NpZ25tZW50UGF0dGVybiA9IEFzc2lnbm1lbnRQYXR0ZXJuO1xuXHR2YXIgQXN5bmNBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBBc3luY0Fycm93RnVuY3Rpb25FeHByZXNzaW9uKHBhcmFtcywgYm9keSwgZXhwcmVzc2lvbikge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmlkID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMuZ2VuZXJhdG9yID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmFzeW5jID0gdHJ1ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBBc3luY0Fycm93RnVuY3Rpb25FeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkFzeW5jQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gPSBBc3luY0Fycm93RnVuY3Rpb25FeHByZXNzaW9uO1xuXHR2YXIgQXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvbihpZCwgcGFyYW1zLCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkZ1bmN0aW9uRGVjbGFyYXRpb247XG5cdCAgICAgICAgdGhpcy5pZCA9IGlkO1xuXHQgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmFzeW5jID0gdHJ1ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBBc3luY0Z1bmN0aW9uRGVjbGFyYXRpb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uID0gQXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uO1xuXHR2YXIgQXN5bmNGdW5jdGlvbkV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQXN5bmNGdW5jdGlvbkV4cHJlc3Npb24oaWQsIHBhcmFtcywgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5GdW5jdGlvbkV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5pZCA9IGlkO1xuXHQgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmFzeW5jID0gdHJ1ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBBc3luY0Z1bmN0aW9uRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5Bc3luY0Z1bmN0aW9uRXhwcmVzc2lvbiA9IEFzeW5jRnVuY3Rpb25FeHByZXNzaW9uO1xuXHR2YXIgQXdhaXRFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEF3YWl0RXhwcmVzc2lvbihhcmd1bWVudCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Bd2FpdEV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEF3YWl0RXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5Bd2FpdEV4cHJlc3Npb24gPSBBd2FpdEV4cHJlc3Npb247XG5cdHZhciBCaW5hcnlFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEJpbmFyeUV4cHJlc3Npb24ob3BlcmF0b3IsIGxlZnQsIHJpZ2h0KSB7XG5cdCAgICAgICAgdmFyIGxvZ2ljYWwgPSAob3BlcmF0b3IgPT09ICd8fCcgfHwgb3BlcmF0b3IgPT09ICcmJicpO1xuXHQgICAgICAgIHRoaXMudHlwZSA9IGxvZ2ljYWwgPyBzeW50YXhfMS5TeW50YXguTG9naWNhbEV4cHJlc3Npb24gOiBzeW50YXhfMS5TeW50YXguQmluYXJ5RXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG5cdCAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcblx0ICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQmluYXJ5RXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5CaW5hcnlFeHByZXNzaW9uID0gQmluYXJ5RXhwcmVzc2lvbjtcblx0dmFyIEJsb2NrU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEJsb2NrU3RhdGVtZW50KGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQmxvY2tTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBCbG9ja1N0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5CbG9ja1N0YXRlbWVudCA9IEJsb2NrU3RhdGVtZW50O1xuXHR2YXIgQnJlYWtTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQnJlYWtTdGF0ZW1lbnQobGFiZWwpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQnJlYWtTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEJyZWFrU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkJyZWFrU3RhdGVtZW50ID0gQnJlYWtTdGF0ZW1lbnQ7XG5cdHZhciBDYWxsRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDYWxsRXhwcmVzc2lvbihjYWxsZWUsIGFyZ3MpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQ2FsbEV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5jYWxsZWUgPSBjYWxsZWU7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmdzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIENhbGxFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkNhbGxFeHByZXNzaW9uID0gQ2FsbEV4cHJlc3Npb247XG5cdHZhciBDYXRjaENsYXVzZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDYXRjaENsYXVzZShwYXJhbSwgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5DYXRjaENsYXVzZTtcblx0ICAgICAgICB0aGlzLnBhcmFtID0gcGFyYW07XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBDYXRjaENsYXVzZTtcblx0fSgpKTtcblx0ZXhwb3J0cy5DYXRjaENsYXVzZSA9IENhdGNoQ2xhdXNlO1xuXHR2YXIgQ2xhc3NCb2R5ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENsYXNzQm9keShib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkNsYXNzQm9keTtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIENsYXNzQm9keTtcblx0fSgpKTtcblx0ZXhwb3J0cy5DbGFzc0JvZHkgPSBDbGFzc0JvZHk7XG5cdHZhciBDbGFzc0RlY2xhcmF0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENsYXNzRGVjbGFyYXRpb24oaWQsIHN1cGVyQ2xhc3MsIGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQ2xhc3NEZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5zdXBlckNsYXNzID0gc3VwZXJDbGFzcztcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIENsYXNzRGVjbGFyYXRpb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQ2xhc3NEZWNsYXJhdGlvbiA9IENsYXNzRGVjbGFyYXRpb247XG5cdHZhciBDbGFzc0V4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQ2xhc3NFeHByZXNzaW9uKGlkLCBzdXBlckNsYXNzLCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkNsYXNzRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5zdXBlckNsYXNzID0gc3VwZXJDbGFzcztcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIENsYXNzRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5DbGFzc0V4cHJlc3Npb24gPSBDbGFzc0V4cHJlc3Npb247XG5cdHZhciBDb21wdXRlZE1lbWJlckV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uKG9iamVjdCwgcHJvcGVydHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguTWVtYmVyRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmNvbXB1dGVkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0ICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkNvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbiA9IENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbjtcblx0dmFyIENvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDb25kaXRpb25hbEV4cHJlc3Npb24odGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkNvbmRpdGlvbmFsRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0O1xuXHQgICAgICAgIHRoaXMuY29uc2VxdWVudCA9IGNvbnNlcXVlbnQ7XG5cdCAgICAgICAgdGhpcy5hbHRlcm5hdGUgPSBhbHRlcm5hdGU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQ29uZGl0aW9uYWxFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkNvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IENvbmRpdGlvbmFsRXhwcmVzc2lvbjtcblx0dmFyIENvbnRpbnVlU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENvbnRpbnVlU3RhdGVtZW50KGxhYmVsKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkNvbnRpbnVlU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBDb250aW51ZVN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5Db250aW51ZVN0YXRlbWVudCA9IENvbnRpbnVlU3RhdGVtZW50O1xuXHR2YXIgRGVidWdnZXJTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRGVidWdnZXJTdGF0ZW1lbnQoKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkRlYnVnZ2VyU3RhdGVtZW50O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIERlYnVnZ2VyU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkRlYnVnZ2VyU3RhdGVtZW50ID0gRGVidWdnZXJTdGF0ZW1lbnQ7XG5cdHZhciBEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRGlyZWN0aXZlKGV4cHJlc3Npb24sIGRpcmVjdGl2ZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FeHByZXNzaW9uU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5kaXJlY3RpdmUgPSBkaXJlY3RpdmU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRGlyZWN0aXZlO1xuXHR9KCkpO1xuXHRleHBvcnRzLkRpcmVjdGl2ZSA9IERpcmVjdGl2ZTtcblx0dmFyIERvV2hpbGVTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRG9XaGlsZVN0YXRlbWVudChib2R5LCB0ZXN0KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkRvV2hpbGVTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIERvV2hpbGVTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRG9XaGlsZVN0YXRlbWVudCA9IERvV2hpbGVTdGF0ZW1lbnQ7XG5cdHZhciBFbXB0eVN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBFbXB0eVN0YXRlbWVudCgpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRW1wdHlTdGF0ZW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRW1wdHlTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRW1wdHlTdGF0ZW1lbnQgPSBFbXB0eVN0YXRlbWVudDtcblx0dmFyIEV4cG9ydEFsbERlY2xhcmF0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEV4cG9ydEFsbERlY2xhcmF0aW9uKHNvdXJjZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FeHBvcnRBbGxEZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBFeHBvcnRBbGxEZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5FeHBvcnRBbGxEZWNsYXJhdGlvbiA9IEV4cG9ydEFsbERlY2xhcmF0aW9uO1xuXHR2YXIgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihkZWNsYXJhdGlvbikge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb247XG5cdCAgICAgICAgdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb24gPSBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb247XG5cdHZhciBFeHBvcnROYW1lZERlY2xhcmF0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEV4cG9ydE5hbWVkRGVjbGFyYXRpb24oZGVjbGFyYXRpb24sIHNwZWNpZmllcnMsIHNvdXJjZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FeHBvcnROYW1lZERlY2xhcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLnNwZWNpZmllcnMgPSBzcGVjaWZpZXJzO1xuXHQgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEV4cG9ydE5hbWVkRGVjbGFyYXRpb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuRXhwb3J0TmFtZWREZWNsYXJhdGlvbiA9IEV4cG9ydE5hbWVkRGVjbGFyYXRpb247XG5cdHZhciBFeHBvcnRTcGVjaWZpZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRXhwb3J0U3BlY2lmaWVyKGxvY2FsLCBleHBvcnRlZCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FeHBvcnRTcGVjaWZpZXI7XG5cdCAgICAgICAgdGhpcy5leHBvcnRlZCA9IGV4cG9ydGVkO1xuXHQgICAgICAgIHRoaXMubG9jYWwgPSBsb2NhbDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBFeHBvcnRTcGVjaWZpZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRXhwb3J0U3BlY2lmaWVyID0gRXhwb3J0U3BlY2lmaWVyO1xuXHR2YXIgRXhwcmVzc2lvblN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBFeHByZXNzaW9uU3RhdGVtZW50KGV4cHJlc3Npb24pIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRXhwcmVzc2lvblN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEV4cHJlc3Npb25TdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRXhwcmVzc2lvblN0YXRlbWVudCA9IEV4cHJlc3Npb25TdGF0ZW1lbnQ7XG5cdHZhciBGb3JJblN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBGb3JJblN0YXRlbWVudChsZWZ0LCByaWdodCwgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Gb3JJblN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuXHQgICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMuZWFjaCA9IGZhbHNlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEZvckluU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkZvckluU3RhdGVtZW50ID0gRm9ySW5TdGF0ZW1lbnQ7XG5cdHZhciBGb3JPZlN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBGb3JPZlN0YXRlbWVudChsZWZ0LCByaWdodCwgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Gb3JPZlN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuXHQgICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEZvck9mU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkZvck9mU3RhdGVtZW50ID0gRm9yT2ZTdGF0ZW1lbnQ7XG5cdHZhciBGb3JTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRm9yU3RhdGVtZW50KGluaXQsIHRlc3QsIHVwZGF0ZSwgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Gb3JTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5pbml0ID0gaW5pdDtcblx0ICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0O1xuXHQgICAgICAgIHRoaXMudXBkYXRlID0gdXBkYXRlO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRm9yU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkZvclN0YXRlbWVudCA9IEZvclN0YXRlbWVudDtcblx0dmFyIEZ1bmN0aW9uRGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRnVuY3Rpb25EZWNsYXJhdGlvbihpZCwgcGFyYW1zLCBib2R5LCBnZW5lcmF0b3IpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRnVuY3Rpb25EZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvcjtcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmFzeW5jID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRnVuY3Rpb25EZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5GdW5jdGlvbkRlY2xhcmF0aW9uID0gRnVuY3Rpb25EZWNsYXJhdGlvbjtcblx0dmFyIEZ1bmN0aW9uRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBGdW5jdGlvbkV4cHJlc3Npb24oaWQsIHBhcmFtcywgYm9keSwgZ2VuZXJhdG9yKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkZ1bmN0aW9uRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvcjtcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmFzeW5jID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRnVuY3Rpb25FeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkZ1bmN0aW9uRXhwcmVzc2lvbiA9IEZ1bmN0aW9uRXhwcmVzc2lvbjtcblx0dmFyIElkZW50aWZpZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSWRlbnRpZmllcihuYW1lKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXI7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBJZGVudGlmaWVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLklkZW50aWZpZXIgPSBJZGVudGlmaWVyO1xuXHR2YXIgSWZTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSWZTdGF0ZW1lbnQodGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LklmU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7XG5cdCAgICAgICAgdGhpcy5jb25zZXF1ZW50ID0gY29uc2VxdWVudDtcblx0ICAgICAgICB0aGlzLmFsdGVybmF0ZSA9IGFsdGVybmF0ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBJZlN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5JZlN0YXRlbWVudCA9IElmU3RhdGVtZW50O1xuXHR2YXIgSW1wb3J0RGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSW1wb3J0RGVjbGFyYXRpb24oc3BlY2lmaWVycywgc291cmNlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkltcG9ydERlY2xhcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuc3BlY2lmaWVycyA9IHNwZWNpZmllcnM7XG5cdCAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSW1wb3J0RGVjbGFyYXRpb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuSW1wb3J0RGVjbGFyYXRpb24gPSBJbXBvcnREZWNsYXJhdGlvbjtcblx0dmFyIEltcG9ydERlZmF1bHRTcGVjaWZpZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSW1wb3J0RGVmYXVsdFNwZWNpZmllcihsb2NhbCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5JbXBvcnREZWZhdWx0U3BlY2lmaWVyO1xuXHQgICAgICAgIHRoaXMubG9jYWwgPSBsb2NhbDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBJbXBvcnREZWZhdWx0U3BlY2lmaWVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLkltcG9ydERlZmF1bHRTcGVjaWZpZXIgPSBJbXBvcnREZWZhdWx0U3BlY2lmaWVyO1xuXHR2YXIgSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcihsb2NhbCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXI7XG5cdCAgICAgICAgdGhpcy5sb2NhbCA9IGxvY2FsO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIgPSBJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXI7XG5cdHZhciBJbXBvcnRTcGVjaWZpZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSW1wb3J0U3BlY2lmaWVyKGxvY2FsLCBpbXBvcnRlZCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5JbXBvcnRTcGVjaWZpZXI7XG5cdCAgICAgICAgdGhpcy5sb2NhbCA9IGxvY2FsO1xuXHQgICAgICAgIHRoaXMuaW1wb3J0ZWQgPSBpbXBvcnRlZDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBJbXBvcnRTcGVjaWZpZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuSW1wb3J0U3BlY2lmaWVyID0gSW1wb3J0U3BlY2lmaWVyO1xuXHR2YXIgTGFiZWxlZFN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBMYWJlbGVkU3RhdGVtZW50KGxhYmVsLCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkxhYmVsZWRTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gTGFiZWxlZFN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5MYWJlbGVkU3RhdGVtZW50ID0gTGFiZWxlZFN0YXRlbWVudDtcblx0dmFyIExpdGVyYWwgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSwgcmF3KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkxpdGVyYWw7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgICAgICAgIHRoaXMucmF3ID0gcmF3O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIExpdGVyYWw7XG5cdH0oKSk7XG5cdGV4cG9ydHMuTGl0ZXJhbCA9IExpdGVyYWw7XG5cdHZhciBNZXRhUHJvcGVydHkgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gTWV0YVByb3BlcnR5KG1ldGEsIHByb3BlcnR5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4Lk1ldGFQcm9wZXJ0eTtcblx0ICAgICAgICB0aGlzLm1ldGEgPSBtZXRhO1xuXHQgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBNZXRhUHJvcGVydHk7XG5cdH0oKSk7XG5cdGV4cG9ydHMuTWV0YVByb3BlcnR5ID0gTWV0YVByb3BlcnR5O1xuXHR2YXIgTWV0aG9kRGVmaW5pdGlvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBNZXRob2REZWZpbml0aW9uKGtleSwgY29tcHV0ZWQsIHZhbHVlLCBraW5kLCBpc1N0YXRpYykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5NZXRob2REZWZpbml0aW9uO1xuXHQgICAgICAgIHRoaXMua2V5ID0ga2V5O1xuXHQgICAgICAgIHRoaXMuY29tcHV0ZWQgPSBjb21wdXRlZDtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgICAgdGhpcy5raW5kID0ga2luZDtcblx0ICAgICAgICB0aGlzLnN0YXRpYyA9IGlzU3RhdGljO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIE1ldGhvZERlZmluaXRpb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuTWV0aG9kRGVmaW5pdGlvbiA9IE1ldGhvZERlZmluaXRpb247XG5cdHZhciBNb2R1bGUgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gTW9kdWxlKGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguUHJvZ3JhbTtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMuc291cmNlVHlwZSA9ICdtb2R1bGUnO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIE1vZHVsZTtcblx0fSgpKTtcblx0ZXhwb3J0cy5Nb2R1bGUgPSBNb2R1bGU7XG5cdHZhciBOZXdFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIE5ld0V4cHJlc3Npb24oY2FsbGVlLCBhcmdzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4Lk5ld0V4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5jYWxsZWUgPSBjYWxsZWU7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmdzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIE5ld0V4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuTmV3RXhwcmVzc2lvbiA9IE5ld0V4cHJlc3Npb247XG5cdHZhciBPYmplY3RFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIE9iamVjdEV4cHJlc3Npb24ocHJvcGVydGllcykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5PYmplY3RFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gT2JqZWN0RXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5PYmplY3RFeHByZXNzaW9uID0gT2JqZWN0RXhwcmVzc2lvbjtcblx0dmFyIE9iamVjdFBhdHRlcm4gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gT2JqZWN0UGF0dGVybihwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4Lk9iamVjdFBhdHRlcm47XG5cdCAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcblx0ICAgIH1cblx0ICAgIHJldHVybiBPYmplY3RQYXR0ZXJuO1xuXHR9KCkpO1xuXHRleHBvcnRzLk9iamVjdFBhdHRlcm4gPSBPYmplY3RQYXR0ZXJuO1xuXHR2YXIgUHJvcGVydHkgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gUHJvcGVydHkoa2luZCwga2V5LCBjb21wdXRlZCwgdmFsdWUsIG1ldGhvZCwgc2hvcnRoYW5kKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlByb3BlcnR5O1xuXHQgICAgICAgIHRoaXMua2V5ID0ga2V5O1xuXHQgICAgICAgIHRoaXMuY29tcHV0ZWQgPSBjb21wdXRlZDtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgICAgdGhpcy5raW5kID0ga2luZDtcblx0ICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcblx0ICAgICAgICB0aGlzLnNob3J0aGFuZCA9IHNob3J0aGFuZDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBQcm9wZXJ0eTtcblx0fSgpKTtcblx0ZXhwb3J0cy5Qcm9wZXJ0eSA9IFByb3BlcnR5O1xuXHR2YXIgUmVnZXhMaXRlcmFsID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFJlZ2V4TGl0ZXJhbCh2YWx1ZSwgcmF3LCBwYXR0ZXJuLCBmbGFncykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5MaXRlcmFsO1xuXHQgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICB0aGlzLnJhdyA9IHJhdztcblx0ICAgICAgICB0aGlzLnJlZ2V4ID0geyBwYXR0ZXJuOiBwYXR0ZXJuLCBmbGFnczogZmxhZ3MgfTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBSZWdleExpdGVyYWw7XG5cdH0oKSk7XG5cdGV4cG9ydHMuUmVnZXhMaXRlcmFsID0gUmVnZXhMaXRlcmFsO1xuXHR2YXIgUmVzdEVsZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gUmVzdEVsZW1lbnQoYXJndW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguUmVzdEVsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFJlc3RFbGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLlJlc3RFbGVtZW50ID0gUmVzdEVsZW1lbnQ7XG5cdHZhciBSZXR1cm5TdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gUmV0dXJuU3RhdGVtZW50KGFyZ3VtZW50KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlJldHVyblN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gUmV0dXJuU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLlJldHVyblN0YXRlbWVudCA9IFJldHVyblN0YXRlbWVudDtcblx0dmFyIFNjcmlwdCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBTY3JpcHQoYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Qcm9ncmFtO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICAgICAgdGhpcy5zb3VyY2VUeXBlID0gJ3NjcmlwdCc7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gU2NyaXB0O1xuXHR9KCkpO1xuXHRleHBvcnRzLlNjcmlwdCA9IFNjcmlwdDtcblx0dmFyIFNlcXVlbmNlRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBTZXF1ZW5jZUV4cHJlc3Npb24oZXhwcmVzc2lvbnMpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguU2VxdWVuY2VFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbnMgPSBleHByZXNzaW9ucztcblx0ICAgIH1cblx0ICAgIHJldHVybiBTZXF1ZW5jZUV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuU2VxdWVuY2VFeHByZXNzaW9uID0gU2VxdWVuY2VFeHByZXNzaW9uO1xuXHR2YXIgU3ByZWFkRWxlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBTcHJlYWRFbGVtZW50KGFyZ3VtZW50KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlNwcmVhZEVsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFNwcmVhZEVsZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuU3ByZWFkRWxlbWVudCA9IFNwcmVhZEVsZW1lbnQ7XG5cdHZhciBTdGF0aWNNZW1iZXJFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFN0YXRpY01lbWJlckV4cHJlc3Npb24ob2JqZWN0LCBwcm9wZXJ0eSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5NZW1iZXJFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuY29tcHV0ZWQgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0ICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gU3RhdGljTWVtYmVyRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5TdGF0aWNNZW1iZXJFeHByZXNzaW9uID0gU3RhdGljTWVtYmVyRXhwcmVzc2lvbjtcblx0dmFyIFN1cGVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFN1cGVyKCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5TdXBlcjtcblx0ICAgIH1cblx0ICAgIHJldHVybiBTdXBlcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5TdXBlciA9IFN1cGVyO1xuXHR2YXIgU3dpdGNoQ2FzZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBTd2l0Y2hDYXNlKHRlc3QsIGNvbnNlcXVlbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguU3dpdGNoQ2FzZTtcblx0ICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0O1xuXHQgICAgICAgIHRoaXMuY29uc2VxdWVudCA9IGNvbnNlcXVlbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gU3dpdGNoQ2FzZTtcblx0fSgpKTtcblx0ZXhwb3J0cy5Td2l0Y2hDYXNlID0gU3dpdGNoQ2FzZTtcblx0dmFyIFN3aXRjaFN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBTd2l0Y2hTdGF0ZW1lbnQoZGlzY3JpbWluYW50LCBjYXNlcykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Td2l0Y2hTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5kaXNjcmltaW5hbnQgPSBkaXNjcmltaW5hbnQ7XG5cdCAgICAgICAgdGhpcy5jYXNlcyA9IGNhc2VzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFN3aXRjaFN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5Td2l0Y2hTdGF0ZW1lbnQgPSBTd2l0Y2hTdGF0ZW1lbnQ7XG5cdHZhciBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKHRhZywgcXVhc2kpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMudGFnID0gdGFnO1xuXHQgICAgICAgIHRoaXMucXVhc2kgPSBxdWFzaTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uID0gVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uO1xuXHR2YXIgVGVtcGxhdGVFbGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRlbXBsYXRlRWxlbWVudCh2YWx1ZSwgdGFpbCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5UZW1wbGF0ZUVsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgICAgICAgIHRoaXMudGFpbCA9IHRhaWw7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gVGVtcGxhdGVFbGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLlRlbXBsYXRlRWxlbWVudCA9IFRlbXBsYXRlRWxlbWVudDtcblx0dmFyIFRlbXBsYXRlTGl0ZXJhbCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBUZW1wbGF0ZUxpdGVyYWwocXVhc2lzLCBleHByZXNzaW9ucykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5UZW1wbGF0ZUxpdGVyYWw7XG5cdCAgICAgICAgdGhpcy5xdWFzaXMgPSBxdWFzaXM7XG5cdCAgICAgICAgdGhpcy5leHByZXNzaW9ucyA9IGV4cHJlc3Npb25zO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFRlbXBsYXRlTGl0ZXJhbDtcblx0fSgpKTtcblx0ZXhwb3J0cy5UZW1wbGF0ZUxpdGVyYWwgPSBUZW1wbGF0ZUxpdGVyYWw7XG5cdHZhciBUaGlzRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBUaGlzRXhwcmVzc2lvbigpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVGhpc0V4cHJlc3Npb247XG5cdCAgICB9XG5cdCAgICByZXR1cm4gVGhpc0V4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuVGhpc0V4cHJlc3Npb24gPSBUaGlzRXhwcmVzc2lvbjtcblx0dmFyIFRocm93U3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRocm93U3RhdGVtZW50KGFyZ3VtZW50KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlRocm93U3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMuYXJndW1lbnQgPSBhcmd1bWVudDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBUaHJvd1N0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5UaHJvd1N0YXRlbWVudCA9IFRocm93U3RhdGVtZW50O1xuXHR2YXIgVHJ5U3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRyeVN0YXRlbWVudChibG9jaywgaGFuZGxlciwgZmluYWxpemVyKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlRyeVN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmJsb2NrID0gYmxvY2s7XG5cdCAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcblx0ICAgICAgICB0aGlzLmZpbmFsaXplciA9IGZpbmFsaXplcjtcblx0ICAgIH1cblx0ICAgIHJldHVybiBUcnlTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuVHJ5U3RhdGVtZW50ID0gVHJ5U3RhdGVtZW50O1xuXHR2YXIgVW5hcnlFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFVuYXJ5RXhwcmVzc2lvbihvcGVyYXRvciwgYXJndW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVW5hcnlFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICAgICAgdGhpcy5wcmVmaXggPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFVuYXJ5RXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5VbmFyeUV4cHJlc3Npb24gPSBVbmFyeUV4cHJlc3Npb247XG5cdHZhciBVcGRhdGVFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFVwZGF0ZUV4cHJlc3Npb24ob3BlcmF0b3IsIGFyZ3VtZW50LCBwcmVmaXgpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVXBkYXRlRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFVwZGF0ZUV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuVXBkYXRlRXhwcmVzc2lvbiA9IFVwZGF0ZUV4cHJlc3Npb247XG5cdHZhciBWYXJpYWJsZURlY2xhcmF0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCBraW5kKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRpb247XG5cdCAgICAgICAgdGhpcy5kZWNsYXJhdGlvbnMgPSBkZWNsYXJhdGlvbnM7XG5cdCAgICAgICAgdGhpcy5raW5kID0ga2luZDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBWYXJpYWJsZURlY2xhcmF0aW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLlZhcmlhYmxlRGVjbGFyYXRpb24gPSBWYXJpYWJsZURlY2xhcmF0aW9uO1xuXHR2YXIgVmFyaWFibGVEZWNsYXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFZhcmlhYmxlRGVjbGFyYXRvcihpZCwgaW5pdCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5WYXJpYWJsZURlY2xhcmF0b3I7XG5cdCAgICAgICAgdGhpcy5pZCA9IGlkO1xuXHQgICAgICAgIHRoaXMuaW5pdCA9IGluaXQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gVmFyaWFibGVEZWNsYXJhdG9yO1xuXHR9KCkpO1xuXHRleHBvcnRzLlZhcmlhYmxlRGVjbGFyYXRvciA9IFZhcmlhYmxlRGVjbGFyYXRvcjtcblx0dmFyIFdoaWxlU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFdoaWxlU3RhdGVtZW50KHRlc3QsIGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguV2hpbGVTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy50ZXN0ID0gdGVzdDtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFdoaWxlU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLldoaWxlU3RhdGVtZW50ID0gV2hpbGVTdGF0ZW1lbnQ7XG5cdHZhciBXaXRoU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFdpdGhTdGF0ZW1lbnQob2JqZWN0LCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LldpdGhTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBXaXRoU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLldpdGhTdGF0ZW1lbnQgPSBXaXRoU3RhdGVtZW50O1xuXHR2YXIgWWllbGRFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFlpZWxkRXhwcmVzc2lvbihhcmd1bWVudCwgZGVsZWdhdGUpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguWWllbGRFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuYXJndW1lbnQgPSBhcmd1bWVudDtcblx0ICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gWWllbGRFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLllpZWxkRXhwcmVzc2lvbiA9IFlpZWxkRXhwcmVzc2lvbjtcblxuXG4vKioqLyB9LFxuLyogOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIGFzc2VydF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0dmFyIGVycm9yX2hhbmRsZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXHR2YXIgbWVzc2FnZXNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXHR2YXIgTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oNyk7XG5cdHZhciBzY2FubmVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcblx0dmFyIHN5bnRheF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0dmFyIHRva2VuXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblx0dmFyIEFycm93UGFyYW1ldGVyUGxhY2VIb2xkZXIgPSAnQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcic7XG5cdHZhciBQYXJzZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gUGFyc2VyKGNvZGUsIG9wdGlvbnMsIGRlbGVnYXRlKSB7XG5cdCAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cblx0ICAgICAgICB0aGlzLmNvbmZpZyA9IHtcblx0ICAgICAgICAgICAgcmFuZ2U6ICh0eXBlb2Ygb3B0aW9ucy5yYW5nZSA9PT0gJ2Jvb2xlYW4nKSAmJiBvcHRpb25zLnJhbmdlLFxuXHQgICAgICAgICAgICBsb2M6ICh0eXBlb2Ygb3B0aW9ucy5sb2MgPT09ICdib29sZWFuJykgJiYgb3B0aW9ucy5sb2MsXG5cdCAgICAgICAgICAgIHNvdXJjZTogbnVsbCxcblx0ICAgICAgICAgICAgdG9rZW5zOiAodHlwZW9mIG9wdGlvbnMudG9rZW5zID09PSAnYm9vbGVhbicpICYmIG9wdGlvbnMudG9rZW5zLFxuXHQgICAgICAgICAgICBjb21tZW50OiAodHlwZW9mIG9wdGlvbnMuY29tbWVudCA9PT0gJ2Jvb2xlYW4nKSAmJiBvcHRpb25zLmNvbW1lbnQsXG5cdCAgICAgICAgICAgIHRvbGVyYW50OiAodHlwZW9mIG9wdGlvbnMudG9sZXJhbnQgPT09ICdib29sZWFuJykgJiYgb3B0aW9ucy50b2xlcmFudFxuXHQgICAgICAgIH07XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxvYyAmJiBvcHRpb25zLnNvdXJjZSAmJiBvcHRpb25zLnNvdXJjZSAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICB0aGlzLmNvbmZpZy5zb3VyY2UgPSBTdHJpbmcob3B0aW9ucy5zb3VyY2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG5cdCAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBuZXcgZXJyb3JfaGFuZGxlcl8xLkVycm9ySGFuZGxlcigpO1xuXHQgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLnRvbGVyYW50ID0gdGhpcy5jb25maWcudG9sZXJhbnQ7XG5cdCAgICAgICAgdGhpcy5zY2FubmVyID0gbmV3IHNjYW5uZXJfMS5TY2FubmVyKGNvZGUsIHRoaXMuZXJyb3JIYW5kbGVyKTtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIudHJhY2tDb21tZW50ID0gdGhpcy5jb25maWcuY29tbWVudDtcblx0ICAgICAgICB0aGlzLm9wZXJhdG9yUHJlY2VkZW5jZSA9IHtcblx0ICAgICAgICAgICAgJyknOiAwLFxuXHQgICAgICAgICAgICAnOyc6IDAsXG5cdCAgICAgICAgICAgICcsJzogMCxcblx0ICAgICAgICAgICAgJz0nOiAwLFxuXHQgICAgICAgICAgICAnXSc6IDAsXG5cdCAgICAgICAgICAgICd8fCc6IDEsXG5cdCAgICAgICAgICAgICcmJic6IDIsXG5cdCAgICAgICAgICAgICd8JzogMyxcblx0ICAgICAgICAgICAgJ14nOiA0LFxuXHQgICAgICAgICAgICAnJic6IDUsXG5cdCAgICAgICAgICAgICc9PSc6IDYsXG5cdCAgICAgICAgICAgICchPSc6IDYsXG5cdCAgICAgICAgICAgICc9PT0nOiA2LFxuXHQgICAgICAgICAgICAnIT09JzogNixcblx0ICAgICAgICAgICAgJzwnOiA3LFxuXHQgICAgICAgICAgICAnPic6IDcsXG5cdCAgICAgICAgICAgICc8PSc6IDcsXG5cdCAgICAgICAgICAgICc+PSc6IDcsXG5cdCAgICAgICAgICAgICc8PCc6IDgsXG5cdCAgICAgICAgICAgICc+Pic6IDgsXG5cdCAgICAgICAgICAgICc+Pj4nOiA4LFxuXHQgICAgICAgICAgICAnKyc6IDksXG5cdCAgICAgICAgICAgICctJzogOSxcblx0ICAgICAgICAgICAgJyonOiAxMSxcblx0ICAgICAgICAgICAgJy8nOiAxMSxcblx0ICAgICAgICAgICAgJyUnOiAxMVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgdGhpcy5sb29rYWhlYWQgPSB7XG5cdCAgICAgICAgICAgIHR5cGU6IDIgLyogRU9GICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogJycsXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IDAsXG5cdCAgICAgICAgICAgIHN0YXJ0OiAwLFxuXHQgICAgICAgICAgICBlbmQ6IDBcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMuaGFzTGluZVRlcm1pbmF0b3IgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQgPSB7XG5cdCAgICAgICAgICAgIGlzTW9kdWxlOiBmYWxzZSxcblx0ICAgICAgICAgICAgYXdhaXQ6IGZhbHNlLFxuXHQgICAgICAgICAgICBhbGxvd0luOiB0cnVlLFxuXHQgICAgICAgICAgICBhbGxvd1N0cmljdERpcmVjdGl2ZTogdHJ1ZSxcblx0ICAgICAgICAgICAgYWxsb3dZaWVsZDogdHJ1ZSxcblx0ICAgICAgICAgICAgZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yOiBudWxsLFxuXHQgICAgICAgICAgICBpc0Fzc2lnbm1lbnRUYXJnZXQ6IGZhbHNlLFxuXHQgICAgICAgICAgICBpc0JpbmRpbmdFbGVtZW50OiBmYWxzZSxcblx0ICAgICAgICAgICAgaW5GdW5jdGlvbkJvZHk6IGZhbHNlLFxuXHQgICAgICAgICAgICBpbkl0ZXJhdGlvbjogZmFsc2UsXG5cdCAgICAgICAgICAgIGluU3dpdGNoOiBmYWxzZSxcblx0ICAgICAgICAgICAgbGFiZWxTZXQ6IHt9LFxuXHQgICAgICAgICAgICBzdHJpY3Q6IGZhbHNlXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLnRva2VucyA9IFtdO1xuXHQgICAgICAgIHRoaXMuc3RhcnRNYXJrZXIgPSB7XG5cdCAgICAgICAgICAgIGluZGV4OiAwLFxuXHQgICAgICAgICAgICBsaW5lOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgY29sdW1uOiAwXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIgPSB7XG5cdCAgICAgICAgICAgIGluZGV4OiAwLFxuXHQgICAgICAgICAgICBsaW5lOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgY29sdW1uOiAwXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlciA9IHtcblx0ICAgICAgICAgICAgaW5kZXg6IHRoaXMuc2Nhbm5lci5pbmRleCxcblx0ICAgICAgICAgICAgbGluZTogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydFxuXHQgICAgICAgIH07XG5cdCAgICB9XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnRocm93RXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZUZvcm1hdCkge1xuXHQgICAgICAgIHZhciB2YWx1ZXMgPSBbXTtcblx0ICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuXHQgICAgICAgICAgICB2YWx1ZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblx0ICAgICAgICB2YXIgbXNnID0gbWVzc2FnZUZvcm1hdC5yZXBsYWNlKC8lKFxcZCkvZywgZnVuY3Rpb24gKHdob2xlLCBpZHgpIHtcblx0ICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KGlkeCA8IGFyZ3MubGVuZ3RoLCAnTWVzc2FnZSByZWZlcmVuY2UgbXVzdCBiZSBpbiByYW5nZScpO1xuXHQgICAgICAgICAgICByZXR1cm4gYXJnc1tpZHhdO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHZhciBpbmRleCA9IHRoaXMubGFzdE1hcmtlci5pbmRleDtcblx0ICAgICAgICB2YXIgbGluZSA9IHRoaXMubGFzdE1hcmtlci5saW5lO1xuXHQgICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmxhc3RNYXJrZXIuY29sdW1uICsgMTtcblx0ICAgICAgICB0aHJvdyB0aGlzLmVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihpbmRleCwgbGluZSwgY29sdW1uLCBtc2cpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUudG9sZXJhdGVFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlRm9ybWF0KSB7XG5cdCAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuXHQgICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG5cdCAgICAgICAgICAgIHZhbHVlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXHQgICAgICAgIHZhciBtc2cgPSBtZXNzYWdlRm9ybWF0LnJlcGxhY2UoLyUoXFxkKS9nLCBmdW5jdGlvbiAod2hvbGUsIGlkeCkge1xuXHQgICAgICAgICAgICBhc3NlcnRfMS5hc3NlcnQoaWR4IDwgYXJncy5sZW5ndGgsICdNZXNzYWdlIHJlZmVyZW5jZSBtdXN0IGJlIGluIHJhbmdlJyk7XG5cdCAgICAgICAgICAgIHJldHVybiBhcmdzW2lkeF07XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5sYXN0TWFya2VyLmluZGV4O1xuXHQgICAgICAgIHZhciBsaW5lID0gdGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMubGFzdE1hcmtlci5jb2x1bW4gKyAxO1xuXHQgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLnRvbGVyYXRlRXJyb3IoaW5kZXgsIGxpbmUsIGNvbHVtbiwgbXNnKTtcblx0ICAgIH07XG5cdCAgICAvLyBUaHJvdyBhbiBleGNlcHRpb24gYmVjYXVzZSBvZiB0aGUgdG9rZW4uXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnVuZXhwZWN0ZWRUb2tlbkVycm9yID0gZnVuY3Rpb24gKHRva2VuLCBtZXNzYWdlKSB7XG5cdCAgICAgICAgdmFyIG1zZyA9IG1lc3NhZ2UgfHwgbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW47XG5cdCAgICAgICAgdmFyIHZhbHVlO1xuXHQgICAgICAgIGlmICh0b2tlbikge1xuXHQgICAgICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcblx0ICAgICAgICAgICAgICAgIG1zZyA9ICh0b2tlbi50eXBlID09PSAyIC8qIEVPRiAqLykgPyBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRFT1MgOlxuXHQgICAgICAgICAgICAgICAgICAgICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkSWRlbnRpZmllciA6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICh0b2tlbi50eXBlID09PSA2IC8qIE51bWVyaWNMaXRlcmFsICovKSA/IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZE51bWJlciA6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9rZW4udHlwZSA9PT0gOCAvKiBTdHJpbmdMaXRlcmFsICovKSA/IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFN0cmluZyA6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRva2VuLnR5cGUgPT09IDEwIC8qIFRlbXBsYXRlICovKSA/IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFRlbXBsYXRlIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW47XG5cdCAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gNCAvKiBLZXl3b3JkICovKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc0Z1dHVyZVJlc2VydmVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkUmVzZXJ2ZWQ7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgdGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQ7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhbHVlID0gdG9rZW4udmFsdWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB2YWx1ZSA9ICdJTExFR0FMJztcblx0ICAgICAgICB9XG5cdCAgICAgICAgbXNnID0gbXNnLnJlcGxhY2UoJyUwJywgdmFsdWUpO1xuXHQgICAgICAgIGlmICh0b2tlbiAmJiB0eXBlb2YgdG9rZW4ubGluZU51bWJlciA9PT0gJ251bWJlcicpIHtcblx0ICAgICAgICAgICAgdmFyIGluZGV4ID0gdG9rZW4uc3RhcnQ7XG5cdCAgICAgICAgICAgIHZhciBsaW5lID0gdG9rZW4ubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgdmFyIGxhc3RNYXJrZXJMaW5lU3RhcnQgPSB0aGlzLmxhc3RNYXJrZXIuaW5kZXggLSB0aGlzLmxhc3RNYXJrZXIuY29sdW1uO1xuXHQgICAgICAgICAgICB2YXIgY29sdW1uID0gdG9rZW4uc3RhcnQgLSBsYXN0TWFya2VyTGluZVN0YXJ0ICsgMTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGluZGV4LCBsaW5lLCBjb2x1bW4sIG1zZyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmxhc3RNYXJrZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIHZhciBsaW5lID0gdGhpcy5sYXN0TWFya2VyLmxpbmU7XG5cdCAgICAgICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmxhc3RNYXJrZXIuY29sdW1uICsgMTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGluZGV4LCBsaW5lLCBjb2x1bW4sIG1zZyk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUudGhyb3dVbmV4cGVjdGVkVG9rZW4gPSBmdW5jdGlvbiAodG9rZW4sIG1lc3NhZ2UpIHtcblx0ICAgICAgICB0aHJvdyB0aGlzLnVuZXhwZWN0ZWRUb2tlbkVycm9yKHRva2VuLCBtZXNzYWdlKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuID0gZnVuY3Rpb24gKHRva2VuLCBtZXNzYWdlKSB7XG5cdCAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIudG9sZXJhdGUodGhpcy51bmV4cGVjdGVkVG9rZW5FcnJvcih0b2tlbiwgbWVzc2FnZSkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuY29sbGVjdENvbW1lbnRzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICghdGhpcy5jb25maWcuY29tbWVudCkge1xuXHQgICAgICAgICAgICB0aGlzLnNjYW5uZXIuc2NhbkNvbW1lbnRzKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB2YXIgY29tbWVudHMgPSB0aGlzLnNjYW5uZXIuc2NhbkNvbW1lbnRzKCk7XG5cdCAgICAgICAgICAgIGlmIChjb21tZW50cy5sZW5ndGggPiAwICYmIHRoaXMuZGVsZWdhdGUpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyArK2kpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGNvbW1lbnRzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gdm9pZCAwO1xuXHQgICAgICAgICAgICAgICAgICAgIG5vZGUgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGUubXVsdGlMaW5lID8gJ0Jsb2NrQ29tbWVudCcgOiAnTGluZUNvbW1lbnQnLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5zY2FubmVyLnNvdXJjZS5zbGljZShlLnNsaWNlWzBdLCBlLnNsaWNlWzFdKVxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLnJhbmdlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmFuZ2UgPSBlLnJhbmdlO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcubG9jKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubG9jID0gZS5sb2M7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IGUubG9jLnN0YXJ0LmxpbmUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGUubG9jLnN0YXJ0LmNvbHVtbixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogZS5yYW5nZVswXVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IGUubG9jLmVuZC5saW5lLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBlLmxvYy5lbmQuY29sdW1uLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBlLnJhbmdlWzFdXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8vIEZyb20gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gYW4gZXh0ZXJuYWwgc3RydWN0dXJlXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmdldFRva2VuUmF3ID0gZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuc2Nhbm5lci5zb3VyY2Uuc2xpY2UodG9rZW4uc3RhcnQsIHRva2VuLmVuZCk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5jb252ZXJ0VG9rZW4gPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICB2YXIgdCA9IHtcblx0ICAgICAgICAgICAgdHlwZTogdG9rZW5fMS5Ub2tlbk5hbWVbdG9rZW4udHlwZV0sXG5cdCAgICAgICAgICAgIHZhbHVlOiB0aGlzLmdldFRva2VuUmF3KHRva2VuKVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLnJhbmdlKSB7XG5cdCAgICAgICAgICAgIHQucmFuZ2UgPSBbdG9rZW4uc3RhcnQsIHRva2VuLmVuZF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb2MpIHtcblx0ICAgICAgICAgICAgdC5sb2MgPSB7XG5cdCAgICAgICAgICAgICAgICBzdGFydDoge1xuXHQgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMuc3RhcnRNYXJrZXIubGluZSxcblx0ICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuc3RhcnRNYXJrZXIuY29sdW1uXG5cdCAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgZW5kOiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA5IC8qIFJlZ3VsYXJFeHByZXNzaW9uICovKSB7XG5cdCAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gdG9rZW4ucGF0dGVybjtcblx0ICAgICAgICAgICAgdmFyIGZsYWdzID0gdG9rZW4uZmxhZ3M7XG5cdCAgICAgICAgICAgIHQucmVnZXggPSB7IHBhdHRlcm46IHBhdHRlcm4sIGZsYWdzOiBmbGFncyB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdDtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLm5leHRUb2tlbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuaW5kZXggPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuY29sdW1uID0gdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydDtcblx0ICAgICAgICB0aGlzLmNvbGxlY3RDb21tZW50cygpO1xuXHQgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaW5kZXggIT09IHRoaXMuc3RhcnRNYXJrZXIuaW5kZXgpIHtcblx0ICAgICAgICAgICAgdGhpcy5zdGFydE1hcmtlci5pbmRleCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICAgICAgdGhpcy5zdGFydE1hcmtlci5saW5lID0gdGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgICAgIHRoaXMuc3RhcnRNYXJrZXIuY29sdW1uID0gdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG5leHQgPSB0aGlzLnNjYW5uZXIubGV4KCk7XG5cdCAgICAgICAgdGhpcy5oYXNMaW5lVGVybWluYXRvciA9ICh0b2tlbi5saW5lTnVtYmVyICE9PSBuZXh0LmxpbmVOdW1iZXIpO1xuXHQgICAgICAgIGlmIChuZXh0ICYmIHRoaXMuY29udGV4dC5zdHJpY3QgJiYgbmV4dC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQobmV4dC52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIG5leHQudHlwZSA9IDQgLyogS2V5d29yZCAqLztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmxvb2thaGVhZCA9IG5leHQ7XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLnRva2VucyAmJiBuZXh0LnR5cGUgIT09IDIgLyogRU9GICovKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy5jb252ZXJ0VG9rZW4obmV4dCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5uZXh0UmVnZXhUb2tlbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmNvbGxlY3RDb21tZW50cygpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMuc2Nhbm5lci5zY2FuUmVnRXhwKCk7XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLnRva2Vucykge1xuXHQgICAgICAgICAgICAvLyBQb3AgdGhlIHByZXZpb3VzIHRva2VuLCAnLycgb3IgJy89J1xuXHQgICAgICAgICAgICAvLyBUaGlzIGlzIGFkZGVkIGZyb20gdGhlIGxvb2thaGVhZCB0b2tlbi5cblx0ICAgICAgICAgICAgdGhpcy50b2tlbnMucG9wKCk7XG5cdCAgICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy5jb252ZXJ0VG9rZW4odG9rZW4pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gUHJpbWUgdGhlIG5leHQgbG9va2FoZWFkLlxuXHQgICAgICAgIHRoaXMubG9va2FoZWFkID0gdG9rZW47XG5cdCAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVOb2RlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIGluZGV4OiB0aGlzLnN0YXJ0TWFya2VyLmluZGV4LFxuXHQgICAgICAgICAgICBsaW5lOiB0aGlzLnN0YXJ0TWFya2VyLmxpbmUsXG5cdCAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zdGFydE1hcmtlci5jb2x1bW5cblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuc3RhcnROb2RlID0gZnVuY3Rpb24gKHRva2VuLCBsYXN0TGluZVN0YXJ0KSB7XG5cdCAgICAgICAgaWYgKGxhc3RMaW5lU3RhcnQgPT09IHZvaWQgMCkgeyBsYXN0TGluZVN0YXJ0ID0gMDsgfVxuXHQgICAgICAgIHZhciBjb2x1bW4gPSB0b2tlbi5zdGFydCAtIHRva2VuLmxpbmVTdGFydDtcblx0ICAgICAgICB2YXIgbGluZSA9IHRva2VuLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgaWYgKGNvbHVtbiA8IDApIHtcblx0ICAgICAgICAgICAgY29sdW1uICs9IGxhc3RMaW5lU3RhcnQ7XG5cdCAgICAgICAgICAgIGxpbmUtLTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgaW5kZXg6IHRva2VuLnN0YXJ0LFxuXHQgICAgICAgICAgICBsaW5lOiBsaW5lLFxuXHQgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uIChtYXJrZXIsIG5vZGUpIHtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcucmFuZ2UpIHtcblx0ICAgICAgICAgICAgbm9kZS5yYW5nZSA9IFttYXJrZXIuaW5kZXgsIHRoaXMubGFzdE1hcmtlci5pbmRleF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb2MpIHtcblx0ICAgICAgICAgICAgbm9kZS5sb2MgPSB7XG5cdCAgICAgICAgICAgICAgICBzdGFydDoge1xuXHQgICAgICAgICAgICAgICAgICAgIGxpbmU6IG1hcmtlci5saW5lLFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogbWFya2VyLmNvbHVtbixcblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxhc3RNYXJrZXIubGluZSxcblx0ICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMubGFzdE1hcmtlci5jb2x1bW5cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLnNvdXJjZSkge1xuXHQgICAgICAgICAgICAgICAgbm9kZS5sb2Muc291cmNlID0gdGhpcy5jb25maWcuc291cmNlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmRlbGVnYXRlKSB7XG5cdCAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IHtcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogbWFya2VyLmxpbmUsXG5cdCAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBtYXJrZXIuY29sdW1uLFxuXHQgICAgICAgICAgICAgICAgICAgIG9mZnNldDogbWFya2VyLmluZGV4XG5cdCAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgZW5kOiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5sYXN0TWFya2VyLmxpbmUsXG5cdCAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmxhc3RNYXJrZXIuY29sdW1uLFxuXHQgICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5sYXN0TWFya2VyLmluZGV4XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gbm9kZTtcblx0ICAgIH07XG5cdCAgICAvLyBFeHBlY3QgdGhlIG5leHQgdG9rZW4gdG8gbWF0Y2ggdGhlIHNwZWNpZmllZCBwdW5jdHVhdG9yLlxuXHQgICAgLy8gSWYgbm90LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmV4cGVjdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09IDcgLyogUHVuY3R1YXRvciAqLyB8fCB0b2tlbi52YWx1ZSAhPT0gdmFsdWUpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8vIFF1aWV0bHkgZXhwZWN0IGEgY29tbWEgd2hlbiBpbiB0b2xlcmFudCBtb2RlLCBvdGhlcndpc2UgZGVsZWdhdGVzIHRvIGV4cGVjdCgpLlxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5leHBlY3RDb21tYVNlcGFyYXRvciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcudG9sZXJhbnQpIHtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8gJiYgdG9rZW4udmFsdWUgPT09ICcsJykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8gJiYgdG9rZW4udmFsdWUgPT09ICc7Jykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW4pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvLyBFeHBlY3QgdGhlIG5leHQgdG9rZW4gdG8gbWF0Y2ggdGhlIHNwZWNpZmllZCBrZXl3b3JkLlxuXHQgICAgLy8gSWYgbm90LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmV4cGVjdEtleXdvcmQgPSBmdW5jdGlvbiAoa2V5d29yZCkge1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09IDQgLyogS2V5d29yZCAqLyB8fCB0b2tlbi52YWx1ZSAhPT0ga2V5d29yZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHB1bmN0dWF0b3IuXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiB0aGlzLmxvb2thaGVhZC52YWx1ZSA9PT0gdmFsdWU7XG5cdCAgICB9O1xuXHQgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGtleXdvcmRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUubWF0Y2hLZXl3b3JkID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5sb29rYWhlYWQudHlwZSA9PT0gNCAvKiBLZXl3b3JkICovICYmIHRoaXMubG9va2FoZWFkLnZhbHVlID09PSBrZXl3b3JkO1xuXHQgICAgfTtcblx0ICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBjb250ZXh0dWFsIGtleXdvcmRcblx0ICAgIC8vICh3aGVyZSBhbiBpZGVudGlmaWVyIGlzIHNvbWV0aW1lcyBhIGtleXdvcmQgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0KVxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5tYXRjaENvbnRleHR1YWxLZXl3b3JkID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovICYmIHRoaXMubG9va2FoZWFkLnZhbHVlID09PSBrZXl3b3JkO1xuXHQgICAgfTtcblx0ICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBuZXh0IHRva2VuIGlzIGFuIGFzc2lnbm1lbnQgb3BlcmF0b3Jcblx0ICAgIFBhcnNlci5wcm90b3R5cGUubWF0Y2hBc3NpZ24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDcgLyogUHVuY3R1YXRvciAqLykge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBvcCA9IHRoaXMubG9va2FoZWFkLnZhbHVlO1xuXHQgICAgICAgIHJldHVybiBvcCA9PT0gJz0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnKj0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnKio9JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJy89JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJyU9JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJys9JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJy09JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJzw8PScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICc+Pj0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnPj4+PScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICcmPScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICdePScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICd8PSc7XG5cdCAgICB9O1xuXHQgICAgLy8gQ292ZXIgZ3JhbW1hciBzdXBwb3J0LlxuXHQgICAgLy9cblx0ICAgIC8vIFdoZW4gYW4gYXNzaWdubWVudCBleHByZXNzaW9uIHBvc2l0aW9uIHN0YXJ0cyB3aXRoIGFuIGxlZnQgcGFyZW50aGVzaXMsIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHRoZSB0eXBlXG5cdCAgICAvLyBvZiB0aGUgc3ludGF4IGlzIHRvIGJlIGRlZmVycmVkIGFyYml0cmFyaWx5IGxvbmcgdW50aWwgdGhlIGVuZCBvZiB0aGUgcGFyZW50aGVzZXMgcGFpciAocGx1cyBhIGxvb2thaGVhZClcblx0ICAgIC8vIG9yIHRoZSBmaXJzdCBjb21tYS4gVGhpcyBzaXR1YXRpb24gYWxzbyBkZWZlcnMgdGhlIGRldGVybWluYXRpb24gb2YgYWxsIHRoZSBleHByZXNzaW9ucyBuZXN0ZWQgaW4gdGhlIHBhaXIuXG5cdCAgICAvL1xuXHQgICAgLy8gVGhlcmUgYXJlIHRocmVlIHByb2R1Y3Rpb25zIHRoYXQgY2FuIGJlIHBhcnNlZCBpbiBhIHBhcmVudGhlc2VzIHBhaXIgdGhhdCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkXG5cdCAgICAvLyBhZnRlciB0aGUgb3V0ZXJtb3N0IHBhaXIgaXMgY2xvc2VkLiBUaGV5IGFyZTpcblx0ICAgIC8vXG5cdCAgICAvLyAgIDEuIEFzc2lnbm1lbnRFeHByZXNzaW9uXG5cdCAgICAvLyAgIDIuIEJpbmRpbmdFbGVtZW50c1xuXHQgICAgLy8gICAzLiBBc3NpZ25tZW50VGFyZ2V0c1xuXHQgICAgLy9cblx0ICAgIC8vIEluIG9yZGVyIHRvIGF2b2lkIGV4cG9uZW50aWFsIGJhY2t0cmFja2luZywgd2UgdXNlIHR3byBmbGFncyB0byBkZW5vdGUgaWYgdGhlIHByb2R1Y3Rpb24gY2FuIGJlXG5cdCAgICAvLyBiaW5kaW5nIGVsZW1lbnQgb3IgYXNzaWdubWVudCB0YXJnZXQuXG5cdCAgICAvL1xuXHQgICAgLy8gVGhlIHRocmVlIHByb2R1Y3Rpb25zIGhhdmUgdGhlIHJlbGF0aW9uc2hpcDpcblx0ICAgIC8vXG5cdCAgICAvLyAgIEJpbmRpbmdFbGVtZW50cyDiioYgQXNzaWdubWVudFRhcmdldHMg4oqGIEFzc2lnbm1lbnRFeHByZXNzaW9uXG5cdCAgICAvL1xuXHQgICAgLy8gd2l0aCBhIHNpbmdsZSBleGNlcHRpb24gdGhhdCBDb3ZlckluaXRpYWxpemVkTmFtZSB3aGVuIHVzZWQgZGlyZWN0bHkgaW4gYW4gRXhwcmVzc2lvbiwgZ2VuZXJhdGVzXG5cdCAgICAvLyBhbiBlYXJseSBlcnJvci4gVGhlcmVmb3JlLCB3ZSBuZWVkIHRoZSB0aGlyZCBzdGF0ZSwgZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yLCB0byB0cmFjayB0aGVcblx0ICAgIC8vIGZpcnN0IHVzYWdlIG9mIENvdmVySW5pdGlhbGl6ZWROYW1lIGFuZCByZXBvcnQgaXQgd2hlbiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHBhcmVudGhlc2VzIHBhaXIuXG5cdCAgICAvL1xuXHQgICAgLy8gaXNvbGF0ZUNvdmVyR3JhbW1hciBmdW5jdGlvbiBydW5zIHRoZSBnaXZlbiBwYXJzZXIgZnVuY3Rpb24gd2l0aCBhIG5ldyBjb3ZlciBncmFtbWFyIGNvbnRleHQsIGFuZCBpdCBkb2VzIG5vdFxuXHQgICAgLy8gZWZmZWN0IHRoZSBjdXJyZW50IGZsYWdzLiBUaGlzIG1lYW5zIHRoZSBwcm9kdWN0aW9uIHRoZSBwYXJzZXIgcGFyc2VzIGlzIG9ubHkgdXNlZCBhcyBhbiBleHByZXNzaW9uLiBUaGVyZWZvcmVcblx0ICAgIC8vIHRoZSBDb3ZlckluaXRpYWxpemVkTmFtZSBjaGVjayBpcyBjb25kdWN0ZWQuXG5cdCAgICAvL1xuXHQgICAgLy8gaW5oZXJpdENvdmVyR3JhbW1hciBmdW5jdGlvbiBydW5zIHRoZSBnaXZlbiBwYXJzZSBmdW5jdGlvbiB3aXRoIGEgbmV3IGNvdmVyIGdyYW1tYXIgY29udGV4dCwgYW5kIGl0IHByb3BhZ2F0ZXNcblx0ICAgIC8vIHRoZSBmbGFncyBvdXRzaWRlIG9mIHRoZSBwYXJzZXIuIFRoaXMgbWVhbnMgdGhlIHByb2R1Y3Rpb24gdGhlIHBhcnNlciBwYXJzZXMgaXMgdXNlZCBhcyBhIHBhcnQgb2YgYSBwb3RlbnRpYWxcblx0ICAgIC8vIHBhdHRlcm4uIFRoZSBDb3ZlckluaXRpYWxpemVkTmFtZSBjaGVjayBpcyBkZWZlcnJlZC5cblx0ICAgIFBhcnNlci5wcm90b3R5cGUuaXNvbGF0ZUNvdmVyR3JhbW1hciA9IGZ1bmN0aW9uIChwYXJzZUZ1bmN0aW9uKSB7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzSXNCaW5kaW5nRWxlbWVudCA9IHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0lzQXNzaWdubWVudFRhcmdldCA9IHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQ7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzRmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gdGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvcjtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciA9IG51bGw7XG5cdCAgICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlRnVuY3Rpb24uY2FsbCh0aGlzKTtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IHByZXZpb3VzSXNCaW5kaW5nRWxlbWVudDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gcHJldmlvdXNJc0Fzc2lnbm1lbnRUYXJnZXQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciA9IHByZXZpb3VzRmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yO1xuXHQgICAgICAgIHJldHVybiByZXN1bHQ7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5pbmhlcml0Q292ZXJHcmFtbWFyID0gZnVuY3Rpb24gKHBhcnNlRnVuY3Rpb24pIHtcblx0ICAgICAgICB2YXIgcHJldmlvdXNJc0JpbmRpbmdFbGVtZW50ID0gdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzSXNBc3NpZ25tZW50VGFyZ2V0ID0gdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNGaXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gbnVsbDtcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gcGFyc2VGdW5jdGlvbi5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgJiYgcHJldmlvdXNJc0JpbmRpbmdFbGVtZW50O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ICYmIHByZXZpb3VzSXNBc3NpZ25tZW50VGFyZ2V0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSBwcmV2aW91c0ZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciB8fCB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yO1xuXHQgICAgICAgIHJldHVybiByZXN1bHQ7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5jb25zdW1lU2VtaWNvbG9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCc7JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAoIXRoaXMuaGFzTGluZVRlcm1pbmF0b3IpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovICYmICF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMubGFzdE1hcmtlci5pbmRleCA9IHRoaXMuc3RhcnRNYXJrZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIHRoaXMubGFzdE1hcmtlci5saW5lID0gdGhpcy5zdGFydE1hcmtlci5saW5lO1xuXHQgICAgICAgICAgICB0aGlzLmxhc3RNYXJrZXIuY29sdW1uID0gdGhpcy5zdGFydE1hcmtlci5jb2x1bW47XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByaW1hcnktZXhwcmVzc2lvblxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVByaW1hcnlFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGV4cHI7XG5cdCAgICAgICAgdmFyIHRva2VuLCByYXc7XG5cdCAgICAgICAgc3dpdGNoICh0aGlzLmxvb2thaGVhZC50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2UgMyAvKiBJZGVudGlmaWVyICovOlxuXHQgICAgICAgICAgICAgICAgaWYgKCh0aGlzLmNvbnRleHQuaXNNb2R1bGUgfHwgdGhpcy5jb250ZXh0LmF3YWl0KSAmJiB0aGlzLmxvb2thaGVhZC52YWx1ZSA9PT0gJ2F3YWl0Jykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMubWF0Y2hBc3luY0Z1bmN0aW9uKCkgPyB0aGlzLnBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKCkgOiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIodGhpcy5uZXh0VG9rZW4oKS52YWx1ZSkpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgNiAvKiBOdW1lcmljTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA4IC8qIFN0cmluZ0xpdGVyYWwgKi86XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiB0aGlzLmxvb2thaGVhZC5vY3RhbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQsIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0T2N0YWxMaXRlcmFsKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICByYXcgPSB0aGlzLmdldFRva2VuUmF3KHRva2VuKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkxpdGVyYWwodG9rZW4udmFsdWUsIHJhdykpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgMSAvKiBCb29sZWFuTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICByYXcgPSB0aGlzLmdldFRva2VuUmF3KHRva2VuKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkxpdGVyYWwodG9rZW4udmFsdWUgPT09ICd0cnVlJywgcmF3KSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSA1IC8qIE51bGxMaXRlcmFsICovOlxuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuTGl0ZXJhbChudWxsLCByYXcpKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDEwIC8qIFRlbXBsYXRlICovOlxuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMucGFyc2VUZW1wbGF0ZUxpdGVyYWwoKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDcgLyogUHVuY3R1YXRvciAqLzpcblx0ICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5sb29rYWhlYWQudmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICcoJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlR3JvdXBFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnWyc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFycmF5SW5pdGlhbGl6ZXIpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICd7Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlT2JqZWN0SW5pdGlhbGl6ZXIpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzpcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICcvPSc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmluZGV4ID0gdGhpcy5zdGFydE1hcmtlci5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLm5leHRSZWdleFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5SZWdleExpdGVyYWwodG9rZW4ucmVnZXgsIHJhdywgdG9rZW4ucGF0dGVybiwgdG9rZW4uZmxhZ3MpKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSA0IC8qIEtleXdvcmQgKi86XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5zdHJpY3QgJiYgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgJiYgdGhpcy5tYXRjaEtleXdvcmQoJ3lpZWxkJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5jb250ZXh0LnN0cmljdCAmJiB0aGlzLm1hdGNoS2V5d29yZCgnbGV0JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5JZGVudGlmaWVyKHRoaXMubmV4dFRva2VuKCkudmFsdWUpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnZnVuY3Rpb24nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoS2V5d29yZCgndGhpcycpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlRoaXNFeHByZXNzaW9uKCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnY2xhc3MnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZUNsYXNzRXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXktaW5pdGlhbGl6ZXJcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTcHJlYWRFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJy4uLicpO1xuXHQgICAgICAgIHZhciBhcmcgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5TcHJlYWRFbGVtZW50KGFyZykpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VBcnJheUluaXRpYWxpemVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGVsZW1lbnRzID0gW107XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ1snKTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2goJ10nKSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnLCcpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaChudWxsKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCcuLi4nKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLnBhcnNlU3ByZWFkRWxlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCddJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaChlbGVtZW50KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2godGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbikpO1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCddJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCddJyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXJyYXlFeHByZXNzaW9uKGVsZW1lbnRzKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LWluaXRpYWxpemVyXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlUHJvcGVydHlNZXRob2QgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzU3RyaWN0ID0gdGhpcy5jb250ZXh0LnN0cmljdDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZSA9IHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmUgPSBwYXJhbXMuc2ltcGxlO1xuXHQgICAgICAgIHZhciBib2R5ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VGdW5jdGlvblNvdXJjZUVsZW1lbnRzKTtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBwYXJhbXMuZmlyc3RSZXN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4ocGFyYW1zLmZpcnN0UmVzdHJpY3RlZCwgcGFyYW1zLm1lc3NhZ2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBwYXJhbXMuc3RyaWN0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbihwYXJhbXMuc3RyaWN0ZWQsIHBhcmFtcy5tZXNzYWdlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHByZXZpb3VzU3RyaWN0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZSA9IHByZXZpb3VzQWxsb3dTdHJpY3REaXJlY3RpdmU7XG5cdCAgICAgICAgcmV0dXJuIGJvZHk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVByb3BlcnR5TWV0aG9kRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGlzR2VuZXJhdG9yID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1lpZWxkID0gdGhpcy5jb250ZXh0LmFsbG93WWllbGQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSB0cnVlO1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSB0aGlzLnBhcnNlRm9ybWFsUGFyYW1ldGVycygpO1xuXHQgICAgICAgIHZhciBtZXRob2QgPSB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2QocGFyYW1zKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5GdW5jdGlvbkV4cHJlc3Npb24obnVsbCwgcGFyYW1zLnBhcmFtcywgbWV0aG9kLCBpc0dlbmVyYXRvcikpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VQcm9wZXJ0eU1ldGhvZEFzeW5jRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1lpZWxkID0gdGhpcy5jb250ZXh0LmFsbG93WWllbGQ7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQXdhaXQgPSB0aGlzLmNvbnRleHQuYXdhaXQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSB0cnVlO1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSB0aGlzLnBhcnNlRm9ybWFsUGFyYW1ldGVycygpO1xuXHQgICAgICAgIHZhciBtZXRob2QgPSB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2QocGFyYW1zKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBwcmV2aW91c0F3YWl0O1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkFzeW5jRnVuY3Rpb25FeHByZXNzaW9uKG51bGwsIHBhcmFtcy5wYXJhbXMsIG1ldGhvZCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VPYmplY3RQcm9wZXJ0eUtleSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdmFyIGtleTtcblx0ICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSA4IC8qIFN0cmluZ0xpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgNiAvKiBOdW1lcmljTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHRva2VuLm9jdGFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RPY3RhbExpdGVyYWwpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdmFyIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5MaXRlcmFsKHRva2VuLnZhbHVlLCByYXcpKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDMgLyogSWRlbnRpZmllciAqLzpcblx0ICAgICAgICAgICAgY2FzZSAxIC8qIEJvb2xlYW5MaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDUgLyogTnVsbExpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgNCAvKiBLZXl3b3JkICovOlxuXHQgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5JZGVudGlmaWVyKHRva2VuLnZhbHVlKSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSA3IC8qIFB1bmN0dWF0b3IgKi86XG5cdCAgICAgICAgICAgICAgICBpZiAodG9rZW4udmFsdWUgPT09ICdbJykge1xuXHQgICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCddJyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAga2V5ID0gdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBrZXk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5pc1Byb3BlcnR5S2V5ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0ICAgICAgICByZXR1cm4gKGtleS50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllciAmJiBrZXkubmFtZSA9PT0gdmFsdWUpIHx8XG5cdCAgICAgICAgICAgIChrZXkudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LkxpdGVyYWwgJiYga2V5LnZhbHVlID09PSB2YWx1ZSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU9iamVjdFByb3BlcnR5ID0gZnVuY3Rpb24gKGhhc1Byb3RvKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIga2luZDtcblx0ICAgICAgICB2YXIga2V5ID0gbnVsbDtcblx0ICAgICAgICB2YXIgdmFsdWUgPSBudWxsO1xuXHQgICAgICAgIHZhciBjb21wdXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBtZXRob2QgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgc2hvcnRoYW5kID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIGlzQXN5bmMgPSBmYWxzZTtcblx0ICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovKSB7XG5cdCAgICAgICAgICAgIHZhciBpZCA9IHRva2VuLnZhbHVlO1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBjb21wdXRlZCA9IHRoaXMubWF0Y2goJ1snKTtcblx0ICAgICAgICAgICAgaXNBc3luYyA9ICF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yICYmIChpZCA9PT0gJ2FzeW5jJykgJiZcblx0ICAgICAgICAgICAgICAgICF0aGlzLm1hdGNoKCc6JykgJiYgIXRoaXMubWF0Y2goJygnKSAmJiAhdGhpcy5tYXRjaCgnKicpICYmICF0aGlzLm1hdGNoKCcsJyk7XG5cdCAgICAgICAgICAgIGtleSA9IGlzQXN5bmMgPyB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKSA6IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWRlbnRpZmllcihpZCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCcqJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGxvb2thaGVhZFByb3BlcnR5S2V5ID0gdGhpcy5xdWFsaWZpZWRQcm9wZXJ0eU5hbWUodGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgIWlzQXN5bmMgJiYgdG9rZW4udmFsdWUgPT09ICdnZXQnICYmIGxvb2thaGVhZFByb3BlcnR5S2V5KSB7XG5cdCAgICAgICAgICAgIGtpbmQgPSAnZ2V0Jztcblx0ICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IGZhbHNlO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VHZXR0ZXJNZXRob2QoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovICYmICFpc0FzeW5jICYmIHRva2VuLnZhbHVlID09PSAnc2V0JyAmJiBsb29rYWhlYWRQcm9wZXJ0eUtleSkge1xuXHQgICAgICAgICAgICBraW5kID0gJ3NldCc7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlU2V0dGVyTWV0aG9kKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiB0b2tlbi52YWx1ZSA9PT0gJyonICYmIGxvb2thaGVhZFByb3BlcnR5S2V5KSB7XG5cdCAgICAgICAgICAgIGtpbmQgPSAnaW5pdCc7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlR2VuZXJhdG9yTWV0aG9kKCk7XG5cdCAgICAgICAgICAgIG1ldGhvZCA9IHRydWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBpZiAoIWtleSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAga2luZCA9ICdpbml0Jztcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJzonKSAmJiAhaXNBc3luYykge1xuXHQgICAgICAgICAgICAgICAgaWYgKCFjb21wdXRlZCAmJiB0aGlzLmlzUHJvcGVydHlLZXkoa2V5LCAnX19wcm90b19fJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUHJvdG8udmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuRHVwbGljYXRlUHJvdG9Qcm9wZXJ0eSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGhhc1Byb3RvLnZhbHVlID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJygnKSkge1xuXHQgICAgICAgICAgICAgICAgdmFsdWUgPSBpc0FzeW5jID8gdGhpcy5wYXJzZVByb3BlcnR5TWV0aG9kQXN5bmNGdW5jdGlvbigpIDogdGhpcy5wYXJzZVByb3BlcnR5TWV0aG9kRnVuY3Rpb24oKTtcblx0ICAgICAgICAgICAgICAgIG1ldGhvZCA9IHRydWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIodG9rZW4udmFsdWUpKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCc9JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICBzaG9ydGhhbmQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBpbml0ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkFzc2lnbm1lbnRQYXR0ZXJuKGlkLCBpbml0KSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBzaG9ydGhhbmQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaWQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlByb3BlcnR5KGtpbmQsIGtleSwgY29tcHV0ZWQsIHZhbHVlLCBtZXRob2QsIHNob3J0aGFuZCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VPYmplY3RJbml0aWFsaXplciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG5cdCAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBbXTtcblx0ICAgICAgICB2YXIgaGFzUHJvdG8gPSB7IHZhbHVlOiBmYWxzZSB9O1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaCh0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHkoaGFzUHJvdG8pKTtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0Q29tbWFTZXBhcmF0b3IoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnfScpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLk9iamVjdEV4cHJlc3Npb24ocHJvcGVydGllcykpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRlbXBsYXRlLWxpdGVyYWxzXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVGVtcGxhdGVIZWFkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGFzc2VydF8xLmFzc2VydCh0aGlzLmxvb2thaGVhZC5oZWFkLCAnVGVtcGxhdGUgbGl0ZXJhbCBtdXN0IHN0YXJ0IHdpdGggYSB0ZW1wbGF0ZSBoZWFkJyk7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIHZhciByYXcgPSB0b2tlbi52YWx1ZTtcblx0ICAgICAgICB2YXIgY29va2VkID0gdG9rZW4uY29va2VkO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlRlbXBsYXRlRWxlbWVudCh7IHJhdzogcmF3LCBjb29rZWQ6IGNvb2tlZCB9LCB0b2tlbi50YWlsKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVRlbXBsYXRlRWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMTAgLyogVGVtcGxhdGUgKi8pIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdmFyIHJhdyA9IHRva2VuLnZhbHVlO1xuXHQgICAgICAgIHZhciBjb29rZWQgPSB0b2tlbi5jb29rZWQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVGVtcGxhdGVFbGVtZW50KHsgcmF3OiByYXcsIGNvb2tlZDogY29va2VkIH0sIHRva2VuLnRhaWwpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVGVtcGxhdGVMaXRlcmFsID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGV4cHJlc3Npb25zID0gW107XG5cdCAgICAgICAgdmFyIHF1YXNpcyA9IFtdO1xuXHQgICAgICAgIHZhciBxdWFzaSA9IHRoaXMucGFyc2VUZW1wbGF0ZUhlYWQoKTtcblx0ICAgICAgICBxdWFzaXMucHVzaChxdWFzaSk7XG5cdCAgICAgICAgd2hpbGUgKCFxdWFzaS50YWlsKSB7XG5cdCAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2godGhpcy5wYXJzZUV4cHJlc3Npb24oKSk7XG5cdCAgICAgICAgICAgIHF1YXNpID0gdGhpcy5wYXJzZVRlbXBsYXRlRWxlbWVudCgpO1xuXHQgICAgICAgICAgICBxdWFzaXMucHVzaChxdWFzaSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlRlbXBsYXRlTGl0ZXJhbChxdWFzaXMsIGV4cHJlc3Npb25zKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ3JvdXBpbmctb3BlcmF0b3Jcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuID0gZnVuY3Rpb24gKGV4cHIpIHtcblx0ICAgICAgICBzd2l0Y2ggKGV4cHIudHlwZSkge1xuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyOlxuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5NZW1iZXJFeHByZXNzaW9uOlxuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5SZXN0RWxlbWVudDpcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudFBhdHRlcm46XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguU3ByZWFkRWxlbWVudDpcblx0ICAgICAgICAgICAgICAgIGV4cHIudHlwZSA9IHN5bnRheF8xLlN5bnRheC5SZXN0RWxlbWVudDtcblx0ICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHIuYXJndW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LkFycmF5RXhwcmVzc2lvbjpcblx0ICAgICAgICAgICAgICAgIGV4cHIudHlwZSA9IHN5bnRheF8xLlN5bnRheC5BcnJheVBhdHRlcm47XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHIuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZXhwci5lbGVtZW50c1tpXSAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByLmVsZW1lbnRzW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguT2JqZWN0RXhwcmVzc2lvbjpcblx0ICAgICAgICAgICAgICAgIGV4cHIudHlwZSA9IHN5bnRheF8xLlN5bnRheC5PYmplY3RQYXR0ZXJuO1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByLnByb3BlcnRpZXNbaV0udmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRFeHByZXNzaW9uOlxuXHQgICAgICAgICAgICAgICAgZXhwci50eXBlID0gc3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRQYXR0ZXJuO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIGV4cHIub3BlcmF0b3I7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByLmxlZnQpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAvLyBBbGxvdyBvdGhlciBub2RlIHR5cGUgZm9yIHRvbGVyYW50IHBhcnNpbmcuXG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUdyb3VwRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgZXhwcjtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKCcpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCc9PicpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnPT4nKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBleHByID0ge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgIHBhcmFtczogW10sXG5cdCAgICAgICAgICAgICAgICBhc3luYzogZmFsc2Vcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBzdGFydFRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIHZhciBwYXJhbXMgPSBbXTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJy4uLicpKSB7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZVJlc3RFbGVtZW50KHBhcmFtcyk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCc9PicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJz0+Jyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBleHByID0ge1xuXHQgICAgICAgICAgICAgICAgICAgIHR5cGU6IEFycm93UGFyYW1ldGVyUGxhY2VIb2xkZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBbZXhwcl0sXG5cdCAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG5cdCAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdmFyIGFycm93ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnLCcpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGV4cHJlc3Npb25zID0gW107XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2goZXhwcik7XG5cdCAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnLCcpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHJlc3Npb25zW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IGV4cHJlc3Npb25zLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCcuLi4nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaCh0aGlzLnBhcnNlUmVzdEVsZW1lbnQocGFyYW1zKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCc9PicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJz0+Jyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHJlc3Npb25zW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IGV4cHJlc3Npb25zLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2godGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbikpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJvdykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJvdykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuU2VxdWVuY2VFeHByZXNzaW9uKGV4cHJlc3Npb25zKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKCFhcnJvdykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJz0+JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHIudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIgJiYgZXhwci5uYW1lID09PSAneWllbGQnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJvdyA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEFycm93UGFyYW1ldGVyUGxhY2VIb2xkZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBbZXhwcl0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyb3cpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHByLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5TZXF1ZW5jZUV4cHJlc3Npb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHIuZXhwcmVzc2lvbnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwci5leHByZXNzaW9uc1tpXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwcik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9IChleHByLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5TZXF1ZW5jZUV4cHJlc3Npb24gPyBleHByLmV4cHJlc3Npb25zIDogW2V4cHJdKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtZXRlcnMsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbGVmdC1oYW5kLXNpZGUtZXhwcmVzc2lvbnNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VBcmd1bWVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICB2YXIgYXJncyA9IFtdO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgZXhwciA9IHRoaXMubWF0Y2goJy4uLicpID8gdGhpcy5wYXJzZVNwcmVhZEVsZW1lbnQoKSA6XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICBhcmdzLnB1c2goZXhwcik7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdENvbW1hU2VwYXJhdG9yKCk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJyknKTtcblx0ICAgICAgICByZXR1cm4gYXJncztcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmlzSWRlbnRpZmllck5hbWUgPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICByZXR1cm4gdG9rZW4udHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovIHx8XG5cdCAgICAgICAgICAgIHRva2VuLnR5cGUgPT09IDQgLyogS2V5d29yZCAqLyB8fFxuXHQgICAgICAgICAgICB0b2tlbi50eXBlID09PSAxIC8qIEJvb2xlYW5MaXRlcmFsICovIHx8XG5cdCAgICAgICAgICAgIHRva2VuLnR5cGUgPT09IDUgLyogTnVsbExpdGVyYWwgKi87XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUlkZW50aWZpZXJOYW1lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNJZGVudGlmaWVyTmFtZSh0b2tlbikpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIodG9rZW4udmFsdWUpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlTmV3RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyTmFtZSgpO1xuXHQgICAgICAgIGFzc2VydF8xLmFzc2VydChpZC5uYW1lID09PSAnbmV3JywgJ05ldyBleHByZXNzaW9uIG11c3Qgc3RhcnQgd2l0aCBgbmV3YCcpO1xuXHQgICAgICAgIHZhciBleHByO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCcuJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLyAmJiB0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkgJiYgdGhpcy5sb29rYWhlYWQudmFsdWUgPT09ICd0YXJnZXQnKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSBuZXcgTm9kZS5NZXRhUHJvcGVydHkoaWQsIHByb3BlcnR5KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB2YXIgY2FsbGVlID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VMZWZ0SGFuZFNpZGVFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgdmFyIGFyZ3MgPSB0aGlzLm1hdGNoKCcoJykgPyB0aGlzLnBhcnNlQXJndW1lbnRzKCkgOiBbXTtcblx0ICAgICAgICAgICAgZXhwciA9IG5ldyBOb2RlLk5ld0V4cHJlc3Npb24oY2FsbGVlLCBhcmdzKTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBleHByKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQXN5bmNBcmd1bWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgYXJnID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIGFyZztcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQXN5bmNBcmd1bWVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICB2YXIgYXJncyA9IFtdO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgZXhwciA9IHRoaXMubWF0Y2goJy4uLicpID8gdGhpcy5wYXJzZVNwcmVhZEVsZW1lbnQoKSA6XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3luY0FyZ3VtZW50KTtcblx0ICAgICAgICAgICAgICAgIGFyZ3MucHVzaChleHByKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0Q29tbWFTZXBhcmF0b3IoKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgIHJldHVybiBhcmdzO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VMZWZ0SGFuZFNpZGVFeHByZXNzaW9uQWxsb3dDYWxsID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGFydFRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIG1heWJlQXN5bmMgPSB0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzeW5jJyk7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dJbiA9IHRoaXMuY29udGV4dC5hbGxvd0luO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgZXhwcjtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ3N1cGVyJykgJiYgdGhpcy5jb250ZXh0LmluRnVuY3Rpb25Cb2R5KSB7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUoZXhwciwgbmV3IE5vZGUuU3VwZXIoKSk7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKCcpICYmICF0aGlzLm1hdGNoKCcuJykgJiYgIXRoaXMubWF0Y2goJ1snKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5tYXRjaEtleXdvcmQoJ25ldycpID8gdGhpcy5wYXJzZU5ld0V4cHJlc3Npb24gOiB0aGlzLnBhcnNlUHJpbWFyeUV4cHJlc3Npb24pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB3aGlsZSAodHJ1ZSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnLicpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLicpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuU3RhdGljTWVtYmVyRXhwcmVzc2lvbihleHByLCBwcm9wZXJ0eSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJygnKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGFzeW5jQXJyb3cgPSBtYXliZUFzeW5jICYmIChzdGFydFRva2VuLmxpbmVOdW1iZXIgPT09IHRoaXMubG9va2FoZWFkLmxpbmVOdW1iZXIpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHZhciBhcmdzID0gYXN5bmNBcnJvdyA/IHRoaXMucGFyc2VBc3luY0FyZ3VtZW50cygpIDogdGhpcy5wYXJzZUFyZ3VtZW50cygpO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLkNhbGxFeHByZXNzaW9uKGV4cHIsIGFyZ3MpKTtcblx0ICAgICAgICAgICAgICAgIGlmIChhc3luY0Fycm93ICYmIHRoaXMubWF0Y2goJz0+JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oYXJnc1tpXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEFycm93UGFyYW1ldGVyUGxhY2VIb2xkZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogYXJncyxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6IHRydWVcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJ1snKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJ1snKTtcblx0ICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlRXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnXScpO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLkNvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbihleHByLCBwcm9wZXJ0eSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDEwIC8qIFRlbXBsYXRlICovICYmIHRoaXMubG9va2FoZWFkLmhlYWQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBxdWFzaSA9IHRoaXMucGFyc2VUZW1wbGF0ZUxpdGVyYWwoKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5UYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24oZXhwciwgcXVhc2kpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gcHJldmlvdXNBbGxvd0luO1xuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTdXBlciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnc3VwZXInKTtcblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2goJ1snKSAmJiAhdGhpcy5tYXRjaCgnLicpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5TdXBlcigpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlTGVmdEhhbmRTaWRlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBhc3NlcnRfMS5hc3NlcnQodGhpcy5jb250ZXh0LmFsbG93SW4sICdjYWxsZWUgb2YgbmV3IGV4cHJlc3Npb24gYWx3YXlzIGFsbG93IGluIGtleXdvcmQuJyk7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSh0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgdmFyIGV4cHIgPSAodGhpcy5tYXRjaEtleXdvcmQoJ3N1cGVyJykgJiYgdGhpcy5jb250ZXh0LmluRnVuY3Rpb25Cb2R5KSA/IHRoaXMucGFyc2VTdXBlcigpIDpcblx0ICAgICAgICAgICAgdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMubWF0Y2hLZXl3b3JkKCduZXcnKSA/IHRoaXMucGFyc2VOZXdFeHByZXNzaW9uIDogdGhpcy5wYXJzZVByaW1hcnlFeHByZXNzaW9uKTtcblx0ICAgICAgICB3aGlsZSAodHJ1ZSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnWycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnWycpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCddJyk7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5Db21wdXRlZE1lbWJlckV4cHJlc3Npb24oZXhwciwgcHJvcGVydHkpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCcuJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcuJyk7XG5cdCAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlN0YXRpY01lbWJlckV4cHJlc3Npb24oZXhwciwgcHJvcGVydHkpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmxvb2thaGVhZC50eXBlID09PSAxMCAvKiBUZW1wbGF0ZSAqLyAmJiB0aGlzLmxvb2thaGVhZC5oZWFkKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcXVhc2kgPSB0aGlzLnBhcnNlVGVtcGxhdGVMaXRlcmFsKCk7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5UYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24oZXhwciwgcXVhc2kpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXVwZGF0ZS1leHByZXNzaW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVVwZGF0ZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGV4cHI7XG5cdCAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnKysnKSB8fCB0aGlzLm1hdGNoKCctLScpKSB7XG5cdCAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbik7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZVVuYXJ5RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGV4cHIudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIgJiYgdGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQoZXhwci5uYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0TEhTUHJlZml4KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRMSFNJbkFzc2lnbm1lbnQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBwcmVmaXggPSB0cnVlO1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5VcGRhdGVFeHByZXNzaW9uKHRva2VuLnZhbHVlLCBleHByLCBwcmVmaXgpKTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlTGVmdEhhbmRTaWRlRXhwcmVzc2lvbkFsbG93Q2FsbCk7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5oYXNMaW5lVGVybWluYXRvciAmJiB0aGlzLmxvb2thaGVhZC50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8pIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcrKycpIHx8IHRoaXMubWF0Y2goJy0tJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBleHByLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyICYmIHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKGV4cHIubmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0TEhTUG9zdGZpeCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkTEhTSW5Bc3NpZ25tZW50KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG9wZXJhdG9yID0gdGhpcy5uZXh0VG9rZW4oKS52YWx1ZTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZml4ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLlVwZGF0ZUV4cHJlc3Npb24ob3BlcmF0b3IsIGV4cHIsIHByZWZpeCkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXVuYXJ5LW9wZXJhdG9yc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUF3YWl0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdmFyIGFyZ3VtZW50ID0gdGhpcy5wYXJzZVVuYXJ5RXhwcmVzc2lvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkF3YWl0RXhwcmVzc2lvbihhcmd1bWVudCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VVbmFyeUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGV4cHI7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJysnKSB8fCB0aGlzLm1hdGNoKCctJykgfHwgdGhpcy5tYXRjaCgnficpIHx8IHRoaXMubWF0Y2goJyEnKSB8fFxuXHQgICAgICAgICAgICB0aGlzLm1hdGNoS2V5d29yZCgnZGVsZXRlJykgfHwgdGhpcy5tYXRjaEtleXdvcmQoJ3ZvaWQnKSB8fCB0aGlzLm1hdGNoS2V5d29yZCgndHlwZW9mJykpIHtcblx0ICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSh0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZVVuYXJ5RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlVuYXJ5RXhwcmVzc2lvbih0b2tlbi52YWx1ZSwgZXhwcikpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBleHByLm9wZXJhdG9yID09PSAnZGVsZXRlJyAmJiBleHByLmFyZ3VtZW50LnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3REZWxldGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodGhpcy5jb250ZXh0LmF3YWl0ICYmIHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnYXdhaXQnKSkge1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZUF3YWl0RXhwcmVzc2lvbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMucGFyc2VVcGRhdGVFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlVW5hcnlFeHByZXNzaW9uKTtcblx0ICAgICAgICBpZiAoZXhwci50eXBlICE9PSBzeW50YXhfMS5TeW50YXguVW5hcnlFeHByZXNzaW9uICYmIHRoaXMubWF0Y2goJyoqJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICB2YXIgbGVmdCA9IGV4cHI7XG5cdCAgICAgICAgICAgIHZhciByaWdodCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlRXhwb25lbnRpYXRpb25FeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLkJpbmFyeUV4cHJlc3Npb24oJyoqJywgbGVmdCwgcmlnaHQpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZXhwLW9wZXJhdG9yXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tdWx0aXBsaWNhdGl2ZS1vcGVyYXRvcnNcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFkZGl0aXZlLW9wZXJhdG9yc1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYml0d2lzZS1zaGlmdC1vcGVyYXRvcnNcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlbGF0aW9uYWwtb3BlcmF0b3JzXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lcXVhbGl0eS1vcGVyYXRvcnNcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWJpbmFyeS1iaXR3aXNlLW9wZXJhdG9yc1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYmluYXJ5LWxvZ2ljYWwtb3BlcmF0b3JzXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmJpbmFyeVByZWNlZGVuY2UgPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICB2YXIgb3AgPSB0b2tlbi52YWx1ZTtcblx0ICAgICAgICB2YXIgcHJlY2VkZW5jZTtcblx0ICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gNyAvKiBQdW5jdHVhdG9yICovKSB7XG5cdCAgICAgICAgICAgIHByZWNlZGVuY2UgPSB0aGlzLm9wZXJhdG9yUHJlY2VkZW5jZVtvcF0gfHwgMDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gNCAvKiBLZXl3b3JkICovKSB7XG5cdCAgICAgICAgICAgIHByZWNlZGVuY2UgPSAob3AgPT09ICdpbnN0YW5jZW9mJyB8fCAodGhpcy5jb250ZXh0LmFsbG93SW4gJiYgb3AgPT09ICdpbicpKSA/IDcgOiAwO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgcHJlY2VkZW5jZSA9IDA7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBwcmVjZWRlbmNlO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VCaW5hcnlFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGFydFRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbik7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIHByZWMgPSB0aGlzLmJpbmFyeVByZWNlZGVuY2UodG9rZW4pO1xuXHQgICAgICAgIGlmIChwcmVjID4gMCkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHZhciBtYXJrZXJzID0gW3N0YXJ0VG9rZW4sIHRoaXMubG9va2FoZWFkXTtcblx0ICAgICAgICAgICAgdmFyIGxlZnQgPSBleHByO1xuXHQgICAgICAgICAgICB2YXIgcmlnaHQgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIHZhciBzdGFjayA9IFtsZWZ0LCB0b2tlbi52YWx1ZSwgcmlnaHRdO1xuXHQgICAgICAgICAgICB2YXIgcHJlY2VkZW5jZXMgPSBbcHJlY107XG5cdCAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICBwcmVjID0gdGhpcy5iaW5hcnlQcmVjZWRlbmNlKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgIGlmIChwcmVjIDw9IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIFJlZHVjZTogbWFrZSBhIGJpbmFyeSBleHByZXNzaW9uIGZyb20gdGhlIHRocmVlIHRvcG1vc3QgZW50cmllcy5cblx0ICAgICAgICAgICAgICAgIHdoaWxlICgoc3RhY2subGVuZ3RoID4gMikgJiYgKHByZWMgPD0gcHJlY2VkZW5jZXNbcHJlY2VkZW5jZXMubGVuZ3RoIC0gMV0pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgb3BlcmF0b3IgPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICBwcmVjZWRlbmNlcy5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgbWFya2Vycy5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKG1hcmtlcnNbbWFya2Vycy5sZW5ndGggLSAxXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkJpbmFyeUV4cHJlc3Npb24ob3BlcmF0b3IsIGxlZnQsIHJpZ2h0KSkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy8gU2hpZnQuXG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMubmV4dFRva2VuKCkudmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgcHJlY2VkZW5jZXMucHVzaChwcmVjKTtcblx0ICAgICAgICAgICAgICAgIG1hcmtlcnMucHVzaCh0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlRXhwb25lbnRpYXRpb25FeHByZXNzaW9uKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gRmluYWwgcmVkdWNlIHRvIGNsZWFuLXVwIHRoZSBzdGFjay5cblx0ICAgICAgICAgICAgdmFyIGkgPSBzdGFjay5sZW5ndGggLSAxO1xuXHQgICAgICAgICAgICBleHByID0gc3RhY2tbaV07XG5cdCAgICAgICAgICAgIHZhciBsYXN0TWFya2VyID0gbWFya2Vycy5wb3AoKTtcblx0ICAgICAgICAgICAgd2hpbGUgKGkgPiAxKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWFya2VyID0gbWFya2Vycy5wb3AoKTtcblx0ICAgICAgICAgICAgICAgIHZhciBsYXN0TGluZVN0YXJ0ID0gbGFzdE1hcmtlciAmJiBsYXN0TWFya2VyLmxpbmVTdGFydDtcblx0ICAgICAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUobWFya2VyLCBsYXN0TGluZVN0YXJ0KTtcblx0ICAgICAgICAgICAgICAgIHZhciBvcGVyYXRvciA9IHN0YWNrW2kgLSAxXTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkJpbmFyeUV4cHJlc3Npb24ob3BlcmF0b3IsIHN0YWNrW2kgLSAyXSwgZXhwcikpO1xuXHQgICAgICAgICAgICAgICAgaSAtPSAyO1xuXHQgICAgICAgICAgICAgICAgbGFzdE1hcmtlciA9IG1hcmtlcjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZXhwcjtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jb25kaXRpb25hbC1vcGVyYXRvclxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnRUb2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHZhciBleHByID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VCaW5hcnlFeHByZXNzaW9uKTtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnPycpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHZhciBwcmV2aW91c0FsbG93SW4gPSB0aGlzLmNvbnRleHQuYWxsb3dJbjtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSB0cnVlO1xuXHQgICAgICAgICAgICB2YXIgY29uc2VxdWVudCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IHByZXZpb3VzQWxsb3dJbjtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJzonKTtcblx0ICAgICAgICAgICAgdmFyIGFsdGVybmF0ZSA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuQ29uZGl0aW9uYWxFeHByZXNzaW9uKGV4cHIsIGNvbnNlcXVlbnQsIGFsdGVybmF0ZSkpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFzc2lnbm1lbnQtb3BlcmF0b3JzXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmNoZWNrUGF0dGVyblBhcmFtID0gZnVuY3Rpb24gKG9wdGlvbnMsIHBhcmFtKSB7XG5cdCAgICAgICAgc3dpdGNoIChwYXJhbS50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXI6XG5cdCAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGFyYW0ob3B0aW9ucywgcGFyYW0sIHBhcmFtLm5hbWUpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LlJlc3RFbGVtZW50OlxuXHQgICAgICAgICAgICAgICAgdGhpcy5jaGVja1BhdHRlcm5QYXJhbShvcHRpb25zLCBwYXJhbS5hcmd1bWVudCk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudFBhdHRlcm46XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUGF0dGVyblBhcmFtKG9wdGlvbnMsIHBhcmFtLmxlZnQpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LkFycmF5UGF0dGVybjpcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW0uZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0uZWxlbWVudHNbaV0gIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1BhdHRlcm5QYXJhbShvcHRpb25zLCBwYXJhbS5lbGVtZW50c1tpXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4Lk9iamVjdFBhdHRlcm46XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUGF0dGVyblBhcmFtKG9wdGlvbnMsIHBhcmFtLnByb3BlcnRpZXNbaV0udmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICAgICAgb3B0aW9ucy5zaW1wbGUgPSBvcHRpb25zLnNpbXBsZSAmJiAocGFyYW0gaW5zdGFuY2VvZiBOb2RlLklkZW50aWZpZXIpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucmVpbnRlcnByZXRBc0NvdmVyRm9ybWFsc0xpc3QgPSBmdW5jdGlvbiAoZXhwcikge1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSBbZXhwcl07XG5cdCAgICAgICAgdmFyIG9wdGlvbnM7XG5cdCAgICAgICAgdmFyIGFzeW5jQXJyb3cgPSBmYWxzZTtcblx0ICAgICAgICBzd2l0Y2ggKGV4cHIudHlwZSkge1xuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyOlxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcjpcblx0ICAgICAgICAgICAgICAgIHBhcmFtcyA9IGV4cHIucGFyYW1zO1xuXHQgICAgICAgICAgICAgICAgYXN5bmNBcnJvdyA9IGV4cHIuYXN5bmM7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBvcHRpb25zID0ge1xuXHQgICAgICAgICAgICBzaW1wbGU6IHRydWUsXG5cdCAgICAgICAgICAgIHBhcmFtU2V0OiB7fVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyArK2kpIHtcblx0ICAgICAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW2ldO1xuXHQgICAgICAgICAgICBpZiAocGFyYW0udHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRQYXR0ZXJuKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAocGFyYW0ucmlnaHQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LllpZWxkRXhwcmVzc2lvbikge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5yaWdodC5hcmd1bWVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgcGFyYW0ucmlnaHQudHlwZSA9IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyO1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtLnJpZ2h0Lm5hbWUgPSAneWllbGQnO1xuXHQgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJhbS5yaWdodC5hcmd1bWVudDtcblx0ICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFyYW0ucmlnaHQuZGVsZWdhdGU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoYXN5bmNBcnJvdyAmJiBwYXJhbS50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllciAmJiBwYXJhbS5uYW1lID09PSAnYXdhaXQnKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLmNoZWNrUGF0dGVyblBhcmFtKG9wdGlvbnMsIHBhcmFtKTtcblx0ICAgICAgICAgICAgcGFyYW1zW2ldID0gcGFyYW07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0IHx8ICF0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7ICsraSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW2ldO1xuXHQgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5ZaWVsZEV4cHJlc3Npb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAob3B0aW9ucy5tZXNzYWdlID09PSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFBhcmFtRHVwZSkge1xuXHQgICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmNvbnRleHQuc3RyaWN0ID8gb3B0aW9ucy5zdHJpY3RlZCA6IG9wdGlvbnMuZmlyc3RSZXN0cmljdGVkO1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuLCBvcHRpb25zLm1lc3NhZ2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICBzaW1wbGU6IG9wdGlvbnMuc2ltcGxlLFxuXHQgICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcblx0ICAgICAgICAgICAgc3RyaWN0ZWQ6IG9wdGlvbnMuc3RyaWN0ZWQsXG5cdCAgICAgICAgICAgIGZpcnN0UmVzdHJpY3RlZDogb3B0aW9ucy5maXJzdFJlc3RyaWN0ZWQsXG5cdCAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMubWVzc2FnZVxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBleHByO1xuXHQgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmFsbG93WWllbGQgJiYgdGhpcy5tYXRjaEtleXdvcmQoJ3lpZWxkJykpIHtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMucGFyc2VZaWVsZEV4cHJlc3Npb24oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBzdGFydFRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHN0YXJ0VG9rZW47XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgKHRva2VuLmxpbmVOdW1iZXIgPT09IHRoaXMubG9va2FoZWFkLmxpbmVOdW1iZXIpICYmIHRva2VuLnZhbHVlID09PSAnYXN5bmMnKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovIHx8IHRoaXMubWF0Y2hLZXl3b3JkKCd5aWVsZCcpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGFyZyA9IHRoaXMucGFyc2VQcmltYXJ5RXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGFyZyk7XG5cdCAgICAgICAgICAgICAgICAgICAgZXhwciA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBbYXJnXSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6IHRydWVcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChleHByLnR5cGUgPT09IEFycm93UGFyYW1ldGVyUGxhY2VIb2xkZXIgfHwgdGhpcy5tYXRjaCgnPT4nKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyb3ctZnVuY3Rpb24tZGVmaW5pdGlvbnNcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB2YXIgaXNBc3luYyA9IGV4cHIuYXN5bmM7XG5cdCAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IHRoaXMucmVpbnRlcnByZXRBc0NvdmVyRm9ybWFsc0xpc3QoZXhwcik7XG5cdCAgICAgICAgICAgICAgICBpZiAobGlzdCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0xpbmVUZXJtaW5hdG9yKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNTdHJpY3QgPSB0aGlzLmNvbnRleHQuc3RyaWN0O1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlID0gdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZSA9IGxpc3Quc2ltcGxlO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNBd2FpdCA9IHRoaXMuY29udGV4dC5hd2FpdDtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmF3YWl0ID0gaXNBc3luYztcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCc9PicpO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBib2R5ID0gdm9pZCAwO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCd7JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dJbiA9IHRoaXMuY29udGV4dC5hbGxvd0luO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLnBhcnNlRnVuY3Rpb25Tb3VyY2VFbGVtZW50cygpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IHByZXZpb3VzQWxsb3dJbjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBib2R5LnR5cGUgIT09IHN5bnRheF8xLlN5bnRheC5CbG9ja1N0YXRlbWVudDtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBsaXN0LmZpcnN0UmVzdHJpY3RlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKGxpc3QuZmlyc3RSZXN0cmljdGVkLCBsaXN0Lm1lc3NhZ2UpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBsaXN0LnN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4obGlzdC5zdHJpY3RlZCwgbGlzdC5tZXNzYWdlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZXhwciA9IGlzQXN5bmMgPyB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkFzeW5jQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24obGlzdC5wYXJhbXMsIGJvZHksIGV4cHJlc3Npb24pKSA6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24obGlzdC5wYXJhbXMsIGJvZHksIGV4cHJlc3Npb24pKTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gcHJldmlvdXNTdHJpY3Q7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBwcmV2aW91c0F3YWl0O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hBc3NpZ24oKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkTEhTSW5Bc3NpZ25tZW50KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgZXhwci50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBleHByO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQoaWQubmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0TEhTQXNzaWdubWVudCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQoaWQubmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UmVzZXJ2ZWRXb3JkKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJz0nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBvcGVyYXRvciA9IHRva2VuLnZhbHVlO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciByaWdodCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5Bc3NpZ25tZW50RXhwcmVzc2lvbihvcGVyYXRvciwgZXhwciwgcmlnaHQpKTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZXhwcjtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jb21tYS1vcGVyYXRvclxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIgZXhwciA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgdmFyIGV4cHJlc3Npb25zID0gW107XG5cdCAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2goZXhwcik7XG5cdCAgICAgICAgICAgIHdoaWxlICh0aGlzLmxvb2thaGVhZC50eXBlICE9PSAyIC8qIEVPRiAqLykge1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuU2VxdWVuY2VFeHByZXNzaW9uKGV4cHJlc3Npb25zKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWJsb2NrXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IHRydWU7XG5cdCAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDQgLyogS2V5d29yZCAqLykge1xuXHQgICAgICAgICAgICBzd2l0Y2ggKHRoaXMubG9va2FoZWFkLnZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdleHBvcnQnOlxuXHQgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzTW9kdWxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQsIG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbEV4cG9ydERlY2xhcmF0aW9uKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUV4cG9ydERlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdpbXBvcnQnOlxuXHQgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzTW9kdWxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQsIG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbEltcG9ydERlY2xhcmF0aW9uKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUltcG9ydERlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdjb25zdCc6XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUxleGljYWxEZWNsYXJhdGlvbih7IGluRm9yOiBmYWxzZSB9KTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcblx0ICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgY2FzZSAnY2xhc3MnOlxuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VDbGFzc0RlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdsZXQnOlxuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMuaXNMZXhpY2FsRGVjbGFyYXRpb24oKSA/IHRoaXMucGFyc2VMZXhpY2FsRGVjbGFyYXRpb24oeyBpbkZvcjogZmFsc2UgfSkgOiB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gc3RhdGVtZW50O1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VCbG9jayA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG5cdCAgICAgICAgdmFyIGJsb2NrID0gW107XG5cdCAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgYmxvY2sucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQmxvY2tTdGF0ZW1lbnQoYmxvY2spKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1sZXQtYW5kLWNvbnN0LWRlY2xhcmF0aW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUxleGljYWxCaW5kaW5nID0gZnVuY3Rpb24gKGtpbmQsIG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSBbXTtcblx0ICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcnNlUGF0dGVybihwYXJhbXMsIGtpbmQpO1xuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGlkLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZChpZC5uYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0VmFyTmFtZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGluaXQgPSBudWxsO1xuXHQgICAgICAgIGlmIChraW5kID09PSAnY29uc3QnKSB7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaEtleXdvcmQoJ2luJykgJiYgIXRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnb2YnKSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJz0nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuRGVjbGFyYXRpb25NaXNzaW5nSW5pdGlhbGl6ZXIsICdjb25zdCcpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKCghb3B0aW9ucy5pbkZvciAmJiBpZC50eXBlICE9PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcikgfHwgdGhpcy5tYXRjaCgnPScpKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCc9Jyk7XG5cdCAgICAgICAgICAgIGluaXQgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdG9yKGlkLCBpbml0KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUJpbmRpbmdMaXN0ID0gZnVuY3Rpb24gKGtpbmQsIG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgbGlzdCA9IFt0aGlzLnBhcnNlTGV4aWNhbEJpbmRpbmcoa2luZCwgb3B0aW9ucyldO1xuXHQgICAgICAgIHdoaWxlICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgbGlzdC5wdXNoKHRoaXMucGFyc2VMZXhpY2FsQmluZGluZyhraW5kLCBvcHRpb25zKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBsaXN0O1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuaXNMZXhpY2FsRGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zY2FubmVyLnNhdmVTdGF0ZSgpO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTtcblx0ICAgICAgICB2YXIgbmV4dCA9IHRoaXMuc2Nhbm5lci5sZXgoKTtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIucmVzdG9yZVN0YXRlKHN0YXRlKTtcblx0ICAgICAgICByZXR1cm4gKG5leHQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovKSB8fFxuXHQgICAgICAgICAgICAobmV4dC50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8gJiYgbmV4dC52YWx1ZSA9PT0gJ1snKSB8fFxuXHQgICAgICAgICAgICAobmV4dC50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8gJiYgbmV4dC52YWx1ZSA9PT0gJ3snKSB8fFxuXHQgICAgICAgICAgICAobmV4dC50eXBlID09PSA0IC8qIEtleXdvcmQgKi8gJiYgbmV4dC52YWx1ZSA9PT0gJ2xldCcpIHx8XG5cdCAgICAgICAgICAgIChuZXh0LnR5cGUgPT09IDQgLyogS2V5d29yZCAqLyAmJiBuZXh0LnZhbHVlID09PSAneWllbGQnKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlTGV4aWNhbERlY2xhcmF0aW9uID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBraW5kID0gdGhpcy5uZXh0VG9rZW4oKS52YWx1ZTtcblx0ICAgICAgICBhc3NlcnRfMS5hc3NlcnQoa2luZCA9PT0gJ2xldCcgfHwga2luZCA9PT0gJ2NvbnN0JywgJ0xleGljYWwgZGVjbGFyYXRpb24gbXVzdCBiZSBlaXRoZXIgbGV0IG9yIGNvbnN0Jyk7XG5cdCAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHRoaXMucGFyc2VCaW5kaW5nTGlzdChraW5kLCBvcHRpb25zKTtcblx0ICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5WYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9ucywga2luZCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWRlc3RydWN0dXJpbmctYmluZGluZy1wYXR0ZXJuc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUJpbmRpbmdSZXN0RWxlbWVudCA9IGZ1bmN0aW9uIChwYXJhbXMsIGtpbmQpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcuLi4nKTtcblx0ICAgICAgICB2YXIgYXJnID0gdGhpcy5wYXJzZVBhdHRlcm4ocGFyYW1zLCBraW5kKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5SZXN0RWxlbWVudChhcmcpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQXJyYXlQYXR0ZXJuID0gZnVuY3Rpb24gKHBhcmFtcywga2luZCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ1snKTtcblx0ICAgICAgICB2YXIgZWxlbWVudHMgPSBbXTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2goJ10nKSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnLCcpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaChudWxsKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcuLi4nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2godGhpcy5wYXJzZUJpbmRpbmdSZXN0RWxlbWVudChwYXJhbXMsIGtpbmQpKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2godGhpcy5wYXJzZVBhdHRlcm5XaXRoRGVmYXVsdChwYXJhbXMsIGtpbmQpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnXScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJywnKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnXScpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkFycmF5UGF0dGVybihlbGVtZW50cykpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VQcm9wZXJ0eVBhdHRlcm4gPSBmdW5jdGlvbiAocGFyYW1zLCBraW5kKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgY29tcHV0ZWQgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgc2hvcnRoYW5kID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBrZXk7XG5cdCAgICAgICAgdmFyIHZhbHVlO1xuXHQgICAgICAgIGlmICh0aGlzLmxvb2thaGVhZC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pIHtcblx0ICAgICAgICAgICAgdmFyIGtleVRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgdmFyIGluaXQgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIoa2V5VG9rZW4udmFsdWUpKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJz0nKSkge1xuXHQgICAgICAgICAgICAgICAgcGFyYW1zLnB1c2goa2V5VG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgc2hvcnRoYW5kID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICB2YXIgZXhwciA9IHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKGtleVRva2VuKSwgbmV3IE5vZGUuQXNzaWdubWVudFBhdHRlcm4oaW5pdCwgZXhwcikpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLm1hdGNoKCc6JykpIHtcblx0ICAgICAgICAgICAgICAgIHBhcmFtcy5wdXNoKGtleVRva2VuKTtcblx0ICAgICAgICAgICAgICAgIHNob3J0aGFuZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IGluaXQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnOicpO1xuXHQgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlUGF0dGVybldpdGhEZWZhdWx0KHBhcmFtcywga2luZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJzonKTtcblx0ICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlUGF0dGVybldpdGhEZWZhdWx0KHBhcmFtcywga2luZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlByb3BlcnR5KCdpbml0Jywga2V5LCBjb21wdXRlZCwgdmFsdWUsIG1ldGhvZCwgc2hvcnRoYW5kKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU9iamVjdFBhdHRlcm4gPSBmdW5jdGlvbiAocGFyYW1zLCBraW5kKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgcHJvcGVydGllcyA9IFtdO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKHRoaXMucGFyc2VQcm9wZXJ0eVBhdHRlcm4ocGFyYW1zLCBraW5kKSk7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuT2JqZWN0UGF0dGVybihwcm9wZXJ0aWVzKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVBhdHRlcm4gPSBmdW5jdGlvbiAocGFyYW1zLCBraW5kKSB7XG5cdCAgICAgICAgdmFyIHBhdHRlcm47XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJ1snKSkge1xuXHQgICAgICAgICAgICBwYXR0ZXJuID0gdGhpcy5wYXJzZUFycmF5UGF0dGVybihwYXJhbXMsIGtpbmQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCd7JykpIHtcblx0ICAgICAgICAgICAgcGF0dGVybiA9IHRoaXMucGFyc2VPYmplY3RQYXR0ZXJuKHBhcmFtcywga2luZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ2xldCcpICYmIChraW5kID09PSAnY29uc3QnIHx8IGtpbmQgPT09ICdsZXQnKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCwgbWVzc2FnZXNfMS5NZXNzYWdlcy5MZXRJbkxleGljYWxCaW5kaW5nKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBwYXJhbXMucHVzaCh0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIHBhdHRlcm4gPSB0aGlzLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyKGtpbmQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcGF0dGVybjtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlUGF0dGVybldpdGhEZWZhdWx0ID0gZnVuY3Rpb24gKHBhcmFtcywga2luZCkge1xuXHQgICAgICAgIHZhciBzdGFydFRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIHBhdHRlcm4gPSB0aGlzLnBhcnNlUGF0dGVybihwYXJhbXMsIGtpbmQpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCc9JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dZaWVsZCA9IHRoaXMuY29udGV4dC5hbGxvd1lpZWxkO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHRydWU7XG5cdCAgICAgICAgICAgIHZhciByaWdodCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICAgICAgcGF0dGVybiA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLkFzc2lnbm1lbnRQYXR0ZXJuKHBhdHRlcm4sIHJpZ2h0KSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBwYXR0ZXJuO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXZhcmlhYmxlLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVZhcmlhYmxlSWRlbnRpZmllciA9IGZ1bmN0aW9uIChraW5kKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA0IC8qIEtleXdvcmQgKi8gJiYgdG9rZW4udmFsdWUgPT09ICd5aWVsZCcpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UmVzZXJ2ZWRXb3JkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5jb250ZXh0LmFsbG93WWllbGQpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgIT09IDMgLyogSWRlbnRpZmllciAqLykge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiB0b2tlbi50eXBlID09PSA0IC8qIEtleXdvcmQgKi8gJiYgdGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UmVzZXJ2ZWRXb3JkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0IHx8IHRva2VuLnZhbHVlICE9PSAnbGV0JyB8fCBraW5kICE9PSAndmFyJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKCh0aGlzLmNvbnRleHQuaXNNb2R1bGUgfHwgdGhpcy5jb250ZXh0LmF3YWl0KSAmJiB0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgdG9rZW4udmFsdWUgPT09ICdhd2FpdCcpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIodG9rZW4udmFsdWUpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgcGFyYW1zID0gW107XG5cdCAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJzZVBhdHRlcm4ocGFyYW1zLCAndmFyJyk7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgaWQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKGlkLm5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RWYXJOYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJz0nKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBpbml0ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKGlkLnR5cGUgIT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyICYmICFvcHRpb25zLmluRm9yKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCc9Jyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRvcihpZCwgaW5pdCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIG9wdCA9IHsgaW5Gb3I6IG9wdGlvbnMuaW5Gb3IgfTtcblx0ICAgICAgICB2YXIgbGlzdCA9IFtdO1xuXHQgICAgICAgIGxpc3QucHVzaCh0aGlzLnBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbihvcHQpKTtcblx0ICAgICAgICB3aGlsZSAodGhpcy5tYXRjaCgnLCcpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGxpc3QucHVzaCh0aGlzLnBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbihvcHQpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGxpc3Q7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVZhcmlhYmxlU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCd2YXInKTtcblx0ICAgICAgICB2YXIgZGVjbGFyYXRpb25zID0gdGhpcy5wYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KHsgaW5Gb3I6IGZhbHNlIH0pO1xuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCAndmFyJykpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVtcHR5LXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUVtcHR5U3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJzsnKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5FbXB0eVN0YXRlbWVudCgpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1leHByZXNzaW9uLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwcmVzc2lvblN0YXRlbWVudChleHByKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaWYtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlSWZDbGF1c2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgdGhpcy5tYXRjaEtleXdvcmQoJ2Z1bmN0aW9uJykpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0RnVuY3Rpb24pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VJZlN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBjb25zZXF1ZW50O1xuXHQgICAgICAgIHZhciBhbHRlcm5hdGUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnaWYnKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKCcpO1xuXHQgICAgICAgIHZhciB0ZXN0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2goJyknKSAmJiB0aGlzLmNvbmZpZy50b2xlcmFudCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgICAgICBjb25zZXF1ZW50ID0gdGhpcy5maW5hbGl6ZSh0aGlzLmNyZWF0ZU5vZGUoKSwgbmV3IE5vZGUuRW1wdHlTdGF0ZW1lbnQoKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgICAgICBjb25zZXF1ZW50ID0gdGhpcy5wYXJzZUlmQ2xhdXNlKCk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnZWxzZScpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgYWx0ZXJuYXRlID0gdGhpcy5wYXJzZUlmQ2xhdXNlKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWZTdGF0ZW1lbnQodGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZG8td2hpbGUtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRG9XaGlsZVN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnZG8nKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNJbkl0ZXJhdGlvbiA9IHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gPSB0cnVlO1xuXHQgICAgICAgIHZhciBib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiA9IHByZXZpb3VzSW5JdGVyYXRpb247XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCd3aGlsZScpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgdmFyIHRlc3QgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpICYmIHRoaXMuY29uZmlnLnRvbGVyYW50KSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnOycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkRvV2hpbGVTdGF0ZW1lbnQoYm9keSwgdGVzdCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXdoaWxlLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVdoaWxlU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGJvZHk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCd3aGlsZScpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgdmFyIHRlc3QgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpICYmIHRoaXMuY29uZmlnLnRvbGVyYW50KSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgIGJvZHkgPSB0aGlzLmZpbmFsaXplKHRoaXMuY3JlYXRlTm9kZSgpLCBuZXcgTm9kZS5FbXB0eVN0YXRlbWVudCgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgIHZhciBwcmV2aW91c0luSXRlcmF0aW9uID0gdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gPSB0cnVlO1xuXHQgICAgICAgICAgICBib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gPSBwcmV2aW91c0luSXRlcmF0aW9uO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5XaGlsZVN0YXRlbWVudCh0ZXN0LCBib2R5KSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZm9yLXN0YXRlbWVudFxuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZm9yLWluLWFuZC1mb3Itb2Ytc3RhdGVtZW50c1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZvclN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgdmFyIHRlc3QgPSBudWxsO1xuXHQgICAgICAgIHZhciB1cGRhdGUgPSBudWxsO1xuXHQgICAgICAgIHZhciBmb3JJbiA9IHRydWU7XG5cdCAgICAgICAgdmFyIGxlZnQsIHJpZ2h0O1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdmb3InKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKCcpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCc7JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgndmFyJykpIHtcblx0ICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNBbGxvd0luID0gdGhpcy5jb250ZXh0LmFsbG93SW47XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHRoaXMucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCh7IGluRm9yOiB0cnVlIH0pO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSBwcmV2aW91c0FsbG93SW47XG5cdCAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMSAmJiB0aGlzLm1hdGNoS2V5d29yZCgnaW4nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBkZWNsID0gZGVjbGFyYXRpb25zWzBdO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChkZWNsLmluaXQgJiYgKGRlY2wuaWQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LkFycmF5UGF0dGVybiB8fCBkZWNsLmlkLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5PYmplY3RQYXR0ZXJuIHx8IHRoaXMuY29udGV4dC5zdHJpY3QpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkZvckluT2ZMb29wSW5pdGlhbGl6ZXIsICdmb3ItaW4nKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUoaW5pdCwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsICd2YXInKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gaW5pdDtcblx0ICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxICYmIGRlY2xhcmF0aW9uc1swXS5pbml0ID09PSBudWxsICYmIHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnb2YnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmZpbmFsaXplKGluaXQsIG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCAndmFyJykpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGluaXQ7XG5cdCAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICBpbml0ID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgICAgICBmb3JJbiA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUoaW5pdCwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsICd2YXInKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJzsnKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnY29uc3QnKSB8fCB0aGlzLm1hdGNoS2V5d29yZCgnbGV0JykpIHtcblx0ICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICAgICAgICAgIHZhciBraW5kID0gdGhpcy5uZXh0VG9rZW4oKS52YWx1ZTtcblx0ICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LnN0cmljdCAmJiB0aGlzLmxvb2thaGVhZC52YWx1ZSA9PT0gJ2luJykge1xuXHQgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmZpbmFsaXplKGluaXQsIG5ldyBOb2RlLklkZW50aWZpZXIoa2luZCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGluaXQ7XG5cdCAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIGluaXQgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dJbiA9IHRoaXMuY29udGV4dC5hbGxvd0luO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHRoaXMucGFyc2VCaW5kaW5nTGlzdChraW5kLCB7IGluRm9yOiB0cnVlIH0pO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gcHJldmlvdXNBbGxvd0luO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxICYmIGRlY2xhcmF0aW9uc1swXS5pbml0ID09PSBudWxsICYmIHRoaXMubWF0Y2hLZXl3b3JkKCdpbicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmZpbmFsaXplKGluaXQsIG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCBraW5kKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBpbml0O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxICYmIGRlY2xhcmF0aW9uc1swXS5pbml0ID09PSBudWxsICYmIHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnb2YnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gdGhpcy5maW5hbGl6ZShpbml0LCBuZXcgTm9kZS5WYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9ucywga2luZCkpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gaW5pdDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGZvckluID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUoaW5pdCwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsIGtpbmQpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgaW5pdFN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c0FsbG93SW4gPSB0aGlzLmNvbnRleHQuYWxsb3dJbjtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBpbml0ID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IHByZXZpb3VzQWxsb3dJbjtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnaW4nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCB8fCBpbml0LnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5Bc3NpZ25tZW50RXhwcmVzc2lvbikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkTEhTSW5Gb3JJbik7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oaW5pdCk7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGluaXQ7XG5cdCAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIGluaXQgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdvZicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0IHx8IGluaXQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRFeHByZXNzaW9uKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRMSFNJbkZvckxvb3ApO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGluaXQpO1xuXHQgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBpbml0O1xuXHQgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICAgICAgZm9ySW4gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluaXRTZXEgPSBbaW5pdF07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VxLnB1c2godGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbikpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKGluaXRTdGFydFRva2VuKSwgbmV3IE5vZGUuU2VxdWVuY2VFeHByZXNzaW9uKGluaXRTZXEpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJzsnKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodHlwZW9mIGxlZnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnOycpKSB7XG5cdCAgICAgICAgICAgICAgICB0ZXN0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnOycpO1xuXHQgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICAgICAgdXBkYXRlID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgYm9keTtcblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2goJyknKSAmJiB0aGlzLmNvbmZpZy50b2xlcmFudCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgICAgICBib2R5ID0gdGhpcy5maW5hbGl6ZSh0aGlzLmNyZWF0ZU5vZGUoKSwgbmV3IE5vZGUuRW1wdHlTdGF0ZW1lbnQoKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgICAgICB2YXIgcHJldmlvdXNJbkl0ZXJhdGlvbiA9IHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbjtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uID0gdHJ1ZTtcblx0ICAgICAgICAgICAgYm9keSA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlU3RhdGVtZW50KTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uID0gcHJldmlvdXNJbkl0ZXJhdGlvbjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuICh0eXBlb2YgbGVmdCA9PT0gJ3VuZGVmaW5lZCcpID9cblx0ICAgICAgICAgICAgdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5Gb3JTdGF0ZW1lbnQoaW5pdCwgdGVzdCwgdXBkYXRlLCBib2R5KSkgOlxuXHQgICAgICAgICAgICBmb3JJbiA/IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRm9ySW5TdGF0ZW1lbnQobGVmdCwgcmlnaHQsIGJvZHkpKSA6XG5cdCAgICAgICAgICAgICAgICB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkZvck9mU3RhdGVtZW50KGxlZnQsIHJpZ2h0LCBib2R5KSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtY29udGludWUtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQ29udGludWVTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2NvbnRpbnVlJyk7XG5cdCAgICAgICAgdmFyIGxhYmVsID0gbnVsbDtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovICYmICF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yKSB7XG5cdCAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgbGFiZWwgPSBpZDtcblx0ICAgICAgICAgICAgdmFyIGtleSA9ICckJyArIGlkLm5hbWU7XG5cdCAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29udGV4dC5sYWJlbFNldCwga2V5KSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5rbm93bkxhYmVsLCBpZC5uYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICBpZiAobGFiZWwgPT09IG51bGwgJiYgIXRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbikge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsQ29udGludWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5Db250aW51ZVN0YXRlbWVudChsYWJlbCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWJyZWFrLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUJyZWFrU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdicmVhaycpO1xuXHQgICAgICAgIHZhciBsYWJlbCA9IG51bGw7XG5cdCAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLyAmJiAhdGhpcy5oYXNMaW5lVGVybWluYXRvcikge1xuXHQgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIHZhciBrZXkgPSAnJCcgKyBpZC5uYW1lO1xuXHQgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmNvbnRleHQubGFiZWxTZXQsIGtleSkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlVua25vd25MYWJlbCwgaWQubmFtZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgbGFiZWwgPSBpZDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgaWYgKGxhYmVsID09PSBudWxsICYmICF0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gJiYgIXRoaXMuY29udGV4dC5pblN3aXRjaCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsQnJlYWspO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5CcmVha1N0YXRlbWVudChsYWJlbCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJldHVybi1zdGF0ZW1lbnRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VSZXR1cm5TdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbFJldHVybik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdyZXR1cm4nKTtcblx0ICAgICAgICB2YXIgaGFzQXJndW1lbnQgPSAoIXRoaXMubWF0Y2goJzsnKSAmJiAhdGhpcy5tYXRjaCgnfScpICYmXG5cdCAgICAgICAgICAgICF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yICYmIHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovKSB8fFxuXHQgICAgICAgICAgICB0aGlzLmxvb2thaGVhZC50eXBlID09PSA4IC8qIFN0cmluZ0xpdGVyYWwgKi8gfHxcblx0ICAgICAgICAgICAgdGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMTAgLyogVGVtcGxhdGUgKi87XG5cdCAgICAgICAgdmFyIGFyZ3VtZW50ID0gaGFzQXJndW1lbnQgPyB0aGlzLnBhcnNlRXhwcmVzc2lvbigpIDogbnVsbDtcblx0ICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5SZXR1cm5TdGF0ZW1lbnQoYXJndW1lbnQpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy13aXRoLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVdpdGhTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0TW9kZVdpdGgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBib2R5O1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnd2l0aCcpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgdmFyIG9iamVjdCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykgJiYgdGhpcy5jb25maWcudG9sZXJhbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICAgICAgYm9keSA9IHRoaXMuZmluYWxpemUodGhpcy5jcmVhdGVOb2RlKCksIG5ldyBOb2RlLkVtcHR5U3RhdGVtZW50KCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJyknKTtcblx0ICAgICAgICAgICAgYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuV2l0aFN0YXRlbWVudChvYmplY3QsIGJvZHkpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zd2l0Y2gtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlU3dpdGNoQ2FzZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciB0ZXN0O1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnZGVmYXVsdCcpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHRlc3QgPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdjYXNlJyk7XG5cdCAgICAgICAgICAgIHRlc3QgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnOicpO1xuXHQgICAgICAgIHZhciBjb25zZXF1ZW50ID0gW107XG5cdCAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJ30nKSB8fCB0aGlzLm1hdGNoS2V5d29yZCgnZGVmYXVsdCcpIHx8IHRoaXMubWF0Y2hLZXl3b3JkKCdjYXNlJykpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNvbnNlcXVlbnQucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlN3aXRjaENhc2UodGVzdCwgY29uc2VxdWVudCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTd2l0Y2hTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3N3aXRjaCcpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgdmFyIGRpc2NyaW1pbmFudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJyknKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNJblN3aXRjaCA9IHRoaXMuY29udGV4dC5pblN3aXRjaDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaW5Td2l0Y2ggPSB0cnVlO1xuXHQgICAgICAgIHZhciBjYXNlcyA9IFtdO1xuXHQgICAgICAgIHZhciBkZWZhdWx0Rm91bmQgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgneycpO1xuXHQgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBjbGF1c2UgPSB0aGlzLnBhcnNlU3dpdGNoQ2FzZSgpO1xuXHQgICAgICAgICAgICBpZiAoY2xhdXNlLnRlc3QgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0Rm91bmQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5NdWx0aXBsZURlZmF1bHRzSW5Td2l0Y2gpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZGVmYXVsdEZvdW5kID0gdHJ1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjYXNlcy5wdXNoKGNsYXVzZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluU3dpdGNoID0gcHJldmlvdXNJblN3aXRjaDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5Td2l0Y2hTdGF0ZW1lbnQoZGlzY3JpbWluYW50LCBjYXNlcykpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxhYmVsbGVkLXN0YXRlbWVudHNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VMYWJlbGxlZFN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBleHByID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICB2YXIgc3RhdGVtZW50O1xuXHQgICAgICAgIGlmICgoZXhwci50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcikgJiYgdGhpcy5tYXRjaCgnOicpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHZhciBpZCA9IGV4cHI7XG5cdCAgICAgICAgICAgIHZhciBrZXkgPSAnJCcgKyBpZC5uYW1lO1xuXHQgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29udGV4dC5sYWJlbFNldCwga2V5KSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuUmVkZWNsYXJhdGlvbiwgJ0xhYmVsJywgaWQubmFtZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmxhYmVsU2V0W2tleV0gPSB0cnVlO1xuXHQgICAgICAgICAgICB2YXIgYm9keSA9IHZvaWQgMDtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdjbGFzcycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLnBhcnNlQ2xhc3NEZWNsYXJhdGlvbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdmdW5jdGlvbicpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgICAgIHZhciBkZWNsYXJhdGlvbiA9IHRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0RnVuY3Rpb24pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVjbGFyYXRpb24uZ2VuZXJhdG9yKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5HZW5lcmF0b3JJbkxlZ2FjeUNvbnRleHQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYm9keSA9IGRlY2xhcmF0aW9uO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBkZWxldGUgdGhpcy5jb250ZXh0LmxhYmVsU2V0W2tleV07XG5cdCAgICAgICAgICAgIHN0YXRlbWVudCA9IG5ldyBOb2RlLkxhYmVsZWRTdGF0ZW1lbnQoaWQsIGJvZHkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgICAgIHN0YXRlbWVudCA9IG5ldyBOb2RlLkV4cHJlc3Npb25TdGF0ZW1lbnQoZXhwcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIHN0YXRlbWVudCk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdGhyb3ctc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVGhyb3dTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3Rocm93Jyk7XG5cdCAgICAgICAgaWYgKHRoaXMuaGFzTGluZVRlcm1pbmF0b3IpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuTmV3bGluZUFmdGVyVGhyb3cpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgYXJndW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlRocm93U3RhdGVtZW50KGFyZ3VtZW50KSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHJ5LXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNhdGNoQ2xhdXNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdjYXRjaCcpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IFtdO1xuXHQgICAgICAgIHZhciBwYXJhbSA9IHRoaXMucGFyc2VQYXR0ZXJuKHBhcmFtcyk7XG5cdCAgICAgICAgdmFyIHBhcmFtTWFwID0ge307XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgdmFyIGtleSA9ICckJyArIHBhcmFtc1tpXS52YWx1ZTtcblx0ICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXJhbU1hcCwga2V5KSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuRHVwbGljYXRlQmluZGluZywgcGFyYW1zW2ldLnZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBwYXJhbU1hcFtrZXldID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgcGFyYW0udHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKHBhcmFtLm5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RDYXRjaFZhcmlhYmxlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgIHZhciBib2R5ID0gdGhpcy5wYXJzZUJsb2NrKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQ2F0Y2hDbGF1c2UocGFyYW0sIGJvZHkpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRmluYWxseUNsYXVzZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2ZpbmFsbHknKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJsb2NrKCk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVRyeVN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgndHJ5Jyk7XG5cdCAgICAgICAgdmFyIGJsb2NrID0gdGhpcy5wYXJzZUJsb2NrKCk7XG5cdCAgICAgICAgdmFyIGhhbmRsZXIgPSB0aGlzLm1hdGNoS2V5d29yZCgnY2F0Y2gnKSA/IHRoaXMucGFyc2VDYXRjaENsYXVzZSgpIDogbnVsbDtcblx0ICAgICAgICB2YXIgZmluYWxpemVyID0gdGhpcy5tYXRjaEtleXdvcmQoJ2ZpbmFsbHknKSA/IHRoaXMucGFyc2VGaW5hbGx5Q2xhdXNlKCkgOiBudWxsO1xuXHQgICAgICAgIGlmICghaGFuZGxlciAmJiAhZmluYWxpemVyKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLk5vQ2F0Y2hPckZpbmFsbHkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5UcnlTdGF0ZW1lbnQoYmxvY2ssIGhhbmRsZXIsIGZpbmFsaXplcikpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWRlYnVnZ2VyLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZURlYnVnZ2VyU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdkZWJ1Z2dlcicpO1xuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkRlYnVnZ2VyU3RhdGVtZW50KCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2Utc3RhdGVtZW50cy1hbmQtZGVjbGFyYXRpb25zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGF0ZW1lbnQ7XG5cdCAgICAgICAgc3dpdGNoICh0aGlzLmxvb2thaGVhZC50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2UgMSAvKiBCb29sZWFuTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA1IC8qIE51bGxMaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDYgLyogTnVtZXJpY0xpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgOCAvKiBTdHJpbmdMaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDEwIC8qIFRlbXBsYXRlICovOlxuXHQgICAgICAgICAgICBjYXNlIDkgLyogUmVndWxhckV4cHJlc3Npb24gKi86XG5cdCAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgNyAvKiBQdW5jdHVhdG9yICovOlxuXHQgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5sb29rYWhlYWQudmFsdWU7XG5cdCAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICd7Jykge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VCbG9jaygpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09ICcoJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gJzsnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUVtcHR5U3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgMyAvKiBJZGVudGlmaWVyICovOlxuXHQgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5tYXRjaEFzeW5jRnVuY3Rpb24oKSA/IHRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKCkgOiB0aGlzLnBhcnNlTGFiZWxsZWRTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDQgLyogS2V5d29yZCAqLzpcblx0ICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5sb29rYWhlYWQudmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdicmVhayc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VCcmVha1N0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdjb250aW51ZSc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VDb250aW51ZVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdkZWJ1Z2dlcic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VEZWJ1Z2dlclN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdkbyc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VEb1doaWxlU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Zvcic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VGb3JTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdpZic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VJZlN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdyZXR1cm4nOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlUmV0dXJuU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N3aXRjaCc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VTd2l0Y2hTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAndGhyb3cnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlVGhyb3dTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAndHJ5Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZVRyeVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICd2YXInOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlVmFyaWFibGVTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnd2hpbGUnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlV2hpbGVTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnd2l0aCc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VXaXRoU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHN0YXRlbWVudDtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1mdW5jdGlvbi1kZWZpbml0aW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZ1bmN0aW9uU291cmNlRWxlbWVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgneycpO1xuXHQgICAgICAgIHZhciBib2R5ID0gdGhpcy5wYXJzZURpcmVjdGl2ZVByb2xvZ3VlcygpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0xhYmVsU2V0ID0gdGhpcy5jb250ZXh0LmxhYmVsU2V0O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0luSXRlcmF0aW9uID0gdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0luU3dpdGNoID0gdGhpcy5jb250ZXh0LmluU3dpdGNoO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0luRnVuY3Rpb25Cb2R5ID0gdGhpcy5jb250ZXh0LmluRnVuY3Rpb25Cb2R5O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5sYWJlbFNldCA9IHt9O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pblN3aXRjaCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keSA9IHRydWU7XG5cdCAgICAgICAgd2hpbGUgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGJvZHkucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmxhYmVsU2V0ID0gcHJldmlvdXNMYWJlbFNldDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gPSBwcmV2aW91c0luSXRlcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pblN3aXRjaCA9IHByZXZpb3VzSW5Td2l0Y2g7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluRnVuY3Rpb25Cb2R5ID0gcHJldmlvdXNJbkZ1bmN0aW9uQm9keTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5CbG9ja1N0YXRlbWVudChib2R5KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS52YWxpZGF0ZVBhcmFtID0gZnVuY3Rpb24gKG9wdGlvbnMsIHBhcmFtLCBuYW1lKSB7XG5cdCAgICAgICAgdmFyIGtleSA9ICckJyArIG5hbWU7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKG5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLnN0cmljdGVkID0gcGFyYW07XG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLm1lc3NhZ2UgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFBhcmFtTmFtZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMucGFyYW1TZXQsIGtleSkpIHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RyaWN0ZWQgPSBwYXJhbTtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMubWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UGFyYW1EdXBlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKCFvcHRpb25zLmZpcnN0UmVzdHJpY3RlZCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQobmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlyc3RSZXN0cmljdGVkID0gcGFyYW07XG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLm1lc3NhZ2UgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFBhcmFtTmFtZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNjYW5uZXIuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkKG5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmZpcnN0UmVzdHJpY3RlZCA9IHBhcmFtO1xuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5tZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMucGFyYW1TZXQsIGtleSkpIHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RyaWN0ZWQgPSBwYXJhbTtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMubWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UGFyYW1EdXBlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdCAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdGlvbnMucGFyYW1TZXQsIGtleSwgeyB2YWx1ZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIG9wdGlvbnMucGFyYW1TZXRba2V5XSA9IHRydWU7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VSZXN0RWxlbWVudCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcuLi4nKTtcblx0ICAgICAgICB2YXIgYXJnID0gdGhpcy5wYXJzZVBhdHRlcm4ocGFyYW1zKTtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnPScpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkRlZmF1bHRSZXN0UGFyYW1ldGVyKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuUGFyYW1ldGVyQWZ0ZXJSZXN0UGFyYW1ldGVyKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuUmVzdEVsZW1lbnQoYXJnKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZvcm1hbFBhcmFtZXRlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IFtdO1xuXHQgICAgICAgIHZhciBwYXJhbSA9IHRoaXMubWF0Y2goJy4uLicpID8gdGhpcy5wYXJzZVJlc3RFbGVtZW50KHBhcmFtcykgOiB0aGlzLnBhcnNlUGF0dGVybldpdGhEZWZhdWx0KHBhcmFtcyk7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtKG9wdGlvbnMsIHBhcmFtc1tpXSwgcGFyYW1zW2ldLnZhbHVlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgb3B0aW9ucy5zaW1wbGUgPSBvcHRpb25zLnNpbXBsZSAmJiAocGFyYW0gaW5zdGFuY2VvZiBOb2RlLklkZW50aWZpZXIpO1xuXHQgICAgICAgIG9wdGlvbnMucGFyYW1zLnB1c2gocGFyYW0pO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VGb3JtYWxQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKGZpcnN0UmVzdHJpY3RlZCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zO1xuXHQgICAgICAgIG9wdGlvbnMgPSB7XG5cdCAgICAgICAgICAgIHNpbXBsZTogdHJ1ZSxcblx0ICAgICAgICAgICAgcGFyYW1zOiBbXSxcblx0ICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkOiBmaXJzdFJlc3RyaWN0ZWRcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgb3B0aW9ucy5wYXJhbVNldCA9IHt9O1xuXHQgICAgICAgICAgICB3aGlsZSAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMiAvKiBFT0YgKi8pIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXIob3B0aW9ucyk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgc2ltcGxlOiBvcHRpb25zLnNpbXBsZSxcblx0ICAgICAgICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcblx0ICAgICAgICAgICAgc3RyaWN0ZWQ6IG9wdGlvbnMuc3RyaWN0ZWQsXG5cdCAgICAgICAgICAgIGZpcnN0UmVzdHJpY3RlZDogb3B0aW9ucy5maXJzdFJlc3RyaWN0ZWQsXG5cdCAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMubWVzc2FnZVxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5tYXRjaEFzeW5jRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG1hdGNoID0gdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhc3luYycpO1xuXHQgICAgICAgIGlmIChtYXRjaCkge1xuXHQgICAgICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnNjYW5uZXIuc2F2ZVN0YXRlKCk7XG5cdCAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTtcblx0ICAgICAgICAgICAgdmFyIG5leHQgPSB0aGlzLnNjYW5uZXIubGV4KCk7XG5cdCAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5yZXN0b3JlU3RhdGUoc3RhdGUpO1xuXHQgICAgICAgICAgICBtYXRjaCA9IChzdGF0ZS5saW5lTnVtYmVyID09PSBuZXh0LmxpbmVOdW1iZXIpICYmIChuZXh0LnR5cGUgPT09IDQgLyogS2V5d29yZCAqLykgJiYgKG5leHQudmFsdWUgPT09ICdmdW5jdGlvbicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gbWF0Y2g7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoaWRlbnRpZmllcklzT3B0aW9uYWwpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpc0FzeW5jID0gdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhc3luYycpO1xuXHQgICAgICAgIGlmIChpc0FzeW5jKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnZnVuY3Rpb24nKTtcblx0ICAgICAgICB2YXIgaXNHZW5lcmF0b3IgPSBpc0FzeW5jID8gZmFsc2UgOiB0aGlzLm1hdGNoKCcqJyk7XG5cdCAgICAgICAgaWYgKGlzR2VuZXJhdG9yKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBtZXNzYWdlO1xuXHQgICAgICAgIHZhciBpZCA9IG51bGw7XG5cdCAgICAgICAgdmFyIGZpcnN0UmVzdHJpY3RlZCA9IG51bGw7XG5cdCAgICAgICAgaWYgKCFpZGVudGlmaWVySXNPcHRpb25hbCB8fCAhdGhpcy5tYXRjaCgnKCcpKSB7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICBpZCA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLCBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdEZ1bmN0aW9uTmFtZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQodG9rZW4udmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkID0gdG9rZW47XG5cdCAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0RnVuY3Rpb25OYW1lO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSB0b2tlbjtcblx0ICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dBd2FpdCA9IHRoaXMuY29udGV4dC5hd2FpdDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1lpZWxkID0gdGhpcy5jb250ZXh0LmFsbG93WWllbGQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmF3YWl0ID0gaXNBc3luYztcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9ICFpc0dlbmVyYXRvcjtcblx0ICAgICAgICB2YXIgZm9ybWFsUGFyYW1ldGVycyA9IHRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKGZpcnN0UmVzdHJpY3RlZCk7XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zO1xuXHQgICAgICAgIHZhciBzdHJpY3RlZCA9IGZvcm1hbFBhcmFtZXRlcnMuc3RyaWN0ZWQ7XG5cdCAgICAgICAgZmlyc3RSZXN0cmljdGVkID0gZm9ybWFsUGFyYW1ldGVycy5maXJzdFJlc3RyaWN0ZWQ7XG5cdCAgICAgICAgaWYgKGZvcm1hbFBhcmFtZXRlcnMubWVzc2FnZSkge1xuXHQgICAgICAgICAgICBtZXNzYWdlID0gZm9ybWFsUGFyYW1ldGVycy5tZXNzYWdlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcHJldmlvdXNTdHJpY3QgPSB0aGlzLmNvbnRleHQuc3RyaWN0O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlID0gdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZSA9IGZvcm1hbFBhcmFtZXRlcnMuc2ltcGxlO1xuXHQgICAgICAgIHZhciBib2R5ID0gdGhpcy5wYXJzZUZ1bmN0aW9uU291cmNlRWxlbWVudHMoKTtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBmaXJzdFJlc3RyaWN0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihmaXJzdFJlc3RyaWN0ZWQsIG1lc3NhZ2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBzdHJpY3RlZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHN0cmljdGVkLCBtZXNzYWdlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHByZXZpb3VzU3RyaWN0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZSA9IHByZXZpb3VzQWxsb3dTdHJpY3REaXJlY3RpdmU7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmF3YWl0ID0gcHJldmlvdXNBbGxvd0F3YWl0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgIHJldHVybiBpc0FzeW5jID8gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5Bc3luY0Z1bmN0aW9uRGVjbGFyYXRpb24oaWQsIHBhcmFtcywgYm9keSkpIDpcblx0ICAgICAgICAgICAgdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5GdW5jdGlvbkRlY2xhcmF0aW9uKGlkLCBwYXJhbXMsIGJvZHksIGlzR2VuZXJhdG9yKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpc0FzeW5jID0gdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhc3luYycpO1xuXHQgICAgICAgIGlmIChpc0FzeW5jKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnZnVuY3Rpb24nKTtcblx0ICAgICAgICB2YXIgaXNHZW5lcmF0b3IgPSBpc0FzeW5jID8gZmFsc2UgOiB0aGlzLm1hdGNoKCcqJyk7XG5cdCAgICAgICAgaWYgKGlzR2VuZXJhdG9yKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBtZXNzYWdlO1xuXHQgICAgICAgIHZhciBpZCA9IG51bGw7XG5cdCAgICAgICAgdmFyIGZpcnN0UmVzdHJpY3RlZDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd0F3YWl0ID0gdGhpcy5jb250ZXh0LmF3YWl0O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBpc0FzeW5jO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gIWlzR2VuZXJhdG9yO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKCcpKSB7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICBpZCA9ICghdGhpcy5jb250ZXh0LnN0cmljdCAmJiAhaXNHZW5lcmF0b3IgJiYgdGhpcy5tYXRjaEtleXdvcmQoJ3lpZWxkJykpID8gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCkgOiB0aGlzLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0KSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQodG9rZW4udmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RGdW5jdGlvbk5hbWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGZpcnN0UmVzdHJpY3RlZCA9IHRva2VuO1xuXHQgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdEZ1bmN0aW9uTmFtZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc2Nhbm5lci5pc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQodG9rZW4udmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkID0gdG9rZW47XG5cdCAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UmVzZXJ2ZWRXb3JkO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBmb3JtYWxQYXJhbWV0ZXJzID0gdGhpcy5wYXJzZUZvcm1hbFBhcmFtZXRlcnMoZmlyc3RSZXN0cmljdGVkKTtcblx0ICAgICAgICB2YXIgcGFyYW1zID0gZm9ybWFsUGFyYW1ldGVycy5wYXJhbXM7XG5cdCAgICAgICAgdmFyIHN0cmljdGVkID0gZm9ybWFsUGFyYW1ldGVycy5zdHJpY3RlZDtcblx0ICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSBmb3JtYWxQYXJhbWV0ZXJzLmZpcnN0UmVzdHJpY3RlZDtcblx0ICAgICAgICBpZiAoZm9ybWFsUGFyYW1ldGVycy5tZXNzYWdlKSB7XG5cdCAgICAgICAgICAgIG1lc3NhZ2UgPSBmb3JtYWxQYXJhbWV0ZXJzLm1lc3NhZ2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBwcmV2aW91c1N0cmljdCA9IHRoaXMuY29udGV4dC5zdHJpY3Q7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dTdHJpY3REaXJlY3RpdmUgPSB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmU7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gZm9ybWFsUGFyYW1ldGVycy5zaW1wbGU7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlRnVuY3Rpb25Tb3VyY2VFbGVtZW50cygpO1xuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGZpcnN0UmVzdHJpY3RlZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKGZpcnN0UmVzdHJpY3RlZCwgbWVzc2FnZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4oc3RyaWN0ZWQsIG1lc3NhZ2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gcHJldmlvdXNTdHJpY3Q7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBwcmV2aW91c0FsbG93QXdhaXQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBwcmV2aW91c0FsbG93WWllbGQ7XG5cdCAgICAgICAgcmV0dXJuIGlzQXN5bmMgPyB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkFzeW5jRnVuY3Rpb25FeHByZXNzaW9uKGlkLCBwYXJhbXMsIGJvZHkpKSA6XG5cdCAgICAgICAgICAgIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRnVuY3Rpb25FeHByZXNzaW9uKGlkLCBwYXJhbXMsIGJvZHksIGlzR2VuZXJhdG9yKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGlyZWN0aXZlLXByb2xvZ3Vlcy1hbmQtdGhlLXVzZS1zdHJpY3QtZGlyZWN0aXZlXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRGlyZWN0aXZlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGV4cHIgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIHZhciBkaXJlY3RpdmUgPSAoZXhwci50eXBlID09PSBzeW50YXhfMS5TeW50YXguTGl0ZXJhbCkgPyB0aGlzLmdldFRva2VuUmF3KHRva2VuKS5zbGljZSgxLCAtMSkgOiBudWxsO1xuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIGRpcmVjdGl2ZSA/IG5ldyBOb2RlLkRpcmVjdGl2ZShleHByLCBkaXJlY3RpdmUpIDogbmV3IE5vZGUuRXhwcmVzc2lvblN0YXRlbWVudChleHByKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZURpcmVjdGl2ZVByb2xvZ3VlcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgZmlyc3RSZXN0cmljdGVkID0gbnVsbDtcblx0ICAgICAgICB2YXIgYm9keSA9IFtdO1xuXHQgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gOCAvKiBTdHJpbmdMaXRlcmFsICovKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB2YXIgc3RhdGVtZW50ID0gdGhpcy5wYXJzZURpcmVjdGl2ZSgpO1xuXHQgICAgICAgICAgICBib2R5LnB1c2goc3RhdGVtZW50KTtcblx0ICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IHN0YXRlbWVudC5kaXJlY3RpdmU7XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgZGlyZWN0aXZlICE9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGRpcmVjdGl2ZSA9PT0gJ3VzZSBzdHJpY3QnKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIGlmIChmaXJzdFJlc3RyaWN0ZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKGZpcnN0UmVzdHJpY3RlZCwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RPY3RhbExpdGVyYWwpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmUpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLCBtZXNzYWdlc18xLk1lc3NhZ2VzLklsbGVnYWxMYW5ndWFnZU1vZGVEaXJlY3RpdmUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKCFmaXJzdFJlc3RyaWN0ZWQgJiYgdG9rZW4ub2N0YWwpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSB0b2tlbjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gYm9keTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tZXRob2QtZGVmaW5pdGlvbnNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucXVhbGlmaWVkUHJvcGVydHlOYW1lID0gZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2UgMyAvKiBJZGVudGlmaWVyICovOlxuXHQgICAgICAgICAgICBjYXNlIDggLyogU3RyaW5nTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSAxIC8qIEJvb2xlYW5MaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDUgLyogTnVsbExpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgNiAvKiBOdW1lcmljTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA0IC8qIEtleXdvcmQgKi86XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgICAgY2FzZSA3IC8qIFB1bmN0dWF0b3IgKi86XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4udmFsdWUgPT09ICdbJztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUdldHRlck1ldGhvZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpc0dlbmVyYXRvciA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9ICFpc0dlbmVyYXRvcjtcblx0ICAgICAgICB2YXIgZm9ybWFsUGFyYW1ldGVycyA9IHRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKCk7XG5cdCAgICAgICAgaWYgKGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuQmFkR2V0dGVyQXJpdHkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbWV0aG9kID0gdGhpcy5wYXJzZVByb3BlcnR5TWV0aG9kKGZvcm1hbFBhcmFtZXRlcnMpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkZ1bmN0aW9uRXhwcmVzc2lvbihudWxsLCBmb3JtYWxQYXJhbWV0ZXJzLnBhcmFtcywgbWV0aG9kLCBpc0dlbmVyYXRvcikpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTZXR0ZXJNZXRob2QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgaXNHZW5lcmF0b3IgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1lpZWxkID0gdGhpcy5jb250ZXh0LmFsbG93WWllbGQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSAhaXNHZW5lcmF0b3I7XG5cdCAgICAgICAgdmFyIGZvcm1hbFBhcmFtZXRlcnMgPSB0aGlzLnBhcnNlRm9ybWFsUGFyYW1ldGVycygpO1xuXHQgICAgICAgIGlmIChmb3JtYWxQYXJhbWV0ZXJzLnBhcmFtcy5sZW5ndGggIT09IDEpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuQmFkU2V0dGVyQXJpdHkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmIChmb3JtYWxQYXJhbWV0ZXJzLnBhcmFtc1swXSBpbnN0YW5jZW9mIE5vZGUuUmVzdEVsZW1lbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuQmFkU2V0dGVyUmVzdFBhcmFtZXRlcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBtZXRob2QgPSB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2QoZm9ybWFsUGFyYW1ldGVycyk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBwcmV2aW91c0FsbG93WWllbGQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRnVuY3Rpb25FeHByZXNzaW9uKG51bGwsIGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zLCBtZXRob2QsIGlzR2VuZXJhdG9yKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUdlbmVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpc0dlbmVyYXRvciA9IHRydWU7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dZaWVsZCA9IHRoaXMuY29udGV4dC5hbGxvd1lpZWxkO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgcGFyYW1zID0gdGhpcy5wYXJzZUZvcm1hbFBhcmFtZXRlcnMoKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBtZXRob2QgPSB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2QocGFyYW1zKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5GdW5jdGlvbkV4cHJlc3Npb24obnVsbCwgcGFyYW1zLnBhcmFtcywgbWV0aG9kLCBpc0dlbmVyYXRvcikpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdlbmVyYXRvci1mdW5jdGlvbi1kZWZpbml0aW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5pc1N0YXJ0T2ZFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGFydCA9IHRydWU7XG5cdCAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5sb29rYWhlYWQudmFsdWU7XG5cdCAgICAgICAgc3dpdGNoICh0aGlzLmxvb2thaGVhZC50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2UgNyAvKiBQdW5jdHVhdG9yICovOlxuXHQgICAgICAgICAgICAgICAgc3RhcnQgPSAodmFsdWUgPT09ICdbJykgfHwgKHZhbHVlID09PSAnKCcpIHx8ICh2YWx1ZSA9PT0gJ3snKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PT0gJysnKSB8fCAodmFsdWUgPT09ICctJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT09ICchJykgfHwgKHZhbHVlID09PSAnficpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKHZhbHVlID09PSAnKysnKSB8fCAodmFsdWUgPT09ICctLScpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKHZhbHVlID09PSAnLycpIHx8ICh2YWx1ZSA9PT0gJy89Jyk7IC8vIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsXG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSA0IC8qIEtleXdvcmQgKi86XG5cdCAgICAgICAgICAgICAgICBzdGFydCA9ICh2YWx1ZSA9PT0gJ2NsYXNzJykgfHwgKHZhbHVlID09PSAnZGVsZXRlJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT09ICdmdW5jdGlvbicpIHx8ICh2YWx1ZSA9PT0gJ2xldCcpIHx8ICh2YWx1ZSA9PT0gJ25ldycpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKHZhbHVlID09PSAnc3VwZXInKSB8fCAodmFsdWUgPT09ICd0aGlzJykgfHwgKHZhbHVlID09PSAndHlwZW9mJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT09ICd2b2lkJykgfHwgKHZhbHVlID09PSAneWllbGQnKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBzdGFydDtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlWWllbGRFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCd5aWVsZCcpO1xuXHQgICAgICAgIHZhciBhcmd1bWVudCA9IG51bGw7XG5cdCAgICAgICAgdmFyIGRlbGVnYXRlID0gZmFsc2U7XG5cdCAgICAgICAgaWYgKCF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yKSB7XG5cdCAgICAgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgZGVsZWdhdGUgPSB0aGlzLm1hdGNoKCcqJyk7XG5cdCAgICAgICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIGFyZ3VtZW50ID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1N0YXJ0T2ZFeHByZXNzaW9uKCkpIHtcblx0ICAgICAgICAgICAgICAgIGFyZ3VtZW50ID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBwcmV2aW91c0FsbG93WWllbGQ7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLllpZWxkRXhwcmVzc2lvbihhcmd1bWVudCwgZGVsZWdhdGUpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jbGFzcy1kZWZpbml0aW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNsYXNzRWxlbWVudCA9IGZ1bmN0aW9uIChoYXNDb25zdHJ1Y3Rvcikge1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGtpbmQgPSAnJztcblx0ICAgICAgICB2YXIga2V5ID0gbnVsbDtcblx0ICAgICAgICB2YXIgdmFsdWUgPSBudWxsO1xuXHQgICAgICAgIHZhciBjb21wdXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBtZXRob2QgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgaXNTdGF0aWMgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgaXNBc3luYyA9IGZhbHNlO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCcqJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgdmFyIGlkID0ga2V5O1xuXHQgICAgICAgICAgICBpZiAoaWQubmFtZSA9PT0gJ3N0YXRpYycgJiYgKHRoaXMucXVhbGlmaWVkUHJvcGVydHlOYW1lKHRoaXMubG9va2FoZWFkKSB8fCB0aGlzLm1hdGNoKCcqJykpKSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICAgICAgaXNTdGF0aWMgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICgodG9rZW4udHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovKSAmJiAhdGhpcy5oYXNMaW5lVGVybWluYXRvciAmJiAodG9rZW4udmFsdWUgPT09ICdhc3luYycpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcHVuY3R1YXRvciA9IHRoaXMubG9va2FoZWFkLnZhbHVlO1xuXHQgICAgICAgICAgICAgICAgaWYgKHB1bmN0dWF0b3IgIT09ICc6JyAmJiBwdW5jdHVhdG9yICE9PSAnKCcgJiYgcHVuY3R1YXRvciAhPT0gJyonKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaXNBc3luYyA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovICYmIHRva2VuLnZhbHVlID09PSAnY29uc3RydWN0b3InKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuQ29uc3RydWN0b3JJc0FzeW5jKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGxvb2thaGVhZFByb3BlcnR5S2V5ID0gdGhpcy5xdWFsaWZpZWRQcm9wZXJ0eU5hbWUodGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pIHtcblx0ICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlID09PSAnZ2V0JyAmJiBsb29rYWhlYWRQcm9wZXJ0eUtleSkge1xuXHQgICAgICAgICAgICAgICAga2luZCA9ICdnZXQnO1xuXHQgICAgICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VHZXR0ZXJNZXRob2QoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi52YWx1ZSA9PT0gJ3NldCcgJiYgbG9va2FoZWFkUHJvcGVydHlLZXkpIHtcblx0ICAgICAgICAgICAgICAgIGtpbmQgPSAnc2V0Jztcblx0ICAgICAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VTZXR0ZXJNZXRob2QoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8gJiYgdG9rZW4udmFsdWUgPT09ICcqJyAmJiBsb29rYWhlYWRQcm9wZXJ0eUtleSkge1xuXHQgICAgICAgICAgICBraW5kID0gJ2luaXQnO1xuXHQgICAgICAgICAgICBjb21wdXRlZCA9IHRoaXMubWF0Y2goJ1snKTtcblx0ICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7XG5cdCAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wYXJzZUdlbmVyYXRvck1ldGhvZCgpO1xuXHQgICAgICAgICAgICBtZXRob2QgPSB0cnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIWtpbmQgJiYga2V5ICYmIHRoaXMubWF0Y2goJygnKSkge1xuXHQgICAgICAgICAgICBraW5kID0gJ2luaXQnO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IGlzQXN5bmMgPyB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2RBc3luY0Z1bmN0aW9uKCkgOiB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2RGdW5jdGlvbigpO1xuXHQgICAgICAgICAgICBtZXRob2QgPSB0cnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIWtpbmQpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChraW5kID09PSAnaW5pdCcpIHtcblx0ICAgICAgICAgICAga2luZCA9ICdtZXRob2QnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIWNvbXB1dGVkKSB7XG5cdCAgICAgICAgICAgIGlmIChpc1N0YXRpYyAmJiB0aGlzLmlzUHJvcGVydHlLZXkoa2V5LCAncHJvdG90eXBlJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RhdGljUHJvdG90eXBlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoIWlzU3RhdGljICYmIHRoaXMuaXNQcm9wZXJ0eUtleShrZXksICdjb25zdHJ1Y3RvcicpKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoa2luZCAhPT0gJ21ldGhvZCcgfHwgIW1ldGhvZCB8fCAodmFsdWUgJiYgdmFsdWUuZ2VuZXJhdG9yKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuQ29uc3RydWN0b3JTcGVjaWFsTWV0aG9kKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChoYXNDb25zdHJ1Y3Rvci52YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuRHVwbGljYXRlQ29uc3RydWN0b3IpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaGFzQ29uc3RydWN0b3IudmFsdWUgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAga2luZCA9ICdjb25zdHJ1Y3Rvcic7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuTWV0aG9kRGVmaW5pdGlvbihrZXksIGNvbXB1dGVkLCB2YWx1ZSwga2luZCwgaXNTdGF0aWMpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQ2xhc3NFbGVtZW50TGlzdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgYm9keSA9IFtdO1xuXHQgICAgICAgIHZhciBoYXNDb25zdHJ1Y3RvciA9IHsgdmFsdWU6IGZhbHNlIH07XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ3snKTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnOycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYm9keS5wdXNoKHRoaXMucGFyc2VDbGFzc0VsZW1lbnQoaGFzQ29uc3RydWN0b3IpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnfScpO1xuXHQgICAgICAgIHJldHVybiBib2R5O1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VDbGFzc0JvZHkgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgZWxlbWVudExpc3QgPSB0aGlzLnBhcnNlQ2xhc3NFbGVtZW50TGlzdCgpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkNsYXNzQm9keShlbGVtZW50TGlzdCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VDbGFzc0RlY2xhcmF0aW9uID0gZnVuY3Rpb24gKGlkZW50aWZpZXJJc09wdGlvbmFsKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNTdHJpY3QgPSB0aGlzLmNvbnRleHQuc3RyaWN0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5zdHJpY3QgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnY2xhc3MnKTtcblx0ICAgICAgICB2YXIgaWQgPSAoaWRlbnRpZmllcklzT3B0aW9uYWwgJiYgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDMgLyogSWRlbnRpZmllciAqLykpID8gbnVsbCA6IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICB2YXIgc3VwZXJDbGFzcyA9IG51bGw7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdleHRlbmRzJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgc3VwZXJDbGFzcyA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlTGVmdEhhbmRTaWRlRXhwcmVzc2lvbkFsbG93Q2FsbCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBjbGFzc0JvZHkgPSB0aGlzLnBhcnNlQ2xhc3NCb2R5KCk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHByZXZpb3VzU3RyaWN0O1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkNsYXNzRGVjbGFyYXRpb24oaWQsIHN1cGVyQ2xhc3MsIGNsYXNzQm9keSkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VDbGFzc0V4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNTdHJpY3QgPSB0aGlzLmNvbnRleHQuc3RyaWN0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5zdHJpY3QgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnY2xhc3MnKTtcblx0ICAgICAgICB2YXIgaWQgPSAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovKSA/IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKSA6IG51bGw7XG5cdCAgICAgICAgdmFyIHN1cGVyQ2xhc3MgPSBudWxsO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnZXh0ZW5kcycpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHN1cGVyQ2xhc3MgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUxlZnRIYW5kU2lkZUV4cHJlc3Npb25BbGxvd0NhbGwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgY2xhc3NCb2R5ID0gdGhpcy5wYXJzZUNsYXNzQm9keSgpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5zdHJpY3QgPSBwcmV2aW91c1N0cmljdDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5DbGFzc0V4cHJlc3Npb24oaWQsIHN1cGVyQ2xhc3MsIGNsYXNzQm9keSkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXNjcmlwdHNcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1vZHVsZXNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VNb2R1bGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzTW9kdWxlID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIuaXNNb2R1bGUgPSB0cnVlO1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlRGlyZWN0aXZlUHJvbG9ndWVzKCk7XG5cdCAgICAgICAgd2hpbGUgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovKSB7XG5cdCAgICAgICAgICAgIGJvZHkucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLk1vZHVsZShib2R5KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVNjcmlwdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBib2R5ID0gdGhpcy5wYXJzZURpcmVjdGl2ZVByb2xvZ3VlcygpO1xuXHQgICAgICAgIHdoaWxlICh0aGlzLmxvb2thaGVhZC50eXBlICE9PSAyIC8qIEVPRiAqLykge1xuXHQgICAgICAgICAgICBib2R5LnB1c2godGhpcy5wYXJzZVN0YXRlbWVudExpc3RJdGVtKCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5TY3JpcHQoYm9keSkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWltcG9ydHNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VNb2R1bGVTcGVjaWZpZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gOCAvKiBTdHJpbmdMaXRlcmFsICovKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRNb2R1bGVTcGVjaWZpZXIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIHZhciByYXcgPSB0aGlzLmdldFRva2VuUmF3KHRva2VuKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5MaXRlcmFsKHRva2VuLnZhbHVlLCByYXcpKTtcblx0ICAgIH07XG5cdCAgICAvLyBpbXBvcnQgezxmb28gYXMgYmFyPn0gLi4uO1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUltcG9ydFNwZWNpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpbXBvcnRlZDtcblx0ICAgICAgICB2YXIgbG9jYWw7XG5cdCAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLykge1xuXHQgICAgICAgICAgICBpbXBvcnRlZCA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgbG9jYWwgPSBpbXBvcnRlZDtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnYXMnKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIGxvY2FsID0gdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBpbXBvcnRlZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyTmFtZSgpO1xuXHQgICAgICAgICAgICBsb2NhbCA9IGltcG9ydGVkO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhcycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgbG9jYWwgPSB0aGlzLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkltcG9ydFNwZWNpZmllcihsb2NhbCwgaW1wb3J0ZWQpKTtcblx0ICAgIH07XG5cdCAgICAvLyB7Zm9vLCBiYXIgYXMgYmFzfVxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU5hbWVkSW1wb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgneycpO1xuXHQgICAgICAgIHZhciBzcGVjaWZpZXJzID0gW107XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgc3BlY2lmaWVycy5wdXNoKHRoaXMucGFyc2VJbXBvcnRTcGVjaWZpZXIoKSk7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgcmV0dXJuIHNwZWNpZmllcnM7XG5cdCAgICB9O1xuXHQgICAgLy8gaW1wb3J0IDxmb28+IC4uLjtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VJbXBvcnREZWZhdWx0U3BlY2lmaWVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGxvY2FsID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSW1wb3J0RGVmYXVsdFNwZWNpZmllcihsb2NhbCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGltcG9ydCA8KiBhcyBmb28+IC4uLjtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKicpO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhcycpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLk5vQXNBZnRlckltcG9ydE5hbWVzcGFjZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdmFyIGxvY2FsID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKGxvY2FsKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUltcG9ydERlY2xhcmF0aW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbEltcG9ydERlY2xhcmF0aW9uKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2ltcG9ydCcpO1xuXHQgICAgICAgIHZhciBzcmM7XG5cdCAgICAgICAgdmFyIHNwZWNpZmllcnMgPSBbXTtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gOCAvKiBTdHJpbmdMaXRlcmFsICovKSB7XG5cdCAgICAgICAgICAgIC8vIGltcG9ydCAnZm9vJztcblx0ICAgICAgICAgICAgc3JjID0gdGhpcy5wYXJzZU1vZHVsZVNwZWNpZmllcigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJ3snKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gaW1wb3J0IHtiYXJ9XG5cdCAgICAgICAgICAgICAgICBzcGVjaWZpZXJzID0gc3BlY2lmaWVycy5jb25jYXQodGhpcy5wYXJzZU5hbWVkSW1wb3J0cygpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCcqJykpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGltcG9ydCAqIGFzIGZvb1xuXHQgICAgICAgICAgICAgICAgc3BlY2lmaWVycy5wdXNoKHRoaXMucGFyc2VJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIoKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc0lkZW50aWZpZXJOYW1lKHRoaXMubG9va2FoZWFkKSAmJiAhdGhpcy5tYXRjaEtleXdvcmQoJ2RlZmF1bHQnKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gaW1wb3J0IGZvb1xuXHQgICAgICAgICAgICAgICAgc3BlY2lmaWVycy5wdXNoKHRoaXMucGFyc2VJbXBvcnREZWZhdWx0U3BlY2lmaWVyKCkpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJywnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJyonKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBvcnQgZm9vLCAqIGFzIGZvb1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXJzLnB1c2godGhpcy5wYXJzZUltcG9ydE5hbWVzcGFjZVNwZWNpZmllcigpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaCgneycpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcG9ydCBmb28sIHtiYXJ9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcnMgPSBzcGVjaWZpZXJzLmNvbmNhdCh0aGlzLnBhcnNlTmFtZWRJbXBvcnRzKCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnZnJvbScpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IHRoaXMubG9va2FoZWFkLnZhbHVlID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW4gOiBtZXNzYWdlc18xLk1lc3NhZ2VzLk1pc3NpbmdGcm9tQ2xhdXNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2UsIHRoaXMubG9va2FoZWFkLnZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBzcmMgPSB0aGlzLnBhcnNlTW9kdWxlU3BlY2lmaWVyKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkltcG9ydERlY2xhcmF0aW9uKHNwZWNpZmllcnMsIHNyYykpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWV4cG9ydHNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VFeHBvcnRTcGVjaWZpZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgbG9jYWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICB2YXIgZXhwb3J0ZWQgPSBsb2NhbDtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhcycpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGV4cG9ydGVkID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydFNwZWNpZmllcihsb2NhbCwgZXhwb3J0ZWQpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRXhwb3J0RGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsRXhwb3J0RGVjbGFyYXRpb24pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnZXhwb3J0Jyk7XG5cdCAgICAgICAgdmFyIGV4cG9ydERlY2xhcmF0aW9uO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnZGVmYXVsdCcpKSB7XG5cdCAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IC4uLlxuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ2Z1bmN0aW9uJykpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvbyAoKSB7fVxuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge31cblx0ICAgICAgICAgICAgICAgIHZhciBkZWNsYXJhdGlvbiA9IHRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKHRydWUpO1xuXHQgICAgICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb24gPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdjbGFzcycpKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBjbGFzcyBmb28ge31cblx0ICAgICAgICAgICAgICAgIHZhciBkZWNsYXJhdGlvbiA9IHRoaXMucGFyc2VDbGFzc0RlY2xhcmF0aW9uKHRydWUpO1xuXHQgICAgICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb24gPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnYXN5bmMnKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZiAoKSB7fVxuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gKCkge31cblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IGFzeW5jIHggPT4geFxuXHQgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdGhpcy5tYXRjaEFzeW5jRnVuY3Rpb24oKSA/IHRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKHRydWUpIDogdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdmcm9tJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW4sIHRoaXMubG9va2FoZWFkLnZhbHVlKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IHt9O1xuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgW107XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCAoMSArIDIpO1xuXHQgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdGhpcy5tYXRjaCgneycpID8gdGhpcy5wYXJzZU9iamVjdEluaXRpYWxpemVyKCkgOlxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2goJ1snKSA/IHRoaXMucGFyc2VBcnJheUluaXRpYWxpemVyKCkgOiB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb24gPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJyonKSkge1xuXHQgICAgICAgICAgICAvLyBleHBvcnQgKiBmcm9tICdmb28nO1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnZnJvbScpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IHRoaXMubG9va2FoZWFkLnZhbHVlID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW4gOiBtZXNzYWdlc18xLk1lc3NhZ2VzLk1pc3NpbmdGcm9tQ2xhdXNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2UsIHRoaXMubG9va2FoZWFkLnZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB2YXIgc3JjID0gdGhpcy5wYXJzZU1vZHVsZVNwZWNpZmllcigpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb24gPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydEFsbERlY2xhcmF0aW9uKHNyYykpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0aGlzLmxvb2thaGVhZC50eXBlID09PSA0IC8qIEtleXdvcmQgKi8pIHtcblx0ICAgICAgICAgICAgLy8gZXhwb3J0IHZhciBmID0gMTtcblx0ICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdm9pZCAwO1xuXHQgICAgICAgICAgICBzd2l0Y2ggKHRoaXMubG9va2FoZWFkLnZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdsZXQnOlxuXHQgICAgICAgICAgICAgICAgY2FzZSAnY29uc3QnOlxuXHQgICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUxleGljYWxEZWNsYXJhdGlvbih7IGluRm9yOiBmYWxzZSB9KTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ3Zhcic6XG5cdCAgICAgICAgICAgICAgICBjYXNlICdjbGFzcyc6XG5cdCAgICAgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG5cdCAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24gPSB0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb24gPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24oZGVjbGFyYXRpb24sIFtdLCBudWxsKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hBc3luY0Z1bmN0aW9uKCkpIHtcblx0ICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24oKTtcblx0ICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb24gPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24oZGVjbGFyYXRpb24sIFtdLCBudWxsKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB2YXIgc3BlY2lmaWVycyA9IFtdO1xuXHQgICAgICAgICAgICB2YXIgc291cmNlID0gbnVsbDtcblx0ICAgICAgICAgICAgdmFyIGlzRXhwb3J0RnJvbUlkZW50aWZpZXIgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJ3snKTtcblx0ICAgICAgICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIGlzRXhwb3J0RnJvbUlkZW50aWZpZXIgPSBpc0V4cG9ydEZyb21JZGVudGlmaWVyIHx8IHRoaXMubWF0Y2hLZXl3b3JkKCdkZWZhdWx0Jyk7XG5cdCAgICAgICAgICAgICAgICBzcGVjaWZpZXJzLnB1c2godGhpcy5wYXJzZUV4cG9ydFNwZWNpZmllcigpKTtcblx0ICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJywnKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnfScpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdmcm9tJykpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCB7ZGVmYXVsdH0gZnJvbSAnZm9vJztcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCB7Zm9vfSBmcm9tICdmb28nO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHNvdXJjZSA9IHRoaXMucGFyc2VNb2R1bGVTcGVjaWZpZXIoKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGlzRXhwb3J0RnJvbUlkZW50aWZpZXIpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCB7ZGVmYXVsdH07IC8vIG1pc3NpbmcgZnJvbUNsYXVzZVxuXHQgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSB0aGlzLmxvb2thaGVhZC52YWx1ZSA/IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuIDogbWVzc2FnZXNfMS5NZXNzYWdlcy5NaXNzaW5nRnJvbUNsYXVzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlLCB0aGlzLmxvb2thaGVhZC52YWx1ZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQge2Zvb307XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0TmFtZWREZWNsYXJhdGlvbihudWxsLCBzcGVjaWZpZXJzLCBzb3VyY2UpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cG9ydERlY2xhcmF0aW9uO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBQYXJzZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuUGFyc2VyID0gUGFyc2VyO1xuXG5cbi8qKiovIH0sXG4vKiA5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0Ly8gRW5zdXJlIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSwgb3RoZXJ3aXNlIHRocm93IGFuIGVycm9yLlxuXHQvLyBUaGlzIGlzIG9ubHkgdG8gaGF2ZSBhIGJldHRlciBjb250cmFjdCBzZW1hbnRpYywgaS5lLiBhbm90aGVyIHNhZmV0eSBuZXRcblx0Ly8gdG8gY2F0Y2ggYSBsb2dpYyBlcnJvci4gVGhlIGNvbmRpdGlvbiBzaGFsbCBiZSBmdWxmaWxsZWQgaW4gbm9ybWFsIGNhc2UuXG5cdC8vIERvIE5PVCB1c2UgdGhpcyB0byBlbmZvcmNlIGEgY2VydGFpbiBjb25kaXRpb24gb24gYW55IHVzZXIgaW5wdXQuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0ZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuXHQgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5cdCAgICBpZiAoIWNvbmRpdGlvbikge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcignQVNTRVJUOiAnICsgbWVzc2FnZSk7XG5cdCAgICB9XG5cdH1cblx0ZXhwb3J0cy5hc3NlcnQgPSBhc3NlcnQ7XG5cblxuLyoqKi8gfSxcbi8qIDEwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0LyogdHNsaW50OmRpc2FibGU6bWF4LWNsYXNzZXMtcGVyLWZpbGUgKi9cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHR2YXIgRXJyb3JIYW5kbGVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEVycm9ySGFuZGxlcigpIHtcblx0ICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuXHQgICAgICAgIHRoaXMudG9sZXJhbnQgPSBmYWxzZTtcblx0ICAgIH1cblx0ICAgIEVycm9ySGFuZGxlci5wcm90b3R5cGUucmVjb3JkRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcblx0ICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKTtcblx0ICAgIH07XG5cdCAgICBFcnJvckhhbmRsZXIucHJvdG90eXBlLnRvbGVyYXRlID0gZnVuY3Rpb24gKGVycm9yKSB7XG5cdCAgICAgICAgaWYgKHRoaXMudG9sZXJhbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy5yZWNvcmRFcnJvcihlcnJvcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aHJvdyBlcnJvcjtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgRXJyb3JIYW5kbGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RFcnJvciA9IGZ1bmN0aW9uIChtc2csIGNvbHVtbikge1xuXHQgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihtc2cpO1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIHRocm93IGVycm9yO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjYXRjaCAoYmFzZSkge1xuXHQgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHQgICAgICAgICAgICBpZiAoT2JqZWN0LmNyZWF0ZSAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcblx0ICAgICAgICAgICAgICAgIGVycm9yID0gT2JqZWN0LmNyZWF0ZShiYXNlKTtcblx0ICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ2NvbHVtbicsIHsgdmFsdWU6IGNvbHVtbiB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHQgICAgICAgIHJldHVybiBlcnJvcjtcblx0ICAgIH07XG5cdCAgICBFcnJvckhhbmRsZXIucHJvdG90eXBlLmNyZWF0ZUVycm9yID0gZnVuY3Rpb24gKGluZGV4LCBsaW5lLCBjb2wsIGRlc2NyaXB0aW9uKSB7XG5cdCAgICAgICAgdmFyIG1zZyA9ICdMaW5lICcgKyBsaW5lICsgJzogJyArIGRlc2NyaXB0aW9uO1xuXHQgICAgICAgIHZhciBlcnJvciA9IHRoaXMuY29uc3RydWN0RXJyb3IobXNnLCBjb2wpO1xuXHQgICAgICAgIGVycm9yLmluZGV4ID0gaW5kZXg7XG5cdCAgICAgICAgZXJyb3IubGluZU51bWJlciA9IGxpbmU7XG5cdCAgICAgICAgZXJyb3IuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblx0ICAgICAgICByZXR1cm4gZXJyb3I7XG5cdCAgICB9O1xuXHQgICAgRXJyb3JIYW5kbGVyLnByb3RvdHlwZS50aHJvd0Vycm9yID0gZnVuY3Rpb24gKGluZGV4LCBsaW5lLCBjb2wsIGRlc2NyaXB0aW9uKSB7XG5cdCAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihpbmRleCwgbGluZSwgY29sLCBkZXNjcmlwdGlvbik7XG5cdCAgICB9O1xuXHQgICAgRXJyb3JIYW5kbGVyLnByb3RvdHlwZS50b2xlcmF0ZUVycm9yID0gZnVuY3Rpb24gKGluZGV4LCBsaW5lLCBjb2wsIGRlc2NyaXB0aW9uKSB7XG5cdCAgICAgICAgdmFyIGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihpbmRleCwgbGluZSwgY29sLCBkZXNjcmlwdGlvbik7XG5cdCAgICAgICAgaWYgKHRoaXMudG9sZXJhbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy5yZWNvcmRFcnJvcihlcnJvcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aHJvdyBlcnJvcjtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIEVycm9ySGFuZGxlcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5FcnJvckhhbmRsZXIgPSBFcnJvckhhbmRsZXI7XG5cblxuLyoqKi8gfSxcbi8qIDExICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHQvLyBFcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIFY4LlxuXHRleHBvcnRzLk1lc3NhZ2VzID0ge1xuXHQgICAgQmFkR2V0dGVyQXJpdHk6ICdHZXR0ZXIgbXVzdCBub3QgaGF2ZSBhbnkgZm9ybWFsIHBhcmFtZXRlcnMnLFxuXHQgICAgQmFkU2V0dGVyQXJpdHk6ICdTZXR0ZXIgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGZvcm1hbCBwYXJhbWV0ZXInLFxuXHQgICAgQmFkU2V0dGVyUmVzdFBhcmFtZXRlcjogJ1NldHRlciBmdW5jdGlvbiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIHJlc3QgcGFyYW1ldGVyJyxcblx0ICAgIENvbnN0cnVjdG9ySXNBc3luYzogJ0NsYXNzIGNvbnN0cnVjdG9yIG1heSBub3QgYmUgYW4gYXN5bmMgbWV0aG9kJyxcblx0ICAgIENvbnN0cnVjdG9yU3BlY2lhbE1ldGhvZDogJ0NsYXNzIGNvbnN0cnVjdG9yIG1heSBub3QgYmUgYW4gYWNjZXNzb3InLFxuXHQgICAgRGVjbGFyYXRpb25NaXNzaW5nSW5pdGlhbGl6ZXI6ICdNaXNzaW5nIGluaXRpYWxpemVyIGluICUwIGRlY2xhcmF0aW9uJyxcblx0ICAgIERlZmF1bHRSZXN0UGFyYW1ldGVyOiAnVW5leHBlY3RlZCB0b2tlbiA9Jyxcblx0ICAgIER1cGxpY2F0ZUJpbmRpbmc6ICdEdXBsaWNhdGUgYmluZGluZyAlMCcsXG5cdCAgICBEdXBsaWNhdGVDb25zdHJ1Y3RvcjogJ0EgY2xhc3MgbWF5IG9ubHkgaGF2ZSBvbmUgY29uc3RydWN0b3InLFxuXHQgICAgRHVwbGljYXRlUHJvdG9Qcm9wZXJ0eTogJ0R1cGxpY2F0ZSBfX3Byb3RvX18gZmllbGRzIGFyZSBub3QgYWxsb3dlZCBpbiBvYmplY3QgbGl0ZXJhbHMnLFxuXHQgICAgRm9ySW5PZkxvb3BJbml0aWFsaXplcjogJyUwIGxvb3AgdmFyaWFibGUgZGVjbGFyYXRpb24gbWF5IG5vdCBoYXZlIGFuIGluaXRpYWxpemVyJyxcblx0ICAgIEdlbmVyYXRvckluTGVnYWN5Q29udGV4dDogJ0dlbmVyYXRvciBkZWNsYXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIGluIGxlZ2FjeSBjb250ZXh0cycsXG5cdCAgICBJbGxlZ2FsQnJlYWs6ICdJbGxlZ2FsIGJyZWFrIHN0YXRlbWVudCcsXG5cdCAgICBJbGxlZ2FsQ29udGludWU6ICdJbGxlZ2FsIGNvbnRpbnVlIHN0YXRlbWVudCcsXG5cdCAgICBJbGxlZ2FsRXhwb3J0RGVjbGFyYXRpb246ICdVbmV4cGVjdGVkIHRva2VuJyxcblx0ICAgIElsbGVnYWxJbXBvcnREZWNsYXJhdGlvbjogJ1VuZXhwZWN0ZWQgdG9rZW4nLFxuXHQgICAgSWxsZWdhbExhbmd1YWdlTW9kZURpcmVjdGl2ZTogJ0lsbGVnYWwgXFwndXNlIHN0cmljdFxcJyBkaXJlY3RpdmUgaW4gZnVuY3Rpb24gd2l0aCBub24tc2ltcGxlIHBhcmFtZXRlciBsaXN0Jyxcblx0ICAgIElsbGVnYWxSZXR1cm46ICdJbGxlZ2FsIHJldHVybiBzdGF0ZW1lbnQnLFxuXHQgICAgSW52YWxpZEVzY2FwZWRSZXNlcnZlZFdvcmQ6ICdLZXl3b3JkIG11c3Qgbm90IGNvbnRhaW4gZXNjYXBlZCBjaGFyYWN0ZXJzJyxcblx0ICAgIEludmFsaWRIZXhFc2NhcGVTZXF1ZW5jZTogJ0ludmFsaWQgaGV4YWRlY2ltYWwgZXNjYXBlIHNlcXVlbmNlJyxcblx0ICAgIEludmFsaWRMSFNJbkFzc2lnbm1lbnQ6ICdJbnZhbGlkIGxlZnQtaGFuZCBzaWRlIGluIGFzc2lnbm1lbnQnLFxuXHQgICAgSW52YWxpZExIU0luRm9ySW46ICdJbnZhbGlkIGxlZnQtaGFuZCBzaWRlIGluIGZvci1pbicsXG5cdCAgICBJbnZhbGlkTEhTSW5Gb3JMb29wOiAnSW52YWxpZCBsZWZ0LWhhbmQgc2lkZSBpbiBmb3ItbG9vcCcsXG5cdCAgICBJbnZhbGlkTW9kdWxlU3BlY2lmaWVyOiAnVW5leHBlY3RlZCB0b2tlbicsXG5cdCAgICBJbnZhbGlkUmVnRXhwOiAnSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24nLFxuXHQgICAgTGV0SW5MZXhpY2FsQmluZGluZzogJ2xldCBpcyBkaXNhbGxvd2VkIGFzIGEgbGV4aWNhbGx5IGJvdW5kIG5hbWUnLFxuXHQgICAgTWlzc2luZ0Zyb21DbGF1c2U6ICdVbmV4cGVjdGVkIHRva2VuJyxcblx0ICAgIE11bHRpcGxlRGVmYXVsdHNJblN3aXRjaDogJ01vcmUgdGhhbiBvbmUgZGVmYXVsdCBjbGF1c2UgaW4gc3dpdGNoIHN0YXRlbWVudCcsXG5cdCAgICBOZXdsaW5lQWZ0ZXJUaHJvdzogJ0lsbGVnYWwgbmV3bGluZSBhZnRlciB0aHJvdycsXG5cdCAgICBOb0FzQWZ0ZXJJbXBvcnROYW1lc3BhY2U6ICdVbmV4cGVjdGVkIHRva2VuJyxcblx0ICAgIE5vQ2F0Y2hPckZpbmFsbHk6ICdNaXNzaW5nIGNhdGNoIG9yIGZpbmFsbHkgYWZ0ZXIgdHJ5Jyxcblx0ICAgIFBhcmFtZXRlckFmdGVyUmVzdFBhcmFtZXRlcjogJ1Jlc3QgcGFyYW1ldGVyIG11c3QgYmUgbGFzdCBmb3JtYWwgcGFyYW1ldGVyJyxcblx0ICAgIFJlZGVjbGFyYXRpb246ICclMCBcXCclMVxcJyBoYXMgYWxyZWFkeSBiZWVuIGRlY2xhcmVkJyxcblx0ICAgIFN0YXRpY1Byb3RvdHlwZTogJ0NsYXNzZXMgbWF5IG5vdCBoYXZlIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBwcm90b3R5cGUnLFxuXHQgICAgU3RyaWN0Q2F0Y2hWYXJpYWJsZTogJ0NhdGNoIHZhcmlhYmxlIG1heSBub3QgYmUgZXZhbCBvciBhcmd1bWVudHMgaW4gc3RyaWN0IG1vZGUnLFxuXHQgICAgU3RyaWN0RGVsZXRlOiAnRGVsZXRlIG9mIGFuIHVucXVhbGlmaWVkIGlkZW50aWZpZXIgaW4gc3RyaWN0IG1vZGUuJyxcblx0ICAgIFN0cmljdEZ1bmN0aW9uOiAnSW4gc3RyaWN0IG1vZGUgY29kZSwgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGF0IHRvcCBsZXZlbCBvciBpbnNpZGUgYSBibG9jaycsXG5cdCAgICBTdHJpY3RGdW5jdGlvbk5hbWU6ICdGdW5jdGlvbiBuYW1lIG1heSBub3QgYmUgZXZhbCBvciBhcmd1bWVudHMgaW4gc3RyaWN0IG1vZGUnLFxuXHQgICAgU3RyaWN0TEhTQXNzaWdubWVudDogJ0Fzc2lnbm1lbnQgdG8gZXZhbCBvciBhcmd1bWVudHMgaXMgbm90IGFsbG93ZWQgaW4gc3RyaWN0IG1vZGUnLFxuXHQgICAgU3RyaWN0TEhTUG9zdGZpeDogJ1Bvc3RmaXggaW5jcmVtZW50L2RlY3JlbWVudCBtYXkgbm90IGhhdmUgZXZhbCBvciBhcmd1bWVudHMgb3BlcmFuZCBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3RMSFNQcmVmaXg6ICdQcmVmaXggaW5jcmVtZW50L2RlY3JlbWVudCBtYXkgbm90IGhhdmUgZXZhbCBvciBhcmd1bWVudHMgb3BlcmFuZCBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3RNb2RlV2l0aDogJ1N0cmljdCBtb2RlIGNvZGUgbWF5IG5vdCBpbmNsdWRlIGEgd2l0aCBzdGF0ZW1lbnQnLFxuXHQgICAgU3RyaWN0T2N0YWxMaXRlcmFsOiAnT2N0YWwgbGl0ZXJhbHMgYXJlIG5vdCBhbGxvd2VkIGluIHN0cmljdCBtb2RlLicsXG5cdCAgICBTdHJpY3RQYXJhbUR1cGU6ICdTdHJpY3QgbW9kZSBmdW5jdGlvbiBtYXkgbm90IGhhdmUgZHVwbGljYXRlIHBhcmFtZXRlciBuYW1lcycsXG5cdCAgICBTdHJpY3RQYXJhbU5hbWU6ICdQYXJhbWV0ZXIgbmFtZSBldmFsIG9yIGFyZ3VtZW50cyBpcyBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3RSZXNlcnZlZFdvcmQ6ICdVc2Ugb2YgZnV0dXJlIHJlc2VydmVkIHdvcmQgaW4gc3RyaWN0IG1vZGUnLFxuXHQgICAgU3RyaWN0VmFyTmFtZTogJ1ZhcmlhYmxlIG5hbWUgbWF5IG5vdCBiZSBldmFsIG9yIGFyZ3VtZW50cyBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBUZW1wbGF0ZU9jdGFsTGl0ZXJhbDogJ09jdGFsIGxpdGVyYWxzIGFyZSBub3QgYWxsb3dlZCBpbiB0ZW1wbGF0ZSBzdHJpbmdzLicsXG5cdCAgICBVbmV4cGVjdGVkRU9TOiAnVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQnLFxuXHQgICAgVW5leHBlY3RlZElkZW50aWZpZXI6ICdVbmV4cGVjdGVkIGlkZW50aWZpZXInLFxuXHQgICAgVW5leHBlY3RlZE51bWJlcjogJ1VuZXhwZWN0ZWQgbnVtYmVyJyxcblx0ICAgIFVuZXhwZWN0ZWRSZXNlcnZlZDogJ1VuZXhwZWN0ZWQgcmVzZXJ2ZWQgd29yZCcsXG5cdCAgICBVbmV4cGVjdGVkU3RyaW5nOiAnVW5leHBlY3RlZCBzdHJpbmcnLFxuXHQgICAgVW5leHBlY3RlZFRlbXBsYXRlOiAnVW5leHBlY3RlZCBxdWFzaSAlMCcsXG5cdCAgICBVbmV4cGVjdGVkVG9rZW46ICdVbmV4cGVjdGVkIHRva2VuICUwJyxcblx0ICAgIFVuZXhwZWN0ZWRUb2tlbklsbGVnYWw6ICdVbmV4cGVjdGVkIHRva2VuIElMTEVHQUwnLFxuXHQgICAgVW5rbm93bkxhYmVsOiAnVW5kZWZpbmVkIGxhYmVsIFxcJyUwXFwnJyxcblx0ICAgIFVudGVybWluYXRlZFJlZ0V4cDogJ0ludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiBtaXNzaW5nIC8nXG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDEyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHR2YXIgYXNzZXJ0XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHR2YXIgY2hhcmFjdGVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIgbWVzc2FnZXNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXHRmdW5jdGlvbiBoZXhWYWx1ZShjaCkge1xuXHQgICAgcmV0dXJuICcwMTIzNDU2Nzg5YWJjZGVmJy5pbmRleE9mKGNoLnRvTG93ZXJDYXNlKCkpO1xuXHR9XG5cdGZ1bmN0aW9uIG9jdGFsVmFsdWUoY2gpIHtcblx0ICAgIHJldHVybiAnMDEyMzQ1NjcnLmluZGV4T2YoY2gpO1xuXHR9XG5cdHZhciBTY2FubmVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFNjYW5uZXIoY29kZSwgaGFuZGxlcikge1xuXHQgICAgICAgIHRoaXMuc291cmNlID0gY29kZTtcblx0ICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IGhhbmRsZXI7XG5cdCAgICAgICAgdGhpcy50cmFja0NvbW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmlzTW9kdWxlID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5sZW5ndGggPSBjb2RlLmxlbmd0aDtcblx0ICAgICAgICB0aGlzLmluZGV4ID0gMDtcblx0ICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSAoY29kZS5sZW5ndGggPiAwKSA/IDEgOiAwO1xuXHQgICAgICAgIHRoaXMubGluZVN0YXJ0ID0gMDtcblx0ICAgICAgICB0aGlzLmN1cmx5U3RhY2sgPSBbXTtcblx0ICAgIH1cblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNhdmVTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICBpbmRleDogdGhpcy5pbmRleCxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0XG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5yZXN0b3JlU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcblx0ICAgICAgICB0aGlzLmluZGV4ID0gc3RhdGUuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5saW5lTnVtYmVyID0gc3RhdGUubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHN0YXRlLmxpbmVTdGFydDtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5lb2YgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPj0gdGhpcy5sZW5ndGg7XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUudGhyb3dVbmV4cGVjdGVkVG9rZW4gPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuXHQgICAgICAgIGlmIChtZXNzYWdlID09PSB2b2lkIDApIHsgbWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuSWxsZWdhbDsgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlci50aHJvd0Vycm9yKHRoaXMuaW5kZXgsIHRoaXMubGluZU51bWJlciwgdGhpcy5pbmRleCAtIHRoaXMubGluZVN0YXJ0ICsgMSwgbWVzc2FnZSk7XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4gPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuXHQgICAgICAgIGlmIChtZXNzYWdlID09PSB2b2lkIDApIHsgbWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuSWxsZWdhbDsgfVxuXHQgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLnRvbGVyYXRlRXJyb3IodGhpcy5pbmRleCwgdGhpcy5saW5lTnVtYmVyLCB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnQgKyAxLCBtZXNzYWdlKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jb21tZW50c1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2tpcFNpbmdsZUxpbmVDb21tZW50ID0gZnVuY3Rpb24gKG9mZnNldCkge1xuXHQgICAgICAgIHZhciBjb21tZW50cyA9IFtdO1xuXHQgICAgICAgIHZhciBzdGFydCwgbG9jO1xuXHQgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICBjb21tZW50cyA9IFtdO1xuXHQgICAgICAgICAgICBzdGFydCA9IHRoaXMuaW5kZXggLSBvZmZzZXQ7XG5cdCAgICAgICAgICAgIGxvYyA9IHtcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5pbmRleCAtIHRoaXMubGluZVN0YXJ0IC0gb2Zmc2V0XG5cdCAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgZW5kOiB7fVxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KTtcblx0ICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2gpKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0NvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBsb2MuZW5kID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5pbmRleCAtIHRoaXMubGluZVN0YXJ0IC0gMVxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aUxpbmU6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzbGljZTogW3N0YXJ0ICsgb2Zmc2V0LCB0aGlzLmluZGV4IC0gMV0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlOiBbc3RhcnQsIHRoaXMuaW5kZXggLSAxXSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiBsb2Ncblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goZW50cnkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAxMyAmJiB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpID09PSAxMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICsrdGhpcy5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1lbnRzO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICBsb2MuZW5kID0ge1xuXHQgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnRcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgdmFyIGVudHJ5ID0ge1xuXHQgICAgICAgICAgICAgICAgbXVsdGlMaW5lOiBmYWxzZSxcblx0ICAgICAgICAgICAgICAgIHNsaWNlOiBbc3RhcnQgKyBvZmZzZXQsIHRoaXMuaW5kZXhdLFxuXHQgICAgICAgICAgICAgICAgcmFuZ2U6IFtzdGFydCwgdGhpcy5pbmRleF0sXG5cdCAgICAgICAgICAgICAgICBsb2M6IGxvY1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBjb21tZW50cy5wdXNoKGVudHJ5KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGNvbW1lbnRzO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNraXBNdWx0aUxpbmVDb21tZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBjb21tZW50cyA9IFtdO1xuXHQgICAgICAgIHZhciBzdGFydCwgbG9jO1xuXHQgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICBjb21tZW50cyA9IFtdO1xuXHQgICAgICAgICAgICBzdGFydCA9IHRoaXMuaW5kZXggLSAyO1xuXHQgICAgICAgICAgICBsb2MgPSB7XG5cdCAgICAgICAgICAgICAgICBzdGFydDoge1xuXHQgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuaW5kZXggLSB0aGlzLmxpbmVTdGFydCAtIDJcblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHt9XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuXHQgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2gpKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09IDB4MEQgJiYgdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4ICsgMSkgPT09IDB4MEEpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICArK3RoaXMubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIHRoaXMubGluZVN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gMHgyQSkge1xuXHQgICAgICAgICAgICAgICAgLy8gQmxvY2sgY29tbWVudCBlbmRzIHdpdGggJyovJy5cblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXggKyAxKSA9PT0gMHgyRikge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gMjtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0NvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbG9jLmVuZCA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5pbmRleCAtIHRoaXMubGluZVN0YXJ0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpTGluZTogdHJ1ZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlOiBbc3RhcnQgKyAyLCB0aGlzLmluZGV4IC0gMl0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTogW3N0YXJ0LCB0aGlzLmluZGV4XSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogbG9jXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goZW50cnkpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tbWVudHM7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gUmFuIG9mZiB0aGUgZW5kIG9mIHRoZSBmaWxlIC0gdGhlIHdob2xlIHRoaW5nIGlzIGEgY29tbWVudFxuXHQgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICBsb2MuZW5kID0ge1xuXHQgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnRcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgdmFyIGVudHJ5ID0ge1xuXHQgICAgICAgICAgICAgICAgbXVsdGlMaW5lOiB0cnVlLFxuXHQgICAgICAgICAgICAgICAgc2xpY2U6IFtzdGFydCArIDIsIHRoaXMuaW5kZXhdLFxuXHQgICAgICAgICAgICAgICAgcmFuZ2U6IFtzdGFydCwgdGhpcy5pbmRleF0sXG5cdCAgICAgICAgICAgICAgICBsb2M6IGxvY1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBjb21tZW50cy5wdXNoKGVudHJ5KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIHJldHVybiBjb21tZW50cztcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuQ29tbWVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNvbW1lbnRzO1xuXHQgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICBjb21tZW50cyA9IFtdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgc3RhcnQgPSAodGhpcy5pbmRleCA9PT0gMCk7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNXaGl0ZVNwYWNlKGNoKSkge1xuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoKSkge1xuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAweDBEICYmIHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkgPT09IDB4MEEpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICArK3RoaXMubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgICAgIHRoaXMubGluZVN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIHN0YXJ0ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gMHgyRikge1xuXHQgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXggKyAxKTtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gMHgyRikge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gMjtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY29tbWVudCA9IHRoaXMuc2tpcFNpbmdsZUxpbmVDb21tZW50KDIpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50cyA9IGNvbW1lbnRzLmNvbmNhdChjb21tZW50KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT09IDB4MkEpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDI7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSB0aGlzLnNraXBNdWx0aUxpbmVDb21tZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzID0gY29tbWVudHMuY29uY2F0KGNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0ICYmIGNoID09PSAweDJEKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBVKzAwM0UgaXMgJz4nXG5cdCAgICAgICAgICAgICAgICBpZiAoKHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCArIDEpID09PSAweDJEKSAmJiAodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4ICsgMikgPT09IDB4M0UpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gJy0tPicgaXMgYSBzaW5nbGUtbGluZSBjb21tZW50XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCArPSAzO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0gdGhpcy5za2lwU2luZ2xlTGluZUNvbW1lbnQoMyk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzID0gY29tbWVudHMuY29uY2F0KGNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAweDNDICYmICF0aGlzLmlzTW9kdWxlKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2Uuc2xpY2UodGhpcy5pbmRleCArIDEsIHRoaXMuaW5kZXggKyA0KSA9PT0gJyEtLScpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDQ7IC8vIGA8IS0tYFxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0gdGhpcy5za2lwU2luZ2xlTGluZUNvbW1lbnQoNCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzID0gY29tbWVudHMuY29uY2F0KGNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGNvbW1lbnRzO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZ1dHVyZS1yZXNlcnZlZC13b3Jkc1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuaXNGdXR1cmVSZXNlcnZlZFdvcmQgPSBmdW5jdGlvbiAoaWQpIHtcblx0ICAgICAgICBzd2l0Y2ggKGlkKSB7XG5cdCAgICAgICAgICAgIGNhc2UgJ2VudW0nOlxuXHQgICAgICAgICAgICBjYXNlICdleHBvcnQnOlxuXHQgICAgICAgICAgICBjYXNlICdpbXBvcnQnOlxuXHQgICAgICAgICAgICBjYXNlICdzdXBlcic6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkID0gZnVuY3Rpb24gKGlkKSB7XG5cdCAgICAgICAgc3dpdGNoIChpZCkge1xuXHQgICAgICAgICAgICBjYXNlICdpbXBsZW1lbnRzJzpcblx0ICAgICAgICAgICAgY2FzZSAnaW50ZXJmYWNlJzpcblx0ICAgICAgICAgICAgY2FzZSAncGFja2FnZSc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3ByaXZhdGUnOlxuXHQgICAgICAgICAgICBjYXNlICdwcm90ZWN0ZWQnOlxuXHQgICAgICAgICAgICBjYXNlICdwdWJsaWMnOlxuXHQgICAgICAgICAgICBjYXNlICdzdGF0aWMnOlxuXHQgICAgICAgICAgICBjYXNlICd5aWVsZCc6XG5cdCAgICAgICAgICAgIGNhc2UgJ2xldCc6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuaXNSZXN0cmljdGVkV29yZCA9IGZ1bmN0aW9uIChpZCkge1xuXHQgICAgICAgIHJldHVybiBpZCA9PT0gJ2V2YWwnIHx8IGlkID09PSAnYXJndW1lbnRzJztcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1rZXl3b3Jkc1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuaXNLZXl3b3JkID0gZnVuY3Rpb24gKGlkKSB7XG5cdCAgICAgICAgc3dpdGNoIChpZC5sZW5ndGgpIHtcblx0ICAgICAgICAgICAgY2FzZSAyOlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ2lmJykgfHwgKGlkID09PSAnaW4nKSB8fCAoaWQgPT09ICdkbycpO1xuXHQgICAgICAgICAgICBjYXNlIDM6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAndmFyJykgfHwgKGlkID09PSAnZm9yJykgfHwgKGlkID09PSAnbmV3JykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAoaWQgPT09ICd0cnknKSB8fCAoaWQgPT09ICdsZXQnKTtcblx0ICAgICAgICAgICAgY2FzZSA0OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3RoaXMnKSB8fCAoaWQgPT09ICdlbHNlJykgfHwgKGlkID09PSAnY2FzZScpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKGlkID09PSAndm9pZCcpIHx8IChpZCA9PT0gJ3dpdGgnKSB8fCAoaWQgPT09ICdlbnVtJyk7XG5cdCAgICAgICAgICAgIGNhc2UgNTpcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICd3aGlsZScpIHx8IChpZCA9PT0gJ2JyZWFrJykgfHwgKGlkID09PSAnY2F0Y2gnKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgIChpZCA9PT0gJ3Rocm93JykgfHwgKGlkID09PSAnY29uc3QnKSB8fCAoaWQgPT09ICd5aWVsZCcpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKGlkID09PSAnY2xhc3MnKSB8fCAoaWQgPT09ICdzdXBlcicpO1xuXHQgICAgICAgICAgICBjYXNlIDY6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAncmV0dXJuJykgfHwgKGlkID09PSAndHlwZW9mJykgfHwgKGlkID09PSAnZGVsZXRlJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAoaWQgPT09ICdzd2l0Y2gnKSB8fCAoaWQgPT09ICdleHBvcnQnKSB8fCAoaWQgPT09ICdpbXBvcnQnKTtcblx0ICAgICAgICAgICAgY2FzZSA3OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ2RlZmF1bHQnKSB8fCAoaWQgPT09ICdmaW5hbGx5JykgfHwgKGlkID09PSAnZXh0ZW5kcycpO1xuXHQgICAgICAgICAgICBjYXNlIDg6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAnZnVuY3Rpb24nKSB8fCAoaWQgPT09ICdjb250aW51ZScpIHx8IChpZCA9PT0gJ2RlYnVnZ2VyJyk7XG5cdCAgICAgICAgICAgIGNhc2UgMTA6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAnaW5zdGFuY2VvZicpO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5jb2RlUG9pbnRBdCA9IGZ1bmN0aW9uIChpKSB7XG5cdCAgICAgICAgdmFyIGNwID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdChpKTtcblx0ICAgICAgICBpZiAoY3AgPj0gMHhEODAwICYmIGNwIDw9IDB4REJGRikge1xuXHQgICAgICAgICAgICB2YXIgc2Vjb25kID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdChpICsgMSk7XG5cdCAgICAgICAgICAgIGlmIChzZWNvbmQgPj0gMHhEQzAwICYmIHNlY29uZCA8PSAweERGRkYpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IGNwO1xuXHQgICAgICAgICAgICAgICAgY3AgPSAoZmlyc3QgLSAweEQ4MDApICogMHg0MDAgKyBzZWNvbmQgLSAweERDMDAgKyAweDEwMDAwO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBjcDtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuSGV4RXNjYXBlID0gZnVuY3Rpb24gKHByZWZpeCkge1xuXHQgICAgICAgIHZhciBsZW4gPSAocHJlZml4ID09PSAndScpID8gNCA6IDI7XG5cdCAgICAgICAgdmFyIGNvZGUgPSAwO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLmVvZigpICYmIGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0hleERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICBjb2RlID0gY29kZSAqIDE2ICsgaGV4VmFsdWUodGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuVW5pY29kZUNvZGVQb2ludEVzY2FwZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICB2YXIgY29kZSA9IDA7XG5cdCAgICAgICAgLy8gQXQgbGVhc3QsIG9uZSBoZXggZGlnaXQgaXMgcmVxdWlyZWQuXG5cdCAgICAgICAgaWYgKGNoID09PSAnfScpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICBpZiAoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0hleERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb2RlID0gY29kZSAqIDE2ICsgaGV4VmFsdWUoY2gpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoY29kZSA+IDB4MTBGRkZGIHx8IGNoICE9PSAnfScpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmZyb21Db2RlUG9pbnQoY29kZSk7XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuZ2V0SWRlbnRpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4Kys7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gMHg1Qykge1xuXHQgICAgICAgICAgICAgICAgLy8gQmxhY2tzbGFzaCAoVSswMDVDKSBtYXJrcyBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZS5cblx0ICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbXBsZXhJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2ggPj0gMHhEODAwICYmIGNoIDwgMHhERkZGKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGhhbmRsZSBzdXJyb2dhdGUgcGFpcnMuXG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb21wbGV4SWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyUGFydChjaCkpIHtcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zbGljZShzdGFydCwgdGhpcy5pbmRleCk7XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuZ2V0Q29tcGxleElkZW50aWZpZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNwID0gdGhpcy5jb2RlUG9pbnRBdCh0aGlzLmluZGV4KTtcblx0ICAgICAgICB2YXIgaWQgPSBjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuZnJvbUNvZGVQb2ludChjcCk7XG5cdCAgICAgICAgdGhpcy5pbmRleCArPSBpZC5sZW5ndGg7XG5cdCAgICAgICAgLy8gJ1xcdScgKFUrMDA1QywgVSswMDc1KSBkZW5vdGVzIGFuIGVzY2FwZWQgY2hhcmFjdGVyLlxuXHQgICAgICAgIHZhciBjaDtcblx0ICAgICAgICBpZiAoY3AgPT09IDB4NUMpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkgIT09IDB4NzUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICBjaCA9IHRoaXMuc2NhblVuaWNvZGVDb2RlUG9pbnRFc2NhcGUoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGNoID0gdGhpcy5zY2FuSGV4RXNjYXBlKCd1Jyk7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09IG51bGwgfHwgY2ggPT09ICdcXFxcJyB8fCAhY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlkID0gY2g7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBjcCA9IHRoaXMuY29kZVBvaW50QXQodGhpcy5pbmRleCk7XG5cdCAgICAgICAgICAgIGlmICghY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclBhcnQoY3ApKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjaCA9IGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5mcm9tQ29kZVBvaW50KGNwKTtcblx0ICAgICAgICAgICAgaWQgKz0gY2g7XG5cdCAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gY2gubGVuZ3RoO1xuXHQgICAgICAgICAgICAvLyAnXFx1JyAoVSswMDVDLCBVKzAwNzUpIGRlbm90ZXMgYW4gZXNjYXBlZCBjaGFyYWN0ZXIuXG5cdCAgICAgICAgICAgIGlmIChjcCA9PT0gMHg1Qykge1xuXHQgICAgICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHIoMCwgaWQubGVuZ3RoIC0gMSk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSAhPT0gMHg3NSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5zY2FuVW5pY29kZUNvZGVQb2ludEVzY2FwZSgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnNjYW5IZXhFc2NhcGUoJ3UnKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09IG51bGwgfHwgY2ggPT09ICdcXFxcJyB8fCAhY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclBhcnQoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlkICs9IGNoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBpZDtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5vY3RhbFRvRGVjaW1hbCA9IGZ1bmN0aW9uIChjaCkge1xuXHQgICAgICAgIC8vIFxcMCBpcyBub3Qgb2N0YWwgZXNjYXBlIHNlcXVlbmNlXG5cdCAgICAgICAgdmFyIG9jdGFsID0gKGNoICE9PSAnMCcpO1xuXHQgICAgICAgIHZhciBjb2RlID0gb2N0YWxWYWx1ZShjaCk7XG5cdCAgICAgICAgaWYgKCF0aGlzLmVvZigpICYmIGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgb2N0YWwgPSB0cnVlO1xuXHQgICAgICAgICAgICBjb2RlID0gY29kZSAqIDggKyBvY3RhbFZhbHVlKHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK10pO1xuXHQgICAgICAgICAgICAvLyAzIGRpZ2l0cyBhcmUgb25seSBhbGxvd2VkIHdoZW4gc3RyaW5nIHN0YXJ0c1xuXHQgICAgICAgICAgICAvLyB3aXRoIDAsIDEsIDIsIDNcblx0ICAgICAgICAgICAgaWYgKCcwMTIzJy5pbmRleE9mKGNoKSA+PSAwICYmICF0aGlzLmVvZigpICYmIGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlICogOCArIG9jdGFsVmFsdWUodGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgY29kZTogY29kZSxcblx0ICAgICAgICAgICAgb2N0YWw6IG9jdGFsXG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1uYW1lcy1hbmQta2V5d29yZHNcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5JZGVudGlmaWVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0eXBlO1xuXHQgICAgICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgLy8gQmFja3NsYXNoIChVKzAwNUMpIHN0YXJ0cyBhbiBlc2NhcGVkIGNoYXJhY3Rlci5cblx0ICAgICAgICB2YXIgaWQgPSAodGhpcy5zb3VyY2UuY2hhckNvZGVBdChzdGFydCkgPT09IDB4NUMpID8gdGhpcy5nZXRDb21wbGV4SWRlbnRpZmllcigpIDogdGhpcy5nZXRJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgLy8gVGhlcmUgaXMgbm8ga2V5d29yZCBvciBsaXRlcmFsIHdpdGggb25seSBvbmUgY2hhcmFjdGVyLlxuXHQgICAgICAgIC8vIFRodXMsIGl0IG11c3QgYmUgYW4gaWRlbnRpZmllci5cblx0ICAgICAgICBpZiAoaWQubGVuZ3RoID09PSAxKSB7XG5cdCAgICAgICAgICAgIHR5cGUgPSAzIC8qIElkZW50aWZpZXIgKi87XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNLZXl3b3JkKGlkKSkge1xuXHQgICAgICAgICAgICB0eXBlID0gNCAvKiBLZXl3b3JkICovO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmIChpZCA9PT0gJ251bGwnKSB7XG5cdCAgICAgICAgICAgIHR5cGUgPSA1IC8qIE51bGxMaXRlcmFsICovO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmIChpZCA9PT0gJ3RydWUnIHx8IGlkID09PSAnZmFsc2UnKSB7XG5cdCAgICAgICAgICAgIHR5cGUgPSAxIC8qIEJvb2xlYW5MaXRlcmFsICovO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdHlwZSA9IDMgLyogSWRlbnRpZmllciAqLztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHR5cGUgIT09IDMgLyogSWRlbnRpZmllciAqLyAmJiAoc3RhcnQgKyBpZC5sZW5ndGggIT09IHRoaXMuaW5kZXgpKSB7XG5cdCAgICAgICAgICAgIHZhciByZXN0b3JlID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZEVzY2FwZWRSZXNlcnZlZFdvcmQpO1xuXHQgICAgICAgICAgICB0aGlzLmluZGV4ID0gcmVzdG9yZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogdHlwZSxcblx0ICAgICAgICAgICAgdmFsdWU6IGlkLFxuXHQgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcblx0ICAgICAgICAgICAgZW5kOiB0aGlzLmluZGV4XG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wdW5jdHVhdG9yc1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2NhblB1bmN0dWF0b3IgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAvLyBDaGVjayBmb3IgbW9zdCBjb21tb24gc2luZ2xlLWNoYXJhY3RlciBwdW5jdHVhdG9ycy5cblx0ICAgICAgICB2YXIgc3RyID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleF07XG5cdCAgICAgICAgc3dpdGNoIChzdHIpIHtcblx0ICAgICAgICAgICAgY2FzZSAnKCc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3snOlxuXHQgICAgICAgICAgICAgICAgaWYgKHN0ciA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJseVN0YWNrLnB1c2goJ3snKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlICcuJzpcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJy4nICYmIHRoaXMuc291cmNlW3RoaXMuaW5kZXggKyAxXSA9PT0gJy4nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gU3ByZWFkIG9wZXJhdG9yOiAuLi5cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDI7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RyID0gJy4uLic7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAnfSc6XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmN1cmx5U3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAnKSc6XG5cdCAgICAgICAgICAgIGNhc2UgJzsnOlxuXHQgICAgICAgICAgICBjYXNlICcsJzpcblx0ICAgICAgICAgICAgY2FzZSAnWyc6XG5cdCAgICAgICAgICAgIGNhc2UgJ10nOlxuXHQgICAgICAgICAgICBjYXNlICc6Jzpcblx0ICAgICAgICAgICAgY2FzZSAnPyc6XG5cdCAgICAgICAgICAgIGNhc2UgJ34nOlxuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAvLyA0LWNoYXJhY3RlciBwdW5jdHVhdG9yLlxuXHQgICAgICAgICAgICAgICAgc3RyID0gdGhpcy5zb3VyY2Uuc3Vic3RyKHRoaXMuaW5kZXgsIDQpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHN0ciA9PT0gJz4+Pj0nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCArPSA0O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gMy1jaGFyYWN0ZXIgcHVuY3R1YXRvcnMuXG5cdCAgICAgICAgICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cigwLCAzKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc3RyID09PSAnPT09JyB8fCBzdHIgPT09ICchPT0nIHx8IHN0ciA9PT0gJz4+PicgfHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSAnPDw9JyB8fCBzdHIgPT09ICc+Pj0nIHx8IHN0ciA9PT0gJyoqPScpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCArPSAzO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi1jaGFyYWN0ZXIgcHVuY3R1YXRvcnMuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMCwgMik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHIgPT09ICcmJicgfHwgc3RyID09PSAnfHwnIHx8IHN0ciA9PT0gJz09JyB8fCBzdHIgPT09ICchPScgfHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9PT0gJys9JyB8fCBzdHIgPT09ICctPScgfHwgc3RyID09PSAnKj0nIHx8IHN0ciA9PT0gJy89JyB8fFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSAnKysnIHx8IHN0ciA9PT0gJy0tJyB8fCBzdHIgPT09ICc8PCcgfHwgc3RyID09PSAnPj4nIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPT09ICcmPScgfHwgc3RyID09PSAnfD0nIHx8IHN0ciA9PT0gJ149JyB8fCBzdHIgPT09ICclPScgfHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9PT0gJzw9JyB8fCBzdHIgPT09ICc+PScgfHwgc3RyID09PSAnPT4nIHx8IHN0ciA9PT0gJyoqJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCArPSAyO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS1jaGFyYWN0ZXIgcHVuY3R1YXRvcnMuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnPD49ISstKiUmfF4vJy5pbmRleE9mKHN0cikgPj0gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IHN0YXJ0KSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogNyAvKiBQdW5jdHVhdG9yICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogc3RyLFxuXHQgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcblx0ICAgICAgICAgICAgZW5kOiB0aGlzLmluZGV4XG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1saXRlcmFscy1udW1lcmljLWxpdGVyYWxzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuSGV4TGl0ZXJhbCA9IGZ1bmN0aW9uIChzdGFydCkge1xuXHQgICAgICAgIHZhciBudW0gPSAnJztcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgaWYgKCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNIZXhEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgbnVtICs9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChudW0ubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJTdGFydCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHR5cGU6IDYgLyogTnVtZXJpY0xpdGVyYWwgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiBwYXJzZUludCgnMHgnICsgbnVtLCAxNiksXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5CaW5hcnlMaXRlcmFsID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG5cdCAgICAgICAgdmFyIG51bSA9ICcnO1xuXHQgICAgICAgIHZhciBjaDtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICAgICAgaWYgKGNoICE9PSAnMCcgJiYgY2ggIT09ICcxJykge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgbnVtICs9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChudW0ubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgIC8vIG9ubHkgMGIgb3IgMEJcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuXHQgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHQgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KGNoKSB8fCBjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQoY2gpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogNiAvKiBOdW1lcmljTGl0ZXJhbCAqLyxcblx0ICAgICAgICAgICAgdmFsdWU6IHBhcnNlSW50KG51bSwgMiksXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5PY3RhbExpdGVyYWwgPSBmdW5jdGlvbiAocHJlZml4LCBzdGFydCkge1xuXHQgICAgICAgIHZhciBudW0gPSAnJztcblx0ICAgICAgICB2YXIgb2N0YWwgPSBmYWxzZTtcblx0ICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzT2N0YWxEaWdpdChwcmVmaXguY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgb2N0YWwgPSB0cnVlO1xuXHQgICAgICAgICAgICBudW0gPSAnMCcgKyB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgIH1cblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgaWYgKCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNPY3RhbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBudW0gKz0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCFvY3RhbCAmJiBudW0ubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgIC8vIG9ubHkgMG8gb3IgME9cblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpIHx8IGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHR5cGU6IDYgLyogTnVtZXJpY0xpdGVyYWwgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiBwYXJzZUludChudW0sIDgpLFxuXHQgICAgICAgICAgICBvY3RhbDogb2N0YWwsXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLmlzSW1wbGljaXRPY3RhbExpdGVyYWwgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy8gSW1wbGljaXQgb2N0YWwsIHVubGVzcyB0aGVyZSBpcyBhIG5vbi1vY3RhbCBkaWdpdC5cblx0ICAgICAgICAvLyAoQW5uZXggQi4xLjEgb24gTnVtZXJpYyBMaXRlcmFscylcblx0ICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5pbmRleCArIDE7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlW2ldO1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09ICc4JyB8fCBjaCA9PT0gJzknKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNPY3RhbERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuTnVtZXJpY0xpdGVyYWwgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZVtzdGFydF07XG5cdCAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKSB8fCAoY2ggPT09ICcuJyksICdOdW1lcmljIGxpdGVyYWwgbXVzdCBzdGFydCB3aXRoIGEgZGVjaW1hbCBkaWdpdCBvciBhIGRlY2ltYWwgcG9pbnQnKTtcblx0ICAgICAgICB2YXIgbnVtID0gJyc7XG5cdCAgICAgICAgaWYgKGNoICE9PSAnLicpIHtcblx0ICAgICAgICAgICAgbnVtID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICAgICAgLy8gSGV4IG51bWJlciBzdGFydHMgd2l0aCAnMHgnLlxuXHQgICAgICAgICAgICAvLyBPY3RhbCBudW1iZXIgc3RhcnRzIHdpdGggJzAnLlxuXHQgICAgICAgICAgICAvLyBPY3RhbCBudW1iZXIgaW4gRVM2IHN0YXJ0cyB3aXRoICcwbycuXG5cdCAgICAgICAgICAgIC8vIEJpbmFyeSBudW1iZXIgaW4gRVM2IHN0YXJ0cyB3aXRoICcwYicuXG5cdCAgICAgICAgICAgIGlmIChudW0gPT09ICcwJykge1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAneCcgfHwgY2ggPT09ICdYJykge1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuSGV4TGl0ZXJhbChzdGFydCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdiJyB8fCBjaCA9PT0gJ0InKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5CaW5hcnlMaXRlcmFsKHN0YXJ0KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ28nIHx8IGNoID09PSAnTycpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuT2N0YWxMaXRlcmFsKGNoLCBzdGFydCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggJiYgY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzT2N0YWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wbGljaXRPY3RhbExpdGVyYWwoKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuT2N0YWxMaXRlcmFsKGNoLCBzdGFydCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHdoaWxlIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIG51bSArPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChjaCA9PT0gJy4nKSB7XG5cdCAgICAgICAgICAgIG51bSArPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICB3aGlsZSAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICBudW0gKz0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoY2ggPT09ICdlJyB8fCBjaCA9PT0gJ0UnKSB7XG5cdCAgICAgICAgICAgIG51bSArPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09ICcrJyB8fCBjaCA9PT0gJy0nKSB7XG5cdCAgICAgICAgICAgICAgICBudW0gKz0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICB3aGlsZSAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbnVtICs9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJTdGFydCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHR5cGU6IDYgLyogTnVtZXJpY0xpdGVyYWwgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiBwYXJzZUZsb2F0KG51bSksXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxpdGVyYWxzLXN0cmluZy1saXRlcmFsc1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2NhblN0cmluZ0xpdGVyYWwgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICB2YXIgcXVvdGUgPSB0aGlzLnNvdXJjZVtzdGFydF07XG5cdCAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KChxdW90ZSA9PT0gJ1xcJycgfHwgcXVvdGUgPT09ICdcIicpLCAnU3RyaW5nIGxpdGVyYWwgbXVzdCBzdGFydHMgd2l0aCBhIHF1b3RlJyk7XG5cdCAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgIHZhciBvY3RhbCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBzdHIgPSAnJztcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgaWYgKGNoID09PSBxdW90ZSkge1xuXHQgICAgICAgICAgICAgICAgcXVvdGUgPSAnJztcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAnXFxcXCcpIHtcblx0ICAgICAgICAgICAgICAgIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgICAgIGlmICghY2ggfHwgIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSB0aGlzLnNjYW5Vbmljb2RlQ29kZVBvaW50RXNjYXBlKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5lc2NhcGVkXzEgPSB0aGlzLnNjYW5IZXhFc2NhcGUoY2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmVzY2FwZWRfMSA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSB1bmVzY2FwZWRfMTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmVzY2FwZWQgPSB0aGlzLnNjYW5IZXhFc2NhcGUoY2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuZXNjYXBlZCA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkSGV4RXNjYXBlU2VxdWVuY2UpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IHVuZXNjYXBlZDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxuJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxyJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFx0Jztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxiJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxmJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFx4MEInO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzgnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc5Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBjaDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoICYmIGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2N0VG9EZWMgPSB0aGlzLm9jdGFsVG9EZWNpbWFsKGNoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY3RhbCA9IG9jdFRvRGVjLm9jdGFsIHx8IG9jdGFsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG9jdFRvRGVjLmNvZGUpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGNoO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ1xcbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgc3RyICs9IGNoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChxdW90ZSAhPT0gJycpIHtcblx0ICAgICAgICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHR5cGU6IDggLyogU3RyaW5nTGl0ZXJhbCAqLyxcblx0ICAgICAgICAgICAgdmFsdWU6IHN0cixcblx0ICAgICAgICAgICAgb2N0YWw6IG9jdGFsLFxuXHQgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcblx0ICAgICAgICAgICAgZW5kOiB0aGlzLmluZGV4XG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10ZW1wbGF0ZS1saXRlcmFsLWxleGljYWwtY29tcG9uZW50c1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2NhblRlbXBsYXRlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBjb29rZWQgPSAnJztcblx0ICAgICAgICB2YXIgdGVybWluYXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgdmFyIGhlYWQgPSAodGhpcy5zb3VyY2Vbc3RhcnRdID09PSAnYCcpO1xuXHQgICAgICAgIHZhciB0YWlsID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIHJhd09mZnNldCA9IDI7XG5cdCAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09ICdgJykge1xuXHQgICAgICAgICAgICAgICAgcmF3T2Zmc2V0ID0gMTtcblx0ICAgICAgICAgICAgICAgIHRhaWwgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgdGVybWluYXRlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gJyQnKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VbdGhpcy5pbmRleF0gPT09ICd7Jykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VybHlTdGFjay5wdXNoKCckeycpO1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNvb2tlZCArPSBjaDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gJ1xcXFwnKSB7XG5cdCAgICAgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgICAgICBpZiAoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFxuJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFxyJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFx0Jztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSB0aGlzLnNjYW5Vbmljb2RlQ29kZVBvaW50RXNjYXBlKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdG9yZSA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVuZXNjYXBlZF8yID0gdGhpcy5zY2FuSGV4RXNjYXBlKGNoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5lc2NhcGVkXzIgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9IHVuZXNjYXBlZF8yO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IHJlc3RvcmU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSBjaDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5lc2NhcGVkID0gdGhpcy5zY2FuSGV4RXNjYXBlKGNoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmVzY2FwZWQgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZEhleEVzY2FwZVNlcXVlbmNlKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSB1bmVzY2FwZWQ7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29rZWQgKz0gJ1xcYic7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29rZWQgKz0gJ1xcZic7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29rZWQgKz0gJ1xcdic7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJzAnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbGxlZ2FsOiBcXDAxIFxcMDIgYW5kIHNvIG9uXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5UZW1wbGF0ZU9jdGFsTGl0ZXJhbCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFwwJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbGxlZ2FsOiBcXDEgXFwyXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLlRlbXBsYXRlT2N0YWxMaXRlcmFsKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSBjaDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgdGhpcy5zb3VyY2VbdGhpcy5pbmRleF0gPT09ICdcXG4nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICArK3RoaXMubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgdGhpcy5zb3VyY2VbdGhpcy5pbmRleF0gPT09ICdcXG4nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgY29va2VkICs9ICdcXG4nO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgY29va2VkICs9IGNoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICghdGVybWluYXRlZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICghaGVhZCkge1xuXHQgICAgICAgICAgICB0aGlzLmN1cmx5U3RhY2sucG9wKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHR5cGU6IDEwIC8qIFRlbXBsYXRlICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogdGhpcy5zb3VyY2Uuc2xpY2Uoc3RhcnQgKyAxLCB0aGlzLmluZGV4IC0gcmF3T2Zmc2V0KSxcblx0ICAgICAgICAgICAgY29va2VkOiBjb29rZWQsXG5cdCAgICAgICAgICAgIGhlYWQ6IGhlYWQsXG5cdCAgICAgICAgICAgIHRhaWw6IHRhaWwsXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxpdGVyYWxzLXJlZ3VsYXItZXhwcmVzc2lvbi1saXRlcmFsc1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUudGVzdFJlZ0V4cCA9IGZ1bmN0aW9uIChwYXR0ZXJuLCBmbGFncykge1xuXHQgICAgICAgIC8vIFRoZSBCTVAgY2hhcmFjdGVyIHRvIHVzZSBhcyBhIHJlcGxhY2VtZW50IGZvciBhc3RyYWwgc3ltYm9scyB3aGVuXG5cdCAgICAgICAgLy8gdHJhbnNsYXRpbmcgYW4gRVM2IFwidVwiLWZsYWdnZWQgcGF0dGVybiB0byBhbiBFUzUtY29tcGF0aWJsZVxuXHQgICAgICAgIC8vIGFwcHJveGltYXRpb24uXG5cdCAgICAgICAgLy8gTm90ZTogcmVwbGFjaW5nIHdpdGggJ1xcdUZGRkYnIGVuYWJsZXMgZmFsc2UgcG9zaXRpdmVzIGluIHVubGlrZWx5XG5cdCAgICAgICAgLy8gc2NlbmFyaW9zLiBGb3IgZXhhbXBsZSwgYFtcXHV7MTA0NGZ9LVxcdXsxMDQ0MH1dYCBpcyBhbiBpbnZhbGlkXG5cdCAgICAgICAgLy8gcGF0dGVybiB0aGF0IHdvdWxkIG5vdCBiZSBkZXRlY3RlZCBieSB0aGlzIHN1YnN0aXR1dGlvbi5cblx0ICAgICAgICB2YXIgYXN0cmFsU3Vic3RpdHV0ZSA9ICdcXHVGRkZGJztcblx0ICAgICAgICB2YXIgdG1wID0gcGF0dGVybjtcblx0ICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgICAgaWYgKGZsYWdzLmluZGV4T2YoJ3UnKSA+PSAwKSB7XG5cdCAgICAgICAgICAgIHRtcCA9IHRtcFxuXHQgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFx1XFx7KFswLTlhLWZBLUZdKylcXH18XFxcXHUoW2EtZkEtRjAtOV17NH0pL2csIGZ1bmN0aW9uICgkMCwgJDEsICQyKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgY29kZVBvaW50ID0gcGFyc2VJbnQoJDEgfHwgJDIsIDE2KTtcblx0ICAgICAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPiAweDEwRkZGRikge1xuXHQgICAgICAgICAgICAgICAgICAgIHNlbGYudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkUmVnRXhwKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPD0gMHhGRkZGKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiBhc3RyYWxTdWJzdGl0dXRlO1xuXHQgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZywgYXN0cmFsU3Vic3RpdHV0ZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIEZpcnN0LCBkZXRlY3QgaW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25zLlxuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIFJlZ0V4cCh0bXApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjYXRjaCAoZSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZFJlZ0V4cCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFJldHVybiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QgZm9yIHRoaXMgcGF0dGVybi1mbGFnIHBhaXIsIG9yXG5cdCAgICAgICAgLy8gYG51bGxgIGluIGNhc2UgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgZG9lc24ndCBzdXBwb3J0IHRoZSBmbGFncyBpdFxuXHQgICAgICAgIC8vIHVzZXMuXG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocGF0dGVybiwgZmxhZ3MpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG5cdCAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdCAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuUmVnRXhwQm9keSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICBhc3NlcnRfMS5hc3NlcnQoY2ggPT09ICcvJywgJ1JlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoJyk7XG5cdCAgICAgICAgdmFyIHN0ciA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgdmFyIGNsYXNzTWFya2VyID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIHRlcm1pbmF0ZWQgPSBmYWxzZTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICBzdHIgKz0gY2g7XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcXFwnKSB7XG5cdCAgICAgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1saXRlcmFscy1yZWd1bGFyLWV4cHJlc3Npb24tbGl0ZXJhbHNcblx0ICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5VbnRlcm1pbmF0ZWRSZWdFeHApO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgc3RyICs9IGNoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW50ZXJtaW5hdGVkUmVnRXhwKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjbGFzc01hcmtlcikge1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXScpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjbGFzc01hcmtlciA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnLycpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAnWycpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjbGFzc01hcmtlciA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCF0ZXJtaW5hdGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5VbnRlcm1pbmF0ZWRSZWdFeHApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBFeGNsdWRlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoLlxuXHQgICAgICAgIHJldHVybiBzdHIuc3Vic3RyKDEsIHN0ci5sZW5ndGggLSAyKTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuUmVnRXhwRmxhZ3MgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0ciA9ICcnO1xuXHQgICAgICAgIHZhciBmbGFncyA9ICcnO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICAgICAgaWYgKCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyUGFydChjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09ICdcXFxcJyAmJiAhdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ3UnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciByZXN0b3JlID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY2hhciA9IHRoaXMuc2NhbkhleEVzY2FwZSgndScpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICs9IGNoYXI7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc3RyICs9ICdcXFxcdSc7IHJlc3RvcmUgPCB0aGlzLmluZGV4OyArK3Jlc3RvcmUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSB0aGlzLnNvdXJjZVtyZXN0b3JlXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IHJlc3RvcmU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICs9ICd1Jztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcdSc7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXCc7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgZmxhZ3MgKz0gY2g7XG5cdCAgICAgICAgICAgICAgICBzdHIgKz0gY2g7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGZsYWdzO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5SZWdFeHAgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICB2YXIgcGF0dGVybiA9IHRoaXMuc2NhblJlZ0V4cEJvZHkoKTtcblx0ICAgICAgICB2YXIgZmxhZ3MgPSB0aGlzLnNjYW5SZWdFeHBGbGFncygpO1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudGVzdFJlZ0V4cChwYXR0ZXJuLCBmbGFncyk7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogOSAvKiBSZWd1bGFyRXhwcmVzc2lvbiAqLyxcblx0ICAgICAgICAgICAgdmFsdWU6ICcnLFxuXHQgICAgICAgICAgICBwYXR0ZXJuOiBwYXR0ZXJuLFxuXHQgICAgICAgICAgICBmbGFnczogZmxhZ3MsXG5cdCAgICAgICAgICAgIHJlZ2V4OiB2YWx1ZSxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUubGV4ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiAyIC8qIEVPRiAqLyxcblx0ICAgICAgICAgICAgICAgIHZhbHVlOiAnJyxcblx0ICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5pbmRleCxcblx0ICAgICAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgY3AgPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuXHQgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyU3RhcnQoY3ApKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5JZGVudGlmaWVyKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFZlcnkgY29tbW9uOiAoIGFuZCApIGFuZCA7XG5cdCAgICAgICAgaWYgKGNwID09PSAweDI4IHx8IGNwID09PSAweDI5IHx8IGNwID09PSAweDNCKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5QdW5jdHVhdG9yKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFN0cmluZyBsaXRlcmFsIHN0YXJ0cyB3aXRoIHNpbmdsZSBxdW90ZSAoVSswMDI3KSBvciBkb3VibGUgcXVvdGUgKFUrMDAyMikuXG5cdCAgICAgICAgaWYgKGNwID09PSAweDI3IHx8IGNwID09PSAweDIyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5TdHJpbmdMaXRlcmFsKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIERvdCAoLikgVSswMDJFIGNhbiBhbHNvIHN0YXJ0IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLCBoZW5jZSB0aGUgbmVlZFxuXHQgICAgICAgIC8vIHRvIGNoZWNrIHRoZSBuZXh0IGNoYXJhY3Rlci5cblx0ICAgICAgICBpZiAoY3AgPT09IDB4MkUpIHtcblx0ICAgICAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXggKyAxKSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5OdW1lcmljTGl0ZXJhbCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5QdW5jdHVhdG9yKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQoY3ApKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5OdW1lcmljTGl0ZXJhbCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBUZW1wbGF0ZSBsaXRlcmFscyBzdGFydCB3aXRoIGAgKFUrMDA2MCkgZm9yIHRlbXBsYXRlIGhlYWRcblx0ICAgICAgICAvLyBvciB9IChVKzAwN0QpIGZvciB0ZW1wbGF0ZSBtaWRkbGUgb3IgdGVtcGxhdGUgdGFpbC5cblx0ICAgICAgICBpZiAoY3AgPT09IDB4NjAgfHwgKGNwID09PSAweDdEICYmIHRoaXMuY3VybHlTdGFja1t0aGlzLmN1cmx5U3RhY2subGVuZ3RoIC0gMV0gPT09ICckeycpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5UZW1wbGF0ZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBQb3NzaWJsZSBpZGVudGlmaWVyIHN0YXJ0IGluIGEgc3Vycm9nYXRlIHBhaXIuXG5cdCAgICAgICAgaWYgKGNwID49IDB4RDgwMCAmJiBjcCA8IDB4REZGRikge1xuXHQgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuY29kZVBvaW50QXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLnNjYW5QdW5jdHVhdG9yKCk7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFNjYW5uZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuU2Nhbm5lciA9IFNjYW5uZXI7XG5cblxuLyoqKi8gfSxcbi8qIDEzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHRleHBvcnRzLlRva2VuTmFtZSA9IHt9O1xuXHRleHBvcnRzLlRva2VuTmFtZVsxIC8qIEJvb2xlYW5MaXRlcmFsICovXSA9ICdCb29sZWFuJztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbMiAvKiBFT0YgKi9dID0gJzxlbmQ+Jztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbMyAvKiBJZGVudGlmaWVyICovXSA9ICdJZGVudGlmaWVyJztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbNCAvKiBLZXl3b3JkICovXSA9ICdLZXl3b3JkJztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbNSAvKiBOdWxsTGl0ZXJhbCAqL10gPSAnTnVsbCc7XG5cdGV4cG9ydHMuVG9rZW5OYW1lWzYgLyogTnVtZXJpY0xpdGVyYWwgKi9dID0gJ051bWVyaWMnO1xuXHRleHBvcnRzLlRva2VuTmFtZVs3IC8qIFB1bmN0dWF0b3IgKi9dID0gJ1B1bmN0dWF0b3InO1xuXHRleHBvcnRzLlRva2VuTmFtZVs4IC8qIFN0cmluZ0xpdGVyYWwgKi9dID0gJ1N0cmluZyc7XG5cdGV4cG9ydHMuVG9rZW5OYW1lWzkgLyogUmVndWxhckV4cHJlc3Npb24gKi9dID0gJ1JlZ3VsYXJFeHByZXNzaW9uJztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbMTAgLyogVGVtcGxhdGUgKi9dID0gJ1RlbXBsYXRlJztcblxuXG4vKioqLyB9LFxuLyogMTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHQvLyBHZW5lcmF0ZWQgYnkgZ2VuZXJhdGUteGh0bWwtZW50aXRpZXMuanMuIERPIE5PVCBNT0RJRlkhXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0ZXhwb3J0cy5YSFRNTEVudGl0aWVzID0ge1xuXHQgICAgcXVvdDogJ1xcdTAwMjInLFxuXHQgICAgYW1wOiAnXFx1MDAyNicsXG5cdCAgICBhcG9zOiAnXFx1MDAyNycsXG5cdCAgICBndDogJ1xcdTAwM0UnLFxuXHQgICAgbmJzcDogJ1xcdTAwQTAnLFxuXHQgICAgaWV4Y2w6ICdcXHUwMEExJyxcblx0ICAgIGNlbnQ6ICdcXHUwMEEyJyxcblx0ICAgIHBvdW5kOiAnXFx1MDBBMycsXG5cdCAgICBjdXJyZW46ICdcXHUwMEE0Jyxcblx0ICAgIHllbjogJ1xcdTAwQTUnLFxuXHQgICAgYnJ2YmFyOiAnXFx1MDBBNicsXG5cdCAgICBzZWN0OiAnXFx1MDBBNycsXG5cdCAgICB1bWw6ICdcXHUwMEE4Jyxcblx0ICAgIGNvcHk6ICdcXHUwMEE5Jyxcblx0ICAgIG9yZGY6ICdcXHUwMEFBJyxcblx0ICAgIGxhcXVvOiAnXFx1MDBBQicsXG5cdCAgICBub3Q6ICdcXHUwMEFDJyxcblx0ICAgIHNoeTogJ1xcdTAwQUQnLFxuXHQgICAgcmVnOiAnXFx1MDBBRScsXG5cdCAgICBtYWNyOiAnXFx1MDBBRicsXG5cdCAgICBkZWc6ICdcXHUwMEIwJyxcblx0ICAgIHBsdXNtbjogJ1xcdTAwQjEnLFxuXHQgICAgc3VwMjogJ1xcdTAwQjInLFxuXHQgICAgc3VwMzogJ1xcdTAwQjMnLFxuXHQgICAgYWN1dGU6ICdcXHUwMEI0Jyxcblx0ICAgIG1pY3JvOiAnXFx1MDBCNScsXG5cdCAgICBwYXJhOiAnXFx1MDBCNicsXG5cdCAgICBtaWRkb3Q6ICdcXHUwMEI3Jyxcblx0ICAgIGNlZGlsOiAnXFx1MDBCOCcsXG5cdCAgICBzdXAxOiAnXFx1MDBCOScsXG5cdCAgICBvcmRtOiAnXFx1MDBCQScsXG5cdCAgICByYXF1bzogJ1xcdTAwQkInLFxuXHQgICAgZnJhYzE0OiAnXFx1MDBCQycsXG5cdCAgICBmcmFjMTI6ICdcXHUwMEJEJyxcblx0ICAgIGZyYWMzNDogJ1xcdTAwQkUnLFxuXHQgICAgaXF1ZXN0OiAnXFx1MDBCRicsXG5cdCAgICBBZ3JhdmU6ICdcXHUwMEMwJyxcblx0ICAgIEFhY3V0ZTogJ1xcdTAwQzEnLFxuXHQgICAgQWNpcmM6ICdcXHUwMEMyJyxcblx0ICAgIEF0aWxkZTogJ1xcdTAwQzMnLFxuXHQgICAgQXVtbDogJ1xcdTAwQzQnLFxuXHQgICAgQXJpbmc6ICdcXHUwMEM1Jyxcblx0ICAgIEFFbGlnOiAnXFx1MDBDNicsXG5cdCAgICBDY2VkaWw6ICdcXHUwMEM3Jyxcblx0ICAgIEVncmF2ZTogJ1xcdTAwQzgnLFxuXHQgICAgRWFjdXRlOiAnXFx1MDBDOScsXG5cdCAgICBFY2lyYzogJ1xcdTAwQ0EnLFxuXHQgICAgRXVtbDogJ1xcdTAwQ0InLFxuXHQgICAgSWdyYXZlOiAnXFx1MDBDQycsXG5cdCAgICBJYWN1dGU6ICdcXHUwMENEJyxcblx0ICAgIEljaXJjOiAnXFx1MDBDRScsXG5cdCAgICBJdW1sOiAnXFx1MDBDRicsXG5cdCAgICBFVEg6ICdcXHUwMEQwJyxcblx0ICAgIE50aWxkZTogJ1xcdTAwRDEnLFxuXHQgICAgT2dyYXZlOiAnXFx1MDBEMicsXG5cdCAgICBPYWN1dGU6ICdcXHUwMEQzJyxcblx0ICAgIE9jaXJjOiAnXFx1MDBENCcsXG5cdCAgICBPdGlsZGU6ICdcXHUwMEQ1Jyxcblx0ICAgIE91bWw6ICdcXHUwMEQ2Jyxcblx0ICAgIHRpbWVzOiAnXFx1MDBENycsXG5cdCAgICBPc2xhc2g6ICdcXHUwMEQ4Jyxcblx0ICAgIFVncmF2ZTogJ1xcdTAwRDknLFxuXHQgICAgVWFjdXRlOiAnXFx1MDBEQScsXG5cdCAgICBVY2lyYzogJ1xcdTAwREInLFxuXHQgICAgVXVtbDogJ1xcdTAwREMnLFxuXHQgICAgWWFjdXRlOiAnXFx1MDBERCcsXG5cdCAgICBUSE9STjogJ1xcdTAwREUnLFxuXHQgICAgc3psaWc6ICdcXHUwMERGJyxcblx0ICAgIGFncmF2ZTogJ1xcdTAwRTAnLFxuXHQgICAgYWFjdXRlOiAnXFx1MDBFMScsXG5cdCAgICBhY2lyYzogJ1xcdTAwRTInLFxuXHQgICAgYXRpbGRlOiAnXFx1MDBFMycsXG5cdCAgICBhdW1sOiAnXFx1MDBFNCcsXG5cdCAgICBhcmluZzogJ1xcdTAwRTUnLFxuXHQgICAgYWVsaWc6ICdcXHUwMEU2Jyxcblx0ICAgIGNjZWRpbDogJ1xcdTAwRTcnLFxuXHQgICAgZWdyYXZlOiAnXFx1MDBFOCcsXG5cdCAgICBlYWN1dGU6ICdcXHUwMEU5Jyxcblx0ICAgIGVjaXJjOiAnXFx1MDBFQScsXG5cdCAgICBldW1sOiAnXFx1MDBFQicsXG5cdCAgICBpZ3JhdmU6ICdcXHUwMEVDJyxcblx0ICAgIGlhY3V0ZTogJ1xcdTAwRUQnLFxuXHQgICAgaWNpcmM6ICdcXHUwMEVFJyxcblx0ICAgIGl1bWw6ICdcXHUwMEVGJyxcblx0ICAgIGV0aDogJ1xcdTAwRjAnLFxuXHQgICAgbnRpbGRlOiAnXFx1MDBGMScsXG5cdCAgICBvZ3JhdmU6ICdcXHUwMEYyJyxcblx0ICAgIG9hY3V0ZTogJ1xcdTAwRjMnLFxuXHQgICAgb2NpcmM6ICdcXHUwMEY0Jyxcblx0ICAgIG90aWxkZTogJ1xcdTAwRjUnLFxuXHQgICAgb3VtbDogJ1xcdTAwRjYnLFxuXHQgICAgZGl2aWRlOiAnXFx1MDBGNycsXG5cdCAgICBvc2xhc2g6ICdcXHUwMEY4Jyxcblx0ICAgIHVncmF2ZTogJ1xcdTAwRjknLFxuXHQgICAgdWFjdXRlOiAnXFx1MDBGQScsXG5cdCAgICB1Y2lyYzogJ1xcdTAwRkInLFxuXHQgICAgdXVtbDogJ1xcdTAwRkMnLFxuXHQgICAgeWFjdXRlOiAnXFx1MDBGRCcsXG5cdCAgICB0aG9ybjogJ1xcdTAwRkUnLFxuXHQgICAgeXVtbDogJ1xcdTAwRkYnLFxuXHQgICAgT0VsaWc6ICdcXHUwMTUyJyxcblx0ICAgIG9lbGlnOiAnXFx1MDE1MycsXG5cdCAgICBTY2Fyb246ICdcXHUwMTYwJyxcblx0ICAgIHNjYXJvbjogJ1xcdTAxNjEnLFxuXHQgICAgWXVtbDogJ1xcdTAxNzgnLFxuXHQgICAgZm5vZjogJ1xcdTAxOTInLFxuXHQgICAgY2lyYzogJ1xcdTAyQzYnLFxuXHQgICAgdGlsZGU6ICdcXHUwMkRDJyxcblx0ICAgIEFscGhhOiAnXFx1MDM5MScsXG5cdCAgICBCZXRhOiAnXFx1MDM5MicsXG5cdCAgICBHYW1tYTogJ1xcdTAzOTMnLFxuXHQgICAgRGVsdGE6ICdcXHUwMzk0Jyxcblx0ICAgIEVwc2lsb246ICdcXHUwMzk1Jyxcblx0ICAgIFpldGE6ICdcXHUwMzk2Jyxcblx0ICAgIEV0YTogJ1xcdTAzOTcnLFxuXHQgICAgVGhldGE6ICdcXHUwMzk4Jyxcblx0ICAgIElvdGE6ICdcXHUwMzk5Jyxcblx0ICAgIEthcHBhOiAnXFx1MDM5QScsXG5cdCAgICBMYW1iZGE6ICdcXHUwMzlCJyxcblx0ICAgIE11OiAnXFx1MDM5QycsXG5cdCAgICBOdTogJ1xcdTAzOUQnLFxuXHQgICAgWGk6ICdcXHUwMzlFJyxcblx0ICAgIE9taWNyb246ICdcXHUwMzlGJyxcblx0ICAgIFBpOiAnXFx1MDNBMCcsXG5cdCAgICBSaG86ICdcXHUwM0ExJyxcblx0ICAgIFNpZ21hOiAnXFx1MDNBMycsXG5cdCAgICBUYXU6ICdcXHUwM0E0Jyxcblx0ICAgIFVwc2lsb246ICdcXHUwM0E1Jyxcblx0ICAgIFBoaTogJ1xcdTAzQTYnLFxuXHQgICAgQ2hpOiAnXFx1MDNBNycsXG5cdCAgICBQc2k6ICdcXHUwM0E4Jyxcblx0ICAgIE9tZWdhOiAnXFx1MDNBOScsXG5cdCAgICBhbHBoYTogJ1xcdTAzQjEnLFxuXHQgICAgYmV0YTogJ1xcdTAzQjInLFxuXHQgICAgZ2FtbWE6ICdcXHUwM0IzJyxcblx0ICAgIGRlbHRhOiAnXFx1MDNCNCcsXG5cdCAgICBlcHNpbG9uOiAnXFx1MDNCNScsXG5cdCAgICB6ZXRhOiAnXFx1MDNCNicsXG5cdCAgICBldGE6ICdcXHUwM0I3Jyxcblx0ICAgIHRoZXRhOiAnXFx1MDNCOCcsXG5cdCAgICBpb3RhOiAnXFx1MDNCOScsXG5cdCAgICBrYXBwYTogJ1xcdTAzQkEnLFxuXHQgICAgbGFtYmRhOiAnXFx1MDNCQicsXG5cdCAgICBtdTogJ1xcdTAzQkMnLFxuXHQgICAgbnU6ICdcXHUwM0JEJyxcblx0ICAgIHhpOiAnXFx1MDNCRScsXG5cdCAgICBvbWljcm9uOiAnXFx1MDNCRicsXG5cdCAgICBwaTogJ1xcdTAzQzAnLFxuXHQgICAgcmhvOiAnXFx1MDNDMScsXG5cdCAgICBzaWdtYWY6ICdcXHUwM0MyJyxcblx0ICAgIHNpZ21hOiAnXFx1MDNDMycsXG5cdCAgICB0YXU6ICdcXHUwM0M0Jyxcblx0ICAgIHVwc2lsb246ICdcXHUwM0M1Jyxcblx0ICAgIHBoaTogJ1xcdTAzQzYnLFxuXHQgICAgY2hpOiAnXFx1MDNDNycsXG5cdCAgICBwc2k6ICdcXHUwM0M4Jyxcblx0ICAgIG9tZWdhOiAnXFx1MDNDOScsXG5cdCAgICB0aGV0YXN5bTogJ1xcdTAzRDEnLFxuXHQgICAgdXBzaWg6ICdcXHUwM0QyJyxcblx0ICAgIHBpdjogJ1xcdTAzRDYnLFxuXHQgICAgZW5zcDogJ1xcdTIwMDInLFxuXHQgICAgZW1zcDogJ1xcdTIwMDMnLFxuXHQgICAgdGhpbnNwOiAnXFx1MjAwOScsXG5cdCAgICB6d25qOiAnXFx1MjAwQycsXG5cdCAgICB6d2o6ICdcXHUyMDBEJyxcblx0ICAgIGxybTogJ1xcdTIwMEUnLFxuXHQgICAgcmxtOiAnXFx1MjAwRicsXG5cdCAgICBuZGFzaDogJ1xcdTIwMTMnLFxuXHQgICAgbWRhc2g6ICdcXHUyMDE0Jyxcblx0ICAgIGxzcXVvOiAnXFx1MjAxOCcsXG5cdCAgICByc3F1bzogJ1xcdTIwMTknLFxuXHQgICAgc2JxdW86ICdcXHUyMDFBJyxcblx0ICAgIGxkcXVvOiAnXFx1MjAxQycsXG5cdCAgICByZHF1bzogJ1xcdTIwMUQnLFxuXHQgICAgYmRxdW86ICdcXHUyMDFFJyxcblx0ICAgIGRhZ2dlcjogJ1xcdTIwMjAnLFxuXHQgICAgRGFnZ2VyOiAnXFx1MjAyMScsXG5cdCAgICBidWxsOiAnXFx1MjAyMicsXG5cdCAgICBoZWxsaXA6ICdcXHUyMDI2Jyxcblx0ICAgIHBlcm1pbDogJ1xcdTIwMzAnLFxuXHQgICAgcHJpbWU6ICdcXHUyMDMyJyxcblx0ICAgIFByaW1lOiAnXFx1MjAzMycsXG5cdCAgICBsc2FxdW86ICdcXHUyMDM5Jyxcblx0ICAgIHJzYXF1bzogJ1xcdTIwM0EnLFxuXHQgICAgb2xpbmU6ICdcXHUyMDNFJyxcblx0ICAgIGZyYXNsOiAnXFx1MjA0NCcsXG5cdCAgICBldXJvOiAnXFx1MjBBQycsXG5cdCAgICBpbWFnZTogJ1xcdTIxMTEnLFxuXHQgICAgd2VpZXJwOiAnXFx1MjExOCcsXG5cdCAgICByZWFsOiAnXFx1MjExQycsXG5cdCAgICB0cmFkZTogJ1xcdTIxMjInLFxuXHQgICAgYWxlZnN5bTogJ1xcdTIxMzUnLFxuXHQgICAgbGFycjogJ1xcdTIxOTAnLFxuXHQgICAgdWFycjogJ1xcdTIxOTEnLFxuXHQgICAgcmFycjogJ1xcdTIxOTInLFxuXHQgICAgZGFycjogJ1xcdTIxOTMnLFxuXHQgICAgaGFycjogJ1xcdTIxOTQnLFxuXHQgICAgY3JhcnI6ICdcXHUyMUI1Jyxcblx0ICAgIGxBcnI6ICdcXHUyMUQwJyxcblx0ICAgIHVBcnI6ICdcXHUyMUQxJyxcblx0ICAgIHJBcnI6ICdcXHUyMUQyJyxcblx0ICAgIGRBcnI6ICdcXHUyMUQzJyxcblx0ICAgIGhBcnI6ICdcXHUyMUQ0Jyxcblx0ICAgIGZvcmFsbDogJ1xcdTIyMDAnLFxuXHQgICAgcGFydDogJ1xcdTIyMDInLFxuXHQgICAgZXhpc3Q6ICdcXHUyMjAzJyxcblx0ICAgIGVtcHR5OiAnXFx1MjIwNScsXG5cdCAgICBuYWJsYTogJ1xcdTIyMDcnLFxuXHQgICAgaXNpbjogJ1xcdTIyMDgnLFxuXHQgICAgbm90aW46ICdcXHUyMjA5Jyxcblx0ICAgIG5pOiAnXFx1MjIwQicsXG5cdCAgICBwcm9kOiAnXFx1MjIwRicsXG5cdCAgICBzdW06ICdcXHUyMjExJyxcblx0ICAgIG1pbnVzOiAnXFx1MjIxMicsXG5cdCAgICBsb3dhc3Q6ICdcXHUyMjE3Jyxcblx0ICAgIHJhZGljOiAnXFx1MjIxQScsXG5cdCAgICBwcm9wOiAnXFx1MjIxRCcsXG5cdCAgICBpbmZpbjogJ1xcdTIyMUUnLFxuXHQgICAgYW5nOiAnXFx1MjIyMCcsXG5cdCAgICBhbmQ6ICdcXHUyMjI3Jyxcblx0ICAgIG9yOiAnXFx1MjIyOCcsXG5cdCAgICBjYXA6ICdcXHUyMjI5Jyxcblx0ICAgIGN1cDogJ1xcdTIyMkEnLFxuXHQgICAgaW50OiAnXFx1MjIyQicsXG5cdCAgICB0aGVyZTQ6ICdcXHUyMjM0Jyxcblx0ICAgIHNpbTogJ1xcdTIyM0MnLFxuXHQgICAgY29uZzogJ1xcdTIyNDUnLFxuXHQgICAgYXN5bXA6ICdcXHUyMjQ4Jyxcblx0ICAgIG5lOiAnXFx1MjI2MCcsXG5cdCAgICBlcXVpdjogJ1xcdTIyNjEnLFxuXHQgICAgbGU6ICdcXHUyMjY0Jyxcblx0ICAgIGdlOiAnXFx1MjI2NScsXG5cdCAgICBzdWI6ICdcXHUyMjgyJyxcblx0ICAgIHN1cDogJ1xcdTIyODMnLFxuXHQgICAgbnN1YjogJ1xcdTIyODQnLFxuXHQgICAgc3ViZTogJ1xcdTIyODYnLFxuXHQgICAgc3VwZTogJ1xcdTIyODcnLFxuXHQgICAgb3BsdXM6ICdcXHUyMjk1Jyxcblx0ICAgIG90aW1lczogJ1xcdTIyOTcnLFxuXHQgICAgcGVycDogJ1xcdTIyQTUnLFxuXHQgICAgc2RvdDogJ1xcdTIyQzUnLFxuXHQgICAgbGNlaWw6ICdcXHUyMzA4Jyxcblx0ICAgIHJjZWlsOiAnXFx1MjMwOScsXG5cdCAgICBsZmxvb3I6ICdcXHUyMzBBJyxcblx0ICAgIHJmbG9vcjogJ1xcdTIzMEInLFxuXHQgICAgbG96OiAnXFx1MjVDQScsXG5cdCAgICBzcGFkZXM6ICdcXHUyNjYwJyxcblx0ICAgIGNsdWJzOiAnXFx1MjY2MycsXG5cdCAgICBoZWFydHM6ICdcXHUyNjY1Jyxcblx0ICAgIGRpYW1zOiAnXFx1MjY2NicsXG5cdCAgICBsYW5nOiAnXFx1MjdFOCcsXG5cdCAgICByYW5nOiAnXFx1MjdFOSdcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMTUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdHZhciBlcnJvcl9oYW5kbGVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcblx0dmFyIHNjYW5uZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuXHR2YXIgdG9rZW5fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHR2YXIgUmVhZGVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFJlYWRlcigpIHtcblx0ICAgICAgICB0aGlzLnZhbHVlcyA9IFtdO1xuXHQgICAgICAgIHRoaXMuY3VybHkgPSB0aGlzLnBhcmVuID0gLTE7XG5cdCAgICB9XG5cdCAgICAvLyBBIGZ1bmN0aW9uIGZvbGxvd2luZyBvbmUgb2YgdGhvc2UgdG9rZW5zIGlzIGFuIGV4cHJlc3Npb24uXG5cdCAgICBSZWFkZXIucHJvdG90eXBlLmJlZm9yZUZ1bmN0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh0KSB7XG5cdCAgICAgICAgcmV0dXJuIFsnKCcsICd7JywgJ1snLCAnaW4nLCAndHlwZW9mJywgJ2luc3RhbmNlb2YnLCAnbmV3Jyxcblx0ICAgICAgICAgICAgJ3JldHVybicsICdjYXNlJywgJ2RlbGV0ZScsICd0aHJvdycsICd2b2lkJyxcblx0ICAgICAgICAgICAgLy8gYXNzaWdubWVudCBvcGVyYXRvcnNcblx0ICAgICAgICAgICAgJz0nLCAnKz0nLCAnLT0nLCAnKj0nLCAnKio9JywgJy89JywgJyU9JywgJzw8PScsICc+Pj0nLCAnPj4+PScsXG5cdCAgICAgICAgICAgICcmPScsICd8PScsICdePScsICcsJyxcblx0ICAgICAgICAgICAgLy8gYmluYXJ5L3VuYXJ5IG9wZXJhdG9yc1xuXHQgICAgICAgICAgICAnKycsICctJywgJyonLCAnKionLCAnLycsICclJywgJysrJywgJy0tJywgJzw8JywgJz4+JywgJz4+PicsICcmJyxcblx0ICAgICAgICAgICAgJ3wnLCAnXicsICchJywgJ34nLCAnJiYnLCAnfHwnLCAnPycsICc6JywgJz09PScsICc9PScsICc+PScsXG5cdCAgICAgICAgICAgICc8PScsICc8JywgJz4nLCAnIT0nLCAnIT09J10uaW5kZXhPZih0KSA+PSAwO1xuXHQgICAgfTtcblx0ICAgIC8vIERldGVybWluZSBpZiBmb3J3YXJkIHNsYXNoICgvKSBpcyBhbiBvcGVyYXRvciBvciBwYXJ0IG9mIGEgcmVndWxhciBleHByZXNzaW9uXG5cdCAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zd2VldC5qcy93aWtpL2Rlc2lnblxuXHQgICAgUmVhZGVyLnByb3RvdHlwZS5pc1JlZ2V4U3RhcnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzID0gdGhpcy52YWx1ZXNbdGhpcy52YWx1ZXMubGVuZ3RoIC0gMV07XG5cdCAgICAgICAgdmFyIHJlZ2V4ID0gKHByZXZpb3VzICE9PSBudWxsKTtcblx0ICAgICAgICBzd2l0Y2ggKHByZXZpb3VzKSB7XG5cdCAgICAgICAgICAgIGNhc2UgJ3RoaXMnOlxuXHQgICAgICAgICAgICBjYXNlICddJzpcblx0ICAgICAgICAgICAgICAgIHJlZ2V4ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAnKSc6XG5cdCAgICAgICAgICAgICAgICB2YXIga2V5d29yZCA9IHRoaXMudmFsdWVzW3RoaXMucGFyZW4gLSAxXTtcblx0ICAgICAgICAgICAgICAgIHJlZ2V4ID0gKGtleXdvcmQgPT09ICdpZicgfHwga2V5d29yZCA9PT0gJ3doaWxlJyB8fCBrZXl3b3JkID09PSAnZm9yJyB8fCBrZXl3b3JkID09PSAnd2l0aCcpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgJ30nOlxuXHQgICAgICAgICAgICAgICAgLy8gRGl2aWRpbmcgYSBmdW5jdGlvbiBieSBhbnl0aGluZyBtYWtlcyBsaXR0bGUgc2Vuc2UsXG5cdCAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSB0byBjaGVjayBmb3IgdGhhdC5cblx0ICAgICAgICAgICAgICAgIHJlZ2V4ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZXNbdGhpcy5jdXJseSAtIDNdID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gQW5vbnltb3VzIGZ1bmN0aW9uLCBlLmcuIGZ1bmN0aW9uKCl7fSAvNDJcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2sgPSB0aGlzLnZhbHVlc1t0aGlzLmN1cmx5IC0gNF07XG5cdCAgICAgICAgICAgICAgICAgICAgcmVnZXggPSBjaGVjayA/ICF0aGlzLmJlZm9yZUZ1bmN0aW9uRXhwcmVzc2lvbihjaGVjaykgOiBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFsdWVzW3RoaXMuY3VybHkgLSA0XSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIE5hbWVkIGZ1bmN0aW9uLCBlLmcuIGZ1bmN0aW9uIGYoKXt9IC80Mi9cblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2sgPSB0aGlzLnZhbHVlc1t0aGlzLmN1cmx5IC0gNV07XG5cdCAgICAgICAgICAgICAgICAgICAgcmVnZXggPSBjaGVjayA/ICF0aGlzLmJlZm9yZUZ1bmN0aW9uRXhwcmVzc2lvbihjaGVjaykgOiB0cnVlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlZ2V4O1xuXHQgICAgfTtcblx0ICAgIFJlYWRlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8gfHwgdG9rZW4udHlwZSA9PT0gNCAvKiBLZXl3b3JkICovKSB7XG5cdCAgICAgICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmN1cmx5ID0gdGhpcy52YWx1ZXMubGVuZ3RoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnKCcpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMucGFyZW4gPSB0aGlzLnZhbHVlcy5sZW5ndGg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy52YWx1ZXMucHVzaCh0b2tlbi52YWx1ZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLnZhbHVlcy5wdXNoKG51bGwpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICByZXR1cm4gUmVhZGVyO1xuXHR9KCkpO1xuXHR2YXIgVG9rZW5pemVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRva2VuaXplcihjb2RlLCBjb25maWcpIHtcblx0ICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IG5ldyBlcnJvcl9oYW5kbGVyXzEuRXJyb3JIYW5kbGVyKCk7XG5cdCAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIudG9sZXJhbnQgPSBjb25maWcgPyAodHlwZW9mIGNvbmZpZy50b2xlcmFudCA9PT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy50b2xlcmFudCkgOiBmYWxzZTtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIgPSBuZXcgc2Nhbm5lcl8xLlNjYW5uZXIoY29kZSwgdGhpcy5lcnJvckhhbmRsZXIpO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci50cmFja0NvbW1lbnQgPSBjb25maWcgPyAodHlwZW9mIGNvbmZpZy5jb21tZW50ID09PSAnYm9vbGVhbicgJiYgY29uZmlnLmNvbW1lbnQpIDogZmFsc2U7XG5cdCAgICAgICAgdGhpcy50cmFja1JhbmdlID0gY29uZmlnID8gKHR5cGVvZiBjb25maWcucmFuZ2UgPT09ICdib29sZWFuJyAmJiBjb25maWcucmFuZ2UpIDogZmFsc2U7XG5cdCAgICAgICAgdGhpcy50cmFja0xvYyA9IGNvbmZpZyA/ICh0eXBlb2YgY29uZmlnLmxvYyA9PT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5sb2MpIDogZmFsc2U7XG5cdCAgICAgICAgdGhpcy5idWZmZXIgPSBbXTtcblx0ICAgICAgICB0aGlzLnJlYWRlciA9IG5ldyBSZWFkZXIoKTtcblx0ICAgIH1cblx0ICAgIFRva2VuaXplci5wcm90b3R5cGUuZXJyb3JzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5lcnJvcnM7XG5cdCAgICB9O1xuXHQgICAgVG9rZW5pemVyLnByb3RvdHlwZS5nZXROZXh0VG9rZW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgICAgICB2YXIgY29tbWVudHMgPSB0aGlzLnNjYW5uZXIuc2NhbkNvbW1lbnRzKCk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBjb21tZW50c1tpXTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnNjYW5uZXIuc291cmNlLnNsaWNlKGUuc2xpY2VbMF0sIGUuc2xpY2VbMV0pO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBlLm11bHRpTGluZSA/ICdCbG9ja0NvbW1lbnQnIDogJ0xpbmVDb21tZW50Jyxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja1JhbmdlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQucmFuZ2UgPSBlLnJhbmdlO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0xvYykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LmxvYyA9IGUubG9jO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKGNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5zY2FubmVyLmVvZigpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbG9jID0gdm9pZCAwO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tMb2MpIHtcblx0ICAgICAgICAgICAgICAgICAgICBsb2MgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHt9XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHZhciBzdGFydFJlZ2V4ID0gKHRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4XSA9PT0gJy8nKSAmJiB0aGlzLnJlYWRlci5pc1JlZ2V4U3RhcnQoKTtcblx0ICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHN0YXJ0UmVnZXggPyB0aGlzLnNjYW5uZXIuc2NhblJlZ0V4cCgpIDogdGhpcy5zY2FubmVyLmxleCgpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5yZWFkZXIucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogdG9rZW5fMS5Ub2tlbk5hbWVbdG9rZW4udHlwZV0sXG5cdCAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Nhbm5lci5zb3VyY2Uuc2xpY2UodG9rZW4uc3RhcnQsIHRva2VuLmVuZClcblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja1JhbmdlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZW50cnkucmFuZ2UgPSBbdG9rZW4uc3RhcnQsIHRva2VuLmVuZF07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0xvYykge1xuXHQgICAgICAgICAgICAgICAgICAgIGxvYy5lbmQgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnRcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIGVudHJ5LmxvYyA9IGxvYztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA5IC8qIFJlZ3VsYXJFeHByZXNzaW9uICovKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSB0b2tlbi5wYXR0ZXJuO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBmbGFncyA9IHRva2VuLmZsYWdzO1xuXHQgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlZ2V4ID0geyBwYXR0ZXJuOiBwYXR0ZXJuLCBmbGFnczogZmxhZ3MgfTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2goZW50cnkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zaGlmdCgpO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb2tlbml6ZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuVG9rZW5pemVyID0gVG9rZW5pemVyO1xuXG5cbi8qKiovIH1cbi8qKioqKiovIF0pXG59KTtcbjsiLCIvKlxuICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMiBBcml5YSBIaWRheWF0IDxhcml5YS5oaWRheWF0QGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuLypqc2xpbnQgdmFyczpmYWxzZSwgYml0d2lzZTp0cnVlKi9cbi8qanNoaW50IGluZGVudDo0Ki9cbi8qZ2xvYmFsIGV4cG9ydHM6dHJ1ZSovXG4oZnVuY3Rpb24gY2xvbmUoZXhwb3J0cykge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBTeW50YXgsXG4gICAgICAgIFZpc2l0b3JPcHRpb24sXG4gICAgICAgIFZpc2l0b3JLZXlzLFxuICAgICAgICBCUkVBSyxcbiAgICAgICAgU0tJUCxcbiAgICAgICAgUkVNT1ZFO1xuXG4gICAgZnVuY3Rpb24gZGVlcENvcHkob2JqKSB7XG4gICAgICAgIHZhciByZXQgPSB7fSwga2V5LCB2YWw7XG4gICAgICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgdmFsID0gb2JqW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXRba2V5XSA9IGRlZXBDb3B5KHZhbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLy8gYmFzZWQgb24gTExWTSBsaWJjKysgdXBwZXJfYm91bmQgLyBsb3dlcl9ib3VuZFxuICAgIC8vIE1JVCBMaWNlbnNlXG5cbiAgICBmdW5jdGlvbiB1cHBlckJvdW5kKGFycmF5LCBmdW5jKSB7XG4gICAgICAgIHZhciBkaWZmLCBsZW4sIGksIGN1cnJlbnQ7XG5cbiAgICAgICAgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgICAgICBpID0gMDtcblxuICAgICAgICB3aGlsZSAobGVuKSB7XG4gICAgICAgICAgICBkaWZmID0gbGVuID4+PiAxO1xuICAgICAgICAgICAgY3VycmVudCA9IGkgKyBkaWZmO1xuICAgICAgICAgICAgaWYgKGZ1bmMoYXJyYXlbY3VycmVudF0pKSB7XG4gICAgICAgICAgICAgICAgbGVuID0gZGlmZjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSA9IGN1cnJlbnQgKyAxO1xuICAgICAgICAgICAgICAgIGxlbiAtPSBkaWZmICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBTeW50YXggPSB7XG4gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uOiAnQXNzaWdubWVudEV4cHJlc3Npb24nLFxuICAgICAgICBBc3NpZ25tZW50UGF0dGVybjogJ0Fzc2lnbm1lbnRQYXR0ZXJuJyxcbiAgICAgICAgQXJyYXlFeHByZXNzaW9uOiAnQXJyYXlFeHByZXNzaW9uJyxcbiAgICAgICAgQXJyYXlQYXR0ZXJuOiAnQXJyYXlQYXR0ZXJuJyxcbiAgICAgICAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246ICdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbicsXG4gICAgICAgIEF3YWl0RXhwcmVzc2lvbjogJ0F3YWl0RXhwcmVzc2lvbicsIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBCbG9ja1N0YXRlbWVudDogJ0Jsb2NrU3RhdGVtZW50JyxcbiAgICAgICAgQmluYXJ5RXhwcmVzc2lvbjogJ0JpbmFyeUV4cHJlc3Npb24nLFxuICAgICAgICBCcmVha1N0YXRlbWVudDogJ0JyZWFrU3RhdGVtZW50JyxcbiAgICAgICAgQ2FsbEV4cHJlc3Npb246ICdDYWxsRXhwcmVzc2lvbicsXG4gICAgICAgIENhdGNoQ2xhdXNlOiAnQ2F0Y2hDbGF1c2UnLFxuICAgICAgICBDaGFpbkV4cHJlc3Npb246ICdDaGFpbkV4cHJlc3Npb24nLFxuICAgICAgICBDbGFzc0JvZHk6ICdDbGFzc0JvZHknLFxuICAgICAgICBDbGFzc0RlY2xhcmF0aW9uOiAnQ2xhc3NEZWNsYXJhdGlvbicsXG4gICAgICAgIENsYXNzRXhwcmVzc2lvbjogJ0NsYXNzRXhwcmVzc2lvbicsXG4gICAgICAgIENvbXByZWhlbnNpb25CbG9jazogJ0NvbXByZWhlbnNpb25CbG9jaycsICAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgQ29tcHJlaGVuc2lvbkV4cHJlc3Npb246ICdDb21wcmVoZW5zaW9uRXhwcmVzc2lvbicsICAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uOiAnQ29uZGl0aW9uYWxFeHByZXNzaW9uJyxcbiAgICAgICAgQ29udGludWVTdGF0ZW1lbnQ6ICdDb250aW51ZVN0YXRlbWVudCcsXG4gICAgICAgIERlYnVnZ2VyU3RhdGVtZW50OiAnRGVidWdnZXJTdGF0ZW1lbnQnLFxuICAgICAgICBEaXJlY3RpdmVTdGF0ZW1lbnQ6ICdEaXJlY3RpdmVTdGF0ZW1lbnQnLFxuICAgICAgICBEb1doaWxlU3RhdGVtZW50OiAnRG9XaGlsZVN0YXRlbWVudCcsXG4gICAgICAgIEVtcHR5U3RhdGVtZW50OiAnRW1wdHlTdGF0ZW1lbnQnLFxuICAgICAgICBFeHBvcnRBbGxEZWNsYXJhdGlvbjogJ0V4cG9ydEFsbERlY2xhcmF0aW9uJyxcbiAgICAgICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uOiAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJyxcbiAgICAgICAgRXhwb3J0TmFtZWREZWNsYXJhdGlvbjogJ0V4cG9ydE5hbWVkRGVjbGFyYXRpb24nLFxuICAgICAgICBFeHBvcnRTcGVjaWZpZXI6ICdFeHBvcnRTcGVjaWZpZXInLFxuICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50OiAnRXhwcmVzc2lvblN0YXRlbWVudCcsXG4gICAgICAgIEZvclN0YXRlbWVudDogJ0ZvclN0YXRlbWVudCcsXG4gICAgICAgIEZvckluU3RhdGVtZW50OiAnRm9ySW5TdGF0ZW1lbnQnLFxuICAgICAgICBGb3JPZlN0YXRlbWVudDogJ0Zvck9mU3RhdGVtZW50JyxcbiAgICAgICAgRnVuY3Rpb25EZWNsYXJhdGlvbjogJ0Z1bmN0aW9uRGVjbGFyYXRpb24nLFxuICAgICAgICBGdW5jdGlvbkV4cHJlc3Npb246ICdGdW5jdGlvbkV4cHJlc3Npb24nLFxuICAgICAgICBHZW5lcmF0b3JFeHByZXNzaW9uOiAnR2VuZXJhdG9yRXhwcmVzc2lvbicsICAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgSWRlbnRpZmllcjogJ0lkZW50aWZpZXInLFxuICAgICAgICBJZlN0YXRlbWVudDogJ0lmU3RhdGVtZW50JyxcbiAgICAgICAgSW1wb3J0RXhwcmVzc2lvbjogJ0ltcG9ydEV4cHJlc3Npb24nLFxuICAgICAgICBJbXBvcnREZWNsYXJhdGlvbjogJ0ltcG9ydERlY2xhcmF0aW9uJyxcbiAgICAgICAgSW1wb3J0RGVmYXVsdFNwZWNpZmllcjogJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInLFxuICAgICAgICBJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXI6ICdJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXInLFxuICAgICAgICBJbXBvcnRTcGVjaWZpZXI6ICdJbXBvcnRTcGVjaWZpZXInLFxuICAgICAgICBMaXRlcmFsOiAnTGl0ZXJhbCcsXG4gICAgICAgIExhYmVsZWRTdGF0ZW1lbnQ6ICdMYWJlbGVkU3RhdGVtZW50JyxcbiAgICAgICAgTG9naWNhbEV4cHJlc3Npb246ICdMb2dpY2FsRXhwcmVzc2lvbicsXG4gICAgICAgIE1lbWJlckV4cHJlc3Npb246ICdNZW1iZXJFeHByZXNzaW9uJyxcbiAgICAgICAgTWV0YVByb3BlcnR5OiAnTWV0YVByb3BlcnR5JyxcbiAgICAgICAgTWV0aG9kRGVmaW5pdGlvbjogJ01ldGhvZERlZmluaXRpb24nLFxuICAgICAgICBNb2R1bGVTcGVjaWZpZXI6ICdNb2R1bGVTcGVjaWZpZXInLFxuICAgICAgICBOZXdFeHByZXNzaW9uOiAnTmV3RXhwcmVzc2lvbicsXG4gICAgICAgIE9iamVjdEV4cHJlc3Npb246ICdPYmplY3RFeHByZXNzaW9uJyxcbiAgICAgICAgT2JqZWN0UGF0dGVybjogJ09iamVjdFBhdHRlcm4nLFxuICAgICAgICBQcml2YXRlSWRlbnRpZmllcjogJ1ByaXZhdGVJZGVudGlmaWVyJyxcbiAgICAgICAgUHJvZ3JhbTogJ1Byb2dyYW0nLFxuICAgICAgICBQcm9wZXJ0eTogJ1Byb3BlcnR5JyxcbiAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uOiAnUHJvcGVydHlEZWZpbml0aW9uJyxcbiAgICAgICAgUmVzdEVsZW1lbnQ6ICdSZXN0RWxlbWVudCcsXG4gICAgICAgIFJldHVyblN0YXRlbWVudDogJ1JldHVyblN0YXRlbWVudCcsXG4gICAgICAgIFNlcXVlbmNlRXhwcmVzc2lvbjogJ1NlcXVlbmNlRXhwcmVzc2lvbicsXG4gICAgICAgIFNwcmVhZEVsZW1lbnQ6ICdTcHJlYWRFbGVtZW50JyxcbiAgICAgICAgU3VwZXI6ICdTdXBlcicsXG4gICAgICAgIFN3aXRjaFN0YXRlbWVudDogJ1N3aXRjaFN0YXRlbWVudCcsXG4gICAgICAgIFN3aXRjaENhc2U6ICdTd2l0Y2hDYXNlJyxcbiAgICAgICAgVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uOiAnVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uJyxcbiAgICAgICAgVGVtcGxhdGVFbGVtZW50OiAnVGVtcGxhdGVFbGVtZW50JyxcbiAgICAgICAgVGVtcGxhdGVMaXRlcmFsOiAnVGVtcGxhdGVMaXRlcmFsJyxcbiAgICAgICAgVGhpc0V4cHJlc3Npb246ICdUaGlzRXhwcmVzc2lvbicsXG4gICAgICAgIFRocm93U3RhdGVtZW50OiAnVGhyb3dTdGF0ZW1lbnQnLFxuICAgICAgICBUcnlTdGF0ZW1lbnQ6ICdUcnlTdGF0ZW1lbnQnLFxuICAgICAgICBVbmFyeUV4cHJlc3Npb246ICdVbmFyeUV4cHJlc3Npb24nLFxuICAgICAgICBVcGRhdGVFeHByZXNzaW9uOiAnVXBkYXRlRXhwcmVzc2lvbicsXG4gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb246ICdWYXJpYWJsZURlY2xhcmF0aW9uJyxcbiAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yOiAnVmFyaWFibGVEZWNsYXJhdG9yJyxcbiAgICAgICAgV2hpbGVTdGF0ZW1lbnQ6ICdXaGlsZVN0YXRlbWVudCcsXG4gICAgICAgIFdpdGhTdGF0ZW1lbnQ6ICdXaXRoU3RhdGVtZW50JyxcbiAgICAgICAgWWllbGRFeHByZXNzaW9uOiAnWWllbGRFeHByZXNzaW9uJ1xuICAgIH07XG5cbiAgICBWaXNpdG9yS2V5cyA9IHtcbiAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb246IFsnbGVmdCcsICdyaWdodCddLFxuICAgICAgICBBc3NpZ25tZW50UGF0dGVybjogWydsZWZ0JywgJ3JpZ2h0J10sXG4gICAgICAgIEFycmF5RXhwcmVzc2lvbjogWydlbGVtZW50cyddLFxuICAgICAgICBBcnJheVBhdHRlcm46IFsnZWxlbWVudHMnXSxcbiAgICAgICAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246IFsncGFyYW1zJywgJ2JvZHknXSxcbiAgICAgICAgQXdhaXRFeHByZXNzaW9uOiBbJ2FyZ3VtZW50J10sIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBCbG9ja1N0YXRlbWVudDogWydib2R5J10sXG4gICAgICAgIEJpbmFyeUV4cHJlc3Npb246IFsnbGVmdCcsICdyaWdodCddLFxuICAgICAgICBCcmVha1N0YXRlbWVudDogWydsYWJlbCddLFxuICAgICAgICBDYWxsRXhwcmVzc2lvbjogWydjYWxsZWUnLCAnYXJndW1lbnRzJ10sXG4gICAgICAgIENhdGNoQ2xhdXNlOiBbJ3BhcmFtJywgJ2JvZHknXSxcbiAgICAgICAgQ2hhaW5FeHByZXNzaW9uOiBbJ2V4cHJlc3Npb24nXSxcbiAgICAgICAgQ2xhc3NCb2R5OiBbJ2JvZHknXSxcbiAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbjogWydpZCcsICdzdXBlckNsYXNzJywgJ2JvZHknXSxcbiAgICAgICAgQ2xhc3NFeHByZXNzaW9uOiBbJ2lkJywgJ3N1cGVyQ2xhc3MnLCAnYm9keSddLFxuICAgICAgICBDb21wcmVoZW5zaW9uQmxvY2s6IFsnbGVmdCcsICdyaWdodCddLCAgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIENvbXByZWhlbnNpb25FeHByZXNzaW9uOiBbJ2Jsb2NrcycsICdmaWx0ZXInLCAnYm9keSddLCAgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbjogWyd0ZXN0JywgJ2NvbnNlcXVlbnQnLCAnYWx0ZXJuYXRlJ10sXG4gICAgICAgIENvbnRpbnVlU3RhdGVtZW50OiBbJ2xhYmVsJ10sXG4gICAgICAgIERlYnVnZ2VyU3RhdGVtZW50OiBbXSxcbiAgICAgICAgRGlyZWN0aXZlU3RhdGVtZW50OiBbXSxcbiAgICAgICAgRG9XaGlsZVN0YXRlbWVudDogWydib2R5JywgJ3Rlc3QnXSxcbiAgICAgICAgRW1wdHlTdGF0ZW1lbnQ6IFtdLFxuICAgICAgICBFeHBvcnRBbGxEZWNsYXJhdGlvbjogWydzb3VyY2UnXSxcbiAgICAgICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uOiBbJ2RlY2xhcmF0aW9uJ10sXG4gICAgICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb246IFsnZGVjbGFyYXRpb24nLCAnc3BlY2lmaWVycycsICdzb3VyY2UnXSxcbiAgICAgICAgRXhwb3J0U3BlY2lmaWVyOiBbJ2V4cG9ydGVkJywgJ2xvY2FsJ10sXG4gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQ6IFsnZXhwcmVzc2lvbiddLFxuICAgICAgICBGb3JTdGF0ZW1lbnQ6IFsnaW5pdCcsICd0ZXN0JywgJ3VwZGF0ZScsICdib2R5J10sXG4gICAgICAgIEZvckluU3RhdGVtZW50OiBbJ2xlZnQnLCAncmlnaHQnLCAnYm9keSddLFxuICAgICAgICBGb3JPZlN0YXRlbWVudDogWydsZWZ0JywgJ3JpZ2h0JywgJ2JvZHknXSxcbiAgICAgICAgRnVuY3Rpb25EZWNsYXJhdGlvbjogWydpZCcsICdwYXJhbXMnLCAnYm9keSddLFxuICAgICAgICBGdW5jdGlvbkV4cHJlc3Npb246IFsnaWQnLCAncGFyYW1zJywgJ2JvZHknXSxcbiAgICAgICAgR2VuZXJhdG9yRXhwcmVzc2lvbjogWydibG9ja3MnLCAnZmlsdGVyJywgJ2JvZHknXSwgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBJZGVudGlmaWVyOiBbXSxcbiAgICAgICAgSWZTdGF0ZW1lbnQ6IFsndGVzdCcsICdjb25zZXF1ZW50JywgJ2FsdGVybmF0ZSddLFxuICAgICAgICBJbXBvcnRFeHByZXNzaW9uOiBbJ3NvdXJjZSddLFxuICAgICAgICBJbXBvcnREZWNsYXJhdGlvbjogWydzcGVjaWZpZXJzJywgJ3NvdXJjZSddLFxuICAgICAgICBJbXBvcnREZWZhdWx0U3BlY2lmaWVyOiBbJ2xvY2FsJ10sXG4gICAgICAgIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogWydsb2NhbCddLFxuICAgICAgICBJbXBvcnRTcGVjaWZpZXI6IFsnaW1wb3J0ZWQnLCAnbG9jYWwnXSxcbiAgICAgICAgTGl0ZXJhbDogW10sXG4gICAgICAgIExhYmVsZWRTdGF0ZW1lbnQ6IFsnbGFiZWwnLCAnYm9keSddLFxuICAgICAgICBMb2dpY2FsRXhwcmVzc2lvbjogWydsZWZ0JywgJ3JpZ2h0J10sXG4gICAgICAgIE1lbWJlckV4cHJlc3Npb246IFsnb2JqZWN0JywgJ3Byb3BlcnR5J10sXG4gICAgICAgIE1ldGFQcm9wZXJ0eTogWydtZXRhJywgJ3Byb3BlcnR5J10sXG4gICAgICAgIE1ldGhvZERlZmluaXRpb246IFsna2V5JywgJ3ZhbHVlJ10sXG4gICAgICAgIE1vZHVsZVNwZWNpZmllcjogW10sXG4gICAgICAgIE5ld0V4cHJlc3Npb246IFsnY2FsbGVlJywgJ2FyZ3VtZW50cyddLFxuICAgICAgICBPYmplY3RFeHByZXNzaW9uOiBbJ3Byb3BlcnRpZXMnXSxcbiAgICAgICAgT2JqZWN0UGF0dGVybjogWydwcm9wZXJ0aWVzJ10sXG4gICAgICAgIFByaXZhdGVJZGVudGlmaWVyOiBbXSxcbiAgICAgICAgUHJvZ3JhbTogWydib2R5J10sXG4gICAgICAgIFByb3BlcnR5OiBbJ2tleScsICd2YWx1ZSddLFxuICAgICAgICBQcm9wZXJ0eURlZmluaXRpb246IFsna2V5JywgJ3ZhbHVlJ10sXG4gICAgICAgIFJlc3RFbGVtZW50OiBbICdhcmd1bWVudCcgXSxcbiAgICAgICAgUmV0dXJuU3RhdGVtZW50OiBbJ2FyZ3VtZW50J10sXG4gICAgICAgIFNlcXVlbmNlRXhwcmVzc2lvbjogWydleHByZXNzaW9ucyddLFxuICAgICAgICBTcHJlYWRFbGVtZW50OiBbJ2FyZ3VtZW50J10sXG4gICAgICAgIFN1cGVyOiBbXSxcbiAgICAgICAgU3dpdGNoU3RhdGVtZW50OiBbJ2Rpc2NyaW1pbmFudCcsICdjYXNlcyddLFxuICAgICAgICBTd2l0Y2hDYXNlOiBbJ3Rlc3QnLCAnY29uc2VxdWVudCddLFxuICAgICAgICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246IFsndGFnJywgJ3F1YXNpJ10sXG4gICAgICAgIFRlbXBsYXRlRWxlbWVudDogW10sXG4gICAgICAgIFRlbXBsYXRlTGl0ZXJhbDogWydxdWFzaXMnLCAnZXhwcmVzc2lvbnMnXSxcbiAgICAgICAgVGhpc0V4cHJlc3Npb246IFtdLFxuICAgICAgICBUaHJvd1N0YXRlbWVudDogWydhcmd1bWVudCddLFxuICAgICAgICBUcnlTdGF0ZW1lbnQ6IFsnYmxvY2snLCAnaGFuZGxlcicsICdmaW5hbGl6ZXInXSxcbiAgICAgICAgVW5hcnlFeHByZXNzaW9uOiBbJ2FyZ3VtZW50J10sXG4gICAgICAgIFVwZGF0ZUV4cHJlc3Npb246IFsnYXJndW1lbnQnXSxcbiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbjogWydkZWNsYXJhdGlvbnMnXSxcbiAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yOiBbJ2lkJywgJ2luaXQnXSxcbiAgICAgICAgV2hpbGVTdGF0ZW1lbnQ6IFsndGVzdCcsICdib2R5J10sXG4gICAgICAgIFdpdGhTdGF0ZW1lbnQ6IFsnb2JqZWN0JywgJ2JvZHknXSxcbiAgICAgICAgWWllbGRFeHByZXNzaW9uOiBbJ2FyZ3VtZW50J11cbiAgICB9O1xuXG4gICAgLy8gdW5pcXVlIGlkXG4gICAgQlJFQUsgPSB7fTtcbiAgICBTS0lQID0ge307XG4gICAgUkVNT1ZFID0ge307XG5cbiAgICBWaXNpdG9yT3B0aW9uID0ge1xuICAgICAgICBCcmVhazogQlJFQUssXG4gICAgICAgIFNraXA6IFNLSVAsXG4gICAgICAgIFJlbW92ZTogUkVNT1ZFXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFJlZmVyZW5jZShwYXJlbnQsIGtleSkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgfVxuXG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShub2RlKSB7XG4gICAgICAgIHRoaXMucGFyZW50W3RoaXMua2V5XSA9IG5vZGU7XG4gICAgfTtcblxuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnBhcmVudCkpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnNwbGljZSh0aGlzLmtleSwgMSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZShudWxsKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBFbGVtZW50KG5vZGUsIHBhdGgsIHdyYXAsIHJlZikge1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLndyYXAgPSB3cmFwO1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCkgeyB9XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gcmV0dXJuIHByb3BlcnR5IHBhdGggYXJyYXkgZnJvbSByb290IHRvIGN1cnJlbnQgbm9kZVxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnBhdGggPSBmdW5jdGlvbiBwYXRoKCkge1xuICAgICAgICB2YXIgaSwgaXosIGosIGp6LCByZXN1bHQsIGVsZW1lbnQ7XG5cbiAgICAgICAgZnVuY3Rpb24gYWRkVG9QYXRoKHJlc3VsdCwgcGF0aCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwLCBqeiA9IHBhdGgubGVuZ3RoOyBqIDwgano7ICsraikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwYXRoW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcm9vdCBub2RlXG4gICAgICAgIGlmICghdGhpcy5fX2N1cnJlbnQucGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXJzdCBub2RlIGlzIHNlbnRpbmVsLCBzZWNvbmQgbm9kZSBpcyByb290IGVsZW1lbnRcbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDIsIGl6ID0gdGhpcy5fX2xlYXZlbGlzdC5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5fX2xlYXZlbGlzdFtpXTtcbiAgICAgICAgICAgIGFkZFRvUGF0aChyZXN1bHQsIGVsZW1lbnQucGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkVG9QYXRoKHJlc3VsdCwgdGhpcy5fX2N1cnJlbnQucGF0aCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8vIEFQSTpcbiAgICAvLyByZXR1cm4gdHlwZSBvZiBjdXJyZW50IG5vZGVcbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS50eXBlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3VycmVudCgpO1xuICAgICAgICByZXR1cm4gbm9kZS50eXBlIHx8IHRoaXMuX19jdXJyZW50LndyYXA7XG4gICAgfTtcblxuICAgIC8vIEFQSTpcbiAgICAvLyByZXR1cm4gYXJyYXkgb2YgcGFyZW50IGVsZW1lbnRzXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUucGFyZW50cyA9IGZ1bmN0aW9uIHBhcmVudHMoKSB7XG4gICAgICAgIHZhciBpLCBpeiwgcmVzdWx0O1xuXG4gICAgICAgIC8vIGZpcnN0IG5vZGUgaXMgc2VudGluZWxcbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDEsIGl6ID0gdGhpcy5fX2xlYXZlbGlzdC5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLl9fbGVhdmVsaXN0W2ldLm5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHJldHVybiBjdXJyZW50IG5vZGVcbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5jdXJyZW50ID0gZnVuY3Rpb24gY3VycmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19jdXJyZW50Lm5vZGU7XG4gICAgfTtcblxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLl9fZXhlY3V0ZSA9IGZ1bmN0aW9uIF9fZXhlY3V0ZShjYWxsYmFjaywgZWxlbWVudCkge1xuICAgICAgICB2YXIgcHJldmlvdXMsIHJlc3VsdDtcblxuICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgcHJldmlvdXMgID0gdGhpcy5fX2N1cnJlbnQ7XG4gICAgICAgIHRoaXMuX19jdXJyZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5fX3N0YXRlID0gbnVsbDtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBjYWxsYmFjay5jYWxsKHRoaXMsIGVsZW1lbnQubm9kZSwgdGhpcy5fX2xlYXZlbGlzdFt0aGlzLl9fbGVhdmVsaXN0Lmxlbmd0aCAtIDFdLm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19jdXJyZW50ID0gcHJldmlvdXM7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIG5vdGlmeSBjb250cm9sIHNraXAgLyBicmVha1xuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLm5vdGlmeSA9IGZ1bmN0aW9uIG5vdGlmeShmbGFnKSB7XG4gICAgICAgIHRoaXMuX19zdGF0ZSA9IGZsYWc7XG4gICAgfTtcblxuICAgIC8vIEFQSTpcbiAgICAvLyBza2lwIGNoaWxkIG5vZGVzIG9mIGN1cnJlbnQgbm9kZVxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubm90aWZ5KFNLSVApO1xuICAgIH07XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gYnJlYWsgdHJhdmVyc2Fsc1xuICAgIENvbnRyb2xsZXIucHJvdG90eXBlWydicmVhayddID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm5vdGlmeShCUkVBSyk7XG4gICAgfTtcblxuICAgIC8vIEFQSTpcbiAgICAvLyByZW1vdmUgbm9kZVxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ub3RpZnkoUkVNT1ZFKTtcbiAgICB9O1xuXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUuX19pbml0aWFsaXplID0gZnVuY3Rpb24ocm9vdCwgdmlzaXRvcikge1xuICAgICAgICB0aGlzLnZpc2l0b3IgPSB2aXNpdG9yO1xuICAgICAgICB0aGlzLnJvb3QgPSByb290O1xuICAgICAgICB0aGlzLl9fd29ya2xpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5fX2xlYXZlbGlzdCA9IFtdO1xuICAgICAgICB0aGlzLl9fY3VycmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuX19zdGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX19mYWxsYmFjayA9IG51bGw7XG4gICAgICAgIGlmICh2aXNpdG9yLmZhbGxiYWNrID09PSAnaXRlcmF0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fX2ZhbGxiYWNrID0gT2JqZWN0LmtleXM7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZpc2l0b3IuZmFsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX19mYWxsYmFjayA9IHZpc2l0b3IuZmFsbGJhY2s7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9fa2V5cyA9IFZpc2l0b3JLZXlzO1xuICAgICAgICBpZiAodmlzaXRvci5rZXlzKSB7XG4gICAgICAgICAgICB0aGlzLl9fa2V5cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh0aGlzLl9fa2V5cyksIHZpc2l0b3Iua2V5cyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaXNOb2RlKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG5vZGUudHlwZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNQcm9wZXJ0eShub2RlVHlwZSwga2V5KSB7XG4gICAgICAgIHJldHVybiAobm9kZVR5cGUgPT09IFN5bnRheC5PYmplY3RFeHByZXNzaW9uIHx8IG5vZGVUeXBlID09PSBTeW50YXguT2JqZWN0UGF0dGVybikgJiYgJ3Byb3BlcnRpZXMnID09PSBrZXk7XG4gICAgfVxuICBcbiAgICBmdW5jdGlvbiBjYW5kaWRhdGVFeGlzdHNJbkxlYXZlTGlzdChsZWF2ZWxpc3QsIGNhbmRpZGF0ZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gbGVhdmVsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICBpZiAobGVhdmVsaXN0W2ldLm5vZGUgPT09IGNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS50cmF2ZXJzZSA9IGZ1bmN0aW9uIHRyYXZlcnNlKHJvb3QsIHZpc2l0b3IpIHtcbiAgICAgICAgdmFyIHdvcmtsaXN0LFxuICAgICAgICAgICAgbGVhdmVsaXN0LFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBub2RlVHlwZSxcbiAgICAgICAgICAgIHJldCxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICBjdXJyZW50MixcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMsXG4gICAgICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgICAgICBzZW50aW5lbDtcblxuICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZShyb290LCB2aXNpdG9yKTtcblxuICAgICAgICBzZW50aW5lbCA9IHt9O1xuXG4gICAgICAgIC8vIHJlZmVyZW5jZVxuICAgICAgICB3b3JrbGlzdCA9IHRoaXMuX193b3JrbGlzdDtcbiAgICAgICAgbGVhdmVsaXN0ID0gdGhpcy5fX2xlYXZlbGlzdDtcblxuICAgICAgICAvLyBpbml0aWFsaXplXG4gICAgICAgIHdvcmtsaXN0LnB1c2gobmV3IEVsZW1lbnQocm9vdCwgbnVsbCwgbnVsbCwgbnVsbCkpO1xuICAgICAgICBsZWF2ZWxpc3QucHVzaChuZXcgRWxlbWVudChudWxsLCBudWxsLCBudWxsLCBudWxsKSk7XG5cbiAgICAgICAgd2hpbGUgKHdvcmtsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHdvcmtsaXN0LnBvcCgpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gc2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gbGVhdmVsaXN0LnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5fX2V4ZWN1dGUodmlzaXRvci5sZWF2ZSwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBCUkVBSyB8fCByZXQgPT09IEJSRUFLKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGUpIHtcblxuICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuX19leGVjdXRlKHZpc2l0b3IuZW50ZXIsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gQlJFQUsgfHwgcmV0ID09PSBCUkVBSykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChzZW50aW5lbCk7XG4gICAgICAgICAgICAgICAgbGVhdmVsaXN0LnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBTS0lQIHx8IHJldCA9PT0gU0tJUCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBub2RlID0gZWxlbWVudC5ub2RlO1xuICAgICAgICAgICAgICAgIG5vZGVUeXBlID0gbm9kZS50eXBlIHx8IGVsZW1lbnQud3JhcDtcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gdGhpcy5fX2tleXNbbm9kZVR5cGVdO1xuICAgICAgICAgICAgICAgIGlmICghY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fX2ZhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gdGhpcy5fX2ZhbGxiYWNrKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG5vZGUgdHlwZSAnICsgbm9kZVR5cGUgKyAnLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGNhbmRpZGF0ZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHdoaWxlICgoY3VycmVudCAtPSAxKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGNhbmRpZGF0ZXNbY3VycmVudF07XG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IG5vZGVba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudDIgPSBjYW5kaWRhdGUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50MiAtPSAxKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGVbY3VycmVudDJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGVFeGlzdHNJbkxlYXZlTGlzdChsZWF2ZWxpc3QsIGNhbmRpZGF0ZVtjdXJyZW50Ml0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcm9wZXJ0eShub2RlVHlwZSwgY2FuZGlkYXRlc1tjdXJyZW50XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGNhbmRpZGF0ZVtjdXJyZW50Ml0sIFtrZXksIGN1cnJlbnQyXSwgJ1Byb3BlcnR5JywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc05vZGUoY2FuZGlkYXRlW2N1cnJlbnQyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGNhbmRpZGF0ZVtjdXJyZW50Ml0sIFtrZXksIGN1cnJlbnQyXSwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtsaXN0LnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGVFeGlzdHNJbkxlYXZlTGlzdChsZWF2ZWxpc3QsIGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtsaXN0LnB1c2gobmV3IEVsZW1lbnQoY2FuZGlkYXRlLCBrZXksIG51bGwsIG51bGwpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShyb290LCB2aXNpdG9yKSB7XG4gICAgICAgIHZhciB3b3JrbGlzdCxcbiAgICAgICAgICAgIGxlYXZlbGlzdCxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBub2RlVHlwZSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgY3VycmVudDIsXG4gICAgICAgICAgICBjYW5kaWRhdGVzLFxuICAgICAgICAgICAgY2FuZGlkYXRlLFxuICAgICAgICAgICAgc2VudGluZWwsXG4gICAgICAgICAgICBvdXRlcixcbiAgICAgICAgICAgIGtleTtcblxuICAgICAgICBmdW5jdGlvbiByZW1vdmVFbGVtKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBpLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBuZXh0RWxlbSxcbiAgICAgICAgICAgICAgICBwYXJlbnQ7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50LnJlZi5yZW1vdmUoKSkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHJlZmVyZW5jZSBpcyBhbiBlbGVtZW50IG9mIGFuIGFycmF5LlxuICAgICAgICAgICAgICAgIGtleSA9IGVsZW1lbnQucmVmLmtleTtcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBlbGVtZW50LnJlZi5wYXJlbnQ7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiByZW1vdmVkIGZyb20gYXJyYXksIHRoZW4gZGVjcmVhc2UgZm9sbG93aW5nIGl0ZW1zJyBrZXlzLlxuICAgICAgICAgICAgICAgIGkgPSB3b3JrbGlzdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbSA9IHdvcmtsaXN0W2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEVsZW0ucmVmICYmIG5leHRFbGVtLnJlZi5wYXJlbnQgPT09IHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgIChuZXh0RWxlbS5yZWYua2V5IDwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAtLW5leHRFbGVtLnJlZi5rZXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZShyb290LCB2aXNpdG9yKTtcblxuICAgICAgICBzZW50aW5lbCA9IHt9O1xuXG4gICAgICAgIC8vIHJlZmVyZW5jZVxuICAgICAgICB3b3JrbGlzdCA9IHRoaXMuX193b3JrbGlzdDtcbiAgICAgICAgbGVhdmVsaXN0ID0gdGhpcy5fX2xlYXZlbGlzdDtcblxuICAgICAgICAvLyBpbml0aWFsaXplXG4gICAgICAgIG91dGVyID0ge1xuICAgICAgICAgICAgcm9vdDogcm9vdFxuICAgICAgICB9O1xuICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQocm9vdCwgbnVsbCwgbnVsbCwgbmV3IFJlZmVyZW5jZShvdXRlciwgJ3Jvb3QnKSk7XG4gICAgICAgIHdvcmtsaXN0LnB1c2goZWxlbWVudCk7XG4gICAgICAgIGxlYXZlbGlzdC5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICAgIHdoaWxlICh3b3JrbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB3b3JrbGlzdC5wb3AoKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT09IHNlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGxlYXZlbGlzdC5wb3AoKTtcblxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuX19leGVjdXRlKHZpc2l0b3IubGVhdmUsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgLy8gbm9kZSBtYXkgYmUgcmVwbGFjZWQgd2l0aCBudWxsLFxuICAgICAgICAgICAgICAgIC8vIHNvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdW5kZWZpbmVkIGFuZCBudWxsIGluIHRoaXMgcGxhY2VcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0ICE9PSBCUkVBSyAmJiB0YXJnZXQgIT09IFNLSVAgJiYgdGFyZ2V0ICE9PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZVxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnJlZi5yZXBsYWNlKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gUkVNT1ZFIHx8IHRhcmdldCA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUVsZW0oZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gQlJFQUsgfHwgdGFyZ2V0ID09PSBCUkVBSykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0ZXIucm9vdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuX19leGVjdXRlKHZpc2l0b3IuZW50ZXIsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyBub2RlIG1heSBiZSByZXBsYWNlZCB3aXRoIG51bGwsXG4gICAgICAgICAgICAvLyBzbyBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVuZGVmaW5lZCBhbmQgbnVsbCBpbiB0aGlzIHBsYWNlXG4gICAgICAgICAgICBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0ICE9PSBCUkVBSyAmJiB0YXJnZXQgIT09IFNLSVAgJiYgdGFyZ2V0ICE9PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICAvLyByZXBsYWNlXG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZWYucmVwbGFjZSh0YXJnZXQpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQubm9kZSA9IHRhcmdldDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gUkVNT1ZFIHx8IHRhcmdldCA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlRWxlbShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50Lm5vZGUgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBCUkVBSyB8fCB0YXJnZXQgPT09IEJSRUFLKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dGVyLnJvb3Q7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vZGUgbWF5IGJlIG51bGxcbiAgICAgICAgICAgIG5vZGUgPSBlbGVtZW50Lm5vZGU7XG4gICAgICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd29ya2xpc3QucHVzaChzZW50aW5lbCk7XG4gICAgICAgICAgICBsZWF2ZWxpc3QucHVzaChlbGVtZW50KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gU0tJUCB8fCB0YXJnZXQgPT09IFNLSVApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbm9kZVR5cGUgPSBub2RlLnR5cGUgfHwgZWxlbWVudC53cmFwO1xuICAgICAgICAgICAgY2FuZGlkYXRlcyA9IHRoaXMuX19rZXlzW25vZGVUeXBlXTtcbiAgICAgICAgICAgIGlmICghY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fZmFsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IHRoaXMuX19mYWxsYmFjayhub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlICcgKyBub2RlVHlwZSArICcuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50ID0gY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnQgLT0gMSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGtleSA9IGNhbmRpZGF0ZXNbY3VycmVudF07XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gbm9kZVtrZXldO1xuICAgICAgICAgICAgICAgIGlmICghY2FuZGlkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudDIgPSBjYW5kaWRhdGUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnQyIC09IDEpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FuZGlkYXRlW2N1cnJlbnQyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvcGVydHkobm9kZVR5cGUsIGNhbmRpZGF0ZXNbY3VycmVudF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGNhbmRpZGF0ZVtjdXJyZW50Ml0sIFtrZXksIGN1cnJlbnQyXSwgJ1Byb3BlcnR5JywgbmV3IFJlZmVyZW5jZShjYW5kaWRhdGUsIGN1cnJlbnQyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZShjYW5kaWRhdGVbY3VycmVudDJdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudChjYW5kaWRhdGVbY3VycmVudDJdLCBba2V5LCBjdXJyZW50Ml0sIG51bGwsIG5ldyBSZWZlcmVuY2UoY2FuZGlkYXRlLCBjdXJyZW50MikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtsaXN0LnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZShjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtsaXN0LnB1c2gobmV3IEVsZW1lbnQoY2FuZGlkYXRlLCBrZXksIG51bGwsIG5ldyBSZWZlcmVuY2Uobm9kZSwga2V5KSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRlci5yb290O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiB0cmF2ZXJzZShyb290LCB2aXNpdG9yKSB7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIoKTtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIudHJhdmVyc2Uocm9vdCwgdmlzaXRvcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyb290LCB2aXNpdG9yKSB7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIoKTtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIucmVwbGFjZShyb290LCB2aXNpdG9yKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmRDb21tZW50UmFuZ2UoY29tbWVudCwgdG9rZW5zKSB7XG4gICAgICAgIHZhciB0YXJnZXQ7XG5cbiAgICAgICAgdGFyZ2V0ID0gdXBwZXJCb3VuZCh0b2tlbnMsIGZ1bmN0aW9uIHNlYXJjaCh0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuLnJhbmdlWzBdID4gY29tbWVudC5yYW5nZVswXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tbWVudC5leHRlbmRlZFJhbmdlID0gW2NvbW1lbnQucmFuZ2VbMF0sIGNvbW1lbnQucmFuZ2VbMV1dO1xuXG4gICAgICAgIGlmICh0YXJnZXQgIT09IHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbW1lbnQuZXh0ZW5kZWRSYW5nZVsxXSA9IHRva2Vuc1t0YXJnZXRdLnJhbmdlWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0IC09IDE7XG4gICAgICAgIGlmICh0YXJnZXQgPj0gMCkge1xuICAgICAgICAgICAgY29tbWVudC5leHRlbmRlZFJhbmdlWzBdID0gdG9rZW5zW3RhcmdldF0ucmFuZ2VbMV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhdHRhY2hDb21tZW50cyh0cmVlLCBwcm92aWRlZENvbW1lbnRzLCB0b2tlbnMpIHtcbiAgICAgICAgLy8gQXQgZmlyc3QsIHdlIHNob3VsZCBjYWxjdWxhdGUgZXh0ZW5kZWQgY29tbWVudCByYW5nZXMuXG4gICAgICAgIHZhciBjb21tZW50cyA9IFtdLCBjb21tZW50LCBsZW4sIGksIGN1cnNvcjtcblxuICAgICAgICBpZiAoIXRyZWUucmFuZ2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYXR0YWNoQ29tbWVudHMgbmVlZHMgcmFuZ2UgaW5mb3JtYXRpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRva2VucyBhcnJheSBpcyBlbXB0eSwgd2UgYXR0YWNoIGNvbW1lbnRzIHRvIHRyZWUgYXMgJ2xlYWRpbmdDb21tZW50cydcbiAgICAgICAgaWYgKCF0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAocHJvdmlkZWRDb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBwcm92aWRlZENvbW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBkZWVwQ29weShwcm92aWRlZENvbW1lbnRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudC5leHRlbmRlZFJhbmdlID0gWzAsIHRyZWUucmFuZ2VbMF1dO1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cmVlLmxlYWRpbmdDb21tZW50cyA9IGNvbW1lbnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRyZWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBwcm92aWRlZENvbW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb21tZW50cy5wdXNoKGV4dGVuZENvbW1lbnRSYW5nZShkZWVwQ29weShwcm92aWRlZENvbW1lbnRzW2ldKSwgdG9rZW5zKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlzIGlzIGJhc2VkIG9uIEpvaG4gRnJlZW1hbidzIGltcGxlbWVudGF0aW9uLlxuICAgICAgICBjdXJzb3IgPSAwO1xuICAgICAgICB0cmF2ZXJzZSh0cmVlLCB7XG4gICAgICAgICAgICBlbnRlcjogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tbWVudDtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IgPCBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnRzW2N1cnNvcl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50LmV4dGVuZGVkUmFuZ2VbMV0gPiBub2RlLnJhbmdlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50LmV4dGVuZGVkUmFuZ2VbMV0gPT09IG5vZGUucmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlYWRpbmdDb21tZW50cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWFkaW5nQ29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnNwbGljZShjdXJzb3IsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IG91dCBvZiBvd25lZCBub2RlXG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvciA9PT0gY29tbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpdG9yT3B0aW9uLkJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb21tZW50c1tjdXJzb3JdLmV4dGVuZGVkUmFuZ2VbMF0gPiBub2RlLnJhbmdlWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpdG9yT3B0aW9uLlNraXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjdXJzb3IgPSAwO1xuICAgICAgICB0cmF2ZXJzZSh0cmVlLCB7XG4gICAgICAgICAgICBsZWF2ZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tbWVudDtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IgPCBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnRzW2N1cnNvcl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnJhbmdlWzFdIDwgY29tbWVudC5leHRlbmRlZFJhbmdlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnJhbmdlWzFdID09PSBjb21tZW50LmV4dGVuZGVkUmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS50cmFpbGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50cmFpbGluZ0NvbW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnRyYWlsaW5nQ29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnNwbGljZShjdXJzb3IsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IG91dCBvZiBvd25lZCBub2RlXG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvciA9PT0gY29tbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpdG9yT3B0aW9uLkJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb21tZW50c1tjdXJzb3JdLmV4dGVuZGVkUmFuZ2VbMF0gPiBub2RlLnJhbmdlWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpdG9yT3B0aW9uLlNraXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdHJlZTtcbiAgICB9XG5cbiAgICBleHBvcnRzLlN5bnRheCA9IFN5bnRheDtcbiAgICBleHBvcnRzLnRyYXZlcnNlID0gdHJhdmVyc2U7XG4gICAgZXhwb3J0cy5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICBleHBvcnRzLmF0dGFjaENvbW1lbnRzID0gYXR0YWNoQ29tbWVudHM7XG4gICAgZXhwb3J0cy5WaXNpdG9yS2V5cyA9IFZpc2l0b3JLZXlzO1xuICAgIGV4cG9ydHMuVmlzaXRvck9wdGlvbiA9IFZpc2l0b3JPcHRpb247XG4gICAgZXhwb3J0cy5Db250cm9sbGVyID0gQ29udHJvbGxlcjtcbiAgICBleHBvcnRzLmNsb25lRW52aXJvbm1lbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjbG9uZSh7fSk7IH07XG5cbiAgICByZXR1cm4gZXhwb3J0cztcbn0oZXhwb3J0cykpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbiIsIi8qXG4gIENvcHlyaWdodCAoQykgMjAxMyBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnQVMgSVMnXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgZnVuY3Rpb24gaXNFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0FycmF5RXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdBc3NpZ25tZW50RXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdCaW5hcnlFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ0NhbGxFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdGdW5jdGlvbkV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnSWRlbnRpZmllcic6XG4gICAgICAgICAgICBjYXNlICdMaXRlcmFsJzpcbiAgICAgICAgICAgIGNhc2UgJ0xvZ2ljYWxFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ01lbWJlckV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnTmV3RXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdPYmplY3RFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ1NlcXVlbmNlRXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdUaGlzRXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdVbmFyeUV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnVXBkYXRlRXhwcmVzc2lvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSXRlcmF0aW9uU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0RvV2hpbGVTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRm9ySW5TdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRm9yU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ1doaWxlU3RhdGVtZW50JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTdGF0ZW1lbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnQmxvY2tTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnQnJlYWtTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnQ29udGludWVTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRGVidWdnZXJTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRG9XaGlsZVN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdFbXB0eVN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdFeHByZXNzaW9uU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0ZvckluU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0ZvclN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdJZlN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdMYWJlbGVkU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ1JldHVyblN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdTd2l0Y2hTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnVGhyb3dTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnVHJ5U3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ1ZhcmlhYmxlRGVjbGFyYXRpb24nOlxuICAgICAgICAgICAgY2FzZSAnV2hpbGVTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnV2l0aFN0YXRlbWVudCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU291cmNlRWxlbWVudChub2RlKSB7XG4gICAgICByZXR1cm4gaXNTdGF0ZW1lbnQobm9kZSkgfHwgbm9kZSAhPSBudWxsICYmIG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uRGVjbGFyYXRpb24nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYWlsaW5nU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnSWZTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgaWYgKG5vZGUuYWx0ZXJuYXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5hbHRlcm5hdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5jb25zZXF1ZW50O1xuXG4gICAgICAgIGNhc2UgJ0xhYmVsZWRTdGF0ZW1lbnQnOlxuICAgICAgICBjYXNlICdGb3JTdGF0ZW1lbnQnOlxuICAgICAgICBjYXNlICdGb3JJblN0YXRlbWVudCc6XG4gICAgICAgIGNhc2UgJ1doaWxlU3RhdGVtZW50JzpcbiAgICAgICAgY2FzZSAnV2l0aFN0YXRlbWVudCc6XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5ib2R5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUHJvYmxlbWF0aWNJZlN0YXRlbWVudChub2RlKSB7XG4gICAgICAgIHZhciBjdXJyZW50O1xuXG4gICAgICAgIGlmIChub2RlLnR5cGUgIT09ICdJZlN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5hbHRlcm5hdGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBub2RlLmNvbnNlcXVlbnQ7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdJZlN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5hbHRlcm5hdGUgPT0gbnVsbCkgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudCA9IHRyYWlsaW5nU3RhdGVtZW50KGN1cnJlbnQpO1xuICAgICAgICB9IHdoaWxlIChjdXJyZW50KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgICAgIGlzRXhwcmVzc2lvbjogaXNFeHByZXNzaW9uLFxuICAgICAgICBpc1N0YXRlbWVudDogaXNTdGF0ZW1lbnQsXG4gICAgICAgIGlzSXRlcmF0aW9uU3RhdGVtZW50OiBpc0l0ZXJhdGlvblN0YXRlbWVudCxcbiAgICAgICAgaXNTb3VyY2VFbGVtZW50OiBpc1NvdXJjZUVsZW1lbnQsXG4gICAgICAgIGlzUHJvYmxlbWF0aWNJZlN0YXRlbWVudDogaXNQcm9ibGVtYXRpY0lmU3RhdGVtZW50LFxuXG4gICAgICAgIHRyYWlsaW5nU3RhdGVtZW50OiB0cmFpbGluZ1N0YXRlbWVudFxuICAgIH07XG59KCkpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbiIsIi8qXG4gIENvcHlyaWdodCAoQykgMjAxMy0yMDE0IFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDE0IEl2YW4gTmlrdWxpbiA8aWZhYWFuQGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBFUzZSZWdleCwgRVM1UmVnZXgsIE5PTl9BU0NJSV9XSElURVNQQUNFUywgSURFTlRJRklFUl9TVEFSVCwgSURFTlRJRklFUl9QQVJULCBjaDtcblxuICAgIC8vIFNlZSBgdG9vbHMvZ2VuZXJhdGUtaWRlbnRpZmllci1yZWdleC5qc2AuXG4gICAgRVM1UmVnZXggPSB7XG4gICAgICAgIC8vIEVDTUFTY3JpcHQgNS4xL1VuaWNvZGUgdjkuMC4wIE5vbkFzY2lpSWRlbnRpZmllclN0YXJ0OlxuICAgICAgICBOb25Bc2NpaUlkZW50aWZpZXJTdGFydDogL1tcXHhBQVxceEI1XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYyMC1cXHUwNjRBXFx1MDY2RVxcdTA2NkZcXHUwNjcxLVxcdTA2RDNcXHUwNkQ1XFx1MDZFNVxcdTA2RTZcXHUwNkVFXFx1MDZFRlxcdTA2RkEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwXFx1MDcxMi1cXHUwNzJGXFx1MDc0RC1cXHUwN0E1XFx1MDdCMVxcdTA3Q0EtXFx1MDdFQVxcdTA3RjRcXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgxNVxcdTA4MUFcXHUwODI0XFx1MDgyOFxcdTA4NDAtXFx1MDg1OFxcdTA4QTAtXFx1MDhCNFxcdTA4QjYtXFx1MDhCRFxcdTA5MDQtXFx1MDkzOVxcdTA5M0RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTgwXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCRFxcdTA5Q0VcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFMVxcdTA5RjBcXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE3Mi1cXHUwQTc0XFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFEMFxcdTBBRTBcXHUwQUUxXFx1MEFGOVxcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNEXFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjFcXHUwQjcxXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkQwXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRFxcdTBDNTgtXFx1MEM1QVxcdTBDNjBcXHUwQzYxXFx1MEM4MFxcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkRcXHUwQ0RFXFx1MENFMFxcdTBDRTFcXHUwQ0YxXFx1MENGMlxcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0RcXHUwRDRFXFx1MEQ1NC1cXHUwRDU2XFx1MEQ1Ri1cXHUwRDYxXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4NS1cXHUwRDk2XFx1MEQ5QS1cXHUwREIxXFx1MERCMy1cXHUwREJCXFx1MERCRFxcdTBEQzAtXFx1MERDNlxcdTBFMDEtXFx1MEUzMFxcdTBFMzJcXHUwRTMzXFx1MEU0MC1cXHUwRTQ2XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjBcXHUwRUIyXFx1MEVCM1xcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGNDAtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGODgtXFx1MEY4Q1xcdTEwMDAtXFx1MTAyQVxcdTEwM0ZcXHUxMDUwLVxcdTEwNTVcXHUxMDVBLVxcdTEwNURcXHUxMDYxXFx1MTA2NVxcdTEwNjZcXHUxMDZFLVxcdTEwNzBcXHUxMDc1LVxcdTEwODFcXHUxMDhFXFx1MTBBMC1cXHUxMEM1XFx1MTBDN1xcdTEwQ0RcXHUxMEQwLVxcdTEwRkFcXHUxMEZDLVxcdTEyNDhcXHUxMjRBLVxcdTEyNERcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1QS1cXHUxMjVEXFx1MTI2MC1cXHUxMjg4XFx1MTI4QS1cXHUxMjhEXFx1MTI5MC1cXHUxMkIwXFx1MTJCMi1cXHUxMkI1XFx1MTJCOC1cXHUxMkJFXFx1MTJDMFxcdTEyQzItXFx1MTJDNVxcdTEyQzgtXFx1MTJENlxcdTEyRDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1QVxcdTEzODAtXFx1MTM4RlxcdTEzQTAtXFx1MTNGNVxcdTEzRjgtXFx1MTNGRFxcdTE0MDEtXFx1MTY2Q1xcdTE2NkYtXFx1MTY3RlxcdTE2ODEtXFx1MTY5QVxcdTE2QTAtXFx1MTZFQVxcdTE2RUUtXFx1MTZGOFxcdTE3MDAtXFx1MTcwQ1xcdTE3MEUtXFx1MTcxMVxcdTE3MjAtXFx1MTczMVxcdTE3NDAtXFx1MTc1MVxcdTE3NjAtXFx1MTc2Q1xcdTE3NkUtXFx1MTc3MFxcdTE3ODAtXFx1MTdCM1xcdTE3RDdcXHUxN0RDXFx1MTgyMC1cXHUxODc3XFx1MTg4MC1cXHUxODg0XFx1MTg4Ny1cXHUxOEE4XFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5NTAtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QjAtXFx1MTlDOVxcdTFBMDAtXFx1MUExNlxcdTFBMjAtXFx1MUE1NFxcdTFBQTdcXHUxQjA1LVxcdTFCMzNcXHUxQjQ1LVxcdTFCNEJcXHUxQjgzLVxcdTFCQTBcXHUxQkFFXFx1MUJBRlxcdTFCQkEtXFx1MUJFNVxcdTFDMDAtXFx1MUMyM1xcdTFDNEQtXFx1MUM0RlxcdTFDNUEtXFx1MUM3RFxcdTFDODAtXFx1MUM4OFxcdTFDRTktXFx1MUNFQ1xcdTFDRUUtXFx1MUNGMVxcdTFDRjVcXHUxQ0Y2XFx1MUQwMC1cXHUxREJGXFx1MUUwMC1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjEwMlxcdTIxMDdcXHUyMTBBLVxcdTIxMTNcXHUyMTE1XFx1MjExOS1cXHUyMTFEXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyQS1cXHUyMTJEXFx1MjEyRi1cXHUyMTM5XFx1MjEzQy1cXHUyMTNGXFx1MjE0NS1cXHUyMTQ5XFx1MjE0RVxcdTIxNjAtXFx1MjE4OFxcdTJDMDAtXFx1MkMyRVxcdTJDMzAtXFx1MkM1RVxcdTJDNjAtXFx1MkNFNFxcdTJDRUItXFx1MkNFRVxcdTJDRjJcXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ4MC1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MkUyRlxcdTMwMDUtXFx1MzAwN1xcdTMwMjEtXFx1MzAyOVxcdTMwMzEtXFx1MzAzNVxcdTMwMzgtXFx1MzAzQ1xcdTMwNDEtXFx1MzA5NlxcdTMwOUQtXFx1MzA5RlxcdTMwQTEtXFx1MzBGQVxcdTMwRkMtXFx1MzBGRlxcdTMxMDUtXFx1MzEyRFxcdTMxMzEtXFx1MzE4RVxcdTMxQTAtXFx1MzFCQVxcdTMxRjAtXFx1MzFGRlxcdTM0MDAtXFx1NERCNVxcdTRFMDAtXFx1OUZENVxcdUEwMDAtXFx1QTQ4Q1xcdUE0RDAtXFx1QTRGRFxcdUE1MDAtXFx1QTYwQ1xcdUE2MTAtXFx1QTYxRlxcdUE2MkFcXHVBNjJCXFx1QTY0MC1cXHVBNjZFXFx1QTY3Ri1cXHVBNjlEXFx1QTZBMC1cXHVBNkVGXFx1QTcxNy1cXHVBNzFGXFx1QTcyMi1cXHVBNzg4XFx1QTc4Qi1cXHVBN0FFXFx1QTdCMC1cXHVBN0I3XFx1QTdGNy1cXHVBODAxXFx1QTgwMy1cXHVBODA1XFx1QTgwNy1cXHVBODBBXFx1QTgwQy1cXHVBODIyXFx1QTg0MC1cXHVBODczXFx1QTg4Mi1cXHVBOEIzXFx1QThGMi1cXHVBOEY3XFx1QThGQlxcdUE4RkRcXHVBOTBBLVxcdUE5MjVcXHVBOTMwLVxcdUE5NDZcXHVBOTYwLVxcdUE5N0NcXHVBOTg0LVxcdUE5QjJcXHVBOUNGXFx1QTlFMC1cXHVBOUU0XFx1QTlFNi1cXHVBOUVGXFx1QTlGQS1cXHVBOUZFXFx1QUEwMC1cXHVBQTI4XFx1QUE0MC1cXHVBQTQyXFx1QUE0NC1cXHVBQTRCXFx1QUE2MC1cXHVBQTc2XFx1QUE3QVxcdUFBN0UtXFx1QUFBRlxcdUFBQjFcXHVBQUI1XFx1QUFCNlxcdUFBQjktXFx1QUFCRFxcdUFBQzBcXHVBQUMyXFx1QUFEQi1cXHVBQUREXFx1QUFFMC1cXHVBQUVBXFx1QUFGMi1cXHVBQUY0XFx1QUIwMS1cXHVBQjA2XFx1QUIwOS1cXHVBQjBFXFx1QUIxMS1cXHVBQjE2XFx1QUIyMC1cXHVBQjI2XFx1QUIyOC1cXHVBQjJFXFx1QUIzMC1cXHVBQjVBXFx1QUI1Qy1cXHVBQjY1XFx1QUI3MC1cXHVBQkUyXFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRFxcdUZCMUYtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkU3MC1cXHVGRTc0XFx1RkU3Ni1cXHVGRUZDXFx1RkYyMS1cXHVGRjNBXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXS8sXG4gICAgICAgIC8vIEVDTUFTY3JpcHQgNS4xL1VuaWNvZGUgdjkuMC4wIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6XG4gICAgICAgIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6IC9bXFx4QUFcXHhCNVxceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzMDAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM3RlxcdTAzODZcXHUwMzg4LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4My1cXHUwNDg3XFx1MDQ4QS1cXHUwNTJGXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1OTEtXFx1MDVCRFxcdTA1QkZcXHUwNUMxXFx1MDVDMlxcdTA1QzRcXHUwNUM1XFx1MDVDN1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MTAtXFx1MDYxQVxcdTA2MjAtXFx1MDY2OVxcdTA2NkUtXFx1MDZEM1xcdTA2RDUtXFx1MDZEQ1xcdTA2REYtXFx1MDZFOFxcdTA2RUEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwLVxcdTA3NEFcXHUwNzRELVxcdTA3QjFcXHUwN0MwLVxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODJEXFx1MDg0MC1cXHUwODVCXFx1MDhBMC1cXHUwOEI0XFx1MDhCNi1cXHUwOEJEXFx1MDhENC1cXHUwOEUxXFx1MDhFMy1cXHUwOTYzXFx1MDk2Ni1cXHUwOTZGXFx1MDk3MS1cXHUwOTgzXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCQy1cXHUwOUM0XFx1MDlDN1xcdTA5QzhcXHUwOUNCLVxcdTA5Q0VcXHUwOUQ3XFx1MDlEQ1xcdTA5RERcXHUwOURGLVxcdTA5RTNcXHUwOUU2LVxcdTA5RjFcXHUwQTAxLVxcdTBBMDNcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBM0NcXHUwQTNFLVxcdTBBNDJcXHUwQTQ3XFx1MEE0OFxcdTBBNEItXFx1MEE0RFxcdTBBNTFcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE2Ni1cXHUwQTc1XFx1MEE4MS1cXHUwQTgzXFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJDLVxcdTBBQzVcXHUwQUM3LVxcdTBBQzlcXHUwQUNCLVxcdTBBQ0RcXHUwQUQwXFx1MEFFMC1cXHUwQUUzXFx1MEFFNi1cXHUwQUVGXFx1MEFGOVxcdTBCMDEtXFx1MEIwM1xcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNDLVxcdTBCNDRcXHUwQjQ3XFx1MEI0OFxcdTBCNEItXFx1MEI0RFxcdTBCNTZcXHUwQjU3XFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjNcXHUwQjY2LVxcdTBCNkZcXHUwQjcxXFx1MEI4MlxcdTBCODNcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5XFx1MEI5QVxcdTBCOUNcXHUwQjlFXFx1MEI5RlxcdTBCQTNcXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI5XFx1MEJCRS1cXHUwQkMyXFx1MEJDNi1cXHUwQkM4XFx1MEJDQS1cXHUwQkNEXFx1MEJEMFxcdTBCRDdcXHUwQkU2LVxcdTBCRUZcXHUwQzAwLVxcdTBDMDNcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzlcXHUwQzNELVxcdTBDNDRcXHUwQzQ2LVxcdTBDNDhcXHUwQzRBLVxcdTBDNERcXHUwQzU1XFx1MEM1NlxcdTBDNTgtXFx1MEM1QVxcdTBDNjAtXFx1MEM2M1xcdTBDNjYtXFx1MEM2RlxcdTBDODAtXFx1MEM4M1xcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkMtXFx1MENDNFxcdTBDQzYtXFx1MENDOFxcdTBDQ0EtXFx1MENDRFxcdTBDRDVcXHUwQ0Q2XFx1MENERVxcdTBDRTAtXFx1MENFM1xcdTBDRTYtXFx1MENFRlxcdTBDRjFcXHUwQ0YyXFx1MEQwMS1cXHUwRDAzXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRC1cXHUwRDQ0XFx1MEQ0Ni1cXHUwRDQ4XFx1MEQ0QS1cXHUwRDRFXFx1MEQ1NC1cXHUwRDU3XFx1MEQ1Ri1cXHUwRDYzXFx1MEQ2Ni1cXHUwRDZGXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4MlxcdTBEODNcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MERDQVxcdTBEQ0YtXFx1MERENFxcdTBERDZcXHUwREQ4LVxcdTBEREZcXHUwREU2LVxcdTBERUZcXHUwREYyXFx1MERGM1xcdTBFMDEtXFx1MEUzQVxcdTBFNDAtXFx1MEU0RVxcdTBFNTAtXFx1MEU1OVxcdTBFODFcXHUwRTgyXFx1MEU4NFxcdTBFODdcXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUFcXHUwRUFCXFx1MEVBRC1cXHUwRUI5XFx1MEVCQi1cXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEVDNlxcdTBFQzgtXFx1MEVDRFxcdTBFRDAtXFx1MEVEOVxcdTBFREMtXFx1MEVERlxcdTBGMDBcXHUwRjE4XFx1MEYxOVxcdTBGMjAtXFx1MEYyOVxcdTBGMzVcXHUwRjM3XFx1MEYzOVxcdTBGM0UtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGNzEtXFx1MEY4NFxcdTBGODYtXFx1MEY5N1xcdTBGOTktXFx1MEZCQ1xcdTBGQzZcXHUxMDAwLVxcdTEwNDlcXHUxMDUwLVxcdTEwOURcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM1RC1cXHUxMzVGXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzE0XFx1MTcyMC1cXHUxNzM0XFx1MTc0MC1cXHUxNzUzXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc3MlxcdTE3NzNcXHUxNzgwLVxcdTE3RDNcXHUxN0Q3XFx1MTdEQ1xcdTE3RERcXHUxN0UwLVxcdTE3RTlcXHUxODBCLVxcdTE4MERcXHUxODEwLVxcdTE4MTlcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QUFcXHUxOEIwLVxcdTE4RjVcXHUxOTAwLVxcdTE5MUVcXHUxOTIwLVxcdTE5MkJcXHUxOTMwLVxcdTE5M0JcXHUxOTQ2LVxcdTE5NkRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5QUJcXHUxOUIwLVxcdTE5QzlcXHUxOUQwLVxcdTE5RDlcXHUxQTAwLVxcdTFBMUJcXHUxQTIwLVxcdTFBNUVcXHUxQTYwLVxcdTFBN0NcXHUxQTdGLVxcdTFBODlcXHUxQTkwLVxcdTFBOTlcXHUxQUE3XFx1MUFCMC1cXHUxQUJEXFx1MUIwMC1cXHUxQjRCXFx1MUI1MC1cXHUxQjU5XFx1MUI2Qi1cXHUxQjczXFx1MUI4MC1cXHUxQkYzXFx1MUMwMC1cXHUxQzM3XFx1MUM0MC1cXHUxQzQ5XFx1MUM0RC1cXHUxQzdEXFx1MUM4MC1cXHUxQzg4XFx1MUNEMC1cXHUxQ0QyXFx1MUNENC1cXHUxQ0Y2XFx1MUNGOFxcdTFDRjlcXHUxRDAwLVxcdTFERjVcXHUxREZCLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjAwQ1xcdTIwMERcXHUyMDNGXFx1MjA0MFxcdTIwNTRcXHUyMDcxXFx1MjA3RlxcdTIwOTAtXFx1MjA5Q1xcdTIwRDAtXFx1MjBEQ1xcdTIwRTFcXHUyMEU1LVxcdTIwRjBcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMkRcXHUyMTJGLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ3Ri1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MkRFMC1cXHUyREZGXFx1MkUyRlxcdTMwMDUtXFx1MzAwN1xcdTMwMjEtXFx1MzAyRlxcdTMwMzEtXFx1MzAzNVxcdTMwMzgtXFx1MzAzQ1xcdTMwNDEtXFx1MzA5NlxcdTMwOTlcXHUzMDlBXFx1MzA5RC1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjJCXFx1QTY0MC1cXHVBNjZGXFx1QTY3NC1cXHVBNjdEXFx1QTY3Ri1cXHVBNkYxXFx1QTcxNy1cXHVBNzFGXFx1QTcyMi1cXHVBNzg4XFx1QTc4Qi1cXHVBN0FFXFx1QTdCMC1cXHVBN0I3XFx1QTdGNy1cXHVBODI3XFx1QTg0MC1cXHVBODczXFx1QTg4MC1cXHVBOEM1XFx1QThEMC1cXHVBOEQ5XFx1QThFMC1cXHVBOEY3XFx1QThGQlxcdUE4RkRcXHVBOTAwLVxcdUE5MkRcXHVBOTMwLVxcdUE5NTNcXHVBOTYwLVxcdUE5N0NcXHVBOTgwLVxcdUE5QzBcXHVBOUNGLVxcdUE5RDlcXHVBOUUwLVxcdUE5RkVcXHVBQTAwLVxcdUFBMzZcXHVBQTQwLVxcdUFBNERcXHVBQTUwLVxcdUFBNTlcXHVBQTYwLVxcdUFBNzZcXHVBQTdBLVxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUZcXHVBQUYyLVxcdUFBRjZcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRUFcXHVBQkVDXFx1QUJFRFxcdUFCRjAtXFx1QUJGOVxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMUQtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkUwMC1cXHVGRTBGXFx1RkUyMC1cXHVGRTJGXFx1RkUzM1xcdUZFMzRcXHVGRTRELVxcdUZFNEZcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjEwLVxcdUZGMTlcXHVGRjIxLVxcdUZGM0FcXHVGRjNGXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXS9cbiAgICB9O1xuXG4gICAgRVM2UmVnZXggPSB7XG4gICAgICAgIC8vIEVDTUFTY3JpcHQgNi9Vbmljb2RlIHY5LjAuMCBOb25Bc2NpaUlkZW50aWZpZXJTdGFydDpcbiAgICAgICAgTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQ6IC9bXFx4QUFcXHhCNVxceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzNzAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM3RlxcdTAzODZcXHUwMzg4LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4QS1cXHUwNTJGXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MjAtXFx1MDY0QVxcdTA2NkVcXHUwNjZGXFx1MDY3MS1cXHUwNkQzXFx1MDZENVxcdTA2RTVcXHUwNkU2XFx1MDZFRVxcdTA2RUZcXHUwNkZBLVxcdTA2RkNcXHUwNkZGXFx1MDcxMFxcdTA3MTItXFx1MDcyRlxcdTA3NEQtXFx1MDdBNVxcdTA3QjFcXHUwN0NBLVxcdTA3RUFcXHUwN0Y0XFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MTVcXHUwODFBXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwOEEwLVxcdTA4QjRcXHUwOEI2LVxcdTA4QkRcXHUwOTA0LVxcdTA5MzlcXHUwOTNEXFx1MDk1MFxcdTA5NTgtXFx1MDk2MVxcdTA5NzEtXFx1MDk4MFxcdTA5ODUtXFx1MDk4Q1xcdTA5OEZcXHUwOTkwXFx1MDk5My1cXHUwOUE4XFx1MDlBQS1cXHUwOUIwXFx1MDlCMlxcdTA5QjYtXFx1MDlCOVxcdTA5QkRcXHUwOUNFXFx1MDlEQ1xcdTA5RERcXHUwOURGLVxcdTA5RTFcXHUwOUYwXFx1MDlGMVxcdTBBMDUtXFx1MEEwQVxcdTBBMEZcXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMlxcdTBBMzNcXHUwQTM1XFx1MEEzNlxcdTBBMzhcXHUwQTM5XFx1MEE1OS1cXHUwQTVDXFx1MEE1RVxcdTBBNzItXFx1MEE3NFxcdTBBODUtXFx1MEE4RFxcdTBBOEYtXFx1MEE5MVxcdTBBOTMtXFx1MEFBOFxcdTBBQUEtXFx1MEFCMFxcdTBBQjJcXHUwQUIzXFx1MEFCNS1cXHUwQUI5XFx1MEFCRFxcdTBBRDBcXHUwQUUwXFx1MEFFMVxcdTBBRjlcXHUwQjA1LVxcdTBCMENcXHUwQjBGXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzJcXHUwQjMzXFx1MEIzNS1cXHUwQjM5XFx1MEIzRFxcdTBCNUNcXHUwQjVEXFx1MEI1Ri1cXHUwQjYxXFx1MEI3MVxcdTBCODNcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5XFx1MEI5QVxcdTBCOUNcXHUwQjlFXFx1MEI5RlxcdTBCQTNcXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI5XFx1MEJEMFxcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzOVxcdTBDM0RcXHUwQzU4LVxcdTBDNUFcXHUwQzYwXFx1MEM2MVxcdTBDODBcXHUwQzg1LVxcdTBDOENcXHUwQzhFLVxcdTBDOTBcXHUwQzkyLVxcdTBDQThcXHUwQ0FBLVxcdTBDQjNcXHUwQ0I1LVxcdTBDQjlcXHUwQ0JEXFx1MENERVxcdTBDRTBcXHUwQ0UxXFx1MENGMVxcdTBDRjJcXHUwRDA1LVxcdTBEMENcXHUwRDBFLVxcdTBEMTBcXHUwRDEyLVxcdTBEM0FcXHUwRDNEXFx1MEQ0RVxcdTBENTQtXFx1MEQ1NlxcdTBENUYtXFx1MEQ2MVxcdTBEN0EtXFx1MEQ3RlxcdTBEODUtXFx1MEQ5NlxcdTBEOUEtXFx1MERCMVxcdTBEQjMtXFx1MERCQlxcdTBEQkRcXHUwREMwLVxcdTBEQzZcXHUwRTAxLVxcdTBFMzBcXHUwRTMyXFx1MEUzM1xcdTBFNDAtXFx1MEU0NlxcdTBFODFcXHUwRTgyXFx1MEU4NFxcdTBFODdcXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUFcXHUwRUFCXFx1MEVBRC1cXHUwRUIwXFx1MEVCMlxcdTBFQjNcXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEVDNlxcdTBFREMtXFx1MEVERlxcdTBGMDBcXHUwRjQwLVxcdTBGNDdcXHUwRjQ5LVxcdTBGNkNcXHUwRjg4LVxcdTBGOENcXHUxMDAwLVxcdTEwMkFcXHUxMDNGXFx1MTA1MC1cXHUxMDU1XFx1MTA1QS1cXHUxMDVEXFx1MTA2MVxcdTEwNjVcXHUxMDY2XFx1MTA2RS1cXHUxMDcwXFx1MTA3NS1cXHUxMDgxXFx1MTA4RVxcdTEwQTAtXFx1MTBDNVxcdTEwQzdcXHUxMENEXFx1MTBEMC1cXHUxMEZBXFx1MTBGQy1cXHUxMjQ4XFx1MTI0QS1cXHUxMjREXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNUEtXFx1MTI1RFxcdTEyNjAtXFx1MTI4OFxcdTEyOEEtXFx1MTI4RFxcdTEyOTAtXFx1MTJCMFxcdTEyQjItXFx1MTJCNVxcdTEyQjgtXFx1MTJCRVxcdTEyQzBcXHUxMkMyLVxcdTEyQzVcXHUxMkM4LVxcdTEyRDZcXHUxMkQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNUFcXHUxMzgwLVxcdTEzOEZcXHUxM0EwLVxcdTEzRjVcXHUxM0Y4LVxcdTEzRkRcXHUxNDAxLVxcdTE2NkNcXHUxNjZGLVxcdTE2N0ZcXHUxNjgxLVxcdTE2OUFcXHUxNkEwLVxcdTE2RUFcXHUxNkVFLVxcdTE2RjhcXHUxNzAwLVxcdTE3MENcXHUxNzBFLVxcdTE3MTFcXHUxNzIwLVxcdTE3MzFcXHUxNzQwLVxcdTE3NTFcXHUxNzYwLVxcdTE3NkNcXHUxNzZFLVxcdTE3NzBcXHUxNzgwLVxcdTE3QjNcXHUxN0Q3XFx1MTdEQ1xcdTE4MjAtXFx1MTg3N1xcdTE4ODAtXFx1MThBOFxcdTE4QUFcXHUxOEIwLVxcdTE4RjVcXHUxOTAwLVxcdTE5MUVcXHUxOTUwLVxcdTE5NkRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5QUJcXHUxOUIwLVxcdTE5QzlcXHUxQTAwLVxcdTFBMTZcXHUxQTIwLVxcdTFBNTRcXHUxQUE3XFx1MUIwNS1cXHUxQjMzXFx1MUI0NS1cXHUxQjRCXFx1MUI4My1cXHUxQkEwXFx1MUJBRVxcdTFCQUZcXHUxQkJBLVxcdTFCRTVcXHUxQzAwLVxcdTFDMjNcXHUxQzRELVxcdTFDNEZcXHUxQzVBLVxcdTFDN0RcXHUxQzgwLVxcdTFDODhcXHUxQ0U5LVxcdTFDRUNcXHUxQ0VFLVxcdTFDRjFcXHUxQ0Y1XFx1MUNGNlxcdTFEMDAtXFx1MURCRlxcdTFFMDAtXFx1MUYxNVxcdTFGMTgtXFx1MUYxRFxcdTFGMjAtXFx1MUY0NVxcdTFGNDgtXFx1MUY0RFxcdTFGNTAtXFx1MUY1N1xcdTFGNTlcXHUxRjVCXFx1MUY1RFxcdTFGNUYtXFx1MUY3RFxcdTFGODAtXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQwLVxcdTFGRDNcXHUxRkQ2LVxcdTFGREJcXHUxRkUwLVxcdTFGRUNcXHUxRkYyLVxcdTFGRjRcXHUxRkY2LVxcdTFGRkNcXHUyMDcxXFx1MjA3RlxcdTIwOTAtXFx1MjA5Q1xcdTIxMDJcXHUyMTA3XFx1MjEwQS1cXHUyMTEzXFx1MjExNVxcdTIxMTgtXFx1MjExRFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMkEtXFx1MjEzOVxcdTIxM0MtXFx1MjEzRlxcdTIxNDUtXFx1MjE0OVxcdTIxNEVcXHUyMTYwLVxcdTIxODhcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRUVcXHUyQ0YyXFx1MkNGM1xcdTJEMDAtXFx1MkQyNVxcdTJEMjdcXHUyRDJEXFx1MkQzMC1cXHUyRDY3XFx1MkQ2RlxcdTJEODAtXFx1MkQ5NlxcdTJEQTAtXFx1MkRBNlxcdTJEQTgtXFx1MkRBRVxcdTJEQjAtXFx1MkRCNlxcdTJEQjgtXFx1MkRCRVxcdTJEQzAtXFx1MkRDNlxcdTJEQzgtXFx1MkRDRVxcdTJERDAtXFx1MkRENlxcdTJERDgtXFx1MkRERVxcdTMwMDUtXFx1MzAwN1xcdTMwMjEtXFx1MzAyOVxcdTMwMzEtXFx1MzAzNVxcdTMwMzgtXFx1MzAzQ1xcdTMwNDEtXFx1MzA5NlxcdTMwOUItXFx1MzA5RlxcdTMwQTEtXFx1MzBGQVxcdTMwRkMtXFx1MzBGRlxcdTMxMDUtXFx1MzEyRFxcdTMxMzEtXFx1MzE4RVxcdTMxQTAtXFx1MzFCQVxcdTMxRjAtXFx1MzFGRlxcdTM0MDAtXFx1NERCNVxcdTRFMDAtXFx1OUZENVxcdUEwMDAtXFx1QTQ4Q1xcdUE0RDAtXFx1QTRGRFxcdUE1MDAtXFx1QTYwQ1xcdUE2MTAtXFx1QTYxRlxcdUE2MkFcXHVBNjJCXFx1QTY0MC1cXHVBNjZFXFx1QTY3Ri1cXHVBNjlEXFx1QTZBMC1cXHVBNkVGXFx1QTcxNy1cXHVBNzFGXFx1QTcyMi1cXHVBNzg4XFx1QTc4Qi1cXHVBN0FFXFx1QTdCMC1cXHVBN0I3XFx1QTdGNy1cXHVBODAxXFx1QTgwMy1cXHVBODA1XFx1QTgwNy1cXHVBODBBXFx1QTgwQy1cXHVBODIyXFx1QTg0MC1cXHVBODczXFx1QTg4Mi1cXHVBOEIzXFx1QThGMi1cXHVBOEY3XFx1QThGQlxcdUE4RkRcXHVBOTBBLVxcdUE5MjVcXHVBOTMwLVxcdUE5NDZcXHVBOTYwLVxcdUE5N0NcXHVBOTg0LVxcdUE5QjJcXHVBOUNGXFx1QTlFMC1cXHVBOUU0XFx1QTlFNi1cXHVBOUVGXFx1QTlGQS1cXHVBOUZFXFx1QUEwMC1cXHVBQTI4XFx1QUE0MC1cXHVBQTQyXFx1QUE0NC1cXHVBQTRCXFx1QUE2MC1cXHVBQTc2XFx1QUE3QVxcdUFBN0UtXFx1QUFBRlxcdUFBQjFcXHVBQUI1XFx1QUFCNlxcdUFBQjktXFx1QUFCRFxcdUFBQzBcXHVBQUMyXFx1QUFEQi1cXHVBQUREXFx1QUFFMC1cXHVBQUVBXFx1QUFGMi1cXHVBQUY0XFx1QUIwMS1cXHVBQjA2XFx1QUIwOS1cXHVBQjBFXFx1QUIxMS1cXHVBQjE2XFx1QUIyMC1cXHVBQjI2XFx1QUIyOC1cXHVBQjJFXFx1QUIzMC1cXHVBQjVBXFx1QUI1Qy1cXHVBQjY1XFx1QUI3MC1cXHVBQkUyXFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRFxcdUZCMUYtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkU3MC1cXHVGRTc0XFx1RkU3Ni1cXHVGRUZDXFx1RkYyMS1cXHVGRjNBXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXXxcXHVEODAwW1xcdURDMDAtXFx1REMwQlxcdURDMEQtXFx1REMyNlxcdURDMjgtXFx1REMzQVxcdURDM0NcXHVEQzNEXFx1REMzRi1cXHVEQzREXFx1REM1MC1cXHVEQzVEXFx1REM4MC1cXHVEQ0ZBXFx1REQ0MC1cXHVERDc0XFx1REU4MC1cXHVERTlDXFx1REVBMC1cXHVERUQwXFx1REYwMC1cXHVERjFGXFx1REYzMC1cXHVERjRBXFx1REY1MC1cXHVERjc1XFx1REY4MC1cXHVERjlEXFx1REZBMC1cXHVERkMzXFx1REZDOC1cXHVERkNGXFx1REZEMS1cXHVERkQ1XXxcXHVEODAxW1xcdURDMDAtXFx1REM5RFxcdURDQjAtXFx1RENEM1xcdURDRDgtXFx1RENGQlxcdUREMDAtXFx1REQyN1xcdUREMzAtXFx1REQ2M1xcdURFMDAtXFx1REYzNlxcdURGNDAtXFx1REY1NVxcdURGNjAtXFx1REY2N118XFx1RDgwMltcXHVEQzAwLVxcdURDMDVcXHVEQzA4XFx1REMwQS1cXHVEQzM1XFx1REMzN1xcdURDMzhcXHVEQzNDXFx1REMzRi1cXHVEQzU1XFx1REM2MC1cXHVEQzc2XFx1REM4MC1cXHVEQzlFXFx1RENFMC1cXHVEQ0YyXFx1RENGNFxcdURDRjVcXHVERDAwLVxcdUREMTVcXHVERDIwLVxcdUREMzlcXHVERDgwLVxcdUREQjdcXHVEREJFXFx1RERCRlxcdURFMDBcXHVERTEwLVxcdURFMTNcXHVERTE1LVxcdURFMTdcXHVERTE5LVxcdURFMzNcXHVERTYwLVxcdURFN0NcXHVERTgwLVxcdURFOUNcXHVERUMwLVxcdURFQzdcXHVERUM5LVxcdURFRTRcXHVERjAwLVxcdURGMzVcXHVERjQwLVxcdURGNTVcXHVERjYwLVxcdURGNzJcXHVERjgwLVxcdURGOTFdfFxcdUQ4MDNbXFx1REMwMC1cXHVEQzQ4XFx1REM4MC1cXHVEQ0IyXFx1RENDMC1cXHVEQ0YyXXxcXHVEODA0W1xcdURDMDMtXFx1REMzN1xcdURDODMtXFx1RENBRlxcdURDRDAtXFx1RENFOFxcdUREMDMtXFx1REQyNlxcdURENTAtXFx1REQ3MlxcdURENzZcXHVERDgzLVxcdUREQjJcXHVEREMxLVxcdUREQzRcXHVERERBXFx1REREQ1xcdURFMDAtXFx1REUxMVxcdURFMTMtXFx1REUyQlxcdURFODAtXFx1REU4NlxcdURFODhcXHVERThBLVxcdURFOERcXHVERThGLVxcdURFOURcXHVERTlGLVxcdURFQThcXHVERUIwLVxcdURFREVcXHVERjA1LVxcdURGMENcXHVERjBGXFx1REYxMFxcdURGMTMtXFx1REYyOFxcdURGMkEtXFx1REYzMFxcdURGMzJcXHVERjMzXFx1REYzNS1cXHVERjM5XFx1REYzRFxcdURGNTBcXHVERjVELVxcdURGNjFdfFxcdUQ4MDVbXFx1REMwMC1cXHVEQzM0XFx1REM0Ny1cXHVEQzRBXFx1REM4MC1cXHVEQ0FGXFx1RENDNFxcdURDQzVcXHVEQ0M3XFx1REQ4MC1cXHVEREFFXFx1REREOC1cXHVERERCXFx1REUwMC1cXHVERTJGXFx1REU0NFxcdURFODAtXFx1REVBQVxcdURGMDAtXFx1REYxOV18XFx1RDgwNltcXHVEQ0EwLVxcdURDREZcXHVEQ0ZGXFx1REVDMC1cXHVERUY4XXxcXHVEODA3W1xcdURDMDAtXFx1REMwOFxcdURDMEEtXFx1REMyRVxcdURDNDBcXHVEQzcyLVxcdURDOEZdfFxcdUQ4MDhbXFx1REMwMC1cXHVERjk5XXxcXHVEODA5W1xcdURDMDAtXFx1REM2RVxcdURDODAtXFx1REQ0M118W1xcdUQ4MENcXHVEODFDLVxcdUQ4MjBcXHVEODQwLVxcdUQ4NjhcXHVEODZBLVxcdUQ4NkNcXHVEODZGLVxcdUQ4NzJdW1xcdURDMDAtXFx1REZGRl18XFx1RDgwRFtcXHVEQzAwLVxcdURDMkVdfFxcdUQ4MTFbXFx1REMwMC1cXHVERTQ2XXxcXHVEODFBW1xcdURDMDAtXFx1REUzOFxcdURFNDAtXFx1REU1RVxcdURFRDAtXFx1REVFRFxcdURGMDAtXFx1REYyRlxcdURGNDAtXFx1REY0M1xcdURGNjMtXFx1REY3N1xcdURGN0QtXFx1REY4Rl18XFx1RDgxQltcXHVERjAwLVxcdURGNDRcXHVERjUwXFx1REY5My1cXHVERjlGXFx1REZFMF18XFx1RDgyMVtcXHVEQzAwLVxcdURGRUNdfFxcdUQ4MjJbXFx1REMwMC1cXHVERUYyXXxcXHVEODJDW1xcdURDMDBcXHVEQzAxXXxcXHVEODJGW1xcdURDMDAtXFx1REM2QVxcdURDNzAtXFx1REM3Q1xcdURDODAtXFx1REM4OFxcdURDOTAtXFx1REM5OV18XFx1RDgzNVtcXHVEQzAwLVxcdURDNTRcXHVEQzU2LVxcdURDOUNcXHVEQzlFXFx1REM5RlxcdURDQTJcXHVEQ0E1XFx1RENBNlxcdURDQTktXFx1RENBQ1xcdURDQUUtXFx1RENCOVxcdURDQkJcXHVEQ0JELVxcdURDQzNcXHVEQ0M1LVxcdUREMDVcXHVERDA3LVxcdUREMEFcXHVERDBELVxcdUREMTRcXHVERDE2LVxcdUREMUNcXHVERDFFLVxcdUREMzlcXHVERDNCLVxcdUREM0VcXHVERDQwLVxcdURENDRcXHVERDQ2XFx1REQ0QS1cXHVERDUwXFx1REQ1Mi1cXHVERUE1XFx1REVBOC1cXHVERUMwXFx1REVDMi1cXHVERURBXFx1REVEQy1cXHVERUZBXFx1REVGQy1cXHVERjE0XFx1REYxNi1cXHVERjM0XFx1REYzNi1cXHVERjRFXFx1REY1MC1cXHVERjZFXFx1REY3MC1cXHVERjg4XFx1REY4QS1cXHVERkE4XFx1REZBQS1cXHVERkMyXFx1REZDNC1cXHVERkNCXXxcXHVEODNBW1xcdURDMDAtXFx1RENDNFxcdUREMDAtXFx1REQ0M118XFx1RDgzQltcXHVERTAwLVxcdURFMDNcXHVERTA1LVxcdURFMUZcXHVERTIxXFx1REUyMlxcdURFMjRcXHVERTI3XFx1REUyOS1cXHVERTMyXFx1REUzNC1cXHVERTM3XFx1REUzOVxcdURFM0JcXHVERTQyXFx1REU0N1xcdURFNDlcXHVERTRCXFx1REU0RC1cXHVERTRGXFx1REU1MVxcdURFNTJcXHVERTU0XFx1REU1N1xcdURFNTlcXHVERTVCXFx1REU1RFxcdURFNUZcXHVERTYxXFx1REU2MlxcdURFNjRcXHVERTY3LVxcdURFNkFcXHVERTZDLVxcdURFNzJcXHVERTc0LVxcdURFNzdcXHVERTc5LVxcdURFN0NcXHVERTdFXFx1REU4MC1cXHVERTg5XFx1REU4Qi1cXHVERTlCXFx1REVBMS1cXHVERUEzXFx1REVBNS1cXHVERUE5XFx1REVBQi1cXHVERUJCXXxcXHVEODY5W1xcdURDMDAtXFx1REVENlxcdURGMDAtXFx1REZGRl18XFx1RDg2RFtcXHVEQzAwLVxcdURGMzRcXHVERjQwLVxcdURGRkZdfFxcdUQ4NkVbXFx1REMwMC1cXHVEQzFEXFx1REMyMC1cXHVERkZGXXxcXHVEODczW1xcdURDMDAtXFx1REVBMV18XFx1RDg3RVtcXHVEQzAwLVxcdURFMURdLyxcbiAgICAgICAgLy8gRUNNQVNjcmlwdCA2L1VuaWNvZGUgdjkuMC4wIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6XG4gICAgICAgIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6IC9bXFx4QUFcXHhCNVxceEI3XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDMwMC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4Ni1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNGNVxcdTAzRjctXFx1MDQ4MVxcdTA0ODMtXFx1MDQ4N1xcdTA0OEEtXFx1MDUyRlxcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNTkxLVxcdTA1QkRcXHUwNUJGXFx1MDVDMVxcdTA1QzJcXHUwNUM0XFx1MDVDNVxcdTA1QzdcXHUwNUQwLVxcdTA1RUFcXHUwNUYwLVxcdTA1RjJcXHUwNjEwLVxcdTA2MUFcXHUwNjIwLVxcdTA2NjlcXHUwNjZFLVxcdTA2RDNcXHUwNkQ1LVxcdTA2RENcXHUwNkRGLVxcdTA2RThcXHUwNkVBLVxcdTA2RkNcXHUwNkZGXFx1MDcxMC1cXHUwNzRBXFx1MDc0RC1cXHUwN0IxXFx1MDdDMC1cXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgyRFxcdTA4NDAtXFx1MDg1QlxcdTA4QTAtXFx1MDhCNFxcdTA4QjYtXFx1MDhCRFxcdTA4RDQtXFx1MDhFMVxcdTA4RTMtXFx1MDk2M1xcdTA5NjYtXFx1MDk2RlxcdTA5NzEtXFx1MDk4M1xcdTA5ODUtXFx1MDk4Q1xcdTA5OEZcXHUwOTkwXFx1MDk5My1cXHUwOUE4XFx1MDlBQS1cXHUwOUIwXFx1MDlCMlxcdTA5QjYtXFx1MDlCOVxcdTA5QkMtXFx1MDlDNFxcdTA5QzdcXHUwOUM4XFx1MDlDQi1cXHUwOUNFXFx1MDlEN1xcdTA5RENcXHUwOUREXFx1MDlERi1cXHUwOUUzXFx1MDlFNi1cXHUwOUYxXFx1MEEwMS1cXHUwQTAzXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTNDXFx1MEEzRS1cXHUwQTQyXFx1MEE0N1xcdTBBNDhcXHUwQTRCLVxcdTBBNERcXHUwQTUxXFx1MEE1OS1cXHUwQTVDXFx1MEE1RVxcdTBBNjYtXFx1MEE3NVxcdTBBODEtXFx1MEE4M1xcdTBBODUtXFx1MEE4RFxcdTBBOEYtXFx1MEE5MVxcdTBBOTMtXFx1MEFBOFxcdTBBQUEtXFx1MEFCMFxcdTBBQjJcXHUwQUIzXFx1MEFCNS1cXHUwQUI5XFx1MEFCQy1cXHUwQUM1XFx1MEFDNy1cXHUwQUM5XFx1MEFDQi1cXHUwQUNEXFx1MEFEMFxcdTBBRTAtXFx1MEFFM1xcdTBBRTYtXFx1MEFFRlxcdTBBRjlcXHUwQjAxLVxcdTBCMDNcXHUwQjA1LVxcdTBCMENcXHUwQjBGXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzJcXHUwQjMzXFx1MEIzNS1cXHUwQjM5XFx1MEIzQy1cXHUwQjQ0XFx1MEI0N1xcdTBCNDhcXHUwQjRCLVxcdTBCNERcXHUwQjU2XFx1MEI1N1xcdTBCNUNcXHUwQjVEXFx1MEI1Ri1cXHUwQjYzXFx1MEI2Ni1cXHUwQjZGXFx1MEI3MVxcdTBCODJcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCQkUtXFx1MEJDMlxcdTBCQzYtXFx1MEJDOFxcdTBCQ0EtXFx1MEJDRFxcdTBCRDBcXHUwQkQ3XFx1MEJFNi1cXHUwQkVGXFx1MEMwMC1cXHUwQzAzXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRC1cXHUwQzQ0XFx1MEM0Ni1cXHUwQzQ4XFx1MEM0QS1cXHUwQzREXFx1MEM1NVxcdTBDNTZcXHUwQzU4LVxcdTBDNUFcXHUwQzYwLVxcdTBDNjNcXHUwQzY2LVxcdTBDNkZcXHUwQzgwLVxcdTBDODNcXHUwQzg1LVxcdTBDOENcXHUwQzhFLVxcdTBDOTBcXHUwQzkyLVxcdTBDQThcXHUwQ0FBLVxcdTBDQjNcXHUwQ0I1LVxcdTBDQjlcXHUwQ0JDLVxcdTBDQzRcXHUwQ0M2LVxcdTBDQzhcXHUwQ0NBLVxcdTBDQ0RcXHUwQ0Q1XFx1MENENlxcdTBDREVcXHUwQ0UwLVxcdTBDRTNcXHUwQ0U2LVxcdTBDRUZcXHUwQ0YxXFx1MENGMlxcdTBEMDEtXFx1MEQwM1xcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0QtXFx1MEQ0NFxcdTBENDYtXFx1MEQ0OFxcdTBENEEtXFx1MEQ0RVxcdTBENTQtXFx1MEQ1N1xcdTBENUYtXFx1MEQ2M1xcdTBENjYtXFx1MEQ2RlxcdTBEN0EtXFx1MEQ3RlxcdTBEODJcXHUwRDgzXFx1MEQ4NS1cXHUwRDk2XFx1MEQ5QS1cXHUwREIxXFx1MERCMy1cXHUwREJCXFx1MERCRFxcdTBEQzAtXFx1MERDNlxcdTBEQ0FcXHUwRENGLVxcdTBERDRcXHUwREQ2XFx1MEREOC1cXHUwRERGXFx1MERFNi1cXHUwREVGXFx1MERGMlxcdTBERjNcXHUwRTAxLVxcdTBFM0FcXHUwRTQwLVxcdTBFNEVcXHUwRTUwLVxcdTBFNTlcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCOVxcdTBFQkItXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRUM4LVxcdTBFQ0RcXHUwRUQwLVxcdTBFRDlcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEYxOFxcdTBGMTlcXHUwRjIwLVxcdTBGMjlcXHUwRjM1XFx1MEYzN1xcdTBGMzlcXHUwRjNFLVxcdTBGNDdcXHUwRjQ5LVxcdTBGNkNcXHUwRjcxLVxcdTBGODRcXHUwRjg2LVxcdTBGOTdcXHUwRjk5LVxcdTBGQkNcXHUwRkM2XFx1MTAwMC1cXHUxMDQ5XFx1MTA1MC1cXHUxMDlEXFx1MTBBMC1cXHUxMEM1XFx1MTBDN1xcdTEwQ0RcXHUxMEQwLVxcdTEwRkFcXHUxMEZDLVxcdTEyNDhcXHUxMjRBLVxcdTEyNERcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1QS1cXHUxMjVEXFx1MTI2MC1cXHUxMjg4XFx1MTI4QS1cXHUxMjhEXFx1MTI5MC1cXHUxMkIwXFx1MTJCMi1cXHUxMkI1XFx1MTJCOC1cXHUxMkJFXFx1MTJDMFxcdTEyQzItXFx1MTJDNVxcdTEyQzgtXFx1MTJENlxcdTEyRDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1QVxcdTEzNUQtXFx1MTM1RlxcdTEzNjktXFx1MTM3MVxcdTEzODAtXFx1MTM4RlxcdTEzQTAtXFx1MTNGNVxcdTEzRjgtXFx1MTNGRFxcdTE0MDEtXFx1MTY2Q1xcdTE2NkYtXFx1MTY3RlxcdTE2ODEtXFx1MTY5QVxcdTE2QTAtXFx1MTZFQVxcdTE2RUUtXFx1MTZGOFxcdTE3MDAtXFx1MTcwQ1xcdTE3MEUtXFx1MTcxNFxcdTE3MjAtXFx1MTczNFxcdTE3NDAtXFx1MTc1M1xcdTE3NjAtXFx1MTc2Q1xcdTE3NkUtXFx1MTc3MFxcdTE3NzJcXHUxNzczXFx1MTc4MC1cXHUxN0QzXFx1MTdEN1xcdTE3RENcXHUxN0REXFx1MTdFMC1cXHUxN0U5XFx1MTgwQi1cXHUxODBEXFx1MTgxMC1cXHUxODE5XFx1MTgyMC1cXHUxODc3XFx1MTg4MC1cXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFFXFx1MTkyMC1cXHUxOTJCXFx1MTkzMC1cXHUxOTNCXFx1MTk0Ni1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlCMC1cXHUxOUM5XFx1MTlEMC1cXHUxOURBXFx1MUEwMC1cXHUxQTFCXFx1MUEyMC1cXHUxQTVFXFx1MUE2MC1cXHUxQTdDXFx1MUE3Ri1cXHUxQTg5XFx1MUE5MC1cXHUxQTk5XFx1MUFBN1xcdTFBQjAtXFx1MUFCRFxcdTFCMDAtXFx1MUI0QlxcdTFCNTAtXFx1MUI1OVxcdTFCNkItXFx1MUI3M1xcdTFCODAtXFx1MUJGM1xcdTFDMDAtXFx1MUMzN1xcdTFDNDAtXFx1MUM0OVxcdTFDNEQtXFx1MUM3RFxcdTFDODAtXFx1MUM4OFxcdTFDRDAtXFx1MUNEMlxcdTFDRDQtXFx1MUNGNlxcdTFDRjhcXHUxQ0Y5XFx1MUQwMC1cXHUxREY1XFx1MURGQi1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIwMENcXHUyMDBEXFx1MjAzRlxcdTIwNDBcXHUyMDU0XFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMEQwLVxcdTIwRENcXHUyMEUxXFx1MjBFNS1cXHUyMEYwXFx1MjEwMlxcdTIxMDdcXHUyMTBBLVxcdTIxMTNcXHUyMTE1XFx1MjExOC1cXHUyMTFEXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyQS1cXHUyMTM5XFx1MjEzQy1cXHUyMTNGXFx1MjE0NS1cXHUyMTQ5XFx1MjE0RVxcdTIxNjAtXFx1MjE4OFxcdTJDMDAtXFx1MkMyRVxcdTJDMzAtXFx1MkM1RVxcdTJDNjAtXFx1MkNFNFxcdTJDRUItXFx1MkNGM1xcdTJEMDAtXFx1MkQyNVxcdTJEMjdcXHUyRDJEXFx1MkQzMC1cXHUyRDY3XFx1MkQ2RlxcdTJEN0YtXFx1MkQ5NlxcdTJEQTAtXFx1MkRBNlxcdTJEQTgtXFx1MkRBRVxcdTJEQjAtXFx1MkRCNlxcdTJEQjgtXFx1MkRCRVxcdTJEQzAtXFx1MkRDNlxcdTJEQzgtXFx1MkRDRVxcdTJERDAtXFx1MkRENlxcdTJERDgtXFx1MkRERVxcdTJERTAtXFx1MkRGRlxcdTMwMDUtXFx1MzAwN1xcdTMwMjEtXFx1MzAyRlxcdTMwMzEtXFx1MzAzNVxcdTMwMzgtXFx1MzAzQ1xcdTMwNDEtXFx1MzA5NlxcdTMwOTktXFx1MzA5RlxcdTMwQTEtXFx1MzBGQVxcdTMwRkMtXFx1MzBGRlxcdTMxMDUtXFx1MzEyRFxcdTMxMzEtXFx1MzE4RVxcdTMxQTAtXFx1MzFCQVxcdTMxRjAtXFx1MzFGRlxcdTM0MDAtXFx1NERCNVxcdTRFMDAtXFx1OUZENVxcdUEwMDAtXFx1QTQ4Q1xcdUE0RDAtXFx1QTRGRFxcdUE1MDAtXFx1QTYwQ1xcdUE2MTAtXFx1QTYyQlxcdUE2NDAtXFx1QTY2RlxcdUE2NzQtXFx1QTY3RFxcdUE2N0YtXFx1QTZGMVxcdUE3MTctXFx1QTcxRlxcdUE3MjItXFx1QTc4OFxcdUE3OEItXFx1QTdBRVxcdUE3QjAtXFx1QTdCN1xcdUE3RjctXFx1QTgyN1xcdUE4NDAtXFx1QTg3M1xcdUE4ODAtXFx1QThDNVxcdUE4RDAtXFx1QThEOVxcdUE4RTAtXFx1QThGN1xcdUE4RkJcXHVBOEZEXFx1QTkwMC1cXHVBOTJEXFx1QTkzMC1cXHVBOTUzXFx1QTk2MC1cXHVBOTdDXFx1QTk4MC1cXHVBOUMwXFx1QTlDRi1cXHVBOUQ5XFx1QTlFMC1cXHVBOUZFXFx1QUEwMC1cXHVBQTM2XFx1QUE0MC1cXHVBQTREXFx1QUE1MC1cXHVBQTU5XFx1QUE2MC1cXHVBQTc2XFx1QUE3QS1cXHVBQUMyXFx1QUFEQi1cXHVBQUREXFx1QUFFMC1cXHVBQUVGXFx1QUFGMi1cXHVBQUY2XFx1QUIwMS1cXHVBQjA2XFx1QUIwOS1cXHVBQjBFXFx1QUIxMS1cXHVBQjE2XFx1QUIyMC1cXHVBQjI2XFx1QUIyOC1cXHVBQjJFXFx1QUIzMC1cXHVBQjVBXFx1QUI1Qy1cXHVBQjY1XFx1QUI3MC1cXHVBQkVBXFx1QUJFQ1xcdUFCRURcXHVBQkYwLVxcdUFCRjlcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFELVxcdUZCMjhcXHVGQjJBLVxcdUZCMzZcXHVGQjM4LVxcdUZCM0NcXHVGQjNFXFx1RkI0MFxcdUZCNDFcXHVGQjQzXFx1RkI0NFxcdUZCNDYtXFx1RkJCMVxcdUZCRDMtXFx1RkQzRFxcdUZENTAtXFx1RkQ4RlxcdUZEOTItXFx1RkRDN1xcdUZERjAtXFx1RkRGQlxcdUZFMDAtXFx1RkUwRlxcdUZFMjAtXFx1RkUyRlxcdUZFMzNcXHVGRTM0XFx1RkU0RC1cXHVGRTRGXFx1RkU3MC1cXHVGRTc0XFx1RkU3Ni1cXHVGRUZDXFx1RkYxMC1cXHVGRjE5XFx1RkYyMS1cXHVGRjNBXFx1RkYzRlxcdUZGNDEtXFx1RkY1QVxcdUZGNjYtXFx1RkZCRVxcdUZGQzItXFx1RkZDN1xcdUZGQ0EtXFx1RkZDRlxcdUZGRDItXFx1RkZEN1xcdUZGREEtXFx1RkZEQ118XFx1RDgwMFtcXHVEQzAwLVxcdURDMEJcXHVEQzBELVxcdURDMjZcXHVEQzI4LVxcdURDM0FcXHVEQzNDXFx1REMzRFxcdURDM0YtXFx1REM0RFxcdURDNTAtXFx1REM1RFxcdURDODAtXFx1RENGQVxcdURENDAtXFx1REQ3NFxcdURERkRcXHVERTgwLVxcdURFOUNcXHVERUEwLVxcdURFRDBcXHVERUUwXFx1REYwMC1cXHVERjFGXFx1REYzMC1cXHVERjRBXFx1REY1MC1cXHVERjdBXFx1REY4MC1cXHVERjlEXFx1REZBMC1cXHVERkMzXFx1REZDOC1cXHVERkNGXFx1REZEMS1cXHVERkQ1XXxcXHVEODAxW1xcdURDMDAtXFx1REM5RFxcdURDQTAtXFx1RENBOVxcdURDQjAtXFx1RENEM1xcdURDRDgtXFx1RENGQlxcdUREMDAtXFx1REQyN1xcdUREMzAtXFx1REQ2M1xcdURFMDAtXFx1REYzNlxcdURGNDAtXFx1REY1NVxcdURGNjAtXFx1REY2N118XFx1RDgwMltcXHVEQzAwLVxcdURDMDVcXHVEQzA4XFx1REMwQS1cXHVEQzM1XFx1REMzN1xcdURDMzhcXHVEQzNDXFx1REMzRi1cXHVEQzU1XFx1REM2MC1cXHVEQzc2XFx1REM4MC1cXHVEQzlFXFx1RENFMC1cXHVEQ0YyXFx1RENGNFxcdURDRjVcXHVERDAwLVxcdUREMTVcXHVERDIwLVxcdUREMzlcXHVERDgwLVxcdUREQjdcXHVEREJFXFx1RERCRlxcdURFMDAtXFx1REUwM1xcdURFMDVcXHVERTA2XFx1REUwQy1cXHVERTEzXFx1REUxNS1cXHVERTE3XFx1REUxOS1cXHVERTMzXFx1REUzOC1cXHVERTNBXFx1REUzRlxcdURFNjAtXFx1REU3Q1xcdURFODAtXFx1REU5Q1xcdURFQzAtXFx1REVDN1xcdURFQzktXFx1REVFNlxcdURGMDAtXFx1REYzNVxcdURGNDAtXFx1REY1NVxcdURGNjAtXFx1REY3MlxcdURGODAtXFx1REY5MV18XFx1RDgwM1tcXHVEQzAwLVxcdURDNDhcXHVEQzgwLVxcdURDQjJcXHVEQ0MwLVxcdURDRjJdfFxcdUQ4MDRbXFx1REMwMC1cXHVEQzQ2XFx1REM2Ni1cXHVEQzZGXFx1REM3Ri1cXHVEQ0JBXFx1RENEMC1cXHVEQ0U4XFx1RENGMC1cXHVEQ0Y5XFx1REQwMC1cXHVERDM0XFx1REQzNi1cXHVERDNGXFx1REQ1MC1cXHVERDczXFx1REQ3NlxcdUREODAtXFx1RERDNFxcdUREQ0EtXFx1RERDQ1xcdURERDAtXFx1REREQVxcdURERENcXHVERTAwLVxcdURFMTFcXHVERTEzLVxcdURFMzdcXHVERTNFXFx1REU4MC1cXHVERTg2XFx1REU4OFxcdURFOEEtXFx1REU4RFxcdURFOEYtXFx1REU5RFxcdURFOUYtXFx1REVBOFxcdURFQjAtXFx1REVFQVxcdURFRjAtXFx1REVGOVxcdURGMDAtXFx1REYwM1xcdURGMDUtXFx1REYwQ1xcdURGMEZcXHVERjEwXFx1REYxMy1cXHVERjI4XFx1REYyQS1cXHVERjMwXFx1REYzMlxcdURGMzNcXHVERjM1LVxcdURGMzlcXHVERjNDLVxcdURGNDRcXHVERjQ3XFx1REY0OFxcdURGNEItXFx1REY0RFxcdURGNTBcXHVERjU3XFx1REY1RC1cXHVERjYzXFx1REY2Ni1cXHVERjZDXFx1REY3MC1cXHVERjc0XXxcXHVEODA1W1xcdURDMDAtXFx1REM0QVxcdURDNTAtXFx1REM1OVxcdURDODAtXFx1RENDNVxcdURDQzdcXHVEQ0QwLVxcdURDRDlcXHVERDgwLVxcdUREQjVcXHVEREI4LVxcdUREQzBcXHVEREQ4LVxcdURERERcXHVERTAwLVxcdURFNDBcXHVERTQ0XFx1REU1MC1cXHVERTU5XFx1REU4MC1cXHVERUI3XFx1REVDMC1cXHVERUM5XFx1REYwMC1cXHVERjE5XFx1REYxRC1cXHVERjJCXFx1REYzMC1cXHVERjM5XXxcXHVEODA2W1xcdURDQTAtXFx1RENFOVxcdURDRkZcXHVERUMwLVxcdURFRjhdfFxcdUQ4MDdbXFx1REMwMC1cXHVEQzA4XFx1REMwQS1cXHVEQzM2XFx1REMzOC1cXHVEQzQwXFx1REM1MC1cXHVEQzU5XFx1REM3Mi1cXHVEQzhGXFx1REM5Mi1cXHVEQ0E3XFx1RENBOS1cXHVEQ0I2XXxcXHVEODA4W1xcdURDMDAtXFx1REY5OV18XFx1RDgwOVtcXHVEQzAwLVxcdURDNkVcXHVEQzgwLVxcdURENDNdfFtcXHVEODBDXFx1RDgxQy1cXHVEODIwXFx1RDg0MC1cXHVEODY4XFx1RDg2QS1cXHVEODZDXFx1RDg2Ri1cXHVEODcyXVtcXHVEQzAwLVxcdURGRkZdfFxcdUQ4MERbXFx1REMwMC1cXHVEQzJFXXxcXHVEODExW1xcdURDMDAtXFx1REU0Nl18XFx1RDgxQVtcXHVEQzAwLVxcdURFMzhcXHVERTQwLVxcdURFNUVcXHVERTYwLVxcdURFNjlcXHVERUQwLVxcdURFRURcXHVERUYwLVxcdURFRjRcXHVERjAwLVxcdURGMzZcXHVERjQwLVxcdURGNDNcXHVERjUwLVxcdURGNTlcXHVERjYzLVxcdURGNzdcXHVERjdELVxcdURGOEZdfFxcdUQ4MUJbXFx1REYwMC1cXHVERjQ0XFx1REY1MC1cXHVERjdFXFx1REY4Ri1cXHVERjlGXFx1REZFMF18XFx1RDgyMVtcXHVEQzAwLVxcdURGRUNdfFxcdUQ4MjJbXFx1REMwMC1cXHVERUYyXXxcXHVEODJDW1xcdURDMDBcXHVEQzAxXXxcXHVEODJGW1xcdURDMDAtXFx1REM2QVxcdURDNzAtXFx1REM3Q1xcdURDODAtXFx1REM4OFxcdURDOTAtXFx1REM5OVxcdURDOURcXHVEQzlFXXxcXHVEODM0W1xcdURENjUtXFx1REQ2OVxcdURENkQtXFx1REQ3MlxcdUREN0ItXFx1REQ4MlxcdUREODUtXFx1REQ4QlxcdUREQUEtXFx1RERBRFxcdURFNDItXFx1REU0NF18XFx1RDgzNVtcXHVEQzAwLVxcdURDNTRcXHVEQzU2LVxcdURDOUNcXHVEQzlFXFx1REM5RlxcdURDQTJcXHVEQ0E1XFx1RENBNlxcdURDQTktXFx1RENBQ1xcdURDQUUtXFx1RENCOVxcdURDQkJcXHVEQ0JELVxcdURDQzNcXHVEQ0M1LVxcdUREMDVcXHVERDA3LVxcdUREMEFcXHVERDBELVxcdUREMTRcXHVERDE2LVxcdUREMUNcXHVERDFFLVxcdUREMzlcXHVERDNCLVxcdUREM0VcXHVERDQwLVxcdURENDRcXHVERDQ2XFx1REQ0QS1cXHVERDUwXFx1REQ1Mi1cXHVERUE1XFx1REVBOC1cXHVERUMwXFx1REVDMi1cXHVERURBXFx1REVEQy1cXHVERUZBXFx1REVGQy1cXHVERjE0XFx1REYxNi1cXHVERjM0XFx1REYzNi1cXHVERjRFXFx1REY1MC1cXHVERjZFXFx1REY3MC1cXHVERjg4XFx1REY4QS1cXHVERkE4XFx1REZBQS1cXHVERkMyXFx1REZDNC1cXHVERkNCXFx1REZDRS1cXHVERkZGXXxcXHVEODM2W1xcdURFMDAtXFx1REUzNlxcdURFM0ItXFx1REU2Q1xcdURFNzVcXHVERTg0XFx1REU5Qi1cXHVERTlGXFx1REVBMS1cXHVERUFGXXxcXHVEODM4W1xcdURDMDAtXFx1REMwNlxcdURDMDgtXFx1REMxOFxcdURDMUItXFx1REMyMVxcdURDMjNcXHVEQzI0XFx1REMyNi1cXHVEQzJBXXxcXHVEODNBW1xcdURDMDAtXFx1RENDNFxcdURDRDAtXFx1RENENlxcdUREMDAtXFx1REQ0QVxcdURENTAtXFx1REQ1OV18XFx1RDgzQltcXHVERTAwLVxcdURFMDNcXHVERTA1LVxcdURFMUZcXHVERTIxXFx1REUyMlxcdURFMjRcXHVERTI3XFx1REUyOS1cXHVERTMyXFx1REUzNC1cXHVERTM3XFx1REUzOVxcdURFM0JcXHVERTQyXFx1REU0N1xcdURFNDlcXHVERTRCXFx1REU0RC1cXHVERTRGXFx1REU1MVxcdURFNTJcXHVERTU0XFx1REU1N1xcdURFNTlcXHVERTVCXFx1REU1RFxcdURFNUZcXHVERTYxXFx1REU2MlxcdURFNjRcXHVERTY3LVxcdURFNkFcXHVERTZDLVxcdURFNzJcXHVERTc0LVxcdURFNzdcXHVERTc5LVxcdURFN0NcXHVERTdFXFx1REU4MC1cXHVERTg5XFx1REU4Qi1cXHVERTlCXFx1REVBMS1cXHVERUEzXFx1REVBNS1cXHVERUE5XFx1REVBQi1cXHVERUJCXXxcXHVEODY5W1xcdURDMDAtXFx1REVENlxcdURGMDAtXFx1REZGRl18XFx1RDg2RFtcXHVEQzAwLVxcdURGMzRcXHVERjQwLVxcdURGRkZdfFxcdUQ4NkVbXFx1REMwMC1cXHVEQzFEXFx1REMyMC1cXHVERkZGXXxcXHVEODczW1xcdURDMDAtXFx1REVBMV18XFx1RDg3RVtcXHVEQzAwLVxcdURFMURdfFxcdURCNDBbXFx1REQwMC1cXHVEREVGXS9cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaXNEZWNpbWFsRGlnaXQoY2gpIHtcbiAgICAgICAgcmV0dXJuIDB4MzAgPD0gY2ggJiYgY2ggPD0gMHgzOTsgIC8vIDAuLjlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0hleERpZ2l0KGNoKSB7XG4gICAgICAgIHJldHVybiAweDMwIDw9IGNoICYmIGNoIDw9IDB4MzkgfHwgIC8vIDAuLjlcbiAgICAgICAgICAgIDB4NjEgPD0gY2ggJiYgY2ggPD0gMHg2NiB8fCAgICAgLy8gYS4uZlxuICAgICAgICAgICAgMHg0MSA8PSBjaCAmJiBjaCA8PSAweDQ2OyAgICAgICAvLyBBLi5GXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPY3RhbERpZ2l0KGNoKSB7XG4gICAgICAgIHJldHVybiBjaCA+PSAweDMwICYmIGNoIDw9IDB4Mzc7ICAvLyAwLi43XG4gICAgfVxuXG4gICAgLy8gNy4yIFdoaXRlIFNwYWNlXG5cbiAgICBOT05fQVNDSUlfV0hJVEVTUEFDRVMgPSBbXG4gICAgICAgIDB4MTY4MCxcbiAgICAgICAgMHgyMDAwLCAweDIwMDEsIDB4MjAwMiwgMHgyMDAzLCAweDIwMDQsIDB4MjAwNSwgMHgyMDA2LCAweDIwMDcsIDB4MjAwOCwgMHgyMDA5LCAweDIwMEEsXG4gICAgICAgIDB4MjAyRiwgMHgyMDVGLFxuICAgICAgICAweDMwMDAsXG4gICAgICAgIDB4RkVGRlxuICAgIF07XG5cbiAgICBmdW5jdGlvbiBpc1doaXRlU3BhY2UoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoID09PSAweDIwIHx8IGNoID09PSAweDA5IHx8IGNoID09PSAweDBCIHx8IGNoID09PSAweDBDIHx8IGNoID09PSAweEEwIHx8XG4gICAgICAgICAgICBjaCA+PSAweDE2ODAgJiYgTk9OX0FTQ0lJX1dISVRFU1BBQ0VTLmluZGV4T2YoY2gpID49IDA7XG4gICAgfVxuXG4gICAgLy8gNy4zIExpbmUgVGVybWluYXRvcnNcblxuICAgIGZ1bmN0aW9uIGlzTGluZVRlcm1pbmF0b3IoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoID09PSAweDBBIHx8IGNoID09PSAweDBEIHx8IGNoID09PSAweDIwMjggfHwgY2ggPT09IDB4MjAyOTtcbiAgICB9XG5cbiAgICAvLyA3LjYgSWRlbnRpZmllciBOYW1lcyBhbmQgSWRlbnRpZmllcnNcblxuICAgIGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoY3ApIHtcbiAgICAgICAgaWYgKGNwIDw9IDB4RkZGRikgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjcCk7IH1cbiAgICAgICAgdmFyIGN1MSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoTWF0aC5mbG9vcigoY3AgLSAweDEwMDAwKSAvIDB4NDAwKSArIDB4RDgwMCk7XG4gICAgICAgIHZhciBjdTIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoY3AgLSAweDEwMDAwKSAlIDB4NDAwKSArIDB4REMwMCk7XG4gICAgICAgIHJldHVybiBjdTEgKyBjdTI7XG4gICAgfVxuXG4gICAgSURFTlRJRklFUl9TVEFSVCA9IG5ldyBBcnJheSgweDgwKTtcbiAgICBmb3IoY2ggPSAwOyBjaCA8IDB4ODA7ICsrY2gpIHtcbiAgICAgICAgSURFTlRJRklFUl9TVEFSVFtjaF0gPVxuICAgICAgICAgICAgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDdBIHx8ICAvLyBhLi56XG4gICAgICAgICAgICBjaCA+PSAweDQxICYmIGNoIDw9IDB4NUEgfHwgIC8vIEEuLlpcbiAgICAgICAgICAgIGNoID09PSAweDI0IHx8IGNoID09PSAweDVGOyAgLy8gJCAoZG9sbGFyKSBhbmQgXyAodW5kZXJzY29yZSlcbiAgICB9XG5cbiAgICBJREVOVElGSUVSX1BBUlQgPSBuZXcgQXJyYXkoMHg4MCk7XG4gICAgZm9yKGNoID0gMDsgY2ggPCAweDgwOyArK2NoKSB7XG4gICAgICAgIElERU5USUZJRVJfUEFSVFtjaF0gPVxuICAgICAgICAgICAgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDdBIHx8ICAvLyBhLi56XG4gICAgICAgICAgICBjaCA+PSAweDQxICYmIGNoIDw9IDB4NUEgfHwgIC8vIEEuLlpcbiAgICAgICAgICAgIGNoID49IDB4MzAgJiYgY2ggPD0gMHgzOSB8fCAgLy8gMC4uOVxuICAgICAgICAgICAgY2ggPT09IDB4MjQgfHwgY2ggPT09IDB4NUY7ICAvLyAkIChkb2xsYXIpIGFuZCBfICh1bmRlcnNjb3JlKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllclN0YXJ0RVM1KGNoKSB7XG4gICAgICAgIHJldHVybiBjaCA8IDB4ODAgPyBJREVOVElGSUVSX1NUQVJUW2NoXSA6IEVTNVJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclN0YXJ0LnRlc3QoZnJvbUNvZGVQb2ludChjaCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllclBhcnRFUzUoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoIDwgMHg4MCA/IElERU5USUZJRVJfUEFSVFtjaF0gOiBFUzVSZWdleC5Ob25Bc2NpaUlkZW50aWZpZXJQYXJ0LnRlc3QoZnJvbUNvZGVQb2ludChjaCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllclN0YXJ0RVM2KGNoKSB7XG4gICAgICAgIHJldHVybiBjaCA8IDB4ODAgPyBJREVOVElGSUVSX1NUQVJUW2NoXSA6IEVTNlJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclN0YXJ0LnRlc3QoZnJvbUNvZGVQb2ludChjaCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllclBhcnRFUzYoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoIDwgMHg4MCA/IElERU5USUZJRVJfUEFSVFtjaF0gOiBFUzZSZWdleC5Ob25Bc2NpaUlkZW50aWZpZXJQYXJ0LnRlc3QoZnJvbUNvZGVQb2ludChjaCkpO1xuICAgIH1cblxuICAgIG1vZHVsZS5leHBvcnRzID0ge1xuICAgICAgICBpc0RlY2ltYWxEaWdpdDogaXNEZWNpbWFsRGlnaXQsXG4gICAgICAgIGlzSGV4RGlnaXQ6IGlzSGV4RGlnaXQsXG4gICAgICAgIGlzT2N0YWxEaWdpdDogaXNPY3RhbERpZ2l0LFxuICAgICAgICBpc1doaXRlU3BhY2U6IGlzV2hpdGVTcGFjZSxcbiAgICAgICAgaXNMaW5lVGVybWluYXRvcjogaXNMaW5lVGVybWluYXRvcixcbiAgICAgICAgaXNJZGVudGlmaWVyU3RhcnRFUzU6IGlzSWRlbnRpZmllclN0YXJ0RVM1LFxuICAgICAgICBpc0lkZW50aWZpZXJQYXJ0RVM1OiBpc0lkZW50aWZpZXJQYXJ0RVM1LFxuICAgICAgICBpc0lkZW50aWZpZXJTdGFydEVTNjogaXNJZGVudGlmaWVyU3RhcnRFUzYsXG4gICAgICAgIGlzSWRlbnRpZmllclBhcnRFUzY6IGlzSWRlbnRpZmllclBhcnRFUzZcbiAgICB9O1xufSgpKTtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG4iLCIvKlxuICBDb3B5cmlnaHQgKEMpIDIwMTMgWXVzdWtlIFN1enVraSA8dXRhdGFuZS50ZWFAZ21haWwuY29tPlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGNvZGUgPSByZXF1aXJlKCcuL2NvZGUnKTtcblxuICAgIGZ1bmN0aW9uIGlzU3RyaWN0TW9kZVJlc2VydmVkV29yZEVTNihpZCkge1xuICAgICAgICBzd2l0Y2ggKGlkKSB7XG4gICAgICAgIGNhc2UgJ2ltcGxlbWVudHMnOlxuICAgICAgICBjYXNlICdpbnRlcmZhY2UnOlxuICAgICAgICBjYXNlICdwYWNrYWdlJzpcbiAgICAgICAgY2FzZSAncHJpdmF0ZSc6XG4gICAgICAgIGNhc2UgJ3Byb3RlY3RlZCc6XG4gICAgICAgIGNhc2UgJ3B1YmxpYyc6XG4gICAgICAgIGNhc2UgJ3N0YXRpYyc6XG4gICAgICAgIGNhc2UgJ2xldCc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzS2V5d29yZEVTNShpZCwgc3RyaWN0KSB7XG4gICAgICAgIC8vIHlpZWxkIHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBrZXl3b3JkIHVuZGVyIG5vbi1zdHJpY3QgbW9kZS5cbiAgICAgICAgaWYgKCFzdHJpY3QgJiYgaWQgPT09ICd5aWVsZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNLZXl3b3JkRVM2KGlkLCBzdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzS2V5d29yZEVTNihpZCwgc3RyaWN0KSB7XG4gICAgICAgIGlmIChzdHJpY3QgJiYgaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkRVM2KGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGlkLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAnaWYnKSB8fCAoaWQgPT09ICdpbicpIHx8IChpZCA9PT0gJ2RvJyk7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICd2YXInKSB8fCAoaWQgPT09ICdmb3InKSB8fCAoaWQgPT09ICduZXcnKSB8fCAoaWQgPT09ICd0cnknKTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3RoaXMnKSB8fCAoaWQgPT09ICdlbHNlJykgfHwgKGlkID09PSAnY2FzZScpIHx8XG4gICAgICAgICAgICAgICAgKGlkID09PSAndm9pZCcpIHx8IChpZCA9PT0gJ3dpdGgnKSB8fCAoaWQgPT09ICdlbnVtJyk7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICd3aGlsZScpIHx8IChpZCA9PT0gJ2JyZWFrJykgfHwgKGlkID09PSAnY2F0Y2gnKSB8fFxuICAgICAgICAgICAgICAgIChpZCA9PT0gJ3Rocm93JykgfHwgKGlkID09PSAnY29uc3QnKSB8fCAoaWQgPT09ICd5aWVsZCcpIHx8XG4gICAgICAgICAgICAgICAgKGlkID09PSAnY2xhc3MnKSB8fCAoaWQgPT09ICdzdXBlcicpO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAncmV0dXJuJykgfHwgKGlkID09PSAndHlwZW9mJykgfHwgKGlkID09PSAnZGVsZXRlJykgfHxcbiAgICAgICAgICAgICAgICAoaWQgPT09ICdzd2l0Y2gnKSB8fCAoaWQgPT09ICdleHBvcnQnKSB8fCAoaWQgPT09ICdpbXBvcnQnKTtcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ2RlZmF1bHQnKSB8fCAoaWQgPT09ICdmaW5hbGx5JykgfHwgKGlkID09PSAnZXh0ZW5kcycpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAnZnVuY3Rpb24nKSB8fCAoaWQgPT09ICdjb250aW51ZScpIHx8IChpZCA9PT0gJ2RlYnVnZ2VyJyk7XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAnaW5zdGFuY2VvZicpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNSZXNlcnZlZFdvcmRFUzUoaWQsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gaWQgPT09ICdudWxsJyB8fCBpZCA9PT0gJ3RydWUnIHx8IGlkID09PSAnZmFsc2UnIHx8IGlzS2V5d29yZEVTNShpZCwgc3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Jlc2VydmVkV29yZEVTNihpZCwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBpZCA9PT0gJ251bGwnIHx8IGlkID09PSAndHJ1ZScgfHwgaWQgPT09ICdmYWxzZScgfHwgaXNLZXl3b3JkRVM2KGlkLCBzdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUmVzdHJpY3RlZFdvcmQoaWQpIHtcbiAgICAgICAgcmV0dXJuIGlkID09PSAnZXZhbCcgfHwgaWQgPT09ICdhcmd1bWVudHMnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllck5hbWVFUzUoaWQpIHtcbiAgICAgICAgdmFyIGksIGl6LCBjaDtcblxuICAgICAgICBpZiAoaWQubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgIGNoID0gaWQuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgaWYgKCFjb2RlLmlzSWRlbnRpZmllclN0YXJ0RVM1KGNoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMSwgaXogPSBpZC5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICBjaCA9IGlkLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoIWNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShjaCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVjb2RlVXRmMTYobGVhZCwgdHJhaWwpIHtcbiAgICAgICAgcmV0dXJuIChsZWFkIC0gMHhEODAwKSAqIDB4NDAwICsgKHRyYWlsIC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyTmFtZUVTNihpZCkge1xuICAgICAgICB2YXIgaSwgaXosIGNoLCBsb3dDaCwgY2hlY2s7XG5cbiAgICAgICAgaWYgKGlkLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICBjaGVjayA9IGNvZGUuaXNJZGVudGlmaWVyU3RhcnRFUzY7XG4gICAgICAgIGZvciAoaSA9IDAsIGl6ID0gaWQubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgY2ggPSBpZC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKDB4RDgwMCA8PSBjaCAmJiBjaCA8PSAweERCRkYpIHtcbiAgICAgICAgICAgICAgICArK2k7XG4gICAgICAgICAgICAgICAgaWYgKGkgPj0gaXopIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgICAgICAgICAgbG93Q2ggPSBpZC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgICAgIGlmICghKDB4REMwMCA8PSBsb3dDaCAmJiBsb3dDaCA8PSAweERGRkYpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2ggPSBkZWNvZGVVdGYxNihjaCwgbG93Q2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjaGVjayhjaCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGVjayA9IGNvZGUuaXNJZGVudGlmaWVyUGFydEVTNjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0lkZW50aWZpZXJFUzUoaWQsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gaXNJZGVudGlmaWVyTmFtZUVTNShpZCkgJiYgIWlzUmVzZXJ2ZWRXb3JkRVM1KGlkLCBzdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllckVTNihpZCwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBpc0lkZW50aWZpZXJOYW1lRVM2KGlkKSAmJiAhaXNSZXNlcnZlZFdvcmRFUzYoaWQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgICAgIGlzS2V5d29yZEVTNTogaXNLZXl3b3JkRVM1LFxuICAgICAgICBpc0tleXdvcmRFUzY6IGlzS2V5d29yZEVTNixcbiAgICAgICAgaXNSZXNlcnZlZFdvcmRFUzU6IGlzUmVzZXJ2ZWRXb3JkRVM1LFxuICAgICAgICBpc1Jlc2VydmVkV29yZEVTNjogaXNSZXNlcnZlZFdvcmRFUzYsXG4gICAgICAgIGlzUmVzdHJpY3RlZFdvcmQ6IGlzUmVzdHJpY3RlZFdvcmQsXG4gICAgICAgIGlzSWRlbnRpZmllck5hbWVFUzU6IGlzSWRlbnRpZmllck5hbWVFUzUsXG4gICAgICAgIGlzSWRlbnRpZmllck5hbWVFUzY6IGlzSWRlbnRpZmllck5hbWVFUzYsXG4gICAgICAgIGlzSWRlbnRpZmllckVTNTogaXNJZGVudGlmaWVyRVM1LFxuICAgICAgICBpc0lkZW50aWZpZXJFUzY6IGlzSWRlbnRpZmllckVTNlxuICAgIH07XG59KCkpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbiIsIi8qXG4gIENvcHlyaWdodCAoQykgMjAxMyBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIGV4cG9ydHMuYXN0ID0gcmVxdWlyZSgnLi9hc3QnKTtcbiAgICBleHBvcnRzLmNvZGUgPSByZXF1aXJlKCcuL2NvZGUnKTtcbiAgICBleHBvcnRzLmtleXdvcmQgPSByZXF1aXJlKCcuL2tleXdvcmQnKTtcbn0oKSk7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiY29uc3QgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdleHRyYWN0LXppcCcpXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm9kZS9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zXG5jb25zdCB7IGNyZWF0ZVdyaXRlU3RyZWFtLCBwcm9taXNlczogZnMgfSA9IHJlcXVpcmUoJ2ZzJylcbmNvbnN0IGdldFN0cmVhbSA9IHJlcXVpcmUoJ2dldC1zdHJlYW0nKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgeyBwcm9taXNpZnkgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuY29uc3Qgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IHlhdXpsID0gcmVxdWlyZSgneWF1emwnKVxuXG5jb25zdCBvcGVuWmlwID0gcHJvbWlzaWZ5KHlhdXpsLm9wZW4pXG5jb25zdCBwaXBlbGluZSA9IHByb21pc2lmeShzdHJlYW0ucGlwZWxpbmUpXG5cbmNsYXNzIEV4dHJhY3RvciB7XG4gIGNvbnN0cnVjdG9yICh6aXBQYXRoLCBvcHRzKSB7XG4gICAgdGhpcy56aXBQYXRoID0gemlwUGF0aFxuICAgIHRoaXMub3B0cyA9IG9wdHNcbiAgfVxuXG4gIGFzeW5jIGV4dHJhY3QgKCkge1xuICAgIGRlYnVnKCdvcGVuaW5nJywgdGhpcy56aXBQYXRoLCAnd2l0aCBvcHRzJywgdGhpcy5vcHRzKVxuXG4gICAgdGhpcy56aXBmaWxlID0gYXdhaXQgb3BlblppcCh0aGlzLnppcFBhdGgsIHsgbGF6eUVudHJpZXM6IHRydWUgfSlcbiAgICB0aGlzLmNhbmNlbGVkID0gZmFsc2VcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnppcGZpbGUub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgdGhpcy5jYW5jZWxlZCA9IHRydWVcbiAgICAgICAgcmVqZWN0KGVycilcbiAgICAgIH0pXG4gICAgICB0aGlzLnppcGZpbGUucmVhZEVudHJ5KClcblxuICAgICAgdGhpcy56aXBmaWxlLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbGVkKSB7XG4gICAgICAgICAgZGVidWcoJ3ppcCBleHRyYWN0aW9uIGNvbXBsZXRlJylcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgdGhpcy56aXBmaWxlLm9uKCdlbnRyeScsIGFzeW5jIGVudHJ5ID0+IHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmICh0aGlzLmNhbmNlbGVkKSB7XG4gICAgICAgICAgZGVidWcoJ3NraXBwaW5nIGVudHJ5JywgZW50cnkuZmlsZU5hbWUsIHsgY2FuY2VsbGVkOiB0aGlzLmNhbmNlbGVkIH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBkZWJ1ZygnemlwZmlsZSBlbnRyeScsIGVudHJ5LmZpbGVOYW1lKVxuXG4gICAgICAgIGlmIChlbnRyeS5maWxlTmFtZS5zdGFydHNXaXRoKCdfX01BQ09TWC8nKSkge1xuICAgICAgICAgIHRoaXMuemlwZmlsZS5yZWFkRW50cnkoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVzdERpciA9IHBhdGguZGlybmFtZShwYXRoLmpvaW4odGhpcy5vcHRzLmRpciwgZW50cnkuZmlsZU5hbWUpKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoZGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbERlc3REaXIgPSBhd2FpdCBmcy5yZWFscGF0aChkZXN0RGlyKVxuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlRGVzdERpciA9IHBhdGgucmVsYXRpdmUodGhpcy5vcHRzLmRpciwgY2Fub25pY2FsRGVzdERpcilcblxuICAgICAgICAgIGlmIChyZWxhdGl2ZURlc3REaXIuc3BsaXQocGF0aC5zZXApLmluY2x1ZGVzKCcuLicpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dCBvZiBib3VuZCBwYXRoIFwiJHtjYW5vbmljYWxEZXN0RGlyfVwiIGZvdW5kIHdoaWxlIHByb2Nlc3NpbmcgZmlsZSAke2VudHJ5LmZpbGVOYW1lfWApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5leHRyYWN0RW50cnkoZW50cnkpXG4gICAgICAgICAgZGVidWcoJ2ZpbmlzaGVkIHByb2Nlc3NpbmcnLCBlbnRyeS5maWxlTmFtZSlcbiAgICAgICAgICB0aGlzLnppcGZpbGUucmVhZEVudHJ5KClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5jYW5jZWxlZCA9IHRydWVcbiAgICAgICAgICB0aGlzLnppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGV4dHJhY3RFbnRyeSAoZW50cnkpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodGhpcy5jYW5jZWxlZCkge1xuICAgICAgZGVidWcoJ3NraXBwaW5nIGVudHJ5IGV4dHJhY3Rpb24nLCBlbnRyeS5maWxlTmFtZSwgeyBjYW5jZWxsZWQ6IHRoaXMuY2FuY2VsZWQgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMub25FbnRyeSkge1xuICAgICAgdGhpcy5vcHRzLm9uRW50cnkoZW50cnksIHRoaXMuemlwZmlsZSlcbiAgICB9XG5cbiAgICBjb25zdCBkZXN0ID0gcGF0aC5qb2luKHRoaXMub3B0cy5kaXIsIGVudHJ5LmZpbGVOYW1lKVxuXG4gICAgLy8gY29udmVydCBleHRlcm5hbCBmaWxlIGF0dHIgaW50IGludG8gYSBmcyBzdGF0IG1vZGUgaW50XG4gICAgY29uc3QgbW9kZSA9IChlbnRyeS5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4RkZGRlxuICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBzeW1saW5rIG9yIGRpciAodXNpbmcgc3RhdCBtb2RlIGNvbnN0YW50cylcbiAgICBjb25zdCBJRk1UID0gNjE0NDBcbiAgICBjb25zdCBJRkRJUiA9IDE2Mzg0XG4gICAgY29uc3QgSUZMTksgPSA0MDk2MFxuICAgIGNvbnN0IHN5bWxpbmsgPSAobW9kZSAmIElGTVQpID09PSBJRkxOS1xuICAgIGxldCBpc0RpciA9IChtb2RlICYgSUZNVCkgPT09IElGRElSXG5cbiAgICAvLyBGYWlsc2FmZSwgYm9ycm93ZWQgZnJvbSBqc1ppcFxuICAgIGlmICghaXNEaXIgJiYgZW50cnkuZmlsZU5hbWUuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgaXNEaXIgPSB0cnVlXG4gICAgfVxuXG4gICAgLy8gY2hlY2sgZm9yIHdpbmRvd3Mgd2VpcmQgd2F5IG9mIHNwZWNpZnlpbmcgYSBkaXJlY3RvcnlcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWF4b2dkZW4vZXh0cmFjdC16aXAvaXNzdWVzLzEzI2lzc3VlY29tbWVudC0xNTQ0OTQ1NjZcbiAgICBjb25zdCBtYWRlQnkgPSBlbnRyeS52ZXJzaW9uTWFkZUJ5ID4+IDhcbiAgICBpZiAoIWlzRGlyKSBpc0RpciA9IChtYWRlQnkgPT09IDAgJiYgZW50cnkuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyA9PT0gMTYpXG5cbiAgICBkZWJ1ZygnZXh0cmFjdGluZyBlbnRyeScsIHsgZmlsZW5hbWU6IGVudHJ5LmZpbGVOYW1lLCBpc0RpcjogaXNEaXIsIGlzU3ltbGluazogc3ltbGluayB9KVxuXG4gICAgY29uc3QgcHJvY01vZGUgPSB0aGlzLmdldEV4dHJhY3RlZE1vZGUobW9kZSwgaXNEaXIpICYgMG83NzdcblxuICAgIC8vIGFsd2F5cyBlbnN1cmUgZm9sZGVycyBhcmUgY3JlYXRlZFxuICAgIGNvbnN0IGRlc3REaXIgPSBpc0RpciA/IGRlc3QgOiBwYXRoLmRpcm5hbWUoZGVzdClcblxuICAgIGNvbnN0IG1rZGlyT3B0aW9ucyA9IHsgcmVjdXJzaXZlOiB0cnVlIH1cbiAgICBpZiAoaXNEaXIpIHtcbiAgICAgIG1rZGlyT3B0aW9ucy5tb2RlID0gcHJvY01vZGVcbiAgICB9XG4gICAgZGVidWcoJ21rZGlyJywgeyBkaXI6IGRlc3REaXIsIC4uLm1rZGlyT3B0aW9ucyB9KVxuICAgIGF3YWl0IGZzLm1rZGlyKGRlc3REaXIsIG1rZGlyT3B0aW9ucylcbiAgICBpZiAoaXNEaXIpIHJldHVyblxuXG4gICAgZGVidWcoJ29wZW5pbmcgcmVhZCBzdHJlYW0nLCBkZXN0KVxuICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBhd2FpdCBwcm9taXNpZnkodGhpcy56aXBmaWxlLm9wZW5SZWFkU3RyZWFtLmJpbmQodGhpcy56aXBmaWxlKSkoZW50cnkpXG5cbiAgICBpZiAoc3ltbGluaykge1xuICAgICAgY29uc3QgbGluayA9IGF3YWl0IGdldFN0cmVhbShyZWFkU3RyZWFtKVxuICAgICAgZGVidWcoJ2NyZWF0aW5nIHN5bWxpbmsnLCBsaW5rLCBkZXN0KVxuICAgICAgYXdhaXQgZnMuc3ltbGluayhsaW5rLCBkZXN0KVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBwaXBlbGluZShyZWFkU3RyZWFtLCBjcmVhdGVXcml0ZVN0cmVhbShkZXN0LCB7IG1vZGU6IHByb2NNb2RlIH0pKVxuICAgIH1cbiAgfVxuXG4gIGdldEV4dHJhY3RlZE1vZGUgKGVudHJ5TW9kZSwgaXNEaXIpIHtcbiAgICBsZXQgbW9kZSA9IGVudHJ5TW9kZVxuICAgIC8vIFNldCBkZWZhdWx0cywgaWYgbmVjZXNzYXJ5XG4gICAgaWYgKG1vZGUgPT09IDApIHtcbiAgICAgIGlmIChpc0Rpcikge1xuICAgICAgICBpZiAodGhpcy5vcHRzLmRlZmF1bHREaXJNb2RlKSB7XG4gICAgICAgICAgbW9kZSA9IHBhcnNlSW50KHRoaXMub3B0cy5kZWZhdWx0RGlyTW9kZSwgMTApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW1vZGUpIHtcbiAgICAgICAgICBtb2RlID0gMG83NTVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5kZWZhdWx0RmlsZU1vZGUpIHtcbiAgICAgICAgICBtb2RlID0gcGFyc2VJbnQodGhpcy5vcHRzLmRlZmF1bHRGaWxlTW9kZSwgMTApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW1vZGUpIHtcbiAgICAgICAgICBtb2RlID0gMG82NDRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2RlXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyBmdW5jdGlvbiAoemlwUGF0aCwgb3B0cykge1xuICBkZWJ1ZygnY3JlYXRpbmcgdGFyZ2V0IGRpcmVjdG9yeScsIG9wdHMuZGlyKVxuXG4gIGlmICghcGF0aC5pc0Fic29sdXRlKG9wdHMuZGlyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGRpcmVjdG9yeSBpcyBleHBlY3RlZCB0byBiZSBhYnNvbHV0ZScpXG4gIH1cblxuICBhd2FpdCBmcy5ta2RpcihvcHRzLmRpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgb3B0cy5kaXIgPSBhd2FpdCBmcy5yZWFscGF0aChvcHRzLmRpcilcbiAgcmV0dXJuIG5ldyBFeHRyYWN0b3IoemlwUGF0aCwgb3B0cykuZXh0cmFjdCgpXG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGNsYXNzIEZpeGVkRklGTyB7XG4gIGNvbnN0cnVjdG9yIChod20pIHtcbiAgICBpZiAoIShod20gPiAwKSB8fCAoKGh3bSAtIDEpICYgaHdtKSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdNYXggc2l6ZSBmb3IgYSBGaXhlZEZJRk8gc2hvdWxkIGJlIGEgcG93ZXIgb2YgdHdvJylcbiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheShod20pXG4gICAgdGhpcy5tYXNrID0gaHdtIC0gMVxuICAgIHRoaXMudG9wID0gMFxuICAgIHRoaXMuYnRtID0gMFxuICAgIHRoaXMubmV4dCA9IG51bGxcbiAgfVxuXG4gIGNsZWFyICgpIHtcbiAgICB0aGlzLnRvcCA9IHRoaXMuYnRtID0gMFxuICAgIHRoaXMubmV4dCA9IG51bGxcbiAgICB0aGlzLmJ1ZmZlci5maWxsKHVuZGVmaW5lZClcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBpZiAodGhpcy5idWZmZXJbdGhpcy50b3BdICE9PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZVxuICAgIHRoaXMuYnVmZmVyW3RoaXMudG9wXSA9IGRhdGFcbiAgICB0aGlzLnRvcCA9ICh0aGlzLnRvcCArIDEpICYgdGhpcy5tYXNrXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5idWZmZXJbdGhpcy5idG1dXG4gICAgaWYgKGxhc3QgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHRoaXMuYnVmZmVyW3RoaXMuYnRtXSA9IHVuZGVmaW5lZFxuICAgIHRoaXMuYnRtID0gKHRoaXMuYnRtICsgMSkgJiB0aGlzLm1hc2tcbiAgICByZXR1cm4gbGFzdFxuICB9XG5cbiAgcGVlayAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuYnRtXVxuICB9XG5cbiAgaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuYnRtXSA9PT0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImNvbnN0IEZpeGVkRklGTyA9IHJlcXVpcmUoJy4vZml4ZWQtc2l6ZScpXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRmFzdEZJRk8ge1xuICBjb25zdHJ1Y3RvciAoaHdtKSB7XG4gICAgdGhpcy5od20gPSBod20gfHwgMTZcbiAgICB0aGlzLmhlYWQgPSBuZXcgRml4ZWRGSUZPKHRoaXMuaHdtKVxuICAgIHRoaXMudGFpbCA9IHRoaXMuaGVhZFxuICAgIHRoaXMubGVuZ3RoID0gMFxuICB9XG5cbiAgY2xlYXIgKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbFxuICAgIHRoaXMuaGVhZC5jbGVhcigpXG4gICAgdGhpcy5sZW5ndGggPSAwXG4gIH1cblxuICBwdXNoICh2YWwpIHtcbiAgICB0aGlzLmxlbmd0aCsrXG4gICAgaWYgKCF0aGlzLmhlYWQucHVzaCh2YWwpKSB7XG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5oZWFkXG4gICAgICB0aGlzLmhlYWQgPSBwcmV2Lm5leHQgPSBuZXcgRml4ZWRGSUZPKDIgKiB0aGlzLmhlYWQuYnVmZmVyLmxlbmd0aClcbiAgICAgIHRoaXMuaGVhZC5wdXNoKHZhbClcbiAgICB9XG4gIH1cblxuICBzaGlmdCAoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoICE9PSAwKSB0aGlzLmxlbmd0aC0tXG4gICAgY29uc3QgdmFsID0gdGhpcy50YWlsLnNoaWZ0KClcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgJiYgdGhpcy50YWlsLm5leHQpIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnRhaWwubmV4dFxuICAgICAgdGhpcy50YWlsLm5leHQgPSBudWxsXG4gICAgICB0aGlzLnRhaWwgPSBuZXh0XG4gICAgICByZXR1cm4gdGhpcy50YWlsLnNoaWZ0KClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsXG4gIH1cblxuICBwZWVrICgpIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLnRhaWwucGVlaygpXG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkICYmIHRoaXMudGFpbC5uZXh0KSByZXR1cm4gdGhpcy50YWlsLm5leHQucGVlaygpXG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwXG4gIH1cbn1cbiIsInZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbnZhciBSZWFkYWJsZSA9IHN0cmVhbS5SZWFkYWJsZTtcbnZhciBXcml0YWJsZSA9IHN0cmVhbS5Xcml0YWJsZTtcbnZhciBQYXNzVGhyb3VnaCA9IHN0cmVhbS5QYXNzVGhyb3VnaDtcbnZhciBQZW5kID0gcmVxdWlyZSgncGVuZCcpO1xudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcblxuZXhwb3J0cy5jcmVhdGVGcm9tQnVmZmVyID0gY3JlYXRlRnJvbUJ1ZmZlcjtcbmV4cG9ydHMuY3JlYXRlRnJvbUZkID0gY3JlYXRlRnJvbUZkO1xuZXhwb3J0cy5CdWZmZXJTbGljZXIgPSBCdWZmZXJTbGljZXI7XG5leHBvcnRzLkZkU2xpY2VyID0gRmRTbGljZXI7XG5cbnV0aWwuaW5oZXJpdHMoRmRTbGljZXIsIEV2ZW50RW1pdHRlcik7XG5mdW5jdGlvbiBGZFNsaWNlcihmZCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XG5cbiAgdGhpcy5mZCA9IGZkO1xuICB0aGlzLnBlbmQgPSBuZXcgUGVuZCgpO1xuICB0aGlzLnBlbmQubWF4ID0gMTtcbiAgdGhpcy5yZWZDb3VudCA9IDA7XG4gIHRoaXMuYXV0b0Nsb3NlID0gISFvcHRpb25zLmF1dG9DbG9zZTtcbn1cblxuRmRTbGljZXIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLnBlbmQuZ28oZnVuY3Rpb24oY2IpIHtcbiAgICBmcy5yZWFkKHNlbGYuZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBmdW5jdGlvbihlcnIsIGJ5dGVzUmVhZCwgYnVmZmVyKSB7XG4gICAgICBjYigpO1xuICAgICAgY2FsbGJhY2soZXJyLCBieXRlc1JlYWQsIGJ1ZmZlcik7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuRmRTbGljZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5wZW5kLmdvKGZ1bmN0aW9uKGNiKSB7XG4gICAgZnMud3JpdGUoc2VsZi5mZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGZ1bmN0aW9uKGVyciwgd3JpdHRlbiwgYnVmZmVyKSB7XG4gICAgICBjYigpO1xuICAgICAgY2FsbGJhY2soZXJyLCB3cml0dGVuLCBidWZmZXIpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbkZkU2xpY2VyLnByb3RvdHlwZS5jcmVhdGVSZWFkU3RyZWFtID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICByZXR1cm4gbmV3IFJlYWRTdHJlYW0odGhpcywgb3B0aW9ucyk7XG59O1xuXG5GZFNsaWNlci5wcm90b3R5cGUuY3JlYXRlV3JpdGVTdHJlYW0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgV3JpdGVTdHJlYW0odGhpcywgb3B0aW9ucyk7XG59O1xuXG5GZFNsaWNlci5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVmQ291bnQgKz0gMTtcbn07XG5cbkZkU2xpY2VyLnByb3RvdHlwZS51bnJlZiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYucmVmQ291bnQgLT0gMTtcblxuICBpZiAoc2VsZi5yZWZDb3VudCA+IDApIHJldHVybjtcbiAgaWYgKHNlbGYucmVmQ291bnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHVucmVmXCIpO1xuXG4gIGlmIChzZWxmLmF1dG9DbG9zZSkge1xuICAgIGZzLmNsb3NlKHNlbGYuZmQsIG9uQ2xvc2VEb25lKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQ2xvc2VEb25lKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLmVtaXQoJ2Nsb3NlJyk7XG4gICAgfVxuICB9XG59O1xuXG51dGlsLmluaGVyaXRzKFJlYWRTdHJlYW0sIFJlYWRhYmxlKTtcbmZ1bmN0aW9uIFJlYWRTdHJlYW0oY29udGV4dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLmNvbnRleHQucmVmKCk7XG5cbiAgdGhpcy5zdGFydCA9IG9wdGlvbnMuc3RhcnQgfHwgMDtcbiAgdGhpcy5lbmRPZmZzZXQgPSBvcHRpb25zLmVuZDtcbiAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xufVxuXG5SZWFkU3RyZWFtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVybjtcblxuICB2YXIgdG9SZWFkID0gTWF0aC5taW4oc2VsZi5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrLCBuKTtcbiAgaWYgKHNlbGYuZW5kT2Zmc2V0ICE9IG51bGwpIHtcbiAgICB0b1JlYWQgPSBNYXRoLm1pbih0b1JlYWQsIHNlbGYuZW5kT2Zmc2V0IC0gc2VsZi5wb3MpO1xuICB9XG4gIGlmICh0b1JlYWQgPD0gMCkge1xuICAgIHNlbGYuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gICAgc2VsZi5jb250ZXh0LnVucmVmKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYuY29udGV4dC5wZW5kLmdvKGZ1bmN0aW9uKGNiKSB7XG4gICAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm4gY2IoKTtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEJ1ZmZlcih0b1JlYWQpO1xuICAgIGZzLnJlYWQoc2VsZi5jb250ZXh0LmZkLCBidWZmZXIsIDAsIHRvUmVhZCwgc2VsZi5wb3MsIGZ1bmN0aW9uKGVyciwgYnl0ZXNSZWFkKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHNlbGYuZGVzdHJveShlcnIpO1xuICAgICAgfSBlbHNlIGlmIChieXRlc1JlYWQgPT09IDApIHtcbiAgICAgICAgc2VsZi5kZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLnB1c2gobnVsbCk7XG4gICAgICAgIHNlbGYuY29udGV4dC51bnJlZigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5wb3MgKz0gYnl0ZXNSZWFkO1xuICAgICAgICBzZWxmLnB1c2goYnVmZmVyLnNsaWNlKDAsIGJ5dGVzUmVhZCkpO1xuICAgICAgfVxuICAgICAgY2IoKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5SZWFkU3RyZWFtLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oZXJyKSB7XG4gIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICBlcnIgPSBlcnIgfHwgbmV3IEVycm9yKFwic3RyZWFtIGRlc3Ryb3llZFwiKTtcbiAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgdGhpcy5jb250ZXh0LnVucmVmKCk7XG59O1xuXG51dGlsLmluaGVyaXRzKFdyaXRlU3RyZWFtLCBXcml0YWJsZSk7XG5mdW5jdGlvbiBXcml0ZVN0cmVhbShjb250ZXh0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuY29udGV4dC5yZWYoKTtcblxuICB0aGlzLnN0YXJ0ID0gb3B0aW9ucy5zdGFydCB8fCAwO1xuICB0aGlzLmVuZE9mZnNldCA9IChvcHRpb25zLmVuZCA9PSBudWxsKSA/IEluZmluaXR5IDogK29wdGlvbnMuZW5kO1xuICB0aGlzLmJ5dGVzV3JpdHRlbiA9IDA7XG4gIHRoaXMucG9zID0gdGhpcy5zdGFydDtcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICB0aGlzLm9uKCdmaW5pc2gnLCB0aGlzLmRlc3Ryb3kuYmluZCh0aGlzKSk7XG59XG5cbldyaXRlU3RyZWFtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbihidWZmZXIsIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gIGlmIChzZWxmLnBvcyArIGJ1ZmZlci5sZW5ndGggPiBzZWxmLmVuZE9mZnNldCkge1xuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXCJtYXhpbXVtIGZpbGUgbGVuZ3RoIGV4Y2VlZGVkXCIpO1xuICAgIGVyci5jb2RlID0gJ0VUT09CSUcnO1xuICAgIHNlbGYuZGVzdHJveSgpO1xuICAgIGNhbGxiYWNrKGVycik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYuY29udGV4dC5wZW5kLmdvKGZ1bmN0aW9uKGNiKSB7XG4gICAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm4gY2IoKTtcbiAgICBmcy53cml0ZShzZWxmLmNvbnRleHQuZmQsIGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgc2VsZi5wb3MsIGZ1bmN0aW9uKGVyciwgYnl0ZXMpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgc2VsZi5kZXN0cm95KCk7XG4gICAgICAgIGNiKCk7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmJ5dGVzV3JpdHRlbiArPSBieXRlcztcbiAgICAgICAgc2VsZi5wb3MgKz0gYnl0ZXM7XG4gICAgICAgIHNlbGYuZW1pdCgncHJvZ3Jlc3MnKTtcbiAgICAgICAgY2IoKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuXG5Xcml0ZVN0cmVhbS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICB0aGlzLmNvbnRleHQudW5yZWYoKTtcbn07XG5cbnV0aWwuaW5oZXJpdHMoQnVmZmVyU2xpY2VyLCBFdmVudEVtaXR0ZXIpO1xuZnVuY3Rpb24gQnVmZmVyU2xpY2VyKGJ1ZmZlciwgb3B0aW9ucykge1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5yZWZDb3VudCA9IDA7XG4gIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICB0aGlzLm1heENodW5rU2l6ZSA9IG9wdGlvbnMubWF4Q2h1bmtTaXplIHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5CdWZmZXJTbGljZXIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spIHtcbiAgdmFyIGVuZCA9IHBvc2l0aW9uICsgbGVuZ3RoO1xuICB2YXIgZGVsdGEgPSBlbmQgLSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gIHZhciB3cml0dGVuID0gKGRlbHRhID4gMCkgPyBkZWx0YSA6IGxlbmd0aDtcbiAgdGhpcy5idWZmZXIuY29weShidWZmZXIsIG9mZnNldCwgcG9zaXRpb24sIGVuZCk7XG4gIHNldEltbWVkaWF0ZShmdW5jdGlvbigpIHtcbiAgICBjYWxsYmFjayhudWxsLCB3cml0dGVuKTtcbiAgfSk7XG59O1xuXG5CdWZmZXJTbGljZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIGJ1ZmZlci5jb3B5KHRoaXMuYnVmZmVyLCBwb3NpdGlvbiwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpO1xuICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgY2FsbGJhY2sobnVsbCwgbGVuZ3RoLCBidWZmZXIpO1xuICB9KTtcbn07XG5cbkJ1ZmZlclNsaWNlci5wcm90b3R5cGUuY3JlYXRlUmVhZFN0cmVhbSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciByZWFkU3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuICByZWFkU3RyZWFtLmRlc3Ryb3llZCA9IGZhbHNlO1xuICByZWFkU3RyZWFtLnN0YXJ0ID0gb3B0aW9ucy5zdGFydCB8fCAwO1xuICByZWFkU3RyZWFtLmVuZE9mZnNldCA9IG9wdGlvbnMuZW5kO1xuICAvLyBieSB0aGUgdGltZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHdlJ2xsIGJlIGRvbmUuXG4gIHJlYWRTdHJlYW0ucG9zID0gcmVhZFN0cmVhbS5lbmRPZmZzZXQgfHwgdGhpcy5idWZmZXIubGVuZ3RoO1xuXG4gIC8vIHJlc3BlY3QgdGhlIG1heENodW5rU2l6ZSBvcHRpb24gdG8gc2xpY2UgdXAgdGhlIGNodW5rIGludG8gc21hbGxlciBwaWVjZXMuXG4gIHZhciBlbnRpcmVTbGljZSA9IHRoaXMuYnVmZmVyLnNsaWNlKHJlYWRTdHJlYW0uc3RhcnQsIHJlYWRTdHJlYW0ucG9zKTtcbiAgdmFyIG9mZnNldCA9IDA7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG5leHRPZmZzZXQgPSBvZmZzZXQgKyB0aGlzLm1heENodW5rU2l6ZTtcbiAgICBpZiAobmV4dE9mZnNldCA+PSBlbnRpcmVTbGljZS5sZW5ndGgpIHtcbiAgICAgIC8vIGxhc3QgY2h1bmtcbiAgICAgIGlmIChvZmZzZXQgPCBlbnRpcmVTbGljZS5sZW5ndGgpIHtcbiAgICAgICAgcmVhZFN0cmVhbS53cml0ZShlbnRpcmVTbGljZS5zbGljZShvZmZzZXQsIGVudGlyZVNsaWNlLmxlbmd0aCkpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJlYWRTdHJlYW0ud3JpdGUoZW50aXJlU2xpY2Uuc2xpY2Uob2Zmc2V0LCBuZXh0T2Zmc2V0KSk7XG4gICAgb2Zmc2V0ID0gbmV4dE9mZnNldDtcbiAgfVxuXG4gIHJlYWRTdHJlYW0uZW5kKCk7XG4gIHJlYWRTdHJlYW0uZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIHJlYWRTdHJlYW0uZGVzdHJveWVkID0gdHJ1ZTtcbiAgfTtcbiAgcmV0dXJuIHJlYWRTdHJlYW07XG59O1xuXG5CdWZmZXJTbGljZXIucHJvdG90eXBlLmNyZWF0ZVdyaXRlU3RyZWFtID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICB2YXIgYnVmZmVyU2xpY2VyID0gdGhpcztcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB3cml0ZVN0cmVhbSA9IG5ldyBXcml0YWJsZShvcHRpb25zKTtcbiAgd3JpdGVTdHJlYW0uc3RhcnQgPSBvcHRpb25zLnN0YXJ0IHx8IDA7XG4gIHdyaXRlU3RyZWFtLmVuZE9mZnNldCA9IChvcHRpb25zLmVuZCA9PSBudWxsKSA/IHRoaXMuYnVmZmVyLmxlbmd0aCA6ICtvcHRpb25zLmVuZDtcbiAgd3JpdGVTdHJlYW0uYnl0ZXNXcml0dGVuID0gMDtcbiAgd3JpdGVTdHJlYW0ucG9zID0gd3JpdGVTdHJlYW0uc3RhcnQ7XG4gIHdyaXRlU3RyZWFtLmRlc3Ryb3llZCA9IGZhbHNlO1xuICB3cml0ZVN0cmVhbS5fd3JpdGUgPSBmdW5jdGlvbihidWZmZXIsIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgIGlmICh3cml0ZVN0cmVhbS5kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBlbmQgPSB3cml0ZVN0cmVhbS5wb3MgKyBidWZmZXIubGVuZ3RoO1xuICAgIGlmIChlbmQgPiB3cml0ZVN0cmVhbS5lbmRPZmZzZXQpIHtcbiAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXCJtYXhpbXVtIGZpbGUgbGVuZ3RoIGV4Y2VlZGVkXCIpO1xuICAgICAgZXJyLmNvZGUgPSAnRVRPT0JJRyc7XG4gICAgICB3cml0ZVN0cmVhbS5kZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYnVmZmVyLmNvcHkoYnVmZmVyU2xpY2VyLmJ1ZmZlciwgd3JpdGVTdHJlYW0ucG9zLCAwLCBidWZmZXIubGVuZ3RoKTtcblxuICAgIHdyaXRlU3RyZWFtLmJ5dGVzV3JpdHRlbiArPSBidWZmZXIubGVuZ3RoO1xuICAgIHdyaXRlU3RyZWFtLnBvcyA9IGVuZDtcbiAgICB3cml0ZVN0cmVhbS5lbWl0KCdwcm9ncmVzcycpO1xuICAgIGNhbGxiYWNrKCk7XG4gIH07XG4gIHdyaXRlU3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICB3cml0ZVN0cmVhbS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9O1xuICByZXR1cm4gd3JpdGVTdHJlYW07XG59O1xuXG5CdWZmZXJTbGljZXIucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJlZkNvdW50ICs9IDE7XG59O1xuXG5CdWZmZXJTbGljZXIucHJvdG90eXBlLnVucmVmID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVmQ291bnQgLT0gMTtcblxuICBpZiAodGhpcy5yZWZDb3VudCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHVucmVmXCIpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVGcm9tQnVmZmVyKGJ1ZmZlciwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEJ1ZmZlclNsaWNlcihidWZmZXIsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcm9tRmQoZmQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBGZFNsaWNlcihmZCwgb3B0aW9ucyk7XG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCdncmFjZWZ1bC1mcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCBta2RpcnNTeW5jID0gcmVxdWlyZSgnLi4vbWtkaXJzJykubWtkaXJzU3luY1xuY29uc3QgdXRpbWVzTWlsbGlzU3luYyA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbWVzJykudXRpbWVzTWlsbGlzU3luY1xuY29uc3Qgc3RhdCA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmZ1bmN0aW9uIGNvcHlTeW5jIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgb3B0cyA9IHsgZmlsdGVyOiBvcHRzIH1cbiAgfVxuXG4gIG9wdHMgPSBvcHRzIHx8IHt9XG4gIG9wdHMuY2xvYmJlciA9ICdjbG9iYmVyJyBpbiBvcHRzID8gISFvcHRzLmNsb2JiZXIgOiB0cnVlIC8vIGRlZmF1bHQgdG8gdHJ1ZSBmb3Igbm93XG4gIG9wdHMub3ZlcndyaXRlID0gJ292ZXJ3cml0ZScgaW4gb3B0cyA/ICEhb3B0cy5vdmVyd3JpdGUgOiBvcHRzLmNsb2JiZXIgLy8gb3ZlcndyaXRlIGZhbGxzIGJhY2sgdG8gY2xvYmJlclxuXG4gIC8vIFdhcm4gYWJvdXQgdXNpbmcgcHJlc2VydmVUaW1lc3RhbXBzIG9uIDMyLWJpdCBub2RlXG4gIGlmIChvcHRzLnByZXNlcnZlVGltZXN0YW1wcyAmJiBwcm9jZXNzLmFyY2ggPT09ICdpYTMyJykge1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoXG4gICAgICAnVXNpbmcgdGhlIHByZXNlcnZlVGltZXN0YW1wcyBvcHRpb24gaW4gMzItYml0IG5vZGUgaXMgbm90IHJlY29tbWVuZGVkO1xcblxcbicgK1xuICAgICAgJ1xcdHNlZSBodHRwczovL2dpdGh1Yi5jb20vanByaWNoYXJkc29uL25vZGUtZnMtZXh0cmEvaXNzdWVzLzI2OScsXG4gICAgICAnV2FybmluZycsICdmcy1leHRyYS1XQVJOMDAwMidcbiAgICApXG4gIH1cblxuICBjb25zdCB7IHNyY1N0YXQsIGRlc3RTdGF0IH0gPSBzdGF0LmNoZWNrUGF0aHNTeW5jKHNyYywgZGVzdCwgJ2NvcHknLCBvcHRzKVxuICBzdGF0LmNoZWNrUGFyZW50UGF0aHNTeW5jKHNyYywgc3JjU3RhdCwgZGVzdCwgJ2NvcHknKVxuICBpZiAob3B0cy5maWx0ZXIgJiYgIW9wdHMuZmlsdGVyKHNyYywgZGVzdCkpIHJldHVyblxuICBjb25zdCBkZXN0UGFyZW50ID0gcGF0aC5kaXJuYW1lKGRlc3QpXG4gIGlmICghZnMuZXhpc3RzU3luYyhkZXN0UGFyZW50KSkgbWtkaXJzU3luYyhkZXN0UGFyZW50KVxuICByZXR1cm4gZ2V0U3RhdHMoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdHMgKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgY29uc3Qgc3RhdFN5bmMgPSBvcHRzLmRlcmVmZXJlbmNlID8gZnMuc3RhdFN5bmMgOiBmcy5sc3RhdFN5bmNcbiAgY29uc3Qgc3JjU3RhdCA9IHN0YXRTeW5jKHNyYylcblxuICBpZiAoc3JjU3RhdC5pc0RpcmVjdG9yeSgpKSByZXR1cm4gb25EaXIoc3JjU3RhdCwgZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgZWxzZSBpZiAoc3JjU3RhdC5pc0ZpbGUoKSB8fFxuICAgICAgICAgICBzcmNTdGF0LmlzQ2hhcmFjdGVyRGV2aWNlKCkgfHxcbiAgICAgICAgICAgc3JjU3RhdC5pc0Jsb2NrRGV2aWNlKCkpIHJldHVybiBvbkZpbGUoc3JjU3RhdCwgZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgZWxzZSBpZiAoc3JjU3RhdC5pc1N5bWJvbGljTGluaygpKSByZXR1cm4gb25MaW5rKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG4gIGVsc2UgaWYgKHNyY1N0YXQuaXNTb2NrZXQoKSkgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29weSBhIHNvY2tldCBmaWxlOiAke3NyY31gKVxuICBlbHNlIGlmIChzcmNTdGF0LmlzRklGTygpKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb3B5IGEgRklGTyBwaXBlOiAke3NyY31gKVxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZmlsZTogJHtzcmN9YClcbn1cblxuZnVuY3Rpb24gb25GaWxlIChzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGlmICghZGVzdFN0YXQpIHJldHVybiBjb3B5RmlsZShzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG4gIHJldHVybiBtYXlDb3B5RmlsZShzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG59XG5cbmZ1bmN0aW9uIG1heUNvcHlGaWxlIChzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKG9wdHMub3ZlcndyaXRlKSB7XG4gICAgZnMudW5saW5rU3luYyhkZXN0KVxuICAgIHJldHVybiBjb3B5RmlsZShzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG4gIH0gZWxzZSBpZiAob3B0cy5lcnJvck9uRXhpc3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2Rlc3R9JyBhbHJlYWR5IGV4aXN0c2ApXG4gIH1cbn1cblxuZnVuY3Rpb24gY29weUZpbGUgKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBmcy5jb3B5RmlsZVN5bmMoc3JjLCBkZXN0KVxuICBpZiAob3B0cy5wcmVzZXJ2ZVRpbWVzdGFtcHMpIGhhbmRsZVRpbWVzdGFtcHMoc3JjU3RhdC5tb2RlLCBzcmMsIGRlc3QpXG4gIHJldHVybiBzZXREZXN0TW9kZShkZXN0LCBzcmNTdGF0Lm1vZGUpXG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRpbWVzdGFtcHMgKHNyY01vZGUsIHNyYywgZGVzdCkge1xuICAvLyBNYWtlIHN1cmUgdGhlIGZpbGUgaXMgd3JpdGFibGUgYmVmb3JlIHNldHRpbmcgdGhlIHRpbWVzdGFtcFxuICAvLyBvdGhlcndpc2Ugb3BlbiBmYWlscyB3aXRoIEVQRVJNIHdoZW4gaW52b2tlZCB3aXRoICdyKydcbiAgLy8gKHRocm91Z2ggdXRpbWVzIGNhbGwpXG4gIGlmIChmaWxlSXNOb3RXcml0YWJsZShzcmNNb2RlKSkgbWFrZUZpbGVXcml0YWJsZShkZXN0LCBzcmNNb2RlKVxuICByZXR1cm4gc2V0RGVzdFRpbWVzdGFtcHMoc3JjLCBkZXN0KVxufVxuXG5mdW5jdGlvbiBmaWxlSXNOb3RXcml0YWJsZSAoc3JjTW9kZSkge1xuICByZXR1cm4gKHNyY01vZGUgJiAwbzIwMCkgPT09IDBcbn1cblxuZnVuY3Rpb24gbWFrZUZpbGVXcml0YWJsZSAoZGVzdCwgc3JjTW9kZSkge1xuICByZXR1cm4gc2V0RGVzdE1vZGUoZGVzdCwgc3JjTW9kZSB8IDBvMjAwKVxufVxuXG5mdW5jdGlvbiBzZXREZXN0TW9kZSAoZGVzdCwgc3JjTW9kZSkge1xuICByZXR1cm4gZnMuY2htb2RTeW5jKGRlc3QsIHNyY01vZGUpXG59XG5cbmZ1bmN0aW9uIHNldERlc3RUaW1lc3RhbXBzIChzcmMsIGRlc3QpIHtcbiAgLy8gVGhlIGluaXRpYWwgc3JjU3RhdC5hdGltZSBjYW5ub3QgYmUgdHJ1c3RlZFxuICAvLyBiZWNhdXNlIGl0IGlzIG1vZGlmaWVkIGJ5IHRoZSByZWFkKDIpIHN5c3RlbSBjYWxsXG4gIC8vIChTZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX3N0YXRfdGltZV92YWx1ZXMpXG4gIGNvbnN0IHVwZGF0ZWRTcmNTdGF0ID0gZnMuc3RhdFN5bmMoc3JjKVxuICByZXR1cm4gdXRpbWVzTWlsbGlzU3luYyhkZXN0LCB1cGRhdGVkU3JjU3RhdC5hdGltZSwgdXBkYXRlZFNyY1N0YXQubXRpbWUpXG59XG5cbmZ1bmN0aW9uIG9uRGlyIChzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGlmICghZGVzdFN0YXQpIHJldHVybiBta0RpckFuZENvcHkoc3JjU3RhdC5tb2RlLCBzcmMsIGRlc3QsIG9wdHMpXG4gIHJldHVybiBjb3B5RGlyKHNyYywgZGVzdCwgb3B0cylcbn1cblxuZnVuY3Rpb24gbWtEaXJBbmRDb3B5IChzcmNNb2RlLCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgZnMubWtkaXJTeW5jKGRlc3QpXG4gIGNvcHlEaXIoc3JjLCBkZXN0LCBvcHRzKVxuICByZXR1cm4gc2V0RGVzdE1vZGUoZGVzdCwgc3JjTW9kZSlcbn1cblxuZnVuY3Rpb24gY29weURpciAoc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGZzLnJlYWRkaXJTeW5jKHNyYykuZm9yRWFjaChpdGVtID0+IGNvcHlEaXJJdGVtKGl0ZW0sIHNyYywgZGVzdCwgb3B0cykpXG59XG5cbmZ1bmN0aW9uIGNvcHlEaXJJdGVtIChpdGVtLCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgY29uc3Qgc3JjSXRlbSA9IHBhdGguam9pbihzcmMsIGl0ZW0pXG4gIGNvbnN0IGRlc3RJdGVtID0gcGF0aC5qb2luKGRlc3QsIGl0ZW0pXG4gIGlmIChvcHRzLmZpbHRlciAmJiAhb3B0cy5maWx0ZXIoc3JjSXRlbSwgZGVzdEl0ZW0pKSByZXR1cm5cbiAgY29uc3QgeyBkZXN0U3RhdCB9ID0gc3RhdC5jaGVja1BhdGhzU3luYyhzcmNJdGVtLCBkZXN0SXRlbSwgJ2NvcHknLCBvcHRzKVxuICByZXR1cm4gZ2V0U3RhdHMoZGVzdFN0YXQsIHNyY0l0ZW0sIGRlc3RJdGVtLCBvcHRzKVxufVxuXG5mdW5jdGlvbiBvbkxpbmsgKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgbGV0IHJlc29sdmVkU3JjID0gZnMucmVhZGxpbmtTeW5jKHNyYylcbiAgaWYgKG9wdHMuZGVyZWZlcmVuY2UpIHtcbiAgICByZXNvbHZlZFNyYyA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlZFNyYylcbiAgfVxuXG4gIGlmICghZGVzdFN0YXQpIHtcbiAgICByZXR1cm4gZnMuc3ltbGlua1N5bmMocmVzb2x2ZWRTcmMsIGRlc3QpXG4gIH0gZWxzZSB7XG4gICAgbGV0IHJlc29sdmVkRGVzdFxuICAgIHRyeSB7XG4gICAgICByZXNvbHZlZERlc3QgPSBmcy5yZWFkbGlua1N5bmMoZGVzdClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGRlc3QgZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZSBvciBkaXJlY3RvcnksXG4gICAgICAvLyBXaW5kb3dzIG1heSB0aHJvdyBVTktOT1dOIGVycm9yLiBJZiBkZXN0IGFscmVhZHkgZXhpc3RzLFxuICAgICAgLy8gZnMgdGhyb3dzIGVycm9yIGFueXdheSwgc28gbm8gbmVlZCB0byBndWFyZCBhZ2FpbnN0IGl0IGhlcmUuXG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFSU5WQUwnIHx8IGVyci5jb2RlID09PSAnVU5LTk9XTicpIHJldHVybiBmcy5zeW1saW5rU3luYyhyZXNvbHZlZFNyYywgZGVzdClcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBpZiAob3B0cy5kZXJlZmVyZW5jZSkge1xuICAgICAgcmVzb2x2ZWREZXN0ID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkRGVzdClcbiAgICB9XG4gICAgaWYgKHN0YXQuaXNTcmNTdWJkaXIocmVzb2x2ZWRTcmMsIHJlc29sdmVkRGVzdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgJyR7cmVzb2x2ZWRTcmN9JyB0byBhIHN1YmRpcmVjdG9yeSBvZiBpdHNlbGYsICcke3Jlc29sdmVkRGVzdH0nLmApXG4gICAgfVxuXG4gICAgLy8gcHJldmVudCBjb3B5IGlmIHNyYyBpcyBhIHN1YmRpciBvZiBkZXN0IHNpbmNlIHVubGlua2luZ1xuICAgIC8vIGRlc3QgaW4gdGhpcyBjYXNlIHdvdWxkIHJlc3VsdCBpbiByZW1vdmluZyBzcmMgY29udGVudHNcbiAgICAvLyBhbmQgdGhlcmVmb3JlIGEgYnJva2VuIHN5bWxpbmsgd291bGQgYmUgY3JlYXRlZC5cbiAgICBpZiAoc3RhdC5pc1NyY1N1YmRpcihyZXNvbHZlZERlc3QsIHJlc29sdmVkU3JjKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3ZlcndyaXRlICcke3Jlc29sdmVkRGVzdH0nIHdpdGggJyR7cmVzb2x2ZWRTcmN9Jy5gKVxuICAgIH1cbiAgICByZXR1cm4gY29weUxpbmsocmVzb2x2ZWRTcmMsIGRlc3QpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29weUxpbmsgKHJlc29sdmVkU3JjLCBkZXN0KSB7XG4gIGZzLnVubGlua1N5bmMoZGVzdClcbiAgcmV0dXJuIGZzLnN5bWxpbmtTeW5jKHJlc29sdmVkU3JjLCBkZXN0KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlTeW5jXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCB7IG1rZGlycyB9ID0gcmVxdWlyZSgnLi4vbWtkaXJzJylcbmNvbnN0IHsgcGF0aEV4aXN0cyB9ID0gcmVxdWlyZSgnLi4vcGF0aC1leGlzdHMnKVxuY29uc3QgeyB1dGltZXNNaWxsaXMgfSA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbWVzJylcbmNvbnN0IHN0YXQgPSByZXF1aXJlKCcuLi91dGlsL3N0YXQnKVxuXG5hc3luYyBmdW5jdGlvbiBjb3B5IChzcmMsIGRlc3QsIG9wdHMgPSB7fSkge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRzID0geyBmaWx0ZXI6IG9wdHMgfVxuICB9XG5cbiAgb3B0cy5jbG9iYmVyID0gJ2Nsb2JiZXInIGluIG9wdHMgPyAhIW9wdHMuY2xvYmJlciA6IHRydWUgLy8gZGVmYXVsdCB0byB0cnVlIGZvciBub3dcbiAgb3B0cy5vdmVyd3JpdGUgPSAnb3ZlcndyaXRlJyBpbiBvcHRzID8gISFvcHRzLm92ZXJ3cml0ZSA6IG9wdHMuY2xvYmJlciAvLyBvdmVyd3JpdGUgZmFsbHMgYmFjayB0byBjbG9iYmVyXG5cbiAgLy8gV2FybiBhYm91dCB1c2luZyBwcmVzZXJ2ZVRpbWVzdGFtcHMgb24gMzItYml0IG5vZGVcbiAgaWYgKG9wdHMucHJlc2VydmVUaW1lc3RhbXBzICYmIHByb2Nlc3MuYXJjaCA9PT0gJ2lhMzInKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhcbiAgICAgICdVc2luZyB0aGUgcHJlc2VydmVUaW1lc3RhbXBzIG9wdGlvbiBpbiAzMi1iaXQgbm9kZSBpcyBub3QgcmVjb21tZW5kZWQ7XFxuXFxuJyArXG4gICAgICAnXFx0c2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcHJpY2hhcmRzb24vbm9kZS1mcy1leHRyYS9pc3N1ZXMvMjY5JyxcbiAgICAgICdXYXJuaW5nJywgJ2ZzLWV4dHJhLVdBUk4wMDAxJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IHsgc3JjU3RhdCwgZGVzdFN0YXQgfSA9IGF3YWl0IHN0YXQuY2hlY2tQYXRocyhzcmMsIGRlc3QsICdjb3B5Jywgb3B0cylcblxuICBhd2FpdCBzdGF0LmNoZWNrUGFyZW50UGF0aHMoc3JjLCBzcmNTdGF0LCBkZXN0LCAnY29weScpXG5cbiAgY29uc3QgaW5jbHVkZSA9IGF3YWl0IHJ1bkZpbHRlcihzcmMsIGRlc3QsIG9wdHMpXG5cbiAgaWYgKCFpbmNsdWRlKSByZXR1cm5cblxuICAvLyBjaGVjayBpZiB0aGUgcGFyZW50IG9mIGRlc3QgZXhpc3RzLCBhbmQgY3JlYXRlIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgY29uc3QgZGVzdFBhcmVudCA9IHBhdGguZGlybmFtZShkZXN0KVxuICBjb25zdCBkaXJFeGlzdHMgPSBhd2FpdCBwYXRoRXhpc3RzKGRlc3RQYXJlbnQpXG4gIGlmICghZGlyRXhpc3RzKSB7XG4gICAgYXdhaXQgbWtkaXJzKGRlc3RQYXJlbnQpXG4gIH1cblxuICBhd2FpdCBnZXRTdGF0c0FuZFBlcmZvcm1Db3B5KGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkZpbHRlciAoc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGlmICghb3B0cy5maWx0ZXIpIHJldHVybiB0cnVlXG4gIHJldHVybiBvcHRzLmZpbHRlcihzcmMsIGRlc3QpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFN0YXRzQW5kUGVyZm9ybUNvcHkgKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgY29uc3Qgc3RhdEZuID0gb3B0cy5kZXJlZmVyZW5jZSA/IGZzLnN0YXQgOiBmcy5sc3RhdFxuICBjb25zdCBzcmNTdGF0ID0gYXdhaXQgc3RhdEZuKHNyYylcblxuICBpZiAoc3JjU3RhdC5pc0RpcmVjdG9yeSgpKSByZXR1cm4gb25EaXIoc3JjU3RhdCwgZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcblxuICBpZiAoXG4gICAgc3JjU3RhdC5pc0ZpbGUoKSB8fFxuICAgIHNyY1N0YXQuaXNDaGFyYWN0ZXJEZXZpY2UoKSB8fFxuICAgIHNyY1N0YXQuaXNCbG9ja0RldmljZSgpXG4gICkgcmV0dXJuIG9uRmlsZShzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuXG4gIGlmIChzcmNTdGF0LmlzU3ltYm9saWNMaW5rKCkpIHJldHVybiBvbkxpbmsoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgaWYgKHNyY1N0YXQuaXNTb2NrZXQoKSkgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29weSBhIHNvY2tldCBmaWxlOiAke3NyY31gKVxuICBpZiAoc3JjU3RhdC5pc0ZJRk8oKSkgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29weSBhIEZJRk8gcGlwZTogJHtzcmN9YClcbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpbGU6ICR7c3JjfWApXG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9uRmlsZSAoc3JjU3RhdCwgZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBpZiAoIWRlc3RTdGF0KSByZXR1cm4gY29weUZpbGUoc3JjU3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuXG4gIGlmIChvcHRzLm92ZXJ3cml0ZSkge1xuICAgIGF3YWl0IGZzLnVubGluayhkZXN0KVxuICAgIHJldHVybiBjb3B5RmlsZShzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG4gIH1cbiAgaWYgKG9wdHMuZXJyb3JPbkV4aXN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtkZXN0fScgYWxyZWFkeSBleGlzdHNgKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcHlGaWxlIChzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgYXdhaXQgZnMuY29weUZpbGUoc3JjLCBkZXN0KVxuICBpZiAob3B0cy5wcmVzZXJ2ZVRpbWVzdGFtcHMpIHtcbiAgICAvLyBNYWtlIHN1cmUgdGhlIGZpbGUgaXMgd3JpdGFibGUgYmVmb3JlIHNldHRpbmcgdGhlIHRpbWVzdGFtcFxuICAgIC8vIG90aGVyd2lzZSBvcGVuIGZhaWxzIHdpdGggRVBFUk0gd2hlbiBpbnZva2VkIHdpdGggJ3IrJ1xuICAgIC8vICh0aHJvdWdoIHV0aW1lcyBjYWxsKVxuICAgIGlmIChmaWxlSXNOb3RXcml0YWJsZShzcmNTdGF0Lm1vZGUpKSB7XG4gICAgICBhd2FpdCBtYWtlRmlsZVdyaXRhYmxlKGRlc3QsIHNyY1N0YXQubW9kZSlcbiAgICB9XG5cbiAgICAvLyBTZXQgdGltZXN0YW1wcyBhbmQgbW9kZSBjb3JyZXNwb25kaW5nbHlcblxuICAgIC8vIE5vdGUgdGhhdCBUaGUgaW5pdGlhbCBzcmNTdGF0LmF0aW1lIGNhbm5vdCBiZSB0cnVzdGVkXG4gICAgLy8gYmVjYXVzZSBpdCBpcyBtb2RpZmllZCBieSB0aGUgcmVhZCgyKSBzeXN0ZW0gY2FsbFxuICAgIC8vIChTZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX3N0YXRfdGltZV92YWx1ZXMpXG4gICAgY29uc3QgdXBkYXRlZFNyY1N0YXQgPSBhd2FpdCBmcy5zdGF0KHNyYylcbiAgICBhd2FpdCB1dGltZXNNaWxsaXMoZGVzdCwgdXBkYXRlZFNyY1N0YXQuYXRpbWUsIHVwZGF0ZWRTcmNTdGF0Lm10aW1lKVxuICB9XG5cbiAgcmV0dXJuIGZzLmNobW9kKGRlc3QsIHNyY1N0YXQubW9kZSlcbn1cblxuZnVuY3Rpb24gZmlsZUlzTm90V3JpdGFibGUgKHNyY01vZGUpIHtcbiAgcmV0dXJuIChzcmNNb2RlICYgMG8yMDApID09PSAwXG59XG5cbmZ1bmN0aW9uIG1ha2VGaWxlV3JpdGFibGUgKGRlc3QsIHNyY01vZGUpIHtcbiAgcmV0dXJuIGZzLmNobW9kKGRlc3QsIHNyY01vZGUgfCAwbzIwMClcbn1cblxuYXN5bmMgZnVuY3Rpb24gb25EaXIgKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgLy8gdGhlIGRlc3QgZGlyZWN0b3J5IG1pZ2h0IG5vdCBleGlzdCwgY3JlYXRlIGl0XG4gIGlmICghZGVzdFN0YXQpIHtcbiAgICBhd2FpdCBmcy5ta2RpcihkZXN0KVxuICB9XG5cbiAgY29uc3QgaXRlbXMgPSBhd2FpdCBmcy5yZWFkZGlyKHNyYylcblxuICAvLyBsb29wIHRocm91Z2ggdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0byBjb3B5IGV2ZXJ5dGhpbmdcbiAgYXdhaXQgUHJvbWlzZS5hbGwoaXRlbXMubWFwKGFzeW5jIGl0ZW0gPT4ge1xuICAgIGNvbnN0IHNyY0l0ZW0gPSBwYXRoLmpvaW4oc3JjLCBpdGVtKVxuICAgIGNvbnN0IGRlc3RJdGVtID0gcGF0aC5qb2luKGRlc3QsIGl0ZW0pXG5cbiAgICAvLyBza2lwIHRoZSBpdGVtIGlmIGl0IGlzIG1hdGNoZXMgYnkgdGhlIGZpbHRlciBmdW5jdGlvblxuICAgIGNvbnN0IGluY2x1ZGUgPSBhd2FpdCBydW5GaWx0ZXIoc3JjSXRlbSwgZGVzdEl0ZW0sIG9wdHMpXG4gICAgaWYgKCFpbmNsdWRlKSByZXR1cm5cblxuICAgIGNvbnN0IHsgZGVzdFN0YXQgfSA9IGF3YWl0IHN0YXQuY2hlY2tQYXRocyhzcmNJdGVtLCBkZXN0SXRlbSwgJ2NvcHknLCBvcHRzKVxuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgYSBjb3B5YWJsZSBmaWxlLCBgZ2V0U3RhdHNBbmRQZXJmb3JtQ29weWAgd2lsbCBjb3B5IGl0XG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgYSBkaXJlY3RvcnksIGBnZXRTdGF0c0FuZFBlcmZvcm1Db3B5YCB3aWxsIGNhbGwgYG9uRGlyYCByZWN1cnNpdmVseVxuICAgIHJldHVybiBnZXRTdGF0c0FuZFBlcmZvcm1Db3B5KGRlc3RTdGF0LCBzcmNJdGVtLCBkZXN0SXRlbSwgb3B0cylcbiAgfSkpXG5cbiAgaWYgKCFkZXN0U3RhdCkge1xuICAgIGF3YWl0IGZzLmNobW9kKGRlc3QsIHNyY1N0YXQubW9kZSlcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBvbkxpbmsgKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgbGV0IHJlc29sdmVkU3JjID0gYXdhaXQgZnMucmVhZGxpbmsoc3JjKVxuICBpZiAob3B0cy5kZXJlZmVyZW5jZSkge1xuICAgIHJlc29sdmVkU3JjID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkU3JjKVxuICB9XG4gIGlmICghZGVzdFN0YXQpIHtcbiAgICByZXR1cm4gZnMuc3ltbGluayhyZXNvbHZlZFNyYywgZGVzdClcbiAgfVxuXG4gIGxldCByZXNvbHZlZERlc3QgPSBudWxsXG4gIHRyeSB7XG4gICAgcmVzb2x2ZWREZXN0ID0gYXdhaXQgZnMucmVhZGxpbmsoZGVzdClcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGRlc3QgZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZSBvciBkaXJlY3RvcnksXG4gICAgLy8gV2luZG93cyBtYXkgdGhyb3cgVU5LTk9XTiBlcnJvci4gSWYgZGVzdCBhbHJlYWR5IGV4aXN0cyxcbiAgICAvLyBmcyB0aHJvd3MgZXJyb3IgYW55d2F5LCBzbyBubyBuZWVkIHRvIGd1YXJkIGFnYWluc3QgaXQgaGVyZS5cbiAgICBpZiAoZS5jb2RlID09PSAnRUlOVkFMJyB8fCBlLmNvZGUgPT09ICdVTktOT1dOJykgcmV0dXJuIGZzLnN5bWxpbmsocmVzb2x2ZWRTcmMsIGRlc3QpXG4gICAgdGhyb3cgZVxuICB9XG4gIGlmIChvcHRzLmRlcmVmZXJlbmNlKSB7XG4gICAgcmVzb2x2ZWREZXN0ID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkRGVzdClcbiAgfVxuICBpZiAoc3RhdC5pc1NyY1N1YmRpcihyZXNvbHZlZFNyYywgcmVzb2x2ZWREZXN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgJyR7cmVzb2x2ZWRTcmN9JyB0byBhIHN1YmRpcmVjdG9yeSBvZiBpdHNlbGYsICcke3Jlc29sdmVkRGVzdH0nLmApXG4gIH1cblxuICAvLyBkbyBub3QgY29weSBpZiBzcmMgaXMgYSBzdWJkaXIgb2YgZGVzdCBzaW5jZSB1bmxpbmtpbmdcbiAgLy8gZGVzdCBpbiB0aGlzIGNhc2Ugd291bGQgcmVzdWx0IGluIHJlbW92aW5nIHNyYyBjb250ZW50c1xuICAvLyBhbmQgdGhlcmVmb3JlIGEgYnJva2VuIHN5bWxpbmsgd291bGQgYmUgY3JlYXRlZC5cbiAgaWYgKHN0YXQuaXNTcmNTdWJkaXIocmVzb2x2ZWREZXN0LCByZXNvbHZlZFNyYykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgJyR7cmVzb2x2ZWREZXN0fScgd2l0aCAnJHtyZXNvbHZlZFNyY30nLmApXG4gIH1cblxuICAvLyBjb3B5IHRoZSBsaW5rXG4gIGF3YWl0IGZzLnVubGluayhkZXN0KVxuICByZXR1cm4gZnMuc3ltbGluayhyZXNvbHZlZFNyYywgZGVzdClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29weTogdShyZXF1aXJlKCcuL2NvcHknKSksXG4gIGNvcHlTeW5jOiByZXF1aXJlKCcuL2NvcHktc3luYycpXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IG1rZGlyID0gcmVxdWlyZSgnLi4vbWtkaXJzJylcbmNvbnN0IHJlbW92ZSA9IHJlcXVpcmUoJy4uL3JlbW92ZScpXG5cbmNvbnN0IGVtcHR5RGlyID0gdShhc3luYyBmdW5jdGlvbiBlbXB0eURpciAoZGlyKSB7XG4gIGxldCBpdGVtc1xuICB0cnkge1xuICAgIGl0ZW1zID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBta2Rpci5ta2RpcnMoZGlyKVxuICB9XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKGl0ZW1zLm1hcChpdGVtID0+IHJlbW92ZS5yZW1vdmUocGF0aC5qb2luKGRpciwgaXRlbSkpKSlcbn0pXG5cbmZ1bmN0aW9uIGVtcHR5RGlyU3luYyAoZGlyKSB7XG4gIGxldCBpdGVtc1xuICB0cnkge1xuICAgIGl0ZW1zID0gZnMucmVhZGRpclN5bmMoZGlyKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbWtkaXIubWtkaXJzU3luYyhkaXIpXG4gIH1cblxuICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIGl0ZW0gPSBwYXRoLmpvaW4oZGlyLCBpdGVtKVxuICAgIHJlbW92ZS5yZW1vdmVTeW5jKGl0ZW0pXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBlbXB0eURpclN5bmMsXG4gIGVtcHR5ZGlyU3luYzogZW1wdHlEaXJTeW5jLFxuICBlbXB0eURpcixcbiAgZW1wdHlkaXI6IGVtcHR5RGlyXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IG1rZGlyID0gcmVxdWlyZSgnLi4vbWtkaXJzJylcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRmlsZSAoZmlsZSkge1xuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZSlcbiAgfSBjYXRjaCB7IH1cbiAgaWYgKHN0YXRzICYmIHN0YXRzLmlzRmlsZSgpKSByZXR1cm5cblxuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZmlsZSlcblxuICBsZXQgZGlyU3RhdHMgPSBudWxsXG4gIHRyeSB7XG4gICAgZGlyU3RhdHMgPSBhd2FpdCBmcy5zdGF0KGRpcilcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gaWYgdGhlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBtYWtlIGl0XG4gICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgYXdhaXQgbWtkaXIubWtkaXJzKGRpcilcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlLCAnJylcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cblxuICBpZiAoZGlyU3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlLCAnJylcbiAgfSBlbHNlIHtcbiAgICAvLyBwYXJlbnQgaXMgbm90IGEgZGlyZWN0b3J5XG4gICAgLy8gVGhpcyBpcyBqdXN0IHRvIGNhdXNlIGFuIGludGVybmFsIEVOT1RESVIgZXJyb3IgdG8gYmUgdGhyb3duXG4gICAgYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRmlsZVN5bmMgKGZpbGUpIHtcbiAgbGV0IHN0YXRzXG4gIHRyeSB7XG4gICAgc3RhdHMgPSBmcy5zdGF0U3luYyhmaWxlKVxuICB9IGNhdGNoIHsgfVxuICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNGaWxlKCkpIHJldHVyblxuXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShmaWxlKVxuICB0cnkge1xuICAgIGlmICghZnMuc3RhdFN5bmMoZGlyKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAvLyBwYXJlbnQgaXMgbm90IGEgZGlyZWN0b3J5XG4gICAgICAvLyBUaGlzIGlzIGp1c3QgdG8gY2F1c2UgYW4gaW50ZXJuYWwgRU5PVERJUiBlcnJvciB0byBiZSB0aHJvd25cbiAgICAgIGZzLnJlYWRkaXJTeW5jKGRpcilcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIElmIHRoZSBzdGF0IGNhbGwgYWJvdmUgZmFpbGVkIGJlY2F1c2UgdGhlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgaXRcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRU5PRU5UJykgbWtkaXIubWtkaXJzU3luYyhkaXIpXG4gICAgZWxzZSB0aHJvdyBlcnJcbiAgfVxuXG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgJycpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGVGaWxlOiB1KGNyZWF0ZUZpbGUpLFxuICBjcmVhdGVGaWxlU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgY3JlYXRlRmlsZSwgY3JlYXRlRmlsZVN5bmMgfSA9IHJlcXVpcmUoJy4vZmlsZScpXG5jb25zdCB7IGNyZWF0ZUxpbmssIGNyZWF0ZUxpbmtTeW5jIH0gPSByZXF1aXJlKCcuL2xpbmsnKVxuY29uc3QgeyBjcmVhdGVTeW1saW5rLCBjcmVhdGVTeW1saW5rU3luYyB9ID0gcmVxdWlyZSgnLi9zeW1saW5rJylcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGZpbGVcbiAgY3JlYXRlRmlsZSxcbiAgY3JlYXRlRmlsZVN5bmMsXG4gIGVuc3VyZUZpbGU6IGNyZWF0ZUZpbGUsXG4gIGVuc3VyZUZpbGVTeW5jOiBjcmVhdGVGaWxlU3luYyxcbiAgLy8gbGlua1xuICBjcmVhdGVMaW5rLFxuICBjcmVhdGVMaW5rU3luYyxcbiAgZW5zdXJlTGluazogY3JlYXRlTGluayxcbiAgZW5zdXJlTGlua1N5bmM6IGNyZWF0ZUxpbmtTeW5jLFxuICAvLyBzeW1saW5rXG4gIGNyZWF0ZVN5bWxpbmssXG4gIGNyZWF0ZVN5bWxpbmtTeW5jLFxuICBlbnN1cmVTeW1saW5rOiBjcmVhdGVTeW1saW5rLFxuICBlbnN1cmVTeW1saW5rU3luYzogY3JlYXRlU3ltbGlua1N5bmNcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgbWtkaXIgPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuY29uc3QgeyBwYXRoRXhpc3RzIH0gPSByZXF1aXJlKCcuLi9wYXRoLWV4aXN0cycpXG5jb25zdCB7IGFyZUlkZW50aWNhbCB9ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlTGluayAoc3JjcGF0aCwgZHN0cGF0aCkge1xuICBsZXQgZHN0U3RhdFxuICB0cnkge1xuICAgIGRzdFN0YXQgPSBhd2FpdCBmcy5sc3RhdChkc3RwYXRoKVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgZXJyb3JcbiAgfVxuXG4gIGxldCBzcmNTdGF0XG4gIHRyeSB7XG4gICAgc3JjU3RhdCA9IGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UucmVwbGFjZSgnbHN0YXQnLCAnZW5zdXJlTGluaycpXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICBpZiAoZHN0U3RhdCAmJiBhcmVJZGVudGljYWwoc3JjU3RhdCwgZHN0U3RhdCkpIHJldHVyblxuXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShkc3RwYXRoKVxuXG4gIGNvbnN0IGRpckV4aXN0cyA9IGF3YWl0IHBhdGhFeGlzdHMoZGlyKVxuXG4gIGlmICghZGlyRXhpc3RzKSB7XG4gICAgYXdhaXQgbWtkaXIubWtkaXJzKGRpcilcbiAgfVxuXG4gIGF3YWl0IGZzLmxpbmsoc3JjcGF0aCwgZHN0cGF0aClcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGlua1N5bmMgKHNyY3BhdGgsIGRzdHBhdGgpIHtcbiAgbGV0IGRzdFN0YXRcbiAgdHJ5IHtcbiAgICBkc3RTdGF0ID0gZnMubHN0YXRTeW5jKGRzdHBhdGgpXG4gIH0gY2F0Y2gge31cblxuICB0cnkge1xuICAgIGNvbnN0IHNyY1N0YXQgPSBmcy5sc3RhdFN5bmMoc3JjcGF0aClcbiAgICBpZiAoZHN0U3RhdCAmJiBhcmVJZGVudGljYWwoc3JjU3RhdCwgZHN0U3RhdCkpIHJldHVyblxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlLnJlcGxhY2UoJ2xzdGF0JywgJ2Vuc3VyZUxpbmsnKVxuICAgIHRocm93IGVyclxuICB9XG5cbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGRzdHBhdGgpXG4gIGNvbnN0IGRpckV4aXN0cyA9IGZzLmV4aXN0c1N5bmMoZGlyKVxuICBpZiAoZGlyRXhpc3RzKSByZXR1cm4gZnMubGlua1N5bmMoc3JjcGF0aCwgZHN0cGF0aClcbiAgbWtkaXIubWtkaXJzU3luYyhkaXIpXG5cbiAgcmV0dXJuIGZzLmxpbmtTeW5jKHNyY3BhdGgsIGRzdHBhdGgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGVMaW5rOiB1KGNyZWF0ZUxpbmspLFxuICBjcmVhdGVMaW5rU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgeyBwYXRoRXhpc3RzIH0gPSByZXF1aXJlKCcuLi9wYXRoLWV4aXN0cycpXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0d28gdHlwZXMgb2YgcGF0aHMsIG9uZSByZWxhdGl2ZSB0byBzeW1saW5rLCBhbmQgb25lXG4gKiByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gQ2hlY2tzIGlmIHBhdGggaXMgYWJzb2x1dGUgb3JcbiAqIHJlbGF0aXZlLiBJZiB0aGUgcGF0aCBpcyByZWxhdGl2ZSwgdGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIHBhdGggaXNcbiAqIHJlbGF0aXZlIHRvIHN5bWxpbmsgb3IgcmVsYXRpdmUgdG8gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gVGhpcyBpcyBhblxuICogaW5pdGlhdGl2ZSB0byBmaW5kIGEgc21hcnRlciBgc3JjcGF0aGAgdG8gc3VwcGx5IHdoZW4gYnVpbGRpbmcgc3ltbGlua3MuXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gZGV0ZXJtaW5lIHdoaWNoIHBhdGggdG8gdXNlIG91dCBvZiBvbmUgb2YgdGhyZWUgcG9zc2libGVcbiAqIHR5cGVzIG9mIHNvdXJjZSBwYXRocy4gVGhlIGZpcnN0IGlzIGFuIGFic29sdXRlIHBhdGguIFRoaXMgaXMgZGV0ZWN0ZWQgYnlcbiAqIGBwYXRoLmlzQWJzb2x1dGUoKWAuIFdoZW4gYW4gYWJzb2x1dGUgcGF0aCBpcyBwcm92aWRlZCwgaXQgaXMgY2hlY2tlZCB0b1xuICogc2VlIGlmIGl0IGV4aXN0cy4gSWYgaXQgZG9lcyBpdCdzIHVzZWQsIGlmIG5vdCBhbiBlcnJvciBpcyByZXR1cm5lZFxuICogKGNhbGxiYWNrKS8gdGhyb3duIChzeW5jKS4gVGhlIG90aGVyIHR3byBvcHRpb25zIGZvciBgc3JjcGF0aGAgYXJlIGFcbiAqIHJlbGF0aXZlIHVybC4gQnkgZGVmYXVsdCBOb2RlJ3MgYGZzLnN5bWxpbmtgIHdvcmtzIGJ5IGNyZWF0aW5nIGEgc3ltbGlua1xuICogdXNpbmcgYGRzdHBhdGhgIGFuZCBleHBlY3RzIHRoZSBgc3JjcGF0aGAgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIG5ld2x5XG4gKiBjcmVhdGVkIHN5bWxpbmsuIElmIHlvdSBwcm92aWRlIGEgYHNyY3BhdGhgIHRoYXQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGZpbGVcbiAqIHN5c3RlbSBpdCByZXN1bHRzIGluIGEgYnJva2VuIHN5bWxpbmsuIFRvIG1pbmltaXplIHRoaXMsIHRoZSBmdW5jdGlvblxuICogY2hlY2tzIHRvIHNlZSBpZiB0aGUgJ3JlbGF0aXZlIHRvIHN5bWxpbmsnIHNvdXJjZSBmaWxlIGV4aXN0cywgYW5kIGlmIGl0XG4gKiBkb2VzIGl0IHdpbGwgdXNlIGl0LiBJZiBpdCBkb2VzIG5vdCwgaXQgY2hlY2tzIGlmIHRoZXJlJ3MgYSBmaWxlIHRoYXRcbiAqIGV4aXN0cyB0aGF0IGlzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBpZiBkb2VzIGl0cyB1c2VkLlxuICogVGhpcyBwcmVzZXJ2ZXMgdGhlIGV4cGVjdGF0aW9ucyBvZiB0aGUgb3JpZ2luYWwgZnMuc3ltbGluayBzcGVjIGFuZCBhZGRzXG4gKiB0aGUgYWJpbGl0eSB0byBwYXNzIGluIGByZWxhdGl2ZSB0byBjdXJyZW50IHdvcmtpbmcgZGlyZWNvdHJ5YCBwYXRocy5cbiAqL1xuXG5hc3luYyBmdW5jdGlvbiBzeW1saW5rUGF0aHMgKHNyY3BhdGgsIGRzdHBhdGgpIHtcbiAgaWYgKHBhdGguaXNBYnNvbHV0ZShzcmNwYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5sc3RhdChzcmNwYXRoKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZXJyLm1lc3NhZ2UgPSBlcnIubWVzc2FnZS5yZXBsYWNlKCdsc3RhdCcsICdlbnN1cmVTeW1saW5rJylcbiAgICAgIHRocm93IGVyclxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0b0N3ZDogc3JjcGF0aCxcbiAgICAgIHRvRHN0OiBzcmNwYXRoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZHN0ZGlyID0gcGF0aC5kaXJuYW1lKGRzdHBhdGgpXG4gIGNvbnN0IHJlbGF0aXZlVG9Ec3QgPSBwYXRoLmpvaW4oZHN0ZGlyLCBzcmNwYXRoKVxuXG4gIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHBhdGhFeGlzdHMocmVsYXRpdmVUb0RzdClcbiAgaWYgKGV4aXN0cykge1xuICAgIHJldHVybiB7XG4gICAgICB0b0N3ZDogcmVsYXRpdmVUb0RzdCxcbiAgICAgIHRvRHN0OiBzcmNwYXRoXG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5sc3RhdChzcmNwYXRoKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlLnJlcGxhY2UoJ2xzdGF0JywgJ2Vuc3VyZVN5bWxpbmsnKVxuICAgIHRocm93IGVyclxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b0N3ZDogc3JjcGF0aCxcbiAgICB0b0RzdDogcGF0aC5yZWxhdGl2ZShkc3RkaXIsIHNyY3BhdGgpXG4gIH1cbn1cblxuZnVuY3Rpb24gc3ltbGlua1BhdGhzU3luYyAoc3JjcGF0aCwgZHN0cGF0aCkge1xuICBpZiAocGF0aC5pc0Fic29sdXRlKHNyY3BhdGgpKSB7XG4gICAgY29uc3QgZXhpc3RzID0gZnMuZXhpc3RzU3luYyhzcmNwYXRoKVxuICAgIGlmICghZXhpc3RzKSB0aHJvdyBuZXcgRXJyb3IoJ2Fic29sdXRlIHNyY3BhdGggZG9lcyBub3QgZXhpc3QnKVxuICAgIHJldHVybiB7XG4gICAgICB0b0N3ZDogc3JjcGF0aCxcbiAgICAgIHRvRHN0OiBzcmNwYXRoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZHN0ZGlyID0gcGF0aC5kaXJuYW1lKGRzdHBhdGgpXG4gIGNvbnN0IHJlbGF0aXZlVG9Ec3QgPSBwYXRoLmpvaW4oZHN0ZGlyLCBzcmNwYXRoKVxuICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKHJlbGF0aXZlVG9Ec3QpXG4gIGlmIChleGlzdHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9Dd2Q6IHJlbGF0aXZlVG9Ec3QsXG4gICAgICB0b0RzdDogc3JjcGF0aFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNyY0V4aXN0cyA9IGZzLmV4aXN0c1N5bmMoc3JjcGF0aClcbiAgaWYgKCFzcmNFeGlzdHMpIHRocm93IG5ldyBFcnJvcigncmVsYXRpdmUgc3JjcGF0aCBkb2VzIG5vdCBleGlzdCcpXG4gIHJldHVybiB7XG4gICAgdG9Dd2Q6IHNyY3BhdGgsXG4gICAgdG9Ec3Q6IHBhdGgucmVsYXRpdmUoZHN0ZGlyLCBzcmNwYXRoKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzeW1saW5rUGF0aHM6IHUoc3ltbGlua1BhdGhzKSxcbiAgc3ltbGlua1BhdGhzU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5cbmFzeW5jIGZ1bmN0aW9uIHN5bWxpbmtUeXBlIChzcmNwYXRoLCB0eXBlKSB7XG4gIGlmICh0eXBlKSByZXR1cm4gdHlwZVxuXG4gIGxldCBzdGF0c1xuICB0cnkge1xuICAgIHN0YXRzID0gYXdhaXQgZnMubHN0YXQoc3JjcGF0aClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICdmaWxlJ1xuICB9XG5cbiAgcmV0dXJuIChzdGF0cyAmJiBzdGF0cy5pc0RpcmVjdG9yeSgpKSA/ICdkaXInIDogJ2ZpbGUnXG59XG5cbmZ1bmN0aW9uIHN5bWxpbmtUeXBlU3luYyAoc3JjcGF0aCwgdHlwZSkge1xuICBpZiAodHlwZSkgcmV0dXJuIHR5cGVcblxuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGZzLmxzdGF0U3luYyhzcmNwYXRoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ2ZpbGUnXG4gIH1cbiAgcmV0dXJuIChzdGF0cyAmJiBzdGF0cy5pc0RpcmVjdG9yeSgpKSA/ICdkaXInIDogJ2ZpbGUnXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzeW1saW5rVHlwZTogdShzeW1saW5rVHlwZSksXG4gIHN5bWxpbmtUeXBlU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5cbmNvbnN0IHsgbWtkaXJzLCBta2RpcnNTeW5jIH0gPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuXG5jb25zdCB7IHN5bWxpbmtQYXRocywgc3ltbGlua1BhdGhzU3luYyB9ID0gcmVxdWlyZSgnLi9zeW1saW5rLXBhdGhzJylcbmNvbnN0IHsgc3ltbGlua1R5cGUsIHN5bWxpbmtUeXBlU3luYyB9ID0gcmVxdWlyZSgnLi9zeW1saW5rLXR5cGUnKVxuXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcblxuY29uc3QgeyBhcmVJZGVudGljYWwgfSA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN5bWxpbmsgKHNyY3BhdGgsIGRzdHBhdGgsIHR5cGUpIHtcbiAgbGV0IHN0YXRzXG4gIHRyeSB7XG4gICAgc3RhdHMgPSBhd2FpdCBmcy5sc3RhdChkc3RwYXRoKVxuICB9IGNhdGNoIHsgfVxuXG4gIGlmIChzdGF0cyAmJiBzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgY29uc3QgW3NyY1N0YXQsIGRzdFN0YXRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMuc3RhdChzcmNwYXRoKSxcbiAgICAgIGZzLnN0YXQoZHN0cGF0aClcbiAgICBdKVxuXG4gICAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkc3RTdGF0KSkgcmV0dXJuXG4gIH1cblxuICBjb25zdCByZWxhdGl2ZSA9IGF3YWl0IHN5bWxpbmtQYXRocyhzcmNwYXRoLCBkc3RwYXRoKVxuICBzcmNwYXRoID0gcmVsYXRpdmUudG9Ec3RcbiAgY29uc3QgdG9UeXBlID0gYXdhaXQgc3ltbGlua1R5cGUocmVsYXRpdmUudG9Dd2QsIHR5cGUpXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShkc3RwYXRoKVxuXG4gIGlmICghKGF3YWl0IHBhdGhFeGlzdHMoZGlyKSkpIHtcbiAgICBhd2FpdCBta2RpcnMoZGlyKVxuICB9XG5cbiAgcmV0dXJuIGZzLnN5bWxpbmsoc3JjcGF0aCwgZHN0cGF0aCwgdG9UeXBlKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTeW1saW5rU3luYyAoc3JjcGF0aCwgZHN0cGF0aCwgdHlwZSkge1xuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGZzLmxzdGF0U3luYyhkc3RwYXRoKVxuICB9IGNhdGNoIHsgfVxuICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIGNvbnN0IHNyY1N0YXQgPSBmcy5zdGF0U3luYyhzcmNwYXRoKVxuICAgIGNvbnN0IGRzdFN0YXQgPSBmcy5zdGF0U3luYyhkc3RwYXRoKVxuICAgIGlmIChhcmVJZGVudGljYWwoc3JjU3RhdCwgZHN0U3RhdCkpIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVsYXRpdmUgPSBzeW1saW5rUGF0aHNTeW5jKHNyY3BhdGgsIGRzdHBhdGgpXG4gIHNyY3BhdGggPSByZWxhdGl2ZS50b0RzdFxuICB0eXBlID0gc3ltbGlua1R5cGVTeW5jKHJlbGF0aXZlLnRvQ3dkLCB0eXBlKVxuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgZXhpc3RzID0gZnMuZXhpc3RzU3luYyhkaXIpXG4gIGlmIChleGlzdHMpIHJldHVybiBmcy5zeW1saW5rU3luYyhzcmNwYXRoLCBkc3RwYXRoLCB0eXBlKVxuICBta2RpcnNTeW5jKGRpcilcbiAgcmV0dXJuIGZzLnN5bWxpbmtTeW5jKHNyY3BhdGgsIGRzdHBhdGgsIHR5cGUpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGVTeW1saW5rOiB1KGNyZWF0ZVN5bWxpbmspLFxuICBjcmVhdGVTeW1saW5rU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG4vLyBUaGlzIGlzIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbm9ybWFsaXplL216XG4vLyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiBKb25hdGhhbiBPbmcgbWVAam9uZ2xlYmVycnkuY29tIGFuZCBDb250cmlidXRvcnNcbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tQ2FsbGJhY2tcbmNvbnN0IGZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKVxuXG5jb25zdCBhcGkgPSBbXG4gICdhY2Nlc3MnLFxuICAnYXBwZW5kRmlsZScsXG4gICdjaG1vZCcsXG4gICdjaG93bicsXG4gICdjbG9zZScsXG4gICdjb3B5RmlsZScsXG4gICdmY2htb2QnLFxuICAnZmNob3duJyxcbiAgJ2ZkYXRhc3luYycsXG4gICdmc3RhdCcsXG4gICdmc3luYycsXG4gICdmdHJ1bmNhdGUnLFxuICAnZnV0aW1lcycsXG4gICdsY2htb2QnLFxuICAnbGNob3duJyxcbiAgJ2xpbmsnLFxuICAnbHN0YXQnLFxuICAnbWtkaXInLFxuICAnbWtkdGVtcCcsXG4gICdvcGVuJyxcbiAgJ29wZW5kaXInLFxuICAncmVhZGRpcicsXG4gICdyZWFkRmlsZScsXG4gICdyZWFkbGluaycsXG4gICdyZWFscGF0aCcsXG4gICdyZW5hbWUnLFxuICAncm0nLFxuICAncm1kaXInLFxuICAnc3RhdCcsXG4gICdzeW1saW5rJyxcbiAgJ3RydW5jYXRlJyxcbiAgJ3VubGluaycsXG4gICd1dGltZXMnLFxuICAnd3JpdGVGaWxlJ1xuXS5maWx0ZXIoa2V5ID0+IHtcbiAgLy8gU29tZSBjb21tYW5kcyBhcmUgbm90IGF2YWlsYWJsZSBvbiBzb21lIHN5c3RlbXMuIEV4OlxuICAvLyBmcy5jcCB3YXMgYWRkZWQgaW4gTm9kZS5qcyB2MTYuNy4wXG4gIC8vIGZzLmxjaG93biBpcyBub3QgYXZhaWxhYmxlIG9uIGF0IGxlYXN0IHNvbWUgTGludXhcbiAgcmV0dXJuIHR5cGVvZiBmc1trZXldID09PSAnZnVuY3Rpb24nXG59KVxuXG4vLyBFeHBvcnQgY2xvbmVkIGZzOlxuT2JqZWN0LmFzc2lnbihleHBvcnRzLCBmcylcblxuLy8gVW5pdmVyc2FsaWZ5IGFzeW5jIG1ldGhvZHM6XG5hcGkuZm9yRWFjaChtZXRob2QgPT4ge1xuICBleHBvcnRzW21ldGhvZF0gPSB1KGZzW21ldGhvZF0pXG59KVxuXG4vLyBXZSBkaWZmZXIgZnJvbSBtei9mcyBpbiB0aGF0IHdlIHN0aWxsIHNoaXAgdGhlIG9sZCwgYnJva2VuLCBmcy5leGlzdHMoKVxuLy8gc2luY2Ugd2UgYXJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgdGhlIG5hdGl2ZSBtb2R1bGVcbmV4cG9ydHMuZXhpc3RzID0gZnVuY3Rpb24gKGZpbGVuYW1lLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0cyhmaWxlbmFtZSwgY2FsbGJhY2spXG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIHJldHVybiBmcy5leGlzdHMoZmlsZW5hbWUsIHJlc29sdmUpXG4gIH0pXG59XG5cbi8vIGZzLnJlYWQoKSwgZnMud3JpdGUoKSwgZnMucmVhZHYoKSwgJiBmcy53cml0ZXYoKSBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IGR1ZSB0byBtdWx0aXBsZSBjYWxsYmFjayBhcmdzXG5cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZnMucmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKVxuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZnMucmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIChlcnIsIGJ5dGVzUmVhZCwgYnVmZmVyKSA9PiB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgIHJlc29sdmUoeyBieXRlc1JlYWQsIGJ1ZmZlciB9KVxuICAgIH0pXG4gIH0pXG59XG5cbi8vIEZ1bmN0aW9uIHNpZ25hdHVyZSBjYW4gYmVcbi8vIGZzLndyaXRlKGZkLCBidWZmZXJbLCBvZmZzZXRbLCBsZW5ndGhbLCBwb3NpdGlvbl1dXSwgY2FsbGJhY2spXG4vLyBPUlxuLy8gZnMud3JpdGUoZmQsIHN0cmluZ1ssIHBvc2l0aW9uWywgZW5jb2RpbmddXSwgY2FsbGJhY2spXG4vLyBXZSBuZWVkIHRvIGhhbmRsZSBib3RoIGNhc2VzLCBzbyB3ZSB1c2UgLi4uYXJnc1xuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChmZCwgYnVmZmVyLCAuLi5hcmdzKSB7XG4gIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZzLndyaXRlKGZkLCBidWZmZXIsIC4uLmFyZ3MpXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGZzLndyaXRlKGZkLCBidWZmZXIsIC4uLmFyZ3MsIChlcnIsIGJ5dGVzV3JpdHRlbiwgYnVmZmVyKSA9PiB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgIHJlc29sdmUoeyBieXRlc1dyaXR0ZW4sIGJ1ZmZlciB9KVxuICAgIH0pXG4gIH0pXG59XG5cbi8vIEZ1bmN0aW9uIHNpZ25hdHVyZSBpc1xuLy8gcy5yZWFkdihmZCwgYnVmZmVyc1ssIHBvc2l0aW9uXSwgY2FsbGJhY2spXG4vLyBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgb3B0aW9uYWwgYXJnLCBzbyB3ZSB1c2UgLi4uYXJnc1xuZXhwb3J0cy5yZWFkdiA9IGZ1bmN0aW9uIChmZCwgYnVmZmVycywgLi4uYXJncykge1xuICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmcy5yZWFkdihmZCwgYnVmZmVycywgLi4uYXJncylcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZnMucmVhZHYoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MsIChlcnIsIGJ5dGVzUmVhZCwgYnVmZmVycykgPT4ge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpXG4gICAgICByZXNvbHZlKHsgYnl0ZXNSZWFkLCBidWZmZXJzIH0pXG4gICAgfSlcbiAgfSlcbn1cblxuLy8gRnVuY3Rpb24gc2lnbmF0dXJlIGlzXG4vLyBzLndyaXRldihmZCwgYnVmZmVyc1ssIHBvc2l0aW9uXSwgY2FsbGJhY2spXG4vLyBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgb3B0aW9uYWwgYXJnLCBzbyB3ZSB1c2UgLi4uYXJnc1xuZXhwb3J0cy53cml0ZXYgPSBmdW5jdGlvbiAoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MpIHtcbiAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZnMud3JpdGV2KGZkLCBidWZmZXJzLCAuLi5hcmdzKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBmcy53cml0ZXYoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MsIChlcnIsIGJ5dGVzV3JpdHRlbiwgYnVmZmVycykgPT4ge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpXG4gICAgICByZXNvbHZlKHsgYnl0ZXNXcml0dGVuLCBidWZmZXJzIH0pXG4gICAgfSlcbiAgfSlcbn1cblxuLy8gZnMucmVhbHBhdGgubmF0aXZlIHNvbWV0aW1lcyBub3QgYXZhaWxhYmxlIGlmIGZzIGlzIG1vbmtleS1wYXRjaGVkXG5pZiAodHlwZW9mIGZzLnJlYWxwYXRoLm5hdGl2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICBleHBvcnRzLnJlYWxwYXRoLm5hdGl2ZSA9IHUoZnMucmVhbHBhdGgubmF0aXZlKVxufSBlbHNlIHtcbiAgcHJvY2Vzcy5lbWl0V2FybmluZyhcbiAgICAnZnMucmVhbHBhdGgubmF0aXZlIGlzIG5vdCBhIGZ1bmN0aW9uLiBJcyBmcyBiZWluZyBtb25rZXktcGF0Y2hlZD8nLFxuICAgICdXYXJuaW5nJywgJ2ZzLWV4dHJhLVdBUk4wMDAzJ1xuICApXG59XG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIEV4cG9ydCBwcm9taXNlaWZpZWQgZ3JhY2VmdWwtZnM6XG4gIC4uLnJlcXVpcmUoJy4vZnMnKSxcbiAgLy8gRXhwb3J0IGV4dHJhIG1ldGhvZHM6XG4gIC4uLnJlcXVpcmUoJy4vY29weScpLFxuICAuLi5yZXF1aXJlKCcuL2VtcHR5JyksXG4gIC4uLnJlcXVpcmUoJy4vZW5zdXJlJyksXG4gIC4uLnJlcXVpcmUoJy4vanNvbicpLFxuICAuLi5yZXF1aXJlKCcuL21rZGlycycpLFxuICAuLi5yZXF1aXJlKCcuL21vdmUnKSxcbiAgLi4ucmVxdWlyZSgnLi9vdXRwdXQtZmlsZScpLFxuICAuLi5yZXF1aXJlKCcuL3BhdGgtZXhpc3RzJyksXG4gIC4uLnJlcXVpcmUoJy4vcmVtb3ZlJylcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IGpzb25GaWxlID0gcmVxdWlyZSgnLi9qc29uZmlsZScpXG5cbmpzb25GaWxlLm91dHB1dEpzb24gPSB1KHJlcXVpcmUoJy4vb3V0cHV0LWpzb24nKSlcbmpzb25GaWxlLm91dHB1dEpzb25TeW5jID0gcmVxdWlyZSgnLi9vdXRwdXQtanNvbi1zeW5jJylcbi8vIGFsaWFzZXNcbmpzb25GaWxlLm91dHB1dEpTT04gPSBqc29uRmlsZS5vdXRwdXRKc29uXG5qc29uRmlsZS5vdXRwdXRKU09OU3luYyA9IGpzb25GaWxlLm91dHB1dEpzb25TeW5jXG5qc29uRmlsZS53cml0ZUpTT04gPSBqc29uRmlsZS53cml0ZUpzb25cbmpzb25GaWxlLndyaXRlSlNPTlN5bmMgPSBqc29uRmlsZS53cml0ZUpzb25TeW5jXG5qc29uRmlsZS5yZWFkSlNPTiA9IGpzb25GaWxlLnJlYWRKc29uXG5qc29uRmlsZS5yZWFkSlNPTlN5bmMgPSBqc29uRmlsZS5yZWFkSnNvblN5bmNcblxubW9kdWxlLmV4cG9ydHMgPSBqc29uRmlsZVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGpzb25GaWxlID0gcmVxdWlyZSgnanNvbmZpbGUnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8ganNvbmZpbGUgZXhwb3J0c1xuICByZWFkSnNvbjoganNvbkZpbGUucmVhZEZpbGUsXG4gIHJlYWRKc29uU3luYzoganNvbkZpbGUucmVhZEZpbGVTeW5jLFxuICB3cml0ZUpzb246IGpzb25GaWxlLndyaXRlRmlsZSxcbiAgd3JpdGVKc29uU3luYzoganNvbkZpbGUud3JpdGVGaWxlU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgc3RyaW5naWZ5IH0gPSByZXF1aXJlKCdqc29uZmlsZS91dGlscycpXG5jb25zdCB7IG91dHB1dEZpbGVTeW5jIH0gPSByZXF1aXJlKCcuLi9vdXRwdXQtZmlsZScpXG5cbmZ1bmN0aW9uIG91dHB1dEpzb25TeW5jIChmaWxlLCBkYXRhLCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShkYXRhLCBvcHRpb25zKVxuXG4gIG91dHB1dEZpbGVTeW5jKGZpbGUsIHN0ciwgb3B0aW9ucylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdXRwdXRKc29uU3luY1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgc3RyaW5naWZ5IH0gPSByZXF1aXJlKCdqc29uZmlsZS91dGlscycpXG5jb25zdCB7IG91dHB1dEZpbGUgfSA9IHJlcXVpcmUoJy4uL291dHB1dC1maWxlJylcblxuYXN5bmMgZnVuY3Rpb24gb3V0cHV0SnNvbiAoZmlsZSwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShkYXRhLCBvcHRpb25zKVxuXG4gIGF3YWl0IG91dHB1dEZpbGUoZmlsZSwgc3RyLCBvcHRpb25zKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG91dHB1dEpzb25cbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCB7IG1ha2VEaXI6IF9tYWtlRGlyLCBtYWtlRGlyU3luYyB9ID0gcmVxdWlyZSgnLi9tYWtlLWRpcicpXG5jb25zdCBtYWtlRGlyID0gdShfbWFrZURpcilcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1rZGlyczogbWFrZURpcixcbiAgbWtkaXJzU3luYzogbWFrZURpclN5bmMsXG4gIC8vIGFsaWFzXG4gIG1rZGlycDogbWFrZURpcixcbiAgbWtkaXJwU3luYzogbWFrZURpclN5bmMsXG4gIGVuc3VyZURpcjogbWFrZURpcixcbiAgZW5zdXJlRGlyU3luYzogbWFrZURpclN5bmNcbn1cbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB7IGNoZWNrUGF0aCB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5cbmNvbnN0IGdldE1vZGUgPSBvcHRpb25zID0+IHtcbiAgY29uc3QgZGVmYXVsdHMgPSB7IG1vZGU6IDBvNzc3IH1cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJykgcmV0dXJuIG9wdGlvbnNcbiAgcmV0dXJuICh7IC4uLmRlZmF1bHRzLCAuLi5vcHRpb25zIH0pLm1vZGVcbn1cblxubW9kdWxlLmV4cG9ydHMubWFrZURpciA9IGFzeW5jIChkaXIsIG9wdGlvbnMpID0+IHtcbiAgY2hlY2tQYXRoKGRpcilcblxuICByZXR1cm4gZnMubWtkaXIoZGlyLCB7XG4gICAgbW9kZTogZ2V0TW9kZShvcHRpb25zKSxcbiAgICByZWN1cnNpdmU6IHRydWVcbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMubWFrZURpclN5bmMgPSAoZGlyLCBvcHRpb25zKSA9PiB7XG4gIGNoZWNrUGF0aChkaXIpXG5cbiAgcmV0dXJuIGZzLm1rZGlyU3luYyhkaXIsIHtcbiAgICBtb2RlOiBnZXRNb2RlKG9wdGlvbnMpLFxuICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICB9KVxufVxuIiwiLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvbWFrZS1kaXJcbi8vIENvcHlyaWdodCAoYykgU2luZHJlIFNvcmh1cyA8c2luZHJlc29yaHVzQGdtYWlsLmNvbT4gKHNpbmRyZXNvcmh1cy5jb20pXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbid1c2Ugc3RyaWN0J1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzg5ODdcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9saWJ1di9saWJ1di9wdWxsLzEwODhcbm1vZHVsZS5leHBvcnRzLmNoZWNrUGF0aCA9IGZ1bmN0aW9uIGNoZWNrUGF0aCAocHRoKSB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc3QgcGF0aEhhc0ludmFsaWRXaW5DaGFyYWN0ZXJzID0gL1s8PjpcInw/Kl0vLnRlc3QocHRoLnJlcGxhY2UocGF0aC5wYXJzZShwdGgpLnJvb3QsICcnKSlcblxuICAgIGlmIChwYXRoSGFzSW52YWxpZFdpbkNoYXJhY3RlcnMpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBQYXRoIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyczogJHtwdGh9YClcbiAgICAgIGVycm9yLmNvZGUgPSAnRUlOVkFMJ1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2Vcbm1vZHVsZS5leHBvcnRzID0ge1xuICBtb3ZlOiB1KHJlcXVpcmUoJy4vbW92ZScpKSxcbiAgbW92ZVN5bmM6IHJlcXVpcmUoJy4vbW92ZS1zeW5jJylcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2dyYWNlZnVsLWZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IGNvcHlTeW5jID0gcmVxdWlyZSgnLi4vY29weScpLmNvcHlTeW5jXG5jb25zdCByZW1vdmVTeW5jID0gcmVxdWlyZSgnLi4vcmVtb3ZlJykucmVtb3ZlU3luY1xuY29uc3QgbWtkaXJwU3luYyA9IHJlcXVpcmUoJy4uL21rZGlycycpLm1rZGlycFN5bmNcbmNvbnN0IHN0YXQgPSByZXF1aXJlKCcuLi91dGlsL3N0YXQnKVxuXG5mdW5jdGlvbiBtb3ZlU3luYyAoc3JjLCBkZXN0LCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IG9wdHMub3ZlcndyaXRlIHx8IG9wdHMuY2xvYmJlciB8fCBmYWxzZVxuXG4gIGNvbnN0IHsgc3JjU3RhdCwgaXNDaGFuZ2luZ0Nhc2UgPSBmYWxzZSB9ID0gc3RhdC5jaGVja1BhdGhzU3luYyhzcmMsIGRlc3QsICdtb3ZlJywgb3B0cylcbiAgc3RhdC5jaGVja1BhcmVudFBhdGhzU3luYyhzcmMsIHNyY1N0YXQsIGRlc3QsICdtb3ZlJylcbiAgaWYgKCFpc1BhcmVudFJvb3QoZGVzdCkpIG1rZGlycFN5bmMocGF0aC5kaXJuYW1lKGRlc3QpKVxuICByZXR1cm4gZG9SZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUsIGlzQ2hhbmdpbmdDYXNlKVxufVxuXG5mdW5jdGlvbiBpc1BhcmVudFJvb3QgKGRlc3QpIHtcbiAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGRlc3QpXG4gIGNvbnN0IHBhcnNlZFBhdGggPSBwYXRoLnBhcnNlKHBhcmVudClcbiAgcmV0dXJuIHBhcnNlZFBhdGgucm9vdCA9PT0gcGFyZW50XG59XG5cbmZ1bmN0aW9uIGRvUmVuYW1lIChzcmMsIGRlc3QsIG92ZXJ3cml0ZSwgaXNDaGFuZ2luZ0Nhc2UpIHtcbiAgaWYgKGlzQ2hhbmdpbmdDYXNlKSByZXR1cm4gcmVuYW1lKHNyYywgZGVzdCwgb3ZlcndyaXRlKVxuICBpZiAob3ZlcndyaXRlKSB7XG4gICAgcmVtb3ZlU3luYyhkZXN0KVxuICAgIHJldHVybiByZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG4gIH1cbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGVzdCkpIHRocm93IG5ldyBFcnJvcignZGVzdCBhbHJlYWR5IGV4aXN0cy4nKVxuICByZXR1cm4gcmVuYW1lKHNyYywgZGVzdCwgb3ZlcndyaXRlKVxufVxuXG5mdW5jdGlvbiByZW5hbWUgKHNyYywgZGVzdCwgb3ZlcndyaXRlKSB7XG4gIHRyeSB7XG4gICAgZnMucmVuYW1lU3luYyhzcmMsIGRlc3QpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIuY29kZSAhPT0gJ0VYREVWJykgdGhyb3cgZXJyXG4gICAgcmV0dXJuIG1vdmVBY3Jvc3NEZXZpY2Uoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gbW92ZUFjcm9zc0RldmljZSAoc3JjLCBkZXN0LCBvdmVyd3JpdGUpIHtcbiAgY29uc3Qgb3B0cyA9IHtcbiAgICBvdmVyd3JpdGUsXG4gICAgZXJyb3JPbkV4aXN0OiB0cnVlLFxuICAgIHByZXNlcnZlVGltZXN0YW1wczogdHJ1ZVxuICB9XG4gIGNvcHlTeW5jKHNyYywgZGVzdCwgb3B0cylcbiAgcmV0dXJuIHJlbW92ZVN5bmMoc3JjKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1vdmVTeW5jXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCB7IGNvcHkgfSA9IHJlcXVpcmUoJy4uL2NvcHknKVxuY29uc3QgeyByZW1vdmUgfSA9IHJlcXVpcmUoJy4uL3JlbW92ZScpXG5jb25zdCB7IG1rZGlycCB9ID0gcmVxdWlyZSgnLi4vbWtkaXJzJylcbmNvbnN0IHsgcGF0aEV4aXN0cyB9ID0gcmVxdWlyZSgnLi4vcGF0aC1leGlzdHMnKVxuY29uc3Qgc3RhdCA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmFzeW5jIGZ1bmN0aW9uIG1vdmUgKHNyYywgZGVzdCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IG9wdHMub3ZlcndyaXRlIHx8IG9wdHMuY2xvYmJlciB8fCBmYWxzZVxuXG4gIGNvbnN0IHsgc3JjU3RhdCwgaXNDaGFuZ2luZ0Nhc2UgPSBmYWxzZSB9ID0gYXdhaXQgc3RhdC5jaGVja1BhdGhzKHNyYywgZGVzdCwgJ21vdmUnLCBvcHRzKVxuXG4gIGF3YWl0IHN0YXQuY2hlY2tQYXJlbnRQYXRocyhzcmMsIHNyY1N0YXQsIGRlc3QsICdtb3ZlJylcblxuICAvLyBJZiB0aGUgcGFyZW50IG9mIGRlc3QgaXMgbm90IHJvb3QsIG1ha2Ugc3VyZSBpdCBleGlzdHMgYmVmb3JlIHByb2NlZWRpbmdcbiAgY29uc3QgZGVzdFBhcmVudCA9IHBhdGguZGlybmFtZShkZXN0KVxuICBjb25zdCBwYXJzZWRQYXJlbnRQYXRoID0gcGF0aC5wYXJzZShkZXN0UGFyZW50KVxuICBpZiAocGFyc2VkUGFyZW50UGF0aC5yb290ICE9PSBkZXN0UGFyZW50KSB7XG4gICAgYXdhaXQgbWtkaXJwKGRlc3RQYXJlbnQpXG4gIH1cblxuICByZXR1cm4gZG9SZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUsIGlzQ2hhbmdpbmdDYXNlKVxufVxuXG5hc3luYyBmdW5jdGlvbiBkb1JlbmFtZSAoc3JjLCBkZXN0LCBvdmVyd3JpdGUsIGlzQ2hhbmdpbmdDYXNlKSB7XG4gIGlmICghaXNDaGFuZ2luZ0Nhc2UpIHtcbiAgICBpZiAob3ZlcndyaXRlKSB7XG4gICAgICBhd2FpdCByZW1vdmUoZGVzdClcbiAgICB9IGVsc2UgaWYgKGF3YWl0IHBhdGhFeGlzdHMoZGVzdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGVzdCBhbHJlYWR5IGV4aXN0cy4nKVxuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVHJ5IHcvIHJlbmFtZSBmaXJzdCwgYW5kIHRyeSBjb3B5ICsgcmVtb3ZlIGlmIEVYREVWXG4gICAgYXdhaXQgZnMucmVuYW1lKHNyYywgZGVzdClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlICE9PSAnRVhERVYnKSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gICAgYXdhaXQgbW92ZUFjcm9zc0RldmljZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSlcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBtb3ZlQWNyb3NzRGV2aWNlIChzcmMsIGRlc3QsIG92ZXJ3cml0ZSkge1xuICBjb25zdCBvcHRzID0ge1xuICAgIG92ZXJ3cml0ZSxcbiAgICBlcnJvck9uRXhpc3Q6IHRydWUsXG4gICAgcHJlc2VydmVUaW1lc3RhbXBzOiB0cnVlXG4gIH1cblxuICBhd2FpdCBjb3B5KHNyYywgZGVzdCwgb3B0cylcbiAgcmV0dXJuIHJlbW92ZShzcmMpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbW92ZVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCBta2RpciA9IHJlcXVpcmUoJy4uL21rZGlycycpXG5jb25zdCBwYXRoRXhpc3RzID0gcmVxdWlyZSgnLi4vcGF0aC1leGlzdHMnKS5wYXRoRXhpc3RzXG5cbmFzeW5jIGZ1bmN0aW9uIG91dHB1dEZpbGUgKGZpbGUsIGRhdGEsIGVuY29kaW5nID0gJ3V0Zi04Jykge1xuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZmlsZSlcblxuICBpZiAoIShhd2FpdCBwYXRoRXhpc3RzKGRpcikpKSB7XG4gICAgYXdhaXQgbWtkaXIubWtkaXJzKGRpcilcbiAgfVxuXG4gIHJldHVybiBmcy53cml0ZUZpbGUoZmlsZSwgZGF0YSwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIG91dHB1dEZpbGVTeW5jIChmaWxlLCAuLi5hcmdzKSB7XG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShmaWxlKVxuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuICAgIG1rZGlyLm1rZGlyc1N5bmMoZGlyKVxuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCAuLi5hcmdzKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgb3V0cHV0RmlsZTogdShvdXRwdXRGaWxlKSxcbiAgb3V0cHV0RmlsZVN5bmNcbn1cbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcblxuZnVuY3Rpb24gcGF0aEV4aXN0cyAocGF0aCkge1xuICByZXR1cm4gZnMuYWNjZXNzKHBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSkuY2F0Y2goKCkgPT4gZmFsc2UpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwYXRoRXhpc3RzOiB1KHBhdGhFeGlzdHMpLFxuICBwYXRoRXhpc3RzU3luYzogZnMuZXhpc3RzU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKVxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21DYWxsYmFja1xuXG5mdW5jdGlvbiByZW1vdmUgKHBhdGgsIGNhbGxiYWNrKSB7XG4gIGZzLnJtKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9LCBjYWxsYmFjaylcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3luYyAocGF0aCkge1xuICBmcy5ybVN5bmMocGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICByZW1vdmU6IHUocmVtb3ZlKSxcbiAgcmVtb3ZlU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5cbmZ1bmN0aW9uIGdldFN0YXRzIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgY29uc3Qgc3RhdEZ1bmMgPSBvcHRzLmRlcmVmZXJlbmNlXG4gICAgPyAoZmlsZSkgPT4gZnMuc3RhdChmaWxlLCB7IGJpZ2ludDogdHJ1ZSB9KVxuICAgIDogKGZpbGUpID0+IGZzLmxzdGF0KGZpbGUsIHsgYmlnaW50OiB0cnVlIH0pXG4gIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgc3RhdEZ1bmMoc3JjKSxcbiAgICBzdGF0RnVuYyhkZXN0KS5jYXRjaChlcnIgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIG51bGxcbiAgICAgIHRocm93IGVyclxuICAgIH0pXG4gIF0pLnRoZW4oKFtzcmNTdGF0LCBkZXN0U3RhdF0pID0+ICh7IHNyY1N0YXQsIGRlc3RTdGF0IH0pKVxufVxuXG5mdW5jdGlvbiBnZXRTdGF0c1N5bmMgKHNyYywgZGVzdCwgb3B0cykge1xuICBsZXQgZGVzdFN0YXRcbiAgY29uc3Qgc3RhdEZ1bmMgPSBvcHRzLmRlcmVmZXJlbmNlXG4gICAgPyAoZmlsZSkgPT4gZnMuc3RhdFN5bmMoZmlsZSwgeyBiaWdpbnQ6IHRydWUgfSlcbiAgICA6IChmaWxlKSA9PiBmcy5sc3RhdFN5bmMoZmlsZSwgeyBiaWdpbnQ6IHRydWUgfSlcbiAgY29uc3Qgc3JjU3RhdCA9IHN0YXRGdW5jKHNyYylcbiAgdHJ5IHtcbiAgICBkZXN0U3RhdCA9IHN0YXRGdW5jKGRlc3QpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiB7IHNyY1N0YXQsIGRlc3RTdGF0OiBudWxsIH1cbiAgICB0aHJvdyBlcnJcbiAgfVxuICByZXR1cm4geyBzcmNTdGF0LCBkZXN0U3RhdCB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUGF0aHMgKHNyYywgZGVzdCwgZnVuY05hbWUsIG9wdHMpIHtcbiAgY29uc3QgeyBzcmNTdGF0LCBkZXN0U3RhdCB9ID0gYXdhaXQgZ2V0U3RhdHMoc3JjLCBkZXN0LCBvcHRzKVxuICBpZiAoZGVzdFN0YXQpIHtcbiAgICBpZiAoYXJlSWRlbnRpY2FsKHNyY1N0YXQsIGRlc3RTdGF0KSkge1xuICAgICAgY29uc3Qgc3JjQmFzZU5hbWUgPSBwYXRoLmJhc2VuYW1lKHNyYylcbiAgICAgIGNvbnN0IGRlc3RCYXNlTmFtZSA9IHBhdGguYmFzZW5hbWUoZGVzdClcbiAgICAgIGlmIChmdW5jTmFtZSA9PT0gJ21vdmUnICYmXG4gICAgICAgIHNyY0Jhc2VOYW1lICE9PSBkZXN0QmFzZU5hbWUgJiZcbiAgICAgICAgc3JjQmFzZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZGVzdEJhc2VOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIHsgc3JjU3RhdCwgZGVzdFN0YXQsIGlzQ2hhbmdpbmdDYXNlOiB0cnVlIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignU291cmNlIGFuZCBkZXN0aW5hdGlvbiBtdXN0IG5vdCBiZSB0aGUgc2FtZS4nKVxuICAgIH1cbiAgICBpZiAoc3JjU3RhdC5pc0RpcmVjdG9yeSgpICYmICFkZXN0U3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgbm9uLWRpcmVjdG9yeSAnJHtkZXN0fScgd2l0aCBkaXJlY3RvcnkgJyR7c3JjfScuYClcbiAgICB9XG4gICAgaWYgKCFzcmNTdGF0LmlzRGlyZWN0b3J5KCkgJiYgZGVzdFN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3ZlcndyaXRlIGRpcmVjdG9yeSAnJHtkZXN0fScgd2l0aCBub24tZGlyZWN0b3J5ICcke3NyY30nLmApXG4gICAgfVxuICB9XG5cbiAgaWYgKHNyY1N0YXQuaXNEaXJlY3RvcnkoKSAmJiBpc1NyY1N1YmRpcihzcmMsIGRlc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyhzcmMsIGRlc3QsIGZ1bmNOYW1lKSlcbiAgfVxuXG4gIHJldHVybiB7IHNyY1N0YXQsIGRlc3RTdGF0IH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQYXRoc1N5bmMgKHNyYywgZGVzdCwgZnVuY05hbWUsIG9wdHMpIHtcbiAgY29uc3QgeyBzcmNTdGF0LCBkZXN0U3RhdCB9ID0gZ2V0U3RhdHNTeW5jKHNyYywgZGVzdCwgb3B0cylcblxuICBpZiAoZGVzdFN0YXQpIHtcbiAgICBpZiAoYXJlSWRlbnRpY2FsKHNyY1N0YXQsIGRlc3RTdGF0KSkge1xuICAgICAgY29uc3Qgc3JjQmFzZU5hbWUgPSBwYXRoLmJhc2VuYW1lKHNyYylcbiAgICAgIGNvbnN0IGRlc3RCYXNlTmFtZSA9IHBhdGguYmFzZW5hbWUoZGVzdClcbiAgICAgIGlmIChmdW5jTmFtZSA9PT0gJ21vdmUnICYmXG4gICAgICAgIHNyY0Jhc2VOYW1lICE9PSBkZXN0QmFzZU5hbWUgJiZcbiAgICAgICAgc3JjQmFzZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZGVzdEJhc2VOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIHsgc3JjU3RhdCwgZGVzdFN0YXQsIGlzQ2hhbmdpbmdDYXNlOiB0cnVlIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignU291cmNlIGFuZCBkZXN0aW5hdGlvbiBtdXN0IG5vdCBiZSB0aGUgc2FtZS4nKVxuICAgIH1cbiAgICBpZiAoc3JjU3RhdC5pc0RpcmVjdG9yeSgpICYmICFkZXN0U3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgbm9uLWRpcmVjdG9yeSAnJHtkZXN0fScgd2l0aCBkaXJlY3RvcnkgJyR7c3JjfScuYClcbiAgICB9XG4gICAgaWYgKCFzcmNTdGF0LmlzRGlyZWN0b3J5KCkgJiYgZGVzdFN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3ZlcndyaXRlIGRpcmVjdG9yeSAnJHtkZXN0fScgd2l0aCBub24tZGlyZWN0b3J5ICcke3NyY30nLmApXG4gICAgfVxuICB9XG5cbiAgaWYgKHNyY1N0YXQuaXNEaXJlY3RvcnkoKSAmJiBpc1NyY1N1YmRpcihzcmMsIGRlc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyhzcmMsIGRlc3QsIGZ1bmNOYW1lKSlcbiAgfVxuICByZXR1cm4geyBzcmNTdGF0LCBkZXN0U3RhdCB9XG59XG5cbi8vIHJlY3Vyc2l2ZWx5IGNoZWNrIGlmIGRlc3QgcGFyZW50IGlzIGEgc3ViZGlyZWN0b3J5IG9mIHNyYy5cbi8vIEl0IHdvcmtzIGZvciBhbGwgZmlsZSB0eXBlcyBpbmNsdWRpbmcgc3ltbGlua3Mgc2luY2UgaXRcbi8vIGNoZWNrcyB0aGUgc3JjIGFuZCBkZXN0IGlub2Rlcy4gSXQgc3RhcnRzIGZyb20gdGhlIGRlZXBlc3Rcbi8vIHBhcmVudCBhbmQgc3RvcHMgb25jZSBpdCByZWFjaGVzIHRoZSBzcmMgcGFyZW50IG9yIHRoZSByb290IHBhdGguXG5hc3luYyBmdW5jdGlvbiBjaGVja1BhcmVudFBhdGhzIChzcmMsIHNyY1N0YXQsIGRlc3QsIGZ1bmNOYW1lKSB7XG4gIGNvbnN0IHNyY1BhcmVudCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUoc3JjKSlcbiAgY29uc3QgZGVzdFBhcmVudCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUoZGVzdCkpXG4gIGlmIChkZXN0UGFyZW50ID09PSBzcmNQYXJlbnQgfHwgZGVzdFBhcmVudCA9PT0gcGF0aC5wYXJzZShkZXN0UGFyZW50KS5yb290KSByZXR1cm5cblxuICBsZXQgZGVzdFN0YXRcbiAgdHJ5IHtcbiAgICBkZXN0U3RhdCA9IGF3YWl0IGZzLnN0YXQoZGVzdFBhcmVudCwgeyBiaWdpbnQ6IHRydWUgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICBpZiAoYXJlSWRlbnRpY2FsKHNyY1N0YXQsIGRlc3RTdGF0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2coc3JjLCBkZXN0LCBmdW5jTmFtZSkpXG4gIH1cblxuICByZXR1cm4gY2hlY2tQYXJlbnRQYXRocyhzcmMsIHNyY1N0YXQsIGRlc3RQYXJlbnQsIGZ1bmNOYW1lKVxufVxuXG5mdW5jdGlvbiBjaGVja1BhcmVudFBhdGhzU3luYyAoc3JjLCBzcmNTdGF0LCBkZXN0LCBmdW5jTmFtZSkge1xuICBjb25zdCBzcmNQYXJlbnQgPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKHNyYykpXG4gIGNvbnN0IGRlc3RQYXJlbnQgPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKGRlc3QpKVxuICBpZiAoZGVzdFBhcmVudCA9PT0gc3JjUGFyZW50IHx8IGRlc3RQYXJlbnQgPT09IHBhdGgucGFyc2UoZGVzdFBhcmVudCkucm9vdCkgcmV0dXJuXG4gIGxldCBkZXN0U3RhdFxuICB0cnkge1xuICAgIGRlc3RTdGF0ID0gZnMuc3RhdFN5bmMoZGVzdFBhcmVudCwgeyBiaWdpbnQ6IHRydWUgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuXG4gICAgdGhyb3cgZXJyXG4gIH1cbiAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkZXN0U3RhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKHNyYywgZGVzdCwgZnVuY05hbWUpKVxuICB9XG4gIHJldHVybiBjaGVja1BhcmVudFBhdGhzU3luYyhzcmMsIHNyY1N0YXQsIGRlc3RQYXJlbnQsIGZ1bmNOYW1lKVxufVxuXG5mdW5jdGlvbiBhcmVJZGVudGljYWwgKHNyY1N0YXQsIGRlc3RTdGF0KSB7XG4gIHJldHVybiBkZXN0U3RhdC5pbm8gJiYgZGVzdFN0YXQuZGV2ICYmIGRlc3RTdGF0LmlubyA9PT0gc3JjU3RhdC5pbm8gJiYgZGVzdFN0YXQuZGV2ID09PSBzcmNTdGF0LmRldlxufVxuXG4vLyByZXR1cm4gdHJ1ZSBpZiBkZXN0IGlzIGEgc3ViZGlyIG9mIHNyYywgb3RoZXJ3aXNlIGZhbHNlLlxuLy8gSXQgb25seSBjaGVja3MgdGhlIHBhdGggc3RyaW5ncy5cbmZ1bmN0aW9uIGlzU3JjU3ViZGlyIChzcmMsIGRlc3QpIHtcbiAgY29uc3Qgc3JjQXJyID0gcGF0aC5yZXNvbHZlKHNyYykuc3BsaXQocGF0aC5zZXApLmZpbHRlcihpID0+IGkpXG4gIGNvbnN0IGRlc3RBcnIgPSBwYXRoLnJlc29sdmUoZGVzdCkuc3BsaXQocGF0aC5zZXApLmZpbHRlcihpID0+IGkpXG4gIHJldHVybiBzcmNBcnIuZXZlcnkoKGN1ciwgaSkgPT4gZGVzdEFycltpXSA9PT0gY3VyKVxufVxuXG5mdW5jdGlvbiBlcnJNc2cgKHNyYywgZGVzdCwgZnVuY05hbWUpIHtcbiAgcmV0dXJuIGBDYW5ub3QgJHtmdW5jTmFtZX0gJyR7c3JjfScgdG8gYSBzdWJkaXJlY3Rvcnkgb2YgaXRzZWxmLCAnJHtkZXN0fScuYFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gY2hlY2tQYXRoc1xuICBjaGVja1BhdGhzOiB1KGNoZWNrUGF0aHMpLFxuICBjaGVja1BhdGhzU3luYyxcbiAgLy8gY2hlY2tQYXJlbnRcbiAgY2hlY2tQYXJlbnRQYXRoczogdShjaGVja1BhcmVudFBhdGhzKSxcbiAgY2hlY2tQYXJlbnRQYXRoc1N5bmMsXG4gIC8vIE1pc2NcbiAgaXNTcmNTdWJkaXIsXG4gIGFyZUlkZW50aWNhbFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5cbmFzeW5jIGZ1bmN0aW9uIHV0aW1lc01pbGxpcyAocGF0aCwgYXRpbWUsIG10aW1lKSB7XG4gIC8vIGlmICghSEFTX01JTExJU19SRVMpIHJldHVybiBmcy51dGltZXMocGF0aCwgYXRpbWUsIG10aW1lLCBjYWxsYmFjaylcbiAgY29uc3QgZmQgPSBhd2FpdCBmcy5vcGVuKHBhdGgsICdyKycpXG5cbiAgbGV0IGNsb3NlRXJyID0gbnVsbFxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZnMuZnV0aW1lcyhmZCwgYXRpbWUsIG10aW1lKVxuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5jbG9zZShmZClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjbG9zZUVyciA9IGVcbiAgICB9XG4gIH1cblxuICBpZiAoY2xvc2VFcnIpIHtcbiAgICB0aHJvdyBjbG9zZUVyclxuICB9XG59XG5cbmZ1bmN0aW9uIHV0aW1lc01pbGxpc1N5bmMgKHBhdGgsIGF0aW1lLCBtdGltZSkge1xuICBjb25zdCBmZCA9IGZzLm9wZW5TeW5jKHBhdGgsICdyKycpXG4gIGZzLmZ1dGltZXNTeW5jKGZkLCBhdGltZSwgbXRpbWUpXG4gIHJldHVybiBmcy5jbG9zZVN5bmMoZmQpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB1dGltZXNNaWxsaXM6IHUodXRpbWVzTWlsbGlzKSxcbiAgdXRpbWVzTWlsbGlzU3luY1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDYWxsIHRoaXMgZnVuY3Rpb24gaW4gYSBhbm90aGVyIGZ1bmN0aW9uIHRvIGZpbmQgb3V0IHRoZSBmaWxlIGZyb21cbi8vIHdoaWNoIHRoYXQgZnVuY3Rpb24gd2FzIGNhbGxlZCBmcm9tLiAoSW5zcGVjdHMgdGhlIHY4IHN0YWNrIHRyYWNlKVxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTMyMjc0ODlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0Q2FsbGVyRmlsZShwb3NpdGlvbikge1xuICAgIGlmIChwb3NpdGlvbiA9PT0gdm9pZCAwKSB7IHBvc2l0aW9uID0gMjsgfVxuICAgIGlmIChwb3NpdGlvbiA+PSBFcnJvci5zdGFja1RyYWNlTGltaXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZ2V0Q2FsbGVyRmlsZShwb3NpdGlvbikgcmVxdWlyZXMgcG9zaXRpb24gYmUgbGVzcyB0aGVuIEVycm9yLnN0YWNrVHJhY2VMaW1pdCBidXQgcG9zaXRpb24gd2FzOiBgJyArIHBvc2l0aW9uICsgJ2AgYW5kIEVycm9yLnN0YWNrVHJhY2VMaW1pdCB3YXM6IGAnICsgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0ICsgJ2AnKTtcbiAgICB9XG4gICAgdmFyIG9sZFByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBmdW5jdGlvbiAoXywgc3RhY2spIHsgcmV0dXJuIHN0YWNrOyB9O1xuICAgIHZhciBzdGFjayA9IG5ldyBFcnJvcigpLnN0YWNrO1xuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gb2xkUHJlcGFyZVN0YWNrVHJhY2U7XG4gICAgaWYgKHN0YWNrICE9PSBudWxsICYmIHR5cGVvZiBzdGFjayA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gc3RhY2tbMF0gaG9sZHMgdGhpcyBmaWxlXG4gICAgICAgIC8vIHN0YWNrWzFdIGhvbGRzIHdoZXJlIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZFxuICAgICAgICAvLyBzdGFja1syXSBob2xkcyB0aGUgZmlsZSB3ZSdyZSBpbnRlcmVzdGVkIGluXG4gICAgICAgIHJldHVybiBzdGFja1twb3NpdGlvbl0gPyBzdGFja1twb3NpdGlvbl0uZ2V0RmlsZU5hbWUoKSA6IHVuZGVmaW5lZDtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3Qge1Bhc3NUaHJvdWdoOiBQYXNzVGhyb3VnaFN0cmVhbX0gPSByZXF1aXJlKCdzdHJlYW0nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBvcHRpb25zID0+IHtcblx0b3B0aW9ucyA9IHsuLi5vcHRpb25zfTtcblxuXHRjb25zdCB7YXJyYXl9ID0gb3B0aW9ucztcblx0bGV0IHtlbmNvZGluZ30gPSBvcHRpb25zO1xuXHRjb25zdCBpc0J1ZmZlciA9IGVuY29kaW5nID09PSAnYnVmZmVyJztcblx0bGV0IG9iamVjdE1vZGUgPSBmYWxzZTtcblxuXHRpZiAoYXJyYXkpIHtcblx0XHRvYmplY3RNb2RlID0gIShlbmNvZGluZyB8fCBpc0J1ZmZlcik7XG5cdH0gZWxzZSB7XG5cdFx0ZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAndXRmOCc7XG5cdH1cblxuXHRpZiAoaXNCdWZmZXIpIHtcblx0XHRlbmNvZGluZyA9IG51bGw7XG5cdH1cblxuXHRjb25zdCBzdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2hTdHJlYW0oe29iamVjdE1vZGV9KTtcblxuXHRpZiAoZW5jb2RpbmcpIHtcblx0XHRzdHJlYW0uc2V0RW5jb2RpbmcoZW5jb2RpbmcpO1xuXHR9XG5cblx0bGV0IGxlbmd0aCA9IDA7XG5cdGNvbnN0IGNodW5rcyA9IFtdO1xuXG5cdHN0cmVhbS5vbignZGF0YScsIGNodW5rID0+IHtcblx0XHRjaHVua3MucHVzaChjaHVuayk7XG5cblx0XHRpZiAob2JqZWN0TW9kZSkge1xuXHRcdFx0bGVuZ3RoID0gY2h1bmtzLmxlbmd0aDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGVuZ3RoICs9IGNodW5rLmxlbmd0aDtcblx0XHR9XG5cdH0pO1xuXG5cdHN0cmVhbS5nZXRCdWZmZXJlZFZhbHVlID0gKCkgPT4ge1xuXHRcdGlmIChhcnJheSkge1xuXHRcdFx0cmV0dXJuIGNodW5rcztcblx0XHR9XG5cblx0XHRyZXR1cm4gaXNCdWZmZXIgPyBCdWZmZXIuY29uY2F0KGNodW5rcywgbGVuZ3RoKSA6IGNodW5rcy5qb2luKCcnKTtcblx0fTtcblxuXHRzdHJlYW0uZ2V0QnVmZmVyZWRMZW5ndGggPSAoKSA9PiBsZW5ndGg7XG5cblx0cmV0dXJuIHN0cmVhbTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCB7Y29uc3RhbnRzOiBCdWZmZXJDb25zdGFudHN9ID0gcmVxdWlyZSgnYnVmZmVyJyk7XG5jb25zdCBwdW1wID0gcmVxdWlyZSgncHVtcCcpO1xuY29uc3QgYnVmZmVyU3RyZWFtID0gcmVxdWlyZSgnLi9idWZmZXItc3RyZWFtJyk7XG5cbmNsYXNzIE1heEJ1ZmZlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcignbWF4QnVmZmVyIGV4Y2VlZGVkJyk7XG5cdFx0dGhpcy5uYW1lID0gJ01heEJ1ZmZlckVycm9yJztcblx0fVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRTdHJlYW0oaW5wdXRTdHJlYW0sIG9wdGlvbnMpIHtcblx0aWYgKCFpbnB1dFN0cmVhbSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgc3RyZWFtJykpO1xuXHR9XG5cblx0b3B0aW9ucyA9IHtcblx0XHRtYXhCdWZmZXI6IEluZmluaXR5LFxuXHRcdC4uLm9wdGlvbnNcblx0fTtcblxuXHRjb25zdCB7bWF4QnVmZmVyfSA9IG9wdGlvbnM7XG5cblx0bGV0IHN0cmVhbTtcblx0YXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IHJlamVjdFByb21pc2UgPSBlcnJvciA9PiB7XG5cdFx0XHQvLyBEb24ndCByZXRyaWV2ZSBhbiBvdmVyc2l6ZWQgYnVmZmVyLlxuXHRcdFx0aWYgKGVycm9yICYmIHN0cmVhbS5nZXRCdWZmZXJlZExlbmd0aCgpIDw9IEJ1ZmZlckNvbnN0YW50cy5NQVhfTEVOR1RIKSB7XG5cdFx0XHRcdGVycm9yLmJ1ZmZlcmVkRGF0YSA9IHN0cmVhbS5nZXRCdWZmZXJlZFZhbHVlKCk7XG5cdFx0XHR9XG5cblx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0fTtcblxuXHRcdHN0cmVhbSA9IHB1bXAoaW5wdXRTdHJlYW0sIGJ1ZmZlclN0cmVhbShvcHRpb25zKSwgZXJyb3IgPT4ge1xuXHRcdFx0aWYgKGVycm9yKSB7XG5cdFx0XHRcdHJlamVjdFByb21pc2UoZXJyb3IpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblxuXHRcdHN0cmVhbS5vbignZGF0YScsICgpID0+IHtcblx0XHRcdGlmIChzdHJlYW0uZ2V0QnVmZmVyZWRMZW5ndGgoKSA+IG1heEJ1ZmZlcikge1xuXHRcdFx0XHRyZWplY3RQcm9taXNlKG5ldyBNYXhCdWZmZXJFcnJvcigpKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG5cblx0cmV0dXJuIHN0cmVhbS5nZXRCdWZmZXJlZFZhbHVlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3RyZWFtO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgZm9yIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Vcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBnZXRTdHJlYW07XG5tb2R1bGUuZXhwb3J0cy5idWZmZXIgPSAoc3RyZWFtLCBvcHRpb25zKSA9PiBnZXRTdHJlYW0oc3RyZWFtLCB7Li4ub3B0aW9ucywgZW5jb2Rpbmc6ICdidWZmZXInfSk7XG5tb2R1bGUuZXhwb3J0cy5hcnJheSA9IChzdHJlYW0sIG9wdGlvbnMpID0+IGdldFN0cmVhbShzdHJlYW0sIHsuLi5vcHRpb25zLCBhcnJheTogdHJ1ZX0pO1xubW9kdWxlLmV4cG9ydHMuTWF4QnVmZmVyRXJyb3IgPSBNYXhCdWZmZXJFcnJvcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kYXRhID0gdm9pZCAwO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY29uc3QgY3J5cHRvXzEgPSByZXF1aXJlKFwiY3J5cHRvXCIpO1xuY29uc3QgZGF0YV91cmlfdG9fYnVmZmVyXzEgPSByZXF1aXJlKFwiZGF0YS11cmktdG8tYnVmZmVyXCIpO1xuY29uc3Qgbm90bW9kaWZpZWRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9ub3Rtb2RpZmllZFwiKSk7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdnZXQtdXJpOmRhdGEnKTtcbmNsYXNzIERhdGFSZWFkYWJsZSBleHRlbmRzIHN0cmVhbV8xLlJlYWRhYmxlIHtcbiAgICBjb25zdHJ1Y3RvcihoYXNoLCBidWYpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wdXNoKGJ1Zik7XG4gICAgICAgIHRoaXMucHVzaChudWxsKTtcbiAgICAgICAgdGhpcy5oYXNoID0gaGFzaDtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgYSBSZWFkYWJsZSBzdHJlYW0gZnJvbSBhIFwiZGF0YTpcIiBVUkkuXG4gKi9cbmNvbnN0IGRhdGEgPSBhc3luYyAoeyBocmVmOiB1cmkgfSwgeyBjYWNoZSB9ID0ge30pID0+IHtcbiAgICAvLyBuZWVkIHRvIGNyZWF0ZSBhIFNIQTEgaGFzaCBvZiB0aGUgVVJJIHN0cmluZywgZm9yIGNhY2hlYWJpbGl0eSBjaGVja3NcbiAgICAvLyBpbiBmdXR1cmUgYGdldFVyaSgpYCBjYWxscyB3aXRoIHRoZSBzYW1lIGRhdGEgVVJJIHBhc3NlZCBpbi5cbiAgICBjb25zdCBzaGFzdW0gPSAoMCwgY3J5cHRvXzEuY3JlYXRlSGFzaCkoJ3NoYTEnKTtcbiAgICBzaGFzdW0udXBkYXRlKHVyaSk7XG4gICAgY29uc3QgaGFzaCA9IHNoYXN1bS5kaWdlc3QoJ2hleCcpO1xuICAgIGRlYnVnKCdnZW5lcmF0ZWQgU0hBMSBoYXNoIGZvciBcImRhdGE6XCIgVVJJOiAlbycsIGhhc2gpO1xuICAgIC8vIGNoZWNrIGlmIHRoZSBjYWNoZSBpcyB0aGUgc2FtZSBcImRhdGE6XCIgVVJJIHRoYXQgd2FzIHByZXZpb3VzbHkgcGFzc2VkIGluLlxuICAgIGlmIChjYWNoZT8uaGFzaCA9PT0gaGFzaCkge1xuICAgICAgICBkZWJ1ZygnZ290IG1hdGNoaW5nIGNhY2hlIFNIQTEgaGFzaDogJW8nLCBoYXNoKTtcbiAgICAgICAgdGhyb3cgbmV3IG5vdG1vZGlmaWVkXzEuZGVmYXVsdCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGVidWcoJ2NyZWF0aW5nIFJlYWRhYmxlIHN0cmVhbSBmcm9tIFwiZGF0YTpcIiBVUkkgYnVmZmVyJyk7XG4gICAgICAgIGNvbnN0IHsgYnVmZmVyIH0gPSAoMCwgZGF0YV91cmlfdG9fYnVmZmVyXzEuZGF0YVVyaVRvQnVmZmVyKSh1cmkpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGFSZWFkYWJsZShoYXNoLCBCdWZmZXIuZnJvbShidWZmZXIpKTtcbiAgICB9XG59O1xuZXhwb3J0cy5kYXRhID0gZGF0YTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGEuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmZpbGUgPSB2b2lkIDA7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBmc18xID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3QgZnNfZXh0cmFfMSA9IHJlcXVpcmUoXCJmcy1leHRyYVwiKTtcbmNvbnN0IG5vdGZvdW5kXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbm90Zm91bmRcIikpO1xuY29uc3Qgbm90bW9kaWZpZWRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9ub3Rtb2RpZmllZFwiKSk7XG5jb25zdCB1cmxfMSA9IHJlcXVpcmUoXCJ1cmxcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdnZXQtdXJpOmZpbGUnKTtcbi8qKlxuICogUmV0dXJucyBhIGBmcy5SZWFkU3RyZWFtYCBpbnN0YW5jZSBmcm9tIGEgXCJmaWxlOlwiIFVSSS5cbiAqL1xuY29uc3QgZmlsZSA9IGFzeW5jICh7IGhyZWY6IHVyaSB9LCBvcHRzID0ge30pID0+IHtcbiAgICBjb25zdCB7IGNhY2hlLCBmbGFncyA9ICdyJywgbW9kZSA9IDQzOCwgLy8gPTA2NjZcbiAgICAgfSA9IG9wdHM7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gQ29udmVydCBVUkkg4oaSIFBhdGhcbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSAoMCwgdXJsXzEuZmlsZVVSTFRvUGF0aCkodXJpKTtcbiAgICAgICAgZGVidWcoJ05vcm1hbGl6ZWQgcGF0aG5hbWU6ICVvJywgZmlsZXBhdGgpO1xuICAgICAgICAvLyBgb3BlbigpYCBmaXJzdCB0byBnZXQgYSBmaWxlIGRlc2NyaXB0b3IgYW5kIGVuc3VyZSB0aGF0IHRoZSBmaWxlXG4gICAgICAgIC8vIGV4aXN0cy5cbiAgICAgICAgY29uc3QgZmQgPSBhd2FpdCAoMCwgZnNfZXh0cmFfMS5vcGVuKShmaWxlcGF0aCwgZmxhZ3MsIG1vZGUpO1xuICAgICAgICAvLyBOb3cgYGZzdGF0KClgIHRvIGNoZWNrIHRoZSBgbXRpbWVgIGFuZCBzdG9yZSB0aGUgc3RhdCBvYmplY3QgZm9yXG4gICAgICAgIC8vIHRoZSBjYWNoZS5cbiAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0ICgwLCBmc19leHRyYV8xLmZzdGF0KShmZCk7XG4gICAgICAgIC8vIGlmIGEgYGNhY2hlYCB3YXMgcHJvdmlkZWQsIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBub3QgYmVlbiBtb2RpZmllZFxuICAgICAgICBpZiAoY2FjaGUgJiYgY2FjaGUuc3RhdCAmJiBzdGF0ICYmIGlzTm90TW9kaWZpZWQoY2FjaGUuc3RhdCwgc3RhdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBub3Rtb2RpZmllZF8xLmRlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBgZnMuUmVhZFN0cmVhbWAgdGFrZXMgY2FyZSBvZiBjYWxsaW5nIGBmcy5jbG9zZSgpYCBvbiB0aGVcbiAgICAgICAgLy8gZmQgYWZ0ZXIgaXQncyBkb25lIHJlYWRpbmdcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgQHR5cGVzL25vZGVgIGRvZXNuJ3QgYWxsb3cgYG51bGxgIGFzIGZpbGUgcGF0aCA6L1xuICAgICAgICBjb25zdCBycyA9ICgwLCBmc18xLmNyZWF0ZVJlYWRTdHJlYW0pKG51bGwsIHtcbiAgICAgICAgICAgIGF1dG9DbG9zZTogdHJ1ZSxcbiAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgICBmZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJzLnN0YXQgPSBzdGF0O1xuICAgICAgICByZXR1cm4gcnM7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IG5vdGZvdW5kXzEuZGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG59O1xuZXhwb3J0cy5maWxlID0gZmlsZTtcbi8vIHJldHVybnMgYHRydWVgIGlmIHRoZSBgbXRpbWVgIG9mIHRoZSAyIHN0YXQgb2JqZWN0cyBhcmUgZXF1YWxcbmZ1bmN0aW9uIGlzTm90TW9kaWZpZWQocHJldiwgY3Vycikge1xuICAgIHJldHVybiArcHJldi5tdGltZSA9PT0gK2N1cnIubXRpbWU7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5mdHAgPSB2b2lkIDA7XG5jb25zdCBiYXNpY19mdHBfMSA9IHJlcXVpcmUoXCJiYXNpYy1mdHBcIik7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jb25zdCBwYXRoXzEgPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IG5vdGZvdW5kXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbm90Zm91bmRcIikpO1xuY29uc3Qgbm90bW9kaWZpZWRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9ub3Rtb2RpZmllZFwiKSk7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdnZXQtdXJpOmZ0cCcpO1xuLyoqXG4gKiBSZXR1cm5zIGEgUmVhZGFibGUgc3RyZWFtIGZyb20gYW4gXCJmdHA6XCIgVVJJLlxuICovXG5jb25zdCBmdHAgPSBhc3luYyAodXJsLCBvcHRzID0ge30pID0+IHtcbiAgICBjb25zdCB7IGNhY2hlIH0gPSBvcHRzO1xuICAgIGNvbnN0IGZpbGVwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KHVybC5wYXRobmFtZSk7XG4gICAgbGV0IGxhc3RNb2RpZmllZDtcbiAgICBpZiAoIWZpbGVwYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ05vIFwicGF0aG5hbWVcIiEnKTtcbiAgICB9XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IGJhc2ljX2Z0cF8xLkNsaWVudCgpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhvc3QgPSB1cmwuaG9zdG5hbWUgfHwgdXJsLmhvc3QgfHwgJ2xvY2FsaG9zdCc7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludCh1cmwucG9ydCB8fCAnMCcsIDEwKSB8fCAyMTtcbiAgICAgICAgY29uc3QgdXNlciA9IHVybC51c2VybmFtZVxuICAgICAgICAgICAgPyBkZWNvZGVVUklDb21wb25lbnQodXJsLnVzZXJuYW1lKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHBhc3N3b3JkID0gdXJsLnBhc3N3b3JkXG4gICAgICAgICAgICA/IGRlY29kZVVSSUNvbXBvbmVudCh1cmwucGFzc3dvcmQpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgYXdhaXQgY2xpZW50LmFjY2Vzcyh7XG4gICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBmaXJzdCB3ZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIExhc3QgTW9kaWZpZWQgZGF0ZS5cbiAgICAgICAgLy8gdHJ5IHRoZSBNRFRNIGNvbW1hbmQgZmlyc3QsIHdoaWNoIGlzIGFuIG9wdGlvbmFsIGV4dGVuc2lvbiBjb21tYW5kLlxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGFzdE1vZGlmaWVkID0gYXdhaXQgY2xpZW50Lmxhc3RNb2QoZmlsZXBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgXCJmaWxlIG5vdCBmb3VuZFwiIGVycm9yIGNvZGVcbiAgICAgICAgICAgIGlmIChlcnIuY29kZSA9PT0gNTUwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IG5vdGZvdW5kXzEuZGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gZ2V0IHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUgdmlhIHRoZSBMSVNUIGNvbW1hbmQgKHVzZXNcbiAgICAgICAgICAgIC8vIG1vcmUgYmFuZHdpZHRoLCBidXQgaXMgbW9yZSBjb21wYXRpYmxlIHdpdGggb2xkZXIgRlRQIHNlcnZlcnNcbiAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBhd2FpdCBjbGllbnQubGlzdCgoMCwgcGF0aF8xLmRpcm5hbWUpKGZpbGVwYXRoKSk7XG4gICAgICAgICAgICAvLyBhdHRlbXB0IHRvIGZpbmQgdGhlIFwiZW50cnlcIiB3aXRoIGEgbWF0Y2hpbmcgXCJuYW1lXCJcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSAoMCwgcGF0aF8xLmJhc2VuYW1lKShmaWxlcGF0aCk7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGxpc3QuZmluZCgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9IGVudHJ5Lm1vZGlmaWVkQXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgaWYgKGlzTm90TW9kaWZpZWQoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBub3Rtb2RpZmllZF8xLmRlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBub3Rmb3VuZF8xLmRlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgc3RyZWFtXzEuUGFzc1Rocm91Z2goKTtcbiAgICAgICAgY29uc3QgcnMgPSBzdHJlYW07XG4gICAgICAgIGNsaWVudC5kb3dubG9hZFRvKHN0cmVhbSwgZmlsZXBhdGgpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgZGVidWcocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xpZW50LmNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBycy5sYXN0TW9kaWZpZWQgPSBsYXN0TW9kaWZpZWQ7XG4gICAgICAgIHJldHVybiBycztcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjbGllbnQuY2xvc2UoKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICAvLyBjYWxsZWQgd2hlbiBgbGFzdE1vZGlmaWVkYCBpcyBzZXQsIGFuZCBhIFwiY2FjaGVcIiBzdHJlYW0gd2FzIHByb3ZpZGVkXG4gICAgZnVuY3Rpb24gaXNOb3RNb2RpZmllZCgpIHtcbiAgICAgICAgaWYgKGNhY2hlPy5sYXN0TW9kaWZpZWQgJiYgbGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gK2NhY2hlLmxhc3RNb2RpZmllZCA9PT0gK2xhc3RNb2RpZmllZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbmV4cG9ydHMuZnRwID0gZnRwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnRwLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgaHR0cF8xID0gcmVxdWlyZShcImh0dHBcIik7XG4vKipcbiAqIEVycm9yIHN1YmNsYXNzIHRvIHVzZSB3aGVuIGFuIEhUVFAgYXBwbGljYXRpb24gZXJyb3IgaGFzIG9jY3VycmVkLlxuICovXG5jbGFzcyBIVFRQRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3Ioc3RhdHVzQ29kZSwgbWVzc2FnZSA9IGh0dHBfMS5TVEFUVVNfQ09ERVNbc3RhdHVzQ29kZV0pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gICAgICAgIHRoaXMuY29kZSA9IGBFJHtTdHJpbmcobWVzc2FnZSkudG9VcHBlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcnKX1gO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEhUVFBFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0dHAtZXJyb3IuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmh0dHAgPSB2b2lkIDA7XG5jb25zdCBodHRwXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImh0dHBcIikpO1xuY29uc3QgaHR0cHNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiaHR0cHNcIikpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpO1xuY29uc3QgaHR0cF9lcnJvcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2h0dHAtZXJyb3JcIikpO1xuY29uc3Qgbm90Zm91bmRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9ub3Rmb3VuZFwiKSk7XG5jb25zdCBub3Rtb2RpZmllZF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL25vdG1vZGlmaWVkXCIpKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2dldC11cmk6aHR0cCcpO1xuLyoqXG4gKiBSZXR1cm5zIGEgUmVhZGFibGUgc3RyZWFtIGZyb20gYW4gXCJodHRwOlwiIFVSSS5cbiAqL1xuY29uc3QgaHR0cCA9IGFzeW5jICh1cmwsIG9wdHMgPSB7fSkgPT4ge1xuICAgIGRlYnVnKCdHRVQgJW8nLCB1cmwuaHJlZik7XG4gICAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZSh1cmwsIG9wdHMuY2FjaGUpO1xuICAgIC8vIGZpcnN0IGNoZWNrIHRoZSBwcmV2aW91cyBFeHBpcmVzIGFuZC9vciBDYWNoZS1Db250cm9sIGhlYWRlcnNcbiAgICAvLyBvZiBhIHByZXZpb3VzIHJlc3BvbnNlIGlmIGEgYGNhY2hlYCB3YXMgcHJvdmlkZWRcbiAgICBpZiAoY2FjaGUgJiYgaXNGcmVzaChjYWNoZSkgJiYgdHlwZW9mIGNhY2hlLnN0YXR1c0NvZGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIGNoZWNrIGZvciBhIDN4eCBcInJlZGlyZWN0XCIgc3RhdHVzIGNvZGUgb24gdGhlIHByZXZpb3VzIGNhY2hlXG4gICAgICAgIGNvbnN0IHR5cGUgPSAoY2FjaGUuc3RhdHVzQ29kZSAvIDEwMCkgfCAwO1xuICAgICAgICBpZiAodHlwZSA9PT0gMyAmJiBjYWNoZS5oZWFkZXJzLmxvY2F0aW9uKSB7XG4gICAgICAgICAgICBkZWJ1ZygnY2FjaGVkIHJlZGlyZWN0Jyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE86IGltcGxlbWVudCBjYWNoZWQgcmVkaXJlY3RzIScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG90aGVyd2lzZSB3ZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBkZXN0aW5hdGlvbiBlbmRwb2ludCxcbiAgICAgICAgLy8gc2luY2UgdGhlcmUncyBub3doZXJlIGVsc2UgdG8gcmVkaXJlY3QgdG9cbiAgICAgICAgdGhyb3cgbmV3IG5vdG1vZGlmaWVkXzEuZGVmYXVsdCgpO1xuICAgIH1cbiAgICAvLyA1IHJlZGlyZWN0cyBhbGxvd2VkIGJ5IGRlZmF1bHRcbiAgICBjb25zdCBtYXhSZWRpcmVjdHMgPSB0eXBlb2Ygb3B0cy5tYXhSZWRpcmVjdHMgPT09ICdudW1iZXInID8gb3B0cy5tYXhSZWRpcmVjdHMgOiA1O1xuICAgIGRlYnVnKCdhbGxvd2luZyAlbyBtYXggcmVkaXJlY3RzJywgbWF4UmVkaXJlY3RzKTtcbiAgICBsZXQgbW9kO1xuICAgIGlmIChvcHRzLmh0dHApIHtcbiAgICAgICAgLy8gdGhlIGBodHRwc2AgbW9kdWxlIHBhc3NlZCBpbiBmcm9tIHRoZSBcImh0dHAuanNcIiBmaWxlXG4gICAgICAgIG1vZCA9IG9wdHMuaHR0cDtcbiAgICAgICAgZGVidWcoJ3VzaW5nIHNlY3VyZSBgaHR0cHNgIGNvcmUgbW9kdWxlJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBtb2QgPSBodHRwXzEuZGVmYXVsdDtcbiAgICAgICAgZGVidWcoJ3VzaW5nIGBodHRwYCBjb3JlIG1vZHVsZScpO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zID0geyAuLi5vcHRzIH07XG4gICAgLy8gYWRkIFwiY2FjaGUgdmFsaWRhdGlvblwiIGhlYWRlcnMgaWYgYSBgY2FjaGVgIHdhcyBwcm92aWRlZFxuICAgIGlmIChjYWNoZSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFzdE1vZGlmaWVkID0gY2FjaGUuaGVhZGVyc1snbGFzdC1tb2RpZmllZCddO1xuICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0lmLU1vZGlmaWVkLVNpbmNlJ10gPSBsYXN0TW9kaWZpZWQ7XG4gICAgICAgICAgICBkZWJ1ZygnYWRkZWQgXCJJZi1Nb2RpZmllZC1TaW5jZVwiIHJlcXVlc3QgaGVhZGVyOiAlbycsIGxhc3RNb2RpZmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXRhZyA9IGNhY2hlLmhlYWRlcnMuZXRhZztcbiAgICAgICAgaWYgKGV0YWcpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1snSWYtTm9uZS1NYXRjaCddID0gZXRhZztcbiAgICAgICAgICAgIGRlYnVnKCdhZGRlZCBcIklmLU5vbmUtTWF0Y2hcIiByZXF1ZXN0IGhlYWRlcjogJW8nLCBldGFnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXEgPSBtb2QuZ2V0KHVybCwgb3B0aW9ucyk7XG4gICAgY29uc3QgW3Jlc10gPSBhd2FpdCAoMCwgZXZlbnRzXzEub25jZSkocmVxLCAncmVzcG9uc2UnKTtcbiAgICBjb25zdCBjb2RlID0gcmVzLnN0YXR1c0NvZGUgfHwgMDtcbiAgICAvLyBhc3NpZ24gYSBEYXRlIHRvIHRoaXMgcmVzcG9uc2UgZm9yIHRoZSBcIkNhY2hlLUNvbnRyb2xcIiBkZWx0YSBjYWxjdWxhdGlvblxuICAgIHJlcy5kYXRlID0gRGF0ZS5ub3coKTtcbiAgICByZXMucGFyc2VkID0gdXJsO1xuICAgIGRlYnVnKCdnb3QgJW8gcmVzcG9uc2Ugc3RhdHVzIGNvZGUnLCBjb2RlKTtcbiAgICAvLyBhbnkgMnh4IHJlc3BvbnNlIGlzIGEgXCJzdWNjZXNzXCIgY29kZVxuICAgIGNvbnN0IHR5cGUgPSAoY29kZSAvIDEwMCkgfCAwO1xuICAgIC8vIGNoZWNrIGZvciBhIDN4eCBcInJlZGlyZWN0XCIgc3RhdHVzIGNvZGVcbiAgICBjb25zdCBsb2NhdGlvbiA9IHJlcy5oZWFkZXJzLmxvY2F0aW9uO1xuICAgIGlmICh0eXBlID09PSAzICYmIGxvY2F0aW9uKSB7XG4gICAgICAgIGlmICghb3B0cy5yZWRpcmVjdHMpXG4gICAgICAgICAgICBvcHRzLnJlZGlyZWN0cyA9IFtdO1xuICAgICAgICBjb25zdCByZWRpcmVjdHMgPSBvcHRzLnJlZGlyZWN0cztcbiAgICAgICAgaWYgKHJlZGlyZWN0cy5sZW5ndGggPCBtYXhSZWRpcmVjdHMpIHtcbiAgICAgICAgICAgIGRlYnVnKCdnb3QgYSBcInJlZGlyZWN0XCIgc3RhdHVzIGNvZGUgd2l0aCBMb2NhdGlvbjogJW8nLCBsb2NhdGlvbik7XG4gICAgICAgICAgICAvLyBmbHVzaCB0aGlzIHJlc3BvbnNlIC0gd2UncmUgbm90IGdvaW5nIHRvIHVzZSBpdFxuICAgICAgICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgICAgICAgLy8gaGFuZyBvbiB0byB0aGlzIFJlc3BvbnNlIG9iamVjdCBmb3IgdGhlIFwicmVkaXJlY3RzXCIgQXJyYXlcbiAgICAgICAgICAgIHJlZGlyZWN0cy5wdXNoKHJlcyk7XG4gICAgICAgICAgICBjb25zdCBuZXdVcmkgPSBuZXcgVVJMKGxvY2F0aW9uLCB1cmwuaHJlZik7XG4gICAgICAgICAgICBkZWJ1ZygncmVzb2x2ZWQgcmVkaXJlY3QgVVJMOiAlbycsIG5ld1VyaS5ocmVmKTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBtYXhSZWRpcmVjdHMgLSByZWRpcmVjdHMubGVuZ3RoO1xuICAgICAgICAgICAgZGVidWcoJyVvIG1vcmUgcmVkaXJlY3RzIGFsbG93ZWQgYWZ0ZXIgdGhpcyBvbmUnLCBsZWZ0KTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHJlZGlyZWN0aW5nIHRvIGEgZGlmZmVyZW50IHByb3RvY29sXG4gICAgICAgICAgICBpZiAobmV3VXJpLnByb3RvY29sICE9PSB1cmwucHJvdG9jb2wpIHtcbiAgICAgICAgICAgICAgICBvcHRzLmh0dHAgPSBuZXdVcmkucHJvdG9jb2wgPT09ICdodHRwczonID8gaHR0cHNfMS5kZWZhdWx0IDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICgwLCBleHBvcnRzLmh0dHApKG5ld1VyaSwgb3B0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgd2UgZGlkbid0IGdldCBhIDJ4eCBcInN1Y2Nlc3NcIiBzdGF0dXMgY29kZSwgdGhlbiBjcmVhdGUgYW4gRXJyb3Igb2JqZWN0XG4gICAgaWYgKHR5cGUgIT09IDIpIHtcbiAgICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgICBpZiAoY29kZSA9PT0gMzA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgbm90bW9kaWZpZWRfMS5kZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PT0gNDA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgbm90Zm91bmRfMS5kZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXIgSFRUUC1sZXZlbCBlcnJvclxuICAgICAgICB0aHJvdyBuZXcgaHR0cF9lcnJvcl8xLmRlZmF1bHQoY29kZSk7XG4gICAgfVxuICAgIGlmIChvcHRzLnJlZGlyZWN0cykge1xuICAgICAgICAvLyBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgXCJyZWRpcmVjdHNcIiBBcnJheSBvbiB0aGUgUmVzcG9uc2Ugb2JqZWN0IHNvIHRoYXRcbiAgICAgICAgLy8gdGhleSBjYW4gYmUgaW5zcGVjdGVkIGR1cmluZyBhIHN1YnNlcXVlbnQgY2FsbCB0byBHRVQgdGhlIHNhbWUgVVJJXG4gICAgICAgIHJlcy5yZWRpcmVjdHMgPSBvcHRzLnJlZGlyZWN0cztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn07XG5leHBvcnRzLmh0dHAgPSBodHRwO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvdmlkZWQgY2FjaGUncyBcImZyZXNobmVzc1wiIGlzIHZhbGlkLiBUaGF0IGlzLCBlaXRoZXJcbiAqIHRoZSBDYWNoZS1Db250cm9sIGhlYWRlciBvciBFeHBpcmVzIGhlYWRlciB2YWx1ZXMgYXJlIHN0aWxsIHdpdGhpbiB0aGUgYWxsb3dlZFxuICogdGltZSBwZXJpb2QuXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpc0ZyZXNoKGNhY2hlKSB7XG4gICAgbGV0IGZyZXNoID0gZmFsc2U7XG4gICAgbGV0IGV4cGlyZXMgPSBwYXJzZUludChjYWNoZS5oZWFkZXJzLmV4cGlyZXMgfHwgJycsIDEwKTtcbiAgICBjb25zdCBjYWNoZUNvbnRyb2wgPSBjYWNoZS5oZWFkZXJzWydjYWNoZS1jb250cm9sJ107XG4gICAgaWYgKGNhY2hlQ29udHJvbCkge1xuICAgICAgICAvLyBmb3IgQ2FjaGUtQ29udHJvbCBydWxlcywgc2VlOiBodHRwOi8vd3d3Lm1ub3QubmV0L2NhY2hlX2RvY3MvI0NBQ0hFLUNPTlRST0xcbiAgICAgICAgZGVidWcoJ0NhY2hlLUNvbnRyb2w6ICVvJywgY2FjaGVDb250cm9sKTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBjYWNoZUNvbnRyb2wuc3BsaXQoLyxcXHMqP1xcYi8pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgICAgICBjb25zdCBzdWJwYXJ0cyA9IHBhcnQuc3BsaXQoJz0nKTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBzdWJwYXJ0c1swXTtcbiAgICAgICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ21heC1hZ2UnOlxuICAgICAgICAgICAgICAgICAgICBleHBpcmVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIChjYWNoZS5kYXRlIHx8IDApICsgcGFyc2VJbnQoc3VicGFydHNbMV0sIDEwKSAqIDEwMDA7XG4gICAgICAgICAgICAgICAgICAgIGZyZXNoID0gRGF0ZS5ub3coKSA8IGV4cGlyZXM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcmVzaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoJ2NhY2hlIGlzIFwiZnJlc2hcIiBkdWUgdG8gcHJldmlvdXMgJW8gQ2FjaGUtQ29udHJvbCBwYXJhbScsIHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmVzaDtcbiAgICAgICAgICAgICAgICBjYXNlICdtdXN0LXJldmFsaWRhdGUnOlxuICAgICAgICAgICAgICAgICAgICAvLyBYWFg6IHdoYXQgd2Ugc3VwcG9zZWQgdG8gZG8gaGVyZT9cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbm8tY2FjaGUnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ25vLXN0b3JlJzpcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoJ2NhY2hlIGlzIFwic3RhbGVcIiBkdWUgdG8gZXhwbGljaXQgJW8gQ2FjaGUtQ29udHJvbCBwYXJhbScsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHVua25vd24gY2FjaGUgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXhwaXJlcykge1xuICAgICAgICAvLyBmb3IgRXhwaXJlcyBydWxlcywgc2VlOiBodHRwOi8vd3d3Lm1ub3QubmV0L2NhY2hlX2RvY3MvI0VYUElSRVNcbiAgICAgICAgZGVidWcoJ0V4cGlyZXM6ICVvJywgZXhwaXJlcyk7XG4gICAgICAgIGZyZXNoID0gRGF0ZS5ub3coKSA8IGV4cGlyZXM7XG4gICAgICAgIGlmIChmcmVzaCkge1xuICAgICAgICAgICAgZGVidWcoJ2NhY2hlIGlzIFwiZnJlc2hcIiBkdWUgdG8gcHJldmlvdXMgRXhwaXJlcyByZXNwb25zZSBoZWFkZXInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJlc2g7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQXR0ZW1wdHMgdG8gcmV0dXJuIGEgcHJldmlvdXMgUmVzcG9uc2Ugb2JqZWN0IGZyb20gYSBwcmV2aW91cyBHRVQgY2FsbCB0byB0aGVcbiAqIHNhbWUgVVJJLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRDYWNoZSh1cmwsIGNhY2hlKSB7XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGlmIChjYWNoZS5wYXJzZWQgJiYgY2FjaGUucGFyc2VkLmhyZWYgPT09IHVybC5ocmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhY2hlLnJlZGlyZWN0cykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWNoZS5yZWRpcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gZ2V0Q2FjaGUodXJsLCBjYWNoZS5yZWRpcmVjdHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0dHAuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmh0dHBzID0gdm9pZCAwO1xuY29uc3QgaHR0cHNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiaHR0cHNcIikpO1xuY29uc3QgaHR0cF8xID0gcmVxdWlyZShcIi4vaHR0cFwiKTtcbi8qKlxuICogUmV0dXJucyBhIFJlYWRhYmxlIHN0cmVhbSBmcm9tIGFuIFwiaHR0cHM6XCIgVVJJLlxuICovXG5jb25zdCBodHRwcyA9ICh1cmwsIG9wdHMpID0+IHtcbiAgICByZXR1cm4gKDAsIGh0dHBfMS5odHRwKSh1cmwsIHsgLi4ub3B0cywgaHR0cDogaHR0cHNfMS5kZWZhdWx0IH0pO1xufTtcbmV4cG9ydHMuaHR0cHMgPSBodHRwcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0dHBzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRVcmkgPSBleHBvcnRzLmlzVmFsaWRQcm90b2NvbCA9IGV4cG9ydHMucHJvdG9jb2xzID0gdm9pZCAwO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpO1xuLy8gQnVpbHQtaW4gcHJvdG9jb2xzXG5jb25zdCBkYXRhXzEgPSByZXF1aXJlKFwiLi9kYXRhXCIpO1xuY29uc3QgZmlsZV8xID0gcmVxdWlyZShcIi4vZmlsZVwiKTtcbmNvbnN0IGZ0cF8xID0gcmVxdWlyZShcIi4vZnRwXCIpO1xuY29uc3QgaHR0cF8xID0gcmVxdWlyZShcIi4vaHR0cFwiKTtcbmNvbnN0IGh0dHBzXzEgPSByZXF1aXJlKFwiLi9odHRwc1wiKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2dldC11cmknKTtcbmV4cG9ydHMucHJvdG9jb2xzID0ge1xuICAgIGRhdGE6IGRhdGFfMS5kYXRhLFxuICAgIGZpbGU6IGZpbGVfMS5maWxlLFxuICAgIGZ0cDogZnRwXzEuZnRwLFxuICAgIGh0dHA6IGh0dHBfMS5odHRwLFxuICAgIGh0dHBzOiBodHRwc18xLmh0dHBzLFxufTtcbmNvbnN0IFZBTElEX1BST1RPQ09MUyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoZXhwb3J0cy5wcm90b2NvbHMpKTtcbmZ1bmN0aW9uIGlzVmFsaWRQcm90b2NvbChwKSB7XG4gICAgcmV0dXJuIFZBTElEX1BST1RPQ09MUy5oYXMocCk7XG59XG5leHBvcnRzLmlzVmFsaWRQcm90b2NvbCA9IGlzVmFsaWRQcm90b2NvbDtcbi8qKlxuICogQXN5bmMgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgYHN0cmVhbS5SZWFkYWJsZWAgaW5zdGFuY2UgdGhhdCB3aWxsIG91dHB1dFxuICogdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBVUkkuXG4gKlxuICogRm9yIGNhY2hpbmcgcHVycG9zZXMsIHlvdSBjYW4gcGFzcyBpbiBhIGBzdHJlYW1gIGluc3RhbmNlIGZyb20gYSBwcmV2aW91c1xuICogYGdldFVyaSgpYCBjYWxsIGFzIGEgYGNhY2hlOiBzdHJlYW1gIG9wdGlvbiwgYW5kIGlmIHRoZSBkZXN0aW5hdGlvbiBoYXNcbiAqIG5vdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGVuZHBvaW50IHdhcyByZXRyZWl2ZWQgdGhlbiB0aGUgY2FsbGJhY2tcbiAqIHdpbGwgYmUgaW52b2tlZCB3aXRoIGFuIEVycm9yIG9iamVjdCB3aXRoIGBjb2RlYCBzZXQgdG8gXCJFTk9UTU9ESUZJRURcIiBhbmRcbiAqIGBudWxsYCBmb3IgdGhlIFwic3RyZWFtXCIgaW5zdGFuY2UgYXJndW1lbnQuIEluIHRoaXMgY2FzZSwgeW91IGNhbiBza2lwXG4gKiByZXRyZWl2aW5nIHRoZSBmaWxlIGFnYWluIGFuZCBjb250aW51ZSB0byB1c2UgdGhlIHByZXZpb3VzIHBheWxvYWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVyaSBVUkkgdG8gcmV0cmlldmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIG9wdGlvbmFsIFwib3B0aW9uc1wiIG9iamVjdFxuICogQGFwaSBwdWJsaWNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0VXJpKHVyaSwgb3B0cykge1xuICAgIGRlYnVnKCdnZXRVcmkoJW8pJywgdXJpKTtcbiAgICBpZiAoIXVyaSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHBhc3MgaW4gYSBVUkkgdG8gXCJnZXRVcmkoKVwiJyk7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHR5cGVvZiB1cmkgPT09ICdzdHJpbmcnID8gbmV3IFVSTCh1cmkpIDogdXJpO1xuICAgIC8vIFN0cmlwIHRyYWlsaW5nIGA6YFxuICAgIGNvbnN0IHByb3RvY29sID0gdXJsLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpO1xuICAgIGlmICghaXNWYWxpZFByb3RvY29sKHByb3RvY29sKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCBwcm90b2NvbCBcIiR7cHJvdG9jb2x9XCIgc3BlY2lmaWVkIGluIFVSSTogXCIke3VyaX1cImApO1xuICAgIH1cbiAgICBjb25zdCBnZXR0ZXIgPSBleHBvcnRzLnByb3RvY29sc1twcm90b2NvbF07XG4gICAgcmV0dXJuIGdldHRlcih1cmwsIG9wdHMpO1xufVxuZXhwb3J0cy5nZXRVcmkgPSBnZXRVcmk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogRXJyb3Igc3ViY2xhc3MgdG8gdXNlIHdoZW4gdGhlIHNvdXJjZSBkb2VzIG5vdCBleGlzdCBhdCB0aGUgc3BlY2lmaWVkIGVuZHBvaW50LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIG9wdGlvbmFsIFwibWVzc2FnZVwiIHByb3BlcnR5IHRvIHNldFxuICogQGFwaSBwcm90ZWN0ZWRcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY2xhc3MgTm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ0ZpbGUgZG9lcyBub3QgZXhpc3QgYXQgdGhlIHNwZWNpZmllZCBlbmRwb2ludCcpO1xuICAgICAgICB0aGlzLmNvZGUgPSAnRU5PVEZPVU5EJztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOb3RGb3VuZEVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm90Zm91bmQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIEVycm9yIHN1YmNsYXNzIHRvIHVzZSB3aGVuIHRoZSBzb3VyY2UgaGFzIG5vdCBiZWVuIG1vZGlmaWVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIG9wdGlvbmFsIFwibWVzc2FnZVwiIHByb3BlcnR5IHRvIHNldFxuICogQGFwaSBwcm90ZWN0ZWRcbiAqL1xuY2xhc3MgTm90TW9kaWZpZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UgfHxcbiAgICAgICAgICAgICdTb3VyY2UgaGFzIG5vdCBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBwcm92aWVkIFwiY2FjaGVcIiwgcmUtdXNlIHByZXZpb3VzIHJlc3VsdHMnKTtcbiAgICAgICAgdGhpcy5jb2RlID0gJ0VOT1RNT0RJRklFRCc7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gTm90TW9kaWZpZWRFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vdG1vZGlmaWVkLmpzLm1hcCIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lXG5cbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmouX19wcm90b19fXG59XG5cbmZ1bmN0aW9uIGNsb25lIChvYmopIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JylcbiAgICByZXR1cm4gb2JqXG5cbiAgaWYgKG9iaiBpbnN0YW5jZW9mIE9iamVjdClcbiAgICB2YXIgY29weSA9IHsgX19wcm90b19fOiBnZXRQcm90b3R5cGVPZihvYmopIH1cbiAgZWxzZVxuICAgIHZhciBjb3B5ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvcHksIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkpXG4gIH0pXG5cbiAgcmV0dXJuIGNvcHlcbn1cbiIsInZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcbnZhciBwb2x5ZmlsbHMgPSByZXF1aXJlKCcuL3BvbHlmaWxscy5qcycpXG52YXIgbGVnYWN5ID0gcmVxdWlyZSgnLi9sZWdhY3ktc3RyZWFtcy5qcycpXG52YXIgY2xvbmUgPSByZXF1aXJlKCcuL2Nsb25lLmpzJylcblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJylcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgLSBub2RlIDAueCBwb2x5ZmlsbCAqL1xudmFyIGdyYWNlZnVsUXVldWVcbnZhciBwcmV2aW91c1N5bWJvbFxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAtIG5vZGUgMC54IHBvbHlmaWxsICovXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLmZvciA9PT0gJ2Z1bmN0aW9uJykge1xuICBncmFjZWZ1bFF1ZXVlID0gU3ltYm9sLmZvcignZ3JhY2VmdWwtZnMucXVldWUnKVxuICAvLyBUaGlzIGlzIHVzZWQgaW4gdGVzdGluZyBieSBmdXR1cmUgdmVyc2lvbnNcbiAgcHJldmlvdXNTeW1ib2wgPSBTeW1ib2wuZm9yKCdncmFjZWZ1bC1mcy5wcmV2aW91cycpXG59IGVsc2Uge1xuICBncmFjZWZ1bFF1ZXVlID0gJ19fX2dyYWNlZnVsLWZzLnF1ZXVlJ1xuICBwcmV2aW91c1N5bWJvbCA9ICdfX19ncmFjZWZ1bC1mcy5wcmV2aW91cydcbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBwdWJsaXNoUXVldWUoY29udGV4dCwgcXVldWUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRleHQsIGdyYWNlZnVsUXVldWUsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlXG4gICAgfVxuICB9KVxufVxuXG52YXIgZGVidWcgPSBub29wXG5pZiAodXRpbC5kZWJ1Z2xvZylcbiAgZGVidWcgPSB1dGlsLmRlYnVnbG9nKCdnZnM0JylcbmVsc2UgaWYgKC9cXGJnZnM0XFxiL2kudGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnKSlcbiAgZGVidWcgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbSA9IHV0aWwuZm9ybWF0LmFwcGx5KHV0aWwsIGFyZ3VtZW50cylcbiAgICBtID0gJ0dGUzQ6ICcgKyBtLnNwbGl0KC9cXG4vKS5qb2luKCdcXG5HRlM0OiAnKVxuICAgIGNvbnNvbGUuZXJyb3IobSlcbiAgfVxuXG4vLyBPbmNlIHRpbWUgaW5pdGlhbGl6YXRpb25cbmlmICghZnNbZ3JhY2VmdWxRdWV1ZV0pIHtcbiAgLy8gVGhpcyBxdWV1ZSBjYW4gYmUgc2hhcmVkIGJ5IG11bHRpcGxlIGxvYWRlZCBpbnN0YW5jZXNcbiAgdmFyIHF1ZXVlID0gZ2xvYmFsW2dyYWNlZnVsUXVldWVdIHx8IFtdXG4gIHB1Ymxpc2hRdWV1ZShmcywgcXVldWUpXG5cbiAgLy8gUGF0Y2ggZnMuY2xvc2UvY2xvc2VTeW5jIHRvIHNoYXJlZCBxdWV1ZSB2ZXJzaW9uLCBiZWNhdXNlIHdlIG5lZWRcbiAgLy8gdG8gcmV0cnkoKSB3aGVuZXZlciBhIGNsb3NlIGhhcHBlbnMgKmFueXdoZXJlKiBpbiB0aGUgcHJvZ3JhbS5cbiAgLy8gVGhpcyBpcyBlc3NlbnRpYWwgd2hlbiBtdWx0aXBsZSBncmFjZWZ1bC1mcyBpbnN0YW5jZXMgYXJlXG4gIC8vIGluIHBsYXkgYXQgdGhlIHNhbWUgdGltZS5cbiAgZnMuY2xvc2UgPSAoZnVuY3Rpb24gKGZzJGNsb3NlKSB7XG4gICAgZnVuY3Rpb24gY2xvc2UgKGZkLCBjYikge1xuICAgICAgcmV0dXJuIGZzJGNsb3NlLmNhbGwoZnMsIGZkLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZ3JhY2VmdWwtZnMgc2hhcmVkIHF1ZXVlXG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgcmVzZXRRdWV1ZSgpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsb3NlLCBwcmV2aW91c1N5bWJvbCwge1xuICAgICAgdmFsdWU6IGZzJGNsb3NlXG4gICAgfSlcbiAgICByZXR1cm4gY2xvc2VcbiAgfSkoZnMuY2xvc2UpXG5cbiAgZnMuY2xvc2VTeW5jID0gKGZ1bmN0aW9uIChmcyRjbG9zZVN5bmMpIHtcbiAgICBmdW5jdGlvbiBjbG9zZVN5bmMgKGZkKSB7XG4gICAgICAvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGdyYWNlZnVsLWZzIHNoYXJlZCBxdWV1ZVxuICAgICAgZnMkY2xvc2VTeW5jLmFwcGx5KGZzLCBhcmd1bWVudHMpXG4gICAgICByZXNldFF1ZXVlKClcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xvc2VTeW5jLCBwcmV2aW91c1N5bWJvbCwge1xuICAgICAgdmFsdWU6IGZzJGNsb3NlU3luY1xuICAgIH0pXG4gICAgcmV0dXJuIGNsb3NlU3luY1xuICB9KShmcy5jbG9zZVN5bmMpXG5cbiAgaWYgKC9cXGJnZnM0XFxiL2kudGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnKSkge1xuICAgIHByb2Nlc3Mub24oJ2V4aXQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGRlYnVnKGZzW2dyYWNlZnVsUXVldWVdKVxuICAgICAgcmVxdWlyZSgnYXNzZXJ0JykuZXF1YWwoZnNbZ3JhY2VmdWxRdWV1ZV0ubGVuZ3RoLCAwKVxuICAgIH0pXG4gIH1cbn1cblxuaWYgKCFnbG9iYWxbZ3JhY2VmdWxRdWV1ZV0pIHtcbiAgcHVibGlzaFF1ZXVlKGdsb2JhbCwgZnNbZ3JhY2VmdWxRdWV1ZV0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoKGNsb25lKGZzKSlcbmlmIChwcm9jZXNzLmVudi5URVNUX0dSQUNFRlVMX0ZTX0dMT0JBTF9QQVRDSCAmJiAhZnMuX19wYXRjaGVkKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBwYXRjaChmcylcbiAgICBmcy5fX3BhdGNoZWQgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBwYXRjaCAoZnMpIHtcbiAgLy8gRXZlcnl0aGluZyB0aGF0IHJlZmVyZW5jZXMgdGhlIG9wZW4oKSBmdW5jdGlvbiBuZWVkcyB0byBiZSBpbiBoZXJlXG4gIHBvbHlmaWxscyhmcylcbiAgZnMuZ3JhY2VmdWxpZnkgPSBwYXRjaFxuXG4gIGZzLmNyZWF0ZVJlYWRTdHJlYW0gPSBjcmVhdGVSZWFkU3RyZWFtXG4gIGZzLmNyZWF0ZVdyaXRlU3RyZWFtID0gY3JlYXRlV3JpdGVTdHJlYW1cbiAgdmFyIGZzJHJlYWRGaWxlID0gZnMucmVhZEZpbGVcbiAgZnMucmVhZEZpbGUgPSByZWFkRmlsZVxuICBmdW5jdGlvbiByZWFkRmlsZSAocGF0aCwgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG9wdGlvbnMsIG9wdGlvbnMgPSBudWxsXG5cbiAgICByZXR1cm4gZ28kcmVhZEZpbGUocGF0aCwgb3B0aW9ucywgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyRyZWFkRmlsZSAocGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJHJlYWRGaWxlKHBhdGgsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kcmVhZEZpbGUsIFtwYXRoLCBvcHRpb25zLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHZhciBmcyR3cml0ZUZpbGUgPSBmcy53cml0ZUZpbGVcbiAgZnMud3JpdGVGaWxlID0gd3JpdGVGaWxlXG4gIGZ1bmN0aW9uIHdyaXRlRmlsZSAocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG9wdGlvbnMsIG9wdGlvbnMgPSBudWxsXG5cbiAgICByZXR1cm4gZ28kd3JpdGVGaWxlKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kd3JpdGVGaWxlIChwYXRoLCBkYXRhLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkd3JpdGVGaWxlKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kd3JpdGVGaWxlLCBbcGF0aCwgZGF0YSwgb3B0aW9ucywgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgZnMkYXBwZW5kRmlsZSA9IGZzLmFwcGVuZEZpbGVcbiAgaWYgKGZzJGFwcGVuZEZpbGUpXG4gICAgZnMuYXBwZW5kRmlsZSA9IGFwcGVuZEZpbGVcbiAgZnVuY3Rpb24gYXBwZW5kRmlsZSAocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG9wdGlvbnMsIG9wdGlvbnMgPSBudWxsXG5cbiAgICByZXR1cm4gZ28kYXBwZW5kRmlsZShwYXRoLCBkYXRhLCBvcHRpb25zLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJGFwcGVuZEZpbGUgKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyRhcHBlbmRGaWxlKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kYXBwZW5kRmlsZSwgW3BhdGgsIGRhdGEsIG9wdGlvbnMsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmFyIGZzJGNvcHlGaWxlID0gZnMuY29weUZpbGVcbiAgaWYgKGZzJGNvcHlGaWxlKVxuICAgIGZzLmNvcHlGaWxlID0gY29weUZpbGVcbiAgZnVuY3Rpb24gY29weUZpbGUgKHNyYywgZGVzdCwgZmxhZ3MsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBmbGFncyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBmbGFnc1xuICAgICAgZmxhZ3MgPSAwXG4gICAgfVxuICAgIHJldHVybiBnbyRjb3B5RmlsZShzcmMsIGRlc3QsIGZsYWdzLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJGNvcHlGaWxlIChzcmMsIGRlc3QsIGZsYWdzLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkY29weUZpbGUoc3JjLCBkZXN0LCBmbGFncywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyRjb3B5RmlsZSwgW3NyYywgZGVzdCwgZmxhZ3MsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmFyIGZzJHJlYWRkaXIgPSBmcy5yZWFkZGlyXG4gIGZzLnJlYWRkaXIgPSByZWFkZGlyXG4gIHZhciBub1JlYWRkaXJPcHRpb25WZXJzaW9ucyA9IC9edlswLTVdXFwuL1xuICBmdW5jdGlvbiByZWFkZGlyIChwYXRoLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IG51bGxcblxuICAgIHZhciBnbyRyZWFkZGlyID0gbm9SZWFkZGlyT3B0aW9uVmVyc2lvbnMudGVzdChwcm9jZXNzLnZlcnNpb24pXG4gICAgICA/IGZ1bmN0aW9uIGdvJHJlYWRkaXIgKHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGZzJHJlYWRkaXIocGF0aCwgZnMkcmVhZGRpckNhbGxiYWNrKFxuICAgICAgICAgIHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWVcbiAgICAgICAgKSlcbiAgICAgIH1cbiAgICAgIDogZnVuY3Rpb24gZ28kcmVhZGRpciAocGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgICByZXR1cm4gZnMkcmVhZGRpcihwYXRoLCBvcHRpb25zLCBmcyRyZWFkZGlyQ2FsbGJhY2soXG4gICAgICAgICAgcGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZVxuICAgICAgICApKVxuICAgICAgfVxuXG4gICAgcmV0dXJuIGdvJHJlYWRkaXIocGF0aCwgb3B0aW9ucywgY2IpXG5cbiAgICBmdW5jdGlvbiBmcyRyZWFkZGlyQ2FsbGJhY2sgKHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyLCBmaWxlcykge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtcbiAgICAgICAgICAgIGdvJHJlYWRkaXIsXG4gICAgICAgICAgICBbcGF0aCwgb3B0aW9ucywgY2JdLFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgc3RhcnRUaW1lIHx8IERhdGUubm93KCksXG4gICAgICAgICAgICBEYXRlLm5vdygpXG4gICAgICAgICAgXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLnNvcnQpXG4gICAgICAgICAgICBmaWxlcy5zb3J0KClcblxuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5jYWxsKHRoaXMsIGVyciwgZmlsZXMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocHJvY2Vzcy52ZXJzaW9uLnN1YnN0cigwLCA0KSA9PT0gJ3YwLjgnKSB7XG4gICAgdmFyIGxlZ1N0cmVhbXMgPSBsZWdhY3koZnMpXG4gICAgUmVhZFN0cmVhbSA9IGxlZ1N0cmVhbXMuUmVhZFN0cmVhbVxuICAgIFdyaXRlU3RyZWFtID0gbGVnU3RyZWFtcy5Xcml0ZVN0cmVhbVxuICB9XG5cbiAgdmFyIGZzJFJlYWRTdHJlYW0gPSBmcy5SZWFkU3RyZWFtXG4gIGlmIChmcyRSZWFkU3RyZWFtKSB7XG4gICAgUmVhZFN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGZzJFJlYWRTdHJlYW0ucHJvdG90eXBlKVxuICAgIFJlYWRTdHJlYW0ucHJvdG90eXBlLm9wZW4gPSBSZWFkU3RyZWFtJG9wZW5cbiAgfVxuXG4gIHZhciBmcyRXcml0ZVN0cmVhbSA9IGZzLldyaXRlU3RyZWFtXG4gIGlmIChmcyRXcml0ZVN0cmVhbSkge1xuICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZnMkV3JpdGVTdHJlYW0ucHJvdG90eXBlKVxuICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZS5vcGVuID0gV3JpdGVTdHJlYW0kb3BlblxuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCAnUmVhZFN0cmVhbScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBSZWFkU3RyZWFtXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIFJlYWRTdHJlYW0gPSB2YWxcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmcywgJ1dyaXRlU3RyZWFtJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFdyaXRlU3RyZWFtXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIFdyaXRlU3RyZWFtID0gdmFsXG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuXG4gIC8vIGxlZ2FjeSBuYW1lc1xuICB2YXIgRmlsZVJlYWRTdHJlYW0gPSBSZWFkU3RyZWFtXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmcywgJ0ZpbGVSZWFkU3RyZWFtJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIEZpbGVSZWFkU3RyZWFtXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIEZpbGVSZWFkU3RyZWFtID0gdmFsXG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuICB2YXIgRmlsZVdyaXRlU3RyZWFtID0gV3JpdGVTdHJlYW1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCAnRmlsZVdyaXRlU3RyZWFtJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIEZpbGVXcml0ZVN0cmVhbVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICBGaWxlV3JpdGVTdHJlYW0gPSB2YWxcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG5cbiAgZnVuY3Rpb24gUmVhZFN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUmVhZFN0cmVhbSlcbiAgICAgIHJldHVybiBmcyRSZWFkU3RyZWFtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXNcbiAgICBlbHNlXG4gICAgICByZXR1cm4gUmVhZFN0cmVhbS5hcHBseShPYmplY3QuY3JlYXRlKFJlYWRTdHJlYW0ucHJvdG90eXBlKSwgYXJndW1lbnRzKVxuICB9XG5cbiAgZnVuY3Rpb24gUmVhZFN0cmVhbSRvcGVuICgpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICBvcGVuKHRoYXQucGF0aCwgdGhhdC5mbGFncywgdGhhdC5tb2RlLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBpZiAodGhhdC5hdXRvQ2xvc2UpXG4gICAgICAgICAgdGhhdC5kZXN0cm95KClcblxuICAgICAgICB0aGF0LmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhhdC5mZCA9IGZkXG4gICAgICAgIHRoYXQuZW1pdCgnb3BlbicsIGZkKVxuICAgICAgICB0aGF0LnJlYWQoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBXcml0ZVN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgV3JpdGVTdHJlYW0pXG4gICAgICByZXR1cm4gZnMkV3JpdGVTdHJlYW0uYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdGhpc1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBXcml0ZVN0cmVhbS5hcHBseShPYmplY3QuY3JlYXRlKFdyaXRlU3RyZWFtLnByb3RvdHlwZSksIGFyZ3VtZW50cylcbiAgfVxuXG4gIGZ1bmN0aW9uIFdyaXRlU3RyZWFtJG9wZW4gKCkge1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgIG9wZW4odGhhdC5wYXRoLCB0aGF0LmZsYWdzLCB0aGF0Lm1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHRoYXQuZGVzdHJveSgpXG4gICAgICAgIHRoYXQuZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGF0LmZkID0gZmRcbiAgICAgICAgdGhhdC5lbWl0KCdvcGVuJywgZmQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlYWRTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IGZzLlJlYWRTdHJlYW0ocGF0aCwgb3B0aW9ucylcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVdyaXRlU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBmcy5Xcml0ZVN0cmVhbShwYXRoLCBvcHRpb25zKVxuICB9XG5cbiAgdmFyIGZzJG9wZW4gPSBmcy5vcGVuXG4gIGZzLm9wZW4gPSBvcGVuXG4gIGZ1bmN0aW9uIG9wZW4gKHBhdGgsIGZsYWdzLCBtb2RlLCBjYikge1xuICAgIGlmICh0eXBlb2YgbW9kZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gbW9kZSwgbW9kZSA9IG51bGxcblxuICAgIHJldHVybiBnbyRvcGVuKHBhdGgsIGZsYWdzLCBtb2RlLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJG9wZW4gKHBhdGgsIGZsYWdzLCBtb2RlLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkb3BlbihwYXRoLCBmbGFncywgbW9kZSwgZnVuY3Rpb24gKGVyciwgZmQpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kb3BlbiwgW3BhdGgsIGZsYWdzLCBtb2RlLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmc1xufVxuXG5mdW5jdGlvbiBlbnF1ZXVlIChlbGVtKSB7XG4gIGRlYnVnKCdFTlFVRVVFJywgZWxlbVswXS5uYW1lLCBlbGVtWzFdKVxuICBmc1tncmFjZWZ1bFF1ZXVlXS5wdXNoKGVsZW0pXG4gIHJldHJ5KClcbn1cblxuLy8ga2VlcCB0cmFjayBvZiB0aGUgdGltZW91dCBiZXR3ZWVuIHJldHJ5KCkgY2FsbHNcbnZhciByZXRyeVRpbWVyXG5cbi8vIHJlc2V0IHRoZSBzdGFydFRpbWUgYW5kIGxhc3RUaW1lIHRvIG5vd1xuLy8gdGhpcyByZXNldHMgdGhlIHN0YXJ0IG9mIHRoZSA2MCBzZWNvbmQgb3ZlcmFsbCB0aW1lb3V0IGFzIHdlbGwgYXMgdGhlXG4vLyBkZWxheSBiZXR3ZWVuIGF0dGVtcHRzIHNvIHRoYXQgd2UnbGwgcmV0cnkgdGhlc2Ugam9icyBzb29uZXJcbmZ1bmN0aW9uIHJlc2V0UXVldWUgKCkge1xuICB2YXIgbm93ID0gRGF0ZS5ub3coKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZzW2dyYWNlZnVsUXVldWVdLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gZW50cmllcyB0aGF0IGFyZSBvbmx5IGEgbGVuZ3RoIG9mIDIgYXJlIGZyb20gYW4gb2xkZXIgdmVyc2lvbiwgZG9uJ3RcbiAgICAvLyBib3RoZXIgbW9kaWZ5aW5nIHRob3NlIHNpbmNlIHRoZXknbGwgYmUgcmV0cmllZCBhbnl3YXkuXG4gICAgaWYgKGZzW2dyYWNlZnVsUXVldWVdW2ldLmxlbmd0aCA+IDIpIHtcbiAgICAgIGZzW2dyYWNlZnVsUXVldWVdW2ldWzNdID0gbm93IC8vIHN0YXJ0VGltZVxuICAgICAgZnNbZ3JhY2VmdWxRdWV1ZV1baV1bNF0gPSBub3cgLy8gbGFzdFRpbWVcbiAgICB9XG4gIH1cbiAgLy8gY2FsbCByZXRyeSB0byBtYWtlIHN1cmUgd2UncmUgYWN0aXZlbHkgcHJvY2Vzc2luZyB0aGUgcXVldWVcbiAgcmV0cnkoKVxufVxuXG5mdW5jdGlvbiByZXRyeSAoKSB7XG4gIC8vIGNsZWFyIHRoZSB0aW1lciBhbmQgcmVtb3ZlIGl0IHRvIGhlbHAgcHJldmVudCB1bmludGVuZGVkIGNvbmN1cnJlbmN5XG4gIGNsZWFyVGltZW91dChyZXRyeVRpbWVyKVxuICByZXRyeVRpbWVyID0gdW5kZWZpbmVkXG5cbiAgaWYgKGZzW2dyYWNlZnVsUXVldWVdLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm5cblxuICB2YXIgZWxlbSA9IGZzW2dyYWNlZnVsUXVldWVdLnNoaWZ0KClcbiAgdmFyIGZuID0gZWxlbVswXVxuICB2YXIgYXJncyA9IGVsZW1bMV1cbiAgLy8gdGhlc2UgaXRlbXMgbWF5IGJlIHVuc2V0IGlmIHRoZXkgd2VyZSBhZGRlZCBieSBhbiBvbGRlciBncmFjZWZ1bC1mc1xuICB2YXIgZXJyID0gZWxlbVsyXVxuICB2YXIgc3RhcnRUaW1lID0gZWxlbVszXVxuICB2YXIgbGFzdFRpbWUgPSBlbGVtWzRdXG5cbiAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhIHN0YXJ0VGltZSB3ZSBoYXZlIG5vIHdheSBvZiBrbm93aW5nIGlmIHdlJ3ZlIHdhaXRlZFxuICAvLyBsb25nIGVub3VnaCwgc28gZ28gYWhlYWQgYW5kIHJldHJ5IHRoaXMgaXRlbSBub3dcbiAgaWYgKHN0YXJ0VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZGVidWcoJ1JFVFJZJywgZm4ubmFtZSwgYXJncylcbiAgICBmbi5hcHBseShudWxsLCBhcmdzKVxuICB9IGVsc2UgaWYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gNjAwMDApIHtcbiAgICAvLyBpdCdzIGJlZW4gbW9yZSB0aGFuIDYwIHNlY29uZHMgdG90YWwsIGJhaWwgbm93XG4gICAgZGVidWcoJ1RJTUVPVVQnLCBmbi5uYW1lLCBhcmdzKVxuICAgIHZhciBjYiA9IGFyZ3MucG9wKClcbiAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IuY2FsbChudWxsLCBlcnIpXG4gIH0gZWxzZSB7XG4gICAgLy8gdGhlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gdGhlIGxhc3QgYXR0ZW1wdCBhbmQgcmlnaHQgbm93XG4gICAgdmFyIHNpbmNlQXR0ZW1wdCA9IERhdGUubm93KCkgLSBsYXN0VGltZVxuICAgIC8vIHRoZSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIHdoZW4gd2UgZmlyc3QgdHJpZWQsIGFuZCB3aGVuIHdlIGxhc3QgdHJpZWRcbiAgICAvLyByb3VuZGVkIHVwIHRvIGF0IGxlYXN0IDFcbiAgICB2YXIgc2luY2VTdGFydCA9IE1hdGgubWF4KGxhc3RUaW1lIC0gc3RhcnRUaW1lLCAxKVxuICAgIC8vIGJhY2tvZmYuIHdhaXQgbG9uZ2VyIHRoYW4gdGhlIHRvdGFsIHRpbWUgd2UndmUgYmVlbiByZXRyeWluZywgYnV0IG9ubHlcbiAgICAvLyB1cCB0byBhIG1heGltdW0gb2YgMTAwbXNcbiAgICB2YXIgZGVzaXJlZERlbGF5ID0gTWF0aC5taW4oc2luY2VTdGFydCAqIDEuMiwgMTAwKVxuICAgIC8vIGl0J3MgYmVlbiBsb25nIGVub3VnaCBzaW5jZSB0aGUgbGFzdCByZXRyeSwgZG8gaXQgYWdhaW5cbiAgICBpZiAoc2luY2VBdHRlbXB0ID49IGRlc2lyZWREZWxheSkge1xuICAgICAgZGVidWcoJ1JFVFJZJywgZm4ubmFtZSwgYXJncylcbiAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtzdGFydFRpbWVdKSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgd2UgY2FuJ3QgZG8gdGhpcyBqb2IgeWV0LCBwdXNoIGl0IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlXG4gICAgICAvLyBhbmQgbGV0IHRoZSBuZXh0IGl0ZXJhdGlvbiBjaGVjayBhZ2FpblxuICAgICAgZnNbZ3JhY2VmdWxRdWV1ZV0ucHVzaChlbGVtKVxuICAgIH1cbiAgfVxuXG4gIC8vIHNjaGVkdWxlIG91ciBuZXh0IHJ1biBpZiBvbmUgaXNuJ3QgYWxyZWFkeSBzY2hlZHVsZWRcbiAgaWYgKHJldHJ5VGltZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHJ5VGltZXIgPSBzZXRUaW1lb3V0KHJldHJ5LCAwKVxuICB9XG59XG4iLCJ2YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJykuU3RyZWFtXG5cbm1vZHVsZS5leHBvcnRzID0gbGVnYWN5XG5cbmZ1bmN0aW9uIGxlZ2FjeSAoZnMpIHtcbiAgcmV0dXJuIHtcbiAgICBSZWFkU3RyZWFtOiBSZWFkU3RyZWFtLFxuICAgIFdyaXRlU3RyZWFtOiBXcml0ZVN0cmVhbVxuICB9XG5cbiAgZnVuY3Rpb24gUmVhZFN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkU3RyZWFtKSkgcmV0dXJuIG5ldyBSZWFkU3RyZWFtKHBhdGgsIG9wdGlvbnMpO1xuXG4gICAgU3RyZWFtLmNhbGwodGhpcyk7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMuZmQgPSBudWxsO1xuICAgIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XG5cbiAgICB0aGlzLmZsYWdzID0gJ3InO1xuICAgIHRoaXMubW9kZSA9IDQzODsgLyo9MDY2NiovXG4gICAgdGhpcy5idWZmZXJTaXplID0gNjQgKiAxMDI0O1xuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAvLyBNaXhpbiBvcHRpb25zIGludG8gdGhpc1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2luZGV4XTtcbiAgICAgIHRoaXNba2V5XSA9IG9wdGlvbnNba2V5XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbmNvZGluZykgdGhpcy5zZXRFbmNvZGluZyh0aGlzLmVuY29kaW5nKTtcblxuICAgIGlmICh0aGlzLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICgnbnVtYmVyJyAhPT0gdHlwZW9mIHRoaXMuc3RhcnQpIHtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdzdGFydCBtdXN0IGJlIGEgTnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5lbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmVuZCA9IEluZmluaXR5O1xuICAgICAgfSBlbHNlIGlmICgnbnVtYmVyJyAhPT0gdHlwZW9mIHRoaXMuZW5kKSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignZW5kIG11c3QgYmUgYSBOdW1iZXInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RhcnQgPiB0aGlzLmVuZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0IG11c3QgYmUgPD0gZW5kJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucG9zID0gdGhpcy5zdGFydDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mZCAhPT0gbnVsbCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5fcmVhZCgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnMub3Blbih0aGlzLnBhdGgsIHRoaXMuZmxhZ3MsIHRoaXMubW9kZSwgZnVuY3Rpb24gKGVyciwgZmQpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIHNlbGYucmVhZGFibGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZWxmLmZkID0gZmQ7XG4gICAgICBzZWxmLmVtaXQoJ29wZW4nLCBmZCk7XG4gICAgICBzZWxmLl9yZWFkKCk7XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIFdyaXRlU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdyaXRlU3RyZWFtKSkgcmV0dXJuIG5ldyBXcml0ZVN0cmVhbShwYXRoLCBvcHRpb25zKTtcblxuICAgIFN0cmVhbS5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLmZkID0gbnVsbDtcbiAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICAgIHRoaXMuZmxhZ3MgPSAndyc7XG4gICAgdGhpcy5lbmNvZGluZyA9ICdiaW5hcnknO1xuICAgIHRoaXMubW9kZSA9IDQzODsgLyo9MDY2NiovXG4gICAgdGhpcy5ieXRlc1dyaXR0ZW4gPSAwO1xuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAvLyBNaXhpbiBvcHRpb25zIGludG8gdGhpc1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2luZGV4XTtcbiAgICAgIHRoaXNba2V5XSA9IG9wdGlvbnNba2V5XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoJ251bWJlcicgIT09IHR5cGVvZiB0aGlzLnN0YXJ0KSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignc3RhcnQgbXVzdCBiZSBhIE51bWJlcicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RhcnQgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc3RhcnQgbXVzdCBiZSA+PSB6ZXJvJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucG9zID0gdGhpcy5zdGFydDtcbiAgICB9XG5cbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuXG4gICAgaWYgKHRoaXMuZmQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX29wZW4gPSBmcy5vcGVuO1xuICAgICAgdGhpcy5fcXVldWUucHVzaChbdGhpcy5fb3BlbiwgdGhpcy5wYXRoLCB0aGlzLmZsYWdzLCB0aGlzLm1vZGUsIHVuZGVmaW5lZF0pO1xuICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH1cbiAgfVxufVxuIiwidmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJ2NvbnN0YW50cycpXG5cbnZhciBvcmlnQ3dkID0gcHJvY2Vzcy5jd2RcbnZhciBjd2QgPSBudWxsXG5cbnZhciBwbGF0Zm9ybSA9IHByb2Nlc3MuZW52LkdSQUNFRlVMX0ZTX1BMQVRGT1JNIHx8IHByb2Nlc3MucGxhdGZvcm1cblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCFjd2QpXG4gICAgY3dkID0gb3JpZ0N3ZC5jYWxsKHByb2Nlc3MpXG4gIHJldHVybiBjd2Rcbn1cbnRyeSB7XG4gIHByb2Nlc3MuY3dkKClcbn0gY2F0Y2ggKGVyKSB7fVxuXG4vLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCB1bnRpbCBub2RlLmpzIDEyIGlzIHJlcXVpcmVkXG5pZiAodHlwZW9mIHByb2Nlc3MuY2hkaXIgPT09ICdmdW5jdGlvbicpIHtcbiAgdmFyIGNoZGlyID0gcHJvY2Vzcy5jaGRpclxuICBwcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGQpIHtcbiAgICBjd2QgPSBudWxsXG4gICAgY2hkaXIuY2FsbChwcm9jZXNzLCBkKVxuICB9XG4gIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm9jZXNzLmNoZGlyLCBjaGRpcilcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaFxuXG5mdW5jdGlvbiBwYXRjaCAoZnMpIHtcbiAgLy8gKHJlLSlpbXBsZW1lbnQgc29tZSB0aGluZ3MgdGhhdCBhcmUga25vd24gYnVzdGVkIG9yIG1pc3NpbmcuXG5cbiAgLy8gbGNobW9kLCBicm9rZW4gcHJpb3IgdG8gMC42LjJcbiAgLy8gYmFjay1wb3J0IHRoZSBmaXggaGVyZS5cbiAgaWYgKGNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSgnT19TWU1MSU5LJykgJiZcbiAgICAgIHByb2Nlc3MudmVyc2lvbi5tYXRjaCgvXnYwXFwuNlxcLlswLTJdfF52MFxcLjVcXC4vKSkge1xuICAgIHBhdGNoTGNobW9kKGZzKVxuICB9XG5cbiAgLy8gbHV0aW1lcyBpbXBsZW1lbnRhdGlvbiwgb3Igbm8tb3BcbiAgaWYgKCFmcy5sdXRpbWVzKSB7XG4gICAgcGF0Y2hMdXRpbWVzKGZzKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2lzYWFjcy9ub2RlLWdyYWNlZnVsLWZzL2lzc3Vlcy80XG4gIC8vIENob3duIHNob3VsZCBub3QgZmFpbCBvbiBlaW52YWwgb3IgZXBlcm0gaWYgbm9uLXJvb3QuXG4gIC8vIEl0IHNob3VsZCBub3QgZmFpbCBvbiBlbm9zeXMgZXZlciwgYXMgdGhpcyBqdXN0IGluZGljYXRlc1xuICAvLyB0aGF0IGEgZnMgZG9lc24ndCBzdXBwb3J0IHRoZSBpbnRlbmRlZCBvcGVyYXRpb24uXG5cbiAgZnMuY2hvd24gPSBjaG93bkZpeChmcy5jaG93bilcbiAgZnMuZmNob3duID0gY2hvd25GaXgoZnMuZmNob3duKVxuICBmcy5sY2hvd24gPSBjaG93bkZpeChmcy5sY2hvd24pXG5cbiAgZnMuY2htb2QgPSBjaG1vZEZpeChmcy5jaG1vZClcbiAgZnMuZmNobW9kID0gY2htb2RGaXgoZnMuZmNobW9kKVxuICBmcy5sY2htb2QgPSBjaG1vZEZpeChmcy5sY2htb2QpXG5cbiAgZnMuY2hvd25TeW5jID0gY2hvd25GaXhTeW5jKGZzLmNob3duU3luYylcbiAgZnMuZmNob3duU3luYyA9IGNob3duRml4U3luYyhmcy5mY2hvd25TeW5jKVxuICBmcy5sY2hvd25TeW5jID0gY2hvd25GaXhTeW5jKGZzLmxjaG93blN5bmMpXG5cbiAgZnMuY2htb2RTeW5jID0gY2htb2RGaXhTeW5jKGZzLmNobW9kU3luYylcbiAgZnMuZmNobW9kU3luYyA9IGNobW9kRml4U3luYyhmcy5mY2htb2RTeW5jKVxuICBmcy5sY2htb2RTeW5jID0gY2htb2RGaXhTeW5jKGZzLmxjaG1vZFN5bmMpXG5cbiAgZnMuc3RhdCA9IHN0YXRGaXgoZnMuc3RhdClcbiAgZnMuZnN0YXQgPSBzdGF0Rml4KGZzLmZzdGF0KVxuICBmcy5sc3RhdCA9IHN0YXRGaXgoZnMubHN0YXQpXG5cbiAgZnMuc3RhdFN5bmMgPSBzdGF0Rml4U3luYyhmcy5zdGF0U3luYylcbiAgZnMuZnN0YXRTeW5jID0gc3RhdEZpeFN5bmMoZnMuZnN0YXRTeW5jKVxuICBmcy5sc3RhdFN5bmMgPSBzdGF0Rml4U3luYyhmcy5sc3RhdFN5bmMpXG5cbiAgLy8gaWYgbGNobW9kL2xjaG93biBkbyBub3QgZXhpc3QsIHRoZW4gbWFrZSB0aGVtIG5vLW9wc1xuICBpZiAoZnMuY2htb2QgJiYgIWZzLmxjaG1vZCkge1xuICAgIGZzLmxjaG1vZCA9IGZ1bmN0aW9uIChwYXRoLCBtb2RlLCBjYikge1xuICAgICAgaWYgKGNiKSBwcm9jZXNzLm5leHRUaWNrKGNiKVxuICAgIH1cbiAgICBmcy5sY2htb2RTeW5jID0gZnVuY3Rpb24gKCkge31cbiAgfVxuICBpZiAoZnMuY2hvd24gJiYgIWZzLmxjaG93bikge1xuICAgIGZzLmxjaG93biA9IGZ1bmN0aW9uIChwYXRoLCB1aWQsIGdpZCwgY2IpIHtcbiAgICAgIGlmIChjYikgcHJvY2Vzcy5uZXh0VGljayhjYilcbiAgICB9XG4gICAgZnMubGNob3duU3luYyA9IGZ1bmN0aW9uICgpIHt9XG4gIH1cblxuICAvLyBvbiBXaW5kb3dzLCBBL1Ygc29mdHdhcmUgY2FuIGxvY2sgdGhlIGRpcmVjdG9yeSwgY2F1c2luZyB0aGlzXG4gIC8vIHRvIGZhaWwgd2l0aCBhbiBFQUNDRVMgb3IgRVBFUk0gaWYgdGhlIGRpcmVjdG9yeSBjb250YWlucyBuZXdseVxuICAvLyBjcmVhdGVkIGZpbGVzLiAgVHJ5IGFnYWluIG9uIGZhaWx1cmUsIGZvciB1cCB0byA2MCBzZWNvbmRzLlxuXG4gIC8vIFNldCB0aGUgdGltZW91dCB0aGlzIGxvbmcgYmVjYXVzZSBzb21lIFdpbmRvd3MgQW50aS1WaXJ1cywgc3VjaCBhcyBQYXJpdHlcbiAgLy8gYml0OSwgbWF5IGxvY2sgZmlsZXMgZm9yIHVwIHRvIGEgbWludXRlLCBjYXVzaW5nIG5wbSBwYWNrYWdlIGluc3RhbGxcbiAgLy8gZmFpbHVyZXMuIEFsc28sIHRha2UgY2FyZSB0byB5aWVsZCB0aGUgc2NoZWR1bGVyLiBXaW5kb3dzIHNjaGVkdWxpbmcgZ2l2ZXNcbiAgLy8gQ1BVIHRvIGEgYnVzeSBsb29waW5nIHByb2Nlc3MsIHdoaWNoIGNhbiBjYXVzZSB0aGUgcHJvZ3JhbSBjYXVzaW5nIHRoZSBsb2NrXG4gIC8vIGNvbnRlbnRpb24gdG8gYmUgc3RhcnZlZCBvZiBDUFUgYnkgbm9kZSwgc28gdGhlIGNvbnRlbnRpb24gZG9lc24ndCByZXNvbHZlLlxuICBpZiAocGxhdGZvcm0gPT09IFwid2luMzJcIikge1xuICAgIGZzLnJlbmFtZSA9IHR5cGVvZiBmcy5yZW5hbWUgIT09ICdmdW5jdGlvbicgPyBmcy5yZW5hbWVcbiAgICA6IChmdW5jdGlvbiAoZnMkcmVuYW1lKSB7XG4gICAgICBmdW5jdGlvbiByZW5hbWUgKGZyb20sIHRvLCBjYikge1xuICAgICAgICB2YXIgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICAgIHZhciBiYWNrb2ZmID0gMDtcbiAgICAgICAgZnMkcmVuYW1lKGZyb20sIHRvLCBmdW5jdGlvbiBDQiAoZXIpIHtcbiAgICAgICAgICBpZiAoZXJcbiAgICAgICAgICAgICAgJiYgKGVyLmNvZGUgPT09IFwiRUFDQ0VTXCIgfHwgZXIuY29kZSA9PT0gXCJFUEVSTVwiIHx8IGVyLmNvZGUgPT09IFwiRUJVU1lcIilcbiAgICAgICAgICAgICAgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0IDwgNjAwMDApIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGZzLnN0YXQodG8sIGZ1bmN0aW9uIChzdGF0ZXIsIHN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlciAmJiBzdGF0ZXIuY29kZSA9PT0gXCJFTk9FTlRcIilcbiAgICAgICAgICAgICAgICAgIGZzJHJlbmFtZShmcm9tLCB0bywgQ0IpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgIGNiKGVyKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgYmFja29mZilcbiAgICAgICAgICAgIGlmIChiYWNrb2ZmIDwgMTAwKVxuICAgICAgICAgICAgICBiYWNrb2ZmICs9IDEwO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2IpIGNiKGVyKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlbmFtZSwgZnMkcmVuYW1lKVxuICAgICAgcmV0dXJuIHJlbmFtZVxuICAgIH0pKGZzLnJlbmFtZSlcbiAgfVxuXG4gIC8vIGlmIHJlYWQoKSByZXR1cm5zIEVBR0FJTiwgdGhlbiBqdXN0IHRyeSBpdCBhZ2Fpbi5cbiAgZnMucmVhZCA9IHR5cGVvZiBmcy5yZWFkICE9PSAnZnVuY3Rpb24nID8gZnMucmVhZFxuICA6IChmdW5jdGlvbiAoZnMkcmVhZCkge1xuICAgIGZ1bmN0aW9uIHJlYWQgKGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2tfKSB7XG4gICAgICB2YXIgY2FsbGJhY2tcbiAgICAgIGlmIChjYWxsYmFja18gJiYgdHlwZW9mIGNhbGxiYWNrXyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgZWFnQ291bnRlciA9IDBcbiAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoZXIsIF8sIF9fKSB7XG4gICAgICAgICAgaWYgKGVyICYmIGVyLmNvZGUgPT09ICdFQUdBSU4nICYmIGVhZ0NvdW50ZXIgPCAxMCkge1xuICAgICAgICAgICAgZWFnQ291bnRlciArK1xuICAgICAgICAgICAgcmV0dXJuIGZzJHJlYWQuY2FsbChmcywgZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaylcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FsbGJhY2tfLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZzJHJlYWQuY2FsbChmcywgZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaylcbiAgICB9XG5cbiAgICAvLyBUaGlzIGVuc3VyZXMgYHV0aWwucHJvbWlzaWZ5YCB3b3JrcyBhcyBpdCBkb2VzIGZvciBuYXRpdmUgYGZzLnJlYWRgLlxuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIE9iamVjdC5zZXRQcm90b3R5cGVPZihyZWFkLCBmcyRyZWFkKVxuICAgIHJldHVybiByZWFkXG4gIH0pKGZzLnJlYWQpXG5cbiAgZnMucmVhZFN5bmMgPSB0eXBlb2YgZnMucmVhZFN5bmMgIT09ICdmdW5jdGlvbicgPyBmcy5yZWFkU3luY1xuICA6IChmdW5jdGlvbiAoZnMkcmVhZFN5bmMpIHsgcmV0dXJuIGZ1bmN0aW9uIChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pIHtcbiAgICB2YXIgZWFnQ291bnRlciA9IDBcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZzJHJlYWRTeW5jLmNhbGwoZnMsIGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbilcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIGlmIChlci5jb2RlID09PSAnRUFHQUlOJyAmJiBlYWdDb3VudGVyIDwgMTApIHtcbiAgICAgICAgICBlYWdDb3VudGVyICsrXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlclxuICAgICAgfVxuICAgIH1cbiAgfX0pKGZzLnJlYWRTeW5jKVxuXG4gIGZ1bmN0aW9uIHBhdGNoTGNobW9kIChmcykge1xuICAgIGZzLmxjaG1vZCA9IGZ1bmN0aW9uIChwYXRoLCBtb2RlLCBjYWxsYmFjaykge1xuICAgICAgZnMub3BlbiggcGF0aFxuICAgICAgICAgICAgICwgY29uc3RhbnRzLk9fV1JPTkxZIHwgY29uc3RhbnRzLk9fU1lNTElOS1xuICAgICAgICAgICAgICwgbW9kZVxuICAgICAgICAgICAgICwgZnVuY3Rpb24gKGVyciwgZmQpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZXJyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIHByZWZlciB0byByZXR1cm4gdGhlIGNobW9kIGVycm9yLCBpZiBvbmUgb2NjdXJzLFxuICAgICAgICAvLyBidXQgc3RpbGwgdHJ5IHRvIGNsb3NlLCBhbmQgcmVwb3J0IGNsb3NpbmcgZXJyb3JzIGlmIHRoZXkgb2NjdXIuXG4gICAgICAgIGZzLmZjaG1vZChmZCwgbW9kZSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIGZzLmNsb3NlKGZkLCBmdW5jdGlvbihlcnIyKSB7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGVyciB8fCBlcnIyKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cblxuICAgIGZzLmxjaG1vZFN5bmMgPSBmdW5jdGlvbiAocGF0aCwgbW9kZSkge1xuICAgICAgdmFyIGZkID0gZnMub3BlblN5bmMocGF0aCwgY29uc3RhbnRzLk9fV1JPTkxZIHwgY29uc3RhbnRzLk9fU1lNTElOSywgbW9kZSlcblxuICAgICAgLy8gcHJlZmVyIHRvIHJldHVybiB0aGUgY2htb2QgZXJyb3IsIGlmIG9uZSBvY2N1cnMsXG4gICAgICAvLyBidXQgc3RpbGwgdHJ5IHRvIGNsb3NlLCBhbmQgcmVwb3J0IGNsb3NpbmcgZXJyb3JzIGlmIHRoZXkgb2NjdXIuXG4gICAgICB2YXIgdGhyZXcgPSB0cnVlXG4gICAgICB2YXIgcmV0XG4gICAgICB0cnkge1xuICAgICAgICByZXQgPSBmcy5mY2htb2RTeW5jKGZkLCBtb2RlKVxuICAgICAgICB0aHJldyA9IGZhbHNlXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAodGhyZXcpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICAgIH0gY2F0Y2ggKGVyKSB7fVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJldFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhdGNoTHV0aW1lcyAoZnMpIHtcbiAgICBpZiAoY29uc3RhbnRzLmhhc093blByb3BlcnR5KFwiT19TWU1MSU5LXCIpICYmIGZzLmZ1dGltZXMpIHtcbiAgICAgIGZzLmx1dGltZXMgPSBmdW5jdGlvbiAocGF0aCwgYXQsIG10LCBjYikge1xuICAgICAgICBmcy5vcGVuKHBhdGgsIGNvbnN0YW50cy5PX1NZTUxJTkssIGZ1bmN0aW9uIChlciwgZmQpIHtcbiAgICAgICAgICBpZiAoZXIpIHtcbiAgICAgICAgICAgIGlmIChjYikgY2IoZXIpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgZnMuZnV0aW1lcyhmZCwgYXQsIG10LCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgICAgICAgIGZzLmNsb3NlKGZkLCBmdW5jdGlvbiAoZXIyKSB7XG4gICAgICAgICAgICAgIGlmIChjYikgY2IoZXIgfHwgZXIyKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBmcy5sdXRpbWVzU3luYyA9IGZ1bmN0aW9uIChwYXRoLCBhdCwgbXQpIHtcbiAgICAgICAgdmFyIGZkID0gZnMub3BlblN5bmMocGF0aCwgY29uc3RhbnRzLk9fU1lNTElOSylcbiAgICAgICAgdmFyIHJldFxuICAgICAgICB2YXIgdGhyZXcgPSB0cnVlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0ID0gZnMuZnV0aW1lc1N5bmMoZmQsIGF0LCBtdClcbiAgICAgICAgICB0aHJldyA9IGZhbHNlXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKHRocmV3KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgICAgICB9IGNhdGNoIChlcikge31cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGZzLmZ1dGltZXMpIHtcbiAgICAgIGZzLmx1dGltZXMgPSBmdW5jdGlvbiAoX2EsIF9iLCBfYywgY2IpIHsgaWYgKGNiKSBwcm9jZXNzLm5leHRUaWNrKGNiKSB9XG4gICAgICBmcy5sdXRpbWVzU3luYyA9IGZ1bmN0aW9uICgpIHt9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2htb2RGaXggKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIG1vZGUsIGNiKSB7XG4gICAgICByZXR1cm4gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIG1vZGUsIGZ1bmN0aW9uIChlcikge1xuICAgICAgICBpZiAoY2hvd25Fck9rKGVyKSkgZXIgPSBudWxsXG4gICAgICAgIGlmIChjYikgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaG1vZEZpeFN5bmMgKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIG1vZGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBvcmlnLmNhbGwoZnMsIHRhcmdldCwgbW9kZSlcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIGlmICghY2hvd25Fck9rKGVyKSkgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGNob3duRml4IChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB1aWQsIGdpZCwgY2IpIHtcbiAgICAgIHJldHVybiBvcmlnLmNhbGwoZnMsIHRhcmdldCwgdWlkLCBnaWQsIGZ1bmN0aW9uIChlcikge1xuICAgICAgICBpZiAoY2hvd25Fck9rKGVyKSkgZXIgPSBudWxsXG4gICAgICAgIGlmIChjYikgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaG93bkZpeFN5bmMgKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHVpZCwgZ2lkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIHVpZCwgZ2lkKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgaWYgKCFjaG93bkVyT2soZXIpKSB0aHJvdyBlclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXRGaXggKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgLy8gT2xkZXIgdmVyc2lvbnMgb2YgTm9kZSBlcnJvbmVvdXNseSByZXR1cm5lZCBzaWduZWQgaW50ZWdlcnMgZm9yXG4gICAgLy8gdWlkICsgZ2lkLlxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBvcHRpb25zLCBjYikge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNiID0gb3B0aW9uc1xuICAgICAgICBvcHRpb25zID0gbnVsbFxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gY2FsbGJhY2sgKGVyLCBzdGF0cykge1xuICAgICAgICBpZiAoc3RhdHMpIHtcbiAgICAgICAgICBpZiAoc3RhdHMudWlkIDwgMCkgc3RhdHMudWlkICs9IDB4MTAwMDAwMDAwXG4gICAgICAgICAgaWYgKHN0YXRzLmdpZCA8IDApIHN0YXRzLmdpZCArPSAweDEwMDAwMDAwMFxuICAgICAgICB9XG4gICAgICAgIGlmIChjYikgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbnMgPyBvcmlnLmNhbGwoZnMsIHRhcmdldCwgb3B0aW9ucywgY2FsbGJhY2spXG4gICAgICAgIDogb3JpZy5jYWxsKGZzLCB0YXJnZXQsIGNhbGxiYWNrKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXRGaXhTeW5jIChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIC8vIE9sZGVyIHZlcnNpb25zIG9mIE5vZGUgZXJyb25lb3VzbHkgcmV0dXJuZWQgc2lnbmVkIGludGVnZXJzIGZvclxuICAgIC8vIHVpZCArIGdpZC5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgb3B0aW9ucykge1xuICAgICAgdmFyIHN0YXRzID0gb3B0aW9ucyA/IG9yaWcuY2FsbChmcywgdGFyZ2V0LCBvcHRpb25zKVxuICAgICAgICA6IG9yaWcuY2FsbChmcywgdGFyZ2V0KVxuICAgICAgaWYgKHN0YXRzKSB7XG4gICAgICAgIGlmIChzdGF0cy51aWQgPCAwKSBzdGF0cy51aWQgKz0gMHgxMDAwMDAwMDBcbiAgICAgICAgaWYgKHN0YXRzLmdpZCA8IDApIHN0YXRzLmdpZCArPSAweDEwMDAwMDAwMFxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRzO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVOT1NZUyBtZWFucyB0aGF0IHRoZSBmcyBkb2Vzbid0IHN1cHBvcnQgdGhlIG9wLiBKdXN0IGlnbm9yZVxuICAvLyB0aGF0LCBiZWNhdXNlIGl0IGRvZXNuJ3QgbWF0dGVyLlxuICAvL1xuICAvLyBpZiB0aGVyZSdzIG5vIGdldHVpZCwgb3IgaWYgZ2V0dWlkKCkgaXMgc29tZXRoaW5nIG90aGVyXG4gIC8vIHRoYW4gMCwgYW5kIHRoZSBlcnJvciBpcyBFSU5WQUwgb3IgRVBFUk0sIHRoZW4ganVzdCBpZ25vcmVcbiAgLy8gaXQuXG4gIC8vXG4gIC8vIFRoaXMgc3BlY2lmaWMgY2FzZSBpcyBhIHNpbGVudCBmYWlsdXJlIGluIGNwLCBpbnN0YWxsLCB0YXIsXG4gIC8vIGFuZCBtb3N0IG90aGVyIHVuaXggdG9vbHMgdGhhdCBtYW5hZ2UgcGVybWlzc2lvbnMuXG4gIC8vXG4gIC8vIFdoZW4gcnVubmluZyBhcyByb290LCBvciBpZiBvdGhlciB0eXBlcyBvZiBlcnJvcnMgYXJlXG4gIC8vIGVuY291bnRlcmVkLCB0aGVuIGl0J3Mgc3RyaWN0LlxuICBmdW5jdGlvbiBjaG93bkVyT2sgKGVyKSB7XG4gICAgaWYgKCFlcilcbiAgICAgIHJldHVybiB0cnVlXG5cbiAgICBpZiAoZXIuY29kZSA9PT0gXCJFTk9TWVNcIilcbiAgICAgIHJldHVybiB0cnVlXG5cbiAgICB2YXIgbm9ucm9vdCA9ICFwcm9jZXNzLmdldHVpZCB8fCBwcm9jZXNzLmdldHVpZCgpICE9PSAwXG4gICAgaWYgKG5vbnJvb3QpIHtcbiAgICAgIGlmIChlci5jb2RlID09PSBcIkVJTlZBTFwiIHx8IGVyLmNvZGUgPT09IFwiRVBFUk1cIilcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmbGFnLCBhcmd2ID0gcHJvY2Vzcy5hcmd2KSA9PiB7XG5cdGNvbnN0IHByZWZpeCA9IGZsYWcuc3RhcnRzV2l0aCgnLScpID8gJycgOiAoZmxhZy5sZW5ndGggPT09IDEgPyAnLScgOiAnLS0nKTtcblx0Y29uc3QgcG9zaXRpb24gPSBhcmd2LmluZGV4T2YocHJlZml4ICsgZmxhZyk7XG5cdGNvbnN0IHRlcm1pbmF0b3JQb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZignLS0nKTtcblx0cmV0dXJuIHBvc2l0aW9uICE9PSAtMSAmJiAodGVybWluYXRvclBvc2l0aW9uID09PSAtMSB8fCBwb3NpdGlvbiA8IHRlcm1pbmF0b3JQb3NpdGlvbik7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSHR0cFByb3h5QWdlbnQgPSB2b2lkIDA7XG5jb25zdCBuZXQgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm5ldFwiKSk7XG5jb25zdCB0bHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInRsc1wiKSk7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5jb25zdCBhZ2VudF9iYXNlXzEgPSByZXF1aXJlKFwiYWdlbnQtYmFzZVwiKTtcbmNvbnN0IHVybF8xID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2h0dHAtcHJveHktYWdlbnQnKTtcbi8qKlxuICogVGhlIGBIdHRwUHJveHlBZ2VudGAgaW1wbGVtZW50cyBhbiBIVFRQIEFnZW50IHN1YmNsYXNzIHRoYXQgY29ubmVjdHNcbiAqIHRvIHRoZSBzcGVjaWZpZWQgXCJIVFRQIHByb3h5IHNlcnZlclwiIGluIG9yZGVyIHRvIHByb3h5IEhUVFAgcmVxdWVzdHMuXG4gKi9cbmNsYXNzIEh0dHBQcm94eUFnZW50IGV4dGVuZHMgYWdlbnRfYmFzZV8xLkFnZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm94eSwgb3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy5wcm94eSA9IHR5cGVvZiBwcm94eSA9PT0gJ3N0cmluZycgPyBuZXcgdXJsXzEuVVJMKHByb3h5KSA6IHByb3h5O1xuICAgICAgICB0aGlzLnByb3h5SGVhZGVycyA9IG9wdHM/LmhlYWRlcnMgPz8ge307XG4gICAgICAgIGRlYnVnKCdDcmVhdGluZyBuZXcgSHR0cFByb3h5QWdlbnQgaW5zdGFuY2U6ICVvJywgdGhpcy5wcm94eS5ocmVmKTtcbiAgICAgICAgLy8gVHJpbSBvZmYgdGhlIGJyYWNrZXRzIGZyb20gSVB2NiBhZGRyZXNzZXNcbiAgICAgICAgY29uc3QgaG9zdCA9ICh0aGlzLnByb3h5Lmhvc3RuYW1lIHx8IHRoaXMucHJveHkuaG9zdCkucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMucHJveHkucG9ydFxuICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLnByb3h5LnBvcnQsIDEwKVxuICAgICAgICAgICAgOiB0aGlzLnByb3h5LnByb3RvY29sID09PSAnaHR0cHM6J1xuICAgICAgICAgICAgICAgID8gNDQzXG4gICAgICAgICAgICAgICAgOiA4MDtcbiAgICAgICAgdGhpcy5jb25uZWN0T3B0cyA9IHtcbiAgICAgICAgICAgIC4uLihvcHRzID8gb21pdChvcHRzLCAnaGVhZGVycycpIDogbnVsbCksXG4gICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYWRkUmVxdWVzdChyZXEsIG9wdHMpIHtcbiAgICAgICAgcmVxLl9oZWFkZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnNldFJlcXVlc3RQcm9wcyhyZXEsIG9wdHMpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBhZGRSZXF1ZXN0KClgIGlzbid0IGRlZmluZWQgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICBzdXBlci5hZGRSZXF1ZXN0KHJlcSwgb3B0cyk7XG4gICAgfVxuICAgIHNldFJlcXVlc3RQcm9wcyhyZXEsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBvcHRzLnNlY3VyZUVuZHBvaW50ID8gJ2h0dHBzOicgOiAnaHR0cDonO1xuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHJlcS5nZXRIZWFkZXIoJ2hvc3QnKSB8fCAnbG9jYWxob3N0JztcbiAgICAgICAgY29uc3QgYmFzZSA9IGAke3Byb3RvY29sfS8vJHtob3N0bmFtZX1gO1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgdXJsXzEuVVJMKHJlcS5wYXRoLCBiYXNlKTtcbiAgICAgICAgaWYgKG9wdHMucG9ydCAhPT0gODApIHtcbiAgICAgICAgICAgIHVybC5wb3J0ID0gU3RyaW5nKG9wdHMucG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hhbmdlIHRoZSBgaHR0cC5DbGllbnRSZXF1ZXN0YCBpbnN0YW5jZSdzIFwicGF0aFwiIGZpZWxkXG4gICAgICAgIC8vIHRvIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZC5cbiAgICAgICAgcmVxLnBhdGggPSBTdHJpbmcodXJsKTtcbiAgICAgICAgLy8gSW5qZWN0IHRoZSBgUHJveHktQXV0aG9yaXphdGlvbmAgaGVhZGVyIGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHR5cGVvZiB0aGlzLnByb3h5SGVhZGVycyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyB0aGlzLnByb3h5SGVhZGVycygpXG4gICAgICAgICAgICA6IHsgLi4udGhpcy5wcm94eUhlYWRlcnMgfTtcbiAgICAgICAgaWYgKHByb3h5LnVzZXJuYW1lIHx8IHByb3h5LnBhc3N3b3JkKSB7XG4gICAgICAgICAgICBjb25zdCBhdXRoID0gYCR7ZGVjb2RlVVJJQ29tcG9uZW50KHByb3h5LnVzZXJuYW1lKX06JHtkZWNvZGVVUklDb21wb25lbnQocHJveHkucGFzc3dvcmQpfWA7XG4gICAgICAgICAgICBoZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtCdWZmZXIuZnJvbShhdXRoKS50b1N0cmluZygnYmFzZTY0Jyl9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhlYWRlcnNbJ1Byb3h5LUNvbm5lY3Rpb24nXSkge1xuICAgICAgICAgICAgaGVhZGVyc1snUHJveHktQ29ubmVjdGlvbiddID0gdGhpcy5rZWVwQWxpdmVcbiAgICAgICAgICAgICAgICA/ICdLZWVwLUFsaXZlJ1xuICAgICAgICAgICAgICAgIDogJ2Nsb3NlJztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoaGVhZGVycykpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZGVyc1tuYW1lXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJlcS5zZXRIZWFkZXIobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGNvbm5lY3QocmVxLCBvcHRzKSB7XG4gICAgICAgIHJlcS5faGVhZGVyID0gbnVsbDtcbiAgICAgICAgaWYgKCFyZXEucGF0aC5pbmNsdWRlcygnOi8vJykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UmVxdWVzdFByb3BzKHJlcSwgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIGh0dHAgQ2xpZW50UmVxdWVzdCdzIGludGVybmFsIGBfaGVhZGVyYCBmaWVsZFxuICAgICAgICAvLyBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBzZXQuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB3ZSdsbCBuZWVkXG4gICAgICAgIC8vIHRvIHJlLWdlbmVyYXRlIHRoZSBzdHJpbmcgc2luY2Ugd2UganVzdCBjaGFuZ2VkIHRoZSBgcmVxLnBhdGhgLlxuICAgICAgICBsZXQgZmlyc3Q7XG4gICAgICAgIGxldCBlbmRPZkhlYWRlcnM7XG4gICAgICAgIGRlYnVnKCdSZWdlbmVyYXRpbmcgc3RvcmVkIEhUVFAgaGVhZGVyIHN0cmluZyBmb3IgcmVxdWVzdCcpO1xuICAgICAgICByZXEuX2ltcGxpY2l0SGVhZGVyKCk7XG4gICAgICAgIGlmIChyZXEub3V0cHV0RGF0YSAmJiByZXEub3V0cHV0RGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZWJ1ZygnUGF0Y2hpbmcgY29ubmVjdGlvbiB3cml0ZSgpIG91dHB1dCBidWZmZXIgd2l0aCB1cGRhdGVkIGhlYWRlcicpO1xuICAgICAgICAgICAgZmlyc3QgPSByZXEub3V0cHV0RGF0YVswXS5kYXRhO1xuICAgICAgICAgICAgZW5kT2ZIZWFkZXJzID0gZmlyc3QuaW5kZXhPZignXFxyXFxuXFxyXFxuJykgKyA0O1xuICAgICAgICAgICAgcmVxLm91dHB1dERhdGFbMF0uZGF0YSA9XG4gICAgICAgICAgICAgICAgcmVxLl9oZWFkZXIgKyBmaXJzdC5zdWJzdHJpbmcoZW5kT2ZIZWFkZXJzKTtcbiAgICAgICAgICAgIGRlYnVnKCdPdXRwdXQgYnVmZmVyOiAlbycsIHJlcS5vdXRwdXREYXRhWzBdLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBhIHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBwcm94eSBzZXJ2ZXIuXG4gICAgICAgIGxldCBzb2NrZXQ7XG4gICAgICAgIGlmICh0aGlzLnByb3h5LnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgICAgICAgZGVidWcoJ0NyZWF0aW5nIGB0bHMuU29ja2V0YDogJW8nLCB0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIHNvY2tldCA9IHRscy5jb25uZWN0KHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVidWcoJ0NyZWF0aW5nIGBuZXQuU29ja2V0YDogJW8nLCB0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIHNvY2tldCA9IG5ldC5jb25uZWN0KHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBzb2NrZXQncyBgY29ubmVjdGAgZXZlbnQsIHNvIHRoYXQgdGhpcyBgY2FsbGJhY2soKWBcbiAgICAgICAgLy8gZnVuY3Rpb24gdGhyb3dzIGluc3RlYWQgb2YgdGhlIGBodHRwYCByZXF1ZXN0IG1hY2hpbmVyeS4gVGhpcyBpc1xuICAgICAgICAvLyBpbXBvcnRhbnQgZm9yIGkuZS4gYFBhY1Byb3h5QWdlbnRgIHdoaWNoIGRldGVybWluZXMgYSBmYWlsZWQgcHJveHlcbiAgICAgICAgLy8gY29ubmVjdGlvbiB2aWEgdGhlIGBjYWxsYmFjaygpYCBmdW5jdGlvbiB0aHJvd2luZy5cbiAgICAgICAgYXdhaXQgKDAsIGV2ZW50c18xLm9uY2UpKHNvY2tldCwgJ2Nvbm5lY3QnKTtcbiAgICAgICAgcmV0dXJuIHNvY2tldDtcbiAgICB9XG59XG5IdHRwUHJveHlBZ2VudC5wcm90b2NvbHMgPSBbJ2h0dHAnLCAnaHR0cHMnXTtcbmV4cG9ydHMuSHR0cFByb3h5QWdlbnQgPSBIdHRwUHJveHlBZ2VudDtcbmZ1bmN0aW9uIG9taXQob2JqLCAuLi5rZXlzKSB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGtleTtcbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkh0dHBzUHJveHlBZ2VudCA9IHZvaWQgMDtcbmNvbnN0IG5ldCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwibmV0XCIpKTtcbmNvbnN0IHRscyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidGxzXCIpKTtcbmNvbnN0IGFzc2VydF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJhc3NlcnRcIikpO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpO1xuY29uc3QgYWdlbnRfYmFzZV8xID0gcmVxdWlyZShcImFnZW50LWJhc2VcIik7XG5jb25zdCB1cmxfMSA9IHJlcXVpcmUoXCJ1cmxcIik7XG5jb25zdCBwYXJzZV9wcm94eV9yZXNwb25zZV8xID0gcmVxdWlyZShcIi4vcGFyc2UtcHJveHktcmVzcG9uc2VcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdodHRwcy1wcm94eS1hZ2VudCcpO1xuLyoqXG4gKiBUaGUgYEh0dHBzUHJveHlBZ2VudGAgaW1wbGVtZW50cyBhbiBIVFRQIEFnZW50IHN1YmNsYXNzIHRoYXQgY29ubmVjdHMgdG9cbiAqIHRoZSBzcGVjaWZpZWQgXCJIVFRQKHMpIHByb3h5IHNlcnZlclwiIGluIG9yZGVyIHRvIHByb3h5IEhUVFBTIHJlcXVlc3RzLlxuICpcbiAqIE91dGdvaW5nIEhUVFAgcmVxdWVzdHMgYXJlIGZpcnN0IHR1bm5lbGVkIHRocm91Z2ggdGhlIHByb3h5IHNlcnZlciB1c2luZyB0aGVcbiAqIGBDT05ORUNUYCBIVFRQIHJlcXVlc3QgbWV0aG9kIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gdGhlIHByb3h5IHNlcnZlcixcbiAqIGFuZCB0aGVuIHRoZSBwcm94eSBzZXJ2ZXIgY29ubmVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIHRhcmdldCBhbmQgaXNzdWVzIHRoZVxuICogSFRUUCByZXF1ZXN0IGZyb20gdGhlIHByb3h5IHNlcnZlci5cbiAqXG4gKiBgaHR0cHM6YCByZXF1ZXN0cyBoYXZlIHRoZWlyIHNvY2tldCBjb25uZWN0aW9uIHVwZ3JhZGVkIHRvIFRMUyBvbmNlXG4gKiB0aGUgY29ubmVjdGlvbiB0byB0aGUgcHJveHkgc2VydmVyIGhhcyBiZWVuIGVzdGFibGlzaGVkLlxuICovXG5jbGFzcyBIdHRwc1Byb3h5QWdlbnQgZXh0ZW5kcyBhZ2VudF9iYXNlXzEuQWdlbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3h5LCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7IHBhdGg6IHVuZGVmaW5lZCB9O1xuICAgICAgICB0aGlzLnByb3h5ID0gdHlwZW9mIHByb3h5ID09PSAnc3RyaW5nJyA/IG5ldyB1cmxfMS5VUkwocHJveHkpIDogcHJveHk7XG4gICAgICAgIHRoaXMucHJveHlIZWFkZXJzID0gb3B0cz8uaGVhZGVycyA/PyB7fTtcbiAgICAgICAgZGVidWcoJ0NyZWF0aW5nIG5ldyBIdHRwc1Byb3h5QWdlbnQgaW5zdGFuY2U6ICVvJywgdGhpcy5wcm94eS5ocmVmKTtcbiAgICAgICAgLy8gVHJpbSBvZmYgdGhlIGJyYWNrZXRzIGZyb20gSVB2NiBhZGRyZXNzZXNcbiAgICAgICAgY29uc3QgaG9zdCA9ICh0aGlzLnByb3h5Lmhvc3RuYW1lIHx8IHRoaXMucHJveHkuaG9zdCkucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMucHJveHkucG9ydFxuICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLnByb3h5LnBvcnQsIDEwKVxuICAgICAgICAgICAgOiB0aGlzLnByb3h5LnByb3RvY29sID09PSAnaHR0cHM6J1xuICAgICAgICAgICAgICAgID8gNDQzXG4gICAgICAgICAgICAgICAgOiA4MDtcbiAgICAgICAgdGhpcy5jb25uZWN0T3B0cyA9IHtcbiAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gbmVnb3RpYXRlIGh0dHAvMS4xIGZvciBwcm94eSBzZXJ2ZXJzIHRoYXQgc3VwcG9ydCBodHRwLzJcbiAgICAgICAgICAgIEFMUE5Qcm90b2NvbHM6IFsnaHR0cC8xLjEnXSxcbiAgICAgICAgICAgIC4uLihvcHRzID8gb21pdChvcHRzLCAnaGVhZGVycycpIDogbnVsbCksXG4gICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIG5vZGUtY29yZSBIVFRQIGNsaWVudCBsaWJyYXJ5IGlzIGNyZWF0aW5nIGFcbiAgICAgKiBuZXcgSFRUUCByZXF1ZXN0LlxuICAgICAqL1xuICAgIGFzeW5jIGNvbm5lY3QocmVxLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IHRoaXM7XG4gICAgICAgIGlmICghb3B0cy5ob3N0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBcImhvc3RcIiBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBhIHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBwcm94eSBzZXJ2ZXIuXG4gICAgICAgIGxldCBzb2NrZXQ7XG4gICAgICAgIGlmIChwcm94eS5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgICAgICAgIGRlYnVnKCdDcmVhdGluZyBgdGxzLlNvY2tldGA6ICVvJywgdGhpcy5jb25uZWN0T3B0cyk7XG4gICAgICAgICAgICBjb25zdCBzZXJ2ZXJuYW1lID0gdGhpcy5jb25uZWN0T3B0cy5zZXJ2ZXJuYW1lIHx8IHRoaXMuY29ubmVjdE9wdHMuaG9zdDtcbiAgICAgICAgICAgIHNvY2tldCA9IHRscy5jb25uZWN0KHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmNvbm5lY3RPcHRzLFxuICAgICAgICAgICAgICAgIHNlcnZlcm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnKCdDcmVhdGluZyBgbmV0LlNvY2tldGA6ICVvJywgdGhpcy5jb25uZWN0T3B0cyk7XG4gICAgICAgICAgICBzb2NrZXQgPSBuZXQuY29ubmVjdCh0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJzID0gdHlwZW9mIHRoaXMucHJveHlIZWFkZXJzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHRoaXMucHJveHlIZWFkZXJzKClcbiAgICAgICAgICAgIDogeyAuLi50aGlzLnByb3h5SGVhZGVycyB9O1xuICAgICAgICBjb25zdCBob3N0ID0gbmV0LmlzSVB2NihvcHRzLmhvc3QpID8gYFske29wdHMuaG9zdH1dYCA6IG9wdHMuaG9zdDtcbiAgICAgICAgbGV0IHBheWxvYWQgPSBgQ09OTkVDVCAke2hvc3R9OiR7b3B0cy5wb3J0fSBIVFRQLzEuMVxcclxcbmA7XG4gICAgICAgIC8vIEluamVjdCB0aGUgYFByb3h5LUF1dGhvcml6YXRpb25gIGhlYWRlciBpZiBuZWNlc3NhcnkuXG4gICAgICAgIGlmIChwcm94eS51c2VybmFtZSB8fCBwcm94eS5wYXNzd29yZCkge1xuICAgICAgICAgICAgY29uc3QgYXV0aCA9IGAke2RlY29kZVVSSUNvbXBvbmVudChwcm94eS51c2VybmFtZSl9OiR7ZGVjb2RlVVJJQ29tcG9uZW50KHByb3h5LnBhc3N3b3JkKX1gO1xuICAgICAgICAgICAgaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gYEJhc2ljICR7QnVmZmVyLmZyb20oYXV0aCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWA7XG4gICAgICAgIH1cbiAgICAgICAgaGVhZGVycy5Ib3N0ID0gYCR7aG9zdH06JHtvcHRzLnBvcnR9YDtcbiAgICAgICAgaWYgKCFoZWFkZXJzWydQcm94eS1Db25uZWN0aW9uJ10pIHtcbiAgICAgICAgICAgIGhlYWRlcnNbJ1Byb3h5LUNvbm5lY3Rpb24nXSA9IHRoaXMua2VlcEFsaXZlXG4gICAgICAgICAgICAgICAgPyAnS2VlcC1BbGl2ZSdcbiAgICAgICAgICAgICAgICA6ICdjbG9zZSc7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgICBwYXlsb2FkICs9IGAke25hbWV9OiAke2hlYWRlcnNbbmFtZV19XFxyXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm94eVJlc3BvbnNlUHJvbWlzZSA9ICgwLCBwYXJzZV9wcm94eV9yZXNwb25zZV8xLnBhcnNlUHJveHlSZXNwb25zZSkoc29ja2V0KTtcbiAgICAgICAgc29ja2V0LndyaXRlKGAke3BheWxvYWR9XFxyXFxuYCk7XG4gICAgICAgIGNvbnN0IHsgY29ubmVjdCwgYnVmZmVyZWQgfSA9IGF3YWl0IHByb3h5UmVzcG9uc2VQcm9taXNlO1xuICAgICAgICByZXEuZW1pdCgncHJveHlDb25uZWN0JywgY29ubmVjdCk7XG4gICAgICAgIHRoaXMuZW1pdCgncHJveHlDb25uZWN0JywgY29ubmVjdCwgcmVxKTtcbiAgICAgICAgaWYgKGNvbm5lY3Quc3RhdHVzQ29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXEub25jZSgnc29ja2V0JywgcmVzdW1lKTtcbiAgICAgICAgICAgIGlmIChvcHRzLnNlY3VyZUVuZHBvaW50KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHByb3h5IGlzIGNvbm5lY3RpbmcgdG8gYSBUTFMgc2VydmVyLCBzbyB1cGdyYWRlXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBzb2NrZXQgY29ubmVjdGlvbiB0byBhIFRMUyBjb25uZWN0aW9uLlxuICAgICAgICAgICAgICAgIGRlYnVnKCdVcGdyYWRpbmcgc29ja2V0IGNvbm5lY3Rpb24gdG8gVExTJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VydmVybmFtZSA9IG9wdHMuc2VydmVybmFtZSB8fCBvcHRzLmhvc3Q7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRscy5jb25uZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgLi4ub21pdChvcHRzLCAnaG9zdCcsICdwYXRoJywgJ3BvcnQnKSxcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0LFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJuYW1lLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNvY2tldDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb21lIG90aGVyIHN0YXR1cyBjb2RlIHRoYXQncyBub3QgMjAwLi4uIG5lZWQgdG8gcmUtcGxheSB0aGUgSFRUUFxuICAgICAgICAvLyBoZWFkZXIgXCJkYXRhXCIgZXZlbnRzIG9udG8gdGhlIHNvY2tldCBvbmNlIHRoZSBIVFRQIG1hY2hpbmVyeSBpc1xuICAgICAgICAvLyBhdHRhY2hlZCBzbyB0aGF0IHRoZSBub2RlIGNvcmUgYGh0dHBgIGNhbiBwYXJzZSBhbmQgaGFuZGxlIHRoZVxuICAgICAgICAvLyBlcnJvciBzdGF0dXMgY29kZS5cbiAgICAgICAgLy8gQ2xvc2UgdGhlIG9yaWdpbmFsIHNvY2tldCwgYW5kIGEgbmV3IFwiZmFrZVwiIHNvY2tldCBpcyByZXR1cm5lZFxuICAgICAgICAvLyBpbnN0ZWFkLCBzbyB0aGF0IHRoZSBwcm94eSBkb2Vzbid0IGdldCB0aGUgSFRUUCByZXF1ZXN0XG4gICAgICAgIC8vIHdyaXR0ZW4gdG8gaXQgKHdoaWNoIG1heSBjb250YWluIGBBdXRob3JpemF0aW9uYCBoZWFkZXJzIG9yIG90aGVyXG4gICAgICAgIC8vIHNlbnNpdGl2ZSBkYXRhKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2VlOiBodHRwczovL2hhY2tlcm9uZS5jb20vcmVwb3J0cy81NDE1MDJcbiAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgY29uc3QgZmFrZVNvY2tldCA9IG5ldyBuZXQuU29ja2V0KHsgd3JpdGFibGU6IGZhbHNlIH0pO1xuICAgICAgICBmYWtlU29ja2V0LnJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgICAgLy8gTmVlZCB0byB3YWl0IGZvciB0aGUgXCJzb2NrZXRcIiBldmVudCB0byByZS1wbGF5IHRoZSBcImRhdGFcIiBldmVudHMuXG4gICAgICAgIHJlcS5vbmNlKCdzb2NrZXQnLCAocykgPT4ge1xuICAgICAgICAgICAgZGVidWcoJ1JlcGxheWluZyBwcm94eSBidWZmZXIgZm9yIGZhaWxlZCByZXF1ZXN0Jyk7XG4gICAgICAgICAgICAoMCwgYXNzZXJ0XzEuZGVmYXVsdCkocy5saXN0ZW5lckNvdW50KCdkYXRhJykgPiAwKTtcbiAgICAgICAgICAgIC8vIFJlcGxheSB0aGUgXCJidWZmZXJlZFwiIEJ1ZmZlciBvbnRvIHRoZSBmYWtlIGBzb2NrZXRgLCBzaW5jZSBhdFxuICAgICAgICAgICAgLy8gdGhpcyBwb2ludCB0aGUgSFRUUCBtb2R1bGUgbWFjaGluZXJ5IGhhcyBiZWVuIGhvb2tlZCB1cCBmb3JcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyLlxuICAgICAgICAgICAgcy5wdXNoKGJ1ZmZlcmVkKTtcbiAgICAgICAgICAgIHMucHVzaChudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWtlU29ja2V0O1xuICAgIH1cbn1cbkh0dHBzUHJveHlBZ2VudC5wcm90b2NvbHMgPSBbJ2h0dHAnLCAnaHR0cHMnXTtcbmV4cG9ydHMuSHR0cHNQcm94eUFnZW50ID0gSHR0cHNQcm94eUFnZW50O1xuZnVuY3Rpb24gcmVzdW1lKHNvY2tldCkge1xuICAgIHNvY2tldC5yZXN1bWUoKTtcbn1cbmZ1bmN0aW9uIG9taXQob2JqLCAuLi5rZXlzKSB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGtleTtcbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZVByb3h5UmVzcG9uc2UgPSB2b2lkIDA7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdodHRwcy1wcm94eS1hZ2VudDpwYXJzZS1wcm94eS1yZXNwb25zZScpO1xuZnVuY3Rpb24gcGFyc2VQcm94eVJlc3BvbnNlKHNvY2tldCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gYnVmZmVyIGFueSBIVFRQIHRyYWZmaWMgdGhhdCBoYXBwZW5zIHdpdGggdGhlIHByb3h5IGJlZm9yZSB3ZSBnZXRcbiAgICAgICAgLy8gdGhlIENPTk5FQ1QgcmVzcG9uc2UsIHNvIHRoYXQgaWYgdGhlIHJlc3BvbnNlIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gYW4gXCIyMDBcIlxuICAgICAgICAvLyByZXNwb25zZSBjb2RlLCB0aGVuIHdlIGNhbiByZS1wbGF5IHRoZSBcImRhdGFcIiBldmVudHMgb24gdGhlIHNvY2tldCBvbmNlIHRoZVxuICAgICAgICAvLyBIVFRQIHBhcnNlciBpcyBob29rZWQgdXAuLi5cbiAgICAgICAgbGV0IGJ1ZmZlcnNMZW5ndGggPSAwO1xuICAgICAgICBjb25zdCBidWZmZXJzID0gW107XG4gICAgICAgIGZ1bmN0aW9uIHJlYWQoKSB7XG4gICAgICAgICAgICBjb25zdCBiID0gc29ja2V0LnJlYWQoKTtcbiAgICAgICAgICAgIGlmIChiKVxuICAgICAgICAgICAgICAgIG9uZGF0YShiKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzb2NrZXQub25jZSgncmVhZGFibGUnLCByZWFkKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgcmVhZCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb3h5IGNvbm5lY3Rpb24gZW5kZWQgYmVmb3JlIHJlY2VpdmluZyBDT05ORUNUIHJlc3BvbnNlJykpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG9uZXJyb3IoZXJyKSB7XG4gICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICBkZWJ1Zygnb25lcnJvciAlbycsIGVycik7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvbmRhdGEoYikge1xuICAgICAgICAgICAgYnVmZmVycy5wdXNoKGIpO1xuICAgICAgICAgICAgYnVmZmVyc0xlbmd0aCArPSBiLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcmVkID0gQnVmZmVyLmNvbmNhdChidWZmZXJzLCBidWZmZXJzTGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZE9mSGVhZGVycyA9IGJ1ZmZlcmVkLmluZGV4T2YoJ1xcclxcblxcclxcbicpO1xuICAgICAgICAgICAgaWYgKGVuZE9mSGVhZGVycyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBrZWVwIGJ1ZmZlcmluZ1xuICAgICAgICAgICAgICAgIGRlYnVnKCdoYXZlIG5vdCByZWNlaXZlZCBlbmQgb2YgSFRUUCBoZWFkZXJzIHlldC4uLicpO1xuICAgICAgICAgICAgICAgIHJlYWQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJQYXJ0cyA9IGJ1ZmZlcmVkXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIGVuZE9mSGVhZGVycylcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoJ2FzY2lpJylcbiAgICAgICAgICAgICAgICAuc3BsaXQoJ1xcclxcbicpO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RMaW5lID0gaGVhZGVyUGFydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmICghZmlyc3RMaW5lKSB7XG4gICAgICAgICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignTm8gaGVhZGVyIHJlY2VpdmVkIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZpcnN0TGluZVBhcnRzID0gZmlyc3RMaW5lLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gK2ZpcnN0TGluZVBhcnRzWzFdO1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzVGV4dCA9IGZpcnN0TGluZVBhcnRzLnNsaWNlKDIpLmpvaW4oJyAnKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyIG9mIGhlYWRlclBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoZWFkZXIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q29sb24gPSBoZWFkZXIuaW5kZXhPZignOicpO1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbG9uID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgSW52YWxpZCBoZWFkZXIgZnJvbSBwcm94eSBDT05ORUNUIHJlc3BvbnNlOiBcIiR7aGVhZGVyfVwiYCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBoZWFkZXIuc2xpY2UoMCwgZmlyc3RDb2xvbikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGhlYWRlci5zbGljZShmaXJzdENvbG9uICsgMSkudHJpbVN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IGhlYWRlcnNba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IFtjdXJyZW50LCB2YWx1ZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlYnVnKCdnb3QgcHJveHkgc2VydmVyIHJlc3BvbnNlOiAlbyAlbycsIGZpcnN0TGluZSwgaGVhZGVycyk7XG4gICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICBjb25uZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBidWZmZXJlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNvY2tldC5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgICAgICAgc29ja2V0Lm9uKCdlbmQnLCBvbmVuZCk7XG4gICAgICAgIHJlYWQoKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucGFyc2VQcm94eVJlc3BvbnNlID0gcGFyc2VQcm94eVJlc3BvbnNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2UtcHJveHktcmVzcG9uc2UuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFkZHJlc3NFcnJvciA9IHZvaWQgMDtcbmNsYXNzIEFkZHJlc3NFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBwYXJzZU1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdBZGRyZXNzRXJyb3InO1xuICAgICAgICBpZiAocGFyc2VNZXNzYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlTWVzc2FnZSA9IHBhcnNlTWVzc2FnZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuQWRkcmVzc0Vycm9yID0gQWRkcmVzc0Vycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWRkcmVzcy1lcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNDb3JyZWN0ID0gZXhwb3J0cy5pc0luU3VibmV0ID0gdm9pZCAwO1xuZnVuY3Rpb24gaXNJblN1Ym5ldChhZGRyZXNzKSB7XG4gICAgaWYgKHRoaXMuc3VibmV0TWFzayA8IGFkZHJlc3Muc3VibmV0TWFzaykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hc2soYWRkcmVzcy5zdWJuZXRNYXNrKSA9PT0gYWRkcmVzcy5tYXNrKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydHMuaXNJblN1Ym5ldCA9IGlzSW5TdWJuZXQ7XG5mdW5jdGlvbiBpc0NvcnJlY3QoZGVmYXVsdEJpdHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5hZGRyZXNzTWludXNTdWZmaXggIT09IHRoaXMuY29ycmVjdEZvcm0oKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN1Ym5ldE1hc2sgPT09IGRlZmF1bHRCaXRzICYmICF0aGlzLnBhcnNlZFN1Ym5ldCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkU3VibmV0ID09PSBTdHJpbmcodGhpcy5zdWJuZXRNYXNrKTtcbiAgICB9O1xufVxuZXhwb3J0cy5pc0NvcnJlY3QgPSBpc0NvcnJlY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21tb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudjYgPSBleHBvcnRzLkFkZHJlc3NFcnJvciA9IGV4cG9ydHMuQWRkcmVzczYgPSBleHBvcnRzLkFkZHJlc3M0ID0gdm9pZCAwO1xuY29uc3QgaXB2NF8xID0gcmVxdWlyZShcIi4vaXB2NFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkFkZHJlc3M0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBpcHY0XzEuQWRkcmVzczQ7IH0gfSk7XG5jb25zdCBpcHY2XzEgPSByZXF1aXJlKFwiLi9pcHY2XCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQWRkcmVzczZcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGlwdjZfMS5BZGRyZXNzNjsgfSB9KTtcbmNvbnN0IGFkZHJlc3NfZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2FkZHJlc3MtZXJyb3JcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBZGRyZXNzRXJyb3JcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3I7IH0gfSk7XG5jb25zdCBoZWxwZXJzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Y2L2hlbHBlcnNcIikpO1xuZXhwb3J0cy52NiA9IHsgaGVscGVycyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXAtYWRkcmVzcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQWRkcmVzczQgPSB2b2lkIDA7XG5jb25zdCBjb21tb24gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vY29tbW9uXCIpKTtcbmNvbnN0IGNvbnN0YW50cyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi92NC9jb25zdGFudHNcIikpO1xuY29uc3QgYWRkcmVzc19lcnJvcl8xID0gcmVxdWlyZShcIi4vYWRkcmVzcy1lcnJvclwiKTtcbmNvbnN0IGpzYm5fMSA9IHJlcXVpcmUoXCJqc2JuXCIpO1xuY29uc3Qgc3ByaW50Zl9qc18xID0gcmVxdWlyZShcInNwcmludGYtanNcIik7XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gSVB2NCBhZGRyZXNzXG4gKiBAY2xhc3MgQWRkcmVzczRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gQW4gSVB2NCBhZGRyZXNzIHN0cmluZ1xuICovXG5jbGFzcyBBZGRyZXNzNCB7XG4gICAgY29uc3RydWN0b3IoYWRkcmVzcykge1xuICAgICAgICB0aGlzLmdyb3VwcyA9IGNvbnN0YW50cy5HUk9VUFM7XG4gICAgICAgIHRoaXMucGFyc2VkQWRkcmVzcyA9IFtdO1xuICAgICAgICB0aGlzLnBhcnNlZFN1Ym5ldCA9ICcnO1xuICAgICAgICB0aGlzLnN1Ym5ldCA9ICcvMzInO1xuICAgICAgICB0aGlzLnN1Ym5ldE1hc2sgPSAzMjtcbiAgICAgICAgdGhpcy52NCA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgY29ycmVjdCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQ29ycmVjdCA9IGNvbW1vbi5pc0NvcnJlY3QoY29uc3RhbnRzLkJJVFMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBhZGRyZXNzIGlzIGluIHRoZSBzdWJuZXQgb2YgdGhlIGN1cnJlbnQgYWRkcmVzc1xuICAgICAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0luU3VibmV0ID0gY29tbW9uLmlzSW5TdWJuZXQ7XG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgICAgIGNvbnN0IHN1Ym5ldCA9IGNvbnN0YW50cy5SRV9TVUJORVRfU1RSSU5HLmV4ZWMoYWRkcmVzcyk7XG4gICAgICAgIGlmIChzdWJuZXQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkU3VibmV0ID0gc3VibmV0WzBdLnJlcGxhY2UoJy8nLCAnJyk7XG4gICAgICAgICAgICB0aGlzLnN1Ym5ldE1hc2sgPSBwYXJzZUludCh0aGlzLnBhcnNlZFN1Ym5ldCwgMTApO1xuICAgICAgICAgICAgdGhpcy5zdWJuZXQgPSBgLyR7dGhpcy5zdWJuZXRNYXNrfWA7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJuZXRNYXNrIDwgMCB8fCB0aGlzLnN1Ym5ldE1hc2sgPiBjb25zdGFudHMuQklUUykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKCdJbnZhbGlkIHN1Ym5ldCBtYXNrLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MucmVwbGFjZShjb25zdGFudHMuUkVfU1VCTkVUX1NUUklORywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkcmVzc01pbnVzU3VmZml4ID0gYWRkcmVzcztcbiAgICAgICAgdGhpcy5wYXJzZWRBZGRyZXNzID0gdGhpcy5wYXJzZShhZGRyZXNzKTtcbiAgICB9XG4gICAgc3RhdGljIGlzVmFsaWQoYWRkcmVzcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgICAgICAgICAgbmV3IEFkZHJlc3M0KGFkZHJlc3MpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKlxuICAgICAqIFBhcnNlcyBhIHY0IGFkZHJlc3NcbiAgICAgKi9cbiAgICBwYXJzZShhZGRyZXNzKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IGFkZHJlc3Muc3BsaXQoJy4nKTtcbiAgICAgICAgaWYgKCFhZGRyZXNzLm1hdGNoKGNvbnN0YW50cy5SRV9BRERSRVNTKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoJ0ludmFsaWQgSVB2NCBhZGRyZXNzLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBncm91cHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvcnJlY3QgZm9ybSBvZiBhbiBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBjb3JyZWN0Rm9ybSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkQWRkcmVzcy5tYXAoKHBhcnQpID0+IHBhcnNlSW50KHBhcnQsIDEwKSkuam9pbignLicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIGhleCBzdHJpbmcgdG8gYW4gSVB2NCBhZGRyZXNzIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaGV4IC0gYSBoZXggc3RyaW5nIHRvIGNvbnZlcnRcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczR9XG4gICAgICovXG4gICAgc3RhdGljIGZyb21IZXgoaGV4KSB7XG4gICAgICAgIGNvbnN0IHBhZGRlZCA9IGhleC5yZXBsYWNlKC86L2csICcnKS5wYWRTdGFydCg4LCAnMCcpO1xuICAgICAgICBjb25zdCBncm91cHMgPSBbXTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGggPSBwYWRkZWQuc2xpY2UoaSwgaSArIDIpO1xuICAgICAgICAgICAgZ3JvdXBzLnB1c2gocGFyc2VJbnQoaCwgMTYpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFkZHJlc3M0KGdyb3Vwcy5qb2luKCcuJykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbiBpbnRlZ2VyIGludG8gYSBJUHY0IGFkZHJlc3Mgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaW50ZWdlciAtIGEgbnVtYmVyIHRvIGNvbnZlcnRcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczR9XG4gICAgICovXG4gICAgc3RhdGljIGZyb21JbnRlZ2VyKGludGVnZXIpIHtcbiAgICAgICAgcmV0dXJuIEFkZHJlc3M0LmZyb21IZXgoaW50ZWdlci50b1N0cmluZygxNikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gYWRkcmVzcyBmcm9tIGluLWFkZHIuYXJwYSBmb3JtXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcnBhRm9ybUFkZHJlc3MgLSBhbiAnaW4tYWRkci5hcnBhJyBmb3JtIGlwdjQgYWRkcmVzc1xuICAgICAqIEByZXR1cm5zIHtBZHJlc3M0fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFkZHJlc3MgPSBBZGRyZXNzNC5mcm9tQXJwYSg0Mi4yLjAuMTkyLmluLWFkZHIuYXJwYS4pXG4gICAgICogYWRkcmVzcy5jb3JyZWN0Rm9ybSgpOyAvLyAnMTkyLjAuMi40MidcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUFycGEoYXJwYUZvcm1BZGRyZXNzKSB7XG4gICAgICAgIC8vIHJlbW92ZSBlbmRpbmcgXCIuaW4tYWRkci5hcnBhLlwiIG9yIGp1c3QgXCIuXCJcbiAgICAgICAgY29uc3QgbGVhZGVyID0gYXJwYUZvcm1BZGRyZXNzLnJlcGxhY2UoLyhcXC5pbi1hZGRyXFwuYXJwYSk/XFwuJC8sICcnKTtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IGxlYWRlci5zcGxpdCgnLicpLnJldmVyc2UoKS5qb2luKCcuJyk7XG4gICAgICAgIHJldHVybiBuZXcgQWRkcmVzczQoYWRkcmVzcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIElQdjQgYWRkcmVzcyBvYmplY3QgdG8gYSBoZXggc3RyaW5nXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICB0b0hleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkQWRkcmVzcy5tYXAoKHBhcnQpID0+ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyUwMngnLCBwYXJzZUludChwYXJ0LCAxMCkpKS5qb2luKCc6Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIElQdjQgYWRkcmVzcyBvYmplY3QgdG8gYW4gYXJyYXkgb2YgYnl0ZXNcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgdG9BcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkQWRkcmVzcy5tYXAoKHBhcnQpID0+IHBhcnNlSW50KHBhcnQsIDEwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIElQdjQgYWRkcmVzcyBvYmplY3QgdG8gYW4gSVB2NiBhZGRyZXNzIGdyb3VwXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICB0b0dyb3VwNigpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gW107XG4gICAgICAgIGxldCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RhbnRzLkdST1VQUzsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCBoZXggPSAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclMDJ4JTAyeCcsIHBhcnNlSW50KHRoaXMucGFyc2VkQWRkcmVzc1tpXSwgMTApLCBwYXJzZUludCh0aGlzLnBhcnNlZEFkZHJlc3NbaSArIDFdLCAxMCkpO1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXgnLCBwYXJzZUludChoZXgsIDE2KSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQuam9pbignOicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIGFzIGEgQmlnSW50ZWdlclxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtCaWdJbnRlZ2VyfVxuICAgICAqL1xuICAgIGJpZ0ludGVnZXIoKSB7XG4gICAgICAgIHJldHVybiBuZXcganNibl8xLkJpZ0ludGVnZXIodGhpcy5wYXJzZWRBZGRyZXNzLm1hcCgobikgPT4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJTAyeCcsIHBhcnNlSW50KG4sIDEwKSkpLmpvaW4oJycpLCAxNik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiBnZXR0aW5nIHN0YXJ0IGFkZHJlc3MuXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0JpZ0ludGVnZXJ9XG4gICAgICovXG4gICAgX3N0YXJ0QWRkcmVzcygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBqc2JuXzEuQmlnSW50ZWdlcih0aGlzLm1hc2soKSArICcwJy5yZXBlYXQoY29uc3RhbnRzLkJJVFMgLSB0aGlzLnN1Ym5ldE1hc2spLCAyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IGFkZHJlc3MgaW4gdGhlIHJhbmdlIGdpdmVuIGJ5IHRoaXMgYWRkcmVzcycgc3VibmV0LlxuICAgICAqIE9mdGVuIHJlZmVycmVkIHRvIGFzIHRoZSBOZXR3b3JrIEFkZHJlc3MuXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M0fVxuICAgICAqL1xuICAgIHN0YXJ0QWRkcmVzcygpIHtcbiAgICAgICAgcmV0dXJuIEFkZHJlc3M0LmZyb21CaWdJbnRlZ2VyKHRoaXMuX3N0YXJ0QWRkcmVzcygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IGhvc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJ3Mgc3VibmV0IGllXG4gICAgICogdGhlIGZpcnN0IGFkZHJlc3MgYWZ0ZXIgdGhlIE5ldHdvcmsgQWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNH1cbiAgICAgKi9cbiAgICBzdGFydEFkZHJlc3NFeGNsdXNpdmUoKSB7XG4gICAgICAgIGNvbnN0IGFkanVzdCA9IG5ldyBqc2JuXzEuQmlnSW50ZWdlcignMScpO1xuICAgICAgICByZXR1cm4gQWRkcmVzczQuZnJvbUJpZ0ludGVnZXIodGhpcy5fc3RhcnRBZGRyZXNzKCkuYWRkKGFkanVzdCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZ2V0dGluZyBlbmQgYWRkcmVzcy5cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QmlnSW50ZWdlcn1cbiAgICAgKi9cbiAgICBfZW5kQWRkcmVzcygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBqc2JuXzEuQmlnSW50ZWdlcih0aGlzLm1hc2soKSArICcxJy5yZXBlYXQoY29uc3RhbnRzLkJJVFMgLSB0aGlzLnN1Ym5ldE1hc2spLCAyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJyBzdWJuZXRcbiAgICAgKiBPZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgQnJvYWRjYXN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M0fVxuICAgICAqL1xuICAgIGVuZEFkZHJlc3MoKSB7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNC5mcm9tQmlnSW50ZWdlcih0aGlzLl9lbmRBZGRyZXNzKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBob3N0IGFkZHJlc3MgaW4gdGhlIHJhbmdlIGdpdmVuIGJ5IHRoaXMgYWRkcmVzcydzIHN1Ym5ldCBpZVxuICAgICAqIHRoZSBsYXN0IGFkZHJlc3MgcHJpb3IgdG8gdGhlIEJyb2FkY2FzdCBBZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M0fVxuICAgICAqL1xuICAgIGVuZEFkZHJlc3NFeGNsdXNpdmUoKSB7XG4gICAgICAgIGNvbnN0IGFkanVzdCA9IG5ldyBqc2JuXzEuQmlnSW50ZWdlcignMScpO1xuICAgICAgICByZXR1cm4gQWRkcmVzczQuZnJvbUJpZ0ludGVnZXIodGhpcy5fZW5kQWRkcmVzcygpLnN1YnRyYWN0KGFkanVzdCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIEJpZ0ludGVnZXIgdG8gYSB2NCBhZGRyZXNzIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge0JpZ0ludGVnZXJ9IGJpZ0ludGVnZXIgLSBhIEJpZ0ludGVnZXIgdG8gY29udmVydFxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUJpZ0ludGVnZXIoYmlnSW50ZWdlcikge1xuICAgICAgICByZXR1cm4gQWRkcmVzczQuZnJvbUludGVnZXIocGFyc2VJbnQoYmlnSW50ZWdlci50b1N0cmluZygpLCAxMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBuIGJpdHMgb2YgdGhlIGFkZHJlc3MsIGRlZmF1bHRpbmcgdG8gdGhlXG4gICAgICogc3VibmV0IG1hc2tcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIG1hc2sobWFzaykge1xuICAgICAgICBpZiAobWFzayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtYXNrID0gdGhpcy5zdWJuZXRNYXNrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJpdHNCYXNlMigwLCBtYXNrKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYml0cyBpbiB0aGUgZ2l2ZW4gcmFuZ2UgYXMgYSBiYXNlLTIgc3RyaW5nXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRCaXRzQmFzZTIoc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5hcnlaZXJvUGFkKCkuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgcmV2ZXJzZWQgaXA2LmFycGEgZm9ybSBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLm9taXRTdWZmaXggLSBvbWl0IHRoZSBcImluLWFkZHIuYXJwYVwiIHN1ZmZpeFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgcmV2ZXJzZUZvcm0ob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXZlcnNlZCA9IHRoaXMuY29ycmVjdEZvcm0oKS5zcGxpdCgnLicpLnJldmVyc2UoKS5qb2luKCcuJyk7XG4gICAgICAgIGlmIChvcHRpb25zLm9taXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXZlcnNlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXMuaW4tYWRkci5hcnBhLicsIHJldmVyc2VkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBhZGRyZXNzIGlzIGEgbXVsdGljYXN0IGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc011bHRpY2FzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJblN1Ym5ldChuZXcgQWRkcmVzczQoJzIyNC4wLjAuMC80JykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgemVyby1wYWRkZWQgYmFzZS0yIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgYmluYXJ5WmVyb1BhZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlnSW50ZWdlcigpLnRvU3RyaW5nKDIpLnBhZFN0YXJ0KGNvbnN0YW50cy5CSVRTLCAnMCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHcm91cHMgYW4gSVB2NCBhZGRyZXNzIGZvciBpbmNsdXNpb24gYXQgdGhlIGVuZCBvZiBhbiBJUHY2IGFkZHJlc3NcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdyb3VwRm9yVjYoKSB7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5wYXJzZWRBZGRyZXNzO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzLnJlcGxhY2UoY29uc3RhbnRzLlJFX0FERFJFU1MsICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJzxzcGFuIGNsYXNzPVwiaG92ZXItZ3JvdXAgZ3JvdXAtdjQgZ3JvdXAtNlwiPiVzPC9zcGFuPi48c3BhbiBjbGFzcz1cImhvdmVyLWdyb3VwIGdyb3VwLXY0IGdyb3VwLTdcIj4lczwvc3Bhbj4nLCBzZWdtZW50cy5zbGljZSgwLCAyKS5qb2luKCcuJyksIHNlZ21lbnRzLnNsaWNlKDIsIDQpLmpvaW4oJy4nKSkpO1xuICAgIH1cbn1cbmV4cG9ydHMuQWRkcmVzczQgPSBBZGRyZXNzNDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlwdjQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItZGVzdHJ1Y3R1cmluZyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BZGRyZXNzNiA9IHZvaWQgMDtcbmNvbnN0IGNvbW1vbiA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb21tb25cIikpO1xuY29uc3QgY29uc3RhbnRzNCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi92NC9jb25zdGFudHNcIikpO1xuY29uc3QgY29uc3RhbnRzNiA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi92Ni9jb25zdGFudHNcIikpO1xuY29uc3QgaGVscGVycyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi92Ni9oZWxwZXJzXCIpKTtcbmNvbnN0IGlwdjRfMSA9IHJlcXVpcmUoXCIuL2lwdjRcIik7XG5jb25zdCByZWd1bGFyX2V4cHJlc3Npb25zXzEgPSByZXF1aXJlKFwiLi92Ni9yZWd1bGFyLWV4cHJlc3Npb25zXCIpO1xuY29uc3QgYWRkcmVzc19lcnJvcl8xID0gcmVxdWlyZShcIi4vYWRkcmVzcy1lcnJvclwiKTtcbmNvbnN0IGpzYm5fMSA9IHJlcXVpcmUoXCJqc2JuXCIpO1xuY29uc3Qgc3ByaW50Zl9qc18xID0gcmVxdWlyZShcInNwcmludGYtanNcIik7XG5mdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uKSB7XG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3NlcnRpb24gZmFpbGVkLicpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZENvbW1hcyhudW1iZXIpIHtcbiAgICBjb25zdCByID0gLyhcXGQrKShcXGR7M30pLztcbiAgICB3aGlsZSAoci50ZXN0KG51bWJlcikpIHtcbiAgICAgICAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UociwgJyQxLCQyJyk7XG4gICAgfVxuICAgIHJldHVybiBudW1iZXI7XG59XG5mdW5jdGlvbiBzcGFuTGVhZGluZ1plcm9lczQobikge1xuICAgIG4gPSBuLnJlcGxhY2UoL14oMHsxLH0pKFsxLTldKykkLywgJzxzcGFuIGNsYXNzPVwicGFyc2UtZXJyb3JcIj4kMTwvc3Bhbj4kMicpO1xuICAgIG4gPSBuLnJlcGxhY2UoL14oMHsxLH0pKDApJC8sICc8c3BhbiBjbGFzcz1cInBhcnNlLWVycm9yXCI+JDE8L3NwYW4+JDInKTtcbiAgICByZXR1cm4gbjtcbn1cbi8qXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjb21wYWN0IGFuIGFycmF5XG4gKi9cbmZ1bmN0aW9uIGNvbXBhY3QoYWRkcmVzcywgc2xpY2UpIHtcbiAgICBjb25zdCBzMSA9IFtdO1xuICAgIGNvbnN0IHMyID0gW107XG4gICAgbGV0IGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGFkZHJlc3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPCBzbGljZVswXSkge1xuICAgICAgICAgICAgczEucHVzaChhZGRyZXNzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpID4gc2xpY2VbMV0pIHtcbiAgICAgICAgICAgIHMyLnB1c2goYWRkcmVzc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHMxLmNvbmNhdChbJ2NvbXBhY3QnXSkuY29uY2F0KHMyKTtcbn1cbmZ1bmN0aW9uIHBhZGRlZEhleChvY3RldCkge1xuICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclMDR4JywgcGFyc2VJbnQob2N0ZXQsIDE2KSk7XG59XG5mdW5jdGlvbiB1bnNpZ25CeXRlKGIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIHJldHVybiBiICYgMHhmZjtcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhbiBJUHY2IGFkZHJlc3NcbiAqIEBjbGFzcyBBZGRyZXNzNlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSBBbiBJUHY2IGFkZHJlc3Mgc3RyaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gW2dyb3Vwcz04XSAtIEhvdyBtYW55IG9jdGV0cyB0byBwYXJzZVxuICogQGV4YW1wbGVcbiAqIHZhciBhZGRyZXNzID0gbmV3IEFkZHJlc3M2KCcyMDAxOjovMzInKTtcbiAqL1xuY2xhc3MgQWRkcmVzczYge1xuICAgIGNvbnN0cnVjdG9yKGFkZHJlc3MsIG9wdGlvbmFsR3JvdXBzKSB7XG4gICAgICAgIHRoaXMuYWRkcmVzc01pbnVzU3VmZml4ID0gJyc7XG4gICAgICAgIHRoaXMucGFyc2VkU3VibmV0ID0gJyc7XG4gICAgICAgIHRoaXMuc3VibmV0ID0gJy8xMjgnO1xuICAgICAgICB0aGlzLnN1Ym5ldE1hc2sgPSAxMjg7XG4gICAgICAgIHRoaXMudjQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy56b25lID0gJyc7XG4gICAgICAgIC8vICNyZWdpb24gQXR0cmlidXRlc1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBhZGRyZXNzIGlzIGluIHRoZSBzdWJuZXQgb2YgdGhlIGN1cnJlbnQgYWRkcmVzc1xuICAgICAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0luU3VibmV0ID0gY29tbW9uLmlzSW5TdWJuZXQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgY29ycmVjdCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQ29ycmVjdCA9IGNvbW1vbi5pc0NvcnJlY3QoY29uc3RhbnRzNi5CSVRTKTtcbiAgICAgICAgaWYgKG9wdGlvbmFsR3JvdXBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzID0gY29uc3RhbnRzNi5HUk9VUFM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwcyA9IG9wdGlvbmFsR3JvdXBzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgICAgIGNvbnN0IHN1Ym5ldCA9IGNvbnN0YW50czYuUkVfU1VCTkVUX1NUUklORy5leGVjKGFkZHJlc3MpO1xuICAgICAgICBpZiAoc3VibmV0KSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZFN1Ym5ldCA9IHN1Ym5ldFswXS5yZXBsYWNlKCcvJywgJycpO1xuICAgICAgICAgICAgdGhpcy5zdWJuZXRNYXNrID0gcGFyc2VJbnQodGhpcy5wYXJzZWRTdWJuZXQsIDEwKTtcbiAgICAgICAgICAgIHRoaXMuc3VibmV0ID0gYC8ke3RoaXMuc3VibmV0TWFza31gO1xuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTih0aGlzLnN1Ym5ldE1hc2spIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJuZXRNYXNrIDwgMCB8fFxuICAgICAgICAgICAgICAgIHRoaXMuc3VibmV0TWFzayA+IGNvbnN0YW50czYuQklUUykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKCdJbnZhbGlkIHN1Ym5ldCBtYXNrLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MucmVwbGFjZShjb25zdGFudHM2LlJFX1NVQk5FVF9TVFJJTkcsICcnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgvXFwvLy50ZXN0KGFkZHJlc3MpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcignSW52YWxpZCBzdWJuZXQgbWFzay4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB6b25lID0gY29uc3RhbnRzNi5SRV9aT05FX1NUUklORy5leGVjKGFkZHJlc3MpO1xuICAgICAgICBpZiAoem9uZSkge1xuICAgICAgICAgICAgdGhpcy56b25lID0gem9uZVswXTtcbiAgICAgICAgICAgIGFkZHJlc3MgPSBhZGRyZXNzLnJlcGxhY2UoY29uc3RhbnRzNi5SRV9aT05FX1NUUklORywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkcmVzc01pbnVzU3VmZml4ID0gYWRkcmVzcztcbiAgICAgICAgdGhpcy5wYXJzZWRBZGRyZXNzID0gdGhpcy5wYXJzZSh0aGlzLmFkZHJlc3NNaW51c1N1ZmZpeCk7XG4gICAgfVxuICAgIHN0YXRpYyBpc1ZhbGlkKGFkZHJlc3MpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXdcbiAgICAgICAgICAgIG5ldyBBZGRyZXNzNihhZGRyZXNzKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIEJpZ0ludGVnZXIgdG8gYSB2NiBhZGRyZXNzIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge0JpZ0ludGVnZXJ9IGJpZ0ludGVnZXIgLSBhIEJpZ0ludGVnZXIgdG8gY29udmVydFxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNn1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBiaWdJbnRlZ2VyID0gbmV3IEJpZ0ludGVnZXIoJzEwMDAwMDAwMDAwMDAnKTtcbiAgICAgKiB2YXIgYWRkcmVzcyA9IEFkZHJlc3M2LmZyb21CaWdJbnRlZ2VyKGJpZ0ludGVnZXIpO1xuICAgICAqIGFkZHJlc3MuY29ycmVjdEZvcm0oKTsgLy8gJzo6ZTg6ZDRhNToxMDAwJ1xuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tQmlnSW50ZWdlcihiaWdJbnRlZ2VyKSB7XG4gICAgICAgIGNvbnN0IGhleCA9IGJpZ0ludGVnZXIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDMyLCAnMCcpO1xuICAgICAgICBjb25zdCBncm91cHMgPSBbXTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25zdGFudHM2LkdST1VQUzsgaSsrKSB7XG4gICAgICAgICAgICBncm91cHMucHVzaChoZXguc2xpY2UoaSAqIDQsIChpICsgMSkgKiA0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBZGRyZXNzNihncm91cHMuam9pbignOicpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIFVSTCAod2l0aCBvcHRpb25hbCBwb3J0IG51bWJlcikgdG8gYW4gYWRkcmVzcyBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIGEgVVJMIHdpdGggb3B0aW9uYWwgcG9ydCBudW1iZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBhZGRyZXNzQW5kUG9ydCA9IEFkZHJlc3M2LmZyb21VUkwoJ2h0dHA6Ly9bZmZmZjo6XTo4MDgwL2Zvby8nKTtcbiAgICAgKiBhZGRyZXNzQW5kUG9ydC5hZGRyZXNzLmNvcnJlY3RGb3JtKCk7IC8vICdmZmZmOjonXG4gICAgICogYWRkcmVzc0FuZFBvcnQucG9ydDsgLy8gODA4MFxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tVVJMKHVybCkge1xuICAgICAgICBsZXQgaG9zdDtcbiAgICAgICAgbGV0IHBvcnQgPSBudWxsO1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGJyYWNrZXRzIHBhcnNlIHRoZW0gYW5kIGZpbmQgYSBwb3J0XG4gICAgICAgIGlmICh1cmwuaW5kZXhPZignWycpICE9PSAtMSAmJiB1cmwuaW5kZXhPZignXTonKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbnN0YW50czYuUkVfVVJMX1dJVEhfUE9SVC5leGVjKHVybCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6ICdmYWlsZWQgdG8gcGFyc2UgYWRkcmVzcyB3aXRoIHBvcnQnLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBob3N0ID0gcmVzdWx0WzFdO1xuICAgICAgICAgICAgcG9ydCA9IHJlc3VsdFsyXTtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSBVUkwgZXh0cmFjdCB0aGUgYWRkcmVzc1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVybC5pbmRleE9mKCcvJykgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHByb3RvY29sIHByZWZpeFxuICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoL15bYS16MC05XSs6XFwvXFwvLywgJycpO1xuICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGFkZHJlc3NcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbnN0YW50czYuUkVfVVJMLmV4ZWModXJsKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcjogJ2ZhaWxlZCB0byBwYXJzZSBhZGRyZXNzIGZyb20gVVJMJyxcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcG9ydDogbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaG9zdCA9IHJlc3VsdFsxXTtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBqdXN0IGFzc2lnbiB0aGUgVVJMIHRvIHRoZSBob3N0IGFuZCBsZXQgdGhlIGxpYnJhcnkgcGFyc2UgaXRcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhvc3QgPSB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUncyBhIHBvcnQgY29udmVydCBpdCB0byBhbiBpbnRlZ2VyXG4gICAgICAgIGlmIChwb3J0KSB7XG4gICAgICAgICAgICBwb3J0ID0gcGFyc2VJbnQocG9ydCwgMTApO1xuICAgICAgICAgICAgLy8gc3F1ZWxjaCBvdXQgb2YgcmFuZ2UgcG9ydHNcbiAgICAgICAgICAgIGlmIChwb3J0IDwgMCB8fCBwb3J0ID4gNjU1MzYpIHtcbiAgICAgICAgICAgICAgICBwb3J0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFN0YW5kYXJkaXplIGB1bmRlZmluZWRgIHRvIGBudWxsYFxuICAgICAgICAgICAgcG9ydCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IG5ldyBBZGRyZXNzNihob3N0KSxcbiAgICAgICAgICAgIHBvcnQsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBJUHY2LW1hcHBlZCBhZGRyZXNzIGdpdmVuIGFuIElQdjQgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIEFuIElQdjQgYWRkcmVzcyBzdHJpbmdcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgYWRkcmVzcyA9IEFkZHJlc3M2LmZyb21BZGRyZXNzNCgnMTkyLjE2OC4wLjEnKTtcbiAgICAgKiBhZGRyZXNzLmNvcnJlY3RGb3JtKCk7IC8vICc6OmZmZmY6YzBhODoxJ1xuICAgICAqIGFkZHJlc3MudG80aW42KCk7IC8vICc6OmZmZmY6MTkyLjE2OC4wLjEnXG4gICAgICovXG4gICAgc3RhdGljIGZyb21BZGRyZXNzNChhZGRyZXNzKSB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3M0ID0gbmV3IGlwdjRfMS5BZGRyZXNzNChhZGRyZXNzKTtcbiAgICAgICAgY29uc3QgbWFzazYgPSBjb25zdGFudHM2LkJJVFMgLSAoY29uc3RhbnRzNC5CSVRTIC0gYWRkcmVzczQuc3VibmV0TWFzayk7XG4gICAgICAgIHJldHVybiBuZXcgQWRkcmVzczYoYDo6ZmZmZjoke2FkZHJlc3M0LmNvcnJlY3RGb3JtKCl9LyR7bWFzazZ9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBhZGRyZXNzIGZyb20gaXA2LmFycGEgZm9ybVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXJwYUZvcm1BZGRyZXNzIC0gYW4gJ2lwNi5hcnBhJyBmb3JtIGFkZHJlc3NcbiAgICAgKiBAcmV0dXJucyB7QWRyZXNzNn1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBhZGRyZXNzID0gQWRkcmVzczYuZnJvbUFycGEoZS5mLmYuZi4zLmMuMi42LmYuZi5mLmUuNi42LjguZS4xLjAuNi43LjkuNC5lLmMuMC4wLjAuMC4xLjAuMC4yLmlwNi5hcnBhLilcbiAgICAgKiBhZGRyZXNzLmNvcnJlY3RGb3JtKCk7IC8vICcyMDAxOjA6Y2U0OTo3NjAxOmU4NjY6ZWZmZjo2MmMzOmZmZmUnXG4gICAgICovXG4gICAgc3RhdGljIGZyb21BcnBhKGFycGFGb3JtQWRkcmVzcykge1xuICAgICAgICAvLyByZW1vdmUgZW5kaW5nIFwiLmlwNi5hcnBhLlwiIG9yIGp1c3QgXCIuXCJcbiAgICAgICAgbGV0IGFkZHJlc3MgPSBhcnBhRm9ybUFkZHJlc3MucmVwbGFjZSgvKFxcLmlwNlxcLmFycGEpP1xcLiQvLCAnJyk7XG4gICAgICAgIGNvbnN0IHNlbWljb2xvbkFtb3VudCA9IDc7XG4gICAgICAgIC8vIGNvcnJlY3QgaXA2LmFycGEgZm9ybSB3aXRoIGVuZGluZyByZW1vdmVkIHdpbGwgYmUgNjMgY2hhcmFjdGVyc1xuICAgICAgICBpZiAoYWRkcmVzcy5sZW5ndGggIT09IDYzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcihcIkludmFsaWQgJ2lwNi5hcnBhJyBmb3JtLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGFkZHJlc3Muc3BsaXQoJy4nKS5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzZW1pY29sb25BbW91bnQ7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gaSAqIDQ7XG4gICAgICAgICAgICBwYXJ0cy5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsICc6Jyk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzcyA9IHBhcnRzLmpvaW4oJycpO1xuICAgICAgICByZXR1cm4gbmV3IEFkZHJlc3M2KGFkZHJlc3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIE1pY3Jvc29mdCBVTkMgdHJhbnNjcmlwdGlvbiBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBNaWNyb3NvZnQgVU5DIHRyYW5zY3JpcHRpb24gb2YgdGhlIGFkZHJlc3NcbiAgICAgKi9cbiAgICBtaWNyb3NvZnRUcmFuc2NyaXB0aW9uKCkge1xuICAgICAgICByZXR1cm4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXMuaXB2Ni1saXRlcmFsLm5ldCcsIHRoaXMuY29ycmVjdEZvcm0oKS5yZXBsYWNlKC86L2csICctJykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGZpcnN0IG4gYml0cyBvZiB0aGUgYWRkcmVzcywgZGVmYXVsdGluZyB0byB0aGUgc3VibmV0IG1hc2tcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW21hc2s9c3VibmV0XSAtIHRoZSBudW1iZXIgb2YgYml0cyB0byBtYXNrXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIGZpcnN0IG4gYml0cyBvZiB0aGUgYWRkcmVzcyBhcyBhIHN0cmluZ1xuICAgICAqL1xuICAgIG1hc2sobWFzayA9IHRoaXMuc3VibmV0TWFzaykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCaXRzQmFzZTIoMCwgbWFzayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHN1Ym5ldHMgb2YgYSBnaXZlbiBzaXplIGluIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTEyOF0gLSB0aGUgc3VibmV0IHNpemVcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIC8vIFRPRE86IHByb2JhYmx5IHVzZWZ1bCB0byBoYXZlIGEgbnVtZXJpYyB2ZXJzaW9uIG9mIHRoaXMgdG9vXG4gICAgcG9zc2libGVTdWJuZXRzKHN1Ym5ldFNpemUgPSAxMjgpIHtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlQml0cyA9IGNvbnN0YW50czYuQklUUyAtIHRoaXMuc3VibmV0TWFzaztcbiAgICAgICAgY29uc3Qgc3VibmV0Qml0cyA9IE1hdGguYWJzKHN1Ym5ldFNpemUgLSBjb25zdGFudHM2LkJJVFMpO1xuICAgICAgICBjb25zdCBzdWJuZXRQb3dlcnMgPSBhdmFpbGFibGVCaXRzIC0gc3VibmV0Qml0cztcbiAgICAgICAgaWYgKHN1Ym5ldFBvd2VycyA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnMCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZENvbW1hcyhuZXcganNibl8xLkJpZ0ludGVnZXIoJzInLCAxMCkucG93KHN1Ym5ldFBvd2VycykudG9TdHJpbmcoMTApKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIGdldHRpbmcgc3RhcnQgYWRkcmVzcy5cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QmlnSW50ZWdlcn1cbiAgICAgKi9cbiAgICBfc3RhcnRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKHRoaXMubWFzaygpICsgJzAnLnJlcGVhdChjb25zdGFudHM2LkJJVFMgLSB0aGlzLnN1Ym5ldE1hc2spLCAyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IGFkZHJlc3MgaW4gdGhlIHJhbmdlIGdpdmVuIGJ5IHRoaXMgYWRkcmVzcycgc3VibmV0XG4gICAgICogT2Z0ZW4gcmVmZXJyZWQgdG8gYXMgdGhlIE5ldHdvcmsgQWRkcmVzcy5cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICovXG4gICAgc3RhcnRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gQWRkcmVzczYuZnJvbUJpZ0ludGVnZXIodGhpcy5fc3RhcnRBZGRyZXNzKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZmlyc3QgaG9zdCBhZGRyZXNzIGluIHRoZSByYW5nZSBnaXZlbiBieSB0aGlzIGFkZHJlc3MncyBzdWJuZXQgaWVcbiAgICAgKiB0aGUgZmlyc3QgYWRkcmVzcyBhZnRlciB0aGUgTmV0d29yayBBZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M2fVxuICAgICAqL1xuICAgIHN0YXJ0QWRkcmVzc0V4Y2x1c2l2ZSgpIHtcbiAgICAgICAgY29uc3QgYWRqdXN0ID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcxJyk7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNi5mcm9tQmlnSW50ZWdlcih0aGlzLl9zdGFydEFkZHJlc3MoKS5hZGQoYWRqdXN0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiBnZXR0aW5nIGVuZCBhZGRyZXNzLlxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtCaWdJbnRlZ2VyfVxuICAgICAqL1xuICAgIF9lbmRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKHRoaXMubWFzaygpICsgJzEnLnJlcGVhdChjb25zdGFudHM2LkJJVFMgLSB0aGlzLnN1Ym5ldE1hc2spLCAyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJyBzdWJuZXRcbiAgICAgKiBPZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgQnJvYWRjYXN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M2fVxuICAgICAqL1xuICAgIGVuZEFkZHJlc3MoKSB7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNi5mcm9tQmlnSW50ZWdlcih0aGlzLl9lbmRBZGRyZXNzKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBob3N0IGFkZHJlc3MgaW4gdGhlIHJhbmdlIGdpdmVuIGJ5IHRoaXMgYWRkcmVzcydzIHN1Ym5ldCBpZVxuICAgICAqIHRoZSBsYXN0IGFkZHJlc3MgcHJpb3IgdG8gdGhlIEJyb2FkY2FzdCBBZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M2fVxuICAgICAqL1xuICAgIGVuZEFkZHJlc3NFeGNsdXNpdmUoKSB7XG4gICAgICAgIGNvbnN0IGFkanVzdCA9IG5ldyBqc2JuXzEuQmlnSW50ZWdlcignMScpO1xuICAgICAgICByZXR1cm4gQWRkcmVzczYuZnJvbUJpZ0ludGVnZXIodGhpcy5fZW5kQWRkcmVzcygpLnN1YnRyYWN0KGFkanVzdCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHNjb3BlIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRTY29wZSgpIHtcbiAgICAgICAgbGV0IHNjb3BlID0gY29uc3RhbnRzNi5TQ09QRVNbdGhpcy5nZXRCaXRzKDEyLCAxNikuaW50VmFsdWUoKV07XG4gICAgICAgIGlmICh0aGlzLmdldFR5cGUoKSA9PT0gJ0dsb2JhbCB1bmljYXN0JyAmJiBzY29wZSAhPT0gJ0xpbmsgbG9jYWwnKSB7XG4gICAgICAgICAgICBzY29wZSA9ICdHbG9iYWwnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY29wZSB8fCAnVW5rbm93bic7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0VHlwZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzdWJuZXQgb2YgT2JqZWN0LmtleXMoY29uc3RhbnRzNi5UWVBFUykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5TdWJuZXQobmV3IEFkZHJlc3M2KHN1Ym5ldCkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0YW50czYuVFlQRVNbc3VibmV0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ0dsb2JhbCB1bmljYXN0JztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBiaXRzIGluIHRoZSBnaXZlbiByYW5nZSBhcyBhIEJpZ0ludGVnZXJcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QmlnSW50ZWdlcn1cbiAgICAgKi9cbiAgICBnZXRCaXRzKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBqc2JuXzEuQmlnSW50ZWdlcih0aGlzLmdldEJpdHNCYXNlMihzdGFydCwgZW5kKSwgMik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYml0cyBpbiB0aGUgZ2l2ZW4gcmFuZ2UgYXMgYSBiYXNlLTIgc3RyaW5nXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRCaXRzQmFzZTIoc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5hcnlaZXJvUGFkKCkuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYml0cyBpbiB0aGUgZ2l2ZW4gcmFuZ2UgYXMgYSBiYXNlLTE2IHN0cmluZ1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0Qml0c0Jhc2UxNihzdGFydCwgZW5kKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGVuZCAtIHN0YXJ0O1xuICAgICAgICBpZiAobGVuZ3RoICUgNCAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMZW5ndGggb2YgYml0cyB0byByZXRyaWV2ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSBmb3VyJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qml0cyhzdGFydCwgZW5kKVxuICAgICAgICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgLnBhZFN0YXJ0KGxlbmd0aCAvIDQsICcwJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYml0cyB0aGF0IGFyZSBzZXQgcGFzdCB0aGUgc3VibmV0IG1hc2sgbGVuZ3RoXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRCaXRzUGFzdFN1Ym5ldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qml0c0Jhc2UyKHRoaXMuc3VibmV0TWFzaywgY29uc3RhbnRzNi5CSVRTKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSByZXZlcnNlZCBpcDYuYXJwYSBmb3JtIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMub21pdFN1ZmZpeCAtIG9taXQgdGhlIFwiaXA2LmFycGFcIiBzdWZmaXhcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHJldmVyc2VGb3JtKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hhcmFjdGVycyA9IE1hdGguZmxvb3IodGhpcy5zdWJuZXRNYXNrIC8gNCk7XG4gICAgICAgIGNvbnN0IHJldmVyc2VkID0gdGhpcy5jYW5vbmljYWxGb3JtKClcbiAgICAgICAgICAgIC5yZXBsYWNlKC86L2csICcnKVxuICAgICAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAgICAgLnNsaWNlKDAsIGNoYXJhY3RlcnMpXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAuam9pbignLicpO1xuICAgICAgICBpZiAoY2hhcmFjdGVycyA+IDApIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm9taXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV2ZXJzZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXMuaXA2LmFycGEuJywgcmV2ZXJzZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLm9taXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2lwNi5hcnBhLic7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY29ycmVjdCBmb3JtIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBjb3JyZWN0Rm9ybSgpIHtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGxldCBncm91cHMgPSBbXTtcbiAgICAgICAgbGV0IHplcm9Db3VudGVyID0gMDtcbiAgICAgICAgY29uc3QgemVyb2VzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnBhcnNlZEFkZHJlc3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQodGhpcy5wYXJzZWRBZGRyZXNzW2ldLCAxNik7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB6ZXJvQ291bnRlcisrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSAwICYmIHplcm9Db3VudGVyID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICh6ZXJvQ291bnRlciA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgemVyb2VzLnB1c2goW2kgLSB6ZXJvQ291bnRlciwgaSAtIDFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgemVyb0NvdW50ZXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIERvIHdlIGVuZCB3aXRoIGEgc3RyaW5nIG9mIHplcm9lcz9cbiAgICAgICAgaWYgKHplcm9Db3VudGVyID4gMSkge1xuICAgICAgICAgICAgemVyb2VzLnB1c2goW3RoaXMucGFyc2VkQWRkcmVzcy5sZW5ndGggLSB6ZXJvQ291bnRlciwgdGhpcy5wYXJzZWRBZGRyZXNzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB6ZXJvTGVuZ3RocyA9IHplcm9lcy5tYXAoKG4pID0+IG5bMV0gLSBuWzBdICsgMSk7XG4gICAgICAgIGlmICh6ZXJvZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB6ZXJvTGVuZ3Rocy5pbmRleE9mKE1hdGgubWF4KC4uLnplcm9MZW5ndGhzKSk7XG4gICAgICAgICAgICBncm91cHMgPSBjb21wYWN0KHRoaXMucGFyc2VkQWRkcmVzcywgemVyb2VzW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBncm91cHMgPSB0aGlzLnBhcnNlZEFkZHJlc3M7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGdyb3Vwc1tpXSAhPT0gJ2NvbXBhY3QnKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzW2ldID0gcGFyc2VJbnQoZ3JvdXBzW2ldLCAxNikudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBjb3JyZWN0ID0gZ3JvdXBzLmpvaW4oJzonKTtcbiAgICAgICAgY29ycmVjdCA9IGNvcnJlY3QucmVwbGFjZSgvXmNvbXBhY3QkLywgJzo6Jyk7XG4gICAgICAgIGNvcnJlY3QgPSBjb3JyZWN0LnJlcGxhY2UoL15jb21wYWN0fGNvbXBhY3QkLywgJzonKTtcbiAgICAgICAgY29ycmVjdCA9IGNvcnJlY3QucmVwbGFjZSgvY29tcGFjdC8sICcnKTtcbiAgICAgICAgcmV0dXJuIGNvcnJlY3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHplcm8tcGFkZGVkIGJhc2UtMiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFkZHJlc3MgPSBuZXcgQWRkcmVzczYoJzIwMDE6NDg2MDo0MDAxOjgwMzo6MTAxMScpO1xuICAgICAqIGFkZHJlc3MuYmluYXJ5WmVyb1BhZCgpO1xuICAgICAqIC8vICcwMDEwMDAwMDAwMDAwMDAxMDEwMDEwMDAwMTEwMDAwMDAxMDAwMDAwMDAwMDAwMDEwMDAwMTAwMDAwMDAwMDExXG4gICAgICogLy8gIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMTAwMDEnXG4gICAgICovXG4gICAgYmluYXJ5WmVyb1BhZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlnSW50ZWdlcigpLnRvU3RyaW5nKDIpLnBhZFN0YXJ0KGNvbnN0YW50czYuQklUUywgJzAnKTtcbiAgICB9XG4gICAgLy8gVE9ETzogSW1wcm92ZSB0aGUgc2VtYW50aWNzIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uXG4gICAgcGFyc2U0aW42KGFkZHJlc3MpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gYWRkcmVzcy5zcGxpdCgnOicpO1xuICAgICAgICBjb25zdCBsYXN0R3JvdXAgPSBncm91cHMuc2xpY2UoLTEpWzBdO1xuICAgICAgICBjb25zdCBhZGRyZXNzNCA9IGxhc3RHcm91cC5tYXRjaChjb25zdGFudHM0LlJFX0FERFJFU1MpO1xuICAgICAgICBpZiAoYWRkcmVzczQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkQWRkcmVzczQgPSBhZGRyZXNzNFswXTtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzczQgPSBuZXcgaXB2NF8xLkFkZHJlc3M0KHRoaXMucGFyc2VkQWRkcmVzczQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFkZHJlc3M0Lmdyb3VwczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKC9eMFswLTldKy8udGVzdCh0aGlzLmFkZHJlc3M0LnBhcnNlZEFkZHJlc3NbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKFwiSVB2NCBhZGRyZXNzZXMgY2FuJ3QgaGF2ZSBsZWFkaW5nIHplcm9lcy5cIiwgYWRkcmVzcy5yZXBsYWNlKGNvbnN0YW50czQuUkVfQUREUkVTUywgdGhpcy5hZGRyZXNzNC5wYXJzZWRBZGRyZXNzLm1hcChzcGFuTGVhZGluZ1plcm9lczQpLmpvaW4oJy4nKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudjQgPSB0cnVlO1xuICAgICAgICAgICAgZ3JvdXBzW2dyb3Vwcy5sZW5ndGggLSAxXSA9IHRoaXMuYWRkcmVzczQudG9Hcm91cDYoKTtcbiAgICAgICAgICAgIGFkZHJlc3MgPSBncm91cHMuam9pbignOicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgIH1cbiAgICAvLyBUT0RPOiBNYWtlIHByaXZhdGU/XG4gICAgcGFyc2UoYWRkcmVzcykge1xuICAgICAgICBhZGRyZXNzID0gdGhpcy5wYXJzZTRpbjYoYWRkcmVzcyk7XG4gICAgICAgIGNvbnN0IGJhZENoYXJhY3RlcnMgPSBhZGRyZXNzLm1hdGNoKGNvbnN0YW50czYuUkVfQkFEX0NIQVJBQ1RFUlMpO1xuICAgICAgICBpZiAoYmFkQ2hhcmFjdGVycykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnQmFkIGNoYXJhY3RlciVzIGRldGVjdGVkIGluIGFkZHJlc3M6ICVzJywgYmFkQ2hhcmFjdGVycy5sZW5ndGggPiAxID8gJ3MnIDogJycsIGJhZENoYXJhY3RlcnMuam9pbignJykpLCBhZGRyZXNzLnJlcGxhY2UoY29uc3RhbnRzNi5SRV9CQURfQ0hBUkFDVEVSUywgJzxzcGFuIGNsYXNzPVwicGFyc2UtZXJyb3JcIj4kMTwvc3Bhbj4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFkQWRkcmVzcyA9IGFkZHJlc3MubWF0Y2goY29uc3RhbnRzNi5SRV9CQURfQUREUkVTUyk7XG4gICAgICAgIGlmIChiYWRBZGRyZXNzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcigoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCdBZGRyZXNzIGZhaWxlZCByZWdleDogJXMnLCBiYWRBZGRyZXNzLmpvaW4oJycpKSwgYWRkcmVzcy5yZXBsYWNlKGNvbnN0YW50czYuUkVfQkFEX0FERFJFU1MsICc8c3BhbiBjbGFzcz1cInBhcnNlLWVycm9yXCI+JDE8L3NwYW4+JykpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBncm91cHMgPSBbXTtcbiAgICAgICAgY29uc3QgaGFsdmVzID0gYWRkcmVzcy5zcGxpdCgnOjonKTtcbiAgICAgICAgaWYgKGhhbHZlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IGhhbHZlc1swXS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBoYWx2ZXNbMV0uc3BsaXQoJzonKTtcbiAgICAgICAgICAgIGlmIChmaXJzdC5sZW5ndGggPT09IDEgJiYgZmlyc3RbMF0gPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgZmlyc3QgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsYXN0Lmxlbmd0aCA9PT0gMSAmJiBsYXN0WzBdID09PSAnJykge1xuICAgICAgICAgICAgICAgIGxhc3QgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMuZ3JvdXBzIC0gKGZpcnN0Lmxlbmd0aCArIGxhc3QubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmICghcmVtYWluaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoJ0Vycm9yIHBhcnNpbmcgZ3JvdXBzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVsaWRlZEdyb3VwcyA9IHJlbWFpbmluZztcbiAgICAgICAgICAgIHRoaXMuZWxpc2lvbkJlZ2luID0gZmlyc3QubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5lbGlzaW9uRW5kID0gZmlyc3QubGVuZ3RoICsgdGhpcy5lbGlkZWRHcm91cHM7XG4gICAgICAgICAgICBncm91cHMgPSBncm91cHMuY29uY2F0KGZpcnN0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtYWluaW5nOyBpKyspIHtcbiAgICAgICAgICAgICAgICBncm91cHMucHVzaCgnMCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JvdXBzID0gZ3JvdXBzLmNvbmNhdChsYXN0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChoYWx2ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBncm91cHMgPSBhZGRyZXNzLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICB0aGlzLmVsaWRlZEdyb3VwcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcignVG9vIG1hbnkgOjogZ3JvdXBzIGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXBzID0gZ3JvdXBzLm1hcCgoZ3JvdXApID0+ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyV4JywgcGFyc2VJbnQoZ3JvdXAsIDE2KSkpO1xuICAgICAgICBpZiAoZ3JvdXBzLmxlbmd0aCAhPT0gdGhpcy5ncm91cHMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKCdJbmNvcnJlY3QgbnVtYmVyIG9mIGdyb3VwcyBmb3VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBncm91cHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY2Fub25pY2FsIGZvcm0gb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGNhbm9uaWNhbEZvcm0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlZEFkZHJlc3MubWFwKHBhZGRlZEhleCkuam9pbignOicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGRlY2ltYWwgZm9ybSBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgZGVjaW1hbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkQWRkcmVzcy5tYXAoKG4pID0+ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyUwNWQnLCBwYXJzZUludChuLCAxNikpKS5qb2luKCc6Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYWRkcmVzcyBhcyBhIEJpZ0ludGVnZXJcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QmlnSW50ZWdlcn1cbiAgICAgKi9cbiAgICBiaWdJbnRlZ2VyKCkge1xuICAgICAgICByZXR1cm4gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKHRoaXMucGFyc2VkQWRkcmVzcy5tYXAocGFkZGVkSGV4KS5qb2luKCcnKSwgMTYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGxhc3QgdHdvIGdyb3VwcyBvZiB0aGlzIGFkZHJlc3MgYXMgYW4gSVB2NCBhZGRyZXNzIHN0cmluZ1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBhZGRyZXNzID0gbmV3IEFkZHJlc3M2KCcyMDAxOjQ4NjA6NDAwMTo6MTgyNTpiZjExJyk7XG4gICAgICogYWRkcmVzcy50bzQoKS5jb3JyZWN0Rm9ybSgpOyAvLyAnMjQuMzcuMTkxLjE3J1xuICAgICAqL1xuICAgIHRvNCgpIHtcbiAgICAgICAgY29uc3QgYmluYXJ5ID0gdGhpcy5iaW5hcnlaZXJvUGFkKCkuc3BsaXQoJycpO1xuICAgICAgICByZXR1cm4gaXB2NF8xLkFkZHJlc3M0LmZyb21IZXgobmV3IGpzYm5fMS5CaWdJbnRlZ2VyKGJpbmFyeS5zbGljZSg5NiwgMTI4KS5qb2luKCcnKSwgMikudG9TdHJpbmcoMTYpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSB2NC1pbi12NiBmb3JtIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICB0bzRpbjYoKSB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3M0ID0gdGhpcy50bzQoKTtcbiAgICAgICAgY29uc3QgYWRkcmVzczYgPSBuZXcgQWRkcmVzczYodGhpcy5wYXJzZWRBZGRyZXNzLnNsaWNlKDAsIDYpLmpvaW4oJzonKSwgNik7XG4gICAgICAgIGNvbnN0IGNvcnJlY3QgPSBhZGRyZXNzNi5jb3JyZWN0Rm9ybSgpO1xuICAgICAgICBsZXQgaW5maXggPSAnJztcbiAgICAgICAgaWYgKCEvOiQvLnRlc3QoY29ycmVjdCkpIHtcbiAgICAgICAgICAgIGluZml4ID0gJzonO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3JyZWN0ICsgaW5maXggKyBhZGRyZXNzNC5hZGRyZXNzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIFRlcmVkbyBwcm9wZXJ0aWVzIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBpbnNwZWN0VGVyZWRvKCkge1xuICAgICAgICAvKlxuICAgICAgICAtIEJpdHMgMCB0byAzMSBhcmUgc2V0IHRvIHRoZSBUZXJlZG8gcHJlZml4IChub3JtYWxseSAyMDAxOjAwMDA6Oi8zMikuXG4gICAgICAgIC0gQml0cyAzMiB0byA2MyBlbWJlZCB0aGUgcHJpbWFyeSBJUHY0IGFkZHJlc3Mgb2YgdGhlIFRlcmVkbyBzZXJ2ZXIgdGhhdFxuICAgICAgICAgIGlzIHVzZWQuXG4gICAgICAgIC0gQml0cyA2NCB0byA3OSBjYW4gYmUgdXNlZCB0byBkZWZpbmUgc29tZSBmbGFncy4gQ3VycmVudGx5IG9ubHkgdGhlXG4gICAgICAgICAgaGlnaGVyIG9yZGVyIGJpdCBpcyB1c2VkOyBpdCBpcyBzZXQgdG8gMSBpZiB0aGUgVGVyZWRvIGNsaWVudCBpc1xuICAgICAgICAgIGxvY2F0ZWQgYmVoaW5kIGEgY29uZSBOQVQsIDAgb3RoZXJ3aXNlLiBGb3IgTWljcm9zb2Z0J3MgV2luZG93cyBWaXN0YVxuICAgICAgICAgIGFuZCBXaW5kb3dzIFNlcnZlciAyMDA4IGltcGxlbWVudGF0aW9ucywgbW9yZSBiaXRzIGFyZSB1c2VkLiBJbiB0aG9zZVxuICAgICAgICAgIGltcGxlbWVudGF0aW9ucywgdGhlIGZvcm1hdCBmb3IgdGhlc2UgMTYgYml0cyBpcyBcIkNSQUFBQVVHIEFBQUFBQUFBXCIsXG4gICAgICAgICAgd2hlcmUgXCJDXCIgcmVtYWlucyB0aGUgXCJDb25lXCIgZmxhZy4gVGhlIFwiUlwiIGJpdCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlXG4gICAgICAgICAgdXNlLiBUaGUgXCJVXCIgYml0IGlzIGZvciB0aGUgVW5pdmVyc2FsL0xvY2FsIGZsYWcgKHNldCB0byAwKS4gVGhlIFwiR1wiIGJpdFxuICAgICAgICAgIGlzIEluZGl2aWR1YWwvR3JvdXAgZmxhZyAoc2V0IHRvIDApLiBUaGUgQSBiaXRzIGFyZSBzZXQgdG8gYSAxMi1iaXRcbiAgICAgICAgICByYW5kb21seSBnZW5lcmF0ZWQgbnVtYmVyIGNob3NlbiBieSB0aGUgVGVyZWRvIGNsaWVudCB0byBpbnRyb2R1Y2VcbiAgICAgICAgICBhZGRpdGlvbmFsIHByb3RlY3Rpb24gZm9yIHRoZSBUZXJlZG8gbm9kZSBhZ2FpbnN0IElQdjYtYmFzZWQgc2Nhbm5pbmdcbiAgICAgICAgICBhdHRhY2tzLlxuICAgICAgICAtIEJpdHMgODAgdG8gOTUgY29udGFpbnMgdGhlIG9iZnVzY2F0ZWQgVURQIHBvcnQgbnVtYmVyLiBUaGlzIGlzIHRoZVxuICAgICAgICAgIHBvcnQgbnVtYmVyIHRoYXQgaXMgbWFwcGVkIGJ5IHRoZSBOQVQgdG8gdGhlIFRlcmVkbyBjbGllbnQgd2l0aCBhbGxcbiAgICAgICAgICBiaXRzIGludmVydGVkLlxuICAgICAgICAtIEJpdHMgOTYgdG8gMTI3IGNvbnRhaW5zIHRoZSBvYmZ1c2NhdGVkIElQdjQgYWRkcmVzcy4gVGhpcyBpcyB0aGVcbiAgICAgICAgICBwdWJsaWMgSVB2NCBhZGRyZXNzIG9mIHRoZSBOQVQgd2l0aCBhbGwgYml0cyBpbnZlcnRlZC5cbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy5nZXRCaXRzQmFzZTE2KDAsIDMyKTtcbiAgICAgICAgY29uc3QgdWRwUG9ydCA9IHRoaXMuZ2V0Qml0cyg4MCwgOTYpLnhvcihuZXcganNibl8xLkJpZ0ludGVnZXIoJ2ZmZmYnLCAxNikpLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHNlcnZlcjQgPSBpcHY0XzEuQWRkcmVzczQuZnJvbUhleCh0aGlzLmdldEJpdHNCYXNlMTYoMzIsIDY0KSk7XG4gICAgICAgIGNvbnN0IGNsaWVudDQgPSBpcHY0XzEuQWRkcmVzczQuZnJvbUhleCh0aGlzLmdldEJpdHMoOTYsIDEyOCkueG9yKG5ldyBqc2JuXzEuQmlnSW50ZWdlcignZmZmZmZmZmYnLCAxNikpLnRvU3RyaW5nKDE2KSk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gdGhpcy5nZXRCaXRzKDY0LCA4MCk7XG4gICAgICAgIGNvbnN0IGZsYWdzQmFzZTIgPSB0aGlzLmdldEJpdHNCYXNlMig2NCwgODApO1xuICAgICAgICBjb25zdCBjb25lTmF0ID0gZmxhZ3MudGVzdEJpdCgxNSk7XG4gICAgICAgIGNvbnN0IHJlc2VydmVkID0gZmxhZ3MudGVzdEJpdCgxNCk7XG4gICAgICAgIGNvbnN0IGdyb3VwSW5kaXZpZHVhbCA9IGZsYWdzLnRlc3RCaXQoOCk7XG4gICAgICAgIGNvbnN0IHVuaXZlcnNhbExvY2FsID0gZmxhZ3MudGVzdEJpdCg5KTtcbiAgICAgICAgY29uc3Qgbm9uY2UgPSBuZXcganNibl8xLkJpZ0ludGVnZXIoZmxhZ3NCYXNlMi5zbGljZSgyLCA2KSArIGZsYWdzQmFzZTIuc2xpY2UoOCwgMTYpLCAyKS50b1N0cmluZygxMCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcmVmaXg6ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyVzOiVzJywgcHJlZml4LnNsaWNlKDAsIDQpLCBwcmVmaXguc2xpY2UoNCwgOCkpLFxuICAgICAgICAgICAgc2VydmVyNDogc2VydmVyNC5hZGRyZXNzLFxuICAgICAgICAgICAgY2xpZW50NDogY2xpZW50NC5hZGRyZXNzLFxuICAgICAgICAgICAgZmxhZ3M6IGZsYWdzQmFzZTIsXG4gICAgICAgICAgICBjb25lTmF0LFxuICAgICAgICAgICAgbWljcm9zb2Z0OiB7XG4gICAgICAgICAgICAgICAgcmVzZXJ2ZWQsXG4gICAgICAgICAgICAgICAgdW5pdmVyc2FsTG9jYWwsXG4gICAgICAgICAgICAgICAgZ3JvdXBJbmRpdmlkdWFsLFxuICAgICAgICAgICAgICAgIG5vbmNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVkcFBvcnQsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgNnRvNCBwcm9wZXJ0aWVzIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBpbnNwZWN0NnRvNCgpIHtcbiAgICAgICAgLypcbiAgICAgICAgLSBCaXRzIDAgdG8gMTUgYXJlIHNldCB0byB0aGUgNnRvNCBwcmVmaXggKDIwMDI6Oi8xNikuXG4gICAgICAgIC0gQml0cyAxNiB0byA0OCBlbWJlZCB0aGUgSVB2NCBhZGRyZXNzIG9mIHRoZSA2dG80IGdhdGV3YXkgdGhhdCBpcyB1c2VkLlxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLmdldEJpdHNCYXNlMTYoMCwgMTYpO1xuICAgICAgICBjb25zdCBnYXRld2F5ID0gaXB2NF8xLkFkZHJlc3M0LmZyb21IZXgodGhpcy5nZXRCaXRzQmFzZTE2KDE2LCA0OCkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJlZml4OiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclcycsIHByZWZpeC5zbGljZSgwLCA0KSksXG4gICAgICAgICAgICBnYXRld2F5OiBnYXRld2F5LmFkZHJlc3MsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHY2IDZ0bzQgYWRkcmVzcyBmcm9tIGEgdjYgdjRpbnY2IGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICovXG4gICAgdG82dG80KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXM0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFkZHI2dG80ID0gW1xuICAgICAgICAgICAgJzIwMDInLFxuICAgICAgICAgICAgdGhpcy5nZXRCaXRzQmFzZTE2KDk2LCAxMTIpLFxuICAgICAgICAgICAgdGhpcy5nZXRCaXRzQmFzZTE2KDExMiwgMTI4KSxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgJy8xNicsXG4gICAgICAgIF0uam9pbignOicpO1xuICAgICAgICByZXR1cm4gbmV3IEFkZHJlc3M2KGFkZHI2dG80KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgYnl0ZSBhcnJheVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICB0b0J5dGVBcnJheSgpIHtcbiAgICAgICAgY29uc3QgYnl0ZUFycmF5ID0gdGhpcy5iaWdJbnRlZ2VyKCkudG9CeXRlQXJyYXkoKTtcbiAgICAgICAgLy8gd29yayBhcm91bmQgaXNzdWUgd2hlcmUgYHRvQnl0ZUFycmF5YCByZXR1cm5zIGEgbGVhZGluZyAwIGVsZW1lbnRcbiAgICAgICAgaWYgKGJ5dGVBcnJheS5sZW5ndGggPT09IDE3ICYmIGJ5dGVBcnJheVswXSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ5dGVBcnJheS5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnl0ZUFycmF5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gdW5zaWduZWQgYnl0ZSBhcnJheVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICB0b1Vuc2lnbmVkQnl0ZUFycmF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b0J5dGVBcnJheSgpLm1hcCh1bnNpZ25CeXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIGJ5dGUgYXJyYXkgdG8gYW4gQWRkcmVzczYgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQHN0YXRpY1xuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUJ5dGVBcnJheShieXRlcykge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tVW5zaWduZWRCeXRlQXJyYXkoYnl0ZXMubWFwKHVuc2lnbkJ5dGUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhbiB1bnNpZ25lZCBieXRlIGFycmF5IHRvIGFuIEFkZHJlc3M2IG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICovXG4gICAgc3RhdGljIGZyb21VbnNpZ25lZEJ5dGVBcnJheShieXRlcykge1xuICAgICAgICBjb25zdCBCWVRFX01BWCA9IG5ldyBqc2JuXzEuQmlnSW50ZWdlcignMjU2JywgMTApO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcwJywgMTApO1xuICAgICAgICBsZXQgbXVsdGlwbGllciA9IG5ldyBqc2JuXzEuQmlnSW50ZWdlcignMScsIDEwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGJ5dGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuYWRkKG11bHRpcGxpZXIubXVsdGlwbHkobmV3IGpzYm5fMS5CaWdJbnRlZ2VyKGJ5dGVzW2ldLnRvU3RyaW5nKDEwKSwgMTApKSk7XG4gICAgICAgICAgICBtdWx0aXBsaWVyID0gbXVsdGlwbGllci5tdWx0aXBseShCWVRFX01BWCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFkZHJlc3M2LmZyb21CaWdJbnRlZ2VyKHJlc3VsdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBpbiB0aGUgY2Fub25pY2FsIGZvcm0sIGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzQ2Fub25pY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzTWludXNTdWZmaXggPT09IHRoaXMuY2Fub25pY2FsRm9ybSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBsaW5rIGxvY2FsIGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzTGlua0xvY2FsKCkge1xuICAgICAgICAvLyBaZXJvZXMgYXJlIHJlcXVpcmVkLCBpLmUuIHdlIGNhbid0IGNoZWNrIGlzSW5TdWJuZXQgd2l0aCAnZmU4MDo6LzEwJ1xuICAgICAgICBpZiAodGhpcy5nZXRCaXRzQmFzZTIoMCwgNjQpID09PVxuICAgICAgICAgICAgJzExMTExMTEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIG11bHRpY2FzdCBhZGRyZXNzLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc011bHRpY2FzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZSgpID09PSAnTXVsdGljYXN0JztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgdjQtaW4tdjYgYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXM0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52NDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgVGVyZWRvIGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzVGVyZWRvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0luU3VibmV0KG5ldyBBZGRyZXNzNignMjAwMTo6LzMyJykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSA2dG80IGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzNnRvNCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJblN1Ym5ldChuZXcgQWRkcmVzczYoJzIwMDI6Oi8xNicpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNMb29wYmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZSgpID09PSAnTG9vcGJhY2snO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uXG4gICAgLy8gI3JlZ2lvbiBIVE1MXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIGFkZHJlc3MgaW4gbGluayBmb3JtIHdpdGggYSBkZWZhdWx0IHBvcnQgb2YgODBcbiAgICAgKi9cbiAgICBocmVmKG9wdGlvbmFsUG9ydCkge1xuICAgICAgICBpZiAob3B0aW9uYWxQb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbmFsUG9ydCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9uYWxQb3J0ID0gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnOiVzJywgb3B0aW9uYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnaHR0cDovL1slc10lcy8nLCB0aGlzLmNvcnJlY3RGb3JtKCksIG9wdGlvbmFsUG9ydCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IGEgbGluayBzdWl0YWJsZSBmb3IgY29udmV5aW5nIHRoZSBhZGRyZXNzIHZpYSBhIFVSTCBoYXNoXG4gICAgICovXG4gICAgbGluayhvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNsYXNzTmFtZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLnByZWZpeCA9ICcvI2FkZHJlc3M9JztcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy52NCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLnY0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvcm1GdW5jdGlvbiA9IHRoaXMuY29ycmVjdEZvcm07XG4gICAgICAgIGlmIChvcHRpb25zLnY0KSB7XG4gICAgICAgICAgICBmb3JtRnVuY3Rpb24gPSB0aGlzLnRvNGluNjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCc8YSBocmVmPVwiJTEkcyUyJHNcIiBjbGFzcz1cIiUzJHNcIj4lMiRzPC9hPicsIG9wdGlvbnMucHJlZml4LCBmb3JtRnVuY3Rpb24uY2FsbCh0aGlzKSwgb3B0aW9ucy5jbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCc8YSBocmVmPVwiJTEkcyUyJHNcIj4lMiRzPC9hPicsIG9wdGlvbnMucHJlZml4LCBmb3JtRnVuY3Rpb24uY2FsbCh0aGlzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdyb3VwcyBhbiBhZGRyZXNzXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBncm91cCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxpZGVkR3JvdXBzID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGUgc2ltcGxlIGNhc2VcbiAgICAgICAgICAgIHJldHVybiBoZWxwZXJzLnNpbXBsZUdyb3VwKHRoaXMuYWRkcmVzcykuam9pbignOicpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydCh0eXBlb2YgdGhpcy5lbGlkZWRHcm91cHMgPT09ICdudW1iZXInKTtcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiB0aGlzLmVsaXNpb25CZWdpbiA9PT0gJ251bWJlcicpO1xuICAgICAgICAvLyBUaGUgZWxpZGVkIGNhc2VcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gW107XG4gICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSB0aGlzLmFkZHJlc3Muc3BsaXQoJzo6Jyk7XG4gICAgICAgIGlmIChsZWZ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goLi4uaGVscGVycy5zaW1wbGVHcm91cChsZWZ0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFsnaG92ZXItZ3JvdXAnXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuZWxpc2lvbkJlZ2luOyBpIDwgdGhpcy5lbGlzaW9uQmVnaW4gKyB0aGlzLmVsaWRlZEdyb3VwczsgaSsrKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnZ3JvdXAtJWQnLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0LnB1c2goKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnPHNwYW4gY2xhc3M9XCIlc1wiPjwvc3Bhbj4nLCBjbGFzc2VzLmpvaW4oJyAnKSkpO1xuICAgICAgICBpZiAocmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCguLi5oZWxwZXJzLnNpbXBsZUdyb3VwKHJpZ2h0LCB0aGlzLmVsaXNpb25FbmQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pczQoKSkge1xuICAgICAgICAgICAgYXNzZXJ0KHRoaXMuYWRkcmVzczQgaW5zdGFuY2VvZiBpcHY0XzEuQWRkcmVzczQpO1xuICAgICAgICAgICAgb3V0cHV0LnBvcCgpO1xuICAgICAgICAgICAgb3V0cHV0LnB1c2godGhpcy5hZGRyZXNzNC5ncm91cEZvclY2KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQuam9pbignOicpO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uXG4gICAgLy8gI3JlZ2lvbiBSZWd1bGFyIGV4cHJlc3Npb25zXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gZmluZCBvciB2YWxpZGF0ZVxuICAgICAqIGFsbCB2YXJpYXRpb25zIG9mIHRoaXMgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3Vic3RyaW5nU2VhcmNoXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICByZWd1bGFyRXhwcmVzc2lvblN0cmluZyhzdWJzdHJpbmdTZWFyY2ggPSBmYWxzZSkge1xuICAgICAgICBsZXQgb3V0cHV0ID0gW107XG4gICAgICAgIC8vIFRPRE86IHJldmlzaXQgd2h5IHRoaXMgaXMgbmVjZXNzYXJ5XG4gICAgICAgIGNvbnN0IGFkZHJlc3M2ID0gbmV3IEFkZHJlc3M2KHRoaXMuY29ycmVjdEZvcm0oKSk7XG4gICAgICAgIGlmIChhZGRyZXNzNi5lbGlkZWRHcm91cHMgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoZSBzaW1wbGUgY2FzZVxuICAgICAgICAgICAgb3V0cHV0LnB1c2goKDAsIHJlZ3VsYXJfZXhwcmVzc2lvbnNfMS5zaW1wbGVSZWd1bGFyRXhwcmVzc2lvbikoYWRkcmVzczYucGFyc2VkQWRkcmVzcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFkZHJlc3M2LmVsaWRlZEdyb3VwcyA9PT0gY29uc3RhbnRzNi5HUk9VUFMpIHtcbiAgICAgICAgICAgIC8vIEEgY29tcGxldGVseSBlbGlkZWQgYWRkcmVzc1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goKDAsIHJlZ3VsYXJfZXhwcmVzc2lvbnNfMS5wb3NzaWJsZUVsaXNpb25zKShjb25zdGFudHM2LkdST1VQUykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQSBwYXJ0aWFsbHkgZWxpZGVkIGFkZHJlc3NcbiAgICAgICAgICAgIGNvbnN0IGhhbHZlcyA9IGFkZHJlc3M2LmFkZHJlc3Muc3BsaXQoJzo6Jyk7XG4gICAgICAgICAgICBpZiAoaGFsdmVzWzBdLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCgwLCByZWd1bGFyX2V4cHJlc3Npb25zXzEuc2ltcGxlUmVndWxhckV4cHJlc3Npb24pKGhhbHZlc1swXS5zcGxpdCgnOicpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIGFkZHJlc3M2LmVsaWRlZEdyb3VwcyA9PT0gJ251bWJlcicpO1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goKDAsIHJlZ3VsYXJfZXhwcmVzc2lvbnNfMS5wb3NzaWJsZUVsaXNpb25zKShhZGRyZXNzNi5lbGlkZWRHcm91cHMsIGhhbHZlc1swXS5sZW5ndGggIT09IDAsIGhhbHZlc1sxXS5sZW5ndGggIT09IDApKTtcbiAgICAgICAgICAgIGlmIChoYWx2ZXNbMV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goKDAsIHJlZ3VsYXJfZXhwcmVzc2lvbnNfMS5zaW1wbGVSZWd1bGFyRXhwcmVzc2lvbikoaGFsdmVzWzFdLnNwbGl0KCc6JykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dCA9IFtvdXRwdXQuam9pbignOicpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN1YnN0cmluZ1NlYXJjaCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gW1xuICAgICAgICAgICAgICAgICcoPz1efCcsXG4gICAgICAgICAgICAgICAgcmVndWxhcl9leHByZXNzaW9uc18xLkFERFJFU1NfQk9VTkRBUlksXG4gICAgICAgICAgICAgICAgJ3xbXlxcXFx3XFxcXDpdKSgnLFxuICAgICAgICAgICAgICAgIC4uLm91dHB1dCxcbiAgICAgICAgICAgICAgICAnKSg/PVteXFxcXHdcXFxcOl18JyxcbiAgICAgICAgICAgICAgICByZWd1bGFyX2V4cHJlc3Npb25zXzEuQUREUkVTU19CT1VOREFSWSxcbiAgICAgICAgICAgICAgICAnfCQpJyxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBjYW4gYmUgdXNlZCB0byBmaW5kIG9yIHZhbGlkYXRlIGFsbFxuICAgICAqIHZhcmlhdGlvbnMgb2YgdGhpcyBhZGRyZXNzLlxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3Vic3RyaW5nU2VhcmNoXG4gICAgICogQHJldHVybnMge1JlZ0V4cH1cbiAgICAgKi9cbiAgICByZWd1bGFyRXhwcmVzc2lvbihzdWJzdHJpbmdTZWFyY2ggPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGlzLnJlZ3VsYXJFeHByZXNzaW9uU3RyaW5nKHN1YnN0cmluZ1NlYXJjaCksICdpJyk7XG4gICAgfVxufVxuZXhwb3J0cy5BZGRyZXNzNiA9IEFkZHJlc3M2O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXB2Ni5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUkVfU1VCTkVUX1NUUklORyA9IGV4cG9ydHMuUkVfQUREUkVTUyA9IGV4cG9ydHMuR1JPVVBTID0gZXhwb3J0cy5CSVRTID0gdm9pZCAwO1xuZXhwb3J0cy5CSVRTID0gMzI7XG5leHBvcnRzLkdST1VQUyA9IDQ7XG5leHBvcnRzLlJFX0FERFJFU1MgPSAvXigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pJC9nO1xuZXhwb3J0cy5SRV9TVUJORVRfU1RSSU5HID0gL1xcL1xcZHsxLDJ9JC87XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdGFudHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlJFX1VSTF9XSVRIX1BPUlQgPSBleHBvcnRzLlJFX1VSTCA9IGV4cG9ydHMuUkVfWk9ORV9TVFJJTkcgPSBleHBvcnRzLlJFX1NVQk5FVF9TVFJJTkcgPSBleHBvcnRzLlJFX0JBRF9BRERSRVNTID0gZXhwb3J0cy5SRV9CQURfQ0hBUkFDVEVSUyA9IGV4cG9ydHMuVFlQRVMgPSBleHBvcnRzLlNDT1BFUyA9IGV4cG9ydHMuR1JPVVBTID0gZXhwb3J0cy5CSVRTID0gdm9pZCAwO1xuZXhwb3J0cy5CSVRTID0gMTI4O1xuZXhwb3J0cy5HUk9VUFMgPSA4O1xuLyoqXG4gKiBSZXByZXNlbnRzIElQdjYgYWRkcmVzcyBzY29wZXNcbiAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICogQHN0YXRpY1xuICovXG5leHBvcnRzLlNDT1BFUyA9IHtcbiAgICAwOiAnUmVzZXJ2ZWQnLFxuICAgIDE6ICdJbnRlcmZhY2UgbG9jYWwnLFxuICAgIDI6ICdMaW5rIGxvY2FsJyxcbiAgICA0OiAnQWRtaW4gbG9jYWwnLFxuICAgIDU6ICdTaXRlIGxvY2FsJyxcbiAgICA4OiAnT3JnYW5pemF0aW9uIGxvY2FsJyxcbiAgICAxNDogJ0dsb2JhbCcsXG4gICAgMTU6ICdSZXNlcnZlZCcsXG59O1xuLyoqXG4gKiBSZXByZXNlbnRzIElQdjYgYWRkcmVzcyB0eXBlc1xuICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gKiBAc3RhdGljXG4gKi9cbmV4cG9ydHMuVFlQRVMgPSB7XG4gICAgJ2ZmMDE6OjEvMTI4JzogJ011bHRpY2FzdCAoQWxsIG5vZGVzIG9uIHRoaXMgaW50ZXJmYWNlKScsXG4gICAgJ2ZmMDE6OjIvMTI4JzogJ011bHRpY2FzdCAoQWxsIHJvdXRlcnMgb24gdGhpcyBpbnRlcmZhY2UpJyxcbiAgICAnZmYwMjo6MS8xMjgnOiAnTXVsdGljYXN0IChBbGwgbm9kZXMgb24gdGhpcyBsaW5rKScsXG4gICAgJ2ZmMDI6OjIvMTI4JzogJ011bHRpY2FzdCAoQWxsIHJvdXRlcnMgb24gdGhpcyBsaW5rKScsXG4gICAgJ2ZmMDU6OjIvMTI4JzogJ011bHRpY2FzdCAoQWxsIHJvdXRlcnMgaW4gdGhpcyBzaXRlKScsXG4gICAgJ2ZmMDI6OjUvMTI4JzogJ011bHRpY2FzdCAoT1NQRnYzIEFsbFNQRiByb3V0ZXJzKScsXG4gICAgJ2ZmMDI6OjYvMTI4JzogJ011bHRpY2FzdCAoT1NQRnYzIEFsbERSIHJvdXRlcnMpJyxcbiAgICAnZmYwMjo6OS8xMjgnOiAnTXVsdGljYXN0IChSSVAgcm91dGVycyknLFxuICAgICdmZjAyOjphLzEyOCc6ICdNdWx0aWNhc3QgKEVJR1JQIHJvdXRlcnMpJyxcbiAgICAnZmYwMjo6ZC8xMjgnOiAnTXVsdGljYXN0IChQSU0gcm91dGVycyknLFxuICAgICdmZjAyOjoxNi8xMjgnOiAnTXVsdGljYXN0IChNTER2MiByZXBvcnRzKScsXG4gICAgJ2ZmMDE6OmZiLzEyOCc6ICdNdWx0aWNhc3QgKG1ETlN2NiknLFxuICAgICdmZjAyOjpmYi8xMjgnOiAnTXVsdGljYXN0IChtRE5TdjYpJyxcbiAgICAnZmYwNTo6ZmIvMTI4JzogJ011bHRpY2FzdCAobUROU3Y2KScsXG4gICAgJ2ZmMDI6OjE6Mi8xMjgnOiAnTXVsdGljYXN0IChBbGwgREhDUCBzZXJ2ZXJzIGFuZCByZWxheSBhZ2VudHMgb24gdGhpcyBsaW5rKScsXG4gICAgJ2ZmMDU6OjE6Mi8xMjgnOiAnTXVsdGljYXN0IChBbGwgREhDUCBzZXJ2ZXJzIGFuZCByZWxheSBhZ2VudHMgaW4gdGhpcyBzaXRlKScsXG4gICAgJ2ZmMDI6OjE6My8xMjgnOiAnTXVsdGljYXN0IChBbGwgREhDUCBzZXJ2ZXJzIG9uIHRoaXMgbGluayknLFxuICAgICdmZjA1OjoxOjMvMTI4JzogJ011bHRpY2FzdCAoQWxsIERIQ1Agc2VydmVycyBpbiB0aGlzIHNpdGUpJyxcbiAgICAnOjovMTI4JzogJ1Vuc3BlY2lmaWVkJyxcbiAgICAnOjoxLzEyOCc6ICdMb29wYmFjaycsXG4gICAgJ2ZmMDA6Oi84JzogJ011bHRpY2FzdCcsXG4gICAgJ2ZlODA6Oi8xMCc6ICdMaW5rLWxvY2FsIHVuaWNhc3QnLFxufTtcbi8qKlxuICogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIGJhZCBjaGFyYWN0ZXJzIGluIGFuIElQdjYgYWRkcmVzc1xuICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gKiBAc3RhdGljXG4gKi9cbmV4cG9ydHMuUkVfQkFEX0NIQVJBQ1RFUlMgPSAvKFteMC05YS1mOi8lXSkvZ2k7XG4vKipcbiAqIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBhbiBpbmNvcnJlY3QgSVB2NiBhZGRyZXNzXG4gKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0cy5SRV9CQURfQUREUkVTUyA9IC8oWzAtOWEtZl17NSx9fDp7Myx9fFteOl06JHxeOlteOl18XFwvJCkvZ2k7XG4vKipcbiAqIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBhbiBJUHY2IHN1Ym5ldFxuICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gKiBAc3RhdGljXG4gKi9cbmV4cG9ydHMuUkVfU1VCTkVUX1NUUklORyA9IC9cXC9cXGR7MSwzfSg/PSV8JCkvO1xuLyoqXG4gKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgYW4gSVB2NiB6b25lXG4gKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0cy5SRV9aT05FX1NUUklORyA9IC8lLiokLztcbmV4cG9ydHMuUkVfVVJMID0gbmV3IFJlZ0V4cCgvXlxcW3swLDF9KFswLTlhLWY6XSspXFxdezAsMX0vKTtcbmV4cG9ydHMuUkVfVVJMX1dJVEhfUE9SVCA9IG5ldyBSZWdFeHAoL1xcWyhbMC05YS1mOl0rKVxcXTooWzAtOV17MSw1fSkvKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0YW50cy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc2ltcGxlR3JvdXAgPSBleHBvcnRzLnNwYW5MZWFkaW5nWmVyb2VzID0gZXhwb3J0cy5zcGFuQWxsID0gZXhwb3J0cy5zcGFuQWxsWmVyb2VzID0gdm9pZCAwO1xuY29uc3Qgc3ByaW50Zl9qc18xID0gcmVxdWlyZShcInNwcmludGYtanNcIik7XG4vKipcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBzdHJpbmcgd2l0aCBhbGwgemVyb2VzIGNvbnRhaW5lZCBpbiBhIDxzcGFuPlxuICovXG5mdW5jdGlvbiBzcGFuQWxsWmVyb2VzKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC8oMCspL2csICc8c3BhbiBjbGFzcz1cInplcm9cIj4kMTwvc3Bhbj4nKTtcbn1cbmV4cG9ydHMuc3BhbkFsbFplcm9lcyA9IHNwYW5BbGxaZXJvZXM7XG4vKipcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBzdHJpbmcgd2l0aCBlYWNoIGNoYXJhY3RlciBjb250YWluZWQgaW4gYSA8c3Bhbj5cbiAqL1xuZnVuY3Rpb24gc3BhbkFsbChzLCBvZmZzZXQgPSAwKSB7XG4gICAgY29uc3QgbGV0dGVycyA9IHMuc3BsaXQoJycpO1xuICAgIHJldHVybiBsZXR0ZXJzXG4gICAgICAgIC5tYXAoKG4sIGkpID0+ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJzxzcGFuIGNsYXNzPVwiZGlnaXQgdmFsdWUtJXMgcG9zaXRpb24tJWRcIj4lczwvc3Bhbj4nLCBuLCBpICsgb2Zmc2V0LCBzcGFuQWxsWmVyb2VzKG4pKSAvLyBYWFggVXNlICNiYXNlLTIgLnZhbHVlLTAgaW5zdGVhZD9cbiAgICApXG4gICAgICAgIC5qb2luKCcnKTtcbn1cbmV4cG9ydHMuc3BhbkFsbCA9IHNwYW5BbGw7XG5mdW5jdGlvbiBzcGFuTGVhZGluZ1plcm9lc1NpbXBsZShncm91cCkge1xuICAgIHJldHVybiBncm91cC5yZXBsYWNlKC9eKDArKS8sICc8c3BhbiBjbGFzcz1cInplcm9cIj4kMTwvc3Bhbj4nKTtcbn1cbi8qKlxuICogQHJldHVybnMge1N0cmluZ30gdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgemVyb2VzIGNvbnRhaW5lZCBpbiBhIDxzcGFuPlxuICovXG5mdW5jdGlvbiBzcGFuTGVhZGluZ1plcm9lcyhhZGRyZXNzKSB7XG4gICAgY29uc3QgZ3JvdXBzID0gYWRkcmVzcy5zcGxpdCgnOicpO1xuICAgIHJldHVybiBncm91cHMubWFwKChnKSA9PiBzcGFuTGVhZGluZ1plcm9lc1NpbXBsZShnKSkuam9pbignOicpO1xufVxuZXhwb3J0cy5zcGFuTGVhZGluZ1plcm9lcyA9IHNwYW5MZWFkaW5nWmVyb2VzO1xuLyoqXG4gKiBHcm91cHMgYW4gYWRkcmVzc1xuICogQHJldHVybnMge1N0cmluZ30gYSBncm91cGVkIGFkZHJlc3NcbiAqL1xuZnVuY3Rpb24gc2ltcGxlR3JvdXAoYWRkcmVzc1N0cmluZywgb2Zmc2V0ID0gMCkge1xuICAgIGNvbnN0IGdyb3VwcyA9IGFkZHJlc3NTdHJpbmcuc3BsaXQoJzonKTtcbiAgICByZXR1cm4gZ3JvdXBzLm1hcCgoZywgaSkgPT4ge1xuICAgICAgICBpZiAoL2dyb3VwLXY0Ly50ZXN0KGcpKSB7XG4gICAgICAgICAgICByZXR1cm4gZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnPHNwYW4gY2xhc3M9XCJob3Zlci1ncm91cCBncm91cC0lZFwiPiVzPC9zcGFuPicsIGkgKyBvZmZzZXQsIHNwYW5MZWFkaW5nWmVyb2VzU2ltcGxlKGcpKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc2ltcGxlR3JvdXAgPSBzaW1wbGVHcm91cDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhlbHBlcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucG9zc2libGVFbGlzaW9ucyA9IGV4cG9ydHMuc2ltcGxlUmVndWxhckV4cHJlc3Npb24gPSBleHBvcnRzLkFERFJFU1NfQk9VTkRBUlkgPSBleHBvcnRzLnBhZEdyb3VwID0gZXhwb3J0cy5ncm91cFBvc3NpYmlsaXRpZXMgPSB2b2lkIDA7XG5jb25zdCB2NiA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb25zdGFudHNcIikpO1xuY29uc3Qgc3ByaW50Zl9qc18xID0gcmVxdWlyZShcInNwcmludGYtanNcIik7XG5mdW5jdGlvbiBncm91cFBvc3NpYmlsaXRpZXMocG9zc2liaWxpdGllcykge1xuICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCcoJXMpJywgcG9zc2liaWxpdGllcy5qb2luKCd8JykpO1xufVxuZXhwb3J0cy5ncm91cFBvc3NpYmlsaXRpZXMgPSBncm91cFBvc3NpYmlsaXRpZXM7XG5mdW5jdGlvbiBwYWRHcm91cChncm91cCkge1xuICAgIGlmIChncm91cC5sZW5ndGggPCA0KSB7XG4gICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCcwezAsJWR9JXMnLCA0IC0gZ3JvdXAubGVuZ3RoLCBncm91cCk7XG4gICAgfVxuICAgIHJldHVybiBncm91cDtcbn1cbmV4cG9ydHMucGFkR3JvdXAgPSBwYWRHcm91cDtcbmV4cG9ydHMuQUREUkVTU19CT1VOREFSWSA9ICdbXkEtRmEtZjAtOTpdJztcbmZ1bmN0aW9uIHNpbXBsZVJlZ3VsYXJFeHByZXNzaW9uKGdyb3Vwcykge1xuICAgIGNvbnN0IHplcm9JbmRleGVzID0gW107XG4gICAgZ3JvdXBzLmZvckVhY2goKGdyb3VwLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwSW50ZWdlciA9IHBhcnNlSW50KGdyb3VwLCAxNik7XG4gICAgICAgIGlmIChncm91cEludGVnZXIgPT09IDApIHtcbiAgICAgICAgICAgIHplcm9JbmRleGVzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBZb3UgY2FuIHRlY2huaWNhbGx5IGVsaWRlIGEgc2luZ2xlIDAsIHRoaXMgY3JlYXRlcyB0aGUgcmVndWxhciBleHByZXNzaW9uc1xuICAgIC8vIHRvIG1hdGNoIHRoYXQgZXZlbnR1YWxpdHlcbiAgICBjb25zdCBwb3NzaWJpbGl0aWVzID0gemVyb0luZGV4ZXMubWFwKCh6ZXJvSW5kZXgpID0+IGdyb3Vwc1xuICAgICAgICAubWFwKChncm91cCwgaSkgPT4ge1xuICAgICAgICBpZiAoaSA9PT0gemVyb0luZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGlzaW9uID0gaSA9PT0gMCB8fCBpID09PSB2Ni5HUk9VUFMgLSAxID8gJzonIDogJyc7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXBQb3NzaWJpbGl0aWVzKFtwYWRHcm91cChncm91cCksIGVsaXNpb25dKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFkR3JvdXAoZ3JvdXApO1xuICAgIH0pXG4gICAgICAgIC5qb2luKCc6JykpO1xuICAgIC8vIFRoZSBzaW1wbGVzdCBjYXNlXG4gICAgcG9zc2liaWxpdGllcy5wdXNoKGdyb3Vwcy5tYXAocGFkR3JvdXApLmpvaW4oJzonKSk7XG4gICAgcmV0dXJuIGdyb3VwUG9zc2liaWxpdGllcyhwb3NzaWJpbGl0aWVzKTtcbn1cbmV4cG9ydHMuc2ltcGxlUmVndWxhckV4cHJlc3Npb24gPSBzaW1wbGVSZWd1bGFyRXhwcmVzc2lvbjtcbmZ1bmN0aW9uIHBvc3NpYmxlRWxpc2lvbnMoZWxpZGVkR3JvdXBzLCBtb3JlTGVmdCwgbW9yZVJpZ2h0KSB7XG4gICAgY29uc3QgbGVmdCA9IG1vcmVMZWZ0ID8gJycgOiAnOic7XG4gICAgY29uc3QgcmlnaHQgPSBtb3JlUmlnaHQgPyAnJyA6ICc6JztcbiAgICBjb25zdCBwb3NzaWJpbGl0aWVzID0gW107XG4gICAgLy8gMS4gZWxpc2lvbiBvZiBldmVyeXRoaW5nICg6OilcbiAgICBpZiAoIW1vcmVMZWZ0ICYmICFtb3JlUmlnaHQpIHtcbiAgICAgICAgcG9zc2liaWxpdGllcy5wdXNoKCc6OicpO1xuICAgIH1cbiAgICAvLyAyLiBjb21wbGV0ZSBlbGlzaW9uIG9mIHRoZSBtaWRkbGVcbiAgICBpZiAobW9yZUxlZnQgJiYgbW9yZVJpZ2h0KSB7XG4gICAgICAgIHBvc3NpYmlsaXRpZXMucHVzaCgnJyk7XG4gICAgfVxuICAgIGlmICgobW9yZVJpZ2h0ICYmICFtb3JlTGVmdCkgfHwgKCFtb3JlUmlnaHQgJiYgbW9yZUxlZnQpKSB7XG4gICAgICAgIC8vIDMuIGNvbXBsZXRlIGVsaXNpb24gb2Ygb25lIHNpZGVcbiAgICAgICAgcG9zc2liaWxpdGllcy5wdXNoKCc6Jyk7XG4gICAgfVxuICAgIC8vIDQuIGVsaXNpb24gZnJvbSB0aGUgbGVmdCBzaWRlXG4gICAgcG9zc2liaWxpdGllcy5wdXNoKCgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyVzKDowezEsNH0pezEsJWR9JywgbGVmdCwgZWxpZGVkR3JvdXBzIC0gMSkpO1xuICAgIC8vIDUuIGVsaXNpb24gZnJvbSB0aGUgcmlnaHQgc2lkZVxuICAgIHBvc3NpYmlsaXRpZXMucHVzaCgoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCcoMHsxLDR9Oil7MSwlZH0lcycsIGVsaWRlZEdyb3VwcyAtIDEsIHJpZ2h0KSk7XG4gICAgLy8gNi4gbm8gZWxpc2lvblxuICAgIHBvc3NpYmlsaXRpZXMucHVzaCgoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCcoMHsxLDR9Oil7JWR9MHsxLDR9JywgZWxpZGVkR3JvdXBzIC0gMSkpO1xuICAgIC8vIDcuIGVsaXNpb24gKGluY2x1ZGluZyBzbG9wcHkgZWxpc2lvbikgZnJvbSB0aGUgbWlkZGxlXG4gICAgZm9yIChsZXQgZ3JvdXBzID0gMTsgZ3JvdXBzIDwgZWxpZGVkR3JvdXBzIC0gMTsgZ3JvdXBzKyspIHtcbiAgICAgICAgZm9yIChsZXQgcG9zaXRpb24gPSAxOyBwb3NpdGlvbiA8IGVsaWRlZEdyb3VwcyAtIGdyb3VwczsgcG9zaXRpb24rKykge1xuICAgICAgICAgICAgcG9zc2liaWxpdGllcy5wdXNoKCgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJygwezEsNH06KXslZH06KDB7MSw0fTopeyVkfTB7MSw0fScsIHBvc2l0aW9uLCBlbGlkZWRHcm91cHMgLSBwb3NpdGlvbiAtIGdyb3VwcyAtIDEpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ3JvdXBQb3NzaWJpbGl0aWVzKHBvc3NpYmlsaXRpZXMpO1xufVxuZXhwb3J0cy5wb3NzaWJsZUVsaXNpb25zID0gcG9zc2libGVFbGlzaW9ucztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZ3VsYXItZXhwcmVzc2lvbnMuanMubWFwIiwiLyogZXNsaW50LWRpc2FibGUgeW9kYSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpc0Z1bGx3aWR0aENvZGVQb2ludCA9IGNvZGVQb2ludCA9PiB7XG5cdGlmIChOdW1iZXIuaXNOYU4oY29kZVBvaW50KSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIENvZGUgcG9pbnRzIGFyZSBkZXJpdmVkIGZyb206XG5cdC8vIGh0dHA6Ly93d3cudW5peC5vcmcvUHVibGljL1VOSURBVEEvRWFzdEFzaWFuV2lkdGgudHh0XG5cdGlmIChcblx0XHRjb2RlUG9pbnQgPj0gMHgxMTAwICYmIChcblx0XHRcdGNvZGVQb2ludCA8PSAweDExNUYgfHwgLy8gSGFuZ3VsIEphbW9cblx0XHRcdGNvZGVQb2ludCA9PT0gMHgyMzI5IHx8IC8vIExFRlQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVFxuXHRcdFx0Y29kZVBvaW50ID09PSAweDIzMkEgfHwgLy8gUklHSFQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVFxuXHRcdFx0Ly8gQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQgLi4gRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRoc1xuXHRcdFx0KDB4MkU4MCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MzI0NyAmJiBjb2RlUG9pbnQgIT09IDB4MzAzRikgfHxcblx0XHRcdC8vIEVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMgLi4gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQVxuXHRcdFx0KDB4MzI1MCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4NERCRikgfHxcblx0XHRcdC8vIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgLi4gWWkgUmFkaWNhbHNcblx0XHRcdCgweDRFMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEE0QzYpIHx8XG5cdFx0XHQvLyBIYW5ndWwgSmFtbyBFeHRlbmRlZC1BXG5cdFx0XHQoMHhBOTYwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhBOTdDKSB8fFxuXHRcdFx0Ly8gSGFuZ3VsIFN5bGxhYmxlc1xuXHRcdFx0KDB4QUMwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RDdBMykgfHxcblx0XHRcdC8vIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHNcblx0XHRcdCgweEY5MDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEZBRkYpIHx8XG5cdFx0XHQvLyBWZXJ0aWNhbCBGb3Jtc1xuXHRcdFx0KDB4RkUxMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkUxOSkgfHxcblx0XHRcdC8vIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zIC4uIFNtYWxsIEZvcm0gVmFyaWFudHNcblx0XHRcdCgweEZFMzAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEZFNkIpIHx8XG5cdFx0XHQvLyBIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3Jtc1xuXHRcdFx0KDB4RkYwMSA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkY2MCkgfHxcblx0XHRcdCgweEZGRTAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEZGRTYpIHx8XG5cdFx0XHQvLyBLYW5hIFN1cHBsZW1lbnRcblx0XHRcdCgweDFCMDAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgxQjAwMSkgfHxcblx0XHRcdC8vIEVuY2xvc2VkIElkZW9ncmFwaGljIFN1cHBsZW1lbnRcblx0XHRcdCgweDFGMjAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgxRjI1MSkgfHxcblx0XHRcdC8vIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEIgLi4gVGVydGlhcnkgSWRlb2dyYXBoaWMgUGxhbmVcblx0XHRcdCgweDIwMDAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgzRkZGRClcblx0XHQpXG5cdCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0Z1bGx3aWR0aENvZGVQb2ludDtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBpc0Z1bGx3aWR0aENvZGVQb2ludDtcbiIsIihmdW5jdGlvbigpe1xuXG4gICAgLy8gQ29weXJpZ2h0IChjKSAyMDA1ICBUb20gV3VcbiAgICAvLyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgIC8vIFNlZSBcIkxJQ0VOU0VcIiBmb3IgZGV0YWlscy5cblxuICAgIC8vIEJhc2ljIEphdmFTY3JpcHQgQk4gbGlicmFyeSAtIHN1YnNldCB1c2VmdWwgZm9yIFJTQSBlbmNyeXB0aW9uLlxuXG4gICAgLy8gQml0cyBwZXIgZGlnaXRcbiAgICB2YXIgZGJpdHM7XG5cbiAgICAvLyBKYXZhU2NyaXB0IGVuZ2luZSBhbmFseXNpc1xuICAgIHZhciBjYW5hcnkgPSAweGRlYWRiZWVmY2FmZTtcbiAgICB2YXIgal9sbSA9ICgoY2FuYXJ5JjB4ZmZmZmZmKT09MHhlZmNhZmUpO1xuXG4gICAgLy8gKHB1YmxpYykgQ29uc3RydWN0b3JcbiAgICBmdW5jdGlvbiBCaWdJbnRlZ2VyKGEsYixjKSB7XG4gICAgICBpZihhICE9IG51bGwpXG4gICAgICAgIGlmKFwibnVtYmVyXCIgPT0gdHlwZW9mIGEpIHRoaXMuZnJvbU51bWJlcihhLGIsYyk7XG4gICAgICAgIGVsc2UgaWYoYiA9PSBudWxsICYmIFwic3RyaW5nXCIgIT0gdHlwZW9mIGEpIHRoaXMuZnJvbVN0cmluZyhhLDI1Nik7XG4gICAgICAgIGVsc2UgdGhpcy5mcm9tU3RyaW5nKGEsYik7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIG5ldywgdW5zZXQgQmlnSW50ZWdlclxuICAgIGZ1bmN0aW9uIG5iaSgpIHsgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKG51bGwpOyB9XG5cbiAgICAvLyBhbTogQ29tcHV0ZSB3X2ogKz0gKHgqdGhpc19pKSwgcHJvcGFnYXRlIGNhcnJpZXMsXG4gICAgLy8gYyBpcyBpbml0aWFsIGNhcnJ5LCByZXR1cm5zIGZpbmFsIGNhcnJ5LlxuICAgIC8vIGMgPCAzKmR2YWx1ZSwgeCA8IDIqZHZhbHVlLCB0aGlzX2kgPCBkdmFsdWVcbiAgICAvLyBXZSBuZWVkIHRvIHNlbGVjdCB0aGUgZmFzdGVzdCBvbmUgdGhhdCB3b3JrcyBpbiB0aGlzIGVudmlyb25tZW50LlxuXG4gICAgLy8gYW0xOiB1c2UgYSBzaW5nbGUgbXVsdCBhbmQgZGl2aWRlIHRvIGdldCB0aGUgaGlnaCBiaXRzLFxuICAgIC8vIG1heCBkaWdpdCBiaXRzIHNob3VsZCBiZSAyNiBiZWNhdXNlXG4gICAgLy8gbWF4IGludGVybmFsIHZhbHVlID0gMipkdmFsdWVeMi0yKmR2YWx1ZSAoPCAyXjUzKVxuICAgIGZ1bmN0aW9uIGFtMShpLHgsdyxqLGMsbikge1xuICAgICAgd2hpbGUoLS1uID49IDApIHtcbiAgICAgICAgdmFyIHYgPSB4KnRoaXNbaSsrXSt3W2pdK2M7XG4gICAgICAgIGMgPSBNYXRoLmZsb29yKHYvMHg0MDAwMDAwKTtcbiAgICAgICAgd1tqKytdID0gdiYweDNmZmZmZmY7XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9XG4gICAgLy8gYW0yIGF2b2lkcyBhIGJpZyBtdWx0LWFuZC1leHRyYWN0IGNvbXBsZXRlbHkuXG4gICAgLy8gTWF4IGRpZ2l0IGJpdHMgc2hvdWxkIGJlIDw9IDMwIGJlY2F1c2Ugd2UgZG8gYml0d2lzZSBvcHNcbiAgICAvLyBvbiB2YWx1ZXMgdXAgdG8gMipoZHZhbHVlXjItaGR2YWx1ZS0xICg8IDJeMzEpXG4gICAgZnVuY3Rpb24gYW0yKGkseCx3LGosYyxuKSB7XG4gICAgICB2YXIgeGwgPSB4JjB4N2ZmZiwgeGggPSB4Pj4xNTtcbiAgICAgIHdoaWxlKC0tbiA+PSAwKSB7XG4gICAgICAgIHZhciBsID0gdGhpc1tpXSYweDdmZmY7XG4gICAgICAgIHZhciBoID0gdGhpc1tpKytdPj4xNTtcbiAgICAgICAgdmFyIG0gPSB4aCpsK2gqeGw7XG4gICAgICAgIGwgPSB4bCpsKygobSYweDdmZmYpPDwxNSkrd1tqXSsoYyYweDNmZmZmZmZmKTtcbiAgICAgICAgYyA9IChsPj4+MzApKyhtPj4+MTUpK3hoKmgrKGM+Pj4zMCk7XG4gICAgICAgIHdbaisrXSA9IGwmMHgzZmZmZmZmZjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH1cbiAgICAvLyBBbHRlcm5hdGVseSwgc2V0IG1heCBkaWdpdCBiaXRzIHRvIDI4IHNpbmNlIHNvbWVcbiAgICAvLyBicm93c2VycyBzbG93IGRvd24gd2hlbiBkZWFsaW5nIHdpdGggMzItYml0IG51bWJlcnMuXG4gICAgZnVuY3Rpb24gYW0zKGkseCx3LGosYyxuKSB7XG4gICAgICB2YXIgeGwgPSB4JjB4M2ZmZiwgeGggPSB4Pj4xNDtcbiAgICAgIHdoaWxlKC0tbiA+PSAwKSB7XG4gICAgICAgIHZhciBsID0gdGhpc1tpXSYweDNmZmY7XG4gICAgICAgIHZhciBoID0gdGhpc1tpKytdPj4xNDtcbiAgICAgICAgdmFyIG0gPSB4aCpsK2gqeGw7XG4gICAgICAgIGwgPSB4bCpsKygobSYweDNmZmYpPDwxNCkrd1tqXStjO1xuICAgICAgICBjID0gKGw+PjI4KSsobT4+MTQpK3hoKmg7XG4gICAgICAgIHdbaisrXSA9IGwmMHhmZmZmZmZmO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfVxuICAgIHZhciBpbkJyb3dzZXIgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiO1xuICAgIGlmKGluQnJvd3NlciAmJiBqX2xtICYmIChuYXZpZ2F0b3IuYXBwTmFtZSA9PSBcIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlclwiKSkge1xuICAgICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYW0gPSBhbTI7XG4gICAgICBkYml0cyA9IDMwO1xuICAgIH1cbiAgICBlbHNlIGlmKGluQnJvd3NlciAmJiBqX2xtICYmIChuYXZpZ2F0b3IuYXBwTmFtZSAhPSBcIk5ldHNjYXBlXCIpKSB7XG4gICAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbSA9IGFtMTtcbiAgICAgIGRiaXRzID0gMjY7XG4gICAgfVxuICAgIGVsc2UgeyAvLyBNb3ppbGxhL05ldHNjYXBlIHNlZW1zIHRvIHByZWZlciBhbTNcbiAgICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFtID0gYW0zO1xuICAgICAgZGJpdHMgPSAyODtcbiAgICB9XG5cbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5EQiA9IGRiaXRzO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkRNID0gKCgxPDxkYml0cyktMSk7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuRFYgPSAoMTw8ZGJpdHMpO1xuXG4gICAgdmFyIEJJX0ZQID0gNTI7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuRlYgPSBNYXRoLnBvdygyLEJJX0ZQKTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5GMSA9IEJJX0ZQLWRiaXRzO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkYyID0gMipkYml0cy1CSV9GUDtcblxuICAgIC8vIERpZ2l0IGNvbnZlcnNpb25zXG4gICAgdmFyIEJJX1JNID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIjtcbiAgICB2YXIgQklfUkMgPSBuZXcgQXJyYXkoKTtcbiAgICB2YXIgcnIsdnY7XG4gICAgcnIgPSBcIjBcIi5jaGFyQ29kZUF0KDApO1xuICAgIGZvcih2diA9IDA7IHZ2IDw9IDk7ICsrdnYpIEJJX1JDW3JyKytdID0gdnY7XG4gICAgcnIgPSBcImFcIi5jaGFyQ29kZUF0KDApO1xuICAgIGZvcih2diA9IDEwOyB2diA8IDM2OyArK3Z2KSBCSV9SQ1tycisrXSA9IHZ2O1xuICAgIHJyID0gXCJBXCIuY2hhckNvZGVBdCgwKTtcbiAgICBmb3IodnYgPSAxMDsgdnYgPCAzNjsgKyt2dikgQklfUkNbcnIrK10gPSB2djtcblxuICAgIGZ1bmN0aW9uIGludDJjaGFyKG4pIHsgcmV0dXJuIEJJX1JNLmNoYXJBdChuKTsgfVxuICAgIGZ1bmN0aW9uIGludEF0KHMsaSkge1xuICAgICAgdmFyIGMgPSBCSV9SQ1tzLmNoYXJDb2RlQXQoaSldO1xuICAgICAgcmV0dXJuIChjPT1udWxsKT8tMTpjO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIGNvcHkgdGhpcyB0byByXG4gICAgZnVuY3Rpb24gYm5wQ29weVRvKHIpIHtcbiAgICAgIGZvcih2YXIgaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkgcltpXSA9IHRoaXNbaV07XG4gICAgICByLnQgPSB0aGlzLnQ7XG4gICAgICByLnMgPSB0aGlzLnM7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgc2V0IGZyb20gaW50ZWdlciB2YWx1ZSB4LCAtRFYgPD0geCA8IERWXG4gICAgZnVuY3Rpb24gYm5wRnJvbUludCh4KSB7XG4gICAgICB0aGlzLnQgPSAxO1xuICAgICAgdGhpcy5zID0gKHg8MCk/LTE6MDtcbiAgICAgIGlmKHggPiAwKSB0aGlzWzBdID0geDtcbiAgICAgIGVsc2UgaWYoeCA8IC0xKSB0aGlzWzBdID0geCt0aGlzLkRWO1xuICAgICAgZWxzZSB0aGlzLnQgPSAwO1xuICAgIH1cblxuICAgIC8vIHJldHVybiBiaWdpbnQgaW5pdGlhbGl6ZWQgdG8gdmFsdWVcbiAgICBmdW5jdGlvbiBuYnYoaSkgeyB2YXIgciA9IG5iaSgpOyByLmZyb21JbnQoaSk7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBzZXQgZnJvbSBzdHJpbmcgYW5kIHJhZGl4XG4gICAgZnVuY3Rpb24gYm5wRnJvbVN0cmluZyhzLGIpIHtcbiAgICAgIHZhciBrO1xuICAgICAgaWYoYiA9PSAxNikgayA9IDQ7XG4gICAgICBlbHNlIGlmKGIgPT0gOCkgayA9IDM7XG4gICAgICBlbHNlIGlmKGIgPT0gMjU2KSBrID0gODsgLy8gYnl0ZSBhcnJheVxuICAgICAgZWxzZSBpZihiID09IDIpIGsgPSAxO1xuICAgICAgZWxzZSBpZihiID09IDMyKSBrID0gNTtcbiAgICAgIGVsc2UgaWYoYiA9PSA0KSBrID0gMjtcbiAgICAgIGVsc2UgeyB0aGlzLmZyb21SYWRpeChzLGIpOyByZXR1cm47IH1cbiAgICAgIHRoaXMudCA9IDA7XG4gICAgICB0aGlzLnMgPSAwO1xuICAgICAgdmFyIGkgPSBzLmxlbmd0aCwgbWkgPSBmYWxzZSwgc2ggPSAwO1xuICAgICAgd2hpbGUoLS1pID49IDApIHtcbiAgICAgICAgdmFyIHggPSAoaz09OCk/c1tpXSYweGZmOmludEF0KHMsaSk7XG4gICAgICAgIGlmKHggPCAwKSB7XG4gICAgICAgICAgaWYocy5jaGFyQXQoaSkgPT0gXCItXCIpIG1pID0gdHJ1ZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBtaSA9IGZhbHNlO1xuICAgICAgICBpZihzaCA9PSAwKVxuICAgICAgICAgIHRoaXNbdGhpcy50KytdID0geDtcbiAgICAgICAgZWxzZSBpZihzaCtrID4gdGhpcy5EQikge1xuICAgICAgICAgIHRoaXNbdGhpcy50LTFdIHw9ICh4JigoMTw8KHRoaXMuREItc2gpKS0xKSk8PHNoO1xuICAgICAgICAgIHRoaXNbdGhpcy50KytdID0gKHg+Pih0aGlzLkRCLXNoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRoaXNbdGhpcy50LTFdIHw9IHg8PHNoO1xuICAgICAgICBzaCArPSBrO1xuICAgICAgICBpZihzaCA+PSB0aGlzLkRCKSBzaCAtPSB0aGlzLkRCO1xuICAgICAgfVxuICAgICAgaWYoayA9PSA4ICYmIChzWzBdJjB4ODApICE9IDApIHtcbiAgICAgICAgdGhpcy5zID0gLTE7XG4gICAgICAgIGlmKHNoID4gMCkgdGhpc1t0aGlzLnQtMV0gfD0gKCgxPDwodGhpcy5EQi1zaCkpLTEpPDxzaDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xhbXAoKTtcbiAgICAgIGlmKG1pKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBjbGFtcCBvZmYgZXhjZXNzIGhpZ2ggd29yZHNcbiAgICBmdW5jdGlvbiBibnBDbGFtcCgpIHtcbiAgICAgIHZhciBjID0gdGhpcy5zJnRoaXMuRE07XG4gICAgICB3aGlsZSh0aGlzLnQgPiAwICYmIHRoaXNbdGhpcy50LTFdID09IGMpIC0tdGhpcy50O1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW4gZ2l2ZW4gcmFkaXhcbiAgICBmdW5jdGlvbiBiblRvU3RyaW5nKGIpIHtcbiAgICAgIGlmKHRoaXMucyA8IDApIHJldHVybiBcIi1cIit0aGlzLm5lZ2F0ZSgpLnRvU3RyaW5nKGIpO1xuICAgICAgdmFyIGs7XG4gICAgICBpZihiID09IDE2KSBrID0gNDtcbiAgICAgIGVsc2UgaWYoYiA9PSA4KSBrID0gMztcbiAgICAgIGVsc2UgaWYoYiA9PSAyKSBrID0gMTtcbiAgICAgIGVsc2UgaWYoYiA9PSAzMikgayA9IDU7XG4gICAgICBlbHNlIGlmKGIgPT0gNCkgayA9IDI7XG4gICAgICBlbHNlIHJldHVybiB0aGlzLnRvUmFkaXgoYik7XG4gICAgICB2YXIga20gPSAoMTw8ayktMSwgZCwgbSA9IGZhbHNlLCByID0gXCJcIiwgaSA9IHRoaXMudDtcbiAgICAgIHZhciBwID0gdGhpcy5EQi0oaSp0aGlzLkRCKSVrO1xuICAgICAgaWYoaS0tID4gMCkge1xuICAgICAgICBpZihwIDwgdGhpcy5EQiAmJiAoZCA9IHRoaXNbaV0+PnApID4gMCkgeyBtID0gdHJ1ZTsgciA9IGludDJjaGFyKGQpOyB9XG4gICAgICAgIHdoaWxlKGkgPj0gMCkge1xuICAgICAgICAgIGlmKHAgPCBrKSB7XG4gICAgICAgICAgICBkID0gKHRoaXNbaV0mKCgxPDxwKS0xKSk8PChrLXApO1xuICAgICAgICAgICAgZCB8PSB0aGlzWy0taV0+PihwKz10aGlzLkRCLWspO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGQgPSAodGhpc1tpXT4+KHAtPWspKSZrbTtcbiAgICAgICAgICAgIGlmKHAgPD0gMCkgeyBwICs9IHRoaXMuREI7IC0taTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihkID4gMCkgbSA9IHRydWU7XG4gICAgICAgICAgaWYobSkgciArPSBpbnQyY2hhcihkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG0/cjpcIjBcIjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSAtdGhpc1xuICAgIGZ1bmN0aW9uIGJuTmVnYXRlKCkgeyB2YXIgciA9IG5iaSgpOyBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyxyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHx0aGlzfFxuICAgIGZ1bmN0aW9uIGJuQWJzKCkgeyByZXR1cm4gKHRoaXMuczwwKT90aGlzLm5lZ2F0ZSgpOnRoaXM7IH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybiArIGlmIHRoaXMgPiBhLCAtIGlmIHRoaXMgPCBhLCAwIGlmIGVxdWFsXG4gICAgZnVuY3Rpb24gYm5Db21wYXJlVG8oYSkge1xuICAgICAgdmFyIHIgPSB0aGlzLnMtYS5zO1xuICAgICAgaWYociAhPSAwKSByZXR1cm4gcjtcbiAgICAgIHZhciBpID0gdGhpcy50O1xuICAgICAgciA9IGktYS50O1xuICAgICAgaWYociAhPSAwKSByZXR1cm4gKHRoaXMuczwwKT8tcjpyO1xuICAgICAgd2hpbGUoLS1pID49IDApIGlmKChyPXRoaXNbaV0tYVtpXSkgIT0gMCkgcmV0dXJuIHI7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIGJpdCBsZW5ndGggb2YgdGhlIGludGVnZXIgeFxuICAgIGZ1bmN0aW9uIG5iaXRzKHgpIHtcbiAgICAgIHZhciByID0gMSwgdDtcbiAgICAgIGlmKCh0PXg+Pj4xNikgIT0gMCkgeyB4ID0gdDsgciArPSAxNjsgfVxuICAgICAgaWYoKHQ9eD4+OCkgIT0gMCkgeyB4ID0gdDsgciArPSA4OyB9XG4gICAgICBpZigodD14Pj40KSAhPSAwKSB7IHggPSB0OyByICs9IDQ7IH1cbiAgICAgIGlmKCh0PXg+PjIpICE9IDApIHsgeCA9IHQ7IHIgKz0gMjsgfVxuICAgICAgaWYoKHQ9eD4+MSkgIT0gMCkgeyB4ID0gdDsgciArPSAxOyB9XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIGluIFwidGhpc1wiXG4gICAgZnVuY3Rpb24gYm5CaXRMZW5ndGgoKSB7XG4gICAgICBpZih0aGlzLnQgPD0gMCkgcmV0dXJuIDA7XG4gICAgICByZXR1cm4gdGhpcy5EQioodGhpcy50LTEpK25iaXRzKHRoaXNbdGhpcy50LTFdXih0aGlzLnMmdGhpcy5ETSkpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIDw8IG4qREJcbiAgICBmdW5jdGlvbiBibnBETFNoaWZ0VG8obixyKSB7XG4gICAgICB2YXIgaTtcbiAgICAgIGZvcihpID0gdGhpcy50LTE7IGkgPj0gMDsgLS1pKSByW2krbl0gPSB0aGlzW2ldO1xuICAgICAgZm9yKGkgPSBuLTE7IGkgPj0gMDsgLS1pKSByW2ldID0gMDtcbiAgICAgIHIudCA9IHRoaXMudCtuO1xuICAgICAgci5zID0gdGhpcy5zO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzID4+IG4qREJcbiAgICBmdW5jdGlvbiBibnBEUlNoaWZ0VG8obixyKSB7XG4gICAgICBmb3IodmFyIGkgPSBuOyBpIDwgdGhpcy50OyArK2kpIHJbaS1uXSA9IHRoaXNbaV07XG4gICAgICByLnQgPSBNYXRoLm1heCh0aGlzLnQtbiwwKTtcbiAgICAgIHIucyA9IHRoaXMucztcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyA8PCBuXG4gICAgZnVuY3Rpb24gYm5wTFNoaWZ0VG8obixyKSB7XG4gICAgICB2YXIgYnMgPSBuJXRoaXMuREI7XG4gICAgICB2YXIgY2JzID0gdGhpcy5EQi1icztcbiAgICAgIHZhciBibSA9ICgxPDxjYnMpLTE7XG4gICAgICB2YXIgZHMgPSBNYXRoLmZsb29yKG4vdGhpcy5EQiksIGMgPSAodGhpcy5zPDxicykmdGhpcy5ETSwgaTtcbiAgICAgIGZvcihpID0gdGhpcy50LTE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHJbaStkcysxXSA9ICh0aGlzW2ldPj5jYnMpfGM7XG4gICAgICAgIGMgPSAodGhpc1tpXSZibSk8PGJzO1xuICAgICAgfVxuICAgICAgZm9yKGkgPSBkcy0xOyBpID49IDA7IC0taSkgcltpXSA9IDA7XG4gICAgICByW2RzXSA9IGM7XG4gICAgICByLnQgPSB0aGlzLnQrZHMrMTtcbiAgICAgIHIucyA9IHRoaXMucztcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyA+PiBuXG4gICAgZnVuY3Rpb24gYm5wUlNoaWZ0VG8obixyKSB7XG4gICAgICByLnMgPSB0aGlzLnM7XG4gICAgICB2YXIgZHMgPSBNYXRoLmZsb29yKG4vdGhpcy5EQik7XG4gICAgICBpZihkcyA+PSB0aGlzLnQpIHsgci50ID0gMDsgcmV0dXJuOyB9XG4gICAgICB2YXIgYnMgPSBuJXRoaXMuREI7XG4gICAgICB2YXIgY2JzID0gdGhpcy5EQi1icztcbiAgICAgIHZhciBibSA9ICgxPDxicyktMTtcbiAgICAgIHJbMF0gPSB0aGlzW2RzXT4+YnM7XG4gICAgICBmb3IodmFyIGkgPSBkcysxOyBpIDwgdGhpcy50OyArK2kpIHtcbiAgICAgICAgcltpLWRzLTFdIHw9ICh0aGlzW2ldJmJtKTw8Y2JzO1xuICAgICAgICByW2ktZHNdID0gdGhpc1tpXT4+YnM7XG4gICAgICB9XG4gICAgICBpZihicyA+IDApIHJbdGhpcy50LWRzLTFdIHw9ICh0aGlzLnMmYm0pPDxjYnM7XG4gICAgICByLnQgPSB0aGlzLnQtZHM7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgLSBhXG4gICAgZnVuY3Rpb24gYm5wU3ViVG8oYSxyKSB7XG4gICAgICB2YXIgaSA9IDAsIGMgPSAwLCBtID0gTWF0aC5taW4oYS50LHRoaXMudCk7XG4gICAgICB3aGlsZShpIDwgbSkge1xuICAgICAgICBjICs9IHRoaXNbaV0tYVtpXTtcbiAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgfVxuICAgICAgaWYoYS50IDwgdGhpcy50KSB7XG4gICAgICAgIGMgLT0gYS5zO1xuICAgICAgICB3aGlsZShpIDwgdGhpcy50KSB7XG4gICAgICAgICAgYyArPSB0aGlzW2ldO1xuICAgICAgICAgIHJbaSsrXSA9IGMmdGhpcy5ETTtcbiAgICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgICB9XG4gICAgICAgIGMgKz0gdGhpcy5zO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGMgKz0gdGhpcy5zO1xuICAgICAgICB3aGlsZShpIDwgYS50KSB7XG4gICAgICAgICAgYyAtPSBhW2ldO1xuICAgICAgICAgIHJbaSsrXSA9IGMmdGhpcy5ETTtcbiAgICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgICB9XG4gICAgICAgIGMgLT0gYS5zO1xuICAgICAgfVxuICAgICAgci5zID0gKGM8MCk/LTE6MDtcbiAgICAgIGlmKGMgPCAtMSkgcltpKytdID0gdGhpcy5EVitjO1xuICAgICAgZWxzZSBpZihjID4gMCkgcltpKytdID0gYztcbiAgICAgIHIudCA9IGk7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgKiBhLCByICE9IHRoaXMsYSAoSEFDIDE0LjEyKVxuICAgIC8vIFwidGhpc1wiIHNob3VsZCBiZSB0aGUgbGFyZ2VyIG9uZSBpZiBhcHByb3ByaWF0ZS5cbiAgICBmdW5jdGlvbiBibnBNdWx0aXBseVRvKGEscikge1xuICAgICAgdmFyIHggPSB0aGlzLmFicygpLCB5ID0gYS5hYnMoKTtcbiAgICAgIHZhciBpID0geC50O1xuICAgICAgci50ID0gaSt5LnQ7XG4gICAgICB3aGlsZSgtLWkgPj0gMCkgcltpXSA9IDA7XG4gICAgICBmb3IoaSA9IDA7IGkgPCB5LnQ7ICsraSkgcltpK3gudF0gPSB4LmFtKDAseVtpXSxyLGksMCx4LnQpO1xuICAgICAgci5zID0gMDtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICAgIGlmKHRoaXMucyAhPSBhLnMpIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyhyLHIpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzXjIsIHIgIT0gdGhpcyAoSEFDIDE0LjE2KVxuICAgIGZ1bmN0aW9uIGJucFNxdWFyZVRvKHIpIHtcbiAgICAgIHZhciB4ID0gdGhpcy5hYnMoKTtcbiAgICAgIHZhciBpID0gci50ID0gMip4LnQ7XG4gICAgICB3aGlsZSgtLWkgPj0gMCkgcltpXSA9IDA7XG4gICAgICBmb3IoaSA9IDA7IGkgPCB4LnQtMTsgKytpKSB7XG4gICAgICAgIHZhciBjID0geC5hbShpLHhbaV0sciwyKmksMCwxKTtcbiAgICAgICAgaWYoKHJbaSt4LnRdKz14LmFtKGkrMSwyKnhbaV0sciwyKmkrMSxjLHgudC1pLTEpKSA+PSB4LkRWKSB7XG4gICAgICAgICAgcltpK3gudF0gLT0geC5EVjtcbiAgICAgICAgICByW2kreC50KzFdID0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYoci50ID4gMCkgcltyLnQtMV0gKz0geC5hbShpLHhbaV0sciwyKmksMCwxKTtcbiAgICAgIHIucyA9IDA7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgZGl2aWRlIHRoaXMgYnkgbSwgcXVvdGllbnQgYW5kIHJlbWFpbmRlciB0byBxLCByIChIQUMgMTQuMjApXG4gICAgLy8gciAhPSBxLCB0aGlzICE9IG0uICBxIG9yIHIgbWF5IGJlIG51bGwuXG4gICAgZnVuY3Rpb24gYm5wRGl2UmVtVG8obSxxLHIpIHtcbiAgICAgIHZhciBwbSA9IG0uYWJzKCk7XG4gICAgICBpZihwbS50IDw9IDApIHJldHVybjtcbiAgICAgIHZhciBwdCA9IHRoaXMuYWJzKCk7XG4gICAgICBpZihwdC50IDwgcG0udCkge1xuICAgICAgICBpZihxICE9IG51bGwpIHEuZnJvbUludCgwKTtcbiAgICAgICAgaWYociAhPSBudWxsKSB0aGlzLmNvcHlUbyhyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYociA9PSBudWxsKSByID0gbmJpKCk7XG4gICAgICB2YXIgeSA9IG5iaSgpLCB0cyA9IHRoaXMucywgbXMgPSBtLnM7XG4gICAgICB2YXIgbnNoID0gdGhpcy5EQi1uYml0cyhwbVtwbS50LTFdKTsgICAvLyBub3JtYWxpemUgbW9kdWx1c1xuICAgICAgaWYobnNoID4gMCkgeyBwbS5sU2hpZnRUbyhuc2gseSk7IHB0LmxTaGlmdFRvKG5zaCxyKTsgfVxuICAgICAgZWxzZSB7IHBtLmNvcHlUbyh5KTsgcHQuY29weVRvKHIpOyB9XG4gICAgICB2YXIgeXMgPSB5LnQ7XG4gICAgICB2YXIgeTAgPSB5W3lzLTFdO1xuICAgICAgaWYoeTAgPT0gMCkgcmV0dXJuO1xuICAgICAgdmFyIHl0ID0geTAqKDE8PHRoaXMuRjEpKygoeXM+MSk/eVt5cy0yXT4+dGhpcy5GMjowKTtcbiAgICAgIHZhciBkMSA9IHRoaXMuRlYveXQsIGQyID0gKDE8PHRoaXMuRjEpL3l0LCBlID0gMTw8dGhpcy5GMjtcbiAgICAgIHZhciBpID0gci50LCBqID0gaS15cywgdCA9IChxPT1udWxsKT9uYmkoKTpxO1xuICAgICAgeS5kbFNoaWZ0VG8oaix0KTtcbiAgICAgIGlmKHIuY29tcGFyZVRvKHQpID49IDApIHtcbiAgICAgICAgcltyLnQrK10gPSAxO1xuICAgICAgICByLnN1YlRvKHQscik7XG4gICAgICB9XG4gICAgICBCaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8oeXMsdCk7XG4gICAgICB0LnN1YlRvKHkseSk7ICAvLyBcIm5lZ2F0aXZlXCIgeSBzbyB3ZSBjYW4gcmVwbGFjZSBzdWIgd2l0aCBhbSBsYXRlclxuICAgICAgd2hpbGUoeS50IDwgeXMpIHlbeS50KytdID0gMDtcbiAgICAgIHdoaWxlKC0taiA+PSAwKSB7XG4gICAgICAgIC8vIEVzdGltYXRlIHF1b3RpZW50IGRpZ2l0XG4gICAgICAgIHZhciBxZCA9IChyWy0taV09PXkwKT90aGlzLkRNOk1hdGguZmxvb3IocltpXSpkMSsocltpLTFdK2UpKmQyKTtcbiAgICAgICAgaWYoKHJbaV0rPXkuYW0oMCxxZCxyLGosMCx5cykpIDwgcWQpIHsgICAvLyBUcnkgaXQgb3V0XG4gICAgICAgICAgeS5kbFNoaWZ0VG8oaix0KTtcbiAgICAgICAgICByLnN1YlRvKHQscik7XG4gICAgICAgICAgd2hpbGUocltpXSA8IC0tcWQpIHIuc3ViVG8odCxyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYocSAhPSBudWxsKSB7XG4gICAgICAgIHIuZHJTaGlmdFRvKHlzLHEpO1xuICAgICAgICBpZih0cyAhPSBtcykgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHEscSk7XG4gICAgICB9XG4gICAgICByLnQgPSB5cztcbiAgICAgIHIuY2xhbXAoKTtcbiAgICAgIGlmKG5zaCA+IDApIHIuclNoaWZ0VG8obnNoLHIpOyAvLyBEZW5vcm1hbGl6ZSByZW1haW5kZXJcbiAgICAgIGlmKHRzIDwgMCkgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHIscik7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyBtb2QgYVxuICAgIGZ1bmN0aW9uIGJuTW9kKGEpIHtcbiAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICB0aGlzLmFicygpLmRpdlJlbVRvKGEsbnVsbCxyKTtcbiAgICAgIGlmKHRoaXMucyA8IDAgJiYgci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA+IDApIGEuc3ViVG8ocixyKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIE1vZHVsYXIgcmVkdWN0aW9uIHVzaW5nIFwiY2xhc3NpY1wiIGFsZ29yaXRobVxuICAgIGZ1bmN0aW9uIENsYXNzaWMobSkgeyB0aGlzLm0gPSBtOyB9XG4gICAgZnVuY3Rpb24gY0NvbnZlcnQoeCkge1xuICAgICAgaWYoeC5zIDwgMCB8fCB4LmNvbXBhcmVUbyh0aGlzLm0pID49IDApIHJldHVybiB4Lm1vZCh0aGlzLm0pO1xuICAgICAgZWxzZSByZXR1cm4geDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY1JldmVydCh4KSB7IHJldHVybiB4OyB9XG4gICAgZnVuY3Rpb24gY1JlZHVjZSh4KSB7IHguZGl2UmVtVG8odGhpcy5tLG51bGwseCk7IH1cbiAgICBmdW5jdGlvbiBjTXVsVG8oeCx5LHIpIHsgeC5tdWx0aXBseVRvKHkscik7IHRoaXMucmVkdWNlKHIpOyB9XG4gICAgZnVuY3Rpb24gY1NxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG4gICAgQ2xhc3NpYy5wcm90b3R5cGUuY29udmVydCA9IGNDb252ZXJ0O1xuICAgIENsYXNzaWMucHJvdG90eXBlLnJldmVydCA9IGNSZXZlcnQ7XG4gICAgQ2xhc3NpYy5wcm90b3R5cGUucmVkdWNlID0gY1JlZHVjZTtcbiAgICBDbGFzc2ljLnByb3RvdHlwZS5tdWxUbyA9IGNNdWxUbztcbiAgICBDbGFzc2ljLnByb3RvdHlwZS5zcXJUbyA9IGNTcXJUbztcblxuICAgIC8vIChwcm90ZWN0ZWQpIHJldHVybiBcIi0xL3RoaXMgJSAyXkRCXCI7IHVzZWZ1bCBmb3IgTW9udC4gcmVkdWN0aW9uXG4gICAgLy8ganVzdGlmaWNhdGlvbjpcbiAgICAvLyAgICAgICAgIHh5ID09IDEgKG1vZCBtKVxuICAgIC8vICAgICAgICAgeHkgPSAgMStrbVxuICAgIC8vICAgeHkoMi14eSkgPSAoMStrbSkoMS1rbSlcbiAgICAvLyB4W3koMi14eSldID0gMS1rXjJtXjJcbiAgICAvLyB4W3koMi14eSldID09IDEgKG1vZCBtXjIpXG4gICAgLy8gaWYgeSBpcyAxL3ggbW9kIG0sIHRoZW4geSgyLXh5KSBpcyAxL3ggbW9kIG1eMlxuICAgIC8vIHNob3VsZCByZWR1Y2UgeCBhbmQgeSgyLXh5KSBieSBtXjIgYXQgZWFjaCBzdGVwIHRvIGtlZXAgc2l6ZSBib3VuZGVkLlxuICAgIC8vIEpTIG11bHRpcGx5IFwib3ZlcmZsb3dzXCIgZGlmZmVyZW50bHkgZnJvbSBDL0MrKywgc28gY2FyZSBpcyBuZWVkZWQgaGVyZS5cbiAgICBmdW5jdGlvbiBibnBJbnZEaWdpdCgpIHtcbiAgICAgIGlmKHRoaXMudCA8IDEpIHJldHVybiAwO1xuICAgICAgdmFyIHggPSB0aGlzWzBdO1xuICAgICAgaWYoKHgmMSkgPT0gMCkgcmV0dXJuIDA7XG4gICAgICB2YXIgeSA9IHgmMzsgICAgICAgLy8geSA9PSAxL3ggbW9kIDJeMlxuICAgICAgeSA9ICh5KigyLSh4JjB4ZikqeSkpJjB4ZjsgLy8geSA9PSAxL3ggbW9kIDJeNFxuICAgICAgeSA9ICh5KigyLSh4JjB4ZmYpKnkpKSYweGZmOyAgIC8vIHkgPT0gMS94IG1vZCAyXjhcbiAgICAgIHkgPSAoeSooMi0oKCh4JjB4ZmZmZikqeSkmMHhmZmZmKSkpJjB4ZmZmZjsgICAgLy8geSA9PSAxL3ggbW9kIDJeMTZcbiAgICAgIC8vIGxhc3Qgc3RlcCAtIGNhbGN1bGF0ZSBpbnZlcnNlIG1vZCBEViBkaXJlY3RseTtcbiAgICAgIC8vIGFzc3VtZXMgMTYgPCBEQiA8PSAzMiBhbmQgYXNzdW1lcyBhYmlsaXR5IHRvIGhhbmRsZSA0OC1iaXQgaW50c1xuICAgICAgeSA9ICh5KigyLXgqeSV0aGlzLkRWKSkldGhpcy5EVjsgICAgICAgLy8geSA9PSAxL3ggbW9kIDJeZGJpdHNcbiAgICAgIC8vIHdlIHJlYWxseSB3YW50IHRoZSBuZWdhdGl2ZSBpbnZlcnNlLCBhbmQgLURWIDwgeSA8IERWXG4gICAgICByZXR1cm4gKHk+MCk/dGhpcy5EVi15Oi15O1xuICAgIH1cblxuICAgIC8vIE1vbnRnb21lcnkgcmVkdWN0aW9uXG4gICAgZnVuY3Rpb24gTW9udGdvbWVyeShtKSB7XG4gICAgICB0aGlzLm0gPSBtO1xuICAgICAgdGhpcy5tcCA9IG0uaW52RGlnaXQoKTtcbiAgICAgIHRoaXMubXBsID0gdGhpcy5tcCYweDdmZmY7XG4gICAgICB0aGlzLm1waCA9IHRoaXMubXA+PjE1O1xuICAgICAgdGhpcy51bSA9ICgxPDwobS5EQi0xNSkpLTE7XG4gICAgICB0aGlzLm10MiA9IDIqbS50O1xuICAgIH1cblxuICAgIC8vIHhSIG1vZCBtXG4gICAgZnVuY3Rpb24gbW9udENvbnZlcnQoeCkge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIHguYWJzKCkuZGxTaGlmdFRvKHRoaXMubS50LHIpO1xuICAgICAgci5kaXZSZW1Ubyh0aGlzLm0sbnVsbCxyKTtcbiAgICAgIGlmKHgucyA8IDAgJiYgci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA+IDApIHRoaXMubS5zdWJUbyhyLHIpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8geC9SIG1vZCBtXG4gICAgZnVuY3Rpb24gbW9udFJldmVydCh4KSB7XG4gICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgeC5jb3B5VG8ocik7XG4gICAgICB0aGlzLnJlZHVjZShyKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIHggPSB4L1IgbW9kIG0gKEhBQyAxNC4zMilcbiAgICBmdW5jdGlvbiBtb250UmVkdWNlKHgpIHtcbiAgICAgIHdoaWxlKHgudCA8PSB0aGlzLm10MikgLy8gcGFkIHggc28gYW0gaGFzIGVub3VnaCByb29tIGxhdGVyXG4gICAgICAgIHhbeC50KytdID0gMDtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLm0udDsgKytpKSB7XG4gICAgICAgIC8vIGZhc3RlciB3YXkgb2YgY2FsY3VsYXRpbmcgdTAgPSB4W2ldKm1wIG1vZCBEVlxuICAgICAgICB2YXIgaiA9IHhbaV0mMHg3ZmZmO1xuICAgICAgICB2YXIgdTAgPSAoaip0aGlzLm1wbCsoKChqKnRoaXMubXBoKyh4W2ldPj4xNSkqdGhpcy5tcGwpJnRoaXMudW0pPDwxNSkpJnguRE07XG4gICAgICAgIC8vIHVzZSBhbSB0byBjb21iaW5lIHRoZSBtdWx0aXBseS1zaGlmdC1hZGQgaW50byBvbmUgY2FsbFxuICAgICAgICBqID0gaSt0aGlzLm0udDtcbiAgICAgICAgeFtqXSArPSB0aGlzLm0uYW0oMCx1MCx4LGksMCx0aGlzLm0udCk7XG4gICAgICAgIC8vIHByb3BhZ2F0ZSBjYXJyeVxuICAgICAgICB3aGlsZSh4W2pdID49IHguRFYpIHsgeFtqXSAtPSB4LkRWOyB4Wysral0rKzsgfVxuICAgICAgfVxuICAgICAgeC5jbGFtcCgpO1xuICAgICAgeC5kclNoaWZ0VG8odGhpcy5tLnQseCk7XG4gICAgICBpZih4LmNvbXBhcmVUbyh0aGlzLm0pID49IDApIHguc3ViVG8odGhpcy5tLHgpO1xuICAgIH1cblxuICAgIC8vIHIgPSBcInheMi9SIG1vZCBtXCI7IHggIT0gclxuICAgIGZ1bmN0aW9uIG1vbnRTcXJUbyh4LHIpIHsgeC5zcXVhcmVUbyhyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuICAgIC8vIHIgPSBcInh5L1IgbW9kIG1cIjsgeCx5ICE9IHJcbiAgICBmdW5jdGlvbiBtb250TXVsVG8oeCx5LHIpIHsgeC5tdWx0aXBseVRvKHkscik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbiAgICBNb250Z29tZXJ5LnByb3RvdHlwZS5jb252ZXJ0ID0gbW9udENvbnZlcnQ7XG4gICAgTW9udGdvbWVyeS5wcm90b3R5cGUucmV2ZXJ0ID0gbW9udFJldmVydDtcbiAgICBNb250Z29tZXJ5LnByb3RvdHlwZS5yZWR1Y2UgPSBtb250UmVkdWNlO1xuICAgIE1vbnRnb21lcnkucHJvdG90eXBlLm11bFRvID0gbW9udE11bFRvO1xuICAgIE1vbnRnb21lcnkucHJvdG90eXBlLnNxclRvID0gbW9udFNxclRvO1xuXG4gICAgLy8gKHByb3RlY3RlZCkgdHJ1ZSBpZmYgdGhpcyBpcyBldmVuXG4gICAgZnVuY3Rpb24gYm5wSXNFdmVuKCkgeyByZXR1cm4gKCh0aGlzLnQ+MCk/KHRoaXNbMF0mMSk6dGhpcy5zKSA9PSAwOyB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0aGlzXmUsIGUgPCAyXjMyLCBkb2luZyBzcXIgYW5kIG11bCB3aXRoIFwiclwiIChIQUMgMTQuNzkpXG4gICAgZnVuY3Rpb24gYm5wRXhwKGUseikge1xuICAgICAgaWYoZSA+IDB4ZmZmZmZmZmYgfHwgZSA8IDEpIHJldHVybiBCaWdJbnRlZ2VyLk9ORTtcbiAgICAgIHZhciByID0gbmJpKCksIHIyID0gbmJpKCksIGcgPSB6LmNvbnZlcnQodGhpcyksIGkgPSBuYml0cyhlKS0xO1xuICAgICAgZy5jb3B5VG8ocik7XG4gICAgICB3aGlsZSgtLWkgPj0gMCkge1xuICAgICAgICB6LnNxclRvKHIscjIpO1xuICAgICAgICBpZigoZSYoMTw8aSkpID4gMCkgei5tdWxUbyhyMixnLHIpO1xuICAgICAgICBlbHNlIHsgdmFyIHQgPSByOyByID0gcjI7IHIyID0gdDsgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHoucmV2ZXJ0KHIpO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXNeZSAlIG0sIDAgPD0gZSA8IDJeMzJcbiAgICBmdW5jdGlvbiBibk1vZFBvd0ludChlLG0pIHtcbiAgICAgIHZhciB6O1xuICAgICAgaWYoZSA8IDI1NiB8fCBtLmlzRXZlbigpKSB6ID0gbmV3IENsYXNzaWMobSk7IGVsc2UgeiA9IG5ldyBNb250Z29tZXJ5KG0pO1xuICAgICAgcmV0dXJuIHRoaXMuZXhwKGUseik7XG4gICAgfVxuXG4gICAgLy8gcHJvdGVjdGVkXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY29weVRvID0gYm5wQ29weVRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21JbnQgPSBibnBGcm9tSW50O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21TdHJpbmcgPSBibnBGcm9tU3RyaW5nO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNsYW1wID0gYm5wQ2xhbXA7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZGxTaGlmdFRvID0gYm5wRExTaGlmdFRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmRyU2hpZnRUbyA9IGJucERSU2hpZnRUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5sU2hpZnRUbyA9IGJucExTaGlmdFRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnJTaGlmdFRvID0gYm5wUlNoaWZ0VG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc3ViVG8gPSBibnBTdWJUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVRvID0gYm5wTXVsdGlwbHlUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmVUbyA9IGJucFNxdWFyZVRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmRpdlJlbVRvID0gYm5wRGl2UmVtVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaW52RGlnaXQgPSBibnBJbnZEaWdpdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc0V2ZW4gPSBibnBJc0V2ZW47XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZXhwID0gYm5wRXhwO1xuXG4gICAgLy8gcHVibGljXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUudG9TdHJpbmcgPSBiblRvU3RyaW5nO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm5lZ2F0ZSA9IGJuTmVnYXRlO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFicyA9IGJuQWJzO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNvbXBhcmVUbyA9IGJuQ29tcGFyZVRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJpdExlbmd0aCA9IGJuQml0TGVuZ3RoO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1vZCA9IGJuTW9kO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBvd0ludCA9IGJuTW9kUG93SW50O1xuXG4gICAgLy8gXCJjb25zdGFudHNcIlxuICAgIEJpZ0ludGVnZXIuWkVSTyA9IG5idigwKTtcbiAgICBCaWdJbnRlZ2VyLk9ORSA9IG5idigxKTtcblxuICAgIC8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5ICBUb20gV3VcbiAgICAvLyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgIC8vIFNlZSBcIkxJQ0VOU0VcIiBmb3IgZGV0YWlscy5cblxuICAgIC8vIEV4dGVuZGVkIEphdmFTY3JpcHQgQk4gZnVuY3Rpb25zLCByZXF1aXJlZCBmb3IgUlNBIHByaXZhdGUgb3BzLlxuXG4gICAgLy8gVmVyc2lvbiAxLjE6IG5ldyBCaWdJbnRlZ2VyKFwiMFwiLCAxMCkgcmV0dXJucyBcInByb3BlclwiIHplcm9cbiAgICAvLyBWZXJzaW9uIDEuMjogc3F1YXJlKCkgQVBJLCBpc1Byb2JhYmxlUHJpbWUgZml4XG5cbiAgICAvLyAocHVibGljKVxuICAgIGZ1bmN0aW9uIGJuQ2xvbmUoKSB7IHZhciByID0gbmJpKCk7IHRoaXMuY29weVRvKHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIHZhbHVlIGFzIGludGVnZXJcbiAgICBmdW5jdGlvbiBibkludFZhbHVlKCkge1xuICAgICAgaWYodGhpcy5zIDwgMCkge1xuICAgICAgICBpZih0aGlzLnQgPT0gMSkgcmV0dXJuIHRoaXNbMF0tdGhpcy5EVjtcbiAgICAgICAgZWxzZSBpZih0aGlzLnQgPT0gMCkgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgZWxzZSBpZih0aGlzLnQgPT0gMSkgcmV0dXJuIHRoaXNbMF07XG4gICAgICBlbHNlIGlmKHRoaXMudCA9PSAwKSByZXR1cm4gMDtcbiAgICAgIC8vIGFzc3VtZXMgMTYgPCBEQiA8IDMyXG4gICAgICByZXR1cm4gKCh0aGlzWzFdJigoMTw8KDMyLXRoaXMuREIpKS0xKSk8PHRoaXMuREIpfHRoaXNbMF07XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIHZhbHVlIGFzIGJ5dGVcbiAgICBmdW5jdGlvbiBibkJ5dGVWYWx1ZSgpIHsgcmV0dXJuICh0aGlzLnQ9PTApP3RoaXMuczoodGhpc1swXTw8MjQpPj4yNDsgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIHZhbHVlIGFzIHNob3J0IChhc3N1bWVzIERCPj0xNilcbiAgICBmdW5jdGlvbiBiblNob3J0VmFsdWUoKSB7IHJldHVybiAodGhpcy50PT0wKT90aGlzLnM6KHRoaXNbMF08PDE2KT4+MTY7IH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHJldHVybiB4IHMudC4gcl54IDwgRFZcbiAgICBmdW5jdGlvbiBibnBDaHVua1NpemUocikgeyByZXR1cm4gTWF0aC5mbG9vcihNYXRoLkxOMip0aGlzLkRCL01hdGgubG9nKHIpKTsgfVxuXG4gICAgLy8gKHB1YmxpYykgMCBpZiB0aGlzID09IDAsIDEgaWYgdGhpcyA+IDBcbiAgICBmdW5jdGlvbiBiblNpZ051bSgpIHtcbiAgICAgIGlmKHRoaXMucyA8IDApIHJldHVybiAtMTtcbiAgICAgIGVsc2UgaWYodGhpcy50IDw9IDAgfHwgKHRoaXMudCA9PSAxICYmIHRoaXNbMF0gPD0gMCkpIHJldHVybiAwO1xuICAgICAgZWxzZSByZXR1cm4gMTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBjb252ZXJ0IHRvIHJhZGl4IHN0cmluZ1xuICAgIGZ1bmN0aW9uIGJucFRvUmFkaXgoYikge1xuICAgICAgaWYoYiA9PSBudWxsKSBiID0gMTA7XG4gICAgICBpZih0aGlzLnNpZ251bSgpID09IDAgfHwgYiA8IDIgfHwgYiA+IDM2KSByZXR1cm4gXCIwXCI7XG4gICAgICB2YXIgY3MgPSB0aGlzLmNodW5rU2l6ZShiKTtcbiAgICAgIHZhciBhID0gTWF0aC5wb3coYixjcyk7XG4gICAgICB2YXIgZCA9IG5idihhKSwgeSA9IG5iaSgpLCB6ID0gbmJpKCksIHIgPSBcIlwiO1xuICAgICAgdGhpcy5kaXZSZW1UbyhkLHkseik7XG4gICAgICB3aGlsZSh5LnNpZ251bSgpID4gMCkge1xuICAgICAgICByID0gKGErei5pbnRWYWx1ZSgpKS50b1N0cmluZyhiKS5zdWJzdHIoMSkgKyByO1xuICAgICAgICB5LmRpdlJlbVRvKGQseSx6KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB6LmludFZhbHVlKCkudG9TdHJpbmcoYikgKyByO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIGNvbnZlcnQgZnJvbSByYWRpeCBzdHJpbmdcbiAgICBmdW5jdGlvbiBibnBGcm9tUmFkaXgocyxiKSB7XG4gICAgICB0aGlzLmZyb21JbnQoMCk7XG4gICAgICBpZihiID09IG51bGwpIGIgPSAxMDtcbiAgICAgIHZhciBjcyA9IHRoaXMuY2h1bmtTaXplKGIpO1xuICAgICAgdmFyIGQgPSBNYXRoLnBvdyhiLGNzKSwgbWkgPSBmYWxzZSwgaiA9IDAsIHcgPSAwO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHggPSBpbnRBdChzLGkpO1xuICAgICAgICBpZih4IDwgMCkge1xuICAgICAgICAgIGlmKHMuY2hhckF0KGkpID09IFwiLVwiICYmIHRoaXMuc2lnbnVtKCkgPT0gMCkgbWkgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHcgPSBiKncreDtcbiAgICAgICAgaWYoKytqID49IGNzKSB7XG4gICAgICAgICAgdGhpcy5kTXVsdGlwbHkoZCk7XG4gICAgICAgICAgdGhpcy5kQWRkT2Zmc2V0KHcsMCk7XG4gICAgICAgICAgaiA9IDA7XG4gICAgICAgICAgdyA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKGogPiAwKSB7XG4gICAgICAgIHRoaXMuZE11bHRpcGx5KE1hdGgucG93KGIsaikpO1xuICAgICAgICB0aGlzLmRBZGRPZmZzZXQodywwKTtcbiAgICAgIH1cbiAgICAgIGlmKG1pKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBhbHRlcm5hdGUgY29uc3RydWN0b3JcbiAgICBmdW5jdGlvbiBibnBGcm9tTnVtYmVyKGEsYixjKSB7XG4gICAgICBpZihcIm51bWJlclwiID09IHR5cGVvZiBiKSB7XG4gICAgICAgIC8vIG5ldyBCaWdJbnRlZ2VyKGludCxpbnQsUk5HKVxuICAgICAgICBpZihhIDwgMikgdGhpcy5mcm9tSW50KDEpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZyb21OdW1iZXIoYSxjKTtcbiAgICAgICAgICBpZighdGhpcy50ZXN0Qml0KGEtMSkpICAgIC8vIGZvcmNlIE1TQiBzZXRcbiAgICAgICAgICAgIHRoaXMuYml0d2lzZVRvKEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChhLTEpLG9wX29yLHRoaXMpO1xuICAgICAgICAgIGlmKHRoaXMuaXNFdmVuKCkpIHRoaXMuZEFkZE9mZnNldCgxLDApOyAvLyBmb3JjZSBvZGRcbiAgICAgICAgICB3aGlsZSghdGhpcy5pc1Byb2JhYmxlUHJpbWUoYikpIHtcbiAgICAgICAgICAgIHRoaXMuZEFkZE9mZnNldCgyLDApO1xuICAgICAgICAgICAgaWYodGhpcy5iaXRMZW5ndGgoKSA+IGEpIHRoaXMuc3ViVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGEtMSksdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy8gbmV3IEJpZ0ludGVnZXIoaW50LFJORylcbiAgICAgICAgdmFyIHggPSBuZXcgQXJyYXkoKSwgdCA9IGEmNztcbiAgICAgICAgeC5sZW5ndGggPSAoYT4+MykrMTtcbiAgICAgICAgYi5uZXh0Qnl0ZXMoeCk7XG4gICAgICAgIGlmKHQgPiAwKSB4WzBdICY9ICgoMTw8dCktMSk7IGVsc2UgeFswXSA9IDA7XG4gICAgICAgIHRoaXMuZnJvbVN0cmluZyh4LDI1Nik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgY29udmVydCB0byBiaWdlbmRpYW4gYnl0ZSBhcnJheVxuICAgIGZ1bmN0aW9uIGJuVG9CeXRlQXJyYXkoKSB7XG4gICAgICB2YXIgaSA9IHRoaXMudCwgciA9IG5ldyBBcnJheSgpO1xuICAgICAgclswXSA9IHRoaXMucztcbiAgICAgIHZhciBwID0gdGhpcy5EQi0oaSp0aGlzLkRCKSU4LCBkLCBrID0gMDtcbiAgICAgIGlmKGktLSA+IDApIHtcbiAgICAgICAgaWYocCA8IHRoaXMuREIgJiYgKGQgPSB0aGlzW2ldPj5wKSAhPSAodGhpcy5zJnRoaXMuRE0pPj5wKVxuICAgICAgICAgIHJbaysrXSA9IGR8KHRoaXMuczw8KHRoaXMuREItcCkpO1xuICAgICAgICB3aGlsZShpID49IDApIHtcbiAgICAgICAgICBpZihwIDwgOCkge1xuICAgICAgICAgICAgZCA9ICh0aGlzW2ldJigoMTw8cCktMSkpPDwoOC1wKTtcbiAgICAgICAgICAgIGQgfD0gdGhpc1stLWldPj4ocCs9dGhpcy5EQi04KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkID0gKHRoaXNbaV0+PihwLT04KSkmMHhmZjtcbiAgICAgICAgICAgIGlmKHAgPD0gMCkgeyBwICs9IHRoaXMuREI7IC0taTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZigoZCYweDgwKSAhPSAwKSBkIHw9IC0yNTY7XG4gICAgICAgICAgaWYoayA9PSAwICYmICh0aGlzLnMmMHg4MCkgIT0gKGQmMHg4MCkpICsraztcbiAgICAgICAgICBpZihrID4gMCB8fCBkICE9IHRoaXMucykgcltrKytdID0gZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYm5FcXVhbHMoYSkgeyByZXR1cm4odGhpcy5jb21wYXJlVG8oYSk9PTApOyB9XG4gICAgZnVuY3Rpb24gYm5NaW4oYSkgeyByZXR1cm4odGhpcy5jb21wYXJlVG8oYSk8MCk/dGhpczphOyB9XG4gICAgZnVuY3Rpb24gYm5NYXgoYSkgeyByZXR1cm4odGhpcy5jb21wYXJlVG8oYSk+MCk/dGhpczphOyB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyBvcCBhIChiaXR3aXNlKVxuICAgIGZ1bmN0aW9uIGJucEJpdHdpc2VUbyhhLG9wLHIpIHtcbiAgICAgIHZhciBpLCBmLCBtID0gTWF0aC5taW4oYS50LHRoaXMudCk7XG4gICAgICBmb3IoaSA9IDA7IGkgPCBtOyArK2kpIHJbaV0gPSBvcCh0aGlzW2ldLGFbaV0pO1xuICAgICAgaWYoYS50IDwgdGhpcy50KSB7XG4gICAgICAgIGYgPSBhLnMmdGhpcy5ETTtcbiAgICAgICAgZm9yKGkgPSBtOyBpIDwgdGhpcy50OyArK2kpIHJbaV0gPSBvcCh0aGlzW2ldLGYpO1xuICAgICAgICByLnQgPSB0aGlzLnQ7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgZiA9IHRoaXMucyZ0aGlzLkRNO1xuICAgICAgICBmb3IoaSA9IG07IGkgPCBhLnQ7ICsraSkgcltpXSA9IG9wKGYsYVtpXSk7XG4gICAgICAgIHIudCA9IGEudDtcbiAgICAgIH1cbiAgICAgIHIucyA9IG9wKHRoaXMucyxhLnMpO1xuICAgICAgci5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgJiBhXG4gICAgZnVuY3Rpb24gb3BfYW5kKHgseSkgeyByZXR1cm4geCZ5OyB9XG4gICAgZnVuY3Rpb24gYm5BbmQoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmJpdHdpc2VUbyhhLG9wX2FuZCxyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgfCBhXG4gICAgZnVuY3Rpb24gb3Bfb3IoeCx5KSB7IHJldHVybiB4fHk7IH1cbiAgICBmdW5jdGlvbiBibk9yKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5iaXR3aXNlVG8oYSxvcF9vcixyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgXiBhXG4gICAgZnVuY3Rpb24gb3BfeG9yKHgseSkgeyByZXR1cm4geF55OyB9XG4gICAgZnVuY3Rpb24gYm5Yb3IoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmJpdHdpc2VUbyhhLG9wX3hvcixyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgJiB+YVxuICAgIGZ1bmN0aW9uIG9wX2FuZG5vdCh4LHkpIHsgcmV0dXJuIHgmfnk7IH1cbiAgICBmdW5jdGlvbiBibkFuZE5vdChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfYW5kbm90LHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgfnRoaXNcbiAgICBmdW5jdGlvbiBibk5vdCgpIHtcbiAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy50OyArK2kpIHJbaV0gPSB0aGlzLkRNJn50aGlzW2ldO1xuICAgICAgci50ID0gdGhpcy50O1xuICAgICAgci5zID0gfnRoaXMucztcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgPDwgblxuICAgIGZ1bmN0aW9uIGJuU2hpZnRMZWZ0KG4pIHtcbiAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICBpZihuIDwgMCkgdGhpcy5yU2hpZnRUbygtbixyKTsgZWxzZSB0aGlzLmxTaGlmdFRvKG4scik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzID4+IG5cbiAgICBmdW5jdGlvbiBiblNoaWZ0UmlnaHQobikge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIGlmKG4gPCAwKSB0aGlzLmxTaGlmdFRvKC1uLHIpOyBlbHNlIHRoaXMuclNoaWZ0VG8obixyKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIHJldHVybiBpbmRleCBvZiBsb3dlc3QgMS1iaXQgaW4geCwgeCA8IDJeMzFcbiAgICBmdW5jdGlvbiBsYml0KHgpIHtcbiAgICAgIGlmKHggPT0gMCkgcmV0dXJuIC0xO1xuICAgICAgdmFyIHIgPSAwO1xuICAgICAgaWYoKHgmMHhmZmZmKSA9PSAwKSB7IHggPj49IDE2OyByICs9IDE2OyB9XG4gICAgICBpZigoeCYweGZmKSA9PSAwKSB7IHggPj49IDg7IHIgKz0gODsgfVxuICAgICAgaWYoKHgmMHhmKSA9PSAwKSB7IHggPj49IDQ7IHIgKz0gNDsgfVxuICAgICAgaWYoKHgmMykgPT0gMCkgeyB4ID4+PSAyOyByICs9IDI7IH1cbiAgICAgIGlmKCh4JjEpID09IDApICsrcjtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybnMgaW5kZXggb2YgbG93ZXN0IDEtYml0IChvciAtMSBpZiBub25lKVxuICAgIGZ1bmN0aW9uIGJuR2V0TG93ZXN0U2V0Qml0KCkge1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMudDsgKytpKVxuICAgICAgICBpZih0aGlzW2ldICE9IDApIHJldHVybiBpKnRoaXMuREIrbGJpdCh0aGlzW2ldKTtcbiAgICAgIGlmKHRoaXMucyA8IDApIHJldHVybiB0aGlzLnQqdGhpcy5EQjtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gbnVtYmVyIG9mIDEgYml0cyBpbiB4XG4gICAgZnVuY3Rpb24gY2JpdCh4KSB7XG4gICAgICB2YXIgciA9IDA7XG4gICAgICB3aGlsZSh4ICE9IDApIHsgeCAmPSB4LTE7ICsrcjsgfVxuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIG51bWJlciBvZiBzZXQgYml0c1xuICAgIGZ1bmN0aW9uIGJuQml0Q291bnQoKSB7XG4gICAgICB2YXIgciA9IDAsIHggPSB0aGlzLnMmdGhpcy5ETTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnQ7ICsraSkgciArPSBjYml0KHRoaXNbaV1eeCk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0cnVlIGlmZiBudGggYml0IGlzIHNldFxuICAgIGZ1bmN0aW9uIGJuVGVzdEJpdChuKSB7XG4gICAgICB2YXIgaiA9IE1hdGguZmxvb3Iobi90aGlzLkRCKTtcbiAgICAgIGlmKGogPj0gdGhpcy50KSByZXR1cm4odGhpcy5zIT0wKTtcbiAgICAgIHJldHVybigodGhpc1tqXSYoMTw8KG4ldGhpcy5EQikpKSE9MCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgdGhpcyBvcCAoMTw8bilcbiAgICBmdW5jdGlvbiBibnBDaGFuZ2VCaXQobixvcCkge1xuICAgICAgdmFyIHIgPSBCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQobik7XG4gICAgICB0aGlzLmJpdHdpc2VUbyhyLG9wLHIpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyB8ICgxPDxuKVxuICAgIGZ1bmN0aW9uIGJuU2V0Qml0KG4pIHsgcmV0dXJuIHRoaXMuY2hhbmdlQml0KG4sb3Bfb3IpOyB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzICYgfigxPDxuKVxuICAgIGZ1bmN0aW9uIGJuQ2xlYXJCaXQobikgeyByZXR1cm4gdGhpcy5jaGFuZ2VCaXQobixvcF9hbmRub3QpOyB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzIF4gKDE8PG4pXG4gICAgZnVuY3Rpb24gYm5GbGlwQml0KG4pIHsgcmV0dXJuIHRoaXMuY2hhbmdlQml0KG4sb3BfeG9yKTsgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgKyBhXG4gICAgZnVuY3Rpb24gYm5wQWRkVG8oYSxyKSB7XG4gICAgICB2YXIgaSA9IDAsIGMgPSAwLCBtID0gTWF0aC5taW4oYS50LHRoaXMudCk7XG4gICAgICB3aGlsZShpIDwgbSkge1xuICAgICAgICBjICs9IHRoaXNbaV0rYVtpXTtcbiAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgfVxuICAgICAgaWYoYS50IDwgdGhpcy50KSB7XG4gICAgICAgIGMgKz0gYS5zO1xuICAgICAgICB3aGlsZShpIDwgdGhpcy50KSB7XG4gICAgICAgICAgYyArPSB0aGlzW2ldO1xuICAgICAgICAgIHJbaSsrXSA9IGMmdGhpcy5ETTtcbiAgICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgICB9XG4gICAgICAgIGMgKz0gdGhpcy5zO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGMgKz0gdGhpcy5zO1xuICAgICAgICB3aGlsZShpIDwgYS50KSB7XG4gICAgICAgICAgYyArPSBhW2ldO1xuICAgICAgICAgIHJbaSsrXSA9IGMmdGhpcy5ETTtcbiAgICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgICB9XG4gICAgICAgIGMgKz0gYS5zO1xuICAgICAgfVxuICAgICAgci5zID0gKGM8MCk/LTE6MDtcbiAgICAgIGlmKGMgPiAwKSByW2krK10gPSBjO1xuICAgICAgZWxzZSBpZihjIDwgLTEpIHJbaSsrXSA9IHRoaXMuRFYrYztcbiAgICAgIHIudCA9IGk7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyArIGFcbiAgICBmdW5jdGlvbiBibkFkZChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYWRkVG8oYSxyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgLSBhXG4gICAgZnVuY3Rpb24gYm5TdWJ0cmFjdChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuc3ViVG8oYSxyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgKiBhXG4gICAgZnVuY3Rpb24gYm5NdWx0aXBseShhKSB7IHZhciByID0gbmJpKCk7IHRoaXMubXVsdGlwbHlUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpc14yXG4gICAgZnVuY3Rpb24gYm5TcXVhcmUoKSB7IHZhciByID0gbmJpKCk7IHRoaXMuc3F1YXJlVG8ocik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzIC8gYVxuICAgIGZ1bmN0aW9uIGJuRGl2aWRlKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5kaXZSZW1UbyhhLHIsbnVsbCk7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzICUgYVxuICAgIGZ1bmN0aW9uIGJuUmVtYWluZGVyKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5kaXZSZW1UbyhhLG51bGwscik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSBbdGhpcy9hLHRoaXMlYV1cbiAgICBmdW5jdGlvbiBibkRpdmlkZUFuZFJlbWFpbmRlcihhKSB7XG4gICAgICB2YXIgcSA9IG5iaSgpLCByID0gbmJpKCk7XG4gICAgICB0aGlzLmRpdlJlbVRvKGEscSxyKTtcbiAgICAgIHJldHVybiBuZXcgQXJyYXkocSxyKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0aGlzICo9IG4sIHRoaXMgPj0gMCwgMSA8IG4gPCBEVlxuICAgIGZ1bmN0aW9uIGJucERNdWx0aXBseShuKSB7XG4gICAgICB0aGlzW3RoaXMudF0gPSB0aGlzLmFtKDAsbi0xLHRoaXMsMCwwLHRoaXMudCk7XG4gICAgICArK3RoaXMudDtcbiAgICAgIHRoaXMuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0aGlzICs9IG4gPDwgdyB3b3JkcywgdGhpcyA+PSAwXG4gICAgZnVuY3Rpb24gYm5wREFkZE9mZnNldChuLHcpIHtcbiAgICAgIGlmKG4gPT0gMCkgcmV0dXJuO1xuICAgICAgd2hpbGUodGhpcy50IDw9IHcpIHRoaXNbdGhpcy50KytdID0gMDtcbiAgICAgIHRoaXNbd10gKz0gbjtcbiAgICAgIHdoaWxlKHRoaXNbd10gPj0gdGhpcy5EVikge1xuICAgICAgICB0aGlzW3ddIC09IHRoaXMuRFY7XG4gICAgICAgIGlmKCsrdyA+PSB0aGlzLnQpIHRoaXNbdGhpcy50KytdID0gMDtcbiAgICAgICAgKyt0aGlzW3ddO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEEgXCJudWxsXCIgcmVkdWNlclxuICAgIGZ1bmN0aW9uIE51bGxFeHAoKSB7fVxuICAgIGZ1bmN0aW9uIG5Ob3AoeCkgeyByZXR1cm4geDsgfVxuICAgIGZ1bmN0aW9uIG5NdWxUbyh4LHkscikgeyB4Lm11bHRpcGx5VG8oeSxyKTsgfVxuICAgIGZ1bmN0aW9uIG5TcXJUbyh4LHIpIHsgeC5zcXVhcmVUbyhyKTsgfVxuXG4gICAgTnVsbEV4cC5wcm90b3R5cGUuY29udmVydCA9IG5Ob3A7XG4gICAgTnVsbEV4cC5wcm90b3R5cGUucmV2ZXJ0ID0gbk5vcDtcbiAgICBOdWxsRXhwLnByb3RvdHlwZS5tdWxUbyA9IG5NdWxUbztcbiAgICBOdWxsRXhwLnByb3RvdHlwZS5zcXJUbyA9IG5TcXJUbztcblxuICAgIC8vIChwdWJsaWMpIHRoaXNeZVxuICAgIGZ1bmN0aW9uIGJuUG93KGUpIHsgcmV0dXJuIHRoaXMuZXhwKGUsbmV3IE51bGxFeHAoKSk7IH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSBsb3dlciBuIHdvcmRzIG9mIFwidGhpcyAqIGFcIiwgYS50IDw9IG5cbiAgICAvLyBcInRoaXNcIiBzaG91bGQgYmUgdGhlIGxhcmdlciBvbmUgaWYgYXBwcm9wcmlhdGUuXG4gICAgZnVuY3Rpb24gYm5wTXVsdGlwbHlMb3dlclRvKGEsbixyKSB7XG4gICAgICB2YXIgaSA9IE1hdGgubWluKHRoaXMudCthLnQsbik7XG4gICAgICByLnMgPSAwOyAvLyBhc3N1bWVzIGEsdGhpcyA+PSAwXG4gICAgICByLnQgPSBpO1xuICAgICAgd2hpbGUoaSA+IDApIHJbLS1pXSA9IDA7XG4gICAgICB2YXIgajtcbiAgICAgIGZvcihqID0gci50LXRoaXMudDsgaSA8IGo7ICsraSkgcltpK3RoaXMudF0gPSB0aGlzLmFtKDAsYVtpXSxyLGksMCx0aGlzLnQpO1xuICAgICAgZm9yKGogPSBNYXRoLm1pbihhLnQsbik7IGkgPCBqOyArK2kpIHRoaXMuYW0oMCxhW2ldLHIsaSwwLG4taSk7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IFwidGhpcyAqIGFcIiB3aXRob3V0IGxvd2VyIG4gd29yZHMsIG4gPiAwXG4gICAgLy8gXCJ0aGlzXCIgc2hvdWxkIGJlIHRoZSBsYXJnZXIgb25lIGlmIGFwcHJvcHJpYXRlLlxuICAgIGZ1bmN0aW9uIGJucE11bHRpcGx5VXBwZXJUbyhhLG4scikge1xuICAgICAgLS1uO1xuICAgICAgdmFyIGkgPSByLnQgPSB0aGlzLnQrYS50LW47XG4gICAgICByLnMgPSAwOyAvLyBhc3N1bWVzIGEsdGhpcyA+PSAwXG4gICAgICB3aGlsZSgtLWkgPj0gMCkgcltpXSA9IDA7XG4gICAgICBmb3IoaSA9IE1hdGgubWF4KG4tdGhpcy50LDApOyBpIDwgYS50OyArK2kpXG4gICAgICAgIHJbdGhpcy50K2ktbl0gPSB0aGlzLmFtKG4taSxhW2ldLHIsMCwwLHRoaXMudCtpLW4pO1xuICAgICAgci5jbGFtcCgpO1xuICAgICAgci5kclNoaWZ0VG8oMSxyKTtcbiAgICB9XG5cbiAgICAvLyBCYXJyZXR0IG1vZHVsYXIgcmVkdWN0aW9uXG4gICAgZnVuY3Rpb24gQmFycmV0dChtKSB7XG4gICAgICAvLyBzZXR1cCBCYXJyZXR0XG4gICAgICB0aGlzLnIyID0gbmJpKCk7XG4gICAgICB0aGlzLnEzID0gbmJpKCk7XG4gICAgICBCaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8oMiptLnQsdGhpcy5yMik7XG4gICAgICB0aGlzLm11ID0gdGhpcy5yMi5kaXZpZGUobSk7XG4gICAgICB0aGlzLm0gPSBtO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJhcnJldHRDb252ZXJ0KHgpIHtcbiAgICAgIGlmKHgucyA8IDAgfHwgeC50ID4gMip0aGlzLm0udCkgcmV0dXJuIHgubW9kKHRoaXMubSk7XG4gICAgICBlbHNlIGlmKHguY29tcGFyZVRvKHRoaXMubSkgPCAwKSByZXR1cm4geDtcbiAgICAgIGVsc2UgeyB2YXIgciA9IG5iaSgpOyB4LmNvcHlUbyhyKTsgdGhpcy5yZWR1Y2Uocik7IHJldHVybiByOyB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYmFycmV0dFJldmVydCh4KSB7IHJldHVybiB4OyB9XG5cbiAgICAvLyB4ID0geCBtb2QgbSAoSEFDIDE0LjQyKVxuICAgIGZ1bmN0aW9uIGJhcnJldHRSZWR1Y2UoeCkge1xuICAgICAgeC5kclNoaWZ0VG8odGhpcy5tLnQtMSx0aGlzLnIyKTtcbiAgICAgIGlmKHgudCA+IHRoaXMubS50KzEpIHsgeC50ID0gdGhpcy5tLnQrMTsgeC5jbGFtcCgpOyB9XG4gICAgICB0aGlzLm11Lm11bHRpcGx5VXBwZXJUbyh0aGlzLnIyLHRoaXMubS50KzEsdGhpcy5xMyk7XG4gICAgICB0aGlzLm0ubXVsdGlwbHlMb3dlclRvKHRoaXMucTMsdGhpcy5tLnQrMSx0aGlzLnIyKTtcbiAgICAgIHdoaWxlKHguY29tcGFyZVRvKHRoaXMucjIpIDwgMCkgeC5kQWRkT2Zmc2V0KDEsdGhpcy5tLnQrMSk7XG4gICAgICB4LnN1YlRvKHRoaXMucjIseCk7XG4gICAgICB3aGlsZSh4LmNvbXBhcmVUbyh0aGlzLm0pID49IDApIHguc3ViVG8odGhpcy5tLHgpO1xuICAgIH1cblxuICAgIC8vIHIgPSB4XjIgbW9kIG07IHggIT0gclxuICAgIGZ1bmN0aW9uIGJhcnJldHRTcXJUbyh4LHIpIHsgeC5zcXVhcmVUbyhyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuICAgIC8vIHIgPSB4KnkgbW9kIG07IHgseSAhPSByXG4gICAgZnVuY3Rpb24gYmFycmV0dE11bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG4gICAgQmFycmV0dC5wcm90b3R5cGUuY29udmVydCA9IGJhcnJldHRDb252ZXJ0O1xuICAgIEJhcnJldHQucHJvdG90eXBlLnJldmVydCA9IGJhcnJldHRSZXZlcnQ7XG4gICAgQmFycmV0dC5wcm90b3R5cGUucmVkdWNlID0gYmFycmV0dFJlZHVjZTtcbiAgICBCYXJyZXR0LnByb3RvdHlwZS5tdWxUbyA9IGJhcnJldHRNdWxUbztcbiAgICBCYXJyZXR0LnByb3RvdHlwZS5zcXJUbyA9IGJhcnJldHRTcXJUbztcblxuICAgIC8vIChwdWJsaWMpIHRoaXNeZSAlIG0gKEhBQyAxNC44NSlcbiAgICBmdW5jdGlvbiBibk1vZFBvdyhlLG0pIHtcbiAgICAgIHZhciBpID0gZS5iaXRMZW5ndGgoKSwgaywgciA9IG5idigxKSwgejtcbiAgICAgIGlmKGkgPD0gMCkgcmV0dXJuIHI7XG4gICAgICBlbHNlIGlmKGkgPCAxOCkgayA9IDE7XG4gICAgICBlbHNlIGlmKGkgPCA0OCkgayA9IDM7XG4gICAgICBlbHNlIGlmKGkgPCAxNDQpIGsgPSA0O1xuICAgICAgZWxzZSBpZihpIDwgNzY4KSBrID0gNTtcbiAgICAgIGVsc2UgayA9IDY7XG4gICAgICBpZihpIDwgOClcbiAgICAgICAgeiA9IG5ldyBDbGFzc2ljKG0pO1xuICAgICAgZWxzZSBpZihtLmlzRXZlbigpKVxuICAgICAgICB6ID0gbmV3IEJhcnJldHQobSk7XG4gICAgICBlbHNlXG4gICAgICAgIHogPSBuZXcgTW9udGdvbWVyeShtKTtcblxuICAgICAgLy8gcHJlY29tcHV0YXRpb25cbiAgICAgIHZhciBnID0gbmV3IEFycmF5KCksIG4gPSAzLCBrMSA9IGstMSwga20gPSAoMTw8ayktMTtcbiAgICAgIGdbMV0gPSB6LmNvbnZlcnQodGhpcyk7XG4gICAgICBpZihrID4gMSkge1xuICAgICAgICB2YXIgZzIgPSBuYmkoKTtcbiAgICAgICAgei5zcXJUbyhnWzFdLGcyKTtcbiAgICAgICAgd2hpbGUobiA8PSBrbSkge1xuICAgICAgICAgIGdbbl0gPSBuYmkoKTtcbiAgICAgICAgICB6Lm11bFRvKGcyLGdbbi0yXSxnW25dKTtcbiAgICAgICAgICBuICs9IDI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGogPSBlLnQtMSwgdywgaXMxID0gdHJ1ZSwgcjIgPSBuYmkoKSwgdDtcbiAgICAgIGkgPSBuYml0cyhlW2pdKS0xO1xuICAgICAgd2hpbGUoaiA+PSAwKSB7XG4gICAgICAgIGlmKGkgPj0gazEpIHcgPSAoZVtqXT4+KGktazEpKSZrbTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdyA9IChlW2pdJigoMTw8KGkrMSkpLTEpKTw8KGsxLWkpO1xuICAgICAgICAgIGlmKGogPiAwKSB3IHw9IGVbai0xXT4+KHRoaXMuREIraS1rMSk7XG4gICAgICAgIH1cblxuICAgICAgICBuID0gaztcbiAgICAgICAgd2hpbGUoKHcmMSkgPT0gMCkgeyB3ID4+PSAxOyAtLW47IH1cbiAgICAgICAgaWYoKGkgLT0gbikgPCAwKSB7IGkgKz0gdGhpcy5EQjsgLS1qOyB9XG4gICAgICAgIGlmKGlzMSkgeyAgICAvLyByZXQgPT0gMSwgZG9uJ3QgYm90aGVyIHNxdWFyaW5nIG9yIG11bHRpcGx5aW5nIGl0XG4gICAgICAgICAgZ1t3XS5jb3B5VG8ocik7XG4gICAgICAgICAgaXMxID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgd2hpbGUobiA+IDEpIHsgei5zcXJUbyhyLHIyKTsgei5zcXJUbyhyMixyKTsgbiAtPSAyOyB9XG4gICAgICAgICAgaWYobiA+IDApIHouc3FyVG8ocixyMik7IGVsc2UgeyB0ID0gcjsgciA9IHIyOyByMiA9IHQ7IH1cbiAgICAgICAgICB6Lm11bFRvKHIyLGdbd10scik7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZShqID49IDAgJiYgKGVbal0mKDE8PGkpKSA9PSAwKSB7XG4gICAgICAgICAgei5zcXJUbyhyLHIyKTsgdCA9IHI7IHIgPSByMjsgcjIgPSB0O1xuICAgICAgICAgIGlmKC0taSA8IDApIHsgaSA9IHRoaXMuREItMTsgLS1qOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB6LnJldmVydChyKTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSBnY2QodGhpcyxhKSAoSEFDIDE0LjU0KVxuICAgIGZ1bmN0aW9uIGJuR0NEKGEpIHtcbiAgICAgIHZhciB4ID0gKHRoaXMuczwwKT90aGlzLm5lZ2F0ZSgpOnRoaXMuY2xvbmUoKTtcbiAgICAgIHZhciB5ID0gKGEuczwwKT9hLm5lZ2F0ZSgpOmEuY2xvbmUoKTtcbiAgICAgIGlmKHguY29tcGFyZVRvKHkpIDwgMCkgeyB2YXIgdCA9IHg7IHggPSB5OyB5ID0gdDsgfVxuICAgICAgdmFyIGkgPSB4LmdldExvd2VzdFNldEJpdCgpLCBnID0geS5nZXRMb3dlc3RTZXRCaXQoKTtcbiAgICAgIGlmKGcgPCAwKSByZXR1cm4geDtcbiAgICAgIGlmKGkgPCBnKSBnID0gaTtcbiAgICAgIGlmKGcgPiAwKSB7XG4gICAgICAgIHguclNoaWZ0VG8oZyx4KTtcbiAgICAgICAgeS5yU2hpZnRUbyhnLHkpO1xuICAgICAgfVxuICAgICAgd2hpbGUoeC5zaWdudW0oKSA+IDApIHtcbiAgICAgICAgaWYoKGkgPSB4LmdldExvd2VzdFNldEJpdCgpKSA+IDApIHguclNoaWZ0VG8oaSx4KTtcbiAgICAgICAgaWYoKGkgPSB5LmdldExvd2VzdFNldEJpdCgpKSA+IDApIHkuclNoaWZ0VG8oaSx5KTtcbiAgICAgICAgaWYoeC5jb21wYXJlVG8oeSkgPj0gMCkge1xuICAgICAgICAgIHguc3ViVG8oeSx4KTtcbiAgICAgICAgICB4LnJTaGlmdFRvKDEseCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgeS5zdWJUbyh4LHkpO1xuICAgICAgICAgIHkuclNoaWZ0VG8oMSx5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYoZyA+IDApIHkubFNoaWZ0VG8oZyx5KTtcbiAgICAgIHJldHVybiB5O1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXMgJSBuLCBuIDwgMl4yNlxuICAgIGZ1bmN0aW9uIGJucE1vZEludChuKSB7XG4gICAgICBpZihuIDw9IDApIHJldHVybiAwO1xuICAgICAgdmFyIGQgPSB0aGlzLkRWJW4sIHIgPSAodGhpcy5zPDApP24tMTowO1xuICAgICAgaWYodGhpcy50ID4gMClcbiAgICAgICAgaWYoZCA9PSAwKSByID0gdGhpc1swXSVuO1xuICAgICAgICBlbHNlIGZvcih2YXIgaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkgciA9IChkKnIrdGhpc1tpXSklbjtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIDEvdGhpcyAlIG0gKEhBQyAxNC42MSlcbiAgICBmdW5jdGlvbiBibk1vZEludmVyc2UobSkge1xuICAgICAgdmFyIGFjID0gbS5pc0V2ZW4oKTtcbiAgICAgIGlmKCh0aGlzLmlzRXZlbigpICYmIGFjKSB8fCBtLnNpZ251bSgpID09IDApIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87XG4gICAgICB2YXIgdSA9IG0uY2xvbmUoKSwgdiA9IHRoaXMuY2xvbmUoKTtcbiAgICAgIHZhciBhID0gbmJ2KDEpLCBiID0gbmJ2KDApLCBjID0gbmJ2KDApLCBkID0gbmJ2KDEpO1xuICAgICAgd2hpbGUodS5zaWdudW0oKSAhPSAwKSB7XG4gICAgICAgIHdoaWxlKHUuaXNFdmVuKCkpIHtcbiAgICAgICAgICB1LnJTaGlmdFRvKDEsdSk7XG4gICAgICAgICAgaWYoYWMpIHtcbiAgICAgICAgICAgIGlmKCFhLmlzRXZlbigpIHx8ICFiLmlzRXZlbigpKSB7IGEuYWRkVG8odGhpcyxhKTsgYi5zdWJUbyhtLGIpOyB9XG4gICAgICAgICAgICBhLnJTaGlmdFRvKDEsYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYoIWIuaXNFdmVuKCkpIGIuc3ViVG8obSxiKTtcbiAgICAgICAgICBiLnJTaGlmdFRvKDEsYik7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUodi5pc0V2ZW4oKSkge1xuICAgICAgICAgIHYuclNoaWZ0VG8oMSx2KTtcbiAgICAgICAgICBpZihhYykge1xuICAgICAgICAgICAgaWYoIWMuaXNFdmVuKCkgfHwgIWQuaXNFdmVuKCkpIHsgYy5hZGRUbyh0aGlzLGMpOyBkLnN1YlRvKG0sZCk7IH1cbiAgICAgICAgICAgIGMuclNoaWZ0VG8oMSxjKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZighZC5pc0V2ZW4oKSkgZC5zdWJUbyhtLGQpO1xuICAgICAgICAgIGQuclNoaWZ0VG8oMSxkKTtcbiAgICAgICAgfVxuICAgICAgICBpZih1LmNvbXBhcmVUbyh2KSA+PSAwKSB7XG4gICAgICAgICAgdS5zdWJUbyh2LHUpO1xuICAgICAgICAgIGlmKGFjKSBhLnN1YlRvKGMsYSk7XG4gICAgICAgICAgYi5zdWJUbyhkLGIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHYuc3ViVG8odSx2KTtcbiAgICAgICAgICBpZihhYykgYy5zdWJUbyhhLGMpO1xuICAgICAgICAgIGQuc3ViVG8oYixkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYodi5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpICE9IDApIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87XG4gICAgICBpZihkLmNvbXBhcmVUbyhtKSA+PSAwKSByZXR1cm4gZC5zdWJ0cmFjdChtKTtcbiAgICAgIGlmKGQuc2lnbnVtKCkgPCAwKSBkLmFkZFRvKG0sZCk7IGVsc2UgcmV0dXJuIGQ7XG4gICAgICBpZihkLnNpZ251bSgpIDwgMCkgcmV0dXJuIGQuYWRkKG0pOyBlbHNlIHJldHVybiBkO1xuICAgIH1cblxuICAgIHZhciBsb3dwcmltZXMgPSBbMiwzLDUsNywxMSwxMywxNywxOSwyMywyOSwzMSwzNyw0MSw0Myw0Nyw1Myw1OSw2MSw2Nyw3MSw3Myw3OSw4Myw4OSw5NywxMDEsMTAzLDEwNywxMDksMTEzLDEyNywxMzEsMTM3LDEzOSwxNDksMTUxLDE1NywxNjMsMTY3LDE3MywxNzksMTgxLDE5MSwxOTMsMTk3LDE5OSwyMTEsMjIzLDIyNywyMjksMjMzLDIzOSwyNDEsMjUxLDI1NywyNjMsMjY5LDI3MSwyNzcsMjgxLDI4MywyOTMsMzA3LDMxMSwzMTMsMzE3LDMzMSwzMzcsMzQ3LDM0OSwzNTMsMzU5LDM2NywzNzMsMzc5LDM4MywzODksMzk3LDQwMSw0MDksNDE5LDQyMSw0MzEsNDMzLDQzOSw0NDMsNDQ5LDQ1Nyw0NjEsNDYzLDQ2Nyw0NzksNDg3LDQ5MSw0OTksNTAzLDUwOSw1MjEsNTIzLDU0MSw1NDcsNTU3LDU2Myw1NjksNTcxLDU3Nyw1ODcsNTkzLDU5OSw2MDEsNjA3LDYxMyw2MTcsNjE5LDYzMSw2NDEsNjQzLDY0Nyw2NTMsNjU5LDY2MSw2NzMsNjc3LDY4Myw2OTEsNzAxLDcwOSw3MTksNzI3LDczMyw3MzksNzQzLDc1MSw3NTcsNzYxLDc2OSw3NzMsNzg3LDc5Nyw4MDksODExLDgyMSw4MjMsODI3LDgyOSw4MzksODUzLDg1Nyw4NTksODYzLDg3Nyw4ODEsODgzLDg4Nyw5MDcsOTExLDkxOSw5MjksOTM3LDk0MSw5NDcsOTUzLDk2Nyw5NzEsOTc3LDk4Myw5OTEsOTk3XTtcbiAgICB2YXIgbHBsaW0gPSAoMTw8MjYpL2xvd3ByaW1lc1tsb3dwcmltZXMubGVuZ3RoLTFdO1xuXG4gICAgLy8gKHB1YmxpYykgdGVzdCBwcmltYWxpdHkgd2l0aCBjZXJ0YWludHkgPj0gMS0uNV50XG4gICAgZnVuY3Rpb24gYm5Jc1Byb2JhYmxlUHJpbWUodCkge1xuICAgICAgdmFyIGksIHggPSB0aGlzLmFicygpO1xuICAgICAgaWYoeC50ID09IDEgJiYgeFswXSA8PSBsb3dwcmltZXNbbG93cHJpbWVzLmxlbmd0aC0xXSkge1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBsb3dwcmltZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgaWYoeFswXSA9PSBsb3dwcmltZXNbaV0pIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZih4LmlzRXZlbigpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpID0gMTtcbiAgICAgIHdoaWxlKGkgPCBsb3dwcmltZXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBtID0gbG93cHJpbWVzW2ldLCBqID0gaSsxO1xuICAgICAgICB3aGlsZShqIDwgbG93cHJpbWVzLmxlbmd0aCAmJiBtIDwgbHBsaW0pIG0gKj0gbG93cHJpbWVzW2orK107XG4gICAgICAgIG0gPSB4Lm1vZEludChtKTtcbiAgICAgICAgd2hpbGUoaSA8IGopIGlmKG0lbG93cHJpbWVzW2krK10gPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHgubWlsbGVyUmFiaW4odCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgdHJ1ZSBpZiBwcm9iYWJseSBwcmltZSAoSEFDIDQuMjQsIE1pbGxlci1SYWJpbilcbiAgICBmdW5jdGlvbiBibnBNaWxsZXJSYWJpbih0KSB7XG4gICAgICB2YXIgbjEgPSB0aGlzLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTtcbiAgICAgIHZhciBrID0gbjEuZ2V0TG93ZXN0U2V0Qml0KCk7XG4gICAgICBpZihrIDw9IDApIHJldHVybiBmYWxzZTtcbiAgICAgIHZhciByID0gbjEuc2hpZnRSaWdodChrKTtcbiAgICAgIHQgPSAodCsxKT4+MTtcbiAgICAgIGlmKHQgPiBsb3dwcmltZXMubGVuZ3RoKSB0ID0gbG93cHJpbWVzLmxlbmd0aDtcbiAgICAgIHZhciBhID0gbmJpKCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdDsgKytpKSB7XG4gICAgICAgIC8vUGljayBiYXNlcyBhdCByYW5kb20sIGluc3RlYWQgb2Ygc3RhcnRpbmcgYXQgMlxuICAgICAgICBhLmZyb21JbnQobG93cHJpbWVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsb3dwcmltZXMubGVuZ3RoKV0pO1xuICAgICAgICB2YXIgeSA9IGEubW9kUG93KHIsdGhpcyk7XG4gICAgICAgIGlmKHkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSAhPSAwICYmIHkuY29tcGFyZVRvKG4xKSAhPSAwKSB7XG4gICAgICAgICAgdmFyIGogPSAxO1xuICAgICAgICAgIHdoaWxlKGorKyA8IGsgJiYgeS5jb21wYXJlVG8objEpICE9IDApIHtcbiAgICAgICAgICAgIHkgPSB5Lm1vZFBvd0ludCgyLHRoaXMpO1xuICAgICAgICAgICAgaWYoeS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoeS5jb21wYXJlVG8objEpICE9IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gcHJvdGVjdGVkXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2h1bmtTaXplID0gYm5wQ2h1bmtTaXplO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnRvUmFkaXggPSBibnBUb1JhZGl4O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21SYWRpeCA9IGJucEZyb21SYWRpeDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tTnVtYmVyID0gYm5wRnJvbU51bWJlcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXR3aXNlVG8gPSBibnBCaXR3aXNlVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2hhbmdlQml0ID0gYm5wQ2hhbmdlQml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFkZFRvID0gYm5wQWRkVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZE11bHRpcGx5ID0gYm5wRE11bHRpcGx5O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmRBZGRPZmZzZXQgPSBibnBEQWRkT2Zmc2V0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5TG93ZXJUbyA9IGJucE11bHRpcGx5TG93ZXJUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVVwcGVyVG8gPSBibnBNdWx0aXBseVVwcGVyVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW50ID0gYm5wTW9kSW50O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1pbGxlclJhYmluID0gYm5wTWlsbGVyUmFiaW47XG5cbiAgICAvLyBwdWJsaWNcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbG9uZSA9IGJuQ2xvbmU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaW50VmFsdWUgPSBibkludFZhbHVlO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJ5dGVWYWx1ZSA9IGJuQnl0ZVZhbHVlO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNob3J0VmFsdWUgPSBiblNob3J0VmFsdWU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc2lnbnVtID0gYm5TaWdOdW07XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUudG9CeXRlQXJyYXkgPSBiblRvQnl0ZUFycmF5O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmVxdWFscyA9IGJuRXF1YWxzO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1pbiA9IGJuTWluO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1heCA9IGJuTWF4O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFuZCA9IGJuQW5kO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm9yID0gYm5PcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS54b3IgPSBiblhvcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmROb3QgPSBibkFuZE5vdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5ub3QgPSBibk5vdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdExlZnQgPSBiblNoaWZ0TGVmdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdFJpZ2h0ID0gYm5TaGlmdFJpZ2h0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmdldExvd2VzdFNldEJpdCA9IGJuR2V0TG93ZXN0U2V0Qml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJpdENvdW50ID0gYm5CaXRDb3VudDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS50ZXN0Qml0ID0gYm5UZXN0Qml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNldEJpdCA9IGJuU2V0Qml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNsZWFyQml0ID0gYm5DbGVhckJpdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mbGlwQml0ID0gYm5GbGlwQml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFkZCA9IGJuQWRkO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnN1YnRyYWN0ID0gYm5TdWJ0cmFjdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseSA9IGJuTXVsdGlwbHk7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlID0gYm5EaXZpZGU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUucmVtYWluZGVyID0gYm5SZW1haW5kZXI7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlQW5kUmVtYWluZGVyID0gYm5EaXZpZGVBbmRSZW1haW5kZXI7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93ID0gYm5Nb2RQb3c7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW52ZXJzZSA9IGJuTW9kSW52ZXJzZTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5wb3cgPSBiblBvdztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5nY2QgPSBibkdDRDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc1Byb2JhYmxlUHJpbWUgPSBibklzUHJvYmFibGVQcmltZTtcblxuICAgIC8vIEpTQk4tc3BlY2lmaWMgZXh0ZW5zaW9uXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlID0gYm5TcXVhcmU7XG5cbiAgICAvLyBFeHBvc2UgdGhlIEJhcnJldHQgZnVuY3Rpb25cbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5CYXJyZXR0ID0gQmFycmV0dFxuXG4gICAgLy8gQmlnSW50ZWdlciBpbnRlcmZhY2VzIG5vdCBpbXBsZW1lbnRlZCBpbiBqc2JuOlxuXG4gICAgLy8gQmlnSW50ZWdlcihpbnQgc2lnbnVtLCBieXRlW10gbWFnbml0dWRlKVxuICAgIC8vIGRvdWJsZSBkb3VibGVWYWx1ZSgpXG4gICAgLy8gZmxvYXQgZmxvYXRWYWx1ZSgpXG4gICAgLy8gaW50IGhhc2hDb2RlKClcbiAgICAvLyBsb25nIGxvbmdWYWx1ZSgpXG4gICAgLy8gc3RhdGljIEJpZ0ludGVnZXIgdmFsdWVPZihsb25nIHZhbClcblxuICAgIC8vIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIC0gcmVxdWlyZXMgYSBQUk5HIGJhY2tlbmQsIGUuZy4gcHJuZzQuanNcblxuICAgIC8vIEZvciBiZXN0IHJlc3VsdHMsIHB1dCBjb2RlIGxpa2VcbiAgICAvLyA8Ym9keSBvbkNsaWNrPSdybmdfc2VlZF90aW1lKCk7JyBvbktleVByZXNzPSdybmdfc2VlZF90aW1lKCk7Jz5cbiAgICAvLyBpbiB5b3VyIG1haW4gSFRNTCBkb2N1bWVudC5cblxuICAgIHZhciBybmdfc3RhdGU7XG4gICAgdmFyIHJuZ19wb29sO1xuICAgIHZhciBybmdfcHB0cjtcblxuICAgIC8vIE1peCBpbiBhIDMyLWJpdCBpbnRlZ2VyIGludG8gdGhlIHBvb2xcbiAgICBmdW5jdGlvbiBybmdfc2VlZF9pbnQoeCkge1xuICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gXj0geCAmIDI1NTtcbiAgICAgIHJuZ19wb29sW3JuZ19wcHRyKytdIF49ICh4ID4+IDgpICYgMjU1O1xuICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gXj0gKHggPj4gMTYpICYgMjU1O1xuICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gXj0gKHggPj4gMjQpICYgMjU1O1xuICAgICAgaWYocm5nX3BwdHIgPj0gcm5nX3BzaXplKSBybmdfcHB0ciAtPSBybmdfcHNpemU7XG4gICAgfVxuXG4gICAgLy8gTWl4IGluIHRoZSBjdXJyZW50IHRpbWUgKHcvbWlsbGlzZWNvbmRzKSBpbnRvIHRoZSBwb29sXG4gICAgZnVuY3Rpb24gcm5nX3NlZWRfdGltZSgpIHtcbiAgICAgIHJuZ19zZWVkX2ludChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgcG9vbCB3aXRoIGp1bmsgaWYgbmVlZGVkLlxuICAgIGlmKHJuZ19wb29sID09IG51bGwpIHtcbiAgICAgIHJuZ19wb29sID0gbmV3IEFycmF5KCk7XG4gICAgICBybmdfcHB0ciA9IDA7XG4gICAgICB2YXIgdDtcbiAgICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmNyeXB0bykge1xuICAgICAgICBpZiAod2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgICAgICAvLyBVc2Ugd2ViY3J5cHRvIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHZhciB1YSA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICAgICAgICB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh1YSk7XG4gICAgICAgICAgZm9yKHQgPSAwOyB0IDwgMzI7ICsrdClcbiAgICAgICAgICAgIHJuZ19wb29sW3JuZ19wcHRyKytdID0gdWFbdF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihuYXZpZ2F0b3IuYXBwTmFtZSA9PSBcIk5ldHNjYXBlXCIgJiYgbmF2aWdhdG9yLmFwcFZlcnNpb24gPCBcIjVcIikge1xuICAgICAgICAgIC8vIEV4dHJhY3QgZW50cm9weSAoMjU2IGJpdHMpIGZyb20gTlM0IFJORyBpZiBhdmFpbGFibGVcbiAgICAgICAgICB2YXIgeiA9IHdpbmRvdy5jcnlwdG8ucmFuZG9tKDMyKTtcbiAgICAgICAgICBmb3IodCA9IDA7IHQgPCB6Lmxlbmd0aDsgKyt0KVxuICAgICAgICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gPSB6LmNoYXJDb2RlQXQodCkgJiAyNTU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlKHJuZ19wcHRyIDwgcm5nX3BzaXplKSB7ICAvLyBleHRyYWN0IHNvbWUgcmFuZG9tbmVzcyBmcm9tIE1hdGgucmFuZG9tKClcbiAgICAgICAgdCA9IE1hdGguZmxvb3IoNjU1MzYgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gPSB0ID4+PiA4O1xuICAgICAgICBybmdfcG9vbFtybmdfcHB0cisrXSA9IHQgJiAyNTU7XG4gICAgICB9XG4gICAgICBybmdfcHB0ciA9IDA7XG4gICAgICBybmdfc2VlZF90aW1lKCk7XG4gICAgICAvL3JuZ19zZWVkX2ludCh3aW5kb3cuc2NyZWVuWCk7XG4gICAgICAvL3JuZ19zZWVkX2ludCh3aW5kb3cuc2NyZWVuWSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcm5nX2dldF9ieXRlKCkge1xuICAgICAgaWYocm5nX3N0YXRlID09IG51bGwpIHtcbiAgICAgICAgcm5nX3NlZWRfdGltZSgpO1xuICAgICAgICBybmdfc3RhdGUgPSBwcm5nX25ld3N0YXRlKCk7XG4gICAgICAgIHJuZ19zdGF0ZS5pbml0KHJuZ19wb29sKTtcbiAgICAgICAgZm9yKHJuZ19wcHRyID0gMDsgcm5nX3BwdHIgPCBybmdfcG9vbC5sZW5ndGg7ICsrcm5nX3BwdHIpXG4gICAgICAgICAgcm5nX3Bvb2xbcm5nX3BwdHJdID0gMDtcbiAgICAgICAgcm5nX3BwdHIgPSAwO1xuICAgICAgICAvL3JuZ19wb29sID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IGFsbG93IHJlc2VlZGluZyBhZnRlciBmaXJzdCByZXF1ZXN0XG4gICAgICByZXR1cm4gcm5nX3N0YXRlLm5leHQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBybmdfZ2V0X2J5dGVzKGJhKSB7XG4gICAgICB2YXIgaTtcbiAgICAgIGZvcihpID0gMDsgaSA8IGJhLmxlbmd0aDsgKytpKSBiYVtpXSA9IHJuZ19nZXRfYnl0ZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFNlY3VyZVJhbmRvbSgpIHt9XG5cbiAgICBTZWN1cmVSYW5kb20ucHJvdG90eXBlLm5leHRCeXRlcyA9IHJuZ19nZXRfYnl0ZXM7XG5cbiAgICAvLyBwcm5nNC5qcyAtIHVzZXMgQXJjZm91ciBhcyBhIFBSTkdcblxuICAgIGZ1bmN0aW9uIEFyY2ZvdXIoKSB7XG4gICAgICB0aGlzLmkgPSAwO1xuICAgICAgdGhpcy5qID0gMDtcbiAgICAgIHRoaXMuUyA9IG5ldyBBcnJheSgpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgYXJjZm91ciBjb250ZXh0IGZyb20ga2V5LCBhbiBhcnJheSBvZiBpbnRzLCBlYWNoIGZyb20gWzAuLjI1NV1cbiAgICBmdW5jdGlvbiBBUkM0aW5pdChrZXkpIHtcbiAgICAgIHZhciBpLCBqLCB0O1xuICAgICAgZm9yKGkgPSAwOyBpIDwgMjU2OyArK2kpXG4gICAgICAgIHRoaXMuU1tpXSA9IGk7XG4gICAgICBqID0gMDtcbiAgICAgIGZvcihpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gICAgICAgIGogPSAoaiArIHRoaXMuU1tpXSArIGtleVtpICUga2V5Lmxlbmd0aF0pICYgMjU1O1xuICAgICAgICB0ID0gdGhpcy5TW2ldO1xuICAgICAgICB0aGlzLlNbaV0gPSB0aGlzLlNbal07XG4gICAgICAgIHRoaXMuU1tqXSA9IHQ7XG4gICAgICB9XG4gICAgICB0aGlzLmkgPSAwO1xuICAgICAgdGhpcy5qID0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBBUkM0bmV4dCgpIHtcbiAgICAgIHZhciB0O1xuICAgICAgdGhpcy5pID0gKHRoaXMuaSArIDEpICYgMjU1O1xuICAgICAgdGhpcy5qID0gKHRoaXMuaiArIHRoaXMuU1t0aGlzLmldKSAmIDI1NTtcbiAgICAgIHQgPSB0aGlzLlNbdGhpcy5pXTtcbiAgICAgIHRoaXMuU1t0aGlzLmldID0gdGhpcy5TW3RoaXMual07XG4gICAgICB0aGlzLlNbdGhpcy5qXSA9IHQ7XG4gICAgICByZXR1cm4gdGhpcy5TWyh0ICsgdGhpcy5TW3RoaXMuaV0pICYgMjU1XTtcbiAgICB9XG5cbiAgICBBcmNmb3VyLnByb3RvdHlwZS5pbml0ID0gQVJDNGluaXQ7XG4gICAgQXJjZm91ci5wcm90b3R5cGUubmV4dCA9IEFSQzRuZXh0O1xuXG4gICAgLy8gUGx1ZyBpbiB5b3VyIFJORyBjb25zdHJ1Y3RvciBoZXJlXG4gICAgZnVuY3Rpb24gcHJuZ19uZXdzdGF0ZSgpIHtcbiAgICAgIHJldHVybiBuZXcgQXJjZm91cigpO1xuICAgIH1cblxuICAgIC8vIFBvb2wgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBhbmQgZ3JlYXRlciB0aGFuIDMyLlxuICAgIC8vIEFuIGFycmF5IG9mIGJ5dGVzIHRoZSBzaXplIG9mIHRoZSBwb29sIHdpbGwgYmUgcGFzc2VkIHRvIGluaXQoKVxuICAgIHZhciBybmdfcHNpemUgPSAyNTY7XG5cbiAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IEJpZ0ludGVnZXIsXG4gICAgICAgICAgICBCaWdJbnRlZ2VyOiBCaWdJbnRlZ2VyLFxuICAgICAgICAgICAgU2VjdXJlUmFuZG9tOiBTZWN1cmVSYW5kb20sXG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5qc2JuID0ge1xuICAgICAgICAgIEJpZ0ludGVnZXI6IEJpZ0ludGVnZXIsXG4gICAgICAgICAgU2VjdXJlUmFuZG9tOiBTZWN1cmVSYW5kb21cbiAgICAgICAgfTtcbiAgICB9XG5cbn0pLmNhbGwodGhpcyk7XG4iLCJsZXQgX2ZzXG50cnkge1xuICBfZnMgPSByZXF1aXJlKCdncmFjZWZ1bC1mcycpXG59IGNhdGNoIChfKSB7XG4gIF9mcyA9IHJlcXVpcmUoJ2ZzJylcbn1cbmNvbnN0IHVuaXZlcnNhbGlmeSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpXG5jb25zdCB7IHN0cmluZ2lmeSwgc3RyaXBCb20gfSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuXG5hc3luYyBmdW5jdGlvbiBfcmVhZEZpbGUgKGZpbGUsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucyA9IHsgZW5jb2Rpbmc6IG9wdGlvbnMgfVxuICB9XG5cbiAgY29uc3QgZnMgPSBvcHRpb25zLmZzIHx8IF9mc1xuXG4gIGNvbnN0IHNob3VsZFRocm93ID0gJ3Rocm93cycgaW4gb3B0aW9ucyA/IG9wdGlvbnMudGhyb3dzIDogdHJ1ZVxuXG4gIGxldCBkYXRhID0gYXdhaXQgdW5pdmVyc2FsaWZ5LmZyb21DYWxsYmFjayhmcy5yZWFkRmlsZSkoZmlsZSwgb3B0aW9ucylcblxuICBkYXRhID0gc3RyaXBCb20oZGF0YSlcblxuICBsZXQgb2JqXG4gIHRyeSB7XG4gICAgb2JqID0gSlNPTi5wYXJzZShkYXRhLCBvcHRpb25zID8gb3B0aW9ucy5yZXZpdmVyIDogbnVsbClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGAke2ZpbGV9OiAke2Vyci5tZXNzYWdlfWBcbiAgICAgIHRocm93IGVyclxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuY29uc3QgcmVhZEZpbGUgPSB1bml2ZXJzYWxpZnkuZnJvbVByb21pc2UoX3JlYWRGaWxlKVxuXG5mdW5jdGlvbiByZWFkRmlsZVN5bmMgKGZpbGUsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucyA9IHsgZW5jb2Rpbmc6IG9wdGlvbnMgfVxuICB9XG5cbiAgY29uc3QgZnMgPSBvcHRpb25zLmZzIHx8IF9mc1xuXG4gIGNvbnN0IHNob3VsZFRocm93ID0gJ3Rocm93cycgaW4gb3B0aW9ucyA/IG9wdGlvbnMudGhyb3dzIDogdHJ1ZVxuXG4gIHRyeSB7XG4gICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZSwgb3B0aW9ucylcbiAgICBjb250ZW50ID0gc3RyaXBCb20oY29udGVudClcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50LCBvcHRpb25zLnJldml2ZXIpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzaG91bGRUaHJvdykge1xuICAgICAgZXJyLm1lc3NhZ2UgPSBgJHtmaWxlfTogJHtlcnIubWVzc2FnZX1gXG4gICAgICB0aHJvdyBlcnJcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3dyaXRlRmlsZSAoZmlsZSwgb2JqLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgZnMgPSBvcHRpb25zLmZzIHx8IF9mc1xuXG4gIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShvYmosIG9wdGlvbnMpXG5cbiAgYXdhaXQgdW5pdmVyc2FsaWZ5LmZyb21DYWxsYmFjayhmcy53cml0ZUZpbGUpKGZpbGUsIHN0ciwgb3B0aW9ucylcbn1cblxuY29uc3Qgd3JpdGVGaWxlID0gdW5pdmVyc2FsaWZ5LmZyb21Qcm9taXNlKF93cml0ZUZpbGUpXG5cbmZ1bmN0aW9uIHdyaXRlRmlsZVN5bmMgKGZpbGUsIG9iaiwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGZzID0gb3B0aW9ucy5mcyB8fCBfZnNcblxuICBjb25zdCBzdHIgPSBzdHJpbmdpZnkob2JqLCBvcHRpb25zKVxuICAvLyBub3Qgc3VyZSBpZiBmcy53cml0ZUZpbGVTeW5jIHJldHVybnMgYW55dGhpbmcsIGJ1dCBqdXN0IGluIGNhc2VcbiAgcmV0dXJuIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgc3RyLCBvcHRpb25zKVxufVxuXG5jb25zdCBqc29uZmlsZSA9IHtcbiAgcmVhZEZpbGUsXG4gIHJlYWRGaWxlU3luYyxcbiAgd3JpdGVGaWxlLFxuICB3cml0ZUZpbGVTeW5jXG59XG5cbm1vZHVsZS5leHBvcnRzID0ganNvbmZpbGVcbiIsImZ1bmN0aW9uIHN0cmluZ2lmeSAob2JqLCB7IEVPTCA9ICdcXG4nLCBmaW5hbEVPTCA9IHRydWUsIHJlcGxhY2VyID0gbnVsbCwgc3BhY2VzIH0gPSB7fSkge1xuICBjb25zdCBFT0YgPSBmaW5hbEVPTCA/IEVPTCA6ICcnXG4gIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KG9iaiwgcmVwbGFjZXIsIHNwYWNlcylcblxuICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcbi9nLCBFT0wpICsgRU9GXG59XG5cbmZ1bmN0aW9uIHN0cmlwQm9tIChjb250ZW50KSB7XG4gIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSBKU09OLnBhcnNlIHdvdWxkIGNvbnZlcnQgaXQgdG8gYSB1dGY4IHN0cmluZyBpZiBlbmNvZGluZyB3YXNuJ3Qgc3BlY2lmaWVkXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY29udGVudCkpIGNvbnRlbnQgPSBjb250ZW50LnRvU3RyaW5nKCd1dGY4JylcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7IHN0cmluZ2lmeSwgc3RyaXBCb20gfVxuIiwiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgTmV0bWFzaywgYXRvYiwgY2hyLCBjaHIwLCBjaHJBLCBjaHJhLCBpcDJsb25nLCBsb25nMmlwO1xuXG4gIGxvbmcyaXAgPSBmdW5jdGlvbihsb25nKSB7XG4gICAgdmFyIGEsIGIsIGMsIGQ7XG4gICAgYSA9IChsb25nICYgKDB4ZmYgPDwgMjQpKSA+Pj4gMjQ7XG4gICAgYiA9IChsb25nICYgKDB4ZmYgPDwgMTYpKSA+Pj4gMTY7XG4gICAgYyA9IChsb25nICYgKDB4ZmYgPDwgOCkpID4+PiA4O1xuICAgIGQgPSBsb25nICYgMHhmZjtcbiAgICByZXR1cm4gW2EsIGIsIGMsIGRdLmpvaW4oJy4nKTtcbiAgfTtcblxuICBpcDJsb25nID0gZnVuY3Rpb24oaXApIHtcbiAgICB2YXIgYiwgYywgaSwgaiwgbiwgcmVmO1xuICAgIGIgPSBbXTtcbiAgICBmb3IgKGkgPSBqID0gMDsgaiA8PSAzOyBpID0gKytqKSB7XG4gICAgICBpZiAoaXAubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGlmIChpcFswXSAhPT0gJy4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElQJyk7XG4gICAgICAgIH1cbiAgICAgICAgaXAgPSBpcC5zdWJzdHJpbmcoMSk7XG4gICAgICB9XG4gICAgICByZWYgPSBhdG9iKGlwKSwgbiA9IHJlZlswXSwgYyA9IHJlZlsxXTtcbiAgICAgIGlwID0gaXAuc3Vic3RyaW5nKGMpO1xuICAgICAgYi5wdXNoKG4pO1xuICAgIH1cbiAgICBpZiAoaXAubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVAnKTtcbiAgICB9XG4gICAgc3dpdGNoIChiLmxlbmd0aCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBpZiAoYlswXSA+IDB4RkZGRkZGRkYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYlswXSA+Pj4gMDtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaWYgKGJbMF0gPiAweEZGIHx8IGJbMV0gPiAweEZGRkZGRikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBJUCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYlswXSA8PCAyNCB8IGJbMV0pID4+PiAwO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBpZiAoYlswXSA+IDB4RkYgfHwgYlsxXSA+IDB4RkYgfHwgYlsyXSA+IDB4RkZGRikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBJUCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYlswXSA8PCAyNCB8IGJbMV0gPDwgMTYgfCBiWzJdKSA+Pj4gMDtcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgaWYgKGJbMF0gPiAweEZGIHx8IGJbMV0gPiAweEZGIHx8IGJbMl0gPiAweEZGIHx8IGJbM10gPiAweEZGKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElQJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChiWzBdIDw8IDI0IHwgYlsxXSA8PCAxNiB8IGJbMl0gPDwgOCB8IGJbM10pID4+PiAwO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElQJyk7XG4gICAgfVxuICB9O1xuXG4gIGNociA9IGZ1bmN0aW9uKGIpIHtcbiAgICByZXR1cm4gYi5jaGFyQ29kZUF0KDApO1xuICB9O1xuXG4gIGNocjAgPSBjaHIoJzAnKTtcblxuICBjaHJhID0gY2hyKCdhJyk7XG5cbiAgY2hyQSA9IGNocignQScpO1xuXG4gIGF0b2IgPSBmdW5jdGlvbihzKSB7XG4gICAgdmFyIGJhc2UsIGRtYXgsIGksIG4sIHN0YXJ0O1xuICAgIG4gPSAwO1xuICAgIGJhc2UgPSAxMDtcbiAgICBkbWF4ID0gJzknO1xuICAgIGkgPSAwO1xuICAgIGlmIChzLmxlbmd0aCA+IDEgJiYgc1tpXSA9PT0gJzAnKSB7XG4gICAgICBpZiAoc1tpICsgMV0gPT09ICd4JyB8fCBzW2kgKyAxXSA9PT0gJ1gnKSB7XG4gICAgICAgIGkgKz0gMjtcbiAgICAgICAgYmFzZSA9IDE2O1xuICAgICAgfSBlbHNlIGlmICgnMCcgPD0gc1tpICsgMV0gJiYgc1tpICsgMV0gPD0gJzknKSB7XG4gICAgICAgIGkrKztcbiAgICAgICAgYmFzZSA9IDg7XG4gICAgICAgIGRtYXggPSAnNyc7XG4gICAgICB9XG4gICAgfVxuICAgIHN0YXJ0ID0gaTtcbiAgICB3aGlsZSAoaSA8IHMubGVuZ3RoKSB7XG4gICAgICBpZiAoJzAnIDw9IHNbaV0gJiYgc1tpXSA8PSBkbWF4KSB7XG4gICAgICAgIG4gPSAobiAqIGJhc2UgKyAoY2hyKHNbaV0pIC0gY2hyMCkpID4+PiAwO1xuICAgICAgfSBlbHNlIGlmIChiYXNlID09PSAxNikge1xuICAgICAgICBpZiAoJ2EnIDw9IHNbaV0gJiYgc1tpXSA8PSAnZicpIHtcbiAgICAgICAgICBuID0gKG4gKiBiYXNlICsgKDEwICsgY2hyKHNbaV0pIC0gY2hyYSkpID4+PiAwO1xuICAgICAgICB9IGVsc2UgaWYgKCdBJyA8PSBzW2ldICYmIHNbaV0gPD0gJ0YnKSB7XG4gICAgICAgICAgbiA9IChuICogYmFzZSArICgxMCArIGNocihzW2ldKSAtIGNockEpKSA+Pj4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAobiA+IDB4RkZGRkZGRkYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b28gbGFyZ2UnKTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gICAgaWYgKGkgPT09IHN0YXJ0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VtcHR5IG9jdGV0Jyk7XG4gICAgfVxuICAgIHJldHVybiBbbiwgaV07XG4gIH07XG5cbiAgTmV0bWFzayA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBOZXRtYXNrKG5ldCwgbWFzaykge1xuICAgICAgdmFyIGVycm9yLCBpLCBqLCByZWY7XG4gICAgICBpZiAodHlwZW9mIG5ldCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBgbmV0JyBwYXJhbWV0ZXJcIik7XG4gICAgICB9XG4gICAgICBpZiAoIW1hc2spIHtcbiAgICAgICAgcmVmID0gbmV0LnNwbGl0KCcvJywgMiksIG5ldCA9IHJlZlswXSwgbWFzayA9IHJlZlsxXTtcbiAgICAgIH1cbiAgICAgIGlmICghbWFzaykge1xuICAgICAgICBtYXNrID0gMzI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG1hc2sgPT09ICdzdHJpbmcnICYmIG1hc2suaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLm1hc2tMb25nID0gaXAybG9uZyhtYXNrKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBtYXNrOiBcIiArIG1hc2spO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IGogPSAzMjsgaiA+PSAwOyBpID0gLS1qKSB7XG4gICAgICAgICAgaWYgKHRoaXMubWFza0xvbmcgPT09ICgweGZmZmZmZmZmIDw8ICgzMiAtIGkpKSA+Pj4gMCkge1xuICAgICAgICAgICAgdGhpcy5iaXRtYXNrID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChtYXNrIHx8IG1hc2sgPT09IDApIHtcbiAgICAgICAgdGhpcy5iaXRtYXNrID0gcGFyc2VJbnQobWFzaywgMTApO1xuICAgICAgICB0aGlzLm1hc2tMb25nID0gMDtcbiAgICAgICAgaWYgKHRoaXMuYml0bWFzayA+IDApIHtcbiAgICAgICAgICB0aGlzLm1hc2tMb25nID0gKDB4ZmZmZmZmZmYgPDwgKDMyIC0gdGhpcy5iaXRtYXNrKSkgPj4+IDA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbWFzazogZW1wdHlcIik7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm5ldExvbmcgPSAoaXAybG9uZyhuZXQpICYgdGhpcy5tYXNrTG9uZykgPj4+IDA7XG4gICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbmV0IGFkZHJlc3M6IFwiICsgbmV0KTtcbiAgICAgIH1cbiAgICAgIGlmICghKHRoaXMuYml0bWFzayA8PSAzMikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBtYXNrIGZvciBpcDQ6IFwiICsgbWFzayk7XG4gICAgICB9XG4gICAgICB0aGlzLnNpemUgPSBNYXRoLnBvdygyLCAzMiAtIHRoaXMuYml0bWFzayk7XG4gICAgICB0aGlzLmJhc2UgPSBsb25nMmlwKHRoaXMubmV0TG9uZyk7XG4gICAgICB0aGlzLm1hc2sgPSBsb25nMmlwKHRoaXMubWFza0xvbmcpO1xuICAgICAgdGhpcy5ob3N0bWFzayA9IGxvbmcyaXAofnRoaXMubWFza0xvbmcpO1xuICAgICAgdGhpcy5maXJzdCA9IHRoaXMuYml0bWFzayA8PSAzMCA/IGxvbmcyaXAodGhpcy5uZXRMb25nICsgMSkgOiB0aGlzLmJhc2U7XG4gICAgICB0aGlzLmxhc3QgPSB0aGlzLmJpdG1hc2sgPD0gMzAgPyBsb25nMmlwKHRoaXMubmV0TG9uZyArIHRoaXMuc2l6ZSAtIDIpIDogbG9uZzJpcCh0aGlzLm5ldExvbmcgKyB0aGlzLnNpemUgLSAxKTtcbiAgICAgIHRoaXMuYnJvYWRjYXN0ID0gdGhpcy5iaXRtYXNrIDw9IDMwID8gbG9uZzJpcCh0aGlzLm5ldExvbmcgKyB0aGlzLnNpemUgLSAxKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICBOZXRtYXNrLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKGlwKSB7XG4gICAgICBpZiAodHlwZW9mIGlwID09PSAnc3RyaW5nJyAmJiAoaXAuaW5kZXhPZignLycpID4gMCB8fCBpcC5zcGxpdCgnLicpLmxlbmd0aCAhPT0gNCkpIHtcbiAgICAgICAgaXAgPSBuZXcgTmV0bWFzayhpcCk7XG4gICAgICB9XG4gICAgICBpZiAoaXAgaW5zdGFuY2VvZiBOZXRtYXNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5zKGlwLmJhc2UpICYmIHRoaXMuY29udGFpbnMoaXAuYnJvYWRjYXN0IHx8IGlwLmxhc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChpcDJsb25nKGlwKSAmIHRoaXMubWFza0xvbmcpID4+PiAwID09PSAodGhpcy5uZXRMb25nICYgdGhpcy5tYXNrTG9uZykgPj4+IDA7XG4gICAgICB9XG4gICAgfTtcblxuICAgIE5ldG1hc2sucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbihjb3VudCkge1xuICAgICAgaWYgKGNvdW50ID09IG51bGwpIHtcbiAgICAgICAgY291bnQgPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBOZXRtYXNrKGxvbmcyaXAodGhpcy5uZXRMb25nICsgKHRoaXMuc2l6ZSAqIGNvdW50KSksIHRoaXMubWFzayk7XG4gICAgfTtcblxuICAgIE5ldG1hc2sucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihmbikge1xuICAgICAgdmFyIGluZGV4LCBsYXN0TG9uZywgbG9uZztcbiAgICAgIGxvbmcgPSBpcDJsb25nKHRoaXMuZmlyc3QpO1xuICAgICAgbGFzdExvbmcgPSBpcDJsb25nKHRoaXMubGFzdCk7XG4gICAgICBpbmRleCA9IDA7XG4gICAgICB3aGlsZSAobG9uZyA8PSBsYXN0TG9uZykge1xuICAgICAgICBmbihsb25nMmlwKGxvbmcpLCBsb25nLCBpbmRleCk7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGxvbmcrKztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgTmV0bWFzay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmJhc2UgKyBcIi9cIiArIHRoaXMuYml0bWFzaztcbiAgICB9O1xuXG4gICAgcmV0dXJuIE5ldG1hc2s7XG5cbiAgfSkoKTtcblxuICBleHBvcnRzLmlwMmxvbmcgPSBpcDJsb25nO1xuXG4gIGV4cG9ydHMubG9uZzJpcCA9IGxvbmcyaXA7XG5cbiAgZXhwb3J0cy5OZXRtYXNrID0gTmV0bWFzaztcblxufSkuY2FsbCh0aGlzKTtcbiIsImNvbnN0IHJ1bnRpbWVSZXF1aXJlID0gdHlwZW9mIF9fd2VicGFja19yZXF1aXJlX18gPT09ICdmdW5jdGlvbicgPyBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA6IHJlcXVpcmUgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuaWYgKHR5cGVvZiBydW50aW1lUmVxdWlyZS5hZGRvbiA9PT0gJ2Z1bmN0aW9uJykgeyAvLyBpZiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgbmF0aXZlIHJlc29sdmluZyBwcmVmZXIgdGhhdFxuICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWVSZXF1aXJlLmFkZG9uLmJpbmQocnVudGltZVJlcXVpcmUpXG59IGVsc2UgeyAvLyBlbHNlIHVzZSB0aGUgcnVudGltZSB2ZXJzaW9uIGhlcmVcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL25vZGUtZ3lwLWJ1aWxkLmpzJylcbn1cbiIsInZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG52YXIgb3MgPSByZXF1aXJlKCdvcycpXG5cbi8vIFdvcmthcm91bmQgdG8gZml4IHdlYnBhY2sncyBidWlsZCB3YXJuaW5nczogJ3RoZSByZXF1ZXN0IG9mIGEgZGVwZW5kZW5jeSBpcyBhbiBleHByZXNzaW9uJ1xudmFyIHJ1bnRpbWVSZXF1aXJlID0gdHlwZW9mIF9fd2VicGFja19yZXF1aXJlX18gPT09ICdmdW5jdGlvbicgPyBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA6IHJlcXVpcmUgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG52YXIgdmFycyA9IChwcm9jZXNzLmNvbmZpZyAmJiBwcm9jZXNzLmNvbmZpZy52YXJpYWJsZXMpIHx8IHt9XG52YXIgcHJlYnVpbGRzT25seSA9ICEhcHJvY2Vzcy5lbnYuUFJFQlVJTERTX09OTFlcbnZhciBhYmkgPSBwcm9jZXNzLnZlcnNpb25zLm1vZHVsZXMgLy8gVE9ETzogc3VwcG9ydCBvbGQgbm9kZSB3aGVyZSB0aGlzIGlzIHVuZGVmXG52YXIgcnVudGltZSA9IGlzRWxlY3Ryb24oKSA/ICdlbGVjdHJvbicgOiAoaXNOd2pzKCkgPyAnbm9kZS13ZWJraXQnIDogJ25vZGUnKVxuXG52YXIgYXJjaCA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfYXJjaCB8fCBvcy5hcmNoKClcbnZhciBwbGF0Zm9ybSA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfcGxhdGZvcm0gfHwgb3MucGxhdGZvcm0oKVxudmFyIGxpYmMgPSBwcm9jZXNzLmVudi5MSUJDIHx8IChpc0FscGluZShwbGF0Zm9ybSkgPyAnbXVzbCcgOiAnZ2xpYmMnKVxudmFyIGFybXYgPSBwcm9jZXNzLmVudi5BUk1fVkVSU0lPTiB8fCAoYXJjaCA9PT0gJ2FybTY0JyA/ICc4JyA6IHZhcnMuYXJtX3ZlcnNpb24pIHx8ICcnXG52YXIgdXYgPSAocHJvY2Vzcy52ZXJzaW9ucy51diB8fCAnJykuc3BsaXQoJy4nKVswXVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxvYWRcblxuZnVuY3Rpb24gbG9hZCAoZGlyKSB7XG4gIHJldHVybiBydW50aW1lUmVxdWlyZShsb2FkLnJlc29sdmUoZGlyKSlcbn1cblxubG9hZC5yZXNvbHZlID0gbG9hZC5wYXRoID0gZnVuY3Rpb24gKGRpcikge1xuICBkaXIgPSBwYXRoLnJlc29sdmUoZGlyIHx8ICcuJylcblxuICB0cnkge1xuICAgIHZhciBuYW1lID0gcnVudGltZVJlcXVpcmUocGF0aC5qb2luKGRpciwgJ3BhY2thZ2UuanNvbicpKS5uYW1lLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpXG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWUgKyAnX1BSRUJVSUxEJ10pIGRpciA9IHByb2Nlc3MuZW52W25hbWUgKyAnX1BSRUJVSUxEJ11cbiAgfSBjYXRjaCAoZXJyKSB7fVxuXG4gIGlmICghcHJlYnVpbGRzT25seSkge1xuICAgIHZhciByZWxlYXNlID0gZ2V0Rmlyc3QocGF0aC5qb2luKGRpciwgJ2J1aWxkL1JlbGVhc2UnKSwgbWF0Y2hCdWlsZClcbiAgICBpZiAocmVsZWFzZSkgcmV0dXJuIHJlbGVhc2VcblxuICAgIHZhciBkZWJ1ZyA9IGdldEZpcnN0KHBhdGguam9pbihkaXIsICdidWlsZC9EZWJ1ZycpLCBtYXRjaEJ1aWxkKVxuICAgIGlmIChkZWJ1ZykgcmV0dXJuIGRlYnVnXG4gIH1cblxuICB2YXIgcHJlYnVpbGQgPSByZXNvbHZlKGRpcilcbiAgaWYgKHByZWJ1aWxkKSByZXR1cm4gcHJlYnVpbGRcblxuICB2YXIgbmVhcmJ5ID0gcmVzb2x2ZShwYXRoLmRpcm5hbWUocHJvY2Vzcy5leGVjUGF0aCkpXG4gIGlmIChuZWFyYnkpIHJldHVybiBuZWFyYnlcblxuICB2YXIgdGFyZ2V0ID0gW1xuICAgICdwbGF0Zm9ybT0nICsgcGxhdGZvcm0sXG4gICAgJ2FyY2g9JyArIGFyY2gsXG4gICAgJ3J1bnRpbWU9JyArIHJ1bnRpbWUsXG4gICAgJ2FiaT0nICsgYWJpLFxuICAgICd1dj0nICsgdXYsXG4gICAgYXJtdiA/ICdhcm12PScgKyBhcm12IDogJycsXG4gICAgJ2xpYmM9JyArIGxpYmMsXG4gICAgJ25vZGU9JyArIHByb2Nlc3MudmVyc2lvbnMubm9kZSxcbiAgICBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uID8gJ2VsZWN0cm9uPScgKyBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uIDogJycsXG4gICAgdHlwZW9mIF9fd2VicGFja19yZXF1aXJlX18gPT09ICdmdW5jdGlvbicgPyAnd2VicGFjaz10cnVlJyA6ICcnIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpXG5cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBuYXRpdmUgYnVpbGQgd2FzIGZvdW5kIGZvciAnICsgdGFyZ2V0ICsgJ1xcbiAgICBsb2FkZWQgZnJvbTogJyArIGRpciArICdcXG4nKVxuXG4gIGZ1bmN0aW9uIHJlc29sdmUgKGRpcikge1xuICAgIC8vIEZpbmQgbWF0Y2hpbmcgXCJwcmVidWlsZHMvPHBsYXRmb3JtPi08YXJjaD5cIiBkaXJlY3RvcnlcbiAgICB2YXIgdHVwbGVzID0gcmVhZGRpclN5bmMocGF0aC5qb2luKGRpciwgJ3ByZWJ1aWxkcycpKS5tYXAocGFyc2VUdXBsZSlcbiAgICB2YXIgdHVwbGUgPSB0dXBsZXMuZmlsdGVyKG1hdGNoVHVwbGUocGxhdGZvcm0sIGFyY2gpKS5zb3J0KGNvbXBhcmVUdXBsZXMpWzBdXG4gICAgaWYgKCF0dXBsZSkgcmV0dXJuXG5cbiAgICAvLyBGaW5kIG1vc3Qgc3BlY2lmaWMgZmxhdm9yIGZpcnN0XG4gICAgdmFyIHByZWJ1aWxkcyA9IHBhdGguam9pbihkaXIsICdwcmVidWlsZHMnLCB0dXBsZS5uYW1lKVxuICAgIHZhciBwYXJzZWQgPSByZWFkZGlyU3luYyhwcmVidWlsZHMpLm1hcChwYXJzZVRhZ3MpXG4gICAgdmFyIGNhbmRpZGF0ZXMgPSBwYXJzZWQuZmlsdGVyKG1hdGNoVGFncyhydW50aW1lLCBhYmkpKVxuICAgIHZhciB3aW5uZXIgPSBjYW5kaWRhdGVzLnNvcnQoY29tcGFyZVRhZ3MocnVudGltZSkpWzBdXG4gICAgaWYgKHdpbm5lcikgcmV0dXJuIHBhdGguam9pbihwcmVidWlsZHMsIHdpbm5lci5maWxlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRkaXJTeW5jIChkaXIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMucmVhZGRpclN5bmMoZGlyKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gW11cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRGaXJzdCAoZGlyLCBmaWx0ZXIpIHtcbiAgdmFyIGZpbGVzID0gcmVhZGRpclN5bmMoZGlyKS5maWx0ZXIoZmlsdGVyKVxuICByZXR1cm4gZmlsZXNbMF0gJiYgcGF0aC5qb2luKGRpciwgZmlsZXNbMF0pXG59XG5cbmZ1bmN0aW9uIG1hdGNoQnVpbGQgKG5hbWUpIHtcbiAgcmV0dXJuIC9cXC5ub2RlJC8udGVzdChuYW1lKVxufVxuXG5mdW5jdGlvbiBwYXJzZVR1cGxlIChuYW1lKSB7XG4gIC8vIEV4YW1wbGU6IGRhcndpbi14NjQrYXJtNjRcbiAgdmFyIGFyciA9IG5hbWUuc3BsaXQoJy0nKVxuICBpZiAoYXJyLmxlbmd0aCAhPT0gMikgcmV0dXJuXG5cbiAgdmFyIHBsYXRmb3JtID0gYXJyWzBdXG4gIHZhciBhcmNoaXRlY3R1cmVzID0gYXJyWzFdLnNwbGl0KCcrJylcblxuICBpZiAoIXBsYXRmb3JtKSByZXR1cm5cbiAgaWYgKCFhcmNoaXRlY3R1cmVzLmxlbmd0aCkgcmV0dXJuXG4gIGlmICghYXJjaGl0ZWN0dXJlcy5ldmVyeShCb29sZWFuKSkgcmV0dXJuXG5cbiAgcmV0dXJuIHsgbmFtZSwgcGxhdGZvcm0sIGFyY2hpdGVjdHVyZXMgfVxufVxuXG5mdW5jdGlvbiBtYXRjaFR1cGxlIChwbGF0Zm9ybSwgYXJjaCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHR1cGxlKSB7XG4gICAgaWYgKHR1cGxlID09IG51bGwpIHJldHVybiBmYWxzZVxuICAgIGlmICh0dXBsZS5wbGF0Zm9ybSAhPT0gcGxhdGZvcm0pIHJldHVybiBmYWxzZVxuICAgIHJldHVybiB0dXBsZS5hcmNoaXRlY3R1cmVzLmluY2x1ZGVzKGFyY2gpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGFyZVR1cGxlcyAoYSwgYikge1xuICAvLyBQcmVmZXIgc2luZ2xlLWFyY2ggcHJlYnVpbGRzIG92ZXIgbXVsdGktYXJjaFxuICByZXR1cm4gYS5hcmNoaXRlY3R1cmVzLmxlbmd0aCAtIGIuYXJjaGl0ZWN0dXJlcy5sZW5ndGhcbn1cblxuZnVuY3Rpb24gcGFyc2VUYWdzIChmaWxlKSB7XG4gIHZhciBhcnIgPSBmaWxlLnNwbGl0KCcuJylcbiAgdmFyIGV4dGVuc2lvbiA9IGFyci5wb3AoKVxuICB2YXIgdGFncyA9IHsgZmlsZTogZmlsZSwgc3BlY2lmaWNpdHk6IDAgfVxuXG4gIGlmIChleHRlbnNpb24gIT09ICdub2RlJykgcmV0dXJuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdGFnID0gYXJyW2ldXG5cbiAgICBpZiAodGFnID09PSAnbm9kZScgfHwgdGFnID09PSAnZWxlY3Ryb24nIHx8IHRhZyA9PT0gJ25vZGUtd2Via2l0Jykge1xuICAgICAgdGFncy5ydW50aW1lID0gdGFnXG4gICAgfSBlbHNlIGlmICh0YWcgPT09ICduYXBpJykge1xuICAgICAgdGFncy5uYXBpID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAodGFnLnNsaWNlKDAsIDMpID09PSAnYWJpJykge1xuICAgICAgdGFncy5hYmkgPSB0YWcuc2xpY2UoMylcbiAgICB9IGVsc2UgaWYgKHRhZy5zbGljZSgwLCAyKSA9PT0gJ3V2Jykge1xuICAgICAgdGFncy51diA9IHRhZy5zbGljZSgyKVxuICAgIH0gZWxzZSBpZiAodGFnLnNsaWNlKDAsIDQpID09PSAnYXJtdicpIHtcbiAgICAgIHRhZ3MuYXJtdiA9IHRhZy5zbGljZSg0KVxuICAgIH0gZWxzZSBpZiAodGFnID09PSAnZ2xpYmMnIHx8IHRhZyA9PT0gJ211c2wnKSB7XG4gICAgICB0YWdzLmxpYmMgPSB0YWdcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB0YWdzLnNwZWNpZmljaXR5KytcbiAgfVxuXG4gIHJldHVybiB0YWdzXG59XG5cbmZ1bmN0aW9uIG1hdGNoVGFncyAocnVudGltZSwgYWJpKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFncykge1xuICAgIGlmICh0YWdzID09IG51bGwpIHJldHVybiBmYWxzZVxuICAgIGlmICh0YWdzLnJ1bnRpbWUgJiYgdGFncy5ydW50aW1lICE9PSBydW50aW1lICYmICFydW50aW1lQWdub3N0aWModGFncykpIHJldHVybiBmYWxzZVxuICAgIGlmICh0YWdzLmFiaSAmJiB0YWdzLmFiaSAhPT0gYWJpICYmICF0YWdzLm5hcGkpIHJldHVybiBmYWxzZVxuICAgIGlmICh0YWdzLnV2ICYmIHRhZ3MudXYgIT09IHV2KSByZXR1cm4gZmFsc2VcbiAgICBpZiAodGFncy5hcm12ICYmIHRhZ3MuYXJtdiAhPT0gYXJtdikgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHRhZ3MubGliYyAmJiB0YWdzLmxpYmMgIT09IGxpYmMpIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuXG5mdW5jdGlvbiBydW50aW1lQWdub3N0aWMgKHRhZ3MpIHtcbiAgcmV0dXJuIHRhZ3MucnVudGltZSA9PT0gJ25vZGUnICYmIHRhZ3MubmFwaVxufVxuXG5mdW5jdGlvbiBjb21wYXJlVGFncyAocnVudGltZSkge1xuICAvLyBQcmVjZWRlbmNlOiBub24tYWdub3N0aWMgcnVudGltZSwgYWJpIG92ZXIgbmFwaSwgdGhlbiBieSBzcGVjaWZpY2l0eS5cbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgaWYgKGEucnVudGltZSAhPT0gYi5ydW50aW1lKSB7XG4gICAgICByZXR1cm4gYS5ydW50aW1lID09PSBydW50aW1lID8gLTEgOiAxXG4gICAgfSBlbHNlIGlmIChhLmFiaSAhPT0gYi5hYmkpIHtcbiAgICAgIHJldHVybiBhLmFiaSA/IC0xIDogMVxuICAgIH0gZWxzZSBpZiAoYS5zcGVjaWZpY2l0eSAhPT0gYi5zcGVjaWZpY2l0eSkge1xuICAgICAgcmV0dXJuIGEuc3BlY2lmaWNpdHkgPiBiLnNwZWNpZmljaXR5ID8gLTEgOiAxXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTndqcyAoKSB7XG4gIHJldHVybiAhIShwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubncpXG59XG5cbmZ1bmN0aW9uIGlzRWxlY3Ryb24gKCkge1xuICBpZiAocHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uKSByZXR1cm4gdHJ1ZVxuICBpZiAocHJvY2Vzcy5lbnYuRUxFQ1RST05fUlVOX0FTX05PREUpIHJldHVybiB0cnVlXG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiB3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInXG59XG5cbmZ1bmN0aW9uIGlzQWxwaW5lIChwbGF0Zm9ybSkge1xuICByZXR1cm4gcGxhdGZvcm0gPT09ICdsaW51eCcgJiYgZnMuZXhpc3RzU3luYygnL2V0Yy9hbHBpbmUtcmVsZWFzZScpXG59XG5cbi8vIEV4cG9zZWQgZm9yIHVuaXQgdGVzdHNcbi8vIFRPRE86IG1vdmUgdG8gbGliXG5sb2FkLnBhcnNlVGFncyA9IHBhcnNlVGFnc1xubG9hZC5tYXRjaFRhZ3MgPSBtYXRjaFRhZ3NcbmxvYWQuY29tcGFyZVRhZ3MgPSBjb21wYXJlVGFnc1xubG9hZC5wYXJzZVR1cGxlID0gcGFyc2VUdXBsZVxubG9hZC5tYXRjaFR1cGxlID0gbWF0Y2hUdXBsZVxubG9hZC5jb21wYXJlVHVwbGVzID0gY29tcGFyZVR1cGxlc1xuIiwidmFyIHdyYXBweSA9IHJlcXVpcmUoJ3dyYXBweScpXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXBweShvbmNlKVxubW9kdWxlLmV4cG9ydHMuc3RyaWN0ID0gd3JhcHB5KG9uY2VTdHJpY3QpXG5cbm9uY2UucHJvdG8gPSBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwgJ29uY2UnLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBvbmNlKHRoaXMpXG4gICAgfSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCAnb25jZVN0cmljdCcsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG9uY2VTdHJpY3QodGhpcylcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxufSlcblxuZnVuY3Rpb24gb25jZSAoZm4pIHtcbiAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGYuY2FsbGVkKSByZXR1cm4gZi52YWx1ZVxuICAgIGYuY2FsbGVkID0gdHJ1ZVxuICAgIHJldHVybiBmLnZhbHVlID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9XG4gIGYuY2FsbGVkID0gZmFsc2VcbiAgcmV0dXJuIGZcbn1cblxuZnVuY3Rpb24gb25jZVN0cmljdCAoZm4pIHtcbiAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGYuY2FsbGVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGYub25jZUVycm9yKVxuICAgIGYuY2FsbGVkID0gdHJ1ZVxuICAgIHJldHVybiBmLnZhbHVlID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9XG4gIHZhciBuYW1lID0gZm4ubmFtZSB8fCAnRnVuY3Rpb24gd3JhcHBlZCB3aXRoIGBvbmNlYCdcbiAgZi5vbmNlRXJyb3IgPSBuYW1lICsgXCIgc2hvdWxkbid0IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZVwiXG4gIGYuY2FsbGVkID0gZmFsc2VcbiAgcmV0dXJuIGZcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlBhY1Byb3h5QWdlbnQgPSB2b2lkIDA7XG5jb25zdCBuZXQgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm5ldFwiKSk7XG5jb25zdCB0bHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInRsc1wiKSk7XG5jb25zdCBjcnlwdG8gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImNyeXB0b1wiKSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCB1cmxfMSA9IHJlcXVpcmUoXCJ1cmxcIik7XG5jb25zdCBhZ2VudF9iYXNlXzEgPSByZXF1aXJlKFwiYWdlbnQtYmFzZVwiKTtcbmNvbnN0IGh0dHBfcHJveHlfYWdlbnRfMSA9IHJlcXVpcmUoXCJodHRwLXByb3h5LWFnZW50XCIpO1xuY29uc3QgaHR0cHNfcHJveHlfYWdlbnRfMSA9IHJlcXVpcmUoXCJodHRwcy1wcm94eS1hZ2VudFwiKTtcbmNvbnN0IHNvY2tzX3Byb3h5X2FnZW50XzEgPSByZXF1aXJlKFwic29ja3MtcHJveHktYWdlbnRcIik7XG5jb25zdCBnZXRfdXJpXzEgPSByZXF1aXJlKFwiZ2V0LXVyaVwiKTtcbmNvbnN0IHBhY19yZXNvbHZlcl8xID0gcmVxdWlyZShcInBhYy1yZXNvbHZlclwiKTtcbmNvbnN0IHF1aWNranNfZW1zY3JpcHRlbl8xID0gcmVxdWlyZShcIkB0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW5cIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdwYWMtcHJveHktYWdlbnQnKTtcbi8qKlxuICogVGhlIGBQYWNQcm94eUFnZW50YCBjbGFzcy5cbiAqXG4gKiBBIGZldyBkaWZmZXJlbnQgXCJwcm90b2NvbFwiIG1vZGVzIGFyZSBzdXBwb3J0ZWQgKHN1cHBvcnRlZCBwcm90b2NvbHMgYXJlXG4gKiBiYWNrZWQgYnkgdGhlIGBnZXQtdXJpYCBtb2R1bGUpOlxuICpcbiAqICAgLSBcInBhYytkYXRhXCIsIFwiZGF0YVwiIC0gcmVmZXJzIHRvIGFuIGVtYmVkZGVkIFwiZGF0YTpcIiBVUklcbiAqICAgLSBcInBhYytmaWxlXCIsIFwiZmlsZVwiIC0gcmVmZXJzIHRvIGEgbG9jYWwgZmlsZVxuICogICAtIFwicGFjK2Z0cFwiLCBcImZ0cFwiIC0gcmVmZXJzIHRvIGEgZmlsZSBsb2NhdGVkIG9uIGFuIEZUUCBzZXJ2ZXJcbiAqICAgLSBcInBhYytodHRwXCIsIFwiaHR0cFwiIC0gcmVmZXJzIHRvIGFuIEhUVFAgZW5kcG9pbnRcbiAqICAgLSBcInBhYytodHRwc1wiLCBcImh0dHBzXCIgLSByZWZlcnMgdG8gYW4gSFRUUFMgZW5kcG9pbnRcbiAqL1xuY2xhc3MgUGFjUHJveHlBZ2VudCBleHRlbmRzIGFnZW50X2Jhc2VfMS5BZ2VudCB7XG4gICAgY29uc3RydWN0b3IodXJpLCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLmNsZWFyUmVzb2x2ZXJQcm9taXNlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlclByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFN0cmlwIHRoZSBcInBhYytcIiBwcmVmaXhcbiAgICAgICAgY29uc3QgdXJpU3RyID0gdHlwZW9mIHVyaSA9PT0gJ3N0cmluZycgPyB1cmkgOiB1cmkuaHJlZjtcbiAgICAgICAgdGhpcy51cmkgPSBuZXcgdXJsXzEuVVJMKHVyaVN0ci5yZXBsYWNlKC9ecGFjXFwrL2ksICcnKSk7XG4gICAgICAgIGRlYnVnKCdDcmVhdGluZyBQYWNQcm94eUFnZW50IHdpdGggVVJJICVvJywgdGhpcy51cmkuaHJlZik7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgTm90IHN1cmUgd2h5IFRTIGlzIGNvbXBsYWluaW5nIGhlcmXigKZcbiAgICAgICAgdGhpcy5vcHRzID0geyAuLi5vcHRzIH07XG4gICAgICAgIHRoaXMuY2FjaGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucmVzb2x2ZXJIYXNoID0gJyc7XG4gICAgICAgIHRoaXMucmVzb2x2ZXJQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBGb3IgYFBhY1Jlc29sdmVyYFxuICAgICAgICBpZiAoIXRoaXMub3B0cy5maWxlbmFtZSkge1xuICAgICAgICAgICAgdGhpcy5vcHRzLmZpbGVuYW1lID0gdGhpcy51cmkuaHJlZjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgUEFDIHByb3h5IGZpbGUgZnJvbSB0aGUgc291cmNlIGlmIG5lY2Vzc2FyeSwgYW5kIHJldHVybnNcbiAgICAgKiBhIGdlbmVyYXRlZCBgRmluZFByb3h5Rm9yVVJMKClgIHJlc29sdmVyIGZ1bmN0aW9uIHRvIHVzZS5cbiAgICAgKlxuICAgICAqIEBhcGkgcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldFJlc29sdmVyKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVzb2x2ZXJQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVyUHJvbWlzZSA9IHRoaXMubG9hZFJlc29sdmVyKCk7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVyUHJvbWlzZS50aGVuKHRoaXMuY2xlYXJSZXNvbHZlclByb21pc2UsIHRoaXMuY2xlYXJSZXNvbHZlclByb21pc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyUHJvbWlzZTtcbiAgICB9XG4gICAgYXN5bmMgbG9hZFJlc29sdmVyKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gKFJlKWxvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBQQUMgZmlsZSBVUklcbiAgICAgICAgICAgIGNvbnN0IFtxanMsIGNvZGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICgwLCBxdWlja2pzX2Vtc2NyaXB0ZW5fMS5nZXRRdWlja0pTKSgpLFxuICAgICAgICAgICAgICAgIHRoaXMubG9hZFBhY0ZpbGUoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgc2hhMSBoYXNoIG9mIHRoZSBKUyBjb2RlXG4gICAgICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUoY29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc29sdmVyICYmIHRoaXMucmVzb2x2ZXJIYXNoID09PSBoYXNoKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ1NhbWUgc2hhMSBoYXNoIGZvciBjb2RlIC0gY29udGVudHMgaGF2ZSBub3QgY2hhbmdlZCwgcmV1c2luZyBwcmV2aW91cyBwcm94eSByZXNvbHZlcicpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc29sdmVyXG4gICAgICAgICAgICBkZWJ1ZygnQ3JlYXRpbmcgbmV3IHByb3h5IHJlc29sdmVyIGluc3RhbmNlJyk7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVyID0gKDAsIHBhY19yZXNvbHZlcl8xLmNyZWF0ZVBhY1Jlc29sdmVyKShxanMsIGNvZGUsIHRoaXMub3B0cyk7XG4gICAgICAgICAgICAvLyBTdG9yZSB0aGF0IHNoYTEgaGFzaCBmb3IgZnV0dXJlIGNvbXBhcmlzb24gcHVycG9zZXNcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZXJIYXNoID0gaGFzaDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc29sdmVyICYmXG4gICAgICAgICAgICAgICAgZXJyLmNvZGUgPT09ICdFTk9UTU9ESUZJRUQnKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ0dvdCBFTk9UTU9ESUZJRUQgcmVzcG9uc2UsIHJldXNpbmcgcHJldmlvdXMgcHJveHkgcmVzb2x2ZXInKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgY29udGVudHMgb2YgdGhlIFBBQyBwcm94eSBmaWxlLlxuICAgICAqXG4gICAgICogQGFwaSBwcml2YXRlXG4gICAgICovXG4gICAgYXN5bmMgbG9hZFBhY0ZpbGUoKSB7XG4gICAgICAgIGRlYnVnKCdMb2FkaW5nIFBBQyBmaWxlOiAlbycsIHRoaXMudXJpKTtcbiAgICAgICAgY29uc3QgcnMgPSBhd2FpdCAoMCwgZ2V0X3VyaV8xLmdldFVyaSkodGhpcy51cmksIHsgLi4udGhpcy5vcHRzLCBjYWNoZTogdGhpcy5jYWNoZSB9KTtcbiAgICAgICAgZGVidWcoJ0dvdCBgUmVhZGFibGVgIGluc3RhbmNlIGZvciBVUkknKTtcbiAgICAgICAgdGhpcy5jYWNoZSA9IHJzO1xuICAgICAgICBjb25zdCBidWYgPSBhd2FpdCAoMCwgYWdlbnRfYmFzZV8xLnRvQnVmZmVyKShycyk7XG4gICAgICAgIGRlYnVnKCdSZWFkICVvIGJ5dGUgUEFDIGZpbGUgZnJvbSBVUkknLCBidWYubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmOCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbm9kZS1jb3JlIEhUVFAgY2xpZW50IGxpYnJhcnkgaXMgY3JlYXRpbmcgYSBuZXcgSFRUUCByZXF1ZXN0LlxuICAgICAqL1xuICAgIGFzeW5jIGNvbm5lY3QocmVxLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IHsgc2VjdXJlRW5kcG9pbnQgfSA9IG9wdHM7XG4gICAgICAgIC8vIEZpcnN0LCBnZXQgYSBnZW5lcmF0ZWQgYEZpbmRQcm94eUZvclVSTCgpYCBmdW5jdGlvbixcbiAgICAgICAgLy8gZWl0aGVyIGNhY2hlZCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc291cmNlXG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gYXdhaXQgdGhpcy5nZXRSZXNvbHZlcigpO1xuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGB1cmxgIHBhcmFtZXRlclxuICAgICAgICBjb25zdCBkZWZhdWx0UG9ydCA9IHNlY3VyZUVuZHBvaW50ID8gNDQzIDogODA7XG4gICAgICAgIGxldCBwYXRoID0gcmVxLnBhdGg7XG4gICAgICAgIGxldCBzZWFyY2ggPSBudWxsO1xuICAgICAgICBjb25zdCBmaXJzdFF1ZXN0aW9uID0gcGF0aC5pbmRleE9mKCc/Jyk7XG4gICAgICAgIGlmIChmaXJzdFF1ZXN0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgc2VhcmNoID0gcGF0aC5zdWJzdHJpbmcoZmlyc3RRdWVzdGlvbik7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgZmlyc3RRdWVzdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJsT3B0cyA9IHtcbiAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgICBwcm90b2NvbDogc2VjdXJlRW5kcG9pbnQgPyAnaHR0cHM6JyA6ICdodHRwOicsXG4gICAgICAgICAgICBwYXRobmFtZTogcGF0aCxcbiAgICAgICAgICAgIHNlYXJjaCxcbiAgICAgICAgICAgIC8vIG5lZWQgdG8gdXNlIGBob3N0bmFtZWAgaW5zdGVhZCBvZiBgaG9zdGAgb3RoZXJ3aXNlIGBwb3J0YCBpcyBpZ25vcmVkXG4gICAgICAgICAgICBob3N0bmFtZTogb3B0cy5ob3N0LFxuICAgICAgICAgICAgaG9zdDogbnVsbCxcbiAgICAgICAgICAgIGhyZWY6IG51bGwsXG4gICAgICAgICAgICAvLyBzZXQgYHBvcnRgIHRvIG51bGwgd2hlbiBpdCBpcyB0aGUgcHJvdG9jb2wgZGVmYXVsdCBwb3J0ICg4MCAvIDQ0MylcbiAgICAgICAgICAgIHBvcnQ6IGRlZmF1bHRQb3J0ID09PSBvcHRzLnBvcnQgPyBudWxsIDogb3B0cy5wb3J0LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB1cmwgPSAoMCwgdXJsXzEuZm9ybWF0KSh1cmxPcHRzKTtcbiAgICAgICAgZGVidWcoJ3VybDogJW8nLCB1cmwpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZXIodXJsKTtcbiAgICAgICAgLy8gRGVmYXVsdCB0byBcIkRJUkVDVFwiIGlmIGEgZmFsc2V5IHZhbHVlIHdhcyByZXR1cm5lZCAob3Igbm90aGluZylcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9ICdESVJFQ1QnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3hpZXMgPSBTdHJpbmcocmVzdWx0KVxuICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgLnNwbGl0KC9cXHMqO1xccyovZylcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZmFsbGJhY2tUb0RpcmVjdCAmJiAhcHJveGllcy5pbmNsdWRlcygnRElSRUNUJykpIHtcbiAgICAgICAgICAgIHByb3hpZXMucHVzaCgnRElSRUNUJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwcm94eSBvZiBwcm94aWVzKSB7XG4gICAgICAgICAgICBsZXQgYWdlbnQgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHNvY2tldCA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBbdHlwZSwgdGFyZ2V0XSA9IHByb3h5LnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBkZWJ1ZygnQXR0ZW1wdGluZyB0byB1c2UgcHJveHk6ICVvJywgcHJveHkpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdESVJFQ1QnKSB7XG4gICAgICAgICAgICAgICAgLy8gRGlyZWN0IGNvbm5lY3Rpb24gdG8gdGhlIGRlc3RpbmF0aW9uIGVuZHBvaW50XG4gICAgICAgICAgICAgICAgaWYgKHNlY3VyZUVuZHBvaW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZlcm5hbWUgPSBvcHRzLnNlcnZlcm5hbWUgfHwgb3B0cy5ob3N0O1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXQgPSB0bHMuY29ubmVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVybmFtZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXQgPSBuZXQuY29ubmVjdChvcHRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnU09DS1MnIHx8IHR5cGUgPT09ICdTT0NLUzUnKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIGEgU09DS1N2NWggcHJveHlcbiAgICAgICAgICAgICAgICBhZ2VudCA9IG5ldyBzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudChgc29ja3M6Ly8ke3RhcmdldH1gLCB0aGlzLm9wdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ1NPQ0tTNCcpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgYSBTT0NLU3Y0YSBwcm94eVxuICAgICAgICAgICAgICAgIGFnZW50ID0gbmV3IHNvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50KGBzb2NrczRhOi8vJHt0YXJnZXR9YCwgdGhpcy5vcHRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdQUk9YWScgfHxcbiAgICAgICAgICAgICAgICB0eXBlID09PSAnSFRUUCcgfHxcbiAgICAgICAgICAgICAgICB0eXBlID09PSAnSFRUUFMnKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIGFuIEhUVFAgb3IgSFRUUFMgcHJveHlcbiAgICAgICAgICAgICAgICAvLyBodHRwOi8vZGV2LmNocm9taXVtLm9yZy9kZXZlbG9wZXJzL2Rlc2lnbi1kb2N1bWVudHMvc2VjdXJlLXdlYi1wcm94eVxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3h5VVJMID0gYCR7dHlwZSA9PT0gJ0hUVFBTJyA/ICdodHRwcycgOiAnaHR0cCd9Oi8vJHt0YXJnZXR9YDtcbiAgICAgICAgICAgICAgICBpZiAoc2VjdXJlRW5kcG9pbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgYWdlbnQgPSBuZXcgaHR0cHNfcHJveHlfYWdlbnRfMS5IdHRwc1Byb3h5QWdlbnQocHJveHlVUkwsIHRoaXMub3B0cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZ2VudCA9IG5ldyBodHRwX3Byb3h5X2FnZW50XzEuSHR0cFByb3h5QWdlbnQocHJveHlVUkwsIHRoaXMub3B0cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoc29ja2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFwiRElSRUNUXCIgY29ubmVjdGlvbiwgd2FpdCBmb3IgY29ubmVjdGlvbiBjb25maXJtYXRpb25cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgKDAsIGV2ZW50c18xLm9uY2UpKHNvY2tldCwgJ2Nvbm5lY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxLmVtaXQoJ3Byb3h5JywgeyBwcm94eSwgc29ja2V0IH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ja2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWdlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGF3YWl0IGFnZW50LmNvbm5lY3QocmVxLCBvcHRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEocyBpbnN0YW5jZW9mIG5ldC5Tb2NrZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgYG5ldC5Tb2NrZXRgIHRvIGJlIHJldHVybmVkIGZyb20gYWdlbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXEuZW1pdCgncHJveHknLCB7IHByb3h5LCBzb2NrZXQ6IHMgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgcHJveHkgdHlwZSBmb3I6ICR7cHJveHl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ0dvdCBlcnJvciBmb3IgcHJveHkgJW86ICVvJywgcHJveHksIGVycik7XG4gICAgICAgICAgICAgICAgcmVxLmVtaXQoJ3Byb3h5JywgeyBwcm94eSwgZXJyb3I6IGVyciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBlc3RhYmxpc2ggYSBzb2NrZXQgY29ubmVjdGlvbiB0byBwcm94aWVzOiAke0pTT04uc3RyaW5naWZ5KHByb3hpZXMpfWApO1xuICAgIH1cbn1cblBhY1Byb3h5QWdlbnQucHJvdG9jb2xzID0gW1xuICAgICdwYWMrZGF0YScsXG4gICAgJ3BhYytmaWxlJyxcbiAgICAncGFjK2Z0cCcsXG4gICAgJ3BhYytodHRwJyxcbiAgICAncGFjK2h0dHBzJyxcbl07XG5leHBvcnRzLlBhY1Byb3h5QWdlbnQgPSBQYWNQcm94eUFnZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKipcbiAqIElmIG9ubHkgYSBzaW5nbGUgdmFsdWUgaXMgc3BlY2lmaWVkIChmcm9tIGVhY2ggY2F0ZWdvcnk6IGRheSwgbW9udGgsIHllYXIpLCB0aGVcbiAqIGZ1bmN0aW9uIHJldHVybnMgYSB0cnVlIHZhbHVlIG9ubHkgb24gZGF5cyB0aGF0IG1hdGNoIHRoYXQgc3BlY2lmaWNhdGlvbi4gSWZcbiAqIGJvdGggdmFsdWVzIGFyZSBzcGVjaWZpZWQsIHRoZSByZXN1bHQgaXMgdHJ1ZSBiZXR3ZWVuIHRob3NlIHRpbWVzLCBpbmNsdWRpbmdcbiAqIGJvdW5kcy5cbiAqXG4gKiBFdmVuIHRob3VnaCB0aGUgZXhhbXBsZXMgZG9uJ3Qgc2hvdywgdGhlIFwiR01UXCIgcGFyYW1ldGVyIGNhbiBiZSBzcGVjaWZpZWRcbiAqIGluIGFueSBvZiB0aGUgOSBkaWZmZXJlbnQgY2FsbCBwcm9maWxlcywgYWx3YXlzIGFzIHRoZSBsYXN0IHBhcmFtZXRlci5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIGRhdGVSYW5nZSgxKVxuICogdHJ1ZSBvbiB0aGUgZmlyc3QgZGF5IG9mIGVhY2ggbW9udGgsIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIGRhdGVSYW5nZSgxLCBcIkdNVFwiKVxuICogdHJ1ZSBvbiB0aGUgZmlyc3QgZGF5IG9mIGVhY2ggbW9udGgsIEdNVCB0aW1lem9uZS5cbiAqXG4gKiBkYXRlUmFuZ2UoMSwgMTUpXG4gKiB0cnVlIG9uIHRoZSBmaXJzdCBoYWxmIG9mIGVhY2ggbW9udGguXG4gKlxuICogZGF0ZVJhbmdlKDI0LCBcIkRFQ1wiKVxuICogdHJ1ZSBvbiAyNHRoIG9mIERlY2VtYmVyIGVhY2ggeWVhci5cbiAqXG4gKiBkYXRlUmFuZ2UoMjQsIFwiREVDXCIsIDE5OTUpXG4gKiB0cnVlIG9uIDI0dGggb2YgRGVjZW1iZXIsIDE5OTUuXG4gKlxuICogZGF0ZVJhbmdlKFwiSkFOXCIsIFwiTUFSXCIpXG4gKiB0cnVlIG9uIHRoZSBmaXJzdCBxdWFydGVyIG9mIHRoZSB5ZWFyLlxuICpcbiAqIGRhdGVSYW5nZSgxLCBcIkpVTlwiLCAxNSwgXCJBVUdcIilcbiAqIHRydWUgZnJvbSBKdW5lIDFzdCB1bnRpbCBBdWd1c3QgMTV0aCwgZWFjaCB5ZWFyIChpbmNsdWRpbmcgSnVuZSAxc3QgYW5kIEF1Z3VzdFxuICogMTV0aCkuXG4gKlxuICogZGF0ZVJhbmdlKDEsIFwiSlVOXCIsIDE1LCAxOTk1LCBcIkFVR1wiLCAxOTk1KVxuICogdHJ1ZSBmcm9tIEp1bmUgMXN0LCAxOTk1LCB1bnRpbCBBdWd1c3QgMTV0aCwgc2FtZSB5ZWFyLlxuICpcbiAqIGRhdGVSYW5nZShcIk9DVFwiLCAxOTk1LCBcIk1BUlwiLCAxOTk2KVxuICogdHJ1ZSBmcm9tIE9jdG9iZXIgMTk5NSB1bnRpbCBNYXJjaCAxOTk2IChpbmNsdWRpbmcgdGhlIGVudGlyZSBtb250aCBvZiBPY3RvYmVyXG4gKiAxOTk1IGFuZCBNYXJjaCAxOTk2KS5cbiAqXG4gKiBkYXRlUmFuZ2UoMTk5NSlcbiAqIHRydWUgZHVyaW5nIHRoZSBlbnRpcmUgeWVhciAxOTk1LlxuICpcbiAqIGRhdGVSYW5nZSgxOTk1LCAxOTk3KVxuICogdHJ1ZSBmcm9tIGJlZ2lubmluZyBvZiB5ZWFyIDE5OTUgdW50aWwgdGhlIGVuZCBvZiB5ZWFyIDE5OTcuXG4gKiBgYGBcbiAqXG4gKiBkYXRlUmFuZ2UoZGF5KVxuICogZGF0ZVJhbmdlKGRheTEsIGRheTIpXG4gKiBkYXRlUmFuZ2UobW9uKVxuICogZGF0ZVJhbmdlKG1vbnRoMSwgbW9udGgyKVxuICogZGF0ZVJhbmdlKHllYXIpXG4gKiBkYXRlUmFuZ2UoeWVhcjEsIHllYXIyKVxuICogZGF0ZVJhbmdlKGRheTEsIG1vbnRoMSwgZGF5MiwgbW9udGgyKVxuICogZGF0ZVJhbmdlKG1vbnRoMSwgeWVhcjEsIG1vbnRoMiwgeWVhcjIpXG4gKiBkYXRlUmFuZ2UoZGF5MSwgbW9udGgxLCB5ZWFyMSwgZGF5MiwgbW9udGgyLCB5ZWFyMilcbiAqIGRhdGVSYW5nZShkYXkxLCBtb250aDEsIHllYXIxLCBkYXkyLCBtb250aDIsIHllYXIyLCBnbXQpXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGRheSBpcyB0aGUgZGF5IG9mIG1vbnRoIGJldHdlZW4gMSBhbmQgMzEgKGFzIGFuIGludGVnZXIpLlxuICogQHBhcmFtIHtTdHJpbmd9IG1vbnRoIGlzIG9uZSBvZiB0aGUgbW9udGggc3RyaW5nczogSkFOIEZFQiBNQVIgQVBSIE1BWSBKVU4gSlVMIEFVRyBTRVAgT0NUIE5PViBERUNcbiAqIEBwYXJhbSB7U3RyaW5nfSB5ZWFyIGlzIHRoZSBmdWxsIHllYXIgbnVtYmVyLCBmb3IgZXhhbXBsZSAxOTk1IChidXQgbm90IDk1KS4gSW50ZWdlci5cbiAqIEBwYXJhbSB7U3RyaW5nfSBnbXQgaXMgZWl0aGVyIHRoZSBzdHJpbmcgXCJHTVRcIiwgd2hpY2ggbWFrZXMgdGltZSBjb21wYXJpc29uIG9jY3VyIGluIEdNVCB0aW1lem9uZTsgaWYgbGVmdCB1bnNwZWNpZmllZCwgdGltZXMgYXJlIHRha2VuIHRvIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIGRhdGVSYW5nZSgpIHtcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbWUhXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGF0ZVJhbmdlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0ZVJhbmdlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWZmIHRoZSBkb21haW4gb2YgaG9zdG5hbWUgbWF0Y2hlcy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIGRuc0RvbWFpbklzKFwid3d3Lm5ldHNjYXBlLmNvbVwiLCBcIi5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgdHJ1ZS5cbiAqXG4gKiBkbnNEb21haW5JcyhcInd3d1wiLCBcIi5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgZmFsc2UuXG4gKlxuICogZG5zRG9tYWluSXMoXCJ3d3cubWNvbS5jb21cIiwgXCIubmV0c2NhcGUuY29tXCIpXG4gKiAgIC8vIGlzIGZhbHNlLlxuICogYGBgXG4gKlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3N0IGlzIHRoZSBob3N0bmFtZSBmcm9tIHRoZSBVUkwuXG4gKiBAcGFyYW0ge1N0cmluZ30gZG9tYWluIGlzIHRoZSBkb21haW4gbmFtZSB0byB0ZXN0IHRoZSBob3N0bmFtZSBhZ2FpbnN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZmYgdGhlIGRvbWFpbiBvZiB0aGUgaG9zdG5hbWUgbWF0Y2hlcy5cbiAqL1xuZnVuY3Rpb24gZG5zRG9tYWluSXMoaG9zdCwgZG9tYWluKSB7XG4gICAgaG9zdCA9IFN0cmluZyhob3N0KTtcbiAgICBkb21haW4gPSBTdHJpbmcoZG9tYWluKTtcbiAgICByZXR1cm4gaG9zdC5zdWJzdHIoZG9tYWluLmxlbmd0aCAqIC0xKSA9PT0gZG9tYWluO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZG5zRG9tYWluSXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kbnNEb21haW5Jcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIChpbnRlZ2VyKSBvZiBETlMgZG9tYWluIGxldmVscyAobnVtYmVyIG9mIGRvdHMpIGluIHRoZVxuICogaG9zdG5hbWUuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBgIGpzXG4gKiBkbnNEb21haW5MZXZlbHMoXCJ3d3dcIilcbiAqICAgLy8gcmV0dXJucyAwLlxuICogZG5zRG9tYWluTGV2ZWxzKFwid3d3Lm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyByZXR1cm5zIDIuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdCBpcyB0aGUgaG9zdG5hbWUgZnJvbSB0aGUgVVJMLlxuICogQHJldHVybiB7TnVtYmVyfSBudW1iZXIgb2YgZG9tYWluIGxldmVsc1xuICovXG5mdW5jdGlvbiBkbnNEb21haW5MZXZlbHMoaG9zdCkge1xuICAgIGNvbnN0IG1hdGNoID0gU3RyaW5nKGhvc3QpLm1hdGNoKC9cXC4vZyk7XG4gICAgbGV0IGxldmVscyA9IDA7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGxldmVscyA9IG1hdGNoLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGxldmVscztcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRuc0RvbWFpbkxldmVscztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRuc0RvbWFpbkxldmVscy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG4vKipcbiAqIFJlc29sdmVzIHRoZSBnaXZlbiBETlMgaG9zdG5hbWUgaW50byBhbiBJUCBhZGRyZXNzLCBhbmQgcmV0dXJucyBpdCBpbiB0aGUgZG90XG4gKiBzZXBhcmF0ZWQgZm9ybWF0IGFzIGEgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgIGpzXG4gKiBkbnNSZXNvbHZlKFwiaG9tZS5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gcmV0dXJucyB0aGUgc3RyaW5nIFwiMTk4Ljk1LjI0OS43OVwiLlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhvc3QgaG9zdG5hbWUgdG8gcmVzb2x2ZVxuICogQHJldHVybiB7U3RyaW5nfSByZXNvbHZlZCBJUCBhZGRyZXNzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRuc1Jlc29sdmUoaG9zdCkge1xuICAgIGNvbnN0IGZhbWlseSA9IDQ7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0ICgwLCB1dGlsXzEuZG5zTG9va3VwKShob3N0LCB7IGZhbWlseSB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiByID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBAaWdub3JlXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZG5zUmVzb2x2ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRuc1Jlc29sdmUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnNhbmRib3ggPSBleHBvcnRzLmNyZWF0ZVBhY1Jlc29sdmVyID0gdm9pZCAwO1xuY29uc3QgZGVnZW5lcmF0b3JfMSA9IHJlcXVpcmUoXCJkZWdlbmVyYXRvclwiKTtcbi8qKlxuICogQnVpbHQtaW4gUEFDIGZ1bmN0aW9ucy5cbiAqL1xuY29uc3QgZGF0ZVJhbmdlXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZGF0ZVJhbmdlXCIpKTtcbmNvbnN0IGRuc0RvbWFpbklzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZG5zRG9tYWluSXNcIikpO1xuY29uc3QgZG5zRG9tYWluTGV2ZWxzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZG5zRG9tYWluTGV2ZWxzXCIpKTtcbmNvbnN0IGRuc1Jlc29sdmVfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kbnNSZXNvbHZlXCIpKTtcbmNvbnN0IGlzSW5OZXRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9pc0luTmV0XCIpKTtcbmNvbnN0IGlzUGxhaW5Ib3N0TmFtZV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2lzUGxhaW5Ib3N0TmFtZVwiKSk7XG5jb25zdCBpc1Jlc29sdmFibGVfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9pc1Jlc29sdmFibGVcIikpO1xuY29uc3QgbG9jYWxIb3N0T3JEb21haW5Jc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2xvY2FsSG9zdE9yRG9tYWluSXNcIikpO1xuY29uc3QgbXlJcEFkZHJlc3NfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9teUlwQWRkcmVzc1wiKSk7XG5jb25zdCBzaEV4cE1hdGNoXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vc2hFeHBNYXRjaFwiKSk7XG5jb25zdCB0aW1lUmFuZ2VfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90aW1lUmFuZ2VcIikpO1xuY29uc3Qgd2Vla2RheVJhbmdlXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vd2Vla2RheVJhbmdlXCIpKTtcbi8qKlxuICogUmV0dXJucyBhbiBhc3luY2hyb25vdXMgYEZpbmRQcm94eUZvclVSTCgpYCBmdW5jdGlvblxuICogZnJvbSB0aGUgZ2l2ZW4gSlMgc3RyaW5nIChmcm9tIGEgUEFDIGZpbGUpLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQYWNSZXNvbHZlcihxanMsIF9zdHIsIF9vcHRzID0ge30pIHtcbiAgICBjb25zdCBzdHIgPSBCdWZmZXIuaXNCdWZmZXIoX3N0cikgPyBfc3RyLnRvU3RyaW5nKCd1dGY4JykgOiBfc3RyO1xuICAgIC8vIFRoZSBzYW5kYm94IHRvIHVzZSBmb3IgdGhlIGB2bWAgY29udGV4dC5cbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAuLi5leHBvcnRzLnNhbmRib3gsXG4gICAgICAgIC4uLl9vcHRzLnNhbmRib3gsXG4gICAgfTtcbiAgICAvLyBDb25zdHJ1Y3QgdGhlIGFycmF5IG9mIGFzeW5jIGZ1bmN0aW9uIG5hbWVzIHRvIGFkZCBgYXdhaXRgIGNhbGxzIHRvLlxuICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoY29udGV4dCkuZmlsdGVyKChrKSA9PiBpc0FzeW5jRnVuY3Rpb24oY29udGV4dFtrXSkpO1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIGZpbGVuYW1lOiAncHJveHkucGFjJyxcbiAgICAgICAgbmFtZXMsXG4gICAgICAgIC4uLl9vcHRzLFxuICAgICAgICBzYW5kYm94OiBjb250ZXh0LFxuICAgIH07XG4gICAgLy8gQ29tcGlsZSB0aGUgSlMgYEZpbmRQcm94eUZvclVSTCgpYCBmdW5jdGlvbiBpbnRvIGFuIGFzeW5jIGZ1bmN0aW9uLlxuICAgIGNvbnN0IHJlc29sdmVyID0gKDAsIGRlZ2VuZXJhdG9yXzEuY29tcGlsZSkocWpzLCBzdHIsICdGaW5kUHJveHlGb3JVUkwnLCBvcHRzKTtcbiAgICBmdW5jdGlvbiBGaW5kUHJveHlGb3JVUkwodXJsLCBfaG9zdCkge1xuICAgICAgICBjb25zdCB1cmxPYmogPSB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyA/IG5ldyBVUkwodXJsKSA6IHVybDtcbiAgICAgICAgY29uc3QgaG9zdCA9IF9ob3N0IHx8IHVybE9iai5ob3N0bmFtZTtcbiAgICAgICAgaWYgKCFob3N0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgZGV0ZXJtaW5lIGBob3N0YCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlcih1cmxPYmouaHJlZiwgaG9zdCk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGaW5kUHJveHlGb3JVUkwsICd0b1N0cmluZycsIHtcbiAgICAgICAgdmFsdWU6ICgpID0+IHJlc29sdmVyLnRvU3RyaW5nKCksXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiBGaW5kUHJveHlGb3JVUkw7XG59XG5leHBvcnRzLmNyZWF0ZVBhY1Jlc29sdmVyID0gY3JlYXRlUGFjUmVzb2x2ZXI7XG5leHBvcnRzLnNhbmRib3ggPSBPYmplY3QuZnJlZXplKHtcbiAgICBhbGVydDogKG1lc3NhZ2UgPSAnJykgPT4gY29uc29sZS5sb2coJyVzJywgbWVzc2FnZSksXG4gICAgZGF0ZVJhbmdlOiBkYXRlUmFuZ2VfMS5kZWZhdWx0LFxuICAgIGRuc0RvbWFpbklzOiBkbnNEb21haW5Jc18xLmRlZmF1bHQsXG4gICAgZG5zRG9tYWluTGV2ZWxzOiBkbnNEb21haW5MZXZlbHNfMS5kZWZhdWx0LFxuICAgIGRuc1Jlc29sdmU6IGRuc1Jlc29sdmVfMS5kZWZhdWx0LFxuICAgIGlzSW5OZXQ6IGlzSW5OZXRfMS5kZWZhdWx0LFxuICAgIGlzUGxhaW5Ib3N0TmFtZTogaXNQbGFpbkhvc3ROYW1lXzEuZGVmYXVsdCxcbiAgICBpc1Jlc29sdmFibGU6IGlzUmVzb2x2YWJsZV8xLmRlZmF1bHQsXG4gICAgbG9jYWxIb3N0T3JEb21haW5JczogbG9jYWxIb3N0T3JEb21haW5Jc18xLmRlZmF1bHQsXG4gICAgbXlJcEFkZHJlc3M6IG15SXBBZGRyZXNzXzEuZGVmYXVsdCxcbiAgICBzaEV4cE1hdGNoOiBzaEV4cE1hdGNoXzEuZGVmYXVsdCxcbiAgICB0aW1lUmFuZ2U6IHRpbWVSYW5nZV8xLmRlZmF1bHQsXG4gICAgd2Vla2RheVJhbmdlOiB3ZWVrZGF5UmFuZ2VfMS5kZWZhdWx0LFxufSk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gaXNBc3luY0Z1bmN0aW9uKHYpIHtcbiAgICBpZiAodHlwZW9mIHYgIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBOYXRpdmUgYEFzeW5jRnVuY3Rpb25gXG4gICAgaWYgKHYuY29uc3RydWN0b3IubmFtZSA9PT0gJ0FzeW5jRnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBUeXBlU2NyaXB0IGNvbXBpbGVkXG4gICAgaWYgKFN0cmluZyh2KS5pbmRleE9mKCdfX2F3YWl0ZXIoJykgIT09IC0xKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBMZWdhY3kgYmVoYXZpb3IgLSBzZXQgYGFzeW5jYCBwcm9wZXJ0eSBvbiB0aGUgZnVuY3Rpb25cbiAgICByZXR1cm4gQm9vbGVhbih2LmFzeW5jKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pcCA9IHZvaWQgMDtcbmNvbnN0IG9zXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIm9zXCIpKTtcbmV4cG9ydHMuaXAgPSB7XG4gICAgYWRkcmVzcygpIHtcbiAgICAgICAgY29uc3QgaW50ZXJmYWNlcyA9IG9zXzEuZGVmYXVsdC5uZXR3b3JrSW50ZXJmYWNlcygpO1xuICAgICAgICAvLyBEZWZhdWx0IHRvIGBpcHY0YFxuICAgICAgICBjb25zdCBmYW1pbHkgPSBub3JtYWxpemVGYW1pbHkoKTtcbiAgICAgICAgY29uc3QgYWxsID0gT2JqZWN0LnZhbHVlcyhpbnRlcmZhY2VzKS5tYXAoKGFkZHJzID0gW10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IGFkZHJzLmZpbHRlcigoZGV0YWlscykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHNGYW1pbHkgPSBub3JtYWxpemVGYW1pbHkoZGV0YWlscy5mYW1pbHkpO1xuICAgICAgICAgICAgICAgIGlmIChkZXRhaWxzRmFtaWx5ICE9PSBmYW1pbHkgfHwgZXhwb3J0cy5pcC5pc0xvb3BiYWNrKGRldGFpbHMuYWRkcmVzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3Nlcy5sZW5ndGggPyBhZGRyZXNzZXNbMF0uYWRkcmVzcyA6IHVuZGVmaW5lZDtcbiAgICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICByZXR1cm4gIWFsbC5sZW5ndGggPyBleHBvcnRzLmlwLmxvb3BiYWNrKGZhbWlseSkgOiBhbGxbMF07XG4gICAgfSxcbiAgICBpc0xvb3BiYWNrKGFkZHIpIHtcbiAgICAgICAgcmV0dXJuIC9eKDo6Zns0fTopPzEyN1xcLihbMC05XXsxLDN9KVxcLihbMC05XXsxLDN9KVxcLihbMC05XXsxLDN9KS9cbiAgICAgICAgICAgIC50ZXN0KGFkZHIpXG4gICAgICAgICAgICB8fCAvXmZlODA6OjEkLy50ZXN0KGFkZHIpXG4gICAgICAgICAgICB8fCAvXjo6MSQvLnRlc3QoYWRkcilcbiAgICAgICAgICAgIHx8IC9eOjokLy50ZXN0KGFkZHIpO1xuICAgIH0sXG4gICAgbG9vcGJhY2soZmFtaWx5KSB7XG4gICAgICAgIC8vIERlZmF1bHQgdG8gYGlwdjRgXG4gICAgICAgIGZhbWlseSA9IG5vcm1hbGl6ZUZhbWlseShmYW1pbHkpO1xuICAgICAgICBpZiAoZmFtaWx5ICE9PSAnaXB2NCcgJiYgZmFtaWx5ICE9PSAnaXB2NicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZmFtaWx5IG11c3QgYmUgaXB2NCBvciBpcHY2Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbWlseSA9PT0gJ2lwdjQnID8gJzEyNy4wLjAuMScgOiAnZmU4MDo6MSc7XG4gICAgfVxufTtcbmZ1bmN0aW9uIG5vcm1hbGl6ZUZhbWlseShmYW1pbHkpIHtcbiAgICBpZiAoZmFtaWx5ID09PSA0KSB7XG4gICAgICAgIHJldHVybiAnaXB2NCc7XG4gICAgfVxuICAgIGlmIChmYW1pbHkgPT09IDYpIHtcbiAgICAgICAgcmV0dXJuICdpcHY2JztcbiAgICB9XG4gICAgcmV0dXJuIGZhbWlseSA/IGZhbWlseS50b0xvd2VyQ2FzZSgpIDogJ2lwdjQnO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXAuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBuZXRtYXNrXzEgPSByZXF1aXJlKFwibmV0bWFza1wiKTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG4vKipcbiAqIFRydWUgaWZmIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBJUCBhZGRyZXNzIHBhdHRlcm4uXG4gKlxuICogUGF0dGVybiBhbmQgbWFzayBzcGVjaWZpY2F0aW9uIGlzIGRvbmUgdGhlIHNhbWUgd2F5IGFzIGZvciBTT0NLUyBjb25maWd1cmF0aW9uLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYCBqc1xuICogaXNJbk5ldChob3N0LCBcIjE5OC45NS4yNDkuNzlcIiwgXCIyNTUuMjU1LjI1NS4yNTVcIilcbiAqICAgLy8gaXMgdHJ1ZSBpZmYgdGhlIElQIGFkZHJlc3Mgb2YgaG9zdCBtYXRjaGVzIGV4YWN0bHkgMTk4Ljk1LjI0OS43OS5cbiAqXG4gKiBpc0luTmV0KGhvc3QsIFwiMTk4Ljk1LjAuMFwiLCBcIjI1NS4yNTUuMC4wXCIpXG4gKiAgIC8vIGlzIHRydWUgaWZmIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IG1hdGNoZXMgMTk4Ljk1LiouKi5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3N0IGEgRE5TIGhvc3RuYW1lLCBvciBJUCBhZGRyZXNzLiBJZiBhIGhvc3RuYW1lIGlzIHBhc3NlZCxcbiAqICAgaXQgd2lsbCBiZSByZXNvdmVkIGludG8gYW4gSVAgYWRkcmVzcyBieSB0aGlzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gYW4gSVAgYWRkcmVzcyBwYXR0ZXJuIGluIHRoZSBkb3Qtc2VwYXJhdGVkIGZvcm1hdCBtYXNrLlxuICogQHBhcmFtIHtTdHJpbmd9IG1hc2sgZm9yIHRoZSBJUCBhZGRyZXNzIHBhdHRlcm4gaW5mb3JtaW5nIHdoaWNoIHBhcnRzIG9mIHRoZVxuICogICBJUCBhZGRyZXNzIHNob3VsZCBiZSBtYXRjaGVkIGFnYWluc3QuIDAgbWVhbnMgaWdub3JlLCAyNTUgbWVhbnMgbWF0Y2guXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiBpc0luTmV0KGhvc3QsIHBhdHRlcm4sIG1hc2spIHtcbiAgICBjb25zdCBmYW1pbHkgPSA0O1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGlwID0gYXdhaXQgKDAsIHV0aWxfMS5kbnNMb29rdXApKGhvc3QsIHsgZmFtaWx5IH0pO1xuICAgICAgICBpZiAodHlwZW9mIGlwID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgbmV0bWFzayA9IG5ldyBuZXRtYXNrXzEuTmV0bWFzayhwYXR0ZXJuLCBtYXNrKTtcbiAgICAgICAgICAgIHJldHVybiBuZXRtYXNrLmNvbnRhaW5zKGlwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBpc0luTmV0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNJbk5ldC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogVHJ1ZSBpZmYgdGhlcmUgaXMgbm8gZG9tYWluIG5hbWUgaW4gdGhlIGhvc3RuYW1lIChubyBkb3RzKS5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIGlzUGxhaW5Ib3N0TmFtZShcInd3d1wiKVxuICogICAvLyBpcyB0cnVlLlxuICpcbiAqIGlzUGxhaW5Ib3N0TmFtZShcInd3dy5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgZmFsc2UuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdCBUaGUgaG9zdG5hbWUgZnJvbSB0aGUgVVJMIChleGNsdWRpbmcgcG9ydCBudW1iZXIpLlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZnVuY3Rpb24gaXNQbGFpbkhvc3ROYW1lKGhvc3QpIHtcbiAgICByZXR1cm4gIS9cXC4vLnRlc3QoaG9zdCk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBpc1BsYWluSG9zdE5hbWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc1BsYWluSG9zdE5hbWUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuLyoqXG4gKiBUcmllcyB0byByZXNvbHZlIHRoZSBob3N0bmFtZS4gUmV0dXJucyB0cnVlIGlmIHN1Y2NlZWRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3N0IGlzIHRoZSBob3N0bmFtZSBmcm9tIHRoZSBVUkwuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiBpc1Jlc29sdmFibGUoaG9zdCkge1xuICAgIGNvbnN0IGZhbWlseSA9IDQ7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGF3YWl0ICgwLCB1dGlsXzEuZG5zTG9va3VwKShob3N0LCB7IGZhbWlseSB9KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gaXNSZXNvbHZhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNSZXNvbHZhYmxlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqXG4gKiBJcyB0cnVlIGlmIHRoZSBob3N0bmFtZSBtYXRjaGVzIGV4YWN0bHkgdGhlIHNwZWNpZmllZCBob3N0bmFtZSwgb3IgaWYgdGhlcmUgaXNcbiAqIG5vIGRvbWFpbiBuYW1lIHBhcnQgaW4gdGhlIGhvc3RuYW1lLCBidXQgdGhlIHVucXVhbGlmaWVkIGhvc3RuYW1lIG1hdGNoZXMuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBgIGpzXG4gKiBsb2NhbEhvc3RPckRvbWFpbklzKFwid3d3Lm5ldHNjYXBlLmNvbVwiLCBcInd3dy5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgdHJ1ZSAoZXhhY3QgbWF0Y2gpLlxuICpcbiAqIGxvY2FsSG9zdE9yRG9tYWluSXMoXCJ3d3dcIiwgXCJ3d3cubmV0c2NhcGUuY29tXCIpXG4gKiAgIC8vIGlzIHRydWUgKGhvc3RuYW1lIG1hdGNoLCBkb21haW4gbm90IHNwZWNpZmllZCkuXG4gKlxuICogbG9jYWxIb3N0T3JEb21haW5JcyhcInd3dy5tY29tLmNvbVwiLCBcInd3dy5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgZmFsc2UgKGRvbWFpbiBuYW1lIG1pc21hdGNoKS5cbiAqXG4gKiBsb2NhbEhvc3RPckRvbWFpbklzKFwiaG9tZS5uZXRzY2FwZS5jb21cIiwgXCJ3d3cubmV0c2NhcGUuY29tXCIpXG4gKiAgIC8vIGlzIGZhbHNlIChob3N0bmFtZSBtaXNtYXRjaCkuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdCB0aGUgaG9zdG5hbWUgZnJvbSB0aGUgVVJMLlxuICogQHBhcmFtIHtTdHJpbmd9IGhvc3Rkb20gZnVsbHkgcXVhbGlmaWVkIGhvc3RuYW1lIHRvIG1hdGNoIGFnYWluc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBsb2NhbEhvc3RPckRvbWFpbklzKGhvc3QsIGhvc3Rkb20pIHtcbiAgICBjb25zdCBwYXJ0cyA9IGhvc3Quc3BsaXQoJy4nKTtcbiAgICBjb25zdCBkb21wYXJ0cyA9IGhvc3Rkb20uc3BsaXQoJy4nKTtcbiAgICBsZXQgbWF0Y2hlcyA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGFydHNbaV0gIT09IGRvbXBhcnRzW2ldKSB7XG4gICAgICAgICAgICBtYXRjaGVzID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlcztcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGxvY2FsSG9zdE9yRG9tYWluSXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2NhbEhvc3RPckRvbWFpbklzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgaXBfMSA9IHJlcXVpcmUoXCIuL2lwXCIpO1xuY29uc3QgbmV0XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIm5ldFwiKSk7XG4vKipcbiAqIFJldHVybnMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdGhhdCB0aGUgTmF2aWdhdG9yIGlzIHJ1bm5pbmcgb24sIGFzXG4gKiBhIHN0cmluZyBpbiB0aGUgZG90LXNlcGFyYXRlZCBpbnRlZ2VyIGZvcm1hdC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYCBqc1xuICogbXlJcEFkZHJlc3MoKVxuICogICAvLyB3b3VsZCByZXR1cm4gdGhlIHN0cmluZyBcIjE5OC45NS4yNDkuNzlcIiBpZiB5b3Ugd2VyZSBydW5uaW5nIHRoZVxuICogICAvLyBOYXZpZ2F0b3Igb24gdGhhdCBob3N0LlxuICogYGBgXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSBleHRlcm5hbCBJUCBhZGRyZXNzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG15SXBBZGRyZXNzKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIDguOC44Ljg6NTMgaXMgXCJHb29nbGUgUHVibGljIEROU1wiOlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zcGVlZC9wdWJsaWMtZG5zL1xuICAgICAgICBjb25zdCBzb2NrZXQgPSBuZXRfMS5kZWZhdWx0LmNvbm5lY3QoeyBob3N0OiAnOC44LjguOCcsIHBvcnQ6IDUzIH0pO1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gaWYgd2UgZmFpbCB0byBhY2Nlc3MgR29vZ2xlIEROUyAoYXMgaW4gZmlyZXdhbGwgYmxvY2tzIGFjY2VzcyksXG4gICAgICAgICAgICAvLyBmYWxsYmFjayB0byBxdWVyeWluZyBJUCBsb2NhbGx5XG4gICAgICAgICAgICByZXNvbHZlKGlwXzEuaXAuYWRkcmVzcygpKTtcbiAgICAgICAgfTtcbiAgICAgICAgc29ja2V0Lm9uY2UoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHNvY2tldC5vbmNlKCdjb25uZWN0JywgKCkgPT4ge1xuICAgICAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICAgICAgY29uc3QgYWRkciA9IHNvY2tldC5hZGRyZXNzKCk7XG4gICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhZGRyID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoYWRkcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhZGRyLmFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGFkZHIuYWRkcmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdFeHBlY3RlZCBhIGBzdHJpbmdgJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IG15SXBBZGRyZXNzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bXlJcEFkZHJlc3MuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBzaGVsbFxuICogZXhwcmVzc2lvbi5cbiAqXG4gKiBBY3R1YWxseSwgY3VycmVudGx5IHRoZSBwYXR0ZXJucyBhcmUgc2hlbGwgZXhwcmVzc2lvbnMsXG4gKiBub3QgcmVndWxhciBleHByZXNzaW9ucy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIHNoRXhwTWF0Y2goXCJodHRwOi8vaG9tZS5uZXRzY2FwZS5jb20vcGVvcGxlL2FyaS9pbmRleC5odG1sXCIsIFwiKlxcL2FyaS8qXCIpXG4gKiAgIC8vIGlzIHRydWUuXG4gKlxuICogc2hFeHBNYXRjaChcImh0dHA6Ly9ob21lLm5ldHNjYXBlLmNvbS9wZW9wbGUvbW9udHVsbGkvaW5kZXguaHRtbFwiLCBcIipcXC9hcmkvKlwiKVxuICogICAvLyBpcyBmYWxzZS5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgaXMgYW55IHN0cmluZyB0byBjb21wYXJlIChlLmcuIHRoZSBVUkwsIG9yIHRoZSBob3N0bmFtZSkuXG4gKiBAcGFyYW0ge1N0cmluZ30gc2hleHAgaXMgYSBzaGVsbCBleHByZXNzaW9uIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIHN0cmluZyBtYXRjaGVzIHRoZSBzaGVsbCBleHByZXNzaW9uLlxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiBzaEV4cE1hdGNoKHN0ciwgc2hleHApIHtcbiAgICBjb25zdCByZSA9IHRvUmVnRXhwKHNoZXhwKTtcbiAgICByZXR1cm4gcmUudGVzdChzdHIpO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gc2hFeHBNYXRjaDtcbi8qKlxuICogQ29udmVydHMgYSBcInNoZWxsIGV4cHJlc3Npb25cIiB0byBhIEphdmFTY3JpcHQgUmVnRXhwLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0b1JlZ0V4cChzdHIpIHtcbiAgICBzdHIgPSBTdHJpbmcoc3RyKVxuICAgICAgICAucmVwbGFjZSgvXFwuL2csICdcXFxcLicpXG4gICAgICAgIC5yZXBsYWNlKC9cXD8vZywgJy4nKVxuICAgICAgICAucmVwbGFjZSgvXFwqL2csICcuKicpO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHtzdHJ9JGApO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hFeHBNYXRjaC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogVHJ1ZSBkdXJpbmcgKG9yIGJldHdlZW4pIHRoZSBzcGVjaWZpZWQgdGltZShzKS5cbiAqXG4gKiBFdmVuIHRob3VnaCB0aGUgZXhhbXBsZXMgZG9uJ3Qgc2hvdyBpdCwgdGhpcyBwYXJhbWV0ZXIgbWF5IGJlIHByZXNlbnQgaW5cbiAqIGVhY2ggb2YgdGhlIGRpZmZlcmVudCBwYXJhbWV0ZXIgcHJvZmlsZXMsIGFsd2F5cyBhcyB0aGUgbGFzdCBwYXJhbWV0ZXIuXG4gKlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYCBqc1xuICogdGltZXJhbmdlKDEyKVxuICogdHJ1ZSBmcm9tIG5vb24gdG8gMXBtLlxuICpcbiAqIHRpbWVyYW5nZSgxMiwgMTMpXG4gKiBzYW1lIGFzIGFib3ZlLlxuICpcbiAqIHRpbWVyYW5nZSgxMiwgXCJHTVRcIilcbiAqIHRydWUgZnJvbSBub29uIHRvIDFwbSwgaW4gR01UIHRpbWV6b25lLlxuICpcbiAqIHRpbWVyYW5nZSg5LCAxNylcbiAqIHRydWUgZnJvbSA5YW0gdG8gNXBtLlxuICpcbiAqIHRpbWVyYW5nZSg4LCAzMCwgMTcsIDAwKVxuICogdHJ1ZSBmcm9tIDg6MzBhbSB0byA1OjAwcG0uXG4gKlxuICogdGltZXJhbmdlKDAsIDAsIDAsIDAsIDAsIDMwKVxuICogdHJ1ZSBiZXR3ZWVuIG1pZG5pZ2h0IGFuZCAzMCBzZWNvbmRzIHBhc3QgbWlkbmlnaHQuXG4gKiBgYGBcbiAqXG4gKiB0aW1lUmFuZ2UoaG91cilcbiAqIHRpbWVSYW5nZShob3VyMSwgaG91cjIpXG4gKiB0aW1lUmFuZ2UoaG91cjEsIG1pbjEsIGhvdXIyLCBtaW4yKVxuICogdGltZVJhbmdlKGhvdXIxLCBtaW4xLCBzZWMxLCBob3VyMiwgbWluMiwgc2VjMilcbiAqIHRpbWVSYW5nZShob3VyMSwgbWluMSwgc2VjMSwgaG91cjIsIG1pbjIsIHNlYzIsIGdtdClcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaG91ciBpcyB0aGUgaG91ciBmcm9tIDAgdG8gMjMuICgwIGlzIG1pZG5pZ2h0LCAyMyBpcyAxMSBwbS4pXG4gKiBAcGFyYW0ge1N0cmluZ30gbWluIG1pbnV0ZXMgZnJvbSAwIHRvIDU5LlxuICogQHBhcmFtIHtTdHJpbmd9IHNlYyBzZWNvbmRzIGZyb20gMCB0byA1OS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBnbXQgZWl0aGVyIHRoZSBzdHJpbmcgXCJHTVRcIiBmb3IgR01UIHRpbWV6b25lLCBvciBub3Qgc3BlY2lmaWVkLCBmb3IgbG9jYWwgdGltZXpvbmUuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiB0aW1lUmFuZ2UoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGNvbnN0IGxhc3RBcmcgPSBhcmdzLnBvcCgpO1xuICAgIGNvbnN0IHVzZUdNVHpvbmUgPSBsYXN0QXJnID09PSAnR01UJztcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgaWYgKCF1c2VHTVR6b25lKSB7XG4gICAgICAgIGFyZ3MucHVzaChsYXN0QXJnKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgIGNvbnN0IG5vT2ZBcmdzID0gYXJncy5sZW5ndGg7XG4gICAgY29uc3QgbnVtZXJpY0FyZ3MgPSBhcmdzLm1hcCgobikgPT4gcGFyc2VJbnQobiwgMTApKTtcbiAgICAvLyB0aW1lUmFuZ2UoaG91cilcbiAgICBpZiAobm9PZkFyZ3MgPT09IDEpIHtcbiAgICAgICAgcmVzdWx0ID0gZ2V0Q3VycmVudEhvdXIodXNlR01Uem9uZSwgY3VycmVudERhdGUpID09PSBudW1lcmljQXJnc1swXTtcbiAgICAgICAgLy8gdGltZVJhbmdlKGhvdXIxLCBob3VyMilcbiAgICB9XG4gICAgZWxzZSBpZiAobm9PZkFyZ3MgPT09IDIpIHtcbiAgICAgICAgY29uc3QgY3VycmVudEhvdXIgPSBnZXRDdXJyZW50SG91cih1c2VHTVR6b25lLCBjdXJyZW50RGF0ZSk7XG4gICAgICAgIHJlc3VsdCA9IG51bWVyaWNBcmdzWzBdIDw9IGN1cnJlbnRIb3VyICYmIGN1cnJlbnRIb3VyIDwgbnVtZXJpY0FyZ3NbMV07XG4gICAgICAgIC8vIHRpbWVSYW5nZShob3VyMSwgbWluMSwgaG91cjIsIG1pbjIpXG4gICAgfVxuICAgIGVsc2UgaWYgKG5vT2ZBcmdzID09PSA0KSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlSW5SYW5nZShzZWNvbmRzRWxhcHNlZFRvZGF5KG51bWVyaWNBcmdzWzBdLCBudW1lcmljQXJnc1sxXSwgMCksIHNlY29uZHNFbGFwc2VkVG9kYXkoZ2V0Q3VycmVudEhvdXIodXNlR01Uem9uZSwgY3VycmVudERhdGUpLCBnZXRDdXJyZW50TWludXRlKHVzZUdNVHpvbmUsIGN1cnJlbnREYXRlKSwgMCksIHNlY29uZHNFbGFwc2VkVG9kYXkobnVtZXJpY0FyZ3NbMl0sIG51bWVyaWNBcmdzWzNdLCA1OSkpO1xuICAgICAgICAvLyB0aW1lUmFuZ2UoaG91cjEsIG1pbjEsIHNlYzEsIGhvdXIyLCBtaW4yLCBzZWMyKVxuICAgIH1cbiAgICBlbHNlIGlmIChub09mQXJncyA9PT0gNikge1xuICAgICAgICByZXN1bHQgPSB2YWx1ZUluUmFuZ2Uoc2Vjb25kc0VsYXBzZWRUb2RheShudW1lcmljQXJnc1swXSwgbnVtZXJpY0FyZ3NbMV0sIG51bWVyaWNBcmdzWzJdKSwgc2Vjb25kc0VsYXBzZWRUb2RheShnZXRDdXJyZW50SG91cih1c2VHTVR6b25lLCBjdXJyZW50RGF0ZSksIGdldEN1cnJlbnRNaW51dGUodXNlR01Uem9uZSwgY3VycmVudERhdGUpLCBnZXRDdXJyZW50U2Vjb25kKHVzZUdNVHpvbmUsIGN1cnJlbnREYXRlKSksIHNlY29uZHNFbGFwc2VkVG9kYXkobnVtZXJpY0FyZ3NbM10sIG51bWVyaWNBcmdzWzRdLCBudW1lcmljQXJnc1s1XSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gdGltZVJhbmdlO1xuZnVuY3Rpb24gc2Vjb25kc0VsYXBzZWRUb2RheShoaCwgbW0sIHNzKSB7XG4gICAgcmV0dXJuIGhoICogMzYwMCArIG1tICogNjAgKyBzcztcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRIb3VyKGdtdCwgY3VycmVudERhdGUpIHtcbiAgICByZXR1cm4gZ210ID8gY3VycmVudERhdGUuZ2V0VVRDSG91cnMoKSA6IGN1cnJlbnREYXRlLmdldEhvdXJzKCk7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50TWludXRlKGdtdCwgY3VycmVudERhdGUpIHtcbiAgICByZXR1cm4gZ210ID8gY3VycmVudERhdGUuZ2V0VVRDTWludXRlcygpIDogY3VycmVudERhdGUuZ2V0TWludXRlcygpO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudFNlY29uZChnbXQsIGN1cnJlbnREYXRlKSB7XG4gICAgcmV0dXJuIGdtdCA/IGN1cnJlbnREYXRlLmdldFVUQ1NlY29uZHMoKSA6IGN1cnJlbnREYXRlLmdldFNlY29uZHMoKTtcbn1cbi8vIHN0YXJ0IDw9IHZhbHVlIDw9IGZpbmlzaFxuZnVuY3Rpb24gdmFsdWVJblJhbmdlKHN0YXJ0LCB2YWx1ZSwgZmluaXNoKSB7XG4gICAgcmV0dXJuIHN0YXJ0IDw9IHZhbHVlICYmIHZhbHVlIDw9IGZpbmlzaDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWVSYW5nZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNHTVQgPSBleHBvcnRzLmRuc0xvb2t1cCA9IHZvaWQgMDtcbmNvbnN0IGRuc18xID0gcmVxdWlyZShcImRuc1wiKTtcbmZ1bmN0aW9uIGRuc0xvb2t1cChob3N0LCBvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgKDAsIGRuc18xLmxvb2t1cCkoaG9zdCwgb3B0cywgKGVyciwgcmVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kbnNMb29rdXAgPSBkbnNMb29rdXA7XG5mdW5jdGlvbiBpc0dNVCh2KSB7XG4gICAgcmV0dXJuIHYgPT09ICdHTVQnO1xufVxuZXhwb3J0cy5pc0dNVCA9IGlzR01UO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5jb25zdCB3ZWVrZGF5cyA9IFsnU1VOJywgJ01PTicsICdUVUUnLCAnV0VEJywgJ1RIVScsICdGUkknLCAnU0FUJ107XG4vKipcbiAqIE9ubHkgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBtYW5kYXRvcnkuIEVpdGhlciB0aGUgc2Vjb25kLCB0aGUgdGhpcmQsIG9yIGJvdGhcbiAqIG1heSBiZSBsZWZ0IG91dC5cbiAqXG4gKiBJZiBvbmx5IG9uZSBwYXJhbWV0ZXIgaXMgcHJlc2VudCwgdGhlIGZ1bmN0aW9uIHllaWxkcyBhIHRydWUgdmFsdWUgb24gdGhlXG4gKiB3ZWVrZGF5IHRoYXQgdGhlIHBhcmFtZXRlciByZXByZXNlbnRzLiBJZiB0aGUgc3RyaW5nIFwiR01UXCIgaXMgc3BlY2lmaWVkIGFzXG4gKiBhIHNlY29uZCBwYXJhbWV0ZXIsIHRpbWVzIGFyZSB0YWtlbiB0byBiZSBpbiBHTVQsIG90aGVyd2lzZSBpbiBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBJZiBib3RoIHdkMSBhbmQgd2QxIGFyZSBkZWZpbmVkLCB0aGUgY29uZGl0aW9uIGlzIHRydWUgaWYgdGhlIGN1cnJlbnQgd2Vla2RheVxuICogaXMgaW4gYmV0d2VlbiB0aG9zZSB0d28gd2Vla2RheXMuIEJvdW5kcyBhcmUgaW5jbHVzaXZlLiBJZiB0aGUgXCJHTVRcIiBwYXJhbWV0ZXJcbiAqIGlzIHNwZWNpZmllZCwgdGltZXMgYXJlIHRha2VuIHRvIGJlIGluIEdNVCwgb3RoZXJ3aXNlIHRoZSBsb2NhbCB0aW1lem9uZSBpc1xuICogdXNlZC5cbiAqXG4gKiBWYWxpZCBcIndlZWtkYXkgc3RyaW5nc1wiIGFyZTpcbiAqXG4gKiAgICAgU1VOIE1PTiBUVUUgV0VEIFRIVSBGUkkgU0FUXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBgIGpzXG4gKiB3ZWVrZGF5UmFuZ2UoXCJNT05cIiwgXCJGUklcIilcbiAqIHRydWUgTW9uZGF5IHRyaG91Z2ggRnJpZGF5IChsb2NhbCB0aW1lem9uZSkuXG4gKlxuICogd2Vla2RheVJhbmdlKFwiTU9OXCIsIFwiRlJJXCIsIFwiR01UXCIpXG4gKiBzYW1lIGFzIGFib3ZlLCBidXQgR01UIHRpbWV6b25lLlxuICpcbiAqIHdlZWtkYXlSYW5nZShcIlNBVFwiKVxuICogdHJ1ZSBvbiBTYXR1cmRheXMgbG9jYWwgdGltZS5cbiAqXG4gKiB3ZWVrZGF5UmFuZ2UoXCJTQVRcIiwgXCJHTVRcIilcbiAqIHRydWUgb24gU2F0dXJkYXlzIEdNVCB0aW1lLlxuICpcbiAqIHdlZWtkYXlSYW5nZShcIkZSSVwiLCBcIk1PTlwiKVxuICogdHJ1ZSBGcmlkYXkgdGhyb3VnaCBNb25kYXkgKG5vdGUsIG9yZGVyIGRvZXMgbWF0dGVyISkuXG4gKiBgYGBcbiAqXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHdkMSBvbmUgb2YgdGhlIHdlZWtkYXkgc3RyaW5ncy5cbiAqIEBwYXJhbSB7U3RyaW5nfSB3ZDIgb25lIG9mIHRoZSB3ZWVrZGF5IHN0cmluZ3MuXG4gKiBAcGFyYW0ge1N0cmluZ30gZ210IGlzIGVpdGhlciB0aGUgc3RyaW5nOiBHTVQgb3IgaXMgbGVmdCBvdXQuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiB3ZWVrZGF5UmFuZ2Uod2QxLCB3ZDIsIGdtdCkge1xuICAgIGxldCB1c2VHTVR6b25lID0gZmFsc2U7XG4gICAgbGV0IHdkMUluZGV4ID0gLTE7XG4gICAgbGV0IHdkMkluZGV4ID0gLTE7XG4gICAgbGV0IHdkMklzR210ID0gZmFsc2U7XG4gICAgaWYgKCgwLCB1dGlsXzEuaXNHTVQpKGdtdCkpIHtcbiAgICAgICAgdXNlR01Uem9uZSA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKCgwLCB1dGlsXzEuaXNHTVQpKHdkMikpIHtcbiAgICAgICAgdXNlR01Uem9uZSA9IHRydWU7XG4gICAgICAgIHdkMklzR210ID0gdHJ1ZTtcbiAgICB9XG4gICAgd2QxSW5kZXggPSB3ZWVrZGF5cy5pbmRleE9mKHdkMSk7XG4gICAgaWYgKCF3ZDJJc0dtdCAmJiBpc1dlZWtkYXkod2QyKSkge1xuICAgICAgICB3ZDJJbmRleCA9IHdlZWtkYXlzLmluZGV4T2Yod2QyKTtcbiAgICB9XG4gICAgY29uc3QgdG9kYXlzRGF5ID0gZ2V0VG9kYXlzRGF5KHVzZUdNVHpvbmUpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKHdkMkluZGV4IDwgMCkge1xuICAgICAgICByZXN1bHQgPSB0b2RheXNEYXkgPT09IHdkMUluZGV4O1xuICAgIH1cbiAgICBlbHNlIGlmICh3ZDFJbmRleCA8PSB3ZDJJbmRleCkge1xuICAgICAgICByZXN1bHQgPSB2YWx1ZUluUmFuZ2Uod2QxSW5kZXgsIHRvZGF5c0RheSwgd2QySW5kZXgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgIHZhbHVlSW5SYW5nZSh3ZDFJbmRleCwgdG9kYXlzRGF5LCA2KSB8fFxuICAgICAgICAgICAgICAgIHZhbHVlSW5SYW5nZSgwLCB0b2RheXNEYXksIHdkMkluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IHdlZWtkYXlSYW5nZTtcbmZ1bmN0aW9uIGdldFRvZGF5c0RheShnbXQpIHtcbiAgICByZXR1cm4gZ210ID8gbmV3IERhdGUoKS5nZXRVVENEYXkoKSA6IG5ldyBEYXRlKCkuZ2V0RGF5KCk7XG59XG4vLyBzdGFydCA8PSB2YWx1ZSA8PSBmaW5pc2hcbmZ1bmN0aW9uIHZhbHVlSW5SYW5nZShzdGFydCwgdmFsdWUsIGZpbmlzaCkge1xuICAgIHJldHVybiBzdGFydCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBmaW5pc2g7XG59XG5mdW5jdGlvbiBpc1dlZWtkYXkodikge1xuICAgIGlmICghdilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB3ZWVrZGF5cy5pbmNsdWRlcyh2KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlZWtkYXlSYW5nZS5qcy5tYXAiLCJtb2R1bGUuZXhwb3J0cyA9IFBlbmQ7XG5cbmZ1bmN0aW9uIFBlbmQoKSB7XG4gIHRoaXMucGVuZGluZyA9IDA7XG4gIHRoaXMubWF4ID0gSW5maW5pdHk7XG4gIHRoaXMubGlzdGVuZXJzID0gW107XG4gIHRoaXMud2FpdGluZyA9IFtdO1xuICB0aGlzLmVycm9yID0gbnVsbDtcbn1cblxuUGVuZC5wcm90b3R5cGUuZ28gPSBmdW5jdGlvbihmbikge1xuICBpZiAodGhpcy5wZW5kaW5nIDwgdGhpcy5tYXgpIHtcbiAgICBwZW5kR28odGhpcywgZm4pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMud2FpdGluZy5wdXNoKGZuKTtcbiAgfVxufTtcblxuUGVuZC5wcm90b3R5cGUud2FpdCA9IGZ1bmN0aW9uKGNiKSB7XG4gIGlmICh0aGlzLnBlbmRpbmcgPT09IDApIHtcbiAgICBjYih0aGlzLmVycm9yKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGNiKTtcbiAgfVxufTtcblxuUGVuZC5wcm90b3R5cGUuaG9sZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcGVuZEhvbGQodGhpcyk7XG59O1xuXG5mdW5jdGlvbiBwZW5kSG9sZChzZWxmKSB7XG4gIHNlbGYucGVuZGluZyArPSAxO1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBvbkNiO1xuICBmdW5jdGlvbiBvbkNiKGVycikge1xuICAgIGlmIChjYWxsZWQpIHRocm93IG5ldyBFcnJvcihcImNhbGxiYWNrIGNhbGxlZCB0d2ljZVwiKTtcbiAgICBjYWxsZWQgPSB0cnVlO1xuICAgIHNlbGYuZXJyb3IgPSBzZWxmLmVycm9yIHx8IGVycjtcbiAgICBzZWxmLnBlbmRpbmcgLT0gMTtcbiAgICBpZiAoc2VsZi53YWl0aW5nLmxlbmd0aCA+IDAgJiYgc2VsZi5wZW5kaW5nIDwgc2VsZi5tYXgpIHtcbiAgICAgIHBlbmRHbyhzZWxmLCBzZWxmLndhaXRpbmcuc2hpZnQoKSk7XG4gICAgfSBlbHNlIGlmIChzZWxmLnBlbmRpbmcgPT09IDApIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMgPSBzZWxmLmxpc3RlbmVycztcbiAgICAgIHNlbGYubGlzdGVuZXJzID0gW107XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaChjYkxpc3RlbmVyKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY2JMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgIGxpc3RlbmVyKHNlbGYuZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlbmRHbyhzZWxmLCBmbikge1xuICBmbihwZW5kSG9sZChzZWxmKSk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL25vZGUtcHJvZ3Jlc3MnKTtcbiIsIi8qIVxuICogbm9kZS1wcm9ncmVzc1xuICogQ29weXJpZ2h0KGMpIDIwMTEgVEogSG9sb3dheWNodWsgPHRqQHZpc2lvbi1tZWRpYS5jYT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogRXhwb3NlIGBQcm9ncmVzc0JhcmAuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gUHJvZ3Jlc3NCYXI7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIGBQcm9ncmVzc0JhcmAgd2l0aCB0aGUgZ2l2ZW4gYGZtdGAgc3RyaW5nIGFuZCBgb3B0aW9uc2Agb3JcbiAqIGB0b3RhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgIC0gYGN1cnJgIGN1cnJlbnQgY29tcGxldGVkIGluZGV4XG4gKiAgIC0gYHRvdGFsYCB0b3RhbCBudW1iZXIgb2YgdGlja3MgdG8gY29tcGxldGVcbiAqICAgLSBgd2lkdGhgIHRoZSBkaXNwbGF5ZWQgd2lkdGggb2YgdGhlIHByb2dyZXNzIGJhciBkZWZhdWx0aW5nIHRvIHRvdGFsXG4gKiAgIC0gYHN0cmVhbWAgdGhlIG91dHB1dCBzdHJlYW0gZGVmYXVsdGluZyB0byBzdGRlcnJcbiAqICAgLSBgaGVhZGAgaGVhZCBjaGFyYWN0ZXIgZGVmYXVsdGluZyB0byBjb21wbGV0ZSBjaGFyYWN0ZXJcbiAqICAgLSBgY29tcGxldGVgIGNvbXBsZXRpb24gY2hhcmFjdGVyIGRlZmF1bHRpbmcgdG8gXCI9XCJcbiAqICAgLSBgaW5jb21wbGV0ZWAgaW5jb21wbGV0ZSBjaGFyYWN0ZXIgZGVmYXVsdGluZyB0byBcIi1cIlxuICogICAtIGByZW5kZXJUaHJvdHRsZWAgbWluaW11bSB0aW1lIGJldHdlZW4gdXBkYXRlcyBpbiBtaWxsaXNlY29uZHMgZGVmYXVsdGluZyB0byAxNlxuICogICAtIGBjYWxsYmFja2Agb3B0aW9uYWwgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBwcm9ncmVzcyBiYXIgY29tcGxldGVzXG4gKiAgIC0gYGNsZWFyYCB3aWxsIGNsZWFyIHRoZSBwcm9ncmVzcyBiYXIgdXBvbiB0ZXJtaW5hdGlvblxuICpcbiAqIFRva2VuczpcbiAqXG4gKiAgIC0gYDpiYXJgIHRoZSBwcm9ncmVzcyBiYXIgaXRzZWxmXG4gKiAgIC0gYDpjdXJyZW50YCBjdXJyZW50IHRpY2sgbnVtYmVyXG4gKiAgIC0gYDp0b3RhbGAgdG90YWwgdGlja3NcbiAqICAgLSBgOmVsYXBzZWRgIHRpbWUgZWxhcHNlZCBpbiBzZWNvbmRzXG4gKiAgIC0gYDpwZXJjZW50YCBjb21wbGV0aW9uIHBlcmNlbnRhZ2VcbiAqICAgLSBgOmV0YWAgZXRhIGluIHNlY29uZHNcbiAqICAgLSBgOnJhdGVgIHJhdGUgb2YgdGlja3MgcGVyIHNlY29uZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbXRcbiAqIEBwYXJhbSB7b2JqZWN0fG51bWJlcn0gb3B0aW9ucyBvciB0b3RhbFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBQcm9ncmVzc0JhcihmbXQsIG9wdGlvbnMpIHtcbiAgdGhpcy5zdHJlYW0gPSBvcHRpb25zLnN0cmVhbSB8fCBwcm9jZXNzLnN0ZGVycjtcblxuICBpZiAodHlwZW9mKG9wdGlvbnMpID09ICdudW1iZXInKSB7XG4gICAgdmFyIHRvdGFsID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gICAgb3B0aW9ucy50b3RhbCA9IHRvdGFsO1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgZm10KSB0aHJvdyBuZXcgRXJyb3IoJ2Zvcm1hdCByZXF1aXJlZCcpO1xuICAgIGlmICgnbnVtYmVyJyAhPSB0eXBlb2Ygb3B0aW9ucy50b3RhbCkgdGhyb3cgbmV3IEVycm9yKCd0b3RhbCByZXF1aXJlZCcpO1xuICB9XG5cbiAgdGhpcy5mbXQgPSBmbXQ7XG4gIHRoaXMuY3VyciA9IG9wdGlvbnMuY3VyciB8fCAwO1xuICB0aGlzLnRvdGFsID0gb3B0aW9ucy50b3RhbDtcbiAgdGhpcy53aWR0aCA9IG9wdGlvbnMud2lkdGggfHwgdGhpcy50b3RhbDtcbiAgdGhpcy5jbGVhciA9IG9wdGlvbnMuY2xlYXJcbiAgdGhpcy5jaGFycyA9IHtcbiAgICBjb21wbGV0ZSAgIDogb3B0aW9ucy5jb21wbGV0ZSB8fCAnPScsXG4gICAgaW5jb21wbGV0ZSA6IG9wdGlvbnMuaW5jb21wbGV0ZSB8fCAnLScsXG4gICAgaGVhZCAgICAgICA6IG9wdGlvbnMuaGVhZCB8fCAob3B0aW9ucy5jb21wbGV0ZSB8fCAnPScpXG4gIH07XG4gIHRoaXMucmVuZGVyVGhyb3R0bGUgPSBvcHRpb25zLnJlbmRlclRocm90dGxlICE9PSAwID8gKG9wdGlvbnMucmVuZGVyVGhyb3R0bGUgfHwgMTYpIDogMDtcbiAgdGhpcy5sYXN0UmVuZGVyID0gLUluZmluaXR5O1xuICB0aGlzLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgdGhpcy50b2tlbnMgPSB7fTtcbiAgdGhpcy5sYXN0RHJhdyA9ICcnO1xufVxuXG4vKipcbiAqIFwidGlja1wiIHRoZSBwcm9ncmVzcyBiYXIgd2l0aCBvcHRpb25hbCBgbGVuYCBhbmQgb3B0aW9uYWwgYHRva2Vuc2AuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8b2JqZWN0fSBsZW4gb3IgdG9rZW5zXG4gKiBAcGFyYW0ge29iamVjdH0gdG9rZW5zXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblByb2dyZXNzQmFyLnByb3RvdHlwZS50aWNrID0gZnVuY3Rpb24obGVuLCB0b2tlbnMpe1xuICBpZiAobGVuICE9PSAwKVxuICAgIGxlbiA9IGxlbiB8fCAxO1xuXG4gIC8vIHN3YXAgdG9rZW5zXG4gIGlmICgnb2JqZWN0JyA9PSB0eXBlb2YgbGVuKSB0b2tlbnMgPSBsZW4sIGxlbiA9IDE7XG4gIGlmICh0b2tlbnMpIHRoaXMudG9rZW5zID0gdG9rZW5zO1xuXG4gIC8vIHN0YXJ0IHRpbWUgZm9yIGV0YVxuICBpZiAoMCA9PSB0aGlzLmN1cnIpIHRoaXMuc3RhcnQgPSBuZXcgRGF0ZTtcblxuICB0aGlzLmN1cnIgKz0gbGVuXG5cbiAgLy8gdHJ5IHRvIHJlbmRlclxuICB0aGlzLnJlbmRlcigpO1xuXG4gIC8vIHByb2dyZXNzIGNvbXBsZXRlXG4gIGlmICh0aGlzLmN1cnIgPj0gdGhpcy50b3RhbCkge1xuICAgIHRoaXMucmVuZGVyKHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgdGhpcy5jb21wbGV0ZSA9IHRydWU7XG4gICAgdGhpcy50ZXJtaW5hdGUoKTtcbiAgICB0aGlzLmNhbGxiYWNrKHRoaXMpO1xuICAgIHJldHVybjtcbiAgfVxufTtcblxuLyoqXG4gKiBNZXRob2QgdG8gcmVuZGVyIHRoZSBwcm9ncmVzcyBiYXIgd2l0aCBvcHRpb25hbCBgdG9rZW5zYCB0byBwbGFjZSBpbiB0aGVcbiAqIHByb2dyZXNzIGJhcidzIGBmbXRgIGZpZWxkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0b2tlbnNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUHJvZ3Jlc3NCYXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICh0b2tlbnMsIGZvcmNlKSB7XG4gIGZvcmNlID0gZm9yY2UgIT09IHVuZGVmaW5lZCA/IGZvcmNlIDogZmFsc2U7XG4gIGlmICh0b2tlbnMpIHRoaXMudG9rZW5zID0gdG9rZW5zO1xuXG4gIGlmICghdGhpcy5zdHJlYW0uaXNUVFkpIHJldHVybjtcblxuICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgdmFyIGRlbHRhID0gbm93IC0gdGhpcy5sYXN0UmVuZGVyO1xuICBpZiAoIWZvcmNlICYmIChkZWx0YSA8IHRoaXMucmVuZGVyVGhyb3R0bGUpKSB7XG4gICAgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubGFzdFJlbmRlciA9IG5vdztcbiAgfVxuXG4gIHZhciByYXRpbyA9IHRoaXMuY3VyciAvIHRoaXMudG90YWw7XG4gIHJhdGlvID0gTWF0aC5taW4oTWF0aC5tYXgocmF0aW8sIDApLCAxKTtcblxuICB2YXIgcGVyY2VudCA9IE1hdGguZmxvb3IocmF0aW8gKiAxMDApO1xuICB2YXIgaW5jb21wbGV0ZSwgY29tcGxldGUsIGNvbXBsZXRlTGVuZ3RoO1xuICB2YXIgZWxhcHNlZCA9IG5ldyBEYXRlIC0gdGhpcy5zdGFydDtcbiAgdmFyIGV0YSA9IChwZXJjZW50ID09IDEwMCkgPyAwIDogZWxhcHNlZCAqICh0aGlzLnRvdGFsIC8gdGhpcy5jdXJyIC0gMSk7XG4gIHZhciByYXRlID0gdGhpcy5jdXJyIC8gKGVsYXBzZWQgLyAxMDAwKTtcblxuICAvKiBwb3B1bGF0ZSB0aGUgYmFyIHRlbXBsYXRlIHdpdGggcGVyY2VudGFnZXMgYW5kIHRpbWVzdGFtcHMgKi9cbiAgdmFyIHN0ciA9IHRoaXMuZm10XG4gICAgLnJlcGxhY2UoJzpjdXJyZW50JywgdGhpcy5jdXJyKVxuICAgIC5yZXBsYWNlKCc6dG90YWwnLCB0aGlzLnRvdGFsKVxuICAgIC5yZXBsYWNlKCc6ZWxhcHNlZCcsIGlzTmFOKGVsYXBzZWQpID8gJzAuMCcgOiAoZWxhcHNlZCAvIDEwMDApLnRvRml4ZWQoMSkpXG4gICAgLnJlcGxhY2UoJzpldGEnLCAoaXNOYU4oZXRhKSB8fCAhaXNGaW5pdGUoZXRhKSkgPyAnMC4wJyA6IChldGEgLyAxMDAwKVxuICAgICAgLnRvRml4ZWQoMSkpXG4gICAgLnJlcGxhY2UoJzpwZXJjZW50JywgcGVyY2VudC50b0ZpeGVkKDApICsgJyUnKVxuICAgIC5yZXBsYWNlKCc6cmF0ZScsIE1hdGgucm91bmQocmF0ZSkpO1xuXG4gIC8qIGNvbXB1dGUgdGhlIGF2YWlsYWJsZSBzcGFjZSAobm9uLXplcm8pIGZvciB0aGUgYmFyICovXG4gIHZhciBhdmFpbGFibGVTcGFjZSA9IE1hdGgubWF4KDAsIHRoaXMuc3RyZWFtLmNvbHVtbnMgLSBzdHIucmVwbGFjZSgnOmJhcicsICcnKS5sZW5ndGgpO1xuICBpZihhdmFpbGFibGVTcGFjZSAmJiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKXtcbiAgICBhdmFpbGFibGVTcGFjZSA9IGF2YWlsYWJsZVNwYWNlIC0gMTtcbiAgfVxuXG4gIHZhciB3aWR0aCA9IE1hdGgubWluKHRoaXMud2lkdGgsIGF2YWlsYWJsZVNwYWNlKTtcblxuICAvKiBUT0RPOiB0aGUgZm9sbG93aW5nIGFzc3VtZXMgdGhlIHVzZXIgaGFzIG9uZSAnOmJhcicgdG9rZW4gKi9cbiAgY29tcGxldGVMZW5ndGggPSBNYXRoLnJvdW5kKHdpZHRoICogcmF0aW8pO1xuICBjb21wbGV0ZSA9IEFycmF5KE1hdGgubWF4KDAsIGNvbXBsZXRlTGVuZ3RoICsgMSkpLmpvaW4odGhpcy5jaGFycy5jb21wbGV0ZSk7XG4gIGluY29tcGxldGUgPSBBcnJheShNYXRoLm1heCgwLCB3aWR0aCAtIGNvbXBsZXRlTGVuZ3RoICsgMSkpLmpvaW4odGhpcy5jaGFycy5pbmNvbXBsZXRlKTtcblxuICAvKiBhZGQgaGVhZCB0byB0aGUgY29tcGxldGUgc3RyaW5nICovXG4gIGlmKGNvbXBsZXRlTGVuZ3RoID4gMClcbiAgICBjb21wbGV0ZSA9IGNvbXBsZXRlLnNsaWNlKDAsIC0xKSArIHRoaXMuY2hhcnMuaGVhZDtcblxuICAvKiBmaWxsIGluIHRoZSBhY3R1YWwgcHJvZ3Jlc3MgYmFyICovXG4gIHN0ciA9IHN0ci5yZXBsYWNlKCc6YmFyJywgY29tcGxldGUgKyBpbmNvbXBsZXRlKTtcblxuICAvKiByZXBsYWNlIHRoZSBleHRyYSB0b2tlbnMgKi9cbiAgaWYgKHRoaXMudG9rZW5zKSBmb3IgKHZhciBrZXkgaW4gdGhpcy50b2tlbnMpIHN0ciA9IHN0ci5yZXBsYWNlKCc6JyArIGtleSwgdGhpcy50b2tlbnNba2V5XSk7XG5cbiAgaWYgKHRoaXMubGFzdERyYXcgIT09IHN0cikge1xuICAgIHRoaXMuc3RyZWFtLmN1cnNvclRvKDApO1xuICAgIHRoaXMuc3RyZWFtLndyaXRlKHN0cik7XG4gICAgdGhpcy5zdHJlYW0uY2xlYXJMaW5lKDEpO1xuICAgIHRoaXMubGFzdERyYXcgPSBzdHI7XG4gIH1cbn07XG5cbi8qKlxuICogXCJ1cGRhdGVcIiB0aGUgcHJvZ3Jlc3MgYmFyIHRvIHJlcHJlc2VudCBhbiBleGFjdCBwZXJjZW50YWdlLlxuICogVGhlIHJhdGlvIChiZXR3ZWVuIDAgYW5kIDEpIHNwZWNpZmllZCB3aWxsIGJlIG11bHRpcGxpZWQgYnkgYHRvdGFsYCBhbmRcbiAqIGZsb29yZWQsIHJlcHJlc2VudGluZyB0aGUgY2xvc2VzdCBhdmFpbGFibGUgXCJ0aWNrLlwiIEZvciBleGFtcGxlLCBpZiBhXG4gKiBwcm9ncmVzcyBiYXIgaGFzIGEgbGVuZ3RoIG9mIDMgYW5kIGB1cGRhdGUoMC41KWAgaXMgY2FsbGVkLCB0aGUgcHJvZ3Jlc3NcbiAqIHdpbGwgYmUgc2V0IHRvIDEuXG4gKlxuICogQSByYXRpbyBvZiAwLjUgd2lsbCBhdHRlbXB0IHRvIHNldCB0aGUgcHJvZ3Jlc3MgdG8gaGFsZndheS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gcmF0aW8gVGhlIHJhdGlvIChiZXR3ZWVuIDAgYW5kIDEgaW5jbHVzaXZlKSB0byBzZXQgdGhlXG4gKiAgIG92ZXJhbGwgY29tcGxldGlvbiB0by5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUHJvZ3Jlc3NCYXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChyYXRpbywgdG9rZW5zKSB7XG4gIHZhciBnb2FsID0gTWF0aC5mbG9vcihyYXRpbyAqIHRoaXMudG90YWwpO1xuICB2YXIgZGVsdGEgPSBnb2FsIC0gdGhpcy5jdXJyO1xuXG4gIHRoaXMudGljayhkZWx0YSwgdG9rZW5zKTtcbn07XG5cbi8qKlxuICogXCJpbnRlcnJ1cHRcIiB0aGUgcHJvZ3Jlc3MgYmFyIGFuZCB3cml0ZSBhIG1lc3NhZ2UgYWJvdmUgaXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byB3cml0ZS5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUHJvZ3Jlc3NCYXIucHJvdG90eXBlLmludGVycnVwdCA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gIC8vIGNsZWFyIHRoZSBjdXJyZW50IGxpbmVcbiAgdGhpcy5zdHJlYW0uY2xlYXJMaW5lKCk7XG4gIC8vIG1vdmUgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVcbiAgdGhpcy5zdHJlYW0uY3Vyc29yVG8oMCk7XG4gIC8vIHdyaXRlIHRoZSBtZXNzYWdlIHRleHRcbiAgdGhpcy5zdHJlYW0ud3JpdGUobWVzc2FnZSk7XG4gIC8vIHRlcm1pbmF0ZSB0aGUgbGluZSBhZnRlciB3cml0aW5nIHRoZSBtZXNzYWdlXG4gIHRoaXMuc3RyZWFtLndyaXRlKCdcXG4nKTtcbiAgLy8gcmUtZGlzcGxheSB0aGUgcHJvZ3Jlc3MgYmFyIHdpdGggaXRzIGxhc3REcmF3XG4gIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMubGFzdERyYXcpO1xufTtcblxuLyoqXG4gKiBUZXJtaW5hdGVzIGEgcHJvZ3Jlc3MgYmFyLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUHJvZ3Jlc3NCYXIucHJvdG90eXBlLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2xlYXIpIHtcbiAgICBpZiAodGhpcy5zdHJlYW0uY2xlYXJMaW5lKSB7XG4gICAgICB0aGlzLnN0cmVhbS5jbGVhckxpbmUoKTtcbiAgICAgIHRoaXMuc3RyZWFtLmN1cnNvclRvKDApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLnN0cmVhbS53cml0ZSgnXFxuJyk7XG4gIH1cbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Qcm94eUFnZW50ID0gZXhwb3J0cy5wcm94aWVzID0gdm9pZCAwO1xuY29uc3QgaHR0cCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiaHR0cFwiKSk7XG5jb25zdCBodHRwcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiaHR0cHNcIikpO1xuY29uc3QgdXJsXzEgPSByZXF1aXJlKFwidXJsXCIpO1xuY29uc3QgbHJ1X2NhY2hlXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImxydS1jYWNoZVwiKSk7XG5jb25zdCBhZ2VudF9iYXNlXzEgPSByZXF1aXJlKFwiYWdlbnQtYmFzZVwiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IHByb3h5X2Zyb21fZW52XzEgPSByZXF1aXJlKFwicHJveHktZnJvbS1lbnZcIik7XG5jb25zdCBwYWNfcHJveHlfYWdlbnRfMSA9IHJlcXVpcmUoXCJwYWMtcHJveHktYWdlbnRcIik7XG5jb25zdCBodHRwX3Byb3h5X2FnZW50XzEgPSByZXF1aXJlKFwiaHR0cC1wcm94eS1hZ2VudFwiKTtcbmNvbnN0IGh0dHBzX3Byb3h5X2FnZW50XzEgPSByZXF1aXJlKFwiaHR0cHMtcHJveHktYWdlbnRcIik7XG5jb25zdCBzb2Nrc19wcm94eV9hZ2VudF8xID0gcmVxdWlyZShcInNvY2tzLXByb3h5LWFnZW50XCIpO1xuY29uc3QgZGVidWcgPSAoMCwgZGVidWdfMS5kZWZhdWx0KSgncHJveHktYWdlbnQnKTtcbmNvbnN0IFBST1RPQ09MUyA9IFtcbiAgICAuLi5odHRwX3Byb3h5X2FnZW50XzEuSHR0cFByb3h5QWdlbnQucHJvdG9jb2xzLFxuICAgIC4uLnNvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50LnByb3RvY29scyxcbiAgICAuLi5wYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50LnByb3RvY29scyxcbl07XG4vKipcbiAqIFN1cHBvcnRlZCBwcm94eSB0eXBlcy5cbiAqL1xuZXhwb3J0cy5wcm94aWVzID0ge1xuICAgIGh0dHA6IFtodHRwX3Byb3h5X2FnZW50XzEuSHR0cFByb3h5QWdlbnQsIGh0dHBzX3Byb3h5X2FnZW50XzEuSHR0cHNQcm94eUFnZW50XSxcbiAgICBodHRwczogW2h0dHBfcHJveHlfYWdlbnRfMS5IdHRwUHJveHlBZ2VudCwgaHR0cHNfcHJveHlfYWdlbnRfMS5IdHRwc1Byb3h5QWdlbnRdLFxuICAgIHNvY2tzOiBbc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnQsIHNvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50XSxcbiAgICBzb2NrczQ6IFtzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudCwgc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnRdLFxuICAgIHNvY2tzNGE6IFtzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudCwgc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnRdLFxuICAgIHNvY2tzNTogW3NvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50LCBzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudF0sXG4gICAgc29ja3M1aDogW3NvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50LCBzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudF0sXG4gICAgJ3BhYytkYXRhJzogW3BhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnQsIHBhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnRdLFxuICAgICdwYWMrZmlsZSc6IFtwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50LCBwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50XSxcbiAgICAncGFjK2Z0cCc6IFtwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50LCBwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50XSxcbiAgICAncGFjK2h0dHAnOiBbcGFjX3Byb3h5X2FnZW50XzEuUGFjUHJveHlBZ2VudCwgcGFjX3Byb3h5X2FnZW50XzEuUGFjUHJveHlBZ2VudF0sXG4gICAgJ3BhYytodHRwcyc6IFtwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50LCBwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50XSxcbn07XG5mdW5jdGlvbiBpc1ZhbGlkUHJvdG9jb2wodikge1xuICAgIHJldHVybiBQUk9UT0NPTFMuaW5jbHVkZXModik7XG59XG4vKipcbiAqIFVzZXMgdGhlIGFwcHJvcHJpYXRlIGBBZ2VudGAgc3ViY2xhc3MgYmFzZWQgb2ZmIG9mIHRoZSBcInByb3h5XCJcbiAqIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IGFyZSBjdXJyZW50bHkgc2V0LlxuICpcbiAqIEFuIExSVSBjYWNoZSBpcyB1c2VkLCB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IGNyZWF0aW9uIG9mIHByb3h5XG4gKiBgaHR0cC5BZ2VudGAgaW5zdGFuY2VzLlxuICovXG5jbGFzcyBQcm94eUFnZW50IGV4dGVuZHMgYWdlbnRfYmFzZV8xLkFnZW50IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2FjaGUgZm9yIGBBZ2VudGAgaW5zdGFuY2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBscnVfY2FjaGVfMS5kZWZhdWx0KHsgbWF4OiAyMCB9KTtcbiAgICAgICAgZGVidWcoJ0NyZWF0aW5nIG5ldyBQcm94eUFnZW50IGluc3RhbmNlOiAlbycsIG9wdHMpO1xuICAgICAgICB0aGlzLmNvbm5lY3RPcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5odHRwQWdlbnQgPSBvcHRzPy5odHRwQWdlbnQgfHwgbmV3IGh0dHAuQWdlbnQob3B0cyk7XG4gICAgICAgIHRoaXMuaHR0cHNBZ2VudCA9XG4gICAgICAgICAgICBvcHRzPy5odHRwc0FnZW50IHx8IG5ldyBodHRwcy5BZ2VudChvcHRzKTtcbiAgICAgICAgdGhpcy5nZXRQcm94eUZvclVybCA9IG9wdHM/LmdldFByb3h5Rm9yVXJsIHx8IHByb3h5X2Zyb21fZW52XzEuZ2V0UHJveHlGb3JVcmw7XG4gICAgfVxuICAgIGFzeW5jIGNvbm5lY3QocmVxLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IHsgc2VjdXJlRW5kcG9pbnQgfSA9IG9wdHM7XG4gICAgICAgIGNvbnN0IGlzV2ViU29ja2V0ID0gcmVxLmdldEhlYWRlcigndXBncmFkZScpID09PSAnd2Vic29ja2V0JztcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBzZWN1cmVFbmRwb2ludFxuICAgICAgICAgICAgPyBpc1dlYlNvY2tldFxuICAgICAgICAgICAgICAgID8gJ3dzczonXG4gICAgICAgICAgICAgICAgOiAnaHR0cHM6J1xuICAgICAgICAgICAgOiBpc1dlYlNvY2tldFxuICAgICAgICAgICAgICAgID8gJ3dzOidcbiAgICAgICAgICAgICAgICA6ICdodHRwOic7XG4gICAgICAgIGNvbnN0IGhvc3QgPSByZXEuZ2V0SGVhZGVyKCdob3N0Jyk7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyB1cmxfMS5VUkwocmVxLnBhdGgsIGAke3Byb3RvY29sfS8vJHtob3N0fWApLmhyZWY7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gYXdhaXQgdGhpcy5nZXRQcm94eUZvclVybCh1cmwpO1xuICAgICAgICBpZiAoIXByb3h5KSB7XG4gICAgICAgICAgICBkZWJ1ZygnUHJveHkgbm90IGVuYWJsZWQgZm9yIFVSTDogJW8nLCB1cmwpO1xuICAgICAgICAgICAgcmV0dXJuIHNlY3VyZUVuZHBvaW50ID8gdGhpcy5odHRwc0FnZW50IDogdGhpcy5odHRwQWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWcoJ1JlcXVlc3QgVVJMOiAlbycsIHVybCk7XG4gICAgICAgIGRlYnVnKCdQcm94eSBVUkw6ICVvJywgcHJveHkpO1xuICAgICAgICAvLyBhdHRlbXB0IHRvIGdldCBhIGNhY2hlZCBgaHR0cC5BZ2VudGAgaW5zdGFuY2UgZmlyc3RcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtwcm90b2NvbH0rJHtwcm94eX1gO1xuICAgICAgICBsZXQgYWdlbnQgPSB0aGlzLmNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3h5VXJsID0gbmV3IHVybF8xLlVSTChwcm94eSk7XG4gICAgICAgICAgICBjb25zdCBwcm94eVByb3RvID0gcHJveHlVcmwucHJvdG9jb2wucmVwbGFjZSgnOicsICcnKTtcbiAgICAgICAgICAgIGlmICghaXNWYWxpZFByb3RvY29sKHByb3h5UHJvdG8pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBwcm90b2NvbCBmb3IgcHJveHkgVVJMOiAke3Byb3h5fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY3RvciA9IGV4cG9ydHMucHJveGllc1twcm94eVByb3RvXVtzZWN1cmVFbmRwb2ludCB8fCBpc1dlYlNvY2tldCA/IDEgOiAwXTtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbWVo4oCmXG4gICAgICAgICAgICBhZ2VudCA9IG5ldyBjdG9yKHByb3h5LCB0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KGNhY2hlS2V5LCBhZ2VudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWJ1ZygnQ2FjaGUgaGl0IGZvciBwcm94eSBVUkw6ICVvJywgcHJveHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBhZ2VudCBvZiB0aGlzLmNhY2hlLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBhZ2VudC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cbn1cbmV4cG9ydHMuUHJveHlBZ2VudCA9IFByb3h5QWdlbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXJzZVVybCA9IHJlcXVpcmUoJ3VybCcpLnBhcnNlO1xuXG52YXIgREVGQVVMVF9QT1JUUyA9IHtcbiAgZnRwOiAyMSxcbiAgZ29waGVyOiA3MCxcbiAgaHR0cDogODAsXG4gIGh0dHBzOiA0NDMsXG4gIHdzOiA4MCxcbiAgd3NzOiA0NDMsXG59O1xuXG52YXIgc3RyaW5nRW5kc1dpdGggPSBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoIHx8IGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHMubGVuZ3RoIDw9IHRoaXMubGVuZ3RoICYmXG4gICAgdGhpcy5pbmRleE9mKHMsIHRoaXMubGVuZ3RoIC0gcy5sZW5ndGgpICE9PSAtMTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSB1cmwgLSBUaGUgVVJMLCBvciB0aGUgcmVzdWx0IGZyb20gdXJsLnBhcnNlLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVJMIG9mIHRoZSBwcm94eSB0aGF0IHNob3VsZCBoYW5kbGUgdGhlIHJlcXVlc3QgdG8gdGhlXG4gKiAgZ2l2ZW4gVVJMLiBJZiBubyBwcm94eSBpcyBzZXQsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldFByb3h5Rm9yVXJsKHVybCkge1xuICB2YXIgcGFyc2VkVXJsID0gdHlwZW9mIHVybCA9PT0gJ3N0cmluZycgPyBwYXJzZVVybCh1cmwpIDogdXJsIHx8IHt9O1xuICB2YXIgcHJvdG8gPSBwYXJzZWRVcmwucHJvdG9jb2w7XG4gIHZhciBob3N0bmFtZSA9IHBhcnNlZFVybC5ob3N0O1xuICB2YXIgcG9ydCA9IHBhcnNlZFVybC5wb3J0O1xuICBpZiAodHlwZW9mIGhvc3RuYW1lICE9PSAnc3RyaW5nJyB8fCAhaG9zdG5hbWUgfHwgdHlwZW9mIHByb3RvICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAnJzsgIC8vIERvbid0IHByb3h5IFVSTHMgd2l0aG91dCBhIHZhbGlkIHNjaGVtZSBvciBob3N0LlxuICB9XG5cbiAgcHJvdG8gPSBwcm90by5zcGxpdCgnOicsIDEpWzBdO1xuICAvLyBTdHJpcHBpbmcgcG9ydHMgaW4gdGhpcyB3YXkgaW5zdGVhZCBvZiB1c2luZyBwYXJzZWRVcmwuaG9zdG5hbWUgdG8gbWFrZVxuICAvLyBzdXJlIHRoYXQgdGhlIGJyYWNrZXRzIGFyb3VuZCBJUHY2IGFkZHJlc3NlcyBhcmUga2VwdC5cbiAgaG9zdG5hbWUgPSBob3N0bmFtZS5yZXBsYWNlKC86XFxkKiQvLCAnJyk7XG4gIHBvcnQgPSBwYXJzZUludChwb3J0KSB8fCBERUZBVUxUX1BPUlRTW3Byb3RvXSB8fCAwO1xuICBpZiAoIXNob3VsZFByb3h5KGhvc3RuYW1lLCBwb3J0KSkge1xuICAgIHJldHVybiAnJzsgIC8vIERvbid0IHByb3h5IFVSTHMgdGhhdCBtYXRjaCBOT19QUk9YWS5cbiAgfVxuXG4gIHZhciBwcm94eSA9XG4gICAgZ2V0RW52KCducG1fY29uZmlnXycgKyBwcm90byArICdfcHJveHknKSB8fFxuICAgIGdldEVudihwcm90byArICdfcHJveHknKSB8fFxuICAgIGdldEVudignbnBtX2NvbmZpZ19wcm94eScpIHx8XG4gICAgZ2V0RW52KCdhbGxfcHJveHknKTtcbiAgaWYgKHByb3h5ICYmIHByb3h5LmluZGV4T2YoJzovLycpID09PSAtMSkge1xuICAgIC8vIE1pc3Npbmcgc2NoZW1lIGluIHByb3h5LCBkZWZhdWx0IHRvIHRoZSByZXF1ZXN0ZWQgVVJMJ3Mgc2NoZW1lLlxuICAgIHByb3h5ID0gcHJvdG8gKyAnOi8vJyArIHByb3h5O1xuICB9XG4gIHJldHVybiBwcm94eTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBVUkwgc2hvdWxkIGJlIHByb3hpZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGhvc3RuYW1lIC0gVGhlIGhvc3QgbmFtZSBvZiB0aGUgVVJMLlxuICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgZWZmZWN0aXZlIHBvcnQgb2YgdGhlIFVSTC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBVUkwgc2hvdWxkIGJlIHByb3hpZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzaG91bGRQcm94eShob3N0bmFtZSwgcG9ydCkge1xuICB2YXIgTk9fUFJPWFkgPVxuICAgIChnZXRFbnYoJ25wbV9jb25maWdfbm9fcHJveHknKSB8fCBnZXRFbnYoJ25vX3Byb3h5JykpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghTk9fUFJPWFkpIHtcbiAgICByZXR1cm4gdHJ1ZTsgIC8vIEFsd2F5cyBwcm94eSBpZiBOT19QUk9YWSBpcyBub3Qgc2V0LlxuICB9XG4gIGlmIChOT19QUk9YWSA9PT0gJyonKSB7XG4gICAgcmV0dXJuIGZhbHNlOyAgLy8gTmV2ZXIgcHJveHkgaWYgd2lsZGNhcmQgaXMgc2V0LlxuICB9XG5cbiAgcmV0dXJuIE5PX1BST1hZLnNwbGl0KC9bLFxcc10vKS5ldmVyeShmdW5jdGlvbihwcm94eSkge1xuICAgIGlmICghcHJveHkpIHtcbiAgICAgIHJldHVybiB0cnVlOyAgLy8gU2tpcCB6ZXJvLWxlbmd0aCBob3N0cy5cbiAgICB9XG4gICAgdmFyIHBhcnNlZFByb3h5ID0gcHJveHkubWF0Y2goL14oLispOihcXGQrKSQvKTtcbiAgICB2YXIgcGFyc2VkUHJveHlIb3N0bmFtZSA9IHBhcnNlZFByb3h5ID8gcGFyc2VkUHJveHlbMV0gOiBwcm94eTtcbiAgICB2YXIgcGFyc2VkUHJveHlQb3J0ID0gcGFyc2VkUHJveHkgPyBwYXJzZUludChwYXJzZWRQcm94eVsyXSkgOiAwO1xuICAgIGlmIChwYXJzZWRQcm94eVBvcnQgJiYgcGFyc2VkUHJveHlQb3J0ICE9PSBwb3J0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTsgIC8vIFNraXAgaWYgcG9ydHMgZG9uJ3QgbWF0Y2guXG4gICAgfVxuXG4gICAgaWYgKCEvXlsuKl0vLnRlc3QocGFyc2VkUHJveHlIb3N0bmFtZSkpIHtcbiAgICAgIC8vIE5vIHdpbGRjYXJkcywgc28gc3RvcCBwcm94eWluZyBpZiB0aGVyZSBpcyBhbiBleGFjdCBtYXRjaC5cbiAgICAgIHJldHVybiBob3N0bmFtZSAhPT0gcGFyc2VkUHJveHlIb3N0bmFtZTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkUHJveHlIb3N0bmFtZS5jaGFyQXQoMCkgPT09ICcqJykge1xuICAgICAgLy8gUmVtb3ZlIGxlYWRpbmcgd2lsZGNhcmQuXG4gICAgICBwYXJzZWRQcm94eUhvc3RuYW1lID0gcGFyc2VkUHJveHlIb3N0bmFtZS5zbGljZSgxKTtcbiAgICB9XG4gICAgLy8gU3RvcCBwcm94eWluZyBpZiB0aGUgaG9zdG5hbWUgZW5kcyB3aXRoIHRoZSBub19wcm94eSBob3N0LlxuICAgIHJldHVybiAhc3RyaW5nRW5kc1dpdGguY2FsbChob3N0bmFtZSwgcGFyc2VkUHJveHlIb3N0bmFtZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRFbnYoa2V5KSB7XG4gIHJldHVybiBwcm9jZXNzLmVudltrZXkudG9Mb3dlckNhc2UoKV0gfHwgcHJvY2Vzcy5lbnZba2V5LnRvVXBwZXJDYXNlKCldIHx8ICcnO1xufVxuXG5leHBvcnRzLmdldFByb3h5Rm9yVXJsID0gZ2V0UHJveHlGb3JVcmw7XG4iLCJ2YXIgb25jZSA9IHJlcXVpcmUoJ29uY2UnKVxudmFyIGVvcyA9IHJlcXVpcmUoJ2VuZC1vZi1zdHJlYW0nKVxudmFyIGZzID0gcmVxdWlyZSgnZnMnKSAvLyB3ZSBvbmx5IG5lZWQgZnMgdG8gZ2V0IHRoZSBSZWFkU3RyZWFtIGFuZCBXcml0ZVN0cmVhbSBwcm90b3R5cGVzXG5cbnZhciBub29wID0gZnVuY3Rpb24gKCkge31cbnZhciBhbmNpZW50ID0gL152P1xcLjAvLnRlc3QocHJvY2Vzcy52ZXJzaW9uKVxuXG52YXIgaXNGbiA9IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nXG59XG5cbnZhciBpc0ZTID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICBpZiAoIWFuY2llbnQpIHJldHVybiBmYWxzZSAvLyBuZXdlciBub2RlIHZlcnNpb24gZG8gbm90IG5lZWQgdG8gY2FyZSBhYm91dCBmcyBpcyBhIHNwZWNpYWwgd2F5XG4gIGlmICghZnMpIHJldHVybiBmYWxzZSAvLyBicm93c2VyXG4gIHJldHVybiAoc3RyZWFtIGluc3RhbmNlb2YgKGZzLlJlYWRTdHJlYW0gfHwgbm9vcCkgfHwgc3RyZWFtIGluc3RhbmNlb2YgKGZzLldyaXRlU3RyZWFtIHx8IG5vb3ApKSAmJiBpc0ZuKHN0cmVhbS5jbG9zZSlcbn1cblxudmFyIGlzUmVxdWVzdCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgcmV0dXJuIHN0cmVhbS5zZXRIZWFkZXIgJiYgaXNGbihzdHJlYW0uYWJvcnQpXG59XG5cbnZhciBkZXN0cm95ZXIgPSBmdW5jdGlvbiAoc3RyZWFtLCByZWFkaW5nLCB3cml0aW5nLCBjYWxsYmFjaykge1xuICBjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2spXG5cbiAgdmFyIGNsb3NlZCA9IGZhbHNlXG4gIHN0cmVhbS5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY2xvc2VkID0gdHJ1ZVxuICB9KVxuXG4gIGVvcyhzdHJlYW0sIHtyZWFkYWJsZTogcmVhZGluZywgd3JpdGFibGU6IHdyaXRpbmd9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgICBjbG9zZWQgPSB0cnVlXG4gICAgY2FsbGJhY2soKVxuICB9KVxuXG4gIHZhciBkZXN0cm95ZWQgPSBmYWxzZVxuICByZXR1cm4gZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChjbG9zZWQpIHJldHVyblxuICAgIGlmIChkZXN0cm95ZWQpIHJldHVyblxuICAgIGRlc3Ryb3llZCA9IHRydWVcblxuICAgIGlmIChpc0ZTKHN0cmVhbSkpIHJldHVybiBzdHJlYW0uY2xvc2Uobm9vcCkgLy8gdXNlIGNsb3NlIGZvciBmcyBzdHJlYW1zIHRvIGF2b2lkIGZkIGxlYWtzXG4gICAgaWYgKGlzUmVxdWVzdChzdHJlYW0pKSByZXR1cm4gc3RyZWFtLmFib3J0KCkgLy8gcmVxdWVzdC5kZXN0cm95IGp1c3QgZG8gLmVuZCAtIC5hYm9ydCBpcyB3aGF0IHdlIHdhbnRcblxuICAgIGlmIChpc0ZuKHN0cmVhbS5kZXN0cm95KSkgcmV0dXJuIHN0cmVhbS5kZXN0cm95KClcblxuICAgIGNhbGxiYWNrKGVyciB8fCBuZXcgRXJyb3IoJ3N0cmVhbSB3YXMgZGVzdHJveWVkJykpXG4gIH1cbn1cblxudmFyIGNhbGwgPSBmdW5jdGlvbiAoZm4pIHtcbiAgZm4oKVxufVxuXG52YXIgcGlwZSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICByZXR1cm4gZnJvbS5waXBlKHRvKVxufVxuXG52YXIgcHVtcCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0cmVhbXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gIHZhciBjYWxsYmFjayA9IGlzRm4oc3RyZWFtc1tzdHJlYW1zLmxlbmd0aCAtIDFdIHx8IG5vb3ApICYmIHN0cmVhbXMucG9wKCkgfHwgbm9vcFxuXG4gIGlmIChBcnJheS5pc0FycmF5KHN0cmVhbXNbMF0pKSBzdHJlYW1zID0gc3RyZWFtc1swXVxuICBpZiAoc3RyZWFtcy5sZW5ndGggPCAyKSB0aHJvdyBuZXcgRXJyb3IoJ3B1bXAgcmVxdWlyZXMgdHdvIHN0cmVhbXMgcGVyIG1pbmltdW0nKVxuXG4gIHZhciBlcnJvclxuICB2YXIgZGVzdHJveXMgPSBzdHJlYW1zLm1hcChmdW5jdGlvbiAoc3RyZWFtLCBpKSB7XG4gICAgdmFyIHJlYWRpbmcgPSBpIDwgc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgdmFyIHdyaXRpbmcgPSBpID4gMFxuICAgIHJldHVybiBkZXN0cm95ZXIoc3RyZWFtLCByZWFkaW5nLCB3cml0aW5nLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoIWVycm9yKSBlcnJvciA9IGVyclxuICAgICAgaWYgKGVycikgZGVzdHJveXMuZm9yRWFjaChjYWxsKVxuICAgICAgaWYgKHJlYWRpbmcpIHJldHVyblxuICAgICAgZGVzdHJveXMuZm9yRWFjaChjYWxsKVxuICAgICAgY2FsbGJhY2soZXJyb3IpXG4gICAgfSlcbiAgfSlcblxuICByZXR1cm4gc3RyZWFtcy5yZWR1Y2UocGlwZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwdW1wXG4iLCJtb2R1bGUuZXhwb3J0cyA9ICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHByb2Nlc3MubmV4dFRpY2sgPT09ICdmdW5jdGlvbicpXG4gID8gcHJvY2Vzcy5uZXh0VGljay5iaW5kKHByb2Nlc3MpXG4gIDogcmVxdWlyZSgnLi9xdWV1ZS1taWNyb3Rhc2snKVxuIiwibW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbicgPyBxdWV1ZU1pY3JvdGFzayA6IChmbikgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbilcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKSxcbiAgam9pbiA9IHJlcXVpcmUoJ3BhdGgnKS5qb2luLFxuICByZXNvbHZlID0gcmVxdWlyZSgncGF0aCcpLnJlc29sdmUsXG4gIGRpcm5hbWUgPSByZXF1aXJlKCdwYXRoJykuZGlybmFtZSxcbiAgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgZXh0ZW5zaW9uczogWydqcycsICdqc29uJywgJ2NvZmZlZSddLFxuICAgIHJlY3Vyc2U6IHRydWUsXG4gICAgcmVuYW1lOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfSxcbiAgICB2aXNpdDogZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH07XG5cbmZ1bmN0aW9uIGNoZWNrRmlsZUluY2x1c2lvbihwYXRoLCBmaWxlbmFtZSwgb3B0aW9ucykge1xuICByZXR1cm4gKFxuICAgIC8vIHZlcmlmeSBmaWxlIGhhcyB2YWxpZCBleHRlbnNpb25cbiAgICAobmV3IFJlZ0V4cCgnXFxcXC4oJyArIG9wdGlvbnMuZXh0ZW5zaW9ucy5qb2luKCd8JykgKyAnKSQnLCAnaScpLnRlc3QoZmlsZW5hbWUpKSAmJlxuXG4gICAgLy8gaWYgb3B0aW9ucy5pbmNsdWRlIGlzIGEgUmVnRXhwLCBldmFsdWF0ZSBpdCBhbmQgbWFrZSBzdXJlIHRoZSBwYXRoIHBhc3Nlc1xuICAgICEob3B0aW9ucy5pbmNsdWRlICYmIG9wdGlvbnMuaW5jbHVkZSBpbnN0YW5jZW9mIFJlZ0V4cCAmJiAhb3B0aW9ucy5pbmNsdWRlLnRlc3QocGF0aCkpICYmXG5cbiAgICAvLyBpZiBvcHRpb25zLmluY2x1ZGUgaXMgYSBmdW5jdGlvbiwgZXZhbHVhdGUgaXQgYW5kIG1ha2Ugc3VyZSB0aGUgcGF0aCBwYXNzZXNcbiAgICAhKG9wdGlvbnMuaW5jbHVkZSAmJiB0eXBlb2Ygb3B0aW9ucy5pbmNsdWRlID09PSAnZnVuY3Rpb24nICYmICFvcHRpb25zLmluY2x1ZGUocGF0aCwgZmlsZW5hbWUpKSAmJlxuXG4gICAgLy8gaWYgb3B0aW9ucy5leGNsdWRlIGlzIGEgUmVnRXhwLCBldmFsdWF0ZSBpdCBhbmQgbWFrZSBzdXJlIHRoZSBwYXRoIGRvZXNuJ3QgcGFzc1xuICAgICEob3B0aW9ucy5leGNsdWRlICYmIG9wdGlvbnMuZXhjbHVkZSBpbnN0YW5jZW9mIFJlZ0V4cCAmJiBvcHRpb25zLmV4Y2x1ZGUudGVzdChwYXRoKSkgJiZcblxuICAgIC8vIGlmIG9wdGlvbnMuZXhjbHVkZSBpcyBhIGZ1bmN0aW9uLCBldmFsdWF0ZSBpdCBhbmQgbWFrZSBzdXJlIHRoZSBwYXRoIGRvZXNuJ3QgcGFzc1xuICAgICEob3B0aW9ucy5leGNsdWRlICYmIHR5cGVvZiBvcHRpb25zLmV4Y2x1ZGUgPT09ICdmdW5jdGlvbicgJiYgb3B0aW9ucy5leGNsdWRlKHBhdGgsIGZpbGVuYW1lKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZURpcmVjdG9yeShtLCBwYXRoLCBvcHRpb25zKSB7XG4gIHZhciByZXR2YWwgPSB7fTtcblxuICAvLyBwYXRoIGlzIG9wdGlvbmFsXG4gIGlmIChwYXRoICYmICFvcHRpb25zICYmIHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMgPSBwYXRoO1xuICAgIHBhdGggPSBudWxsO1xuICB9XG5cbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBmb3IgKHZhciBwcm9wIGluIGRlZmF1bHRPcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zW3Byb3BdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgb3B0aW9uc1twcm9wXSA9IGRlZmF1bHRPcHRpb25zW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIG5vIHBhdGggd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoZSBlcXVpdmVsYW50IG9mIF9fZGlybmFtZSBmcm9tIGNhbGxlclxuICAvLyBvdGhlcndpc2UsIHJlc29sdmUgcGF0aCByZWxhdGl2ZSB0byB0aGUgZXF1aXZhbGVudCBvZiBfX2Rpcm5hbWVcbiAgcGF0aCA9ICFwYXRoID8gZGlybmFtZShtLmZpbGVuYW1lKSA6IHJlc29sdmUoZGlybmFtZShtLmZpbGVuYW1lKSwgcGF0aCk7XG5cbiAgLy8gZ2V0IHRoZSBwYXRoIG9mIGVhY2ggZmlsZSBpbiBzcGVjaWZpZWQgZGlyZWN0b3J5LCBhcHBlbmQgdG8gY3VycmVudCB0cmVlIG5vZGUsIHJlY3Vyc2VcbiAgZnMucmVhZGRpclN5bmMocGF0aCkuZm9yRWFjaChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICB2YXIgam9pbmVkID0gam9pbihwYXRoLCBmaWxlbmFtZSksXG4gICAgICBmaWxlcyxcbiAgICAgIGtleSxcbiAgICAgIG9iajtcblxuICAgIGlmIChmcy5zdGF0U3luYyhqb2luZWQpLmlzRGlyZWN0b3J5KCkgJiYgb3B0aW9ucy5yZWN1cnNlKSB7XG4gICAgICAvLyB0aGlzIG5vZGUgaXMgYSBkaXJlY3Rvcnk7IHJlY3Vyc2VcbiAgICAgIGZpbGVzID0gcmVxdWlyZURpcmVjdG9yeShtLCBqb2luZWQsIG9wdGlvbnMpO1xuICAgICAgLy8gZXhjbHVkZSBlbXB0eSBkaXJlY3Rvcmllc1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGZpbGVzKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dmFsW29wdGlvbnMucmVuYW1lKGZpbGVuYW1lLCBqb2luZWQsIGZpbGVuYW1lKV0gPSBmaWxlcztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGpvaW5lZCAhPT0gbS5maWxlbmFtZSAmJiBjaGVja0ZpbGVJbmNsdXNpb24oam9pbmVkLCBmaWxlbmFtZSwgb3B0aW9ucykpIHtcbiAgICAgICAgLy8gaGFzaCBub2RlIGtleSBzaG91bGRuJ3QgaW5jbHVkZSBmaWxlIGV4dGVuc2lvblxuICAgICAgICBrZXkgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgICAgIG9iaiA9IG0ucmVxdWlyZShqb2luZWQpO1xuICAgICAgICByZXR2YWxbb3B0aW9ucy5yZW5hbWUoa2V5LCBqb2luZWQsIGZpbGVuYW1lKV0gPSBvcHRpb25zLnZpc2l0KG9iaiwgam9pbmVkLCBmaWxlbmFtZSkgfHwgb2JqO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJldHZhbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlRGlyZWN0b3J5O1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdHMgPSBkZWZhdWx0T3B0aW9ucztcbiIsImNvbnN0IEFOWSA9IFN5bWJvbCgnU2VtVmVyIEFOWScpXG4vLyBob2lzdGVkIGNsYXNzIGZvciBjeWNsaWMgZGVwZW5kZW5jeVxuY2xhc3MgQ29tcGFyYXRvciB7XG4gIHN0YXRpYyBnZXQgQU5ZICgpIHtcbiAgICByZXR1cm4gQU5ZXG4gIH1cblxuICBjb25zdHJ1Y3RvciAoY29tcCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmIChjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikge1xuICAgICAgaWYgKGNvbXAubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSkge1xuICAgICAgICByZXR1cm4gY29tcFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcCA9IGNvbXAudmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wID0gY29tcC50cmltKCkuc3BsaXQoL1xccysvKS5qb2luKCcgJylcbiAgICBkZWJ1ZygnY29tcGFyYXRvcicsIGNvbXAsIG9wdGlvbnMpXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2VcbiAgICB0aGlzLnBhcnNlKGNvbXApXG5cbiAgICBpZiAodGhpcy5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgdGhpcy52YWx1ZSA9ICcnXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm9wZXJhdG9yICsgdGhpcy5zZW12ZXIudmVyc2lvblxuICAgIH1cblxuICAgIGRlYnVnKCdjb21wJywgdGhpcylcbiAgfVxuXG4gIHBhcnNlIChjb21wKSB7XG4gICAgY29uc3QgciA9IHRoaXMub3B0aW9ucy5sb29zZSA/IHJlW3QuQ09NUEFSQVRPUkxPT1NFXSA6IHJlW3QuQ09NUEFSQVRPUl1cbiAgICBjb25zdCBtID0gY29tcC5tYXRjaChyKVxuXG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGNvbXBhcmF0b3I6ICR7Y29tcH1gKVxuICAgIH1cblxuICAgIHRoaXMub3BlcmF0b3IgPSBtWzFdICE9PSB1bmRlZmluZWQgPyBtWzFdIDogJydcbiAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJz0nKSB7XG4gICAgICB0aGlzLm9wZXJhdG9yID0gJydcbiAgICB9XG5cbiAgICAvLyBpZiBpdCBsaXRlcmFsbHkgaXMganVzdCAnPicgb3IgJycgdGhlbiBhbGxvdyBhbnl0aGluZy5cbiAgICBpZiAoIW1bMl0pIHtcbiAgICAgIHRoaXMuc2VtdmVyID0gQU5ZXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VtdmVyID0gbmV3IFNlbVZlcihtWzJdLCB0aGlzLm9wdGlvbnMubG9vc2UpXG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlXG4gIH1cblxuICB0ZXN0ICh2ZXJzaW9uKSB7XG4gICAgZGVidWcoJ0NvbXBhcmF0b3IudGVzdCcsIHZlcnNpb24sIHRoaXMub3B0aW9ucy5sb29zZSlcblxuICAgIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZIHx8IHZlcnNpb24gPT09IEFOWSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY21wKHZlcnNpb24sIHRoaXMub3BlcmF0b3IsIHRoaXMuc2VtdmVyLCB0aGlzLm9wdGlvbnMpXG4gIH1cblxuICBpbnRlcnNlY3RzIChjb21wLCBvcHRpb25zKSB7XG4gICAgaWYgKCEoY29tcCBpbnN0YW5jZW9mIENvbXBhcmF0b3IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhIENvbXBhcmF0b3IgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wZXJhdG9yID09PSAnJykge1xuICAgICAgaWYgKHRoaXMudmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKGNvbXAudmFsdWUsIG9wdGlvbnMpLnRlc3QodGhpcy52YWx1ZSlcbiAgICB9IGVsc2UgaWYgKGNvbXAub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgICBpZiAoY29tcC52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy52YWx1ZSwgb3B0aW9ucykudGVzdChjb21wLnNlbXZlcilcbiAgICB9XG5cbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICAvLyBTcGVjaWFsIGNhc2VzIHdoZXJlIG5vdGhpbmcgY2FuIHBvc3NpYmx5IGJlIGxvd2VyXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICAgICh0aGlzLnZhbHVlID09PSAnPDAuMC4wLTAnIHx8IGNvbXAudmFsdWUgPT09ICc8MC4wLjAtMCcpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgICAodGhpcy52YWx1ZS5zdGFydHNXaXRoKCc8MC4wLjAnKSB8fCBjb21wLnZhbHVlLnN0YXJ0c1dpdGgoJzwwLjAuMCcpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gU2FtZSBkaXJlY3Rpb24gaW5jcmVhc2luZyAoPiBvciA+PSlcbiAgICBpZiAodGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIFNhbWUgZGlyZWN0aW9uIGRlY3JlYXNpbmcgKDwgb3IgPD0pXG4gICAgaWYgKHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBzYW1lIFNlbVZlciBhbmQgYm90aCBzaWRlcyBhcmUgaW5jbHVzaXZlICg8PSBvciA+PSlcbiAgICBpZiAoXG4gICAgICAodGhpcy5zZW12ZXIudmVyc2lvbiA9PT0gY29tcC5zZW12ZXIudmVyc2lvbikgJiZcbiAgICAgIHRoaXMub3BlcmF0b3IuaW5jbHVkZXMoJz0nKSAmJiBjb21wLm9wZXJhdG9yLmluY2x1ZGVzKCc9JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIG9wcG9zaXRlIGRpcmVjdGlvbnMgbGVzcyB0aGFuXG4gICAgaWYgKGNtcCh0aGlzLnNlbXZlciwgJzwnLCBjb21wLnNlbXZlciwgb3B0aW9ucykgJiZcbiAgICAgIHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBvcHBvc2l0ZSBkaXJlY3Rpb25zIGdyZWF0ZXIgdGhhblxuICAgIGlmIChjbXAodGhpcy5zZW12ZXIsICc+JywgY29tcC5zZW12ZXIsIG9wdGlvbnMpICYmXG4gICAgICB0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb21wYXJhdG9yXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgeyBzYWZlUmU6IHJlLCB0IH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5jb25zdCBjbXAgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvY21wJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZGVidWcnKVxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuL3JhbmdlJylcbiIsIi8vIGhvaXN0ZWQgY2xhc3MgZm9yIGN5Y2xpYyBkZXBlbmRlbmN5XG5jbGFzcyBSYW5nZSB7XG4gIGNvbnN0cnVjdG9yIChyYW5nZSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmIChyYW5nZSBpbnN0YW5jZW9mIFJhbmdlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHJhbmdlLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UgJiZcbiAgICAgICAgcmFuZ2UuaW5jbHVkZVByZXJlbGVhc2UgPT09ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiByYW5nZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZS5yYXcsIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJhbmdlIGluc3RhbmNlb2YgQ29tcGFyYXRvcikge1xuICAgICAgLy8ganVzdCBwdXQgaXQgaW4gdGhlIHNldCBhbmQgcmV0dXJuXG4gICAgICB0aGlzLnJhdyA9IHJhbmdlLnZhbHVlXG4gICAgICB0aGlzLnNldCA9IFtbcmFuZ2VdXVxuICAgICAgdGhpcy5mb3JtYXQoKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIHRoaXMuaW5jbHVkZVByZXJlbGVhc2UgPSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcblxuICAgIC8vIEZpcnN0IHJlZHVjZSBhbGwgd2hpdGVzcGFjZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHNvIHdlIGRvIG5vdCBoYXZlIHRvIHJlbHlcbiAgICAvLyBvbiBwb3RlbnRpYWxseSBzbG93IHJlZ2V4ZXMgbGlrZSBcXHMqLiBUaGlzIGlzIHRoZW4gc3RvcmVkIGFuZCB1c2VkIGZvclxuICAgIC8vIGZ1dHVyZSBlcnJvciBtZXNzYWdlcyBhcyB3ZWxsLlxuICAgIHRoaXMucmF3ID0gcmFuZ2VcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAuam9pbignICcpXG5cbiAgICAvLyBGaXJzdCwgc3BsaXQgb24gfHxcbiAgICB0aGlzLnNldCA9IHRoaXMucmF3XG4gICAgICAuc3BsaXQoJ3x8JylcbiAgICAgIC8vIG1hcCB0aGUgcmFuZ2UgdG8gYSAyZCBhcnJheSBvZiBjb21wYXJhdG9yc1xuICAgICAgLm1hcChyID0+IHRoaXMucGFyc2VSYW5nZShyLnRyaW0oKSkpXG4gICAgICAvLyB0aHJvdyBvdXQgYW55IGNvbXBhcmF0b3IgbGlzdHMgdGhhdCBhcmUgZW1wdHlcbiAgICAgIC8vIHRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgaXQgd2FzIG5vdCBhIHZhbGlkIHJhbmdlLCB3aGljaCBpcyBhbGxvd2VkXG4gICAgICAvLyBpbiBsb29zZSBtb2RlLCBidXQgd2lsbCBzdGlsbCB0aHJvdyBpZiB0aGUgV0hPTEUgcmFuZ2UgaXMgaW52YWxpZC5cbiAgICAgIC5maWx0ZXIoYyA9PiBjLmxlbmd0aClcblxuICAgIGlmICghdGhpcy5zZXQubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFNlbVZlciBSYW5nZTogJHt0aGlzLnJhd31gKVxuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgYW55IHRoYXQgYXJlIG5vdCB0aGUgbnVsbCBzZXQsIHRocm93IG91dCBudWxsIHNldHMuXG4gICAgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIGtlZXAgdGhlIGZpcnN0IG9uZSwgaW4gY2FzZSB0aGV5J3JlIGFsbCBudWxsIHNldHNcbiAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5zZXRbMF1cbiAgICAgIHRoaXMuc2V0ID0gdGhpcy5zZXQuZmlsdGVyKGMgPT4gIWlzTnVsbFNldChjWzBdKSlcbiAgICAgIGlmICh0aGlzLnNldC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zZXQgPSBbZmlyc3RdXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbnkgdGhhdCBhcmUgKiwgdGhlbiB0aGUgcmFuZ2UgaXMganVzdCAqXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLnNldCkge1xuICAgICAgICAgIGlmIChjLmxlbmd0aCA9PT0gMSAmJiBpc0FueShjWzBdKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQgPSBbY11cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtYXQoKVxuICB9XG5cbiAgZm9ybWF0ICgpIHtcbiAgICB0aGlzLnJhbmdlID0gdGhpcy5zZXRcbiAgICAgIC5tYXAoKGNvbXBzKSA9PiBjb21wcy5qb2luKCcgJykudHJpbSgpKVxuICAgICAgLmpvaW4oJ3x8JylcbiAgICAgIC50cmltKClcbiAgICByZXR1cm4gdGhpcy5yYW5nZVxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlXG4gIH1cblxuICBwYXJzZVJhbmdlIChyYW5nZSkge1xuICAgIC8vIG1lbW9pemUgcmFuZ2UgcGFyc2luZyBmb3IgcGVyZm9ybWFuY2UuXG4gICAgLy8gdGhpcyBpcyBhIHZlcnkgaG90IHBhdGgsIGFuZCBmdWxseSBkZXRlcm1pbmlzdGljLlxuICAgIGNvbnN0IG1lbW9PcHRzID1cbiAgICAgICh0aGlzLm9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgRkxBR19JTkNMVURFX1BSRVJFTEVBU0UpIHxcbiAgICAgICh0aGlzLm9wdGlvbnMubG9vc2UgJiYgRkxBR19MT09TRSlcbiAgICBjb25zdCBtZW1vS2V5ID0gbWVtb09wdHMgKyAnOicgKyByYW5nZVxuICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChtZW1vS2V5KVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRcbiAgICB9XG5cbiAgICBjb25zdCBsb29zZSA9IHRoaXMub3B0aW9ucy5sb29zZVxuICAgIC8vIGAxLjIuMyAtIDEuMi40YCA9PiBgPj0xLjIuMyA8PTEuMi40YFxuICAgIGNvbnN0IGhyID0gbG9vc2UgPyByZVt0LkhZUEhFTlJBTkdFTE9PU0VdIDogcmVbdC5IWVBIRU5SQU5HRV1cbiAgICByYW5nZSA9IHJhbmdlLnJlcGxhY2UoaHIsIGh5cGhlblJlcGxhY2UodGhpcy5vcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSlcbiAgICBkZWJ1ZygnaHlwaGVuIHJlcGxhY2UnLCByYW5nZSlcblxuICAgIC8vIGA+IDEuMi4zIDwgMS4yLjVgID0+IGA+MS4yLjMgPDEuMi41YFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LkNPTVBBUkFUT1JUUklNXSwgY29tcGFyYXRvclRyaW1SZXBsYWNlKVxuICAgIGRlYnVnKCdjb21wYXJhdG9yIHRyaW0nLCByYW5nZSlcblxuICAgIC8vIGB+IDEuMi4zYCA9PiBgfjEuMi4zYFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LlRJTERFVFJJTV0sIHRpbGRlVHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ3RpbGRlIHRyaW0nLCByYW5nZSlcblxuICAgIC8vIGBeIDEuMi4zYCA9PiBgXjEuMi4zYFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LkNBUkVUVFJJTV0sIGNhcmV0VHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ2NhcmV0IHRyaW0nLCByYW5nZSlcblxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSByYW5nZSBpcyBjb21wbGV0ZWx5IHRyaW1tZWQgYW5kXG4gICAgLy8gcmVhZHkgdG8gYmUgc3BsaXQgaW50byBjb21wYXJhdG9ycy5cblxuICAgIGxldCByYW5nZUxpc3QgPSByYW5nZVxuICAgICAgLnNwbGl0KCcgJylcbiAgICAgIC5tYXAoY29tcCA9PiBwYXJzZUNvbXBhcmF0b3IoY29tcCwgdGhpcy5vcHRpb25zKSlcbiAgICAgIC5qb2luKCcgJylcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAvLyA+PTAuMC4wIGlzIGVxdWl2YWxlbnQgdG8gKlxuICAgICAgLm1hcChjb21wID0+IHJlcGxhY2VHVEUwKGNvbXAsIHRoaXMub3B0aW9ucykpXG5cbiAgICBpZiAobG9vc2UpIHtcbiAgICAgIC8vIGluIGxvb3NlIG1vZGUsIHRocm93IG91dCBhbnkgdGhhdCBhcmUgbm90IHZhbGlkIGNvbXBhcmF0b3JzXG4gICAgICByYW5nZUxpc3QgPSByYW5nZUxpc3QuZmlsdGVyKGNvbXAgPT4ge1xuICAgICAgICBkZWJ1ZygnbG9vc2UgaW52YWxpZCBmaWx0ZXInLCBjb21wLCB0aGlzLm9wdGlvbnMpXG4gICAgICAgIHJldHVybiAhIWNvbXAubWF0Y2gocmVbdC5DT01QQVJBVE9STE9PU0VdKVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVidWcoJ3JhbmdlIGxpc3QnLCByYW5nZUxpc3QpXG5cbiAgICAvLyBpZiBhbnkgY29tcGFyYXRvcnMgYXJlIHRoZSBudWxsIHNldCwgdGhlbiByZXBsYWNlIHdpdGggSlVTVCBudWxsIHNldFxuICAgIC8vIGlmIG1vcmUgdGhhbiBvbmUgY29tcGFyYXRvciwgcmVtb3ZlIGFueSAqIGNvbXBhcmF0b3JzXG4gICAgLy8gYWxzbywgZG9uJ3QgaW5jbHVkZSB0aGUgc2FtZSBjb21wYXJhdG9yIG1vcmUgdGhhbiBvbmNlXG4gICAgY29uc3QgcmFuZ2VNYXAgPSBuZXcgTWFwKClcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlTGlzdC5tYXAoY29tcCA9PiBuZXcgQ29tcGFyYXRvcihjb21wLCB0aGlzLm9wdGlvbnMpKVxuICAgIGZvciAoY29uc3QgY29tcCBvZiBjb21wYXJhdG9ycykge1xuICAgICAgaWYgKGlzTnVsbFNldChjb21wKSkge1xuICAgICAgICByZXR1cm4gW2NvbXBdXG4gICAgICB9XG4gICAgICByYW5nZU1hcC5zZXQoY29tcC52YWx1ZSwgY29tcClcbiAgICB9XG4gICAgaWYgKHJhbmdlTWFwLnNpemUgPiAxICYmIHJhbmdlTWFwLmhhcygnJykpIHtcbiAgICAgIHJhbmdlTWFwLmRlbGV0ZSgnJylcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBbLi4ucmFuZ2VNYXAudmFsdWVzKCldXG4gICAgY2FjaGUuc2V0KG1lbW9LZXksIHJlc3VsdClcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBpbnRlcnNlY3RzIChyYW5nZSwgb3B0aW9ucykge1xuICAgIGlmICghKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhIFJhbmdlIGlzIHJlcXVpcmVkJylcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXQuc29tZSgodGhpc0NvbXBhcmF0b3JzKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpc1NhdGlzZmlhYmxlKHRoaXNDb21wYXJhdG9ycywgb3B0aW9ucykgJiZcbiAgICAgICAgcmFuZ2Uuc2V0LnNvbWUoKHJhbmdlQ29tcGFyYXRvcnMpID0+IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXNTYXRpc2ZpYWJsZShyYW5nZUNvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgICAgICAgdGhpc0NvbXBhcmF0b3JzLmV2ZXJ5KCh0aGlzQ29tcGFyYXRvcikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gcmFuZ2VDb21wYXJhdG9ycy5ldmVyeSgocmFuZ2VDb21wYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNDb21wYXJhdG9yLmludGVyc2VjdHMocmFuZ2VDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSlcbiAgfVxuXG4gIC8vIGlmIEFOWSBvZiB0aGUgc2V0cyBtYXRjaCBBTEwgb2YgaXRzIGNvbXBhcmF0b3JzLCB0aGVuIHBhc3NcbiAgdGVzdCAodmVyc2lvbikge1xuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgdGhpcy5vcHRpb25zKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNldC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRlc3RTZXQodGhpcy5zZXRbaV0sIHZlcnNpb24sIHRoaXMub3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSYW5nZVxuXG5jb25zdCBMUlUgPSByZXF1aXJlKCdscnUtY2FjaGUnKVxuY29uc3QgY2FjaGUgPSBuZXcgTFJVKHsgbWF4OiAxMDAwIH0pXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY29tcGFyYXRvcicpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vc2VtdmVyJylcbmNvbnN0IHtcbiAgc2FmZVJlOiByZSxcbiAgdCxcbiAgY29tcGFyYXRvclRyaW1SZXBsYWNlLFxuICB0aWxkZVRyaW1SZXBsYWNlLFxuICBjYXJldFRyaW1SZXBsYWNlLFxufSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IHsgRkxBR19JTkNMVURFX1BSRVJFTEVBU0UsIEZMQUdfTE9PU0UgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2NvbnN0YW50cycpXG5cbmNvbnN0IGlzTnVsbFNldCA9IGMgPT4gYy52YWx1ZSA9PT0gJzwwLjAuMC0wJ1xuY29uc3QgaXNBbnkgPSBjID0+IGMudmFsdWUgPT09ICcnXG5cbi8vIHRha2UgYSBzZXQgb2YgY29tcGFyYXRvcnMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZXJlXG4vLyBleGlzdHMgYSB2ZXJzaW9uIHdoaWNoIGNhbiBzYXRpc2Z5IGl0XG5jb25zdCBpc1NhdGlzZmlhYmxlID0gKGNvbXBhcmF0b3JzLCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXN1bHQgPSB0cnVlXG4gIGNvbnN0IHJlbWFpbmluZ0NvbXBhcmF0b3JzID0gY29tcGFyYXRvcnMuc2xpY2UoKVxuICBsZXQgdGVzdENvbXBhcmF0b3IgPSByZW1haW5pbmdDb21wYXJhdG9ycy5wb3AoKVxuXG4gIHdoaWxlIChyZXN1bHQgJiYgcmVtYWluaW5nQ29tcGFyYXRvcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gcmVtYWluaW5nQ29tcGFyYXRvcnMuZXZlcnkoKG90aGVyQ29tcGFyYXRvcikgPT4ge1xuICAgICAgcmV0dXJuIHRlc3RDb21wYXJhdG9yLmludGVyc2VjdHMob3RoZXJDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgIH0pXG5cbiAgICB0ZXN0Q29tcGFyYXRvciA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLnBvcCgpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIGNvbXByaXNlZCBvZiB4cmFuZ2VzLCB0aWxkZXMsIHN0YXJzLCBhbmQgZ3RsdCdzIGF0IHRoaXMgcG9pbnQuXG4vLyBhbHJlYWR5IHJlcGxhY2VkIHRoZSBoeXBoZW4gcmFuZ2VzXG4vLyB0dXJuIGludG8gYSBzZXQgb2YgSlVTVCBjb21wYXJhdG9ycy5cbmNvbnN0IHBhcnNlQ29tcGFyYXRvciA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjb21wJywgY29tcCwgb3B0aW9ucylcbiAgY29tcCA9IHJlcGxhY2VDYXJldHMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ2NhcmV0JywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VUaWxkZXMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3RpbGRlcycsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlWFJhbmdlcyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygneHJhbmdlJywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VTdGFycyhjb21wLCBvcHRpb25zKVxuICBkZWJ1Zygnc3RhcnMnLCBjb21wKVxuICByZXR1cm4gY29tcFxufVxuXG5jb25zdCBpc1ggPSBpZCA9PiAhaWQgfHwgaWQudG9Mb3dlckNhc2UoKSA9PT0gJ3gnIHx8IGlkID09PSAnKidcblxuLy8gfiwgfj4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyB+MiwgfjIueCwgfjIueC54LCB+PjIsIH4+Mi54IH4+Mi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIH4yLjAsIH4yLjAueCwgfj4yLjAsIH4+Mi4wLnggLS0+ID49Mi4wLjAgPDIuMS4wLTBcbi8vIH4xLjIsIH4xLjIueCwgfj4xLjIsIH4+MS4yLnggLS0+ID49MS4yLjAgPDEuMy4wLTBcbi8vIH4xLjIuMywgfj4xLjIuMyAtLT4gPj0xLjIuMyA8MS4zLjAtMFxuLy8gfjEuMi4wLCB+PjEuMi4wIC0tPiA+PTEuMi4wIDwxLjMuMC0wXG4vLyB+MC4wLjEgLS0+ID49MC4wLjEgPDAuMS4wLTBcbmNvbnN0IHJlcGxhY2VUaWxkZXMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VUaWxkZShjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VUaWxkZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5USUxERUxPT1NFXSA6IHJlW3QuVElMREVdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ3RpbGRlJywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAgPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgLy8gfjEuMiA9PSA+PTEuMi4wIDwxLjMuMC0wXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uMCA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlVGlsZGUgcHInLCBwcilcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gfjEuMi4zID09ID49MS4yLjMgPDEuMy4wLTBcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9XG5cbiAgICBkZWJ1ZygndGlsZGUgcmV0dXJuJywgcmV0KVxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuLy8gXiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIF4yLCBeMi54LCBeMi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIF4yLjAsIF4yLjAueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gXjEuMiwgXjEuMi54IC0tPiA+PTEuMi4wIDwyLjAuMC0wXG4vLyBeMS4yLjMgLS0+ID49MS4yLjMgPDIuMC4wLTBcbi8vIF4xLjIuMCAtLT4gPj0xLjIuMCA8Mi4wLjAtMFxuLy8gXjAuMC4xIC0tPiA+PTAuMC4xIDwwLjAuMi0wXG4vLyBeMC4xLjAgLS0+ID49MC4xLjAgPDAuMi4wLTBcbmNvbnN0IHJlcGxhY2VDYXJldHMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VDYXJldChjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VDYXJldCA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjYXJldCcsIGNvbXAsIG9wdGlvbnMpXG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5DQVJFVExPT1NFXSA6IHJlW3QuQ0FSRVRdXG4gIGNvbnN0IHogPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gJy0wJyA6ICcnXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ2NhcmV0JywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3p9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmIChpc1gocCkpIHtcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7en0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByKSB7XG4gICAgICBkZWJ1ZygncmVwbGFjZUNhcmV0IHByJywgcHIpXG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgICAgfSA8JHtNfS4ke219LiR7K3AgKyAxfS0wYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Zygnbm8gcHInKVxuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7bX0uJHsrcCArIDF9LTBgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH1cblxuICAgIGRlYnVnKCdjYXJldCByZXR1cm4nLCByZXQpXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG5jb25zdCByZXBsYWNlWFJhbmdlcyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlWFJhbmdlcycsIGNvbXAsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlWFJhbmdlKGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZVhSYW5nZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbXAgPSBjb21wLnRyaW0oKVxuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuWFJBTkdFTE9PU0VdIDogcmVbdC5YUkFOR0VdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygneFJhbmdlJywgY29tcCwgcmV0LCBndGx0LCBNLCBtLCBwLCBwcilcbiAgICBjb25zdCB4TSA9IGlzWChNKVxuICAgIGNvbnN0IHhtID0geE0gfHwgaXNYKG0pXG4gICAgY29uc3QgeHAgPSB4bSB8fCBpc1gocClcbiAgICBjb25zdCBhbnlYID0geHBcblxuICAgIGlmIChndGx0ID09PSAnPScgJiYgYW55WCkge1xuICAgICAgZ3RsdCA9ICcnXG4gICAgfVxuXG4gICAgLy8gaWYgd2UncmUgaW5jbHVkaW5nIHByZXJlbGVhc2VzIGluIHRoZSBtYXRjaCwgdGhlbiB3ZSBuZWVkXG4gICAgLy8gdG8gZml4IHRoaXMgdG8gLTAsIHRoZSBsb3dlc3QgcG9zc2libGUgcHJlcmVsZWFzZSB2YWx1ZVxuICAgIHByID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/ICctMCcgOiAnJ1xuXG4gICAgaWYgKHhNKSB7XG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nIHx8IGd0bHQgPT09ICc8Jykge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGFsbG93ZWRcbiAgICAgICAgcmV0ID0gJzwwLjAuMC0wJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBmb3JiaWRkZW5cbiAgICAgICAgcmV0ID0gJyonXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChndGx0ICYmIGFueVgpIHtcbiAgICAgIC8vIHdlIGtub3cgcGF0Y2ggaXMgYW4geCwgYmVjYXVzZSB3ZSBoYXZlIGFueSB4IGF0IGFsbC5cbiAgICAgIC8vIHJlcGxhY2UgWCB3aXRoIDBcbiAgICAgIGlmICh4bSkge1xuICAgICAgICBtID0gMFxuICAgICAgfVxuICAgICAgcCA9IDBcblxuICAgICAgaWYgKGd0bHQgPT09ICc+Jykge1xuICAgICAgICAvLyA+MSA9PiA+PTIuMC4wXG4gICAgICAgIC8vID4xLjIgPT4gPj0xLjMuMFxuICAgICAgICBndGx0ID0gJz49J1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxXG4gICAgICAgICAgbSA9IDBcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0bHQgPT09ICc8PScpIHtcbiAgICAgICAgLy8gPD0wLjcueCBpcyBhY3R1YWxseSA8MC44LjAsIHNpbmNlIGFueSAwLjcueCBzaG91bGRcbiAgICAgICAgLy8gcGFzcy4gIFNpbWlsYXJseSwgPD03LnggaXMgYWN0dWFsbHkgPDguMC4wLCBldGMuXG4gICAgICAgIGd0bHQgPSAnPCdcbiAgICAgICAgaWYgKHhtKSB7XG4gICAgICAgICAgTSA9ICtNICsgMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIHByID0gJy0wJ1xuICAgICAgfVxuXG4gICAgICByZXQgPSBgJHtndGx0ICsgTX0uJHttfS4ke3B9JHtwcn1gXG4gICAgfSBlbHNlIGlmICh4bSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3ByfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoeHApIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHtwclxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH1cblxuICAgIGRlYnVnKCd4UmFuZ2UgcmV0dXJuJywgcmV0KVxuXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG4vLyBCZWNhdXNlICogaXMgQU5ELWVkIHdpdGggZXZlcnl0aGluZyBlbHNlIGluIHRoZSBjb21wYXJhdG9yLFxuLy8gYW5kICcnIG1lYW5zIFwiYW55IHZlcnNpb25cIiwganVzdCByZW1vdmUgdGhlICpzIGVudGlyZWx5LlxuY29uc3QgcmVwbGFjZVN0YXJzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VTdGFycycsIGNvbXAsIG9wdGlvbnMpXG4gIC8vIExvb3NlbmVzcyBpcyBpZ25vcmVkIGhlcmUuICBzdGFyIGlzIGFsd2F5cyBhcyBsb29zZSBhcyBpdCBnZXRzIVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVt0LlNUQVJdLCAnJylcbn1cblxuY29uc3QgcmVwbGFjZUdURTAgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZUdURTAnLCBjb21wLCBvcHRpb25zKVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVtvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gdC5HVEUwUFJFIDogdC5HVEUwXSwgJycpXG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHN0cmluZy5yZXBsYWNlKHJlW3QuSFlQSEVOUkFOR0VdKVxuLy8gTSwgbSwgcGF0Y2gsIHByZXJlbGVhc2UsIGJ1aWxkXG4vLyAxLjIgLSAzLjQuNSA9PiA+PTEuMi4wIDw9My40LjVcbi8vIDEuMi4zIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wLTAgQW55IDMuNC54IHdpbGwgZG9cbi8vIDEuMiAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMC0wXG5jb25zdCBoeXBoZW5SZXBsYWNlID0gaW5jUHIgPT4gKCQwLFxuICBmcm9tLCBmTSwgZm0sIGZwLCBmcHIsIGZiLFxuICB0bywgdE0sIHRtLCB0cCwgdHByLCB0YikgPT4ge1xuICBpZiAoaXNYKGZNKSkge1xuICAgIGZyb20gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWChmbSkpIHtcbiAgICBmcm9tID0gYD49JHtmTX0uMC4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoaXNYKGZwKSkge1xuICAgIGZyb20gPSBgPj0ke2ZNfS4ke2ZtfS4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoZnByKSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX1gXG4gIH0gZWxzZSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX0ke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfVxuXG4gIGlmIChpc1godE0pKSB7XG4gICAgdG8gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWCh0bSkpIHtcbiAgICB0byA9IGA8JHsrdE0gKyAxfS4wLjAtMGBcbiAgfSBlbHNlIGlmIChpc1godHApKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7K3RtICsgMX0uMC0wYFxuICB9IGVsc2UgaWYgKHRwcikge1xuICAgIHRvID0gYDw9JHt0TX0uJHt0bX0uJHt0cH0tJHt0cHJ9YFxuICB9IGVsc2UgaWYgKGluY1ByKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7dG19LiR7K3RwICsgMX0tMGBcbiAgfSBlbHNlIHtcbiAgICB0byA9IGA8PSR7dG99YFxuICB9XG5cbiAgcmV0dXJuIGAke2Zyb219ICR7dG99YC50cmltKClcbn1cblxuY29uc3QgdGVzdFNldCA9IChzZXQsIHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIXNldFtpXS50ZXN0KHZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBpZiAodmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgIC8vIEZpbmQgdGhlIHNldCBvZiB2ZXJzaW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIGhhdmUgcHJlcmVsZWFzZXNcbiAgICAvLyBGb3IgZXhhbXBsZSwgXjEuMi4zLXByLjEgZGVzdWdhcnMgdG8gPj0xLjIuMy1wci4xIDwyLjAuMFxuICAgIC8vIFRoYXQgc2hvdWxkIGFsbG93IGAxLjIuMy1wci4yYCB0byBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIGAxLjIuNC1hbHBoYS5ub3RyZWFkeWAgc2hvdWxkIE5PVCBiZSBhbGxvd2VkLFxuICAgIC8vIGV2ZW4gdGhvdWdoIGl0J3Mgd2l0aGluIHRoZSByYW5nZSBzZXQgYnkgdGhlIGNvbXBhcmF0b3JzLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWJ1ZyhzZXRbaV0uc2VtdmVyKVxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIgPT09IENvbXBhcmF0b3IuQU5ZKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gc2V0W2ldLnNlbXZlclxuICAgICAgICBpZiAoYWxsb3dlZC5tYWpvciA9PT0gdmVyc2lvbi5tYWpvciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5taW5vciA9PT0gdmVyc2lvbi5taW5vciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5wYXRjaCA9PT0gdmVyc2lvbi5wYXRjaCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWZXJzaW9uIGhhcyBhIC1wcmUsIGJ1dCBpdCdzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2UgbGlrZS5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCJjb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IHsgTUFYX0xFTkdUSCwgTUFYX1NBRkVfSU5URUdFUiB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IHsgY29tcGFyZUlkZW50aWZpZXJzIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pZGVudGlmaWVycycpXG5jbGFzcyBTZW1WZXIge1xuICBjb25zdHJ1Y3RvciAodmVyc2lvbiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgICBpZiAodmVyc2lvbi5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlICYmXG4gICAgICAgICAgdmVyc2lvbi5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi52ZXJzaW9uXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgdmVyc2lvbi4gTXVzdCBiZSBhIHN0cmluZy4gR290IHR5cGUgXCIke3R5cGVvZiB2ZXJzaW9ufVwiLmApXG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24ubGVuZ3RoID4gTUFYX0xFTkdUSCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYHZlcnNpb24gaXMgbG9uZ2VyIHRoYW4gJHtNQVhfTEVOR1RIfSBjaGFyYWN0ZXJzYFxuICAgICAgKVxuICAgIH1cblxuICAgIGRlYnVnKCdTZW1WZXInLCB2ZXJzaW9uLCBvcHRpb25zKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgLy8gdGhpcyBpc24ndCBhY3R1YWxseSByZWxldmFudCBmb3IgdmVyc2lvbnMsIGJ1dCBrZWVwIGl0IHNvIHRoYXQgd2VcbiAgICAvLyBkb24ndCBydW4gaW50byB0cm91YmxlIHBhc3NpbmcgdGhpcy5vcHRpb25zIGFyb3VuZC5cbiAgICB0aGlzLmluY2x1ZGVQcmVyZWxlYXNlID0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG5cbiAgICBjb25zdCBtID0gdmVyc2lvbi50cmltKCkubWF0Y2gob3B0aW9ucy5sb29zZSA/IHJlW3QuTE9PU0VdIDogcmVbdC5GVUxMXSlcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBWZXJzaW9uOiAke3ZlcnNpb259YClcbiAgICB9XG5cbiAgICB0aGlzLnJhdyA9IHZlcnNpb25cblxuICAgIC8vIHRoZXNlIGFyZSBhY3R1YWxseSBudW1iZXJzXG4gICAgdGhpcy5tYWpvciA9ICttWzFdXG4gICAgdGhpcy5taW5vciA9ICttWzJdXG4gICAgdGhpcy5wYXRjaCA9ICttWzNdXG5cbiAgICBpZiAodGhpcy5tYWpvciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5tYWpvciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWFqb3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWlub3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWlub3IgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1pbm9yIHZlcnNpb24nKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBhdGNoID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLnBhdGNoIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBwYXRjaCB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICAvLyBudW1iZXJpZnkgYW55IHByZXJlbGVhc2UgbnVtZXJpYyBpZHNcbiAgICBpZiAoIW1bNF0pIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IG1bNF0uc3BsaXQoJy4nKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgIGlmICgvXlswLTldKyQvLnRlc3QoaWQpKSB7XG4gICAgICAgICAgY29uc3QgbnVtID0gK2lkXG4gICAgICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuYnVpbGQgPSBtWzVdID8gbVs1XS5zcGxpdCgnLicpIDogW11cbiAgICB0aGlzLmZvcm1hdCgpXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHRoaXMudmVyc2lvbiA9IGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLnBhdGNofWBcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgdGhpcy52ZXJzaW9uICs9IGAtJHt0aGlzLnByZXJlbGVhc2Uuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnNpb25cbiAgfVxuXG4gIGNvbXBhcmUgKG90aGVyKSB7XG4gICAgZGVidWcoJ1NlbVZlci5jb21wYXJlJywgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMsIG90aGVyKVxuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gJ3N0cmluZycgJiYgb3RoZXIgPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgaWYgKG90aGVyLnZlcnNpb24gPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21wYXJlTWFpbihvdGhlcikgfHwgdGhpcy5jb21wYXJlUHJlKG90aGVyKVxuICB9XG5cbiAgY29tcGFyZU1haW4gKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWFqb3IsIG90aGVyLm1ham9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWlub3IsIG90aGVyLm1pbm9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucGF0Y2gsIG90aGVyLnBhdGNoKVxuICAgIClcbiAgfVxuXG4gIGNvbXBhcmVQcmUgKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICAvLyBOT1QgaGF2aW5nIGEgcHJlcmVsZWFzZSBpcyA+IGhhdmluZyBvbmVcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH0gZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMucHJlcmVsZWFzZVtpXVxuICAgICAgY29uc3QgYiA9IG90aGVyLnByZXJlbGVhc2VbaV1cbiAgICAgIGRlYnVnKCdwcmVyZWxlYXNlIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIGNvbXBhcmVCdWlsZCAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIGxldCBpID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmJ1aWxkW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIuYnVpbGRbaV1cbiAgICAgIGRlYnVnKCdwcmVyZWxlYXNlIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIC8vIHByZW1pbm9yIHdpbGwgYnVtcCB0aGUgdmVyc2lvbiB1cCB0byB0aGUgbmV4dCBtaW5vciByZWxlYXNlLCBhbmQgaW1tZWRpYXRlbHlcbiAgLy8gZG93biB0byBwcmUtcmVsZWFzZS4gcHJlbWFqb3IgYW5kIHByZXBhdGNoIHdvcmsgdGhlIHNhbWUgd2F5LlxuICBpbmMgKHJlbGVhc2UsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKSB7XG4gICAgc3dpdGNoIChyZWxlYXNlKSB7XG4gICAgICBjYXNlICdwcmVtYWpvcic6XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMubWlub3IgPSAwXG4gICAgICAgIHRoaXMubWFqb3IrK1xuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwcmVtaW5vcic6XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMubWlub3IrK1xuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwcmVwYXRjaCc6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYWxyZWFkeSBhIHByZXJlbGVhc2UsIGl0IHdpbGwgYnVtcCB0byB0aGUgbmV4dCB2ZXJzaW9uXG4gICAgICAgIC8vIGRyb3AgYW55IHByZXJlbGVhc2VzIHRoYXQgbWlnaHQgYWxyZWFkeSBleGlzdCwgc2luY2UgdGhleSBhcmUgbm90XG4gICAgICAgIC8vIHJlbGV2YW50IGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBJZiB0aGUgaW5wdXQgaXMgYSBub24tcHJlcmVsZWFzZSB2ZXJzaW9uLCB0aGlzIGFjdHMgdGhlIHNhbWUgYXNcbiAgICAgIC8vIHByZXBhdGNoLlxuICAgICAgY2FzZSAncHJlcmVsZWFzZSc6XG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdtYWpvcic6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWFqb3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uLlxuICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1ham9yLlxuICAgICAgICAvLyAxLjAuMC01IGJ1bXBzIHRvIDEuMC4wXG4gICAgICAgIC8vIDEuMS4wIGJ1bXBzIHRvIDIuMC4wXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm1pbm9yICE9PSAwIHx8XG4gICAgICAgICAgdGhpcy5wYXRjaCAhPT0gMCB8fFxuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5tYWpvcisrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5taW5vciA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ21pbm9yJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1taW5vciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1pbm9yIHZlcnNpb24uXG4gICAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgbWlub3IuXG4gICAgICAgIC8vIDEuMi4wLTUgYnVtcHMgdG8gMS4yLjBcbiAgICAgICAgLy8gMS4yLjEgYnVtcHMgdG8gMS4zLjBcbiAgICAgICAgaWYgKHRoaXMucGF0Y2ggIT09IDAgfHwgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMubWlub3IrK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwYXRjaCc6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiwgaXQgd2lsbCBpbmNyZW1lbnQgdGhlIHBhdGNoLlxuICAgICAgICAvLyBJZiBpdCBpcyBhIHByZS1yZWxlYXNlIGl0IHdpbGwgYnVtcCB1cCB0byB0aGUgc2FtZSBwYXRjaCB2ZXJzaW9uLlxuICAgICAgICAvLyAxLjIuMC01IHBhdGNoZXMgdG8gMS4yLjBcbiAgICAgICAgLy8gMS4yLjAgcGF0Y2hlcyB0byAxLjIuMVxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMucGF0Y2grK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSB1c2VkIHB1YmxpY2x5LlxuICAgICAgLy8gMS4wLjAgJ3ByZScgd291bGQgYmVjb21lIDEuMC4wLTAgd2hpY2ggaXMgdGhlIHdyb25nIGRpcmVjdGlvbi5cbiAgICAgIGNhc2UgJ3ByZSc6IHtcbiAgICAgICAgY29uc3QgYmFzZSA9IE51bWJlcihpZGVudGlmaWVyQmFzZSkgPyAxIDogMFxuXG4gICAgICAgIGlmICghaWRlbnRpZmllciAmJiBpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiBpZGVudGlmaWVyIGlzIGVtcHR5JylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW2Jhc2VdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGkgPSB0aGlzLnByZXJlbGVhc2UubGVuZ3RoXG4gICAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlcmVsZWFzZVtpXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlW2ldKytcbiAgICAgICAgICAgICAgaSA9IC0yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpID09PSAtMSkge1xuICAgICAgICAgICAgLy8gZGlkbid0IGluY3JlbWVudCBhbnl0aGluZ1xuICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIgPT09IHRoaXMucHJlcmVsZWFzZS5qb2luKCcuJykgJiYgaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6IGlkZW50aWZpZXIgYWxyZWFkeSBleGlzdHMnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlLnB1c2goYmFzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAvLyAxLjIuMC1iZXRhLjEgYnVtcHMgdG8gMS4yLjAtYmV0YS4yLFxuICAgICAgICAgIC8vIDEuMi4wLWJldGEuZm9vYmx6IG9yIDEuMi4wLWJldGEgYnVtcHMgdG8gMS4yLjAtYmV0YS4wXG4gICAgICAgICAgbGV0IHByZXJlbGVhc2UgPSBbaWRlbnRpZmllciwgYmFzZV1cbiAgICAgICAgICBpZiAoaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBwcmVyZWxlYXNlID0gW2lkZW50aWZpZXJdXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb21wYXJlSWRlbnRpZmllcnModGhpcy5wcmVyZWxlYXNlWzBdLCBpZGVudGlmaWVyKSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGlzTmFOKHRoaXMucHJlcmVsZWFzZVsxXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiAke3JlbGVhc2V9YClcbiAgICB9XG4gICAgdGhpcy5yYXcgPSB0aGlzLmZvcm1hdCgpXG4gICAgaWYgKHRoaXMuYnVpbGQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJhdyArPSBgKyR7dGhpcy5idWlsZC5qb2luKCcuJyl9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2VtVmVyXG4iLCJjb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgY2xlYW4gPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBzID0gcGFyc2UodmVyc2lvbi50cmltKCkucmVwbGFjZSgvXls9dl0rLywgJycpLCBvcHRpb25zKVxuICByZXR1cm4gcyA/IHMudmVyc2lvbiA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gY2xlYW5cbiIsImNvbnN0IGVxID0gcmVxdWlyZSgnLi9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL25lcScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZ3QnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9ndGUnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vbHRlJylcblxuY29uc3QgY21wID0gKGEsIG9wLCBiLCBsb29zZSkgPT4ge1xuICBzd2l0Y2ggKG9wKSB7XG4gICAgY2FzZSAnPT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSA9PT0gYlxuXG4gICAgY2FzZSAnIT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSAhPT0gYlxuXG4gICAgY2FzZSAnJzpcbiAgICBjYXNlICc9JzpcbiAgICBjYXNlICc9PSc6XG4gICAgICByZXR1cm4gZXEoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICchPSc6XG4gICAgICByZXR1cm4gbmVxKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPic6XG4gICAgICByZXR1cm4gZ3QoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc+PSc6XG4gICAgICByZXR1cm4gZ3RlKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPCc6XG4gICAgICByZXR1cm4gbHQoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc8PSc6XG4gICAgICByZXR1cm4gbHRlKGEsIGIsIGxvb3NlKVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgb3BlcmF0b3I6ICR7b3B9YClcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBjbXBcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcblxuY29uc3QgY29lcmNlID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvblxuICB9XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHZlcnNpb24gPSBTdHJpbmcodmVyc2lvbilcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBsZXQgbWF0Y2ggPSBudWxsXG4gIGlmICghb3B0aW9ucy5ydGwpIHtcbiAgICBtYXRjaCA9IHZlcnNpb24ubWF0Y2gob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFRlVMTF0gOiByZVt0LkNPRVJDRV0pXG4gIH0gZWxzZSB7XG4gICAgLy8gRmluZCB0aGUgcmlnaHQtbW9zdCBjb2VyY2libGUgc3RyaW5nIHRoYXQgZG9lcyBub3Qgc2hhcmVcbiAgICAvLyBhIHRlcm1pbnVzIHdpdGggYSBtb3JlIGxlZnQtd2FyZCBjb2VyY2libGUgc3RyaW5nLlxuICAgIC8vIEVnLCAnMS4yLjMuNCcgd2FudHMgdG8gY29lcmNlICcyLjMuNCcsIG5vdCAnMy40JyBvciAnNCdcbiAgICAvLyBXaXRoIGluY2x1ZGVQcmVyZWxlYXNlIG9wdGlvbiBzZXQsICcxLjIuMy40LXJjJyB3YW50cyB0byBjb2VyY2UgJzIuMy40LXJjJywgbm90ICcyLjMuNCdcbiAgICAvL1xuICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgc3RyaW5nIGNoZWNraW5nIHdpdGggYSAvZyByZWdleHBcbiAgICAvLyBNYW51YWxseSBzZXQgdGhlIGluZGV4IHNvIGFzIHRvIHBpY2sgdXAgb3ZlcmxhcHBpbmcgbWF0Y2hlcy5cbiAgICAvLyBTdG9wIHdoZW4gd2UgZ2V0IGEgbWF0Y2ggdGhhdCBlbmRzIGF0IHRoZSBzdHJpbmcgZW5kLCBzaW5jZSBub1xuICAgIC8vIGNvZXJjaWJsZSBzdHJpbmcgY2FuIGJlIG1vcmUgcmlnaHQtd2FyZCB3aXRob3V0IHRoZSBzYW1lIHRlcm1pbnVzLlxuICAgIGNvbnN0IGNvZXJjZVJ0bFJlZ2V4ID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFUlRMRlVMTF0gOiByZVt0LkNPRVJDRVJUTF1cbiAgICBsZXQgbmV4dFxuICAgIHdoaWxlICgobmV4dCA9IGNvZXJjZVJ0bFJlZ2V4LmV4ZWModmVyc2lvbikpICYmXG4gICAgICAgICghbWF0Y2ggfHwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggIT09IHZlcnNpb24ubGVuZ3RoKVxuICAgICkge1xuICAgICAgaWYgKCFtYXRjaCB8fFxuICAgICAgICAgICAgbmV4dC5pbmRleCArIG5leHRbMF0ubGVuZ3RoICE9PSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCkge1xuICAgICAgICBtYXRjaCA9IG5leHRcbiAgICAgIH1cbiAgICAgIGNvZXJjZVJ0bFJlZ2V4Lmxhc3RJbmRleCA9IG5leHQuaW5kZXggKyBuZXh0WzFdLmxlbmd0aCArIG5leHRbMl0ubGVuZ3RoXG4gICAgfVxuICAgIC8vIGxlYXZlIGl0IGluIGEgY2xlYW4gc3RhdGVcbiAgICBjb2VyY2VSdGxSZWdleC5sYXN0SW5kZXggPSAtMVxuICB9XG5cbiAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IG1ham9yID0gbWF0Y2hbMl1cbiAgY29uc3QgbWlub3IgPSBtYXRjaFszXSB8fCAnMCdcbiAgY29uc3QgcGF0Y2ggPSBtYXRjaFs0XSB8fCAnMCdcbiAgY29uc3QgcHJlcmVsZWFzZSA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgbWF0Y2hbNV0gPyBgLSR7bWF0Y2hbNV19YCA6ICcnXG4gIGNvbnN0IGJ1aWxkID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBtYXRjaFs2XSA/IGArJHttYXRjaFs2XX1gIDogJydcblxuICByZXR1cm4gcGFyc2UoYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9JHtwcmVyZWxlYXNlfSR7YnVpbGR9YCwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gY29lcmNlXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBjb21wYXJlQnVpbGQgPSAoYSwgYiwgbG9vc2UpID0+IHtcbiAgY29uc3QgdmVyc2lvbkEgPSBuZXcgU2VtVmVyKGEsIGxvb3NlKVxuICBjb25zdCB2ZXJzaW9uQiA9IG5ldyBTZW1WZXIoYiwgbG9vc2UpXG4gIHJldHVybiB2ZXJzaW9uQS5jb21wYXJlKHZlcnNpb25CKSB8fCB2ZXJzaW9uQS5jb21wYXJlQnVpbGQodmVyc2lvbkIpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVCdWlsZFxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBjb21wYXJlTG9vc2UgPSAoYSwgYikgPT4gY29tcGFyZShhLCBiLCB0cnVlKVxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlTG9vc2VcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGNvbXBhcmUgPSAoYSwgYiwgbG9vc2UpID0+XG4gIG5ldyBTZW1WZXIoYSwgbG9vc2UpLmNvbXBhcmUobmV3IFNlbVZlcihiLCBsb29zZSkpXG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZVxuIiwiY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlLmpzJylcblxuY29uc3QgZGlmZiA9ICh2ZXJzaW9uMSwgdmVyc2lvbjIpID0+IHtcbiAgY29uc3QgdjEgPSBwYXJzZSh2ZXJzaW9uMSwgbnVsbCwgdHJ1ZSlcbiAgY29uc3QgdjIgPSBwYXJzZSh2ZXJzaW9uMiwgbnVsbCwgdHJ1ZSlcbiAgY29uc3QgY29tcGFyaXNvbiA9IHYxLmNvbXBhcmUodjIpXG5cbiAgaWYgKGNvbXBhcmlzb24gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgdjFIaWdoZXIgPSBjb21wYXJpc29uID4gMFxuICBjb25zdCBoaWdoVmVyc2lvbiA9IHYxSGlnaGVyID8gdjEgOiB2MlxuICBjb25zdCBsb3dWZXJzaW9uID0gdjFIaWdoZXIgPyB2MiA6IHYxXG4gIGNvbnN0IGhpZ2hIYXNQcmUgPSAhIWhpZ2hWZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoXG4gIGNvbnN0IGxvd0hhc1ByZSA9ICEhbG93VmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aFxuXG4gIGlmIChsb3dIYXNQcmUgJiYgIWhpZ2hIYXNQcmUpIHtcbiAgICAvLyBHb2luZyBmcm9tIHByZXJlbGVhc2UgLT4gbm8gcHJlcmVsZWFzZSByZXF1aXJlcyBzb21lIHNwZWNpYWwgY2FzaW5nXG5cbiAgICAvLyBJZiB0aGUgbG93IHZlcnNpb24gaGFzIG9ubHkgYSBtYWpvciwgdGhlbiBpdCB3aWxsIGFsd2F5cyBiZSBhIG1ham9yXG4gICAgLy8gU29tZSBleGFtcGxlczpcbiAgICAvLyAxLjAuMC0xIC0+IDEuMC4wXG4gICAgLy8gMS4wLjAtMSAtPiAxLjEuMVxuICAgIC8vIDEuMC4wLTEgLT4gMi4wLjBcbiAgICBpZiAoIWxvd1ZlcnNpb24ucGF0Y2ggJiYgIWxvd1ZlcnNpb24ubWlub3IpIHtcbiAgICAgIHJldHVybiAnbWFqb3InXG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIGl0IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIHRoZSBoaWdoIHZlcnNpb25cblxuICAgIGlmIChoaWdoVmVyc2lvbi5wYXRjaCkge1xuICAgICAgLy8gYW55dGhpbmcgaGlnaGVyIHRoYW4gYSBwYXRjaCBidW1wIHdvdWxkIHJlc3VsdCBpbiB0aGUgd3JvbmcgdmVyc2lvblxuICAgICAgcmV0dXJuICdwYXRjaCdcbiAgICB9XG5cbiAgICBpZiAoaGlnaFZlcnNpb24ubWlub3IpIHtcbiAgICAgIC8vIGFueXRoaW5nIGhpZ2hlciB0aGFuIGEgbWlub3IgYnVtcCB3b3VsZCByZXN1bHQgaW4gdGhlIHdyb25nIHZlcnNpb25cbiAgICAgIHJldHVybiAnbWlub3InXG4gICAgfVxuXG4gICAgLy8gYnVtcGluZyBtYWpvci9taW5vci9wYXRjaCBhbGwgaGF2ZSBzYW1lIHJlc3VsdFxuICAgIHJldHVybiAnbWFqb3InXG4gIH1cblxuICAvLyBhZGQgdGhlIGBwcmVgIHByZWZpeCBpZiB3ZSBhcmUgZ29pbmcgdG8gYSBwcmVyZWxlYXNlIHZlcnNpb25cbiAgY29uc3QgcHJlZml4ID0gaGlnaEhhc1ByZSA/ICdwcmUnIDogJydcblxuICBpZiAodjEubWFqb3IgIT09IHYyLm1ham9yKSB7XG4gICAgcmV0dXJuIHByZWZpeCArICdtYWpvcidcbiAgfVxuXG4gIGlmICh2MS5taW5vciAhPT0gdjIubWlub3IpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJ21pbm9yJ1xuICB9XG5cbiAgaWYgKHYxLnBhdGNoICE9PSB2Mi5wYXRjaCkge1xuICAgIHJldHVybiBwcmVmaXggKyAncGF0Y2gnXG4gIH1cblxuICAvLyBoaWdoIGFuZCBsb3cgYXJlIHByZWxlYXNlc1xuICByZXR1cm4gJ3ByZXJlbGVhc2UnXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGlmZlxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBlcSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPT09IDBcbm1vZHVsZS5leHBvcnRzID0gZXFcbiIsImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgZ3QgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID4gMFxubW9kdWxlLmV4cG9ydHMgPSBndFxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBndGUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID49IDBcbm1vZHVsZS5leHBvcnRzID0gZ3RlXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5cbmNvbnN0IGluYyA9ICh2ZXJzaW9uLCByZWxlYXNlLCBvcHRpb25zLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkgPT4ge1xuICBpZiAodHlwZW9mIChvcHRpb25zKSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZGVudGlmaWVyQmFzZSA9IGlkZW50aWZpZXJcbiAgICBpZGVudGlmaWVyID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSB1bmRlZmluZWRcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBTZW1WZXIoXG4gICAgICB2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyID8gdmVyc2lvbi52ZXJzaW9uIDogdmVyc2lvbixcbiAgICAgIG9wdGlvbnNcbiAgICApLmluYyhyZWxlYXNlLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkudmVyc2lvblxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gaW5jXG4iLCJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGx0ID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA8IDBcbm1vZHVsZS5leHBvcnRzID0gbHRcbiIsImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbHRlID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA8PSAwXG5tb2R1bGUuZXhwb3J0cyA9IGx0ZVxuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgbWFqb3IgPSAoYSwgbG9vc2UpID0+IG5ldyBTZW1WZXIoYSwgbG9vc2UpLm1ham9yXG5tb2R1bGUuZXhwb3J0cyA9IG1ham9yXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBtaW5vciA9IChhLCBsb29zZSkgPT4gbmV3IFNlbVZlcihhLCBsb29zZSkubWlub3Jcbm1vZHVsZS5leHBvcnRzID0gbWlub3JcbiIsImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbmVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSAhPT0gMFxubW9kdWxlLmV4cG9ydHMgPSBuZXFcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhcnNlID0gKHZlcnNpb24sIG9wdGlvbnMsIHRocm93RXJyb3JzID0gZmFsc2UpID0+IHtcbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvblxuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBTZW1WZXIodmVyc2lvbiwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICBpZiAoIXRocm93RXJyb3JzKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICB0aHJvdyBlclxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2VcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhdGNoID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5wYXRjaFxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaFxuIiwiY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHByZXJlbGVhc2UgPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZSh2ZXJzaW9uLCBvcHRpb25zKVxuICByZXR1cm4gKHBhcnNlZCAmJiBwYXJzZWQucHJlcmVsZWFzZS5sZW5ndGgpID8gcGFyc2VkLnByZXJlbGVhc2UgOiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IHByZXJlbGVhc2VcbiIsImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgcmNvbXBhcmUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYiwgYSwgbG9vc2UpXG5tb2R1bGUuZXhwb3J0cyA9IHJjb21wYXJlXG4iLCJjb25zdCBjb21wYXJlQnVpbGQgPSByZXF1aXJlKCcuL2NvbXBhcmUtYnVpbGQnKVxuY29uc3QgcnNvcnQgPSAobGlzdCwgbG9vc2UpID0+IGxpc3Quc29ydCgoYSwgYikgPT4gY29tcGFyZUJ1aWxkKGIsIGEsIGxvb3NlKSlcbm1vZHVsZS5leHBvcnRzID0gcnNvcnRcbiIsImNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICByYW5nZSA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gcmFuZ2UudGVzdCh2ZXJzaW9uKVxufVxubW9kdWxlLmV4cG9ydHMgPSBzYXRpc2ZpZXNcbiIsImNvbnN0IGNvbXBhcmVCdWlsZCA9IHJlcXVpcmUoJy4vY29tcGFyZS1idWlsZCcpXG5jb25zdCBzb3J0ID0gKGxpc3QsIGxvb3NlKSA9PiBsaXN0LnNvcnQoKGEsIGIpID0+IGNvbXBhcmVCdWlsZChhLCBiLCBsb29zZSkpXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnRcbiIsImNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCB2YWxpZCA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHYgPSBwYXJzZSh2ZXJzaW9uLCBvcHRpb25zKVxuICByZXR1cm4gdiA/IHYudmVyc2lvbiA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gdmFsaWRcbiIsIi8vIGp1c3QgcHJlLWxvYWQgYWxsIHRoZSBzdHVmZiB0aGF0IGluZGV4LmpzIGxhemlseSBleHBvcnRzXG5jb25zdCBpbnRlcm5hbFJlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9yZScpXG5jb25zdCBjb25zdGFudHMgPSByZXF1aXJlKCcuL2ludGVybmFsL2NvbnN0YW50cycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGlkZW50aWZpZXJzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9pZGVudGlmaWVycycpXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3BhcnNlJylcbmNvbnN0IHZhbGlkID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvdmFsaWQnKVxuY29uc3QgY2xlYW4gPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jbGVhbicpXG5jb25zdCBpbmMgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9pbmMnKVxuY29uc3QgZGlmZiA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2RpZmYnKVxuY29uc3QgbWFqb3IgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9tYWpvcicpXG5jb25zdCBtaW5vciA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL21pbm9yJylcbmNvbnN0IHBhdGNoID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcGF0Y2gnKVxuY29uc3QgcHJlcmVsZWFzZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3ByZXJlbGVhc2UnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUnKVxuY29uc3QgcmNvbXBhcmUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9yY29tcGFyZScpXG5jb25zdCBjb21wYXJlTG9vc2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb21wYXJlLWxvb3NlJylcbmNvbnN0IGNvbXBhcmVCdWlsZCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUtYnVpbGQnKVxuY29uc3Qgc29ydCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3NvcnQnKVxuY29uc3QgcnNvcnQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9yc29ydCcpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2d0JylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbHQnKVxuY29uc3QgZXEgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9uZXEnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZ3RlJylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2x0ZScpXG5jb25zdCBjbXAgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jbXAnKVxuY29uc3QgY29lcmNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29lcmNlJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuL2NsYXNzZXMvY29tcGFyYXRvcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9zYXRpc2ZpZXMnKVxuY29uc3QgdG9Db21wYXJhdG9ycyA9IHJlcXVpcmUoJy4vcmFuZ2VzL3RvLWNvbXBhcmF0b3JzJylcbmNvbnN0IG1heFNhdGlzZnlpbmcgPSByZXF1aXJlKCcuL3Jhbmdlcy9tYXgtc2F0aXNmeWluZycpXG5jb25zdCBtaW5TYXRpc2Z5aW5nID0gcmVxdWlyZSgnLi9yYW5nZXMvbWluLXNhdGlzZnlpbmcnKVxuY29uc3QgbWluVmVyc2lvbiA9IHJlcXVpcmUoJy4vcmFuZ2VzL21pbi12ZXJzaW9uJylcbmNvbnN0IHZhbGlkUmFuZ2UgPSByZXF1aXJlKCcuL3Jhbmdlcy92YWxpZCcpXG5jb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9yYW5nZXMvb3V0c2lkZScpXG5jb25zdCBndHIgPSByZXF1aXJlKCcuL3Jhbmdlcy9ndHInKVxuY29uc3QgbHRyID0gcmVxdWlyZSgnLi9yYW5nZXMvbHRyJylcbmNvbnN0IGludGVyc2VjdHMgPSByZXF1aXJlKCcuL3Jhbmdlcy9pbnRlcnNlY3RzJylcbmNvbnN0IHNpbXBsaWZ5UmFuZ2UgPSByZXF1aXJlKCcuL3Jhbmdlcy9zaW1wbGlmeScpXG5jb25zdCBzdWJzZXQgPSByZXF1aXJlKCcuL3Jhbmdlcy9zdWJzZXQnKVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBhcnNlLFxuICB2YWxpZCxcbiAgY2xlYW4sXG4gIGluYyxcbiAgZGlmZixcbiAgbWFqb3IsXG4gIG1pbm9yLFxuICBwYXRjaCxcbiAgcHJlcmVsZWFzZSxcbiAgY29tcGFyZSxcbiAgcmNvbXBhcmUsXG4gIGNvbXBhcmVMb29zZSxcbiAgY29tcGFyZUJ1aWxkLFxuICBzb3J0LFxuICByc29ydCxcbiAgZ3QsXG4gIGx0LFxuICBlcSxcbiAgbmVxLFxuICBndGUsXG4gIGx0ZSxcbiAgY21wLFxuICBjb2VyY2UsXG4gIENvbXBhcmF0b3IsXG4gIFJhbmdlLFxuICBzYXRpc2ZpZXMsXG4gIHRvQ29tcGFyYXRvcnMsXG4gIG1heFNhdGlzZnlpbmcsXG4gIG1pblNhdGlzZnlpbmcsXG4gIG1pblZlcnNpb24sXG4gIHZhbGlkUmFuZ2UsXG4gIG91dHNpZGUsXG4gIGd0cixcbiAgbHRyLFxuICBpbnRlcnNlY3RzLFxuICBzaW1wbGlmeVJhbmdlLFxuICBzdWJzZXQsXG4gIFNlbVZlcixcbiAgcmU6IGludGVybmFsUmUucmUsXG4gIHNyYzogaW50ZXJuYWxSZS5zcmMsXG4gIHRva2VuczogaW50ZXJuYWxSZS50LFxuICBTRU1WRVJfU1BFQ19WRVJTSU9OOiBjb25zdGFudHMuU0VNVkVSX1NQRUNfVkVSU0lPTixcbiAgUkVMRUFTRV9UWVBFUzogY29uc3RhbnRzLlJFTEVBU0VfVFlQRVMsXG4gIGNvbXBhcmVJZGVudGlmaWVyczogaWRlbnRpZmllcnMuY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzOiBpZGVudGlmaWVycy5yY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIiwiLy8gTm90ZTogdGhpcyBpcyB0aGUgc2VtdmVyLm9yZyB2ZXJzaW9uIG9mIHRoZSBzcGVjIHRoYXQgaXQgaW1wbGVtZW50c1xuLy8gTm90IG5lY2Vzc2FyaWx5IHRoZSBwYWNrYWdlIHZlcnNpb24gb2YgdGhpcyBjb2RlLlxuY29uc3QgU0VNVkVSX1NQRUNfVkVSU0lPTiA9ICcyLjAuMCdcblxuY29uc3QgTUFYX0xFTkdUSCA9IDI1NlxuY29uc3QgTUFYX1NBRkVfSU5URUdFUiA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyA5MDA3MTk5MjU0NzQwOTkxXG5cbi8vIE1heCBzYWZlIHNlZ21lbnQgbGVuZ3RoIGZvciBjb2VyY2lvbi5cbmNvbnN0IE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEggPSAxNlxuXG4vLyBNYXggc2FmZSBsZW5ndGggZm9yIGEgYnVpbGQgaWRlbnRpZmllci4gVGhlIG1heCBsZW5ndGggbWludXMgNiBjaGFyYWN0ZXJzIGZvclxuLy8gdGhlIHNob3J0ZXN0IHZlcnNpb24gd2l0aCBhIGJ1aWxkIDAuMC4wK0JVSUxELlxuY29uc3QgTUFYX1NBRkVfQlVJTERfTEVOR1RIID0gTUFYX0xFTkdUSCAtIDZcblxuY29uc3QgUkVMRUFTRV9UWVBFUyA9IFtcbiAgJ21ham9yJyxcbiAgJ3ByZW1ham9yJyxcbiAgJ21pbm9yJyxcbiAgJ3ByZW1pbm9yJyxcbiAgJ3BhdGNoJyxcbiAgJ3ByZXBhdGNoJyxcbiAgJ3ByZXJlbGVhc2UnLFxuXVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTUFYX0xFTkdUSCxcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfU0FGRV9JTlRFR0VSLFxuICBSRUxFQVNFX1RZUEVTLFxuICBTRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRTogMGIwMDEsXG4gIEZMQUdfTE9PU0U6IDBiMDEwLFxufVxuIiwiY29uc3QgZGVidWcgPSAoXG4gIHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICBwcm9jZXNzLmVudiAmJlxuICBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmXG4gIC9cXGJzZW12ZXJcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcpXG4pID8gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoJ1NFTVZFUicsIC4uLmFyZ3MpXG4gIDogKCkgPT4ge31cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJ1Z1xuIiwiY29uc3QgbnVtZXJpYyA9IC9eWzAtOV0rJC9cbmNvbnN0IGNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IGFudW0gPSBudW1lcmljLnRlc3QoYSlcbiAgY29uc3QgYm51bSA9IG51bWVyaWMudGVzdChiKVxuXG4gIGlmIChhbnVtICYmIGJudW0pIHtcbiAgICBhID0gK2FcbiAgICBiID0gK2JcbiAgfVxuXG4gIHJldHVybiBhID09PSBiID8gMFxuICAgIDogKGFudW0gJiYgIWJudW0pID8gLTFcbiAgICA6IChibnVtICYmICFhbnVtKSA/IDFcbiAgICA6IGEgPCBiID8gLTFcbiAgICA6IDFcbn1cblxuY29uc3QgcmNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiBjb21wYXJlSWRlbnRpZmllcnMoYiwgYSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbXBhcmVJZGVudGlmaWVycyxcbiAgcmNvbXBhcmVJZGVudGlmaWVycyxcbn1cbiIsIi8vIHBhcnNlIG91dCBqdXN0IHRoZSBvcHRpb25zIHdlIGNhcmUgYWJvdXRcbmNvbnN0IGxvb3NlT3B0aW9uID0gT2JqZWN0LmZyZWV6ZSh7IGxvb3NlOiB0cnVlIH0pXG5jb25zdCBlbXB0eU9wdHMgPSBPYmplY3QuZnJlZXplKHsgfSlcbmNvbnN0IHBhcnNlT3B0aW9ucyA9IG9wdGlvbnMgPT4ge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZXR1cm4gZW1wdHlPcHRzXG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGxvb3NlT3B0aW9uXG4gIH1cblxuICByZXR1cm4gb3B0aW9uc1xufVxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZU9wdGlvbnNcbiIsImNvbnN0IHtcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfTEVOR1RILFxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi9kZWJ1ZycpXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB7fVxuXG4vLyBUaGUgYWN0dWFsIHJlZ2V4cHMgZ28gb24gZXhwb3J0cy5yZVxuY29uc3QgcmUgPSBleHBvcnRzLnJlID0gW11cbmNvbnN0IHNhZmVSZSA9IGV4cG9ydHMuc2FmZVJlID0gW11cbmNvbnN0IHNyYyA9IGV4cG9ydHMuc3JjID0gW11cbmNvbnN0IHQgPSBleHBvcnRzLnQgPSB7fVxubGV0IFIgPSAwXG5cbmNvbnN0IExFVFRFUkRBU0hOVU1CRVIgPSAnW2EtekEtWjAtOS1dJ1xuXG4vLyBSZXBsYWNlIHNvbWUgZ3JlZWR5IHJlZ2V4IHRva2VucyB0byBwcmV2ZW50IHJlZ2V4IGRvcyBpc3N1ZXMuIFRoZXNlIHJlZ2V4IGFyZVxuLy8gdXNlZCBpbnRlcm5hbGx5IHZpYSB0aGUgc2FmZVJlIG9iamVjdCBzaW5jZSBhbGwgaW5wdXRzIGluIHRoaXMgbGlicmFyeSBnZXRcbi8vIG5vcm1hbGl6ZWQgZmlyc3QgdG8gdHJpbSBhbmQgY29sbGFwc2UgYWxsIGV4dHJhIHdoaXRlc3BhY2UuIFRoZSBvcmlnaW5hbFxuLy8gcmVnZXhlcyBhcmUgZXhwb3J0ZWQgZm9yIHVzZXJsYW5kIGNvbnN1bXB0aW9uIGFuZCBsb3dlciBsZXZlbCB1c2FnZS4gQVxuLy8gZnV0dXJlIGJyZWFraW5nIGNoYW5nZSBjb3VsZCBleHBvcnQgdGhlIHNhZmVyIHJlZ2V4IG9ubHkgd2l0aCBhIG5vdGUgdGhhdFxuLy8gYWxsIGlucHV0IHNob3VsZCBoYXZlIGV4dHJhIHdoaXRlc3BhY2UgcmVtb3ZlZC5cbmNvbnN0IHNhZmVSZWdleFJlcGxhY2VtZW50cyA9IFtcbiAgWydcXFxccycsIDFdLFxuICBbJ1xcXFxkJywgTUFYX0xFTkdUSF0sXG4gIFtMRVRURVJEQVNITlVNQkVSLCBNQVhfU0FGRV9CVUlMRF9MRU5HVEhdLFxuXVxuXG5jb25zdCBtYWtlU2FmZVJlZ2V4ID0gKHZhbHVlKSA9PiB7XG4gIGZvciAoY29uc3QgW3Rva2VuLCBtYXhdIG9mIHNhZmVSZWdleFJlcGxhY2VtZW50cykge1xuICAgIHZhbHVlID0gdmFsdWVcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0qYCkuam9pbihgJHt0b2tlbn17MCwke21heH19YClcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0rYCkuam9pbihgJHt0b2tlbn17MSwke21heH19YClcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuY29uc3QgY3JlYXRlVG9rZW4gPSAobmFtZSwgdmFsdWUsIGlzR2xvYmFsKSA9PiB7XG4gIGNvbnN0IHNhZmUgPSBtYWtlU2FmZVJlZ2V4KHZhbHVlKVxuICBjb25zdCBpbmRleCA9IFIrK1xuICBkZWJ1ZyhuYW1lLCBpbmRleCwgdmFsdWUpXG4gIHRbbmFtZV0gPSBpbmRleFxuICBzcmNbaW5kZXhdID0gdmFsdWVcbiAgcmVbaW5kZXhdID0gbmV3IFJlZ0V4cCh2YWx1ZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpXG4gIHNhZmVSZVtpbmRleF0gPSBuZXcgUmVnRXhwKHNhZmUsIGlzR2xvYmFsID8gJ2cnIDogdW5kZWZpbmVkKVxufVxuXG4vLyBUaGUgZm9sbG93aW5nIFJlZ3VsYXIgRXhwcmVzc2lvbnMgY2FuIGJlIHVzZWQgZm9yIHRva2VuaXppbmcsXG4vLyB2YWxpZGF0aW5nLCBhbmQgcGFyc2luZyBTZW1WZXIgdmVyc2lvbiBzdHJpbmdzLlxuXG4vLyAjIyBOdW1lcmljIElkZW50aWZpZXJcbi8vIEEgc2luZ2xlIGAwYCwgb3IgYSBub24temVybyBkaWdpdCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgZGlnaXRzLlxuXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVInLCAnMHxbMS05XVxcXFxkKicpXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVJMT09TRScsICdcXFxcZCsnKVxuXG4vLyAjIyBOb24tbnVtZXJpYyBJZGVudGlmaWVyXG4vLyBaZXJvIG9yIG1vcmUgZGlnaXRzLCBmb2xsb3dlZCBieSBhIGxldHRlciBvciBoeXBoZW4sIGFuZCB0aGVuIHplcm8gb3Jcbi8vIG1vcmUgbGV0dGVycywgZGlnaXRzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignTk9OTlVNRVJJQ0lERU5USUZJRVInLCBgXFxcXGQqW2EtekEtWi1dJHtMRVRURVJEQVNITlVNQkVSfSpgKVxuXG4vLyAjIyBNYWluIFZlcnNpb25cbi8vIFRocmVlIGRvdC1zZXBhcmF0ZWQgbnVtZXJpYyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ01BSU5WRVJTSU9OJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KWApXG5cbmNyZWF0ZVRva2VuKCdNQUlOVkVSU0lPTkxPT1NFJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlgKVxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uIElkZW50aWZpZXJcbi8vIEEgbnVtZXJpYyBpZGVudGlmaWVyLCBvciBhIG5vbi1udW1lcmljIGlkZW50aWZpZXIuXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFSURFTlRJRklFUicsIGAoPzoke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXVxufXwke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VJREVOVElGSUVSTE9PU0UnLCBgKD86JHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXVxufXwke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvblxuLy8gSHlwaGVuLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkb3Qtc2VwYXJhdGVkIHByZS1yZWxlYXNlIHZlcnNpb25cbi8vIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRScsIGAoPzotKCR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSXX0pKikpYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VMT09TRScsIGAoPzotPygke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdfSkqKSlgKVxuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YSBJZGVudGlmaWVyXG4vLyBBbnkgY29tYmluYXRpb24gb2YgZGlnaXRzLCBsZXR0ZXJzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignQlVJTERJREVOVElGSUVSJywgYCR7TEVUVEVSREFTSE5VTUJFUn0rYClcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGFcbi8vIFBsdXMgc2lnbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGVyaW9kLXNlcGFyYXRlZCBidWlsZCBtZXRhZGF0YVxuLy8gaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdCVUlMRCcsIGAoPzpcXFxcKygke3NyY1t0LkJVSUxESURFTlRJRklFUl1cbn0oPzpcXFxcLiR7c3JjW3QuQlVJTERJREVOVElGSUVSXX0pKikpYClcblxuLy8gIyMgRnVsbCBWZXJzaW9uIFN0cmluZ1xuLy8gQSBtYWluIHZlcnNpb24sIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uIGFuZFxuLy8gYnVpbGQgbWV0YWRhdGEuXG5cbi8vIE5vdGUgdGhhdCB0aGUgb25seSBtYWpvciwgbWlub3IsIHBhdGNoLCBhbmQgcHJlLXJlbGVhc2Ugc2VjdGlvbnMgb2Zcbi8vIHRoZSB2ZXJzaW9uIHN0cmluZyBhcmUgY2FwdHVyaW5nIGdyb3Vwcy4gIFRoZSBidWlsZCBtZXRhZGF0YSBpcyBub3QgYVxuLy8gY2FwdHVyaW5nIGdyb3VwLCBiZWNhdXNlIGl0IHNob3VsZCBub3QgZXZlciBiZSB1c2VkIGluIHZlcnNpb25cbi8vIGNvbXBhcmlzb24uXG5cbmNyZWF0ZVRva2VuKCdGVUxMUExBSU4nLCBgdj8ke3NyY1t0Lk1BSU5WRVJTSU9OXVxufSR7c3JjW3QuUFJFUkVMRUFTRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0ZVTEwnLCBgXiR7c3JjW3QuRlVMTFBMQUlOXX0kYClcblxuLy8gbGlrZSBmdWxsLCBidXQgYWxsb3dzIHYxLjIuMyBhbmQgPTEuMi4zLCB3aGljaCBwZW9wbGUgZG8gc29tZXRpbWVzLlxuLy8gYWxzbywgMS4wLjBhbHBoYTEgKHByZXJlbGVhc2Ugd2l0aG91dCB0aGUgaHlwaGVuKSB3aGljaCBpcyBwcmV0dHlcbi8vIGNvbW1vbiBpbiB0aGUgbnBtIHJlZ2lzdHJ5LlxuY3JlYXRlVG9rZW4oJ0xPT1NFUExBSU4nLCBgW3Y9XFxcXHNdKiR7c3JjW3QuTUFJTlZFUlNJT05MT09TRV1cbn0ke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0xPT1NFJywgYF4ke3NyY1t0LkxPT1NFUExBSU5dfSRgKVxuXG5jcmVhdGVUb2tlbignR1RMVCcsICcoKD86PHw+KT89PyknKVxuXG4vLyBTb21ldGhpbmcgbGlrZSBcIjIuKlwiIG9yIFwiMS4yLnhcIi5cbi8vIE5vdGUgdGhhdCBcIngueFwiIGlzIGEgdmFsaWQgeFJhbmdlIGlkZW50aWZlciwgbWVhbmluZyBcImFueSB2ZXJzaW9uXCJcbi8vIE9ubHkgdGhlIGZpcnN0IGl0ZW0gaXMgc3RyaWN0bHkgcmVxdWlyZWQuXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUkxPT1NFJywgYCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19fHh8WHxcXFxcKmApXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUicsIGAke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX18eHxYfFxcXFwqYClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOJywgYFt2PVxcXFxzXSooJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFXX0pPyR7XG4gICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgIGApPyk/YClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOTE9PU0UnLCBgW3Y9XFxcXHNdKigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19KT8ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCk/KT9gKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ1hSQU5HRUxPT1NFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENvZXJjaW9uLlxuLy8gRXh0cmFjdCBhbnl0aGluZyB0aGF0IGNvdWxkIGNvbmNlaXZhYmx5IGJlIGEgcGFydCBvZiBhIHZhbGlkIHNlbXZlclxuY3JlYXRlVG9rZW4oJ0NPRVJDRVBMQUlOJywgYCR7JyhefFteXFxcXGRdKScgK1xuICAgICAgICAgICAgICAnKFxcXFxkezEsJ30ke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSlgICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRScsIGAke3NyY1t0LkNPRVJDRVBMQUlOXX0oPzokfFteXFxcXGRdKWApXG5jcmVhdGVUb2tlbignQ09FUkNFRlVMTCcsIHNyY1t0LkNPRVJDRVBMQUlOXSArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VdfSk/YCArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LkJVSUxEXX0pP2AgK1xuICAgICAgICAgICAgICBgKD86JHxbXlxcXFxkXSlgKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRVJUTCcsIHNyY1t0LkNPRVJDRV0sIHRydWUpXG5jcmVhdGVUb2tlbignQ09FUkNFUlRMRlVMTCcsIHNyY1t0LkNPRVJDRUZVTExdLCB0cnVlKVxuXG4vLyBUaWxkZSByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwicmVhc29uYWJseSBhdCBvciBncmVhdGVyIHRoYW5cIlxuY3JlYXRlVG9rZW4oJ0xPTkVUSUxERScsICcoPzp+Pj8pJylcblxuY3JlYXRlVG9rZW4oJ1RJTERFVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuTE9ORVRJTERFXX1cXFxccytgLCB0cnVlKVxuZXhwb3J0cy50aWxkZVRyaW1SZXBsYWNlID0gJyQxfidcblxuY3JlYXRlVG9rZW4oJ1RJTERFJywgYF4ke3NyY1t0LkxPTkVUSUxERV19JHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignVElMREVMT09TRScsIGBeJHtzcmNbdC5MT05FVElMREVdfSR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENhcmV0IHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJhdCBsZWFzdCBhbmQgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aFwiXG5jcmVhdGVUb2tlbignTE9ORUNBUkVUJywgJyg/OlxcXFxeKScpXG5cbmNyZWF0ZVRva2VuKCdDQVJFVFRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkxPTkVDQVJFVF19XFxcXHMrYCwgdHJ1ZSlcbmV4cG9ydHMuY2FyZXRUcmltUmVwbGFjZSA9ICckMV4nXG5cbmNyZWF0ZVRva2VuKCdDQVJFVCcsIGBeJHtzcmNbdC5MT05FQ0FSRVRdfSR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ0NBUkVUTE9PU0UnLCBgXiR7c3JjW3QuTE9ORUNBUkVUXX0ke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBBIHNpbXBsZSBndC9sdC9lcSB0aGluZywgb3IganVzdCBcIlwiIHRvIGluZGljYXRlIFwiYW55IHZlcnNpb25cIlxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JMT09TRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX0pJHxeJGApXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUicsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5GVUxMUExBSU5dfSkkfF4kYClcblxuLy8gQW4gZXhwcmVzc2lvbiB0byBzdHJpcCBhbnkgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBndGx0IGFuZCB0aGUgdGhpbmdcbi8vIGl0IG1vZGlmaWVzLCBzbyB0aGF0IGA+IDEuMi4zYCA9PT4gYD4xLjIuM2BcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9SVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuR1RMVF1cbn1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX18JHtzcmNbdC5YUkFOR0VQTEFJTl19KWAsIHRydWUpXG5leHBvcnRzLmNvbXBhcmF0b3JUcmltUmVwbGFjZSA9ICckMSQyJDMnXG5cbi8vIFNvbWV0aGluZyBsaWtlIGAxLjIuMyAtIDEuMi40YFxuLy8gTm90ZSB0aGF0IHRoZXNlIGFsbCB1c2UgdGhlIGxvb3NlIGZvcm0sIGJlY2F1c2UgdGhleSdsbCBiZVxuLy8gY2hlY2tlZCBhZ2FpbnN0IGVpdGhlciB0aGUgc3RyaWN0IG9yIGxvb3NlIGNvbXBhcmF0b3IgZm9ybVxuLy8gbGF0ZXIuXG5jcmVhdGVUb2tlbignSFlQSEVOUkFOR0UnLCBgXlxcXFxzKigke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYFxcXFxzKy1cXFxccytgICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgICtcbiAgICAgICAgICAgICAgICAgICBgXFxcXHMqJGApXG5cbmNyZWF0ZVRva2VuKCdIWVBIRU5SQU5HRUxPT1NFJywgYF5cXFxccyooJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgXFxcXHMrLVxcXFxzK2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBcXFxccyokYClcblxuLy8gU3RhciByYW5nZXMgYmFzaWNhbGx5IGp1c3QgYWxsb3cgYW55dGhpbmcgYXQgYWxsLlxuY3JlYXRlVG9rZW4oJ1NUQVInLCAnKDx8Pik/PT9cXFxccypcXFxcKicpXG4vLyA+PTAuMC4wIGlzIGxpa2UgYSBzdGFyXG5jcmVhdGVUb2tlbignR1RFMCcsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wXFxcXHMqJCcpXG5jcmVhdGVUb2tlbignR1RFMFBSRScsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wLTBcXFxccyokJylcbiIsIid1c2Ugc3RyaWN0J1xuXG4vLyBBIGxpbmtlZCBsaXN0IHRvIGtlZXAgdHJhY2sgb2YgcmVjZW50bHktdXNlZC1uZXNzXG5jb25zdCBZYWxsaXN0ID0gcmVxdWlyZSgneWFsbGlzdCcpXG5cbmNvbnN0IE1BWCA9IFN5bWJvbCgnbWF4JylcbmNvbnN0IExFTkdUSCA9IFN5bWJvbCgnbGVuZ3RoJylcbmNvbnN0IExFTkdUSF9DQUxDVUxBVE9SID0gU3ltYm9sKCdsZW5ndGhDYWxjdWxhdG9yJylcbmNvbnN0IEFMTE9XX1NUQUxFID0gU3ltYm9sKCdhbGxvd1N0YWxlJylcbmNvbnN0IE1BWF9BR0UgPSBTeW1ib2woJ21heEFnZScpXG5jb25zdCBESVNQT1NFID0gU3ltYm9sKCdkaXNwb3NlJylcbmNvbnN0IE5PX0RJU1BPU0VfT05fU0VUID0gU3ltYm9sKCdub0Rpc3Bvc2VPblNldCcpXG5jb25zdCBMUlVfTElTVCA9IFN5bWJvbCgnbHJ1TGlzdCcpXG5jb25zdCBDQUNIRSA9IFN5bWJvbCgnY2FjaGUnKVxuY29uc3QgVVBEQVRFX0FHRV9PTl9HRVQgPSBTeW1ib2woJ3VwZGF0ZUFnZU9uR2V0JylcblxuY29uc3QgbmFpdmVMZW5ndGggPSAoKSA9PiAxXG5cbi8vIGxydUxpc3QgaXMgYSB5YWxsaXN0IHdoZXJlIHRoZSBoZWFkIGlzIHRoZSB5b3VuZ2VzdFxuLy8gaXRlbSwgYW5kIHRoZSB0YWlsIGlzIHRoZSBvbGRlc3QuICB0aGUgbGlzdCBjb250YWlucyB0aGUgSGl0XG4vLyBvYmplY3RzIGFzIHRoZSBlbnRyaWVzLlxuLy8gRWFjaCBIaXQgb2JqZWN0IGhhcyBhIHJlZmVyZW5jZSB0byBpdHMgWWFsbGlzdC5Ob2RlLiAgVGhpc1xuLy8gbmV2ZXIgY2hhbmdlcy5cbi8vXG4vLyBjYWNoZSBpcyBhIE1hcCAob3IgUHNldWRvTWFwKSB0aGF0IG1hdGNoZXMgdGhlIGtleXMgdG9cbi8vIHRoZSBZYWxsaXN0Lk5vZGUgb2JqZWN0LlxuY2xhc3MgTFJVQ2FjaGUge1xuICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ251bWJlcicpXG4gICAgICBvcHRpb25zID0geyBtYXg6IG9wdGlvbnMgfVxuXG4gICAgaWYgKCFvcHRpb25zKVxuICAgICAgb3B0aW9ucyA9IHt9XG5cbiAgICBpZiAob3B0aW9ucy5tYXggJiYgKHR5cGVvZiBvcHRpb25zLm1heCAhPT0gJ251bWJlcicgfHwgb3B0aW9ucy5tYXggPCAwKSlcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpXG4gICAgLy8gS2luZCBvZiB3ZWlyZCB0byBoYXZlIGEgZGVmYXVsdCBtYXggb2YgSW5maW5pdHksIGJ1dCBvaCB3ZWxsLlxuICAgIGNvbnN0IG1heCA9IHRoaXNbTUFYXSA9IG9wdGlvbnMubWF4IHx8IEluZmluaXR5XG5cbiAgICBjb25zdCBsYyA9IG9wdGlvbnMubGVuZ3RoIHx8IG5haXZlTGVuZ3RoXG4gICAgdGhpc1tMRU5HVEhfQ0FMQ1VMQVRPUl0gPSAodHlwZW9mIGxjICE9PSAnZnVuY3Rpb24nKSA/IG5haXZlTGVuZ3RoIDogbGNcbiAgICB0aGlzW0FMTE9XX1NUQUxFXSA9IG9wdGlvbnMuc3RhbGUgfHwgZmFsc2VcbiAgICBpZiAob3B0aW9ucy5tYXhBZ2UgJiYgdHlwZW9mIG9wdGlvbnMubWF4QWdlICE9PSAnbnVtYmVyJylcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heEFnZSBtdXN0IGJlIGEgbnVtYmVyJylcbiAgICB0aGlzW01BWF9BR0VdID0gb3B0aW9ucy5tYXhBZ2UgfHwgMFxuICAgIHRoaXNbRElTUE9TRV0gPSBvcHRpb25zLmRpc3Bvc2VcbiAgICB0aGlzW05PX0RJU1BPU0VfT05fU0VUXSA9IG9wdGlvbnMubm9EaXNwb3NlT25TZXQgfHwgZmFsc2VcbiAgICB0aGlzW1VQREFURV9BR0VfT05fR0VUXSA9IG9wdGlvbnMudXBkYXRlQWdlT25HZXQgfHwgZmFsc2VcbiAgICB0aGlzLnJlc2V0KClcbiAgfVxuXG4gIC8vIHJlc2l6ZSB0aGUgY2FjaGUgd2hlbiB0aGUgbWF4IGNoYW5nZXMuXG4gIHNldCBtYXggKG1MKSB7XG4gICAgaWYgKHR5cGVvZiBtTCAhPT0gJ251bWJlcicgfHwgbUwgPCAwKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJylcblxuICAgIHRoaXNbTUFYXSA9IG1MIHx8IEluZmluaXR5XG4gICAgdHJpbSh0aGlzKVxuICB9XG4gIGdldCBtYXggKCkge1xuICAgIHJldHVybiB0aGlzW01BWF1cbiAgfVxuXG4gIHNldCBhbGxvd1N0YWxlIChhbGxvd1N0YWxlKSB7XG4gICAgdGhpc1tBTExPV19TVEFMRV0gPSAhIWFsbG93U3RhbGVcbiAgfVxuICBnZXQgYWxsb3dTdGFsZSAoKSB7XG4gICAgcmV0dXJuIHRoaXNbQUxMT1dfU1RBTEVdXG4gIH1cblxuICBzZXQgbWF4QWdlIChtQSkge1xuICAgIGlmICh0eXBlb2YgbUEgIT09ICdudW1iZXInKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4QWdlIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJylcblxuICAgIHRoaXNbTUFYX0FHRV0gPSBtQVxuICAgIHRyaW0odGhpcylcbiAgfVxuICBnZXQgbWF4QWdlICgpIHtcbiAgICByZXR1cm4gdGhpc1tNQVhfQUdFXVxuICB9XG5cbiAgLy8gcmVzaXplIHRoZSBjYWNoZSB3aGVuIHRoZSBsZW5ndGhDYWxjdWxhdG9yIGNoYW5nZXMuXG4gIHNldCBsZW5ndGhDYWxjdWxhdG9yIChsQykge1xuICAgIGlmICh0eXBlb2YgbEMgIT09ICdmdW5jdGlvbicpXG4gICAgICBsQyA9IG5haXZlTGVuZ3RoXG5cbiAgICBpZiAobEMgIT09IHRoaXNbTEVOR1RIX0NBTENVTEFUT1JdKSB7XG4gICAgICB0aGlzW0xFTkdUSF9DQUxDVUxBVE9SXSA9IGxDXG4gICAgICB0aGlzW0xFTkdUSF0gPSAwXG4gICAgICB0aGlzW0xSVV9MSVNUXS5mb3JFYWNoKGhpdCA9PiB7XG4gICAgICAgIGhpdC5sZW5ndGggPSB0aGlzW0xFTkdUSF9DQUxDVUxBVE9SXShoaXQudmFsdWUsIGhpdC5rZXkpXG4gICAgICAgIHRoaXNbTEVOR1RIXSArPSBoaXQubGVuZ3RoXG4gICAgICB9KVxuICAgIH1cbiAgICB0cmltKHRoaXMpXG4gIH1cbiAgZ2V0IGxlbmd0aENhbGN1bGF0b3IgKCkgeyByZXR1cm4gdGhpc1tMRU5HVEhfQ0FMQ1VMQVRPUl0gfVxuXG4gIGdldCBsZW5ndGggKCkgeyByZXR1cm4gdGhpc1tMRU5HVEhdIH1cbiAgZ2V0IGl0ZW1Db3VudCAoKSB7IHJldHVybiB0aGlzW0xSVV9MSVNUXS5sZW5ndGggfVxuXG4gIHJmb3JFYWNoIChmbiwgdGhpc3ApIHtcbiAgICB0aGlzcCA9IHRoaXNwIHx8IHRoaXNcbiAgICBmb3IgKGxldCB3YWxrZXIgPSB0aGlzW0xSVV9MSVNUXS50YWlsOyB3YWxrZXIgIT09IG51bGw7KSB7XG4gICAgICBjb25zdCBwcmV2ID0gd2Fsa2VyLnByZXZcbiAgICAgIGZvckVhY2hTdGVwKHRoaXMsIGZuLCB3YWxrZXIsIHRoaXNwKVxuICAgICAgd2Fsa2VyID0gcHJldlxuICAgIH1cbiAgfVxuXG4gIGZvckVhY2ggKGZuLCB0aGlzcCkge1xuICAgIHRoaXNwID0gdGhpc3AgfHwgdGhpc1xuICAgIGZvciAobGV0IHdhbGtlciA9IHRoaXNbTFJVX0xJU1RdLmhlYWQ7IHdhbGtlciAhPT0gbnVsbDspIHtcbiAgICAgIGNvbnN0IG5leHQgPSB3YWxrZXIubmV4dFxuICAgICAgZm9yRWFjaFN0ZXAodGhpcywgZm4sIHdhbGtlciwgdGhpc3ApXG4gICAgICB3YWxrZXIgPSBuZXh0XG4gICAgfVxuICB9XG5cbiAga2V5cyAoKSB7XG4gICAgcmV0dXJuIHRoaXNbTFJVX0xJU1RdLnRvQXJyYXkoKS5tYXAoayA9PiBrLmtleSlcbiAgfVxuXG4gIHZhbHVlcyAoKSB7XG4gICAgcmV0dXJuIHRoaXNbTFJVX0xJU1RdLnRvQXJyYXkoKS5tYXAoayA9PiBrLnZhbHVlKVxuICB9XG5cbiAgcmVzZXQgKCkge1xuICAgIGlmICh0aGlzW0RJU1BPU0VdICYmXG4gICAgICAgIHRoaXNbTFJVX0xJU1RdICYmXG4gICAgICAgIHRoaXNbTFJVX0xJU1RdLmxlbmd0aCkge1xuICAgICAgdGhpc1tMUlVfTElTVF0uZm9yRWFjaChoaXQgPT4gdGhpc1tESVNQT1NFXShoaXQua2V5LCBoaXQudmFsdWUpKVxuICAgIH1cblxuICAgIHRoaXNbQ0FDSEVdID0gbmV3IE1hcCgpIC8vIGhhc2ggb2YgaXRlbXMgYnkga2V5XG4gICAgdGhpc1tMUlVfTElTVF0gPSBuZXcgWWFsbGlzdCgpIC8vIGxpc3Qgb2YgaXRlbXMgaW4gb3JkZXIgb2YgdXNlIHJlY2VuY3lcbiAgICB0aGlzW0xFTkdUSF0gPSAwIC8vIGxlbmd0aCBvZiBpdGVtcyBpbiB0aGUgbGlzdFxuICB9XG5cbiAgZHVtcCAoKSB7XG4gICAgcmV0dXJuIHRoaXNbTFJVX0xJU1RdLm1hcChoaXQgPT5cbiAgICAgIGlzU3RhbGUodGhpcywgaGl0KSA/IGZhbHNlIDoge1xuICAgICAgICBrOiBoaXQua2V5LFxuICAgICAgICB2OiBoaXQudmFsdWUsXG4gICAgICAgIGU6IGhpdC5ub3cgKyAoaGl0Lm1heEFnZSB8fCAwKVxuICAgICAgfSkudG9BcnJheSgpLmZpbHRlcihoID0+IGgpXG4gIH1cblxuICBkdW1wTHJ1ICgpIHtcbiAgICByZXR1cm4gdGhpc1tMUlVfTElTVF1cbiAgfVxuXG4gIHNldCAoa2V5LCB2YWx1ZSwgbWF4QWdlKSB7XG4gICAgbWF4QWdlID0gbWF4QWdlIHx8IHRoaXNbTUFYX0FHRV1cblxuICAgIGlmIChtYXhBZ2UgJiYgdHlwZW9mIG1heEFnZSAhPT0gJ251bWJlcicpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXhBZ2UgbXVzdCBiZSBhIG51bWJlcicpXG5cbiAgICBjb25zdCBub3cgPSBtYXhBZ2UgPyBEYXRlLm5vdygpIDogMFxuICAgIGNvbnN0IGxlbiA9IHRoaXNbTEVOR1RIX0NBTENVTEFUT1JdKHZhbHVlLCBrZXkpXG5cbiAgICBpZiAodGhpc1tDQUNIRV0uaGFzKGtleSkpIHtcbiAgICAgIGlmIChsZW4gPiB0aGlzW01BWF0pIHtcbiAgICAgICAgZGVsKHRoaXMsIHRoaXNbQ0FDSEVdLmdldChrZXkpKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXNbQ0FDSEVdLmdldChrZXkpXG4gICAgICBjb25zdCBpdGVtID0gbm9kZS52YWx1ZVxuXG4gICAgICAvLyBkaXNwb3NlIG9mIHRoZSBvbGQgb25lIGJlZm9yZSBvdmVyd3JpdGluZ1xuICAgICAgLy8gc3BsaXQgb3V0IGludG8gMiBpZnMgZm9yIGJldHRlciBjb3ZlcmFnZSB0cmFja2luZ1xuICAgICAgaWYgKHRoaXNbRElTUE9TRV0pIHtcbiAgICAgICAgaWYgKCF0aGlzW05PX0RJU1BPU0VfT05fU0VUXSlcbiAgICAgICAgICB0aGlzW0RJU1BPU0VdKGtleSwgaXRlbS52YWx1ZSlcbiAgICAgIH1cblxuICAgICAgaXRlbS5ub3cgPSBub3dcbiAgICAgIGl0ZW0ubWF4QWdlID0gbWF4QWdlXG4gICAgICBpdGVtLnZhbHVlID0gdmFsdWVcbiAgICAgIHRoaXNbTEVOR1RIXSArPSBsZW4gLSBpdGVtLmxlbmd0aFxuICAgICAgaXRlbS5sZW5ndGggPSBsZW5cbiAgICAgIHRoaXMuZ2V0KGtleSlcbiAgICAgIHRyaW0odGhpcylcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgaGl0ID0gbmV3IEVudHJ5KGtleSwgdmFsdWUsIGxlbiwgbm93LCBtYXhBZ2UpXG5cbiAgICAvLyBvdmVyc2l6ZWQgb2JqZWN0cyBmYWxsIG91dCBvZiBjYWNoZSBhdXRvbWF0aWNhbGx5LlxuICAgIGlmIChoaXQubGVuZ3RoID4gdGhpc1tNQVhdKSB7XG4gICAgICBpZiAodGhpc1tESVNQT1NFXSlcbiAgICAgICAgdGhpc1tESVNQT1NFXShrZXksIHZhbHVlKVxuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICB0aGlzW0xFTkdUSF0gKz0gaGl0Lmxlbmd0aFxuICAgIHRoaXNbTFJVX0xJU1RdLnVuc2hpZnQoaGl0KVxuICAgIHRoaXNbQ0FDSEVdLnNldChrZXksIHRoaXNbTFJVX0xJU1RdLmhlYWQpXG4gICAgdHJpbSh0aGlzKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBoYXMgKGtleSkge1xuICAgIGlmICghdGhpc1tDQUNIRV0uaGFzKGtleSkpIHJldHVybiBmYWxzZVxuICAgIGNvbnN0IGhpdCA9IHRoaXNbQ0FDSEVdLmdldChrZXkpLnZhbHVlXG4gICAgcmV0dXJuICFpc1N0YWxlKHRoaXMsIGhpdClcbiAgfVxuXG4gIGdldCAoa2V5KSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIHRydWUpXG4gIH1cblxuICBwZWVrIChrZXkpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSwgZmFsc2UpXG4gIH1cblxuICBwb3AgKCkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzW0xSVV9MSVNUXS50YWlsXG4gICAgaWYgKCFub2RlKVxuICAgICAgcmV0dXJuIG51bGxcblxuICAgIGRlbCh0aGlzLCBub2RlKVxuICAgIHJldHVybiBub2RlLnZhbHVlXG4gIH1cblxuICBkZWwgKGtleSkge1xuICAgIGRlbCh0aGlzLCB0aGlzW0NBQ0hFXS5nZXQoa2V5KSlcbiAgfVxuXG4gIGxvYWQgKGFycikge1xuICAgIC8vIHJlc2V0IHRoZSBjYWNoZVxuICAgIHRoaXMucmVzZXQoKVxuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgIC8vIEEgcHJldmlvdXMgc2VyaWFsaXplZCBjYWNoZSBoYXMgdGhlIG1vc3QgcmVjZW50IGl0ZW1zIGZpcnN0XG4gICAgZm9yIChsZXQgbCA9IGFyci5sZW5ndGggLSAxOyBsID49IDA7IGwtLSkge1xuICAgICAgY29uc3QgaGl0ID0gYXJyW2xdXG4gICAgICBjb25zdCBleHBpcmVzQXQgPSBoaXQuZSB8fCAwXG4gICAgICBpZiAoZXhwaXJlc0F0ID09PSAwKVxuICAgICAgICAvLyB0aGUgaXRlbSB3YXMgY3JlYXRlZCB3aXRob3V0IGV4cGlyYXRpb24gaW4gYSBub24gYWdlZCBjYWNoZVxuICAgICAgICB0aGlzLnNldChoaXQuaywgaGl0LnYpXG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgbWF4QWdlID0gZXhwaXJlc0F0IC0gbm93XG4gICAgICAgIC8vIGRvbnQgYWRkIGFscmVhZHkgZXhwaXJlZCBpdGVtc1xuICAgICAgICBpZiAobWF4QWdlID4gMCkge1xuICAgICAgICAgIHRoaXMuc2V0KGhpdC5rLCBoaXQudiwgbWF4QWdlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJ1bmUgKCkge1xuICAgIHRoaXNbQ0FDSEVdLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IGdldCh0aGlzLCBrZXksIGZhbHNlKSlcbiAgfVxufVxuXG5jb25zdCBnZXQgPSAoc2VsZiwga2V5LCBkb1VzZSkgPT4ge1xuICBjb25zdCBub2RlID0gc2VsZltDQUNIRV0uZ2V0KGtleSlcbiAgaWYgKG5vZGUpIHtcbiAgICBjb25zdCBoaXQgPSBub2RlLnZhbHVlXG4gICAgaWYgKGlzU3RhbGUoc2VsZiwgaGl0KSkge1xuICAgICAgZGVsKHNlbGYsIG5vZGUpXG4gICAgICBpZiAoIXNlbGZbQUxMT1dfU1RBTEVdKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkb1VzZSkge1xuICAgICAgICBpZiAoc2VsZltVUERBVEVfQUdFX09OX0dFVF0pXG4gICAgICAgICAgbm9kZS52YWx1ZS5ub3cgPSBEYXRlLm5vdygpXG4gICAgICAgIHNlbGZbTFJVX0xJU1RdLnVuc2hpZnROb2RlKG5vZGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoaXQudmFsdWVcbiAgfVxufVxuXG5jb25zdCBpc1N0YWxlID0gKHNlbGYsIGhpdCkgPT4ge1xuICBpZiAoIWhpdCB8fCAoIWhpdC5tYXhBZ2UgJiYgIXNlbGZbTUFYX0FHRV0pKVxuICAgIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IGRpZmYgPSBEYXRlLm5vdygpIC0gaGl0Lm5vd1xuICByZXR1cm4gaGl0Lm1heEFnZSA/IGRpZmYgPiBoaXQubWF4QWdlXG4gICAgOiBzZWxmW01BWF9BR0VdICYmIChkaWZmID4gc2VsZltNQVhfQUdFXSlcbn1cblxuY29uc3QgdHJpbSA9IHNlbGYgPT4ge1xuICBpZiAoc2VsZltMRU5HVEhdID4gc2VsZltNQVhdKSB7XG4gICAgZm9yIChsZXQgd2Fsa2VyID0gc2VsZltMUlVfTElTVF0udGFpbDtcbiAgICAgIHNlbGZbTEVOR1RIXSA+IHNlbGZbTUFYXSAmJiB3YWxrZXIgIT09IG51bGw7KSB7XG4gICAgICAvLyBXZSBrbm93IHRoYXQgd2UncmUgYWJvdXQgdG8gZGVsZXRlIHRoaXMgb25lLCBhbmQgYWxzb1xuICAgICAgLy8gd2hhdCB0aGUgbmV4dCBsZWFzdCByZWNlbnRseSB1c2VkIGtleSB3aWxsIGJlLCBzbyBqdXN0XG4gICAgICAvLyBnbyBhaGVhZCBhbmQgc2V0IGl0IG5vdy5cbiAgICAgIGNvbnN0IHByZXYgPSB3YWxrZXIucHJldlxuICAgICAgZGVsKHNlbGYsIHdhbGtlcilcbiAgICAgIHdhbGtlciA9IHByZXZcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgZGVsID0gKHNlbGYsIG5vZGUpID0+IHtcbiAgaWYgKG5vZGUpIHtcbiAgICBjb25zdCBoaXQgPSBub2RlLnZhbHVlXG4gICAgaWYgKHNlbGZbRElTUE9TRV0pXG4gICAgICBzZWxmW0RJU1BPU0VdKGhpdC5rZXksIGhpdC52YWx1ZSlcblxuICAgIHNlbGZbTEVOR1RIXSAtPSBoaXQubGVuZ3RoXG4gICAgc2VsZltDQUNIRV0uZGVsZXRlKGhpdC5rZXkpXG4gICAgc2VsZltMUlVfTElTVF0ucmVtb3ZlTm9kZShub2RlKVxuICB9XG59XG5cbmNsYXNzIEVudHJ5IHtcbiAgY29uc3RydWN0b3IgKGtleSwgdmFsdWUsIGxlbmd0aCwgbm93LCBtYXhBZ2UpIHtcbiAgICB0aGlzLmtleSA9IGtleVxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoXG4gICAgdGhpcy5ub3cgPSBub3dcbiAgICB0aGlzLm1heEFnZSA9IG1heEFnZSB8fCAwXG4gIH1cbn1cblxuY29uc3QgZm9yRWFjaFN0ZXAgPSAoc2VsZiwgZm4sIG5vZGUsIHRoaXNwKSA9PiB7XG4gIGxldCBoaXQgPSBub2RlLnZhbHVlXG4gIGlmIChpc1N0YWxlKHNlbGYsIGhpdCkpIHtcbiAgICBkZWwoc2VsZiwgbm9kZSlcbiAgICBpZiAoIXNlbGZbQUxMT1dfU1RBTEVdKVxuICAgICAgaGl0ID0gdW5kZWZpbmVkXG4gIH1cbiAgaWYgKGhpdClcbiAgICBmbi5jYWxsKHRoaXNwLCBoaXQudmFsdWUsIGhpdC5rZXksIHNlbGYpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gTFJVQ2FjaGVcbiIsIi8vIERldGVybWluZSBpZiB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBhbGwgdGhlIHZlcnNpb25zIHBvc3NpYmxlIGluIHRoZSByYW5nZS5cbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL291dHNpZGUnKVxuY29uc3QgZ3RyID0gKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSA9PiBvdXRzaWRlKHZlcnNpb24sIHJhbmdlLCAnPicsIG9wdGlvbnMpXG5tb2R1bGUuZXhwb3J0cyA9IGd0clxuIiwiY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IGludGVyc2VjdHMgPSAocjEsIHIyLCBvcHRpb25zKSA9PiB7XG4gIHIxID0gbmV3IFJhbmdlKHIxLCBvcHRpb25zKVxuICByMiA9IG5ldyBSYW5nZShyMiwgb3B0aW9ucylcbiAgcmV0dXJuIHIxLmludGVyc2VjdHMocjIsIG9wdGlvbnMpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGludGVyc2VjdHNcbiIsImNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL291dHNpZGUnKVxuLy8gRGV0ZXJtaW5lIGlmIHZlcnNpb24gaXMgbGVzcyB0aGFuIGFsbCB0aGUgdmVyc2lvbnMgcG9zc2libGUgaW4gdGhlIHJhbmdlXG5jb25zdCBsdHIgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsICc8Jywgb3B0aW9ucylcbm1vZHVsZS5leHBvcnRzID0gbHRyXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuXG5jb25zdCBtYXhTYXRpc2Z5aW5nID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBsZXQgbWF4ID0gbnVsbFxuICBsZXQgbWF4U1YgPSBudWxsXG4gIGxldCByYW5nZU9iaiA9IG51bGxcbiAgdHJ5IHtcbiAgICByYW5nZU9iaiA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHZlcnNpb25zLmZvckVhY2goKHYpID0+IHtcbiAgICBpZiAocmFuZ2VPYmoudGVzdCh2KSkge1xuICAgICAgLy8gc2F0aXNmaWVzKHYsIHJhbmdlLCBvcHRpb25zKVxuICAgICAgaWYgKCFtYXggfHwgbWF4U1YuY29tcGFyZSh2KSA9PT0gLTEpIHtcbiAgICAgICAgLy8gY29tcGFyZShtYXgsIHYsIHRydWUpXG4gICAgICAgIG1heCA9IHZcbiAgICAgICAgbWF4U1YgPSBuZXcgU2VtVmVyKG1heCwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBtYXhcbn1cbm1vZHVsZS5leHBvcnRzID0gbWF4U2F0aXNmeWluZ1xuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IG1pblNhdGlzZnlpbmcgPSAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIGxldCBtaW4gPSBudWxsXG4gIGxldCBtaW5TViA9IG51bGxcbiAgbGV0IHJhbmdlT2JqID0gbnVsbFxuICB0cnkge1xuICAgIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaCgodikgPT4ge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7XG4gICAgICAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgICBpZiAoIW1pbiB8fCBtaW5TVi5jb21wYXJlKHYpID09PSAxKSB7XG4gICAgICAgIC8vIGNvbXBhcmUobWluLCB2LCB0cnVlKVxuICAgICAgICBtaW4gPSB2XG4gICAgICAgIG1pblNWID0gbmV3IFNlbVZlcihtaW4sIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWluXG59XG5tb2R1bGUuZXhwb3J0cyA9IG1pblNhdGlzZnlpbmdcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndCcpXG5cbmNvbnN0IG1pblZlcnNpb24gPSAocmFuZ2UsIGxvb3NlKSA9PiB7XG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSlcblxuICBsZXQgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAnKVxuICBpZiAocmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAtMCcpXG4gIGlmIChyYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICBtaW52ZXIgPSBudWxsXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV1cblxuICAgIGxldCBzZXRNaW4gPSBudWxsXG4gICAgY29tcGFyYXRvcnMuZm9yRWFjaCgoY29tcGFyYXRvcikgPT4ge1xuICAgICAgLy8gQ2xvbmUgdG8gYXZvaWQgbWFuaXB1bGF0aW5nIHRoZSBjb21wYXJhdG9yJ3Mgc2VtdmVyIG9iamVjdC5cbiAgICAgIGNvbnN0IGNvbXB2ZXIgPSBuZXcgU2VtVmVyKGNvbXBhcmF0b3Iuc2VtdmVyLnZlcnNpb24pXG4gICAgICBzd2l0Y2ggKGNvbXBhcmF0b3Iub3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgaWYgKGNvbXB2ZXIucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbXB2ZXIucGF0Y2grK1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wdmVyLnByZXJlbGVhc2UucHVzaCgwKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb21wdmVyLnJhdyA9IGNvbXB2ZXIuZm9ybWF0KClcbiAgICAgICAgICAvKiBmYWxsdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICcnOlxuICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgaWYgKCFzZXRNaW4gfHwgZ3QoY29tcHZlciwgc2V0TWluKSkge1xuICAgICAgICAgICAgc2V0TWluID0gY29tcHZlclxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgIC8qIElnbm9yZSBtYXhpbXVtIHZlcnNpb25zICovXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgb3BlcmF0aW9uOiAke2NvbXBhcmF0b3Iub3BlcmF0b3J9YClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChzZXRNaW4gJiYgKCFtaW52ZXIgfHwgZ3QobWludmVyLCBzZXRNaW4pKSkge1xuICAgICAgbWludmVyID0gc2V0TWluXG4gICAgfVxuICB9XG5cbiAgaWYgKG1pbnZlciAmJiByYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSBtaW5WZXJzaW9uXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9jb21wYXJhdG9yJylcbmNvbnN0IHsgQU5ZIH0gPSBDb21wYXJhdG9yXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL3NhdGlzZmllcycpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndCcpXG5jb25zdCBsdCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9sdCcpXG5jb25zdCBsdGUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvbHRlJylcbmNvbnN0IGd0ZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndGUnKVxuXG5jb25zdCBvdXRzaWRlID0gKHZlcnNpb24sIHJhbmdlLCBoaWxvLCBvcHRpb25zKSA9PiB7XG4gIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuXG4gIGxldCBndGZuLCBsdGVmbiwgbHRmbiwgY29tcCwgZWNvbXBcbiAgc3dpdGNoIChoaWxvKSB7XG4gICAgY2FzZSAnPic6XG4gICAgICBndGZuID0gZ3RcbiAgICAgIGx0ZWZuID0gbHRlXG4gICAgICBsdGZuID0gbHRcbiAgICAgIGNvbXAgPSAnPidcbiAgICAgIGVjb21wID0gJz49J1xuICAgICAgYnJlYWtcbiAgICBjYXNlICc8JzpcbiAgICAgIGd0Zm4gPSBsdFxuICAgICAgbHRlZm4gPSBndGVcbiAgICAgIGx0Zm4gPSBndFxuICAgICAgY29tcCA9ICc8J1xuICAgICAgZWNvbXAgPSAnPD0nXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHByb3ZpZGUgYSBoaWxvIHZhbCBvZiBcIjxcIiBvciBcIj5cIicpXG4gIH1cblxuICAvLyBJZiBpdCBzYXRpc2ZpZXMgdGhlIHJhbmdlIGl0IGlzIG5vdCBvdXRzaWRlXG4gIGlmIChzYXRpc2ZpZXModmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBGcm9tIG5vdyBvbiwgdmFyaWFibGUgdGVybXMgYXJlIGFzIGlmIHdlJ3JlIGluIFwiZ3RyXCIgbW9kZS5cbiAgLy8gYnV0IG5vdGUgdGhhdCBldmVyeXRoaW5nIGlzIGZsaXBwZWQgZm9yIHRoZSBcImx0clwiIGZ1bmN0aW9uLlxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV1cblxuICAgIGxldCBoaWdoID0gbnVsbFxuICAgIGxldCBsb3cgPSBudWxsXG5cbiAgICBjb21wYXJhdG9ycy5mb3JFYWNoKChjb21wYXJhdG9yKSA9PiB7XG4gICAgICBpZiAoY29tcGFyYXRvci5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgICBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKVxuICAgICAgfVxuICAgICAgaGlnaCA9IGhpZ2ggfHwgY29tcGFyYXRvclxuICAgICAgbG93ID0gbG93IHx8IGNvbXBhcmF0b3JcbiAgICAgIGlmIChndGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBoaWdoLnNlbXZlciwgb3B0aW9ucykpIHtcbiAgICAgICAgaGlnaCA9IGNvbXBhcmF0b3JcbiAgICAgIH0gZWxzZSBpZiAobHRmbihjb21wYXJhdG9yLnNlbXZlciwgbG93LnNlbXZlciwgb3B0aW9ucykpIHtcbiAgICAgICAgbG93ID0gY29tcGFyYXRvclxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBJZiB0aGUgZWRnZSB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGEgb3BlcmF0b3IgdGhlbiBvdXIgdmVyc2lvblxuICAgIC8vIGlzbid0IG91dHNpZGUgaXRcbiAgICBpZiAoaGlnaC5vcGVyYXRvciA9PT0gY29tcCB8fCBoaWdoLm9wZXJhdG9yID09PSBlY29tcCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGxvd2VzdCB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGFuIG9wZXJhdG9yIGFuZCBvdXIgdmVyc2lvblxuICAgIC8vIGlzIGxlc3MgdGhhbiBpdCB0aGVuIGl0IGlzbid0IGhpZ2hlciB0aGFuIHRoZSByYW5nZVxuICAgIGlmICgoIWxvdy5vcGVyYXRvciB8fCBsb3cub3BlcmF0b3IgPT09IGNvbXApICYmXG4gICAgICAgIGx0ZWZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKGxvdy5vcGVyYXRvciA9PT0gZWNvbXAgJiYgbHRmbih2ZXJzaW9uLCBsb3cuc2VtdmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3V0c2lkZVxuIiwiLy8gZ2l2ZW4gYSBzZXQgb2YgdmVyc2lvbnMgYW5kIGEgcmFuZ2UsIGNyZWF0ZSBhIFwic2ltcGxpZmllZFwiIHJhbmdlXG4vLyB0aGF0IGluY2x1ZGVzIHRoZSBzYW1lIHZlcnNpb25zIHRoYXQgdGhlIG9yaWdpbmFsIHJhbmdlIGRvZXNcbi8vIElmIHRoZSBvcmlnaW5hbCByYW5nZSBpcyBzaG9ydGVyIHRoYW4gdGhlIHNpbXBsaWZpZWQgb25lLCByZXR1cm4gdGhhdC5cbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9zYXRpc2ZpZXMuanMnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jb21wYXJlLmpzJylcbm1vZHVsZS5leHBvcnRzID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBzZXQgPSBbXVxuICBsZXQgZmlyc3QgPSBudWxsXG4gIGxldCBwcmV2ID0gbnVsbFxuICBjb25zdCB2ID0gdmVyc2lvbnMuc29ydCgoYSwgYikgPT4gY29tcGFyZShhLCBiLCBvcHRpb25zKSlcbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHYpIHtcbiAgICBjb25zdCBpbmNsdWRlZCA9IHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucylcbiAgICBpZiAoaW5jbHVkZWQpIHtcbiAgICAgIHByZXYgPSB2ZXJzaW9uXG4gICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgIGZpcnN0ID0gdmVyc2lvblxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBzZXQucHVzaChbZmlyc3QsIHByZXZdKVxuICAgICAgfVxuICAgICAgcHJldiA9IG51bGxcbiAgICAgIGZpcnN0ID0gbnVsbFxuICAgIH1cbiAgfVxuICBpZiAoZmlyc3QpIHtcbiAgICBzZXQucHVzaChbZmlyc3QsIG51bGxdKVxuICB9XG5cbiAgY29uc3QgcmFuZ2VzID0gW11cbiAgZm9yIChjb25zdCBbbWluLCBtYXhdIG9mIHNldCkge1xuICAgIGlmIChtaW4gPT09IG1heCkge1xuICAgICAgcmFuZ2VzLnB1c2gobWluKVxuICAgIH0gZWxzZSBpZiAoIW1heCAmJiBtaW4gPT09IHZbMF0pIHtcbiAgICAgIHJhbmdlcy5wdXNoKCcqJylcbiAgICB9IGVsc2UgaWYgKCFtYXgpIHtcbiAgICAgIHJhbmdlcy5wdXNoKGA+PSR7bWlufWApXG4gICAgfSBlbHNlIGlmIChtaW4gPT09IHZbMF0pIHtcbiAgICAgIHJhbmdlcy5wdXNoKGA8PSR7bWF4fWApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlcy5wdXNoKGAke21pbn0gLSAke21heH1gKVxuICAgIH1cbiAgfVxuICBjb25zdCBzaW1wbGlmaWVkID0gcmFuZ2VzLmpvaW4oJyB8fCAnKVxuICBjb25zdCBvcmlnaW5hbCA9IHR5cGVvZiByYW5nZS5yYXcgPT09ICdzdHJpbmcnID8gcmFuZ2UucmF3IDogU3RyaW5nKHJhbmdlKVxuICByZXR1cm4gc2ltcGxpZmllZC5sZW5ndGggPCBvcmlnaW5hbC5sZW5ndGggPyBzaW1wbGlmaWVkIDogcmFuZ2Vcbn1cbiIsImNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZS5qcycpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9jb21wYXJhdG9yLmpzJylcbmNvbnN0IHsgQU5ZIH0gPSBDb21wYXJhdG9yXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzLmpzJylcbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvY29tcGFyZS5qcycpXG5cbi8vIENvbXBsZXggcmFuZ2UgYHIxIHx8IHIyIHx8IC4uLmAgaXMgYSBzdWJzZXQgb2YgYFIxIHx8IFIyIHx8IC4uLmAgaWZmOlxuLy8gLSBFdmVyeSBzaW1wbGUgcmFuZ2UgYHIxLCByMiwgLi4uYCBpcyBhIG51bGwgc2V0LCBPUlxuLy8gLSBFdmVyeSBzaW1wbGUgcmFuZ2UgYHIxLCByMiwgLi4uYCB3aGljaCBpcyBub3QgYSBudWxsIHNldCBpcyBhIHN1YnNldCBvZlxuLy8gICBzb21lIGBSMSwgUjIsIC4uLmBcbi8vXG4vLyBTaW1wbGUgcmFuZ2UgYGMxIGMyIC4uLmAgaXMgYSBzdWJzZXQgb2Ygc2ltcGxlIHJhbmdlIGBDMSBDMiAuLi5gIGlmZjpcbi8vIC0gSWYgYyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvclxuLy8gICAtIElmIEMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3IsIHJldHVybiB0cnVlXG4vLyAgIC0gRWxzZSBpZiBpbiBwcmVyZWxlYXNlIG1vZGUsIHJldHVybiBmYWxzZVxuLy8gICAtIGVsc2UgcmVwbGFjZSBjIHdpdGggYFs+PTAuMC4wXWBcbi8vIC0gSWYgQyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvclxuLy8gICAtIGlmIGluIHByZXJlbGVhc2UgbW9kZSwgcmV0dXJuIHRydWVcbi8vICAgLSBlbHNlIHJlcGxhY2UgQyB3aXRoIGBbPj0wLjAuMF1gXG4vLyAtIExldCBFUSBiZSB0aGUgc2V0IG9mID0gY29tcGFyYXRvcnMgaW4gY1xuLy8gLSBJZiBFUSBpcyBtb3JlIHRoYW4gb25lLCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAtIExldCBHVCBiZSB0aGUgaGlnaGVzdCA+IG9yID49IGNvbXBhcmF0b3IgaW4gY1xuLy8gLSBMZXQgTFQgYmUgdGhlIGxvd2VzdCA8IG9yIDw9IGNvbXBhcmF0b3IgaW4gY1xuLy8gLSBJZiBHVCBhbmQgTFQsIGFuZCBHVC5zZW12ZXIgPiBMVC5zZW12ZXIsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vIC0gSWYgYW55IEMgaXMgYSA9IHJhbmdlLCBhbmQgR1Qgb3IgTFQgYXJlIHNldCwgcmV0dXJuIGZhbHNlXG4vLyAtIElmIEVRXG4vLyAgIC0gSWYgR1QsIGFuZCBFUSBkb2VzIG5vdCBzYXRpc2Z5IEdULCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAgIC0gSWYgTFQsIGFuZCBFUSBkb2VzIG5vdCBzYXRpc2Z5IExULCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAgIC0gSWYgRVEgc2F0aXNmaWVzIGV2ZXJ5IEMsIHJldHVybiB0cnVlXG4vLyAgIC0gRWxzZSByZXR1cm4gZmFsc2Vcbi8vIC0gSWYgR1Rcbi8vICAgLSBJZiBHVC5zZW12ZXIgaXMgbG93ZXIgdGhhbiBhbnkgPiBvciA+PSBjb21wIGluIEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdUIGlzID49LCBhbmQgR1Quc2VtdmVyIGRvZXMgbm90IHNhdGlzZnkgZXZlcnkgQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgR1Quc2VtdmVyIGhhcyBhIHByZXJlbGVhc2UsIGFuZCBub3QgaW4gcHJlcmVsZWFzZSBtb2RlXG4vLyAgICAgLSBJZiBubyBDIGhhcyBhIHByZXJlbGVhc2UgYW5kIHRoZSBHVC5zZW12ZXIgdHVwbGUsIHJldHVybiBmYWxzZVxuLy8gLSBJZiBMVFxuLy8gICAtIElmIExULnNlbXZlciBpcyBncmVhdGVyIHRoYW4gYW55IDwgb3IgPD0gY29tcCBpbiBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBMVCBpcyA8PSwgYW5kIExULnNlbXZlciBkb2VzIG5vdCBzYXRpc2Z5IGV2ZXJ5IEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdULnNlbXZlciBoYXMgYSBwcmVyZWxlYXNlLCBhbmQgbm90IGluIHByZXJlbGVhc2UgbW9kZVxuLy8gICAgIC0gSWYgbm8gQyBoYXMgYSBwcmVyZWxlYXNlIGFuZCB0aGUgTFQuc2VtdmVyIHR1cGxlLCByZXR1cm4gZmFsc2Vcbi8vIC0gRWxzZSByZXR1cm4gdHJ1ZVxuXG5jb25zdCBzdWJzZXQgPSAoc3ViLCBkb20sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoc3ViID09PSBkb20pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgc3ViID0gbmV3IFJhbmdlKHN1Yiwgb3B0aW9ucylcbiAgZG9tID0gbmV3IFJhbmdlKGRvbSwgb3B0aW9ucylcbiAgbGV0IHNhd05vbk51bGwgPSBmYWxzZVxuXG4gIE9VVEVSOiBmb3IgKGNvbnN0IHNpbXBsZVN1YiBvZiBzdWIuc2V0KSB7XG4gICAgZm9yIChjb25zdCBzaW1wbGVEb20gb2YgZG9tLnNldCkge1xuICAgICAgY29uc3QgaXNTdWIgPSBzaW1wbGVTdWJzZXQoc2ltcGxlU3ViLCBzaW1wbGVEb20sIG9wdGlvbnMpXG4gICAgICBzYXdOb25OdWxsID0gc2F3Tm9uTnVsbCB8fCBpc1N1YiAhPT0gbnVsbFxuICAgICAgaWYgKGlzU3ViKSB7XG4gICAgICAgIGNvbnRpbnVlIE9VVEVSXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHRoZSBudWxsIHNldCBpcyBhIHN1YnNldCBvZiBldmVyeXRoaW5nLCBidXQgbnVsbCBzaW1wbGUgcmFuZ2VzIGluXG4gICAgLy8gYSBjb21wbGV4IHJhbmdlIHNob3VsZCBiZSBpZ25vcmVkLiAgc28gaWYgd2Ugc2F3IGEgbm9uLW51bGwgcmFuZ2UsXG4gICAgLy8gdGhlbiB3ZSBrbm93IHRoaXMgaXNuJ3QgYSBzdWJzZXQsIGJ1dCBpZiBFVkVSWSBzaW1wbGUgcmFuZ2Ugd2FzIG51bGwsXG4gICAgLy8gdGhlbiBpdCBpcyBhIHN1YnNldC5cbiAgICBpZiAoc2F3Tm9uTnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmNvbnN0IG1pbmltdW1WZXJzaW9uV2l0aFByZVJlbGVhc2UgPSBbbmV3IENvbXBhcmF0b3IoJz49MC4wLjAtMCcpXVxuY29uc3QgbWluaW11bVZlcnNpb24gPSBbbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKV1cblxuY29uc3Qgc2ltcGxlU3Vic2V0ID0gKHN1YiwgZG9tLCBvcHRpb25zKSA9PiB7XG4gIGlmIChzdWIgPT09IGRvbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoc3ViLmxlbmd0aCA9PT0gMSAmJiBzdWJbMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICBpZiAoZG9tLmxlbmd0aCA9PT0gMSAmJiBkb21bMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICBzdWIgPSBtaW5pbXVtVmVyc2lvbldpdGhQcmVSZWxlYXNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHN1YiA9IG1pbmltdW1WZXJzaW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGRvbS5sZW5ndGggPT09IDEgJiYgZG9tWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvbSA9IG1pbmltdW1WZXJzaW9uXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXFTZXQgPSBuZXcgU2V0KClcbiAgbGV0IGd0LCBsdFxuICBmb3IgKGNvbnN0IGMgb2Ygc3ViKSB7XG4gICAgaWYgKGMub3BlcmF0b3IgPT09ICc+JyB8fCBjLm9wZXJhdG9yID09PSAnPj0nKSB7XG4gICAgICBndCA9IGhpZ2hlckdUKGd0LCBjLCBvcHRpb25zKVxuICAgIH0gZWxzZSBpZiAoYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PScpIHtcbiAgICAgIGx0ID0gbG93ZXJMVChsdCwgYywgb3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgZXFTZXQuYWRkKGMuc2VtdmVyKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlcVNldC5zaXplID4gMSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBsZXQgZ3RsdENvbXBcbiAgaWYgKGd0ICYmIGx0KSB7XG4gICAgZ3RsdENvbXAgPSBjb21wYXJlKGd0LnNlbXZlciwgbHQuc2VtdmVyLCBvcHRpb25zKVxuICAgIGlmIChndGx0Q29tcCA+IDApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfSBlbHNlIGlmIChndGx0Q29tcCA9PT0gMCAmJiAoZ3Qub3BlcmF0b3IgIT09ICc+PScgfHwgbHQub3BlcmF0b3IgIT09ICc8PScpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIHdpbGwgaXRlcmF0ZSBvbmUgb3IgemVybyB0aW1lc1xuICBmb3IgKGNvbnN0IGVxIG9mIGVxU2V0KSB7XG4gICAgaWYgKGd0ICYmICFzYXRpc2ZpZXMoZXEsIFN0cmluZyhndCksIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGlmIChsdCAmJiAhc2F0aXNmaWVzKGVxLCBTdHJpbmcobHQpLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgZG9tKSB7XG4gICAgICBpZiAoIXNhdGlzZmllcyhlcSwgU3RyaW5nKGMpLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgbGV0IGhpZ2hlciwgbG93ZXJcbiAgbGV0IGhhc0RvbUxULCBoYXNEb21HVFxuICAvLyBpZiB0aGUgc3Vic2V0IGhhcyBhIHByZXJlbGVhc2UsIHdlIG5lZWQgYSBjb21wYXJhdG9yIGluIHRoZSBzdXBlcnNldFxuICAvLyB3aXRoIHRoZSBzYW1lIHR1cGxlIGFuZCBhIHByZXJlbGVhc2UsIG9yIGl0J3Mgbm90IGEgc3Vic2V0XG4gIGxldCBuZWVkRG9tTFRQcmUgPSBsdCAmJlxuICAgICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgbHQuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID8gbHQuc2VtdmVyIDogZmFsc2VcbiAgbGV0IG5lZWREb21HVFByZSA9IGd0ICYmXG4gICAgIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICBndC5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPyBndC5zZW12ZXIgOiBmYWxzZVxuICAvLyBleGNlcHRpb246IDwxLjIuMy0wIGlzIHRoZSBzYW1lIGFzIDwxLjIuM1xuICBpZiAobmVlZERvbUxUUHJlICYmIG5lZWREb21MVFByZS5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgbHQub3BlcmF0b3IgPT09ICc8JyAmJiBuZWVkRG9tTFRQcmUucHJlcmVsZWFzZVswXSA9PT0gMCkge1xuICAgIG5lZWREb21MVFByZSA9IGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IGMgb2YgZG9tKSB7XG4gICAgaGFzRG9tR1QgPSBoYXNEb21HVCB8fCBjLm9wZXJhdG9yID09PSAnPicgfHwgYy5vcGVyYXRvciA9PT0gJz49J1xuICAgIGhhc0RvbUxUID0gaGFzRG9tTFQgfHwgYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PSdcbiAgICBpZiAoZ3QpIHtcbiAgICAgIGlmIChuZWVkRG9tR1RQcmUpIHtcbiAgICAgICAgaWYgKGMuc2VtdmVyLnByZXJlbGVhc2UgJiYgYy5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1ham9yID09PSBuZWVkRG9tR1RQcmUubWFqb3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1pbm9yID09PSBuZWVkRG9tR1RQcmUubWlub3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLnBhdGNoID09PSBuZWVkRG9tR1RQcmUucGF0Y2gpIHtcbiAgICAgICAgICBuZWVkRG9tR1RQcmUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYy5vcGVyYXRvciA9PT0gJz4nIHx8IGMub3BlcmF0b3IgPT09ICc+PScpIHtcbiAgICAgICAgaGlnaGVyID0gaGlnaGVyR1QoZ3QsIGMsIG9wdGlvbnMpXG4gICAgICAgIGlmIChoaWdoZXIgPT09IGMgJiYgaGlnaGVyICE9PSBndCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0Lm9wZXJhdG9yID09PSAnPj0nICYmICFzYXRpc2ZpZXMoZ3Quc2VtdmVyLCBTdHJpbmcoYyksIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobHQpIHtcbiAgICAgIGlmIChuZWVkRG9tTFRQcmUpIHtcbiAgICAgICAgaWYgKGMuc2VtdmVyLnByZXJlbGVhc2UgJiYgYy5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1ham9yID09PSBuZWVkRG9tTFRQcmUubWFqb3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1pbm9yID09PSBuZWVkRG9tTFRQcmUubWlub3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLnBhdGNoID09PSBuZWVkRG9tTFRQcmUucGF0Y2gpIHtcbiAgICAgICAgICBuZWVkRG9tTFRQcmUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PScpIHtcbiAgICAgICAgbG93ZXIgPSBsb3dlckxUKGx0LCBjLCBvcHRpb25zKVxuICAgICAgICBpZiAobG93ZXIgPT09IGMgJiYgbG93ZXIgIT09IGx0KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobHQub3BlcmF0b3IgPT09ICc8PScgJiYgIXNhdGlzZmllcyhsdC5zZW12ZXIsIFN0cmluZyhjKSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYy5vcGVyYXRvciAmJiAobHQgfHwgZ3QpICYmIGd0bHRDb21wICE9PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGVyZSB3YXMgYSA8IG9yID4sIGFuZCBub3RoaW5nIGluIHRoZSBkb20sIHRoZW4gbXVzdCBiZSBmYWxzZVxuICAvLyBVTkxFU1MgaXQgd2FzIGxpbWl0ZWQgYnkgYW5vdGhlciByYW5nZSBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAvLyBFZywgPjEuMC4wIDwxLjAuMSBpcyBzdGlsbCBhIHN1YnNldCBvZiA8Mi4wLjBcbiAgaWYgKGd0ICYmIGhhc0RvbUxUICYmICFsdCAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKGx0ICYmIGhhc0RvbUdUICYmICFndCAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gd2UgbmVlZGVkIGEgcHJlcmVsZWFzZSByYW5nZSBpbiBhIHNwZWNpZmljIHR1cGxlLCBidXQgZGlkbid0IGdldCBvbmVcbiAgLy8gdGhlbiB0aGlzIGlzbid0IGEgc3Vic2V0LiAgZWcgPj0xLjIuMy1wcmUgaXMgbm90IGEgc3Vic2V0IG9mID49MS4wLjAsXG4gIC8vIGJlY2F1c2UgaXQgaW5jbHVkZXMgcHJlcmVsZWFzZXMgaW4gdGhlIDEuMi4zIHR1cGxlXG4gIGlmIChuZWVkRG9tR1RQcmUgfHwgbmVlZERvbUxUUHJlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vLyA+PTEuMi4zIGlzIGxvd2VyIHRoYW4gPjEuMi4zXG5jb25zdCBoaWdoZXJHVCA9IChhLCBiLCBvcHRpb25zKSA9PiB7XG4gIGlmICghYSkge1xuICAgIHJldHVybiBiXG4gIH1cbiAgY29uc3QgY29tcCA9IGNvbXBhcmUoYS5zZW12ZXIsIGIuc2VtdmVyLCBvcHRpb25zKVxuICByZXR1cm4gY29tcCA+IDAgPyBhXG4gICAgOiBjb21wIDwgMCA/IGJcbiAgICA6IGIub3BlcmF0b3IgPT09ICc+JyAmJiBhLm9wZXJhdG9yID09PSAnPj0nID8gYlxuICAgIDogYVxufVxuXG4vLyA8PTEuMi4zIGlzIGhpZ2hlciB0aGFuIDwxLjIuM1xuY29uc3QgbG93ZXJMVCA9IChhLCBiLCBvcHRpb25zKSA9PiB7XG4gIGlmICghYSkge1xuICAgIHJldHVybiBiXG4gIH1cbiAgY29uc3QgY29tcCA9IGNvbXBhcmUoYS5zZW12ZXIsIGIuc2VtdmVyLCBvcHRpb25zKVxuICByZXR1cm4gY29tcCA8IDAgPyBhXG4gICAgOiBjb21wID4gMCA/IGJcbiAgICA6IGIub3BlcmF0b3IgPT09ICc8JyAmJiBhLm9wZXJhdG9yID09PSAnPD0nID8gYlxuICAgIDogYVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN1YnNldFxuIiwiY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcblxuLy8gTW9zdGx5IGp1c3QgZm9yIHRlc3RpbmcgYW5kIGxlZ2FjeSBBUEkgcmVhc29uc1xuY29uc3QgdG9Db21wYXJhdG9ycyA9IChyYW5nZSwgb3B0aW9ucykgPT5cbiAgbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKS5zZXRcbiAgICAubWFwKGNvbXAgPT4gY29tcC5tYXAoYyA9PiBjLnZhbHVlKS5qb2luKCcgJykudHJpbSgpLnNwbGl0KCcgJykpXG5cbm1vZHVsZS5leHBvcnRzID0gdG9Db21wYXJhdG9yc1xuIiwiY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHZhbGlkUmFuZ2UgPSAocmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBSZXR1cm4gJyonIGluc3RlYWQgb2YgJycgc28gdGhhdCB0cnV0aGluZXNzIHdvcmtzLlxuICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBpZiBpdCdzIGludmFsaWQgYW55d2F5XG4gICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucykucmFuZ2UgfHwgJyonXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB2YWxpZFJhbmdlXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbi8vIFRoZSBkZWZhdWx0IEJ1ZmZlciBzaXplIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQuXG5jb25zdCBERUZBVUxUX1NNQVJUQlVGRkVSX1NJWkUgPSA0MDk2O1xuLy8gVGhlIGRlZmF1bHQgc3RyaW5nIGVuY29kaW5nIHRvIHVzZSBmb3IgcmVhZGluZy93cml0aW5nIHN0cmluZ3MuXG5jb25zdCBERUZBVUxUX1NNQVJUQlVGRkVSX0VOQ09ESU5HID0gJ3V0ZjgnO1xuY2xhc3MgU21hcnRCdWZmZXIge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyB7IFNtYXJ0QnVmZmVyT3B0aW9ucyB9IFRoZSBTbWFydEJ1ZmZlck9wdGlvbnMgdG8gYXBwbHkgdG8gdGhpcyBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBERUZBVUxUX1NNQVJUQlVGRkVSX0VOQ09ESU5HO1xuICAgICAgICB0aGlzLl93cml0ZU9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMuX3JlYWRPZmZzZXQgPSAwO1xuICAgICAgICBpZiAoU21hcnRCdWZmZXIuaXNTbWFydEJ1ZmZlck9wdGlvbnMob3B0aW9ucykpIHtcbiAgICAgICAgICAgIC8vIENoZWNrcyBmb3IgZW5jb2RpbmdcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgICAgICAgICAgICAgdXRpbHNfMS5jaGVja0VuY29kaW5nKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrcyBmb3IgaW5pdGlhbCBzaXplIGxlbmd0aFxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmICh1dGlsc18xLmlzRmluaXRlSW50ZWdlcihvcHRpb25zLnNpemUpICYmIG9wdGlvbnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnVmZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShvcHRpb25zLnNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHV0aWxzXzEuRVJST1JTLklOVkFMSURfU01BUlRCVUZGRVJfU0laRSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBpbml0aWFsIEJ1ZmZlclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5idWZmKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvcHRpb25zLmJ1ZmYpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2J1ZmYgPSBvcHRpb25zLmJ1ZmY7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gb3B0aW9ucy5idWZmLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih1dGlsc18xLkVSUk9SUy5JTlZBTElEX1NNQVJUQlVGRkVSX0JVRkZFUik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYnVmZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShERUZBVUxUX1NNQVJUQlVGRkVSX1NJWkUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgc29tZXRoaW5nIHdhcyBwYXNzZWQgYnV0IGl0J3Mgbm90IGEgU21hcnRCdWZmZXJPcHRpb25zIG9iamVjdFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih1dGlsc18xLkVSUk9SUy5JTlZBTElEX1NNQVJUQlVGRkVSX09CSkVDVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgZGVmYXVsdCB0byBzYW5lIG9wdGlvbnNcbiAgICAgICAgICAgIHRoaXMuX2J1ZmYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoREVGQVVMVF9TTUFSVEJVRkZFUl9TSVpFKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNtYXJ0QnVmZmVyIGluc3RhbmNlIHdpdGggdGhlIHByb3ZpZGVkIGludGVybmFsIEJ1ZmZlciBzaXplIGFuZCBvcHRpb25hbCBlbmNvZGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaXplIHsgTnVtYmVyIH0gVGhlIHNpemUgb2YgdGhlIGludGVybmFsIEJ1ZmZlci5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvciBzdHJpbmdzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7IFNtYXJ0QnVmZmVyIH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVNpemUoc2l6ZSwgZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKHtcbiAgICAgICAgICAgIHNpemU6IHNpemUsXG4gICAgICAgICAgICBlbmNvZGluZzogZW5jb2RpbmdcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU21hcnRCdWZmZXIgaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgQnVmZmVyIGFuZCBvcHRpb25hbCBlbmNvZGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBidWZmZXIgeyBCdWZmZXIgfSBUaGUgQnVmZmVyIHRvIHVzZSBhcyB0aGUgaW50ZXJuYWwgQnVmZmVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgU21hcnRCdWZmZXIgfVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tQnVmZmVyKGJ1ZmYsIGVuY29kaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgdGhpcyh7XG4gICAgICAgICAgICBidWZmOiBidWZmLFxuICAgICAgICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNtYXJ0QnVmZmVyIGluc3RhbmNlIHdpdGggdGhlIHByb3ZpZGVkIFNtYXJ0QnVmZmVyT3B0aW9ucyBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgeyBTbWFydEJ1ZmZlck9wdGlvbnMgfSBUaGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUeXBlIGNoZWNraW5nIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyBpZiBhbiBvYmplY3QgaXMgYSBTbWFydEJ1ZmZlck9wdGlvbnMgb2JqZWN0LlxuICAgICAqL1xuICAgIHN0YXRpYyBpc1NtYXJ0QnVmZmVyT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhc3RPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgcmV0dXJuIChjYXN0T3B0aW9ucyAmJlxuICAgICAgICAgICAgKGNhc3RPcHRpb25zLmVuY29kaW5nICE9PSB1bmRlZmluZWQgfHwgY2FzdE9wdGlvbnMuc2l6ZSAhPT0gdW5kZWZpbmVkIHx8IGNhc3RPcHRpb25zLmJ1ZmYgIT09IHVuZGVmaW5lZCkpO1xuICAgIH1cbiAgICAvLyBTaWduZWQgaW50ZWdlcnNcbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBJbnQ4IHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkSW50OChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4LCAxLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBJbnQxNkJFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkSW50MTZCRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFLCAyLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBJbnQxNkxFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkSW50MTZMRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFLCAyLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBJbnQzMkJFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkSW50MzJCRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFLCA0LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBJbnQzMkxFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkSW50MzJMRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFLCA0LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIEJpZ0ludDY0QkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBCaWdJbnQgfVxuICAgICAqL1xuICAgIHJlYWRCaWdJbnQ2NEJFKG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3JlYWRCaWdJbnQ2NEJFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnSW50NjRCRSwgOCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBCaWdJbnQ2NExFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgQmlnSW50IH1cbiAgICAgKi9cbiAgICByZWFkQmlnSW50NjRMRShvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCdyZWFkQmlnSW50NjRMRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ0ludDY0TEUsIDgsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBJbnQ4IHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlSW50OCh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDgsIDEsIHZhbHVlLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBJbnQ4IHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRJbnQ4KHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4LCAxLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIEludDE2QkUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVJbnQxNkJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUsIDIsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIEludDE2QkUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEludDE2QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUsIDIsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYW4gSW50MTZMRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUludDE2TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSwgMiwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gSW50MTZMRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0SW50MTZMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSwgMiwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBJbnQzMkJFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlSW50MzJCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBJbnQzMkJFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRJbnQzMkJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIEludDMyTEUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVJbnQzMkxFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIEludDMyTEUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEludDMyTEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBCaWdJbnQ2NEJFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgQmlnSW50IH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlQmlnSW50NjRCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygnd3JpdGVCaWdJbnQ2NEJFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NEJFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIEJpZ0ludDY0QkUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IEJpZ0ludCB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEJpZ0ludDY0QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3dyaXRlQmlnSW50NjRCRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBCaWdJbnQ2NExFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgQmlnSW50IH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlQmlnSW50NjRMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygnd3JpdGVCaWdJbnQ2NExFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NExFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIEludDY0TEUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IEJpZ0ludCB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEJpZ0ludDY0TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3dyaXRlQmlnSW50NjRMRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0TEUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvLyBVbnNpZ25lZCBJbnRlZ2Vyc1xuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIFVJbnQ4IHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkVUludDgob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDgsIDEsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIFVJbnQxNkJFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkVUludDE2QkUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUsIDIsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIFVJbnQxNkxFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkVUludDE2TEUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUsIDIsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIFVJbnQzMkJFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkVUludDMyQkUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUsIDQsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIFVJbnQzMkxFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkVUludDMyTEUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUsIDQsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgQmlnVUludDY0QkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBCaWdJbnQgfVxuICAgICAqL1xuICAgIHJlYWRCaWdVSW50NjRCRShvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCdyZWFkQmlnVUludDY0QkUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRCaWdVSW50NjRCRSwgOCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBCaWdVSW50NjRMRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IEJpZ0ludCB9XG4gICAgICovXG4gICAgcmVhZEJpZ1VJbnQ2NExFKG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3JlYWRCaWdVSW50NjRMRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NExFLCA4LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYW4gVUludDggdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVVSW50OCh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCwgMSwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gVUludDggdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydFVJbnQ4KHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCwgMSwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBVSW50MTZCRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZVVJbnQxNkJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFLCAyLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBVSW50MTZCRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0VUludDE2QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFLCAyLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIFVJbnQxNkxFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlVUludDE2TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUsIDIsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIFVJbnQxNkxFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRVSW50MTZMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUsIDIsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYW4gVUludDMyQkUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVVSW50MzJCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSwgNCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gVUludDMyQkUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydFVJbnQzMkJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSwgNCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBVSW50MzJMRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZVVJbnQzMkxFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBVSW50MzJMRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0VUludDMyTEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgQmlnVUludDY0QkUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVCaWdVSW50NjRCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygnd3JpdGVCaWdVSW50NjRCRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlQmlnVUludDY0QkUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgQmlnVUludDY0QkUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEJpZ1VJbnQ2NEJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCd3cml0ZUJpZ1VJbnQ2NEJFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlQmlnVUludDY0QkUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBCaWdVSW50NjRMRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUJpZ1VJbnQ2NExFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCd3cml0ZUJpZ1VJbnQ2NExFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRMRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBCaWdVSW50NjRMRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0QmlnVUludDY0TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3dyaXRlQmlnVUludDY0TEUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRMRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8vIEZsb2F0aW5nIFBvaW50XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gRmxvYXRCRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IE51bWJlciB9XG4gICAgICovXG4gICAgcmVhZEZsb2F0QkUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSwgNCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gRmxvYXRMRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IE51bWJlciB9XG4gICAgICovXG4gICAgcmVhZEZsb2F0TEUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSwgNCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgRmxvYXRCRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUZsb2F0QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSwgNCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBGbG9hdEJFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRGbG9hdEJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgRmxvYXRMRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUZsb2F0TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSwgNCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBGbG9hdExFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRGbG9hdExFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gRG91YmxlIEZsb2F0aW5nIFBvaW50XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gRG91YmxFQkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWREb3VibGVCRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSwgOCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gRG91YmxlTEUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWREb3VibGVMRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSwgOCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgRG91YmxlQkUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVEb3VibGVCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBEb3VibGVCRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0RG91YmxlQkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgRG91YmxlTEUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVEb3VibGVMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBEb3VibGVMRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0RG91YmxlTEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gU3RyaW5nc1xuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgU3RyaW5nIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhcmcxIHsgTnVtYmVyIHwgU3RyaW5nIH0gVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGFzIGEgU3RyaW5nLCBvciB0aGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvclxuICAgICAqICAgICAgICAgICAgIHRoZSBzdHJpbmcgKERlZmF1bHRzIHRvIGluc3RhbmNlIGxldmVsIGVuY29kaW5nKS5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvciB0aGUgc3RyaW5nIChEZWZhdWx0cyB0byBpbnN0YW5jZSBsZXZlbCBlbmNvZGluZykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgU3RyaW5nIH1cbiAgICAgKi9cbiAgICByZWFkU3RyaW5nKGFyZzEsIGVuY29kaW5nKSB7XG4gICAgICAgIGxldCBsZW5ndGhWYWw7XG4gICAgICAgIC8vIExlbmd0aCBwcm92aWRlZFxuICAgICAgICBpZiAodHlwZW9mIGFyZzEgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB1dGlsc18xLmNoZWNrTGVuZ3RoVmFsdWUoYXJnMSk7XG4gICAgICAgICAgICBsZW5ndGhWYWwgPSBNYXRoLm1pbihhcmcxLCB0aGlzLmxlbmd0aCAtIHRoaXMuX3JlYWRPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW5jb2RpbmcgPSBhcmcxO1xuICAgICAgICAgICAgbGVuZ3RoVmFsID0gdGhpcy5sZW5ndGggLSB0aGlzLl9yZWFkT2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGVuY29kaW5nXG4gICAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB1dGlsc18xLmNoZWNrRW5jb2RpbmcoZW5jb2RpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fYnVmZi5zbGljZSh0aGlzLl9yZWFkT2Zmc2V0LCB0aGlzLl9yZWFkT2Zmc2V0ICsgbGVuZ3RoVmFsKS50b1N0cmluZyhlbmNvZGluZyB8fCB0aGlzLl9lbmNvZGluZyk7XG4gICAgICAgIHRoaXMuX3JlYWRPZmZzZXQgKz0gbGVuZ3RoVmFsO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBTdHJpbmdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IFN0cmluZyB9IFRoZSBTdHJpbmcgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgc3RyaW5nIGF0LlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHdyaXRpbmcgc3RyaW5ncyAoZGVmYXVsdHMgdG8gaW5zdGFuY2UgZW5jb2RpbmcpLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0U3RyaW5nKHZhbHVlLCBvZmZzZXQsIGVuY29kaW5nKSB7XG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlU3RyaW5nKHZhbHVlLCB0cnVlLCBvZmZzZXQsIGVuY29kaW5nKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgU3RyaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBTdHJpbmcgfSBUaGUgU3RyaW5nIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBhcmcyIHsgTnVtYmVyIHwgU3RyaW5nIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgc3RyaW5nIGF0LCBvciB0aGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlLlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHdyaXRpbmcgc3RyaW5ncyAoZGVmYXVsdHMgdG8gaW5zdGFuY2UgZW5jb2RpbmcpLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVTdHJpbmcodmFsdWUsIGFyZzIsIGVuY29kaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVTdHJpbmcodmFsdWUsIGZhbHNlLCBhcmcyLCBlbmNvZGluZyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgbnVsbC10ZXJtaW5hdGVkIFN0cmluZyBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvciB0aGUgc3RyaW5nIChEZWZhdWx0cyB0byBpbnN0YW5jZSBsZXZlbCBlbmNvZGluZykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgU3RyaW5nIH1cbiAgICAgKi9cbiAgICByZWFkU3RyaW5nTlQoZW5jb2RpbmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tFbmNvZGluZyhlbmNvZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IG51bGwgY2hhcmFjdGVyIHBvc2l0aW9uIHRvIHRoZSBlbmQgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICAgIGxldCBudWxsUG9zID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIC8vIEZpbmQgbmV4dCBudWxsIGNoYXJhY3RlciAoaWYgb25lIGlzIG5vdCBmb3VuZCwgZGVmYXVsdCBmcm9tIGFib3ZlIGlzIHVzZWQpXG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9yZWFkT2Zmc2V0OyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2J1ZmZbaV0gPT09IDB4MDApIHtcbiAgICAgICAgICAgICAgICBudWxsUG9zID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBSZWFkIHN0cmluZyB2YWx1ZVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2J1ZmYuc2xpY2UodGhpcy5fcmVhZE9mZnNldCwgbnVsbFBvcyk7XG4gICAgICAgIC8vIEluY3JlbWVudCBpbnRlcm5hbCBCdWZmZXIgcmVhZCBvZmZzZXRcbiAgICAgICAgdGhpcy5fcmVhZE9mZnNldCA9IG51bGxQb3MgKyAxO1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoZW5jb2RpbmcgfHwgdGhpcy5fZW5jb2RpbmcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgbnVsbC10ZXJtaW5hdGVkIFN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IFN0cmluZyB9IFRoZSBTdHJpbmcgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIGFyZzIgeyBOdW1iZXIgfCBTdHJpbmcgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBzdHJpbmcgdG8sIG9yIHRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIHsgU3RyaW5nIH0gVGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZSBmb3Igd3JpdGluZyBzdHJpbmdzIChkZWZhdWx0cyB0byBpbnN0YW5jZSBlbmNvZGluZykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRTdHJpbmdOVCh2YWx1ZSwgb2Zmc2V0LCBlbmNvZGluZykge1xuICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgLy8gV3JpdGUgVmFsdWVzXG4gICAgICAgIHRoaXMuaW5zZXJ0U3RyaW5nKHZhbHVlLCBvZmZzZXQsIGVuY29kaW5nKTtcbiAgICAgICAgdGhpcy5pbnNlcnRVSW50OCgweDAwLCBvZmZzZXQgKyB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgbnVsbC10ZXJtaW5hdGVkIFN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IFN0cmluZyB9IFRoZSBTdHJpbmcgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIGFyZzIgeyBOdW1iZXIgfCBTdHJpbmcgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBzdHJpbmcgdG8sIG9yIHRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIHsgU3RyaW5nIH0gVGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZSBmb3Igd3JpdGluZyBzdHJpbmdzIChkZWZhdWx0cyB0byBpbnN0YW5jZSBlbmNvZGluZykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZVN0cmluZ05UKHZhbHVlLCBhcmcyLCBlbmNvZGluZykge1xuICAgICAgICAvLyBXcml0ZSBWYWx1ZXNcbiAgICAgICAgdGhpcy53cml0ZVN0cmluZyh2YWx1ZSwgYXJnMiwgZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLndyaXRlVUludDgoMHgwMCwgdHlwZW9mIGFyZzIgPT09ICdudW1iZXInID8gYXJnMiArIHZhbHVlLmxlbmd0aCA6IHRoaXMud3JpdGVPZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLy8gQnVmZmVyc1xuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgQnVmZmVyIGZyb20gdGhlIGludGVybmFsIHJlYWQgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIHsgTnVtYmVyIH0gVGhlIGxlbmd0aCBvZiBkYXRhIHRvIHJlYWQgYXMgYSBCdWZmZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgQnVmZmVyIH1cbiAgICAgKi9cbiAgICByZWFkQnVmZmVyKGxlbmd0aCkge1xuICAgICAgICBpZiAodHlwZW9mIGxlbmd0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tMZW5ndGhWYWx1ZShsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlbmd0aFZhbCA9IHR5cGVvZiBsZW5ndGggPT09ICdudW1iZXInID8gbGVuZ3RoIDogdGhpcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gTWF0aC5taW4odGhpcy5sZW5ndGgsIHRoaXMuX3JlYWRPZmZzZXQgKyBsZW5ndGhWYWwpO1xuICAgICAgICAvLyBSZWFkIGJ1ZmZlciB2YWx1ZVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2J1ZmYuc2xpY2UodGhpcy5fcmVhZE9mZnNldCwgZW5kUG9pbnQpO1xuICAgICAgICAvLyBJbmNyZW1lbnQgaW50ZXJuYWwgQnVmZmVyIHJlYWQgb2Zmc2V0XG4gICAgICAgIHRoaXMuX3JlYWRPZmZzZXQgPSBlbmRQb2ludDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBCdWZmZXIgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCdWZmZXIgfSBUaGUgQnVmZmVyIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBCdWZmZXIgdG8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRCdWZmZXIodmFsdWUsIG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUJ1ZmZlcih2YWx1ZSwgdHJ1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgQnVmZmVyIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgQnVmZmVyIH0gVGhlIEJ1ZmZlciB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgQnVmZmVyIHRvLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVCdWZmZXIodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlQnVmZmVyKHZhbHVlLCBmYWxzZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBudWxsLXRlcm1pbmF0ZWQgQnVmZmVyIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb2lzaXRvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBCdWZmZXIgfVxuICAgICAqL1xuICAgIHJlYWRCdWZmZXJOVCgpIHtcbiAgICAgICAgLy8gU2V0IG51bGwgY2hhcmFjdGVyIHBvc2l0aW9uIHRvIHRoZSBlbmQgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICAgIGxldCBudWxsUG9zID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIC8vIEZpbmQgbmV4dCBudWxsIGNoYXJhY3RlciAoaWYgb25lIGlzIG5vdCBmb3VuZCwgZGVmYXVsdCBmcm9tIGFib3ZlIGlzIHVzZWQpXG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9yZWFkT2Zmc2V0OyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2J1ZmZbaV0gPT09IDB4MDApIHtcbiAgICAgICAgICAgICAgICBudWxsUG9zID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBSZWFkIHZhbHVlXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fYnVmZi5zbGljZSh0aGlzLl9yZWFkT2Zmc2V0LCBudWxsUG9zKTtcbiAgICAgICAgLy8gSW5jcmVtZW50IGludGVybmFsIEJ1ZmZlciByZWFkIG9mZnNldFxuICAgICAgICB0aGlzLl9yZWFkT2Zmc2V0ID0gbnVsbFBvcyArIDE7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIG51bGwtdGVybWluYXRlZCBCdWZmZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCdWZmZXIgfSBUaGUgQnVmZmVyIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBCdWZmZXIgdG8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRCdWZmZXJOVCh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICAvLyBXcml0ZSBWYWx1ZXNcbiAgICAgICAgdGhpcy5pbnNlcnRCdWZmZXIodmFsdWUsIG9mZnNldCk7XG4gICAgICAgIHRoaXMuaW5zZXJ0VUludDgoMHgwMCwgb2Zmc2V0ICsgdmFsdWUubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIG51bGwtdGVybWluYXRlZCBCdWZmZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCdWZmZXIgfSBUaGUgQnVmZmVyIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBCdWZmZXIgdG8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUJ1ZmZlck5UKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgLy8gQ2hlY2tzIGZvciB2YWxpZCBudW1iZXJpYyB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXcml0ZSBWYWx1ZXNcbiAgICAgICAgdGhpcy53cml0ZUJ1ZmZlcih2YWx1ZSwgb2Zmc2V0KTtcbiAgICAgICAgdGhpcy53cml0ZVVJbnQ4KDB4MDAsIHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInID8gb2Zmc2V0ICsgdmFsdWUubGVuZ3RoIDogdGhpcy5fd3JpdGVPZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZSB0byBpdHMgb3JpZ2luYWwgZW1wdHkgc3RhdGUuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5fcmVhZE9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJlbWFpbmluZyBkYXRhIGxlZnQgdG8gYmUgcmVhZCBmcm9tIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlbWFpbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoIC0gdGhpcy5fcmVhZE9mZnNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCByZWFkIG9mZnNldCB2YWx1ZSBvZiB0aGUgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICBnZXQgcmVhZE9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRPZmZzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlYWQgb2Zmc2V0IHZhbHVlIG9mIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSAtIFRoZSBvZmZzZXQgdmFsdWUgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldCByZWFkT2Zmc2V0KG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGJvdW5kcy5cbiAgICAgICAgdXRpbHNfMS5jaGVja1RhcmdldE9mZnNldChvZmZzZXQsIHRoaXMpO1xuICAgICAgICB0aGlzLl9yZWFkT2Zmc2V0ID0gb2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHdyaXRlIG9mZnNldCB2YWx1ZSBvZiB0aGUgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICBnZXQgd3JpdGVPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU9mZnNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgd3JpdGUgb2Zmc2V0IHZhbHVlIG9mIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSAtIFRoZSBvZmZzZXQgdmFsdWUgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldCB3cml0ZU9mZnNldChvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5jaGVja09mZnNldFZhbHVlKG9mZnNldCk7XG4gICAgICAgIC8vIENoZWNrIGZvciBib3VuZHMuXG4gICAgICAgIHV0aWxzXzEuY2hlY2tUYXJnZXRPZmZzZXQob2Zmc2V0LCB0aGlzKTtcbiAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgPSBvZmZzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnRseSBzZXQgc3RyaW5nIGVuY29kaW5nIG9mIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBCdWZmZXJFbmNvZGluZyB9IFRoZSBzdHJpbmcgQnVmZmVyIGVuY29kaW5nIGN1cnJlbnRseSBzZXQuXG4gICAgICovXG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHN0cmluZyBlbmNvZGluZyBvZiB0aGUgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBCdWZmZXJFbmNvZGluZyB9IFRoZSBzdHJpbmcgQnVmZmVyIGVuY29kaW5nIHRvIHNldC5cbiAgICAgKi9cbiAgICBzZXQgZW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgICAgICAgdXRpbHNfMS5jaGVja0VuY29kaW5nKGVuY29kaW5nKTtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdW5kZXJseWluZyBpbnRlcm5hbCBCdWZmZXIuIChUaGlzIGluY2x1ZGVzIHVubWFuYWdlZCBkYXRhIGluIHRoZSBCdWZmZXIpXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgQnVmZmVyIH0gVGhlIEJ1ZmZlciB2YWx1ZS5cbiAgICAgKi9cbiAgICBnZXQgaW50ZXJuYWxCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW50ZXJuYWwgbWFuYWdlZCBCdWZmZXIgKEluY2x1ZGVzIG1hbmFnZWQgZGF0YSBvbmx5KVxuICAgICAqXG4gICAgICogQHBhcmFtIHsgQnVmZmVyIH1cbiAgICAgKi9cbiAgICB0b0J1ZmZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmYuc2xpY2UoMCwgdGhpcy5sZW5ndGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBTdHJpbmcgdmFsdWUgb2YgdGhlIGludGVybmFsIG1hbmFnZWQgQnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gZGlzcGxheSB0aGUgQnVmZmVyIGFzIChkZWZhdWx0cyB0byBpbnN0YW5jZSBsZXZlbCBlbmNvZGluZykuXG4gICAgICovXG4gICAgdG9TdHJpbmcoZW5jb2RpbmcpIHtcbiAgICAgICAgY29uc3QgZW5jb2RpbmdWYWwgPSB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnID8gZW5jb2RpbmcgOiB0aGlzLl9lbmNvZGluZztcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgZW5jb2RpbmcuXG4gICAgICAgIHV0aWxzXzEuY2hlY2tFbmNvZGluZyhlbmNvZGluZ1ZhbCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmLnRvU3RyaW5nKGVuY29kaW5nVmFsLCAwLCB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGluc2VydGluZyBhbmQgd3JpdGluZyBzdHJpbmdzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgU3RyaW5nIH0gVGhlIFN0cmluZyB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIGlzSW5zZXJ0IHsgQm9vbGVhbiB9IFRydWUgaWYgaW5zZXJ0aW5nIGEgc3RyaW5nLCBmYWxzZSBpZiB3cml0aW5nLlxuICAgICAqIEBwYXJhbSBhcmcyIHsgTnVtYmVyIHwgU3RyaW5nIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHN0cmluZyBhdCwgb3IgdGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvciB3cml0aW5nIHN0cmluZ3MgKGRlZmF1bHRzIHRvIGluc3RhbmNlIGVuY29kaW5nKS5cbiAgICAgKi9cbiAgICBfaGFuZGxlU3RyaW5nKHZhbHVlLCBpc0luc2VydCwgYXJnMywgZW5jb2RpbmcpIHtcbiAgICAgICAgbGV0IG9mZnNldFZhbCA9IHRoaXMuX3dyaXRlT2Zmc2V0O1xuICAgICAgICBsZXQgZW5jb2RpbmdWYWwgPSB0aGlzLl9lbmNvZGluZztcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG9mZnNldFxuICAgICAgICBpZiAodHlwZW9mIGFyZzMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBvZmZzZXRWYWwgPSBhcmczO1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVuY29kaW5nXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGFyZzMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB1dGlsc18xLmNoZWNrRW5jb2RpbmcoYXJnMyk7XG4gICAgICAgICAgICBlbmNvZGluZ1ZhbCA9IGFyZzM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGVuY29kaW5nICh0aGlyZCBwYXJhbSlcbiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tFbmNvZGluZyhlbmNvZGluZyk7XG4gICAgICAgICAgICBlbmNvZGluZ1ZhbCA9IGVuY29kaW5nO1xuICAgICAgICB9XG4gICAgICAgIC8vIENhbGN1bGF0ZSBieXRlbGVuZ3RoIG9mIHN0cmluZy5cbiAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlLCBlbmNvZGluZ1ZhbCk7XG4gICAgICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggaW50ZXJuYWwgQnVmZmVyIGNhcGFjaXR5LlxuICAgICAgICBpZiAoaXNJbnNlcnQpIHtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlSW5zZXJ0YWJsZShieXRlTGVuZ3RoLCBvZmZzZXRWYWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW5zdXJlV3JpdGVhYmxlKGJ5dGVMZW5ndGgsIG9mZnNldFZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV3JpdGUgdmFsdWVcbiAgICAgICAgdGhpcy5fYnVmZi53cml0ZSh2YWx1ZSwgb2Zmc2V0VmFsLCBieXRlTGVuZ3RoLCBlbmNvZGluZ1ZhbCk7XG4gICAgICAgIC8vIEluY3JlbWVudCBpbnRlcm5hbCBCdWZmZXIgd3JpdGUgb2Zmc2V0O1xuICAgICAgICBpZiAoaXNJbnNlcnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ICs9IGJ5dGVMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBhbiBvZmZzZXQgd2FzIGdpdmVuLCBjaGVjayB0byBzZWUgaWYgd2Ugd3JvdGUgYmV5b25kIHRoZSBjdXJyZW50IHdyaXRlT2Zmc2V0LlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmczID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ID0gTWF0aC5tYXgodGhpcy5fd3JpdGVPZmZzZXQsIG9mZnNldFZhbCArIGJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbm8gb2Zmc2V0IHdhcyBnaXZlbiwgd2Ugd3JvdGUgdG8gdGhlIGVuZCBvZiB0aGUgU21hcnRCdWZmZXIgc28gaW5jcmVtZW50IHdyaXRlT2Zmc2V0LlxuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ICs9IGJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd3JpdGluZyBvciBpbnNlcnQgb2YgYSBCdWZmZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCdWZmZXIgfSBUaGUgQnVmZmVyIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBCdWZmZXIgdG8uXG4gICAgICovXG4gICAgX2hhbmRsZUJ1ZmZlcih2YWx1ZSwgaXNJbnNlcnQsIG9mZnNldCkge1xuICAgICAgICBjb25zdCBvZmZzZXRWYWwgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJyA/IG9mZnNldCA6IHRoaXMuX3dyaXRlT2Zmc2V0O1xuICAgICAgICAvLyBFbnN1cmUgdGhlcmUgaXMgZW5vdWdoIGludGVybmFsIEJ1ZmZlciBjYXBhY2l0eS5cbiAgICAgICAgaWYgKGlzSW5zZXJ0KSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZUluc2VydGFibGUodmFsdWUubGVuZ3RoLCBvZmZzZXRWYWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW5zdXJlV3JpdGVhYmxlKHZhbHVlLmxlbmd0aCwgb2Zmc2V0VmFsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXcml0ZSBidWZmZXIgdmFsdWVcbiAgICAgICAgdmFsdWUuY29weSh0aGlzLl9idWZmLCBvZmZzZXRWYWwpO1xuICAgICAgICAvLyBJbmNyZW1lbnQgaW50ZXJuYWwgQnVmZmVyIHdyaXRlIG9mZnNldDtcbiAgICAgICAgaWYgKGlzSW5zZXJ0KSB7XG4gICAgICAgICAgICB0aGlzLl93cml0ZU9mZnNldCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBhbiBvZmZzZXQgd2FzIGdpdmVuLCBjaGVjayB0byBzZWUgaWYgd2Ugd3JvdGUgYmV5b25kIHRoZSBjdXJyZW50IHdyaXRlT2Zmc2V0LlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgPSBNYXRoLm1heCh0aGlzLl93cml0ZU9mZnNldCwgb2Zmc2V0VmFsICsgdmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIElmIG5vIG9mZnNldCB3YXMgZ2l2ZW4sIHdlIHdyb3RlIHRvIHRoZSBlbmQgb2YgdGhlIFNtYXJ0QnVmZmVyIHNvIGluY3JlbWVudCB3cml0ZU9mZnNldC5cbiAgICAgICAgICAgICAgICB0aGlzLl93cml0ZU9mZnNldCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgaW50ZXJuYWwgQnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byByZWFkIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIHsgTnVtYmVyIH0gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHJlYWQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdGhhdCBuZWVkcyB0byBiZSByZWFkLlxuICAgICAqL1xuICAgIGVuc3VyZVJlYWRhYmxlKGxlbmd0aCwgb2Zmc2V0KSB7XG4gICAgICAgIC8vIE9mZnNldCB2YWx1ZSBkZWZhdWx0cyB0byBtYW5hZ2VkIHJlYWQgb2Zmc2V0LlxuICAgICAgICBsZXQgb2Zmc2V0VmFsID0gdGhpcy5fcmVhZE9mZnNldDtcbiAgICAgICAgLy8gSWYgYW4gb2Zmc2V0IHdhcyBwcm92aWRlZCwgdXNlIGl0LlxuICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIENoZWNrcyBmb3IgdmFsaWQgbnVtYmVyaWMgdmFsdWU7XG4gICAgICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgICAgIC8vIE92ZXJpZGUgd2l0aCBjdXN0b20gb2Zmc2V0LlxuICAgICAgICAgICAgb2Zmc2V0VmFsID0gb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrcyBpZiBvZmZzZXQgaXMgYmVsb3cgemVybywgb3IgdGhlIG9mZnNldCtsZW5ndGggb2Zmc2V0IGlzIGJleW9uZCB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBtYW5hZ2VkIGRhdGEuXG4gICAgICAgIGlmIChvZmZzZXRWYWwgPCAwIHx8IG9mZnNldFZhbCArIGxlbmd0aCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodXRpbHNfMS5FUlJPUlMuSU5WQUxJRF9SRUFEX0JFWU9ORF9CT1VORFMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgaW50ZXJuYWwgQnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBpbnNlcnQgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhTGVuZ3RoIHsgTnVtYmVyIH0gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHdyaXR0ZW4uXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi5cbiAgICAgKi9cbiAgICBlbnN1cmVJbnNlcnRhYmxlKGRhdGFMZW5ndGgsIG9mZnNldCkge1xuICAgICAgICAvLyBDaGVja3MgZm9yIHZhbGlkIG51bWJlcmljIHZhbHVlO1xuICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgLy8gRW5zdXJlIHRoZXJlIGlzIGVub3VnaCBpbnRlcm5hbCBCdWZmZXIgY2FwYWNpdHkuXG4gICAgICAgIHRoaXMuX2Vuc3VyZUNhcGFjaXR5KHRoaXMubGVuZ3RoICsgZGF0YUxlbmd0aCk7XG4gICAgICAgIC8vIElmIGFuIG9mZnNldCB3YXMgcHJvdmlkZWQgYW5kIGl0cyBub3QgdGhlIHZlcnkgZW5kIG9mIHRoZSBidWZmZXIsIGNvcHkgZGF0YSBpbnRvIGFwcHJvcHJpYXRlIGxvY2F0aW9uIGluIHJlZ2FyZHMgdG8gdGhlIG9mZnNldC5cbiAgICAgICAgaWYgKG9mZnNldCA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9idWZmLmNvcHkodGhpcy5fYnVmZiwgb2Zmc2V0ICsgZGF0YUxlbmd0aCwgb2Zmc2V0LCB0aGlzLl9idWZmLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRqdXN0IHRyYWNrZWQgc21hcnQgYnVmZmVyIGxlbmd0aFxuICAgICAgICBpZiAob2Zmc2V0ICsgZGF0YUxlbmd0aCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG9mZnNldCArIGRhdGFMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCArPSBkYXRhTGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgaW50ZXJuYWwgQnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byB3cml0ZSBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFMZW5ndGggeyBOdW1iZXIgfSBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgd3JpdHRlbi5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byBiZSB3cml0dGVuIChkZWZhdWx0cyB0byB3cml0ZU9mZnNldCkuXG4gICAgICovXG4gICAgX2Vuc3VyZVdyaXRlYWJsZShkYXRhTGVuZ3RoLCBvZmZzZXQpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0VmFsID0gdHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicgPyBvZmZzZXQgOiB0aGlzLl93cml0ZU9mZnNldDtcbiAgICAgICAgLy8gRW5zdXJlIGVub3VnaCBjYXBhY2l0eSB0byB3cml0ZSBkYXRhLlxuICAgICAgICB0aGlzLl9lbnN1cmVDYXBhY2l0eShvZmZzZXRWYWwgKyBkYXRhTGVuZ3RoKTtcbiAgICAgICAgLy8gQWRqdXN0IFNtYXJ0QnVmZmVyIGxlbmd0aCAoaWYgb2Zmc2V0ICsgbGVuZ3RoIGlzIGxhcmdlciB0aGFuIG1hbmFnZWQgbGVuZ3RoLCBhZGp1c3QgbGVuZ3RoKVxuICAgICAgICBpZiAob2Zmc2V0VmFsICsgZGF0YUxlbmd0aCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG9mZnNldFZhbCArIGRhdGFMZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5zdXJlcyB0aGF0IHRoZSBpbnRlcm5hbCBCdWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIHdyaXRlIGF0IGxlYXN0IHRoZSBnaXZlbiBhbW91bnQgb2YgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtaW5MZW5ndGggeyBOdW1iZXIgfSBUaGUgbWluaW11bSBsZW5ndGggb2YgdGhlIGRhdGEgbmVlZHMgdG8gYmUgd3JpdHRlbi5cbiAgICAgKi9cbiAgICBfZW5zdXJlQ2FwYWNpdHkobWluTGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG9sZExlbmd0aCA9IHRoaXMuX2J1ZmYubGVuZ3RoO1xuICAgICAgICBpZiAobWluTGVuZ3RoID4gb2xkTGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHRoaXMuX2J1ZmY7XG4gICAgICAgICAgICBsZXQgbmV3TGVuZ3RoID0gKG9sZExlbmd0aCAqIDMpIC8gMiArIDE7XG4gICAgICAgICAgICBpZiAobmV3TGVuZ3RoIDwgbWluTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbmV3TGVuZ3RoID0gbWluTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYnVmZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuZXdMZW5ndGgpO1xuICAgICAgICAgICAgZGF0YS5jb3B5KHRoaXMuX2J1ZmYsIDAsIDAsIG9sZExlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBudW1lcmljIG51bWJlciB2YWx1ZSB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAdHlwZXBhcmFtIFQgeyBudW1iZXIgfCBiaWdpbnQgfSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgdG8gYmUgcmVhZFxuICAgICAqXG4gICAgICogQHBhcmFtIGZ1bmMgeyBGdW5jdGlvbihvZmZzZXQ6IG51bWJlcikgPT4gbnVtYmVyIH0gVGhlIGZ1bmN0aW9uIHRvIHJlYWQgZGF0YSBvbiB0aGUgaW50ZXJuYWwgQnVmZmVyIHdpdGguXG4gICAgICogQHBhcmFtIGJ5dGVTaXplIHsgTnVtYmVyIH0gVGhlIG51bWJlciBvZiBieXRlcyByZWFkLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZnJvbSAob3B0aW9uYWwpLiBXaGVuIHRoaXMgaXMgbm90IHByb3ZpZGVkLCB0aGUgbWFuYWdlZCByZWFkT2Zmc2V0IGlzIHVzZWQgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHsgVCB9IHRoZSBudW1iZXIgdmFsdWVcbiAgICAgKi9cbiAgICBfcmVhZE51bWJlclZhbHVlKGZ1bmMsIGJ5dGVTaXplLCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVSZWFkYWJsZShieXRlU2l6ZSwgb2Zmc2V0KTtcbiAgICAgICAgLy8gQ2FsbCBCdWZmZXIucmVhZFhYWFgoKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmdW5jLmNhbGwodGhpcy5fYnVmZiwgdHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicgPyBvZmZzZXQgOiB0aGlzLl9yZWFkT2Zmc2V0KTtcbiAgICAgICAgLy8gQWRqdXN0IGludGVybmFsIHJlYWQgb2Zmc2V0IGlmIGFuIG9wdGlvbmFsIHJlYWQgb2Zmc2V0IHdhcyBub3QgcHJvdmlkZWQuXG4gICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fcmVhZE9mZnNldCArPSBieXRlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBudW1lcmljIG51bWJlciB2YWx1ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gb2Zmc2V0IGFuZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEB0eXBlcGFyYW0gVCB7IG51bWJlciB8IGJpZ2ludCB9IFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZnVuYyB7IEZ1bmN0aW9uKG9mZnNldDogVCwgb2Zmc2V0PykgPT4gbnVtYmVyfSBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgZGF0YSBvbiB0aGUgaW50ZXJuYWwgQnVmZmVyIHdpdGguXG4gICAgICogQHBhcmFtIGJ5dGVTaXplIHsgTnVtYmVyIH0gVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IFQgfSBUaGUgbnVtYmVyIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSB0aGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBudW1iZXIgYXQgKFJFUVVJUkVEKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNtYXJ0QnVmZmVyIHRoaXMgYnVmZmVyXG4gICAgICovXG4gICAgX2luc2VydE51bWJlclZhbHVlKGZ1bmMsIGJ5dGVTaXplLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIG9mZnNldCB2YWx1ZXMuXG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICAvLyBFbnN1cmUgdGhlcmUgaXMgZW5vdWdoIGludGVybmFsIEJ1ZmZlciBjYXBhY2l0eS4gKHJhdyBvZmZzZXQgaXMgcGFzc2VkKVxuICAgICAgICB0aGlzLmVuc3VyZUluc2VydGFibGUoYnl0ZVNpemUsIG9mZnNldCk7XG4gICAgICAgIC8vIENhbGwgYnVmZmVyLndyaXRlWFhYWCgpO1xuICAgICAgICBmdW5jLmNhbGwodGhpcy5fYnVmZiwgdmFsdWUsIG9mZnNldCk7XG4gICAgICAgIC8vIEFkanVzdHMgaW50ZXJuYWxseSBtYW5hZ2VkIHdyaXRlIG9mZnNldC5cbiAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgKz0gYnl0ZVNpemU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBudW1lcmljIG51bWJlciB2YWx1ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gb2Zmc2V0IGFuZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEB0eXBlcGFyYW0gVCB7IG51bWJlciB8IGJpZ2ludCB9IFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZnVuYyB7IEZ1bmN0aW9uKG9mZnNldDogVCwgb2Zmc2V0PykgPT4gbnVtYmVyfSBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgZGF0YSBvbiB0aGUgaW50ZXJuYWwgQnVmZmVyIHdpdGguXG4gICAgICogQHBhcmFtIGJ5dGVTaXplIHsgTnVtYmVyIH0gVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IFQgfSBUaGUgbnVtYmVyIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSB0aGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBudW1iZXIgYXQgKFJFUVVJUkVEKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNtYXJ0QnVmZmVyIHRoaXMgYnVmZmVyXG4gICAgICovXG4gICAgX3dyaXRlTnVtYmVyVmFsdWUoZnVuYywgYnl0ZVNpemUsIHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgLy8gSWYgYW4gb2Zmc2V0IHdhcyBwcm92aWRlZCwgdmFsaWRhdGUgaXQuXG4gICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgd3JpdGluZyBiZXlvbmQgdGhlIGJvdW5kcyBvZiB0aGUgbWFuYWdlZCBkYXRhLlxuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodXRpbHNfMS5FUlJPUlMuSU5WQUxJRF9XUklURV9CRVlPTkRfQk9VTkRTKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlZmF1bHQgdG8gd3JpdGVPZmZzZXQgaWYgbm8gb2Zmc2V0IHZhbHVlIHdhcyBnaXZlbi5cbiAgICAgICAgY29uc3Qgb2Zmc2V0VmFsID0gdHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicgPyBvZmZzZXQgOiB0aGlzLl93cml0ZU9mZnNldDtcbiAgICAgICAgLy8gRW5zdXJlIHRoZXJlIGlzIGVub3VnaCBpbnRlcm5hbCBCdWZmZXIgY2FwYWNpdHkuIChyYXcgb2Zmc2V0IGlzIHBhc3NlZClcbiAgICAgICAgdGhpcy5fZW5zdXJlV3JpdGVhYmxlKGJ5dGVTaXplLCBvZmZzZXRWYWwpO1xuICAgICAgICBmdW5jLmNhbGwodGhpcy5fYnVmZiwgdmFsdWUsIG9mZnNldFZhbCk7XG4gICAgICAgIC8vIElmIGFuIG9mZnNldCB3YXMgZ2l2ZW4sIGNoZWNrIHRvIHNlZSBpZiB3ZSB3cm90ZSBiZXlvbmQgdGhlIGN1cnJlbnQgd3JpdGVPZmZzZXQuXG4gICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgPSBNYXRoLm1heCh0aGlzLl93cml0ZU9mZnNldCwgb2Zmc2V0VmFsICsgYnl0ZVNpemUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgbm8gbnVtZXJpYyBvZmZzZXQgd2FzIGdpdmVuLCB3ZSB3cm90ZSB0byB0aGUgZW5kIG9mIHRoZSBTbWFydEJ1ZmZlciBzbyBpbmNyZW1lbnQgd3JpdGVPZmZzZXQuXG4gICAgICAgICAgICB0aGlzLl93cml0ZU9mZnNldCArPSBieXRlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5leHBvcnRzLlNtYXJ0QnVmZmVyID0gU21hcnRCdWZmZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zbWFydGJ1ZmZlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGJ1ZmZlcl8xID0gcmVxdWlyZShcImJ1ZmZlclwiKTtcbi8qKlxuICogRXJyb3Igc3RyaW5nc1xuICovXG5jb25zdCBFUlJPUlMgPSB7XG4gICAgSU5WQUxJRF9FTkNPRElORzogJ0ludmFsaWQgZW5jb2RpbmcgcHJvdmlkZWQuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgZW5jb2RpbmcgdGhlIGludGVybmFsIE5vZGUuanMgQnVmZmVyIHN1cHBvcnRzLicsXG4gICAgSU5WQUxJRF9TTUFSVEJVRkZFUl9TSVpFOiAnSW52YWxpZCBzaXplIHByb3ZpZGVkLiBTaXplIG11c3QgYmUgYSB2YWxpZCBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiB6ZXJvLicsXG4gICAgSU5WQUxJRF9TTUFSVEJVRkZFUl9CVUZGRVI6ICdJbnZhbGlkIEJ1ZmZlciBwcm92aWRlZCBpbiBTbWFydEJ1ZmZlck9wdGlvbnMuJyxcbiAgICBJTlZBTElEX1NNQVJUQlVGRkVSX09CSkVDVDogJ0ludmFsaWQgU21hcnRCdWZmZXJPcHRpb25zIG9iamVjdCBzdXBwbGllZCB0byBTbWFydEJ1ZmZlciBjb25zdHJ1Y3RvciBvciBmYWN0b3J5IG1ldGhvZHMuJyxcbiAgICBJTlZBTElEX09GRlNFVDogJ0FuIGludmFsaWQgb2Zmc2V0IHZhbHVlIHdhcyBwcm92aWRlZC4nLFxuICAgIElOVkFMSURfT0ZGU0VUX05PTl9OVU1CRVI6ICdBbiBpbnZhbGlkIG9mZnNldCB2YWx1ZSB3YXMgcHJvdmlkZWQuIEEgbnVtZXJpYyB2YWx1ZSBpcyByZXF1aXJlZC4nLFxuICAgIElOVkFMSURfTEVOR1RIOiAnQW4gaW52YWxpZCBsZW5ndGggdmFsdWUgd2FzIHByb3ZpZGVkLicsXG4gICAgSU5WQUxJRF9MRU5HVEhfTk9OX05VTUJFUjogJ0FuIGludmFsaWQgbGVuZ3RoIHZhbHVlIHdhcyBwcm92aXZlZC4gQSBudW1lcmljIHZhbHVlIGlzIHJlcXVpcmVkLicsXG4gICAgSU5WQUxJRF9UQVJHRVRfT0ZGU0VUOiAnVGFyZ2V0IG9mZnNldCBpcyBiZXlvbmQgdGhlIGJvdW5kcyBvZiB0aGUgaW50ZXJuYWwgU21hcnRCdWZmZXIgZGF0YS4nLFxuICAgIElOVkFMSURfVEFSR0VUX0xFTkdUSDogJ1NwZWNpZmllZCBsZW5ndGggdmFsdWUgbW92ZXMgY3Vyc29yIGJleW9uZyB0aGUgYm91bmRzIG9mIHRoZSBpbnRlcm5hbCBTbWFydEJ1ZmZlciBkYXRhLicsXG4gICAgSU5WQUxJRF9SRUFEX0JFWU9ORF9CT1VORFM6ICdBdHRlbXB0ZWQgdG8gcmVhZCBiZXlvbmQgdGhlIGJvdW5kcyBvZiB0aGUgbWFuYWdlZCBkYXRhLicsXG4gICAgSU5WQUxJRF9XUklURV9CRVlPTkRfQk9VTkRTOiAnQXR0ZW1wdGVkIHRvIHdyaXRlIGJleW9uZCB0aGUgYm91bmRzIG9mIHRoZSBtYW5hZ2VkIGRhdGEuJ1xufTtcbmV4cG9ydHMuRVJST1JTID0gRVJST1JTO1xuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBlbmNvZGluZyBpcyBhIHZhbGlkIEJ1ZmZlciBlbmNvZGluZy4gKFRocm93cyBhbiBleGNlcHRpb24gaWYgY2hlY2sgZmFpbHMpXG4gKlxuICogQHBhcmFtIHsgU3RyaW5nIH0gZW5jb2RpbmcgVGhlIGVuY29kaW5nIHN0cmluZyB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gY2hlY2tFbmNvZGluZyhlbmNvZGluZykge1xuICAgIGlmICghYnVmZmVyXzEuQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUlMuSU5WQUxJRF9FTkNPRElORyk7XG4gICAgfVxufVxuZXhwb3J0cy5jaGVja0VuY29kaW5nID0gY2hlY2tFbmNvZGluZztcbi8qKlxuICogQ2hlY2tzIGlmIGEgZ2l2ZW4gbnVtYmVyIGlzIGEgZmluaXRlIGludGVnZXIuIChUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGNoZWNrIGZhaWxzKVxuICpcbiAqIEBwYXJhbSB7IE51bWJlciB9IHZhbHVlIFRoZSBudW1iZXIgdmFsdWUgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGlzRmluaXRlSW50ZWdlcih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbHVlKSAmJiBpc0ludGVnZXIodmFsdWUpO1xufVxuZXhwb3J0cy5pc0Zpbml0ZUludGVnZXIgPSBpc0Zpbml0ZUludGVnZXI7XG4vKipcbiAqIENoZWNrcyBpZiBhbiBvZmZzZXQvbGVuZ3RoIHZhbHVlIGlzIHZhbGlkLiAoVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBjaGVjayBmYWlscylcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIG9mZnNldCBUcnVlIGlmIGNoZWNraW5nIGFuIG9mZnNldCwgZmFsc2UgaWYgY2hlY2tpbmcgYSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0T3JMZW5ndGhWYWx1ZSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG5vbiBmaW5pdGUvbm9uIGludGVnZXJzXG4gICAgICAgIGlmICghaXNGaW5pdGVJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihvZmZzZXQgPyBFUlJPUlMuSU5WQUxJRF9PRkZTRVQgOiBFUlJPUlMuSU5WQUxJRF9MRU5HVEgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3Iob2Zmc2V0ID8gRVJST1JTLklOVkFMSURfT0ZGU0VUX05PTl9OVU1CRVIgOiBFUlJPUlMuSU5WQUxJRF9MRU5HVEhfTk9OX05VTUJFUik7XG4gICAgfVxufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBsZW5ndGggdmFsdWUgaXMgdmFsaWQuIChUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGNoZWNrIGZhaWxzKVxuICpcbiAqIEBwYXJhbSB7IE51bWJlciB9IGxlbmd0aCBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTGVuZ3RoVmFsdWUobGVuZ3RoKSB7XG4gICAgY2hlY2tPZmZzZXRPckxlbmd0aFZhbHVlKGxlbmd0aCwgZmFsc2UpO1xufVxuZXhwb3J0cy5jaGVja0xlbmd0aFZhbHVlID0gY2hlY2tMZW5ndGhWYWx1ZTtcbi8qKlxuICogQ2hlY2tzIGlmIGEgb2Zmc2V0IHZhbHVlIGlzIHZhbGlkLiAoVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBjaGVjayBmYWlscylcbiAqXG4gKiBAcGFyYW0geyBOdW1iZXIgfSBvZmZzZXQgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldFZhbHVlKG9mZnNldCkge1xuICAgIGNoZWNrT2Zmc2V0T3JMZW5ndGhWYWx1ZShvZmZzZXQsIHRydWUpO1xufVxuZXhwb3J0cy5jaGVja09mZnNldFZhbHVlID0gY2hlY2tPZmZzZXRWYWx1ZTtcbi8qKlxuICogQ2hlY2tzIGlmIGEgdGFyZ2V0IG9mZnNldCB2YWx1ZSBpcyBvdXQgb2YgYm91bmRzLiAoVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBjaGVjayBmYWlscylcbiAqXG4gKiBAcGFyYW0geyBOdW1iZXIgfSBvZmZzZXQgVGhlIG9mZnNldCB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7IFNtYXJ0QnVmZmVyIH0gYnVmZiBUaGUgU21hcnRCdWZmZXIgaW5zdGFuY2UgdG8gY2hlY2sgYWdhaW5zdC5cbiAqL1xuZnVuY3Rpb24gY2hlY2tUYXJnZXRPZmZzZXQob2Zmc2V0LCBidWZmKSB7XG4gICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmZi5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SUy5JTlZBTElEX1RBUkdFVF9PRkZTRVQpO1xuICAgIH1cbn1cbmV4cG9ydHMuY2hlY2tUYXJnZXRPZmZzZXQgPSBjaGVja1RhcmdldE9mZnNldDtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZ2l2ZW4gbnVtYmVyIGlzIGEgaW50ZWdlci5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWx1ZSkgJiYgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xufVxuLyoqXG4gKiBUaHJvd3MgaWYgTm9kZS5qcyB2ZXJzaW9uIGlzIHRvbyBsb3cgdG8gc3VwcG9ydCBiaWdpbnRcbiAqL1xuZnVuY3Rpb24gYmlnSW50QW5kQnVmZmVySW50NjRDaGVjayhidWZmZXJNZXRob2QpIHtcbiAgICBpZiAodHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IEpTIEJpZ0ludCB0eXBlLicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGJ1ZmZlcl8xLkJ1ZmZlci5wcm90b3R5cGVbYnVmZmVyTWV0aG9kXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IEJ1ZmZlci5wcm90b3R5cGUuJHtidWZmZXJNZXRob2R9LmApO1xuICAgIH1cbn1cbmV4cG9ydHMuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjayA9IGJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Tb2Nrc1Byb3h5QWdlbnQgPSB2b2lkIDA7XG5jb25zdCBzb2Nrc18xID0gcmVxdWlyZShcInNvY2tzXCIpO1xuY29uc3QgYWdlbnRfYmFzZV8xID0gcmVxdWlyZShcImFnZW50LWJhc2VcIik7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBkbnMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImRuc1wiKSk7XG5jb25zdCB0bHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInRsc1wiKSk7XG5jb25zdCB1cmxfMSA9IHJlcXVpcmUoXCJ1cmxcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdzb2Nrcy1wcm94eS1hZ2VudCcpO1xuZnVuY3Rpb24gcGFyc2VTb2Nrc1VSTCh1cmwpIHtcbiAgICBsZXQgbG9va3VwID0gZmFsc2U7XG4gICAgbGV0IHR5cGUgPSA1O1xuICAgIGNvbnN0IGhvc3QgPSB1cmwuaG9zdG5hbWU7XG4gICAgLy8gRnJvbSBSRkMgMTkyOCwgU2VjdGlvbiAzOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTkyOCNzZWN0aW9uLTNcbiAgICAvLyBcIlRoZSBTT0NLUyBzZXJ2aWNlIGlzIGNvbnZlbnRpb25hbGx5IGxvY2F0ZWQgb24gVENQIHBvcnQgMTA4MFwiXG4gICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHVybC5wb3J0LCAxMCkgfHwgMTA4MDtcbiAgICAvLyBmaWd1cmUgb3V0IGlmIHdlIHdhbnQgc29ja3MgdjQgb3IgdjUsIGJhc2VkIG9uIHRoZSBcInByb3RvY29sXCIgdXNlZC5cbiAgICAvLyBEZWZhdWx0cyB0byA1LlxuICAgIHN3aXRjaCAodXJsLnByb3RvY29sLnJlcGxhY2UoJzonLCAnJykpIHtcbiAgICAgICAgY2FzZSAnc29ja3M0JzpcbiAgICAgICAgICAgIGxvb2t1cCA9IHRydWU7XG4gICAgICAgICAgICB0eXBlID0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBwYXNzIHRocm91Z2hcbiAgICAgICAgY2FzZSAnc29ja3M0YSc6XG4gICAgICAgICAgICB0eXBlID0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzb2NrczUnOlxuICAgICAgICAgICAgbG9va3VwID0gdHJ1ZTtcbiAgICAgICAgICAgIHR5cGUgPSA1O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIHBhc3MgdGhyb3VnaFxuICAgICAgICBjYXNlICdzb2Nrcyc6IC8vIG5vIHZlcnNpb24gc3BlY2lmaWVkLCBkZWZhdWx0IHRvIDVoXG4gICAgICAgICAgICB0eXBlID0gNTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzb2NrczVoJzpcbiAgICAgICAgICAgIHR5cGUgPSA1O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBBIFwic29ja3NcIiBwcm90b2NvbCBtdXN0IGJlIHNwZWNpZmllZCEgR290OiAke1N0cmluZyh1cmwucHJvdG9jb2wpfWApO1xuICAgIH1cbiAgICBjb25zdCBwcm94eSA9IHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgdHlwZSxcbiAgICB9O1xuICAgIGlmICh1cmwudXNlcm5hbWUpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3h5LCAndXNlcklkJywge1xuICAgICAgICAgICAgdmFsdWU6IGRlY29kZVVSSUNvbXBvbmVudCh1cmwudXNlcm5hbWUpLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodXJsLnBhc3N3b3JkICE9IG51bGwpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3h5LCAncGFzc3dvcmQnLCB7XG4gICAgICAgICAgICB2YWx1ZTogZGVjb2RlVVJJQ29tcG9uZW50KHVybC5wYXNzd29yZCksXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IGxvb2t1cCwgcHJveHkgfTtcbn1cbmNsYXNzIFNvY2tzUHJveHlBZ2VudCBleHRlbmRzIGFnZW50X2Jhc2VfMS5BZ2VudCB7XG4gICAgY29uc3RydWN0b3IodXJpLCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICBjb25zdCB1cmwgPSB0eXBlb2YgdXJpID09PSAnc3RyaW5nJyA/IG5ldyB1cmxfMS5VUkwodXJpKSA6IHVyaTtcbiAgICAgICAgY29uc3QgeyBwcm94eSwgbG9va3VwIH0gPSBwYXJzZVNvY2tzVVJMKHVybCk7XG4gICAgICAgIHRoaXMuc2hvdWxkTG9va3VwID0gbG9va3VwO1xuICAgICAgICB0aGlzLnByb3h5ID0gcHJveHk7XG4gICAgICAgIHRoaXMudGltZW91dCA9IG9wdHM/LnRpbWVvdXQgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5zb2NrZXRPcHRpb25zID0gb3B0cz8uc29ja2V0T3B0aW9ucyA/PyBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbml0aWF0ZXMgYSBTT0NLUyBjb25uZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgU09DS1MgcHJveHkgc2VydmVyLFxuICAgICAqIHdoaWNoIGluIHR1cm4gY29ubmVjdHMgdG8gdGhlIHNwZWNpZmllZCByZW1vdGUgaG9zdCBhbmQgcG9ydC5cbiAgICAgKi9cbiAgICBhc3luYyBjb25uZWN0KHJlcSwgb3B0cykge1xuICAgICAgICBjb25zdCB7IHNob3VsZExvb2t1cCwgcHJveHksIHRpbWVvdXQgfSA9IHRoaXM7XG4gICAgICAgIGlmICghb3B0cy5ob3N0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGBob3N0YCBkZWZpbmVkIScpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IGhvc3QgfSA9IG9wdHM7XG4gICAgICAgIGNvbnN0IHsgcG9ydCwgbG9va3VwOiBsb29rdXBGbiA9IGRucy5sb29rdXAgfSA9IG9wdHM7XG4gICAgICAgIGlmIChzaG91bGRMb29rdXApIHtcbiAgICAgICAgICAgIC8vIENsaWVudC1zaWRlIEROUyByZXNvbHV0aW9uIGZvciBcIjRcIiBhbmQgXCI1XCIgc29ja3MgcHJveHkgdmVyc2lvbnMuXG4gICAgICAgICAgICBob3N0ID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgcmVxdWVzdCdzIGN1c3RvbSBsb29rdXAsIGlmIG9uZSB3YXMgY29uZmlndXJlZDpcbiAgICAgICAgICAgICAgICBsb29rdXBGbihob3N0LCB7fSwgKGVyciwgcmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb2Nrc09wdHMgPSB7XG4gICAgICAgICAgICBwcm94eSxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgICAgICBwb3J0OiB0eXBlb2YgcG9ydCA9PT0gJ251bWJlcicgPyBwb3J0IDogcGFyc2VJbnQocG9ydCwgMTApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbW1hbmQ6ICdjb25uZWN0JyxcbiAgICAgICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGUgdHlwZSBzdXBwbGllZCBieSBzb2NrcyBmb3Igc29ja2V0X29wdGlvbnMgaXMgd2lkZXJcbiAgICAgICAgICAgIC8vIHRoYW4gbmVjZXNzYXJ5IHNpbmNlIHNvY2tzIHdpbGwgYWx3YXlzIG92ZXJyaWRlIHRoZSBob3N0IGFuZCBwb3J0XG4gICAgICAgICAgICBzb2NrZXRfb3B0aW9uczogdGhpcy5zb2NrZXRPcHRpb25zID8/IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2xlYW51cCA9ICh0bHNTb2NrZXQpID0+IHtcbiAgICAgICAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgaWYgKHRsc1NvY2tldClcbiAgICAgICAgICAgICAgICB0bHNTb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICB9O1xuICAgICAgICBkZWJ1ZygnQ3JlYXRpbmcgc29ja3MgcHJveHkgY29ubmVjdGlvbjogJW8nLCBzb2Nrc09wdHMpO1xuICAgICAgICBjb25zdCB7IHNvY2tldCB9ID0gYXdhaXQgc29ja3NfMS5Tb2Nrc0NsaWVudC5jcmVhdGVDb25uZWN0aW9uKHNvY2tzT3B0cyk7XG4gICAgICAgIGRlYnVnKCdTdWNjZXNzZnVsbHkgY3JlYXRlZCBzb2NrcyBwcm94eSBjb25uZWN0aW9uJyk7XG4gICAgICAgIGlmICh0aW1lb3V0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzb2NrZXQuc2V0VGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIHNvY2tldC5vbigndGltZW91dCcsICgpID0+IGNsZWFudXAoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuc2VjdXJlRW5kcG9pbnQpIHtcbiAgICAgICAgICAgIC8vIFRoZSBwcm94eSBpcyBjb25uZWN0aW5nIHRvIGEgVExTIHNlcnZlciwgc28gdXBncmFkZVxuICAgICAgICAgICAgLy8gdGhpcyBzb2NrZXQgY29ubmVjdGlvbiB0byBhIFRMUyBjb25uZWN0aW9uLlxuICAgICAgICAgICAgZGVidWcoJ1VwZ3JhZGluZyBzb2NrZXQgY29ubmVjdGlvbiB0byBUTFMnKTtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZlcm5hbWUgPSBvcHRzLnNlcnZlcm5hbWUgfHwgb3B0cy5ob3N0O1xuICAgICAgICAgICAgY29uc3QgdGxzU29ja2V0ID0gdGxzLmNvbm5lY3Qoe1xuICAgICAgICAgICAgICAgIC4uLm9taXQob3B0cywgJ2hvc3QnLCAncGF0aCcsICdwb3J0JyksXG4gICAgICAgICAgICAgICAgc29ja2V0LFxuICAgICAgICAgICAgICAgIHNlcnZlcm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRsc1NvY2tldC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnKCdTb2NrZXQgVExTIGVycm9yJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY2xlYW51cCh0bHNTb2NrZXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGxzU29ja2V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb2NrZXQ7XG4gICAgfVxufVxuU29ja3NQcm94eUFnZW50LnByb3RvY29scyA9IFtcbiAgICAnc29ja3MnLFxuICAgICdzb2NrczQnLFxuICAgICdzb2NrczRhJyxcbiAgICAnc29ja3M1JyxcbiAgICAnc29ja3M1aCcsXG5dO1xuZXhwb3J0cy5Tb2Nrc1Byb3h5QWdlbnQgPSBTb2Nrc1Byb3h5QWdlbnQ7XG5mdW5jdGlvbiBvbWl0KG9iaiwgLi4ua2V5cykge1xuICAgIGNvbnN0IHJldCA9IHt9O1xuICAgIGxldCBrZXk7XG4gICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmICgha2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICByZXRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Tb2Nrc0NsaWVudEVycm9yID0gZXhwb3J0cy5Tb2Nrc0NsaWVudCA9IHZvaWQgMDtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcImV2ZW50c1wiKTtcbmNvbnN0IG5ldCA9IHJlcXVpcmUoXCJuZXRcIik7XG5jb25zdCBzbWFydF9idWZmZXJfMSA9IHJlcXVpcmUoXCJzbWFydC1idWZmZXJcIik7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vY29uc3RhbnRzXCIpO1xuY29uc3QgaGVscGVyc18xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9oZWxwZXJzXCIpO1xuY29uc3QgcmVjZWl2ZWJ1ZmZlcl8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9yZWNlaXZlYnVmZmVyXCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi91dGlsXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU29ja3NDbGllbnRFcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3I7IH0gfSk7XG5jb25zdCBpcF9hZGRyZXNzXzEgPSByZXF1aXJlKFwiaXAtYWRkcmVzc1wiKTtcbmNsYXNzIFNvY2tzQ2xpZW50IGV4dGVuZHMgZXZlbnRzXzEuRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgICAgICAvLyBWYWxpZGF0ZSBTb2Nrc0NsaWVudE9wdGlvbnNcbiAgICAgICAgKDAsIGhlbHBlcnNfMS52YWxpZGF0ZVNvY2tzQ2xpZW50T3B0aW9ucykob3B0aW9ucyk7XG4gICAgICAgIC8vIERlZmF1bHQgc3RhdGVcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkNyZWF0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNPQ0tTIGNvbm5lY3Rpb24uXG4gICAgICpcbiAgICAgKiBOb3RlOiBTdXBwb3J0cyBjYWxsYmFja3MgYW5kIHByb21pc2VzLiBPbmx5IHN1cHBvcnRzIHRoZSBjb25uZWN0IGNvbW1hbmQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgeyBTb2Nrc0NsaWVudE9wdGlvbnMgfSBPcHRpb25zLlxuICAgICAqIEBwYXJhbSBjYWxsYmFjayB7IEZ1bmN0aW9uIH0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMgeyBQcm9taXNlIH1cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlQ29ubmVjdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gVmFsaWRhdGUgU29ja3NDbGllbnRPcHRpb25zXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICgwLCBoZWxwZXJzXzEudmFsaWRhdGVTb2Nrc0NsaWVudE9wdGlvbnMpKG9wdGlvbnMsIFsnY29ubmVjdCddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGVycik7IC8vIFJlc29sdmVzIHBlbmRpbmcgcHJvbWlzZSAocHJldmVudHMgbWVtb3J5IGxlYWtzKS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjbGllbnQgPSBuZXcgU29ja3NDbGllbnQob3B0aW9ucyk7XG4gICAgICAgICAgICBjbGllbnQuY29ubmVjdChvcHRpb25zLmV4aXN0aW5nX3NvY2tldCk7XG4gICAgICAgICAgICBjbGllbnQub25jZSgnZXN0YWJsaXNoZWQnLCAoaW5mbykgPT4ge1xuICAgICAgICAgICAgICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGluZm8pO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGluZm8pOyAvLyBSZXNvbHZlcyBwZW5kaW5nIHByb21pc2UgKHByZXZlbnRzIG1lbW9yeSBsZWFrcykuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGluZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gRXJyb3Igb2NjdXJyZWQsIGZhaWxlZCB0byBlc3RhYmxpc2ggY29ubmVjdGlvbi5cbiAgICAgICAgICAgIGNsaWVudC5vbmNlKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBjbGllbnQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGVycik7IC8vIFJlc29sdmVzIHBlbmRpbmcgcHJvbWlzZSAocHJldmVudHMgbWVtb3J5IGxlYWtzKS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTT0NLUyBjb25uZWN0aW9uIGNoYWluIHRvIGEgZGVzdGluYXRpb24gaG9zdCB0aHJvdWdoIDIgb3IgbW9yZSBTT0NLUyBwcm94aWVzLlxuICAgICAqXG4gICAgICogTm90ZTogU3VwcG9ydHMgY2FsbGJhY2tzIGFuZCBwcm9taXNlcy4gT25seSBzdXBwb3J0cyB0aGUgY29ubmVjdCBtZXRob2QuXG4gICAgICogTm90ZTogSW1wbGVtZW50ZWQgdmlhIGNyZWF0ZUNvbm5lY3Rpb24oKSBmYWN0b3J5IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIHsgU29ja3NDbGllbnRDaGFpbk9wdGlvbnMgfSBPcHRpb25zXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIHsgRnVuY3Rpb24gfSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7IFByb21pc2UgfVxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVDb25uZWN0aW9uQ2hhaW4ob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIFZhbGlkYXRlIFNvY2tzQ2xpZW50Q2hhaW5PcHRpb25zXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICgwLCBoZWxwZXJzXzEudmFsaWRhdGVTb2Nrc0NsaWVudENoYWluT3B0aW9ucykob3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShlcnIpOyAvLyBSZXNvbHZlcyBwZW5kaW5nIHByb21pc2UgKHByZXZlbnRzIG1lbW9yeSBsZWFrcykuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2h1ZmZsZSBwcm94aWVzXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yYW5kb21pemVDaGFpbikge1xuICAgICAgICAgICAgICAgICgwLCB1dGlsXzEuc2h1ZmZsZUFycmF5KShvcHRpb25zLnByb3hpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgc29jaztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMucHJveGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0UHJveHkgPSBvcHRpb25zLnByb3hpZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3ZlIHJlYWNoZWQgdGhlIGxhc3QgcHJveHkgaW4gdGhlIGNoYWluLCB0aGUgZGVzdGluYXRpb24gaXMgdGhlIGFjdHVhbCBkZXN0aW5hdGlvbiwgb3RoZXJ3aXNlIGl0J3MgdGhlIG5leHQgcHJveHkuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHREZXN0aW5hdGlvbiA9IGkgPT09IG9wdGlvbnMucHJveGllcy5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbnMuZGVzdGluYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IG9wdGlvbnMucHJveGllc1tpICsgMV0uaG9zdCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByb3hpZXNbaSArIDFdLmlwYWRkcmVzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0OiBvcHRpb25zLnByb3hpZXNbaSArIDFdLnBvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGVzIHRoZSBuZXh0IGNvbm5lY3Rpb24gaW4gdGhlIGNoYWluLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCBTb2Nrc0NsaWVudC5jcmVhdGVDb25uZWN0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdjb25uZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5OiBuZXh0UHJveHksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogbmV4dERlc3RpbmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmdfc29ja2V0OiBzb2NrLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgc29jayBpcyB1bmRlZmluZWQsIGFzc2lnbiBpdCBoZXJlLlxuICAgICAgICAgICAgICAgICAgICBzb2NrID0gc29jayB8fCByZXN1bHQuc29ja2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHsgc29ja2V0OiBzb2NrIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgc29ja2V0OiBzb2NrIH0pOyAvLyBSZXNvbHZlcyBwZW5kaW5nIHByb21pc2UgKHByZXZlbnRzIG1lbW9yeSBsZWFrcykuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgc29ja2V0OiBzb2NrIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXJyKTsgLy8gUmVzb2x2ZXMgcGVuZGluZyBwcm9taXNlIChwcmV2ZW50cyBtZW1vcnkgbGVha3MpLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBTT0NLUyBVRFAgRnJhbWUuXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlVURQRnJhbWUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBidWZmID0gbmV3IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyKCk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50MTZCRSgwKTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KG9wdGlvbnMuZnJhbWVOdW1iZXIgfHwgMCk7XG4gICAgICAgIC8vIElQdjQvSVB2Ni9Ib3N0bmFtZVxuICAgICAgICBpZiAobmV0LmlzSVB2NChvcHRpb25zLnJlbW90ZUhvc3QuaG9zdCkpIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY0KTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50MzJCRSgoMCwgaGVscGVyc18xLmlwdjRUb0ludDMyKShvcHRpb25zLnJlbW90ZUhvc3QuaG9zdCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5ldC5pc0lQdjYob3B0aW9ucy5yZW1vdGVIb3N0Lmhvc3QpKSB7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2Nik7XG4gICAgICAgICAgICBidWZmLndyaXRlQnVmZmVyKCgwLCBoZWxwZXJzXzEuaXBUb0J1ZmZlcikob3B0aW9ucy5yZW1vdGVIb3N0Lmhvc3QpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5Ib3N0bmFtZSk7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoQnVmZmVyLmJ5dGVMZW5ndGgob3B0aW9ucy5yZW1vdGVIb3N0Lmhvc3QpKTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVTdHJpbmcob3B0aW9ucy5yZW1vdGVIb3N0Lmhvc3QpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBvcnRcbiAgICAgICAgYnVmZi53cml0ZVVJbnQxNkJFKG9wdGlvbnMucmVtb3RlSG9zdC5wb3J0KTtcbiAgICAgICAgLy8gRGF0YVxuICAgICAgICBidWZmLndyaXRlQnVmZmVyKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIHJldHVybiBidWZmLnRvQnVmZmVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIFNPQ0tTIFVEUCBmcmFtZS5cbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZVVEUEZyYW1lKGRhdGEpIHtcbiAgICAgICAgY29uc3QgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIoZGF0YSk7XG4gICAgICAgIGJ1ZmYucmVhZE9mZnNldCA9IDI7XG4gICAgICAgIGNvbnN0IGZyYW1lTnVtYmVyID0gYnVmZi5yZWFkVUludDgoKTtcbiAgICAgICAgY29uc3QgaG9zdFR5cGUgPSBidWZmLnJlYWRVSW50OCgpO1xuICAgICAgICBsZXQgcmVtb3RlSG9zdDtcbiAgICAgICAgaWYgKGhvc3RUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY0KSB7XG4gICAgICAgICAgICByZW1vdGVIb3N0ID0gKDAsIGhlbHBlcnNfMS5pbnQzMlRvSXB2NCkoYnVmZi5yZWFkVUludDMyQkUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaG9zdFR5cGUgPT09IGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLklQdjYpIHtcbiAgICAgICAgICAgIHJlbW90ZUhvc3QgPSBpcF9hZGRyZXNzXzEuQWRkcmVzczYuZnJvbUJ5dGVBcnJheShBcnJheS5mcm9tKGJ1ZmYucmVhZEJ1ZmZlcigxNikpKS5jYW5vbmljYWxGb3JtKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW1vdGVIb3N0ID0gYnVmZi5yZWFkU3RyaW5nKGJ1ZmYucmVhZFVJbnQ4KCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbW90ZVBvcnQgPSBidWZmLnJlYWRVSW50MTZCRSgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZnJhbWVOdW1iZXIsXG4gICAgICAgICAgICByZW1vdGVIb3N0OiB7XG4gICAgICAgICAgICAgICAgaG9zdDogcmVtb3RlSG9zdCxcbiAgICAgICAgICAgICAgICBwb3J0OiByZW1vdGVQb3J0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGE6IGJ1ZmYucmVhZEJ1ZmZlcigpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBzdGF0ZSBzZXR0ZXIuIElmIHRoZSBTb2Nrc0NsaWVudCBpcyBpbiBhbiBlcnJvciBzdGF0ZSwgaXQgY2Fubm90IGJlIGNoYW5nZWQgdG8gYSBub24gZXJyb3Igc3RhdGUuXG4gICAgICovXG4gICAgc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdGhlIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCB0byB0aGUgcHJveHkgYW5kIGRlc3RpbmF0aW9uLlxuICAgICAqIEBwYXJhbSBleGlzdGluZ1NvY2tldCBDb25uZWN0ZWQgc29ja2V0IHRvIHVzZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZSAoaW50ZXJuYWwgdXNlKS5cbiAgICAgKi9cbiAgICBjb25uZWN0KGV4aXN0aW5nU29ja2V0KSB7XG4gICAgICAgIHRoaXMub25EYXRhUmVjZWl2ZWQgPSAoZGF0YSkgPT4gdGhpcy5vbkRhdGFSZWNlaXZlZEhhbmRsZXIoZGF0YSk7XG4gICAgICAgIHRoaXMub25DbG9zZSA9ICgpID0+IHRoaXMub25DbG9zZUhhbmRsZXIoKTtcbiAgICAgICAgdGhpcy5vbkVycm9yID0gKGVycikgPT4gdGhpcy5vbkVycm9ySGFuZGxlcihlcnIpO1xuICAgICAgICB0aGlzLm9uQ29ubmVjdCA9ICgpID0+IHRoaXMub25Db25uZWN0SGFuZGxlcigpO1xuICAgICAgICAvLyBTdGFydCB0aW1lb3V0IHRpbWVyIChkZWZhdWx0cyB0byAzMCBzZWNvbmRzKVxuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbkVzdGFibGlzaGVkVGltZW91dCgpLCB0aGlzLm9wdGlvbnMudGltZW91dCB8fCBjb25zdGFudHNfMS5ERUZBVUxUX1RJTUVPVVQpO1xuICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHVucmVmIGlzIGF2YWlsYWJsZSBhcyBpdCBkaWZmZXJzIGZyb20gYnJvd3NlciB0byBOb2RlSlMgKCMzMylcbiAgICAgICAgaWYgKHRpbWVyLnVucmVmICYmIHR5cGVvZiB0aW1lci51bnJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGltZXIudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBhbiBleGlzdGluZyBzb2NrZXQgaXMgcHJvdmlkZWQsIHVzZSBpdCB0byBuZWdvdGlhdGUgU09DS1MgaGFuZHNoYWtlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IFNvY2tldC5cbiAgICAgICAgaWYgKGV4aXN0aW5nU29ja2V0KSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldCA9IGV4aXN0aW5nU29ja2V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgbmV0LlNvY2tldCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEF0dGFjaCBTb2NrZXQgZXJyb3IgaGFuZGxlcnMuXG4gICAgICAgIHRoaXMuc29ja2V0Lm9uY2UoJ2Nsb3NlJywgdGhpcy5vbkNsb3NlKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25jZSgnZXJyb3InLCB0aGlzLm9uRXJyb3IpO1xuICAgICAgICB0aGlzLnNvY2tldC5vbmNlKCdjb25uZWN0JywgdGhpcy5vbkNvbm5lY3QpO1xuICAgICAgICB0aGlzLnNvY2tldC5vbignZGF0YScsIHRoaXMub25EYXRhUmVjZWl2ZWQpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuQ29ubmVjdGluZyk7XG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlciA9IG5ldyByZWNlaXZlYnVmZmVyXzEuUmVjZWl2ZUJ1ZmZlcigpO1xuICAgICAgICBpZiAoZXhpc3RpbmdTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ2Nvbm5lY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmNvbm5lY3QodGhpcy5nZXRTb2NrZXRPcHRpb25zKCkpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZXRfdGNwX25vZGVsYXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zZXRfdGNwX25vZGVsYXkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZXROb0RlbGF5KCEhdGhpcy5vcHRpb25zLnNldF90Y3Bfbm9kZWxheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGlzdGVuIGZvciBlc3RhYmxpc2hlZCBldmVudCBzbyB3ZSBjYW4gcmUtZW1pdCBhbnkgZXhjZXNzIGRhdGEgcmVjZWl2ZWQgZHVyaW5nIGhhbmRzaGFrZXMuXG4gICAgICAgIHRoaXMucHJlcGVuZE9uY2VMaXN0ZW5lcignZXN0YWJsaXNoZWQnLCAoaW5mbykgPT4ge1xuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhjZXNzRGF0YSA9IHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQodGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGluZm8uc29ja2V0LmVtaXQoJ2RhdGEnLCBleGNlc3NEYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5mby5zb2NrZXQucmVzdW1lKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFNvY2tldCBvcHRpb25zIChkZWZhdWx0cyBob3N0L3BvcnQgdG8gb3B0aW9ucy5wcm94eS5ob3N0L29wdGlvbnMucHJveHkucG9ydClcbiAgICBnZXRTb2NrZXRPcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMuc29ja2V0X29wdGlvbnMpLCB7IGhvc3Q6IHRoaXMub3B0aW9ucy5wcm94eS5ob3N0IHx8IHRoaXMub3B0aW9ucy5wcm94eS5pcGFkZHJlc3MsIHBvcnQ6IHRoaXMub3B0aW9ucy5wcm94eS5wb3J0IH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGludGVybmFsIFNvY2tzIHRpbWVvdXQgY2FsbGJhY2suXG4gICAgICogTm90ZTogSWYgdGhlIFNvY2tzIGNsaWVudCBpcyBub3QgQm91bmRXYWl0aW5nRm9yQ29ubmVjdGlvbiBvciBFc3RhYmxpc2hlZCwgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQuXG4gICAgICovXG4gICAgb25Fc3RhYmxpc2hlZFRpbWVvdXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkVzdGFibGlzaGVkICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlICE9PSBjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkJvdW5kV2FpdGluZ0ZvckNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoY29uc3RhbnRzXzEuRVJST1JTLlByb3h5Q29ubmVjdGlvblRpbWVkT3V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIFNvY2tldCBjb25uZWN0IGV2ZW50LlxuICAgICAqL1xuICAgIG9uQ29ubmVjdEhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Db25uZWN0ZWQpO1xuICAgICAgICAvLyBTZW5kIGluaXRpYWwgaGFuZHNoYWtlLlxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5LnR5cGUgPT09IDQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZFNvY2tzNEluaXRpYWxIYW5kc2hha2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZFNvY2tzNUluaXRpYWxIYW5kc2hha2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEluaXRpYWxIYW5kc2hha2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIFNvY2tldCBkYXRhIGV2ZW50LlxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgb25EYXRhUmVjZWl2ZWRIYW5kbGVyKGRhdGEpIHtcbiAgICAgICAgLypcbiAgICAgICAgICBBbGwgcmVjZWl2ZWQgZGF0YSBpcyBhcHBlbmRlZCB0byBhIFJlY2VpdmVCdWZmZXIuXG4gICAgICAgICAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgYWxsIHRoZSBkYXRhIHdlIG5lZWQgaXMgcmVjZWl2ZWQgYmVmb3JlIHdlIGF0dGVtcHQgdG8gcHJvY2VzcyBpdC5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWNlaXZlQnVmZmVyLmFwcGVuZChkYXRhKTtcbiAgICAgICAgLy8gUHJvY2VzcyBkYXRhIHRoYXQgd2UgaGF2ZS5cbiAgICAgICAgdGhpcy5wcm9jZXNzRGF0YSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHByb2Nlc3Npbmcgb2YgdGhlIGRhdGEgd2UgaGF2ZSByZWNlaXZlZC5cbiAgICAgKi9cbiAgICBwcm9jZXNzRGF0YSgpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSB0byBwcm9jZXNzIHRoZSBuZXh0IHN0ZXAgaW4gdGhlIFNPQ0tTIGhhbmRzaGFrZSwgcHJvY2VlZC5cbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhdGUgIT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXN0YWJsaXNoZWQgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgIT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXJyb3IgJiZcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5sZW5ndGggPj0gdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplKSB7XG4gICAgICAgICAgICAvLyBTZW50IGluaXRpYWwgaGFuZHNoYWtlLCB3YWl0aW5nIGZvciByZXNwb25zZS5cbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLlNlbnRJbml0aWFsSGFuZHNoYWtlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wcm94eS50eXBlID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNvY2tzIHY0IG9ubHkgaGFzIG9uZSBoYW5kc2hha2UgcmVzcG9uc2UuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU29ja3M0RmluYWxIYW5kc2hha2VSZXNwb25zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU29ja3MgdjUgaGFzIHR3byBoYW5kc2hha2VzLCBoYW5kbGUgaW5pdGlhbCBvbmUgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbml0aWFsU29ja3M1SGFuZHNoYWtlUmVzcG9uc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2VudCBhdXRoIHJlcXVlc3QgZm9yIFNvY2tzIHY1LCB3YWl0aW5nIGZvciByZXNwb25zZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbml0aWFsU29ja3M1QXV0aGVudGljYXRpb25IYW5kc2hha2VSZXNwb25zZSgpO1xuICAgICAgICAgICAgICAgIC8vIFNlbnQgZmluYWwgU29ja3MgdjUgaGFuZHNoYWtlLCB3YWl0aW5nIGZvciBmaW5hbCByZXNwb25zZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEZpbmFsSGFuZHNoYWtlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTb2NrczVGaW5hbEhhbmRzaGFrZVJlc3BvbnNlKCk7XG4gICAgICAgICAgICAgICAgLy8gU29ja3MgQklORCBlc3RhYmxpc2hlZC4gV2FpdGluZyBmb3IgcmVtb3RlIGNvbm5lY3Rpb24gdmlhIHByb3h5LlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Cb3VuZFdhaXRpbmdGb3JDb25uZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wcm94eS50eXBlID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU29ja3M0SW5jb21pbmdDb25uZWN0aW9uUmVzcG9uc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU29ja3M1SW5jb21pbmdDb25uZWN0aW9uUmVzcG9uc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGNvbnN0YW50c18xLkVSUk9SUy5JbnRlcm5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIFNvY2tldCBjbG9zZSBldmVudC5cbiAgICAgKiBAcGFyYW0gaGFkX2Vycm9yXG4gICAgICovXG4gICAgb25DbG9zZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoY29uc3RhbnRzXzEuRVJST1JTLlNvY2tldENsb3NlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja2V0IGVycm9yIGV2ZW50LlxuICAgICAqIEBwYXJhbSBlcnJcbiAgICAgKi9cbiAgICBvbkVycm9ySGFuZGxlcihlcnIpIHtcbiAgICAgICAgdGhpcy5jbG9zZVNvY2tldChlcnIubWVzc2FnZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgaW50ZXJuYWwgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSB1bmRlcmx5aW5nIFNvY2tldC5cbiAgICAgKi9cbiAgICByZW1vdmVJbnRlcm5hbFNvY2tldEhhbmRsZXJzKCkge1xuICAgICAgICAvLyBQYXVzZXMgZGF0YSBmbG93IG9mIHRoZSBzb2NrZXQgKHRoaXMgaXMgaW50ZXJuYWxseSByZXN1bWVkIGFmdGVyICdlc3RhYmxpc2hlZCcgaXMgZW1pdHRlZClcbiAgICAgICAgdGhpcy5zb2NrZXQucGF1c2UoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCB0aGlzLm9uRGF0YVJlY2VpdmVkKTtcbiAgICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy5vbkNsb3NlKTtcbiAgICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5vbkVycm9yKTtcbiAgICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Nvbm5lY3QnLCB0aGlzLm9uQ29ubmVjdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyBhbmQgZGVzdHJveXMgdGhlIHVuZGVybHlpbmcgU29ja2V0LiBFbWl0cyBhbiBlcnJvciBldmVudC5cbiAgICAgKiBAcGFyYW0gZXJyIHsgU3RyaW5nIH0gQW4gZXJyb3Igc3RyaW5nIHRvIGluY2x1ZGUgaW4gZXJyb3IgZXZlbnQuXG4gICAgICovXG4gICAgY2xvc2VTb2NrZXQoZXJyKSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSBvbmx5IG9uZSAnZXJyb3InIGV2ZW50IGlzIGZpcmVkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhpcyBTb2Nrc0NsaWVudCBpbnN0YW5jZS5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFNldCBpbnRlcm5hbCBzdGF0ZSB0byBFcnJvci5cbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5FcnJvcik7XG4gICAgICAgICAgICAvLyBEZXN0cm95IFNvY2tldFxuICAgICAgICAgICAgdGhpcy5zb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGludGVybmFsIGxpc3RlbmVyc1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVJbnRlcm5hbFNvY2tldEhhbmRsZXJzKCk7XG4gICAgICAgICAgICAvLyBGaXJlICdlcnJvcicgZXZlbnQuXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGVyciwgdGhpcy5vcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgaW5pdGlhbCBTb2NrcyB2NCBoYW5kc2hha2UgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBzZW5kU29ja3M0SW5pdGlhbEhhbmRzaGFrZSgpIHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gdGhpcy5vcHRpb25zLnByb3h5LnVzZXJJZCB8fCAnJztcbiAgICAgICAgY29uc3QgYnVmZiA9IG5ldyBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlcigpO1xuICAgICAgICBidWZmLndyaXRlVUludDgoMHgwNCk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OChjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmRbdGhpcy5vcHRpb25zLmNvbW1hbmRdKTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQxNkJFKHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbi5wb3J0KTtcbiAgICAgICAgLy8gU29ja3MgNCAoSVB2NClcbiAgICAgICAgaWYgKG5ldC5pc0lQdjQodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpKSB7XG4gICAgICAgICAgICBidWZmLndyaXRlQnVmZmVyKCgwLCBoZWxwZXJzXzEuaXBUb0J1ZmZlcikodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpKTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVTdHJpbmdOVCh1c2VySWQpO1xuICAgICAgICAgICAgLy8gU29ja3MgNGEgKGhvc3RuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KDB4MDApO1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KDB4MDApO1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KDB4MDApO1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KDB4MDEpO1xuICAgICAgICAgICAgYnVmZi53cml0ZVN0cmluZ05UKHVzZXJJZCk7XG4gICAgICAgICAgICBidWZmLndyaXRlU3RyaW5nTlQodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9XG4gICAgICAgICAgICBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M0UmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc29ja2V0LndyaXRlKGJ1ZmYudG9CdWZmZXIoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja3MgdjQgaGFuZHNoYWtlIHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgaGFuZGxlU29ja3M0RmluYWxIYW5kc2hha2VSZXNwb25zZSgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoOCk7XG4gICAgICAgIGlmIChkYXRhWzFdICE9PSBjb25zdGFudHNfMS5Tb2NrczRSZXNwb25zZS5HcmFudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGAke2NvbnN0YW50c18xLkVSUk9SUy5Tb2NrczRQcm94eVJlamVjdGVkQ29ubmVjdGlvbn0gLSAoJHtjb25zdGFudHNfMS5Tb2NrczRSZXNwb25zZVtkYXRhWzFdXX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBCaW5kIHJlc3BvbnNlXG4gICAgICAgICAgICBpZiAoY29uc3RhbnRzXzEuU29ja3NDb21tYW5kW3RoaXMub3B0aW9ucy5jb21tYW5kXSA9PT0gY29uc3RhbnRzXzEuU29ja3NDb21tYW5kLmJpbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZmID0gc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIuZnJvbUJ1ZmZlcihkYXRhKTtcbiAgICAgICAgICAgICAgICBidWZmLnJlYWRPZmZzZXQgPSAyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW90ZUhvc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJ1ZmYucmVhZFVJbnQxNkJFKCksXG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6ICgwLCBoZWxwZXJzXzEuaW50MzJUb0lwdjQpKGJ1ZmYucmVhZFVJbnQzMkJFKCkpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gSWYgaG9zdCBpcyAwLjAuMC4wLCBzZXQgdG8gcHJveHkgaG9zdC5cbiAgICAgICAgICAgICAgICBpZiAocmVtb3RlSG9zdC5ob3N0ID09PSAnMC4wLjAuMCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlSG9zdC5ob3N0ID0gdGhpcy5vcHRpb25zLnByb3h5LmlwYWRkcmVzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkJvdW5kV2FpdGluZ0ZvckNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYm91bmQnLCB7IHJlbW90ZUhvc3QsIHNvY2tldDogdGhpcy5zb2NrZXQgfSk7XG4gICAgICAgICAgICAgICAgLy8gQ29ubmVjdCByZXNwb25zZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkVzdGFibGlzaGVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUludGVybmFsU29ja2V0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2VzdGFibGlzaGVkJywgeyBzb2NrZXQ6IHRoaXMuc29ja2V0IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja3MgdjQgaW5jb21pbmcgY29ubmVjdGlvbiByZXF1ZXN0IChCSU5EKVxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgaGFuZGxlU29ja3M0SW5jb21pbmdDb25uZWN0aW9uUmVzcG9uc2UoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlY2VpdmVCdWZmZXIuZ2V0KDgpO1xuICAgICAgICBpZiAoZGF0YVsxXSAhPT0gY29uc3RhbnRzXzEuU29ja3M0UmVzcG9uc2UuR3JhbnRlZCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVNvY2tldChgJHtjb25zdGFudHNfMS5FUlJPUlMuU29ja3M0UHJveHlSZWplY3RlZEluY29taW5nQm91bmRDb25uZWN0aW9ufSAtICgke2NvbnN0YW50c18xLlNvY2tzNFJlc3BvbnNlW2RhdGFbMV1dfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmYgPSBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlci5mcm9tQnVmZmVyKGRhdGEpO1xuICAgICAgICAgICAgYnVmZi5yZWFkT2Zmc2V0ID0gMjtcbiAgICAgICAgICAgIGNvbnN0IHJlbW90ZUhvc3QgPSB7XG4gICAgICAgICAgICAgICAgcG9ydDogYnVmZi5yZWFkVUludDE2QkUoKSxcbiAgICAgICAgICAgICAgICBob3N0OiAoMCwgaGVscGVyc18xLmludDMyVG9JcHY0KShidWZmLnJlYWRVSW50MzJCRSgpKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXN0YWJsaXNoZWQpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVJbnRlcm5hbFNvY2tldEhhbmRsZXJzKCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2VzdGFibGlzaGVkJywgeyByZW1vdGVIb3N0LCBzb2NrZXQ6IHRoaXMuc29ja2V0IH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGluaXRpYWwgU29ja3MgdjUgaGFuZHNoYWtlIHJlcXVlc3QuXG4gICAgICovXG4gICAgc2VuZFNvY2tzNUluaXRpYWxIYW5kc2hha2UoKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmYgPSBuZXcgc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIoKTtcbiAgICAgICAgLy8gQnkgZGVmYXVsdCB3ZSBhbHdheXMgc3VwcG9ydCBubyBhdXRoLlxuICAgICAgICBjb25zdCBzdXBwb3J0ZWRBdXRoTWV0aG9kcyA9IFtjb25zdGFudHNfMS5Tb2NrczVBdXRoLk5vQXV0aF07XG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IHRlbGwgdGhlIHByb3h5IHdlIHN1cHBvcnQgdXNlci9wYXNzIGF1dGggaWYgYXV0aCBpbmZvIGlzIGFjdHVhbGx5IHByb3ZpZGVkLlxuICAgICAgICAvLyBOb3RlOiBBcyBvZiBUb3IgdjAuMy41LjcrLCBpZiB1c2VyL3Bhc3MgYXV0aCBpcyBhbiBvcHRpb24gZnJvbSB0aGUgY2xpZW50LCBieSBkZWZhdWx0IGl0IHdpbGwgYWx3YXlzIHRha2UgcHJpb3JpdHkuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkudXNlcklkIHx8IHRoaXMub3B0aW9ucy5wcm94eS5wYXNzd29yZCkge1xuICAgICAgICAgICAgc3VwcG9ydGVkQXV0aE1ldGhvZHMucHVzaChjb25zdGFudHNfMS5Tb2NrczVBdXRoLlVzZXJQYXNzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDdXN0b20gYXV0aCBtZXRob2Q/XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN1cHBvcnRlZEF1dGhNZXRob2RzLnB1c2godGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX21ldGhvZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnVpbGQgaGFuZHNoYWtlIHBhY2tldFxuICAgICAgICBidWZmLndyaXRlVUludDgoMHgwNSk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OChzdXBwb3J0ZWRBdXRoTWV0aG9kcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGNvbnN0IGF1dGhNZXRob2Qgb2Ygc3VwcG9ydGVkQXV0aE1ldGhvZHMpIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChhdXRoTWV0aG9kKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPVxuICAgICAgICAgICAgY29uc3RhbnRzXzEuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTLlNvY2tzNUluaXRpYWxIYW5kc2hha2VSZXNwb25zZTtcbiAgICAgICAgdGhpcy5zb2NrZXQud3JpdGUoYnVmZi50b0J1ZmZlcigpKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLlNlbnRJbml0aWFsSGFuZHNoYWtlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBpbml0aWFsIFNvY2tzIHY1IGhhbmRzaGFrZSByZXNwb25zZS5cbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqL1xuICAgIGhhbmRsZUluaXRpYWxTb2NrczVIYW5kc2hha2VSZXNwb25zZSgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoMik7XG4gICAgICAgIGlmIChkYXRhWzBdICE9PSAweDA1KSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3M1SW50aWFpbEhhbmRzaGFrZVNvY2tzVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YVsxXSA9PT0gY29uc3RhbnRzXzEuU09DS1M1X05PX0FDQ0VQVEFCTEVfQVVUSCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVNvY2tldChjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzNUluaXRpYWxIYW5kc2hha2VOb0FjY2VwdGVkQXV0aFR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgc2VsZWN0ZWQgU29ja3MgdjUgYXV0aCBtZXRob2QgaXMgbm8gYXV0aCwgc2VuZCBmaW5hbCBoYW5kc2hha2UgcmVxdWVzdC5cbiAgICAgICAgICAgIGlmIChkYXRhWzFdID09PSBjb25zdGFudHNfMS5Tb2NrczVBdXRoLk5vQXV0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja3M1Q2hvc2VuQXV0aFR5cGUgPSBjb25zdGFudHNfMS5Tb2NrczVBdXRoLk5vQXV0aDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRTb2NrczVDb21tYW5kUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIC8vIElmIHNlbGVjdGVkIFNvY2tzIHY1IGF1dGggbWV0aG9kIGlzIHVzZXIvcGFzc3dvcmQsIHNlbmQgYXV0aCBoYW5kc2hha2UuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkYXRhWzFdID09PSBjb25zdGFudHNfMS5Tb2NrczVBdXRoLlVzZXJQYXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrczVDaG9zZW5BdXRoVHlwZSA9IGNvbnN0YW50c18xLlNvY2tzNUF1dGguVXNlclBhc3M7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kU29ja3M1VXNlclBhc3NBdXRoZW50aWNhdGlvbigpO1xuICAgICAgICAgICAgICAgIC8vIElmIHNlbGVjdGVkIFNvY2tzIHY1IGF1dGggbWV0aG9kIGlzIHRoZSBjdXN0b21fYXV0aF9tZXRob2QsIHNlbmQgY3VzdG9tIGhhbmRzaGFrZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRhdGFbMV0gPT09IHRoaXMub3B0aW9ucy5wcm94eS5jdXN0b21fYXV0aF9tZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tzNUNob3NlbkF1dGhUeXBlID0gdGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX21ldGhvZDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRTb2NrczVDdXN0b21BdXRoZW50aWNhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVNvY2tldChjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzNUluaXRpYWxIYW5kc2hha2VVbmtub3duQXV0aFR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIFNvY2tzIHY1IHVzZXIgJiBwYXNzd29yZCBhdXRoIGhhbmRzaGFrZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IE5vIGF1dGggYW5kIHVzZXIvcGFzcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAgICAgKi9cbiAgICBzZW5kU29ja3M1VXNlclBhc3NBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gdGhpcy5vcHRpb25zLnByb3h5LnVzZXJJZCB8fCAnJztcbiAgICAgICAgY29uc3QgcGFzc3dvcmQgPSB0aGlzLm9wdGlvbnMucHJveHkucGFzc3dvcmQgfHwgJyc7XG4gICAgICAgIGNvbnN0IGJ1ZmYgPSBuZXcgc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIoKTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KDB4MDEpO1xuICAgICAgICBidWZmLndyaXRlVUludDgoQnVmZmVyLmJ5dGVMZW5ndGgodXNlcklkKSk7XG4gICAgICAgIGJ1ZmYud3JpdGVTdHJpbmcodXNlcklkKTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KEJ1ZmZlci5ieXRlTGVuZ3RoKHBhc3N3b3JkKSk7XG4gICAgICAgIGJ1ZmYud3JpdGVTdHJpbmcocGFzc3dvcmQpO1xuICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPVxuICAgICAgICAgICAgY29uc3RhbnRzXzEuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTLlNvY2tzNVVzZXJQYXNzQXV0aGVudGljYXRpb25SZXNwb25zZTtcbiAgICAgICAgdGhpcy5zb2NrZXQud3JpdGUoYnVmZi50b0J1ZmZlcigpKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLlNlbnRBdXRoZW50aWNhdGlvbik7XG4gICAgfVxuICAgIHNlbmRTb2NrczVDdXN0b21BdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX3Jlc3BvbnNlX3NpemU7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC53cml0ZSh5aWVsZCB0aGlzLm9wdGlvbnMucHJveHkuY3VzdG9tX2F1dGhfcmVxdWVzdF9oYW5kbGVyKCkpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLlNlbnRBdXRoZW50aWNhdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoYW5kbGVTb2NrczVDdXN0b21BdXRoSGFuZHNoYWtlUmVzcG9uc2UoZGF0YSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMub3B0aW9ucy5wcm94eS5jdXN0b21fYXV0aF9yZXNwb25zZV9oYW5kbGVyKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGFuZGxlU29ja3M1QXV0aGVudGljYXRpb25Ob0F1dGhIYW5kc2hha2VSZXNwb25zZShkYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YVsxXSA9PT0gMHgwMDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhbmRsZVNvY2tzNUF1dGhlbnRpY2F0aW9uVXNlclBhc3NIYW5kc2hha2VSZXNwb25zZShkYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YVsxXSA9PT0gMHgwMDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja3MgdjUgYXV0aCBoYW5kc2hha2UgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVJbml0aWFsU29ja3M1QXV0aGVudGljYXRpb25IYW5kc2hha2VSZXNwb25zZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5SZWNlaXZlZEF1dGhlbnRpY2F0aW9uUmVzcG9uc2UpO1xuICAgICAgICAgICAgbGV0IGF1dGhSZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvY2tzNUNob3NlbkF1dGhUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVBdXRoLk5vQXV0aCkge1xuICAgICAgICAgICAgICAgIGF1dGhSZXN1bHQgPSB5aWVsZCB0aGlzLmhhbmRsZVNvY2tzNUF1dGhlbnRpY2F0aW9uTm9BdXRoSGFuZHNoYWtlUmVzcG9uc2UodGhpcy5yZWNlaXZlQnVmZmVyLmdldCgyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNvY2tzNUNob3NlbkF1dGhUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVBdXRoLlVzZXJQYXNzKSB7XG4gICAgICAgICAgICAgICAgYXV0aFJlc3VsdCA9XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuaGFuZGxlU29ja3M1QXV0aGVudGljYXRpb25Vc2VyUGFzc0hhbmRzaGFrZVJlc3BvbnNlKHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoMikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zb2NrczVDaG9zZW5BdXRoVHlwZSA9PT0gdGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX21ldGhvZCkge1xuICAgICAgICAgICAgICAgIGF1dGhSZXN1bHQgPSB5aWVsZCB0aGlzLmhhbmRsZVNvY2tzNUN1c3RvbUF1dGhIYW5kc2hha2VSZXNwb25zZSh0aGlzLnJlY2VpdmVCdWZmZXIuZ2V0KHRoaXMub3B0aW9ucy5wcm94eS5jdXN0b21fYXV0aF9yZXNwb25zZV9zaXplKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWF1dGhSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGNvbnN0YW50c18xLkVSUk9SUy5Tb2NrczVBdXRoZW50aWNhdGlvbkZhaWxlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRTb2NrczVDb21tYW5kUmVxdWVzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgU29ja3MgdjUgZmluYWwgaGFuZHNoYWtlIHJlcXVlc3QuXG4gICAgICovXG4gICAgc2VuZFNvY2tzNUNvbW1hbmRSZXF1ZXN0KCkge1xuICAgICAgICBjb25zdCBidWZmID0gbmV3IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyKCk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OCgweDA1KTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KGNvbnN0YW50c18xLlNvY2tzQ29tbWFuZFt0aGlzLm9wdGlvbnMuY29tbWFuZF0pO1xuICAgICAgICBidWZmLndyaXRlVUludDgoMHgwMCk7XG4gICAgICAgIC8vIGlwdjQsIGlwdjYsIGRvbWFpbj9cbiAgICAgICAgaWYgKG5ldC5pc0lQdjQodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpKSB7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2NCk7XG4gICAgICAgICAgICBidWZmLndyaXRlQnVmZmVyKCgwLCBoZWxwZXJzXzEuaXBUb0J1ZmZlcikodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuZXQuaXNJUHY2KHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbi5ob3N0KSkge1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLklQdjYpO1xuICAgICAgICAgICAgYnVmZi53cml0ZUJ1ZmZlcigoMCwgaGVscGVyc18xLmlwVG9CdWZmZXIpKHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbi5ob3N0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSG9zdG5hbWUpO1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbi5ob3N0Lmxlbmd0aCk7XG4gICAgICAgICAgICBidWZmLndyaXRlU3RyaW5nKHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbi5ob3N0KTtcbiAgICAgICAgfVxuICAgICAgICBidWZmLndyaXRlVUludDE2QkUodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLnBvcnQpO1xuICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPVxuICAgICAgICAgICAgY29uc3RhbnRzXzEuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTLlNvY2tzNVJlc3BvbnNlSGVhZGVyO1xuICAgICAgICB0aGlzLnNvY2tldC53cml0ZShidWZmLnRvQnVmZmVyKCkpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEZpbmFsSGFuZHNoYWtlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBTb2NrcyB2NSBmaW5hbCBoYW5kc2hha2UgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVTb2NrczVGaW5hbEhhbmRzaGFrZVJlc3BvbnNlKCkge1xuICAgICAgICAvLyBQZWVrIGF0IGF2YWlsYWJsZSBkYXRhICh3ZSBuZWVkIGF0IGxlYXN0IDUgYnl0ZXMgdG8gZ2V0IHRoZSBob3N0bmFtZSBsZW5ndGgpXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMucmVjZWl2ZUJ1ZmZlci5wZWVrKDUpO1xuICAgICAgICBpZiAoaGVhZGVyWzBdICE9PSAweDA1IHx8IGhlYWRlclsxXSAhPT0gY29uc3RhbnRzXzEuU29ja3M1UmVzcG9uc2UuR3JhbnRlZCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVNvY2tldChgJHtjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzNUZpbmFsSGFuZHNoYWtlUmVqZWN0ZWR9IC0gJHtjb25zdGFudHNfMS5Tb2NrczVSZXNwb25zZVtoZWFkZXJbMV1dfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVhZCBhZGRyZXNzIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NUeXBlID0gaGVhZGVyWzNdO1xuICAgICAgICAgICAgbGV0IHJlbW90ZUhvc3Q7XG4gICAgICAgICAgICBsZXQgYnVmZjtcbiAgICAgICAgICAgIC8vIElQdjRcbiAgICAgICAgICAgIGlmIChhZGRyZXNzVHlwZSA9PT0gY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2NCkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFOZWVkZWQgPSBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1UmVzcG9uc2VJUHY0O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlY2VpdmVCdWZmZXIubGVuZ3RoIDwgZGF0YU5lZWRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPSBkYXRhTmVlZGVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmYgPSBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlci5mcm9tQnVmZmVyKHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoZGF0YU5lZWRlZCkuc2xpY2UoNCkpO1xuICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6ICgwLCBoZWxwZXJzXzEuaW50MzJUb0lwdjQpKGJ1ZmYucmVhZFVJbnQzMkJFKCkpLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBidWZmLnJlYWRVSW50MTZCRSgpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gSWYgZ2l2ZW4gaG9zdCBpcyAwLjAuMC4wLCBhc3N1bWUgcmVtb3RlIHByb3h5IGlwIGluc3RlYWQuXG4gICAgICAgICAgICAgICAgaWYgKHJlbW90ZUhvc3QuaG9zdCA9PT0gJzAuMC4wLjAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QuaG9zdCA9IHRoaXMub3B0aW9ucy5wcm94eS5pcGFkZHJlc3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEhvc3RuYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzVHlwZSA9PT0gY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSG9zdG5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0TGVuZ3RoID0gaGVhZGVyWzRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFOZWVkZWQgPSBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1UmVzcG9uc2VIb3N0bmFtZShob3N0TGVuZ3RoKTsgLy8gaGVhZGVyICsgaG9zdCBsZW5ndGggKyBob3N0ICsgcG9ydFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlY2VpdmVCdWZmZXIubGVuZ3RoIDwgZGF0YU5lZWRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPSBkYXRhTmVlZGVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmYgPSBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlci5mcm9tQnVmZmVyKHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoZGF0YU5lZWRlZCkuc2xpY2UoNSkpO1xuICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6IGJ1ZmYucmVhZFN0cmluZyhob3N0TGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgcG9ydDogYnVmZi5yZWFkVUludDE2QkUoKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8vIElQdjZcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJlc3NUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY2KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YU5lZWRlZCA9IGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczVSZXNwb25zZUlQdjY7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjZWl2ZUJ1ZmZlci5sZW5ndGggPCBkYXRhTmVlZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9IGRhdGFOZWVkZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIodGhpcy5yZWNlaXZlQnVmZmVyLmdldChkYXRhTmVlZGVkKS5zbGljZSg0KSk7XG4gICAgICAgICAgICAgICAgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogaXBfYWRkcmVzc18xLkFkZHJlc3M2LmZyb21CeXRlQXJyYXkoQXJyYXkuZnJvbShidWZmLnJlYWRCdWZmZXIoMTYpKSkuY2Fub25pY2FsRm9ybSgpLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBidWZmLnJlYWRVSW50MTZCRSgpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBoYXZlIGV2ZXJ5dGhpbmcgd2UgbmVlZFxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLlJlY2VpdmVkRmluYWxSZXNwb25zZSk7XG4gICAgICAgICAgICAvLyBJZiB1c2luZyBDT05ORUNULCB0aGUgY2xpZW50IGlzIG5vdyBpbiB0aGUgZXN0YWJsaXNoZWQgc3RhdGUuXG4gICAgICAgICAgICBpZiAoY29uc3RhbnRzXzEuU29ja3NDb21tYW5kW3RoaXMub3B0aW9ucy5jb21tYW5kXSA9PT0gY29uc3RhbnRzXzEuU29ja3NDb21tYW5kLmNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXN0YWJsaXNoZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW50ZXJuYWxTb2NrZXRIYW5kbGVycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXN0YWJsaXNoZWQnLCB7IHJlbW90ZUhvc3QsIHNvY2tldDogdGhpcy5zb2NrZXQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmRbdGhpcy5vcHRpb25zLmNvbW1hbmRdID09PSBjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmQuYmluZCkge1xuICAgICAgICAgICAgICAgIC8qIElmIHVzaW5nIEJJTkQsIHRoZSBTb2NrcyBjbGllbnQgaXMgbm93IGluIEJvdW5kV2FpdGluZ0ZvckNvbm5lY3Rpb24gc3RhdGUuXG4gICAgICAgICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHRoZSByZW1vdGUgcHJveHkgc2VydmVyIGlzIHdhaXRpbmcgZm9yIGEgcmVtb3RlIGNvbm5lY3Rpb24gdG8gdGhlIGJvdW5kIHBvcnQuICovXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkJvdW5kV2FpdGluZ0ZvckNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczVSZXNwb25zZUhlYWRlcjtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2JvdW5kJywgeyByZW1vdGVIb3N0LCBzb2NrZXQ6IHRoaXMuc29ja2V0IH0pO1xuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICBJZiB1c2luZyBBc3NvY2lhdGUsIHRoZSBTb2NrcyBjbGllbnQgaXMgbm93IEVzdGFibGlzaGVkLiBBbmQgdGhlIHByb3h5IHNlcnZlciBpcyBub3cgYWNjZXB0aW5nIFVEUCBwYWNrZXRzIGF0IHRoZVxuICAgICAgICAgICAgICAgICAgZ2l2ZW4gYm91bmQgcG9ydC4gVGhpcyBpbml0aWFsIFNvY2tzIFRDUCBjb25uZWN0aW9uIG11c3QgcmVtYWluIG9wZW4gZm9yIHRoZSBVRFAgcmVsYXkgdG8gY29udGludWUgdG8gd29yay5cbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29uc3RhbnRzXzEuU29ja3NDb21tYW5kW3RoaXMub3B0aW9ucy5jb21tYW5kXSA9PT0gY29uc3RhbnRzXzEuU29ja3NDb21tYW5kLmFzc29jaWF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Fc3RhYmxpc2hlZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJbnRlcm5hbFNvY2tldEhhbmRsZXJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlc3RhYmxpc2hlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlSG9zdCxcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0OiB0aGlzLnNvY2tldCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIFNvY2tzIHY1IGluY29taW5nIGNvbm5lY3Rpb24gcmVxdWVzdCAoQklORCkuXG4gICAgICovXG4gICAgaGFuZGxlU29ja3M1SW5jb21pbmdDb25uZWN0aW9uUmVzcG9uc2UoKSB7XG4gICAgICAgIC8vIFBlZWsgYXQgYXZhaWxhYmxlIGRhdGEgKHdlIG5lZWQgYXQgbGVhc3QgNSBieXRlcyB0byBnZXQgdGhlIGhvc3RuYW1lIGxlbmd0aClcbiAgICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5yZWNlaXZlQnVmZmVyLnBlZWsoNSk7XG4gICAgICAgIGlmIChoZWFkZXJbMF0gIT09IDB4MDUgfHwgaGVhZGVyWzFdICE9PSBjb25zdGFudHNfMS5Tb2NrczVSZXNwb25zZS5HcmFudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGAke2NvbnN0YW50c18xLkVSUk9SUy5Tb2NrczVQcm94eVJlamVjdGVkSW5jb21pbmdCb3VuZENvbm5lY3Rpb259IC0gJHtjb25zdGFudHNfMS5Tb2NrczVSZXNwb25zZVtoZWFkZXJbMV1dfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVhZCBhZGRyZXNzIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NUeXBlID0gaGVhZGVyWzNdO1xuICAgICAgICAgICAgbGV0IHJlbW90ZUhvc3Q7XG4gICAgICAgICAgICBsZXQgYnVmZjtcbiAgICAgICAgICAgIC8vIElQdjRcbiAgICAgICAgICAgIGlmIChhZGRyZXNzVHlwZSA9PT0gY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2NCkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFOZWVkZWQgPSBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1UmVzcG9uc2VJUHY0O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlY2VpdmVCdWZmZXIubGVuZ3RoIDwgZGF0YU5lZWRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPSBkYXRhTmVlZGVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmYgPSBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlci5mcm9tQnVmZmVyKHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoZGF0YU5lZWRlZCkuc2xpY2UoNCkpO1xuICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6ICgwLCBoZWxwZXJzXzEuaW50MzJUb0lwdjQpKGJ1ZmYucmVhZFVJbnQzMkJFKCkpLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBidWZmLnJlYWRVSW50MTZCRSgpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gSWYgZ2l2ZW4gaG9zdCBpcyAwLjAuMC4wLCBhc3N1bWUgcmVtb3RlIHByb3h5IGlwIGluc3RlYWQuXG4gICAgICAgICAgICAgICAgaWYgKHJlbW90ZUhvc3QuaG9zdCA9PT0gJzAuMC4wLjAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QuaG9zdCA9IHRoaXMub3B0aW9ucy5wcm94eS5pcGFkZHJlc3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEhvc3RuYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzVHlwZSA9PT0gY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSG9zdG5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0TGVuZ3RoID0gaGVhZGVyWzRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFOZWVkZWQgPSBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1UmVzcG9uc2VIb3N0bmFtZShob3N0TGVuZ3RoKTsgLy8gaGVhZGVyICsgaG9zdCBsZW5ndGggKyBwb3J0XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjZWl2ZUJ1ZmZlci5sZW5ndGggPCBkYXRhTmVlZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9IGRhdGFOZWVkZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIodGhpcy5yZWNlaXZlQnVmZmVyLmdldChkYXRhTmVlZGVkKS5zbGljZSg1KSk7XG4gICAgICAgICAgICAgICAgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogYnVmZi5yZWFkU3RyaW5nKGhvc3RMZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBidWZmLnJlYWRVSW50MTZCRSgpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gSVB2NlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWRkcmVzc1R5cGUgPT09IGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLklQdjYpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhTmVlZGVkID0gY29uc3RhbnRzXzEuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTLlNvY2tzNVJlc3BvbnNlSVB2NjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aCA8IGRhdGFOZWVkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplID0gZGF0YU5lZWRlZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmID0gc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIuZnJvbUJ1ZmZlcih0aGlzLnJlY2VpdmVCdWZmZXIuZ2V0KGRhdGFOZWVkZWQpLnNsaWNlKDQpKTtcbiAgICAgICAgICAgICAgICByZW1vdGVIb3N0ID0ge1xuICAgICAgICAgICAgICAgICAgICBob3N0OiBpcF9hZGRyZXNzXzEuQWRkcmVzczYuZnJvbUJ5dGVBcnJheShBcnJheS5mcm9tKGJ1ZmYucmVhZEJ1ZmZlcigxNikpKS5jYW5vbmljYWxGb3JtKCksXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJ1ZmYucmVhZFVJbnQxNkJFKCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Fc3RhYmxpc2hlZCk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUludGVybmFsU29ja2V0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXN0YWJsaXNoZWQnLCB7IHJlbW90ZUhvc3QsIHNvY2tldDogdGhpcy5zb2NrZXQgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHNvY2tzQ2xpZW50T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucyk7XG4gICAgfVxufVxuZXhwb3J0cy5Tb2Nrc0NsaWVudCA9IFNvY2tzQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29ja3NjbGllbnQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNPQ0tTNV9OT19BQ0NFUFRBQkxFX0FVVEggPSBleHBvcnRzLlNPQ0tTNV9DVVNUT01fQVVUSF9FTkQgPSBleHBvcnRzLlNPQ0tTNV9DVVNUT01fQVVUSF9TVEFSVCA9IGV4cG9ydHMuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTID0gZXhwb3J0cy5Tb2Nrc0NsaWVudFN0YXRlID0gZXhwb3J0cy5Tb2NrczVSZXNwb25zZSA9IGV4cG9ydHMuU29ja3M1SG9zdFR5cGUgPSBleHBvcnRzLlNvY2tzNUF1dGggPSBleHBvcnRzLlNvY2tzNFJlc3BvbnNlID0gZXhwb3J0cy5Tb2Nrc0NvbW1hbmQgPSBleHBvcnRzLkVSUk9SUyA9IGV4cG9ydHMuREVGQVVMVF9USU1FT1VUID0gdm9pZCAwO1xuY29uc3QgREVGQVVMVF9USU1FT1VUID0gMzAwMDA7XG5leHBvcnRzLkRFRkFVTFRfVElNRU9VVCA9IERFRkFVTFRfVElNRU9VVDtcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgRVJST1JTID0ge1xuICAgIEludmFsaWRTb2Nrc0NvbW1hbmQ6ICdBbiBpbnZhbGlkIFNPQ0tTIGNvbW1hbmQgd2FzIHByb3ZpZGVkLiBWYWxpZCBvcHRpb25zIGFyZSBjb25uZWN0LCBiaW5kLCBhbmQgYXNzb2NpYXRlLicsXG4gICAgSW52YWxpZFNvY2tzQ29tbWFuZEZvck9wZXJhdGlvbjogJ0FuIGludmFsaWQgU09DS1MgY29tbWFuZCB3YXMgcHJvdmlkZWQuIE9ubHkgYSBzdWJzZXQgb2YgY29tbWFuZHMgYXJlIHN1cHBvcnRlZCBmb3IgdGhpcyBvcGVyYXRpb24uJyxcbiAgICBJbnZhbGlkU29ja3NDb21tYW5kQ2hhaW46ICdBbiBpbnZhbGlkIFNPQ0tTIGNvbW1hbmQgd2FzIHByb3ZpZGVkLiBDaGFpbmluZyBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB0aGUgY29ubmVjdCBjb21tYW5kLicsXG4gICAgSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0Rlc3RpbmF0aW9uOiAnQW4gaW52YWxpZCBkZXN0aW5hdGlvbiBob3N0IHdhcyBwcm92aWRlZC4nLFxuICAgIEludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNFeGlzdGluZ1NvY2tldDogJ0FuIGludmFsaWQgZXhpc3Rpbmcgc29ja2V0IHdhcyBwcm92aWRlZC4gVGhpcyBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2Ygc3RyZWFtLkR1cGxleC4nLFxuICAgIEludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNQcm94eTogJ0ludmFsaWQgU09DS1MgcHJveHkgZGV0YWlscyB3ZXJlIHByb3ZpZGVkLicsXG4gICAgSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc1RpbWVvdXQ6ICdBbiBpbnZhbGlkIHRpbWVvdXQgdmFsdWUgd2FzIHByb3ZpZGVkLiBQbGVhc2UgZW50ZXIgYSB2YWx1ZSBhYm92ZSAwIChpbiBtcykuJyxcbiAgICBJbnZhbGlkU29ja3NDbGllbnRPcHRpb25zUHJveGllc0xlbmd0aDogJ0F0IGxlYXN0IHR3byBzb2NrcyBwcm94aWVzIG11c3QgYmUgcHJvdmlkZWQgZm9yIGNoYWluaW5nLicsXG4gICAgSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0N1c3RvbUF1dGhSYW5nZTogJ0N1c3RvbSBhdXRoIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4ODAgYW5kIDB4RkUuJyxcbiAgICBJbnZhbGlkU29ja3NDbGllbnRPcHRpb25zQ3VzdG9tQXV0aE9wdGlvbnM6ICdXaGVuIGEgY3VzdG9tX2F1dGhfbWV0aG9kIGlzIHByb3ZpZGVkLCBjdXN0b21fYXV0aF9yZXF1ZXN0X2hhbmRsZXIsIGN1c3RvbV9hdXRoX3Jlc3BvbnNlX3NpemUsIGFuZCBjdXN0b21fYXV0aF9yZXNwb25zZV9oYW5kbGVyIG11c3QgYWxzbyBiZSBwcm92aWRlZCBhbmQgdmFsaWQuJyxcbiAgICBOZWdvdGlhdGlvbkVycm9yOiAnTmVnb3RpYXRpb24gZXJyb3InLFxuICAgIFNvY2tldENsb3NlZDogJ1NvY2tldCBjbG9zZWQnLFxuICAgIFByb3h5Q29ubmVjdGlvblRpbWVkT3V0OiAnUHJveHkgY29ubmVjdGlvbiB0aW1lZCBvdXQnLFxuICAgIEludGVybmFsRXJyb3I6ICdTb2Nrc0NsaWVudCBpbnRlcm5hbCBlcnJvciAodGhpcyBzaG91bGQgbm90IGhhcHBlbiknLFxuICAgIEludmFsaWRTb2NrczRIYW5kc2hha2VSZXNwb25zZTogJ1JlY2VpdmVkIGludmFsaWQgU29ja3M0IGhhbmRzaGFrZSByZXNwb25zZScsXG4gICAgU29ja3M0UHJveHlSZWplY3RlZENvbm5lY3Rpb246ICdTb2NrczQgUHJveHkgcmVqZWN0ZWQgY29ubmVjdGlvbicsXG4gICAgSW52YWxpZFNvY2tzNEluY29taW5nQ29ubmVjdGlvblJlc3BvbnNlOiAnU29ja3M0IGludmFsaWQgaW5jb21pbmcgY29ubmVjdGlvbiByZXNwb25zZScsXG4gICAgU29ja3M0UHJveHlSZWplY3RlZEluY29taW5nQm91bmRDb25uZWN0aW9uOiAnU29ja3M0IFByb3h5IHJlamVjdGVkIGluY29taW5nIGJvdW5kIGNvbm5lY3Rpb24nLFxuICAgIEludmFsaWRTb2NrczVJbml0aWFsSGFuZHNoYWtlUmVzcG9uc2U6ICdSZWNlaXZlZCBpbnZhbGlkIFNvY2tzNSBpbml0aWFsIGhhbmRzaGFrZSByZXNwb25zZScsXG4gICAgSW52YWxpZFNvY2tzNUludGlhaWxIYW5kc2hha2VTb2Nrc1ZlcnNpb246ICdSZWNlaXZlZCBpbnZhbGlkIFNvY2tzNSBpbml0aWFsIGhhbmRzaGFrZSAoaW52YWxpZCBzb2NrcyB2ZXJzaW9uKScsXG4gICAgSW52YWxpZFNvY2tzNUluaXRpYWxIYW5kc2hha2VOb0FjY2VwdGVkQXV0aFR5cGU6ICdSZWNlaXZlZCBpbnZhbGlkIFNvY2tzNSBpbml0aWFsIGhhbmRzaGFrZSAobm8gYWNjZXB0ZWQgYXV0aGVudGljYXRpb24gdHlwZSknLFxuICAgIEludmFsaWRTb2NrczVJbml0aWFsSGFuZHNoYWtlVW5rbm93bkF1dGhUeXBlOiAnUmVjZWl2ZWQgaW52YWxpZCBTb2NrczUgaW5pdGlhbCBoYW5kc2hha2UgKHVua25vd24gYXV0aGVudGljYXRpb24gdHlwZSknLFxuICAgIFNvY2tzNUF1dGhlbnRpY2F0aW9uRmFpbGVkOiAnU29ja3M1IEF1dGhlbnRpY2F0aW9uIGZhaWxlZCcsXG4gICAgSW52YWxpZFNvY2tzNUZpbmFsSGFuZHNoYWtlOiAnUmVjZWl2ZWQgaW52YWxpZCBTb2NrczUgZmluYWwgaGFuZHNoYWtlIHJlc3BvbnNlJyxcbiAgICBJbnZhbGlkU29ja3M1RmluYWxIYW5kc2hha2VSZWplY3RlZDogJ1NvY2tzNSBwcm94eSByZWplY3RlZCBjb25uZWN0aW9uJyxcbiAgICBJbnZhbGlkU29ja3M1SW5jb21pbmdDb25uZWN0aW9uUmVzcG9uc2U6ICdSZWNlaXZlZCBpbnZhbGlkIFNvY2tzNSBpbmNvbWluZyBjb25uZWN0aW9uIHJlc3BvbnNlJyxcbiAgICBTb2NrczVQcm94eVJlamVjdGVkSW5jb21pbmdCb3VuZENvbm5lY3Rpb246ICdTb2NrczUgUHJveHkgcmVqZWN0ZWQgaW5jb21pbmcgYm91bmQgY29ubmVjdGlvbicsXG59O1xuZXhwb3J0cy5FUlJPUlMgPSBFUlJPUlM7XG5jb25zdCBTT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMgPSB7XG4gICAgU29ja3M1SW5pdGlhbEhhbmRzaGFrZVJlc3BvbnNlOiAyLFxuICAgIFNvY2tzNVVzZXJQYXNzQXV0aGVudGljYXRpb25SZXNwb25zZTogMixcbiAgICAvLyBDb21tYW5kIHJlc3BvbnNlICsgaW5jb21pbmcgY29ubmVjdGlvbiAoYmluZClcbiAgICBTb2NrczVSZXNwb25zZUhlYWRlcjogNSwgLy8gV2UgbmVlZCBhdCBsZWFzdCA1IHRvIHJlYWQgdGhlIGhvc3RuYW1lIGxlbmd0aCwgdGhlbiB3ZSB3YWl0IGZvciB0aGUgYWRkcmVzcytwb3J0IGluZm9ybWF0aW9uLlxuICAgIFNvY2tzNVJlc3BvbnNlSVB2NDogMTAsIC8vIDQgaGVhZGVyICsgNCBpcCArIDIgcG9ydFxuICAgIFNvY2tzNVJlc3BvbnNlSVB2NjogMjIsIC8vIDQgaGVhZGVyICsgMTYgaXAgKyAyIHBvcnRcbiAgICBTb2NrczVSZXNwb25zZUhvc3RuYW1lOiAoaG9zdE5hbWVMZW5ndGgpID0+IGhvc3ROYW1lTGVuZ3RoICsgNywgLy8gNCBoZWFkZXIgKyAxIGhvc3QgbGVuZ3RoICsgaG9zdCArIDIgcG9ydFxuICAgIC8vIENvbW1hbmQgcmVzcG9uc2UgKyBpbmNvbWluZyBjb25uZWN0aW9uIChiaW5kKVxuICAgIFNvY2tzNFJlc3BvbnNlOiA4LCAvLyAyIGhlYWRlciArIDIgcG9ydCArIDQgaXBcbn07XG5leHBvcnRzLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUyA9IFNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUztcbnZhciBTb2Nrc0NvbW1hbmQ7XG4oZnVuY3Rpb24gKFNvY2tzQ29tbWFuZCkge1xuICAgIFNvY2tzQ29tbWFuZFtTb2Nrc0NvbW1hbmRbXCJjb25uZWN0XCJdID0gMV0gPSBcImNvbm5lY3RcIjtcbiAgICBTb2Nrc0NvbW1hbmRbU29ja3NDb21tYW5kW1wiYmluZFwiXSA9IDJdID0gXCJiaW5kXCI7XG4gICAgU29ja3NDb21tYW5kW1NvY2tzQ29tbWFuZFtcImFzc29jaWF0ZVwiXSA9IDNdID0gXCJhc3NvY2lhdGVcIjtcbn0pKFNvY2tzQ29tbWFuZCB8fCAoZXhwb3J0cy5Tb2Nrc0NvbW1hbmQgPSBTb2Nrc0NvbW1hbmQgPSB7fSkpO1xudmFyIFNvY2tzNFJlc3BvbnNlO1xuKGZ1bmN0aW9uIChTb2NrczRSZXNwb25zZSkge1xuICAgIFNvY2tzNFJlc3BvbnNlW1NvY2tzNFJlc3BvbnNlW1wiR3JhbnRlZFwiXSA9IDkwXSA9IFwiR3JhbnRlZFwiO1xuICAgIFNvY2tzNFJlc3BvbnNlW1NvY2tzNFJlc3BvbnNlW1wiRmFpbGVkXCJdID0gOTFdID0gXCJGYWlsZWRcIjtcbiAgICBTb2NrczRSZXNwb25zZVtTb2NrczRSZXNwb25zZVtcIlJlamVjdGVkXCJdID0gOTJdID0gXCJSZWplY3RlZFwiO1xuICAgIFNvY2tzNFJlc3BvbnNlW1NvY2tzNFJlc3BvbnNlW1wiUmVqZWN0ZWRJZGVudFwiXSA9IDkzXSA9IFwiUmVqZWN0ZWRJZGVudFwiO1xufSkoU29ja3M0UmVzcG9uc2UgfHwgKGV4cG9ydHMuU29ja3M0UmVzcG9uc2UgPSBTb2NrczRSZXNwb25zZSA9IHt9KSk7XG52YXIgU29ja3M1QXV0aDtcbihmdW5jdGlvbiAoU29ja3M1QXV0aCkge1xuICAgIFNvY2tzNUF1dGhbU29ja3M1QXV0aFtcIk5vQXV0aFwiXSA9IDBdID0gXCJOb0F1dGhcIjtcbiAgICBTb2NrczVBdXRoW1NvY2tzNUF1dGhbXCJHU1NBcGlcIl0gPSAxXSA9IFwiR1NTQXBpXCI7XG4gICAgU29ja3M1QXV0aFtTb2NrczVBdXRoW1wiVXNlclBhc3NcIl0gPSAyXSA9IFwiVXNlclBhc3NcIjtcbn0pKFNvY2tzNUF1dGggfHwgKGV4cG9ydHMuU29ja3M1QXV0aCA9IFNvY2tzNUF1dGggPSB7fSkpO1xuY29uc3QgU09DS1M1X0NVU1RPTV9BVVRIX1NUQVJUID0gMHg4MDtcbmV4cG9ydHMuU09DS1M1X0NVU1RPTV9BVVRIX1NUQVJUID0gU09DS1M1X0NVU1RPTV9BVVRIX1NUQVJUO1xuY29uc3QgU09DS1M1X0NVU1RPTV9BVVRIX0VORCA9IDB4ZmU7XG5leHBvcnRzLlNPQ0tTNV9DVVNUT01fQVVUSF9FTkQgPSBTT0NLUzVfQ1VTVE9NX0FVVEhfRU5EO1xuY29uc3QgU09DS1M1X05PX0FDQ0VQVEFCTEVfQVVUSCA9IDB4ZmY7XG5leHBvcnRzLlNPQ0tTNV9OT19BQ0NFUFRBQkxFX0FVVEggPSBTT0NLUzVfTk9fQUNDRVBUQUJMRV9BVVRIO1xudmFyIFNvY2tzNVJlc3BvbnNlO1xuKGZ1bmN0aW9uIChTb2NrczVSZXNwb25zZSkge1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiR3JhbnRlZFwiXSA9IDBdID0gXCJHcmFudGVkXCI7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJGYWlsdXJlXCJdID0gMV0gPSBcIkZhaWx1cmVcIjtcbiAgICBTb2NrczVSZXNwb25zZVtTb2NrczVSZXNwb25zZVtcIk5vdEFsbG93ZWRcIl0gPSAyXSA9IFwiTm90QWxsb3dlZFwiO1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiTmV0d29ya1VucmVhY2hhYmxlXCJdID0gM10gPSBcIk5ldHdvcmtVbnJlYWNoYWJsZVwiO1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiSG9zdFVucmVhY2hhYmxlXCJdID0gNF0gPSBcIkhvc3RVbnJlYWNoYWJsZVwiO1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiQ29ubmVjdGlvblJlZnVzZWRcIl0gPSA1XSA9IFwiQ29ubmVjdGlvblJlZnVzZWRcIjtcbiAgICBTb2NrczVSZXNwb25zZVtTb2NrczVSZXNwb25zZVtcIlRUTEV4cGlyZWRcIl0gPSA2XSA9IFwiVFRMRXhwaXJlZFwiO1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiQ29tbWFuZE5vdFN1cHBvcnRlZFwiXSA9IDddID0gXCJDb21tYW5kTm90U3VwcG9ydGVkXCI7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJBZGRyZXNzTm90U3VwcG9ydGVkXCJdID0gOF0gPSBcIkFkZHJlc3NOb3RTdXBwb3J0ZWRcIjtcbn0pKFNvY2tzNVJlc3BvbnNlIHx8IChleHBvcnRzLlNvY2tzNVJlc3BvbnNlID0gU29ja3M1UmVzcG9uc2UgPSB7fSkpO1xudmFyIFNvY2tzNUhvc3RUeXBlO1xuKGZ1bmN0aW9uIChTb2NrczVIb3N0VHlwZSkge1xuICAgIFNvY2tzNUhvc3RUeXBlW1NvY2tzNUhvc3RUeXBlW1wiSVB2NFwiXSA9IDFdID0gXCJJUHY0XCI7XG4gICAgU29ja3M1SG9zdFR5cGVbU29ja3M1SG9zdFR5cGVbXCJIb3N0bmFtZVwiXSA9IDNdID0gXCJIb3N0bmFtZVwiO1xuICAgIFNvY2tzNUhvc3RUeXBlW1NvY2tzNUhvc3RUeXBlW1wiSVB2NlwiXSA9IDRdID0gXCJJUHY2XCI7XG59KShTb2NrczVIb3N0VHlwZSB8fCAoZXhwb3J0cy5Tb2NrczVIb3N0VHlwZSA9IFNvY2tzNUhvc3RUeXBlID0ge30pKTtcbnZhciBTb2Nrc0NsaWVudFN0YXRlO1xuKGZ1bmN0aW9uIChTb2Nrc0NsaWVudFN0YXRlKSB7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiQ3JlYXRlZFwiXSA9IDBdID0gXCJDcmVhdGVkXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiQ29ubmVjdGluZ1wiXSA9IDFdID0gXCJDb25uZWN0aW5nXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiQ29ubmVjdGVkXCJdID0gMl0gPSBcIkNvbm5lY3RlZFwiO1xuICAgIFNvY2tzQ2xpZW50U3RhdGVbU29ja3NDbGllbnRTdGF0ZVtcIlNlbnRJbml0aWFsSGFuZHNoYWtlXCJdID0gM10gPSBcIlNlbnRJbml0aWFsSGFuZHNoYWtlXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiUmVjZWl2ZWRJbml0aWFsSGFuZHNoYWtlUmVzcG9uc2VcIl0gPSA0XSA9IFwiUmVjZWl2ZWRJbml0aWFsSGFuZHNoYWtlUmVzcG9uc2VcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJTZW50QXV0aGVudGljYXRpb25cIl0gPSA1XSA9IFwiU2VudEF1dGhlbnRpY2F0aW9uXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiUmVjZWl2ZWRBdXRoZW50aWNhdGlvblJlc3BvbnNlXCJdID0gNl0gPSBcIlJlY2VpdmVkQXV0aGVudGljYXRpb25SZXNwb25zZVwiO1xuICAgIFNvY2tzQ2xpZW50U3RhdGVbU29ja3NDbGllbnRTdGF0ZVtcIlNlbnRGaW5hbEhhbmRzaGFrZVwiXSA9IDddID0gXCJTZW50RmluYWxIYW5kc2hha2VcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJSZWNlaXZlZEZpbmFsUmVzcG9uc2VcIl0gPSA4XSA9IFwiUmVjZWl2ZWRGaW5hbFJlc3BvbnNlXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiQm91bmRXYWl0aW5nRm9yQ29ubmVjdGlvblwiXSA9IDldID0gXCJCb3VuZFdhaXRpbmdGb3JDb25uZWN0aW9uXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiRXN0YWJsaXNoZWRcIl0gPSAxMF0gPSBcIkVzdGFibGlzaGVkXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiRGlzY29ubmVjdGVkXCJdID0gMTFdID0gXCJEaXNjb25uZWN0ZWRcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJFcnJvclwiXSA9IDk5XSA9IFwiRXJyb3JcIjtcbn0pKFNvY2tzQ2xpZW50U3RhdGUgfHwgKGV4cG9ydHMuU29ja3NDbGllbnRTdGF0ZSA9IFNvY2tzQ2xpZW50U3RhdGUgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pcFRvQnVmZmVyID0gZXhwb3J0cy5pbnQzMlRvSXB2NCA9IGV4cG9ydHMuaXB2NFRvSW50MzIgPSBleHBvcnRzLnZhbGlkYXRlU29ja3NDbGllbnRDaGFpbk9wdGlvbnMgPSBleHBvcnRzLnZhbGlkYXRlU29ja3NDbGllbnRPcHRpb25zID0gdm9pZCAwO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4vY29uc3RhbnRzXCIpO1xuY29uc3Qgc3RyZWFtID0gcmVxdWlyZShcInN0cmVhbVwiKTtcbmNvbnN0IGlwX2FkZHJlc3NfMSA9IHJlcXVpcmUoXCJpcC1hZGRyZXNzXCIpO1xuY29uc3QgbmV0ID0gcmVxdWlyZShcIm5ldFwiKTtcbi8qKlxuICogVmFsaWRhdGVzIHRoZSBwcm92aWRlZCBTb2Nrc0NsaWVudE9wdGlvbnNcbiAqIEBwYXJhbSBvcHRpb25zIHsgU29ja3NDbGllbnRPcHRpb25zIH1cbiAqIEBwYXJhbSBhY2NlcHRlZENvbW1hbmRzIHsgc3RyaW5nW10gfSBBIGxpc3Qgb2YgYWNjZXB0ZWQgU29ja3NQcm94eSBjb21tYW5kcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTb2Nrc0NsaWVudE9wdGlvbnMob3B0aW9ucywgYWNjZXB0ZWRDb21tYW5kcyA9IFsnY29ubmVjdCcsICdiaW5kJywgJ2Fzc29jaWF0ZSddKSB7XG4gICAgLy8gQ2hlY2sgU09DS3MgY29tbWFuZCBvcHRpb24uXG4gICAgaWYgKCFjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmRbb3B0aW9ucy5jb21tYW5kXSkge1xuICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NvbW1hbmQsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBDaGVjayBTb2Nrc0NvbW1hbmQgZm9yIGFjY2VwdGFibGUgY29tbWFuZC5cbiAgICBpZiAoYWNjZXB0ZWRDb21tYW5kcy5pbmRleE9mKG9wdGlvbnMuY29tbWFuZCkgPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ29tbWFuZEZvck9wZXJhdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIENoZWNrIGRlc3RpbmF0aW9uXG4gICAgaWYgKCFpc1ZhbGlkU29ja3NSZW1vdGVIb3N0KG9wdGlvbnMuZGVzdGluYXRpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0Rlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgU09DS1MgcHJveHkgdG8gdXNlXG4gICAgaWYgKCFpc1ZhbGlkU29ja3NQcm94eShvcHRpb25zLnByb3h5KSkge1xuICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNQcm94eSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIGN1c3RvbSBhdXRoIChpZiBzZXQpXG4gICAgdmFsaWRhdGVDdXN0b21Qcm94eUF1dGgob3B0aW9ucy5wcm94eSwgb3B0aW9ucyk7XG4gICAgLy8gQ2hlY2sgdGltZW91dFxuICAgIGlmIChvcHRpb25zLnRpbWVvdXQgJiYgIWlzVmFsaWRUaW1lb3V0VmFsdWUob3B0aW9ucy50aW1lb3V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNUaW1lb3V0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgZXhpc3Rpbmdfc29ja2V0IChpZiBwcm92aWRlZClcbiAgICBpZiAob3B0aW9ucy5leGlzdGluZ19zb2NrZXQgJiZcbiAgICAgICAgIShvcHRpb25zLmV4aXN0aW5nX3NvY2tldCBpbnN0YW5jZW9mIHN0cmVhbS5EdXBsZXgpKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0V4aXN0aW5nU29ja2V0LCBvcHRpb25zKTtcbiAgICB9XG59XG5leHBvcnRzLnZhbGlkYXRlU29ja3NDbGllbnRPcHRpb25zID0gdmFsaWRhdGVTb2Nrc0NsaWVudE9wdGlvbnM7XG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgU29ja3NDbGllbnRDaGFpbk9wdGlvbnNcbiAqIEBwYXJhbSBvcHRpb25zIHsgU29ja3NDbGllbnRDaGFpbk9wdGlvbnMgfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVNvY2tzQ2xpZW50Q2hhaW5PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAvLyBPbmx5IGNvbm5lY3QgaXMgc3VwcG9ydGVkIHdoZW4gY2hhaW5pbmcuXG4gICAgaWYgKG9wdGlvbnMuY29tbWFuZCAhPT0gJ2Nvbm5lY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ29tbWFuZENoYWluLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgZGVzdGluYXRpb25cbiAgICBpZiAoIWlzVmFsaWRTb2Nrc1JlbW90ZUhvc3Qob3B0aW9ucy5kZXN0aW5hdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zRGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBWYWxpZGF0ZSBwcm94aWVzIChsZW5ndGgpXG4gICAgaWYgKCEob3B0aW9ucy5wcm94aWVzICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9ucy5wcm94aWVzKSAmJlxuICAgICAgICBvcHRpb25zLnByb3hpZXMubGVuZ3RoID49IDIpKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc1Byb3hpZXNMZW5ndGgsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBWYWxpZGF0ZSBwcm94aWVzXG4gICAgb3B0aW9ucy5wcm94aWVzLmZvckVhY2goKHByb3h5KSA9PiB7XG4gICAgICAgIGlmICghaXNWYWxpZFNvY2tzUHJveHkocHJveHkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNQcm94eSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmFsaWRhdGUgY3VzdG9tIGF1dGggKGlmIHNldClcbiAgICAgICAgdmFsaWRhdGVDdXN0b21Qcm94eUF1dGgocHJveHksIG9wdGlvbnMpO1xuICAgIH0pO1xuICAgIC8vIENoZWNrIHRpbWVvdXRcbiAgICBpZiAob3B0aW9ucy50aW1lb3V0ICYmICFpc1ZhbGlkVGltZW91dFZhbHVlKG9wdGlvbnMudGltZW91dCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zVGltZW91dCwgb3B0aW9ucyk7XG4gICAgfVxufVxuZXhwb3J0cy52YWxpZGF0ZVNvY2tzQ2xpZW50Q2hhaW5PcHRpb25zID0gdmFsaWRhdGVTb2Nrc0NsaWVudENoYWluT3B0aW9ucztcbmZ1bmN0aW9uIHZhbGlkYXRlQ3VzdG9tUHJveHlBdXRoKHByb3h5LCBvcHRpb25zKSB7XG4gICAgaWYgKHByb3h5LmN1c3RvbV9hdXRoX21ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEludmFsaWQgYXV0aCBtZXRob2QgcmFuZ2VcbiAgICAgICAgaWYgKHByb3h5LmN1c3RvbV9hdXRoX21ldGhvZCA8IGNvbnN0YW50c18xLlNPQ0tTNV9DVVNUT01fQVVUSF9TVEFSVCB8fFxuICAgICAgICAgICAgcHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kID4gY29uc3RhbnRzXzEuU09DS1M1X0NVU1RPTV9BVVRIX0VORCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zQ3VzdG9tQXV0aFJhbmdlLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNaXNzaW5nIGN1c3RvbV9hdXRoX3JlcXVlc3RfaGFuZGxlclxuICAgICAgICBpZiAocHJveHkuY3VzdG9tX2F1dGhfcmVxdWVzdF9oYW5kbGVyID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIHR5cGVvZiBwcm94eS5jdXN0b21fYXV0aF9yZXF1ZXN0X2hhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0N1c3RvbUF1dGhPcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNaXNzaW5nIGN1c3RvbV9hdXRoX3Jlc3BvbnNlX3NpemVcbiAgICAgICAgaWYgKHByb3h5LmN1c3RvbV9hdXRoX3Jlc3BvbnNlX3NpemUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zQ3VzdG9tQXV0aE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1pc3NpbmcvaW52YWxpZCBjdXN0b21fYXV0aF9yZXNwb25zZV9oYW5kbGVyXG4gICAgICAgIGlmIChwcm94eS5jdXN0b21fYXV0aF9yZXNwb25zZV9oYW5kbGVyID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIHR5cGVvZiBwcm94eS5jdXN0b21fYXV0aF9yZXNwb25zZV9oYW5kbGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNDdXN0b21BdXRoT3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFZhbGlkYXRlcyBhIFNvY2tzUmVtb3RlSG9zdFxuICogQHBhcmFtIHJlbW90ZUhvc3QgeyBTb2Nrc1JlbW90ZUhvc3QgfVxuICovXG5mdW5jdGlvbiBpc1ZhbGlkU29ja3NSZW1vdGVIb3N0KHJlbW90ZUhvc3QpIHtcbiAgICByZXR1cm4gKHJlbW90ZUhvc3QgJiZcbiAgICAgICAgdHlwZW9mIHJlbW90ZUhvc3QuaG9zdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdHlwZW9mIHJlbW90ZUhvc3QucG9ydCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgcmVtb3RlSG9zdC5wb3J0ID49IDAgJiZcbiAgICAgICAgcmVtb3RlSG9zdC5wb3J0IDw9IDY1NTM1KTtcbn1cbi8qKlxuICogVmFsaWRhdGVzIGEgU29ja3NQcm94eVxuICogQHBhcmFtIHByb3h5IHsgU29ja3NQcm94eSB9XG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTb2Nrc1Byb3h5KHByb3h5KSB7XG4gICAgcmV0dXJuIChwcm94eSAmJlxuICAgICAgICAodHlwZW9mIHByb3h5Lmhvc3QgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm94eS5pcGFkZHJlc3MgPT09ICdzdHJpbmcnKSAmJlxuICAgICAgICB0eXBlb2YgcHJveHkucG9ydCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgcHJveHkucG9ydCA+PSAwICYmXG4gICAgICAgIHByb3h5LnBvcnQgPD0gNjU1MzUgJiZcbiAgICAgICAgKHByb3h5LnR5cGUgPT09IDQgfHwgcHJveHkudHlwZSA9PT0gNSkpO1xufVxuLyoqXG4gKiBWYWxpZGF0ZXMgYSB0aW1lb3V0IHZhbHVlLlxuICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH1cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFRpbWVvdXRWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlID4gMDtcbn1cbmZ1bmN0aW9uIGlwdjRUb0ludDMyKGlwKSB7XG4gICAgY29uc3QgYWRkcmVzcyA9IG5ldyBpcF9hZGRyZXNzXzEuQWRkcmVzczQoaXApO1xuICAgIC8vIENvbnZlcnQgdGhlIElQdjQgYWRkcmVzcyBwYXJ0cyB0byBhbiBpbnRlZ2VyXG4gICAgcmV0dXJuIGFkZHJlc3MudG9BcnJheSgpLnJlZHVjZSgoYWNjLCBwYXJ0KSA9PiAoYWNjIDw8IDgpICsgcGFydCwgMCk7XG59XG5leHBvcnRzLmlwdjRUb0ludDMyID0gaXB2NFRvSW50MzI7XG5mdW5jdGlvbiBpbnQzMlRvSXB2NChpbnQzMikge1xuICAgIC8vIEV4dHJhY3QgZWFjaCBieXRlIChvY3RldCkgZnJvbSB0aGUgMzItYml0IGludGVnZXJcbiAgICBjb25zdCBvY3RldDEgPSAoaW50MzIgPj4+IDI0KSAmIDB4ZmY7XG4gICAgY29uc3Qgb2N0ZXQyID0gKGludDMyID4+PiAxNikgJiAweGZmO1xuICAgIGNvbnN0IG9jdGV0MyA9IChpbnQzMiA+Pj4gOCkgJiAweGZmO1xuICAgIGNvbnN0IG9jdGV0NCA9IGludDMyICYgMHhmZjtcbiAgICAvLyBDb21iaW5lIHRoZSBvY3RldHMgaW50byBhIHN0cmluZyBpbiBJUHY0IGZvcm1hdFxuICAgIHJldHVybiBbb2N0ZXQxLCBvY3RldDIsIG9jdGV0Mywgb2N0ZXQ0XS5qb2luKCcuJyk7XG59XG5leHBvcnRzLmludDMyVG9JcHY0ID0gaW50MzJUb0lwdjQ7XG5mdW5jdGlvbiBpcFRvQnVmZmVyKGlwKSB7XG4gICAgaWYgKG5ldC5pc0lQdjQoaXApKSB7XG4gICAgICAgIC8vIEhhbmRsZSBJUHY0IGFkZHJlc3Nlc1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gbmV3IGlwX2FkZHJlc3NfMS5BZGRyZXNzNChpcCk7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShhZGRyZXNzLnRvQXJyYXkoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5ldC5pc0lQdjYoaXApKSB7XG4gICAgICAgIC8vIEhhbmRsZSBJUHY2IGFkZHJlc3Nlc1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gbmV3IGlwX2FkZHJlc3NfMS5BZGRyZXNzNihpcCk7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShhZGRyZXNzXG4gICAgICAgICAgICAuY2Fub25pY2FsRm9ybSgpXG4gICAgICAgICAgICAuc3BsaXQoJzonKVxuICAgICAgICAgICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC5wYWRTdGFydCg0LCAnMCcpKVxuICAgICAgICAgICAgLmpvaW4oJycpLCAnaGV4Jyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVAgYWRkcmVzcyBmb3JtYXQnKTtcbiAgICB9XG59XG5leHBvcnRzLmlwVG9CdWZmZXIgPSBpcFRvQnVmZmVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGVscGVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUmVjZWl2ZUJ1ZmZlciA9IHZvaWQgMDtcbmNsYXNzIFJlY2VpdmVCdWZmZXIge1xuICAgIGNvbnN0cnVjdG9yKHNpemUgPSA0MDk2KSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKHNpemUpO1xuICAgICAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMub3JpZ2luYWxTaXplID0gc2l6ZTtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0O1xuICAgIH1cbiAgICBhcHBlbmQoZGF0YSkge1xuICAgICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gYXBwZW5kIGEgbm9uLWJ1ZmZlciBpbnN0YW5jZSB0byBSZWNlaXZlQnVmZmVyLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIGRhdGEubGVuZ3RoID49IHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdG1wID0gdGhpcy5idWZmZXI7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShNYXRoLm1heCh0aGlzLmJ1ZmZlci5sZW5ndGggKyB0aGlzLm9yaWdpbmFsU2l6ZSwgdGhpcy5idWZmZXIubGVuZ3RoICsgZGF0YS5sZW5ndGgpKTtcbiAgICAgICAgICAgIHRtcC5jb3B5KHRoaXMuYnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLmNvcHkodGhpcy5idWZmZXIsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuICh0aGlzLm9mZnNldCArPSBkYXRhLmxlbmd0aCk7XG4gICAgfVxuICAgIHBlZWsobGVuZ3RoKSB7XG4gICAgICAgIGlmIChsZW5ndGggPiB0aGlzLm9mZnNldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gcmVhZCBiZXlvbmQgdGhlIGJvdW5kcyBvZiB0aGUgbWFuYWdlZCBpbnRlcm5hbCBkYXRhLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgIH1cbiAgICBnZXQobGVuZ3RoKSB7XG4gICAgICAgIGlmIChsZW5ndGggPiB0aGlzLm9mZnNldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gcmVhZCBiZXlvbmQgdGhlIGJvdW5kcyBvZiB0aGUgbWFuYWdlZCBpbnRlcm5hbCBkYXRhLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLnNsaWNlKDAsIGxlbmd0aCkuY29weSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmNvcHlXaXRoaW4oMCwgbGVuZ3RoLCBsZW5ndGggKyB0aGlzLm9mZnNldCAtIGxlbmd0aCk7XG4gICAgICAgIHRoaXMub2Zmc2V0IC09IGxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVjZWl2ZUJ1ZmZlciA9IFJlY2VpdmVCdWZmZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWNlaXZlYnVmZmVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zaHVmZmxlQXJyYXkgPSBleHBvcnRzLlNvY2tzQ2xpZW50RXJyb3IgPSB2b2lkIDA7XG4vKipcbiAqIEVycm9yIHdyYXBwZXIgZm9yIFNvY2tzQ2xpZW50XG4gKi9cbmNsYXNzIFNvY2tzQ2xpZW50RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG59XG5leHBvcnRzLlNvY2tzQ2xpZW50RXJyb3IgPSBTb2Nrc0NsaWVudEVycm9yO1xuLyoqXG4gKiBTaHVmZmxlcyBhIGdpdmVuIGFycmF5LlxuICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICovXG5mdW5jdGlvbiBzaHVmZmxlQXJyYXkoYXJyYXkpIHtcbiAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICBjb25zdCBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgIFthcnJheVtpXSwgYXJyYXlbal1dID0gW2FycmF5W2pdLCBhcnJheVtpXV07XG4gICAgfVxufVxuZXhwb3J0cy5zaHVmZmxlQXJyYXkgPSBzaHVmZmxlQXJyYXk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vY2xpZW50L3NvY2tzY2xpZW50XCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGhhc05hdGl2ZU1hcCA9IHR5cGVvZiBNYXAgIT09IFwidW5kZWZpbmVkXCI7XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB3aGljaCBpcyBhIGNvbWJpbmF0aW9uIG9mIGFuIGFycmF5IGFuZCBhIHNldC4gQWRkaW5nIGEgbmV3XG4gKiBtZW1iZXIgaXMgTygxKSwgdGVzdGluZyBmb3IgbWVtYmVyc2hpcCBpcyBPKDEpLCBhbmQgZmluZGluZyB0aGUgaW5kZXggb2YgYW5cbiAqIGVsZW1lbnQgaXMgTygxKS4gUmVtb3ZpbmcgZWxlbWVudHMgZnJvbSB0aGUgc2V0IGlzIG5vdCBzdXBwb3J0ZWQuIE9ubHlcbiAqIHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBmb3IgbWVtYmVyc2hpcC5cbiAqL1xuZnVuY3Rpb24gQXJyYXlTZXQoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NldCA9IGhhc05hdGl2ZU1hcCA/IG5ldyBNYXAoKSA6IE9iamVjdC5jcmVhdGUobnVsbCk7XG59XG5cbi8qKlxuICogU3RhdGljIG1ldGhvZCBmb3IgY3JlYXRpbmcgQXJyYXlTZXQgaW5zdGFuY2VzIGZyb20gYW4gZXhpc3RpbmcgYXJyYXkuXG4gKi9cbkFycmF5U2V0LmZyb21BcnJheSA9IGZ1bmN0aW9uIEFycmF5U2V0X2Zyb21BcnJheShhQXJyYXksIGFBbGxvd0R1cGxpY2F0ZXMpIHtcbiAgdmFyIHNldCA9IG5ldyBBcnJheVNldCgpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gYUFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgc2V0LmFkZChhQXJyYXlbaV0sIGFBbGxvd0R1cGxpY2F0ZXMpO1xuICB9XG4gIHJldHVybiBzZXQ7XG59O1xuXG4vKipcbiAqIFJldHVybiBob3cgbWFueSB1bmlxdWUgaXRlbXMgYXJlIGluIHRoaXMgQXJyYXlTZXQuIElmIGR1cGxpY2F0ZXMgaGF2ZSBiZWVuXG4gKiBhZGRlZCwgdGhhbiB0aG9zZSBkbyBub3QgY291bnQgdG93YXJkcyB0aGUgc2l6ZS5cbiAqXG4gKiBAcmV0dXJucyBOdW1iZXJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiBBcnJheVNldF9zaXplKCkge1xuICByZXR1cm4gaGFzTmF0aXZlTWFwID8gdGhpcy5fc2V0LnNpemUgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9zZXQpLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQWRkIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhpcyBzZXQuXG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBBcnJheVNldF9hZGQoYVN0ciwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc1N0ciA9IGhhc05hdGl2ZU1hcCA/IGFTdHIgOiB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICB2YXIgaXNEdXBsaWNhdGUgPSBoYXNOYXRpdmVNYXAgPyB0aGlzLmhhcyhhU3RyKSA6IGhhcy5jYWxsKHRoaXMuX3NldCwgc1N0cik7XG4gIHZhciBpZHggPSB0aGlzLl9hcnJheS5sZW5ndGg7XG4gIGlmICghaXNEdXBsaWNhdGUgfHwgYUFsbG93RHVwbGljYXRlcykge1xuICAgIHRoaXMuX2FycmF5LnB1c2goYVN0cik7XG4gIH1cbiAgaWYgKCFpc0R1cGxpY2F0ZSkge1xuICAgIGlmIChoYXNOYXRpdmVNYXApIHtcbiAgICAgIHRoaXMuX3NldC5zZXQoYVN0ciwgaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2V0W3NTdHJdID0gaWR4O1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBJcyB0aGUgZ2l2ZW4gc3RyaW5nIGEgbWVtYmVyIG9mIHRoaXMgc2V0P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gQXJyYXlTZXRfaGFzKGFTdHIpIHtcbiAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgIHJldHVybiB0aGlzLl9zZXQuaGFzKGFTdHIpO1xuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICByZXR1cm4gaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgfVxufTtcblxuLyoqXG4gKiBXaGF0IGlzIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gc3RyaW5nIGluIHRoZSBhcnJheT9cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBBcnJheVNldF9pbmRleE9mKGFTdHIpIHtcbiAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgIHZhciBpZHggPSB0aGlzLl9zZXQuZ2V0KGFTdHIpO1xuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICByZXR1cm4gaWR4O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgc1N0ciA9IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gICAgaWYgKGhhcy5jYWxsKHRoaXMuX3NldCwgc1N0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXRbc1N0cl07XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU3RyICsgJ1wiIGlzIG5vdCBpbiB0aGUgc2V0LicpO1xufTtcblxuLyoqXG4gKiBXaGF0IGlzIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleD9cbiAqXG4gKiBAcGFyYW0gTnVtYmVyIGFJZHhcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmF0ID0gZnVuY3Rpb24gQXJyYXlTZXRfYXQoYUlkeCkge1xuICBpZiAoYUlkeCA+PSAwICYmIGFJZHggPCB0aGlzLl9hcnJheS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyYXlbYUlkeF07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBlbGVtZW50IGluZGV4ZWQgYnkgJyArIGFJZHgpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNldCAod2hpY2ggaGFzIHRoZSBwcm9wZXIgaW5kaWNlc1xuICogaW5kaWNhdGVkIGJ5IGluZGV4T2YpLiBOb3RlIHRoYXQgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIGludGVybmFsIGFycmF5IHVzZWRcbiAqIGZvciBzdG9yaW5nIHRoZSBtZW1iZXJzIHNvIHRoYXQgbm8gb25lIGNhbiBtZXNzIHdpdGggaW50ZXJuYWwgc3RhdGUuXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfdG9BcnJheSgpIHtcbiAgcmV0dXJuIHRoaXMuX2FycmF5LnNsaWNlKCk7XG59O1xuXG5leHBvcnRzLkFycmF5U2V0ID0gQXJyYXlTZXQ7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICpcbiAqIEJhc2VkIG9uIHRoZSBCYXNlIDY0IFZMUSBpbXBsZW1lbnRhdGlvbiBpbiBDbG9zdXJlIENvbXBpbGVyOlxuICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jbG9zdXJlLWNvbXBpbGVyL3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL2NvbS9nb29nbGUvZGVidWdnaW5nL3NvdXJjZW1hcC9CYXNlNjRWTFEuamF2YVxuICpcbiAqIENvcHlyaWdodCAyMDExIFRoZSBDbG9zdXJlIENvbXBpbGVyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZFxuICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xuXG4vLyBBIHNpbmdsZSBiYXNlIDY0IGRpZ2l0IGNhbiBjb250YWluIDYgYml0cyBvZiBkYXRhLiBGb3IgdGhlIGJhc2UgNjQgdmFyaWFibGVcbi8vIGxlbmd0aCBxdWFudGl0aWVzIHdlIHVzZSBpbiB0aGUgc291cmNlIG1hcCBzcGVjLCB0aGUgZmlyc3QgYml0IGlzIHRoZSBzaWduLFxuLy8gdGhlIG5leHQgZm91ciBiaXRzIGFyZSB0aGUgYWN0dWFsIHZhbHVlLCBhbmQgdGhlIDZ0aCBiaXQgaXMgdGhlXG4vLyBjb250aW51YXRpb24gYml0LiBUaGUgY29udGludWF0aW9uIGJpdCB0ZWxscyB1cyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlXG4vLyBkaWdpdHMgaW4gdGhpcyB2YWx1ZSBmb2xsb3dpbmcgdGhpcyBkaWdpdC5cbi8vXG4vLyAgIENvbnRpbnVhdGlvblxuLy8gICB8ICAgIFNpZ25cbi8vICAgfCAgICB8XG4vLyAgIFYgICAgVlxuLy8gICAxMDEwMTFcblxudmFyIFZMUV9CQVNFX1NISUZUID0gNTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQkFTRSA9IDEgPDwgVkxRX0JBU0VfU0hJRlQ7XG5cbi8vIGJpbmFyeTogMDExMTExXG52YXIgVkxRX0JBU0VfTUFTSyA9IFZMUV9CQVNFIC0gMTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQ09OVElOVUFUSU9OX0JJVCA9IFZMUV9CQVNFO1xuXG4vKipcbiAqIENvbnZlcnRzIGZyb20gYSB0d28tY29tcGxlbWVudCB2YWx1ZSB0byBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDEgYmVjb21lcyAyICgxMCBiaW5hcnkpLCAtMSBiZWNvbWVzIDMgKDExIGJpbmFyeSlcbiAqICAgMiBiZWNvbWVzIDQgKDEwMCBiaW5hcnkpLCAtMiBiZWNvbWVzIDUgKDEwMSBiaW5hcnkpXG4gKi9cbmZ1bmN0aW9uIHRvVkxRU2lnbmVkKGFWYWx1ZSkge1xuICByZXR1cm4gYVZhbHVlIDwgMFxuICAgID8gKCgtYVZhbHVlKSA8PCAxKSArIDFcbiAgICA6IChhVmFsdWUgPDwgMSkgKyAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRvIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgZnJvbSBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDIgKDEwIGJpbmFyeSkgYmVjb21lcyAxLCAzICgxMSBiaW5hcnkpIGJlY29tZXMgLTFcbiAqICAgNCAoMTAwIGJpbmFyeSkgYmVjb21lcyAyLCA1ICgxMDEgYmluYXJ5KSBiZWNvbWVzIC0yXG4gKi9cbmZ1bmN0aW9uIGZyb21WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHZhciBpc05lZ2F0aXZlID0gKGFWYWx1ZSAmIDEpID09PSAxO1xuICB2YXIgc2hpZnRlZCA9IGFWYWx1ZSA+PiAxO1xuICByZXR1cm4gaXNOZWdhdGl2ZVxuICAgID8gLXNoaWZ0ZWRcbiAgICA6IHNoaWZ0ZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmFzZSA2NCBWTFEgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZW5jb2RlKGFWYWx1ZSkge1xuICB2YXIgZW5jb2RlZCA9IFwiXCI7XG4gIHZhciBkaWdpdDtcblxuICB2YXIgdmxxID0gdG9WTFFTaWduZWQoYVZhbHVlKTtcblxuICBkbyB7XG4gICAgZGlnaXQgPSB2bHEgJiBWTFFfQkFTRV9NQVNLO1xuICAgIHZscSA+Pj49IFZMUV9CQVNFX1NISUZUO1xuICAgIGlmICh2bHEgPiAwKSB7XG4gICAgICAvLyBUaGVyZSBhcmUgc3RpbGwgbW9yZSBkaWdpdHMgaW4gdGhpcyB2YWx1ZSwgc28gd2UgbXVzdCBtYWtlIHN1cmUgdGhlXG4gICAgICAvLyBjb250aW51YXRpb24gYml0IGlzIG1hcmtlZC5cbiAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUO1xuICAgIH1cbiAgICBlbmNvZGVkICs9IGJhc2U2NC5lbmNvZGUoZGlnaXQpO1xuICB9IHdoaWxlICh2bHEgPiAwKTtcblxuICByZXR1cm4gZW5jb2RlZDtcbn07XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgbmV4dCBiYXNlIDY0IFZMUSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgdGhlXG4gKiB2YWx1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB2aWEgdGhlIG91dCBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2RlY29kZShhU3RyLCBhSW5kZXgsIGFPdXRQYXJhbSkge1xuICB2YXIgc3RyTGVuID0gYVN0ci5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSAwO1xuICB2YXIgc2hpZnQgPSAwO1xuICB2YXIgY29udGludWF0aW9uLCBkaWdpdDtcblxuICBkbyB7XG4gICAgaWYgKGFJbmRleCA+PSBzdHJMZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG1vcmUgZGlnaXRzIGluIGJhc2UgNjQgVkxRIHZhbHVlLlwiKTtcbiAgICB9XG5cbiAgICBkaWdpdCA9IGJhc2U2NC5kZWNvZGUoYVN0ci5jaGFyQ29kZUF0KGFJbmRleCsrKSk7XG4gICAgaWYgKGRpZ2l0ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYXNlNjQgZGlnaXQ6IFwiICsgYVN0ci5jaGFyQXQoYUluZGV4IC0gMSkpO1xuICAgIH1cblxuICAgIGNvbnRpbnVhdGlvbiA9ICEhKGRpZ2l0ICYgVkxRX0NPTlRJTlVBVElPTl9CSVQpO1xuICAgIGRpZ2l0ICY9IFZMUV9CQVNFX01BU0s7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICsgKGRpZ2l0IDw8IHNoaWZ0KTtcbiAgICBzaGlmdCArPSBWTFFfQkFTRV9TSElGVDtcbiAgfSB3aGlsZSAoY29udGludWF0aW9uKTtcblxuICBhT3V0UGFyYW0udmFsdWUgPSBmcm9tVkxRU2lnbmVkKHJlc3VsdCk7XG4gIGFPdXRQYXJhbS5yZXN0ID0gYUluZGV4O1xufTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGludFRvQ2hhck1hcCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJy5zcGxpdCgnJyk7XG5cbi8qKlxuICogRW5jb2RlIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIG9mIDAgdG8gNjMgdG8gYSBzaW5nbGUgYmFzZSA2NCBkaWdpdC5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gIGlmICgwIDw9IG51bWJlciAmJiBudW1iZXIgPCBpbnRUb0NoYXJNYXAubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGludFRvQ2hhck1hcFtudW1iZXJdO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNdXN0IGJlIGJldHdlZW4gMCBhbmQgNjM6IFwiICsgbnVtYmVyKTtcbn07XG5cbi8qKlxuICogRGVjb2RlIGEgc2luZ2xlIGJhc2UgNjQgY2hhcmFjdGVyIGNvZGUgZGlnaXQgdG8gYW4gaW50ZWdlci4gUmV0dXJucyAtMSBvblxuICogZmFpbHVyZS5cbiAqL1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiAoY2hhckNvZGUpIHtcbiAgdmFyIGJpZ0EgPSA2NTsgICAgIC8vICdBJ1xuICB2YXIgYmlnWiA9IDkwOyAgICAgLy8gJ1onXG5cbiAgdmFyIGxpdHRsZUEgPSA5NzsgIC8vICdhJ1xuICB2YXIgbGl0dGxlWiA9IDEyMjsgLy8gJ3onXG5cbiAgdmFyIHplcm8gPSA0ODsgICAgIC8vICcwJ1xuICB2YXIgbmluZSA9IDU3OyAgICAgLy8gJzknXG5cbiAgdmFyIHBsdXMgPSA0MzsgICAgIC8vICcrJ1xuICB2YXIgc2xhc2ggPSA0NzsgICAgLy8gJy8nXG5cbiAgdmFyIGxpdHRsZU9mZnNldCA9IDI2O1xuICB2YXIgbnVtYmVyT2Zmc2V0ID0gNTI7XG5cbiAgLy8gMCAtIDI1OiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWlxuICBpZiAoYmlnQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBiaWdaKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIGJpZ0EpO1xuICB9XG5cbiAgLy8gMjYgLSA1MTogYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcbiAgaWYgKGxpdHRsZUEgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gbGl0dGxlWikge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSBsaXR0bGVBICsgbGl0dGxlT2Zmc2V0KTtcbiAgfVxuXG4gIC8vIDUyIC0gNjE6IDAxMjM0NTY3ODlcbiAgaWYgKHplcm8gPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gbmluZSkge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSB6ZXJvICsgbnVtYmVyT2Zmc2V0KTtcbiAgfVxuXG4gIC8vIDYyOiArXG4gIGlmIChjaGFyQ29kZSA9PSBwbHVzKSB7XG4gICAgcmV0dXJuIDYyO1xuICB9XG5cbiAgLy8gNjM6IC9cbiAgaWYgKGNoYXJDb2RlID09IHNsYXNoKSB7XG4gICAgcmV0dXJuIDYzO1xuICB9XG5cbiAgLy8gSW52YWxpZCBiYXNlNjQgZGlnaXQuXG4gIHJldHVybiAtMTtcbn07XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIG1hcHBpbmdCIGlzIGFmdGVyIG1hcHBpbmdBIHdpdGggcmVzcGVjdCB0byBnZW5lcmF0ZWRcbiAqIHBvc2l0aW9uLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZWRQb3NpdGlvbkFmdGVyKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICAvLyBPcHRpbWl6ZWQgZm9yIG1vc3QgY29tbW9uIGNhc2VcbiAgdmFyIGxpbmVBID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZTtcbiAgdmFyIGxpbmVCID0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgdmFyIGNvbHVtbkEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW47XG4gIHZhciBjb2x1bW5CID0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICByZXR1cm4gbGluZUIgPiBsaW5lQSB8fCBsaW5lQiA9PSBsaW5lQSAmJiBjb2x1bW5CID49IGNvbHVtbkEgfHxcbiAgICAgICAgIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCKSA8PSAwO1xufVxuXG4vKipcbiAqIEEgZGF0YSBzdHJ1Y3R1cmUgdG8gcHJvdmlkZSBhIHNvcnRlZCB2aWV3IG9mIGFjY3VtdWxhdGVkIG1hcHBpbmdzIGluIGFcbiAqIHBlcmZvcm1hbmNlIGNvbnNjaW91cyBtYW5uZXIuIEl0IHRyYWRlcyBhIG5lZ2xpYmFibGUgb3ZlcmhlYWQgaW4gZ2VuZXJhbFxuICogY2FzZSBmb3IgYSBsYXJnZSBzcGVlZHVwIGluIGNhc2Ugb2YgbWFwcGluZ3MgYmVpbmcgYWRkZWQgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmdMaXN0KCkge1xuICB0aGlzLl9hcnJheSA9IFtdO1xuICB0aGlzLl9zb3J0ZWQgPSB0cnVlO1xuICAvLyBTZXJ2ZXMgYXMgaW5maW11bVxuICB0aGlzLl9sYXN0ID0ge2dlbmVyYXRlZExpbmU6IC0xLCBnZW5lcmF0ZWRDb2x1bW46IDB9O1xufVxuXG4vKipcbiAqIEl0ZXJhdGUgdGhyb3VnaCBpbnRlcm5hbCBpdGVtcy4gVGhpcyBtZXRob2QgdGFrZXMgdGhlIHNhbWUgYXJndW1lbnRzIHRoYXRcbiAqIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgdGFrZXMuXG4gKlxuICogTk9URTogVGhlIG9yZGVyIG9mIHRoZSBtYXBwaW5ncyBpcyBOT1QgZ3VhcmFudGVlZC5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnVuc29ydGVkRm9yRWFjaCA9XG4gIGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2ZvckVhY2goYUNhbGxiYWNrLCBhVGhpc0FyZykge1xuICAgIHRoaXMuX2FycmF5LmZvckVhY2goYUNhbGxiYWNrLCBhVGhpc0FyZyk7XG4gIH07XG5cbi8qKlxuICogQWRkIHRoZSBnaXZlbiBzb3VyY2UgbWFwcGluZy5cbiAqXG4gKiBAcGFyYW0gT2JqZWN0IGFNYXBwaW5nXG4gKi9cbk1hcHBpbmdMaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF9hZGQoYU1hcHBpbmcpIHtcbiAgaWYgKGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIodGhpcy5fbGFzdCwgYU1hcHBpbmcpKSB7XG4gICAgdGhpcy5fbGFzdCA9IGFNYXBwaW5nO1xuICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX3NvcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGZsYXQsIHNvcnRlZCBhcnJheSBvZiBtYXBwaW5ncy4gVGhlIG1hcHBpbmdzIGFyZSBzb3J0ZWQgYnlcbiAqIGdlbmVyYXRlZCBwb3NpdGlvbi5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCByZXR1cm5zIGludGVybmFsIGRhdGEgd2l0aG91dCBjb3B5aW5nLCBmb3JcbiAqIHBlcmZvcm1hbmNlLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgTk9UIGJlIG11dGF0ZWQsIGFuZCBzaG91bGQgYmUgdHJlYXRlZCBhc1xuICogYW4gaW1tdXRhYmxlIGJvcnJvdy4gSWYgeW91IHdhbnQgdG8gdGFrZSBvd25lcnNoaXAsIHlvdSBtdXN0IG1ha2UgeW91ciBvd25cbiAqIGNvcHkuXG4gKi9cbk1hcHBpbmdMaXN0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gTWFwcGluZ0xpc3RfdG9BcnJheSgpIHtcbiAgaWYgKCF0aGlzLl9zb3J0ZWQpIHtcbiAgICB0aGlzLl9hcnJheS5zb3J0KHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQpO1xuICAgIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2FycmF5O1xufTtcblxuZXhwb3J0cy5NYXBwaW5nTGlzdCA9IE1hcHBpbmdMaXN0O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG4vLyBJdCB0dXJucyBvdXQgdGhhdCBzb21lIChtb3N0PykgSmF2YVNjcmlwdCBlbmdpbmVzIGRvbid0IHNlbGYtaG9zdFxuLy8gYEFycmF5LnByb3RvdHlwZS5zb3J0YC4gVGhpcyBtYWtlcyBzZW5zZSBiZWNhdXNlIEMrKyB3aWxsIGxpa2VseSByZW1haW5cbi8vIGZhc3RlciB0aGFuIEpTIHdoZW4gZG9pbmcgcmF3IENQVS1pbnRlbnNpdmUgc29ydGluZy4gSG93ZXZlciwgd2hlbiB1c2luZyBhXG4vLyBjdXN0b20gY29tcGFyYXRvciBmdW5jdGlvbiwgY2FsbGluZyBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIHRoZSBWTSdzIEMrKyBhbmRcbi8vIEpJVCdkIEpTIGlzIHJhdGhlciBzbG93ICphbmQqIGxvc2VzIEpJVCB0eXBlIGluZm9ybWF0aW9uLCByZXN1bHRpbmcgaW5cbi8vIHdvcnNlIGdlbmVyYXRlZCBjb2RlIGZvciB0aGUgY29tcGFyYXRvciBmdW5jdGlvbiB0aGFuIHdvdWxkIGJlIG9wdGltYWwuIEluXG4vLyBmYWN0LCB3aGVuIHNvcnRpbmcgd2l0aCBhIGNvbXBhcmF0b3IsIHRoZXNlIGNvc3RzIG91dHdlaWdoIHRoZSBiZW5lZml0cyBvZlxuLy8gc29ydGluZyBpbiBDKysuIEJ5IHVzaW5nIG91ciBvd24gSlMtaW1wbGVtZW50ZWQgUXVpY2sgU29ydCAoYmVsb3cpLCB3ZSBnZXRcbi8vIGEgfjM1MDBtcyBtZWFuIHNwZWVkLXVwIGluIGBiZW5jaC9iZW5jaC5odG1sYC5cblxuLyoqXG4gKiBTd2FwIHRoZSBlbGVtZW50cyBpbmRleGVkIGJ5IGB4YCBhbmQgYHlgIGluIHRoZSBhcnJheSBgYXJ5YC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBUaGUgYXJyYXkuXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogICAgICAgIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgaXRlbS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBzZWNvbmQgaXRlbS5cbiAqL1xuZnVuY3Rpb24gc3dhcChhcnksIHgsIHkpIHtcbiAgdmFyIHRlbXAgPSBhcnlbeF07XG4gIGFyeVt4XSA9IGFyeVt5XTtcbiAgYXJ5W3ldID0gdGVtcDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgd2l0aGluIHRoZSByYW5nZSBgbG93IC4uIGhpZ2hgIGluY2x1c2l2ZS5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbG93XG4gKiAgICAgICAgVGhlIGxvd2VyIGJvdW5kIG9uIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBoaWdoXG4gKiAgICAgICAgVGhlIHVwcGVyIGJvdW5kIG9uIHRoZSByYW5nZS5cbiAqL1xuZnVuY3Rpb24gcmFuZG9tSW50SW5SYW5nZShsb3csIGhpZ2gpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQobG93ICsgKE1hdGgucmFuZG9tKCkgKiAoaGlnaCAtIGxvdykpKTtcbn1cblxuLyoqXG4gKiBUaGUgUXVpY2sgU29ydCBhbGdvcml0aG0uXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJ5XG4gKiAgICAgICAgQW4gYXJyYXkgdG8gc29ydC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbXBhcmF0b3JcbiAqICAgICAgICBGdW5jdGlvbiB0byB1c2UgdG8gY29tcGFyZSB0d28gaXRlbXMuXG4gKiBAcGFyYW0ge051bWJlcn0gcFxuICogICAgICAgIFN0YXJ0IGluZGV4IG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IHJcbiAqICAgICAgICBFbmQgaW5kZXggb2YgdGhlIGFycmF5XG4gKi9cbmZ1bmN0aW9uIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgcCwgcikge1xuICAvLyBJZiBvdXIgbG93ZXIgYm91bmQgaXMgbGVzcyB0aGFuIG91ciB1cHBlciBib3VuZCwgd2UgKDEpIHBhcnRpdGlvbiB0aGVcbiAgLy8gYXJyYXkgaW50byB0d28gcGllY2VzIGFuZCAoMikgcmVjdXJzZSBvbiBlYWNoIGhhbGYuIElmIGl0IGlzIG5vdCwgdGhpcyBpc1xuICAvLyB0aGUgZW1wdHkgYXJyYXkgYW5kIG91ciBiYXNlIGNhc2UuXG5cbiAgaWYgKHAgPCByKSB7XG4gICAgLy8gKDEpIFBhcnRpdGlvbmluZy5cbiAgICAvL1xuICAgIC8vIFRoZSBwYXJ0aXRpb25pbmcgY2hvb3NlcyBhIHBpdm90IGJldHdlZW4gYHBgIGFuZCBgcmAgYW5kIG1vdmVzIGFsbFxuICAgIC8vIGVsZW1lbnRzIHRoYXQgYXJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcGl2b3QgdG8gdGhlIGJlZm9yZSBpdCwgYW5kXG4gICAgLy8gYWxsIHRoZSBlbGVtZW50cyB0aGF0IGFyZSBncmVhdGVyIHRoYW4gaXQgYWZ0ZXIgaXQuIFRoZSBlZmZlY3QgaXMgdGhhdFxuICAgIC8vIG9uY2UgcGFydGl0aW9uIGlzIGRvbmUsIHRoZSBwaXZvdCBpcyBpbiB0aGUgZXhhY3QgcGxhY2UgaXQgd2lsbCBiZSB3aGVuXG4gICAgLy8gdGhlIGFycmF5IGlzIHB1dCBpbiBzb3J0ZWQgb3JkZXIsIGFuZCBpdCB3aWxsIG5vdCBuZWVkIHRvIGJlIG1vdmVkXG4gICAgLy8gYWdhaW4uIFRoaXMgcnVucyBpbiBPKG4pIHRpbWUuXG5cbiAgICAvLyBBbHdheXMgY2hvb3NlIGEgcmFuZG9tIHBpdm90IHNvIHRoYXQgYW4gaW5wdXQgYXJyYXkgd2hpY2ggaXMgcmV2ZXJzZVxuICAgIC8vIHNvcnRlZCBkb2VzIG5vdCBjYXVzZSBPKG5eMikgcnVubmluZyB0aW1lLlxuICAgIHZhciBwaXZvdEluZGV4ID0gcmFuZG9tSW50SW5SYW5nZShwLCByKTtcbiAgICB2YXIgaSA9IHAgLSAxO1xuXG4gICAgc3dhcChhcnksIHBpdm90SW5kZXgsIHIpO1xuICAgIHZhciBwaXZvdCA9IGFyeVtyXTtcblxuICAgIC8vIEltbWVkaWF0ZWx5IGFmdGVyIGBqYCBpcyBpbmNyZW1lbnRlZCBpbiB0aGlzIGxvb3AsIHRoZSBmb2xsb3dpbmcgaG9sZFxuICAgIC8vIHRydWU6XG4gICAgLy9cbiAgICAvLyAgICogRXZlcnkgZWxlbWVudCBpbiBgYXJ5W3AgLi4gaV1gIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcGl2b3QuXG4gICAgLy9cbiAgICAvLyAgICogRXZlcnkgZWxlbWVudCBpbiBgYXJ5W2krMSAuLiBqLTFdYCBpcyBncmVhdGVyIHRoYW4gdGhlIHBpdm90LlxuICAgIGZvciAodmFyIGogPSBwOyBqIDwgcjsgaisrKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcihhcnlbal0sIHBpdm90KSA8PSAwKSB7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgc3dhcChhcnksIGksIGopO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3YXAoYXJ5LCBpICsgMSwgaik7XG4gICAgdmFyIHEgPSBpICsgMTtcblxuICAgIC8vICgyKSBSZWN1cnNlIG9uIGVhY2ggaGFsZi5cblxuICAgIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgcCwgcSAtIDEpO1xuICAgIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgcSArIDEsIHIpO1xuICB9XG59XG5cbi8qKlxuICogU29ydCB0aGUgZ2l2ZW4gYXJyYXkgaW4tcGxhY2Ugd2l0aCB0aGUgZ2l2ZW4gY29tcGFyYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqL1xuZXhwb3J0cy5xdWlja1NvcnQgPSBmdW5jdGlvbiAoYXJ5LCBjb21wYXJhdG9yKSB7XG4gIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgMCwgYXJ5Lmxlbmd0aCAtIDEpO1xufTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBiaW5hcnlTZWFyY2ggPSByZXF1aXJlKCcuL2JpbmFyeS1zZWFyY2gnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG52YXIgcXVpY2tTb3J0ID0gcmVxdWlyZSgnLi9xdWljay1zb3J0JykucXVpY2tTb3J0O1xuXG5mdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gIHZhciBzb3VyY2VNYXAgPSBhU291cmNlTWFwO1xuICBpZiAodHlwZW9mIGFTb3VyY2VNYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgc291cmNlTWFwID0gdXRpbC5wYXJzZVNvdXJjZU1hcElucHV0KGFTb3VyY2VNYXApO1xuICB9XG5cbiAgcmV0dXJuIHNvdXJjZU1hcC5zZWN0aW9ucyAhPSBudWxsXG4gICAgPyBuZXcgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTClcbiAgICA6IG5ldyBCYXNpY1NvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCk7XG59XG5cblNvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPSBmdW5jdGlvbihhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gIHJldHVybiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCk7XG59XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vLyBgX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kIGBfX29yaWdpbmFsTWFwcGluZ3NgIGFyZSBhcnJheXMgdGhhdCBob2xkIHRoZVxuLy8gcGFyc2VkIG1hcHBpbmcgY29vcmRpbmF0ZXMgZnJvbSB0aGUgc291cmNlIG1hcCdzIFwibWFwcGluZ3NcIiBhdHRyaWJ1dGUuIFRoZXlcbi8vIGFyZSBsYXppbHkgaW5zdGFudGlhdGVkLCBhY2Nlc3NlZCB2aWEgdGhlIGBfZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuLy8gYF9vcmlnaW5hbE1hcHBpbmdzYCBnZXR0ZXJzIHJlc3BlY3RpdmVseSwgYW5kIHdlIG9ubHkgcGFyc2UgdGhlIG1hcHBpbmdzXG4vLyBhbmQgY3JlYXRlIHRoZXNlIGFycmF5cyBvbmNlIHF1ZXJpZWQgZm9yIGEgc291cmNlIGxvY2F0aW9uLiBXZSBqdW1wIHRocm91Z2hcbi8vIHRoZXNlIGhvb3BzIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG1hbnkgdGhvdXNhbmRzIG9mIG1hcHBpbmdzLCBhbmQgcGFyc2luZ1xuLy8gdGhlbSBpcyBleHBlbnNpdmUsIHNvIHdlIG9ubHkgd2FudCB0byBkbyBpdCBpZiB3ZSBtdXN0LlxuLy9cbi8vIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheXMgaXMgb2YgdGhlIGZvcm06XG4vL1xuLy8gICAgIHtcbi8vICAgICAgIGdlbmVyYXRlZExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBnZW5lcmF0ZWRDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIHNvdXJjZTogVGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXNcbi8vICAgICAgICAgICAgICAgY2h1bmsgb2YgY29kZSxcbi8vICAgICAgIG9yaWdpbmFsTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sIHdoaWNoIGdlbmVyYXRlZCB0aGlzIGNodW5rIG9mXG4vLyAgICAgICAgICAgICBjb2RlLlxuLy8gICAgIH1cbi8vXG4vLyBBbGwgcHJvcGVydGllcyBleGNlcHQgZm9yIGBnZW5lcmF0ZWRMaW5lYCBhbmQgYGdlbmVyYXRlZENvbHVtbmAgY2FuIGJlXG4vLyBgbnVsbGAuXG4vL1xuLy8gYF9nZW5lcmF0ZWRNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucy5cbi8vXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucy5cblxuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBudWxsO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19nZW5lcmF0ZWRNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncykge1xuICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzO1xuICB9XG59KTtcblxuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX29yaWdpbmFsTWFwcGluZ3MnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncykge1xuICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fX29yaWdpbmFsTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGluZGV4KSB7XG4gICAgdmFyIGMgPSBhU3RyLmNoYXJBdChpbmRleCk7XG4gICAgcmV0dXJuIGMgPT09IFwiO1wiIHx8IGMgPT09IFwiLFwiO1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgX3BhcnNlTWFwcGluZ3NcIik7XG4gIH07XG5cblNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUiA9IDE7XG5Tb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUiA9IDI7XG5cblNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EID0gMjtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgZWFjaCBtYXBwaW5nIGJldHdlZW4gYW4gb3JpZ2luYWwgc291cmNlL2xpbmUvY29sdW1uIGFuZCBhXG4gKiBnZW5lcmF0ZWQgbGluZS9jb2x1bW4gaW4gdGhpcyBzb3VyY2UgbWFwLlxuICpcbiAqIEBwYXJhbSBGdW5jdGlvbiBhQ2FsbGJhY2tcbiAqICAgICAgICBUaGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2l0aCBlYWNoIG1hcHBpbmcuXG4gKiBAcGFyYW0gT2JqZWN0IGFDb250ZXh0XG4gKiAgICAgICAgT3B0aW9uYWwuIElmIHNwZWNpZmllZCwgdGhpcyBvYmplY3Qgd2lsbCBiZSB0aGUgdmFsdWUgb2YgYHRoaXNgIGV2ZXJ5XG4gKiAgICAgICAgdGltZSB0aGF0IGBhQ2FsbGJhY2tgIGlzIGNhbGxlZC5cbiAqIEBwYXJhbSBhT3JkZXJcbiAqICAgICAgICBFaXRoZXIgYFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUmAgb3JcbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVJgLiBTcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0b1xuICogICAgICAgIGl0ZXJhdGUgb3ZlciB0aGUgbWFwcGluZ3Mgc29ydGVkIGJ5IHRoZSBnZW5lcmF0ZWQgZmlsZSdzIGxpbmUvY29sdW1uXG4gKiAgICAgICAgb3JkZXIgb3IgdGhlIG9yaWdpbmFsJ3Mgc291cmNlL2xpbmUvY29sdW1uIG9yZGVyLCByZXNwZWN0aXZlbHkuIERlZmF1bHRzIHRvXG4gKiAgICAgICAgYFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUmAuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5lYWNoTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2VhY2hNYXBwaW5nKGFDYWxsYmFjaywgYUNvbnRleHQsIGFPcmRlcikge1xuICAgIHZhciBjb250ZXh0ID0gYUNvbnRleHQgfHwgbnVsbDtcbiAgICB2YXIgb3JkZXIgPSBhT3JkZXIgfHwgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSO1xuXG4gICAgdmFyIG1hcHBpbmdzO1xuICAgIHN3aXRjaCAob3JkZXIpIHtcbiAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUjpcbiAgICAgIG1hcHBpbmdzID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gb3JkZXIgb2YgaXRlcmF0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuc291cmNlUm9vdDtcbiAgICBtYXBwaW5ncy5tYXAoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBtYXBwaW5nLnNvdXJjZSA9PT0gbnVsbCA/IG51bGwgOiB0aGlzLl9zb3VyY2VzLmF0KG1hcHBpbmcuc291cmNlKTtcbiAgICAgIHNvdXJjZSA9IHV0aWwuY29tcHV0ZVNvdXJjZVVSTChzb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uLFxuICAgICAgICBvcmlnaW5hbExpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgbmFtZTogbWFwcGluZy5uYW1lID09PSBudWxsID8gbnVsbCA6IHRoaXMuX25hbWVzLmF0KG1hcHBpbmcubmFtZSlcbiAgICAgIH07XG4gICAgfSwgdGhpcykuZm9yRWFjaChhQ2FsbGJhY2ssIGNvbnRleHQpO1xuICB9O1xuXG4vKipcbiAqIFJldHVybnMgYWxsIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHByb3ZpZGVkLiBJZiBubyBjb2x1bW4gaXMgcHJvdmlkZWQsIHJldHVybnMgYWxsIG1hcHBpbmdzXG4gKiBjb3JyZXNwb25kaW5nIHRvIGEgZWl0aGVyIHRoZSBsaW5lIHdlIGFyZSBzZWFyY2hpbmcgZm9yIG9yIHRoZSBuZXh0XG4gKiBjbG9zZXN0IGxpbmUgdGhhdCBoYXMgYW55IG1hcHBpbmdzLiBPdGhlcndpc2UsIHJldHVybnMgYWxsIG1hcHBpbmdzXG4gKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaW5lIGFuZCBlaXRoZXIgdGhlIGNvbHVtbiB3ZSBhcmUgc2VhcmNoaW5nIGZvclxuICogb3IgdGhlIG5leHQgY2xvc2VzdCBjb2x1bW4gdGhhdCBoYXMgYW55IG9mZnNldHMuXG4gKlxuICogVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBmaWxlbmFtZSBvZiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBPcHRpb25hbC4gdGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgIFRoZSBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKlxuICogYW5kIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcmV0dXJuZWQsIGVhY2ggd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmFsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2FsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvcihhQXJncykge1xuICAgIHZhciBsaW5lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyk7XG5cbiAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGV4YWN0IG1hdGNoLCBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmdcbiAgICAvLyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCBtYXBwaW5nIGxlc3MgdGhhbiB0aGUgbmVlZGxlLiBCeVxuICAgIC8vIHNldHRpbmcgbmVlZGxlLm9yaWdpbmFsQ29sdW1uIHRvIDAsIHdlIHRodXMgZmluZCB0aGUgbGFzdCBtYXBwaW5nIGZvclxuICAgIC8vIHRoZSBnaXZlbiBsaW5lLCBwcm92aWRlZCBzdWNoIGEgbWFwcGluZyBleGlzdHMuXG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIHNvdXJjZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSxcbiAgICAgIG9yaWdpbmFsTGluZTogbGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicsIDApXG4gICAgfTtcblxuICAgIG5lZWRsZS5zb3VyY2UgPSB0aGlzLl9maW5kU291cmNlSW5kZXgobmVlZGxlLnNvdXJjZSk7XG4gICAgaWYgKG5lZWRsZS5zb3VyY2UgPCAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIG1hcHBpbmdzID0gW107XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhuZWVkbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsTGluZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmFyeVNlYXJjaC5MRUFTVF9VUFBFUl9CT1VORCk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChhQXJncy5jb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgb3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB1bnRpbCBlaXRoZXIgd2UgcnVuIG91dCBvZiBtYXBwaW5ncywgb3Igd2UgcnVuIGludG9cbiAgICAgICAgLy8gYSBtYXBwaW5nIGZvciBhIGRpZmZlcmVudCBsaW5lIHRoYW4gdGhlIG9uZSB3ZSBmb3VuZC4gU2luY2VcbiAgICAgICAgLy8gbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBmb3VuZC5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09IG9yaWdpbmFsTGluZSkge1xuICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZExpbmUnLCBudWxsKSxcbiAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbKytpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBvcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB1bnRpbCBlaXRoZXIgd2UgcnVuIG91dCBvZiBtYXBwaW5ncywgb3Igd2UgcnVuIGludG9cbiAgICAgICAgLy8gYSBtYXBwaW5nIGZvciBhIGRpZmZlcmVudCBsaW5lIHRoYW4gdGhlIG9uZSB3ZSB3ZXJlIHNlYXJjaGluZyBmb3IuXG4gICAgICAgIC8vIFNpbmNlIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBmaW5kIGFsbCBtYXBwaW5ncyBmb3JcbiAgICAgICAgLy8gdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IuXG4gICAgICAgIHdoaWxlIChtYXBwaW5nICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gbGluZSAmJlxuICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9PSBvcmlnaW5hbENvbHVtbikge1xuICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZExpbmUnLCBudWxsKSxcbiAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbKytpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFwcGluZ3M7XG4gIH07XG5cbmV4cG9ydHMuU291cmNlTWFwQ29uc3VtZXIgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuLyoqXG4gKiBBIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5zdGFuY2UgcmVwcmVzZW50cyBhIHBhcnNlZCBzb3VyY2UgbWFwIHdoaWNoIHdlIGNhblxuICogcXVlcnkgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBmaWxlIHBvc2l0aW9ucyBieSBnaXZpbmcgaXQgYSBmaWxlXG4gKiBwb3NpdGlvbiBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqXG4gKiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yXG4gKiBhbHJlYWR5IHBhcnNlZCB0byBhbiBvYmplY3QpLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHNvdXJjZSBtYXBzIGhhdmUgdGhlXG4gKiBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqXG4gKiAgIC0gdmVyc2lvbjogV2hpY2ggdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcCBzcGVjIHRoaXMgbWFwIGlzIGZvbGxvd2luZy5cbiAqICAgLSBzb3VyY2VzOiBBbiBhcnJheSBvZiBVUkxzIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbmFtZXM6IEFuIGFycmF5IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSByZWZlcnJlbmNlZCBieSBpbmRpdmlkdWFsIG1hcHBpbmdzLlxuICogICAtIHNvdXJjZVJvb3Q6IE9wdGlvbmFsLiBUaGUgVVJMIHJvb3QgZnJvbSB3aGljaCBhbGwgc291cmNlcyBhcmUgcmVsYXRpdmUuXG4gKiAgIC0gc291cmNlc0NvbnRlbnQ6IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLlxuICogICAtIG1hcHBpbmdzOiBBIHN0cmluZyBvZiBiYXNlNjQgVkxRcyB3aGljaCBjb250YWluIHRoZSBhY3R1YWwgbWFwcGluZ3MuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICpcbiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF06XG4gKlxuICogICAgIHtcbiAqICAgICAgIHZlcnNpb24gOiAzLFxuICogICAgICAgZmlsZTogXCJvdXQuanNcIixcbiAqICAgICAgIHNvdXJjZVJvb3QgOiBcIlwiLFxuICogICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICogICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICBtYXBwaW5nczogXCJBQSxBQjs7QUJDREU7XCJcbiAqICAgICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0P3BsaT0xI1xuICovXG5mdW5jdGlvbiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNvdXJjZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzJyk7XG4gIC8vIFNhc3MgMy4zIGxlYXZlcyBvdXQgdGhlICduYW1lcycgYXJyYXksIHNvIHdlIGRldmlhdGUgZnJvbSB0aGUgc3BlYyAod2hpY2hcbiAgLy8gcmVxdWlyZXMgdGhlIGFycmF5KSB0byBwbGF5IG5pY2UgaGVyZS5cbiAgdmFyIG5hbWVzID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnbmFtZXMnLCBbXSk7XG4gIHZhciBzb3VyY2VSb290ID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB2YXIgc291cmNlc0NvbnRlbnQgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzQ29udGVudCcsIG51bGwpO1xuICB2YXIgbWFwcGluZ3MgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdtYXBwaW5ncycpO1xuICB2YXIgZmlsZSA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ2ZpbGUnLCBudWxsKTtcblxuICAvLyBPbmNlIGFnYWluLCBTYXNzIGRldmlhdGVzIGZyb20gdGhlIHNwZWMgYW5kIHN1cHBsaWVzIHRoZSB2ZXJzaW9uIGFzIGFcbiAgLy8gc3RyaW5nIHJhdGhlciB0aGFuIGEgbnVtYmVyLCBzbyB3ZSB1c2UgbG9vc2UgZXF1YWxpdHkgY2hlY2tpbmcgaGVyZS5cbiAgaWYgKHZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICB9XG5cbiAgaWYgKHNvdXJjZVJvb3QpIHtcbiAgICBzb3VyY2VSb290ID0gdXRpbC5ub3JtYWxpemUoc291cmNlUm9vdCk7XG4gIH1cblxuICBzb3VyY2VzID0gc291cmNlc1xuICAgIC5tYXAoU3RyaW5nKVxuICAgIC8vIFNvbWUgc291cmNlIG1hcHMgcHJvZHVjZSByZWxhdGl2ZSBzb3VyY2UgcGF0aHMgbGlrZSBcIi4vZm9vLmpzXCIgaW5zdGVhZCBvZlxuICAgIC8vIFwiZm9vLmpzXCIuICBOb3JtYWxpemUgdGhlc2UgZmlyc3Qgc28gdGhhdCBmdXR1cmUgY29tcGFyaXNvbnMgd2lsbCBzdWNjZWVkLlxuICAgIC8vIFNlZSBidWd6aWwubGEvMTA5MDc2OC5cbiAgICAubWFwKHV0aWwubm9ybWFsaXplKVxuICAgIC8vIEFsd2F5cyBlbnN1cmUgdGhhdCBhYnNvbHV0ZSBzb3VyY2VzIGFyZSBpbnRlcm5hbGx5IHN0b3JlZCByZWxhdGl2ZSB0b1xuICAgIC8vIHRoZSBzb3VyY2Ugcm9vdCwgaWYgdGhlIHNvdXJjZSByb290IGlzIGFic29sdXRlLiBOb3QgZG9pbmcgdGhpcyB3b3VsZFxuICAgIC8vIGJlIHBhcnRpY3VsYXJseSBwcm9ibGVtYXRpYyB3aGVuIHRoZSBzb3VyY2Ugcm9vdCBpcyBhIHByZWZpeCBvZiB0aGVcbiAgICAvLyBzb3VyY2UgKHZhbGlkLCBidXQgd2h5Pz8pLiBTZWUgZ2l0aHViIGlzc3VlICMxOTkgYW5kIGJ1Z3ppbC5sYS8xMTg4OTgyLlxuICAgIC5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIHNvdXJjZVJvb3QgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZVJvb3QpICYmIHV0aWwuaXNBYnNvbHV0ZShzb3VyY2UpXG4gICAgICAgID8gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2UpXG4gICAgICAgIDogc291cmNlO1xuICAgIH0pO1xuXG4gIC8vIFBhc3MgYHRydWVgIGJlbG93IHRvIGFsbG93IGR1cGxpY2F0ZSBuYW1lcyBhbmQgc291cmNlcy4gV2hpbGUgc291cmNlIG1hcHNcbiAgLy8gYXJlIGludGVuZGVkIHRvIGJlIGNvbXByZXNzZWQgYW5kIGRlZHVwbGljYXRlZCwgdGhlIFR5cGVTY3JpcHQgY29tcGlsZXJcbiAgLy8gc29tZXRpbWVzIGdlbmVyYXRlcyBzb3VyY2UgbWFwcyB3aXRoIGR1cGxpY2F0ZXMgaW4gdGhlbS4gU2VlIEdpdGh1YiBpc3N1ZVxuICAvLyAjNzIgYW5kIGJ1Z3ppbC5sYS84ODk0OTIuXG4gIHRoaXMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KG5hbWVzLm1hcChTdHJpbmcpLCB0cnVlKTtcbiAgdGhpcy5fc291cmNlcyA9IEFycmF5U2V0LmZyb21BcnJheShzb3VyY2VzLCB0cnVlKTtcblxuICB0aGlzLl9hYnNvbHV0ZVNvdXJjZXMgPSB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHMsIGFTb3VyY2VNYXBVUkwpO1xuICB9KTtcblxuICB0aGlzLnNvdXJjZVJvb3QgPSBzb3VyY2VSb290O1xuICB0aGlzLnNvdXJjZXNDb250ZW50ID0gc291cmNlc0NvbnRlbnQ7XG4gIHRoaXMuX21hcHBpbmdzID0gbWFwcGluZ3M7XG4gIHRoaXMuX3NvdXJjZU1hcFVSTCA9IGFTb3VyY2VNYXBVUkw7XG4gIHRoaXMuZmlsZSA9IGZpbGU7XG59XG5cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuY29uc3VtZXIgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGluZGV4IG9mIGEgc291cmNlLiAgUmV0dXJucyAtMSBpZiBub3RcbiAqIGZvdW5kLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZFNvdXJjZUluZGV4ID0gZnVuY3Rpb24oYVNvdXJjZSkge1xuICB2YXIgcmVsYXRpdmVTb3VyY2UgPSBhU291cmNlO1xuICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gIH1cblxuICBpZiAodGhpcy5fc291cmNlcy5oYXMocmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZXMuaW5kZXhPZihyZWxhdGl2ZVNvdXJjZSk7XG4gIH1cblxuICAvLyBNYXliZSBhU291cmNlIGlzIGFuIGFic29sdXRlIFVSTCBhcyByZXR1cm5lZCBieSB8c291cmNlc3wuICBJblxuICAvLyB0aGlzIGNhc2Ugd2UgY2FuJ3Qgc2ltcGx5IHVuZG8gdGhlIHRyYW5zZm9ybS5cbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9hYnNvbHV0ZVNvdXJjZXMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAodGhpcy5fYWJzb2x1dGVTb3VyY2VzW2ldID09IGFTb3VyY2UpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBmcm9tIGEgU291cmNlTWFwR2VuZXJhdG9yLlxuICpcbiAqIEBwYXJhbSBTb3VyY2VNYXBHZW5lcmF0b3IgYVNvdXJjZU1hcFxuICogICAgICAgIFRoZSBzb3VyY2UgbWFwIHRoYXQgd2lsbCBiZSBjb25zdW1lZC5cbiAqIEBwYXJhbSBTdHJpbmcgYVNvdXJjZU1hcFVSTFxuICogICAgICAgIFRoZSBVUkwgYXQgd2hpY2ggdGhlIHNvdXJjZSBtYXAgY2FuIGJlIGZvdW5kIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEJhc2ljU291cmNlTWFwQ29uc3VtZXJcbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gICAgdmFyIHNtYyA9IE9iamVjdC5jcmVhdGUoQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuXG4gICAgdmFyIG5hbWVzID0gc21jLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShhU291cmNlTWFwLl9uYW1lcy50b0FycmF5KCksIHRydWUpO1xuICAgIHZhciBzb3VyY2VzID0gc21jLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX3NvdXJjZXMudG9BcnJheSgpLCB0cnVlKTtcbiAgICBzbWMuc291cmNlUm9vdCA9IGFTb3VyY2VNYXAuX3NvdXJjZVJvb3Q7XG4gICAgc21jLnNvdXJjZXNDb250ZW50ID0gYVNvdXJjZU1hcC5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChzbWMuX3NvdXJjZXMudG9BcnJheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jLnNvdXJjZVJvb3QpO1xuICAgIHNtYy5maWxlID0gYVNvdXJjZU1hcC5fZmlsZTtcbiAgICBzbWMuX3NvdXJjZU1hcFVSTCA9IGFTb3VyY2VNYXBVUkw7XG4gICAgc21jLl9hYnNvbHV0ZVNvdXJjZXMgPSBzbWMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHV0aWwuY29tcHV0ZVNvdXJjZVVSTChzbWMuc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gICAgfSk7XG5cbiAgICAvLyBCZWNhdXNlIHdlIGFyZSBtb2RpZnlpbmcgdGhlIGVudHJpZXMgKGJ5IGNvbnZlcnRpbmcgc3RyaW5nIHNvdXJjZXMgYW5kXG4gICAgLy8gbmFtZXMgdG8gaW5kaWNlcyBpbnRvIHRoZSBzb3VyY2VzIGFuZCBuYW1lcyBBcnJheVNldHMpLCB3ZSBoYXZlIHRvIG1ha2VcbiAgICAvLyBhIGNvcHkgb2YgdGhlIGVudHJ5IG9yIGVsc2UgYmFkIHRoaW5ncyBoYXBwZW4uIFNoYXJlZCBtdXRhYmxlIHN0YXRlXG4gICAgLy8gc3RyaWtlcyBhZ2FpbiEgU2VlIGdpdGh1YiBpc3N1ZSAjMTkxLlxuXG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gYVNvdXJjZU1hcC5fbWFwcGluZ3MudG9BcnJheSgpLnNsaWNlKCk7XG4gICAgdmFyIGRlc3RHZW5lcmF0ZWRNYXBwaW5ncyA9IHNtYy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIGRlc3RPcmlnaW5hbE1hcHBpbmdzID0gc21jLl9fb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGdlbmVyYXRlZE1hcHBpbmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3JjTWFwcGluZyA9IGdlbmVyYXRlZE1hcHBpbmdzW2ldO1xuICAgICAgdmFyIGRlc3RNYXBwaW5nID0gbmV3IE1hcHBpbmc7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gc3JjTWFwcGluZy5nZW5lcmF0ZWRMaW5lO1xuICAgICAgZGVzdE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uID0gc3JjTWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG5cbiAgICAgIGlmIChzcmNNYXBwaW5nLnNvdXJjZSkge1xuICAgICAgICBkZXN0TWFwcGluZy5zb3VyY2UgPSBzb3VyY2VzLmluZGV4T2Yoc3JjTWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbExpbmUgPSBzcmNNYXBwaW5nLm9yaWdpbmFsTGluZTtcbiAgICAgICAgZGVzdE1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBzcmNNYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIGlmIChzcmNNYXBwaW5nLm5hbWUpIHtcbiAgICAgICAgICBkZXN0TWFwcGluZy5uYW1lID0gbmFtZXMuaW5kZXhPZihzcmNNYXBwaW5nLm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzdE9yaWdpbmFsTWFwcGluZ3MucHVzaChkZXN0TWFwcGluZyk7XG4gICAgICB9XG5cbiAgICAgIGRlc3RHZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICB9XG5cbiAgICBxdWlja1NvcnQoc21jLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG5cbiAgICByZXR1cm4gc21jO1xuICB9O1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIG9yaWdpbmFsIHNvdXJjZXMuXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ3NvdXJjZXMnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9hYnNvbHV0ZVNvdXJjZXMuc2xpY2UoKTtcbiAgfVxufSk7XG5cbi8qKlxuICogUHJvdmlkZSB0aGUgSklUIHdpdGggYSBuaWNlIHNoYXBlIC8gaGlkZGVuIGNsYXNzLlxuICovXG5mdW5jdGlvbiBNYXBwaW5nKCkge1xuICB0aGlzLmdlbmVyYXRlZExpbmUgPSAwO1xuICB0aGlzLmdlbmVyYXRlZENvbHVtbiA9IDA7XG4gIHRoaXMuc291cmNlID0gbnVsbDtcbiAgdGhpcy5vcmlnaW5hbExpbmUgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsQ29sdW1uID0gbnVsbDtcbiAgdGhpcy5uYW1lID0gbnVsbDtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHZhciBnZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c09yaWdpbmFsTGluZSA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgdmFyIHByZXZpb3VzTmFtZSA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IGFTdHIubGVuZ3RoO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNhY2hlZFNlZ21lbnRzID0ge307XG4gICAgdmFyIHRlbXAgPSB7fTtcbiAgICB2YXIgb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuICAgIHZhciBnZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgIHZhciBtYXBwaW5nLCBzdHIsIHNlZ21lbnQsIGVuZCwgdmFsdWU7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChhU3RyLmNoYXJBdChpbmRleCkgPT09ICc7Jykge1xuICAgICAgICBnZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJywnKSB7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbWFwcGluZyA9IG5ldyBNYXBwaW5nKCk7XG4gICAgICAgIG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9IGdlbmVyYXRlZExpbmU7XG5cbiAgICAgICAgLy8gQmVjYXVzZSBlYWNoIG9mZnNldCBpcyBlbmNvZGVkIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBvbmUsXG4gICAgICAgIC8vIG1hbnkgc2VnbWVudHMgb2Z0ZW4gaGF2ZSB0aGUgc2FtZSBlbmNvZGluZy4gV2UgY2FuIGV4cGxvaXQgdGhpc1xuICAgICAgICAvLyBmYWN0IGJ5IGNhY2hpbmcgdGhlIHBhcnNlZCB2YXJpYWJsZSBsZW5ndGggZmllbGRzIG9mIGVhY2ggc2VnbWVudCxcbiAgICAgICAgLy8gYWxsb3dpbmcgdXMgdG8gYXZvaWQgYSBzZWNvbmQgcGFyc2UgaWYgd2UgZW5jb3VudGVyIHRoZSBzYW1lXG4gICAgICAgIC8vIHNlZ21lbnQgYWdhaW4uXG4gICAgICAgIGZvciAoZW5kID0gaW5kZXg7IGVuZCA8IGxlbmd0aDsgZW5kKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5fY2hhcklzTWFwcGluZ1NlcGFyYXRvcihhU3RyLCBlbmQpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RyID0gYVN0ci5zbGljZShpbmRleCwgZW5kKTtcblxuICAgICAgICBzZWdtZW50ID0gY2FjaGVkU2VnbWVudHNbc3RyXTtcbiAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICBpbmRleCArPSBzdHIubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlZ21lbnQgPSBbXTtcbiAgICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHtcbiAgICAgICAgICAgIGJhc2U2NFZMUS5kZWNvZGUoYVN0ciwgaW5kZXgsIHRlbXApO1xuICAgICAgICAgICAgdmFsdWUgPSB0ZW1wLnZhbHVlO1xuICAgICAgICAgICAgaW5kZXggPSB0ZW1wLnJlc3Q7XG4gICAgICAgICAgICBzZWdtZW50LnB1c2godmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBhIHNvdXJjZSwgYnV0IG5vIGxpbmUgYW5kIGNvbHVtbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBhIHNvdXJjZSBhbmQgbGluZSwgYnV0IG5vIGNvbHVtbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhY2hlZFNlZ21lbnRzW3N0cl0gPSBzZWdtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2VuZXJhdGVkIGNvbHVtbi5cbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiArIHNlZ21lbnRbMF07XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG5cbiAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID4gMSkge1xuICAgICAgICAgIC8vIE9yaWdpbmFsIHNvdXJjZS5cbiAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHByZXZpb3VzU291cmNlICsgc2VnbWVudFsxXTtcbiAgICAgICAgICBwcmV2aW91c1NvdXJjZSArPSBzZWdtZW50WzFdO1xuXG4gICAgICAgICAgLy8gT3JpZ2luYWwgbGluZS5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IHByZXZpb3VzT3JpZ2luYWxMaW5lICsgc2VnbWVudFsyXTtcbiAgICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICAgIC8vIExpbmVzIGFyZSBzdG9yZWQgMC1iYXNlZFxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lICs9IDE7XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBjb2x1bW4uXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gKyBzZWdtZW50WzNdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgLy8gT3JpZ2luYWwgbmFtZS5cbiAgICAgICAgICAgIG1hcHBpbmcubmFtZSA9IHByZXZpb3VzTmFtZSArIHNlZ21lbnRbNF07XG4gICAgICAgICAgICBwcmV2aW91c05hbWUgKz0gc2VnbWVudFs0XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBnZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICBpZiAodHlwZW9mIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIG9yaWdpbmFsTWFwcGluZ3MucHVzaChtYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydChnZW5lcmF0ZWRNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCk7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gZ2VuZXJhdGVkTWFwcGluZ3M7XG5cbiAgICBxdWlja1NvcnQob3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBvcmlnaW5hbE1hcHBpbmdzO1xuICB9O1xuXG4vKipcbiAqIEZpbmQgdGhlIG1hcHBpbmcgdGhhdCBiZXN0IG1hdGNoZXMgdGhlIGh5cG90aGV0aWNhbCBcIm5lZWRsZVwiIG1hcHBpbmcgdGhhdFxuICogd2UgYXJlIHNlYXJjaGluZyBmb3IgaW4gdGhlIGdpdmVuIFwiaGF5c3RhY2tcIiBvZiBtYXBwaW5ncy5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZmluZE1hcHBpbmcoYU5lZWRsZSwgYU1hcHBpbmdzLCBhTGluZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb2x1bW5OYW1lLCBhQ29tcGFyYXRvciwgYUJpYXMpIHtcbiAgICAvLyBUbyByZXR1cm4gdGhlIHBvc2l0aW9uIHdlIGFyZSBzZWFyY2hpbmcgZm9yLCB3ZSBtdXN0IGZpcnN0IGZpbmQgdGhlXG4gICAgLy8gbWFwcGluZyBmb3IgdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCB0aGVuIHJldHVybiB0aGUgb3Bwb3NpdGUgcG9zaXRpb24gaXRcbiAgICAvLyBwb2ludHMgdG8uIEJlY2F1c2UgdGhlIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHdlIGNhbiB1c2UgYmluYXJ5IHNlYXJjaCB0b1xuICAgIC8vIGZpbmQgdGhlIGJlc3QgbWFwcGluZy5cblxuICAgIGlmIChhTmVlZGxlW2FMaW5lTmFtZV0gPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTGluZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLCBnb3QgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICArIGFOZWVkbGVbYUxpbmVOYW1lXSk7XG4gICAgfVxuICAgIGlmIChhTmVlZGxlW2FDb2x1bW5OYW1lXSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbHVtbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLCBnb3QgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICArIGFOZWVkbGVbYUNvbHVtbk5hbWVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmluYXJ5U2VhcmNoLnNlYXJjaChhTmVlZGxlLCBhTWFwcGluZ3MsIGFDb21wYXJhdG9yLCBhQmlhcyk7XG4gIH07XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgbGFzdCBjb2x1bW4gZm9yIGVhY2ggZ2VuZXJhdGVkIG1hcHBpbmcuIFRoZSBsYXN0IGNvbHVtbiBpc1xuICogaW5jbHVzaXZlLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb21wdXRlQ29sdW1uU3BhbnMgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9jb21wdXRlQ29sdW1uU3BhbnMoKSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLmxlbmd0aDsgKytpbmRleCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIC8vIE1hcHBpbmdzIGRvIG5vdCBjb250YWluIGEgZmllbGQgZm9yIHRoZSBsYXN0IGdlbmVyYXRlZCBjb2x1bW50LiBXZVxuICAgICAgLy8gY2FuIGNvbWUgdXAgd2l0aCBhbiBvcHRpbWlzdGljIGVzdGltYXRlLCBob3dldmVyLCBieSBhc3N1bWluZyB0aGF0XG4gICAgICAvLyBtYXBwaW5ncyBhcmUgY29udGlndW91cyAoaS5lLiBnaXZlbiB0d28gY29uc2VjdXRpdmUgbWFwcGluZ3MsIHRoZVxuICAgICAgLy8gZmlyc3QgbWFwcGluZyBlbmRzIHdoZXJlIHRoZSBzZWNvbmQgb25lIHN0YXJ0cykuXG4gICAgICBpZiAoaW5kZXggKyAxIDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoKSB7XG4gICAgICAgIHZhciBuZXh0TWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4ICsgMV07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG1hcHBpbmcubGFzdEdlbmVyYXRlZENvbHVtbiA9IG5leHRNYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtIDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGxhc3QgbWFwcGluZyBmb3IgZWFjaCBsaW5lIHNwYW5zIHRoZSBlbnRpcmUgbGluZS5cbiAgICAgIG1hcHBpbmcubGFzdEdlbmVyYXRlZENvbHVtbiA9IEluZmluaXR5O1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqICAgLSBiaWFzOiBFaXRoZXIgJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdTb3VyY2VNYXBDb25zdW1lci5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlXG4gKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gKiAgICAgRGVmYXVsdHMgdG8gJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhcbiAgICAgIG5lZWRsZSxcbiAgICAgIHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLFxuICAgICAgXCJnZW5lcmF0ZWRMaW5lXCIsXG4gICAgICBcImdlbmVyYXRlZENvbHVtblwiLFxuICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCxcbiAgICAgIHV0aWwuZ2V0QXJnKGFBcmdzLCAnYmlhcycsIFNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EKVxuICAgICk7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnc291cmNlJywgbnVsbCk7XG4gICAgICAgIGlmIChzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmF0KHNvdXJjZSk7XG4gICAgICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHRoaXMuc291cmNlUm9vdCwgc291cmNlLCB0aGlzLl9zb3VyY2VNYXBVUkwpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcobWFwcGluZywgJ25hbWUnLCBudWxsKTtcbiAgICAgICAgaWYgKG5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuYXQobmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnb3JpZ2luYWxMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnb3JpZ2luYWxDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGwsXG4gICAgICBuYW1lOiBudWxsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5oYXNDb250ZW50c09mQWxsU291cmNlcyA9XG4gIGZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXJfaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKSB7XG4gICAgaWYgKCF0aGlzLnNvdXJjZXNDb250ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50Lmxlbmd0aCA+PSB0aGlzLl9zb3VyY2VzLnNpemUoKSAmJlxuICAgICAgIXRoaXMuc291cmNlc0NvbnRlbnQuc29tZShmdW5jdGlvbiAoc2MpIHsgcmV0dXJuIHNjID09IG51bGw7IH0pO1xuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50LiBUaGUgb25seSBhcmd1bWVudCBpcyB0aGUgdXJsIG9mIHRoZVxuICogb3JpZ2luYWwgc291cmNlIGZpbGUuIFJldHVybnMgbnVsbCBpZiBubyBvcmlnaW5hbCBzb3VyY2UgY29udGVudCBpc1xuICogYXZhaWxhYmxlLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfc291cmNlQ29udGVudEZvcihhU291cmNlLCBudWxsT25NaXNzaW5nKSB7XG4gICAgaWYgKCF0aGlzLnNvdXJjZXNDb250ZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kU291cmNlSW5kZXgoYVNvdXJjZSk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W2luZGV4XTtcbiAgICB9XG5cbiAgICB2YXIgcmVsYXRpdmVTb3VyY2UgPSBhU291cmNlO1xuICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgcmVsYXRpdmVTb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgcmVsYXRpdmVTb3VyY2UpO1xuICAgIH1cblxuICAgIHZhciB1cmw7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsXG4gICAgICAgICYmICh1cmwgPSB1dGlsLnVybFBhcnNlKHRoaXMuc291cmNlUm9vdCkpKSB7XG4gICAgICAvLyBYWFg6IGZpbGU6Ly8gVVJJcyBhbmQgYWJzb2x1dGUgcGF0aHMgbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yIGZvclxuICAgICAgLy8gbWFueSB1c2Vycy4gV2UgY2FuIGhlbHAgdGhlbSBvdXQgd2hlbiB0aGV5IGV4cGVjdCBmaWxlOi8vIFVSSXMgdG9cbiAgICAgIC8vIGJlaGF2ZSBsaWtlIGl0IHdvdWxkIGlmIHRoZXkgd2VyZSBydW5uaW5nIGEgbG9jYWwgSFRUUCBzZXJ2ZXIuIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODg1NTk3LlxuICAgICAgdmFyIGZpbGVVcmlBYnNQYXRoID0gcmVsYXRpdmVTb3VyY2UucmVwbGFjZSgvXmZpbGU6XFwvXFwvLywgXCJcIik7XG4gICAgICBpZiAodXJsLnNjaGVtZSA9PSBcImZpbGVcIlxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKGZpbGVVcmlBYnNQYXRoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoZmlsZVVyaUFic1BhdGgpXVxuICAgICAgfVxuXG4gICAgICBpZiAoKCF1cmwucGF0aCB8fCB1cmwucGF0aCA9PSBcIi9cIilcbiAgICAgICAgICAmJiB0aGlzLl9zb3VyY2VzLmhhcyhcIi9cIiArIHJlbGF0aXZlU291cmNlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoXCIvXCIgKyByZWxhdGl2ZVNvdXJjZSldO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCByZWN1cnNpdmVseSBmcm9tXG4gICAgLy8gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yLiBJbiB0aGF0IGNhc2UsIHdlXG4gICAgLy8gZG9uJ3Qgd2FudCB0byB0aHJvdyBpZiB3ZSBjYW4ndCBmaW5kIHRoZSBzb3VyY2UgLSB3ZSBqdXN0IHdhbnQgdG9cbiAgICAvLyByZXR1cm4gbnVsbCwgc28gd2UgcHJvdmlkZSBhIGZsYWcgdG8gZXhpdCBncmFjZWZ1bGx5LlxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIHJlbGF0aXZlU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXJcbiAqICAgICBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqICAgLSBiaWFzOiBFaXRoZXIgJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdTb3VyY2VNYXBDb25zdW1lci5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlXG4gKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gKiAgICAgRGVmYXVsdHMgdG8gJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuZ2VuZXJhdGVkUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpO1xuICAgIHNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChzb3VyY2UpO1xuICAgIGlmIChzb3VyY2UgPCAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgb3JpZ2luYWxMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IG5lZWRsZS5zb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG5leHBvcnRzLkJhc2ljU291cmNlTWFwQ29uc3VtZXIgPSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEFuIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2hcbiAqIHdlIGNhbiBxdWVyeSBmb3IgaW5mb3JtYXRpb24uIEl0IGRpZmZlcnMgZnJvbSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGluXG4gKiB0aGF0IGl0IHRha2VzIFwiaW5kZXhlZFwiIHNvdXJjZSBtYXBzIChpLmUuIG9uZXMgd2l0aCBhIFwic2VjdGlvbnNcIiBmaWVsZCkgYXNcbiAqIGlucHV0LlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yIGFscmVhZHlcbiAqIHBhcnNlZCB0byBhbiBvYmplY3QpLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMgZm9yIGluZGV4ZWQgc291cmNlIG1hcHMsIHRoZXlcbiAqIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIGZpbGU6IE9wdGlvbmFsLiBUaGUgZ2VuZXJhdGVkIGZpbGUgdGhpcyBzb3VyY2UgbWFwIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAqICAgLSBzZWN0aW9uczogQSBsaXN0IG9mIHNlY3Rpb24gZGVmaW5pdGlvbnMuXG4gKlxuICogRWFjaCB2YWx1ZSB1bmRlciB0aGUgXCJzZWN0aW9uc1wiIGZpZWxkIGhhcyB0d28gZmllbGRzOlxuICogICAtIG9mZnNldDogVGhlIG9mZnNldCBpbnRvIHRoZSBvcmlnaW5hbCBzcGVjaWZpZWQgYXQgd2hpY2ggdGhpcyBzZWN0aW9uXG4gKiAgICAgICBiZWdpbnMgdG8gYXBwbHksIGRlZmluZWQgYXMgYW4gb2JqZWN0IHdpdGggYSBcImxpbmVcIiBhbmQgXCJjb2x1bW5cIlxuICogICAgICAgZmllbGQuXG4gKiAgIC0gbWFwOiBBIHNvdXJjZSBtYXAgZGVmaW5pdGlvbi4gVGhpcyBzb3VyY2UgbWFwIGNvdWxkIGFsc28gYmUgaW5kZXhlZCxcbiAqICAgICAgIGJ1dCBkb2Vzbid0IGhhdmUgdG8gYmUuXG4gKlxuICogSW5zdGVhZCBvZiB0aGUgXCJtYXBcIiBmaWVsZCwgaXQncyBhbHNvIHBvc3NpYmxlIHRvIGhhdmUgYSBcInVybFwiIGZpZWxkXG4gKiBzcGVjaWZ5aW5nIGEgVVJMIHRvIHJldHJpZXZlIGEgc291cmNlIG1hcCBmcm9tLCBidXQgdGhhdCdzIGN1cnJlbnRseVxuICogdW5zdXBwb3J0ZWQuXG4gKlxuICogSGVyZSdzIGFuIGV4YW1wbGUgc291cmNlIG1hcCwgdGFrZW4gZnJvbSB0aGUgc291cmNlIG1hcCBzcGVjWzBdLCBidXRcbiAqIG1vZGlmaWVkIHRvIG9taXQgYSBzZWN0aW9uIHdoaWNoIHVzZXMgdGhlIFwidXJsXCIgZmllbGQuXG4gKlxuICogIHtcbiAqICAgIHZlcnNpb24gOiAzLFxuICogICAgZmlsZTogXCJhcHAuanNcIixcbiAqICAgIHNlY3Rpb25zOiBbe1xuICogICAgICBvZmZzZXQ6IHtsaW5lOjEwMCwgY29sdW1uOjEwfSxcbiAqICAgICAgbWFwOiB7XG4gKiAgICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICAgZmlsZTogXCJzZWN0aW9uLmpzXCIsXG4gKiAgICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICogICAgICAgIG5hbWVzOiBbXCJzcmNcIiwgXCJtYXBzXCIsIFwiYXJlXCIsIFwiZnVuXCJdLFxuICogICAgICAgIG1hcHBpbmdzOiBcIkFBQUEsRTs7QUJDREU7XCJcbiAqICAgICAgfVxuICogICAgfV0sXG4gKiAgfVxuICpcbiAqIFRoZSBzZWNvbmQgcGFyYW1ldGVyLCBpZiBnaXZlbiwgaXMgYSBzdHJpbmcgd2hvc2UgdmFsdWUgaXMgdGhlIFVSTFxuICogYXQgd2hpY2ggdGhlIHNvdXJjZSBtYXAgd2FzIGZvdW5kLiAgVGhpcyBVUkwgaXMgdXNlZCB0byBjb21wdXRlIHRoZVxuICogc291cmNlcyBhcnJheS5cbiAqXG4gKiBbMF06IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMVUxUkdBZWhRd1J5cFVUb3ZGMUtSbHBpT0Z6ZTBiLV8yZ2M2ZkFIMEtZMGsvZWRpdCNoZWFkaW5nPWguNTM1ZXMzeGVwcmd0XG4gKi9cbmZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gIHZhciBzb3VyY2VNYXAgPSBhU291cmNlTWFwO1xuICBpZiAodHlwZW9mIGFTb3VyY2VNYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgc291cmNlTWFwID0gdXRpbC5wYXJzZVNvdXJjZU1hcElucHV0KGFTb3VyY2VNYXApO1xuICB9XG5cbiAgdmFyIHZlcnNpb24gPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICd2ZXJzaW9uJyk7XG4gIHZhciBzZWN0aW9ucyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NlY3Rpb25zJyk7XG5cbiAgaWYgKHZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICB9XG5cbiAgdGhpcy5fc291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICB0aGlzLl9uYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gIHZhciBsYXN0T2Zmc2V0ID0ge1xuICAgIGxpbmU6IC0xLFxuICAgIGNvbHVtbjogMFxuICB9O1xuICB0aGlzLl9zZWN0aW9ucyA9IHNlY3Rpb25zLm1hcChmdW5jdGlvbiAocykge1xuICAgIGlmIChzLnVybCkge1xuICAgICAgLy8gVGhlIHVybCBmaWVsZCB3aWxsIHJlcXVpcmUgc3VwcG9ydCBmb3IgYXN5bmNocm9uaWNpdHkuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9pc3N1ZXMvMTZcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3VwcG9ydCBmb3IgdXJsIGZpZWxkIGluIHNlY3Rpb25zIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG4gICAgdmFyIG9mZnNldCA9IHV0aWwuZ2V0QXJnKHMsICdvZmZzZXQnKTtcbiAgICB2YXIgb2Zmc2V0TGluZSA9IHV0aWwuZ2V0QXJnKG9mZnNldCwgJ2xpbmUnKTtcbiAgICB2YXIgb2Zmc2V0Q29sdW1uID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnY29sdW1uJyk7XG5cbiAgICBpZiAob2Zmc2V0TGluZSA8IGxhc3RPZmZzZXQubGluZSB8fFxuICAgICAgICAob2Zmc2V0TGluZSA9PT0gbGFzdE9mZnNldC5saW5lICYmIG9mZnNldENvbHVtbiA8IGxhc3RPZmZzZXQuY29sdW1uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWN0aW9uIG9mZnNldHMgbXVzdCBiZSBvcmRlcmVkIGFuZCBub24tb3ZlcmxhcHBpbmcuJyk7XG4gICAgfVxuICAgIGxhc3RPZmZzZXQgPSBvZmZzZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2VuZXJhdGVkT2Zmc2V0OiB7XG4gICAgICAgIC8vIFRoZSBvZmZzZXQgZmllbGRzIGFyZSAwLWJhc2VkLCBidXQgd2UgdXNlIDEtYmFzZWQgaW5kaWNlcyB3aGVuXG4gICAgICAgIC8vIGVuY29kaW5nL2RlY29kaW5nIGZyb20gVkxRLlxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBvZmZzZXRMaW5lICsgMSxcbiAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBvZmZzZXRDb2x1bW4gKyAxXG4gICAgICB9LFxuICAgICAgY29uc3VtZXI6IG5ldyBTb3VyY2VNYXBDb25zdW1lcih1dGlsLmdldEFyZyhzLCAnbWFwJyksIGFTb3VyY2VNYXBVUkwpXG4gICAgfVxuICB9KTtcbn1cblxuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlKTtcbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIG9yaWdpbmFsIHNvdXJjZXMuXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNvdXJjZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuX3NlY3Rpb25zW2ldLmNvbnN1bWVyLnNvdXJjZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc291cmNlcy5wdXNoKHRoaXMuX3NlY3Rpb25zW2ldLmNvbnN1bWVyLnNvdXJjZXNbal0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc291cmNlcztcbiAgfVxufSk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlLCBsaW5lLCBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkXG4gKiBzb3VyY2UncyBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zIHByb3ZpZGVkLiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3RcbiAqIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXJcbiAqICAgICBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuICBUaGUgY29sdW1uXG4gKiAgICAgbnVtYmVyIGlzIDAtYmFzZWQuXG4gKlxuICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIG51bGwuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqICAgLSBuYW1lOiBUaGUgb3JpZ2luYWwgaWRlbnRpZmllciwgb3IgbnVsbC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX29yaWdpbmFsUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgZ2VuZXJhdGVkTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgLy8gRmluZCB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24gd2UncmUgdHJ5aW5nIHRvIG1hcFxuICAgIC8vIHRvIGFuIG9yaWdpbmFsIHBvc2l0aW9uLlxuICAgIHZhciBzZWN0aW9uSW5kZXggPSBiaW5hcnlTZWFyY2guc2VhcmNoKG5lZWRsZSwgdGhpcy5fc2VjdGlvbnMsXG4gICAgICBmdW5jdGlvbihuZWVkbGUsIHNlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNtcCA9IG5lZWRsZS5nZW5lcmF0ZWRMaW5lIC0gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZTtcbiAgICAgICAgaWYgKGNtcCkge1xuICAgICAgICAgIHJldHVybiBjbXA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgIHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbik7XG4gICAgICB9KTtcbiAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW3NlY3Rpb25JbmRleF07XG5cbiAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICBuYW1lOiBudWxsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzZWN0aW9uLmNvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgbGluZTogbmVlZGxlLmdlbmVyYXRlZExpbmUgLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgY29sdW1uOiBuZWVkbGUuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgIDogMCksXG4gICAgICBiaWFzOiBhQXJncy5iaWFzXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGV2ZXJ5IHNvdXJjZSBpbiB0aGUgc291cmNlXG4gKiBtYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5oYXNDb250ZW50c09mQWxsU291cmNlcyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdGlvbnMuZXZlcnkoZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiBzLmNvbnN1bWVyLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCk7XG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICB2YXIgY29udGVudCA9IHNlY3Rpb24uY29uc3VtZXIuc291cmNlQ29udGVudEZvcihhU291cmNlLCB0cnVlKTtcbiAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXJcbiAqICAgICBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLiBcbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICogICAgIFRoZSBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuZ2VuZXJhdGVkUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICAvLyBPbmx5IGNvbnNpZGVyIHRoaXMgc2VjdGlvbiBpZiB0aGUgcmVxdWVzdGVkIHNvdXJjZSBpcyBpbiB0aGUgbGlzdCBvZlxuICAgICAgLy8gc291cmNlcyBvZiB0aGUgY29uc3VtZXIuXG4gICAgICBpZiAoc2VjdGlvbi5jb25zdW1lci5fZmluZFNvdXJjZUluZGV4KHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJykpID09PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBnZW5lcmF0ZWRQb3NpdGlvbiA9IHNlY3Rpb24uY29uc3VtZXIuZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpO1xuICAgICAgaWYgKGdlbmVyYXRlZFBvc2l0aW9uKSB7XG4gICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgbGluZTogZ2VuZXJhdGVkUG9zaXRpb24ubGluZSArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkUG9zaXRpb24uY29sdW1uICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lID09PSBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lXG4gICAgICAgICAgICAgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxXG4gICAgICAgICAgICAgOiAwKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcbiAgICAgIHZhciBzZWN0aW9uTWFwcGluZ3MgPSBzZWN0aW9uLmNvbnN1bWVyLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VjdGlvbk1hcHBpbmdzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gc2VjdGlvbk1hcHBpbmdzW2pdO1xuXG4gICAgICAgIHZhciBzb3VyY2UgPSBzZWN0aW9uLmNvbnN1bWVyLl9zb3VyY2VzLmF0KG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNlY3Rpb24uY29uc3VtZXIuc291cmNlUm9vdCwgc291cmNlLCB0aGlzLl9zb3VyY2VNYXBVUkwpO1xuICAgICAgICB0aGlzLl9zb3VyY2VzLmFkZChzb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmluZGV4T2Yoc291cmNlKTtcblxuICAgICAgICB2YXIgbmFtZSA9IG51bGw7XG4gICAgICAgIGlmIChtYXBwaW5nLm5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gc2VjdGlvbi5jb25zdW1lci5fbmFtZXMuYXQobWFwcGluZy5uYW1lKTtcbiAgICAgICAgICB0aGlzLl9uYW1lcy5hZGQobmFtZSk7XG4gICAgICAgICAgbmFtZSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgbWFwcGluZ3MgY29taW5nIGZyb20gdGhlIGNvbnN1bWVyIGZvciB0aGUgc2VjdGlvbiBoYXZlXG4gICAgICAgIC8vIGdlbmVyYXRlZCBwb3NpdGlvbnMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLCBzbyB3ZVxuICAgICAgICAvLyBuZWVkIHRvIG9mZnNldCB0aGVtIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY29uY2F0ZW5hdGVkXG4gICAgICAgIC8vIGdlbmVyYXRlZCBmaWxlLlxuICAgICAgICB2YXIgYWRqdXN0ZWRNYXBwaW5nID0ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGdlbmVyYXRlZExpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG1hcHBpbmcuZ2VuZXJhdGVkTGluZVxuICAgICAgICAgICAgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxXG4gICAgICAgICAgICA6IDApLFxuICAgICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgb3JpZ2luYWxDb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sXG4gICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKGFkanVzdGVkTWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgYWRqdXN0ZWRNYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncy5wdXNoKGFkanVzdGVkTWFwcGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBxdWlja1NvcnQodGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICBxdWlja1NvcnQodGhpcy5fX29yaWdpbmFsTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMpO1xuICB9O1xuXG5leHBvcnRzLkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciA9IEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcjtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gc291cmNlUm9vdDogQSByb290IGZvciBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICBpZiAoIWFBcmdzKSB7XG4gICAgYUFyZ3MgPSB7fTtcbiAgfVxuICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdmaWxlJywgbnVsbCk7XG4gIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG59XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7XG4gICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICBmaWxlOiBhU291cmNlTWFwQ29uc3VtZXIuZmlsZSxcbiAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICB9KTtcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld01hcHBpbmcub3JpZ2luYWwgPSB7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBzb3VyY2VSZWxhdGl2ZSA9IHNvdXJjZUZpbGU7XG4gICAgICBpZiAoc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VSZWxhdGl2ZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdG9yLl9zb3VyY2VzLmhhcyhzb3VyY2VSZWxhdGl2ZSkpIHtcbiAgICAgICAgZ2VuZXJhdG9yLl9zb3VyY2VzLmFkZChzb3VyY2VSZWxhdGl2ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH07XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZ2VuZXJhdGVkJyk7XG4gICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICduYW1lJywgbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IFN0cmluZyhzb3VyY2UpO1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICAgIGlmICghdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9tYXBwaW5ncy5hZGQoe1xuICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAqIHJld3JpdHRlbiB1c2luZyB0aGUgc3VwcGxpZWQgc291cmNlIG1hcC4gTm90ZTogVGhlIHJlc29sdXRpb24gZm9yIHRoZVxuICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAqIEBwYXJhbSBhU291cmNlTWFwUGF0aCBPcHRpb25hbC4gVGhlIGRpcm5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBtYXBcbiAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gKiAgICAgICAgZGlyZWN0b3J5LCBhbmQgdGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZCBjb250YWlucyByZWxhdGl2ZSBzb3VyY2VcbiAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICB2YXIgc291cmNlRmlsZSA9IGFTb3VyY2VGaWxlO1xuICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgJ29yIHRoZSBzb3VyY2UgbWFwXFwncyBcImZpbGVcIiBwcm9wZXJ0eS4gQm90aCB3ZXJlIG9taXR0ZWQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc291cmNlRmlsZSA9IGFTb3VyY2VNYXBDb25zdW1lci5maWxlO1xuICAgIH1cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgLy8gTWFrZSBcInNvdXJjZUZpbGVcIiByZWxhdGl2ZSBpZiBhbiBhYnNvbHV0ZSBVcmwgaXMgcGFzc2VkLlxuICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgIH1cbiAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICB2YXIgbmV3U291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgdGhpcy5fbWFwcGluZ3MudW5zb3J0ZWRGb3JFYWNoKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgdmFyIG9yaWdpbmFsID0gYVNvdXJjZU1hcENvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFuZXdTb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH07XG5cbi8qKlxuICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gKlxuICogICAxLiBKdXN0IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gKiAgICAgIHRva2VuLlxuICpcbiAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICogaW4gdG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl92YWxpZGF0ZU1hcHBpbmcoYUdlbmVyYXRlZCwgYU9yaWdpbmFsLCBhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgLy8gV2hlbiBhT3JpZ2luYWwgaXMgdHJ1dGh5IGJ1dCBoYXMgZW1wdHkgdmFsdWVzIGZvciAubGluZSBhbmQgLmNvbHVtbixcbiAgICAvLyBpdCBpcyBtb3N0IGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IuIEluIHRoaXMgY2FzZSB3ZSB0aHJvdyBhIHZlcnlcbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIHRvIHRyeSB0byBndWlkZSB0aGVtIHRoZSByaWdodCB3YXkuXG4gICAgLy8gRm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyL3BvbHltZXItYnVuZGxlci9wdWxsLzUxOVxuICAgIGlmIChhT3JpZ2luYWwgJiYgdHlwZW9mIGFPcmlnaW5hbC5saW5lICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYU9yaWdpbmFsLmNvbHVtbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ29yaWdpbmFsLmxpbmUgYW5kIG9yaWdpbmFsLmNvbHVtbiBhcmUgbm90IG51bWJlcnMgLS0geW91IHByb2JhYmx5IG1lYW50IHRvIG9taXQgJyArXG4gICAgICAgICAgICAndGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50aXJlbHkgYW5kIG9ubHkgbWFwIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uIElmIHNvLCBwYXNzICcgK1xuICAgICAgICAgICAgJ251bGwgZm9yIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGluc3RlYWQgb2YgYW4gb2JqZWN0IHdpdGggZW1wdHkgb3IgbnVsbCB2YWx1ZXMuJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAvLyBDYXNlIDEuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbC5saW5lID4gMCAmJiBhT3JpZ2luYWwuY29sdW1uID49IDBcbiAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtYXBwaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCxcbiAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiB0byB0aGUgc3RyZWFtIG9mIGJhc2UgNjQgVkxRc1xuICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgIHZhciByZXN1bHQgPSAnJztcbiAgICB2YXIgbmV4dDtcbiAgICB2YXIgbWFwcGluZztcbiAgICB2YXIgbmFtZUlkeDtcbiAgICB2YXIgc291cmNlSWR4O1xuXG4gICAgdmFyIG1hcHBpbmdzID0gdGhpcy5fbWFwcGluZ3MudG9BcnJheSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgbWFwcGluZyA9IG1hcHBpbmdzW2ldO1xuICAgICAgbmV4dCA9ICcnXG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5leHQgKz0gJzsnO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgaWYgKCF1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmcsIG1hcHBpbmdzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0ICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlSWR4ID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKHNvdXJjZUlkeCAtIHByZXZpb3VzU291cmNlKTtcbiAgICAgICAgcHJldmlvdXNTb3VyY2UgPSBzb3VyY2VJZHg7XG5cbiAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTtcblxuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4pO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuYW1lSWR4ID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShuYW1lSWR4IC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICBwcmV2aW91c05hbWUgPSBuYW1lSWR4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCArPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFTb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cywga2V5KVxuICAgICAgICA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgIHZhciBtYXAgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICBuYW1lczogdGhpcy5fbmFtZXMudG9BcnJheSgpLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLl9maWxlICE9IG51bGwpIHtcbiAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvU3RyaW5nKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKTtcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdIHx8ICcnO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGFDaHVuaykge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgdmFyIGNodW5rO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICpcbiAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICB2YXIgbmV3Q2hpbGRyZW47XG4gIHZhciBpO1xuICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgfVxuICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gKlxuICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gIH07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gXCJcIjtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHN0ciArPSBjaHVuaztcbiAgfSk7XG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAqIG1hcC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICBjb2RlOiBcIlwiLFxuICAgIGxpbmU6IDEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG59O1xuXG5leHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGdldHRpbmcgdmFsdWVzIGZyb20gcGFyYW1ldGVyL29wdGlvbnNcbiAqIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGFyZ3MgVGhlIG9iamVjdCB3ZSBhcmUgZXh0cmFjdGluZyB2YWx1ZXMgZnJvbVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdlIGFyZSBnZXR0aW5nLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBBbiBvcHRpb25hbCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmdcbiAqIGZyb20gdGhlIG9iamVjdC4gSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkIGFuZCB0aGUgcHJvcGVydHkgaXMgbWlzc2luZywgYW5cbiAqIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICovXG5mdW5jdGlvbiBnZXRBcmcoYUFyZ3MsIGFOYW1lLCBhRGVmYXVsdFZhbHVlKSB7XG4gIGlmIChhTmFtZSBpbiBhQXJncykge1xuICAgIHJldHVybiBhQXJnc1thTmFtZV07XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIHJldHVybiBhRGVmYXVsdFZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignXCInICsgYU5hbWUgKyAnXCIgaXMgYSByZXF1aXJlZCBhcmd1bWVudC4nKTtcbiAgfVxufVxuZXhwb3J0cy5nZXRBcmcgPSBnZXRBcmc7XG5cbnZhciB1cmxSZWdleHAgPSAvXig/OihbXFx3K1xcLS5dKyk6KT9cXC9cXC8oPzooXFx3KzpcXHcrKUApPyhbXFx3Li1dKikoPzo6KFxcZCspKT8oLiopJC87XG52YXIgZGF0YVVybFJlZ2V4cCA9IC9eZGF0YTouK1xcLC4rJC87XG5cbmZ1bmN0aW9uIHVybFBhcnNlKGFVcmwpIHtcbiAgdmFyIG1hdGNoID0gYVVybC5tYXRjaCh1cmxSZWdleHApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzY2hlbWU6IG1hdGNoWzFdLFxuICAgIGF1dGg6IG1hdGNoWzJdLFxuICAgIGhvc3Q6IG1hdGNoWzNdLFxuICAgIHBvcnQ6IG1hdGNoWzRdLFxuICAgIHBhdGg6IG1hdGNoWzVdXG4gIH07XG59XG5leHBvcnRzLnVybFBhcnNlID0gdXJsUGFyc2U7XG5cbmZ1bmN0aW9uIHVybEdlbmVyYXRlKGFQYXJzZWRVcmwpIHtcbiAgdmFyIHVybCA9ICcnO1xuICBpZiAoYVBhcnNlZFVybC5zY2hlbWUpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5zY2hlbWUgKyAnOic7XG4gIH1cbiAgdXJsICs9ICcvLyc7XG4gIGlmIChhUGFyc2VkVXJsLmF1dGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5hdXRoICsgJ0AnO1xuICB9XG4gIGlmIChhUGFyc2VkVXJsLmhvc3QpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5ob3N0O1xuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBvcnQpIHtcbiAgICB1cmwgKz0gXCI6XCIgKyBhUGFyc2VkVXJsLnBvcnRcbiAgfVxuICBpZiAoYVBhcnNlZFVybC5wYXRoKSB7XG4gICAgdXJsICs9IGFQYXJzZWRVcmwucGF0aDtcbiAgfVxuICByZXR1cm4gdXJsO1xufVxuZXhwb3J0cy51cmxHZW5lcmF0ZSA9IHVybEdlbmVyYXRlO1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBwYXRoLCBvciB0aGUgcGF0aCBwb3J0aW9uIG9mIGEgVVJMOlxuICpcbiAqIC0gUmVwbGFjZXMgY29uc2VjdXRpdmUgc2xhc2hlcyB3aXRoIG9uZSBzbGFzaC5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnLicgcGFydHMuXG4gKiAtIFJlbW92ZXMgdW5uZWNlc3NhcnkgJzxkaXI+Ly4uJyBwYXJ0cy5cbiAqXG4gKiBCYXNlZCBvbiBjb2RlIGluIHRoZSBOb2RlLmpzICdwYXRoJyBjb3JlIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgdXJsIHRvIG5vcm1hbGl6ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplKGFQYXRoKSB7XG4gIHZhciBwYXRoID0gYVBhdGg7XG4gIHZhciB1cmwgPSB1cmxQYXJzZShhUGF0aCk7XG4gIGlmICh1cmwpIHtcbiAgICBpZiAoIXVybC5wYXRoKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuICAgIHBhdGggPSB1cmwucGF0aDtcbiAgfVxuICB2YXIgaXNBYnNvbHV0ZSA9IGV4cG9ydHMuaXNBYnNvbHV0ZShwYXRoKTtcblxuICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KC9cXC8rLyk7XG4gIGZvciAodmFyIHBhcnQsIHVwID0gMCwgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgcGFydCA9IHBhcnRzW2ldO1xuICAgIGlmIChwYXJ0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCA+IDApIHtcbiAgICAgIGlmIChwYXJ0ID09PSAnJykge1xuICAgICAgICAvLyBUaGUgZmlyc3QgcGFydCBpcyBibGFuayBpZiB0aGUgcGF0aCBpcyBhYnNvbHV0ZS4gVHJ5aW5nIHRvIGdvXG4gICAgICAgIC8vIGFib3ZlIHRoZSByb290IGlzIGEgbm8tb3AuIFRoZXJlZm9yZSB3ZSBjYW4gcmVtb3ZlIGFsbCAnLi4nIHBhcnRzXG4gICAgICAgIC8vIGRpcmVjdGx5IGFmdGVyIHRoZSByb290LlxuICAgICAgICBwYXJ0cy5zcGxpY2UoaSArIDEsIHVwKTtcbiAgICAgICAgdXAgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKGksIDIpO1xuICAgICAgICB1cC0tO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwYXRoID0gcGFydHMuam9pbignLycpO1xuXG4gIGlmIChwYXRoID09PSAnJykge1xuICAgIHBhdGggPSBpc0Fic29sdXRlID8gJy8nIDogJy4nO1xuICB9XG5cbiAgaWYgKHVybCkge1xuICAgIHVybC5wYXRoID0gcGF0aDtcbiAgICByZXR1cm4gdXJsR2VuZXJhdGUodXJsKTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cbmV4cG9ydHMubm9ybWFsaXplID0gbm9ybWFsaXplO1xuXG4vKipcbiAqIEpvaW5zIHR3byBwYXRocy9VUkxzLlxuICpcbiAqIEBwYXJhbSBhUm9vdCBUaGUgcm9vdCBwYXRoIG9yIFVSTC5cbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciBVUkwgdG8gYmUgam9pbmVkIHdpdGggdGhlIHJvb3QuXG4gKlxuICogLSBJZiBhUGF0aCBpcyBhIFVSTCBvciBhIGRhdGEgVVJJLCBhUGF0aCBpcyByZXR1cm5lZCwgdW5sZXNzIGFQYXRoIGlzIGFcbiAqICAgc2NoZW1lLXJlbGF0aXZlIFVSTDogVGhlbiB0aGUgc2NoZW1lIG9mIGFSb290LCBpZiBhbnksIGlzIHByZXBlbmRlZFxuICogICBmaXJzdC5cbiAqIC0gT3RoZXJ3aXNlIGFQYXRoIGlzIGEgcGF0aC4gSWYgYVJvb3QgaXMgYSBVUkwsIHRoZW4gaXRzIHBhdGggcG9ydGlvblxuICogICBpcyB1cGRhdGVkIHdpdGggdGhlIHJlc3VsdCBhbmQgYVJvb3QgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgcmVzdWx0XG4gKiAgIGlzIHJldHVybmVkLlxuICogICAtIElmIGFQYXRoIGlzIGFic29sdXRlLCB0aGUgcmVzdWx0IGlzIGFQYXRoLlxuICogICAtIE90aGVyd2lzZSB0aGUgdHdvIHBhdGhzIGFyZSBqb2luZWQgd2l0aCBhIHNsYXNoLlxuICogLSBKb2luaW5nIGZvciBleGFtcGxlICdodHRwOi8vJyBhbmQgJ3d3dy5leGFtcGxlLmNvbScgaXMgYWxzbyBzdXBwb3J0ZWQuXG4gKi9cbmZ1bmN0aW9uIGpvaW4oYVJvb3QsIGFQYXRoKSB7XG4gIGlmIChhUm9vdCA9PT0gXCJcIikge1xuICAgIGFSb290ID0gXCIuXCI7XG4gIH1cbiAgaWYgKGFQYXRoID09PSBcIlwiKSB7XG4gICAgYVBhdGggPSBcIi5cIjtcbiAgfVxuICB2YXIgYVBhdGhVcmwgPSB1cmxQYXJzZShhUGF0aCk7XG4gIHZhciBhUm9vdFVybCA9IHVybFBhcnNlKGFSb290KTtcbiAgaWYgKGFSb290VXJsKSB7XG4gICAgYVJvb3QgPSBhUm9vdFVybC5wYXRoIHx8ICcvJztcbiAgfVxuXG4gIC8vIGBqb2luKGZvbywgJy8vd3d3LmV4YW1wbGUub3JnJylgXG4gIGlmIChhUGF0aFVybCAmJiAhYVBhdGhVcmwuc2NoZW1lKSB7XG4gICAgaWYgKGFSb290VXJsKSB7XG4gICAgICBhUGF0aFVybC5zY2hlbWUgPSBhUm9vdFVybC5zY2hlbWU7XG4gICAgfVxuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUGF0aFVybCk7XG4gIH1cblxuICBpZiAoYVBhdGhVcmwgfHwgYVBhdGgubWF0Y2goZGF0YVVybFJlZ2V4cCkpIHtcbiAgICByZXR1cm4gYVBhdGg7XG4gIH1cblxuICAvLyBgam9pbignaHR0cDovLycsICd3d3cuZXhhbXBsZS5jb20nKWBcbiAgaWYgKGFSb290VXJsICYmICFhUm9vdFVybC5ob3N0ICYmICFhUm9vdFVybC5wYXRoKSB7XG4gICAgYVJvb3RVcmwuaG9zdCA9IGFQYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cblxuICB2YXIgam9pbmVkID0gYVBhdGguY2hhckF0KDApID09PSAnLydcbiAgICA/IGFQYXRoXG4gICAgOiBub3JtYWxpemUoYVJvb3QucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyBhUGF0aCk7XG5cbiAgaWYgKGFSb290VXJsKSB7XG4gICAgYVJvb3RVcmwucGF0aCA9IGpvaW5lZDtcbiAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVJvb3RVcmwpO1xuICB9XG4gIHJldHVybiBqb2luZWQ7XG59XG5leHBvcnRzLmpvaW4gPSBqb2luO1xuXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbiAoYVBhdGgpIHtcbiAgcmV0dXJuIGFQYXRoLmNoYXJBdCgwKSA9PT0gJy8nIHx8IHVybFJlZ2V4cC50ZXN0KGFQYXRoKTtcbn07XG5cbi8qKlxuICogTWFrZSBhIHBhdGggcmVsYXRpdmUgdG8gYSBVUkwgb3IgYW5vdGhlciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhUm9vdCBUaGUgcm9vdCBwYXRoIG9yIFVSTC5cbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciBVUkwgdG8gYmUgbWFkZSByZWxhdGl2ZSB0byBhUm9vdC5cbiAqL1xuZnVuY3Rpb24gcmVsYXRpdmUoYVJvb3QsIGFQYXRoKSB7XG4gIGlmIChhUm9vdCA9PT0gXCJcIikge1xuICAgIGFSb290ID0gXCIuXCI7XG4gIH1cblxuICBhUm9vdCA9IGFSb290LnJlcGxhY2UoL1xcLyQvLCAnJyk7XG5cbiAgLy8gSXQgaXMgcG9zc2libGUgZm9yIHRoZSBwYXRoIHRvIGJlIGFib3ZlIHRoZSByb290LiBJbiB0aGlzIGNhc2UsIHNpbXBseVxuICAvLyBjaGVja2luZyB3aGV0aGVyIHRoZSByb290IGlzIGEgcHJlZml4IG9mIHRoZSBwYXRoIHdvbid0IHdvcmsuIEluc3RlYWQsIHdlXG4gIC8vIG5lZWQgdG8gcmVtb3ZlIGNvbXBvbmVudHMgZnJvbSB0aGUgcm9vdCBvbmUgYnkgb25lLCB1bnRpbCBlaXRoZXIgd2UgZmluZFxuICAvLyBhIHByZWZpeCB0aGF0IGZpdHMsIG9yIHdlIHJ1biBvdXQgb2YgY29tcG9uZW50cyB0byByZW1vdmUuXG4gIHZhciBsZXZlbCA9IDA7XG4gIHdoaWxlIChhUGF0aC5pbmRleE9mKGFSb290ICsgJy8nKSAhPT0gMCkge1xuICAgIHZhciBpbmRleCA9IGFSb290Lmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG9ubHkgcGFydCBvZiB0aGUgcm9vdCB0aGF0IGlzIGxlZnQgaXMgdGhlIHNjaGVtZSAoaS5lLiBodHRwOi8vLFxuICAgIC8vIGZpbGU6Ly8vLCBldGMuKSwgb25lIG9yIG1vcmUgc2xhc2hlcyAoLyksIG9yIHNpbXBseSBub3RoaW5nIGF0IGFsbCwgd2VcbiAgICAvLyBoYXZlIGV4aGF1c3RlZCBhbGwgY29tcG9uZW50cywgc28gdGhlIHBhdGggaXMgbm90IHJlbGF0aXZlIHRvIHRoZSByb290LlxuICAgIGFSb290ID0gYVJvb3Quc2xpY2UoMCwgaW5kZXgpO1xuICAgIGlmIChhUm9vdC5tYXRjaCgvXihbXlxcL10rOlxcLyk/XFwvKiQvKSkge1xuICAgICAgcmV0dXJuIGFQYXRoO1xuICAgIH1cblxuICAgICsrbGV2ZWw7XG4gIH1cblxuICAvLyBNYWtlIHN1cmUgd2UgYWRkIGEgXCIuLi9cIiBmb3IgZWFjaCBjb21wb25lbnQgd2UgcmVtb3ZlZCBmcm9tIHRoZSByb290LlxuICByZXR1cm4gQXJyYXkobGV2ZWwgKyAxKS5qb2luKFwiLi4vXCIpICsgYVBhdGguc3Vic3RyKGFSb290Lmxlbmd0aCArIDEpO1xufVxuZXhwb3J0cy5yZWxhdGl2ZSA9IHJlbGF0aXZlO1xuXG52YXIgc3VwcG9ydHNOdWxsUHJvdG8gPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcmV0dXJuICEoJ19fcHJvdG9fXycgaW4gb2JqKTtcbn0oKSk7XG5cbmZ1bmN0aW9uIGlkZW50aXR5IChzKSB7XG4gIHJldHVybiBzO1xufVxuXG4vKipcbiAqIEJlY2F1c2UgYmVoYXZpb3IgZ29lcyB3YWNreSB3aGVuIHlvdSBzZXQgYF9fcHJvdG9fX2Agb24gb2JqZWN0cywgd2VcbiAqIGhhdmUgdG8gcHJlZml4IGFsbCB0aGUgc3RyaW5ncyBpbiBvdXIgc2V0IHdpdGggYW4gYXJiaXRyYXJ5IGNoYXJhY3Rlci5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9wdWxsLzMxIGFuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9pc3N1ZXMvMzBcbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuZnVuY3Rpb24gdG9TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiAnJCcgKyBhU3RyO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLnRvU2V0U3RyaW5nID0gc3VwcG9ydHNOdWxsUHJvdG8gPyBpZGVudGl0eSA6IHRvU2V0U3RyaW5nO1xuXG5mdW5jdGlvbiBmcm9tU2V0U3RyaW5nKGFTdHIpIHtcbiAgaWYgKGlzUHJvdG9TdHJpbmcoYVN0cikpIHtcbiAgICByZXR1cm4gYVN0ci5zbGljZSgxKTtcbiAgfVxuXG4gIHJldHVybiBhU3RyO1xufVxuZXhwb3J0cy5mcm9tU2V0U3RyaW5nID0gc3VwcG9ydHNOdWxsUHJvdG8gPyBpZGVudGl0eSA6IGZyb21TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzUHJvdG9TdHJpbmcocykge1xuICBpZiAoIXMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgbGVuZ3RoID0gcy5sZW5ndGg7XG5cbiAgaWYgKGxlbmd0aCA8IDkgLyogXCJfX3Byb3RvX19cIi5sZW5ndGggKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocy5jaGFyQ29kZUF0KGxlbmd0aCAtIDEpICE9PSA5NSAgLyogJ18nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMikgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAzKSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDQpICE9PSAxMTYgLyogJ3QnICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNSkgIT09IDExMSAvKiAnbycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA2KSAhPT0gMTE0IC8qICdyJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDcpICE9PSAxMTIgLyogJ3AnICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gOCkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA5KSAhPT0gOTUgIC8qICdfJyAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSBsZW5ndGggLSAxMDsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAocy5jaGFyQ29kZUF0KGkpICE9PSAzNiAvKiAnJCcgKi8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdoZXJlIHRoZSBvcmlnaW5hbCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICpcbiAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgb3JpZ2luYWwgc291cmNlL2xpbmUvY29sdW1uLCBidXQgZGlmZmVyZW50IGdlbmVyYXRlZFxuICogbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGEgbWFwcGluZyB3aXRoIGFcbiAqIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVPcmlnaW5hbCkge1xuICB2YXIgY21wID0gc3RyY21wKG1hcHBpbmdBLnNvdXJjZSwgbWFwcGluZ0Iuc291cmNlKTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICByZXR1cm4gc3RyY21wKG1hcHBpbmdBLm5hbWUsIG1hcHBpbmdCLm5hbWUpO1xufVxuZXhwb3J0cy5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyA9IGNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zO1xuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2l0aCBkZWZsYXRlZCBzb3VyY2UgYW5kIG5hbWUgaW5kaWNlcyB3aGVyZVxuICogdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICpcbiAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiwgYnV0IGRpZmZlcmVudFxuICogc291cmNlL25hbWUvb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGFcbiAqIG1hcHBpbmcgd2l0aCBhIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHtcbiAgdmFyIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkID0gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQ7XG5cbmZ1bmN0aW9uIHN0cmNtcChhU3RyMSwgYVN0cjIpIHtcbiAgaWYgKGFTdHIxID09PSBhU3RyMikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYgKGFTdHIxID09PSBudWxsKSB7XG4gICAgcmV0dXJuIDE7IC8vIGFTdHIyICE9PSBudWxsXG4gIH1cblxuICBpZiAoYVN0cjIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gLTE7IC8vIGFTdHIxICE9PSBudWxsXG4gIH1cblxuICBpZiAoYVN0cjEgPiBhU3RyMikge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2l0aCBpbmZsYXRlZCBzb3VyY2UgYW5kIG5hbWUgc3RyaW5ncyB3aGVyZVxuICogdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIHtcbiAgdmFyIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkID0gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQ7XG5cbi8qKlxuICogU3RyaXAgYW55IEpTT04gWFNTSSBhdm9pZGFuY2UgcHJlZml4IGZyb20gdGhlIHN0cmluZyAoYXMgZG9jdW1lbnRlZFxuICogaW4gdGhlIHNvdXJjZSBtYXBzIHNwZWNpZmljYXRpb24pLCBhbmQgdGhlbiBwYXJzZSB0aGUgc3RyaW5nIGFzXG4gKiBKU09OLlxuICovXG5mdW5jdGlvbiBwYXJzZVNvdXJjZU1hcElucHV0KHN0cikge1xuICByZXR1cm4gSlNPTi5wYXJzZShzdHIucmVwbGFjZSgvXlxcKV19J1teXFxuXSpcXG4vLCAnJykpO1xufVxuZXhwb3J0cy5wYXJzZVNvdXJjZU1hcElucHV0ID0gcGFyc2VTb3VyY2VNYXBJbnB1dDtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBVUkwgb2YgYSBzb3VyY2UgZ2l2ZW4gdGhlIHRoZSBzb3VyY2Ugcm9vdCwgdGhlIHNvdXJjZSdzXG4gKiBVUkwsIGFuZCB0aGUgc291cmNlIG1hcCdzIFVSTC5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVNvdXJjZVVSTChzb3VyY2VSb290LCBzb3VyY2VVUkwsIHNvdXJjZU1hcFVSTCkge1xuICBzb3VyY2VVUkwgPSBzb3VyY2VVUkwgfHwgJyc7XG5cbiAgaWYgKHNvdXJjZVJvb3QpIHtcbiAgICAvLyBUaGlzIGZvbGxvd3Mgd2hhdCBDaHJvbWUgZG9lcy5cbiAgICBpZiAoc291cmNlUm9vdFtzb3VyY2VSb290Lmxlbmd0aCAtIDFdICE9PSAnLycgJiYgc291cmNlVVJMWzBdICE9PSAnLycpIHtcbiAgICAgIHNvdXJjZVJvb3QgKz0gJy8nO1xuICAgIH1cbiAgICAvLyBUaGUgc3BlYyBzYXlzOlxuICAgIC8vICAgTGluZSA0OiBBbiBvcHRpb25hbCBzb3VyY2Ugcm9vdCwgdXNlZnVsIGZvciByZWxvY2F0aW5nIHNvdXJjZVxuICAgIC8vICAgZmlsZXMgb24gYSBzZXJ2ZXIgb3IgcmVtb3ZpbmcgcmVwZWF0ZWQgdmFsdWVzIGluIHRoZVxuICAgIC8vICAg4oCcc291cmNlc+KAnSBlbnRyeS4gIFRoaXMgdmFsdWUgaXMgcHJlcGVuZGVkIHRvIHRoZSBpbmRpdmlkdWFsXG4gICAgLy8gICBlbnRyaWVzIGluIHRoZSDigJxzb3VyY2XigJ0gZmllbGQuXG4gICAgc291cmNlVVJMID0gc291cmNlUm9vdCArIHNvdXJjZVVSTDtcbiAgfVxuXG4gIC8vIEhpc3RvcmljYWxseSwgU291cmNlTWFwQ29uc3VtZXIgZGlkIG5vdCB0YWtlIHRoZSBzb3VyY2VNYXBVUkwgYXNcbiAgLy8gYSBwYXJhbWV0ZXIuICBUaGlzIG1vZGUgaXMgc3RpbGwgc29tZXdoYXQgc3VwcG9ydGVkLCB3aGljaCBpcyB3aHlcbiAgLy8gdGhpcyBjb2RlIGJsb2NrIGlzIGNvbmRpdGlvbmFsLiAgSG93ZXZlciwgaXQncyBwcmVmZXJhYmxlIHRvIHBhc3NcbiAgLy8gdGhlIHNvdXJjZSBtYXAgVVJMIHRvIFNvdXJjZU1hcENvbnN1bWVyLCBzbyB0aGF0IHRoaXMgZnVuY3Rpb25cbiAgLy8gY2FuIGltcGxlbWVudCB0aGUgc291cmNlIFVSTCByZXNvbHV0aW9uIGFsZ29yaXRobSBhcyBvdXRsaW5lZCBpblxuICAvLyB0aGUgc3BlYy4gIFRoaXMgYmxvY2sgaXMgYmFzaWNhbGx5IHRoZSBlcXVpdmFsZW50IG9mOlxuICAvLyAgICBuZXcgVVJMKHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKS50b1N0cmluZygpXG4gIC8vIC4uLiBleGNlcHQgaXQgYXZvaWRzIHVzaW5nIFVSTCwgd2hpY2ggd2Fzbid0IGF2YWlsYWJsZSBpbiB0aGVcbiAgLy8gb2xkZXIgcmVsZWFzZXMgb2Ygbm9kZSBzdGlsbCBzdXBwb3J0ZWQgYnkgdGhpcyBsaWJyYXJ5LlxuICAvL1xuICAvLyBUaGUgc3BlYyBzYXlzOlxuICAvLyAgIElmIHRoZSBzb3VyY2VzIGFyZSBub3QgYWJzb2x1dGUgVVJMcyBhZnRlciBwcmVwZW5kaW5nIG9mIHRoZVxuICAvLyAgIOKAnHNvdXJjZVJvb3TigJ0sIHRoZSBzb3VyY2VzIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGVcbiAgLy8gICBTb3VyY2VNYXAgKGxpa2UgcmVzb2x2aW5nIHNjcmlwdCBzcmMgaW4gYSBodG1sIGRvY3VtZW50KS5cbiAgaWYgKHNvdXJjZU1hcFVSTCkge1xuICAgIHZhciBwYXJzZWQgPSB1cmxQYXJzZShzb3VyY2VNYXBVUkwpO1xuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzb3VyY2VNYXBVUkwgY291bGQgbm90IGJlIHBhcnNlZFwiKTtcbiAgICB9XG4gICAgaWYgKHBhcnNlZC5wYXRoKSB7XG4gICAgICAvLyBTdHJpcCB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCwgYnV0IGtlZXAgdGhlIFwiL1wiLlxuICAgICAgdmFyIGluZGV4ID0gcGFyc2VkLnBhdGgubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHBhcnNlZC5wYXRoID0gcGFyc2VkLnBhdGguc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNvdXJjZVVSTCA9IGpvaW4odXJsR2VuZXJhdGUocGFyc2VkKSwgc291cmNlVVJMKTtcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemUoc291cmNlVVJMKTtcbn1cbmV4cG9ydHMuY29tcHV0ZVNvdXJjZVVSTCA9IGNvbXB1dGVTb3VyY2VVUkw7XG4iLCIvKlxuICogQ29weXJpZ2h0IDIwMDktMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0UudHh0IG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5leHBvcnRzLlNvdXJjZU1hcEdlbmVyYXRvciA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS1tYXAtY29uc3VtZXInKS5Tb3VyY2VNYXBDb25zdW1lcjtcbmV4cG9ydHMuU291cmNlTm9kZSA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS1ub2RlJykuU291cmNlTm9kZTtcbiIsIi8qIGdsb2JhbCB3aW5kb3csIGV4cG9ydHMsIGRlZmluZSAqL1xuXG4hZnVuY3Rpb24oKSB7XG4gICAgJ3VzZSBzdHJpY3QnXG5cbiAgICB2YXIgcmUgPSB7XG4gICAgICAgIG5vdF9zdHJpbmc6IC9bXnNdLyxcbiAgICAgICAgbm90X2Jvb2w6IC9bXnRdLyxcbiAgICAgICAgbm90X3R5cGU6IC9bXlRdLyxcbiAgICAgICAgbm90X3ByaW1pdGl2ZTogL1tedl0vLFxuICAgICAgICBudW1iZXI6IC9bZGllZmddLyxcbiAgICAgICAgbnVtZXJpY19hcmc6IC9bYmNkaWVmZ3V4WF0vLFxuICAgICAgICBqc29uOiAvW2pdLyxcbiAgICAgICAgbm90X2pzb246IC9bXmpdLyxcbiAgICAgICAgdGV4dDogL15bXlxceDI1XSsvLFxuICAgICAgICBtb2R1bG86IC9eXFx4MjV7Mn0vLFxuICAgICAgICBwbGFjZWhvbGRlcjogL15cXHgyNSg/OihbMS05XVxcZCopXFwkfFxcKChbXildKylcXCkpPyhcXCspPygwfCdbXiRdKT8oLSk/KFxcZCspPyg/OlxcLihcXGQrKSk/KFtiLWdpam9zdFR1dnhYXSkvLFxuICAgICAgICBrZXk6IC9eKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGtleV9hY2Nlc3M6IC9eXFwuKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGluZGV4X2FjY2VzczogL15cXFsoXFxkKylcXF0vLFxuICAgICAgICBzaWduOiAvXlsrLV0vXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3ByaW50ZihrZXkpIHtcbiAgICAgICAgLy8gYGFyZ3VtZW50c2AgaXMgbm90IGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGZpbmUgZm9yIHRoaXMgY2FsbFxuICAgICAgICByZXR1cm4gc3ByaW50Zl9mb3JtYXQoc3ByaW50Zl9wYXJzZShrZXkpLCBhcmd1bWVudHMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdnNwcmludGYoZm10LCBhcmd2KSB7XG4gICAgICAgIHJldHVybiBzcHJpbnRmLmFwcGx5KG51bGwsIFtmbXRdLmNvbmNhdChhcmd2IHx8IFtdKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzcHJpbnRmX2Zvcm1hdChwYXJzZV90cmVlLCBhcmd2KSB7XG4gICAgICAgIHZhciBjdXJzb3IgPSAxLCB0cmVlX2xlbmd0aCA9IHBhcnNlX3RyZWUubGVuZ3RoLCBhcmcsIG91dHB1dCA9ICcnLCBpLCBrLCBwaCwgcGFkLCBwYWRfY2hhcmFjdGVyLCBwYWRfbGVuZ3RoLCBpc19wb3NpdGl2ZSwgc2lnblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHJlZV9sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZV90cmVlW2ldID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBwYXJzZV90cmVlW2ldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcGFyc2VfdHJlZVtpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBwaCA9IHBhcnNlX3RyZWVbaV0gLy8gY29udmVuaWVuY2UgcHVycG9zZXMgb25seVxuICAgICAgICAgICAgICAgIGlmIChwaC5rZXlzKSB7IC8vIGtleXdvcmQgYXJndW1lbnRcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltjdXJzb3JdXG4gICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwaC5rZXlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzcHJpbnRmKCdbc3ByaW50Zl0gQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBcIiVzXCIgb2YgdW5kZWZpbmVkIHZhbHVlIFwiJXNcIicsIHBoLmtleXNba10sIHBoLmtleXNbay0xXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmdbcGgua2V5c1trXV1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwaC5wYXJhbV9ubykgeyAvLyBwb3NpdGlvbmFsIGFyZ3VtZW50IChleHBsaWNpdClcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltwaC5wYXJhbV9ub11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIHBvc2l0aW9uYWwgYXJndW1lbnQgKGltcGxpY2l0KVxuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd2W2N1cnNvcisrXVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5ub3RfdHlwZS50ZXN0KHBoLnR5cGUpICYmIHJlLm5vdF9wcmltaXRpdmUudGVzdChwaC50eXBlKSAmJiBhcmcgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5udW1lcmljX2FyZy50ZXN0KHBoLnR5cGUpICYmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyAmJiBpc05hTihhcmcpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNwcmludGYoJ1tzcHJpbnRmXSBleHBlY3RpbmcgbnVtYmVyIGJ1dCBmb3VuZCAlVCcsIGFyZykpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlLm51bWJlci50ZXN0KHBoLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzX3Bvc2l0aXZlID0gYXJnID49IDBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBoLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKS50b1N0cmluZygyKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGFyZywgMTApKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGFyc2VJbnQoYXJnLCAxMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2onOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gSlNPTi5zdHJpbmdpZnkoYXJnLCBudWxsLCBwaC53aWR0aCA/IHBhcnNlSW50KHBoLndpZHRoKSA6IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IHBhcnNlRmxvYXQoYXJnKS50b0V4cG9uZW50aWFsKHBoLnByZWNpc2lvbikgOiBwYXJzZUZsb2F0KGFyZykudG9FeHBvbmVudGlhbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IHBhcnNlRmxvYXQoYXJnKS50b0ZpeGVkKHBoLnByZWNpc2lvbikgOiBwYXJzZUZsb2F0KGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2cnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGgucHJlY2lzaW9uID8gU3RyaW5nKE51bWJlcihhcmcudG9QcmVjaXNpb24ocGgucHJlY2lzaW9uKSkpIDogcGFyc2VGbG9hdChhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwYXJzZUludChhcmcsIDEwKSA+Pj4gMCkudG9TdHJpbmcoOClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gU3RyaW5nKGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IFN0cmluZyghIWFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKSA+Pj4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmUuanNvbi50ZXN0KHBoLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBhcmdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZS5udW1iZXIudGVzdChwaC50eXBlKSAmJiAoIWlzX3Bvc2l0aXZlIHx8IHBoLnNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gaXNfcG9zaXRpdmUgPyAnKycgOiAnLSdcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy50b1N0cmluZygpLnJlcGxhY2UocmUuc2lnbiwgJycpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYWRfY2hhcmFjdGVyID0gcGgucGFkX2NoYXIgPyBwaC5wYWRfY2hhciA9PT0gJzAnID8gJzAnIDogcGgucGFkX2NoYXIuY2hhckF0KDEpIDogJyAnXG4gICAgICAgICAgICAgICAgICAgIHBhZF9sZW5ndGggPSBwaC53aWR0aCAtIChzaWduICsgYXJnKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgcGFkID0gcGgud2lkdGggPyAocGFkX2xlbmd0aCA+IDAgPyBwYWRfY2hhcmFjdGVyLnJlcGVhdChwYWRfbGVuZ3RoKSA6ICcnKSA6ICcnXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBwaC5hbGlnbiA/IHNpZ24gKyBhcmcgKyBwYWQgOiAocGFkX2NoYXJhY3RlciA9PT0gJzAnID8gc2lnbiArIHBhZCArIGFyZyA6IHBhZCArIHNpZ24gKyBhcmcpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICB2YXIgc3ByaW50Zl9jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICAgIGZ1bmN0aW9uIHNwcmludGZfcGFyc2UoZm10KSB7XG4gICAgICAgIGlmIChzcHJpbnRmX2NhY2hlW2ZtdF0pIHtcbiAgICAgICAgICAgIHJldHVybiBzcHJpbnRmX2NhY2hlW2ZtdF1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZm10ID0gZm10LCBtYXRjaCwgcGFyc2VfdHJlZSA9IFtdLCBhcmdfbmFtZXMgPSAwXG4gICAgICAgIHdoaWxlIChfZm10KSB7XG4gICAgICAgICAgICBpZiAoKG1hdGNoID0gcmUudGV4dC5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaChtYXRjaFswXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChtYXRjaCA9IHJlLm1vZHVsby5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaCgnJScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgobWF0Y2ggPSByZS5wbGFjZWhvbGRlci5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMVxuICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGRfbGlzdCA9IFtdLCByZXBsYWNlbWVudF9maWVsZCA9IG1hdGNoWzJdLCBmaWVsZF9tYXRjaCA9IFtdXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXkuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHJlcGxhY2VtZW50X2ZpZWxkID0gcmVwbGFjZW1lbnRfZmllbGQuc3Vic3RyaW5nKGZpZWxkX21hdGNoWzBdLmxlbmd0aCkpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXlfYWNjZXNzLmV4ZWMocmVwbGFjZW1lbnRfZmllbGQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChmaWVsZF9tYXRjaCA9IHJlLmluZGV4X2FjY2Vzcy5leGVjKHJlcGxhY2VtZW50X2ZpZWxkKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGlzdC5wdXNoKGZpZWxkX21hdGNoWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gPSBmaWVsZF9saXN0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXJnX25hbWVzID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogbWF0Y2hbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9ubzogICAgbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiAgICAgICAgbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduOiAgICAgICAgbWF0Y2hbM10sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRfY2hhcjogICAgbWF0Y2hbNF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogICAgICAgbWF0Y2hbNV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogICAgICAgbWF0Y2hbNl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246ICAgbWF0Y2hbN10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAgbWF0Y2hbOF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignW3NwcmludGZdIHVuZXhwZWN0ZWQgcGxhY2Vob2xkZXInKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2ZtdCA9IF9mbXQuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3ByaW50Zl9jYWNoZVtmbXRdID0gcGFyc2VfdHJlZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGV4cG9ydCB0byBlaXRoZXIgYnJvd3NlciBvciBub2RlLmpzXG4gICAgICovXG4gICAgLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cbiAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGV4cG9ydHNbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgZXhwb3J0c1sndnNwcmludGYnXSA9IHZzcHJpbnRmXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3aW5kb3dbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgd2luZG93Wyd2c3ByaW50ZiddID0gdnNwcmludGZcblxuICAgICAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKSB7XG4gICAgICAgICAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgJ3NwcmludGYnOiBzcHJpbnRmLFxuICAgICAgICAgICAgICAgICAgICAndnNwcmludGYnOiB2c3ByaW50ZlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBxdW90ZS1wcm9wcyAqL1xufSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4iLCJjb25zdCB7IEV2ZW50RW1pdHRlciB9ID0gcmVxdWlyZSgnZXZlbnRzJylcbmNvbnN0IFNUUkVBTV9ERVNUUk9ZRUQgPSBuZXcgRXJyb3IoJ1N0cmVhbSB3YXMgZGVzdHJveWVkJylcbmNvbnN0IFBSRU1BVFVSRV9DTE9TRSA9IG5ldyBFcnJvcignUHJlbWF0dXJlIGNsb3NlJylcblxuY29uc3QgcXVldWVUaWNrID0gcmVxdWlyZSgncXVldWUtdGljaycpXG5jb25zdCBGSUZPID0gcmVxdWlyZSgnZmFzdC1maWZvJylcbmNvbnN0IFRleHREZWNvZGVyID0gcmVxdWlyZSgndGV4dC1kZWNvZGVyJylcblxuLyogZXNsaW50LWRpc2FibGUgbm8tbXVsdGktc3BhY2VzICovXG5cbi8vIDI5IGJpdHMgdXNlZCB0b3RhbCAoNCBmcm9tIHNoYXJlZCwgMTQgZnJvbSByZWFkLCBhbmQgMTEgZnJvbSB3cml0ZSlcbmNvbnN0IE1BWCA9ICgoMSA8PCAyOSkgLSAxKVxuXG4vLyBTaGFyZWQgc3RhdGVcbmNvbnN0IE9QRU5JTkcgICAgICAgPSAwYjAwMDFcbmNvbnN0IFBSRURFU1RST1lJTkcgPSAwYjAwMTBcbmNvbnN0IERFU1RST1lJTkcgICAgPSAwYjAxMDBcbmNvbnN0IERFU1RST1lFRCAgICAgPSAwYjEwMDBcblxuY29uc3QgTk9UX09QRU5JTkcgPSBNQVggXiBPUEVOSU5HXG5jb25zdCBOT1RfUFJFREVTVFJPWUlORyA9IE1BWCBeIFBSRURFU1RST1lJTkdcblxuLy8gUmVhZCBzdGF0ZSAoNCBiaXQgb2Zmc2V0IGZyb20gc2hhcmVkIHN0YXRlKVxuY29uc3QgUkVBRF9BQ1RJVkUgICAgICAgICAgID0gMGIwMDAwMDAwMDAwMDAwMSA8PCA0XG5jb25zdCBSRUFEX1VQREFUSU5HICAgICAgICAgPSAwYjAwMDAwMDAwMDAwMDEwIDw8IDRcbmNvbnN0IFJFQURfUFJJTUFSWSAgICAgICAgICA9IDBiMDAwMDAwMDAwMDAxMDAgPDwgNFxuY29uc3QgUkVBRF9RVUVVRUQgICAgICAgICAgID0gMGIwMDAwMDAwMDAwMTAwMCA8PCA0XG5jb25zdCBSRUFEX1JFU1VNRUQgICAgICAgICAgPSAwYjAwMDAwMDAwMDEwMDAwIDw8IDRcbmNvbnN0IFJFQURfUElQRV9EUkFJTkVEICAgICA9IDBiMDAwMDAwMDAxMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9FTkRJTkcgICAgICAgICAgID0gMGIwMDAwMDAwMTAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0VNSVRfREFUQSAgICAgICAgPSAwYjAwMDAwMDEwMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRU1JVF9SRUFEQUJMRSAgICA9IDBiMDAwMDAxMDAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9FTUlUVEVEX1JFQURBQkxFID0gMGIwMDAwMTAwMDAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0RPTkUgICAgICAgICAgICAgPSAwYjAwMDEwMDAwMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfTkVYVF9USUNLICAgICAgICA9IDBiMDAxMDAwMDAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9ORUVEU19QVVNIICAgICAgID0gMGIwMTAwMDAwMDAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX1JFQURfQUhFQUQgICAgICAgPSAwYjEwMDAwMDAwMDAwMDAwIDw8IDRcblxuLy8gQ29tYmluZWQgcmVhZCBzdGF0ZVxuY29uc3QgUkVBRF9GTE9XSU5HID0gUkVBRF9SRVNVTUVEIHwgUkVBRF9QSVBFX0RSQUlORURcbmNvbnN0IFJFQURfQUNUSVZFX0FORF9ORUVEU19QVVNIID0gUkVBRF9BQ1RJVkUgfCBSRUFEX05FRURTX1BVU0hcbmNvbnN0IFJFQURfUFJJTUFSWV9BTkRfQUNUSVZFID0gUkVBRF9QUklNQVJZIHwgUkVBRF9BQ1RJVkVcbmNvbnN0IFJFQURfRU1JVF9SRUFEQUJMRV9BTkRfUVVFVUVEID0gUkVBRF9FTUlUX1JFQURBQkxFIHwgUkVBRF9RVUVVRURcbmNvbnN0IFJFQURfUkVTVU1FRF9SRUFEX0FIRUFEID0gUkVBRF9SRVNVTUVEIHwgUkVBRF9SRUFEX0FIRUFEXG5cbmNvbnN0IFJFQURfTk9UX0FDVElWRSAgICAgICAgICAgICA9IE1BWCBeIFJFQURfQUNUSVZFXG5jb25zdCBSRUFEX05PTl9QUklNQVJZICAgICAgICAgICAgPSBNQVggXiBSRUFEX1BSSU1BUllcbmNvbnN0IFJFQURfTk9OX1BSSU1BUllfQU5EX1BVU0hFRCA9IE1BWCBeIChSRUFEX1BSSU1BUlkgfCBSRUFEX05FRURTX1BVU0gpXG5jb25zdCBSRUFEX1BVU0hFRCAgICAgICAgICAgICAgICAgPSBNQVggXiBSRUFEX05FRURTX1BVU0hcbmNvbnN0IFJFQURfUEFVU0VEICAgICAgICAgICAgICAgICA9IE1BWCBeIFJFQURfUkVTVU1FRFxuY29uc3QgUkVBRF9OT1RfUVVFVUVEICAgICAgICAgICAgID0gTUFYIF4gKFJFQURfUVVFVUVEIHwgUkVBRF9FTUlUVEVEX1JFQURBQkxFKVxuY29uc3QgUkVBRF9OT1RfRU5ESU5HICAgICAgICAgICAgID0gTUFYIF4gUkVBRF9FTkRJTkdcbmNvbnN0IFJFQURfUElQRV9OT1RfRFJBSU5FRCAgICAgICA9IE1BWCBeIFJFQURfRkxPV0lOR1xuY29uc3QgUkVBRF9OT1RfTkVYVF9USUNLICAgICAgICAgID0gTUFYIF4gUkVBRF9ORVhUX1RJQ0tcbmNvbnN0IFJFQURfTk9UX1VQREFUSU5HICAgICAgICAgICA9IE1BWCBeIFJFQURfVVBEQVRJTkdcbmNvbnN0IFJFQURfTk9fUkVBRF9BSEVBRCAgICAgICAgICA9IE1BWCBeIFJFQURfUkVBRF9BSEVBRFxuY29uc3QgUkVBRF9QQVVTRURfTk9fUkVBRF9BSEVBRCAgID0gTUFYIF4gUkVBRF9SRVNVTUVEX1JFQURfQUhFQURcblxuLy8gV3JpdGUgc3RhdGUgKDE4IGJpdCBvZmZzZXQsIDQgYml0IG9mZnNldCBmcm9tIHNoYXJlZCBzdGF0ZSBhbmQgMTQgZnJvbSByZWFkIHN0YXRlKVxuY29uc3QgV1JJVEVfQUNUSVZFICAgICA9IDBiMDAwMDAwMDAwMDEgPDwgMThcbmNvbnN0IFdSSVRFX1VQREFUSU5HICAgPSAwYjAwMDAwMDAwMDEwIDw8IDE4XG5jb25zdCBXUklURV9QUklNQVJZICAgID0gMGIwMDAwMDAwMDEwMCA8PCAxOFxuY29uc3QgV1JJVEVfUVVFVUVEICAgICA9IDBiMDAwMDAwMDEwMDAgPDwgMThcbmNvbnN0IFdSSVRFX1VORFJBSU5FRCAgPSAwYjAwMDAwMDEwMDAwIDw8IDE4XG5jb25zdCBXUklURV9ET05FICAgICAgID0gMGIwMDAwMDEwMDAwMCA8PCAxOFxuY29uc3QgV1JJVEVfRU1JVF9EUkFJTiA9IDBiMDAwMDEwMDAwMDAgPDwgMThcbmNvbnN0IFdSSVRFX05FWFRfVElDSyAgPSAwYjAwMDEwMDAwMDAwIDw8IDE4XG5jb25zdCBXUklURV9XUklUSU5HICAgID0gMGIwMDEwMDAwMDAwMCA8PCAxOFxuY29uc3QgV1JJVEVfRklOSVNISU5HICA9IDBiMDEwMDAwMDAwMDAgPDwgMThcbmNvbnN0IFdSSVRFX0NPUktFRCAgICAgPSAwYjEwMDAwMDAwMDAwIDw8IDE4XG5cbmNvbnN0IFdSSVRFX05PVF9BQ1RJVkUgICAgPSBNQVggXiAoV1JJVEVfQUNUSVZFIHwgV1JJVEVfV1JJVElORylcbmNvbnN0IFdSSVRFX05PTl9QUklNQVJZICAgPSBNQVggXiBXUklURV9QUklNQVJZXG5jb25zdCBXUklURV9OT1RfRklOSVNISU5HID0gTUFYIF4gV1JJVEVfRklOSVNISU5HXG5jb25zdCBXUklURV9EUkFJTkVEICAgICAgID0gTUFYIF4gV1JJVEVfVU5EUkFJTkVEXG5jb25zdCBXUklURV9OT1RfUVVFVUVEICAgID0gTUFYIF4gV1JJVEVfUVVFVUVEXG5jb25zdCBXUklURV9OT1RfTkVYVF9USUNLID0gTUFYIF4gV1JJVEVfTkVYVF9USUNLXG5jb25zdCBXUklURV9OT1RfVVBEQVRJTkcgID0gTUFYIF4gV1JJVEVfVVBEQVRJTkdcbmNvbnN0IFdSSVRFX05PVF9DT1JLRUQgICAgPSBNQVggXiBXUklURV9DT1JLRURcblxuLy8gQ29tYmluZWQgc2hhcmVkIHN0YXRlXG5jb25zdCBBQ1RJVkUgPSBSRUFEX0FDVElWRSB8IFdSSVRFX0FDVElWRVxuY29uc3QgTk9UX0FDVElWRSA9IE1BWCBeIEFDVElWRVxuY29uc3QgRE9ORSA9IFJFQURfRE9ORSB8IFdSSVRFX0RPTkVcbmNvbnN0IERFU1RST1lfU1RBVFVTID0gREVTVFJPWUlORyB8IERFU1RST1lFRCB8IFBSRURFU1RST1lJTkdcbmNvbnN0IE9QRU5fU1RBVFVTID0gREVTVFJPWV9TVEFUVVMgfCBPUEVOSU5HXG5jb25zdCBBVVRPX0RFU1RST1kgPSBERVNUUk9ZX1NUQVRVUyB8IERPTkVcbmNvbnN0IE5PTl9QUklNQVJZID0gV1JJVEVfTk9OX1BSSU1BUlkgJiBSRUFEX05PTl9QUklNQVJZXG5jb25zdCBBQ1RJVkVfT1JfVElDS0lORyA9IFdSSVRFX05FWFRfVElDSyB8IFJFQURfTkVYVF9USUNLXG5jb25zdCBUSUNLSU5HID0gQUNUSVZFX09SX1RJQ0tJTkcgJiBOT1RfQUNUSVZFXG5jb25zdCBJU19PUEVOSU5HID0gT1BFTl9TVEFUVVMgfCBUSUNLSU5HXG5cbi8vIENvbWJpbmVkIHNoYXJlZCBzdGF0ZSBhbmQgcmVhZCBzdGF0ZVxuY29uc3QgUkVBRF9QUklNQVJZX1NUQVRVUyA9IE9QRU5fU1RBVFVTIHwgUkVBRF9FTkRJTkcgfCBSRUFEX0RPTkVcbmNvbnN0IFJFQURfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0RPTkUgfCBSRUFEX1FVRVVFRFxuY29uc3QgUkVBRF9FTkRJTkdfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VORElORyB8IFJFQURfUVVFVUVEXG5jb25zdCBSRUFEX1JFQURBQkxFX1NUQVRVUyA9IE9QRU5fU1RBVFVTIHwgUkVBRF9FTUlUX1JFQURBQkxFIHwgUkVBRF9RVUVVRUQgfCBSRUFEX0VNSVRURURfUkVBREFCTEVcbmNvbnN0IFNIT1VMRF9OT1RfUkVBRCA9IE9QRU5fU1RBVFVTIHwgUkVBRF9BQ1RJVkUgfCBSRUFEX0VORElORyB8IFJFQURfRE9ORSB8IFJFQURfTkVFRFNfUFVTSCB8IFJFQURfUkVBRF9BSEVBRFxuY29uc3QgUkVBRF9CQUNLUFJFU1NVUkVfU1RBVFVTID0gREVTVFJPWV9TVEFUVVMgfCBSRUFEX0VORElORyB8IFJFQURfRE9ORVxuY29uc3QgUkVBRF9VUERBVEVfU1lOQ19TVEFUVVMgPSBSRUFEX1VQREFUSU5HIHwgT1BFTl9TVEFUVVMgfCBSRUFEX05FWFRfVElDSyB8IFJFQURfUFJJTUFSWVxuXG4vLyBDb21iaW5lZCB3cml0ZSBzdGF0ZVxuY29uc3QgV1JJVEVfUFJJTUFSWV9TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFdSSVRFX0ZJTklTSElORyB8IFdSSVRFX0RPTkVcbmNvbnN0IFdSSVRFX1FVRVVFRF9BTkRfVU5EUkFJTkVEID0gV1JJVEVfUVVFVUVEIHwgV1JJVEVfVU5EUkFJTkVEXG5jb25zdCBXUklURV9RVUVVRURfQU5EX0FDVElWRSA9IFdSSVRFX1FVRVVFRCB8IFdSSVRFX0FDVElWRVxuY29uc3QgV1JJVEVfRFJBSU5fU1RBVFVTID0gV1JJVEVfUVVFVUVEIHwgV1JJVEVfVU5EUkFJTkVEIHwgT1BFTl9TVEFUVVMgfCBXUklURV9BQ1RJVkVcbmNvbnN0IFdSSVRFX1NUQVRVUyA9IE9QRU5fU1RBVFVTIHwgV1JJVEVfQUNUSVZFIHwgV1JJVEVfUVVFVUVEIHwgV1JJVEVfQ09SS0VEXG5jb25zdCBXUklURV9QUklNQVJZX0FORF9BQ1RJVkUgPSBXUklURV9QUklNQVJZIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBXUklURV9BQ1RJVkVfQU5EX1dSSVRJTkcgPSBXUklURV9BQ1RJVkUgfCBXUklURV9XUklUSU5HXG5jb25zdCBXUklURV9GSU5JU0hJTkdfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBXUklURV9GSU5JU0hJTkcgfCBXUklURV9RVUVVRURfQU5EX0FDVElWRSB8IFdSSVRFX0RPTkVcbmNvbnN0IFdSSVRFX0JBQ0tQUkVTU1VSRV9TVEFUVVMgPSBXUklURV9VTkRSQUlORUQgfCBERVNUUk9ZX1NUQVRVUyB8IFdSSVRFX0ZJTklTSElORyB8IFdSSVRFX0RPTkVcbmNvbnN0IFdSSVRFX1VQREFURV9TWU5DX1NUQVRVUyA9IFdSSVRFX1VQREFUSU5HIHwgT1BFTl9TVEFUVVMgfCBXUklURV9ORVhUX1RJQ0sgfCBXUklURV9QUklNQVJZXG5cbmNvbnN0IGFzeW5jSXRlcmF0b3IgPSBTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBTeW1ib2woJ2FzeW5jSXRlcmF0b3InKVxuXG5jbGFzcyBXcml0YWJsZVN0YXRlIHtcbiAgY29uc3RydWN0b3IgKHN0cmVhbSwgeyBoaWdoV2F0ZXJNYXJrID0gMTYzODQsIG1hcCA9IG51bGwsIG1hcFdyaXRhYmxlLCBieXRlTGVuZ3RoLCBieXRlTGVuZ3RoV3JpdGFibGUgfSA9IHt9KSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW1cbiAgICB0aGlzLnF1ZXVlID0gbmV3IEZJRk8oKVxuICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IGhpZ2hXYXRlck1hcmtcbiAgICB0aGlzLmJ1ZmZlcmVkID0gMFxuICAgIHRoaXMuZXJyb3IgPSBudWxsXG4gICAgdGhpcy5waXBlbGluZSA9IG51bGxcbiAgICB0aGlzLmRyYWlucyA9IG51bGwgLy8gaWYgd2UgYWRkIG1vcmUgc2VsZG9tbHkgdXNlZCBoZWxwZXJzIHdlIG1pZ2h0IHRoZW0gaW50byBhIHN1Ym9iamVjdCBzbyBpdHMgYSBzaW5nbGUgcHRyXG4gICAgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFdyaXRhYmxlIHx8IGJ5dGVMZW5ndGggfHwgZGVmYXVsdEJ5dGVMZW5ndGhcbiAgICB0aGlzLm1hcCA9IG1hcFdyaXRhYmxlIHx8IG1hcFxuICAgIHRoaXMuYWZ0ZXJXcml0ZSA9IGFmdGVyV3JpdGUuYmluZCh0aGlzKVxuICAgIHRoaXMuYWZ0ZXJVcGRhdGVOZXh0VGljayA9IHVwZGF0ZVdyaXRlTlQuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0IGVuZGVkICgpIHtcbiAgICByZXR1cm4gKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0RPTkUpICE9PSAwXG4gIH1cblxuICBwdXNoIChkYXRhKSB7XG4gICAgaWYgKHRoaXMubWFwICE9PSBudWxsKSBkYXRhID0gdGhpcy5tYXAoZGF0YSlcblxuICAgIHRoaXMuYnVmZmVyZWQgKz0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgdGhpcy5xdWV1ZS5wdXNoKGRhdGEpXG5cbiAgICBpZiAodGhpcy5idWZmZXJlZCA8IHRoaXMuaGlnaFdhdGVyTWFyaykge1xuICAgICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFdSSVRFX1FVRVVFRFxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfUVVFVUVEX0FORF9VTkRSQUlORURcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5xdWV1ZS5zaGlmdCgpXG5cbiAgICB0aGlzLmJ1ZmZlcmVkIC09IHRoaXMuYnl0ZUxlbmd0aChkYXRhKVxuICAgIGlmICh0aGlzLmJ1ZmZlcmVkID09PSAwKSB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX1FVRVVFRFxuXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIGVuZCAoZGF0YSkge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5zdHJlYW0ub25jZSgnZmluaXNoJywgZGF0YSlcbiAgICBlbHNlIGlmIChkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YSAhPT0gbnVsbCkgdGhpcy5wdXNoKGRhdGEpXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlID0gKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFdSSVRFX0ZJTklTSElORykgJiBXUklURV9OT05fUFJJTUFSWVxuICB9XG5cbiAgYXV0b0JhdGNoIChkYXRhLCBjYikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IFtdXG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIGJ1ZmZlci5wdXNoKGRhdGEpXG4gICAgd2hpbGUgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfU1RBVFVTKSA9PT0gV1JJVEVfUVVFVUVEX0FORF9BQ1RJVkUpIHtcbiAgICAgIGJ1ZmZlci5wdXNoKHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5zaGlmdCgpKVxuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIE9QRU5fU1RBVFVTKSAhPT0gMCkgcmV0dXJuIGNiKG51bGwpXG4gICAgc3RyZWFtLl93cml0ZXYoYnVmZmVyLCBjYilcbiAgfVxuXG4gIHVwZGF0ZSAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfVVBEQVRJTkdcblxuICAgIGRvIHtcbiAgICAgIHdoaWxlICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1NUQVRVUykgPT09IFdSSVRFX1FVRVVFRCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zaGlmdCgpXG4gICAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfQUNUSVZFX0FORF9XUklUSU5HXG4gICAgICAgIHN0cmVhbS5fd3JpdGUoZGF0YSwgdGhpcy5hZnRlcldyaXRlKVxuICAgICAgfVxuXG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9QUklNQVJZX0FORF9BQ1RJVkUpID09PSAwKSB0aGlzLnVwZGF0ZU5vblByaW1hcnkoKVxuICAgIH0gd2hpbGUgKHRoaXMuY29udGludWVVcGRhdGUoKSA9PT0gdHJ1ZSlcblxuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX1VQREFUSU5HXG4gIH1cblxuICB1cGRhdGVOb25QcmltYXJ5ICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRklOSVNISU5HX1NUQVRVUykgPT09IFdSSVRFX0ZJTklTSElORykge1xuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgV1JJVEVfQUNUSVZFKSAmIFdSSVRFX05PVF9GSU5JU0hJTkdcbiAgICAgIHN0cmVhbS5fZmluYWwoYWZ0ZXJGaW5hbC5iaW5kKHRoaXMpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSBERVNUUk9ZSU5HKSB7XG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBBQ1RJVkVfT1JfVElDS0lORykgPT09IDApIHtcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBBQ1RJVkVcbiAgICAgICAgc3RyZWFtLl9kZXN0cm95KGFmdGVyRGVzdHJveS5iaW5kKHRoaXMpKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgSVNfT1BFTklORykgPT09IE9QRU5JTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IEFDVElWRSkgJiBOT1RfT1BFTklOR1xuICAgICAgc3RyZWFtLl9vcGVuKGFmdGVyT3Blbi5iaW5kKHRoaXMpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnRpbnVlVXBkYXRlICgpIHtcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX05FWFRfVElDSykgPT09IDApIHJldHVybiBmYWxzZVxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfTkVYVF9USUNLXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHVwZGF0ZUNhbGxiYWNrICgpIHtcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1VQREFURV9TWU5DX1NUQVRVUykgPT09IFdSSVRFX1BSSU1BUlkpIHRoaXMudXBkYXRlKClcbiAgICBlbHNlIHRoaXMudXBkYXRlTmV4dFRpY2soKVxuICB9XG5cbiAgdXBkYXRlTmV4dFRpY2sgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfTkVYVF9USUNLKSAhPT0gMCkgcmV0dXJuXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFdSSVRFX05FWFRfVElDS1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfVVBEQVRJTkcpID09PSAwKSBxdWV1ZVRpY2sodGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrKVxuICB9XG59XG5cbmNsYXNzIFJlYWRhYmxlU3RhdGUge1xuICBjb25zdHJ1Y3RvciAoc3RyZWFtLCB7IGhpZ2hXYXRlck1hcmsgPSAxNjM4NCwgbWFwID0gbnVsbCwgbWFwUmVhZGFibGUsIGJ5dGVMZW5ndGgsIGJ5dGVMZW5ndGhSZWFkYWJsZSB9ID0ge30pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbVxuICAgIHRoaXMucXVldWUgPSBuZXcgRklGTygpXG4gICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFyayA9PT0gMCA/IDEgOiBoaWdoV2F0ZXJNYXJrXG4gICAgdGhpcy5idWZmZXJlZCA9IDBcbiAgICB0aGlzLnJlYWRBaGVhZCA9IGhpZ2hXYXRlck1hcmsgPiAwXG4gICAgdGhpcy5lcnJvciA9IG51bGxcbiAgICB0aGlzLnBpcGVsaW5lID0gbnVsbFxuICAgIHRoaXMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhSZWFkYWJsZSB8fCBieXRlTGVuZ3RoIHx8IGRlZmF1bHRCeXRlTGVuZ3RoXG4gICAgdGhpcy5tYXAgPSBtYXBSZWFkYWJsZSB8fCBtYXBcbiAgICB0aGlzLnBpcGVUbyA9IG51bGxcbiAgICB0aGlzLmFmdGVyUmVhZCA9IGFmdGVyUmVhZC5iaW5kKHRoaXMpXG4gICAgdGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrID0gdXBkYXRlUmVhZE5ULmJpbmQodGhpcylcbiAgfVxuXG4gIGdldCBlbmRlZCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpICE9PSAwXG4gIH1cblxuICBwaXBlIChwaXBlVG8sIGNiKSB7XG4gICAgaWYgKHRoaXMucGlwZVRvICE9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHBpcGUgdG8gb25lIGRlc3RpbmF0aW9uJylcbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG51bGxcblxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1BJUEVfRFJBSU5FRFxuICAgIHRoaXMucGlwZVRvID0gcGlwZVRvXG4gICAgdGhpcy5waXBlbGluZSA9IG5ldyBQaXBlbGluZSh0aGlzLnN0cmVhbSwgcGlwZVRvLCBjYilcblxuICAgIGlmIChjYikgdGhpcy5zdHJlYW0ub24oJ2Vycm9yJywgbm9vcCkgLy8gV2UgYWxyZWFkeSBlcnJvciBoYW5kbGUgdGhpcyBzbyBzdXByZXNzIGNyYXNoZXNcblxuICAgIGlmIChpc1N0cmVhbXgocGlwZVRvKSkge1xuICAgICAgcGlwZVRvLl93cml0YWJsZVN0YXRlLnBpcGVsaW5lID0gdGhpcy5waXBlbGluZVxuICAgICAgaWYgKGNiKSBwaXBlVG8ub24oJ2Vycm9yJywgbm9vcCkgLy8gV2UgYWxyZWFkeSBlcnJvciBoYW5kbGUgdGhpcyBzbyBzdXByZXNzIGNyYXNoZXNcbiAgICAgIHBpcGVUby5vbignZmluaXNoJywgdGhpcy5waXBlbGluZS5maW5pc2hlZC5iaW5kKHRoaXMucGlwZWxpbmUpKSAvLyBUT0RPOiBqdXN0IGNhbGwgZmluaXNoZWQgZnJvbSBwaXBlVG8gaXRzZWxmXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9uZXJyb3IgPSB0aGlzLnBpcGVsaW5lLmRvbmUuYmluZCh0aGlzLnBpcGVsaW5lLCBwaXBlVG8pXG4gICAgICBjb25zdCBvbmNsb3NlID0gdGhpcy5waXBlbGluZS5kb25lLmJpbmQodGhpcy5waXBlbGluZSwgcGlwZVRvLCBudWxsKSAvLyBvbmNsb3NlIGhhcyBhIHdlaXJkIGJvb2wgYXJnXG4gICAgICBwaXBlVG8ub24oJ2Vycm9yJywgb25lcnJvcilcbiAgICAgIHBpcGVUby5vbignY2xvc2UnLCBvbmNsb3NlKVxuICAgICAgcGlwZVRvLm9uKCdmaW5pc2gnLCB0aGlzLnBpcGVsaW5lLmZpbmlzaGVkLmJpbmQodGhpcy5waXBlbGluZSkpXG4gICAgfVxuXG4gICAgcGlwZVRvLm9uKCdkcmFpbicsIGFmdGVyRHJhaW4uYmluZCh0aGlzKSlcbiAgICB0aGlzLnN0cmVhbS5lbWl0KCdwaXBpbmcnLCBwaXBlVG8pXG4gICAgcGlwZVRvLmVtaXQoJ3BpcGUnLCB0aGlzLnN0cmVhbSlcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IDBcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFJFQURfRU5ESU5HKSAmIFJFQURfTk9OX1BSSU1BUllfQU5EX1BVU0hFRFxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWFwICE9PSBudWxsKSB7XG4gICAgICBkYXRhID0gdGhpcy5tYXAoZGF0YSlcbiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdGhpcy5idWZmZXJlZCA8IHRoaXMuaGlnaFdhdGVyTWFya1xuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyZWQgKz0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgdGhpcy5xdWV1ZS5wdXNoKGRhdGEpXG5cbiAgICBzdHJlYW0uX2R1cGxleFN0YXRlID0gKHN0cmVhbS5fZHVwbGV4U3RhdGUgfCBSRUFEX1FVRVVFRCkgJiBSRUFEX1BVU0hFRFxuXG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyZWQgPCB0aGlzLmhpZ2hXYXRlck1hcmtcbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5xdWV1ZS5zaGlmdCgpXG5cbiAgICB0aGlzLmJ1ZmZlcmVkIC09IHRoaXMuYnl0ZUxlbmd0aChkYXRhKVxuICAgIGlmICh0aGlzLmJ1ZmZlcmVkID09PSAwKSB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfUVVFVUVEXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIHVuc2hpZnQgKGRhdGEpIHtcbiAgICBjb25zdCBwZW5kaW5nID0gW3RoaXMubWFwICE9PSBudWxsID8gdGhpcy5tYXAoZGF0YSkgOiBkYXRhXVxuICAgIHdoaWxlICh0aGlzLmJ1ZmZlcmVkID4gMCkgcGVuZGluZy5wdXNoKHRoaXMuc2hpZnQoKSlcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBwZW5kaW5nW2ldXG4gICAgICB0aGlzLmJ1ZmZlcmVkICs9IHRoaXMuYnl0ZUxlbmd0aChkYXRhKVxuICAgICAgdGhpcy5xdWV1ZS5wdXNoKGRhdGEpXG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKHBlbmRpbmdbcGVuZGluZy5sZW5ndGggLSAxXSlcbiAgfVxuXG4gIHJlYWQgKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1NUQVRVUykgPT09IFJFQURfUVVFVUVEKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5zaGlmdCgpXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwgJiYgdGhpcy5waXBlVG8ud3JpdGUoZGF0YSkgPT09IGZhbHNlKSBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfUElQRV9OT1RfRFJBSU5FRFxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTUlUX0RBVEEpICE9PSAwKSBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlYWRBaGVhZCA9PT0gZmFsc2UpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9SRUFEX0FIRUFEXG4gICAgICB0aGlzLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZHJhaW4gKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICB3aGlsZSAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1NUQVRVUykgPT09IFJFQURfUVVFVUVEICYmIChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9GTE9XSU5HKSAhPT0gMCkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2hpZnQoKVxuICAgICAgaWYgKHRoaXMucGlwZVRvICE9PSBudWxsICYmIHRoaXMucGlwZVRvLndyaXRlKGRhdGEpID09PSBmYWxzZSkgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX1BJUEVfTk9UX0RSQUlORURcbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfRU1JVF9EQVRBKSAhPT0gMCkgc3RyZWFtLmVtaXQoJ2RhdGEnLCBkYXRhKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9VUERBVElOR1xuXG4gICAgZG8ge1xuICAgICAgdGhpcy5kcmFpbigpXG5cbiAgICAgIHdoaWxlICh0aGlzLmJ1ZmZlcmVkIDwgdGhpcy5oaWdoV2F0ZXJNYXJrICYmIChzdHJlYW0uX2R1cGxleFN0YXRlICYgU0hPVUxEX05PVF9SRUFEKSA9PT0gUkVBRF9SRUFEX0FIRUFEKSB7XG4gICAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9BQ1RJVkVfQU5EX05FRURTX1BVU0hcbiAgICAgICAgc3RyZWFtLl9yZWFkKHRoaXMuYWZ0ZXJSZWFkKVxuICAgICAgICB0aGlzLmRyYWluKClcbiAgICAgIH1cblxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9SRUFEQUJMRV9TVEFUVVMpID09PSBSRUFEX0VNSVRfUkVBREFCTEVfQU5EX1FVRVVFRCkge1xuICAgICAgICBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfRU1JVFRFRF9SRUFEQUJMRVxuICAgICAgICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKVxuICAgICAgfVxuXG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1BSSU1BUllfQU5EX0FDVElWRSkgPT09IDApIHRoaXMudXBkYXRlTm9uUHJpbWFyeSgpXG4gICAgfSB3aGlsZSAodGhpcy5jb250aW51ZVVwZGF0ZSgpID09PSB0cnVlKVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PVF9VUERBVElOR1xuICB9XG5cbiAgdXBkYXRlTm9uUHJpbWFyeSAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfRU5ESU5HX1NUQVRVUykgPT09IFJFQURfRU5ESU5HKSB7XG4gICAgICBzdHJlYW0uX2R1cGxleFN0YXRlID0gKHN0cmVhbS5fZHVwbGV4U3RhdGUgfCBSRUFEX0RPTkUpICYgUkVBRF9OT1RfRU5ESU5HXG4gICAgICBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIEFVVE9fREVTVFJPWSkgPT09IERPTkUpIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gREVTVFJPWUlOR1xuICAgICAgaWYgKHRoaXMucGlwZVRvICE9PSBudWxsKSB0aGlzLnBpcGVUby5lbmQoKVxuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSA9PT0gREVTVFJPWUlORykge1xuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgQUNUSVZFX09SX1RJQ0tJTkcpID09PSAwKSB7XG4gICAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gQUNUSVZFXG4gICAgICAgIHN0cmVhbS5fZGVzdHJveShhZnRlckRlc3Ryb3kuYmluZCh0aGlzKSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIElTX09QRU5JTkcpID09PSBPUEVOSU5HKSB7XG4gICAgICBzdHJlYW0uX2R1cGxleFN0YXRlID0gKHN0cmVhbS5fZHVwbGV4U3RhdGUgfCBBQ1RJVkUpICYgTk9UX09QRU5JTkdcbiAgICAgIHN0cmVhbS5fb3BlbihhZnRlck9wZW4uYmluZCh0aGlzKSlcbiAgICB9XG4gIH1cblxuICBjb250aW51ZVVwZGF0ZSAoKSB7XG4gICAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX05FWFRfVElDSykgPT09IDApIHJldHVybiBmYWxzZVxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PVF9ORVhUX1RJQ0tcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdXBkYXRlQ2FsbGJhY2sgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9VUERBVEVfU1lOQ19TVEFUVVMpID09PSBSRUFEX1BSSU1BUlkpIHRoaXMudXBkYXRlKClcbiAgICBlbHNlIHRoaXMudXBkYXRlTmV4dFRpY2soKVxuICB9XG5cbiAgdXBkYXRlTmV4dFRpY2sgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9ORVhUX1RJQ0spICE9PSAwKSByZXR1cm5cbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9ORVhUX1RJQ0tcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfVVBEQVRJTkcpID09PSAwKSBxdWV1ZVRpY2sodGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrKVxuICB9XG59XG5cbmNsYXNzIFRyYW5zZm9ybVN0YXRlIHtcbiAgY29uc3RydWN0b3IgKHN0cmVhbSkge1xuICAgIHRoaXMuZGF0YSA9IG51bGxcbiAgICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gYWZ0ZXJUcmFuc2Zvcm0uYmluZChzdHJlYW0pXG4gICAgdGhpcy5hZnRlckZpbmFsID0gbnVsbFxuICB9XG59XG5cbmNsYXNzIFBpcGVsaW5lIHtcbiAgY29uc3RydWN0b3IgKHNyYywgZHN0LCBjYikge1xuICAgIHRoaXMuZnJvbSA9IHNyY1xuICAgIHRoaXMudG8gPSBkc3RcbiAgICB0aGlzLmFmdGVyUGlwZSA9IGNiXG4gICAgdGhpcy5lcnJvciA9IG51bGxcbiAgICB0aGlzLnBpcGVUb0ZpbmlzaGVkID0gZmFsc2VcbiAgfVxuXG4gIGZpbmlzaGVkICgpIHtcbiAgICB0aGlzLnBpcGVUb0ZpbmlzaGVkID0gdHJ1ZVxuICB9XG5cbiAgZG9uZSAoc3RyZWFtLCBlcnIpIHtcbiAgICBpZiAoZXJyKSB0aGlzLmVycm9yID0gZXJyXG5cbiAgICBpZiAoc3RyZWFtID09PSB0aGlzLnRvKSB7XG4gICAgICB0aGlzLnRvID0gbnVsbFxuXG4gICAgICBpZiAodGhpcy5mcm9tICE9PSBudWxsKSB7XG4gICAgICAgIGlmICgodGhpcy5mcm9tLl9kdXBsZXhTdGF0ZSAmIFJFQURfRE9ORSkgPT09IDAgfHwgIXRoaXMucGlwZVRvRmluaXNoZWQpIHtcbiAgICAgICAgICB0aGlzLmZyb20uZGVzdHJveSh0aGlzLmVycm9yIHx8IG5ldyBFcnJvcignV3JpdGFibGUgc3RyZWFtIGNsb3NlZCBwcmVtYXR1cmVseScpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHJlYW0gPT09IHRoaXMuZnJvbSkge1xuICAgICAgdGhpcy5mcm9tID0gbnVsbFxuXG4gICAgICBpZiAodGhpcy50byAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpID09PSAwKSB7XG4gICAgICAgICAgdGhpcy50by5kZXN0cm95KHRoaXMuZXJyb3IgfHwgbmV3IEVycm9yKCdSZWFkYWJsZSBzdHJlYW0gY2xvc2VkIGJlZm9yZSBlbmRpbmcnKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5hZnRlclBpcGUgIT09IG51bGwpIHRoaXMuYWZ0ZXJQaXBlKHRoaXMuZXJyb3IpXG4gICAgdGhpcy50byA9IHRoaXMuZnJvbSA9IHRoaXMuYWZ0ZXJQaXBlID0gbnVsbFxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyRHJhaW4gKCkge1xuICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9QSVBFX0RSQUlORURcbiAgdGhpcy51cGRhdGVDYWxsYmFjaygpXG59XG5cbmZ1bmN0aW9uIGFmdGVyRmluYWwgKGVycikge1xuICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuICBpZiAoZXJyKSBzdHJlYW0uZGVzdHJveShlcnIpXG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSA9PT0gMCkge1xuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfRE9ORVxuICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKVxuICB9XG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIEFVVE9fREVTVFJPWSkgPT09IERPTkUpIHtcbiAgICBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IERFU1RST1lJTkdcbiAgfVxuXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX0FDVElWRVxuXG4gIC8vIG5vIG5lZWQgdG8gd2FpdCB0aGUgZXh0cmEgdGljayBoZXJlLCBzbyB3ZSBzaG9ydCBjaXJjdWl0IHRoYXRcbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfVVBEQVRJTkcpID09PSAwKSB0aGlzLnVwZGF0ZSgpXG4gIGVsc2UgdGhpcy51cGRhdGVOZXh0VGljaygpXG59XG5cbmZ1bmN0aW9uIGFmdGVyRGVzdHJveSAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgaWYgKCFlcnIgJiYgdGhpcy5lcnJvciAhPT0gU1RSRUFNX0RFU1RST1lFRCkgZXJyID0gdGhpcy5lcnJvclxuICBpZiAoZXJyKSBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gREVTVFJPWUVEXG4gIHN0cmVhbS5lbWl0KCdjbG9zZScpXG5cbiAgY29uc3QgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgY29uc3Qgd3MgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcblxuICBpZiAocnMgIT09IG51bGwgJiYgcnMucGlwZWxpbmUgIT09IG51bGwpIHJzLnBpcGVsaW5lLmRvbmUoc3RyZWFtLCBlcnIpXG5cbiAgaWYgKHdzICE9PSBudWxsKSB7XG4gICAgd2hpbGUgKHdzLmRyYWlucyAhPT0gbnVsbCAmJiB3cy5kcmFpbnMubGVuZ3RoID4gMCkgd3MuZHJhaW5zLnNoaWZ0KCkucmVzb2x2ZShmYWxzZSlcbiAgICBpZiAod3MucGlwZWxpbmUgIT09IG51bGwpIHdzLnBpcGVsaW5lLmRvbmUoc3RyZWFtLCBlcnIpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZSAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgaWYgKGVycikgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFdSSVRFX05PVF9BQ1RJVkVcblxuICBpZiAodGhpcy5kcmFpbnMgIT09IG51bGwpIHRpY2tEcmFpbnModGhpcy5kcmFpbnMpXG5cbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRFJBSU5fU1RBVFVTKSA9PT0gV1JJVEVfVU5EUkFJTkVEKSB7XG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9EUkFJTkVEXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRU1JVF9EUkFJTikgPT09IFdSSVRFX0VNSVRfRFJBSU4pIHtcbiAgICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpXG4gICAgfVxuICB9XG5cbiAgdGhpcy51cGRhdGVDYWxsYmFjaygpXG59XG5cbmZ1bmN0aW9uIGFmdGVyUmVhZCAoZXJyKSB7XG4gIGlmIChlcnIpIHRoaXMuc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfQUNUSVZFXG4gIGlmICh0aGlzLnJlYWRBaGVhZCA9PT0gZmFsc2UgJiYgKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfUkVTVU1FRCkgPT09IDApIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PX1JFQURfQUhFQURcbiAgdGhpcy51cGRhdGVDYWxsYmFjaygpXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlYWROVCAoKSB7XG4gIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9VUERBVElORykgPT09IDApIHtcbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfTkVYVF9USUNLXG4gICAgdGhpcy51cGRhdGUoKVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdyaXRlTlQgKCkge1xuICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1VQREFUSU5HKSA9PT0gMCkge1xuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfTkVYVF9USUNLXG4gICAgdGhpcy51cGRhdGUoKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRpY2tEcmFpbnMgKGRyYWlucykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRyYWlucy5sZW5ndGg7IGkrKykge1xuICAgIC8vIGRyYWlucy53cml0ZXMgYXJlIG1vbm90b25pYywgc28gaWYgb25lIGlzIDAgaXRzIGFsd2F5cyB0aGUgZmlyc3Qgb25lXG4gICAgaWYgKC0tZHJhaW5zW2ldLndyaXRlcyA9PT0gMCkge1xuICAgICAgZHJhaW5zLnNoaWZ0KCkucmVzb2x2ZSh0cnVlKVxuICAgICAgaS0tXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyT3BlbiAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgaWYgKGVycikgc3RyZWFtLmRlc3Ryb3koZXJyKVxuXG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lJTkcpID09PSAwKSB7XG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9QUklNQVJZX1NUQVRVUykgPT09IDApIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9QUklNQVJZXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfUFJJTUFSWV9TVEFUVVMpID09PSAwKSBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IFdSSVRFX1BSSU1BUllcbiAgICBzdHJlYW0uZW1pdCgnb3BlbicpXG4gIH1cblxuICBzdHJlYW0uX2R1cGxleFN0YXRlICY9IE5PVF9BQ1RJVkVcblxuICBpZiAoc3RyZWFtLl93cml0YWJsZVN0YXRlICE9PSBudWxsKSB7XG4gICAgc3RyZWFtLl93cml0YWJsZVN0YXRlLnVwZGF0ZUNhbGxiYWNrKClcbiAgfVxuXG4gIGlmIChzdHJlYW0uX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBzdHJlYW0uX3JlYWRhYmxlU3RhdGUudXBkYXRlQ2FsbGJhY2soKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtIChlcnIsIGRhdGEpIHtcbiAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhICE9PSBudWxsKSB0aGlzLnB1c2goZGF0YSlcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5hZnRlcldyaXRlKGVycilcbn1cblxuZnVuY3Rpb24gbmV3TGlzdGVuZXIgKG5hbWUpIHtcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RhdGEnKSB7XG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSAoUkVBRF9FTUlUX0RBVEEgfCBSRUFEX1JFU1VNRURfUkVBRF9BSEVBRClcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gUkVBRF9FTUlUX1JFQURBQkxFXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuYW1lID09PSAnZHJhaW4nKSB7XG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9FTUlUX0RSQUlOXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgU3RyZWFtIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSA9IDBcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbnVsbFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBudWxsXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMub3BlbikgdGhpcy5fb3BlbiA9IG9wdHMub3BlblxuICAgICAgaWYgKG9wdHMuZGVzdHJveSkgdGhpcy5fZGVzdHJveSA9IG9wdHMuZGVzdHJveVxuICAgICAgaWYgKG9wdHMucHJlZGVzdHJveSkgdGhpcy5fcHJlZGVzdHJveSA9IG9wdHMucHJlZGVzdHJveVxuICAgICAgaWYgKG9wdHMuc2lnbmFsKSB7XG4gICAgICAgIG9wdHMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnQuYmluZCh0aGlzKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9uKCduZXdMaXN0ZW5lcicsIG5ld0xpc3RlbmVyKVxuICB9XG5cbiAgX29wZW4gKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9kZXN0cm95IChjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfcHJlZGVzdHJveSAoKSB7XG4gICAgLy8gZG9lcyBub3RoaW5nXG4gIH1cblxuICBnZXQgcmVhZGFibGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlICE9PSBudWxsID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0IHdyaXRhYmxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCA/IHRydWUgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGdldCBkZXN0cm95ZWQgKCkge1xuICAgIHJldHVybiAodGhpcy5fZHVwbGV4U3RhdGUgJiBERVNUUk9ZRUQpICE9PSAwXG4gIH1cblxuICBnZXQgZGVzdHJveWluZyAoKSB7XG4gICAgcmV0dXJuICh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSAhPT0gMFxuICB9XG5cbiAgZGVzdHJveSAoZXJyKSB7XG4gICAgaWYgKCh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSA9PT0gMCkge1xuICAgICAgaWYgKCFlcnIpIGVyciA9IFNUUkVBTV9ERVNUUk9ZRURcbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlID0gKHRoaXMuX2R1cGxleFN0YXRlIHwgREVTVFJPWUlORykgJiBOT05fUFJJTUFSWVxuXG4gICAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmsgPSAwXG4gICAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZXJyb3IgPSBlcnJcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyayA9IDBcbiAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvciA9IGVyclxuICAgICAgfVxuXG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBQUkVERVNUUk9ZSU5HXG4gICAgICB0aGlzLl9wcmVkZXN0cm95KClcbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlICY9IE5PVF9QUkVERVNUUk9ZSU5HXG5cbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlICE9PSBudWxsKSB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlICE9PSBudWxsKSB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgUmVhZGFibGUgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBPUEVOSU5HIHwgV1JJVEVfRE9ORSB8IFJFQURfUkVBRF9BSEVBRFxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZSh0aGlzLCBvcHRzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRBaGVhZCA9PT0gZmFsc2UpIHRoaXMuX2R1cGxleFN0YXRlICY9IFJFQURfTk9fUkVBRF9BSEVBRFxuICAgICAgaWYgKG9wdHMucmVhZCkgdGhpcy5fcmVhZCA9IG9wdHMucmVhZFxuICAgICAgaWYgKG9wdHMuZWFnZXJPcGVuKSB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIGlmIChvcHRzLmVuY29kaW5nKSB0aGlzLnNldEVuY29kaW5nKG9wdHMuZW5jb2RpbmcpXG4gICAgfVxuICB9XG5cbiAgc2V0RW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gICAgY29uc3QgZGVjID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nKVxuICAgIGNvbnN0IG1hcCA9IHRoaXMuX3JlYWRhYmxlU3RhdGUubWFwIHx8IGVjaG9cbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLm1hcCA9IG1hcE9yU2tpcFxuICAgIHJldHVybiB0aGlzXG5cbiAgICBmdW5jdGlvbiBtYXBPclNraXAgKGRhdGEpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBkZWMucHVzaChkYXRhKVxuICAgICAgcmV0dXJuIG5leHQgPT09ICcnID8gbnVsbCA6IG1hcChuZXh0KVxuICAgIH1cbiAgfVxuXG4gIF9yZWFkIChjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBwaXBlIChkZXN0LCBjYikge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucGlwZShkZXN0LCBjYilcbiAgICByZXR1cm4gZGVzdFxuICB9XG5cbiAgcmVhZCAoKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZCgpXG4gIH1cblxuICBwdXNoIChkYXRhKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUucHVzaChkYXRhKVxuICB9XG5cbiAgdW5zaGlmdCAoZGF0YSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLnVuc2hpZnQoZGF0YSlcbiAgfVxuXG4gIHJlc3VtZSAoKSB7XG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gUkVBRF9SRVNVTUVEX1JFQURfQUhFQURcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcGF1c2UgKCkge1xuICAgIHRoaXMuX2R1cGxleFN0YXRlICY9ICh0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRBaGVhZCA9PT0gZmFsc2UgPyBSRUFEX1BBVVNFRF9OT19SRUFEX0FIRUFEIDogUkVBRF9QQVVTRUQpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUFzeW5jSXRlcmF0b3IgKGl0ZSwgb3B0cykge1xuICAgIGxldCBkZXN0cm95XG5cbiAgICBjb25zdCBycyA9IG5ldyBSZWFkYWJsZSh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCAoY2IpIHtcbiAgICAgICAgaXRlLm5leHQoKS50aGVuKHB1c2gpLnRoZW4oY2IuYmluZChudWxsLCBudWxsKSkuY2F0Y2goY2IpXG4gICAgICB9LFxuICAgICAgcHJlZGVzdHJveSAoKSB7XG4gICAgICAgIGRlc3Ryb3kgPSBpdGUucmV0dXJuKClcbiAgICAgIH0sXG4gICAgICBkZXN0cm95IChjYikge1xuICAgICAgICBpZiAoIWRlc3Ryb3kpIHJldHVybiBjYihudWxsKVxuICAgICAgICBkZXN0cm95LnRoZW4oY2IuYmluZChudWxsLCBudWxsKSkuY2F0Y2goY2IpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiByc1xuXG4gICAgZnVuY3Rpb24gcHVzaCAoZGF0YSkge1xuICAgICAgaWYgKGRhdGEuZG9uZSkgcnMucHVzaChudWxsKVxuICAgICAgZWxzZSBycy5wdXNoKGRhdGEudmFsdWUpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZyb20gKGRhdGEsIG9wdHMpIHtcbiAgICBpZiAoaXNSZWFkU3RyZWFteChkYXRhKSkgcmV0dXJuIGRhdGFcbiAgICBpZiAoZGF0YVthc3luY0l0ZXJhdG9yXSkgcmV0dXJuIHRoaXMuX2Zyb21Bc3luY0l0ZXJhdG9yKGRhdGFbYXN5bmNJdGVyYXRvcl0oKSwgb3B0cylcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIGRhdGEgPSBkYXRhID09PSB1bmRlZmluZWQgPyBbXSA6IFtkYXRhXVxuXG4gICAgbGV0IGkgPSAwXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZSh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCAoY2IpIHtcbiAgICAgICAgdGhpcy5wdXNoKGkgPT09IGRhdGEubGVuZ3RoID8gbnVsbCA6IGRhdGFbaSsrXSlcbiAgICAgICAgY2IobnVsbClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc3RhdGljIGlzQmFja3ByZXNzdXJlZCAocnMpIHtcbiAgICByZXR1cm4gKHJzLl9kdXBsZXhTdGF0ZSAmIFJFQURfQkFDS1BSRVNTVVJFX1NUQVRVUykgIT09IDAgfHwgcnMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyZWQgPj0gcnMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya1xuICB9XG5cbiAgc3RhdGljIGlzUGF1c2VkIChycykge1xuICAgIHJldHVybiAocnMuX2R1cGxleFN0YXRlICYgUkVBRF9SRVNVTUVEKSA9PT0gMFxuICB9XG5cbiAgW2FzeW5jSXRlcmF0b3JdICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzXG5cbiAgICBsZXQgZXJyb3IgPSBudWxsXG4gICAgbGV0IHByb21pc2VSZXNvbHZlID0gbnVsbFxuICAgIGxldCBwcm9taXNlUmVqZWN0ID0gbnVsbFxuXG4gICAgdGhpcy5vbignZXJyb3InLCAoZXJyKSA9PiB7IGVycm9yID0gZXJyIH0pXG4gICAgdGhpcy5vbigncmVhZGFibGUnLCBvbnJlYWRhYmxlKVxuICAgIHRoaXMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIHJldHVybiB7XG4gICAgICBbYXN5bmNJdGVyYXRvcl0gKCkge1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfSxcbiAgICAgIG5leHQgKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHByb21pc2VSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgICAgIHByb21pc2VSZWplY3QgPSByZWplY3RcbiAgICAgICAgICBjb25zdCBkYXRhID0gc3RyZWFtLnJlYWQoKVxuICAgICAgICAgIGlmIChkYXRhICE9PSBudWxsKSBvbmRhdGEoZGF0YSlcbiAgICAgICAgICBlbHNlIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lFRCkgIT09IDApIG9uZGF0YShudWxsKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHJldHVybiAoKSB7XG4gICAgICAgIHJldHVybiBkZXN0cm95KG51bGwpXG4gICAgICB9LFxuICAgICAgdGhyb3cgKGVycikge1xuICAgICAgICByZXR1cm4gZGVzdHJveShlcnIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25yZWFkYWJsZSAoKSB7XG4gICAgICBpZiAocHJvbWlzZVJlc29sdmUgIT09IG51bGwpIG9uZGF0YShzdHJlYW0ucmVhZCgpKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgaWYgKHByb21pc2VSZXNvbHZlICE9PSBudWxsKSBvbmRhdGEobnVsbClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmRhdGEgKGRhdGEpIHtcbiAgICAgIGlmIChwcm9taXNlUmVqZWN0ID09PSBudWxsKSByZXR1cm5cbiAgICAgIGlmIChlcnJvcikgcHJvbWlzZVJlamVjdChlcnJvcilcbiAgICAgIGVsc2UgaWYgKGRhdGEgPT09IG51bGwgJiYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpID09PSAwKSBwcm9taXNlUmVqZWN0KFNUUkVBTV9ERVNUUk9ZRUQpXG4gICAgICBlbHNlIHByb21pc2VSZXNvbHZlKHsgdmFsdWU6IGRhdGEsIGRvbmU6IGRhdGEgPT09IG51bGwgfSlcbiAgICAgIHByb21pc2VSZWplY3QgPSBwcm9taXNlUmVzb2x2ZSA9IG51bGxcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95IChlcnIpIHtcbiAgICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmIChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWUVEKSByZXR1cm4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgc3RyZWFtLm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpXG4gICAgICAgICAgZWxzZSByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgV3JpdGFibGUgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBPUEVOSU5HIHwgUkVBRF9ET05FXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKHRoaXMsIG9wdHMpXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMud3JpdGV2KSB0aGlzLl93cml0ZXYgPSBvcHRzLndyaXRldlxuICAgICAgaWYgKG9wdHMud3JpdGUpIHRoaXMuX3dyaXRlID0gb3B0cy53cml0ZVxuICAgICAgaWYgKG9wdHMuZmluYWwpIHRoaXMuX2ZpbmFsID0gb3B0cy5maW5hbFxuICAgICAgaWYgKG9wdHMuZWFnZXJPcGVuKSB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG4gIH1cblxuICBjb3JrICgpIHtcbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9DT1JLRURcbiAgfVxuXG4gIHVuY29yayAoKSB7XG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX0NPUktFRFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICB9XG5cbiAgX3dyaXRldiAoYmF0Y2gsIGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmF1dG9CYXRjaChkYXRhLCBjYilcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICBjYihudWxsKVxuICB9XG5cbiAgc3RhdGljIGlzQmFja3ByZXNzdXJlZCAod3MpIHtcbiAgICByZXR1cm4gKHdzLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0JBQ0tQUkVTU1VSRV9TVEFUVVMpICE9PSAwXG4gIH1cblxuICBzdGF0aWMgZHJhaW5lZCAod3MpIHtcbiAgICBpZiAod3MuZGVzdHJveWVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKVxuICAgIGNvbnN0IHN0YXRlID0gd3MuX3dyaXRhYmxlU3RhdGVcbiAgICBjb25zdCBwZW5kaW5nID0gKGlzV3JpdGV2KHdzKSA/IE1hdGgubWluKDEsIHN0YXRlLnF1ZXVlLmxlbmd0aCkgOiBzdGF0ZS5xdWV1ZS5sZW5ndGgpXG4gICAgY29uc3Qgd3JpdGVzID0gcGVuZGluZyArICgod3MuX2R1cGxleFN0YXRlICYgV1JJVEVfV1JJVElORykgPyAxIDogMClcbiAgICBpZiAod3JpdGVzID09PSAwKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpXG4gICAgaWYgKHN0YXRlLmRyYWlucyA9PT0gbnVsbCkgc3RhdGUuZHJhaW5zID0gW11cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHN0YXRlLmRyYWlucy5wdXNoKHsgd3JpdGVzLCByZXNvbHZlIH0pXG4gICAgfSlcbiAgfVxuXG4gIHdyaXRlIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUucHVzaChkYXRhKVxuICB9XG5cbiAgZW5kIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmQoZGF0YSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbmNsYXNzIER1cGxleCBleHRlbmRzIFJlYWRhYmxlIHsgLy8gYW5kIFdyaXRhYmxlXG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcblxuICAgIHRoaXMuX2R1cGxleFN0YXRlID0gT1BFTklORyB8ICh0aGlzLl9kdXBsZXhTdGF0ZSAmIFJFQURfUkVBRF9BSEVBRClcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUodGhpcywgb3B0cylcblxuICAgIGlmIChvcHRzKSB7XG4gICAgICBpZiAob3B0cy53cml0ZXYpIHRoaXMuX3dyaXRldiA9IG9wdHMud3JpdGV2XG4gICAgICBpZiAob3B0cy53cml0ZSkgdGhpcy5fd3JpdGUgPSBvcHRzLndyaXRlXG4gICAgICBpZiAob3B0cy5maW5hbCkgdGhpcy5fZmluYWwgPSBvcHRzLmZpbmFsXG4gICAgfVxuICB9XG5cbiAgY29yayAoKSB7XG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfQ09SS0VEXG4gIH1cblxuICB1bmNvcmsgKCkge1xuICAgIHRoaXMuX2R1cGxleFN0YXRlICY9IFdSSVRFX05PVF9DT1JLRURcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgfVxuXG4gIF93cml0ZXYgKGJhdGNoLCBjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5hdXRvQmF0Y2goZGF0YSwgY2IpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHdyaXRlIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUucHVzaChkYXRhKVxuICB9XG5cbiAgZW5kIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmQoZGF0YSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbmNsYXNzIFRyYW5zZm9ybSBleHRlbmRzIER1cGxleCB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcbiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IG5ldyBUcmFuc2Zvcm1TdGF0ZSh0aGlzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLnRyYW5zZm9ybSkgdGhpcy5fdHJhbnNmb3JtID0gb3B0cy50cmFuc2Zvcm1cbiAgICAgIGlmIChvcHRzLmZsdXNoKSB0aGlzLl9mbHVzaCA9IG9wdHMuZmx1c2hcbiAgICB9XG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyZWQgPj0gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gZGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm0oZGF0YSwgdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJUcmFuc2Zvcm0pXG4gICAgfVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgaWYgKHRoaXMuX3RyYW5zZm9ybVN0YXRlLmRhdGEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhXG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gbnVsbFxuICAgICAgY2IobnVsbClcbiAgICAgIHRoaXMuX3RyYW5zZm9ybShkYXRhLCB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlclRyYW5zZm9ybSlcbiAgICB9IGVsc2Uge1xuICAgICAgY2IobnVsbClcbiAgICB9XG4gIH1cblxuICBkZXN0cm95IChlcnIpIHtcbiAgICBzdXBlci5kZXN0cm95KGVycilcbiAgICBpZiAodGhpcy5fdHJhbnNmb3JtU3RhdGUuZGF0YSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fdHJhbnNmb3JtU3RhdGUuZGF0YSA9IG51bGxcbiAgICAgIHRoaXMuX3RyYW5zZm9ybVN0YXRlLmFmdGVyVHJhbnNmb3JtKClcbiAgICB9XG4gIH1cblxuICBfdHJhbnNmb3JtIChkYXRhLCBjYikge1xuICAgIGNiKG51bGwsIGRhdGEpXG4gIH1cblxuICBfZmx1c2ggKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlckZpbmFsID0gY2JcbiAgICB0aGlzLl9mbHVzaCh0cmFuc2Zvcm1BZnRlckZsdXNoLmJpbmQodGhpcykpXG4gIH1cbn1cblxuY2xhc3MgUGFzc1Rocm91Z2ggZXh0ZW5kcyBUcmFuc2Zvcm0ge31cblxuZnVuY3Rpb24gdHJhbnNmb3JtQWZ0ZXJGbHVzaCAoZXJyLCBkYXRhKSB7XG4gIGNvbnN0IGNiID0gdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJGaW5hbFxuICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICBpZiAoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHRoaXMucHVzaChkYXRhKVxuICB0aGlzLnB1c2gobnVsbClcbiAgY2IobnVsbClcbn1cblxuZnVuY3Rpb24gcGlwZWxpbmVQcm9taXNlICguLi5zdHJlYW1zKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmV0dXJuIHBpcGVsaW5lKC4uLnN0cmVhbXMsIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgcmVzb2x2ZSgpXG4gICAgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gcGlwZWxpbmUgKHN0cmVhbSwgLi4uc3RyZWFtcykge1xuICBjb25zdCBhbGwgPSBBcnJheS5pc0FycmF5KHN0cmVhbSkgPyBbLi4uc3RyZWFtLCAuLi5zdHJlYW1zXSA6IFtzdHJlYW0sIC4uLnN0cmVhbXNdXG4gIGNvbnN0IGRvbmUgPSAoYWxsLmxlbmd0aCAmJiB0eXBlb2YgYWxsW2FsbC5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykgPyBhbGwucG9wKCkgOiBudWxsXG5cbiAgaWYgKGFsbC5sZW5ndGggPCAyKSB0aHJvdyBuZXcgRXJyb3IoJ1BpcGVsaW5lIHJlcXVpcmVzIGF0IGxlYXN0IDIgc3RyZWFtcycpXG5cbiAgbGV0IHNyYyA9IGFsbFswXVxuICBsZXQgZGVzdCA9IG51bGxcbiAgbGV0IGVycm9yID0gbnVsbFxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgZGVzdCA9IGFsbFtpXVxuXG4gICAgaWYgKGlzU3RyZWFteChzcmMpKSB7XG4gICAgICBzcmMucGlwZShkZXN0LCBvbmVycm9yKVxuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvckhhbmRsZShzcmMsIHRydWUsIGkgPiAxLCBvbmVycm9yKVxuICAgICAgc3JjLnBpcGUoZGVzdClcbiAgICB9XG5cbiAgICBzcmMgPSBkZXN0XG4gIH1cblxuICBpZiAoZG9uZSkge1xuICAgIGxldCBmaW4gPSBmYWxzZVxuXG4gICAgY29uc3QgYXV0b0Rlc3Ryb3kgPSBpc1N0cmVhbXgoZGVzdCkgfHwgISEoZGVzdC5fd3JpdGFibGVTdGF0ZSAmJiBkZXN0Ll93cml0YWJsZVN0YXRlLmF1dG9EZXN0cm95KVxuXG4gICAgZGVzdC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgPT09IG51bGwpIGVycm9yID0gZXJyXG4gICAgfSlcblxuICAgIGRlc3Qub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgIGZpbiA9IHRydWVcbiAgICAgIGlmICghYXV0b0Rlc3Ryb3kpIGRvbmUoZXJyb3IpXG4gICAgfSlcblxuICAgIGlmIChhdXRvRGVzdHJveSkge1xuICAgICAgZGVzdC5vbignY2xvc2UnLCAoKSA9PiBkb25lKGVycm9yIHx8IChmaW4gPyBudWxsIDogUFJFTUFUVVJFX0NMT1NFKSkpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlc3RcblxuICBmdW5jdGlvbiBlcnJvckhhbmRsZSAocywgcmQsIHdyLCBvbmVycm9yKSB7XG4gICAgcy5vbignZXJyb3InLCBvbmVycm9yKVxuICAgIHMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgaWYgKHJkICYmIHMuX3JlYWRhYmxlU3RhdGUgJiYgIXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQpIHJldHVybiBvbmVycm9yKFBSRU1BVFVSRV9DTE9TRSlcbiAgICAgIGlmICh3ciAmJiBzLl93cml0YWJsZVN0YXRlICYmICFzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm4gb25lcnJvcihQUkVNQVRVUkVfQ0xPU0UpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lcnJvciAoZXJyKSB7XG4gICAgaWYgKCFlcnIgfHwgZXJyb3IpIHJldHVyblxuICAgIGVycm9yID0gZXJyXG5cbiAgICBmb3IgKGNvbnN0IHMgb2YgYWxsKSB7XG4gICAgICBzLmRlc3Ryb3koZXJyKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlY2hvIChzKSB7XG4gIHJldHVybiBzXG59XG5cbmZ1bmN0aW9uIGlzU3RyZWFtIChzdHJlYW0pIHtcbiAgcmV0dXJuICEhc3RyZWFtLl9yZWFkYWJsZVN0YXRlIHx8ICEhc3RyZWFtLl93cml0YWJsZVN0YXRlXG59XG5cbmZ1bmN0aW9uIGlzU3RyZWFteCAoc3RyZWFtKSB7XG4gIHJldHVybiB0eXBlb2Ygc3RyZWFtLl9kdXBsZXhTdGF0ZSA9PT0gJ251bWJlcicgJiYgaXNTdHJlYW0oc3RyZWFtKVxufVxuXG5mdW5jdGlvbiBnZXRTdHJlYW1FcnJvciAoc3RyZWFtLCBvcHRzID0ge30pIHtcbiAgY29uc3QgZXJyID0gKHN0cmVhbS5fcmVhZGFibGVTdGF0ZSAmJiBzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZXJyb3IpIHx8IChzdHJlYW0uX3dyaXRhYmxlU3RhdGUgJiYgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yKVxuXG4gIC8vIGF2b2lkIGltcGxpY2l0IGVycm9ycyBieSBkZWZhdWx0XG4gIHJldHVybiAoIW9wdHMuYWxsICYmIGVyciA9PT0gU1RSRUFNX0RFU1RST1lFRCkgPyBudWxsIDogZXJyXG59XG5cbmZ1bmN0aW9uIGlzUmVhZFN0cmVhbXggKHN0cmVhbSkge1xuICByZXR1cm4gaXNTdHJlYW14KHN0cmVhbSkgJiYgc3RyZWFtLnJlYWRhYmxlXG59XG5cbmZ1bmN0aW9uIGlzVHlwZWRBcnJheSAoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmIGRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGRhdGEuYnl0ZUxlbmd0aCA9PT0gJ251bWJlcidcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEJ5dGVMZW5ndGggKGRhdGEpIHtcbiAgcmV0dXJuIGlzVHlwZWRBcnJheShkYXRhKSA/IGRhdGEuYnl0ZUxlbmd0aCA6IDEwMjRcbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBhYm9ydCAoKSB7XG4gIHRoaXMuZGVzdHJveShuZXcgRXJyb3IoJ1N0cmVhbSBhYm9ydGVkLicpKVxufVxuXG5mdW5jdGlvbiBpc1dyaXRldiAocykge1xuICByZXR1cm4gcy5fd3JpdGV2ICE9PSBXcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiAmJiBzLl93cml0ZXYgIT09IER1cGxleC5wcm90b3R5cGUuX3dyaXRldlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGlwZWxpbmUsXG4gIHBpcGVsaW5lUHJvbWlzZSxcbiAgaXNTdHJlYW0sXG4gIGlzU3RyZWFteCxcbiAgZ2V0U3RyZWFtRXJyb3IsXG4gIFN0cmVhbSxcbiAgV3JpdGFibGUsXG4gIFJlYWRhYmxlLFxuICBEdXBsZXgsXG4gIFRyYW5zZm9ybSxcbiAgLy8gRXhwb3J0IFBhc3NUaHJvdWdoIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTm9kZS5qcyBjb3JlJ3Mgc3RyZWFtIG1vZHVsZVxuICBQYXNzVGhyb3VnaFxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3Qgc3RyaXBBbnNpID0gcmVxdWlyZSgnc3RyaXAtYW5zaScpO1xuY29uc3QgaXNGdWxsd2lkdGhDb2RlUG9pbnQgPSByZXF1aXJlKCdpcy1mdWxsd2lkdGgtY29kZS1wb2ludCcpO1xuY29uc3QgZW1vamlSZWdleCA9IHJlcXVpcmUoJ2Vtb2ppLXJlZ2V4Jyk7XG5cbmNvbnN0IHN0cmluZ1dpZHRoID0gc3RyaW5nID0+IHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnIHx8IHN0cmluZy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdHN0cmluZyA9IHN0cmlwQW5zaShzdHJpbmcpO1xuXG5cdGlmIChzdHJpbmcubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShlbW9qaVJlZ2V4KCksICcgICcpO1xuXG5cdGxldCB3aWR0aCA9IDA7XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBjb2RlID0gc3RyaW5nLmNvZGVQb2ludEF0KGkpO1xuXG5cdFx0Ly8gSWdub3JlIGNvbnRyb2wgY2hhcmFjdGVyc1xuXHRcdGlmIChjb2RlIDw9IDB4MUYgfHwgKGNvZGUgPj0gMHg3RiAmJiBjb2RlIDw9IDB4OUYpKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHQvLyBJZ25vcmUgY29tYmluaW5nIGNoYXJhY3RlcnNcblx0XHRpZiAoY29kZSA+PSAweDMwMCAmJiBjb2RlIDw9IDB4MzZGKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHQvLyBTdXJyb2dhdGVzXG5cdFx0aWYgKGNvZGUgPiAweEZGRkYpIHtcblx0XHRcdGkrKztcblx0XHR9XG5cblx0XHR3aWR0aCArPSBpc0Z1bGx3aWR0aENvZGVQb2ludChjb2RlKSA/IDIgOiAxO1xuXHR9XG5cblx0cmV0dXJuIHdpZHRoO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdXaWR0aDtcbi8vIFRPRE86IHJlbW92ZSB0aGlzIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBzdHJpbmdXaWR0aDtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IGFuc2lSZWdleCA9IHJlcXVpcmUoJ2Fuc2ktcmVnZXgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmcgPT4gdHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgPyBzdHJpbmcucmVwbGFjZShhbnNpUmVnZXgoKSwgJycpIDogc3RyaW5nO1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3Qgb3MgPSByZXF1aXJlKCdvcycpO1xuY29uc3QgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG5jb25zdCBoYXNGbGFnID0gcmVxdWlyZSgnaGFzLWZsYWcnKTtcblxuY29uc3Qge2Vudn0gPSBwcm9jZXNzO1xuXG5sZXQgZmxhZ0ZvcmNlQ29sb3I7XG5pZiAoaGFzRmxhZygnbm8tY29sb3InKSB8fFxuXHRoYXNGbGFnKCduby1jb2xvcnMnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1mYWxzZScpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPW5ldmVyJykpIHtcblx0ZmxhZ0ZvcmNlQ29sb3IgPSAwO1xufSBlbHNlIGlmIChoYXNGbGFnKCdjb2xvcicpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9ycycpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPXRydWUnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1hbHdheXMnKSkge1xuXHRmbGFnRm9yY2VDb2xvciA9IDE7XG59XG5cbmZ1bmN0aW9uIGVudkZvcmNlQ29sb3IoKSB7XG5cdGlmICgnRk9SQ0VfQ09MT1InIGluIGVudikge1xuXHRcdGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICd0cnVlJykge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXG5cdFx0aWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ2ZhbHNlJykge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudi5GT1JDRV9DT0xPUi5sZW5ndGggPT09IDAgPyAxIDogTWF0aC5taW4oTnVtYmVyLnBhcnNlSW50KGVudi5GT1JDRV9DT0xPUiwgMTApLCAzKTtcblx0fVxufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVMZXZlbChsZXZlbCkge1xuXHRpZiAobGV2ZWwgPT09IDApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGxldmVsLFxuXHRcdGhhc0Jhc2ljOiB0cnVlLFxuXHRcdGhhczI1NjogbGV2ZWwgPj0gMixcblx0XHRoYXMxNm06IGxldmVsID49IDNcblx0fTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNDb2xvcihoYXZlU3RyZWFtLCB7c3RyZWFtSXNUVFksIHNuaWZmRmxhZ3MgPSB0cnVlfSA9IHt9KSB7XG5cdGNvbnN0IG5vRmxhZ0ZvcmNlQ29sb3IgPSBlbnZGb3JjZUNvbG9yKCk7XG5cdGlmIChub0ZsYWdGb3JjZUNvbG9yICE9PSB1bmRlZmluZWQpIHtcblx0XHRmbGFnRm9yY2VDb2xvciA9IG5vRmxhZ0ZvcmNlQ29sb3I7XG5cdH1cblxuXHRjb25zdCBmb3JjZUNvbG9yID0gc25pZmZGbGFncyA/IGZsYWdGb3JjZUNvbG9yIDogbm9GbGFnRm9yY2VDb2xvcjtcblxuXHRpZiAoZm9yY2VDb2xvciA9PT0gMCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0aWYgKHNuaWZmRmxhZ3MpIHtcblx0XHRpZiAoaGFzRmxhZygnY29sb3I9MTZtJykgfHxcblx0XHRcdGhhc0ZsYWcoJ2NvbG9yPWZ1bGwnKSB8fFxuXHRcdFx0aGFzRmxhZygnY29sb3I9dHJ1ZWNvbG9yJykpIHtcblx0XHRcdHJldHVybiAzO1xuXHRcdH1cblxuXHRcdGlmIChoYXNGbGFnKCdjb2xvcj0yNTYnKSkge1xuXHRcdFx0cmV0dXJuIDI7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGhhdmVTdHJlYW0gJiYgIXN0cmVhbUlzVFRZICYmIGZvcmNlQ29sb3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y29uc3QgbWluID0gZm9yY2VDb2xvciB8fCAwO1xuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ2R1bWInKSB7XG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxMDU4NiBpcyB0aGUgZmlyc3QgV2luZG93cyByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMjU2IGNvbG9ycy5cblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDE0OTMxIGlzIHRoZSBmaXJzdCByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMTZtL1RydWVDb2xvci5cblx0XHRjb25zdCBvc1JlbGVhc2UgPSBvcy5yZWxlYXNlKCkuc3BsaXQoJy4nKTtcblx0XHRpZiAoXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzBdKSA+PSAxMCAmJlxuXHRcdFx0TnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTA1ODZcblx0XHQpIHtcblx0XHRcdHJldHVybiBOdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxNDkzMSA/IDMgOiAyO1xuXHRcdH1cblxuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDSScgaW4gZW52KSB7XG5cdFx0aWYgKFsnVFJBVklTJywgJ0NJUkNMRUNJJywgJ0FQUFZFWU9SJywgJ0dJVExBQl9DSScsICdHSVRIVUJfQUNUSU9OUycsICdCVUlMREtJVEUnLCAnRFJPTkUnXS5zb21lKHNpZ24gPT4gc2lnbiBpbiBlbnYpIHx8IGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKCdURUFNQ0lUWV9WRVJTSU9OJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gL14oOVxcLigwKlsxLTldXFxkKilcXC58XFxkezIsfVxcLikvLnRlc3QoZW52LlRFQU1DSVRZX1ZFUlNJT04pID8gMSA6IDA7XG5cdH1cblxuXHRpZiAoZW52LkNPTE9SVEVSTSA9PT0gJ3RydWVjb2xvcicpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmICgnVEVSTV9QUk9HUkFNJyBpbiBlbnYpIHtcblx0XHRjb25zdCB2ZXJzaW9uID0gTnVtYmVyLnBhcnNlSW50KChlbnYuVEVSTV9QUk9HUkFNX1ZFUlNJT04gfHwgJycpLnNwbGl0KCcuJylbMF0sIDEwKTtcblxuXHRcdHN3aXRjaCAoZW52LlRFUk1fUFJPR1JBTSkge1xuXHRcdFx0Y2FzZSAnaVRlcm0uYXBwJzpcblx0XHRcdFx0cmV0dXJuIHZlcnNpb24gPj0gMyA/IDMgOiAyO1xuXHRcdFx0Y2FzZSAnQXBwbGVfVGVybWluYWwnOlxuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdC8vIE5vIGRlZmF1bHRcblx0XHR9XG5cdH1cblxuXHRpZiAoLy0yNTYoY29sb3IpPyQvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cblx0aWYgKC9ec2NyZWVufF54dGVybXxednQxMDB8XnZ0MjIwfF5yeHZ0fGNvbG9yfGFuc2l8Y3lnd2lufGxpbnV4L2kudGVzdChlbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmICgnQ09MT1JURVJNJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdHJldHVybiBtaW47XG59XG5cbmZ1bmN0aW9uIGdldFN1cHBvcnRMZXZlbChzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBsZXZlbCA9IHN1cHBvcnRzQ29sb3Ioc3RyZWFtLCB7XG5cdFx0c3RyZWFtSXNUVFk6IHN0cmVhbSAmJiBzdHJlYW0uaXNUVFksXG5cdFx0Li4ub3B0aW9uc1xuXHR9KTtcblxuXHRyZXR1cm4gdHJhbnNsYXRlTGV2ZWwobGV2ZWwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0c3VwcG9ydHNDb2xvcjogZ2V0U3VwcG9ydExldmVsLFxuXHRzdGRvdXQ6IGdldFN1cHBvcnRMZXZlbCh7aXNUVFk6IHR0eS5pc2F0dHkoMSl9KSxcblx0c3RkZXJyOiBnZXRTdXBwb3J0TGV2ZWwoe2lzVFRZOiB0dHkuaXNhdHR5KDIpfSlcbn07XG4iLCJjb25zdCB0YXIgPSByZXF1aXJlKCd0YXItc3RyZWFtJylcbmNvbnN0IHB1bXAgPSByZXF1aXJlKCdwdW1wJylcbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuXG5jb25zdCB3aW4zMiA9IChnbG9iYWwuQmFyZT8ucGxhdGZvcm0gfHwgcHJvY2Vzcy5wbGF0Zm9ybSkgPT09ICd3aW4zMidcblxuZXhwb3J0cy5wYWNrID0gZnVuY3Rpb24gcGFjayAoY3dkLCBvcHRzKSB7XG4gIGlmICghY3dkKSBjd2QgPSAnLidcbiAgaWYgKCFvcHRzKSBvcHRzID0ge31cblxuICBjb25zdCB4ZnMgPSBvcHRzLmZzIHx8IGZzXG4gIGNvbnN0IGlnbm9yZSA9IG9wdHMuaWdub3JlIHx8IG9wdHMuZmlsdGVyIHx8IG5vb3BcbiAgY29uc3QgbWFwU3RyZWFtID0gb3B0cy5tYXBTdHJlYW0gfHwgZWNob1xuICBjb25zdCBzdGF0TmV4dCA9IHN0YXRBbGwoeGZzLCBvcHRzLmRlcmVmZXJlbmNlID8geGZzLnN0YXQgOiB4ZnMubHN0YXQsIGN3ZCwgaWdub3JlLCBvcHRzLmVudHJpZXMsIG9wdHMuc29ydClcbiAgY29uc3Qgc3RyaWN0ID0gb3B0cy5zdHJpY3QgIT09IGZhbHNlXG4gIGNvbnN0IHVtYXNrID0gdHlwZW9mIG9wdHMudW1hc2sgPT09ICdudW1iZXInID8gfm9wdHMudW1hc2sgOiB+cHJvY2Vzc1VtYXNrKClcbiAgY29uc3QgcGFjayA9IG9wdHMucGFjayB8fCB0YXIucGFjaygpXG4gIGNvbnN0IGZpbmlzaCA9IG9wdHMuZmluaXNoIHx8IG5vb3BcblxuICBsZXQgbWFwID0gb3B0cy5tYXAgfHwgbm9vcFxuICBsZXQgZG1vZGUgPSB0eXBlb2Ygb3B0cy5kbW9kZSA9PT0gJ251bWJlcicgPyBvcHRzLmRtb2RlIDogMFxuICBsZXQgZm1vZGUgPSB0eXBlb2Ygb3B0cy5mbW9kZSA9PT0gJ251bWJlcicgPyBvcHRzLmZtb2RlIDogMFxuXG4gIGlmIChvcHRzLnN0cmlwKSBtYXAgPSBzdHJpcChtYXAsIG9wdHMuc3RyaXApXG5cbiAgaWYgKG9wdHMucmVhZGFibGUpIHtcbiAgICBkbW9kZSB8PSBwYXJzZUludCg1NTUsIDgpXG4gICAgZm1vZGUgfD0gcGFyc2VJbnQoNDQ0LCA4KVxuICB9XG4gIGlmIChvcHRzLndyaXRhYmxlKSB7XG4gICAgZG1vZGUgfD0gcGFyc2VJbnQoMzMzLCA4KVxuICAgIGZtb2RlIHw9IHBhcnNlSW50KDIyMiwgOClcbiAgfVxuXG4gIG9ubmV4dGVudHJ5KClcblxuICBmdW5jdGlvbiBvbnN5bWxpbmsgKGZpbGVuYW1lLCBoZWFkZXIpIHtcbiAgICB4ZnMucmVhZGxpbmsocGF0aC5qb2luKGN3ZCwgZmlsZW5hbWUpLCBmdW5jdGlvbiAoZXJyLCBsaW5rbmFtZSkge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHBhY2suZGVzdHJveShlcnIpXG4gICAgICBoZWFkZXIubGlua25hbWUgPSBub3JtYWxpemUobGlua25hbWUpXG4gICAgICBwYWNrLmVudHJ5KGhlYWRlciwgb25uZXh0ZW50cnkpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uc3RhdCAoZXJyLCBmaWxlbmFtZSwgc3RhdCkge1xuICAgIGlmIChlcnIpIHJldHVybiBwYWNrLmRlc3Ryb3koZXJyKVxuICAgIGlmICghZmlsZW5hbWUpIHtcbiAgICAgIGlmIChvcHRzLmZpbmFsaXplICE9PSBmYWxzZSkgcGFjay5maW5hbGl6ZSgpXG4gICAgICByZXR1cm4gZmluaXNoKHBhY2spXG4gICAgfVxuXG4gICAgaWYgKHN0YXQuaXNTb2NrZXQoKSkgcmV0dXJuIG9ubmV4dGVudHJ5KCkgLy8gdGFyIGRvZXMgbm90IHN1cHBvcnQgc29ja2V0cy4uLlxuXG4gICAgbGV0IGhlYWRlciA9IHtcbiAgICAgIG5hbWU6IG5vcm1hbGl6ZShmaWxlbmFtZSksXG4gICAgICBtb2RlOiAoc3RhdC5tb2RlIHwgKHN0YXQuaXNEaXJlY3RvcnkoKSA/IGRtb2RlIDogZm1vZGUpKSAmIHVtYXNrLFxuICAgICAgbXRpbWU6IHN0YXQubXRpbWUsXG4gICAgICBzaXplOiBzdGF0LnNpemUsXG4gICAgICB0eXBlOiAnZmlsZScsXG4gICAgICB1aWQ6IHN0YXQudWlkLFxuICAgICAgZ2lkOiBzdGF0LmdpZFxuICAgIH1cblxuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGhlYWRlci5zaXplID0gMFxuICAgICAgaGVhZGVyLnR5cGUgPSAnZGlyZWN0b3J5J1xuICAgICAgaGVhZGVyID0gbWFwKGhlYWRlcikgfHwgaGVhZGVyXG4gICAgICByZXR1cm4gcGFjay5lbnRyeShoZWFkZXIsIG9ubmV4dGVudHJ5KVxuICAgIH1cblxuICAgIGlmIChzdGF0LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGhlYWRlci5zaXplID0gMFxuICAgICAgaGVhZGVyLnR5cGUgPSAnc3ltbGluaydcbiAgICAgIGhlYWRlciA9IG1hcChoZWFkZXIpIHx8IGhlYWRlclxuICAgICAgcmV0dXJuIG9uc3ltbGluayhmaWxlbmFtZSwgaGVhZGVyKVxuICAgIH1cblxuICAgIC8vIFRPRE86IGFkZCBmaWZvIGV0Yy4uLlxuXG4gICAgaGVhZGVyID0gbWFwKGhlYWRlcikgfHwgaGVhZGVyXG5cbiAgICBpZiAoIXN0YXQuaXNGaWxlKCkpIHtcbiAgICAgIGlmIChzdHJpY3QpIHJldHVybiBwYWNrLmRlc3Ryb3kobmV3IEVycm9yKCd1bnN1cHBvcnRlZCB0eXBlIGZvciAnICsgZmlsZW5hbWUpKVxuICAgICAgcmV0dXJuIG9ubmV4dGVudHJ5KClcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyeSA9IHBhY2suZW50cnkoaGVhZGVyLCBvbm5leHRlbnRyeSlcbiAgICBjb25zdCBycyA9IG1hcFN0cmVhbSh4ZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoLmpvaW4oY3dkLCBmaWxlbmFtZSksIHsgc3RhcnQ6IDAsIGVuZDogaGVhZGVyLnNpemUgPiAwID8gaGVhZGVyLnNpemUgLSAxIDogaGVhZGVyLnNpemUgfSksIGhlYWRlcilcblxuICAgIHJzLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHsgLy8gYWx3YXlzIGZvcndhcmQgZXJyb3JzIG9uIGRlc3Ryb3lcbiAgICAgIGVudHJ5LmRlc3Ryb3koZXJyKVxuICAgIH0pXG5cbiAgICBwdW1wKHJzLCBlbnRyeSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9ubmV4dGVudHJ5IChlcnIpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gcGFjay5kZXN0cm95KGVycilcbiAgICBzdGF0TmV4dChvbnN0YXQpXG4gIH1cblxuICByZXR1cm4gcGFja1xufVxuXG5mdW5jdGlvbiBoZWFkIChsaXN0KSB7XG4gIHJldHVybiBsaXN0Lmxlbmd0aCA/IGxpc3RbbGlzdC5sZW5ndGggLSAxXSA6IG51bGxcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0dldHVpZCAoKSB7XG4gIHJldHVybiBwcm9jZXNzLmdldHVpZCA/IHByb2Nlc3MuZ2V0dWlkKCkgOiAtMVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzVW1hc2sgKCkge1xuICByZXR1cm4gcHJvY2Vzcy51bWFzayA/IHByb2Nlc3MudW1hc2soKSA6IDBcbn1cblxuZXhwb3J0cy5leHRyYWN0ID0gZnVuY3Rpb24gZXh0cmFjdCAoY3dkLCBvcHRzKSB7XG4gIGlmICghY3dkKSBjd2QgPSAnLidcbiAgaWYgKCFvcHRzKSBvcHRzID0ge31cblxuICBjb25zdCB4ZnMgPSBvcHRzLmZzIHx8IGZzXG4gIGNvbnN0IGlnbm9yZSA9IG9wdHMuaWdub3JlIHx8IG9wdHMuZmlsdGVyIHx8IG5vb3BcbiAgY29uc3QgbWFwU3RyZWFtID0gb3B0cy5tYXBTdHJlYW0gfHwgZWNob1xuICBjb25zdCBvd24gPSBvcHRzLmNob3duICE9PSBmYWxzZSAmJiAhd2luMzIgJiYgcHJvY2Vzc0dldHVpZCgpID09PSAwXG4gIGNvbnN0IGV4dHJhY3QgPSBvcHRzLmV4dHJhY3QgfHwgdGFyLmV4dHJhY3QoKVxuICBjb25zdCBzdGFjayA9IFtdXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgdW1hc2sgPSB0eXBlb2Ygb3B0cy51bWFzayA9PT0gJ251bWJlcicgPyB+b3B0cy51bWFzayA6IH5wcm9jZXNzVW1hc2soKVxuICBjb25zdCBzdHJpY3QgPSBvcHRzLnN0cmljdCAhPT0gZmFsc2VcblxuICBsZXQgbWFwID0gb3B0cy5tYXAgfHwgbm9vcFxuICBsZXQgZG1vZGUgPSB0eXBlb2Ygb3B0cy5kbW9kZSA9PT0gJ251bWJlcicgPyBvcHRzLmRtb2RlIDogMFxuICBsZXQgZm1vZGUgPSB0eXBlb2Ygb3B0cy5mbW9kZSA9PT0gJ251bWJlcicgPyBvcHRzLmZtb2RlIDogMFxuXG4gIGlmIChvcHRzLnN0cmlwKSBtYXAgPSBzdHJpcChtYXAsIG9wdHMuc3RyaXApXG5cbiAgaWYgKG9wdHMucmVhZGFibGUpIHtcbiAgICBkbW9kZSB8PSBwYXJzZUludCg1NTUsIDgpXG4gICAgZm1vZGUgfD0gcGFyc2VJbnQoNDQ0LCA4KVxuICB9XG4gIGlmIChvcHRzLndyaXRhYmxlKSB7XG4gICAgZG1vZGUgfD0gcGFyc2VJbnQoMzMzLCA4KVxuICAgIGZtb2RlIHw9IHBhcnNlSW50KDIyMiwgOClcbiAgfVxuXG4gIGV4dHJhY3Qub24oJ2VudHJ5Jywgb25lbnRyeSlcblxuICBpZiAob3B0cy5maW5pc2gpIGV4dHJhY3Qub24oJ2ZpbmlzaCcsIG9wdHMuZmluaXNoKVxuXG4gIHJldHVybiBleHRyYWN0XG5cbiAgZnVuY3Rpb24gb25lbnRyeSAoaGVhZGVyLCBzdHJlYW0sIG5leHQpIHtcbiAgICBoZWFkZXIgPSBtYXAoaGVhZGVyKSB8fCBoZWFkZXJcbiAgICBoZWFkZXIubmFtZSA9IG5vcm1hbGl6ZShoZWFkZXIubmFtZSlcblxuICAgIGNvbnN0IG5hbWUgPSBwYXRoLmpvaW4oY3dkLCBwYXRoLmpvaW4oJy8nLCBoZWFkZXIubmFtZSkpXG5cbiAgICBpZiAoaWdub3JlKG5hbWUsIGhlYWRlcikpIHtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKVxuICAgICAgcmV0dXJuIG5leHQoKVxuICAgIH1cblxuICAgIGlmIChoZWFkZXIudHlwZSA9PT0gJ2RpcmVjdG9yeScpIHtcbiAgICAgIHN0YWNrLnB1c2goW25hbWUsIGhlYWRlci5tdGltZV0pXG4gICAgICByZXR1cm4gbWtkaXJmaXgobmFtZSwge1xuICAgICAgICBmczogeGZzLFxuICAgICAgICBvd24sXG4gICAgICAgIHVpZDogaGVhZGVyLnVpZCxcbiAgICAgICAgZ2lkOiBoZWFkZXIuZ2lkLFxuICAgICAgICBtb2RlOiBoZWFkZXIubW9kZVxuICAgICAgfSwgc3RhdClcbiAgICB9XG5cbiAgICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUobmFtZSlcblxuICAgIHZhbGlkYXRlKHhmcywgZGlyLCBwYXRoLmpvaW4oY3dkLCAnLicpLCBmdW5jdGlvbiAoZXJyLCB2YWxpZCkge1xuICAgICAgaWYgKGVycikgcmV0dXJuIG5leHQoZXJyKVxuICAgICAgaWYgKCF2YWxpZCkgcmV0dXJuIG5leHQobmV3IEVycm9yKGRpciArICcgaXMgbm90IGEgdmFsaWQgcGF0aCcpKVxuXG4gICAgICBta2RpcmZpeChkaXIsIHtcbiAgICAgICAgZnM6IHhmcyxcbiAgICAgICAgb3duLFxuICAgICAgICB1aWQ6IGhlYWRlci51aWQsXG4gICAgICAgIGdpZDogaGVhZGVyLmdpZCxcbiAgICAgICAgLy8gbm9ybWFsbHksIHRoZSBmb2xkZXJzIHdpdGggcmlnaHRzIGFuZCBvd25lciBzaG91bGQgYmUgcGFydCBvZiB0aGUgVEFSIGZpbGVcbiAgICAgICAgLy8gaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIGNyZWF0ZSBmb2xkZXIgZm9yIHNhbWUgdXNlciBhcyBmaWxlIGFuZCB3aXRoXG4gICAgICAgIC8vIHN0YW5kYXJkIHBlcm1pc3Npb25zIG9mIDBvNzU1IChyd3hyLXhyLXgpXG4gICAgICAgIG1vZGU6IDBvNzU1XG4gICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIpIHJldHVybiBuZXh0KGVycilcblxuICAgICAgICBzd2l0Y2ggKGhlYWRlci50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnZmlsZSc6IHJldHVybiBvbmZpbGUoKVxuICAgICAgICAgIGNhc2UgJ2xpbmsnOiByZXR1cm4gb25saW5rKClcbiAgICAgICAgICBjYXNlICdzeW1saW5rJzogcmV0dXJuIG9uc3ltbGluaygpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyaWN0KSByZXR1cm4gbmV4dChuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIHR5cGUgZm9yICcgKyBuYW1lICsgJyAoJyArIGhlYWRlci50eXBlICsgJyknKSlcblxuICAgICAgICBzdHJlYW0ucmVzdW1lKClcbiAgICAgICAgbmV4dCgpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBmdW5jdGlvbiBzdGF0IChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBuZXh0KGVycilcbiAgICAgIHV0aW1lcyhuYW1lLCBoZWFkZXIsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIG5leHQoZXJyKVxuICAgICAgICBpZiAod2luMzIpIHJldHVybiBuZXh0KClcbiAgICAgICAgY2hwZXJtKG5hbWUsIGhlYWRlciwgbmV4dClcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25zeW1saW5rICgpIHtcbiAgICAgIGlmICh3aW4zMikgcmV0dXJuIG5leHQoKSAvLyBza2lwIHN5bWxpbmtzIG9uIHdpbiBmb3Igbm93IGJlZm9yZSBpdCBjYW4gYmUgdGVzdGVkXG4gICAgICB4ZnMudW5saW5rKG5hbWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgeGZzLnN5bWxpbmsoaGVhZGVyLmxpbmtuYW1lLCBuYW1lLCBzdGF0KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmxpbmsgKCkge1xuICAgICAgaWYgKHdpbjMyKSByZXR1cm4gbmV4dCgpIC8vIHNraXAgbGlua3Mgb24gd2luIGZvciBub3cgYmVmb3JlIGl0IGNhbiBiZSB0ZXN0ZWRcbiAgICAgIHhmcy51bmxpbmsobmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzcmNwYXRoID0gcGF0aC5qb2luKGN3ZCwgcGF0aC5qb2luKCcvJywgaGVhZGVyLmxpbmtuYW1lKSlcblxuICAgICAgICB4ZnMubGluayhzcmNwYXRoLCBuYW1lLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ0VQRVJNJyAmJiBvcHRzLmhhcmRsaW5rQXNGaWxlc0ZhbGxiYWNrKSB7XG4gICAgICAgICAgICBzdHJlYW0gPSB4ZnMuY3JlYXRlUmVhZFN0cmVhbShzcmNwYXRoKVxuICAgICAgICAgICAgcmV0dXJuIG9uZmlsZSgpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3RhdChlcnIpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uZmlsZSAoKSB7XG4gICAgICBjb25zdCB3cyA9IHhmcy5jcmVhdGVXcml0ZVN0cmVhbShuYW1lKVxuICAgICAgY29uc3QgcnMgPSBtYXBTdHJlYW0oc3RyZWFtLCBoZWFkZXIpXG5cbiAgICAgIHdzLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHsgLy8gYWx3YXlzIGZvcndhcmQgZXJyb3JzIG9uIGRlc3Ryb3lcbiAgICAgICAgcnMuZGVzdHJveShlcnIpXG4gICAgICB9KVxuXG4gICAgICBwdW1wKHJzLCB3cywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG4gICAgICAgIHdzLm9uKCdjbG9zZScsIHN0YXQpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHV0aW1lc1BhcmVudCAobmFtZSwgY2IpIHsgLy8gd2UganVzdCBzZXQgdGhlIG10aW1lIG9uIHRoZSBwYXJlbnQgZGlyIGFnYWluIGV2ZXJ5dGltZSB3ZSB3cml0ZSBhbiBlbnRyeVxuICAgIGxldCB0b3BcbiAgICB3aGlsZSAoKHRvcCA9IGhlYWQoc3RhY2spKSAmJiBuYW1lLnNsaWNlKDAsIHRvcFswXS5sZW5ndGgpICE9PSB0b3BbMF0pIHN0YWNrLnBvcCgpXG4gICAgaWYgKCF0b3ApIHJldHVybiBjYigpXG4gICAgeGZzLnV0aW1lcyh0b3BbMF0sIG5vdywgdG9wWzFdLCBjYilcbiAgfVxuXG4gIGZ1bmN0aW9uIHV0aW1lcyAobmFtZSwgaGVhZGVyLCBjYikge1xuICAgIGlmIChvcHRzLnV0aW1lcyA9PT0gZmFsc2UpIHJldHVybiBjYigpXG5cbiAgICBpZiAoaGVhZGVyLnR5cGUgPT09ICdkaXJlY3RvcnknKSByZXR1cm4geGZzLnV0aW1lcyhuYW1lLCBub3csIGhlYWRlci5tdGltZSwgY2IpXG4gICAgaWYgKGhlYWRlci50eXBlID09PSAnc3ltbGluaycpIHJldHVybiB1dGltZXNQYXJlbnQobmFtZSwgY2IpIC8vIFRPRE86IGhvdyB0byBzZXQgbXRpbWUgb24gbGluaz9cblxuICAgIHhmcy51dGltZXMobmFtZSwgbm93LCBoZWFkZXIubXRpbWUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG4gICAgICB1dGltZXNQYXJlbnQobmFtZSwgY2IpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNocGVybSAobmFtZSwgaGVhZGVyLCBjYikge1xuICAgIGNvbnN0IGxpbmsgPSBoZWFkZXIudHlwZSA9PT0gJ3N5bWxpbmsnXG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuL25vLWRlcHJlY2F0ZWQtYXBpICovXG4gICAgY29uc3QgY2htb2QgPSBsaW5rID8geGZzLmxjaG1vZCA6IHhmcy5jaG1vZFxuICAgIGNvbnN0IGNob3duID0gbGluayA/IHhmcy5sY2hvd24gOiB4ZnMuY2hvd25cbiAgICAvKiBlc2xpbnQtZW5hYmxlIG4vbm8tZGVwcmVjYXRlZC1hcGkgKi9cblxuICAgIGlmICghY2htb2QpIHJldHVybiBjYigpXG5cbiAgICBjb25zdCBtb2RlID0gKGhlYWRlci5tb2RlIHwgKGhlYWRlci50eXBlID09PSAnZGlyZWN0b3J5JyA/IGRtb2RlIDogZm1vZGUpKSAmIHVtYXNrXG5cbiAgICBpZiAoY2hvd24gJiYgb3duKSBjaG93bi5jYWxsKHhmcywgbmFtZSwgaGVhZGVyLnVpZCwgaGVhZGVyLmdpZCwgb25jaG93bilcbiAgICBlbHNlIG9uY2hvd24obnVsbClcblxuICAgIGZ1bmN0aW9uIG9uY2hvd24gKGVycikge1xuICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgIGlmICghY2htb2QpIHJldHVybiBjYigpXG4gICAgICBjaG1vZC5jYWxsKHhmcywgbmFtZSwgbW9kZSwgY2IpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWtkaXJmaXggKG5hbWUsIG9wdHMsIGNiKSB7XG4gICAgLy8gd2hlbiBta2RpciBpcyBjYWxsZWQgb24gYW4gZXhpc3RpbmcgZGlyZWN0b3J5LCB0aGUgcGVybWlzc2lvbnNcbiAgICAvLyB3aWxsIGJlIG92ZXJ3cml0dGVuICg/KSwgdG8gYXZvaWQgdGhpcyB3ZSBjaGVjayBmb3IgaXRzIGV4aXN0YW5jZSBmaXJzdFxuICAgIHhmcy5zdGF0KG5hbWUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmICghZXJyKSByZXR1cm4gY2IobnVsbClcbiAgICAgIGlmIChlcnIuY29kZSAhPT0gJ0VOT0VOVCcpIHJldHVybiBjYihlcnIpXG4gICAgICB4ZnMubWtkaXIobmFtZSwgeyBtb2RlOiBvcHRzLm1vZGUsIHJlY3Vyc2l2ZTogdHJ1ZSB9LCBmdW5jdGlvbiAoZXJyLCBtYWRlKSB7XG4gICAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG4gICAgICAgIGNocGVybShuYW1lLCBvcHRzLCBjYilcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZSAoZnMsIG5hbWUsIHJvb3QsIGNiKSB7XG4gIGlmIChuYW1lID09PSByb290KSByZXR1cm4gY2IobnVsbCwgdHJ1ZSlcbiAgZnMubHN0YXQobmFtZSwgZnVuY3Rpb24gKGVyciwgc3QpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIHZhbGlkYXRlKGZzLCBwYXRoLmpvaW4obmFtZSwgJy4uJyksIHJvb3QsIGNiKVxuICAgIGVsc2UgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICBjYihudWxsLCBzdC5pc0RpcmVjdG9yeSgpKVxuICB9KVxufVxuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIGVjaG8gKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWVcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplIChuYW1lKSB7XG4gIHJldHVybiB3aW4zMiA/IG5hbWUucmVwbGFjZSgvXFxcXC9nLCAnLycpLnJlcGxhY2UoL1s6Pzw+fF0vZywgJ18nKSA6IG5hbWVcbn1cblxuZnVuY3Rpb24gc3RhdEFsbCAoZnMsIHN0YXQsIGN3ZCwgaWdub3JlLCBlbnRyaWVzLCBzb3J0KSB7XG4gIGlmICghZW50cmllcykgZW50cmllcyA9IFsnLiddXG4gIGNvbnN0IHF1ZXVlID0gZW50cmllcy5zbGljZSgwKVxuXG4gIHJldHVybiBmdW5jdGlvbiBsb29wIChjYWxsYmFjaykge1xuICAgIGlmICghcXVldWUubGVuZ3RoKSByZXR1cm4gY2FsbGJhY2sobnVsbClcblxuICAgIGNvbnN0IG5leHQgPSBxdWV1ZS5zaGlmdCgpXG4gICAgY29uc3QgbmV4dEFicyA9IHBhdGguam9pbihjd2QsIG5leHQpXG5cbiAgICBzdGF0LmNhbGwoZnMsIG5leHRBYnMsIGZ1bmN0aW9uIChlcnIsIHN0YXQpIHtcbiAgICAgIC8vIGlnbm9yZSBlcnJvcnMgaWYgdGhlIGZpbGVzIHdlcmUgZGVsZXRlZCB3aGlsZSBidWZmZXJpbmdcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlbnRyaWVzLmluZGV4T2YobmV4dCkgPT09IC0xICYmIGVyci5jb2RlID09PSAnRU5PRU5UJyA/IG51bGwgOiBlcnIpXG5cbiAgICAgIGlmICghc3RhdC5pc0RpcmVjdG9yeSgpKSByZXR1cm4gY2FsbGJhY2sobnVsbCwgbmV4dCwgc3RhdClcblxuICAgICAgZnMucmVhZGRpcihuZXh0QWJzLCBmdW5jdGlvbiAoZXJyLCBmaWxlcykge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKVxuXG4gICAgICAgIGlmIChzb3J0KSBmaWxlcy5zb3J0KClcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFpZ25vcmUocGF0aC5qb2luKGN3ZCwgbmV4dCwgZmlsZXNbaV0pKSkgcXVldWUucHVzaChwYXRoLmpvaW4obmV4dCwgZmlsZXNbaV0pKVxuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sobnVsbCwgbmV4dCwgc3RhdClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJpcCAobWFwLCBsZXZlbCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGhlYWRlcikge1xuICAgIGhlYWRlci5uYW1lID0gaGVhZGVyLm5hbWUuc3BsaXQoJy8nKS5zbGljZShsZXZlbCkuam9pbignLycpXG5cbiAgICBjb25zdCBsaW5rbmFtZSA9IGhlYWRlci5saW5rbmFtZVxuICAgIGlmIChsaW5rbmFtZSAmJiAoaGVhZGVyLnR5cGUgPT09ICdsaW5rJyB8fCBwYXRoLmlzQWJzb2x1dGUobGlua25hbWUpKSkge1xuICAgICAgaGVhZGVyLmxpbmtuYW1lID0gbGlua25hbWUuc3BsaXQoJy8nKS5zbGljZShsZXZlbCkuam9pbignLycpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcChoZWFkZXIpXG4gIH1cbn1cbiIsImNvbnN0IGNvbnN0YW50cyA9IHsgLy8ganVzdCBmb3IgZW52cyB3aXRob3V0IGZzXG4gIFNfSUZNVDogNjE0NDAsXG4gIFNfSUZESVI6IDE2Mzg0LFxuICBTX0lGQ0hSOiA4MTkyLFxuICBTX0lGQkxLOiAyNDU3NixcbiAgU19JRklGTzogNDA5NixcbiAgU19JRkxOSzogNDA5NjBcbn1cblxudHJ5IHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdmcycpLmNvbnN0YW50cyB8fCBjb25zdGFudHNcbn0gY2F0Y2gge1xuICBtb2R1bGUuZXhwb3J0cyA9IGNvbnN0YW50c1xufVxuIiwiY29uc3QgeyBXcml0YWJsZSwgUmVhZGFibGUsIGdldFN0cmVhbUVycm9yIH0gPSByZXF1aXJlKCdzdHJlYW14JylcbmNvbnN0IEZJRk8gPSByZXF1aXJlKCdmYXN0LWZpZm8nKVxuY29uc3QgYjRhID0gcmVxdWlyZSgnYjRhJylcbmNvbnN0IGhlYWRlcnMgPSByZXF1aXJlKCcuL2hlYWRlcnMnKVxuXG5jb25zdCBFTVBUWSA9IGI0YS5hbGxvYygwKVxuXG5jbGFzcyBCdWZmZXJMaXN0IHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMuYnVmZmVyZWQgPSAwXG4gICAgdGhpcy5zaGlmdGVkID0gMFxuICAgIHRoaXMucXVldWUgPSBuZXcgRklGTygpXG5cbiAgICB0aGlzLl9vZmZzZXQgPSAwXG4gIH1cblxuICBwdXNoIChidWZmZXIpIHtcbiAgICB0aGlzLmJ1ZmZlcmVkICs9IGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgdGhpcy5xdWV1ZS5wdXNoKGJ1ZmZlcilcbiAgfVxuXG4gIHNoaWZ0Rmlyc3QgKHNpemUpIHtcbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyZWQgPT09IDAgPyBudWxsIDogdGhpcy5fbmV4dChzaXplKVxuICB9XG5cbiAgc2hpZnQgKHNpemUpIHtcbiAgICBpZiAoc2l6ZSA+IHRoaXMuYnVmZmVyZWQpIHJldHVybiBudWxsXG4gICAgaWYgKHNpemUgPT09IDApIHJldHVybiBFTVBUWVxuXG4gICAgbGV0IGNodW5rID0gdGhpcy5fbmV4dChzaXplKVxuXG4gICAgaWYgKHNpemUgPT09IGNodW5rLmJ5dGVMZW5ndGgpIHJldHVybiBjaHVuayAvLyBsaWtlbHkgY2FzZVxuXG4gICAgY29uc3QgY2h1bmtzID0gW2NodW5rXVxuXG4gICAgd2hpbGUgKChzaXplIC09IGNodW5rLmJ5dGVMZW5ndGgpID4gMCkge1xuICAgICAgY2h1bmsgPSB0aGlzLl9uZXh0KHNpemUpXG4gICAgICBjaHVua3MucHVzaChjaHVuaylcbiAgICB9XG5cbiAgICByZXR1cm4gYjRhLmNvbmNhdChjaHVua3MpXG4gIH1cblxuICBfbmV4dCAoc2l6ZSkge1xuICAgIGNvbnN0IGJ1ZiA9IHRoaXMucXVldWUucGVlaygpXG4gICAgY29uc3QgcmVtID0gYnVmLmJ5dGVMZW5ndGggLSB0aGlzLl9vZmZzZXRcblxuICAgIGlmIChzaXplID49IHJlbSkge1xuICAgICAgY29uc3Qgc3ViID0gdGhpcy5fb2Zmc2V0ID8gYnVmLnN1YmFycmF5KHRoaXMuX29mZnNldCwgYnVmLmJ5dGVMZW5ndGgpIDogYnVmXG4gICAgICB0aGlzLnF1ZXVlLnNoaWZ0KClcbiAgICAgIHRoaXMuX29mZnNldCA9IDBcbiAgICAgIHRoaXMuYnVmZmVyZWQgLT0gcmVtXG4gICAgICB0aGlzLnNoaWZ0ZWQgKz0gcmVtXG4gICAgICByZXR1cm4gc3ViXG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXJlZCAtPSBzaXplXG4gICAgdGhpcy5zaGlmdGVkICs9IHNpemVcblxuICAgIHJldHVybiBidWYuc3ViYXJyYXkodGhpcy5fb2Zmc2V0LCAodGhpcy5fb2Zmc2V0ICs9IHNpemUpKVxuICB9XG59XG5cbmNsYXNzIFNvdXJjZSBleHRlbmRzIFJlYWRhYmxlIHtcbiAgY29uc3RydWN0b3IgKHNlbGYsIGhlYWRlciwgb2Zmc2V0KSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5oZWFkZXIgPSBoZWFkZXJcbiAgICB0aGlzLm9mZnNldCA9IG9mZnNldFxuXG4gICAgdGhpcy5fcGFyZW50ID0gc2VsZlxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgaWYgKHRoaXMuaGVhZGVyLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMucHVzaChudWxsKVxuICAgIH1cbiAgICBpZiAodGhpcy5fcGFyZW50Ll9zdHJlYW0gPT09IHRoaXMpIHtcbiAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlKClcbiAgICB9XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9wcmVkZXN0cm95ICgpIHtcbiAgICB0aGlzLl9wYXJlbnQuZGVzdHJveShnZXRTdHJlYW1FcnJvcih0aGlzKSlcbiAgfVxuXG4gIF9kZXRhY2ggKCkge1xuICAgIGlmICh0aGlzLl9wYXJlbnQuX3N0cmVhbSA9PT0gdGhpcykge1xuICAgICAgdGhpcy5fcGFyZW50Ll9zdHJlYW0gPSBudWxsXG4gICAgICB0aGlzLl9wYXJlbnQuX21pc3NpbmcgPSBvdmVyZmxvdyh0aGlzLmhlYWRlci5zaXplKVxuICAgICAgdGhpcy5fcGFyZW50Ll91cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95IChjYikge1xuICAgIHRoaXMuX2RldGFjaCgpXG4gICAgY2IobnVsbClcbiAgfVxufVxuXG5jbGFzcyBFeHRyYWN0IGV4dGVuZHMgV3JpdGFibGUge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuXG4gICAgdGhpcy5fYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKVxuICAgIHRoaXMuX29mZnNldCA9IDBcbiAgICB0aGlzLl9oZWFkZXIgPSBudWxsXG4gICAgdGhpcy5fc3RyZWFtID0gbnVsbFxuICAgIHRoaXMuX21pc3NpbmcgPSAwXG4gICAgdGhpcy5fbG9uZ0hlYWRlciA9IGZhbHNlXG4gICAgdGhpcy5fY2FsbGJhY2sgPSBub29wXG4gICAgdGhpcy5fbG9ja2VkID0gZmFsc2VcbiAgICB0aGlzLl9maW5pc2hlZCA9IGZhbHNlXG4gICAgdGhpcy5fcGF4ID0gbnVsbFxuICAgIHRoaXMuX3BheEdsb2JhbCA9IG51bGxcbiAgICB0aGlzLl9nbnVMb25nUGF0aCA9IG51bGxcbiAgICB0aGlzLl9nbnVMb25nTGlua1BhdGggPSBudWxsXG4gICAgdGhpcy5fZmlsZW5hbWVFbmNvZGluZyA9IG9wdHMuZmlsZW5hbWVFbmNvZGluZyB8fCAndXRmLTgnXG4gICAgdGhpcy5fYWxsb3dVbmtub3duRm9ybWF0ID0gISFvcHRzLmFsbG93VW5rbm93bkZvcm1hdFxuICAgIHRoaXMuX3VubG9ja0JvdW5kID0gdGhpcy5fdW5sb2NrLmJpbmQodGhpcylcbiAgfVxuXG4gIF91bmxvY2sgKGVycikge1xuICAgIHRoaXMuX2xvY2tlZCA9IGZhbHNlXG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aGlzLmRlc3Ryb3koZXJyKVxuICAgICAgdGhpcy5fY29udGludWVXcml0ZShlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGUoKVxuICB9XG5cbiAgX2NvbnN1bWVIZWFkZXIgKCkge1xuICAgIGlmICh0aGlzLl9sb2NrZWQpIHJldHVybiBmYWxzZVxuXG4gICAgdGhpcy5fb2Zmc2V0ID0gdGhpcy5fYnVmZmVyLnNoaWZ0ZWRcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9oZWFkZXIgPSBoZWFkZXJzLmRlY29kZSh0aGlzLl9idWZmZXIuc2hpZnQoNTEyKSwgdGhpcy5fZmlsZW5hbWVFbmNvZGluZywgdGhpcy5fYWxsb3dVbmtub3duRm9ybWF0KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fY29udGludWVXcml0ZShlcnIpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2hlYWRlcikgcmV0dXJuIHRydWVcblxuICAgIHN3aXRjaCAodGhpcy5faGVhZGVyLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2dudS1sb25nLXBhdGgnOlxuICAgICAgY2FzZSAnZ251LWxvbmctbGluay1wYXRoJzpcbiAgICAgIGNhc2UgJ3BheC1nbG9iYWwtaGVhZGVyJzpcbiAgICAgIGNhc2UgJ3BheC1oZWFkZXInOlxuICAgICAgICB0aGlzLl9sb25nSGVhZGVyID0gdHJ1ZVxuICAgICAgICB0aGlzLl9taXNzaW5nID0gdGhpcy5faGVhZGVyLnNpemVcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICB0aGlzLl9sb2NrZWQgPSB0cnVlXG4gICAgdGhpcy5fYXBwbHlMb25nSGVhZGVycygpXG5cbiAgICBpZiAodGhpcy5faGVhZGVyLnNpemUgPT09IDAgfHwgdGhpcy5faGVhZGVyLnR5cGUgPT09ICdkaXJlY3RvcnknKSB7XG4gICAgICB0aGlzLmVtaXQoJ2VudHJ5JywgdGhpcy5faGVhZGVyLCB0aGlzLl9jcmVhdGVTdHJlYW0oKSwgdGhpcy5fdW5sb2NrQm91bmQpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHRoaXMuX3N0cmVhbSA9IHRoaXMuX2NyZWF0ZVN0cmVhbSgpXG4gICAgdGhpcy5fbWlzc2luZyA9IHRoaXMuX2hlYWRlci5zaXplXG5cbiAgICB0aGlzLmVtaXQoJ2VudHJ5JywgdGhpcy5faGVhZGVyLCB0aGlzLl9zdHJlYW0sIHRoaXMuX3VubG9ja0JvdW5kKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBfYXBwbHlMb25nSGVhZGVycyAoKSB7XG4gICAgaWYgKHRoaXMuX2dudUxvbmdQYXRoKSB7XG4gICAgICB0aGlzLl9oZWFkZXIubmFtZSA9IHRoaXMuX2dudUxvbmdQYXRoXG4gICAgICB0aGlzLl9nbnVMb25nUGF0aCA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZ251TG9uZ0xpbmtQYXRoKSB7XG4gICAgICB0aGlzLl9oZWFkZXIubGlua25hbWUgPSB0aGlzLl9nbnVMb25nTGlua1BhdGhcbiAgICAgIHRoaXMuX2dudUxvbmdMaW5rUGF0aCA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGF4KSB7XG4gICAgICBpZiAodGhpcy5fcGF4LnBhdGgpIHRoaXMuX2hlYWRlci5uYW1lID0gdGhpcy5fcGF4LnBhdGhcbiAgICAgIGlmICh0aGlzLl9wYXgubGlua3BhdGgpIHRoaXMuX2hlYWRlci5saW5rbmFtZSA9IHRoaXMuX3BheC5saW5rcGF0aFxuICAgICAgaWYgKHRoaXMuX3BheC5zaXplKSB0aGlzLl9oZWFkZXIuc2l6ZSA9IHBhcnNlSW50KHRoaXMuX3BheC5zaXplLCAxMClcbiAgICAgIHRoaXMuX2hlYWRlci5wYXggPSB0aGlzLl9wYXhcbiAgICAgIHRoaXMuX3BheCA9IG51bGxcbiAgICB9XG4gIH1cblxuICBfZGVjb2RlTG9uZ0hlYWRlciAoYnVmKSB7XG4gICAgc3dpdGNoICh0aGlzLl9oZWFkZXIudHlwZSkge1xuICAgICAgY2FzZSAnZ251LWxvbmctcGF0aCc6XG4gICAgICAgIHRoaXMuX2dudUxvbmdQYXRoID0gaGVhZGVycy5kZWNvZGVMb25nUGF0aChidWYsIHRoaXMuX2ZpbGVuYW1lRW5jb2RpbmcpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdnbnUtbG9uZy1saW5rLXBhdGgnOlxuICAgICAgICB0aGlzLl9nbnVMb25nTGlua1BhdGggPSBoZWFkZXJzLmRlY29kZUxvbmdQYXRoKGJ1ZiwgdGhpcy5fZmlsZW5hbWVFbmNvZGluZylcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3BheC1nbG9iYWwtaGVhZGVyJzpcbiAgICAgICAgdGhpcy5fcGF4R2xvYmFsID0gaGVhZGVycy5kZWNvZGVQYXgoYnVmKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncGF4LWhlYWRlcic6XG4gICAgICAgIHRoaXMuX3BheCA9IHRoaXMuX3BheEdsb2JhbCA9PT0gbnVsbFxuICAgICAgICAgID8gaGVhZGVycy5kZWNvZGVQYXgoYnVmKVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcGF4R2xvYmFsLCBoZWFkZXJzLmRlY29kZVBheChidWYpKVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIF9jb25zdW1lTG9uZ0hlYWRlciAoKSB7XG4gICAgdGhpcy5fbG9uZ0hlYWRlciA9IGZhbHNlXG4gICAgdGhpcy5fbWlzc2luZyA9IG92ZXJmbG93KHRoaXMuX2hlYWRlci5zaXplKVxuXG4gICAgY29uc3QgYnVmID0gdGhpcy5fYnVmZmVyLnNoaWZ0KHRoaXMuX2hlYWRlci5zaXplKVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2RlY29kZUxvbmdIZWFkZXIoYnVmKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fY29udGludWVXcml0ZShlcnIpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX2NvbnN1bWVTdHJlYW0gKCkge1xuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuX2J1ZmZlci5zaGlmdEZpcnN0KHRoaXMuX21pc3NpbmcpXG4gICAgaWYgKGJ1ZiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlXG5cbiAgICB0aGlzLl9taXNzaW5nIC09IGJ1Zi5ieXRlTGVuZ3RoXG4gICAgY29uc3QgZHJhaW5lZCA9IHRoaXMuX3N0cmVhbS5wdXNoKGJ1ZilcblxuICAgIGlmICh0aGlzLl9taXNzaW5nID09PSAwKSB7XG4gICAgICB0aGlzLl9zdHJlYW0ucHVzaChudWxsKVxuICAgICAgaWYgKGRyYWluZWQpIHRoaXMuX3N0cmVhbS5fZGV0YWNoKClcbiAgICAgIHJldHVybiBkcmFpbmVkICYmIHRoaXMuX2xvY2tlZCA9PT0gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gZHJhaW5lZFxuICB9XG5cbiAgX2NyZWF0ZVN0cmVhbSAoKSB7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2UodGhpcywgdGhpcy5faGVhZGVyLCB0aGlzLl9vZmZzZXQpXG4gIH1cblxuICBfdXBkYXRlICgpIHtcbiAgICB3aGlsZSAodGhpcy5fYnVmZmVyLmJ1ZmZlcmVkID4gMCAmJiAhdGhpcy5kZXN0cm95aW5nKSB7XG4gICAgICBpZiAodGhpcy5fbWlzc2luZyA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0cmVhbSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0aGlzLl9jb25zdW1lU3RyZWFtKCkgPT09IGZhbHNlKSByZXR1cm5cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2xvbmdIZWFkZXIgPT09IHRydWUpIHtcbiAgICAgICAgICBpZiAodGhpcy5fbWlzc2luZyA+IHRoaXMuX2J1ZmZlci5idWZmZXJlZCkgYnJlYWtcbiAgICAgICAgICBpZiAodGhpcy5fY29uc3VtZUxvbmdIZWFkZXIoKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZ25vcmUgPSB0aGlzLl9idWZmZXIuc2hpZnRGaXJzdCh0aGlzLl9taXNzaW5nKVxuICAgICAgICBpZiAoaWdub3JlICE9PSBudWxsKSB0aGlzLl9taXNzaW5nIC09IGlnbm9yZS5ieXRlTGVuZ3RoXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9idWZmZXIuYnVmZmVyZWQgPCA1MTIpIGJyZWFrXG4gICAgICBpZiAodGhpcy5fc3RyZWFtICE9PSBudWxsIHx8IHRoaXMuX2NvbnN1bWVIZWFkZXIoKSA9PT0gZmFsc2UpIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NvbnRpbnVlV3JpdGUobnVsbClcbiAgfVxuXG4gIF9jb250aW51ZVdyaXRlIChlcnIpIHtcbiAgICBjb25zdCBjYiA9IHRoaXMuX2NhbGxiYWNrXG4gICAgdGhpcy5fY2FsbGJhY2sgPSBub29wXG4gICAgY2IoZXJyKVxuICB9XG5cbiAgX3dyaXRlIChkYXRhLCBjYikge1xuICAgIHRoaXMuX2NhbGxiYWNrID0gY2JcbiAgICB0aGlzLl9idWZmZXIucHVzaChkYXRhKVxuICAgIHRoaXMuX3VwZGF0ZSgpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgdGhpcy5fZmluaXNoZWQgPSB0aGlzLl9taXNzaW5nID09PSAwICYmIHRoaXMuX2J1ZmZlci5idWZmZXJlZCA9PT0gMFxuICAgIGNiKHRoaXMuX2ZpbmlzaGVkID8gbnVsbCA6IG5ldyBFcnJvcignVW5leHBlY3RlZCBlbmQgb2YgZGF0YScpKVxuICB9XG5cbiAgX3ByZWRlc3Ryb3kgKCkge1xuICAgIHRoaXMuX2NvbnRpbnVlV3JpdGUobnVsbClcbiAgfVxuXG4gIF9kZXN0cm95IChjYikge1xuICAgIGlmICh0aGlzLl9zdHJlYW0pIHRoaXMuX3N0cmVhbS5kZXN0cm95KGdldFN0cmVhbUVycm9yKHRoaXMpKVxuICAgIGNiKG51bGwpXG4gIH1cblxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdICgpIHtcbiAgICBsZXQgZXJyb3IgPSBudWxsXG5cbiAgICBsZXQgcHJvbWlzZVJlc29sdmUgPSBudWxsXG4gICAgbGV0IHByb21pc2VSZWplY3QgPSBudWxsXG5cbiAgICBsZXQgZW50cnlTdHJlYW0gPSBudWxsXG4gICAgbGV0IGVudHJ5Q2FsbGJhY2sgPSBudWxsXG5cbiAgICBjb25zdCBleHRyYWN0ID0gdGhpc1xuXG4gICAgdGhpcy5vbignZW50cnknLCBvbmVudHJ5KVxuICAgIHRoaXMub24oJ2Vycm9yJywgKGVycikgPT4geyBlcnJvciA9IGVyciB9KVxuICAgIHRoaXMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIHJldHVybiB7XG4gICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgIH0sXG4gICAgICBuZXh0ICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKG9ubmV4dClcbiAgICAgIH0sXG4gICAgICByZXR1cm4gKCkge1xuICAgICAgICByZXR1cm4gZGVzdHJveShudWxsKVxuICAgICAgfSxcbiAgICAgIHRocm93IChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGRlc3Ryb3koZXJyKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbnN1bWVDYWxsYmFjayAoZXJyKSB7XG4gICAgICBpZiAoIWVudHJ5Q2FsbGJhY2spIHJldHVyblxuICAgICAgY29uc3QgY2IgPSBlbnRyeUNhbGxiYWNrXG4gICAgICBlbnRyeUNhbGxiYWNrID0gbnVsbFxuICAgICAgY2IoZXJyKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9ubmV4dCAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgaWYgKGVudHJ5U3RyZWFtKSB7XG4gICAgICAgIHJlc29sdmUoeyB2YWx1ZTogZW50cnlTdHJlYW0sIGRvbmU6IGZhbHNlIH0pXG4gICAgICAgIGVudHJ5U3RyZWFtID0gbnVsbFxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcHJvbWlzZVJlc29sdmUgPSByZXNvbHZlXG4gICAgICBwcm9taXNlUmVqZWN0ID0gcmVqZWN0XG5cbiAgICAgIGNvbnN1bWVDYWxsYmFjayhudWxsKVxuXG4gICAgICBpZiAoZXh0cmFjdC5fZmluaXNoZWQgJiYgcHJvbWlzZVJlc29sdmUpIHtcbiAgICAgICAgcHJvbWlzZVJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pXG4gICAgICAgIHByb21pc2VSZXNvbHZlID0gcHJvbWlzZVJlamVjdCA9IG51bGxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmVudHJ5IChoZWFkZXIsIHN0cmVhbSwgY2FsbGJhY2spIHtcbiAgICAgIGVudHJ5Q2FsbGJhY2sgPSBjYWxsYmFja1xuICAgICAgc3RyZWFtLm9uKCdlcnJvcicsIG5vb3ApIC8vIG5vIHdheSBhcm91bmQgdGhpcyBkdWUgdG8gdGljayBzaWxseW5lc3NcblxuICAgICAgaWYgKHByb21pc2VSZXNvbHZlKSB7XG4gICAgICAgIHByb21pc2VSZXNvbHZlKHsgdmFsdWU6IHN0cmVhbSwgZG9uZTogZmFsc2UgfSlcbiAgICAgICAgcHJvbWlzZVJlc29sdmUgPSBwcm9taXNlUmVqZWN0ID0gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnlTdHJlYW0gPSBzdHJlYW1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmNsb3NlICgpIHtcbiAgICAgIGNvbnN1bWVDYWxsYmFjayhlcnJvcilcbiAgICAgIGlmICghcHJvbWlzZVJlc29sdmUpIHJldHVyblxuICAgICAgaWYgKGVycm9yKSBwcm9taXNlUmVqZWN0KGVycm9yKVxuICAgICAgZWxzZSBwcm9taXNlUmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgIHByb21pc2VSZXNvbHZlID0gcHJvbWlzZVJlamVjdCA9IG51bGxcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95IChlcnIpIHtcbiAgICAgIGV4dHJhY3QuZGVzdHJveShlcnIpXG4gICAgICBjb25zdW1lQ2FsbGJhY2soZXJyKVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKGV4dHJhY3QuZGVzdHJveWVkKSByZXR1cm4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgZXh0cmFjdC5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoZXJyKSByZWplY3QoZXJyKVxuICAgICAgICAgIGVsc2UgcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXh0cmFjdCAob3B0cykge1xuICByZXR1cm4gbmV3IEV4dHJhY3Qob3B0cylcbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBvdmVyZmxvdyAoc2l6ZSkge1xuICBzaXplICY9IDUxMVxuICByZXR1cm4gc2l6ZSAmJiA1MTIgLSBzaXplXG59XG4iLCJjb25zdCBiNGEgPSByZXF1aXJlKCdiNGEnKVxuXG5jb25zdCBaRVJPUyA9ICcwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuY29uc3QgU0VWRU5TID0gJzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcnXG5jb25zdCBaRVJPX09GRlNFVCA9ICcwJy5jaGFyQ29kZUF0KDApXG5jb25zdCBVU1RBUl9NQUdJQyA9IGI0YS5mcm9tKFsweDc1LCAweDczLCAweDc0LCAweDYxLCAweDcyLCAweDAwXSkgLy8gdXN0YXJcXHgwMFxuY29uc3QgVVNUQVJfVkVSID0gYjRhLmZyb20oW1pFUk9fT0ZGU0VULCBaRVJPX09GRlNFVF0pXG5jb25zdCBHTlVfTUFHSUMgPSBiNGEuZnJvbShbMHg3NSwgMHg3MywgMHg3NCwgMHg2MSwgMHg3MiwgMHgyMF0pIC8vIHVzdGFyXFx4MjBcbmNvbnN0IEdOVV9WRVIgPSBiNGEuZnJvbShbMHgyMCwgMHgwMF0pXG5jb25zdCBNQVNLID0gMG83Nzc3XG5jb25zdCBNQUdJQ19PRkZTRVQgPSAyNTdcbmNvbnN0IFZFUlNJT05fT0ZGU0VUID0gMjYzXG5cbmV4cG9ydHMuZGVjb2RlTG9uZ1BhdGggPSBmdW5jdGlvbiBkZWNvZGVMb25nUGF0aCAoYnVmLCBlbmNvZGluZykge1xuICByZXR1cm4gZGVjb2RlU3RyKGJ1ZiwgMCwgYnVmLmxlbmd0aCwgZW5jb2RpbmcpXG59XG5cbmV4cG9ydHMuZW5jb2RlUGF4ID0gZnVuY3Rpb24gZW5jb2RlUGF4IChvcHRzKSB7IC8vIFRPRE86IGVuY29kZSBtb3JlIHN0dWZmIGluIHBheFxuICBsZXQgcmVzdWx0ID0gJydcbiAgaWYgKG9wdHMubmFtZSkgcmVzdWx0ICs9IGFkZExlbmd0aCgnIHBhdGg9JyArIG9wdHMubmFtZSArICdcXG4nKVxuICBpZiAob3B0cy5saW5rbmFtZSkgcmVzdWx0ICs9IGFkZExlbmd0aCgnIGxpbmtwYXRoPScgKyBvcHRzLmxpbmtuYW1lICsgJ1xcbicpXG4gIGNvbnN0IHBheCA9IG9wdHMucGF4XG4gIGlmIChwYXgpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBwYXgpIHtcbiAgICAgIHJlc3VsdCArPSBhZGRMZW5ndGgoJyAnICsga2V5ICsgJz0nICsgcGF4W2tleV0gKyAnXFxuJylcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGI0YS5mcm9tKHJlc3VsdClcbn1cblxuZXhwb3J0cy5kZWNvZGVQYXggPSBmdW5jdGlvbiBkZWNvZGVQYXggKGJ1Zikge1xuICBjb25zdCByZXN1bHQgPSB7fVxuXG4gIHdoaWxlIChidWYubGVuZ3RoKSB7XG4gICAgbGV0IGkgPSAwXG4gICAgd2hpbGUgKGkgPCBidWYubGVuZ3RoICYmIGJ1ZltpXSAhPT0gMzIpIGkrK1xuICAgIGNvbnN0IGxlbiA9IHBhcnNlSW50KGI0YS50b1N0cmluZyhidWYuc3ViYXJyYXkoMCwgaSkpLCAxMClcbiAgICBpZiAoIWxlbikgcmV0dXJuIHJlc3VsdFxuXG4gICAgY29uc3QgYiA9IGI0YS50b1N0cmluZyhidWYuc3ViYXJyYXkoaSArIDEsIGxlbiAtIDEpKVxuICAgIGNvbnN0IGtleUluZGV4ID0gYi5pbmRleE9mKCc9JylcbiAgICBpZiAoa2V5SW5kZXggPT09IC0xKSByZXR1cm4gcmVzdWx0XG4gICAgcmVzdWx0W2Iuc2xpY2UoMCwga2V5SW5kZXgpXSA9IGIuc2xpY2Uoa2V5SW5kZXggKyAxKVxuXG4gICAgYnVmID0gYnVmLnN1YmFycmF5KGxlbilcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUgKG9wdHMpIHtcbiAgY29uc3QgYnVmID0gYjRhLmFsbG9jKDUxMilcbiAgbGV0IG5hbWUgPSBvcHRzLm5hbWVcbiAgbGV0IHByZWZpeCA9ICcnXG5cbiAgaWYgKG9wdHMudHlwZWZsYWcgPT09IDUgJiYgbmFtZVtuYW1lLmxlbmd0aCAtIDFdICE9PSAnLycpIG5hbWUgKz0gJy8nXG4gIGlmIChiNGEuYnl0ZUxlbmd0aChuYW1lKSAhPT0gbmFtZS5sZW5ndGgpIHJldHVybiBudWxsIC8vIHV0Zi04XG5cbiAgd2hpbGUgKGI0YS5ieXRlTGVuZ3RoKG5hbWUpID4gMTAwKSB7XG4gICAgY29uc3QgaSA9IG5hbWUuaW5kZXhPZignLycpXG4gICAgaWYgKGkgPT09IC0xKSByZXR1cm4gbnVsbFxuICAgIHByZWZpeCArPSBwcmVmaXggPyAnLycgKyBuYW1lLnNsaWNlKDAsIGkpIDogbmFtZS5zbGljZSgwLCBpKVxuICAgIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKVxuICB9XG5cbiAgaWYgKGI0YS5ieXRlTGVuZ3RoKG5hbWUpID4gMTAwIHx8IGI0YS5ieXRlTGVuZ3RoKHByZWZpeCkgPiAxNTUpIHJldHVybiBudWxsXG4gIGlmIChvcHRzLmxpbmtuYW1lICYmIGI0YS5ieXRlTGVuZ3RoKG9wdHMubGlua25hbWUpID4gMTAwKSByZXR1cm4gbnVsbFxuXG4gIGI0YS53cml0ZShidWYsIG5hbWUpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChvcHRzLm1vZGUgJiBNQVNLLCA2KSwgMTAwKVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy51aWQsIDYpLCAxMDgpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChvcHRzLmdpZCwgNiksIDExNilcbiAgZW5jb2RlU2l6ZShvcHRzLnNpemUsIGJ1ZiwgMTI0KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3QoKG9wdHMubXRpbWUuZ2V0VGltZSgpIC8gMTAwMCkgfCAwLCAxMSksIDEzNilcblxuICBidWZbMTU2XSA9IFpFUk9fT0ZGU0VUICsgdG9UeXBlZmxhZyhvcHRzLnR5cGUpXG5cbiAgaWYgKG9wdHMubGlua25hbWUpIGI0YS53cml0ZShidWYsIG9wdHMubGlua25hbWUsIDE1NylcblxuICBiNGEuY29weShVU1RBUl9NQUdJQywgYnVmLCBNQUdJQ19PRkZTRVQpXG4gIGI0YS5jb3B5KFVTVEFSX1ZFUiwgYnVmLCBWRVJTSU9OX09GRlNFVClcbiAgaWYgKG9wdHMudW5hbWUpIGI0YS53cml0ZShidWYsIG9wdHMudW5hbWUsIDI2NSlcbiAgaWYgKG9wdHMuZ25hbWUpIGI0YS53cml0ZShidWYsIG9wdHMuZ25hbWUsIDI5NylcbiAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG9wdHMuZGV2bWFqb3IgfHwgMCwgNiksIDMyOSlcbiAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG9wdHMuZGV2bWlub3IgfHwgMCwgNiksIDMzNylcblxuICBpZiAocHJlZml4KSBiNGEud3JpdGUoYnVmLCBwcmVmaXgsIDM0NSlcblxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3QoY2tzdW0oYnVmKSwgNiksIDE0OClcblxuICByZXR1cm4gYnVmXG59XG5cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlIChidWYsIGZpbGVuYW1lRW5jb2RpbmcsIGFsbG93VW5rbm93bkZvcm1hdCkge1xuICBsZXQgdHlwZWZsYWcgPSBidWZbMTU2XSA9PT0gMCA/IDAgOiBidWZbMTU2XSAtIFpFUk9fT0ZGU0VUXG5cbiAgbGV0IG5hbWUgPSBkZWNvZGVTdHIoYnVmLCAwLCAxMDAsIGZpbGVuYW1lRW5jb2RpbmcpXG4gIGNvbnN0IG1vZGUgPSBkZWNvZGVPY3QoYnVmLCAxMDAsIDgpXG4gIGNvbnN0IHVpZCA9IGRlY29kZU9jdChidWYsIDEwOCwgOClcbiAgY29uc3QgZ2lkID0gZGVjb2RlT2N0KGJ1ZiwgMTE2LCA4KVxuICBjb25zdCBzaXplID0gZGVjb2RlT2N0KGJ1ZiwgMTI0LCAxMilcbiAgY29uc3QgbXRpbWUgPSBkZWNvZGVPY3QoYnVmLCAxMzYsIDEyKVxuICBjb25zdCB0eXBlID0gdG9UeXBlKHR5cGVmbGFnKVxuICBjb25zdCBsaW5rbmFtZSA9IGJ1ZlsxNTddID09PSAwID8gbnVsbCA6IGRlY29kZVN0cihidWYsIDE1NywgMTAwLCBmaWxlbmFtZUVuY29kaW5nKVxuICBjb25zdCB1bmFtZSA9IGRlY29kZVN0cihidWYsIDI2NSwgMzIpXG4gIGNvbnN0IGduYW1lID0gZGVjb2RlU3RyKGJ1ZiwgMjk3LCAzMilcbiAgY29uc3QgZGV2bWFqb3IgPSBkZWNvZGVPY3QoYnVmLCAzMjksIDgpXG4gIGNvbnN0IGRldm1pbm9yID0gZGVjb2RlT2N0KGJ1ZiwgMzM3LCA4KVxuXG4gIGNvbnN0IGMgPSBja3N1bShidWYpXG5cbiAgLy8gY2hlY2tzdW0gaXMgc3RpbGwgaW5pdGlhbCB2YWx1ZSBpZiBoZWFkZXIgd2FzIG51bGwuXG4gIGlmIChjID09PSA4ICogMzIpIHJldHVybiBudWxsXG5cbiAgLy8gdmFsaWQgY2hlY2tzdW1cbiAgaWYgKGMgIT09IGRlY29kZU9jdChidWYsIDE0OCwgOCkpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0YXIgaGVhZGVyLiBNYXliZSB0aGUgdGFyIGlzIGNvcnJ1cHRlZCBvciBpdCBuZWVkcyB0byBiZSBndW56aXBwZWQ/JylcblxuICBpZiAoaXNVU1RBUihidWYpKSB7XG4gICAgLy8gdXN0YXIgKHBvc2l4KSBmb3JtYXQuXG4gICAgLy8gcHJlcGVuZCBwcmVmaXgsIGlmIHByZXNlbnQuXG4gICAgaWYgKGJ1ZlszNDVdKSBuYW1lID0gZGVjb2RlU3RyKGJ1ZiwgMzQ1LCAxNTUsIGZpbGVuYW1lRW5jb2RpbmcpICsgJy8nICsgbmFtZVxuICB9IGVsc2UgaWYgKGlzR05VKGJ1ZikpIHtcbiAgICAvLyAnZ251Jy8nb2xkZ251JyBmb3JtYXQuIFNpbWlsYXIgdG8gdXN0YXIsIGJ1dCBoYXMgc3VwcG9ydCBmb3IgaW5jcmVtZW50YWwgYW5kXG4gICAgLy8gbXVsdGktdm9sdW1lIHRhcmJhbGxzLlxuICB9IGVsc2Uge1xuICAgIGlmICghYWxsb3dVbmtub3duRm9ybWF0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGFyIGhlYWRlcjogdW5rbm93biBmb3JtYXQuJylcbiAgICB9XG4gIH1cblxuICAvLyB0byBzdXBwb3J0IG9sZCB0YXIgdmVyc2lvbnMgdGhhdCB1c2UgdHJhaWxpbmcgLyB0byBpbmRpY2F0ZSBkaXJzXG4gIGlmICh0eXBlZmxhZyA9PT0gMCAmJiBuYW1lICYmIG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJy8nKSB0eXBlZmxhZyA9IDVcblxuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgbW9kZSxcbiAgICB1aWQsXG4gICAgZ2lkLFxuICAgIHNpemUsXG4gICAgbXRpbWU6IG5ldyBEYXRlKDEwMDAgKiBtdGltZSksXG4gICAgdHlwZSxcbiAgICBsaW5rbmFtZSxcbiAgICB1bmFtZSxcbiAgICBnbmFtZSxcbiAgICBkZXZtYWpvcixcbiAgICBkZXZtaW5vcixcbiAgICBwYXg6IG51bGxcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1VTVEFSIChidWYpIHtcbiAgcmV0dXJuIGI0YS5lcXVhbHMoVVNUQVJfTUFHSUMsIGJ1Zi5zdWJhcnJheShNQUdJQ19PRkZTRVQsIE1BR0lDX09GRlNFVCArIDYpKVxufVxuXG5mdW5jdGlvbiBpc0dOVSAoYnVmKSB7XG4gIHJldHVybiBiNGEuZXF1YWxzKEdOVV9NQUdJQywgYnVmLnN1YmFycmF5KE1BR0lDX09GRlNFVCwgTUFHSUNfT0ZGU0VUICsgNikpICYmXG4gICAgYjRhLmVxdWFscyhHTlVfVkVSLCBidWYuc3ViYXJyYXkoVkVSU0lPTl9PRkZTRVQsIFZFUlNJT05fT0ZGU0VUICsgMikpXG59XG5cbmZ1bmN0aW9uIGNsYW1wIChpbmRleCwgbGVuLCBkZWZhdWx0VmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicpIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgaW5kZXggPSB+fmluZGV4IC8vIENvZXJjZSB0byBpbnRlZ2VyLlxuICBpZiAoaW5kZXggPj0gbGVuKSByZXR1cm4gbGVuXG4gIGlmIChpbmRleCA+PSAwKSByZXR1cm4gaW5kZXhcbiAgaW5kZXggKz0gbGVuXG4gIGlmIChpbmRleCA+PSAwKSByZXR1cm4gaW5kZXhcbiAgcmV0dXJuIDBcbn1cblxuZnVuY3Rpb24gdG9UeXBlIChmbGFnKSB7XG4gIHN3aXRjaCAoZmxhZykge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiAnZmlsZSdcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gJ2xpbmsnXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuICdzeW1saW5rJ1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiAnY2hhcmFjdGVyLWRldmljZSdcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gJ2Jsb2NrLWRldmljZSdcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gJ2RpcmVjdG9yeSdcbiAgICBjYXNlIDY6XG4gICAgICByZXR1cm4gJ2ZpZm8nXG4gICAgY2FzZSA3OlxuICAgICAgcmV0dXJuICdjb250aWd1b3VzLWZpbGUnXG4gICAgY2FzZSA3MjpcbiAgICAgIHJldHVybiAncGF4LWhlYWRlcidcbiAgICBjYXNlIDU1OlxuICAgICAgcmV0dXJuICdwYXgtZ2xvYmFsLWhlYWRlcidcbiAgICBjYXNlIDI3OlxuICAgICAgcmV0dXJuICdnbnUtbG9uZy1saW5rLXBhdGgnXG4gICAgY2FzZSAyODpcbiAgICBjYXNlIDMwOlxuICAgICAgcmV0dXJuICdnbnUtbG9uZy1wYXRoJ1xuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gdG9UeXBlZmxhZyAoZmxhZykge1xuICBzd2l0Y2ggKGZsYWcpIHtcbiAgICBjYXNlICdmaWxlJzpcbiAgICAgIHJldHVybiAwXG4gICAgY2FzZSAnbGluayc6XG4gICAgICByZXR1cm4gMVxuICAgIGNhc2UgJ3N5bWxpbmsnOlxuICAgICAgcmV0dXJuIDJcbiAgICBjYXNlICdjaGFyYWN0ZXItZGV2aWNlJzpcbiAgICAgIHJldHVybiAzXG4gICAgY2FzZSAnYmxvY2stZGV2aWNlJzpcbiAgICAgIHJldHVybiA0XG4gICAgY2FzZSAnZGlyZWN0b3J5JzpcbiAgICAgIHJldHVybiA1XG4gICAgY2FzZSAnZmlmbyc6XG4gICAgICByZXR1cm4gNlxuICAgIGNhc2UgJ2NvbnRpZ3VvdXMtZmlsZSc6XG4gICAgICByZXR1cm4gN1xuICAgIGNhc2UgJ3BheC1oZWFkZXInOlxuICAgICAgcmV0dXJuIDcyXG4gIH1cblxuICByZXR1cm4gMFxufVxuXG5mdW5jdGlvbiBpbmRleE9mIChibG9jaywgbnVtLCBvZmZzZXQsIGVuZCkge1xuICBmb3IgKDsgb2Zmc2V0IDwgZW5kOyBvZmZzZXQrKykge1xuICAgIGlmIChibG9ja1tvZmZzZXRdID09PSBudW0pIHJldHVybiBvZmZzZXRcbiAgfVxuICByZXR1cm4gZW5kXG59XG5cbmZ1bmN0aW9uIGNrc3VtIChibG9jaykge1xuICBsZXQgc3VtID0gOCAqIDMyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTQ4OyBpKyspIHN1bSArPSBibG9ja1tpXVxuICBmb3IgKGxldCBqID0gMTU2OyBqIDwgNTEyOyBqKyspIHN1bSArPSBibG9ja1tqXVxuICByZXR1cm4gc3VtXG59XG5cbmZ1bmN0aW9uIGVuY29kZU9jdCAodmFsLCBuKSB7XG4gIHZhbCA9IHZhbC50b1N0cmluZyg4KVxuICBpZiAodmFsLmxlbmd0aCA+IG4pIHJldHVybiBTRVZFTlMuc2xpY2UoMCwgbikgKyAnICdcbiAgcmV0dXJuIFpFUk9TLnNsaWNlKDAsIG4gLSB2YWwubGVuZ3RoKSArIHZhbCArICcgJ1xufVxuXG5mdW5jdGlvbiBlbmNvZGVTaXplQmluIChudW0sIGJ1Ziwgb2ZmKSB7XG4gIGJ1ZltvZmZdID0gMHg4MFxuICBmb3IgKGxldCBpID0gMTE7IGkgPiAwOyBpLS0pIHtcbiAgICBidWZbb2ZmICsgaV0gPSBudW0gJiAweGZmXG4gICAgbnVtID0gTWF0aC5mbG9vcihudW0gLyAweDEwMClcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmNvZGVTaXplIChudW0sIGJ1Ziwgb2ZmKSB7XG4gIGlmIChudW0udG9TdHJpbmcoOCkubGVuZ3RoID4gMTEpIHtcbiAgICBlbmNvZGVTaXplQmluKG51bSwgYnVmLCBvZmYpXG4gIH0gZWxzZSB7XG4gICAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG51bSwgMTEpLCBvZmYpXG4gIH1cbn1cblxuLyogQ29waWVkIGZyb20gdGhlIG5vZGUtdGFyIHJlcG8gYW5kIG1vZGlmaWVkIHRvIG1lZXRcbiAqIHRhci1zdHJlYW0gY29kaW5nIHN0YW5kYXJkLlxuICpcbiAqIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL25wbS9ub2RlLXRhci9ibG9iLzUxYjY2MjdhMWYzNTdkMmViNDMzZTczNzhlNWYwNWU4M2I3YWE2Y2QvbGliL2hlYWRlci5qcyNMMzQ5XG4gKi9cbmZ1bmN0aW9uIHBhcnNlMjU2IChidWYpIHtcbiAgLy8gZmlyc3QgYnl0ZSBNVVNUIGJlIGVpdGhlciA4MCBvciBGRlxuICAvLyA4MCBmb3IgcG9zaXRpdmUsIEZGIGZvciAyJ3MgY29tcFxuICBsZXQgcG9zaXRpdmVcbiAgaWYgKGJ1ZlswXSA9PT0gMHg4MCkgcG9zaXRpdmUgPSB0cnVlXG4gIGVsc2UgaWYgKGJ1ZlswXSA9PT0gMHhGRikgcG9zaXRpdmUgPSBmYWxzZVxuICBlbHNlIHJldHVybiBudWxsXG5cbiAgLy8gYnVpbGQgdXAgYSBiYXNlLTI1NiB0dXBsZSBmcm9tIHRoZSBsZWFzdCBzaWcgdG8gdGhlIGhpZ2hlc3RcbiAgY29uc3QgdHVwbGUgPSBbXVxuICBsZXQgaVxuICBmb3IgKGkgPSBidWYubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgIGNvbnN0IGJ5dGUgPSBidWZbaV1cbiAgICBpZiAocG9zaXRpdmUpIHR1cGxlLnB1c2goYnl0ZSlcbiAgICBlbHNlIHR1cGxlLnB1c2goMHhGRiAtIGJ5dGUpXG4gIH1cblxuICBsZXQgc3VtID0gMFxuICBjb25zdCBsID0gdHVwbGUubGVuZ3RoXG4gIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICBzdW0gKz0gdHVwbGVbaV0gKiBNYXRoLnBvdygyNTYsIGkpXG4gIH1cblxuICByZXR1cm4gcG9zaXRpdmUgPyBzdW0gOiAtMSAqIHN1bVxufVxuXG5mdW5jdGlvbiBkZWNvZGVPY3QgKHZhbCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgdmFsID0gdmFsLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKVxuICBvZmZzZXQgPSAwXG5cbiAgLy8gSWYgcHJlZml4ZWQgd2l0aCAweDgwIHRoZW4gcGFyc2UgYXMgYSBiYXNlLTI1NiBpbnRlZ2VyXG4gIGlmICh2YWxbb2Zmc2V0XSAmIDB4ODApIHtcbiAgICByZXR1cm4gcGFyc2UyNTYodmFsKVxuICB9IGVsc2Uge1xuICAgIC8vIE9sZGVyIHZlcnNpb25zIG9mIHRhciBjYW4gcHJlZml4IHdpdGggc3BhY2VzXG4gICAgd2hpbGUgKG9mZnNldCA8IHZhbC5sZW5ndGggJiYgdmFsW29mZnNldF0gPT09IDMyKSBvZmZzZXQrK1xuICAgIGNvbnN0IGVuZCA9IGNsYW1wKGluZGV4T2YodmFsLCAzMiwgb2Zmc2V0LCB2YWwubGVuZ3RoKSwgdmFsLmxlbmd0aCwgdmFsLmxlbmd0aClcbiAgICB3aGlsZSAob2Zmc2V0IDwgZW5kICYmIHZhbFtvZmZzZXRdID09PSAwKSBvZmZzZXQrK1xuICAgIGlmIChlbmQgPT09IG9mZnNldCkgcmV0dXJuIDBcbiAgICByZXR1cm4gcGFyc2VJbnQoYjRhLnRvU3RyaW5nKHZhbC5zdWJhcnJheShvZmZzZXQsIGVuZCkpLCA4KVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlY29kZVN0ciAodmFsLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGI0YS50b1N0cmluZyh2YWwuc3ViYXJyYXkob2Zmc2V0LCBpbmRleE9mKHZhbCwgMCwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpKSwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFkZExlbmd0aCAoc3RyKSB7XG4gIGNvbnN0IGxlbiA9IGI0YS5ieXRlTGVuZ3RoKHN0cilcbiAgbGV0IGRpZ2l0cyA9IE1hdGguZmxvb3IoTWF0aC5sb2cobGVuKSAvIE1hdGgubG9nKDEwKSkgKyAxXG4gIGlmIChsZW4gKyBkaWdpdHMgPj0gTWF0aC5wb3coMTAsIGRpZ2l0cykpIGRpZ2l0cysrXG5cbiAgcmV0dXJuIChsZW4gKyBkaWdpdHMpICsgc3RyXG59XG4iLCJleHBvcnRzLmV4dHJhY3QgPSByZXF1aXJlKCcuL2V4dHJhY3QnKVxuZXhwb3J0cy5wYWNrID0gcmVxdWlyZSgnLi9wYWNrJylcbiIsImNvbnN0IHsgUmVhZGFibGUsIFdyaXRhYmxlLCBnZXRTdHJlYW1FcnJvciB9ID0gcmVxdWlyZSgnc3RyZWFteCcpXG5jb25zdCBiNGEgPSByZXF1aXJlKCdiNGEnKVxuXG5jb25zdCBjb25zdGFudHMgPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCBoZWFkZXJzID0gcmVxdWlyZSgnLi9oZWFkZXJzJylcblxuY29uc3QgRE1PREUgPSAwbzc1NVxuY29uc3QgRk1PREUgPSAwbzY0NFxuXG5jb25zdCBFTkRfT0ZfVEFSID0gYjRhLmFsbG9jKDEwMjQpXG5cbmNsYXNzIFNpbmsgZXh0ZW5kcyBXcml0YWJsZSB7XG4gIGNvbnN0cnVjdG9yIChwYWNrLCBoZWFkZXIsIGNhbGxiYWNrKSB7XG4gICAgc3VwZXIoeyBtYXBXcml0YWJsZSwgZWFnZXJPcGVuOiB0cnVlIH0pXG5cbiAgICB0aGlzLndyaXR0ZW4gPSAwXG4gICAgdGhpcy5oZWFkZXIgPSBoZWFkZXJcblxuICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLl9saW5rbmFtZSA9IG51bGxcbiAgICB0aGlzLl9pc0xpbmtuYW1lID0gaGVhZGVyLnR5cGUgPT09ICdzeW1saW5rJyAmJiAhaGVhZGVyLmxpbmtuYW1lXG4gICAgdGhpcy5faXNWb2lkID0gaGVhZGVyLnR5cGUgIT09ICdmaWxlJyAmJiBoZWFkZXIudHlwZSAhPT0gJ2NvbnRpZ3VvdXMtZmlsZSdcbiAgICB0aGlzLl9maW5pc2hlZCA9IGZhbHNlXG4gICAgdGhpcy5fcGFjayA9IHBhY2tcbiAgICB0aGlzLl9vcGVuQ2FsbGJhY2sgPSBudWxsXG5cbiAgICBpZiAodGhpcy5fcGFjay5fc3RyZWFtID09PSBudWxsKSB0aGlzLl9wYWNrLl9zdHJlYW0gPSB0aGlzXG4gICAgZWxzZSB0aGlzLl9wYWNrLl9wZW5kaW5nLnB1c2godGhpcylcbiAgfVxuXG4gIF9vcGVuIChjYikge1xuICAgIHRoaXMuX29wZW5DYWxsYmFjayA9IGNiXG4gICAgaWYgKHRoaXMuX3BhY2suX3N0cmVhbSA9PT0gdGhpcykgdGhpcy5fY29udGludWVPcGVuKClcbiAgfVxuXG4gIF9jb250aW51ZVBhY2sgKGVycikge1xuICAgIGlmICh0aGlzLl9jYWxsYmFjayA9PT0gbnVsbCkgcmV0dXJuXG5cbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuX2NhbGxiYWNrXG4gICAgdGhpcy5fY2FsbGJhY2sgPSBudWxsXG5cbiAgICBjYWxsYmFjayhlcnIpXG4gIH1cblxuICBfY29udGludWVPcGVuICgpIHtcbiAgICBpZiAodGhpcy5fcGFjay5fc3RyZWFtID09PSBudWxsKSB0aGlzLl9wYWNrLl9zdHJlYW0gPSB0aGlzXG5cbiAgICBjb25zdCBjYiA9IHRoaXMuX29wZW5DYWxsYmFja1xuICAgIHRoaXMuX29wZW5DYWxsYmFjayA9IG51bGxcbiAgICBpZiAoY2IgPT09IG51bGwpIHJldHVyblxuXG4gICAgaWYgKHRoaXMuX3BhY2suZGVzdHJveWluZykgcmV0dXJuIGNiKG5ldyBFcnJvcigncGFjayBzdHJlYW0gZGVzdHJveWVkJykpXG4gICAgaWYgKHRoaXMuX3BhY2suX2ZpbmFsaXplZCkgcmV0dXJuIGNiKG5ldyBFcnJvcigncGFjayBzdHJlYW0gaXMgYWxyZWFkeSBmaW5hbGl6ZWQnKSlcblxuICAgIHRoaXMuX3BhY2suX3N0cmVhbSA9IHRoaXNcblxuICAgIGlmICghdGhpcy5faXNMaW5rbmFtZSkge1xuICAgICAgdGhpcy5fcGFjay5fZW5jb2RlKHRoaXMuaGVhZGVyKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1ZvaWQpIHtcbiAgICAgIHRoaXMuX2ZpbmlzaCgpXG4gICAgICB0aGlzLl9jb250aW51ZVBhY2sobnVsbClcbiAgICB9XG5cbiAgICBjYihudWxsKVxuICB9XG5cbiAgX3dyaXRlIChkYXRhLCBjYikge1xuICAgIGlmICh0aGlzLl9pc0xpbmtuYW1lKSB7XG4gICAgICB0aGlzLl9saW5rbmFtZSA9IHRoaXMuX2xpbmtuYW1lID8gYjRhLmNvbmNhdChbdGhpcy5fbGlua25hbWUsIGRhdGFdKSA6IGRhdGFcbiAgICAgIHJldHVybiBjYihudWxsKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1ZvaWQpIHtcbiAgICAgIGlmIChkYXRhLmJ5dGVMZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBjYihuZXcgRXJyb3IoJ05vIGJvZHkgYWxsb3dlZCBmb3IgdGhpcyBlbnRyeScpKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNiKClcbiAgICB9XG5cbiAgICB0aGlzLndyaXR0ZW4gKz0gZGF0YS5ieXRlTGVuZ3RoXG4gICAgaWYgKHRoaXMuX3BhY2sucHVzaChkYXRhKSkgcmV0dXJuIGNiKClcbiAgICB0aGlzLl9wYWNrLl9kcmFpbiA9IGNiXG4gIH1cblxuICBfZmluaXNoICgpIHtcbiAgICBpZiAodGhpcy5fZmluaXNoZWQpIHJldHVyblxuICAgIHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZVxuXG4gICAgaWYgKHRoaXMuX2lzTGlua25hbWUpIHtcbiAgICAgIHRoaXMuaGVhZGVyLmxpbmtuYW1lID0gdGhpcy5fbGlua25hbWUgPyBiNGEudG9TdHJpbmcodGhpcy5fbGlua25hbWUsICd1dGYtOCcpIDogJydcbiAgICAgIHRoaXMuX3BhY2suX2VuY29kZSh0aGlzLmhlYWRlcilcbiAgICB9XG5cbiAgICBvdmVyZmxvdyh0aGlzLl9wYWNrLCB0aGlzLmhlYWRlci5zaXplKVxuXG4gICAgdGhpcy5fcGFjay5fZG9uZSh0aGlzKVxuICB9XG5cbiAgX2ZpbmFsIChjYikge1xuICAgIGlmICh0aGlzLndyaXR0ZW4gIT09IHRoaXMuaGVhZGVyLnNpemUpIHsgLy8gY29ycnVwdGluZyB0YXJcbiAgICAgIHJldHVybiBjYihuZXcgRXJyb3IoJ1NpemUgbWlzbWF0Y2gnKSlcbiAgICB9XG5cbiAgICB0aGlzLl9maW5pc2goKVxuICAgIGNiKG51bGwpXG4gIH1cblxuICBfZ2V0RXJyb3IgKCkge1xuICAgIHJldHVybiBnZXRTdHJlYW1FcnJvcih0aGlzKSB8fCBuZXcgRXJyb3IoJ3RhciBlbnRyeSBkZXN0cm95ZWQnKVxuICB9XG5cbiAgX3ByZWRlc3Ryb3kgKCkge1xuICAgIHRoaXMuX3BhY2suZGVzdHJveSh0aGlzLl9nZXRFcnJvcigpKVxuICB9XG5cbiAgX2Rlc3Ryb3kgKGNiKSB7XG4gICAgdGhpcy5fcGFjay5fZG9uZSh0aGlzKVxuXG4gICAgdGhpcy5fY29udGludWVQYWNrKHRoaXMuX2ZpbmlzaGVkID8gbnVsbCA6IHRoaXMuX2dldEVycm9yKCkpXG5cbiAgICBjYigpXG4gIH1cbn1cblxuY2xhc3MgUGFjayBleHRlbmRzIFJlYWRhYmxlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXMuX2RyYWluID0gbm9vcFxuICAgIHRoaXMuX2ZpbmFsaXplZCA9IGZhbHNlXG4gICAgdGhpcy5fZmluYWxpemluZyA9IGZhbHNlXG4gICAgdGhpcy5fcGVuZGluZyA9IFtdXG4gICAgdGhpcy5fc3RyZWFtID0gbnVsbFxuICB9XG5cbiAgZW50cnkgKGhlYWRlciwgYnVmZmVyLCBjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9maW5hbGl6ZWQgfHwgdGhpcy5kZXN0cm95aW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2FscmVhZHkgZmluYWxpemVkIG9yIGRlc3Ryb3llZCcpXG5cbiAgICBpZiAodHlwZW9mIGJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBidWZmZXJcbiAgICAgIGJ1ZmZlciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IG5vb3BcblxuICAgIGlmICghaGVhZGVyLnNpemUgfHwgaGVhZGVyLnR5cGUgPT09ICdzeW1saW5rJykgaGVhZGVyLnNpemUgPSAwXG4gICAgaWYgKCFoZWFkZXIudHlwZSkgaGVhZGVyLnR5cGUgPSBtb2RlVG9UeXBlKGhlYWRlci5tb2RlKVxuICAgIGlmICghaGVhZGVyLm1vZGUpIGhlYWRlci5tb2RlID0gaGVhZGVyLnR5cGUgPT09ICdkaXJlY3RvcnknID8gRE1PREUgOiBGTU9ERVxuICAgIGlmICghaGVhZGVyLnVpZCkgaGVhZGVyLnVpZCA9IDBcbiAgICBpZiAoIWhlYWRlci5naWQpIGhlYWRlci5naWQgPSAwXG4gICAgaWYgKCFoZWFkZXIubXRpbWUpIGhlYWRlci5tdGltZSA9IG5ldyBEYXRlKClcblxuICAgIGlmICh0eXBlb2YgYnVmZmVyID09PSAnc3RyaW5nJykgYnVmZmVyID0gYjRhLmZyb20oYnVmZmVyKVxuXG4gICAgY29uc3Qgc2luayA9IG5ldyBTaW5rKHRoaXMsIGhlYWRlciwgY2FsbGJhY2spXG5cbiAgICBpZiAoYjRhLmlzQnVmZmVyKGJ1ZmZlcikpIHtcbiAgICAgIGhlYWRlci5zaXplID0gYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgIHNpbmsud3JpdGUoYnVmZmVyKVxuICAgICAgc2luay5lbmQoKVxuICAgICAgcmV0dXJuIHNpbmtcbiAgICB9XG5cbiAgICBpZiAoc2luay5faXNWb2lkKSB7XG4gICAgICByZXR1cm4gc2lua1xuICAgIH1cblxuICAgIHJldHVybiBzaW5rXG4gIH1cblxuICBmaW5hbGl6ZSAoKSB7XG4gICAgaWYgKHRoaXMuX3N0cmVhbSB8fCB0aGlzLl9wZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ZpbmFsaXppbmcgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZmluYWxpemVkKSByZXR1cm5cbiAgICB0aGlzLl9maW5hbGl6ZWQgPSB0cnVlXG5cbiAgICB0aGlzLnB1c2goRU5EX09GX1RBUilcbiAgICB0aGlzLnB1c2gobnVsbClcbiAgfVxuXG4gIF9kb25lIChzdHJlYW0pIHtcbiAgICBpZiAoc3RyZWFtICE9PSB0aGlzLl9zdHJlYW0pIHJldHVyblxuXG4gICAgdGhpcy5fc3RyZWFtID0gbnVsbFxuXG4gICAgaWYgKHRoaXMuX2ZpbmFsaXppbmcpIHRoaXMuZmluYWxpemUoKVxuICAgIGlmICh0aGlzLl9wZW5kaW5nLmxlbmd0aCkgdGhpcy5fcGVuZGluZy5zaGlmdCgpLl9jb250aW51ZU9wZW4oKVxuICB9XG5cbiAgX2VuY29kZSAoaGVhZGVyKSB7XG4gICAgaWYgKCFoZWFkZXIucGF4KSB7XG4gICAgICBjb25zdCBidWYgPSBoZWFkZXJzLmVuY29kZShoZWFkZXIpXG4gICAgICBpZiAoYnVmKSB7XG4gICAgICAgIHRoaXMucHVzaChidWYpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9lbmNvZGVQYXgoaGVhZGVyKVxuICB9XG5cbiAgX2VuY29kZVBheCAoaGVhZGVyKSB7XG4gICAgY29uc3QgcGF4SGVhZGVyID0gaGVhZGVycy5lbmNvZGVQYXgoe1xuICAgICAgbmFtZTogaGVhZGVyLm5hbWUsXG4gICAgICBsaW5rbmFtZTogaGVhZGVyLmxpbmtuYW1lLFxuICAgICAgcGF4OiBoZWFkZXIucGF4XG4gICAgfSlcblxuICAgIGNvbnN0IG5ld0hlYWRlciA9IHtcbiAgICAgIG5hbWU6ICdQYXhIZWFkZXInLFxuICAgICAgbW9kZTogaGVhZGVyLm1vZGUsXG4gICAgICB1aWQ6IGhlYWRlci51aWQsXG4gICAgICBnaWQ6IGhlYWRlci5naWQsXG4gICAgICBzaXplOiBwYXhIZWFkZXIuYnl0ZUxlbmd0aCxcbiAgICAgIG10aW1lOiBoZWFkZXIubXRpbWUsXG4gICAgICB0eXBlOiAncGF4LWhlYWRlcicsXG4gICAgICBsaW5rbmFtZTogaGVhZGVyLmxpbmtuYW1lICYmICdQYXhIZWFkZXInLFxuICAgICAgdW5hbWU6IGhlYWRlci51bmFtZSxcbiAgICAgIGduYW1lOiBoZWFkZXIuZ25hbWUsXG4gICAgICBkZXZtYWpvcjogaGVhZGVyLmRldm1ham9yLFxuICAgICAgZGV2bWlub3I6IGhlYWRlci5kZXZtaW5vclxuICAgIH1cblxuICAgIHRoaXMucHVzaChoZWFkZXJzLmVuY29kZShuZXdIZWFkZXIpKVxuICAgIHRoaXMucHVzaChwYXhIZWFkZXIpXG4gICAgb3ZlcmZsb3codGhpcywgcGF4SGVhZGVyLmJ5dGVMZW5ndGgpXG5cbiAgICBuZXdIZWFkZXIuc2l6ZSA9IGhlYWRlci5zaXplXG4gICAgbmV3SGVhZGVyLnR5cGUgPSBoZWFkZXIudHlwZVxuICAgIHRoaXMucHVzaChoZWFkZXJzLmVuY29kZShuZXdIZWFkZXIpKVxuICB9XG5cbiAgX2RvRHJhaW4gKCkge1xuICAgIGNvbnN0IGRyYWluID0gdGhpcy5fZHJhaW5cbiAgICB0aGlzLl9kcmFpbiA9IG5vb3BcbiAgICBkcmFpbigpXG4gIH1cblxuICBfcHJlZGVzdHJveSAoKSB7XG4gICAgY29uc3QgZXJyID0gZ2V0U3RyZWFtRXJyb3IodGhpcylcblxuICAgIGlmICh0aGlzLl9zdHJlYW0pIHRoaXMuX3N0cmVhbS5kZXN0cm95KGVycilcblxuICAgIHdoaWxlICh0aGlzLl9wZW5kaW5nLmxlbmd0aCkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fcGVuZGluZy5zaGlmdCgpXG4gICAgICBzdHJlYW0uZGVzdHJveShlcnIpXG4gICAgICBzdHJlYW0uX2NvbnRpbnVlT3BlbigpXG4gICAgfVxuXG4gICAgdGhpcy5fZG9EcmFpbigpXG4gIH1cblxuICBfcmVhZCAoY2IpIHtcbiAgICB0aGlzLl9kb0RyYWluKClcbiAgICBjYigpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYWNrIChvcHRzKSB7XG4gIHJldHVybiBuZXcgUGFjayhvcHRzKVxufVxuXG5mdW5jdGlvbiBtb2RlVG9UeXBlIChtb2RlKSB7XG4gIHN3aXRjaCAobW9kZSAmIGNvbnN0YW50cy5TX0lGTVQpIHtcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGQkxLOiByZXR1cm4gJ2Jsb2NrLWRldmljZSdcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGQ0hSOiByZXR1cm4gJ2NoYXJhY3Rlci1kZXZpY2UnXG4gICAgY2FzZSBjb25zdGFudHMuU19JRkRJUjogcmV0dXJuICdkaXJlY3RvcnknXG4gICAgY2FzZSBjb25zdGFudHMuU19JRklGTzogcmV0dXJuICdmaWZvJ1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZMTks6IHJldHVybiAnc3ltbGluaydcbiAgfVxuXG4gIHJldHVybiAnZmlsZSdcbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBvdmVyZmxvdyAoc2VsZiwgc2l6ZSkge1xuICBzaXplICY9IDUxMVxuICBpZiAoc2l6ZSkgc2VsZi5wdXNoKEVORF9PRl9UQVIuc3ViYXJyYXkoMCwgNTEyIC0gc2l6ZSkpXG59XG5cbmZ1bmN0aW9uIG1hcFdyaXRhYmxlIChidWYpIHtcbiAgcmV0dXJuIGI0YS5pc0J1ZmZlcihidWYpID8gYnVmIDogYjRhLmZyb20oYnVmKVxufVxuIiwiY29uc3QgUGFzc1Rocm91Z2hEZWNvZGVyID0gcmVxdWlyZSgnLi9saWIvcGFzcy10aHJvdWdoLWRlY29kZXInKVxuY29uc3QgVVRGOERlY29kZXIgPSByZXF1aXJlKCcuL2xpYi91dGY4LWRlY29kZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFRleHREZWNvZGVyIHtcbiAgY29uc3RydWN0b3IgKGVuY29kaW5nID0gJ3V0ZjgnKSB7XG4gICAgdGhpcy5lbmNvZGluZyA9IG5vcm1hbGl6ZUVuY29kaW5nKGVuY29kaW5nKVxuXG4gICAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgdGhpcy5kZWNvZGVyID0gbmV3IFVURjhEZWNvZGVyKClcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBlbmNvZGluZzogJyArIHRoaXMuZW5jb2RpbmcpXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmRlY29kZXIgPSBuZXcgUGFzc1Rocm91Z2hEZWNvZGVyKHRoaXMuZW5jb2RpbmcpXG4gICAgfVxuICB9XG5cbiAgcHVzaCAoZGF0YSkge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHJldHVybiBkYXRhXG4gICAgcmV0dXJuIHRoaXMuZGVjb2Rlci5kZWNvZGUoZGF0YSlcbiAgfVxuXG4gIC8vIEZvciBOb2RlLmpzIGNvbXBhdGliaWxpdHlcbiAgd3JpdGUgKGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5wdXNoKGRhdGEpXG4gIH1cblxuICBlbmQgKGRhdGEpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICBpZiAoZGF0YSkgcmVzdWx0ID0gdGhpcy5wdXNoKGRhdGEpXG4gICAgcmVzdWx0ICs9IHRoaXMuZGVjb2Rlci5mbHVzaCgpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVuY29kaW5nIChlbmNvZGluZykge1xuICBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKClcblxuICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgICAgcmV0dXJuICd1dGY4J1xuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gJ3V0ZjE2bGUnXG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgICAgcmV0dXJuICdsYXRpbjEnXG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnaGV4JzpcbiAgICAgIHJldHVybiBlbmNvZGluZ1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgfVxufTtcbiIsImNvbnN0IGI0YSA9IHJlcXVpcmUoJ2I0YScpXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgUGFzc1Rocm91Z2hEZWNvZGVyIHtcbiAgY29uc3RydWN0b3IgKGVuY29kaW5nKSB7XG4gICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nXG4gIH1cblxuICBkZWNvZGUgKHRhaWwpIHtcbiAgICByZXR1cm4gYjRhLnRvU3RyaW5nKHRhaWwsIHRoaXMuZW5jb2RpbmcpXG4gIH1cblxuICBmbHVzaCAoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbn1cbiIsImNvbnN0IGI0YSA9IHJlcXVpcmUoJ2I0YScpXG5cbi8qKlxuICogaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI3V0Zi04LWRlY29kZXJcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBVVEY4RGVjb2RlciB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLmNvZGVQb2ludCA9IDBcbiAgICB0aGlzLmJ5dGVzU2VlbiA9IDBcbiAgICB0aGlzLmJ5dGVzTmVlZGVkID0gMFxuICAgIHRoaXMubG93ZXJCb3VuZGFyeSA9IDB4ODBcbiAgICB0aGlzLnVwcGVyQm91bmRhcnkgPSAweGJmXG4gIH1cblxuICBkZWNvZGUgKGRhdGEpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgZmFzdCBwYXRoLCBqdXN0IHNuaWZmIGlmIHRoZSBsYXN0IHBhcnQgaXMgYSBib3VuZGFyeVxuICAgIGlmICh0aGlzLmJ5dGVzTmVlZGVkID09PSAwKSB7XG4gICAgICBsZXQgaXNCb3VuZGFyeSA9IHRydWVcblxuICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWF4KDAsIGRhdGEuYnl0ZUxlbmd0aCAtIDQpLCBuID0gZGF0YS5ieXRlTGVuZ3RoOyBpIDwgbiAmJiBpc0JvdW5kYXJ5OyBpKyspIHtcbiAgICAgICAgaXNCb3VuZGFyeSA9IGRhdGFbaV0gPD0gMHg3ZlxuICAgICAgfVxuXG4gICAgICBpZiAoaXNCb3VuZGFyeSkgcmV0dXJuIGI0YS50b1N0cmluZyhkYXRhLCAndXRmOCcpXG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9ICcnXG5cbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGRhdGEuYnl0ZUxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgY29uc3QgYnl0ZSA9IGRhdGFbaV1cblxuICAgICAgaWYgKHRoaXMuYnl0ZXNOZWVkZWQgPT09IDApIHtcbiAgICAgICAgaWYgKGJ5dGUgPD0gMHg3Zikge1xuICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpXG4gICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSAweGMyICYmIGJ5dGUgPD0gMHhkZikge1xuICAgICAgICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSAxXG4gICAgICAgICAgdGhpcy5jb2RlUG9pbnQgPSBieXRlICYgMHgxZlxuICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPj0gMHhlMCAmJiBieXRlIDw9IDB4ZWYpIHtcbiAgICAgICAgICBpZiAoYnl0ZSA9PT0gMHhlMCkgdGhpcy5sb3dlckJvdW5kYXJ5ID0gMHhhMFxuICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IDB4ZWQpIHRoaXMudXBwZXJCb3VuZGFyeSA9IDB4OWZcbiAgICAgICAgICB0aGlzLmJ5dGVzTmVlZGVkID0gMlxuICAgICAgICAgIHRoaXMuY29kZVBvaW50ID0gYnl0ZSAmIDB4ZlxuICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPj0gMHhmMCAmJiBieXRlIDw9IDB4ZjQpIHtcbiAgICAgICAgICBpZiAoYnl0ZSA9PT0gMHhmMCkgdGhpcy5sb3dlckJvdW5kYXJ5ID0gMHg5MFxuICAgICAgICAgIGlmIChieXRlID09PSAweGY0KSB0aGlzLnVwcGVyQm91bmRhcnkgPSAweDhmXG4gICAgICAgICAgdGhpcy5ieXRlc05lZWRlZCA9IDNcbiAgICAgICAgICB0aGlzLmNvZGVQb2ludCA9IGJ5dGUgJiAweDdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgKz0gJ1xcdWZmZmQnXG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoYnl0ZSA8IHRoaXMubG93ZXJCb3VuZGFyeSB8fCBieXRlID4gdGhpcy51cHBlckJvdW5kYXJ5KSB7XG4gICAgICAgIHRoaXMuY29kZVBvaW50ID0gMFxuICAgICAgICB0aGlzLmJ5dGVzTmVlZGVkID0gMFxuICAgICAgICB0aGlzLmJ5dGVzU2VlbiA9IDBcbiAgICAgICAgdGhpcy5sb3dlckJvdW5kYXJ5ID0gMHg4MFxuICAgICAgICB0aGlzLnVwcGVyQm91bmRhcnkgPSAweGJmXG5cbiAgICAgICAgcmVzdWx0ICs9ICdcXHVmZmZkJ1xuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRoaXMubG93ZXJCb3VuZGFyeSA9IDB4ODBcbiAgICAgIHRoaXMudXBwZXJCb3VuZGFyeSA9IDB4YmZcblxuICAgICAgdGhpcy5jb2RlUG9pbnQgPSAodGhpcy5jb2RlUG9pbnQgPDwgNikgfCAoYnl0ZSAmIDB4M2YpXG4gICAgICB0aGlzLmJ5dGVzU2VlbisrXG5cbiAgICAgIGlmICh0aGlzLmJ5dGVzU2VlbiAhPT0gdGhpcy5ieXRlc05lZWRlZCkgY29udGludWVcblxuICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KHRoaXMuY29kZVBvaW50KVxuXG4gICAgICB0aGlzLmNvZGVQb2ludCA9IDBcbiAgICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSAwXG4gICAgICB0aGlzLmJ5dGVzU2VlbiA9IDBcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBmbHVzaCAoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5ieXRlc05lZWRlZCA+IDAgPyAnXFx1ZmZmZCcgOiAnJ1xuXG4gICAgdGhpcy5jb2RlUG9pbnQgPSAwXG4gICAgdGhpcy5ieXRlc05lZWRlZCA9IDBcbiAgICB0aGlzLmJ5dGVzU2VlbiA9IDBcbiAgICB0aGlzLmxvd2VyQm91bmRhcnkgPSAweDgwXG4gICAgdGhpcy51cHBlckJvdW5kYXJ5ID0gMHhiZlxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG4iLCJ2YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcblxuLy8gdGhyb3VnaFxuLy9cbi8vIGEgc3RyZWFtIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCByZS1lbWl0IHRoZSBpbnB1dC5cbi8vIHVzZWZ1bCBmb3IgYWdncmVnYXRpbmcgYSBzZXJpZXMgb2YgY2hhbmdpbmcgYnV0IG5vdCBlbmRpbmcgc3RyZWFtcyBpbnRvIG9uZSBzdHJlYW0pXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHRocm91Z2hcbnRocm91Z2gudGhyb3VnaCA9IHRocm91Z2hcblxuLy9jcmVhdGUgYSByZWFkYWJsZSB3cml0YWJsZSBzdHJlYW0uXG5cbmZ1bmN0aW9uIHRocm91Z2ggKHdyaXRlLCBlbmQsIG9wdHMpIHtcbiAgd3JpdGUgPSB3cml0ZSB8fCBmdW5jdGlvbiAoZGF0YSkgeyB0aGlzLnF1ZXVlKGRhdGEpIH1cbiAgZW5kID0gZW5kIHx8IGZ1bmN0aW9uICgpIHsgdGhpcy5xdWV1ZShudWxsKSB9XG5cbiAgdmFyIGVuZGVkID0gZmFsc2UsIGRlc3Ryb3llZCA9IGZhbHNlLCBidWZmZXIgPSBbXSwgX2VuZGVkID0gZmFsc2VcbiAgdmFyIHN0cmVhbSA9IG5ldyBTdHJlYW0oKVxuICBzdHJlYW0ucmVhZGFibGUgPSBzdHJlYW0ud3JpdGFibGUgPSB0cnVlXG4gIHN0cmVhbS5wYXVzZWQgPSBmYWxzZVxuXG4vLyAgc3RyZWFtLmF1dG9QYXVzZSAgID0gIShvcHRzICYmIG9wdHMuYXV0b1BhdXNlICAgPT09IGZhbHNlKVxuICBzdHJlYW0uYXV0b0Rlc3Ryb3kgPSAhKG9wdHMgJiYgb3B0cy5hdXRvRGVzdHJveSA9PT0gZmFsc2UpXG5cbiAgc3RyZWFtLndyaXRlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB3cml0ZS5jYWxsKHRoaXMsIGRhdGEpXG4gICAgcmV0dXJuICFzdHJlYW0ucGF1c2VkXG4gIH1cblxuICBmdW5jdGlvbiBkcmFpbigpIHtcbiAgICB3aGlsZShidWZmZXIubGVuZ3RoICYmICFzdHJlYW0ucGF1c2VkKSB7XG4gICAgICB2YXIgZGF0YSA9IGJ1ZmZlci5zaGlmdCgpXG4gICAgICBpZihudWxsID09PSBkYXRhKVxuICAgICAgICByZXR1cm4gc3RyZWFtLmVtaXQoJ2VuZCcpXG4gICAgICBlbHNlXG4gICAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgZGF0YSlcbiAgICB9XG4gIH1cblxuICBzdHJlYW0ucXVldWUgPSBzdHJlYW0ucHVzaCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4vLyAgICBjb25zb2xlLmVycm9yKGVuZGVkKVxuICAgIGlmKF9lbmRlZCkgcmV0dXJuIHN0cmVhbVxuICAgIGlmKGRhdGEgPT09IG51bGwpIF9lbmRlZCA9IHRydWVcbiAgICBidWZmZXIucHVzaChkYXRhKVxuICAgIGRyYWluKClcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cblxuICAvL3RoaXMgd2lsbCBiZSByZWdpc3RlcmVkIGFzIHRoZSBmaXJzdCAnZW5kJyBsaXN0ZW5lclxuICAvL211c3QgY2FsbCBkZXN0cm95IG5leHQgdGljaywgdG8gbWFrZSBzdXJlIHdlJ3JlIGFmdGVyIGFueVxuICAvL3N0cmVhbSBwaXBlZCBmcm9tIGhlcmUuXG4gIC8vdGhpcyBpcyBvbmx5IGEgcHJvYmxlbSBpZiBlbmQgaXMgbm90IGVtaXR0ZWQgc3luY2hyb25vdXNseS5cbiAgLy9hIG5pY2VyIHdheSB0byBkbyB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGlzIGlzIHRoZSBsYXN0IGxpc3RlbmVyIGZvciAnZW5kJ1xuXG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlXG4gICAgaWYoIXN0cmVhbS53cml0YWJsZSAmJiBzdHJlYW0uYXV0b0Rlc3Ryb3kpXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICAgICAgfSlcbiAgfSlcblxuICBmdW5jdGlvbiBfZW5kICgpIHtcbiAgICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZVxuICAgIGVuZC5jYWxsKHN0cmVhbSlcbiAgICBpZighc3RyZWFtLnJlYWRhYmxlICYmIHN0cmVhbS5hdXRvRGVzdHJveSlcbiAgICAgIHN0cmVhbS5kZXN0cm95KClcbiAgfVxuXG4gIHN0cmVhbS5lbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmKGVuZGVkKSByZXR1cm5cbiAgICBlbmRlZCA9IHRydWVcbiAgICBpZihhcmd1bWVudHMubGVuZ3RoKSBzdHJlYW0ud3JpdGUoZGF0YSlcbiAgICBfZW5kKCkgLy8gd2lsbCBlbWl0IG9yIHF1ZXVlXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG5cbiAgc3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoZGVzdHJveWVkKSByZXR1cm5cbiAgICBkZXN0cm95ZWQgPSB0cnVlXG4gICAgZW5kZWQgPSB0cnVlXG4gICAgYnVmZmVyLmxlbmd0aCA9IDBcbiAgICBzdHJlYW0ud3JpdGFibGUgPSBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZVxuICAgIHN0cmVhbS5lbWl0KCdjbG9zZScpXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG5cbiAgc3RyZWFtLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKHN0cmVhbS5wYXVzZWQpIHJldHVyblxuICAgIHN0cmVhbS5wYXVzZWQgPSB0cnVlXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG5cbiAgc3RyZWFtLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZihzdHJlYW0ucGF1c2VkKSB7XG4gICAgICBzdHJlYW0ucGF1c2VkID0gZmFsc2VcbiAgICAgIHN0cmVhbS5lbWl0KCdyZXN1bWUnKVxuICAgIH1cbiAgICBkcmFpbigpXG4gICAgLy9tYXkgaGF2ZSBiZWNvbWUgcGF1c2VkIGFnYWluLFxuICAgIC8vYXMgZHJhaW4gZW1pdHMgJ2RhdGEnLlxuICAgIGlmKCFzdHJlYW0ucGF1c2VkKVxuICAgICAgc3RyZWFtLmVtaXQoJ2RyYWluJylcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cbiAgcmV0dXJuIHN0cmVhbVxufVxuXG4iLCJpbXBvcnQgeyB0eXBlIFByb2R1Y3QsIHR5cGUgUHJvdG9jb2xUeXBlIH0gZnJvbSBcInB1cHBldGVlci1jb3JlXCI7XG5cbmltcG9ydCB7IHByb2dyYW0sIE9wdGlvbiB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCAqIGFzIGNvbW1hbmRlciBmcm9tIFwiY29tbWFuZGVyXCI7XG5cbi8vIGhlbHBlciBmdW5jdGlvbiBmb3IgY29udmVydGluZyBTdHJpbmcgdG8gQm9vbGVhblxuZnVuY3Rpb24gYm9vbGVhbkVudihuYW1lOiBzdHJpbmcsIGRlZmF1bHRfdmFsdWU6IGJvb2xlYW4pIHtcbiAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnZbbmFtZV07XG4gIGlmIChlbnYgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlO1xuICB9XG4gIHN3aXRjaCAoZW52LnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlIFwiMFwiOlxuICAgIGNhc2UgXCJmYWxzZVwiOlxuICAgIGNhc2UgXCJvZmZcIjpcbiAgICBjYXNlIFwiZGlzYWJsZWRcIjpcbiAgICBjYXNlIFwibm9cIjpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjYXNlIFwiMVwiOlxuICAgIGNhc2UgXCJ0cnVlXCI6XG4gICAgY2FzZSBcIm9uXCI6XG4gICAgY2FzZSBcImVuYWJsZWRcIjpcbiAgICBjYXNlIFwieWVzXCI6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEJyb3dzZXJTZXR0aW5ncyB7XG4gIHByb2R1Y3Q6IFByb2R1Y3Q7XG4gIGV4ZWN1dGFibGVQYXRoOiBzdHJpbmc7XG59XG5cbi8vIGhlbHBlciBmdW5jdGlvbiBmb3IgY29uZmlndXJpbmcgdGhlIGJyb3dzZXJcbmZ1bmN0aW9uIGJyb3dzZXJTZXR0aW5ncyhuYW1lOiBzdHJpbmcpOiBCcm93c2VyU2V0dGluZ3Mge1xuICBzd2l0Y2ggKG5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgXCJmaXJlZm94XCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9kdWN0OiBcImZpcmVmb3hcIixcbiAgICAgICAgZXhlY3V0YWJsZVBhdGg6IFwiL3Vzci9iaW4vZmlyZWZveFwiLFxuICAgICAgfTtcbiAgICBjYXNlIFwiY2hyb21lXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9kdWN0OiBcImNocm9tZVwiLFxuICAgICAgICBleGVjdXRhYmxlUGF0aDogXCIvdXNyL2Jpbi9nb29nbGUtY2hyb21lLXN0YWJsZVwiLFxuICAgICAgfTtcbiAgICBjYXNlIFwiY2hyb21pdW1cIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb2R1Y3Q6IFwiY2hyb21lXCIsXG4gICAgICAgIGV4ZWN1dGFibGVQYXRoOiBcIi91c3IvYmluL2Nocm9taXVtXCIsXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGJyb3dzZXIgdHlwZTogJHtuYW1lfWApO1xuICB9XG59XG5cbi8vIHBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBhcyBhbiBpbnRlZ2VyXG5mdW5jdGlvbiBnZXRJbnQodmFsdWU6IHN0cmluZykge1xuICAvLyBwYXJzZSB0aGUgdmFsdWUgYXMgYSBkZWNpbWFsIG51bWJlciAoYmFzZSAxMClcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgaWYgKGlzTmFOKHBhcnNlZCkpIHtcbiAgICB0aHJvdyBuZXcgY29tbWFuZGVyLkludmFsaWRBcmd1bWVudEVycm9yKFwiRW50ZXIgYSB2YWxpZCBudW1iZXIuXCIpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLy8gZGVmaW5lIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBwYXJzZSB0aGVtXG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RqL2NvbW1hbmRlci5qc1xucHJvZ3JhbVxuICAuZGVzY3JpcHRpb24oXCJSdW4gYSBzaW1wbGUgQWdhbWEgaW50ZWdyYXRpb24gdGVzdFwiKVxuICAub3B0aW9uKFwiLXUsIC0tdXJsIDx1cmw+XCIsIFwiQWdhbWEgc2VydmVyIFVSTFwiLCBcImh0dHA6Ly9sb2NhbGhvc3RcIilcbiAgLm9wdGlvbihcIi1wLCAtLXBhc3N3b3JkIDxwYXNzd29yZD5cIiwgXCJBZ2FtYSBsb2dpbiBwYXNzd29yZFwiLCBcIm5vdHMzY3IzdFwiKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oXCItYiwgLS1icm93c2VyIDxicm93c2VyPlwiLCBcIkJyb3dzZXIgdXNlZCBmb3IgcnVubmluZyB0aGUgdGVzdFwiKVxuICAgIC5jaG9pY2VzKFtcImZpcmVmb3hcIiwgXCJjaHJvbWVcIiwgXCJjaHJvbWl1bVwiXSlcbiAgICAuZGVmYXVsdChcImZpcmVmb3hcIilcbiAgKVxuICAub3B0aW9uKFwiLWgsIC0taGVhZGVkXCIsIFwiUnVuIHRoZSBicm93c2VyIGluIGhlYWRlZCBtb2RlIHdpdGggVUkgKHRoZSBkZWZhdWx0IGlzIGhlYWRsZXNzIG1vZGUpXCIpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbihcIi1kLCAtLWRlbGF5IDxtaWxpc2Vjb25kcz5cIiwgXCJEZWxheSBiZXR3ZWVuIHRoZSBicm93c2VyIGFjdGlvbnMsIHVzZWZ1bCBpbiBoZWFkZWQgbW9kZVwiKVxuICAgIC5hcmdQYXJzZXIoZ2V0SW50KVxuICAgIC5kZWZhdWx0KDApXG4gIClcbiAgLm9wdGlvbihcIi1jLCAtLWNvbnRpbnVlXCIsIFwiQ29udGludWUgdGhlIHRlc3QgYWZ0ZXIgYSBmYWlsdXJlICh0aGUgZGVmYXVsdCBpcyBhYm9ydCBvbiBlcnJvcilcIilcbiAgLnBhcnNlKHByb2Nlc3MuYXJndik7XG5cbi8vIHBhcnNlIG9wdGlvbnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lXG5jb25zdCBvcHRpb25zID0gcHJvZ3JhbS5vcHRzKCk7XG5cbmNvbnN0IHB1cHBldGVlckxhdW5jaE9wdGlvbnMgPSB7XG4gIC8vIFwid2ViRHJpdmVyQmlEaVwiIGRvZXMgbm90IHdvcmsgd2l0aCBvbGQgRmlyZUZveCwgY29tbWVudCBpdCBvdXQgaWYgbmVlZGVkXG4gIHByb3RvY29sOiBcIndlYkRyaXZlckJpRGlcIiBhcyBQcm90b2NvbFR5cGUsXG4gIGhlYWRsZXNzOiAhb3B0aW9ucy5oZWFkZWQsXG4gIGlnbm9yZUhUVFBTRXJyb3JzOiB0cnVlLFxuICB0aW1lb3V0OiAzMDAwMCxcbiAgc2xvd01vOiBvcHRpb25zLmRlbGF5LFxuICBkZWZhdWx0Vmlld3BvcnQ6IHtcbiAgICB3aWR0aDogMTI4MCxcbiAgICBoZWlnaHQ6IDc2OFxuICB9LFxuICAuLi5icm93c2VyU2V0dGluZ3Mob3B0aW9ucy5icm93c2VyKVxufVxuXG5leHBvcnQgeyBib29sZWFuRW52LCBvcHRpb25zLCBwdXBwZXRlZXJMYXVuY2hPcHRpb25zIH07XG4iLCJpbXBvcnQgcHVwcGV0ZWVyLCB7IHR5cGUgUGFnZSB9IGZyb20gXCJwdXBwZXRlZXItY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgTG9naW5Bc1Jvb3RQYWdlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXNzd29yZElucHV0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJpbnB1dCNwYXNzd29yZFwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ0luQnV0dG9uID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJidXR0b25bdHlwZT0nc3VibWl0J11cIik7XG5cbiAgICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9nSW4ocGFzc3dvcmQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLnBhc3N3b3JkSW5wdXQoKS5maWxsKHBhc3N3b3JkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dJbkJ1dHRvbigpLmNsaWNrKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBQYWdlIH0gZnJvbSBcInB1cHBldGVlci1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBTaWRlYmFyUGFnZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWdlOiBQYWdlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3ZlcnZpZXdMaW5rID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJhW2hyZWY9JyMvb3ZlcnZpZXcnXVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsaXphdGlvbkxpbmsgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImFbaHJlZj0nIy9sMTBuJ11cIik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBuZXR3b3JrTGluayA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYVtocmVmPScjL25ldHdvcmsnXVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VMaW5rID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJhW2hyZWY9JyMvc3RvcmFnZSddXCIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc29mdHdhcmVMaW5rID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJhW2hyZWY9JyMvc29mdHdhcmUnXVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVzZXJzTGluayA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYVtocmVmPScjL3VzZXJzJ11cIik7XG4gICAgXG4gICAgY29uc3RydWN0b3IocGFnZTogUGFnZSkge1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIH1cblxuICAgIGFzeW5jIGdvVG9PdmVydmlldygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5vdmVydmlld0xpbmsoKS5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIGdvVG9Mb2NhbGl6YXRpb24oKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9jYWxpemF0aW9uTGluaygpLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ29Ub05ldHdvcmsoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya0xpbmsoKS5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIGdvVG9TdG9yYWdlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VMaW5rKCkuY2xpY2soKTtcbiAgICB9XG5cbiAgICBhc3luYyBnb1RvU29mdHdhcmUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc29mdHdhcmVMaW5rKCkuY2xpY2soKTtcbiAgICB9XG5cbiAgICBhc3luYyBnb1RvVXNlcnMoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXNlcnNMaW5rKCkuY2xpY2soKTtcbiAgICB9XG5cbn1cbiIsImltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gXCJwdXBwZXRlZXItY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUVuY3J5cHRpb25QYWdlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbmNyeXB0VGhlU3lzdGVtQ2hlY2tib3ggPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImxhYmVsW2NsYXNzPSdwZi12NS1jLXN3aXRjaCddID4gaW5wdXRbdHlwZT0nY2hlY2tib3gnXVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhc3N3b3JkSW5wdXQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcIiNwYXNzd29yZFwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhc3N3b3JkQ29uZmlybWF0aW9uSW5wdXQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcIiNwYXNzd29yZENvbmZpcm1hdGlvblwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjY2VwdEJ1dHRvbiA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYnV0dG9uOjotcC10ZXh0KEFjY2VwdClcIik7XG5cbiAgICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxuXG4gICAgYXN5bmMgZW5jcnlwdChwYXNzd29yZDogc3RyaW5nKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdFRoZVN5c3RlbUNoZWNrYm94KCkuY2xpY2soKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXNzd29yZElucHV0KCkuZmlsbChwYXNzd29yZCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGFzc3dvcmRDb25maXJtYXRpb25JbnB1dCgpLmZpbGwocGFzc3dvcmQpO1xuICAgICAgICBhd2FpdCB0aGlzLmFjY2VwdEJ1dHRvbigpLmNsaWNrKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBQYWdlIH0gZnJvbSBcInB1cHBldGVlci1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlUGFnZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWdlOiBQYWdlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZW5hYmxlQnV0dG9uID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJidXR0b246Oi1wLXRleHQoRW5hYmxlKVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZWREaXYgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImRpdjo6LXAtdGV4dChlbmFibGVkKVwiKTtcbiAgICBcbiAgICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxuXG4gICAgYXN5bmMgZW5hYmxlRW5jcnlwdGlvbigpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbmFibGVCdXR0b24oKS5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIHZlcmlmeUVuY3J5cHRpb25FbmFibGVkKCkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuYWJsZWREaXYoKS53YWl0KCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHB1cHBldGVlciwgeyB0eXBlIEJyb3dzZXIsIHR5cGUgUGFnZSB9IGZyb20gXCJwdXBwZXRlZXItY29yZVwiO1xuXG5pbXBvcnQgeyBpdCBhcyB0ZXN0SXQsIGRlc2NyaWJlLCBiZWZvcmUsIGFmdGVyIH0gZnJvbSBcIm5vZGU6dGVzdFwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwibm9kZTphc3NlcnQvc3RyaWN0XCI7XG5cbmltcG9ydCB7IGJvb2xlYW5FbnYsIG9wdGlvbnMsIHB1cHBldGVlckxhdW5jaE9wdGlvbnMgfSBmcm9tIFwiLi4vY29uZmlndXJhdGlvblwiO1xuXG5pbXBvcnQgeyBMb2dpbkFzUm9vdFBhZ2UgfSBmcm9tIFwiLi4vcGFnZXMvbG9naW4tYXMtcm9vdC1wYWdlXCI7XG5pbXBvcnQgeyBTdG9yYWdlUGFnZSB9IGZyb20gXCIuLi9wYWdlcy9zdG9yYWdlLXBhZ2VcIjtcbmltcG9ydCB7IFN0b3JhZ2VFbmNyeXB0aW9uUGFnZSB9IGZyb20gXCIuLi9wYWdlcy9zdG9yYWdlLWVuY3J5cHRpb24tcGFnZVwiO1xuaW1wb3J0IHsgU2lkZWJhclBhZ2UgfSBmcm9tIFwiLi4vcGFnZXMvc2lkZWJhci1wYWdlXCI7XG5cbmxldCBwYWdlOiBQYWdlO1xubGV0IGJyb3dzZXI6IEJyb3dzZXI7XG5sZXQgZmFpbGVkID0gZmFsc2U7XG5cbi8vIGRlZmluZSBpdCgpIGFzIGEgd3JhcHBlciB3aGljaCBkdW1wcyB0aGUgcGFnZSBvbiBhIGZhaWx1cmVcbmFzeW5jIGZ1bmN0aW9uIGl0KGxhYmVsOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8dm9pZD4sIHRpbWVvdXQ/OiBudW1iZXIpIHtcbiAgdGVzdEl0KGxhYmVsLFxuICAgIC8vIGFib3J0IHdoZW4gdGhlIHRlc3QgdGFrZXMgbW9yZSB0aGFuIG9uZSBtaW51dGVcbiAgICB7IHRpbWVvdXQ6IHRpbWVvdXQgfHwgNjAwMDAgfSxcbiAgICBhc3luYyAodCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGZhaWxlZClcbiAgICAgICAgICB0LnNraXAoKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgYXdhaXQgdGVzdCgpO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5jb250aW51ZSkgZmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHBhZ2UpIHtcbiAgICAgICAgICAvLyBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGhlIGRhdGFcbiAgICAgICAgICBjb25zdCBkaXIgPSBcImxvZ1wiO1xuICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSBmcy5ta2RpclN5bmMoZGlyKTtcblxuICAgICAgICAgIC8vIGJhc2UgZmlsZSBuYW1lIGZvciB0aGUgZHVtcHNcbiAgICAgICAgICBjb25zdCBuYW1lID0gcGF0aC5qb2luKGRpciwgbGFiZWwucmVwbGFjZSgvW15hLXpBLVowLTldL2csIFwiX1wiKSk7XG4gICAgICAgICAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogbmFtZSArIFwiLnBuZ1wiIH0pO1xuICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCBwYWdlLmNvbnRlbnQoKTtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG5hbWUgKyBcIi5odG1sXCIsIGh0bWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGVzdCBmYWlsZWQhXCIsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH0pO1xufTtcblxuY29uc3QgYWdhbWFJbnN0YWxsID0gYm9vbGVhbkVudihcIkFHQU1BX0lOU1RBTExcIiwgdHJ1ZSk7XG5cbmRlc2NyaWJlKFwiZnVsbCBkaXNrIGVuY3J5cHRpb25cIiwgZnVuY3Rpb24gKCkge1xuICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKHB1cHBldGVlckxhdW5jaE9wdGlvbnMpO1xuICAgIHBhZ2UgPSBhd2FpdCBicm93c2VyLm5ld1BhZ2UoKTtcbiAgICBwYWdlLnNldERlZmF1bHRUaW1lb3V0KDIwMDAwKTtcbiAgICBhd2FpdCBwYWdlLmdvdG8ob3B0aW9ucy51cmwsIHsgdGltZW91dDogNjAwMDAsIHdhaXRVbnRpbDogXCJkb21jb250ZW50bG9hZGVkXCIgfSk7XG4gIH0pO1xuXG4gIGFmdGVyKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBwYWdlLmNsb3NlKCk7XG4gICAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhdmUgQWdhbWEgcGFnZSB0aXRsZVwiLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChhd2FpdCBwYWdlLnRpdGxlKCksIFwiQWdhbWFcIik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGFsbG93cyBsb2dnaW5nIGluXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBsb2dpbkFzUm9vdCA9IG5ldyBMb2dpbkFzUm9vdFBhZ2UocGFnZSk7XG4gICAgYXdhaXQgbG9naW5Bc1Jvb3QubG9nSW4ob3B0aW9ucy5wYXNzd29yZCk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGVuYWJsZSBlbmNyeXB0aW9uXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzdG9yYWdlID0gbmV3IFN0b3JhZ2VQYWdlKHBhZ2UpO1xuICAgIGNvbnN0IHN0b3JhZ2VFbmNyeXB0aW9uID0gbmV3IFN0b3JhZ2VFbmNyeXB0aW9uUGFnZShwYWdlKTtcbiAgICBjb25zdCBzaWRlYmFyID0gbmV3IFNpZGViYXJQYWdlKHBhZ2UpO1xuXG4gICAgYXdhaXQgc2lkZWJhci5nb1RvU3RvcmFnZSgpO1xuICAgIGF3YWl0IHN0b3JhZ2UuZW5hYmxlRW5jcnlwdGlvbigpO1xuICAgIGF3YWl0IHN0b3JhZ2VFbmNyeXB0aW9uLmVuY3J5cHQob3B0aW9ucy5wYXNzd29yZCk7XG4gICAgYXdhaXQgc3RvcmFnZS52ZXJpZnlFbmNyeXB0aW9uRW5hYmxlZCgpO1xuICB9KTtcblxuICBpdChcInNob3VsZCBiZSByZWFkeSBmb3IgaW5zdGFsbGF0aW9uXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzaWRlYmFyID0gbmV3IFNpZGViYXJQYWdlKHBhZ2UpO1xuICAgIGF3YWl0IHNpZGViYXIuZ29Ub092ZXJ2aWV3KCk7XG4gICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiYnV0dG9uOjotcC10ZXh0KEluc3RhbGwpXCIpLndhaXQoKTtcbiAgfSk7XG5cbiAgaWYgKGFnYW1hSW5zdGFsbCA9PT0gdHJ1ZSkge1xuICAgIGl0KFwic2hvdWxkIHN0YXJ0IGluc3RhbGxhdGlvblwiLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJidXR0b246Oi1wLXRleHQoJ0luc3RhbGwnKVwiKS5jbGljaygpO1xuICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiYnV0dG9uOjotcC10ZXh0KCdDb250aW51ZScpXCIpLmNsaWNrKCk7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCI6Oi1wLXRleHQoSW5zdGFsbGluZyB0aGUpXCIpLndhaXQoKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGZpbmlzaCBpbnN0YWxsYXRpb25cIiwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgcGFnZVxuICAgICAgICAubG9jYXRvcihcImgyOjotcC10ZXh0KCdDb25ncmF0dWxhdGlvbnMhJylcIilcbiAgICAgICAgLnNldFRpbWVvdXQoMTUgKiA2MCAqIDEwMDApXG4gICAgICAgIC53YWl0KCk7XG4gICAgfSwgMTUgKiA2MCAqIDEwMDApO1xuICB9XG59KTtcbiIsInZhciB0aHJvdWdoID0gcmVxdWlyZSgndGhyb3VnaCcpO1xudmFyIGJ6MiA9IHJlcXVpcmUoJy4vbGliL2J6aXAyJyk7XG52YXIgYml0SXRlcmF0b3IgPSByZXF1aXJlKCcuL2xpYi9iaXRfaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmJ6aXAyU3RyZWFtO1xuXG5mdW5jdGlvbiB1bmJ6aXAyU3RyZWFtKCkge1xuICAgIHZhciBidWZmZXJRdWV1ZSA9IFtdO1xuICAgIHZhciBoYXNCeXRlcyA9IDA7XG4gICAgdmFyIGJsb2NrU2l6ZSA9IDA7XG4gICAgdmFyIGJyb2tlbiA9IGZhbHNlO1xuICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgdmFyIGJpdFJlYWRlciA9IG51bGw7XG4gICAgdmFyIHN0cmVhbUNSQyA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBkZWNvbXByZXNzQmxvY2socHVzaCl7XG4gICAgICAgIGlmKCFibG9ja1NpemUpe1xuICAgICAgICAgICAgYmxvY2tTaXplID0gYnoyLmhlYWRlcihiaXRSZWFkZXIpO1xuICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKFwiZ290IGhlYWRlciBvZlwiLCBibG9ja1NpemUpO1xuICAgICAgICAgICAgc3RyZWFtQ1JDID0gMDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHZhciBidWZzaXplID0gMTAwMDAwICogYmxvY2tTaXplO1xuICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBJbnQzMkFycmF5KGJ1ZnNpemUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgY2h1bmsgPSBbXTtcbiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oYikge1xuICAgICAgICAgICAgICAgIGNodW5rLnB1c2goYik7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzdHJlYW1DUkMgPSBiejIuZGVjb21wcmVzcyhiaXRSZWFkZXIsIGYsIGJ1ZiwgYnVmc2l6ZSwgc3RyZWFtQ1JDKTtcbiAgICAgICAgICAgIGlmIChzdHJlYW1DUkMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyByZXNldCBmb3IgbmV4dCBiemlwMiBoZWFkZXJcbiAgICAgICAgICAgICAgICBibG9ja1NpemUgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcignZGVjb21wcmVzc2VkJywgY2h1bmsubGVuZ3RoLCdieXRlcycpO1xuICAgICAgICAgICAgICAgIHB1c2goQnVmZmVyLmZyb20oY2h1bmspKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBvdXRsZW5ndGggPSAwO1xuICAgIGZ1bmN0aW9uIGRlY29tcHJlc3NBbmRRdWV1ZShzdHJlYW0pIHtcbiAgICAgICAgaWYgKGJyb2tlbikgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGRlY29tcHJlc3NCbG9jayhmdW5jdGlvbihkKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnF1ZXVlKGQpO1xuICAgICAgICAgICAgICAgIGlmIChkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcignd3JpdGUgYXQnLCBvdXRsZW5ndGgudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGVuZ3RoICs9IGQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcignd3JpdHRlbiBFT1MnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICAgICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhyb3VnaChcbiAgICAgICAgZnVuY3Rpb24gd3JpdGUoZGF0YSkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKCdyZWNlaXZlZCcsIGRhdGEubGVuZ3RoLCdieXRlcyBpbicsIHR5cGVvZiBkYXRhKTtcbiAgICAgICAgICAgIGJ1ZmZlclF1ZXVlLnB1c2goZGF0YSk7XG4gICAgICAgICAgICBoYXNCeXRlcyArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChiaXRSZWFkZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBiaXRSZWFkZXIgPSBiaXRJdGVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoIWJyb2tlbiAmJiBoYXNCeXRlcyAtIGJpdFJlYWRlci5ieXRlc1JlYWQgKyAxID49ICgoMjUwMDAgKyAxMDAwMDAgKiBibG9ja1NpemUpIHx8IDQpKXtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoJ2RlY29tcHJlc3Npbmcgd2l0aCcsIGhhc0J5dGVzIC0gYml0UmVhZGVyLmJ5dGVzUmVhZCArIDEsICdieXRlcyBpbiBidWZmZXInKTtcbiAgICAgICAgICAgICAgICBkZWNvbXByZXNzQW5kUXVldWUodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uIGVuZCh4KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoeCwnbGFzdCBjb21wcmVzc2luZyB3aXRoJywgaGFzQnl0ZXMsICdieXRlcyBpbiBidWZmZXInKTtcbiAgICAgICAgICAgIHdoaWxlICghYnJva2VuICYmIGJpdFJlYWRlciAmJiBoYXNCeXRlcyA+IGJpdFJlYWRlci5ieXRlc1JlYWQpe1xuICAgICAgICAgICAgICAgIGRlY29tcHJlc3NBbmRRdWV1ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYnJva2VuKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbUNSQyAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihcImlucHV0IHN0cmVhbSBlbmRlZCBwcmVtYXR1cmVseVwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG59XG5cbiIsInZhciBCSVRNQVNLID0gWzAsIDB4MDEsIDB4MDMsIDB4MDcsIDB4MEYsIDB4MUYsIDB4M0YsIDB4N0YsIDB4RkZdO1xuXG4vLyByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZWFkcyBiaXRzLlxuLy8gdGFrZXMgYSBidWZmZXIgaXRlcmF0b3IgYXMgaW5wdXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYml0SXRlcmF0b3IobmV4dEJ1ZmZlcikge1xuICAgIHZhciBiaXQgPSAwLCBieXRlID0gMDtcbiAgICB2YXIgYnl0ZXMgPSBuZXh0QnVmZmVyKCk7XG4gICAgdmFyIGYgPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmIChuID09PSBudWxsICYmIGJpdCAhPSAwKSB7ICAvLyBhbGlnbiB0byBieXRlIGJvdW5kYXJ5XG4gICAgICAgICAgICBiaXQgPSAwXG4gICAgICAgICAgICBieXRlKys7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICAgIHdoaWxlKG4gPiAwKSB7XG4gICAgICAgICAgICBpZiAoYnl0ZSA+PSBieXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBieXRlID0gMDtcbiAgICAgICAgICAgICAgICBieXRlcyA9IG5leHRCdWZmZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBsZWZ0ID0gOCAtIGJpdDtcbiAgICAgICAgICAgIGlmIChiaXQgPT09IDAgJiYgbiA+IDApXG4gICAgICAgICAgICAgICAgZi5ieXRlc1JlYWQrKztcbiAgICAgICAgICAgIGlmIChuID49IGxlZnQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPDw9IGxlZnQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0IHw9IChCSVRNQVNLW2xlZnRdICYgYnl0ZXNbYnl0ZSsrXSk7XG4gICAgICAgICAgICAgICAgYml0ID0gMDtcbiAgICAgICAgICAgICAgICBuIC09IGxlZnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA8PD0gbjtcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gKChieXRlc1tieXRlXSAmIChCSVRNQVNLW25dIDw8ICg4IC0gbiAtIGJpdCkpKSA+PiAoOCAtIG4gLSBiaXQpKTtcbiAgICAgICAgICAgICAgICBiaXQgKz0gbjtcbiAgICAgICAgICAgICAgICBuID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgZi5ieXRlc1JlYWQgPSAwO1xuICAgIHJldHVybiBmO1xufTtcbiIsIi8qIFxuICBiemlwMi5qcyAtIGEgc21hbGwgYnppcDIgZGVjb21wcmVzc2lvbiBpbXBsZW1lbnRhdGlvblxuICBcbiAgQ29weXJpZ2h0IDIwMTEgYnkgYW50aW1hdHRlcjE1IChhbnRpbWF0dGVyMTVAZ21haWwuY29tKVxuICBcbiAgQmFzZWQgb24gbWljcm8tYnVuemlwIGJ5IFJvYiBMYW5kbGV5IChyb2JAbGFuZGxleS5uZXQpLlxuXG4gIENvcHlyaWdodCAoYykgMjAxMSBieSBhbnRpbWF0dGVyMTUgKGFudGltYXR0ZXIxNUBnbWFpbC5jb20pLlxuXG4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4gIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSxcbiAgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSxcbiAgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlXG4gIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gIFxuICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgXG4gIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsXG4gIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEhcbiAgVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuKi9cbmZ1bmN0aW9uIEJ6aXAyRXJyb3IobWVzc2FnZSkge1xuICAgIHRoaXMubmFtZSA9ICdCemlwMkVycm9yJztcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xufVxuQnppcDJFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3I7XG4gXG52YXIgbWVzc2FnZSA9IHtcbiAgICBFcnJvcjogZnVuY3Rpb24obWVzc2FnZSkge3Rocm93IG5ldyBCemlwMkVycm9yKG1lc3NhZ2UpO31cbn07XG5cbnZhciBiemlwMiA9IHt9O1xuYnppcDIuQnppcDJFcnJvciA9IEJ6aXAyRXJyb3I7XG5cbmJ6aXAyLmNyY1RhYmxlID1cbltcbiAgIDB4MDAwMDAwMDAsIDB4MDRjMTFkYjcsIDB4MDk4MjNiNmUsIDB4MGQ0MzI2ZDksXG4gICAweDEzMDQ3NmRjLCAweDE3YzU2YjZiLCAweDFhODY0ZGIyLCAweDFlNDc1MDA1LFxuICAgMHgyNjA4ZWRiOCwgMHgyMmM5ZjAwZiwgMHgyZjhhZDZkNiwgMHgyYjRiY2I2MSxcbiAgIDB4MzUwYzliNjQsIDB4MzFjZDg2ZDMsIDB4M2M4ZWEwMGEsIDB4Mzg0ZmJkYmQsXG4gICAweDRjMTFkYjcwLCAweDQ4ZDBjNmM3LCAweDQ1OTNlMDFlLCAweDQxNTJmZGE5LFxuICAgMHg1ZjE1YWRhYywgMHg1YmQ0YjAxYiwgMHg1Njk3OTZjMiwgMHg1MjU2OGI3NSxcbiAgIDB4NmExOTM2YzgsIDB4NmVkODJiN2YsIDB4NjM5YjBkYTYsIDB4Njc1YTEwMTEsXG4gICAweDc5MWQ0MDE0LCAweDdkZGM1ZGEzLCAweDcwOWY3YjdhLCAweDc0NWU2NmNkLFxuICAgMHg5ODIzYjZlMCwgMHg5Y2UyYWI1NywgMHg5MWExOGQ4ZSwgMHg5NTYwOTAzOSxcbiAgIDB4OGIyN2MwM2MsIDB4OGZlNmRkOGIsIDB4ODJhNWZiNTIsIDB4ODY2NGU2ZTUsXG4gICAweGJlMmI1YjU4LCAweGJhZWE0NmVmLCAweGI3YTk2MDM2LCAweGIzNjg3ZDgxLFxuICAgMHhhZDJmMmQ4NCwgMHhhOWVlMzAzMywgMHhhNGFkMTZlYSwgMHhhMDZjMGI1ZCxcbiAgIDB4ZDQzMjZkOTAsIDB4ZDBmMzcwMjcsIDB4ZGRiMDU2ZmUsIDB4ZDk3MTRiNDksXG4gICAweGM3MzYxYjRjLCAweGMzZjcwNmZiLCAweGNlYjQyMDIyLCAweGNhNzUzZDk1LFxuICAgMHhmMjNhODAyOCwgMHhmNmZiOWQ5ZiwgMHhmYmI4YmI0NiwgMHhmZjc5YTZmMSxcbiAgIDB4ZTEzZWY2ZjQsIDB4ZTVmZmViNDMsIDB4ZThiY2NkOWEsIDB4ZWM3ZGQwMmQsXG4gICAweDM0ODY3MDc3LCAweDMwNDc2ZGMwLCAweDNkMDQ0YjE5LCAweDM5YzU1NmFlLFxuICAgMHgyNzgyMDZhYiwgMHgyMzQzMWIxYywgMHgyZTAwM2RjNSwgMHgyYWMxMjA3MixcbiAgIDB4MTI4ZTlkY2YsIDB4MTY0ZjgwNzgsIDB4MWIwY2E2YTEsIDB4MWZjZGJiMTYsXG4gICAweDAxOGFlYjEzLCAweDA1NGJmNmE0LCAweDA4MDhkMDdkLCAweDBjYzljZGNhLFxuICAgMHg3ODk3YWIwNywgMHg3YzU2YjZiMCwgMHg3MTE1OTA2OSwgMHg3NWQ0OGRkZSxcbiAgIDB4NmI5M2RkZGIsIDB4NmY1MmMwNmMsIDB4NjIxMWU2YjUsIDB4NjZkMGZiMDIsXG4gICAweDVlOWY0NmJmLCAweDVhNWU1YjA4LCAweDU3MWQ3ZGQxLCAweDUzZGM2MDY2LFxuICAgMHg0ZDliMzA2MywgMHg0OTVhMmRkNCwgMHg0NDE5MGIwZCwgMHg0MGQ4MTZiYSxcbiAgIDB4YWNhNWM2OTcsIDB4YTg2NGRiMjAsIDB4YTUyN2ZkZjksIDB4YTFlNmUwNGUsXG4gICAweGJmYTFiMDRiLCAweGJiNjBhZGZjLCAweGI2MjM4YjI1LCAweGIyZTI5NjkyLFxuICAgMHg4YWFkMmIyZiwgMHg4ZTZjMzY5OCwgMHg4MzJmMTA0MSwgMHg4N2VlMGRmNixcbiAgIDB4OTlhOTVkZjMsIDB4OWQ2ODQwNDQsIDB4OTAyYjY2OWQsIDB4OTRlYTdiMmEsXG4gICAweGUwYjQxZGU3LCAweGU0NzUwMDUwLCAweGU5MzYyNjg5LCAweGVkZjczYjNlLFxuICAgMHhmM2IwNmIzYiwgMHhmNzcxNzY4YywgMHhmYTMyNTA1NSwgMHhmZWYzNGRlMixcbiAgIDB4YzZiY2YwNWYsIDB4YzI3ZGVkZTgsIDB4Y2YzZWNiMzEsIDB4Y2JmZmQ2ODYsXG4gICAweGQ1Yjg4NjgzLCAweGQxNzk5YjM0LCAweGRjM2FiZGVkLCAweGQ4ZmJhMDVhLFxuICAgMHg2OTBjZTBlZSwgMHg2ZGNkZmQ1OSwgMHg2MDhlZGI4MCwgMHg2NDRmYzYzNyxcbiAgIDB4N2EwODk2MzIsIDB4N2VjOThiODUsIDB4NzM4YWFkNWMsIDB4Nzc0YmIwZWIsXG4gICAweDRmMDQwZDU2LCAweDRiYzUxMGUxLCAweDQ2ODYzNjM4LCAweDQyNDcyYjhmLFxuICAgMHg1YzAwN2I4YSwgMHg1OGMxNjYzZCwgMHg1NTgyNDBlNCwgMHg1MTQzNWQ1MyxcbiAgIDB4MjUxZDNiOWUsIDB4MjFkYzI2MjksIDB4MmM5ZjAwZjAsIDB4Mjg1ZTFkNDcsXG4gICAweDM2MTk0ZDQyLCAweDMyZDg1MGY1LCAweDNmOWI3NjJjLCAweDNiNWE2YjliLFxuICAgMHgwMzE1ZDYyNiwgMHgwN2Q0Y2I5MSwgMHgwYTk3ZWQ0OCwgMHgwZTU2ZjBmZixcbiAgIDB4MTAxMWEwZmEsIDB4MTRkMGJkNGQsIDB4MTk5MzliOTQsIDB4MWQ1Mjg2MjMsXG4gICAweGYxMmY1NjBlLCAweGY1ZWU0YmI5LCAweGY4YWQ2ZDYwLCAweGZjNmM3MGQ3LFxuICAgMHhlMjJiMjBkMiwgMHhlNmVhM2Q2NSwgMHhlYmE5MWJiYywgMHhlZjY4MDYwYixcbiAgIDB4ZDcyN2JiYjYsIDB4ZDNlNmE2MDEsIDB4ZGVhNTgwZDgsIDB4ZGE2NDlkNmYsXG4gICAweGM0MjNjZDZhLCAweGMwZTJkMGRkLCAweGNkYTFmNjA0LCAweGM5NjBlYmIzLFxuICAgMHhiZDNlOGQ3ZSwgMHhiOWZmOTBjOSwgMHhiNGJjYjYxMCwgMHhiMDdkYWJhNyxcbiAgIDB4YWUzYWZiYTIsIDB4YWFmYmU2MTUsIDB4YTdiOGMwY2MsIDB4YTM3OWRkN2IsXG4gICAweDliMzY2MGM2LCAweDlmZjc3ZDcxLCAweDkyYjQ1YmE4LCAweDk2NzU0NjFmLFxuICAgMHg4ODMyMTYxYSwgMHg4Y2YzMGJhZCwgMHg4MWIwMmQ3NCwgMHg4NTcxMzBjMyxcbiAgIDB4NWQ4YTkwOTksIDB4NTk0YjhkMmUsIDB4NTQwOGFiZjcsIDB4NTBjOWI2NDAsXG4gICAweDRlOGVlNjQ1LCAweDRhNGZmYmYyLCAweDQ3MGNkZDJiLCAweDQzY2RjMDljLFxuICAgMHg3YjgyN2QyMSwgMHg3ZjQzNjA5NiwgMHg3MjAwNDY0ZiwgMHg3NmMxNWJmOCxcbiAgIDB4Njg4NjBiZmQsIDB4NmM0NzE2NGEsIDB4NjEwNDMwOTMsIDB4NjVjNTJkMjQsXG4gICAweDExOWI0YmU5LCAweDE1NWE1NjVlLCAweDE4MTk3MDg3LCAweDFjZDg2ZDMwLFxuICAgMHgwMjlmM2QzNSwgMHgwNjVlMjA4MiwgMHgwYjFkMDY1YiwgMHgwZmRjMWJlYyxcbiAgIDB4Mzc5M2E2NTEsIDB4MzM1MmJiZTYsIDB4M2UxMTlkM2YsIDB4M2FkMDgwODgsXG4gICAweDI0OTdkMDhkLCAweDIwNTZjZDNhLCAweDJkMTVlYmUzLCAweDI5ZDRmNjU0LFxuICAgMHhjNWE5MjY3OSwgMHhjMTY4M2JjZSwgMHhjYzJiMWQxNywgMHhjOGVhMDBhMCxcbiAgIDB4ZDZhZDUwYTUsIDB4ZDI2YzRkMTIsIDB4ZGYyZjZiY2IsIDB4ZGJlZTc2N2MsXG4gICAweGUzYTFjYmMxLCAweGU3NjBkNjc2LCAweGVhMjNmMGFmLCAweGVlZTJlZDE4LFxuICAgMHhmMGE1YmQxZCwgMHhmNDY0YTBhYSwgMHhmOTI3ODY3MywgMHhmZGU2OWJjNCxcbiAgIDB4ODliOGZkMDksIDB4OGQ3OWUwYmUsIDB4ODAzYWM2NjcsIDB4ODRmYmRiZDAsXG4gICAweDlhYmM4YmQ1LCAweDllN2Q5NjYyLCAweDkzM2ViMGJiLCAweDk3ZmZhZDBjLFxuICAgMHhhZmIwMTBiMSwgMHhhYjcxMGQwNiwgMHhhNjMyMmJkZiwgMHhhMmYzMzY2OCxcbiAgIDB4YmNiNDY2NmQsIDB4Yjg3NTdiZGEsIDB4YjUzNjVkMDMsIDB4YjFmNzQwYjRcbl07XG5cbmJ6aXAyLmFycmF5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICB2YXIgYml0ID0gMCwgYnl0ZSA9IDA7XG4gICAgdmFyIEJJVE1BU0sgPSBbMCwgMHgwMSwgMHgwMywgMHgwNywgMHgwRiwgMHgxRiwgMHgzRiwgMHg3RiwgMHhGRiBdO1xuICAgIHJldHVybiBmdW5jdGlvbihuKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgICB3aGlsZShuID4gMCkge1xuICAgICAgICAgICAgdmFyIGxlZnQgPSA4IC0gYml0O1xuICAgICAgICAgICAgaWYgKG4gPj0gbGVmdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA8PD0gbGVmdDtcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gKEJJVE1BU0tbbGVmdF0gJiBieXRlc1tieXRlKytdKTtcbiAgICAgICAgICAgICAgICBiaXQgPSAwO1xuICAgICAgICAgICAgICAgIG4gLT0gbGVmdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0IDw8PSBuO1xuICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAoKGJ5dGVzW2J5dGVdICYgKEJJVE1BU0tbbl0gPDwgKDggLSBuIC0gYml0KSkpID4+ICg4IC0gbiAtIGJpdCkpO1xuICAgICAgICAgICAgICAgIGJpdCArPSBuO1xuICAgICAgICAgICAgICAgIG4gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG4gICAgXG5iemlwMi5zaW1wbGUgPSBmdW5jdGlvbihzcmNidWZmZXIsIHN0cmVhbSkge1xuICAgIHZhciBiaXRzID0gYnppcDIuYXJyYXkoc3JjYnVmZmVyKTtcbiAgICB2YXIgc2l6ZSA9IGJ6aXAyLmhlYWRlcihiaXRzKTtcbiAgICB2YXIgcmV0ID0gZmFsc2U7XG4gICAgdmFyIGJ1ZnNpemUgPSAxMDAwMDAgKiBzaXplO1xuICAgIHZhciBidWYgPSBuZXcgSW50MzJBcnJheShidWZzaXplKTtcbiAgICBcbiAgICBkbyB7XG4gICAgICAgIHJldCA9IGJ6aXAyLmRlY29tcHJlc3MoYml0cywgc3RyZWFtLCBidWYsIGJ1ZnNpemUpOyAgICAgICAgXG4gICAgfSB3aGlsZSghcmV0KTtcbn1cblxuYnppcDIuaGVhZGVyID0gZnVuY3Rpb24oYml0cykge1xuICAgIHRoaXMuYnl0ZUNvdW50ID0gbmV3IEludDMyQXJyYXkoMjU2KTtcbiAgICB0aGlzLnN5bVRvQnl0ZSA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG4gICAgdGhpcy5tdGZTeW1ib2wgPSBuZXcgSW50MzJBcnJheSgyNTYpO1xuICAgIHRoaXMuc2VsZWN0b3JzID0gbmV3IFVpbnQ4QXJyYXkoMHg4MDAwKTtcblxuICAgIGlmIChiaXRzKDgqMykgIT0gNDM0ODUyMCkgbWVzc2FnZS5FcnJvcihcIk5vIG1hZ2ljIG51bWJlciBmb3VuZFwiKTtcblxuICAgIHZhciBpID0gYml0cyg4KSAtIDQ4O1xuICAgIGlmIChpIDwgMSB8fCBpID4gOSkgbWVzc2FnZS5FcnJvcihcIk5vdCBhIEJaSVAgYXJjaGl2ZVwiKTtcbiAgICByZXR1cm4gaTtcbn07XG5cblxuLy90YWtlcyBhIGZ1bmN0aW9uIGZvciByZWFkaW5nIHRoZSBibG9jayBkYXRhIChzdGFydGluZyB3aXRoIDB4MzE0MTU5MjY1MzU5KVxuLy9hIGJsb2NrIHNpemUgKDAtOSkgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byA5KVxuLy9hIGxlbmd0aCBhdCB3aGljaCB0byBzdG9wIGRlY29tcHJlc3NpbmcgYW5kIHJldHVybiB0aGUgb3V0cHV0XG5iemlwMi5kZWNvbXByZXNzID0gZnVuY3Rpb24oYml0cywgc3RyZWFtLCBidWYsIGJ1ZnNpemUsIHN0cmVhbUNSQykge1xuICAgIHZhciBNQVhfSFVGQ09ERV9CSVRTID0gMjA7XG4gICAgdmFyIE1BWF9TWU1CT0xTID0gMjU4O1xuICAgIHZhciBTWU1CT0xfUlVOQSA9IDA7XG4gICAgdmFyIFNZTUJPTF9SVU5CID0gMTtcbiAgICB2YXIgR1JPVVBfU0laRSA9IDUwO1xuICAgIHZhciBjcmMgPSAwIF4gKC0xKTtcbiAgICBcbiAgICBmb3IodmFyIGggPSAnJywgaSA9IDA7IGkgPCA2OyBpKyspIGggKz0gYml0cyg4KS50b1N0cmluZygxNik7XG4gICAgaWYgKGggPT0gXCIxNzcyNDUzODUwOTBcIikge1xuICAgICAgdmFyIGZpbmFsQ1JDID0gYml0cygzMil8MDtcbiAgICAgIGlmIChmaW5hbENSQyAhPT0gc3RyZWFtQ1JDKSBtZXNzYWdlLkVycm9yKFwiRXJyb3IgaW4gYnppcDI6IGNyYzMyIGRvIG5vdCBtYXRjaFwiKTtcbiAgICAgIC8vIGFsaWduIHN0cmVhbSB0byBieXRlXG4gICAgICBiaXRzKG51bGwpO1xuICAgICAgcmV0dXJuIG51bGw7IC8vIHJlc2V0IHN0cmVhbUNSQyBmb3IgbmV4dCBjYWxsXG4gICAgfVxuICAgIGlmIChoICE9IFwiMzE0MTU5MjY1MzU5XCIpIG1lc3NhZ2UuRXJyb3IoXCJlZWsgbm90IHZhbGlkIGJ6aXAgZGF0YVwiKTtcbiAgICB2YXIgY3JjYmxvY2sgPSBiaXRzKDMyKXwwOyAvLyBDUkMgY29kZVxuICAgIGlmIChiaXRzKDEpKSBtZXNzYWdlLkVycm9yKFwidW5zdXBwb3J0ZWQgb2Jzb2xldGUgdmVyc2lvblwiKTtcbiAgICB2YXIgb3JpZ1B0ciA9IGJpdHMoMjQpO1xuICAgIGlmIChvcmlnUHRyID4gYnVmc2l6ZSkgbWVzc2FnZS5FcnJvcihcIkluaXRpYWwgcG9zaXRpb24gbGFyZ2VyIHRoYW4gYnVmZmVyIHNpemVcIik7XG4gICAgdmFyIHQgPSBiaXRzKDE2KTtcbiAgICB2YXIgc3ltVG90YWwgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgIGlmICh0ICYgKDEgPDwgKDE1IC0gaSkpKSB7XG4gICAgICAgICAgICB2YXIgayA9IGJpdHMoMTYpO1xuICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgMTY7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChrICYgKDEgPDwgKDE1IC0gaikpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ltVG9CeXRlW3N5bVRvdGFsKytdID0gKDE2ICogaSkgKyBqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBncm91cENvdW50ID0gYml0cygzKTtcbiAgICBpZiAoZ3JvdXBDb3VudCA8IDIgfHwgZ3JvdXBDb3VudCA+IDYpIG1lc3NhZ2UuRXJyb3IoXCJhbm90aGVyIGVycm9yXCIpO1xuICAgIHZhciBuU2VsZWN0b3JzID0gYml0cygxNSk7XG4gICAgaWYgKG5TZWxlY3RvcnMgPT0gMCkgbWVzc2FnZS5FcnJvcihcIm1laFwiKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgZ3JvdXBDb3VudDsgaSsrKSB0aGlzLm10ZlN5bWJvbFtpXSA9IGk7XG5cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgblNlbGVjdG9yczsgaSsrKSB7XG4gICAgICAgIGZvcih2YXIgaiA9IDA7IGJpdHMoMSk7IGorKykgaWYgKGogPj0gZ3JvdXBDb3VudCkgbWVzc2FnZS5FcnJvcihcIndob29wcyBhbm90aGVyIGVycm9yXCIpO1xuICAgICAgICB2YXIgdWMgPSB0aGlzLm10ZlN5bWJvbFtqXTtcbiAgICAgICAgZm9yKHZhciBrID0gai0xOyBrPj0wOyBrLS0pIHtcbiAgICAgICAgICAgIHRoaXMubXRmU3ltYm9sW2srMV0gPSB0aGlzLm10ZlN5bWJvbFtrXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm10ZlN5bWJvbFswXSA9IHVjO1xuICAgICAgICB0aGlzLnNlbGVjdG9yc1tpXSA9IHVjO1xuICAgIH1cblxuICAgIHZhciBzeW1Db3VudCA9IHN5bVRvdGFsICsgMjtcbiAgICB2YXIgZ3JvdXBzID0gW107XG4gICAgdmFyIGxlbmd0aCA9IG5ldyBVaW50OEFycmF5KE1BWF9TWU1CT0xTKSxcbiAgICB0ZW1wID0gbmV3IFVpbnQxNkFycmF5KE1BWF9IVUZDT0RFX0JJVFMrMSk7XG5cbiAgICB2YXIgaHVmR3JvdXA7XG5cbiAgICBmb3IodmFyIGogPSAwOyBqIDwgZ3JvdXBDb3VudDsgaisrKSB7XG4gICAgICAgIHQgPSBiaXRzKDUpOyAvL2xlbmd0aHNcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHN5bUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHdoaWxlKHRydWUpe1xuICAgICAgICAgICAgICAgIGlmICh0IDwgMSB8fCB0ID4gTUFYX0hVRkNPREVfQklUUykgbWVzc2FnZS5FcnJvcihcIkkgZ2F2ZSB1cCBhIHdoaWxlIGFnbyBvbiB3cml0aW5nIGVycm9yIG1lc3NhZ2VzXCIpO1xuICAgICAgICAgICAgICAgIGlmICghYml0cygxKSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKCFiaXRzKDEpKSB0Kys7XG4gICAgICAgICAgICAgICAgZWxzZSB0LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZW5ndGhbaV0gPSB0O1xuICAgICAgICB9XG4gICAgICAgIHZhciAgbWluTGVuLCAgbWF4TGVuO1xuICAgICAgICBtaW5MZW4gPSBtYXhMZW4gPSBsZW5ndGhbMF07XG4gICAgICAgIGZvcih2YXIgaSA9IDE7IGkgPCBzeW1Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobGVuZ3RoW2ldID4gbWF4TGVuKSBtYXhMZW4gPSBsZW5ndGhbaV07XG4gICAgICAgICAgICBlbHNlIGlmIChsZW5ndGhbaV0gPCBtaW5MZW4pIG1pbkxlbiA9IGxlbmd0aFtpXTtcbiAgICAgICAgfVxuICAgICAgICBodWZHcm91cCA9IGdyb3Vwc1tqXSA9IHt9O1xuICAgICAgICBodWZHcm91cC5wZXJtdXRlID0gbmV3IEludDMyQXJyYXkoTUFYX1NZTUJPTFMpO1xuICAgICAgICBodWZHcm91cC5saW1pdCA9IG5ldyBJbnQzMkFycmF5KE1BWF9IVUZDT0RFX0JJVFMgKyAxKTtcbiAgICAgICAgaHVmR3JvdXAuYmFzZSA9IG5ldyBJbnQzMkFycmF5KE1BWF9IVUZDT0RFX0JJVFMgKyAxKTtcblxuICAgICAgICBodWZHcm91cC5taW5MZW4gPSBtaW5MZW47XG4gICAgICAgIGh1Zkdyb3VwLm1heExlbiA9IG1heExlbjtcbiAgICAgICAgdmFyIGJhc2UgPSBodWZHcm91cC5iYXNlO1xuICAgICAgICB2YXIgbGltaXQgPSBodWZHcm91cC5saW1pdDtcbiAgICAgICAgdmFyIHBwID0gMDtcbiAgICAgICAgZm9yKHZhciBpID0gbWluTGVuOyBpIDw9IG1heExlbjsgaSsrKVxuICAgICAgICBmb3IodmFyIHQgPSAwOyB0IDwgc3ltQ291bnQ7IHQrKylcbiAgICAgICAgaWYgKGxlbmd0aFt0XSA9PSBpKSBodWZHcm91cC5wZXJtdXRlW3BwKytdID0gdDtcbiAgICAgICAgZm9yKGkgPSBtaW5MZW47IGkgPD0gbWF4TGVuOyBpKyspIHRlbXBbaV0gPSBsaW1pdFtpXSA9IDA7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IHN5bUNvdW50OyBpKyspIHRlbXBbbGVuZ3RoW2ldXSsrO1xuICAgICAgICBwcCA9IHQgPSAwO1xuICAgICAgICBmb3IoaSA9IG1pbkxlbjsgaSA8IG1heExlbjsgaSsrKSB7XG4gICAgICAgICAgICBwcCArPSB0ZW1wW2ldO1xuICAgICAgICAgICAgbGltaXRbaV0gPSBwcCAtIDE7XG4gICAgICAgICAgICBwcCA8PD0gMTtcbiAgICAgICAgICAgIGJhc2VbaSsxXSA9IHBwIC0gKHQgKz0gdGVtcFtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbGltaXRbbWF4TGVuXSA9IHBwICsgdGVtcFttYXhMZW5dIC0gMTtcbiAgICAgICAgYmFzZVttaW5MZW5dID0gMDtcbiAgICB9XG5cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHsgXG4gICAgICAgIHRoaXMubXRmU3ltYm9sW2ldID0gaTtcbiAgICAgICAgdGhpcy5ieXRlQ291bnRbaV0gPSAwO1xuICAgIH1cbiAgICB2YXIgcnVuUG9zLCBjb3VudCwgc3ltQ291bnQsIHNlbGVjdG9yO1xuICAgIHJ1blBvcyA9IGNvdW50ID0gc3ltQ291bnQgPSBzZWxlY3RvciA9IDA7ICAgIFxuICAgIHdoaWxlKHRydWUpIHtcbiAgICAgICAgaWYgKCEoc3ltQ291bnQtLSkpIHtcbiAgICAgICAgICAgIHN5bUNvdW50ID0gR1JPVVBfU0laRSAtIDE7XG4gICAgICAgICAgICBpZiAoc2VsZWN0b3IgPj0gblNlbGVjdG9ycykgbWVzc2FnZS5FcnJvcihcIm1lb3cgaSdtIGEga2l0dHksIHRoYXQncyBhbiBlcnJvclwiKTtcbiAgICAgICAgICAgIGh1Zkdyb3VwID0gZ3JvdXBzW3RoaXMuc2VsZWN0b3JzW3NlbGVjdG9yKytdXTtcbiAgICAgICAgICAgIGJhc2UgPSBodWZHcm91cC5iYXNlO1xuICAgICAgICAgICAgbGltaXQgPSBodWZHcm91cC5saW1pdDtcbiAgICAgICAgfVxuICAgICAgICBpID0gaHVmR3JvdXAubWluTGVuO1xuICAgICAgICBqID0gYml0cyhpKTtcbiAgICAgICAgd2hpbGUodHJ1ZSkge1xuICAgICAgICAgICAgaWYgKGkgPiBodWZHcm91cC5tYXhMZW4pIG1lc3NhZ2UuRXJyb3IoXCJyYXdyIGknbSBhIGRpbm9zYXVyXCIpO1xuICAgICAgICAgICAgaWYgKGogPD0gbGltaXRbaV0pIGJyZWFrO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgaiA9IChqIDw8IDEpIHwgYml0cygxKTtcbiAgICAgICAgfVxuICAgICAgICBqIC09IGJhc2VbaV07XG4gICAgICAgIGlmIChqIDwgMCB8fCBqID49IE1BWF9TWU1CT0xTKSBtZXNzYWdlLkVycm9yKFwibW9vIGknbSBhIGNvd1wiKTtcbiAgICAgICAgdmFyIG5leHRTeW0gPSBodWZHcm91cC5wZXJtdXRlW2pdO1xuICAgICAgICBpZiAobmV4dFN5bSA9PSBTWU1CT0xfUlVOQSB8fCBuZXh0U3ltID09IFNZTUJPTF9SVU5CKSB7XG4gICAgICAgICAgICBpZiAoIXJ1blBvcyl7XG4gICAgICAgICAgICAgICAgcnVuUG9zID0gMTtcbiAgICAgICAgICAgICAgICB0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0U3ltID09IFNZTUJPTF9SVU5BKSB0ICs9IHJ1blBvcztcbiAgICAgICAgICAgIGVsc2UgdCArPSAyICogcnVuUG9zO1xuICAgICAgICAgICAgcnVuUG9zIDw8PSAxO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1blBvcykge1xuICAgICAgICAgICAgcnVuUG9zID0gMDtcbiAgICAgICAgICAgIGlmIChjb3VudCArIHQgPiBidWZzaXplKSBtZXNzYWdlLkVycm9yKFwiQm9vbS5cIik7XG4gICAgICAgICAgICB1YyA9IHRoaXMuc3ltVG9CeXRlW3RoaXMubXRmU3ltYm9sWzBdXTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZUNvdW50W3VjXSArPSB0O1xuICAgICAgICAgICAgd2hpbGUodC0tKSBidWZbY291bnQrK10gPSB1YztcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dFN5bSA+IHN5bVRvdGFsKSBicmVhaztcbiAgICAgICAgaWYgKGNvdW50ID49IGJ1ZnNpemUpIG1lc3NhZ2UuRXJyb3IoXCJJIGNhbid0IHRoaW5rIG9mIGFueXRoaW5nLiBFcnJvclwiKTtcbiAgICAgICAgaSA9IG5leHRTeW0gLSAxO1xuICAgICAgICB1YyA9IHRoaXMubXRmU3ltYm9sW2ldO1xuICAgICAgICBmb3IodmFyIGsgPSBpLTE7IGs+PTA7IGstLSkge1xuICAgICAgICAgICAgdGhpcy5tdGZTeW1ib2xbaysxXSA9IHRoaXMubXRmU3ltYm9sW2tdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubXRmU3ltYm9sWzBdID0gdWNcbiAgICAgICAgdWMgPSB0aGlzLnN5bVRvQnl0ZVt1Y107XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50W3VjXSsrO1xuICAgICAgICBidWZbY291bnQrK10gPSB1YztcbiAgICB9XG4gICAgaWYgKG9yaWdQdHIgPCAwIHx8IG9yaWdQdHIgPj0gY291bnQpIG1lc3NhZ2UuRXJyb3IoXCJJJ20gYSBtb25rZXkgYW5kIEknbSB0aHJvd2luZyBzb21ldGhpbmcgYXQgc29tZW9uZSwgbmFtZWx5IHlvdVwiKTtcbiAgICB2YXIgaiA9IDA7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICAgIGsgPSBqICsgdGhpcy5ieXRlQ291bnRbaV07XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50W2ldID0gajtcbiAgICAgICAgaiA9IGs7XG4gICAgfVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIHVjID0gYnVmW2ldICYgMHhmZjtcbiAgICAgICAgYnVmW3RoaXMuYnl0ZUNvdW50W3VjXV0gfD0gKGkgPDwgOCk7XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50W3VjXSsrO1xuICAgIH1cbiAgICB2YXIgcG9zID0gMCwgY3VycmVudCA9IDAsIHJ1biA9IDA7XG4gICAgaWYgKGNvdW50KSB7XG4gICAgICAgIHBvcyA9IGJ1ZltvcmlnUHRyXTtcbiAgICAgICAgY3VycmVudCA9IChwb3MgJiAweGZmKTtcbiAgICAgICAgcG9zID4+PSA4O1xuICAgICAgICBydW4gPSAtMTtcbiAgICB9XG4gICAgY291bnQgPSBjb3VudDtcbiAgICB2YXIgY29waWVzLCBwcmV2aW91cywgb3V0Ynl0ZTtcbiAgICB3aGlsZShjb3VudCkge1xuICAgICAgICBjb3VudC0tO1xuICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7XG4gICAgICAgIHBvcyA9IGJ1Zltwb3NdO1xuICAgICAgICBjdXJyZW50ID0gcG9zICYgMHhmZjtcbiAgICAgICAgcG9zID4+PSA4O1xuICAgICAgICBpZiAocnVuKysgPT0gMykge1xuICAgICAgICAgICAgY29waWVzID0gY3VycmVudDtcbiAgICAgICAgICAgIG91dGJ5dGUgPSBwcmV2aW91cztcbiAgICAgICAgICAgIGN1cnJlbnQgPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvcGllcyA9IDE7XG4gICAgICAgICAgICBvdXRieXRlID0gY3VycmVudDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZShjb3BpZXMtLSkge1xuICAgICAgICAgICAgY3JjID0gKChjcmMgPDwgOCkgXiB0aGlzLmNyY1RhYmxlWygoY3JjPj4yNCkgXiBvdXRieXRlKSAmIDB4RkZdKSYweEZGRkZGRkZGOyAvLyBjcmMzMlxuICAgICAgICAgICAgc3RyZWFtKG91dGJ5dGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50ICE9IHByZXZpb3VzKSBydW4gPSAwO1xuICAgIH1cblxuICAgIGNyYyA9IChjcmMgXiAoLTEpKSA+Pj4gMDtcbiAgICBpZiAoKGNyY3wwKSAhPSAoY3JjYmxvY2t8MCkpIG1lc3NhZ2UuRXJyb3IoXCJFcnJvciBpbiBiemlwMjogY3JjMzIgZG8gbm90IG1hdGNoXCIpO1xuICAgIHN0cmVhbUNSQyA9IChjcmMgXiAoKHN0cmVhbUNSQyA8PCAxKSB8IChzdHJlYW1DUkMgPj4+IDMxKSkpICYgMHhGRkZGRkZGRjtcbiAgICByZXR1cm4gc3RyZWFtQ1JDO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ6aXAyO1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuZnJvbUNhbGxiYWNrID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykgZm4uYXBwbHkodGhpcywgYXJncylcbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGFyZ3MucHVzaCgoZXJyLCByZXMpID0+IChlcnIgIT0gbnVsbCkgPyByZWplY3QoZXJyKSA6IHJlc29sdmUocmVzKSlcbiAgICAgICAgZm4uYXBwbHkodGhpcywgYXJncylcbiAgICAgIH0pXG4gICAgfVxuICB9LCAnbmFtZScsIHsgdmFsdWU6IGZuLm5hbWUgfSlcbn1cblxuZXhwb3J0cy5mcm9tUHJvbWlzZSA9IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgY29uc3QgY2IgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV1cbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncylcbiAgICBlbHNlIHtcbiAgICAgIGFyZ3MucG9wKClcbiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3MpLnRoZW4ociA9PiBjYihudWxsLCByKSwgY2IpXG4gICAgfVxuICB9LCAnbmFtZScsIHsgdmFsdWU6IGZuLm5hbWUgfSlcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBidWZmZXIgY29udGFpbnMgb25seSBjb3JyZWN0IFVURi04LlxuICogUG9ydGVkIGZyb20gaHR0cHM6Ly93d3cuY2wuY2FtLmFjLnVrLyU3RW1nazI1L3Vjcy91dGY4X2NoZWNrLmMgYnlcbiAqIE1hcmt1cyBLdWhuLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWYgVGhlIGJ1ZmZlciB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGBidWZgIGNvbnRhaW5zIG9ubHkgY29ycmVjdCBVVEYtOCwgZWxzZSBgZmFsc2VgXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRVVEY4KGJ1Zikge1xuICBjb25zdCBsZW4gPSBidWYubGVuZ3RoO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBpZiAoKGJ1ZltpXSAmIDB4ODApID09PSAweDAwKSB7ICAvLyAweHh4eHh4eFxuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZTApID09PSAweGMwKSB7ICAvLyAxMTB4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMSA9PT0gbGVuIHx8XG4gICAgICAgIChidWZbaSArIDFdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSAmIDB4ZmUpID09PSAweGMwICAvLyBvdmVybG9uZ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSArPSAyO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZjApID09PSAweGUwKSB7ICAvLyAxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMiA+PSBsZW4gfHxcbiAgICAgICAgKGJ1ZltpICsgMV0gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICAoYnVmW2kgKyAyXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIGJ1ZltpXSA9PT0gMHhlMCAmJiAoYnVmW2kgKyAxXSAmIDB4ZTApID09PSAweDgwIHx8ICAvLyBvdmVybG9uZ1xuICAgICAgICBidWZbaV0gPT09IDB4ZWQgJiYgKGJ1ZltpICsgMV0gJiAweGUwKSA9PT0gMHhhMCAgLy8gc3Vycm9nYXRlIChVK0Q4MDAgLSBVK0RGRkYpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpICs9IDM7XG4gICAgfSBlbHNlIGlmICgoYnVmW2ldICYgMHhmOCkgPT09IDB4ZjApIHsgIC8vIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4XG4gICAgICBpZiAoXG4gICAgICAgIGkgKyAzID49IGxlbiB8fFxuICAgICAgICAoYnVmW2kgKyAxXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaSArIDJdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpICsgM10gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICBidWZbaV0gPT09IDB4ZjAgJiYgKGJ1ZltpICsgMV0gJiAweGYwKSA9PT0gMHg4MCB8fCAgLy8gb3ZlcmxvbmdcbiAgICAgICAgYnVmW2ldID09PSAweGY0ICYmIGJ1ZltpICsgMV0gPiAweDhmIHx8IGJ1ZltpXSA+IDB4ZjQgIC8vID4gVSsxMEZGRkZcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGkgKz0gNDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVmFsaWRVVEY4O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG50cnkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ25vZGUtZ3lwLWJ1aWxkJykoX19kaXJuYW1lKTtcbn0gY2F0Y2ggKGUpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhbGxiYWNrJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBzdHJpbmdXaWR0aCA9IHJlcXVpcmUoJ3N0cmluZy13aWR0aCcpO1xuY29uc3Qgc3RyaXBBbnNpID0gcmVxdWlyZSgnc3RyaXAtYW5zaScpO1xuY29uc3QgYW5zaVN0eWxlcyA9IHJlcXVpcmUoJ2Fuc2ktc3R5bGVzJyk7XG5cbmNvbnN0IEVTQ0FQRVMgPSBuZXcgU2V0KFtcblx0J1xcdTAwMUInLFxuXHQnXFx1MDA5Qidcbl0pO1xuXG5jb25zdCBFTkRfQ09ERSA9IDM5O1xuXG5jb25zdCBBTlNJX0VTQ0FQRV9CRUxMID0gJ1xcdTAwMDcnO1xuY29uc3QgQU5TSV9DU0kgPSAnWyc7XG5jb25zdCBBTlNJX09TQyA9ICddJztcbmNvbnN0IEFOU0lfU0dSX1RFUk1JTkFUT1IgPSAnbSc7XG5jb25zdCBBTlNJX0VTQ0FQRV9MSU5LID0gYCR7QU5TSV9PU0N9ODs7YDtcblxuY29uc3Qgd3JhcEFuc2kgPSBjb2RlID0+IGAke0VTQ0FQRVMudmFsdWVzKCkubmV4dCgpLnZhbHVlfSR7QU5TSV9DU0l9JHtjb2RlfSR7QU5TSV9TR1JfVEVSTUlOQVRPUn1gO1xuY29uc3Qgd3JhcEFuc2lIeXBlcmxpbmsgPSB1cmkgPT4gYCR7RVNDQVBFUy52YWx1ZXMoKS5uZXh0KCkudmFsdWV9JHtBTlNJX0VTQ0FQRV9MSU5LfSR7dXJpfSR7QU5TSV9FU0NBUEVfQkVMTH1gO1xuXG4vLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB3b3JkcyBzcGxpdCBvbiAnICcsIGlnbm9yaW5nXG4vLyB0aGUgZXh0cmEgY2hhcmFjdGVycyBhZGRlZCBieSBhbnNpIGVzY2FwZSBjb2Rlc1xuY29uc3Qgd29yZExlbmd0aHMgPSBzdHJpbmcgPT4gc3RyaW5nLnNwbGl0KCcgJykubWFwKGNoYXJhY3RlciA9PiBzdHJpbmdXaWR0aChjaGFyYWN0ZXIpKTtcblxuLy8gV3JhcCBhIGxvbmcgd29yZCBhY3Jvc3MgbXVsdGlwbGUgcm93c1xuLy8gQW5zaSBlc2NhcGUgY29kZXMgZG8gbm90IGNvdW50IHRvd2FyZHMgbGVuZ3RoXG5jb25zdCB3cmFwV29yZCA9IChyb3dzLCB3b3JkLCBjb2x1bW5zKSA9PiB7XG5cdGNvbnN0IGNoYXJhY3RlcnMgPSBbLi4ud29yZF07XG5cblx0bGV0IGlzSW5zaWRlRXNjYXBlID0gZmFsc2U7XG5cdGxldCBpc0luc2lkZUxpbmtFc2NhcGUgPSBmYWxzZTtcblx0bGV0IHZpc2libGUgPSBzdHJpbmdXaWR0aChzdHJpcEFuc2kocm93c1tyb3dzLmxlbmd0aCAtIDFdKSk7XG5cblx0Zm9yIChjb25zdCBbaW5kZXgsIGNoYXJhY3Rlcl0gb2YgY2hhcmFjdGVycy5lbnRyaWVzKCkpIHtcblx0XHRjb25zdCBjaGFyYWN0ZXJMZW5ndGggPSBzdHJpbmdXaWR0aChjaGFyYWN0ZXIpO1xuXG5cdFx0aWYgKHZpc2libGUgKyBjaGFyYWN0ZXJMZW5ndGggPD0gY29sdW1ucykge1xuXHRcdFx0cm93c1tyb3dzLmxlbmd0aCAtIDFdICs9IGNoYXJhY3Rlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cm93cy5wdXNoKGNoYXJhY3Rlcik7XG5cdFx0XHR2aXNpYmxlID0gMDtcblx0XHR9XG5cblx0XHRpZiAoRVNDQVBFUy5oYXMoY2hhcmFjdGVyKSkge1xuXHRcdFx0aXNJbnNpZGVFc2NhcGUgPSB0cnVlO1xuXHRcdFx0aXNJbnNpZGVMaW5rRXNjYXBlID0gY2hhcmFjdGVycy5zbGljZShpbmRleCArIDEpLmpvaW4oJycpLnN0YXJ0c1dpdGgoQU5TSV9FU0NBUEVfTElOSyk7XG5cdFx0fVxuXG5cdFx0aWYgKGlzSW5zaWRlRXNjYXBlKSB7XG5cdFx0XHRpZiAoaXNJbnNpZGVMaW5rRXNjYXBlKSB7XG5cdFx0XHRcdGlmIChjaGFyYWN0ZXIgPT09IEFOU0lfRVNDQVBFX0JFTEwpIHtcblx0XHRcdFx0XHRpc0luc2lkZUVzY2FwZSA9IGZhbHNlO1xuXHRcdFx0XHRcdGlzSW5zaWRlTGlua0VzY2FwZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQU5TSV9TR1JfVEVSTUlOQVRPUikge1xuXHRcdFx0XHRpc0luc2lkZUVzY2FwZSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHR2aXNpYmxlICs9IGNoYXJhY3Rlckxlbmd0aDtcblxuXHRcdGlmICh2aXNpYmxlID09PSBjb2x1bW5zICYmIGluZGV4IDwgY2hhcmFjdGVycy5sZW5ndGggLSAxKSB7XG5cdFx0XHRyb3dzLnB1c2goJycpO1xuXHRcdFx0dmlzaWJsZSA9IDA7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBsYXN0IHJvdyB3ZSBjb3B5IG92ZXIgaXMgb25seVxuXHQvLyBhbnNpIGVzY2FwZSBjaGFyYWN0ZXJzLCBoYW5kbGUgdGhpcyBlZGdlLWNhc2Vcblx0aWYgKCF2aXNpYmxlICYmIHJvd3Nbcm93cy5sZW5ndGggLSAxXS5sZW5ndGggPiAwICYmIHJvd3MubGVuZ3RoID4gMSkge1xuXHRcdHJvd3Nbcm93cy5sZW5ndGggLSAyXSArPSByb3dzLnBvcCgpO1xuXHR9XG59O1xuXG4vLyBUcmltcyBzcGFjZXMgZnJvbSBhIHN0cmluZyBpZ25vcmluZyBpbnZpc2libGUgc2VxdWVuY2VzXG5jb25zdCBzdHJpbmdWaXNpYmxlVHJpbVNwYWNlc1JpZ2h0ID0gc3RyaW5nID0+IHtcblx0Y29uc3Qgd29yZHMgPSBzdHJpbmcuc3BsaXQoJyAnKTtcblx0bGV0IGxhc3QgPSB3b3Jkcy5sZW5ndGg7XG5cblx0d2hpbGUgKGxhc3QgPiAwKSB7XG5cdFx0aWYgKHN0cmluZ1dpZHRoKHdvcmRzW2xhc3QgLSAxXSkgPiAwKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRsYXN0LS07XG5cdH1cblxuXHRpZiAobGFzdCA9PT0gd29yZHMubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdHJldHVybiB3b3Jkcy5zbGljZSgwLCBsYXN0KS5qb2luKCcgJykgKyB3b3Jkcy5zbGljZShsYXN0KS5qb2luKCcnKTtcbn07XG5cbi8vIFRoZSB3cmFwLWFuc2kgbW9kdWxlIGNhbiBiZSBpbnZva2VkIGluIGVpdGhlciAnaGFyZCcgb3IgJ3NvZnQnIHdyYXAgbW9kZVxuLy9cbi8vICdoYXJkJyB3aWxsIG5ldmVyIGFsbG93IGEgc3RyaW5nIHRvIHRha2UgdXAgbW9yZSB0aGFuIGNvbHVtbnMgY2hhcmFjdGVyc1xuLy9cbi8vICdzb2Z0JyBhbGxvd3MgbG9uZyB3b3JkcyB0byBleHBhbmQgcGFzdCB0aGUgY29sdW1uIGxlbmd0aFxuY29uc3QgZXhlYyA9IChzdHJpbmcsIGNvbHVtbnMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuXHRpZiAob3B0aW9ucy50cmltICE9PSBmYWxzZSAmJiBzdHJpbmcudHJpbSgpID09PSAnJykge1xuXHRcdHJldHVybiAnJztcblx0fVxuXG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRsZXQgZXNjYXBlQ29kZTtcblx0bGV0IGVzY2FwZVVybDtcblxuXHRjb25zdCBsZW5ndGhzID0gd29yZExlbmd0aHMoc3RyaW5nKTtcblx0bGV0IHJvd3MgPSBbJyddO1xuXG5cdGZvciAoY29uc3QgW2luZGV4LCB3b3JkXSBvZiBzdHJpbmcuc3BsaXQoJyAnKS5lbnRyaWVzKCkpIHtcblx0XHRpZiAob3B0aW9ucy50cmltICE9PSBmYWxzZSkge1xuXHRcdFx0cm93c1tyb3dzLmxlbmd0aCAtIDFdID0gcm93c1tyb3dzLmxlbmd0aCAtIDFdLnRyaW1TdGFydCgpO1xuXHRcdH1cblxuXHRcdGxldCByb3dMZW5ndGggPSBzdHJpbmdXaWR0aChyb3dzW3Jvd3MubGVuZ3RoIC0gMV0pO1xuXG5cdFx0aWYgKGluZGV4ICE9PSAwKSB7XG5cdFx0XHRpZiAocm93TGVuZ3RoID49IGNvbHVtbnMgJiYgKG9wdGlvbnMud29yZFdyYXAgPT09IGZhbHNlIHx8IG9wdGlvbnMudHJpbSA9PT0gZmFsc2UpKSB7XG5cdFx0XHRcdC8vIElmIHdlIHN0YXJ0IHdpdGggYSBuZXcgd29yZCBidXQgdGhlIGN1cnJlbnQgcm93IGxlbmd0aCBlcXVhbHMgdGhlIGxlbmd0aCBvZiB0aGUgY29sdW1ucywgYWRkIGEgbmV3IHJvd1xuXHRcdFx0XHRyb3dzLnB1c2goJycpO1xuXHRcdFx0XHRyb3dMZW5ndGggPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm93TGVuZ3RoID4gMCB8fCBvcHRpb25zLnRyaW0gPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJvd3Nbcm93cy5sZW5ndGggLSAxXSArPSAnICc7XG5cdFx0XHRcdHJvd0xlbmd0aCsrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEluICdoYXJkJyB3cmFwIG1vZGUsIHRoZSBsZW5ndGggb2YgYSBsaW5lIGlzIG5ldmVyIGFsbG93ZWQgdG8gZXh0ZW5kIHBhc3QgJ2NvbHVtbnMnXG5cdFx0aWYgKG9wdGlvbnMuaGFyZCAmJiBsZW5ndGhzW2luZGV4XSA+IGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IHJlbWFpbmluZ0NvbHVtbnMgPSAoY29sdW1ucyAtIHJvd0xlbmd0aCk7XG5cdFx0XHRjb25zdCBicmVha3NTdGFydGluZ1RoaXNMaW5lID0gMSArIE1hdGguZmxvb3IoKGxlbmd0aHNbaW5kZXhdIC0gcmVtYWluaW5nQ29sdW1ucyAtIDEpIC8gY29sdW1ucyk7XG5cdFx0XHRjb25zdCBicmVha3NTdGFydGluZ05leHRMaW5lID0gTWF0aC5mbG9vcigobGVuZ3Roc1tpbmRleF0gLSAxKSAvIGNvbHVtbnMpO1xuXHRcdFx0aWYgKGJyZWFrc1N0YXJ0aW5nTmV4dExpbmUgPCBicmVha3NTdGFydGluZ1RoaXNMaW5lKSB7XG5cdFx0XHRcdHJvd3MucHVzaCgnJyk7XG5cdFx0XHR9XG5cblx0XHRcdHdyYXBXb3JkKHJvd3MsIHdvcmQsIGNvbHVtbnMpO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0aWYgKHJvd0xlbmd0aCArIGxlbmd0aHNbaW5kZXhdID4gY29sdW1ucyAmJiByb3dMZW5ndGggPiAwICYmIGxlbmd0aHNbaW5kZXhdID4gMCkge1xuXHRcdFx0aWYgKG9wdGlvbnMud29yZFdyYXAgPT09IGZhbHNlICYmIHJvd0xlbmd0aCA8IGNvbHVtbnMpIHtcblx0XHRcdFx0d3JhcFdvcmQocm93cywgd29yZCwgY29sdW1ucyk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyb3dzLnB1c2goJycpO1xuXHRcdH1cblxuXHRcdGlmIChyb3dMZW5ndGggKyBsZW5ndGhzW2luZGV4XSA+IGNvbHVtbnMgJiYgb3B0aW9ucy53b3JkV3JhcCA9PT0gZmFsc2UpIHtcblx0XHRcdHdyYXBXb3JkKHJvd3MsIHdvcmQsIGNvbHVtbnMpO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0cm93c1tyb3dzLmxlbmd0aCAtIDFdICs9IHdvcmQ7XG5cdH1cblxuXHRpZiAob3B0aW9ucy50cmltICE9PSBmYWxzZSkge1xuXHRcdHJvd3MgPSByb3dzLm1hcChzdHJpbmdWaXNpYmxlVHJpbVNwYWNlc1JpZ2h0KTtcblx0fVxuXG5cdGNvbnN0IHByZSA9IFsuLi5yb3dzLmpvaW4oJ1xcbicpXTtcblxuXHRmb3IgKGNvbnN0IFtpbmRleCwgY2hhcmFjdGVyXSBvZiBwcmUuZW50cmllcygpKSB7XG5cdFx0cmV0dXJuVmFsdWUgKz0gY2hhcmFjdGVyO1xuXG5cdFx0aWYgKEVTQ0FQRVMuaGFzKGNoYXJhY3RlcikpIHtcblx0XHRcdGNvbnN0IHtncm91cHN9ID0gbmV3IFJlZ0V4cChgKD86XFxcXCR7QU5TSV9DU0l9KD88Y29kZT5cXFxcZCspbXxcXFxcJHtBTlNJX0VTQ0FQRV9MSU5LfSg/PHVyaT4uKikke0FOU0lfRVNDQVBFX0JFTEx9KWApLmV4ZWMocHJlLnNsaWNlKGluZGV4KS5qb2luKCcnKSkgfHwge2dyb3Vwczoge319O1xuXHRcdFx0aWYgKGdyb3Vwcy5jb2RlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc3QgY29kZSA9IE51bWJlci5wYXJzZUZsb2F0KGdyb3Vwcy5jb2RlKTtcblx0XHRcdFx0ZXNjYXBlQ29kZSA9IGNvZGUgPT09IEVORF9DT0RFID8gdW5kZWZpbmVkIDogY29kZTtcblx0XHRcdH0gZWxzZSBpZiAoZ3JvdXBzLnVyaSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGVzY2FwZVVybCA9IGdyb3Vwcy51cmkubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogZ3JvdXBzLnVyaTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjb2RlID0gYW5zaVN0eWxlcy5jb2Rlcy5nZXQoTnVtYmVyKGVzY2FwZUNvZGUpKTtcblxuXHRcdGlmIChwcmVbaW5kZXggKyAxXSA9PT0gJ1xcbicpIHtcblx0XHRcdGlmIChlc2NhcGVVcmwpIHtcblx0XHRcdFx0cmV0dXJuVmFsdWUgKz0gd3JhcEFuc2lIeXBlcmxpbmsoJycpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZXNjYXBlQ29kZSAmJiBjb2RlKSB7XG5cdFx0XHRcdHJldHVyblZhbHVlICs9IHdyYXBBbnNpKGNvZGUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnXFxuJykge1xuXHRcdFx0aWYgKGVzY2FwZUNvZGUgJiYgY29kZSkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSArPSB3cmFwQW5zaShlc2NhcGVDb2RlKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGVzY2FwZVVybCkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSArPSB3cmFwQW5zaUh5cGVybGluayhlc2NhcGVVcmwpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn07XG5cbi8vIEZvciBlYWNoIG5ld2xpbmUsIGludm9rZSB0aGUgbWV0aG9kIHNlcGFyYXRlbHlcbm1vZHVsZS5leHBvcnRzID0gKHN0cmluZywgY29sdW1ucywgb3B0aW9ucykgPT4ge1xuXHRyZXR1cm4gU3RyaW5nKHN0cmluZylcblx0XHQubm9ybWFsaXplKClcblx0XHQucmVwbGFjZSgvXFxyXFxuL2csICdcXG4nKVxuXHRcdC5zcGxpdCgnXFxuJylcblx0XHQubWFwKGxpbmUgPT4gZXhlYyhsaW5lLCBjb2x1bW5zLCBvcHRpb25zKSlcblx0XHQuam9pbignXFxuJyk7XG59O1xuIiwiLy8gUmV0dXJucyBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgd3JhcHBlZCBjYWxsYmFja1xuLy8gVGhlIHdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGRvIHNvbWUgc3R1ZmYsIGFuZCByZXR1cm4gYVxuLy8gcHJlc3VtYWJseSBkaWZmZXJlbnQgY2FsbGJhY2sgZnVuY3Rpb24uXG4vLyBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvd24gcHJvcGVydGllcyBhcmUgcmV0YWluZWQsIHNvIHRoYXRcbi8vIGRlY29yYXRpb25zIGFuZCBzdWNoIGFyZSBub3QgbG9zdCBhbG9uZyB0aGUgd2F5LlxubW9kdWxlLmV4cG9ydHMgPSB3cmFwcHlcbmZ1bmN0aW9uIHdyYXBweSAoZm4sIGNiKSB7XG4gIGlmIChmbiAmJiBjYikgcmV0dXJuIHdyYXBweShmbikoY2IpXG5cbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCduZWVkIHdyYXBwZXIgZnVuY3Rpb24nKVxuXG4gIE9iamVjdC5rZXlzKGZuKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgd3JhcHBlcltrXSA9IGZuW2tdXG4gIH0pXG5cbiAgcmV0dXJuIHdyYXBwZXJcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuICAgIHZhciByZXQgPSBmbi5hcHBseSh0aGlzLCBhcmdzKVxuICAgIHZhciBjYiA9IGFyZ3NbYXJncy5sZW5ndGgtMV1cbiAgICBpZiAodHlwZW9mIHJldCA9PT0gJ2Z1bmN0aW9uJyAmJiByZXQgIT09IGNiKSB7XG4gICAgICBPYmplY3Qua2V5cyhjYikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXRba10gPSBjYltrXVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgRU1QVFlfQlVGRkVSIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG5jb25zdCBGYXN0QnVmZmVyID0gQnVmZmVyW1N5bWJvbC5zcGVjaWVzXTtcblxuLyoqXG4gKiBNZXJnZXMgYW4gYXJyYXkgb2YgYnVmZmVycyBpbnRvIGEgbmV3IGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcltdfSBsaXN0IFRoZSBhcnJheSBvZiBidWZmZXJzIHRvIGNvbmNhdFxuICogQHBhcmFtIHtOdW1iZXJ9IHRvdGFsTGVuZ3RoIFRoZSB0b3RhbCBsZW5ndGggb2YgYnVmZmVycyBpbiB0aGUgbGlzdFxuICogQHJldHVybiB7QnVmZmVyfSBUaGUgcmVzdWx0aW5nIGJ1ZmZlclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBjb25jYXQobGlzdCwgdG90YWxMZW5ndGgpIHtcbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSByZXR1cm4gRU1QVFlfQlVGRkVSO1xuICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHJldHVybiBsaXN0WzBdO1xuXG4gIGNvbnN0IHRhcmdldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSh0b3RhbExlbmd0aCk7XG4gIGxldCBvZmZzZXQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGJ1ZiA9IGxpc3RbaV07XG4gICAgdGFyZ2V0LnNldChidWYsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGJ1Zi5sZW5ndGg7XG4gIH1cblxuICBpZiAob2Zmc2V0IDwgdG90YWxMZW5ndGgpIHtcbiAgICByZXR1cm4gbmV3IEZhc3RCdWZmZXIodGFyZ2V0LmJ1ZmZlciwgdGFyZ2V0LmJ5dGVPZmZzZXQsIG9mZnNldCk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIE1hc2tzIGEgYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBtYXNrLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBzb3VyY2UgVGhlIGJ1ZmZlciB0byBtYXNrXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayBUaGUgbWFzayB0byB1c2VcbiAqIEBwYXJhbSB7QnVmZmVyfSBvdXRwdXQgVGhlIGJ1ZmZlciB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdG8gc3RhcnQgd3JpdGluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIG1hc2suXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIF9tYXNrKHNvdXJjZSwgbWFzaywgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0W29mZnNldCArIGldID0gc291cmNlW2ldIF4gbWFza1tpICYgM107XG4gIH1cbn1cblxuLyoqXG4gKiBVbm1hc2tzIGEgYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBtYXNrLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byB1bm1hc2tcbiAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIFRoZSBtYXNrIHRvIHVzZVxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBfdW5tYXNrKGJ1ZmZlciwgbWFzaykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgIGJ1ZmZlcltpXSBePSBtYXNrW2kgJiAzXTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgYnVmZmVyIHRvIGFuIGBBcnJheUJ1ZmZlcmAuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZiBUaGUgYnVmZmVyIHRvIGNvbnZlcnRcbiAqIEByZXR1cm4ge0FycmF5QnVmZmVyfSBDb252ZXJ0ZWQgYnVmZmVyXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXlCdWZmZXIoYnVmKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBidWYuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICByZXR1cm4gYnVmLmJ1ZmZlcjtcbiAgfVxuXG4gIHJldHVybiBidWYuYnVmZmVyLnNsaWNlKGJ1Zi5ieXRlT2Zmc2V0LCBidWYuYnl0ZU9mZnNldCArIGJ1Zi5sZW5ndGgpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGBkYXRhYCB0byBhIGBCdWZmZXJgLlxuICpcbiAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgZGF0YSB0byBjb252ZXJ0XG4gKiBAcmV0dXJuIHtCdWZmZXJ9IFRoZSBidWZmZXJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn1cbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gdG9CdWZmZXIoZGF0YSkge1xuICB0b0J1ZmZlci5yZWFkT25seSA9IHRydWU7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkgcmV0dXJuIGRhdGE7XG5cbiAgbGV0IGJ1ZjtcblxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgYnVmID0gbmV3IEZhc3RCdWZmZXIoZGF0YSk7XG4gIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpKSB7XG4gICAgYnVmID0gbmV3IEZhc3RCdWZmZXIoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBCdWZmZXIuZnJvbShkYXRhKTtcbiAgICB0b0J1ZmZlci5yZWFkT25seSA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbmNhdCxcbiAgbWFzazogX21hc2ssXG4gIHRvQXJyYXlCdWZmZXIsXG4gIHRvQnVmZmVyLFxuICB1bm1hc2s6IF91bm1hc2tcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICAqL1xuaWYgKCFwcm9jZXNzLmVudi5XU19OT19CVUZGRVJfVVRJTCkge1xuICB0cnkge1xuICAgIGNvbnN0IGJ1ZmZlclV0aWwgPSByZXF1aXJlKCdidWZmZXJ1dGlsJyk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cy5tYXNrID0gZnVuY3Rpb24gKHNvdXJjZSwgbWFzaywgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCkge1xuICAgICAgaWYgKGxlbmd0aCA8IDQ4KSBfbWFzayhzb3VyY2UsIG1hc2ssIG91dHB1dCwgb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgZWxzZSBidWZmZXJVdGlsLm1hc2soc291cmNlLCBtYXNrLCBvdXRwdXQsIG9mZnNldCwgbGVuZ3RoKTtcbiAgICB9O1xuXG4gICAgbW9kdWxlLmV4cG9ydHMudW5tYXNrID0gZnVuY3Rpb24gKGJ1ZmZlciwgbWFzaykge1xuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCAzMikgX3VubWFzayhidWZmZXIsIG1hc2spO1xuICAgICAgZWxzZSBidWZmZXJVdGlsLnVubWFzayhidWZmZXIsIG1hc2spO1xuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBDb250aW51ZSByZWdhcmRsZXNzIG9mIHRoZSBlcnJvci5cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBCSU5BUllfVFlQRVMgPSBbJ25vZGVidWZmZXInLCAnYXJyYXlidWZmZXInLCAnZnJhZ21lbnRzJ107XG5jb25zdCBoYXNCbG9iID0gdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnO1xuXG5pZiAoaGFzQmxvYikgQklOQVJZX1RZUEVTLnB1c2goJ2Jsb2InKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEJJTkFSWV9UWVBFUyxcbiAgRU1QVFlfQlVGRkVSOiBCdWZmZXIuYWxsb2MoMCksXG4gIEdVSUQ6ICcyNThFQUZBNS1FOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTEnLFxuICBoYXNCbG9iLFxuICBrRm9yT25FdmVudEF0dHJpYnV0ZTogU3ltYm9sKCdrSXNGb3JPbkV2ZW50QXR0cmlidXRlJyksXG4gIGtMaXN0ZW5lcjogU3ltYm9sKCdrTGlzdGVuZXInKSxcbiAga1N0YXR1c0NvZGU6IFN5bWJvbCgnc3RhdHVzLWNvZGUnKSxcbiAga1dlYlNvY2tldDogU3ltYm9sKCd3ZWJzb2NrZXQnKSxcbiAgTk9PUDogKCkgPT4ge31cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsga0Zvck9uRXZlbnRBdHRyaWJ1dGUsIGtMaXN0ZW5lciB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcblxuY29uc3Qga0NvZGUgPSBTeW1ib2woJ2tDb2RlJyk7XG5jb25zdCBrRGF0YSA9IFN5bWJvbCgna0RhdGEnKTtcbmNvbnN0IGtFcnJvciA9IFN5bWJvbCgna0Vycm9yJyk7XG5jb25zdCBrTWVzc2FnZSA9IFN5bWJvbCgna01lc3NhZ2UnKTtcbmNvbnN0IGtSZWFzb24gPSBTeW1ib2woJ2tSZWFzb24nKTtcbmNvbnN0IGtUYXJnZXQgPSBTeW1ib2woJ2tUYXJnZXQnKTtcbmNvbnN0IGtUeXBlID0gU3ltYm9sKCdrVHlwZScpO1xuY29uc3Qga1dhc0NsZWFuID0gU3ltYm9sKCdrV2FzQ2xlYW4nKTtcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gZXZlbnQuXG4gKi9cbmNsYXNzIEV2ZW50IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiB0aGUgYHR5cGVgIGFyZ3VtZW50IGlzIG5vdCBzcGVjaWZpZWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHR5cGUpIHtcbiAgICB0aGlzW2tUYXJnZXRdID0gbnVsbDtcbiAgICB0aGlzW2tUeXBlXSA9IHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUgeyp9XG4gICAqL1xuICBnZXQgdGFyZ2V0KCkge1xuICAgIHJldHVybiB0aGlzW2tUYXJnZXRdO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpc1trVHlwZV07XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50LnByb3RvdHlwZSwgJ3RhcmdldCcsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudC5wcm90b3R5cGUsICd0eXBlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIGNsb3NlIGV2ZW50LlxuICpcbiAqIEBleHRlbmRzIEV2ZW50XG4gKi9cbmNsYXNzIENsb3NlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYENsb3NlRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXG4gICAqICAgICBhdHRyaWJ1dGVzIHZpYSBvYmplY3QgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jb2RlPTBdIFRoZSBzdGF0dXMgY29kZSBleHBsYWluaW5nIHdoeSB0aGVcbiAgICogICAgIGNvbm5lY3Rpb24gd2FzIGNsb3NlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucmVhc29uPScnXSBBIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBleHBsYWluaW5nIHdoeVxuICAgKiAgICAgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLndhc0NsZWFuPWZhbHNlXSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlXG4gICAqICAgICBjb25uZWN0aW9uIHdhcyBjbGVhbmx5IGNsb3NlZFxuICAgKi9cbiAgY29uc3RydWN0b3IodHlwZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIodHlwZSk7XG5cbiAgICB0aGlzW2tDb2RlXSA9IG9wdGlvbnMuY29kZSA9PT0gdW5kZWZpbmVkID8gMCA6IG9wdGlvbnMuY29kZTtcbiAgICB0aGlzW2tSZWFzb25dID0gb3B0aW9ucy5yZWFzb24gPT09IHVuZGVmaW5lZCA/ICcnIDogb3B0aW9ucy5yZWFzb247XG4gICAgdGhpc1trV2FzQ2xlYW5dID0gb3B0aW9ucy53YXNDbGVhbiA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBvcHRpb25zLndhc0NsZWFuO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgY29kZSgpIHtcbiAgICByZXR1cm4gdGhpc1trQ29kZV07XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIGdldCByZWFzb24oKSB7XG4gICAgcmV0dXJuIHRoaXNba1JlYXNvbl07XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqL1xuICBnZXQgd2FzQ2xlYW4oKSB7XG4gICAgcmV0dXJuIHRoaXNba1dhc0NsZWFuXTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ2xvc2VFdmVudC5wcm90b3R5cGUsICdjb2RlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KENsb3NlRXZlbnQucHJvdG90eXBlLCAncmVhc29uJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KENsb3NlRXZlbnQucHJvdG90eXBlLCAnd2FzQ2xlYW4nLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGFuIGVycm9yIGV2ZW50LlxuICpcbiAqIEBleHRlbmRzIEV2ZW50XG4gKi9cbmNsYXNzIEVycm9yRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYEVycm9yRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXG4gICAqICAgICBhdHRyaWJ1dGVzIHZpYSBvYmplY3QgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gW29wdGlvbnMuZXJyb3I9bnVsbF0gVGhlIGVycm9yIHRoYXQgZ2VuZXJhdGVkIHRoaXMgZXZlbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2U9JyddIFRoZSBlcnJvciBtZXNzYWdlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcih0eXBlKTtcblxuICAgIHRoaXNba0Vycm9yXSA9IG9wdGlvbnMuZXJyb3IgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBvcHRpb25zLmVycm9yO1xuICAgIHRoaXNba01lc3NhZ2VdID0gb3B0aW9ucy5tZXNzYWdlID09PSB1bmRlZmluZWQgPyAnJyA6IG9wdGlvbnMubWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7Kn1cbiAgICovXG4gIGdldCBlcnJvcigpIHtcbiAgICByZXR1cm4gdGhpc1trRXJyb3JdO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgbWVzc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpc1trTWVzc2FnZV07XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEVycm9yRXZlbnQucHJvdG90eXBlLCAnZXJyb3InLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXJyb3JFdmVudC5wcm90b3R5cGUsICdtZXNzYWdlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgZXZlbnQuXG4gKlxuICogQGV4dGVuZHMgRXZlbnRcbiAqL1xuY2xhc3MgTWVzc2FnZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBNZXNzYWdlRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXG4gICAqICAgICBhdHRyaWJ1dGVzIHZpYSBvYmplY3QgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gW29wdGlvbnMuZGF0YT1udWxsXSBUaGUgbWVzc2FnZSBjb250ZW50XG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcih0eXBlKTtcblxuICAgIHRoaXNba0RhdGFdID0gb3B0aW9ucy5kYXRhID09PSB1bmRlZmluZWQgPyBudWxsIDogb3B0aW9ucy5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHsqfVxuICAgKi9cbiAgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXNba0RhdGFdO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNZXNzYWdlRXZlbnQucHJvdG90eXBlLCAnZGF0YScsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuLyoqXG4gKiBUaGlzIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGVtdWxhdGluZyB0aGUgYEV2ZW50VGFyZ2V0YCBpbnRlcmZhY2UuIEl0J3Mgbm90XG4gKiBtZWFudCB0byBiZSB1c2VkIGRpcmVjdGx5LlxuICpcbiAqIEBtaXhpblxuICovXG5jb25zdCBFdmVudFRhcmdldCA9IHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGV2ZW50IHR5cGUgdG8gbGlzdGVuIGZvclxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnxPYmplY3QpfSBoYW5kbGVyIFRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBbiBvcHRpb25zIG9iamVjdCBzcGVjaWZpZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0XG4gICAqICAgICB0aGUgZXZlbnQgbGlzdGVuZXJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5vbmNlPWZhbHNlXSBBIGBCb29sZWFuYCBpbmRpY2F0aW5nIHRoYXQgdGhlXG4gICAqICAgICBsaXN0ZW5lciBzaG91bGQgYmUgaW52b2tlZCBhdCBtb3N0IG9uY2UgYWZ0ZXIgYmVpbmcgYWRkZWQuIElmIGB0cnVlYCxcbiAgICogICAgIHRoZSBsaXN0ZW5lciB3b3VsZCBiZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiBpbnZva2VkLlxuICAgKiBAcHVibGljXG4gICAqL1xuICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnModHlwZSkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIW9wdGlvbnNba0Zvck9uRXZlbnRBdHRyaWJ1dGVdICYmXG4gICAgICAgIGxpc3RlbmVyW2tMaXN0ZW5lcl0gPT09IGhhbmRsZXIgJiZcbiAgICAgICAgIWxpc3RlbmVyW2tGb3JPbkV2ZW50QXR0cmlidXRlXVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgd3JhcHBlcjtcblxuICAgIGlmICh0eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgIHdyYXBwZXIgPSBmdW5jdGlvbiBvbk1lc3NhZ2UoZGF0YSwgaXNCaW5hcnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50KCdtZXNzYWdlJywge1xuICAgICAgICAgIGRhdGE6IGlzQmluYXJ5ID8gZGF0YSA6IGRhdGEudG9TdHJpbmcoKVxuICAgICAgICB9KTtcblxuICAgICAgICBldmVudFtrVGFyZ2V0XSA9IHRoaXM7XG4gICAgICAgIGNhbGxMaXN0ZW5lcihoYW5kbGVyLCB0aGlzLCBldmVudCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgd3JhcHBlciA9IGZ1bmN0aW9uIG9uQ2xvc2UoY29kZSwgbWVzc2FnZSkge1xuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDbG9zZUV2ZW50KCdjbG9zZScsIHtcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHJlYXNvbjogbWVzc2FnZS50b1N0cmluZygpLFxuICAgICAgICAgIHdhc0NsZWFuOiB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgJiYgdGhpcy5fY2xvc2VGcmFtZVNlbnRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXZlbnRba1RhcmdldF0gPSB0aGlzO1xuICAgICAgICBjYWxsTGlzdGVuZXIoaGFuZGxlciwgdGhpcywgZXZlbnQpO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgIHdyYXBwZXIgPSBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEVycm9yRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXZlbnRba1RhcmdldF0gPSB0aGlzO1xuICAgICAgICBjYWxsTGlzdGVuZXIoaGFuZGxlciwgdGhpcywgZXZlbnQpO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvcGVuJykge1xuICAgICAgd3JhcHBlciA9IGZ1bmN0aW9uIG9uT3BlbigpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ29wZW4nKTtcblxuICAgICAgICBldmVudFtrVGFyZ2V0XSA9IHRoaXM7XG4gICAgICAgIGNhbGxMaXN0ZW5lcihoYW5kbGVyLCB0aGlzLCBldmVudCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd3JhcHBlcltrRm9yT25FdmVudEF0dHJpYnV0ZV0gPSAhIW9wdGlvbnNba0Zvck9uRXZlbnRBdHRyaWJ1dGVdO1xuICAgIHdyYXBwZXJba0xpc3RlbmVyXSA9IGhhbmRsZXI7XG5cbiAgICBpZiAob3B0aW9ucy5vbmNlKSB7XG4gICAgICB0aGlzLm9uY2UodHlwZSwgd3JhcHBlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub24odHlwZSwgd3JhcHBlcik7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXZlbnQgdHlwZSB0byByZW1vdmVcbiAgICogQHBhcmFtIHsoRnVuY3Rpb258T2JqZWN0KX0gaGFuZGxlciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlcikge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnModHlwZSkpIHtcbiAgICAgIGlmIChsaXN0ZW5lcltrTGlzdGVuZXJdID09PSBoYW5kbGVyICYmICFsaXN0ZW5lcltrRm9yT25FdmVudEF0dHJpYnV0ZV0pIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENsb3NlRXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIEV2ZW50LFxuICBFdmVudFRhcmdldCxcbiAgTWVzc2FnZUV2ZW50XG59O1xuXG4vKipcbiAqIENhbGwgYW4gZXZlbnQgbGlzdGVuZXJcbiAqXG4gKiBAcGFyYW0geyhGdW5jdGlvbnxPYmplY3QpfSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gY2FsbFxuICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSB2YWx1ZSB0byB1c2UgYXMgYHRoaXNgYCB3aGVuIGNhbGxpbmcgdGhlIGxpc3RlbmVyXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gcGFzcyB0byB0aGUgbGlzdGVuZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGxMaXN0ZW5lcihsaXN0ZW5lciwgdGhpc0FyZywgZXZlbnQpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciA9PT0gJ29iamVjdCcgJiYgbGlzdGVuZXIuaGFuZGxlRXZlbnQpIHtcbiAgICBsaXN0ZW5lci5oYW5kbGVFdmVudC5jYWxsKGxpc3RlbmVyLCBldmVudCk7XG4gIH0gZWxzZSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzQXJnLCBldmVudCk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyB0b2tlbkNoYXJzIH0gPSByZXF1aXJlKCcuL3ZhbGlkYXRpb24nKTtcblxuLyoqXG4gKiBBZGRzIGFuIG9mZmVyIHRvIHRoZSBtYXAgb2YgZXh0ZW5zaW9uIG9mZmVycyBvciBhIHBhcmFtZXRlciB0byB0aGUgbWFwIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0IFRoZSBtYXAgb2YgZXh0ZW5zaW9uIG9mZmVycyBvciBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgZXh0ZW5zaW9uIG9yIHBhcmFtZXRlciBuYW1lXG4gKiBAcGFyYW0geyhPYmplY3R8Qm9vbGVhbnxTdHJpbmcpfSBlbGVtIFRoZSBleHRlbnNpb24gcGFyYW1ldGVycyBvciB0aGVcbiAqICAgICBwYXJhbWV0ZXIgdmFsdWVcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHB1c2goZGVzdCwgbmFtZSwgZWxlbSkge1xuICBpZiAoZGVzdFtuYW1lXSA9PT0gdW5kZWZpbmVkKSBkZXN0W25hbWVdID0gW2VsZW1dO1xuICBlbHNlIGRlc3RbbmFtZV0ucHVzaChlbGVtKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnNgIGhlYWRlciBpbnRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyIFRoZSBmaWVsZCB2YWx1ZSBvZiB0aGUgaGVhZGVyXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBwYXJzZWQgb2JqZWN0XG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKGhlYWRlcikge1xuICBjb25zdCBvZmZlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBsZXQgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgbGV0IG11c3RVbmVzY2FwZSA9IGZhbHNlO1xuICBsZXQgaXNFc2NhcGluZyA9IGZhbHNlO1xuICBsZXQgaW5RdW90ZXMgPSBmYWxzZTtcbiAgbGV0IGV4dGVuc2lvbk5hbWU7XG4gIGxldCBwYXJhbU5hbWU7XG4gIGxldCBzdGFydCA9IC0xO1xuICBsZXQgY29kZSA9IC0xO1xuICBsZXQgZW5kID0gLTE7XG4gIGxldCBpID0gMDtcblxuICBmb3IgKDsgaSA8IGhlYWRlci5sZW5ndGg7IGkrKykge1xuICAgIGNvZGUgPSBoZWFkZXIuY2hhckNvZGVBdChpKTtcblxuICAgIGlmIChleHRlbnNpb25OYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChlbmQgPT09IC0xICYmIHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSAtMSkgc3RhcnQgPSBpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaSAhPT0gMCAmJlxuICAgICAgICAoY29kZSA9PT0gMHgyMCAvKiAnICcgKi8gfHwgY29kZSA9PT0gMHgwOSkgLyogJ1xcdCcgKi9cbiAgICAgICkge1xuICAgICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4M2IgLyogJzsnICovIHx8IGNvZGUgPT09IDB4MmMgLyogJywnICovKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICAgICAgICBjb25zdCBuYW1lID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgICBpZiAoY29kZSA9PT0gMHgyYykge1xuICAgICAgICAgIHB1c2gob2ZmZXJzLCBuYW1lLCBwYXJhbXMpO1xuICAgICAgICAgIHBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IG5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydCA9IGVuZCA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwYXJhbU5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVuZCA9PT0gLTEgJiYgdG9rZW5DaGFyc1tjb2RlXSA9PT0gMSkge1xuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MjAgfHwgY29kZSA9PT0gMHgwOSkge1xuICAgICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4M2IgfHwgY29kZSA9PT0gMHgyYykge1xuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kID09PSAtMSkgZW5kID0gaTtcbiAgICAgICAgcHVzaChwYXJhbXMsIGhlYWRlci5zbGljZShzdGFydCwgZW5kKSwgdHJ1ZSk7XG4gICAgICAgIGlmIChjb2RlID09PSAweDJjKSB7XG4gICAgICAgICAgcHVzaChvZmZlcnMsIGV4dGVuc2lvbk5hbWUsIHBhcmFtcyk7XG4gICAgICAgICAgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBleHRlbnNpb25OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBlbmQgPSAtMTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgzZCAvKiAnPScgKi8gJiYgc3RhcnQgIT09IC0xICYmIGVuZCA9PT0gLTEpIHtcbiAgICAgICAgcGFyYW1OYW1lID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBpKTtcbiAgICAgICAgc3RhcnQgPSBlbmQgPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHtpfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgLy8gVGhlIHZhbHVlIG9mIGEgcXVvdGVkLXN0cmluZyBhZnRlciB1bmVzY2FwaW5nIG11c3QgY29uZm9ybSB0byB0aGVcbiAgICAgIC8vIHRva2VuIEFCTkYsIHNvIG9ubHkgdG9rZW4gY2hhcmFjdGVycyBhcmUgdmFsaWQuXG4gICAgICAvLyBSZWY6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NDU1I3NlY3Rpb24tOS4xXG4gICAgICAvL1xuICAgICAgaWYgKGlzRXNjYXBpbmcpIHtcbiAgICAgICAgaWYgKHRva2VuQ2hhcnNbY29kZV0gIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICAgIGVsc2UgaWYgKCFtdXN0VW5lc2NhcGUpIG11c3RVbmVzY2FwZSA9IHRydWU7XG4gICAgICAgIGlzRXNjYXBpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoaW5RdW90ZXMpIHtcbiAgICAgICAgaWYgKHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcbiAgICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyMiAvKiAnXCInICovICYmIHN0YXJ0ICE9PSAtMSkge1xuICAgICAgICAgIGluUXVvdGVzID0gZmFsc2U7XG4gICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDVjIC8qICdcXCcgKi8pIHtcbiAgICAgICAgICBpc0VzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDIyICYmIGhlYWRlci5jaGFyQ29kZUF0KGkgLSAxKSA9PT0gMHgzZCkge1xuICAgICAgICBpblF1b3RlcyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGVuZCA9PT0gLTEgJiYgdG9rZW5DaGFyc1tjb2RlXSA9PT0gMSkge1xuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0ICE9PSAtMSAmJiAoY29kZSA9PT0gMHgyMCB8fCBjb2RlID09PSAweDA5KSkge1xuICAgICAgICBpZiAoZW5kID09PSAtMSkgZW5kID0gaTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgzYiB8fCBjb2RlID09PSAweDJjKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICAgICAgICBsZXQgdmFsdWUgPSBoZWFkZXIuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgIGlmIChtdXN0VW5lc2NhcGUpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcXFwvZywgJycpO1xuICAgICAgICAgIG11c3RVbmVzY2FwZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHB1c2gocGFyYW1zLCBwYXJhbU5hbWUsIHZhbHVlKTtcbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MmMpIHtcbiAgICAgICAgICBwdXNoKG9mZmVycywgZXh0ZW5zaW9uTmFtZSwgcGFyYW1zKTtcbiAgICAgICAgICBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGV4dGVuc2lvbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJhbU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHN0YXJ0ID0gZW5kID0gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGluUXVvdGVzIHx8IGNvZGUgPT09IDB4MjAgfHwgY29kZSA9PT0gMHgwOSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQnKTtcbiAgfVxuXG4gIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICBjb25zdCB0b2tlbiA9IGhlYWRlci5zbGljZShzdGFydCwgZW5kKTtcbiAgaWYgKGV4dGVuc2lvbk5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHB1c2gob2ZmZXJzLCB0b2tlbiwgcGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocGFyYW1OYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHB1c2gocGFyYW1zLCB0b2tlbiwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChtdXN0VW5lc2NhcGUpIHtcbiAgICAgIHB1c2gocGFyYW1zLCBwYXJhbU5hbWUsIHRva2VuLnJlcGxhY2UoL1xcXFwvZywgJycpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaChwYXJhbXMsIHBhcmFtTmFtZSwgdG9rZW4pO1xuICAgIH1cbiAgICBwdXNoKG9mZmVycywgZXh0ZW5zaW9uTmFtZSwgcGFyYW1zKTtcbiAgfVxuXG4gIHJldHVybiBvZmZlcnM7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zYCBoZWFkZXIgZmllbGQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGV4dGVuc2lvbnMgVGhlIG1hcCBvZiBleHRlbnNpb25zIGFuZCBwYXJhbWV0ZXJzIHRvIGZvcm1hdFxuICogQHJldHVybiB7U3RyaW5nfSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIG9iamVjdFxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBmb3JtYXQoZXh0ZW5zaW9ucykge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZXh0ZW5zaW9ucylcbiAgICAubWFwKChleHRlbnNpb24pID0+IHtcbiAgICAgIGxldCBjb25maWd1cmF0aW9ucyA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWd1cmF0aW9ucykpIGNvbmZpZ3VyYXRpb25zID0gW2NvbmZpZ3VyYXRpb25zXTtcbiAgICAgIHJldHVybiBjb25maWd1cmF0aW9uc1xuICAgICAgICAubWFwKChwYXJhbXMpID0+IHtcbiAgICAgICAgICByZXR1cm4gW2V4dGVuc2lvbl1cbiAgICAgICAgICAgIC5jb25jYXQoXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IHBhcmFtc1trXTtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkgdmFsdWVzID0gW3ZhbHVlc107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgLm1hcCgodikgPT4gKHYgPT09IHRydWUgPyBrIDogYCR7a309JHt2fWApKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oJzsgJyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbignOyAnKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgfSlcbiAgICAuam9pbignLCAnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7IGZvcm1hdCwgcGFyc2UgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3Qga0RvbmUgPSBTeW1ib2woJ2tEb25lJyk7XG5jb25zdCBrUnVuID0gU3ltYm9sKCdrUnVuJyk7XG5cbi8qKlxuICogQSB2ZXJ5IHNpbXBsZSBqb2IgcXVldWUgd2l0aCBhZGp1c3RhYmxlIGNvbmN1cnJlbmN5LiBBZGFwdGVkIGZyb21cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9TVFJNTC9hc3luYy1saW1pdGVyXG4gKi9cbmNsYXNzIExpbWl0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBgTGltaXRlcmAuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbY29uY3VycmVuY3k9SW5maW5pdHldIFRoZSBtYXhpbXVtIG51bWJlciBvZiBqb2JzIGFsbG93ZWRcbiAgICogICAgIHRvIHJ1biBjb25jdXJyZW50bHlcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmN1cnJlbmN5KSB7XG4gICAgdGhpc1trRG9uZV0gPSAoKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmctLTtcbiAgICAgIHRoaXNba1J1bl0oKTtcbiAgICB9O1xuICAgIHRoaXMuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeSB8fCBJbmZpbml0eTtcbiAgICB0aGlzLmpvYnMgPSBbXTtcbiAgICB0aGlzLnBlbmRpbmcgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBqb2IgdG8gdGhlIHF1ZXVlLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBqb2IgVGhlIGpvYiB0byBydW5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgYWRkKGpvYikge1xuICAgIHRoaXMuam9icy5wdXNoKGpvYik7XG4gICAgdGhpc1trUnVuXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBqb2IgZnJvbSB0aGUgcXVldWUgYW5kIHJ1bnMgaXQgaWYgcG9zc2libGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBba1J1bl0oKSB7XG4gICAgaWYgKHRoaXMucGVuZGluZyA9PT0gdGhpcy5jb25jdXJyZW5jeSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuam9icy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGpvYiA9IHRoaXMuam9icy5zaGlmdCgpO1xuXG4gICAgICB0aGlzLnBlbmRpbmcrKztcbiAgICAgIGpvYih0aGlzW2tEb25lXSk7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTGltaXRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcblxuY29uc3QgYnVmZmVyVXRpbCA9IHJlcXVpcmUoJy4vYnVmZmVyLXV0aWwnKTtcbmNvbnN0IExpbWl0ZXIgPSByZXF1aXJlKCcuL2xpbWl0ZXInKTtcbmNvbnN0IHsga1N0YXR1c0NvZGUgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbmNvbnN0IEZhc3RCdWZmZXIgPSBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdO1xuY29uc3QgVFJBSUxFUiA9IEJ1ZmZlci5mcm9tKFsweDAwLCAweDAwLCAweGZmLCAweGZmXSk7XG5jb25zdCBrUGVyTWVzc2FnZURlZmxhdGUgPSBTeW1ib2woJ3Blcm1lc3NhZ2UtZGVmbGF0ZScpO1xuY29uc3Qga1RvdGFsTGVuZ3RoID0gU3ltYm9sKCd0b3RhbC1sZW5ndGgnKTtcbmNvbnN0IGtDYWxsYmFjayA9IFN5bWJvbCgnY2FsbGJhY2snKTtcbmNvbnN0IGtCdWZmZXJzID0gU3ltYm9sKCdidWZmZXJzJyk7XG5jb25zdCBrRXJyb3IgPSBTeW1ib2woJ2Vycm9yJyk7XG5cbi8vXG4vLyBXZSBsaW1pdCB6bGliIGNvbmN1cnJlbmN5LCB3aGljaCBwcmV2ZW50cyBzZXZlcmUgbWVtb3J5IGZyYWdtZW50YXRpb25cbi8vIGFzIGRvY3VtZW50ZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy84ODcxI2lzc3VlY29tbWVudC0yNTA5MTU5MTNcbi8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vd2Vic29ja2V0cy93cy9pc3N1ZXMvMTIwMlxuLy9cbi8vIEludGVudGlvbmFsbHkgZ2xvYmFsOyBpdCdzIHRoZSBnbG9iYWwgdGhyZWFkIHBvb2wgdGhhdCdzIGFuIGlzc3VlLlxuLy9cbmxldCB6bGliTGltaXRlcjtcblxuLyoqXG4gKiBwZXJtZXNzYWdlLWRlZmxhdGUgaW1wbGVtZW50YXRpb24uXG4gKi9cbmNsYXNzIFBlck1lc3NhZ2VEZWZsYXRlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBQZXJNZXNzYWdlRGVmbGF0ZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBDb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHsoQm9vbGVhbnxOdW1iZXIpfSBbb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzXSBBZHZlcnRpc2Ugc3VwcG9ydFxuICAgKiAgICAgZm9yLCBvciByZXF1ZXN0LCBhIGN1c3RvbSBjbGllbnQgd2luZG93IHNpemVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGllbnROb0NvbnRleHRUYWtlb3Zlcj1mYWxzZV0gQWR2ZXJ0aXNlL1xuICAgKiAgICAgYWNrbm93bGVkZ2UgZGlzYWJsaW5nIG9mIGNsaWVudCBjb250ZXh0IHRha2VvdmVyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jb25jdXJyZW5jeUxpbWl0PTEwXSBUaGUgbnVtYmVyIG9mIGNvbmN1cnJlbnRcbiAgICogICAgIGNhbGxzIHRvIHpsaWJcbiAgICogQHBhcmFtIHsoQm9vbGVhbnxOdW1iZXIpfSBbb3B0aW9ucy5zZXJ2ZXJNYXhXaW5kb3dCaXRzXSBSZXF1ZXN0L2NvbmZpcm0gdGhlXG4gICAqICAgICB1c2Ugb2YgYSBjdXN0b20gc2VydmVyIHdpbmRvdyBzaXplXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2VydmVyTm9Db250ZXh0VGFrZW92ZXI9ZmFsc2VdIFJlcXVlc3QvYWNjZXB0XG4gICAqICAgICBkaXNhYmxpbmcgb2Ygc2VydmVyIGNvbnRleHQgdGFrZW92ZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnRocmVzaG9sZD0xMDI0XSBTaXplIChpbiBieXRlcykgYmVsb3cgd2hpY2hcbiAgICogICAgIG1lc3NhZ2VzIHNob3VsZCBub3QgYmUgY29tcHJlc3NlZCBpZiBjb250ZXh0IHRha2VvdmVyIGlzIGRpc2FibGVkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy56bGliRGVmbGF0ZU9wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB6bGliIG9uXG4gICAqICAgICBkZWZsYXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy56bGliSW5mbGF0ZU9wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB6bGliIG9uXG4gICAqICAgICBpbmZsYXRlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzU2VydmVyPWZhbHNlXSBDcmVhdGUgdGhlIGluc3RhbmNlIGluIGVpdGhlciBzZXJ2ZXIgb3JcbiAgICogICAgIGNsaWVudCBtb2RlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbWF4UGF5bG9hZD0wXSBUaGUgbWF4aW11bSBhbGxvd2VkIG1lc3NhZ2UgbGVuZ3RoXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zLCBpc1NlcnZlciwgbWF4UGF5bG9hZCkge1xuICAgIHRoaXMuX21heFBheWxvYWQgPSBtYXhQYXlsb2FkIHwgMDtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLl90aHJlc2hvbGQgPVxuICAgICAgdGhpcy5fb3B0aW9ucy50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHRoaXMuX29wdGlvbnMudGhyZXNob2xkIDogMTAyNDtcbiAgICB0aGlzLl9pc1NlcnZlciA9ICEhaXNTZXJ2ZXI7XG4gICAgdGhpcy5fZGVmbGF0ZSA9IG51bGw7XG4gICAgdGhpcy5faW5mbGF0ZSA9IG51bGw7XG5cbiAgICB0aGlzLnBhcmFtcyA9IG51bGw7XG5cbiAgICBpZiAoIXpsaWJMaW1pdGVyKSB7XG4gICAgICBjb25zdCBjb25jdXJyZW5jeSA9XG4gICAgICAgIHRoaXMuX29wdGlvbnMuY29uY3VycmVuY3lMaW1pdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB0aGlzLl9vcHRpb25zLmNvbmN1cnJlbmN5TGltaXRcbiAgICAgICAgICA6IDEwO1xuICAgICAgemxpYkxpbWl0ZXIgPSBuZXcgTGltaXRlcihjb25jdXJyZW5jeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGV4dGVuc2lvbk5hbWUoKSB7XG4gICAgcmV0dXJuICdwZXJtZXNzYWdlLWRlZmxhdGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBleHRlbnNpb24gbmVnb3RpYXRpb24gb2ZmZXIuXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gRXh0ZW5zaW9uIHBhcmFtZXRlcnNcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgb2ZmZXIoKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5zZXJ2ZXJOb0NvbnRleHRUYWtlb3Zlcikge1xuICAgICAgcGFyYW1zLnNlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wdGlvbnMuY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIpIHtcbiAgICAgIHBhcmFtcy5jbGllbnRfbm9fY29udGV4dF90YWtlb3ZlciA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcHRpb25zLnNlcnZlck1heFdpbmRvd0JpdHMpIHtcbiAgICAgIHBhcmFtcy5zZXJ2ZXJfbWF4X3dpbmRvd19iaXRzID0gdGhpcy5fb3B0aW9ucy5zZXJ2ZXJNYXhXaW5kb3dCaXRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzKSB7XG4gICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA9IHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cztcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cyA9PSBudWxsKSB7XG4gICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQgYW4gZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVyL3Jlc3BvbnNlLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBjb25maWd1cmF0aW9ucyBUaGUgZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVycy9yZXBvbnNlXG4gICAqIEByZXR1cm4ge09iamVjdH0gQWNjZXB0ZWQgY29uZmlndXJhdGlvblxuICAgKiBAcHVibGljXG4gICAqL1xuICBhY2NlcHQoY29uZmlndXJhdGlvbnMpIHtcbiAgICBjb25maWd1cmF0aW9ucyA9IHRoaXMubm9ybWFsaXplUGFyYW1zKGNvbmZpZ3VyYXRpb25zKTtcblxuICAgIHRoaXMucGFyYW1zID0gdGhpcy5faXNTZXJ2ZXJcbiAgICAgID8gdGhpcy5hY2NlcHRBc1NlcnZlcihjb25maWd1cmF0aW9ucylcbiAgICAgIDogdGhpcy5hY2NlcHRBc0NsaWVudChjb25maWd1cmF0aW9ucyk7XG5cbiAgICByZXR1cm4gdGhpcy5wYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBleHRlbnNpb24uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMuX2luZmxhdGUpIHtcbiAgICAgIHRoaXMuX2luZmxhdGUuY2xvc2UoKTtcbiAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kZWZsYXRlKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuX2RlZmxhdGVba0NhbGxiYWNrXTtcblxuICAgICAgdGhpcy5fZGVmbGF0ZS5jbG9zZSgpO1xuICAgICAgdGhpcy5fZGVmbGF0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayhcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVGhlIGRlZmxhdGUgc3RyZWFtIHdhcyBjbG9zZWQgd2hpbGUgZGF0YSB3YXMgYmVpbmcgcHJvY2Vzc2VkJ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogIEFjY2VwdCBhbiBleHRlbnNpb24gbmVnb3RpYXRpb24gb2ZmZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IG9mZmVycyBUaGUgZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVyc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IEFjY2VwdGVkIGNvbmZpZ3VyYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFjY2VwdEFzU2VydmVyKG9mZmVycykge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9vcHRpb25zO1xuICAgIGNvbnN0IGFjY2VwdGVkID0gb2ZmZXJzLmZpbmQoKHBhcmFtcykgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAob3B0cy5zZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlciA9PT0gZmFsc2UgJiZcbiAgICAgICAgICBwYXJhbXMuc2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXIpIHx8XG4gICAgICAgIChwYXJhbXMuc2VydmVyX21heF93aW5kb3dfYml0cyAmJlxuICAgICAgICAgIChvcHRzLnNlcnZlck1heFdpbmRvd0JpdHMgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICAodHlwZW9mIG9wdHMuc2VydmVyTWF4V2luZG93Qml0cyA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgb3B0cy5zZXJ2ZXJNYXhXaW5kb3dCaXRzID4gcGFyYW1zLnNlcnZlcl9tYXhfd2luZG93X2JpdHMpKSkgfHxcbiAgICAgICAgKHR5cGVvZiBvcHRzLmNsaWVudE1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgIXBhcmFtcy5jbGllbnRfbWF4X3dpbmRvd19iaXRzKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBpZiAoIWFjY2VwdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vbmUgb2YgdGhlIGV4dGVuc2lvbiBvZmZlcnMgY2FuIGJlIGFjY2VwdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuc2VydmVyTm9Db250ZXh0VGFrZW92ZXIpIHtcbiAgICAgIGFjY2VwdGVkLnNlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9wdHMuY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIpIHtcbiAgICAgIGFjY2VwdGVkLmNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRzLnNlcnZlck1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInKSB7XG4gICAgICBhY2NlcHRlZC5zZXJ2ZXJfbWF4X3dpbmRvd19iaXRzID0gb3B0cy5zZXJ2ZXJNYXhXaW5kb3dCaXRzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMuY2xpZW50TWF4V2luZG93Qml0cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFjY2VwdGVkLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPSBvcHRzLmNsaWVudE1heFdpbmRvd0JpdHM7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGFjY2VwdGVkLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPT09IHRydWUgfHxcbiAgICAgIG9wdHMuY2xpZW50TWF4V2luZG93Qml0cyA9PT0gZmFsc2VcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBhY2NlcHRlZC5jbGllbnRfbWF4X3dpbmRvd19iaXRzO1xuICAgIH1cblxuICAgIHJldHVybiBhY2NlcHRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQgdGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gcmVzcG9uc2UgVGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiByZXNwb25zZVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IEFjY2VwdGVkIGNvbmZpZ3VyYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFjY2VwdEFzQ2xpZW50KHJlc3BvbnNlKSB7XG4gICAgY29uc3QgcGFyYW1zID0gcmVzcG9uc2VbMF07XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9vcHRpb25zLmNsaWVudE5vQ29udGV4dFRha2VvdmVyID09PSBmYWxzZSAmJlxuICAgICAgcGFyYW1zLmNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgcGFyYW1ldGVyIFwiY2xpZW50X25vX2NvbnRleHRfdGFrZW92ZXJcIicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmNsaWVudF9tYXhfd2luZG93X2JpdHMpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzID09PSAnbnVtYmVyJykge1xuICAgICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA9IHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzID09PSBmYWxzZSB8fFxuICAgICAgKHR5cGVvZiB0aGlzLl9vcHRpb25zLmNsaWVudE1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInICYmXG4gICAgICAgIHBhcmFtcy5jbGllbnRfbWF4X3dpbmRvd19iaXRzID4gdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVW5leHBlY3RlZCBvciBpbnZhbGlkIHBhcmFtZXRlciBcImNsaWVudF9tYXhfd2luZG93X2JpdHNcIidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gY29uZmlndXJhdGlvbnMgVGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiBvZmZlcnMvcmVwb25zZVxuICAgKiBAcmV0dXJuIHtBcnJheX0gVGhlIG9mZmVycy9yZXNwb25zZSB3aXRoIG5vcm1hbGl6ZWQgcGFyYW1ldGVyc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbm9ybWFsaXplUGFyYW1zKGNvbmZpZ3VyYXRpb25zKSB7XG4gICAgY29uZmlndXJhdGlvbnMuZm9yRWFjaCgocGFyYW1zKSA9PiB7XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJhbXNba2V5XTtcblxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyIFwiJHtrZXl9XCIgbXVzdCBoYXZlIG9ubHkgYSBzaW5nbGUgdmFsdWVgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gdmFsdWVbMF07XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ2NsaWVudF9tYXhfd2luZG93X2JpdHMnKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBudW0gPSArdmFsdWU7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtKSB8fCBudW0gPCA4IHx8IG51bSA+IDE1KSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYEludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciBcIiR7a2V5fVwiOiAke3ZhbHVlfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gbnVtO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzU2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyIFwiJHtrZXl9XCI6ICR7dmFsdWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnc2VydmVyX21heF93aW5kb3dfYml0cycpIHtcbiAgICAgICAgICBjb25zdCBudW0gPSArdmFsdWU7XG4gICAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtIDwgOCB8fCBudW0gPiAxNSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgYEludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciBcIiR7a2V5fVwiOiAke3ZhbHVlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbHVlID0gbnVtO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGtleSA9PT0gJ2NsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyJyB8fFxuICAgICAgICAgIGtleSA9PT0gJ3NlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyJ1xuICAgICAgICApIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgXCIke2tleX1cIjogJHt2YWx1ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcGFyYW1ldGVyIFwiJHtrZXl9XCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmFtc1trZXldID0gdmFsdWU7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjb25maWd1cmF0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvbXByZXNzIGRhdGEuIENvbmN1cnJlbmN5IGxpbWl0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIENvbXByZXNzZWQgZGF0YVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBkZWNvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICB6bGliTGltaXRlci5hZGQoKGRvbmUpID0+IHtcbiAgICAgIHRoaXMuX2RlY29tcHJlc3MoZGF0YSwgZmluLCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wcmVzcyBkYXRhLiBDb25jdXJyZW5jeSBsaW1pdGVkLlxuICAgKlxuICAgKiBAcGFyYW0geyhCdWZmZXJ8U3RyaW5nKX0gZGF0YSBEYXRhIHRvIGNvbXByZXNzXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZmluIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIHRoZSBsYXN0IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICB6bGliTGltaXRlci5hZGQoKGRvbmUpID0+IHtcbiAgICAgIHRoaXMuX2NvbXByZXNzKGRhdGEsIGZpbiwgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb21wcmVzcyBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBDb21wcmVzc2VkIGRhdGFcbiAgICogQHBhcmFtIHtCb29sZWFufSBmaW4gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgdGhlIGxhc3QgZnJhZ21lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kZWNvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuX2lzU2VydmVyID8gJ2NsaWVudCcgOiAnc2VydmVyJztcblxuICAgIGlmICghdGhpcy5faW5mbGF0ZSkge1xuICAgICAgY29uc3Qga2V5ID0gYCR7ZW5kcG9pbnR9X21heF93aW5kb3dfYml0c2A7XG4gICAgICBjb25zdCB3aW5kb3dCaXRzID1cbiAgICAgICAgdHlwZW9mIHRoaXMucGFyYW1zW2tleV0gIT09ICdudW1iZXInXG4gICAgICAgICAgPyB6bGliLlpfREVGQVVMVF9XSU5ET1dCSVRTXG4gICAgICAgICAgOiB0aGlzLnBhcmFtc1trZXldO1xuXG4gICAgICB0aGlzLl9pbmZsYXRlID0gemxpYi5jcmVhdGVJbmZsYXRlUmF3KHtcbiAgICAgICAgLi4udGhpcy5fb3B0aW9ucy56bGliSW5mbGF0ZU9wdGlvbnMsXG4gICAgICAgIHdpbmRvd0JpdHNcbiAgICAgIH0pO1xuICAgICAgdGhpcy5faW5mbGF0ZVtrUGVyTWVzc2FnZURlZmxhdGVdID0gdGhpcztcbiAgICAgIHRoaXMuX2luZmxhdGVba1RvdGFsTGVuZ3RoXSA9IDA7XG4gICAgICB0aGlzLl9pbmZsYXRlW2tCdWZmZXJzXSA9IFtdO1xuICAgICAgdGhpcy5faW5mbGF0ZS5vbignZXJyb3InLCBpbmZsYXRlT25FcnJvcik7XG4gICAgICB0aGlzLl9pbmZsYXRlLm9uKCdkYXRhJywgaW5mbGF0ZU9uRGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5faW5mbGF0ZVtrQ2FsbGJhY2tdID0gY2FsbGJhY2s7XG5cbiAgICB0aGlzLl9pbmZsYXRlLndyaXRlKGRhdGEpO1xuICAgIGlmIChmaW4pIHRoaXMuX2luZmxhdGUud3JpdGUoVFJBSUxFUik7XG5cbiAgICB0aGlzLl9pbmZsYXRlLmZsdXNoKCgpID0+IHtcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuX2luZmxhdGVba0Vycm9yXTtcblxuICAgICAgaWYgKGVycikge1xuICAgICAgICB0aGlzLl9pbmZsYXRlLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBidWZmZXJVdGlsLmNvbmNhdChcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrQnVmZmVyc10sXG4gICAgICAgIHRoaXMuX2luZmxhdGVba1RvdGFsTGVuZ3RoXVxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuX2luZmxhdGUuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCkge1xuICAgICAgICB0aGlzLl9pbmZsYXRlLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrVG90YWxMZW5ndGhdID0gMDtcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgICBpZiAoZmluICYmIHRoaXMucGFyYW1zW2Ake2VuZHBvaW50fV9ub19jb250ZXh0X3Rha2VvdmVyYF0pIHtcbiAgICAgICAgICB0aGlzLl9pbmZsYXRlLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHJlc3MgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHsoQnVmZmVyfFN0cmluZyl9IGRhdGEgRGF0YSB0byBjb21wcmVzc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuX2lzU2VydmVyID8gJ3NlcnZlcicgOiAnY2xpZW50JztcblxuICAgIGlmICghdGhpcy5fZGVmbGF0ZSkge1xuICAgICAgY29uc3Qga2V5ID0gYCR7ZW5kcG9pbnR9X21heF93aW5kb3dfYml0c2A7XG4gICAgICBjb25zdCB3aW5kb3dCaXRzID1cbiAgICAgICAgdHlwZW9mIHRoaXMucGFyYW1zW2tleV0gIT09ICdudW1iZXInXG4gICAgICAgICAgPyB6bGliLlpfREVGQVVMVF9XSU5ET1dCSVRTXG4gICAgICAgICAgOiB0aGlzLnBhcmFtc1trZXldO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlID0gemxpYi5jcmVhdGVEZWZsYXRlUmF3KHtcbiAgICAgICAgLi4udGhpcy5fb3B0aW9ucy56bGliRGVmbGF0ZU9wdGlvbnMsXG4gICAgICAgIHdpbmRvd0JpdHNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF0gPSAwO1xuICAgICAgdGhpcy5fZGVmbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgdGhpcy5fZGVmbGF0ZS5vbignZGF0YScsIGRlZmxhdGVPbkRhdGEpO1xuICAgIH1cblxuICAgIHRoaXMuX2RlZmxhdGVba0NhbGxiYWNrXSA9IGNhbGxiYWNrO1xuXG4gICAgdGhpcy5fZGVmbGF0ZS53cml0ZShkYXRhKTtcbiAgICB0aGlzLl9kZWZsYXRlLmZsdXNoKHpsaWIuWl9TWU5DX0ZMVVNILCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2RlZmxhdGUpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGRlZmxhdGUgc3RyZWFtIHdhcyBjbG9zZWQgd2hpbGUgZGF0YSB3YXMgYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAgICAvL1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhID0gYnVmZmVyVXRpbC5jb25jYXQoXG4gICAgICAgIHRoaXMuX2RlZmxhdGVba0J1ZmZlcnNdLFxuICAgICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF1cbiAgICAgICk7XG5cbiAgICAgIGlmIChmaW4pIHtcbiAgICAgICAgZGF0YSA9IG5ldyBGYXN0QnVmZmVyKGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEubGVuZ3RoIC0gNCk7XG4gICAgICB9XG5cbiAgICAgIC8vXG4gICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkIGFnYWluIGluXG4gICAgICAvLyBgUGVyTWVzc2FnZURlZmxhdGUjY2xlYW51cCgpYC5cbiAgICAgIC8vXG4gICAgICB0aGlzLl9kZWZsYXRlW2tDYWxsYmFja10gPSBudWxsO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF0gPSAwO1xuICAgICAgdGhpcy5fZGVmbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgaWYgKGZpbiAmJiB0aGlzLnBhcmFtc1tgJHtlbmRwb2ludH1fbm9fY29udGV4dF90YWtlb3ZlcmBdKSB7XG4gICAgICAgIHRoaXMuX2RlZmxhdGUucmVzZXQoKTtcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgfSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBQZXJNZXNzYWdlRGVmbGF0ZTtcblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGB6bGliLkRlZmxhdGVSYXdgIHN0cmVhbSBgJ2RhdGEnYCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgQSBjaHVuayBvZiBkYXRhXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZsYXRlT25EYXRhKGNodW5rKSB7XG4gIHRoaXNba0J1ZmZlcnNdLnB1c2goY2h1bmspO1xuICB0aGlzW2tUb3RhbExlbmd0aF0gKz0gY2h1bmsubGVuZ3RoO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYHpsaWIuSW5mbGF0ZVJhd2Agc3RyZWFtIGAnZGF0YSdgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBjaHVuayBBIGNodW5rIG9mIGRhdGFcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluZmxhdGVPbkRhdGEoY2h1bmspIHtcbiAgdGhpc1trVG90YWxMZW5ndGhdICs9IGNodW5rLmxlbmd0aDtcblxuICBpZiAoXG4gICAgdGhpc1trUGVyTWVzc2FnZURlZmxhdGVdLl9tYXhQYXlsb2FkIDwgMSB8fFxuICAgIHRoaXNba1RvdGFsTGVuZ3RoXSA8PSB0aGlzW2tQZXJNZXNzYWdlRGVmbGF0ZV0uX21heFBheWxvYWRcbiAgKSB7XG4gICAgdGhpc1trQnVmZmVyc10ucHVzaChjaHVuayk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpc1trRXJyb3JdID0gbmV3IFJhbmdlRXJyb3IoJ01heCBwYXlsb2FkIHNpemUgZXhjZWVkZWQnKTtcbiAgdGhpc1trRXJyb3JdLmNvZGUgPSAnV1NfRVJSX1VOU1VQUE9SVEVEX01FU1NBR0VfTEVOR1RIJztcbiAgdGhpc1trRXJyb3JdW2tTdGF0dXNDb2RlXSA9IDEwMDk7XG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBpbmZsYXRlT25EYXRhKTtcbiAgdGhpcy5yZXNldCgpO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYHpsaWIuSW5mbGF0ZVJhd2Agc3RyZWFtIGAnZXJyb3InYCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnIgVGhlIGVtaXR0ZWQgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluZmxhdGVPbkVycm9yKGVycikge1xuICAvL1xuICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgYFpsaWIjY2xvc2UoKWAgYXMgdGhlIGhhbmRsZSBpcyBhdXRvbWF0aWNhbGx5XG4gIC8vIGNsb3NlZCB3aGVuIGFuIGVycm9yIGlzIGVtaXR0ZWQuXG4gIC8vXG4gIHRoaXNba1Blck1lc3NhZ2VEZWZsYXRlXS5faW5mbGF0ZSA9IG51bGw7XG4gIGVycltrU3RhdHVzQ29kZV0gPSAxMDA3O1xuICB0aGlzW2tDYWxsYmFja10oZXJyKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBXcml0YWJsZSB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlID0gcmVxdWlyZSgnLi9wZXJtZXNzYWdlLWRlZmxhdGUnKTtcbmNvbnN0IHtcbiAgQklOQVJZX1RZUEVTLFxuICBFTVBUWV9CVUZGRVIsXG4gIGtTdGF0dXNDb2RlLFxuICBrV2ViU29ja2V0XG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IHsgY29uY2F0LCB0b0FycmF5QnVmZmVyLCB1bm1hc2sgfSA9IHJlcXVpcmUoJy4vYnVmZmVyLXV0aWwnKTtcbmNvbnN0IHsgaXNWYWxpZFN0YXR1c0NvZGUsIGlzVmFsaWRVVEY4IH0gPSByZXF1aXJlKCcuL3ZhbGlkYXRpb24nKTtcblxuY29uc3QgRmFzdEJ1ZmZlciA9IEJ1ZmZlcltTeW1ib2wuc3BlY2llc107XG5cbmNvbnN0IEdFVF9JTkZPID0gMDtcbmNvbnN0IEdFVF9QQVlMT0FEX0xFTkdUSF8xNiA9IDE7XG5jb25zdCBHRVRfUEFZTE9BRF9MRU5HVEhfNjQgPSAyO1xuY29uc3QgR0VUX01BU0sgPSAzO1xuY29uc3QgR0VUX0RBVEEgPSA0O1xuY29uc3QgSU5GTEFUSU5HID0gNTtcbmNvbnN0IERFRkVSX0VWRU5UID0gNjtcblxuLyoqXG4gKiBIeUJpIFJlY2VpdmVyIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBleHRlbmRzIFdyaXRhYmxlXG4gKi9cbmNsYXNzIFJlY2VpdmVyIGV4dGVuZHMgV3JpdGFibGUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIFJlY2VpdmVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cz10cnVlXSBTcGVjaWZpZXMgd2hldGhlclxuICAgKiAgICAgYW55IG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWRcbiAgICogICAgIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHRpY2tcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmJpbmFyeVR5cGU9bm9kZWJ1ZmZlcl0gVGhlIHR5cGUgZm9yIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5leHRlbnNpb25zXSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbmVnb3RpYXRlZFxuICAgKiAgICAgZXh0ZW5zaW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmlzU2VydmVyPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciB0byBvcGVyYXRlIGluXG4gICAqICAgICBjbGllbnQgb3Igc2VydmVyIG1vZGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heFBheWxvYWQ9MF0gVGhlIG1heGltdW0gYWxsb3dlZCBtZXNzYWdlIGxlbmd0aFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAgICogICAgIG5vdCB0byBza2lwIFVURi04IHZhbGlkYXRpb24gZm9yIHRleHQgYW5kIGNsb3NlIG1lc3NhZ2VzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYWxsb3dTeW5jaHJvbm91c0V2ZW50cyA9XG4gICAgICBvcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG9wdGlvbnMuYWxsb3dTeW5jaHJvbm91c0V2ZW50c1xuICAgICAgICA6IHRydWU7XG4gICAgdGhpcy5fYmluYXJ5VHlwZSA9IG9wdGlvbnMuYmluYXJ5VHlwZSB8fCBCSU5BUllfVFlQRVNbMF07XG4gICAgdGhpcy5fZXh0ZW5zaW9ucyA9IG9wdGlvbnMuZXh0ZW5zaW9ucyB8fCB7fTtcbiAgICB0aGlzLl9pc1NlcnZlciA9ICEhb3B0aW9ucy5pc1NlcnZlcjtcbiAgICB0aGlzLl9tYXhQYXlsb2FkID0gb3B0aW9ucy5tYXhQYXlsb2FkIHwgMDtcbiAgICB0aGlzLl9za2lwVVRGOFZhbGlkYXRpb24gPSAhIW9wdGlvbnMuc2tpcFVURjhWYWxpZGF0aW9uO1xuICAgIHRoaXNba1dlYlNvY2tldF0gPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzID0gMDtcbiAgICB0aGlzLl9idWZmZXJzID0gW107XG5cbiAgICB0aGlzLl9jb21wcmVzc2VkID0gZmFsc2U7XG4gICAgdGhpcy5fcGF5bG9hZExlbmd0aCA9IDA7XG4gICAgdGhpcy5fbWFzayA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9mcmFnbWVudGVkID0gMDtcbiAgICB0aGlzLl9tYXNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9maW4gPSBmYWxzZTtcbiAgICB0aGlzLl9vcGNvZGUgPSAwO1xuXG4gICAgdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9mcmFnbWVudHMgPSBbXTtcblxuICAgIHRoaXMuX2Vycm9yZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGBXcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlKClgLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgVGhlIGNodW5rIG9mIGRhdGEgdG8gd3JpdGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGVuY29kaW5nIFRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgYGNodW5rYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICBpZiAodGhpcy5fb3Bjb2RlID09PSAweDA4ICYmIHRoaXMuX3N0YXRlID09IEdFVF9JTkZPKSByZXR1cm4gY2IoKTtcblxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuICAgIHRoaXMuX2J1ZmZlcnMucHVzaChjaHVuayk7XG4gICAgdGhpcy5zdGFydExvb3AoY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVzIGBuYCBieXRlcyBmcm9tIHRoZSBidWZmZXJlZCBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnN1bWVcbiAgICogQHJldHVybiB7QnVmZmVyfSBUaGUgY29uc3VtZWQgYnl0ZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN1bWUobikge1xuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgLT0gbjtcblxuICAgIGlmIChuID09PSB0aGlzLl9idWZmZXJzWzBdLmxlbmd0aCkgcmV0dXJuIHRoaXMuX2J1ZmZlcnMuc2hpZnQoKTtcblxuICAgIGlmIChuIDwgdGhpcy5fYnVmZmVyc1swXS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IHRoaXMuX2J1ZmZlcnNbMF07XG4gICAgICB0aGlzLl9idWZmZXJzWzBdID0gbmV3IEZhc3RCdWZmZXIoXG4gICAgICAgIGJ1Zi5idWZmZXIsXG4gICAgICAgIGJ1Zi5ieXRlT2Zmc2V0ICsgbixcbiAgICAgICAgYnVmLmxlbmd0aCAtIG5cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBuZXcgRmFzdEJ1ZmZlcihidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgbik7XG4gICAgfVxuXG4gICAgY29uc3QgZHN0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4pO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgYnVmID0gdGhpcy5fYnVmZmVyc1swXTtcbiAgICAgIGNvbnN0IG9mZnNldCA9IGRzdC5sZW5ndGggLSBuO1xuXG4gICAgICBpZiAobiA+PSBidWYubGVuZ3RoKSB7XG4gICAgICAgIGRzdC5zZXQodGhpcy5fYnVmZmVycy5zaGlmdCgpLCBvZmZzZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHN0LnNldChuZXcgVWludDhBcnJheShidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgbiksIG9mZnNldCk7XG4gICAgICAgIHRoaXMuX2J1ZmZlcnNbMF0gPSBuZXcgRmFzdEJ1ZmZlcihcbiAgICAgICAgICBidWYuYnVmZmVyLFxuICAgICAgICAgIGJ1Zi5ieXRlT2Zmc2V0ICsgbixcbiAgICAgICAgICBidWYubGVuZ3RoIC0gblxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBuIC09IGJ1Zi5sZW5ndGg7XG4gICAgfSB3aGlsZSAobiA+IDApO1xuXG4gICAgcmV0dXJuIGRzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBhcnNpbmcgbG9vcC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0TG9vcChjYikge1xuICAgIHRoaXMuX2xvb3AgPSB0cnVlO1xuXG4gICAgZG8ge1xuICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xuICAgICAgICBjYXNlIEdFVF9JTkZPOlxuICAgICAgICAgIHRoaXMuZ2V0SW5mbyhjYik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgR0VUX1BBWUxPQURfTEVOR1RIXzE2OlxuICAgICAgICAgIHRoaXMuZ2V0UGF5bG9hZExlbmd0aDE2KGNiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBHRVRfUEFZTE9BRF9MRU5HVEhfNjQ6XG4gICAgICAgICAgdGhpcy5nZXRQYXlsb2FkTGVuZ3RoNjQoY2IpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEdFVF9NQVNLOlxuICAgICAgICAgIHRoaXMuZ2V0TWFzaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEdFVF9EQVRBOlxuICAgICAgICAgIHRoaXMuZ2V0RGF0YShjYik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSU5GTEFUSU5HOlxuICAgICAgICBjYXNlIERFRkVSX0VWRU5UOlxuICAgICAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSB3aGlsZSAodGhpcy5fbG9vcCk7XG5cbiAgICBpZiAoIXRoaXMuX2Vycm9yZWQpIGNiKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGZpcnN0IHR3byBieXRlcyBvZiBhIGZyYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0SW5mbyhjYikge1xuICAgIGlmICh0aGlzLl9idWZmZXJlZEJ5dGVzIDwgMikge1xuICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuY29uc3VtZSgyKTtcblxuICAgIGlmICgoYnVmWzBdICYgMHgzMCkgIT09IDB4MDApIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgJ1JTVjIgYW5kIFJTVjMgbXVzdCBiZSBjbGVhcicsXG4gICAgICAgIHRydWUsXG4gICAgICAgIDEwMDIsXG4gICAgICAgICdXU19FUlJfVU5FWFBFQ1RFRF9SU1ZfMl8zJ1xuICAgICAgKTtcblxuICAgICAgY2IoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXByZXNzZWQgPSAoYnVmWzBdICYgMHg0MCkgPT09IDB4NDA7XG5cbiAgICBpZiAoY29tcHJlc3NlZCAmJiAhdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAnUlNWMSBtdXN0IGJlIGNsZWFyJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgMTAwMixcbiAgICAgICAgJ1dTX0VSUl9VTkVYUEVDVEVEX1JTVl8xJ1xuICAgICAgKTtcblxuICAgICAgY2IoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpbiA9IChidWZbMF0gJiAweDgwKSA9PT0gMHg4MDtcbiAgICB0aGlzLl9vcGNvZGUgPSBidWZbMF0gJiAweDBmO1xuICAgIHRoaXMuX3BheWxvYWRMZW5ndGggPSBidWZbMV0gJiAweDdmO1xuXG4gICAgaWYgKHRoaXMuX29wY29kZSA9PT0gMHgwMCkge1xuICAgICAgaWYgKGNvbXByZXNzZWQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ1JTVjEgbXVzdCBiZSBjbGVhcicsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfVU5FWFBFQ1RFRF9SU1ZfMSdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9mcmFnbWVudGVkKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgICdpbnZhbGlkIG9wY29kZSAwJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIDEwMDIsXG4gICAgICAgICAgJ1dTX0VSUl9JTlZBTElEX09QQ09ERSdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb3Bjb2RlID0gdGhpcy5fZnJhZ21lbnRlZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wY29kZSA9PT0gMHgwMSB8fCB0aGlzLl9vcGNvZGUgPT09IDB4MDIpIHtcbiAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgIGBpbnZhbGlkIG9wY29kZSAke3RoaXMuX29wY29kZX1gLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgMTAwMixcbiAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfT1BDT0RFJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wcmVzc2VkID0gY29tcHJlc3NlZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wY29kZSA+IDB4MDcgJiYgdGhpcy5fb3Bjb2RlIDwgMHgwYikge1xuICAgICAgaWYgKCF0aGlzLl9maW4pIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ0ZJTiBtdXN0IGJlIHNldCcsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfRVhQRUNURURfRklOJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29tcHJlc3NlZCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICAnUlNWMSBtdXN0IGJlIGNsZWFyJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIDEwMDIsXG4gICAgICAgICAgJ1dTX0VSUl9VTkVYUEVDVEVEX1JTVl8xJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX3BheWxvYWRMZW5ndGggPiAweDdkIHx8XG4gICAgICAgICh0aGlzLl9vcGNvZGUgPT09IDB4MDggJiYgdGhpcy5fcGF5bG9hZExlbmd0aCA9PT0gMSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICBgaW52YWxpZCBwYXlsb2FkIGxlbmd0aCAke3RoaXMuX3BheWxvYWRMZW5ndGh9YCxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIDEwMDIsXG4gICAgICAgICAgJ1dTX0VSUl9JTlZBTElEX0NPTlRST0xfUEFZTE9BRF9MRU5HVEgnXG4gICAgICAgICk7XG5cbiAgICAgICAgY2IoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgYGludmFsaWQgb3Bjb2RlICR7dGhpcy5fb3Bjb2RlfWAsXG4gICAgICAgIHRydWUsXG4gICAgICAgIDEwMDIsXG4gICAgICAgICdXU19FUlJfSU5WQUxJRF9PUENPREUnXG4gICAgICApO1xuXG4gICAgICBjYihlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9maW4gJiYgIXRoaXMuX2ZyYWdtZW50ZWQpIHRoaXMuX2ZyYWdtZW50ZWQgPSB0aGlzLl9vcGNvZGU7XG4gICAgdGhpcy5fbWFza2VkID0gKGJ1ZlsxXSAmIDB4ODApID09PSAweDgwO1xuXG4gICAgaWYgKHRoaXMuX2lzU2VydmVyKSB7XG4gICAgICBpZiAoIXRoaXMuX21hc2tlZCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICAnTUFTSyBtdXN0IGJlIHNldCcsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfRVhQRUNURURfTUFTSydcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX21hc2tlZCkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAnTUFTSyBtdXN0IGJlIGNsZWFyJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgMTAwMixcbiAgICAgICAgJ1dTX0VSUl9VTkVYUEVDVEVEX01BU0snXG4gICAgICApO1xuXG4gICAgICBjYihlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BheWxvYWRMZW5ndGggPT09IDEyNikgdGhpcy5fc3RhdGUgPSBHRVRfUEFZTE9BRF9MRU5HVEhfMTY7XG4gICAgZWxzZSBpZiAodGhpcy5fcGF5bG9hZExlbmd0aCA9PT0gMTI3KSB0aGlzLl9zdGF0ZSA9IEdFVF9QQVlMT0FEX0xFTkdUSF82NDtcbiAgICBlbHNlIHRoaXMuaGF2ZUxlbmd0aChjYik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBleHRlbmRlZCBwYXlsb2FkIGxlbmd0aCAoNysxNikuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRQYXlsb2FkTGVuZ3RoMTYoY2IpIHtcbiAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IDIpIHtcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXlsb2FkTGVuZ3RoID0gdGhpcy5jb25zdW1lKDIpLnJlYWRVSW50MTZCRSgwKTtcbiAgICB0aGlzLmhhdmVMZW5ndGgoY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGggKDcrNjQpLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0UGF5bG9hZExlbmd0aDY0KGNiKSB7XG4gICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCA4KSB7XG4gICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVmID0gdGhpcy5jb25zdW1lKDgpO1xuICAgIGNvbnN0IG51bSA9IGJ1Zi5yZWFkVUludDMyQkUoMCk7XG5cbiAgICAvL1xuICAgIC8vIFRoZSBtYXhpbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0IGlzIDJeNTMgLSAxLiBBbiBlcnJvciBpcyByZXR1cm5lZFxuICAgIC8vIGlmIHBheWxvYWQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIG51bWJlci5cbiAgICAvL1xuICAgIGlmIChudW0gPiBNYXRoLnBvdygyLCA1MyAtIDMyKSAtIDEpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgJ1Vuc3VwcG9ydGVkIFdlYlNvY2tldCBmcmFtZTogcGF5bG9hZCBsZW5ndGggPiAyXjUzIC0gMScsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAxMDA5LFxuICAgICAgICAnV1NfRVJSX1VOU1VQUE9SVEVEX0RBVEFfUEFZTE9BRF9MRU5HVEgnXG4gICAgICApO1xuXG4gICAgICBjYihlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcGF5bG9hZExlbmd0aCA9IG51bSAqIE1hdGgucG93KDIsIDMyKSArIGJ1Zi5yZWFkVUludDMyQkUoNCk7XG4gICAgdGhpcy5oYXZlTGVuZ3RoKGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXlsb2FkIGxlbmd0aCBoYXMgYmVlbiByZWFkLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGF2ZUxlbmd0aChjYikge1xuICAgIGlmICh0aGlzLl9wYXlsb2FkTGVuZ3RoICYmIHRoaXMuX29wY29kZSA8IDB4MDgpIHtcbiAgICAgIHRoaXMuX3RvdGFsUGF5bG9hZExlbmd0aCArPSB0aGlzLl9wYXlsb2FkTGVuZ3RoO1xuICAgICAgaWYgKHRoaXMuX3RvdGFsUGF5bG9hZExlbmd0aCA+IHRoaXMuX21heFBheWxvYWQgJiYgdGhpcy5fbWF4UGF5bG9hZCA+IDApIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ01heCBwYXlsb2FkIHNpemUgZXhjZWVkZWQnLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIDEwMDksXG4gICAgICAgICAgJ1dTX0VSUl9VTlNVUFBPUlRFRF9NRVNTQUdFX0xFTkdUSCdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWFza2VkKSB0aGlzLl9zdGF0ZSA9IEdFVF9NQVNLO1xuICAgIGVsc2UgdGhpcy5fc3RhdGUgPSBHRVRfREFUQTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBtYXNrIGJ5dGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0TWFzaygpIHtcbiAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IDQpIHtcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXNrID0gdGhpcy5jb25zdW1lKDQpO1xuICAgIHRoaXMuX3N0YXRlID0gR0VUX0RBVEE7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgZGF0YSBieXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldERhdGEoY2IpIHtcbiAgICBsZXQgZGF0YSA9IEVNUFRZX0JVRkZFUjtcblxuICAgIGlmICh0aGlzLl9wYXlsb2FkTGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IHRoaXMuX3BheWxvYWRMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRhdGEgPSB0aGlzLmNvbnN1bWUodGhpcy5fcGF5bG9hZExlbmd0aCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fbWFza2VkICYmXG4gICAgICAgICh0aGlzLl9tYXNrWzBdIHwgdGhpcy5fbWFza1sxXSB8IHRoaXMuX21hc2tbMl0gfCB0aGlzLl9tYXNrWzNdKSAhPT0gMFxuICAgICAgKSB7XG4gICAgICAgIHVubWFzayhkYXRhLCB0aGlzLl9tYXNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb3Bjb2RlID4gMHgwNykge1xuICAgICAgdGhpcy5jb250cm9sTWVzc2FnZShkYXRhLCBjYik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbXByZXNzZWQpIHtcbiAgICAgIHRoaXMuX3N0YXRlID0gSU5GTEFUSU5HO1xuICAgICAgdGhpcy5kZWNvbXByZXNzKGRhdGEsIGNiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5sZW5ndGgpIHtcbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIG1lc3NhZ2UgaXMgbm90IGNvbXByZXNzZWQgc28gaXRzIGxlbmd0aCBpcyB0aGUgc3VtIG9mIHRoZSBwYXlsb2FkXG4gICAgICAvLyBsZW5ndGggb2YgYWxsIGZyYWdtZW50cy5cbiAgICAgIC8vXG4gICAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoO1xuICAgICAgdGhpcy5fZnJhZ21lbnRzLnB1c2goZGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhTWVzc2FnZShjYik7XG4gIH1cblxuICAvKipcbiAgICogRGVjb21wcmVzc2VzIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIENvbXByZXNzZWQgZGF0YVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjb21wcmVzcyhkYXRhLCBjYikge1xuICAgIGNvbnN0IHBlck1lc3NhZ2VEZWZsYXRlID0gdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXTtcblxuICAgIHBlck1lc3NhZ2VEZWZsYXRlLmRlY29tcHJlc3MoZGF0YSwgdGhpcy5fZmluLCAoZXJyLCBidWYpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuXG4gICAgICBpZiAoYnVmLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoICs9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLl9tZXNzYWdlTGVuZ3RoID4gdGhpcy5fbWF4UGF5bG9hZCAmJiB0aGlzLl9tYXhQYXlsb2FkID4gMCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgICAnTWF4IHBheWxvYWQgc2l6ZSBleGNlZWRlZCcsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIDEwMDksXG4gICAgICAgICAgICAnV1NfRVJSX1VOU1VQUE9SVEVEX01FU1NBR0VfTEVOR1RIJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjYihlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZnJhZ21lbnRzLnB1c2goYnVmKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXRhTWVzc2FnZShjYik7XG4gICAgICBpZiAodGhpcy5fc3RhdGUgPT09IEdFVF9JTkZPKSB0aGlzLnN0YXJ0TG9vcChjYik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGRhdGEgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRhdGFNZXNzYWdlKGNiKSB7XG4gICAgaWYgKCF0aGlzLl9maW4pIHtcbiAgICAgIHRoaXMuX3N0YXRlID0gR0VUX0lORk87XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZUxlbmd0aCA9IHRoaXMuX21lc3NhZ2VMZW5ndGg7XG4gICAgY29uc3QgZnJhZ21lbnRzID0gdGhpcy5fZnJhZ21lbnRzO1xuXG4gICAgdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9mcmFnbWVudGVkID0gMDtcbiAgICB0aGlzLl9mcmFnbWVudHMgPSBbXTtcblxuICAgIGlmICh0aGlzLl9vcGNvZGUgPT09IDIpIHtcbiAgICAgIGxldCBkYXRhO1xuXG4gICAgICBpZiAodGhpcy5fYmluYXJ5VHlwZSA9PT0gJ25vZGVidWZmZXInKSB7XG4gICAgICAgIGRhdGEgPSBjb25jYXQoZnJhZ21lbnRzLCBtZXNzYWdlTGVuZ3RoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYmluYXJ5VHlwZSA9PT0gJ2FycmF5YnVmZmVyJykge1xuICAgICAgICBkYXRhID0gdG9BcnJheUJ1ZmZlcihjb25jYXQoZnJhZ21lbnRzLCBtZXNzYWdlTGVuZ3RoKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JpbmFyeVR5cGUgPT09ICdibG9iJykge1xuICAgICAgICBkYXRhID0gbmV3IEJsb2IoZnJhZ21lbnRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEgPSBmcmFnbWVudHM7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9hbGxvd1N5bmNocm9ub3VzRXZlbnRzKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIGRhdGEsIHRydWUpO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBERUZFUl9FVkVOVDtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBkYXRhLCB0cnVlKTtcbiAgICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xuICAgICAgICAgIHRoaXMuc3RhcnRMb29wKGNiKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IGNvbmNhdChmcmFnbWVudHMsIG1lc3NhZ2VMZW5ndGgpO1xuXG4gICAgICBpZiAoIXRoaXMuX3NraXBVVEY4VmFsaWRhdGlvbiAmJiAhaXNWYWxpZFVURjgoYnVmKSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgRXJyb3IsXG4gICAgICAgICAgJ2ludmFsaWQgVVRGLTggc2VxdWVuY2UnLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgMTAwNyxcbiAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfVVRGOCdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBJTkZMQVRJTkcgfHwgdGhpcy5fYWxsb3dTeW5jaHJvbm91c0V2ZW50cykge1xuICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBidWYsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gREVGRVJfRVZFTlQ7XG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdtZXNzYWdlJywgYnVmLCBmYWxzZSk7XG4gICAgICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgICAgICAgICB0aGlzLnN0YXJ0TG9vcChjYik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgY29udHJvbCBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBEYXRhIHRvIGhhbmRsZVxuICAgKiBAcmV0dXJuIHsoRXJyb3J8UmFuZ2VFcnJvcnx1bmRlZmluZWQpfSBBIHBvc3NpYmxlIGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb250cm9sTWVzc2FnZShkYXRhLCBjYikge1xuICAgIGlmICh0aGlzLl9vcGNvZGUgPT09IDB4MDgpIHtcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdCgnY29uY2x1ZGUnLCAxMDA1LCBFTVBUWV9CVUZGRVIpO1xuICAgICAgICB0aGlzLmVuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGRhdGEucmVhZFVJbnQxNkJFKDApO1xuXG4gICAgICAgIGlmICghaXNWYWxpZFN0YXR1c0NvZGUoY29kZSkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgICAgYGludmFsaWQgc3RhdHVzIGNvZGUgJHtjb2RlfWAsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgMTAwMixcbiAgICAgICAgICAgICdXU19FUlJfSU5WQUxJRF9DTE9TRV9DT0RFJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjYihlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVmID0gbmV3IEZhc3RCdWZmZXIoXG4gICAgICAgICAgZGF0YS5idWZmZXIsXG4gICAgICAgICAgZGF0YS5ieXRlT2Zmc2V0ICsgMixcbiAgICAgICAgICBkYXRhLmxlbmd0aCAtIDJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXRoaXMuX3NraXBVVEY4VmFsaWRhdGlvbiAmJiAhaXNWYWxpZFVURjgoYnVmKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICAgIEVycm9yLFxuICAgICAgICAgICAgJ2ludmFsaWQgVVRGLTggc2VxdWVuY2UnLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIDEwMDcsXG4gICAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfVVRGOCdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY2IoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbWl0KCdjb25jbHVkZScsIGNvZGUsIGJ1Zik7XG4gICAgICAgIHRoaXMuZW5kKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3N0YXRlID0gR0VUX0lORk87XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FsbG93U3luY2hyb25vdXNFdmVudHMpIHtcbiAgICAgIHRoaXMuZW1pdCh0aGlzLl9vcGNvZGUgPT09IDB4MDkgPyAncGluZycgOiAncG9uZycsIGRhdGEpO1xuICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3RhdGUgPSBERUZFUl9FVkVOVDtcbiAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLl9vcGNvZGUgPT09IDB4MDkgPyAncGluZycgOiAncG9uZycsIGRhdGEpO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xuICAgICAgICB0aGlzLnN0YXJ0TG9vcChjYik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuIGVycm9yIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6RXJyb3J8UmFuZ2VFcnJvcil9IEVycm9yQ3RvciBUaGUgZXJyb3IgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtCb29sZWFufSBwcmVmaXggU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGFkZCBhIGRlZmF1bHQgcHJlZml4IHRvXG4gICAqICAgICBgbWVzc2FnZWBcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgVGhlIHN0YXR1cyBjb2RlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBlcnJvckNvZGUgVGhlIGV4cG9zZWQgZXJyb3IgY29kZVxuICAgKiBAcmV0dXJuIHsoRXJyb3J8UmFuZ2VFcnJvcil9IFRoZSBlcnJvclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlRXJyb3IoRXJyb3JDdG9yLCBtZXNzYWdlLCBwcmVmaXgsIHN0YXR1c0NvZGUsIGVycm9yQ29kZSkge1xuICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICB0aGlzLl9lcnJvcmVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvckN0b3IoXG4gICAgICBwcmVmaXggPyBgSW52YWxpZCBXZWJTb2NrZXQgZnJhbWU6ICR7bWVzc2FnZX1gIDogbWVzc2FnZVxuICAgICk7XG5cbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIHRoaXMuY3JlYXRlRXJyb3IpO1xuICAgIGVyci5jb2RlID0gZXJyb3JDb2RlO1xuICAgIGVycltrU3RhdHVzQ29kZV0gPSBzdGF0dXNDb2RlO1xuICAgIHJldHVybiBlcnI7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWNlaXZlcjtcbiIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXkR1cGxleFwiIH1dICovXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBEdXBsZXggfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuY29uc3QgeyByYW5kb21GaWxsU3luYyB9ID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlID0gcmVxdWlyZSgnLi9wZXJtZXNzYWdlLWRlZmxhdGUnKTtcbmNvbnN0IHsgRU1QVFlfQlVGRkVSLCBrV2ViU29ja2V0LCBOT09QIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuY29uc3QgeyBpc0Jsb2IsIGlzVmFsaWRTdGF0dXNDb2RlIH0gPSByZXF1aXJlKCcuL3ZhbGlkYXRpb24nKTtcbmNvbnN0IHsgbWFzazogYXBwbHlNYXNrLCB0b0J1ZmZlciB9ID0gcmVxdWlyZSgnLi9idWZmZXItdXRpbCcpO1xuXG5jb25zdCBrQnl0ZUxlbmd0aCA9IFN5bWJvbCgna0J5dGVMZW5ndGgnKTtcbmNvbnN0IG1hc2tCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNCk7XG5jb25zdCBSQU5ET01fUE9PTF9TSVpFID0gOCAqIDEwMjQ7XG5sZXQgcmFuZG9tUG9vbDtcbmxldCByYW5kb21Qb29sUG9pbnRlciA9IFJBTkRPTV9QT09MX1NJWkU7XG5cbmNvbnN0IERFRkFVTFQgPSAwO1xuY29uc3QgREVGTEFUSU5HID0gMTtcbmNvbnN0IEdFVF9CTE9CX0RBVEEgPSAyO1xuXG4vKipcbiAqIEh5QmkgU2VuZGVyIGltcGxlbWVudGF0aW9uLlxuICovXG5jbGFzcyBTZW5kZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIFNlbmRlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgY29ubmVjdGlvbiBzb2NrZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtleHRlbnNpb25zXSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbmVnb3RpYXRlZCBleHRlbnNpb25zXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtnZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBtYXNraW5nXG4gICAqICAgICBrZXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNvY2tldCwgZXh0ZW5zaW9ucywgZ2VuZXJhdGVNYXNrKSB7XG4gICAgdGhpcy5fZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgfHwge307XG5cbiAgICBpZiAoZ2VuZXJhdGVNYXNrKSB7XG4gICAgICB0aGlzLl9nZW5lcmF0ZU1hc2sgPSBnZW5lcmF0ZU1hc2s7XG4gICAgICB0aGlzLl9tYXNrQnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIH1cblxuICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcblxuICAgIHRoaXMuX2ZpcnN0RnJhZ21lbnQgPSB0cnVlO1xuICAgIHRoaXMuX2NvbXByZXNzID0gZmFsc2U7XG5cbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzID0gMDtcbiAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIHRoaXMuX3N0YXRlID0gREVGQVVMVDtcbiAgICB0aGlzLm9uZXJyb3IgPSBOT09QO1xuICAgIHRoaXNba1dlYlNvY2tldF0gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRnJhbWVzIGEgcGllY2Ugb2YgZGF0YSBhY2NvcmRpbmcgdG8gdGhlIEh5QmkgV2ViU29ja2V0IHByb3RvY29sLlxuICAgKlxuICAgKiBAcGFyYW0geyhCdWZmZXJ8U3RyaW5nKX0gZGF0YSBUaGUgZGF0YSB0byBmcmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZpbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNldCB0aGVcbiAgICogICAgIEZJTiBiaXRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZ2VuZXJhdGVNYXNrXSBUaGUgZnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSB0aGVcbiAgICogICAgIG1hc2tpbmcga2V5XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWFzaz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2tcbiAgICogICAgIGBkYXRhYFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gW29wdGlvbnMubWFza0J1ZmZlcl0gVGhlIGJ1ZmZlciB1c2VkIHRvIHN0b3JlIHRoZSBtYXNraW5nXG4gICAqICAgICBrZXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMub3Bjb2RlIFRoZSBvcGNvZGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZWFkT25seT1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgYGRhdGFgIGNhbiBiZVxuICAgKiAgICAgbW9kaWZpZWRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yc3YxPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gc2V0IHRoZVxuICAgKiAgICAgUlNWMSBiaXRcbiAgICogQHJldHVybiB7KEJ1ZmZlcnxTdHJpbmcpW119IFRoZSBmcmFtZWQgZGF0YVxuICAgKiBAcHVibGljXG4gICAqL1xuICBzdGF0aWMgZnJhbWUoZGF0YSwgb3B0aW9ucykge1xuICAgIGxldCBtYXNrO1xuICAgIGxldCBtZXJnZSA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSAyO1xuICAgIGxldCBza2lwTWFza2luZyA9IGZhbHNlO1xuXG4gICAgaWYgKG9wdGlvbnMubWFzaykge1xuICAgICAgbWFzayA9IG9wdGlvbnMubWFza0J1ZmZlciB8fCBtYXNrQnVmZmVyO1xuXG4gICAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZU1hc2spIHtcbiAgICAgICAgb3B0aW9ucy5nZW5lcmF0ZU1hc2sobWFzayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmFuZG9tUG9vbFBvaW50ZXIgPT09IFJBTkRPTV9QT09MX1NJWkUpIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAgKi9cbiAgICAgICAgICBpZiAocmFuZG9tUG9vbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgYmVjYXVzZSBzZXJ2ZXItc2VudCBmcmFtZXMgbXVzdCBub3RcbiAgICAgICAgICAgIC8vIGJlIG1hc2tlZCBzbyBpdCBtYXkgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByYW5kb21Qb29sID0gQnVmZmVyLmFsbG9jKFJBTkRPTV9QT09MX1NJWkUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJhbmRvbUZpbGxTeW5jKHJhbmRvbVBvb2wsIDAsIFJBTkRPTV9QT09MX1NJWkUpO1xuICAgICAgICAgIHJhbmRvbVBvb2xQb2ludGVyID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hc2tbMF0gPSByYW5kb21Qb29sW3JhbmRvbVBvb2xQb2ludGVyKytdO1xuICAgICAgICBtYXNrWzFdID0gcmFuZG9tUG9vbFtyYW5kb21Qb29sUG9pbnRlcisrXTtcbiAgICAgICAgbWFza1syXSA9IHJhbmRvbVBvb2xbcmFuZG9tUG9vbFBvaW50ZXIrK107XG4gICAgICAgIG1hc2tbM10gPSByYW5kb21Qb29sW3JhbmRvbVBvb2xQb2ludGVyKytdO1xuICAgICAgfVxuXG4gICAgICBza2lwTWFza2luZyA9IChtYXNrWzBdIHwgbWFza1sxXSB8IG1hc2tbMl0gfCBtYXNrWzNdKSA9PT0gMDtcbiAgICAgIG9mZnNldCA9IDY7XG4gICAgfVxuXG4gICAgbGV0IGRhdGFMZW5ndGg7XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoXG4gICAgICAgICghb3B0aW9ucy5tYXNrIHx8IHNraXBNYXNraW5nKSAmJlxuICAgICAgICBvcHRpb25zW2tCeXRlTGVuZ3RoXSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgZGF0YUxlbmd0aCA9IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEpO1xuICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgIG1lcmdlID0gb3B0aW9ucy5tYXNrICYmIG9wdGlvbnMucmVhZE9ubHkgJiYgIXNraXBNYXNraW5nO1xuICAgIH1cblxuICAgIGxldCBwYXlsb2FkTGVuZ3RoID0gZGF0YUxlbmd0aDtcblxuICAgIGlmIChkYXRhTGVuZ3RoID49IDY1NTM2KSB7XG4gICAgICBvZmZzZXQgKz0gODtcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjc7XG4gICAgfSBlbHNlIGlmIChkYXRhTGVuZ3RoID4gMTI1KSB7XG4gICAgICBvZmZzZXQgKz0gMjtcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjY7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG1lcmdlID8gZGF0YUxlbmd0aCArIG9mZnNldCA6IG9mZnNldCk7XG5cbiAgICB0YXJnZXRbMF0gPSBvcHRpb25zLmZpbiA/IG9wdGlvbnMub3Bjb2RlIHwgMHg4MCA6IG9wdGlvbnMub3Bjb2RlO1xuICAgIGlmIChvcHRpb25zLnJzdjEpIHRhcmdldFswXSB8PSAweDQwO1xuXG4gICAgdGFyZ2V0WzFdID0gcGF5bG9hZExlbmd0aDtcblxuICAgIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjYpIHtcbiAgICAgIHRhcmdldC53cml0ZVVJbnQxNkJFKGRhdGFMZW5ndGgsIDIpO1xuICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI3KSB7XG4gICAgICB0YXJnZXRbMl0gPSB0YXJnZXRbM10gPSAwO1xuICAgICAgdGFyZ2V0LndyaXRlVUludEJFKGRhdGFMZW5ndGgsIDQsIDYpO1xuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5tYXNrKSByZXR1cm4gW3RhcmdldCwgZGF0YV07XG5cbiAgICB0YXJnZXRbMV0gfD0gMHg4MDtcbiAgICB0YXJnZXRbb2Zmc2V0IC0gNF0gPSBtYXNrWzBdO1xuICAgIHRhcmdldFtvZmZzZXQgLSAzXSA9IG1hc2tbMV07XG4gICAgdGFyZ2V0W29mZnNldCAtIDJdID0gbWFza1syXTtcbiAgICB0YXJnZXRbb2Zmc2V0IC0gMV0gPSBtYXNrWzNdO1xuXG4gICAgaWYgKHNraXBNYXNraW5nKSByZXR1cm4gW3RhcmdldCwgZGF0YV07XG5cbiAgICBpZiAobWVyZ2UpIHtcbiAgICAgIGFwcGx5TWFzayhkYXRhLCBtYXNrLCB0YXJnZXQsIG9mZnNldCwgZGF0YUxlbmd0aCk7XG4gICAgICByZXR1cm4gW3RhcmdldF07XG4gICAgfVxuXG4gICAgYXBwbHlNYXNrKGRhdGEsIG1hc2ssIGRhdGEsIDAsIGRhdGFMZW5ndGgpO1xuICAgIHJldHVybiBbdGFyZ2V0LCBkYXRhXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNsb3NlIG1lc3NhZ2UgdG8gdGhlIG90aGVyIHBlZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbY29kZV0gVGhlIHN0YXR1cyBjb2RlIGNvbXBvbmVudCBvZiB0aGUgYm9keVxuICAgKiBAcGFyYW0geyhTdHJpbmd8QnVmZmVyKX0gW2RhdGFdIFRoZSBtZXNzYWdlIGNvbXBvbmVudCBvZiB0aGUgYm9keVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayB0aGUgbWVzc2FnZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNsb3NlKGNvZGUsIGRhdGEsIG1hc2ssIGNiKSB7XG4gICAgbGV0IGJ1ZjtcblxuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJ1ZiA9IEVNUFRZX0JVRkZFUjtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2RlICE9PSAnbnVtYmVyJyB8fCAhaXNWYWxpZFN0YXR1c0NvZGUoY29kZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSB2YWxpZCBlcnJvciBjb2RlIG51bWJlcicpO1xuICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkIHx8ICFkYXRhLmxlbmd0aCkge1xuICAgICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIpO1xuICAgICAgYnVmLndyaXRlVUludDE2QkUoY29kZSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpO1xuXG4gICAgICBpZiAobGVuZ3RoID4gMTIzKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgbWVzc2FnZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gMTIzIGJ5dGVzJyk7XG4gICAgICB9XG5cbiAgICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyICsgbGVuZ3RoKTtcbiAgICAgIGJ1Zi53cml0ZVVJbnQxNkJFKGNvZGUsIDApO1xuXG4gICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGJ1Zi53cml0ZShkYXRhLCAyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1Zi5zZXQoZGF0YSwgMik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIFtrQnl0ZUxlbmd0aF06IGJ1Zi5sZW5ndGgsXG4gICAgICBmaW46IHRydWUsXG4gICAgICBnZW5lcmF0ZU1hc2s6IHRoaXMuX2dlbmVyYXRlTWFzayxcbiAgICAgIG1hc2ssXG4gICAgICBtYXNrQnVmZmVyOiB0aGlzLl9tYXNrQnVmZmVyLFxuICAgICAgb3Bjb2RlOiAweDA4LFxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgcnN2MTogZmFsc2VcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XG4gICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGJ1ZiwgZmFsc2UsIG9wdGlvbnMsIGNiXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShidWYsIG9wdGlvbnMpLCBjYik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgcGluZyBtZXNzYWdlIHRvIHRoZSBvdGhlciBwZWVyLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1lc3NhZ2UgdG8gc2VuZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBwaW5nKGRhdGEsIG1hc2ssIGNiKSB7XG4gICAgbGV0IGJ5dGVMZW5ndGg7XG4gICAgbGV0IHJlYWRPbmx5O1xuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgYnl0ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpO1xuICAgICAgcmVhZE9ubHkgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGlzQmxvYihkYXRhKSkge1xuICAgICAgYnl0ZUxlbmd0aCA9IGRhdGEuc2l6ZTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSB0b0J1ZmZlcihkYXRhKTtcbiAgICAgIGJ5dGVMZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgIHJlYWRPbmx5ID0gdG9CdWZmZXIucmVhZE9ubHk7XG4gICAgfVxuXG4gICAgaWYgKGJ5dGVMZW5ndGggPiAxMjUpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgZGF0YSBzaXplIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiAxMjUgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgW2tCeXRlTGVuZ3RoXTogYnl0ZUxlbmd0aCxcbiAgICAgIGZpbjogdHJ1ZSxcbiAgICAgIGdlbmVyYXRlTWFzazogdGhpcy5fZ2VuZXJhdGVNYXNrLFxuICAgICAgbWFzayxcbiAgICAgIG1hc2tCdWZmZXI6IHRoaXMuX21hc2tCdWZmZXIsXG4gICAgICBvcGNvZGU6IDB4MDksXG4gICAgICByZWFkT25seSxcbiAgICAgIHJzdjE6IGZhbHNlXG4gICAgfTtcblxuICAgIGlmIChpc0Jsb2IoZGF0YSkpIHtcbiAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gREVGQVVMVCkge1xuICAgICAgICB0aGlzLmVucXVldWUoW3RoaXMuZ2V0QmxvYkRhdGEsIGRhdGEsIGZhbHNlLCBvcHRpb25zLCBjYl0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZXRCbG9iRGF0YShkYXRhLCBmYWxzZSwgb3B0aW9ucywgY2IpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5fc3RhdGUgIT09IERFRkFVTFQpIHtcbiAgICAgIHRoaXMuZW5xdWV1ZShbdGhpcy5kaXNwYXRjaCwgZGF0YSwgZmFsc2UsIG9wdGlvbnMsIGNiXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShkYXRhLCBvcHRpb25zKSwgY2IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIHBvbmcgbWVzc2FnZSB0byB0aGUgb3RoZXIgcGVlci5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXNzYWdlIHRvIHNlbmRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbbWFzaz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2sgYGRhdGFgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcG9uZyhkYXRhLCBtYXNrLCBjYikge1xuICAgIGxldCBieXRlTGVuZ3RoO1xuICAgIGxldCByZWFkT25seTtcblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc0Jsb2IoZGF0YSkpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBkYXRhLnNpemU7XG4gICAgICByZWFkT25seSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gdG9CdWZmZXIoZGF0YSk7XG4gICAgICBieXRlTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICByZWFkT25seSA9IHRvQnVmZmVyLnJlYWRPbmx5O1xuICAgIH1cblxuICAgIGlmIChieXRlTGVuZ3RoID4gMTI1KSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIGRhdGEgc2l6ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gMTI1IGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIFtrQnl0ZUxlbmd0aF06IGJ5dGVMZW5ndGgsXG4gICAgICBmaW46IHRydWUsXG4gICAgICBnZW5lcmF0ZU1hc2s6IHRoaXMuX2dlbmVyYXRlTWFzayxcbiAgICAgIG1hc2ssXG4gICAgICBtYXNrQnVmZmVyOiB0aGlzLl9tYXNrQnVmZmVyLFxuICAgICAgb3Bjb2RlOiAweDBhLFxuICAgICAgcmVhZE9ubHksXG4gICAgICByc3YxOiBmYWxzZVxuICAgIH07XG5cbiAgICBpZiAoaXNCbG9iKGRhdGEpKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUgIT09IERFRkFVTFQpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlKFt0aGlzLmdldEJsb2JEYXRhLCBkYXRhLCBmYWxzZSwgb3B0aW9ucywgY2JdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0QmxvYkRhdGEoZGF0YSwgZmFsc2UsIG9wdGlvbnMsIGNiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XG4gICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGRhdGEsIGZhbHNlLCBvcHRpb25zLCBjYl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbmRGcmFtZShTZW5kZXIuZnJhbWUoZGF0YSwgb3B0aW9ucyksIGNiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBkYXRhIG1lc3NhZ2UgdG8gdGhlIG90aGVyIHBlZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWVzc2FnZSB0byBzZW5kXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYmluYXJ5PWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBgZGF0YWAgaXMgYmluYXJ5XG4gICAqICAgICBvciB0ZXh0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY29tcHJlc3M9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0b1xuICAgKiAgICAgY29tcHJlc3MgYGRhdGFgXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZmluPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciB0aGUgZnJhZ21lbnQgaXMgdGhlXG4gICAqICAgICBsYXN0IG9uZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1hc2s9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBzZW5kKGRhdGEsIG9wdGlvbnMsIGNiKSB7XG4gICAgY29uc3QgcGVyTWVzc2FnZURlZmxhdGUgPSB0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdO1xuICAgIGxldCBvcGNvZGUgPSBvcHRpb25zLmJpbmFyeSA/IDIgOiAxO1xuICAgIGxldCByc3YxID0gb3B0aW9ucy5jb21wcmVzcztcblxuICAgIGxldCBieXRlTGVuZ3RoO1xuICAgIGxldCByZWFkT25seTtcblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc0Jsb2IoZGF0YSkpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBkYXRhLnNpemU7XG4gICAgICByZWFkT25seSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gdG9CdWZmZXIoZGF0YSk7XG4gICAgICBieXRlTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICByZWFkT25seSA9IHRvQnVmZmVyLnJlYWRPbmx5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9maXJzdEZyYWdtZW50KSB7XG4gICAgICB0aGlzLl9maXJzdEZyYWdtZW50ID0gZmFsc2U7XG4gICAgICBpZiAoXG4gICAgICAgIHJzdjEgJiZcbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUgJiZcbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUucGFyYW1zW1xuICAgICAgICAgIHBlck1lc3NhZ2VEZWZsYXRlLl9pc1NlcnZlclxuICAgICAgICAgICAgPyAnc2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXInXG4gICAgICAgICAgICA6ICdjbGllbnRfbm9fY29udGV4dF90YWtlb3ZlcidcbiAgICAgICAgXVxuICAgICAgKSB7XG4gICAgICAgIHJzdjEgPSBieXRlTGVuZ3RoID49IHBlck1lc3NhZ2VEZWZsYXRlLl90aHJlc2hvbGQ7XG4gICAgICB9XG4gICAgICB0aGlzLl9jb21wcmVzcyA9IHJzdjE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJzdjEgPSBmYWxzZTtcbiAgICAgIG9wY29kZSA9IDA7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZmluKSB0aGlzLl9maXJzdEZyYWdtZW50ID0gdHJ1ZTtcblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBba0J5dGVMZW5ndGhdOiBieXRlTGVuZ3RoLFxuICAgICAgZmluOiBvcHRpb25zLmZpbixcbiAgICAgIGdlbmVyYXRlTWFzazogdGhpcy5fZ2VuZXJhdGVNYXNrLFxuICAgICAgbWFzazogb3B0aW9ucy5tYXNrLFxuICAgICAgbWFza0J1ZmZlcjogdGhpcy5fbWFza0J1ZmZlcixcbiAgICAgIG9wY29kZSxcbiAgICAgIHJlYWRPbmx5LFxuICAgICAgcnN2MVxuICAgIH07XG5cbiAgICBpZiAoaXNCbG9iKGRhdGEpKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUgIT09IERFRkFVTFQpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlKFt0aGlzLmdldEJsb2JEYXRhLCBkYXRhLCB0aGlzLl9jb21wcmVzcywgb3B0cywgY2JdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0QmxvYkRhdGEoZGF0YSwgdGhpcy5fY29tcHJlc3MsIG9wdHMsIGNiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XG4gICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGRhdGEsIHRoaXMuX2NvbXByZXNzLCBvcHRzLCBjYl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BhdGNoKGRhdGEsIHRoaXMuX2NvbXByZXNzLCBvcHRzLCBjYik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbnRlbnRzIG9mIGEgYmxvYiBhcyBiaW5hcnkgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtCbG9ifSBibG9iIFRoZSBibG9iXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2NvbXByZXNzPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gY29tcHJlc3NcbiAgICogICAgIHRoZSBkYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZmluPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gc2V0IHRoZVxuICAgKiAgICAgRklOIGJpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5nZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZVxuICAgKiAgICAgbWFza2luZyBrZXlcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFza1xuICAgKiAgICAgYGRhdGFgXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBbb3B0aW9ucy5tYXNrQnVmZmVyXSBUaGUgYnVmZmVyIHVzZWQgdG8gc3RvcmUgdGhlIG1hc2tpbmdcbiAgICogICAgIGtleVxuICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5vcGNvZGUgVGhlIG9wY29kZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJlYWRPbmx5PWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBgZGF0YWAgY2FuIGJlXG4gICAqICAgICBtb2RpZmllZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJzdjE9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBzZXQgdGhlXG4gICAqICAgICBSU1YxIGJpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRCbG9iRGF0YShibG9iLCBjb21wcmVzcywgb3B0aW9ucywgY2IpIHtcbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzICs9IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgIHRoaXMuX3N0YXRlID0gR0VUX0JMT0JfREFUQTtcblxuICAgIGJsb2JcbiAgICAgIC5hcnJheUJ1ZmZlcigpXG4gICAgICAudGhlbigoYXJyYXlCdWZmZXIpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVGhlIHNvY2tldCB3YXMgY2xvc2VkIHdoaWxlIHRoZSBibG9iIHdhcyBiZWluZyByZWFkJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIGBjYWxsQ2FsbGJhY2tzYCBpcyBjYWxsZWQgaW4gdGhlIG5leHQgdGljayB0byBlbnN1cmUgdGhhdCBlcnJvcnNcbiAgICAgICAgICAvLyB0aGF0IG1pZ2h0IGJlIHRocm93biBpbiB0aGUgY2FsbGJhY2tzIGJlaGF2ZSBsaWtlIGVycm9ycyB0aHJvd25cbiAgICAgICAgICAvLyBvdXRzaWRlIHRoZSBwcm9taXNlIGNoYWluLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsQ2FsbGJhY2tzLCB0aGlzLCBlcnIsIGNiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgICAgICBjb25zdCBkYXRhID0gdG9CdWZmZXIoYXJyYXlCdWZmZXIpO1xuXG4gICAgICAgIGlmICghY29tcHJlc3MpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0ZSA9IERFRkFVTFQ7XG4gICAgICAgICAgdGhpcy5zZW5kRnJhbWUoU2VuZGVyLmZyYW1lKGRhdGEsIG9wdGlvbnMpLCBjYik7XG4gICAgICAgICAgdGhpcy5kZXF1ZXVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaChkYXRhLCBjb21wcmVzcywgb3B0aW9ucywgY2IpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gYG9uRXJyb3JgIGlzIGNhbGxlZCBpbiB0aGUgbmV4dCB0aWNrIGZvciB0aGUgc2FtZSByZWFzb24gdGhhdFxuICAgICAgICAvLyBgY2FsbENhbGxiYWNrc2AgYWJvdmUgaXMuXG4gICAgICAgIC8vXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2sob25FcnJvciwgdGhpcywgZXJyLCBjYik7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGEgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHsoQnVmZmVyfFN0cmluZyl9IGRhdGEgVGhlIG1lc3NhZ2UgdG8gc2VuZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtjb21wcmVzcz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGNvbXByZXNzXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5maW49ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBzZXQgdGhlXG4gICAqICAgICBGSU4gYml0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmdlbmVyYXRlTWFza10gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgdGhlXG4gICAqICAgICBtYXNraW5nIGtleVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1hc2s9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtCdWZmZXJ9IFtvcHRpb25zLm1hc2tCdWZmZXJdIFRoZSBidWZmZXIgdXNlZCB0byBzdG9yZSB0aGUgbWFza2luZ1xuICAgKiAgICAga2V5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLm9wY29kZSBUaGUgb3Bjb2RlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmVhZE9ubHk9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIGBkYXRhYCBjYW4gYmVcbiAgICogICAgIG1vZGlmaWVkXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucnN2MT1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNldCB0aGVcbiAgICogICAgIFJTVjEgYml0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRpc3BhdGNoKGRhdGEsIGNvbXByZXNzLCBvcHRpb25zLCBjYikge1xuICAgIGlmICghY29tcHJlc3MpIHtcbiAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShkYXRhLCBvcHRpb25zKSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBlck1lc3NhZ2VEZWZsYXRlID0gdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXTtcblxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gb3B0aW9uc1trQnl0ZUxlbmd0aF07XG4gICAgdGhpcy5fc3RhdGUgPSBERUZMQVRJTkc7XG4gICAgcGVyTWVzc2FnZURlZmxhdGUuY29tcHJlc3MoZGF0YSwgb3B0aW9ucy5maW4sIChfLCBidWYpID0+IHtcbiAgICAgIGlmICh0aGlzLl9zb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAnVGhlIHNvY2tldCB3YXMgY2xvc2VkIHdoaWxlIGRhdGEgd2FzIGJlaW5nIGNvbXByZXNzZWQnXG4gICAgICAgICk7XG5cbiAgICAgICAgY2FsbENhbGxiYWNrcyh0aGlzLCBlcnIsIGNiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgICAgdGhpcy5fc3RhdGUgPSBERUZBVUxUO1xuICAgICAgb3B0aW9ucy5yZWFkT25seSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZW5kRnJhbWUoU2VuZGVyLmZyYW1lKGJ1Ziwgb3B0aW9ucyksIGNiKTtcbiAgICAgIHRoaXMuZGVxdWV1ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHF1ZXVlZCBzZW5kIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZXF1ZXVlKCkge1xuICAgIHdoaWxlICh0aGlzLl9zdGF0ZSA9PT0gREVGQVVMVCAmJiB0aGlzLl9xdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgLT0gcGFyYW1zWzNdW2tCeXRlTGVuZ3RoXTtcbiAgICAgIFJlZmxlY3QuYXBwbHkocGFyYW1zWzBdLCB0aGlzLCBwYXJhbXMuc2xpY2UoMSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIHNlbmQgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMgU2VuZCBvcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVucXVldWUocGFyYW1zKSB7XG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyArPSBwYXJhbXNbM11ba0J5dGVMZW5ndGhdO1xuICAgIHRoaXMuX3F1ZXVlLnB1c2gocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGZyYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcltdfSBsaXN0IFRoZSBmcmFtZSB0byBzZW5kXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbmRGcmFtZShsaXN0LCBjYikge1xuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMikge1xuICAgICAgdGhpcy5fc29ja2V0LmNvcmsoKTtcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzBdKTtcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzFdLCBjYik7XG4gICAgICB0aGlzLl9zb2NrZXQudW5jb3JrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzBdLCBjYik7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2VuZGVyO1xuXG4vKipcbiAqIENhbGxzIHF1ZXVlZCBjYWxsYmFja3Mgd2l0aCBhbiBlcnJvci5cbiAqXG4gKiBAcGFyYW0ge1NlbmRlcn0gc2VuZGVyIFRoZSBgU2VuZGVyYCBpbnN0YW5jZVxuICogQHBhcmFtIHtFcnJvcn0gZXJyIFRoZSBlcnJvciB0byBjYWxsIHRoZSBjYWxsYmFja3Mgd2l0aFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBUaGUgZmlyc3QgY2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGxDYWxsYmFja3Moc2VuZGVyLCBlcnIsIGNiKSB7XG4gIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIGNiKGVycik7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZW5kZXIuX3F1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcGFyYW1zID0gc2VuZGVyLl9xdWV1ZVtpXTtcbiAgICBjb25zdCBjYWxsYmFjayA9IHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjayhlcnIpO1xuICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyBhIGBTZW5kZXJgIGVycm9yLlxuICpcbiAqIEBwYXJhbSB7U2VuZGVyfSBzZW5kZXIgVGhlIGBTZW5kZXJgIGluc3RhbmNlXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnIgVGhlIGVycm9yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIFRoZSBmaXJzdCBwZW5kaW5nIGNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBvbkVycm9yKHNlbmRlciwgZXJyLCBjYikge1xuICBjYWxsQ2FsbGJhY2tzKHNlbmRlciwgZXJyLCBjYik7XG4gIHNlbmRlci5vbmVycm9yKGVycik7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgRHVwbGV4IH0gPSByZXF1aXJlKCdzdHJlYW0nKTtcblxuLyoqXG4gKiBFbWl0cyB0aGUgYCdjbG9zZSdgIGV2ZW50IG9uIGEgc3RyZWFtLlxuICpcbiAqIEBwYXJhbSB7RHVwbGV4fSBzdHJlYW0gVGhlIHN0cmVhbS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGVtaXRDbG9zZShzdHJlYW0pIHtcbiAgc3RyZWFtLmVtaXQoJ2Nsb3NlJyk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgJ2VuZCdgIGV2ZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGR1cGxleE9uRW5kKCkge1xuICBpZiAoIXRoaXMuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQpIHtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyciBUaGUgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGR1cGxleE9uRXJyb3IoZXJyKSB7XG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZHVwbGV4T25FcnJvcik7XG4gIHRoaXMuZGVzdHJveSgpO1xuICBpZiAodGhpcy5saXN0ZW5lckNvdW50KCdlcnJvcicpID09PSAwKSB7XG4gICAgLy8gRG8gbm90IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvci5cbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXBzIGEgYFdlYlNvY2tldGAgaW4gYSBkdXBsZXggc3RyZWFtLlxuICpcbiAqIEBwYXJhbSB7V2ViU29ja2V0fSB3cyBUaGUgYFdlYlNvY2tldGAgdG8gd3JhcFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBmb3IgdGhlIGBEdXBsZXhgIGNvbnN0cnVjdG9yXG4gKiBAcmV0dXJuIHtEdXBsZXh9IFRoZSBkdXBsZXggc3RyZWFtXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFN0cmVhbSh3cywgb3B0aW9ucykge1xuICBsZXQgdGVybWluYXRlT25EZXN0cm95ID0gdHJ1ZTtcblxuICBjb25zdCBkdXBsZXggPSBuZXcgRHVwbGV4KHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGF1dG9EZXN0cm95OiBmYWxzZSxcbiAgICBlbWl0Q2xvc2U6IGZhbHNlLFxuICAgIG9iamVjdE1vZGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlT2JqZWN0TW9kZTogZmFsc2VcbiAgfSk7XG5cbiAgd3Mub24oJ21lc3NhZ2UnLCBmdW5jdGlvbiBtZXNzYWdlKG1zZywgaXNCaW5hcnkpIHtcbiAgICBjb25zdCBkYXRhID1cbiAgICAgICFpc0JpbmFyeSAmJiBkdXBsZXguX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZSA/IG1zZy50b1N0cmluZygpIDogbXNnO1xuXG4gICAgaWYgKCFkdXBsZXgucHVzaChkYXRhKSkgd3MucGF1c2UoKTtcbiAgfSk7XG5cbiAgd3Mub25jZSgnZXJyb3InLCBmdW5jdGlvbiBlcnJvcihlcnIpIHtcbiAgICBpZiAoZHVwbGV4LmRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgLy8gUHJldmVudCBgd3MudGVybWluYXRlKClgIGZyb20gYmVpbmcgY2FsbGVkIGJ5IGBkdXBsZXguX2Rlc3Ryb3koKWAuXG4gICAgLy9cbiAgICAvLyAtIElmIHRoZSBgJ2Vycm9yJ2AgZXZlbnQgaXMgZW1pdHRlZCBiZWZvcmUgdGhlIGAnb3BlbidgIGV2ZW50LCB0aGVuXG4gICAgLy8gICBgd3MudGVybWluYXRlKClgIGlzIGEgbm9vcCBhcyBubyBzb2NrZXQgaXMgYXNzaWduZWQuXG4gICAgLy8gLSBPdGhlcndpc2UsIHRoZSBlcnJvciBpcyByZS1lbWl0dGVkIGJ5IHRoZSBsaXN0ZW5lciBvZiB0aGUgYCdlcnJvcidgXG4gICAgLy8gICBldmVudCBvZiB0aGUgYFJlY2VpdmVyYCBvYmplY3QuIFRoZSBsaXN0ZW5lciBhbHJlYWR5IGNsb3NlcyB0aGVcbiAgICAvLyAgIGNvbm5lY3Rpb24gYnkgY2FsbGluZyBgd3MuY2xvc2UoKWAuIFRoaXMgYWxsb3dzIGEgY2xvc2UgZnJhbWUgdG8gYmVcbiAgICAvLyAgIHNlbnQgdG8gdGhlIG90aGVyIHBlZXIuIElmIGB3cy50ZXJtaW5hdGUoKWAgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHRoaXMsXG4gICAgLy8gICB0aGVuIHRoZSBjbG9zZSBmcmFtZSBtaWdodCBub3QgYmUgc2VudC5cbiAgICB0ZXJtaW5hdGVPbkRlc3Ryb3kgPSBmYWxzZTtcbiAgICBkdXBsZXguZGVzdHJveShlcnIpO1xuICB9KTtcblxuICB3cy5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIGlmIChkdXBsZXguZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBkdXBsZXgucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgZHVwbGV4Ll9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAod3MucmVhZHlTdGF0ZSA9PT0gd3MuQ0xPU0VEKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIGR1cGxleCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuXG4gICAgd3Mub25jZSgnZXJyb3InLCBmdW5jdGlvbiBlcnJvcihlcnIpIHtcbiAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH0pO1xuXG4gICAgd3Mub25jZSgnY2xvc2UnLCBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIGlmICghY2FsbGVkKSBjYWxsYmFjayhlcnIpO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIGR1cGxleCk7XG4gICAgfSk7XG5cbiAgICBpZiAodGVybWluYXRlT25EZXN0cm95KSB3cy50ZXJtaW5hdGUoKTtcbiAgfTtcblxuICBkdXBsZXguX2ZpbmFsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgaWYgKHdzLnJlYWR5U3RhdGUgPT09IHdzLkNPTk5FQ1RJTkcpIHtcbiAgICAgIHdzLm9uY2UoJ29wZW4nLCBmdW5jdGlvbiBvcGVuKCkge1xuICAgICAgICBkdXBsZXguX2ZpbmFsKGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB2YWx1ZSBvZiB0aGUgYF9zb2NrZXRgIHByb3BlcnR5IGlzIGBudWxsYCBpdCBtZWFucyB0aGF0IGB3c2AgaXMgYVxuICAgIC8vIGNsaWVudCB3ZWJzb2NrZXQgYW5kIHRoZSBoYW5kc2hha2UgZmFpbGVkLiBJbiBmYWN0LCB3aGVuIHRoaXMgaGFwcGVucywgYVxuICAgIC8vIHNvY2tldCBpcyBuZXZlciBhc3NpZ25lZCB0byB0aGUgd2Vic29ja2V0LiBXYWl0IGZvciB0aGUgYCdlcnJvcidgIGV2ZW50XG4gICAgLy8gdGhhdCB3aWxsIGJlIGVtaXR0ZWQgYnkgdGhlIHdlYnNvY2tldC5cbiAgICBpZiAod3MuX3NvY2tldCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgaWYgKHdzLl9zb2NrZXQuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQpIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgICBpZiAoZHVwbGV4Ll9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIGR1cGxleC5kZXN0cm95KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdzLl9zb2NrZXQub25jZSgnZmluaXNoJywgZnVuY3Rpb24gZmluaXNoKCkge1xuICAgICAgICAvLyBgZHVwbGV4YCBpcyBub3QgZGVzdHJveWVkIGhlcmUgYmVjYXVzZSB0aGUgYCdlbmQnYCBldmVudCB3aWxsIGJlXG4gICAgICAgIC8vIGVtaXR0ZWQgb24gYGR1cGxleGAgYWZ0ZXIgdGhpcyBgJ2ZpbmlzaCdgIGV2ZW50LiBUaGUgRU9GIHNpZ25hbGluZ1xuICAgICAgICAvLyBgbnVsbGAgY2h1bmsgaXMsIGluIGZhY3QsIHB1c2hlZCB3aGVuIHRoZSB3ZWJzb2NrZXQgZW1pdHMgYCdjbG9zZSdgLlxuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgICB3cy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICBkdXBsZXguX3JlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHdzLmlzUGF1c2VkKSB3cy5yZXN1bWUoKTtcbiAgfTtcblxuICBkdXBsZXguX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAod3MucmVhZHlTdGF0ZSA9PT0gd3MuQ09OTkVDVElORykge1xuICAgICAgd3Mub25jZSgnb3BlbicsIGZ1bmN0aW9uIG9wZW4oKSB7XG4gICAgICAgIGR1cGxleC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3cy5zZW5kKGNodW5rLCBjYWxsYmFjayk7XG4gIH07XG5cbiAgZHVwbGV4Lm9uKCdlbmQnLCBkdXBsZXhPbkVuZCk7XG4gIGR1cGxleC5vbignZXJyb3InLCBkdXBsZXhPbkVycm9yKTtcbiAgcmV0dXJuIGR1cGxleDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVXZWJTb2NrZXRTdHJlYW07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgdG9rZW5DaGFycyB9ID0gcmVxdWlyZSgnLi92YWxpZGF0aW9uJyk7XG5cbi8qKlxuICogUGFyc2VzIHRoZSBgU2VjLVdlYlNvY2tldC1Qcm90b2NvbGAgaGVhZGVyIGludG8gYSBzZXQgb2Ygc3VicHJvdG9jb2wgbmFtZXMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlciBUaGUgZmllbGQgdmFsdWUgb2YgdGhlIGhlYWRlclxuICogQHJldHVybiB7U2V0fSBUaGUgc3VicHJvdG9jb2wgbmFtZXNcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gcGFyc2UoaGVhZGVyKSB7XG4gIGNvbnN0IHByb3RvY29scyA9IG5ldyBTZXQoKTtcbiAgbGV0IHN0YXJ0ID0gLTE7XG4gIGxldCBlbmQgPSAtMTtcbiAgbGV0IGkgPSAwO1xuXG4gIGZvciAoaTsgaSA8IGhlYWRlci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBoZWFkZXIuY2hhckNvZGVBdChpKTtcblxuICAgIGlmIChlbmQgPT09IC0xICYmIHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcbiAgICAgIGlmIChzdGFydCA9PT0gLTEpIHN0YXJ0ID0gaTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgaSAhPT0gMCAmJlxuICAgICAgKGNvZGUgPT09IDB4MjAgLyogJyAnICovIHx8IGNvZGUgPT09IDB4MDkpIC8qICdcXHQnICovXG4gICAgKSB7XG4gICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XG4gICAgfSBlbHNlIGlmIChjb2RlID09PSAweDJjIC8qICcsJyAqLykge1xuICAgICAgaWYgKHN0YXJ0ID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuZCA9PT0gLTEpIGVuZCA9IGk7XG5cbiAgICAgIGNvbnN0IHByb3RvY29sID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gICAgICBpZiAocHJvdG9jb2xzLmhhcyhwcm90b2NvbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBUaGUgXCIke3Byb3RvY29sfVwiIHN1YnByb3RvY29sIGlzIGR1cGxpY2F0ZWRgKTtcbiAgICAgIH1cblxuICAgICAgcHJvdG9jb2xzLmFkZChwcm90b2NvbCk7XG4gICAgICBzdGFydCA9IGVuZCA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGVuZCAhPT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Jyk7XG4gIH1cblxuICBjb25zdCBwcm90b2NvbCA9IGhlYWRlci5zbGljZShzdGFydCwgaSk7XG5cbiAgaWYgKHByb3RvY29scy5oYXMocHJvdG9jb2wpKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBUaGUgXCIke3Byb3RvY29sfVwiIHN1YnByb3RvY29sIGlzIGR1cGxpY2F0ZWRgKTtcbiAgfVxuXG4gIHByb3RvY29scy5hZGQocHJvdG9jb2wpO1xuICByZXR1cm4gcHJvdG9jb2xzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgcGFyc2UgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBpc1V0ZjggfSA9IHJlcXVpcmUoJ2J1ZmZlcicpO1xuXG5jb25zdCB7IGhhc0Jsb2IgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbi8vXG4vLyBBbGxvd2VkIHRva2VuIGNoYXJhY3RlcnM6XG4vL1xuLy8gJyEnLCAnIycsICckJywgJyUnLCAnJicsICcnJywgJyonLCAnKycsICctJyxcbi8vICcuJywgMC05LCBBLVosICdeJywgJ18nLCAnYCcsIGEteiwgJ3wnLCAnfidcbi8vXG4vLyB0b2tlbkNoYXJzWzMyXSA9PT0gMCAvLyAnICdcbi8vIHRva2VuQ2hhcnNbMzNdID09PSAxIC8vICchJ1xuLy8gdG9rZW5DaGFyc1szNF0gPT09IDAgLy8gJ1wiJ1xuLy8gLi4uXG4vL1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCB0b2tlbkNoYXJzID0gW1xuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAwIC0gMTVcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gMTYgLSAzMVxuICAwLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAvLyAzMiAtIDQ3XG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDQ4IC0gNjNcbiAgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gNjQgLSA3OVxuICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAxLCAvLyA4MCAtIDk1XG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vIDk2IC0gMTExXG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIDAgLy8gMTEyIC0gMTI3XG5dO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHN0YXR1cyBjb2RlIGlzIGFsbG93ZWQgaW4gYSBjbG9zZSBmcmFtZS5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gY29kZSBUaGUgc3RhdHVzIGNvZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgc3RhdHVzIGNvZGUgaXMgdmFsaWQsIGVsc2UgYGZhbHNlYFxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBpc1ZhbGlkU3RhdHVzQ29kZShjb2RlKSB7XG4gIHJldHVybiAoXG4gICAgKGNvZGUgPj0gMTAwMCAmJlxuICAgICAgY29kZSA8PSAxMDE0ICYmXG4gICAgICBjb2RlICE9PSAxMDA0ICYmXG4gICAgICBjb2RlICE9PSAxMDA1ICYmXG4gICAgICBjb2RlICE9PSAxMDA2KSB8fFxuICAgIChjb2RlID49IDMwMDAgJiYgY29kZSA8PSA0OTk5KVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIGJ1ZmZlciBjb250YWlucyBvbmx5IGNvcnJlY3QgVVRGLTguXG4gKiBQb3J0ZWQgZnJvbSBodHRwczovL3d3dy5jbC5jYW0uYWMudWsvJTdFbWdrMjUvdWNzL3V0ZjhfY2hlY2suYyBieVxuICogTWFya3VzIEt1aG4uXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZiBUaGUgYnVmZmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYGJ1ZmAgY29udGFpbnMgb25seSBjb3JyZWN0IFVURi04LCBlbHNlIGBmYWxzZWBcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gX2lzVmFsaWRVVEY4KGJ1Zikge1xuICBjb25zdCBsZW4gPSBidWYubGVuZ3RoO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBpZiAoKGJ1ZltpXSAmIDB4ODApID09PSAwKSB7XG4gICAgICAvLyAweHh4eHh4eFxuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZTApID09PSAweGMwKSB7XG4gICAgICAvLyAxMTB4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMSA9PT0gbGVuIHx8XG4gICAgICAgIChidWZbaSArIDFdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSAmIDB4ZmUpID09PSAweGMwIC8vIE92ZXJsb25nXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpICs9IDI7XG4gICAgfSBlbHNlIGlmICgoYnVmW2ldICYgMHhmMCkgPT09IDB4ZTApIHtcbiAgICAgIC8vIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4XG4gICAgICBpZiAoXG4gICAgICAgIGkgKyAyID49IGxlbiB8fFxuICAgICAgICAoYnVmW2kgKyAxXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaSArIDJdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSA9PT0gMHhlMCAmJiAoYnVmW2kgKyAxXSAmIDB4ZTApID09PSAweDgwKSB8fCAvLyBPdmVybG9uZ1xuICAgICAgICAoYnVmW2ldID09PSAweGVkICYmIChidWZbaSArIDFdICYgMHhlMCkgPT09IDB4YTApIC8vIFN1cnJvZ2F0ZSAoVStEODAwIC0gVStERkZGKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSArPSAzO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZjgpID09PSAweGYwKSB7XG4gICAgICAvLyAxMTExMHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMyA+PSBsZW4gfHxcbiAgICAgICAgKGJ1ZltpICsgMV0gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICAoYnVmW2kgKyAyXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaSArIDNdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSA9PT0gMHhmMCAmJiAoYnVmW2kgKyAxXSAmIDB4ZjApID09PSAweDgwKSB8fCAvLyBPdmVybG9uZ1xuICAgICAgICAoYnVmW2ldID09PSAweGY0ICYmIGJ1ZltpICsgMV0gPiAweDhmKSB8fFxuICAgICAgICBidWZbaV0gPiAweGY0IC8vID4gVSsxMEZGRkZcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGkgKz0gNDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHZhbHVlIGlzIGEgYEJsb2JgLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHRlc3RlZFxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBgQmxvYmAsIGVsc2UgYGZhbHNlYFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNCbG9iKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgaGFzQmxvYiAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgdmFsdWUuYXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUudHlwZSA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2YgdmFsdWUuc3RyZWFtID09PSAnZnVuY3Rpb24nICYmXG4gICAgKHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdCbG9iJyB8fFxuICAgICAgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0ZpbGUnKVxuICApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNCbG9iLFxuICBpc1ZhbGlkU3RhdHVzQ29kZSxcbiAgaXNWYWxpZFVURjg6IF9pc1ZhbGlkVVRGOCxcbiAgdG9rZW5DaGFyc1xufTtcblxuaWYgKGlzVXRmOCkge1xuICBtb2R1bGUuZXhwb3J0cy5pc1ZhbGlkVVRGOCA9IGZ1bmN0aW9uIChidWYpIHtcbiAgICByZXR1cm4gYnVmLmxlbmd0aCA8IDI0ID8gX2lzVmFsaWRVVEY4KGJ1ZikgOiBpc1V0ZjgoYnVmKTtcbiAgfTtcbn0gLyogaXN0YW5idWwgaWdub3JlIGVsc2UgICovIGVsc2UgaWYgKCFwcm9jZXNzLmVudi5XU19OT19VVEZfOF9WQUxJREFURSkge1xuICB0cnkge1xuICAgIGNvbnN0IGlzVmFsaWRVVEY4ID0gcmVxdWlyZSgndXRmLTgtdmFsaWRhdGUnKTtcblxuICAgIG1vZHVsZS5leHBvcnRzLmlzVmFsaWRVVEY4ID0gZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgcmV0dXJuIGJ1Zi5sZW5ndGggPCAzMiA/IF9pc1ZhbGlkVVRGOChidWYpIDogaXNWYWxpZFVURjgoYnVmKTtcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gQ29udGludWUgcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3IuXG4gIH1cbn1cbiIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXkR1cGxleCRcIiwgXCJjYXVnaHRFcnJvcnNcIjogXCJub25lXCIgfV0gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCB7IER1cGxleCB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5jb25zdCB7IGNyZWF0ZUhhc2ggfSA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG5jb25zdCBleHRlbnNpb24gPSByZXF1aXJlKCcuL2V4dGVuc2lvbicpO1xuY29uc3QgUGVyTWVzc2FnZURlZmxhdGUgPSByZXF1aXJlKCcuL3Blcm1lc3NhZ2UtZGVmbGF0ZScpO1xuY29uc3Qgc3VicHJvdG9jb2wgPSByZXF1aXJlKCcuL3N1YnByb3RvY29sJyk7XG5jb25zdCBXZWJTb2NrZXQgPSByZXF1aXJlKCcuL3dlYnNvY2tldCcpO1xuY29uc3QgeyBHVUlELCBrV2ViU29ja2V0IH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG5jb25zdCBrZXlSZWdleCA9IC9eWysvMC05QS1aYS16XXsyMn09PSQvO1xuXG5jb25zdCBSVU5OSU5HID0gMDtcbmNvbnN0IENMT1NJTkcgPSAxO1xuY29uc3QgQ0xPU0VEID0gMjtcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBXZWJTb2NrZXQgc2VydmVyLlxuICpcbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICovXG5jbGFzcyBXZWJTb2NrZXRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgYFdlYlNvY2tldFNlcnZlcmAgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHM9dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXJcbiAgICogICAgIGFueSBvZiB0aGUgYCdtZXNzYWdlJ2AsIGAncGluZydgLCBhbmQgYCdwb25nJ2AgZXZlbnRzIGNhbiBiZSBlbWl0dGVkXG4gICAqICAgICBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSB0aWNrXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYXV0b1Bvbmc9dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvXG4gICAqICAgICBhdXRvbWF0aWNhbGx5IHNlbmQgYSBwb25nIGluIHJlc3BvbnNlIHRvIGEgcGluZ1xuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYmFja2xvZz01MTFdIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcXVldWUgb2ZcbiAgICogICAgIHBlbmRpbmcgY29ubmVjdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGllbnRUcmFja2luZz10cnVlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG9cbiAgICogICAgIHRyYWNrIGNsaWVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuaGFuZGxlUHJvdG9jb2xzXSBBIGhvb2sgdG8gaGFuZGxlIHByb3RvY29sc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaG9zdF0gVGhlIGhvc3RuYW1lIHdoZXJlIHRvIGJpbmQgdGhlIHNlcnZlclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UGF5bG9hZD0xMDQ4NTc2MDBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZVxuICAgKiAgICAgc2l6ZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm5vU2VydmVyPWZhbHNlXSBFbmFibGUgbm8gc2VydmVyIG1vZGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnBhdGhdIEFjY2VwdCBvbmx5IGNvbm5lY3Rpb25zIG1hdGNoaW5nIHRoaXMgcGF0aFxuICAgKiBAcGFyYW0geyhCb29sZWFufE9iamVjdCl9IFtvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlPWZhbHNlXSBFbmFibGUvZGlzYWJsZVxuICAgKiAgICAgcGVybWVzc2FnZS1kZWZsYXRlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wb3J0XSBUaGUgcG9ydCB3aGVyZSB0byBiaW5kIHRoZSBzZXJ2ZXJcbiAgICogQHBhcmFtIHsoaHR0cC5TZXJ2ZXJ8aHR0cHMuU2VydmVyKX0gW29wdGlvbnMuc2VydmVyXSBBIHByZS1jcmVhdGVkIEhUVFAvU1xuICAgKiAgICAgc2VydmVyIHRvIHVzZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAgICogICAgIG5vdCB0byBza2lwIFVURi04IHZhbGlkYXRpb24gZm9yIHRleHQgYW5kIGNsb3NlIG1lc3NhZ2VzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnZlcmlmeUNsaWVudF0gQSBob29rIHRvIHJlamVjdCBjb25uZWN0aW9uc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5XZWJTb2NrZXQ9V2ViU29ja2V0XSBTcGVjaWZpZXMgdGhlIGBXZWJTb2NrZXRgXG4gICAqICAgICBjbGFzcyB0byB1c2UuIEl0IG11c3QgYmUgdGhlIGBXZWJTb2NrZXRgIGNsYXNzIG9yIGNsYXNzIHRoYXQgZXh0ZW5kcyBpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIEEgbGlzdGVuZXIgZm9yIHRoZSBgbGlzdGVuaW5nYCBldmVudFxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBzdXBlcigpO1xuXG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IHRydWUsXG4gICAgICBhdXRvUG9uZzogdHJ1ZSxcbiAgICAgIG1heFBheWxvYWQ6IDEwMCAqIDEwMjQgKiAxMDI0LFxuICAgICAgc2tpcFVURjhWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgIHBlck1lc3NhZ2VEZWZsYXRlOiBmYWxzZSxcbiAgICAgIGhhbmRsZVByb3RvY29sczogbnVsbCxcbiAgICAgIGNsaWVudFRyYWNraW5nOiB0cnVlLFxuICAgICAgdmVyaWZ5Q2xpZW50OiBudWxsLFxuICAgICAgbm9TZXJ2ZXI6IGZhbHNlLFxuICAgICAgYmFja2xvZzogbnVsbCwgLy8gdXNlIGRlZmF1bHQgKDUxMSBhcyBpbXBsZW1lbnRlZCBpbiBuZXQuanMpXG4gICAgICBzZXJ2ZXI6IG51bGwsXG4gICAgICBob3N0OiBudWxsLFxuICAgICAgcGF0aDogbnVsbCxcbiAgICAgIHBvcnQ6IG51bGwsXG4gICAgICBXZWJTb2NrZXQsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIGlmIChcbiAgICAgIChvcHRpb25zLnBvcnQgPT0gbnVsbCAmJiAhb3B0aW9ucy5zZXJ2ZXIgJiYgIW9wdGlvbnMubm9TZXJ2ZXIpIHx8XG4gICAgICAob3B0aW9ucy5wb3J0ICE9IG51bGwgJiYgKG9wdGlvbnMuc2VydmVyIHx8IG9wdGlvbnMubm9TZXJ2ZXIpKSB8fFxuICAgICAgKG9wdGlvbnMuc2VydmVyICYmIG9wdGlvbnMubm9TZXJ2ZXIpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgXCJwb3J0XCIsIFwic2VydmVyXCIsIG9yIFwibm9TZXJ2ZXJcIiBvcHRpb25zICcgK1xuICAgICAgICAgICdtdXN0IGJlIHNwZWNpZmllZCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucG9ydCAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9zZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcigocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgYm9keSA9IGh0dHAuU1RBVFVTX0NPREVTWzQyNl07XG5cbiAgICAgICAgcmVzLndyaXRlSGVhZCg0MjYsIHtcbiAgICAgICAgICAnQ29udGVudC1MZW5ndGgnOiBib2R5Lmxlbmd0aCxcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nXG4gICAgICAgIH0pO1xuICAgICAgICByZXMuZW5kKGJvZHkpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9zZXJ2ZXIubGlzdGVuKFxuICAgICAgICBvcHRpb25zLnBvcnQsXG4gICAgICAgIG9wdGlvbnMuaG9zdCxcbiAgICAgICAgb3B0aW9ucy5iYWNrbG9nLFxuICAgICAgICBjYWxsYmFja1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc2VydmVyKSB7XG4gICAgICB0aGlzLl9zZXJ2ZXIgPSBvcHRpb25zLnNlcnZlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2VydmVyKSB7XG4gICAgICBjb25zdCBlbWl0Q29ubmVjdGlvbiA9IHRoaXMuZW1pdC5iaW5kKHRoaXMsICdjb25uZWN0aW9uJyk7XG5cbiAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycyA9IGFkZExpc3RlbmVycyh0aGlzLl9zZXJ2ZXIsIHtcbiAgICAgICAgbGlzdGVuaW5nOiB0aGlzLmVtaXQuYmluZCh0aGlzLCAnbGlzdGVuaW5nJyksXG4gICAgICAgIGVycm9yOiB0aGlzLmVtaXQuYmluZCh0aGlzLCAnZXJyb3InKSxcbiAgICAgICAgdXBncmFkZTogKHJlcSwgc29ja2V0LCBoZWFkKSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVVcGdyYWRlKHJlcSwgc29ja2V0LCBoZWFkLCBlbWl0Q29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlID09PSB0cnVlKSBvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlID0ge307XG4gICAgaWYgKG9wdGlvbnMuY2xpZW50VHJhY2tpbmcpIHtcbiAgICAgIHRoaXMuY2xpZW50cyA9IG5ldyBTZXQoKTtcbiAgICAgIHRoaXMuX3Nob3VsZEVtaXRDbG9zZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5fc3RhdGUgPSBSVU5OSU5HO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGJvdW5kIGFkZHJlc3MsIHRoZSBhZGRyZXNzIGZhbWlseSBuYW1lLCBhbmQgcG9ydCBvZiB0aGUgc2VydmVyXG4gICAqIGFzIHJlcG9ydGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlmIGxpc3RlbmluZyBvbiBhbiBJUCBzb2NrZXQuXG4gICAqIElmIHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uIGEgcGlwZSBvciBVTklYIGRvbWFpbiBzb2NrZXQsIHRoZSBuYW1lIGlzXG4gICAqIHJldHVybmVkIGFzIGEgc3RyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJuIHsoT2JqZWN0fFN0cmluZ3xudWxsKX0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlcnZlclxuICAgKiBAcHVibGljXG4gICAqL1xuICBhZGRyZXNzKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMubm9TZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHNlcnZlciBpcyBvcGVyYXRpbmcgaW4gXCJub1NlcnZlclwiIG1vZGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3NlcnZlcikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlci5hZGRyZXNzKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB0aGUgc2VydmVyIGZyb20gYWNjZXB0aW5nIG5ldyBjb25uZWN0aW9ucyBhbmQgZW1pdCB0aGUgYCdjbG9zZSdgIGV2ZW50XG4gICAqIHdoZW4gYWxsIGV4aXN0aW5nIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgdGhlIGAnY2xvc2UnYCBldmVudFxuICAgKiBAcHVibGljXG4gICAqL1xuICBjbG9zZShjYikge1xuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gQ0xPU0VEKSB7XG4gICAgICBpZiAoY2IpIHtcbiAgICAgICAgdGhpcy5vbmNlKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICBjYihuZXcgRXJyb3IoJ1RoZSBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZSwgdGhpcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNiKSB0aGlzLm9uY2UoJ2Nsb3NlJywgY2IpO1xuXG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBDTE9TSU5HKSByZXR1cm47XG4gICAgdGhpcy5fc3RhdGUgPSBDTE9TSU5HO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub1NlcnZlciB8fCB0aGlzLm9wdGlvbnMuc2VydmVyKSB7XG4gICAgICBpZiAodGhpcy5fc2VydmVyKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMgPSB0aGlzLl9zZXJ2ZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jbGllbnRzKSB7XG4gICAgICAgIGlmICghdGhpcy5jbGllbnRzLnNpemUpIHtcbiAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZSwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fc2hvdWxkRW1pdENsb3NlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLl9zZXJ2ZXI7XG5cbiAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xuICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzID0gdGhpcy5fc2VydmVyID0gbnVsbDtcblxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBIVFRQL1Mgc2VydmVyIHdhcyBjcmVhdGVkIGludGVybmFsbHkuIENsb3NlIGl0LCBhbmQgcmVseSBvbiBpdHNcbiAgICAgIC8vIGAnY2xvc2UnYCBldmVudC5cbiAgICAgIC8vXG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICBlbWl0Q2xvc2UodGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VlIGlmIGEgZ2l2ZW4gcmVxdWVzdCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGlzIHNlcnZlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtodHRwLkluY29taW5nTWVzc2FnZX0gcmVxIFJlcXVlc3Qgb2JqZWN0IHRvIGluc3BlY3RcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSByZXF1ZXN0IGlzIHZhbGlkLCBlbHNlIGBmYWxzZWBcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2hvdWxkSGFuZGxlKHJlcSkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMucGF0aCkge1xuICAgICAgY29uc3QgaW5kZXggPSByZXEudXJsLmluZGV4T2YoJz8nKTtcbiAgICAgIGNvbnN0IHBhdGhuYW1lID0gaW5kZXggIT09IC0xID8gcmVxLnVybC5zbGljZSgwLCBpbmRleCkgOiByZXEudXJsO1xuXG4gICAgICBpZiAocGF0aG5hbWUgIT09IHRoaXMub3B0aW9ucy5wYXRoKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGEgSFRUUCBVcGdyYWRlIHJlcXVlc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7aHR0cC5JbmNvbWluZ01lc3NhZ2V9IHJlcSBUaGUgcmVxdWVzdCBvYmplY3RcbiAgICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgbmV0d29yayBzb2NrZXQgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWQgVGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgdXBncmFkZWQgc3RyZWFtXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGhhbmRsZVVwZ3JhZGUocmVxLCBzb2NrZXQsIGhlYWQsIGNiKSB7XG4gICAgc29ja2V0Lm9uKCdlcnJvcicsIHNvY2tldE9uRXJyb3IpO1xuXG4gICAgY29uc3Qga2V5ID0gcmVxLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQta2V5J107XG4gICAgY29uc3QgdXBncmFkZSA9IHJlcS5oZWFkZXJzLnVwZ3JhZGU7XG4gICAgY29uc3QgdmVyc2lvbiA9ICtyZXEuaGVhZGVyc1snc2VjLXdlYnNvY2tldC12ZXJzaW9uJ107XG5cbiAgICBpZiAocmVxLm1ldGhvZCAhPT0gJ0dFVCcpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnSW52YWxpZCBIVFRQIG1ldGhvZCc7XG4gICAgICBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3IodGhpcywgcmVxLCBzb2NrZXQsIDQwNSwgbWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHVwZ3JhZGUgPT09IHVuZGVmaW5lZCB8fCB1cGdyYWRlLnRvTG93ZXJDYXNlKCkgIT09ICd3ZWJzb2NrZXQnKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgVXBncmFkZSBoZWFkZXInO1xuICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCAha2V5UmVnZXgudGVzdChrZXkpKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ01pc3Npbmcgb3IgaW52YWxpZCBTZWMtV2ViU29ja2V0LUtleSBoZWFkZXInO1xuICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uICE9PSA4ICYmIHZlcnNpb24gIT09IDEzKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ01pc3Npbmcgb3IgaW52YWxpZCBTZWMtV2ViU29ja2V0LVZlcnNpb24gaGVhZGVyJztcbiAgICAgIGFib3J0SGFuZHNoYWtlT3JFbWl0d3NDbGllbnRFcnJvcih0aGlzLCByZXEsIHNvY2tldCwgNDAwLCBtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2hvdWxkSGFuZGxlKHJlcSkpIHtcbiAgICAgIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgNDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWNXZWJTb2NrZXRQcm90b2NvbCA9IHJlcS5oZWFkZXJzWydzZWMtd2Vic29ja2V0LXByb3RvY29sJ107XG4gICAgbGV0IHByb3RvY29scyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChzZWNXZWJTb2NrZXRQcm90b2NvbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwcm90b2NvbHMgPSBzdWJwcm90b2NvbC5wYXJzZShzZWNXZWJTb2NrZXRQcm90b2NvbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgaGVhZGVyJztcbiAgICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjV2ViU29ja2V0RXh0ZW5zaW9ucyA9IHJlcS5oZWFkZXJzWydzZWMtd2Vic29ja2V0LWV4dGVuc2lvbnMnXTtcbiAgICBjb25zdCBleHRlbnNpb25zID0ge307XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLm9wdGlvbnMucGVyTWVzc2FnZURlZmxhdGUgJiZcbiAgICAgIHNlY1dlYlNvY2tldEV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc3QgcGVyTWVzc2FnZURlZmxhdGUgPSBuZXcgUGVyTWVzc2FnZURlZmxhdGUoXG4gICAgICAgIHRoaXMub3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5vcHRpb25zLm1heFBheWxvYWRcbiAgICAgICk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9mZmVycyA9IGV4dGVuc2lvbi5wYXJzZShzZWNXZWJTb2NrZXRFeHRlbnNpb25zKTtcblxuICAgICAgICBpZiAob2ZmZXJzW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdKSB7XG4gICAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUuYWNjZXB0KG9mZmVyc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSk7XG4gICAgICAgICAgZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSA9IHBlck1lc3NhZ2VEZWZsYXRlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgJ0ludmFsaWQgb3IgdW5hY2NlcHRhYmxlIFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyBoZWFkZXInO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3IodGhpcywgcmVxLCBzb2NrZXQsIDQwMCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIE9wdGlvbmFsbHkgY2FsbCBleHRlcm5hbCBjbGllbnQgdmVyaWZpY2F0aW9uIGhhbmRsZXIuXG4gICAgLy9cbiAgICBpZiAodGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudCkge1xuICAgICAgY29uc3QgaW5mbyA9IHtcbiAgICAgICAgb3JpZ2luOlxuICAgICAgICAgIHJlcS5oZWFkZXJzW2Ake3ZlcnNpb24gPT09IDggPyAnc2VjLXdlYnNvY2tldC1vcmlnaW4nIDogJ29yaWdpbid9YF0sXG4gICAgICAgIHNlY3VyZTogISEocmVxLnNvY2tldC5hdXRob3JpemVkIHx8IHJlcS5zb2NrZXQuZW5jcnlwdGVkKSxcbiAgICAgICAgcmVxXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudChpbmZvLCAodmVyaWZpZWQsIGNvZGUsIG1lc3NhZ2UsIGhlYWRlcnMpID0+IHtcbiAgICAgICAgICBpZiAoIXZlcmlmaWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYWJvcnRIYW5kc2hha2Uoc29ja2V0LCBjb2RlIHx8IDQwMSwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb21wbGV0ZVVwZ3JhZGUoXG4gICAgICAgICAgICBleHRlbnNpb25zLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcHJvdG9jb2xzLFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgc29ja2V0LFxuICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgIGNiXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudmVyaWZ5Q2xpZW50KGluZm8pKSByZXR1cm4gYWJvcnRIYW5kc2hha2Uoc29ja2V0LCA0MDEpO1xuICAgIH1cblxuICAgIHRoaXMuY29tcGxldGVVcGdyYWRlKGV4dGVuc2lvbnMsIGtleSwgcHJvdG9jb2xzLCByZXEsIHNvY2tldCwgaGVhZCwgY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZ3JhZGUgdGhlIGNvbm5lY3Rpb24gdG8gV2ViU29ja2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXh0ZW5zaW9ucyBUaGUgYWNjZXB0ZWQgZXh0ZW5zaW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSB2YWx1ZSBvZiB0aGUgYFNlYy1XZWJTb2NrZXQtS2V5YCBoZWFkZXJcbiAgICogQHBhcmFtIHtTZXR9IHByb3RvY29scyBUaGUgc3VicHJvdG9jb2xzXG4gICAqIEBwYXJhbSB7aHR0cC5JbmNvbWluZ01lc3NhZ2V9IHJlcSBUaGUgcmVxdWVzdCBvYmplY3RcbiAgICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgbmV0d29yayBzb2NrZXQgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWQgVGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgdXBncmFkZWQgc3RyZWFtXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugd2l0aCB0aGUgc2FtZSBzb2NrZXRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbXBsZXRlVXBncmFkZShleHRlbnNpb25zLCBrZXksIHByb3RvY29scywgcmVxLCBzb2NrZXQsIGhlYWQsIGNiKSB7XG4gICAgLy9cbiAgICAvLyBEZXN0cm95IHRoZSBzb2NrZXQgaWYgdGhlIGNsaWVudCBoYXMgYWxyZWFkeSBzZW50IGEgRklOIHBhY2tldC5cbiAgICAvL1xuICAgIGlmICghc29ja2V0LnJlYWRhYmxlIHx8ICFzb2NrZXQud3JpdGFibGUpIHJldHVybiBzb2NrZXQuZGVzdHJveSgpO1xuXG4gICAgaWYgKHNvY2tldFtrV2ViU29ja2V0XSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnc2VydmVyLmhhbmRsZVVwZ3JhZGUoKSB3YXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHdpdGggdGhlIHNhbWUgJyArXG4gICAgICAgICAgJ3NvY2tldCwgcG9zc2libHkgZHVlIHRvIGEgbWlzY29uZmlndXJhdGlvbidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3N0YXRlID4gUlVOTklORykgcmV0dXJuIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgNTAzKTtcblxuICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goJ3NoYTEnKVxuICAgICAgLnVwZGF0ZShrZXkgKyBHVUlEKVxuICAgICAgLmRpZ2VzdCgnYmFzZTY0Jyk7XG5cbiAgICBjb25zdCBoZWFkZXJzID0gW1xuICAgICAgJ0hUVFAvMS4xIDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzJyxcbiAgICAgICdVcGdyYWRlOiB3ZWJzb2NrZXQnLFxuICAgICAgJ0Nvbm5lY3Rpb246IFVwZ3JhZGUnLFxuICAgICAgYFNlYy1XZWJTb2NrZXQtQWNjZXB0OiAke2RpZ2VzdH1gXG4gICAgXTtcblxuICAgIGNvbnN0IHdzID0gbmV3IHRoaXMub3B0aW9ucy5XZWJTb2NrZXQobnVsbCwgdW5kZWZpbmVkLCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgaWYgKHByb3RvY29scy5zaXplKSB7XG4gICAgICAvL1xuICAgICAgLy8gT3B0aW9uYWxseSBjYWxsIGV4dGVybmFsIHByb3RvY29sIHNlbGVjdGlvbiBoYW5kbGVyLlxuICAgICAgLy9cbiAgICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5vcHRpb25zLmhhbmRsZVByb3RvY29sc1xuICAgICAgICA/IHRoaXMub3B0aW9ucy5oYW5kbGVQcm90b2NvbHMocHJvdG9jb2xzLCByZXEpXG4gICAgICAgIDogcHJvdG9jb2xzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgICAgaWYgKHByb3RvY29sKSB7XG4gICAgICAgIGhlYWRlcnMucHVzaChgU2VjLVdlYlNvY2tldC1Qcm90b2NvbDogJHtwcm90b2NvbH1gKTtcbiAgICAgICAgd3MuX3Byb3RvY29sID0gcHJvdG9jb2w7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0pIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IGV4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0ucGFyYW1zO1xuICAgICAgY29uc3QgdmFsdWUgPSBleHRlbnNpb24uZm9ybWF0KHtcbiAgICAgICAgW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdOiBbcGFyYW1zXVxuICAgICAgfSk7XG4gICAgICBoZWFkZXJzLnB1c2goYFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9uczogJHt2YWx1ZX1gKTtcbiAgICAgIHdzLl9leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIEFsbG93IGV4dGVybmFsIG1vZGlmaWNhdGlvbi9pbnNwZWN0aW9uIG9mIGhhbmRzaGFrZSBoZWFkZXJzLlxuICAgIC8vXG4gICAgdGhpcy5lbWl0KCdoZWFkZXJzJywgaGVhZGVycywgcmVxKTtcblxuICAgIHNvY2tldC53cml0ZShoZWFkZXJzLmNvbmNhdCgnXFxyXFxuJykuam9pbignXFxyXFxuJykpO1xuICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBzb2NrZXRPbkVycm9yKTtcblxuICAgIHdzLnNldFNvY2tldChzb2NrZXQsIGhlYWQsIHtcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IHRoaXMub3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzLFxuICAgICAgbWF4UGF5bG9hZDogdGhpcy5vcHRpb25zLm1heFBheWxvYWQsXG4gICAgICBza2lwVVRGOFZhbGlkYXRpb246IHRoaXMub3B0aW9ucy5za2lwVVRGOFZhbGlkYXRpb25cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNsaWVudHMpIHtcbiAgICAgIHRoaXMuY2xpZW50cy5hZGQod3MpO1xuICAgICAgd3Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmNsaWVudHMuZGVsZXRlKHdzKTtcblxuICAgICAgICBpZiAodGhpcy5fc2hvdWxkRW1pdENsb3NlICYmICF0aGlzLmNsaWVudHMuc2l6ZSkge1xuICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2Iod3MsIHJlcSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBXZWJTb2NrZXRTZXJ2ZXI7XG5cbi8qKlxuICogQWRkIGV2ZW50IGxpc3RlbmVycyBvbiBhbiBgRXZlbnRFbWl0dGVyYCB1c2luZyBhIG1hcCBvZiA8ZXZlbnQsIGxpc3RlbmVyPlxuICogcGFpcnMuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IHNlcnZlciBUaGUgZXZlbnQgZW1pdHRlclxuICogQHBhcmFtIHtPYmplY3QuPFN0cmluZywgRnVuY3Rpb24+fSBtYXAgVGhlIGxpc3RlbmVycyB0byBhZGRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCByZW1vdmUgdGhlIGFkZGVkIGxpc3RlbmVycyB3aGVuXG4gKiAgICAgY2FsbGVkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRMaXN0ZW5lcnMoc2VydmVyLCBtYXApIHtcbiAgZm9yIChjb25zdCBldmVudCBvZiBPYmplY3Qua2V5cyhtYXApKSBzZXJ2ZXIub24oZXZlbnQsIG1hcFtldmVudF0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcnMoKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBPYmplY3Qua2V5cyhtYXApKSB7XG4gICAgICBzZXJ2ZXIucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIG1hcFtldmVudF0pO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBFbWl0IGEgYCdjbG9zZSdgIGV2ZW50IG9uIGFuIGBFdmVudEVtaXR0ZXJgLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBzZXJ2ZXIgVGhlIGV2ZW50IGVtaXR0ZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGVtaXRDbG9zZShzZXJ2ZXIpIHtcbiAgc2VydmVyLl9zdGF0ZSA9IENMT1NFRDtcbiAgc2VydmVyLmVtaXQoJ2Nsb3NlJyk7XG59XG5cbi8qKlxuICogSGFuZGxlIHNvY2tldCBlcnJvcnMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc29ja2V0T25FcnJvcigpIHtcbiAgdGhpcy5kZXN0cm95KCk7XG59XG5cbi8qKlxuICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24gd2hlbiBwcmVjb25kaXRpb25zIGFyZSBub3QgZnVsZmlsbGVkLlxuICpcbiAqIEBwYXJhbSB7RHVwbGV4fSBzb2NrZXQgVGhlIHNvY2tldCBvZiB0aGUgdXBncmFkZSByZXF1ZXN0XG4gKiBAcGFyYW0ge051bWJlcn0gY29kZSBUaGUgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZVxuICogQHBhcmFtIHtTdHJpbmd9IFttZXNzYWdlXSBUaGUgSFRUUCByZXNwb25zZSBib2R5XG4gKiBAcGFyYW0ge09iamVjdH0gW2hlYWRlcnNdIEFkZGl0aW9uYWwgSFRUUCByZXNwb25zZSBoZWFkZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZShzb2NrZXQsIGNvZGUsIG1lc3NhZ2UsIGhlYWRlcnMpIHtcbiAgLy9cbiAgLy8gVGhlIHNvY2tldCBpcyB3cml0YWJsZSB1bmxlc3MgdGhlIHVzZXIgZGVzdHJveWVkIG9yIGVuZGVkIGl0IGJlZm9yZSBjYWxsaW5nXG4gIC8vIGBzZXJ2ZXIuaGFuZGxlVXBncmFkZSgpYCBvciBpbiB0aGUgYHZlcmlmeUNsaWVudGAgZnVuY3Rpb24sIHdoaWNoIGlzIGEgdXNlclxuICAvLyBlcnJvci4gSGFuZGxpbmcgdGhpcyBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgYXMgdGhlIHdvcnN0IHRoYXQgY2FuIGhhcHBlblxuICAvLyBpcyB0aGF0IHNvbWUgb2YgdGhlIGRhdGEgd3JpdHRlbiBieSB0aGUgdXNlciBtaWdodCBiZSBkaXNjYXJkZWQgZHVlIHRvIHRoZVxuICAvLyBjYWxsIHRvIGBzb2NrZXQuZW5kKClgIGJlbG93LCB3aGljaCB0cmlnZ2VycyBhbiBgJ2Vycm9yJ2AgZXZlbnQgdGhhdCBpblxuICAvLyB0dXJuIGNhdXNlcyB0aGUgc29ja2V0IHRvIGJlIGRlc3Ryb3llZC5cbiAgLy9cbiAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgaHR0cC5TVEFUVVNfQ09ERVNbY29kZV07XG4gIGhlYWRlcnMgPSB7XG4gICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcbiAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbCcsXG4gICAgJ0NvbnRlbnQtTGVuZ3RoJzogQnVmZmVyLmJ5dGVMZW5ndGgobWVzc2FnZSksXG4gICAgLi4uaGVhZGVyc1xuICB9O1xuXG4gIHNvY2tldC5vbmNlKCdmaW5pc2gnLCBzb2NrZXQuZGVzdHJveSk7XG5cbiAgc29ja2V0LmVuZChcbiAgICBgSFRUUC8xLjEgJHtjb2RlfSAke2h0dHAuU1RBVFVTX0NPREVTW2NvZGVdfVxcclxcbmAgK1xuICAgICAgT2JqZWN0LmtleXMoaGVhZGVycylcbiAgICAgICAgLm1hcCgoaCkgPT4gYCR7aH06ICR7aGVhZGVyc1toXX1gKVxuICAgICAgICAuam9pbignXFxyXFxuJykgK1xuICAgICAgJ1xcclxcblxcclxcbicgK1xuICAgICAgbWVzc2FnZVxuICApO1xufVxuXG4vKipcbiAqIEVtaXQgYSBgJ3dzQ2xpZW50RXJyb3InYCBldmVudCBvbiBhIGBXZWJTb2NrZXRTZXJ2ZXJgIGlmIHRoZXJlIGlzIGF0IGxlYXN0XG4gKiBvbmUgbGlzdGVuZXIgZm9yIGl0LCBvdGhlcndpc2UgY2FsbCBgYWJvcnRIYW5kc2hha2UoKWAuXG4gKlxuICogQHBhcmFtIHtXZWJTb2NrZXRTZXJ2ZXJ9IHNlcnZlciBUaGUgV2ViU29ja2V0IHNlcnZlclxuICogQHBhcmFtIHtodHRwLkluY29taW5nTWVzc2FnZX0gcmVxIFRoZSByZXF1ZXN0IG9iamVjdFxuICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgc29ja2V0IG9mIHRoZSB1cGdyYWRlIHJlcXVlc3RcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlIFRoZSBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgSFRUUCByZXNwb25zZSBib2R5XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3Ioc2VydmVyLCByZXEsIHNvY2tldCwgY29kZSwgbWVzc2FnZSkge1xuICBpZiAoc2VydmVyLmxpc3RlbmVyQ291bnQoJ3dzQ2xpZW50RXJyb3InKSkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIGFib3J0SGFuZHNoYWtlT3JFbWl0d3NDbGllbnRFcnJvcik7XG5cbiAgICBzZXJ2ZXIuZW1pdCgnd3NDbGllbnRFcnJvcicsIGVyciwgc29ja2V0LCByZXEpO1xuICB9IGVsc2Uge1xuICAgIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgY29kZSwgbWVzc2FnZSk7XG4gIH1cbn1cbiIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXkR1cGxleHxSZWFkYWJsZSRcIiwgXCJjYXVnaHRFcnJvcnNcIjogXCJub25lXCIgfV0gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCBuZXQgPSByZXF1aXJlKCduZXQnKTtcbmNvbnN0IHRscyA9IHJlcXVpcmUoJ3RscycpO1xuY29uc3QgeyByYW5kb21CeXRlcywgY3JlYXRlSGFzaCB9ID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCB7IER1cGxleCwgUmVhZGFibGUgfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuY29uc3QgeyBVUkwgfSA9IHJlcXVpcmUoJ3VybCcpO1xuXG5jb25zdCBQZXJNZXNzYWdlRGVmbGF0ZSA9IHJlcXVpcmUoJy4vcGVybWVzc2FnZS1kZWZsYXRlJyk7XG5jb25zdCBSZWNlaXZlciA9IHJlcXVpcmUoJy4vcmVjZWl2ZXInKTtcbmNvbnN0IFNlbmRlciA9IHJlcXVpcmUoJy4vc2VuZGVyJyk7XG5jb25zdCB7IGlzQmxvYiB9ID0gcmVxdWlyZSgnLi92YWxpZGF0aW9uJyk7XG5cbmNvbnN0IHtcbiAgQklOQVJZX1RZUEVTLFxuICBFTVBUWV9CVUZGRVIsXG4gIEdVSUQsXG4gIGtGb3JPbkV2ZW50QXR0cmlidXRlLFxuICBrTGlzdGVuZXIsXG4gIGtTdGF0dXNDb2RlLFxuICBrV2ViU29ja2V0LFxuICBOT09QXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IHtcbiAgRXZlbnRUYXJnZXQ6IHsgYWRkRXZlbnRMaXN0ZW5lciwgcmVtb3ZlRXZlbnRMaXN0ZW5lciB9XG59ID0gcmVxdWlyZSgnLi9ldmVudC10YXJnZXQnKTtcbmNvbnN0IHsgZm9ybWF0LCBwYXJzZSB9ID0gcmVxdWlyZSgnLi9leHRlbnNpb24nKTtcbmNvbnN0IHsgdG9CdWZmZXIgfSA9IHJlcXVpcmUoJy4vYnVmZmVyLXV0aWwnKTtcblxuY29uc3QgY2xvc2VUaW1lb3V0ID0gMzAgKiAxMDAwO1xuY29uc3Qga0Fib3J0ZWQgPSBTeW1ib2woJ2tBYm9ydGVkJyk7XG5jb25zdCBwcm90b2NvbFZlcnNpb25zID0gWzgsIDEzXTtcbmNvbnN0IHJlYWR5U3RhdGVzID0gWydDT05ORUNUSU5HJywgJ09QRU4nLCAnQ0xPU0lORycsICdDTE9TRUQnXTtcbmNvbnN0IHN1YnByb3RvY29sUmVnZXggPSAvXlshIyQlJicqK1xcLS4wLTlBLVpeX2B8YS16fl0rJC87XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgV2ViU29ja2V0LlxuICpcbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICovXG5jbGFzcyBXZWJTb2NrZXQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBXZWJTb2NrZXRgLlxuICAgKlxuICAgKiBAcGFyYW0geyhTdHJpbmd8VVJMKX0gYWRkcmVzcyBUaGUgVVJMIHRvIHdoaWNoIHRvIGNvbm5lY3RcbiAgICogQHBhcmFtIHsoU3RyaW5nfFN0cmluZ1tdKX0gW3Byb3RvY29sc10gVGhlIHN1YnByb3RvY29sc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIENvbm5lY3Rpb24gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IoYWRkcmVzcywgcHJvdG9jb2xzLCBvcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2JpbmFyeVR5cGUgPSBCSU5BUllfVFlQRVNbMF07XG4gICAgdGhpcy5fY2xvc2VDb2RlID0gMTAwNjtcbiAgICB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jbG9zZUZyYW1lU2VudCA9IGZhbHNlO1xuICAgIHRoaXMuX2Nsb3NlTWVzc2FnZSA9IEVNUFRZX0JVRkZFUjtcbiAgICB0aGlzLl9jbG9zZVRpbWVyID0gbnVsbDtcbiAgICB0aGlzLl9lcnJvckVtaXR0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9leHRlbnNpb25zID0ge307XG4gICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5fcHJvdG9jb2wgPSAnJztcbiAgICB0aGlzLl9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNPTk5FQ1RJTkc7XG4gICAgdGhpcy5fcmVjZWl2ZXIgPSBudWxsO1xuICAgIHRoaXMuX3NlbmRlciA9IG51bGw7XG4gICAgdGhpcy5fc29ja2V0ID0gbnVsbDtcblxuICAgIGlmIChhZGRyZXNzICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9idWZmZXJlZEFtb3VudCA9IDA7XG4gICAgICB0aGlzLl9pc1NlcnZlciA9IGZhbHNlO1xuICAgICAgdGhpcy5fcmVkaXJlY3RzID0gMDtcblxuICAgICAgaWYgKHByb3RvY29scyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3RvY29scyA9IFtdO1xuICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShwcm90b2NvbHMpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdG9jb2xzID09PSAnb2JqZWN0JyAmJiBwcm90b2NvbHMgIT09IG51bGwpIHtcbiAgICAgICAgICBvcHRpb25zID0gcHJvdG9jb2xzO1xuICAgICAgICAgIHByb3RvY29scyA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3RvY29scyA9IFtwcm90b2NvbHNdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGluaXRBc0NsaWVudCh0aGlzLCBhZGRyZXNzLCBwcm90b2NvbHMsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hdXRvUG9uZyA9IG9wdGlvbnMuYXV0b1Bvbmc7XG4gICAgICB0aGlzLl9pc1NlcnZlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoZSBjdXN0b20gXCJub2RlYnVmZmVyXCIgdHlwZSBpcyB1c2VkIGJ5IHRoZSBkZWZhdWx0XG4gICAqIGluc3RlYWQgb2YgXCJibG9iXCIuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgYmluYXJ5VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYmluYXJ5VHlwZTtcbiAgfVxuXG4gIHNldCBiaW5hcnlUeXBlKHR5cGUpIHtcbiAgICBpZiAoIUJJTkFSWV9UWVBFUy5pbmNsdWRlcyh0eXBlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fYmluYXJ5VHlwZSA9IHR5cGU7XG5cbiAgICAvL1xuICAgIC8vIEFsbG93IHRvIGNoYW5nZSBgYmluYXJ5VHlwZWAgb24gdGhlIGZseS5cbiAgICAvL1xuICAgIGlmICh0aGlzLl9yZWNlaXZlcikgdGhpcy5fcmVjZWl2ZXIuX2JpbmFyeVR5cGUgPSB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgYnVmZmVyZWRBbW91bnQoKSB7XG4gICAgaWYgKCF0aGlzLl9zb2NrZXQpIHJldHVybiB0aGlzLl9idWZmZXJlZEFtb3VudDtcblxuICAgIHJldHVybiB0aGlzLl9zb2NrZXQuX3dyaXRhYmxlU3RhdGUubGVuZ3RoICsgdGhpcy5fc2VuZGVyLl9idWZmZXJlZEJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgZXh0ZW5zaW9ucygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fZXh0ZW5zaW9ucykuam9pbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgZ2V0IGlzUGF1c2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXVzZWQ7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0IG9uY2xvc2UoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0IG9uZXJyb3IoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0IG9ub3BlbigpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBnZXQgb25tZXNzYWdlKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgcHJvdG9jb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgcmVhZHlTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZHlTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgZ2V0IHVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCB0aGUgc29ja2V0IGFuZCB0aGUgaW50ZXJuYWwgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge0R1cGxleH0gc29ja2V0IFRoZSBuZXR3b3JrIHNvY2tldCBiZXR3ZWVuIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gaGVhZCBUaGUgZmlyc3QgcGFja2V0IG9mIHRoZSB1cGdyYWRlZCBzdHJlYW1cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlclxuICAgKiAgICAgYW55IG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWRcbiAgICogICAgIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHRpY2tcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZ2VuZXJhdGVNYXNrXSBUaGUgZnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSB0aGVcbiAgICogICAgIG1hc2tpbmcga2V5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhQYXlsb2FkPTBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZSBzaXplXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2tpcFVURjhWYWxpZGF0aW9uPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvclxuICAgKiAgICAgbm90IHRvIHNraXAgVVRGLTggdmFsaWRhdGlvbiBmb3IgdGV4dCBhbmQgY2xvc2UgbWVzc2FnZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldFNvY2tldChzb2NrZXQsIGhlYWQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCByZWNlaXZlciA9IG5ldyBSZWNlaXZlcih7XG4gICAgICBhbGxvd1N5bmNocm9ub3VzRXZlbnRzOiBvcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHMsXG4gICAgICBiaW5hcnlUeXBlOiB0aGlzLmJpbmFyeVR5cGUsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLl9leHRlbnNpb25zLFxuICAgICAgaXNTZXJ2ZXI6IHRoaXMuX2lzU2VydmVyLFxuICAgICAgbWF4UGF5bG9hZDogb3B0aW9ucy5tYXhQYXlsb2FkLFxuICAgICAgc2tpcFVURjhWYWxpZGF0aW9uOiBvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvblxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2VuZGVyID0gbmV3IFNlbmRlcihzb2NrZXQsIHRoaXMuX2V4dGVuc2lvbnMsIG9wdGlvbnMuZ2VuZXJhdGVNYXNrKTtcblxuICAgIHRoaXMuX3JlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgdGhpcy5fc2VuZGVyID0gc2VuZGVyO1xuICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcblxuICAgIHJlY2VpdmVyW2tXZWJTb2NrZXRdID0gdGhpcztcbiAgICBzZW5kZXJba1dlYlNvY2tldF0gPSB0aGlzO1xuICAgIHNvY2tldFtrV2ViU29ja2V0XSA9IHRoaXM7XG5cbiAgICByZWNlaXZlci5vbignY29uY2x1ZGUnLCByZWNlaXZlck9uQ29uY2x1ZGUpO1xuICAgIHJlY2VpdmVyLm9uKCdkcmFpbicsIHJlY2VpdmVyT25EcmFpbik7XG4gICAgcmVjZWl2ZXIub24oJ2Vycm9yJywgcmVjZWl2ZXJPbkVycm9yKTtcbiAgICByZWNlaXZlci5vbignbWVzc2FnZScsIHJlY2VpdmVyT25NZXNzYWdlKTtcbiAgICByZWNlaXZlci5vbigncGluZycsIHJlY2VpdmVyT25QaW5nKTtcbiAgICByZWNlaXZlci5vbigncG9uZycsIHJlY2VpdmVyT25Qb25nKTtcblxuICAgIHNlbmRlci5vbmVycm9yID0gc2VuZGVyT25FcnJvcjtcblxuICAgIC8vXG4gICAgLy8gVGhlc2UgbWV0aG9kcyBtYXkgbm90IGJlIGF2YWlsYWJsZSBpZiBgc29ja2V0YCBpcyBqdXN0IGEgYER1cGxleGAuXG4gICAgLy9cbiAgICBpZiAoc29ja2V0LnNldFRpbWVvdXQpIHNvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgIGlmIChzb2NrZXQuc2V0Tm9EZWxheSkgc29ja2V0LnNldE5vRGVsYXkoKTtcblxuICAgIGlmIChoZWFkLmxlbmd0aCA+IDApIHNvY2tldC51bnNoaWZ0KGhlYWQpO1xuXG4gICAgc29ja2V0Lm9uKCdjbG9zZScsIHNvY2tldE9uQ2xvc2UpO1xuICAgIHNvY2tldC5vbignZGF0YScsIHNvY2tldE9uRGF0YSk7XG4gICAgc29ja2V0Lm9uKCdlbmQnLCBzb2NrZXRPbkVuZCk7XG4gICAgc29ja2V0Lm9uKCdlcnJvcicsIHNvY2tldE9uRXJyb3IpO1xuXG4gICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5PUEVOO1xuICAgIHRoaXMuZW1pdCgnb3BlbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGAnY2xvc2UnYCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXRDbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX3NvY2tldCkge1xuICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TRUQ7XG4gICAgICB0aGlzLmVtaXQoJ2Nsb3NlJywgdGhpcy5fY2xvc2VDb2RlLCB0aGlzLl9jbG9zZU1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdKSB7XG4gICAgICB0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdLmNsZWFudXAoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWNlaXZlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NFRDtcbiAgICB0aGlzLmVtaXQoJ2Nsb3NlJywgdGhpcy5fY2xvc2VDb2RlLCB0aGlzLl9jbG9zZU1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgY2xvc2luZyBoYW5kc2hha2UuXG4gICAqXG4gICAqICAgICAgICAgICstLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLStcbiAgICogICAgIC0gLSAtfHdzLmNsb3NlKCl8LS0+fGNsb3NlIGZyYW1lfC0tPnx3cy5jbG9zZSgpfC0gLSAtXG4gICAqICAgIHwgICAgICstLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLSsgICAgIHxcbiAgICogICAgICAgICAgKy0tLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0tKyAgICAgICAgIHxcbiAgICogQ0xPU0lORyAgfHdzLmNsb3NlKCl8PC0tfGNsb3NlIGZyYW1lfDwtLSstLS0tLSsgICAgICAgQ0xPU0lOR1xuICAgKiAgICAgICAgICArLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0rICAgfFxuICAgKiAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICstLS0rICAgICAgICB8XG4gICAqICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0+fGZpbnwgLSAtIC0gLVxuICAgKiAgICB8ICAgICAgICAgKy0tLSsgICAgICAgICAgICAgICAgICAgICAgfCAgICstLS0rXG4gICAqICAgICAtIC0gLSAtIC18ZmlufDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICAqICAgICAgICAgICAgICArLS0tK1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2NvZGVdIFN0YXR1cyBjb2RlIGV4cGxhaW5pbmcgd2h5IHRoZSBjb25uZWN0aW9uIGlzIGNsb3NpbmdcbiAgICogQHBhcmFtIHsoU3RyaW5nfEJ1ZmZlcil9IFtkYXRhXSBUaGUgcmVhc29uIHdoeSB0aGUgY29ubmVjdGlvbiBpc1xuICAgKiAgICAgY2xvc2luZ1xuICAgKiBAcHVibGljXG4gICAqL1xuICBjbG9zZShjb2RlLCBkYXRhKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NFRCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICBjb25zdCBtc2cgPSAnV2ViU29ja2V0IHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCc7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh0aGlzLCB0aGlzLl9yZXEsIG1zZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NJTkcpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fY2xvc2VGcmFtZVNlbnQgJiZcbiAgICAgICAgKHRoaXMuX2Nsb3NlRnJhbWVSZWNlaXZlZCB8fCB0aGlzLl9yZWNlaXZlci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fc29ja2V0LmVuZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgIHRoaXMuX3NlbmRlci5jbG9zZShjb2RlLCBkYXRhLCAhdGhpcy5faXNTZXJ2ZXIsIChlcnIpID0+IHtcbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGVycm9yIGlzIGhhbmRsZWQgYnkgdGhlIGAnZXJyb3InYCBsaXN0ZW5lciBvbiB0aGUgc29ja2V0LiBXZSBvbmx5XG4gICAgICAvLyB3YW50IHRvIGtub3cgaWYgdGhlIGNsb3NlIGZyYW1lIGhhcyBiZWVuIHNlbnQgaGVyZS5cbiAgICAgIC8vXG4gICAgICBpZiAoZXJyKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX2Nsb3NlRnJhbWVTZW50ID0gdHJ1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgfHxcbiAgICAgICAgdGhpcy5fcmVjZWl2ZXIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fc29ja2V0LmVuZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0Q2xvc2VUaW1lcih0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB0aGUgc29ja2V0LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICBwYXVzZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HIHx8XG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRURcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xuICAgIHRoaXMuX3NvY2tldC5wYXVzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBwaW5nLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IFtkYXRhXSBUaGUgZGF0YSB0byBzZW5kXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW21hc2tdIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrIGBkYXRhYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrIHdoaWNoIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIHBpbmcgaXMgc2VudFxuICAgKiBAcHVibGljXG4gICAqL1xuICBwaW5nKGRhdGEsIG1hc2ssIGNiKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2ViU29ja2V0IGlzIG5vdCBvcGVuOiByZWFkeVN0YXRlIDAgKENPTk5FQ1RJTkcpJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IGRhdGE7XG4gICAgICBkYXRhID0gbWFzayA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtYXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IG1hc2s7XG4gICAgICBtYXNrID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgc2VuZEFmdGVyQ2xvc2UodGhpcywgZGF0YSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYXNrID09PSB1bmRlZmluZWQpIG1hc2sgPSAhdGhpcy5faXNTZXJ2ZXI7XG4gICAgdGhpcy5fc2VuZGVyLnBpbmcoZGF0YSB8fCBFTVBUWV9CVUZGRVIsIG1hc2ssIGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgcG9uZy5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBbZGF0YV0gVGhlIGRhdGEgdG8gc2VuZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrXSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFjayB3aGljaCBpcyBleGVjdXRlZCB3aGVuIHRoZSBwb25nIGlzIHNlbnRcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcG9uZyhkYXRhLCBtYXNrLCBjYikge1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAwIChDT05ORUNUSU5HKScpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBkYXRhO1xuICAgICAgZGF0YSA9IG1hc2sgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWFzayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBtYXNrO1xuICAgICAgbWFzayA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdudW1iZXInKSBkYXRhID0gZGF0YS50b1N0cmluZygpO1xuXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHNlbmRBZnRlckNsb3NlKHRoaXMsIGRhdGEsIGNiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobWFzayA9PT0gdW5kZWZpbmVkKSBtYXNrID0gIXRoaXMuX2lzU2VydmVyO1xuICAgIHRoaXMuX3NlbmRlci5wb25nKGRhdGEgfHwgRU1QVFlfQlVGRkVSLCBtYXNrLCBjYik7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIHRoZSBzb2NrZXQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHJlc3VtZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HIHx8XG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRURcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLm5lZWREcmFpbikgdGhpcy5fc29ja2V0LnJlc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBkYXRhIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWVzc2FnZSB0byBzZW5kXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5iaW5hcnldIFNwZWNpZmllcyB3aGV0aGVyIGBkYXRhYCBpcyBiaW5hcnkgb3JcbiAgICogICAgIHRleHRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jb21wcmVzc10gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGNvbXByZXNzXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5maW49dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZyYWdtZW50IGlzIHRoZVxuICAgKiAgICAgbGFzdCBvbmVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tYXNrXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFjayB3aGljaCBpcyBleGVjdXRlZCB3aGVuIGRhdGEgaXMgd3JpdHRlbiBvdXRcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2VuZChkYXRhLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAwIChDT05ORUNUSU5HKScpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgc2VuZEFmdGVyQ2xvc2UodGhpcywgZGF0YSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBiaW5hcnk6IHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJyxcbiAgICAgIG1hc2s6ICF0aGlzLl9pc1NlcnZlcixcbiAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgZmluOiB0cnVlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG5cbiAgICBpZiAoIXRoaXMuX2V4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0pIHtcbiAgICAgIG9wdHMuY29tcHJlc3MgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZW5kZXIuc2VuZChkYXRhIHx8IEVNUFRZX0JVRkZFUiwgb3B0cywgY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNpYmx5IGNsb3NlIHRoZSBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICB0ZXJtaW5hdGUoKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NFRCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICBjb25zdCBtc2cgPSAnV2ViU29ja2V0IHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCc7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh0aGlzLCB0aGlzLl9yZXEsIG1zZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3NvY2tldCkge1xuICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgICAgdGhpcy5fc29ja2V0LmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gQ09OTkVDVElOR1xuICogQG1lbWJlcm9mIFdlYlNvY2tldFxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0LCAnQ09OTkVDVElORycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ0NPTk5FQ1RJTkcnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENPTk5FQ1RJTkdcbiAqIEBtZW1iZXJvZiBXZWJTb2NrZXQucHJvdG90eXBlXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQucHJvdG90eXBlLCAnQ09OTkVDVElORycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ0NPTk5FQ1RJTkcnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IE9QRU5cbiAqIEBtZW1iZXJvZiBXZWJTb2NrZXRcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldCwgJ09QRU4nLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdPUEVOJylcbn0pO1xuXG4vKipcbiAqIEBjb25zdGFudCB7TnVtYmVyfSBPUEVOXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0LnByb3RvdHlwZVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0LnByb3RvdHlwZSwgJ09QRU4nLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdPUEVOJylcbn0pO1xuXG4vKipcbiAqIEBjb25zdGFudCB7TnVtYmVyfSBDTE9TSU5HXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQsICdDTE9TSU5HJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB2YWx1ZTogcmVhZHlTdGF0ZXMuaW5kZXhPZignQ0xPU0lORycpXG59KTtcblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gQ0xPU0lOR1xuICogQG1lbWJlcm9mIFdlYlNvY2tldC5wcm90b3R5cGVcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsICdDTE9TSU5HJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB2YWx1ZTogcmVhZHlTdGF0ZXMuaW5kZXhPZignQ0xPU0lORycpXG59KTtcblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gQ0xPU0VEXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQsICdDTE9TRUQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdDTE9TRUQnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENMT1NFRFxuICogQG1lbWJlcm9mIFdlYlNvY2tldC5wcm90b3R5cGVcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsICdDTE9TRUQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdDTE9TRUQnKVxufSk7XG5cbltcbiAgJ2JpbmFyeVR5cGUnLFxuICAnYnVmZmVyZWRBbW91bnQnLFxuICAnZXh0ZW5zaW9ucycsXG4gICdpc1BhdXNlZCcsXG4gICdwcm90b2NvbCcsXG4gICdyZWFkeVN0YXRlJyxcbiAgJ3VybCdcbl0uZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsIHByb3BlcnR5LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG59KTtcblxuLy9cbi8vIEFkZCB0aGUgYG9ub3BlbmAsIGBvbmVycm9yYCwgYG9uY2xvc2VgLCBhbmQgYG9ubWVzc2FnZWAgYXR0cmlidXRlcy5cbi8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jb21tcy5odG1sI3RoZS13ZWJzb2NrZXQtaW50ZXJmYWNlXG4vL1xuWydvcGVuJywgJ2Vycm9yJywgJ2Nsb3NlJywgJ21lc3NhZ2UnXS5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsIGBvbiR7bWV0aG9kfWAsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldCgpIHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMobWV0aG9kKSkge1xuICAgICAgICBpZiAobGlzdGVuZXJba0Zvck9uRXZlbnRBdHRyaWJ1dGVdKSByZXR1cm4gbGlzdGVuZXJba0xpc3RlbmVyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBzZXQoaGFuZGxlcikge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycyhtZXRob2QpKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lcltrRm9yT25FdmVudEF0dHJpYnV0ZV0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKG1ldGhvZCwgbGlzdGVuZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIobWV0aG9kLCBoYW5kbGVyLCB7XG4gICAgICAgIFtrRm9yT25FdmVudEF0dHJpYnV0ZV06IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59KTtcblxuV2ViU29ja2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcjtcbldlYlNvY2tldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IHJlbW92ZUV2ZW50TGlzdGVuZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gV2ViU29ja2V0O1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBXZWJTb2NrZXQgY2xpZW50LlxuICpcbiAqIEBwYXJhbSB7V2ViU29ja2V0fSB3ZWJzb2NrZXQgVGhlIGNsaWVudCB0byBpbml0aWFsaXplXG4gKiBAcGFyYW0geyhTdHJpbmd8VVJMKX0gYWRkcmVzcyBUaGUgVVJMIHRvIHdoaWNoIHRvIGNvbm5lY3RcbiAqIEBwYXJhbSB7QXJyYXl9IHByb3RvY29scyBUaGUgc3VicHJvdG9jb2xzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIENvbm5lY3Rpb24gb3B0aW9uc1xuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzPXRydWVdIFNwZWNpZmllcyB3aGV0aGVyIGFueVxuICogICAgIG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWQgbXVsdGlwbGVcbiAqICAgICB0aW1lcyBpbiB0aGUgc2FtZSB0aWNrXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmF1dG9Qb25nPXRydWVdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0b1xuICogICAgIGF1dG9tYXRpY2FsbHkgc2VuZCBhIHBvbmcgaW4gcmVzcG9uc2UgdG8gYSBwaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5maW5pc2hSZXF1ZXN0XSBBIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvXG4gKiAgICAgY3VzdG9taXplIHRoZSBoZWFkZXJzIG9mIGVhY2ggaHR0cCByZXF1ZXN0IGJlZm9yZSBpdCBpcyBzZW50XG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZvbGxvd1JlZGlyZWN0cz1mYWxzZV0gV2hldGhlciBvciBub3QgdG8gZm9sbG93XG4gKiAgICAgcmVkaXJlY3RzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5nZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZVxuICogICAgIG1hc2tpbmcga2V5XG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaGFuZHNoYWtlVGltZW91dF0gVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZVxuICogICAgIGhhbmRzaGFrZSByZXF1ZXN0XG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UGF5bG9hZD0xMDQ4NTc2MDBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZVxuICogICAgIHNpemVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhSZWRpcmVjdHM9MTBdIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZWRpcmVjdHNcbiAqICAgICBhbGxvd2VkXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMub3JpZ2luXSBWYWx1ZSBvZiB0aGUgYE9yaWdpbmAgb3JcbiAqICAgICBgU2VjLVdlYlNvY2tldC1PcmlnaW5gIGhlYWRlclxuICogQHBhcmFtIHsoQm9vbGVhbnxPYmplY3QpfSBbb3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZT10cnVlXSBFbmFibGUvZGlzYWJsZVxuICogICAgIHBlcm1lc3NhZ2UtZGVmbGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnByb3RvY29sVmVyc2lvbj0xM10gVmFsdWUgb2YgdGhlXG4gKiAgICAgYFNlYy1XZWJTb2NrZXQtVmVyc2lvbmAgaGVhZGVyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAqICAgICBub3QgdG8gc2tpcCBVVEYtOCB2YWxpZGF0aW9uIGZvciB0ZXh0IGFuZCBjbG9zZSBtZXNzYWdlc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaW5pdEFzQ2xpZW50KHdlYnNvY2tldCwgYWRkcmVzcywgcHJvdG9jb2xzLCBvcHRpb25zKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgYWxsb3dTeW5jaHJvbm91c0V2ZW50czogdHJ1ZSxcbiAgICBhdXRvUG9uZzogdHJ1ZSxcbiAgICBwcm90b2NvbFZlcnNpb246IHByb3RvY29sVmVyc2lvbnNbMV0sXG4gICAgbWF4UGF5bG9hZDogMTAwICogMTAyNCAqIDEwMjQsXG4gICAgc2tpcFVURjhWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICBwZXJNZXNzYWdlRGVmbGF0ZTogdHJ1ZSxcbiAgICBmb2xsb3dSZWRpcmVjdHM6IGZhbHNlLFxuICAgIG1heFJlZGlyZWN0czogMTAsXG4gICAgLi4ub3B0aW9ucyxcbiAgICBzb2NrZXRQYXRoOiB1bmRlZmluZWQsXG4gICAgaG9zdG5hbWU6IHVuZGVmaW5lZCxcbiAgICBwcm90b2NvbDogdW5kZWZpbmVkLFxuICAgIHRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIGhvc3Q6IHVuZGVmaW5lZCxcbiAgICBwYXRoOiB1bmRlZmluZWQsXG4gICAgcG9ydDogdW5kZWZpbmVkXG4gIH07XG5cbiAgd2Vic29ja2V0Ll9hdXRvUG9uZyA9IG9wdHMuYXV0b1Bvbmc7XG5cbiAgaWYgKCFwcm90b2NvbFZlcnNpb25zLmluY2x1ZGVzKG9wdHMucHJvdG9jb2xWZXJzaW9uKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIHByb3RvY29sIHZlcnNpb246ICR7b3B0cy5wcm90b2NvbFZlcnNpb259IGAgK1xuICAgICAgICBgKHN1cHBvcnRlZCB2ZXJzaW9uczogJHtwcm90b2NvbFZlcnNpb25zLmpvaW4oJywgJyl9KWBcbiAgICApO1xuICB9XG5cbiAgbGV0IHBhcnNlZFVybDtcblxuICBpZiAoYWRkcmVzcyBpbnN0YW5jZW9mIFVSTCkge1xuICAgIHBhcnNlZFVybCA9IGFkZHJlc3M7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZFVybCA9IG5ldyBVUkwoYWRkcmVzcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIFVSTDogJHthZGRyZXNzfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwOicpIHtcbiAgICBwYXJzZWRVcmwucHJvdG9jb2wgPSAnd3M6JztcbiAgfSBlbHNlIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgcGFyc2VkVXJsLnByb3RvY29sID0gJ3dzczonO1xuICB9XG5cbiAgd2Vic29ja2V0Ll91cmwgPSBwYXJzZWRVcmwuaHJlZjtcblxuICBjb25zdCBpc1NlY3VyZSA9IHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ3dzczonO1xuICBjb25zdCBpc0lwY1VybCA9IHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ3dzK3VuaXg6JztcbiAgbGV0IGludmFsaWRVcmxNZXNzYWdlO1xuXG4gIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgIT09ICd3czonICYmICFpc1NlY3VyZSAmJiAhaXNJcGNVcmwpIHtcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9XG4gICAgICAnVGhlIFVSTFxcJ3MgcHJvdG9jb2wgbXVzdCBiZSBvbmUgb2YgXCJ3czpcIiwgXCJ3c3M6XCIsICcgK1xuICAgICAgJ1wiaHR0cDpcIiwgXCJodHRwc1wiLCBvciBcIndzK3VuaXg6XCInO1xuICB9IGVsc2UgaWYgKGlzSXBjVXJsICYmICFwYXJzZWRVcmwucGF0aG5hbWUpIHtcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9IFwiVGhlIFVSTCdzIHBhdGhuYW1lIGlzIGVtcHR5XCI7XG4gIH0gZWxzZSBpZiAocGFyc2VkVXJsLmhhc2gpIHtcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9ICdUaGUgVVJMIGNvbnRhaW5zIGEgZnJhZ21lbnQgaWRlbnRpZmllcic7XG4gIH1cblxuICBpZiAoaW52YWxpZFVybE1lc3NhZ2UpIHtcbiAgICBjb25zdCBlcnIgPSBuZXcgU3ludGF4RXJyb3IoaW52YWxpZFVybE1lc3NhZ2UpO1xuXG4gICAgaWYgKHdlYnNvY2tldC5fcmVkaXJlY3RzID09PSAwKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXRFcnJvckFuZENsb3NlKHdlYnNvY2tldCwgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWZhdWx0UG9ydCA9IGlzU2VjdXJlID8gNDQzIDogODA7XG4gIGNvbnN0IGtleSA9IHJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIGNvbnN0IHJlcXVlc3QgPSBpc1NlY3VyZSA/IGh0dHBzLnJlcXVlc3QgOiBodHRwLnJlcXVlc3Q7XG4gIGNvbnN0IHByb3RvY29sU2V0ID0gbmV3IFNldCgpO1xuICBsZXQgcGVyTWVzc2FnZURlZmxhdGU7XG5cbiAgb3B0cy5jcmVhdGVDb25uZWN0aW9uID1cbiAgICBvcHRzLmNyZWF0ZUNvbm5lY3Rpb24gfHwgKGlzU2VjdXJlID8gdGxzQ29ubmVjdCA6IG5ldENvbm5lY3QpO1xuICBvcHRzLmRlZmF1bHRQb3J0ID0gb3B0cy5kZWZhdWx0UG9ydCB8fCBkZWZhdWx0UG9ydDtcbiAgb3B0cy5wb3J0ID0gcGFyc2VkVXJsLnBvcnQgfHwgZGVmYXVsdFBvcnQ7XG4gIG9wdHMuaG9zdCA9IHBhcnNlZFVybC5ob3N0bmFtZS5zdGFydHNXaXRoKCdbJylcbiAgICA/IHBhcnNlZFVybC5ob3N0bmFtZS5zbGljZSgxLCAtMSlcbiAgICA6IHBhcnNlZFVybC5ob3N0bmFtZTtcbiAgb3B0cy5oZWFkZXJzID0ge1xuICAgIC4uLm9wdHMuaGVhZGVycyxcbiAgICAnU2VjLVdlYlNvY2tldC1WZXJzaW9uJzogb3B0cy5wcm90b2NvbFZlcnNpb24sXG4gICAgJ1NlYy1XZWJTb2NrZXQtS2V5Jzoga2V5LFxuICAgIENvbm5lY3Rpb246ICdVcGdyYWRlJyxcbiAgICBVcGdyYWRlOiAnd2Vic29ja2V0J1xuICB9O1xuICBvcHRzLnBhdGggPSBwYXJzZWRVcmwucGF0aG5hbWUgKyBwYXJzZWRVcmwuc2VhcmNoO1xuICBvcHRzLnRpbWVvdXQgPSBvcHRzLmhhbmRzaGFrZVRpbWVvdXQ7XG5cbiAgaWYgKG9wdHMucGVyTWVzc2FnZURlZmxhdGUpIHtcbiAgICBwZXJNZXNzYWdlRGVmbGF0ZSA9IG5ldyBQZXJNZXNzYWdlRGVmbGF0ZShcbiAgICAgIG9wdHMucGVyTWVzc2FnZURlZmxhdGUgIT09IHRydWUgPyBvcHRzLnBlck1lc3NhZ2VEZWZsYXRlIDoge30sXG4gICAgICBmYWxzZSxcbiAgICAgIG9wdHMubWF4UGF5bG9hZFxuICAgICk7XG4gICAgb3B0cy5oZWFkZXJzWydTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMnXSA9IGZvcm1hdCh7XG4gICAgICBbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV06IHBlck1lc3NhZ2VEZWZsYXRlLm9mZmVyKClcbiAgICB9KTtcbiAgfVxuICBpZiAocHJvdG9jb2xzLmxlbmd0aCkge1xuICAgIGZvciAoY29uc3QgcHJvdG9jb2wgb2YgcHJvdG9jb2xzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBwcm90b2NvbCAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgIXN1YnByb3RvY29sUmVnZXgudGVzdChwcm90b2NvbCkgfHxcbiAgICAgICAgcHJvdG9jb2xTZXQuaGFzKHByb3RvY29sKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICAnQW4gaW52YWxpZCBvciBkdXBsaWNhdGVkIHN1YnByb3RvY29sIHdhcyBzcGVjaWZpZWQnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHByb3RvY29sU2V0LmFkZChwcm90b2NvbCk7XG4gICAgfVxuXG4gICAgb3B0cy5oZWFkZXJzWydTZWMtV2ViU29ja2V0LVByb3RvY29sJ10gPSBwcm90b2NvbHMuam9pbignLCcpO1xuICB9XG4gIGlmIChvcHRzLm9yaWdpbikge1xuICAgIGlmIChvcHRzLnByb3RvY29sVmVyc2lvbiA8IDEzKSB7XG4gICAgICBvcHRzLmhlYWRlcnNbJ1NlYy1XZWJTb2NrZXQtT3JpZ2luJ10gPSBvcHRzLm9yaWdpbjtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0cy5oZWFkZXJzLk9yaWdpbiA9IG9wdHMub3JpZ2luO1xuICAgIH1cbiAgfVxuICBpZiAocGFyc2VkVXJsLnVzZXJuYW1lIHx8IHBhcnNlZFVybC5wYXNzd29yZCkge1xuICAgIG9wdHMuYXV0aCA9IGAke3BhcnNlZFVybC51c2VybmFtZX06JHtwYXJzZWRVcmwucGFzc3dvcmR9YDtcbiAgfVxuXG4gIGlmIChpc0lwY1VybCkge1xuICAgIGNvbnN0IHBhcnRzID0gb3B0cy5wYXRoLnNwbGl0KCc6Jyk7XG5cbiAgICBvcHRzLnNvY2tldFBhdGggPSBwYXJ0c1swXTtcbiAgICBvcHRzLnBhdGggPSBwYXJ0c1sxXTtcbiAgfVxuXG4gIGxldCByZXE7XG5cbiAgaWYgKG9wdHMuZm9sbG93UmVkaXJlY3RzKSB7XG4gICAgaWYgKHdlYnNvY2tldC5fcmVkaXJlY3RzID09PSAwKSB7XG4gICAgICB3ZWJzb2NrZXQuX29yaWdpbmFsSXBjID0gaXNJcGNVcmw7XG4gICAgICB3ZWJzb2NrZXQuX29yaWdpbmFsU2VjdXJlID0gaXNTZWN1cmU7XG4gICAgICB3ZWJzb2NrZXQuX29yaWdpbmFsSG9zdE9yU29ja2V0UGF0aCA9IGlzSXBjVXJsXG4gICAgICAgID8gb3B0cy5zb2NrZXRQYXRoXG4gICAgICAgIDogcGFyc2VkVXJsLmhvc3Q7XG5cbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBvcHRpb25zICYmIG9wdGlvbnMuaGVhZGVycztcblxuICAgICAgLy9cbiAgICAgIC8vIFNoYWxsb3cgY29weSB0aGUgdXNlciBwcm92aWRlZCBvcHRpb25zIHNvIHRoYXQgaGVhZGVycyBjYW4gYmUgY2hhbmdlZFxuICAgICAgLy8gd2l0aG91dCBtdXRhdGluZyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgICAgLy9cbiAgICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIGhlYWRlcnM6IHt9IH07XG5cbiAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh3ZWJzb2NrZXQubGlzdGVuZXJDb3VudCgncmVkaXJlY3QnKSA9PT0gMCkge1xuICAgICAgY29uc3QgaXNTYW1lSG9zdCA9IGlzSXBjVXJsXG4gICAgICAgID8gd2Vic29ja2V0Ll9vcmlnaW5hbElwY1xuICAgICAgICAgID8gb3B0cy5zb2NrZXRQYXRoID09PSB3ZWJzb2NrZXQuX29yaWdpbmFsSG9zdE9yU29ja2V0UGF0aFxuICAgICAgICAgIDogZmFsc2VcbiAgICAgICAgOiB3ZWJzb2NrZXQuX29yaWdpbmFsSXBjXG4gICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgIDogcGFyc2VkVXJsLmhvc3QgPT09IHdlYnNvY2tldC5fb3JpZ2luYWxIb3N0T3JTb2NrZXRQYXRoO1xuXG4gICAgICBpZiAoIWlzU2FtZUhvc3QgfHwgKHdlYnNvY2tldC5fb3JpZ2luYWxTZWN1cmUgJiYgIWlzU2VjdXJlKSkge1xuICAgICAgICAvL1xuICAgICAgICAvLyBNYXRjaCBjdXJsIDcuNzcuMCBiZWhhdmlvciBhbmQgZHJvcCB0aGUgZm9sbG93aW5nIGhlYWRlcnMuIFRoZXNlXG4gICAgICAgIC8vIGhlYWRlcnMgYXJlIGFsc28gZHJvcHBlZCB3aGVuIGZvbGxvd2luZyBhIHJlZGlyZWN0IHRvIGEgc3ViZG9tYWluLlxuICAgICAgICAvL1xuICAgICAgICBkZWxldGUgb3B0cy5oZWFkZXJzLmF1dGhvcml6YXRpb247XG4gICAgICAgIGRlbGV0ZSBvcHRzLmhlYWRlcnMuY29va2llO1xuXG4gICAgICAgIGlmICghaXNTYW1lSG9zdCkgZGVsZXRlIG9wdHMuaGVhZGVycy5ob3N0O1xuXG4gICAgICAgIG9wdHMuYXV0aCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIE1hdGNoIGN1cmwgNy43Ny4wIGJlaGF2aW9yIGFuZCBtYWtlIHRoZSBmaXJzdCBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIHdpbi5cbiAgICAvLyBJZiB0aGUgYEF1dGhvcml6YXRpb25gIGhlYWRlciBpcyBzZXQsIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkbyBhcyBpdFxuICAgIC8vIHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICAgIC8vXG4gICAgaWYgKG9wdHMuYXV0aCAmJiAhb3B0aW9ucy5oZWFkZXJzLmF1dGhvcml6YXRpb24pIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5hdXRob3JpemF0aW9uID1cbiAgICAgICAgJ0Jhc2ljICcgKyBCdWZmZXIuZnJvbShvcHRzLmF1dGgpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICByZXEgPSB3ZWJzb2NrZXQuX3JlcSA9IHJlcXVlc3Qob3B0cyk7XG5cbiAgICBpZiAod2Vic29ja2V0Ll9yZWRpcmVjdHMpIHtcbiAgICAgIC8vXG4gICAgICAvLyBVbmxpa2Ugd2hhdCBpcyBkb25lIGZvciB0aGUgYCd1cGdyYWRlJ2AgZXZlbnQsIG5vIGVhcmx5IGV4aXQgaXNcbiAgICAgIC8vIHRyaWdnZXJlZCBoZXJlIGlmIHRoZSB1c2VyIGNhbGxzIGB3ZWJzb2NrZXQuY2xvc2UoKWAgb3JcbiAgICAgIC8vIGB3ZWJzb2NrZXQudGVybWluYXRlKClgIGZyb20gYSBsaXN0ZW5lciBvZiB0aGUgYCdyZWRpcmVjdCdgIGV2ZW50LiBUaGlzXG4gICAgICAvLyBpcyBiZWNhdXNlIHRoZSB1c2VyIGNhbiBhbHNvIGNhbGwgYHJlcXVlc3QuZGVzdHJveSgpYCB3aXRoIGFuIGVycm9yXG4gICAgICAvLyBiZWZvcmUgY2FsbGluZyBgd2Vic29ja2V0LmNsb3NlKClgIG9yIGB3ZWJzb2NrZXQudGVybWluYXRlKClgIGFuZCB0aGlzXG4gICAgICAvLyB3b3VsZCByZXN1bHQgaW4gYW4gZXJyb3IgYmVpbmcgZW1pdHRlZCBvbiB0aGUgYHJlcXVlc3RgIG9iamVjdCB3aXRoIG5vXG4gICAgICAvLyBgJ2Vycm9yJ2AgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkLlxuICAgICAgLy9cbiAgICAgIHdlYnNvY2tldC5lbWl0KCdyZWRpcmVjdCcsIHdlYnNvY2tldC51cmwsIHJlcSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlcSA9IHdlYnNvY2tldC5fcmVxID0gcmVxdWVzdChvcHRzKTtcbiAgfVxuXG4gIGlmIChvcHRzLnRpbWVvdXQpIHtcbiAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHJlcSwgJ09wZW5pbmcgaGFuZHNoYWtlIGhhcyB0aW1lZCBvdXQnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgaWYgKHJlcSA9PT0gbnVsbCB8fCByZXFba0Fib3J0ZWRdKSByZXR1cm47XG5cbiAgICByZXEgPSB3ZWJzb2NrZXQuX3JlcSA9IG51bGw7XG4gICAgZW1pdEVycm9yQW5kQ2xvc2Uod2Vic29ja2V0LCBlcnIpO1xuICB9KTtcblxuICByZXEub24oJ3Jlc3BvbnNlJywgKHJlcykgPT4ge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gcmVzLmhlYWRlcnMubG9jYXRpb247XG4gICAgY29uc3Qgc3RhdHVzQ29kZSA9IHJlcy5zdGF0dXNDb2RlO1xuXG4gICAgaWYgKFxuICAgICAgbG9jYXRpb24gJiZcbiAgICAgIG9wdHMuZm9sbG93UmVkaXJlY3RzICYmXG4gICAgICBzdGF0dXNDb2RlID49IDMwMCAmJlxuICAgICAgc3RhdHVzQ29kZSA8IDQwMFxuICAgICkge1xuICAgICAgaWYgKCsrd2Vic29ja2V0Ll9yZWRpcmVjdHMgPiBvcHRzLm1heFJlZGlyZWN0cykge1xuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHJlcSwgJ01heGltdW0gcmVkaXJlY3RzIGV4Y2VlZGVkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVxLmFib3J0KCk7XG5cbiAgICAgIGxldCBhZGRyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhZGRyID0gbmV3IFVSTChsb2NhdGlvbiwgYWRkcmVzcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBVUkw6ICR7bG9jYXRpb259YCk7XG4gICAgICAgIGVtaXRFcnJvckFuZENsb3NlKHdlYnNvY2tldCwgZXJyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpbml0QXNDbGllbnQod2Vic29ja2V0LCBhZGRyLCBwcm90b2NvbHMsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXdlYnNvY2tldC5lbWl0KCd1bmV4cGVjdGVkLXJlc3BvbnNlJywgcmVxLCByZXMpKSB7XG4gICAgICBhYm9ydEhhbmRzaGFrZShcbiAgICAgICAgd2Vic29ja2V0LFxuICAgICAgICByZXEsXG4gICAgICAgIGBVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZTogJHtyZXMuc3RhdHVzQ29kZX1gXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmVxLm9uKCd1cGdyYWRlJywgKHJlcywgc29ja2V0LCBoZWFkKSA9PiB7XG4gICAgd2Vic29ja2V0LmVtaXQoJ3VwZ3JhZGUnLCByZXMpO1xuXG4gICAgLy9cbiAgICAvLyBUaGUgdXNlciBtYXkgaGF2ZSBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gZnJvbSBhIGxpc3RlbmVyIG9mIHRoZVxuICAgIC8vIGAndXBncmFkZSdgIGV2ZW50LlxuICAgIC8vXG4gICAgaWYgKHdlYnNvY2tldC5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuQ09OTkVDVElORykgcmV0dXJuO1xuXG4gICAgcmVxID0gd2Vic29ja2V0Ll9yZXEgPSBudWxsO1xuXG4gICAgY29uc3QgdXBncmFkZSA9IHJlcy5oZWFkZXJzLnVwZ3JhZGU7XG5cbiAgICBpZiAodXBncmFkZSA9PT0gdW5kZWZpbmVkIHx8IHVwZ3JhZGUudG9Mb3dlckNhc2UoKSAhPT0gJ3dlYnNvY2tldCcpIHtcbiAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCAnSW52YWxpZCBVcGdyYWRlIGhlYWRlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goJ3NoYTEnKVxuICAgICAgLnVwZGF0ZShrZXkgKyBHVUlEKVxuICAgICAgLmRpZ2VzdCgnYmFzZTY0Jyk7XG5cbiAgICBpZiAocmVzLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQtYWNjZXB0J10gIT09IGRpZ2VzdCkge1xuICAgICAgYWJvcnRIYW5kc2hha2Uod2Vic29ja2V0LCBzb2NrZXQsICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtQWNjZXB0IGhlYWRlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZlclByb3QgPSByZXMuaGVhZGVyc1snc2VjLXdlYnNvY2tldC1wcm90b2NvbCddO1xuICAgIGxldCBwcm90RXJyb3I7XG5cbiAgICBpZiAoc2VydmVyUHJvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIXByb3RvY29sU2V0LnNpemUpIHtcbiAgICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IGEgc3VicHJvdG9jb2wgYnV0IG5vbmUgd2FzIHJlcXVlc3RlZCc7XG4gICAgICB9IGVsc2UgaWYgKCFwcm90b2NvbFNldC5oYXMoc2VydmVyUHJvdCkpIHtcbiAgICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IGFuIGludmFsaWQgc3VicHJvdG9jb2wnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvdG9jb2xTZXQuc2l6ZSkge1xuICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IG5vIHN1YnByb3RvY29sJztcbiAgICB9XG5cbiAgICBpZiAocHJvdEVycm9yKSB7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgcHJvdEVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VydmVyUHJvdCkgd2Vic29ja2V0Ll9wcm90b2NvbCA9IHNlcnZlclByb3Q7XG5cbiAgICBjb25zdCBzZWNXZWJTb2NrZXRFeHRlbnNpb25zID0gcmVzLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQtZXh0ZW5zaW9ucyddO1xuXG4gICAgaWYgKHNlY1dlYlNvY2tldEV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFwZXJNZXNzYWdlRGVmbGF0ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgICAnU2VydmVyIHNlbnQgYSBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMgaGVhZGVyIGJ1dCBubyBleHRlbnNpb24gJyArXG4gICAgICAgICAgJ3dhcyByZXF1ZXN0ZWQnO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGV4dGVuc2lvbnM7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGV4dGVuc2lvbnMgPSBwYXJzZShzZWNXZWJTb2NrZXRFeHRlbnNpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIGhlYWRlcic7XG4gICAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCBtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRlbnNpb25OYW1lcyA9IE9iamVjdC5rZXlzKGV4dGVuc2lvbnMpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGV4dGVuc2lvbk5hbWVzLmxlbmd0aCAhPT0gMSB8fFxuICAgICAgICBleHRlbnNpb25OYW1lc1swXSAhPT0gUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnU2VydmVyIGluZGljYXRlZCBhbiBleHRlbnNpb24gdGhhdCB3YXMgbm90IHJlcXVlc3RlZCc7XG4gICAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCBtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBwZXJNZXNzYWdlRGVmbGF0ZS5hY2NlcHQoZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyBoZWFkZXInO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2Vic29ja2V0Ll9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdID1cbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGU7XG4gICAgfVxuXG4gICAgd2Vic29ja2V0LnNldFNvY2tldChzb2NrZXQsIGhlYWQsIHtcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IG9wdHMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cyxcbiAgICAgIGdlbmVyYXRlTWFzazogb3B0cy5nZW5lcmF0ZU1hc2ssXG4gICAgICBtYXhQYXlsb2FkOiBvcHRzLm1heFBheWxvYWQsXG4gICAgICBza2lwVVRGOFZhbGlkYXRpb246IG9wdHMuc2tpcFVURjhWYWxpZGF0aW9uXG4gICAgfSk7XG4gIH0pO1xuXG4gIGlmIChvcHRzLmZpbmlzaFJlcXVlc3QpIHtcbiAgICBvcHRzLmZpbmlzaFJlcXVlc3QocmVxLCB3ZWJzb2NrZXQpO1xuICB9IGVsc2Uge1xuICAgIHJlcS5lbmQoKTtcbiAgfVxufVxuXG4vKipcbiAqIEVtaXQgdGhlIGAnZXJyb3InYCBhbmQgYCdjbG9zZSdgIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7RXJyb3J9IFRoZSBlcnJvciB0byBlbWl0XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBlbWl0RXJyb3JBbmRDbG9zZSh3ZWJzb2NrZXQsIGVycikge1xuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcbiAgLy9cbiAgLy8gVGhlIGZvbGxvd2luZyBhc3NpZ25tZW50IGlzIHByYWN0aWNhbGx5IHVzZWxlc3MgYW5kIGlzIGRvbmUgb25seSBmb3JcbiAgLy8gY29uc2lzdGVuY3kuXG4gIC8vXG4gIHdlYnNvY2tldC5fZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgd2Vic29ja2V0LmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgd2Vic29ja2V0LmVtaXRDbG9zZSgpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGBuZXQuU29ja2V0YCBhbmQgaW5pdGlhdGUgYSBjb25uZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIENvbm5lY3Rpb24gb3B0aW9uc1xuICogQHJldHVybiB7bmV0LlNvY2tldH0gVGhlIG5ld2x5IGNyZWF0ZWQgc29ja2V0IHVzZWQgdG8gc3RhcnQgdGhlIGNvbm5lY3Rpb25cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG5ldENvbm5lY3Qob3B0aW9ucykge1xuICBvcHRpb25zLnBhdGggPSBvcHRpb25zLnNvY2tldFBhdGg7XG4gIHJldHVybiBuZXQuY29ubmVjdChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgdGxzLlRMU1NvY2tldGAgYW5kIGluaXRpYXRlIGEgY29ubmVjdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBDb25uZWN0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm4ge3Rscy5UTFNTb2NrZXR9IFRoZSBuZXdseSBjcmVhdGVkIHNvY2tldCB1c2VkIHRvIHN0YXJ0IHRoZSBjb25uZWN0aW9uXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0bHNDb25uZWN0KG9wdGlvbnMpIHtcbiAgb3B0aW9ucy5wYXRoID0gdW5kZWZpbmVkO1xuXG4gIGlmICghb3B0aW9ucy5zZXJ2ZXJuYW1lICYmIG9wdGlvbnMuc2VydmVybmFtZSAhPT0gJycpIHtcbiAgICBvcHRpb25zLnNlcnZlcm5hbWUgPSBuZXQuaXNJUChvcHRpb25zLmhvc3QpID8gJycgOiBvcHRpb25zLmhvc3Q7XG4gIH1cblxuICByZXR1cm4gdGxzLmNvbm5lY3Qob3B0aW9ucyk7XG59XG5cbi8qKlxuICogQWJvcnQgdGhlIGhhbmRzaGFrZSBhbmQgZW1pdCBhbiBlcnJvci5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7KGh0dHAuQ2xpZW50UmVxdWVzdHxuZXQuU29ja2V0fHRscy5Tb2NrZXQpfSBzdHJlYW0gVGhlIHJlcXVlc3QgdG9cbiAqICAgICBhYm9ydCBvciB0aGUgc29ja2V0IHRvIGRlc3Ryb3lcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHN0cmVhbSwgbWVzc2FnZSkge1xuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcblxuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgYWJvcnRIYW5kc2hha2UpO1xuXG4gIGlmIChzdHJlYW0uc2V0SGVhZGVyKSB7XG4gICAgc3RyZWFtW2tBYm9ydGVkXSA9IHRydWU7XG4gICAgc3RyZWFtLmFib3J0KCk7XG5cbiAgICBpZiAoc3RyZWFtLnNvY2tldCAmJiAhc3RyZWFtLnNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIC8vXG4gICAgICAvLyBPbiBOb2RlLmpzID49IDE0LjMuMCBgcmVxdWVzdC5hYm9ydCgpYCBkb2VzIG5vdCBkZXN0cm95IHRoZSBzb2NrZXQgaWZcbiAgICAgIC8vIGNhbGxlZCBhZnRlciB0aGUgcmVxdWVzdCBjb21wbGV0ZWQuIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvaXNzdWVzLzE4NjkuXG4gICAgICAvL1xuICAgICAgc3RyZWFtLnNvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JBbmRDbG9zZSwgd2Vic29ja2V0LCBlcnIpO1xuICB9IGVsc2Uge1xuICAgIHN0cmVhbS5kZXN0cm95KGVycik7XG4gICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgd2Vic29ja2V0LmVtaXQuYmluZCh3ZWJzb2NrZXQsICdlcnJvcicpKTtcbiAgICBzdHJlYW0ub25jZSgnY2xvc2UnLCB3ZWJzb2NrZXQuZW1pdENsb3NlLmJpbmQod2Vic29ja2V0KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgY2FzZXMgd2hlcmUgdGhlIGBwaW5nKClgLCBgcG9uZygpYCwgb3IgYHNlbmQoKWAgbWV0aG9kcyBhcmUgY2FsbGVkXG4gKiB3aGVuIHRoZSBgcmVhZHlTdGF0ZWAgYXR0cmlidXRlIGlzIGBDTE9TSU5HYCBvciBgQ0xPU0VEYC5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Kn0gW2RhdGFdIFRoZSBkYXRhIHRvIHNlbmRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNlbmRBZnRlckNsb3NlKHdlYnNvY2tldCwgZGF0YSwgY2IpIHtcbiAgaWYgKGRhdGEpIHtcbiAgICBjb25zdCBsZW5ndGggPSBpc0Jsb2IoZGF0YSkgPyBkYXRhLnNpemUgOiB0b0J1ZmZlcihkYXRhKS5sZW5ndGg7XG5cbiAgICAvL1xuICAgIC8vIFRoZSBgX2J1ZmZlcmVkQW1vdW50YCBwcm9wZXJ0eSBpcyB1c2VkIG9ubHkgd2hlbiB0aGUgcGVlciBpcyBhIGNsaWVudCBhbmRcbiAgICAvLyB0aGUgb3BlbmluZyBoYW5kc2hha2UgZmFpbHMuIFVuZGVyIHRoZXNlIGNpcmN1bXN0YW5jZXMsIGluIGZhY3QsIHRoZVxuICAgIC8vIGBzZXRTb2NrZXQoKWAgbWV0aG9kIGlzIG5vdCBjYWxsZWQsIHNvIHRoZSBgX3NvY2tldGAgYW5kIGBfc2VuZGVyYFxuICAgIC8vIHByb3BlcnRpZXMgYXJlIHNldCB0byBgbnVsbGAuXG4gICAgLy9cbiAgICBpZiAod2Vic29ja2V0Ll9zb2NrZXQpIHdlYnNvY2tldC5fc2VuZGVyLl9idWZmZXJlZEJ5dGVzICs9IGxlbmd0aDtcbiAgICBlbHNlIHdlYnNvY2tldC5fYnVmZmVyZWRBbW91bnQgKz0gbGVuZ3RoO1xuICB9XG5cbiAgaWYgKGNiKSB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgYFdlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAke3dlYnNvY2tldC5yZWFkeVN0YXRlfSBgICtcbiAgICAgICAgYCgke3JlYWR5U3RhdGVzW3dlYnNvY2tldC5yZWFkeVN0YXRlXX0pYFxuICAgICk7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXJyKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYFJlY2VpdmVyYCBgJ2NvbmNsdWRlJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGUgVGhlIHN0YXR1cyBjb2RlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gcmVhc29uIFRoZSByZWFzb24gZm9yIGNsb3NpbmdcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25Db25jbHVkZShjb2RlLCByZWFzb24pIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICB3ZWJzb2NrZXQuX2Nsb3NlRnJhbWVSZWNlaXZlZCA9IHRydWU7XG4gIHdlYnNvY2tldC5fY2xvc2VNZXNzYWdlID0gcmVhc29uO1xuICB3ZWJzb2NrZXQuX2Nsb3NlQ29kZSA9IGNvZGU7XG5cbiAgaWYgKHdlYnNvY2tldC5fc29ja2V0W2tXZWJTb2NrZXRdID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICB3ZWJzb2NrZXQuX3NvY2tldC5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHNvY2tldE9uRGF0YSk7XG4gIHByb2Nlc3MubmV4dFRpY2socmVzdW1lLCB3ZWJzb2NrZXQuX3NvY2tldCk7XG5cbiAgaWYgKGNvZGUgPT09IDEwMDUpIHdlYnNvY2tldC5jbG9zZSgpO1xuICBlbHNlIHdlYnNvY2tldC5jbG9zZShjb2RlLCByZWFzb24pO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYFJlY2VpdmVyYCBgJ2RyYWluJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZXJPbkRyYWluKCkge1xuICBjb25zdCB3ZWJzb2NrZXQgPSB0aGlzW2tXZWJTb2NrZXRdO1xuXG4gIGlmICghd2Vic29ja2V0LmlzUGF1c2VkKSB3ZWJzb2NrZXQuX3NvY2tldC5yZXN1bWUoKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFJhbmdlRXJyb3J8RXJyb3IpfSBlcnIgVGhlIGVtaXR0ZWQgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25FcnJvcihlcnIpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICBpZiAod2Vic29ja2V0Ll9zb2NrZXRba1dlYlNvY2tldF0gIT09IHVuZGVmaW5lZCkge1xuICAgIHdlYnNvY2tldC5fc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgc29ja2V0T25EYXRhKTtcblxuICAgIC8vXG4gICAgLy8gT24gTm9kZS5qcyA8IDE0LjAuMCB0aGUgYCdlcnJvcidgIGV2ZW50IGlzIGVtaXR0ZWQgc3luY2hyb25vdXNseS4gU2VlXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvaXNzdWVzLzE5NDAuXG4gICAgLy9cbiAgICBwcm9jZXNzLm5leHRUaWNrKHJlc3VtZSwgd2Vic29ja2V0Ll9zb2NrZXQpO1xuXG4gICAgd2Vic29ja2V0LmNsb3NlKGVycltrU3RhdHVzQ29kZV0pO1xuICB9XG5cbiAgaWYgKCF3ZWJzb2NrZXQuX2Vycm9yRW1pdHRlZCkge1xuICAgIHdlYnNvY2tldC5fZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICB3ZWJzb2NrZXQuZW1pdCgnZXJyb3InLCBlcnIpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgUmVjZWl2ZXJgIGAnZmluaXNoJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZXJPbkZpbmlzaCgpIHtcbiAgdGhpc1trV2ViU29ja2V0XS5lbWl0Q2xvc2UoKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdtZXNzYWdlJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ8QXJyYXlCdWZmZXJ8QnVmZmVyW10pfSBkYXRhIFRoZSBtZXNzYWdlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzQmluYXJ5IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGJpbmFyeSBvciBub3RcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25NZXNzYWdlKGRhdGEsIGlzQmluYXJ5KSB7XG4gIHRoaXNba1dlYlNvY2tldF0uZW1pdCgnbWVzc2FnZScsIGRhdGEsIGlzQmluYXJ5KTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdwaW5nJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgVGhlIGRhdGEgaW5jbHVkZWQgaW4gdGhlIHBpbmcgZnJhbWVcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25QaW5nKGRhdGEpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICBpZiAod2Vic29ja2V0Ll9hdXRvUG9uZykgd2Vic29ja2V0LnBvbmcoZGF0YSwgIXRoaXMuX2lzU2VydmVyLCBOT09QKTtcbiAgd2Vic29ja2V0LmVtaXQoJ3BpbmcnLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdwb25nJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgVGhlIGRhdGEgaW5jbHVkZWQgaW4gdGhlIHBvbmcgZnJhbWVcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25Qb25nKGRhdGEpIHtcbiAgdGhpc1trV2ViU29ja2V0XS5lbWl0KCdwb25nJywgZGF0YSk7XG59XG5cbi8qKlxuICogUmVzdW1lIGEgcmVhZGFibGUgc3RyZWFtXG4gKlxuICogQHBhcmFtIHtSZWFkYWJsZX0gc3RyZWFtIFRoZSByZWFkYWJsZSBzdHJlYW1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0pIHtcbiAgc3RyZWFtLnJlc3VtZSgpO1xufVxuXG4vKipcbiAqIFRoZSBgU2VuZGVyYCBlcnJvciBldmVudCBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IFRoZSBlcnJvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2VuZGVyT25FcnJvcihlcnIpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICBpZiAod2Vic29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRUQpIHJldHVybjtcbiAgaWYgKHdlYnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgIHdlYnNvY2tldC5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgIHNldENsb3NlVGltZXIod2Vic29ja2V0KTtcbiAgfVxuXG4gIC8vXG4gIC8vIGBzb2NrZXQuZW5kKClgIGlzIHVzZWQgaW5zdGVhZCBvZiBgc29ja2V0LmRlc3Ryb3koKWAgdG8gYWxsb3cgdGhlIG90aGVyXG4gIC8vIHBlZXIgdG8gZmluaXNoIHNlbmRpbmcgcXVldWVkIGRhdGEuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IGEgdGltZXIgaGVyZVxuICAvLyBiZWNhdXNlIGBDTE9TSU5HYCBtZWFucyB0aGF0IGl0IGlzIGFscmVhZHkgc2V0IG9yIG5vdCBuZWVkZWQuXG4gIC8vXG4gIHRoaXMuX3NvY2tldC5lbmQoKTtcblxuICBpZiAoIXdlYnNvY2tldC5fZXJyb3JFbWl0dGVkKSB7XG4gICAgd2Vic29ja2V0Ll9lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHdlYnNvY2tldC5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYSB0aW1lciB0byBkZXN0cm95IHRoZSB1bmRlcmx5aW5nIHJhdyBzb2NrZXQgb2YgYSBXZWJTb2NrZXQuXG4gKlxuICogQHBhcmFtIHtXZWJTb2NrZXR9IHdlYnNvY2tldCBUaGUgV2ViU29ja2V0IGluc3RhbmNlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXRDbG9zZVRpbWVyKHdlYnNvY2tldCkge1xuICB3ZWJzb2NrZXQuX2Nsb3NlVGltZXIgPSBzZXRUaW1lb3V0KFxuICAgIHdlYnNvY2tldC5fc29ja2V0LmRlc3Ryb3kuYmluZCh3ZWJzb2NrZXQuX3NvY2tldCksXG4gICAgY2xvc2VUaW1lb3V0XG4gICk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBzb2NrZXQgYCdjbG9zZSdgIGV2ZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNvY2tldE9uQ2xvc2UoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XG5cbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBzb2NrZXRPbkNsb3NlKTtcbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHNvY2tldE9uRGF0YSk7XG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHNvY2tldE9uRW5kKTtcblxuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcblxuICBsZXQgY2h1bms7XG5cbiAgLy9cbiAgLy8gVGhlIGNsb3NlIGZyYW1lIG1pZ2h0IG5vdCBoYXZlIGJlZW4gcmVjZWl2ZWQgb3IgdGhlIGAnZW5kJ2AgZXZlbnQgZW1pdHRlZCxcbiAgLy8gZm9yIGV4YW1wbGUsIGlmIHRoZSBzb2NrZXQgd2FzIGRlc3Ryb3llZCBkdWUgdG8gYW4gZXJyb3IuIEVuc3VyZSB0aGF0IHRoZVxuICAvLyBgcmVjZWl2ZXJgIHN0cmVhbSBpcyBjbG9zZWQgYWZ0ZXIgd3JpdGluZyBhbnkgcmVtYWluaW5nIGJ1ZmZlcmVkIGRhdGEgdG9cbiAgLy8gaXQuIElmIHRoZSByZWFkYWJsZSBzaWRlIG9mIHRoZSBzb2NrZXQgaXMgaW4gZmxvd2luZyBtb2RlIHRoZW4gdGhlcmUgaXMgbm9cbiAgLy8gYnVmZmVyZWQgZGF0YSBhcyBldmVyeXRoaW5nIGhhcyBiZWVuIGFscmVhZHkgd3JpdHRlbiBhbmQgYHJlYWRhYmxlLnJlYWQoKWBcbiAgLy8gd2lsbCByZXR1cm4gYG51bGxgLiBJZiBpbnN0ZWFkLCB0aGUgc29ja2V0IGlzIHBhdXNlZCwgYW55IHBvc3NpYmxlIGJ1ZmZlcmVkXG4gIC8vIGRhdGEgd2lsbCBiZSByZWFkIGFzIGEgc2luZ2xlIGNodW5rLlxuICAvL1xuICBpZiAoXG4gICAgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCAmJlxuICAgICF3ZWJzb2NrZXQuX2Nsb3NlRnJhbWVSZWNlaXZlZCAmJlxuICAgICF3ZWJzb2NrZXQuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCAmJlxuICAgIChjaHVuayA9IHdlYnNvY2tldC5fc29ja2V0LnJlYWQoKSkgIT09IG51bGxcbiAgKSB7XG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci53cml0ZShjaHVuayk7XG4gIH1cblxuICB3ZWJzb2NrZXQuX3JlY2VpdmVyLmVuZCgpO1xuXG4gIHRoaXNba1dlYlNvY2tldF0gPSB1bmRlZmluZWQ7XG5cbiAgY2xlYXJUaW1lb3V0KHdlYnNvY2tldC5fY2xvc2VUaW1lcik7XG5cbiAgaWYgKFxuICAgIHdlYnNvY2tldC5fcmVjZWl2ZXIuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgfHxcbiAgICB3ZWJzb2NrZXQuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZFxuICApIHtcbiAgICB3ZWJzb2NrZXQuZW1pdENsb3NlKCk7XG4gIH0gZWxzZSB7XG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci5vbignZXJyb3InLCByZWNlaXZlck9uRmluaXNoKTtcbiAgICB3ZWJzb2NrZXQuX3JlY2VpdmVyLm9uKCdmaW5pc2gnLCByZWNlaXZlck9uRmluaXNoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgc29ja2V0IGAnZGF0YSdgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBjaHVuayBBIGNodW5rIG9mIGRhdGFcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNvY2tldE9uRGF0YShjaHVuaykge1xuICBpZiAoIXRoaXNba1dlYlNvY2tldF0uX3JlY2VpdmVyLndyaXRlKGNodW5rKSkge1xuICAgIHRoaXMucGF1c2UoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgc29ja2V0IGAnZW5kJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc29ja2V0T25FbmQoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XG5cbiAgd2Vic29ja2V0Ll9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NJTkc7XG4gIHdlYnNvY2tldC5fcmVjZWl2ZXIuZW5kKCk7XG4gIHRoaXMuZW5kKCk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBzb2NrZXQgYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNvY2tldE9uRXJyb3IoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XG5cbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBzb2NrZXRPbkVycm9yKTtcbiAgdGhpcy5vbignZXJyb3InLCBOT09QKTtcblxuICBpZiAod2Vic29ja2V0KSB7XG4gICAgd2Vic29ja2V0Ll9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NJTkc7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0J1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoWWFsbGlzdCkge1xuICBZYWxsaXN0LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24qICgpIHtcbiAgICBmb3IgKGxldCB3YWxrZXIgPSB0aGlzLmhlYWQ7IHdhbGtlcjsgd2Fsa2VyID0gd2Fsa2VyLm5leHQpIHtcbiAgICAgIHlpZWxkIHdhbGtlci52YWx1ZVxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5tb2R1bGUuZXhwb3J0cyA9IFlhbGxpc3RcblxuWWFsbGlzdC5Ob2RlID0gTm9kZVxuWWFsbGlzdC5jcmVhdGUgPSBZYWxsaXN0XG5cbmZ1bmN0aW9uIFlhbGxpc3QgKGxpc3QpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmICghKHNlbGYgaW5zdGFuY2VvZiBZYWxsaXN0KSkge1xuICAgIHNlbGYgPSBuZXcgWWFsbGlzdCgpXG4gIH1cblxuICBzZWxmLnRhaWwgPSBudWxsXG4gIHNlbGYuaGVhZCA9IG51bGxcbiAgc2VsZi5sZW5ndGggPSAwXG5cbiAgaWYgKGxpc3QgJiYgdHlwZW9mIGxpc3QuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgc2VsZi5wdXNoKGl0ZW0pXG4gICAgfSlcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgc2VsZi5wdXNoKGFyZ3VtZW50c1tpXSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VsZlxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5yZW1vdmVOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgaWYgKG5vZGUubGlzdCAhPT0gdGhpcykge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVtb3Zpbmcgbm9kZSB3aGljaCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBsaXN0JylcbiAgfVxuXG4gIHZhciBuZXh0ID0gbm9kZS5uZXh0XG4gIHZhciBwcmV2ID0gbm9kZS5wcmV2XG5cbiAgaWYgKG5leHQpIHtcbiAgICBuZXh0LnByZXYgPSBwcmV2XG4gIH1cblxuICBpZiAocHJldikge1xuICAgIHByZXYubmV4dCA9IG5leHRcbiAgfVxuXG4gIGlmIChub2RlID09PSB0aGlzLmhlYWQpIHtcbiAgICB0aGlzLmhlYWQgPSBuZXh0XG4gIH1cbiAgaWYgKG5vZGUgPT09IHRoaXMudGFpbCkge1xuICAgIHRoaXMudGFpbCA9IHByZXZcbiAgfVxuXG4gIG5vZGUubGlzdC5sZW5ndGgtLVxuICBub2RlLm5leHQgPSBudWxsXG4gIG5vZGUucHJldiA9IG51bGxcbiAgbm9kZS5saXN0ID0gbnVsbFxuXG4gIHJldHVybiBuZXh0XG59XG5cbllhbGxpc3QucHJvdG90eXBlLnVuc2hpZnROb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IHRoaXMuaGVhZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKG5vZGUubGlzdCkge1xuICAgIG5vZGUubGlzdC5yZW1vdmVOb2RlKG5vZGUpXG4gIH1cblxuICB2YXIgaGVhZCA9IHRoaXMuaGVhZFxuICBub2RlLmxpc3QgPSB0aGlzXG4gIG5vZGUubmV4dCA9IGhlYWRcbiAgaWYgKGhlYWQpIHtcbiAgICBoZWFkLnByZXYgPSBub2RlXG4gIH1cblxuICB0aGlzLmhlYWQgPSBub2RlXG4gIGlmICghdGhpcy50YWlsKSB7XG4gICAgdGhpcy50YWlsID0gbm9kZVxuICB9XG4gIHRoaXMubGVuZ3RoKytcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucHVzaE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICBpZiAobm9kZSA9PT0gdGhpcy50YWlsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAobm9kZS5saXN0KSB7XG4gICAgbm9kZS5saXN0LnJlbW92ZU5vZGUobm9kZSlcbiAgfVxuXG4gIHZhciB0YWlsID0gdGhpcy50YWlsXG4gIG5vZGUubGlzdCA9IHRoaXNcbiAgbm9kZS5wcmV2ID0gdGFpbFxuICBpZiAodGFpbCkge1xuICAgIHRhaWwubmV4dCA9IG5vZGVcbiAgfVxuXG4gIHRoaXMudGFpbCA9IG5vZGVcbiAgaWYgKCF0aGlzLmhlYWQpIHtcbiAgICB0aGlzLmhlYWQgPSBub2RlXG4gIH1cbiAgdGhpcy5sZW5ndGgrK1xufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBwdXNoKHRoaXMsIGFyZ3VtZW50c1tpXSlcbiAgfVxuICByZXR1cm4gdGhpcy5sZW5ndGhcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdW5zaGlmdCh0aGlzLCBhcmd1bWVudHNbaV0pXG4gIH1cbiAgcmV0dXJuIHRoaXMubGVuZ3RoXG59XG5cbllhbGxpc3QucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLnRhaWwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICB2YXIgcmVzID0gdGhpcy50YWlsLnZhbHVlXG4gIHRoaXMudGFpbCA9IHRoaXMudGFpbC5wcmV2XG4gIGlmICh0aGlzLnRhaWwpIHtcbiAgICB0aGlzLnRhaWwubmV4dCA9IG51bGxcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmhlYWQgPSBudWxsXG4gIH1cbiAgdGhpcy5sZW5ndGgtLVxuICByZXR1cm4gcmVzXG59XG5cbllhbGxpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuaGVhZCkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHZhciByZXMgPSB0aGlzLmhlYWQudmFsdWVcbiAgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHRcbiAgaWYgKHRoaXMuaGVhZCkge1xuICAgIHRoaXMuaGVhZC5wcmV2ID0gbnVsbFxuICB9IGVsc2Uge1xuICAgIHRoaXMudGFpbCA9IG51bGxcbiAgfVxuICB0aGlzLmxlbmd0aC0tXG4gIHJldHVybiByZXNcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChmbiwgdGhpc3ApIHtcbiAgdGhpc3AgPSB0aGlzcCB8fCB0aGlzXG4gIGZvciAodmFyIHdhbGtlciA9IHRoaXMuaGVhZCwgaSA9IDA7IHdhbGtlciAhPT0gbnVsbDsgaSsrKSB7XG4gICAgZm4uY2FsbCh0aGlzcCwgd2Fsa2VyLnZhbHVlLCBpLCB0aGlzKVxuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cbn1cblxuWWFsbGlzdC5wcm90b3R5cGUuZm9yRWFjaFJldmVyc2UgPSBmdW5jdGlvbiAoZm4sIHRoaXNwKSB7XG4gIHRoaXNwID0gdGhpc3AgfHwgdGhpc1xuICBmb3IgKHZhciB3YWxrZXIgPSB0aGlzLnRhaWwsIGkgPSB0aGlzLmxlbmd0aCAtIDE7IHdhbGtlciAhPT0gbnVsbDsgaS0tKSB7XG4gICAgZm4uY2FsbCh0aGlzcCwgd2Fsa2VyLnZhbHVlLCBpLCB0aGlzKVxuICAgIHdhbGtlciA9IHdhbGtlci5wcmV2XG4gIH1cbn1cblxuWWFsbGlzdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG4pIHtcbiAgZm9yICh2YXIgaSA9IDAsIHdhbGtlciA9IHRoaXMuaGVhZDsgd2Fsa2VyICE9PSBudWxsICYmIGkgPCBuOyBpKyspIHtcbiAgICAvLyBhYm9ydCBvdXQgb2YgdGhlIGxpc3QgZWFybHkgaWYgd2UgaGl0IGEgY3ljbGVcbiAgICB3YWxrZXIgPSB3YWxrZXIubmV4dFxuICB9XG4gIGlmIChpID09PSBuICYmIHdhbGtlciAhPT0gbnVsbCkge1xuICAgIHJldHVybiB3YWxrZXIudmFsdWVcbiAgfVxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5nZXRSZXZlcnNlID0gZnVuY3Rpb24gKG4pIHtcbiAgZm9yICh2YXIgaSA9IDAsIHdhbGtlciA9IHRoaXMudGFpbDsgd2Fsa2VyICE9PSBudWxsICYmIGkgPCBuOyBpKyspIHtcbiAgICAvLyBhYm9ydCBvdXQgb2YgdGhlIGxpc3QgZWFybHkgaWYgd2UgaGl0IGEgY3ljbGVcbiAgICB3YWxrZXIgPSB3YWxrZXIucHJldlxuICB9XG4gIGlmIChpID09PSBuICYmIHdhbGtlciAhPT0gbnVsbCkge1xuICAgIHJldHVybiB3YWxrZXIudmFsdWVcbiAgfVxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAoZm4sIHRoaXNwKSB7XG4gIHRoaXNwID0gdGhpc3AgfHwgdGhpc1xuICB2YXIgcmVzID0gbmV3IFlhbGxpc3QoKVxuICBmb3IgKHZhciB3YWxrZXIgPSB0aGlzLmhlYWQ7IHdhbGtlciAhPT0gbnVsbDspIHtcbiAgICByZXMucHVzaChmbi5jYWxsKHRoaXNwLCB3YWxrZXIudmFsdWUsIHRoaXMpKVxuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5tYXBSZXZlcnNlID0gZnVuY3Rpb24gKGZuLCB0aGlzcCkge1xuICB0aGlzcCA9IHRoaXNwIHx8IHRoaXNcbiAgdmFyIHJlcyA9IG5ldyBZYWxsaXN0KClcbiAgZm9yICh2YXIgd2Fsa2VyID0gdGhpcy50YWlsOyB3YWxrZXIgIT09IG51bGw7KSB7XG4gICAgcmVzLnB1c2goZm4uY2FsbCh0aGlzcCwgd2Fsa2VyLnZhbHVlLCB0aGlzKSlcbiAgICB3YWxrZXIgPSB3YWxrZXIucHJldlxuICB9XG4gIHJldHVybiByZXNcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucmVkdWNlID0gZnVuY3Rpb24gKGZuLCBpbml0aWFsKSB7XG4gIHZhciBhY2NcbiAgdmFyIHdhbGtlciA9IHRoaXMuaGVhZFxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICBhY2MgPSBpbml0aWFsXG4gIH0gZWxzZSBpZiAodGhpcy5oZWFkKSB7XG4gICAgd2Fsa2VyID0gdGhpcy5oZWFkLm5leHRcbiAgICBhY2MgPSB0aGlzLmhlYWQudmFsdWVcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgbGlzdCB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IHdhbGtlciAhPT0gbnVsbDsgaSsrKSB7XG4gICAgYWNjID0gZm4oYWNjLCB3YWxrZXIudmFsdWUsIGkpXG4gICAgd2Fsa2VyID0gd2Fsa2VyLm5leHRcbiAgfVxuXG4gIHJldHVybiBhY2Ncbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucmVkdWNlUmV2ZXJzZSA9IGZ1bmN0aW9uIChmbiwgaW5pdGlhbCkge1xuICB2YXIgYWNjXG4gIHZhciB3YWxrZXIgPSB0aGlzLnRhaWxcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgYWNjID0gaW5pdGlhbFxuICB9IGVsc2UgaWYgKHRoaXMudGFpbCkge1xuICAgIHdhbGtlciA9IHRoaXMudGFpbC5wcmV2XG4gICAgYWNjID0gdGhpcy50YWlsLnZhbHVlXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVkdWNlIG9mIGVtcHR5IGxpc3Qgd2l0aCBubyBpbml0aWFsIHZhbHVlJylcbiAgfVxuXG4gIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IHdhbGtlciAhPT0gbnVsbDsgaS0tKSB7XG4gICAgYWNjID0gZm4oYWNjLCB3YWxrZXIudmFsdWUsIGkpXG4gICAgd2Fsa2VyID0gd2Fsa2VyLnByZXZcbiAgfVxuXG4gIHJldHVybiBhY2Ncbn1cblxuWWFsbGlzdC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFyciA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDAsIHdhbGtlciA9IHRoaXMuaGVhZDsgd2Fsa2VyICE9PSBudWxsOyBpKyspIHtcbiAgICBhcnJbaV0gPSB3YWxrZXIudmFsdWVcbiAgICB3YWxrZXIgPSB3YWxrZXIubmV4dFxuICB9XG4gIHJldHVybiBhcnJcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUudG9BcnJheVJldmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhcnIgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwLCB3YWxrZXIgPSB0aGlzLnRhaWw7IHdhbGtlciAhPT0gbnVsbDsgaSsrKSB7XG4gICAgYXJyW2ldID0gd2Fsa2VyLnZhbHVlXG4gICAgd2Fsa2VyID0gd2Fsa2VyLnByZXZcbiAgfVxuICByZXR1cm4gYXJyXG59XG5cbllhbGxpc3QucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gIHRvID0gdG8gfHwgdGhpcy5sZW5ndGhcbiAgaWYgKHRvIDwgMCkge1xuICAgIHRvICs9IHRoaXMubGVuZ3RoXG4gIH1cbiAgZnJvbSA9IGZyb20gfHwgMFxuICBpZiAoZnJvbSA8IDApIHtcbiAgICBmcm9tICs9IHRoaXMubGVuZ3RoXG4gIH1cbiAgdmFyIHJldCA9IG5ldyBZYWxsaXN0KClcbiAgaWYgKHRvIDwgZnJvbSB8fCB0byA8IDApIHtcbiAgICByZXR1cm4gcmV0XG4gIH1cbiAgaWYgKGZyb20gPCAwKSB7XG4gICAgZnJvbSA9IDBcbiAgfVxuICBpZiAodG8gPiB0aGlzLmxlbmd0aCkge1xuICAgIHRvID0gdGhpcy5sZW5ndGhcbiAgfVxuICBmb3IgKHZhciBpID0gMCwgd2Fsa2VyID0gdGhpcy5oZWFkOyB3YWxrZXIgIT09IG51bGwgJiYgaSA8IGZyb207IGkrKykge1xuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cbiAgZm9yICg7IHdhbGtlciAhPT0gbnVsbCAmJiBpIDwgdG87IGkrKywgd2Fsa2VyID0gd2Fsa2VyLm5leHQpIHtcbiAgICByZXQucHVzaCh3YWxrZXIudmFsdWUpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5zbGljZVJldmVyc2UgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgdG8gPSB0byB8fCB0aGlzLmxlbmd0aFxuICBpZiAodG8gPCAwKSB7XG4gICAgdG8gKz0gdGhpcy5sZW5ndGhcbiAgfVxuICBmcm9tID0gZnJvbSB8fCAwXG4gIGlmIChmcm9tIDwgMCkge1xuICAgIGZyb20gKz0gdGhpcy5sZW5ndGhcbiAgfVxuICB2YXIgcmV0ID0gbmV3IFlhbGxpc3QoKVxuICBpZiAodG8gPCBmcm9tIHx8IHRvIDwgMCkge1xuICAgIHJldHVybiByZXRcbiAgfVxuICBpZiAoZnJvbSA8IDApIHtcbiAgICBmcm9tID0gMFxuICB9XG4gIGlmICh0byA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdG8gPSB0aGlzLmxlbmd0aFxuICB9XG4gIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCwgd2Fsa2VyID0gdGhpcy50YWlsOyB3YWxrZXIgIT09IG51bGwgJiYgaSA+IHRvOyBpLS0pIHtcbiAgICB3YWxrZXIgPSB3YWxrZXIucHJldlxuICB9XG4gIGZvciAoOyB3YWxrZXIgIT09IG51bGwgJiYgaSA+IGZyb207IGktLSwgd2Fsa2VyID0gd2Fsa2VyLnByZXYpIHtcbiAgICByZXQucHVzaCh3YWxrZXIudmFsdWUpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5zcGxpY2UgPSBmdW5jdGlvbiAoc3RhcnQsIGRlbGV0ZUNvdW50LCAuLi5ub2Rlcykge1xuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggKyBzdGFydDtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCB3YWxrZXIgPSB0aGlzLmhlYWQ7IHdhbGtlciAhPT0gbnVsbCAmJiBpIDwgc3RhcnQ7IGkrKykge1xuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cblxuICB2YXIgcmV0ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IHdhbGtlciAmJiBpIDwgZGVsZXRlQ291bnQ7IGkrKykge1xuICAgIHJldC5wdXNoKHdhbGtlci52YWx1ZSlcbiAgICB3YWxrZXIgPSB0aGlzLnJlbW92ZU5vZGUod2Fsa2VyKVxuICB9XG4gIGlmICh3YWxrZXIgPT09IG51bGwpIHtcbiAgICB3YWxrZXIgPSB0aGlzLnRhaWxcbiAgfVxuXG4gIGlmICh3YWxrZXIgIT09IHRoaXMuaGVhZCAmJiB3YWxrZXIgIT09IHRoaXMudGFpbCkge1xuICAgIHdhbGtlciA9IHdhbGtlci5wcmV2XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgd2Fsa2VyID0gaW5zZXJ0KHRoaXMsIHdhbGtlciwgbm9kZXNbaV0pXG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucmV2ZXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhlYWQgPSB0aGlzLmhlYWRcbiAgdmFyIHRhaWwgPSB0aGlzLnRhaWxcbiAgZm9yICh2YXIgd2Fsa2VyID0gaGVhZDsgd2Fsa2VyICE9PSBudWxsOyB3YWxrZXIgPSB3YWxrZXIucHJldikge1xuICAgIHZhciBwID0gd2Fsa2VyLnByZXZcbiAgICB3YWxrZXIucHJldiA9IHdhbGtlci5uZXh0XG4gICAgd2Fsa2VyLm5leHQgPSBwXG4gIH1cbiAgdGhpcy5oZWFkID0gdGFpbFxuICB0aGlzLnRhaWwgPSBoZWFkXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIGluc2VydCAoc2VsZiwgbm9kZSwgdmFsdWUpIHtcbiAgdmFyIGluc2VydGVkID0gbm9kZSA9PT0gc2VsZi5oZWFkID9cbiAgICBuZXcgTm9kZSh2YWx1ZSwgbnVsbCwgbm9kZSwgc2VsZikgOlxuICAgIG5ldyBOb2RlKHZhbHVlLCBub2RlLCBub2RlLm5leHQsIHNlbGYpXG5cbiAgaWYgKGluc2VydGVkLm5leHQgPT09IG51bGwpIHtcbiAgICBzZWxmLnRhaWwgPSBpbnNlcnRlZFxuICB9XG4gIGlmIChpbnNlcnRlZC5wcmV2ID09PSBudWxsKSB7XG4gICAgc2VsZi5oZWFkID0gaW5zZXJ0ZWRcbiAgfVxuXG4gIHNlbGYubGVuZ3RoKytcblxuICByZXR1cm4gaW5zZXJ0ZWRcbn1cblxuZnVuY3Rpb24gcHVzaCAoc2VsZiwgaXRlbSkge1xuICBzZWxmLnRhaWwgPSBuZXcgTm9kZShpdGVtLCBzZWxmLnRhaWwsIG51bGwsIHNlbGYpXG4gIGlmICghc2VsZi5oZWFkKSB7XG4gICAgc2VsZi5oZWFkID0gc2VsZi50YWlsXG4gIH1cbiAgc2VsZi5sZW5ndGgrK1xufVxuXG5mdW5jdGlvbiB1bnNoaWZ0IChzZWxmLCBpdGVtKSB7XG4gIHNlbGYuaGVhZCA9IG5ldyBOb2RlKGl0ZW0sIG51bGwsIHNlbGYuaGVhZCwgc2VsZilcbiAgaWYgKCFzZWxmLnRhaWwpIHtcbiAgICBzZWxmLnRhaWwgPSBzZWxmLmhlYWRcbiAgfVxuICBzZWxmLmxlbmd0aCsrXG59XG5cbmZ1bmN0aW9uIE5vZGUgKHZhbHVlLCBwcmV2LCBuZXh0LCBsaXN0KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBOb2RlKSkge1xuICAgIHJldHVybiBuZXcgTm9kZSh2YWx1ZSwgcHJldiwgbmV4dCwgbGlzdClcbiAgfVxuXG4gIHRoaXMubGlzdCA9IGxpc3RcbiAgdGhpcy52YWx1ZSA9IHZhbHVlXG5cbiAgaWYgKHByZXYpIHtcbiAgICBwcmV2Lm5leHQgPSB0aGlzXG4gICAgdGhpcy5wcmV2ID0gcHJldlxuICB9IGVsc2Uge1xuICAgIHRoaXMucHJldiA9IG51bGxcbiAgfVxuXG4gIGlmIChuZXh0KSB7XG4gICAgbmV4dC5wcmV2ID0gdGhpc1xuICAgIHRoaXMubmV4dCA9IG5leHRcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm5leHQgPSBudWxsXG4gIH1cbn1cblxudHJ5IHtcbiAgLy8gYWRkIGlmIHN1cHBvcnQgZm9yIFN5bWJvbC5pdGVyYXRvciBpcyBwcmVzZW50XG4gIHJlcXVpcmUoJy4vaXRlcmF0b3IuanMnKShZYWxsaXN0KVxufSBjYXRjaCAoZXIpIHt9XG4iLCJmdW5jdGlvbiB3ZWJwYWNrRW1wdHlDb250ZXh0KHJlcSkge1xuXHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0dGhyb3cgZTtcbn1cbndlYnBhY2tFbXB0eUNvbnRleHQua2V5cyA9ICgpID0+IChbXSk7XG53ZWJwYWNrRW1wdHlDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrRW1wdHlDb250ZXh0O1xud2VicGFja0VtcHR5Q29udGV4dC5pZCA9IFwiLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkIHN5bmMgcmVjdXJzaXZlXCI7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tFbXB0eUNvbnRleHQ7IiwiZnVuY3Rpb24gd2VicGFja0VtcHR5Q29udGV4dChyZXEpIHtcblx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdHRocm93IGU7XG59XG53ZWJwYWNrRW1wdHlDb250ZXh0LmtleXMgPSAoKSA9PiAoW10pO1xud2VicGFja0VtcHR5Q29udGV4dC5yZXNvbHZlID0gd2VicGFja0VtcHR5Q29udGV4dDtcbndlYnBhY2tFbXB0eUNvbnRleHQuaWQgPSBcIi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkIHN5bmMgcmVjdXJzaXZlXCI7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tFbXB0eUNvbnRleHQ7IiwidmFyIGZzID0gcmVxdWlyZShcImZzXCIpO1xudmFyIHpsaWIgPSByZXF1aXJlKFwiemxpYlwiKTtcbnZhciBmZF9zbGljZXIgPSByZXF1aXJlKFwiZmQtc2xpY2VyXCIpO1xudmFyIGNyYzMyID0gcmVxdWlyZShcImJ1ZmZlci1jcmMzMlwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcInV0aWxcIik7XG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZShcImV2ZW50c1wiKS5FdmVudEVtaXR0ZXI7XG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZShcInN0cmVhbVwiKS5UcmFuc2Zvcm07XG52YXIgUGFzc1Rocm91Z2ggPSByZXF1aXJlKFwic3RyZWFtXCIpLlBhc3NUaHJvdWdoO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZShcInN0cmVhbVwiKS5Xcml0YWJsZTtcblxuZXhwb3J0cy5vcGVuID0gb3BlbjtcbmV4cG9ydHMuZnJvbUZkID0gZnJvbUZkO1xuZXhwb3J0cy5mcm9tQnVmZmVyID0gZnJvbUJ1ZmZlcjtcbmV4cG9ydHMuZnJvbVJhbmRvbUFjY2Vzc1JlYWRlciA9IGZyb21SYW5kb21BY2Nlc3NSZWFkZXI7XG5leHBvcnRzLmRvc0RhdGVUaW1lVG9EYXRlID0gZG9zRGF0ZVRpbWVUb0RhdGU7XG5leHBvcnRzLnZhbGlkYXRlRmlsZU5hbWUgPSB2YWxpZGF0ZUZpbGVOYW1lO1xuZXhwb3J0cy5aaXBGaWxlID0gWmlwRmlsZTtcbmV4cG9ydHMuRW50cnkgPSBFbnRyeTtcbmV4cG9ydHMuUmFuZG9tQWNjZXNzUmVhZGVyID0gUmFuZG9tQWNjZXNzUmVhZGVyO1xuXG5mdW5jdGlvbiBvcGVuKHBhdGgsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSBudWxsO1xuICB9XG4gIGlmIChvcHRpb25zID09IG51bGwpIG9wdGlvbnMgPSB7fTtcbiAgaWYgKG9wdGlvbnMuYXV0b0Nsb3NlID09IG51bGwpIG9wdGlvbnMuYXV0b0Nsb3NlID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMubGF6eUVudHJpZXMgPT0gbnVsbCkgb3B0aW9ucy5sYXp5RW50cmllcyA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5kZWNvZGVTdHJpbmdzID09IG51bGwpIG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9IHRydWU7XG4gIGlmIChvcHRpb25zLnZhbGlkYXRlRW50cnlTaXplcyA9PSBudWxsKSBvcHRpb25zLnZhbGlkYXRlRW50cnlTaXplcyA9IHRydWU7XG4gIGlmIChvcHRpb25zLnN0cmljdEZpbGVOYW1lcyA9PSBudWxsKSBvcHRpb25zLnN0cmljdEZpbGVOYW1lcyA9IGZhbHNlO1xuICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgY2FsbGJhY2sgPSBkZWZhdWx0Q2FsbGJhY2s7XG4gIGZzLm9wZW4ocGF0aCwgXCJyXCIsIGZ1bmN0aW9uKGVyciwgZmQpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBmcm9tRmQoZmQsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgemlwZmlsZSkge1xuICAgICAgaWYgKGVycikgZnMuY2xvc2UoZmQsIGRlZmF1bHRDYWxsYmFjayk7XG4gICAgICBjYWxsYmFjayhlcnIsIHppcGZpbGUpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZnJvbUZkKGZkLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0gbnVsbDtcbiAgfVxuICBpZiAob3B0aW9ucyA9PSBudWxsKSBvcHRpb25zID0ge307XG4gIGlmIChvcHRpb25zLmF1dG9DbG9zZSA9PSBudWxsKSBvcHRpb25zLmF1dG9DbG9zZSA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5sYXp5RW50cmllcyA9PSBudWxsKSBvcHRpb25zLmxhenlFbnRyaWVzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmRlY29kZVN0cmluZ3MgPT0gbnVsbCkgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID09IG51bGwpIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID09IG51bGwpIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID0gZmFsc2U7XG4gIGlmIChjYWxsYmFjayA9PSBudWxsKSBjYWxsYmFjayA9IGRlZmF1bHRDYWxsYmFjaztcbiAgZnMuZnN0YXQoZmQsIGZ1bmN0aW9uKGVyciwgc3RhdHMpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB2YXIgcmVhZGVyID0gZmRfc2xpY2VyLmNyZWF0ZUZyb21GZChmZCwge2F1dG9DbG9zZTogdHJ1ZX0pO1xuICAgIGZyb21SYW5kb21BY2Nlc3NSZWFkZXIocmVhZGVyLCBzdGF0cy5zaXplLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmcm9tQnVmZmVyKGJ1ZmZlciwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgb3B0aW9ucyA9IHt9O1xuICBvcHRpb25zLmF1dG9DbG9zZSA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5sYXp5RW50cmllcyA9PSBudWxsKSBvcHRpb25zLmxhenlFbnRyaWVzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmRlY29kZVN0cmluZ3MgPT0gbnVsbCkgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID09IG51bGwpIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID09IG51bGwpIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID0gZmFsc2U7XG4gIC8vIGxpbWl0IHRoZSBtYXggY2h1bmsgc2l6ZS4gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVqb3Nod29sZmUveWF1emwvaXNzdWVzLzg3XG4gIHZhciByZWFkZXIgPSBmZF9zbGljZXIuY3JlYXRlRnJvbUJ1ZmZlcihidWZmZXIsIHttYXhDaHVua1NpemU6IDB4MTAwMDB9KTtcbiAgZnJvbVJhbmRvbUFjY2Vzc1JlYWRlcihyZWFkZXIsIGJ1ZmZlci5sZW5ndGgsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZnJvbVJhbmRvbUFjY2Vzc1JlYWRlcihyZWFkZXIsIHRvdGFsU2l6ZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgb3B0aW9ucyA9IHt9O1xuICBpZiAob3B0aW9ucy5hdXRvQ2xvc2UgPT0gbnVsbCkgb3B0aW9ucy5hdXRvQ2xvc2UgPSB0cnVlO1xuICBpZiAob3B0aW9ucy5sYXp5RW50cmllcyA9PSBudWxsKSBvcHRpb25zLmxhenlFbnRyaWVzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmRlY29kZVN0cmluZ3MgPT0gbnVsbCkgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gdHJ1ZTtcbiAgdmFyIGRlY29kZVN0cmluZ3MgPSAhIW9wdGlvbnMuZGVjb2RlU3RyaW5ncztcbiAgaWYgKG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID09IG51bGwpIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID09IG51bGwpIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID0gZmFsc2U7XG4gIGlmIChjYWxsYmFjayA9PSBudWxsKSBjYWxsYmFjayA9IGRlZmF1bHRDYWxsYmFjaztcbiAgaWYgKHR5cGVvZiB0b3RhbFNpemUgIT09IFwibnVtYmVyXCIpIHRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIHRvdGFsU2l6ZSBwYXJhbWV0ZXIgdG8gYmUgYSBudW1iZXJcIik7XG4gIGlmICh0b3RhbFNpemUgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgIHRocm93IG5ldyBFcnJvcihcInppcCBmaWxlIHRvbyBsYXJnZS4gb25seSBmaWxlIHNpemVzIHVwIHRvIDJeNTIgYXJlIHN1cHBvcnRlZCBkdWUgdG8gSmF2YVNjcmlwdCdzIE51bWJlciB0eXBlIGJlaW5nIGFuIElFRUUgNzU0IGRvdWJsZS5cIik7XG4gIH1cblxuICAvLyB0aGUgbWF0Y2hpbmcgdW5yZWYoKSBjYWxsIGlzIGluIHppcGZpbGUuY2xvc2UoKVxuICByZWFkZXIucmVmKCk7XG5cbiAgLy8gZW9jZHIgbWVhbnMgRW5kIG9mIENlbnRyYWwgRGlyZWN0b3J5IFJlY29yZC5cbiAgLy8gc2VhcmNoIGJhY2t3YXJkcyBmb3IgdGhlIGVvY2RyIHNpZ25hdHVyZS5cbiAgLy8gdGhlIGxhc3QgZmllbGQgb2YgdGhlIGVvY2RyIGlzIGEgdmFyaWFibGUtbGVuZ3RoIGNvbW1lbnQuXG4gIC8vIHRoZSBjb21tZW50IHNpemUgaXMgZW5jb2RlZCBpbiBhIDItYnl0ZSBmaWVsZCBpbiB0aGUgZW9jZHIsIHdoaWNoIHdlIGNhbid0IGZpbmQgd2l0aG91dCB0cnVkZ2luZyBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgY29tbWVudCB0byBmaW5kIGl0LlxuICAvLyBhcyBhIGNvbnNlcXVlbmNlIG9mIHRoaXMgZGVzaWduIGRlY2lzaW9uLCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgYW1iaWd1b3VzIHppcCBmaWxlIG1ldGFkYXRhIGlmIGEgY29oZXJlbnQgZW9jZHIgd2FzIGluIHRoZSBjb21tZW50LlxuICAvLyB3ZSBzZWFyY2ggYmFja3dhcmRzIGZvciBhIGVvY2RyIHNpZ25hdHVyZSwgYW5kIGhvcGUgdGhhdCB3aG9ldmVyIG1hZGUgdGhlIHppcCBmaWxlIHdhcyBzbWFydCBlbm91Z2ggdG8gZm9yYmlkIHRoZSBlb2NkciBzaWduYXR1cmUgaW4gdGhlIGNvbW1lbnQuXG4gIHZhciBlb2NkcldpdGhvdXRDb21tZW50U2l6ZSA9IDIyO1xuICB2YXIgbWF4Q29tbWVudFNpemUgPSAweGZmZmY7IC8vIDItYnl0ZSBzaXplXG4gIHZhciBidWZmZXJTaXplID0gTWF0aC5taW4oZW9jZHJXaXRob3V0Q29tbWVudFNpemUgKyBtYXhDb21tZW50U2l6ZSwgdG90YWxTaXplKTtcbiAgdmFyIGJ1ZmZlciA9IG5ld0J1ZmZlcihidWZmZXJTaXplKTtcbiAgdmFyIGJ1ZmZlclJlYWRTdGFydCA9IHRvdGFsU2l6ZSAtIGJ1ZmZlci5sZW5ndGg7XG4gIHJlYWRBbmRBc3NlcnROb0VvZihyZWFkZXIsIGJ1ZmZlciwgMCwgYnVmZmVyU2l6ZSwgYnVmZmVyUmVhZFN0YXJ0LCBmdW5jdGlvbihlcnIpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBmb3IgKHZhciBpID0gYnVmZmVyU2l6ZSAtIGVvY2RyV2l0aG91dENvbW1lbnRTaXplOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgaWYgKGJ1ZmZlci5yZWFkVUludDMyTEUoaSkgIT09IDB4MDYwNTRiNTApIGNvbnRpbnVlO1xuICAgICAgLy8gZm91bmQgZW9jZHJcbiAgICAgIHZhciBlb2NkckJ1ZmZlciA9IGJ1ZmZlci5zbGljZShpKTtcblxuICAgICAgLy8gMCAtIEVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBzaWduYXR1cmUgPSAweDA2MDU0YjUwXG4gICAgICAvLyA0IC0gTnVtYmVyIG9mIHRoaXMgZGlza1xuICAgICAgdmFyIGRpc2tOdW1iZXIgPSBlb2NkckJ1ZmZlci5yZWFkVUludDE2TEUoNCk7XG4gICAgICBpZiAoZGlza051bWJlciAhPT0gMCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwibXVsdGktZGlzayB6aXAgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQ6IGZvdW5kIGRpc2sgbnVtYmVyOiBcIiArIGRpc2tOdW1iZXIpKTtcbiAgICAgIH1cbiAgICAgIC8vIDYgLSBEaXNrIHdoZXJlIGNlbnRyYWwgZGlyZWN0b3J5IHN0YXJ0c1xuICAgICAgLy8gOCAtIE51bWJlciBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmRzIG9uIHRoaXMgZGlza1xuICAgICAgLy8gMTAgLSBUb3RhbCBudW1iZXIgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3Jkc1xuICAgICAgdmFyIGVudHJ5Q291bnQgPSBlb2NkckJ1ZmZlci5yZWFkVUludDE2TEUoMTApO1xuICAgICAgLy8gMTIgLSBTaXplIG9mIGNlbnRyYWwgZGlyZWN0b3J5IChieXRlcylcbiAgICAgIC8vIDE2IC0gT2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5LCByZWxhdGl2ZSB0byBzdGFydCBvZiBhcmNoaXZlXG4gICAgICB2YXIgY2VudHJhbERpcmVjdG9yeU9mZnNldCA9IGVvY2RyQnVmZmVyLnJlYWRVSW50MzJMRSgxNik7XG4gICAgICAvLyAyMCAtIENvbW1lbnQgbGVuZ3RoXG4gICAgICB2YXIgY29tbWVudExlbmd0aCA9IGVvY2RyQnVmZmVyLnJlYWRVSW50MTZMRSgyMCk7XG4gICAgICB2YXIgZXhwZWN0ZWRDb21tZW50TGVuZ3RoID0gZW9jZHJCdWZmZXIubGVuZ3RoIC0gZW9jZHJXaXRob3V0Q29tbWVudFNpemU7XG4gICAgICBpZiAoY29tbWVudExlbmd0aCAhPT0gZXhwZWN0ZWRDb21tZW50TGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJpbnZhbGlkIGNvbW1lbnQgbGVuZ3RoLiBleHBlY3RlZDogXCIgKyBleHBlY3RlZENvbW1lbnRMZW5ndGggKyBcIi4gZm91bmQ6IFwiICsgY29tbWVudExlbmd0aCkpO1xuICAgICAgfVxuICAgICAgLy8gMjIgLSBDb21tZW50XG4gICAgICAvLyB0aGUgZW5jb2RpbmcgaXMgYWx3YXlzIGNwNDM3LlxuICAgICAgdmFyIGNvbW1lbnQgPSBkZWNvZGVTdHJpbmdzID8gZGVjb2RlQnVmZmVyKGVvY2RyQnVmZmVyLCAyMiwgZW9jZHJCdWZmZXIubGVuZ3RoLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVvY2RyQnVmZmVyLnNsaWNlKDIyKTtcblxuICAgICAgaWYgKCEoZW50cnlDb3VudCA9PT0gMHhmZmZmIHx8IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgPT09IDB4ZmZmZmZmZmYpKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBuZXcgWmlwRmlsZShyZWFkZXIsIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsIHRvdGFsU2l6ZSwgZW50cnlDb3VudCwgY29tbWVudCwgb3B0aW9ucy5hdXRvQ2xvc2UsIG9wdGlvbnMubGF6eUVudHJpZXMsIGRlY29kZVN0cmluZ3MsIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzLCBvcHRpb25zLnN0cmljdEZpbGVOYW1lcykpO1xuICAgICAgfVxuXG4gICAgICAvLyBaSVA2NCBmb3JtYXRcblxuICAgICAgLy8gWklQNjQgWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3JcbiAgICAgIHZhciB6aXA2NEVvY2RsQnVmZmVyID0gbmV3QnVmZmVyKDIwKTtcbiAgICAgIHZhciB6aXA2NEVvY2RsT2Zmc2V0ID0gYnVmZmVyUmVhZFN0YXJ0ICsgaSAtIHppcDY0RW9jZGxCdWZmZXIubGVuZ3RoO1xuICAgICAgcmVhZEFuZEFzc2VydE5vRW9mKHJlYWRlciwgemlwNjRFb2NkbEJ1ZmZlciwgMCwgemlwNjRFb2NkbEJ1ZmZlci5sZW5ndGgsIHppcDY0RW9jZGxPZmZzZXQsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgICAgICAvLyAwIC0gemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyIGxvY2F0b3Igc2lnbmF0dXJlID0gMHgwNzA2NGI1MFxuICAgICAgICBpZiAoemlwNjRFb2NkbEJ1ZmZlci5yZWFkVUludDMyTEUoMCkgIT09IDB4MDcwNjRiNTApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiaW52YWxpZCB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciBzaWduYXR1cmVcIikpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDQgLSBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIHppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeVxuICAgICAgICAvLyA4IC0gcmVsYXRpdmUgb2Zmc2V0IG9mIHRoZSB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkXG4gICAgICAgIHZhciB6aXA2NEVvY2RyT2Zmc2V0ID0gcmVhZFVJbnQ2NExFKHppcDY0RW9jZGxCdWZmZXIsIDgpO1xuICAgICAgICAvLyAxNiAtIHRvdGFsIG51bWJlciBvZiBkaXNrc1xuXG4gICAgICAgIC8vIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmRcbiAgICAgICAgdmFyIHppcDY0RW9jZHJCdWZmZXIgPSBuZXdCdWZmZXIoNTYpO1xuICAgICAgICByZWFkQW5kQXNzZXJ0Tm9Fb2YocmVhZGVyLCB6aXA2NEVvY2RyQnVmZmVyLCAwLCB6aXA2NEVvY2RyQnVmZmVyLmxlbmd0aCwgemlwNjRFb2Nkck9mZnNldCwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG5cbiAgICAgICAgICAvLyAwIC0gemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyIHNpZ25hdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXMgICgweDA2MDY0YjUwKVxuICAgICAgICAgIGlmICh6aXA2NEVvY2RyQnVmZmVyLnJlYWRVSW50MzJMRSgwKSAhPT0gMHgwNjA2NGI1MCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcImludmFsaWQgemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCBzaWduYXR1cmVcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyA0IC0gc2l6ZSBvZiB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICAgICAgICAgICAgICAgIDggYnl0ZXNcbiAgICAgICAgICAvLyAxMiAtIHZlcnNpb24gbWFkZSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgYnl0ZXNcbiAgICAgICAgICAvLyAxNCAtIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgYnl0ZXNcbiAgICAgICAgICAvLyAxNiAtIG51bWJlciBvZiB0aGlzIGRpc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXNcbiAgICAgICAgICAvLyAyMCAtIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgIDQgYnl0ZXNcbiAgICAgICAgICAvLyAyNCAtIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBvbiB0aGlzIGRpc2sgICAgICAgICA4IGJ5dGVzXG4gICAgICAgICAgLy8gMzIgLSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgICAgICAgICAgICA4IGJ5dGVzXG4gICAgICAgICAgZW50cnlDb3VudCA9IHJlYWRVSW50NjRMRSh6aXA2NEVvY2RyQnVmZmVyLCAzMik7XG4gICAgICAgICAgLy8gNDAgLSBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IGJ5dGVzXG4gICAgICAgICAgLy8gNDggLSBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZSBzdGFydGluZyBkaXNrIG51bWJlciAgICAgOCBieXRlc1xuICAgICAgICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgPSByZWFkVUludDY0TEUoemlwNjRFb2NkckJ1ZmZlciwgNDgpO1xuICAgICAgICAgIC8vIDU2IC0gemlwNjQgZXh0ZW5zaWJsZSBkYXRhIHNlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhcmlhYmxlIHNpemUpXG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG5ldyBaaXBGaWxlKHJlYWRlciwgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgdG90YWxTaXplLCBlbnRyeUNvdW50LCBjb21tZW50LCBvcHRpb25zLmF1dG9DbG9zZSwgb3B0aW9ucy5sYXp5RW50cmllcywgZGVjb2RlU3RyaW5ncywgb3B0aW9ucy52YWxpZGF0ZUVudHJ5U2l6ZXMsIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxiYWNrKG5ldyBFcnJvcihcImVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgc2lnbmF0dXJlIG5vdCBmb3VuZFwiKSk7XG4gIH0pO1xufVxuXG51dGlsLmluaGVyaXRzKFppcEZpbGUsIEV2ZW50RW1pdHRlcik7XG5mdW5jdGlvbiBaaXBGaWxlKHJlYWRlciwgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgZmlsZVNpemUsIGVudHJ5Q291bnQsIGNvbW1lbnQsIGF1dG9DbG9zZSwgbGF6eUVudHJpZXMsIGRlY29kZVN0cmluZ3MsIHZhbGlkYXRlRW50cnlTaXplcywgc3RyaWN0RmlsZU5hbWVzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgRXZlbnRFbWl0dGVyLmNhbGwoc2VsZik7XG4gIHNlbGYucmVhZGVyID0gcmVhZGVyO1xuICAvLyBmb3J3YXJkIGNsb3NlIGV2ZW50c1xuICBzZWxmLnJlYWRlci5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgIC8vIGVycm9yIGNsb3NpbmcgdGhlIGZkXG4gICAgZW1pdEVycm9yKHNlbGYsIGVycik7XG4gIH0pO1xuICBzZWxmLnJlYWRlci5vbmNlKFwiY2xvc2VcIiwgZnVuY3Rpb24oKSB7XG4gICAgc2VsZi5lbWl0KFwiY2xvc2VcIik7XG4gIH0pO1xuICBzZWxmLnJlYWRFbnRyeUN1cnNvciA9IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQ7XG4gIHNlbGYuZmlsZVNpemUgPSBmaWxlU2l6ZTtcbiAgc2VsZi5lbnRyeUNvdW50ID0gZW50cnlDb3VudDtcbiAgc2VsZi5jb21tZW50ID0gY29tbWVudDtcbiAgc2VsZi5lbnRyaWVzUmVhZCA9IDA7XG4gIHNlbGYuYXV0b0Nsb3NlID0gISFhdXRvQ2xvc2U7XG4gIHNlbGYubGF6eUVudHJpZXMgPSAhIWxhenlFbnRyaWVzO1xuICBzZWxmLmRlY29kZVN0cmluZ3MgPSAhIWRlY29kZVN0cmluZ3M7XG4gIHNlbGYudmFsaWRhdGVFbnRyeVNpemVzID0gISF2YWxpZGF0ZUVudHJ5U2l6ZXM7XG4gIHNlbGYuc3RyaWN0RmlsZU5hbWVzID0gISFzdHJpY3RGaWxlTmFtZXM7XG4gIHNlbGYuaXNPcGVuID0gdHJ1ZTtcbiAgc2VsZi5lbWl0dGVkRXJyb3IgPSBmYWxzZTtcblxuICBpZiAoIXNlbGYubGF6eUVudHJpZXMpIHNlbGYuX3JlYWRFbnRyeSgpO1xufVxuWmlwRmlsZS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICB0aGlzLnJlYWRlci51bnJlZigpO1xufTtcblxuZnVuY3Rpb24gZW1pdEVycm9yQW5kQXV0b0Nsb3NlKHNlbGYsIGVycikge1xuICBpZiAoc2VsZi5hdXRvQ2xvc2UpIHNlbGYuY2xvc2UoKTtcbiAgZW1pdEVycm9yKHNlbGYsIGVycik7XG59XG5mdW5jdGlvbiBlbWl0RXJyb3Ioc2VsZiwgZXJyKSB7XG4gIGlmIChzZWxmLmVtaXR0ZWRFcnJvcikgcmV0dXJuO1xuICBzZWxmLmVtaXR0ZWRFcnJvciA9IHRydWU7XG4gIHNlbGYuZW1pdChcImVycm9yXCIsIGVycik7XG59XG5cblppcEZpbGUucHJvdG90eXBlLnJlYWRFbnRyeSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMubGF6eUVudHJpZXMpIHRocm93IG5ldyBFcnJvcihcInJlYWRFbnRyeSgpIGNhbGxlZCB3aXRob3V0IGxhenlFbnRyaWVzOnRydWVcIik7XG4gIHRoaXMuX3JlYWRFbnRyeSgpO1xufTtcblppcEZpbGUucHJvdG90eXBlLl9yZWFkRW50cnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoc2VsZi5lbnRyeUNvdW50ID09PSBzZWxmLmVudHJpZXNSZWFkKSB7XG4gICAgLy8gZG9uZSB3aXRoIG1ldGFkYXRhXG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuYXV0b0Nsb3NlKSBzZWxmLmNsb3NlKCk7XG4gICAgICBpZiAoc2VsZi5lbWl0dGVkRXJyb3IpIHJldHVybjtcbiAgICAgIHNlbGYuZW1pdChcImVuZFwiKTtcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHNlbGYuZW1pdHRlZEVycm9yKSByZXR1cm47XG4gIHZhciBidWZmZXIgPSBuZXdCdWZmZXIoNDYpO1xuICByZWFkQW5kQXNzZXJ0Tm9Fb2Yoc2VsZi5yZWFkZXIsIGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgc2VsZi5yZWFkRW50cnlDdXJzb3IsIGZ1bmN0aW9uKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgZXJyKTtcbiAgICBpZiAoc2VsZi5lbWl0dGVkRXJyb3IpIHJldHVybjtcbiAgICB2YXIgZW50cnkgPSBuZXcgRW50cnkoKTtcbiAgICAvLyAwIC0gQ2VudHJhbCBkaXJlY3RvcnkgZmlsZSBoZWFkZXIgc2lnbmF0dXJlXG4gICAgdmFyIHNpZ25hdHVyZSA9IGJ1ZmZlci5yZWFkVUludDMyTEUoMCk7XG4gICAgaWYgKHNpZ25hdHVyZSAhPT0gMHgwMjAxNGI1MCkgcmV0dXJuIGVtaXRFcnJvckFuZEF1dG9DbG9zZShzZWxmLCBuZXcgRXJyb3IoXCJpbnZhbGlkIGNlbnRyYWwgZGlyZWN0b3J5IGZpbGUgaGVhZGVyIHNpZ25hdHVyZTogMHhcIiArIHNpZ25hdHVyZS50b1N0cmluZygxNikpKTtcbiAgICAvLyA0IC0gVmVyc2lvbiBtYWRlIGJ5XG4gICAgZW50cnkudmVyc2lvbk1hZGVCeSA9IGJ1ZmZlci5yZWFkVUludDE2TEUoNCk7XG4gICAgLy8gNiAtIFZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgKG1pbmltdW0pXG4gICAgZW50cnkudmVyc2lvbk5lZWRlZFRvRXh0cmFjdCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoNik7XG4gICAgLy8gOCAtIEdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZ1xuICAgIGVudHJ5LmdlbmVyYWxQdXJwb3NlQml0RmxhZyA9IGJ1ZmZlci5yZWFkVUludDE2TEUoOCk7XG4gICAgLy8gMTAgLSBDb21wcmVzc2lvbiBtZXRob2RcbiAgICBlbnRyeS5jb21wcmVzc2lvbk1ldGhvZCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoMTApO1xuICAgIC8vIDEyIC0gRmlsZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lXG4gICAgZW50cnkubGFzdE1vZEZpbGVUaW1lID0gYnVmZmVyLnJlYWRVSW50MTZMRSgxMik7XG4gICAgLy8gMTQgLSBGaWxlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGVcbiAgICBlbnRyeS5sYXN0TW9kRmlsZURhdGUgPSBidWZmZXIucmVhZFVJbnQxNkxFKDE0KTtcbiAgICAvLyAxNiAtIENSQy0zMlxuICAgIGVudHJ5LmNyYzMyID0gYnVmZmVyLnJlYWRVSW50MzJMRSgxNik7XG4gICAgLy8gMjAgLSBDb21wcmVzc2VkIHNpemVcbiAgICBlbnRyeS5jb21wcmVzc2VkU2l6ZSA9IGJ1ZmZlci5yZWFkVUludDMyTEUoMjApO1xuICAgIC8vIDI0IC0gVW5jb21wcmVzc2VkIHNpemVcbiAgICBlbnRyeS51bmNvbXByZXNzZWRTaXplID0gYnVmZmVyLnJlYWRVSW50MzJMRSgyNCk7XG4gICAgLy8gMjggLSBGaWxlIG5hbWUgbGVuZ3RoIChuKVxuICAgIGVudHJ5LmZpbGVOYW1lTGVuZ3RoID0gYnVmZmVyLnJlYWRVSW50MTZMRSgyOCk7XG4gICAgLy8gMzAgLSBFeHRyYSBmaWVsZCBsZW5ndGggKG0pXG4gICAgZW50cnkuZXh0cmFGaWVsZExlbmd0aCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoMzApO1xuICAgIC8vIDMyIC0gRmlsZSBjb21tZW50IGxlbmd0aCAoaylcbiAgICBlbnRyeS5maWxlQ29tbWVudExlbmd0aCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoMzIpO1xuICAgIC8vIDM0IC0gRGlzayBudW1iZXIgd2hlcmUgZmlsZSBzdGFydHNcbiAgICAvLyAzNiAtIEludGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgIGVudHJ5LmludGVybmFsRmlsZUF0dHJpYnV0ZXMgPSBidWZmZXIucmVhZFVJbnQxNkxFKDM2KTtcbiAgICAvLyAzOCAtIEV4dGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgIGVudHJ5LmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSBidWZmZXIucmVhZFVJbnQzMkxFKDM4KTtcbiAgICAvLyA0MiAtIFJlbGF0aXZlIG9mZnNldCBvZiBsb2NhbCBmaWxlIGhlYWRlclxuICAgIGVudHJ5LnJlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciA9IGJ1ZmZlci5yZWFkVUludDMyTEUoNDIpO1xuXG4gICAgaWYgKGVudHJ5LmdlbmVyYWxQdXJwb3NlQml0RmxhZyAmIDB4NDApIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwic3Ryb25nIGVuY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZFwiKSk7XG5cbiAgICBzZWxmLnJlYWRFbnRyeUN1cnNvciArPSA0NjtcblxuICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcihlbnRyeS5maWxlTmFtZUxlbmd0aCArIGVudHJ5LmV4dHJhRmllbGRMZW5ndGggKyBlbnRyeS5maWxlQ29tbWVudExlbmd0aCk7XG4gICAgcmVhZEFuZEFzc2VydE5vRW9mKHNlbGYucmVhZGVyLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIHNlbGYucmVhZEVudHJ5Q3Vyc29yLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgZXJyKTtcbiAgICAgIGlmIChzZWxmLmVtaXR0ZWRFcnJvcikgcmV0dXJuO1xuICAgICAgLy8gNDYgLSBGaWxlIG5hbWVcbiAgICAgIHZhciBpc1V0ZjggPSAoZW50cnkuZ2VuZXJhbFB1cnBvc2VCaXRGbGFnICYgMHg4MDApICE9PSAwO1xuICAgICAgZW50cnkuZmlsZU5hbWUgPSBzZWxmLmRlY29kZVN0cmluZ3MgPyBkZWNvZGVCdWZmZXIoYnVmZmVyLCAwLCBlbnRyeS5maWxlTmFtZUxlbmd0aCwgaXNVdGY4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBidWZmZXIuc2xpY2UoMCwgZW50cnkuZmlsZU5hbWVMZW5ndGgpO1xuXG4gICAgICAvLyA0NituIC0gRXh0cmEgZmllbGRcbiAgICAgIHZhciBmaWxlQ29tbWVudFN0YXJ0ID0gZW50cnkuZmlsZU5hbWVMZW5ndGggKyBlbnRyeS5leHRyYUZpZWxkTGVuZ3RoO1xuICAgICAgdmFyIGV4dHJhRmllbGRCdWZmZXIgPSBidWZmZXIuc2xpY2UoZW50cnkuZmlsZU5hbWVMZW5ndGgsIGZpbGVDb21tZW50U3RhcnQpO1xuICAgICAgZW50cnkuZXh0cmFGaWVsZHMgPSBbXTtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChpIDwgZXh0cmFGaWVsZEJ1ZmZlci5sZW5ndGggLSAzKSB7XG4gICAgICAgIHZhciBoZWFkZXJJZCA9IGV4dHJhRmllbGRCdWZmZXIucmVhZFVJbnQxNkxFKGkgKyAwKTtcbiAgICAgICAgdmFyIGRhdGFTaXplID0gZXh0cmFGaWVsZEJ1ZmZlci5yZWFkVUludDE2TEUoaSArIDIpO1xuICAgICAgICB2YXIgZGF0YVN0YXJ0ID0gaSArIDQ7XG4gICAgICAgIHZhciBkYXRhRW5kID0gZGF0YVN0YXJ0ICsgZGF0YVNpemU7XG4gICAgICAgIGlmIChkYXRhRW5kID4gZXh0cmFGaWVsZEJ1ZmZlci5sZW5ndGgpIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwiZXh0cmEgZmllbGQgbGVuZ3RoIGV4Y2VlZHMgZXh0cmEgZmllbGQgYnVmZmVyIHNpemVcIikpO1xuICAgICAgICB2YXIgZGF0YUJ1ZmZlciA9IG5ld0J1ZmZlcihkYXRhU2l6ZSk7XG4gICAgICAgIGV4dHJhRmllbGRCdWZmZXIuY29weShkYXRhQnVmZmVyLCAwLCBkYXRhU3RhcnQsIGRhdGFFbmQpO1xuICAgICAgICBlbnRyeS5leHRyYUZpZWxkcy5wdXNoKHtcbiAgICAgICAgICBpZDogaGVhZGVySWQsXG4gICAgICAgICAgZGF0YTogZGF0YUJ1ZmZlcixcbiAgICAgICAgfSk7XG4gICAgICAgIGkgPSBkYXRhRW5kO1xuICAgICAgfVxuXG4gICAgICAvLyA0NituK20gLSBGaWxlIGNvbW1lbnRcbiAgICAgIGVudHJ5LmZpbGVDb21tZW50ID0gc2VsZi5kZWNvZGVTdHJpbmdzID8gZGVjb2RlQnVmZmVyKGJ1ZmZlciwgZmlsZUNvbW1lbnRTdGFydCwgZmlsZUNvbW1lbnRTdGFydCArIGVudHJ5LmZpbGVDb21tZW50TGVuZ3RoLCBpc1V0ZjgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJ1ZmZlci5zbGljZShmaWxlQ29tbWVudFN0YXJ0LCBmaWxlQ29tbWVudFN0YXJ0ICsgZW50cnkuZmlsZUNvbW1lbnRMZW5ndGgpO1xuICAgICAgLy8gY29tcGF0aWJpbGl0eSBoYWNrIGZvciBodHRwczovL2dpdGh1Yi5jb20vdGhlam9zaHdvbGZlL3lhdXpsL2lzc3Vlcy80N1xuICAgICAgZW50cnkuY29tbWVudCA9IGVudHJ5LmZpbGVDb21tZW50O1xuXG4gICAgICBzZWxmLnJlYWRFbnRyeUN1cnNvciArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgc2VsZi5lbnRyaWVzUmVhZCArPSAxO1xuXG4gICAgICBpZiAoZW50cnkudW5jb21wcmVzc2VkU2l6ZSAgICAgICAgICAgID09PSAweGZmZmZmZmZmIHx8XG4gICAgICAgICAgZW50cnkuY29tcHJlc3NlZFNpemUgICAgICAgICAgICAgID09PSAweGZmZmZmZmZmIHx8XG4gICAgICAgICAgZW50cnkucmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyID09PSAweGZmZmZmZmZmKSB7XG4gICAgICAgIC8vIFpJUDY0IGZvcm1hdFxuICAgICAgICAvLyBmaW5kIHRoZSBaaXA2NCBFeHRlbmRlZCBJbmZvcm1hdGlvbiBFeHRyYSBGaWVsZFxuICAgICAgICB2YXIgemlwNjRFaWVmQnVmZmVyID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyeS5leHRyYUZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBleHRyYUZpZWxkID0gZW50cnkuZXh0cmFGaWVsZHNbaV07XG4gICAgICAgICAgaWYgKGV4dHJhRmllbGQuaWQgPT09IDB4MDAwMSkge1xuICAgICAgICAgICAgemlwNjRFaWVmQnVmZmVyID0gZXh0cmFGaWVsZC5kYXRhO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh6aXA2NEVpZWZCdWZmZXIgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwiZXhwZWN0ZWQgemlwNjQgZXh0ZW5kZWQgaW5mb3JtYXRpb24gZXh0cmEgZmllbGRcIikpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIC8vIDAgLSBPcmlnaW5hbCBTaXplICAgICAgICAgIDggYnl0ZXNcbiAgICAgICAgaWYgKGVudHJ5LnVuY29tcHJlc3NlZFNpemUgPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgICBpZiAoaW5kZXggKyA4ID4gemlwNjRFaWVmQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRFcnJvckFuZEF1dG9DbG9zZShzZWxmLCBuZXcgRXJyb3IoXCJ6aXA2NCBleHRlbmRlZCBpbmZvcm1hdGlvbiBleHRyYSBmaWVsZCBkb2VzIG5vdCBpbmNsdWRlIHVuY29tcHJlc3NlZCBzaXplXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkU2l6ZSA9IHJlYWRVSW50NjRMRSh6aXA2NEVpZWZCdWZmZXIsIGluZGV4KTtcbiAgICAgICAgICBpbmRleCArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vIDggLSBDb21wcmVzc2VkIFNpemUgICAgICAgIDggYnl0ZXNcbiAgICAgICAgaWYgKGVudHJ5LmNvbXByZXNzZWRTaXplID09PSAweGZmZmZmZmZmKSB7XG4gICAgICAgICAgaWYgKGluZGV4ICsgOCA+IHppcDY0RWllZkJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwiemlwNjQgZXh0ZW5kZWQgaW5mb3JtYXRpb24gZXh0cmEgZmllbGQgZG9lcyBub3QgaW5jbHVkZSBjb21wcmVzc2VkIHNpemVcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbnRyeS5jb21wcmVzc2VkU2l6ZSA9IHJlYWRVSW50NjRMRSh6aXA2NEVpZWZCdWZmZXIsIGluZGV4KTtcbiAgICAgICAgICBpbmRleCArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vIDE2IC0gUmVsYXRpdmUgSGVhZGVyIE9mZnNldCA4IGJ5dGVzXG4gICAgICAgIGlmIChlbnRyeS5yZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgICBpZiAoaW5kZXggKyA4ID4gemlwNjRFaWVmQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRFcnJvckFuZEF1dG9DbG9zZShzZWxmLCBuZXcgRXJyb3IoXCJ6aXA2NCBleHRlbmRlZCBpbmZvcm1hdGlvbiBleHRyYSBmaWVsZCBkb2VzIG5vdCBpbmNsdWRlIHJlbGF0aXZlIGhlYWRlciBvZmZzZXRcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbnRyeS5yZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgPSByZWFkVUludDY0TEUoemlwNjRFaWVmQnVmZmVyLCBpbmRleCk7XG4gICAgICAgICAgaW5kZXggKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLyAyNCAtIERpc2sgU3RhcnQgTnVtYmVyICAgICAgNCBieXRlc1xuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBmb3IgSW5mby1aSVAgVW5pY29kZSBQYXRoIEV4dHJhIEZpZWxkICgweDcwNzUpXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWpvc2h3b2xmZS95YXV6bC9pc3N1ZXMvMzNcbiAgICAgIGlmIChzZWxmLmRlY29kZVN0cmluZ3MpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyeS5leHRyYUZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBleHRyYUZpZWxkID0gZW50cnkuZXh0cmFGaWVsZHNbaV07XG4gICAgICAgICAgaWYgKGV4dHJhRmllbGQuaWQgPT09IDB4NzA3NSkge1xuICAgICAgICAgICAgaWYgKGV4dHJhRmllbGQuZGF0YS5sZW5ndGggPCA2KSB7XG4gICAgICAgICAgICAgIC8vIHRvbyBzaG9ydCB0byBiZSBtZWFuaW5nZnVsXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVmVyc2lvbiAgICAgICAxIGJ5dGUgICAgICB2ZXJzaW9uIG9mIHRoaXMgZXh0cmEgZmllbGQsIGN1cnJlbnRseSAxXG4gICAgICAgICAgICBpZiAoZXh0cmFGaWVsZC5kYXRhLnJlYWRVSW50OCgwKSAhPT0gMSkge1xuICAgICAgICAgICAgICAvLyA+IENoYW5nZXMgbWF5IG5vdCBiZSBiYWNrd2FyZCBjb21wYXRpYmxlIHNvIHRoaXMgZXh0cmFcbiAgICAgICAgICAgICAgLy8gPiBmaWVsZCBzaG91bGQgbm90IGJlIHVzZWQgaWYgdGhlIHZlcnNpb24gaXMgbm90IHJlY29nbml6ZWQuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTmFtZUNSQzMyICAgICA0IGJ5dGVzICAgICBGaWxlIE5hbWUgRmllbGQgQ1JDMzIgQ2hlY2tzdW1cbiAgICAgICAgICAgIHZhciBvbGROYW1lQ3JjMzIgPSBleHRyYUZpZWxkLmRhdGEucmVhZFVJbnQzMkxFKDEpO1xuICAgICAgICAgICAgaWYgKGNyYzMyLnVuc2lnbmVkKGJ1ZmZlci5zbGljZSgwLCBlbnRyeS5maWxlTmFtZUxlbmd0aCkpICE9PSBvbGROYW1lQ3JjMzIpIHtcbiAgICAgICAgICAgICAgLy8gPiBJZiB0aGUgQ1JDIGNoZWNrIGZhaWxzLCB0aGlzIFVURi04IFBhdGggRXh0cmEgRmllbGQgc2hvdWxkIGJlXG4gICAgICAgICAgICAgIC8vID4gaWdub3JlZCBhbmQgdGhlIEZpbGUgTmFtZSBmaWVsZCBpbiB0aGUgaGVhZGVyIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVW5pY29kZU5hbWUgICBWYXJpYWJsZSAgICBVVEYtOCB2ZXJzaW9uIG9mIHRoZSBlbnRyeSBGaWxlIE5hbWVcbiAgICAgICAgICAgIGVudHJ5LmZpbGVOYW1lID0gZGVjb2RlQnVmZmVyKGV4dHJhRmllbGQuZGF0YSwgNSwgZXh0cmFGaWVsZC5kYXRhLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWRhdGUgZmlsZSBzaXplXG4gICAgICBpZiAoc2VsZi52YWxpZGF0ZUVudHJ5U2l6ZXMgJiYgZW50cnkuY29tcHJlc3Npb25NZXRob2QgPT09IDApIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ29tcHJlc3NlZFNpemUgPSBlbnRyeS51bmNvbXByZXNzZWRTaXplO1xuICAgICAgICBpZiAoZW50cnkuaXNFbmNyeXB0ZWQoKSkge1xuICAgICAgICAgIC8vIHRyYWRpdGlvbmFsIGVuY3J5cHRpb24gcHJlZml4ZXMgdGhlIGZpbGUgZGF0YSB3aXRoIGEgaGVhZGVyXG4gICAgICAgICAgZXhwZWN0ZWRDb21wcmVzc2VkU2l6ZSArPSAxMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuY29tcHJlc3NlZFNpemUgIT09IGV4cGVjdGVkQ29tcHJlc3NlZFNpemUpIHtcbiAgICAgICAgICB2YXIgbXNnID0gXCJjb21wcmVzc2VkL3VuY29tcHJlc3NlZCBzaXplIG1pc21hdGNoIGZvciBzdG9yZWQgZmlsZTogXCIgKyBlbnRyeS5jb21wcmVzc2VkU2l6ZSArIFwiICE9IFwiICsgZW50cnkudW5jb21wcmVzc2VkU2l6ZTtcbiAgICAgICAgICByZXR1cm4gZW1pdEVycm9yQW5kQXV0b0Nsb3NlKHNlbGYsIG5ldyBFcnJvcihtc2cpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZi5kZWNvZGVTdHJpbmdzKSB7XG4gICAgICAgIGlmICghc2VsZi5zdHJpY3RGaWxlTmFtZXMpIHtcbiAgICAgICAgICAvLyBhbGxvdyBiYWNrc2xhc2hcbiAgICAgICAgICBlbnRyeS5maWxlTmFtZSA9IGVudHJ5LmZpbGVOYW1lLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSB2YWxpZGF0ZUZpbGVOYW1lKGVudHJ5LmZpbGVOYW1lLCBzZWxmLnZhbGlkYXRlRmlsZU5hbWVPcHRpb25zKTtcbiAgICAgICAgaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSByZXR1cm4gZW1pdEVycm9yQW5kQXV0b0Nsb3NlKHNlbGYsIG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZW1pdChcImVudHJ5XCIsIGVudHJ5KTtcblxuICAgICAgaWYgKCFzZWxmLmxhenlFbnRyaWVzKSBzZWxmLl9yZWFkRW50cnkoKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5aaXBGaWxlLnByb3RvdHlwZS5vcGVuUmVhZFN0cmVhbSA9IGZ1bmN0aW9uKGVudHJ5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIC8vIHBhcmFtZXRlciB2YWxpZGF0aW9uXG4gIHZhciByZWxhdGl2ZVN0YXJ0ID0gMDtcbiAgdmFyIHJlbGF0aXZlRW5kID0gZW50cnkuY29tcHJlc3NlZFNpemU7XG4gIGlmIChjYWxsYmFjayA9PSBudWxsKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICAvLyB2YWxpZGF0ZSBvcHRpb25zIHRoYXQgdGhlIGNhbGxlciBoYXMgbm8gZXhjdXNlIHRvIGdldCB3cm9uZ1xuICAgIGlmIChvcHRpb25zLmRlY3J5cHQgIT0gbnVsbCkge1xuICAgICAgaWYgKCFlbnRyeS5pc0VuY3J5cHRlZCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMuZGVjcnlwdCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGVuY3J5cHRlZCBlbnRyaWVzXCIpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZGVjcnlwdCAhPT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgb3B0aW9ucy5kZWNyeXB0IHZhbHVlOiBcIiArIG9wdGlvbnMuZGVjcnlwdCk7XG4gICAgICBpZiAoZW50cnkuaXNDb21wcmVzc2VkKCkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGVjb21wcmVzcyAhPT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcihcImVudHJ5IGlzIGVuY3J5cHRlZCBhbmQgY29tcHJlc3NlZCwgYW5kIG9wdGlvbnMuZGVjb21wcmVzcyAhPT0gZmFsc2VcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmRlY29tcHJlc3MgIT0gbnVsbCkge1xuICAgICAgaWYgKCFlbnRyeS5pc0NvbXByZXNzZWQoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLmRlY29tcHJlc3MgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBjb21wcmVzc2VkIGVudHJpZXNcIik7XG4gICAgICB9XG4gICAgICBpZiAoIShvcHRpb25zLmRlY29tcHJlc3MgPT09IGZhbHNlIHx8IG9wdGlvbnMuZGVjb21wcmVzcyA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvcHRpb25zLmRlY29tcHJlc3MgdmFsdWU6IFwiICsgb3B0aW9ucy5kZWNvbXByZXNzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc3RhcnQgIT0gbnVsbCB8fCBvcHRpb25zLmVuZCAhPSBudWxsKSB7XG4gICAgICBpZiAoZW50cnkuaXNDb21wcmVzc2VkKCkgJiYgb3B0aW9ucy5kZWNvbXByZXNzICE9PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydC9lbmQgcmFuZ2Ugbm90IGFsbG93ZWQgZm9yIGNvbXByZXNzZWQgZW50cnkgd2l0aG91dCBvcHRpb25zLmRlY29tcHJlc3MgPT09IGZhbHNlXCIpO1xuICAgICAgfVxuICAgICAgaWYgKGVudHJ5LmlzRW5jcnlwdGVkKCkgJiYgb3B0aW9ucy5kZWNyeXB0ICE9PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydC9lbmQgcmFuZ2Ugbm90IGFsbG93ZWQgZm9yIGVuY3J5cHRlZCBlbnRyeSB3aXRob3V0IG9wdGlvbnMuZGVjcnlwdCA9PT0gZmFsc2VcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnN0YXJ0ICE9IG51bGwpIHtcbiAgICAgIHJlbGF0aXZlU3RhcnQgPSBvcHRpb25zLnN0YXJ0O1xuICAgICAgaWYgKHJlbGF0aXZlU3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLnN0YXJ0IDwgMFwiKTtcbiAgICAgIGlmIChyZWxhdGl2ZVN0YXJ0ID4gZW50cnkuY29tcHJlc3NlZFNpemUpIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMuc3RhcnQgPiBlbnRyeS5jb21wcmVzc2VkU2l6ZVwiKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZW5kICE9IG51bGwpIHtcbiAgICAgIHJlbGF0aXZlRW5kID0gb3B0aW9ucy5lbmQ7XG4gICAgICBpZiAocmVsYXRpdmVFbmQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLmVuZCA8IDBcIik7XG4gICAgICBpZiAocmVsYXRpdmVFbmQgPiBlbnRyeS5jb21wcmVzc2VkU2l6ZSkgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucy5lbmQgPiBlbnRyeS5jb21wcmVzc2VkU2l6ZVwiKTtcbiAgICAgIGlmIChyZWxhdGl2ZUVuZCA8IHJlbGF0aXZlU3RhcnQpIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMuZW5kIDwgb3B0aW9ucy5zdGFydFwiKTtcbiAgICB9XG4gIH1cbiAgLy8gYW55IGZ1cnRoZXIgZXJyb3JzIGNhbiBlaXRoZXIgYmUgY2F1c2VkIGJ5IHRoZSB6aXBmaWxlLFxuICAvLyBvciB3ZXJlIGludHJvZHVjZWQgaW4gYSBtaW5vciB2ZXJzaW9uIG9mIHlhdXpsLFxuICAvLyBzbyBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBjbGllbnQgcmF0aGVyIHRoYW4gdGhyb3duLlxuICBpZiAoIXNlbGYuaXNPcGVuKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiY2xvc2VkXCIpKTtcbiAgaWYgKGVudHJ5LmlzRW5jcnlwdGVkKCkpIHtcbiAgICBpZiAob3B0aW9ucy5kZWNyeXB0ICE9PSBmYWxzZSkgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcImVudHJ5IGlzIGVuY3J5cHRlZCwgYW5kIG9wdGlvbnMuZGVjcnlwdCAhPT0gZmFsc2VcIikpO1xuICB9XG4gIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBsb3NlIHRoZSBmZCBiZWZvcmUgd2Ugb3BlbiB0aGUgYWN0dWFsIHJlYWQgc3RyZWFtXG4gIHNlbGYucmVhZGVyLnJlZigpO1xuICB2YXIgYnVmZmVyID0gbmV3QnVmZmVyKDMwKTtcbiAgcmVhZEFuZEFzc2VydE5vRW9mKHNlbGYucmVhZGVyLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIGVudHJ5LnJlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciwgZnVuY3Rpb24oZXJyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgLy8gMCAtIExvY2FsIGZpbGUgaGVhZGVyIHNpZ25hdHVyZSA9IDB4MDQwMzRiNTBcbiAgICAgIHZhciBzaWduYXR1cmUgPSBidWZmZXIucmVhZFVJbnQzMkxFKDApO1xuICAgICAgaWYgKHNpZ25hdHVyZSAhPT0gMHgwNDAzNGI1MCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiaW52YWxpZCBsb2NhbCBmaWxlIGhlYWRlciBzaWduYXR1cmU6IDB4XCIgKyBzaWduYXR1cmUudG9TdHJpbmcoMTYpKSk7XG4gICAgICB9XG4gICAgICAvLyBhbGwgdGhpcyBzaG91bGQgYmUgcmVkdW5kYW50XG4gICAgICAvLyA0IC0gVmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAobWluaW11bSlcbiAgICAgIC8vIDYgLSBHZW5lcmFsIHB1cnBvc2UgYml0IGZsYWdcbiAgICAgIC8vIDggLSBDb21wcmVzc2lvbiBtZXRob2RcbiAgICAgIC8vIDEwIC0gRmlsZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lXG4gICAgICAvLyAxMiAtIEZpbGUgbGFzdCBtb2RpZmljYXRpb24gZGF0ZVxuICAgICAgLy8gMTQgLSBDUkMtMzJcbiAgICAgIC8vIDE4IC0gQ29tcHJlc3NlZCBzaXplXG4gICAgICAvLyAyMiAtIFVuY29tcHJlc3NlZCBzaXplXG4gICAgICAvLyAyNiAtIEZpbGUgbmFtZSBsZW5ndGggKG4pXG4gICAgICB2YXIgZmlsZU5hbWVMZW5ndGggPSBidWZmZXIucmVhZFVJbnQxNkxFKDI2KTtcbiAgICAgIC8vIDI4IC0gRXh0cmEgZmllbGQgbGVuZ3RoIChtKVxuICAgICAgdmFyIGV4dHJhRmllbGRMZW5ndGggPSBidWZmZXIucmVhZFVJbnQxNkxFKDI4KTtcbiAgICAgIC8vIDMwIC0gRmlsZSBuYW1lXG4gICAgICAvLyAzMCtuIC0gRXh0cmEgZmllbGRcbiAgICAgIHZhciBsb2NhbEZpbGVIZWFkZXJFbmQgPSBlbnRyeS5yZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgKyBidWZmZXIubGVuZ3RoICsgZmlsZU5hbWVMZW5ndGggKyBleHRyYUZpZWxkTGVuZ3RoO1xuICAgICAgdmFyIGRlY29tcHJlc3M7XG4gICAgICBpZiAoZW50cnkuY29tcHJlc3Npb25NZXRob2QgPT09IDApIHtcbiAgICAgICAgLy8gMCAtIFRoZSBmaWxlIGlzIHN0b3JlZCAobm8gY29tcHJlc3Npb24pXG4gICAgICAgIGRlY29tcHJlc3MgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkuY29tcHJlc3Npb25NZXRob2QgPT09IDgpIHtcbiAgICAgICAgLy8gOCAtIFRoZSBmaWxlIGlzIERlZmxhdGVkXG4gICAgICAgIGRlY29tcHJlc3MgPSBvcHRpb25zLmRlY29tcHJlc3MgIT0gbnVsbCA/IG9wdGlvbnMuZGVjb21wcmVzcyA6IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kOiBcIiArIGVudHJ5LmNvbXByZXNzaW9uTWV0aG9kKSk7XG4gICAgICB9XG4gICAgICB2YXIgZmlsZURhdGFTdGFydCA9IGxvY2FsRmlsZUhlYWRlckVuZDtcbiAgICAgIHZhciBmaWxlRGF0YUVuZCA9IGZpbGVEYXRhU3RhcnQgKyBlbnRyeS5jb21wcmVzc2VkU2l6ZTtcbiAgICAgIGlmIChlbnRyeS5jb21wcmVzc2VkU2l6ZSAhPT0gMCkge1xuICAgICAgICAvLyBib3VuZHMgY2hlY2sgbm93LCBiZWNhdXNlIHRoZSByZWFkIHN0cmVhbXMgd2lsbCBwcm9iYWJseSBub3QgY29tcGxhaW4gbG91ZCBlbm91Z2guXG4gICAgICAgIC8vIHNpbmNlIHdlJ3JlIGRlYWxpbmcgd2l0aCBhbiB1bnNpZ25lZCBvZmZzZXQgcGx1cyBhbiB1bnNpZ25lZCBzaXplLFxuICAgICAgICAvLyB3ZSBvbmx5IGhhdmUgMSB0aGluZyB0byBjaGVjayBmb3IuXG4gICAgICAgIGlmIChmaWxlRGF0YUVuZCA+IHNlbGYuZmlsZVNpemUpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiZmlsZSBkYXRhIG92ZXJmbG93cyBmaWxlIGJvdW5kczogXCIgK1xuICAgICAgICAgICAgICBmaWxlRGF0YVN0YXJ0ICsgXCIgKyBcIiArIGVudHJ5LmNvbXByZXNzZWRTaXplICsgXCIgPiBcIiArIHNlbGYuZmlsZVNpemUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHJlYWRTdHJlYW0gPSBzZWxmLnJlYWRlci5jcmVhdGVSZWFkU3RyZWFtKHtcbiAgICAgICAgc3RhcnQ6IGZpbGVEYXRhU3RhcnQgKyByZWxhdGl2ZVN0YXJ0LFxuICAgICAgICBlbmQ6IGZpbGVEYXRhU3RhcnQgKyByZWxhdGl2ZUVuZCxcbiAgICAgIH0pO1xuICAgICAgdmFyIGVuZHBvaW50U3RyZWFtID0gcmVhZFN0cmVhbTtcbiAgICAgIGlmIChkZWNvbXByZXNzKSB7XG4gICAgICAgIHZhciBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGluZmxhdGVGaWx0ZXIgPSB6bGliLmNyZWF0ZUluZmxhdGVSYXcoKTtcbiAgICAgICAgcmVhZFN0cmVhbS5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIC8vIHNldEltbWVkaWF0ZSBoZXJlIGJlY2F1c2UgZXJyb3JzIGNhbiBiZSBlbWl0dGVkIGR1cmluZyB0aGUgZmlyc3QgY2FsbCB0byBwaXBlKClcbiAgICAgICAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoIWRlc3Ryb3llZCkgaW5mbGF0ZUZpbHRlci5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRTdHJlYW0ucGlwZShpbmZsYXRlRmlsdGVyKTtcblxuICAgICAgICBpZiAoc2VsZi52YWxpZGF0ZUVudHJ5U2l6ZXMpIHtcbiAgICAgICAgICBlbmRwb2ludFN0cmVhbSA9IG5ldyBBc3NlcnRCeXRlQ291bnRTdHJlYW0oZW50cnkudW5jb21wcmVzc2VkU2l6ZSk7XG4gICAgICAgICAgaW5mbGF0ZUZpbHRlci5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgLy8gZm9yd2FyZCB6bGliIGVycm9ycyB0byB0aGUgY2xpZW50LXZpc2libGUgc3RyZWFtXG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmICghZGVzdHJveWVkKSBlbmRwb2ludFN0cmVhbS5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGluZmxhdGVGaWx0ZXIucGlwZShlbmRwb2ludFN0cmVhbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhlIHpsaWIgZmlsdGVyIGlzIHRoZSBjbGllbnQtdmlzaWJsZSBzdHJlYW1cbiAgICAgICAgICBlbmRwb2ludFN0cmVhbSA9IGluZmxhdGVGaWx0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcyBpcyBwYXJ0IG9mIHlhdXpsJ3MgQVBJLCBzbyBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBvbiB0aGUgY2xpZW50LXZpc2libGUgc3RyZWFtXG4gICAgICAgIGVuZHBvaW50U3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBkZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChpbmZsYXRlRmlsdGVyICE9PSBlbmRwb2ludFN0cmVhbSkgaW5mbGF0ZUZpbHRlci51bnBpcGUoZW5kcG9pbnRTdHJlYW0pO1xuICAgICAgICAgIHJlYWRTdHJlYW0udW5waXBlKGluZmxhdGVGaWx0ZXIpO1xuICAgICAgICAgIC8vIFRPRE86IHRoZSBpbmZsYXRlRmlsdGVyIG1heSBjYXVzZSBhIG1lbW9yeSBsZWFrLiBzZWUgSXNzdWUgIzI3LlxuICAgICAgICAgIHJlYWRTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgZW5kcG9pbnRTdHJlYW0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZWxmLnJlYWRlci51bnJlZigpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBFbnRyeSgpIHtcbn1cbkVudHJ5LnByb3RvdHlwZS5nZXRMYXN0TW9kRGF0ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZG9zRGF0ZVRpbWVUb0RhdGUodGhpcy5sYXN0TW9kRmlsZURhdGUsIHRoaXMubGFzdE1vZEZpbGVUaW1lKTtcbn07XG5FbnRyeS5wcm90b3R5cGUuaXNFbmNyeXB0ZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICh0aGlzLmdlbmVyYWxQdXJwb3NlQml0RmxhZyAmIDB4MSkgIT09IDA7XG59O1xuRW50cnkucHJvdG90eXBlLmlzQ29tcHJlc3NlZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jb21wcmVzc2lvbk1ldGhvZCA9PT0gODtcbn07XG5cbmZ1bmN0aW9uIGRvc0RhdGVUaW1lVG9EYXRlKGRhdGUsIHRpbWUpIHtcbiAgdmFyIGRheSA9IGRhdGUgJiAweDFmOyAvLyAxLTMxXG4gIHZhciBtb250aCA9IChkYXRlID4+IDUgJiAweGYpIC0gMTsgLy8gMS0xMiwgMC0xMVxuICB2YXIgeWVhciA9IChkYXRlID4+IDkgJiAweDdmKSArIDE5ODA7IC8vIDAtMTI4LCAxOTgwLTIxMDhcblxuICB2YXIgbWlsbGlzZWNvbmQgPSAwO1xuICB2YXIgc2Vjb25kID0gKHRpbWUgJiAweDFmKSAqIDI7IC8vIDAtMjksIDAtNTggKGV2ZW4gbnVtYmVycylcbiAgdmFyIG1pbnV0ZSA9IHRpbWUgPj4gNSAmIDB4M2Y7IC8vIDAtNTlcbiAgdmFyIGhvdXIgPSB0aW1lID4+IDExICYgMHgxZjsgLy8gMC0yM1xuXG4gIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZpbGVOYW1lKGZpbGVOYW1lKSB7XG4gIGlmIChmaWxlTmFtZS5pbmRleE9mKFwiXFxcXFwiKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gXCJpbnZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZU5hbWU6IFwiICsgZmlsZU5hbWU7XG4gIH1cbiAgaWYgKC9eW2EtekEtWl06Ly50ZXN0KGZpbGVOYW1lKSB8fCAvXlxcLy8udGVzdChmaWxlTmFtZSkpIHtcbiAgICByZXR1cm4gXCJhYnNvbHV0ZSBwYXRoOiBcIiArIGZpbGVOYW1lO1xuICB9XG4gIGlmIChmaWxlTmFtZS5zcGxpdChcIi9cIikuaW5kZXhPZihcIi4uXCIpICE9PSAtMSkge1xuICAgIHJldHVybiBcImludmFsaWQgcmVsYXRpdmUgcGF0aDogXCIgKyBmaWxlTmFtZTtcbiAgfVxuICAvLyBhbGwgZ29vZFxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVhZEFuZEFzc2VydE5vRW9mKHJlYWRlciwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAvLyBmcy5yZWFkIHdpbGwgdGhyb3cgYW4gb3V0LW9mLWJvdW5kcyBlcnJvciBpZiB5b3UgdHJ5IHRvIHJlYWQgMCBieXRlcyBmcm9tIGEgMCBieXRlIGZpbGVcbiAgICByZXR1cm4gc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkgeyBjYWxsYmFjayhudWxsLCBuZXdCdWZmZXIoMCkpOyB9KTtcbiAgfVxuICByZWFkZXIucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgZnVuY3Rpb24oZXJyLCBieXRlc1JlYWQpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBpZiAoYnl0ZXNSZWFkIDwgbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwidW5leHBlY3RlZCBFT0ZcIikpO1xuICAgIH1cbiAgICBjYWxsYmFjaygpO1xuICB9KTtcbn1cblxudXRpbC5pbmhlcml0cyhBc3NlcnRCeXRlQ291bnRTdHJlYW0sIFRyYW5zZm9ybSk7XG5mdW5jdGlvbiBBc3NlcnRCeXRlQ291bnRTdHJlYW0oYnl0ZUNvdW50KSB7XG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMpO1xuICB0aGlzLmFjdHVhbEJ5dGVDb3VudCA9IDA7XG4gIHRoaXMuZXhwZWN0ZWRCeXRlQ291bnQgPSBieXRlQ291bnQ7XG59XG5Bc3NlcnRCeXRlQ291bnRTdHJlYW0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuYWN0dWFsQnl0ZUNvdW50ICs9IGNodW5rLmxlbmd0aDtcbiAgaWYgKHRoaXMuYWN0dWFsQnl0ZUNvdW50ID4gdGhpcy5leHBlY3RlZEJ5dGVDb3VudCkge1xuICAgIHZhciBtc2cgPSBcInRvbyBtYW55IGJ5dGVzIGluIHRoZSBzdHJlYW0uIGV4cGVjdGVkIFwiICsgdGhpcy5leHBlY3RlZEJ5dGVDb3VudCArIFwiLiBnb3QgYXQgbGVhc3QgXCIgKyB0aGlzLmFjdHVhbEJ5dGVDb3VudDtcbiAgICByZXR1cm4gY2IobmV3IEVycm9yKG1zZykpO1xuICB9XG4gIGNiKG51bGwsIGNodW5rKTtcbn07XG5Bc3NlcnRCeXRlQ291bnRTdHJlYW0ucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uKGNiKSB7XG4gIGlmICh0aGlzLmFjdHVhbEJ5dGVDb3VudCA8IHRoaXMuZXhwZWN0ZWRCeXRlQ291bnQpIHtcbiAgICB2YXIgbXNnID0gXCJub3QgZW5vdWdoIGJ5dGVzIGluIHRoZSBzdHJlYW0uIGV4cGVjdGVkIFwiICsgdGhpcy5leHBlY3RlZEJ5dGVDb3VudCArIFwiLiBnb3Qgb25seSBcIiArIHRoaXMuYWN0dWFsQnl0ZUNvdW50O1xuICAgIHJldHVybiBjYihuZXcgRXJyb3IobXNnKSk7XG4gIH1cbiAgY2IoKTtcbn07XG5cbnV0aWwuaW5oZXJpdHMoUmFuZG9tQWNjZXNzUmVhZGVyLCBFdmVudEVtaXR0ZXIpO1xuZnVuY3Rpb24gUmFuZG9tQWNjZXNzUmVhZGVyKCkge1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcbiAgdGhpcy5yZWZDb3VudCA9IDA7XG59XG5SYW5kb21BY2Nlc3NSZWFkZXIucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJlZkNvdW50ICs9IDE7XG59O1xuUmFuZG9tQWNjZXNzUmVhZGVyLnByb3RvdHlwZS51bnJlZiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYucmVmQ291bnQgLT0gMTtcblxuICBpZiAoc2VsZi5yZWZDb3VudCA+IDApIHJldHVybjtcbiAgaWYgKHNlbGYucmVmQ291bnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHVucmVmXCIpO1xuXG4gIHNlbGYuY2xvc2Uob25DbG9zZURvbmUpO1xuXG4gIGZ1bmN0aW9uIG9uQ2xvc2VEb25lKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICBzZWxmLmVtaXQoJ2Nsb3NlJyk7XG4gIH1cbn07XG5SYW5kb21BY2Nlc3NSZWFkZXIucHJvdG90eXBlLmNyZWF0ZVJlYWRTdHJlYW0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHZhciBzdGFydCA9IG9wdGlvbnMuc3RhcnQ7XG4gIHZhciBlbmQgPSBvcHRpb25zLmVuZDtcbiAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICB2YXIgZW1wdHlTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICBlbXB0eVN0cmVhbS5lbmQoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZW1wdHlTdHJlYW07XG4gIH1cbiAgdmFyIHN0cmVhbSA9IHRoaXMuX3JlYWRTdHJlYW1Gb3JSYW5nZShzdGFydCwgZW5kKTtcblxuICB2YXIgZGVzdHJveWVkID0gZmFsc2U7XG4gIHZhciByZWZVbnJlZkZpbHRlciA9IG5ldyBSZWZVbnJlZkZpbHRlcih0aGlzKTtcbiAgc3RyZWFtLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24oZXJyKSB7XG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFkZXN0cm95ZWQpIHJlZlVucmVmRmlsdGVyLmVtaXQoXCJlcnJvclwiLCBlcnIpO1xuICAgIH0pO1xuICB9KTtcbiAgcmVmVW5yZWZGaWx0ZXIuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIHN0cmVhbS51bnBpcGUocmVmVW5yZWZGaWx0ZXIpO1xuICAgIHJlZlVucmVmRmlsdGVyLnVucmVmKCk7XG4gICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgfTtcblxuICB2YXIgYnl0ZUNvdW50ZXIgPSBuZXcgQXNzZXJ0Qnl0ZUNvdW50U3RyZWFtKGVuZCAtIHN0YXJ0KTtcbiAgcmVmVW5yZWZGaWx0ZXIub24oXCJlcnJvclwiLCBmdW5jdGlvbihlcnIpIHtcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIWRlc3Ryb3llZCkgYnl0ZUNvdW50ZXIuZW1pdChcImVycm9yXCIsIGVycik7XG4gICAgfSk7XG4gIH0pO1xuICBieXRlQ291bnRlci5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgZGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZWZVbnJlZkZpbHRlci51bnBpcGUoYnl0ZUNvdW50ZXIpO1xuICAgIHJlZlVucmVmRmlsdGVyLmRlc3Ryb3koKTtcbiAgfTtcblxuICByZXR1cm4gc3RyZWFtLnBpcGUocmVmVW5yZWZGaWx0ZXIpLnBpcGUoYnl0ZUNvdW50ZXIpO1xufTtcblJhbmRvbUFjY2Vzc1JlYWRlci5wcm90b3R5cGUuX3JlYWRTdHJlYW1Gb3JSYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xufTtcblJhbmRvbUFjY2Vzc1JlYWRlci5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaykge1xuICB2YXIgcmVhZFN0cmVhbSA9IHRoaXMuY3JlYXRlUmVhZFN0cmVhbSh7c3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uICsgbGVuZ3RofSk7XG4gIHZhciB3cml0ZVN0cmVhbSA9IG5ldyBXcml0YWJsZSgpO1xuICB2YXIgd3JpdHRlbiA9IDA7XG4gIHdyaXRlU3RyZWFtLl93cml0ZSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICBjaHVuay5jb3B5KGJ1ZmZlciwgb2Zmc2V0ICsgd3JpdHRlbiwgMCwgY2h1bmsubGVuZ3RoKTtcbiAgICB3cml0dGVuICs9IGNodW5rLmxlbmd0aDtcbiAgICBjYigpO1xuICB9O1xuICB3cml0ZVN0cmVhbS5vbihcImZpbmlzaFwiLCBjYWxsYmFjayk7XG4gIHJlYWRTdHJlYW0ub24oXCJlcnJvclwiLCBmdW5jdGlvbihlcnJvcikge1xuICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgfSk7XG4gIHJlYWRTdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSk7XG59O1xuUmFuZG9tQWNjZXNzUmVhZGVyLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG59O1xuXG51dGlsLmluaGVyaXRzKFJlZlVucmVmRmlsdGVyLCBQYXNzVGhyb3VnaCk7XG5mdW5jdGlvbiBSZWZVbnJlZkZpbHRlcihjb250ZXh0KSB7XG4gIFBhc3NUaHJvdWdoLmNhbGwodGhpcyk7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuY29udGV4dC5yZWYoKTtcbiAgdGhpcy51bnJlZmZlZFlldCA9IGZhbHNlO1xufVxuUmVmVW5yZWZGaWx0ZXIucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uKGNiKSB7XG4gIHRoaXMudW5yZWYoKTtcbiAgY2IoKTtcbn07XG5SZWZVbnJlZkZpbHRlci5wcm90b3R5cGUudW5yZWYgPSBmdW5jdGlvbihjYikge1xuICBpZiAodGhpcy51bnJlZmZlZFlldCkgcmV0dXJuO1xuICB0aGlzLnVucmVmZmVkWWV0ID0gdHJ1ZTtcbiAgdGhpcy5jb250ZXh0LnVucmVmKCk7XG59O1xuXG52YXIgY3A0MzcgPSAnXFx1MDAwMOKYuuKYu+KZpeKZpuKZo+KZoOKAouKXmOKXi+KXmeKZguKZgOKZquKZq+KYvOKWuuKXhOKGleKAvMK2wqfilqzihqjihpHihpPihpLihpDiiJ/ihpTilrLilrwgIVwiIyQlJlxcJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fuKMgsOHw7zDqcOiw6TDoMOlw6fDqsOrw6jDr8Ouw6zDhMOFw4nDpsOGw7TDtsOyw7vDucO/w5bDnMKiwqPCpeKCp8aSw6HDrcOzw7rDscORwqrCusK/4oyQwqzCvcK8wqHCq8K74paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAzrHDn86Tz4DOo8+DwrXPhM6mzpjOqc604oiez4bOteKIqeKJocKx4oml4omk4oyg4oyhw7fiiYjCsOKImcK34oia4oG/wrLilqDCoCc7XG5mdW5jdGlvbiBkZWNvZGVCdWZmZXIoYnVmZmVyLCBzdGFydCwgZW5kLCBpc1V0ZjgpIHtcbiAgaWYgKGlzVXRmOCkge1xuICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoXCJ1dGY4XCIsIHN0YXJ0LCBlbmQpO1xuICB9IGVsc2Uge1xuICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICByZXN1bHQgKz0gY3A0MzdbYnVmZmVyW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkVUludDY0TEUoYnVmZmVyLCBvZmZzZXQpIHtcbiAgLy8gdGhlcmUgaXMgbm8gbmF0aXZlIGZ1bmN0aW9uIGZvciB0aGlzLCBiZWNhdXNlIHdlIGNhbid0IGFjdHVhbGx5IHN0b3JlIDY0LWJpdCBpbnRlZ2VycyBwcmVjaXNlbHkuXG4gIC8vIGFmdGVyIDUzIGJpdHMsIEphdmFTY3JpcHQncyBOdW1iZXIgdHlwZSAoSUVFRSA3NTQgZG91YmxlKSBjYW4ndCBzdG9yZSBpbmRpdmlkdWFsIGludGVnZXJzIGFueW1vcmUuXG4gIC8vIGJ1dCBzaW5jZSA1MyBiaXRzIGlzIGEgd2hvbGUgbG90IG1vcmUgdGhhbiAzMiBiaXRzLCB3ZSBkbyBvdXIgYmVzdCBhbnl3YXkuXG4gIHZhciBsb3dlcjMyID0gYnVmZmVyLnJlYWRVSW50MzJMRShvZmZzZXQpO1xuICB2YXIgdXBwZXIzMiA9IGJ1ZmZlci5yZWFkVUludDMyTEUob2Zmc2V0ICsgNCk7XG4gIC8vIHdlIGNhbid0IHVzZSBiaXRzaGlmdGluZyBoZXJlLCBiZWNhdXNlIEphdmFTY3JpcHQgYml0c2hpZnRpbmcgb25seSB3b3JrcyBvbiAzMi1iaXQgaW50ZWdlcnMuXG4gIHJldHVybiB1cHBlcjMyICogMHgxMDAwMDAwMDAgKyBsb3dlcjMyO1xuICAvLyBhcyBsb25nIGFzIHdlJ3JlIGJvdW5kcyBjaGVja2luZyB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gYWdhaW5zdCB0aGUgdG90YWwgZmlsZSBzaXplLFxuICAvLyB3ZSdsbCBjYXRjaCBhbnkgb3ZlcmZsb3cgZXJyb3JzLCBiZWNhdXNlIHdlIGFscmVhZHkgbWFkZSBzdXJlIHRoZSB0b3RhbCBmaWxlIHNpemUgd2FzIHdpdGhpbiByZWFzb24uXG59XG5cbi8vIE5vZGUgMTAgZGVwcmVjYXRlZCBuZXcgQnVmZmVyKCkuXG52YXIgbmV3QnVmZmVyO1xuaWYgKHR5cGVvZiBCdWZmZXIuYWxsb2NVbnNhZmUgPT09IFwiZnVuY3Rpb25cIikge1xuICBuZXdCdWZmZXIgPSBmdW5jdGlvbihsZW4pIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbik7XG4gIH07XG59IGVsc2Uge1xuICBuZXdCdWZmZXIgPSBmdW5jdGlvbihsZW4pIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihsZW4pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q2FsbGJhY2soZXJyKSB7XG4gIGlmIChlcnIpIHRocm93IGVycjtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImFzc2VydFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJidWZmZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb25zdGFudHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImRuc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJldmVudHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnMvcHJvbWlzZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiaHR0cFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJodHRwc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJuZXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZTphc3NlcnQvc3RyaWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlOmV2ZW50c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlOmZzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGU6cGF0aFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlOnByb2Nlc3NcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZTp0ZXN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm9zXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicHJvY2Vzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFkbGluZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzdHJlYW1cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidGxzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInR0eVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1cmxcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidXRpbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ6bGliXCIpOyIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYWxpZ24gPSB7XG4gICAgcmlnaHQ6IGFsaWduUmlnaHQsXG4gICAgY2VudGVyOiBhbGlnbkNlbnRlclxufTtcbmNvbnN0IHRvcCA9IDA7XG5jb25zdCByaWdodCA9IDE7XG5jb25zdCBib3R0b20gPSAyO1xuY29uc3QgbGVmdCA9IDM7XG5jbGFzcyBVSSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoO1xuICAgICAgICB0aGlzLndyYXAgPSAoX2EgPSBvcHRzLndyYXApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRydWU7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgIH1cbiAgICBzcGFuKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuZGl2KC4uLmFyZ3MpO1xuICAgICAgICBjb2xzLnNwYW4gPSB0cnVlO1xuICAgIH1cbiAgICByZXNldE91dHB1dCgpIHtcbiAgICAgICAgdGhpcy5yb3dzID0gW107XG4gICAgfVxuICAgIGRpdiguLi5hcmdzKSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXYoJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndyYXAgJiYgdGhpcy5zaG91bGRBcHBseUxheW91dERTTCguLi5hcmdzKSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5TGF5b3V0RFNMKGFyZ3NbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbHMgPSBhcmdzLm1hcChhcmcgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sRnJvbVN0cmluZyhhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucm93cy5wdXNoKGNvbHMpO1xuICAgICAgICByZXR1cm4gY29scztcbiAgICB9XG4gICAgc2hvdWxkQXBwbHlMYXlvdXREU0woLi4uYXJncykge1xuICAgICAgICByZXR1cm4gYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAvW1xcdFxcbl0vLnRlc3QoYXJnc1swXSk7XG4gICAgfVxuICAgIGFwcGx5TGF5b3V0RFNMKHN0cikge1xuICAgICAgICBjb25zdCByb3dzID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAocm93ID0+IHJvdy5zcGxpdCgnXFx0JykpO1xuICAgICAgICBsZXQgbGVmdENvbHVtbldpZHRoID0gMDtcbiAgICAgICAgLy8gc2ltcGxlIGhldXJpc3RpYyBmb3IgbGF5b3V0LCBtYWtlIHN1cmUgdGhlXG4gICAgICAgIC8vIHNlY29uZCBjb2x1bW4gbGluZXMgdXAgYWxvbmcgdGhlIGxlZnQtaGFuZC5cbiAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZpcnN0IGNvbHVtbiB0byB0YWtlIHVwIG1vcmVcbiAgICAgICAgLy8gdGhhbiA1MCUgb2YgdGhlIHNjcmVlbi5cbiAgICAgICAgcm93cy5mb3JFYWNoKGNvbHVtbnMgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID4gMSAmJiBtaXhpbi5zdHJpbmdXaWR0aChjb2x1bW5zWzBdKSA+IGxlZnRDb2x1bW5XaWR0aCkge1xuICAgICAgICAgICAgICAgIGxlZnRDb2x1bW5XaWR0aCA9IE1hdGgubWluKE1hdGguZmxvb3IodGhpcy53aWR0aCAqIDAuNSksIG1peGluLnN0cmluZ1dpZHRoKGNvbHVtbnNbMF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGdlbmVyYXRlIGEgdGFibGU6XG4gICAgICAgIC8vICByZXBsYWNpbmcgJyAnIHdpdGggcGFkZGluZyBjYWxjdWxhdGlvbnMuXG4gICAgICAgIC8vICB1c2luZyB0aGUgYWxnb3JpdGhtaWNhbGx5IGdlbmVyYXRlZCB3aWR0aC5cbiAgICAgICAgcm93cy5mb3JFYWNoKGNvbHVtbnMgPT4ge1xuICAgICAgICAgICAgdGhpcy5kaXYoLi4uY29sdW1ucy5tYXAoKHIsIGkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiByLnRyaW0oKSxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogdGhpcy5tZWFzdXJlUGFkZGluZyhyKSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IChpID09PSAwICYmIGNvbHVtbnMubGVuZ3RoID4gMSkgPyBsZWZ0Q29sdW1uV2lkdGggOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93c1t0aGlzLnJvd3MubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIGNvbEZyb21TdHJpbmcodGV4dCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHBhZGRpbmc6IHRoaXMubWVhc3VyZVBhZGRpbmcodGV4dClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgbWVhc3VyZVBhZGRpbmcoc3RyKSB7XG4gICAgICAgIC8vIG1lYXN1cmUgcGFkZGluZyB3aXRob3V0IGFuc2kgZXNjYXBlIGNvZGVzXG4gICAgICAgIGNvbnN0IG5vQW5zaSA9IG1peGluLnN0cmlwQW5zaShzdHIpO1xuICAgICAgICByZXR1cm4gWzAsIG5vQW5zaS5tYXRjaCgvXFxzKiQvKVswXS5sZW5ndGgsIDAsIG5vQW5zaS5tYXRjaCgvXlxccyovKVswXS5sZW5ndGhdO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICAgICAgdGhpcy5yb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICAgIHRoaXMucm93VG9TdHJpbmcocm93LCBsaW5lcyk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBkb24ndCBkaXNwbGF5IGFueSBsaW5lcyB3aXRoIHRoZVxuICAgICAgICAvLyBoaWRkZW4gZmxhZyBzZXQuXG4gICAgICAgIHJldHVybiBsaW5lc1xuICAgICAgICAgICAgLmZpbHRlcihsaW5lID0+ICFsaW5lLmhpZGRlbilcbiAgICAgICAgICAgIC5tYXAobGluZSA9PiBsaW5lLnRleHQpXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuICAgIHJvd1RvU3RyaW5nKHJvdywgbGluZXMpIHtcbiAgICAgICAgdGhpcy5yYXN0ZXJpemUocm93KS5mb3JFYWNoKChycm93LCByKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RyID0gJyc7XG4gICAgICAgICAgICBycm93LmZvckVhY2goKGNvbCwgYykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGggfSA9IHJvd1tjXTsgLy8gdGhlIHdpZHRoIHdpdGggcGFkZGluZy5cbiAgICAgICAgICAgICAgICBjb25zdCB3cmFwV2lkdGggPSB0aGlzLm5lZ2F0ZVBhZGRpbmcocm93W2NdKTsgLy8gdGhlIHdpZHRoIHdpdGhvdXQgcGFkZGluZy5cbiAgICAgICAgICAgICAgICBsZXQgdHMgPSBjb2w7IC8vIHRlbXBvcmFyeSBzdHJpbmcgdXNlZCBkdXJpbmcgYWxpZ25tZW50L3BhZGRpbmcuXG4gICAgICAgICAgICAgICAgaWYgKHdyYXBXaWR0aCA+IG1peGluLnN0cmluZ1dpZHRoKGNvbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHMgKz0gJyAnLnJlcGVhdCh3cmFwV2lkdGggLSBtaXhpbi5zdHJpbmdXaWR0aChjb2wpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYWxpZ24gdGhlIHN0cmluZyB3aXRoaW4gaXRzIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBpZiAocm93W2NdLmFsaWduICYmIHJvd1tjXS5hbGlnbiAhPT0gJ2xlZnQnICYmIHRoaXMud3JhcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbiA9IGFsaWduW3Jvd1tjXS5hbGlnbl07XG4gICAgICAgICAgICAgICAgICAgIHRzID0gZm4odHMsIHdyYXBXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaXhpbi5zdHJpbmdXaWR0aCh0cykgPCB3cmFwV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRzICs9ICcgJy5yZXBlYXQoKHdpZHRoIHx8IDApIC0gbWl4aW4uc3RyaW5nV2lkdGgodHMpIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYXBwbHkgYm9yZGVyIGFuZCBwYWRkaW5nIHRvIHN0cmluZy5cbiAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gcm93W2NdLnBhZGRpbmcgfHwgWzAsIDAsIDAsIDBdO1xuICAgICAgICAgICAgICAgIGlmIChwYWRkaW5nW2xlZnRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSAnICcucmVwZWF0KHBhZGRpbmdbbGVmdF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHIgKz0gYWRkQm9yZGVyKHJvd1tjXSwgdHMsICd8ICcpO1xuICAgICAgICAgICAgICAgIHN0ciArPSB0cztcbiAgICAgICAgICAgICAgICBzdHIgKz0gYWRkQm9yZGVyKHJvd1tjXSwgdHMsICcgfCcpO1xuICAgICAgICAgICAgICAgIGlmIChwYWRkaW5nW3JpZ2h0XSkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnLnJlcGVhdChwYWRkaW5nW3JpZ2h0XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIHByaW9yIHJvdyBpcyBzcGFuLCB0cnkgdG8gcmVuZGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcm93IG9uIHRoZSBwcmlvciBsaW5lLlxuICAgICAgICAgICAgICAgIGlmIChyID09PSAwICYmIGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gdGhpcy5yZW5kZXJJbmxpbmUoc3RyLCBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAgICAgICAgICAgIGxpbmVzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRleHQ6IHN0ci5yZXBsYWNlKC8gKyQvLCAnJyksXG4gICAgICAgICAgICAgICAgc3Bhbjogcm93LnNwYW5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH1cbiAgICAvLyBpZiB0aGUgZnVsbCAnc291cmNlJyBjYW4gcmVuZGVyIGluXG4gICAgLy8gdGhlIHRhcmdldCBsaW5lLCBkbyBzby5cbiAgICByZW5kZXJJbmxpbmUoc291cmNlLCBwcmV2aW91c0xpbmUpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBzb3VyY2UubWF0Y2goL14gKi8pO1xuICAgICAgICBjb25zdCBsZWFkaW5nV2hpdGVzcGFjZSA9IG1hdGNoID8gbWF0Y2hbMF0ubGVuZ3RoIDogMDtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcHJldmlvdXNMaW5lLnRleHQ7XG4gICAgICAgIGNvbnN0IHRhcmdldFRleHRXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHRhcmdldC50cmltUmlnaHQoKSk7XG4gICAgICAgIGlmICghcHJldmlvdXNMaW5lLnNwYW4pIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgd2UncmUgbm90IGFwcGx5aW5nIHdyYXBwaW5nIGxvZ2ljLFxuICAgICAgICAvLyBqdXN0IGFsd2F5cyBhcHBlbmQgdG8gdGhlIHNwYW4uXG4gICAgICAgIGlmICghdGhpcy53cmFwKSB7XG4gICAgICAgICAgICBwcmV2aW91c0xpbmUuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQgKyBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlIDwgdGFyZ2V0VGV4dFdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzTGluZS5oaWRkZW4gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGFyZ2V0LnRyaW1SaWdodCgpICsgJyAnLnJlcGVhdChsZWFkaW5nV2hpdGVzcGFjZSAtIHRhcmdldFRleHRXaWR0aCkgKyBzb3VyY2UudHJpbUxlZnQoKTtcbiAgICB9XG4gICAgcmFzdGVyaXplKHJvdykge1xuICAgICAgICBjb25zdCBycm93cyA9IFtdO1xuICAgICAgICBjb25zdCB3aWR0aHMgPSB0aGlzLmNvbHVtbldpZHRocyhyb3cpO1xuICAgICAgICBsZXQgd3JhcHBlZDtcbiAgICAgICAgLy8gd29yZCB3cmFwIGFsbCBjb2x1bW5zLCBhbmQgY3JlYXRlXG4gICAgICAgIC8vIGEgZGF0YS1zdHJ1Y3R1cmUgdGhhdCBpcyBlYXN5IHRvIHJhc3Rlcml6ZS5cbiAgICAgICAgcm93LmZvckVhY2goKGNvbCwgYykgPT4ge1xuICAgICAgICAgICAgLy8gbGVhdmUgcm9vbSBmb3IgbGVmdCBhbmQgcmlnaHQgcGFkZGluZy5cbiAgICAgICAgICAgIGNvbC53aWR0aCA9IHdpZHRoc1tjXTtcbiAgICAgICAgICAgIGlmICh0aGlzLndyYXApIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkID0gbWl4aW4ud3JhcChjb2wudGV4dCwgdGhpcy5uZWdhdGVQYWRkaW5nKGNvbCksIHsgaGFyZDogdHJ1ZSB9KS5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkID0gY29sLnRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnVuc2hpZnQoJy4nICsgJy0nLnJlcGVhdCh0aGlzLm5lZ2F0ZVBhZGRpbmcoY29sKSArIDIpICsgJy4nKTtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnB1c2goXCInXCIgKyAnLScucmVwZWF0KHRoaXMubmVnYXRlUGFkZGluZyhjb2wpICsgMikgKyBcIidcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdG9wIGFuZCBib3R0b20gcGFkZGluZy5cbiAgICAgICAgICAgIGlmIChjb2wucGFkZGluZykge1xuICAgICAgICAgICAgICAgIHdyYXBwZWQudW5zaGlmdCguLi5uZXcgQXJyYXkoY29sLnBhZGRpbmdbdG9wXSB8fCAwKS5maWxsKCcnKSk7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC5wdXNoKC4uLm5ldyBBcnJheShjb2wucGFkZGluZ1tib3R0b21dIHx8IDApLmZpbGwoJycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdyYXBwZWQuZm9yRWFjaCgoc3RyLCByKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFycm93c1tyXSkge1xuICAgICAgICAgICAgICAgICAgICBycm93cy5wdXNoKFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcnJvdyA9IHJyb3dzW3JdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChycm93W2ldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJyb3cucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcnJvdy5wdXNoKHN0cik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBycm93cztcbiAgICB9XG4gICAgbmVnYXRlUGFkZGluZyhjb2wpIHtcbiAgICAgICAgbGV0IHdyYXBXaWR0aCA9IGNvbC53aWR0aCB8fCAwO1xuICAgICAgICBpZiAoY29sLnBhZGRpbmcpIHtcbiAgICAgICAgICAgIHdyYXBXaWR0aCAtPSAoY29sLnBhZGRpbmdbbGVmdF0gfHwgMCkgKyAoY29sLnBhZGRpbmdbcmlnaHRdIHx8IDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgICAgICB3cmFwV2lkdGggLT0gNDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JhcFdpZHRoO1xuICAgIH1cbiAgICBjb2x1bW5XaWR0aHMocm93KSB7XG4gICAgICAgIGlmICghdGhpcy53cmFwKSB7XG4gICAgICAgICAgICByZXR1cm4gcm93Lm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2wud2lkdGggfHwgbWl4aW4uc3RyaW5nV2lkdGgoY29sLnRleHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVuc2V0ID0gcm93Lmxlbmd0aDtcbiAgICAgICAgbGV0IHJlbWFpbmluZ1dpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgLy8gY29sdW1uIHdpZHRocyBjYW4gYmUgc2V0IGluIGNvbmZpZy5cbiAgICAgICAgY29uc3Qgd2lkdGhzID0gcm93Lm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC53aWR0aCkge1xuICAgICAgICAgICAgICAgIHVuc2V0LS07XG4gICAgICAgICAgICAgICAgcmVtYWluaW5nV2lkdGggLT0gY29sLndpZHRoO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2wud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gYW55IHVuc2V0IHdpZHRocyBzaG91bGQgYmUgY2FsY3VsYXRlZC5cbiAgICAgICAgY29uc3QgdW5zZXRXaWR0aCA9IHVuc2V0ID8gTWF0aC5mbG9vcihyZW1haW5pbmdXaWR0aCAvIHVuc2V0KSA6IDA7XG4gICAgICAgIHJldHVybiB3aWR0aHMubWFwKCh3LCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAodyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHVuc2V0V2lkdGgsIF9taW5XaWR0aChyb3dbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3O1xuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRCb3JkZXIoY29sLCB0cywgc3R5bGUpIHtcbiAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICBpZiAoL1suJ10tK1suJ10vLnRlc3QodHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRzLnRyaW0oKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyAgJztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuLy8gY2FsY3VsYXRlcyB0aGUgbWluaW11bSB3aWR0aCBvZlxuLy8gYSBjb2x1bW4sIGJhc2VkIG9uIHBhZGRpbmcgcHJlZmVyZW5jZXMuXG5mdW5jdGlvbiBfbWluV2lkdGgoY29sKSB7XG4gICAgY29uc3QgcGFkZGluZyA9IGNvbC5wYWRkaW5nIHx8IFtdO1xuICAgIGNvbnN0IG1pbldpZHRoID0gMSArIChwYWRkaW5nW2xlZnRdIHx8IDApICsgKHBhZGRpbmdbcmlnaHRdIHx8IDApO1xuICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgIHJldHVybiBtaW5XaWR0aCArIDQ7XG4gICAgfVxuICAgIHJldHVybiBtaW5XaWR0aDtcbn1cbmZ1bmN0aW9uIGdldFdpbmRvd1dpZHRoKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkZXBlbmRzIG9uIHRlcm1pbmFsICovXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnN0ZG91dCAmJiBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zO1xuICAgIH1cbiAgICByZXR1cm4gODA7XG59XG5mdW5jdGlvbiBhbGlnblJpZ2h0KHN0ciwgd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgIGNvbnN0IHN0cldpZHRoID0gbWl4aW4uc3RyaW5nV2lkdGgoc3RyKTtcbiAgICBpZiAoc3RyV2lkdGggPCB3aWR0aCkge1xuICAgICAgICByZXR1cm4gJyAnLnJlcGVhdCh3aWR0aCAtIHN0cldpZHRoKSArIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cbmZ1bmN0aW9uIGFsaWduQ2VudGVyKHN0ciwgd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgIGNvbnN0IHN0cldpZHRoID0gbWl4aW4uc3RyaW5nV2lkdGgoc3RyKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChzdHJXaWR0aCA+PSB3aWR0aCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICByZXR1cm4gJyAnLnJlcGVhdCgod2lkdGggLSBzdHJXaWR0aCkgPj4gMSkgKyBzdHI7XG59XG5sZXQgbWl4aW47XG5mdW5jdGlvbiBjbGl1aShvcHRzLCBfbWl4aW4pIHtcbiAgICBtaXhpbiA9IF9taXhpbjtcbiAgICByZXR1cm4gbmV3IFVJKHtcbiAgICAgICAgd2lkdGg6IChvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMud2lkdGgpIHx8IGdldFdpbmRvd1dpZHRoKCksXG4gICAgICAgIHdyYXA6IG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy53cmFwXG4gICAgfSk7XG59XG5cbi8vIEJvb3RzdHJhcCBjbGl1aSB3aXRoIENvbW1vbkpTIGRlcGVuZGVuY2llczpcbmNvbnN0IHN0cmluZ1dpZHRoID0gcmVxdWlyZSgnc3RyaW5nLXdpZHRoJyk7XG5jb25zdCBzdHJpcEFuc2kgPSByZXF1aXJlKCdzdHJpcC1hbnNpJyk7XG5jb25zdCB3cmFwID0gcmVxdWlyZSgnd3JhcC1hbnNpJyk7XG5mdW5jdGlvbiB1aShvcHRzKSB7XG4gICAgcmV0dXJuIGNsaXVpKG9wdHMsIHtcbiAgICAgICAgc3RyaW5nV2lkdGgsXG4gICAgICAgIHN0cmlwQW5zaSxcbiAgICAgICAgd3JhcFxuICAgIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVpO1xuIiwiY29uc3QgeyBBcmd1bWVudCB9ID0gcmVxdWlyZSgnLi9saWIvYXJndW1lbnQuanMnKTtcbmNvbnN0IHsgQ29tbWFuZCB9ID0gcmVxdWlyZSgnLi9saWIvY29tbWFuZC5qcycpO1xuY29uc3QgeyBDb21tYW5kZXJFcnJvciwgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vbGliL2Vycm9yLmpzJyk7XG5jb25zdCB7IEhlbHAgfSA9IHJlcXVpcmUoJy4vbGliL2hlbHAuanMnKTtcbmNvbnN0IHsgT3B0aW9uIH0gPSByZXF1aXJlKCcuL2xpYi9vcHRpb24uanMnKTtcblxuZXhwb3J0cy5wcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxuZXhwb3J0cy5jcmVhdGVDb21tYW5kID0gKG5hbWUpID0+IG5ldyBDb21tYW5kKG5hbWUpO1xuZXhwb3J0cy5jcmVhdGVPcHRpb24gPSAoZmxhZ3MsIGRlc2NyaXB0aW9uKSA9PiBuZXcgT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG5leHBvcnRzLmNyZWF0ZUFyZ3VtZW50ID0gKG5hbWUsIGRlc2NyaXB0aW9uKSA9PiBuZXcgQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pO1xuXG4vKipcbiAqIEV4cG9zZSBjbGFzc2VzXG4gKi9cblxuZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDtcbmV4cG9ydHMuT3B0aW9uID0gT3B0aW9uO1xuZXhwb3J0cy5Bcmd1bWVudCA9IEFyZ3VtZW50O1xuZXhwb3J0cy5IZWxwID0gSGVscDtcblxuZXhwb3J0cy5Db21tYW5kZXJFcnJvciA9IENvbW1hbmRlckVycm9yO1xuZXhwb3J0cy5JbnZhbGlkQXJndW1lbnRFcnJvciA9IEludmFsaWRBcmd1bWVudEVycm9yO1xuZXhwb3J0cy5JbnZhbGlkT3B0aW9uQXJndW1lbnRFcnJvciA9IEludmFsaWRBcmd1bWVudEVycm9yOyAvLyBEZXByZWNhdGVkXG4iLCJjb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9yLmpzJyk7XG5cbmNsYXNzIEFyZ3VtZW50IHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgY29tbWFuZCBhcmd1bWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBkZXNjcmlwdGlvbi5cbiAgICogVGhlIGRlZmF1bHQgaXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgcmVxdWlyZWQsIGFuZCB5b3UgY2FuIGV4cGxpY2l0bHlcbiAgICogaW5kaWNhdGUgdGhpcyB3aXRoIDw+IGFyb3VuZCB0aGUgbmFtZS4gUHV0IFtdIGFyb3VuZCB0aGUgbmFtZSBmb3IgYW4gb3B0aW9uYWwgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uIHx8ICcnO1xuICAgIHRoaXMudmFyaWFkaWMgPSBmYWxzZTtcbiAgICB0aGlzLnBhcnNlQXJnID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdW5kZWZpbmVkO1xuXG4gICAgc3dpdGNoIChuYW1lWzBdKSB7XG4gICAgICBjYXNlICc8JzogLy8gZS5nLiA8cmVxdWlyZWQ+XG4gICAgICAgIHRoaXMucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZS5zbGljZSgxLCAtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnWyc6IC8vIGUuZy4gW29wdGlvbmFsXVxuICAgICAgICB0aGlzLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9uYW1lLmxlbmd0aCA+IDMgJiYgdGhpcy5fbmFtZS5zbGljZSgtMykgPT09ICcuLi4nKSB7XG4gICAgICB0aGlzLnZhcmlhZGljID0gdHJ1ZTtcbiAgICAgIHRoaXMuX25hbWUgPSB0aGlzLl9uYW1lLnNsaWNlKDAsIC0zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFyZ3VtZW50IG5hbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFja2FnZVxuICAgKi9cblxuICBfY29uY2F0VmFsdWUodmFsdWUsIHByZXZpb3VzKSB7XG4gICAgaWYgKHByZXZpb3VzID09PSB0aGlzLmRlZmF1bHRWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShwcmV2aW91cykpIHtcbiAgICAgIHJldHVybiBbdmFsdWVdO1xuICAgIH1cblxuICAgIHJldHVybiBwcmV2aW91cy5jb25jYXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSwgYW5kIG9wdGlvbmFsbHkgc3VwcGx5IHRoZSBkZXNjcmlwdGlvbiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGRlZmF1bHQodmFsdWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjdXN0b20gaGFuZGxlciBmb3IgcHJvY2Vzc2luZyBDTEkgY29tbWFuZCBhcmd1bWVudHMgaW50byBhcmd1bWVudCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGFyZ1BhcnNlcihmbikge1xuICAgIHRoaXMucGFyc2VBcmcgPSBmbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IGFsbG93IGFyZ3VtZW50IHZhbHVlIHRvIGJlIG9uZSBvZiBjaG9pY2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB2YWx1ZXNcbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGNob2ljZXModmFsdWVzKSB7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdmFsdWVzLnNsaWNlKCk7XG4gICAgdGhpcy5wYXJzZUFyZyA9IChhcmcsIHByZXZpb3VzKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYXJnQ2hvaWNlcy5pbmNsdWRlcyhhcmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgICBgQWxsb3dlZCBjaG9pY2VzIGFyZSAke3RoaXMuYXJnQ2hvaWNlcy5qb2luKCcsICcpfS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmFyaWFkaWMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmNhdFZhbHVlKGFyZywgcHJldmlvdXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYXJndW1lbnQgcmVxdWlyZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBcmd1bWVudH1cbiAgICovXG4gIGFyZ1JlcXVpcmVkKCkge1xuICAgIHRoaXMucmVxdWlyZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYXJndW1lbnQgb3B0aW9uYWwuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBcmd1bWVudH1cbiAgICovXG4gIGFyZ09wdGlvbmFsKCkge1xuICAgIHRoaXMucmVxdWlyZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKipcbiAqIFRha2VzIGFuIGFyZ3VtZW50IGFuZCByZXR1cm5zIGl0cyBodW1hbiByZWFkYWJsZSBlcXVpdmFsZW50IGZvciBoZWxwIHVzYWdlLlxuICpcbiAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBodW1hblJlYWRhYmxlQXJnTmFtZShhcmcpIHtcbiAgY29uc3QgbmFtZU91dHB1dCA9IGFyZy5uYW1lKCkgKyAoYXJnLnZhcmlhZGljID09PSB0cnVlID8gJy4uLicgOiAnJyk7XG5cbiAgcmV0dXJuIGFyZy5yZXF1aXJlZCA/ICc8JyArIG5hbWVPdXRwdXQgKyAnPicgOiAnWycgKyBuYW1lT3V0cHV0ICsgJ10nO1xufVxuXG5leHBvcnRzLkFyZ3VtZW50ID0gQXJndW1lbnQ7XG5leHBvcnRzLmh1bWFuUmVhZGFibGVBcmdOYW1lID0gaHVtYW5SZWFkYWJsZUFyZ05hbWU7XG4iLCJjb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdub2RlOmV2ZW50cycpLkV2ZW50RW1pdHRlcjtcbmNvbnN0IGNoaWxkUHJvY2VzcyA9IHJlcXVpcmUoJ25vZGU6Y2hpbGRfcHJvY2VzcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ25vZGU6cGF0aCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdub2RlOmZzJyk7XG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgnbm9kZTpwcm9jZXNzJyk7XG5cbmNvbnN0IHsgQXJndW1lbnQsIGh1bWFuUmVhZGFibGVBcmdOYW1lIH0gPSByZXF1aXJlKCcuL2FyZ3VtZW50LmpzJyk7XG5jb25zdCB7IENvbW1hbmRlckVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9yLmpzJyk7XG5jb25zdCB7IEhlbHAgfSA9IHJlcXVpcmUoJy4vaGVscC5qcycpO1xuY29uc3QgeyBPcHRpb24sIER1YWxPcHRpb25zIH0gPSByZXF1aXJlKCcuL29wdGlvbi5qcycpO1xuY29uc3QgeyBzdWdnZXN0U2ltaWxhciB9ID0gcmVxdWlyZSgnLi9zdWdnZXN0U2ltaWxhcicpO1xuXG5jbGFzcyBDb21tYW5kIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgYENvbW1hbmRgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcigpO1xuICAgIC8qKiBAdHlwZSB7Q29tbWFuZFtdfSAqL1xuICAgIHRoaXMuY29tbWFuZHMgPSBbXTtcbiAgICAvKiogQHR5cGUge09wdGlvbltdfSAqL1xuICAgIHRoaXMub3B0aW9ucyA9IFtdO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9hbGxvd1Vua25vd25PcHRpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cyA9IHRydWU7XG4gICAgLyoqIEB0eXBlIHtBcmd1bWVudFtdfSAqL1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cyA9IFtdO1xuICAgIHRoaXMuX2FyZ3MgPSB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHM7IC8vIGRlcHJlY2F0ZWQgb2xkIG5hbWVcbiAgICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIHRoaXMuYXJncyA9IFtdOyAvLyBjbGkgYXJncyB3aXRoIG9wdGlvbnMgcmVtb3ZlZFxuICAgIHRoaXMucmF3QXJncyA9IFtdO1xuICAgIHRoaXMucHJvY2Vzc2VkQXJncyA9IFtdOyAvLyBsaWtlIC5hcmdzIGJ1dCBhZnRlciBjdXN0b20gcHJvY2Vzc2luZyBhbmQgY29sbGVjdGluZyB2YXJpYWRpY1xuICAgIHRoaXMuX3NjcmlwdFBhdGggPSBudWxsO1xuICAgIHRoaXMuX25hbWUgPSBuYW1lIHx8ICcnO1xuICAgIHRoaXMuX29wdGlvblZhbHVlcyA9IHt9O1xuICAgIHRoaXMuX29wdGlvblZhbHVlU291cmNlcyA9IHt9OyAvLyBkZWZhdWx0LCBlbnYsIGNsaSBldGNcbiAgICB0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMgPSBmYWxzZTtcbiAgICB0aGlzLl9hY3Rpb25IYW5kbGVyID0gbnVsbDtcbiAgICB0aGlzLl9leGVjdXRhYmxlSGFuZGxlciA9IGZhbHNlO1xuICAgIHRoaXMuX2V4ZWN1dGFibGVGaWxlID0gbnVsbDsgLy8gY3VzdG9tIG5hbWUgZm9yIGV4ZWN1dGFibGVcbiAgICB0aGlzLl9leGVjdXRhYmxlRGlyID0gbnVsbDsgLy8gY3VzdG9tIHNlYXJjaCBkaXJlY3RvcnkgZm9yIHN1YmNvbW1hbmRzXG4gICAgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gbnVsbDtcbiAgICB0aGlzLl9leGl0Q2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX2FsaWFzZXMgPSBbXTtcbiAgICB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gJyc7XG4gICAgdGhpcy5fc3VtbWFyeSA9ICcnO1xuICAgIHRoaXMuX2FyZ3NEZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDsgLy8gbGVnYWN5XG4gICAgdGhpcy5fZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgPSBmYWxzZTtcbiAgICB0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMgPSBmYWxzZTtcbiAgICB0aGlzLl9saWZlQ3ljbGVIb29rcyA9IHt9OyAvLyBhIGhhc2ggb2YgYXJyYXlzXG4gICAgLyoqIEB0eXBlIHsoYm9vbGVhbiB8IHN0cmluZyl9ICovXG4gICAgdGhpcy5fc2hvd0hlbHBBZnRlckVycm9yID0gZmFsc2U7XG4gICAgdGhpcy5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yID0gdHJ1ZTtcblxuICAgIC8vIHNlZSAuY29uZmlndXJlT3V0cHV0KCkgZm9yIGRvY3NcbiAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uID0ge1xuICAgICAgd3JpdGVPdXQ6IChzdHIpID0+IHByb2Nlc3Muc3Rkb3V0LndyaXRlKHN0ciksXG4gICAgICB3cml0ZUVycjogKHN0cikgPT4gcHJvY2Vzcy5zdGRlcnIud3JpdGUoc3RyKSxcbiAgICAgIGdldE91dEhlbHBXaWR0aDogKCkgPT5cbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQuaXNUVFkgPyBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zIDogdW5kZWZpbmVkLFxuICAgICAgZ2V0RXJySGVscFdpZHRoOiAoKSA9PlxuICAgICAgICBwcm9jZXNzLnN0ZGVyci5pc1RUWSA/IHByb2Nlc3Muc3RkZXJyLmNvbHVtbnMgOiB1bmRlZmluZWQsXG4gICAgICBvdXRwdXRFcnJvcjogKHN0ciwgd3JpdGUpID0+IHdyaXRlKHN0ciksXG4gICAgfTtcblxuICAgIHRoaXMuX2hpZGRlbiA9IGZhbHNlO1xuICAgIC8qKiBAdHlwZSB7KE9wdGlvbiB8IG51bGwgfCB1bmRlZmluZWQpfSAqL1xuICAgIHRoaXMuX2hlbHBPcHRpb24gPSB1bmRlZmluZWQ7IC8vIExhenkgY3JlYXRlZCBvbiBkZW1hbmQuIE1heSBiZSBudWxsIGlmIGhlbHAgb3B0aW9uIGlzIGRpc2FibGVkLlxuICAgIHRoaXMuX2FkZEltcGxpY2l0SGVscENvbW1hbmQgPSB1bmRlZmluZWQ7IC8vIHVuZGVjaWRlZCB3aGV0aGVyIHRydWUgb3IgZmFsc2UgeWV0LCBub3QgaW5oZXJpdGVkXG4gICAgLyoqIEB0eXBlIHtDb21tYW5kfSAqL1xuICAgIHRoaXMuX2hlbHBDb21tYW5kID0gdW5kZWZpbmVkOyAvLyBsYXp5IGluaXRpYWxpc2VkLCBpbmhlcml0ZWRcbiAgICB0aGlzLl9oZWxwQ29uZmlndXJhdGlvbiA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgc2V0dGluZ3MgdGhhdCBhcmUgdXNlZnVsIHRvIGhhdmUgaW4gY29tbW9uIGFjcm9zcyByb290IGNvbW1hbmQgYW5kIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiAoVXNlZCBpbnRlcm5hbGx5IHdoZW4gYWRkaW5nIGEgY29tbWFuZCB1c2luZyBgLmNvbW1hbmQoKWAgc28gc3ViY29tbWFuZHMgaW5oZXJpdCBwYXJlbnQgc2V0dGluZ3MuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IHNvdXJjZUNvbW1hbmRcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBjb3B5SW5oZXJpdGVkU2V0dGluZ3Moc291cmNlQ29tbWFuZCkge1xuICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24gPSBzb3VyY2VDb21tYW5kLl9vdXRwdXRDb25maWd1cmF0aW9uO1xuICAgIHRoaXMuX2hlbHBPcHRpb24gPSBzb3VyY2VDb21tYW5kLl9oZWxwT3B0aW9uO1xuICAgIHRoaXMuX2hlbHBDb21tYW5kID0gc291cmNlQ29tbWFuZC5faGVscENvbW1hbmQ7XG4gICAgdGhpcy5faGVscENvbmZpZ3VyYXRpb24gPSBzb3VyY2VDb21tYW5kLl9oZWxwQ29uZmlndXJhdGlvbjtcbiAgICB0aGlzLl9leGl0Q2FsbGJhY2sgPSBzb3VyY2VDb21tYW5kLl9leGl0Q2FsbGJhY2s7XG4gICAgdGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzID0gc291cmNlQ29tbWFuZC5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzO1xuICAgIHRoaXMuX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZSA9XG4gICAgICBzb3VyY2VDb21tYW5kLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWU7XG4gICAgdGhpcy5fYWxsb3dFeGNlc3NBcmd1bWVudHMgPSBzb3VyY2VDb21tYW5kLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cztcbiAgICB0aGlzLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucyA9IHNvdXJjZUNvbW1hbmQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zO1xuICAgIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9IHNvdXJjZUNvbW1hbmQuX3Nob3dIZWxwQWZ0ZXJFcnJvcjtcbiAgICB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IgPSBzb3VyY2VDb21tYW5kLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3I7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Q29tbWFuZFtdfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBmb3IgKGxldCBjb21tYW5kID0gdGhpczsgY29tbWFuZDsgY29tbWFuZCA9IGNvbW1hbmQucGFyZW50KSB7XG4gICAgICByZXN1bHQucHVzaChjb21tYW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgYSBjb21tYW5kLlxuICAgKlxuICAgKiBUaGVyZSBhcmUgdHdvIHN0eWxlcyBvZiBjb21tYW5kOiBwYXkgYXR0ZW50aW9uIHRvIHdoZXJlIHRvIHB1dCB0aGUgZGVzY3JpcHRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENvbW1hbmQgaW1wbGVtZW50ZWQgdXNpbmcgYWN0aW9uIGhhbmRsZXIgKGRlc2NyaXB0aW9uIGlzIHN1cHBsaWVkIHNlcGFyYXRlbHkgdG8gYC5jb21tYW5kYClcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5jb21tYW5kKCdjbG9uZSA8c291cmNlPiBbZGVzdGluYXRpb25dJylcbiAgICogICAuZGVzY3JpcHRpb24oJ2Nsb25lIGEgcmVwb3NpdG9yeSBpbnRvIGEgbmV3bHkgY3JlYXRlZCBkaXJlY3RvcnknKVxuICAgKiAgIC5hY3Rpb24oKHNvdXJjZSwgZGVzdGluYXRpb24pID0+IHtcbiAgICogICAgIGNvbnNvbGUubG9nKCdjbG9uZSBjb21tYW5kIGNhbGxlZCcpO1xuICAgKiAgIH0pO1xuICAgKlxuICAgKiAvLyBDb21tYW5kIGltcGxlbWVudGVkIHVzaW5nIHNlcGFyYXRlIGV4ZWN1dGFibGUgZmlsZSAoZGVzY3JpcHRpb24gaXMgc2Vjb25kIHBhcmFtZXRlciB0byBgLmNvbW1hbmRgKVxuICAgKiBwcm9ncmFtXG4gICAqICAgLmNvbW1hbmQoJ3N0YXJ0IDxzZXJ2aWNlPicsICdzdGFydCBuYW1lZCBzZXJ2aWNlJylcbiAgICogICAuY29tbWFuZCgnc3RvcCBbc2VydmljZV0nLCAnc3RvcCBuYW1lZCBzZXJ2aWNlLCBvciBhbGwgaWYgbm8gbmFtZSBzdXBwbGllZCcpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZUFuZEFyZ3MgLSBjb21tYW5kIG5hbWUgYW5kIGFyZ3VtZW50cywgYXJncyBhcmUgYDxyZXF1aXJlZD5gIG9yIGBbb3B0aW9uYWxdYCBhbmQgbGFzdCBtYXkgYWxzbyBiZSBgdmFyaWFkaWMuLi5gXG4gICAqIEBwYXJhbSB7KG9iamVjdCB8IHN0cmluZyl9IFthY3Rpb25PcHRzT3JFeGVjRGVzY10gLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKGZvciBhY3Rpb24pLCBvciBkZXNjcmlwdGlvbiAoZm9yIGV4ZWN1dGFibGUpXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbZXhlY09wdHNdIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIChmb3IgZXhlY3V0YWJsZSlcbiAgICogQHJldHVybiB7Q29tbWFuZH0gcmV0dXJucyBuZXcgY29tbWFuZCBmb3IgYWN0aW9uIGhhbmRsZXIsIG9yIGB0aGlzYCBmb3IgZXhlY3V0YWJsZSBjb21tYW5kXG4gICAqL1xuXG4gIGNvbW1hbmQobmFtZUFuZEFyZ3MsIGFjdGlvbk9wdHNPckV4ZWNEZXNjLCBleGVjT3B0cykge1xuICAgIGxldCBkZXNjID0gYWN0aW9uT3B0c09yRXhlY0Rlc2M7XG4gICAgbGV0IG9wdHMgPSBleGVjT3B0cztcbiAgICBpZiAodHlwZW9mIGRlc2MgPT09ICdvYmplY3QnICYmIGRlc2MgIT09IG51bGwpIHtcbiAgICAgIG9wdHMgPSBkZXNjO1xuICAgICAgZGVzYyA9IG51bGw7XG4gICAgfVxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIGNvbnN0IFssIG5hbWUsIGFyZ3NdID0gbmFtZUFuZEFyZ3MubWF0Y2goLyhbXiBdKykgKiguKikvKTtcblxuICAgIGNvbnN0IGNtZCA9IHRoaXMuY3JlYXRlQ29tbWFuZChuYW1lKTtcbiAgICBpZiAoZGVzYykge1xuICAgICAgY21kLmRlc2NyaXB0aW9uKGRlc2MpO1xuICAgICAgY21kLl9leGVjdXRhYmxlSGFuZGxlciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChvcHRzLmlzRGVmYXVsdCkgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gY21kLl9uYW1lO1xuICAgIGNtZC5faGlkZGVuID0gISEob3B0cy5ub0hlbHAgfHwgb3B0cy5oaWRkZW4pOyAvLyBub0hlbHAgaXMgZGVwcmVjYXRlZCBvbGQgbmFtZSBmb3IgaGlkZGVuXG4gICAgY21kLl9leGVjdXRhYmxlRmlsZSA9IG9wdHMuZXhlY3V0YWJsZUZpbGUgfHwgbnVsbDsgLy8gQ3VzdG9tIG5hbWUgZm9yIGV4ZWN1dGFibGUgZmlsZSwgc2V0IG1pc3NpbmcgdG8gbnVsbCB0byBtYXRjaCBjb25zdHJ1Y3RvclxuICAgIGlmIChhcmdzKSBjbWQuYXJndW1lbnRzKGFyZ3MpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29tbWFuZChjbWQpO1xuICAgIGNtZC5wYXJlbnQgPSB0aGlzO1xuICAgIGNtZC5jb3B5SW5oZXJpdGVkU2V0dGluZ3ModGhpcyk7XG5cbiAgICBpZiAoZGVzYykgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIGNtZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IHJvdXRpbmUgdG8gY3JlYXRlIGEgbmV3IHVuYXR0YWNoZWQgY29tbWFuZC5cbiAgICpcbiAgICogU2VlIC5jb21tYW5kKCkgZm9yIGNyZWF0aW5nIGFuIGF0dGFjaGVkIHN1YmNvbW1hbmQsIHdoaWNoIHVzZXMgdGhpcyByb3V0aW5lIHRvXG4gICAqIGNyZWF0ZSB0aGUgY29tbWFuZC4gWW91IGNhbiBvdmVycmlkZSBjcmVhdGVDb21tYW5kIHRvIGN1c3RvbWlzZSBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBuZXcgY29tbWFuZFxuICAgKi9cblxuICBjcmVhdGVDb21tYW5kKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IENvbW1hbmQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogWW91IGNhbiBjdXN0b21pc2UgdGhlIGhlbHAgd2l0aCBhIHN1YmNsYXNzIG9mIEhlbHAgYnkgb3ZlcnJpZGluZyBjcmVhdGVIZWxwLFxuICAgKiBvciBieSBvdmVycmlkaW5nIEhlbHAgcHJvcGVydGllcyB1c2luZyBjb25maWd1cmVIZWxwKCkuXG4gICAqXG4gICAqIEByZXR1cm4ge0hlbHB9XG4gICAqL1xuXG4gIGNyZWF0ZUhlbHAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEhlbHAoKSwgdGhpcy5jb25maWd1cmVIZWxwKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gY3VzdG9taXNlIHRoZSBoZWxwIGJ5IG92ZXJyaWRpbmcgSGVscCBwcm9wZXJ0aWVzIHVzaW5nIGNvbmZpZ3VyZUhlbHAoKSxcbiAgICogb3Igd2l0aCBhIHN1YmNsYXNzIG9mIEhlbHAgYnkgb3ZlcnJpZGluZyBjcmVhdGVIZWxwKCkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbY29uZmlndXJhdGlvbl0gLSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybiB7KENvbW1hbmQgfCBvYmplY3QpfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmcsIG9yIHN0b3JlZCBjb25maWd1cmF0aW9uXG4gICAqL1xuXG4gIGNvbmZpZ3VyZUhlbHAoY29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9oZWxwQ29uZmlndXJhdGlvbjtcblxuICAgIHRoaXMuX2hlbHBDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBvdXRwdXQgZ29lcyB0byBzdGRvdXQgYW5kIHN0ZGVyci4gWW91IGNhbiBjdXN0b21pc2UgdGhpcyBmb3Igc3BlY2lhbFxuICAgKiBhcHBsaWNhdGlvbnMuIFlvdSBjYW4gYWxzbyBjdXN0b21pc2UgdGhlIGRpc3BsYXkgb2YgZXJyb3JzIGJ5IG92ZXJyaWRpbmcgb3V0cHV0RXJyb3IuXG4gICAqXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgYXJlIGFsbCBmdW5jdGlvbnM6XG4gICAqXG4gICAqICAgICAvLyBmdW5jdGlvbnMgdG8gY2hhbmdlIHdoZXJlIGJlaW5nIHdyaXR0ZW4sIHN0ZG91dCBhbmQgc3RkZXJyXG4gICAqICAgICB3cml0ZU91dChzdHIpXG4gICAqICAgICB3cml0ZUVycihzdHIpXG4gICAqICAgICAvLyBtYXRjaGluZyBmdW5jdGlvbnMgdG8gc3BlY2lmeSB3aWR0aCBmb3Igd3JhcHBpbmcgaGVscFxuICAgKiAgICAgZ2V0T3V0SGVscFdpZHRoKClcbiAgICogICAgIGdldEVyckhlbHBXaWR0aCgpXG4gICAqICAgICAvLyBmdW5jdGlvbnMgYmFzZWQgb24gd2hhdCBpcyBiZWluZyB3cml0dGVuIG91dFxuICAgKiAgICAgb3V0cHV0RXJyb3Ioc3RyLCB3cml0ZSkgLy8gdXNlZCBmb3IgZGlzcGxheWluZyBlcnJvcnMsIGFuZCBub3QgdXNlZCBmb3IgZGlzcGxheWluZyBoZWxwXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbY29uZmlndXJhdGlvbl0gLSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybiB7KENvbW1hbmQgfCBvYmplY3QpfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmcsIG9yIHN0b3JlZCBjb25maWd1cmF0aW9uXG4gICAqL1xuXG4gIGNvbmZpZ3VyZU91dHB1dChjb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb247XG5cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgdGhlIGhlbHAgb3IgYSBjdXN0b20gbWVzc2FnZSBhZnRlciBhbiBlcnJvciBvY2N1cnMuXG4gICAqXG4gICAqIEBwYXJhbSB7KGJvb2xlYW58c3RyaW5nKX0gW2Rpc3BsYXlIZWxwXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHNob3dIZWxwQWZ0ZXJFcnJvcihkaXNwbGF5SGVscCA9IHRydWUpIHtcbiAgICBpZiAodHlwZW9mIGRpc3BsYXlIZWxwICE9PSAnc3RyaW5nJykgZGlzcGxheUhlbHAgPSAhIWRpc3BsYXlIZWxwO1xuICAgIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9IGRpc3BsYXlIZWxwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgc3VnZ2VzdGlvbiBvZiBzaW1pbGFyIGNvbW1hbmRzIGZvciB1bmtub3duIGNvbW1hbmRzLCBvciBvcHRpb25zIGZvciB1bmtub3duIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Rpc3BsYXlTdWdnZXN0aW9uXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHNob3dTdWdnZXN0aW9uQWZ0ZXJFcnJvcihkaXNwbGF5U3VnZ2VzdGlvbiA9IHRydWUpIHtcbiAgICB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IgPSAhIWRpc3BsYXlTdWdnZXN0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHByZXBhcmVkIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIFNlZSAuY29tbWFuZCgpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBzdWJjb21tYW5kIHdoaWNoIGluaGVyaXRzIHNldHRpbmdzIGZyb20gaXRzIHBhcmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWQgLSBuZXcgc3ViY29tbWFuZFxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdHNdIC0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBhZGRDb21tYW5kKGNtZCwgb3B0cykge1xuICAgIGlmICghY21kLl9uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbW1hbmQgcGFzc2VkIHRvIC5hZGRDb21tYW5kKCkgbXVzdCBoYXZlIGEgbmFtZVxuLSBzcGVjaWZ5IHRoZSBuYW1lIGluIENvbW1hbmQgY29uc3RydWN0b3Igb3IgdXNpbmcgLm5hbWUoKWApO1xuICAgIH1cblxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIGlmIChvcHRzLmlzRGVmYXVsdCkgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gY21kLl9uYW1lO1xuICAgIGlmIChvcHRzLm5vSGVscCB8fCBvcHRzLmhpZGRlbikgY21kLl9oaWRkZW4gPSB0cnVlOyAvLyBtb2RpZnlpbmcgcGFzc2VkIGNvbW1hbmQgZHVlIHRvIGV4aXN0aW5nIGltcGxlbWVudGF0aW9uXG5cbiAgICB0aGlzLl9yZWdpc3RlckNvbW1hbmQoY21kKTtcbiAgICBjbWQucGFyZW50ID0gdGhpcztcbiAgICBjbWQuX2NoZWNrRm9yQnJva2VuUGFzc1Rocm91Z2goKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3Rvcnkgcm91dGluZSB0byBjcmVhdGUgYSBuZXcgdW5hdHRhY2hlZCBhcmd1bWVudC5cbiAgICpcbiAgICogU2VlIC5hcmd1bWVudCgpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBhcmd1bWVudCwgd2hpY2ggdXNlcyB0aGlzIHJvdXRpbmUgdG9cbiAgICogY3JlYXRlIHRoZSBhcmd1bWVudC4gWW91IGNhbiBvdmVycmlkZSBjcmVhdGVBcmd1bWVudCB0byByZXR1cm4gYSBjdXN0b20gYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge0FyZ3VtZW50fSBuZXcgYXJndW1lbnRcbiAgICovXG5cbiAgY3JlYXRlQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pIHtcbiAgICByZXR1cm4gbmV3IEFyZ3VtZW50KG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgYXJndW1lbnQgc3ludGF4IGZvciBjb21tYW5kLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBpcyB0aGF0IHRoZSBhcmd1bWVudCBpcyByZXF1aXJlZCwgYW5kIHlvdSBjYW4gZXhwbGljaXRseVxuICAgKiBpbmRpY2F0ZSB0aGlzIHdpdGggPD4gYXJvdW5kIHRoZSBuYW1lLiBQdXQgW10gYXJvdW5kIHRoZSBuYW1lIGZvciBhbiBvcHRpb25hbCBhcmd1bWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5hcmd1bWVudCgnPGlucHV0LWZpbGU+Jyk7XG4gICAqIHByb2dyYW0uYXJndW1lbnQoJ1tvdXRwdXQtZmlsZV0nKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtIHsoRnVuY3Rpb258Kil9IFtmbl0gLSBjdXN0b20gYXJndW1lbnQgcHJvY2Vzc2luZyBmdW5jdGlvblxuICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24sIGZuLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCBhcmd1bWVudCA9IHRoaXMuY3JlYXRlQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFyZ3VtZW50LmRlZmF1bHQoZGVmYXVsdFZhbHVlKS5hcmdQYXJzZXIoZm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcmd1bWVudC5kZWZhdWx0KGZuKTtcbiAgICB9XG4gICAgdGhpcy5hZGRBcmd1bWVudChhcmd1bWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGFyZ3VtZW50IHN5bnRheCBmb3IgY29tbWFuZCwgYWRkaW5nIG11bHRpcGxlIGF0IG9uY2UgKHdpdGhvdXQgZGVzY3JpcHRpb25zKS5cbiAgICpcbiAgICogU2VlIGFsc28gLmFyZ3VtZW50KCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uYXJndW1lbnRzKCc8Y21kPiBbZW52XScpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGFyZ3VtZW50cyhuYW1lcykge1xuICAgIG5hbWVzXG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoLyArLylcbiAgICAgIC5mb3JFYWNoKChkZXRhaWwpID0+IHtcbiAgICAgICAgdGhpcy5hcmd1bWVudChkZXRhaWwpO1xuICAgICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGFyZ3VtZW50IHN5bnRheCBmb3IgY29tbWFuZCwgYWRkaW5nIGEgcHJlcGFyZWQgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkQXJndW1lbnQoYXJndW1lbnQpIHtcbiAgICBjb25zdCBwcmV2aW91c0FyZ3VtZW50ID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLnNsaWNlKC0xKVswXTtcbiAgICBpZiAocHJldmlvdXNBcmd1bWVudCAmJiBwcmV2aW91c0FyZ3VtZW50LnZhcmlhZGljKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBvbmx5IHRoZSBsYXN0IGFyZ3VtZW50IGNhbiBiZSB2YXJpYWRpYyAnJHtwcmV2aW91c0FyZ3VtZW50Lm5hbWUoKX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGFyZ3VtZW50LnJlcXVpcmVkICYmXG4gICAgICBhcmd1bWVudC5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgYXJndW1lbnQucGFyc2VBcmcgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYSBkZWZhdWx0IHZhbHVlIGZvciBhIHJlcXVpcmVkIGFyZ3VtZW50IGlzIG5ldmVyIHVzZWQ6ICcke2FyZ3VtZW50Lm5hbWUoKX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5wdXNoKGFyZ3VtZW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b21pc2Ugb3Igb3ZlcnJpZGUgZGVmYXVsdCBoZWxwIGNvbW1hbmQuIEJ5IGRlZmF1bHQgYSBoZWxwIGNvbW1hbmQgaXMgYXV0b21hdGljYWxseSBhZGRlZCBpZiB5b3VyIGNvbW1hbmQgaGFzIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKCdoZWxwIFtjbWRdJyk7XG4gICAqICAgIHByb2dyYW0uaGVscENvbW1hbmQoJ2hlbHAgW2NtZF0nLCAnc2hvdyBoZWxwJyk7XG4gICAqICAgIHByb2dyYW0uaGVscENvbW1hbmQoZmFsc2UpOyAvLyBzdXBwcmVzcyBkZWZhdWx0IGhlbHAgY29tbWFuZFxuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKHRydWUpOyAvLyBhZGQgaGVscCBjb21tYW5kIGV2ZW4gaWYgbm8gc3ViY29tbWFuZHNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8Ym9vbGVhbn0gZW5hYmxlT3JOYW1lQW5kQXJncyAtIGVuYWJsZSB3aXRoIGN1c3RvbSBuYW1lIGFuZC9vciBhcmd1bWVudHMsIG9yIGJvb2xlYW4gdG8gb3ZlcnJpZGUgd2hldGhlciBhZGRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXSAtIGN1c3RvbSBkZXNjcmlwdGlvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaGVscENvbW1hbmQoZW5hYmxlT3JOYW1lQW5kQXJncywgZGVzY3JpcHRpb24pIHtcbiAgICBpZiAodHlwZW9mIGVuYWJsZU9yTmFtZUFuZEFyZ3MgPT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IGVuYWJsZU9yTmFtZUFuZEFyZ3M7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBlbmFibGVPck5hbWVBbmRBcmdzID0gZW5hYmxlT3JOYW1lQW5kQXJncyA/PyAnaGVscCBbY29tbWFuZF0nO1xuICAgIGNvbnN0IFssIGhlbHBOYW1lLCBoZWxwQXJnc10gPSBlbmFibGVPck5hbWVBbmRBcmdzLm1hdGNoKC8oW14gXSspICooLiopLyk7XG4gICAgY29uc3QgaGVscERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPz8gJ2Rpc3BsYXkgaGVscCBmb3IgY29tbWFuZCc7XG5cbiAgICBjb25zdCBoZWxwQ29tbWFuZCA9IHRoaXMuY3JlYXRlQ29tbWFuZChoZWxwTmFtZSk7XG4gICAgaGVscENvbW1hbmQuaGVscE9wdGlvbihmYWxzZSk7XG4gICAgaWYgKGhlbHBBcmdzKSBoZWxwQ29tbWFuZC5hcmd1bWVudHMoaGVscEFyZ3MpO1xuICAgIGlmIChoZWxwRGVzY3JpcHRpb24pIGhlbHBDb21tYW5kLmRlc2NyaXB0aW9uKGhlbHBEZXNjcmlwdGlvbik7XG5cbiAgICB0aGlzLl9hZGRJbXBsaWNpdEhlbHBDb21tYW5kID0gdHJ1ZTtcbiAgICB0aGlzLl9oZWxwQ29tbWFuZCA9IGhlbHBDb21tYW5kO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHByZXBhcmVkIGN1c3RvbSBoZWxwIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7KENvbW1hbmR8c3RyaW5nfGJvb2xlYW4pfSBoZWxwQ29tbWFuZCAtIGN1c3RvbSBoZWxwIGNvbW1hbmQsIG9yIGRlcHJlY2F0ZWQgZW5hYmxlT3JOYW1lQW5kQXJncyBhcyBmb3IgYC5oZWxwQ29tbWFuZCgpYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RlcHJlY2F0ZWREZXNjcmlwdGlvbl0gLSBkZXByZWNhdGVkIGN1c3RvbSBkZXNjcmlwdGlvbiB1c2VkIHdpdGggY3VzdG9tIG5hbWUgb25seVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEhlbHBDb21tYW5kKGhlbHBDb21tYW5kLCBkZXByZWNhdGVkRGVzY3JpcHRpb24pIHtcbiAgICAvLyBJZiBub3QgcGFzc2VkIGFuIG9iamVjdCwgY2FsbCB0aHJvdWdoIHRvIGhlbHBDb21tYW5kIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSxcbiAgICAvLyBhcyBhZGRIZWxwQ29tbWFuZCB3YXMgb3JpZ2luYWxseSB1c2VkIGxpa2UgaGVscENvbW1hbmQgaXMgbm93LlxuICAgIGlmICh0eXBlb2YgaGVscENvbW1hbmQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmhlbHBDb21tYW5kKGhlbHBDb21tYW5kLCBkZXByZWNhdGVkRGVzY3JpcHRpb24pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IHRydWU7XG4gICAgdGhpcy5faGVscENvbW1hbmQgPSBoZWxwQ29tbWFuZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXp5IGNyZWF0ZSBoZWxwIGNvbW1hbmQuXG4gICAqXG4gICAqIEByZXR1cm4geyhDb21tYW5kfG51bGwpfVxuICAgKiBAcGFja2FnZVxuICAgKi9cbiAgX2dldEhlbHBDb21tYW5kKCkge1xuICAgIGNvbnN0IGhhc0ltcGxpY2l0SGVscENvbW1hbmQgPVxuICAgICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA/P1xuICAgICAgKHRoaXMuY29tbWFuZHMubGVuZ3RoICYmXG4gICAgICAgICF0aGlzLl9hY3Rpb25IYW5kbGVyICYmXG4gICAgICAgICF0aGlzLl9maW5kQ29tbWFuZCgnaGVscCcpKTtcblxuICAgIGlmIChoYXNJbXBsaWNpdEhlbHBDb21tYW5kKSB7XG4gICAgICBpZiAodGhpcy5faGVscENvbW1hbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmhlbHBDb21tYW5kKHVuZGVmaW5lZCwgdW5kZWZpbmVkKTsgLy8gdXNlIGRlZmF1bHQgbmFtZSBhbmQgZGVzY3JpcHRpb25cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9oZWxwQ29tbWFuZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGhvb2sgZm9yIGxpZmUgY3ljbGUgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaG9vayhldmVudCwgbGlzdGVuZXIpIHtcbiAgICBjb25zdCBhbGxvd2VkVmFsdWVzID0gWydwcmVTdWJjb21tYW5kJywgJ3ByZUFjdGlvbicsICdwb3N0QWN0aW9uJ107XG4gICAgaWYgKCFhbGxvd2VkVmFsdWVzLmluY2x1ZGVzKGV2ZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciBldmVudCBwYXNzZWQgdG8gaG9vayA6ICcke2V2ZW50fScuXG5FeHBlY3Rpbmcgb25lIG9mICcke2FsbG93ZWRWYWx1ZXMuam9pbihcIicsICdcIil9J2ApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdKSB7XG4gICAgICB0aGlzLl9saWZlQ3ljbGVIb29rc1tldmVudF0ucHVzaChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XSA9IFtsaXN0ZW5lcl07XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGNhbGxiYWNrIHRvIHVzZSBhcyByZXBsYWNlbWVudCBmb3IgY2FsbGluZyBwcm9jZXNzLmV4aXQuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl0gb3B0aW9uYWwgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBwYXNzZWQgYSBDb21tYW5kZXJFcnJvciwgZGVmYXVsdHMgdG8gdGhyb3dpbmdcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGV4aXRPdmVycmlkZShmbikge1xuICAgIGlmIChmbikge1xuICAgICAgdGhpcy5fZXhpdENhbGxiYWNrID0gZm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2V4aXRDYWxsYmFjayA9IChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnKSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFzeW5jIGNhbGxiYWNrIGZyb20gc3Bhd24gZXZlbnRzLCBub3QgdXNlZnVsIHRvIHRocm93LlxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHByb2Nlc3MuZXhpdCwgYW5kIF9leGl0Q2FsbGJhY2sgaWYgZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGV4aXRDb2RlIGV4aXQgY29kZSBmb3IgdXNpbmcgd2l0aCBwcm9jZXNzLmV4aXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgYW4gaWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yXG4gICAqIEByZXR1cm4gbmV2ZXJcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2V4aXQoZXhpdENvZGUsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5fZXhpdENhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9leGl0Q2FsbGJhY2sobmV3IENvbW1hbmRlckVycm9yKGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKSk7XG4gICAgICAvLyBFeHBlY3RpbmcgdGhpcyBsaW5lIGlzIG5vdCByZWFjaGVkLlxuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGNhbGxiYWNrIGBmbmAgZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtXG4gICAqICAgLmNvbW1hbmQoJ3NlcnZlJylcbiAgICogICAuZGVzY3JpcHRpb24oJ3N0YXJ0IHNlcnZpY2UnKVxuICAgKiAgIC5hY3Rpb24oZnVuY3Rpb24oKSB7XG4gICAqICAgICAgLy8gZG8gd29yayBoZXJlXG4gICAqICAgfSk7XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBhY3Rpb24oZm4pIHtcbiAgICBjb25zdCBsaXN0ZW5lciA9IChhcmdzKSA9PiB7XG4gICAgICAvLyBUaGUgLmFjdGlvbiBjYWxsYmFjayB0YWtlcyBhbiBleHRyYSBwYXJhbWV0ZXIgd2hpY2ggaXMgdGhlIGNvbW1hbmQgb3Igb3B0aW9ucy5cbiAgICAgIGNvbnN0IGV4cGVjdGVkQXJnc0NvdW50ID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGNvbnN0IGFjdGlvbkFyZ3MgPSBhcmdzLnNsaWNlKDAsIGV4cGVjdGVkQXJnc0NvdW50KTtcbiAgICAgIGlmICh0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgYWN0aW9uQXJnc1tleHBlY3RlZEFyZ3NDb3VudF0gPSB0aGlzOyAvLyBiYWNrd2FyZHMgY29tcGF0aWJsZSBcIm9wdGlvbnNcIlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aW9uQXJnc1tleHBlY3RlZEFyZ3NDb3VudF0gPSB0aGlzLm9wdHMoKTtcbiAgICAgIH1cbiAgICAgIGFjdGlvbkFyZ3MucHVzaCh0aGlzKTtcblxuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFjdGlvbkFyZ3MpO1xuICAgIH07XG4gICAgdGhpcy5fYWN0aW9uSGFuZGxlciA9IGxpc3RlbmVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3Rvcnkgcm91dGluZSB0byBjcmVhdGUgYSBuZXcgdW5hdHRhY2hlZCBvcHRpb24uXG4gICAqXG4gICAqIFNlZSAub3B0aW9uKCkgZm9yIGNyZWF0aW5nIGFuIGF0dGFjaGVkIG9wdGlvbiwgd2hpY2ggdXNlcyB0aGlzIHJvdXRpbmUgdG9cbiAgICogY3JlYXRlIHRoZSBvcHRpb24uIFlvdSBjYW4gb3ZlcnJpZGUgY3JlYXRlT3B0aW9uIHRvIHJldHVybiBhIGN1c3RvbSBvcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtPcHRpb259IG5ldyBvcHRpb25cbiAgICovXG5cbiAgY3JlYXRlT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiBuZXcgT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCBwYXJzZUFyZ3MgdG8gY2F0Y2ggJ2NvbW1hbmRlci5pbnZhbGlkQXJndW1lbnQnLlxuICAgKlxuICAgKiBAcGFyYW0geyhPcHRpb24gfCBBcmd1bWVudCl9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHsqfSBwcmV2aW91c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gaW52YWxpZEFyZ3VtZW50TWVzc2FnZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2FsbFBhcnNlQXJnKHRhcmdldCwgdmFsdWUsIHByZXZpb3VzLCBpbnZhbGlkQXJndW1lbnRNZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0YXJnZXQucGFyc2VBcmcodmFsdWUsIHByZXZpb3VzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ2NvbW1hbmRlci5pbnZhbGlkQXJndW1lbnQnKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgJHtpbnZhbGlkQXJndW1lbnRNZXNzYWdlfSAke2Vyci5tZXNzYWdlfWA7XG4gICAgICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBleGl0Q29kZTogZXJyLmV4aXRDb2RlLCBjb2RlOiBlcnIuY29kZSB9KTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIG9wdGlvbiBmbGFnIGNvbmZsaWN0cy5cbiAgICogUmVnaXN0ZXIgb3B0aW9uIGlmIG5vIGNvbmZsaWN0cyBmb3VuZCwgb3IgdGhyb3cgb24gY29uZmxpY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX3JlZ2lzdGVyT3B0aW9uKG9wdGlvbikge1xuICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID1cbiAgICAgIChvcHRpb24uc2hvcnQgJiYgdGhpcy5fZmluZE9wdGlvbihvcHRpb24uc2hvcnQpKSB8fFxuICAgICAgKG9wdGlvbi5sb25nICYmIHRoaXMuX2ZpbmRPcHRpb24ob3B0aW9uLmxvbmcpKTtcbiAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRmxhZyA9XG4gICAgICAgIG9wdGlvbi5sb25nICYmIHRoaXMuX2ZpbmRPcHRpb24ob3B0aW9uLmxvbmcpXG4gICAgICAgICAgPyBvcHRpb24ubG9uZ1xuICAgICAgICAgIDogb3B0aW9uLnNob3J0O1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYWRkIG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyR7dGhpcy5fbmFtZSAmJiBgIHRvIGNvbW1hbmQgJyR7dGhpcy5fbmFtZX0nYH0gZHVlIHRvIGNvbmZsaWN0aW5nIGZsYWcgJyR7bWF0Y2hpbmdGbGFnfSdcbi0gIGFscmVhZHkgdXNlZCBieSBvcHRpb24gJyR7bWF0Y2hpbmdPcHRpb24uZmxhZ3N9J2ApO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIGNvbW1hbmQgbmFtZSBhbmQgYWxpYXMgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgY29tbWFuZHMuXG4gICAqIFJlZ2lzdGVyIGNvbW1hbmQgaWYgbm8gY29uZmxpY3RzIGZvdW5kLCBvciB0aHJvdyBvbiBjb25mbGljdC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjb21tYW5kXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9yZWdpc3RlckNvbW1hbmQoY29tbWFuZCkge1xuICAgIGNvbnN0IGtub3duQnkgPSAoY21kKSA9PiB7XG4gICAgICByZXR1cm4gW2NtZC5uYW1lKCldLmNvbmNhdChjbWQuYWxpYXNlcygpKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYWxyZWFkeVVzZWQgPSBrbm93bkJ5KGNvbW1hbmQpLmZpbmQoKG5hbWUpID0+XG4gICAgICB0aGlzLl9maW5kQ29tbWFuZChuYW1lKSxcbiAgICApO1xuICAgIGlmIChhbHJlYWR5VXNlZCkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDbWQgPSBrbm93bkJ5KHRoaXMuX2ZpbmRDb21tYW5kKGFscmVhZHlVc2VkKSkuam9pbignfCcpO1xuICAgICAgY29uc3QgbmV3Q21kID0ga25vd25CeShjb21tYW5kKS5qb2luKCd8Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYW5ub3QgYWRkIGNvbW1hbmQgJyR7bmV3Q21kfScgYXMgYWxyZWFkeSBoYXZlIGNvbW1hbmQgJyR7ZXhpc3RpbmdDbWR9J2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY29tbWFuZHMucHVzaChjb21tYW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkT3B0aW9uKG9wdGlvbikge1xuICAgIHRoaXMuX3JlZ2lzdGVyT3B0aW9uKG9wdGlvbik7XG5cbiAgICBjb25zdCBvbmFtZSA9IG9wdGlvbi5uYW1lKCk7XG4gICAgY29uc3QgbmFtZSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG5cbiAgICAvLyBzdG9yZSBkZWZhdWx0IHZhbHVlXG4gICAgaWYgKG9wdGlvbi5uZWdhdGUpIHtcbiAgICAgIC8vIC0tbm8tZm9vIGlzIHNwZWNpYWwgYW5kIGRlZmF1bHRzIGZvbyB0byB0cnVlLCB1bmxlc3MgYSAtLWZvbyBvcHRpb24gaXMgYWxyZWFkeSBkZWZpbmVkXG4gICAgICBjb25zdCBwb3NpdGl2ZUxvbmdGbGFnID0gb3B0aW9uLmxvbmcucmVwbGFjZSgvXi0tbm8tLywgJy0tJyk7XG4gICAgICBpZiAoIXRoaXMuX2ZpbmRPcHRpb24ocG9zaXRpdmVMb25nRmxhZykpIHtcbiAgICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBvcHRpb24uZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQgPyB0cnVlIDogb3B0aW9uLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAnZGVmYXVsdCcsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb24uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKG5hbWUsIG9wdGlvbi5kZWZhdWx0VmFsdWUsICdkZWZhdWx0Jyk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlciBmb3IgY2xpIGFuZCBlbnYgc3VwcGxpZWQgdmFsdWVzXG4gICAgY29uc3QgaGFuZGxlT3B0aW9uVmFsdWUgPSAodmFsLCBpbnZhbGlkVmFsdWVNZXNzYWdlLCB2YWx1ZVNvdXJjZSkgPT4ge1xuICAgICAgLy8gdmFsIGlzIG51bGwgZm9yIG9wdGlvbmFsIG9wdGlvbiB1c2VkIHdpdGhvdXQgYW4gb3B0aW9uYWwtYXJndW1lbnQuXG4gICAgICAvLyB2YWwgaXMgdW5kZWZpbmVkIGZvciBib29sZWFuIGFuZCBuZWdhdGVkIG9wdGlvbi5cbiAgICAgIGlmICh2YWwgPT0gbnVsbCAmJiBvcHRpb24ucHJlc2V0QXJnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsID0gb3B0aW9uLnByZXNldEFyZztcbiAgICAgIH1cblxuICAgICAgLy8gY3VzdG9tIHByb2Nlc3NpbmdcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5nZXRPcHRpb25WYWx1ZShuYW1lKTtcbiAgICAgIGlmICh2YWwgIT09IG51bGwgJiYgb3B0aW9uLnBhcnNlQXJnKSB7XG4gICAgICAgIHZhbCA9IHRoaXMuX2NhbGxQYXJzZUFyZyhvcHRpb24sIHZhbCwgb2xkVmFsdWUsIGludmFsaWRWYWx1ZU1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmICh2YWwgIT09IG51bGwgJiYgb3B0aW9uLnZhcmlhZGljKSB7XG4gICAgICAgIHZhbCA9IG9wdGlvbi5fY29uY2F0VmFsdWUodmFsLCBvbGRWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbGwtaW4gYXBwcm9wcmlhdGUgbWlzc2luZyB2YWx1ZXMuIExvbmcgd2luZGVkIGJ1dCBlYXN5IHRvIGZvbGxvdy5cbiAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICBpZiAob3B0aW9uLm5lZ2F0ZSkge1xuICAgICAgICAgIHZhbCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5pc0Jvb2xlYW4oKSB8fCBvcHRpb24ub3B0aW9uYWwpIHtcbiAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9ICcnOyAvLyBub3Qgbm9ybWFsLCBwYXJzZUFyZyBtaWdodCBoYXZlIGZhaWxlZCBvciBiZSBhIG1vY2sgZnVuY3Rpb24gZm9yIHRlc3RpbmdcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UobmFtZSwgdmFsLCB2YWx1ZVNvdXJjZSk7XG4gICAgfTtcblxuICAgIHRoaXMub24oJ29wdGlvbjonICsgb25hbWUsICh2YWwpID0+IHtcbiAgICAgIGNvbnN0IGludmFsaWRWYWx1ZU1lc3NhZ2UgPSBgZXJyb3I6IG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyBhcmd1bWVudCAnJHt2YWx9JyBpcyBpbnZhbGlkLmA7XG4gICAgICBoYW5kbGVPcHRpb25WYWx1ZSh2YWwsIGludmFsaWRWYWx1ZU1lc3NhZ2UsICdjbGknKTtcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb24uZW52VmFyKSB7XG4gICAgICB0aGlzLm9uKCdvcHRpb25FbnY6JyArIG9uYW1lLCAodmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGludmFsaWRWYWx1ZU1lc3NhZ2UgPSBgZXJyb3I6IG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyB2YWx1ZSAnJHt2YWx9JyBmcm9tIGVudiAnJHtvcHRpb24uZW52VmFyfScgaXMgaW52YWxpZC5gO1xuICAgICAgICBoYW5kbGVPcHRpb25WYWx1ZSh2YWwsIGludmFsaWRWYWx1ZU1lc3NhZ2UsICdlbnYnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIHNoYXJlZCBieSAub3B0aW9uKCkgYW5kIC5yZXF1aXJlZE9wdGlvbigpXG4gICAqXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29wdGlvbkV4KGNvbmZpZywgZmxhZ3MsIGRlc2NyaXB0aW9uLCBmbiwgZGVmYXVsdFZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBmbGFncyA9PT0gJ29iamVjdCcgJiYgZmxhZ3MgaW5zdGFuY2VvZiBPcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RvIGFkZCBhbiBPcHRpb24gb2JqZWN0IHVzZSBhZGRPcHRpb24oKSBpbnN0ZWFkIG9mIG9wdGlvbigpIG9yIHJlcXVpcmVkT3B0aW9uKCknLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcbiAgICBvcHRpb24ubWFrZU9wdGlvbk1hbmRhdG9yeSghIWNvbmZpZy5tYW5kYXRvcnkpO1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdGlvbi5kZWZhdWx0KGRlZmF1bHRWYWx1ZSkuYXJnUGFyc2VyKGZuKTtcbiAgICB9IGVsc2UgaWYgKGZuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBkZXByZWNhdGVkXG4gICAgICBjb25zdCByZWdleCA9IGZuO1xuICAgICAgZm4gPSAodmFsLCBkZWYpID0+IHtcbiAgICAgICAgY29uc3QgbSA9IHJlZ2V4LmV4ZWModmFsKTtcbiAgICAgICAgcmV0dXJuIG0gPyBtWzBdIDogZGVmO1xuICAgICAgfTtcbiAgICAgIG9wdGlvbi5kZWZhdWx0KGRlZmF1bHRWYWx1ZSkuYXJnUGFyc2VyKGZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9uLmRlZmF1bHQoZm4pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkZE9wdGlvbihvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBvcHRpb24gd2l0aCBgZmxhZ3NgLCBgZGVzY3JpcHRpb25gLCBhbmQgb3B0aW9uYWwgYXJndW1lbnQgcGFyc2luZyBmdW5jdGlvbiBvciBgZGVmYXVsdFZhbHVlYCBvciBib3RoLlxuICAgKlxuICAgKiBUaGUgYGZsYWdzYCBzdHJpbmcgY29udGFpbnMgdGhlIHNob3J0IGFuZC9vciBsb25nIGZsYWdzLCBzZXBhcmF0ZWQgYnkgY29tbWEsIGEgcGlwZSBvciBzcGFjZS4gQSByZXF1aXJlZFxuICAgKiBvcHRpb24tYXJndW1lbnQgaXMgaW5kaWNhdGVkIGJ5IGA8PmAgYW5kIGFuIG9wdGlvbmFsIG9wdGlvbi1hcmd1bWVudCBieSBgW11gLlxuICAgKlxuICAgKiBTZWUgdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLCBhbmQgc2VlIGFsc28gYWRkT3B0aW9uKCkgYW5kIHJlcXVpcmVkT3B0aW9uKCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW1cbiAgICogICAgIC5vcHRpb24oJy1wLCAtLXBlcHBlcicsICdhZGQgcGVwcGVyJylcbiAgICogICAgIC5vcHRpb24oJy1wLCAtLXBpenphLXR5cGUgPFRZUEU+JywgJ3R5cGUgb2YgcGl6emEnKSAvLyByZXF1aXJlZCBvcHRpb24tYXJndW1lbnRcbiAgICogICAgIC5vcHRpb24oJy1jLCAtLWNoZWVzZSBbQ0hFRVNFXScsICdhZGQgZXh0cmEgY2hlZXNlJywgJ21venphcmVsbGEnKSAvLyBvcHRpb25hbCBvcHRpb24tYXJndW1lbnQgd2l0aCBkZWZhdWx0XG4gICAqICAgICAub3B0aW9uKCctdCwgLS10aXAgPFZBTFVFPicsICdhZGQgdGlwIHRvIHB1cmNoYXNlIGNvc3QnLCBwYXJzZUZsb2F0KSAvLyBjdXN0b20gcGFyc2UgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufCopfSBbcGFyc2VBcmddIC0gY3VzdG9tIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIG9yIGRlZmF1bHQgdmFsdWVcbiAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgb3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbiwgcGFyc2VBcmcsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25FeCh7fSwgZmxhZ3MsIGRlc2NyaXB0aW9uLCBwYXJzZUFyZywgZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSByZXF1aXJlZCBvcHRpb24gd2hpY2ggbXVzdCBoYXZlIGEgdmFsdWUgYWZ0ZXIgcGFyc2luZy4gVGhpcyB1c3VhbGx5IG1lYW5zXG4gICAqIHRoZSBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gKE90aGVyd2lzZSB0aGUgc2FtZSBhcyAub3B0aW9uKCkuKVxuICAgKlxuICAgKiBUaGUgYGZsYWdzYCBzdHJpbmcgY29udGFpbnMgdGhlIHNob3J0IGFuZC9vciBsb25nIGZsYWdzLCBzZXBhcmF0ZWQgYnkgY29tbWEsIGEgcGlwZSBvciBzcGFjZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufCopfSBbcGFyc2VBcmddIC0gY3VzdG9tIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIG9yIGRlZmF1bHQgdmFsdWVcbiAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgcmVxdWlyZWRPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uLCBwYXJzZUFyZywgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbkV4KFxuICAgICAgeyBtYW5kYXRvcnk6IHRydWUgfSxcbiAgICAgIGZsYWdzLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBwYXJzZUFyZyxcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsdGVyIHBhcnNpbmcgb2Ygc2hvcnQgZmxhZ3Mgd2l0aCBvcHRpb25hbCB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIGZvciBgLm9wdGlvbignLWYsLS1mbGFnIFt2YWx1ZV0nKTpcbiAgICogcHJvZ3JhbS5jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUodHJ1ZSk7ICAvLyBgLWY4MGAgaXMgdHJlYXRlZCBsaWtlIGAtLWZsYWc9ODBgLCB0aGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW91clxuICAgKiBwcm9ncmFtLmNvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZShmYWxzZSkgLy8gYC1mYmAgaXMgdHJlYXRlZCBsaWtlIGAtZiAtYmBcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbY29tYmluZV0gLSBpZiBgdHJ1ZWAgb3Igb21pdHRlZCwgYW4gb3B0aW9uYWwgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBkaXJlY3RseSBhZnRlciB0aGUgZmxhZy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBjb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUoY29tYmluZSA9IHRydWUpIHtcbiAgICB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUgPSAhIWNvbWJpbmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdW5rbm93biBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93VW5rbm93bl0gLSBpZiBgdHJ1ZWAgb3Igb21pdHRlZCwgbm8gZXJyb3Igd2lsbCBiZSB0aHJvd24gZm9yIHVua25vd24gb3B0aW9ucy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhbGxvd1Vua25vd25PcHRpb24oYWxsb3dVbmtub3duID0gdHJ1ZSkge1xuICAgIHRoaXMuX2FsbG93VW5rbm93bk9wdGlvbiA9ICEhYWxsb3dVbmtub3duO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IGV4Y2VzcyBjb21tYW5kLWFyZ3VtZW50cyBvbiB0aGUgY29tbWFuZCBsaW5lLiBQYXNzIGZhbHNlIHRvIG1ha2UgZXhjZXNzIGFyZ3VtZW50cyBhbiBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dFeGNlc3NdIC0gaWYgYHRydWVgIG9yIG9taXR0ZWQsIG5vIGVycm9yIHdpbGwgYmUgdGhyb3duIGZvciBleGNlc3MgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFsbG93RXhjZXNzQXJndW1lbnRzKGFsbG93RXhjZXNzID0gdHJ1ZSkge1xuICAgIHRoaXMuX2FsbG93RXhjZXNzQXJndW1lbnRzID0gISFhbGxvd0V4Y2VzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgcG9zaXRpb25hbCBvcHRpb25zLiBQb3NpdGlvbmFsIG1lYW5zIGdsb2JhbCBvcHRpb25zIGFyZSBzcGVjaWZpZWQgYmVmb3JlIHN1YmNvbW1hbmRzIHdoaWNoIGxldHNcbiAgICogc3ViY29tbWFuZHMgcmV1c2UgdGhlIHNhbWUgb3B0aW9uIG5hbWVzLCBhbmQgYWxzbyBlbmFibGVzIHN1YmNvbW1hbmRzIHRvIHR1cm4gb24gcGFzc1Rocm91Z2hPcHRpb25zLlxuICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbm9uLXBvc2l0aW9uYWwgYW5kIGdsb2JhbCBvcHRpb25zIG1heSBhcHBlYXIgYW55d2hlcmUgb24gdGhlIGNvbW1hbmQgbGluZS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbcG9zaXRpb25hbF1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVQb3NpdGlvbmFsT3B0aW9ucyhwb3NpdGlvbmFsID0gdHJ1ZSkge1xuICAgIHRoaXMuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zID0gISFwb3NpdGlvbmFsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhc3MgdGhyb3VnaCBvcHRpb25zIHRoYXQgY29tZSBhZnRlciBjb21tYW5kLWFyZ3VtZW50cyByYXRoZXIgdGhhbiB0cmVhdCB0aGVtIGFzIGNvbW1hbmQtb3B0aW9ucyxcbiAgICogc28gYWN0dWFsIGNvbW1hbmQtb3B0aW9ucyBjb21lIGJlZm9yZSBjb21tYW5kLWFyZ3VtZW50cy4gVHVybmluZyB0aGlzIG9uIGZvciBhIHN1YmNvbW1hbmQgcmVxdWlyZXNcbiAgICogcG9zaXRpb25hbCBvcHRpb25zIHRvIGhhdmUgYmVlbiBlbmFibGVkIG9uIHRoZSBwcm9ncmFtIChwYXJlbnQgY29tbWFuZHMpLlxuICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbm9uLXBvc2l0aW9uYWwgYW5kIG9wdGlvbnMgbWF5IGFwcGVhciBiZWZvcmUgb3IgYWZ0ZXIgY29tbWFuZC1hcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Bhc3NUaHJvdWdoXSBmb3IgdW5rbm93biBvcHRpb25zLlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHBhc3NUaHJvdWdoT3B0aW9ucyhwYXNzVGhyb3VnaCA9IHRydWUpIHtcbiAgICB0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMgPSAhIXBhc3NUaHJvdWdoO1xuICAgIHRoaXMuX2NoZWNrRm9yQnJva2VuUGFzc1Rocm91Z2goKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hlY2tGb3JCcm9rZW5QYXNzVGhyb3VnaCgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnBhcmVudCAmJlxuICAgICAgdGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zICYmXG4gICAgICAhdGhpcy5wYXJlbnQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwYXNzVGhyb3VnaE9wdGlvbnMgY2Fubm90IGJlIHVzZWQgZm9yICcke3RoaXMuX25hbWV9JyB3aXRob3V0IHR1cm5pbmcgb24gZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgZm9yIHBhcmVudCBjb21tYW5kKHMpYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RvcmUgb3B0aW9uIHZhbHVlcyBhcyBwcm9wZXJ0aWVzIG9uIGNvbW1hbmQgb2JqZWN0LFxuICAgKiBvciBzdG9yZSBzZXBhcmF0ZWx5IChzcGVjaWZ5IGZhbHNlKS4gSW4gYm90aCBjYXNlcyB0aGUgb3B0aW9uIHZhbHVlcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgLm9wdHMoKS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbc3RvcmVBc1Byb3BlcnRpZXM9dHJ1ZV1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHN0b3JlT3B0aW9uc0FzUHJvcGVydGllcyhzdG9yZUFzUHJvcGVydGllcyA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsIC5zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMoKSBiZWZvcmUgYWRkaW5nIG9wdGlvbnMnKTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX29wdGlvblZhbHVlcykubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdjYWxsIC5zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMoKSBiZWZvcmUgc2V0dGluZyBvcHRpb24gdmFsdWVzJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcyA9ICEhc3RvcmVBc1Byb3BlcnRpZXM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgb3B0aW9uIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge29iamVjdH0gdmFsdWVcbiAgICovXG5cbiAgZ2V0T3B0aW9uVmFsdWUoa2V5KSB7XG4gICAgaWYgKHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcykge1xuICAgICAgcmV0dXJuIHRoaXNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvblZhbHVlc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIG9wdGlvbiB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHNldE9wdGlvblZhbHVlKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2Uoa2V5LCB2YWx1ZSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBvcHRpb24gdmFsdWUgYW5kIHdoZXJlIHRoZSB2YWx1ZSBjYW1lIGZyb20uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtvYmplY3R9IHZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBleHBlY3RlZCB2YWx1ZXMgYXJlIGRlZmF1bHQvY29uZmlnL2Vudi9jbGkvaW1wbGllZFxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKGtleSwgdmFsdWUsIHNvdXJjZSkge1xuICAgIGlmICh0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMpIHtcbiAgICAgIHRoaXNba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vcHRpb25WYWx1ZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl9vcHRpb25WYWx1ZVNvdXJjZXNba2V5XSA9IHNvdXJjZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc291cmNlIG9mIG9wdGlvbiB2YWx1ZS5cbiAgICogRXhwZWN0ZWQgdmFsdWVzIGFyZSBkZWZhdWx0IHwgY29uZmlnIHwgZW52IHwgY2xpIHwgaW1wbGllZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgZ2V0T3B0aW9uVmFsdWVTb3VyY2Uoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvblZhbHVlU291cmNlc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2Ugb2Ygb3B0aW9uIHZhbHVlLiBTZWUgYWxzbyAub3B0c1dpdGhHbG9iYWxzKCkuXG4gICAqIEV4cGVjdGVkIHZhbHVlcyBhcmUgZGVmYXVsdCB8IGNvbmZpZyB8IGVudiB8IGNsaSB8IGltcGxpZWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIGdldE9wdGlvblZhbHVlU291cmNlV2l0aEdsb2JhbHMoa2V5KSB7XG4gICAgLy8gZ2xvYmFsIG92ZXJ3cml0ZXMgbG9jYWwsIGxpa2Ugb3B0c1dpdGhHbG9iYWxzXG4gICAgbGV0IHNvdXJjZTtcbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBpZiAoY21kLmdldE9wdGlvblZhbHVlU291cmNlKGtleSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzb3VyY2UgPSBjbWQuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uoa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyIGFyZ3VtZW50cyBmcm9tIGltcGxpZWQgb3IgZXhwbGljaXQgYXJndW1lbnRzLlxuICAgKiBTaWRlLWVmZmVjdHM6IHNldCBfc2NyaXB0UGF0aCBpZiBhcmdzIGluY2x1ZGVkIHNjcmlwdC4gVXNlZCBmb3IgZGVmYXVsdCBwcm9ncmFtIG5hbWUsIGFuZCBzdWJjb21tYW5kIHNlYXJjaGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcHJlcGFyZVVzZXJBcmdzKGFyZ3YsIHBhcnNlT3B0aW9ucykge1xuICAgIGlmIChhcmd2ICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkoYXJndikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmlyc3QgcGFyYW1ldGVyIHRvIHBhcnNlIG11c3QgYmUgYXJyYXkgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHBhcnNlT3B0aW9ucyA9IHBhcnNlT3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIGF1dG8tZGV0ZWN0IGFyZ3VtZW50IGNvbnZlbnRpb25zIGlmIG5vdGhpbmcgc3VwcGxpZWRcbiAgICBpZiAoYXJndiA9PT0gdW5kZWZpbmVkICYmIHBhcnNlT3B0aW9ucy5mcm9tID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnZlcnNpb25zPy5lbGVjdHJvbikge1xuICAgICAgICBwYXJzZU9wdGlvbnMuZnJvbSA9ICdlbGVjdHJvbic7XG4gICAgICB9XG4gICAgICAvLyBjaGVjayBub2RlIHNwZWNpZmljIG9wdGlvbnMgZm9yIHNjZW5hcmlvcyB3aGVyZSB1c2VyIENMSSBhcmdzIGZvbGxvdyBleGVjdXRhYmxlIHdpdGhvdXQgc2NyaXB0bmFtZVxuICAgICAgY29uc3QgZXhlY0FyZ3YgPSBwcm9jZXNzLmV4ZWNBcmd2ID8/IFtdO1xuICAgICAgaWYgKFxuICAgICAgICBleGVjQXJndi5pbmNsdWRlcygnLWUnKSB8fFxuICAgICAgICBleGVjQXJndi5pbmNsdWRlcygnLS1ldmFsJykgfHxcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy1wJykgfHxcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy0tcHJpbnQnKVxuICAgICAgKSB7XG4gICAgICAgIHBhcnNlT3B0aW9ucy5mcm9tID0gJ2V2YWwnOyAvLyBpbnRlcm5hbCB1c2FnZSwgbm90IGRvY3VtZW50ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkZWZhdWx0IHRvIHVzaW5nIHByb2Nlc3MuYXJndlxuICAgIGlmIChhcmd2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyZ3YgPSBwcm9jZXNzLmFyZ3Y7XG4gICAgfVxuICAgIHRoaXMucmF3QXJncyA9IGFyZ3Yuc2xpY2UoKTtcblxuICAgIC8vIGV4dHJhY3QgdGhlIHVzZXIgYXJncyBhbmQgc2NyaXB0UGF0aFxuICAgIGxldCB1c2VyQXJncztcbiAgICBzd2l0Y2ggKHBhcnNlT3B0aW9ucy5mcm9tKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICB0aGlzLl9zY3JpcHRQYXRoID0gYXJndlsxXTtcbiAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VsZWN0cm9uJzpcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBkZWZhdWx0QXBwIGlzIGFuIHVua25vd24gcHJvcGVydHlcbiAgICAgICAgaWYgKHByb2Nlc3MuZGVmYXVsdEFwcCkge1xuICAgICAgICAgIHRoaXMuX3NjcmlwdFBhdGggPSBhcmd2WzFdO1xuICAgICAgICAgIHVzZXJBcmdzID0gYXJndi5zbGljZSgyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1c2VyJzpcbiAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2V2YWwnOlxuICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB1bmV4cGVjdGVkIHBhcnNlIG9wdGlvbiB7IGZyb206ICcke3BhcnNlT3B0aW9ucy5mcm9tfScgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmluZCBkZWZhdWx0IG5hbWUgZm9yIHByb2dyYW0gZnJvbSBhcmd1bWVudHMuXG4gICAgaWYgKCF0aGlzLl9uYW1lICYmIHRoaXMuX3NjcmlwdFBhdGgpXG4gICAgICB0aGlzLm5hbWVGcm9tRmlsZW5hbWUodGhpcy5fc2NyaXB0UGF0aCk7XG4gICAgdGhpcy5fbmFtZSA9IHRoaXMuX25hbWUgfHwgJ3Byb2dyYW0nO1xuXG4gICAgcmV0dXJuIHVzZXJBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGBhcmd2YCwgc2V0dGluZyBvcHRpb25zIGFuZCBpbnZva2luZyBjb21tYW5kcyB3aGVuIGRlZmluZWQuXG4gICAqXG4gICAqIFVzZSBwYXJzZUFzeW5jIGluc3RlYWQgb2YgcGFyc2UgaWYgYW55IG9mIHlvdXIgYWN0aW9uIGhhbmRsZXJzIGFyZSBhc3luYy5cbiAgICpcbiAgICogQ2FsbCB3aXRoIG5vIHBhcmFtZXRlcnMgdG8gcGFyc2UgYHByb2Nlc3MuYXJndmAuIERldGVjdHMgRWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBvcHRpb25zIGxpa2UgYG5vZGUgLS1ldmFsYC4gRWFzeSBtb2RlIVxuICAgKlxuICAgKiBPciBjYWxsIHdpdGggYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBwYXJzZSwgYW5kIG9wdGlvbmFsbHkgd2hlcmUgdGhlIHVzZXIgYXJndW1lbnRzIHN0YXJ0IGJ5IHNwZWNpZnlpbmcgd2hlcmUgdGhlIGFyZ3VtZW50cyBhcmUgYGZyb21gOlxuICAgKiAtIGAnbm9kZSdgOiBkZWZhdWx0LCBgYXJndlswXWAgaXMgdGhlIGFwcGxpY2F0aW9uIGFuZCBgYXJndlsxXWAgaXMgdGhlIHNjcmlwdCBiZWluZyBydW4sIHdpdGggdXNlciBhcmd1bWVudHMgYWZ0ZXIgdGhhdFxuICAgKiAtIGAnZWxlY3Ryb24nYDogYGFyZ3ZbMF1gIGlzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYGFyZ3ZbMV1gIHZhcmllcyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZWxlY3Ryb24gYXBwbGljYXRpb24gaXMgcGFja2FnZWRcbiAgICogLSBgJ3VzZXInYDoganVzdCB1c2VyIGFyZ3VtZW50c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLnBhcnNlKCk7IC8vIHBhcnNlIHByb2Nlc3MuYXJndiBhbmQgYXV0by1kZXRlY3QgZWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBmbGFnc1xuICAgKiBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7IC8vIGFzc3VtZSBhcmd2WzBdIGlzIGFwcCBhbmQgYXJndlsxXSBpcyBzY3JpcHRcbiAgICogcHJvZ3JhbS5wYXJzZShteS1hcmdzLCB7IGZyb206ICd1c2VyJyB9KTsgLy8ganVzdCB1c2VyIHN1cHBsaWVkIGFyZ3VtZW50cywgbm90aGluZyBzcGVjaWFsIGFib3V0IGFyZ3ZbMF1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3ZdIC0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHByb2Nlc3MuYXJndlxuICAgKiBAcGFyYW0ge29iamVjdH0gW3BhcnNlT3B0aW9uc10gLSBvcHRpb25hbGx5IHNwZWNpZnkgc3R5bGUgb2Ygb3B0aW9ucyB3aXRoIGZyb206IG5vZGUvdXNlci9lbGVjdHJvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcnNlT3B0aW9ucy5mcm9tXSAtIHdoZXJlIHRoZSBhcmdzIGFyZSBmcm9tOiAnbm9kZScsICd1c2VyJywgJ2VsZWN0cm9uJ1xuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgcGFyc2UoYXJndiwgcGFyc2VPcHRpb25zKSB7XG4gICAgY29uc3QgdXNlckFyZ3MgPSB0aGlzLl9wcmVwYXJlVXNlckFyZ3MoYXJndiwgcGFyc2VPcHRpb25zKTtcbiAgICB0aGlzLl9wYXJzZUNvbW1hbmQoW10sIHVzZXJBcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGBhcmd2YCwgc2V0dGluZyBvcHRpb25zIGFuZCBpbnZva2luZyBjb21tYW5kcyB3aGVuIGRlZmluZWQuXG4gICAqXG4gICAqIENhbGwgd2l0aCBubyBwYXJhbWV0ZXJzIHRvIHBhcnNlIGBwcm9jZXNzLmFyZ3ZgLiBEZXRlY3RzIEVsZWN0cm9uIGFuZCBzcGVjaWFsIG5vZGUgb3B0aW9ucyBsaWtlIGBub2RlIC0tZXZhbGAuIEVhc3kgbW9kZSFcbiAgICpcbiAgICogT3IgY2FsbCB3aXRoIGFuIGFycmF5IG9mIHN0cmluZ3MgdG8gcGFyc2UsIGFuZCBvcHRpb25hbGx5IHdoZXJlIHRoZSB1c2VyIGFyZ3VtZW50cyBzdGFydCBieSBzcGVjaWZ5aW5nIHdoZXJlIHRoZSBhcmd1bWVudHMgYXJlIGBmcm9tYDpcbiAgICogLSBgJ25vZGUnYDogZGVmYXVsdCwgYGFyZ3ZbMF1gIGlzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYGFyZ3ZbMV1gIGlzIHRoZSBzY3JpcHQgYmVpbmcgcnVuLCB3aXRoIHVzZXIgYXJndW1lbnRzIGFmdGVyIHRoYXRcbiAgICogLSBgJ2VsZWN0cm9uJ2A6IGBhcmd2WzBdYCBpcyB0aGUgYXBwbGljYXRpb24gYW5kIGBhcmd2WzFdYCB2YXJpZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGVsZWN0cm9uIGFwcGxpY2F0aW9uIGlzIHBhY2thZ2VkXG4gICAqIC0gYCd1c2VyJ2A6IGp1c3QgdXNlciBhcmd1bWVudHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgcHJvZ3JhbS5wYXJzZUFzeW5jKCk7IC8vIHBhcnNlIHByb2Nlc3MuYXJndiBhbmQgYXV0by1kZXRlY3QgZWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBmbGFnc1xuICAgKiBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMocHJvY2Vzcy5hcmd2KTsgLy8gYXNzdW1lIGFyZ3ZbMF0gaXMgYXBwIGFuZCBhcmd2WzFdIGlzIHNjcmlwdFxuICAgKiBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMobXktYXJncywgeyBmcm9tOiAndXNlcicgfSk7IC8vIGp1c3QgdXNlciBzdXBwbGllZCBhcmd1bWVudHMsIG5vdGhpbmcgc3BlY2lhbCBhYm91dCBhcmd2WzBdXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmd2XVxuICAgKiBAcGFyYW0ge29iamVjdH0gW3BhcnNlT3B0aW9uc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcnNlT3B0aW9ucy5mcm9tIC0gd2hlcmUgdGhlIGFyZ3MgYXJlIGZyb206ICdub2RlJywgJ3VzZXInLCAnZWxlY3Ryb24nXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuXG4gIGFzeW5jIHBhcnNlQXN5bmMoYXJndiwgcGFyc2VPcHRpb25zKSB7XG4gICAgY29uc3QgdXNlckFyZ3MgPSB0aGlzLl9wcmVwYXJlVXNlckFyZ3MoYXJndiwgcGFyc2VPcHRpb25zKTtcbiAgICBhd2FpdCB0aGlzLl9wYXJzZUNvbW1hbmQoW10sIHVzZXJBcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWItY29tbWFuZCBleGVjdXRhYmxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZXhlY3V0ZVN1YkNvbW1hbmQoc3ViY29tbWFuZCwgYXJncykge1xuICAgIGFyZ3MgPSBhcmdzLnNsaWNlKCk7XG4gICAgbGV0IGxhdW5jaFdpdGhOb2RlID0gZmFsc2U7IC8vIFVzZSBub2RlIGZvciBzb3VyY2UgdGFyZ2V0cyBzbyBkbyBub3QgbmVlZCB0byBnZXQgcGVybWlzc2lvbnMgY29ycmVjdCwgYW5kIG9uIFdpbmRvd3MuXG4gICAgY29uc3Qgc291cmNlRXh0ID0gWycuanMnLCAnLnRzJywgJy50c3gnLCAnLm1qcycsICcuY2pzJ107XG5cbiAgICBmdW5jdGlvbiBmaW5kRmlsZShiYXNlRGlyLCBiYXNlTmFtZSkge1xuICAgICAgLy8gTG9vayBmb3Igc3BlY2lmaWVkIGZpbGVcbiAgICAgIGNvbnN0IGxvY2FsQmluID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIGJhc2VOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsQmluKSkgcmV0dXJuIGxvY2FsQmluO1xuXG4gICAgICAvLyBTdG9wIGxvb2tpbmcgaWYgY2FuZGlkYXRlIGFscmVhZHkgaGFzIGFuIGV4cGVjdGVkIGV4dGVuc2lvbi5cbiAgICAgIGlmIChzb3VyY2VFeHQuaW5jbHVkZXMocGF0aC5leHRuYW1lKGJhc2VOYW1lKSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIFRyeSBhbGwgdGhlIGV4dGVuc2lvbnMuXG4gICAgICBjb25zdCBmb3VuZEV4dCA9IHNvdXJjZUV4dC5maW5kKChleHQpID0+XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoYCR7bG9jYWxCaW59JHtleHR9YCksXG4gICAgICApO1xuICAgICAgaWYgKGZvdW5kRXh0KSByZXR1cm4gYCR7bG9jYWxCaW59JHtmb3VuZEV4dH1gO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIE5vdCBjaGVja2luZyBmb3IgaGVscCBmaXJzdC4gVW5saWtlbHkgdG8gaGF2ZSBtYW5kYXRvcnkgYW5kIGV4ZWN1dGFibGUsIGFuZCBjYW4ndCByb2J1c3RseSB0ZXN0IGZvciBoZWxwIGZsYWdzIGluIGV4dGVybmFsIGNvbW1hbmQuXG4gICAgdGhpcy5fY2hlY2tGb3JNaXNzaW5nTWFuZGF0b3J5T3B0aW9ucygpO1xuICAgIHRoaXMuX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCk7XG5cbiAgICAvLyBleGVjdXRhYmxlRmlsZSBhbmQgZXhlY3V0YWJsZURpciBtaWdodCBiZSBmdWxsIHBhdGgsIG9yIGp1c3QgYSBuYW1lXG4gICAgbGV0IGV4ZWN1dGFibGVGaWxlID1cbiAgICAgIHN1YmNvbW1hbmQuX2V4ZWN1dGFibGVGaWxlIHx8IGAke3RoaXMuX25hbWV9LSR7c3ViY29tbWFuZC5fbmFtZX1gO1xuICAgIGxldCBleGVjdXRhYmxlRGlyID0gdGhpcy5fZXhlY3V0YWJsZURpciB8fCAnJztcbiAgICBpZiAodGhpcy5fc2NyaXB0UGF0aCkge1xuICAgICAgbGV0IHJlc29sdmVkU2NyaXB0UGF0aDsgLy8gcmVzb2x2ZSBwb3NzaWJsZSBzeW1saW5rIGZvciBpbnN0YWxsZWQgbnBtIGJpbmFyeVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZWRTY3JpcHRQYXRoID0gZnMucmVhbHBhdGhTeW5jKHRoaXMuX3NjcmlwdFBhdGgpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlc29sdmVkU2NyaXB0UGF0aCA9IHRoaXMuX3NjcmlwdFBhdGg7XG4gICAgICB9XG4gICAgICBleGVjdXRhYmxlRGlyID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICBwYXRoLmRpcm5hbWUocmVzb2x2ZWRTY3JpcHRQYXRoKSxcbiAgICAgICAgZXhlY3V0YWJsZURpcixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTG9vayBmb3IgYSBsb2NhbCBmaWxlIGluIHByZWZlcmVuY2UgdG8gYSBjb21tYW5kIGluIFBBVEguXG4gICAgaWYgKGV4ZWN1dGFibGVEaXIpIHtcbiAgICAgIGxldCBsb2NhbEZpbGUgPSBmaW5kRmlsZShleGVjdXRhYmxlRGlyLCBleGVjdXRhYmxlRmlsZSk7XG5cbiAgICAgIC8vIExlZ2FjeSBzZWFyY2ggdXNpbmcgcHJlZml4IG9mIHNjcmlwdCBuYW1lIGluc3RlYWQgb2YgY29tbWFuZCBuYW1lXG4gICAgICBpZiAoIWxvY2FsRmlsZSAmJiAhc3ViY29tbWFuZC5fZXhlY3V0YWJsZUZpbGUgJiYgdGhpcy5fc2NyaXB0UGF0aCkge1xuICAgICAgICBjb25zdCBsZWdhY3lOYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgICB0aGlzLl9zY3JpcHRQYXRoLFxuICAgICAgICAgIHBhdGguZXh0bmFtZSh0aGlzLl9zY3JpcHRQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxlZ2FjeU5hbWUgIT09IHRoaXMuX25hbWUpIHtcbiAgICAgICAgICBsb2NhbEZpbGUgPSBmaW5kRmlsZShcbiAgICAgICAgICAgIGV4ZWN1dGFibGVEaXIsXG4gICAgICAgICAgICBgJHtsZWdhY3lOYW1lfS0ke3N1YmNvbW1hbmQuX25hbWV9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBleGVjdXRhYmxlRmlsZSA9IGxvY2FsRmlsZSB8fCBleGVjdXRhYmxlRmlsZTtcbiAgICB9XG5cbiAgICBsYXVuY2hXaXRoTm9kZSA9IHNvdXJjZUV4dC5pbmNsdWRlcyhwYXRoLmV4dG5hbWUoZXhlY3V0YWJsZUZpbGUpKTtcblxuICAgIGxldCBwcm9jO1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSAnd2luMzInKSB7XG4gICAgICBpZiAobGF1bmNoV2l0aE5vZGUpIHtcbiAgICAgICAgYXJncy51bnNoaWZ0KGV4ZWN1dGFibGVGaWxlKTtcbiAgICAgICAgLy8gYWRkIGV4ZWN1dGFibGUgYXJndW1lbnRzIHRvIHNwYXduXG4gICAgICAgIGFyZ3MgPSBpbmNyZW1lbnROb2RlSW5zcGVjdG9yUG9ydChwcm9jZXNzLmV4ZWNBcmd2KS5jb25jYXQoYXJncyk7XG5cbiAgICAgICAgcHJvYyA9IGNoaWxkUHJvY2Vzcy5zcGF3bihwcm9jZXNzLmFyZ3ZbMF0sIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2MgPSBjaGlsZFByb2Nlc3Muc3Bhd24oZXhlY3V0YWJsZUZpbGUsIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXJncy51bnNoaWZ0KGV4ZWN1dGFibGVGaWxlKTtcbiAgICAgIC8vIGFkZCBleGVjdXRhYmxlIGFyZ3VtZW50cyB0byBzcGF3blxuICAgICAgYXJncyA9IGluY3JlbWVudE5vZGVJbnNwZWN0b3JQb3J0KHByb2Nlc3MuZXhlY0FyZ3YpLmNvbmNhdChhcmdzKTtcbiAgICAgIHByb2MgPSBjaGlsZFByb2Nlc3Muc3Bhd24ocHJvY2Vzcy5leGVjUGF0aCwgYXJncywgeyBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIH1cblxuICAgIGlmICghcHJvYy5raWxsZWQpIHtcbiAgICAgIC8vIHRlc3RpbmcgbWFpbmx5IHRvIGF2b2lkIGxlYWsgd2FybmluZ3MgZHVyaW5nIHVuaXQgdGVzdHMgd2l0aCBtb2NrZWQgc3Bhd25cbiAgICAgIGNvbnN0IHNpZ25hbHMgPSBbJ1NJR1VTUjEnLCAnU0lHVVNSMicsICdTSUdURVJNJywgJ1NJR0lOVCcsICdTSUdIVVAnXTtcbiAgICAgIHNpZ25hbHMuZm9yRWFjaCgoc2lnbmFsKSA9PiB7XG4gICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHByb2Mua2lsbGVkID09PSBmYWxzZSAmJiBwcm9jLmV4aXRDb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIGJlY2F1c2Ugc2lnbmFscyBub3QgdHlwZWQgdG8ga25vd24gc3RyaW5nc1xuICAgICAgICAgICAgcHJvYy5raWxsKHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQgdGVybWluYXRlIHByb2Nlc3Mgd2hlbiBzcGF3bmVkIHByb2Nlc3MgdGVybWluYXRlcy5cbiAgICBjb25zdCBleGl0Q2FsbGJhY2sgPSB0aGlzLl9leGl0Q2FsbGJhY2s7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoY29kZSkgPT4ge1xuICAgICAgY29kZSA9IGNvZGUgPz8gMTsgLy8gY29kZSBpcyBudWxsIGlmIHNwYXduZWQgcHJvY2VzcyB0ZXJtaW5hdGVkIGR1ZSB0byBhIHNpZ25hbFxuICAgICAgaWYgKCFleGl0Q2FsbGJhY2spIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpdENhbGxiYWNrKFxuICAgICAgICAgIG5ldyBDb21tYW5kZXJFcnJvcihcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnLFxuICAgICAgICAgICAgJyhjbG9zZSknLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlOiBiZWNhdXNlIGVyci5jb2RlIGlzIGFuIHVua25vd24gcHJvcGVydHlcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgY29uc3QgZXhlY3V0YWJsZURpck1lc3NhZ2UgPSBleGVjdXRhYmxlRGlyXG4gICAgICAgICAgPyBgc2VhcmNoZWQgZm9yIGxvY2FsIHN1YmNvbW1hbmQgcmVsYXRpdmUgdG8gZGlyZWN0b3J5ICcke2V4ZWN1dGFibGVEaXJ9J2BcbiAgICAgICAgICA6ICdubyBkaXJlY3RvcnkgZm9yIHNlYXJjaCBmb3IgbG9jYWwgc3ViY29tbWFuZCwgdXNlIC5leGVjdXRhYmxlRGlyKCkgdG8gc3VwcGx5IGEgY3VzdG9tIGRpcmVjdG9yeSc7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGFibGVNaXNzaW5nID0gYCcke2V4ZWN1dGFibGVGaWxlfScgZG9lcyBub3QgZXhpc3RcbiAtIGlmICcke3N1YmNvbW1hbmQuX25hbWV9JyBpcyBub3QgbWVhbnQgdG8gYmUgYW4gZXhlY3V0YWJsZSBjb21tYW5kLCByZW1vdmUgZGVzY3JpcHRpb24gcGFyYW1ldGVyIGZyb20gJy5jb21tYW5kKCknIGFuZCB1c2UgJy5kZXNjcmlwdGlvbigpJyBpbnN0ZWFkXG4gLSBpZiB0aGUgZGVmYXVsdCBleGVjdXRhYmxlIG5hbWUgaXMgbm90IHN1aXRhYmxlLCB1c2UgdGhlIGV4ZWN1dGFibGVGaWxlIG9wdGlvbiB0byBzdXBwbHkgYSBjdXN0b20gbmFtZSBvciBwYXRoXG4gLSAke2V4ZWN1dGFibGVEaXJNZXNzYWdlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihleGVjdXRhYmxlTWlzc2luZyk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2UgZXJyLmNvZGUgaXMgYW4gdW5rbm93biBwcm9wZXJ0eVxuICAgICAgfSBlbHNlIGlmIChlcnIuY29kZSA9PT0gJ0VBQ0NFUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtleGVjdXRhYmxlRmlsZX0nIG5vdCBleGVjdXRhYmxlYCk7XG4gICAgICB9XG4gICAgICBpZiAoIWV4aXRDYWxsYmFjaykge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgQ29tbWFuZGVyRXJyb3IoXG4gICAgICAgICAgMSxcbiAgICAgICAgICAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnLFxuICAgICAgICAgICcoZXJyb3IpJyxcbiAgICAgICAgKTtcbiAgICAgICAgd3JhcHBlZEVycm9yLm5lc3RlZEVycm9yID0gZXJyO1xuICAgICAgICBleGl0Q2FsbGJhY2sod3JhcHBlZEVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNoaWxkIHByb2Nlc3NcbiAgICB0aGlzLnJ1bm5pbmdDb21tYW5kID0gcHJvYztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZGlzcGF0Y2hTdWJjb21tYW5kKGNvbW1hbmROYW1lLCBvcGVyYW5kcywgdW5rbm93bikge1xuICAgIGNvbnN0IHN1YkNvbW1hbmQgPSB0aGlzLl9maW5kQ29tbWFuZChjb21tYW5kTmFtZSk7XG4gICAgaWYgKCFzdWJDb21tYW5kKSB0aGlzLmhlbHAoeyBlcnJvcjogdHJ1ZSB9KTtcblxuICAgIGxldCBwcm9taXNlQ2hhaW47XG4gICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGxTdWJDb21tYW5kSG9vayhcbiAgICAgIHByb21pc2VDaGFpbixcbiAgICAgIHN1YkNvbW1hbmQsXG4gICAgICAncHJlU3ViY29tbWFuZCcsXG4gICAgKTtcbiAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbChwcm9taXNlQ2hhaW4sICgpID0+IHtcbiAgICAgIGlmIChzdWJDb21tYW5kLl9leGVjdXRhYmxlSGFuZGxlcikge1xuICAgICAgICB0aGlzLl9leGVjdXRlU3ViQ29tbWFuZChzdWJDb21tYW5kLCBvcGVyYW5kcy5jb25jYXQodW5rbm93bikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN1YkNvbW1hbmQuX3BhcnNlQ29tbWFuZChvcGVyYW5kcywgdW5rbm93bik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb21pc2VDaGFpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgaGVscCBkaXJlY3RseSBpZiBwb3NzaWJsZSwgb3IgZGlzcGF0Y2ggaWYgbmVjZXNzYXJ5LlxuICAgKiBlLmcuIGhlbHAgZm9vXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9kaXNwYXRjaEhlbHBDb21tYW5kKHN1YmNvbW1hbmROYW1lKSB7XG4gICAgaWYgKCFzdWJjb21tYW5kTmFtZSkge1xuICAgICAgdGhpcy5oZWxwKCk7XG4gICAgfVxuICAgIGNvbnN0IHN1YkNvbW1hbmQgPSB0aGlzLl9maW5kQ29tbWFuZChzdWJjb21tYW5kTmFtZSk7XG4gICAgaWYgKHN1YkNvbW1hbmQgJiYgIXN1YkNvbW1hbmQuX2V4ZWN1dGFibGVIYW5kbGVyKSB7XG4gICAgICBzdWJDb21tYW5kLmhlbHAoKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBwYXJzaW5nIHRoZSBoZWxwIGZsYWcgdG8gaW52b2tlIHRoZSBoZWxwLlxuICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoXG4gICAgICBzdWJjb21tYW5kTmFtZSxcbiAgICAgIFtdLFxuICAgICAgW3RoaXMuX2dldEhlbHBPcHRpb24oKT8ubG9uZyA/PyB0aGlzLl9nZXRIZWxwT3B0aW9uKCk/LnNob3J0ID8/ICctLWhlbHAnXSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoaXMuYXJncyBhZ2FpbnN0IGV4cGVjdGVkIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoZWNrTnVtYmVyT2ZBcmd1bWVudHMoKSB7XG4gICAgLy8gdG9vIGZld1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChhcmcsIGkpID0+IHtcbiAgICAgIGlmIChhcmcucmVxdWlyZWQgJiYgdGhpcy5hcmdzW2ldID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5taXNzaW5nQXJndW1lbnQoYXJnLm5hbWUoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gdG9vIG1hbnlcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzW3RoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGggLSAxXS52YXJpYWRpY1xuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5hcmdzLmxlbmd0aCA+IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2V4Y2Vzc0FyZ3VtZW50cyh0aGlzLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHRoaXMuYXJncyB1c2luZyB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMgYW5kIHNhdmUgYXMgdGhpcy5wcm9jZXNzZWRBcmdzIVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcHJvY2Vzc0FyZ3VtZW50cygpIHtcbiAgICBjb25zdCBteVBhcnNlQXJnID0gKGFyZ3VtZW50LCB2YWx1ZSwgcHJldmlvdXMpID0+IHtcbiAgICAgIC8vIEV4dHJhIHByb2Nlc3NpbmcgZm9yIG5pY2UgZXJyb3IgbWVzc2FnZSBvbiBwYXJzaW5nIGZhaWx1cmUuXG4gICAgICBsZXQgcGFyc2VkVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiBhcmd1bWVudC5wYXJzZUFyZykge1xuICAgICAgICBjb25zdCBpbnZhbGlkVmFsdWVNZXNzYWdlID0gYGVycm9yOiBjb21tYW5kLWFyZ3VtZW50IHZhbHVlICcke3ZhbHVlfScgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgJyR7YXJndW1lbnQubmFtZSgpfScuYDtcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB0aGlzLl9jYWxsUGFyc2VBcmcoXG4gICAgICAgICAgYXJndW1lbnQsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgcHJldmlvdXMsXG4gICAgICAgICAgaW52YWxpZFZhbHVlTWVzc2FnZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgICB9O1xuXG4gICAgdGhpcy5fY2hlY2tOdW1iZXJPZkFyZ3VtZW50cygpO1xuXG4gICAgY29uc3QgcHJvY2Vzc2VkQXJncyA9IFtdO1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChkZWNsYXJlZEFyZywgaW5kZXgpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IGRlY2xhcmVkQXJnLmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChkZWNsYXJlZEFyZy52YXJpYWRpYykge1xuICAgICAgICAvLyBDb2xsZWN0IHRvZ2V0aGVyIHJlbWFpbmluZyBhcmd1bWVudHMgZm9yIHBhc3NpbmcgdG9nZXRoZXIgYXMgYW4gYXJyYXkuXG4gICAgICAgIGlmIChpbmRleCA8IHRoaXMuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuYXJncy5zbGljZShpbmRleCk7XG4gICAgICAgICAgaWYgKGRlY2xhcmVkQXJnLnBhcnNlQXJnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlZHVjZSgocHJvY2Vzc2VkLCB2KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBteVBhcnNlQXJnKGRlY2xhcmVkQXJnLCB2LCBwcm9jZXNzZWQpO1xuICAgICAgICAgICAgfSwgZGVjbGFyZWRBcmcuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhbHVlID0gW107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaW5kZXggPCB0aGlzLmFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5hcmdzW2luZGV4XTtcbiAgICAgICAgaWYgKGRlY2xhcmVkQXJnLnBhcnNlQXJnKSB7XG4gICAgICAgICAgdmFsdWUgPSBteVBhcnNlQXJnKGRlY2xhcmVkQXJnLCB2YWx1ZSwgZGVjbGFyZWRBcmcuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJvY2Vzc2VkQXJnc1tpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnByb2Nlc3NlZEFyZ3MgPSBwcm9jZXNzZWRBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uY2Ugd2UgaGF2ZSBhIHByb21pc2Ugd2UgY2hhaW4sIGJ1dCBjYWxsIHN5bmNocm9ub3VzbHkgdW50aWwgdGhlbi5cbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm4geyhQcm9taXNlfHVuZGVmaW5lZCl9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGFpbk9yQ2FsbChwcm9taXNlLCBmbikge1xuICAgIC8vIHRoZW5hYmxlXG4gICAgaWYgKHByb21pc2UgJiYgcHJvbWlzZS50aGVuICYmIHR5cGVvZiBwcm9taXNlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIGFscmVhZHkgaGF2ZSBhIHByb21pc2UsIGNoYWluIGNhbGxiYWNrXG4gICAgICByZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IGZuKCkpO1xuICAgIH1cbiAgICAvLyBjYWxsYmFjayBtaWdodCByZXR1cm4gYSBwcm9taXNlXG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcmV0dXJuIHsoUHJvbWlzZXx1bmRlZmluZWQpfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hhaW5PckNhbGxIb29rcyhwcm9taXNlLCBldmVudCkge1xuICAgIGxldCByZXN1bHQgPSBwcm9taXNlO1xuICAgIGNvbnN0IGhvb2tzID0gW107XG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmlsdGVyKChjbWQpID0+IGNtZC5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdICE9PSB1bmRlZmluZWQpXG4gICAgICAuZm9yRWFjaCgoaG9va2VkQ29tbWFuZCkgPT4ge1xuICAgICAgICBob29rZWRDb21tYW5kLl9saWZlQ3ljbGVIb29rc1tldmVudF0uZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICBob29rcy5wdXNoKHsgaG9va2VkQ29tbWFuZCwgY2FsbGJhY2sgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgaWYgKGV2ZW50ID09PSAncG9zdEFjdGlvbicpIHtcbiAgICAgIGhvb2tzLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICBob29rcy5mb3JFYWNoKChob29rRGV0YWlsKSA9PiB7XG4gICAgICByZXN1bHQgPSB0aGlzLl9jaGFpbk9yQ2FsbChyZXN1bHQsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGhvb2tEZXRhaWwuY2FsbGJhY2soaG9va0RldGFpbC5ob29rZWRDb21tYW5kLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gc3ViQ29tbWFuZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHJldHVybiB7KFByb21pc2V8dW5kZWZpbmVkKX1cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoYWluT3JDYWxsU3ViQ29tbWFuZEhvb2socHJvbWlzZSwgc3ViQ29tbWFuZCwgZXZlbnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gcHJvbWlzZTtcbiAgICBpZiAodGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XS5mb3JFYWNoKChob29rKSA9PiB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2NoYWluT3JDYWxsKHJlc3VsdCwgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBob29rKHRoaXMsIHN1YkNvbW1hbmQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYXJndW1lbnRzIGluIGNvbnRleHQgb2YgdGhpcyBjb21tYW5kLlxuICAgKiBSZXR1cm5zIGFjdGlvbiByZXN1bHQsIGluIGNhc2UgaXQgaXMgYSBwcm9taXNlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcGFyc2VDb21tYW5kKG9wZXJhbmRzLCB1bmtub3duKSB7XG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZU9wdGlvbnModW5rbm93bik7XG4gICAgdGhpcy5fcGFyc2VPcHRpb25zRW52KCk7IC8vIGFmdGVyIGNsaSwgc28gcGFyc2VBcmcgbm90IGNhbGxlZCBvbiBib3RoIGNsaSBhbmQgZW52XG4gICAgdGhpcy5fcGFyc2VPcHRpb25zSW1wbGllZCgpO1xuICAgIG9wZXJhbmRzID0gb3BlcmFuZHMuY29uY2F0KHBhcnNlZC5vcGVyYW5kcyk7XG4gICAgdW5rbm93biA9IHBhcnNlZC51bmtub3duO1xuICAgIHRoaXMuYXJncyA9IG9wZXJhbmRzLmNvbmNhdCh1bmtub3duKTtcblxuICAgIGlmIChvcGVyYW5kcyAmJiB0aGlzLl9maW5kQ29tbWFuZChvcGVyYW5kc1swXSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQob3BlcmFuZHNbMF0sIG9wZXJhbmRzLnNsaWNlKDEpLCB1bmtub3duKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5fZ2V0SGVscENvbW1hbmQoKSAmJlxuICAgICAgb3BlcmFuZHNbMF0gPT09IHRoaXMuX2dldEhlbHBDb21tYW5kKCkubmFtZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hIZWxwQ29tbWFuZChvcGVyYW5kc1sxXSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWUpIHtcbiAgICAgIHRoaXMuX291dHB1dEhlbHBJZlJlcXVlc3RlZCh1bmtub3duKTsgLy8gUnVuIHRoZSBoZWxwIGZvciBkZWZhdWx0IGNvbW1hbmQgZnJvbSBwYXJlbnQgcmF0aGVyIHRoYW4gcGFzc2luZyB0byBkZWZhdWx0IGNvbW1hbmRcbiAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoXG4gICAgICAgIHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSxcbiAgICAgICAgb3BlcmFuZHMsXG4gICAgICAgIHVua25vd24sXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbW1hbmRzLmxlbmd0aCAmJlxuICAgICAgdGhpcy5hcmdzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgIXRoaXMuX2FjdGlvbkhhbmRsZXIgJiZcbiAgICAgICF0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWVcbiAgICApIHtcbiAgICAgIC8vIHByb2JhYmx5IG1pc3Npbmcgc3ViY29tbWFuZCBhbmQgbm8gaGFuZGxlciwgdXNlciBuZWVkcyBoZWxwIChhbmQgZXhpdClcbiAgICAgIHRoaXMuaGVscCh7IGVycm9yOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX291dHB1dEhlbHBJZlJlcXVlc3RlZChwYXJzZWQudW5rbm93bik7XG4gICAgdGhpcy5fY2hlY2tGb3JNaXNzaW5nTWFuZGF0b3J5T3B0aW9ucygpO1xuICAgIHRoaXMuX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCk7XG5cbiAgICAvLyBXZSBkbyBub3QgYWx3YXlzIGNhbGwgdGhpcyBjaGVjayB0byBhdm9pZCBtYXNraW5nIGEgXCJiZXR0ZXJcIiBlcnJvciwgbGlrZSB1bmtub3duIGNvbW1hbmQuXG4gICAgY29uc3QgY2hlY2tGb3JVbmtub3duT3B0aW9ucyA9ICgpID0+IHtcbiAgICAgIGlmIChwYXJzZWQudW5rbm93bi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudW5rbm93bk9wdGlvbihwYXJzZWQudW5rbm93blswXSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbW1hbmRFdmVudCA9IGBjb21tYW5kOiR7dGhpcy5uYW1lKCl9YDtcbiAgICBpZiAodGhpcy5fYWN0aW9uSGFuZGxlcikge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgdGhpcy5fcHJvY2Vzc0FyZ3VtZW50cygpO1xuXG4gICAgICBsZXQgcHJvbWlzZUNoYWluO1xuICAgICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGxIb29rcyhwcm9taXNlQ2hhaW4sICdwcmVBY3Rpb24nKTtcbiAgICAgIHByb21pc2VDaGFpbiA9IHRoaXMuX2NoYWluT3JDYWxsKHByb21pc2VDaGFpbiwgKCkgPT5cbiAgICAgICAgdGhpcy5fYWN0aW9uSGFuZGxlcih0aGlzLnByb2Nlc3NlZEFyZ3MpLFxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbChwcm9taXNlQ2hhaW4sICgpID0+IHtcbiAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KGNvbW1hbmRFdmVudCwgb3BlcmFuZHMsIHVua25vd24pOyAvLyBsZWdhY3lcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbEhvb2tzKHByb21pc2VDaGFpbiwgJ3Bvc3RBY3Rpb24nKTtcbiAgICAgIHJldHVybiBwcm9taXNlQ2hhaW47XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5saXN0ZW5lckNvdW50KGNvbW1hbmRFdmVudCkpIHtcbiAgICAgIGNoZWNrRm9yVW5rbm93bk9wdGlvbnMoKTtcbiAgICAgIHRoaXMuX3Byb2Nlc3NBcmd1bWVudHMoKTtcbiAgICAgIHRoaXMucGFyZW50LmVtaXQoY29tbWFuZEV2ZW50LCBvcGVyYW5kcywgdW5rbm93bik7IC8vIGxlZ2FjeVxuICAgIH0gZWxzZSBpZiAob3BlcmFuZHMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5fZmluZENvbW1hbmQoJyonKSkge1xuICAgICAgICAvLyBsZWdhY3kgZGVmYXVsdCBjb21tYW5kXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoJyonLCBvcGVyYW5kcywgdW5rbm93bik7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50KCdjb21tYW5kOionKSkge1xuICAgICAgICAvLyBza2lwIG9wdGlvbiBjaGVjaywgZW1pdCBldmVudCBmb3IgcG9zc2libGUgbWlzc3BlbGxpbmcgc3VnZ2VzdGlvblxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6KicsIG9wZXJhbmRzLCB1bmtub3duKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51bmtub3duQ29tbWFuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgICB0aGlzLl9wcm9jZXNzQXJndW1lbnRzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbW1hbmRzLmxlbmd0aCkge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgLy8gVGhpcyBjb21tYW5kIGhhcyBzdWJjb21tYW5kcyBhbmQgbm90aGluZyBob29rZWQgdXAgYXQgdGhpcyBsZXZlbCwgc28gZGlzcGxheSBoZWxwIChhbmQgZXhpdCkuXG4gICAgICB0aGlzLmhlbHAoeyBlcnJvcjogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgdGhpcy5fcHJvY2Vzc0FyZ3VtZW50cygpO1xuICAgICAgLy8gZmFsbCB0aHJvdWdoIGZvciBjYWxsZXIgdG8gaGFuZGxlIGFmdGVyIGNhbGxpbmcgLnBhcnNlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtYXRjaGluZyBjb21tYW5kLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJuIHtDb21tYW5kIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgX2ZpbmRDb21tYW5kKG5hbWUpIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZHMuZmluZChcbiAgICAgIChjbWQpID0+IGNtZC5fbmFtZSA9PT0gbmFtZSB8fCBjbWQuX2FsaWFzZXMuaW5jbHVkZXMobmFtZSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gb3B0aW9uIG1hdGNoaW5nIGBhcmdgIGlmIGFueS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIF9maW5kT3B0aW9uKGFyZykge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24uaXMoYXJnKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGlmIGEgbWFuZGF0b3J5IG9wdGlvbiBkb2VzIG5vdCBoYXZlIGEgdmFsdWUuXG4gICAqIENhbGxlZCBhZnRlciBjaGVja2luZyBmb3IgaGVscCBmbGFncyBpbiBsZWFmIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGVja0Zvck1pc3NpbmdNYW5kYXRvcnlPcHRpb25zKCkge1xuICAgIC8vIFdhbGsgdXAgaGllcmFyY2h5IHNvIGNhbiBjYWxsIGluIHN1YmNvbW1hbmQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGRpc3BsYXlpbmcgaGVscC5cbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBjbWQub3B0aW9ucy5mb3JFYWNoKChhbk9wdGlvbikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYW5PcHRpb24ubWFuZGF0b3J5ICYmXG4gICAgICAgICAgY21kLmdldE9wdGlvblZhbHVlKGFuT3B0aW9uLmF0dHJpYnV0ZU5hbWUoKSkgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICBjbWQubWlzc2luZ01hbmRhdG9yeU9wdGlvblZhbHVlKGFuT3B0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGlmIGNvbmZsaWN0aW5nIG9wdGlvbnMgYXJlIHVzZWQgdG9nZXRoZXIgaW4gdGhpcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGVja0ZvckNvbmZsaWN0aW5nTG9jYWxPcHRpb25zKCkge1xuICAgIGNvbnN0IGRlZmluZWROb25EZWZhdWx0T3B0aW9ucyA9IHRoaXMub3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5ID0gb3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIGlmICh0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbktleSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5nZXRPcHRpb25WYWx1ZVNvdXJjZShvcHRpb25LZXkpICE9PSAnZGVmYXVsdCc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvcHRpb25zV2l0aENvbmZsaWN0aW5nID0gZGVmaW5lZE5vbkRlZmF1bHRPcHRpb25zLmZpbHRlcihcbiAgICAgIChvcHRpb24pID0+IG9wdGlvbi5jb25mbGljdHNXaXRoLmxlbmd0aCA+IDAsXG4gICAgKTtcblxuICAgIG9wdGlvbnNXaXRoQ29uZmxpY3RpbmcuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBjb25zdCBjb25mbGljdGluZ0FuZERlZmluZWQgPSBkZWZpbmVkTm9uRGVmYXVsdE9wdGlvbnMuZmluZCgoZGVmaW5lZCkgPT5cbiAgICAgICAgb3B0aW9uLmNvbmZsaWN0c1dpdGguaW5jbHVkZXMoZGVmaW5lZC5hdHRyaWJ1dGVOYW1lKCkpLFxuICAgICAgKTtcbiAgICAgIGlmIChjb25mbGljdGluZ0FuZERlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fY29uZmxpY3RpbmdPcHRpb24ob3B0aW9uLCBjb25mbGljdGluZ0FuZERlZmluZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBpZiBjb25mbGljdGluZyBvcHRpb25zIGFyZSB1c2VkIHRvZ2V0aGVyLlxuICAgKiBDYWxsZWQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGhlbHAgZmxhZ3MgaW4gbGVhZiBzdWJjb21tYW5kLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCkge1xuICAgIC8vIFdhbGsgdXAgaGllcmFyY2h5IHNvIGNhbiBjYWxsIGluIHN1YmNvbW1hbmQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGRpc3BsYXlpbmcgaGVscC5cbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBjbWQuX2NoZWNrRm9yQ29uZmxpY3RpbmdMb2NhbE9wdGlvbnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBvcHRpb25zIGZyb20gYGFyZ3ZgIHJlbW92aW5nIGtub3duIG9wdGlvbnMsXG4gICAqIGFuZCByZXR1cm4gYXJndiBzcGxpdCBpbnRvIG9wZXJhbmRzIGFuZCB1bmtub3duIGFyZ3VtZW50cy5cbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqXG4gICAqICAgICBhcmd2ID0+IG9wZXJhbmRzLCB1bmtub3duXG4gICAqICAgICAtLWtub3duIGtrayBvcCA9PiBbb3BdLCBbXVxuICAgKiAgICAgb3AgLS1rbm93biBra2sgPT4gW29wXSwgW11cbiAgICogICAgIHN1YiAtLXVua25vd24gdXV1IG9wID0+IFtzdWJdLCBbLS11bmtub3duIHV1dSBvcF1cbiAgICogICAgIHN1YiAtLSAtLXVua25vd24gdXV1IG9wID0+IFtzdWIgLS11bmtub3duIHV1dSBvcF0sIFtdXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3ZcbiAgICogQHJldHVybiB7e29wZXJhbmRzOiBzdHJpbmdbXSwgdW5rbm93bjogc3RyaW5nW119fVxuICAgKi9cblxuICBwYXJzZU9wdGlvbnMoYXJndikge1xuICAgIGNvbnN0IG9wZXJhbmRzID0gW107IC8vIG9wZXJhbmRzLCBub3Qgb3B0aW9ucyBvciB2YWx1ZXNcbiAgICBjb25zdCB1bmtub3duID0gW107IC8vIGZpcnN0IHVua25vd24gb3B0aW9uIGFuZCByZW1haW5pbmcgdW5rbm93biBhcmdzXG4gICAgbGV0IGRlc3QgPSBvcGVyYW5kcztcbiAgICBjb25zdCBhcmdzID0gYXJndi5zbGljZSgpO1xuXG4gICAgZnVuY3Rpb24gbWF5YmVPcHRpb24oYXJnKSB7XG4gICAgICByZXR1cm4gYXJnLmxlbmd0aCA+IDEgJiYgYXJnWzBdID09PSAnLSc7XG4gICAgfVxuXG4gICAgLy8gcGFyc2Ugb3B0aW9uc1xuICAgIGxldCBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG51bGw7XG4gICAgd2hpbGUgKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhcmcgPSBhcmdzLnNoaWZ0KCk7XG5cbiAgICAgIC8vIGxpdGVyYWxcbiAgICAgIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgICAgaWYgKGRlc3QgPT09IHVua25vd24pIGRlc3QucHVzaChhcmcpO1xuICAgICAgICBkZXN0LnB1c2goLi4uYXJncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlVmFyaWFkaWNPcHRpb24gJiYgIW1heWJlT3B0aW9uKGFyZykpIHtcbiAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHthY3RpdmVWYXJpYWRpY09wdGlvbi5uYW1lKCl9YCwgYXJnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG51bGw7XG5cbiAgICAgIGlmIChtYXliZU9wdGlvbihhcmcpKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2ZpbmRPcHRpb24oYXJnKTtcbiAgICAgICAgLy8gcmVjb2duaXNlZCBvcHRpb24sIGNhbGwgbGlzdGVuZXIgdG8gYXNzaWduIHZhbHVlIHdpdGggcG9zc2libGUgY3VzdG9tIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgIGlmIChvcHRpb24ucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXJncy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHRoaXMub3B0aW9uTWlzc2luZ0FyZ3VtZW50KG9wdGlvbik7XG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgLy8gaGlzdG9yaWNhbCBiZWhhdmlvdXIgaXMgb3B0aW9uYWwgdmFsdWUgaXMgZm9sbG93aW5nIGFyZyB1bmxlc3MgYW4gb3B0aW9uXG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwICYmICFtYXliZU9wdGlvbihhcmdzWzBdKSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7b3B0aW9uLm5hbWUoKX1gLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJvb2xlYW4gZmxhZ1xuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG9wdGlvbi52YXJpYWRpYyA/IG9wdGlvbiA6IG51bGw7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9vayBmb3IgY29tYm8gb3B0aW9ucyBmb2xsb3dpbmcgc2luZ2xlIGRhc2gsIGVhdCBmaXJzdCBvbmUgaWYga25vd24uXG4gICAgICBpZiAoYXJnLmxlbmd0aCA+IDIgJiYgYXJnWzBdID09PSAnLScgJiYgYXJnWzFdICE9PSAnLScpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZmluZE9wdGlvbihgLSR7YXJnWzFdfWApO1xuICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgb3B0aW9uLnJlcXVpcmVkIHx8XG4gICAgICAgICAgICAob3B0aW9uLm9wdGlvbmFsICYmIHRoaXMuX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIG9wdGlvbiB3aXRoIHZhbHVlIGZvbGxvd2luZyBpbiBzYW1lIGFyZ3VtZW50XG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCwgYXJnLnNsaWNlKDIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYm9vbGVhbiBvcHRpb24sIGVtaXQgYW5kIHB1dCBiYWNrIHJlbWFpbmRlciBvZiBhcmcgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgICAgYXJncy51bnNoaWZ0KGAtJHthcmcuc2xpY2UoMil9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvb2sgZm9yIGtub3duIGxvbmcgZmxhZyB3aXRoIHZhbHVlLCBsaWtlIC0tZm9vPWJhclxuICAgICAgaWYgKC9eLS1bXj1dKz0vLnRlc3QoYXJnKSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGFyZy5pbmRleE9mKCc9Jyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2ZpbmRPcHRpb24oYXJnLnNsaWNlKDAsIGluZGV4KSk7XG4gICAgICAgIGlmIChvcHRpb24gJiYgKG9wdGlvbi5yZXF1aXJlZCB8fCBvcHRpb24ub3B0aW9uYWwpKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWAsIGFyZy5zbGljZShpbmRleCArIDEpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOb3QgYSByZWNvZ25pc2VkIG9wdGlvbiBieSB0aGlzIGNvbW1hbmQuXG4gICAgICAvLyBNaWdodCBiZSBhIGNvbW1hbmQtYXJndW1lbnQsIG9yIHN1YmNvbW1hbmQgb3B0aW9uLCBvciB1bmtub3duIG9wdGlvbiwgb3IgaGVscCBjb21tYW5kIG9yIG9wdGlvbi5cblxuICAgICAgLy8gQW4gdW5rbm93biBvcHRpb24gbWVhbnMgZnVydGhlciBhcmd1bWVudHMgYWxzbyBjbGFzc2lmaWVkIGFzIHVua25vd24gc28gY2FuIGJlIHJlcHJvY2Vzc2VkIGJ5IHN1YmNvbW1hbmRzLlxuICAgICAgaWYgKG1heWJlT3B0aW9uKGFyZykpIHtcbiAgICAgICAgZGVzdCA9IHVua25vd247XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHVzaW5nIHBvc2l0aW9uYWxPcHRpb25zLCBzdG9wIHByb2Nlc3Npbmcgb3VyIG9wdGlvbnMgYXQgc3ViY29tbWFuZC5cbiAgICAgIGlmIChcbiAgICAgICAgKHRoaXMuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zIHx8IHRoaXMuX3Bhc3NUaHJvdWdoT3B0aW9ucykgJiZcbiAgICAgICAgb3BlcmFuZHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgIHVua25vd24ubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmRDb21tYW5kKGFyZykpIHtcbiAgICAgICAgICBvcGVyYW5kcy5wdXNoKGFyZyk7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgdW5rbm93bi5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMuX2dldEhlbHBDb21tYW5kKCkgJiZcbiAgICAgICAgICBhcmcgPT09IHRoaXMuX2dldEhlbHBDb21tYW5kKCkubmFtZSgpXG4gICAgICAgICkge1xuICAgICAgICAgIG9wZXJhbmRzLnB1c2goYXJnKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSBvcGVyYW5kcy5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSkge1xuICAgICAgICAgIHVua25vd24ucHVzaChhcmcpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHVua25vd24ucHVzaCguLi5hcmdzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB1c2luZyBwYXNzVGhyb3VnaE9wdGlvbnMsIHN0b3AgcHJvY2Vzc2luZyBvcHRpb25zIGF0IGZpcnN0IGNvbW1hbmQtYXJndW1lbnQuXG4gICAgICBpZiAodGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zKSB7XG4gICAgICAgIGRlc3QucHVzaChhcmcpO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSBkZXN0LnB1c2goLi4uYXJncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgYXJnXG4gICAgICBkZXN0LnB1c2goYXJnKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBvcGVyYW5kcywgdW5rbm93biB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBsb2NhbCBvcHRpb24gdmFsdWVzIGFzIGtleS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgb3B0cygpIHtcbiAgICBpZiAodGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBQcmVzZXJ2ZSBvcmlnaW5hbCBiZWhhdmlvdXIgc28gYmFja3dhcmRzIGNvbXBhdGlibGUgd2hlbiBzdGlsbCB1c2luZyBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMub3B0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5vcHRpb25zW2ldLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPVxuICAgICAgICAgIGtleSA9PT0gdGhpcy5fdmVyc2lvbk9wdGlvbk5hbWUgPyB0aGlzLl92ZXJzaW9uIDogdGhpc1trZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uVmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBtZXJnZWQgbG9jYWwgYW5kIGdsb2JhbCBvcHRpb24gdmFsdWVzIGFzIGtleS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgb3B0c1dpdGhHbG9iYWxzKCkge1xuICAgIC8vIGdsb2JhbHMgb3ZlcndyaXRlIGxvY2Fsc1xuICAgIHJldHVybiB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkucmVkdWNlKFxuICAgICAgKGNvbWJpbmVkT3B0aW9ucywgY21kKSA9PiBPYmplY3QuYXNzaWduKGNvbWJpbmVkT3B0aW9ucywgY21kLm9wdHMoKSksXG4gICAgICB7fSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCAob3IgY2FsbCBleGl0T3ZlcnJpZGUpLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge29iamVjdH0gW2Vycm9yT3B0aW9uc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlcnJvck9wdGlvbnMuY29kZV0gLSBhbiBpZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlcnJvclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2Vycm9yT3B0aW9ucy5leGl0Q29kZV0gLSB1c2VkIHdpdGggcHJvY2Vzcy5leGl0XG4gICAqL1xuICBlcnJvcihtZXNzYWdlLCBlcnJvck9wdGlvbnMpIHtcbiAgICAvLyBvdXRwdXQgaGFuZGxpbmdcbiAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLm91dHB1dEVycm9yKFxuICAgICAgYCR7bWVzc2FnZX1cXG5gLFxuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZUVycixcbiAgICApO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fc2hvd0hlbHBBZnRlckVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZUVycihgJHt0aGlzLl9zaG93SGVscEFmdGVyRXJyb3J9XFxuYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zaG93SGVscEFmdGVyRXJyb3IpIHtcbiAgICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIoJ1xcbicpO1xuICAgICAgdGhpcy5vdXRwdXRIZWxwKHsgZXJyb3I6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gZXhpdCBoYW5kbGluZ1xuICAgIGNvbnN0IGNvbmZpZyA9IGVycm9yT3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBleGl0Q29kZSA9IGNvbmZpZy5leGl0Q29kZSB8fCAxO1xuICAgIGNvbnN0IGNvZGUgPSBjb25maWcuY29kZSB8fCAnY29tbWFuZGVyLmVycm9yJztcbiAgICB0aGlzLl9leGl0KGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhbnkgb3B0aW9uIHJlbGF0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBpZiBvcHRpb24gZG9lc1xuICAgKiBub3QgaGF2ZSBhIHZhbHVlIGZyb20gY2xpIG9yIGNsaWVudCBjb2RlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3BhcnNlT3B0aW9uc0VudigpIHtcbiAgICB0aGlzLm9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAob3B0aW9uLmVudlZhciAmJiBvcHRpb24uZW52VmFyIGluIHByb2Nlc3MuZW52KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICAgIC8vIFByaW9yaXR5IGNoZWNrLiBEbyBub3Qgb3ZlcndyaXRlIGNsaSBvciBvcHRpb25zIGZyb20gdW5rbm93biBzb3VyY2UgKGNsaWVudC1jb2RlKS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgWydkZWZhdWx0JywgJ2NvbmZpZycsICdlbnYnXS5pbmNsdWRlcyhcbiAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KSxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChvcHRpb24ucmVxdWlyZWQgfHwgb3B0aW9uLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAvLyBvcHRpb24gY2FuIHRha2UgYSB2YWx1ZVxuICAgICAgICAgICAgLy8ga2VlcCB2ZXJ5IHNpbXBsZSwgb3B0aW9uYWwgYWx3YXlzIHRha2VzIHZhbHVlXG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbkVudjoke29wdGlvbi5uYW1lKCl9YCwgcHJvY2Vzcy5lbnZbb3B0aW9uLmVudlZhcl0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBib29sZWFuXG4gICAgICAgICAgICAvLyBrZWVwIHZlcnkgc2ltcGxlLCBvbmx5IGNhcmUgdGhhdCBlbnZWYXIgZGVmaW5lZCBhbmQgbm90IHRoZSB2YWx1ZVxuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb25FbnY6JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFueSBpbXBsaWVkIG9wdGlvbiB2YWx1ZXMsIGlmIG9wdGlvbiBpcyB1bmRlZmluZWQgb3IgZGVmYXVsdCB2YWx1ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wYXJzZU9wdGlvbnNJbXBsaWVkKCkge1xuICAgIGNvbnN0IGR1YWxIZWxwZXIgPSBuZXcgRHVhbE9wdGlvbnModGhpcy5vcHRpb25zKTtcbiAgICBjb25zdCBoYXNDdXN0b21PcHRpb25WYWx1ZSA9IChvcHRpb25LZXkpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICFbJ2RlZmF1bHQnLCAnaW1wbGllZCddLmluY2x1ZGVzKHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KSlcbiAgICAgICk7XG4gICAgfTtcbiAgICB0aGlzLm9wdGlvbnNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChvcHRpb24pID0+XG4gICAgICAgICAgb3B0aW9uLmltcGxpZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIGhhc0N1c3RvbU9wdGlvblZhbHVlKG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkpICYmXG4gICAgICAgICAgZHVhbEhlbHBlci52YWx1ZUZyb21PcHRpb24oXG4gICAgICAgICAgICB0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkpLFxuICAgICAgICAgICAgb3B0aW9uLFxuICAgICAgICAgICksXG4gICAgICApXG4gICAgICAuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbi5pbXBsaWVkKVxuICAgICAgICAgIC5maWx0ZXIoKGltcGxpZWRLZXkpID0+ICFoYXNDdXN0b21PcHRpb25WYWx1ZShpbXBsaWVkS2V5KSlcbiAgICAgICAgICAuZm9yRWFjaCgoaW1wbGllZEtleSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UoXG4gICAgICAgICAgICAgIGltcGxpZWRLZXksXG4gICAgICAgICAgICAgIG9wdGlvbi5pbXBsaWVkW2ltcGxpZWRLZXldLFxuICAgICAgICAgICAgICAnaW1wbGllZCcsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXJndW1lbnQgYG5hbWVgIGlzIG1pc3NpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIG1pc3NpbmdBcmd1bWVudChuYW1lKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCAnJHtuYW1lfSdgO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLm1pc3NpbmdBcmd1bWVudCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogYE9wdGlvbmAgaXMgbWlzc2luZyBhbiBhcmd1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBvcHRpb25NaXNzaW5nQXJndW1lbnQob3B0aW9uKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogb3B0aW9uICcke29wdGlvbi5mbGFnc30nIGFyZ3VtZW50IG1pc3NpbmdgO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLm9wdGlvbk1pc3NpbmdBcmd1bWVudCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogYE9wdGlvbmAgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgaXMgYSBtYW5kYXRvcnkgb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIG1pc3NpbmdNYW5kYXRvcnlPcHRpb25WYWx1ZShvcHRpb24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiByZXF1aXJlZCBvcHRpb24gJyR7b3B0aW9uLmZsYWdzfScgbm90IHNwZWNpZmllZGA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIubWlzc2luZ01hbmRhdG9yeU9wdGlvblZhbHVlJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgT3B0aW9uYCBjb25mbGljdHMgd2l0aCBhbm90aGVyIG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcGFyYW0ge09wdGlvbn0gY29uZmxpY3RpbmdPcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jb25mbGljdGluZ09wdGlvbihvcHRpb24sIGNvbmZsaWN0aW5nT3B0aW9uKSB7XG4gICAgLy8gVGhlIGNhbGxpbmcgY29kZSBkb2VzIG5vdCBrbm93IHdoZXRoZXIgYSBuZWdhdGVkIG9wdGlvbiBpcyB0aGUgc291cmNlIG9mIHRoZVxuICAgIC8vIHZhbHVlLCBzbyBkbyBzb21lIHdvcmsgdG8gdGFrZSBhbiBlZHVjYXRlZCBndWVzcy5cbiAgICBjb25zdCBmaW5kQmVzdE9wdGlvbkZyb21WYWx1ZSA9IChvcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KTtcbiAgICAgIGNvbnN0IG5lZ2F0aXZlT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoXG4gICAgICAgICh0YXJnZXQpID0+IHRhcmdldC5uZWdhdGUgJiYgb3B0aW9uS2V5ID09PSB0YXJnZXQuYXR0cmlidXRlTmFtZSgpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBvc2l0aXZlT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoXG4gICAgICAgICh0YXJnZXQpID0+ICF0YXJnZXQubmVnYXRlICYmIG9wdGlvbktleSA9PT0gdGFyZ2V0LmF0dHJpYnV0ZU5hbWUoKSxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIG5lZ2F0aXZlT3B0aW9uICYmXG4gICAgICAgICgobmVnYXRpdmVPcHRpb24ucHJlc2V0QXJnID09PSB1bmRlZmluZWQgJiYgb3B0aW9uVmFsdWUgPT09IGZhbHNlKSB8fFxuICAgICAgICAgIChuZWdhdGl2ZU9wdGlvbi5wcmVzZXRBcmcgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgb3B0aW9uVmFsdWUgPT09IG5lZ2F0aXZlT3B0aW9uLnByZXNldEFyZykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG5lZ2F0aXZlT3B0aW9uO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBvc2l0aXZlT3B0aW9uIHx8IG9wdGlvbjtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3QgYmVzdE9wdGlvbiA9IGZpbmRCZXN0T3B0aW9uRnJvbVZhbHVlKG9wdGlvbik7XG4gICAgICBjb25zdCBvcHRpb25LZXkgPSBiZXN0T3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KTtcbiAgICAgIGlmIChzb3VyY2UgPT09ICdlbnYnKSB7XG4gICAgICAgIHJldHVybiBgZW52aXJvbm1lbnQgdmFyaWFibGUgJyR7YmVzdE9wdGlvbi5lbnZWYXJ9J2A7XG4gICAgICB9XG4gICAgICByZXR1cm4gYG9wdGlvbiAnJHtiZXN0T3B0aW9uLmZsYWdzfSdgO1xuICAgIH07XG5cbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiAke2dldEVycm9yTWVzc2FnZShvcHRpb24pfSBjYW5ub3QgYmUgdXNlZCB3aXRoICR7Z2V0RXJyb3JNZXNzYWdlKGNvbmZsaWN0aW5nT3B0aW9uKX1gO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLmNvbmZsaWN0aW5nT3B0aW9uJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmtub3duIG9wdGlvbiBgZmxhZ2AuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIHVua25vd25PcHRpb24oZmxhZykge1xuICAgIGlmICh0aGlzLl9hbGxvd1Vua25vd25PcHRpb24pIHJldHVybjtcbiAgICBsZXQgc3VnZ2VzdGlvbiA9ICcnO1xuXG4gICAgaWYgKGZsYWcuc3RhcnRzV2l0aCgnLS0nKSAmJiB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IpIHtcbiAgICAgIC8vIExvb3BpbmcgdG8gcGljayB1cCB0aGUgZ2xvYmFsIG9wdGlvbnMgdG9vXG4gICAgICBsZXQgY2FuZGlkYXRlRmxhZ3MgPSBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgbGV0IGNvbW1hbmQgPSB0aGlzO1xuICAgICAgZG8ge1xuICAgICAgICBjb25zdCBtb3JlRmxhZ3MgPSBjb21tYW5kXG4gICAgICAgICAgLmNyZWF0ZUhlbHAoKVxuICAgICAgICAgIC52aXNpYmxlT3B0aW9ucyhjb21tYW5kKVxuICAgICAgICAgIC5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLmxvbmcpXG4gICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiBvcHRpb24ubG9uZyk7XG4gICAgICAgIGNhbmRpZGF0ZUZsYWdzID0gY2FuZGlkYXRlRmxhZ3MuY29uY2F0KG1vcmVGbGFncyk7XG4gICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnBhcmVudDtcbiAgICAgIH0gd2hpbGUgKGNvbW1hbmQgJiYgIWNvbW1hbmQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zKTtcbiAgICAgIHN1Z2dlc3Rpb24gPSBzdWdnZXN0U2ltaWxhcihmbGFnLCBjYW5kaWRhdGVGbGFncyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogdW5rbm93biBvcHRpb24gJyR7ZmxhZ30nJHtzdWdnZXN0aW9ufWA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIudW5rbm93bk9wdGlvbicgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXhjZXNzIGFyZ3VtZW50cywgbW9yZSB0aGFuIGV4cGVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSByZWNlaXZlZEFyZ3NcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2V4Y2Vzc0FyZ3VtZW50cyhyZWNlaXZlZEFyZ3MpIHtcbiAgICBpZiAodGhpcy5fYWxsb3dFeGNlc3NBcmd1bWVudHMpIHJldHVybjtcblxuICAgIGNvbnN0IGV4cGVjdGVkID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aDtcbiAgICBjb25zdCBzID0gZXhwZWN0ZWQgPT09IDEgPyAnJyA6ICdzJztcbiAgICBjb25zdCBmb3JTdWJjb21tYW5kID0gdGhpcy5wYXJlbnQgPyBgIGZvciAnJHt0aGlzLm5hbWUoKX0nYCA6ICcnO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IHRvbyBtYW55IGFyZ3VtZW50cyR7Zm9yU3ViY29tbWFuZH0uIEV4cGVjdGVkICR7ZXhwZWN0ZWR9IGFyZ3VtZW50JHtzfSBidXQgZ290ICR7cmVjZWl2ZWRBcmdzLmxlbmd0aH0uYDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci5leGNlc3NBcmd1bWVudHMnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVua25vd24gY29tbWFuZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgdW5rbm93bkNvbW1hbmQoKSB7XG4gICAgY29uc3QgdW5rbm93bk5hbWUgPSB0aGlzLmFyZ3NbMF07XG4gICAgbGV0IHN1Z2dlc3Rpb24gPSAnJztcblxuICAgIGlmICh0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZU5hbWVzID0gW107XG4gICAgICB0aGlzLmNyZWF0ZUhlbHAoKVxuICAgICAgICAudmlzaWJsZUNvbW1hbmRzKHRoaXMpXG4gICAgICAgIC5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgY2FuZGlkYXRlTmFtZXMucHVzaChjb21tYW5kLm5hbWUoKSk7XG4gICAgICAgICAgLy8ganVzdCB2aXNpYmxlIGFsaWFzXG4gICAgICAgICAgaWYgKGNvbW1hbmQuYWxpYXMoKSkgY2FuZGlkYXRlTmFtZXMucHVzaChjb21tYW5kLmFsaWFzKCkpO1xuICAgICAgICB9KTtcbiAgICAgIHN1Z2dlc3Rpb24gPSBzdWdnZXN0U2ltaWxhcih1bmtub3duTmFtZSwgY2FuZGlkYXRlTmFtZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IHVua25vd24gY29tbWFuZCAnJHt1bmtub3duTmFtZX0nJHtzdWdnZXN0aW9ufWA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIudW5rbm93bkNvbW1hbmQnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIHByb2dyYW0gdmVyc2lvbi5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgYXV0by1yZWdpc3RlcnMgdGhlIFwiLVYsIC0tdmVyc2lvblwiIG9wdGlvbiB3aGljaCB3aWxsIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICpcbiAgICogWW91IGNhbiBvcHRpb25hbGx5IHN1cHBseSB0aGUgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhZ3NdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4geyh0aGlzIHwgc3RyaW5nIHwgdW5kZWZpbmVkKX0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nLCBvciB2ZXJzaW9uIHN0cmluZyBpZiBubyBhcmd1bWVudHNcbiAgICovXG5cbiAgdmVyc2lvbihzdHIsIGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgdGhpcy5fdmVyc2lvbiA9IHN0cjtcbiAgICBmbGFncyA9IGZsYWdzIHx8ICctViwgLS12ZXJzaW9uJztcbiAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uIHx8ICdvdXRwdXQgdGhlIHZlcnNpb24gbnVtYmVyJztcbiAgICBjb25zdCB2ZXJzaW9uT3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcbiAgICB0aGlzLl92ZXJzaW9uT3B0aW9uTmFtZSA9IHZlcnNpb25PcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyT3B0aW9uKHZlcnNpb25PcHRpb24pO1xuXG4gICAgdGhpcy5vbignb3B0aW9uOicgKyB2ZXJzaW9uT3B0aW9uLm5hbWUoKSwgKCkgPT4ge1xuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZU91dChgJHtzdHJ9XFxuYCk7XG4gICAgICB0aGlzLl9leGl0KDAsICdjb21tYW5kZXIudmVyc2lvbicsIHN0cik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc0Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cbiAgZGVzY3JpcHRpb24oc3RyLCBhcmdzRGVzY3JpcHRpb24pIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQgJiYgYXJnc0Rlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSBzdHI7XG4gICAgaWYgKGFyZ3NEZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fYXJnc0Rlc2NyaXB0aW9uID0gYXJnc0Rlc2NyaXB0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHN1bW1hcnkuIFVzZWQgd2hlbiBsaXN0ZWQgYXMgc3ViY29tbWFuZCBvZiBwYXJlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cbiAgc3VtbWFyeShzdHIpIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9zdW1tYXJ5O1xuICAgIHRoaXMuX3N1bW1hcnkgPSBzdHI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFuIGFsaWFzIGZvciB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogWW91IG1heSBjYWxsIG1vcmUgdGhhbiBvbmNlIHRvIGFkZCBtdWx0aXBsZSBhbGlhc2VzLiBPbmx5IHRoZSBmaXJzdCBhbGlhcyBpcyBzaG93biBpbiB0aGUgYXV0by1nZW5lcmF0ZWQgaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc11cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG5cbiAgYWxpYXMoYWxpYXMpIHtcbiAgICBpZiAoYWxpYXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2FsaWFzZXNbMF07IC8vIGp1c3QgcmV0dXJuIGZpcnN0LCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuICAgIC8qKiBAdHlwZSB7Q29tbWFuZH0gKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBsZXQgY29tbWFuZCA9IHRoaXM7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb21tYW5kcy5sZW5ndGggIT09IDAgJiZcbiAgICAgIHRoaXMuY29tbWFuZHNbdGhpcy5jb21tYW5kcy5sZW5ndGggLSAxXS5fZXhlY3V0YWJsZUhhbmRsZXJcbiAgICApIHtcbiAgICAgIC8vIGFzc3VtZSBhZGRpbmcgYWxpYXMgZm9yIGxhc3QgYWRkZWQgZXhlY3V0YWJsZSBzdWJjb21tYW5kLCByYXRoZXIgdGhhbiB0aGlzXG4gICAgICBjb21tYW5kID0gdGhpcy5jb21tYW5kc1t0aGlzLmNvbW1hbmRzLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIGlmIChhbGlhcyA9PT0gY29tbWFuZC5fbmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbW1hbmQgYWxpYXMgY2FuJ3QgYmUgdGhlIHNhbWUgYXMgaXRzIG5hbWVcIik7XG4gICAgY29uc3QgbWF0Y2hpbmdDb21tYW5kID0gdGhpcy5wYXJlbnQ/Ll9maW5kQ29tbWFuZChhbGlhcyk7XG4gICAgaWYgKG1hdGNoaW5nQ29tbWFuZCkge1xuICAgICAgLy8gYy5mLiBfcmVnaXN0ZXJDb21tYW5kXG4gICAgICBjb25zdCBleGlzdGluZ0NtZCA9IFttYXRjaGluZ0NvbW1hbmQubmFtZSgpXVxuICAgICAgICAuY29uY2F0KG1hdGNoaW5nQ29tbWFuZC5hbGlhc2VzKCkpXG4gICAgICAgIC5qb2luKCd8Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYW5ub3QgYWRkIGFsaWFzICcke2FsaWFzfScgdG8gY29tbWFuZCAnJHt0aGlzLm5hbWUoKX0nIGFzIGFscmVhZHkgaGF2ZSBjb21tYW5kICcke2V4aXN0aW5nQ21kfSdgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb21tYW5kLl9hbGlhc2VzLnB1c2goYWxpYXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbGlhc2VzIGZvciB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogT25seSB0aGUgZmlyc3QgYWxpYXMgaXMgc2hvd24gaW4gdGhlIGF1dG8tZ2VuZXJhdGVkIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthbGlhc2VzXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nW118Q29tbWFuZCl9XG4gICAqL1xuXG4gIGFsaWFzZXMoYWxpYXNlcykge1xuICAgIC8vIEdldHRlciBmb3IgdGhlIGFycmF5IG9mIGFsaWFzZXMgaXMgdGhlIG1haW4gcmVhc29uIGZvciBoYXZpbmcgYWxpYXNlcygpIGluIGFkZGl0aW9uIHRvIGFsaWFzKCkuXG4gICAgaWYgKGFsaWFzZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2FsaWFzZXM7XG5cbiAgICBhbGlhc2VzLmZvckVhY2goKGFsaWFzKSA9PiB0aGlzLmFsaWFzKGFsaWFzKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IC8gZ2V0IHRoZSBjb21tYW5kIHVzYWdlIGBzdHJgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cl1cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG5cbiAgdXNhZ2Uoc3RyKSB7XG4gICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5fdXNhZ2UpIHJldHVybiB0aGlzLl91c2FnZTtcblxuICAgICAgY29uc3QgYXJncyA9IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5tYXAoKGFyZykgPT4ge1xuICAgICAgICByZXR1cm4gaHVtYW5SZWFkYWJsZUFyZ05hbWUoYXJnKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtdXG4gICAgICAgIC5jb25jYXQoXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxlbmd0aCB8fCB0aGlzLl9oZWxwT3B0aW9uICE9PSBudWxsID8gJ1tvcHRpb25zXScgOiBbXSxcbiAgICAgICAgICB0aGlzLmNvbW1hbmRzLmxlbmd0aCA/ICdbY29tbWFuZF0nIDogW10sXG4gICAgICAgICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aCA/IGFyZ3MgOiBbXSxcbiAgICAgICAgKVxuICAgICAgICAuam9pbignICcpO1xuICAgIH1cblxuICAgIHRoaXMuX3VzYWdlID0gc3RyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cblxuICBuYW1lKHN0cikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX25hbWU7XG4gICAgdGhpcy5fbmFtZSA9IHN0cjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgZnJvbSBzY3JpcHQgZmlsZW5hbWUsIHN1Y2ggYXMgcHJvY2Vzcy5hcmd2WzFdLFxuICAgKiBvciByZXF1aXJlLm1haW4uZmlsZW5hbWUsIG9yIF9fZmlsZW5hbWUuXG4gICAqXG4gICAqIChVc2VkIGludGVybmFsbHkgYW5kIHB1YmxpYyBhbHRob3VnaCBub3QgZG9jdW1lbnRlZCBpbiBSRUFETUUuKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLm5hbWVGcm9tRmlsZW5hbWUocmVxdWlyZS5tYWluLmZpbGVuYW1lKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9XG4gICAqL1xuXG4gIG5hbWVGcm9tRmlsZW5hbWUoZmlsZW5hbWUpIHtcbiAgICB0aGlzLl9uYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgcGF0aC5leHRuYW1lKGZpbGVuYW1lKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBkaXJlY3RvcnkgZm9yIHNlYXJjaGluZyBmb3IgZXhlY3V0YWJsZSBzdWJjb21tYW5kcyBvZiB0aGlzIGNvbW1hbmQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uZXhlY3V0YWJsZURpcihfX2Rpcm5hbWUpO1xuICAgKiAvLyBvclxuICAgKiBwcm9ncmFtLmV4ZWN1dGFibGVEaXIoJ3N1YmNvbW1hbmRzJyk7XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHJldHVybiB7KHN0cmluZ3xudWxsfENvbW1hbmQpfVxuICAgKi9cblxuICBleGVjdXRhYmxlRGlyKHBhdGgpIHtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fZXhlY3V0YWJsZURpcjtcbiAgICB0aGlzLl9leGVjdXRhYmxlRGlyID0gcGF0aDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gcHJvZ3JhbSBoZWxwIGRvY3VtZW50YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7eyBlcnJvcjogYm9vbGVhbiB9fSBbY29udGV4dE9wdGlvbnNdIC0gcGFzcyB7ZXJyb3I6dHJ1ZX0gdG8gd3JhcCBmb3Igc3RkZXJyIGluc3RlYWQgb2Ygc3Rkb3V0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgaGVscEluZm9ybWF0aW9uKGNvbnRleHRPcHRpb25zKSB7XG4gICAgY29uc3QgaGVscGVyID0gdGhpcy5jcmVhdGVIZWxwKCk7XG4gICAgaWYgKGhlbHBlci5oZWxwV2lkdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVscGVyLmhlbHBXaWR0aCA9XG4gICAgICAgIGNvbnRleHRPcHRpb25zICYmIGNvbnRleHRPcHRpb25zLmVycm9yXG4gICAgICAgICAgPyB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLmdldEVyckhlbHBXaWR0aCgpXG4gICAgICAgICAgOiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLmdldE91dEhlbHBXaWR0aCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGVscGVyLmZvcm1hdEhlbHAodGhpcywgaGVscGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZ2V0SGVscENvbnRleHQoY29udGV4dE9wdGlvbnMpIHtcbiAgICBjb250ZXh0T3B0aW9ucyA9IGNvbnRleHRPcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGNvbnRleHQgPSB7IGVycm9yOiAhIWNvbnRleHRPcHRpb25zLmVycm9yIH07XG4gICAgbGV0IHdyaXRlO1xuICAgIGlmIChjb250ZXh0LmVycm9yKSB7XG4gICAgICB3cml0ZSA9IChhcmcpID0+IHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIoYXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd3JpdGUgPSAoYXJnKSA9PiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLndyaXRlT3V0KGFyZyk7XG4gICAgfVxuICAgIGNvbnRleHQud3JpdGUgPSBjb250ZXh0T3B0aW9ucy53cml0ZSB8fCB3cml0ZTtcbiAgICBjb250ZXh0LmNvbW1hbmQgPSB0aGlzO1xuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIE91dHB1dCBoZWxwIGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbW1hbmQuXG4gICAqXG4gICAqIE91dHB1dHMgYnVpbHQtaW4gaGVscCwgYW5kIGN1c3RvbSB0ZXh0IGFkZGVkIHVzaW5nIGAuYWRkSGVscFRleHQoKWAuXG4gICAqXG4gICAqIEBwYXJhbSB7eyBlcnJvcjogYm9vbGVhbiB9IHwgRnVuY3Rpb259IFtjb250ZXh0T3B0aW9uc10gLSBwYXNzIHtlcnJvcjp0cnVlfSB0byB3cml0ZSB0byBzdGRlcnIgaW5zdGVhZCBvZiBzdGRvdXRcbiAgICovXG5cbiAgb3V0cHV0SGVscChjb250ZXh0T3B0aW9ucykge1xuICAgIGxldCBkZXByZWNhdGVkQ2FsbGJhY2s7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0T3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZGVwcmVjYXRlZENhbGxiYWNrID0gY29udGV4dE9wdGlvbnM7XG4gICAgICBjb250ZXh0T3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2dldEhlbHBDb250ZXh0KGNvbnRleHRPcHRpb25zKTtcblxuICAgIHRoaXMuX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZvckVhY2goKGNvbW1hbmQpID0+IGNvbW1hbmQuZW1pdCgnYmVmb3JlQWxsSGVscCcsIGNvbnRleHQpKTtcbiAgICB0aGlzLmVtaXQoJ2JlZm9yZUhlbHAnLCBjb250ZXh0KTtcblxuICAgIGxldCBoZWxwSW5mb3JtYXRpb24gPSB0aGlzLmhlbHBJbmZvcm1hdGlvbihjb250ZXh0KTtcbiAgICBpZiAoZGVwcmVjYXRlZENhbGxiYWNrKSB7XG4gICAgICBoZWxwSW5mb3JtYXRpb24gPSBkZXByZWNhdGVkQ2FsbGJhY2soaGVscEluZm9ybWF0aW9uKTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGhlbHBJbmZvcm1hdGlvbiAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgIUJ1ZmZlci5pc0J1ZmZlcihoZWxwSW5mb3JtYXRpb24pXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvdXRwdXRIZWxwIGNhbGxiYWNrIG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIGEgQnVmZmVyJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnRleHQud3JpdGUoaGVscEluZm9ybWF0aW9uKTtcblxuICAgIGlmICh0aGlzLl9nZXRIZWxwT3B0aW9uKCk/LmxvbmcpIHtcbiAgICAgIHRoaXMuZW1pdCh0aGlzLl9nZXRIZWxwT3B0aW9uKCkubG9uZyk7IC8vIGRlcHJlY2F0ZWRcbiAgICB9XG4gICAgdGhpcy5lbWl0KCdhZnRlckhlbHAnLCBjb250ZXh0KTtcbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY29tbWFuZCkgPT5cbiAgICAgIGNvbW1hbmQuZW1pdCgnYWZ0ZXJBbGxIZWxwJywgY29udGV4dCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHBhc3MgaW4gZmxhZ3MgYW5kIGEgZGVzY3JpcHRpb24gdG8gY3VzdG9taXNlIHRoZSBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICogUGFzcyBpbiBmYWxzZSB0byBkaXNhYmxlIHRoZSBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5oZWxwT3B0aW9uKCctPywgLS1oZWxwJyAnc2hvdyBoZWxwJyk7IC8vIGN1c3RvbWlzZVxuICAgKiBwcm9ncmFtLmhlbHBPcHRpb24oZmFsc2UpOyAvLyBkaXNhYmxlXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IGJvb2xlYW4pfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaGVscE9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pIHtcbiAgICAvLyBTdXBwb3J0IGRpc2FibGluZyBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICBpZiAodHlwZW9mIGZsYWdzID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGlmIChmbGFncykge1xuICAgICAgICB0aGlzLl9oZWxwT3B0aW9uID0gdGhpcy5faGVscE9wdGlvbiA/PyB1bmRlZmluZWQ7IC8vIHByZXNlcnZlIGV4aXN0aW5nIG9wdGlvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faGVscE9wdGlvbiA9IG51bGw7IC8vIGRpc2FibGVcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEN1c3RvbWlzZSBmbGFncyBhbmQgZGVzY3JpcHRpb24uXG4gICAgZmxhZ3MgPSBmbGFncyA/PyAnLWgsIC0taGVscCc7XG4gICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiA/PyAnZGlzcGxheSBoZWxwIGZvciBjb21tYW5kJztcbiAgICB0aGlzLl9oZWxwT3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExhenkgY3JlYXRlIGhlbHAgb3B0aW9uLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgaGFzIGJlZW4gZGlzYWJsZWQgd2l0aCAuaGVscE9wdGlvbihmYWxzZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIHsoT3B0aW9uIHwgbnVsbCl9IHRoZSBoZWxwIG9wdGlvblxuICAgKiBAcGFja2FnZVxuICAgKi9cbiAgX2dldEhlbHBPcHRpb24oKSB7XG4gICAgLy8gTGF6eSBjcmVhdGUgaGVscCBvcHRpb24gb24gZGVtYW5kLlxuICAgIGlmICh0aGlzLl9oZWxwT3B0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaGVscE9wdGlvbih1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9oZWxwT3B0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1cHBseSB5b3VyIG93biBvcHRpb24gdG8gdXNlIGZvciB0aGUgYnVpbHQtaW4gaGVscCBvcHRpb24uXG4gICAqIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgaGVscE9wdGlvbigpIHRvIGN1c3RvbWlzZSB0aGUgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEhlbHBPcHRpb24ob3B0aW9uKSB7XG4gICAgdGhpcy5faGVscE9wdGlvbiA9IG9wdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBhbmQgZXhpdC5cbiAgICpcbiAgICogT3V0cHV0cyBidWlsdC1pbiBoZWxwLCBhbmQgY3VzdG9tIHRleHQgYWRkZWQgdXNpbmcgYC5hZGRIZWxwVGV4dCgpYC5cbiAgICpcbiAgICogQHBhcmFtIHt7IGVycm9yOiBib29sZWFuIH19IFtjb250ZXh0T3B0aW9uc10gLSBwYXNzIHtlcnJvcjp0cnVlfSB0byB3cml0ZSB0byBzdGRlcnIgaW5zdGVhZCBvZiBzdGRvdXRcbiAgICovXG5cbiAgaGVscChjb250ZXh0T3B0aW9ucykge1xuICAgIHRoaXMub3V0cHV0SGVscChjb250ZXh0T3B0aW9ucyk7XG4gICAgbGV0IGV4aXRDb2RlID0gcHJvY2Vzcy5leGl0Q29kZSB8fCAwO1xuICAgIGlmIChcbiAgICAgIGV4aXRDb2RlID09PSAwICYmXG4gICAgICBjb250ZXh0T3B0aW9ucyAmJlxuICAgICAgdHlwZW9mIGNvbnRleHRPcHRpb25zICE9PSAnZnVuY3Rpb24nICYmXG4gICAgICBjb250ZXh0T3B0aW9ucy5lcnJvclxuICAgICkge1xuICAgICAgZXhpdENvZGUgPSAxO1xuICAgIH1cbiAgICAvLyBtZXNzYWdlOiBkbyBub3QgaGF2ZSBhbGwgZGlzcGxheWVkIHRleHQgYXZhaWxhYmxlIHNvIG9ubHkgcGFzc2luZyBwbGFjZWhvbGRlci5cbiAgICB0aGlzLl9leGl0KGV4aXRDb2RlLCAnY29tbWFuZGVyLmhlbHAnLCAnKG91dHB1dEhlbHApJyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFkZGl0aW9uYWwgdGV4dCB0byBiZSBkaXNwbGF5ZWQgd2l0aCB0aGUgYnVpbHQtaW4gaGVscC5cbiAgICpcbiAgICogUG9zaXRpb24gaXMgJ2JlZm9yZScgb3IgJ2FmdGVyJyB0byBhZmZlY3QganVzdCB0aGlzIGNvbW1hbmQsXG4gICAqIGFuZCAnYmVmb3JlQWxsJyBvciAnYWZ0ZXJBbGwnIHRvIGFmZmVjdCB0aGlzIGNvbW1hbmQgYW5kIGFsbCBpdHMgc3ViY29tbWFuZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwb3NpdGlvbiAtIGJlZm9yZSBvciBhZnRlciBidWlsdC1pbiBoZWxwXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IEZ1bmN0aW9uKX0gdGV4dCAtIHN0cmluZyB0byBhZGQsIG9yIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgc3RyaW5nXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkSGVscFRleHQocG9zaXRpb24sIHRleHQpIHtcbiAgICBjb25zdCBhbGxvd2VkVmFsdWVzID0gWydiZWZvcmVBbGwnLCAnYmVmb3JlJywgJ2FmdGVyJywgJ2FmdGVyQWxsJ107XG4gICAgaWYgKCFhbGxvd2VkVmFsdWVzLmluY2x1ZGVzKHBvc2l0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciBwb3NpdGlvbiB0byBhZGRIZWxwVGV4dC5cbkV4cGVjdGluZyBvbmUgb2YgJyR7YWxsb3dlZFZhbHVlcy5qb2luKFwiJywgJ1wiKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGhlbHBFdmVudCA9IGAke3Bvc2l0aW9ufUhlbHBgO1xuICAgIHRoaXMub24oaGVscEV2ZW50LCAoY29udGV4dCkgPT4ge1xuICAgICAgbGV0IGhlbHBTdHI7XG4gICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGVscFN0ciA9IHRleHQoeyBlcnJvcjogY29udGV4dC5lcnJvciwgY29tbWFuZDogY29udGV4dC5jb21tYW5kIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVscFN0ciA9IHRleHQ7XG4gICAgICB9XG4gICAgICAvLyBJZ25vcmUgZmFsc3kgdmFsdWUgd2hlbiBub3RoaW5nIHRvIG91dHB1dC5cbiAgICAgIGlmIChoZWxwU3RyKSB7XG4gICAgICAgIGNvbnRleHQud3JpdGUoYCR7aGVscFN0cn1cXG5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBpZiBoZWxwIGZsYWdzIHNwZWNpZmllZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIC0gYXJyYXkgb2Ygb3B0aW9ucyB0byBzZWFyY2ggZm9yIGhlbHAgZmxhZ3NcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX291dHB1dEhlbHBJZlJlcXVlc3RlZChhcmdzKSB7XG4gICAgY29uc3QgaGVscE9wdGlvbiA9IHRoaXMuX2dldEhlbHBPcHRpb24oKTtcbiAgICBjb25zdCBoZWxwUmVxdWVzdGVkID0gaGVscE9wdGlvbiAmJiBhcmdzLmZpbmQoKGFyZykgPT4gaGVscE9wdGlvbi5pcyhhcmcpKTtcbiAgICBpZiAoaGVscFJlcXVlc3RlZCkge1xuICAgICAgdGhpcy5vdXRwdXRIZWxwKCk7XG4gICAgICAvLyAoRG8gbm90IGhhdmUgYWxsIGRpc3BsYXllZCB0ZXh0IGF2YWlsYWJsZSBzbyBvbmx5IHBhc3NpbmcgcGxhY2Vob2xkZXIuKVxuICAgICAgdGhpcy5fZXhpdCgwLCAnY29tbWFuZGVyLmhlbHBEaXNwbGF5ZWQnLCAnKG91dHB1dEhlbHApJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU2NhbiBhcmd1bWVudHMgYW5kIGluY3JlbWVudCBwb3J0IG51bWJlciBmb3IgaW5zcGVjdCBjYWxscyAodG8gYXZvaWQgY29uZmxpY3RzIHdoZW4gc3Bhd25pbmcgbmV3IGNvbW1hbmQpLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MgLSBhcnJheSBvZiBhcmd1bWVudHMgZnJvbSBub2RlLmV4ZWNBcmd2XG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGluY3JlbWVudE5vZGVJbnNwZWN0b3JQb3J0KGFyZ3MpIHtcbiAgLy8gVGVzdGluZyBmb3IgdGhlc2Ugb3B0aW9uczpcbiAgLy8gIC0taW5zcGVjdFs9W2hvc3Q6XXBvcnRdXG4gIC8vICAtLWluc3BlY3QtYnJrWz1baG9zdDpdcG9ydF1cbiAgLy8gIC0taW5zcGVjdC1wb3J0PVtob3N0Ol1wb3J0XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiB7XG4gICAgaWYgKCFhcmcuc3RhcnRzV2l0aCgnLS1pbnNwZWN0JykpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIGxldCBkZWJ1Z09wdGlvbjtcbiAgICBsZXQgZGVidWdIb3N0ID0gJzEyNy4wLjAuMSc7XG4gICAgbGV0IGRlYnVnUG9ydCA9ICc5MjI5JztcbiAgICBsZXQgbWF0Y2g7XG4gICAgaWYgKChtYXRjaCA9IGFyZy5tYXRjaCgvXigtLWluc3BlY3QoLWJyayk/KSQvKSkgIT09IG51bGwpIHtcbiAgICAgIC8vIGUuZy4gLS1pbnNwZWN0XG4gICAgICBkZWJ1Z09wdGlvbiA9IG1hdGNoWzFdO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAobWF0Y2ggPSBhcmcubWF0Y2goL14oLS1pbnNwZWN0KC1icmt8LXBvcnQpPyk9KFteOl0rKSQvKSkgIT09IG51bGxcbiAgICApIHtcbiAgICAgIGRlYnVnT3B0aW9uID0gbWF0Y2hbMV07XG4gICAgICBpZiAoL15cXGQrJC8udGVzdChtYXRjaFszXSkpIHtcbiAgICAgICAgLy8gZS5nLiAtLWluc3BlY3Q9MTIzNFxuICAgICAgICBkZWJ1Z1BvcnQgPSBtYXRjaFszXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGUuZy4gLS1pbnNwZWN0PWxvY2FsaG9zdFxuICAgICAgICBkZWJ1Z0hvc3QgPSBtYXRjaFszXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKG1hdGNoID0gYXJnLm1hdGNoKC9eKC0taW5zcGVjdCgtYnJrfC1wb3J0KT8pPShbXjpdKyk6KFxcZCspJC8pKSAhPT0gbnVsbFxuICAgICkge1xuICAgICAgLy8gZS5nLiAtLWluc3BlY3Q9bG9jYWxob3N0OjEyMzRcbiAgICAgIGRlYnVnT3B0aW9uID0gbWF0Y2hbMV07XG4gICAgICBkZWJ1Z0hvc3QgPSBtYXRjaFszXTtcbiAgICAgIGRlYnVnUG9ydCA9IG1hdGNoWzRdO1xuICAgIH1cblxuICAgIGlmIChkZWJ1Z09wdGlvbiAmJiBkZWJ1Z1BvcnQgIT09ICcwJykge1xuICAgICAgcmV0dXJuIGAke2RlYnVnT3B0aW9ufT0ke2RlYnVnSG9zdH06JHtwYXJzZUludChkZWJ1Z1BvcnQpICsgMX1gO1xuICAgIH1cbiAgICByZXR1cm4gYXJnO1xuICB9KTtcbn1cblxuZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDtcbiIsIi8qKlxuICogQ29tbWFuZGVyRXJyb3IgY2xhc3NcbiAqL1xuY2xhc3MgQ29tbWFuZGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHRoZSBDb21tYW5kZXJFcnJvciBjbGFzc1xuICAgKiBAcGFyYW0ge251bWJlcn0gZXhpdENvZGUgc3VnZ2VzdGVkIGV4aXQgY29kZSB3aGljaCBjb3VsZCBiZSB1c2VkIHdpdGggcHJvY2Vzcy5leGl0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIGFuIGlkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGVycm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvclxuICAgKi9cbiAgY29uc3RydWN0b3IoZXhpdENvZGUsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAvLyBwcm9wZXJseSBjYXB0dXJlIHN0YWNrIHRyYWNlIGluIE5vZGUuanNcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLmV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgdGhpcy5uZXN0ZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEludmFsaWRBcmd1bWVudEVycm9yIGNsYXNzXG4gKi9cbmNsYXNzIEludmFsaWRBcmd1bWVudEVycm9yIGV4dGVuZHMgQ29tbWFuZGVyRXJyb3Ige1xuICAvKipcbiAgICogQ29uc3RydWN0cyB0aGUgSW52YWxpZEFyZ3VtZW50RXJyb3IgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBleHBsYW5hdGlvbiBvZiB3aHkgYXJndW1lbnQgaXMgaW52YWxpZFxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKDEsICdjb21tYW5kZXIuaW52YWxpZEFyZ3VtZW50JywgbWVzc2FnZSk7XG4gICAgLy8gcHJvcGVybHkgY2FwdHVyZSBzdGFjayB0cmFjZSBpbiBOb2RlLmpzXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG59XG5cbmV4cG9ydHMuQ29tbWFuZGVyRXJyb3IgPSBDb21tYW5kZXJFcnJvcjtcbmV4cG9ydHMuSW52YWxpZEFyZ3VtZW50RXJyb3IgPSBJbnZhbGlkQXJndW1lbnRFcnJvcjtcbiIsImNvbnN0IHsgaHVtYW5SZWFkYWJsZUFyZ05hbWUgfSA9IHJlcXVpcmUoJy4vYXJndW1lbnQuanMnKTtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IGltcG9ydCB0eXBlcyBmb3IgSlNEb2MsIHVzZWQgYnkgVmlzdWFsIFN0dWRpbyBDb2RlIEludGVsbGlTZW5zZSBhbmQgYG5wbSBydW4gdHlwZXNjcmlwdC1jaGVja0pTYFxuICogaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svanNkb2Mtc3VwcG9ydGVkLXR5cGVzLmh0bWwjaW1wb3J0LXR5cGVzXG4gKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vYXJndW1lbnQuanNcIikuQXJndW1lbnQgfSBBcmd1bWVudFxuICogQHR5cGVkZWYgeyBpbXBvcnQoXCIuL2NvbW1hbmQuanNcIikuQ29tbWFuZCB9IENvbW1hbmRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KFwiLi9vcHRpb24uanNcIikuT3B0aW9uIH0gT3B0aW9uXG4gKi9cblxuLy8gQWx0aG91Z2ggdGhpcyBpcyBhIGNsYXNzLCBtZXRob2RzIGFyZSBzdGF0aWMgaW4gc3R5bGUgdG8gYWxsb3cgb3ZlcnJpZGUgdXNpbmcgc3ViY2xhc3Mgb3IganVzdCBmdW5jdGlvbnMuXG5jbGFzcyBIZWxwIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oZWxwV2lkdGggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zb3J0U3ViY29tbWFuZHMgPSBmYWxzZTtcbiAgICB0aGlzLnNvcnRPcHRpb25zID0gZmFsc2U7XG4gICAgdGhpcy5zaG93R2xvYmFsT3B0aW9ucyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiB0aGUgdmlzaWJsZSBzdWJjb21tYW5kcy4gSW5jbHVkZXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGltcGxpY2l0IGhlbHAgY29tbWFuZCwgaWYgdGhlcmUgaXMgb25lLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7Q29tbWFuZFtdfVxuICAgKi9cblxuICB2aXNpYmxlQ29tbWFuZHMoY21kKSB7XG4gICAgY29uc3QgdmlzaWJsZUNvbW1hbmRzID0gY21kLmNvbW1hbmRzLmZpbHRlcigoY21kKSA9PiAhY21kLl9oaWRkZW4pO1xuICAgIGNvbnN0IGhlbHBDb21tYW5kID0gY21kLl9nZXRIZWxwQ29tbWFuZCgpO1xuICAgIGlmIChoZWxwQ29tbWFuZCAmJiAhaGVscENvbW1hbmQuX2hpZGRlbikge1xuICAgICAgdmlzaWJsZUNvbW1hbmRzLnB1c2goaGVscENvbW1hbmQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0U3ViY29tbWFuZHMpIHtcbiAgICAgIHZpc2libGVDb21tYW5kcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2Ugb3ZlcmxvYWRlZCByZXR1cm4gdHlwZVxuICAgICAgICByZXR1cm4gYS5uYW1lKCkubG9jYWxlQ29tcGFyZShiLm5hbWUoKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZpc2libGVDb21tYW5kcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIG9wdGlvbnMgZm9yIHNvcnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBhXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBiXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBjb21wYXJlT3B0aW9ucyhhLCBiKSB7XG4gICAgY29uc3QgZ2V0U29ydEtleSA9IChvcHRpb24pID0+IHtcbiAgICAgIC8vIFdZU0lXWUcgZm9yIG9yZGVyIGRpc3BsYXllZCBpbiBoZWxwLiBTaG9ydCB1c2VkIGZvciBjb21wYXJpc29uIGlmIHByZXNlbnQuIE5vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG5lZ2F0ZWQuXG4gICAgICByZXR1cm4gb3B0aW9uLnNob3J0XG4gICAgICAgID8gb3B0aW9uLnNob3J0LnJlcGxhY2UoL14tLywgJycpXG4gICAgICAgIDogb3B0aW9uLmxvbmcucmVwbGFjZSgvXi0tLywgJycpO1xuICAgIH07XG4gICAgcmV0dXJuIGdldFNvcnRLZXkoYSkubG9jYWxlQ29tcGFyZShnZXRTb3J0S2V5KGIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIHZpc2libGUgb3B0aW9ucy4gSW5jbHVkZXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGltcGxpY2l0IGhlbHAgb3B0aW9uLCBpZiB0aGVyZSBpcyBvbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtPcHRpb25bXX1cbiAgICovXG5cbiAgdmlzaWJsZU9wdGlvbnMoY21kKSB7XG4gICAgY29uc3QgdmlzaWJsZU9wdGlvbnMgPSBjbWQub3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5oaWRkZW4pO1xuICAgIC8vIEJ1aWx0LWluIGhlbHAgb3B0aW9uLlxuICAgIGNvbnN0IGhlbHBPcHRpb24gPSBjbWQuX2dldEhlbHBPcHRpb24oKTtcbiAgICBpZiAoaGVscE9wdGlvbiAmJiAhaGVscE9wdGlvbi5oaWRkZW4pIHtcbiAgICAgIC8vIEF1dG9tYXRpY2FsbHkgaGlkZSBjb25mbGljdGluZyBmbGFncy4gQml0IGR1YmlvdXMgYnV0IGEgaGlzdG9yaWNhbCBiZWhhdmlvdXIgdGhhdCBpcyBjb252ZW5pZW50IGZvciBzaW5nbGUtY29tbWFuZCBwcm9ncmFtcy5cbiAgICAgIGNvbnN0IHJlbW92ZVNob3J0ID0gaGVscE9wdGlvbi5zaG9ydCAmJiBjbWQuX2ZpbmRPcHRpb24oaGVscE9wdGlvbi5zaG9ydCk7XG4gICAgICBjb25zdCByZW1vdmVMb25nID0gaGVscE9wdGlvbi5sb25nICYmIGNtZC5fZmluZE9wdGlvbihoZWxwT3B0aW9uLmxvbmcpO1xuICAgICAgaWYgKCFyZW1vdmVTaG9ydCAmJiAhcmVtb3ZlTG9uZykge1xuICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKGhlbHBPcHRpb24pOyAvLyBubyBjaGFuZ2VzIG5lZWRlZFxuICAgICAgfSBlbHNlIGlmIChoZWxwT3B0aW9uLmxvbmcgJiYgIXJlbW92ZUxvbmcpIHtcbiAgICAgICAgdmlzaWJsZU9wdGlvbnMucHVzaChcbiAgICAgICAgICBjbWQuY3JlYXRlT3B0aW9uKGhlbHBPcHRpb24ubG9uZywgaGVscE9wdGlvbi5kZXNjcmlwdGlvbiksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGhlbHBPcHRpb24uc2hvcnQgJiYgIXJlbW92ZVNob3J0KSB7XG4gICAgICAgIHZpc2libGVPcHRpb25zLnB1c2goXG4gICAgICAgICAgY21kLmNyZWF0ZU9wdGlvbihoZWxwT3B0aW9uLnNob3J0LCBoZWxwT3B0aW9uLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydE9wdGlvbnMpIHtcbiAgICAgIHZpc2libGVPcHRpb25zLnNvcnQodGhpcy5jb21wYXJlT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB2aXNpYmxlT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIHZpc2libGUgZ2xvYmFsIG9wdGlvbnMuIChOb3QgaW5jbHVkaW5nIGhlbHAuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7T3B0aW9uW119XG4gICAqL1xuXG4gIHZpc2libGVHbG9iYWxPcHRpb25zKGNtZCkge1xuICAgIGlmICghdGhpcy5zaG93R2xvYmFsT3B0aW9ucykgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgZ2xvYmFsT3B0aW9ucyA9IFtdO1xuICAgIGZvciAoXG4gICAgICBsZXQgYW5jZXN0b3JDbWQgPSBjbWQucGFyZW50O1xuICAgICAgYW5jZXN0b3JDbWQ7XG4gICAgICBhbmNlc3RvckNtZCA9IGFuY2VzdG9yQ21kLnBhcmVudFxuICAgICkge1xuICAgICAgY29uc3QgdmlzaWJsZU9wdGlvbnMgPSBhbmNlc3RvckNtZC5vcHRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wdGlvbikgPT4gIW9wdGlvbi5oaWRkZW4sXG4gICAgICApO1xuICAgICAgZ2xvYmFsT3B0aW9ucy5wdXNoKC4uLnZpc2libGVPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydE9wdGlvbnMpIHtcbiAgICAgIGdsb2JhbE9wdGlvbnMuc29ydCh0aGlzLmNvbXBhcmVPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbE9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IG9mIHRoZSBhcmd1bWVudHMgaWYgYW55IGhhdmUgYSBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge0FyZ3VtZW50W119XG4gICAqL1xuXG4gIHZpc2libGVBcmd1bWVudHMoY21kKSB7XG4gICAgLy8gU2lkZSBlZmZlY3QhIEFwcGx5IHRoZSBsZWdhY3kgZGVzY3JpcHRpb25zIGJlZm9yZSB0aGUgYXJndW1lbnRzIGFyZSBkaXNwbGF5ZWQuXG4gICAgaWYgKGNtZC5fYXJnc0Rlc2NyaXB0aW9uKSB7XG4gICAgICBjbWQucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChhcmd1bWVudCkgPT4ge1xuICAgICAgICBhcmd1bWVudC5kZXNjcmlwdGlvbiA9XG4gICAgICAgICAgYXJndW1lbnQuZGVzY3JpcHRpb24gfHwgY21kLl9hcmdzRGVzY3JpcHRpb25bYXJndW1lbnQubmFtZSgpXSB8fCAnJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgYXJndW1lbnRzIHdpdGggYSBkZXNjcmlwdGlvbiB0aGVuIHJldHVybiBhbGwgdGhlIGFyZ3VtZW50cy5cbiAgICBpZiAoY21kLnJlZ2lzdGVyZWRBcmd1bWVudHMuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50LmRlc2NyaXB0aW9uKSkge1xuICAgICAgcmV0dXJuIGNtZC5yZWdpc3RlcmVkQXJndW1lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb21tYW5kIHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgc3ViY29tbWFuZFRlcm0oY21kKSB7XG4gICAgLy8gTGVnYWN5LiBJZ25vcmVzIGN1c3RvbSB1c2FnZSBzdHJpbmcsIGFuZCBuZXN0ZWQgY29tbWFuZHMuXG4gICAgY29uc3QgYXJncyA9IGNtZC5yZWdpc3RlcmVkQXJndW1lbnRzXG4gICAgICAubWFwKChhcmcpID0+IGh1bWFuUmVhZGFibGVBcmdOYW1lKGFyZykpXG4gICAgICAuam9pbignICcpO1xuICAgIHJldHVybiAoXG4gICAgICBjbWQuX25hbWUgK1xuICAgICAgKGNtZC5fYWxpYXNlc1swXSA/ICd8JyArIGNtZC5fYWxpYXNlc1swXSA6ICcnKSArXG4gICAgICAoY21kLm9wdGlvbnMubGVuZ3RoID8gJyBbb3B0aW9uc10nIDogJycpICsgLy8gc2ltcGxpc3RpYyBjaGVjayBmb3Igbm9uLWhlbHAgb3B0aW9uXG4gICAgICAoYXJncyA/ICcgJyArIGFyZ3MgOiAnJylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3B0aW9uIHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIG9wdGlvblRlcm0ob3B0aW9uKSB7XG4gICAgcmV0dXJuIG9wdGlvbi5mbGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFyZ3VtZW50IHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIGFyZ3VtZW50VGVybShhcmd1bWVudCkge1xuICAgIHJldHVybiBhcmd1bWVudC5uYW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb25nZXN0IGNvbW1hbmQgdGVybSBsZW5ndGguXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG4gIGxvbmdlc3RTdWJjb21tYW5kVGVybUxlbmd0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBoZWxwZXIudmlzaWJsZUNvbW1hbmRzKGNtZCkucmVkdWNlKChtYXgsIGNvbW1hbmQpID0+IHtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIGhlbHBlci5zdWJjb21tYW5kVGVybShjb21tYW5kKS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZ2VzdCBvcHRpb24gdGVybSBsZW5ndGguXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG4gIGxvbmdlc3RPcHRpb25UZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSB7XG4gICAgcmV0dXJuIGhlbHBlci52aXNpYmxlT3B0aW9ucyhjbWQpLnJlZHVjZSgobWF4LCBvcHRpb24pID0+IHtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIGhlbHBlci5vcHRpb25UZXJtKG9wdGlvbikubGVuZ3RoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmdlc3QgZ2xvYmFsIG9wdGlvbiB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdEdsb2JhbE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gaGVscGVyLnZpc2libGVHbG9iYWxPcHRpb25zKGNtZCkucmVkdWNlKChtYXgsIG9wdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLm9wdGlvblRlcm0ob3B0aW9uKS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZ2VzdCBhcmd1bWVudCB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdEFyZ3VtZW50VGVybUxlbmd0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBoZWxwZXIudmlzaWJsZUFyZ3VtZW50cyhjbWQpLnJlZHVjZSgobWF4LCBhcmd1bWVudCkgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLmFyZ3VtZW50VGVybShhcmd1bWVudCkubGVuZ3RoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbW1hbmQgdXNhZ2UgdG8gYmUgZGlzcGxheWVkIGF0IHRoZSB0b3Agb2YgdGhlIGJ1aWx0LWluIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIGNvbW1hbmRVc2FnZShjbWQpIHtcbiAgICAvLyBVc2FnZVxuICAgIGxldCBjbWROYW1lID0gY21kLl9uYW1lO1xuICAgIGlmIChjbWQuX2FsaWFzZXNbMF0pIHtcbiAgICAgIGNtZE5hbWUgPSBjbWROYW1lICsgJ3wnICsgY21kLl9hbGlhc2VzWzBdO1xuICAgIH1cbiAgICBsZXQgYW5jZXN0b3JDbWROYW1lcyA9ICcnO1xuICAgIGZvciAoXG4gICAgICBsZXQgYW5jZXN0b3JDbWQgPSBjbWQucGFyZW50O1xuICAgICAgYW5jZXN0b3JDbWQ7XG4gICAgICBhbmNlc3RvckNtZCA9IGFuY2VzdG9yQ21kLnBhcmVudFxuICAgICkge1xuICAgICAgYW5jZXN0b3JDbWROYW1lcyA9IGFuY2VzdG9yQ21kLm5hbWUoKSArICcgJyArIGFuY2VzdG9yQ21kTmFtZXM7XG4gICAgfVxuICAgIHJldHVybiBhbmNlc3RvckNtZE5hbWVzICsgY21kTmFtZSArICcgJyArIGNtZC51c2FnZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBjb21tYW5kRGVzY3JpcHRpb24oY21kKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBvdmVybG9hZGVkIHJldHVybiB0eXBlXG4gICAgcmV0dXJuIGNtZC5kZXNjcmlwdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3ViY29tbWFuZCBzdW1tYXJ5IHRvIHNob3cgaW4gdGhlIGxpc3Qgb2Ygc3ViY29tbWFuZHMuXG4gICAqIChGYWxsYmFjayB0byBkZXNjcmlwdGlvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBzdWJjb21tYW5kRGVzY3JpcHRpb24oY21kKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBvdmVybG9hZGVkIHJldHVybiB0eXBlXG4gICAgcmV0dXJuIGNtZC5zdW1tYXJ5KCkgfHwgY21kLmRlc2NyaXB0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvcHRpb24gZGVzY3JpcHRpb24gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgb3B0aW9uRGVzY3JpcHRpb24ob3B0aW9uKSB7XG4gICAgY29uc3QgZXh0cmFJbmZvID0gW107XG5cbiAgICBpZiAob3B0aW9uLmFyZ0Nob2ljZXMpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKFxuICAgICAgICAvLyB1c2Ugc3RyaW5naWZ5IHRvIG1hdGNoIHRoZSBkaXNwbGF5IG9mIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIGBjaG9pY2VzOiAke29wdGlvbi5hcmdDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiBKU09OLnN0cmluZ2lmeShjaG9pY2UpKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9uLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBkZWZhdWx0IGZvciBib29sZWFuIGFuZCBuZWdhdGVkIG1vcmUgZm9yIHByb2dyYW1tZXIgdGhhbiBlbmQgdXNlcixcbiAgICAgIC8vIGJ1dCBzaG93IHRydWUvZmFsc2UgZm9yIGJvb2xlYW4gb3B0aW9uIGFzIG1heSBiZSBmb3IgaGFuZC1yb2xsZWQgZW52IG9yIGNvbmZpZyBwcm9jZXNzaW5nLlxuICAgICAgY29uc3Qgc2hvd0RlZmF1bHQgPVxuICAgICAgICBvcHRpb24ucmVxdWlyZWQgfHxcbiAgICAgICAgb3B0aW9uLm9wdGlvbmFsIHx8XG4gICAgICAgIChvcHRpb24uaXNCb29sZWFuKCkgJiYgdHlwZW9mIG9wdGlvbi5kZWZhdWx0VmFsdWUgPT09ICdib29sZWFuJyk7XG4gICAgICBpZiAoc2hvd0RlZmF1bHQpIHtcbiAgICAgICAgZXh0cmFJbmZvLnB1c2goXG4gICAgICAgICAgYGRlZmF1bHQ6ICR7b3B0aW9uLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uIHx8IEpTT04uc3RyaW5naWZ5KG9wdGlvbi5kZWZhdWx0VmFsdWUpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHByZXNldCBmb3IgYm9vbGVhbiBhbmQgbmVnYXRlZCBhcmUgbW9yZSBmb3IgcHJvZ3JhbW1lciB0aGFuIGVuZCB1c2VyXG4gICAgaWYgKG9wdGlvbi5wcmVzZXRBcmcgIT09IHVuZGVmaW5lZCAmJiBvcHRpb24ub3B0aW9uYWwpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKGBwcmVzZXQ6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9uLnByZXNldEFyZyl9YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb24uZW52VmFyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKGBlbnY6ICR7b3B0aW9uLmVudlZhcn1gKTtcbiAgICB9XG4gICAgaWYgKGV4dHJhSW5mby5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYCR7b3B0aW9uLmRlc2NyaXB0aW9ufSAoJHtleHRyYUluZm8uam9pbignLCAnKX0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9uLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXJndW1lbnQgZGVzY3JpcHRpb24gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgYXJndW1lbnREZXNjcmlwdGlvbihhcmd1bWVudCkge1xuICAgIGNvbnN0IGV4dHJhSW5mbyA9IFtdO1xuICAgIGlmIChhcmd1bWVudC5hcmdDaG9pY2VzKSB7XG4gICAgICBleHRyYUluZm8ucHVzaChcbiAgICAgICAgLy8gdXNlIHN0cmluZ2lmeSB0byBtYXRjaCB0aGUgZGlzcGxheSBvZiB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgICAgICBgY2hvaWNlczogJHthcmd1bWVudC5hcmdDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiBKU09OLnN0cmluZ2lmeShjaG9pY2UpKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXJndW1lbnQuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKFxuICAgICAgICBgZGVmYXVsdDogJHthcmd1bWVudC5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiB8fCBKU09OLnN0cmluZ2lmeShhcmd1bWVudC5kZWZhdWx0VmFsdWUpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZXh0cmFJbmZvLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4dHJhRGVzY3JpcHRvbiA9IGAoJHtleHRyYUluZm8uam9pbignLCAnKX0pYDtcbiAgICAgIGlmIChhcmd1bWVudC5kZXNjcmlwdGlvbikge1xuICAgICAgICByZXR1cm4gYCR7YXJndW1lbnQuZGVzY3JpcHRpb259ICR7ZXh0cmFEZXNjcmlwdG9ufWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXh0cmFEZXNjcmlwdG9uO1xuICAgIH1cbiAgICByZXR1cm4gYXJndW1lbnQuZGVzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGhlIGJ1aWx0LWluIGhlbHAgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgZm9ybWF0SGVscChjbWQsIGhlbHBlcikge1xuICAgIGNvbnN0IHRlcm1XaWR0aCA9IGhlbHBlci5wYWRXaWR0aChjbWQsIGhlbHBlcik7XG4gICAgY29uc3QgaGVscFdpZHRoID0gaGVscGVyLmhlbHBXaWR0aCB8fCA4MDtcbiAgICBjb25zdCBpdGVtSW5kZW50V2lkdGggPSAyO1xuICAgIGNvbnN0IGl0ZW1TZXBhcmF0b3JXaWR0aCA9IDI7IC8vIGJldHdlZW4gdGVybSBhbmQgZGVzY3JpcHRpb25cbiAgICBmdW5jdGlvbiBmb3JtYXRJdGVtKHRlcm0sIGRlc2NyaXB0aW9uKSB7XG4gICAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgZnVsbFRleHQgPSBgJHt0ZXJtLnBhZEVuZCh0ZXJtV2lkdGggKyBpdGVtU2VwYXJhdG9yV2lkdGgpfSR7ZGVzY3JpcHRpb259YDtcbiAgICAgICAgcmV0dXJuIGhlbHBlci53cmFwKFxuICAgICAgICAgIGZ1bGxUZXh0LFxuICAgICAgICAgIGhlbHBXaWR0aCAtIGl0ZW1JbmRlbnRXaWR0aCxcbiAgICAgICAgICB0ZXJtV2lkdGggKyBpdGVtU2VwYXJhdG9yV2lkdGgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVybTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZm9ybWF0TGlzdCh0ZXh0QXJyYXkpIHtcbiAgICAgIHJldHVybiB0ZXh0QXJyYXkuam9pbignXFxuJykucmVwbGFjZSgvXi9nbSwgJyAnLnJlcGVhdChpdGVtSW5kZW50V2lkdGgpKTtcbiAgICB9XG5cbiAgICAvLyBVc2FnZVxuICAgIGxldCBvdXRwdXQgPSBbYFVzYWdlOiAke2hlbHBlci5jb21tYW5kVXNhZ2UoY21kKX1gLCAnJ107XG5cbiAgICAvLyBEZXNjcmlwdGlvblxuICAgIGNvbnN0IGNvbW1hbmREZXNjcmlwdGlvbiA9IGhlbHBlci5jb21tYW5kRGVzY3JpcHRpb24oY21kKTtcbiAgICBpZiAoY29tbWFuZERlc2NyaXB0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoW1xuICAgICAgICBoZWxwZXIud3JhcChjb21tYW5kRGVzY3JpcHRpb24sIGhlbHBXaWR0aCwgMCksXG4gICAgICAgICcnLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gQXJndW1lbnRzXG4gICAgY29uc3QgYXJndW1lbnRMaXN0ID0gaGVscGVyLnZpc2libGVBcmd1bWVudHMoY21kKS5tYXAoKGFyZ3VtZW50KSA9PiB7XG4gICAgICByZXR1cm4gZm9ybWF0SXRlbShcbiAgICAgICAgaGVscGVyLmFyZ3VtZW50VGVybShhcmd1bWVudCksXG4gICAgICAgIGhlbHBlci5hcmd1bWVudERlc2NyaXB0aW9uKGFyZ3VtZW50KSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGFyZ3VtZW50TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBvdXRwdXQgPSBvdXRwdXQuY29uY2F0KFsnQXJndW1lbnRzOicsIGZvcm1hdExpc3QoYXJndW1lbnRMaXN0KSwgJyddKTtcbiAgICB9XG5cbiAgICAvLyBPcHRpb25zXG4gICAgY29uc3Qgb3B0aW9uTGlzdCA9IGhlbHBlci52aXNpYmxlT3B0aW9ucyhjbWQpLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gZm9ybWF0SXRlbShcbiAgICAgICAgaGVscGVyLm9wdGlvblRlcm0ob3B0aW9uKSxcbiAgICAgICAgaGVscGVyLm9wdGlvbkRlc2NyaXB0aW9uKG9wdGlvbiksXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChvcHRpb25MaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoWydPcHRpb25zOicsIGZvcm1hdExpc3Qob3B0aW9uTGlzdCksICcnXSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvd0dsb2JhbE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGdsb2JhbE9wdGlvbkxpc3QgPSBoZWxwZXJcbiAgICAgICAgLnZpc2libGVHbG9iYWxPcHRpb25zKGNtZClcbiAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdEl0ZW0oXG4gICAgICAgICAgICBoZWxwZXIub3B0aW9uVGVybShvcHRpb24pLFxuICAgICAgICAgICAgaGVscGVyLm9wdGlvbkRlc2NyaXB0aW9uKG9wdGlvbiksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAoZ2xvYmFsT3B0aW9uTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoW1xuICAgICAgICAgICdHbG9iYWwgT3B0aW9uczonLFxuICAgICAgICAgIGZvcm1hdExpc3QoZ2xvYmFsT3B0aW9uTGlzdCksXG4gICAgICAgICAgJycsXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbW1hbmRzXG4gICAgY29uc3QgY29tbWFuZExpc3QgPSBoZWxwZXIudmlzaWJsZUNvbW1hbmRzKGNtZCkubWFwKChjbWQpID0+IHtcbiAgICAgIHJldHVybiBmb3JtYXRJdGVtKFxuICAgICAgICBoZWxwZXIuc3ViY29tbWFuZFRlcm0oY21kKSxcbiAgICAgICAgaGVscGVyLnN1YmNvbW1hbmREZXNjcmlwdGlvbihjbWQpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAoY29tbWFuZExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChbJ0NvbW1hbmRzOicsIGZvcm1hdExpc3QoY29tbWFuZExpc3QpLCAnJ10pO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBwYWQgd2lkdGggZnJvbSB0aGUgbWF4aW11bSB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgcGFkV2lkdGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoXG4gICAgICBoZWxwZXIubG9uZ2VzdE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICAgaGVscGVyLmxvbmdlc3RHbG9iYWxPcHRpb25UZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSxcbiAgICAgIGhlbHBlci5sb25nZXN0U3ViY29tbWFuZFRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICAgaGVscGVyLmxvbmdlc3RBcmd1bWVudFRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHdpZHRoIGNoYXJhY3RlcnMgcGVyIGxpbmUsIHdpdGggbGluZXMgYWZ0ZXIgdGhlIGZpcnN0IGluZGVudGVkLlxuICAgKiBEbyBub3Qgd3JhcCBpZiBpbnN1ZmZpY2llbnQgcm9vbSBmb3Igd3JhcHBpbmcgKG1pbkNvbHVtbldpZHRoKSwgb3Igc3RyaW5nIGlzIG1hbnVhbGx5IGZvcm1hdHRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGVudFxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbkNvbHVtbldpZHRoPTQwXVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqXG4gICAqL1xuXG4gIHdyYXAoc3RyLCB3aWR0aCwgaW5kZW50LCBtaW5Db2x1bW5XaWR0aCA9IDQwKSB7XG4gICAgLy8gRnVsbCBcXHMgY2hhcmFjdGVycywgbWludXMgdGhlIGxpbmVmZWVkcy5cbiAgICBjb25zdCBpbmRlbnRzID1cbiAgICAgICcgXFxcXGZcXFxcdFxcXFx2XFx1MDBhMFxcdTE2ODBcXHUyMDAwLVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDBcXHVmZWZmJztcbiAgICAvLyBEZXRlY3QgbWFudWFsbHkgd3JhcHBlZCBhbmQgaW5kZW50ZWQgc3RyaW5ncyBieSBzZWFyY2hpbmcgZm9yIGxpbmUgYnJlYWsgZm9sbG93ZWQgYnkgc3BhY2VzLlxuICAgIGNvbnN0IG1hbnVhbEluZGVudCA9IG5ldyBSZWdFeHAoYFtcXFxcbl1bJHtpbmRlbnRzfV0rYCk7XG4gICAgaWYgKHN0ci5tYXRjaChtYW51YWxJbmRlbnQpKSByZXR1cm4gc3RyO1xuICAgIC8vIERvIG5vdCB3cmFwIGlmIG5vdCBlbm91Z2ggcm9vbSBmb3IgYSB3cmFwcGVkIGNvbHVtbiBvZiB0ZXh0IChhcyBjb3VsZCBlbmQgdXAgd2l0aCBhIHdvcmQgcGVyIGxpbmUpLlxuICAgIGNvbnN0IGNvbHVtbldpZHRoID0gd2lkdGggLSBpbmRlbnQ7XG4gICAgaWYgKGNvbHVtbldpZHRoIDwgbWluQ29sdW1uV2lkdGgpIHJldHVybiBzdHI7XG5cbiAgICBjb25zdCBsZWFkaW5nU3RyID0gc3RyLnNsaWNlKDAsIGluZGVudCk7XG4gICAgY29uc3QgY29sdW1uVGV4dCA9IHN0ci5zbGljZShpbmRlbnQpLnJlcGxhY2UoJ1xcclxcbicsICdcXG4nKTtcbiAgICBjb25zdCBpbmRlbnRTdHJpbmcgPSAnICcucmVwZWF0KGluZGVudCk7XG4gICAgY29uc3QgemVyb1dpZHRoU3BhY2UgPSAnXFx1MjAwQic7XG4gICAgY29uc3QgYnJlYWtzID0gYFxcXFxzJHt6ZXJvV2lkdGhTcGFjZX1gO1xuICAgIC8vIE1hdGNoIGxpbmUgZW5kIChzbyBlbXB0eSBsaW5lcyBkb24ndCBjb2xsYXBzZSksXG4gICAgLy8gb3IgYXMgbXVjaCB0ZXh0IGFzIHdpbGwgZml0IGluIGNvbHVtbiwgb3IgZXhjZXNzIHRleHQgdXAgdG8gZmlyc3QgYnJlYWsuXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgYFxcbnwuezEsJHtjb2x1bW5XaWR0aCAtIDF9fShbJHticmVha3N9XXwkKXxbXiR7YnJlYWtzfV0rPyhbJHticmVha3N9XXwkKWAsXG4gICAgICAnZycsXG4gICAgKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbHVtblRleHQubWF0Y2gocmVnZXgpIHx8IFtdO1xuICAgIHJldHVybiAoXG4gICAgICBsZWFkaW5nU3RyICtcbiAgICAgIGxpbmVzXG4gICAgICAgIC5tYXAoKGxpbmUsIGkpID0+IHtcbiAgICAgICAgICBpZiAobGluZSA9PT0gJ1xcbicpIHJldHVybiAnJzsgLy8gcHJlc2VydmUgZW1wdHkgbGluZXNcbiAgICAgICAgICByZXR1cm4gKGkgPiAwID8gaW5kZW50U3RyaW5nIDogJycpICsgbGluZS50cmltRW5kKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0cy5IZWxwID0gSGVscDtcbiIsImNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3IuanMnKTtcblxuY2xhc3MgT3B0aW9uIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgYE9wdGlvbmAgd2l0aCB0aGUgZ2l2ZW4gYGZsYWdzYCBhbmQgYGRlc2NyaXB0aW9uYC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgJyc7XG5cbiAgICB0aGlzLnJlcXVpcmVkID0gZmxhZ3MuaW5jbHVkZXMoJzwnKTsgLy8gQSB2YWx1ZSBtdXN0IGJlIHN1cHBsaWVkIHdoZW4gdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQuXG4gICAgdGhpcy5vcHRpb25hbCA9IGZsYWdzLmluY2x1ZGVzKCdbJyk7IC8vIEEgdmFsdWUgaXMgb3B0aW9uYWwgd2hlbiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZC5cbiAgICAvLyB2YXJpYWRpYyB0ZXN0IGlnbm9yZXMgPHZhbHVlLC4uLj4gZXQgYWwgd2hpY2ggbWlnaHQgYmUgdXNlZCB0byBkZXNjcmliZSBjdXN0b20gc3BsaXR0aW5nIG9mIHNpbmdsZSBhcmd1bWVudFxuICAgIHRoaXMudmFyaWFkaWMgPSAvXFx3XFwuXFwuXFwuWz5cXF1dJC8udGVzdChmbGFncyk7IC8vIFRoZSBvcHRpb24gY2FuIHRha2UgbXVsdGlwbGUgdmFsdWVzLlxuICAgIHRoaXMubWFuZGF0b3J5ID0gZmFsc2U7IC8vIFRoZSBvcHRpb24gbXVzdCBoYXZlIGEgdmFsdWUgYWZ0ZXIgcGFyc2luZywgd2hpY2ggdXN1YWxseSBtZWFucyBpdCBtdXN0IGJlIHNwZWNpZmllZCBvbiBjb21tYW5kIGxpbmUuXG4gICAgY29uc3Qgb3B0aW9uRmxhZ3MgPSBzcGxpdE9wdGlvbkZsYWdzKGZsYWdzKTtcbiAgICB0aGlzLnNob3J0ID0gb3B0aW9uRmxhZ3Muc2hvcnRGbGFnO1xuICAgIHRoaXMubG9uZyA9IG9wdGlvbkZsYWdzLmxvbmdGbGFnO1xuICAgIHRoaXMubmVnYXRlID0gZmFsc2U7XG4gICAgaWYgKHRoaXMubG9uZykge1xuICAgICAgdGhpcy5uZWdhdGUgPSB0aGlzLmxvbmcuc3RhcnRzV2l0aCgnLS1uby0nKTtcbiAgICB9XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnByZXNldEFyZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVudlZhciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBhcnNlQXJnID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29uZmxpY3RzV2l0aCA9IFtdO1xuICAgIHRoaXMuaW1wbGllZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUsIGFuZCBvcHRpb25hbGx5IHN1cHBseSB0aGUgZGVzY3JpcHRpb24gdG8gYmUgZGlzcGxheWVkIGluIHRoZSBoZWxwLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgZGVmYXVsdCh2YWx1ZSwgZGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVzZXQgdG8gdXNlIHdoZW4gb3B0aW9uIHVzZWQgd2l0aG91dCBvcHRpb24tYXJndW1lbnQsIGVzcGVjaWFsbHkgb3B0aW9uYWwgYnV0IGFsc28gYm9vbGVhbiBhbmQgbmVnYXRlZC5cbiAgICogVGhlIGN1c3RvbSBwcm9jZXNzaW5nIChwYXJzZUFyZykgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBuZXcgT3B0aW9uKCctLWNvbG9yJykuZGVmYXVsdCgnR1JFWVNDQUxFJykucHJlc2V0KCdSR0InKTtcbiAgICogbmV3IE9wdGlvbignLS1kb25hdGUgW2Ftb3VudF0nKS5wcmVzZXQoJzIwJykuYXJnUGFyc2VyKHBhcnNlRmxvYXQpO1xuICAgKlxuICAgKiBAcGFyYW0geyp9IGFyZ1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIHByZXNldChhcmcpIHtcbiAgICB0aGlzLnByZXNldEFyZyA9IGFyZztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgb3B0aW9uIG5hbWUocykgdGhhdCBjb25mbGljdCB3aXRoIHRoaXMgb3B0aW9uLlxuICAgKiBBbiBlcnJvciB3aWxsIGJlIGRpc3BsYXllZCBpZiBjb25mbGljdGluZyBvcHRpb25zIGFyZSBmb3VuZCBkdXJpbmcgcGFyc2luZy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbmV3IE9wdGlvbignLS1yZ2InKS5jb25mbGljdHMoJ2NteWsnKTtcbiAgICogbmV3IE9wdGlvbignLS1qcycpLmNvbmZsaWN0cyhbJ3RzJywgJ2pzeCddKTtcbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgc3RyaW5nW10pfSBuYW1lc1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGNvbmZsaWN0cyhuYW1lcykge1xuICAgIHRoaXMuY29uZmxpY3RzV2l0aCA9IHRoaXMuY29uZmxpY3RzV2l0aC5jb25jYXQobmFtZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgaW1wbGllZCBvcHRpb24gdmFsdWVzIGZvciB3aGVuIHRoaXMgb3B0aW9uIGlzIHNldCBhbmQgdGhlIGltcGxpZWQgb3B0aW9ucyBhcmUgbm90LlxuICAgKlxuICAgKiBUaGUgY3VzdG9tIHByb2Nlc3NpbmcgKHBhcnNlQXJnKSBpcyBub3QgY2FsbGVkIG9uIHRoZSBpbXBsaWVkIHZhbHVlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1sb2cnLCAnd3JpdGUgbG9nZ2luZyBpbmZvcm1hdGlvbiB0byBmaWxlJykpXG4gICAqICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLXRyYWNlJywgJ2xvZyBleHRyYSBkZXRhaWxzJykuaW1wbGllcyh7IGxvZzogJ3RyYWNlLnR4dCcgfSkpO1xuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW1wbGllZE9wdGlvblZhbHVlc1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuICBpbXBsaWVzKGltcGxpZWRPcHRpb25WYWx1ZXMpIHtcbiAgICBsZXQgbmV3SW1wbGllZCA9IGltcGxpZWRPcHRpb25WYWx1ZXM7XG4gICAgaWYgKHR5cGVvZiBpbXBsaWVkT3B0aW9uVmFsdWVzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gc3RyaW5nIGlzIG5vdCBkb2N1bWVudGVkLCBidXQgZWFzeSBtaXN0YWtlIGFuZCB3ZSBjYW4gZG8gd2hhdCB1c2VyIHByb2JhYmx5IGludGVuZGVkLlxuICAgICAgbmV3SW1wbGllZCA9IHsgW2ltcGxpZWRPcHRpb25WYWx1ZXNdOiB0cnVlIH07XG4gICAgfVxuICAgIHRoaXMuaW1wbGllZCA9IE9iamVjdC5hc3NpZ24odGhpcy5pbXBsaWVkIHx8IHt9LCBuZXdJbXBsaWVkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gY2hlY2sgZm9yIG9wdGlvbiB2YWx1ZS5cbiAgICpcbiAgICogQW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgb25seSB1c2VkIGlmIHdoZW4gcHJvY2Vzc2VkIHRoZSBjdXJyZW50IG9wdGlvbiB2YWx1ZSBpc1xuICAgKiB1bmRlZmluZWQsIG9yIHRoZSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgdmFsdWUgaXMgJ2RlZmF1bHQnIG9yICdjb25maWcnIG9yICdlbnYnLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGVudihuYW1lKSB7XG4gICAgdGhpcy5lbnZWYXIgPSBuYW1lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VzdG9tIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgQ0xJIG9wdGlvbiBhcmd1bWVudHMgaW50byBvcHRpb24gdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgYXJnUGFyc2VyKGZuKSB7XG4gICAgdGhpcy5wYXJzZUFyZyA9IGZuO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBtYW5kYXRvcnkgYW5kIG11c3QgaGF2ZSBhIHZhbHVlIGFmdGVyIHBhcnNpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW21hbmRhdG9yeT10cnVlXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIG1ha2VPcHRpb25NYW5kYXRvcnkobWFuZGF0b3J5ID0gdHJ1ZSkge1xuICAgIHRoaXMubWFuZGF0b3J5ID0gISFtYW5kYXRvcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSBvcHRpb24gaW4gaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbaGlkZT10cnVlXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGhpZGVIZWxwKGhpZGUgPSB0cnVlKSB7XG4gICAgdGhpcy5oaWRkZW4gPSAhIWhpZGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhY2thZ2VcbiAgICovXG5cbiAgX2NvbmNhdFZhbHVlKHZhbHVlLCBwcmV2aW91cykge1xuICAgIGlmIChwcmV2aW91cyA9PT0gdGhpcy5kZWZhdWx0VmFsdWUgfHwgIUFycmF5LmlzQXJyYXkocHJldmlvdXMpKSB7XG4gICAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJldmlvdXMuY29uY2F0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IGFsbG93IG9wdGlvbiB2YWx1ZSB0byBiZSBvbmUgb2YgY2hvaWNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdmFsdWVzXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgY2hvaWNlcyh2YWx1ZXMpIHtcbiAgICB0aGlzLmFyZ0Nob2ljZXMgPSB2YWx1ZXMuc2xpY2UoKTtcbiAgICB0aGlzLnBhcnNlQXJnID0gKGFyZywgcHJldmlvdXMpID0+IHtcbiAgICAgIGlmICghdGhpcy5hcmdDaG9pY2VzLmluY2x1ZGVzKGFyZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgIGBBbGxvd2VkIGNob2ljZXMgYXJlICR7dGhpcy5hcmdDaG9pY2VzLmpvaW4oJywgJyl9LmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52YXJpYWRpYykge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uY2F0VmFsdWUoYXJnLCBwcmV2aW91cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIG9wdGlvbiBuYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIG5hbWUoKSB7XG4gICAgaWYgKHRoaXMubG9uZykge1xuICAgICAgcmV0dXJuIHRoaXMubG9uZy5yZXBsYWNlKC9eLS0vLCAnJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3J0LnJlcGxhY2UoL14tLywgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBvcHRpb24gbmFtZSwgaW4gYSBjYW1lbGNhc2UgZm9ybWF0IHRoYXQgY2FuIGJlIHVzZWRcbiAgICogYXMgYSBvYmplY3QgYXR0cmlidXRlIGtleS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBhdHRyaWJ1dGVOYW1lKCkge1xuICAgIHJldHVybiBjYW1lbGNhc2UodGhpcy5uYW1lKCkucmVwbGFjZSgvXm5vLS8sICcnKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYGFyZ2AgbWF0Y2hlcyB0aGUgc2hvcnQgb3IgbG9uZyBmbGFnLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIGlzKGFyZykge1xuICAgIHJldHVybiB0aGlzLnNob3J0ID09PSBhcmcgfHwgdGhpcy5sb25nID09PSBhcmc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgYSBib29sZWFuIG9wdGlvbi5cbiAgICpcbiAgICogT3B0aW9ucyBhcmUgb25lIG9mIGJvb2xlYW4sIG5lZ2F0ZWQsIHJlcXVpcmVkIGFyZ3VtZW50LCBvciBvcHRpb25hbCBhcmd1bWVudC5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogQHBhY2thZ2VcbiAgICovXG5cbiAgaXNCb29sZWFuKCkge1xuICAgIHJldHVybiAhdGhpcy5yZXF1aXJlZCAmJiAhdGhpcy5vcHRpb25hbCAmJiAhdGhpcy5uZWdhdGU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdvcmsgd2l0aCBkdWFsIG9wdGlvbnMsIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGV4aXN0aW5nXG4gKiBpbXBsZW1lbnRhdGlvbi4gV2Ugc3VwcG9ydCBzZXBhcmF0ZSBkdWFsIG9wdGlvbnMgZm9yIHNlcGFyYXRlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBvcHRpb25zLFxuICogbGlrZSBgLS1idWlsZGAgYW5kIGAtLW5vLWJ1aWxkYCwgd2hpY2ggc2hhcmUgYSBzaW5nbGUgb3B0aW9uIHZhbHVlLiBUaGlzIHdvcmtzIG5pY2VseSBmb3Igc29tZVxuICogdXNlIGNhc2VzLCBidXQgaXMgdHJpY2t5IGZvciBvdGhlcnMgd2hlcmUgd2Ugd2FudCBzZXBhcmF0ZSBiZWhhdmlvdXJzIGRlc3BpdGVcbiAqIHRoZSBzaW5nbGUgc2hhcmVkIG9wdGlvbiB2YWx1ZS5cbiAqL1xuY2xhc3MgRHVhbE9wdGlvbnMge1xuICAvKipcbiAgICogQHBhcmFtIHtPcHRpb25bXX0gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHRoaXMucG9zaXRpdmVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgIHRoaXMubmVnYXRpdmVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZHVhbE9wdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgIGlmIChvcHRpb24ubmVnYXRlKSB7XG4gICAgICAgIHRoaXMubmVnYXRpdmVPcHRpb25zLnNldChvcHRpb24uYXR0cmlidXRlTmFtZSgpLCBvcHRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3NpdGl2ZU9wdGlvbnMuc2V0KG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCksIG9wdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5uZWdhdGl2ZU9wdGlvbnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgaWYgKHRoaXMucG9zaXRpdmVPcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuZHVhbE9wdGlvbnMuYWRkKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlkIHRoZSB2YWx1ZSBjb21lIGZyb20gdGhlIG9wdGlvbiwgYW5kIG5vdCBmcm9tIHBvc3NpYmxlIG1hdGNoaW5nIGR1YWwgb3B0aW9uP1xuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICB2YWx1ZUZyb21PcHRpb24odmFsdWUsIG9wdGlvbikge1xuICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgaWYgKCF0aGlzLmR1YWxPcHRpb25zLmhhcyhvcHRpb25LZXkpKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIFVzZSB0aGUgdmFsdWUgdG8gZGVkdWNlIGlmIChwcm9iYWJseSkgY2FtZSBmcm9tIHRoZSBvcHRpb24uXG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5uZWdhdGl2ZU9wdGlvbnMuZ2V0KG9wdGlvbktleSkucHJlc2V0QXJnO1xuICAgIGNvbnN0IG5lZ2F0aXZlVmFsdWUgPSBwcmVzZXQgIT09IHVuZGVmaW5lZCA/IHByZXNldCA6IGZhbHNlO1xuICAgIHJldHVybiBvcHRpb24ubmVnYXRlID09PSAobmVnYXRpdmVWYWx1ZSA9PT0gdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBzdHJpbmcgZnJvbSBrZWJhYi1jYXNlIHRvIGNhbWVsQ2FzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNhbWVsY2FzZShzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgnLScpLnJlZHVjZSgoc3RyLCB3b3JkKSA9PiB7XG4gICAgcmV0dXJuIHN0ciArIHdvcmRbMF0udG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNwbGl0IHRoZSBzaG9ydCBhbmQgbG9uZyBmbGFnIG91dCBvZiBzb21ldGhpbmcgbGlrZSAnLW0sLS1taXhlZCA8dmFsdWU+J1xuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BsaXRPcHRpb25GbGFncyhmbGFncykge1xuICBsZXQgc2hvcnRGbGFnO1xuICBsZXQgbG9uZ0ZsYWc7XG4gIC8vIFVzZSBvcmlnaW5hbCB2ZXJ5IGxvb3NlIHBhcnNpbmcgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG5vdyxcbiAgLy8gd2hpY2ggYWxsb3dlZCBmb3IgZXhhbXBsZSB1bmludGVuZGVkIGAtc3csIC0tc2hvcnQtd29yZGAgW3NpY10uXG4gIGNvbnN0IGZsYWdQYXJ0cyA9IGZsYWdzLnNwbGl0KC9bIHwsXSsvKTtcbiAgaWYgKGZsYWdQYXJ0cy5sZW5ndGggPiAxICYmICEvXltbPF0vLnRlc3QoZmxhZ1BhcnRzWzFdKSlcbiAgICBzaG9ydEZsYWcgPSBmbGFnUGFydHMuc2hpZnQoKTtcbiAgbG9uZ0ZsYWcgPSBmbGFnUGFydHMuc2hpZnQoKTtcbiAgLy8gQWRkIHN1cHBvcnQgZm9yIGxvbmUgc2hvcnQgZmxhZyB3aXRob3V0IHNpZ25pZmljYW50bHkgY2hhbmdpbmcgcGFyc2luZyFcbiAgaWYgKCFzaG9ydEZsYWcgJiYgL14tW14tXSQvLnRlc3QobG9uZ0ZsYWcpKSB7XG4gICAgc2hvcnRGbGFnID0gbG9uZ0ZsYWc7XG4gICAgbG9uZ0ZsYWcgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc2hvcnRGbGFnLCBsb25nRmxhZyB9O1xufVxuXG5leHBvcnRzLk9wdGlvbiA9IE9wdGlvbjtcbmV4cG9ydHMuRHVhbE9wdGlvbnMgPSBEdWFsT3B0aW9ucztcbiIsImNvbnN0IG1heERpc3RhbmNlID0gMztcblxuZnVuY3Rpb24gZWRpdERpc3RhbmNlKGEsIGIpIHtcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGFtZXJhdeKAk0xldmVuc2h0ZWluX2Rpc3RhbmNlXG4gIC8vIENhbGN1bGF0aW5nIG9wdGltYWwgc3RyaW5nIGFsaWdubWVudCBkaXN0YW5jZSwgbm8gc3Vic3RyaW5nIGlzIGVkaXRlZCBtb3JlIHRoYW4gb25jZS5cbiAgLy8gKFNpbXBsZSBpbXBsZW1lbnRhdGlvbi4pXG5cbiAgLy8gUXVpY2sgZWFybHkgZXhpdCwgcmV0dXJuIHdvcnN0IGNhc2UuXG4gIGlmIChNYXRoLmFicyhhLmxlbmd0aCAtIGIubGVuZ3RoKSA+IG1heERpc3RhbmNlKVxuICAgIHJldHVybiBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuXG4gIC8vIGRpc3RhbmNlIGJldHdlZW4gcHJlZml4IHN1YnN0cmluZ3Mgb2YgYSBhbmQgYlxuICBjb25zdCBkID0gW107XG5cbiAgLy8gcHVyZSBkZWxldGlvbnMgdHVybiBhIGludG8gZW1wdHkgc3RyaW5nXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IGEubGVuZ3RoOyBpKyspIHtcbiAgICBkW2ldID0gW2ldO1xuICB9XG4gIC8vIHB1cmUgaW5zZXJ0aW9ucyB0dXJuIGVtcHR5IHN0cmluZyBpbnRvIGJcbiAgZm9yIChsZXQgaiA9IDA7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIGRbMF1bal0gPSBqO1xuICB9XG5cbiAgLy8gZmlsbCBtYXRyaXhcbiAgZm9yIChsZXQgaiA9IDE7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjb3N0ID0gMTtcbiAgICAgIGlmIChhW2kgLSAxXSA9PT0gYltqIC0gMV0pIHtcbiAgICAgICAgY29zdCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3N0ID0gMTtcbiAgICAgIH1cbiAgICAgIGRbaV1bal0gPSBNYXRoLm1pbihcbiAgICAgICAgZFtpIC0gMV1bal0gKyAxLCAvLyBkZWxldGlvblxuICAgICAgICBkW2ldW2ogLSAxXSArIDEsIC8vIGluc2VydGlvblxuICAgICAgICBkW2kgLSAxXVtqIC0gMV0gKyBjb3N0LCAvLyBzdWJzdGl0dXRpb25cbiAgICAgICk7XG4gICAgICAvLyB0cmFuc3Bvc2l0aW9uXG4gICAgICBpZiAoaSA+IDEgJiYgaiA+IDEgJiYgYVtpIC0gMV0gPT09IGJbaiAtIDJdICYmIGFbaSAtIDJdID09PSBiW2ogLSAxXSkge1xuICAgICAgICBkW2ldW2pdID0gTWF0aC5taW4oZFtpXVtqXSwgZFtpIC0gMl1baiAtIDJdICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRbYS5sZW5ndGhdW2IubGVuZ3RoXTtcbn1cblxuLyoqXG4gKiBGaW5kIGNsb3NlIG1hdGNoZXMsIHJlc3RyaWN0ZWQgdG8gc2FtZSBudW1iZXIgb2YgZWRpdHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IGNhbmRpZGF0ZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gc3VnZ2VzdFNpbWlsYXIod29yZCwgY2FuZGlkYXRlcykge1xuICBpZiAoIWNhbmRpZGF0ZXMgfHwgY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgLy8gcmVtb3ZlIHBvc3NpYmxlIGR1cGxpY2F0ZXNcbiAgY2FuZGlkYXRlcyA9IEFycmF5LmZyb20obmV3IFNldChjYW5kaWRhdGVzKSk7XG5cbiAgY29uc3Qgc2VhcmNoaW5nT3B0aW9ucyA9IHdvcmQuc3RhcnRzV2l0aCgnLS0nKTtcbiAgaWYgKHNlYXJjaGluZ09wdGlvbnMpIHtcbiAgICB3b3JkID0gd29yZC5zbGljZSgyKTtcbiAgICBjYW5kaWRhdGVzID0gY2FuZGlkYXRlcy5tYXAoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnNsaWNlKDIpKTtcbiAgfVxuXG4gIGxldCBzaW1pbGFyID0gW107XG4gIGxldCBiZXN0RGlzdGFuY2UgPSBtYXhEaXN0YW5jZTtcbiAgY29uc3QgbWluU2ltaWxhcml0eSA9IDAuNDtcbiAgY2FuZGlkYXRlcy5mb3JFYWNoKChjYW5kaWRhdGUpID0+IHtcbiAgICBpZiAoY2FuZGlkYXRlLmxlbmd0aCA8PSAxKSByZXR1cm47IC8vIG5vIG9uZSBjaGFyYWN0ZXIgZ3Vlc3Nlc1xuXG4gICAgY29uc3QgZGlzdGFuY2UgPSBlZGl0RGlzdGFuY2Uod29yZCwgY2FuZGlkYXRlKTtcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCh3b3JkLmxlbmd0aCwgY2FuZGlkYXRlLmxlbmd0aCk7XG4gICAgY29uc3Qgc2ltaWxhcml0eSA9IChsZW5ndGggLSBkaXN0YW5jZSkgLyBsZW5ndGg7XG4gICAgaWYgKHNpbWlsYXJpdHkgPiBtaW5TaW1pbGFyaXR5KSB7XG4gICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgLy8gYmV0dGVyIGVkaXQgZGlzdGFuY2UsIHRocm93IGF3YXkgcHJldmlvdXMgd29yc2UgbWF0Y2hlc1xuICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgc2ltaWxhciA9IFtjYW5kaWRhdGVdO1xuICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA9PT0gYmVzdERpc3RhbmNlKSB7XG4gICAgICAgIHNpbWlsYXIucHVzaChjYW5kaWRhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgc2ltaWxhci5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBpZiAoc2VhcmNoaW5nT3B0aW9ucykge1xuICAgIHNpbWlsYXIgPSBzaW1pbGFyLm1hcCgoY2FuZGlkYXRlKSA9PiBgLS0ke2NhbmRpZGF0ZX1gKTtcbiAgfVxuXG4gIGlmIChzaW1pbGFyLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gYFxcbihEaWQgeW91IG1lYW4gb25lIG9mICR7c2ltaWxhci5qb2luKCcsICcpfT8pYDtcbiAgfVxuICBpZiAoc2ltaWxhci5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYFxcbihEaWQgeW91IG1lYW4gJHtzaW1pbGFyWzBdfT8pYDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydHMuc3VnZ2VzdFNpbWlsYXIgPSBzdWdnZXN0U2ltaWxhcjtcbiIsImNvbnN0IHBlcmYgPVxuICB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmXG4gIHBlcmZvcm1hbmNlICYmXG4gIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbidcbiAgICA/IHBlcmZvcm1hbmNlXG4gICAgOiBEYXRlXG5cbmNvbnN0IGhhc0Fib3J0Q29udHJvbGxlciA9IHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgPT09ICdmdW5jdGlvbidcblxuLy8gbWluaW1hbCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBwb2x5ZmlsbFxuLy8gdGhpcyBkb2Vzbid0IGhhdmUgbmVhcmx5IGFsbCB0aGUgY2hlY2tzIGFuZCB3aGF0bm90IHRoYXRcbi8vIGFjdHVhbCBBYm9ydENvbnRyb2xsZXIvU2lnbmFsIGhhcywgYnV0IGl0J3MgZW5vdWdoIGZvclxuLy8gb3VyIHB1cnBvc2VzLCBhbmQgaWYgdXNlZCBwcm9wZXJseSwgYmVoYXZlcyB0aGUgc2FtZS5cbmNvbnN0IEFDID0gaGFzQWJvcnRDb250cm9sbGVyXG4gID8gQWJvcnRDb250cm9sbGVyXG4gIDogY2xhc3MgQWJvcnRDb250cm9sbGVyIHtcbiAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNpZ25hbCA9IG5ldyBBUygpXG4gICAgICB9XG4gICAgICBhYm9ydChyZWFzb24gPSBuZXcgRXJyb3IoJ1RoaXMgb3BlcmF0aW9uIHdhcyBhYm9ydGVkJykpIHtcbiAgICAgICAgdGhpcy5zaWduYWwucmVhc29uID0gdGhpcy5zaWduYWwucmVhc29uIHx8IHJlYXNvblxuICAgICAgICB0aGlzLnNpZ25hbC5hYm9ydGVkID0gdHJ1ZVxuICAgICAgICB0aGlzLnNpZ25hbC5kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnYWJvcnQnLFxuICAgICAgICAgIHRhcmdldDogdGhpcy5zaWduYWwsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG5jb25zdCBoYXNBYm9ydFNpZ25hbCA9IHR5cGVvZiBBYm9ydFNpZ25hbCA9PT0gJ2Z1bmN0aW9uJ1xuLy8gU29tZSBwb2x5ZmlsbHMgcHV0IHRoaXMgb24gdGhlIEFDIGNsYXNzLCBub3QgZ2xvYmFsXG5jb25zdCBoYXNBQ0Fib3J0U2lnbmFsID0gdHlwZW9mIEFDLkFib3J0U2lnbmFsID09PSAnZnVuY3Rpb24nXG5jb25zdCBBUyA9IGhhc0Fib3J0U2lnbmFsXG4gID8gQWJvcnRTaWduYWxcbiAgOiBoYXNBQ0Fib3J0U2lnbmFsXG4gID8gQUMuQWJvcnRDb250cm9sbGVyXG4gIDogY2xhc3MgQWJvcnRTaWduYWwge1xuICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucmVhc29uID0gdW5kZWZpbmVkXG4gICAgICAgIHRoaXMuYWJvcnRlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdXG4gICAgICB9XG4gICAgICBkaXNwYXRjaEV2ZW50KGUpIHtcbiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWVcbiAgICAgICAgICB0aGlzLm9uYWJvcnQoZSlcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaChmID0+IGYoZSksIHRoaXMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uYWJvcnQoKSB7fVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihldiwgZm4pIHtcbiAgICAgICAgaWYgKGV2ID09PSAnYWJvcnQnKSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2goZm4pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoZXYsIGZuKSB7XG4gICAgICAgIGlmIChldiA9PT0gJ2Fib3J0Jykge1xuICAgICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycy5maWx0ZXIoZiA9PiBmICE9PSBmbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuY29uc3Qgd2FybmVkID0gbmV3IFNldCgpXG5jb25zdCBkZXByZWNhdGVkT3B0aW9uID0gKG9wdCwgaW5zdGVhZCkgPT4ge1xuICBjb25zdCBjb2RlID0gYExSVV9DQUNIRV9PUFRJT05fJHtvcHR9YFxuICBpZiAoc2hvdWxkV2Fybihjb2RlKSkge1xuICAgIHdhcm4oY29kZSwgYCR7b3B0fSBvcHRpb25gLCBgb3B0aW9ucy4ke2luc3RlYWR9YCwgTFJVQ2FjaGUpXG4gIH1cbn1cbmNvbnN0IGRlcHJlY2F0ZWRNZXRob2QgPSAobWV0aG9kLCBpbnN0ZWFkKSA9PiB7XG4gIGNvbnN0IGNvZGUgPSBgTFJVX0NBQ0hFX01FVEhPRF8ke21ldGhvZH1gXG4gIGlmIChzaG91bGRXYXJuKGNvZGUpKSB7XG4gICAgY29uc3QgeyBwcm90b3R5cGUgfSA9IExSVUNhY2hlXG4gICAgY29uc3QgeyBnZXQgfSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBtZXRob2QpXG4gICAgd2Fybihjb2RlLCBgJHttZXRob2R9IG1ldGhvZGAsIGBjYWNoZS4ke2luc3RlYWR9KClgLCBnZXQpXG4gIH1cbn1cbmNvbnN0IGRlcHJlY2F0ZWRQcm9wZXJ0eSA9IChmaWVsZCwgaW5zdGVhZCkgPT4ge1xuICBjb25zdCBjb2RlID0gYExSVV9DQUNIRV9QUk9QRVJUWV8ke2ZpZWxkfWBcbiAgaWYgKHNob3VsZFdhcm4oY29kZSkpIHtcbiAgICBjb25zdCB7IHByb3RvdHlwZSB9ID0gTFJVQ2FjaGVcbiAgICBjb25zdCB7IGdldCB9ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIGZpZWxkKVxuICAgIHdhcm4oY29kZSwgYCR7ZmllbGR9IHByb3BlcnR5YCwgYGNhY2hlLiR7aW5zdGVhZH1gLCBnZXQpXG4gIH1cbn1cblxuY29uc3QgZW1pdFdhcm5pbmcgPSAoLi4uYSkgPT4ge1xuICB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgcHJvY2VzcyAmJlxuICB0eXBlb2YgcHJvY2Vzcy5lbWl0V2FybmluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gcHJvY2Vzcy5lbWl0V2FybmluZyguLi5hKVxuICAgIDogY29uc29sZS5lcnJvciguLi5hKVxufVxuXG5jb25zdCBzaG91bGRXYXJuID0gY29kZSA9PiAhd2FybmVkLmhhcyhjb2RlKVxuXG5jb25zdCB3YXJuID0gKGNvZGUsIHdoYXQsIGluc3RlYWQsIGZuKSA9PiB7XG4gIHdhcm5lZC5hZGQoY29kZSlcbiAgY29uc3QgbXNnID0gYFRoZSAke3doYXR9IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJHtpbnN0ZWFkfSBpbnN0ZWFkLmBcbiAgZW1pdFdhcm5pbmcobXNnLCAnRGVwcmVjYXRpb25XYXJuaW5nJywgY29kZSwgZm4pXG59XG5cbmNvbnN0IGlzUG9zSW50ID0gbiA9PiBuICYmIG4gPT09IE1hdGguZmxvb3IobikgJiYgbiA+IDAgJiYgaXNGaW5pdGUobilcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgLSBUaGlzIGlzIGEgbGl0dGxlIGJpdCByaWRpY3Vsb3VzLCB0YmguXG4gKiBUaGUgbWF4aW11bSBhcnJheSBsZW5ndGggaXMgMl4zMi0xIG9yIHRoZXJlYWJvdXRzIG9uIG1vc3QgSlMgaW1wbHMuXG4gKiBBbmQgd2VsbCBiZWZvcmUgdGhhdCBwb2ludCwgeW91J3JlIGNhY2hpbmcgdGhlIGVudGlyZSB3b3JsZCwgSSBtZWFuLFxuICogdGhhdCdzIH4zMkdCIG9mIGp1c3QgaW50ZWdlcnMgZm9yIHRoZSBuZXh0L3ByZXYgbGlua3MsIHBsdXMgd2hhdGV2ZXJcbiAqIGVsc2UgdG8gaG9sZCB0aGF0IG1hbnkga2V5cyBhbmQgdmFsdWVzLiAgSnVzdCBmaWxsaW5nIHRoZSBtZW1vcnkgd2l0aFxuICogemVyb2VzIGF0IGluaXQgdGltZSBpcyBicnV0YWwgd2hlbiB5b3UgZ2V0IHRoYXQgYmlnLlxuICogQnV0IHdoeSBub3QgYmUgY29tcGxldGU/XG4gKiBNYXliZSBpbiB0aGUgZnV0dXJlLCB0aGVzZSBsaW1pdHMgd2lsbCBoYXZlIGV4cGFuZGVkLiAqL1xuY29uc3QgZ2V0VWludEFycmF5ID0gbWF4ID0+XG4gICFpc1Bvc0ludChtYXgpXG4gICAgPyBudWxsXG4gICAgOiBtYXggPD0gTWF0aC5wb3coMiwgOClcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IG1heCA8PSBNYXRoLnBvdygyLCAxNilcbiAgICA/IFVpbnQxNkFycmF5XG4gICAgOiBtYXggPD0gTWF0aC5wb3coMiwgMzIpXG4gICAgPyBVaW50MzJBcnJheVxuICAgIDogbWF4IDw9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG4gICAgPyBaZXJvQXJyYXlcbiAgICA6IG51bGxcblxuY2xhc3MgWmVyb0FycmF5IGV4dGVuZHMgQXJyYXkge1xuICBjb25zdHJ1Y3RvcihzaXplKSB7XG4gICAgc3VwZXIoc2l6ZSlcbiAgICB0aGlzLmZpbGwoMClcbiAgfVxufVxuXG5jbGFzcyBTdGFjayB7XG4gIGNvbnN0cnVjdG9yKG1heCkge1xuICAgIGlmIChtYXggPT09IDApIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgICBjb25zdCBVaW50QXJyYXkgPSBnZXRVaW50QXJyYXkobWF4KVxuICAgIHRoaXMuaGVhcCA9IG5ldyBVaW50QXJyYXkobWF4KVxuICAgIHRoaXMubGVuZ3RoID0gMFxuICB9XG4gIHB1c2gobikge1xuICAgIHRoaXMuaGVhcFt0aGlzLmxlbmd0aCsrXSA9IG5cbiAgfVxuICBwb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVhcFstLXRoaXMubGVuZ3RoXVxuICB9XG59XG5cbmNsYXNzIExSVUNhY2hlIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgbWF4ID0gMCxcbiAgICAgIHR0bCxcbiAgICAgIHR0bFJlc29sdXRpb24gPSAxLFxuICAgICAgdHRsQXV0b3B1cmdlLFxuICAgICAgdXBkYXRlQWdlT25HZXQsXG4gICAgICB1cGRhdGVBZ2VPbkhhcyxcbiAgICAgIGFsbG93U3RhbGUsXG4gICAgICBkaXNwb3NlLFxuICAgICAgZGlzcG9zZUFmdGVyLFxuICAgICAgbm9EaXNwb3NlT25TZXQsXG4gICAgICBub1VwZGF0ZVRUTCxcbiAgICAgIG1heFNpemUgPSAwLFxuICAgICAgbWF4RW50cnlTaXplID0gMCxcbiAgICAgIHNpemVDYWxjdWxhdGlvbixcbiAgICAgIGZldGNoTWV0aG9kLFxuICAgICAgZmV0Y2hDb250ZXh0LFxuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgbm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0LFxuICAgICAgaWdub3JlRmV0Y2hBYm9ydCxcbiAgICB9ID0gb3B0aW9uc1xuXG4gICAgLy8gZGVwcmVjYXRlZCBvcHRpb25zLCBkb24ndCB0cmlnZ2VyIGEgd2FybmluZyBmb3IgZ2V0dGluZyB0aGVtIGlmXG4gICAgLy8gdGhlIHRoaW5nIGJlaW5nIHBhc3NlZCBpbiBpcyBhbm90aGVyIExSVUNhY2hlIHdlJ3JlIGNvcHlpbmcuXG4gICAgY29uc3QgeyBsZW5ndGgsIG1heEFnZSwgc3RhbGUgfSA9XG4gICAgICBvcHRpb25zIGluc3RhbmNlb2YgTFJVQ2FjaGUgPyB7fSA6IG9wdGlvbnNcblxuICAgIGlmIChtYXggIT09IDAgJiYgIWlzUG9zSW50KG1heCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heCBvcHRpb24gbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXInKVxuICAgIH1cblxuICAgIGNvbnN0IFVpbnRBcnJheSA9IG1heCA/IGdldFVpbnRBcnJheShtYXgpIDogQXJyYXlcbiAgICBpZiAoIVVpbnRBcnJheSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heCB2YWx1ZTogJyArIG1heClcbiAgICB9XG5cbiAgICB0aGlzLm1heCA9IG1heFxuICAgIHRoaXMubWF4U2l6ZSA9IG1heFNpemVcbiAgICB0aGlzLm1heEVudHJ5U2l6ZSA9IG1heEVudHJ5U2l6ZSB8fCB0aGlzLm1heFNpemVcbiAgICB0aGlzLnNpemVDYWxjdWxhdGlvbiA9IHNpemVDYWxjdWxhdGlvbiB8fCBsZW5ndGhcbiAgICBpZiAodGhpcy5zaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgIGlmICghdGhpcy5tYXhTaXplICYmICF0aGlzLm1heEVudHJ5U2l6ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdjYW5ub3Qgc2V0IHNpemVDYWxjdWxhdGlvbiB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUnXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5zaXplQ2FsY3VsYXRpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZUNhbGN1bGF0aW9uIHNldCB0byBub24tZnVuY3Rpb24nKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZmV0Y2hNZXRob2QgPSBmZXRjaE1ldGhvZCB8fCBudWxsXG4gICAgaWYgKHRoaXMuZmV0Y2hNZXRob2QgJiYgdHlwZW9mIHRoaXMuZmV0Y2hNZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdmZXRjaE1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgc3BlY2lmaWVkJ1xuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuZmV0Y2hDb250ZXh0ID0gZmV0Y2hDb250ZXh0XG4gICAgaWYgKCF0aGlzLmZldGNoTWV0aG9kICYmIGZldGNoQ29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnY2Fubm90IHNldCBmZXRjaENvbnRleHQgd2l0aG91dCBmZXRjaE1ldGhvZCdcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLmtleU1hcCA9IG5ldyBNYXAoKVxuICAgIHRoaXMua2V5TGlzdCA9IG5ldyBBcnJheShtYXgpLmZpbGwobnVsbClcbiAgICB0aGlzLnZhbExpc3QgPSBuZXcgQXJyYXkobWF4KS5maWxsKG51bGwpXG4gICAgdGhpcy5uZXh0ID0gbmV3IFVpbnRBcnJheShtYXgpXG4gICAgdGhpcy5wcmV2ID0gbmV3IFVpbnRBcnJheShtYXgpXG4gICAgdGhpcy5oZWFkID0gMFxuICAgIHRoaXMudGFpbCA9IDBcbiAgICB0aGlzLmZyZWUgPSBuZXcgU3RhY2sobWF4KVxuICAgIHRoaXMuaW5pdGlhbEZpbGwgPSAxXG4gICAgdGhpcy5zaXplID0gMFxuXG4gICAgaWYgKHR5cGVvZiBkaXNwb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmRpc3Bvc2UgPSBkaXNwb3NlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZUFmdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmRpc3Bvc2VBZnRlciA9IGRpc3Bvc2VBZnRlclxuICAgICAgdGhpcy5kaXNwb3NlZCA9IFtdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcG9zZUFmdGVyID0gbnVsbFxuICAgICAgdGhpcy5kaXNwb3NlZCA9IG51bGxcbiAgICB9XG4gICAgdGhpcy5ub0Rpc3Bvc2VPblNldCA9ICEhbm9EaXNwb3NlT25TZXRcbiAgICB0aGlzLm5vVXBkYXRlVFRMID0gISFub1VwZGF0ZVRUTFxuICAgIHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gISFub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb25cbiAgICB0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uID0gISFhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvblxuICAgIHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCA9ICEhYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydFxuICAgIHRoaXMuaWdub3JlRmV0Y2hBYm9ydCA9ICEhaWdub3JlRmV0Y2hBYm9ydFxuXG4gICAgLy8gTkI6IG1heEVudHJ5U2l6ZSBpcyBzZXQgdG8gbWF4U2l6ZSBpZiBpdCdzIHNldFxuICAgIGlmICh0aGlzLm1heEVudHJ5U2l6ZSAhPT0gMCkge1xuICAgICAgaWYgKHRoaXMubWF4U2l6ZSAhPT0gMCkge1xuICAgICAgICBpZiAoIWlzUG9zSW50KHRoaXMubWF4U2l6ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ21heFNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkJ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLm1heEVudHJ5U2l6ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAnbWF4RW50cnlTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCdcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgdGhpcy5pbml0aWFsaXplU2l6ZVRyYWNraW5nKClcbiAgICB9XG5cbiAgICB0aGlzLmFsbG93U3RhbGUgPSAhIWFsbG93U3RhbGUgfHwgISFzdGFsZVxuICAgIHRoaXMubm9EZWxldGVPblN0YWxlR2V0ID0gISFub0RlbGV0ZU9uU3RhbGVHZXRcbiAgICB0aGlzLnVwZGF0ZUFnZU9uR2V0ID0gISF1cGRhdGVBZ2VPbkdldFxuICAgIHRoaXMudXBkYXRlQWdlT25IYXMgPSAhIXVwZGF0ZUFnZU9uSGFzXG4gICAgdGhpcy50dGxSZXNvbHV0aW9uID1cbiAgICAgIGlzUG9zSW50KHR0bFJlc29sdXRpb24pIHx8IHR0bFJlc29sdXRpb24gPT09IDBcbiAgICAgICAgPyB0dGxSZXNvbHV0aW9uXG4gICAgICAgIDogMVxuICAgIHRoaXMudHRsQXV0b3B1cmdlID0gISF0dGxBdXRvcHVyZ2VcbiAgICB0aGlzLnR0bCA9IHR0bCB8fCBtYXhBZ2UgfHwgMFxuICAgIGlmICh0aGlzLnR0bCkge1xuICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLnR0bCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAndHRsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCdcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgdGhpcy5pbml0aWFsaXplVFRMVHJhY2tpbmcoKVxuICAgIH1cblxuICAgIC8vIGRvIG5vdCBhbGxvdyBjb21wbGV0ZWx5IHVuYm91bmRlZCBjYWNoZXNcbiAgICBpZiAodGhpcy5tYXggPT09IDAgJiYgdGhpcy50dGwgPT09IDAgJiYgdGhpcy5tYXhTaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQXQgbGVhc3Qgb25lIG9mIG1heCwgbWF4U2l6ZSwgb3IgdHRsIGlzIHJlcXVpcmVkJ1xuICAgICAgKVxuICAgIH1cbiAgICBpZiAoIXRoaXMudHRsQXV0b3B1cmdlICYmICF0aGlzLm1heCAmJiAhdGhpcy5tYXhTaXplKSB7XG4gICAgICBjb25zdCBjb2RlID0gJ0xSVV9DQUNIRV9VTkJPVU5ERUQnXG4gICAgICBpZiAoc2hvdWxkV2Fybihjb2RlKSkge1xuICAgICAgICB3YXJuZWQuYWRkKGNvZGUpXG4gICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgJ1RUTCBjYWNoaW5nIHdpdGhvdXQgdHRsQXV0b3B1cmdlLCBtYXgsIG9yIG1heFNpemUgY2FuICcgK1xuICAgICAgICAgICdyZXN1bHQgaW4gdW5ib3VuZGVkIG1lbW9yeSBjb25zdW1wdGlvbi4nXG4gICAgICAgIGVtaXRXYXJuaW5nKG1zZywgJ1VuYm91bmRlZENhY2hlV2FybmluZycsIGNvZGUsIExSVUNhY2hlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGFsZSkge1xuICAgICAgZGVwcmVjYXRlZE9wdGlvbignc3RhbGUnLCAnYWxsb3dTdGFsZScpXG4gICAgfVxuICAgIGlmIChtYXhBZ2UpIHtcbiAgICAgIGRlcHJlY2F0ZWRPcHRpb24oJ21heEFnZScsICd0dGwnKVxuICAgIH1cbiAgICBpZiAobGVuZ3RoKSB7XG4gICAgICBkZXByZWNhdGVkT3B0aW9uKCdsZW5ndGgnLCAnc2l6ZUNhbGN1bGF0aW9uJylcbiAgICB9XG4gIH1cblxuICBnZXRSZW1haW5pbmdUVEwoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzKGtleSwgeyB1cGRhdGVBZ2VPbkhhczogZmFsc2UgfSkgPyBJbmZpbml0eSA6IDBcbiAgfVxuXG4gIGluaXRpYWxpemVUVExUcmFja2luZygpIHtcbiAgICB0aGlzLnR0bHMgPSBuZXcgWmVyb0FycmF5KHRoaXMubWF4KVxuICAgIHRoaXMuc3RhcnRzID0gbmV3IFplcm9BcnJheSh0aGlzLm1heClcblxuICAgIHRoaXMuc2V0SXRlbVRUTCA9IChpbmRleCwgdHRsLCBzdGFydCA9IHBlcmYubm93KCkpID0+IHtcbiAgICAgIHRoaXMuc3RhcnRzW2luZGV4XSA9IHR0bCAhPT0gMCA/IHN0YXJ0IDogMFxuICAgICAgdGhpcy50dGxzW2luZGV4XSA9IHR0bFxuICAgICAgaWYgKHR0bCAhPT0gMCAmJiB0aGlzLnR0bEF1dG9wdXJnZSkge1xuICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNTdGFsZShpbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlKHRoaXMua2V5TGlzdFtpbmRleF0pXG4gICAgICAgICAgfVxuICAgICAgICB9LCB0dGwgKyAxKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAtIHVucmVmKCkgbm90IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zICovXG4gICAgICAgIGlmICh0LnVucmVmKSB7XG4gICAgICAgICAgdC51bnJlZigpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUl0ZW1BZ2UgPSBpbmRleCA9PiB7XG4gICAgICB0aGlzLnN0YXJ0c1tpbmRleF0gPSB0aGlzLnR0bHNbaW5kZXhdICE9PSAwID8gcGVyZi5ub3coKSA6IDBcbiAgICB9XG5cbiAgICB0aGlzLnN0YXR1c1RUTCA9IChzdGF0dXMsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy50dGwgPSB0aGlzLnR0bHNbaW5kZXhdXG4gICAgICAgIHN0YXR1cy5zdGFydCA9IHRoaXMuc3RhcnRzW2luZGV4XVxuICAgICAgICBzdGF0dXMubm93ID0gY2FjaGVkTm93IHx8IGdldE5vdygpXG4gICAgICAgIHN0YXR1cy5yZW1haW5pbmdUVEwgPSBzdGF0dXMubm93ICsgc3RhdHVzLnR0bCAtIHN0YXR1cy5zdGFydFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRlYm91bmNlIGNhbGxzIHRvIHBlcmYubm93KCkgdG8gMXMgc28gd2UncmUgbm90IGhpdHRpbmdcbiAgICAvLyB0aGF0IGNvc3RseSBjYWxsIHJlcGVhdGVkbHkuXG4gICAgbGV0IGNhY2hlZE5vdyA9IDBcbiAgICBjb25zdCBnZXROb3cgPSAoKSA9PiB7XG4gICAgICBjb25zdCBuID0gcGVyZi5ub3coKVxuICAgICAgaWYgKHRoaXMudHRsUmVzb2x1dGlvbiA+IDApIHtcbiAgICAgICAgY2FjaGVkTm93ID0gblxuICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dChcbiAgICAgICAgICAoKSA9PiAoY2FjaGVkTm93ID0gMCksXG4gICAgICAgICAgdGhpcy50dGxSZXNvbHV0aW9uXG4gICAgICAgIClcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgLSBub3QgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgKi9cbiAgICAgICAgaWYgKHQudW5yZWYpIHtcbiAgICAgICAgICB0LnVucmVmKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5cbiAgICB9XG5cbiAgICB0aGlzLmdldFJlbWFpbmluZ1RUTCA9IGtleSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMua2V5TWFwLmdldChrZXkpXG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudHRsc1tpbmRleF0gPT09IDAgfHwgdGhpcy5zdGFydHNbaW5kZXhdID09PSAwXG4gICAgICAgID8gSW5maW5pdHlcbiAgICAgICAgOiB0aGlzLnN0YXJ0c1tpbmRleF0gK1xuICAgICAgICAgICAgdGhpcy50dGxzW2luZGV4XSAtXG4gICAgICAgICAgICAoY2FjaGVkTm93IHx8IGdldE5vdygpKVxuICAgIH1cblxuICAgIHRoaXMuaXNTdGFsZSA9IGluZGV4ID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMudHRsc1tpbmRleF0gIT09IDAgJiZcbiAgICAgICAgdGhpcy5zdGFydHNbaW5kZXhdICE9PSAwICYmXG4gICAgICAgIChjYWNoZWROb3cgfHwgZ2V0Tm93KCkpIC0gdGhpcy5zdGFydHNbaW5kZXhdID5cbiAgICAgICAgICB0aGlzLnR0bHNbaW5kZXhdXG4gICAgICApXG4gICAgfVxuICB9XG4gIHVwZGF0ZUl0ZW1BZ2UoX2luZGV4KSB7fVxuICBzdGF0dXNUVEwoX3N0YXR1cywgX2luZGV4KSB7fVxuICBzZXRJdGVtVFRMKF9pbmRleCwgX3R0bCwgX3N0YXJ0KSB7fVxuICBpc1N0YWxlKF9pbmRleCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaW5pdGlhbGl6ZVNpemVUcmFja2luZygpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZWRTaXplID0gMFxuICAgIHRoaXMuc2l6ZXMgPSBuZXcgWmVyb0FycmF5KHRoaXMubWF4KVxuICAgIHRoaXMucmVtb3ZlSXRlbVNpemUgPSBpbmRleCA9PiB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZWRTaXplIC09IHRoaXMuc2l6ZXNbaW5kZXhdXG4gICAgICB0aGlzLnNpemVzW2luZGV4XSA9IDBcbiAgICB9XG4gICAgdGhpcy5yZXF1aXJlU2l6ZSA9IChrLCB2LCBzaXplLCBzaXplQ2FsY3VsYXRpb24pID0+IHtcbiAgICAgIC8vIHByb3Zpc2lvbmFsbHkgYWNjZXB0IGJhY2tncm91bmQgZmV0Y2hlcy5cbiAgICAgIC8vIGFjdHVhbCB2YWx1ZSBzaXplIHdpbGwgYmUgY2hlY2tlZCB3aGVuIHRoZXkgcmV0dXJuLlxuICAgICAgaWYgKHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cbiAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgaWYgKHNpemVDYWxjdWxhdGlvbikge1xuICAgICAgICAgIGlmICh0eXBlb2Ygc2l6ZUNhbGN1bGF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplQ2FsY3VsYXRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uJylcbiAgICAgICAgICB9XG4gICAgICAgICAgc2l6ZSA9IHNpemVDYWxjdWxhdGlvbih2LCBrKVxuICAgICAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICdzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKSdcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdpbnZhbGlkIHNpemUgdmFsdWUgKG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcikuICcgK1xuICAgICAgICAgICAgICAnV2hlbiBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZSBpcyB1c2VkLCBzaXplQ2FsY3VsYXRpb24gb3Igc2l6ZSAnICtcbiAgICAgICAgICAgICAgJ211c3QgYmUgc2V0LidcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzaXplXG4gICAgfVxuICAgIHRoaXMuYWRkSXRlbVNpemUgPSAoaW5kZXgsIHNpemUsIHN0YXR1cykgPT4ge1xuICAgICAgdGhpcy5zaXplc1tpbmRleF0gPSBzaXplXG4gICAgICBpZiAodGhpcy5tYXhTaXplKSB7XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemVzW2luZGV4XVxuICAgICAgICB3aGlsZSAodGhpcy5jYWxjdWxhdGVkU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgICB0aGlzLmV2aWN0KHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsY3VsYXRlZFNpemUgKz0gdGhpcy5zaXplc1tpbmRleF1cbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLmVudHJ5U2l6ZSA9IHNpemVcbiAgICAgICAgc3RhdHVzLnRvdGFsQ2FsY3VsYXRlZFNpemUgPSB0aGlzLmNhbGN1bGF0ZWRTaXplXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlbW92ZUl0ZW1TaXplKF9pbmRleCkge31cbiAgYWRkSXRlbVNpemUoX2luZGV4LCBfc2l6ZSkge31cbiAgcmVxdWlyZVNpemUoX2ssIF92LCBzaXplLCBzaXplQ2FsY3VsYXRpb24pIHtcbiAgICBpZiAoc2l6ZSB8fCBzaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdjYW5ub3Qgc2V0IHNpemUgd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplIG9uIGNhY2hlJ1xuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gICppbmRleGVzKHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5zaXplKSB7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy50YWlsOyB0cnVlOyApIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRJbmRleChpKSkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbG93U3RhbGUgfHwgIXRoaXMuaXNTdGFsZShpKSkge1xuICAgICAgICAgIHlpZWxkIGlcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gdGhpcy5oZWFkKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gdGhpcy5wcmV2W2ldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAqcmluZGV4ZXMoeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLnNpemUpIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLmhlYWQ7IHRydWU7ICkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZEluZGV4KGkpKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxsb3dTdGFsZSB8fCAhdGhpcy5pc1N0YWxlKGkpKSB7XG4gICAgICAgICAgeWllbGQgaVxuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSB0aGlzLnRhaWwpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkgPSB0aGlzLm5leHRbaV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzVmFsaWRJbmRleChpbmRleCkge1xuICAgIHJldHVybiAoXG4gICAgICBpbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLmtleU1hcC5nZXQodGhpcy5rZXlMaXN0W2luZGV4XSkgPT09IGluZGV4XG4gICAgKVxuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRoaXMua2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCBbdGhpcy5rZXlMaXN0W2ldLCB0aGlzLnZhbExpc3RbaV1dXG4gICAgICB9XG4gICAgfVxuICB9XG4gICpyZW50cmllcygpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5yaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRoaXMua2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCBbdGhpcy5rZXlMaXN0W2ldLCB0aGlzLnZhbExpc3RbaV1dXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgKmtleXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMua2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCB0aGlzLmtleUxpc3RbaV1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgKnJrZXlzKCkge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnJpbmRleGVzKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5rZXlMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIXRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy52YWxMaXN0W2ldKVxuICAgICAgKSB7XG4gICAgICAgIHlpZWxkIHRoaXMua2V5TGlzdFtpXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICp2YWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCB0aGlzLnZhbExpc3RbaV1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgKnJ2YWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMucmluZGV4ZXMoKSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnZhbExpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAhdGhpcy5pc0JhY2tncm91bmRGZXRjaCh0aGlzLnZhbExpc3RbaV0pXG4gICAgICApIHtcbiAgICAgICAgeWllbGQgdGhpcy52YWxMaXN0W2ldXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcygpXG4gIH1cblxuICBmaW5kKGZuLCBnZXRPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2ldXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godilcbiAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgIDogdlxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICBpZiAoZm4odmFsdWUsIHRoaXMua2V5TGlzdFtpXSwgdGhpcykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMua2V5TGlzdFtpXSwgZ2V0T3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3JFYWNoKGZuLCB0aGlzcCA9IHRoaXMpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5pbmRleGVzKCkpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbExpc3RbaV1cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgOiB2XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGZuLmNhbGwodGhpc3AsIHZhbHVlLCB0aGlzLmtleUxpc3RbaV0sIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgcmZvckVhY2goZm4sIHRoaXNwID0gdGhpcykge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnJpbmRleGVzKCkpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbExpc3RbaV1cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgOiB2XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGZuLmNhbGwodGhpc3AsIHZhbHVlLCB0aGlzLmtleUxpc3RbaV0sIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgZ2V0IHBydW5lKCkge1xuICAgIGRlcHJlY2F0ZWRNZXRob2QoJ3BydW5lJywgJ3B1cmdlU3RhbGUnKVxuICAgIHJldHVybiB0aGlzLnB1cmdlU3RhbGVcbiAgfVxuXG4gIHB1cmdlU3RhbGUoKSB7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZVxuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnJpbmRleGVzKHsgYWxsb3dTdGFsZTogdHJ1ZSB9KSkge1xuICAgICAgaWYgKHRoaXMuaXNTdGFsZShpKSkge1xuICAgICAgICB0aGlzLmRlbGV0ZSh0aGlzLmtleUxpc3RbaV0pXG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkXG4gIH1cblxuICBkdW1wKCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMua2V5TGlzdFtpXVxuICAgICAgY29uc3QgdiA9IHRoaXMudmFsTGlzdFtpXVxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICA6IHZcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgY29uc3QgZW50cnkgPSB7IHZhbHVlIH1cbiAgICAgIGlmICh0aGlzLnR0bHMpIHtcbiAgICAgICAgZW50cnkudHRsID0gdGhpcy50dGxzW2ldXG4gICAgICAgIC8vIGFsd2F5cyBkdW1wIHRoZSBzdGFydCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlIHRpbWVzdGFtcFxuICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgY29uc3QgYWdlID0gcGVyZi5ub3coKSAtIHRoaXMuc3RhcnRzW2ldXG4gICAgICAgIGVudHJ5LnN0YXJ0ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC0gYWdlKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2l6ZXMpIHtcbiAgICAgICAgZW50cnkuc2l6ZSA9IHRoaXMuc2l6ZXNbaV1cbiAgICAgIH1cbiAgICAgIGFyci51bnNoaWZ0KFtrZXksIGVudHJ5XSlcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgbG9hZChhcnIpIHtcbiAgICB0aGlzLmNsZWFyKClcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBhcnIpIHtcbiAgICAgIGlmIChlbnRyeS5zdGFydCkge1xuICAgICAgICAvLyBlbnRyeS5zdGFydCBpcyBhIHBvcnRhYmxlIHRpbWVzdGFtcCwgYnV0IHdlIG1heSBiZSB1c2luZ1xuICAgICAgICAvLyBub2RlJ3MgcGVyZm9ybWFuY2Uubm93KCksIHNvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0LlxuICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIGVudHJ5LnN0YXJ0XG4gICAgICAgIGVudHJ5LnN0YXJ0ID0gcGVyZi5ub3coKSAtIGFnZVxuICAgICAgfVxuICAgICAgdGhpcy5zZXQoa2V5LCBlbnRyeS52YWx1ZSwgZW50cnkpXG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZShfdiwgX2ssIF9yZWFzb24pIHt9XG5cbiAgc2V0KFxuICAgIGssXG4gICAgdixcbiAgICB7XG4gICAgICB0dGwgPSB0aGlzLnR0bCxcbiAgICAgIHN0YXJ0LFxuICAgICAgbm9EaXNwb3NlT25TZXQgPSB0aGlzLm5vRGlzcG9zZU9uU2V0LFxuICAgICAgc2l6ZSA9IDAsXG4gICAgICBzaXplQ2FsY3VsYXRpb24gPSB0aGlzLnNpemVDYWxjdWxhdGlvbixcbiAgICAgIG5vVXBkYXRlVFRMID0gdGhpcy5ub1VwZGF0ZVRUTCxcbiAgICAgIHN0YXR1cyxcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgc2l6ZSA9IHRoaXMucmVxdWlyZVNpemUoaywgdiwgc2l6ZSwgc2l6ZUNhbGN1bGF0aW9uKVxuICAgIC8vIGlmIHRoZSBpdGVtIGRvZXNuJ3QgZml0LCBkb24ndCBkbyBhbnl0aGluZ1xuICAgIC8vIE5COiBtYXhFbnRyeVNpemUgc2V0IHRvIG1heFNpemUgYnkgZGVmYXVsdFxuICAgIGlmICh0aGlzLm1heEVudHJ5U2l6ZSAmJiBzaXplID4gdGhpcy5tYXhFbnRyeVNpemUpIHtcbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLnNldCA9ICdtaXNzJ1xuICAgICAgICBzdGF0dXMubWF4RW50cnlTaXplRXhjZWVkZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICAvLyBoYXZlIHRvIGRlbGV0ZSwgaW4gY2FzZSBhIGJhY2tncm91bmQgZmV0Y2ggaXMgdGhlcmUgYWxyZWFkeS5cbiAgICAgIC8vIGluIG5vbi1hc3luYyBjYXNlcywgdGhpcyBpcyBhIG5vLW9wXG4gICAgICB0aGlzLmRlbGV0ZShrKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gICAgbGV0IGluZGV4ID0gdGhpcy5zaXplID09PSAwID8gdW5kZWZpbmVkIDogdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGFkZGl0aW9uXG4gICAgICBpbmRleCA9IHRoaXMubmV3SW5kZXgoKVxuICAgICAgdGhpcy5rZXlMaXN0W2luZGV4XSA9IGtcbiAgICAgIHRoaXMudmFsTGlzdFtpbmRleF0gPSB2XG4gICAgICB0aGlzLmtleU1hcC5zZXQoaywgaW5kZXgpXG4gICAgICB0aGlzLm5leHRbdGhpcy50YWlsXSA9IGluZGV4XG4gICAgICB0aGlzLnByZXZbaW5kZXhdID0gdGhpcy50YWlsXG4gICAgICB0aGlzLnRhaWwgPSBpbmRleFxuICAgICAgdGhpcy5zaXplKytcbiAgICAgIHRoaXMuYWRkSXRlbVNpemUoaW5kZXgsIHNpemUsIHN0YXR1cylcbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLnNldCA9ICdhZGQnXG4gICAgICB9XG4gICAgICBub1VwZGF0ZVRUTCA9IGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVwZGF0ZVxuICAgICAgdGhpcy5tb3ZlVG9UYWlsKGluZGV4KVxuICAgICAgY29uc3Qgb2xkVmFsID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgaWYgKHYgIT09IG9sZFZhbCkge1xuICAgICAgICBpZiAodGhpcy5pc0JhY2tncm91bmRGZXRjaChvbGRWYWwpKSB7XG4gICAgICAgICAgb2xkVmFsLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigncmVwbGFjZWQnKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW5vRGlzcG9zZU9uU2V0KSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2Uob2xkVmFsLCBrLCAnc2V0JylcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2VkLnB1c2goW29sZFZhbCwgaywgJ3NldCddKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUl0ZW1TaXplKGluZGV4KVxuICAgICAgICB0aGlzLnZhbExpc3RbaW5kZXhdID0gdlxuICAgICAgICB0aGlzLmFkZEl0ZW1TaXplKGluZGV4LCBzaXplLCBzdGF0dXMpXG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICBzdGF0dXMuc2V0ID0gJ3JlcGxhY2UnXG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPVxuICAgICAgICAgICAgb2xkVmFsICYmIHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2gob2xkVmFsKVxuICAgICAgICAgICAgICA/IG9sZFZhbC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICA6IG9sZFZhbFxuICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkKSBzdGF0dXMub2xkVmFsdWUgPSBvbGRWYWx1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMuc2V0ID0gJ3VwZGF0ZSdcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR0bCAhPT0gMCAmJiB0aGlzLnR0bCA9PT0gMCAmJiAhdGhpcy50dGxzKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVUVExUcmFja2luZygpXG4gICAgfVxuICAgIGlmICghbm9VcGRhdGVUVEwpIHtcbiAgICAgIHRoaXMuc2V0SXRlbVRUTChpbmRleCwgdHRsLCBzdGFydClcbiAgICB9XG4gICAgdGhpcy5zdGF0dXNUVEwoc3RhdHVzLCBpbmRleClcbiAgICBpZiAodGhpcy5kaXNwb3NlQWZ0ZXIpIHtcbiAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2VkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VBZnRlciguLi50aGlzLmRpc3Bvc2VkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBuZXdJbmRleCgpIHtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWlsXG4gICAgfVxuICAgIGlmICh0aGlzLnNpemUgPT09IHRoaXMubWF4ICYmIHRoaXMubWF4ICE9PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5ldmljdChmYWxzZSlcbiAgICB9XG4gICAgaWYgKHRoaXMuZnJlZS5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmZyZWUucG9wKClcbiAgICB9XG4gICAgLy8gaW5pdGlhbCBmaWxsLCBqdXN0IGtlZXAgd3JpdGluZyBkb3duIHRoZSBsaXN0XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbEZpbGwrK1xuICB9XG5cbiAgcG9wKCkge1xuICAgIGlmICh0aGlzLnNpemUpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMudmFsTGlzdFt0aGlzLmhlYWRdXG4gICAgICB0aGlzLmV2aWN0KHRydWUpXG4gICAgICByZXR1cm4gdmFsXG4gICAgfVxuICB9XG5cbiAgZXZpY3QoZnJlZSkge1xuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmhlYWRcbiAgICBjb25zdCBrID0gdGhpcy5rZXlMaXN0W2hlYWRdXG4gICAgY29uc3QgdiA9IHRoaXMudmFsTGlzdFtoZWFkXVxuICAgIGlmICh0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZXZpY3RlZCcpKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3Bvc2UodiwgaywgJ2V2aWN0JylcbiAgICAgIGlmICh0aGlzLmRpc3Bvc2VBZnRlcikge1xuICAgICAgICB0aGlzLmRpc3Bvc2VkLnB1c2goW3YsIGssICdldmljdCddKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlbW92ZUl0ZW1TaXplKGhlYWQpXG4gICAgLy8gaWYgd2UgYXJlbid0IGFib3V0IHRvIHVzZSB0aGUgaW5kZXgsIHRoZW4gbnVsbCB0aGVzZSBvdXRcbiAgICBpZiAoZnJlZSkge1xuICAgICAgdGhpcy5rZXlMaXN0W2hlYWRdID0gbnVsbFxuICAgICAgdGhpcy52YWxMaXN0W2hlYWRdID0gbnVsbFxuICAgICAgdGhpcy5mcmVlLnB1c2goaGVhZClcbiAgICB9XG4gICAgdGhpcy5oZWFkID0gdGhpcy5uZXh0W2hlYWRdXG4gICAgdGhpcy5rZXlNYXAuZGVsZXRlKGspXG4gICAgdGhpcy5zaXplLS1cbiAgICByZXR1cm4gaGVhZFxuICB9XG5cbiAgaGFzKGssIHsgdXBkYXRlQWdlT25IYXMgPSB0aGlzLnVwZGF0ZUFnZU9uSGFzLCBzdGF0dXMgfSA9IHt9KSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmtleU1hcC5nZXQoaylcbiAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RhbGUoaW5kZXgpKSB7XG4gICAgICAgIGlmICh1cGRhdGVBZ2VPbkhhcykge1xuICAgICAgICAgIHRoaXMudXBkYXRlSXRlbUFnZShpbmRleClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuaGFzID0gJ2hpdCdcbiAgICAgICAgdGhpcy5zdGF0dXNUVEwoc3RhdHVzLCBpbmRleClcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy5oYXMgPSAnc3RhbGUnXG4gICAgICAgIHRoaXMuc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgIHN0YXR1cy5oYXMgPSAnbWlzcydcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBsaWtlIGdldCgpLCBidXQgd2l0aG91dCBhbnkgTFJVIHVwZGF0aW5nIG9yIFRUTCBleHBpcmF0aW9uXG4gIHBlZWsoaywgeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgKGFsbG93U3RhbGUgfHwgIXRoaXMuaXNTdGFsZShpbmRleCkpKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgLy8gZWl0aGVyIHN0YWxlIGFuZCBhbGxvd2VkLCBvciBmb3JjaW5nIGEgcmVmcmVzaCBvZiBub24tc3RhbGUgdmFsdWVcbiAgICAgIHJldHVybiB0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHZcbiAgICB9XG4gIH1cblxuICBiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpIHtcbiAgICBjb25zdCB2ID0gaW5kZXggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMudmFsTGlzdFtpbmRleF1cbiAgICBpZiAodGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgcmV0dXJuIHZcbiAgICB9XG4gICAgY29uc3QgYWMgPSBuZXcgQUMoKVxuICAgIGlmIChvcHRpb25zLnNpZ25hbCkge1xuICAgICAgb3B0aW9ucy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PlxuICAgICAgICBhYy5hYm9ydChvcHRpb25zLnNpZ25hbC5yZWFzb24pXG4gICAgICApXG4gICAgfVxuICAgIGNvbnN0IGZldGNoT3B0cyA9IHtcbiAgICAgIHNpZ25hbDogYWMuc2lnbmFsLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGNvbnRleHQsXG4gICAgfVxuICAgIGNvbnN0IGNiID0gKHYsIHVwZGF0ZUNhY2hlID0gZmFsc2UpID0+IHtcbiAgICAgIGNvbnN0IHsgYWJvcnRlZCB9ID0gYWMuc2lnbmFsXG4gICAgICBjb25zdCBpZ25vcmVBYm9ydCA9IG9wdGlvbnMuaWdub3JlRmV0Y2hBYm9ydCAmJiB2ICE9PSB1bmRlZmluZWRcbiAgICAgIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgICAgICBpZiAoYWJvcnRlZCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEFib3J0ZWQgPSB0cnVlXG4gICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hFcnJvciA9IGFjLnNpZ25hbC5yZWFzb25cbiAgICAgICAgICBpZiAoaWdub3JlQWJvcnQpIG9wdGlvbnMuc3RhdHVzLmZldGNoQWJvcnRJZ25vcmVkID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoUmVzb2x2ZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhYm9ydGVkICYmICFpZ25vcmVBYm9ydCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgcmV0dXJuIGZldGNoRmFpbChhYy5zaWduYWwucmVhc29uKVxuICAgICAgfVxuICAgICAgLy8gZWl0aGVyIHdlIGRpZG4ndCBhYm9ydCwgYW5kIGFyZSBzdGlsbCBoZXJlLCBvciB3ZSBkaWQsIGFuZCBpZ25vcmVkXG4gICAgICBpZiAodGhpcy52YWxMaXN0W2luZGV4XSA9PT0gcCkge1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHAuX19zdGFsZVdoaWxlRmV0Y2hpbmcpIHtcbiAgICAgICAgICAgIHRoaXMudmFsTGlzdFtpbmRleF0gPSBwLl9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlKGspXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChvcHRpb25zLnN0YXR1cykgb3B0aW9ucy5zdGF0dXMuZmV0Y2hVcGRhdGVkID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuc2V0KGssIHYsIGZldGNoT3B0cy5vcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdlxuICAgIH1cbiAgICBjb25zdCBlYiA9IGVyID0+IHtcbiAgICAgIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaFJlamVjdGVkID0gdHJ1ZVxuICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEVycm9yID0gZXJcbiAgICAgIH1cbiAgICAgIHJldHVybiBmZXRjaEZhaWwoZXIpXG4gICAgfVxuICAgIGNvbnN0IGZldGNoRmFpbCA9IGVyID0+IHtcbiAgICAgIGNvbnN0IHsgYWJvcnRlZCB9ID0gYWMuc2lnbmFsXG4gICAgICBjb25zdCBhbGxvd1N0YWxlQWJvcnRlZCA9XG4gICAgICAgIGFib3J0ZWQgJiYgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0XG4gICAgICBjb25zdCBhbGxvd1N0YWxlID1cbiAgICAgICAgYWxsb3dTdGFsZUFib3J0ZWQgfHwgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvblxuICAgICAgY29uc3Qgbm9EZWxldGUgPSBhbGxvd1N0YWxlIHx8IG9wdGlvbnMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uXG4gICAgICBpZiAodGhpcy52YWxMaXN0W2luZGV4XSA9PT0gcCkge1xuICAgICAgICAvLyBpZiB3ZSBhbGxvdyBzdGFsZSBvbiBmZXRjaCByZWplY3Rpb25zLCB0aGVuIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXRcbiAgICAgICAgLy8gdGhlIHN0YWxlIHZhbHVlIGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGNhY2hlIHdoZW4gdGhlIGZldGNoIGZhaWxzLlxuICAgICAgICBjb25zdCBkZWwgPSAhbm9EZWxldGUgfHwgcC5fX3N0YWxlV2hpbGVGZXRjaGluZyA9PT0gdW5kZWZpbmVkXG4gICAgICAgIGlmIChkZWwpIHtcbiAgICAgICAgICB0aGlzLmRlbGV0ZShrKVxuICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd1N0YWxlQWJvcnRlZCkge1xuICAgICAgICAgIC8vIHN0aWxsIHJlcGxhY2UgdGhlICpwcm9taXNlKiB3aXRoIHRoZSBzdGFsZSB2YWx1ZSxcbiAgICAgICAgICAvLyBzaW5jZSB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBwcm9taXNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgLy8gbGVhdmUgaXQgdW50b3VjaGVkIGlmIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIGFuXG4gICAgICAgICAgLy8gYWJvcnRlZCBiYWNrZ3JvdW5kIGZldGNoIHRoYXQgaGFzbid0IHlldCByZXR1cm5lZC5cbiAgICAgICAgICB0aGlzLnZhbExpc3RbaW5kZXhdID0gcC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYWxsb3dTdGFsZSkge1xuICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMgJiYgcC5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3B0aW9ucy5zdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgfSBlbHNlIGlmIChwLl9fcmV0dXJuZWQgPT09IHApIHtcbiAgICAgICAgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGNhbGwgPSAocmVzLCByZWopID0+IHtcbiAgICAgIHRoaXMuZmV0Y2hNZXRob2QoaywgdiwgZmV0Y2hPcHRzKS50aGVuKHYgPT4gcmVzKHYpLCByZWopXG4gICAgICAvLyBpZ25vcmVkLCB3ZSBnbyB1bnRpbCB3ZSBmaW5pc2gsIHJlZ2FyZGxlc3MuXG4gICAgICAvLyBkZWZlciBjaGVjayB1bnRpbCB3ZSBhcmUgYWN0dWFsbHkgYWJvcnRpbmcsXG4gICAgICAvLyBzbyBmZXRjaE1ldGhvZCBjYW4gb3ZlcnJpZGUuXG4gICAgICBhYy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhb3B0aW9ucy5pZ25vcmVGZXRjaEFib3J0IHx8XG4gICAgICAgICAgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0XG4gICAgICAgICkge1xuICAgICAgICAgIHJlcygpXG4gICAgICAgICAgLy8gd2hlbiBpdCBldmVudHVhbGx5IHJlc29sdmVzLCB1cGRhdGUgdGhlIGNhY2hlLlxuICAgICAgICAgIGlmIChvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnQpIHtcbiAgICAgICAgICAgIHJlcyA9IHYgPT4gY2IodiwgdHJ1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnN0YXR1cykgb3B0aW9ucy5zdGF0dXMuZmV0Y2hEaXNwYXRjaGVkID0gdHJ1ZVxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZShwY2FsbCkudGhlbihjYiwgZWIpXG4gICAgcC5fX2Fib3J0Q29udHJvbGxlciA9IGFjXG4gICAgcC5fX3N0YWxlV2hpbGVGZXRjaGluZyA9IHZcbiAgICBwLl9fcmV0dXJuZWQgPSBudWxsXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGludGVybmFsLCBkb24ndCBleHBvc2Ugc3RhdHVzLlxuICAgICAgdGhpcy5zZXQoaywgcCwgeyAuLi5mZXRjaE9wdHMub3B0aW9ucywgc3RhdHVzOiB1bmRlZmluZWQgfSlcbiAgICAgIGluZGV4ID0gdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsTGlzdFtpbmRleF0gPSBwXG4gICAgfVxuICAgIHJldHVybiBwXG4gIH1cblxuICBpc0JhY2tncm91bmRGZXRjaChwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHAgJiZcbiAgICAgIHR5cGVvZiBwID09PSAnb2JqZWN0JyAmJlxuICAgICAgdHlwZW9mIHAudGhlbiA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICBwLFxuICAgICAgICAnX19zdGFsZVdoaWxlRmV0Y2hpbmcnXG4gICAgICApICYmXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocCwgJ19fcmV0dXJuZWQnKSAmJlxuICAgICAgKHAuX19yZXR1cm5lZCA9PT0gcCB8fCBwLl9fcmV0dXJuZWQgPT09IG51bGwpXG4gICAgKVxuICB9XG5cbiAgLy8gdGhpcyB0YWtlcyB0aGUgdW5pb24gb2YgZ2V0KCkgYW5kIHNldCgpIG9wdHMsIGJlY2F1c2UgaXQgZG9lcyBib3RoXG4gIGFzeW5jIGZldGNoKFxuICAgIGssXG4gICAge1xuICAgICAgLy8gZ2V0IG9wdGlvbnNcbiAgICAgIGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUsXG4gICAgICB1cGRhdGVBZ2VPbkdldCA9IHRoaXMudXBkYXRlQWdlT25HZXQsXG4gICAgICBub0RlbGV0ZU9uU3RhbGVHZXQgPSB0aGlzLm5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgIC8vIHNldCBvcHRpb25zXG4gICAgICB0dGwgPSB0aGlzLnR0bCxcbiAgICAgIG5vRGlzcG9zZU9uU2V0ID0gdGhpcy5ub0Rpc3Bvc2VPblNldCxcbiAgICAgIHNpemUgPSAwLFxuICAgICAgc2l6ZUNhbGN1bGF0aW9uID0gdGhpcy5zaXplQ2FsY3VsYXRpb24sXG4gICAgICBub1VwZGF0ZVRUTCA9IHRoaXMubm9VcGRhdGVUVEwsXG4gICAgICAvLyBmZXRjaCBleGNsdXNpdmUgb3B0aW9uc1xuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gdGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBpZ25vcmVGZXRjaEFib3J0ID0gdGhpcy5pZ25vcmVGZXRjaEFib3J0LFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCxcbiAgICAgIGZldGNoQ29udGV4dCA9IHRoaXMuZmV0Y2hDb250ZXh0LFxuICAgICAgZm9yY2VSZWZyZXNoID0gZmFsc2UsXG4gICAgICBzdGF0dXMsXG4gICAgICBzaWduYWwsXG4gICAgfSA9IHt9XG4gICkge1xuICAgIGlmICghdGhpcy5mZXRjaE1ldGhvZCkge1xuICAgICAgaWYgKHN0YXR1cykgc3RhdHVzLmZldGNoID0gJ2dldCdcbiAgICAgIHJldHVybiB0aGlzLmdldChrLCB7XG4gICAgICAgIGFsbG93U3RhbGUsXG4gICAgICAgIHVwZGF0ZUFnZU9uR2V0LFxuICAgICAgICBub0RlbGV0ZU9uU3RhbGVHZXQsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGFsbG93U3RhbGUsXG4gICAgICB1cGRhdGVBZ2VPbkdldCxcbiAgICAgIG5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgIHR0bCxcbiAgICAgIG5vRGlzcG9zZU9uU2V0LFxuICAgICAgc2l6ZSxcbiAgICAgIHNpemVDYWxjdWxhdGlvbixcbiAgICAgIG5vVXBkYXRlVFRMLFxuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0LFxuICAgICAgaWdub3JlRmV0Y2hBYm9ydCxcbiAgICAgIHN0YXR1cyxcbiAgICAgIHNpZ25hbCxcbiAgICB9XG5cbiAgICBsZXQgaW5kZXggPSB0aGlzLmtleU1hcC5nZXQoaylcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHN0YXR1cykgc3RhdHVzLmZldGNoID0gJ21pc3MnXG4gICAgICBjb25zdCBwID0gdGhpcy5iYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGZldGNoQ29udGV4dClcbiAgICAgIHJldHVybiAocC5fX3JldHVybmVkID0gcClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW4gY2FjaGUsIG1heWJlIGFscmVhZHkgZmV0Y2hpbmdcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbExpc3RbaW5kZXhdXG4gICAgICBpZiAodGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICBjb25zdCBzdGFsZSA9XG4gICAgICAgICAgYWxsb3dTdGFsZSAmJiB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWRcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdpbmZsaWdodCdcbiAgICAgICAgICBpZiAoc3RhbGUpIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGFsZSA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiAodi5fX3JldHVybmVkID0gdilcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgZm9yY2UgYSByZWZyZXNoLCB0aGF0IG1lYW5zIGRvIE5PVCBzZXJ2ZSB0aGUgY2FjaGVkIHZhbHVlLFxuICAgICAgLy8gdW5sZXNzIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIHJlZnJlc2hpbmcgdGhlIGNhY2hlLlxuICAgICAgY29uc3QgaXNTdGFsZSA9IHRoaXMuaXNTdGFsZShpbmRleClcbiAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmICFpc1N0YWxlKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHN0YXR1cy5mZXRjaCA9ICdoaXQnXG4gICAgICAgIHRoaXMubW92ZVRvVGFpbChpbmRleClcbiAgICAgICAgaWYgKHVwZGF0ZUFnZU9uR2V0KSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVJdGVtQWdlKGluZGV4KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICAgIHJldHVybiB2XG4gICAgICB9XG5cbiAgICAgIC8vIG9rLCBpdCBpcyBzdGFsZSBvciBhIGZvcmNlZCByZWZyZXNoLCBhbmQgbm90IGFscmVhZHkgZmV0Y2hpbmcuXG4gICAgICAvLyByZWZyZXNoIHRoZSBjYWNoZS5cbiAgICAgIGNvbnN0IHAgPSB0aGlzLmJhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgZmV0Y2hDb250ZXh0KVxuICAgICAgY29uc3QgaGFzU3RhbGUgPSBwLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHN0YWxlVmFsID0gaGFzU3RhbGUgJiYgYWxsb3dTdGFsZVxuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMuZmV0Y2ggPSBoYXNTdGFsZSAmJiBpc1N0YWxlID8gJ3N0YWxlJyA6ICdyZWZyZXNoJ1xuICAgICAgICBpZiAoc3RhbGVWYWwgJiYgaXNTdGFsZSkgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhbGVWYWwgPyBwLl9fc3RhbGVXaGlsZUZldGNoaW5nIDogKHAuX19yZXR1cm5lZCA9IHApXG4gICAgfVxuICB9XG5cbiAgZ2V0KFxuICAgIGssXG4gICAge1xuICAgICAgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSxcbiAgICAgIHVwZGF0ZUFnZU9uR2V0ID0gdGhpcy51cGRhdGVBZ2VPbkdldCxcbiAgICAgIG5vRGVsZXRlT25TdGFsZUdldCA9IHRoaXMubm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgc3RhdHVzLFxuICAgIH0gPSB7fVxuICApIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMua2V5TWFwLmdldChrKVxuICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsTGlzdFtpbmRleF1cbiAgICAgIGNvbnN0IGZldGNoaW5nID0gdGhpcy5pc0JhY2tncm91bmRGZXRjaCh2YWx1ZSlcbiAgICAgIHRoaXMuc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICBpZiAodGhpcy5pc1N0YWxlKGluZGV4KSkge1xuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuZ2V0ID0gJ3N0YWxlJ1xuICAgICAgICAvLyBkZWxldGUgb25seSBpZiBub3QgYW4gaW4tZmxpZ2h0IGJhY2tncm91bmQgZmV0Y2hcbiAgICAgICAgaWYgKCFmZXRjaGluZykge1xuICAgICAgICAgIGlmICghbm9EZWxldGVPblN0YWxlR2V0KSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZShrKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IGFsbG93U3RhbGVcbiAgICAgICAgICByZXR1cm4gYWxsb3dTdGFsZSA/IHZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgc3RhdHVzLnJldHVybmVkU3RhbGUgPVxuICAgICAgICAgICAgICBhbGxvd1N0YWxlICYmIHZhbHVlLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFsbG93U3RhbGUgPyB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuZ2V0ID0gJ2hpdCdcbiAgICAgICAgLy8gaWYgd2UncmUgY3VycmVudGx5IGZldGNoaW5nIGl0LCB3ZSBkb24ndCBhY3R1YWxseSBoYXZlIGl0IHlldFxuICAgICAgICAvLyBpdCdzIG5vdCBzdGFsZSwgd2hpY2ggbWVhbnMgdGhpcyBpc24ndCBhIHN0YWxlV2hpbGVSZWZldGNoaW5nLlxuICAgICAgICAvLyBJZiBpdCdzIG5vdCBzdGFsZSwgYW5kIGZldGNoaW5nLCBBTkQgaGFzIGEgX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgLy8gdmFsdWUsIHRoZW4gdGhhdCBtZWFucyB0aGUgdXNlciBmZXRjaGVkIHdpdGgge2ZvcmNlUmVmcmVzaDp0cnVlfSxcbiAgICAgICAgLy8gc28gaXQncyBzYWZlIHRvIHJldHVybiB0aGF0IHZhbHVlLlxuICAgICAgICBpZiAoZmV0Y2hpbmcpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vdmVUb1RhaWwoaW5kZXgpXG4gICAgICAgIGlmICh1cGRhdGVBZ2VPbkdldCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlSXRlbUFnZShpbmRleClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLmdldCA9ICdtaXNzJ1xuICAgIH1cbiAgfVxuXG4gIGNvbm5lY3QocCwgbikge1xuICAgIHRoaXMucHJldltuXSA9IHBcbiAgICB0aGlzLm5leHRbcF0gPSBuXG4gIH1cblxuICBtb3ZlVG9UYWlsKGluZGV4KSB7XG4gICAgLy8gaWYgdGFpbCBhbHJlYWR5LCBub3RoaW5nIHRvIGRvXG4gICAgLy8gaWYgaGVhZCwgbW92ZSBoZWFkIHRvIG5leHRbaW5kZXhdXG4gICAgLy8gZWxzZVxuICAgIC8vICAgbW92ZSBuZXh0W3ByZXZbaW5kZXhdXSB0byBuZXh0W2luZGV4XSAoaGVhZCBoYXMgbm8gcHJldilcbiAgICAvLyAgIG1vdmUgcHJldltuZXh0W2luZGV4XV0gdG8gcHJldltpbmRleF1cbiAgICAvLyBwcmV2W2luZGV4XSA9IHRhaWxcbiAgICAvLyBuZXh0W3RhaWxdID0gaW5kZXhcbiAgICAvLyB0YWlsID0gaW5kZXhcbiAgICBpZiAoaW5kZXggIT09IHRoaXMudGFpbCkge1xuICAgICAgaWYgKGluZGV4ID09PSB0aGlzLmhlYWQpIHtcbiAgICAgICAgdGhpcy5oZWFkID0gdGhpcy5uZXh0W2luZGV4XVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25uZWN0KHRoaXMucHJldltpbmRleF0sIHRoaXMubmV4dFtpbmRleF0pXG4gICAgICB9XG4gICAgICB0aGlzLmNvbm5lY3QodGhpcy50YWlsLCBpbmRleClcbiAgICAgIHRoaXMudGFpbCA9IGluZGV4XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRlbCgpIHtcbiAgICBkZXByZWNhdGVkTWV0aG9kKCdkZWwnLCAnZGVsZXRlJylcbiAgICByZXR1cm4gdGhpcy5kZWxldGVcbiAgfVxuXG4gIGRlbGV0ZShrKSB7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZVxuICAgIGlmICh0aGlzLnNpemUgIT09IDApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGVkID0gdHJ1ZVxuICAgICAgICBpZiAodGhpcy5zaXplID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5jbGVhcigpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVJdGVtU2l6ZShpbmRleClcbiAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgICAgIGlmICh0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZGVsZXRlZCcpKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2UodiwgaywgJ2RlbGV0ZScpXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlZC5wdXNoKFt2LCBrLCAnZGVsZXRlJ10pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMua2V5TWFwLmRlbGV0ZShrKVxuICAgICAgICAgIHRoaXMua2V5TGlzdFtpbmRleF0gPSBudWxsXG4gICAgICAgICAgdGhpcy52YWxMaXN0W2luZGV4XSA9IG51bGxcbiAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMudGFpbCkge1xuICAgICAgICAgICAgdGhpcy50YWlsID0gdGhpcy5wcmV2W2luZGV4XVxuICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuaGVhZCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkID0gdGhpcy5uZXh0W2luZGV4XVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5leHRbdGhpcy5wcmV2W2luZGV4XV0gPSB0aGlzLm5leHRbaW5kZXhdXG4gICAgICAgICAgICB0aGlzLnByZXZbdGhpcy5uZXh0W2luZGV4XV0gPSB0aGlzLnByZXZbaW5kZXhdXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2l6ZS0tXG4gICAgICAgICAgdGhpcy5mcmVlLnB1c2goaW5kZXgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2VkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VBZnRlciguLi50aGlzLmRpc3Bvc2VkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkXG4gIH1cblxuICBjbGVhcigpIHtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIHRoaXMucmluZGV4ZXMoeyBhbGxvd1N0YWxlOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgaWYgKHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2RlbGV0ZWQnKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGsgPSB0aGlzLmtleUxpc3RbaW5kZXhdXG4gICAgICAgIHRoaXMuZGlzcG9zZSh2LCBrLCAnZGVsZXRlJylcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgdGhpcy5kaXNwb3NlZC5wdXNoKFt2LCBrLCAnZGVsZXRlJ10pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtleU1hcC5jbGVhcigpXG4gICAgdGhpcy52YWxMaXN0LmZpbGwobnVsbClcbiAgICB0aGlzLmtleUxpc3QuZmlsbChudWxsKVxuICAgIGlmICh0aGlzLnR0bHMpIHtcbiAgICAgIHRoaXMudHRscy5maWxsKDApXG4gICAgICB0aGlzLnN0YXJ0cy5maWxsKDApXG4gICAgfVxuICAgIGlmICh0aGlzLnNpemVzKSB7XG4gICAgICB0aGlzLnNpemVzLmZpbGwoMClcbiAgICB9XG4gICAgdGhpcy5oZWFkID0gMFxuICAgIHRoaXMudGFpbCA9IDBcbiAgICB0aGlzLmluaXRpYWxGaWxsID0gMVxuICAgIHRoaXMuZnJlZS5sZW5ndGggPSAwXG4gICAgdGhpcy5jYWxjdWxhdGVkU2l6ZSA9IDBcbiAgICB0aGlzLnNpemUgPSAwXG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2VkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VBZnRlciguLi50aGlzLmRpc3Bvc2VkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlc2V0KCkge1xuICAgIGRlcHJlY2F0ZWRNZXRob2QoJ3Jlc2V0JywgJ2NsZWFyJylcbiAgICByZXR1cm4gdGhpcy5jbGVhclxuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICBkZXByZWNhdGVkUHJvcGVydHkoJ2xlbmd0aCcsICdzaXplJylcbiAgICByZXR1cm4gdGhpcy5zaXplXG4gIH1cblxuICBzdGF0aWMgZ2V0IEFib3J0Q29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gQUNcbiAgfVxuICBzdGF0aWMgZ2V0IEFib3J0U2lnbmFsKCkge1xuICAgIHJldHVybiBBU1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTFJVQ2FjaGVcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5cbmxldCBzaGltO1xuY2xhc3MgWTE4TiB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICAvLyBjb25maWd1cmFibGUgb3B0aW9ucy5cbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gb3B0cy5kaXJlY3RvcnkgfHwgJy4vbG9jYWxlcyc7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsZXMgPSB0eXBlb2Ygb3B0cy51cGRhdGVGaWxlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy51cGRhdGVGaWxlcyA6IHRydWU7XG4gICAgICAgIHRoaXMubG9jYWxlID0gb3B0cy5sb2NhbGUgfHwgJ2VuJztcbiAgICAgICAgdGhpcy5mYWxsYmFja1RvTGFuZ3VhZ2UgPSB0eXBlb2Ygb3B0cy5mYWxsYmFja1RvTGFuZ3VhZ2UgPT09ICdib29sZWFuJyA/IG9wdHMuZmFsbGJhY2tUb0xhbmd1YWdlIDogdHJ1ZTtcbiAgICAgICAgLy8gaW50ZXJuYWwgc3R1ZmYuXG4gICAgICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLndyaXRlUXVldWUgPSBbXTtcbiAgICB9XG4gICAgX18oLi4uYXJncykge1xuICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90YWdnZWRMaXRlcmFsKGFyZ3VtZW50c1swXSwgLi4uYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHIgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGxldCBjYiA9IGZ1bmN0aW9uICgpIHsgfTsgLy8gc3RhcnQgd2l0aCBub29wLlxuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiID0gYXJncy5wb3AoKTtcbiAgICAgICAgY2IgPSBjYiB8fCBmdW5jdGlvbiAoKSB7IH07IC8vIG5vb3AuXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICAvLyB3ZSd2ZSBvYnNlcnZlZCBhIG5ldyBzdHJpbmcsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgZmlsZS5cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzdHJdICYmIHRoaXMudXBkYXRlRmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gPSBzdHI7XG4gICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgbG9jYWxlLFxuICAgICAgICAgICAgLy8gc2luY2UgdGhlc2UgdmFsdWVzIGNvdWxkIGNoYW5nZSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyB3cml0ZSBpcyBwZXJmb3JtZWQuXG4gICAgICAgICAgICB0aGlzLl9lbnF1ZXVlV3JpdGUoe1xuICAgICAgICAgICAgICAgIGRpcmVjdG9yeTogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICAgICAgICBjYlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgW3RoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gfHwgc3RyXS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgICBfX24oKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICBjb25zdCBzaW5ndWxhciA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgY29uc3QgcGx1cmFsID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBjb25zdCBxdWFudGl0eSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgbGV0IGNiID0gZnVuY3Rpb24gKCkgeyB9OyAvLyBzdGFydCB3aXRoIG5vb3AuXG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IgPSBhcmdzLnBvcCgpO1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdKVxuICAgICAgICAgICAgdGhpcy5fcmVhZExvY2FsZUZpbGUoKTtcbiAgICAgICAgbGV0IHN0ciA9IHF1YW50aXR5ID09PSAxID8gc2luZ3VsYXIgOiBwbHVyYWw7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdO1xuICAgICAgICAgICAgc3RyID0gZW50cnlbcXVhbnRpdHkgPT09IDEgPyAnb25lJyA6ICdvdGhlciddO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdlJ3ZlIG9ic2VydmVkIGEgbmV3IHN0cmluZywgdXBkYXRlIHRoZSBsYW5ndWFnZSBmaWxlLlxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXSAmJiB0aGlzLnVwZGF0ZUZpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0gPSB7XG4gICAgICAgICAgICAgICAgb25lOiBzaW5ndWxhcixcbiAgICAgICAgICAgICAgICBvdGhlcjogcGx1cmFsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGxvY2FsZSxcbiAgICAgICAgICAgIC8vIHNpbmNlIHRoZXNlIHZhbHVlcyBjb3VsZCBjaGFuZ2UgYmVmb3JlIHRoZVxuICAgICAgICAgICAgLy8gd3JpdGUgaXMgcGVyZm9ybWVkLlxuICAgICAgICAgICAgdGhpcy5fZW5xdWV1ZVdyaXRlKHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuZGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgICAgICAgY2JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhICVkIHBsYWNlaG9sZGVyIGlzIHByb3ZpZGVkLCBhZGQgcXVhbnRpdHlcbiAgICAgICAgLy8gdG8gdGhlIGFyZ3VtZW50cyBleHBhbmRlZCBieSB1dGlsLmZvcm1hdC5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gW3N0cl07XG4gICAgICAgIGlmICh+c3RyLmluZGV4T2YoJyVkJykpXG4gICAgICAgICAgICB2YWx1ZXMucHVzaChxdWFudGl0eSk7XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgdmFsdWVzLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICAgIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgfVxuICAgIGdldExvY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlO1xuICAgIH1cbiAgICB1cGRhdGVMb2NhbGUob2JqKSB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1ba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIF90YWdnZWRMaXRlcmFsKHBhcnRzLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgcGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCwgaSkge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpICsgMV07XG4gICAgICAgICAgICBzdHIgKz0gcGFydDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHN0ciArPSAnJXMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX18uYXBwbHkodGhpcywgW3N0cl0uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJncywgMSkpKTtcbiAgICB9XG4gICAgX2VucXVldWVXcml0ZSh3b3JrKSB7XG4gICAgICAgIHRoaXMud3JpdGVRdWV1ZS5wdXNoKHdvcmspO1xuICAgICAgICBpZiAodGhpcy53cml0ZVF1ZXVlLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NXcml0ZVF1ZXVlKCk7XG4gICAgfVxuICAgIF9wcm9jZXNzV3JpdGVRdWV1ZSgpIHtcbiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xuICAgICAgICBjb25zdCB3b3JrID0gdGhpcy53cml0ZVF1ZXVlWzBdO1xuICAgICAgICAvLyBkZXN0cnVjdHVyZSB0aGUgZW5xdWV1ZWQgd29yay5cbiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gd29yay5kaXJlY3Rvcnk7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9IHdvcmsubG9jYWxlO1xuICAgICAgICBjb25zdCBjYiA9IHdvcmsuY2I7XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHRoaXMuX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZExvY2FsZSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY2FjaGVbbG9jYWxlXSwgbnVsbCwgMik7XG4gICAgICAgIHNoaW0uZnMud3JpdGVGaWxlKGxhbmd1YWdlRmlsZSwgc2VyaWFsaXplZExvY2FsZSwgJ3V0Zi04JywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgX3RoaXMud3JpdGVRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKF90aGlzLndyaXRlUXVldWUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBfdGhpcy5fcHJvY2Vzc1dyaXRlUXVldWUoKTtcbiAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcmVhZExvY2FsZUZpbGUoKSB7XG4gICAgICAgIGxldCBsb2NhbGVMb29rdXAgPSB7fTtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VGaWxlID0gdGhpcy5fcmVzb2x2ZUxvY2FsZUZpbGUodGhpcy5kaXJlY3RvcnksIHRoaXMubG9jYWxlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBidW5kbGVyIHN1Y2ggYXMgd2VicGFjaywgcmVhZEZpbGVTeW5jIG1heSBub3QgYmUgZGVmaW5lZDpcbiAgICAgICAgICAgIGlmIChzaGltLmZzLnJlYWRGaWxlU3luYykge1xuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IEpTT04ucGFyc2Uoc2hpbS5mcy5yZWFkRmlsZVN5bmMobGFuZ3VhZ2VGaWxlLCAndXRmLTgnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSAnc3ludGF4IGVycm9yIGluICcgKyBsYW5ndWFnZUZpbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKVxuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IHt9O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSA9IGxvY2FsZUxvb2t1cDtcbiAgICB9XG4gICAgX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKSB7XG4gICAgICAgIGxldCBmaWxlID0gc2hpbS5yZXNvbHZlKGRpcmVjdG9yeSwgJy4vJywgbG9jYWxlICsgJy5qc29uJyk7XG4gICAgICAgIGlmICh0aGlzLmZhbGxiYWNrVG9MYW5ndWFnZSAmJiAhdGhpcy5fZmlsZUV4aXN0c1N5bmMoZmlsZSkgJiYgfmxvY2FsZS5sYXN0SW5kZXhPZignXycpKSB7XG4gICAgICAgICAgICAvLyBhdHRlbXB0IGZhbGxiYWNrIHRvIGxhbmd1YWdlIG9ubHlcbiAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHNoaW0ucmVzb2x2ZShkaXJlY3RvcnksICcuLycsIGxvY2FsZS5zcGxpdCgnXycpWzBdICsgJy5qc29uJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZmlsZUV4aXN0c1N5bmMobGFuZ3VhZ2VGaWxlKSlcbiAgICAgICAgICAgICAgICBmaWxlID0gbGFuZ3VhZ2VGaWxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cbiAgICBfZmlsZUV4aXN0c1N5bmMoZmlsZSkge1xuICAgICAgICByZXR1cm4gc2hpbS5leGlzdHMoZmlsZSk7XG4gICAgfVxufVxuZnVuY3Rpb24geTE4biQxKG9wdHMsIF9zaGltKSB7XG4gICAgc2hpbSA9IF9zaGltO1xuICAgIGNvbnN0IHkxOG4gPSBuZXcgWTE4TihvcHRzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBfXzogeTE4bi5fXy5iaW5kKHkxOG4pLFxuICAgICAgICBfX246IHkxOG4uX19uLmJpbmQoeTE4biksXG4gICAgICAgIHNldExvY2FsZTogeTE4bi5zZXRMb2NhbGUuYmluZCh5MThuKSxcbiAgICAgICAgZ2V0TG9jYWxlOiB5MThuLmdldExvY2FsZS5iaW5kKHkxOG4pLFxuICAgICAgICB1cGRhdGVMb2NhbGU6IHkxOG4udXBkYXRlTG9jYWxlLmJpbmQoeTE4biksXG4gICAgICAgIGxvY2FsZTogeTE4bi5sb2NhbGVcbiAgICB9O1xufVxuXG52YXIgbm9kZVBsYXRmb3JtU2hpbSA9IHtcbiAgICBmczoge1xuICAgICAgICByZWFkRmlsZVN5bmM6IGZzLnJlYWRGaWxlU3luYyxcbiAgICAgICAgd3JpdGVGaWxlOiBmcy53cml0ZUZpbGVcbiAgICB9LFxuICAgIGZvcm1hdDogdXRpbC5mb3JtYXQsXG4gICAgcmVzb2x2ZTogcGF0aC5yZXNvbHZlLFxuICAgIGV4aXN0czogKGZpbGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBmcy5zdGF0U3luYyhmaWxlKS5pc0ZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jb25zdCB5MThuID0gKG9wdHMpID0+IHtcbiAgICByZXR1cm4geTE4biQxKG9wdHMsIG5vZGVQbGF0Zm9ybVNoaW0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB5MThuO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcblxuZnVuY3Rpb24gY2FtZWxDYXNlKHN0cikge1xuICAgIGNvbnN0IGlzQ2FtZWxDYXNlID0gc3RyICE9PSBzdHIudG9Mb3dlckNhc2UoKSAmJiBzdHIgIT09IHN0ci50b1VwcGVyQ2FzZSgpO1xuICAgIGlmICghaXNDYW1lbENhc2UpIHtcbiAgICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmIChzdHIuaW5kZXhPZignLScpID09PSAtMSAmJiBzdHIuaW5kZXhPZignXycpID09PSAtMSkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNhbWVsY2FzZSA9ICcnO1xuICAgICAgICBsZXQgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdIeXBoZW5zID0gc3RyLm1hdGNoKC9eLSsvKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxlYWRpbmdIeXBoZW5zID8gbGVhZGluZ0h5cGhlbnNbMF0ubGVuZ3RoIDogMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNociA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAobmV4dENoclVwcGVyKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hyID0gY2hyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gMCAmJiAoY2hyID09PSAnLScgfHwgY2hyID09PSAnXycpKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNociAhPT0gJy0nICYmIGNociAhPT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgY2FtZWxjYXNlICs9IGNocjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FtZWxjYXNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRlY2FtZWxpemUoc3RyLCBqb2luU3RyaW5nKSB7XG4gICAgY29uc3QgbG93ZXJjYXNlID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgam9pblN0cmluZyA9IGpvaW5TdHJpbmcgfHwgJy0nO1xuICAgIGxldCBub3RDYW1lbGNhc2UgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaHJMb3dlciA9IGxvd2VyY2FzZS5jaGFyQXQoaSk7XG4gICAgICAgIGNvbnN0IGNoclN0cmluZyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChjaHJMb3dlciAhPT0gY2hyU3RyaW5nICYmIGkgPiAwKSB7XG4gICAgICAgICAgICBub3RDYW1lbGNhc2UgKz0gYCR7am9pblN0cmluZ30ke2xvd2VyY2FzZS5jaGFyQXQoaSl9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5vdENhbWVsY2FzZSArPSBjaHJTdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vdENhbWVsY2FzZTtcbn1cbmZ1bmN0aW9uIGxvb2tzTGlrZU51bWJlcih4KSB7XG4gICAgaWYgKHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKC9eMHhbMC05YS1mXSskL2kudGVzdCh4KSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKC9eMFteLl0vLnRlc3QoeCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gL15bLV0/KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKShlWy0rXT9cXGQrKT8kLy50ZXN0KHgpO1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUFyZ1N0cmluZyhhcmdTdHJpbmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdTdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBhcmdTdHJpbmcubWFwKGUgPT4gdHlwZW9mIGUgIT09ICdzdHJpbmcnID8gZSArICcnIDogZSk7XG4gICAgfVxuICAgIGFyZ1N0cmluZyA9IGFyZ1N0cmluZy50cmltKCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBwcmV2QyA9IG51bGw7XG4gICAgbGV0IGMgPSBudWxsO1xuICAgIGxldCBvcGVuaW5nID0gbnVsbDtcbiAgICBjb25zdCBhcmdzID0gW107XG4gICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGFyZ1N0cmluZy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgcHJldkMgPSBjO1xuICAgICAgICBjID0gYXJnU3RyaW5nLmNoYXJBdChpaSk7XG4gICAgICAgIGlmIChjID09PSAnICcgJiYgIW9wZW5pbmcpIHtcbiAgICAgICAgICAgIGlmICghKHByZXZDID09PSAnICcpKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09IG9wZW5pbmcpIHtcbiAgICAgICAgICAgIG9wZW5pbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjID09PSBcIidcIiB8fCBjID09PSAnXCInKSAmJiAhb3BlbmluZykge1xuICAgICAgICAgICAgb3BlbmluZyA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmdzW2ldKVxuICAgICAgICAgICAgYXJnc1tpXSA9ICcnO1xuICAgICAgICBhcmdzW2ldICs9IGM7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuXG52YXIgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXk7XG4oZnVuY3Rpb24gKERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5KSB7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJCT09MRUFOXCJdID0gXCJib29sZWFuXCI7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJTVFJJTkdcIl0gPSBcInN0cmluZ1wiO1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiTlVNQkVSXCJdID0gXCJudW1iZXJcIjtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIkFSUkFZXCJdID0gXCJhcnJheVwiO1xufSkoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgfHwgKERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5ID0ge30pKTtcblxubGV0IG1peGluO1xuY2xhc3MgWWFyZ3NQYXJzZXIge1xuICAgIGNvbnN0cnVjdG9yKF9taXhpbikge1xuICAgICAgICBtaXhpbiA9IF9taXhpbjtcbiAgICB9XG4gICAgcGFyc2UoYXJnc0lucHV0LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIGFsaWFzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcnJheTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9vbGVhbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29uZmlnOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWdPYmplY3RzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb2VyY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvdW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlbnZQcmVmaXg6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5hcmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5vcm1hbGl6ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3RyaW5nOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBudW1iZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIF9fOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBrZXk6IHVuZGVmaW5lZFxuICAgICAgICB9LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgYXJncyA9IHRva2VuaXplQXJnU3RyaW5nKGFyZ3NJbnB1dCk7XG4gICAgICAgIGNvbnN0IGlucHV0SXNTdHJpbmcgPSB0eXBlb2YgYXJnc0lucHV0ID09PSAnc3RyaW5nJztcbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IGNvbWJpbmVBbGlhc2VzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5hbGlhcykpO1xuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAnYm9vbGVhbi1uZWdhdGlvbic6IHRydWUsXG4gICAgICAgICAgICAnY2FtZWwtY2FzZS1leHBhbnNpb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2NvbWJpbmUtYXJyYXlzJzogZmFsc2UsXG4gICAgICAgICAgICAnZG90LW5vdGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgICAgICdkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5JzogdHJ1ZSxcbiAgICAgICAgICAgICdmbGF0dGVuLWR1cGxpY2F0ZS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2dyZWVkeS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2hhbHQtYXQtbm9uLW9wdGlvbic6IGZhbHNlLFxuICAgICAgICAgICAgJ25hcmdzLWVhdHMtb3B0aW9ucyc6IGZhbHNlLFxuICAgICAgICAgICAgJ25lZ2F0aW9uLXByZWZpeCc6ICduby0nLFxuICAgICAgICAgICAgJ3BhcnNlLW51bWJlcnMnOiB0cnVlLFxuICAgICAgICAgICAgJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyc6IHRydWUsXG4gICAgICAgICAgICAncG9wdWxhdGUtLSc6IGZhbHNlLFxuICAgICAgICAgICAgJ3NldC1wbGFjZWhvbGRlci1rZXknOiBmYWxzZSxcbiAgICAgICAgICAgICdzaG9ydC1vcHRpb24tZ3JvdXBzJzogdHJ1ZSxcbiAgICAgICAgICAgICdzdHJpcC1hbGlhc2VkJzogZmFsc2UsXG4gICAgICAgICAgICAnc3RyaXAtZGFzaGVkJzogZmFsc2UsXG4gICAgICAgICAgICAndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnOiBmYWxzZVxuICAgICAgICB9LCBvcHRzLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5kZWZhdWx0KTtcbiAgICAgICAgY29uc3QgY29uZmlnT2JqZWN0cyA9IG9wdHMuY29uZmlnT2JqZWN0cyB8fCBbXTtcbiAgICAgICAgY29uc3QgZW52UHJlZml4ID0gb3B0cy5lbnZQcmVmaXg7XG4gICAgICAgIGNvbnN0IG5vdEZsYWdzT3B0aW9uID0gY29uZmlndXJhdGlvblsncG9wdWxhdGUtLSddO1xuICAgICAgICBjb25zdCBub3RGbGFnc0FyZ3YgPSBub3RGbGFnc09wdGlvbiA/ICctLScgOiAnXyc7XG4gICAgICAgIGNvbnN0IG5ld0FsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBkZWZhdWx0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBfXyA9IG9wdHMuX18gfHwgbWl4aW4uZm9ybWF0O1xuICAgICAgICBjb25zdCBmbGFncyA9IHtcbiAgICAgICAgICAgIGFsaWFzZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBhcnJheXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBib29sczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIHN0cmluZ3M6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBudW1iZXJzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY291bnRzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgbm9ybWFsaXplOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29uZmlnczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG5hcmdzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29lcmNpb25zOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAga2V5czogW11cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmUgPSAvXi0oWzAtOV0rKFxcLlswLTldKyk/fFxcLlswLTldKykkLztcbiAgICAgICAgY29uc3QgbmVnYXRlZEJvb2xlYW4gPSBuZXcgUmVnRXhwKCdeLS0nICsgY29uZmlndXJhdGlvblsnbmVnYXRpb24tcHJlZml4J10gKyAnKC4rKScpO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5hcnJheSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdHlwZW9mIG9wdCA9PT0gJ29iamVjdCcgPyBvcHQua2V5IDogb3B0O1xuICAgICAgICAgICAgY29uc3QgYXNzaWdubWVudCA9IE9iamVjdC5rZXlzKG9wdCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUZsYWdLZXlzID0ge1xuICAgICAgICAgICAgICAgICAgICBib29sZWFuOiAnYm9vbHMnLFxuICAgICAgICAgICAgICAgICAgICBzdHJpbmc6ICdzdHJpbmdzJyxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiAnbnVtYmVycydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheUZsYWdLZXlzW2tleV07XG4gICAgICAgICAgICB9KS5maWx0ZXIoQm9vbGVhbikucG9wKCk7XG4gICAgICAgICAgICBpZiAoYXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZsYWdzW2Fzc2lnbm1lbnRdW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmxhZ3MuYXJyYXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5ib29sZWFuIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5ib29sc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMuc3RyaW5nIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5zdHJpbmdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5udW1iZXIgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLm51bWJlcnNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmNvdW50IHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5jb3VudHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLm5vcm1hbGl6ZSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZmxhZ3Mubm9ybWFsaXplW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubmFyZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMubmFyZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MubmFyZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY29lcmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb2VyY2UpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29lcmNpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmNvbmZpZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMuY29uZmlnKSB8fCB0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgW10uY29uY2F0KG9wdHMuY29uZmlnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNvbmZpZ3Nba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb25maWcpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5jb25maWdzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV4dGVuZEFsaWFzZXMob3B0cy5rZXksIGFsaWFzZXMsIG9wdHMuZGVmYXVsdCwgZmxhZ3MuYXJyYXlzKTtcbiAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgKGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1thbGlhc10gPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgbGV0IG5vdEZsYWdzID0gW107XG4gICAgICAgIGNvbnN0IGFyZ3YgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHsgXzogW10gfSk7XG4gICAgICAgIGNvbnN0IGFyZ3ZSZXR1cm4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkQXJnID0gYXJnLnJlcGxhY2UoL14tezMsfS8sICctLS0nKTtcbiAgICAgICAgICAgIGxldCBicm9rZW47XG4gICAgICAgICAgICBsZXQga2V5O1xuICAgICAgICAgICAgbGV0IGxldHRlcnM7XG4gICAgICAgICAgICBsZXQgbTtcbiAgICAgICAgICAgIGxldCBuZXh0O1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKGFyZyAhPT0gJy0tJyAmJiAvXi0vLnRlc3QoYXJnKSAmJiBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRydW5jYXRlZEFyZy5tYXRjaCgvXi0tLSsoPXwkKS8pKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLis9LykgfHwgKCFjb25maWd1cmF0aW9uWydzaG9ydC1vcHRpb24tZ3JvdXBzJ10gJiYgYXJnLm1hdGNoKC9eLS4rPS8pKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tLT8oW149XSspPShbXFxzXFxTXSopJC8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKG1bMV0sIGZsYWdzLmFycmF5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXRBcnJheShpLCBtWzFdLCBhcmdzLCBtWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMobVsxXSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIG1bMV0sIGFyZ3MsIG1bMl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKSAmJiBjb25maWd1cmF0aW9uWydib29sZWFuLW5lZ2F0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSA/IFtmYWxzZV0gOiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS0uKy8pIHx8ICghY29uZmlndXJhdGlvblsnc2hvcnQtb3B0aW9uLWdyb3VwcyddICYmIGFyZy5tYXRjaCgvXi1bXi1dKy8pKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tLT8oLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCFuZXh0Lm1hdGNoKC9eLS8pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS5cXC4uKz0vKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tKFtePV0rKT0oW1xcc1xcU10qKSQvKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0uXFwuLisvKSAmJiAhYXJnLm1hdGNoKG5lZ2F0aXZlKSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLSguXFwuLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgIW5leHQubWF0Y2goL14tLykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi1bXi1dKy8pICYmICFhcmcubWF0Y2gobmVnYXRpdmUpKSB7XG4gICAgICAgICAgICAgICAgbGV0dGVycyA9IGFyZy5zbGljZSgxLCAtMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgICAgIGJyb2tlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnLnNsaWNlKGogKyAyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnLnNsaWNlKGogKyAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGxldHRlcnNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXRBcnJheShpLCBrZXksIGFyZ3MsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgL14tP1xcZCsoXFwuXFxkKik/KGUtP1xcZCspPyQvLnRlc3QobmV4dCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhuZXh0LCBmbGFncy5ib29scykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIGRlZmF1bHRWYWx1ZShsZXR0ZXJzW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga2V5ID0gYXJnLnNsaWNlKC0xKVswXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJyb2tlbiAmJiBrZXkgIT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnc1tpICsgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAhPT0gdW5kZWZpbmVkICYmICghL14oLXwtLSlbXi1dLy50ZXN0KG5leHQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLVswLTldJC8pICYmXG4gICAgICAgICAgICAgICAgYXJnLm1hdGNoKG5lZ2F0aXZlKSAmJlxuICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhhcmcuc2xpY2UoMSksIGZsYWdzLmJvb2xzKSkge1xuICAgICAgICAgICAgICAgIGtleSA9IGFyZy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgICAgICAgICAgICBub3RGbGFncyA9IGFyZ3Muc2xpY2UoaSArIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29uZmlndXJhdGlvblsnaGFsdC1hdC1ub24tb3B0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBub3RGbGFncyA9IGFyZ3Muc2xpY2UoaSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwdXNoUG9zaXRpb25hbChhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCB0cnVlKTtcbiAgICAgICAgYXBwbHlFbnZWYXJzKGFyZ3YsIGZhbHNlKTtcbiAgICAgICAgc2V0Q29uZmlnKGFyZ3YpO1xuICAgICAgICBzZXRDb25maWdPYmplY3RzKCk7XG4gICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGFyZ3YsIGZsYWdzLmFsaWFzZXMsIGRlZmF1bHRzLCB0cnVlKTtcbiAgICAgICAgYXBwbHlDb2VyY2lvbnMoYXJndik7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydzZXQtcGxhY2Vob2xkZXIta2V5J10pXG4gICAgICAgICAgICBzZXRQbGFjZWhvbGRlcktleXMoYXJndik7XG4gICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoIWhhc0tleShhcmd2LCBrZXkuc3BsaXQoJy4nKSkpXG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobm90RmxhZ3NPcHRpb24gJiYgbm90RmxhZ3MubGVuZ3RoKVxuICAgICAgICAgICAgYXJndltub3RGbGFnc0FyZ3ZdID0gW107XG4gICAgICAgIG5vdEZsYWdzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgYXJndltub3RGbGFnc0FyZ3ZdLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddICYmIGNvbmZpZ3VyYXRpb25bJ3N0cmlwLWRhc2hlZCddKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJy0tJyAmJiBrZXkuaW5jbHVkZXMoJy0nKSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBhcmd2W2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnc3RyaXAtYWxpYXNlZCddKSB7XG4gICAgICAgICAgICBbXS5jb25jYXQoLi4uT2JqZWN0LmtleXMoYWxpYXNlcykubWFwKGsgPT4gYWxpYXNlc1trXSkpLmZvckVhY2goYWxpYXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddICYmIGFsaWFzLmluY2x1ZGVzKCctJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3ZbYWxpYXMuc3BsaXQoJy4nKS5tYXAocHJvcCA9PiBjYW1lbENhc2UocHJvcCkpLmpvaW4oJy4nKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhcmd2W2FsaWFzXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHB1c2hQb3NpdGlvbmFsKGFyZykge1xuICAgICAgICAgICAgY29uc3QgbWF5YmVDb2VyY2VkTnVtYmVyID0gbWF5YmVDb2VyY2VOdW1iZXIoJ18nLCBhcmcpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgYXJndi5fLnB1c2gobWF5YmVDb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlYXROYXJncyhpLCBrZXksIGFyZ3MsIGFyZ0FmdGVyRXF1YWxTaWduKSB7XG4gICAgICAgICAgICBsZXQgaWk7XG4gICAgICAgICAgICBsZXQgdG9FYXQgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncyk7XG4gICAgICAgICAgICB0b0VhdCA9IHR5cGVvZiB0b0VhdCAhPT0gJ251bWJlcicgfHwgaXNOYU4odG9FYXQpID8gMSA6IHRvRWF0O1xuICAgICAgICAgICAgaWYgKHRvRWF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnQXJndW1lbnQgdW5leHBlY3RlZCBmb3I6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhdmFpbGFibGUgPSBpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgPyAwIDogMTtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWyduYXJncy1lYXRzLW9wdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAtIChpICsgMSkgKyBhdmFpbGFibGUgPCB0b0VhdCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IHRvRWF0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChpaSA9IGkgKyAxOyBpaSA8IGFyZ3MubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJnc1tpaV0ubWF0Y2goL14tW14wLTldLykgfHwgYXJnc1tpaV0ubWF0Y2gobmVnYXRpdmUpIHx8IGlzVW5rbm93bk9wdGlvbkFzQXJnKGFyZ3NbaWldKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSsrO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSA8IHRvRWF0KVxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29uc3VtZWQgPSBNYXRoLm1pbihhdmFpbGFibGUsIHRvRWF0KTtcbiAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pICYmIGNvbnN1bWVkID4gMCkge1xuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGFyZ0FmdGVyRXF1YWxTaWduKTtcbiAgICAgICAgICAgICAgICBjb25zdW1lZC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpaSA9IGkgKyAxOyBpaSA8IChjb25zdW1lZCArIGkgKyAxKTsgaWkrKykge1xuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGFyZ3NbaWldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoaSArIGNvbnN1bWVkKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlYXRBcnJheShpLCBrZXksIGFyZ3MsIGFyZ0FmdGVyRXF1YWxTaWduKSB7XG4gICAgICAgICAgICBsZXQgYXJnc1RvU2V0ID0gW107XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGFyZ0FmdGVyRXF1YWxTaWduIHx8IGFyZ3NbaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgbmFyZ3NDb3VudCA9IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKTtcbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiYgISgvXih0cnVlfGZhbHNlKSQvLnRlc3QobmV4dCkpKSB7XG4gICAgICAgICAgICAgICAgYXJnc1RvU2V0LnB1c2godHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc1VuZGVmaW5lZChuZXh0KSB8fFxuICAgICAgICAgICAgICAgIChpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgJiYgL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdHNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZlZhbCA9IGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldCA9IEFycmF5LmlzQXJyYXkoZGVmVmFsKSA/IGRlZlZhbCA6IFtkZWZWYWxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIGFyZ0FmdGVyRXF1YWxTaWduLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghY29uZmlndXJhdGlvblsnZ3JlZWR5LWFycmF5cyddICYmIGFyZ3NUb1NldC5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKG5hcmdzQ291bnQgJiYgdHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmIGFyZ3NUb1NldC5sZW5ndGggPj0gbmFyZ3NDb3VudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaWldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpID0gaWk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIG5leHQsIGlucHV0SXNTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmICgobmFyZ3NDb3VudCAmJiBhcmdzVG9TZXQubGVuZ3RoIDwgbmFyZ3NDb3VudCkgfHxcbiAgICAgICAgICAgICAgICAoaXNOYU4obmFyZ3NDb3VudCkgJiYgYXJnc1RvU2V0Lmxlbmd0aCA9PT0gMCkpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnTm90IGVub3VnaCBhcmd1bWVudHMgZm9sbG93aW5nOiAlcycsIGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnc1RvU2V0KTtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNldEFyZyhrZXksIHZhbCwgc2hvdWxkU3RyaXBRdW90ZXMgPSBpbnB1dElzU3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAoLy0vLnRlc3Qoa2V5KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxpYXMgPSBrZXkuc3BsaXQoJy4nKS5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZShwcm9wKTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKCcuJyk7XG4gICAgICAgICAgICAgICAgYWRkTmV3QWxpYXMoa2V5LCBhbGlhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHByb2Nlc3NWYWx1ZShrZXksIHZhbCwgc2hvdWxkU3RyaXBRdW90ZXMpO1xuICAgICAgICAgICAgY29uc3Qgc3BsaXRLZXkgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIHNldEtleShhcmd2LCBzcGxpdEtleSwgdmFsdWUpO1xuICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3BsaXRLZXkubGVuZ3RoID4gMSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgIChmbGFncy5hbGlhc2VzW3NwbGl0S2V5WzBdXSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQga2V5UHJvcGVydGllcyA9IHguc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IFtdLmNvbmNhdChzcGxpdEtleSk7XG4gICAgICAgICAgICAgICAgICAgIGEuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAga2V5UHJvcGVydGllcyA9IGtleVByb3BlcnRpZXMuY29uY2F0KGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2tleV0gfHwgW10pLmluY2x1ZGVzKGtleVByb3BlcnRpZXMuam9pbignLicpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIGtleVByb3BlcnRpZXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmFycmF5cykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gW2tleV0uY29uY2F0KGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSk7XG4gICAgICAgICAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFyZ3ZSZXR1cm4sIGtleSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBtaXhpbi5ub3JtYWxpemUodmFsdWUpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFkZE5ld0FsaWFzKGtleSwgYWxpYXMpIHtcbiAgICAgICAgICAgIGlmICghKGZsYWdzLmFsaWFzZXNba2V5XSAmJiBmbGFncy5hbGlhc2VzW2tleV0ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XSA9IFthbGlhc107XG4gICAgICAgICAgICAgICAgbmV3QWxpYXNlc1thbGlhc10gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1thbGlhc10gJiYgZmxhZ3MuYWxpYXNlc1thbGlhc10ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIGFkZE5ld0FsaWFzKGFsaWFzLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NWYWx1ZShrZXksIHZhbCwgc2hvdWxkU3RyaXBRdW90ZXMpIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRTdHJpcFF1b3Rlcykge1xuICAgICAgICAgICAgICAgIHZhbCA9IHN0cmlwUXVvdGVzKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpIHx8IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbCA9PT0gJ3RydWUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgICAgICAgICAgICAgPyB2YWwubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiBtYXliZUNvZXJjZU51bWJlcihrZXksIHYpOyB9KVxuICAgICAgICAgICAgICAgIDogbWF5YmVDb2VyY2VOdW1iZXIoa2V5LCB2YWwpO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykgJiYgKGlzVW5kZWZpbmVkKHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGluY3JlbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsLm1hcCgodmFsKSA9PiB7IHJldHVybiBtaXhpbi5ub3JtYWxpemUodmFsKTsgfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1peGluLm5vcm1hbGl6ZSh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJ10gJiYga2V5ID09PSAnXycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5zdHJpbmdzKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZENvZXJjZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcih2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsncGFyc2UtbnVtYmVycyddICYmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dmFsdWV9YCkpKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENvZXJjZU51bWJlciB8fCAoIWlzVW5kZWZpbmVkKHZhbHVlKSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWcoYXJndikge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGNvbmZpZ0xvb2t1cCwgZmxhZ3MuYWxpYXNlcywgZGVmYXVsdHMpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmxhZ3MuY29uZmlncykuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGFyZ3ZbY29uZmlnS2V5XSB8fCBjb25maWdMb29rdXBbY29uZmlnS2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbmZpZ1BhdGggPSBtaXhpbi5yZXNvbHZlKG1peGluLmN3ZCgpLCBjb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVDb25maWcgPSBmbGFncy5jb25maWdzW2NvbmZpZ0tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSByZXNvbHZlQ29uZmlnKHJlc29sdmVkQ29uZmlnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1peGluLnJlcXVpcmUocmVzb2x2ZWRDb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4Lm5hbWUgPT09ICdQZXJtaXNzaW9uRGVuaWVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJndltjb25maWdLZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgSlNPTiBjb25maWcgZmlsZTogJXMnLCBjb25maWdQYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3QoY29uZmlnLCBwcmV2KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbEtleSA9IHByZXYgPyBwcmV2ICsgJy4nICsga2V5IDoga2V5O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDb25maWdPYmplY3QodmFsdWUsIGZ1bGxLZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwgZnVsbEtleS5zcGxpdCgnLicpKSB8fCAoY2hlY2tBbGxBbGlhc2VzKGZ1bGxLZXksIGZsYWdzLmFycmF5cykgJiYgY29uZmlndXJhdGlvblsnY29tYmluZS1hcnJheXMnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhmdWxsS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3RzKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25maWdPYmplY3RzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGNvbmZpZ09iamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWdPYmplY3QpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5RW52VmFycyhhcmd2LCBjb25maWdPbmx5KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVudlByZWZpeCA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gdHlwZW9mIGVudlByZWZpeCA9PT0gJ3N0cmluZycgPyBlbnZQcmVmaXggOiAnJztcbiAgICAgICAgICAgIGNvbnN0IGVudiA9IG1peGluLmVudigpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGZ1bmN0aW9uIChlbnZWYXIpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09PSAnJyB8fCBlbnZWYXIubGFzdEluZGV4T2YocHJlZml4LCAwKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gZW52VmFyLnNwbGl0KCdfXycpLm1hcChmdW5jdGlvbiAoa2V5LCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtZWxDYXNlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKChjb25maWdPbmx5ICYmIGZsYWdzLmNvbmZpZ3Nba2V5cy5qb2luKCcuJyldKSB8fCAhY29uZmlnT25seSkgJiYgIWhhc0tleShhcmd2LCBrZXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleXMuam9pbignLicpLCBlbnZbZW52VmFyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBhcHBseUNvZXJjaW9ucyhhcmd2KSB7XG4gICAgICAgICAgICBsZXQgY29lcmNlO1xuICAgICAgICAgICAgY29uc3QgYXBwbGllZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGlmICghYXBwbGllZC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb2VyY2UgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb2VyY2lvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1heWJlQ29lcmNlTnVtYmVyKGtleSwgY29lcmNlKGFyZ3Zba2V5XSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpKS5mb3JFYWNoKGFsaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQuYWRkKGFsaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbYWxpXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpIHtcbiAgICAgICAgICAgIGZsYWdzLmtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKH5rZXkuaW5kZXhPZignLicpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd2W2tleV0gPT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgICAgICAgICBhcmd2W2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKG9iaiwgYWxpYXNlcywgZGVmYXVsdHMsIGNhbkxvZyA9IGZhbHNlKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkZWZhdWx0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkob2JqLCBrZXkuc3BsaXQoJy4nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0S2V5KG9iaiwga2V5LnNwbGl0KCcuJyksIGRlZmF1bHRzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FuTG9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdGVkW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAoYWxpYXNlc1trZXldIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzS2V5KG9iaiwgeC5zcGxpdCgnLicpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRLZXkob2JqLCB4LnNwbGl0KCcuJyksIGRlZmF1bHRzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYXNLZXkob2JqLCBrZXlzKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG9iajtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pXG4gICAgICAgICAgICAgICAga2V5cyA9IFtrZXlzLmpvaW4oJy4nKV07XG4gICAgICAgICAgICBrZXlzLnNsaWNlKDAsIC0xKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBvID0gKG9ba2V5XSB8fCB7fSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbyAhPT0gJ29iamVjdCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXkgaW4gbztcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRLZXkob2JqLCBrZXlzLCB2YWx1ZSkge1xuICAgICAgICAgICAgbGV0IG8gPSBvYmo7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb25bJ2RvdC1ub3RhdGlvbiddKVxuICAgICAgICAgICAgICAgIGtleXMgPSBba2V5cy5qb2luKCcuJyldO1xuICAgICAgICAgICAga2V5cy5zbGljZSgwLCAtMSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAga2V5ID0gc2FuaXRpemVLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG8gPT09ICdvYmplY3QnICYmIG9ba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XS5wdXNoKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHt9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvID0gb1trZXldW29ba2V5XS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG8gPSBvW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzYW5pdGl6ZUtleShrZXlzW2tleXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlQXJyYXkgPSBjaGVja0FsbEFsaWFzZXMoa2V5cy5qb2luKCcuJyksIGZsYWdzLmFycmF5cyk7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBkdXBsaWNhdGUgPSBjb25maWd1cmF0aW9uWydkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5J107XG4gICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykpIHtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgoIWlzVW5kZWZpbmVkKG9ba2V5XSkgJiYgZmxhZ3MubmFyZ3Nba2V5XSA9PT0gMSkgfHwgKEFycmF5LmlzQXJyYXkob1trZXldKSAmJiBvW2tleV0ubGVuZ3RoID09PSBmbGFncy5uYXJnc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBpbmNyZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IGluY3JlbWVudChvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSAmJiBpc1R5cGVBcnJheSAmJiBpc1ZhbHVlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gY29uZmlndXJhdGlvblsnZmxhdHRlbi1kdXBsaWNhdGUtYXJyYXlzJ10gPyBvW2tleV0uY29uY2F0KHZhbHVlKSA6IChBcnJheS5pc0FycmF5KG9ba2V5XVswXSkgPyBvW2tleV0gOiBbb1trZXldXSkuY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZHVwbGljYXRlICYmIEJvb2xlYW4oaXNUeXBlQXJyYXkpID09PSBCb29sZWFuKGlzVmFsdWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSBvW2tleV0uY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9ba2V5XSA9PT0gdW5kZWZpbmVkICYmIGlzVHlwZUFycmF5KSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gaXNWYWx1ZUFycmF5ID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHVwbGljYXRlICYmICEob1trZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpIHx8XG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGV4dGVuZEFsaWFzZXMoLi4uYXJncykge1xuICAgICAgICAgICAgYXJncy5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhvYmogfHwge30pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MuYWxpYXNlc1trZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0gPSBbXS5jb25jYXQoYWxpYXNlc1trZXldIHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmNvbmNhdChrZXkpLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvLS8udGVzdCh4KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGNhbWVsQ2FzZSh4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPT0ga2V5ICYmIGZsYWdzLmFsaWFzZXNba2V5XS5pbmRleE9mKGMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0ucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWxpYXNlc1tjXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmNvbmNhdChrZXkpLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4Lmxlbmd0aCA+IDEgJiYgL1tBLVpdLy50ZXN0KHgpICYmIGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gZGVjYW1lbGl6ZSh4LCAnLScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICE9PSBrZXkgJiYgZmxhZ3MuYWxpYXNlc1trZXldLmluZGV4T2YoYykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBbGlhc2VzW2NdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0uZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1t4XSA9IFtrZXldLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0uZmlsdGVyKGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggIT09IHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZykge1xuICAgICAgICAgICAgY29uc3QgdG9DaGVjayA9IFtdLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0gfHwgW10sIGtleSk7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmxhZyk7XG4gICAgICAgICAgICBjb25zdCBzZXRBbGlhcyA9IHRvQ2hlY2suZmluZChrZXkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKTtcbiAgICAgICAgICAgIHJldHVybiBzZXRBbGlhcyA/IGZsYWdbc2V0QWxpYXNdIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzQW55RmxhZyhrZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsYWdzS2V5cyA9IE9iamVjdC5rZXlzKGZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoZmxhZ3NLZXlzLm1hcChrID0+IGZsYWdzW2tdKSk7XG4gICAgICAgICAgICByZXR1cm4gdG9DaGVjay5zb21lKGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmxhZykgPyBmbGFnLmluY2x1ZGVzKGtleSkgOiBmbGFnW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYXNGbGFnc01hdGNoaW5nKGFyZywgLi4ucGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoLi4ucGF0dGVybnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2suc29tZShmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gYXJnLm1hdGNoKHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaCAmJiBoYXNBbnlGbGFnKG1hdGNoWzFdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0FsbFNob3J0RmxhZ3MoYXJnKSB7XG4gICAgICAgICAgICBpZiAoYXJnLm1hdGNoKG5lZ2F0aXZlKSB8fCAhYXJnLm1hdGNoKC9eLVteLV0rLykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaGFzQWxsRmxhZ3MgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IG5leHQ7XG4gICAgICAgICAgICBjb25zdCBsZXR0ZXJzID0gYXJnLnNsaWNlKDEpLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmcuc2xpY2UoaiArIDIpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzQW55RmxhZyhsZXR0ZXJzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNBbGxGbGFncyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChsZXR0ZXJzW2ogKyAxXSAmJiBsZXR0ZXJzW2ogKyAxXSA9PT0gJz0nKSB8fFxuICAgICAgICAgICAgICAgICAgICBuZXh0ID09PSAnLScgfHxcbiAgICAgICAgICAgICAgICAgICAgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJiAvXi0/XFxkKyhcXC5cXGQqKT8oZS0/XFxkKyk/JC8udGVzdChuZXh0KSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhc0FsbEZsYWdzO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVW5rbm93bk9wdGlvbkFzQXJnKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25bJ3Vua25vd24tb3B0aW9ucy1hcy1hcmdzJ10gJiYgaXNVbmtub3duT3B0aW9uKGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaXNVbmtub3duT3B0aW9uKGFyZykge1xuICAgICAgICAgICAgYXJnID0gYXJnLnJlcGxhY2UoL14tezMsfS8sICctLScpO1xuICAgICAgICAgICAgaWYgKGFyZy5tYXRjaChuZWdhdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzQWxsU2hvcnRGbGFncyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmxhZ1dpdGhFcXVhbHMgPSAvXi0rKFtePV0rPyk9W1xcc1xcU10qJC87XG4gICAgICAgICAgICBjb25zdCBub3JtYWxGbGFnID0gL14tKyhbXj1dKz8pJC87XG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5IeXBoZW4gPSAvXi0rKFtePV0rPyktJC87XG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5EaWdpdHMgPSAvXi0rKFtePV0rP1xcZCspJC87XG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyA9IC9eLSsoW149XSs/KVxcVysuKiQvO1xuICAgICAgICAgICAgcmV0dXJuICFoYXNGbGFnc01hdGNoaW5nKGFyZywgZmxhZ1dpdGhFcXVhbHMsIG5lZ2F0ZWRCb29sZWFuLCBub3JtYWxGbGFnLCBmbGFnRW5kaW5nSW5IeXBoZW4sIGZsYWdFbmRpbmdJbkRpZ2l0cywgZmxhZ0VuZGluZ0luTm9uV29yZENoYXJhY3RlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZShrZXkpIHtcbiAgICAgICAgICAgIGlmICghY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmXG4gICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykgJiZcbiAgICAgICAgICAgICAgICBgJHtrZXl9YCBpbiBkZWZhdWx0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRGb3JUeXBlKGd1ZXNzVHlwZShrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBkZWZhdWx0Rm9yVHlwZSh0eXBlKSB7XG4gICAgICAgICAgICBjb25zdCBkZWYgPSB7XG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU5dOiB0cnVlLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5TVFJJTkddOiAnJyxcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuTlVNQkVSXTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5BUlJBWV06IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGRlZlt0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBndWVzc1R5cGUoa2V5KSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU47XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Muc3RyaW5ncykpXG4gICAgICAgICAgICAgICAgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LlNUUklORztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm51bWJlcnMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5OVU1CRVI7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykpXG4gICAgICAgICAgICAgICAgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU47XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5BUlJBWTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKG51bSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bSA9PT0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrQ29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZmluZChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgY29uZmlndXJhdGlvbjogJXMsIG9wdHMuY291bnQgZXhjbHVkZXMgb3B0cy5hcnJheS4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb246ICVzLCBvcHRzLmNvdW50IGV4Y2x1ZGVzIG9wdHMubmFyZy4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGlhc2VzOiBPYmplY3QuYXNzaWduKHt9LCBmbGFncy5hbGlhc2VzKSxcbiAgICAgICAgICAgIGFyZ3Y6IE9iamVjdC5hc3NpZ24oYXJndlJldHVybiwgYXJndiksXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdGVkOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0ZWQpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgbmV3QWxpYXNlczogT2JqZWN0LmFzc2lnbih7fSwgbmV3QWxpYXNlcylcbiAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21iaW5lQWxpYXNlcyhhbGlhc2VzKSB7XG4gICAgY29uc3QgYWxpYXNBcnJheXMgPSBbXTtcbiAgICBjb25zdCBjb21iaW5lZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGNoYW5nZSA9IHRydWU7XG4gICAgT2JqZWN0LmtleXMoYWxpYXNlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGFsaWFzQXJyYXlzLnB1c2goW10uY29uY2F0KGFsaWFzZXNba2V5XSwga2V5KSk7XG4gICAgfSk7XG4gICAgd2hpbGUgKGNoYW5nZSkge1xuICAgICAgICBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaWkgPSBpICsgMTsgaWkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBhbGlhc0FycmF5c1tpXS5maWx0ZXIoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzQXJyYXlzW2lpXS5pbmRleE9mKHYpICE9PSAtMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5c1tpXSA9IGFsaWFzQXJyYXlzW2ldLmNvbmNhdChhbGlhc0FycmF5c1tpaV0pO1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5cy5zcGxpY2UoaWksIDEpO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWxpYXNBcnJheXMuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXNBcnJheSkge1xuICAgICAgICBhbGlhc0FycmF5ID0gYWxpYXNBcnJheS5maWx0ZXIoZnVuY3Rpb24gKHYsIGksIHNlbGYpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmluZGV4T2YodikgPT09IGk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBsYXN0QWxpYXMgPSBhbGlhc0FycmF5LnBvcCgpO1xuICAgICAgICBpZiAobGFzdEFsaWFzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGxhc3RBbGlhcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbWJpbmVkW2xhc3RBbGlhc10gPSBhbGlhc0FycmF5O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbWJpbmVkO1xufVxuZnVuY3Rpb24gaW5jcmVtZW50KG9yaWcpIHtcbiAgICByZXR1cm4gb3JpZyAhPT0gdW5kZWZpbmVkID8gb3JpZyArIDEgOiAxO1xufVxuZnVuY3Rpb24gc2FuaXRpemVLZXkoa2V5KSB7XG4gICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycpXG4gICAgICAgIHJldHVybiAnX19fcHJvdG9fX18nO1xuICAgIHJldHVybiBrZXk7XG59XG5mdW5jdGlvbiBzdHJpcFF1b3Rlcyh2YWwpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICh2YWxbMF0gPT09IFwiJ1wiIHx8IHZhbFswXSA9PT0gJ1wiJykgJiZcbiAgICAgICAgdmFsW3ZhbC5sZW5ndGggLSAxXSA9PT0gdmFsWzBdKVxuICAgICAgICA/IHZhbC5zdWJzdHJpbmcoMSwgdmFsLmxlbmd0aCAtIDEpXG4gICAgICAgIDogdmFsO1xufVxuXG52YXIgX2EsIF9iLCBfYztcbmNvbnN0IG1pbk5vZGVWZXJzaW9uID0gKHByb2Nlc3MgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuWUFSR1NfTUlOX05PREVfVkVSU0lPTilcbiAgICA/IE51bWJlcihwcm9jZXNzLmVudi5ZQVJHU19NSU5fTk9ERV9WRVJTSU9OKVxuICAgIDogMTI7XG5jb25zdCBub2RlVmVyc2lvbiA9IChfYiA9IChfYSA9IHByb2Nlc3MgPT09IG51bGwgfHwgcHJvY2VzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvY2Vzcy52ZXJzaW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vZGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IChfYyA9IHByb2Nlc3MgPT09IG51bGwgfHwgcHJvY2VzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvY2Vzcy52ZXJzaW9uKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Muc2xpY2UoMSk7XG5pZiAobm9kZVZlcnNpb24pIHtcbiAgICBjb25zdCBtYWpvciA9IE51bWJlcihub2RlVmVyc2lvbi5tYXRjaCgvXihbXi5dKykvKVsxXSk7XG4gICAgaWYgKG1ham9yIDwgbWluTm9kZVZlcnNpb24pIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYHlhcmdzIHBhcnNlciBzdXBwb3J0cyBhIG1pbmltdW0gTm9kZS5qcyB2ZXJzaW9uIG9mICR7bWluTm9kZVZlcnNpb259LiBSZWFkIG91ciB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5OiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3MtcGFyc2VyI3N1cHBvcnRlZC1ub2RlanMtdmVyc2lvbnNgKTtcbiAgICB9XG59XG5jb25zdCBlbnYgPSBwcm9jZXNzID8gcHJvY2Vzcy5lbnYgOiB7fTtcbmNvbnN0IHBhcnNlciA9IG5ldyBZYXJnc1BhcnNlcih7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCxcbiAgICBlbnY6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGVudjtcbiAgICB9LFxuICAgIGZvcm1hdDogdXRpbC5mb3JtYXQsXG4gICAgbm9ybWFsaXplOiBwYXRoLm5vcm1hbGl6ZSxcbiAgICByZXNvbHZlOiBwYXRoLnJlc29sdmUsXG4gICAgcmVxdWlyZTogKHBhdGgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF0aC5tYXRjaCgvXFwuanNvbiQvKSkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgsICd1dGY4JykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ29ubHkgLmpzb24gY29uZmlnIGZpbGVzIGFyZSBzdXBwb3J0ZWQgaW4gRVNNJyk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbmNvbnN0IHlhcmdzUGFyc2VyID0gZnVuY3Rpb24gUGFyc2VyKGFyZ3MsIG9wdHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIucGFyc2UoYXJncy5zbGljZSgpLCBvcHRzKTtcbiAgICByZXR1cm4gcmVzdWx0LmFyZ3Y7XG59O1xueWFyZ3NQYXJzZXIuZGV0YWlsZWQgPSBmdW5jdGlvbiAoYXJncywgb3B0cykge1xuICAgIHJldHVybiBwYXJzZXIucGFyc2UoYXJncy5zbGljZSgpLCBvcHRzKTtcbn07XG55YXJnc1BhcnNlci5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG55YXJnc1BhcnNlci5kZWNhbWVsaXplID0gZGVjYW1lbGl6ZTtcbnlhcmdzUGFyc2VyLmxvb2tzTGlrZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcjtcblxubW9kdWxlLmV4cG9ydHMgPSB5YXJnc1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO3ZhciB0PXJlcXVpcmUoXCJhc3NlcnRcIik7Y2xhc3MgZSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHR8fFwieWFyZ3MgZXJyb3JcIiksdGhpcy5uYW1lPVwiWUVycm9yXCIsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsZSl9fWxldCBzLGk9W107ZnVuY3Rpb24gbih0LG8sYSxoKXtzPWg7bGV0IGw9e307aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsXCJleHRlbmRzXCIpKXtpZihcInN0cmluZ1wiIT10eXBlb2YgdC5leHRlbmRzKXJldHVybiBsO2NvbnN0IHI9L1xcLmpzb258XFwuLipyYyQvLnRlc3QodC5leHRlbmRzKTtsZXQgaD1udWxsO2lmKHIpaD1mdW5jdGlvbih0LGUpe3JldHVybiBzLnBhdGgucmVzb2x2ZSh0LGUpfShvLHQuZXh0ZW5kcyk7ZWxzZSB0cnl7aD1yZXF1aXJlLnJlc29sdmUodC5leHRlbmRzKX1jYXRjaChlKXtyZXR1cm4gdH0hZnVuY3Rpb24odCl7aWYoaS5pbmRleE9mKHQpPi0xKXRocm93IG5ldyBlKGBDaXJjdWxhciBleHRlbmRlZCBjb25maWd1cmF0aW9uczogJyR7dH0nLmApfShoKSxpLnB1c2goaCksbD1yP0pTT04ucGFyc2Uocy5yZWFkRmlsZVN5bmMoaCxcInV0ZjhcIikpOnJlcXVpcmUodC5leHRlbmRzKSxkZWxldGUgdC5leHRlbmRzLGw9bihsLHMucGF0aC5kaXJuYW1lKGgpLGEscyl9cmV0dXJuIGk9W10sYT9yKGwsdCk6T2JqZWN0LmFzc2lnbih7fSxsLHQpfWZ1bmN0aW9uIHIodCxlKXtjb25zdCBzPXt9O2Z1bmN0aW9uIGkodCl7cmV0dXJuIHQmJlwib2JqZWN0XCI9PXR5cGVvZiB0JiYhQXJyYXkuaXNBcnJheSh0KX1PYmplY3QuYXNzaWduKHMsdCk7Zm9yKGNvbnN0IG4gb2YgT2JqZWN0LmtleXMoZSkpaShlW25dKSYmaShzW25dKT9zW25dPXIodFtuXSxlW25dKTpzW25dPWVbbl07cmV0dXJuIHN9ZnVuY3Rpb24gbyh0KXtjb25zdCBlPXQucmVwbGFjZSgvXFxzezIsfS9nLFwiIFwiKS5zcGxpdCgvXFxzKyg/IVteW10qXXxbXjxdKj4pLykscz0vXFwuKltcXF1bPD5dL2csaT1lLnNoaWZ0KCk7aWYoIWkpdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIGZvdW5kIGluOiAke3R9YCk7Y29uc3Qgbj17Y21kOmkucmVwbGFjZShzLFwiXCIpLGRlbWFuZGVkOltdLG9wdGlvbmFsOltdfTtyZXR1cm4gZS5mb3JFYWNoKCgodCxpKT0+e2xldCByPSExO3Q9dC5yZXBsYWNlKC9cXHMvZyxcIlwiKSwvXFwuK1tcXF0+XS8udGVzdCh0KSYmaT09PWUubGVuZ3RoLTEmJihyPSEwKSwvXlxcWy8udGVzdCh0KT9uLm9wdGlvbmFsLnB1c2goe2NtZDp0LnJlcGxhY2UocyxcIlwiKS5zcGxpdChcInxcIiksdmFyaWFkaWM6cn0pOm4uZGVtYW5kZWQucHVzaCh7Y21kOnQucmVwbGFjZShzLFwiXCIpLnNwbGl0KFwifFwiKSx2YXJpYWRpYzpyfSl9KSksbn1jb25zdCBhPVtcImZpcnN0XCIsXCJzZWNvbmRcIixcInRoaXJkXCIsXCJmb3VydGhcIixcImZpZnRoXCIsXCJzaXh0aFwiXTtmdW5jdGlvbiBoKHQscyxpKXt0cnl7bGV0IG49MDtjb25zdFtyLGEsaF09XCJvYmplY3RcIj09dHlwZW9mIHQ/W3tkZW1hbmRlZDpbXSxvcHRpb25hbDpbXX0sdCxzXTpbbyhgY21kICR7dH1gKSxzLGldLGY9W10uc2xpY2UuY2FsbChhKTtmb3IoO2YubGVuZ3RoJiZ2b2lkIDA9PT1mW2YubGVuZ3RoLTFdOylmLnBvcCgpO2NvbnN0IGQ9aHx8Zi5sZW5ndGg7aWYoZDxyLmRlbWFuZGVkLmxlbmd0aCl0aHJvdyBuZXcgZShgTm90IGVub3VnaCBhcmd1bWVudHMgcHJvdmlkZWQuIEV4cGVjdGVkICR7ci5kZW1hbmRlZC5sZW5ndGh9IGJ1dCByZWNlaXZlZCAke2YubGVuZ3RofS5gKTtjb25zdCB1PXIuZGVtYW5kZWQubGVuZ3RoK3Iub3B0aW9uYWwubGVuZ3RoO2lmKGQ+dSl0aHJvdyBuZXcgZShgVG9vIG1hbnkgYXJndW1lbnRzIHByb3ZpZGVkLiBFeHBlY3RlZCBtYXggJHt1fSBidXQgcmVjZWl2ZWQgJHtkfS5gKTtyLmRlbWFuZGVkLmZvckVhY2goKHQ9Pntjb25zdCBlPWwoZi5zaGlmdCgpKTswPT09dC5jbWQuZmlsdGVyKCh0PT50PT09ZXx8XCIqXCI9PT10KSkubGVuZ3RoJiZjKGUsdC5jbWQsbiksbis9MX0pKSxyLm9wdGlvbmFsLmZvckVhY2goKHQ9PntpZigwPT09Zi5sZW5ndGgpcmV0dXJuO2NvbnN0IGU9bChmLnNoaWZ0KCkpOzA9PT10LmNtZC5maWx0ZXIoKHQ9PnQ9PT1lfHxcIipcIj09PXQpKS5sZW5ndGgmJmMoZSx0LmNtZCxuKSxuKz0xfSkpfWNhdGNoKHQpe2NvbnNvbGUud2Fybih0LnN0YWNrKX19ZnVuY3Rpb24gbCh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT9cImFycmF5XCI6bnVsbD09PXQ/XCJudWxsXCI6dHlwZW9mIHR9ZnVuY3Rpb24gYyh0LHMsaSl7dGhyb3cgbmV3IGUoYEludmFsaWQgJHthW2ldfHxcIm1hbnlpdGhcIn0gYXJndW1lbnQuIEV4cGVjdGVkICR7cy5qb2luKFwiIG9yIFwiKX0gYnV0IHJlY2VpdmVkICR7dH0uYCl9ZnVuY3Rpb24gZih0KXtyZXR1cm4hIXQmJiEhdC50aGVuJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnRoZW59ZnVuY3Rpb24gZCh0LGUscyxpKXtzLmFzc2VydC5ub3RTdHJpY3RFcXVhbCh0LGUsaSl9ZnVuY3Rpb24gdSh0LGUpe2UuYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiB0LFwic3RyaW5nXCIpfWZ1bmN0aW9uIHAodCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpfWZ1bmN0aW9uIGcodD17fSxlPSgoKT0+ITApKXtjb25zdCBzPXt9O3JldHVybiBwKHQpLmZvckVhY2goKGk9PntlKGksdFtpXSkmJihzW2ldPXRbaV0pfSkpLHN9ZnVuY3Rpb24gbSgpe3JldHVybiBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uJiYhcHJvY2Vzcy5kZWZhdWx0QXBwPzA6MX1mdW5jdGlvbiB5KCl7cmV0dXJuIHByb2Nlc3MuYXJndlttKCldfXZhciBiPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGhpZGVCaW46ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2xpY2UobSgpKzEpfSxnZXRQcm9jZXNzQXJndkJpbjp5fSk7ZnVuY3Rpb24gdih0LGUscyxpKXtpZihcImFcIj09PXMmJiFpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZT90IT09ZXx8IWk6IWUuaGFzKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7cmV0dXJuXCJtXCI9PT1zP2k6XCJhXCI9PT1zP2kuY2FsbCh0KTppP2kudmFsdWU6ZS5nZXQodCl9ZnVuY3Rpb24gTyh0LGUscyxpLG4pe2lmKFwibVwiPT09aSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO2lmKFwiYVwiPT09aSYmIW4pdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBlP3QhPT1lfHwhbjohZS5oYXModCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO3JldHVyblwiYVwiPT09aT9uLmNhbGwodCxzKTpuP24udmFsdWU9czplLnNldCh0LHMpLHN9Y2xhc3Mgd3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmdsb2JhbE1pZGRsZXdhcmU9W10sdGhpcy5mcm96ZW5zPVtdLHRoaXMueWFyZ3M9dH1hZGRNaWRkbGV3YXJlKHQsZSxzPSEwLGk9ITEpe2lmKGgoXCI8YXJyYXl8ZnVuY3Rpb24+IFtib29sZWFuXSBbYm9vbGVhbl0gW2Jvb2xlYW5dXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSxBcnJheS5pc0FycmF5KHQpKXtmb3IobGV0IGk9MDtpPHQubGVuZ3RoO2krKyl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdFtpXSl0aHJvdyBFcnJvcihcIm1pZGRsZXdhcmUgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO2NvbnN0IG49dFtpXTtuLmFwcGx5QmVmb3JlVmFsaWRhdGlvbj1lLG4uZ2xvYmFsPXN9QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5nbG9iYWxNaWRkbGV3YXJlLHQpfWVsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdCl7Y29uc3Qgbj10O24uYXBwbHlCZWZvcmVWYWxpZGF0aW9uPWUsbi5nbG9iYWw9cyxuLm11dGF0ZXM9aSx0aGlzLmdsb2JhbE1pZGRsZXdhcmUucHVzaCh0KX1yZXR1cm4gdGhpcy55YXJnc31hZGRDb2VyY2VNaWRkbGV3YXJlKHQsZSl7Y29uc3Qgcz10aGlzLnlhcmdzLmdldEFsaWFzZXMoKTtyZXR1cm4gdGhpcy5nbG9iYWxNaWRkbGV3YXJlPXRoaXMuZ2xvYmFsTWlkZGxld2FyZS5maWx0ZXIoKHQ9Pntjb25zdCBpPVsuLi5zW2VdfHxbXSxlXTtyZXR1cm4hdC5vcHRpb258fCFpLmluY2x1ZGVzKHQub3B0aW9uKX0pKSx0Lm9wdGlvbj1lLHRoaXMuYWRkTWlkZGxld2FyZSh0LCEwLCEwLCEwKX1nZXRNaWRkbGV3YXJlKCl7cmV0dXJuIHRoaXMuZ2xvYmFsTWlkZGxld2FyZX1mcmVlemUoKXt0aGlzLmZyb3plbnMucHVzaChbLi4udGhpcy5nbG9iYWxNaWRkbGV3YXJlXSl9dW5mcmVlemUoKXtjb25zdCB0PXRoaXMuZnJvemVucy5wb3AoKTt2b2lkIDAhPT10JiYodGhpcy5nbG9iYWxNaWRkbGV3YXJlPXQpfXJlc2V0KCl7dGhpcy5nbG9iYWxNaWRkbGV3YXJlPXRoaXMuZ2xvYmFsTWlkZGxld2FyZS5maWx0ZXIoKHQ9PnQuZ2xvYmFsKSl9fWZ1bmN0aW9uIEModCxlLHMsaSl7cmV0dXJuIHMucmVkdWNlKCgodCxzKT0+e2lmKHMuYXBwbHlCZWZvcmVWYWxpZGF0aW9uIT09aSlyZXR1cm4gdDtpZihzLm11dGF0ZXMpe2lmKHMuYXBwbGllZClyZXR1cm4gdDtzLmFwcGxpZWQ9ITB9aWYoZih0KSlyZXR1cm4gdC50aGVuKCh0PT5Qcm9taXNlLmFsbChbdCxzKHQsZSldKSkpLnRoZW4oKChbdCxlXSk9Pk9iamVjdC5hc3NpZ24odCxlKSkpO3tjb25zdCBpPXModCxlKTtyZXR1cm4gZihpKT9pLnRoZW4oKGU9Pk9iamVjdC5hc3NpZ24odCxlKSkpOk9iamVjdC5hc3NpZ24odCxpKX19KSx0KX1mdW5jdGlvbiBqKHQsZSxzPSh0PT57dGhyb3cgdH0pKXt0cnl7Y29uc3Qgcz1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3QoKTp0O3JldHVybiBmKHMpP3MudGhlbigodD0+ZSh0KSkpOmUocyl9Y2F0Y2godCl7cmV0dXJuIHModCl9fWNvbnN0IE09LyheXFwqKXwoXlxcJDApLztjbGFzcyBfe2NvbnN0cnVjdG9yKHQsZSxzLGkpe3RoaXMucmVxdWlyZUNhY2hlPW5ldyBTZXQsdGhpcy5oYW5kbGVycz17fSx0aGlzLmFsaWFzTWFwPXt9LHRoaXMuZnJvemVucz1bXSx0aGlzLnNoaW09aSx0aGlzLnVzYWdlPXQsdGhpcy5nbG9iYWxNaWRkbGV3YXJlPXMsdGhpcy52YWxpZGF0aW9uPWV9YWRkRGlyZWN0b3J5KHQsZSxzLGkpe1wiYm9vbGVhblwiIT10eXBlb2YoaT1pfHx7fSkucmVjdXJzZSYmKGkucmVjdXJzZT0hMSksQXJyYXkuaXNBcnJheShpLmV4dGVuc2lvbnMpfHwoaS5leHRlbnNpb25zPVtcImpzXCJdKTtjb25zdCBuPVwiZnVuY3Rpb25cIj09dHlwZW9mIGkudmlzaXQ/aS52aXNpdDp0PT50O2kudmlzaXQ9KHQsZSxzKT0+e2NvbnN0IGk9bih0LGUscyk7aWYoaSl7aWYodGhpcy5yZXF1aXJlQ2FjaGUuaGFzKGUpKXJldHVybiBpO3RoaXMucmVxdWlyZUNhY2hlLmFkZChlKSx0aGlzLmFkZEhhbmRsZXIoaSl9cmV0dXJuIGl9LHRoaXMuc2hpbS5yZXF1aXJlRGlyZWN0b3J5KHtyZXF1aXJlOmUsZmlsZW5hbWU6c30sdCxpKX1hZGRIYW5kbGVyKHQsZSxzLGksbixyKXtsZXQgYT1bXTtjb25zdCBoPWZ1bmN0aW9uKHQpe3JldHVybiB0P3QubWFwKCh0PT4odC5hcHBseUJlZm9yZVZhbGlkYXRpb249ITEsdCkpKTpbXX0obik7aWYoaT1pfHwoKCk9Pnt9KSxBcnJheS5pc0FycmF5KHQpKWlmKGZ1bmN0aW9uKHQpe3JldHVybiB0LmV2ZXJ5KCh0PT5cInN0cmluZ1wiPT10eXBlb2YgdCkpfSh0KSlbdCwuLi5hXT10O2Vsc2UgZm9yKGNvbnN0IGUgb2YgdCl0aGlzLmFkZEhhbmRsZXIoZSk7ZWxzZXtpZihmdW5jdGlvbih0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdCYmIUFycmF5LmlzQXJyYXkodCl9KHQpKXtsZXQgZT1BcnJheS5pc0FycmF5KHQuY29tbWFuZCl8fFwic3RyaW5nXCI9PXR5cGVvZiB0LmNvbW1hbmQ/dC5jb21tYW5kOnRoaXMubW9kdWxlTmFtZSh0KTtyZXR1cm4gdC5hbGlhc2VzJiYoZT1bXS5jb25jYXQoZSkuY29uY2F0KHQuYWxpYXNlcykpLHZvaWQgdGhpcy5hZGRIYW5kbGVyKGUsdGhpcy5leHRyYWN0RGVzYyh0KSx0LmJ1aWxkZXIsdC5oYW5kbGVyLHQubWlkZGxld2FyZXMsdC5kZXByZWNhdGVkKX1pZihrKHMpKXJldHVybiB2b2lkIHRoaXMuYWRkSGFuZGxlcihbdF0uY29uY2F0KGEpLGUscy5idWlsZGVyLHMuaGFuZGxlcixzLm1pZGRsZXdhcmVzLHMuZGVwcmVjYXRlZCl9aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe2NvbnN0IG49byh0KTthPWEubWFwKCh0PT5vKHQpLmNtZCkpO2xldCBsPSExO2NvbnN0IGM9W24uY21kXS5jb25jYXQoYSkuZmlsdGVyKCh0PT4hTS50ZXN0KHQpfHwobD0hMCwhMSkpKTswPT09Yy5sZW5ndGgmJmwmJmMucHVzaChcIiQwXCIpLGwmJihuLmNtZD1jWzBdLGE9Yy5zbGljZSgxKSx0PXQucmVwbGFjZShNLG4uY21kKSksYS5mb3JFYWNoKCh0PT57dGhpcy5hbGlhc01hcFt0XT1uLmNtZH0pKSwhMSE9PWUmJnRoaXMudXNhZ2UuY29tbWFuZCh0LGUsbCxhLHIpLHRoaXMuaGFuZGxlcnNbbi5jbWRdPXtvcmlnaW5hbDp0LGRlc2NyaXB0aW9uOmUsaGFuZGxlcjppLGJ1aWxkZXI6c3x8e30sbWlkZGxld2FyZXM6aCxkZXByZWNhdGVkOnIsZGVtYW5kZWQ6bi5kZW1hbmRlZCxvcHRpb25hbDpuLm9wdGlvbmFsfSxsJiYodGhpcy5kZWZhdWx0Q29tbWFuZD10aGlzLmhhbmRsZXJzW24uY21kXSl9fWdldENvbW1hbmRIYW5kbGVycygpe3JldHVybiB0aGlzLmhhbmRsZXJzfWdldENvbW1hbmRzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaGFuZGxlcnMpLmNvbmNhdChPYmplY3Qua2V5cyh0aGlzLmFsaWFzTWFwKSl9aGFzRGVmYXVsdENvbW1hbmQoKXtyZXR1cm4hIXRoaXMuZGVmYXVsdENvbW1hbmR9cnVuQ29tbWFuZCh0LGUscyxpLG4scil7Y29uc3Qgbz10aGlzLmhhbmRsZXJzW3RdfHx0aGlzLmhhbmRsZXJzW3RoaXMuYWxpYXNNYXBbdF1dfHx0aGlzLmRlZmF1bHRDb21tYW5kLGE9ZS5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCksaD1hLmNvbW1hbmRzLnNsaWNlKCksbD0hdDt0JiYoYS5jb21tYW5kcy5wdXNoKHQpLGEuZnVsbENvbW1hbmRzLnB1c2goby5vcmlnaW5hbCkpO2NvbnN0IGM9dGhpcy5hcHBseUJ1aWxkZXJVcGRhdGVVc2FnZUFuZFBhcnNlKGwsbyxlLHMuYWxpYXNlcyxoLGksbixyKTtyZXR1cm4gZihjKT9jLnRoZW4oKHQ9PnRoaXMuYXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0KGwsbyx0LmlubmVyQXJndixhLG4sdC5hbGlhc2VzLGUpKSk6dGhpcy5hcHBseU1pZGRsZXdhcmVBbmRHZXRSZXN1bHQobCxvLGMuaW5uZXJBcmd2LGEsbixjLmFsaWFzZXMsZSl9YXBwbHlCdWlsZGVyVXBkYXRlVXNhZ2VBbmRQYXJzZSh0LGUscyxpLG4scixvLGEpe2NvbnN0IGg9ZS5idWlsZGVyO2xldCBsPXM7aWYoeChoKSl7cy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkuZnJlZXplKCk7Y29uc3QgYz1oKHMuZ2V0SW50ZXJuYWxNZXRob2RzKCkucmVzZXQoaSksYSk7aWYoZihjKSlyZXR1cm4gYy50aGVuKChpPT57dmFyIGE7cmV0dXJuIGw9KGE9aSkmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGEuZ2V0SW50ZXJuYWxNZXRob2RzP2k6cyx0aGlzLnBhcnNlQW5kVXBkYXRlVXNhZ2UodCxlLGwsbixyLG8pfSkpfWVsc2UoZnVuY3Rpb24odCl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIHR9KShoKSYmKHMuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmZyZWV6ZSgpLGw9cy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5yZXNldChpKSxPYmplY3Qua2V5cyhlLmJ1aWxkZXIpLmZvckVhY2goKHQ9PntsLm9wdGlvbih0LGhbdF0pfSkpKTtyZXR1cm4gdGhpcy5wYXJzZUFuZFVwZGF0ZVVzYWdlKHQsZSxsLG4scixvKX1wYXJzZUFuZFVwZGF0ZVVzYWdlKHQsZSxzLGksbixyKXt0JiZzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS51bmZyZWV6ZSghMCksdGhpcy5zaG91bGRVcGRhdGVVc2FnZShzKSYmcy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkudXNhZ2UodGhpcy51c2FnZUZyb21QYXJlbnRDb21tYW5kc0NvbW1hbmRIYW5kbGVyKGksZSksZS5kZXNjcmlwdGlvbik7Y29uc3Qgbz1zLmdldEludGVybmFsTWV0aG9kcygpLnJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzKG51bGwsdm9pZCAwLCEwLG4scik7cmV0dXJuIGYobyk/by50aGVuKCh0PT4oe2FsaWFzZXM6cy5wYXJzZWQuYWxpYXNlcyxpbm5lckFyZ3Y6dH0pKSk6e2FsaWFzZXM6cy5wYXJzZWQuYWxpYXNlcyxpbm5lckFyZ3Y6b319c2hvdWxkVXBkYXRlVXNhZ2UodCl7cmV0dXJuIXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmdldFVzYWdlRGlzYWJsZWQoKSYmMD09PXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmdldFVzYWdlKCkubGVuZ3RofXVzYWdlRnJvbVBhcmVudENvbW1hbmRzQ29tbWFuZEhhbmRsZXIodCxlKXtjb25zdCBzPU0udGVzdChlLm9yaWdpbmFsKT9lLm9yaWdpbmFsLnJlcGxhY2UoTSxcIlwiKS50cmltKCk6ZS5vcmlnaW5hbCxpPXQuZmlsdGVyKCh0PT4hTS50ZXN0KHQpKSk7cmV0dXJuIGkucHVzaChzKSxgJDAgJHtpLmpvaW4oXCIgXCIpfWB9aGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdCh0LGUscyxpLG4scixvLGEpe2lmKCFyLmdldEludGVybmFsTWV0aG9kcygpLmdldEhhc091dHB1dCgpKXtjb25zdCBlPXIuZ2V0SW50ZXJuYWxNZXRob2RzKCkucnVuVmFsaWRhdGlvbihuLGEsci5wYXJzZWQuZXJyb3IsdCk7cz1qKHMsKHQ9PihlKHQpLHQpKSl9aWYoZS5oYW5kbGVyJiYhci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRIYXNPdXRwdXQoKSl7ci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5zZXRIYXNPdXRwdXQoKTtjb25zdCBpPSEhci5nZXRPcHRpb25zKCkuY29uZmlndXJhdGlvbltcInBvcHVsYXRlLS1cIl07ci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5wb3N0UHJvY2VzcyhzLGksITEsITEpLHM9aihzPUMocyxyLG8sITEpLCh0PT57Y29uc3Qgcz1lLmhhbmRsZXIodCk7cmV0dXJuIGYocyk/cy50aGVuKCgoKT0+dCkpOnR9KSksdHx8ci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkuY2FjaGVIZWxwTWVzc2FnZSgpLGYocykmJiFyLmdldEludGVybmFsTWV0aG9kcygpLmhhc1BhcnNlQ2FsbGJhY2soKSYmcy5jYXRjaCgodD0+e3RyeXtyLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5mYWlsKG51bGwsdCl9Y2F0Y2godCl7fX0pKX1yZXR1cm4gdHx8KGkuY29tbWFuZHMucG9wKCksaS5mdWxsQ29tbWFuZHMucG9wKCkpLHN9YXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0KHQsZSxzLGksbixyLG8pe2xldCBhPXt9O2lmKG4pcmV0dXJuIHM7by5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRIYXNPdXRwdXQoKXx8KGE9dGhpcy5wb3B1bGF0ZVBvc2l0aW9uYWxzKGUscyxpLG8pKTtjb25zdCBoPXRoaXMuZ2xvYmFsTWlkZGxld2FyZS5nZXRNaWRkbGV3YXJlKCkuc2xpY2UoMCkuY29uY2F0KGUubWlkZGxld2FyZXMpLGw9QyhzLG8saCwhMCk7cmV0dXJuIGYobCk/bC50aGVuKChzPT50aGlzLmhhbmRsZVZhbGlkYXRpb25BbmRHZXRSZXN1bHQodCxlLHMsaSxyLG8saCxhKSkpOnRoaXMuaGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdCh0LGUsbCxpLHIsbyxoLGEpfXBvcHVsYXRlUG9zaXRpb25hbHModCxlLHMsaSl7ZS5fPWUuXy5zbGljZShzLmNvbW1hbmRzLmxlbmd0aCk7Y29uc3Qgbj10LmRlbWFuZGVkLnNsaWNlKDApLHI9dC5vcHRpb25hbC5zbGljZSgwKSxvPXt9O2Zvcih0aGlzLnZhbGlkYXRpb24ucG9zaXRpb25hbENvdW50KG4ubGVuZ3RoLGUuXy5sZW5ndGgpO24ubGVuZ3RoOyl7Y29uc3QgdD1uLnNoaWZ0KCk7dGhpcy5wb3B1bGF0ZVBvc2l0aW9uYWwodCxlLG8pfWZvcig7ci5sZW5ndGg7KXtjb25zdCB0PXIuc2hpZnQoKTt0aGlzLnBvcHVsYXRlUG9zaXRpb25hbCh0LGUsbyl9cmV0dXJuIGUuXz1zLmNvbW1hbmRzLmNvbmNhdChlLl8ubWFwKCh0PT5cIlwiK3QpKSksdGhpcy5wb3N0UHJvY2Vzc1Bvc2l0aW9uYWxzKGUsbyx0aGlzLmNtZFRvUGFyc2VPcHRpb25zKHQub3JpZ2luYWwpLGkpLG99cG9wdWxhdGVQb3NpdGlvbmFsKHQsZSxzKXtjb25zdCBpPXQuY21kWzBdO3QudmFyaWFkaWM/c1tpXT1lLl8uc3BsaWNlKDApLm1hcChTdHJpbmcpOmUuXy5sZW5ndGgmJihzW2ldPVtTdHJpbmcoZS5fLnNoaWZ0KCkpXSl9Y21kVG9QYXJzZU9wdGlvbnModCl7Y29uc3QgZT17YXJyYXk6W10sZGVmYXVsdDp7fSxhbGlhczp7fSxkZW1hbmQ6e319LHM9byh0KTtyZXR1cm4gcy5kZW1hbmRlZC5mb3JFYWNoKCh0PT57Y29uc3RbcywuLi5pXT10LmNtZDt0LnZhcmlhZGljJiYoZS5hcnJheS5wdXNoKHMpLGUuZGVmYXVsdFtzXT1bXSksZS5hbGlhc1tzXT1pLGUuZGVtYW5kW3NdPSEwfSkpLHMub3B0aW9uYWwuZm9yRWFjaCgodD0+e2NvbnN0W3MsLi4uaV09dC5jbWQ7dC52YXJpYWRpYyYmKGUuYXJyYXkucHVzaChzKSxlLmRlZmF1bHRbc109W10pLGUuYWxpYXNbc109aX0pKSxlfXBvc3RQcm9jZXNzUG9zaXRpb25hbHModCxlLHMsaSl7Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LGkuZ2V0T3B0aW9ucygpKTtuLmRlZmF1bHQ9T2JqZWN0LmFzc2lnbihzLmRlZmF1bHQsbi5kZWZhdWx0KTtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhzLmFsaWFzKSluLmFsaWFzW3RdPShuLmFsaWFzW3RdfHxbXSkuY29uY2F0KHMuYWxpYXNbdF0pO24uYXJyYXk9bi5hcnJheS5jb25jYXQocy5hcnJheSksbi5jb25maWc9e307Y29uc3Qgcj1bXTtpZihPYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0PT57ZVt0XS5tYXAoKGU9PntuLmNvbmZpZ3VyYXRpb25bXCJ1bmtub3duLW9wdGlvbnMtYXMtYXJnc1wiXSYmKG4ua2V5W3RdPSEwKSxyLnB1c2goYC0tJHt0fWApLHIucHVzaChlKX0pKX0pKSwhci5sZW5ndGgpcmV0dXJuO2NvbnN0IG89T2JqZWN0LmFzc2lnbih7fSxuLmNvbmZpZ3VyYXRpb24se1wicG9wdWxhdGUtLVwiOiExfSksYT10aGlzLnNoaW0uUGFyc2VyLmRldGFpbGVkKHIsT2JqZWN0LmFzc2lnbih7fSxuLHtjb25maWd1cmF0aW9uOm99KSk7aWYoYS5lcnJvcilpLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5mYWlsKGEuZXJyb3IubWVzc2FnZSxhLmVycm9yKTtlbHNle2NvbnN0IHM9T2JqZWN0LmtleXMoZSk7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e3MucHVzaCguLi5hLmFsaWFzZXNbdF0pfSkpLE9iamVjdC5rZXlzKGEuYXJndikuZm9yRWFjaCgobj0+e3MuaW5jbHVkZXMobikmJihlW25dfHwoZVtuXT1hLmFyZ3Zbbl0pLCF0aGlzLmlzSW5Db25maWdzKGksbikmJiF0aGlzLmlzRGVmYXVsdGVkKGksbikmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYS5hcmd2LG4pJiYoQXJyYXkuaXNBcnJheSh0W25dKXx8QXJyYXkuaXNBcnJheShhLmFyZ3Zbbl0pKT90W25dPVtdLmNvbmNhdCh0W25dLGEuYXJndltuXSk6dFtuXT1hLmFyZ3Zbbl0pfSkpfX1pc0RlZmF1bHRlZCh0LGUpe2NvbnN0e2RlZmF1bHQ6c309dC5nZXRPcHRpb25zKCk7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLGUpfHxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyx0aGlzLnNoaW0uUGFyc2VyLmNhbWVsQ2FzZShlKSl9aXNJbkNvbmZpZ3ModCxlKXtjb25zdHtjb25maWdPYmplY3RzOnN9PXQuZ2V0T3B0aW9ucygpO3JldHVybiBzLnNvbWUoKHQ9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpKSl8fHMuc29tZSgodD0+T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsdGhpcy5zaGltLlBhcnNlci5jYW1lbENhc2UoZSkpKSl9cnVuRGVmYXVsdEJ1aWxkZXJPbih0KXtpZighdGhpcy5kZWZhdWx0Q29tbWFuZClyZXR1cm47aWYodGhpcy5zaG91bGRVcGRhdGVVc2FnZSh0KSl7Y29uc3QgZT1NLnRlc3QodGhpcy5kZWZhdWx0Q29tbWFuZC5vcmlnaW5hbCk/dGhpcy5kZWZhdWx0Q29tbWFuZC5vcmlnaW5hbDp0aGlzLmRlZmF1bHRDb21tYW5kLm9yaWdpbmFsLnJlcGxhY2UoL15bXltcXF08Pl0qLyxcIiQwIFwiKTt0LmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS51c2FnZShlLHRoaXMuZGVmYXVsdENvbW1hbmQuZGVzY3JpcHRpb24pfWNvbnN0IGU9dGhpcy5kZWZhdWx0Q29tbWFuZC5idWlsZGVyO2lmKHgoZSkpcmV0dXJuIGUodCwhMCk7ayhlKXx8T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgocz0+e3Qub3B0aW9uKHMsZVtzXSl9KSl9bW9kdWxlTmFtZSh0KXtjb25zdCBlPWZ1bmN0aW9uKHQpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiByZXF1aXJlKXJldHVybiBudWxsO2ZvcihsZXQgZSxzPTAsaT1PYmplY3Qua2V5cyhyZXF1aXJlLmNhY2hlKTtzPGkubGVuZ3RoO3MrKylpZihlPXJlcXVpcmUuY2FjaGVbaVtzXV0sZS5leHBvcnRzPT09dClyZXR1cm4gZTtyZXR1cm4gbnVsbH0odCk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIG5hbWUgZ2l2ZW4gZm9yIG1vZHVsZTogJHt0aGlzLnNoaW0uaW5zcGVjdCh0KX1gKTtyZXR1cm4gdGhpcy5jb21tYW5kRnJvbUZpbGVuYW1lKGUuZmlsZW5hbWUpfWNvbW1hbmRGcm9tRmlsZW5hbWUodCl7cmV0dXJuIHRoaXMuc2hpbS5wYXRoLmJhc2VuYW1lKHQsdGhpcy5zaGltLnBhdGguZXh0bmFtZSh0KSl9ZXh0cmFjdERlc2Moe2Rlc2NyaWJlOnQsZGVzY3JpcHRpb246ZSxkZXNjOnN9KXtmb3IoY29uc3QgaSBvZlt0LGUsc10pe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBpfHwhMT09PWkpcmV0dXJuIGk7ZChpLCEwLHRoaXMuc2hpbSl9cmV0dXJuITF9ZnJlZXplKCl7dGhpcy5mcm96ZW5zLnB1c2goe2hhbmRsZXJzOnRoaXMuaGFuZGxlcnMsYWxpYXNNYXA6dGhpcy5hbGlhc01hcCxkZWZhdWx0Q29tbWFuZDp0aGlzLmRlZmF1bHRDb21tYW5kfSl9dW5mcmVlemUoKXtjb25zdCB0PXRoaXMuZnJvemVucy5wb3AoKTtkKHQsdm9pZCAwLHRoaXMuc2hpbSksKHtoYW5kbGVyczp0aGlzLmhhbmRsZXJzLGFsaWFzTWFwOnRoaXMuYWxpYXNNYXAsZGVmYXVsdENvbW1hbmQ6dGhpcy5kZWZhdWx0Q29tbWFuZH09dCl9cmVzZXQoKXtyZXR1cm4gdGhpcy5oYW5kbGVycz17fSx0aGlzLmFsaWFzTWFwPXt9LHRoaXMuZGVmYXVsdENvbW1hbmQ9dm9pZCAwLHRoaXMucmVxdWlyZUNhY2hlPW5ldyBTZXQsdGhpc319ZnVuY3Rpb24gayh0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdCYmISF0LmJ1aWxkZXImJlwiZnVuY3Rpb25cIj09dHlwZW9mIHQuaGFuZGxlcn1mdW5jdGlvbiB4KHQpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHR9ZnVuY3Rpb24gRSh0KXtcInVuZGVmaW5lZFwiIT10eXBlb2YgcHJvY2VzcyYmW3Byb2Nlc3Muc3Rkb3V0LHByb2Nlc3Muc3RkZXJyXS5mb3JFYWNoKChlPT57Y29uc3Qgcz1lO3MuX2hhbmRsZSYmcy5pc1RUWSYmXCJmdW5jdGlvblwiPT10eXBlb2Ygcy5faGFuZGxlLnNldEJsb2NraW5nJiZzLl9oYW5kbGUuc2V0QmxvY2tpbmcodCl9KSl9ZnVuY3Rpb24gQSh0KXtyZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIHR9ZnVuY3Rpb24gUCh0LHMpe2NvbnN0IGk9cy55MThuLl9fLG49e30scj1bXTtuLmZhaWxGbj1mdW5jdGlvbih0KXtyLnB1c2godCl9O2xldCBvPW51bGwsYT1udWxsLGg9ITA7bi5zaG93SGVscE9uRmFpbD1mdW5jdGlvbihlPSEwLHMpe2NvbnN0W2kscl09XCJzdHJpbmdcIj09dHlwZW9mIGU/WyEwLGVdOltlLHNdO3JldHVybiB0LmdldEludGVybmFsTWV0aG9kcygpLmlzR2xvYmFsQ29udGV4dCgpJiYoYT1yKSxvPXIsaD1pLG59O2xldCBsPSExO24uZmFpbD1mdW5jdGlvbihzLGkpe2NvbnN0IGM9dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRMb2dnZXJJbnN0YW5jZSgpO2lmKCFyLmxlbmd0aCl7aWYodC5nZXRFeGl0UHJvY2VzcygpJiZFKCEwKSwhbCl7bD0hMCxoJiYodC5zaG93SGVscChcImVycm9yXCIpLGMuZXJyb3IoKSksKHN8fGkpJiZjLmVycm9yKHN8fGkpO2NvbnN0IGU9b3x8YTtlJiYoKHN8fGkpJiZjLmVycm9yKFwiXCIpLGMuZXJyb3IoZSkpfWlmKGk9aXx8bmV3IGUocyksdC5nZXRFeGl0UHJvY2VzcygpKXJldHVybiB0LmV4aXQoMSk7aWYodC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5oYXNQYXJzZUNhbGxiYWNrKCkpcmV0dXJuIHQuZXhpdCgxLGkpO3Rocm93IGl9Zm9yKGxldCB0PXIubGVuZ3RoLTE7dD49MDstLXQpe2NvbnN0IGU9clt0XTtpZihBKGUpKXtpZihpKXRocm93IGk7aWYocyl0aHJvdyBFcnJvcihzKX1lbHNlIGUocyxpLG4pfX07bGV0IGM9W10sZj0hMTtuLnVzYWdlPSh0LGUpPT5udWxsPT09dD8oZj0hMCxjPVtdLG4pOihmPSExLGMucHVzaChbdCxlfHxcIlwiXSksbiksbi5nZXRVc2FnZT0oKT0+YyxuLmdldFVzYWdlRGlzYWJsZWQ9KCk9PmYsbi5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lPSgpPT5pKFwiUG9zaXRpb25hbHM6XCIpO2xldCBkPVtdO24uZXhhbXBsZT0odCxlKT0+e2QucHVzaChbdCxlfHxcIlwiXSl9O2xldCB1PVtdO24uY29tbWFuZD1mdW5jdGlvbih0LGUscyxpLG49ITEpe3MmJih1PXUubWFwKCh0PT4odFsyXT0hMSx0KSkpKSx1LnB1c2goW3QsZXx8XCJcIixzLGksbl0pfSxuLmdldENvbW1hbmRzPSgpPT51O2xldCBwPXt9O24uZGVzY3JpYmU9ZnVuY3Rpb24odCxlKXtBcnJheS5pc0FycmF5KHQpP3QuZm9yRWFjaCgodD0+e24uZGVzY3JpYmUodCxlKX0pKTpcIm9iamVjdFwiPT10eXBlb2YgdD9PYmplY3Qua2V5cyh0KS5mb3JFYWNoKChlPT57bi5kZXNjcmliZShlLHRbZV0pfSkpOnBbdF09ZX0sbi5nZXREZXNjcmlwdGlvbnM9KCk9PnA7bGV0IG09W107bi5lcGlsb2c9dD0+e20ucHVzaCh0KX07bGV0IHksYj0hMTtuLndyYXA9dD0+e2I9ITAseT10fSxuLmdldFdyYXA9KCk9PnMuZ2V0RW52KFwiWUFSR1NfRElTQUJMRV9XUkFQXCIpP251bGw6KGJ8fCh5PWZ1bmN0aW9uKCl7Y29uc3QgdD04MDtyZXR1cm4gcy5wcm9jZXNzLnN0ZENvbHVtbnM/TWF0aC5taW4odCxzLnByb2Nlc3Muc3RkQ29sdW1ucyk6dH0oKSxiPSEwKSx5KTtjb25zdCB2PVwiX195YXJnc1N0cmluZ19fOlwiO2Z1bmN0aW9uIE8odCxlLGkpe2xldCBuPTA7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl8fCh0PU9iamVjdC52YWx1ZXModCkubWFwKCh0PT5bdF0pKSksdC5mb3JFYWNoKCh0PT57bj1NYXRoLm1heChzLnN0cmluZ1dpZHRoKGk/YCR7aX0gJHtJKHRbMF0pfWA6SSh0WzBdKSkrJCh0WzBdKSxuKX0pKSxlJiYobj1NYXRoLm1pbihuLHBhcnNlSW50KCguNSplKS50b1N0cmluZygpLDEwKSkpLG59bGV0IHc7ZnVuY3Rpb24gQyhlKXtyZXR1cm4gdC5nZXRPcHRpb25zKCkuaGlkZGVuT3B0aW9ucy5pbmRleE9mKGUpPDB8fHQucGFyc2VkLmFyZ3ZbdC5nZXRPcHRpb25zKCkuc2hvd0hpZGRlbk9wdF19ZnVuY3Rpb24gaih0LGUpe2xldCBzPWBbJHtpKFwiZGVmYXVsdDpcIil9IGA7aWYodm9pZCAwPT09dCYmIWUpcmV0dXJuIG51bGw7aWYoZSlzKz1lO2Vsc2Ugc3dpdGNoKHR5cGVvZiB0KXtjYXNlXCJzdHJpbmdcIjpzKz1gXCIke3R9XCJgO2JyZWFrO2Nhc2VcIm9iamVjdFwiOnMrPUpTT04uc3RyaW5naWZ5KHQpO2JyZWFrO2RlZmF1bHQ6cys9dH1yZXR1cm5gJHtzfV1gfW4uZGVmZXJZMThuTG9va3VwPXQ9PnYrdCxuLmhlbHA9ZnVuY3Rpb24oKXtpZih3KXJldHVybiB3OyFmdW5jdGlvbigpe2NvbnN0IGU9dC5nZXREZW1hbmRlZE9wdGlvbnMoKSxzPXQuZ2V0T3B0aW9ucygpOyhPYmplY3Qua2V5cyhzLmFsaWFzKXx8W10pLmZvckVhY2goKGk9PntzLmFsaWFzW2ldLmZvckVhY2goKHI9PntwW3JdJiZuLmRlc2NyaWJlKGkscFtyXSksciBpbiBlJiZ0LmRlbWFuZE9wdGlvbihpLGVbcl0pLHMuYm9vbGVhbi5pbmNsdWRlcyhyKSYmdC5ib29sZWFuKGkpLHMuY291bnQuaW5jbHVkZXMocikmJnQuY291bnQoaSkscy5zdHJpbmcuaW5jbHVkZXMocikmJnQuc3RyaW5nKGkpLHMubm9ybWFsaXplLmluY2x1ZGVzKHIpJiZ0Lm5vcm1hbGl6ZShpKSxzLmFycmF5LmluY2x1ZGVzKHIpJiZ0LmFycmF5KGkpLHMubnVtYmVyLmluY2x1ZGVzKHIpJiZ0Lm51bWJlcihpKX0pKX0pKX0oKTtjb25zdCBlPXQuY3VzdG9tU2NyaXB0TmFtZT90LiQwOnMucGF0aC5iYXNlbmFtZSh0LiQwKSxyPXQuZ2V0RGVtYW5kZWRPcHRpb25zKCksbz10LmdldERlbWFuZGVkQ29tbWFuZHMoKSxhPXQuZ2V0RGVwcmVjYXRlZE9wdGlvbnMoKSxoPXQuZ2V0R3JvdXBzKCksbD10LmdldE9wdGlvbnMoKTtsZXQgZz1bXTtnPWcuY29uY2F0KE9iamVjdC5rZXlzKHApKSxnPWcuY29uY2F0KE9iamVjdC5rZXlzKHIpKSxnPWcuY29uY2F0KE9iamVjdC5rZXlzKG8pKSxnPWcuY29uY2F0KE9iamVjdC5rZXlzKGwuZGVmYXVsdCkpLGc9Zy5maWx0ZXIoQyksZz1PYmplY3Qua2V5cyhnLnJlZHVjZSgoKHQsZSk9PihcIl9cIiE9PWUmJih0W2VdPSEwKSx0KSkse30pKTtjb25zdCB5PW4uZ2V0V3JhcCgpLGI9cy5jbGl1aSh7d2lkdGg6eSx3cmFwOiEheX0pO2lmKCFmKWlmKGMubGVuZ3RoKWMuZm9yRWFjaCgodD0+e2IuZGl2KHt0ZXh0OmAke3RbMF0ucmVwbGFjZSgvXFwkMC9nLGUpfWB9KSx0WzFdJiZiLmRpdih7dGV4dDpgJHt0WzFdfWAscGFkZGluZzpbMSwwLDAsMF19KX0pKSxiLmRpdigpO2Vsc2UgaWYodS5sZW5ndGgpe2xldCB0PW51bGw7dD1vLl8/YCR7ZX0gPCR7aShcImNvbW1hbmRcIil9PlxcbmA6YCR7ZX0gWyR7aShcImNvbW1hbmRcIil9XVxcbmAsYi5kaXYoYCR7dH1gKX1pZih1Lmxlbmd0aD4xfHwxPT09dS5sZW5ndGgmJiF1WzBdWzJdKXtiLmRpdihpKFwiQ29tbWFuZHM6XCIpKTtjb25zdCBzPXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLG49cy5jb21tYW5kcy5sZW5ndGg/YCR7cy5jb21tYW5kcy5qb2luKFwiIFwiKX0gYDpcIlwiOyEwPT09dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRQYXJzZXJDb25maWd1cmF0aW9uKClbXCJzb3J0LWNvbW1hbmRzXCJdJiYodT11LnNvcnQoKCh0LGUpPT50WzBdLmxvY2FsZUNvbXBhcmUoZVswXSkpKSk7Y29uc3Qgcj1lP2Ake2V9IGA6XCJcIjt1LmZvckVhY2goKHQ9Pntjb25zdCBzPWAke3J9JHtufSR7dFswXS5yZXBsYWNlKC9eXFwkMCA/LyxcIlwiKX1gO2Iuc3Bhbih7dGV4dDpzLHBhZGRpbmc6WzAsMiwwLDJdLHdpZHRoOk8odSx5LGAke2V9JHtufWApKzR9LHt0ZXh0OnRbMV19KTtjb25zdCBvPVtdO3RbMl0mJm8ucHVzaChgWyR7aShcImRlZmF1bHRcIil9XWApLHRbM10mJnRbM10ubGVuZ3RoJiZvLnB1c2goYFske2koXCJhbGlhc2VzOlwiKX0gJHt0WzNdLmpvaW4oXCIsIFwiKX1dYCksdFs0XSYmKFwic3RyaW5nXCI9PXR5cGVvZiB0WzRdP28ucHVzaChgWyR7aShcImRlcHJlY2F0ZWQ6ICVzXCIsdFs0XSl9XWApOm8ucHVzaChgWyR7aShcImRlcHJlY2F0ZWRcIil9XWApKSxvLmxlbmd0aD9iLmRpdih7dGV4dDpvLmpvaW4oXCIgXCIpLHBhZGRpbmc6WzAsMCwwLDJdLGFsaWduOlwicmlnaHRcIn0pOmIuZGl2KCl9KSksYi5kaXYoKX1jb25zdCBNPShPYmplY3Qua2V5cyhsLmFsaWFzKXx8W10pLmNvbmNhdChPYmplY3Qua2V5cyh0LnBhcnNlZC5uZXdBbGlhc2VzKXx8W10pO2c9Zy5maWx0ZXIoKGU9PiF0LnBhcnNlZC5uZXdBbGlhc2VzW2VdJiZNLmV2ZXJ5KCh0PT4tMT09PShsLmFsaWFzW3RdfHxbXSkuaW5kZXhPZihlKSkpKSk7Y29uc3QgXz1pKFwiT3B0aW9uczpcIik7aFtfXXx8KGhbX109W10pLGZ1bmN0aW9uKHQsZSxzLGkpe2xldCBuPVtdLHI9bnVsbDtPYmplY3Qua2V5cyhzKS5mb3JFYWNoKCh0PT57bj1uLmNvbmNhdChzW3RdKX0pKSx0LmZvckVhY2goKHQ9PntyPVt0XS5jb25jYXQoZVt0XSksci5zb21lKCh0PT4tMSE9PW4uaW5kZXhPZih0KSkpfHxzW2ldLnB1c2godCl9KSl9KGcsbC5hbGlhcyxoLF8pO2NvbnN0IGs9dD0+L14tLS8udGVzdChJKHQpKSx4PU9iamVjdC5rZXlzKGgpLmZpbHRlcigodD0+aFt0XS5sZW5ndGg+MCkpLm1hcCgodD0+KHtncm91cE5hbWU6dCxub3JtYWxpemVkS2V5czpoW3RdLmZpbHRlcihDKS5tYXAoKHQ9PntpZihNLmluY2x1ZGVzKHQpKXJldHVybiB0O2ZvcihsZXQgZSxzPTA7dm9pZCAwIT09KGU9TVtzXSk7cysrKWlmKChsLmFsaWFzW2VdfHxbXSkuaW5jbHVkZXModCkpcmV0dXJuIGU7cmV0dXJuIHR9KSl9KSkpLmZpbHRlcigoKHtub3JtYWxpemVkS2V5czp0fSk9PnQubGVuZ3RoPjApKS5tYXAoKCh7Z3JvdXBOYW1lOnQsbm9ybWFsaXplZEtleXM6ZX0pPT57Y29uc3Qgcz1lLnJlZHVjZSgoKGUscyk9PihlW3NdPVtzXS5jb25jYXQobC5hbGlhc1tzXXx8W10pLm1hcCgoZT0+dD09PW4uZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpP2U6KC9eWzAtOV0kLy50ZXN0KGUpP2wuYm9vbGVhbi5pbmNsdWRlcyhzKT9cIi1cIjpcIi0tXCI6ZS5sZW5ndGg+MT9cIi0tXCI6XCItXCIpK2UpKS5zb3J0KCgodCxlKT0+ayh0KT09PWsoZSk/MDprKHQpPzE6LTEpKS5qb2luKFwiLCBcIiksZSkpLHt9KTtyZXR1cm57Z3JvdXBOYW1lOnQsbm9ybWFsaXplZEtleXM6ZSxzd2l0Y2hlczpzfX0pKTtpZih4LmZpbHRlcigoKHtncm91cE5hbWU6dH0pPT50IT09bi5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lKCkpKS5zb21lKCgoe25vcm1hbGl6ZWRLZXlzOnQsc3dpdGNoZXM6ZX0pPT4hdC5ldmVyeSgodD0+ayhlW3RdKSkpKSkmJnguZmlsdGVyKCgoe2dyb3VwTmFtZTp0fSk9PnQhPT1uLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKSkpLmZvckVhY2goKCh7bm9ybWFsaXplZEtleXM6dCxzd2l0Y2hlczplfSk9Pnt0LmZvckVhY2goKHQ9Pnt2YXIgcyxpO2soZVt0XSkmJihlW3RdPShzPWVbdF0saT00LFMocyk/e3RleHQ6cy50ZXh0LGluZGVudGF0aW9uOnMuaW5kZW50YXRpb24raX06e3RleHQ6cyxpbmRlbnRhdGlvbjppfSkpfSkpfSkpLHguZm9yRWFjaCgoKHtncm91cE5hbWU6ZSxub3JtYWxpemVkS2V5czpzLHN3aXRjaGVzOm99KT0+e2IuZGl2KGUpLHMuZm9yRWFjaCgoZT0+e2NvbnN0IHM9b1tlXTtsZXQgaD1wW2VdfHxcIlwiLGM9bnVsbDtoLmluY2x1ZGVzKHYpJiYoaD1pKGguc3Vic3RyaW5nKDE2KSkpLGwuYm9vbGVhbi5pbmNsdWRlcyhlKSYmKGM9YFske2koXCJib29sZWFuXCIpfV1gKSxsLmNvdW50LmluY2x1ZGVzKGUpJiYoYz1gWyR7aShcImNvdW50XCIpfV1gKSxsLnN0cmluZy5pbmNsdWRlcyhlKSYmKGM9YFske2koXCJzdHJpbmdcIil9XWApLGwubm9ybWFsaXplLmluY2x1ZGVzKGUpJiYoYz1gWyR7aShcInN0cmluZ1wiKX1dYCksbC5hcnJheS5pbmNsdWRlcyhlKSYmKGM9YFske2koXCJhcnJheVwiKX1dYCksbC5udW1iZXIuaW5jbHVkZXMoZSkmJihjPWBbJHtpKFwibnVtYmVyXCIpfV1gKTtjb25zdCBmPVtlIGluIGE/KGQ9YVtlXSxcInN0cmluZ1wiPT10eXBlb2YgZD9gWyR7aShcImRlcHJlY2F0ZWQ6ICVzXCIsZCl9XWA6YFske2koXCJkZXByZWNhdGVkXCIpfV1gKTpudWxsLGMsZSBpbiByP2BbJHtpKFwicmVxdWlyZWRcIil9XWA6bnVsbCxsLmNob2ljZXMmJmwuY2hvaWNlc1tlXT9gWyR7aShcImNob2ljZXM6XCIpfSAke24uc3RyaW5naWZpZWRWYWx1ZXMobC5jaG9pY2VzW2VdKX1dYDpudWxsLGoobC5kZWZhdWx0W2VdLGwuZGVmYXVsdERlc2NyaXB0aW9uW2VdKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpO3ZhciBkO2Iuc3Bhbih7dGV4dDpJKHMpLHBhZGRpbmc6WzAsMiwwLDIrJChzKV0sd2lkdGg6TyhvLHkpKzR9LGgpO2NvbnN0IHU9ITA9PT10LmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlQ29uZmlndXJhdGlvbigpW1wiaGlkZS10eXBlc1wiXTtmJiYhdT9iLmRpdih7dGV4dDpmLHBhZGRpbmc6WzAsMCwwLDJdLGFsaWduOlwicmlnaHRcIn0pOmIuZGl2KCl9KSksYi5kaXYoKX0pKSxkLmxlbmd0aCYmKGIuZGl2KGkoXCJFeGFtcGxlczpcIikpLGQuZm9yRWFjaCgodD0+e3RbMF09dFswXS5yZXBsYWNlKC9cXCQwL2csZSl9KSksZC5mb3JFYWNoKCh0PT57XCJcIj09PXRbMV0/Yi5kaXYoe3RleHQ6dFswXSxwYWRkaW5nOlswLDIsMCwyXX0pOmIuZGl2KHt0ZXh0OnRbMF0scGFkZGluZzpbMCwyLDAsMl0sd2lkdGg6TyhkLHkpKzR9LHt0ZXh0OnRbMV19KX0pKSxiLmRpdigpKSxtLmxlbmd0aD4wKXtjb25zdCB0PW0ubWFwKCh0PT50LnJlcGxhY2UoL1xcJDAvZyxlKSkpLmpvaW4oXCJcXG5cIik7Yi5kaXYoYCR7dH1cXG5gKX1yZXR1cm4gYi50b1N0cmluZygpLnJlcGxhY2UoL1xccyokLyxcIlwiKX0sbi5jYWNoZUhlbHBNZXNzYWdlPWZ1bmN0aW9uKCl7dz10aGlzLmhlbHAoKX0sbi5jbGVhckNhY2hlZEhlbHBNZXNzYWdlPWZ1bmN0aW9uKCl7dz12b2lkIDB9LG4uaGFzQ2FjaGVkSGVscE1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4hIXd9LG4uc2hvd0hlbHA9ZT0+e2NvbnN0IHM9dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRMb2dnZXJJbnN0YW5jZSgpO2V8fChlPVwiZXJyb3JcIik7KFwiZnVuY3Rpb25cIj09dHlwZW9mIGU/ZTpzW2VdKShuLmhlbHAoKSl9LG4uZnVuY3Rpb25EZXNjcmlwdGlvbj10PT5bXCIoXCIsdC5uYW1lP3MuUGFyc2VyLmRlY2FtZWxpemUodC5uYW1lLFwiLVwiKTppKFwiZ2VuZXJhdGVkLXZhbHVlXCIpLFwiKVwiXS5qb2luKFwiXCIpLG4uc3RyaW5naWZpZWRWYWx1ZXM9ZnVuY3Rpb24odCxlKXtsZXQgcz1cIlwiO2NvbnN0IGk9ZXx8XCIsIFwiLG49W10uY29uY2F0KHQpO3JldHVybiB0JiZuLmxlbmd0aD8obi5mb3JFYWNoKCh0PT57cy5sZW5ndGgmJihzKz1pKSxzKz1KU09OLnN0cmluZ2lmeSh0KX0pKSxzKTpzfTtsZXQgTT1udWxsO24udmVyc2lvbj10PT57TT10fSxuLnNob3dWZXJzaW9uPWU9Pntjb25zdCBzPXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0TG9nZ2VySW5zdGFuY2UoKTtlfHwoZT1cImVycm9yXCIpOyhcImZ1bmN0aW9uXCI9PXR5cGVvZiBlP2U6c1tlXSkoTSl9LG4ucmVzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIG89bnVsbCxsPSExLGM9W10sZj0hMSxtPVtdLGQ9W10sdT1bXSxwPWcocCwoZT0+IXRbZV0pKSxufTtjb25zdCBfPVtdO3JldHVybiBuLmZyZWV6ZT1mdW5jdGlvbigpe18ucHVzaCh7ZmFpbE1lc3NhZ2U6byxmYWlsdXJlT3V0cHV0OmwsdXNhZ2VzOmMsdXNhZ2VEaXNhYmxlZDpmLGVwaWxvZ3M6bSxleGFtcGxlczpkLGNvbW1hbmRzOnUsZGVzY3JpcHRpb25zOnB9KX0sbi51bmZyZWV6ZT1mdW5jdGlvbih0PSExKXtjb25zdCBlPV8ucG9wKCk7ZSYmKHQ/KHA9ey4uLmUuZGVzY3JpcHRpb25zLC4uLnB9LHU9Wy4uLmUuY29tbWFuZHMsLi4udV0sYz1bLi4uZS51c2FnZXMsLi4uY10sZD1bLi4uZS5leGFtcGxlcywuLi5kXSxtPVsuLi5lLmVwaWxvZ3MsLi4ubV0pOih7ZmFpbE1lc3NhZ2U6byxmYWlsdXJlT3V0cHV0OmwsdXNhZ2VzOmMsdXNhZ2VEaXNhYmxlZDpmLGVwaWxvZ3M6bSxleGFtcGxlczpkLGNvbW1hbmRzOnUsZGVzY3JpcHRpb25zOnB9PWUpKX0sbn1mdW5jdGlvbiBTKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0fWZ1bmN0aW9uICQodCl7cmV0dXJuIFModCk/dC5pbmRlbnRhdGlvbjowfWZ1bmN0aW9uIEkodCl7cmV0dXJuIFModCk/dC50ZXh0OnR9Y2xhc3MgRHtjb25zdHJ1Y3Rvcih0LGUscyxpKXt2YXIgbixyLG87dGhpcy55YXJncz10LHRoaXMudXNhZ2U9ZSx0aGlzLmNvbW1hbmQ9cyx0aGlzLnNoaW09aSx0aGlzLmNvbXBsZXRpb25LZXk9XCJnZXQteWFyZ3MtY29tcGxldGlvbnNcIix0aGlzLmFsaWFzZXM9bnVsbCx0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbj1udWxsLHRoaXMuaW5kZXhBZnRlckxhc3RSZXNldD0wLHRoaXMuenNoU2hlbGw9bnVsbCE9PShvPShudWxsPT09KG49dGhpcy5zaGltLmdldEVudihcIlNIRUxMXCIpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5pbmNsdWRlcyhcInpzaFwiKSl8fChudWxsPT09KHI9dGhpcy5zaGltLmdldEVudihcIlpTSF9OQU1FXCIpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5pbmNsdWRlcyhcInpzaFwiKSkpJiZ2b2lkIDAhPT1vJiZvfWRlZmF1bHRDb21wbGV0aW9uKHQsZSxzLGkpe2NvbnN0IG49dGhpcy5jb21tYW5kLmdldENvbW1hbmRIYW5kbGVycygpO2ZvcihsZXQgZT0wLHM9dC5sZW5ndGg7ZTxzOysrZSlpZihuW3RbZV1dJiZuW3RbZV1dLmJ1aWxkZXIpe2NvbnN0IHM9blt0W2VdXS5idWlsZGVyO2lmKHgocykpe3RoaXMuaW5kZXhBZnRlckxhc3RSZXNldD1lKzE7Y29uc3QgdD10aGlzLnlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLnJlc2V0KCk7cmV0dXJuIHModCwhMCksdC5hcmd2fX1jb25zdCByPVtdO3RoaXMuY29tbWFuZENvbXBsZXRpb25zKHIsdCxzKSx0aGlzLm9wdGlvbkNvbXBsZXRpb25zKHIsdCxlLHMpLHRoaXMuY2hvaWNlc0Zyb21PcHRpb25zQ29tcGxldGlvbnMocix0LGUscyksdGhpcy5jaG9pY2VzRnJvbVBvc2l0aW9uYWxzQ29tcGxldGlvbnMocix0LGUscyksaShudWxsLHIpfWNvbW1hbmRDb21wbGV0aW9ucyh0LGUscyl7Y29uc3QgaT10aGlzLnlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKS5jb21tYW5kcztzLm1hdGNoKC9eLS8pfHxpW2kubGVuZ3RoLTFdPT09c3x8dGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoZSl8fHRoaXMudXNhZ2UuZ2V0Q29tbWFuZHMoKS5mb3JFYWNoKChzPT57Y29uc3QgaT1vKHNbMF0pLmNtZDtpZigtMT09PWUuaW5kZXhPZihpKSlpZih0aGlzLnpzaFNoZWxsKXtjb25zdCBlPXNbMV18fFwiXCI7dC5wdXNoKGkucmVwbGFjZSgvOi9nLFwiXFxcXDpcIikrXCI6XCIrZSl9ZWxzZSB0LnB1c2goaSl9KSl9b3B0aW9uQ29tcGxldGlvbnModCxlLHMsaSl7aWYoKGkubWF0Y2goL14tLyl8fFwiXCI9PT1pJiYwPT09dC5sZW5ndGgpJiYhdGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoZSkpe2NvbnN0IHM9dGhpcy55YXJncy5nZXRPcHRpb25zKCksbj10aGlzLnlhcmdzLmdldEdyb3VwcygpW3RoaXMudXNhZ2UuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpXXx8W107T2JqZWN0LmtleXMocy5rZXkpLmZvckVhY2goKHI9Pntjb25zdCBvPSEhcy5jb25maWd1cmF0aW9uW1wiYm9vbGVhbi1uZWdhdGlvblwiXSYmcy5ib29sZWFuLmluY2x1ZGVzKHIpO24uaW5jbHVkZXMocil8fHMuaGlkZGVuT3B0aW9ucy5pbmNsdWRlcyhyKXx8dGhpcy5hcmdzQ29udGFpbktleShlLHIsbyl8fHRoaXMuY29tcGxldGVPcHRpb25LZXkocix0LGksbyYmISFzLmRlZmF1bHRbcl0pfSkpfX1jaG9pY2VzRnJvbU9wdGlvbnNDb21wbGV0aW9ucyh0LGUscyxpKXtpZih0aGlzLnByZXZpb3VzQXJnSGFzQ2hvaWNlcyhlKSl7Y29uc3Qgcz10aGlzLmdldFByZXZpb3VzQXJnQ2hvaWNlcyhlKTtzJiZzLmxlbmd0aD4wJiZ0LnB1c2goLi4ucy5tYXAoKHQ9PnQucmVwbGFjZSgvOi9nLFwiXFxcXDpcIikpKSl9fWNob2ljZXNGcm9tUG9zaXRpb25hbHNDb21wbGV0aW9ucyh0LGUscyxpKXtpZihcIlwiPT09aSYmdC5sZW5ndGg+MCYmdGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoZSkpcmV0dXJuO2NvbnN0IG49dGhpcy55YXJncy5nZXRHcm91cHMoKVt0aGlzLnVzYWdlLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKV18fFtdLHI9TWF0aC5tYXgodGhpcy5pbmRleEFmdGVyTGFzdFJlc2V0LHRoaXMueWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLmNvbW1hbmRzLmxlbmd0aCsxKSxvPW5bcy5fLmxlbmd0aC1yLTFdO2lmKCFvKXJldHVybjtjb25zdCBhPXRoaXMueWFyZ3MuZ2V0T3B0aW9ucygpLmNob2ljZXNbb118fFtdO2Zvcihjb25zdCBlIG9mIGEpZS5zdGFydHNXaXRoKGkpJiZ0LnB1c2goZS5yZXBsYWNlKC86L2csXCJcXFxcOlwiKSl9Z2V0UHJldmlvdXNBcmdDaG9pY2VzKHQpe2lmKHQubGVuZ3RoPDEpcmV0dXJuO2xldCBlPXRbdC5sZW5ndGgtMV0scz1cIlwiO2lmKCFlLnN0YXJ0c1dpdGgoXCItXCIpJiZ0Lmxlbmd0aD4xJiYocz1lLGU9dFt0Lmxlbmd0aC0yXSksIWUuc3RhcnRzV2l0aChcIi1cIikpcmV0dXJuO2NvbnN0IGk9ZS5yZXBsYWNlKC9eLSsvLFwiXCIpLG49dGhpcy55YXJncy5nZXRPcHRpb25zKCkscj1baSwuLi50aGlzLnlhcmdzLmdldEFsaWFzZXMoKVtpXXx8W11dO2xldCBvO2Zvcihjb25zdCB0IG9mIHIpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4ua2V5LHQpJiZBcnJheS5pc0FycmF5KG4uY2hvaWNlc1t0XSkpe289bi5jaG9pY2VzW3RdO2JyZWFrfXJldHVybiBvP28uZmlsdGVyKCh0PT4hc3x8dC5zdGFydHNXaXRoKHMpKSk6dm9pZCAwfXByZXZpb3VzQXJnSGFzQ2hvaWNlcyh0KXtjb25zdCBlPXRoaXMuZ2V0UHJldmlvdXNBcmdDaG9pY2VzKHQpO3JldHVybiB2b2lkIDAhPT1lJiZlLmxlbmd0aD4wfWFyZ3NDb250YWluS2V5KHQsZSxzKXtjb25zdCBpPWU9Pi0xIT09dC5pbmRleE9mKCgvXlteMC05XSQvLnRlc3QoZSk/XCItXCI6XCItLVwiKStlKTtpZihpKGUpKXJldHVybiEwO2lmKHMmJmkoYG5vLSR7ZX1gKSlyZXR1cm4hMDtpZih0aGlzLmFsaWFzZXMpZm9yKGNvbnN0IHQgb2YgdGhpcy5hbGlhc2VzW2VdKWlmKGkodCkpcmV0dXJuITA7cmV0dXJuITF9Y29tcGxldGVPcHRpb25LZXkodCxlLHMsaSl7dmFyIG4scixvLGE7bGV0IGg9dDtpZih0aGlzLnpzaFNoZWxsKXtjb25zdCBlPXRoaXMudXNhZ2UuZ2V0RGVzY3JpcHRpb25zKCkscz1udWxsPT09KHI9bnVsbD09PShuPW51bGw9PXRoaXM/dm9pZCAwOnRoaXMuYWxpYXNlcyl8fHZvaWQgMD09PW4/dm9pZCAwOm5bdF0pfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmZpbmQoKHQ9Pntjb25zdCBzPWVbdF07cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHMmJnMubGVuZ3RoPjB9KSksaT1zP2Vbc106dm9pZCAwLGw9bnVsbCE9PShhPW51bGwhPT0obz1lW3RdKSYmdm9pZCAwIT09bz9vOmkpJiZ2b2lkIDAhPT1hP2E6XCJcIjtoPWAke3QucmVwbGFjZSgvOi9nLFwiXFxcXDpcIil9OiR7bC5yZXBsYWNlKFwiX195YXJnc1N0cmluZ19fOlwiLFwiXCIpLnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZ20sXCIgXCIpfWB9Y29uc3QgbD0hL14tLS8udGVzdChzKSYmKHQ9Pi9eW14wLTldJC8udGVzdCh0KSkodCk/XCItXCI6XCItLVwiO2UucHVzaChsK2gpLGkmJmUucHVzaChsK1wibm8tXCIraCl9Y3VzdG9tQ29tcGxldGlvbih0LGUscyxpKXtpZihkKHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uLG51bGwsdGhpcy5zaGltKSx0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbi5sZW5ndGg8Myl7Y29uc3QgdD10aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihzLGUpO3JldHVybiBmKHQpP3QudGhlbigodD0+e3RoaXMuc2hpbS5wcm9jZXNzLm5leHRUaWNrKCgoKT0+e2kobnVsbCx0KX0pKX0pKS5jYXRjaCgodD0+e3RoaXMuc2hpbS5wcm9jZXNzLm5leHRUaWNrKCgoKT0+e2kodCx2b2lkIDApfSkpfSkpOmkobnVsbCx0KX1yZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoPjN9KHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uKT90aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihzLGUsKChuPWkpPT50aGlzLmRlZmF1bHRDb21wbGV0aW9uKHQsZSxzLG4pKSwodD0+e2kobnVsbCx0KX0pKTp0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihzLGUsKHQ9PntpKG51bGwsdCl9KSl9Z2V0Q29tcGxldGlvbih0LGUpe2NvbnN0IHM9dC5sZW5ndGg/dFt0Lmxlbmd0aC0xXTpcIlwiLGk9dGhpcy55YXJncy5wYXJzZSh0LCEwKSxuPXRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uP2k9PnRoaXMuY3VzdG9tQ29tcGxldGlvbih0LGkscyxlKTppPT50aGlzLmRlZmF1bHRDb21wbGV0aW9uKHQsaSxzLGUpO3JldHVybiBmKGkpP2kudGhlbihuKTpuKGkpfWdlbmVyYXRlQ29tcGxldGlvblNjcmlwdCh0LGUpe2xldCBzPXRoaXMuenNoU2hlbGw/JyNjb21wZGVmIHt7YXBwX25hbWV9fVxcbiMjIy1iZWdpbi17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXFxuI1xcbiMgeWFyZ3MgY29tbWFuZCBjb21wbGV0aW9uIHNjcmlwdFxcbiNcXG4jIEluc3RhbGxhdGlvbjoge3thcHBfcGF0aH19IHt7Y29tcGxldGlvbl9jb21tYW5kfX0gPj4gfi8uenNocmNcXG4jICAgIG9yIHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLnpwcm9maWxlIG9uIE9TWC5cXG4jXFxuX3t7YXBwX25hbWV9fV95YXJnc19jb21wbGV0aW9ucygpXFxue1xcbiAgbG9jYWwgcmVwbHlcXG4gIGxvY2FsIHNpPSRJRlNcXG4gIElGUz0kXFwnXFxuXFwnIHJlcGx5PSgkKENPTVBfQ1dPUkQ9XCIkKChDVVJSRU5ULTEpKVwiIENPTVBfTElORT1cIiRCVUZGRVJcIiBDT01QX1BPSU5UPVwiJENVUlNPUlwiIHt7YXBwX3BhdGh9fSAtLWdldC15YXJncy1jb21wbGV0aW9ucyBcIiR7d29yZHNbQF19XCIpKVxcbiAgSUZTPSRzaVxcbiAgX2Rlc2NyaWJlIFxcJ3ZhbHVlc1xcJyByZXBseVxcbn1cXG5jb21wZGVmIF97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMge3thcHBfbmFtZX19XFxuIyMjLWVuZC17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXFxuJzonIyMjLWJlZ2luLXt7YXBwX25hbWV9fS1jb21wbGV0aW9ucy0jIyNcXG4jXFxuIyB5YXJncyBjb21tYW5kIGNvbXBsZXRpb24gc2NyaXB0XFxuI1xcbiMgSW5zdGFsbGF0aW9uOiB7e2FwcF9wYXRofX0ge3tjb21wbGV0aW9uX2NvbW1hbmR9fSA+PiB+Ly5iYXNocmNcXG4jICAgIG9yIHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLmJhc2hfcHJvZmlsZSBvbiBPU1guXFxuI1xcbl97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMoKVxcbntcXG4gICAgbG9jYWwgY3VyX3dvcmQgYXJncyB0eXBlX2xpc3RcXG5cXG4gICAgY3VyX3dvcmQ9XCIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19XCJcXG4gICAgYXJncz0oXCIke0NPTVBfV09SRFNbQF19XCIpXFxuXFxuICAgICMgYXNrIHlhcmdzIHRvIGdlbmVyYXRlIGNvbXBsZXRpb25zLlxcbiAgICB0eXBlX2xpc3Q9JCh7e2FwcF9wYXRofX0gLS1nZXQteWFyZ3MtY29tcGxldGlvbnMgXCIke2FyZ3NbQF19XCIpXFxuXFxuICAgIENPTVBSRVBMWT0oICQoY29tcGdlbiAtVyBcIiR7dHlwZV9saXN0fVwiIC0tICR7Y3VyX3dvcmR9KSApXFxuXFxuICAgICMgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLCBmYWxsIGJhY2sgdG8gZmlsZW5hbWUgY29tcGxldGlvblxcbiAgICBpZiBbICR7I0NPTVBSRVBMWVtAXX0gLWVxIDAgXTsgdGhlblxcbiAgICAgIENPTVBSRVBMWT0oKVxcbiAgICBmaVxcblxcbiAgICByZXR1cm4gMFxcbn1cXG5jb21wbGV0ZSAtbyBiYXNoZGVmYXVsdCAtbyBkZWZhdWx0IC1GIF97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMge3thcHBfbmFtZX19XFxuIyMjLWVuZC17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXFxuJztjb25zdCBpPXRoaXMuc2hpbS5wYXRoLmJhc2VuYW1lKHQpO3JldHVybiB0Lm1hdGNoKC9cXC5qcyQvKSYmKHQ9YC4vJHt0fWApLHM9cy5yZXBsYWNlKC97e2FwcF9uYW1lfX0vZyxpKSxzPXMucmVwbGFjZSgve3tjb21wbGV0aW9uX2NvbW1hbmR9fS9nLGUpLHMucmVwbGFjZSgve3thcHBfcGF0aH19L2csdCl9cmVnaXN0ZXJGdW5jdGlvbih0KXt0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbj10fXNldFBhcnNlZCh0KXt0aGlzLmFsaWFzZXM9dC5hbGlhc2VzfX1mdW5jdGlvbiBOKHQsZSl7aWYoMD09PXQubGVuZ3RoKXJldHVybiBlLmxlbmd0aDtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHQubGVuZ3RoO2NvbnN0IHM9W107bGV0IGksbjtmb3IoaT0wO2k8PWUubGVuZ3RoO2krKylzW2ldPVtpXTtmb3Iobj0wO248PXQubGVuZ3RoO24rKylzWzBdW25dPW47Zm9yKGk9MTtpPD1lLmxlbmd0aDtpKyspZm9yKG49MTtuPD10Lmxlbmd0aDtuKyspZS5jaGFyQXQoaS0xKT09PXQuY2hhckF0KG4tMSk/c1tpXVtuXT1zW2ktMV1bbi0xXTppPjEmJm4+MSYmZS5jaGFyQXQoaS0yKT09PXQuY2hhckF0KG4tMSkmJmUuY2hhckF0KGktMSk9PT10LmNoYXJBdChuLTIpP3NbaV1bbl09c1tpLTJdW24tMl0rMTpzW2ldW25dPU1hdGgubWluKHNbaS0xXVtuLTFdKzEsTWF0aC5taW4oc1tpXVtuLTFdKzEsc1tpLTFdW25dKzEpKTtyZXR1cm4gc1tlLmxlbmd0aF1bdC5sZW5ndGhdfWNvbnN0IEg9W1wiJDBcIixcIi0tXCIsXCJfXCJdO3ZhciB6LFcscSxVLEYsTCxWLEcsUixULEIsWSxLLEosWixYLFEsdHQsZXQsc3QsaXQsbnQscnQsb3QsYXQsaHQsbHQsY3QsZnQsZHQsdXQscHQsZ3QsbXQseXQ7Y29uc3QgYnQ9U3ltYm9sKFwiY29weURvdWJsZURhc2hcIiksdnQ9U3ltYm9sKFwiY29weURvdWJsZURhc2hcIiksT3Q9U3ltYm9sKFwiZGVsZXRlRnJvbVBhcnNlckhpbnRPYmplY3RcIiksd3Q9U3ltYm9sKFwiZW1pdFdhcm5pbmdcIiksQ3Q9U3ltYm9sKFwiZnJlZXplXCIpLGp0PVN5bWJvbChcImdldERvbGxhclplcm9cIiksTXQ9U3ltYm9sKFwiZ2V0UGFyc2VyQ29uZmlndXJhdGlvblwiKSxfdD1TeW1ib2woXCJnZXRVc2FnZUNvbmZpZ3VyYXRpb25cIiksa3Q9U3ltYm9sKFwiZ3Vlc3NMb2NhbGVcIikseHQ9U3ltYm9sKFwiZ3Vlc3NWZXJzaW9uXCIpLEV0PVN5bWJvbChcInBhcnNlUG9zaXRpb25hbE51bWJlcnNcIiksQXQ9U3ltYm9sKFwicGtnVXBcIiksUHQ9U3ltYm9sKFwicG9wdWxhdGVQYXJzZXJIaW50QXJyYXlcIiksU3Q9U3ltYm9sKFwicG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5XCIpLCR0PVN5bWJvbChcInBvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeVwiKSxJdD1TeW1ib2woXCJwb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5XCIpLER0PVN5bWJvbChcInNhbml0aXplS2V5XCIpLE50PVN5bWJvbChcInNldEtleVwiKSxIdD1TeW1ib2woXCJ1bmZyZWV6ZVwiKSx6dD1TeW1ib2woXCJ2YWxpZGF0ZUFzeW5jXCIpLFd0PVN5bWJvbChcImdldENvbW1hbmRJbnN0YW5jZVwiKSxxdD1TeW1ib2woXCJnZXRDb250ZXh0XCIpLFV0PVN5bWJvbChcImdldEhhc091dHB1dFwiKSxGdD1TeW1ib2woXCJnZXRMb2dnZXJJbnN0YW5jZVwiKSxMdD1TeW1ib2woXCJnZXRQYXJzZUNvbnRleHRcIiksVnQ9U3ltYm9sKFwiZ2V0VXNhZ2VJbnN0YW5jZVwiKSxHdD1TeW1ib2woXCJnZXRWYWxpZGF0aW9uSW5zdGFuY2VcIiksUnQ9U3ltYm9sKFwiaGFzUGFyc2VDYWxsYmFja1wiKSxUdD1TeW1ib2woXCJpc0dsb2JhbENvbnRleHRcIiksQnQ9U3ltYm9sKFwicG9zdFByb2Nlc3NcIiksWXQ9U3ltYm9sKFwicmViYXNlXCIpLEt0PVN5bWJvbChcInJlc2V0XCIpLEp0PVN5bWJvbChcInJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzXCIpLFp0PVN5bWJvbChcInJ1blZhbGlkYXRpb25cIiksWHQ9U3ltYm9sKFwic2V0SGFzT3V0cHV0XCIpLFF0PVN5bWJvbChcImtUcmFja01hbnVhbGx5U2V0S2V5c1wiKTtjbGFzcyB0ZXtjb25zdHJ1Y3Rvcih0PVtdLGUscyxpKXt0aGlzLmN1c3RvbVNjcmlwdE5hbWU9ITEsdGhpcy5wYXJzZWQ9ITEsei5zZXQodGhpcyx2b2lkIDApLFcuc2V0KHRoaXMsdm9pZCAwKSxxLnNldCh0aGlzLHtjb21tYW5kczpbXSxmdWxsQ29tbWFuZHM6W119KSxVLnNldCh0aGlzLG51bGwpLEYuc2V0KHRoaXMsbnVsbCksTC5zZXQodGhpcyxcInNob3ctaGlkZGVuXCIpLFYuc2V0KHRoaXMsbnVsbCksRy5zZXQodGhpcywhMCksUi5zZXQodGhpcyx7fSksVC5zZXQodGhpcywhMCksQi5zZXQodGhpcyxbXSksWS5zZXQodGhpcyx2b2lkIDApLEsuc2V0KHRoaXMse30pLEouc2V0KHRoaXMsITEpLFouc2V0KHRoaXMsbnVsbCksWC5zZXQodGhpcywhMCksUS5zZXQodGhpcyx2b2lkIDApLHR0LnNldCh0aGlzLFwiXCIpLGV0LnNldCh0aGlzLHZvaWQgMCksc3Quc2V0KHRoaXMsdm9pZCAwKSxpdC5zZXQodGhpcyx7fSksbnQuc2V0KHRoaXMsbnVsbCkscnQuc2V0KHRoaXMsbnVsbCksb3Quc2V0KHRoaXMse30pLGF0LnNldCh0aGlzLHt9KSxodC5zZXQodGhpcyx2b2lkIDApLGx0LnNldCh0aGlzLCExKSxjdC5zZXQodGhpcyx2b2lkIDApLGZ0LnNldCh0aGlzLCExKSxkdC5zZXQodGhpcywhMSksdXQuc2V0KHRoaXMsITEpLHB0LnNldCh0aGlzLHZvaWQgMCksZ3Quc2V0KHRoaXMse30pLG10LnNldCh0aGlzLG51bGwpLHl0LnNldCh0aGlzLHZvaWQgMCksTyh0aGlzLGN0LGksXCJmXCIpLE8odGhpcyxodCx0LFwiZlwiKSxPKHRoaXMsVyxlLFwiZlwiKSxPKHRoaXMsc3QscyxcImZcIiksTyh0aGlzLFksbmV3IHcodGhpcyksXCJmXCIpLHRoaXMuJDA9dGhpc1tqdF0oKSx0aGlzW0t0XSgpLE8odGhpcyx6LHYodGhpcyx6LFwiZlwiKSxcImZcIiksTyh0aGlzLHB0LHYodGhpcyxwdCxcImZcIiksXCJmXCIpLE8odGhpcyx5dCx2KHRoaXMseXQsXCJmXCIpLFwiZlwiKSxPKHRoaXMsZXQsdih0aGlzLGV0LFwiZlwiKSxcImZcIiksdih0aGlzLGV0LFwiZlwiKS5zaG93SGlkZGVuT3B0PXYodGhpcyxMLFwiZlwiKSxPKHRoaXMsUSx0aGlzW3Z0XSgpLFwiZlwiKX1hZGRIZWxwT3B0KHQsZSl7cmV0dXJuIGgoXCJbc3RyaW5nfGJvb2xlYW5dIFtzdHJpbmddXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLFosXCJmXCIpJiYodGhpc1tPdF0odih0aGlzLFosXCJmXCIpKSxPKHRoaXMsWixudWxsLFwiZlwiKSksITE9PT10JiZ2b2lkIDA9PT1lfHwoTyh0aGlzLFosXCJzdHJpbmdcIj09dHlwZW9mIHQ/dDpcImhlbHBcIixcImZcIiksdGhpcy5ib29sZWFuKHYodGhpcyxaLFwiZlwiKSksdGhpcy5kZXNjcmliZSh2KHRoaXMsWixcImZcIiksZXx8dih0aGlzLHB0LFwiZlwiKS5kZWZlclkxOG5Mb29rdXAoXCJTaG93IGhlbHBcIikpKSx0aGlzfWhlbHAodCxlKXtyZXR1cm4gdGhpcy5hZGRIZWxwT3B0KHQsZSl9YWRkU2hvd0hpZGRlbk9wdCh0LGUpe2lmKGgoXCJbc3RyaW5nfGJvb2xlYW5dIFtzdHJpbmddXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksITE9PT10JiZ2b2lkIDA9PT1lKXJldHVybiB0aGlzO2NvbnN0IHM9XCJzdHJpbmdcIj09dHlwZW9mIHQ/dDp2KHRoaXMsTCxcImZcIik7cmV0dXJuIHRoaXMuYm9vbGVhbihzKSx0aGlzLmRlc2NyaWJlKHMsZXx8dih0aGlzLHB0LFwiZlwiKS5kZWZlclkxOG5Mb29rdXAoXCJTaG93IGhpZGRlbiBvcHRpb25zXCIpKSx2KHRoaXMsZXQsXCJmXCIpLnNob3dIaWRkZW5PcHQ9cyx0aGlzfXNob3dIaWRkZW4odCxlKXtyZXR1cm4gdGhpcy5hZGRTaG93SGlkZGVuT3B0KHQsZSl9YWxpYXModCxlKXtyZXR1cm4gaChcIjxvYmplY3R8c3RyaW5nfGFycmF5PiBbc3RyaW5nfGFycmF5XVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbJHRdKHRoaXMuYWxpYXMuYmluZCh0aGlzKSxcImFsaWFzXCIsdCxlKSx0aGlzfWFycmF5KHQpe3JldHVybiBoKFwiPGFycmF5fHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tQdF0oXCJhcnJheVwiLHQpLHRoaXNbUXRdKHQpLHRoaXN9Ym9vbGVhbih0KXtyZXR1cm4gaChcIjxhcnJheXxzdHJpbmc+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbUHRdKFwiYm9vbGVhblwiLHQpLHRoaXNbUXRdKHQpLHRoaXN9Y2hlY2sodCxlKXtyZXR1cm4gaChcIjxmdW5jdGlvbj4gW2Jvb2xlYW5dXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdGhpcy5taWRkbGV3YXJlKCgoZSxzKT0+aigoKCk9PnQoZSxzLmdldE9wdGlvbnMoKSkpLChzPT4ocz8oXCJzdHJpbmdcIj09dHlwZW9mIHN8fHMgaW5zdGFuY2VvZiBFcnJvcikmJnYodGhpcyxwdCxcImZcIikuZmFpbChzLnRvU3RyaW5nKCkscyk6dih0aGlzLHB0LFwiZlwiKS5mYWlsKHYodGhpcyxjdCxcImZcIikueTE4bi5fXyhcIkFyZ3VtZW50IGNoZWNrIGZhaWxlZDogJXNcIix0LnRvU3RyaW5nKCkpKSxlKSksKHQ9Pih2KHRoaXMscHQsXCJmXCIpLmZhaWwodC5tZXNzYWdlP3QubWVzc2FnZTp0LnRvU3RyaW5nKCksdCksZSkpKSksITEsZSksdGhpc31jaG9pY2VzKHQsZSl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ3xhcnJheV1cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzWyR0XSh0aGlzLmNob2ljZXMuYmluZCh0aGlzKSxcImNob2ljZXNcIix0LGUpLHRoaXN9Y29lcmNlKHQscyl7aWYoaChcIjxvYmplY3R8c3RyaW5nfGFycmF5PiBbZnVuY3Rpb25dXCIsW3Qsc10sYXJndW1lbnRzLmxlbmd0aCksQXJyYXkuaXNBcnJheSh0KSl7aWYoIXMpdGhyb3cgbmV3IGUoXCJjb2VyY2UgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZFwiKTtmb3IoY29uc3QgZSBvZiB0KXRoaXMuY29lcmNlKGUscyk7cmV0dXJuIHRoaXN9aWYoXCJvYmplY3RcIj09dHlwZW9mIHQpe2Zvcihjb25zdCBlIG9mIE9iamVjdC5rZXlzKHQpKXRoaXMuY29lcmNlKGUsdFtlXSk7cmV0dXJuIHRoaXN9aWYoIXMpdGhyb3cgbmV3IGUoXCJjb2VyY2UgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZFwiKTtyZXR1cm4gdih0aGlzLGV0LFwiZlwiKS5rZXlbdF09ITAsdih0aGlzLFksXCJmXCIpLmFkZENvZXJjZU1pZGRsZXdhcmUoKChpLG4pPT57bGV0IHI7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLHQpP2ooKCgpPT4ocj1uLmdldEFsaWFzZXMoKSxzKGlbdF0pKSksKGU9PntpW3RdPWU7Y29uc3Qgcz1uLmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKVtcInN0cmlwLWFsaWFzZWRcIl07aWYoclt0XSYmITAhPT1zKWZvcihjb25zdCBzIG9mIHJbdF0paVtzXT1lO3JldHVybiBpfSksKHQ9Pnt0aHJvdyBuZXcgZSh0Lm1lc3NhZ2UpfSkpOml9KSx0KSx0aGlzfWNvbmZsaWN0cyh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xvYmplY3Q+IFtzdHJpbmd8YXJyYXldXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLHl0LFwiZlwiKS5jb25mbGljdHModCxlKSx0aGlzfWNvbmZpZyh0PVwiY29uZmlnXCIsZSxzKXtyZXR1cm4gaChcIltvYmplY3R8c3RyaW5nXSBbc3RyaW5nfGZ1bmN0aW9uXSBbZnVuY3Rpb25dXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSxcIm9iamVjdFwiIT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KT8oXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmKHM9ZSxlPXZvaWQgMCksdGhpcy5kZXNjcmliZSh0LGV8fHYodGhpcyxwdCxcImZcIikuZGVmZXJZMThuTG9va3VwKFwiUGF0aCB0byBKU09OIGNvbmZpZyBmaWxlXCIpKSwoQXJyYXkuaXNBcnJheSh0KT90Olt0XSkuZm9yRWFjaCgodD0+e3YodGhpcyxldCxcImZcIikuY29uZmlnW3RdPXN8fCEwfSkpLHRoaXMpOih0PW4odCx2KHRoaXMsVyxcImZcIiksdGhpc1tNdF0oKVtcImRlZXAtbWVyZ2UtY29uZmlnXCJdfHwhMSx2KHRoaXMsY3QsXCJmXCIpKSx2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHM9KHYodGhpcyxldCxcImZcIikuY29uZmlnT2JqZWN0c3x8W10pLmNvbmNhdCh0KSx0aGlzKX1jb21wbGV0aW9uKHQsZSxzKXtyZXR1cm4gaChcIltzdHJpbmddIFtzdHJpbmd8Ym9vbGVhbnxmdW5jdGlvbl0gW2Z1bmN0aW9uXVwiLFt0LGUsc10sYXJndW1lbnRzLmxlbmd0aCksXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmKHM9ZSxlPXZvaWQgMCksTyh0aGlzLEYsdHx8dih0aGlzLEYsXCJmXCIpfHxcImNvbXBsZXRpb25cIixcImZcIiksZXx8ITE9PT1lfHwoZT1cImdlbmVyYXRlIGNvbXBsZXRpb24gc2NyaXB0XCIpLHRoaXMuY29tbWFuZCh2KHRoaXMsRixcImZcIiksZSkscyYmdih0aGlzLFUsXCJmXCIpLnJlZ2lzdGVyRnVuY3Rpb24ocyksdGhpc31jb21tYW5kKHQsZSxzLGksbixyKXtyZXR1cm4gaChcIjxzdHJpbmd8YXJyYXl8b2JqZWN0PiBbc3RyaW5nfGJvb2xlYW5dIFtmdW5jdGlvbnxvYmplY3RdIFtmdW5jdGlvbl0gW2FycmF5XSBbYm9vbGVhbnxzdHJpbmddXCIsW3QsZSxzLGksbixyXSxhcmd1bWVudHMubGVuZ3RoKSx2KHRoaXMseixcImZcIikuYWRkSGFuZGxlcih0LGUscyxpLG4sciksdGhpc31jb21tYW5kcyh0LGUscyxpLG4scil7cmV0dXJuIHRoaXMuY29tbWFuZCh0LGUscyxpLG4scil9Y29tbWFuZERpcih0LGUpe2goXCI8c3RyaW5nPiBbb2JqZWN0XVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpO2NvbnN0IHM9dih0aGlzLHN0LFwiZlwiKXx8dih0aGlzLGN0LFwiZlwiKS5yZXF1aXJlO3JldHVybiB2KHRoaXMseixcImZcIikuYWRkRGlyZWN0b3J5KHQscyx2KHRoaXMsY3QsXCJmXCIpLmdldENhbGxlckZpbGUoKSxlKSx0aGlzfWNvdW50KHQpe3JldHVybiBoKFwiPGFycmF5fHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tQdF0oXCJjb3VudFwiLHQpLHRoaXNbUXRdKHQpLHRoaXN9ZGVmYXVsdCh0LGUscyl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gWypdIFtzdHJpbmddXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSxzJiYodSh0LHYodGhpcyxjdCxcImZcIikpLHYodGhpcyxldCxcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW3RdPXMpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJih1KHQsdih0aGlzLGN0LFwiZlwiKSksdih0aGlzLGV0LFwiZlwiKS5kZWZhdWx0RGVzY3JpcHRpb25bdF18fCh2KHRoaXMsZXQsXCJmXCIpLmRlZmF1bHREZXNjcmlwdGlvblt0XT12KHRoaXMscHQsXCJmXCIpLmZ1bmN0aW9uRGVzY3JpcHRpb24oZSkpLGU9ZS5jYWxsKCkpLHRoaXNbU3RdKHRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLFwiZGVmYXVsdFwiLHQsZSksdGhpc31kZWZhdWx0cyh0LGUscyl7cmV0dXJuIHRoaXMuZGVmYXVsdCh0LGUscyl9ZGVtYW5kQ29tbWFuZCh0PTEsZSxzLGkpe3JldHVybiBoKFwiW251bWJlcl0gW251bWJlcnxzdHJpbmddIFtzdHJpbmd8bnVsbHx1bmRlZmluZWRdIFtzdHJpbmd8bnVsbHx1bmRlZmluZWRdXCIsW3QsZSxzLGldLGFyZ3VtZW50cy5sZW5ndGgpLFwibnVtYmVyXCIhPXR5cGVvZiBlJiYocz1lLGU9MS8wKSx0aGlzLmdsb2JhbChcIl9cIiwhMSksdih0aGlzLGV0LFwiZlwiKS5kZW1hbmRlZENvbW1hbmRzLl89e21pbjp0LG1heDplLG1pbk1zZzpzLG1heE1zZzppfSx0aGlzfWRlbWFuZCh0LGUscyl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/KGUuZm9yRWFjaCgodD0+e2QocywhMCx2KHRoaXMsY3QsXCJmXCIpKSx0aGlzLmRlbWFuZE9wdGlvbih0LHMpfSkpLGU9MS8wKTpcIm51bWJlclwiIT10eXBlb2YgZSYmKHM9ZSxlPTEvMCksXCJudW1iZXJcIj09dHlwZW9mIHQ/KGQocywhMCx2KHRoaXMsY3QsXCJmXCIpKSx0aGlzLmRlbWFuZENvbW1hbmQodCxlLHMscykpOkFycmF5LmlzQXJyYXkodCk/dC5mb3JFYWNoKCh0PT57ZChzLCEwLHYodGhpcyxjdCxcImZcIikpLHRoaXMuZGVtYW5kT3B0aW9uKHQscyl9KSk6XCJzdHJpbmdcIj09dHlwZW9mIHM/dGhpcy5kZW1hbmRPcHRpb24odCxzKTohMCE9PXMmJnZvaWQgMCE9PXN8fHRoaXMuZGVtYW5kT3B0aW9uKHQpLHRoaXN9ZGVtYW5kT3B0aW9uKHQsZSl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW1N0XSh0aGlzLmRlbWFuZE9wdGlvbi5iaW5kKHRoaXMpLFwiZGVtYW5kZWRPcHRpb25zXCIsdCxlKSx0aGlzfWRlcHJlY2F0ZU9wdGlvbih0LGUpe3JldHVybiBoKFwiPHN0cmluZz4gW3N0cmluZ3xib29sZWFuXVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLHYodGhpcyxldCxcImZcIikuZGVwcmVjYXRlZE9wdGlvbnNbdF09ZSx0aGlzfWRlc2NyaWJlKHQsZSl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW050XSh0LCEwKSx2KHRoaXMscHQsXCJmXCIpLmRlc2NyaWJlKHQsZSksdGhpc31kZXRlY3RMb2NhbGUodCl7cmV0dXJuIGgoXCI8Ym9vbGVhbj5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksTyh0aGlzLEcsdCxcImZcIiksdGhpc31lbnYodCl7cmV0dXJuIGgoXCJbc3RyaW5nfGJvb2xlYW5dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLCExPT09dD9kZWxldGUgdih0aGlzLGV0LFwiZlwiKS5lbnZQcmVmaXg6dih0aGlzLGV0LFwiZlwiKS5lbnZQcmVmaXg9dHx8XCJcIix0aGlzfWVwaWxvZ3VlKHQpe3JldHVybiBoKFwiPHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLHB0LFwiZlwiKS5lcGlsb2codCksdGhpc31lcGlsb2codCl7cmV0dXJuIHRoaXMuZXBpbG9ndWUodCl9ZXhhbXBsZSh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xhcnJheT4gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSxBcnJheS5pc0FycmF5KHQpP3QuZm9yRWFjaCgodD0+dGhpcy5leGFtcGxlKC4uLnQpKSk6dih0aGlzLHB0LFwiZlwiKS5leGFtcGxlKHQsZSksdGhpc31leGl0KHQsZSl7Tyh0aGlzLEosITAsXCJmXCIpLE8odGhpcyxWLGUsXCJmXCIpLHYodGhpcyxULFwiZlwiKSYmdih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmV4aXQodCl9ZXhpdFByb2Nlc3ModD0hMCl7cmV0dXJuIGgoXCJbYm9vbGVhbl1cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksTyh0aGlzLFQsdCxcImZcIiksdGhpc31mYWlsKHQpe2lmKGgoXCI8ZnVuY3Rpb258Ym9vbGVhbj5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksXCJib29sZWFuXCI9PXR5cGVvZiB0JiYhMSE9PXQpdGhyb3cgbmV3IGUoXCJJbnZhbGlkIGZpcnN0IGFyZ3VtZW50LiBFeHBlY3RlZCBmdW5jdGlvbiBvciBib29sZWFuICdmYWxzZSdcIik7cmV0dXJuIHYodGhpcyxwdCxcImZcIikuZmFpbEZuKHQpLHRoaXN9Z2V0QWxpYXNlcygpe3JldHVybiB0aGlzLnBhcnNlZD90aGlzLnBhcnNlZC5hbGlhc2VzOnt9fWFzeW5jIGdldENvbXBsZXRpb24odCxlKXtyZXR1cm4gaChcIjxhcnJheT4gW2Z1bmN0aW9uXVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLGU/dih0aGlzLFUsXCJmXCIpLmdldENvbXBsZXRpb24odCxlKTpuZXcgUHJvbWlzZSgoKGUscyk9Pnt2KHRoaXMsVSxcImZcIikuZ2V0Q29tcGxldGlvbih0LCgodCxpKT0+e3Q/cyh0KTplKGkpfSkpfSkpfWdldERlbWFuZGVkT3B0aW9ucygpe3JldHVybiBoKFtdLDApLHYodGhpcyxldCxcImZcIikuZGVtYW5kZWRPcHRpb25zfWdldERlbWFuZGVkQ29tbWFuZHMoKXtyZXR1cm4gaChbXSwwKSx2KHRoaXMsZXQsXCJmXCIpLmRlbWFuZGVkQ29tbWFuZHN9Z2V0RGVwcmVjYXRlZE9wdGlvbnMoKXtyZXR1cm4gaChbXSwwKSx2KHRoaXMsZXQsXCJmXCIpLmRlcHJlY2F0ZWRPcHRpb25zfWdldERldGVjdExvY2FsZSgpe3JldHVybiB2KHRoaXMsRyxcImZcIil9Z2V0RXhpdFByb2Nlc3MoKXtyZXR1cm4gdih0aGlzLFQsXCJmXCIpfWdldEdyb3Vwcygpe3JldHVybiBPYmplY3QuYXNzaWduKHt9LHYodGhpcyxLLFwiZlwiKSx2KHRoaXMsYXQsXCJmXCIpKX1nZXRIZWxwKCl7aWYoTyh0aGlzLEosITAsXCJmXCIpLCF2KHRoaXMscHQsXCJmXCIpLmhhc0NhY2hlZEhlbHBNZXNzYWdlKCkpe2lmKCF0aGlzLnBhcnNlZCl7Y29uc3QgdD10aGlzW0p0XSh2KHRoaXMsaHQsXCJmXCIpLHZvaWQgMCx2b2lkIDAsMCwhMCk7aWYoZih0KSlyZXR1cm4gdC50aGVuKCgoKT0+dih0aGlzLHB0LFwiZlwiKS5oZWxwKCkpKX1jb25zdCB0PXYodGhpcyx6LFwiZlwiKS5ydW5EZWZhdWx0QnVpbGRlck9uKHRoaXMpO2lmKGYodCkpcmV0dXJuIHQudGhlbigoKCk9PnYodGhpcyxwdCxcImZcIikuaGVscCgpKSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KHRoaXMscHQsXCJmXCIpLmhlbHAoKSl9Z2V0T3B0aW9ucygpe3JldHVybiB2KHRoaXMsZXQsXCJmXCIpfWdldFN0cmljdCgpe3JldHVybiB2KHRoaXMsZnQsXCJmXCIpfWdldFN0cmljdENvbW1hbmRzKCl7cmV0dXJuIHYodGhpcyxkdCxcImZcIil9Z2V0U3RyaWN0T3B0aW9ucygpe3JldHVybiB2KHRoaXMsdXQsXCJmXCIpfWdsb2JhbCh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xhcnJheT4gW2Jvb2xlYW5dXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdD1bXS5jb25jYXQodCksITEhPT1lP3YodGhpcyxldCxcImZcIikubG9jYWw9dih0aGlzLGV0LFwiZlwiKS5sb2NhbC5maWx0ZXIoKGU9Pi0xPT09dC5pbmRleE9mKGUpKSk6dC5mb3JFYWNoKCh0PT57dih0aGlzLGV0LFwiZlwiKS5sb2NhbC5pbmNsdWRlcyh0KXx8dih0aGlzLGV0LFwiZlwiKS5sb2NhbC5wdXNoKHQpfSkpLHRoaXN9Z3JvdXAodCxlKXtoKFwiPHN0cmluZ3xhcnJheT4gPHN0cmluZz5cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKTtjb25zdCBzPXYodGhpcyxhdCxcImZcIilbZV18fHYodGhpcyxLLFwiZlwiKVtlXTt2KHRoaXMsYXQsXCJmXCIpW2VdJiZkZWxldGUgdih0aGlzLGF0LFwiZlwiKVtlXTtjb25zdCBpPXt9O3JldHVybiB2KHRoaXMsSyxcImZcIilbZV09KHN8fFtdKS5jb25jYXQodCkuZmlsdGVyKCh0PT4haVt0XSYmKGlbdF09ITApKSksdGhpc31oaWRlKHQpe3JldHVybiBoKFwiPHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLGV0LFwiZlwiKS5oaWRkZW5PcHRpb25zLnB1c2godCksdGhpc31pbXBsaWVzKHQsZSl7cmV0dXJuIGgoXCI8c3RyaW5nfG9iamVjdD4gW251bWJlcnxzdHJpbmd8YXJyYXldXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLHl0LFwiZlwiKS5pbXBsaWVzKHQsZSksdGhpc31sb2NhbGUodCl7cmV0dXJuIGgoXCJbc3RyaW5nXVwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSx2b2lkIDA9PT10Pyh0aGlzW2t0XSgpLHYodGhpcyxjdCxcImZcIikueTE4bi5nZXRMb2NhbGUoKSk6KE8odGhpcyxHLCExLFwiZlwiKSx2KHRoaXMsY3QsXCJmXCIpLnkxOG4uc2V0TG9jYWxlKHQpLHRoaXMpfW1pZGRsZXdhcmUodCxlLHMpe3JldHVybiB2KHRoaXMsWSxcImZcIikuYWRkTWlkZGxld2FyZSh0LCEhZSxzKX1uYXJncyh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xvYmplY3R8YXJyYXk+IFtudW1iZXJdXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tTdF0odGhpcy5uYXJncy5iaW5kKHRoaXMpLFwibmFyZ1wiLHQsZSksdGhpc31ub3JtYWxpemUodCl7cmV0dXJuIGgoXCI8YXJyYXl8c3RyaW5nPlwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW1B0XShcIm5vcm1hbGl6ZVwiLHQpLHRoaXN9bnVtYmVyKHQpe3JldHVybiBoKFwiPGFycmF5fHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tQdF0oXCJudW1iZXJcIix0KSx0aGlzW1F0XSh0KSx0aGlzfW9wdGlvbih0LGUpe2lmKGgoXCI8c3RyaW5nfG9iamVjdD4gW29iamVjdF1cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSxcIm9iamVjdFwiPT10eXBlb2YgdClPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChlPT57dGhpcy5vcHRpb25zKGUsdFtlXSl9KSk7ZWxzZXtcIm9iamVjdFwiIT10eXBlb2YgZSYmKGU9e30pLHRoaXNbUXRdKHQpLCF2KHRoaXMsbXQsXCJmXCIpfHxcInZlcnNpb25cIiE9PXQmJlwidmVyc2lvblwiIT09KG51bGw9PWU/dm9pZCAwOmUuYWxpYXMpfHx0aGlzW3d0XShbJ1widmVyc2lvblwiIGlzIGEgcmVzZXJ2ZWQgd29yZC4nLFwiUGxlYXNlIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOlwiLCctIERpc2FibGUgdmVyc2lvbiB3aXRoIGB5YXJncy52ZXJzaW9uKGZhbHNlKWAgaWYgdXNpbmcgXCJ2ZXJzaW9uXCIgYXMgYW4gb3B0aW9uJyxcIi0gVXNlIHRoZSBidWlsdC1pbiBgeWFyZ3MudmVyc2lvbmAgbWV0aG9kIGluc3RlYWQgKGlmIGFwcGxpY2FibGUpXCIsXCItIFVzZSBhIGRpZmZlcmVudCBvcHRpb24ga2V5XCIsXCJodHRwczovL3lhcmdzLmpzLm9yZy9kb2NzLyNhcGktcmVmZXJlbmNlLXZlcnNpb25cIl0uam9pbihcIlxcblwiKSx2b2lkIDAsXCJ2ZXJzaW9uV2FybmluZ1wiKSx2KHRoaXMsZXQsXCJmXCIpLmtleVt0XT0hMCxlLmFsaWFzJiZ0aGlzLmFsaWFzKHQsZS5hbGlhcyk7Y29uc3Qgcz1lLmRlcHJlY2F0ZXx8ZS5kZXByZWNhdGVkO3MmJnRoaXMuZGVwcmVjYXRlT3B0aW9uKHQscyk7Y29uc3QgaT1lLmRlbWFuZHx8ZS5yZXF1aXJlZHx8ZS5yZXF1aXJlO2kmJnRoaXMuZGVtYW5kKHQsaSksZS5kZW1hbmRPcHRpb24mJnRoaXMuZGVtYW5kT3B0aW9uKHQsXCJzdHJpbmdcIj09dHlwZW9mIGUuZGVtYW5kT3B0aW9uP2UuZGVtYW5kT3B0aW9uOnZvaWQgMCksZS5jb25mbGljdHMmJnRoaXMuY29uZmxpY3RzKHQsZS5jb25mbGljdHMpLFwiZGVmYXVsdFwiaW4gZSYmdGhpcy5kZWZhdWx0KHQsZS5kZWZhdWx0KSx2b2lkIDAhPT1lLmltcGxpZXMmJnRoaXMuaW1wbGllcyh0LGUuaW1wbGllcyksdm9pZCAwIT09ZS5uYXJncyYmdGhpcy5uYXJncyh0LGUubmFyZ3MpLGUuY29uZmlnJiZ0aGlzLmNvbmZpZyh0LGUuY29uZmlnUGFyc2VyKSxlLm5vcm1hbGl6ZSYmdGhpcy5ub3JtYWxpemUodCksZS5jaG9pY2VzJiZ0aGlzLmNob2ljZXModCxlLmNob2ljZXMpLGUuY29lcmNlJiZ0aGlzLmNvZXJjZSh0LGUuY29lcmNlKSxlLmdyb3VwJiZ0aGlzLmdyb3VwKHQsZS5ncm91cCksKGUuYm9vbGVhbnx8XCJib29sZWFuXCI9PT1lLnR5cGUpJiYodGhpcy5ib29sZWFuKHQpLGUuYWxpYXMmJnRoaXMuYm9vbGVhbihlLmFsaWFzKSksKGUuYXJyYXl8fFwiYXJyYXlcIj09PWUudHlwZSkmJih0aGlzLmFycmF5KHQpLGUuYWxpYXMmJnRoaXMuYXJyYXkoZS5hbGlhcykpLChlLm51bWJlcnx8XCJudW1iZXJcIj09PWUudHlwZSkmJih0aGlzLm51bWJlcih0KSxlLmFsaWFzJiZ0aGlzLm51bWJlcihlLmFsaWFzKSksKGUuc3RyaW5nfHxcInN0cmluZ1wiPT09ZS50eXBlKSYmKHRoaXMuc3RyaW5nKHQpLGUuYWxpYXMmJnRoaXMuc3RyaW5nKGUuYWxpYXMpKSwoZS5jb3VudHx8XCJjb3VudFwiPT09ZS50eXBlKSYmdGhpcy5jb3VudCh0KSxcImJvb2xlYW5cIj09dHlwZW9mIGUuZ2xvYmFsJiZ0aGlzLmdsb2JhbCh0LGUuZ2xvYmFsKSxlLmRlZmF1bHREZXNjcmlwdGlvbiYmKHYodGhpcyxldCxcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW3RdPWUuZGVmYXVsdERlc2NyaXB0aW9uKSxlLnNraXBWYWxpZGF0aW9uJiZ0aGlzLnNraXBWYWxpZGF0aW9uKHQpO2NvbnN0IG49ZS5kZXNjcmliZXx8ZS5kZXNjcmlwdGlvbnx8ZS5kZXNjLHI9dih0aGlzLHB0LFwiZlwiKS5nZXREZXNjcmlwdGlvbnMoKTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocix0KSYmXCJzdHJpbmdcIiE9dHlwZW9mIG58fHRoaXMuZGVzY3JpYmUodCxuKSxlLmhpZGRlbiYmdGhpcy5oaWRlKHQpLGUucmVxdWlyZXNBcmcmJnRoaXMucmVxdWlyZXNBcmcodCl9cmV0dXJuIHRoaXN9b3B0aW9ucyh0LGUpe3JldHVybiB0aGlzLm9wdGlvbih0LGUpfXBhcnNlKHQsZSxzKXtoKFwiW3N0cmluZ3xhcnJheV0gW2Z1bmN0aW9ufGJvb2xlYW58b2JqZWN0XSBbZnVuY3Rpb25dXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW0N0XSgpLHZvaWQgMD09PXQmJih0PXYodGhpcyxodCxcImZcIikpLFwib2JqZWN0XCI9PXR5cGVvZiBlJiYoTyh0aGlzLHJ0LGUsXCJmXCIpLGU9cyksXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmKE8odGhpcyxudCxlLFwiZlwiKSxlPSExKSxlfHxPKHRoaXMsaHQsdCxcImZcIiksdih0aGlzLG50LFwiZlwiKSYmTyh0aGlzLFQsITEsXCJmXCIpO2NvbnN0IGk9dGhpc1tKdF0odCwhIWUpLG49dGhpcy5wYXJzZWQ7cmV0dXJuIHYodGhpcyxVLFwiZlwiKS5zZXRQYXJzZWQodGhpcy5wYXJzZWQpLGYoaSk/aS50aGVuKCh0PT4odih0aGlzLG50LFwiZlwiKSYmdih0aGlzLG50LFwiZlwiKS5jYWxsKHRoaXMsdih0aGlzLFYsXCJmXCIpLHQsdih0aGlzLHR0LFwiZlwiKSksdCkpKS5jYXRjaCgodD0+e3Rocm93IHYodGhpcyxudCxcImZcIikmJnYodGhpcyxudCxcImZcIikodCx0aGlzLnBhcnNlZC5hcmd2LHYodGhpcyx0dCxcImZcIikpLHR9KSkuZmluYWxseSgoKCk9Pnt0aGlzW0h0XSgpLHRoaXMucGFyc2VkPW59KSk6KHYodGhpcyxudCxcImZcIikmJnYodGhpcyxudCxcImZcIikuY2FsbCh0aGlzLHYodGhpcyxWLFwiZlwiKSxpLHYodGhpcyx0dCxcImZcIikpLHRoaXNbSHRdKCksdGhpcy5wYXJzZWQ9bixpKX1wYXJzZUFzeW5jKHQsZSxzKXtjb25zdCBpPXRoaXMucGFyc2UodCxlLHMpO3JldHVybiBmKGkpP2k6UHJvbWlzZS5yZXNvbHZlKGkpfXBhcnNlU3luYyh0LHMsaSl7Y29uc3Qgbj10aGlzLnBhcnNlKHQscyxpKTtpZihmKG4pKXRocm93IG5ldyBlKFwiLnBhcnNlU3luYygpIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhc3luY2hyb25vdXMgYnVpbGRlcnMsIGhhbmRsZXJzLCBvciBtaWRkbGV3YXJlXCIpO3JldHVybiBufXBhcnNlckNvbmZpZ3VyYXRpb24odCl7cmV0dXJuIGgoXCI8b2JqZWN0PlwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsaXQsdCxcImZcIiksdGhpc31wa2dDb25mKHQsZSl7aChcIjxzdHJpbmc+IFtzdHJpbmddXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCk7bGV0IHM9bnVsbDtjb25zdCBpPXRoaXNbQXRdKGV8fHYodGhpcyxXLFwiZlwiKSk7cmV0dXJuIGlbdF0mJlwib2JqZWN0XCI9PXR5cGVvZiBpW3RdJiYocz1uKGlbdF0sZXx8dih0aGlzLFcsXCJmXCIpLHRoaXNbTXRdKClbXCJkZWVwLW1lcmdlLWNvbmZpZ1wiXXx8ITEsdih0aGlzLGN0LFwiZlwiKSksdih0aGlzLGV0LFwiZlwiKS5jb25maWdPYmplY3RzPSh2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHN8fFtdKS5jb25jYXQocykpLHRoaXN9cG9zaXRpb25hbCh0LGUpe2goXCI8c3RyaW5nPiA8b2JqZWN0PlwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpO2NvbnN0IHM9W1wiZGVmYXVsdFwiLFwiZGVmYXVsdERlc2NyaXB0aW9uXCIsXCJpbXBsaWVzXCIsXCJub3JtYWxpemVcIixcImNob2ljZXNcIixcImNvbmZsaWN0c1wiLFwiY29lcmNlXCIsXCJ0eXBlXCIsXCJkZXNjcmliZVwiLFwiZGVzY1wiLFwiZGVzY3JpcHRpb25cIixcImFsaWFzXCJdO2U9ZyhlLCgodCxlKT0+IShcInR5cGVcIj09PXQmJiFbXCJzdHJpbmdcIixcIm51bWJlclwiLFwiYm9vbGVhblwiXS5pbmNsdWRlcyhlKSkmJnMuaW5jbHVkZXModCkpKTtjb25zdCBpPXYodGhpcyxxLFwiZlwiKS5mdWxsQ29tbWFuZHNbdih0aGlzLHEsXCJmXCIpLmZ1bGxDb21tYW5kcy5sZW5ndGgtMV0sbj1pP3YodGhpcyx6LFwiZlwiKS5jbWRUb1BhcnNlT3B0aW9ucyhpKTp7YXJyYXk6W10sYWxpYXM6e30sZGVmYXVsdDp7fSxkZW1hbmQ6e319O3JldHVybiBwKG4pLmZvckVhY2goKHM9Pntjb25zdCBpPW5bc107QXJyYXkuaXNBcnJheShpKT8tMSE9PWkuaW5kZXhPZih0KSYmKGVbc109ITApOmlbdF0mJiEocyBpbiBlKSYmKGVbc109aVt0XSl9KSksdGhpcy5ncm91cCh0LHYodGhpcyxwdCxcImZcIikuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpKSx0aGlzLm9wdGlvbih0LGUpfXJlY29tbWVuZENvbW1hbmRzKHQ9ITApe3JldHVybiBoKFwiW2Jvb2xlYW5dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLE8odGhpcyxsdCx0LFwiZlwiKSx0aGlzfXJlcXVpcmVkKHQsZSxzKXtyZXR1cm4gdGhpcy5kZW1hbmQodCxlLHMpfXJlcXVpcmUodCxlLHMpe3JldHVybiB0aGlzLmRlbWFuZCh0LGUscyl9cmVxdWlyZXNBcmcodCl7cmV0dXJuIGgoXCI8YXJyYXl8c3RyaW5nfG9iamVjdD4gW251bWJlcl1cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksXCJzdHJpbmdcIj09dHlwZW9mIHQmJnYodGhpcyxldCxcImZcIikubmFyZ1t0XXx8dGhpc1tTdF0odGhpcy5yZXF1aXJlc0FyZy5iaW5kKHRoaXMpLFwibmFyZ1wiLHQsTmFOKSx0aGlzfXNob3dDb21wbGV0aW9uU2NyaXB0KHQsZSl7cmV0dXJuIGgoXCJbc3RyaW5nXSBbc3RyaW5nXVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLHQ9dHx8dGhpcy4kMCx2KHRoaXMsUSxcImZcIikubG9nKHYodGhpcyxVLFwiZlwiKS5nZW5lcmF0ZUNvbXBsZXRpb25TY3JpcHQodCxlfHx2KHRoaXMsRixcImZcIil8fFwiY29tcGxldGlvblwiKSksdGhpc31zaG93SGVscCh0KXtpZihoKFwiW3N0cmluZ3xmdW5jdGlvbl1cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksTyh0aGlzLEosITAsXCJmXCIpLCF2KHRoaXMscHQsXCJmXCIpLmhhc0NhY2hlZEhlbHBNZXNzYWdlKCkpe2lmKCF0aGlzLnBhcnNlZCl7Y29uc3QgZT10aGlzW0p0XSh2KHRoaXMsaHQsXCJmXCIpLHZvaWQgMCx2b2lkIDAsMCwhMCk7aWYoZihlKSlyZXR1cm4gZS50aGVuKCgoKT0+e3YodGhpcyxwdCxcImZcIikuc2hvd0hlbHAodCl9KSksdGhpc31jb25zdCBlPXYodGhpcyx6LFwiZlwiKS5ydW5EZWZhdWx0QnVpbGRlck9uKHRoaXMpO2lmKGYoZSkpcmV0dXJuIGUudGhlbigoKCk9Pnt2KHRoaXMscHQsXCJmXCIpLnNob3dIZWxwKHQpfSkpLHRoaXN9cmV0dXJuIHYodGhpcyxwdCxcImZcIikuc2hvd0hlbHAodCksdGhpc31zY3JpcHROYW1lKHQpe3JldHVybiB0aGlzLmN1c3RvbVNjcmlwdE5hbWU9ITAsdGhpcy4kMD10LHRoaXN9c2hvd0hlbHBPbkZhaWwodCxlKXtyZXR1cm4gaChcIltib29sZWFufHN0cmluZ10gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx2KHRoaXMscHQsXCJmXCIpLnNob3dIZWxwT25GYWlsKHQsZSksdGhpc31zaG93VmVyc2lvbih0KXtyZXR1cm4gaChcIltzdHJpbmd8ZnVuY3Rpb25dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHYodGhpcyxwdCxcImZcIikuc2hvd1ZlcnNpb24odCksdGhpc31za2lwVmFsaWRhdGlvbih0KXtyZXR1cm4gaChcIjxhcnJheXxzdHJpbmc+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbUHRdKFwic2tpcFZhbGlkYXRpb25cIix0KSx0aGlzfXN0cmljdCh0KXtyZXR1cm4gaChcIltib29sZWFuXVwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsZnQsITEhPT10LFwiZlwiKSx0aGlzfXN0cmljdENvbW1hbmRzKHQpe3JldHVybiBoKFwiW2Jvb2xlYW5dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLE8odGhpcyxkdCwhMSE9PXQsXCJmXCIpLHRoaXN9c3RyaWN0T3B0aW9ucyh0KXtyZXR1cm4gaChcIltib29sZWFuXVwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsdXQsITEhPT10LFwiZlwiKSx0aGlzfXN0cmluZyh0KXtyZXR1cm4gaChcIjxhcnJheXxzdHJpbmc+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbUHRdKFwic3RyaW5nXCIsdCksdGhpc1tRdF0odCksdGhpc310ZXJtaW5hbFdpZHRoKCl7cmV0dXJuIGgoW10sMCksdih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLnN0ZENvbHVtbnN9dXBkYXRlTG9jYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVN0cmluZ3ModCl9dXBkYXRlU3RyaW5ncyh0KXtyZXR1cm4gaChcIjxvYmplY3Q+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLE8odGhpcyxHLCExLFwiZlwiKSx2KHRoaXMsY3QsXCJmXCIpLnkxOG4udXBkYXRlTG9jYWxlKHQpLHRoaXN9dXNhZ2UodCxzLGksbil7aWYoaChcIjxzdHJpbmd8bnVsbHx1bmRlZmluZWQ+IFtzdHJpbmd8Ym9vbGVhbl0gW2Z1bmN0aW9ufG9iamVjdF0gW2Z1bmN0aW9uXVwiLFt0LHMsaSxuXSxhcmd1bWVudHMubGVuZ3RoKSx2b2lkIDAhPT1zKXtpZihkKHQsbnVsbCx2KHRoaXMsY3QsXCJmXCIpKSwodHx8XCJcIikubWF0Y2goL15cXCQwKCB8JCkvKSlyZXR1cm4gdGhpcy5jb21tYW5kKHQscyxpLG4pO3Rocm93IG5ldyBlKFwiLnVzYWdlKCkgZGVzY3JpcHRpb24gbXVzdCBzdGFydCB3aXRoICQwIGlmIGJlaW5nIHVzZWQgYXMgYWxpYXMgZm9yIC5jb21tYW5kKClcIil9cmV0dXJuIHYodGhpcyxwdCxcImZcIikudXNhZ2UodCksdGhpc311c2FnZUNvbmZpZ3VyYXRpb24odCl7cmV0dXJuIGgoXCI8b2JqZWN0PlwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsZ3QsdCxcImZcIiksdGhpc312ZXJzaW9uKHQsZSxzKXtjb25zdCBpPVwidmVyc2lvblwiO2lmKGgoXCJbYm9vbGVhbnxzdHJpbmddIFtzdHJpbmddIFtzdHJpbmddXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSx2KHRoaXMsbXQsXCJmXCIpJiYodGhpc1tPdF0odih0aGlzLG10LFwiZlwiKSksdih0aGlzLHB0LFwiZlwiKS52ZXJzaW9uKHZvaWQgMCksTyh0aGlzLG10LG51bGwsXCJmXCIpKSwwPT09YXJndW1lbnRzLmxlbmd0aClzPXRoaXNbeHRdKCksdD1pO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCExPT09dClyZXR1cm4gdGhpcztzPXQsdD1pfWVsc2UgMj09PWFyZ3VtZW50cy5sZW5ndGgmJihzPWUsZT12b2lkIDApO3JldHVybiBPKHRoaXMsbXQsXCJzdHJpbmdcIj09dHlwZW9mIHQ/dDppLFwiZlwiKSxlPWV8fHYodGhpcyxwdCxcImZcIikuZGVmZXJZMThuTG9va3VwKFwiU2hvdyB2ZXJzaW9uIG51bWJlclwiKSx2KHRoaXMscHQsXCJmXCIpLnZlcnNpb24oc3x8dm9pZCAwKSx0aGlzLmJvb2xlYW4odih0aGlzLG10LFwiZlwiKSksdGhpcy5kZXNjcmliZSh2KHRoaXMsbXQsXCJmXCIpLGUpLHRoaXN9d3JhcCh0KXtyZXR1cm4gaChcIjxudW1iZXJ8bnVsbHx1bmRlZmluZWQ+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHYodGhpcyxwdCxcImZcIikud3JhcCh0KSx0aGlzfVsoej1uZXcgV2Vha01hcCxXPW5ldyBXZWFrTWFwLHE9bmV3IFdlYWtNYXAsVT1uZXcgV2Vha01hcCxGPW5ldyBXZWFrTWFwLEw9bmV3IFdlYWtNYXAsVj1uZXcgV2Vha01hcCxHPW5ldyBXZWFrTWFwLFI9bmV3IFdlYWtNYXAsVD1uZXcgV2Vha01hcCxCPW5ldyBXZWFrTWFwLFk9bmV3IFdlYWtNYXAsSz1uZXcgV2Vha01hcCxKPW5ldyBXZWFrTWFwLFo9bmV3IFdlYWtNYXAsWD1uZXcgV2Vha01hcCxRPW5ldyBXZWFrTWFwLHR0PW5ldyBXZWFrTWFwLGV0PW5ldyBXZWFrTWFwLHN0PW5ldyBXZWFrTWFwLGl0PW5ldyBXZWFrTWFwLG50PW5ldyBXZWFrTWFwLHJ0PW5ldyBXZWFrTWFwLG90PW5ldyBXZWFrTWFwLGF0PW5ldyBXZWFrTWFwLGh0PW5ldyBXZWFrTWFwLGx0PW5ldyBXZWFrTWFwLGN0PW5ldyBXZWFrTWFwLGZ0PW5ldyBXZWFrTWFwLGR0PW5ldyBXZWFrTWFwLHV0PW5ldyBXZWFrTWFwLHB0PW5ldyBXZWFrTWFwLGd0PW5ldyBXZWFrTWFwLG10PW5ldyBXZWFrTWFwLHl0PW5ldyBXZWFrTWFwLGJ0KV0odCl7aWYoIXQuX3x8IXRbXCItLVwiXSlyZXR1cm4gdDt0Ll8ucHVzaC5hcHBseSh0Ll8sdFtcIi0tXCJdKTt0cnl7ZGVsZXRlIHRbXCItLVwiXX1jYXRjaCh0KXt9cmV0dXJuIHR9W3Z0XSgpe3JldHVybntsb2c6KC4uLnQpPT57dGhpc1tSdF0oKXx8Y29uc29sZS5sb2coLi4udCksTyh0aGlzLEosITAsXCJmXCIpLHYodGhpcyx0dCxcImZcIikubGVuZ3RoJiZPKHRoaXMsdHQsdih0aGlzLHR0LFwiZlwiKStcIlxcblwiLFwiZlwiKSxPKHRoaXMsdHQsdih0aGlzLHR0LFwiZlwiKSt0LmpvaW4oXCIgXCIpLFwiZlwiKX0sZXJyb3I6KC4uLnQpPT57dGhpc1tSdF0oKXx8Y29uc29sZS5lcnJvciguLi50KSxPKHRoaXMsSiwhMCxcImZcIiksdih0aGlzLHR0LFwiZlwiKS5sZW5ndGgmJk8odGhpcyx0dCx2KHRoaXMsdHQsXCJmXCIpK1wiXFxuXCIsXCJmXCIpLE8odGhpcyx0dCx2KHRoaXMsdHQsXCJmXCIpK3Quam9pbihcIiBcIiksXCJmXCIpfX19W090XSh0KXtwKHYodGhpcyxldCxcImZcIikpLmZvckVhY2goKGU9PntpZihcImNvbmZpZ09iamVjdHNcIj09PWUpcmV0dXJuO2NvbnN0IHM9dih0aGlzLGV0LFwiZlwiKVtlXTtBcnJheS5pc0FycmF5KHMpP3MuaW5jbHVkZXModCkmJnMuc3BsaWNlKHMuaW5kZXhPZih0KSwxKTpcIm9iamVjdFwiPT10eXBlb2YgcyYmZGVsZXRlIHNbdF19KSksZGVsZXRlIHYodGhpcyxwdCxcImZcIikuZ2V0RGVzY3JpcHRpb25zKClbdF19W3d0XSh0LGUscyl7dih0aGlzLFIsXCJmXCIpW3NdfHwodih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmVtaXRXYXJuaW5nKHQsZSksdih0aGlzLFIsXCJmXCIpW3NdPSEwKX1bQ3RdKCl7dih0aGlzLEIsXCJmXCIpLnB1c2goe29wdGlvbnM6dih0aGlzLGV0LFwiZlwiKSxjb25maWdPYmplY3RzOnYodGhpcyxldCxcImZcIikuY29uZmlnT2JqZWN0cy5zbGljZSgwKSxleGl0UHJvY2Vzczp2KHRoaXMsVCxcImZcIiksZ3JvdXBzOnYodGhpcyxLLFwiZlwiKSxzdHJpY3Q6dih0aGlzLGZ0LFwiZlwiKSxzdHJpY3RDb21tYW5kczp2KHRoaXMsZHQsXCJmXCIpLHN0cmljdE9wdGlvbnM6dih0aGlzLHV0LFwiZlwiKSxjb21wbGV0aW9uQ29tbWFuZDp2KHRoaXMsRixcImZcIiksb3V0cHV0OnYodGhpcyx0dCxcImZcIiksZXhpdEVycm9yOnYodGhpcyxWLFwiZlwiKSxoYXNPdXRwdXQ6dih0aGlzLEosXCJmXCIpLHBhcnNlZDp0aGlzLnBhcnNlZCxwYXJzZUZuOnYodGhpcyxudCxcImZcIikscGFyc2VDb250ZXh0OnYodGhpcyxydCxcImZcIil9KSx2KHRoaXMscHQsXCJmXCIpLmZyZWV6ZSgpLHYodGhpcyx5dCxcImZcIikuZnJlZXplKCksdih0aGlzLHosXCJmXCIpLmZyZWV6ZSgpLHYodGhpcyxZLFwiZlwiKS5mcmVlemUoKX1banRdKCl7bGV0IHQsZT1cIlwiO3JldHVybiB0PS9cXGIobm9kZXxpb2pzfGVsZWN0cm9uKShcXC5leGUpPyQvLnRlc3Qodih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmFyZ3YoKVswXSk/dih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmFyZ3YoKS5zbGljZSgxLDIpOnYodGhpcyxjdCxcImZcIikucHJvY2Vzcy5hcmd2KCkuc2xpY2UoMCwxKSxlPXQubWFwKCh0PT57Y29uc3QgZT10aGlzW1l0XSh2KHRoaXMsVyxcImZcIiksdCk7cmV0dXJuIHQubWF0Y2goL14oXFwvfChbYS16QS1aXTopP1xcXFwpLykmJmUubGVuZ3RoPHQubGVuZ3RoP2U6dH0pKS5qb2luKFwiIFwiKS50cmltKCksdih0aGlzLGN0LFwiZlwiKS5nZXRFbnYoXCJfXCIpJiZ2KHRoaXMsY3QsXCJmXCIpLmdldFByb2Nlc3NBcmd2QmluKCk9PT12KHRoaXMsY3QsXCJmXCIpLmdldEVudihcIl9cIikmJihlPXYodGhpcyxjdCxcImZcIikuZ2V0RW52KFwiX1wiKS5yZXBsYWNlKGAke3YodGhpcyxjdCxcImZcIikucGF0aC5kaXJuYW1lKHYodGhpcyxjdCxcImZcIikucHJvY2Vzcy5leGVjUGF0aCgpKX0vYCxcIlwiKSksZX1bTXRdKCl7cmV0dXJuIHYodGhpcyxpdCxcImZcIil9W190XSgpe3JldHVybiB2KHRoaXMsZ3QsXCJmXCIpfVtrdF0oKXtpZighdih0aGlzLEcsXCJmXCIpKXJldHVybjtjb25zdCB0PXYodGhpcyxjdCxcImZcIikuZ2V0RW52KFwiTENfQUxMXCIpfHx2KHRoaXMsY3QsXCJmXCIpLmdldEVudihcIkxDX01FU1NBR0VTXCIpfHx2KHRoaXMsY3QsXCJmXCIpLmdldEVudihcIkxBTkdcIil8fHYodGhpcyxjdCxcImZcIikuZ2V0RW52KFwiTEFOR1VBR0VcIil8fFwiZW5fVVNcIjt0aGlzLmxvY2FsZSh0LnJlcGxhY2UoL1suOl0uKi8sXCJcIikpfVt4dF0oKXtyZXR1cm4gdGhpc1tBdF0oKS52ZXJzaW9ufHxcInVua25vd25cIn1bRXRdKHQpe2NvbnN0IGU9dFtcIi0tXCJdP3RbXCItLVwiXTp0Ll87Zm9yKGxldCB0LHM9MDt2b2lkIDAhPT0odD1lW3NdKTtzKyspdih0aGlzLGN0LFwiZlwiKS5QYXJzZXIubG9va3NMaWtlTnVtYmVyKHQpJiZOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dH1gKSkpJiYoZVtzXT1OdW1iZXIodCkpO3JldHVybiB0fVtBdF0odCl7Y29uc3QgZT10fHxcIipcIjtpZih2KHRoaXMsb3QsXCJmXCIpW2VdKXJldHVybiB2KHRoaXMsb3QsXCJmXCIpW2VdO2xldCBzPXt9O3RyeXtsZXQgZT10fHx2KHRoaXMsY3QsXCJmXCIpLm1haW5GaWxlbmFtZTshdCYmdih0aGlzLGN0LFwiZlwiKS5wYXRoLmV4dG5hbWUoZSkmJihlPXYodGhpcyxjdCxcImZcIikucGF0aC5kaXJuYW1lKGUpKTtjb25zdCBpPXYodGhpcyxjdCxcImZcIikuZmluZFVwKGUsKCh0LGUpPT5lLmluY2x1ZGVzKFwicGFja2FnZS5qc29uXCIpP1wicGFja2FnZS5qc29uXCI6dm9pZCAwKSk7ZChpLHZvaWQgMCx2KHRoaXMsY3QsXCJmXCIpKSxzPUpTT04ucGFyc2Uodih0aGlzLGN0LFwiZlwiKS5yZWFkRmlsZVN5bmMoaSxcInV0ZjhcIikpfWNhdGNoKHQpe31yZXR1cm4gdih0aGlzLG90LFwiZlwiKVtlXT1zfHx7fSx2KHRoaXMsb3QsXCJmXCIpW2VdfVtQdF0odCxlKXsoZT1bXS5jb25jYXQoZSkpLmZvckVhY2goKGU9PntlPXRoaXNbRHRdKGUpLHYodGhpcyxldCxcImZcIilbdF0ucHVzaChlKX0pKX1bU3RdKHQsZSxzLGkpe3RoaXNbSXRdKHQsZSxzLGksKCh0LGUscyk9Pnt2KHRoaXMsZXQsXCJmXCIpW3RdW2VdPXN9KSl9WyR0XSh0LGUscyxpKXt0aGlzW0l0XSh0LGUscyxpLCgodCxlLHMpPT57dih0aGlzLGV0LFwiZlwiKVt0XVtlXT0odih0aGlzLGV0LFwiZlwiKVt0XVtlXXx8W10pLmNvbmNhdChzKX0pKX1bSXRdKHQsZSxzLGksbil7aWYoQXJyYXkuaXNBcnJheShzKSlzLmZvckVhY2goKGU9Pnt0KGUsaSl9KSk7ZWxzZSBpZigodD0+XCJvYmplY3RcIj09dHlwZW9mIHQpKHMpKWZvcihjb25zdCBlIG9mIHAocykpdChlLHNbZV0pO2Vsc2UgbihlLHRoaXNbRHRdKHMpLGkpfVtEdF0odCl7cmV0dXJuXCJfX3Byb3RvX19cIj09PXQ/XCJfX19wcm90b19fX1wiOnR9W050XSh0LGUpe3JldHVybiB0aGlzW1N0XSh0aGlzW050XS5iaW5kKHRoaXMpLFwia2V5XCIsdCxlKSx0aGlzfVtIdF0oKXt2YXIgdCxlLHMsaSxuLHIsbyxhLGgsbCxjLGY7Y29uc3QgdT12KHRoaXMsQixcImZcIikucG9wKCk7bGV0IHA7ZCh1LHZvaWQgMCx2KHRoaXMsY3QsXCJmXCIpKSx0PXRoaXMsZT10aGlzLHM9dGhpcyxpPXRoaXMsbj10aGlzLHI9dGhpcyxvPXRoaXMsYT10aGlzLGg9dGhpcyxsPXRoaXMsYz10aGlzLGY9dGhpcywoe29wdGlvbnM6e3NldCB2YWx1ZShlKXtPKHQsZXQsZSxcImZcIil9fS52YWx1ZSxjb25maWdPYmplY3RzOnAsZXhpdFByb2Nlc3M6e3NldCB2YWx1ZSh0KXtPKGUsVCx0LFwiZlwiKX19LnZhbHVlLGdyb3Vwczp7c2V0IHZhbHVlKHQpe08ocyxLLHQsXCJmXCIpfX0udmFsdWUsb3V0cHV0OntzZXQgdmFsdWUodCl7TyhpLHR0LHQsXCJmXCIpfX0udmFsdWUsZXhpdEVycm9yOntzZXQgdmFsdWUodCl7TyhuLFYsdCxcImZcIil9fS52YWx1ZSxoYXNPdXRwdXQ6e3NldCB2YWx1ZSh0KXtPKHIsSix0LFwiZlwiKX19LnZhbHVlLHBhcnNlZDp0aGlzLnBhcnNlZCxzdHJpY3Q6e3NldCB2YWx1ZSh0KXtPKG8sZnQsdCxcImZcIil9fS52YWx1ZSxzdHJpY3RDb21tYW5kczp7c2V0IHZhbHVlKHQpe08oYSxkdCx0LFwiZlwiKX19LnZhbHVlLHN0cmljdE9wdGlvbnM6e3NldCB2YWx1ZSh0KXtPKGgsdXQsdCxcImZcIil9fS52YWx1ZSxjb21wbGV0aW9uQ29tbWFuZDp7c2V0IHZhbHVlKHQpe08obCxGLHQsXCJmXCIpfX0udmFsdWUscGFyc2VGbjp7c2V0IHZhbHVlKHQpe08oYyxudCx0LFwiZlwiKX19LnZhbHVlLHBhcnNlQ29udGV4dDp7c2V0IHZhbHVlKHQpe08oZixydCx0LFwiZlwiKX19LnZhbHVlfT11KSx2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHM9cCx2KHRoaXMscHQsXCJmXCIpLnVuZnJlZXplKCksdih0aGlzLHl0LFwiZlwiKS51bmZyZWV6ZSgpLHYodGhpcyx6LFwiZlwiKS51bmZyZWV6ZSgpLHYodGhpcyxZLFwiZlwiKS51bmZyZWV6ZSgpfVt6dF0odCxlKXtyZXR1cm4gaihlLChlPT4odChlKSxlKSkpfWdldEludGVybmFsTWV0aG9kcygpe3JldHVybntnZXRDb21tYW5kSW5zdGFuY2U6dGhpc1tXdF0uYmluZCh0aGlzKSxnZXRDb250ZXh0OnRoaXNbcXRdLmJpbmQodGhpcyksZ2V0SGFzT3V0cHV0OnRoaXNbVXRdLmJpbmQodGhpcyksZ2V0TG9nZ2VySW5zdGFuY2U6dGhpc1tGdF0uYmluZCh0aGlzKSxnZXRQYXJzZUNvbnRleHQ6dGhpc1tMdF0uYmluZCh0aGlzKSxnZXRQYXJzZXJDb25maWd1cmF0aW9uOnRoaXNbTXRdLmJpbmQodGhpcyksZ2V0VXNhZ2VDb25maWd1cmF0aW9uOnRoaXNbX3RdLmJpbmQodGhpcyksZ2V0VXNhZ2VJbnN0YW5jZTp0aGlzW1Z0XS5iaW5kKHRoaXMpLGdldFZhbGlkYXRpb25JbnN0YW5jZTp0aGlzW0d0XS5iaW5kKHRoaXMpLGhhc1BhcnNlQ2FsbGJhY2s6dGhpc1tSdF0uYmluZCh0aGlzKSxpc0dsb2JhbENvbnRleHQ6dGhpc1tUdF0uYmluZCh0aGlzKSxwb3N0UHJvY2Vzczp0aGlzW0J0XS5iaW5kKHRoaXMpLHJlc2V0OnRoaXNbS3RdLmJpbmQodGhpcykscnVuVmFsaWRhdGlvbjp0aGlzW1p0XS5iaW5kKHRoaXMpLHJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzOnRoaXNbSnRdLmJpbmQodGhpcyksc2V0SGFzT3V0cHV0OnRoaXNbWHRdLmJpbmQodGhpcyl9fVtXdF0oKXtyZXR1cm4gdih0aGlzLHosXCJmXCIpfVtxdF0oKXtyZXR1cm4gdih0aGlzLHEsXCJmXCIpfVtVdF0oKXtyZXR1cm4gdih0aGlzLEosXCJmXCIpfVtGdF0oKXtyZXR1cm4gdih0aGlzLFEsXCJmXCIpfVtMdF0oKXtyZXR1cm4gdih0aGlzLHJ0LFwiZlwiKXx8e319W1Z0XSgpe3JldHVybiB2KHRoaXMscHQsXCJmXCIpfVtHdF0oKXtyZXR1cm4gdih0aGlzLHl0LFwiZlwiKX1bUnRdKCl7cmV0dXJuISF2KHRoaXMsbnQsXCJmXCIpfVtUdF0oKXtyZXR1cm4gdih0aGlzLFgsXCJmXCIpfVtCdF0odCxlLHMsaSl7aWYocylyZXR1cm4gdDtpZihmKHQpKXJldHVybiB0O2V8fCh0PXRoaXNbYnRdKHQpKTtyZXR1cm4odGhpc1tNdF0oKVtcInBhcnNlLXBvc2l0aW9uYWwtbnVtYmVyc1wiXXx8dm9pZCAwPT09dGhpc1tNdF0oKVtcInBhcnNlLXBvc2l0aW9uYWwtbnVtYmVyc1wiXSkmJih0PXRoaXNbRXRdKHQpKSxpJiYodD1DKHQsdGhpcyx2KHRoaXMsWSxcImZcIikuZ2V0TWlkZGxld2FyZSgpLCExKSksdH1bS3RdKHQ9e30pe08odGhpcyxldCx2KHRoaXMsZXQsXCJmXCIpfHx7fSxcImZcIik7Y29uc3QgZT17fTtlLmxvY2FsPXYodGhpcyxldCxcImZcIikubG9jYWx8fFtdLGUuY29uZmlnT2JqZWN0cz12KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHN8fFtdO2NvbnN0IHM9e307ZS5sb2NhbC5mb3JFYWNoKChlPT57c1tlXT0hMCwodFtlXXx8W10pLmZvckVhY2goKHQ9PntzW3RdPSEwfSkpfSkpLE9iamVjdC5hc3NpZ24odih0aGlzLGF0LFwiZlwiKSxPYmplY3Qua2V5cyh2KHRoaXMsSyxcImZcIikpLnJlZHVjZSgoKHQsZSk9Pntjb25zdCBpPXYodGhpcyxLLFwiZlwiKVtlXS5maWx0ZXIoKHQ9PiEodCBpbiBzKSkpO3JldHVybiBpLmxlbmd0aD4wJiYodFtlXT1pKSx0fSkse30pKSxPKHRoaXMsSyx7fSxcImZcIik7cmV0dXJuW1wiYXJyYXlcIixcImJvb2xlYW5cIixcInN0cmluZ1wiLFwic2tpcFZhbGlkYXRpb25cIixcImNvdW50XCIsXCJub3JtYWxpemVcIixcIm51bWJlclwiLFwiaGlkZGVuT3B0aW9uc1wiXS5mb3JFYWNoKCh0PT57ZVt0XT0odih0aGlzLGV0LFwiZlwiKVt0XXx8W10pLmZpbHRlcigodD0+IXNbdF0pKX0pKSxbXCJuYXJnXCIsXCJrZXlcIixcImFsaWFzXCIsXCJkZWZhdWx0XCIsXCJkZWZhdWx0RGVzY3JpcHRpb25cIixcImNvbmZpZ1wiLFwiY2hvaWNlc1wiLFwiZGVtYW5kZWRPcHRpb25zXCIsXCJkZW1hbmRlZENvbW1hbmRzXCIsXCJkZXByZWNhdGVkT3B0aW9uc1wiXS5mb3JFYWNoKCh0PT57ZVt0XT1nKHYodGhpcyxldCxcImZcIilbdF0sKHQ9PiFzW3RdKSl9KSksZS5lbnZQcmVmaXg9dih0aGlzLGV0LFwiZlwiKS5lbnZQcmVmaXgsTyh0aGlzLGV0LGUsXCJmXCIpLE8odGhpcyxwdCx2KHRoaXMscHQsXCJmXCIpP3YodGhpcyxwdCxcImZcIikucmVzZXQocyk6UCh0aGlzLHYodGhpcyxjdCxcImZcIikpLFwiZlwiKSxPKHRoaXMseXQsdih0aGlzLHl0LFwiZlwiKT92KHRoaXMseXQsXCJmXCIpLnJlc2V0KHMpOmZ1bmN0aW9uKHQsZSxzKXtjb25zdCBpPXMueTE4bi5fXyxuPXMueTE4bi5fX24scj17bm9uT3B0aW9uQ291bnQ6ZnVuY3Rpb24ocyl7Y29uc3QgaT10LmdldERlbWFuZGVkQ29tbWFuZHMoKSxyPXMuXy5sZW5ndGgrKHNbXCItLVwiXT9zW1wiLS1cIl0ubGVuZ3RoOjApLXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLmNvbW1hbmRzLmxlbmd0aDtpLl8mJihyPGkuXy5taW58fHI+aS5fLm1heCkmJihyPGkuXy5taW4/dm9pZCAwIT09aS5fLm1pbk1zZz9lLmZhaWwoaS5fLm1pbk1zZz9pLl8ubWluTXNnLnJlcGxhY2UoL1xcJDAvZyxyLnRvU3RyaW5nKCkpLnJlcGxhY2UoL1xcJDEvLGkuXy5taW4udG9TdHJpbmcoKSk6bnVsbCk6ZS5mYWlsKG4oXCJOb3QgZW5vdWdoIG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG5lZWQgYXQgbGVhc3QgJXNcIixcIk5vdCBlbm91Z2ggbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbmVlZCBhdCBsZWFzdCAlc1wiLHIsci50b1N0cmluZygpLGkuXy5taW4udG9TdHJpbmcoKSkpOnI+aS5fLm1heCYmKHZvaWQgMCE9PWkuXy5tYXhNc2c/ZS5mYWlsKGkuXy5tYXhNc2c/aS5fLm1heE1zZy5yZXBsYWNlKC9cXCQwL2csci50b1N0cmluZygpKS5yZXBsYWNlKC9cXCQxLyxpLl8ubWF4LnRvU3RyaW5nKCkpOm51bGwpOmUuZmFpbChuKFwiVG9vIG1hbnkgbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbWF4aW11bSBvZiAlc1wiLFwiVG9vIG1hbnkgbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbWF4aW11bSBvZiAlc1wiLHIsci50b1N0cmluZygpLGkuXy5tYXgudG9TdHJpbmcoKSkpKSl9LHBvc2l0aW9uYWxDb3VudDpmdW5jdGlvbih0LHMpe3M8dCYmZS5mYWlsKG4oXCJOb3QgZW5vdWdoIG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG5lZWQgYXQgbGVhc3QgJXNcIixcIk5vdCBlbm91Z2ggbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbmVlZCBhdCBsZWFzdCAlc1wiLHMscytcIlwiLHQrXCJcIikpfSxyZXF1aXJlZEFyZ3VtZW50czpmdW5jdGlvbih0LHMpe2xldCBpPW51bGw7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXMocykpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSkmJnZvaWQgMCE9PXRbZV18fChpPWl8fHt9LGlbZV09c1tlXSk7aWYoaSl7Y29uc3QgdD1bXTtmb3IoY29uc3QgZSBvZiBPYmplY3Qua2V5cyhpKSl7Y29uc3Qgcz1pW2VdO3MmJnQuaW5kZXhPZihzKTwwJiZ0LnB1c2gocyl9Y29uc3Qgcz10Lmxlbmd0aD9gXFxuJHt0LmpvaW4oXCJcXG5cIil9YDpcIlwiO2UuZmFpbChuKFwiTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudDogJXNcIixcIk1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnRzOiAlc1wiLE9iamVjdC5rZXlzKGkpLmxlbmd0aCxPYmplY3Qua2V5cyhpKS5qb2luKFwiLCBcIikrcykpfX0sdW5rbm93bkFyZ3VtZW50czpmdW5jdGlvbihzLGksbyxhLGg9ITApe3ZhciBsO2NvbnN0IGM9dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb21tYW5kSW5zdGFuY2UoKS5nZXRDb21tYW5kcygpLGY9W10sZD10LmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKTtpZihPYmplY3Qua2V5cyhzKS5mb3JFYWNoKChlPT57SC5pbmNsdWRlcyhlKXx8T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sZSl8fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlQ29udGV4dCgpLGUpfHxyLmlzVmFsaWRBbmRTb21lQWxpYXNJc05vdE5ldyhlLGkpfHxmLnB1c2goZSl9KSksaCYmKGQuY29tbWFuZHMubGVuZ3RoPjB8fGMubGVuZ3RoPjB8fGEpJiZzLl8uc2xpY2UoZC5jb21tYW5kcy5sZW5ndGgpLmZvckVhY2goKHQ9PntjLmluY2x1ZGVzKFwiXCIrdCl8fGYucHVzaChcIlwiK3QpfSkpLGgpe2NvbnN0IGU9KG51bGw9PT0obD10LmdldERlbWFuZGVkQ29tbWFuZHMoKS5fKXx8dm9pZCAwPT09bD92b2lkIDA6bC5tYXgpfHwwLGk9ZC5jb21tYW5kcy5sZW5ndGgrZTtpPHMuXy5sZW5ndGgmJnMuXy5zbGljZShpKS5mb3JFYWNoKCh0PT57dD1TdHJpbmcodCksZC5jb21tYW5kcy5pbmNsdWRlcyh0KXx8Zi5pbmNsdWRlcyh0KXx8Zi5wdXNoKHQpfSkpfWYubGVuZ3RoJiZlLmZhaWwobihcIlVua25vd24gYXJndW1lbnQ6ICVzXCIsXCJVbmtub3duIGFyZ3VtZW50czogJXNcIixmLmxlbmd0aCxmLm1hcCgodD0+dC50cmltKCk/dDpgXCIke3R9XCJgKSkuam9pbihcIiwgXCIpKSl9LHVua25vd25Db21tYW5kczpmdW5jdGlvbihzKXtjb25zdCBpPXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29tbWFuZEluc3RhbmNlKCkuZ2V0Q29tbWFuZHMoKSxyPVtdLG89dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCk7cmV0dXJuKG8uY29tbWFuZHMubGVuZ3RoPjB8fGkubGVuZ3RoPjApJiZzLl8uc2xpY2Uoby5jb21tYW5kcy5sZW5ndGgpLmZvckVhY2goKHQ9PntpLmluY2x1ZGVzKFwiXCIrdCl8fHIucHVzaChcIlwiK3QpfSkpLHIubGVuZ3RoPjAmJihlLmZhaWwobihcIlVua25vd24gY29tbWFuZDogJXNcIixcIlVua25vd24gY29tbWFuZHM6ICVzXCIsci5sZW5ndGgsci5qb2luKFwiLCBcIikpKSwhMCl9LGlzVmFsaWRBbmRTb21lQWxpYXNJc05vdE5ldzpmdW5jdGlvbihlLHMpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyxlKSlyZXR1cm4hMTtjb25zdCBpPXQucGFyc2VkLm5ld0FsaWFzZXM7cmV0dXJuW2UsLi4uc1tlXV0uc29tZSgodD0+IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLHQpfHwhaVtlXSkpfSxsaW1pdGVkQ2hvaWNlczpmdW5jdGlvbihzKXtjb25zdCBuPXQuZ2V0T3B0aW9ucygpLHI9e307aWYoIU9iamVjdC5rZXlzKG4uY2hvaWNlcykubGVuZ3RoKXJldHVybjtPYmplY3Qua2V5cyhzKS5mb3JFYWNoKCh0PT57LTE9PT1ILmluZGV4T2YodCkmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLmNob2ljZXMsdCkmJltdLmNvbmNhdChzW3RdKS5mb3JFYWNoKChlPT57LTE9PT1uLmNob2ljZXNbdF0uaW5kZXhPZihlKSYmdm9pZCAwIT09ZSYmKHJbdF09KHJbdF18fFtdKS5jb25jYXQoZSkpfSkpfSkpO2NvbnN0IG89T2JqZWN0LmtleXMocik7aWYoIW8ubGVuZ3RoKXJldHVybjtsZXQgYT1pKFwiSW52YWxpZCB2YWx1ZXM6XCIpO28uZm9yRWFjaCgodD0+e2ErPWBcXG4gICR7aShcIkFyZ3VtZW50OiAlcywgR2l2ZW46ICVzLCBDaG9pY2VzOiAlc1wiLHQsZS5zdHJpbmdpZmllZFZhbHVlcyhyW3RdKSxlLnN0cmluZ2lmaWVkVmFsdWVzKG4uY2hvaWNlc1t0XSkpfWB9KSksZS5mYWlsKGEpfX07bGV0IG89e307ZnVuY3Rpb24gYSh0LGUpe2NvbnN0IHM9TnVtYmVyKGUpO3JldHVyblwibnVtYmVyXCI9PXR5cGVvZihlPWlzTmFOKHMpP2U6cyk/ZT10Ll8ubGVuZ3RoPj1lOmUubWF0Y2goL14tLW5vLS4rLyk/KGU9ZS5tYXRjaCgvXi0tbm8tKC4rKS8pWzFdLGU9IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpKTplPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpLGV9ci5pbXBsaWVzPWZ1bmN0aW9uKGUsaSl7aChcIjxzdHJpbmd8b2JqZWN0PiBbYXJyYXl8bnVtYmVyfHN0cmluZ11cIixbZSxpXSxhcmd1bWVudHMubGVuZ3RoKSxcIm9iamVjdFwiPT10eXBlb2YgZT9PYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0PT57ci5pbXBsaWVzKHQsZVt0XSl9KSk6KHQuZ2xvYmFsKGUpLG9bZV18fChvW2VdPVtdKSxBcnJheS5pc0FycmF5KGkpP2kuZm9yRWFjaCgodD0+ci5pbXBsaWVzKGUsdCkpKTooZChpLHZvaWQgMCxzKSxvW2VdLnB1c2goaSkpKX0sci5nZXRJbXBsaWVkPWZ1bmN0aW9uKCl7cmV0dXJuIG99LHIuaW1wbGljYXRpb25zPWZ1bmN0aW9uKHQpe2NvbnN0IHM9W107aWYoT2JqZWN0LmtleXMobykuZm9yRWFjaCgoZT0+e2NvbnN0IGk9ZTsob1tlXXx8W10pLmZvckVhY2goKGU9PntsZXQgbj1pO2NvbnN0IHI9ZTtuPWEodCxuKSxlPWEodCxlKSxuJiYhZSYmcy5wdXNoKGAgJHtpfSAtPiAke3J9YCl9KSl9KSkscy5sZW5ndGgpe2xldCB0PWAke2koXCJJbXBsaWNhdGlvbnMgZmFpbGVkOlwiKX1cXG5gO3MuZm9yRWFjaCgoZT0+e3QrPWV9KSksZS5mYWlsKHQpfX07bGV0IGw9e307ci5jb25mbGljdHM9ZnVuY3Rpb24oZSxzKXtoKFwiPHN0cmluZ3xvYmplY3Q+IFthcnJheXxzdHJpbmddXCIsW2Usc10sYXJndW1lbnRzLmxlbmd0aCksXCJvYmplY3RcIj09dHlwZW9mIGU/T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e3IuY29uZmxpY3RzKHQsZVt0XSl9KSk6KHQuZ2xvYmFsKGUpLGxbZV18fChsW2VdPVtdKSxBcnJheS5pc0FycmF5KHMpP3MuZm9yRWFjaCgodD0+ci5jb25mbGljdHMoZSx0KSkpOmxbZV0ucHVzaChzKSl9LHIuZ2V0Q29uZmxpY3Rpbmc9KCk9Pmwsci5jb25mbGljdGluZz1mdW5jdGlvbihuKXtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKCh0PT57bFt0XSYmbFt0XS5mb3JFYWNoKChzPT57cyYmdm9pZCAwIT09blt0XSYmdm9pZCAwIT09bltzXSYmZS5mYWlsKGkoXCJBcmd1bWVudHMgJXMgYW5kICVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIix0LHMpKX0pKX0pKSx0LmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKVtcInN0cmlwLWRhc2hlZFwiXSYmT2JqZWN0LmtleXMobCkuZm9yRWFjaCgodD0+e2xbdF0uZm9yRWFjaCgocj0+e3ImJnZvaWQgMCE9PW5bcy5QYXJzZXIuY2FtZWxDYXNlKHQpXSYmdm9pZCAwIT09bltzLlBhcnNlci5jYW1lbENhc2UocildJiZlLmZhaWwoaShcIkFyZ3VtZW50cyAlcyBhbmQgJXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiLHQscikpfSkpfSkpfSxyLnJlY29tbWVuZENvbW1hbmRzPWZ1bmN0aW9uKHQscyl7cz1zLnNvcnQoKCh0LGUpPT5lLmxlbmd0aC10Lmxlbmd0aCkpO2xldCBuPW51bGwscj0xLzA7Zm9yKGxldCBlLGk9MDt2b2lkIDAhPT0oZT1zW2ldKTtpKyspe2NvbnN0IHM9Tih0LGUpO3M8PTMmJnM8ciYmKHI9cyxuPWUpfW4mJmUuZmFpbChpKFwiRGlkIHlvdSBtZWFuICVzP1wiLG4pKX0sci5yZXNldD1mdW5jdGlvbih0KXtyZXR1cm4gbz1nKG8sKGU9PiF0W2VdKSksbD1nKGwsKGU9PiF0W2VdKSkscn07Y29uc3QgYz1bXTtyZXR1cm4gci5mcmVlemU9ZnVuY3Rpb24oKXtjLnB1c2goe2ltcGxpZWQ6byxjb25mbGljdGluZzpsfSl9LHIudW5mcmVlemU9ZnVuY3Rpb24oKXtjb25zdCB0PWMucG9wKCk7ZCh0LHZvaWQgMCxzKSwoe2ltcGxpZWQ6byxjb25mbGljdGluZzpsfT10KX0scn0odGhpcyx2KHRoaXMscHQsXCJmXCIpLHYodGhpcyxjdCxcImZcIikpLFwiZlwiKSxPKHRoaXMseix2KHRoaXMseixcImZcIik/dih0aGlzLHosXCJmXCIpLnJlc2V0KCk6ZnVuY3Rpb24odCxlLHMsaSl7cmV0dXJuIG5ldyBfKHQsZSxzLGkpfSh2KHRoaXMscHQsXCJmXCIpLHYodGhpcyx5dCxcImZcIiksdih0aGlzLFksXCJmXCIpLHYodGhpcyxjdCxcImZcIikpLFwiZlwiKSx2KHRoaXMsVSxcImZcIil8fE8odGhpcyxVLGZ1bmN0aW9uKHQsZSxzLGkpe3JldHVybiBuZXcgRCh0LGUscyxpKX0odGhpcyx2KHRoaXMscHQsXCJmXCIpLHYodGhpcyx6LFwiZlwiKSx2KHRoaXMsY3QsXCJmXCIpKSxcImZcIiksdih0aGlzLFksXCJmXCIpLnJlc2V0KCksTyh0aGlzLEYsbnVsbCxcImZcIiksTyh0aGlzLHR0LFwiXCIsXCJmXCIpLE8odGhpcyxWLG51bGwsXCJmXCIpLE8odGhpcyxKLCExLFwiZlwiKSx0aGlzLnBhcnNlZD0hMSx0aGlzfVtZdF0odCxlKXtyZXR1cm4gdih0aGlzLGN0LFwiZlwiKS5wYXRoLnJlbGF0aXZlKHQsZSl9W0p0XSh0LHMsaSxuPTAscj0hMSl7bGV0IG89ISFpfHxyO3Q9dHx8dih0aGlzLGh0LFwiZlwiKSx2KHRoaXMsZXQsXCJmXCIpLl9fPXYodGhpcyxjdCxcImZcIikueTE4bi5fXyx2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ3VyYXRpb249dGhpc1tNdF0oKTtjb25zdCBhPSEhdih0aGlzLGV0LFwiZlwiKS5jb25maWd1cmF0aW9uW1wicG9wdWxhdGUtLVwiXSxoPU9iamVjdC5hc3NpZ24oe30sdih0aGlzLGV0LFwiZlwiKS5jb25maWd1cmF0aW9uLHtcInBvcHVsYXRlLS1cIjohMH0pLGw9dih0aGlzLGN0LFwiZlwiKS5QYXJzZXIuZGV0YWlsZWQodCxPYmplY3QuYXNzaWduKHt9LHYodGhpcyxldCxcImZcIikse2NvbmZpZ3VyYXRpb246e1wicGFyc2UtcG9zaXRpb25hbC1udW1iZXJzXCI6ITEsLi4uaH19KSksYz1PYmplY3QuYXNzaWduKGwuYXJndix2KHRoaXMscnQsXCJmXCIpKTtsZXQgZDtjb25zdCB1PWwuYWxpYXNlcztsZXQgcD0hMSxnPSExO09iamVjdC5rZXlzKGMpLmZvckVhY2goKHQ9Pnt0PT09dih0aGlzLFosXCJmXCIpJiZjW3RdP3A9ITA6dD09PXYodGhpcyxtdCxcImZcIikmJmNbdF0mJihnPSEwKX0pKSxjLiQwPXRoaXMuJDAsdGhpcy5wYXJzZWQ9bCwwPT09biYmdih0aGlzLHB0LFwiZlwiKS5jbGVhckNhY2hlZEhlbHBNZXNzYWdlKCk7dHJ5e2lmKHRoaXNba3RdKCkscylyZXR1cm4gdGhpc1tCdF0oYyxhLCEhaSwhMSk7aWYodih0aGlzLFosXCJmXCIpKXtbdih0aGlzLFosXCJmXCIpXS5jb25jYXQodVt2KHRoaXMsWixcImZcIildfHxbXSkuZmlsdGVyKCh0PT50Lmxlbmd0aD4xKSkuaW5jbHVkZXMoXCJcIitjLl9bYy5fLmxlbmd0aC0xXSkmJihjLl8ucG9wKCkscD0hMCl9Tyh0aGlzLFgsITEsXCJmXCIpO2NvbnN0IGg9dih0aGlzLHosXCJmXCIpLmdldENvbW1hbmRzKCksbT12KHRoaXMsVSxcImZcIikuY29tcGxldGlvbktleSBpbiBjLHk9cHx8bXx8cjtpZihjLl8ubGVuZ3RoKXtpZihoLmxlbmd0aCl7bGV0IHQ7Zm9yKGxldCBlLHM9bnx8MDt2b2lkIDAhPT1jLl9bc107cysrKXtpZihlPVN0cmluZyhjLl9bc10pLGguaW5jbHVkZXMoZSkmJmUhPT12KHRoaXMsRixcImZcIikpe2NvbnN0IHQ9dih0aGlzLHosXCJmXCIpLnJ1bkNvbW1hbmQoZSx0aGlzLGwscysxLHIscHx8Z3x8cik7cmV0dXJuIHRoaXNbQnRdKHQsYSwhIWksITEpfWlmKCF0JiZlIT09dih0aGlzLEYsXCJmXCIpKXt0PWU7YnJlYWt9fSF2KHRoaXMseixcImZcIikuaGFzRGVmYXVsdENvbW1hbmQoKSYmdih0aGlzLGx0LFwiZlwiKSYmdCYmIXkmJnYodGhpcyx5dCxcImZcIikucmVjb21tZW5kQ29tbWFuZHModCxoKX12KHRoaXMsRixcImZcIikmJmMuXy5pbmNsdWRlcyh2KHRoaXMsRixcImZcIikpJiYhbSYmKHYodGhpcyxULFwiZlwiKSYmRSghMCksdGhpcy5zaG93Q29tcGxldGlvblNjcmlwdCgpLHRoaXMuZXhpdCgwKSl9aWYodih0aGlzLHosXCJmXCIpLmhhc0RlZmF1bHRDb21tYW5kKCkmJiF5KXtjb25zdCB0PXYodGhpcyx6LFwiZlwiKS5ydW5Db21tYW5kKG51bGwsdGhpcyxsLDAscixwfHxnfHxyKTtyZXR1cm4gdGhpc1tCdF0odCxhLCEhaSwhMSl9aWYobSl7dih0aGlzLFQsXCJmXCIpJiZFKCEwKTtjb25zdCBzPSh0PVtdLmNvbmNhdCh0KSkuc2xpY2UodC5pbmRleE9mKGAtLSR7dih0aGlzLFUsXCJmXCIpLmNvbXBsZXRpb25LZXl9YCkrMSk7cmV0dXJuIHYodGhpcyxVLFwiZlwiKS5nZXRDb21wbGV0aW9uKHMsKCh0LHMpPT57aWYodCl0aHJvdyBuZXcgZSh0Lm1lc3NhZ2UpOyhzfHxbXSkuZm9yRWFjaCgodD0+e3YodGhpcyxRLFwiZlwiKS5sb2codCl9KSksdGhpcy5leGl0KDApfSkpLHRoaXNbQnRdKGMsIWEsISFpLCExKX1pZih2KHRoaXMsSixcImZcIil8fChwPyh2KHRoaXMsVCxcImZcIikmJkUoITApLG89ITAsdGhpcy5zaG93SGVscChcImxvZ1wiKSx0aGlzLmV4aXQoMCkpOmcmJih2KHRoaXMsVCxcImZcIikmJkUoITApLG89ITAsdih0aGlzLHB0LFwiZlwiKS5zaG93VmVyc2lvbihcImxvZ1wiKSx0aGlzLmV4aXQoMCkpKSwhbyYmdih0aGlzLGV0LFwiZlwiKS5za2lwVmFsaWRhdGlvbi5sZW5ndGg+MCYmKG89T2JqZWN0LmtleXMoYykuc29tZSgodD0+dih0aGlzLGV0LFwiZlwiKS5za2lwVmFsaWRhdGlvbi5pbmRleE9mKHQpPj0wJiYhMD09PWNbdF0pKSksIW8pe2lmKGwuZXJyb3IpdGhyb3cgbmV3IGUobC5lcnJvci5tZXNzYWdlKTtpZighbSl7Y29uc3QgdD10aGlzW1p0XSh1LHt9LGwuZXJyb3IpO2l8fChkPUMoYyx0aGlzLHYodGhpcyxZLFwiZlwiKS5nZXRNaWRkbGV3YXJlKCksITApKSxkPXRoaXNbenRdKHQsbnVsbCE9ZD9kOmMpLGYoZCkmJiFpJiYoZD1kLnRoZW4oKCgpPT5DKGMsdGhpcyx2KHRoaXMsWSxcImZcIikuZ2V0TWlkZGxld2FyZSgpLCExKSkpKX19fWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IHQ7dih0aGlzLHB0LFwiZlwiKS5mYWlsKHQubWVzc2FnZSx0KX1yZXR1cm4gdGhpc1tCdF0obnVsbCE9ZD9kOmMsYSwhIWksITApfVtadF0odCxzLGksbil7Y29uc3Qgcj17Li4udGhpcy5nZXREZW1hbmRlZE9wdGlvbnMoKX07cmV0dXJuIG89PntpZihpKXRocm93IG5ldyBlKGkubWVzc2FnZSk7dih0aGlzLHl0LFwiZlwiKS5ub25PcHRpb25Db3VudChvKSx2KHRoaXMseXQsXCJmXCIpLnJlcXVpcmVkQXJndW1lbnRzKG8scik7bGV0IGE9ITE7dih0aGlzLGR0LFwiZlwiKSYmKGE9dih0aGlzLHl0LFwiZlwiKS51bmtub3duQ29tbWFuZHMobykpLHYodGhpcyxmdCxcImZcIikmJiFhP3YodGhpcyx5dCxcImZcIikudW5rbm93bkFyZ3VtZW50cyhvLHQscywhIW4pOnYodGhpcyx1dCxcImZcIikmJnYodGhpcyx5dCxcImZcIikudW5rbm93bkFyZ3VtZW50cyhvLHQse30sITEsITEpLHYodGhpcyx5dCxcImZcIikubGltaXRlZENob2ljZXMobyksdih0aGlzLHl0LFwiZlwiKS5pbXBsaWNhdGlvbnMobyksdih0aGlzLHl0LFwiZlwiKS5jb25mbGljdGluZyhvKX19W1h0XSgpe08odGhpcyxKLCEwLFwiZlwiKX1bUXRdKHQpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXYodGhpcyxldCxcImZcIikua2V5W3RdPSEwO2Vsc2UgZm9yKGNvbnN0IGUgb2YgdCl2KHRoaXMsZXQsXCJmXCIpLmtleVtlXT0hMH19dmFyIGVlLHNlO2NvbnN0e3JlYWRGaWxlU3luYzppZX09cmVxdWlyZShcImZzXCIpLHtpbnNwZWN0Om5lfT1yZXF1aXJlKFwidXRpbFwiKSx7cmVzb2x2ZTpyZX09cmVxdWlyZShcInBhdGhcIiksb2U9cmVxdWlyZShcInkxOG5cIiksYWU9cmVxdWlyZShcInlhcmdzLXBhcnNlclwiKTt2YXIgaGUsbGU9e2Fzc2VydDp7bm90U3RyaWN0RXF1YWw6dC5ub3RTdHJpY3RFcXVhbCxzdHJpY3RFcXVhbDp0LnN0cmljdEVxdWFsfSxjbGl1aTpyZXF1aXJlKFwiY2xpdWlcIiksZmluZFVwOnJlcXVpcmUoXCJlc2NhbGFkZS9zeW5jXCIpLGdldEVudjp0PT5wcm9jZXNzLmVudlt0XSxnZXRDYWxsZXJGaWxlOnJlcXVpcmUoXCJnZXQtY2FsbGVyLWZpbGVcIiksZ2V0UHJvY2Vzc0FyZ3ZCaW46eSxpbnNwZWN0Om5lLG1haW5GaWxlbmFtZTpudWxsIT09KHNlPW51bGw9PT0oZWU9bnVsbD09PXJlcXVpcmV8fHZvaWQgMD09PXJlcXVpcmU/dm9pZCAwOnJlcXVpcmUubWFpbil8fHZvaWQgMD09PWVlP3ZvaWQgMDplZS5maWxlbmFtZSkmJnZvaWQgMCE9PXNlP3NlOnByb2Nlc3MuY3dkKCksUGFyc2VyOmFlLHBhdGg6cmVxdWlyZShcInBhdGhcIikscHJvY2Vzczp7YXJndjooKT0+cHJvY2Vzcy5hcmd2LGN3ZDpwcm9jZXNzLmN3ZCxlbWl0V2FybmluZzoodCxlKT0+cHJvY2Vzcy5lbWl0V2FybmluZyh0LGUpLGV4ZWNQYXRoOigpPT5wcm9jZXNzLmV4ZWNQYXRoLGV4aXQ6dD0+e3Byb2Nlc3MuZXhpdCh0KX0sbmV4dFRpY2s6cHJvY2Vzcy5uZXh0VGljayxzdGRDb2x1bW5zOnZvaWQgMCE9PXByb2Nlc3Muc3Rkb3V0LmNvbHVtbnM/cHJvY2Vzcy5zdGRvdXQuY29sdW1uczpudWxsfSxyZWFkRmlsZVN5bmM6aWUscmVxdWlyZTpyZXF1aXJlLHJlcXVpcmVEaXJlY3Rvcnk6cmVxdWlyZShcInJlcXVpcmUtZGlyZWN0b3J5XCIpLHN0cmluZ1dpZHRoOnJlcXVpcmUoXCJzdHJpbmctd2lkdGhcIikseTE4bjpvZSh7ZGlyZWN0b3J5OnJlKF9fZGlybmFtZSxcIi4uL2xvY2FsZXNcIiksdXBkYXRlRmlsZXM6ITF9KX07Y29uc3QgY2U9KG51bGw9PT0oaGU9bnVsbD09PXByb2Nlc3N8fHZvaWQgMD09PXByb2Nlc3M/dm9pZCAwOnByb2Nlc3MuZW52KXx8dm9pZCAwPT09aGU/dm9pZCAwOmhlLllBUkdTX01JTl9OT0RFX1ZFUlNJT04pP051bWJlcihwcm9jZXNzLmVudi5ZQVJHU19NSU5fTk9ERV9WRVJTSU9OKToxMjtpZihwcm9jZXNzJiZwcm9jZXNzLnZlcnNpb24pe2lmKE51bWJlcihwcm9jZXNzLnZlcnNpb24ubWF0Y2goL3YoW14uXSspLylbMV0pPGNlKXRocm93IEVycm9yKGB5YXJncyBzdXBwb3J0cyBhIG1pbmltdW0gTm9kZS5qcyB2ZXJzaW9uIG9mICR7Y2V9LiBSZWFkIG91ciB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5OiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3Mjc3VwcG9ydGVkLW5vZGVqcy12ZXJzaW9uc2ApfWNvbnN0IGZlPXJlcXVpcmUoXCJ5YXJncy1wYXJzZXJcIik7dmFyIGRlLHVlPXthcHBseUV4dGVuZHM6bixjanNQbGF0Zm9ybVNoaW06bGUsWWFyZ3M6KGRlPWxlLCh0PVtdLGU9ZGUucHJvY2Vzcy5jd2QoKSxzKT0+e2NvbnN0IGk9bmV3IHRlKHQsZSxzLGRlKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGksXCJhcmd2XCIse2dldDooKT0+aS5wYXJzZSgpLGVudW1lcmFibGU6ITB9KSxpLmhlbHAoKSxpLnZlcnNpb24oKSxpfSksYXJnc2VydDpoLGlzUHJvbWlzZTpmLG9iakZpbHRlcjpnLHBhcnNlQ29tbWFuZDpvLFBhcnNlcjpmZSxwcm9jZXNzQXJndjpiLFlFcnJvcjplfTttb2R1bGUuZXhwb3J0cz11ZTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBzdGRpbiBhcyBpbnB1dCwgc3Rkb3V0IGFzIG91dHB1dCB9IGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSAncmVhZGxpbmUnO1xuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJ3Byb2dyZXNzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncy95YXJncyc7XG5pbXBvcnQgeyByZXNvbHZlQnVpbGRJZCwgQnJvd3NlclBsYXRmb3JtLCB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG5pbXBvcnQgeyBDYWNoZSB9IGZyb20gJy4vQ2FjaGUuanMnO1xuaW1wb3J0IHsgZGV0ZWN0QnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi9kZXRlY3RQbGF0Zm9ybS5qcyc7XG5pbXBvcnQgeyBpbnN0YWxsIH0gZnJvbSAnLi9pbnN0YWxsLmpzJztcbmltcG9ydCB7IGNvbXB1dGVFeGVjdXRhYmxlUGF0aCwgY29tcHV0ZVN5c3RlbUV4ZWN1dGFibGVQYXRoLCBsYXVuY2gsIH0gZnJvbSAnLi9sYXVuY2guanMnO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBDTEkge1xuICAgICNjYWNoZVBhdGg7XG4gICAgI3JsO1xuICAgICNzY3JpcHROYW1lID0gJyc7XG4gICAgI2FsbG93Q2FjaGVQYXRoT3ZlcnJpZGUgPSB0cnVlO1xuICAgICNwaW5uZWRCcm93c2VycztcbiAgICAjcHJlZml4Q29tbWFuZDtcbiAgICBjb25zdHJ1Y3RvcihvcHRzLCBybCkge1xuICAgICAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgICAgIG9wdHMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBvcHRzID0ge1xuICAgICAgICAgICAgICAgIGNhY2hlUGF0aDogb3B0cyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2FjaGVQYXRoID0gb3B0cy5jYWNoZVBhdGggPz8gcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgdGhpcy4jcmwgPSBybDtcbiAgICAgICAgdGhpcy4jc2NyaXB0TmFtZSA9IG9wdHMuc2NyaXB0TmFtZSA/PyAnQHB1cHBldGVlci9icm93c2Vycyc7XG4gICAgICAgIHRoaXMuI2FsbG93Q2FjaGVQYXRoT3ZlcnJpZGUgPSBvcHRzLmFsbG93Q2FjaGVQYXRoT3ZlcnJpZGUgPz8gdHJ1ZTtcbiAgICAgICAgdGhpcy4jcGlubmVkQnJvd3NlcnMgPSBvcHRzLnBpbm5lZEJyb3dzZXJzO1xuICAgICAgICB0aGlzLiNwcmVmaXhDb21tYW5kID0gb3B0cy5wcmVmaXhDb21tYW5kO1xuICAgIH1cbiAgICAjZGVmaW5lQnJvd3NlclBhcmFtZXRlcih5YXJncykge1xuICAgICAgICB5YXJncy5wb3NpdGlvbmFsKCdicm93c2VyJywge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXaGljaCBicm93c2VyIHRvIGluc3RhbGwgPGJyb3dzZXI+W0A8YnVpbGRJZHxsYXRlc3Q+XS4gYGxhdGVzdGAgd2lsbCB0cnkgdG8gZmluZCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZC4gYGJ1aWxkSWRgIGlzIGEgYnJvd3Nlci1zcGVjaWZpYyBpZGVudGlmaWVyIHN1Y2ggYXMgYSB2ZXJzaW9uIG9yIGEgcmV2aXNpb24uJyxcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgY29lcmNlOiAob3B0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy4jcGFyc2VCcm93c2VyKG9wdCksXG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IHRoaXMuI3BhcnNlQnVpbGRJZChvcHQpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgI2RlZmluZVBsYXRmb3JtUGFyYW1ldGVyKHlhcmdzKSB7XG4gICAgICAgIHlhcmdzLm9wdGlvbigncGxhdGZvcm0nLCB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2M6ICdQbGF0Zm9ybSB0aGF0IHRoZSBiaW5hcnkgbmVlZHMgdG8gYmUgY29tcGF0aWJsZSB3aXRoLicsXG4gICAgICAgICAgICBjaG9pY2VzOiBPYmplY3QudmFsdWVzKEJyb3dzZXJQbGF0Zm9ybSksXG4gICAgICAgICAgICBkZWZhdWx0RGVzY3JpcHRpb246ICdBdXRvLWRldGVjdGVkJyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICNkZWZpbmVQYXRoUGFyYW1ldGVyKHlhcmdzLCByZXF1aXJlZCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghdGhpcy4jYWxsb3dDYWNoZVBhdGhPdmVycmlkZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHlhcmdzLm9wdGlvbigncGF0aCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzYzogJ1BhdGggdG8gdGhlIHJvb3QgZm9sZGVyIGZvciB0aGUgYnJvd3NlciBkb3dubG9hZHMgYW5kIGluc3RhbGxhdGlvbi4gVGhlIGluc3RhbGxhdGlvbiBmb2xkZXIgc3RydWN0dXJlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY2FjaGUgc3RydWN0dXJlIHVzZWQgYnkgUHVwcGV0ZWVyLicsXG4gICAgICAgICAgICBkZWZhdWx0RGVzY3JpcHRpb246ICdDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICAgICAgICAgIC4uLihyZXF1aXJlZCA/IHt9IDogeyBkZWZhdWx0OiBwcm9jZXNzLmN3ZCgpIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB5YXJncy5kZW1hbmRPcHRpb24oJ3BhdGgnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBydW4oYXJndikge1xuICAgICAgICBjb25zdCB5YXJnc0luc3RhbmNlID0geWFyZ3MoaGlkZUJpbihhcmd2KSk7XG4gICAgICAgIGxldCB0YXJnZXQgPSB5YXJnc0luc3RhbmNlLnNjcmlwdE5hbWUodGhpcy4jc2NyaXB0TmFtZSk7XG4gICAgICAgIGlmICh0aGlzLiNwcmVmaXhDb21tYW5kKSB7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuY29tbWFuZCh0aGlzLiNwcmVmaXhDb21tYW5kLmNtZCwgdGhpcy4jcHJlZml4Q29tbWFuZC5kZXNjcmlwdGlvbiwgeWFyZ3MgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNidWlsZCh5YXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuI2J1aWxkKHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGFyZ2V0XG4gICAgICAgICAgICAuZGVtYW5kQ29tbWFuZCgxKVxuICAgICAgICAgICAgLmhlbHAoKVxuICAgICAgICAgICAgLndyYXAoTWF0aC5taW4oMTIwLCB5YXJnc0luc3RhbmNlLnRlcm1pbmFsV2lkdGgoKSkpXG4gICAgICAgICAgICAucGFyc2UoKTtcbiAgICB9XG4gICAgI2J1aWxkKHlhcmdzKSB7XG4gICAgICAgIGNvbnN0IGxhdGVzdE9yUGlubmVkID0gdGhpcy4jcGlubmVkQnJvd3NlcnMgPyAncGlubmVkJyA6ICdsYXRlc3QnO1xuICAgICAgICByZXR1cm4geWFyZ3NcbiAgICAgICAgICAgIC5jb21tYW5kKCdpbnN0YWxsIDxicm93c2VyPicsICdEb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgc3BlY2lmaWVkIGJyb3dzZXIuIElmIHN1Y2Nlc3NmdWwsIHRoZSBjb21tYW5kIG91dHB1dHMgdGhlIGFjdHVhbCBicm93c2VyIGJ1aWxkSWQgdGhhdCB3YXMgaW5zdGFsbGVkIGFuZCB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgYnJvd3NlciBleGVjdXRhYmxlIChmb3JtYXQ6IDxicm93c2VyPkA8YnVpbGRJRD4gPHBhdGg+KS4nLCB5YXJncyA9PiB7XG4gICAgICAgICAgICB0aGlzLiNkZWZpbmVCcm93c2VyUGFyYW1ldGVyKHlhcmdzKTtcbiAgICAgICAgICAgIHRoaXMuI2RlZmluZVBsYXRmb3JtUGFyYW1ldGVyKHlhcmdzKTtcbiAgICAgICAgICAgIHRoaXMuI2RlZmluZVBhdGhQYXJhbWV0ZXIoeWFyZ3MpO1xuICAgICAgICAgICAgeWFyZ3Mub3B0aW9uKCdiYXNlLXVybCcsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZXNjOiAnQmFzZSBVUkwgdG8gZG93bmxvYWQgZnJvbScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lJywgYEluc3RhbGwgdGhlICR7bGF0ZXN0T3JQaW5uZWR9IGF2YWlsYWJsZSBidWlsZCBvZiB0aGUgQ2hyb21lIGJyb3dzZXIuYCk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZUBsYXRlc3QnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgdGhlIENocm9tZSBicm93c2VyLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBjaHJvbWVAc3RhYmxlJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBhdmFpbGFibGUgYnVpbGQgZm9yIHRoZSBDaHJvbWUgYnJvd3NlciBmcm9tIHRoZSBzdGFibGUgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lQGJldGEnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgdGhlIENocm9tZSBicm93c2VyIGZyb20gdGhlIGJldGEgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lQGRldicsICdJbnN0YWxsIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGJ1aWxkIGZvciB0aGUgQ2hyb21lIGJyb3dzZXIgZnJvbSB0aGUgZGV2IGNoYW5uZWwuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZUBjYW5hcnknLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgdGhlIENocm9tZSBDYW5hcnkgYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lQDExNScsICdJbnN0YWxsIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGJ1aWxkIGZvciBDaHJvbWUgMTE1LicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBjaHJvbWVkcml2ZXJAY2FuYXJ5JywgJ0luc3RhbGwgdGhlIGxhdGVzdCBhdmFpbGFibGUgYnVpbGQgZm9yIENocm9tZURyaXZlciBDYW5hcnkuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZWRyaXZlckAxMTUnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgQ2hyb21lRHJpdmVyIDExNS4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lZHJpdmVyQDExNS4wLjU3OTAnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBwYXRjaCAoMTE1LjAuNTc5MC5YKSBidWlsZCBmb3IgQ2hyb21lRHJpdmVyLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBjaHJvbWUtaGVhZGxlc3Mtc2hlbGwnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBjaHJvbWUtaGVhZGxlc3Mtc2hlbGwgYnVpbGQuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZS1oZWFkbGVzcy1zaGVsbEBiZXRhJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBhdmFpbGFibGUgY2hyb21lLWhlYWRsZXNzLXNoZWxsIGJ1aWxkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEJldGEgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lLWhlYWRsZXNzLXNoZWxsQDExOCcsICdJbnN0YWxsIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGNocm9tZS1oZWFkbGVzcy1zaGVsbCAxMTggYnVpbGQuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9taXVtQDEwODMwODAnLCAnSW5zdGFsbCB0aGUgcmV2aXNpb24gMTA4MzA4MCBvZiB0aGUgQ2hyb21pdW0gYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveCcsICdJbnN0YWxsIHRoZSBsYXRlc3QgbmlnaHRseSBhdmFpbGFibGUgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveEBzdGFibGUnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IHN0YWJsZSBidWlsZCBvZiB0aGUgRmlyZWZveCBicm93c2VyLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBmaXJlZm94QGJldGEnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGJldGEgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveEBkZXZlZGl0aW9uJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBkZXZlZGl0aW9uIGJ1aWxkIG9mIHRoZSBGaXJlZm94IGJyb3dzZXIuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGZpcmVmb3hAZXNyJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBFU1IgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveEBuaWdodGx5JywgJ0luc3RhbGwgdGhlIGxhdGVzdCBuaWdodGx5IGJ1aWxkIG9mIHRoZSBGaXJlZm94IGJyb3dzZXIuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGZpcmVmb3hAc3RhYmxlXzExMS4wLjEnLCAnSW5zdGFsbCBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveCAtLXBsYXRmb3JtIG1hYycsICdJbnN0YWxsIHRoZSBsYXRlc3QgTWFjIChJbnRlbCkgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNhbGxvd0NhY2hlUGF0aE92ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBmaXJlZm94IC0tcGF0aCAvdG1wL215LWJyb3dzZXItY2FjaGUnLCAnSW5zdGFsbCB0byB0aGUgc3BlY2lmaWVkIGNhY2hlIGRpcmVjdG9yeS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgYXN5bmMgKGFyZ3YpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBhcmd2O1xuICAgICAgICAgICAgYXJncy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgICAgICAgICBpZiAoIWFyZ3MucGxhdGZvcm0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZXNvbHZlIHRoZSBjdXJyZW50IHBsYXRmb3JtYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJncy5icm93c2VyLmJ1aWxkSWQgPT09ICdwaW5uZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGlubmVkVmVyc2lvbiA9IHRoaXMuI3Bpbm5lZEJyb3dzZXJzPy5bYXJncy5icm93c2VyLm5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICghcGlubmVkVmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBpbm5lZCB2ZXJzaW9uIGZvdW5kIGZvciAke2FyZ3MuYnJvd3Nlci5uYW1lfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhcmdzLmJyb3dzZXIuYnVpbGRJZCA9IHBpbm5lZFZlcnNpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEJ1aWxkSWQgPSBhcmdzLmJyb3dzZXIuYnVpbGRJZDtcbiAgICAgICAgICAgIGFyZ3MuYnJvd3Nlci5idWlsZElkID0gYXdhaXQgcmVzb2x2ZUJ1aWxkSWQoYXJncy5icm93c2VyLm5hbWUsIGFyZ3MucGxhdGZvcm0sIGFyZ3MuYnJvd3Nlci5idWlsZElkKTtcbiAgICAgICAgICAgIGF3YWl0IGluc3RhbGwoe1xuICAgICAgICAgICAgICAgIGJyb3dzZXI6IGFyZ3MuYnJvd3Nlci5uYW1lLFxuICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBhcmdzLnBsYXRmb3JtLFxuICAgICAgICAgICAgICAgIGNhY2hlRGlyOiBhcmdzLnBhdGggPz8gdGhpcy4jY2FjaGVQYXRoLFxuICAgICAgICAgICAgICAgIGRvd25sb2FkUHJvZ3Jlc3NDYWxsYmFjazogbWFrZVByb2dyZXNzQ2FsbGJhY2soYXJncy5icm93c2VyLm5hbWUsIGFyZ3MuYnJvd3Nlci5idWlsZElkKSxcbiAgICAgICAgICAgICAgICBiYXNlVXJsOiBhcmdzLmJhc2VVcmwsXG4gICAgICAgICAgICAgICAgYnVpbGRJZEFsaWFzOiBvcmlnaW5hbEJ1aWxkSWQgIT09IGFyZ3MuYnJvd3Nlci5idWlsZElkXG4gICAgICAgICAgICAgICAgICAgID8gb3JpZ2luYWxCdWlsZElkXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJHthcmdzLmJyb3dzZXIubmFtZX1AJHthcmdzLmJyb3dzZXIuYnVpbGRJZH0gJHtjb21wdXRlRXhlY3V0YWJsZVBhdGgoe1xuICAgICAgICAgICAgICAgIGJyb3dzZXI6IGFyZ3MuYnJvd3Nlci5uYW1lLFxuICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgIGNhY2hlRGlyOiBhcmdzLnBhdGggPz8gdGhpcy4jY2FjaGVQYXRoLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBhcmdzLnBsYXRmb3JtLFxuICAgICAgICAgICAgfSl9YCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY29tbWFuZCgnbGF1bmNoIDxicm93c2VyPicsICdMYXVuY2ggdGhlIHNwZWNpZmllZCBicm93c2VyJywgeWFyZ3MgPT4ge1xuICAgICAgICAgICAgdGhpcy4jZGVmaW5lQnJvd3NlclBhcmFtZXRlcih5YXJncyk7XG4gICAgICAgICAgICB0aGlzLiNkZWZpbmVQbGF0Zm9ybVBhcmFtZXRlcih5YXJncyk7XG4gICAgICAgICAgICB0aGlzLiNkZWZpbmVQYXRoUGFyYW1ldGVyKHlhcmdzKTtcbiAgICAgICAgICAgIHlhcmdzLm9wdGlvbignZGV0YWNoZWQnLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgIGRlc2M6ICdEZXRhY2ggdGhlIGNoaWxkIHByb2Nlc3MuJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgeWFyZ3Mub3B0aW9uKCdzeXN0ZW0nLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgIGRlc2M6ICdTZWFyY2ggZm9yIGEgYnJvd3NlciBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBpbnN0ZWFkIG9mIHRoZSBjYWNoZSBmb2xkZXIuJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgbGF1bmNoIGNocm9tZUAxMTUuMC41NzkwLjE3MCcsICdMYXVuY2ggQ2hyb21lIDExNS4wLjU3OTAuMTcwJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBsYXVuY2ggZmlyZWZveEAxMTIuMGExJywgJ0xhdW5jaCB0aGUgRmlyZWZveCBicm93c2VyIGlkZW50aWZpZWQgYnkgdGhlIG1pbGVzdG9uZSAxMTIuMGExLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgbGF1bmNoIGNocm9tZUAxMTUuMC41NzkwLjE3MCAtLWRldGFjaGVkJywgJ0xhdW5jaCB0aGUgYnJvd3NlciBidXQgZGV0YWNoIHRoZSBzdWItcHJvY2Vzc2VzLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgbGF1bmNoIGNocm9tZUBjYW5hcnkgLS1zeXN0ZW0nLCAnVHJ5IHRvIGxvY2F0ZSB0aGUgQ2FuYXJ5IGJ1aWxkIG9mIENocm9tZSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBhbmQgbGF1bmNoIGl0LicpO1xuICAgICAgICB9LCBhc3luYyAoYXJndikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGFyZ3Y7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRhYmxlUGF0aCA9IGFyZ3Muc3lzdGVtXG4gICAgICAgICAgICAgICAgPyBjb21wdXRlU3lzdGVtRXhlY3V0YWJsZVBhdGgoe1xuICAgICAgICAgICAgICAgICAgICBicm93c2VyOiBhcmdzLmJyb3dzZXIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdGhyb3cgYW4gZXJyb3IgaWYgbm90IGEgQ2hyb21lUmVsZWFzZUNoYW5uZWwgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybTogYXJncy5wbGF0Zm9ybSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogY29tcHV0ZUV4ZWN1dGFibGVQYXRoKHtcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlcjogYXJncy5icm93c2VyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgICAgICBjYWNoZURpcjogYXJncy5wYXRoID8/IHRoaXMuI2NhY2hlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06IGFyZ3MucGxhdGZvcm0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsYXVuY2goe1xuICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVQYXRoLFxuICAgICAgICAgICAgICAgIGRldGFjaGVkOiBhcmdzLmRldGFjaGVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY29tbWFuZCgnY2xlYXInLCB0aGlzLiNhbGxvd0NhY2hlUGF0aE92ZXJyaWRlXG4gICAgICAgICAgICA/ICdSZW1vdmVzIGFsbCBpbnN0YWxsZWQgYnJvd3NlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIGNhY2hlIGRpcmVjdG9yeSdcbiAgICAgICAgICAgIDogYFJlbW92ZXMgYWxsIGluc3RhbGxlZCBicm93c2VycyBmcm9tICR7dGhpcy4jY2FjaGVQYXRofWAsIHlhcmdzID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2RlZmluZVBhdGhQYXJhbWV0ZXIoeWFyZ3MsIHRydWUpO1xuICAgICAgICB9LCBhc3luYyAoYXJndikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGFyZ3Y7XG4gICAgICAgICAgICBjb25zdCBjYWNoZURpciA9IGFyZ3MucGF0aCA/PyB0aGlzLiNjYWNoZVBhdGg7XG4gICAgICAgICAgICBjb25zdCBybCA9IHRoaXMuI3JsID8/IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7IGlucHV0LCBvdXRwdXQgfSk7XG4gICAgICAgICAgICBybC5xdWVzdGlvbihgRG8geW91IHdhbnQgdG8gcGVybWFuZW50bHkgYW5kIHJlY3Vyc2l2ZWx5IGRlbGV0ZSB0aGUgY29udGVudCBvZiAke2NhY2hlRGlyfSAoeWVzL05vKT8gYCwgYW5zd2VyID0+IHtcbiAgICAgICAgICAgICAgICBybC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGlmICghWyd5JywgJ3llcyddLmluY2x1ZGVzKGFuc3dlci50b0xvd2VyQ2FzZSgpLnRyaW0oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NhbmNlbGxlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZShjYWNoZURpcik7XG4gICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtjYWNoZURpcn0gY2xlYXJlZC5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmRlbWFuZENvbW1hbmQoMSlcbiAgICAgICAgICAgIC5oZWxwKCk7XG4gICAgfVxuICAgICNwYXJzZUJyb3dzZXIodmVyc2lvbikge1xuICAgICAgICByZXR1cm4gdmVyc2lvbi5zcGxpdCgnQCcpLnNoaWZ0KCk7XG4gICAgfVxuICAgICNwYXJzZUJ1aWxkSWQodmVyc2lvbikge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHZlcnNpb24uc3BsaXQoJ0AnKTtcbiAgICAgICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMlxuICAgICAgICAgICAgPyBwYXJ0c1sxXVxuICAgICAgICAgICAgOiB0aGlzLiNwaW5uZWRCcm93c2Vyc1xuICAgICAgICAgICAgICAgID8gJ3Bpbm5lZCdcbiAgICAgICAgICAgICAgICA6ICdsYXRlc3QnO1xuICAgIH1cbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVByb2dyZXNzQ2FsbGJhY2soYnJvd3NlciwgYnVpbGRJZCkge1xuICAgIGxldCBwcm9ncmVzc0JhcjtcbiAgICBsZXQgbGFzdERvd25sb2FkZWRCeXRlcyA9IDA7XG4gICAgcmV0dXJuIChkb3dubG9hZGVkQnl0ZXMsIHRvdGFsQnl0ZXMpID0+IHtcbiAgICAgICAgaWYgKCFwcm9ncmVzc0Jhcikge1xuICAgICAgICAgICAgcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoYERvd25sb2FkaW5nICR7YnJvd3Nlcn0gJHtidWlsZElkfSAtICR7dG9NZWdhYnl0ZXModG90YWxCeXRlcyl9IFs6YmFyXSA6cGVyY2VudCA6ZXRhcyBgLCB7XG4gICAgICAgICAgICAgICAgY29tcGxldGU6ICc9JyxcbiAgICAgICAgICAgICAgICBpbmNvbXBsZXRlOiAnICcsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwLFxuICAgICAgICAgICAgICAgIHRvdGFsOiB0b3RhbEJ5dGVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsdGEgPSBkb3dubG9hZGVkQnl0ZXMgLSBsYXN0RG93bmxvYWRlZEJ5dGVzO1xuICAgICAgICBsYXN0RG93bmxvYWRlZEJ5dGVzID0gZG93bmxvYWRlZEJ5dGVzO1xuICAgICAgICBwcm9ncmVzc0Jhci50aWNrKGRlbHRhKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gdG9NZWdhYnl0ZXMoYnl0ZXMpIHtcbiAgICBjb25zdCBtYiA9IGJ5dGVzIC8gMTAwMCAvIDEwMDA7XG4gICAgcmV0dXJuIGAke01hdGgucm91bmQobWIgKiAxMCkgLyAxMH0gTUJgO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q0xJLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IEJyb3dzZXIsIGV4ZWN1dGFibGVQYXRoQnlCcm93c2VyLCBnZXRWZXJzaW9uQ29tcGFyYXRvciwgfSBmcm9tICcuL2Jyb3dzZXItZGF0YS9icm93c2VyLWRhdGEuanMnO1xuaW1wb3J0IHsgZGV0ZWN0QnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi9kZXRlY3RQbGF0Zm9ybS5qcyc7XG5jb25zdCBkZWJ1Z0NhY2hlID0gZGVidWcoJ3B1cHBldGVlcjpicm93c2VyczpjYWNoZScpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnN0YWxsZWRCcm93c2VyIHtcbiAgICBicm93c2VyO1xuICAgIGJ1aWxkSWQ7XG4gICAgcGxhdGZvcm07XG4gICAgZXhlY3V0YWJsZVBhdGg7XG4gICAgI2NhY2hlO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhY2hlLCBicm93c2VyLCBidWlsZElkLCBwbGF0Zm9ybSkge1xuICAgICAgICB0aGlzLiNjYWNoZSA9IGNhY2hlO1xuICAgICAgICB0aGlzLmJyb3dzZXIgPSBicm93c2VyO1xuICAgICAgICB0aGlzLmJ1aWxkSWQgPSBidWlsZElkO1xuICAgICAgICB0aGlzLnBsYXRmb3JtID0gcGxhdGZvcm07XG4gICAgICAgIHRoaXMuZXhlY3V0YWJsZVBhdGggPSBjYWNoZS5jb21wdXRlRXhlY3V0YWJsZVBhdGgoe1xuICAgICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgICAgIGJ1aWxkSWQsXG4gICAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlIGluc3RhbGxhdGlvbiBmb2xkZXIuIFVzZVxuICAgICAqIHtAbGluayBjb21wdXRlRXhlY3V0YWJsZVBhdGh9IHRvIGdldCB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSBiaW5hcnkuXG4gICAgICovXG4gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWNoZS5pbnN0YWxsYXRpb25EaXIodGhpcy5icm93c2VyLCB0aGlzLnBsYXRmb3JtLCB0aGlzLmJ1aWxkSWQpO1xuICAgIH1cbiAgICByZWFkTWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWNoZS5yZWFkTWV0YWRhdGEodGhpcy5icm93c2VyKTtcbiAgICB9XG4gICAgd3JpdGVNZXRhZGF0YShtZXRhZGF0YSkge1xuICAgICAgICB0aGlzLiNjYWNoZS53cml0ZU1ldGFkYXRhKHRoaXMuYnJvd3NlciwgbWV0YWRhdGEpO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIGNhY2hlIHVzZWQgYnkgUHVwcGV0ZWVyIHJlbGllcyBvbiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqXG4gKiAtIHJvb3REaXJcbiAqICAgLS0gPGJyb3dzZXIxPiB8IGJyb3dzZXJSb290KGJyb3dzZXIxKVxuICogICAtLS0tIDxwbGF0Zm9ybT4tPGJ1aWxkSWQ+IHwgaW5zdGFsbGF0aW9uRGlyKClcbiAqICAgLS0tLS0tIHRoZSBicm93c2VyLXBsYXRmb3JtLWJ1aWxkSWRcbiAqICAgLS0tLS0tIHNwZWNpZmljIHN0cnVjdHVyZS5cbiAqICAgLS0gPGJyb3dzZXIyPiB8IGJyb3dzZXJSb290KGJyb3dzZXIyKVxuICogICAtLS0tIDxwbGF0Zm9ybT4tPGJ1aWxkSWQ+IHwgaW5zdGFsbGF0aW9uRGlyKClcbiAqICAgLS0tLS0tIHRoZSBicm93c2VyLXBsYXRmb3JtLWJ1aWxkSWRcbiAqICAgLS0tLS0tIHNwZWNpZmljIHN0cnVjdHVyZS5cbiAqICAgQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWNoZSB7XG4gICAgI3Jvb3REaXI7XG4gICAgY29uc3RydWN0b3Iocm9vdERpcikge1xuICAgICAgICB0aGlzLiNyb290RGlyID0gcm9vdERpcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0IHJvb3REaXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyb290RGlyO1xuICAgIH1cbiAgICBicm93c2VyUm9vdChicm93c2VyKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy4jcm9vdERpciwgYnJvd3Nlcik7XG4gICAgfVxuICAgIG1ldGFkYXRhRmlsZShicm93c2VyKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5icm93c2VyUm9vdChicm93c2VyKSwgJy5tZXRhZGF0YScpO1xuICAgIH1cbiAgICByZWFkTWV0YWRhdGEoYnJvd3Nlcikge1xuICAgICAgICBjb25zdCBtZXRhdGFkYVBhdGggPSB0aGlzLm1ldGFkYXRhRmlsZShicm93c2VyKTtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG1ldGF0YWRhUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGFsaWFzZXM6IHt9IH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogYWRkIHR5cGUtc2FmZSBwYXJzaW5nLlxuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWV0YXRhZGFQYXRoLCAndXRmOCcpKTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcubWV0YWRhdGEgaXMgbm90IGFuIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICB3cml0ZU1ldGFkYXRhKGJyb3dzZXIsIG1ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IG1ldGF0YWRhUGF0aCA9IHRoaXMubWV0YWRhdGFGaWxlKGJyb3dzZXIpO1xuICAgICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG1ldGF0YWRhUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG1ldGF0YWRhUGF0aCwgSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEsIG51bGwsIDIpKTtcbiAgICB9XG4gICAgcmVzb2x2ZUFsaWFzKGJyb3dzZXIsIGFsaWFzKSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5yZWFkTWV0YWRhdGEoYnJvd3Nlcik7XG4gICAgICAgIGlmIChhbGlhcyA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKG1ldGFkYXRhLmFsaWFzZXMgfHwge30pXG4gICAgICAgICAgICAgICAgLnNvcnQoZ2V0VmVyc2lvbkNvbXBhcmF0b3IoYnJvd3NlcikpXG4gICAgICAgICAgICAgICAgLmF0KC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0YWRhdGEuYWxpYXNlc1thbGlhc107XG4gICAgfVxuICAgIGluc3RhbGxhdGlvbkRpcihicm93c2VyLCBwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgICAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuYnJvd3NlclJvb3QoYnJvd3NlciksIGAke3BsYXRmb3JtfS0ke2J1aWxkSWR9YCk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICBmcy5ybVN5bmModGhpcy4jcm9vdERpciwge1xuICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgICBtYXhSZXRyaWVzOiAxMCxcbiAgICAgICAgICAgIHJldHJ5RGVsYXk6IDUwMCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVuaW5zdGFsbChicm93c2VyLCBwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMucmVhZE1ldGFkYXRhKGJyb3dzZXIpO1xuICAgICAgICBmb3IgKGNvbnN0IGFsaWFzIG9mIE9iamVjdC5rZXlzKG1ldGFkYXRhLmFsaWFzZXMpKSB7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEuYWxpYXNlc1thbGlhc10gPT09IGJ1aWxkSWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWxpYXNlc1thbGlhc107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnMucm1TeW5jKHRoaXMuaW5zdGFsbGF0aW9uRGlyKGJyb3dzZXIsIHBsYXRmb3JtLCBidWlsZElkKSwge1xuICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgICBtYXhSZXRyaWVzOiAxMCxcbiAgICAgICAgICAgIHJldHJ5RGVsYXk6IDUwMCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldEluc3RhbGxlZEJyb3dzZXJzKCkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy4jcm9vdERpcikpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuI3Jvb3REaXIpO1xuICAgICAgICBjb25zdCBicm93c2VycyA9IHR5cGVzLmZpbHRlcigodCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoQnJvd3NlcikuaW5jbHVkZXModCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYnJvd3NlcnMuZmxhdE1hcChicm93c2VyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmModGhpcy5icm93c2VyUm9vdChicm93c2VyKSk7XG4gICAgICAgICAgICByZXR1cm4gZmlsZXNcbiAgICAgICAgICAgICAgICAubWFwKGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlRm9sZGVyUGF0aChwYXRoLmpvaW4odGhpcy5icm93c2VyUm9vdChicm93c2VyKSwgZmlsZSkpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluc3RhbGxlZEJyb3dzZXIodGhpcywgYnJvd3NlciwgcmVzdWx0LmJ1aWxkSWQsIHJlc3VsdC5wbGF0Zm9ybSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSAhPT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29tcHV0ZUV4ZWN1dGFibGVQYXRoKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgICAgIGlmICghb3B0aW9ucy5wbGF0Zm9ybSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZG93bmxvYWQgYSBiaW5hcnkgZm9yIHRoZSBwcm92aWRlZCBwbGF0Zm9ybTogJHtvcy5wbGF0Zm9ybSgpfSAoJHtvcy5hcmNoKCl9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvcHRpb25zLmJ1aWxkSWQgPVxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZUFsaWFzKG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5idWlsZElkKSA/PyBvcHRpb25zLmJ1aWxkSWQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgZGVidWdDYWNoZSgnY291bGQgbm90IHJlYWQgLm1ldGFkYXRhIGZpbGUgZm9yIHRoZSBicm93c2VyJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5zdGFsbGF0aW9uRGlyID0gdGhpcy5pbnN0YWxsYXRpb25EaXIob3B0aW9ucy5icm93c2VyLCBvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQpO1xuICAgICAgICByZXR1cm4gcGF0aC5qb2luKGluc3RhbGxhdGlvbkRpciwgZXhlY3V0YWJsZVBhdGhCeUJyb3dzZXJbb3B0aW9ucy5icm93c2VyXShvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZUZvbGRlclBhdGgoZm9sZGVyUGF0aCkge1xuICAgIGNvbnN0IG5hbWUgPSBwYXRoLmJhc2VuYW1lKGZvbGRlclBhdGgpO1xuICAgIGNvbnN0IHNwbGl0cyA9IG5hbWUuc3BsaXQoJy0nKTtcbiAgICBpZiAoc3BsaXRzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFtwbGF0Zm9ybSwgYnVpbGRJZF0gPSBzcGxpdHM7XG4gICAgaWYgKCFidWlsZElkIHx8ICFwbGF0Zm9ybSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB7IHBsYXRmb3JtLCBidWlsZElkIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYWNoZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0ICogYXMgY2hyb21lSGVhZGxlc3NTaGVsbCBmcm9tICcuL2Nocm9tZS1oZWFkbGVzcy1zaGVsbC5qcyc7XG5pbXBvcnQgKiBhcyBjaHJvbWUgZnJvbSAnLi9jaHJvbWUuanMnO1xuaW1wb3J0ICogYXMgY2hyb21lZHJpdmVyIGZyb20gJy4vY2hyb21lZHJpdmVyLmpzJztcbmltcG9ydCAqIGFzIGNocm9taXVtIGZyb20gJy4vY2hyb21pdW0uanMnO1xuaW1wb3J0ICogYXMgZmlyZWZveCBmcm9tICcuL2ZpcmVmb3guanMnO1xuaW1wb3J0IHsgQnJvd3NlciwgQnJvd3NlclBsYXRmb3JtLCBCcm93c2VyVGFnLCBDaHJvbWVSZWxlYXNlQ2hhbm5lbCwgfSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCBjb25zdCBkb3dubG9hZFVybHMgPSB7XG4gICAgW0Jyb3dzZXIuQ0hST01FRFJJVkVSXTogY2hyb21lZHJpdmVyLnJlc29sdmVEb3dubG9hZFVybCxcbiAgICBbQnJvd3Nlci5DSFJPTUVIRUFETEVTU1NIRUxMXTogY2hyb21lSGVhZGxlc3NTaGVsbC5yZXNvbHZlRG93bmxvYWRVcmwsXG4gICAgW0Jyb3dzZXIuQ0hST01FXTogY2hyb21lLnJlc29sdmVEb3dubG9hZFVybCxcbiAgICBbQnJvd3Nlci5DSFJPTUlVTV06IGNocm9taXVtLnJlc29sdmVEb3dubG9hZFVybCxcbiAgICBbQnJvd3Nlci5GSVJFRk9YXTogZmlyZWZveC5yZXNvbHZlRG93bmxvYWRVcmwsXG59O1xuZXhwb3J0IGNvbnN0IGRvd25sb2FkUGF0aHMgPSB7XG4gICAgW0Jyb3dzZXIuQ0hST01FRFJJVkVSXTogY2hyb21lZHJpdmVyLnJlc29sdmVEb3dubG9hZFBhdGgsXG4gICAgW0Jyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTF06IGNocm9tZUhlYWRsZXNzU2hlbGwucmVzb2x2ZURvd25sb2FkUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUVdOiBjaHJvbWUucmVzb2x2ZURvd25sb2FkUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUlVTV06IGNocm9taXVtLnJlc29sdmVEb3dubG9hZFBhdGgsXG4gICAgW0Jyb3dzZXIuRklSRUZPWF06IGZpcmVmb3gucmVzb2x2ZURvd25sb2FkUGF0aCxcbn07XG5leHBvcnQgY29uc3QgZXhlY3V0YWJsZVBhdGhCeUJyb3dzZXIgPSB7XG4gICAgW0Jyb3dzZXIuQ0hST01FRFJJVkVSXTogY2hyb21lZHJpdmVyLnJlbGF0aXZlRXhlY3V0YWJsZVBhdGgsXG4gICAgW0Jyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTF06IGNocm9tZUhlYWRsZXNzU2hlbGwucmVsYXRpdmVFeGVjdXRhYmxlUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUVdOiBjaHJvbWUucmVsYXRpdmVFeGVjdXRhYmxlUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUlVTV06IGNocm9taXVtLnJlbGF0aXZlRXhlY3V0YWJsZVBhdGgsXG4gICAgW0Jyb3dzZXIuRklSRUZPWF06IGZpcmVmb3gucmVsYXRpdmVFeGVjdXRhYmxlUGF0aCxcbn07XG5leHBvcnQgY29uc3QgdmVyc2lvbkNvbXBhcmF0b3JzID0ge1xuICAgIFtCcm93c2VyLkNIUk9NRURSSVZFUl06IGNocm9tZWRyaXZlci5jb21wYXJlVmVyc2lvbnMsXG4gICAgW0Jyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTF06IGNocm9tZUhlYWRsZXNzU2hlbGwuY29tcGFyZVZlcnNpb25zLFxuICAgIFtCcm93c2VyLkNIUk9NRV06IGNocm9tZS5jb21wYXJlVmVyc2lvbnMsXG4gICAgW0Jyb3dzZXIuQ0hST01JVU1dOiBjaHJvbWl1bS5jb21wYXJlVmVyc2lvbnMsXG4gICAgW0Jyb3dzZXIuRklSRUZPWF06IGZpcmVmb3guY29tcGFyZVZlcnNpb25zLFxufTtcbmV4cG9ydCB7IEJyb3dzZXIsIEJyb3dzZXJQbGF0Zm9ybSwgQ2hyb21lUmVsZWFzZUNoYW5uZWwgfTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCdWlsZElkRm9yQnJvd3NlclRhZyhicm93c2VyLCBwbGF0Zm9ybSwgdGFnKSB7XG4gICAgc3dpdGNoIChicm93c2VyKSB7XG4gICAgICAgIGNhc2UgQnJvd3Nlci5GSVJFRk9YOlxuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTEFURVNUOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLk5JR0hUTFkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLkJFVEEpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5OSUdIVExZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLk5JR0hUTFkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVZFRElUSU9OOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLkRFVkVESVRJT04pO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5TVEFCTEU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBmaXJlZm94LnJlc29sdmVCdWlsZElkKGZpcmVmb3guRmlyZWZveENoYW5uZWwuU1RBQkxFKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuRVNSOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLkVTUik7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuREVWOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFnLnRvVXBwZXJDYXNlKCl9IGlzIG5vdCBhdmFpbGFibGUgZm9yIEZpcmVmb3hgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NRToge1xuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTEFURVNUOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkNBTkFSWSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkJFVEE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWUucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuQkVUQSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNocm9tZS5yZXNvbHZlQnVpbGRJZChDaHJvbWVSZWxlYXNlQ2hhbm5lbC5DQU5BUlkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWUucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuREVWKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLlNUQUJMRSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLk5JR0hUTFk6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkRFVkVESVRJT046XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkVTUjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhZy50b1VwcGVyQ2FzZSgpfSBpcyBub3QgYXZhaWxhYmxlIGZvciBDaHJvbWVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FRFJJVkVSOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5MQVRFU1Q6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNocm9tZWRyaXZlci5yZXNvbHZlQnVpbGRJZChDaHJvbWVSZWxlYXNlQ2hhbm5lbC5DQU5BUlkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lZHJpdmVyLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkJFVEEpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVkcml2ZXIucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuREVWKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lZHJpdmVyLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLlNUQUJMRSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLk5JR0hUTFk6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkRFVkVESVRJT046XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkVTUjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhZy50b1VwcGVyQ2FzZSgpfSBpcyBub3QgYXZhaWxhYmxlIGZvciBDaHJvbWVEcml2ZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTDoge1xuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTEFURVNUOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5DQU5BUlk6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkNBTkFSWSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkJFVEE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkJFVEEpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkRFVik7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLlNUQUJMRTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNocm9tZUhlYWRsZXNzU2hlbGwucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTklHSFRMWTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuREVWRURJVElPTjpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuRVNSOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFnfSBpcyBub3QgYXZhaWxhYmxlIGZvciBjaHJvbWUtaGVhZGxlc3Mtc2hlbGxgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01JVU06XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5MQVRFU1Q6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWl1bS5yZXNvbHZlQnVpbGRJZChwbGF0Zm9ybSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLk5JR0hUTFk6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuREVWOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVZFRElUSU9OOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5CRVRBOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5TVEFCTEU6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkVTUjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhZ30gaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2hyb21pdW0uIFVzZSAnbGF0ZXN0JyBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJ1aWxkSWQoYnJvd3NlciwgcGxhdGZvcm0sIHRhZykge1xuICAgIGNvbnN0IGJyb3dzZXJUYWcgPSB0YWc7XG4gICAgaWYgKE9iamVjdC52YWx1ZXMoQnJvd3NlclRhZykuaW5jbHVkZXMoYnJvd3NlclRhZykpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVCdWlsZElkRm9yQnJvd3NlclRhZyhicm93c2VyLCBwbGF0Zm9ybSwgYnJvd3NlclRhZyk7XG4gICAgfVxuICAgIHN3aXRjaCAoYnJvd3Nlcikge1xuICAgICAgICBjYXNlIEJyb3dzZXIuRklSRUZPWDpcbiAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUU6XG4gICAgICAgICAgICBjb25zdCBjaHJvbWVSZXN1bHQgPSBhd2FpdCBjaHJvbWUucmVzb2x2ZUJ1aWxkSWQodGFnKTtcbiAgICAgICAgICAgIGlmIChjaHJvbWVSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hyb21lUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NRURSSVZFUjpcbiAgICAgICAgICAgIGNvbnN0IGNocm9tZURyaXZlclJlc3VsdCA9IGF3YWl0IGNocm9tZWRyaXZlci5yZXNvbHZlQnVpbGRJZCh0YWcpO1xuICAgICAgICAgICAgaWYgKGNocm9tZURyaXZlclJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaHJvbWVEcml2ZXJSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGFnO1xuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTDpcbiAgICAgICAgICAgIGNvbnN0IGNocm9tZUhlYWRsZXNzU2hlbGxSZXN1bHQgPSBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKHRhZyk7XG4gICAgICAgICAgICBpZiAoY2hyb21lSGVhZGxlc3NTaGVsbFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaHJvbWVIZWFkbGVzc1NoZWxsUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NSVVNOlxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVByb2ZpbGUoYnJvd3Nlciwgb3B0cykge1xuICAgIHN3aXRjaCAoYnJvd3Nlcikge1xuICAgICAgICBjYXNlIEJyb3dzZXIuRklSRUZPWDpcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmaXJlZm94LmNyZWF0ZVByb2ZpbGUob3B0cyk7XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUU6XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUlVTTpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvZmlsZSBjcmVhdGlvbiBpcyBub3Qgc3VwcG9ydCBmb3IgJHticm93c2VyfSB5ZXRgKTtcbiAgICB9XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTeXN0ZW1FeGVjdXRhYmxlUGF0aChicm93c2VyLCBwbGF0Zm9ybSwgY2hhbm5lbCkge1xuICAgIHN3aXRjaCAoYnJvd3Nlcikge1xuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FRFJJVkVSOlxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTDpcbiAgICAgICAgY2FzZSBCcm93c2VyLkZJUkVGT1g6XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUlVTTpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3lzdGVtIGJyb3dzZXIgZGV0ZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yICR7YnJvd3Nlcn0geWV0LmApO1xuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FOlxuICAgICAgICAgICAgcmV0dXJuIGNocm9tZS5yZXNvbHZlU3lzdGVtRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIGNoYW5uZWwpO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyBhIHZlcnNpb24gY29tcGFyYXRvciBmb3IgdGhlIGdpdmVuIGJyb3dzZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBzb3J0XG4gKiBicm93c2VyIHZlcnNpb25zLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25Db21wYXJhdG9yKGJyb3dzZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvbkNvbXBhcmF0b3JzW2Jyb3dzZXJdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJvd3Nlci1kYXRhLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vdHlwZXMuanMnO1xuZnVuY3Rpb24gZm9sZGVyKHBsYXRmb3JtKSB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgIHJldHVybiAnbGludXg2NCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgICAgICByZXR1cm4gJ21hYy1hcm02NCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiAnbWFjLXg2NCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICAgICAgcmV0dXJuICd3aW4zMic7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICAgICAgcmV0dXJuICd3aW42NCc7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFVybChwbGF0Zm9ybSwgYnVpbGRJZCwgYmFzZVVybCA9ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vY2hyb21lLWZvci10ZXN0aW5nLXB1YmxpYycpIHtcbiAgICByZXR1cm4gYCR7YmFzZVVybH0vJHtyZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCBidWlsZElkKS5qb2luKCcvJyl9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCBidWlsZElkKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYnVpbGRJZCxcbiAgICAgICAgZm9sZGVyKHBsYXRmb3JtKSxcbiAgICAgICAgYGNocm9tZS1oZWFkbGVzcy1zaGVsbC0ke2ZvbGRlcihwbGF0Zm9ybSl9LnppcGAsXG4gICAgXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUV4ZWN1dGFibGVQYXRoKHBsYXRmb3JtLCBfYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLWhlYWRsZXNzLXNoZWxsLScgKyBmb2xkZXIocGxhdGZvcm0pLCAnY2hyb21lLWhlYWRsZXNzLXNoZWxsJyk7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLWhlYWRsZXNzLXNoZWxsLWxpbnV4NjQnLCAnY2hyb21lLWhlYWRsZXNzLXNoZWxsJyk7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2Nocm9tZS1oZWFkbGVzcy1zaGVsbC0nICsgZm9sZGVyKHBsYXRmb3JtKSwgJ2Nocm9tZS1oZWFkbGVzcy1zaGVsbC5leGUnKTtcbiAgICB9XG59XG5leHBvcnQgeyByZXNvbHZlQnVpbGRJZCwgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnLi9jaHJvbWUuanMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2hyb21lLWhlYWRsZXNzLXNoZWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IGdldEpTT04gfSBmcm9tICcuLi9odHRwVXRpbC5qcyc7XG5pbXBvcnQgeyBCcm93c2VyUGxhdGZvcm0sIENocm9tZVJlbGVhc2VDaGFubmVsIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5mdW5jdGlvbiBmb2xkZXIocGxhdGZvcm0pIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuICdsaW51eDY0JztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDX0FSTTpcbiAgICAgICAgICAgIHJldHVybiAnbWFjLWFybTY0JztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICAgICAgcmV0dXJuICdtYWMteDY0JztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lOMzI6XG4gICAgICAgICAgICByZXR1cm4gJ3dpbjMyJztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gJ3dpbjY0JztcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURvd25sb2FkVXJsKHBsYXRmb3JtLCBidWlsZElkLCBiYXNlVXJsID0gJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9jaHJvbWUtZm9yLXRlc3RpbmctcHVibGljJykge1xuICAgIHJldHVybiBgJHtiYXNlVXJsfS8ke3Jlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpLmpvaW4oJy8nKX1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICByZXR1cm4gW2J1aWxkSWQsIGZvbGRlcihwbGF0Zm9ybSksIGBjaHJvbWUtJHtmb2xkZXIocGxhdGZvcm0pfS56aXBgXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUV4ZWN1dGFibGVQYXRoKHBsYXRmb3JtLCBfYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLScgKyBmb2xkZXIocGxhdGZvcm0pLCAnR29vZ2xlIENocm9tZSBmb3IgVGVzdGluZy5hcHAnLCAnQ29udGVudHMnLCAnTWFjT1MnLCAnR29vZ2xlIENocm9tZSBmb3IgVGVzdGluZycpO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2Nocm9tZS1saW51eDY0JywgJ2Nocm9tZScpO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWUtJyArIGZvbGRlcihwbGF0Zm9ybSksICdjaHJvbWUuZXhlJyk7XG4gICAgfVxufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhc3RLbm93bkdvb2RSZWxlYXNlRm9yQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBnZXRKU09OKG5ldyBVUkwoJ2h0dHBzOi8vZ29vZ2xlY2hyb21lbGFicy5naXRodWIuaW8vY2hyb21lLWZvci10ZXN0aW5nL2xhc3Qta25vd24tZ29vZC12ZXJzaW9ucy5qc29uJykpKTtcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgT2JqZWN0LmtleXMoZGF0YS5jaGFubmVscykpIHtcbiAgICAgICAgZGF0YS5jaGFubmVsc1tjaGFubmVsLnRvTG93ZXJDYXNlKCldID0gZGF0YS5jaGFubmVsc1tjaGFubmVsXTtcbiAgICAgICAgZGVsZXRlIGRhdGEuY2hhbm5lbHNbY2hhbm5lbF07XG4gICAgfVxuICAgIHJldHVybiBkYXRhLmNoYW5uZWxzW2NoYW5uZWxdO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhc3RLbm93bkdvb2RSZWxlYXNlRm9yTWlsZXN0b25lKG1pbGVzdG9uZSkge1xuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgZ2V0SlNPTihuZXcgVVJMKCdodHRwczovL2dvb2dsZWNocm9tZWxhYnMuZ2l0aHViLmlvL2Nocm9tZS1mb3ItdGVzdGluZy9sYXRlc3QtdmVyc2lvbnMtcGVyLW1pbGVzdG9uZS5qc29uJykpKTtcbiAgICByZXR1cm4gZGF0YS5taWxlc3RvbmVzW21pbGVzdG9uZV07XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGFzdEtub3duR29vZFJlbGVhc2VGb3JCdWlsZChcbi8qKlxuICogQGV4YW1wbGUgYDExMi4wLjIzYCxcbiAqL1xuYnVpbGRQcmVmaXgpIHtcbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IGdldEpTT04obmV3IFVSTCgnaHR0cHM6Ly9nb29nbGVjaHJvbWVsYWJzLmdpdGh1Yi5pby9jaHJvbWUtZm9yLXRlc3RpbmcvbGF0ZXN0LXBhdGNoLXZlcnNpb25zLXBlci1idWlsZC5qc29uJykpKTtcbiAgICByZXR1cm4gZGF0YS5idWlsZHNbYnVpbGRQcmVmaXhdO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCdWlsZElkKGNoYW5uZWwpIHtcbiAgICBpZiAoT2JqZWN0LnZhbHVlcyhDaHJvbWVSZWxlYXNlQ2hhbm5lbCkuaW5jbHVkZXMoY2hhbm5lbCkpIHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBnZXRMYXN0S25vd25Hb29kUmVsZWFzZUZvckNoYW5uZWwoY2hhbm5lbCkpLnZlcnNpb247XG4gICAgfVxuICAgIGlmIChjaGFubmVsLm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgICAvLyBQb3RlbnRpYWxseSBhIG1pbGVzdG9uZS5cbiAgICAgICAgcmV0dXJuIChhd2FpdCBnZXRMYXN0S25vd25Hb29kUmVsZWFzZUZvck1pbGVzdG9uZShjaGFubmVsKSk/LnZlcnNpb247XG4gICAgfVxuICAgIGlmIChjaGFubmVsLm1hdGNoKC9eXFxkK1xcLlxcZCtcXC5cXGQrJC8pKSB7XG4gICAgICAgIC8vIFBvdGVudGlhbGx5IGEgYnVpbGQgcHJlZml4IHdpdGhvdXQgdGhlIHBhdGNoIHZlcnNpb24uXG4gICAgICAgIHJldHVybiAoYXdhaXQgZ2V0TGFzdEtub3duR29vZFJlbGVhc2VGb3JCdWlsZChjaGFubmVsKSk/LnZlcnNpb247XG4gICAgfVxuICAgIHJldHVybjtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU3lzdGVtRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIGNoYW5uZWwpIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7cHJvY2Vzcy5lbnZbJ1BST0dSQU1GSUxFUyddfVxcXFxHb29nbGVcXFxcQ2hyb21lXFxcXEFwcGxpY2F0aW9uXFxcXGNocm9tZS5leGVgO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuQkVUQTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3Byb2Nlc3MuZW52WydQUk9HUkFNRklMRVMnXX1cXFxcR29vZ2xlXFxcXENocm9tZSBCZXRhXFxcXEFwcGxpY2F0aW9uXFxcXGNocm9tZS5leGVgO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuQ0FOQVJZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7cHJvY2Vzcy5lbnZbJ1BST0dSQU1GSUxFUyddfVxcXFxHb29nbGVcXFxcQ2hyb21lIFN4U1xcXFxBcHBsaWNhdGlvblxcXFxjaHJvbWUuZXhlYDtcbiAgICAgICAgICAgICAgICBjYXNlIENocm9tZVJlbGVhc2VDaGFubmVsLkRFVjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3Byb2Nlc3MuZW52WydQUk9HUkFNRklMRVMnXX1cXFxcR29vZ2xlXFxcXENocm9tZSBEZXZcXFxcQXBwbGljYXRpb25cXFxcY2hyb21lLmV4ZWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvR29vZ2xlIENocm9tZS5hcHAvQ29udGVudHMvTWFjT1MvR29vZ2xlIENocm9tZSc7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvR29vZ2xlIENocm9tZSBCZXRhLmFwcC9Db250ZW50cy9NYWNPUy9Hb29nbGUgQ2hyb21lIEJldGEnO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuQ0FOQVJZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvR29vZ2xlIENocm9tZSBDYW5hcnkuYXBwL0NvbnRlbnRzL01hY09TL0dvb2dsZSBDaHJvbWUgQ2FuYXJ5JztcbiAgICAgICAgICAgICAgICBjYXNlIENocm9tZVJlbGVhc2VDaGFubmVsLkRFVjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcvQXBwbGljYXRpb25zL0dvb2dsZSBDaHJvbWUgRGV2LmFwcC9Db250ZW50cy9NYWNPUy9Hb29nbGUgQ2hyb21lIERldic7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5TVEFCTEU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnL29wdC9nb29nbGUvY2hyb21lL2Nocm9tZSc7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9vcHQvZ29vZ2xlL2Nocm9tZS1iZXRhL2Nocm9tZSc7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnL29wdC9nb29nbGUvY2hyb21lLXVuc3RhYmxlL2Nocm9tZSc7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRldGVjdCBicm93c2VyIGV4ZWN1dGFibGUgcGF0aCBmb3IgJyR7Y2hhbm5lbH0nIG9uICR7cGxhdGZvcm19LmApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhLCBiKSB7XG4gICAgaWYgKCFzZW12ZXIudmFsaWQoYSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWZXJzaW9uICR7YX0gaXMgbm90IGEgdmFsaWQgc2VtdmVyIHZlcnNpb25gKTtcbiAgICB9XG4gICAgaWYgKCFzZW12ZXIudmFsaWQoYikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWZXJzaW9uICR7Yn0gaXMgbm90IGEgdmFsaWQgc2VtdmVyIHZlcnNpb25gKTtcbiAgICB9XG4gICAgaWYgKHNlbXZlci5ndChhLCBiKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VtdmVyLmx0KGEsIGIpKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNocm9tZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBCcm93c2VyUGxhdGZvcm0gfSBmcm9tICcuL3R5cGVzLmpzJztcbmZ1bmN0aW9uIGZvbGRlcihwbGF0Zm9ybSkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gJ2xpbnV4NjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuICdtYWMtYXJtNjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgICAgICByZXR1cm4gJ21hYy14NjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgIHJldHVybiAnd2luMzInO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiAnd2luNjQnO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRVcmwocGxhdGZvcm0sIGJ1aWxkSWQsIGJhc2VVcmwgPSAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Nocm9tZS1mb3ItdGVzdGluZy1wdWJsaWMnKSB7XG4gICAgcmV0dXJuIGAke2Jhc2VVcmx9LyR7cmVzb2x2ZURvd25sb2FkUGF0aChwbGF0Zm9ybSwgYnVpbGRJZCkuam9pbignLycpfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURvd25sb2FkUGF0aChwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgIHJldHVybiBbYnVpbGRJZCwgZm9sZGVyKHBsYXRmb3JtKSwgYGNocm9tZWRyaXZlci0ke2ZvbGRlcihwbGF0Zm9ybSl9LnppcGBdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIF9idWlsZElkKSB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWVkcml2ZXItJyArIGZvbGRlcihwbGF0Zm9ybSksICdjaHJvbWVkcml2ZXInKTtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWVkcml2ZXItbGludXg2NCcsICdjaHJvbWVkcml2ZXInKTtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lOMzI6XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lZHJpdmVyLScgKyBmb2xkZXIocGxhdGZvcm0pLCAnY2hyb21lZHJpdmVyLmV4ZScpO1xuICAgIH1cbn1cbmV4cG9ydCB7IHJlc29sdmVCdWlsZElkLCBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuL2Nocm9tZS5qcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaHJvbWVkcml2ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0VGV4dCB9IGZyb20gJy4uL2h0dHBVdGlsLmpzJztcbmltcG9ydCB7IEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vdHlwZXMuanMnO1xuZnVuY3Rpb24gYXJjaGl2ZShwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gJ2Nocm9tZS1saW51eCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiAnY2hyb21lLW1hYyc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIC8vIFdpbmRvd3MgYXJjaGl2ZSBuYW1lIGNoYW5nZWQgYXQgcjU5MTQ3OS5cbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChidWlsZElkLCAxMCkgPiA1OTE0NzkgPyAnY2hyb21lLXdpbicgOiAnY2hyb21lLXdpbjMyJztcbiAgICB9XG59XG5mdW5jdGlvbiBmb2xkZXIocGxhdGZvcm0pIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuICdMaW51eF94NjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuICdNYWNfQXJtJztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICAgICAgcmV0dXJuICdNYWMnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgIHJldHVybiAnV2luJztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gJ1dpbl94NjQnO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRVcmwocGxhdGZvcm0sIGJ1aWxkSWQsIGJhc2VVcmwgPSAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Nocm9taXVtLWJyb3dzZXItc25hcHNob3RzJykge1xuICAgIHJldHVybiBgJHtiYXNlVXJsfS8ke3Jlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpLmpvaW4oJy8nKX1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICByZXR1cm4gW2ZvbGRlcihwbGF0Zm9ybSksIGJ1aWxkSWQsIGAke2FyY2hpdmUocGxhdGZvcm0sIGJ1aWxkSWQpfS56aXBgXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUV4ZWN1dGFibGVQYXRoKHBsYXRmb3JtLCBfYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLW1hYycsICdDaHJvbWl1bS5hcHAnLCAnQ29udGVudHMnLCAnTWFjT1MnLCAnQ2hyb21pdW0nKTtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWUtbGludXgnLCAnY2hyb21lJyk7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2Nocm9tZS13aW4nLCAnY2hyb21lLmV4ZScpO1xuICAgIH1cbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlQnVpbGRJZChwbGF0Zm9ybSkge1xuICAgIHJldHVybiBhd2FpdCBnZXRUZXh0KG5ldyBVUkwoYGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9jaHJvbWl1bS1icm93c2VyLXNuYXBzaG90cy8ke2ZvbGRlcihwbGF0Zm9ybSl9L0xBU1RfQ0hBTkdFYCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhLCBiKSB7XG4gICAgcmV0dXJuIE51bWJlcihhKSAtIE51bWJlcihiKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNocm9taXVtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBnZXRKU09OIH0gZnJvbSAnLi4vaHR0cFV0aWwuanMnO1xuaW1wb3J0IHsgQnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5mdW5jdGlvbiBhcmNoaXZlTmlnaHRseShwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gYGZpcmVmb3gtJHtidWlsZElkfS5lbi1VUy4ke3BsYXRmb3JtfS14ODZfNjQudGFyLmJ6MmA7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiBgZmlyZWZveC0ke2J1aWxkSWR9LmVuLVVTLm1hYy5kbWdgO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gYGZpcmVmb3gtJHtidWlsZElkfS5lbi1VUy4ke3BsYXRmb3JtfS56aXBgO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFyY2hpdmUocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuIGBmaXJlZm94LSR7YnVpbGRJZH0udGFyLmJ6MmA7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiBgRmlyZWZveCAke2J1aWxkSWR9LmRtZ2A7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiBgRmlyZWZveCBTZXR1cCAke2J1aWxkSWR9LmV4ZWA7XG4gICAgfVxufVxuZnVuY3Rpb24gcGxhdGZvcm1OYW1lKHBsYXRmb3JtKSB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgIHJldHVybiBgbGludXgteDg2XzY0YDtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDX0FSTTpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICAgICAgcmV0dXJuIGBtYWNgO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gcGxhdGZvcm07XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VCdWlsZElkKGJ1aWxkSWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMoRmlyZWZveENoYW5uZWwpKSB7XG4gICAgICAgIGlmIChidWlsZElkLnN0YXJ0c1dpdGgodmFsdWUgKyAnXycpKSB7XG4gICAgICAgICAgICBidWlsZElkID0gYnVpbGRJZC5zdWJzdHJpbmcodmFsdWUubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICByZXR1cm4gW3ZhbHVlLCBidWlsZElkXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBkbyBub3QgaGF2ZSBjaGFubmVsIGFzIHRoZSBwcmVmaXguwqtcbiAgICByZXR1cm4gW0ZpcmVmb3hDaGFubmVsLk5JR0hUTFksIGJ1aWxkSWRdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFVybChwbGF0Zm9ybSwgYnVpbGRJZCwgYmFzZVVybCkge1xuICAgIGNvbnN0IFtjaGFubmVsLCByZXNvbHZlZEJ1aWxkSWRdID0gcGFyc2VCdWlsZElkKGJ1aWxkSWQpO1xuICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLk5JR0hUTFk6XG4gICAgICAgICAgICBiYXNlVXJsID8/PVxuICAgICAgICAgICAgICAgICdodHRwczovL2FyY2hpdmUubW96aWxsYS5vcmcvcHViL2ZpcmVmb3gvbmlnaHRseS9sYXRlc3QtbW96aWxsYS1jZW50cmFsJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkRFVkVESVRJT046XG4gICAgICAgICAgICBiYXNlVXJsID8/PSAnaHR0cHM6Ly9hcmNoaXZlLm1vemlsbGEub3JnL3B1Yi9kZXZlZGl0aW9uL3JlbGVhc2VzJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkJFVEE6XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuU1RBQkxFOlxuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkVTUjpcbiAgICAgICAgICAgIGJhc2VVcmwgPz89ICdodHRwczovL2FyY2hpdmUubW96aWxsYS5vcmcvcHViL2ZpcmVmb3gvcmVsZWFzZXMnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLk5JR0hUTFk6XG4gICAgICAgICAgICByZXR1cm4gYCR7YmFzZVVybH0vJHtyZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCByZXNvbHZlZEJ1aWxkSWQpLmpvaW4oJy8nKX1gO1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkRFVkVESVRJT046XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuQkVUQTpcbiAgICAgICAgY2FzZSBGaXJlZm94Q2hhbm5lbC5TVEFCTEU6XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuRVNSOlxuICAgICAgICAgICAgcmV0dXJuIGAke2Jhc2VVcmx9LyR7cmVzb2x2ZWRCdWlsZElkfS8ke3BsYXRmb3JtTmFtZShwbGF0Zm9ybSl9L2VuLVVTLyR7YXJjaGl2ZShwbGF0Zm9ybSwgcmVzb2x2ZWRCdWlsZElkKX1gO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCBidWlsZElkKSB7XG4gICAgcmV0dXJuIFthcmNoaXZlTmlnaHRseShwbGF0Zm9ybSwgYnVpbGRJZCldO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICBjb25zdCBbY2hhbm5lbF0gPSBwYXJzZUJ1aWxkSWQoYnVpbGRJZCk7XG4gICAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuTklHSFRMWTpcbiAgICAgICAgICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignRmlyZWZveCBOaWdodGx5LmFwcCcsICdDb250ZW50cycsICdNYWNPUycsICdmaXJlZm94Jyk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2ZpcmVmb3gnLCAnZmlyZWZveCcpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdmaXJlZm94JywgJ2ZpcmVmb3guZXhlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuQkVUQTpcbiAgICAgICAgY2FzZSBGaXJlZm94Q2hhbm5lbC5ERVZFRElUSU9OOlxuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkVTUjpcbiAgICAgICAgY2FzZSBGaXJlZm94Q2hhbm5lbC5TVEFCTEU6XG4gICAgICAgICAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDX0FSTTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ0ZpcmVmb3guYXBwJywgJ0NvbnRlbnRzJywgJ01hY09TJywgJ2ZpcmVmb3gnKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignZmlyZWZveCcsICdmaXJlZm94Jyk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lOMzI6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2NvcmUnLCAnZmlyZWZveC5leGUnKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgdmFyIEZpcmVmb3hDaGFubmVsO1xuKGZ1bmN0aW9uIChGaXJlZm94Q2hhbm5lbCkge1xuICAgIEZpcmVmb3hDaGFubmVsW1wiU1RBQkxFXCJdID0gXCJzdGFibGVcIjtcbiAgICBGaXJlZm94Q2hhbm5lbFtcIkVTUlwiXSA9IFwiZXNyXCI7XG4gICAgRmlyZWZveENoYW5uZWxbXCJERVZFRElUSU9OXCJdID0gXCJkZXZlZGl0aW9uXCI7XG4gICAgRmlyZWZveENoYW5uZWxbXCJCRVRBXCJdID0gXCJiZXRhXCI7XG4gICAgRmlyZWZveENoYW5uZWxbXCJOSUdIVExZXCJdID0gXCJuaWdodGx5XCI7XG59KShGaXJlZm94Q2hhbm5lbCB8fCAoRmlyZWZveENoYW5uZWwgPSB7fSkpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCdWlsZElkKGNoYW5uZWwgPSBGaXJlZm94Q2hhbm5lbC5OSUdIVExZKSB7XG4gICAgY29uc3QgY2hhbm5lbFRvVmVyc2lvbktleSA9IHtcbiAgICAgICAgW0ZpcmVmb3hDaGFubmVsLkVTUl06ICdGSVJFRk9YX0VTUicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5TVEFCTEVdOiAnTEFURVNUX0ZJUkVGT1hfVkVSU0lPTicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5ERVZFRElUSU9OXTogJ0ZJUkVGT1hfREVWRURJVElPTicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5CRVRBXTogJ0ZJUkVGT1hfREVWRURJVElPTicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5OSUdIVExZXTogJ0ZJUkVGT1hfTklHSFRMWScsXG4gICAgfTtcbiAgICBjb25zdCB2ZXJzaW9ucyA9IChhd2FpdCBnZXRKU09OKG5ldyBVUkwoJ2h0dHBzOi8vcHJvZHVjdC1kZXRhaWxzLm1vemlsbGEub3JnLzEuMC9maXJlZm94X3ZlcnNpb25zLmpzb24nKSkpO1xuICAgIGNvbnN0IHZlcnNpb24gPSB2ZXJzaW9uc1tjaGFubmVsVG9WZXJzaW9uS2V5W2NoYW5uZWxdXTtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGFubmVsICR7Y2hhbm5lbH0gaXMgbm90IGZvdW5kLmApO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbCArICdfJyArIHZlcnNpb247XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUHJvZmlsZShvcHRpb25zKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG9wdGlvbnMucGF0aCkpIHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIob3B0aW9ucy5wYXRoLCB7XG4gICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhd2FpdCB3cml0ZVByZWZlcmVuY2VzKHtcbiAgICAgICAgcHJlZmVyZW5jZXM6IHtcbiAgICAgICAgICAgIC4uLmRlZmF1bHRQcm9maWxlUHJlZmVyZW5jZXMob3B0aW9ucy5wcmVmZXJlbmNlcyksXG4gICAgICAgICAgICAuLi5vcHRpb25zLnByZWZlcmVuY2VzLFxuICAgICAgICB9LFxuICAgICAgICBwYXRoOiBvcHRpb25zLnBhdGgsXG4gICAgfSk7XG59XG5mdW5jdGlvbiBkZWZhdWx0UHJvZmlsZVByZWZlcmVuY2VzKGV4dHJhUHJlZnMpIHtcbiAgICBjb25zdCBzZXJ2ZXIgPSAnZHVtbXkudGVzdCc7XG4gICAgY29uc3QgZGVmYXVsdFByZWZzID0ge1xuICAgICAgICAvLyBNYWtlIHN1cmUgU2hpZWxkIGRvZXNuJ3QgaGl0IHRoZSBuZXR3b3JrLlxuICAgICAgICAnYXBwLm5vcm1hbmR5LmFwaV91cmwnOiAnJyxcbiAgICAgICAgLy8gRGlzYWJsZSBGaXJlZm94IG9sZCBidWlsZCBiYWNrZ3JvdW5kIGNoZWNrXG4gICAgICAgICdhcHAudXBkYXRlLmNoZWNrSW5zdGFsbFRpbWUnOiBmYWxzZSxcbiAgICAgICAgLy8gRGlzYWJsZSBhdXRvbWF0aWNhbGx5IHVwZ3JhZGluZyBGaXJlZm94XG4gICAgICAgICdhcHAudXBkYXRlLmRpc2FibGVkRm9yVGVzdGluZyc6IHRydWUsXG4gICAgICAgIC8vIEluY3JlYXNlIHRoZSBBUFogY29udGVudCByZXNwb25zZSB0aW1lb3V0IHRvIDEgbWludXRlXG4gICAgICAgICdhcHouY29udGVudF9yZXNwb25zZV90aW1lb3V0JzogNjAwMDAsXG4gICAgICAgIC8vIFByZXZlbnQgdmFyaW91cyBlcnJvciBtZXNzYWdlIG9uIHRoZSBjb25zb2xlXG4gICAgICAgIC8vIGplc3QtcHVwcGV0ZWVyIGFzc2VydHMgdGhhdCBubyBlcnJvciBtZXNzYWdlIGlzIGVtaXR0ZWQgYnkgdGhlIGNvbnNvbGVcbiAgICAgICAgJ2Jyb3dzZXIuY29udGVudGJsb2NraW5nLmZlYXR1cmVzLnN0YW5kYXJkJzogJy10cCx0cFByaXZhdGUsY29va2llQmVoYXZpb3IwLC1jbSwtZnAnLFxuICAgICAgICAvLyBFbmFibGUgdGhlIGR1bXAgZnVuY3Rpb246IHdoaWNoIHNlbmRzIG1lc3NhZ2VzIHRvIHRoZSBzeXN0ZW1cbiAgICAgICAgLy8gY29uc29sZVxuICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTQzMTE1XG4gICAgICAgICdicm93c2VyLmRvbS53aW5kb3cuZHVtcC5lbmFibGVkJzogdHJ1ZSxcbiAgICAgICAgLy8gRGlzYWJsZSB0b3BzdG9yaWVzXG4gICAgICAgICdicm93c2VyLm5ld3RhYnBhZ2UuYWN0aXZpdHktc3RyZWFtLmZlZWRzLnN5c3RlbS50b3BzdG9yaWVzJzogZmFsc2UsXG4gICAgICAgIC8vIEFsd2F5cyBkaXNwbGF5IGEgYmxhbmsgcGFnZVxuICAgICAgICAnYnJvd3Nlci5uZXd0YWJwYWdlLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gQmFja2dyb3VuZCB0aHVtYm5haWxzIGluIHBhcnRpY3VsYXIgY2F1c2UgZ3JpZWY6IGFuZCBkaXNhYmxpbmdcbiAgICAgICAgLy8gdGh1bWJuYWlscyBpbiBnZW5lcmFsIGNhbm5vdCBodXJ0XG4gICAgICAgICdicm93c2VyLnBhZ2V0aHVtYm5haWxzLmNhcHR1cmluZ19kaXNhYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIERpc2FibGUgc2FmZWJyb3dzaW5nIGNvbXBvbmVudHMuXG4gICAgICAgICdicm93c2VyLnNhZmVicm93c2luZy5ibG9ja2VkVVJJcy5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgICdicm93c2VyLnNhZmVicm93c2luZy5kb3dubG9hZHMuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAnYnJvd3Nlci5zYWZlYnJvd3NpbmcubWFsd2FyZS5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgICdicm93c2VyLnNhZmVicm93c2luZy5waGlzaGluZy5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgdXBkYXRlcyB0byBzZWFyY2ggZW5naW5lcy5cbiAgICAgICAgJ2Jyb3dzZXIuc2VhcmNoLnVwZGF0ZSc6IGZhbHNlLFxuICAgICAgICAvLyBEbyBub3QgcmVzdG9yZSB0aGUgbGFzdCBvcGVuIHNldCBvZiB0YWJzIGlmIHRoZSBicm93c2VyIGhhcyBjcmFzaGVkXG4gICAgICAgICdicm93c2VyLnNlc3Npb25zdG9yZS5yZXN1bWVfZnJvbV9jcmFzaCc6IGZhbHNlLFxuICAgICAgICAvLyBTa2lwIGNoZWNrIGZvciBkZWZhdWx0IGJyb3dzZXIgb24gc3RhcnR1cFxuICAgICAgICAnYnJvd3Nlci5zaGVsbC5jaGVja0RlZmF1bHRCcm93c2VyJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgbmV3dGFicGFnZVxuICAgICAgICAnYnJvd3Nlci5zdGFydHVwLmhvbWVwYWdlJzogJ2Fib3V0OmJsYW5rJyxcbiAgICAgICAgLy8gRG8gbm90IHJlZGlyZWN0IHVzZXIgd2hlbiBhIG1pbHN0b25lIHVwZ3JhZGUgb2YgRmlyZWZveCBpcyBkZXRlY3RlZFxuICAgICAgICAnYnJvd3Nlci5zdGFydHVwLmhvbWVwYWdlX292ZXJyaWRlLm1zdG9uZSc6ICdpZ25vcmUnLFxuICAgICAgICAvLyBTdGFydCB3aXRoIGEgYmxhbmsgcGFnZSBhYm91dDpibGFua1xuICAgICAgICAnYnJvd3Nlci5zdGFydHVwLnBhZ2UnOiAwLFxuICAgICAgICAvLyBEbyBub3QgYWxsb3cgYmFja2dyb3VuZCB0YWJzIHRvIGJlIHpvbWJpZmllZCBvbiBBbmRyb2lkOiBvdGhlcndpc2UgZm9yXG4gICAgICAgIC8vIHRlc3RzIHRoYXQgb3BlbiBhZGRpdGlvbmFsIHRhYnM6IHRoZSB0ZXN0IGhhcm5lc3MgdGFiIGl0c2VsZiBtaWdodCBnZXRcbiAgICAgICAgLy8gdW5sb2FkZWRcbiAgICAgICAgJ2Jyb3dzZXIudGFicy5kaXNhYmxlQmFja2dyb3VuZFpvbWJpZmljYXRpb24nOiBmYWxzZSxcbiAgICAgICAgLy8gRG8gbm90IHdhcm4gd2hlbiBjbG9zaW5nIGFsbCBvdGhlciBvcGVuIHRhYnNcbiAgICAgICAgJ2Jyb3dzZXIudGFicy53YXJuT25DbG9zZU90aGVyVGFicyc6IGZhbHNlLFxuICAgICAgICAvLyBEbyBub3Qgd2FybiB3aGVuIG11bHRpcGxlIHRhYnMgd2lsbCBiZSBvcGVuZWRcbiAgICAgICAgJ2Jyb3dzZXIudGFicy53YXJuT25PcGVuJzogZmFsc2UsXG4gICAgICAgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IG9mZmVyIHRyYW5zbGF0aW9ucywgYXMgdGVzdHMgZG8gbm90IGV4cGVjdCB0aGlzLlxuICAgICAgICAnYnJvd3Nlci50cmFuc2xhdGlvbnMuYXV0b21hdGljYWxseVBvcHVwJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgdGhlIFVJIHRvdXIuXG4gICAgICAgICdicm93c2VyLnVpdG91ci5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIFR1cm4gb2ZmIHNlYXJjaCBzdWdnZXN0aW9ucyBpbiB0aGUgbG9jYXRpb24gYmFyIHNvIGFzIG5vdCB0byB0cmlnZ2VyXG4gICAgICAgIC8vIG5ldHdvcmsgY29ubmVjdGlvbnMuXG4gICAgICAgICdicm93c2VyLnVybGJhci5zdWdnZXN0LnNlYXJjaGVzJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgZmlyc3QgcnVuIHNwbGFzaCBwYWdlIG9uIFdpbmRvd3MgMTBcbiAgICAgICAgJ2Jyb3dzZXIudXNlZE9uV2luZG93czEwLmludHJvVVJMJzogJycsXG4gICAgICAgIC8vIERvIG5vdCB3YXJuIG9uIHF1aXR0aW5nIEZpcmVmb3hcbiAgICAgICAgJ2Jyb3dzZXIud2Fybk9uUXVpdCc6IGZhbHNlLFxuICAgICAgICAvLyBEZWZlbnNpdmVseSBkaXNhYmxlIGRhdGEgcmVwb3J0aW5nIHN5c3RlbXNcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcuaGVhbHRocmVwb3J0LmRvY3VtZW50U2VydmVyVVJJJzogYGh0dHA6Ly8ke3NlcnZlcn0vZHVtbXkvaGVhbHRocmVwb3J0L2AsXG4gICAgICAgICdkYXRhcmVwb3J0aW5nLmhlYWx0aHJlcG9ydC5sb2dnaW5nLmNvbnNvbGVFbmFibGVkJzogZmFsc2UsXG4gICAgICAgICdkYXRhcmVwb3J0aW5nLmhlYWx0aHJlcG9ydC5zZXJ2aWNlLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcuaGVhbHRocmVwb3J0LnNlcnZpY2UuZmlyc3RSdW4nOiBmYWxzZSxcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcuaGVhbHRocmVwb3J0LnVwbG9hZEVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gRG8gbm90IHNob3cgZGF0YXJlcG9ydGluZyBwb2xpY3kgbm90aWZpY2F0aW9ucyB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggdGVzdHNcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcucG9saWN5LmRhdGFTdWJtaXNzaW9uRW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAnZGF0YXJlcG9ydGluZy5wb2xpY3kuZGF0YVN1Ym1pc3Npb25Qb2xpY3lCeXBhc3NOb3RpZmljYXRpb24nOiB0cnVlLFxuICAgICAgICAvLyBEZXZUb29scyBKU09OVmlld2VyIHNvbWV0aW1lcyBmYWlscyB0byBsb2FkIGRlcGVuZGVuY2llcyB3aXRoIGl0cyByZXF1aXJlLmpzLlxuICAgICAgICAvLyBUaGlzIGRvZXNuJ3QgYWZmZWN0IFB1cHBldGVlciBidXQgc3BhbXMgY29uc29sZSAoQnVnIDE0MjQzNzIpXG4gICAgICAgICdkZXZ0b29scy5qc29udmlldy5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgcG9wdXAtYmxvY2tlclxuICAgICAgICAnZG9tLmRpc2FibGVfb3Blbl9kdXJpbmdfbG9hZCc6IGZhbHNlLFxuICAgICAgICAvLyBFbmFibGUgdGhlIHN1cHBvcnQgZm9yIEZpbGUgb2JqZWN0IGNyZWF0aW9uIGluIHRoZSBjb250ZW50IHByb2Nlc3NcbiAgICAgICAgLy8gUmVxdWlyZWQgZm9yIHxQYWdlLnNldEZpbGVJbnB1dEZpbGVzfCBwcm90b2NvbCBtZXRob2QuXG4gICAgICAgICdkb20uZmlsZS5jcmVhdGVJbkNoaWxkJzogdHJ1ZSxcbiAgICAgICAgLy8gRGlzYWJsZSB0aGUgUHJvY2Vzc0hhbmdNb25pdG9yXG4gICAgICAgICdkb20uaXBjLnJlcG9ydFByb2Nlc3NIYW5ncyc6IGZhbHNlLFxuICAgICAgICAvLyBEaXNhYmxlIHNsb3cgc2NyaXB0IGRpYWxvZ3Vlc1xuICAgICAgICAnZG9tLm1heF9jaHJvbWVfc2NyaXB0X3J1bl90aW1lJzogMCxcbiAgICAgICAgJ2RvbS5tYXhfc2NyaXB0X3J1bl90aW1lJzogMCxcbiAgICAgICAgLy8gT25seSBsb2FkIGV4dGVuc2lvbnMgZnJvbSB0aGUgYXBwbGljYXRpb24gYW5kIHVzZXIgcHJvZmlsZVxuICAgICAgICAvLyBBZGRvbk1hbmFnZXIuU0NPUEVfUFJPRklMRSArIEFkZG9uTWFuYWdlci5TQ09QRV9BUFBMSUNBVElPTlxuICAgICAgICAnZXh0ZW5zaW9ucy5hdXRvRGlzYWJsZVNjb3Blcyc6IDAsXG4gICAgICAgICdleHRlbnNpb25zLmVuYWJsZWRTY29wZXMnOiA1LFxuICAgICAgICAvLyBEaXNhYmxlIG1ldGFkYXRhIGNhY2hpbmcgZm9yIGluc3RhbGxlZCBhZGQtb25zIGJ5IGRlZmF1bHRcbiAgICAgICAgJ2V4dGVuc2lvbnMuZ2V0QWRkb25zLmNhY2hlLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gRGlzYWJsZSBpbnN0YWxsaW5nIGFueSBkaXN0cmlidXRpb24gZXh0ZW5zaW9ucyBvciBhZGQtb25zLlxuICAgICAgICAnZXh0ZW5zaW9ucy5pbnN0YWxsRGlzdHJvQWRkb25zJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGVkIHNjcmVlbnNob3RzIGV4dGVuc2lvblxuICAgICAgICAnZXh0ZW5zaW9ucy5zY3JlZW5zaG90cy5kaXNhYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIFR1cm4gb2ZmIGV4dGVuc2lvbiB1cGRhdGVzIHNvIHRoZXkgZG8gbm90IGJvdGhlciB0ZXN0c1xuICAgICAgICAnZXh0ZW5zaW9ucy51cGRhdGUuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBUdXJuIG9mZiBleHRlbnNpb24gdXBkYXRlcyBzbyB0aGV5IGRvIG5vdCBib3RoZXIgdGVzdHNcbiAgICAgICAgJ2V4dGVuc2lvbnMudXBkYXRlLm5vdGlmeVVzZXInOiBmYWxzZSxcbiAgICAgICAgLy8gTWFrZSBzdXJlIG9wZW5pbmcgYWJvdXQ6YWRkb25zIHdpbGwgbm90IGhpdCB0aGUgbmV0d29ya1xuICAgICAgICAnZXh0ZW5zaW9ucy53ZWJzZXJ2aWNlLmRpc2NvdmVyVVJMJzogYGh0dHA6Ly8ke3NlcnZlcn0vZHVtbXkvZGlzY292ZXJ5VVJMYCxcbiAgICAgICAgLy8gQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGhhdmUgZm9jdXMgZXZlbiBpdCBydW5zIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICdmb2N1c21hbmFnZXIudGVzdG1vZGUnOiB0cnVlLFxuICAgICAgICAvLyBEaXNhYmxlIHVzZXJhZ2VudCB1cGRhdGVzXG4gICAgICAgICdnZW5lcmFsLnVzZXJhZ2VudC51cGRhdGVzLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gQWx3YXlzIHVzZSBuZXR3b3JrIHByb3ZpZGVyIGZvciBnZW9sb2NhdGlvbiB0ZXN0cyBzbyB3ZSBieXBhc3MgdGhlXG4gICAgICAgIC8vIG1hY09TIGRpYWxvZyByYWlzZWQgYnkgdGhlIGNvcmVsb2NhdGlvbiBwcm92aWRlclxuICAgICAgICAnZ2VvLnByb3ZpZGVyLnRlc3RpbmcnOiB0cnVlLFxuICAgICAgICAvLyBEbyBub3Qgc2NhbiBXaWZpXG4gICAgICAgICdnZW8ud2lmaS5zY2FuJzogZmFsc2UsXG4gICAgICAgIC8vIE5vIGhhbmcgbW9uaXRvclxuICAgICAgICAnaGFuZ21vbml0b3IudGltZW91dCc6IDAsXG4gICAgICAgIC8vIFNob3cgY2hyb21lIGVycm9ycyBhbmQgd2FybmluZ3MgaW4gdGhlIGVycm9yIGNvbnNvbGVcbiAgICAgICAgJ2phdmFzY3JpcHQub3B0aW9ucy5zaG93SW5Db25zb2xlJzogdHJ1ZSxcbiAgICAgICAgLy8gRGlzYWJsZSBkb3dubG9hZCBhbmQgdXNhZ2Ugb2YgT3BlbkgyNjQ6IGFuZCBXaWRldmluZSBwbHVnaW5zXG4gICAgICAgICdtZWRpYS5nbXAtbWFuYWdlci51cGRhdGVFbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgdGhlIEdGWCBzYW5pdHkgd2luZG93XG4gICAgICAgICdtZWRpYS5zYW5pdHktdGVzdC5kaXNhYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIERpc2FibGUgZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBOaWdodGx5XG4gICAgICAgICduZXR3b3JrLmNvb2tpZS5zYW1lU2l0ZS5sYXhCeURlZmF1bHQnOiBmYWxzZSxcbiAgICAgICAgLy8gRG8gbm90IHByb21wdCBmb3IgdGVtcG9yYXJ5IHJlZGlyZWN0c1xuICAgICAgICAnbmV0d29yay5odHRwLnByb21wdC10ZW1wLXJlZGlyZWN0JzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgc3BlY3VsYXRpdmUgY29ubmVjdGlvbnMgc28gdGhleSBhcmUgbm90IHJlcG9ydGVkIGFzIGxlYWtpbmdcbiAgICAgICAgLy8gd2hlbiB0aGV5IGFyZSBoYW5naW5nIGFyb3VuZFxuICAgICAgICAnbmV0d29yay5odHRwLnNwZWN1bGF0aXZlLXBhcmFsbGVsLWxpbWl0JzogMCxcbiAgICAgICAgLy8gRG8gbm90IGF1dG9tYXRpY2FsbHkgc3dpdGNoIGJldHdlZW4gb2ZmbGluZSBhbmQgb25saW5lXG4gICAgICAgICduZXR3b3JrLm1hbmFnZS1vZmZsaW5lLXN0YXR1cyc6IGZhbHNlLFxuICAgICAgICAvLyBNYWtlIHN1cmUgU05UUCByZXF1ZXN0cyBkbyBub3QgaGl0IHRoZSBuZXR3b3JrXG4gICAgICAgICduZXR3b3JrLnNudHAucG9vbHMnOiBzZXJ2ZXIsXG4gICAgICAgIC8vIERpc2FibGUgRmxhc2guXG4gICAgICAgICdwbHVnaW4uc3RhdGUuZmxhc2gnOiAwLFxuICAgICAgICAncHJpdmFjeS50cmFja2luZ3Byb3RlY3Rpb24uZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBDYW4gYmUgcmVtb3ZlZCBvbmNlIEZpcmVmb3ggODkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzEwODM5XG4gICAgICAgICdyZW1vdGUuZW5hYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIERvbid0IGRvIG5ldHdvcmsgY29ubmVjdGlvbnMgZm9yIG1pdG0gcHJpbWluZ1xuICAgICAgICAnc2VjdXJpdHkuY2VydGVycm9ycy5taXRtLnByaW1pbmcuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBMb2NhbCBkb2N1bWVudHMgaGF2ZSBhY2Nlc3MgdG8gYWxsIG90aGVyIGxvY2FsIGRvY3VtZW50cyxcbiAgICAgICAgLy8gaW5jbHVkaW5nIGRpcmVjdG9yeSBsaXN0aW5nc1xuICAgICAgICAnc2VjdXJpdHkuZmlsZXVyaS5zdHJpY3Rfb3JpZ2luX3BvbGljeSc6IGZhbHNlLFxuICAgICAgICAvLyBEbyBub3Qgd2FpdCBmb3IgdGhlIG5vdGlmaWNhdGlvbiBidXR0b24gc2VjdXJpdHkgZGVsYXlcbiAgICAgICAgJ3NlY3VyaXR5Lm5vdGlmaWNhdGlvbl9lbmFibGVfZGVsYXknOiAwLFxuICAgICAgICAvLyBFbnN1cmUgYmxvY2tsaXN0IHVwZGF0ZXMgZG8gbm90IGhpdCB0aGUgbmV0d29ya1xuICAgICAgICAnc2VydmljZXMuc2V0dGluZ3Muc2VydmVyJzogYGh0dHA6Ly8ke3NlcnZlcn0vZHVtbXkvYmxvY2tsaXN0L2AsXG4gICAgICAgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IGZpbGwgc2lnbi1pbiBmb3JtcyB3aXRoIGtub3duIHVzZXJuYW1lcyBhbmRcbiAgICAgICAgLy8gcGFzc3dvcmRzXG4gICAgICAgICdzaWdub24uYXV0b2ZpbGxGb3Jtcyc6IGZhbHNlLFxuICAgICAgICAvLyBEaXNhYmxlIHBhc3N3b3JkIGNhcHR1cmUsIHNvIHRoYXQgdGVzdHMgdGhhdCBpbmNsdWRlIGZvcm1zIGFyZSBub3RcbiAgICAgICAgLy8gaW5mbHVlbmNlZCBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIHBlcnNpc3RlbnQgZG9vcmhhbmdlciBub3RpZmljYXRpb25cbiAgICAgICAgJ3NpZ25vbi5yZW1lbWJlclNpZ25vbnMnOiBmYWxzZSxcbiAgICAgICAgLy8gRGlzYWJsZSBmaXJzdC1ydW4gd2VsY29tZSBwYWdlXG4gICAgICAgICdzdGFydHVwLmhvbWVwYWdlX3dlbGNvbWVfdXJsJzogJ2Fib3V0OmJsYW5rJyxcbiAgICAgICAgLy8gRGlzYWJsZSBmaXJzdC1ydW4gd2VsY29tZSBwYWdlXG4gICAgICAgICdzdGFydHVwLmhvbWVwYWdlX3dlbGNvbWVfdXJsLmFkZGl0aW9uYWwnOiAnJyxcbiAgICAgICAgLy8gRGlzYWJsZSBicm93c2VyIGFuaW1hdGlvbnMgKHRhYnMsIGZ1bGxzY3JlZW4sIHNsaWRpbmcgYWxlcnRzKVxuICAgICAgICAndG9vbGtpdC5jb3NtZXRpY0FuaW1hdGlvbnMuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBQcmV2ZW50IHN0YXJ0aW5nIGludG8gc2FmZSBtb2RlIGFmdGVyIGFwcGxpY2F0aW9uIGNyYXNoZXNcbiAgICAgICAgJ3Rvb2xraXQuc3RhcnR1cC5tYXhfcmVzdW1lZF9jcmFzaGVzJzogLTEsXG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihkZWZhdWx0UHJlZnMsIGV4dHJhUHJlZnMpO1xufVxuLyoqXG4gKiBQb3B1bGF0ZXMgdGhlIHVzZXIuanMgZmlsZSB3aXRoIGN1c3RvbSBwcmVmZXJlbmNlcyBhcyBuZWVkZWQgdG8gYWxsb3dcbiAqIEZpcmVmb3gncyBDRFAgc3VwcG9ydCB0byBwcm9wZXJseSBmdW5jdGlvbi4gVGhlc2UgcHJlZmVyZW5jZXMgd2lsbCBiZVxuICogYXV0b21hdGljYWxseSBjb3BpZWQgb3ZlciB0byBwcmVmcy5qcyBkdXJpbmcgc3RhcnR1cCBvZiBGaXJlZm94LiBUbyBiZVxuICogYWJsZSB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZXMgb2YgcHJlZmVyZW5jZXMgYSBiYWNrdXAgb2YgcHJlZnMuanNcbiAqIHdpbGwgYmUgY3JlYXRlZC5cbiAqXG4gKiBAcGFyYW0gcHJlZnMgLSBMaXN0IG9mIHByZWZlcmVuY2VzIHRvIGFkZC5cbiAqIEBwYXJhbSBwcm9maWxlUGF0aCAtIEZpcmVmb3ggcHJvZmlsZSB0byB3cml0ZSB0aGUgcHJlZmVyZW5jZXMgdG8uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUHJlZmVyZW5jZXMob3B0aW9ucykge1xuICAgIGNvbnN0IHByZWZzUGF0aCA9IHBhdGguam9pbihvcHRpb25zLnBhdGgsICdwcmVmcy5qcycpO1xuICAgIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucy5wcmVmZXJlbmNlcykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgcmV0dXJuIGB1c2VyX3ByZWYoJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9KTtgO1xuICAgIH0pO1xuICAgIC8vIFVzZSBhbGxTZXR0bGVkIHRvIHByZXZlbnQgY29ycnVwdGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ob3B0aW9ucy5wYXRoLCAndXNlci5qcycpLCBsaW5lcy5qb2luKCdcXG4nKSksXG4gICAgICAgIC8vIENyZWF0ZSBhIGJhY2t1cCBvZiB0aGUgcHJlZmVyZW5jZXMgZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXRzdHMuXG4gICAgICAgIGZzLnByb21pc2VzLmFjY2VzcyhwcmVmc1BhdGgsIGZzLmNvbnN0YW50cy5GX09LKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLmNvcHlGaWxlKHByZWZzUGF0aCwgcGF0aC5qb2luKG9wdGlvbnMucGF0aCwgJ3ByZWZzLmpzLnB1cHBldGVlcicpKTtcbiAgICAgICAgfSwgXG4gICAgICAgIC8vIFN3YWxsb3cgb25seSBpZiBmaWxlIGRvZXMgbm90IGV4aXN0XG4gICAgICAgICgpID0+IHsgfSksXG4gICAgXSk7XG4gICAgZm9yIChjb25zdCBjb21tYW5kIG9mIHJlc3VsdCkge1xuICAgICAgICBpZiAoY29tbWFuZC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIHRocm93IGNvbW1hbmQucmVhc29uO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhLCBiKSB7XG4gICAgLy8gVE9ETzogdGhpcyBpcyBhIG5vdCB2ZXJ5IHJlbGlhYmxlIGNoZWNrLlxuICAgIHJldHVybiBwYXJzZUludChhLnJlcGxhY2UoJy4nLCAnJyksIDE2KSAtIHBhcnNlSW50KGIucmVwbGFjZSgnLicsICcnKSwgMTYpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlyZWZveC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBTdXBwb3J0ZWQgYnJvd3NlcnMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIEJyb3dzZXI7XG4oZnVuY3Rpb24gKEJyb3dzZXIpIHtcbiAgICBCcm93c2VyW1wiQ0hST01FXCJdID0gXCJjaHJvbWVcIjtcbiAgICBCcm93c2VyW1wiQ0hST01FSEVBRExFU1NTSEVMTFwiXSA9IFwiY2hyb21lLWhlYWRsZXNzLXNoZWxsXCI7XG4gICAgQnJvd3NlcltcIkNIUk9NSVVNXCJdID0gXCJjaHJvbWl1bVwiO1xuICAgIEJyb3dzZXJbXCJGSVJFRk9YXCJdID0gXCJmaXJlZm94XCI7XG4gICAgQnJvd3NlcltcIkNIUk9NRURSSVZFUlwiXSA9IFwiY2hyb21lZHJpdmVyXCI7XG59KShCcm93c2VyIHx8IChCcm93c2VyID0ge30pKTtcbi8qKlxuICogUGxhdGZvcm0gbmFtZXMgdXNlZCB0byBpZGVudGlmeSBhIE9TIHBsYXRmb3JtIHggYXJjaGl0ZWN0dXJlIGNvbWJpbmF0aW9uIGluIHRoZSB3YXlcbiAqIHRoYXQgaXMgcmVsZXZhbnQgZm9yIHRoZSBicm93c2VyIGRvd25sb2FkLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBCcm93c2VyUGxhdGZvcm07XG4oZnVuY3Rpb24gKEJyb3dzZXJQbGF0Zm9ybSkge1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIkxJTlVYXCJdID0gXCJsaW51eFwiO1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIk1BQ1wiXSA9IFwibWFjXCI7XG4gICAgQnJvd3NlclBsYXRmb3JtW1wiTUFDX0FSTVwiXSA9IFwibWFjX2FybVwiO1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIldJTjMyXCJdID0gXCJ3aW4zMlwiO1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIldJTjY0XCJdID0gXCJ3aW42NFwiO1xufSkoQnJvd3NlclBsYXRmb3JtIHx8IChCcm93c2VyUGxhdGZvcm0gPSB7fSkpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgQnJvd3NlclRhZztcbihmdW5jdGlvbiAoQnJvd3NlclRhZykge1xuICAgIEJyb3dzZXJUYWdbXCJDQU5BUllcIl0gPSBcImNhbmFyeVwiO1xuICAgIEJyb3dzZXJUYWdbXCJOSUdIVExZXCJdID0gXCJuaWdodGx5XCI7XG4gICAgQnJvd3NlclRhZ1tcIkJFVEFcIl0gPSBcImJldGFcIjtcbiAgICBCcm93c2VyVGFnW1wiREVWXCJdID0gXCJkZXZcIjtcbiAgICBCcm93c2VyVGFnW1wiREVWRURJVElPTlwiXSA9IFwiZGV2ZWRpdGlvblwiO1xuICAgIEJyb3dzZXJUYWdbXCJTVEFCTEVcIl0gPSBcInN0YWJsZVwiO1xuICAgIEJyb3dzZXJUYWdbXCJFU1JcIl0gPSBcImVzclwiO1xuICAgIEJyb3dzZXJUYWdbXCJMQVRFU1RcIl0gPSBcImxhdGVzdFwiO1xufSkoQnJvd3NlclRhZyB8fCAoQnJvd3NlclRhZyA9IHt9KSk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBDaHJvbWVSZWxlYXNlQ2hhbm5lbDtcbihmdW5jdGlvbiAoQ2hyb21lUmVsZWFzZUNoYW5uZWwpIHtcbiAgICBDaHJvbWVSZWxlYXNlQ2hhbm5lbFtcIlNUQUJMRVwiXSA9IFwic3RhYmxlXCI7XG4gICAgQ2hyb21lUmVsZWFzZUNoYW5uZWxbXCJERVZcIl0gPSBcImRldlwiO1xuICAgIENocm9tZVJlbGVhc2VDaGFubmVsW1wiQ0FOQVJZXCJdID0gXCJjYW5hcnlcIjtcbiAgICBDaHJvbWVSZWxlYXNlQ2hhbm5lbFtcIkJFVEFcIl0gPSBcImJldGFcIjtcbn0pKENocm9tZVJlbGVhc2VDaGFubmVsIHx8IChDaHJvbWVSZWxlYXNlQ2hhbm5lbCA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmV4cG9ydCB7IGRlYnVnIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWJ1Zy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCB7IEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEJyb3dzZXJQbGF0Zm9ybSgpIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IG9zLnBsYXRmb3JtKCk7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlICdkYXJ3aW4nOlxuICAgICAgICAgICAgcmV0dXJuIG9zLmFyY2goKSA9PT0gJ2FybTY0J1xuICAgICAgICAgICAgICAgID8gQnJvd3NlclBsYXRmb3JtLk1BQ19BUk1cbiAgICAgICAgICAgICAgICA6IEJyb3dzZXJQbGF0Zm9ybS5NQUM7XG4gICAgICAgIGNhc2UgJ2xpbnV4JzpcbiAgICAgICAgICAgIHJldHVybiBCcm93c2VyUGxhdGZvcm0uTElOVVg7XG4gICAgICAgIGNhc2UgJ3dpbjMyJzpcbiAgICAgICAgICAgIHJldHVybiBvcy5hcmNoKCkgPT09ICd4NjQnIHx8XG4gICAgICAgICAgICAgICAgLy8gV2luZG93cyAxMSBmb3IgQVJNIHN1cHBvcnRzIHg2NCBlbXVsYXRpb25cbiAgICAgICAgICAgICAgICAob3MuYXJjaCgpID09PSAnYXJtNjQnICYmIGlzV2luZG93czExKG9zLnJlbGVhc2UoKSkpXG4gICAgICAgICAgICAgICAgPyBCcm93c2VyUGxhdGZvcm0uV0lONjRcbiAgICAgICAgICAgICAgICA6IEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLyoqXG4gKiBXaW5kb3dzIDExIGlzIGlkZW50aWZpZWQgYnkgdGhlIHZlcnNpb24gMTAuMC4yMjAwMCBvciBncmVhdGVyXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gaXNXaW5kb3dzMTEodmVyc2lvbikge1xuICAgIGNvbnN0IHBhcnRzID0gdmVyc2lvbi5zcGxpdCgnLicpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgIGNvbnN0IG1ham9yID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcbiAgICAgICAgY29uc3QgbWlub3IgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApO1xuICAgICAgICBjb25zdCBwYXRjaCA9IHBhcnNlSW50KHBhcnRzWzJdLCAxMCk7XG4gICAgICAgIHJldHVybiAobWFqb3IgPiAxMCB8fFxuICAgICAgICAgICAgKG1ham9yID09PSAxMCAmJiBtaW5vciA+IDApIHx8XG4gICAgICAgICAgICAobWFqb3IgPT09IDEwICYmIG1pbm9yID09PSAwICYmIHBhdGNoID49IDIyMDAwKSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRldGVjdFBsYXRmb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBleGVjIGFzIGV4ZWNDaGlsZFByb2Nlc3MsIHNwYXduU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyIH0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IGV4dHJhY3RaaXAgZnJvbSAnZXh0cmFjdC16aXAnO1xuaW1wb3J0IHRhciBmcm9tICd0YXItZnMnO1xuaW1wb3J0IGJ6aXAgZnJvbSAndW5iemlwMi1zdHJlYW0nO1xuY29uc3QgZXhlYyA9IHByb21pc2lmeShleGVjQ2hpbGRQcm9jZXNzKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bnBhY2tBcmNoaXZlKGFyY2hpdmVQYXRoLCBmb2xkZXJQYXRoKSB7XG4gICAgaWYgKGFyY2hpdmVQYXRoLmVuZHNXaXRoKCcuemlwJykpIHtcbiAgICAgICAgYXdhaXQgZXh0cmFjdFppcChhcmNoaXZlUGF0aCwgeyBkaXI6IGZvbGRlclBhdGggfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyY2hpdmVQYXRoLmVuZHNXaXRoKCcudGFyLmJ6MicpKSB7XG4gICAgICAgIGF3YWl0IGV4dHJhY3RUYXIoYXJjaGl2ZVBhdGgsIGZvbGRlclBhdGgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmNoaXZlUGF0aC5lbmRzV2l0aCgnLmRtZycpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGZvbGRlclBhdGgpO1xuICAgICAgICBhd2FpdCBpbnN0YWxsRE1HKGFyY2hpdmVQYXRoLCBmb2xkZXJQYXRoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJjaGl2ZVBhdGguZW5kc1dpdGgoJy5leGUnKSkge1xuICAgICAgICAvLyBGaXJlZm94IG9uIFdpbmRvd3MuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhhcmNoaXZlUGF0aCwgW2AvRXh0cmFjdERpcj0ke2ZvbGRlclBhdGh9YF0sIHtcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgIF9fY29tcGF0X2xheWVyOiAnUnVuQXNJbnZva2VyJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCAke2FyY2hpdmVQYXRofSB0byAke2ZvbGRlclBhdGh9OiAke3Jlc3VsdC5vdXRwdXR9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgYXJjaGl2ZSBmb3JtYXQ6ICR7YXJjaGl2ZVBhdGh9YCk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFRhcih0YXJQYXRoLCBmb2xkZXJQYXRoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChmdWxmaWxsLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdGFyU3RyZWFtID0gdGFyLmV4dHJhY3QoZm9sZGVyUGF0aCk7XG4gICAgICAgIHRhclN0cmVhbS5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgICB0YXJTdHJlYW0ub24oJ2ZpbmlzaCcsIGZ1bGZpbGwpO1xuICAgICAgICBjb25zdCByZWFkU3RyZWFtID0gY3JlYXRlUmVhZFN0cmVhbSh0YXJQYXRoKTtcbiAgICAgICAgcmVhZFN0cmVhbS5waXBlKGJ6aXAoKSkucGlwZSh0YXJTdHJlYW0pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbERNRyhkbWdQYXRoLCBmb2xkZXJQYXRoKSB7XG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWMoYGhkaXV0aWwgYXR0YWNoIC1ub2Jyb3dzZSAtbm9hdXRvb3BlbiBcIiR7ZG1nUGF0aH1cImApO1xuICAgIGNvbnN0IHZvbHVtZXMgPSBzdGRvdXQubWF0Y2goL1xcL1ZvbHVtZXNcXC8oLiopL20pO1xuICAgIGlmICghdm9sdW1lcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHZvbHVtZSBwYXRoIGluICR7c3Rkb3V0fWApO1xuICAgIH1cbiAgICBjb25zdCBtb3VudFBhdGggPSB2b2x1bWVzWzBdO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIobW91bnRQYXRoKTtcbiAgICAgICAgY29uc3QgYXBwTmFtZSA9IGZpbGVOYW1lcy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyAmJiBpdGVtLmVuZHNXaXRoKCcuYXBwJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWFwcE5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgYXBwIGluICR7bW91bnRQYXRofWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vdW50ZWRQYXRoID0gcGF0aC5qb2luKG1vdW50UGF0aCwgYXBwTmFtZSk7XG4gICAgICAgIGF3YWl0IGV4ZWMoYGNwIC1SIFwiJHttb3VudGVkUGF0aH1cIiBcIiR7Zm9sZGVyUGF0aH1cImApO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgZXhlYyhgaGRpdXRpbCBkZXRhY2ggXCIke21vdW50UGF0aH1cIiAtcXVpZXRgKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxlVXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgY3JlYXRlV3JpdGVTdHJlYW0gfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IHsgVVJMLCB1cmxUb0h0dHBPcHRpb25zIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IFByb3h5QWdlbnQgfSBmcm9tICdwcm94eS1hZ2VudCc7XG5leHBvcnQgZnVuY3Rpb24gaGVhZEh0dHBSZXF1ZXN0KHVybCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGh0dHBSZXF1ZXN0KHVybCwgJ0hFQUQnLCByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAvLyBjb25zdW1lIHJlc3BvbnNlIGRhdGEgZnJlZSBub2RlIHByb2Nlc3NcbiAgICAgICAgICAgIHJlc3BvbnNlLnJlc3VtZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5zdGF0dXNDb2RlID09PSAyMDApO1xuICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgIHJlcXVlc3Qub24oJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgbWV0aG9kLCByZXNwb25zZSwga2VlcEFsaXZlID0gdHJ1ZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHByb3RvY29sOiB1cmwucHJvdG9jb2wsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIHBvcnQ6IHVybC5wb3J0LFxuICAgICAgICBwYXRoOiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGtlZXBBbGl2ZSA/IHsgQ29ubmVjdGlvbjogJ2tlZXAtYWxpdmUnIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIGF1dGg6IHVybFRvSHR0cE9wdGlvbnModXJsKS5hdXRoLFxuICAgICAgICBhZ2VudDogbmV3IFByb3h5QWdlbnQoKSxcbiAgICB9O1xuICAgIGNvbnN0IHJlcXVlc3RDYWxsYmFjayA9IChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlICYmXG4gICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA+PSAzMDAgJiZcbiAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlIDwgNDAwICYmXG4gICAgICAgICAgICByZXMuaGVhZGVycy5sb2NhdGlvbikge1xuICAgICAgICAgICAgaHR0cFJlcXVlc3QobmV3IFVSTChyZXMuaGVhZGVycy5sb2NhdGlvbiksIG1ldGhvZCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgLy8gY29uc3VtZSByZXNwb25zZSBkYXRhIHRvIGZyZWUgdXAgbWVtb3J5XG4gICAgICAgICAgICAvLyBBbmQgcHJldmVudHMgdGhlIGNvbm5lY3Rpb24gZnJvbSBiZWluZyBrZXB0IGFsaXZlXG4gICAgICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZShyZXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCByZXF1ZXN0ID0gb3B0aW9ucy5wcm90b2NvbCA9PT0gJ2h0dHBzOidcbiAgICAgICAgPyBodHRwcy5yZXF1ZXN0KG9wdGlvbnMsIHJlcXVlc3RDYWxsYmFjaylcbiAgICAgICAgOiBodHRwLnJlcXVlc3Qob3B0aW9ucywgcmVxdWVzdENhbGxiYWNrKTtcbiAgICByZXF1ZXN0LmVuZCgpO1xuICAgIHJldHVybiByZXF1ZXN0O1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkRmlsZSh1cmwsIGRlc3RpbmF0aW9uUGF0aCwgcHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBkb3dubG9hZGVkQnl0ZXMgPSAwO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGZ1bmN0aW9uIG9uRGF0YShjaHVuaykge1xuICAgICAgICAgICAgZG93bmxvYWRlZEJ5dGVzICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIHByb2dyZXNzQ2FsbGJhY2soZG93bmxvYWRlZEJ5dGVzLCB0b3RhbEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gaHR0cFJlcXVlc3QodXJsLCAnR0VUJywgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBEb3dubG9hZCBmYWlsZWQ6IHNlcnZlciByZXR1cm5lZCBjb2RlICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX0uIFVSTDogJHt1cmx9YCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3VtZSByZXNwb25zZSBkYXRhIHRvIGZyZWUgdXAgbWVtb3J5XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gY3JlYXRlV3JpdGVTdHJlYW0oZGVzdGluYXRpb25QYXRoKTtcbiAgICAgICAgICAgIGZpbGUub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaWxlLm9uKCdlcnJvcicsIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzcG9uc2UucGlwZShmaWxlKTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMgPSBwYXJzZUludChyZXNwb25zZS5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddLCAxMCk7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgb25EYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlcXVlc3Qub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IGdldFRleHQodXJsKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBwYXJzZSBKU09OIGZyb20gJyArIHVybC50b1N0cmluZygpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dCh1cmwpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gaHR0cFJlcXVlc3QodXJsLCAnR0VUJywgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSAnJztcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYEdvdCBzdGF0dXMgY29kZSAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgICAgICAgICAgICAgZGF0YSArPSBjaHVuaztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzcG9uc2Uub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShTdHJpbmcoZGF0YSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdDaHJvbWUgdmVyc2lvbiBub3QgZm91bmQnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgcmVxdWVzdC5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cFV0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBta2RpciwgdW5saW5rIH0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQnJvd3NlciwgQnJvd3NlclBsYXRmb3JtLCBkb3dubG9hZFVybHMsIH0gZnJvbSAnLi9icm93c2VyLWRhdGEvYnJvd3Nlci1kYXRhLmpzJztcbmltcG9ydCB7IENhY2hlLCBJbnN0YWxsZWRCcm93c2VyIH0gZnJvbSAnLi9DYWNoZS5qcyc7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4vZGVidWcuanMnO1xuaW1wb3J0IHsgZGV0ZWN0QnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi9kZXRlY3RQbGF0Zm9ybS5qcyc7XG5pbXBvcnQgeyB1bnBhY2tBcmNoaXZlIH0gZnJvbSAnLi9maWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb3dubG9hZEZpbGUsIGdldEpTT04sIGhlYWRIdHRwUmVxdWVzdCB9IGZyb20gJy4vaHR0cFV0aWwuanMnO1xuY29uc3QgZGVidWdJbnN0YWxsID0gZGVidWcoJ3B1cHBldGVlcjpicm93c2VyczppbnN0YWxsJyk7XG5jb25zdCB0aW1lcyA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIGRlYnVnVGltZShsYWJlbCkge1xuICAgIHRpbWVzLnNldChsYWJlbCwgcHJvY2Vzcy5ocnRpbWUoKSk7XG59XG5mdW5jdGlvbiBkZWJ1Z1RpbWVFbmQobGFiZWwpIHtcbiAgICBjb25zdCBlbmQgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGltZXMuZ2V0KGxhYmVsKTtcbiAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb24gPSBlbmRbMF0gKiAxMDAwICsgZW5kWzFdIC8gMWU2IC0gKHN0YXJ0WzBdICogMTAwMCArIHN0YXJ0WzFdIC8gMWU2KTsgLy8gY2FsY3VsYXRlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICAgIGRlYnVnSW5zdGFsbChgRHVyYXRpb24gZm9yICR7bGFiZWx9OiAke2R1cmF0aW9ufW1zYCk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbChvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgb3B0aW9ucy51bnBhY2sgPz89IHRydWU7XG4gICAgaWYgKCFvcHRpb25zLnBsYXRmb3JtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRvd25sb2FkIGEgYmluYXJ5IGZvciB0aGUgcHJvdmlkZWQgcGxhdGZvcm06ICR7b3MucGxhdGZvcm0oKX0gKCR7b3MuYXJjaCgpfSlgKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gZ2V0RG93bmxvYWRVcmwob3B0aW9ucy5icm93c2VyLCBvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQsIG9wdGlvbnMuYmFzZVVybCk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGluc3RhbGxVcmwodXJsLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBJZiBjdXN0b20gYmFzZVVybCBpcyBwcm92aWRlZCwgZG8gbm90IGZhbGwgYmFjayB0byBDZlQgZGFzaGJvYXJkLlxuICAgICAgICBpZiAob3B0aW9ucy5iYXNlVXJsICYmICFvcHRpb25zLmZvcmNlRmFsbGJhY2tGb3JUZXN0aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbnN0YWxsKGBFcnJvciBkb3dubG9hZGluZyBmcm9tICR7dXJsfS5gKTtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLmJyb3dzZXIpIHtcbiAgICAgICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUU6XG4gICAgICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FRFJJVkVSOlxuICAgICAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NRUhFQURMRVNTU0hFTEw6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0luc3RhbGwoYFRyeWluZyB0byBmaW5kIGRvd25sb2FkIFVSTCB2aWEgaHR0cHM6Ly9nb29nbGVjaHJvbWVsYWJzLmdpdGh1Yi5pby9jaHJvbWUtZm9yLXRlc3RpbmcuYCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IChhd2FpdCBnZXRKU09OKG5ldyBVUkwoYGh0dHBzOi8vZ29vZ2xlY2hyb21lbGFicy5naXRodWIuaW8vY2hyb21lLWZvci10ZXN0aW5nLyR7b3B0aW9ucy5idWlsZElkfS5qc29uYCkpKTtcbiAgICAgICAgICAgICAgICBsZXQgcGxhdGZvcm0gPSAnJztcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMucGxhdGZvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSA9ICdsaW51eDY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0gPSAnbWFjLWFybTY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSA9ICdtYWMteDY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3dpbjMyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3dpbjY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB2ZXJzaW9uLmRvd25sb2Fkc1tvcHRpb25zLmJyb3dzZXJdPy5maW5kKGxpbmsgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGlua1sncGxhdGZvcm0nXSA9PT0gcGxhdGZvcm07XG4gICAgICAgICAgICAgICAgfSk/LnVybDtcbiAgICAgICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnSW5zdGFsbChgRmFsbGluZyBiYWNrIHRvIGRvd25sb2FkaW5nIGZyb20gJHt1cmx9LmApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgaW5zdGFsbFVybChuZXcgVVJMKHVybCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbGxVcmwodXJsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgaWYgKCFvcHRpb25zLnBsYXRmb3JtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRvd25sb2FkIGEgYmluYXJ5IGZvciB0aGUgcHJvdmlkZWQgcGxhdGZvcm06ICR7b3MucGxhdGZvcm0oKX0gKCR7b3MuYXJjaCgpfSlgKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWUgPSB1cmwudG9TdHJpbmcoKS5zcGxpdCgnLycpLnBvcCgpO1xuICAgIGFzc2VydChmaWxlTmFtZSwgYEEgbWFsZm9ybWVkIGRvd25sb2FkIFVSTCB3YXMgZm91bmQ6ICR7dXJsfS5gKTtcbiAgICBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZShvcHRpb25zLmNhY2hlRGlyKTtcbiAgICBjb25zdCBicm93c2VyUm9vdCA9IGNhY2hlLmJyb3dzZXJSb290KG9wdGlvbnMuYnJvd3Nlcik7XG4gICAgY29uc3QgYXJjaGl2ZVBhdGggPSBwYXRoLmpvaW4oYnJvd3NlclJvb3QsIGAke29wdGlvbnMuYnVpbGRJZH0tJHtmaWxlTmFtZX1gKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoYnJvd3NlclJvb3QpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGJyb3dzZXJSb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLnVucGFjaykge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhhcmNoaXZlUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmNoaXZlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1Z0luc3RhbGwoYERvd25sb2FkaW5nIGJpbmFyeSBmcm9tICR7dXJsfWApO1xuICAgICAgICBkZWJ1Z1RpbWUoJ2Rvd25sb2FkJyk7XG4gICAgICAgIGF3YWl0IGRvd25sb2FkRmlsZSh1cmwsIGFyY2hpdmVQYXRoLCBvcHRpb25zLmRvd25sb2FkUHJvZ3Jlc3NDYWxsYmFjayk7XG4gICAgICAgIGRlYnVnVGltZUVuZCgnZG93bmxvYWQnKTtcbiAgICAgICAgcmV0dXJuIGFyY2hpdmVQYXRoO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRQYXRoID0gY2FjaGUuaW5zdGFsbGF0aW9uRGlyKG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5wbGF0Zm9ybSwgb3B0aW9ucy5idWlsZElkKTtcbiAgICB0cnkge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhvdXRwdXRQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFsbGVkQnJvd3NlciA9IG5ldyBJbnN0YWxsZWRCcm93c2VyKGNhY2hlLCBvcHRpb25zLmJyb3dzZXIsIG9wdGlvbnMuYnVpbGRJZCwgb3B0aW9ucy5wbGF0Zm9ybSk7XG4gICAgICAgICAgICBpZiAoIWV4aXN0c1N5bmMoaW5zdGFsbGVkQnJvd3Nlci5leGVjdXRhYmxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBicm93c2VyIGZvbGRlciAoJHtvdXRwdXRQYXRofSkgZXhpc3RzIGJ1dCB0aGUgZXhlY3V0YWJsZSAoJHtpbnN0YWxsZWRCcm93c2VyLmV4ZWN1dGFibGVQYXRofSkgaXMgbWlzc2luZ2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxlZEJyb3dzZXI7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbnN0YWxsKGBEb3dubG9hZGluZyBiaW5hcnkgZnJvbSAke3VybH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlYnVnVGltZSgnZG93bmxvYWQnKTtcbiAgICAgICAgICAgIGF3YWl0IGRvd25sb2FkRmlsZSh1cmwsIGFyY2hpdmVQYXRoLCBvcHRpb25zLmRvd25sb2FkUHJvZ3Jlc3NDYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBkZWJ1Z1RpbWVFbmQoJ2Rvd25sb2FkJyk7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbnN0YWxsKGBJbnN0YWxsaW5nICR7YXJjaGl2ZVBhdGh9IHRvICR7b3V0cHV0UGF0aH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlYnVnVGltZSgnZXh0cmFjdCcpO1xuICAgICAgICAgICAgYXdhaXQgdW5wYWNrQXJjaGl2ZShhcmNoaXZlUGF0aCwgb3V0cHV0UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBkZWJ1Z1RpbWVFbmQoJ2V4dHJhY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnN0YWxsZWRCcm93c2VyID0gbmV3IEluc3RhbGxlZEJyb3dzZXIoY2FjaGUsIG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5idWlsZElkLCBvcHRpb25zLnBsYXRmb3JtKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYnVpbGRJZEFsaWFzKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGluc3RhbGxlZEJyb3dzZXIucmVhZE1ldGFkYXRhKCk7XG4gICAgICAgICAgICBtZXRhZGF0YS5hbGlhc2VzW29wdGlvbnMuYnVpbGRJZEFsaWFzXSA9IG9wdGlvbnMuYnVpbGRJZDtcbiAgICAgICAgICAgIGluc3RhbGxlZEJyb3dzZXIud3JpdGVNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbGxlZEJyb3dzZXI7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhhcmNoaXZlUGF0aCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHVubGluayhhcmNoaXZlUGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bmluc3RhbGwob3B0aW9ucykge1xuICAgIG9wdGlvbnMucGxhdGZvcm0gPz89IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSgpO1xuICAgIGlmICghb3B0aW9ucy5wbGF0Zm9ybSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkZXRlY3QgdGhlIGJyb3dzZXIgcGxhdGZvcm0gZm9yOiAke29zLnBsYXRmb3JtKCl9ICgke29zLmFyY2goKX0pYCk7XG4gICAgfVxuICAgIG5ldyBDYWNoZShvcHRpb25zLmNhY2hlRGlyKS51bmluc3RhbGwob3B0aW9ucy5icm93c2VyLCBvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQpO1xufVxuLyoqXG4gKiBSZXR1cm5zIG1ldGFkYXRhIGFib3V0IGJyb3dzZXJzIGluc3RhbGxlZCBpbiB0aGUgY2FjaGUgZGlyZWN0b3J5LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEluc3RhbGxlZEJyb3dzZXJzKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IENhY2hlKG9wdGlvbnMuY2FjaGVEaXIpLmdldEluc3RhbGxlZEJyb3dzZXJzKCk7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhbkRvd25sb2FkKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zLnBsYXRmb3JtID8/PSBkZXRlY3RCcm93c2VyUGxhdGZvcm0oKTtcbiAgICBpZiAoIW9wdGlvbnMucGxhdGZvcm0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZG93bmxvYWQgYSBiaW5hcnkgZm9yIHRoZSBwcm92aWRlZCBwbGF0Zm9ybTogJHtvcy5wbGF0Zm9ybSgpfSAoJHtvcy5hcmNoKCl9KWApO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgaGVhZEh0dHBSZXF1ZXN0KGdldERvd25sb2FkVXJsKG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5wbGF0Zm9ybSwgb3B0aW9ucy5idWlsZElkLCBvcHRpb25zLmJhc2VVcmwpKTtcbn1cbmZ1bmN0aW9uIGdldERvd25sb2FkVXJsKGJyb3dzZXIsIHBsYXRmb3JtLCBidWlsZElkLCBiYXNlVXJsKSB7XG4gICAgcmV0dXJuIG5ldyBVUkwoZG93bmxvYWRVcmxzW2Jyb3dzZXJdKHBsYXRmb3JtLCBidWlsZElkLCBiYXNlVXJsKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnN0YWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgYWNjZXNzU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcmVhZGxpbmUgZnJvbSAncmVhZGxpbmUnO1xuaW1wb3J0IHsgcmVzb2x2ZVN5c3RlbUV4ZWN1dGFibGVQYXRoLCB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG5pbXBvcnQgeyBDYWNoZSB9IGZyb20gJy4vQ2FjaGUuanMnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuL2RlYnVnLmpzJztcbmltcG9ydCB7IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vZGV0ZWN0UGxhdGZvcm0uanMnO1xuY29uc3QgZGVidWdMYXVuY2ggPSBkZWJ1ZygncHVwcGV0ZWVyOmJyb3dzZXJzOmxhdW5jaGVyJyk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVFeGVjdXRhYmxlUGF0aChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBDYWNoZShvcHRpb25zLmNhY2hlRGlyKS5jb21wdXRlRXhlY3V0YWJsZVBhdGgob3B0aW9ucyk7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTeXN0ZW1FeGVjdXRhYmxlUGF0aChvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgaWYgKCFvcHRpb25zLnBsYXRmb3JtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRvd25sb2FkIGEgYmluYXJ5IGZvciB0aGUgcHJvdmlkZWQgcGxhdGZvcm06ICR7b3MucGxhdGZvcm0oKX0gKCR7b3MuYXJjaCgpfSlgKTtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9IHJlc29sdmVTeXN0ZW1FeGVjdXRhYmxlUGF0aChvcHRpb25zLmJyb3dzZXIsIG9wdGlvbnMucGxhdGZvcm0sIG9wdGlvbnMuY2hhbm5lbCk7XG4gICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzU3luYyhwYXRoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgR29vZ2xlIENocm9tZSBleGVjdXRhYmxlIGZvciBjaGFubmVsICcke29wdGlvbnMuY2hhbm5lbH0nIGF0ICcke3BhdGh9Jy5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhdW5jaChvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9jZXNzKG9wdHMpO1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYID0gL15EZXZUb29scyBsaXN0ZW5pbmcgb24gKHdzOlxcL1xcLy4qKSQvO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBXRUJEUklWRVJfQklESV9XRUJTT0NLRVRfRU5EUE9JTlRfUkVHRVggPSAvXldlYkRyaXZlciBCaURpIGxpc3RlbmluZyBvbiAod3M6XFwvXFwvLiopJC87XG5jb25zdCBwcm9jZXNzTGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuY29uc3QgZGlzcGF0Y2hlcnMgPSB7XG4gICAgZXhpdDogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgcHJvY2Vzc0xpc3RlbmVycy5nZXQoJ2V4aXQnKT8uZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKC4uLmFyZ3MpO1xuICAgICAgICB9KTtcbiAgICB9LFxuICAgIFNJR0lOVDogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgcHJvY2Vzc0xpc3RlbmVycy5nZXQoJ1NJR0lOVCcpPy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIoLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgU0lHSFVQOiAoLi4uYXJncykgPT4ge1xuICAgICAgICBwcm9jZXNzTGlzdGVuZXJzLmdldCgnU0lHSFVQJyk/LmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlciguLi5hcmdzKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBTSUdURVJNOiAoLi4uYXJncykgPT4ge1xuICAgICAgICBwcm9jZXNzTGlzdGVuZXJzLmdldCgnU0lHVEVSTScpPy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIoLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH0sXG59O1xuZnVuY3Rpb24gc3Vic2NyaWJlVG9Qcm9jZXNzRXZlbnQoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBwcm9jZXNzTGlzdGVuZXJzLmdldChldmVudCkgfHwgW107XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHJvY2Vzcy5vbihldmVudCwgZGlzcGF0Y2hlcnNbZXZlbnRdKTtcbiAgICB9XG4gICAgbGlzdGVuZXJzLnB1c2goaGFuZGxlcik7XG4gICAgcHJvY2Vzc0xpc3RlbmVycy5zZXQoZXZlbnQsIGxpc3RlbmVycyk7XG59XG5mdW5jdGlvbiB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBwcm9jZXNzTGlzdGVuZXJzLmdldChldmVudCkgfHwgW107XG4gICAgY29uc3QgZXhpc3RpbmdMaXN0ZW5lcklkeCA9IGxpc3RlbmVycy5pbmRleE9mKGhhbmRsZXIpO1xuICAgIGlmIChleGlzdGluZ0xpc3RlbmVySWR4ID09PSAtMSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxpc3RlbmVycy5zcGxpY2UoZXhpc3RpbmdMaXN0ZW5lcklkeCwgMSk7XG4gICAgcHJvY2Vzc0xpc3RlbmVycy5zZXQoZXZlbnQsIGxpc3RlbmVycyk7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHJvY2Vzcy5vZmYoZXZlbnQsIGRpc3BhdGNoZXJzW2V2ZW50XSk7XG4gICAgfVxufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9jZXNzIHtcbiAgICAjZXhlY3V0YWJsZVBhdGg7XG4gICAgI2FyZ3M7XG4gICAgI2Jyb3dzZXJQcm9jZXNzO1xuICAgICNleGl0ZWQgPSBmYWxzZTtcbiAgICAvLyBUaGUgYnJvd3NlciBwcm9jZXNzIGNhbiBiZSBjbG9zZWQgZXh0ZXJuYWxseSBvciBmcm9tIHRoZSBkcml2ZXIgcHJvY2Vzcy4gV2VcbiAgICAvLyBuZWVkIHRvIGludm9rZSB0aGUgaG9va3Mgb25seSBvbmNlIHRob3VnaCBidXQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSB0aW1lc1xuICAgIC8vIHdlIHdpbGwgYmUgaW52b2tlZC5cbiAgICAjaG9va3NSYW4gPSBmYWxzZTtcbiAgICAjb25FeGl0SG9vayA9IGFzeW5jICgpID0+IHsgfTtcbiAgICAjYnJvd3NlclByb2Nlc3NFeGl0aW5nO1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgdGhpcy4jZXhlY3V0YWJsZVBhdGggPSBvcHRzLmV4ZWN1dGFibGVQYXRoO1xuICAgICAgICB0aGlzLiNhcmdzID0gb3B0cy5hcmdzID8/IFtdO1xuICAgICAgICBvcHRzLnBpcGUgPz89IGZhbHNlO1xuICAgICAgICBvcHRzLmR1bXBpbyA/Pz0gZmFsc2U7XG4gICAgICAgIG9wdHMuaGFuZGxlU0lHSU5UID8/PSB0cnVlO1xuICAgICAgICBvcHRzLmhhbmRsZVNJR1RFUk0gPz89IHRydWU7XG4gICAgICAgIG9wdHMuaGFuZGxlU0lHSFVQID8/PSB0cnVlO1xuICAgICAgICAvLyBPbiBub24td2luZG93cyBwbGF0Zm9ybXMsIGBkZXRhY2hlZDogdHJ1ZWAgbWFrZXMgY2hpbGQgcHJvY2VzcyBhXG4gICAgICAgIC8vIGxlYWRlciBvZiBhIG5ldyBwcm9jZXNzIGdyb3VwLCBtYWtpbmcgaXQgcG9zc2libGUgdG8ga2lsbCBjaGlsZFxuICAgICAgICAvLyBwcm9jZXNzIHRyZWUgd2l0aCBgLmtpbGwoLXBpZClgIGNvbW1hbmQuIEBzZWVcbiAgICAgICAgLy8gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9jaGlsZF9wcm9jZXNzLmh0bWwjY2hpbGRfcHJvY2Vzc19vcHRpb25zX2RldGFjaGVkXG4gICAgICAgIG9wdHMuZGV0YWNoZWQgPz89IHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMic7XG4gICAgICAgIGNvbnN0IHN0ZGlvID0gdGhpcy4jY29uZmlndXJlU3RkaW8oe1xuICAgICAgICAgICAgcGlwZTogb3B0cy5waXBlLFxuICAgICAgICAgICAgZHVtcGlvOiBvcHRzLmR1bXBpbyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVudiA9IG9wdHMuZW52IHx8IHt9O1xuICAgICAgICBkZWJ1Z0xhdW5jaChgTGF1bmNoaW5nICR7dGhpcy4jZXhlY3V0YWJsZVBhdGh9ICR7dGhpcy4jYXJncy5qb2luKCcgJyl9YCwge1xuICAgICAgICAgICAgZGV0YWNoZWQ6IG9wdHMuZGV0YWNoZWQsXG4gICAgICAgICAgICBlbnY6IE9iamVjdC5rZXlzKGVudikucmVkdWNlKChyZXMsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdwdXBwZXRlZXJfJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBlbnZba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH0sIHt9KSxcbiAgICAgICAgICAgIHN0ZGlvLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3MgPSBjaGlsZFByb2Nlc3Muc3Bhd24odGhpcy4jZXhlY3V0YWJsZVBhdGgsIHRoaXMuI2FyZ3MsIHtcbiAgICAgICAgICAgIGRldGFjaGVkOiBvcHRzLmRldGFjaGVkLFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgc3RkaW8sXG4gICAgICAgIH0pO1xuICAgICAgICBkZWJ1Z0xhdW5jaChgTGF1bmNoZWQgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9YCk7XG4gICAgICAgIGlmIChvcHRzLmR1bXBpbykge1xuICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Muc3RkZXJyPy5waXBlKHByb2Nlc3Muc3RkZXJyKTtcbiAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLnN0ZG91dD8ucGlwZShwcm9jZXNzLnN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICAgc3Vic2NyaWJlVG9Qcm9jZXNzRXZlbnQoJ2V4aXQnLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NFeGl0KTtcbiAgICAgICAgaWYgKG9wdHMuaGFuZGxlU0lHSU5UKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVUb1Byb2Nlc3NFdmVudCgnU0lHSU5UJywgdGhpcy4jb25Ecml2ZXJQcm9jZXNzU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5oYW5kbGVTSUdURVJNKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVUb1Byb2Nlc3NFdmVudCgnU0lHVEVSTScsIHRoaXMuI29uRHJpdmVyUHJvY2Vzc1NpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuaGFuZGxlU0lHSFVQKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVUb1Byb2Nlc3NFdmVudCgnU0lHSFVQJywgdGhpcy4jb25Ecml2ZXJQcm9jZXNzU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5vbkV4aXQpIHtcbiAgICAgICAgICAgIHRoaXMuI29uRXhpdEhvb2sgPSBvcHRzLm9uRXhpdDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNicm93c2VyUHJvY2Vzc0V4aXRpbmcgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNicm93c2VyUHJvY2Vzcy5vbmNlKCdleGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnTGF1bmNoKGBCcm93c2VyIHByb2Nlc3MgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9IG9uRXhpdGApO1xuICAgICAgICAgICAgICAgIHRoaXMuI2NsZWFyTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNydW5Ib29rcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgI3J1bkhvb2tzKCkge1xuICAgICAgICBpZiAodGhpcy4jaG9va3NSYW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNob29rc1JhbiA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuI29uRXhpdEhvb2soKTtcbiAgICB9XG4gICAgZ2V0IG5vZGVQcm9jZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlclByb2Nlc3M7XG4gICAgfVxuICAgICNjb25maWd1cmVTdGRpbyhvcHRzKSB7XG4gICAgICAgIGlmIChvcHRzLnBpcGUpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLmR1bXBpbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnLCAncGlwZScsICdwaXBlJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChvcHRzLmR1bXBpbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbJ3BpcGUnLCAncGlwZScsICdwaXBlJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWydwaXBlJywgJ2lnbm9yZScsICdwaXBlJ107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2NsZWFyTGlzdGVuZXJzKCkge1xuICAgICAgICB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoJ2V4aXQnLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NFeGl0KTtcbiAgICAgICAgdW5zdWJzY3JpYmVGcm9tUHJvY2Vzc0V2ZW50KCdTSUdJTlQnLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NTaWduYWwpO1xuICAgICAgICB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoJ1NJR1RFUk0nLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NTaWduYWwpO1xuICAgICAgICB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoJ1NJR0hVUCcsIHRoaXMuI29uRHJpdmVyUHJvY2Vzc1NpZ25hbCk7XG4gICAgfVxuICAgICNvbkRyaXZlclByb2Nlc3NFeGl0ID0gKF9jb2RlKSA9PiB7XG4gICAgICAgIHRoaXMua2lsbCgpO1xuICAgIH07XG4gICAgI29uRHJpdmVyUHJvY2Vzc1NpZ25hbCA9IChzaWduYWwpID0+IHtcbiAgICAgICAgc3dpdGNoIChzaWduYWwpIHtcbiAgICAgICAgICAgIGNhc2UgJ1NJR0lOVCc6XG4gICAgICAgICAgICAgICAgdGhpcy5raWxsKCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEzMCk7XG4gICAgICAgICAgICBjYXNlICdTSUdURVJNJzpcbiAgICAgICAgICAgIGNhc2UgJ1NJR0hVUCc6XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNydW5Ib29rcygpO1xuICAgICAgICBpZiAoIXRoaXMuI2V4aXRlZCkge1xuICAgICAgICAgICAgdGhpcy5raWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2Jyb3dzZXJQcm9jZXNzRXhpdGluZztcbiAgICB9XG4gICAgaGFzQ2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlclByb2Nlc3NFeGl0aW5nO1xuICAgIH1cbiAgICBraWxsKCkge1xuICAgICAgICBkZWJ1Z0xhdW5jaChgVHJ5aW5nIHRvIGtpbGwgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9YCk7XG4gICAgICAgIC8vIElmIHRoZSBwcm9jZXNzIGZhaWxlZCB0byBsYXVuY2ggKGZvciBleGFtcGxlIGlmIHRoZSBicm93c2VyIGV4ZWN1dGFibGUgcGF0aFxuICAgICAgICAvLyBpcyBpbnZhbGlkKSwgdGhlbiB0aGUgcHJvY2VzcyBkb2VzIG5vdCBnZXQgYSBwaWQgYXNzaWduZWQuIEEgY2FsbCB0b1xuICAgICAgICAvLyBgcHJvYy5raWxsYCB3b3VsZCBlcnJvciwgYXMgdGhlIGBwaWRgIHRvLWJlLWtpbGxlZCBjYW4gbm90IGJlIGZvdW5kLlxuICAgICAgICBpZiAodGhpcy4jYnJvd3NlclByb2Nlc3MgJiZcbiAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZCAmJlxuICAgICAgICAgICAgcGlkRXhpc3RzKHRoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGVidWdMYXVuY2goYEJyb3dzZXIgcHJvY2VzcyAke3RoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZH0gZXhpc3RzYCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkUHJvY2Vzcy5leGVjU3luYyhgdGFza2tpbGwgL3BpZCAke3RoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZH0gL1QgL0ZgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnTGF1bmNoKGBLaWxsaW5nICR7dGhpcy4jYnJvd3NlclByb2Nlc3MucGlkfSB1c2luZyB0YXNra2lsbCBmYWlsZWRgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXNra2lsbCBjYW4gZmFpbCB0byBraWxsIHRoZSBwcm9jZXNzIGUuZy4gZHVlIHRvIG1pc3NpbmcgcGVybWlzc2lvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyBraWxsIHRoZSBwcm9jZXNzIHZpYSBOb2RlIEFQSS4gVGhpcyBkZWxheXMga2lsbGluZyBvZiBhbGwgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlcyBvZiBgdGhpcy5wcm9jYCB1bnRpbCB0aGUgbWFpbiBOb2RlLmpzIHByb2Nlc3MgZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLmtpbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gbGludXggdGhlIHByb2Nlc3MgZ3JvdXAgY2FuIGJlIGtpbGxlZCB3aXRoIHRoZSBncm91cCBpZCBwcmVmaXhlZCB3aXRoXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgbWludXMgc2lnbi4gVGhlIHByb2Nlc3MgZ3JvdXAgaWQgaXMgdGhlIGdyb3VwIGxlYWRlcidzIHBpZC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0dyb3VwSWQgPSAtdGhpcy4jYnJvd3NlclByb2Nlc3MucGlkO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3NHcm91cElkLCAnU0lHS0lMTCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdMYXVuY2goYEtpbGxpbmcgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9IHVzaW5nIHByb2Nlc3Mua2lsbCBmYWlsZWRgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBLaWxsaW5nIHRoZSBwcm9jZXNzIGdyb3VwIGNhbiBmYWlsIGR1ZSBlLmcuIHRvIG1pc3NpbmcgcGVybWlzc2lvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyBraWxsIHRoZSBwcm9jZXNzIHZpYSBOb2RlIEFQSS4gVGhpcyBkZWxheXMga2lsbGluZyBvZiBhbGwgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlcyBvZiBgdGhpcy5wcm9jYCB1bnRpbCB0aGUgbWFpbiBOb2RlLmpzIHByb2Nlc3MgZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLmtpbGwoJ1NJR0tJTEwnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtQUk9DRVNTX0VSUk9SX0VYUExBTkFUSU9OfVxcbkVycm9yIGNhdXNlOiAke2lzRXJyb3JMaWtlKGVycm9yKSA/IGVycm9yLnN0YWNrIDogZXJyb3J9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2xlYXJMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgd2FpdEZvckxpbmVPdXRwdXQocmVnZXgsIHRpbWVvdXQgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy4jYnJvd3NlclByb2Nlc3Muc3RkZXJyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bicm93c2VyUHJvY2Vzc2AgZG9lcyBub3QgaGF2ZSBzdGRlcnIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UodGhpcy4jYnJvd3NlclByb2Nlc3Muc3RkZXJyKTtcbiAgICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmwub24oJ2xpbmUnLCBvbkxpbmUpO1xuICAgICAgICAgICAgcmwub24oJ2Nsb3NlJywgb25DbG9zZSk7XG4gICAgICAgICAgICB0aGlzLiNicm93c2VyUHJvY2Vzcy5vbignZXhpdCcsIG9uQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Mub24oJ2Vycm9yJywgb25DbG9zZSk7XG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSB0aW1lb3V0ID4gMCA/IHNldFRpbWVvdXQob25UaW1lb3V0LCB0aW1lb3V0KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmwub2ZmKCdsaW5lJywgb25MaW5lKTtcbiAgICAgICAgICAgICAgICBybC5vZmYoJ2Nsb3NlJywgb25DbG9zZSk7XG4gICAgICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Mub2ZmKCdleGl0Jywgb25DbG9zZSk7XG4gICAgICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Mub2ZmKCdlcnJvcicsIG9uQ2xvc2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG9uQ2xvc2UoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihbXG4gICAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gbGF1bmNoIHRoZSBicm93c2VyIHByb2Nlc3MhJHtlcnJvciA/ICcgJyArIGVycm9yLm1lc3NhZ2UgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAnVFJPVUJMRVNIT09USU5HOiBodHRwczovL3BwdHIuZGV2L3Ryb3VibGVzaG9vdGluZycsXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgIF0uam9pbignXFxuJykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUaW1lb3V0RXJyb3IoYFRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9IG1zIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBXUyBlbmRwb2ludCBVUkwgdG8gYXBwZWFyIGluIHN0ZG91dCFgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBvbkxpbmUobGluZSkge1xuICAgICAgICAgICAgICAgIHN0ZGVyciArPSBsaW5lICsgJ1xcbic7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSBSZWdFeHAgbWF0Y2hlcywgc28gdGhpcyB3aWxsIG9idmlvdXNseSBleGlzdC5cbiAgICAgICAgICAgICAgICByZXNvbHZlKG1hdGNoWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuY29uc3QgUFJPQ0VTU19FUlJPUl9FWFBMQU5BVElPTiA9IGBQdXBwZXRlZXIgd2FzIHVuYWJsZSB0byBraWxsIHRoZSBwcm9jZXNzIHdoaWNoIHJhbiB0aGUgYnJvd3NlciBiaW5hcnkuXG5UaGlzIG1lYW5zIHRoYXQsIG9uIGZ1dHVyZSBQdXBwZXRlZXIgbGF1bmNoZXMsIFB1cHBldGVlciBtaWdodCBub3QgYmUgYWJsZSB0byBsYXVuY2ggdGhlIGJyb3dzZXIuXG5QbGVhc2UgY2hlY2sgeW91ciBvcGVuIHByb2Nlc3NlcyBhbmQgZW5zdXJlIHRoYXQgdGhlIGJyb3dzZXIgcHJvY2Vzc2VzIHRoYXQgUHVwcGV0ZWVyIGxhdW5jaGVkIGhhdmUgYmVlbiBraWxsZWQuXG5JZiB5b3UgdGhpbmsgdGhpcyBpcyBhIGJ1ZywgcGxlYXNlIHJlcG9ydCBpdCBvbiB0aGUgUHVwcGV0ZWVyIGlzc3VlIHRyYWNrZXIuYDtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHBpZEV4aXN0cyhwaWQpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5raWxsKHBpZCwgMCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5jb2RlICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3JMaWtlKG9iaikge1xuICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsICYmICduYW1lJyBpbiBvYmogJiYgJ21lc3NhZ2UnIGluIG9iaik7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihvYmopIHtcbiAgICByZXR1cm4gKGlzRXJyb3JMaWtlKG9iaikgJiZcbiAgICAgICAgKCdlcnJubycgaW4gb2JqIHx8ICdjb2RlJyBpbiBvYmogfHwgJ3BhdGgnIGluIG9iaiB8fCAnc3lzY2FsbCcgaW4gb2JqKSk7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhdW5jaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHsgbGF1bmNoLCBjb21wdXRlRXhlY3V0YWJsZVBhdGgsIGNvbXB1dGVTeXN0ZW1FeGVjdXRhYmxlUGF0aCwgVGltZW91dEVycm9yLCBDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBXRUJEUklWRVJfQklESV9XRUJTT0NLRVRfRU5EUE9JTlRfUkVHRVgsIFByb2Nlc3MsIH0gZnJvbSAnLi9sYXVuY2guanMnO1xuZXhwb3J0IHsgaW5zdGFsbCwgZ2V0SW5zdGFsbGVkQnJvd3NlcnMsIGNhbkRvd25sb2FkLCB1bmluc3RhbGwsIH0gZnJvbSAnLi9pbnN0YWxsLmpzJztcbmV4cG9ydCB7IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vZGV0ZWN0UGxhdGZvcm0uanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUJ1aWxkSWQsIEJyb3dzZXIsIEJyb3dzZXJQbGF0Zm9ybSwgQ2hyb21lUmVsZWFzZUNoYW5uZWwsIGNyZWF0ZVByb2ZpbGUsIGdldFZlcnNpb25Db21wYXJhdG9yLCB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG5leHBvcnQgeyBDTEksIG1ha2VQcm9ncmVzc0NhbGxiYWNrIH0gZnJvbSAnLi9DTEkuanMnO1xuZXhwb3J0IHsgQ2FjaGUsIEluc3RhbGxlZEJyb3dzZXIgfSBmcm9tICcuL0NhY2hlLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1haW4uanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYWxpZ24gPSB7XG4gICAgcmlnaHQ6IGFsaWduUmlnaHQsXG4gICAgY2VudGVyOiBhbGlnbkNlbnRlclxufTtcbmNvbnN0IHRvcCA9IDA7XG5jb25zdCByaWdodCA9IDE7XG5jb25zdCBib3R0b20gPSAyO1xuY29uc3QgbGVmdCA9IDM7XG5leHBvcnQgY2xhc3MgVUkge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aDtcbiAgICAgICAgdGhpcy53cmFwID0gKF9hID0gb3B0cy53cmFwKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0cnVlO1xuICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICB9XG4gICAgc3BhbiguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLmRpdiguLi5hcmdzKTtcbiAgICAgICAgY29scy5zcGFuID0gdHJ1ZTtcbiAgICB9XG4gICAgcmVzZXRPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgIH1cbiAgICBkaXYoLi4uYXJncykge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGl2KCcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53cmFwICYmIHRoaXMuc2hvdWxkQXBwbHlMYXlvdXREU0woLi4uYXJncykgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxheW91dERTTChhcmdzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xzID0gYXJncy5tYXAoYXJnID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbEZyb21TdHJpbmcoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJvd3MucHVzaChjb2xzKTtcbiAgICAgICAgcmV0dXJuIGNvbHM7XG4gICAgfVxuICAgIHNob3VsZEFwcGx5TGF5b3V0RFNMKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgL1tcXHRcXG5dLy50ZXN0KGFyZ3NbMF0pO1xuICAgIH1cbiAgICBhcHBseUxheW91dERTTChzdHIpIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IHN0ci5zcGxpdCgnXFxuJykubWFwKHJvdyA9PiByb3cuc3BsaXQoJ1xcdCcpKTtcbiAgICAgICAgbGV0IGxlZnRDb2x1bW5XaWR0aCA9IDA7XG4gICAgICAgIC8vIHNpbXBsZSBoZXVyaXN0aWMgZm9yIGxheW91dCwgbWFrZSBzdXJlIHRoZVxuICAgICAgICAvLyBzZWNvbmQgY29sdW1uIGxpbmVzIHVwIGFsb25nIHRoZSBsZWZ0LWhhbmQuXG4gICAgICAgIC8vIGRvbid0IGFsbG93IHRoZSBmaXJzdCBjb2x1bW4gdG8gdGFrZSB1cCBtb3JlXG4gICAgICAgIC8vIHRoYW4gNTAlIG9mIHRoZSBzY3JlZW4uXG4gICAgICAgIHJvd3MuZm9yRWFjaChjb2x1bW5zID0+IHtcbiAgICAgICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA+IDEgJiYgbWl4aW4uc3RyaW5nV2lkdGgoY29sdW1uc1swXSkgPiBsZWZ0Q29sdW1uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsZWZ0Q29sdW1uV2lkdGggPSBNYXRoLm1pbihNYXRoLmZsb29yKHRoaXMud2lkdGggKiAwLjUpLCBtaXhpbi5zdHJpbmdXaWR0aChjb2x1bW5zWzBdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZW5lcmF0ZSBhIHRhYmxlOlxuICAgICAgICAvLyAgcmVwbGFjaW5nICcgJyB3aXRoIHBhZGRpbmcgY2FsY3VsYXRpb25zLlxuICAgICAgICAvLyAgdXNpbmcgdGhlIGFsZ29yaXRobWljYWxseSBnZW5lcmF0ZWQgd2lkdGguXG4gICAgICAgIHJvd3MuZm9yRWFjaChjb2x1bW5zID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGl2KC4uLmNvbHVtbnMubWFwKChyLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogci50cmltKCksXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IHRoaXMubWVhc3VyZVBhZGRpbmcociksXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAoaSA9PT0gMCAmJiBjb2x1bW5zLmxlbmd0aCA+IDEpID8gbGVmdENvbHVtbldpZHRoIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd3NbdGhpcy5yb3dzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBjb2xGcm9tU3RyaW5nKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICBwYWRkaW5nOiB0aGlzLm1lYXN1cmVQYWRkaW5nKHRleHQpXG4gICAgICAgIH07XG4gICAgfVxuICAgIG1lYXN1cmVQYWRkaW5nKHN0cikge1xuICAgICAgICAvLyBtZWFzdXJlIHBhZGRpbmcgd2l0aG91dCBhbnNpIGVzY2FwZSBjb2Rlc1xuICAgICAgICBjb25zdCBub0Fuc2kgPSBtaXhpbi5zdHJpcEFuc2koc3RyKTtcbiAgICAgICAgcmV0dXJuIFswLCBub0Fuc2kubWF0Y2goL1xccyokLylbMF0ubGVuZ3RoLCAwLCBub0Fuc2kubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoXTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgICAgIHRoaXMucm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvd1RvU3RyaW5nKHJvdywgbGluZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZG9uJ3QgZGlzcGxheSBhbnkgbGluZXMgd2l0aCB0aGVcbiAgICAgICAgLy8gaGlkZGVuIGZsYWcgc2V0LlxuICAgICAgICByZXR1cm4gbGluZXNcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiAhbGluZS5oaWRkZW4pXG4gICAgICAgICAgICAubWFwKGxpbmUgPT4gbGluZS50ZXh0KVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgICByb3dUb1N0cmluZyhyb3csIGxpbmVzKSB7XG4gICAgICAgIHRoaXMucmFzdGVyaXplKHJvdykuZm9yRWFjaCgocnJvdywgcikgPT4ge1xuICAgICAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICAgICAgcnJvdy5mb3JFYWNoKChjb2wsIGMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoIH0gPSByb3dbY107IC8vIHRoZSB3aWR0aCB3aXRoIHBhZGRpbmcuXG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcFdpZHRoID0gdGhpcy5uZWdhdGVQYWRkaW5nKHJvd1tjXSk7IC8vIHRoZSB3aWR0aCB3aXRob3V0IHBhZGRpbmcuXG4gICAgICAgICAgICAgICAgbGV0IHRzID0gY29sOyAvLyB0ZW1wb3Jhcnkgc3RyaW5nIHVzZWQgZHVyaW5nIGFsaWdubWVudC9wYWRkaW5nLlxuICAgICAgICAgICAgICAgIGlmICh3cmFwV2lkdGggPiBtaXhpbi5zdHJpbmdXaWR0aChjb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRzICs9ICcgJy5yZXBlYXQod3JhcFdpZHRoIC0gbWl4aW4uc3RyaW5nV2lkdGgoY29sKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFsaWduIHRoZSBzdHJpbmcgd2l0aGluIGl0cyBjb2x1bW4uXG4gICAgICAgICAgICAgICAgaWYgKHJvd1tjXS5hbGlnbiAmJiByb3dbY10uYWxpZ24gIT09ICdsZWZ0JyAmJiB0aGlzLndyYXApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm4gPSBhbGlnbltyb3dbY10uYWxpZ25dO1xuICAgICAgICAgICAgICAgICAgICB0cyA9IGZuKHRzLCB3cmFwV2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWl4aW4uc3RyaW5nV2lkdGgodHMpIDwgd3JhcFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cyArPSAnICcucmVwZWF0KCh3aWR0aCB8fCAwKSAtIG1peGluLnN0cmluZ1dpZHRoKHRzKSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFwcGx5IGJvcmRlciBhbmQgcGFkZGluZyB0byBzdHJpbmcuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHJvd1tjXS5wYWRkaW5nIHx8IFswLCAwLCAwLCAwXTtcbiAgICAgICAgICAgICAgICBpZiAocGFkZGluZ1tsZWZ0XSkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnLnJlcGVhdChwYWRkaW5nW2xlZnRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyICs9IGFkZEJvcmRlcihyb3dbY10sIHRzLCAnfCAnKTtcbiAgICAgICAgICAgICAgICBzdHIgKz0gdHM7XG4gICAgICAgICAgICAgICAgc3RyICs9IGFkZEJvcmRlcihyb3dbY10sIHRzLCAnIHwnKTtcbiAgICAgICAgICAgICAgICBpZiAocGFkZGluZ1tyaWdodF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJy5yZXBlYXQocGFkZGluZ1tyaWdodF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiBwcmlvciByb3cgaXMgc3BhbiwgdHJ5IHRvIHJlbmRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHJvdyBvbiB0aGUgcHJpb3IgbGluZS5cbiAgICAgICAgICAgICAgICBpZiAociA9PT0gMCAmJiBsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMucmVuZGVySW5saW5lKHN0ciwgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UuXG4gICAgICAgICAgICBsaW5lcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBzdHIucmVwbGFjZSgvICskLywgJycpLFxuICAgICAgICAgICAgICAgIHNwYW46IHJvdy5zcGFuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG4gICAgLy8gaWYgdGhlIGZ1bGwgJ3NvdXJjZScgY2FuIHJlbmRlciBpblxuICAgIC8vIHRoZSB0YXJnZXQgbGluZSwgZG8gc28uXG4gICAgcmVuZGVySW5saW5lKHNvdXJjZSwgcHJldmlvdXNMaW5lKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gc291cmNlLm1hdGNoKC9eICovKTtcbiAgICAgICAgY29uc3QgbGVhZGluZ1doaXRlc3BhY2UgPSBtYXRjaCA/IG1hdGNoWzBdLmxlbmd0aCA6IDA7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHByZXZpb3VzTGluZS50ZXh0O1xuICAgICAgICBjb25zdCB0YXJnZXRUZXh0V2lkdGggPSBtaXhpbi5zdHJpbmdXaWR0aCh0YXJnZXQudHJpbVJpZ2h0KCkpO1xuICAgICAgICBpZiAoIXByZXZpb3VzTGluZS5zcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBhcHBseWluZyB3cmFwcGluZyBsb2dpYyxcbiAgICAgICAgLy8ganVzdCBhbHdheXMgYXBwZW5kIHRvIHRoZSBzcGFuLlxuICAgICAgICBpZiAoIXRoaXMud3JhcCkge1xuICAgICAgICAgICAgcHJldmlvdXNMaW5lLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICsgc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZWFkaW5nV2hpdGVzcGFjZSA8IHRhcmdldFRleHRXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91c0xpbmUuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRhcmdldC50cmltUmlnaHQoKSArICcgJy5yZXBlYXQobGVhZGluZ1doaXRlc3BhY2UgLSB0YXJnZXRUZXh0V2lkdGgpICsgc291cmNlLnRyaW1MZWZ0KCk7XG4gICAgfVxuICAgIHJhc3Rlcml6ZShyb3cpIHtcbiAgICAgICAgY29uc3QgcnJvd3MgPSBbXTtcbiAgICAgICAgY29uc3Qgd2lkdGhzID0gdGhpcy5jb2x1bW5XaWR0aHMocm93KTtcbiAgICAgICAgbGV0IHdyYXBwZWQ7XG4gICAgICAgIC8vIHdvcmQgd3JhcCBhbGwgY29sdW1ucywgYW5kIGNyZWF0ZVxuICAgICAgICAvLyBhIGRhdGEtc3RydWN0dXJlIHRoYXQgaXMgZWFzeSB0byByYXN0ZXJpemUuXG4gICAgICAgIHJvdy5mb3JFYWNoKChjb2wsIGMpID0+IHtcbiAgICAgICAgICAgIC8vIGxlYXZlIHJvb20gZm9yIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcuXG4gICAgICAgICAgICBjb2wud2lkdGggPSB3aWR0aHNbY107XG4gICAgICAgICAgICBpZiAodGhpcy53cmFwKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZCA9IG1peGluLndyYXAoY29sLnRleHQsIHRoaXMubmVnYXRlUGFkZGluZyhjb2wpLCB7IGhhcmQ6IHRydWUgfSkuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZCA9IGNvbC50ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC51bnNoaWZ0KCcuJyArICctJy5yZXBlYXQodGhpcy5uZWdhdGVQYWRkaW5nKGNvbCkgKyAyKSArICcuJyk7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC5wdXNoKFwiJ1wiICsgJy0nLnJlcGVhdCh0aGlzLm5lZ2F0ZVBhZGRpbmcoY29sKSArIDIpICsgXCInXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkIHRvcCBhbmQgYm90dG9tIHBhZGRpbmcuXG4gICAgICAgICAgICBpZiAoY29sLnBhZGRpbmcpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnVuc2hpZnQoLi4ubmV3IEFycmF5KGNvbC5wYWRkaW5nW3RvcF0gfHwgMCkuZmlsbCgnJykpO1xuICAgICAgICAgICAgICAgIHdyYXBwZWQucHVzaCguLi5uZXcgQXJyYXkoY29sLnBhZGRpbmdbYm90dG9tXSB8fCAwKS5maWxsKCcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cmFwcGVkLmZvckVhY2goKHN0ciwgcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcnJvd3Nbcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgcnJvd3MucHVzaChbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJyb3cgPSBycm93c1tyXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnJvd1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBycm93LnB1c2goJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJyb3cucHVzaChzdHIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcnJvd3M7XG4gICAgfVxuICAgIG5lZ2F0ZVBhZGRpbmcoY29sKSB7XG4gICAgICAgIGxldCB3cmFwV2lkdGggPSBjb2wud2lkdGggfHwgMDtcbiAgICAgICAgaWYgKGNvbC5wYWRkaW5nKSB7XG4gICAgICAgICAgICB3cmFwV2lkdGggLT0gKGNvbC5wYWRkaW5nW2xlZnRdIHx8IDApICsgKGNvbC5wYWRkaW5nW3JpZ2h0XSB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICAgICAgd3JhcFdpZHRoIC09IDQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyYXBXaWR0aDtcbiAgICB9XG4gICAgY29sdW1uV2lkdGhzKHJvdykge1xuICAgICAgICBpZiAoIXRoaXMud3JhcCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLndpZHRoIHx8IG1peGluLnN0cmluZ1dpZHRoKGNvbC50ZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCB1bnNldCA9IHJvdy5sZW5ndGg7XG4gICAgICAgIGxldCByZW1haW5pbmdXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIC8vIGNvbHVtbiB3aWR0aHMgY2FuIGJlIHNldCBpbiBjb25maWcuXG4gICAgICAgIGNvbnN0IHdpZHRocyA9IHJvdy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgIGlmIChjb2wud2lkdGgpIHtcbiAgICAgICAgICAgICAgICB1bnNldC0tO1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZ1dpZHRoIC09IGNvbC53aWR0aDtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFueSB1bnNldCB3aWR0aHMgc2hvdWxkIGJlIGNhbGN1bGF0ZWQuXG4gICAgICAgIGNvbnN0IHVuc2V0V2lkdGggPSB1bnNldCA/IE1hdGguZmxvb3IocmVtYWluaW5nV2lkdGggLyB1bnNldCkgOiAwO1xuICAgICAgICByZXR1cm4gd2lkdGhzLm1hcCgodywgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh1bnNldFdpZHRoLCBfbWluV2lkdGgocm93W2ldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkQm9yZGVyKGNvbCwgdHMsIHN0eWxlKSB7XG4gICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgaWYgKC9bLiddLStbLiddLy50ZXN0KHRzKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cy50cmltKCkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcgICc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cbi8vIGNhbGN1bGF0ZXMgdGhlIG1pbmltdW0gd2lkdGggb2Zcbi8vIGEgY29sdW1uLCBiYXNlZCBvbiBwYWRkaW5nIHByZWZlcmVuY2VzLlxuZnVuY3Rpb24gX21pbldpZHRoKGNvbCkge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBjb2wucGFkZGluZyB8fCBbXTtcbiAgICBjb25zdCBtaW5XaWR0aCA9IDEgKyAocGFkZGluZ1tsZWZ0XSB8fCAwKSArIChwYWRkaW5nW3JpZ2h0XSB8fCAwKTtcbiAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICByZXR1cm4gbWluV2lkdGggKyA0O1xuICAgIH1cbiAgICByZXR1cm4gbWluV2lkdGg7XG59XG5mdW5jdGlvbiBnZXRXaW5kb3dXaWR0aCgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZGVwZW5kcyBvbiB0ZXJtaW5hbCAqL1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy5zdGRvdXQgJiYgcHJvY2Vzcy5zdGRvdXQuY29sdW1ucykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRvdXQuY29sdW1ucztcbiAgICB9XG4gICAgcmV0dXJuIDgwO1xufVxuZnVuY3Rpb24gYWxpZ25SaWdodChzdHIsIHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBjb25zdCBzdHJXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHN0cik7XG4gICAgaWYgKHN0cldpZHRoIDwgd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuICcgJy5yZXBlYXQod2lkdGggLSBzdHJXaWR0aCkgKyBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBhbGlnbkNlbnRlcihzdHIsIHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBjb25zdCBzdHJXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHN0cik7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoc3RyV2lkdGggPj0gd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuICcgJy5yZXBlYXQoKHdpZHRoIC0gc3RyV2lkdGgpID4+IDEpICsgc3RyO1xufVxubGV0IG1peGluO1xuZXhwb3J0IGZ1bmN0aW9uIGNsaXVpKG9wdHMsIF9taXhpbikge1xuICAgIG1peGluID0gX21peGluO1xuICAgIHJldHVybiBuZXcgVUkoe1xuICAgICAgICB3aWR0aDogKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy53aWR0aCkgfHwgZ2V0V2luZG93V2lkdGgoKSxcbiAgICAgICAgd3JhcDogb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLndyYXBcbiAgICB9KTtcbn1cbiIsIi8vIE1pbmltYWwgcmVwbGFjZW1lbnQgZm9yIGFuc2kgc3RyaW5nIGhlbHBlcnMgXCJ3cmFwLWFuc2lcIiBhbmQgXCJzdHJpcC1hbnNpXCIuXG4vLyB0byBmYWNpbGl0YXRlIEVTTSBhbmQgRGVubyBtb2R1bGVzLlxuLy8gVE9ETzogbG9vayBhdCBwb3J0aW5nIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3dyYXAtYW5zaSB0byBFU00uXG4vLyBUaGUgbnBtIGFwcGxpY2F0aW9uXG4vLyBDb3B5cmlnaHQgKGMpIG5wbSwgSW5jLiBhbmQgQ29udHJpYnV0b3JzXG4vLyBMaWNlbnNlZCBvbiB0aGUgdGVybXMgb2YgVGhlIEFydGlzdGljIExpY2Vuc2UgMi4wXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vY2xpL2Jsb2IvNGM2NWNkOTUyYmM4NjI3ODExNzM1YmVhNzZiOWIxMTBjYzRmYzgwZS9saWIvdXRpbHMvYW5zaS10cmltLmpzXG5jb25zdCBhbnNpID0gbmV3IFJlZ0V4cCgnXFx4MWIoPzpcXFxcWyg/OlxcXFxkK1tBQkNERUZHSktTVG1dfFxcXFxkKztcXFxcZCtbSGZtXXwnICtcbiAgICAnXFxcXGQrO1xcXFxkKztcXFxcZCttfDZufHN8dXxcXFxcPzI1W2xoXSl8XFxcXHcpJywgJ2cnKTtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEFuc2koc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKGFuc2ksICcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3cmFwKHN0ciwgd2lkdGgpIHtcbiAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSBzdHIubWF0Y2goYW5zaSkgfHwgWycnLCAnJ107XG4gICAgc3RyID0gc3RyaXBBbnNpKHN0cik7XG4gICAgbGV0IHdyYXBwZWQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSAhPT0gMCAmJiAoaSAlIHdpZHRoKSA9PT0gMCkge1xuICAgICAgICAgICAgd3JhcHBlZCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB3cmFwcGVkICs9IHN0ci5jaGFyQXQoaSk7XG4gICAgfVxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgICAgd3JhcHBlZCA9IGAke3N0YXJ0fSR7d3JhcHBlZH0ke2VuZH1gO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlZDtcbn1cbiIsIi8vIEJvb3RzdHJhcCBjbGl1aSB3aXRoIENvbW1vbkpTIGRlcGVuZGVuY2llczpcbmltcG9ydCB7IGNsaXVpIH0gZnJvbSAnLi9idWlsZC9saWIvaW5kZXguanMnXG5pbXBvcnQgeyB3cmFwLCBzdHJpcEFuc2kgfSBmcm9tICcuL2J1aWxkL2xpYi9zdHJpbmctdXRpbHMuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVpIChvcHRzKSB7XG4gIHJldHVybiBjbGl1aShvcHRzLCB7XG4gICAgc3RyaW5nV2lkdGg6IChzdHIpID0+IHtcbiAgICAgIHJldHVybiBbLi4uc3RyXS5sZW5ndGhcbiAgICB9LFxuICAgIHN0cmlwQW5zaSxcbiAgICB3cmFwXG4gIH0pXG59XG4iLCJpbXBvcnQgY29tbWFuZGVyIGZyb20gJy4vaW5kZXguanMnO1xuXG4vLyB3cmFwcGVyIHRvIHByb3ZpZGUgbmFtZWQgZXhwb3J0cyBmb3IgRVNNLlxuZXhwb3J0IGNvbnN0IHtcbiAgcHJvZ3JhbSxcbiAgY3JlYXRlQ29tbWFuZCxcbiAgY3JlYXRlQXJndW1lbnQsXG4gIGNyZWF0ZU9wdGlvbixcbiAgQ29tbWFuZGVyRXJyb3IsXG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkT3B0aW9uQXJndW1lbnRFcnJvciwgLy8gZGVwcmVjYXRlZCBvbGQgbmFtZVxuICBDb21tYW5kLFxuICBBcmd1bWVudCxcbiAgT3B0aW9uLFxuICBIZWxwLFxufSA9IGNvbW1hbmRlcjtcbiIsImltcG9ydCB7IGRpcm5hbWUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IHJlYWRkaXJTeW5jLCBzdGF0U3luYyB9IGZyb20gJ2ZzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHN0YXJ0LCBjYWxsYmFjaykge1xuXHRsZXQgZGlyID0gcmVzb2x2ZSgnLicsIHN0YXJ0KTtcblx0bGV0IHRtcCwgc3RhdHMgPSBzdGF0U3luYyhkaXIpO1xuXG5cdGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuXHRcdGRpciA9IGRpcm5hbWUoZGlyKTtcblx0fVxuXG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0dG1wID0gY2FsbGJhY2soZGlyLCByZWFkZGlyU3luYyhkaXIpKTtcblx0XHRpZiAodG1wKSByZXR1cm4gcmVzb2x2ZShkaXIsIHRtcCk7XG5cdFx0ZGlyID0gZGlybmFtZSh0bXAgPSBkaXIpO1xuXHRcdGlmICh0bXAgPT09IGRpcikgYnJlYWs7XG5cdH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgbWVyZ2UsIHJhY2VXaXRoLCB9IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIGZyb21FbWl0dGVyRXZlbnQsIGZpbHRlckFzeW5jLCB0aW1lb3V0LCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzeW5jRGlzcG9zZVN5bWJvbCwgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgV0VCX1BFUk1JU1NJT05fVE9fUFJPVE9DT0xfUEVSTUlTU0lPTiA9IG5ldyBNYXAoW1xuICAgIFsnZ2VvbG9jYXRpb24nLCAnZ2VvbG9jYXRpb24nXSxcbiAgICBbJ21pZGknLCAnbWlkaSddLFxuICAgIFsnbm90aWZpY2F0aW9ucycsICdub3RpZmljYXRpb25zJ10sXG4gICAgLy8gVE9ETzogcHVzaCBpc24ndCBhIHZhbGlkIHR5cGU/XG4gICAgLy8gWydwdXNoJywgJ3B1c2gnXSxcbiAgICBbJ2NhbWVyYScsICd2aWRlb0NhcHR1cmUnXSxcbiAgICBbJ21pY3JvcGhvbmUnLCAnYXVkaW9DYXB0dXJlJ10sXG4gICAgWydiYWNrZ3JvdW5kLXN5bmMnLCAnYmFja2dyb3VuZFN5bmMnXSxcbiAgICBbJ2FtYmllbnQtbGlnaHQtc2Vuc29yJywgJ3NlbnNvcnMnXSxcbiAgICBbJ2FjY2VsZXJvbWV0ZXInLCAnc2Vuc29ycyddLFxuICAgIFsnZ3lyb3Njb3BlJywgJ3NlbnNvcnMnXSxcbiAgICBbJ21hZ25ldG9tZXRlcicsICdzZW5zb3JzJ10sXG4gICAgWydhY2Nlc3NpYmlsaXR5LWV2ZW50cycsICdhY2Nlc3NpYmlsaXR5RXZlbnRzJ10sXG4gICAgWydjbGlwYm9hcmQtcmVhZCcsICdjbGlwYm9hcmRSZWFkV3JpdGUnXSxcbiAgICBbJ2NsaXBib2FyZC13cml0ZScsICdjbGlwYm9hcmRSZWFkV3JpdGUnXSxcbiAgICBbJ2NsaXBib2FyZC1zYW5pdGl6ZWQtd3JpdGUnLCAnY2xpcGJvYXJkU2FuaXRpemVkV3JpdGUnXSxcbiAgICBbJ3BheW1lbnQtaGFuZGxlcicsICdwYXltZW50SGFuZGxlciddLFxuICAgIFsncGVyc2lzdGVudC1zdG9yYWdlJywgJ2R1cmFibGVTdG9yYWdlJ10sXG4gICAgWydpZGxlLWRldGVjdGlvbicsICdpZGxlRGV0ZWN0aW9uJ10sXG4gICAgLy8gY2hyb21lLXNwZWNpZmljIHBlcm1pc3Npb25zIHdlIGhhdmUuXG4gICAgWydtaWRpLXN5c2V4JywgJ21pZGlTeXNleCddLFxuXSk7XG4vKipcbiAqIHtAbGluayBCcm93c2VyfSByZXByZXNlbnRzIGEgYnJvd3NlciBpbnN0YW5jZSB0aGF0IGlzIGVpdGhlcjpcbiAqXG4gKiAtIGNvbm5lY3RlZCB0byB2aWEge0BsaW5rIFB1cHBldGVlci5jb25uZWN0fSBvclxuICogLSBsYXVuY2hlZCBieSB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXVuY2h9LlxuICpcbiAqIHtAbGluayBCcm93c2VyfSB7QGxpbmsgRXZlbnRFbWl0dGVyLmVtaXQgfCBlbWl0c30gdmFyaW91cyBldmVudHMgd2hpY2ggYXJlXG4gKiBkb2N1bWVudGVkIGluIHRoZSB7QGxpbmsgQnJvd3NlckV2ZW50fSBlbnVtLlxuICpcbiAqIEBleGFtcGxlIFVzaW5nIGEge0BsaW5rIEJyb3dzZXJ9IHRvIGNyZWF0ZSBhIHtAbGluayBQYWdlfTpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICpcbiAqIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gKiBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vZXhhbXBsZS5jb20nKTtcbiAqIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIERpc2Nvbm5lY3RpbmcgZnJvbSBhbmQgcmVjb25uZWN0aW5nIHRvIGEge0BsaW5rIEJyb3dzZXJ9OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gKlxuICogY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqIC8vIFN0b3JlIHRoZSBlbmRwb2ludCB0byBiZSBhYmxlIHRvIHJlY29ubmVjdCB0byB0aGUgYnJvd3Nlci5cbiAqIGNvbnN0IGJyb3dzZXJXU0VuZHBvaW50ID0gYnJvd3Nlci53c0VuZHBvaW50KCk7XG4gKiAvLyBEaXNjb25uZWN0IHB1cHBldGVlciBmcm9tIHRoZSBicm93c2VyLlxuICogYXdhaXQgYnJvd3Nlci5kaXNjb25uZWN0KCk7XG4gKlxuICogLy8gVXNlIHRoZSBlbmRwb2ludCB0byByZWVzdGFibGlzaCBhIGNvbm5lY3Rpb25cbiAqIGNvbnN0IGJyb3dzZXIyID0gYXdhaXQgcHVwcGV0ZWVyLmNvbm5lY3Qoe2Jyb3dzZXJXU0VuZHBvaW50fSk7XG4gKiAvLyBDbG9zZSB0aGUgYnJvd3Nlci5cbiAqIGF3YWl0IGJyb3dzZXIyLmNsb3NlKCk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBCcm93c2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgdW50aWwgYSB7QGxpbmsgVGFyZ2V0IHwgdGFyZ2V0fSBtYXRjaGluZyB0aGUgZ2l2ZW4gYHByZWRpY2F0ZWBcbiAgICAgKiBhcHBlYXJzIGFuZCByZXR1cm5zIGl0LlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGxvb2sgYWxsIG9wZW4ge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0c30uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBGaW5kaW5nIGEgdGFyZ2V0IGZvciBhIHBhZ2Ugb3BlbmVkIHZpYSBgd2luZG93Lm9wZW5gOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHdpbmRvdy5vcGVuKCdodHRwczovL3d3dy5leGFtcGxlLmNvbS8nKSk7XG4gICAgICogY29uc3QgbmV3V2luZG93VGFyZ2V0ID0gYXdhaXQgYnJvd3Nlci53YWl0Rm9yVGFyZ2V0KFxuICAgICAqICAgdGFyZ2V0ID0+IHRhcmdldC51cmwoKSA9PT0gJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tLydcbiAgICAgKiApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JUYXJnZXQocHJlZGljYXRlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyB0aW1lb3V0OiBtcyA9IDMwMDAwIH0gPSBvcHRpb25zO1xuICAgICAgICByZXR1cm4gYXdhaXQgZmlyc3RWYWx1ZUZyb20obWVyZ2UoZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInRhcmdldGNyZWF0ZWRcIiAvKiBCcm93c2VyRXZlbnQuVGFyZ2V0Q3JlYXRlZCAqLyksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJ0YXJnZXRjaGFuZ2VkXCIgLyogQnJvd3NlckV2ZW50LlRhcmdldENoYW5nZWQgKi8pLCBmcm9tKHRoaXMudGFyZ2V0cygpKSkucGlwZShmaWx0ZXJBc3luYyhwcmVkaWNhdGUpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGxpc3Qgb2YgYWxsIG9wZW4ge0BsaW5rIFBhZ2UgfCBwYWdlc30gaW5zaWRlIHRoaXMge0BsaW5rIEJyb3dzZXJ9LlxuICAgICAqXG4gICAgICogSWYgdGhlcmUgYXIgbXVsdGlwbGUge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0c30sIHRoaXNcbiAgICAgKiByZXR1cm5zIGFsbCB7QGxpbmsgUGFnZSB8IHBhZ2VzfSBpbiBhbGxcbiAgICAgKiB7QGxpbmsgQnJvd3NlckNvbnRleHQgfCBicm93c2VyIGNvbnRleHRzfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzIE5vbi12aXNpYmxlIHtAbGluayBQYWdlIHwgcGFnZXN9LCBzdWNoIGFzIGBcImJhY2tncm91bmRfcGFnZVwiYCxcbiAgICAgKiB3aWxsIG5vdCBiZSBsaXN0ZWQgaGVyZS4gWW91IGNhbiBmaW5kIHRoZW0gdXNpbmcge0BsaW5rIFRhcmdldC5wYWdlfS5cbiAgICAgKi9cbiAgICBhc3luYyBwYWdlcygpIHtcbiAgICAgICAgY29uc3QgY29udGV4dFBhZ2VzID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5icm93c2VyQ29udGV4dHMoKS5tYXAoY29udGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5wYWdlcygpO1xuICAgICAgICB9KSk7XG4gICAgICAgIC8vIEZsYXR0ZW4gYXJyYXkuXG4gICAgICAgIHJldHVybiBjb250ZXh0UGFnZXMucmVkdWNlKChhY2MsIHgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhY2MuY29uY2F0KHgpO1xuICAgICAgICB9LCBbXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgUHVwcGV0ZWVyIGlzIGNvbm5lY3RlZCB0byB0aGlzIHtAbGluayBCcm93c2VyIHwgYnJvd3Nlcn0uXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEJyb3dzZXIgfCBCcm93c2VyLmNvbm5lY3RlZH0uXG4gICAgICovXG4gICAgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFtkaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvY2VzcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmNsb3NlKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5kaXNjb25uZWN0KCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbYXN5bmNEaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvY2VzcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgbWVyZ2UsIHJhY2VXaXRoLCB9IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIGZyb21FbWl0dGVyRXZlbnQsIGZpbHRlckFzeW5jLCB0aW1lb3V0LCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzeW5jRGlzcG9zZVN5bWJvbCwgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG5pbXBvcnQgeyBNdXRleCB9IGZyb20gJy4uL3V0aWwvTXV0ZXguanMnO1xuLyoqXG4gKiB7QGxpbmsgQnJvd3NlckNvbnRleHR9IHJlcHJlc2VudHMgaW5kaXZpZHVhbCB1c2VyIGNvbnRleHRzIHdpdGhpbiBhXG4gKiB7QGxpbmsgQnJvd3NlciB8IGJyb3dzZXJ9LlxuICpcbiAqIFdoZW4gYSB7QGxpbmsgQnJvd3NlciB8IGJyb3dzZXJ9IGlzIGxhdW5jaGVkLCBpdCBoYXMgYSBzaW5nbGVcbiAqIHtAbGluayBCcm93c2VyQ29udGV4dCB8IGJyb3dzZXIgY29udGV4dH0gYnkgZGVmYXVsdC4gT3RoZXJzIGNhbiBiZSBjcmVhdGVkXG4gKiB1c2luZyB7QGxpbmsgQnJvd3Nlci5jcmVhdGVCcm93c2VyQ29udGV4dH0uIEVhY2ggY29udGV4dCBoYXMgaXNvbGF0ZWQgc3RvcmFnZVxuICogKGNvb2tpZXMvbG9jYWxTdG9yYWdlL2V0Yy4pXG4gKlxuICoge0BsaW5rIEJyb3dzZXJDb250ZXh0fSB7QGxpbmsgRXZlbnRFbWl0dGVyIHwgZW1pdHN9IHZhcmlvdXMgZXZlbnRzIHdoaWNoIGFyZVxuICogZG9jdW1lbnRlZCBpbiB0aGUge0BsaW5rIEJyb3dzZXJDb250ZXh0RXZlbnR9IGVudW0uXG4gKlxuICogSWYgYSB7QGxpbmsgUGFnZSB8IHBhZ2V9IG9wZW5zIGFub3RoZXIge0BsaW5rIFBhZ2UgfCBwYWdlfSwgZS5nLiB1c2luZ1xuICogYHdpbmRvdy5vcGVuYCwgdGhlIHBvcHVwIHdpbGwgYmVsb25nIHRvIHRoZSBwYXJlbnQge0BsaW5rIFBhZ2UuYnJvd3NlckNvbnRleHRcbiAqIHwgcGFnZSdzIGJyb3dzZXIgY29udGV4dH0uXG4gKlxuICogQGV4YW1wbGUgQ3JlYXRpbmcgYSBuZXcge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0fTpcbiAqXG4gKiBgYGB0c1xuICogLy8gQ3JlYXRlIGEgbmV3IGJyb3dzZXIgY29udGV4dFxuICogY29uc3QgY29udGV4dCA9IGF3YWl0IGJyb3dzZXIuY3JlYXRlQnJvd3NlckNvbnRleHQoKTtcbiAqIC8vIENyZWF0ZSBhIG5ldyBwYWdlIGluc2lkZSBjb250ZXh0LlxuICogY29uc3QgcGFnZSA9IGF3YWl0IGNvbnRleHQubmV3UGFnZSgpO1xuICogLy8gLi4uIGRvIHN0dWZmIHdpdGggcGFnZSAuLi5cbiAqIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICogLy8gRGlzcG9zZSBjb250ZXh0IG9uY2UgaXQncyBubyBsb25nZXIgbmVlZGVkLlxuICogYXdhaXQgY29udGV4dC5jbG9zZSgpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckNvbnRleHQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBkZWZpbmVkLCBpbmRpY2F0ZXMgYW4gb25nb2luZyBzY3JlZW5zaG90IG9wZXJlYXRpb24uXG4gICAgICovXG4gICAgI3BhZ2VTY3JlZW5zaG90TXV0ZXg7XG4gICAgI3NjcmVlbnNob3RPcGVyYXRpb25zQ291bnQgPSAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXJ0U2NyZWVuc2hvdCgpIHtcbiAgICAgICAgY29uc3QgbXV0ZXggPSB0aGlzLiNwYWdlU2NyZWVuc2hvdE11dGV4IHx8IG5ldyBNdXRleCgpO1xuICAgICAgICB0aGlzLiNwYWdlU2NyZWVuc2hvdE11dGV4ID0gbXV0ZXg7XG4gICAgICAgIHRoaXMuI3NjcmVlbnNob3RPcGVyYXRpb25zQ291bnQrKztcbiAgICAgICAgcmV0dXJuIG11dGV4LmFjcXVpcmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jc2NyZWVuc2hvdE9wZXJhdGlvbnNDb3VudC0tO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3NjcmVlbnNob3RPcGVyYXRpb25zQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG11dGV4IHRvIGluZGljYXRlIG5vIG9uZ29pbmcgc2NyZWVuc2hvdCBvcGVyYXRpb24uXG4gICAgICAgICAgICAgICAgdGhpcy4jcGFnZVNjcmVlbnNob3RNdXRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHdhaXRGb3JTY3JlZW5zaG90T3BlcmF0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3BhZ2VTY3JlZW5zaG90TXV0ZXg/LmFjcXVpcmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgdW50aWwgYSB7QGxpbmsgVGFyZ2V0IHwgdGFyZ2V0fSBtYXRjaGluZyB0aGUgZ2l2ZW4gYHByZWRpY2F0ZWBcbiAgICAgKiBhcHBlYXJzIGFuZCByZXR1cm5zIGl0LlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGxvb2sgYWxsIG9wZW4ge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0c30uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBGaW5kaW5nIGEgdGFyZ2V0IGZvciBhIHBhZ2Ugb3BlbmVkIHZpYSBgd2luZG93Lm9wZW5gOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHdpbmRvdy5vcGVuKCdodHRwczovL3d3dy5leGFtcGxlLmNvbS8nKSk7XG4gICAgICogY29uc3QgbmV3V2luZG93VGFyZ2V0ID0gYXdhaXQgYnJvd3NlckNvbnRleHQud2FpdEZvclRhcmdldChcbiAgICAgKiAgIHRhcmdldCA9PiB0YXJnZXQudXJsKCkgPT09ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8nXG4gICAgICogKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyB3YWl0Rm9yVGFyZ2V0KHByZWRpY2F0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgdGltZW91dDogbXMgPSAzMDAwMCB9ID0gb3B0aW9ucztcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1lcmdlKGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJ0YXJnZXRjcmVhdGVkXCIgLyogQnJvd3NlckNvbnRleHRFdmVudC5UYXJnZXRDcmVhdGVkICovKSwgZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInRhcmdldGNoYW5nZWRcIiAvKiBCcm93c2VyQ29udGV4dEV2ZW50LlRhcmdldENoYW5nZWQgKi8pLCBmcm9tKHRoaXMudGFyZ2V0cygpKSkucGlwZShmaWx0ZXJBc3luYyhwcmVkaWNhdGUpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIHtAbGluayBCcm93c2VyQ29udGV4dCB8IGJyb3dzZXIgY29udGV4dH0gaXMgY2xvc2VkLlxuICAgICAqL1xuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5icm93c2VyKCkuYnJvd3NlckNvbnRleHRzKCkuaW5jbHVkZXModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoaXMge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0fS5cbiAgICAgKi9cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHJldHVybiB2b2lkIHRoaXMuY2xvc2UoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFthc3luY0Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJDb250ZXh0LmpzLm1hcCIsImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuLyoqXG4gKiBFdmVudHMgdGhhdCB0aGUgQ0RQU2Vzc2lvbiBjbGFzcyBlbWl0cy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIENEUFNlc3Npb25FdmVudDtcbihmdW5jdGlvbiAoQ0RQU2Vzc2lvbkV2ZW50KSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQgPSBTeW1ib2woJ0NEUFNlc3Npb24uRGlzY29ubmVjdGVkJyk7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIENEUFNlc3Npb25FdmVudC5Td2FwcGVkID0gU3ltYm9sKCdDRFBTZXNzaW9uLlN3YXBwZWQnKTtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHNlc3Npb24gaXMgcmVhZHkgdG8gYmUgY29uZmlndXJlZCBkdXJpbmcgdGhlIGF1dG8tYXR0YWNoXG4gICAgICogcHJvY2Vzcy4gUmlnaHQgYWZ0ZXIgdGhlIGV2ZW50IGlzIGhhbmRsZWQsIHRoZSBzZXNzaW9uIHdpbGwgYmUgcmVzdW1lZC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIENEUFNlc3Npb25FdmVudC5SZWFkeSA9IFN5bWJvbCgnQ0RQU2Vzc2lvbi5SZWFkeScpO1xuICAgIENEUFNlc3Npb25FdmVudC5TZXNzaW9uQXR0YWNoZWQgPSAnc2Vzc2lvbmF0dGFjaGVkJztcbiAgICBDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkID0gJ3Nlc3Npb25kZXRhY2hlZCc7XG59KShDRFBTZXNzaW9uRXZlbnQgfHwgKENEUFNlc3Npb25FdmVudCA9IHt9KSk7XG4vKipcbiAqIFRoZSBgQ0RQU2Vzc2lvbmAgaW5zdGFuY2VzIGFyZSB1c2VkIHRvIHRhbGsgcmF3IENocm9tZSBEZXZ0b29scyBQcm90b2NvbC5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIFByb3RvY29sIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCB3aXRoIHtAbGluayBDRFBTZXNzaW9uLnNlbmR9IG1ldGhvZCBhbmQgcHJvdG9jb2xcbiAqIGV2ZW50cyBjYW4gYmUgc3Vic2NyaWJlZCB0byB3aXRoIGBDRFBTZXNzaW9uLm9uYCBtZXRob2QuXG4gKlxuICogVXNlZnVsIGxpbmtzOiB7QGxpbmsgaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvIHwgRGV2VG9vbHMgUHJvdG9jb2wgVmlld2VyfVxuICogYW5kIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNsdXNobmlrb3YvZ2V0dGluZy1zdGFydGVkLXdpdGgtY2RwL2Jsb2IvSEVBRC9SRUFETUUubWQgfCBHZXR0aW5nIFN0YXJ0ZWQgd2l0aCBEZXZUb29scyBQcm90b2NvbH0uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgY2xpZW50ID0gYXdhaXQgcGFnZS5jcmVhdGVDRFBTZXNzaW9uKCk7XG4gKiBhd2FpdCBjbGllbnQuc2VuZCgnQW5pbWF0aW9uLmVuYWJsZScpO1xuICogY2xpZW50Lm9uKCdBbmltYXRpb24uYW5pbWF0aW9uQ3JlYXRlZCcsICgpID0+XG4gKiAgIGNvbnNvbGUubG9nKCdBbmltYXRpb24gY3JlYXRlZCEnKVxuICogKTtcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnNlbmQoJ0FuaW1hdGlvbi5nZXRQbGF5YmFja1JhdGUnKTtcbiAqIGNvbnNvbGUubG9nKCdwbGF5YmFjayByYXRlIGlzICcgKyByZXNwb25zZS5wbGF5YmFja1JhdGUpO1xuICogYXdhaXQgY2xpZW50LnNlbmQoJ0FuaW1hdGlvbi5zZXRQbGF5YmFja1JhdGUnLCB7XG4gKiAgIHBsYXliYWNrUmF0ZTogcmVzcG9uc2UucGxheWJhY2tSYXRlIC8gMixcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQ0RQU2Vzc2lvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcmVudCBzZXNzaW9uIGluIHRlcm1zIG9mIENEUCdzIGF1dG8tYXR0YWNoIG1lY2hhbmlzbS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHBhcmVudFNlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q0RQU2Vzc2lvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuLyoqXG4gKiBEaWFsb2cgaW5zdGFuY2VzIGFyZSBkaXNwYXRjaGVkIGJ5IHRoZSB7QGxpbmsgUGFnZX0gdmlhIHRoZSBgZGlhbG9nYCBldmVudC5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAqXG4gKiAoYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiAgIHBhZ2Uub24oJ2RpYWxvZycsIGFzeW5jIGRpYWxvZyA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coZGlhbG9nLm1lc3NhZ2UoKSk7XG4gKiAgICAgYXdhaXQgZGlhbG9nLmRpc21pc3MoKTtcbiAqICAgICBhd2FpdCBicm93c2VyLmNsb3NlKCk7XG4gKiAgIH0pO1xuICogICBwYWdlLmV2YWx1YXRlKCgpID0+IGFsZXJ0KCcxJykpO1xuICogfSkoKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERpYWxvZyB7XG4gICAgI3R5cGU7XG4gICAgI21lc3NhZ2U7XG4gICAgI2RlZmF1bHRWYWx1ZTtcbiAgICAjaGFuZGxlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSA9ICcnKSB7XG4gICAgICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLiNtZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy4jZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0eXBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWVzc2FnZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByb21wdCwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBkaWFsb2dcbiAgICAgKiBpcyBub3QgYSBgcHJvbXB0YC5cbiAgICAgKi9cbiAgICBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRpYWxvZyBoYXMgYmVlbiBhY2NlcHRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9tcHRUZXh0IC0gb3B0aW9uYWwgdGV4dCB0aGF0IHdpbGwgYmUgZW50ZXJlZCBpbiB0aGUgZGlhbG9nXG4gICAgICogcHJvbXB0LiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBkaWFsb2cncyB0eXBlIGlzIG5vdCBgcHJvbXB0YC5cbiAgICAgKlxuICAgICAqL1xuICAgIGFzeW5jIGFjY2VwdChwcm9tcHRUZXh0KSB7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBhY2NlcHQgZGlhbG9nIHdoaWNoIGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgdGhpcy4jaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlKHtcbiAgICAgICAgICAgIGFjY2VwdDogdHJ1ZSxcbiAgICAgICAgICAgIHRleHQ6IHByb21wdFRleHQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIG9uY2UgdGhlIGRpYWxvZyBoYXMgYmVlbiBkaXNtaXNzZWRcbiAgICAgKi9cbiAgICBhc3luYyBkaXNtaXNzKCkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2hhbmRsZWQsICdDYW5ub3QgZGlzbWlzcyBkaWFsb2cgd2hpY2ggaXMgYWxyZWFkeSBoYW5kbGVkIScpO1xuICAgICAgICB0aGlzLiNoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGUoe1xuICAgICAgICAgICAgYWNjZXB0OiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGlhbG9nLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG52YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xudmFyIF9fc2V0RnVuY3Rpb25OYW1lID0gKHRoaXMgJiYgdGhpcy5fX3NldEZ1bmN0aW9uTmFtZSkgfHwgZnVuY3Rpb24gKGYsIG5hbWUsIHByZWZpeCkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5pbXBvcnQgeyBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvciB9IGZyb20gJy4uL2NvbW1vbi9HZXRRdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4uL2NvbW1vbi9MYXp5QXJnLmpzJztcbmltcG9ydCB7IGlzU3RyaW5nLCB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgQXN5bmNJdGVyYWJsZVV0aWwgfSBmcm9tICcuLi91dGlsL0FzeW5jSXRlcmFibGVVdGlsLmpzJztcbmltcG9ydCB7IHRocm93SWZEaXNwb3NlZCB9IGZyb20gJy4uL3V0aWwvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBfaXNFbGVtZW50SGFuZGxlIH0gZnJvbSAnLi9FbGVtZW50SGFuZGxlU3ltYm9sLmpzJztcbmltcG9ydCB7IEpTSGFuZGxlIH0gZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG4vKipcbiAqIEVsZW1lbnRIYW5kbGUgcmVwcmVzZW50cyBhbiBpbi1wYWdlIERPTSBlbGVtZW50LlxuICpcbiAqIEByZW1hcmtzXG4gKiBFbGVtZW50SGFuZGxlcyBjYW4gYmUgY3JlYXRlZCB3aXRoIHRoZSB7QGxpbmsgUGFnZS4kfSBtZXRob2QuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAqXG4gKiAoYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiAgIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICogICBjb25zdCBocmVmRWxlbWVudCA9IGF3YWl0IHBhZ2UuJCgnYScpO1xuICogICBhd2FpdCBocmVmRWxlbWVudC5jbGljaygpO1xuICogICAvLyAuLi5cbiAqIH0pKCk7XG4gKiBgYGBcbiAqXG4gKiBFbGVtZW50SGFuZGxlIHByZXZlbnRzIHRoZSBET00gZWxlbWVudCBmcm9tIGJlaW5nIGdhcmJhZ2UtY29sbGVjdGVkIHVubGVzcyB0aGVcbiAqIGhhbmRsZSBpcyB7QGxpbmsgSlNIYW5kbGUuZGlzcG9zZSB8IGRpc3Bvc2VkfS4gRWxlbWVudEhhbmRsZXMgYXJlIGF1dG8tZGlzcG9zZWRcbiAqIHdoZW4gdGhlaXIgb3JpZ2luIGZyYW1lIGdldHMgbmF2aWdhdGVkLlxuICpcbiAqIEVsZW1lbnRIYW5kbGUgaW5zdGFuY2VzIGNhbiBiZSB1c2VkIGFzIGFyZ3VtZW50cyBpbiB7QGxpbmsgUGFnZS4kZXZhbH0gYW5kXG4gKiB7QGxpbmsgUGFnZS5ldmFsdWF0ZX0gbWV0aG9kcy5cbiAqXG4gKiBJZiB5b3UncmUgdXNpbmcgVHlwZVNjcmlwdCwgRWxlbWVudEhhbmRsZSB0YWtlcyBhIGdlbmVyaWMgYXJndW1lbnQgdGhhdFxuICogZGVub3RlcyB0aGUgdHlwZSBvZiBlbGVtZW50IHRoZSBoYW5kbGUgaXMgaG9sZGluZyB3aXRoaW4uIEZvciBleGFtcGxlLCBpZiB5b3VcbiAqIGhhdmUgYSBoYW5kbGUgdG8gYSBgPHNlbGVjdD5gIGVsZW1lbnQsIHlvdSBjYW4gdHlwZSBpdCBhc1xuICogYEVsZW1lbnRIYW5kbGU8SFRNTFNlbGVjdEVsZW1lbnQ+YCBhbmQgeW91IGdldCBzb21lIG5pY2VyIHR5cGUgY2hlY2tzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xubGV0IEVsZW1lbnRIYW5kbGUgPSAoKCkgPT4ge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tLCBfbywgX3AsIF9xLCBfciwgX3MsIF90LCBfdSwgX3YsIF93LCBfeCwgX3ksIF96LCBfMCwgXzEsIF8yLCBfMywgXzQsIF81O1xuICAgIGxldCBfY2xhc3NTdXBlciA9IEpTSGFuZGxlO1xuICAgIGxldCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfZ2V0UHJvcGVydHlfZGVjb3JhdG9ycztcbiAgICBsZXQgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycztcbiAgICBsZXQgX2pzb25WYWx1ZV9kZWNvcmF0b3JzO1xuICAgIGxldCBfJF9kZWNvcmF0b3JzO1xuICAgIGxldCBfJCRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfJCRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfJCRfZGVzY3JpcHRvcjtcbiAgICBsZXQgX3dhaXRGb3JTZWxlY3Rvcl9kZWNvcmF0b3JzO1xuICAgIGxldCBfaXNWaXNpYmxlX2RlY29yYXRvcnM7XG4gICAgbGV0IF9pc0hpZGRlbl9kZWNvcmF0b3JzO1xuICAgIGxldCBfdG9FbGVtZW50X2RlY29yYXRvcnM7XG4gICAgbGV0IF9jbGlja2FibGVQb2ludF9kZWNvcmF0b3JzO1xuICAgIGxldCBfaG92ZXJfZGVjb3JhdG9ycztcbiAgICBsZXQgX2NsaWNrX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcmFnX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcmFnRW50ZXJfZGVjb3JhdG9ycztcbiAgICBsZXQgX2RyYWdPdmVyX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcm9wX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcmFnQW5kRHJvcF9kZWNvcmF0b3JzO1xuICAgIGxldCBfc2VsZWN0X2RlY29yYXRvcnM7XG4gICAgbGV0IF90YXBfZGVjb3JhdG9ycztcbiAgICBsZXQgX3RvdWNoU3RhcnRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3RvdWNoTW92ZV9kZWNvcmF0b3JzO1xuICAgIGxldCBfdG91Y2hFbmRfZGVjb3JhdG9ycztcbiAgICBsZXQgX2ZvY3VzX2RlY29yYXRvcnM7XG4gICAgbGV0IF90eXBlX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcmVzc19kZWNvcmF0b3JzO1xuICAgIGxldCBfYm91bmRpbmdCb3hfZGVjb3JhdG9ycztcbiAgICBsZXQgX2JveE1vZGVsX2RlY29yYXRvcnM7XG4gICAgbGV0IF9zY3JlZW5zaG90X2RlY29yYXRvcnM7XG4gICAgbGV0IF9pc0ludGVyc2VjdGluZ1ZpZXdwb3J0X2RlY29yYXRvcnM7XG4gICAgbGV0IF9zY3JvbGxJbnRvVmlld19kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBFbGVtZW50SGFuZGxlIGV4dGVuZHMgX2NsYXNzU3VwZXIge1xuICAgICAgICBzdGF0aWMge1xuICAgICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9nZXRQcm9wZXJ0eV9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX2EgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfYSldO1xuICAgICAgICAgICAgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9iID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2IpXTtcbiAgICAgICAgICAgIF9qc29uVmFsdWVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9jID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2MpXTtcbiAgICAgICAgICAgIF8kX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfZCA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9kKV07XG4gICAgICAgICAgICBfJCRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKV07XG4gICAgICAgICAgICBfcHJpdmF0ZV8kJF9kZWNvcmF0b3JzID0gWyhfZSA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9lKV07XG4gICAgICAgICAgICBfd2FpdEZvclNlbGVjdG9yX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfZiA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9mKV07XG4gICAgICAgICAgICBfaXNWaXNpYmxlX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfZyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9nKV07XG4gICAgICAgICAgICBfaXNIaWRkZW5fZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9oID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2gpXTtcbiAgICAgICAgICAgIF90b0VsZW1lbnRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9qID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2opXTtcbiAgICAgICAgICAgIF9jbGlja2FibGVQb2ludF9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX2sgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfayldO1xuICAgICAgICAgICAgX2hvdmVyX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfbCA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9sKV07XG4gICAgICAgICAgICBfY2xpY2tfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9tID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX20pXTtcbiAgICAgICAgICAgIF9kcmFnX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfbyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9vKV07XG4gICAgICAgICAgICBfZHJhZ0VudGVyX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfcCA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9wKV07XG4gICAgICAgICAgICBfZHJhZ092ZXJfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9xID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3EpXTtcbiAgICAgICAgICAgIF9kcm9wX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfciA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9yKV07XG4gICAgICAgICAgICBfZHJhZ0FuZERyb3BfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9zID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3MpXTtcbiAgICAgICAgICAgIF9zZWxlY3RfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF90ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3QpXTtcbiAgICAgICAgICAgIF90YXBfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF91ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3UpXTtcbiAgICAgICAgICAgIF90b3VjaFN0YXJ0X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfdiA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF92KV07XG4gICAgICAgICAgICBfdG91Y2hNb3ZlX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfdyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF93KV07XG4gICAgICAgICAgICBfdG91Y2hFbmRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF94ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3gpXTtcbiAgICAgICAgICAgIF9mb2N1c19kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX3kgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfeSldO1xuICAgICAgICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF96ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3opXTtcbiAgICAgICAgICAgIF9wcmVzc19kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoXzAgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfMCldO1xuICAgICAgICAgICAgX2JvdW5kaW5nQm94X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfMSA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF8xKV07XG4gICAgICAgICAgICBfYm94TW9kZWxfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF8yID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoXzIpXTtcbiAgICAgICAgICAgIF9zY3JlZW5zaG90X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfMyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF8zKV07XG4gICAgICAgICAgICBfaXNJbnRlcnNlY3RpbmdWaWV3cG9ydF9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoXzQgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfNCldO1xuICAgICAgICAgICAgX3Njcm9sbEludG9WaWV3X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfNSA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF81KV07XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2dldFByb3BlcnR5X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJnZXRQcm9wZXJ0eVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZ2V0UHJvcGVydHlcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5nZXRQcm9wZXJ0eSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZ2V0UHJvcGVydGllc19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZ2V0UHJvcGVydGllc1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZ2V0UHJvcGVydGllc1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmdldFByb3BlcnRpZXMgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2pzb25WYWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwianNvblZhbHVlXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJqc29uVmFsdWVcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5qc29uVmFsdWUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgXyRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIiRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai4kIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF8kJF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiJCRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIiQkXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouJCQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfJCRfZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jJCRpbXBsKHNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICB9LCBcIiMkJFwiKSB9LCBfcHJpdmF0ZV8kJF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiIyQkXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjJCQgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouIyQkIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF93YWl0Rm9yU2VsZWN0b3JfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIndhaXRGb3JTZWxlY3RvclwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwid2FpdEZvclNlbGVjdG9yXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoud2FpdEZvclNlbGVjdG9yIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9pc1Zpc2libGVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImlzVmlzaWJsZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiaXNWaXNpYmxlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaXNWaXNpYmxlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9pc0hpZGRlbl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiaXNIaWRkZW5cIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImlzSGlkZGVuXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaXNIaWRkZW4gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RvRWxlbWVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidG9FbGVtZW50XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ0b0VsZW1lbnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50b0VsZW1lbnQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2NsaWNrYWJsZVBvaW50X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJjbGlja2FibGVQb2ludFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiY2xpY2thYmxlUG9pbnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5jbGlja2FibGVQb2ludCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfaG92ZXJfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImhvdmVyXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJob3ZlclwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmhvdmVyIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9jbGlja19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiY2xpY2tcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImNsaWNrXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouY2xpY2sgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2RyYWdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImRyYWdcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyYWdcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5kcmFnIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9kcmFnRW50ZXJfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImRyYWdFbnRlclwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZHJhZ0VudGVyXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZHJhZ0VudGVyIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9kcmFnT3Zlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZHJhZ092ZXJcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyYWdPdmVyXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZHJhZ092ZXIgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2Ryb3BfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImRyb3BcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyb3BcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5kcm9wIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9kcmFnQW5kRHJvcF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZHJhZ0FuZERyb3BcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyYWdBbmREcm9wXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZHJhZ0FuZERyb3AgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3NlbGVjdF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2VsZWN0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzZWxlY3RcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5zZWxlY3QgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RhcF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidGFwXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ0YXBcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50YXAgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RvdWNoU3RhcnRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInRvdWNoU3RhcnRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInRvdWNoU3RhcnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50b3VjaFN0YXJ0IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF90b3VjaE1vdmVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInRvdWNoTW92ZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwidG91Y2hNb3ZlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudG91Y2hNb3ZlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF90b3VjaEVuZF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidG91Y2hFbmRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInRvdWNoRW5kXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudG91Y2hFbmQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2ZvY3VzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJmb2N1c1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZm9jdXNcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5mb2N1cyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfdHlwZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidHlwZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwidHlwZVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnR5cGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3ByZXNzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJwcmVzc1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwicHJlc3NcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5wcmVzcyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfYm91bmRpbmdCb3hfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImJvdW5kaW5nQm94XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJib3VuZGluZ0JveFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmJvdW5kaW5nQm94IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9ib3hNb2RlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiYm94TW9kZWxcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImJveE1vZGVsXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYm94TW9kZWwgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3NjcmVlbnNob3RfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInNjcmVlbnNob3RcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInNjcmVlbnNob3RcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5zY3JlZW5zaG90IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9pc0ludGVyc2VjdGluZ1ZpZXdwb3J0X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJpc0ludGVyc2VjdGluZ1ZpZXdwb3J0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJpc0ludGVyc2VjdGluZ1ZpZXdwb3J0XCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaXNJbnRlcnNlY3RpbmdWaWV3cG9ydCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2Nyb2xsSW50b1ZpZXdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInNjcm9sbEludG9WaWV3XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzY3JvbGxJbnRvVmlld1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNjcm9sbEludG9WaWV3IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICogQ2FjaGVkIGlzb2xhdGVkSGFuZGxlIHRvIHByZXZlbnRcbiAgICAgICAgICogdHJ5aW5nIHRvIGFkb3B0IGl0IG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAqL1xuICAgICAgICBpc29sYXRlZEhhbmRsZSA9IF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXMsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZ2l2ZW4gbWV0aG9kIHdpbGwgaGF2ZSBpdCdzIGB0aGlzYCByZXBsYWNlZCB3aXRoIGFuIGlzb2xhdGVkIHZlcnNpb24gb2ZcbiAgICAgICAgICogYHRoaXNgIHdoZW4gZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEFsbCBjaGFuZ2VzIG9mIGlzb2xhdGVkIGB0aGlzYCBhcmUgcmVmbGVjdGVkIG9uIHRoZSBhY3R1YWwgYHRoaXNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHN0YXRpYyBiaW5kSXNvbGF0ZWRIYW5kbGUodGFyZ2V0LCBfKSB7XG4gICAgICAgICAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaGFuZGxlIGlzIGFscmVhZHkgaXNvbGF0ZWQsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBhZG9wdCBpdFxuICAgICAgICAgICAgICAgIC8vIGFnYWluLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWxtID09PSB0aGlzLmZyYW1lLmlzb2xhdGVkUmVhbG0oKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGFyZ2V0LmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBhZG9wdGVkVGhpcztcbiAgICAgICAgICAgICAgICBpZiAodGhpc1snaXNvbGF0ZWRIYW5kbGUnXSkge1xuICAgICAgICAgICAgICAgICAgICBhZG9wdGVkVGhpcyA9IHRoaXNbJ2lzb2xhdGVkSGFuZGxlJ107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzWydpc29sYXRlZEhhbmRsZSddID0gYWRvcHRlZFRoaXMgPSBhd2FpdCB0aGlzLmZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRvcHRIYW5kbGUodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5jYWxsKGFkb3B0ZWRUaGlzLCAuLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBgYWRvcHRlZFRoaXNgLCB0aGVuIHdlIHJldHVybiBgdGhpc2AuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gYWRvcHRlZFRoaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgaGFuZGxlLCB0cmFuc2ZlciBpdCBpbnRvIHRoZSBjdXJyZW50IHJlYWxtLlxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBKU0hhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWFsbS50cmFuc2ZlckhhbmRsZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSBvZiBoYW5kbGVycywgdHJhbnNmZXIgdGhlbSBpbnRvIHRoZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcmVhbG0uXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChyZXN1bHQubWFwKGFzeW5jIChpdGVtLCBpbmRleCwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEpTSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGF3YWl0IHRoaXMucmVhbG0udHJhbnNmZXJIYW5kbGUoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbLi4ucmVzdWx0LmVudHJpZXMoKV0ubWFwKGFzeW5jIChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEpTSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIGF3YWl0IHRoaXMucmVhbG0udHJhbnNmZXJIYW5kbGUodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBoYW5kbGU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0cnVjdG9yKGhhbmRsZSkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlO1xuICAgICAgICAgICAgdGhpc1tfaXNFbGVtZW50SGFuZGxlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0IGlkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLmlkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZS5kaXNwb3NlZDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGdldFByb3BlcnRpZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGUuZ2V0UHJvcGVydGllcygpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICAgICAgcGFnZUZ1bmN0aW9uID0gd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSh0aGlzLmV2YWx1YXRlLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGUuZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBldmFsdWF0ZUhhbmRsZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy5ldmFsdWF0ZUhhbmRsZS5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlLmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMganNvblZhbHVlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlLmpzb25WYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgcmVtb3RlT2JqZWN0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLnJlbW90ZU9iamVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzRWxlbWVudCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBRdWVyaWVzIHRoZSBjdXJyZW50IGVsZW1lbnQgZm9yIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKiBAcmV0dXJucyBBIHtAbGluayBFbGVtZW50SGFuZGxlIHwgZWxlbWVudCBoYW5kbGV9IHRvIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICAgICAqIG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3Rvci4gT3RoZXJ3aXNlLCBgbnVsbGAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICBjb25zdCB7IHVwZGF0ZWRTZWxlY3RvciwgUXVlcnlIYW5kbGVyIH0gPSBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgICAgICByZXR1cm4gKGF3YWl0IFF1ZXJ5SGFuZGxlci5xdWVyeU9uZSh0aGlzLCB1cGRhdGVkU2VsZWN0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUXVlcmllcyB0aGUgY3VycmVudCBlbGVtZW50IGZvciBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB7QGxpbmsgRWxlbWVudEhhbmRsZSB8IGVsZW1lbnQgaGFuZGxlc30gdGhhdCBwb2ludCB0b1xuICAgICAgICAgKiBlbGVtZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkJChzZWxlY3Rvciwgb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmlzb2xhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuIyQkaW1wbChzZWxlY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jJCQoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJc29sYXRlcyB7QGxpbmsgRWxlbWVudEhhbmRsZS4kJH0gaWYgbmVlZGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGdldCAjJCQoKSB7IHJldHVybiBfcHJpdmF0ZV8kJF9kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIEVsZW1lbnRIYW5kbGUuJCR9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICMkJGltcGwoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlZFNlbGVjdG9yLCBRdWVyeUhhbmRsZXIgfSA9IGdldFF1ZXJ5SGFuZGxlckFuZFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBBc3luY0l0ZXJhYmxlVXRpbC5jb2xsZWN0KFF1ZXJ5SGFuZGxlci5xdWVyeUFsbCh0aGlzLCB1cGRhdGVkU2VsZWN0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gdGhlIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGluXG4gICAgICAgICAqIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdGlsbFxuICAgICAgICAgKiB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgdHdlZXRIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJy50d2VldCcpO1xuICAgICAgICAgKiBleHBlY3QoYXdhaXQgdHdlZXRIYW5kbGUuJGV2YWwoJy5saWtlJywgbm9kZSA9PiBub2RlLmlubmVyVGV4dCkpLnRvQmUoXG4gICAgICAgICAqICAgJzEwMCdcbiAgICAgICAgICogKTtcbiAgICAgICAgICogZXhwZWN0KGF3YWl0IHR3ZWV0SGFuZGxlLiRldmFsKCcucmV0d2VldHMnLCBub2RlID0+IG5vZGUuaW5uZXJUZXh0KSkudG9CZShcbiAgICAgICAgICogICAnMTAnXG4gICAgICAgICAqICk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKiBAcGFyYW0gcGFnZUZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZCBpbiB0aGlzIGVsZW1lbnQncyBwYWdlJ3NcbiAgICAgICAgICogY29udGV4dC4gVGhlIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yIHdpbGwgYmUgcGFzc2VkIGluIGFzIHRoZVxuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZfMSA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGFnZUZ1bmN0aW9uID0gd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSh0aGlzLiRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudEhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBhd2FpdCB0aGlzLiQoc2VsZWN0b3IpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3I6IGZhaWxlZCB0byBmaW5kIGVsZW1lbnQgbWF0Y2hpbmcgc2VsZWN0b3IgXCIke3NlbGVjdG9yfVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBlbGVtZW50SGFuZGxlLmV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgZW52XzEuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yXG4gICAgICAgICAqIGluIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdGlsbFxuICAgICAgICAgKiB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogSFRNTDpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgaHRtbFxuICAgICAgICAgKiA8ZGl2IGNsYXNzPVwiZmVlZFwiPlxuICAgICAgICAgKiAgIDxkaXYgY2xhc3M9XCJ0d2VldFwiPkhlbGxvITwvZGl2PlxuICAgICAgICAgKiAgIDxkaXYgY2xhc3M9XCJ0d2VldFwiPkhpITwvZGl2PlxuICAgICAgICAgKiA8L2Rpdj5cbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEphdmFTY3JpcHQ6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGZlZWRIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJy5mZWVkJyk7XG4gICAgICAgICAqIGV4cGVjdChcbiAgICAgICAgICogICBhd2FpdCBmZWVkSGFuZGxlLiQkZXZhbCgnLnR3ZWV0Jywgbm9kZXMgPT4gbm9kZXMubWFwKG4gPT4gbi5pbm5lclRleHQpKVxuICAgICAgICAgKiApLnRvRXF1YWwoWydIZWxsbyEnLCAnSGkhJ10pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC1cbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3NlbGVjdG9ycyB8IHNlbGVjdG9yfVxuICAgICAgICAgKiB0byBxdWVyeSBwYWdlIGZvci5cbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzIHwgQ1NTIHNlbGVjdG9yc31cbiAgICAgICAgICogY2FuIGJlIHBhc3NlZCBhcy1pcyBhbmQgYVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjbm9uLWNzcy1zZWxlY3RvcnMgfCBQdXBwZXRlZXItc3BlY2lmaWMgc2VsZWN0b3Igc3ludGF4fVxuICAgICAgICAgKiBhbGxvd3MgcXVlcmluZyBieVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjdGV4dC1zZWxlY3RvcnMtLXAtdGV4dCB8IHRleHR9LFxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjYXJpYS1zZWxlY3RvcnMtLXAtYXJpYSB8IGExMXkgcm9sZSBhbmQgbmFtZX0sXG4gICAgICAgICAqIGFuZFxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjeHBhdGgtc2VsZWN0b3JzLS1wLXhwYXRoIHwgeHBhdGh9XG4gICAgICAgICAqIGFuZFxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjcXVlcnlpbmctZWxlbWVudHMtaW4tc2hhZG93LWRvbSB8IGNvbWJpbmluZyB0aGVzZSBxdWVyaWVzIGFjcm9zcyBzaGFkb3cgcm9vdHN9LlxuICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNwZWNpZnkgdGhlIHNlbGVjdG9yIHR5cGUgdXNpbmcgYVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjcHJlZml4ZWQtc2VsZWN0b3Itc3ludGF4IHwgcHJlZml4fS5cbiAgICAgICAgICogQHBhcmFtIHBhZ2VGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBiZSBldmFsdWF0ZWQgaW4gdGhlIGVsZW1lbnQncyBwYWdlJ3NcbiAgICAgICAgICogY29udGV4dC4gQW4gYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIHdpbGwgYmUgcGFzc2VkIHRvXG4gICAgICAgICAqIHRoZSBmdW5jdGlvbiBhcyBpdHMgZmlyc3QgYXJndW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBgcGFnZUZ1bmN0aW9uYC5cbiAgICAgICAgICogQHJldHVybnMgQSBwcm9taXNlIHRvIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgJCRldmFsKHNlbGVjdG9yLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuJCRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuJCQoc2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzIsIGF3YWl0IHRoaXMuZXZhbHVhdGVIYW5kbGUoKF8sIC4uLmVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICAgICAgICAgICAgICB9LCAuLi5yZXN1bHRzKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5ldmFsdWF0ZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpLFxuICAgICAgICAgICAgICAgICAgICAuLi5yZXN1bHRzLm1hcChyZXN1bHRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzIpIHtcbiAgICAgICAgICAgICAgICBlbnZfMi5lcnJvciA9IGVfMjtcbiAgICAgICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXYWl0IGZvciBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciB0byBhcHBlYXIgaW4gdGhlIGN1cnJlbnRcbiAgICAgICAgICogZWxlbWVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogVW5saWtlIHtAbGluayBGcmFtZS53YWl0Rm9yU2VsZWN0b3J9LCB0aGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGFjcm9zc1xuICAgICAgICAgKiBuYXZpZ2F0aW9ucyBvciBpZiB0aGUgZWxlbWVudCBpcyBkZXRhY2hlZCBmcm9tIERPTS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKlxuICAgICAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgKiAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gICAgICAgICAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICAgKiAgIGxldCBjdXJyZW50VVJMO1xuICAgICAgICAgKiAgIHBhZ2VcbiAgICAgICAgICogICAgIC5tYWluRnJhbWUoKVxuICAgICAgICAgKiAgICAgLndhaXRGb3JTZWxlY3RvcignaW1nJylcbiAgICAgICAgICogICAgIC50aGVuKCgpID0+IGNvbnNvbGUubG9nKCdGaXJzdCBVUkwgd2l0aCBpbWFnZTogJyArIGN1cnJlbnRVUkwpKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICBmb3IgKGN1cnJlbnRVUkwgb2YgW1xuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZ29vZ2xlLmNvbScsXG4gICAgICAgICAqICAgICAnaHR0cHM6Ly9iYmMuY29tJyxcbiAgICAgICAgICogICBdKSB7XG4gICAgICAgICAqICAgICBhd2FpdCBwYWdlLmdvdG8oY3VycmVudFVSTCk7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIFRoZSBzZWxlY3RvciB0byBxdWVyeSBhbmQgd2FpdCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgY3VzdG9taXppbmcgd2FpdGluZyBiZWhhdmlvci5cbiAgICAgICAgICogQHJldHVybnMgQW4gZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqIEB0aHJvd3MgVGhyb3dzIGlmIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGRvZXNuJ3QgYXBwZWFyLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FpdEZvclNlbGVjdG9yKHNlbGVjdG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlZFNlbGVjdG9yLCBRdWVyeUhhbmRsZXIsIHBvbGxpbmcgfSA9IGdldFF1ZXJ5SGFuZGxlckFuZFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgUXVlcnlIYW5kbGVyLndhaXRGb3IodGhpcywgdXBkYXRlZFNlbGVjdG9yLCB7XG4gICAgICAgICAgICAgICAgcG9sbGluZyxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jICNjaGVja1Zpc2liaWxpdHkodmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXZhbHVhdGUoYXN5bmMgKGVsZW1lbnQsIFB1cHBldGVlclV0aWwsIHZpc2liaWxpdHkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihQdXBwZXRlZXJVdGlsLmNoZWNrVmlzaWJpbGl0eShlbGVtZW50LCB2aXNpYmlsaXR5KSk7XG4gICAgICAgICAgICB9LCBMYXp5QXJnLmNyZWF0ZShjb250ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgfSksIHZpc2liaWxpdHkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBlbGVtZW50IGlzIGNvbnNpZGVyZWQgdG8gYmUgdmlzaWJsZSBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBpc1xuICAgICAgICAgKiB0cnVlOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhc1xuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2dldENvbXB1dGVkU3R5bGUgfCBjb21wdXRlZCBzdHlsZXN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhcyBhIG5vbi1lbXB0eVxuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRCb3VuZGluZ0NsaWVudFJlY3QgfCBib3VuZGluZyBjbGllbnQgcmVjdH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIC0gdGhlIGVsZW1lbnQncyB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3Zpc2liaWxpdHkgfCB2aXNpYmlsaXR5fVxuICAgICAgICAgKiAgIGlzIG5vdCBgaGlkZGVuYCBvciBgY29sbGFwc2VgLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXNWaXNpYmxlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2NoZWNrVmlzaWJpbGl0eSh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gZWxlbWVudCBpcyBjb25zaWRlcmVkIHRvIGJlIGhpZGRlbiBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhcyBub1xuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2dldENvbXB1dGVkU3R5bGUgfCBjb21wdXRlZCBzdHlsZXN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhcyBhbiBlbXB0eVxuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRCb3VuZGluZ0NsaWVudFJlY3QgfCBib3VuZGluZyBjbGllbnQgcmVjdH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIC0gdGhlIGVsZW1lbnQncyB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3Zpc2liaWxpdHkgfCB2aXNpYmlsaXR5fVxuICAgICAgICAgKiAgIGlzIGBoaWRkZW5gIG9yIGBjb2xsYXBzZWAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpc0hpZGRlbigpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjaGVja1Zpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb252ZXJ0cyB0aGUgY3VycmVudCBoYW5kbGUgdG8gdGhlIGdpdmVuIGVsZW1lbnQgdHlwZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgZWxlbWVudDogRWxlbWVudEhhbmRsZTxFbGVtZW50PiA9IGF3YWl0IHBhZ2UuJChcbiAgICAgICAgICogICAnLmNsYXNzLW5hbWUtb2YtYW5jaG9yJ1xuICAgICAgICAgKiApO1xuICAgICAgICAgKiAvLyBETyBOT1QgRElTUE9TRSBgZWxlbWVudGAsIHRoaXMgd2lsbCBiZSBhbHdheXMgYmUgdGhlIHNhbWUgaGFuZGxlLlxuICAgICAgICAgKiBjb25zdCBhbmNob3I6IEVsZW1lbnRIYW5kbGU8SFRNTEFuY2hvckVsZW1lbnQ+ID1cbiAgICAgICAgICogICBhd2FpdCBlbGVtZW50LnRvRWxlbWVudCgnYScpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHRhZ05hbWUgLSBUaGUgdGFnIG5hbWUgb2YgdGhlIGRlc2lyZWQgZWxlbWVudCB0eXBlLlxuICAgICAgICAgKiBAdGhyb3dzIEFuIGVycm9yIGlmIHRoZSBoYW5kbGUgZG9lcyBub3QgbWF0Y2guICoqVGhlIGhhbmRsZSB3aWxsIG5vdCBiZVxuICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IGRpc3Bvc2VkLioqXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0b0VsZW1lbnQodGFnTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgaXNNYXRjaGluZ1RhZ05hbWUgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKChub2RlLCB0YWdOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUubm9kZU5hbWUgPT09IHRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH0sIHRhZ05hbWUpO1xuICAgICAgICAgICAgaWYgKCFpc01hdGNoaW5nVGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBpcyBub3QgYShuKSBcXGAke3RhZ05hbWV9XFxgIGVsZW1lbnRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBtaWRkbGUgcG9pbnQgd2l0aGluIGFuIGVsZW1lbnQgdW5sZXNzIGEgc3BlY2lmaWMgb2Zmc2V0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY2xpY2thYmxlUG9pbnQob2Zmc2V0KSB7XG4gICAgICAgICAgICBjb25zdCBib3ggPSBhd2FpdCB0aGlzLiNjbGlja2FibGVCb3goKTtcbiAgICAgICAgICAgIGlmICghYm94KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb2RlIGlzIGVpdGhlciBub3QgY2xpY2thYmxlIG9yIG5vdCBhbiBFbGVtZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB4OiBib3gueCArIG9mZnNldC54LFxuICAgICAgICAgICAgICAgICAgICB5OiBib3gueSArIG9mZnNldC55LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHg6IGJveC54ICsgYm94LndpZHRoIC8gMixcbiAgICAgICAgICAgICAgICB5OiBib3gueSArIGJveC5oZWlnaHQgLyAyLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2Qgc2Nyb2xscyBlbGVtZW50IGludG8gdmlldyBpZiBuZWVkZWQsIGFuZCB0aGVuXG4gICAgICAgICAqIHVzZXMge0BsaW5rIFBhZ2UubW91c2V9IHRvIGhvdmVyIG92ZXIgdGhlIGNlbnRlciBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICogSWYgdGhlIGVsZW1lbnQgaXMgZGV0YWNoZWQgZnJvbSBET00sIHRoZSBtZXRob2QgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaG92ZXIoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gYXdhaXQgdGhpcy5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkubW91c2UubW92ZSh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2Qgc2Nyb2xscyBlbGVtZW50IGludG8gdmlldyBpZiBuZWVkZWQsIGFuZCB0aGVuXG4gICAgICAgICAqIHVzZXMge0BsaW5rIFBhZ2UubW91c2V9IHRvIGNsaWNrIGluIHRoZSBjZW50ZXIgb2YgdGhlIGVsZW1lbnQuXG4gICAgICAgICAqIElmIHRoZSBlbGVtZW50IGlzIGRldGFjaGVkIGZyb20gRE9NLCB0aGUgbWV0aG9kIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNsaWNrKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQob3B0aW9ucy5vZmZzZXQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkubW91c2UuY2xpY2soeCwgeSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERyYWdzIGFuIGVsZW1lbnQgb3ZlciB0aGUgZ2l2ZW4gZWxlbWVudCBvciBwb2ludC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMgREVQUkVDQVRFRC4gV2hlbiBkcmFnIGludGVyY2VwdGlvbiBpcyBlbmFibGVkLCB0aGUgZHJhZyBwYXlsb2FkIGlzXG4gICAgICAgICAqIHJldHVybmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZHJhZyh0YXJnZXQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZnJhbWUucGFnZSgpO1xuICAgICAgICAgICAgaWYgKHBhZ2UuaXNEcmFnSW50ZXJjZXB0aW9uRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgdGhpcy5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGF3YWl0IHRhcmdldC5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcGFnZS5tb3VzZS5kcmFnKHNvdXJjZSwgdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWdlLl9pc0RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UuX2lzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhvdmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UuZG93bigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0YXJnZXQuaG92ZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UubW92ZSh0YXJnZXQueCwgdGFyZ2V0LnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHBhZ2UuX2lzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZS4gYGRyYWdlbnRlcmAgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHBlcmZvcm1lZCBkdXJpbmcgZHJhZ2dpbmcuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkcmFnRW50ZXIoZGF0YSA9IHsgaXRlbXM6IFtdLCBkcmFnT3BlcmF0aW9uc01hc2s6IDEgfSkge1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZnJhbWUucGFnZSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmNsaWNrYWJsZVBvaW50KCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLm1vdXNlLmRyYWdFbnRlcih0YXJnZXQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlLiBgZHJhZ292ZXJgIHdpbGwgYXV0b21hdGljYWxseSBiZSBwZXJmb3JtZWQgZHVyaW5nIGRyYWdnaW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZHJhZ092ZXIoZGF0YSA9IHsgaXRlbXM6IFtdLCBkcmFnT3BlcmF0aW9uc01hc2s6IDEgfSkge1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZnJhbWUucGFnZSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmNsaWNrYWJsZVBvaW50KCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLm1vdXNlLmRyYWdPdmVyKHRhcmdldCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZHJvcChkYXRhT3JFbGVtZW50ID0ge1xuICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgZHJhZ09wZXJhdGlvbnNNYXNrOiAxLFxuICAgICAgICB9KSB7XG4gICAgICAgICAgICBjb25zdCBwYWdlID0gdGhpcy5mcmFtZS5wYWdlKCk7XG4gICAgICAgICAgICBpZiAoJ2l0ZW1zJyBpbiBkYXRhT3JFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBhd2FpdCB0aGlzLmNsaWNrYWJsZVBvaW50KCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5tb3VzZS5kcm9wKGRlc3RpbmF0aW9uLCBkYXRhT3JFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vdGUgaWYgdGhlIHJlc3QgZXJyb3JzLCB3ZSBzdGlsbCB3YW50IGRyYWdnaW5nIG9mZiBiZWNhdXNlIHRoZSBlcnJvcnNcbiAgICAgICAgICAgICAgICAvLyBpcyBtb3N0IGxpa2VseSBzb21ldGhpbmcgaW1wbHlpbmcgdGhlIG1vdXNlIGlzIG5vIGxvbmdlciBkcmFnZ2luZy5cbiAgICAgICAgICAgICAgICBhd2FpdCBkYXRhT3JFbGVtZW50LmRyYWcodGhpcyk7XG4gICAgICAgICAgICAgICAgcGFnZS5faXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UudXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGBFbGVtZW50SGFuZGxlLmRyb3BgIGluc3RlYWQuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkcmFnQW5kRHJvcCh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmZyYW1lLnBhZ2UoKTtcbiAgICAgICAgICAgIGFzc2VydChwYWdlLmlzRHJhZ0ludGVyY2VwdGlvbkVuYWJsZWQoKSwgJ0RyYWcgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCBzdGFydFBvaW50ID0gYXdhaXQgdGhpcy5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0UG9pbnQgPSBhd2FpdCB0YXJnZXQuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UuZHJhZ0FuZERyb3Aoc3RhcnRQb2ludCwgdGFyZ2V0UG9pbnQsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmlnZ2VycyBhIGBjaGFuZ2VgIGFuZCBgaW5wdXRgIGV2ZW50IG9uY2UgYWxsIHRoZSBwcm92aWRlZCBvcHRpb25zIGhhdmUgYmVlblxuICAgICAgICAgKiBzZWxlY3RlZC4gSWYgdGhlcmUncyBubyBgPHNlbGVjdD5gIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCwgdGhlIG1ldGhvZFxuICAgICAgICAgKiB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGhhbmRsZS5zZWxlY3QoJ2JsdWUnKTsgLy8gc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgKiBoYW5kbGUuc2VsZWN0KCdyZWQnLCAnZ3JlZW4nLCAnYmx1ZScpOyAvLyBtdWx0aXBsZSBzZWxlY3Rpb25zXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdmFsdWVzIC0gVmFsdWVzIG9mIG9wdGlvbnMgdG8gc2VsZWN0LiBJZiB0aGUgYDxzZWxlY3Q+YCBoYXMgdGhlXG4gICAgICAgICAqIGBtdWx0aXBsZWAgYXR0cmlidXRlLCBhbGwgdmFsdWVzIGFyZSBjb25zaWRlcmVkLCBvdGhlcndpc2Ugb25seSB0aGUgZmlyc3RcbiAgICAgICAgICogb25lIGlzIHRha2VuIGludG8gYWNjb3VudC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNlbGVjdCguLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGlzU3RyaW5nKHZhbHVlKSwgJ1ZhbHVlcyBtdXN0IGJlIHN0cmluZ3MuIEZvdW5kIHZhbHVlIFwiJyArXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiIG9mIHR5cGUgXCInICtcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ldmFsdWF0ZSgoZWxlbWVudCwgdmFscykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBTZXQodmFscyk7XG4gICAgICAgICAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnQgaXMgbm90IGEgPHNlbGVjdD4gZWxlbWVudC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGVsZW1lbnQub3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmhhcyhvcHRpb24udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFZhbHVlcy5hZGQob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB2YWx1ZXMuaGFzKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMuYWRkKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5zZWxlY3RlZFZhbHVlcy52YWx1ZXMoKV07XG4gICAgICAgICAgICB9LCB2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBzY3JvbGxzIGVsZW1lbnQgaW50byB2aWV3IGlmIG5lZWRlZCwgYW5kIHRoZW4gdXNlc1xuICAgICAgICAgKiB7QGxpbmsgVG91Y2hzY3JlZW4udGFwfSB0byB0YXAgaW4gdGhlIGNlbnRlciBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICogSWYgdGhlIGVsZW1lbnQgaXMgZGV0YWNoZWQgZnJvbSBET00sIHRoZSBtZXRob2QgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdGFwKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLnRvdWNoc2NyZWVuLnRhcCh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyB0b3VjaFN0YXJ0KCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLnRvdWNoc2NyZWVuLnRvdWNoU3RhcnQoeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgdG91Y2hNb3ZlKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLnRvdWNoc2NyZWVuLnRvdWNoTW92ZSh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyB0b3VjaEVuZCgpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkudG91Y2hzY3JlZW4udG91Y2hFbmQoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbHMge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9mb2N1cyB8IGZvY3VzfSBvbiB0aGUgZWxlbWVudC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZvY3VzKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZvY3VzIG5vbi1IVE1MRWxlbWVudCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvY3VzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGVuIHNlbmRzIGEgYGtleWRvd25gLCBga2V5cHJlc3NgL2BpbnB1dGAsIGFuZFxuICAgICAgICAgKiBga2V5dXBgIGV2ZW50IGZvciBlYWNoIGNoYXJhY3RlciBpbiB0aGUgdGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogVG8gcHJlc3MgYSBzcGVjaWFsIGtleSwgbGlrZSBgQ29udHJvbGAgb3IgYEFycm93RG93bmAsXG4gICAgICAgICAqIHVzZSB7QGxpbmsgRWxlbWVudEhhbmRsZS5wcmVzc30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGF3YWl0IGVsZW1lbnRIYW5kbGUudHlwZSgnSGVsbG8nKTsgLy8gVHlwZXMgaW5zdGFudGx5XG4gICAgICAgICAqIGF3YWl0IGVsZW1lbnRIYW5kbGUudHlwZSgnV29ybGQnLCB7ZGVsYXk6IDEwMH0pOyAvLyBUeXBlcyBzbG93ZXIsIGxpa2UgYSB1c2VyXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBBbiBleGFtcGxlIG9mIHR5cGluZyBpbnRvIGEgdGV4dCBmaWVsZCBhbmQgdGhlbiBzdWJtaXR0aW5nIHRoZSBmb3JtOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBlbGVtZW50SGFuZGxlID0gYXdhaXQgcGFnZS4kKCdpbnB1dCcpO1xuICAgICAgICAgKiBhd2FpdCBlbGVtZW50SGFuZGxlLnR5cGUoJ3NvbWUgdGV4dCcpO1xuICAgICAgICAgKiBhd2FpdCBlbGVtZW50SGFuZGxlLnByZXNzKCdFbnRlcicpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBEZWxheSBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0eXBlKHRleHQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLmtleWJvYXJkLnR5cGUodGV4dCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvY3VzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGVuIHVzZXMge0BsaW5rIEtleWJvYXJkLmRvd259IGFuZCB7QGxpbmsgS2V5Ym9hcmQudXB9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiBga2V5YCBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgYW5kIG5vIG1vZGlmaWVyIGtleXMgYmVzaWRlcyBgU2hpZnRgXG4gICAgICAgICAqIGFyZSBiZWluZyBoZWxkIGRvd24sIGEgYGtleXByZXNzYC9gaW5wdXRgIGV2ZW50IHdpbGwgYWxzbyBiZSBnZW5lcmF0ZWQuXG4gICAgICAgICAqIFRoZSBgdGV4dGAgb3B0aW9uIGNhbiBiZSBzcGVjaWZpZWQgdG8gZm9yY2UgYW4gaW5wdXQgZXZlbnQgdG8gYmUgZ2VuZXJhdGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5PVEUqKiBNb2RpZmllciBrZXlzIERPIGFmZmVjdCBgZWxlbWVudEhhbmRsZS5wcmVzc2AuIEhvbGRpbmcgZG93biBgU2hpZnRgXG4gICAgICAgICAqIHdpbGwgdHlwZSB0aGUgdGV4dCBpbiB1cHBlciBjYXNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ga2V5IC0gTmFtZSBvZiBrZXkgdG8gcHJlc3MsIHN1Y2ggYXMgYEFycm93TGVmdGAuXG4gICAgICAgICAqIFNlZSB7QGxpbmsgS2V5SW5wdXR9IGZvciBhIGxpc3Qgb2YgYWxsIGtleSBuYW1lcy5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByZXNzKGtleSwgb3B0aW9ucykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkua2V5Ym9hcmQucHJlc3Moa2V5LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyAjY2xpY2thYmxlQm94KCkge1xuICAgICAgICAgICAgY29uc3QgYm94ZXMgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5lbGVtZW50LmdldENsaWVudFJlY3RzKCldLm1hcChyZWN0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgeDogcmVjdC54LCB5OiByZWN0LnksIHdpZHRoOiByZWN0LndpZHRoLCBoZWlnaHQ6IHJlY3QuaGVpZ2h0IH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghYm94ZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy4jaW50ZXJzZWN0Qm91bmRpbmdCb3hlc1dpdGhGcmFtZShib3hlcyk7XG4gICAgICAgICAgICBsZXQgZnJhbWUgPSB0aGlzLmZyYW1lO1xuICAgICAgICAgICAgbGV0IHBhcmVudEZyYW1lO1xuICAgICAgICAgICAgd2hpbGUgKChwYXJlbnRGcmFtZSA9IGZyYW1lPy5wYXJlbnRGcmFtZSgpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8zLCBhd2FpdCBmcmFtZS5mcmFtZUVsZW1lbnQoKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBmcmFtZSB0eXBlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Qm94ID0gYXdhaXQgaGFuZGxlLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxlbWVudCBpcyBub3QgdmlzaWJsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0LCAxMCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChzdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHJlY3QudG9wICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUucGFkZGluZ1RvcCwgMTApICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUuYm9yZGVyVG9wV2lkdGgsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudEJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBib3ggb2YgYm94ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJveC54ICs9IHBhcmVudEJveC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYm94LnkgKz0gcGFyZW50Qm94LnRvcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUuI2ludGVyc2VjdEJvdW5kaW5nQm94ZXNXaXRoRnJhbWUoYm94ZXMpO1xuICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IHBhcmVudEZyYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8zKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudl8zLmVycm9yID0gZV8zO1xuICAgICAgICAgICAgICAgICAgICBlbnZfMy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGJveGVzLmZpbmQoYm94ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYm94LndpZHRoID49IDEgJiYgYm94LmhlaWdodCA+PSAxO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWJveCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB4OiBib3gueCxcbiAgICAgICAgICAgICAgICB5OiBib3gueSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGJveC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGJveC53aWR0aCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgI2ludGVyc2VjdEJvdW5kaW5nQm94ZXNXaXRoRnJhbWUoYm94ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZG9jdW1lbnRXaWR0aCwgZG9jdW1lbnRIZWlnaHQgfSA9IGF3YWl0IHRoaXMuZnJhbWVcbiAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudFdpZHRoOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50SGVpZ2h0OiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0Qm91bmRpbmdCb3goYm94LCBkb2N1bWVudFdpZHRoLCBkb2N1bWVudEhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgZWxlbWVudCAocmVsYXRpdmUgdG8gdGhlIG1haW4gZnJhbWUpLFxuICAgICAgICAgKiBvciBgbnVsbGAgaWYgdGhlIGVsZW1lbnQgaXMge0BsaW5rIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtZGlzcGxheS00LyNib3gtZ2VuZXJhdGlvbiB8IG5vdCBwYXJ0IG9mIHRoZSBsYXlvdXR9XG4gICAgICAgICAqIChleGFtcGxlOiBgZGlzcGxheTogbm9uZWApLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYm91bmRpbmdCb3goKSB7XG4gICAgICAgICAgICBjb25zdCBib3ggPSBhd2FpdCB0aGlzLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRWxlbWVudCBpcyBub3QgdmlzaWJsZS5cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgeDogcmVjdC54LCB5OiByZWN0LnksIHdpZHRoOiByZWN0LndpZHRoLCBoZWlnaHQ6IHJlY3QuaGVpZ2h0IH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghYm94KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBhd2FpdCB0aGlzLiNnZXRUb3BMZWZ0Q29ybmVyT2ZGcmFtZSgpO1xuICAgICAgICAgICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgeDogYm94LnggKyBvZmZzZXQueCxcbiAgICAgICAgICAgICAgICB5OiBib3gueSArIG9mZnNldC55LFxuICAgICAgICAgICAgICAgIGhlaWdodDogYm94LmhlaWdodCxcbiAgICAgICAgICAgICAgICB3aWR0aDogYm94LndpZHRoLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBib3hlcyBvZiB0aGUgZWxlbWVudCxcbiAgICAgICAgICogb3IgYG51bGxgIGlmIHRoZSBlbGVtZW50IGlzIHtAbGluayBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLWRpc3BsYXktNC8jYm94LWdlbmVyYXRpb24gfCBub3QgcGFydCBvZiB0aGUgbGF5b3V0fVxuICAgICAgICAgKiAoZXhhbXBsZTogYGRpc3BsYXk6IG5vbmVgKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogQm94ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIHBvaW50cztcbiAgICAgICAgICogRWFjaCBQb2ludCBpcyBhbiBvYmplY3QgYHt4LCB5fWAuIEJveCBwb2ludHMgYXJlIHNvcnRlZCBjbG9jay13aXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYm94TW9kZWwoKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGlzIG5vdCB2aXNpYmxlLlxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0LCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdUb3AsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBwYXJzZUludChzdHlsZS5wYWRkaW5nUmlnaHQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcGFyc2VJbnQoc3R5bGUucGFkZGluZ0JvdHRvbSwgMTApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IC1wYXJzZUludChzdHlsZS5tYXJnaW5MZWZ0LCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IC1wYXJzZUludChzdHlsZS5tYXJnaW5Ub3AsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAtcGFyc2VJbnQoc3R5bGUubWFyZ2luUmlnaHQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogLXBhcnNlSW50KHN0eWxlLm1hcmdpbkJvdHRvbSwgMTApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHBhcnNlSW50KHN0eWxlLmJvcmRlckxlZnQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcGFyc2VJbnQoc3R5bGUuYm9yZGVyVG9wLCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodDogcGFyc2VJbnQoc3R5bGUuYm9yZGVyUmlnaHQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcGFyc2VJbnQoc3R5bGUuYm9yZGVyQm90dG9tLCAxMCksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXIgPSBbXG4gICAgICAgICAgICAgICAgICAgIHsgeDogcmVjdC5sZWZ0LCB5OiByZWN0LnRvcCB9LFxuICAgICAgICAgICAgICAgICAgICB7IHg6IHJlY3QubGVmdCArIHJlY3Qud2lkdGgsIHk6IHJlY3QudG9wIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCwgeTogcmVjdC50b3AgKyByZWN0LmJvdHRvbSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHg6IHJlY3QubGVmdCwgeTogcmVjdC50b3AgKyByZWN0LmJvdHRvbSB9LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHRyYW5zZm9ybVF1YWRXaXRoT2Zmc2V0cyhib3JkZXIsIG9mZnNldHMuYm9yZGVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdHJhbnNmb3JtUXVhZFdpdGhPZmZzZXRzKHBhZGRpbmcsIG9mZnNldHMucGFkZGluZyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFyZ2luID0gdHJhbnNmb3JtUXVhZFdpdGhPZmZzZXRzKGJvcmRlciwgb2Zmc2V0cy5tYXJnaW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcixcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVF1YWRXaXRoT2Zmc2V0cyhxdWFkLCBvZmZzZXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogcXVhZFswXS54ICsgb2Zmc2V0cy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHF1YWRbMF0ueSArIG9mZnNldHMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBxdWFkWzFdLnggLSBvZmZzZXRzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHF1YWRbMV0ueSArIG9mZnNldHMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBxdWFkWzJdLnggLSBvZmZzZXRzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHF1YWRbMl0ueSAtIG9mZnNldHMuYm90dG9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBxdWFkWzNdLnggKyBvZmZzZXRzLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogcXVhZFszXS55IC0gb2Zmc2V0cy5ib3R0b20sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYXdhaXQgdGhpcy4jZ2V0VG9wTGVmdENvcm5lck9mRnJhbWUoKTtcbiAgICAgICAgICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBbXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICdwYWRkaW5nJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyJyxcbiAgICAgICAgICAgICAgICAnbWFyZ2luJyxcbiAgICAgICAgICAgIF0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIG1vZGVsW2F0dHJpYnV0ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQueCArPSBvZmZzZXQueDtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQueSArPSBvZmZzZXQueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgI2dldFRvcExlZnRDb3JuZXJPZkZyYW1lKCkge1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgICAgIGxldCBmcmFtZSA9IHRoaXMuZnJhbWU7XG4gICAgICAgICAgICBsZXQgcGFyZW50RnJhbWU7XG4gICAgICAgICAgICB3aGlsZSAoKHBhcmVudEZyYW1lID0gZnJhbWU/LnBhcmVudEZyYW1lKCkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52XzQgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzQsIGF3YWl0IGZyYW1lLmZyYW1lRWxlbWVudCgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGZyYW1lIHR5cGUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRCb3ggPSBhd2FpdCBoYW5kbGUuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGlzIG5vdCB2aXNpYmxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQsIDEwKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHN0eWxlLmJvcmRlckxlZnRXaWR0aCwgMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcmVjdC50b3AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChzdHlsZS5wYWRkaW5nVG9wLCAxMCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChzdHlsZS5ib3JkZXJUb3BXaWR0aCwgMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50Qm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwb2ludC54ICs9IHBhcmVudEJveC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICBwb2ludC55ICs9IHBhcmVudEJveC50b3A7XG4gICAgICAgICAgICAgICAgICAgIGZyYW1lID0gcGFyZW50RnJhbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzQpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52XzQuZXJyb3IgPSBlXzQ7XG4gICAgICAgICAgICAgICAgICAgIGVudl80Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBvaW50O1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHNjcmVlbnNob3Qob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHNjcm9sbEludG9WaWV3ID0gdHJ1ZSwgY2xpcCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmZyYW1lLnBhZ2UoKTtcbiAgICAgICAgICAgIC8vIE9ubHkgc2Nyb2xsIHRoZSBlbGVtZW50IGludG8gdmlldyBpZiB0aGUgdXNlciB3YW50cyBpdC5cbiAgICAgICAgICAgIGlmIChzY3JvbGxJbnRvVmlldykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZWxlbWVudENsaXAgPSBhd2FpdCB0aGlzLiNub25FbXB0eVZpc2libGVCb3VuZGluZ0JveCgpO1xuICAgICAgICAgICAgY29uc3QgW3BhZ2VMZWZ0LCBwYWdlVG9wXSA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghd2luZG93LnZpc3VhbFZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2luZG93LnZpc3VhbFZpZXdwb3J0IGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy52aXN1YWxWaWV3cG9ydC5wYWdlTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnZpc3VhbFZpZXdwb3J0LnBhZ2VUb3AsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxlbWVudENsaXAueCArPSBwYWdlTGVmdDtcbiAgICAgICAgICAgIGVsZW1lbnRDbGlwLnkgKz0gcGFnZVRvcDtcbiAgICAgICAgICAgIGlmIChjbGlwKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAueCArPSBjbGlwLng7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAueSArPSBjbGlwLnk7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAuaGVpZ2h0ID0gY2xpcC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAud2lkdGggPSBjbGlwLndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IC4uLm9wdGlvbnMsIGNsaXA6IGVsZW1lbnRDbGlwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jICNub25FbXB0eVZpc2libGVCb3VuZGluZ0JveCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGF3YWl0IHRoaXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgIGFzc2VydChib3gsICdOb2RlIGlzIGVpdGhlciBub3QgdmlzaWJsZSBvciBub3QgYW4gSFRNTEVsZW1lbnQnKTtcbiAgICAgICAgICAgIGFzc2VydChib3gud2lkdGggIT09IDAsICdOb2RlIGhhcyAwIHdpZHRoLicpO1xuICAgICAgICAgICAgYXNzZXJ0KGJveC5oZWlnaHQgIT09IDAsICdOb2RlIGhhcyAwIGhlaWdodC4nKTtcbiAgICAgICAgICAgIHJldHVybiBib3g7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXJ0Q29ubmVjdGVkRWxlbWVudCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShhc3luYyAoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05vZGUgaXMgZGV0YWNoZWQgZnJvbSBkb2N1bWVudCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05vZGUgaXMgbm90IG9mIHR5cGUgSFRNTEVsZW1lbnQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpIHtcbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmlzSW50ZXJzZWN0aW5nVmlld3BvcnQoe1xuICAgICAgICAgICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gdGhlIGN1cnJlbnQgdmlld3BvcnQuIElmIGFuXG4gICAgICAgICAqIGVsZW1lbnQgaXMgYW4gU1ZHLCB3ZSBjaGVjayBpZiB0aGUgc3ZnIG93bmVyIGVsZW1lbnQgaXMgaW4gdGhlIHZpZXdwb3J0XG4gICAgICAgICAqIGluc3RlYWQuIFNlZSBodHRwczovL2NyYnVnLmNvbS85NjMyNDYuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhyZXNob2xkIGZvciB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gMCAobm8gaW50ZXJzZWN0aW9uKSBhbmQgMVxuICAgICAgICAgKiAoZnVsbCBpbnRlcnNlY3Rpb24pLiBEZWZhdWx0cyB0byAxLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXNJbnRlcnNlY3RpbmdWaWV3cG9ydChvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl81ID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydENvbm5lY3RlZEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnVsZXNkaXIvdXNlLXVzaW5nIC0tIFJldHVybnMgYHRoaXNgLlxuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IGF3YWl0IHRoaXMuI2FzU1ZHRWxlbWVudEhhbmRsZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl81LCBoYW5kbGUgJiYgKGF3YWl0IGhhbmRsZS4jZ2V0T3duZXJTVkdFbGVtZW50KCkpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0ICh0YXJnZXQgPz8gdGhpcykuZXZhbHVhdGUoYXN5bmMgKGVsZW1lbnQsIHRocmVzaG9sZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXNpYmxlUmF0aW8gPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW50cmllc1swXS5pbnRlcnNlY3Rpb25SYXRpbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZCA9PT0gMSA/IHZpc2libGVSYXRpbyA9PT0gMSA6IHZpc2libGVSYXRpbyA+IHRocmVzaG9sZDtcbiAgICAgICAgICAgICAgICB9LCBvcHRpb25zLnRocmVzaG9sZCA/PyAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzUpIHtcbiAgICAgICAgICAgICAgICBlbnZfNS5lcnJvciA9IGVfNTtcbiAgICAgICAgICAgICAgICBlbnZfNS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTY3JvbGxzIHRoZSBlbGVtZW50IGludG8gdmlldyB1c2luZyBlaXRoZXIgdGhlIGF1dG9tYXRpb24gcHJvdG9jb2wgY2xpZW50XG4gICAgICAgICAqIG9yIGJ5IGNhbGxpbmcgZWxlbWVudC5zY3JvbGxJbnRvVmlldy5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNjcm9sbEludG9WaWV3KCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRDb25uZWN0ZWRFbGVtZW50KCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGFzeW5jIChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW4gZWxlbWVudCBpcyBhbiBTVkdFbGVtZW50IChpbmNsdWRlZCBzdmcsIHBhdGgsIHJlY3RcbiAgICAgICAgICogZXRjLikuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAjYXNTVkdFbGVtZW50SGFuZGxlKCkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBTVkdFbGVtZW50O1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jICNnZXRPd25lclNWR0VsZW1lbnQoKSB7XG4gICAgICAgICAgICAvLyBTVkdTVkdFbGVtZW50Lm93bmVyU1ZHRWxlbWVudCA9PT0gbnVsbC5cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV2YWx1YXRlSGFuZGxlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU1ZHU1ZHRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQub3duZXJTVkdFbGVtZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IEVsZW1lbnRIYW5kbGUgfTtcbmZ1bmN0aW9uIGludGVyc2VjdEJvdW5kaW5nQm94KGJveCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGJveC53aWR0aCA9IE1hdGgubWF4KGJveC54ID49IDBcbiAgICAgICAgPyBNYXRoLm1pbih3aWR0aCAtIGJveC54LCBib3gud2lkdGgpXG4gICAgICAgIDogTWF0aC5taW4od2lkdGgsIGJveC53aWR0aCArIGJveC54KSwgMCk7XG4gICAgYm94LmhlaWdodCA9IE1hdGgubWF4KGJveC55ID49IDBcbiAgICAgICAgPyBNYXRoLm1pbihoZWlnaHQgLSBib3gueSwgYm94LmhlaWdodClcbiAgICAgICAgOiBNYXRoLm1pbihoZWlnaHQsIGJveC5oZWlnaHQgKyBib3gueSksIDApO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RWxlbWVudEhhbmRsZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IF9pc0VsZW1lbnRIYW5kbGUgPSBTeW1ib2woJ19pc0VsZW1lbnRIYW5kbGUnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVsZW1lbnRIYW5kbGVTeW1ib2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudmlyb25tZW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG52YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvciB9IGZyb20gJy4uL2NvbW1vbi9HZXRRdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgdHJhbnNwb3NlSXRlcmFibGVIYW5kbGUgfSBmcm9tICcuLi9jb21tb24vSGFuZGxlSXRlcmF0b3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0RlNQcm9taXNlcywgd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyB0aHJvd0lmRGlzcG9zZWQgfSBmcm9tICcuLi91dGlsL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25Mb2NhdG9yLCBOb2RlTG9jYXRvciwgfSBmcm9tICcuL2xvY2F0b3JzL2xvY2F0b3JzLmpzJztcbi8qKlxuICogV2UgdXNlIHN5bWJvbHMgdG8gcHJldmVudCBleHRlcm5hbCBwYXJ0aWVzIGxpc3RlbmluZyB0byB0aGVzZSBldmVudHMuXG4gKiBUaGV5IGFyZSBpbnRlcm5hbCB0byBQdXBwZXRlZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIEZyYW1lRXZlbnQ7XG4oZnVuY3Rpb24gKEZyYW1lRXZlbnQpIHtcbiAgICBGcmFtZUV2ZW50LkZyYW1lTmF2aWdhdGVkID0gU3ltYm9sKCdGcmFtZS5GcmFtZU5hdmlnYXRlZCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkID0gU3ltYm9sKCdGcmFtZS5GcmFtZVN3YXBwZWQnKTtcbiAgICBGcmFtZUV2ZW50LkxpZmVjeWNsZUV2ZW50ID0gU3ltYm9sKCdGcmFtZS5MaWZlY3ljbGVFdmVudCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCA9IFN5bWJvbCgnRnJhbWUuRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVEZXRhY2hlZCA9IFN5bWJvbCgnRnJhbWUuRnJhbWVEZXRhY2hlZCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkQnlBY3RpdmF0aW9uID0gU3ltYm9sKCdGcmFtZS5GcmFtZVN3YXBwZWRCeUFjdGl2YXRpb24nKTtcbn0pKEZyYW1lRXZlbnQgfHwgKEZyYW1lRXZlbnQgPSB7fSkpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHRocm93SWZEZXRhY2hlZCA9IHRocm93SWZEaXNwb3NlZChmcmFtZSA9PiB7XG4gICAgcmV0dXJuIGBBdHRlbXB0ZWQgdG8gdXNlIGRldGFjaGVkIEZyYW1lICcke2ZyYW1lLl9pZH0nLmA7XG59KTtcbi8qKlxuICogUmVwcmVzZW50cyBhIERPTSBmcmFtZS5cbiAqXG4gKiBUbyB1bmRlcnN0YW5kIGZyYW1lcywgeW91IGNhbiB0aGluayBvZiBmcmFtZXMgYXMgYDxpZnJhbWU+YCBlbGVtZW50cy4gSnVzdFxuICogbGlrZSBpZnJhbWVzLCBmcmFtZXMgY2FuIGJlIG5lc3RlZCwgYW5kIHdoZW4gSmF2YVNjcmlwdCBpcyBleGVjdXRlZCBpbiBhXG4gKiBmcmFtZSwgdGhlIEphdmFTY3JpcHQgZG9lcyBub3QgZWZmZWN0IGZyYW1lcyBpbnNpZGUgdGhlIGFtYmllbnQgZnJhbWUgdGhlXG4gKiBKYXZhU2NyaXB0IGV4ZWN1dGVzIGluLlxuICpcbiAqIEBleGFtcGxlXG4gKiBBdCBhbnkgcG9pbnQgaW4gdGltZSwge0BsaW5rIFBhZ2UgfCBwYWdlc30gZXhwb3NlIHRoZWlyIGN1cnJlbnQgZnJhbWVcbiAqIHRyZWUgdmlhIHRoZSB7QGxpbmsgUGFnZS5tYWluRnJhbWV9IGFuZCB7QGxpbmsgRnJhbWUuY2hpbGRGcmFtZXN9IG1ldGhvZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIEFuIGV4YW1wbGUgb2YgZHVtcGluZyBmcmFtZSB0cmVlOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gKlxuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20vY2hyb21lL2Jyb3dzZXIvY2FuYXJ5Lmh0bWwnKTtcbiAqICAgZHVtcEZyYW1lVHJlZShwYWdlLm1haW5GcmFtZSgpLCAnJyk7XG4gKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqXG4gKiAgIGZ1bmN0aW9uIGR1bXBGcmFtZVRyZWUoZnJhbWUsIGluZGVudCkge1xuICogICAgIGNvbnNvbGUubG9nKGluZGVudCArIGZyYW1lLnVybCgpKTtcbiAqICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZyYW1lLmNoaWxkRnJhbWVzKCkpIHtcbiAqICAgICAgIGR1bXBGcmFtZVRyZWUoY2hpbGQsIGluZGVudCArICcgICcpO1xuICogICAgIH1cbiAqICAgfVxuICogfSkoKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBBbiBleGFtcGxlIG9mIGdldHRpbmcgdGV4dCBmcm9tIGFuIGlmcmFtZSBlbGVtZW50OlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBmcmFtZSA9IHBhZ2UuZnJhbWVzKCkuZmluZChmcmFtZSA9PiBmcmFtZS5uYW1lKCkgPT09ICdteWZyYW1lJyk7XG4gKiBjb25zdCB0ZXh0ID0gYXdhaXQgZnJhbWUuJGV2YWwoJy5zZWxlY3RvcicsIGVsZW1lbnQgPT4gZWxlbWVudC50ZXh0Q29udGVudCk7XG4gKiBjb25zb2xlLmxvZyh0ZXh0KTtcbiAqIGBgYFxuICpcbiAqIEByZW1hcmtzXG4gKiBGcmFtZSBsaWZlY3ljbGVzIGFyZSBjb250cm9sbGVkIGJ5IHRocmVlIGV2ZW50cyB0aGF0IGFyZSBhbGwgZGlzcGF0Y2hlZCBvblxuICogdGhlIHBhcmVudCB7QGxpbmsgRnJhbWUucGFnZSB8IHBhZ2V9OlxuICpcbiAqIC0ge0BsaW5rIFBhZ2VFdmVudC5GcmFtZUF0dGFjaGVkfVxuICogLSB7QGxpbmsgUGFnZUV2ZW50LkZyYW1lTmF2aWdhdGVkfVxuICogLSB7QGxpbmsgUGFnZUV2ZW50LkZyYW1lRGV0YWNoZWR9XG4gKlxuICogQHB1YmxpY1xuICovXG5sZXQgRnJhbWUgPSAoKCkgPT4ge1xuICAgIGxldCBfY2xhc3NTdXBlciA9IEV2ZW50RW1pdHRlcjtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX2ZyYW1lRWxlbWVudF9kZWNvcmF0b3JzO1xuICAgIGxldCBfZXZhbHVhdGVIYW5kbGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX2V2YWx1YXRlX2RlY29yYXRvcnM7XG4gICAgbGV0IF9sb2NhdG9yX2RlY29yYXRvcnM7XG4gICAgbGV0IF8kX2RlY29yYXRvcnM7XG4gICAgbGV0IF8kJF9kZWNvcmF0b3JzO1xuICAgIGxldCBfJGV2YWxfZGVjb3JhdG9ycztcbiAgICBsZXQgXyQkZXZhbF9kZWNvcmF0b3JzO1xuICAgIGxldCBfd2FpdEZvclNlbGVjdG9yX2RlY29yYXRvcnM7XG4gICAgbGV0IF93YWl0Rm9yRnVuY3Rpb25fZGVjb3JhdG9ycztcbiAgICBsZXQgX2NvbnRlbnRfZGVjb3JhdG9ycztcbiAgICBsZXQgX2FkZFNjcmlwdFRhZ19kZWNvcmF0b3JzO1xuICAgIGxldCBfYWRkU3R5bGVUYWdfZGVjb3JhdG9ycztcbiAgICBsZXQgX2NsaWNrX2RlY29yYXRvcnM7XG4gICAgbGV0IF9mb2N1c19kZWNvcmF0b3JzO1xuICAgIGxldCBfaG92ZXJfZGVjb3JhdG9ycztcbiAgICBsZXQgX3NlbGVjdF9kZWNvcmF0b3JzO1xuICAgIGxldCBfdGFwX2RlY29yYXRvcnM7XG4gICAgbGV0IF90eXBlX2RlY29yYXRvcnM7XG4gICAgbGV0IF90aXRsZV9kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBGcmFtZSBleHRlbmRzIF9jbGFzc1N1cGVyIHtcbiAgICAgICAgc3RhdGljIHtcbiAgICAgICAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7XG4gICAgICAgICAgICBfZnJhbWVFbGVtZW50X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9ldmFsdWF0ZUhhbmRsZV9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfZXZhbHVhdGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX2xvY2F0b3JfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgXyRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgXyQkX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF8kZXZhbF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfJCRldmFsX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF93YWl0Rm9yU2VsZWN0b3JfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX3dhaXRGb3JGdW5jdGlvbl9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfY29udGVudF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfYWRkU2NyaXB0VGFnX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9hZGRTdHlsZVRhZ19kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfY2xpY2tfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX2ZvY3VzX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9ob3Zlcl9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfc2VsZWN0X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF90YXBfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX3RpdGxlX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZnJhbWVFbGVtZW50X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJmcmFtZUVsZW1lbnRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImZyYW1lRWxlbWVudFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmZyYW1lRWxlbWVudCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZXZhbHVhdGVIYW5kbGVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImV2YWx1YXRlSGFuZGxlXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJldmFsdWF0ZUhhbmRsZVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmV2YWx1YXRlSGFuZGxlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9ldmFsdWF0ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZXZhbHVhdGVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImV2YWx1YXRlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZXZhbHVhdGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2xvY2F0b3JfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImxvY2F0b3JcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImxvY2F0b3JcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5sb2NhdG9yIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF8kX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIkXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCIkXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouJCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfJCRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiQkXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCIkJFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiQkIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF8kZXZhbF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiJGV2YWxcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIiRldmFsXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouJGV2YWwgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgXyQkZXZhbF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiJCRldmFsXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCIkJGV2YWxcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai4kJGV2YWwgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JTZWxlY3Rvcl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwid2FpdEZvclNlbGVjdG9yXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ3YWl0Rm9yU2VsZWN0b3JcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yU2VsZWN0b3IgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JGdW5jdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwid2FpdEZvckZ1bmN0aW9uXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ3YWl0Rm9yRnVuY3Rpb25cIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yRnVuY3Rpb24gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2NvbnRlbnRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImNvbnRlbnRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImNvbnRlbnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5jb250ZW50IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9hZGRTY3JpcHRUYWdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImFkZFNjcmlwdFRhZ1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiYWRkU2NyaXB0VGFnXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYWRkU2NyaXB0VGFnIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9hZGRTdHlsZVRhZ19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiYWRkU3R5bGVUYWdcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImFkZFN0eWxlVGFnXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYWRkU3R5bGVUYWcgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2NsaWNrX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJjbGlja1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiY2xpY2tcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5jbGljayB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZm9jdXNfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImZvY3VzXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJmb2N1c1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmZvY3VzIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9ob3Zlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiaG92ZXJcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImhvdmVyXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaG92ZXIgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3NlbGVjdF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2VsZWN0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzZWxlY3RcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5zZWxlY3QgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RhcF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidGFwXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ0YXBcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50YXAgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3R5cGVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInR5cGVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInR5cGVcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50eXBlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF90aXRsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidGl0bGVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInRpdGxlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudGl0bGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX2lkID0gX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBfcGFyZW50SWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIF9uYW1lO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBfaGFzU3RhcnRlZExvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICB9XG4gICAgICAgICNfZG9jdW1lbnQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgICNkb2N1bWVudCgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy4jX2RvY3VtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jX2RvY3VtZW50ID0gdGhpcy5tYWluUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNfZG9jdW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY2xlYXIgdGhlIGRvY3VtZW50IGhhbmRsZSB0aGF0IGhhcyBiZWVuIGRlc3Ryb3llZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBjbGVhckRvY3VtZW50SGFuZGxlKCkge1xuICAgICAgICAgICAgdGhpcy4jX2RvY3VtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgZnJhbWUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmcmFtZSAoaWYgYW55KS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZyYW1lRWxlbWVudCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRGcmFtZSA9IHRoaXMucGFyZW50RnJhbWUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHBhcmVudEZyYW1lLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUsZnJhbWUnKTtcbiAgICAgICAgICAgICAgICB9KSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgaWZyYW1lXzEgb2YgdHJhbnNwb3NlSXRlcmFibGVIYW5kbGUobGlzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52XzIgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMiwgaWZyYW1lXzEsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgaWZyYW1lLmNvbnRlbnRGcmFtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lPy5faWQgPT09IHRoaXMuX2lkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZS5tb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgICAgIGVudl8xLmVycm9yID0gZV8yO1xuICAgICAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJlaGF2ZXMgaWRlbnRpY2FsbHkgdG8ge0BsaW5rIFBhZ2UuZXZhbHVhdGVIYW5kbGV9IGV4Y2VwdCBpdCdzIHJ1biB3aXRoaW5cbiAgICAgICAgICogdGhlIGNvbnRleHQgb2YgdGhpcyBmcmFtZS5cbiAgICAgICAgICpcbiAgICAgICAgICogU2VlIHtAbGluayBQYWdlLmV2YWx1YXRlSGFuZGxlfSBmb3IgZGV0YWlscy5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICAgICAgcGFnZUZ1bmN0aW9uID0gd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSh0aGlzLmV2YWx1YXRlSGFuZGxlLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCZWhhdmVzIGlkZW50aWNhbGx5IHRvIHtAbGluayBQYWdlLmV2YWx1YXRlfSBleGNlcHQgaXQncyBydW4gd2l0aGluXG4gICAgICAgICAqIHRoZSBjb250ZXh0IG9mIHRoaXMgZnJhbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFNlZSB7QGxpbmsgUGFnZS5ldmFsdWF0ZX0gZm9yIGRldGFpbHMuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBldmFsdWF0ZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy5ldmFsdWF0ZS5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpblJlYWxtKCkuZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBsb2NhdG9yKHNlbGVjdG9yT3JGdW5jKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNlbGVjdG9yT3JGdW5jID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBOb2RlTG9jYXRvci5jcmVhdGUodGhpcywgc2VsZWN0b3JPckZ1bmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uTG9jYXRvci5jcmVhdGUodGhpcywgc2VsZWN0b3JPckZ1bmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBRdWVyaWVzIHRoZSBmcmFtZSBmb3IgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIEEge0BsaW5rIEVsZW1lbnRIYW5kbGUgfCBlbGVtZW50IGhhbmRsZX0gdG8gdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgICAgICogbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLiBPdGhlcndpc2UsIGBudWxsYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBydWxlc2Rpci91c2UtdXNpbmcgLS0gVGhpcyBpcyBjYWNoZWQuXG4gICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IGF3YWl0IHRoaXMuI2RvY3VtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZG9jdW1lbnQuJChzZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFF1ZXJpZXMgdGhlIGZyYW1lIGZvciBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB7QGxpbmsgRWxlbWVudEhhbmRsZSB8IGVsZW1lbnQgaGFuZGxlc30gdGhhdCBwb2ludCB0b1xuICAgICAgICAgKiBlbGVtZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkJChzZWxlY3Rvciwgb3B0aW9ucykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ1bGVzZGlyL3VzZS11c2luZyAtLSBUaGlzIGlzIGNhY2hlZC5cbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gYXdhaXQgdGhpcy4jZG9jdW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkb2N1bWVudC4kJChzZWxlY3Rvciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJ1bnMgdGhlIGdpdmVuIGZ1bmN0aW9uIG9uIHRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciBpblxuICAgICAgICAgKiB0aGUgZnJhbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdGlsbFxuICAgICAgICAgKiB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VhcmNoVmFsdWUgPSBhd2FpdCBmcmFtZS4kZXZhbCgnI3NlYXJjaCcsIGVsID0+IGVsLnZhbHVlKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBmcmFtZSdzIGNvbnRleHQuXG4gICAgICAgICAqIFRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvciB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYXNcbiAgICAgICAgICogaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICRldmFsKHNlbGVjdG9yLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy4kZXZhbC5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ1bGVzZGlyL3VzZS11c2luZyAtLSBUaGlzIGlzIGNhY2hlZC5cbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gYXdhaXQgdGhpcy4jZG9jdW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkb2N1bWVudC4kZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yXG4gICAgICAgICAqIGluIHRoZSBmcmFtZS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGdpdmVuIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgd2FpdCB0aWxsXG4gICAgICAgICAqIHRoZSBwcm9taXNlIHJlc29sdmVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBkaXZzQ291bnRzID0gYXdhaXQgZnJhbWUuJCRldmFsKCdkaXYnLCBkaXZzID0+IGRpdnMubGVuZ3RoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBmcmFtZSdzIGNvbnRleHQuXG4gICAgICAgICAqIEFuIGFycmF5IG9mIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciB3aWxsIGJlIHBhc3NlZCB0byB0aGVcbiAgICAgICAgICogZnVuY3Rpb24gYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuJCRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnVsZXNkaXIvdXNlLXVzaW5nIC0tIFRoaXMgaXMgY2FjaGVkLlxuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBhd2FpdCB0aGlzLiNkb2N1bWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRvY3VtZW50LiQkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdHMgZm9yIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIHRvIGFwcGVhciBpbiB0aGUgZnJhbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHdvcmtzIGFjcm9zcyBuYXZpZ2F0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKlxuICAgICAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgKiAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gICAgICAgICAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICAgKiAgIGxldCBjdXJyZW50VVJMO1xuICAgICAgICAgKiAgIHBhZ2VcbiAgICAgICAgICogICAgIC5tYWluRnJhbWUoKVxuICAgICAgICAgKiAgICAgLndhaXRGb3JTZWxlY3RvcignaW1nJylcbiAgICAgICAgICogICAgIC50aGVuKCgpID0+IGNvbnNvbGUubG9nKCdGaXJzdCBVUkwgd2l0aCBpbWFnZTogJyArIGN1cnJlbnRVUkwpKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICBmb3IgKGN1cnJlbnRVUkwgb2YgW1xuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZ29vZ2xlLmNvbScsXG4gICAgICAgICAqICAgICAnaHR0cHM6Ly9iYmMuY29tJyxcbiAgICAgICAgICogICBdKSB7XG4gICAgICAgICAqICAgICBhd2FpdCBwYWdlLmdvdG8oY3VycmVudFVSTCk7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIFRoZSBzZWxlY3RvciB0byBxdWVyeSBhbmQgd2FpdCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgY3VzdG9taXppbmcgd2FpdGluZyBiZWhhdmlvci5cbiAgICAgICAgICogQHJldHVybnMgQW4gZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqIEB0aHJvd3MgVGhyb3dzIGlmIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGRvZXNuJ3QgYXBwZWFyLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FpdEZvclNlbGVjdG9yKHNlbGVjdG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlZFNlbGVjdG9yLCBRdWVyeUhhbmRsZXIsIHBvbGxpbmcgfSA9IGdldFF1ZXJ5SGFuZGxlckFuZFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgUXVlcnlIYW5kbGVyLndhaXRGb3IodGhpcywgdXBkYXRlZFNlbGVjdG9yLCB7XG4gICAgICAgICAgICAgICAgcG9sbGluZyxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBUaGUgYHdhaXRGb3JGdW5jdGlvbmAgY2FuIGJlIHVzZWQgdG8gb2JzZXJ2ZSB2aWV3cG9ydCBzaXplIGNoYW5nZTpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKlxuICAgICAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgKiAuICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICAgICAgICAgKiAuICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgICAgICAqIC4gIGNvbnN0IHdhdGNoRG9nID0gcGFnZS5tYWluRnJhbWUoKS53YWl0Rm9yRnVuY3Rpb24oJ3dpbmRvdy5pbm5lcldpZHRoIDwgMTAwJyk7XG4gICAgICAgICAqIC4gIHBhZ2Uuc2V0Vmlld3BvcnQoe3dpZHRoOiA1MCwgaGVpZ2h0OiA1MH0pO1xuICAgICAgICAgKiAuICBhd2FpdCB3YXRjaERvZztcbiAgICAgICAgICogLiAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICAgICAgICAgKiB9KSgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogVG8gcGFzcyBhcmd1bWVudHMgZnJvbSBOb2RlLmpzIHRvIHRoZSBwcmVkaWNhdGUgb2YgYHBhZ2Uud2FpdEZvckZ1bmN0aW9uYCBmdW5jdGlvbjpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VsZWN0b3IgPSAnLmZvbyc7XG4gICAgICAgICAqIGF3YWl0IGZyYW1lLndhaXRGb3JGdW5jdGlvbihcbiAgICAgICAgICogICBzZWxlY3RvciA9PiAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLFxuICAgICAgICAgKiAgIHt9LCAvLyBlbXB0eSBvcHRpb25zIG9iamVjdFxuICAgICAgICAgKiAgIHNlbGVjdG9yXG4gICAgICAgICAqICk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gcGFnZUZ1bmN0aW9uIC0gdGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIGluIHRoZSBmcmFtZSBjb250ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBwb2xsaW5nIG1ldGhvZCBhbmQgdGltZW91dC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEByZXR1cm5zIHRoZSBwcm9taXNlIHdoaWNoIHJlc29sdmUgd2hlbiB0aGUgYHBhZ2VGdW5jdGlvbmAgcmV0dXJucyBhIHRydXRoeSB2YWx1ZS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhaXRGb3JGdW5jdGlvbihwYWdlRnVuY3Rpb24sIG9wdGlvbnMgPSB7fSwgLi4uYXJncykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpblJlYWxtKCkud2FpdEZvckZ1bmN0aW9uKHBhZ2VGdW5jdGlvbiwgb3B0aW9ucywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBmdWxsIEhUTUwgY29udGVudHMgb2YgdGhlIGZyYW1lLCBpbmNsdWRpbmcgdGhlIERPQ1RZUEUuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjb250ZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXZhbHVhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gJyc7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIGRvY3VtZW50LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNldEZyYW1lQ29udGVudChjb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ldmFsdWF0ZShodG1sID0+IHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5vcGVuKCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoaHRtbCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuY2xvc2UoKTtcbiAgICAgICAgICAgIH0sIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZnJhbWUncyBgbmFtZWAgYXR0cmlidXRlIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFnLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiB0aGUgbmFtZSBpcyBlbXB0eSwgaXQgcmV0dXJucyB0aGUgYGlkYCBhdHRyaWJ1dGUgaW5zdGVhZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBjYWxjdWxhdGVkIG9uY2Ugd2hlbiB0aGUgZnJhbWUgaXMgY3JlYXRlZCwgYW5kIHdpbGwgbm90XG4gICAgICAgICAqIHVwZGF0ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGNoYW5nZWQgbGF0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZXByZWNhdGVkIFVzZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBlbGVtZW50ID0gYXdhaXQgZnJhbWUuZnJhbWVFbGVtZW50KCk7XG4gICAgICAgICAqIGNvbnN0IG5hbWVPcklkID0gYXdhaXQgZWxlbWVudC5ldmFsdWF0ZShmcmFtZSA9PiBmcmFtZS5uYW1lID8/IGZyYW1lLmlkKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBuYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25hbWUgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzYHRydWVgIGlmIHRoZSBmcmFtZSBoYXMgYmVlbiBkZXRhY2hlZC4gT3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGBkZXRhY2hlZGAgZ2V0dGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgaXNEZXRhY2hlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGRzIGEgYDxzY3JpcHQ+YCB0YWcgaW50byB0aGUgcGFnZSB3aXRoIHRoZSBkZXNpcmVkIHVybCBvciBjb250ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBzY3JpcHQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIHtAbGluayBFbGVtZW50SGFuZGxlIHwgZWxlbWVudCBoYW5kbGV9IHRvIHRoZSBpbmplY3RlZFxuICAgICAgICAgKiBgPHNjcmlwdD5gIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhZGRTY3JpcHRUYWcob3B0aW9ucykge1xuICAgICAgICAgICAgbGV0IHsgY29udGVudCA9ICcnLCB0eXBlIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgeyBwYXRoIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgaWYgKCshIW9wdGlvbnMudXJsICsgKyEhcGF0aCArICshIWNvbnRlbnQgIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4YWN0bHkgb25lIG9mIGB1cmxgLCBgcGF0aGAsIG9yIGBjb250ZW50YCBtdXN0IGJlIHNwZWNpZmllZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnRGU1Byb21pc2VzKCk7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgICAgICAgY29udGVudCArPSBgLy8jIHNvdXJjZVVSTD0ke3BhdGgucmVwbGFjZSgvXFxuL2csICcnKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHlwZSA9IHR5cGUgPz8gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluUmVhbG0oKS50cmFuc2ZlckhhbmRsZShhd2FpdCB0aGlzLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZShhc3luYyAoeyB1cmwsIGlkLCB0eXBlLCBjb250ZW50IH0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICBzY3JpcHQudGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXZlbnQubWVzc2FnZSA/PyAnQ291bGQgbm90IGxvYWQgc2NyaXB0JykpO1xuICAgICAgICAgICAgICAgICAgICB9LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmlkID0gaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgeyAuLi5vcHRpb25zLCB0eXBlLCBjb250ZW50IH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhZGRTdHlsZVRhZyhvcHRpb25zKSB7XG4gICAgICAgICAgICBsZXQgeyBjb250ZW50ID0gJycgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCB7IHBhdGggfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoKyEhb3B0aW9ucy51cmwgKyArISFwYXRoICsgKyEhY29udGVudCAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhhY3RseSBvbmUgb2YgYHVybGAsIGBwYXRoYCwgb3IgYGNvbnRlbnRgIG11c3QgYmUgc3BlY2lmaWVkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydEZTUHJvbWlzZXMoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgICBjb250ZW50ICs9ICcvKiMgc291cmNlVVJMPScgKyBwYXRoLnJlcGxhY2UoL1xcbi9nLCAnJykgKyAnKi8nO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluUmVhbG0oKS50cmFuc2ZlckhhbmRsZShhd2FpdCB0aGlzLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZShhc3luYyAoeyB1cmwsIGNvbnRlbnQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBsaW5rO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXZlbnQubWVzc2FnZSA/PyAnQ291bGQgbm90IGxvYWQgc3R5bGUnKSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBvcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENsaWNrcyB0aGUgZmlyc3QgZWxlbWVudCBmb3VuZCB0aGF0IG1hdGNoZXMgYHNlbGVjdG9yYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogSWYgYGNsaWNrKClgIHRyaWdnZXJzIGEgbmF2aWdhdGlvbiBldmVudCBhbmQgdGhlcmUncyBhIHNlcGFyYXRlXG4gICAgICAgICAqIGBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKClgIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQsIHlvdSBtYXkgZW5kIHVwIHdpdGggYVxuICAgICAgICAgKiByYWNlIGNvbmRpdGlvbiB0aGF0IHlpZWxkcyB1bmV4cGVjdGVkIHJlc3VsdHMuIFRoZSBjb3JyZWN0IHBhdHRlcm4gZm9yXG4gICAgICAgICAqIGNsaWNrIGFuZCB3YWl0IGZvciBuYXZpZ2F0aW9uIGlzIHRoZSBmb2xsb3dpbmc6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IFtyZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAqICAgcGFnZS53YWl0Rm9yTmF2aWdhdGlvbih3YWl0T3B0aW9ucyksXG4gICAgICAgICAqICAgZnJhbWUuY2xpY2soc2VsZWN0b3IsIGNsaWNrT3B0aW9ucyksXG4gICAgICAgICAqIF0pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIHRvIHF1ZXJ5IGZvci5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNsaWNrKHNlbGVjdG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMywgYXdhaXQgdGhpcy4kKHNlbGVjdG9yKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGFzc2VydChoYW5kbGUsIGBObyBlbGVtZW50IGZvdW5kIGZvciBzZWxlY3RvcjogJHtzZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUuY2xpY2sob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzMpIHtcbiAgICAgICAgICAgICAgICBlbnZfMy5lcnJvciA9IGVfMztcbiAgICAgICAgICAgICAgICBlbnZfMy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGb2N1c2VzIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgYHNlbGVjdG9yYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIHRvIHF1ZXJ5IGZvci5cbiAgICAgICAgICogQHRocm93cyBUaHJvd3MgaWYgdGhlcmUncyBubyBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmb2N1cyhzZWxlY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgZW52XzQgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl80LCBhd2FpdCB0aGlzLiQoc2VsZWN0b3IpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGhhbmRsZSwgYE5vIGVsZW1lbnQgZm91bmQgZm9yIHNlbGVjdG9yOiAke3NlbGVjdG9yfWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZS5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfNCkge1xuICAgICAgICAgICAgICAgIGVudl80LmVycm9yID0gZV80O1xuICAgICAgICAgICAgICAgIGVudl80Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhvdmVycyB0aGUgcG9pbnRlciBvdmVyIHRoZSBjZW50ZXIgb2YgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZVxuICAgICAgICAgKiBgc2VsZWN0b3JgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgc2VsZWN0b3IgdG8gcXVlcnkgZm9yLlxuICAgICAgICAgKiBAdGhyb3dzIFRocm93cyBpZiB0aGVyZSdzIG5vIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGhvdmVyKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZfNSA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzUsIGF3YWl0IHRoaXMuJChzZWxlY3RvciksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoaGFuZGxlLCBgTm8gZWxlbWVudCBmb3VuZCBmb3Igc2VsZWN0b3I6ICR7c2VsZWN0b3J9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLmhvdmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV81KSB7XG4gICAgICAgICAgICAgICAgZW52XzUuZXJyb3IgPSBlXzU7XG4gICAgICAgICAgICAgICAgZW52XzUuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl81KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogU2VsZWN0cyBhIHNldCBvZiB2YWx1ZSBvbiB0aGUgZmlyc3QgYDxzZWxlY3Q+YCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGVcbiAgICAgICAgICogYHNlbGVjdG9yYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogZnJhbWUuc2VsZWN0KCdzZWxlY3QjY29sb3JzJywgJ2JsdWUnKTsgLy8gc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgKiBmcmFtZS5zZWxlY3QoJ3NlbGVjdCNjb2xvcnMnLCAncmVkJywgJ2dyZWVuJywgJ2JsdWUnKTsgLy8gbXVsdGlwbGUgc2VsZWN0aW9uc1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIHRvIHF1ZXJ5IGZvci5cbiAgICAgICAgICogQHBhcmFtIHZhbHVlcyAtIFRoZSBhcnJheSBvZiB2YWx1ZXMgdG8gc2VsZWN0LiBJZiB0aGUgYDxzZWxlY3Q+YCBoYXMgdGhlXG4gICAgICAgICAqIGBtdWx0aXBsZWAgYXR0cmlidXRlLCBhbGwgdmFsdWVzIGFyZSBjb25zaWRlcmVkLCBvdGhlcndpc2Ugb25seSB0aGUgZmlyc3RcbiAgICAgICAgICogb25lIGlzIHRha2VuIGludG8gYWNjb3VudC5cbiAgICAgICAgICogQHJldHVybnMgdGhlIGxpc3Qgb2YgdmFsdWVzIHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgc2VsZWN0ZWQuXG4gICAgICAgICAqIEB0aHJvd3MgVGhyb3dzIGlmIHRoZXJlJ3Mgbm8gYDxzZWxlY3Q+YCBtYXRjaGluZyBgc2VsZWN0b3JgLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2VsZWN0KHNlbGVjdG9yLCAuLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl82ID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfNiwgYXdhaXQgdGhpcy4kKHNlbGVjdG9yKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGFzc2VydChoYW5kbGUsIGBObyBlbGVtZW50IGZvdW5kIGZvciBzZWxlY3RvcjogJHtzZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgaGFuZGxlLnNlbGVjdCguLi52YWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfNikge1xuICAgICAgICAgICAgICAgIGVudl82LmVycm9yID0gZV82O1xuICAgICAgICAgICAgICAgIGVudl82Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhcHMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBgc2VsZWN0b3JgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgc2VsZWN0b3IgdG8gcXVlcnkgZm9yLlxuICAgICAgICAgKiBAdGhyb3dzIFRocm93cyBpZiB0aGVyZSdzIG5vIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRhcChzZWxlY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgZW52XzcgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl83LCBhd2FpdCB0aGlzLiQoc2VsZWN0b3IpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGhhbmRsZSwgYE5vIGVsZW1lbnQgZm91bmQgZm9yIHNlbGVjdG9yOiAke3NlbGVjdG9yfWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZS50YXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzcpIHtcbiAgICAgICAgICAgICAgICBlbnZfNy5lcnJvciA9IGVfNztcbiAgICAgICAgICAgICAgICBlbnZfNy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZW5kcyBhIGBrZXlkb3duYCwgYGtleXByZXNzYC9gaW5wdXRgLCBhbmQgYGtleXVwYCBldmVudCBmb3IgZWFjaCBjaGFyYWN0ZXJcbiAgICAgICAgICogaW4gdGhlIHRleHQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFRvIHByZXNzIGEgc3BlY2lhbCBrZXksIGxpa2UgYENvbnRyb2xgIG9yIGBBcnJvd0Rvd25gLCB1c2VcbiAgICAgICAgICoge0BsaW5rIEtleWJvYXJkLnByZXNzfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogYXdhaXQgZnJhbWUudHlwZSgnI215dGV4dGFyZWEnLCAnSGVsbG8nKTsgLy8gVHlwZXMgaW5zdGFudGx5XG4gICAgICAgICAqIGF3YWl0IGZyYW1lLnR5cGUoJyNteXRleHRhcmVhJywgJ1dvcmxkJywge2RlbGF5OiAxMDB9KTsgLy8gVHlwZXMgc2xvd2VyLCBsaWtlIGEgdXNlclxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gdGhlIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudCB0byB0eXBlIGludG8uIElmIHRoZXJlIGFyZVxuICAgICAgICAgKiBtdWx0aXBsZSB0aGUgZmlyc3Qgd2lsbCBiZSB1c2VkLlxuICAgICAgICAgKiBAcGFyYW0gdGV4dCAtIHRleHQgdG8gdHlwZSBpbnRvIHRoZSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gdGFrZXMgb25lIG9wdGlvbiwgYGRlbGF5YCwgd2hpY2ggc2V0cyB0aGUgdGltZSB0byB3YWl0XG4gICAgICAgICAqIGJldHdlZW4ga2V5IHByZXNzZXMgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byBgMGAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0eXBlKHNlbGVjdG9yLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZfOCA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzgsIGF3YWl0IHRoaXMuJChzZWxlY3RvciksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoaGFuZGxlLCBgTm8gZWxlbWVudCBmb3VuZCBmb3Igc2VsZWN0b3I6ICR7c2VsZWN0b3J9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnR5cGUodGV4dCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV84KSB7XG4gICAgICAgICAgICAgICAgZW52XzguZXJyb3IgPSBlXzg7XG4gICAgICAgICAgICAgICAgZW52XzguaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl84KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGZyYW1lJ3MgdGl0bGUuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0aXRsZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnRpdGxlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IEZyYW1lIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GcmFtZS5qcy5tYXAiLCJpbXBvcnQgeyBkZWJ1Z0Vycm9yLCBpc1N0cmluZyB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogVGhlIGRlZmF1bHQgY29vcGVyYXRpdmUgcmVxdWVzdCBpbnRlcmNlcHRpb24gcmVzb2x1dGlvbiBwcmlvcml0eVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5URVJDRVBUX1JFU09MVVRJT05fUFJJT1JJVFkgPSAwO1xuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEhUVFAgcmVxdWVzdCBzZW50IGJ5IGEgcGFnZS5cbiAqIEByZW1hcmtzXG4gKlxuICogV2hlbmV2ZXIgdGhlIHBhZ2Ugc2VuZHMgYSByZXF1ZXN0LCBzdWNoIGFzIGZvciBhIG5ldHdvcmsgcmVzb3VyY2UsIHRoZVxuICogZm9sbG93aW5nIGV2ZW50cyBhcmUgZW1pdHRlZCBieSBQdXBwZXRlZXIncyBgcGFnZWA6XG4gKlxuICogLSBgcmVxdWVzdGA6IGVtaXR0ZWQgd2hlbiB0aGUgcmVxdWVzdCBpcyBpc3N1ZWQgYnkgdGhlIHBhZ2UuXG4gKiAtIGByZXF1ZXN0ZmluaXNoZWRgIC0gZW1pdHRlZCB3aGVuIHRoZSByZXNwb25zZSBib2R5IGlzIGRvd25sb2FkZWQgYW5kIHRoZVxuICogICByZXF1ZXN0IGlzIGNvbXBsZXRlLlxuICpcbiAqIElmIHJlcXVlc3QgZmFpbHMgYXQgc29tZSBwb2ludCwgdGhlbiBpbnN0ZWFkIG9mIGByZXF1ZXN0ZmluaXNoZWRgIGV2ZW50IHRoZVxuICogYHJlcXVlc3RmYWlsZWRgIGV2ZW50IGlzIGVtaXR0ZWQuXG4gKlxuICogQWxsIG9mIHRoZXNlIGV2ZW50cyBwcm92aWRlIGFuIGluc3RhbmNlIG9mIGBIVFRQUmVxdWVzdGAgcmVwcmVzZW50aW5nIHRoZVxuICogcmVxdWVzdCB0aGF0IG9jY3VycmVkOlxuICpcbiAqIGBgYFxuICogcGFnZS5vbigncmVxdWVzdCcsIHJlcXVlc3QgPT4gLi4uKVxuICogYGBgXG4gKlxuICogTk9URTogSFRUUCBFcnJvciByZXNwb25zZXMsIHN1Y2ggYXMgNDA0IG9yIDUwMywgYXJlIHN0aWxsIHN1Y2Nlc3NmdWxcbiAqIHJlc3BvbnNlcyBmcm9tIEhUVFAgc3RhbmRwb2ludCwgc28gcmVxdWVzdCB3aWxsIGNvbXBsZXRlIHdpdGhcbiAqIGByZXF1ZXN0ZmluaXNoZWRgIGV2ZW50LlxuICpcbiAqIElmIHJlcXVlc3QgZ2V0cyBhICdyZWRpcmVjdCcgcmVzcG9uc2UsIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZFxuICogd2l0aCB0aGUgYHJlcXVlc3RmaW5pc2hlZGAgZXZlbnQsIGFuZCBhIG5ldyByZXF1ZXN0IGlzIGlzc3VlZCB0byBhXG4gKiByZWRpcmVjdGVkIHVybC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBIVFRQUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2ludGVyY2VwdGlvbklkO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9mYWlsdXJlVGV4dCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3Jlc3BvbnNlID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfZnJvbU1lbW9yeUNhY2hlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3JlZGlyZWN0Q2hhaW4gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBpbnRlcmNlcHRpb24gPSB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBoYW5kbGVkOiBmYWxzZSxcbiAgICAgICAgaGFuZGxlcnM6IFtdLFxuICAgICAgICByZXNvbHV0aW9uU3RhdGU6IHtcbiAgICAgICAgICAgIGFjdGlvbjogSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbi5Ob25lLFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0T3ZlcnJpZGVzOiB7fSxcbiAgICAgICAgcmVzcG9uc2U6IG51bGwsXG4gICAgICAgIGFib3J0UmVhc29uOiBudWxsLFxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICAgKiBUaGUgYENvbnRpbnVlUmVxdWVzdE92ZXJyaWRlc2AgdGhhdCB3aWxsIGJlIHVzZWRcbiAgICAgKiBpZiB0aGUgaW50ZXJjZXB0aW9uIGlzIGFsbG93ZWQgdG8gY29udGludWUgKGllLCBgYWJvcnQoKWAgYW5kXG4gICAgICogYHJlc3BvbmQoKWAgYXJlbid0IGNhbGxlZCkuXG4gICAgICovXG4gICAgY29udGludWVSZXF1ZXN0T3ZlcnJpZGVzKCkge1xuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmNlcHRpb24ucmVxdWVzdE92ZXJyaWRlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGBSZXNwb25zZUZvclJlcXVlc3RgIHRoYXQgZ2V0cyB1c2VkIGlmIHRoZVxuICAgICAqIGludGVyY2VwdGlvbiBpcyBhbGxvd2VkIHRvIHJlc3BvbmQgKGllLCBgYWJvcnQoKWAgaXMgbm90IGNhbGxlZCkuXG4gICAgICovXG4gICAgcmVzcG9uc2VGb3JSZXF1ZXN0KCkge1xuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmNlcHRpb24ucmVzcG9uc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IHJlY2VudCByZWFzb24gZm9yIGFib3J0aW5nIHRoZSByZXF1ZXN0XG4gICAgICovXG4gICAgYWJvcnRFcnJvclJlYXNvbigpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuaW50ZXJjZXB0aW9uLmVuYWJsZWQsICdSZXF1ZXN0IEludGVyY2VwdGlvbiBpcyBub3QgZW5hYmxlZCEnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJjZXB0aW9uLmFib3J0UmVhc29uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBJbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGN1cnJlbnQgcmVzb2x1dGlvblxuICAgICAqIGFjdGlvbiBhbmQgcHJpb3JpdHkuXG4gICAgICpcbiAgICAgKiBJbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUgY29udGFpbnM6XG4gICAgICogYWN0aW9uOiBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uXG4gICAgICogcHJpb3JpdHk/OiBudW1iZXJcbiAgICAgKlxuICAgICAqIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24gaXMgb25lIG9mOiBgYWJvcnRgLCBgcmVzcG9uZGAsIGBjb250aW51ZWAsXG4gICAgICogYGRpc2FibGVkYCwgYG5vbmVgLCBvciBgYWxyZWFkeS1oYW5kbGVkYC5cbiAgICAgKi9cbiAgICBpbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgYWN0aW9uOiBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uLkRpc2FibGVkIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGFjdGlvbjogSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbi5BbHJlYWR5SGFuZGxlZCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLnRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZSB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyBgdHJ1ZWAgaWYgdGhlIGludGVyY2VwdCByZXNvbHV0aW9uIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCxcbiAgICAgKiBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc0ludGVyY2VwdFJlc29sdXRpb25IYW5kbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBhc3luYyByZXF1ZXN0IGhhbmRsZXIgdG8gdGhlIHByb2Nlc3NpbmcgcXVldWUuXG4gICAgICogRGVmZXJyZWQgaGFuZGxlcnMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGV4ZWN1dGUgaW4gYW55IHBhcnRpY3VsYXIgb3JkZXIsXG4gICAgICogYnV0IHRoZXkgYXJlIGd1YXJhbnRlZWQgdG8gcmVzb2x2ZSBiZWZvcmUgdGhlIHJlcXVlc3QgaW50ZXJjZXB0aW9uXG4gICAgICogaXMgZmluYWxpemVkLlxuICAgICAqL1xuICAgIGVucXVldWVJbnRlcmNlcHRBY3Rpb24ocGVuZGluZ0hhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlcnMucHVzaChwZW5kaW5nSGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF3YWl0cyBwZW5kaW5nIGludGVyY2VwdGlvbiBoYW5kbGVycyBhbmQgdGhlbiBkZWNpZGVzIGhvdyB0byBmdWxmaWxsXG4gICAgICogdGhlIHJlcXVlc3QgaW50ZXJjZXB0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGZpbmFsaXplSW50ZXJjZXB0aW9ucygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlcnMucmVkdWNlKChwcm9taXNlQ2hhaW4sIGludGVyY2VwdEFjdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VDaGFpbi50aGVuKGludGVyY2VwdEFjdGlvbik7XG4gICAgICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKTtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlcnMgPSBbXTsgLy8gVE9ETzogdmVyaWZ5IHRoaXMgaXMgY29ycmVjdCB0b3AgbGV0IGdjIHJ1blxuICAgICAgICBjb25zdCB7IGFjdGlvbiB9ID0gdGhpcy5pbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUoKTtcbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2Fib3J0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fYWJvcnQodGhpcy5pbnRlcmNlcHRpb24uYWJvcnRSZWFzb24pO1xuICAgICAgICAgICAgY2FzZSAncmVzcG9uZCc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJjZXB0aW9uLnJlc3BvbnNlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UgaXMgbWlzc2luZyBmb3IgdGhlIGludGVyY2VwdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVzcG9uZCh0aGlzLmludGVyY2VwdGlvbi5yZXNwb25zZSk7XG4gICAgICAgICAgICBjYXNlICdjb250aW51ZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbnRpbnVlKHRoaXMuaW50ZXJjZXB0aW9uLnJlcXVlc3RPdmVycmlkZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnRpbnVlcyByZXF1ZXN0IHdpdGggb3B0aW9uYWwgcmVxdWVzdCBvdmVycmlkZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb24odHJ1ZSk7XG4gICAgICogcGFnZS5vbigncmVxdWVzdCcsIHJlcXVlc3QgPT4ge1xuICAgICAqICAgLy8gT3ZlcnJpZGUgaGVhZGVyc1xuICAgICAqICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHJlcXVlc3QuaGVhZGVycygpLCB7XG4gICAgICogICAgIGZvbzogJ2JhcicsIC8vIHNldCBcImZvb1wiIGhlYWRlclxuICAgICAqICAgICBvcmlnaW46IHVuZGVmaW5lZCwgLy8gcmVtb3ZlIFwib3JpZ2luXCIgaGVhZGVyXG4gICAgICogICB9KTtcbiAgICAgKiAgIHJlcXVlc3QuY29udGludWUoe2hlYWRlcnN9KTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvdmVycmlkZXMgLSBvcHRpb25hbCBvdmVycmlkZXMgdG8gYXBwbHkgdG8gdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHByaW9yaXR5IC0gSWYgcHJvdmlkZWQsIGludGVyY2VwdCBpcyByZXNvbHZlZCB1c2luZyBjb29wZXJhdGl2ZVxuICAgICAqIGhhbmRsaW5nIHJ1bGVzLiBPdGhlcndpc2UsIGludGVyY2VwdCBpcyByZXNvbHZlZCBpbW1lZGlhdGVseS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiBUbyB1c2UgdGhpcywgcmVxdWVzdCBpbnRlcmNlcHRpb24gc2hvdWxkIGJlIGVuYWJsZWQgd2l0aFxuICAgICAqIHtAbGluayBQYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb259LlxuICAgICAqXG4gICAgICogRXhjZXB0aW9uIGlzIGltbWVkaWF0ZWx5IHRocm93biBpZiB0aGUgcmVxdWVzdCBpbnRlcmNlcHRpb24gaXMgbm90IGVuYWJsZWQuXG4gICAgICovXG4gICAgYXN5bmMgY29udGludWUob3ZlcnJpZGVzID0ge30sIHByaW9yaXR5KSB7XG4gICAgICAgIC8vIFJlcXVlc3QgaW50ZXJjZXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRhdGE6IHVybHMuXG4gICAgICAgIGlmICh0aGlzLnVybCgpLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQsICdSZXF1ZXN0IGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb250aW51ZShvdmVycmlkZXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlcXVlc3RPdmVycmlkZXMgPSBvdmVycmlkZXM7XG4gICAgICAgIGlmICh0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUucHJpb3JpdHkgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgcHJpb3JpdHkgPiB0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uQ29udGludWUsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmlvcml0eSA9PT0gdGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLmFjdGlvbiA9PT0gJ2Fib3J0JyB8fFxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5hY3Rpb24gPT09ICdyZXNwb25kJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5hY3Rpb24gPVxuICAgICAgICAgICAgICAgIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uQ29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdWxmaWxscyBhIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIEFuIGV4YW1wbGUgb2YgZnVsZmlsbGluZyBhbGwgcmVxdWVzdHMgd2l0aCA0MDQgcmVzcG9uc2VzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb24odHJ1ZSk7XG4gICAgICogcGFnZS5vbigncmVxdWVzdCcsIHJlcXVlc3QgPT4ge1xuICAgICAqICAgcmVxdWVzdC5yZXNwb25kKHtcbiAgICAgKiAgICAgc3RhdHVzOiA0MDQsXG4gICAgICogICAgIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbicsXG4gICAgICogICAgIGJvZHk6ICdOb3QgRm91bmQhJyxcbiAgICAgKiAgIH0pO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogTk9URTogTW9ja2luZyByZXNwb25zZXMgZm9yIGRhdGFVUkwgcmVxdWVzdHMgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKiBDYWxsaW5nIGByZXF1ZXN0LnJlc3BvbmRgIGZvciBhIGRhdGFVUkwgcmVxdWVzdCBpcyBhIG5vb3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2UgLSB0aGUgcmVzcG9uc2UgdG8gZnVsZmlsbCB0aGUgcmVxdWVzdCB3aXRoLlxuICAgICAqIEBwYXJhbSBwcmlvcml0eSAtIElmIHByb3ZpZGVkLCBpbnRlcmNlcHQgaXMgcmVzb2x2ZWQgdXNpbmdcbiAgICAgKiBjb29wZXJhdGl2ZSBoYW5kbGluZyBydWxlcy4gT3RoZXJ3aXNlLCBpbnRlcmNlcHQgaXMgcmVzb2x2ZWRcbiAgICAgKiBpbW1lZGlhdGVseS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiBUbyB1c2UgdGhpcywgcmVxdWVzdFxuICAgICAqIGludGVyY2VwdGlvbiBzaG91bGQgYmUgZW5hYmxlZCB3aXRoIHtAbGluayBQYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb259LlxuICAgICAqXG4gICAgICogRXhjZXB0aW9uIGlzIGltbWVkaWF0ZWx5IHRocm93biBpZiB0aGUgcmVxdWVzdCBpbnRlcmNlcHRpb24gaXMgbm90IGVuYWJsZWQuXG4gICAgICovXG4gICAgYXN5bmMgcmVzcG9uZChyZXNwb25zZSwgcHJpb3JpdHkpIHtcbiAgICAgICAgLy8gTW9ja2luZyByZXNwb25zZXMgZm9yIGRhdGFVUkwgcmVxdWVzdHMgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gICAgICAgIGlmICh0aGlzLnVybCgpLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQsICdSZXF1ZXN0IGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZXNwb25kKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIHByaW9yaXR5ID4gdGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5KSB7XG4gICAgICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uLlJlc3BvbmQsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmlvcml0eSA9PT0gdGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLmFjdGlvbiA9PT0gJ2Fib3J0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5hY3Rpb24gPVxuICAgICAgICAgICAgICAgIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uUmVzcG9uZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgYSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVycm9yQ29kZSAtIG9wdGlvbmFsIGVycm9yIGNvZGUgdG8gcHJvdmlkZS5cbiAgICAgKiBAcGFyYW0gcHJpb3JpdHkgLSBJZiBwcm92aWRlZCwgaW50ZXJjZXB0IGlzIHJlc29sdmVkIHVzaW5nXG4gICAgICogY29vcGVyYXRpdmUgaGFuZGxpbmcgcnVsZXMuIE90aGVyd2lzZSwgaW50ZXJjZXB0IGlzIHJlc29sdmVkXG4gICAgICogaW1tZWRpYXRlbHkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqXG4gICAgICogVG8gdXNlIHRoaXMsIHJlcXVlc3QgaW50ZXJjZXB0aW9uIHNob3VsZCBiZSBlbmFibGVkIHdpdGhcbiAgICAgKiB7QGxpbmsgUGFnZS5zZXRSZXF1ZXN0SW50ZXJjZXB0aW9ufS4gSWYgaXQgaXMgbm90IGVuYWJsZWQsIHRoaXMgbWV0aG9kIHdpbGxcbiAgICAgKiB0aHJvdyBhbiBleGNlcHRpb24gaW1tZWRpYXRlbHkuXG4gICAgICovXG4gICAgYXN5bmMgYWJvcnQoZXJyb3JDb2RlID0gJ2ZhaWxlZCcsIHByaW9yaXR5KSB7XG4gICAgICAgIC8vIFJlcXVlc3QgaW50ZXJjZXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRhdGE6IHVybHMuXG4gICAgICAgIGlmICh0aGlzLnVybCgpLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvclJlYXNvbiA9IGVycm9yUmVhc29uc1tlcnJvckNvZGVdO1xuICAgICAgICBhc3NlcnQoZXJyb3JSZWFzb24sICdVbmtub3duIGVycm9yIGNvZGU6ICcgKyBlcnJvckNvZGUpO1xuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQsICdSZXF1ZXN0IGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9hYm9ydChlcnJvclJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uYWJvcnRSZWFzb24gPSBlcnJvclJlYXNvbjtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5wcmlvcml0eSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBwcmlvcml0eSA+PSB0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uQWJvcnQsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRSZXNwb25zZShib2R5KSB7XG4gICAgICAgIC8vIE5lZWRlZCB0byBnZXQgdGhlIGNvcnJlY3QgYnl0ZUxlbmd0aFxuICAgICAgICBjb25zdCBieXRlQm9keSA9IGlzU3RyaW5nKGJvZHkpXG4gICAgICAgICAgICA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShib2R5KVxuICAgICAgICAgICAgOiBib2R5O1xuICAgICAgICBjb25zdCBieXRlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGJ5dGUgb2YgYnl0ZUJvZHkpIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IGJ5dGVCb2R5LmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICBiYXNlNjQ6IGJ0b2EoYnl0ZXMuam9pbignJykpLFxuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb247XG4oZnVuY3Rpb24gKEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24pIHtcbiAgICBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uW1wiQWJvcnRcIl0gPSBcImFib3J0XCI7XG4gICAgSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbltcIlJlc3BvbmRcIl0gPSBcInJlc3BvbmRcIjtcbiAgICBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uW1wiQ29udGludWVcIl0gPSBcImNvbnRpbnVlXCI7XG4gICAgSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbltcIkRpc2FibGVkXCJdID0gXCJkaXNhYmxlZFwiO1xuICAgIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb25bXCJOb25lXCJdID0gXCJub25lXCI7XG4gICAgSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbltcIkFscmVhZHlIYW5kbGVkXCJdID0gXCJhbHJlYWR5LWhhbmRsZWRcIjtcbn0pKEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24gfHwgKEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24gPSB7fSkpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhlYWRlcnNBcnJheShoZWFkZXJzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCBuYW1lIGluIGhlYWRlcnMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXJzW25hbWVdO1xuICAgICAgICBpZiAoIU9iamVjdC5pcyh2YWx1ZSwgdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi52YWx1ZXMubWFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lLCB2YWx1ZTogdmFsdWUgKyAnJyB9O1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEByZW1hcmtzXG4gKiBMaXN0IHRha2VuIGZyb20ge0BsaW5rIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2h0dHAtc3RhdHVzLWNvZGVzL2h0dHAtc3RhdHVzLWNvZGVzLnhodG1sfVxuICogd2l0aCBleHRyYSAzMDYgYW5kIDQxOCBjb2Rlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUQVRVU19URVhUUyA9IHtcbiAgICAnMTAwJzogJ0NvbnRpbnVlJyxcbiAgICAnMTAxJzogJ1N3aXRjaGluZyBQcm90b2NvbHMnLFxuICAgICcxMDInOiAnUHJvY2Vzc2luZycsXG4gICAgJzEwMyc6ICdFYXJseSBIaW50cycsXG4gICAgJzIwMCc6ICdPSycsXG4gICAgJzIwMSc6ICdDcmVhdGVkJyxcbiAgICAnMjAyJzogJ0FjY2VwdGVkJyxcbiAgICAnMjAzJzogJ05vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uJyxcbiAgICAnMjA0JzogJ05vIENvbnRlbnQnLFxuICAgICcyMDUnOiAnUmVzZXQgQ29udGVudCcsXG4gICAgJzIwNic6ICdQYXJ0aWFsIENvbnRlbnQnLFxuICAgICcyMDcnOiAnTXVsdGktU3RhdHVzJyxcbiAgICAnMjA4JzogJ0FscmVhZHkgUmVwb3J0ZWQnLFxuICAgICcyMjYnOiAnSU0gVXNlZCcsXG4gICAgJzMwMCc6ICdNdWx0aXBsZSBDaG9pY2VzJyxcbiAgICAnMzAxJzogJ01vdmVkIFBlcm1hbmVudGx5JyxcbiAgICAnMzAyJzogJ0ZvdW5kJyxcbiAgICAnMzAzJzogJ1NlZSBPdGhlcicsXG4gICAgJzMwNCc6ICdOb3QgTW9kaWZpZWQnLFxuICAgICczMDUnOiAnVXNlIFByb3h5JyxcbiAgICAnMzA2JzogJ1N3aXRjaCBQcm94eScsXG4gICAgJzMwNyc6ICdUZW1wb3JhcnkgUmVkaXJlY3QnLFxuICAgICczMDgnOiAnUGVybWFuZW50IFJlZGlyZWN0JyxcbiAgICAnNDAwJzogJ0JhZCBSZXF1ZXN0JyxcbiAgICAnNDAxJzogJ1VuYXV0aG9yaXplZCcsXG4gICAgJzQwMic6ICdQYXltZW50IFJlcXVpcmVkJyxcbiAgICAnNDAzJzogJ0ZvcmJpZGRlbicsXG4gICAgJzQwNCc6ICdOb3QgRm91bmQnLFxuICAgICc0MDUnOiAnTWV0aG9kIE5vdCBBbGxvd2VkJyxcbiAgICAnNDA2JzogJ05vdCBBY2NlcHRhYmxlJyxcbiAgICAnNDA3JzogJ1Byb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyxcbiAgICAnNDA4JzogJ1JlcXVlc3QgVGltZW91dCcsXG4gICAgJzQwOSc6ICdDb25mbGljdCcsXG4gICAgJzQxMCc6ICdHb25lJyxcbiAgICAnNDExJzogJ0xlbmd0aCBSZXF1aXJlZCcsXG4gICAgJzQxMic6ICdQcmVjb25kaXRpb24gRmFpbGVkJyxcbiAgICAnNDEzJzogJ1BheWxvYWQgVG9vIExhcmdlJyxcbiAgICAnNDE0JzogJ1VSSSBUb28gTG9uZycsXG4gICAgJzQxNSc6ICdVbnN1cHBvcnRlZCBNZWRpYSBUeXBlJyxcbiAgICAnNDE2JzogJ1JhbmdlIE5vdCBTYXRpc2ZpYWJsZScsXG4gICAgJzQxNyc6ICdFeHBlY3RhdGlvbiBGYWlsZWQnLFxuICAgICc0MTgnOiBcIkknbSBhIHRlYXBvdFwiLFxuICAgICc0MjEnOiAnTWlzZGlyZWN0ZWQgUmVxdWVzdCcsXG4gICAgJzQyMic6ICdVbnByb2Nlc3NhYmxlIEVudGl0eScsXG4gICAgJzQyMyc6ICdMb2NrZWQnLFxuICAgICc0MjQnOiAnRmFpbGVkIERlcGVuZGVuY3knLFxuICAgICc0MjUnOiAnVG9vIEVhcmx5JyxcbiAgICAnNDI2JzogJ1VwZ3JhZGUgUmVxdWlyZWQnLFxuICAgICc0MjgnOiAnUHJlY29uZGl0aW9uIFJlcXVpcmVkJyxcbiAgICAnNDI5JzogJ1RvbyBNYW55IFJlcXVlc3RzJyxcbiAgICAnNDMxJzogJ1JlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2UnLFxuICAgICc0NTEnOiAnVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnMnLFxuICAgICc1MDAnOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbiAgICAnNTAxJzogJ05vdCBJbXBsZW1lbnRlZCcsXG4gICAgJzUwMic6ICdCYWQgR2F0ZXdheScsXG4gICAgJzUwMyc6ICdTZXJ2aWNlIFVuYXZhaWxhYmxlJyxcbiAgICAnNTA0JzogJ0dhdGV3YXkgVGltZW91dCcsXG4gICAgJzUwNSc6ICdIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCcsXG4gICAgJzUwNic6ICdWYXJpYW50IEFsc28gTmVnb3RpYXRlcycsXG4gICAgJzUwNyc6ICdJbnN1ZmZpY2llbnQgU3RvcmFnZScsXG4gICAgJzUwOCc6ICdMb29wIERldGVjdGVkJyxcbiAgICAnNTEwJzogJ05vdCBFeHRlbmRlZCcsXG4gICAgJzUxMSc6ICdOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyxcbn07XG5jb25zdCBlcnJvclJlYXNvbnMgPSB7XG4gICAgYWJvcnRlZDogJ0Fib3J0ZWQnLFxuICAgIGFjY2Vzc2RlbmllZDogJ0FjY2Vzc0RlbmllZCcsXG4gICAgYWRkcmVzc3VucmVhY2hhYmxlOiAnQWRkcmVzc1VucmVhY2hhYmxlJyxcbiAgICBibG9ja2VkYnljbGllbnQ6ICdCbG9ja2VkQnlDbGllbnQnLFxuICAgIGJsb2NrZWRieXJlc3BvbnNlOiAnQmxvY2tlZEJ5UmVzcG9uc2UnLFxuICAgIGNvbm5lY3Rpb25hYm9ydGVkOiAnQ29ubmVjdGlvbkFib3J0ZWQnLFxuICAgIGNvbm5lY3Rpb25jbG9zZWQ6ICdDb25uZWN0aW9uQ2xvc2VkJyxcbiAgICBjb25uZWN0aW9uZmFpbGVkOiAnQ29ubmVjdGlvbkZhaWxlZCcsXG4gICAgY29ubmVjdGlvbnJlZnVzZWQ6ICdDb25uZWN0aW9uUmVmdXNlZCcsXG4gICAgY29ubmVjdGlvbnJlc2V0OiAnQ29ubmVjdGlvblJlc2V0JyxcbiAgICBpbnRlcm5ldGRpc2Nvbm5lY3RlZDogJ0ludGVybmV0RGlzY29ubmVjdGVkJyxcbiAgICBuYW1lbm90cmVzb2x2ZWQ6ICdOYW1lTm90UmVzb2x2ZWQnLFxuICAgIHRpbWVkb3V0OiAnVGltZWRPdXQnLFxuICAgIGZhaWxlZDogJ0ZhaWxlZCcsXG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgLy8gRmlyZWZveCB0aHJvd3MgYW4gaW52YWxpZCBhcmd1bWVudCBlcnJvciB3aXRoIGEgbWVzc2FnZSBzdGFydGluZyB3aXRoXG4gICAgLy8gJ0V4cGVjdGVkIFwiaGVhZGVyXCIgWy4uLl0nLlxuICAgIGlmIChlcnJvci5vcmlnaW5hbE1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgaGVhZGVyJykgfHxcbiAgICAgICAgZXJyb3Iub3JpZ2luYWxNZXNzYWdlLmluY2x1ZGVzKCdFeHBlY3RlZCBcImhlYWRlclwiJykgfHxcbiAgICAgICAgLy8gV2ViRHJpdmVyIEJpRGkgZXJyb3IgZm9yIGludmFsaWQgdmFsdWVzLCBmb3IgZXhhbXBsZSwgaGVhZGVycy5cbiAgICAgICAgZXJyb3Iub3JpZ2luYWxNZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkIGFyZ3VtZW50JykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIC8vIEluIGNlcnRhaW4gY2FzZXMsIHByb3RvY29sIHdpbGwgcmV0dXJuIGVycm9yIGlmIHRoZSByZXF1ZXN0IHdhc1xuICAgIC8vIGFscmVhZHkgY2FuY2VsZWQgb3IgdGhlIHBhZ2Ugd2FzIGNsb3NlZC4gV2Ugc2hvdWxkIHRvbGVyYXRlIHRoZXNlXG4gICAgLy8gZXJyb3JzLlxuICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SFRUUFJlcXVlc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogVGhlIEhUVFBSZXNwb25zZSBjbGFzcyByZXByZXNlbnRzIHJlc3BvbnNlcyB3aGljaCBhcmUgcmVjZWl2ZWQgYnkgdGhlXG4gKiB7QGxpbmsgUGFnZX0gY2xhc3MuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgSFRUUFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhlIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsIChzdGF0dXMgaW4gdGhlIHJhbmdlIDIwMC0yOTkpLlxuICAgICAqL1xuICAgIG9rKCkge1xuICAgICAgICAvLyBUT0RPOiBkb2N1bWVudCA9PT0gMCBjYXNlP1xuICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLnN0YXR1cygpO1xuICAgICAgICByZXR1cm4gc3RhdHVzID09PSAwIHx8IChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8PSAyOTkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGEgdGV4dCAodXRmOCkgcmVwcmVzZW50YXRpb24gb2YgcmVzcG9uc2UgYm9keS5cbiAgICAgKi9cbiAgICBhc3luYyB0ZXh0KCkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5idWZmZXIoKTtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgcmVzcG9uc2UgYm9keS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHRocm93IGlmIHRoZSByZXNwb25zZSBib2R5IGlzIG5vdCBwYXJzYWJsZSB2aWFcbiAgICAgKiBgSlNPTi5wYXJzZWAuXG4gICAgICovXG4gICAgYXN5bmMganNvbigpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMudGV4dCgpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1IVFRQUmVzcG9uc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogS2V5Ym9hcmQgcHJvdmlkZXMgYW4gYXBpIGZvciBtYW5hZ2luZyBhIHZpcnR1YWwga2V5Ym9hcmQuXG4gKiBUaGUgaGlnaCBsZXZlbCBhcGkgaXMge0BsaW5rIEtleWJvYXJkLlwidHlwZVwifSxcbiAqIHdoaWNoIHRha2VzIHJhdyBjaGFyYWN0ZXJzIGFuZCBnZW5lcmF0ZXMgcHJvcGVyIGtleWRvd24sIGtleXByZXNzL2lucHV0LFxuICogYW5kIGtleXVwIGV2ZW50cyBvbiB5b3VyIHBhZ2UuXG4gKlxuICogQHJlbWFya3NcbiAqIEZvciBmaW5lciBjb250cm9sLCB5b3UgY2FuIHVzZSB7QGxpbmsgS2V5Ym9hcmQuZG93bn0sXG4gKiB7QGxpbmsgS2V5Ym9hcmQudXB9LCBhbmQge0BsaW5rIEtleWJvYXJkLnNlbmRDaGFyYWN0ZXJ9XG4gKiB0byBtYW51YWxseSBmaXJlIGV2ZW50cyBhcyBpZiB0aGV5IHdlcmUgZ2VuZXJhdGVkIGZyb20gYSByZWFsIGtleWJvYXJkLlxuICpcbiAqIE9uIG1hY09TLCBrZXlib2FyZCBzaG9ydGN1dHMgbGlrZSBg4oyYIEFgIC1cXD4gU2VsZWN0IEFsbCBkbyBub3Qgd29yay5cbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3B1cHBldGVlci9wdXBwZXRlZXIvaXNzdWVzLzEzMTMgfCAjMTMxM30uXG4gKlxuICogQGV4YW1wbGVcbiAqIEFuIGV4YW1wbGUgb2YgaG9sZGluZyBkb3duIGBTaGlmdGAgaW4gb3JkZXIgdG8gc2VsZWN0IGFuZCBkZWxldGUgc29tZSB0ZXh0OlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBwYWdlLmtleWJvYXJkLnR5cGUoJ0hlbGxvIFdvcmxkIScpO1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygnQXJyb3dMZWZ0Jyk7XG4gKlxuICogYXdhaXQgcGFnZS5rZXlib2FyZC5kb3duKCdTaGlmdCcpO1xuICogZm9yIChsZXQgaSA9IDA7IGkgPCAnIFdvcmxkJy5sZW5ndGg7IGkrKylcbiAqICAgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygnQXJyb3dMZWZ0Jyk7XG4gKiBhd2FpdCBwYWdlLmtleWJvYXJkLnVwKCdTaGlmdCcpO1xuICpcbiAqIGF3YWl0IHBhZ2Uua2V5Ym9hcmQucHJlc3MoJ0JhY2tzcGFjZScpO1xuICogLy8gUmVzdWx0IHRleHQgd2lsbCBlbmQgdXAgc2F5aW5nICdIZWxsbyEnXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQW4gZXhhbXBsZSBvZiBwcmVzc2luZyBgQWBcbiAqXG4gKiBgYGB0c1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC5kb3duKCdTaGlmdCcpO1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygnS2V5QScpO1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC51cCgnU2hpZnQnKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEtleWJvYXJkIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxufVxuLyoqXG4gKiBFbnVtIG9mIHZhbGlkIG1vdXNlIGJ1dHRvbnMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgTW91c2VCdXR0b24gPSBPYmplY3QuZnJlZXplKHtcbiAgICBMZWZ0OiAnbGVmdCcsXG4gICAgUmlnaHQ6ICdyaWdodCcsXG4gICAgTWlkZGxlOiAnbWlkZGxlJyxcbiAgICBCYWNrOiAnYmFjaycsXG4gICAgRm9yd2FyZDogJ2ZvcndhcmQnLFxufSk7XG4vKipcbiAqIFRoZSBNb3VzZSBjbGFzcyBvcGVyYXRlcyBpbiBtYWluLWZyYW1lIENTUyBwaXhlbHNcbiAqIHJlbGF0aXZlIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHZpZXdwb3J0LlxuICpcbiAqIEByZW1hcmtzXG4gKiBFdmVyeSBgcGFnZWAgb2JqZWN0IGhhcyBpdHMgb3duIE1vdXNlLCBhY2Nlc3NpYmxlIHdpdGgge0BsaW5rIFBhZ2UubW91c2V9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIFVzaW5nIOKAmHBhZ2UubW91c2XigJkgdG8gdHJhY2UgYSAxMDB4MTAwIHNxdWFyZS5cbiAqIGF3YWl0IHBhZ2UubW91c2UubW92ZSgwLCAwKTtcbiAqIGF3YWl0IHBhZ2UubW91c2UuZG93bigpO1xuICogYXdhaXQgcGFnZS5tb3VzZS5tb3ZlKDAsIDEwMCk7XG4gKiBhd2FpdCBwYWdlLm1vdXNlLm1vdmUoMTAwLCAxMDApO1xuICogYXdhaXQgcGFnZS5tb3VzZS5tb3ZlKDEwMCwgMCk7XG4gKiBhd2FpdCBwYWdlLm1vdXNlLm1vdmUoMCwgMCk7XG4gKiBhd2FpdCBwYWdlLm1vdXNlLnVwKCk7XG4gKiBgYGBcbiAqXG4gKiAqKk5vdGUqKjogVGhlIG1vdXNlIGV2ZW50cyB0cmlnZ2VyIHN5bnRoZXRpYyBgTW91c2VFdmVudGBzLlxuICogVGhpcyBtZWFucyB0aGF0IGl0IGRvZXMgbm90IGZ1bGx5IHJlcGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB3aGF0IGEgbm9ybWFsIHVzZXJcbiAqIHdvdWxkIGJlIGFibGUgdG8gZG8gd2l0aCB0aGVpciBtb3VzZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgZHJhZ2dpbmcgYW5kIHNlbGVjdGluZyB0ZXh0IGlzIG5vdCBwb3NzaWJsZSB1c2luZyBgcGFnZS5tb3VzZWAuXG4gKiBJbnN0ZWFkLCB5b3UgY2FuIHVzZSB0aGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudE9yU2hhZG93Um9vdC9nZXRTZWxlY3Rpb24gfCBgRG9jdW1lbnRPclNoYWRvd1Jvb3QuZ2V0U2VsZWN0aW9uKClgfSBmdW5jdGlvbmFsaXR5IGltcGxlbWVudGVkIGluIHRoZSBwbGF0Zm9ybS5cbiAqXG4gKiBAZXhhbXBsZVxuICogRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHNlbGVjdCBhbGwgY29udGVudCBiZXR3ZWVuIG5vZGVzOlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBwYWdlLmV2YWx1YXRlKFxuICogICAoZnJvbSwgdG8pID0+IHtcbiAqICAgICBjb25zdCBzZWxlY3Rpb24gPSBmcm9tLmdldFJvb3ROb2RlKCkuZ2V0U2VsZWN0aW9uKCk7XG4gKiAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICogICAgIHJhbmdlLnNldFN0YXJ0QmVmb3JlKGZyb20pO1xuICogICAgIHJhbmdlLnNldEVuZEFmdGVyKHRvKTtcbiAqICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gKiAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAqICAgfSxcbiAqICAgZnJvbUpTSGFuZGxlLFxuICogICB0b0pTSGFuZGxlXG4gKiApO1xuICogYGBgXG4gKlxuICogSWYgeW91IHRoZW4gd291bGQgd2FudCB0byBjb3B5LXBhc3RlIHlvdXIgc2VsZWN0aW9uLCB5b3UgY2FuIHVzZSB0aGUgY2xpcGJvYXJkIGFwaTpcbiAqXG4gKiBgYGB0c1xuICogLy8gVGhlIGNsaXBib2FyZCBhcGkgZG9lcyBub3QgYWxsb3cgeW91IHRvIGNvcHksIHVubGVzcyB0aGUgdGFiIGlzIGZvY3VzZWQuXG4gKiBhd2FpdCBwYWdlLmJyaW5nVG9Gcm9udCgpO1xuICogYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7XG4gKiAgIC8vIENvcHkgdGhlIHNlbGVjdGVkIGNvbnRlbnQgdG8gdGhlIGNsaXBib2FyZFxuICogICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICogICAvLyBPYnRhaW4gdGhlIGNvbnRlbnQgb2YgdGhlIGNsaXBib2FyZCBhcyBhIHN0cmluZ1xuICogICByZXR1cm4gbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpO1xuICogfSk7XG4gKiBgYGBcbiAqXG4gKiAqKk5vdGUqKjogSWYgeW91IHdhbnQgYWNjZXNzIHRvIHRoZSBjbGlwYm9hcmQgQVBJLFxuICogeW91IGhhdmUgdG8gZ2l2ZSBpdCBwZXJtaXNzaW9uIHRvIGRvIHNvOlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBicm93c2VyXG4gKiAgIC5kZWZhdWx0QnJvd3NlckNvbnRleHQoKVxuICogICAub3ZlcnJpZGVQZXJtaXNzaW9ucygnPHlvdXIgb3JpZ2luPicsIFtcbiAqICAgICAnY2xpcGJvYXJkLXJlYWQnLFxuICogICAgICdjbGlwYm9hcmQtd3JpdGUnLFxuICogICBdKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIE1vdXNlIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxufVxuLyoqXG4gKiBUaGUgVG91Y2hzY3JlZW4gY2xhc3MgZXhwb3NlcyB0b3VjaHNjcmVlbiBldmVudHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUb3VjaHNjcmVlbiB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVzIGEgYHRvdWNoc3RhcnRgIGFuZCBgdG91Y2hlbmRgIGV2ZW50LlxuICAgICAqIEBwYXJhbSB4IC0gSG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgdGFwLlxuICAgICAqIEBwYXJhbSB5IC0gVmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHRhcC5cbiAgICAgKi9cbiAgICBhc3luYyB0YXAoeCwgeSkge1xuICAgICAgICBhd2FpdCB0aGlzLnRvdWNoU3RhcnQoeCwgeSk7XG4gICAgICAgIGF3YWl0IHRoaXMudG91Y2hFbmQoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbnB1dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fcnVuSW5pdGlhbGl6ZXJzID0gKHRoaXMgJiYgdGhpcy5fX3J1bkluaXRpYWxpemVycykgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcbnZhciBfX2VzRGVjb3JhdGUgPSAodGhpcyAmJiB0aGlzLl9fZXNEZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gICAgZG9uZSA9IHRydWU7XG59O1xudmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbmltcG9ydCB7IGRlYnVnRXJyb3IsIHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlYWJsZSwgdGhyb3dJZkRpc3Bvc2VkIH0gZnJvbSAnLi4vdXRpbC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VTeW1ib2wsIGFzeW5jRGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYSBKYXZhU2NyaXB0IG9iamVjdC4gSW5zdGFuY2VzIGNhbiBiZSBjcmVhdGVkIHVzaW5nXG4gKiB7QGxpbmsgUGFnZS5ldmFsdWF0ZUhhbmRsZX0uXG4gKlxuICogSGFuZGxlcyBwcmV2ZW50IHRoZSByZWZlcmVuY2VkIEphdmFTY3JpcHQgb2JqZWN0IGZyb20gYmVpbmcgZ2FyYmFnZS1jb2xsZWN0ZWRcbiAqIHVubGVzcyB0aGUgaGFuZGxlIGlzIHB1cnBvc2VseSB7QGxpbmsgSlNIYW5kbGUuZGlzcG9zZSB8IGRpc3Bvc2VkfS4gSlNIYW5kbGVzXG4gKiBhcmUgYXV0by1kaXNwb3NlZCB3aGVuIHRoZWlyIGFzc29jaWF0ZWQgZnJhbWUgaXMgbmF2aWdhdGVkIGF3YXkgb3IgdGhlIHBhcmVudFxuICogY29udGV4dCBnZXRzIGRlc3Ryb3llZC5cbiAqXG4gKiBIYW5kbGVzIGNhbiBiZSB1c2VkIGFzIGFyZ3VtZW50cyBmb3IgYW55IGV2YWx1YXRpb24gZnVuY3Rpb24gc3VjaCBhc1xuICoge0BsaW5rIFBhZ2UuJGV2YWx9LCB7QGxpbmsgUGFnZS5ldmFsdWF0ZX0sIGFuZCB7QGxpbmsgUGFnZS5ldmFsdWF0ZUhhbmRsZX0uXG4gKiBUaGV5IGFyZSByZXNvbHZlZCB0byB0aGVpciByZWZlcmVuY2VkIG9iamVjdC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCB3aW5kb3dIYW5kbGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlSGFuZGxlKCgpID0+IHdpbmRvdyk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmxldCBKU0hhbmRsZSA9ICgoKSA9PiB7XG4gICAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbbW92ZWFibGVdO1xuICAgIGxldCBfY2xhc3NEZXNjcmlwdG9yO1xuICAgIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfY2xhc3NUaGlzO1xuICAgIGxldCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfZ2V0UHJvcGVydHlfZGVjb3JhdG9ycztcbiAgICBsZXQgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycztcbiAgICB2YXIgSlNIYW5kbGUgPSBjbGFzcyB7XG4gICAgICAgIHN0YXRpYyB7IF9jbGFzc1RoaXMgPSB0aGlzOyB9XG4gICAgICAgIHN0YXRpYyB7XG4gICAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZ2V0UHJvcGVydHlfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImdldFByb3BlcnR5XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJnZXRQcm9wZXJ0eVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmdldFByb3BlcnR5IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9nZXRQcm9wZXJ0aWVzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJnZXRQcm9wZXJ0aWVzXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJnZXRQcm9wZXJ0aWVzXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZ2V0UHJvcGVydGllcyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6IFwiY2xhc3NcIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIEpTSGFuZGxlID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7XG4gICAgICAgICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7XG4gICAgICAgICAgICBfX3J1bkluaXRpYWxpemVycyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBfX3J1bkluaXRpYWxpemVycyh0aGlzLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCBoYW5kbGUgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlYWxtLmV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgdGhpcywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCBoYW5kbGUgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZXZhbHVhdGVIYW5kbGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlYWxtLmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgdGhpcywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ldmFsdWF0ZUhhbmRsZSgob2JqZWN0LCBwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0W3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICB9LCBwcm9wZXJ0eU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgbWFwIG9mIGhhbmRsZXMgcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IGhhbmRsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgbGlzdEhhbmRsZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGVIYW5kbGUoKCkgPT4gZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICAgICAqIGNvbnN0IHByb3BlcnRpZXMgPSBhd2FpdCBsaXN0SGFuZGxlLmdldFByb3BlcnRpZXMoKTtcbiAgICAgICAgICogY29uc3QgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICogZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzLnZhbHVlcygpKSB7XG4gICAgICAgICAqICAgY29uc3QgZWxlbWVudCA9IHByb3BlcnR5LmFzRWxlbWVudCgpO1xuICAgICAgICAgKiAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAqICAgICBjaGlsZHJlbi5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgKiAgIH1cbiAgICAgICAgICogfVxuICAgICAgICAgKiBjaGlsZHJlbjsgLy8gaG9sZHMgZWxlbWVudEhhbmRsZXMgdG8gYWxsIGNoaWxkcmVuIG9mIGRvY3VtZW50LmJvZHlcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lcyA9IGF3YWl0IHRoaXMuZXZhbHVhdGUob2JqZWN0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnVtZXJhYmxlUHJvcGVydGllcyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiBkZXNjcmlwdG9ycykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcnNbcHJvcGVydHlOYW1lXT8uZW51bWVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnVtZXJhYmxlUHJvcGVydGllcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb3BlcnR5TmFtZXMubWFwKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoa2V5KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnR5TmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIHJlc3VsdHNba2V5XSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KHZhbHVlLCBoYW5kbGUubW92ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudl8xLmVycm9yID0gZV8xO1xuICAgICAgICAgICAgICAgICAgICBlbnZfMS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBbKF9nZXRQcm9wZXJ0eV9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpXSwgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKV0sIGRpc3Bvc2VTeW1ib2wpXSgpIHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZGlzcG9zZSgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgW2FzeW5jRGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBKU0hhbmRsZSA9IF9jbGFzc1RoaXM7XG59KSgpO1xuZXhwb3J0IHsgSlNIYW5kbGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUpTSGFuZGxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG52YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xuaW1wb3J0IHsgY29uY2F0LCBFTVBUWSwgZmlsdGVyLCBmaXJzdCwgZmlyc3RWYWx1ZUZyb20sIGZyb20sIG1hcCwgbWVyZ2UsIG1lcmdlTWFwLCBtZXJnZVNjYW4sIG9mLCByYWNlV2l0aCwgUmVwbGF5U3ViamVjdCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2UsIHRha2VVbnRpbCwgdGltZXIsIH0gZnJvbSAnLi4vLi4vdGhpcmRfcGFydHkvcnhqcy9yeGpzLmpzJztcbmltcG9ydCB7IFRhcmdldENsb3NlRXJyb3IgfSBmcm9tICcuLi9jb21tb24vRXJyb3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IFRpbWVvdXRTZXR0aW5ncyB9IGZyb20gJy4uL2NvbW1vbi9UaW1lb3V0U2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgZnJvbUVtaXR0ZXJFdmVudCwgZmlsdGVyQXN5bmMsIGltcG9ydEZTUHJvbWlzZXMsIGlzU3RyaW5nLCBORVRXT1JLX0lETEVfVElNRSwgdGltZW91dCwgd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSwgZnJvbUFib3J0U2lnbmFsLCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuLi91dGlsL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQXN5bmNEaXNwb3NhYmxlU3RhY2ssIGFzeW5jRGlzcG9zZVN5bWJvbCwgRGlzcG9zYWJsZVN0YWNrLCBkaXNwb3NlU3ltYm9sLCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbkxvY2F0b3IsIExvY2F0b3IsIE5vZGVMb2NhdG9yLCB9IGZyb20gJy4vbG9jYXRvcnMvbG9jYXRvcnMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRTY3JlZW5zaG90T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5vcHRpbWl6ZUZvclNwZWVkID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLnR5cGUgPz89ICdwbmcnO1xuICAgIG9wdGlvbnMuZnJvbVN1cmZhY2UgPz89IHRydWU7XG4gICAgb3B0aW9ucy5mdWxsUGFnZSA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5vbWl0QmFja2dyb3VuZCA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5lbmNvZGluZyA/Pz0gJ2JpbmFyeSc7XG4gICAgb3B0aW9ucy5jYXB0dXJlQmV5b25kVmlld3BvcnQgPz89IHRydWU7XG59XG4vKipcbiAqIFBhZ2UgcHJvdmlkZXMgbWV0aG9kcyB0byBpbnRlcmFjdCB3aXRoIGEgc2luZ2xlIHRhYiBvclxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZXh0ZW5zaW9ucy9iYWNrZ3JvdW5kX3BhZ2VzIHwgZXh0ZW5zaW9uIGJhY2tncm91bmQgcGFnZX1cbiAqIGluIHRoZSBicm93c2VyLlxuICpcbiAqIDo6Om5vdGVcbiAqXG4gKiBPbmUgQnJvd3NlciBpbnN0YW5jZSBtaWdodCBoYXZlIG11bHRpcGxlIFBhZ2UgaW5zdGFuY2VzLlxuICpcbiAqIDo6OlxuICpcbiAqIEBleGFtcGxlXG4gKiBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIHBhZ2UsIG5hdmlnYXRlcyBpdCB0byBhIFVSTCwgYW5kIHRoZW4gc2F2ZXMgYSBzY3JlZW5zaG90OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gKlxuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vZXhhbXBsZS5jb20nKTtcbiAqICAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHtwYXRoOiAnc2NyZWVuc2hvdC5wbmcnfSk7XG4gKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqIH0pKCk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgUGFnZSBjbGFzcyBleHRlbmRzIGZyb20gUHVwcGV0ZWVyJ3Mge0BsaW5rIEV2ZW50RW1pdHRlcn0gY2xhc3MgYW5kIHdpbGxcbiAqIGVtaXQgdmFyaW91cyBldmVudHMgd2hpY2ggYXJlIGRvY3VtZW50ZWQgaW4gdGhlIHtAbGluayBQYWdlRXZlbnR9IGVudW0uXG4gKlxuICogQGV4YW1wbGVcbiAqIFRoaXMgZXhhbXBsZSBsb2dzIGEgbWVzc2FnZSBmb3IgYSBzaW5nbGUgcGFnZSBgbG9hZGAgZXZlbnQ6XG4gKlxuICogYGBgdHNcbiAqIHBhZ2Uub25jZSgnbG9hZCcsICgpID0+IGNvbnNvbGUubG9nKCdQYWdlIGxvYWRlZCEnKSk7XG4gKiBgYGBcbiAqXG4gKiBUbyB1bnN1YnNjcmliZSBmcm9tIGV2ZW50cyB1c2UgdGhlIHtAbGluayBFdmVudEVtaXR0ZXIub2ZmfSBtZXRob2Q6XG4gKlxuICogYGBgdHNcbiAqIGZ1bmN0aW9uIGxvZ1JlcXVlc3QoaW50ZXJjZXB0ZWRSZXF1ZXN0KSB7XG4gKiAgIGNvbnNvbGUubG9nKCdBIHJlcXVlc3Qgd2FzIG1hZGU6JywgaW50ZXJjZXB0ZWRSZXF1ZXN0LnVybCgpKTtcbiAqIH1cbiAqIHBhZ2Uub24oJ3JlcXVlc3QnLCBsb2dSZXF1ZXN0KTtcbiAqIC8vIFNvbWV0aW1lIGxhdGVyLi4uXG4gKiBwYWdlLm9mZigncmVxdWVzdCcsIGxvZ1JlcXVlc3QpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5sZXQgUGFnZSA9ICgoKSA9PiB7XG4gICAgbGV0IF9jbGFzc1N1cGVyID0gRXZlbnRFbWl0dGVyO1xuICAgIGxldCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfc2NyZWVuc2hvdF9kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBQYWdlIGV4dGVuZHMgX2NsYXNzU3VwZXIge1xuICAgICAgICBzdGF0aWMge1xuICAgICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2NyZWVuc2hvdF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2NyZWVuc2hvdFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwic2NyZWVuc2hvdFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNjcmVlbnNob3QgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX2lzRHJhZ2dpbmcgPSAoX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpLCBmYWxzZSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIF90aW1lb3V0U2V0dGluZ3MgPSBuZXcgVGltZW91dFNldHRpbmdzKCk7XG4gICAgICAgICNyZXF1ZXN0SGFuZGxlcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAjaW5mbGlnaHQkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJyZXF1ZXN0XCIgLyogUGFnZUV2ZW50LlJlcXVlc3QgKi8pXG4gICAgICAgICAgICAgICAgLnBpcGUobWVyZ2VNYXAob3JpZ2luYWxSZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uY2F0KG9mKDEpLCBtZXJnZShmcm9tRW1pdHRlckV2ZW50KHRoaXMsIFwicmVxdWVzdGZhaWxlZFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0RmFpbGVkICovKSwgZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInJlcXVlc3RmaW5pc2hlZFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0RmluaXNoZWQgKi8pLCBmcm9tRW1pdHRlckV2ZW50KHRoaXMsIFwicmVzcG9uc2VcIiAvKiBQYWdlRXZlbnQuUmVzcG9uc2UgKi8pLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB9KSkpLnBpcGUoZmlsdGVyKHJlcXVlc3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5pZCA9PT0gb3JpZ2luYWxSZXF1ZXN0LmlkO1xuICAgICAgICAgICAgICAgIH0pLCB0YWtlKDEpLCBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIH0pLCBtZXJnZVNjYW4oKGFjYywgYWRkZW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKGFjYyArIGFkZGVuZCk7XG4gICAgICAgICAgICB9LCAwKSwgdGFrZVVudGlsKGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykpLCBzdGFydFdpdGgoMCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLiNpbmZsaWdodCQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0ZW4gdG8gcGFnZSBldmVudHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGV4aXN0cyB0byBkZWZpbmUgZXZlbnQgdHlwaW5ncyBhbmQgaGFuZGxlIHByb3BlciB3aXJldXAgb2ZcbiAgICAgICAgICogY29vcGVyYXRpdmUgcmVxdWVzdCBpbnRlcmNlcHRpb24uIEFjdHVhbCBldmVudCBsaXN0ZW5pbmcgYW5kIGRpc3BhdGNoaW5nIGlzXG4gICAgICAgICAqIGRlbGVnYXRlZCB0byB7QGxpbmsgRXZlbnRFbWl0dGVyfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBvbih0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgICAgICBpZiAodHlwZSAhPT0gXCJyZXF1ZXN0XCIgLyogUGFnZUV2ZW50LlJlcXVlc3QgKi8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIub24odHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgd3JhcHBlciA9IHRoaXMuI3JlcXVlc3RIYW5kbGVycy5nZXQoaGFuZGxlcik7XG4gICAgICAgICAgICBpZiAod3JhcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5lbnF1ZXVlSW50ZXJjZXB0QWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZXF1ZXN0SGFuZGxlcnMuc2V0KGhhbmRsZXIsIHdyYXBwZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uKHR5cGUsIHdyYXBwZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIG9mZih0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJyZXF1ZXN0XCIgLyogUGFnZUV2ZW50LlJlcXVlc3QgKi8pIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcmVxdWVzdEhhbmRsZXJzLmdldChoYW5kbGVyKSB8fCBoYW5kbGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9mZih0eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICoge0Bpbmhlcml0RG9jIEFjY2Vzc2liaWxpdHl9XG4gICAgICAgICAqL1xuICAgICAgICBnZXQgYWNjZXNzaWJpbGl0eSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLmFjY2Vzc2liaWxpdHk7XG4gICAgICAgIH1cbiAgICAgICAgbG9jYXRvcihzZWxlY3Rvck9yRnVuYykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxlY3Rvck9yRnVuYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZUxvY2F0b3IuY3JlYXRlKHRoaXMsIHNlbGVjdG9yT3JGdW5jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbkxvY2F0b3IuY3JlYXRlKHRoaXMsIHNlbGVjdG9yT3JGdW5jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQSBzaG9ydGN1dCBmb3Ige0BsaW5rIExvY2F0b3IucmFjZX0gdGhhdCBkb2VzIG5vdCByZXF1aXJlIHN0YXRpYyBpbXBvcnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGxvY2F0b3JSYWNlKGxvY2F0b3JzKSB7XG4gICAgICAgICAgICByZXR1cm4gTG9jYXRvci5yYWNlKGxvY2F0b3JzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4gSWYgbm8gZWxlbWVudCBtYXRjaGVzXG4gICAgICAgICAqIHRoZSBzZWxlY3RvciwgdGhlIHJldHVybiB2YWx1ZSByZXNvbHZlcyB0byBgbnVsbGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuJCB8IFBhZ2UubWFpbkZyYW1lKCkuJChzZWxlY3RvcikgfS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLiQoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaW5kcyBlbGVtZW50cyBvbiB0aGUgcGFnZSB0aGF0IG1hdGNoIHRoZSBzZWxlY3Rvci4gSWYgbm8gZWxlbWVudHNcbiAgICAgICAgICogbWF0Y2ggdGhlIHNlbGVjdG9yLCB0aGUgcmV0dXJuIHZhbHVlIHJlc29sdmVzIHRvIGBbXWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuJCQgfCBQYWdlLm1haW5GcmFtZSgpLiQkKHNlbGVjdG9yKSB9LlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgJCQoc2VsZWN0b3IsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLiQkKHNlbGVjdG9yLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHtAbGluayBQYWdlLmV2YWx1YXRlIHwgcGFnZS5ldmFsdWF0ZX0gYW5kXG4gICAgICAgICAqIGBwYWdlLmV2YWx1YXRlSGFuZGxlYCBpcyB0aGF0IGBldmFsdWF0ZUhhbmRsZWAgd2lsbCByZXR1cm4gdGhlIHZhbHVlXG4gICAgICAgICAqIHdyYXBwZWQgaW4gYW4gaW4tcGFnZSBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gYHBhZ2UuZXZhbHVhdGVIYW5kbGVgIHJldHVybnMgYSBQcm9taXNlLCB0aGVcbiAgICAgICAgICogZnVuY3Rpb24gd2lsbCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0byByZXNvbHZlIGFuZCByZXR1cm4gaXRzIHZhbHVlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBZb3UgY2FuIHBhc3MgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIChhbHRob3VnaCBmdW5jdGlvbnMgYXJlXG4gICAgICAgICAqIHJlY29tbWVuZGVkIGFzIHRoZXkgYXJlIGVhc2llciB0byBkZWJ1ZyBhbmQgdXNlIHdpdGggVHlwZVNjcmlwdCk6XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGFIYW5kbGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlSGFuZGxlKCdkb2N1bWVudCcpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICoge0BsaW5rIEpTSGFuZGxlfSBpbnN0YW5jZXMgY2FuIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gdGhlIGBwYWdlRnVuY3Rpb25gOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBhSGFuZGxlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZUhhbmRsZSgoKSA9PiBkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICogY29uc3QgcmVzdWx0SGFuZGxlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZUhhbmRsZShcbiAgICAgICAgICogICBib2R5ID0+IGJvZHkuaW5uZXJIVE1MLFxuICAgICAgICAgKiAgIGFIYW5kbGVcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc29sZS5sb2coYXdhaXQgcmVzdWx0SGFuZGxlLmpzb25WYWx1ZSgpKTtcbiAgICAgICAgICogYXdhaXQgcmVzdWx0SGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIE1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEge0BsaW5rIEpTSGFuZGxlfSxcbiAgICAgICAgICogYnV0IGlmIGBwYWdlRnVuY3Rpb25gIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudCxcbiAgICAgICAgICogeW91IGluc3RlYWQgZ2V0IGFuIHtAbGluayBFbGVtZW50SGFuZGxlfSBiYWNrOlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBidXR0b24gPSBhd2FpdCBwYWdlLmV2YWx1YXRlSGFuZGxlKCgpID0+XG4gICAgICAgICAqICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uJylcbiAgICAgICAgICogKTtcbiAgICAgICAgICogLy8gY2FuIGNhbGwgYGNsaWNrYCBiZWNhdXNlIGBidXR0b25gIGlzIGFuIGBFbGVtZW50SGFuZGxlYFxuICAgICAgICAgKiBhd2FpdCBidXR0b24uY2xpY2soKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBUeXBlU2NyaXB0IGRlZmluaXRpb25zIGFzc3VtZSB0aGF0IGBldmFsdWF0ZUhhbmRsZWAgcmV0dXJuc1xuICAgICAgICAgKiBhIGBKU0hhbmRsZWAsIGJ1dCBpZiB5b3Uga25vdyBpdCdzIGdvaW5nIHRvIHJldHVybiBhblxuICAgICAgICAgKiBgRWxlbWVudEhhbmRsZWAsIHBhc3MgaXQgYXMgdGhlIGdlbmVyaWMgYXJndW1lbnQ6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGJ1dHRvbiA9IGF3YWl0IHBhZ2UuZXZhbHVhdGVIYW5kbGU8RWxlbWVudEhhbmRsZT4oLi4uKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBhIGZ1bmN0aW9uIHRoYXQgaXMgcnVuIHdpdGhpbiB0aGUgcGFnZVxuICAgICAgICAgKiBAcGFyYW0gYXJncyAtIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHBhZ2VGdW5jdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZXZhbHVhdGVIYW5kbGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IHdpdGhpbiB0aGUgcGFnZSB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yXG4gICAgICAgICAqIGFuZCBwYXNzZXMgdGhlIHJlc3VsdCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBJZiBubyBlbGVtZW50IGlzIGZvdW5kIG1hdGNoaW5nIGBzZWxlY3RvcmAsIHRoZSBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgYHBhZ2VGdW5jdGlvbmAgcmV0dXJucyBhIHByb21pc2UgYCRldmFsYCB3aWxsIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvXG4gICAgICAgICAqIHJlc29sdmUgYW5kIHRoZW4gcmV0dXJuIGl0cyB2YWx1ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VhcmNoVmFsdWUgPSBhd2FpdCBwYWdlLiRldmFsKCcjc2VhcmNoJywgZWwgPT4gZWwudmFsdWUpO1xuICAgICAgICAgKiBjb25zdCBwcmVsb2FkSHJlZiA9IGF3YWl0IHBhZ2UuJGV2YWwoJ2xpbmtbcmVsPXByZWxvYWRdJywgZWwgPT4gZWwuaHJlZik7XG4gICAgICAgICAqIGNvbnN0IGh0bWwgPSBhd2FpdCBwYWdlLiRldmFsKCcubWFpbi1jb250YWluZXInLCBlbCA9PiBlbC5vdXRlckhUTUwpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogSWYgeW91IGFyZSB1c2luZyBUeXBlU2NyaXB0LCB5b3UgbWF5IGhhdmUgdG8gcHJvdmlkZSBhbiBleHBsaWNpdCB0eXBlIHRvIHRoZVxuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgdHlwZWQgYXMgYEVsZW1lbnRgLCBidXQgeW91IG1heSBuZWVkIHRvIHByb3ZpZGUgYSBtb3JlXG4gICAgICAgICAqIHNwZWNpZmljIHN1Yi10eXBlOlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiAvLyBpZiB5b3UgZG9uJ3QgcHJvdmlkZSBIVE1MSW5wdXRFbGVtZW50IGhlcmUsIFRTIHdpbGwgZXJyb3JcbiAgICAgICAgICogLy8gYXMgYHZhbHVlYCBpcyBub3Qgb24gYEVsZW1lbnRgXG4gICAgICAgICAqIGNvbnN0IHNlYXJjaFZhbHVlID0gYXdhaXQgcGFnZS4kZXZhbChcbiAgICAgICAgICogICAnI3NlYXJjaCcsXG4gICAgICAgICAqICAgKGVsOiBIVE1MSW5wdXRFbGVtZW50KSA9PiBlbC52YWx1ZVxuICAgICAgICAgKiApO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIGluZmVyIHRoZSByZXR1cm4gdHlwZVxuICAgICAgICAgKiBmcm9tIHRoZSBgcGFnZUZ1bmN0aW9uYCB5b3UgcHJvdmlkZS4gSWYgaXQgaXMgdW5hYmxlIHRvLCB5b3UgY2FuIHVzZSB0aGUgZ2VuZXJpY1xuICAgICAgICAgKiB0eXBlIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHdoYXQgcmV0dXJuIHR5cGUgeW91IGV4cGVjdCBmcm9tIGAkZXZhbGA6XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIC8vIFRoZSBjb21waWxlciBjYW4gaW5mZXIgdGhlIHJldHVybiB0eXBlIGluIHRoaXMgY2FzZSwgYnV0IGlmIGl0IGNhbid0XG4gICAgICAgICAqIC8vIG9yIGlmIHlvdSB3YW50IHRvIGJlIG1vcmUgZXhwbGljaXQsIHByb3ZpZGUgaXQgYXMgdGhlIGdlbmVyaWMgdHlwZS5cbiAgICAgICAgICogY29uc3Qgc2VhcmNoVmFsdWUgPSBhd2FpdCBwYWdlLiRldmFsPHN0cmluZz4oXG4gICAgICAgICAqICAgJyNzZWFyY2gnLFxuICAgICAgICAgKiAgIChlbDogSFRNTElucHV0RWxlbWVudCkgPT4gZWwudmFsdWVcbiAgICAgICAgICogKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSB0aGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBwYWdlIGNvbnRleHQuXG4gICAgICAgICAqIFdpbGwgYmUgcGFzc2VkIHRoZSByZXN1bHQgb2YgdGhlIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yIGFzIGl0c1xuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0aHJvdWdoIHRvIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgYHBhZ2VGdW5jdGlvbmAuIElmIGl0IHJldHVybnMgYW4gZWxlbWVudCBpdFxuICAgICAgICAgKiBpcyB3cmFwcGVkIGluIGFuIHtAbGluayBFbGVtZW50SGFuZGxlfSwgZWxzZSB0aGUgcmF3IHZhbHVlIGl0c2VsZiBpc1xuICAgICAgICAgKiByZXR1cm5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICRldmFsKHNlbGVjdG9yLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy4kZXZhbC5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuJGV2YWwoc2VsZWN0b3IsIHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvciBhbmQgcGFzc2VzIHRoZVxuICAgICAgICAgKiByZXN1bHRpbmcgYXJyYXkgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBgcGFnZUZ1bmN0aW9uYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogSWYgYHBhZ2VGdW5jdGlvbmAgcmV0dXJucyBhIHByb21pc2UgYCQkZXZhbGAgd2lsbCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0b1xuICAgICAgICAgKiByZXNvbHZlIGFuZCB0aGVuIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIC8vIGdldCB0aGUgYW1vdW50IG9mIGRpdnMgb24gdGhlIHBhZ2VcbiAgICAgICAgICogY29uc3QgZGl2Q291bnQgPSBhd2FpdCBwYWdlLiQkZXZhbCgnZGl2JywgZGl2cyA9PiBkaXZzLmxlbmd0aCk7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIGdldCB0aGUgdGV4dCBjb250ZW50IG9mIGFsbCB0aGUgYC5vcHRpb25zYCBlbGVtZW50czpcbiAgICAgICAgICogY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHBhZ2UuJCRldmFsKCdkaXYgPiBzcGFuLm9wdGlvbnMnLCBvcHRpb25zID0+IHtcbiAgICAgICAgICogICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+IG9wdGlvbi50ZXh0Q29udGVudCk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogSWYgeW91IGFyZSB1c2luZyBUeXBlU2NyaXB0LCB5b3UgbWF5IGhhdmUgdG8gcHJvdmlkZSBhbiBleHBsaWNpdCB0eXBlIHRvIHRoZVxuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgdHlwZWQgYXMgYEVsZW1lbnRbXWAsIGJ1dCB5b3UgbWF5IG5lZWQgdG8gcHJvdmlkZSBhIG1vcmVcbiAgICAgICAgICogc3BlY2lmaWMgc3ViLXR5cGU6XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGF3YWl0IHBhZ2UuJCRldmFsKCdpbnB1dCcsIGVsZW1lbnRzID0+IHtcbiAgICAgICAgICogICByZXR1cm4gZWxlbWVudHMubWFwKGUgPT4gZS52YWx1ZSk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIGluZmVyIHRoZSByZXR1cm4gdHlwZVxuICAgICAgICAgKiBmcm9tIHRoZSBgcGFnZUZ1bmN0aW9uYCB5b3UgcHJvdmlkZS4gSWYgaXQgaXMgdW5hYmxlIHRvLCB5b3UgY2FuIHVzZSB0aGUgZ2VuZXJpY1xuICAgICAgICAgKiB0eXBlIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHdoYXQgcmV0dXJuIHR5cGUgeW91IGV4cGVjdCBmcm9tIGAkJGV2YWxgOlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBhbGxJbnB1dFZhbHVlcyA9IGF3YWl0IHBhZ2UuJCRldmFsKCdpbnB1dCcsIGVsZW1lbnRzID0+XG4gICAgICAgICAqICAgZWxlbWVudHMubWFwKGUgPT4gZS50ZXh0Q29udGVudClcbiAgICAgICAgICogKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSB0aGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBwYWdlIGNvbnRleHQuXG4gICAgICAgICAqIFdpbGwgYmUgcGFzc2VkIGFuIGFycmF5IG9mIG1hdGNoaW5nIGVsZW1lbnRzIGFzIGl0cyBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0aHJvdWdoIHRvIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgYHBhZ2VGdW5jdGlvbmAuIElmIGl0IHJldHVybnMgYW4gZWxlbWVudCBpdFxuICAgICAgICAgKiBpcyB3cmFwcGVkIGluIGFuIHtAbGluayBFbGVtZW50SGFuZGxlfSwgZWxzZSB0aGUgcmF3IHZhbHVlIGl0c2VsZiBpc1xuICAgICAgICAgKiByZXR1cm5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuJCRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluRnJhbWUoKS4kJGV2YWwoc2VsZWN0b3IsIHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgYSBgPHNjcmlwdD5gIHRhZyBpbnRvIHRoZSBwYWdlIHdpdGggdGhlIGRlc2lyZWQgVVJMIG9yIGNvbnRlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFNob3J0Y3V0IGZvclxuICAgICAgICAgKiB7QGxpbmsgRnJhbWUuYWRkU2NyaXB0VGFnIHwgcGFnZS5tYWluRnJhbWUoKS5hZGRTY3JpcHRUYWcob3B0aW9ucyl9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBzY3JpcHQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIHtAbGluayBFbGVtZW50SGFuZGxlIHwgZWxlbWVudCBoYW5kbGV9IHRvIHRoZSBpbmplY3RlZFxuICAgICAgICAgKiBgPHNjcmlwdD5gIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhZGRTY3JpcHRUYWcob3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuYWRkU2NyaXB0VGFnKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGFkZFN0eWxlVGFnKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmFkZFN0eWxlVGFnKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGFnZSdzIFVSTC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogU2hvcnRjdXQgZm9yIHtAbGluayBGcmFtZS51cmwgfCBwYWdlLm1haW5GcmFtZSgpLnVybCgpfS5cbiAgICAgICAgICovXG4gICAgICAgIHVybCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLnVybCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZnVsbCBIVE1MIGNvbnRlbnRzIG9mIHRoZSBwYWdlLCBpbmNsdWRpbmcgdGhlIERPQ1RZUEUuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjb250ZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuY29udGVudCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBodG1sIC0gSFRNTCBtYXJrdXAgdG8gYXNzaWduIHRvIHRoZSBwYWdlLlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFBhcmFtZXRlcnMgdGhhdCBoYXMgc29tZSBwcm9wZXJ0aWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2V0Q29udGVudChodG1sLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLnNldENvbnRlbnQoaHRtbCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHtAaW5oZXJpdERvYyBGcmFtZS5nb3RvfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZ290byh1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmdvdG8odXJsLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdHMgZm9yIHRoZSBwYWdlIHRvIG5hdmlnYXRlIHRvIGEgbmV3IFVSTCBvciB0byByZWxvYWQuIEl0IGlzIHVzZWZ1bCB3aGVuXG4gICAgICAgICAqIHlvdSBydW4gY29kZSB0aGF0IHdpbGwgaW5kaXJlY3RseSBjYXVzZSB0aGUgcGFnZSB0byBuYXZpZ2F0ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgW3Jlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICogICBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKCksIC8vIFRoZSBwcm9taXNlIHJlc29sdmVzIGFmdGVyIG5hdmlnYXRpb24gaGFzIGZpbmlzaGVkXG4gICAgICAgICAqICAgcGFnZS5jbGljaygnYS5teS1saW5rJyksIC8vIENsaWNraW5nIHRoZSBsaW5rIHdpbGwgaW5kaXJlY3RseSBjYXVzZSBhIG5hdmlnYXRpb25cbiAgICAgICAgICogXSk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBVc2FnZSBvZiB0aGVcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IaXN0b3J5X0FQSSB8IEhpc3RvcnkgQVBJfVxuICAgICAgICAgKiB0byBjaGFuZ2UgdGhlIFVSTCBpcyBjb25zaWRlcmVkIGEgbmF2aWdhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBOYXZpZ2F0aW9uIHBhcmFtZXRlcnMgd2hpY2ggbWlnaHQgaGF2ZSB0aGUgZm9sbG93aW5nXG4gICAgICAgICAqIHByb3BlcnRpZXM6XG4gICAgICAgICAqIEByZXR1cm5zIEEgYFByb21pc2VgIHdoaWNoIHJlc29sdmVzIHRvIHRoZSBtYWluIHJlc291cmNlIHJlc3BvbnNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIEluIGNhc2Ugb2YgbXVsdGlwbGUgcmVkaXJlY3RzLCB0aGUgbmF2aWdhdGlvbiB3aWxsIHJlc29sdmUgd2l0aCB0aGVcbiAgICAgICAgICogICByZXNwb25zZSBvZiB0aGUgbGFzdCByZWRpcmVjdC5cbiAgICAgICAgICogLSBJbiBjYXNlIG9mIG5hdmlnYXRpb24gdG8gYSBkaWZmZXJlbnQgYW5jaG9yIG9yIG5hdmlnYXRpb24gZHVlIHRvIEhpc3RvcnlcbiAgICAgICAgICogICBBUEkgdXNhZ2UsIHRoZSBuYXZpZ2F0aW9uIHdpbGwgcmVzb2x2ZSB3aXRoIGBudWxsYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhaXRGb3JOYXZpZ2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkud2FpdEZvck5hdmlnYXRpb24ob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB1cmxPclByZWRpY2F0ZSAtIEEgVVJMIG9yIHByZWRpY2F0ZSB0byB3YWl0IGZvclxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHdhaXRpbmcgcGFyYW1ldGVyc1xuICAgICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSBtYXRjaGVkIHJlcXVlc3RcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgZmlyc3RSZXF1ZXN0ID0gYXdhaXQgcGFnZS53YWl0Rm9yUmVxdWVzdChcbiAgICAgICAgICogICAnaHR0cHM6Ly9leGFtcGxlLmNvbS9yZXNvdXJjZSdcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc3QgZmluYWxSZXF1ZXN0ID0gYXdhaXQgcGFnZS53YWl0Rm9yUmVxdWVzdChcbiAgICAgICAgICogICByZXF1ZXN0ID0+IHJlcXVlc3QudXJsKCkgPT09ICdodHRwczovL2V4YW1wbGUuY29tJ1xuICAgICAgICAgKiApO1xuICAgICAgICAgKiByZXR1cm4gZmluYWxSZXF1ZXN0LnJlc3BvbnNlKCk/Lm9rKCk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBPcHRpb25hbCBXYWl0aW5nIFBhcmFtZXRlcnMgaGF2ZTpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgdGltZW91dGA6IE1heGltdW0gd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcywgZGVmYXVsdHMgdG8gYDMwYCBzZWNvbmRzLCBwYXNzXG4gICAgICAgICAqICAgYDBgIHRvIGRpc2FibGUgdGhlIHRpbWVvdXQuIFRoZSBkZWZhdWx0IHZhbHVlIGNhbiBiZSBjaGFuZ2VkIGJ5IHVzaW5nIHRoZVxuICAgICAgICAgKiAgIHtAbGluayBQYWdlLnNldERlZmF1bHRUaW1lb3V0fSBtZXRob2QuXG4gICAgICAgICAqL1xuICAgICAgICB3YWl0Rm9yUmVxdWVzdCh1cmxPclByZWRpY2F0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSwgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxPclByZWRpY2F0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB1cmxPclByZWRpY2F0ZTtcbiAgICAgICAgICAgICAgICB1cmxPclByZWRpY2F0ZSA9IChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnVybCgpID09PSB1cmw7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmFibGUkID0gZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInJlcXVlc3RcIiAvKiBQYWdlRXZlbnQuUmVxdWVzdCAqLykucGlwZShmaWx0ZXJBc3luYyh1cmxPclByZWRpY2F0ZSksIHJhY2VXaXRoKHRpbWVvdXQobXMpLCBmcm9tQWJvcnRTaWduYWwoc2lnbmFsKSwgZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcImNsb3NlXCIgLyogUGFnZUV2ZW50LkNsb3NlICovKS5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldENsb3NlRXJyb3IoJ1BhZ2UgY2xvc2VkIScpO1xuICAgICAgICAgICAgfSkpKSk7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20ob2JzZXJ2YWJsZSQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gdXJsT3JQcmVkaWNhdGUgLSBBIFVSTCBvciBwcmVkaWNhdGUgdG8gd2FpdCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgd2FpdGluZyBwYXJhbWV0ZXJzXG4gICAgICAgICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIG1hdGNoZWQgcmVzcG9uc2UuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBhd2FpdCBwYWdlLndhaXRGb3JSZXNwb25zZShcbiAgICAgICAgICogICAnaHR0cHM6Ly9leGFtcGxlLmNvbS9yZXNvdXJjZSdcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc3QgZmluYWxSZXNwb25zZSA9IGF3YWl0IHBhZ2Uud2FpdEZvclJlc3BvbnNlKFxuICAgICAgICAgKiAgIHJlc3BvbnNlID0+XG4gICAgICAgICAqICAgICByZXNwb25zZS51cmwoKSA9PT0gJ2h0dHBzOi8vZXhhbXBsZS5jb20nICYmIHJlc3BvbnNlLnN0YXR1cygpID09PSAyMDBcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc3QgZmluYWxSZXNwb25zZSA9IGF3YWl0IHBhZ2Uud2FpdEZvclJlc3BvbnNlKGFzeW5jIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICogICByZXR1cm4gKGF3YWl0IHJlc3BvbnNlLnRleHQoKSkuaW5jbHVkZXMoJzxodG1sPicpO1xuICAgICAgICAgKiB9KTtcbiAgICAgICAgICogcmV0dXJuIGZpbmFsUmVzcG9uc2Uub2soKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIE9wdGlvbmFsIFBhcmFtZXRlciBoYXZlOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIGB0aW1lb3V0YDogTWF4aW11bSB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLCBkZWZhdWx0cyB0byBgMzBgIHNlY29uZHMsXG4gICAgICAgICAqICAgcGFzcyBgMGAgdG8gZGlzYWJsZSB0aGUgdGltZW91dC4gVGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWQgYnkgdXNpbmdcbiAgICAgICAgICogICB0aGUge0BsaW5rIFBhZ2Uuc2V0RGVmYXVsdFRpbWVvdXR9IG1ldGhvZC5cbiAgICAgICAgICovXG4gICAgICAgIHdhaXRGb3JSZXNwb25zZSh1cmxPclByZWRpY2F0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSwgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxPclByZWRpY2F0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB1cmxPclByZWRpY2F0ZTtcbiAgICAgICAgICAgICAgICB1cmxPclByZWRpY2F0ZSA9IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UudXJsKCkgPT09IHVybDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSQgPSBmcm9tRW1pdHRlckV2ZW50KHRoaXMsIFwicmVzcG9uc2VcIiAvKiBQYWdlRXZlbnQuUmVzcG9uc2UgKi8pLnBpcGUoZmlsdGVyQXN5bmModXJsT3JQcmVkaWNhdGUpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSwgZnJvbUFib3J0U2lnbmFsKHNpZ25hbCksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRDbG9zZUVycm9yKCdQYWdlIGNsb3NlZCEnKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKG9ic2VydmFibGUkKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdHMgZm9yIHRoZSBuZXR3b3JrIHRvIGJlIGlkbGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgd2FpdGluZyBiZWhhdmlvci5cbiAgICAgICAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIG9uY2UgdGhlIG5ldHdvcmsgaXMgaWRsZS5cbiAgICAgICAgICovXG4gICAgICAgIHdhaXRGb3JOZXR3b3JrSWRsZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLndhaXRGb3JOZXR3b3JrSWRsZSQob3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHdhaXRGb3JOZXR3b3JrSWRsZSQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSwgaWRsZVRpbWUgPSBORVRXT1JLX0lETEVfVElNRSwgY29uY3VycmVuY3kgPSAwLCBzaWduYWwsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2luZmxpZ2h0JC5waXBlKHN3aXRjaE1hcChpbmZsaWdodCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZmxpZ2h0ID4gY29uY3VycmVuY3kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGltZXIoaWRsZVRpbWUpO1xuICAgICAgICAgICAgfSksIG1hcCgoKSA9PiB7IH0pLCByYWNlV2l0aCh0aW1lb3V0KG1zKSwgZnJvbUFib3J0U2lnbmFsKHNpZ25hbCksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRDbG9zZUVycm9yKCdQYWdlIGNsb3NlZCEnKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXYWl0cyBmb3IgYSBmcmFtZSBtYXRjaGluZyB0aGUgZ2l2ZW4gY29uZGl0aW9ucyB0byBhcHBlYXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGZyYW1lID0gYXdhaXQgcGFnZS53YWl0Rm9yRnJhbWUoYXN5bmMgZnJhbWUgPT4ge1xuICAgICAgICAgKiAgIHJldHVybiBmcmFtZS5uYW1lKCkgPT09ICdUZXN0JztcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FpdEZvckZyYW1lKHVybE9yUHJlZGljYXRlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGltZW91dDogbXMgPSB0aGlzLmdldERlZmF1bHRUaW1lb3V0KCksIHNpZ25hbCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGlmIChpc1N0cmluZyh1cmxPclByZWRpY2F0ZSkpIHtcbiAgICAgICAgICAgICAgICB1cmxPclByZWRpY2F0ZSA9IChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsT3JQcmVkaWNhdGUgPT09IGZyYW1lLnVybCgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyc3RWYWx1ZUZyb20obWVyZ2UoZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcImZyYW1lYXR0YWNoZWRcIiAvKiBQYWdlRXZlbnQuRnJhbWVBdHRhY2hlZCAqLyksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJmcmFtZW5hdmlnYXRlZFwiIC8qIFBhZ2VFdmVudC5GcmFtZU5hdmlnYXRlZCAqLyksIGZyb20odGhpcy5mcmFtZXMoKSkpLnBpcGUoZmlsdGVyQXN5bmModXJsT3JQcmVkaWNhdGUpLCBmaXJzdCgpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSwgZnJvbUFib3J0U2lnbmFsKHNpZ25hbCksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRDbG9zZUVycm9yKCdQYWdlIGNsb3NlZC4nKTtcbiAgICAgICAgICAgIH0pKSkpKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogRW11bGF0ZXMgYSBnaXZlbiBkZXZpY2UncyBtZXRyaWNzIGFuZCB1c2VyIGFnZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBhaWQgZW11bGF0aW9uLCBQdXBwZXRlZXIgcHJvdmlkZXMgYSBsaXN0IG9mIGtub3duIGRldmljZXMgdGhhdCBjYW4gYmVcbiAgICAgICAgICogdmlhIHtAbGluayBLbm93bkRldmljZXN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhIHNob3J0Y3V0IGZvciBjYWxsaW5nIHR3byBtZXRob2RzOlxuICAgICAgICAgKiB7QGxpbmsgUGFnZS5zZXRVc2VyQWdlbnR9IGFuZCB7QGxpbmsgUGFnZS5zZXRWaWV3cG9ydH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmVzaXplIHRoZSBwYWdlLiBBIGxvdCBvZiB3ZWJzaXRlcyBkb24ndCBleHBlY3QgcGhvbmVzIHRvXG4gICAgICAgICAqIGNoYW5nZSBzaXplLCBzbyB5b3Ugc2hvdWxkIGVtdWxhdGUgYmVmb3JlIG5hdmlnYXRpbmcgdG8gdGhlIHBhZ2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGltcG9ydCB7S25vd25EZXZpY2VzfSBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKiBjb25zdCBpUGhvbmUgPSBLbm93bkRldmljZXNbJ2lQaG9uZSA2J107XG4gICAgICAgICAqXG4gICAgICAgICAqIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgICAgICAqICAgYXdhaXQgcGFnZS5lbXVsYXRlKGlQaG9uZSk7XG4gICAgICAgICAqICAgYXdhaXQgcGFnZS5nb3RvKCdodHRwczovL3d3dy5nb29nbGUuY29tJyk7XG4gICAgICAgICAqICAgLy8gb3RoZXIgYWN0aW9ucy4uLlxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBlbXVsYXRlKGRldmljZSkge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VXNlckFnZW50KGRldmljZS51c2VyQWdlbnQpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Vmlld3BvcnQoZGV2aWNlLnZpZXdwb3J0KSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFdmFsdWF0ZXMgYSBmdW5jdGlvbiBpbiB0aGUgcGFnZSdzIGNvbnRleHQgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGZ1bmN0aW9uIHBhc3NlZCB0byBgcGFnZS5ldmFsdWF0ZWAgcmV0dXJucyBhIFByb21pc2UsIHRoZVxuICAgICAgICAgKiBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvIHJlc29sdmUgYW5kIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZyYW1lLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICogICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKDggKiA3KTtcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdCk7IC8vIHByaW50cyBcIjU2XCJcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIFlvdSBjYW4gcGFzcyBhIHN0cmluZyBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gKGFsdGhvdWdoIGZ1bmN0aW9ucyBhcmVcbiAgICAgICAgICogcmVjb21tZW5kZWQgYXMgdGhleSBhcmUgZWFzaWVyIHRvIGRlYnVnIGFuZCB1c2Ugd2l0aCBUeXBlU2NyaXB0KTpcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgYUhhbmRsZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoJzEgKyAyJyk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBnZXQgdGhlIGJlc3QgVHlwZVNjcmlwdCBleHBlcmllbmNlLCB5b3Ugc2hvdWxkIHBhc3MgaW4gYXMgdGhlXG4gICAgICAgICAqIGdlbmVyaWMgdGhlIHR5cGUgb2YgYHBhZ2VGdW5jdGlvbmA6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGFIYW5kbGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IDIpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICoge0BsaW5rIEVsZW1lbnRIYW5kbGV9IGluc3RhbmNlcyAoaW5jbHVkaW5nIHtAbGluayBKU0hhbmRsZX1zKSBjYW4gYmUgcGFzc2VkXG4gICAgICAgICAqIGFzIGFyZ3VtZW50cyB0byB0aGUgYHBhZ2VGdW5jdGlvbmA6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGJvZHlIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJ2JvZHknKTtcbiAgICAgICAgICogY29uc3QgaHRtbCA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoYm9keSA9PiBib2R5LmlubmVySFRNTCwgYm9keUhhbmRsZSk7XG4gICAgICAgICAqIGF3YWl0IGJvZHlIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHBhZ2VGdW5jdGlvbiAtIGEgZnVuY3Rpb24gdGhhdCBpcyBydW4gd2l0aGluIHRoZSBwYWdlXG4gICAgICAgICAqIEBwYXJhbSBhcmdzIC0gYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgcGFnZUZ1bmN0aW9uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHRoZSByZXR1cm4gdmFsdWUgb2YgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBldmFsdWF0ZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy5ldmFsdWF0ZS5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBfbWF5YmVXcml0ZUJ1ZmZlclRvRmlsZShwYXRoLCBidWZmZXIpIHtcbiAgICAgICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0RlNQcm9taXNlcygpO1xuICAgICAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGgsIGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhcHR1cmVzIGEgc2NyZWVuY2FzdCBvZiB0aGlzIHtAbGluayBQYWdlIHwgcGFnZX0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIFJlY29yZGluZyBhIHtAbGluayBQYWdlIHwgcGFnZX06XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIExhdW5jaCBhIGJyb3dzZXJcbiAgICAgICAgICogY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gQ3JlYXRlIGEgbmV3IHBhZ2VcbiAgICAgICAgICogY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBHbyB0byB5b3VyIHNpdGUuXG4gICAgICAgICAqIGF3YWl0IHBhZ2UuZ290byhcImh0dHBzOi8vd3d3LmV4YW1wbGUuY29tXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBTdGFydCByZWNvcmRpbmcuXG4gICAgICAgICAqIGNvbnN0IHJlY29yZGVyID0gYXdhaXQgcGFnZS5zY3JlZW5jYXN0KHtwYXRoOiAncmVjb3JkaW5nLndlYm0nfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIERvIHNvbWV0aGluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogLy8gU3RvcCByZWNvcmRpbmcuXG4gICAgICAgICAqIGF3YWl0IHJlY29yZGVyLnN0b3AoKTtcbiAgICAgICAgICpcbiAgICAgICAgICogYnJvd3Nlci5jbG9zZSgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmVzIHNjcmVlbmNhc3QgYmVoYXZpb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogQWxsIHJlY29yZGluZ3Mgd2lsbCBiZSB7QGxpbmsgaHR0cHM6Ly93d3cud2VibXByb2plY3Qub3JnLyB8IFdlYk19IGZvcm1hdCB1c2luZ1xuICAgICAgICAgKiB0aGUge0BsaW5rIGh0dHBzOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy92cDkvIHwgVlA5fSB2aWRlbyBjb2RlYy4gVGhlIEZQUyBpcyAzMC5cbiAgICAgICAgICpcbiAgICAgICAgICogWW91IG11c3QgaGF2ZSB7QGxpbmsgaHR0cHM6Ly9mZm1wZWcub3JnLyB8IGZmbXBlZ30gaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2NyZWVuY2FzdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IFt7IFNjcmVlblJlY29yZGVyIH0sIFt3aWR0aCwgaGVpZ2h0LCBkZXZpY2VQaXhlbFJhdGlvXV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgaW1wb3J0KCcuLi9ub2RlL1NjcmVlblJlY29yZGVyLmpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy4jZ2V0TmF0aXZlUGl4ZWxEaW1lbnNpb25zKCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIGxldCBjcm9wO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY3JvcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgeCwgeSwgd2lkdGg6IGNyb3BXaWR0aCwgaGVpZ2h0OiBjcm9wSGVpZ2h0LCB9ID0gcm91bmRSZWN0YW5nbGUobm9ybWFsaXplUmVjdGFuZ2xlKG9wdGlvbnMuY3JvcCkpO1xuICAgICAgICAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYGNyb3AueFxcYCBhbmQgXFxgY3JvcC55XFxgIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjcm9wV2lkdGggPD0gMCB8fCBjcm9wSGVpZ2h0IDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGBjcm9wLmhlaWdodFxcYCBhbmQgXFxgY3JvcC53aWR0aFxcYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2lkdGggLyBkZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gaGVpZ2h0IC8gZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgICAgICAgICBpZiAoeCArIGNyb3BXaWR0aCA+IHZpZXdwb3J0V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGBjcm9wLndpZHRoXFxgIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgdmlld3BvcnQgd2lkdGggKCR7dmlld3BvcnRXaWR0aH0pLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoeSArIGNyb3BIZWlnaHQgPiB2aWV3cG9ydEhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYGNyb3AuaGVpZ2h0XFxgIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgdmlld3BvcnQgaGVpZ2h0ICgke3ZpZXdwb3J0SGVpZ2h0fSkuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNyb3AgPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6IHggKiBkZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICB5OiB5ICogZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNyb3BXaWR0aCAqIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogY3JvcEhlaWdodCAqIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnNwZWVkICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zcGVlZCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGBzcGVlZFxcYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2NhbGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnNjYWxlIDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYHNjYWxlXFxgIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZWNvcmRlciA9IG5ldyBTY3JlZW5SZWNvcmRlcih0aGlzLCB3aWR0aCwgaGVpZ2h0LCB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICBwYXRoOiBvcHRpb25zLmZmbXBlZ1BhdGgsXG4gICAgICAgICAgICAgICAgY3JvcCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zdGFydFNjcmVlbmNhc3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHZvaWQgcmVjb3JkZXIuc3RvcCgpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGF0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY3JlYXRlV3JpdGVTdHJlYW0gfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBjcmVhdGVXcml0ZVN0cmVhbShvcHRpb25zLnBhdGgsICdiaW5hcnknKTtcbiAgICAgICAgICAgICAgICByZWNvcmRlci5waXBlKHN0cmVhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgI3NjcmVlbmNhc3RTZXNzaW9uQ291bnQgPSAwO1xuICAgICAgICAjc3RhcnRTY3JlZW5jYXN0UHJvbWlzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgX3N0YXJ0U2NyZWVuY2FzdCgpIHtcbiAgICAgICAgICAgICsrdGhpcy4jc2NyZWVuY2FzdFNlc3Npb25Db3VudDtcbiAgICAgICAgICAgIGlmICghdGhpcy4jc3RhcnRTY3JlZW5jYXN0UHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI3N0YXJ0U2NyZWVuY2FzdFByb21pc2UgPSB0aGlzLm1haW5GcmFtZSgpXG4gICAgICAgICAgICAgICAgICAgIC5jbGllbnQuc2VuZCgnUGFnZS5zdGFydFNjcmVlbmNhc3QnLCB7IGZvcm1hdDogJ3BuZycgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgZmlyc3QgZnJhbWUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLmNsaWVudC5vbmNlKCdQYWdlLnNjcmVlbmNhc3RGcmFtZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy4jc3RhcnRTY3JlZW5jYXN0UHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBfc3RvcFNjcmVlbmNhc3QoKSB7XG4gICAgICAgICAgICAtLXRoaXMuI3NjcmVlbmNhc3RTZXNzaW9uQ291bnQ7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI3N0YXJ0U2NyZWVuY2FzdFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNzdGFydFNjcmVlbmNhc3RQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3NjcmVlbmNhc3RTZXNzaW9uQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmNsaWVudC5zZW5kKCdQYWdlLnN0b3BTY3JlZW5jYXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG5hdGl2ZSwgbm9uLWVtdWxhdGVkIGRpbWVuc2lvbnMgb2YgdGhlIHZpZXdwb3J0LlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgI2dldE5hdGl2ZVBpeGVsRGltZW5zaW9ucygpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBuZXcgRGlzcG9zYWJsZVN0YWNrKCksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAodmlld3BvcnQgJiYgdmlld3BvcnQuZGV2aWNlU2NhbGVGYWN0b3IgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRWaWV3cG9ydCh7IC4uLnZpZXdwb3J0LCBkZXZpY2VTY2FsZUZhY3RvcjogMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2suZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCB0aGlzLnNldFZpZXdwb3J0KHZpZXdwb3J0KS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpXG4gICAgICAgICAgICAgICAgICAgIC5pc29sYXRlZFJlYWxtKClcbiAgICAgICAgICAgICAgICAgICAgLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy52aXN1YWxWaWV3cG9ydC53aWR0aCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnZpc3VhbFZpZXdwb3J0LmhlaWdodCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgZW52XzEuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhc3luYyBzY3JlZW5zaG90KHVzZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfZ3VhcmQgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMiwgYXdhaXQgdGhpcy5icm93c2VyQ29udGV4dCgpLnN0YXJ0U2NyZWVuc2hvdCgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2Ugc3RydWN0dXJlZENsb25lIGFmdGVyIE5vZGUgMTYgc3VwcG9ydCBpcyBkcm9wcGVkLlxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnVzZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBjbGlwOiB1c2VyT3B0aW9ucy5jbGlwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi51c2VyT3B0aW9ucy5jbGlwLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5wYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBvcHRpb25zLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgd2UgY2Fubm90IHVzZSBOb2RlLmpzIGhlcmUgZHVlIHRvIGJyb3dzZXIgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZVBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZShmaWxlUGF0aC5sYXN0SW5kZXhPZignLicpICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGV4dGVuc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncG5nJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAncG5nJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2pwZWcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnanBnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnanBlZyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd3ZWJwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnd2VicCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPCAwIHx8IG9wdGlvbnMucXVhbGl0eSA+IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAncXVhbGl0eScgKCR7b3B0aW9ucy5xdWFsaXR5fSkgdG8gYmUgYmV0d2VlbiAwIGFuZCAxMDAsIGluY2x1c2l2ZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFbJ2pwZWcnLCAnd2VicCddLmluY2x1ZGVzKG9wdGlvbnMudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvcHRpb25zLnR5cGUgPz8gJ3BuZyd9IHNjcmVlbnNob3RzIGRvIG5vdCBzdXBwb3J0ICdxdWFsaXR5Jy5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jbGlwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsaXAud2lkdGggPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ3dpZHRoJyBpbiAnY2xpcCcgbXVzdCBiZSBwb3NpdGl2ZS5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xpcC5oZWlnaHQgPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ2hlaWdodCcgaW4gJ2NsaXAnIG11c3QgYmUgcG9zaXRpdmUuXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldERlZmF1bHRTY3JlZW5zaG90T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8yLCBuZXcgQXN5bmNEaXNwb3NhYmxlU3RhY2soKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xpcCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mdWxsUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ2NsaXAnIGFuZCAnZnVsbFBhZ2UnIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jbGlwID0gcm91bmRSZWN0YW5nbGUobm9ybWFsaXplUmVjdGFuZ2xlKG9wdGlvbnMuY2xpcCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZnVsbFBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGBjYXB0dXJlQmV5b25kVmlld3BvcnRgIGlzIGBmYWxzZWAsIHRoZW4gd2Ugc2V0IHRoZSB2aWV3cG9ydCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSB0aGUgZnVsbCBwYWdlLiBOb3RlIHRoaXMgbWF5IGJlIGFmZmVjdGVkIGJ5IG9uLXBhZ2UgQ1NTIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSmF2YVNjcmlwdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5jYXB0dXJlQmV5b25kVmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxEaW1lbnNpb25zID0gYXdhaXQgdGhpcy5tYWluRnJhbWUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ldmFsdWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZWxlbWVudC5zY3JvbGxXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZWxlbWVudC5zY3JvbGxIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRWaWV3cG9ydCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnZpZXdwb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5zY3JvbGxEaW1lbnNpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLmRlZmVyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRWaWV3cG9ydCh2aWV3cG9ydCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNhcHR1cmVCZXlvbmRWaWV3cG9ydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLl9zY3JlZW5zaG90KG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVuY29kaW5nID09PSAnYmFzZTY0Jykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oZGF0YSwgJ2Jhc2U2NCcpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX21heWJlV3JpdGVCdWZmZXJUb0ZpbGUob3B0aW9ucy5wYXRoLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yKSB7XG4gICAgICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzI7XG4gICAgICAgICAgICAgICAgZW52XzIuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0XzEgPSBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRfMSlcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVzdWx0XzE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwYWdlJ3MgdGl0bGVcbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogU2hvcnRjdXQgZm9yIHtAbGluayBGcmFtZS50aXRsZSB8IHBhZ2UubWFpbkZyYW1lKCkudGl0bGUoKX0uXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0aXRsZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLnRpdGxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYW4gZWxlbWVudCB3aXRoIGBzZWxlY3RvcmAsIHNjcm9sbHMgaXQgaW50byB2aWV3IGlmXG4gICAgICAgICAqIG5lZWRlZCwgYW5kIHRoZW4gdXNlcyB7QGxpbmsgUGFnZS5tb3VzZX0gdG8gY2xpY2sgaW4gdGhlIGNlbnRlciBvZiB0aGVcbiAgICAgICAgICogZWxlbWVudC4gSWYgdGhlcmUncyBubyBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAsIHRoZSBtZXRob2QgdGhyb3dzIGFuXG4gICAgICAgICAqIGVycm9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBCZWFyIGluIG1pbmQgdGhhdCBpZiBgY2xpY2soKWAgdHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIGV2ZW50IGFuZFxuICAgICAgICAgKiB0aGVyZSdzIGEgc2VwYXJhdGUgYHBhZ2Uud2FpdEZvck5hdmlnYXRpb24oKWAgcHJvbWlzZSB0byBiZSByZXNvbHZlZCwgeW91XG4gICAgICAgICAqIG1heSBlbmQgdXAgd2l0aCBhIHJhY2UgY29uZGl0aW9uIHRoYXQgeWllbGRzIHVuZXhwZWN0ZWQgcmVzdWx0cy4gVGhlXG4gICAgICAgICAqIGNvcnJlY3QgcGF0dGVybiBmb3IgY2xpY2sgYW5kIHdhaXQgZm9yIG5hdmlnYXRpb24gaXMgdGhlIGZvbGxvd2luZzpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgW3Jlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICogICBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKHdhaXRPcHRpb25zKSxcbiAgICAgICAgICogICBwYWdlLmNsaWNrKHNlbGVjdG9yLCBjbGlja09wdGlvbnMpLFxuICAgICAgICAgKiBdKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuY2xpY2sgfCBwYWdlLm1haW5GcmFtZSgpLmNsaWNrKHNlbGVjdG9yWywgb3B0aW9uc10pIH0uXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIEEgYHNlbGVjdG9yYCB0byBzZWFyY2ggZm9yIGVsZW1lbnQgdG8gY2xpY2suIElmIHRoZXJlIGFyZVxuICAgICAgICAgKiBtdWx0aXBsZSBlbGVtZW50cyBzYXRpc2Z5aW5nIHRoZSBgc2VsZWN0b3JgLCB0aGUgZmlyc3Qgd2lsbCBiZSBjbGlja2VkXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYE9iamVjdGBcbiAgICAgICAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAgaXNcbiAgICAgICAgICogc3VjY2Vzc2Z1bGx5IGNsaWNrZWQuIFRoZSBQcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgaWYgdGhlcmUgaXMgbm8gZWxlbWVudFxuICAgICAgICAgKiBtYXRjaGluZyBgc2VsZWN0b3JgLlxuICAgICAgICAgKi9cbiAgICAgICAgY2xpY2soc2VsZWN0b3IsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLmNsaWNrKHNlbGVjdG9yLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgZmV0Y2hlcyBhbiBlbGVtZW50IHdpdGggYHNlbGVjdG9yYCBhbmQgZm9jdXNlcyBpdC4gSWYgdGhlcmUncyBub1xuICAgICAgICAgKiBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAsIHRoZSBtZXRob2QgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBBXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IHNlbGVjdG9yIH1cbiAgICAgICAgICogb2YgYW4gZWxlbWVudCB0byBmb2N1cy4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIHNhdGlzZnlpbmcgdGhlXG4gICAgICAgICAqIHNlbGVjdG9yLCB0aGUgZmlyc3Qgd2lsbCBiZSBmb2N1c2VkLlxuICAgICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgbWF0Y2hpbmcgc2VsZWN0b3IgaXNcbiAgICAgICAgICogc3VjY2Vzc2Z1bGx5IGZvY3VzZWQuIFRoZSBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgaWYgdGhlcmUgaXMgbm8gZWxlbWVudFxuICAgICAgICAgKiBtYXRjaGluZyBzZWxlY3Rvci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogU2hvcnRjdXQgZm9yIHtAbGluayBGcmFtZS5mb2N1cyB8IHBhZ2UubWFpbkZyYW1lKCkuZm9jdXMoc2VsZWN0b3IpfS5cbiAgICAgICAgICovXG4gICAgICAgIGZvY3VzKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluRnJhbWUoKS5mb2N1cyhzZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYW4gZWxlbWVudCB3aXRoIGBzZWxlY3RvcmAsIHNjcm9sbHMgaXQgaW50byB2aWV3IGlmXG4gICAgICAgICAqIG5lZWRlZCwgYW5kIHRoZW4gdXNlcyB7QGxpbmsgUGFnZS5tb3VzZX1cbiAgICAgICAgICogdG8gaG92ZXIgb3ZlciB0aGUgY2VudGVyIG9mIHRoZSBlbGVtZW50LlxuICAgICAgICAgKiBJZiB0aGVyZSdzIG5vIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCwgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIEFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHNlYXJjaCBmb3IgZWxlbWVudCB0byBob3Zlci4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIHNhdGlzZnlpbmdcbiAgICAgICAgICogdGhlIHNlbGVjdG9yLCB0aGUgZmlyc3Qgd2lsbCBiZSBob3ZlcmVkLlxuICAgICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCBpc1xuICAgICAgICAgKiBzdWNjZXNzZnVsbHkgaG92ZXJlZC4gUHJvbWlzZSBnZXRzIHJlamVjdGVkIGlmIHRoZXJlJ3Mgbm8gZWxlbWVudCBtYXRjaGluZ1xuICAgICAgICAgKiBgc2VsZWN0b3JgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBTaG9ydGN1dCBmb3Ige0BsaW5rIFBhZ2UuaG92ZXIgfCBwYWdlLm1haW5GcmFtZSgpLmhvdmVyKHNlbGVjdG9yKX0uXG4gICAgICAgICAqL1xuICAgICAgICBob3ZlcihzZWxlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbkZyYW1lKCkuaG92ZXIoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmlnZ2VycyBhIGBjaGFuZ2VgIGFuZCBgaW5wdXRgIGV2ZW50IG9uY2UgYWxsIHRoZSBwcm92aWRlZCBvcHRpb25zIGhhdmUgYmVlblxuICAgICAgICAgKiBzZWxlY3RlZC4gSWYgdGhlcmUncyBubyBgPHNlbGVjdD5gIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCwgdGhlIG1ldGhvZFxuICAgICAgICAgKiB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIHBhZ2Uuc2VsZWN0KCdzZWxlY3QjY29sb3JzJywgJ2JsdWUnKTsgLy8gc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgKiBwYWdlLnNlbGVjdCgnc2VsZWN0I2NvbG9ycycsICdyZWQnLCAnZ3JlZW4nLCAnYmx1ZScpOyAvLyBtdWx0aXBsZSBzZWxlY3Rpb25zXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBBXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IFNlbGVjdG9yfVxuICAgICAgICAgKiB0byBxdWVyeSB0aGUgcGFnZSBmb3JcbiAgICAgICAgICogQHBhcmFtIHZhbHVlcyAtIFZhbHVlcyBvZiBvcHRpb25zIHRvIHNlbGVjdC4gSWYgdGhlIGA8c2VsZWN0PmAgaGFzIHRoZVxuICAgICAgICAgKiBgbXVsdGlwbGVgIGF0dHJpYnV0ZSwgYWxsIHZhbHVlcyBhcmUgY29uc2lkZXJlZCwgb3RoZXJ3aXNlIG9ubHkgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgKiBpcyB0YWtlbiBpbnRvIGFjY291bnQuXG4gICAgICAgICAqIEByZXR1cm5zXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuc2VsZWN0IHwgcGFnZS5tYWluRnJhbWUoKS5zZWxlY3QoKX1cbiAgICAgICAgICovXG4gICAgICAgIHNlbGVjdChzZWxlY3RvciwgLi4udmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluRnJhbWUoKS5zZWxlY3Qoc2VsZWN0b3IsIC4uLnZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYW4gZWxlbWVudCB3aXRoIGBzZWxlY3RvcmAsIHNjcm9sbHMgaXQgaW50byB2aWV3IGlmXG4gICAgICAgICAqIG5lZWRlZCwgYW5kIHRoZW4gdXNlcyB7QGxpbmsgUGFnZS50b3VjaHNjcmVlbn1cbiAgICAgICAgICogdG8gdGFwIGluIHRoZSBjZW50ZXIgb2YgdGhlIGVsZW1lbnQuXG4gICAgICAgICAqIElmIHRoZXJlJ3Mgbm8gZWxlbWVudCBtYXRjaGluZyBgc2VsZWN0b3JgLCB0aGUgbWV0aG9kIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gQVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBTZWxlY3Rvcn1cbiAgICAgICAgICogdG8gc2VhcmNoIGZvciBlbGVtZW50IHRvIHRhcC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIHNhdGlzZnlpbmcgdGhlXG4gICAgICAgICAqIHNlbGVjdG9yLCB0aGUgZmlyc3Qgd2lsbCBiZSB0YXBwZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUudGFwIHwgcGFnZS5tYWluRnJhbWUoKS50YXAoc2VsZWN0b3IpfS5cbiAgICAgICAgICovXG4gICAgICAgIHRhcChzZWxlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbkZyYW1lKCkudGFwKHNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZHMgYSBga2V5ZG93bmAsIGBrZXlwcmVzcy9pbnB1dGAsIGFuZCBga2V5dXBgIGV2ZW50IGZvciBlYWNoIGNoYXJhY3RlclxuICAgICAgICAgKiBpbiB0aGUgdGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogVG8gcHJlc3MgYSBzcGVjaWFsIGtleSwgbGlrZSBgQ29udHJvbGAgb3IgYEFycm93RG93bmAsIHVzZSB7QGxpbmsgS2V5Ym9hcmQucHJlc3N9LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBhd2FpdCBwYWdlLnR5cGUoJyNteXRleHRhcmVhJywgJ0hlbGxvJyk7XG4gICAgICAgICAqIC8vIFR5cGVzIGluc3RhbnRseVxuICAgICAgICAgKiBhd2FpdCBwYWdlLnR5cGUoJyNteXRleHRhcmVhJywgJ1dvcmxkJywge2RlbGF5OiAxMDB9KTtcbiAgICAgICAgICogLy8gVHlwZXMgc2xvd2VyLCBsaWtlIGEgdXNlclxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gQVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogb2YgYW4gZWxlbWVudCB0byB0eXBlIGludG8uIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cyBzYXRpc2Z5aW5nIHRoZVxuICAgICAgICAgKiBzZWxlY3RvciwgdGhlIGZpcnN0IHdpbGwgYmUgdXNlZC5cbiAgICAgICAgICogQHBhcmFtIHRleHQgLSBBIHRleHQgdG8gdHlwZSBpbnRvIGEgZm9jdXNlZCBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGhhdmUgcHJvcGVydHkgYGRlbGF5YCB3aGljaCBpcyB0aGUgVGltZSB0byB3YWl0IGJldHdlZW5cbiAgICAgICAgICoga2V5IHByZXNzZXMgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byBgMGAuXG4gICAgICAgICAqIEByZXR1cm5zXG4gICAgICAgICAqL1xuICAgICAgICB0eXBlKHNlbGVjdG9yLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluRnJhbWUoKS50eXBlKHNlbGVjdG9yLCB0ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdCBmb3IgdGhlIGBzZWxlY3RvcmAgdG8gYXBwZWFyIGluIHBhZ2UuIElmIGF0IHRoZSBtb21lbnQgb2YgY2FsbGluZyB0aGVcbiAgICAgICAgICogbWV0aG9kIHRoZSBgc2VsZWN0b3JgIGFscmVhZHkgZXhpc3RzLCB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LiBJZlxuICAgICAgICAgKiB0aGUgYHNlbGVjdG9yYCBkb2Vzbid0IGFwcGVhciBhZnRlciB0aGUgYHRpbWVvdXRgIG1pbGxpc2Vjb25kcyBvZiB3YWl0aW5nLCB0aGVcbiAgICAgICAgICogZnVuY3Rpb24gd2lsbCB0aHJvdy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogVGhpcyBtZXRob2Qgd29ya3MgYWNyb3NzIG5hdmlnYXRpb25zOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gICAgICAgICAqIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgICAgICAqICAgbGV0IGN1cnJlbnRVUkw7XG4gICAgICAgICAqICAgcGFnZVxuICAgICAgICAgKiAgICAgLndhaXRGb3JTZWxlY3RvcignaW1nJylcbiAgICAgICAgICogICAgIC50aGVuKCgpID0+IGNvbnNvbGUubG9nKCdGaXJzdCBVUkwgd2l0aCBpbWFnZTogJyArIGN1cnJlbnRVUkwpKTtcbiAgICAgICAgICogICBmb3IgKGN1cnJlbnRVUkwgb2YgW1xuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZ29vZ2xlLmNvbScsXG4gICAgICAgICAqICAgICAnaHR0cHM6Ly9iYmMuY29tJyxcbiAgICAgICAgICogICBdKSB7XG4gICAgICAgICAqICAgICBhd2FpdCBwYWdlLmdvdG8oY3VycmVudFVSTCk7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIEFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIG9mIGFuIGVsZW1lbnQgdG8gd2FpdCBmb3JcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCB3YWl0aW5nIHBhcmFtZXRlcnNcbiAgICAgICAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgKiBpcyBhZGRlZCB0byBET00uIFJlc29sdmVzIHRvIGBudWxsYCBpZiB3YWl0aW5nIGZvciBoaWRkZW46IGB0cnVlYCBhbmRcbiAgICAgICAgICogc2VsZWN0b3IgaXMgbm90IGZvdW5kIGluIERPTS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogVGhlIG9wdGlvbmFsIFBhcmFtZXRlciBpbiBBcmd1bWVudHMgYG9wdGlvbnNgIGFyZTpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgdmlzaWJsZWA6IEEgYm9vbGVhbiB3YWl0IGZvciBlbGVtZW50IHRvIGJlIHByZXNlbnQgaW4gRE9NIGFuZCB0byBiZVxuICAgICAgICAgKiAgIHZpc2libGUsIGkuZS4gdG8gbm90IGhhdmUgYGRpc3BsYXk6IG5vbmVgIG9yIGB2aXNpYmlsaXR5OiBoaWRkZW5gIENTU1xuICAgICAgICAgKiAgIHByb3BlcnRpZXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIC0gYGhpZGRlbmA6IFdhaXQgZm9yIGVsZW1lbnQgdG8gbm90IGJlIGZvdW5kIGluIHRoZSBET00gb3IgdG8gYmUgaGlkZGVuLFxuICAgICAgICAgKiAgIGkuZS4gaGF2ZSBgZGlzcGxheTogbm9uZWAgb3IgYHZpc2liaWxpdHk6IGhpZGRlbmAgQ1NTIHByb3BlcnRpZXMuIERlZmF1bHRzIHRvXG4gICAgICAgICAqICAgYGZhbHNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogLSBgdGltZW91dGA6IG1heGltdW0gdGltZSB0byB3YWl0IGZvciBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIGAzMDAwMGBcbiAgICAgICAgICogICAoMzAgc2Vjb25kcykuIFBhc3MgYDBgIHRvIGRpc2FibGUgdGltZW91dC4gVGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWRcbiAgICAgICAgICogICBieSB1c2luZyB0aGUge0BsaW5rIFBhZ2Uuc2V0RGVmYXVsdFRpbWVvdXR9IG1ldGhvZC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhaXRGb3JTZWxlY3RvcihzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluRnJhbWUoKS53YWl0Rm9yU2VsZWN0b3Ioc2VsZWN0b3IsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXYWl0cyBmb3IgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLCBgcGFnZUZ1bmN0aW9uYCwgdG8gcmV0dXJuIGEgdHJ1dGh5IHZhbHVlIHdoZW5cbiAgICAgICAgICogZXZhbHVhdGVkIGluIHRoZSBwYWdlJ3MgY29udGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICoge0BsaW5rIFBhZ2Uud2FpdEZvckZ1bmN0aW9ufSBjYW4gYmUgdXNlZCB0byBvYnNlcnZlIGEgdmlld3BvcnQgc2l6ZSBjaGFuZ2U6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAgICAgICAgICogKGFzeW5jICgpID0+IHtcbiAgICAgICAgICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICAgICAgICAgKiAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBicm93c2VyLm5ld1BhZ2UoKTtcbiAgICAgICAgICogICBjb25zdCB3YXRjaERvZyA9IHBhZ2Uud2FpdEZvckZ1bmN0aW9uKCd3aW5kb3cuaW5uZXJXaWR0aCA8IDEwMCcpO1xuICAgICAgICAgKiAgIGF3YWl0IHBhZ2Uuc2V0Vmlld3BvcnQoe3dpZHRoOiA1MCwgaGVpZ2h0OiA1MH0pO1xuICAgICAgICAgKiAgIGF3YWl0IHdhdGNoRG9nO1xuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIEFyZ3VtZW50cyBjYW4gYmUgcGFzc2VkIGZyb20gTm9kZS5qcyB0byBgcGFnZUZ1bmN0aW9uYDpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VsZWN0b3IgPSAnLmZvbyc7XG4gICAgICAgICAqIGF3YWl0IHBhZ2Uud2FpdEZvckZ1bmN0aW9uKFxuICAgICAgICAgKiAgIHNlbGVjdG9yID0+ICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvciksXG4gICAgICAgICAqICAge30sXG4gICAgICAgICAqICAgc2VsZWN0b3JcbiAgICAgICAgICogKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIFRoZSBwcm92aWRlZCBgcGFnZUZ1bmN0aW9uYCBjYW4gYmUgYXN5bmNocm9ub3VzOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCB1c2VybmFtZSA9ICdnaXRodWItdXNlcm5hbWUnO1xuICAgICAgICAgKiBhd2FpdCBwYWdlLndhaXRGb3JGdW5jdGlvbihcbiAgICAgICAgICogICBhc3luYyB1c2VybmFtZSA9PiB7XG4gICAgICAgICAqICAgICBjb25zdCBnaXRodWJSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgKiAgICAgICBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy8ke3VzZXJuYW1lfWBcbiAgICAgICAgICogICAgICk7XG4gICAgICAgICAqICAgICBjb25zdCBnaXRodWJVc2VyID0gYXdhaXQgZ2l0aHViUmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgKiAgICAgLy8gc2hvdyB0aGUgYXZhdGFyXG4gICAgICAgICAqICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgICAgICogICAgIGltZy5zcmMgPSBnaXRodWJVc2VyLmF2YXRhcl91cmw7XG4gICAgICAgICAqICAgICAvLyB3YWl0IDMgc2Vjb25kc1xuICAgICAgICAgKiAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAzMDAwKSk7XG4gICAgICAgICAqICAgICBpbWcucmVtb3ZlKCk7XG4gICAgICAgICAqICAgfSxcbiAgICAgICAgICogICB7fSxcbiAgICAgICAgICogICB1c2VybmFtZVxuICAgICAgICAgKiApO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHBhZ2VGdW5jdGlvbiAtIEZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZCBpbiBicm93c2VyIGNvbnRleHQgdW50aWwgaXQgcmV0dXJucyBhXG4gICAgICAgICAqIHRydXRoeSB2YWx1ZS5cbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciBjb25maWd1cmluZyB3YWl0aW5nIGJlaGF2aW9yLlxuICAgICAgICAgKi9cbiAgICAgICAgd2FpdEZvckZ1bmN0aW9uKHBhZ2VGdW5jdGlvbiwgb3B0aW9ucywgLi4uYXJncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbkZyYW1lKCkud2FpdEZvckZ1bmN0aW9uKHBhZ2VGdW5jdGlvbiwgb3B0aW9ucywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBbKF9zY3JlZW5zaG90X2RlY29yYXRvcnMgPSBbZ3VhcmRlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnJvd3NlcigpO1xuICAgICAgICAgICAgfSldLCBkaXNwb3NlU3ltYm9sKV0oKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmNsb3NlKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBbYXN5bmNEaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IFBhZ2UgfTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBzdXBwb3J0ZWRNZXRyaWNzID0gbmV3IFNldChbXG4gICAgJ1RpbWVzdGFtcCcsXG4gICAgJ0RvY3VtZW50cycsXG4gICAgJ0ZyYW1lcycsXG4gICAgJ0pTRXZlbnRMaXN0ZW5lcnMnLFxuICAgICdOb2RlcycsXG4gICAgJ0xheW91dENvdW50JyxcbiAgICAnUmVjYWxjU3R5bGVDb3VudCcsXG4gICAgJ0xheW91dER1cmF0aW9uJyxcbiAgICAnUmVjYWxjU3R5bGVEdXJhdGlvbicsXG4gICAgJ1NjcmlwdER1cmF0aW9uJyxcbiAgICAnVGFza0R1cmF0aW9uJyxcbiAgICAnSlNIZWFwVXNlZFNpemUnLFxuICAgICdKU0hlYXBUb3RhbFNpemUnLFxuXSk7XG4vKiogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vd2ViZHJpdmVyLWJpZGkvI25vcm1hbGl6ZS1yZWN0ICovXG5mdW5jdGlvbiBub3JtYWxpemVSZWN0YW5nbGUoY2xpcCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNsaXAsXG4gICAgICAgIC4uLihjbGlwLndpZHRoIDwgMFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgeDogY2xpcC54ICsgY2xpcC53aWR0aCxcbiAgICAgICAgICAgICAgICB3aWR0aDogLWNsaXAud2lkdGgsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICB4OiBjbGlwLngsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGNsaXAud2lkdGgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgLi4uKGNsaXAuaGVpZ2h0IDwgMFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgeTogY2xpcC55ICsgY2xpcC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAtY2xpcC5oZWlnaHQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICB5OiBjbGlwLnksXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBjbGlwLmhlaWdodCxcbiAgICAgICAgICAgIH0pLFxuICAgIH07XG59XG5mdW5jdGlvbiByb3VuZFJlY3RhbmdsZShjbGlwKSB7XG4gICAgY29uc3QgeCA9IE1hdGgucm91bmQoY2xpcC54KTtcbiAgICBjb25zdCB5ID0gTWF0aC5yb3VuZChjbGlwLnkpO1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5yb3VuZChjbGlwLndpZHRoICsgY2xpcC54IC0geCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5yb3VuZChjbGlwLmhlaWdodCArIGNsaXAueSAtIHkpO1xuICAgIHJldHVybiB7IC4uLmNsaXAsIHgsIHksIHdpZHRoLCBoZWlnaHQgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhZ2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IFRhc2tNYW5hZ2VyLCBXYWl0VGFzayB9IGZyb20gJy4uL2NvbW1vbi9XYWl0VGFzay5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlU3ltYm9sIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWFsbSB7XG4gICAgdGltZW91dFNldHRpbmdzO1xuICAgIHRhc2tNYW5hZ2VyID0gbmV3IFRhc2tNYW5hZ2VyKCk7XG4gICAgY29uc3RydWN0b3IodGltZW91dFNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMudGltZW91dFNldHRpbmdzID0gdGltZW91dFNldHRpbmdzO1xuICAgIH1cbiAgICBhc3luYyB3YWl0Rm9yRnVuY3Rpb24ocGFnZUZ1bmN0aW9uLCBvcHRpb25zID0ge30sIC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgeyBwb2xsaW5nID0gJ3JhZicsIHRpbWVvdXQgPSB0aGlzLnRpbWVvdXRTZXR0aW5ncy50aW1lb3V0KCksIHJvb3QsIHNpZ25hbCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmICh0eXBlb2YgcG9sbGluZyA9PT0gJ251bWJlcicgJiYgcG9sbGluZyA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBvbGwgd2l0aCBub24tcG9zaXRpdmUgaW50ZXJ2YWwnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3YWl0VGFzayA9IG5ldyBXYWl0VGFzayh0aGlzLCB7XG4gICAgICAgICAgICBwb2xsaW5nLFxuICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0sIHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0VGFzay5yZXN1bHQ7XG4gICAgfVxuICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VkO1xuICAgIH1cbiAgICAjZGlzcG9zZWQgPSBmYWxzZTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy4jZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnRhc2tNYW5hZ2VyLnRlcm1pbmF0ZUFsbChuZXcgRXJyb3IoJ3dhaXRGb3JGdW5jdGlvbiBmYWlsZWQ6IGZyYW1lIGdvdCBkZXRhY2hlZC4nKSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWxtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBUYXJnZXRUeXBlO1xuKGZ1bmN0aW9uIChUYXJnZXRUeXBlKSB7XG4gICAgVGFyZ2V0VHlwZVtcIlBBR0VcIl0gPSBcInBhZ2VcIjtcbiAgICBUYXJnZXRUeXBlW1wiQkFDS0dST1VORF9QQUdFXCJdID0gXCJiYWNrZ3JvdW5kX3BhZ2VcIjtcbiAgICBUYXJnZXRUeXBlW1wiU0VSVklDRV9XT1JLRVJcIl0gPSBcInNlcnZpY2Vfd29ya2VyXCI7XG4gICAgVGFyZ2V0VHlwZVtcIlNIQVJFRF9XT1JLRVJcIl0gPSBcInNoYXJlZF93b3JrZXJcIjtcbiAgICBUYXJnZXRUeXBlW1wiQlJPV1NFUlwiXSA9IFwiYnJvd3NlclwiO1xuICAgIFRhcmdldFR5cGVbXCJXRUJWSUVXXCJdID0gXCJ3ZWJ2aWV3XCI7XG4gICAgVGFyZ2V0VHlwZVtcIk9USEVSXCJdID0gXCJvdGhlclwiO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIFRhcmdldFR5cGVbXCJUQUJcIl0gPSBcInRhYlwiO1xufSkoVGFyZ2V0VHlwZSB8fCAoVGFyZ2V0VHlwZSA9IHt9KSk7XG4vKipcbiAqIFRhcmdldCByZXByZXNlbnRzIGFcbiAqIHtAbGluayBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvVGFyZ2V0LyB8IENEUCB0YXJnZXR9LlxuICogSW4gQ0RQIGEgdGFyZ2V0IGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBkZWJ1Z2dlZCBzdWNoIGEgZnJhbWUsIGEgcGFnZSBvciBhXG4gKiB3b3JrZXIuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXQge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHRhcmdldCBpcyBub3Qgb2YgdHlwZSBgXCJzZXJ2aWNlX3dvcmtlclwiYCBvciBgXCJzaGFyZWRfd29ya2VyXCJgLCByZXR1cm5zIGBudWxsYC5cbiAgICAgKi9cbiAgICBhc3luYyB3b3JrZXIoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgdGFyZ2V0IGlzIG5vdCBvZiB0eXBlIGBcInBhZ2VcImAsIGBcIndlYnZpZXdcImAgb3IgYFwiYmFja2dyb3VuZF9wYWdlXCJgLFxuICAgICAqIHJldHVybnMgYG51bGxgLlxuICAgICAqL1xuICAgIGFzeW5jIHBhZ2UoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhcmdldC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRPcGVyYXRpb24gfSBmcm9tICcuLi9jb21tb24vRXJyb3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgVGltZW91dFNldHRpbmdzIH0gZnJvbSAnLi4vY29tbW9uL1RpbWVvdXRTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYVxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfV29ya2Vyc19BUEkgfCBXZWJXb3JrZXJ9LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgZXZlbnRzIGB3b3JrZXJjcmVhdGVkYCBhbmQgYHdvcmtlcmRlc3Ryb3llZGAgYXJlIGVtaXR0ZWQgb24gdGhlIHBhZ2VcbiAqIG9iamVjdCB0byBzaWduYWwgdGhlIHdvcmtlciBsaWZlY3ljbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogcGFnZS5vbignd29ya2VyY3JlYXRlZCcsIHdvcmtlciA9PlxuICogICBjb25zb2xlLmxvZygnV29ya2VyIGNyZWF0ZWQ6ICcgKyB3b3JrZXIudXJsKCkpXG4gKiApO1xuICogcGFnZS5vbignd29ya2VyZGVzdHJveWVkJywgd29ya2VyID0+XG4gKiAgIGNvbnNvbGUubG9nKCdXb3JrZXIgZGVzdHJveWVkOiAnICsgd29ya2VyLnVybCgpKVxuICogKTtcbiAqXG4gKiBjb25zb2xlLmxvZygnQ3VycmVudCB3b3JrZXJzOicpO1xuICogZm9yIChjb25zdCB3b3JrZXIgb2YgcGFnZS53b3JrZXJzKCkpIHtcbiAqICAgY29uc29sZS5sb2coJyAgJyArIHdvcmtlci51cmwoKSk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJXb3JrZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRpbWVvdXRTZXR0aW5ncyA9IG5ldyBUaW1lb3V0U2V0dGluZ3MoKTtcbiAgICAjdXJsO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVybCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiN1cmwgPSB1cmw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgdGhpcyB3ZWIgd29ya2VyLlxuICAgICAqL1xuICAgIHVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3VybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZhbHVhdGVzIGEgZ2l2ZW4gZnVuY3Rpb24gaW4gdGhlIHtAbGluayBXZWJXb3JrZXIgfCB3b3JrZXJ9LlxuICAgICAqXG4gICAgICogQHJlbWFya3MgSWYgdGhlIGdpdmVuIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlLFxuICAgICAqIHtAbGluayBXZWJXb3JrZXIuZXZhbHVhdGUgfCBldmFsdWF0ZX0gd2lsbCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0byByZXNvbHZlLlxuICAgICAqXG4gICAgICogQXMgYSBydWxlIG9mIHRodW1iLCBpZiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBtb3JlXG4gICAgICogY29tcGxpY2F0ZWQgdGhhbiBhIEpTT04gb2JqZWN0IChlLmcuIG1vc3QgY2xhc3NlcyksIHRoZW5cbiAgICAgKiB7QGxpbmsgV2ViV29ya2VyLmV2YWx1YXRlIHwgZXZhbHVhdGV9IHdpbGwgX2xpa2VseV8gcmV0dXJuIHNvbWUgdHJ1bmNhdGVkXG4gICAgICogdmFsdWUgKG9yIGB7fWApLiBUaGlzIGlzIGJlY2F1c2Ugd2UgYXJlIG5vdCByZXR1cm5pbmcgdGhlIGFjdHVhbCByZXR1cm5cbiAgICAgKiB2YWx1ZSwgYnV0IGEgZGVzZXJpYWxpemVkIHZlcnNpb24gYXMgYSByZXN1bHQgb2YgdHJhbnNmZXJyaW5nIHRoZSByZXR1cm5cbiAgICAgKiB2YWx1ZSB0aHJvdWdoIGEgcHJvdG9jb2wgdG8gUHVwcGV0ZWVyLlxuICAgICAqXG4gICAgICogSW4gZ2VuZXJhbCwgeW91IHNob3VsZCB1c2VcbiAgICAgKiB7QGxpbmsgV2ViV29ya2VyLmV2YWx1YXRlSGFuZGxlIHwgZXZhbHVhdGVIYW5kbGV9IGlmXG4gICAgICoge0BsaW5rIFdlYldvcmtlci5ldmFsdWF0ZSB8IGV2YWx1YXRlfSBjYW5ub3Qgc2VyaWFsaXplIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgKiBwcm9wZXJseSBvciB5b3UgbmVlZCBhIG11dGFibGUge0BsaW5rIEpTSGFuZGxlIHwgaGFuZGxlfSB0byB0aGUgcmV0dXJuXG4gICAgICogb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZ1bmMgLSBGdW5jdGlvbiB0byBiZSBldmFsdWF0ZWQuXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBcmd1bWVudHMgdG8gcGFzcyBpbnRvIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAgICAgKi9cbiAgICBhc3luYyBldmFsdWF0ZShmdW5jLCAuLi5hcmdzKSB7XG4gICAgICAgIGZ1bmMgPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGUubmFtZSwgZnVuYyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5SZWFsbSgpLmV2YWx1YXRlKGZ1bmMsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmFsdWF0ZXMgYSBnaXZlbiBmdW5jdGlvbiBpbiB0aGUge0BsaW5rIFdlYldvcmtlciB8IHdvcmtlcn0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBJZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UsXG4gICAgICoge0BsaW5rIFdlYldvcmtlci5ldmFsdWF0ZSB8IGV2YWx1YXRlfSB3aWxsIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvIHJlc29sdmUuXG4gICAgICpcbiAgICAgKiBJbiBnZW5lcmFsLCB5b3Ugc2hvdWxkIHVzZVxuICAgICAqIHtAbGluayBXZWJXb3JrZXIuZXZhbHVhdGVIYW5kbGUgfCBldmFsdWF0ZUhhbmRsZX0gaWZcbiAgICAgKiB7QGxpbmsgV2ViV29ya2VyLmV2YWx1YXRlIHwgZXZhbHVhdGV9IGNhbm5vdCBzZXJpYWxpemUgdGhlIHJldHVybiB2YWx1ZVxuICAgICAqIHByb3Blcmx5IG9yIHlvdSBuZWVkIGEgbXV0YWJsZSB7QGxpbmsgSlNIYW5kbGUgfCBoYW5kbGV9IHRvIHRoZSByZXR1cm5cbiAgICAgKiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZnVuYyAtIEZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyB0byBwYXNzIGludG8gYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIEEge0BsaW5rIEpTSGFuZGxlIHwgaGFuZGxlfSB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIGBmdW5jYC5cbiAgICAgKi9cbiAgICBhc3luYyBldmFsdWF0ZUhhbmRsZShmdW5jLCAuLi5hcmdzKSB7XG4gICAgICAgIGZ1bmMgPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgZnVuYyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5SZWFsbSgpLmV2YWx1YXRlSGFuZGxlKGZ1bmMsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uKCdXZWJXb3JrZXIuY2xvc2UoKSBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViV29ya2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL0Jyb3dzZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Ccm93c2VyQ29udGV4dC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0NEUFNlc3Npb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9EaWFsb2cuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9FbGVtZW50SGFuZGxlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRW52aXJvbm1lbnQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9GcmFtZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0hUVFBSZXF1ZXN0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSFRUUFJlc3BvbnNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSW5wdXQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1BhZ2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9SZWFsbS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1RhcmdldC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1dlYldvcmtlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2xvY2F0b3JzL2xvY2F0b3JzLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFwaS5qcy5tYXAiLCJ2YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xuaW1wb3J0IHsgRU1QVFksIGNhdGNoRXJyb3IsIGRlZmF1bHRJZkVtcHR5LCBkZWZlciwgZmlsdGVyLCBmaXJzdCwgZmlyc3RWYWx1ZUZyb20sIGZyb20sIGlkZW50aXR5LCBpZ25vcmVFbGVtZW50cywgbWFwLCBtZXJnZSwgbWVyZ2VNYXAsIG5vb3AsIHBpcGUsIHJhY2UsIHJhY2VXaXRoLCByZXRyeSwgdGFwLCB0aHJvd0lmRW1wdHksIH0gZnJvbSAnLi4vLi4vLi4vdGhpcmRfcGFydHkvcnhqcy9yeGpzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgZnJvbUFib3J0U2lnbmFsLCB0aW1lb3V0IH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWwuanMnO1xuLyoqXG4gKiBBbGwgdGhlIGV2ZW50cyB0aGF0IGEgbG9jYXRvciBpbnN0YW5jZSBtYXkgZW1pdC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRvckV2ZW50O1xuKGZ1bmN0aW9uIChMb2NhdG9yRXZlbnQpIHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGV2ZXJ5IHRpbWUgYmVmb3JlIHRoZSBsb2NhdG9yIHBlcmZvcm1zIGFuIGFjdGlvbiBvbiB0aGUgbG9jYXRlZCBlbGVtZW50KHMpLlxuICAgICAqL1xuICAgIExvY2F0b3JFdmVudFtcIkFjdGlvblwiXSA9IFwiYWN0aW9uXCI7XG59KShMb2NhdG9yRXZlbnQgfHwgKExvY2F0b3JFdmVudCA9IHt9KSk7XG4vKipcbiAqIExvY2F0b3JzIGRlc2NyaWJlIGEgc3RyYXRlZ3kgb2YgbG9jYXRpbmcgb2JqZWN0cyBhbmQgcGVyZm9ybWluZyBhbiBhY3Rpb24gb25cbiAqIHRoZW0uIElmIHRoZSBhY3Rpb24gZmFpbHMgYmVjYXVzZSB0aGUgb2JqZWN0IGlzIG5vdCByZWFkeSBmb3IgdGhlIGFjdGlvbiwgdGhlXG4gKiB3aG9sZSBvcGVyYXRpb24gaXMgcmV0cmllZC4gVmFyaW91cyBwcmVjb25kaXRpb25zIGZvciBhIHN1Y2Nlc3NmdWwgYWN0aW9uIGFyZVxuICogY2hlY2tlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjbG9jYXRvcnN9IGZvciBkZXRhaWxzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIExvY2F0b3IgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByYWNlIGJldHdlZW4gbXVsdGlwbGUgbG9jYXRvcnMgdHJ5aW5nIHRvIGxvY2F0ZSBlbGVtZW50cyBpblxuICAgICAqIHBhcmFsbGVsIGJ1dCBlbnN1cmVzIHRoYXQgb25seSBhIHNpbmdsZSBlbGVtZW50IHJlY2VpdmVzIHRoZSBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgc3RhdGljIHJhY2UobG9jYXRvcnMpIHtcbiAgICAgICAgcmV0dXJuIFJhY2VMb2NhdG9yLmNyZWF0ZShsb2NhdG9ycyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHZpc2liaWxpdHkgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF90aW1lb3V0ID0gMzAwMDA7XG4gICAgI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQgPSB0cnVlO1xuICAgICN3YWl0Rm9yRW5hYmxlZCA9IHRydWU7XG4gICAgI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveCA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgb3BlcmF0b3JzID0ge1xuICAgICAgICBjb25kaXRpb25zOiAoY29uZGl0aW9ucywgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VNYXAoKGhhbmRsZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZSguLi5jb25kaXRpb25zLm1hcChjb25kaXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uKGhhbmRsZSwgc2lnbmFsKTtcbiAgICAgICAgICAgICAgICB9KSkucGlwZShkZWZhdWx0SWZFbXB0eShoYW5kbGUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZXRyeUFuZFJhY2VXaXRoU2lnbmFsQW5kVGltZXI6IChzaWduYWwsIGNhdXNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gW107XG4gICAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKGZyb21BYm9ydFNpZ25hbChzaWduYWwsIGNhdXNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2godGltZW91dCh0aGlzLl90aW1lb3V0LCBjYXVzZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHBpcGUocmV0cnkoeyBkZWxheTogUkVUUllfREVMQVkgfSksIHJhY2VXaXRoKC4uLmNhbmRpZGF0ZXMpKTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIC8vIERldGVybWluZXMgd2hlbiB0aGUgbG9jYXRvciB3aWxsIHRpbWVvdXQgZm9yIGFjdGlvbnMuXG4gICAgZ2V0IHRpbWVvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lb3V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGxvY2F0b3IgaW5zdGFuY2UgYnkgY2xvbmluZyB0aGUgY3VycmVudCBsb2NhdG9yIGFuZCBzZXR0aW5nXG4gICAgICogdGhlIHRvdGFsIHRpbWVvdXQgZm9yIHRoZSBsb2NhdG9yIGFjdGlvbnMuXG4gICAgICpcbiAgICAgKiBQYXNzIGAwYCB0byBkaXNhYmxlIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdFZhbHVlIGBQYWdlLmdldERlZmF1bHRUaW1lb3V0KClgXG4gICAgICovXG4gICAgc2V0VGltZW91dCh0aW1lb3V0KSB7XG4gICAgICAgIGNvbnN0IGxvY2F0b3IgPSB0aGlzLl9jbG9uZSgpO1xuICAgICAgICBsb2NhdG9yLl90aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgbG9jYXRvciBpbnN0YW5jZSBieSBjbG9uaW5nIHRoZSBjdXJyZW50IGxvY2F0b3Igd2l0aCB0aGVcbiAgICAgKiB2aXNpYmlsaXR5IHByb3BlcnR5IGNoYW5nZWQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBzZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpIHtcbiAgICAgICAgY29uc3QgbG9jYXRvciA9IHRoaXMuX2Nsb25lKCk7XG4gICAgICAgIGxvY2F0b3IudmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7XG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGxvY2F0b3IgaW5zdGFuY2UgYnkgY2xvbmluZyB0aGUgY3VycmVudCBsb2NhdG9yIGFuZFxuICAgICAqIHNwZWNpZnlpbmcgd2hldGhlciB0byB3YWl0IGZvciBpbnB1dCBlbGVtZW50cyB0byBiZWNvbWUgZW5hYmxlZCBiZWZvcmUgdGhlXG4gICAgICogYWN0aW9uLiBBcHBsaWNhYmxlIHRvIGBjbGlja2AgYW5kIGBmaWxsYCBhY3Rpb25zLlxuICAgICAqXG4gICAgICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWBcbiAgICAgKi9cbiAgICBzZXRXYWl0Rm9yRW5hYmxlZCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgbG9jYXRvci4jd2FpdEZvckVuYWJsZWQgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgbG9jYXRvciBpbnN0YW5jZSBieSBjbG9uaW5nIHRoZSBjdXJyZW50IGxvY2F0b3IgYW5kXG4gICAgICogc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBsb2NhdG9yIHNob3VsZCBzY3JvbGwgdGhlIGVsZW1lbnQgaW50byB2aWV3cG9ydCBpZlxuICAgICAqIGl0IGlzIG5vdCBpbiB0aGUgdmlld3BvcnQgYWxyZWFkeS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0VmFsdWUgYHRydWVgXG4gICAgICovXG4gICAgc2V0RW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgbG9jYXRvci4jZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBsb2NhdG9yIGluc3RhbmNlIGJ5IGNsb25pbmcgdGhlIGN1cnJlbnQgbG9jYXRvciBhbmRcbiAgICAgKiBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGxvY2F0b3IgaGFzIHRvIHdhaXQgZm9yIHRoZSBlbGVtZW50J3MgYm91bmRpbmcgYm94XG4gICAgICogdG8gYmUgc2FtZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBhbmltYXRpb24gZnJhbWVzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWBcbiAgICAgKi9cbiAgICBzZXRXYWl0Rm9yU3RhYmxlQm91bmRpbmdCb3godmFsdWUpIHtcbiAgICAgICAgY29uc3QgbG9jYXRvciA9IHRoaXMuX2Nsb25lKCk7XG4gICAgICAgIGxvY2F0b3IuI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29weU9wdGlvbnMobG9jYXRvcikge1xuICAgICAgICB0aGlzLl90aW1lb3V0ID0gbG9jYXRvci5fdGltZW91dDtcbiAgICAgICAgdGhpcy52aXNpYmlsaXR5ID0gbG9jYXRvci52aXNpYmlsaXR5O1xuICAgICAgICB0aGlzLiN3YWl0Rm9yRW5hYmxlZCA9IGxvY2F0b3IuI3dhaXRGb3JFbmFibGVkO1xuICAgICAgICB0aGlzLiNlbnN1cmVFbGVtZW50SXNJblRoZVZpZXdwb3J0ID0gbG9jYXRvci4jZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydDtcbiAgICAgICAgdGhpcy4jd2FpdEZvclN0YWJsZUJvdW5kaW5nQm94ID0gbG9jYXRvci4jd2FpdEZvclN0YWJsZUJvdW5kaW5nQm94O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVsZW1lbnQgaGFzIGEgXCJkaXNhYmxlZFwiIHByb3BlcnR5LCB3YWl0IGZvciB0aGUgZWxlbWVudCB0byBiZVxuICAgICAqIGVuYWJsZWQuXG4gICAgICovXG4gICAgI3dhaXRGb3JFbmFibGVkSWZOZWVkZWQgPSAoaGFuZGxlLCBzaWduYWwpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLiN3YWl0Rm9yRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcm9tKGhhbmRsZS5mcmFtZS53YWl0Rm9yRnVuY3Rpb24oZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc05hdGl2ZUZvcm1Db250cm9sID0gW1xuICAgICAgICAgICAgICAgICdCVVRUT04nLFxuICAgICAgICAgICAgICAgICdJTlBVVCcsXG4gICAgICAgICAgICAgICAgJ1NFTEVDVCcsXG4gICAgICAgICAgICAgICAgJ1RFWFRBUkVBJyxcbiAgICAgICAgICAgICAgICAnT1BUSU9OJyxcbiAgICAgICAgICAgICAgICAnT1BUR1JPVVAnLFxuICAgICAgICAgICAgXS5pbmNsdWRlcyhlbGVtZW50Lm5vZGVOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiAhaXNOYXRpdmVGb3JtQ29udHJvbCB8fCAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHRpbWVvdXQ6IHRoaXMuX3RpbWVvdXQsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0sIGhhbmRsZSkpLnBpcGUoaWdub3JlRWxlbWVudHMoKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBlbGVtZW50IGZvciB0d28gY29uc2VjdXRpdmUgYW5pbWF0aW9uXG4gICAgICogZnJhbWVzIGFuZCB3YWl0cyB0aWxsIHRoZXkgYXJlIHRoZSBzYW1lLlxuICAgICAqL1xuICAgICN3YWl0Rm9yU3RhYmxlQm91bmRpbmdCb3hJZk5lZWRlZCA9IChoYW5kbGUpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLiN3YWl0Rm9yU3RhYmxlQm91bmRpbmdCb3gpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgLy8gTm90ZSB3ZSBkb24ndCB1c2Ugd2FpdEZvckZ1bmN0aW9uIGJlY2F1c2UgdGhhdCByZWxpZXMgb24gUkFGLlxuICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0MSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0MiA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHJlY3QxLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiByZWN0MS55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHJlY3QxLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZWN0MS5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHJlY3QyLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiByZWN0Mi55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHJlY3QyLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZWN0Mi5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pLnBpcGUoZmlyc3QoKFtyZWN0MSwgcmVjdDJdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKHJlY3QxLnggPT09IHJlY3QyLnggJiZcbiAgICAgICAgICAgICAgICByZWN0MS55ID09PSByZWN0Mi55ICYmXG4gICAgICAgICAgICAgICAgcmVjdDEud2lkdGggPT09IHJlY3QyLndpZHRoICYmXG4gICAgICAgICAgICAgICAgcmVjdDEuaGVpZ2h0ID09PSByZWN0Mi5oZWlnaHQpO1xuICAgICAgICB9KSwgcmV0cnkoeyBkZWxheTogUkVUUllfREVMQVkgfSksIGlnbm9yZUVsZW1lbnRzKCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSB2aWV3cG9ydCBhbmQgYXV0by1zY3JvbGxzIGl0IGlmIGl0IGlzIG5vdC5cbiAgICAgKi9cbiAgICAjZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydElmTmVlZGVkID0gKGhhbmRsZSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuaXNJbnRlcnNlY3RpbmdWaWV3cG9ydCh7IHRocmVzaG9sZDogMCB9KSkucGlwZShmaWx0ZXIoaXNJbnRlcnNlY3RpbmdWaWV3cG9ydCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIWlzSW50ZXJzZWN0aW5nVmlld3BvcnQ7XG4gICAgICAgIH0pLCBtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIH0pLCBtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tKGhhbmRsZS5pc0ludGVyc2VjdGluZ1ZpZXdwb3J0KHsgdGhyZXNob2xkOiAwIH0pKTtcbiAgICAgICAgICAgIH0pLnBpcGUoZmlyc3QoaWRlbnRpdHkpLCByZXRyeSh7IGRlbGF5OiBSRVRSWV9ERUxBWSB9KSwgaWdub3JlRWxlbWVudHMoKSk7XG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgICNjbGljayhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICAgICAgY29uc3QgY2F1c2UgPSBuZXcgRXJyb3IoJ0xvY2F0b3IuY2xpY2snKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhaXQob3B0aW9ucykucGlwZSh0aGlzLm9wZXJhdG9ycy5jb25kaXRpb25zKFtcbiAgICAgICAgICAgIHRoaXMuI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnRJZk5lZWRlZCxcbiAgICAgICAgICAgIHRoaXMuI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveElmTmVlZGVkLFxuICAgICAgICAgICAgdGhpcy4jd2FpdEZvckVuYWJsZWRJZk5lZWRlZCxcbiAgICAgICAgXSwgc2lnbmFsKSwgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoTG9jYXRvckV2ZW50LkFjdGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSksIG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuY2xpY2sob3B0aW9ucykpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgaGFuZGxlLmRpc3Bvc2UoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pLCB0aGlzLm9wZXJhdG9ycy5yZXRyeUFuZFJhY2VXaXRoU2lnbmFsQW5kVGltZXIoc2lnbmFsLCBjYXVzZSkpO1xuICAgIH1cbiAgICAjZmlsbCh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gbmV3IEVycm9yKCdMb2NhdG9yLmZpbGwnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhaXQob3B0aW9ucykucGlwZSh0aGlzLm9wZXJhdG9ycy5jb25kaXRpb25zKFtcbiAgICAgICAgICAgIHRoaXMuI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnRJZk5lZWRlZCxcbiAgICAgICAgICAgIHRoaXMuI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveElmTmVlZGVkLFxuICAgICAgICAgICAgdGhpcy4jd2FpdEZvckVuYWJsZWRJZk5lZWRlZCxcbiAgICAgICAgXSwgc2lnbmFsKSwgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoTG9jYXRvckV2ZW50LkFjdGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSksIG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuZXZhbHVhdGUoZWwgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnc2VsZWN0JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3R5cGVhYmxlLWlucHV0JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3IFNldChbXG4gICAgICAgICAgICAgICAgICAgICAgICAndGV4dGFyZWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAndGVsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzZWFyY2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2VtYWlsJyxcbiAgICAgICAgICAgICAgICAgICAgXSkuaGFzKGVsLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3R5cGVhYmxlLWlucHV0JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnb3RoZXItaW5wdXQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbnRlbnRlZGl0YWJsZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAndW5rbm93bic7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAucGlwZShtZXJnZU1hcChpbnB1dFR5cGUgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5wdXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuc2VsZWN0KHZhbHVlKS50aGVuKG5vb3ApKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29udGVudGVkaXRhYmxlJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndHlwZWFibGUtaW5wdXQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKChpbnB1dCwgbmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBpbnB1dC5pc0NvbnRlbnRFZGl0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmlubmVyVGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlucHV0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBpbnB1dCBpZiB0aGUgY3VycmVudCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gY3VycmVudFZhbHVlLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmV3VmFsdWUuc3RhcnRzV2l0aChpbnB1dC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5pbm5lclRleHQgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gaW5wdXQuaXNDb250ZW50RWRpdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5pbm5lclRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgcGFydGlhbGx5IGZpbGxlZCBvdXQsIG9ubHkgdHlwZSB0aGUgcmVzdC4gTW92ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBjb21tb24gcHJlZml4LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5pbm5lclRleHQgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuaW5uZXJUZXh0ID0gb3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gb3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlLnN1YnN0cmluZyhvcmlnaW5hbFZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB2YWx1ZSkpLnBpcGUobWVyZ2VNYXAodGV4dFRvVHlwZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLnR5cGUodGV4dFRvVHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdvdGhlci1pbnB1dCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuZm9jdXMoKSkucGlwZShtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKChpbnB1dCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndW5rbm93bic6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY2Fubm90IGJlIGZpbGxlZCBvdXQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgaGFuZGxlLmRpc3Bvc2UoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pLCB0aGlzLm9wZXJhdG9ycy5yZXRyeUFuZFJhY2VXaXRoU2lnbmFsQW5kVGltZXIoc2lnbmFsLCBjYXVzZSkpO1xuICAgIH1cbiAgICAjaG92ZXIob3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gbmV3IEVycm9yKCdMb2NhdG9yLmhvdmVyJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl93YWl0KG9wdGlvbnMpLnBpcGUodGhpcy5vcGVyYXRvcnMuY29uZGl0aW9ucyhbXG4gICAgICAgICAgICB0aGlzLiNlbnN1cmVFbGVtZW50SXNJblRoZVZpZXdwb3J0SWZOZWVkZWQsXG4gICAgICAgICAgICB0aGlzLiN3YWl0Rm9yU3RhYmxlQm91bmRpbmdCb3hJZk5lZWRlZCxcbiAgICAgICAgXSwgc2lnbmFsKSwgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoTG9jYXRvckV2ZW50LkFjdGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSksIG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuaG92ZXIoKSkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBoYW5kbGUuZGlzcG9zZSgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSksIHRoaXMub3BlcmF0b3JzLnJldHJ5QW5kUmFjZVdpdGhTaWduYWxBbmRUaW1lcihzaWduYWwsIGNhdXNlKSk7XG4gICAgfVxuICAgICNzY3JvbGwob3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gbmV3IEVycm9yKCdMb2NhdG9yLnNjcm9sbCcpO1xuICAgICAgICByZXR1cm4gdGhpcy5fd2FpdChvcHRpb25zKS5waXBlKHRoaXMub3BlcmF0b3JzLmNvbmRpdGlvbnMoW1xuICAgICAgICAgICAgdGhpcy4jZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydElmTmVlZGVkLFxuICAgICAgICAgICAgdGhpcy4jd2FpdEZvclN0YWJsZUJvdW5kaW5nQm94SWZOZWVkZWQsXG4gICAgICAgIF0sIHNpZ25hbCksIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KExvY2F0b3JFdmVudC5BY3Rpb24sIHVuZGVmaW5lZCk7XG4gICAgICAgIH0pLCBtZXJnZU1hcChoYW5kbGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKChlbCwgc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbFRvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbExlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBlbC5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBvcHRpb25zPy5zY3JvbGxUb3AsIG9wdGlvbnM/LnNjcm9sbExlZnQpKS5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICB2b2lkIGhhbmRsZS5kaXNwb3NlKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSwgdGhpcy5vcGVyYXRvcnMucmV0cnlBbmRSYWNlV2l0aFNpZ25hbEFuZFRpbWVyKHNpZ25hbCwgY2F1c2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvbmVzIHRoZSBsb2NhdG9yLlxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvbmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgZm9yIHRoZSBsb2NhdG9yIHRvIGdldCBhIGhhbmRsZSBmcm9tIHRoZSBwYWdlLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGFzeW5jIHdhaXRIYW5kbGUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBjYXVzZSA9IG5ldyBFcnJvcignTG9jYXRvci53YWl0SGFuZGxlJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl93YWl0KG9wdGlvbnMpLnBpcGUodGhpcy5vcGVyYXRvcnMucmV0cnlBbmRSYWNlV2l0aFNpZ25hbEFuZFRpbWVyKG9wdGlvbnM/LnNpZ25hbCwgY2F1c2UpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdhaXRzIGZvciB0aGUgbG9jYXRvciB0byBnZXQgdGhlIHNlcmlhbGl6ZWQgdmFsdWUgZnJvbSB0aGUgcGFnZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhpcyByZXF1aXJlcyB0aGUgdmFsdWUgdG8gYmUgSlNPTi1zZXJpYWxpemFibGUuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgYXN5bmMgd2FpdChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHRoaXMud2FpdEhhbmRsZShvcHRpb25zKSwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZS5qc29uVmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFwcyB0aGUgbG9jYXRvciB1c2luZyB0aGUgcHJvdmlkZWQgbWFwcGVyLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIG1hcChtYXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBwZWRMb2NhdG9yKHRoaXMuX2Nsb25lKCksIGhhbmRsZSA9PiB7XG4gICAgICAgICAgICAvLyBTQUZFVFk6IFR5cGVTY3JpcHQgY2Fubm90IGRlZHVjZSB0aGUgdHlwZS5cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGUuZXZhbHVhdGVIYW5kbGUobWFwcGVyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gZXhwZWN0YXRpb24gdGhhdCBpcyBldmFsdWF0ZWQgYWdhaW5zdCBsb2NhdGVkIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBleHBlY3RhdGlvbnMgZG8gbm90IG1hdGNoLCB0aGVuIHRoZSBsb2NhdG9yIHdpbGwgcmV0cnkuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgZmlsdGVyKHByZWRpY2F0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZpbHRlcmVkTG9jYXRvcih0aGlzLl9jbG9uZSgpLCBhc3luYyAoaGFuZGxlLCBzaWduYWwpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZS5mcmFtZS53YWl0Rm9yRnVuY3Rpb24ocHJlZGljYXRlLCB7IHNpZ25hbCwgdGltZW91dDogdGhpcy5fdGltZW91dCB9LCBoYW5kbGUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGV4cGVjdGF0aW9uIHRoYXQgaXMgZXZhbHVhdGVkIGFnYWluc3QgbG9jYXRlZCBoYW5kbGVzLlxuICAgICAqXG4gICAgICogSWYgdGhlIGV4cGVjdGF0aW9ucyBkbyBub3QgbWF0Y2gsIHRoZW4gdGhlIGxvY2F0b3Igd2lsbCByZXRyeS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGZpbHRlckhhbmRsZShwcmVkaWNhdGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJlZExvY2F0b3IodGhpcy5fY2xvbmUoKSwgcHJlZGljYXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFwcyB0aGUgbG9jYXRvciB1c2luZyB0aGUgcHJvdmlkZWQgbWFwcGVyLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgbWFwSGFuZGxlKG1hcHBlcikge1xuICAgICAgICByZXR1cm4gbmV3IE1hcHBlZExvY2F0b3IodGhpcy5fY2xvbmUoKSwgbWFwcGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xpY2tzIHRoZSBsb2NhdGVkIGVsZW1lbnQuXG4gICAgICovXG4gICAgY2xpY2sob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy4jY2xpY2sob3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaWxscyBvdXQgdGhlIGlucHV0IGlkZW50aWZpZWQgYnkgdGhlIGxvY2F0b3IgdXNpbmcgdGhlIHByb3ZpZGVkIHZhbHVlLiBUaGVcbiAgICAgKiB0eXBlIG9mIHRoZSBpbnB1dCBpcyBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUgYW5kIHRoZSBhcHByb3ByaWF0ZSBmaWxsLW91dFxuICAgICAqIG1ldGhvZCBpcyBjaG9zZW4gYmFzZWQgb24gdGhlIHR5cGUuIGBjb250ZW50ZWRpdGFibGVgLCBzZWxlY3QsIHRleHRhcmVhIGFuZFxuICAgICAqIGlucHV0IGVsZW1lbnRzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICovXG4gICAgZmlsbCh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy4jZmlsbCh2YWx1ZSwgb3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIb3ZlcnMgb3ZlciB0aGUgbG9jYXRlZCBlbGVtZW50LlxuICAgICAqL1xuICAgIGhvdmVyKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuI2hvdmVyKG9wdGlvbnMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2Nyb2xscyB0aGUgbG9jYXRlZCBlbGVtZW50LlxuICAgICAqL1xuICAgIHNjcm9sbChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLiNzY3JvbGwob3B0aW9ucykpO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBGdW5jdGlvbkxvY2F0b3IgZXh0ZW5kcyBMb2NhdG9yIHtcbiAgICBzdGF0aWMgY3JlYXRlKHBhZ2VPckZyYW1lLCBmdW5jKSB7XG4gICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25Mb2NhdG9yKHBhZ2VPckZyYW1lLCBmdW5jKS5zZXRUaW1lb3V0KCdnZXREZWZhdWx0VGltZW91dCcgaW4gcGFnZU9yRnJhbWVcbiAgICAgICAgICAgID8gcGFnZU9yRnJhbWUuZ2V0RGVmYXVsdFRpbWVvdXQoKVxuICAgICAgICAgICAgOiBwYWdlT3JGcmFtZS5wYWdlKCkuZ2V0RGVmYXVsdFRpbWVvdXQoKSk7XG4gICAgfVxuICAgICNwYWdlT3JGcmFtZTtcbiAgICAjZnVuYztcbiAgICBjb25zdHJ1Y3RvcihwYWdlT3JGcmFtZSwgZnVuYykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNwYWdlT3JGcmFtZSA9IHBhZ2VPckZyYW1lO1xuICAgICAgICB0aGlzLiNmdW5jID0gZnVuYztcbiAgICB9XG4gICAgX2Nsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uTG9jYXRvcih0aGlzLiNwYWdlT3JGcmFtZSwgdGhpcy4jZnVuYyk7XG4gICAgfVxuICAgIF93YWl0KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZyb20odGhpcy4jcGFnZU9yRnJhbWUud2FpdEZvckZ1bmN0aW9uKHRoaXMuI2Z1bmMsIHtcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiB0aGlzLnRpbWVvdXQsXG4gICAgICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KS5waXBlKHRocm93SWZFbXB0eSgpKTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRGVsZWdhdGVkTG9jYXRvciBleHRlbmRzIExvY2F0b3Ige1xuICAgICNkZWxlZ2F0ZTtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNkZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgICAgICB0aGlzLmNvcHlPcHRpb25zKHRoaXMuI2RlbGVnYXRlKTtcbiAgICB9XG4gICAgZ2V0IGRlbGVnYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGVsZWdhdGU7XG4gICAgfVxuICAgIHNldFRpbWVvdXQodGltZW91dCkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gc3VwZXIuc2V0VGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgbG9jYXRvci4jZGVsZWdhdGUgPSB0aGlzLiNkZWxlZ2F0ZS5zZXRUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KSB7XG4gICAgICAgIGNvbnN0IGxvY2F0b3IgPSBzdXBlci5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IGxvY2F0b3IuI2RlbGVnYXRlLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7XG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgIH1cbiAgICBzZXRXYWl0Rm9yRW5hYmxlZCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gc3VwZXIuc2V0V2FpdEZvckVuYWJsZWQodmFsdWUpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IHRoaXMuI2RlbGVnYXRlLnNldFdhaXRGb3JFbmFibGVkKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XG4gICAgfVxuICAgIHNldEVuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbG9jYXRvciA9IHN1cGVyLnNldEVuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQodmFsdWUpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IHRoaXMuI2RlbGVnYXRlLnNldEVuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQodmFsdWUpO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgc2V0V2FpdEZvclN0YWJsZUJvdW5kaW5nQm94KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0b3IgPSBzdXBlci5zZXRXYWl0Rm9yU3RhYmxlQm91bmRpbmdCb3godmFsdWUpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IHRoaXMuI2RlbGVnYXRlLnNldFdhaXRGb3JTdGFibGVCb3VuZGluZ0JveCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWx0ZXJlZExvY2F0b3IgZXh0ZW5kcyBEZWxlZ2F0ZWRMb2NhdG9yIHtcbiAgICAjcHJlZGljYXRlO1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIHByZWRpY2F0ZSkge1xuICAgICAgICBzdXBlcihiYXNlKTtcbiAgICAgICAgdGhpcy4jcHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgIH1cbiAgICBfY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmlsdGVyZWRMb2NhdG9yKHRoaXMuZGVsZWdhdGUuY2xvbmUoKSwgdGhpcy4jcHJlZGljYXRlKS5jb3B5T3B0aW9ucyh0aGlzKTtcbiAgICB9XG4gICAgX3dhaXQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5fd2FpdChvcHRpb25zKS5waXBlKG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUodGhpcy4jcHJlZGljYXRlKGhhbmRsZSwgb3B0aW9ucz8uc2lnbmFsKSkpLnBpcGUoZmlsdGVyKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9KSwgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTQUZFVFk6IEl0IHBhc3NlZCB0aGUgcHJlZGljYXRlLCBzbyB0aGlzIGlzIGNvcnJlY3QuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSksIHRocm93SWZFbXB0eSgpKTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTWFwcGVkTG9jYXRvciBleHRlbmRzIERlbGVnYXRlZExvY2F0b3Ige1xuICAgICNtYXBwZXI7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgbWFwcGVyKSB7XG4gICAgICAgIHN1cGVyKGJhc2UpO1xuICAgICAgICB0aGlzLiNtYXBwZXIgPSBtYXBwZXI7XG4gICAgfVxuICAgIF9jbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBwZWRMb2NhdG9yKHRoaXMuZGVsZWdhdGUuY2xvbmUoKSwgdGhpcy4jbWFwcGVyKS5jb3B5T3B0aW9ucyh0aGlzKTtcbiAgICB9XG4gICAgX3dhaXQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5fd2FpdChvcHRpb25zKS5waXBlKG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUodGhpcy4jbWFwcGVyKGhhbmRsZSwgb3B0aW9ucz8uc2lnbmFsKSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE5vZGVMb2NhdG9yIGV4dGVuZHMgTG9jYXRvciB7XG4gICAgc3RhdGljIGNyZWF0ZShwYWdlT3JGcmFtZSwgc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlTG9jYXRvcihwYWdlT3JGcmFtZSwgc2VsZWN0b3IpLnNldFRpbWVvdXQoJ2dldERlZmF1bHRUaW1lb3V0JyBpbiBwYWdlT3JGcmFtZVxuICAgICAgICAgICAgPyBwYWdlT3JGcmFtZS5nZXREZWZhdWx0VGltZW91dCgpXG4gICAgICAgICAgICA6IHBhZ2VPckZyYW1lLnBhZ2UoKS5nZXREZWZhdWx0VGltZW91dCgpKTtcbiAgICB9XG4gICAgI3BhZ2VPckZyYW1lO1xuICAgICNzZWxlY3RvcjtcbiAgICBjb25zdHJ1Y3RvcihwYWdlT3JGcmFtZSwgc2VsZWN0b3IpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jcGFnZU9yRnJhbWUgPSBwYWdlT3JGcmFtZTtcbiAgICAgICAgdGhpcy4jc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgZm9yIHRoZSBlbGVtZW50IHRvIGJlY29tZSB2aXNpYmxlIG9yIGhpZGRlbi4gdmlzaWJpbGl0eSA9PT0gJ3Zpc2libGUnXG4gICAgICogbWVhbnMgdGhhdCB0aGUgZWxlbWVudCBoYXMgYSBjb21wdXRlZCBzdHlsZSwgdGhlIHZpc2liaWxpdHkgcHJvcGVydHkgb3RoZXJcbiAgICAgKiB0aGFuICdoaWRkZW4nIG9yICdjb2xsYXBzZScgYW5kIG5vbi1lbXB0eSBib3VuZGluZyBib3guIHZpc2liaWxpdHkgPT09XG4gICAgICogJ2hpZGRlbicgbWVhbnMgdGhlIG9wcG9zaXRlIG9mIHRoYXQuXG4gICAgICovXG4gICAgI3dhaXRGb3JWaXNpYmlsaXR5SWZOZWVkZWQgPSAoaGFuZGxlKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgoKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuaXNIaWRkZW4oKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3Zpc2libGUnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmlzVmlzaWJsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCkucGlwZShmaXJzdChpZGVudGl0eSksIHJldHJ5KHsgZGVsYXk6IFJFVFJZX0RFTEFZIH0pLCBpZ25vcmVFbGVtZW50cygpKTtcbiAgICB9O1xuICAgIF9jbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlTG9jYXRvcih0aGlzLiNwYWdlT3JGcmFtZSwgdGhpcy4jc2VsZWN0b3IpLmNvcHlPcHRpb25zKHRoaXMpO1xuICAgIH1cbiAgICBfd2FpdChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICAgICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMuI3BhZ2VPckZyYW1lLndhaXRGb3JTZWxlY3Rvcih0aGlzLiNzZWxlY3Rvciwge1xuICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IHRoaXMuX3RpbWVvdXQsXG4gICAgICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KS5waXBlKGZpbHRlcigodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbDtcbiAgICAgICAgfSksIHRocm93SWZFbXB0eSgpLCB0aGlzLm9wZXJhdG9ycy5jb25kaXRpb25zKFt0aGlzLiN3YWl0Rm9yVmlzaWJpbGl0eUlmTmVlZGVkXSwgc2lnbmFsKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tMb2NhdG9yQXJyYXkobG9jYXRvcnMpIHtcbiAgICBmb3IgKGNvbnN0IGxvY2F0b3Igb2YgbG9jYXRvcnMpIHtcbiAgICAgICAgaWYgKCEobG9jYXRvciBpbnN0YW5jZW9mIExvY2F0b3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbG9jYXRvciBmb3IgcmFjZSBjYW5kaWRhdGUnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbG9jYXRvcnM7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgUmFjZUxvY2F0b3IgZXh0ZW5kcyBMb2NhdG9yIHtcbiAgICBzdGF0aWMgY3JlYXRlKGxvY2F0b3JzKSB7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gY2hlY2tMb2NhdG9yQXJyYXkobG9jYXRvcnMpO1xuICAgICAgICByZXR1cm4gbmV3IFJhY2VMb2NhdG9yKGFycmF5KTtcbiAgICB9XG4gICAgI2xvY2F0b3JzO1xuICAgIGNvbnN0cnVjdG9yKGxvY2F0b3JzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2xvY2F0b3JzID0gbG9jYXRvcnM7XG4gICAgfVxuICAgIF9jbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYWNlTG9jYXRvcih0aGlzLiNsb2NhdG9ycy5tYXAobG9jYXRvciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvci5jbG9uZSgpO1xuICAgICAgICB9KSkuY29weU9wdGlvbnModGhpcyk7XG4gICAgfVxuICAgIF93YWl0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHJhY2UoLi4udGhpcy4jbG9jYXRvcnMubWFwKGxvY2F0b3IgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3IuX3dhaXQob3B0aW9ucyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG4vKipcbiAqIEZvciBvYnNlcnZhYmxlcyBjb21pbmcgZnJvbSBwcm9taXNlcywgYSBkZWxheSBpcyBuZWVkZWQsIG90aGVyd2lzZSBSeEpTIHdpbGxcbiAqIG5ldmVyIHlpZWxkIGluIGEgcGVybWFuZW50IGZhaWx1cmUgZm9yIGEgcHJvbWlzZS5cbiAqXG4gKiBXZSBhbHNvIGRvbid0IHdhbnQgUnhKUyB0byBkbyBwcm9taXNlIG9wZXJhdGlvbnMgdG8gb2Z0ZW4sIHNvIHdlIGJ1bXAgdGhlXG4gKiBkZWxheSB1cCB0byAxMDBtcy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJFVFJZX0RFTEFZID0gMTAwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9jYXRvcnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuLi9jZHAvQ29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBQcm90b2NvbEVycm9yLCBVbnN1cHBvcnRlZE9wZXJhdGlvbiB9IGZyb20gJy4uL2NvbW1vbi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgREVGQVVMVF9WSUVXUE9SVCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbi8qKlxuICogVXNlcnMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBkaXJlY3RseTsgaXQncyBjYWxsZWQgd2hlbiBjYWxsaW5nIGBwdXBwZXRlZXIuY29ubmVjdGBcbiAqIHdpdGggYHByb3RvY29sOiAnd2ViRHJpdmVyQmlEaSdgLiBUaGlzIG1ldGhvZCBhdHRhY2hlcyBQdXBwZXRlZXIgdG8gYW4gZXhpc3RpbmcgYnJvd3NlclxuICogaW5zdGFuY2UuIEZpcnN0IGl0IHRyaWVzIHRvIGNvbm5lY3QgdG8gdGhlIGJyb3dzZXIgdXNpbmcgcHVyZSBCaURpLiBJZiB0aGUgcHJvdG9jb2wgaXNcbiAqIG5vdCBzdXBwb3J0ZWQsIGNvbm5lY3RzIHRvIHRoZSBicm93c2VyIHVzaW5nIEJpRGkgb3ZlciBDRFAuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfY29ubmVjdFRvQmlEaUJyb3dzZXIoY29ubmVjdGlvblRyYW5zcG9ydCwgdXJsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyBpZ25vcmVIVFRQU0Vycm9ycyA9IGZhbHNlLCBkZWZhdWx0Vmlld3BvcnQgPSBERUZBVUxUX1ZJRVdQT1JUIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgYmlkaUNvbm5lY3Rpb24sIGNsb3NlQ2FsbGJhY2sgfSA9IGF3YWl0IGdldEJpRGlDb25uZWN0aW9uKGNvbm5lY3Rpb25UcmFuc3BvcnQsIHVybCwgb3B0aW9ucyk7XG4gICAgY29uc3QgQmlEaSA9IGF3YWl0IGltcG9ydCgvKiA6IHRydWUgKi8gJy4vYmlkaS5qcycpO1xuICAgIGNvbnN0IGJpZGlCcm93c2VyID0gYXdhaXQgQmlEaS5CaWRpQnJvd3Nlci5jcmVhdGUoe1xuICAgICAgICBjb25uZWN0aW9uOiBiaWRpQ29ubmVjdGlvbixcbiAgICAgICAgY2xvc2VDYWxsYmFjayxcbiAgICAgICAgcHJvY2VzczogdW5kZWZpbmVkLFxuICAgICAgICBkZWZhdWx0Vmlld3BvcnQ6IGRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IGlnbm9yZUhUVFBTRXJyb3JzLFxuICAgIH0pO1xuICAgIHJldHVybiBiaWRpQnJvd3Nlcjtcbn1cbi8qKlxuICogUmV0dXJucyBhIEJpRGlDb25uZWN0aW9uIGVzdGFibGlzaGVkIHRvIHRoZSBlbmRwb2ludCBzcGVjaWZpZWQgYnkgdGhlIG9wdGlvbnMgYW5kIGFcbiAqIGNhbGxiYWNrIGNsb3NpbmcgdGhlIGJyb3dzZXIuIENhbGxiYWNrIGRlcGVuZHMgb24gd2hldGhlciB0aGUgY29ubmVjdGlvbiBpcyBwdXJlIEJpRGlcbiAqIG9yIEJpRGkgb3ZlciBDRFAuXG4gKiBUaGUgbWV0aG9kIHRyaWVzIHRvIGNvbm5lY3QgdG8gdGhlIGJyb3dzZXIgdXNpbmcgcHVyZSBCaURpIHByb3RvY29sLCBhbmQgZmFsbHMgYmFja1xuICogdG8gQmlEaSBvdmVyIENEUC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QmlEaUNvbm5lY3Rpb24oY29ubmVjdGlvblRyYW5zcG9ydCwgdXJsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgQmlEaSA9IGF3YWl0IGltcG9ydCgvKiA6IHRydWUgKi8gJy4vYmlkaS5qcycpO1xuICAgIGNvbnN0IHsgaWdub3JlSFRUUFNFcnJvcnMgPSBmYWxzZSwgc2xvd01vID0gMCwgcHJvdG9jb2xUaW1lb3V0IH0gPSBvcHRpb25zO1xuICAgIC8vIFRyeSBwdXJlIEJpRGkgZmlyc3QuXG4gICAgY29uc3QgcHVyZUJpZGlDb25uZWN0aW9uID0gbmV3IEJpRGkuQmlkaUNvbm5lY3Rpb24odXJsLCBjb25uZWN0aW9uVHJhbnNwb3J0LCBzbG93TW8sIHByb3RvY29sVGltZW91dCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHVyZUJpZGlDb25uZWN0aW9uLnNlbmQoJ3Nlc3Npb24uc3RhdHVzJywge30pO1xuICAgICAgICBpZiAoJ3R5cGUnIGluIHJlc3VsdCAmJiByZXN1bHQudHlwZSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAvLyBUaGUgYGJyb3dzZXJXU0VuZHBvaW50YCBwb2ludHMgdG8gYW4gZW5kcG9pbnQgc3VwcG9ydGluZyBwdXJlIFdlYkRyaXZlciBCaURpLlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBiaWRpQ29ubmVjdGlvbjogcHVyZUJpZGlDb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGNsb3NlQ2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHVyZUJpZGlDb25uZWN0aW9uLnNlbmQoJ2Jyb3dzZXIuY2xvc2UnLCB7fSkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFByb3RvY29sRXJyb3IpKSB7XG4gICAgICAgICAgICAvLyBVbmV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgcmVsYXRlZCB0byBCaURpIC8gQ0RQLiBSZXRocm93LlxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBVbmJpbmQgdGhlIGNvbm5lY3Rpb24gdG8gYXZvaWQgbWVtb3J5IGxlYWtzLlxuICAgIHB1cmVCaWRpQ29ubmVjdGlvbi51bmJpbmQoKTtcbiAgICAvLyBGYWxsIGJhY2sgdG8gQ0RQIG92ZXIgQmlEaSByZXVzaW5nIHRoZSBXUyBjb25uZWN0aW9uLlxuICAgIGNvbnN0IGNkcENvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbih1cmwsIGNvbm5lY3Rpb25UcmFuc3BvcnQsIHNsb3dNbywgcHJvdG9jb2xUaW1lb3V0KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgY2RwQ29ubmVjdGlvbi5zZW5kKCdCcm93c2VyLmdldFZlcnNpb24nKTtcbiAgICBpZiAodmVyc2lvbi5wcm9kdWN0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ZpcmVmb3gnKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb24oJ0ZpcmVmb3ggaXMgbm90IHN1cHBvcnRlZCBpbiBCaURpIG92ZXIgQ0RQIG1vZGUuJyk7XG4gICAgfVxuICAgIC8vIFRPRE86IHVzZSBvdGhlciBvcHRpb25zIHRvby5cbiAgICBjb25zdCBiaWRpT3ZlckNkcENvbm5lY3Rpb24gPSBhd2FpdCBCaURpLmNvbm5lY3RCaWRpT3ZlckNkcChjZHBDb25uZWN0aW9uLCB7XG4gICAgICAgIGFjY2VwdEluc2VjdXJlQ2VydHM6IGlnbm9yZUhUVFBTRXJyb3JzLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGJpZGlDb25uZWN0aW9uOiBiaWRpT3ZlckNkcENvbm5lY3Rpb24sXG4gICAgICAgIGNsb3NlQ2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgQmlEaSBvdmVyIENEUCwgd2UgbmVlZCB0byBjbG9zZSBicm93c2VyIHZpYSBDRFAuXG4gICAgICAgICAgICBhd2FpdCBjZHBDb25uZWN0aW9uLnNlbmQoJ0Jyb3dzZXIuY2xvc2UnKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckNvbm5lY3Rvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgQWNjZXNzaWJpbGl0eSBjbGFzcyBwcm92aWRlcyBtZXRob2RzIGZvciBpbnNwZWN0aW5nIHRoZSBicm93c2VyJ3NcbiAqIGFjY2Vzc2liaWxpdHkgdHJlZS4gVGhlIGFjY2Vzc2liaWxpdHkgdHJlZSBpcyB1c2VkIGJ5IGFzc2lzdGl2ZSB0ZWNobm9sb2d5XG4gKiBzdWNoIGFzIHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TY3JlZW5fcmVhZGVyIHwgc2NyZWVuIHJlYWRlcnN9IG9yXG4gKiB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3dpdGNoX2FjY2VzcyB8IHN3aXRjaGVzfS5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIEFjY2Vzc2liaWxpdHkgaXMgYSB2ZXJ5IHBsYXRmb3JtLXNwZWNpZmljIHRoaW5nLiBPbiBkaWZmZXJlbnQgcGxhdGZvcm1zLFxuICogdGhlcmUgYXJlIGRpZmZlcmVudCBzY3JlZW4gcmVhZGVycyB0aGF0IG1pZ2h0IGhhdmUgd2lsZGx5IGRpZmZlcmVudCBvdXRwdXQuXG4gKlxuICogQmxpbmsgLSBDaHJvbWUncyByZW5kZXJpbmcgZW5naW5lIC0gaGFzIGEgY29uY2VwdCBvZiBcImFjY2Vzc2liaWxpdHkgdHJlZVwiLFxuICogd2hpY2ggaXMgdGhlbiB0cmFuc2xhdGVkIGludG8gZGlmZmVyZW50IHBsYXRmb3JtLXNwZWNpZmljIEFQSXMuIEFjY2Vzc2liaWxpdHlcbiAqIG5hbWVzcGFjZSBnaXZlcyB1c2VycyBhY2Nlc3MgdG8gdGhlIEJsaW5rIEFjY2Vzc2liaWxpdHkgVHJlZS5cbiAqXG4gKiBNb3N0IG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUgZ2V0cyBmaWx0ZXJlZCBvdXQgd2hlbiBjb252ZXJ0aW5nIGZyb20gQmxpbmtcbiAqIEFYIFRyZWUgdG8gUGxhdGZvcm0tc3BlY2lmaWMgQVgtVHJlZSBvciBieSBhc3Npc3RpdmUgdGVjaG5vbG9naWVzIHRoZW1zZWx2ZXMuXG4gKiBCeSBkZWZhdWx0LCBQdXBwZXRlZXIgdHJpZXMgdG8gYXBwcm94aW1hdGUgdGhpcyBmaWx0ZXJpbmcsIGV4cG9zaW5nIG9ubHlcbiAqIHRoZSBcImludGVyZXN0aW5nXCIgbm9kZXMgb2YgdGhlIHRyZWUuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQWNjZXNzaWJpbGl0eSB7XG4gICAgI3JlYWxtO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJlYWxtKSB7XG4gICAgICAgIHRoaXMuI3JlYWxtID0gcmVhbG07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhcHR1cmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuXG4gICAgICogVGhlIHJldHVybmVkIG9iamVjdCByZXByZXNlbnRzIHRoZSByb290IGFjY2Vzc2libGUgbm9kZSBvZiB0aGUgcGFnZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBUaGUgQ2hyb21lIGFjY2Vzc2liaWxpdHkgdHJlZSBjb250YWlucyBub2RlcyB0aGF0IGdvIHVudXNlZCBvblxuICAgICAqIG1vc3QgcGxhdGZvcm1zIGFuZCBieSBtb3N0IHNjcmVlbiByZWFkZXJzLiBQdXBwZXRlZXIgd2lsbCBkaXNjYXJkIHRoZW0gYXNcbiAgICAgKiB3ZWxsIGZvciBhbiBlYXNpZXIgdG8gcHJvY2VzcyB0cmVlLCB1bmxlc3MgYGludGVyZXN0aW5nT25seWAgaXMgc2V0IHRvXG4gICAgICogYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogQW4gZXhhbXBsZSBvZiBkdW1waW5nIHRoZSBlbnRpcmUgYWNjZXNzaWJpbGl0eSB0cmVlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHBhZ2UuYWNjZXNzaWJpbGl0eS5zbmFwc2hvdCgpO1xuICAgICAqIGNvbnNvbGUubG9nKHNuYXBzaG90KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogQW4gZXhhbXBsZSBvZiBsb2dnaW5nIHRoZSBmb2N1c2VkIG5vZGUncyBuYW1lOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHBhZ2UuYWNjZXNzaWJpbGl0eS5zbmFwc2hvdCgpO1xuICAgICAqIGNvbnN0IG5vZGUgPSBmaW5kRm9jdXNlZE5vZGUoc25hcHNob3QpO1xuICAgICAqIGNvbnNvbGUubG9nKG5vZGUgJiYgbm9kZS5uYW1lKTtcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGZpbmRGb2N1c2VkTm9kZShub2RlKSB7XG4gICAgICogICBpZiAobm9kZS5mb2N1c2VkKSByZXR1cm4gbm9kZTtcbiAgICAgKiAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbiB8fCBbXSkge1xuICAgICAqICAgICBjb25zdCBmb3VuZE5vZGUgPSBmaW5kRm9jdXNlZE5vZGUoY2hpbGQpO1xuICAgICAqICAgICByZXR1cm4gZm91bmROb2RlO1xuICAgICAqICAgfVxuICAgICAqICAgcmV0dXJuIG51bGw7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gQVhOb2RlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNuYXBzaG90LlxuICAgICAqL1xuICAgIGFzeW5jIHNuYXBzaG90KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGludGVyZXN0aW5nT25seSA9IHRydWUsIHJvb3QgPSBudWxsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCB7IG5vZGVzIH0gPSBhd2FpdCB0aGlzLiNyZWFsbS5lbnZpcm9ubWVudC5jbGllbnQuc2VuZCgnQWNjZXNzaWJpbGl0eS5nZXRGdWxsQVhUcmVlJyk7XG4gICAgICAgIGxldCBiYWNrZW5kTm9kZUlkO1xuICAgICAgICBpZiAocm9vdCkge1xuICAgICAgICAgICAgY29uc3QgeyBub2RlIH0gPSBhd2FpdCB0aGlzLiNyZWFsbS5lbnZpcm9ubWVudC5jbGllbnQuc2VuZCgnRE9NLmRlc2NyaWJlTm9kZScsIHtcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogcm9vdC5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmFja2VuZE5vZGVJZCA9IG5vZGUuYmFja2VuZE5vZGVJZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZhdWx0Um9vdCA9IEFYTm9kZS5jcmVhdGVUcmVlKHRoaXMuI3JlYWxtLCBub2Rlcyk7XG4gICAgICAgIGxldCBuZWVkbGUgPSBkZWZhdWx0Um9vdDtcbiAgICAgICAgaWYgKGJhY2tlbmROb2RlSWQpIHtcbiAgICAgICAgICAgIG5lZWRsZSA9IGRlZmF1bHRSb290LmZpbmQobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUucGF5bG9hZC5iYWNrZW5kRE9NTm9kZUlkID09PSBiYWNrZW5kTm9kZUlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIW5lZWRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaW50ZXJlc3RpbmdPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVUcmVlKG5lZWRsZSlbMF0gPz8gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnRlcmVzdGluZ05vZGVzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLmNvbGxlY3RJbnRlcmVzdGluZ05vZGVzKGludGVyZXN0aW5nTm9kZXMsIGRlZmF1bHRSb290LCBmYWxzZSk7XG4gICAgICAgIGlmICghaW50ZXJlc3RpbmdOb2Rlcy5oYXMobmVlZGxlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplVHJlZShuZWVkbGUsIGludGVyZXN0aW5nTm9kZXMpWzBdID8/IG51bGw7XG4gICAgfVxuICAgIHNlcmlhbGl6ZVRyZWUobm9kZSwgaW50ZXJlc3RpbmdOb2Rlcykge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goLi4udGhpcy5zZXJpYWxpemVUcmVlKGNoaWxkLCBpbnRlcmVzdGluZ05vZGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyZXN0aW5nTm9kZXMgJiYgIWludGVyZXN0aW5nTm9kZXMuaGFzKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZE5vZGUgPSBub2RlLnNlcmlhbGl6ZSgpO1xuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZXJpYWxpemVkTm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbc2VyaWFsaXplZE5vZGVdO1xuICAgIH1cbiAgICBjb2xsZWN0SW50ZXJlc3RpbmdOb2Rlcyhjb2xsZWN0aW9uLCBub2RlLCBpbnNpZGVDb250cm9sKSB7XG4gICAgICAgIGlmIChub2RlLmlzSW50ZXJlc3RpbmcoaW5zaWRlQ29udHJvbCkpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmlzTGVhZk5vZGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGluc2lkZUNvbnRyb2wgPSBpbnNpZGVDb250cm9sIHx8IG5vZGUuaXNDb250cm9sKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy5jb2xsZWN0SW50ZXJlc3RpbmdOb2Rlcyhjb2xsZWN0aW9uLCBjaGlsZCwgaW5zaWRlQ29udHJvbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBBWE5vZGUge1xuICAgIHBheWxvYWQ7XG4gICAgY2hpbGRyZW4gPSBbXTtcbiAgICAjcmljaGx5RWRpdGFibGUgPSBmYWxzZTtcbiAgICAjZWRpdGFibGUgPSBmYWxzZTtcbiAgICAjZm9jdXNhYmxlID0gZmFsc2U7XG4gICAgI2hpZGRlbiA9IGZhbHNlO1xuICAgICNuYW1lO1xuICAgICNyb2xlO1xuICAgICNpZ25vcmVkO1xuICAgICNjYWNoZWRIYXNGb2N1c2FibGVDaGlsZDtcbiAgICAjcmVhbG07XG4gICAgY29uc3RydWN0b3IocmVhbG0sIHBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgdGhpcy4jbmFtZSA9IHRoaXMucGF5bG9hZC5uYW1lID8gdGhpcy5wYXlsb2FkLm5hbWUudmFsdWUgOiAnJztcbiAgICAgICAgdGhpcy4jcm9sZSA9IHRoaXMucGF5bG9hZC5yb2xlID8gdGhpcy5wYXlsb2FkLnJvbGUudmFsdWUgOiAnVW5rbm93bic7XG4gICAgICAgIHRoaXMuI2lnbm9yZWQgPSB0aGlzLnBheWxvYWQuaWdub3JlZDtcbiAgICAgICAgdGhpcy4jcmVhbG0gPSByZWFsbTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLnBheWxvYWQucHJvcGVydGllcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm5hbWUgPT09ICdlZGl0YWJsZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyaWNobHlFZGl0YWJsZSA9IHByb3BlcnR5LnZhbHVlLnZhbHVlID09PSAncmljaHRleHQnO1xuICAgICAgICAgICAgICAgIHRoaXMuI2VkaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5uYW1lID09PSAnZm9jdXNhYmxlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2ZvY3VzYWJsZSA9IHByb3BlcnR5LnZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm5hbWUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jaGlkZGVuID0gcHJvcGVydHkudmFsdWUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2lzUGxhaW5UZXh0RmllbGQoKSB7XG4gICAgICAgIGlmICh0aGlzLiNyaWNobHlFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNlZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI3JvbGUgPT09ICd0ZXh0Ym94JyB8fCB0aGlzLiNyb2xlID09PSAnc2VhcmNoYm94JztcbiAgICB9XG4gICAgI2lzVGV4dE9ubHlPYmplY3QoKSB7XG4gICAgICAgIGNvbnN0IHJvbGUgPSB0aGlzLiNyb2xlO1xuICAgICAgICByZXR1cm4gKHJvbGUgPT09ICdMaW5lQnJlYWsnIHx8XG4gICAgICAgICAgICByb2xlID09PSAndGV4dCcgfHxcbiAgICAgICAgICAgIHJvbGUgPT09ICdJbmxpbmVUZXh0Qm94JyB8fFxuICAgICAgICAgICAgcm9sZSA9PT0gJ1N0YXRpY1RleHQnKTtcbiAgICB9XG4gICAgI2hhc0ZvY3VzYWJsZUNoaWxkKCkge1xuICAgICAgICBpZiAodGhpcy4jY2FjaGVkSGFzRm9jdXNhYmxlQ2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy4jY2FjaGVkSGFzRm9jdXNhYmxlQ2hpbGQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC4jZm9jdXNhYmxlIHx8IGNoaWxkLiNoYXNGb2N1c2FibGVDaGlsZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2NhY2hlZEhhc0ZvY3VzYWJsZUNoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWNoZWRIYXNGb2N1c2FibGVDaGlsZDtcbiAgICB9XG4gICAgZmluZChwcmVkaWNhdGUpIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGlsZC5maW5kKHByZWRpY2F0ZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaXNMZWFmTm9kZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlc2UgdHlwZXMgb2Ygb2JqZWN0cyBtYXkgaGF2ZSBjaGlsZHJlbiB0aGF0IHdlIHVzZSBhcyBpbnRlcm5hbFxuICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCBidXQgd2Ugd2FudCB0byBleHBvc2UgdGhlbSBhcyBsZWF2ZXMgdG8gcGxhdGZvcm1cbiAgICAgICAgLy8gYWNjZXNzaWJpbGl0eSBBUElzIGJlY2F1c2Ugc2NyZWVuIHJlYWRlcnMgbWlnaHQgYmUgY29uZnVzZWQgaWYgdGhleSBmaW5kXG4gICAgICAgIC8vIGFueSBjaGlsZHJlbi5cbiAgICAgICAgaWYgKHRoaXMuI2lzUGxhaW5UZXh0RmllbGQoKSB8fCB0aGlzLiNpc1RleHRPbmx5T2JqZWN0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJvbGVzIHdob3NlIGNoaWxkcmVuIGFyZSBvbmx5IHByZXNlbnRhdGlvbmFsIGFjY29yZGluZyB0byB0aGUgQVJJQSBhbmRcbiAgICAgICAgLy8gSFRNTDUgU3BlY3Mgc2hvdWxkIGJlIGhpZGRlbiBmcm9tIHNjcmVlbiByZWFkZXJzLlxuICAgICAgICAvLyAoTm90ZSB0aGF0IHdoaWxzdCBBUklBIGJ1dHRvbnMgY2FuIGhhdmUgb25seSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiwgSFRNTDVcbiAgICAgICAgLy8gYnV0dG9ucyBhcmUgYWxsb3dlZCB0byBoYXZlIGNvbnRlbnQuKVxuICAgICAgICBzd2l0Y2ggKHRoaXMuI3JvbGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1jb3Zlcic6XG4gICAgICAgICAgICBjYXNlICdncmFwaGljcy1zeW1ib2wnOlxuICAgICAgICAgICAgY2FzZSAnaW1nJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgICAgIGNhc2UgJ01ldGVyJzpcbiAgICAgICAgICAgIGNhc2UgJ3Njcm9sbGJhcic6XG4gICAgICAgICAgICBjYXNlICdzbGlkZXInOlxuICAgICAgICAgICAgY2FzZSAnc2VwYXJhdG9yJzpcbiAgICAgICAgICAgIGNhc2UgJ3Byb2dyZXNzYmFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGVyZSBhbmQgYmVsb3c6IEFuZHJvaWQgaGV1cmlzdGljc1xuICAgICAgICBpZiAodGhpcy4jaGFzRm9jdXNhYmxlQ2hpbGQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNmb2N1c2FibGUgJiYgdGhpcy4jbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3JvbGUgPT09ICdoZWFkaW5nJyAmJiB0aGlzLiNuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlzQ29udHJvbCgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLiNyb2xlKSB7XG4gICAgICAgICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgY2FzZSAnQ29sb3JXZWxsJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbWJvYm94JzpcbiAgICAgICAgICAgIGNhc2UgJ0Rpc2Nsb3N1cmVUcmlhbmdsZSc6XG4gICAgICAgICAgICBjYXNlICdsaXN0Ym94JzpcbiAgICAgICAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgICAgICAgY2FzZSAnbWVudWJhcic6XG4gICAgICAgICAgICBjYXNlICdtZW51aXRlbSc6XG4gICAgICAgICAgICBjYXNlICdtZW51aXRlbWNoZWNrYm94JzpcbiAgICAgICAgICAgIGNhc2UgJ21lbnVpdGVtcmFkaW8nOlxuICAgICAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgICAgY2FzZSAnc2Nyb2xsYmFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NlYXJjaGJveCc6XG4gICAgICAgICAgICBjYXNlICdzbGlkZXInOlxuICAgICAgICAgICAgY2FzZSAnc3BpbmJ1dHRvbic6XG4gICAgICAgICAgICBjYXNlICdzd2l0Y2gnOlxuICAgICAgICAgICAgY2FzZSAndGFiJzpcbiAgICAgICAgICAgIGNhc2UgJ3RleHRib3gnOlxuICAgICAgICAgICAgY2FzZSAndHJlZSc6XG4gICAgICAgICAgICBjYXNlICd0cmVlaXRlbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc0ludGVyZXN0aW5nKGluc2lkZUNvbnRyb2wpIHtcbiAgICAgICAgY29uc3Qgcm9sZSA9IHRoaXMuI3JvbGU7XG4gICAgICAgIGlmIChyb2xlID09PSAnSWdub3JlZCcgfHwgdGhpcy4jaGlkZGVuIHx8IHRoaXMuI2lnbm9yZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jZm9jdXNhYmxlIHx8IHRoaXMuI3JpY2hseUVkaXRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBpdCdzIG5vdCBmb2N1c2FibGUgYnV0IGhhcyBhIGNvbnRyb2wgcm9sZSwgdGhlbiBpdCdzIGludGVyZXN0aW5nLlxuICAgICAgICBpZiAodGhpcy5pc0NvbnRyb2woKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBub24gZm9jdXNhYmxlIGNoaWxkIG9mIGEgY29udHJvbCBpcyBub3QgaW50ZXJlc3RpbmdcbiAgICAgICAgaWYgKGluc2lkZUNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pc0xlYWZOb2RlKCkgJiYgISF0aGlzLiNuYW1lO1xuICAgIH1cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdGhpcy5wYXlsb2FkLnByb3BlcnRpZXMgfHwgW10pIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0KHByb3BlcnR5Lm5hbWUudG9Mb3dlckNhc2UoKSwgcHJvcGVydHkudmFsdWUudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBheWxvYWQubmFtZSkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoJ25hbWUnLCB0aGlzLnBheWxvYWQubmFtZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGF5bG9hZC52YWx1ZSkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoJ3ZhbHVlJywgdGhpcy5wYXlsb2FkLnZhbHVlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXlsb2FkLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnNldCgnZGVzY3JpcHRpb24nLCB0aGlzLnBheWxvYWQuZGVzY3JpcHRpb24udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgICAgICByb2xlOiB0aGlzLiNyb2xlLFxuICAgICAgICAgICAgZWxlbWVudEhhbmRsZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wYXlsb2FkLmJhY2tlbmRET01Ob2RlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy4jcmVhbG0uYWRvcHRCYWNrZW5kTm9kZSh0aGlzLnBheWxvYWQuYmFja2VuZERPTU5vZGVJZCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdXNlclN0cmluZ1Byb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICdrZXlzaG9ydGN1dHMnLFxuICAgICAgICAgICAgJ3JvbGVkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAndmFsdWV0ZXh0JyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgZ2V0VXNlclN0cmluZ1Byb3BlcnR5VmFsdWUgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCB1c2VyU3RyaW5nUHJvcGVydHkgb2YgdXNlclN0cmluZ1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICghcHJvcGVydGllcy5oYXModXNlclN0cmluZ1Byb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZVt1c2VyU3RyaW5nUHJvcGVydHldID0gZ2V0VXNlclN0cmluZ1Byb3BlcnR5VmFsdWUodXNlclN0cmluZ1Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBib29sZWFuUHJvcGVydGllcyA9IFtcbiAgICAgICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICAgICAnZXhwYW5kZWQnLFxuICAgICAgICAgICAgJ2ZvY3VzZWQnLFxuICAgICAgICAgICAgJ21vZGFsJyxcbiAgICAgICAgICAgICdtdWx0aWxpbmUnLFxuICAgICAgICAgICAgJ211bHRpc2VsZWN0YWJsZScsXG4gICAgICAgICAgICAncmVhZG9ubHknLFxuICAgICAgICAgICAgJ3JlcXVpcmVkJyxcbiAgICAgICAgICAgICdzZWxlY3RlZCcsXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGdldEJvb2xlYW5Qcm9wZXJ0eVZhbHVlID0gKGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0KGtleSk7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgYm9vbGVhblByb3BlcnR5IG9mIGJvb2xlYW5Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAvLyBSb290V2ViQXJlYSdzIHRyZWF0IGZvY3VzIGRpZmZlcmVudGx5IHRoYW4gb3RoZXIgbm9kZXMuIFRoZXkgcmVwb3J0IHdoZXRoZXJcbiAgICAgICAgICAgIC8vIHRoZWlyIGZyYW1lICBoYXMgZm9jdXMsIG5vdCB3aGV0aGVyIGZvY3VzIGlzIHNwZWNpZmljYWxseSBvbiB0aGUgcm9vdFxuICAgICAgICAgICAgLy8gbm9kZS5cbiAgICAgICAgICAgIGlmIChib29sZWFuUHJvcGVydHkgPT09ICdmb2N1c2VkJyAmJiB0aGlzLiNyb2xlID09PSAnUm9vdFdlYkFyZWEnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEJvb2xlYW5Qcm9wZXJ0eVZhbHVlKGJvb2xlYW5Qcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlW2Jvb2xlYW5Qcm9wZXJ0eV0gPSBnZXRCb29sZWFuUHJvcGVydHlWYWx1ZShib29sZWFuUHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyaXN0YXRlUHJvcGVydGllcyA9IFsnY2hlY2tlZCcsICdwcmVzc2VkJ107XG4gICAgICAgIGZvciAoY29uc3QgdHJpc3RhdGVQcm9wZXJ0eSBvZiB0cmlzdGF0ZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICghcHJvcGVydGllcy5oYXModHJpc3RhdGVQcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydGllcy5nZXQodHJpc3RhdGVQcm9wZXJ0eSk7XG4gICAgICAgICAgICBub2RlW3RyaXN0YXRlUHJvcGVydHldID1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9PT0gJ21peGVkJyA/ICdtaXhlZCcgOiB2YWx1ZSA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG51bWVyaWNhbFByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAnbGV2ZWwnLFxuICAgICAgICAgICAgJ3ZhbHVlbWF4JyxcbiAgICAgICAgICAgICd2YWx1ZW1pbicsXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGdldE51bWVyaWNhbFByb3BlcnR5VmFsdWUgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBudW1lcmljYWxQcm9wZXJ0eSBvZiBudW1lcmljYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMuaGFzKG51bWVyaWNhbFByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZVtudW1lcmljYWxQcm9wZXJ0eV0gPSBnZXROdW1lcmljYWxQcm9wZXJ0eVZhbHVlKG51bWVyaWNhbFByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlblByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAnYXV0b2NvbXBsZXRlJyxcbiAgICAgICAgICAgICdoYXNwb3B1cCcsXG4gICAgICAgICAgICAnaW52YWxpZCcsXG4gICAgICAgICAgICAnb3JpZW50YXRpb24nLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBnZXRUb2tlblByb3BlcnR5VmFsdWUgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlblByb3BlcnR5IG9mIHRva2VuUHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRUb2tlblByb3BlcnR5VmFsdWUodG9rZW5Qcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlW3Rva2VuUHJvcGVydHldID0gZ2V0VG9rZW5Qcm9wZXJ0eVZhbHVlKHRva2VuUHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlVHJlZShyZWFsbSwgcGF5bG9hZHMpIHtcbiAgICAgICAgY29uc3Qgbm9kZUJ5SWQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgcGF5bG9hZCBvZiBwYXlsb2Fkcykge1xuICAgICAgICAgICAgbm9kZUJ5SWQuc2V0KHBheWxvYWQubm9kZUlkLCBuZXcgQVhOb2RlKHJlYWxtLCBwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVCeUlkLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkSWQgb2Ygbm9kZS5wYXlsb2FkLmNoaWxkSWRzIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlQnlJZC5nZXQoY2hpbGRJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlQnlJZC52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWNjZXNzaWJpbGl0eS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi4vY29tbW9uL1F1ZXJ5SGFuZGxlci5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBBc3luY0l0ZXJhYmxlVXRpbCB9IGZyb20gJy4uL3V0aWwvQXN5bmNJdGVyYWJsZVV0aWwuanMnO1xuY29uc3QgaXNLbm93bkF0dHJpYnV0ZSA9IChhdHRyaWJ1dGUpID0+IHtcbiAgICByZXR1cm4gWyduYW1lJywgJ3JvbGUnXS5pbmNsdWRlcyhhdHRyaWJ1dGUpO1xufTtcbmNvbnN0IG5vcm1hbGl6ZVZhbHVlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyArL2csICcgJykudHJpbSgpO1xufTtcbi8qKlxuICogVGhlIHNlbGVjdG9ycyBjb25zaXN0IG9mIGFuIGFjY2Vzc2libGUgbmFtZSB0byBxdWVyeSBmb3IgYW5kIG9wdGlvbmFsbHlcbiAqIGZ1cnRoZXIgYXJpYSBhdHRyaWJ1dGVzIG9uIHRoZSBmb3JtIGBbPGF0dHJpYnV0ZT49PHZhbHVlPl1gLlxuICogQ3VycmVudGx5LCB3ZSBvbmx5IHN1cHBvcnQgdGhlIGBuYW1lYCBhbmQgYHJvbGVgIGF0dHJpYnV0ZS5cbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvd2Nhc2UgaG93IHRoZSBzeW50YXggd29ya3Mgd3J0LiBxdWVyeWluZzpcbiAqXG4gKiAtICd0aXRsZVtyb2xlPVwiaGVhZGluZ1wiXScgcXVlcmllcyBmb3IgZWxlbWVudHMgd2l0aCBuYW1lICd0aXRsZScgYW5kIHJvbGUgJ2hlYWRpbmcnLlxuICogLSAnW3JvbGU9XCJpbWFnZVwiXScgcXVlcmllcyBmb3IgZWxlbWVudHMgd2l0aCByb2xlICdpbWFnZScgYW5kIGFueSBuYW1lLlxuICogLSAnbGFiZWwnIHF1ZXJpZXMgZm9yIGVsZW1lbnRzIHdpdGggbmFtZSAnbGFiZWwnIGFuZCBhbnkgcm9sZS5cbiAqIC0gJ1tuYW1lPVwiXCJdW3JvbGU9XCJidXR0b25cIl0nIHF1ZXJpZXMgZm9yIGVsZW1lbnRzIHdpdGggbm8gbmFtZSBhbmQgcm9sZSAnYnV0dG9uJy5cbiAqL1xuY29uc3QgQVRUUklCVVRFX1JFR0VYUCA9IC9cXFtcXHMqKD88YXR0cmlidXRlPlxcdyspXFxzKj1cXHMqKD88cXVvdGU+XCJ8JykoPzx2YWx1ZT5cXFxcLnwuKj8oPz1cXGs8cXVvdGU+KSlcXGs8cXVvdGU+XFxzKlxcXS9nO1xuY29uc3QgcGFyc2VBUklBU2VsZWN0b3IgPSAoc2VsZWN0b3IpID0+IHtcbiAgICBjb25zdCBxdWVyeU9wdGlvbnMgPSB7fTtcbiAgICBjb25zdCBkZWZhdWx0TmFtZSA9IHNlbGVjdG9yLnJlcGxhY2UoQVRUUklCVVRFX1JFR0VYUCwgKF8sIGF0dHJpYnV0ZSwgX18sIHZhbHVlKSA9PiB7XG4gICAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS50cmltKCk7XG4gICAgICAgIGFzc2VydChpc0tub3duQXR0cmlidXRlKGF0dHJpYnV0ZSksIGBVbmtub3duIGFyaWEgYXR0cmlidXRlIFwiJHthdHRyaWJ1dGV9XCIgaW4gc2VsZWN0b3JgKTtcbiAgICAgICAgcXVlcnlPcHRpb25zW2F0dHJpYnV0ZV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcbiAgICBpZiAoZGVmYXVsdE5hbWUgJiYgIXF1ZXJ5T3B0aW9ucy5uYW1lKSB7XG4gICAgICAgIHF1ZXJ5T3B0aW9ucy5uYW1lID0gbm9ybWFsaXplVmFsdWUoZGVmYXVsdE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gcXVlcnlPcHRpb25zO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBBUklBUXVlcnlIYW5kbGVyIGV4dGVuZHMgUXVlcnlIYW5kbGVyIHtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvciA9IGFzeW5jIChub2RlLCBzZWxlY3RvciwgeyBhcmlhUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBhcmlhUXVlcnlTZWxlY3Rvcihub2RlLCBzZWxlY3Rvcik7XG4gICAgfTtcbiAgICBzdGF0aWMgYXN5bmMgKnF1ZXJ5QWxsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgcm9sZSB9ID0gcGFyc2VBUklBU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICB5aWVsZCogZWxlbWVudC5xdWVyeUFYVHJlZShuYW1lLCByb2xlKTtcbiAgICB9XG4gICAgc3RhdGljIHF1ZXJ5T25lID0gYXN5bmMgKGVsZW1lbnQsIHNlbGVjdG9yKSA9PiB7XG4gICAgICAgIHJldHVybiAoKGF3YWl0IEFzeW5jSXRlcmFibGVVdGlsLmZpcnN0KHRoaXMucXVlcnlBbGwoZWxlbWVudCwgc2VsZWN0b3IpKSkgPz8gbnVsbCk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFyaWFRdWVyeUhhbmRsZXIuanMubWFwIiwidmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBKU0hhbmRsZSB9IGZyb20gJy4uL2FwaS9KU0hhbmRsZS5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IGlzRXJyb3JMaWtlIH0gZnJvbSAnLi4vdXRpbC9FcnJvckxpa2UuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEJpbmRpbmcge1xuICAgICNuYW1lO1xuICAgICNmbjtcbiAgICAjaW5pdFNvdXJjZTtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBmbiwgaW5pdFNvdXJjZSkge1xuICAgICAgICB0aGlzLiNuYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy4jZm4gPSBmbjtcbiAgICAgICAgdGhpcy4jaW5pdFNvdXJjZSA9IGluaXRTb3VyY2U7XG4gICAgfVxuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbmFtZTtcbiAgICB9XG4gICAgZ2V0IGluaXRTb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpbml0U291cmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29udGV4dCAtIENvbnRleHQgdG8gcnVuIHRoZSBiaW5kaW5nIGluOyB0aGUgY29udGV4dCBzaG91bGQgaGF2ZVxuICAgICAqIHRoZSBiaW5kaW5nIGFkZGVkIHRvIGl0IGJlZm9yZWhhbmQuXG4gICAgICogQHBhcmFtIGlkIC0gSUQgb2YgdGhlIGNhbGwuIFRoaXMgc2hvdWxkIGNvbWUgZnJvbSB0aGUgQ0RQXG4gICAgICogYG9uQmluZGluZ0NhbGxlZGAgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIGFyZ3MgLSBQbGFpbiBhcmd1bWVudHMgZnJvbSBDRFAuXG4gICAgICovXG4gICAgYXN5bmMgcnVuKGNvbnRleHQsIGlkLCBhcmdzLCBpc1RyaXZpYWwpIHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWlzVHJpdmlhbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldHRpbmcgbm9uLXRyaXZpYWwgYXJndW1lbnRzLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVzID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IGNvbnRleHQuZXZhbHVhdGVIYW5kbGUoKG5hbWUsIHNlcSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBDb2RlIGlzIGV2YWx1YXRlZCBpbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFRoaXNbbmFtZV0uYXJncy5nZXQoc2VxKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy4jbmFtZSwgaWQpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBhd2FpdCBoYW5kbGVzLmdldFByb3BlcnRpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGhhbmRsZV0gb2YgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3Qgc3RyYWlnaHQtZm9yd2FyZCBzaW5jZSBzb21lIGFyZ3VtZW50cyBjYW4gc3RyaW5naWZ5LCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZW4ndCBwbGFpbiBvYmplY3RzIHNvIGFkZCBzdWJ0eXBlcyB3aGVuIHRoZSB1c2UtY2FzZSBhcmlzZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggaW4gYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaGFuZGxlLnJlbW90ZU9iamVjdCgpLnN1YnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbm9kZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWytpbmRleF0gPSBoYW5kbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnVzZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnVzZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5ldmFsdWF0ZSgobmFtZSwgc2VxLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIENvZGUgaXMgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gZ2xvYmFsVGhpc1tuYW1lXS5jYWxsYmFja3M7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzLmdldChzZXEpLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICBjYWxsYmFja3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICB9LCB0aGlzLiNuYW1lLCBpZCwgYXdhaXQgdGhpcy4jZm4oLi4uYXJncykpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBKU0hhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFjay51c2UoYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dFxuICAgICAgICAgICAgICAgICAgICAuZXZhbHVhdGUoKG5hbWUsIHNlcSwgbWVzc2FnZSwgc3RhY2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnN0YWNrID0gc3RhY2s7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgQ29kZSBpcyBldmFsdWF0ZWQgaW4gYSBkaWZmZXJlbnQgY29udGV4dC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gZ2xvYmFsVGhpc1tuYW1lXS5jYWxsYmFja3M7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5nZXQoc2VxKS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcy4jbmFtZSwgaWQsIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5ldmFsdWF0ZSgobmFtZSwgc2VxLCBlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIENvZGUgaXMgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGdsb2JhbFRoaXNbbmFtZV0uY2FsbGJhY2tzO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZ2V0KHNlcSkucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmRlbGV0ZShzZXEpO1xuICAgICAgICAgICAgICAgIH0sIHRoaXMuI25hbWUsIGlkLCBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmluZGluZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQnJvd3NlciBhcyBCcm93c2VyQmFzZSwgfSBmcm9tICcuLi9hcGkvQnJvd3Nlci5qcyc7XG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBDZHBCcm93c2VyQ29udGV4dCB9IGZyb20gJy4vQnJvd3NlckNvbnRleHQuanMnO1xuaW1wb3J0IHsgQ2hyb21lVGFyZ2V0TWFuYWdlciB9IGZyb20gJy4vQ2hyb21lVGFyZ2V0TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBGaXJlZm94VGFyZ2V0TWFuYWdlciB9IGZyb20gJy4vRmlyZWZveFRhcmdldE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRGV2VG9vbHNUYXJnZXQsIEluaXRpYWxpemF0aW9uU3RhdHVzLCBPdGhlclRhcmdldCwgUGFnZVRhcmdldCwgV29ya2VyVGFyZ2V0LCB9IGZyb20gJy4vVGFyZ2V0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBCcm93c2VyIGV4dGVuZHMgQnJvd3NlckJhc2Uge1xuICAgIHByb3RvY29sID0gJ2NkcCc7XG4gICAgc3RhdGljIGFzeW5jIF9jcmVhdGUocHJvZHVjdCwgY29ubmVjdGlvbiwgY29udGV4dElkcywgaWdub3JlSFRUUFNFcnJvcnMsIGRlZmF1bHRWaWV3cG9ydCwgcHJvY2VzcywgY2xvc2VDYWxsYmFjaywgdGFyZ2V0RmlsdGVyQ2FsbGJhY2ssIGlzUGFnZVRhcmdldENhbGxiYWNrLCB3YWl0Rm9ySW5pdGlhbGx5RGlzY292ZXJlZFRhcmdldHMgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXIgPSBuZXcgQ2RwQnJvd3Nlcihwcm9kdWN0LCBjb25uZWN0aW9uLCBjb250ZXh0SWRzLCBkZWZhdWx0Vmlld3BvcnQsIHByb2Nlc3MsIGNsb3NlQ2FsbGJhY2ssIHRhcmdldEZpbHRlckNhbGxiYWNrLCBpc1BhZ2VUYXJnZXRDYWxsYmFjaywgd2FpdEZvckluaXRpYWxseURpc2NvdmVyZWRUYXJnZXRzKTtcbiAgICAgICAgaWYgKGlnbm9yZUhUVFBTRXJyb3JzKSB7XG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1NlY3VyaXR5LnNldElnbm9yZUNlcnRpZmljYXRlRXJyb3JzJywge1xuICAgICAgICAgICAgICAgIGlnbm9yZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGJyb3dzZXIuX2F0dGFjaCgpO1xuICAgICAgICByZXR1cm4gYnJvd3NlcjtcbiAgICB9XG4gICAgI2RlZmF1bHRWaWV3cG9ydDtcbiAgICAjcHJvY2VzcztcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjY2xvc2VDYWxsYmFjaztcbiAgICAjdGFyZ2V0RmlsdGVyQ2FsbGJhY2s7XG4gICAgI2lzUGFnZVRhcmdldENhbGxiYWNrO1xuICAgICNkZWZhdWx0Q29udGV4dDtcbiAgICAjY29udGV4dHMgPSBuZXcgTWFwKCk7XG4gICAgI3RhcmdldE1hbmFnZXI7XG4gICAgY29uc3RydWN0b3IocHJvZHVjdCwgY29ubmVjdGlvbiwgY29udGV4dElkcywgZGVmYXVsdFZpZXdwb3J0LCBwcm9jZXNzLCBjbG9zZUNhbGxiYWNrLCB0YXJnZXRGaWx0ZXJDYWxsYmFjaywgaXNQYWdlVGFyZ2V0Q2FsbGJhY2ssIHdhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cyA9IHRydWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgfHwgJ2Nocm9tZSc7XG4gICAgICAgIHRoaXMuI2RlZmF1bHRWaWV3cG9ydCA9IGRlZmF1bHRWaWV3cG9ydDtcbiAgICAgICAgdGhpcy4jcHJvY2VzcyA9IHByb2Nlc3M7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLiNjbG9zZUNhbGxiYWNrID0gY2xvc2VDYWxsYmFjayB8fCAoKCkgPT4geyB9KTtcbiAgICAgICAgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2sgPVxuICAgICAgICAgICAgdGFyZ2V0RmlsdGVyQ2FsbGJhY2sgfHxcbiAgICAgICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jc2V0SXNQYWdlVGFyZ2V0Q2FsbGJhY2soaXNQYWdlVGFyZ2V0Q2FsbGJhY2spO1xuICAgICAgICBpZiAocHJvZHVjdCA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyID0gbmV3IEZpcmVmb3hUYXJnZXRNYW5hZ2VyKGNvbm5lY3Rpb24sIHRoaXMuI2NyZWF0ZVRhcmdldCwgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jdGFyZ2V0TWFuYWdlciA9IG5ldyBDaHJvbWVUYXJnZXRNYW5hZ2VyKGNvbm5lY3Rpb24sIHRoaXMuI2NyZWF0ZVRhcmdldCwgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2ssIHdhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGVmYXVsdENvbnRleHQgPSBuZXcgQ2RwQnJvd3NlckNvbnRleHQodGhpcy4jY29ubmVjdGlvbiwgdGhpcyk7XG4gICAgICAgIGZvciAoY29uc3QgY29udGV4dElkIG9mIGNvbnRleHRJZHMpIHtcbiAgICAgICAgICAgIHRoaXMuI2NvbnRleHRzLnNldChjb250ZXh0SWQsIG5ldyBDZHBCcm93c2VyQ29udGV4dCh0aGlzLiNjb25uZWN0aW9uLCB0aGlzLCBjb250ZXh0SWQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjZW1pdERpc2Nvbm5lY3RlZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KFwiZGlzY29ubmVjdGVkXCIgLyogQnJvd3NlckV2ZW50LkRpc2Nvbm5lY3RlZCAqLywgdW5kZWZpbmVkKTtcbiAgICB9O1xuICAgIGFzeW5jIF9hdHRhY2goKSB7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24ub24oQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgdGhpcy4jZW1pdERpc2Nvbm5lY3RlZCk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0aGlzLiNvbkF0dGFjaGVkVG9UYXJnZXQpO1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLm9uKFwidGFyZ2V0R29uZVwiIC8qIFRhcmdldE1hbmFnZXJFdmVudC5UYXJnZXRHb25lICovLCB0aGlzLiNvbkRldGFjaGVkRnJvbVRhcmdldCk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXRDaGFuZ2VkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldENoYW5nZWQgKi8sIHRoaXMuI29uVGFyZ2V0Q2hhbmdlZCk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXREaXNjb3ZlcmVkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldERpc2NvdmVyZWQgKi8sIHRoaXMuI29uVGFyZ2V0RGlzY292ZXJlZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuI3RhcmdldE1hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgICBfZGV0YWNoKCkge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZihDRFBTZXNzaW9uRXZlbnQuRGlzY29ubmVjdGVkLCB0aGlzLiNlbWl0RGlzY29ubmVjdGVkKTtcbiAgICAgICAgdGhpcy4jdGFyZ2V0TWFuYWdlci5vZmYoXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0aGlzLiNvbkF0dGFjaGVkVG9UYXJnZXQpO1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLm9mZihcInRhcmdldEdvbmVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0R29uZSAqLywgdGhpcy4jb25EZXRhY2hlZEZyb21UYXJnZXQpO1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLm9mZihcInRhcmdldENoYW5nZWRcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0Q2hhbmdlZCAqLywgdGhpcy4jb25UYXJnZXRDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy4jdGFyZ2V0TWFuYWdlci5vZmYoXCJ0YXJnZXREaXNjb3ZlcmVkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldERpc2NvdmVyZWQgKi8sIHRoaXMuI29uVGFyZ2V0RGlzY292ZXJlZCk7XG4gICAgfVxuICAgIHByb2Nlc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9jZXNzID8/IG51bGw7XG4gICAgfVxuICAgIF90YXJnZXRNYW5hZ2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFyZ2V0TWFuYWdlcjtcbiAgICB9XG4gICAgI3NldElzUGFnZVRhcmdldENhbGxiYWNrKGlzUGFnZVRhcmdldENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuI2lzUGFnZVRhcmdldENhbGxiYWNrID1cbiAgICAgICAgICAgIGlzUGFnZVRhcmdldENhbGxiYWNrIHx8XG4gICAgICAgICAgICAgICAgKCh0YXJnZXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0YXJnZXQudHlwZSgpID09PSAncGFnZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC50eXBlKCkgPT09ICdiYWNrZ3JvdW5kX3BhZ2UnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQudHlwZSgpID09PSAnd2VidmlldycpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0SXNQYWdlVGFyZ2V0Q2FsbGJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc1BhZ2VUYXJnZXRDYWxsYmFjaztcbiAgICB9XG4gICAgYXN5bmMgY3JlYXRlQnJvd3NlckNvbnRleHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgcHJveHlTZXJ2ZXIsIHByb3h5QnlwYXNzTGlzdCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgeyBicm93c2VyQ29udGV4dElkIH0gPSBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5jcmVhdGVCcm93c2VyQ29udGV4dCcsIHtcbiAgICAgICAgICAgIHByb3h5U2VydmVyLFxuICAgICAgICAgICAgcHJveHlCeXBhc3NMaXN0OiBwcm94eUJ5cGFzc0xpc3QgJiYgcHJveHlCeXBhc3NMaXN0LmpvaW4oJywnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgQ2RwQnJvd3NlckNvbnRleHQodGhpcy4jY29ubmVjdGlvbiwgdGhpcywgYnJvd3NlckNvbnRleHRJZCk7XG4gICAgICAgIHRoaXMuI2NvbnRleHRzLnNldChicm93c2VyQ29udGV4dElkLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuICAgIGJyb3dzZXJDb250ZXh0cygpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLiNkZWZhdWx0Q29udGV4dCwgLi4uQXJyYXkuZnJvbSh0aGlzLiNjb250ZXh0cy52YWx1ZXMoKSldO1xuICAgIH1cbiAgICBkZWZhdWx0QnJvd3NlckNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0Q29udGV4dDtcbiAgICB9XG4gICAgYXN5bmMgX2Rpc3Bvc2VDb250ZXh0KGNvbnRleHRJZCkge1xuICAgICAgICBpZiAoIWNvbnRleHRJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LmRpc3Bvc2VCcm93c2VyQ29udGV4dCcsIHtcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IGNvbnRleHRJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2NvbnRleHRzLmRlbGV0ZShjb250ZXh0SWQpO1xuICAgIH1cbiAgICAjY3JlYXRlVGFyZ2V0ID0gKHRhcmdldEluZm8sIHNlc3Npb24pID0+IHtcbiAgICAgICAgY29uc3QgeyBicm93c2VyQ29udGV4dElkIH0gPSB0YXJnZXRJbmZvO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gYnJvd3NlckNvbnRleHRJZCAmJiB0aGlzLiNjb250ZXh0cy5oYXMoYnJvd3NlckNvbnRleHRJZClcbiAgICAgICAgICAgID8gdGhpcy4jY29udGV4dHMuZ2V0KGJyb3dzZXJDb250ZXh0SWQpXG4gICAgICAgICAgICA6IHRoaXMuI2RlZmF1bHRDb250ZXh0O1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBicm93c2VyIGNvbnRleHQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjcmVhdGVTZXNzaW9uID0gKGlzQXV0b0F0dGFjaEVtdWxhdGVkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jY29ubmVjdGlvbi5fY3JlYXRlU2Vzc2lvbih0YXJnZXRJbmZvLCBpc0F1dG9BdHRhY2hFbXVsYXRlZCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gbmV3IE90aGVyVGFyZ2V0KHRhcmdldEluZm8sIHNlc3Npb24sIGNvbnRleHQsIHRoaXMuI3RhcmdldE1hbmFnZXIsIGNyZWF0ZVNlc3Npb24pO1xuICAgICAgICBpZiAodGFyZ2V0SW5mby51cmw/LnN0YXJ0c1dpdGgoJ2RldnRvb2xzOi8vJykpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGV2VG9vbHNUYXJnZXQodGFyZ2V0SW5mbywgc2Vzc2lvbiwgY29udGV4dCwgdGhpcy4jdGFyZ2V0TWFuYWdlciwgY3JlYXRlU2Vzc2lvbiwgdGhpcy4jZGVmYXVsdFZpZXdwb3J0ID8/IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNpc1BhZ2VUYXJnZXRDYWxsYmFjayhvdGhlclRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFnZVRhcmdldCh0YXJnZXRJbmZvLCBzZXNzaW9uLCBjb250ZXh0LCB0aGlzLiN0YXJnZXRNYW5hZ2VyLCBjcmVhdGVTZXNzaW9uLCB0aGlzLiNkZWZhdWx0Vmlld3BvcnQgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldEluZm8udHlwZSA9PT0gJ3NlcnZpY2Vfd29ya2VyJyB8fFxuICAgICAgICAgICAgdGFyZ2V0SW5mby50eXBlID09PSAnc2hhcmVkX3dvcmtlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgV29ya2VyVGFyZ2V0KHRhcmdldEluZm8sIHNlc3Npb24sIGNvbnRleHQsIHRoaXMuI3RhcmdldE1hbmFnZXIsIGNyZWF0ZVNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdGhlclRhcmdldDtcbiAgICB9O1xuICAgICNvbkF0dGFjaGVkVG9UYXJnZXQgPSBhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgIGlmICh0YXJnZXQuX2lzVGFyZ2V0RXhwb3NlZCgpICYmXG4gICAgICAgICAgICAoYXdhaXQgdGFyZ2V0Ll9pbml0aWFsaXplZERlZmVycmVkLnZhbHVlT3JUaHJvdygpKSA9PT1cbiAgICAgICAgICAgICAgICBJbml0aWFsaXphdGlvblN0YXR1cy5TVUNDRVNTKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRjcmVhdGVkXCIgLyogQnJvd3NlckV2ZW50LlRhcmdldENyZWF0ZWQgKi8sIHRhcmdldCk7XG4gICAgICAgICAgICB0YXJnZXQuYnJvd3NlckNvbnRleHQoKS5lbWl0KFwidGFyZ2V0Y3JlYXRlZFwiIC8qIEJyb3dzZXJDb250ZXh0RXZlbnQuVGFyZ2V0Q3JlYXRlZCAqLywgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgI29uRGV0YWNoZWRGcm9tVGFyZ2V0ID0gYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgICB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQucmVzb2x2ZShJbml0aWFsaXphdGlvblN0YXR1cy5BQk9SVEVEKTtcbiAgICAgICAgdGFyZ2V0Ll9pc0Nsb3NlZERlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgICAgaWYgKHRhcmdldC5faXNUYXJnZXRFeHBvc2VkKCkgJiZcbiAgICAgICAgICAgIChhd2FpdCB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQudmFsdWVPclRocm93KCkpID09PVxuICAgICAgICAgICAgICAgIEluaXRpYWxpemF0aW9uU3RhdHVzLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldGRlc3Ryb3llZFwiIC8qIEJyb3dzZXJFdmVudC5UYXJnZXREZXN0cm95ZWQgKi8sIHRhcmdldCk7XG4gICAgICAgICAgICB0YXJnZXQuYnJvd3NlckNvbnRleHQoKS5lbWl0KFwidGFyZ2V0ZGVzdHJveWVkXCIgLyogQnJvd3NlckNvbnRleHRFdmVudC5UYXJnZXREZXN0cm95ZWQgKi8sIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgICNvblRhcmdldENoYW5nZWQgPSAoeyB0YXJnZXQgfSkgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRjaGFuZ2VkXCIgLyogQnJvd3NlckV2ZW50LlRhcmdldENoYW5nZWQgKi8sIHRhcmdldCk7XG4gICAgICAgIHRhcmdldC5icm93c2VyQ29udGV4dCgpLmVtaXQoXCJ0YXJnZXRjaGFuZ2VkXCIgLyogQnJvd3NlckNvbnRleHRFdmVudC5UYXJnZXRDaGFuZ2VkICovLCB0YXJnZXQpO1xuICAgIH07XG4gICAgI29uVGFyZ2V0RGlzY292ZXJlZCA9ICh0YXJnZXRJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdChcInRhcmdldGRpc2NvdmVyZWRcIiAvKiBCcm93c2VyRXZlbnQuVGFyZ2V0RGlzY292ZXJlZCAqLywgdGFyZ2V0SW5mbyk7XG4gICAgfTtcbiAgICB3c0VuZHBvaW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY29ubmVjdGlvbi51cmwoKTtcbiAgICB9XG4gICAgYXN5bmMgbmV3UGFnZSgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2RlZmF1bHRDb250ZXh0Lm5ld1BhZ2UoKTtcbiAgICB9XG4gICAgYXN5bmMgX2NyZWF0ZVBhZ2VJbkNvbnRleHQoY29udGV4dElkKSB7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0SWQgfSA9IGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LmNyZWF0ZVRhcmdldCcsIHtcbiAgICAgICAgICAgIHVybDogJ2Fib3V0OmJsYW5rJyxcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IGNvbnRleHRJZCB8fCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSAoYXdhaXQgdGhpcy53YWl0Rm9yVGFyZ2V0KHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHQuX3RhcmdldElkID09PSB0YXJnZXRJZDtcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHRhcmdldCBmb3IgcGFnZSAoaWQgPSAke3RhcmdldElkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbml0aWFsaXplZCA9IChhd2FpdCB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQudmFsdWVPclRocm93KCkpID09PVxuICAgICAgICAgICAgSW5pdGlhbGl6YXRpb25TdGF0dXMuU1VDQ0VTUztcbiAgICAgICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHRhcmdldCBmb3IgcGFnZSAoaWQgPSAke3RhcmdldElkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGFyZ2V0LnBhZ2UoKTtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgYSBwYWdlIGZvciBjb250ZXh0IChpZCA9ICR7Y29udGV4dElkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICB9XG4gICAgdGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy4jdGFyZ2V0TWFuYWdlci5nZXRBdmFpbGFibGVUYXJnZXRzKCkudmFsdWVzKCkpLmZpbHRlcih0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICh0YXJnZXQuX2lzVGFyZ2V0RXhwb3NlZCgpICYmXG4gICAgICAgICAgICAgICAgdGFyZ2V0Ll9pbml0aWFsaXplZERlZmVycmVkLnZhbHVlKCkgPT09IEluaXRpYWxpemF0aW9uU3RhdHVzLlNVQ0NFU1MpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGFyZ2V0KCkge1xuICAgICAgICBjb25zdCBicm93c2VyVGFyZ2V0ID0gdGhpcy50YXJnZXRzKCkuZmluZCh0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC50eXBlKCkgPT09ICdicm93c2VyJztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghYnJvd3NlclRhcmdldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyIHRhcmdldCBpcyBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnJvd3NlclRhcmdldDtcbiAgICB9XG4gICAgYXN5bmMgdmVyc2lvbigpIHtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IHRoaXMuI2dldFZlcnNpb24oKTtcbiAgICAgICAgcmV0dXJuIHZlcnNpb24ucHJvZHVjdDtcbiAgICB9XG4gICAgYXN5bmMgdXNlckFnZW50KCkge1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgdGhpcy4jZ2V0VmVyc2lvbigpO1xuICAgICAgICByZXR1cm4gdmVyc2lvbi51c2VyQWdlbnQ7XG4gICAgfVxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjbG9zZUNhbGxiYWNrLmNhbGwobnVsbCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuX2RldGFjaCgpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGdldCBjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy4jY29ubmVjdGlvbi5fY2xvc2VkO1xuICAgIH1cbiAgICAjZ2V0VmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnQnJvd3Nlci5nZXRWZXJzaW9uJyk7XG4gICAgfVxuICAgIGdldCBkZWJ1Z0luZm8oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwZW5kaW5nUHJvdG9jb2xFcnJvcnM6IHRoaXMuI2Nvbm5lY3Rpb24uZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCksXG4gICAgICAgIH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3Nlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgZGVidWdFcnJvciwgREVGQVVMVF9WSUVXUE9SVCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IENkcEJyb3dzZXIgfSBmcm9tICcuL0Jyb3dzZXIuanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gJy4vQ29ubmVjdGlvbi5qcyc7XG4vKipcbiAqIFVzZXJzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgZGlyZWN0bHk7IGl0J3MgY2FsbGVkIHdoZW4gY2FsbGluZ1xuICogYHB1cHBldGVlci5jb25uZWN0YCB3aXRoIGBwcm90b2NvbDogJ2NkcCdgLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2Nvbm5lY3RUb0NkcEJyb3dzZXIoY29ubmVjdGlvblRyYW5zcG9ydCwgdXJsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyBpZ25vcmVIVFRQU0Vycm9ycyA9IGZhbHNlLCBkZWZhdWx0Vmlld3BvcnQgPSBERUZBVUxUX1ZJRVdQT1JULCB0YXJnZXRGaWx0ZXIsIF9pc1BhZ2VUYXJnZXQ6IGlzUGFnZVRhcmdldCwgc2xvd01vID0gMCwgcHJvdG9jb2xUaW1lb3V0LCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24odXJsLCBjb25uZWN0aW9uVHJhbnNwb3J0LCBzbG93TW8sIHByb3RvY29sVGltZW91dCk7XG4gICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnQnJvd3Nlci5nZXRWZXJzaW9uJyk7XG4gICAgY29uc3QgcHJvZHVjdCA9IHZlcnNpb24ucHJvZHVjdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdmaXJlZm94JylcbiAgICAgICAgPyAnZmlyZWZveCdcbiAgICAgICAgOiAnY2hyb21lJztcbiAgICBjb25zdCB7IGJyb3dzZXJDb250ZXh0SWRzIH0gPSBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5nZXRCcm93c2VyQ29udGV4dHMnKTtcbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgQ2RwQnJvd3Nlci5fY3JlYXRlKHByb2R1Y3QgfHwgJ2Nocm9tZScsIGNvbm5lY3Rpb24sIGJyb3dzZXJDb250ZXh0SWRzLCBpZ25vcmVIVFRQU0Vycm9ycywgZGVmYXVsdFZpZXdwb3J0LCB1bmRlZmluZWQsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uc2VuZCgnQnJvd3Nlci5jbG9zZScpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgIH0sIHRhcmdldEZpbHRlciwgaXNQYWdlVGFyZ2V0KTtcbiAgICByZXR1cm4gYnJvd3Nlcjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJDb25uZWN0b3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjQgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBXRUJfUEVSTUlTU0lPTl9UT19QUk9UT0NPTF9QRVJNSVNTSU9OLCB9IGZyb20gJy4uL2FwaS9Ccm93c2VyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJDb250ZXh0IH0gZnJvbSAnLi4vYXBpL0Jyb3dzZXJDb250ZXh0LmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBCcm93c2VyQ29udGV4dCBleHRlbmRzIEJyb3dzZXJDb250ZXh0IHtcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjYnJvd3NlcjtcbiAgICAjaWQ7XG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbiwgYnJvd3NlciwgY29udGV4dElkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLiNicm93c2VyID0gYnJvd3NlcjtcbiAgICAgICAgdGhpcy4jaWQgPSBjb250ZXh0SWQ7XG4gICAgfVxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lkO1xuICAgIH1cbiAgICB0YXJnZXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3Nlci50YXJnZXRzKCkuZmlsdGVyKHRhcmdldCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmJyb3dzZXJDb250ZXh0KCkgPT09IHRoaXM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBwYWdlcygpIHtcbiAgICAgICAgY29uc3QgcGFnZXMgPSBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnRhcmdldHMoKVxuICAgICAgICAgICAgLmZpbHRlcih0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICh0YXJnZXQudHlwZSgpID09PSAncGFnZScgfHxcbiAgICAgICAgICAgICAgICAodGFyZ2V0LnR5cGUoKSA9PT0gJ290aGVyJyAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNicm93c2VyLl9nZXRJc1BhZ2VUYXJnZXRDYWxsYmFjaygpPy4odGFyZ2V0KSkpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLm1hcCh0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5wYWdlKCk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgcmV0dXJuIHBhZ2VzLmZpbHRlcigocGFnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICEhcGFnZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlzSW5jb2duaXRvKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLiNpZDtcbiAgICB9XG4gICAgYXN5bmMgb3ZlcnJpZGVQZXJtaXNzaW9ucyhvcmlnaW4sIHBlcm1pc3Npb25zKSB7XG4gICAgICAgIGNvbnN0IHByb3RvY29sUGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucy5tYXAocGVybWlzc2lvbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm90b2NvbFBlcm1pc3Npb24gPSBXRUJfUEVSTUlTU0lPTl9UT19QUk9UT0NPTF9QRVJNSVNTSU9OLmdldChwZXJtaXNzaW9uKTtcbiAgICAgICAgICAgIGlmICghcHJvdG9jb2xQZXJtaXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHBlcm1pc3Npb246ICcgKyBwZXJtaXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm90b2NvbFBlcm1pc3Npb247XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ0Jyb3dzZXIuZ3JhbnRQZXJtaXNzaW9ucycsIHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IHRoaXMuI2lkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBwcm90b2NvbFBlcm1pc3Npb25zLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgY2xlYXJQZXJtaXNzaW9uT3ZlcnJpZGVzKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ0Jyb3dzZXIucmVzZXRQZXJtaXNzaW9ucycsIHtcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IHRoaXMuI2lkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIG5ld1BhZ2UoKSB7XG4gICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgX2d1YXJkID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHRoaXMud2FpdEZvclNjcmVlbnNob3RPcGVyYXRpb25zKCksIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNicm93c2VyLl9jcmVhdGVQYWdlSW5Db250ZXh0KHRoaXMuI2lkKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnJvd3NlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Jyb3dzZXI7XG4gICAgfVxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jaWQsICdOb24taW5jb2duaXRvIHByb2ZpbGVzIGNhbm5vdCBiZSBjbG9zZWQhJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2Jyb3dzZXIuX2Rpc3Bvc2VDb250ZXh0KHRoaXMuI2lkKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyQ29udGV4dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbiwgQ0RQU2Vzc2lvbkV2ZW50LCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IENhbGxiYWNrUmVnaXN0cnkgfSBmcm9tICcuLi9jb21tb24vQ2FsbGJhY2tSZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyBUYXJnZXRDbG9zZUVycm9yIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm90b2NvbEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBDRFBTZXNzaW9uIGV4dGVuZHMgQ0RQU2Vzc2lvbiB7XG4gICAgI3Nlc3Npb25JZDtcbiAgICAjdGFyZ2V0VHlwZTtcbiAgICAjY2FsbGJhY2tzID0gbmV3IENhbGxiYWNrUmVnaXN0cnkoKTtcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjcGFyZW50U2Vzc2lvbklkO1xuICAgICN0YXJnZXQ7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbiwgdGFyZ2V0VHlwZSwgc2Vzc2lvbklkLCBwYXJlbnRTZXNzaW9uSWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIHRoaXMuI3RhcmdldFR5cGUgPSB0YXJnZXRUeXBlO1xuICAgICAgICB0aGlzLiNzZXNzaW9uSWQgPSBzZXNzaW9uSWQ7XG4gICAgICAgIHRoaXMuI3BhcmVudFNlc3Npb25JZCA9IHBhcmVudFNlc3Npb25JZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUge0BsaW5rIENkcFRhcmdldH0gYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3NldFRhcmdldCh0YXJnZXQpIHtcbiAgICAgICAgdGhpcy4jdGFyZ2V0ID0gdGFyZ2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB7QGxpbmsgQ2RwVGFyZ2V0fSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfdGFyZ2V0KCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jdGFyZ2V0LCAnVGFyZ2V0IG11c3QgZXhpc3QnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhcmdldDtcbiAgICB9XG4gICAgY29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Nvbm5lY3Rpb247XG4gICAgfVxuICAgIHBhcmVudFNlc3Npb24oKSB7XG4gICAgICAgIGlmICghdGhpcy4jcGFyZW50U2Vzc2lvbklkKSB7XG4gICAgICAgICAgICAvLyBUbyBtYWtlIGl0IHdvcmsgaW4gRmlyZWZveCB0aGF0IGRvZXMgbm90IGhhdmUgcGFyZW50ICh0YWIpIHNlc3Npb25zLlxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy4jY29ubmVjdGlvbj8uc2Vzc2lvbih0aGlzLiNwYXJlbnRTZXNzaW9uSWQpO1xuICAgICAgICByZXR1cm4gcGFyZW50ID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc2VuZChtZXRob2QsIHBhcmFtcywgb3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuI2Nvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVGFyZ2V0Q2xvc2VFcnJvcihgUHJvdG9jb2wgZXJyb3IgKCR7bWV0aG9kfSk6IFNlc3Npb24gY2xvc2VkLiBNb3N0IGxpa2VseSB0aGUgJHt0aGlzLiN0YXJnZXRUeXBlfSBoYXMgYmVlbiBjbG9zZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNjb25uZWN0aW9uLl9yYXdTZW5kKHRoaXMuI2NhbGxiYWNrcywgbWV0aG9kLCBwYXJhbXMsIHRoaXMuI3Nlc3Npb25JZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbk1lc3NhZ2Uob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QuaWQpIHtcbiAgICAgICAgICAgIGlmIChvYmplY3QuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjYWxsYmFja3MucmVqZWN0KG9iamVjdC5pZCwgY3JlYXRlUHJvdG9jb2xFcnJvck1lc3NhZ2Uob2JqZWN0KSwgb2JqZWN0LmVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY2FsbGJhY2tzLnJlc29sdmUob2JqZWN0LmlkLCBvYmplY3QucmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydCghb2JqZWN0LmlkKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChvYmplY3QubWV0aG9kLCBvYmplY3QucGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXRhY2hlcyB0aGUgY2RwU2Vzc2lvbiBmcm9tIHRoZSB0YXJnZXQuIE9uY2UgZGV0YWNoZWQsIHRoZSBjZHBTZXNzaW9uIG9iamVjdFxuICAgICAqIHdvbid0IGVtaXQgYW55IGV2ZW50cyBhbmQgY2FuJ3QgYmUgdXNlZCB0byBzZW5kIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIGFzeW5jIGRldGFjaCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNjb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlc3Npb24gYWxyZWFkeSBkZXRhY2hlZC4gTW9zdCBsaWtlbHkgdGhlICR7dGhpcy4jdGFyZ2V0VHlwZX0gaGFzIGJlZW4gY2xvc2VkLmApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LmRldGFjaEZyb21UYXJnZXQnLCB7XG4gICAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuI3Nlc3Npb25JZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbkNsb3NlZCgpIHtcbiAgICAgICAgdGhpcy4jY2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZW1pdChDRFBTZXNzaW9uRXZlbnQuRGlzY29ubmVjdGVkLCB1bmRlZmluZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uJ3MgaWQuXG4gICAgICovXG4gICAgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzZXNzaW9uSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldFBlbmRpbmdQcm90b2NvbEVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NhbGxiYWNrcy5nZXRQZW5kaW5nUHJvdG9jb2xFcnJvcnMoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DRFBTZXNzaW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwUHJlbG9hZFNjcmlwdCB7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgSUQgb2YgdGhlIHByZWxvYWQgc2NyaXB0IHJldHVybmVkIGJ5XG4gICAgICogUGFnZS5hZGRTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCBpbiB0aGUgbWFpbiBmcmFtZS5cbiAgICAgKlxuICAgICAqIFN1Yi1mcmFtZXMgd291bGQgZ2V0IGEgZGlmZmVyZW50IENEUCBJRCBiZWNhdXNlXG4gICAgICogYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQgaXMgY2FsbGVkIGZvciBlYWNoIHN1YmZyYW1lLiBCdXRcbiAgICAgKiB1c2VycyBvbmx5IHNlZSB0aGlzIElEIGFuZCBzdWJmcmFtZSBJRHMgYXJlIGludGVybmFsIHRvIFB1cHBldGVlci5cbiAgICAgKi9cbiAgICAjaWQ7XG4gICAgI3NvdXJjZTtcbiAgICAjZnJhbWVUb0lkID0gbmV3IFdlYWtNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihtYWluRnJhbWUsIGlkLCBzb3VyY2UpIHtcbiAgICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICAgICAgdGhpcy4jc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLiNmcmFtZVRvSWQuc2V0KG1haW5GcmFtZSwgaWQpO1xuICAgIH1cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpZDtcbiAgICB9XG4gICAgZ2V0IHNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NvdXJjZTtcbiAgICB9XG4gICAgZ2V0SWRGb3JGcmFtZShmcmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVUb0lkLmdldChmcmFtZSk7XG4gICAgfVxuICAgIHNldElkRm9yRnJhbWUoZnJhbWUsIGlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy4jZnJhbWVUb0lkLnNldChmcmFtZSwgaWRlbnRpZmllcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2RwUHJlbG9hZFNjcmlwdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbiwgQ0RQU2Vzc2lvbkV2ZW50IH0gZnJvbSAnLi4vYXBpL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IENkcFRhcmdldCwgSW5pdGlhbGl6YXRpb25TdGF0dXMgfSBmcm9tICcuL1RhcmdldC5qcyc7XG5mdW5jdGlvbiBpc1BhZ2VUYXJnZXRCZWNvbWluZ1ByaW1hcnkodGFyZ2V0LCBuZXdUYXJnZXRJbmZvKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGFyZ2V0Ll9zdWJ0eXBlKCkpICYmICFuZXdUYXJnZXRJbmZvLnN1YnR5cGU7XG59XG4vKipcbiAqIENocm9tZVRhcmdldE1hbmFnZXIgdXNlcyB0aGUgQ0RQJ3MgYXV0by1hdHRhY2ggbWVjaGFuaXNtIHRvIGludGVyY2VwdFxuICogbmV3IHRhcmdldHMgYW5kIGFsbG93IHRoZSByZXN0IG9mIFB1cHBldGVlciB0byBjb25maWd1cmUgbGlzdGVuZXJzIHdoaWxlXG4gKiB0aGUgdGFyZ2V0IGlzIHBhdXNlZC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENocm9tZVRhcmdldE1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNjb25uZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzOiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnLFxuICAgICAqICdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJywgJ1RhcmdldC50YXJnZXRJbmZvQ2hhbmdlZCcuXG4gICAgICpcbiAgICAgKiBBIHRhcmdldCBiZWNvbWVzIGRpc2NvdmVyZWQgd2hlbiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnIGlzIHJlY2VpdmVkLlxuICAgICAqIEEgdGFyZ2V0IGlzIHJlbW92ZWQgZnJvbSB0aGlzIG1hcCBvbmNlICdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJyBpc1xuICAgICAqIHJlY2VpdmVkLlxuICAgICAqXG4gICAgICogYHRhcmdldEZpbHRlckNhbGxiYWNrYCBoYXMgbm8gZWZmZWN0IG9uIHRoaXMgbWFwLlxuICAgICAqL1xuICAgICNkaXNjb3ZlcmVkVGFyZ2V0c0J5VGFyZ2V0SWQgPSBuZXcgTWFwKCk7XG4gICAgLyoqXG4gICAgICogQSB0YXJnZXQgaXMgYWRkZWQgdG8gdGhpcyBtYXAgb25jZSBDaHJvbWVUYXJnZXRNYW5hZ2VyIGhhcyBjcmVhdGVkXG4gICAgICogYSBUYXJnZXQgYW5kIGF0dGFjaGVkIGF0IGxlYXN0IG9uY2UgdG8gaXQuXG4gICAgICovXG4gICAgI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQgPSBuZXcgTWFwKCk7XG4gICAgLyoqXG4gICAgICogVHJhY2tzIHdoaWNoIHNlc3Npb25zIGF0dGFjaCB0byB3aGljaCB0YXJnZXQuXG4gICAgICovXG4gICAgI2F0dGFjaGVkVGFyZ2V0c0J5U2Vzc2lvbklkID0gbmV3IE1hcCgpO1xuICAgIC8qKlxuICAgICAqIElmIGEgdGFyZ2V0IHdhcyBmaWx0ZXJlZCBvdXQgYnkgYHRhcmdldEZpbHRlckNhbGxiYWNrYCwgd2Ugc3RpbGwgcmVjZWl2ZVxuICAgICAqIGV2ZW50cyBhYm91dCBpdCBmcm9tIENEUCwgYnV0IHdlIGRvbid0IGZvcndhcmQgdGhlbSB0byB0aGUgcmVzdCBvZiBQdXBwZXRlZXIuXG4gICAgICovXG4gICAgI2lnbm9yZWRUYXJnZXRzID0gbmV3IFNldCgpO1xuICAgICN0YXJnZXRGaWx0ZXJDYWxsYmFjaztcbiAgICAjdGFyZ2V0RmFjdG9yeTtcbiAgICAjYXR0YWNoZWRUb1RhcmdldExpc3RlbmVyc0J5U2Vzc2lvbiA9IG5ldyBXZWFrTWFwKCk7XG4gICAgI2RldGFjaGVkRnJvbVRhcmdldExpc3RlbmVyc0J5U2Vzc2lvbiA9IG5ldyBXZWFrTWFwKCk7XG4gICAgI2luaXRpYWxpemVEZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICN0YXJnZXRzSWRzRm9ySW5pdCA9IG5ldyBTZXQoKTtcbiAgICAjd2FpdEZvckluaXRpYWxseURpc2NvdmVyZWRUYXJnZXRzID0gdHJ1ZTtcbiAgICAjZGlzY292ZXJ5RmlsdGVyID0gW3t9XTtcbiAgICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uLCB0YXJnZXRGYWN0b3J5LCB0YXJnZXRGaWx0ZXJDYWxsYmFjaywgd2FpdEZvckluaXRpYWxseURpc2NvdmVyZWRUYXJnZXRzID0gdHJ1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2sgPSB0YXJnZXRGaWx0ZXJDYWxsYmFjaztcbiAgICAgICAgdGhpcy4jdGFyZ2V0RmFjdG9yeSA9IHRhcmdldEZhY3Rvcnk7XG4gICAgICAgIHRoaXMuI3dhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cyA9IHdhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cztcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vbignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKCdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJywgdGhpcy4jb25UYXJnZXREZXN0cm95ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKCdUYXJnZXQudGFyZ2V0SW5mb0NoYW5nZWQnLCB0aGlzLiNvblRhcmdldEluZm9DaGFuZ2VkKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vbihDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCB0aGlzLiNvblNlc3Npb25EZXRhY2hlZCk7XG4gICAgICAgIHRoaXMuI3NldHVwQXR0YWNobWVudExpc3RlbmVycyh0aGlzLiNjb25uZWN0aW9uKTtcbiAgICB9XG4gICAgI3N0b3JlRXhpc3RpbmdUYXJnZXRzRm9ySW5pdCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLiN3YWl0Rm9ySW5pdGlhbGx5RGlzY292ZXJlZFRhcmdldHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFt0YXJnZXRJZCwgdGFyZ2V0SW5mbyxdIG9mIHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEZvckZpbHRlciA9IG5ldyBDZHBUYXJnZXQodGFyZ2V0SW5mbywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRoaXMsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAvLyBUYXJnZXRzIGZyb20gZXh0ZW5zaW9ucyBhbmQgdGhlIGJyb3dzZXIgdGhhdCB3aWxsIG5vdCBiZVxuICAgICAgICAgICAgLy8gYXV0by1hdHRhY2hlZC4gVGhlcmVmb3JlLCB3ZSBzaG91bGQgbm90IGFkZCB0aGVtIHRvXG4gICAgICAgICAgICAvLyAjdGFyZ2V0c0lkc0ZvckluaXQuXG4gICAgICAgICAgICBjb25zdCBza2lwVGFyZ2V0ID0gdGFyZ2V0SW5mby50eXBlID09PSAnYnJvd3NlcicgfHxcbiAgICAgICAgICAgICAgICB0YXJnZXRJbmZvLnVybC5zdGFydHNXaXRoKCdjaHJvbWUtZXh0ZW5zaW9uOi8vJyk7XG4gICAgICAgICAgICBpZiAoKCF0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayB8fFxuICAgICAgICAgICAgICAgIHRoaXMuI3RhcmdldEZpbHRlckNhbGxiYWNrKHRhcmdldEZvckZpbHRlcikpICYmXG4gICAgICAgICAgICAgICAgIXNraXBUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdC5hZGQodGFyZ2V0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBhc3luYyBpbml0aWFsaXplKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5zZXREaXNjb3ZlclRhcmdldHMnLCB7XG4gICAgICAgICAgICBkaXNjb3ZlcjogdHJ1ZSxcbiAgICAgICAgICAgIGZpbHRlcjogdGhpcy4jZGlzY292ZXJ5RmlsdGVyLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jc3RvcmVFeGlzdGluZ1RhcmdldHNGb3JJbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LnNldEF1dG9BdHRhY2gnLCB7XG4gICAgICAgICAgICB3YWl0Rm9yRGVidWdnZXJPblN0YXJ0OiB0cnVlLFxuICAgICAgICAgICAgZmxhdHRlbjogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9BdHRhY2g6IHRydWUsXG4gICAgICAgICAgICBmaWx0ZXI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuI2Rpc2NvdmVyeUZpbHRlcixcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkoKTtcbiAgICAgICAgYXdhaXQgdGhpcy4jaW5pdGlhbGl6ZURlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgIH1cbiAgICBnZXRDaGlsZFRhcmdldHModGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQuX2NoaWxkVGFyZ2V0cygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldERlc3Ryb3llZCcsIHRoaXMuI29uVGFyZ2V0RGVzdHJveWVkKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vZmYoJ1RhcmdldC50YXJnZXRJbmZvQ2hhbmdlZCcsIHRoaXMuI29uVGFyZ2V0SW5mb0NoYW5nZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZihDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCB0aGlzLiNvblNlc3Npb25EZXRhY2hlZCk7XG4gICAgICAgIHRoaXMuI3JlbW92ZUF0dGFjaG1lbnRMaXN0ZW5lcnModGhpcy4jY29ubmVjdGlvbik7XG4gICAgfVxuICAgIGdldEF2YWlsYWJsZVRhcmdldHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkO1xuICAgIH1cbiAgICAjc2V0dXBBdHRhY2htZW50TGlzdGVuZXJzKHNlc3Npb24pIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KHNlc3Npb24sIGV2ZW50KTtcbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSk7XG4gICAgICAgIHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uc2V0KHNlc3Npb24sIGxpc3RlbmVyKTtcbiAgICAgICAgc2Vzc2lvbi5vbignVGFyZ2V0LmF0dGFjaGVkVG9UYXJnZXQnLCBsaXN0ZW5lcik7XG4gICAgICAgIGNvbnN0IGRldGFjaGVkTGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNvbkRldGFjaGVkRnJvbVRhcmdldChzZXNzaW9uLCBldmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIGFzc2VydCghdGhpcy4jZGV0YWNoZWRGcm9tVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSk7XG4gICAgICAgIHRoaXMuI2RldGFjaGVkRnJvbVRhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5zZXQoc2Vzc2lvbiwgZGV0YWNoZWRMaXN0ZW5lcik7XG4gICAgICAgIHNlc3Npb24ub24oJ1RhcmdldC5kZXRhY2hlZEZyb21UYXJnZXQnLCBkZXRhY2hlZExpc3RlbmVyKTtcbiAgICB9XG4gICAgI3JlbW92ZUF0dGFjaG1lbnRMaXN0ZW5lcnMoc2Vzc2lvbikge1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uZ2V0KHNlc3Npb24pO1xuICAgICAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHNlc3Npb24ub2ZmKCdUYXJnZXQuYXR0YWNoZWRUb1RhcmdldCcsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uZGVsZXRlKHNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNkZXRhY2hlZEZyb21UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uaGFzKHNlc3Npb24pKSB7XG4gICAgICAgICAgICBzZXNzaW9uLm9mZignVGFyZ2V0LmRldGFjaGVkRnJvbVRhcmdldCcsIHRoaXMuI2RldGFjaGVkRnJvbVRhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5nZXQoc2Vzc2lvbikpO1xuICAgICAgICAgICAgdGhpcy4jZGV0YWNoZWRGcm9tVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmRlbGV0ZShzZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjb25TZXNzaW9uRGV0YWNoZWQgPSAoc2Vzc2lvbikgPT4ge1xuICAgICAgICB0aGlzLiNyZW1vdmVBdHRhY2htZW50TGlzdGVuZXJzKHNlc3Npb24pO1xuICAgIH07XG4gICAgI29uVGFyZ2V0Q3JlYXRlZCA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLiNkaXNjb3ZlcmVkVGFyZ2V0c0J5VGFyZ2V0SWQuc2V0KGV2ZW50LnRhcmdldEluZm8udGFyZ2V0SWQsIGV2ZW50LnRhcmdldEluZm8pO1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXREaXNjb3ZlcmVkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldERpc2NvdmVyZWQgKi8sIGV2ZW50LnRhcmdldEluZm8pO1xuICAgICAgICAvLyBUaGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZSBicm93c2VyIHRhcmdldCBpbXBsaWNpdGx5LFxuICAgICAgICAvLyB0aGVyZWZvcmUsIG5vIG5ldyBDRFBTZXNzaW9uIGlzIGNyZWF0ZWQgYW5kIHdlIGhhdmUgc3BlY2lhbCBoYW5kbGluZ1xuICAgICAgICAvLyBoZXJlLlxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0SW5mby50eXBlID09PSAnYnJvd3NlcicgJiYgZXZlbnQudGFyZ2V0SW5mby5hdHRhY2hlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuaGFzKGV2ZW50LnRhcmdldEluZm8udGFyZ2V0SWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4jdGFyZ2V0RmFjdG9yeShldmVudC50YXJnZXRJbmZvLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgdGFyZ2V0Ll9pbml0aWFsaXplKCk7XG4gICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLnNldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAjb25UYXJnZXREZXN0cm95ZWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5mbyA9IHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5nZXQoZXZlbnQudGFyZ2V0SWQpO1xuICAgICAgICB0aGlzLiNkaXNjb3ZlcmVkVGFyZ2V0c0J5VGFyZ2V0SWQuZGVsZXRlKGV2ZW50LnRhcmdldElkKTtcbiAgICAgICAgdGhpcy4jZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KGV2ZW50LnRhcmdldElkKTtcbiAgICAgICAgaWYgKHRhcmdldEluZm8/LnR5cGUgPT09ICdzZXJ2aWNlX3dvcmtlcicgJiZcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuaGFzKGV2ZW50LnRhcmdldElkKSkge1xuICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzZXJ2aWNlIHdvcmtlcnM6IHJlcG9ydCBUYXJnZXRHb25lIGV2ZW50IHdoZW5cbiAgICAgICAgICAgIC8vIHRoZSB3b3JrZXIgaXMgZGVzdHJveWVkLlxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4jYXR0YWNoZWRUYXJnZXRzQnlUYXJnZXRJZC5nZXQoZXZlbnQudGFyZ2V0SWQpO1xuICAgICAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldEdvbmVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0R29uZSAqLywgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmRlbGV0ZShldmVudC50YXJnZXRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgICNvblRhcmdldEluZm9DaGFuZ2VkID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5zZXQoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCwgZXZlbnQudGFyZ2V0SW5mbyk7XG4gICAgICAgIGlmICh0aGlzLiNpZ25vcmVkVGFyZ2V0cy5oYXMoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCkgfHxcbiAgICAgICAgICAgICF0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmhhcyhldmVudC50YXJnZXRJbmZvLnRhcmdldElkKSB8fFxuICAgICAgICAgICAgIWV2ZW50LnRhcmdldEluZm8uYXR0YWNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmdldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2aW91c1VSTCA9IHRhcmdldC51cmwoKTtcbiAgICAgICAgY29uc3Qgd2FzSW5pdGlhbGl6ZWQgPSB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQudmFsdWUoKSA9PT0gSW5pdGlhbGl6YXRpb25TdGF0dXMuU1VDQ0VTUztcbiAgICAgICAgaWYgKGlzUGFnZVRhcmdldEJlY29taW5nUHJpbWFyeSh0YXJnZXQsIGV2ZW50LnRhcmdldEluZm8pKSB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gdGFyZ2V0Py5fc2Vzc2lvbigpO1xuICAgICAgICAgICAgYXNzZXJ0KHNlc3Npb24sICdUYXJnZXQgdGhhdCBpcyBiZWluZyBhY3RpdmF0ZWQgaXMgbWlzc2luZyBhIENEUFNlc3Npb24uJyk7XG4gICAgICAgICAgICBzZXNzaW9uLnBhcmVudFNlc3Npb24oKT8uZW1pdChDRFBTZXNzaW9uRXZlbnQuU3dhcHBlZCwgc2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0Ll90YXJnZXRJbmZvQ2hhbmdlZChldmVudC50YXJnZXRJbmZvKTtcbiAgICAgICAgaWYgKHdhc0luaXRpYWxpemVkICYmIHByZXZpb3VzVVJMICE9PSB0YXJnZXQudXJsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldENoYW5nZWRcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0Q2hhbmdlZCAqLywge1xuICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICB3YXNJbml0aWFsaXplZCxcbiAgICAgICAgICAgICAgICBwcmV2aW91c1VSTCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAjb25BdHRhY2hlZFRvVGFyZ2V0ID0gYXN5bmMgKHBhcmVudFNlc3Npb24sIGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZm8gPSBldmVudC50YXJnZXRJbmZvO1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy4jY29ubmVjdGlvbi5zZXNzaW9uKGV2ZW50LnNlc3Npb25JZCk7XG4gICAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXNzaW9uICR7ZXZlbnQuc2Vzc2lvbklkfSB3YXMgbm90IGNyZWF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2lsZW50RGV0YWNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kKCdSdW50aW1lLnJ1bklmV2FpdGluZ0ZvckRlYnVnZ2VyJykuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCB1c2UgYHNlc3Npb24uZGV0YWNoKClgIGJlY2F1c2UgdGhhdCBkaXNwYXRjaGVzIGFsbCBjb21tYW5kcyBvblxuICAgICAgICAgICAgLy8gdGhlIGNvbm5lY3Rpb24gaW5zdGVhZCBvZiB0aGUgcGFyZW50IHNlc3Npb24uXG4gICAgICAgICAgICBhd2FpdCBwYXJlbnRTZXNzaW9uXG4gICAgICAgICAgICAgICAgLnNlbmQoJ1RhcmdldC5kZXRhY2hGcm9tVGFyZ2V0Jywge1xuICAgICAgICAgICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbi5pZCgpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGlmICghdGhpcy4jY29ubmVjdGlvbi5pc0F1dG9BdHRhY2hlZCh0YXJnZXRJbmZvLnRhcmdldElkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3Igc2VydmljZSB3b3JrZXJzOiBiZWluZyBhdHRhY2hlZCB0byBzZXJ2aWNlIHdvcmtlcnMgd2lsbFxuICAgICAgICAvLyBwcmV2ZW50IHRoZW0gZnJvbSBldmVyIGJlaW5nIGRlc3Ryb3llZC4gVGhlcmVmb3JlLCB3ZSBzaWxlbnRseSBkZXRhY2hcbiAgICAgICAgLy8gZnJvbSBzZXJ2aWNlIHdvcmtlcnMgdW5sZXNzIHRoZSBjb25uZWN0aW9uIHdhcyBtYW51YWxseSBjcmVhdGVkIHZpYVxuICAgICAgICAvLyBgcGFnZS53b3JrZXIoKWAuIFRvIGRldGVybWluZSB0aGlzLCB3ZSB1c2VcbiAgICAgICAgLy8gYHRoaXMuI2Nvbm5lY3Rpb24uaXNBdXRvQXR0YWNoZWQodGFyZ2V0SW5mby50YXJnZXRJZClgLiBJbiB0aGUgZnV0dXJlLCB3ZVxuICAgICAgICAvLyBzaG91bGQgZGV0ZXJtaW5lIGlmIGEgdGFyZ2V0IGlzIGF1dG8tYXR0YWNoZWQgb3Igbm90IHdpdGggdGhlIGhlbHAgb2ZcbiAgICAgICAgLy8gQ0RQLlxuICAgICAgICBpZiAodGFyZ2V0SW5mby50eXBlID09PSAnc2VydmljZV93b3JrZXInKSB7XG4gICAgICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgICAgICBhd2FpdCBzaWxlbnREZXRhY2goKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmhhcyh0YXJnZXRJbmZvLnRhcmdldElkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI3RhcmdldEZhY3RvcnkodGFyZ2V0SW5mbyk7XG4gICAgICAgICAgICB0YXJnZXQuX2luaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuc2V0KHRhcmdldEluZm8udGFyZ2V0SWQsIHRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0YXJnZXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzRXhpc3RpbmdUYXJnZXQgPSB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmhhcyh0YXJnZXRJbmZvLnRhcmdldElkKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNFeGlzdGluZ1RhcmdldFxuICAgICAgICAgICAgPyB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmdldCh0YXJnZXRJbmZvLnRhcmdldElkKVxuICAgICAgICAgICAgOiB0aGlzLiN0YXJnZXRGYWN0b3J5KHRhcmdldEluZm8sIHNlc3Npb24sIHBhcmVudFNlc3Npb24gaW5zdGFuY2VvZiBDRFBTZXNzaW9uID8gcGFyZW50U2Vzc2lvbiA6IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayAmJiAhdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2sodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhpcy4jaWdub3JlZFRhcmdldHMuYWRkKHRhcmdldEluZm8udGFyZ2V0SWQpO1xuICAgICAgICAgICAgdGhpcy4jZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KHRhcmdldEluZm8udGFyZ2V0SWQpO1xuICAgICAgICAgICAgYXdhaXQgc2lsZW50RGV0YWNoKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc2V0dXBBdHRhY2htZW50TGlzdGVuZXJzKHNlc3Npb24pO1xuICAgICAgICBpZiAoaXNFeGlzdGluZ1RhcmdldCkge1xuICAgICAgICAgICAgc2Vzc2lvbi5fc2V0VGFyZ2V0KHRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVNlc3Npb25JZC5zZXQoc2Vzc2lvbi5pZCgpLCB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmdldCh0YXJnZXRJbmZvLnRhcmdldElkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXQuX2luaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuc2V0KHRhcmdldEluZm8udGFyZ2V0SWQsIHRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVNlc3Npb25JZC5zZXQoc2Vzc2lvbi5pZCgpLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudFRhcmdldCA9IHBhcmVudFNlc3Npb24gaW5zdGFuY2VvZiBDRFBTZXNzaW9uXG4gICAgICAgICAgICA/IHBhcmVudFNlc3Npb24uX3RhcmdldCgpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIHBhcmVudFRhcmdldD8uX2FkZENoaWxkVGFyZ2V0KHRhcmdldCk7XG4gICAgICAgIHBhcmVudFNlc3Npb24uZW1pdChDRFBTZXNzaW9uRXZlbnQuUmVhZHksIHNlc3Npb24pO1xuICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdC5kZWxldGUodGFyZ2V0Ll90YXJnZXRJZCk7XG4gICAgICAgIGlmICghaXNFeGlzdGluZ1RhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwidGFyZ2V0QXZhaWxhYmxlXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldEF2YWlsYWJsZSAqLywgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkoKTtcbiAgICAgICAgLy8gVE9ETzogdGhlIGJyb3dzZXIgbWlnaHQgYmUgc2h1dHRpbmcgZG93biBoZXJlLiBXaGF0IGRvIHdlIGRvIHdpdGggdGhlXG4gICAgICAgIC8vIGVycm9yP1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICBzZXNzaW9uLnNlbmQoJ1RhcmdldC5zZXRBdXRvQXR0YWNoJywge1xuICAgICAgICAgICAgICAgIHdhaXRGb3JEZWJ1Z2dlck9uU3RhcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZmxhdHRlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhdXRvQXR0YWNoOiB0cnVlLFxuICAgICAgICAgICAgICAgIGZpbHRlcjogdGhpcy4jZGlzY292ZXJ5RmlsdGVyLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzZXNzaW9uLnNlbmQoJ1J1bnRpbWUucnVuSWZXYWl0aW5nRm9yRGVidWdnZXInKSxcbiAgICAgICAgXSkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgfTtcbiAgICAjZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KHRhcmdldElkKSB7XG4gICAgICAgIHRhcmdldElkICE9PSB1bmRlZmluZWQgJiYgdGhpcy4jdGFyZ2V0c0lkc0ZvckluaXQuZGVsZXRlKHRhcmdldElkKTtcbiAgICAgICAgaWYgKHRoaXMuI3RhcmdldHNJZHNGb3JJbml0LnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uRGV0YWNoZWRGcm9tVGFyZ2V0ID0gKHBhcmVudFNlc3Npb24sIGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5U2Vzc2lvbklkLmdldChldmVudC5zZXNzaW9uSWQpO1xuICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVNlc3Npb25JZC5kZWxldGUoZXZlbnQuc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50U2Vzc2lvbiBpbnN0YW5jZW9mIENEUFNlc3Npb24pIHtcbiAgICAgICAgICAgIHBhcmVudFNlc3Npb24uX3RhcmdldCgpLl9yZW1vdmVDaGlsZFRhcmdldCh0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuZGVsZXRlKHRhcmdldC5fdGFyZ2V0SWQpO1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRHb25lXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldEdvbmUgKi8sIHRhcmdldCk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNocm9tZVRhcmdldE1hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IENEUFNlc3Npb25FdmVudCwgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBDYWxsYmFja1JlZ2lzdHJ5IH0gZnJvbSAnLi4vY29tbW9uL0NhbGxiYWNrUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuLi9jb21tb24vRGVidWcuanMnO1xuaW1wb3J0IHsgVGFyZ2V0Q2xvc2VFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm90b2NvbEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IENkcENEUFNlc3Npb24gfSBmcm9tICcuL0NEUFNlc3Npb24uanMnO1xuY29uc3QgZGVidWdQcm90b2NvbFNlbmQgPSBkZWJ1ZygncHVwcGV0ZWVyOnByb3RvY29sOlNFTkQg4pa6Jyk7XG5jb25zdCBkZWJ1Z1Byb3RvY29sUmVjZWl2ZSA9IGRlYnVnKCdwdXBwZXRlZXI6cHJvdG9jb2w6UkVDViDil4AnKTtcbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgI3VybDtcbiAgICAjdHJhbnNwb3J0O1xuICAgICNkZWxheTtcbiAgICAjdGltZW91dDtcbiAgICAjc2Vzc2lvbnMgPSBuZXcgTWFwKCk7XG4gICAgI2Nsb3NlZCA9IGZhbHNlO1xuICAgICNtYW51YWxseUF0dGFjaGVkID0gbmV3IFNldCgpO1xuICAgICNjYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tSZWdpc3RyeSgpO1xuICAgIGNvbnN0cnVjdG9yKHVybCwgdHJhbnNwb3J0LCBkZWxheSA9IDAsIHRpbWVvdXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jdXJsID0gdXJsO1xuICAgICAgICB0aGlzLiNkZWxheSA9IGRlbGF5O1xuICAgICAgICB0aGlzLiN0aW1lb3V0ID0gdGltZW91dCA/PyAxODBfMDAwO1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgICAgIHRoaXMuI3RyYW5zcG9ydC5vbm1lc3NhZ2UgPSB0aGlzLm9uTWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQub25jbG9zZSA9IHRoaXMuI29uQ2xvc2UuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21TZXNzaW9uKHNlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHNlc3Npb24uY29ubmVjdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgZGVsYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWxheTtcbiAgICB9XG4gICAgZ2V0IHRpbWVvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0aW1lb3V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgX2Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Nsb3NlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0IF9zZXNzaW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Nlc3Npb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIC0gVGhlIHNlc3Npb24gaWRcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBDRFAgc2Vzc2lvbiBpZiBpdCBleGlzdHNcbiAgICAgKi9cbiAgICBzZXNzaW9uKHNlc3Npb25JZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCkgfHwgbnVsbDtcbiAgICB9XG4gICAgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdXJsO1xuICAgIH1cbiAgICBzZW5kKG1ldGhvZCwgcGFyYW1zLCBvcHRpb25zKSB7XG4gICAgICAgIC8vIFRoZXJlIGlzIG9ubHkgZXZlciAxIHBhcmFtIGFyZyBwYXNzZWQsIGJ1dCB0aGUgUHJvdG9jb2wgZGVmaW5lcyBpdCBhcyBhblxuICAgICAgICAvLyBhcnJheSBvZiAwIG9yIDEgaXRlbXMgU2VlIHRoaXMgY29tbWVudDpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0Nocm9tZURldlRvb2xzL2RldnRvb2xzLXByb3RvY29sL3B1bGwvMTEzI2lzc3VlY29tbWVudC00MTI2MDMyODVcbiAgICAgICAgLy8gd2hpY2ggZXhwbGFpbnMgd2h5IHRoZSBwcm90b2NvbCBkZWZpbmVzIHRoZSBwYXJhbXMgdGhpcyB3YXkgZm9yIGJldHRlclxuICAgICAgICAvLyB0eXBlLWluZmVyZW5jZS5cbiAgICAgICAgLy8gU28gbm93IHdlIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcGFyYW1zIG9yIG5vdCBhbmQgZGVhbCB3aXRoIHRoZW0gYWNjb3JkaW5nbHkuXG4gICAgICAgIHJldHVybiB0aGlzLl9yYXdTZW5kKHRoaXMuI2NhbGxiYWNrcywgbWV0aG9kLCBwYXJhbXMsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9yYXdTZW5kKGNhbGxiYWNrcywgbWV0aG9kLCBwYXJhbXMsIHNlc3Npb25JZCwgb3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy4jY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdQcm90b2NvbCBlcnJvcjogQ29ubmVjdGlvbiBjbG9zZWQuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFja3MuY3JlYXRlKG1ldGhvZCwgb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLiN0aW1lb3V0LCBpZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHJpbmdpZmllZE1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlYnVnUHJvdG9jb2xTZW5kKHN0cmluZ2lmaWVkTWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLiN0cmFuc3BvcnQuc2VuZChzdHJpbmdpZmllZE1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmQoJ0Jyb3dzZXIuY2xvc2UnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgb25NZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RlbGF5KSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChyLCB0aGlzLiNkZWxheSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1Z1Byb3RvY29sUmVjZWl2ZShtZXNzYWdlKTtcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gSlNPTi5wYXJzZShtZXNzYWdlKTtcbiAgICAgICAgaWYgKG9iamVjdC5tZXRob2QgPT09ICdUYXJnZXQuYXR0YWNoZWRUb1RhcmdldCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IG9iamVjdC5wYXJhbXMuc2Vzc2lvbklkO1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBDZHBDRFBTZXNzaW9uKHRoaXMsIG9iamVjdC5wYXJhbXMudGFyZ2V0SW5mby50eXBlLCBzZXNzaW9uSWQsIG9iamVjdC5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgdGhpcy4jc2Vzc2lvbnMuc2V0KHNlc3Npb25JZCwgc2Vzc2lvbik7XG4gICAgICAgICAgICB0aGlzLmVtaXQoQ0RQU2Vzc2lvbkV2ZW50LlNlc3Npb25BdHRhY2hlZCwgc2Vzc2lvbik7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRTZXNzaW9uID0gdGhpcy4jc2Vzc2lvbnMuZ2V0KG9iamVjdC5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgaWYgKHBhcmVudFNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRTZXNzaW9uLmVtaXQoQ0RQU2Vzc2lvbkV2ZW50LlNlc3Npb25BdHRhY2hlZCwgc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob2JqZWN0Lm1ldGhvZCA9PT0gJ1RhcmdldC5kZXRhY2hlZEZyb21UYXJnZXQnKSB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy4jc2Vzc2lvbnMuZ2V0KG9iamVjdC5wYXJhbXMuc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5fb25DbG9zZWQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNzZXNzaW9ucy5kZWxldGUob2JqZWN0LnBhcmFtcy5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRTZXNzaW9uID0gdGhpcy4jc2Vzc2lvbnMuZ2V0KG9iamVjdC5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRTZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFNlc3Npb24uZW1pdChDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdC5zZXNzaW9uSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLiNzZXNzaW9ucy5nZXQob2JqZWN0LnNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgIHNlc3Npb24uX29uTWVzc2FnZShvYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9iamVjdC5pZCkge1xuICAgICAgICAgICAgaWYgKG9iamVjdC5lcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NhbGxiYWNrcy5yZWplY3Qob2JqZWN0LmlkLCBjcmVhdGVQcm90b2NvbEVycm9yTWVzc2FnZShvYmplY3QpLCBvYmplY3QuZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjYWxsYmFja3MucmVzb2x2ZShvYmplY3QuaWQsIG9iamVjdC5yZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KG9iamVjdC5tZXRob2QsIG9iamVjdC5wYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNvbkNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy4jY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9ubWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9uY2xvc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuI2NhbGxiYWNrcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IHNlc3Npb24gb2YgdGhpcy4jc2Vzc2lvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHNlc3Npb24uX29uQ2xvc2VkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc2Vzc2lvbnMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbWl0KENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuI29uQ2xvc2UoKTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGlzQXV0b0F0dGFjaGVkKHRhcmdldElkKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy4jbWFudWFsbHlBdHRhY2hlZC5oYXModGFyZ2V0SWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBfY3JlYXRlU2Vzc2lvbih0YXJnZXRJbmZvLCBpc0F1dG9BdHRhY2hFbXVsYXRlZCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCFpc0F1dG9BdHRhY2hFbXVsYXRlZCkge1xuICAgICAgICAgICAgdGhpcy4jbWFudWFsbHlBdHRhY2hlZC5hZGQodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzZXNzaW9uSWQgfSA9IGF3YWl0IHRoaXMuc2VuZCgnVGFyZ2V0LmF0dGFjaFRvVGFyZ2V0Jywge1xuICAgICAgICAgICAgdGFyZ2V0SWQ6IHRhcmdldEluZm8udGFyZ2V0SWQsXG4gICAgICAgICAgICBmbGF0dGVuOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jbWFudWFsbHlBdHRhY2hlZC5kZWxldGUodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLiNzZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NEUFNlc3Npb24gY3JlYXRpb24gZmFpbGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGFyZ2V0SW5mbyAtIFRoZSB0YXJnZXQgaW5mb1xuICAgICAqIEByZXR1cm5zIFRoZSBDRFAgc2Vzc2lvbiB0aGF0IGlzIGNyZWF0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTZXNzaW9uKHRhcmdldEluZm8pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NyZWF0ZVNlc3Npb24odGFyZ2V0SW5mbywgZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRQZW5kaW5nUHJvdG9jb2xFcnJvcnMoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLiNjYWxsYmFja3MuZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCkpO1xuICAgICAgICBmb3IgKGNvbnN0IHNlc3Npb24gb2YgdGhpcy4jc2Vzc2lvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnNlc3Npb24uZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGFyZ2V0Q2xvc2VkRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRDbG9zZUVycm9yO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yLCBQdXBwZXRlZXJVUkwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2sgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuLyoqXG4gKiBUaGUgQ292ZXJhZ2UgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0byBnYXRoZXIgaW5mb3JtYXRpb24gYWJvdXQgcGFydHMgb2ZcbiAqIEphdmFTY3JpcHQgYW5kIENTUyB0aGF0IHdlcmUgdXNlZCBieSB0aGUgcGFnZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogVG8gb3V0cHV0IGNvdmVyYWdlIGluIGEgZm9ybSBjb25zdW1hYmxlIGJ5IHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vaXN0YW5idWxqcyB8IElzdGFuYnVsfSxcbiAqIHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2lzdGFuYnVsanMvcHVwcGV0ZWVyLXRvLWlzdGFuYnVsIHwgcHVwcGV0ZWVyLXRvLWlzdGFuYnVsfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogQW4gZXhhbXBsZSBvZiB1c2luZyBKYXZhU2NyaXB0IGFuZCBDU1MgY292ZXJhZ2UgdG8gZ2V0IHBlcmNlbnRhZ2Ugb2YgaW5pdGlhbGx5XG4gKiBleGVjdXRlZCBjb2RlOlxuICpcbiAqIGBgYHRzXG4gKiAvLyBFbmFibGUgYm90aCBKYXZhU2NyaXB0IGFuZCBDU1MgY292ZXJhZ2VcbiAqIGF3YWl0IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS5jb3ZlcmFnZS5zdGFydEpTQ292ZXJhZ2UoKSxcbiAqICAgcGFnZS5jb3ZlcmFnZS5zdGFydENTU0NvdmVyYWdlKCksXG4gKiBdKTtcbiAqIC8vIE5hdmlnYXRlIHRvIHBhZ2VcbiAqIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICogLy8gRGlzYWJsZSBib3RoIEphdmFTY3JpcHQgYW5kIENTUyBjb3ZlcmFnZVxuICogY29uc3QgW2pzQ292ZXJhZ2UsIGNzc0NvdmVyYWdlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS5jb3ZlcmFnZS5zdG9wSlNDb3ZlcmFnZSgpLFxuICogICBwYWdlLmNvdmVyYWdlLnN0b3BDU1NDb3ZlcmFnZSgpLFxuICogXSk7XG4gKiBsZXQgdG90YWxCeXRlcyA9IDA7XG4gKiBsZXQgdXNlZEJ5dGVzID0gMDtcbiAqIGNvbnN0IGNvdmVyYWdlID0gWy4uLmpzQ292ZXJhZ2UsIC4uLmNzc0NvdmVyYWdlXTtcbiAqIGZvciAoY29uc3QgZW50cnkgb2YgY292ZXJhZ2UpIHtcbiAqICAgdG90YWxCeXRlcyArPSBlbnRyeS50ZXh0Lmxlbmd0aDtcbiAqICAgZm9yIChjb25zdCByYW5nZSBvZiBlbnRyeS5yYW5nZXMpIHVzZWRCeXRlcyArPSByYW5nZS5lbmQgLSByYW5nZS5zdGFydCAtIDE7XG4gKiB9XG4gKiBjb25zb2xlLmxvZyhgQnl0ZXMgdXNlZDogJHsodXNlZEJ5dGVzIC8gdG90YWxCeXRlcykgKiAxMDB9JWApO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQ292ZXJhZ2Uge1xuICAgICNqc0NvdmVyYWdlO1xuICAgICNjc3NDb3ZlcmFnZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy4janNDb3ZlcmFnZSA9IG5ldyBKU0NvdmVyYWdlKGNsaWVudCk7XG4gICAgICAgIHRoaXMuI2Nzc0NvdmVyYWdlID0gbmV3IENTU0NvdmVyYWdlKGNsaWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHVwZGF0ZUNsaWVudChjbGllbnQpIHtcbiAgICAgICAgdGhpcy4janNDb3ZlcmFnZS51cGRhdGVDbGllbnQoY2xpZW50KTtcbiAgICAgICAgdGhpcy4jY3NzQ292ZXJhZ2UudXBkYXRlQ2xpZW50KGNsaWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gU2V0IG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zIGZvciBjb3ZlcmFnZSBkZWZhdWx0cyB0b1xuICAgICAqIGByZXNldE9uTmF2aWdhdGlvbiA6IHRydWUsIHJlcG9ydEFub255bW91c1NjcmlwdHMgOiBmYWxzZSxgXG4gICAgICogYGluY2x1ZGVSYXdTY3JpcHRDb3ZlcmFnZSA6IGZhbHNlLCB1c2VCbG9ja0NvdmVyYWdlIDogdHJ1ZWBcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjb3ZlcmFnZSBpcyBzdGFydGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbm9ueW1vdXMgc2NyaXB0cyBhcmUgb25lcyB0aGF0IGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCB1cmwuIFRoZXNlIGFyZVxuICAgICAqIHNjcmlwdHMgdGhhdCBhcmUgZHluYW1pY2FsbHkgY3JlYXRlZCBvbiB0aGUgcGFnZSB1c2luZyBgZXZhbGAgb3JcbiAgICAgKiBgbmV3IEZ1bmN0aW9uYC4gSWYgYHJlcG9ydEFub255bW91c1NjcmlwdHNgIGlzIHNldCB0byBgdHJ1ZWAsIGFub255bW91c1xuICAgICAqIHNjcmlwdHMgVVJMIHdpbGwgc3RhcnQgd2l0aCBgZGVidWdnZXI6Ly9WTWAgKHVubGVzcyBhIG1hZ2ljIC8vIyBzb3VyY2VVUkxcbiAgICAgKiBjb21tZW50IGlzIHByZXNlbnQsIGluIHdoaWNoIGNhc2UgdGhhdCB3aWxsIHRoZSBiZSBVUkwpLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YXJ0SlNDb3ZlcmFnZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2pzQ292ZXJhZ2Uuc3RhcnQob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgY292ZXJhZ2UgcmVwb3J0cyBmb3JcbiAgICAgKiBhbGwgc2NyaXB0cy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSmF2YVNjcmlwdCBDb3ZlcmFnZSBkb2Vzbid0IGluY2x1ZGUgYW5vbnltb3VzIHNjcmlwdHMgYnkgZGVmYXVsdC5cbiAgICAgKiBIb3dldmVyLCBzY3JpcHRzIHdpdGggc291cmNlVVJMcyBhcmUgcmVwb3J0ZWQuXG4gICAgICovXG4gICAgYXN5bmMgc3RvcEpTQ292ZXJhZ2UoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNqc0NvdmVyYWdlLnN0b3AoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTZXQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMgZm9yIGNvdmVyYWdlLCBkZWZhdWx0cyB0b1xuICAgICAqIGByZXNldE9uTmF2aWdhdGlvbiA6IHRydWVgXG4gICAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gY292ZXJhZ2UgaXMgc3RhcnRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBzdGFydENTU0NvdmVyYWdlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jY3NzQ292ZXJhZ2Uuc3RhcnQob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgY292ZXJhZ2UgcmVwb3J0c1xuICAgICAqIGZvciBhbGwgc3R5bGVzaGVldHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIENTUyBDb3ZlcmFnZSBkb2Vzbid0IGluY2x1ZGUgZHluYW1pY2FsbHkgaW5qZWN0ZWQgc3R5bGUgdGFnc1xuICAgICAqIHdpdGhvdXQgc291cmNlVVJMcy5cbiAgICAgKi9cbiAgICBhc3luYyBzdG9wQ1NTQ292ZXJhZ2UoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjc3NDb3ZlcmFnZS5zdG9wKCk7XG4gICAgfVxufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBKU0NvdmVyYWdlIHtcbiAgICAjY2xpZW50O1xuICAgICNlbmFibGVkID0gZmFsc2U7XG4gICAgI3NjcmlwdFVSTHMgPSBuZXcgTWFwKCk7XG4gICAgI3NjcmlwdFNvdXJjZXMgPSBuZXcgTWFwKCk7XG4gICAgI3N1YnNjcmlwdGlvbnM7XG4gICAgI3Jlc2V0T25OYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgI3JlcG9ydEFub255bW91c1NjcmlwdHMgPSBmYWxzZTtcbiAgICAjaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdXBkYXRlQ2xpZW50KGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIGFzeW5jIHN0YXJ0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2VuYWJsZWQsICdKU0NvdmVyYWdlIGlzIGFscmVhZHkgZW5hYmxlZCcpO1xuICAgICAgICBjb25zdCB7IHJlc2V0T25OYXZpZ2F0aW9uID0gdHJ1ZSwgcmVwb3J0QW5vbnltb3VzU2NyaXB0cyA9IGZhbHNlLCBpbmNsdWRlUmF3U2NyaXB0Q292ZXJhZ2UgPSBmYWxzZSwgdXNlQmxvY2tDb3ZlcmFnZSA9IHRydWUsIH0gPSBvcHRpb25zO1xuICAgICAgICB0aGlzLiNyZXNldE9uTmF2aWdhdGlvbiA9IHJlc2V0T25OYXZpZ2F0aW9uO1xuICAgICAgICB0aGlzLiNyZXBvcnRBbm9ueW1vdXNTY3JpcHRzID0gcmVwb3J0QW5vbnltb3VzU2NyaXB0cztcbiAgICAgICAgdGhpcy4jaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlID0gaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlO1xuICAgICAgICB0aGlzLiNlbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jc2NyaXB0VVJMcy5jbGVhcigpO1xuICAgICAgICB0aGlzLiNzY3JpcHRTb3VyY2VzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbnMgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgICAgIGNvbnN0IGNsaWVudEVtaXR0ZXIgPSB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRFbWl0dGVyKHRoaXMuI2NsaWVudCkpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdEZWJ1Z2dlci5zY3JpcHRQYXJzZWQnLCB0aGlzLiNvblNjcmlwdFBhcnNlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgY2xpZW50RW1pdHRlci5vbignUnVudGltZS5leGVjdXRpb25Db250ZXh0c0NsZWFyZWQnLCB0aGlzLiNvbkV4ZWN1dGlvbkNvbnRleHRzQ2xlYXJlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1Byb2ZpbGVyLmVuYWJsZScpLFxuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1Byb2ZpbGVyLnN0YXJ0UHJlY2lzZUNvdmVyYWdlJywge1xuICAgICAgICAgICAgICAgIGNhbGxDb3VudDogdGhpcy4jaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlLFxuICAgICAgICAgICAgICAgIGRldGFpbGVkOiB1c2VCbG9ja0NvdmVyYWdlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnRGVidWdnZXIuZW5hYmxlJyksXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnRGVidWdnZXIuc2V0U2tpcEFsbFBhdXNlcycsIHsgc2tpcDogdHJ1ZSB9KSxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgICNvbkV4ZWN1dGlvbkNvbnRleHRzQ2xlYXJlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNyZXNldE9uTmF2aWdhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3NjcmlwdFVSTHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy4jc2NyaXB0U291cmNlcy5jbGVhcigpO1xuICAgIH1cbiAgICBhc3luYyAjb25TY3JpcHRQYXJzZWQoZXZlbnQpIHtcbiAgICAgICAgLy8gSWdub3JlIHB1cHBldGVlci1pbmplY3RlZCBzY3JpcHRzXG4gICAgICAgIGlmIChQdXBwZXRlZXJVUkwuaXNQdXBwZXRlZXJVUkwoZXZlbnQudXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElnbm9yZSBvdGhlciBhbm9ueW1vdXMgc2NyaXB0cyB1bmxlc3MgdGhlIHJlcG9ydEFub255bW91c1NjcmlwdHMgb3B0aW9uIGlzIHRydWUuXG4gICAgICAgIGlmICghZXZlbnQudXJsICYmICF0aGlzLiNyZXBvcnRBbm9ueW1vdXNTY3JpcHRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ0RlYnVnZ2VyLmdldFNjcmlwdFNvdXJjZScsIHtcbiAgICAgICAgICAgICAgICBzY3JpcHRJZDogZXZlbnQuc2NyaXB0SWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuI3NjcmlwdFVSTHMuc2V0KGV2ZW50LnNjcmlwdElkLCBldmVudC51cmwpO1xuICAgICAgICAgICAgdGhpcy4jc2NyaXB0U291cmNlcy5zZXQoZXZlbnQuc2NyaXB0SWQsIHJlc3BvbnNlLnNjcmlwdFNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IGhhcHBlbiBpZiB0aGUgcGFnZSBoYXMgYWxyZWFkeSBuYXZpZ2F0ZWQgYXdheS5cbiAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHN0b3AoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLiNlbmFibGVkLCAnSlNDb3ZlcmFnZSBpcyBub3QgZW5hYmxlZCcpO1xuICAgICAgICB0aGlzLiNlbmFibGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdQcm9maWxlci50YWtlUHJlY2lzZUNvdmVyYWdlJyksXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnUHJvZmlsZXIuc3RvcFByZWNpc2VDb3ZlcmFnZScpLFxuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1Byb2ZpbGVyLmRpc2FibGUnKSxcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdEZWJ1Z2dlci5kaXNhYmxlJyksXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zPy5kaXNwb3NlKCk7XG4gICAgICAgIGNvbnN0IGNvdmVyYWdlID0gW107XG4gICAgICAgIGNvbnN0IHByb2ZpbGVSZXNwb25zZSA9IHJlc3VsdFswXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBwcm9maWxlUmVzcG9uc2UucmVzdWx0KSB7XG4gICAgICAgICAgICBsZXQgdXJsID0gdGhpcy4jc2NyaXB0VVJMcy5nZXQoZW50cnkuc2NyaXB0SWQpO1xuICAgICAgICAgICAgaWYgKCF1cmwgJiYgdGhpcy4jcmVwb3J0QW5vbnltb3VzU2NyaXB0cykge1xuICAgICAgICAgICAgICAgIHVybCA9ICdkZWJ1Z2dlcjovL1ZNJyArIGVudHJ5LnNjcmlwdElkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuI3NjcmlwdFNvdXJjZXMuZ2V0KGVudHJ5LnNjcmlwdElkKTtcbiAgICAgICAgICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQgfHwgdXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5SYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZnVuYyBvZiBlbnRyeS5mdW5jdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBmbGF0dGVuUmFuZ2VzLnB1c2goLi4uZnVuYy5yYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmFuZ2VzID0gY29udmVydFRvRGlzam9pbnRSYW5nZXMoZmxhdHRlblJhbmdlcyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI2luY2x1ZGVSYXdTY3JpcHRDb3ZlcmFnZSkge1xuICAgICAgICAgICAgICAgIGNvdmVyYWdlLnB1c2goeyB1cmwsIHJhbmdlcywgdGV4dCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvdmVyYWdlLnB1c2goeyB1cmwsIHJhbmdlcywgdGV4dCwgcmF3U2NyaXB0Q292ZXJhZ2U6IGVudHJ5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3ZlcmFnZTtcbiAgICB9XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIENTU0NvdmVyYWdlIHtcbiAgICAjY2xpZW50O1xuICAgICNlbmFibGVkID0gZmFsc2U7XG4gICAgI3N0eWxlc2hlZXRVUkxzID0gbmV3IE1hcCgpO1xuICAgICNzdHlsZXNoZWV0U291cmNlcyA9IG5ldyBNYXAoKTtcbiAgICAjZXZlbnRMaXN0ZW5lcnM7XG4gICAgI3Jlc2V0T25OYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdXBkYXRlQ2xpZW50KGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIGFzeW5jIHN0YXJ0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2VuYWJsZWQsICdDU1NDb3ZlcmFnZSBpcyBhbHJlYWR5IGVuYWJsZWQnKTtcbiAgICAgICAgY29uc3QgeyByZXNldE9uTmF2aWdhdGlvbiA9IHRydWUgfSA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuI3Jlc2V0T25OYXZpZ2F0aW9uID0gcmVzZXRPbk5hdmlnYXRpb247XG4gICAgICAgIHRoaXMuI2VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLiNzdHlsZXNoZWV0VVJMcy5jbGVhcigpO1xuICAgICAgICB0aGlzLiNzdHlsZXNoZWV0U291cmNlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLiNldmVudExpc3RlbmVycyA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTtcbiAgICAgICAgY29uc3QgY2xpZW50RW1pdHRlciA9IHRoaXMuI2V2ZW50TGlzdGVuZXJzLnVzZShuZXcgRXZlbnRFbWl0dGVyKHRoaXMuI2NsaWVudCkpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdDU1Muc3R5bGVTaGVldEFkZGVkJywgdGhpcy4jb25TdHlsZVNoZWV0LmJpbmQodGhpcykpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHRzQ2xlYXJlZCcsIHRoaXMuI29uRXhlY3V0aW9uQ29udGV4dHNDbGVhcmVkLmJpbmQodGhpcykpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnRE9NLmVuYWJsZScpLFxuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ0NTUy5lbmFibGUnKSxcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdDU1Muc3RhcnRSdWxlVXNhZ2VUcmFja2luZycpLFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgI29uRXhlY3V0aW9uQ29udGV4dHNDbGVhcmVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuI3Jlc2V0T25OYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc3R5bGVzaGVldFVSTHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy4jc3R5bGVzaGVldFNvdXJjZXMuY2xlYXIoKTtcbiAgICB9XG4gICAgYXN5bmMgI29uU3R5bGVTaGVldChldmVudCkge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBldmVudC5oZWFkZXI7XG4gICAgICAgIC8vIElnbm9yZSBhbm9ueW1vdXMgc2NyaXB0c1xuICAgICAgICBpZiAoIWhlYWRlci5zb3VyY2VVUkwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnQ1NTLmdldFN0eWxlU2hlZXRUZXh0Jywge1xuICAgICAgICAgICAgICAgIHN0eWxlU2hlZXRJZDogaGVhZGVyLnN0eWxlU2hlZXRJZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy4jc3R5bGVzaGVldFVSTHMuc2V0KGhlYWRlci5zdHlsZVNoZWV0SWQsIGhlYWRlci5zb3VyY2VVUkwpO1xuICAgICAgICAgICAgdGhpcy4jc3R5bGVzaGVldFNvdXJjZXMuc2V0KGhlYWRlci5zdHlsZVNoZWV0SWQsIHJlc3BvbnNlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gVGhpcyBtaWdodCBoYXBwZW4gaWYgdGhlIHBhZ2UgaGFzIGFscmVhZHkgbmF2aWdhdGVkIGF3YXkuXG4gICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBzdG9wKCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jZW5hYmxlZCwgJ0NTU0NvdmVyYWdlIGlzIG5vdCBlbmFibGVkJyk7XG4gICAgICAgIHRoaXMuI2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcnVsZVRyYWNraW5nUmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnQ1NTLnN0b3BSdWxlVXNhZ2VUcmFja2luZycpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnQ1NTLmRpc2FibGUnKSxcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdET00uZGlzYWJsZScpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy4jZXZlbnRMaXN0ZW5lcnM/LmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gYWdncmVnYXRlIGJ5IHN0eWxlU2hlZXRJZFxuICAgICAgICBjb25zdCBzdHlsZVNoZWV0SWRUb0NvdmVyYWdlID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJ1bGVUcmFja2luZ1Jlc3BvbnNlLnJ1bGVVc2FnZSkge1xuICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHN0eWxlU2hlZXRJZFRvQ292ZXJhZ2UuZ2V0KGVudHJ5LnN0eWxlU2hlZXRJZCk7XG4gICAgICAgICAgICBpZiAoIXJhbmdlcykge1xuICAgICAgICAgICAgICAgIHJhbmdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHN0eWxlU2hlZXRJZFRvQ292ZXJhZ2Uuc2V0KGVudHJ5LnN0eWxlU2hlZXRJZCwgcmFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdGFydE9mZnNldDogZW50cnkuc3RhcnRPZmZzZXQsXG4gICAgICAgICAgICAgICAgZW5kT2Zmc2V0OiBlbnRyeS5lbmRPZmZzZXQsXG4gICAgICAgICAgICAgICAgY291bnQ6IGVudHJ5LnVzZWQgPyAxIDogMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvdmVyYWdlID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgc3R5bGVTaGVldElkIG9mIHRoaXMuI3N0eWxlc2hlZXRVUkxzLmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy4jc3R5bGVzaGVldFVSTHMuZ2V0KHN0eWxlU2hlZXRJZCk7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIHVybCAhPT0gJ3VuZGVmaW5lZCcsIGBTdHlsZXNoZWV0IFVSTCBpcyB1bmRlZmluZWQgKHN0eWxlU2hlZXRJZD0ke3N0eWxlU2hlZXRJZH0pYCk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy4jc3R5bGVzaGVldFNvdXJjZXMuZ2V0KHN0eWxlU2hlZXRJZCk7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIHRleHQgIT09ICd1bmRlZmluZWQnLCBgU3R5bGVzaGVldCB0ZXh0IGlzIHVuZGVmaW5lZCAoc3R5bGVTaGVldElkPSR7c3R5bGVTaGVldElkfSlgKTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlcyA9IGNvbnZlcnRUb0Rpc2pvaW50UmFuZ2VzKHN0eWxlU2hlZXRJZFRvQ292ZXJhZ2UuZ2V0KHN0eWxlU2hlZXRJZCkgfHwgW10pO1xuICAgICAgICAgICAgY292ZXJhZ2UucHVzaCh7IHVybCwgcmFuZ2VzLCB0ZXh0IH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3ZlcmFnZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb252ZXJ0VG9EaXNqb2ludFJhbmdlcyhuZXN0ZWRSYW5nZXMpIHtcbiAgICBjb25zdCBwb2ludHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIG5lc3RlZFJhbmdlcykge1xuICAgICAgICBwb2ludHMucHVzaCh7IG9mZnNldDogcmFuZ2Uuc3RhcnRPZmZzZXQsIHR5cGU6IDAsIHJhbmdlIH0pO1xuICAgICAgICBwb2ludHMucHVzaCh7IG9mZnNldDogcmFuZ2UuZW5kT2Zmc2V0LCB0eXBlOiAxLCByYW5nZSB9KTtcbiAgICB9XG4gICAgLy8gU29ydCBwb2ludHMgdG8gZm9ybSBhIHZhbGlkIHBhcmVudGhlc2lzIHNlcXVlbmNlLlxuICAgIHBvaW50cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIFNvcnQgd2l0aCBpbmNyZWFzaW5nIG9mZnNldHMuXG4gICAgICAgIGlmIChhLm9mZnNldCAhPT0gYi5vZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBhLm9mZnNldCAtIGIub2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsbCBcImVuZFwiIHBvaW50cyBzaG91bGQgZ28gYmVmb3JlIFwic3RhcnRcIiBwb2ludHMuXG4gICAgICAgIGlmIChhLnR5cGUgIT09IGIudHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGIudHlwZSAtIGEudHlwZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhTGVuZ3RoID0gYS5yYW5nZS5lbmRPZmZzZXQgLSBhLnJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgICAgICBjb25zdCBiTGVuZ3RoID0gYi5yYW5nZS5lbmRPZmZzZXQgLSBiLnJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgICAgICAvLyBGb3IgdHdvIFwic3RhcnRcIiBwb2ludHMsIHRoZSBvbmUgd2l0aCBsb25nZXIgcmFuZ2UgZ29lcyBmaXJzdC5cbiAgICAgICAgaWYgKGEudHlwZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJMZW5ndGggLSBhTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvciB0d28gXCJlbmRcIiBwb2ludHMsIHRoZSBvbmUgd2l0aCBzaG9ydGVyIHJhbmdlIGdvZXMgZmlyc3QuXG4gICAgICAgIHJldHVybiBhTGVuZ3RoIC0gYkxlbmd0aDtcbiAgICB9KTtcbiAgICBjb25zdCBoaXRDb3VudFN0YWNrID0gW107XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgIGxldCBsYXN0T2Zmc2V0ID0gMDtcbiAgICAvLyBSdW4gc2Nhbm5pbmcgbGluZSB0byBpbnRlcnNlY3QgYWxsIHJhbmdlcy5cbiAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHBvaW50cykge1xuICAgICAgICBpZiAoaGl0Q291bnRTdGFjay5sZW5ndGggJiZcbiAgICAgICAgICAgIGxhc3RPZmZzZXQgPCBwb2ludC5vZmZzZXQgJiZcbiAgICAgICAgICAgIGhpdENvdW50U3RhY2tbaGl0Q291bnRTdGFjay5sZW5ndGggLSAxXSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RSZXN1bHQgPSByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAobGFzdFJlc3VsdCAmJiBsYXN0UmVzdWx0LmVuZCA9PT0gbGFzdE9mZnNldCkge1xuICAgICAgICAgICAgICAgIGxhc3RSZXN1bHQuZW5kID0gcG9pbnQub2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgc3RhcnQ6IGxhc3RPZmZzZXQsIGVuZDogcG9pbnQub2Zmc2V0IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxhc3RPZmZzZXQgPSBwb2ludC5vZmZzZXQ7XG4gICAgICAgIGlmIChwb2ludC50eXBlID09PSAwKSB7XG4gICAgICAgICAgICBoaXRDb3VudFN0YWNrLnB1c2gocG9pbnQucmFuZ2UuY291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGl0Q291bnRTdGFjay5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBGaWx0ZXIgb3V0IGVtcHR5IHJhbmdlcy5cbiAgICByZXR1cm4gcmVzdWx0cy5maWx0ZXIocmFuZ2UgPT4ge1xuICAgICAgICByZXR1cm4gcmFuZ2UuZW5kIC0gcmFuZ2Uuc3RhcnQgPiAwO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q292ZXJhZ2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi4vdXRpbC9EZWZlcnJlZC5qcyc7XG4vKipcbiAqIERldmljZSBpbiBhIHJlcXVlc3QgcHJvbXB0LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERldmljZVJlcXVlc3RQcm9tcHREZXZpY2Uge1xuICAgIC8qKlxuICAgICAqIERldmljZSBpZCBkdXJpbmcgYSBwcm9tcHQuXG4gICAgICovXG4gICAgaWQ7XG4gICAgLyoqXG4gICAgICogRGV2aWNlIG5hbWUgYXMgaXQgYXBwZWFycyBpbiBhIHByb21wdC5cbiAgICAgKi9cbiAgICBuYW1lO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlkLCBuYW1lKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB9XG59XG4vKipcbiAqIERldmljZSByZXF1ZXN0IHByb21wdHMgbGV0IHlvdSByZXNwb25kIHRvIHRoZSBwYWdlIHJlcXVlc3RpbmcgZm9yIGEgZGV2aWNlXG4gKiB0aHJvdWdoIGFuIEFQSSBsaWtlIFdlYkJsdWV0b290aC5cbiAqXG4gKiBAcmVtYXJrc1xuICogYERldmljZVJlcXVlc3RQcm9tcHRgIGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgdmlhIHRoZVxuICoge0BsaW5rIFBhZ2Uud2FpdEZvckRldmljZVByb21wdH0gbWV0aG9kLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IFtkZXZpY2VSZXF1ZXN0XSA9IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS53YWl0Rm9yRGV2aWNlUHJvbXB0KCksXG4gKiAgIHBhZ2UuY2xpY2soJyNjb25uZWN0LWJsdWV0b290aCcpLFxuICogXSk7XG4gKiBhd2FpdCBkZXZpY2VQcm9tcHQuc2VsZWN0KFxuICogICBhd2FpdCBkZXZpY2VQcm9tcHQud2FpdEZvckRldmljZSgoe25hbWV9KSA9PiBuYW1lLmluY2x1ZGVzKCdNeSBEZXZpY2UnKSlcbiAqICk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXZpY2VSZXF1ZXN0UHJvbXB0IHtcbiAgICAjY2xpZW50O1xuICAgICN0aW1lb3V0U2V0dGluZ3M7XG4gICAgI2lkO1xuICAgICNoYW5kbGVkID0gZmFsc2U7XG4gICAgI3VwZGF0ZURldmljZXNIYW5kbGUgPSB0aGlzLiN1cGRhdGVEZXZpY2VzLmJpbmQodGhpcyk7XG4gICAgI3dhaXRGb3JEZXZpY2VQcm9taXNlcyA9IG5ldyBTZXQoKTtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGxpc3Qgb2Ygc2VsZWN0YWJsZSBkZXZpY2VzLlxuICAgICAqL1xuICAgIGRldmljZXMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIHRpbWVvdXRTZXR0aW5ncywgZmlyc3RFdmVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3RpbWVvdXRTZXR0aW5ncyA9IHRpbWVvdXRTZXR0aW5ncztcbiAgICAgICAgdGhpcy4jaWQgPSBmaXJzdEV2ZW50LmlkO1xuICAgICAgICB0aGlzLiNjbGllbnQub24oJ0RldmljZUFjY2Vzcy5kZXZpY2VSZXF1ZXN0UHJvbXB0ZWQnLCB0aGlzLiN1cGRhdGVEZXZpY2VzSGFuZGxlKTtcbiAgICAgICAgdGhpcy4jY2xpZW50Lm9uKCdUYXJnZXQuZGV0YWNoZWRGcm9tVGFyZ2V0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jY2xpZW50ID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI3VwZGF0ZURldmljZXMoZmlyc3RFdmVudCk7XG4gICAgfVxuICAgICN1cGRhdGVEZXZpY2VzKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5pZCAhPT0gdGhpcy4jaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJhd0RldmljZSBvZiBldmVudC5kZXZpY2VzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZXZpY2VzLnNvbWUoZGV2aWNlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLmlkID09PSByYXdEZXZpY2UuaWQ7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3RGV2aWNlID0gbmV3IERldmljZVJlcXVlc3RQcm9tcHREZXZpY2UocmF3RGV2aWNlLmlkLCByYXdEZXZpY2UubmFtZSk7XG4gICAgICAgICAgICB0aGlzLmRldmljZXMucHVzaChuZXdEZXZpY2UpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB3YWl0Rm9yRGV2aWNlUHJvbWlzZSBvZiB0aGlzLiN3YWl0Rm9yRGV2aWNlUHJvbWlzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAod2FpdEZvckRldmljZVByb21pc2UuZmlsdGVyKG5ld0RldmljZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FpdEZvckRldmljZVByb21pc2UucHJvbWlzZS5yZXNvbHZlKG5ld0RldmljZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgdG8gdGhlIGZpcnN0IGRldmljZSBpbiB0aGUgcHJvbXB0IG1hdGNoaW5nIGEgZmlsdGVyLlxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JEZXZpY2UoZmlsdGVyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXZpY2Ugb2YgdGhpcy5kZXZpY2VzKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyKGRldmljZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdGltZW91dCA9IHRoaXMuI3RpbWVvdXRTZXR0aW5ncy50aW1lb3V0KCkgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBXYWl0aW5nIGZvciBcXGBEZXZpY2VSZXF1ZXN0UHJvbXB0RGV2aWNlXFxgIGZhaWxlZDogJHt0aW1lb3V0fW1zIGV4Y2VlZGVkYCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBoYW5kbGUgPSB7IGZpbHRlciwgcHJvbWlzZTogZGVmZXJyZWQgfTtcbiAgICAgICAgdGhpcy4jd2FpdEZvckRldmljZVByb21pc2VzLmFkZChoYW5kbGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy4jd2FpdEZvckRldmljZVByb21pc2VzLmRlbGV0ZShoYW5kbGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBhIGRldmljZSBpbiB0aGUgcHJvbXB0J3MgbGlzdC5cbiAgICAgKi9cbiAgICBhc3luYyBzZWxlY3QoZGV2aWNlKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLiNjbGllbnQgIT09IG51bGwsICdDYW5ub3Qgc2VsZWN0IGRldmljZSB0aHJvdWdoIGRldGFjaGVkIHNlc3Npb24hJyk7XG4gICAgICAgIGFzc2VydCh0aGlzLmRldmljZXMuaW5jbHVkZXMoZGV2aWNlKSwgJ0Nhbm5vdCBzZWxlY3QgdW5rbm93biBkZXZpY2UhJyk7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBzZWxlY3QgRGV2aWNlUmVxdWVzdFByb21wdCB3aGljaCBpcyBhbHJlYWR5IGhhbmRsZWQhJyk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vZmYoJ0RldmljZUFjY2Vzcy5kZXZpY2VSZXF1ZXN0UHJvbXB0ZWQnLCB0aGlzLiN1cGRhdGVEZXZpY2VzSGFuZGxlKTtcbiAgICAgICAgdGhpcy4jaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnRGV2aWNlQWNjZXNzLnNlbGVjdFByb21wdCcsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLiNpZCxcbiAgICAgICAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgdGhlIHByb21wdC5cbiAgICAgKi9cbiAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLiNjbGllbnQgIT09IG51bGwsICdDYW5ub3QgY2FuY2VsIHByb21wdCB0aHJvdWdoIGRldGFjaGVkIHNlc3Npb24hJyk7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBjYW5jZWwgRGV2aWNlUmVxdWVzdFByb21wdCB3aGljaCBpcyBhbHJlYWR5IGhhbmRsZWQhJyk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vZmYoJ0RldmljZUFjY2Vzcy5kZXZpY2VSZXF1ZXN0UHJvbXB0ZWQnLCB0aGlzLiN1cGRhdGVEZXZpY2VzSGFuZGxlKTtcbiAgICAgICAgdGhpcy4jaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnRGV2aWNlQWNjZXNzLmNhbmNlbFByb21wdCcsIHsgaWQ6IHRoaXMuI2lkIH0pO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXZpY2VSZXF1ZXN0UHJvbXB0TWFuYWdlciB7XG4gICAgI2NsaWVudDtcbiAgICAjdGltZW91dFNldHRpbmdzO1xuICAgICNkZXZpY2VSZXF1ZXN0UHJvbXBEZWZlcnJlZHMgPSBuZXcgU2V0KCk7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2xpZW50LCB0aW1lb3V0U2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB0aGlzLiN0aW1lb3V0U2V0dGluZ3MgPSB0aW1lb3V0U2V0dGluZ3M7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbignRGV2aWNlQWNjZXNzLmRldmljZVJlcXVlc3RQcm9tcHRlZCcsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuI29uRGV2aWNlUmVxdWVzdFByb21wdGVkKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbignVGFyZ2V0LmRldGFjaGVkRnJvbVRhcmdldCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudCA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXYWl0IGZvciBkZXZpY2UgcHJvbXB0IGNyZWF0ZWQgYnkgYW4gYWN0aW9uIGxpa2UgY2FsbGluZyBXZWJCbHVldG9vdGgnc1xuICAgICAqIHJlcXVlc3REZXZpY2UuXG4gICAgICovXG4gICAgYXN5bmMgd2FpdEZvckRldmljZVByb21wdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuI2NsaWVudCAhPT0gbnVsbCwgJ0Nhbm5vdCB3YWl0IGZvciBkZXZpY2UgcHJvbXB0IHRocm91Z2ggZGV0YWNoZWQgc2Vzc2lvbiEnKTtcbiAgICAgICAgY29uc3QgbmVlZHNFbmFibGUgPSB0aGlzLiNkZXZpY2VSZXF1ZXN0UHJvbXBEZWZlcnJlZHMuc2l6ZSA9PT0gMDtcbiAgICAgICAgbGV0IGVuYWJsZVByb21pc2U7XG4gICAgICAgIGlmIChuZWVkc0VuYWJsZSkge1xuICAgICAgICAgICAgZW5hYmxlUHJvbWlzZSA9IHRoaXMuI2NsaWVudC5zZW5kKCdEZXZpY2VBY2Nlc3MuZW5hYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0aW1lb3V0ID0gdGhpcy4jdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoe1xuICAgICAgICAgICAgbWVzc2FnZTogYFdhaXRpbmcgZm9yIFxcYERldmljZVJlcXVlc3RQcm9tcHRcXGAgZmFpbGVkOiAke3RpbWVvdXR9bXMgZXhjZWVkZWRgLFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQudmFsdWVPclRocm93KCksXG4gICAgICAgICAgICAgICAgZW5hYmxlUHJvbWlzZSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgICNvbkRldmljZVJlcXVlc3RQcm9tcHRlZChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5zaXplKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHRoaXMuI2NsaWVudCAhPT0gbnVsbCk7XG4gICAgICAgIGNvbnN0IGRldmljZVByb21wdCA9IG5ldyBEZXZpY2VSZXF1ZXN0UHJvbXB0KHRoaXMuI2NsaWVudCwgdGhpcy4jdGltZW91dFNldHRpbmdzLCBldmVudCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiB0aGlzLiNkZXZpY2VSZXF1ZXN0UHJvbXBEZWZlcnJlZHMpIHtcbiAgICAgICAgICAgIHByb21pc2UucmVzb2x2ZShkZXZpY2VQcm9tcHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5jbGVhcigpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURldmljZVJlcXVlc3RQcm9tcHQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IERpYWxvZyB9IGZyb20gJy4uL2FwaS9EaWFsb2cuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENkcERpYWxvZyBleHRlbmRzIERpYWxvZyB7XG4gICAgI2NsaWVudDtcbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIHR5cGUsIG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSA9ICcnKSB7XG4gICAgICAgIHN1cGVyKHR5cGUsIG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgYXN5bmMgaGFuZGxlKG9wdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ1BhZ2UuaGFuZGxlSmF2YVNjcmlwdERpYWxvZycsIHtcbiAgICAgICAgICAgIGFjY2VwdDogb3B0aW9ucy5hY2NlcHQsXG4gICAgICAgICAgICBwcm9tcHRUZXh0OiBvcHRpb25zLnRleHQsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpYWxvZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fcnVuSW5pdGlhbGl6ZXJzID0gKHRoaXMgJiYgdGhpcy5fX3J1bkluaXRpYWxpemVycykgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcbnZhciBfX2VzRGVjb3JhdGUgPSAodGhpcyAmJiB0aGlzLl9fZXNEZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gICAgZG9uZSA9IHRydWU7XG59O1xuaW1wb3J0IHsgRWxlbWVudEhhbmRsZSB9IGZyb20gJy4uL2FwaS9FbGVtZW50SGFuZGxlLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBBc3luY0l0ZXJhYmxlVXRpbCB9IGZyb20gJy4uL3V0aWwvQXN5bmNJdGVyYWJsZVV0aWwuanMnO1xuaW1wb3J0IHsgdGhyb3dJZkRpc3Bvc2VkIH0gZnJvbSAnLi4vdXRpbC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENkcEpTSGFuZGxlIH0gZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG5jb25zdCBOT05fRUxFTUVOVF9OT0RFX1JPTEVTID0gbmV3IFNldChbJ1N0YXRpY1RleHQnLCAnSW5saW5lVGV4dEJveCddKTtcbi8qKlxuICogVGhlIENkcEVsZW1lbnRIYW5kbGUgZXh0ZW5kcyBFbGVtZW50SGFuZGxlIG5vdyB0byBrZWVwIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggYGluc3RhbmNlb2ZgIGJlY2F1c2Ugb2YgdGhhdCB3ZSBuZWVkIHRvIGhhdmUgbWV0aG9kcyBmb3JcbiAqIENkcEpTSGFuZGxlIHRvIGluIHRoaXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xubGV0IENkcEVsZW1lbnRIYW5kbGUgPSAoKCkgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgbGV0IF9jbGFzc1N1cGVyID0gRWxlbWVudEhhbmRsZTtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX2NvbnRlbnRGcmFtZV9kZWNvcmF0b3JzO1xuICAgIGxldCBfc2Nyb2xsSW50b1ZpZXdfZGVjb3JhdG9ycztcbiAgICBsZXQgX3VwbG9hZEZpbGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX2F1dG9maWxsX2RlY29yYXRvcnM7XG4gICAgcmV0dXJuIGNsYXNzIENkcEVsZW1lbnRIYW5kbGUgZXh0ZW5kcyBfY2xhc3NTdXBlciB7XG4gICAgICAgIHN0YXRpYyB7XG4gICAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwO1xuICAgICAgICAgICAgX2NvbnRlbnRGcmFtZV9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpXTtcbiAgICAgICAgICAgIF9zY3JvbGxJbnRvVmlld19kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX2EgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfYSldO1xuICAgICAgICAgICAgX3VwbG9hZEZpbGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9iID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2IpXTtcbiAgICAgICAgICAgIF9hdXRvZmlsbF9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpXTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfY29udGVudEZyYW1lX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJjb250ZW50RnJhbWVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImNvbnRlbnRGcmFtZVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmNvbnRlbnRGcmFtZSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2Nyb2xsSW50b1ZpZXdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInNjcm9sbEludG9WaWV3XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzY3JvbGxJbnRvVmlld1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNjcm9sbEludG9WaWV3IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF91cGxvYWRGaWxlX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJ1cGxvYWRGaWxlXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ1cGxvYWRGaWxlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudXBsb2FkRmlsZSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfYXV0b2ZpbGxfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImF1dG9maWxsXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJhdXRvZmlsbFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmF1dG9maWxsIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0cnVjdG9yKHdvcmxkLCByZW1vdGVPYmplY3QpIHtcbiAgICAgICAgICAgIHN1cGVyKG5ldyBDZHBKU0hhbmRsZSh3b3JsZCwgcmVtb3RlT2JqZWN0KSk7XG4gICAgICAgICAgICBfX3J1bkluaXRpYWxpemVycyh0aGlzLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHJlYWxtKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLnJlYWxtO1xuICAgICAgICB9XG4gICAgICAgIGdldCBjbGllbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGUuY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIHJlbW90ZU9iamVjdCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZS5yZW1vdGVPYmplY3QoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI2ZyYW1lTWFuYWdlcigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZyYW1lLl9mcmFtZU1hbmFnZXI7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGZyYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhbG0uZW52aXJvbm1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgY29udGVudEZyYW1lKCkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUluZm8gPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uZGVzY3JpYmVOb2RlJywge1xuICAgICAgICAgICAgICAgIG9iamVjdElkOiB0aGlzLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGVJbmZvLm5vZGUuZnJhbWVJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNmcmFtZU1hbmFnZXIuZnJhbWUobm9kZUluZm8ubm9kZS5mcmFtZUlkKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBzY3JvbGxJbnRvVmlldygpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0Q29ubmVjdGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byBFbGVtZW50LnNjcm9sbEludG9WaWV3IGlmIERPTS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkIGlzIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICBhd2FpdCBzdXBlci5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHVwbG9hZEZpbGUoLi4uZmlsZVBhdGhzKSB7XG4gICAgICAgICAgICBjb25zdCBpc011bHRpcGxlID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5tdWx0aXBsZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXNzZXJ0KGZpbGVQYXRocy5sZW5ndGggPD0gMSB8fCBpc011bHRpcGxlLCAnTXVsdGlwbGUgZmlsZSB1cGxvYWRzIG9ubHkgd29yayB3aXRoIDxpbnB1dCB0eXBlPWZpbGUgbXVsdGlwbGU+Jyk7XG4gICAgICAgICAgICAvLyBMb2NhdGUgYWxsIGZpbGVzIGFuZCBjb25maXJtIHRoYXQgdGhleSBleGlzdC5cbiAgICAgICAgICAgIGxldCBwYXRoO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXRoID0gYXdhaXQgaW1wb3J0KCdwYXRoJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBKU0hhbmRsZSN1cGxvYWRGaWxlIGNhbiBvbmx5IGJlIHVzZWQgaW4gTm9kZS1saWtlIGVudmlyb25tZW50cy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGZpbGVQYXRocy5tYXAoZmlsZVBhdGggPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoLndpbjMyLmlzQWJzb2x1dGUoZmlsZVBhdGgpIHx8IHBhdGgucG9zaXguaXNBYnNvbHV0ZShmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSB6ZXJvLWxlbmd0aCBhcnJheSBpcyBhIHNwZWNpYWwgY2FzZSwgaXQgc2VlbXMgdGhhdFxuICAgICAgICAgICAgICogRE9NLnNldEZpbGVJbnB1dEZpbGVzIGRvZXMgbm90IGFjdHVhbGx5IHVwZGF0ZSB0aGUgZmlsZXMgaW4gdGhhdCBjYXNlLCBzb1xuICAgICAgICAgICAgICogdGhlIHNvbHV0aW9uIGlzIHRvIGV2YWwgdGhlIGVsZW1lbnQgdmFsdWUgdG8gYSBuZXcgRmlsZUxpc3QgZGlyZWN0bHkuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBYWFg6IFRoZXNlIGV2ZW50cyBzaG91bGQgY29udmVydGVkIHRvIHRydXN0ZWQgZXZlbnRzLiBQZXJoYXBzIGRvIHRoaXNcbiAgICAgICAgICAgICAgICAvLyBpbiBgRE9NLnNldEZpbGVJbnB1dEZpbGVzYD9cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZpbGVzID0gbmV3IERhdGFUcmFuc2ZlcigpLmZpbGVzO1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaCBldmVudHMgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIGl0IHNob3VsZCBiZWhhdmUgYWtpbiB0byBhIHVzZXIgYWN0aW9uLlxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgbm9kZTogeyBiYWNrZW5kTm9kZUlkIH0sIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uZGVzY3JpYmVOb2RlJywge1xuICAgICAgICAgICAgICAgIG9iamVjdElkOiB0aGlzLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uc2V0RmlsZUlucHV0RmlsZXMnLCB7XG4gICAgICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZmlsZXMsXG4gICAgICAgICAgICAgICAgYmFja2VuZE5vZGVJZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGF1dG9maWxsKGRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJbmZvID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnRE9NLmRlc2NyaWJlTm9kZScsIHtcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5oYW5kbGUuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkSWQgPSBub2RlSW5mby5ub2RlLmJhY2tlbmROb2RlSWQ7XG4gICAgICAgICAgICBjb25zdCBmcmFtZUlkID0gdGhpcy5mcmFtZS5faWQ7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdBdXRvZmlsbC50cmlnZ2VyJywge1xuICAgICAgICAgICAgICAgIGZpZWxkSWQsXG4gICAgICAgICAgICAgICAgZnJhbWVJZCxcbiAgICAgICAgICAgICAgICBjYXJkOiBkYXRhLmNyZWRpdENhcmQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyAqcXVlcnlBWFRyZWUobmFtZSwgcm9sZSkge1xuICAgICAgICAgICAgY29uc3QgeyBub2RlcyB9ID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnQWNjZXNzaWJpbGl0eS5xdWVyeUFYVHJlZScsIHtcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBhY2Nlc3NpYmxlTmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gbm9kZXMuZmlsdGVyKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmlnbm9yZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUucm9sZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChOT05fRUxFTUVOVF9OT0RFX1JPTEVTLmhhcyhub2RlLnJvbGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogQXN5bmNJdGVyYWJsZVV0aWwubWFwKHJlc3VsdHMsIG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWxtLmFkb3B0QmFja2VuZE5vZGUobm9kZS5iYWNrZW5kRE9NTm9kZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5leHBvcnQgeyBDZHBFbGVtZW50SGFuZGxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbGVtZW50SGFuZGxlLmpzLm1hcCIsInZhciBfX3J1bkluaXRpYWxpemVycyA9ICh0aGlzICYmIHRoaXMuX19ydW5Jbml0aWFsaXplcnMpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG52YXIgX19lc0RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2VzRGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICAgIGRvbmUgPSB0cnVlO1xufTtcbnZhciBfX3NldEZ1bmN0aW9uTmFtZSA9ICh0aGlzICYmIHRoaXMuX19zZXRGdW5jdGlvbk5hbWUpIHx8IGZ1bmN0aW9uIChmLCBuYW1lLCBwcmVmaXgpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbkV2ZW50IH0gZnJvbSAnLi4vYXBpL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IGludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHMgfSBmcm9tICcuLi91dGlsL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRW11bGF0ZWRTdGF0ZSB7XG4gICAgI3N0YXRlO1xuICAgICNjbGllbnRQcm92aWRlcjtcbiAgICAjdXBkYXRlcjtcbiAgICBjb25zdHJ1Y3Rvcihpbml0aWFsU3RhdGUsIGNsaWVudFByb3ZpZGVyLCB1cGRhdGVyKSB7XG4gICAgICAgIHRoaXMuI3N0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgICAgICB0aGlzLiNjbGllbnRQcm92aWRlciA9IGNsaWVudFByb3ZpZGVyO1xuICAgICAgICB0aGlzLiN1cGRhdGVyID0gdXBkYXRlcjtcbiAgICAgICAgdGhpcy4jY2xpZW50UHJvdmlkZXIucmVnaXN0ZXJTdGF0ZSh0aGlzKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0U3RhdGUoc3RhdGUpIHtcbiAgICAgICAgdGhpcy4jc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gICAgfVxuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3N0YXRlO1xuICAgIH1cbiAgICBhc3luYyBzeW5jKCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLiNjbGllbnRQcm92aWRlci5jbGllbnRzKCkubWFwKGNsaWVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jdXBkYXRlcihjbGllbnQsIHRoaXMuI3N0YXRlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBFbXVsYXRpb25NYW5hZ2VyID0gKCgpID0+IHtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX3ByaXZhdGVfYXBwbHlWaWV3cG9ydF9kZWNvcmF0b3JzO1xuICAgIGxldCBfcHJpdmF0ZV9hcHBseVZpZXdwb3J0X2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVJZGxlU3RhdGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfZW11bGF0ZUlkbGVTdGF0ZV9kZXNjcmlwdG9yO1xuICAgIGxldCBfcHJpdmF0ZV9lbXVsYXRlVGltZXpvbmVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVWaXNpb25EZWZpY2llbmN5X2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVWaXNpb25EZWZpY2llbmN5X2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVNZWRpYUZlYXR1cmVzX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVNZWRpYUZlYXR1cmVzX2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVNZWRpYVR5cGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfZW11bGF0ZU1lZGlhVHlwZV9kZXNjcmlwdG9yO1xuICAgIGxldCBfcHJpdmF0ZV9zZXRHZW9sb2NhdGlvbl9kZWNvcmF0b3JzO1xuICAgIGxldCBfcHJpdmF0ZV9zZXRHZW9sb2NhdGlvbl9kZXNjcmlwdG9yO1xuICAgIGxldCBfcHJpdmF0ZV9zZXREZWZhdWx0QmFja2dyb3VuZENvbG9yX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX3NldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3JfZGVzY3JpcHRvcjtcbiAgICBsZXQgX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVzY3JpcHRvcjtcbiAgICByZXR1cm4gY2xhc3MgRW11bGF0aW9uTWFuYWdlciB7XG4gICAgICAgIHN0YXRpYyB7XG4gICAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9wcml2YXRlX2FwcGx5Vmlld3BvcnRfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX2VtdWxhdGVJZGxlU3RhdGVfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX2VtdWxhdGVUaW1lem9uZV9kZWNvcmF0b3JzID0gW2ludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHNdO1xuICAgICAgICAgICAgX3ByaXZhdGVfZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2RlY29yYXRvcnMgPSBbaW52b2tlQXRNb3N0T25jZUZvckFyZ3VtZW50c107XG4gICAgICAgICAgICBfcHJpdmF0ZV9lbXVsYXRlTWVkaWFGZWF0dXJlc19kZWNvcmF0b3JzID0gW2ludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHNdO1xuICAgICAgICAgICAgX3ByaXZhdGVfZW11bGF0ZU1lZGlhVHlwZV9kZWNvcmF0b3JzID0gW2ludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHNdO1xuICAgICAgICAgICAgX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX3NldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3JfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX3NldEphdmFTY3JpcHRFbmFibGVkX2RlY29yYXRvcnMgPSBbaW52b2tlQXRNb3N0T25jZUZvckFyZ3VtZW50c107XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfYXBwbHlWaWV3cG9ydF9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZpZXdwb3J0U3RhdGUudmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2VuZCgnRW11bGF0aW9uLmNsZWFyRGV2aWNlTWV0cmljc092ZXJyaWRlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRUb3VjaEVtdWxhdGlvbkVuYWJsZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB2aWV3cG9ydCB9ID0gdmlld3BvcnRTdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9iaWxlID0gdmlld3BvcnQuaXNNb2JpbGUgfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gdmlld3BvcnQud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHZpZXdwb3J0LmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlU2NhbGVGYWN0b3IgPSB2aWV3cG9ydC5kZXZpY2VTY2FsZUZhY3RvciA/PyAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JlZW5PcmllbnRhdGlvbiA9IHZpZXdwb3J0LmlzTGFuZHNjYXBlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHsgYW5nbGU6IDkwLCB0eXBlOiAnbGFuZHNjYXBlUHJpbWFyeScgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7IGFuZ2xlOiAwLCB0eXBlOiAncG9ydHJhaXRQcmltYXJ5JyB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNUb3VjaCA9IHZpZXdwb3J0Lmhhc1RvdWNoIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZCgnRW11bGF0aW9uLnNldERldmljZU1ldHJpY3NPdmVycmlkZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2JpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbk9yaWVudGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ1RhcmdldCBkb2VzIG5vdCBzdXBwb3J0IG1ldHJpY3Mgb3ZlcnJpZGUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldFRvdWNoRW11bGF0aW9uRW5hYmxlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBoYXNUb3VjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9LCBcIiNhcHBseVZpZXdwb3J0XCIpIH0sIF9wcml2YXRlX2FwcGx5Vmlld3BvcnRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNhcHBseVZpZXdwb3J0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjYXBwbHlWaWV3cG9ydCBpbiBvYmosIGdldDogb2JqID0+IG9iai4jYXBwbHlWaWV3cG9ydCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9lbXVsYXRlSWRsZVN0YXRlX2Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfX3NldEZ1bmN0aW9uTmFtZShhc3luYyBmdW5jdGlvbiAoY2xpZW50LCBpZGxlU3RhdGVTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlkbGVTdGF0ZVN0YXRlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZGxlU3RhdGVTdGF0ZS5vdmVycmlkZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdFbXVsYXRpb24uc2V0SWRsZU92ZXJyaWRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVXNlckFjdGl2ZTogaWRsZVN0YXRlU3RhdGUub3ZlcnJpZGVzLmlzVXNlckFjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NjcmVlblVubG9ja2VkOiBpZGxlU3RhdGVTdGF0ZS5vdmVycmlkZXMuaXNTY3JlZW5VbmxvY2tlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5jbGVhcklkbGVPdmVycmlkZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgXCIjZW11bGF0ZUlkbGVTdGF0ZVwiKSB9LCBfcHJpdmF0ZV9lbXVsYXRlSWRsZVN0YXRlX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZUlkbGVTdGF0ZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI2VtdWxhdGVJZGxlU3RhdGUgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouI2VtdWxhdGVJZGxlU3RhdGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfX3NldEZ1bmN0aW9uTmFtZShhc3luYyBmdW5jdGlvbiAoY2xpZW50LCB0aW1lem9uZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGltZXpvbmVTdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRUaW1lem9uZU92ZXJyaWRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV6b25lSWQ6IHRpbWV6b25lU3RhdGUudGltZXpvbmVJZCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRXJyb3JMaWtlKGVycm9yKSAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIHRpbWV6b25lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGltZXpvbmUgSUQ6ICR7dGltZXpvbmVTdGF0ZS50aW1lem9uZUlkfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBcIiNlbXVsYXRlVGltZXpvbmVcIikgfSwgX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZVRpbWV6b25lXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjZW11bGF0ZVRpbWV6b25lIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNlbXVsYXRlVGltZXpvbmUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lfZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChjbGllbnQsIHZpc2lvbkRlZmljaWVuY3kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2aXNpb25EZWZpY2llbmN5LmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdFbXVsYXRpb24uc2V0RW11bGF0ZWRWaXNpb25EZWZpY2llbmN5Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdmlzaW9uRGVmaWNpZW5jeS52aXNpb25EZWZpY2llbmN5IHx8ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgXCIjZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lcIikgfSwgX3ByaXZhdGVfZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNlbXVsYXRlVmlzaW9uRGVmaWNpZW5jeVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI2VtdWxhdGVWaXNpb25EZWZpY2llbmN5IGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNlbXVsYXRlVmlzaW9uRGVmaWNpZW5jeSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9lbXVsYXRlQ3B1VGhyb3R0bGluZ19kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldENQVVRocm90dGxpbmdSYXRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogc3RhdGUuZmFjdG9yID8/IDEsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIFwiI2VtdWxhdGVDcHVUaHJvdHRsaW5nXCIpIH0sIF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZUNwdVRocm90dGxpbmdcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogdHJ1ZSwgYWNjZXNzOiB7IGhhczogb2JqID0+ICNlbXVsYXRlQ3B1VGhyb3R0bGluZyBpbiBvYmosIGdldDogb2JqID0+IG9iai4jZW11bGF0ZUNwdVRocm90dGxpbmcgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZU1lZGlhRmVhdHVyZXNfZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChjbGllbnQsIHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRFbXVsYXRlZE1lZGlhJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IHN0YXRlLm1lZGlhRmVhdHVyZXMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIFwiI2VtdWxhdGVNZWRpYUZlYXR1cmVzXCIpIH0sIF9wcml2YXRlX2VtdWxhdGVNZWRpYUZlYXR1cmVzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZU1lZGlhRmVhdHVyZXNcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogdHJ1ZSwgYWNjZXNzOiB7IGhhczogb2JqID0+ICNlbXVsYXRlTWVkaWFGZWF0dXJlcyBpbiBvYmosIGdldDogb2JqID0+IG9iai4jZW11bGF0ZU1lZGlhRmVhdHVyZXMgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZU1lZGlhVHlwZV9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldEVtdWxhdGVkTWVkaWEnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTogc3RhdGUudHlwZSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgXCIjZW11bGF0ZU1lZGlhVHlwZVwiKSB9LCBfcHJpdmF0ZV9lbXVsYXRlTWVkaWFUeXBlX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZU1lZGlhVHlwZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI2VtdWxhdGVNZWRpYVR5cGUgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouI2VtdWxhdGVNZWRpYVR5cGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChjbGllbnQsIHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRHZW9sb2NhdGlvbk92ZXJyaWRlJywgc3RhdGUuZ2VvTG9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogc3RhdGUuZ2VvTG9jYXRpb24ubG9uZ2l0dWRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlOiBzdGF0ZS5nZW9Mb2NhdGlvbi5sYXRpdHVkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeTogc3RhdGUuZ2VvTG9jYXRpb24uYWNjdXJhY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfSwgXCIjc2V0R2VvbG9jYXRpb25cIikgfSwgX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNzZXRHZW9sb2NhdGlvblwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI3NldEdlb2xvY2F0aW9uIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNzZXRHZW9sb2NhdGlvbiB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9zZXREZWZhdWx0QmFja2dyb3VuZENvbG9yX2Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfX3NldEZ1bmN0aW9uTmFtZShhc3luYyBmdW5jdGlvbiAoY2xpZW50LCBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdFbXVsYXRpb24uc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvck92ZXJyaWRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHN0YXRlLmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCBcIiNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yXCIpIH0sIF9wcml2YXRlX3NldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3JfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvciBpbiBvYmosIGdldDogb2JqID0+IG9iai4jc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvciB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9zZXRKYXZhU2NyaXB0RW5hYmxlZF9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldFNjcmlwdEV4ZWN1dGlvbkRpc2FibGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICFzdGF0ZS5qYXZhU2NyaXB0RW5hYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgXCIjc2V0SmF2YVNjcmlwdEVuYWJsZWRcIikgfSwgX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNzZXRKYXZhU2NyaXB0RW5hYmxlZFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI3NldEphdmFTY3JpcHRFbmFibGVkIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNzZXRKYXZhU2NyaXB0RW5hYmxlZCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICAjY2xpZW50ID0gX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAjZW11bGF0aW5nTW9iaWxlID0gZmFsc2U7XG4gICAgICAgICNoYXNUb3VjaCA9IGZhbHNlO1xuICAgICAgICAjc3RhdGVzID0gW107XG4gICAgICAgICN2aWV3cG9ydFN0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jYXBwbHlWaWV3cG9ydCk7XG4gICAgICAgICNpZGxlT3ZlcnJpZGVzU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNlbXVsYXRlSWRsZVN0YXRlKTtcbiAgICAgICAgI3RpbWV6b25lU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNlbXVsYXRlVGltZXpvbmUpO1xuICAgICAgICAjdmlzaW9uRGVmaWNpZW5jeVN0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jZW11bGF0ZVZpc2lvbkRlZmljaWVuY3kpO1xuICAgICAgICAjY3B1VGhyb3R0bGluZ1N0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jZW11bGF0ZUNwdVRocm90dGxpbmcpO1xuICAgICAgICAjbWVkaWFGZWF0dXJlc1N0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jZW11bGF0ZU1lZGlhRmVhdHVyZXMpO1xuICAgICAgICAjbWVkaWFUeXBlU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNlbXVsYXRlTWVkaWFUeXBlKTtcbiAgICAgICAgI2dlb0xvY2F0aW9uU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNzZXRHZW9sb2NhdGlvbik7XG4gICAgICAgICNkZWZhdWx0QmFja2dyb3VuZENvbG9yU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgI2phdmFzY3JpcHRFbmFibGVkU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBqYXZhU2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgIH0sIHRoaXMsIHRoaXMuI3NldEphdmFTY3JpcHRFbmFibGVkKTtcbiAgICAgICAgI3NlY29uZGFyeUNsaWVudHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGNvbnN0cnVjdG9yKGNsaWVudCkge1xuICAgICAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUNsaWVudChjbGllbnQpIHtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICAgICAgICAgIHRoaXMuI3NlY29uZGFyeUNsaWVudHMuZGVsZXRlKGNsaWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVnaXN0ZXJTdGF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy4jc3RhdGVzLnB1c2goc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGNsaWVudHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gW3RoaXMuI2NsaWVudCwgLi4uQXJyYXkuZnJvbSh0aGlzLiNzZWNvbmRhcnlDbGllbnRzKV07XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgcmVnaXN0ZXJTcGVjdWxhdGl2ZVNlc3Npb24oY2xpZW50KSB7XG4gICAgICAgICAgICB0aGlzLiNzZWNvbmRhcnlDbGllbnRzLmFkZChjbGllbnQpO1xuICAgICAgICAgICAgY2xpZW50Lm9uY2UoQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI3NlY29uZGFyeUNsaWVudHMuZGVsZXRlKGNsaWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IGF3YWl0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvIHJlZ2lzdGVyIGFsbCBzdGF0ZSBjaGFuZ2VzIGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBpcyB1bnBhdXNlZC5cbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGwodGhpcy4jc3RhdGVzLm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcy5zeW5jKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGphdmFzY3JpcHRFbmFibGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2phdmFzY3JpcHRFbmFibGVkU3RhdGUuc3RhdGUuamF2YVNjcmlwdEVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgZW11bGF0ZVZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLiN2aWV3cG9ydFN0YXRlLnN0YXRlO1xuICAgICAgICAgICAgaWYgKCF2aWV3cG9ydCAmJiAhY3VycmVudFN0YXRlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3ZpZXdwb3J0U3RhdGUuc2V0U3RhdGUodmlld3BvcnRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgdmlld3BvcnQsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBtb2JpbGUgPSB2aWV3cG9ydD8uaXNNb2JpbGUgfHwgZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBoYXNUb3VjaCA9IHZpZXdwb3J0Py5oYXNUb3VjaCB8fCBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHJlbG9hZE5lZWRlZCA9IHRoaXMuI2VtdWxhdGluZ01vYmlsZSAhPT0gbW9iaWxlIHx8IHRoaXMuI2hhc1RvdWNoICE9PSBoYXNUb3VjaDtcbiAgICAgICAgICAgIHRoaXMuI2VtdWxhdGluZ01vYmlsZSA9IG1vYmlsZTtcbiAgICAgICAgICAgIHRoaXMuI2hhc1RvdWNoID0gaGFzVG91Y2g7XG4gICAgICAgICAgICByZXR1cm4gcmVsb2FkTmVlZGVkO1xuICAgICAgICB9XG4gICAgICAgIGdldCAjYXBwbHlWaWV3cG9ydCgpIHsgcmV0dXJuIF9wcml2YXRlX2FwcGx5Vmlld3BvcnRfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBlbXVsYXRlSWRsZVN0YXRlKG92ZXJyaWRlcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jaWRsZU92ZXJyaWRlc1N0YXRlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0ICNlbXVsYXRlSWRsZVN0YXRlKCkgeyByZXR1cm4gX3ByaXZhdGVfZW11bGF0ZUlkbGVTdGF0ZV9kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIGdldCAjZW11bGF0ZVRpbWV6b25lKCkgeyByZXR1cm4gX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2Rlc2NyaXB0b3IudmFsdWU7IH1cbiAgICAgICAgYXN5bmMgZW11bGF0ZVRpbWV6b25lKHRpbWV6b25lSWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3RpbWV6b25lU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHRpbWV6b25lSWQsXG4gICAgICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0ICNlbXVsYXRlVmlzaW9uRGVmaWNpZW5jeSgpIHsgcmV0dXJuIF9wcml2YXRlX2VtdWxhdGVWaXNpb25EZWZpY2llbmN5X2Rlc2NyaXB0b3IudmFsdWU7IH1cbiAgICAgICAgYXN5bmMgZW11bGF0ZVZpc2lvbkRlZmljaWVuY3kodHlwZSkge1xuICAgICAgICAgICAgY29uc3QgdmlzaW9uRGVmaWNpZW5jaWVzID0gbmV3IFNldChbXG4gICAgICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgICAgICdhY2hyb21hdG9wc2lhJyxcbiAgICAgICAgICAgICAgICAnYmx1cnJlZFZpc2lvbicsXG4gICAgICAgICAgICAgICAgJ2RldXRlcmFub3BpYScsXG4gICAgICAgICAgICAgICAgJ3Byb3Rhbm9waWEnLFxuICAgICAgICAgICAgICAgICd0cml0YW5vcGlhJyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgYXNzZXJ0KCF0eXBlIHx8IHZpc2lvbkRlZmljaWVuY2llcy5oYXModHlwZSksIGBVbnN1cHBvcnRlZCB2aXNpb24gZGVmaWNpZW5jeTogJHt0eXBlfWApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jdmlzaW9uRGVmaWNpZW5jeVN0YXRlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmlzaW9uRGVmaWNpZW5jeTogdHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCAjZW11bGF0ZUNwdVRocm90dGxpbmcoKSB7IHJldHVybiBfcHJpdmF0ZV9lbXVsYXRlQ3B1VGhyb3R0bGluZ19kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIGFzeW5jIGVtdWxhdGVDUFVUaHJvdHRsaW5nKGZhY3Rvcikge1xuICAgICAgICAgICAgYXNzZXJ0KGZhY3RvciA9PT0gbnVsbCB8fCBmYWN0b3IgPj0gMSwgJ1Rocm90dGxpbmcgcmF0ZSBzaG91bGQgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxJyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNjcHVUaHJvdHRsaW5nU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBmYWN0b3I6IGZhY3RvciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI2VtdWxhdGVNZWRpYUZlYXR1cmVzKCkgeyByZXR1cm4gX3ByaXZhdGVfZW11bGF0ZU1lZGlhRmVhdHVyZXNfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBlbXVsYXRlTWVkaWFGZWF0dXJlcyhmZWF0dXJlcykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmVhdHVyZXMpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtZWRpYUZlYXR1cmUgb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IG1lZGlhRmVhdHVyZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQoL14oPzpwcmVmZXJzLSg/OmNvbG9yLXNjaGVtZXxyZWR1Y2VkLW1vdGlvbil8Y29sb3ItZ2FtdXQpJC8udGVzdChuYW1lKSwgJ1Vuc3VwcG9ydGVkIG1lZGlhIGZlYXR1cmU6ICcgKyBuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNtZWRpYUZlYXR1cmVzU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZWRpYUZlYXR1cmVzOiBmZWF0dXJlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCAjZW11bGF0ZU1lZGlhVHlwZSgpIHsgcmV0dXJuIF9wcml2YXRlX2VtdWxhdGVNZWRpYVR5cGVfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBlbXVsYXRlTWVkaWFUeXBlKHR5cGUpIHtcbiAgICAgICAgICAgIGFzc2VydCh0eXBlID09PSAnc2NyZWVuJyB8fFxuICAgICAgICAgICAgICAgIHR5cGUgPT09ICdwcmludCcgfHxcbiAgICAgICAgICAgICAgICAodHlwZSA/PyB1bmRlZmluZWQpID09PSB1bmRlZmluZWQsICdVbnN1cHBvcnRlZCBtZWRpYSB0eXBlOiAnICsgdHlwZSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNtZWRpYVR5cGVTdGF0ZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI3NldEdlb2xvY2F0aW9uKCkgeyByZXR1cm4gX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBzZXRHZW9sb2NhdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCB7IGxvbmdpdHVkZSwgbGF0aXR1ZGUsIGFjY3VyYWN5ID0gMCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGlmIChsb25naXR1ZGUgPCAtMTgwIHx8IGxvbmdpdHVkZSA+IDE4MCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb25naXR1ZGUgXCIke2xvbmdpdHVkZX1cIjogcHJlY29uZGl0aW9uIC0xODAgPD0gTE9OR0lUVURFIDw9IDE4MCBmYWlsZWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGF0aXR1ZGUgPCAtOTAgfHwgbGF0aXR1ZGUgPiA5MCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsYXRpdHVkZSBcIiR7bGF0aXR1ZGV9XCI6IHByZWNvbmRpdGlvbiAtOTAgPD0gTEFUSVRVREUgPD0gOTAgZmFpbGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFjY3VyYWN5IDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhY2N1cmFjeSBcIiR7YWNjdXJhY3l9XCI6IHByZWNvbmRpdGlvbiAwIDw9IEFDQ1VSQUNZIGZhaWxlZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2dlb0xvY2F0aW9uU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW9Mb2NhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGUsXG4gICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlLFxuICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0ICNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yKCkgeyByZXR1cm4gX3ByaXZhdGVfc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvcl9kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXNldHMgZGVmYXVsdCB3aGl0ZSBiYWNrZ3JvdW5kXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyByZXNldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNkZWZhdWx0QmFja2dyb3VuZENvbG9yU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhpZGVzIGRlZmF1bHQgd2hpdGUgYmFja2dyb3VuZFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNkZWZhdWx0QmFja2dyb3VuZENvbG9yU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogeyByOiAwLCBnOiAwLCBiOiAwLCBhOiAwIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI3NldEphdmFTY3JpcHRFbmFibGVkKCkgeyByZXR1cm4gX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBzZXRKYXZhU2NyaXB0RW5hYmxlZChlbmFibGVkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNqYXZhc2NyaXB0RW5hYmxlZFN0YXRlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgamF2YVNjcmlwdEVuYWJsZWQ6IGVuYWJsZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuZXhwb3J0IHsgRW11bGF0aW9uTWFuYWdlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RW11bGF0aW9uTWFuYWdlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbmltcG9ydCB7IENEUFNlc3Npb25FdmVudCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4uL2NvbW1vbi9MYXp5QXJnLmpzJztcbmltcG9ydCB7IHNjcmlwdEluamVjdG9yIH0gZnJvbSAnLi4vY29tbW9uL1NjcmlwdEluamVjdG9yLmpzJztcbmltcG9ydCB7IFB1cHBldGVlclVSTCwgU09VUkNFX1VSTF9SRUdFWCwgZGVidWdFcnJvciwgZ2V0U291cmNlUHVwcGV0ZWVyVVJMSWZBdmFpbGFibGUsIGdldFNvdXJjZVVybENvbW1lbnQsIGlzU3RyaW5nLCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IEFzeW5jSXRlcmFibGVVdGlsIH0gZnJvbSAnLi4vdXRpbC9Bc3luY0l0ZXJhYmxlVXRpbC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2ssIGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5RnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL0Z1bmN0aW9uLmpzJztcbmltcG9ydCB7IE11dGV4IH0gZnJvbSAnLi4vdXRpbC9NdXRleC5qcyc7XG5pbXBvcnQgeyBBUklBUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9BcmlhUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IEJpbmRpbmcgfSBmcm9tICcuL0JpbmRpbmcuanMnO1xuaW1wb3J0IHsgQ2RwRWxlbWVudEhhbmRsZSB9IGZyb20gJy4vRWxlbWVudEhhbmRsZS5qcyc7XG5pbXBvcnQgeyBDZHBKU0hhbmRsZSB9IGZyb20gJy4vSlNIYW5kbGUuanMnO1xuaW1wb3J0IHsgYWRkUGFnZUJpbmRpbmcsIENEUF9CSU5ESU5HX1BSRUZJWCwgY3JlYXRlRXZhbHVhdGlvbkVycm9yLCB2YWx1ZUZyb21SZW1vdGVPYmplY3QsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5jb25zdCBhcmlhUXVlcnlTZWxlY3RvckJpbmRpbmcgPSBuZXcgQmluZGluZygnX19hcmlhUXVlcnlTZWxlY3RvcicsIEFSSUFRdWVyeUhhbmRsZXIucXVlcnlPbmUsICcnIC8vIGN1c3RvbSBpbml0XG4pO1xuY29uc3QgYXJpYVF1ZXJ5U2VsZWN0b3JBbGxCaW5kaW5nID0gbmV3IEJpbmRpbmcoJ19fYXJpYVF1ZXJ5U2VsZWN0b3JBbGwnLCAoYXN5bmMgKGVsZW1lbnQsIHNlbGVjdG9yKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IEFSSUFRdWVyeUhhbmRsZXIucXVlcnlBbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICAgIHJldHVybiBhd2FpdCBlbGVtZW50LnJlYWxtLmV2YWx1YXRlSGFuZGxlKCguLi5lbGVtZW50cykgPT4ge1xuICAgICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfSwgLi4uKGF3YWl0IEFzeW5jSXRlcmFibGVVdGlsLmNvbGxlY3QocmVzdWx0cykpKTtcbn0pLCAnJyAvLyBjdXN0b20gaW5pdFxuKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICAjY2xpZW50O1xuICAgICN3b3JsZDtcbiAgICAjaWQ7XG4gICAgI25hbWU7XG4gICAgI2Rpc3Bvc2FibGVzID0gbmV3IERpc3Bvc2FibGVTdGFjaygpO1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCwgY29udGV4dFBheWxvYWQsIHdvcmxkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICAgICAgdGhpcy4jd29ybGQgPSB3b3JsZDtcbiAgICAgICAgdGhpcy4jaWQgPSBjb250ZXh0UGF5bG9hZC5pZDtcbiAgICAgICAgaWYgKGNvbnRleHRQYXlsb2FkLm5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuI25hbWUgPSBjb250ZXh0UGF5bG9hZC5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsaWVudEVtaXR0ZXIgPSB0aGlzLiNkaXNwb3NhYmxlcy51c2UobmV3IEV2ZW50RW1pdHRlcih0aGlzLiNjbGllbnQpKTtcbiAgICAgICAgY2xpZW50RW1pdHRlci5vbignUnVudGltZS5iaW5kaW5nQ2FsbGVkJywgdGhpcy4jb25CaW5kaW5nQ2FsbGVkLmJpbmQodGhpcykpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHREZXN0cm95ZWQnLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5leGVjdXRpb25Db250ZXh0SWQgPT09IHRoaXMuI2lkKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tkaXNwb3NlU3ltYm9sXSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY2xpZW50RW1pdHRlci5vbignUnVudGltZS5leGVjdXRpb25Db250ZXh0c0NsZWFyZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdSdW50aW1lLmNvbnNvbGVBUElDYWxsZWQnLCB0aGlzLiNvbkNvbnNvbGVBUEkuYmluZCh0aGlzKSk7XG4gICAgICAgIGNsaWVudEVtaXR0ZXIub24oQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpc1tkaXNwb3NlU3ltYm9sXSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ29udGFpbnMgbWFwcGluZyBmcm9tIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBib3VuZCB0byBQdXBwZXRlZXIgZnVuY3Rpb25zLlxuICAgICNiaW5kaW5ncyA9IG5ldyBNYXAoKTtcbiAgICAvLyBJZiBtdWx0aXBsZSB3YWl0Rm9yIGFyZSBzZXQgdXAgYXN5bmNocm9ub3VzbHksIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlXG4gICAgLy8gZmlyc3Qgb25lIHRvIHNldCB1cCB0aGUgYmluZGluZyBpbiB0aGUgcGFnZSBiZWZvcmUgcnVubmluZyB0aGUgb3RoZXJzLlxuICAgICNtdXRleCA9IG5ldyBNdXRleCgpO1xuICAgIGFzeW5jICNhZGRCaW5kaW5nKGJpbmRpbmcpIHtcbiAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jYmluZGluZ3MuaGFzKGJpbmRpbmcubmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBfID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHRoaXMuI211dGV4LmFjcXVpcmUoKSwgZmFsc2UpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnUnVudGltZS5hZGRCaW5kaW5nJywgdGhpcy4jbmFtZVxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IENEUF9CSU5ESU5HX1BSRUZJWCArIGJpbmRpbmcubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHROYW1lOiB0aGlzLiNuYW1lLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogQ0RQX0JJTkRJTkdfUFJFRklYICsgYmluZGluZy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dElkOiB0aGlzLiNpZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShhZGRQYWdlQmluZGluZywgJ2ludGVybmFsJywgYmluZGluZy5uYW1lLCBDRFBfQklORElOR19QUkVGSVgpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2JpbmRpbmdzLnNldChiaW5kaW5nLm5hbWUsIGJpbmRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY291bGQgaGF2ZSB0cmllZCB0byBldmFsdWF0ZSBpbiBhIGNvbnRleHQgd2hpY2ggd2FzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAvLyBkZXN0cm95ZWQuIFRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsIGlmIHRoZSBwYWdlIGlzIG5hdmlnYXRlZCB3aGlsZVxuICAgICAgICAgICAgICAgIC8vIHdlIGFyZSB0cnlpbmcgdG8gYWRkIHRoZSBiaW5kaW5nXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVzdHJveWVkIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFeGVjdXRpb24gY29udGV4dCB3YXMgZGVzdHJveWVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBNaXNzaW5nIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdDYW5ub3QgZmluZCBjb250ZXh0IHdpdGggc3BlY2lmaWVkIGlkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI29uQmluZGluZ0NhbGxlZChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQuZXhlY3V0aW9uQ29udGV4dElkICE9PSB0aGlzLiNpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXlsb2FkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoZXZlbnQucGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgLy8gVGhlIGJpbmRpbmcgd2FzIGVpdGhlciBjYWxsZWQgYnkgc29tZXRoaW5nIGluIHRoZSBwYWdlIG9yIGl0IHdhc1xuICAgICAgICAgICAgLy8gY2FsbGVkIGJlZm9yZSBvdXIgd3JhcHBlciB3YXMgaW5pdGlhbGl6ZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlLCBuYW1lLCBzZXEsIGFyZ3MsIGlzVHJpdmlhbCB9ID0gcGF5bG9hZDtcbiAgICAgICAgaWYgKHR5cGUgIT09ICdpbnRlcm5hbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYmluZGluZ2NhbGxlZCcsIGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuI2JpbmRpbmdzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdiaW5kaW5nY2FsbGVkJywgZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy4jYmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgYXdhaXQgYmluZGluZz8ucnVuKHRoaXMsIHNlcSwgYXJncywgaXNUcml2aWFsKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaWQ7XG4gICAgfVxuICAgICNvbkNvbnNvbGVBUEkoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmV4ZWN1dGlvbkNvbnRleHRJZCAhPT0gdGhpcy4jaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoJ2NvbnNvbGVhcGljYWxsZWQnLCBldmVudCk7XG4gICAgfVxuICAgICNiaW5kaW5nc0luc3RhbGxlZCA9IGZhbHNlO1xuICAgICNwdXBwZXRlZXJVdGlsO1xuICAgIGdldCBwdXBwZXRlZXJVdGlsKCkge1xuICAgICAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBpZiAoIXRoaXMuI2JpbmRpbmdzSW5zdGFsbGVkKSB7XG4gICAgICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2FkZEJpbmRpbmdXaXRob3V0VGhyb3dpbmcoYXJpYVF1ZXJ5U2VsZWN0b3JCaW5kaW5nKSxcbiAgICAgICAgICAgICAgICB0aGlzLiNhZGRCaW5kaW5nV2l0aG91dFRocm93aW5nKGFyaWFRdWVyeVNlbGVjdG9yQWxsQmluZGluZyksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHRoaXMuI2JpbmRpbmdzSW5zdGFsbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBzY3JpcHRJbmplY3Rvci5pbmplY3Qoc2NyaXB0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNwdXBwZXRlZXJVdGlsKSB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLiNwdXBwZXRlZXJVdGlsLnRoZW4oaGFuZGxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdm9pZCBoYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jcHVwcGV0ZWVyVXRpbCA9IHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVIYW5kbGUoc2NyaXB0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCAhdGhpcy4jcHVwcGV0ZWVyVXRpbCk7XG4gICAgICAgIHJldHVybiB0aGlzLiNwdXBwZXRlZXJVdGlsO1xuICAgIH1cbiAgICBhc3luYyAjYWRkQmluZGluZ1dpdGhvdXRUaHJvd2luZyhiaW5kaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNhZGRCaW5kaW5nKGJpbmRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZSBhZGRlZCwgdGhlbiBlaXRoZXIgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0XG4gICAgICAgICAgICAvLyBiaW5kaW5ncyAoZS5nLiBGaXJlZm94KSBvciB0aGUgY29udGV4dCBpcyBicm9rZW4uIEVpdGhlciBicmVha2FnZSBpc1xuICAgICAgICAgICAgLy8gb2theSwgc28gd2UgaWdub3JlIHRoZSBlcnJvci5cbiAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IGF3YWl0IHBhZ2UubWFpbkZyYW1lKCkuZXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGUoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKDggKiA3KSkqIDtcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBwcmludHMgXCI1NlwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIEEgc3RyaW5nIGNhbiBhbHNvIGJlIHBhc3NlZCBpbiBpbnN0ZWFkIG9mIGEgZnVuY3Rpb246XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnNvbGUubG9nKGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGUoJzEgKyAyJykpOyAvLyBwcmludHMgXCIzXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogSGFuZGxlcyBjYW4gYWxzbyBiZSBwYXNzZWQgYXMgYGFyZ3NgLiBUaGV5IHJlc29sdmUgdG8gdGhlaXIgcmVmZXJlbmNlZCBvYmplY3Q6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IG9uZUhhbmRsZSA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGVIYW5kbGUoKCkgPT4gMSk7XG4gICAgICogY29uc3QgdHdvSGFuZGxlID0gYXdhaXQgZXhlY3V0aW9uQ29udGV4dC5ldmFsdWF0ZUhhbmRsZSgoKSA9PiAyKTtcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRpb25Db250ZXh0LmV2YWx1YXRlKFxuICAgICAqICAgKGEsIGIpID0+IGEgKyBiLFxuICAgICAqICAgb25lSGFuZGxlLFxuICAgICAqICAgdHdvSGFuZGxlXG4gICAgICogKTtcbiAgICAgKiBhd2FpdCBvbmVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAqIGF3YWl0IHR3b0hhbmRsZS5kaXNwb3NlKCk7XG4gICAgICogY29uc29sZS5sb2cocmVzdWx0KTsgLy8gcHJpbnRzICczJy5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIGludG8gdGhlIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZnVuY3Rpb24uIElmIHRoZSByZXN1bHQgaXMgYW4gb2JqZWN0LFxuICAgICAqIGEgdmFuaWxsYSBvYmplY3QgY29udGFpbmluZyB0aGUgc2VyaWFsaXphYmxlIHByb3BlcnRpZXMgb2YgdGhlIHJlc3VsdCBpc1xuICAgICAqIHJldHVybmVkLlxuICAgICAqL1xuICAgIGFzeW5jIGV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZXZhbHVhdGUodHJ1ZSwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZhbHVhdGVzIHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIFVubGlrZSB7QGxpbmsgRXhlY3V0aW9uQ29udGV4dC5ldmFsdWF0ZSB8IGV2YWx1YXRlfSwgdGhpcyBtZXRob2QgcmV0dXJucyBhXG4gICAgICogaGFuZGxlIHRvIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGJldHRlciBzdWl0ZWQgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgc2VyaWFsaXplZCAoZS5nLlxuICAgICAqIGBNYXBgKSBhbmQgcmVxdWlyZXMgZnVydGhlciBtYW5pcHVsYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBjb250ZXh0ID0gYXdhaXQgcGFnZS5tYWluRnJhbWUoKS5leGVjdXRpb25Db250ZXh0KCk7XG4gICAgICogY29uc3QgaGFuZGxlOiBKU0hhbmRsZTx0eXBlb2YgZ2xvYmFsVGhpcz4gPSBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKFxuICAgICAqICAgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHNlbGYpXG4gICAgICogKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogQSBzdHJpbmcgY2FuIGFsc28gYmUgcGFzc2VkIGluIGluc3RlYWQgb2YgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgaGFuZGxlOiBKU0hhbmRsZTxudW1iZXI+ID0gYXdhaXQgY29udGV4dC5ldmFsdWF0ZUhhbmRsZSgnMSArIDInKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogSGFuZGxlcyBjYW4gYWxzbyBiZSBwYXNzZWQgYXMgYGFyZ3NgLiBUaGV5IHJlc29sdmUgdG8gdGhlaXIgcmVmZXJlbmNlZCBvYmplY3Q6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGJvZHlIYW5kbGU6IEVsZW1lbnRIYW5kbGU8SFRNTEJvZHlFbGVtZW50PiA9XG4gICAgICogICBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKCgpID0+IHtcbiAgICAgKiAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG4gICAgICogICB9KTtcbiAgICAgKiBjb25zdCBzdHJpbmdIYW5kbGU6IEpTSGFuZGxlPHN0cmluZz4gPSBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKFxuICAgICAqICAgYm9keSA9PiBib2R5LmlubmVySFRNTCxcbiAgICAgKiAgIGJvZHlcbiAgICAgKiApO1xuICAgICAqIGNvbnNvbGUubG9nKGF3YWl0IHN0cmluZ0hhbmRsZS5qc29uVmFsdWUoKSk7IC8vIHByaW50cyBib2R5J3MgaW5uZXJIVE1MXG4gICAgICogLy8gQWx3YXlzIGRpc3Bvc2UgeW91ciBnYXJiYWdlISA6KVxuICAgICAqIGF3YWl0IGJvZHlIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAqIGF3YWl0IHN0cmluZ0hhbmRsZS5kaXNwb3NlKCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFnZUZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyBpbnRvIHRoZSBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIHtAbGluayBKU0hhbmRsZSB8IGhhbmRsZX0gdG8gdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZVxuICAgICAqIGZ1bmN0aW9uLiBJZiB0aGUgcmVzdWx0IGlzIGEgYE5vZGVgLCB0aGVuIHRoaXMgd2lsbCByZXR1cm4gYW5cbiAgICAgKiB7QGxpbmsgRWxlbWVudEhhbmRsZSB8IGVsZW1lbnQgaGFuZGxlfS5cbiAgICAgKi9cbiAgICBhc3luYyBldmFsdWF0ZUhhbmRsZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2V2YWx1YXRlKGZhbHNlLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpO1xuICAgIH1cbiAgICBhc3luYyAjZXZhbHVhdGUocmV0dXJuQnlWYWx1ZSwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVVybENvbW1lbnQgPSBnZXRTb3VyY2VVcmxDb21tZW50KGdldFNvdXJjZVB1cHBldGVlclVSTElmQXZhaWxhYmxlKHBhZ2VGdW5jdGlvbik/LnRvU3RyaW5nKCkgPz9cbiAgICAgICAgICAgIFB1cHBldGVlclVSTC5JTlRFUk5BTF9VUkwpO1xuICAgICAgICBpZiAoaXNTdHJpbmcocGFnZUZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dElkID0gdGhpcy4jaWQ7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uID0gcGFnZUZ1bmN0aW9uO1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbldpdGhTb3VyY2VVcmwgPSBTT1VSQ0VfVVJMX1JFR0VYLnRlc3QoZXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICA/IGV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICA6IGAke2V4cHJlc3Npb259XFxuJHtzb3VyY2VVcmxDb21tZW50fVxcbmA7XG4gICAgICAgICAgICBjb25zdCB7IGV4Y2VwdGlvbkRldGFpbHMsIHJlc3VsdDogcmVtb3RlT2JqZWN0IH0gPSBhd2FpdCB0aGlzLiNjbGllbnRcbiAgICAgICAgICAgICAgICAuc2VuZCgnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uV2l0aFNvdXJjZVVybCxcbiAgICAgICAgICAgICAgICBjb250ZXh0SWQsXG4gICAgICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZSxcbiAgICAgICAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgICAgICAgdXNlckdlc3R1cmU6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZXdyaXRlRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbkRldGFpbHMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVFdmFsdWF0aW9uRXJyb3IoZXhjZXB0aW9uRGV0YWlscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuQnlWYWx1ZVxuICAgICAgICAgICAgICAgID8gdmFsdWVGcm9tUmVtb3RlT2JqZWN0KHJlbW90ZU9iamVjdClcbiAgICAgICAgICAgICAgICA6IHRoaXMuI3dvcmxkLmNyZWF0ZUNkcEhhbmRsZShyZW1vdGVPYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uRGVjbGFyYXRpb24gPSBzdHJpbmdpZnlGdW5jdGlvbihwYWdlRnVuY3Rpb24pO1xuICAgICAgICBjb25zdCBmdW5jdGlvbkRlY2xhcmF0aW9uV2l0aFNvdXJjZVVybCA9IFNPVVJDRV9VUkxfUkVHRVgudGVzdChmdW5jdGlvbkRlY2xhcmF0aW9uKVxuICAgICAgICAgICAgPyBmdW5jdGlvbkRlY2xhcmF0aW9uXG4gICAgICAgICAgICA6IGAke2Z1bmN0aW9uRGVjbGFyYXRpb259XFxuJHtzb3VyY2VVcmxDb21tZW50fVxcbmA7XG4gICAgICAgIGxldCBjYWxsRnVuY3Rpb25PblByb21pc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjYWxsRnVuY3Rpb25PblByb21pc2UgPSB0aGlzLiNjbGllbnQuc2VuZCgnUnVudGltZS5jYWxsRnVuY3Rpb25PbicsIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbkRlY2xhcmF0aW9uOiBmdW5jdGlvbkRlY2xhcmF0aW9uV2l0aFNvdXJjZVVybCxcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0SWQ6IHRoaXMuI2lkLFxuICAgICAgICAgICAgICAgIGFyZ3VtZW50czogYXJncy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBQcm9taXNlLmFsbChhcmdzLm1hcChjb252ZXJ0QXJndW1lbnQuYmluZCh0aGlzKSkpXG4gICAgICAgICAgICAgICAgICAgIDogW10sXG4gICAgICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZSxcbiAgICAgICAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgICAgICAgdXNlckdlc3R1cmU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJlxuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTicpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSArPSAnIFJlY3Vyc2l2ZSBvYmplY3RzIGFyZSBub3QgYWxsb3dlZC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBleGNlcHRpb25EZXRhaWxzLCByZXN1bHQ6IHJlbW90ZU9iamVjdCB9ID0gYXdhaXQgY2FsbEZ1bmN0aW9uT25Qcm9taXNlLmNhdGNoKHJld3JpdGVFcnJvcik7XG4gICAgICAgIGlmIChleGNlcHRpb25EZXRhaWxzKSB7XG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVFdmFsdWF0aW9uRXJyb3IoZXhjZXB0aW9uRGV0YWlscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldHVybkJ5VmFsdWVcbiAgICAgICAgICAgID8gdmFsdWVGcm9tUmVtb3RlT2JqZWN0KHJlbW90ZU9iamVjdClcbiAgICAgICAgICAgIDogdGhpcy4jd29ybGQuY3JlYXRlQ2RwSGFuZGxlKHJlbW90ZU9iamVjdCk7XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRBcmd1bWVudChhcmcpIHtcbiAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBMYXp5QXJnKSB7XG4gICAgICAgICAgICAgICAgYXJnID0gYXdhaXQgYXJnLmdldCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdmFsaWQtdHlwZW9mXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdW5zZXJpYWxpemFibGVWYWx1ZTogYCR7YXJnLnRvU3RyaW5nKCl9bmAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChPYmplY3QuaXMoYXJnLCAtMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB1bnNlcmlhbGl6YWJsZVZhbHVlOiAnLTAnIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmlzKGFyZywgSW5maW5pdHkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdW5zZXJpYWxpemFibGVWYWx1ZTogJ0luZmluaXR5JyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE9iamVjdC5pcyhhcmcsIC1JbmZpbml0eSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB1bnNlcmlhbGl6YWJsZVZhbHVlOiAnLUluZmluaXR5JyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE9iamVjdC5pcyhhcmcsIE5hTikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB1bnNlcmlhbGl6YWJsZVZhbHVlOiAnTmFOJyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SGFuZGxlID0gYXJnICYmIChhcmcgaW5zdGFuY2VvZiBDZHBKU0hhbmRsZSB8fCBhcmcgaW5zdGFuY2VvZiBDZHBFbGVtZW50SGFuZGxlKVxuICAgICAgICAgICAgICAgID8gYXJnXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgaWYgKG9iamVjdEhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGlmIChvYmplY3RIYW5kbGUucmVhbG0gIT09IHRoaXMuI3dvcmxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSlNIYW5kbGVzIGNhbiBiZSBldmFsdWF0ZWQgb25seSBpbiB0aGUgY29udGV4dCB0aGV5IHdlcmUgY3JlYXRlZCEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdEhhbmRsZS5kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pTSGFuZGxlIGlzIGRpc3Bvc2VkIScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0SGFuZGxlLnJlbW90ZU9iamVjdCgpLnVuc2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2VyaWFsaXphYmxlVmFsdWU6IG9iamVjdEhhbmRsZS5yZW1vdGVPYmplY3QoKS51bnNlcmlhbGl6YWJsZVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdEhhbmRsZS5yZW1vdGVPYmplY3QoKS5vYmplY3RJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogb2JqZWN0SGFuZGxlLnJlbW90ZU9iamVjdCgpLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IG9iamVjdElkOiBvYmplY3RIYW5kbGUucmVtb3RlT2JqZWN0KCkub2JqZWN0SWQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBhcmcgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2FibGVzLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5lbWl0KCdkaXNwb3NlZCcsIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuY29uc3QgcmV3cml0ZUVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ09iamVjdCByZWZlcmVuY2UgY2hhaW4gaXMgdG9vIGxvbmcnKSkge1xuICAgICAgICByZXR1cm4geyByZXN1bHQ6IHsgdHlwZTogJ3VuZGVmaW5lZCcgfSB9O1xuICAgIH1cbiAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIk9iamVjdCBjb3VsZG4ndCBiZSByZXR1cm5lZCBieSB2YWx1ZVwiKSkge1xuICAgICAgICByZXR1cm4geyByZXN1bHQ6IHsgdHlwZTogJ3VuZGVmaW5lZCcgfSB9O1xuICAgIH1cbiAgICBpZiAoZXJyb3IubWVzc2FnZS5lbmRzV2l0aCgnQ2Fubm90IGZpbmQgY29udGV4dCB3aXRoIHNwZWNpZmllZCBpZCcpIHx8XG4gICAgICAgIGVycm9yLm1lc3NhZ2UuZW5kc1dpdGgoJ0luc3BlY3RlZCB0YXJnZXQgbmF2aWdhdGVkIG9yIGNsb3NlZCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhlY3V0aW9uIGNvbnRleHQgd2FzIGRlc3Ryb3llZCwgbW9zdCBsaWtlbHkgYmVjYXVzZSBvZiBhIG5hdmlnYXRpb24uJyk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4ZWN1dGlvbkNvbnRleHQuanMubWFwIiwiY29uc3QgdGFiVGFyZ2V0SW5mbyA9IHtcbiAgICB0YXJnZXRJZDogJ3RhYlRhcmdldElkJyxcbiAgICB0eXBlOiAndGFiJyxcbiAgICB0aXRsZTogJ3RhYicsXG4gICAgdXJsOiAnYWJvdXQ6YmxhbmsnLFxuICAgIGF0dGFjaGVkOiBmYWxzZSxcbiAgICBjYW5BY2Nlc3NPcGVuZXI6IGZhbHNlLFxufTtcbmNvbnN0IHBhZ2VUYXJnZXRJbmZvID0ge1xuICAgIHRhcmdldElkOiAncGFnZVRhcmdldElkJyxcbiAgICB0eXBlOiAncGFnZScsXG4gICAgdGl0bGU6ICdwYWdlJyxcbiAgICB1cmw6ICdhYm91dDpibGFuaycsXG4gICAgYXR0YWNoZWQ6IGZhbHNlLFxuICAgIGNhbkFjY2Vzc09wZW5lcjogZmFsc2UsXG59O1xuLyoqXG4gKiBFeHBlcmltZW50YWwgRXh0ZW5zaW9uVHJhbnNwb3J0IGFsbG93cyBlc3RhYmxpc2hpbmcgYSBjb25uZWN0aW9uIHZpYVxuICogY2hyb21lLmRlYnVnZ2VyIEFQSSBpZiBQdXBwZXRlZXIgcnVucyBpbiBhbiBleHRlbnNpb24uIFNpbmNlIENocm9tZVxuICogRGV2VG9vbHMgUHJvdG9jb2wgaXMgcmVzdHJpY3RlZCBmb3IgZXh0ZW5zaW9ucywgdGhlIHRyYW5zcG9ydFxuICogaW1wbGVtZW50cyBtaXNzaW5nIGNvbW1hbmRzIGFuZCBldmVudHMuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uVHJhbnNwb3J0IHtcbiAgICBzdGF0aWMgYXN5bmMgY29ubmVjdFRhYih0YWJJZCkge1xuICAgICAgICBhd2FpdCBjaHJvbWUuZGVidWdnZXIuYXR0YWNoKHsgdGFiSWQgfSwgJzEuMycpO1xuICAgICAgICByZXR1cm4gbmV3IEV4dGVuc2lvblRyYW5zcG9ydCh0YWJJZCk7XG4gICAgfVxuICAgIG9ubWVzc2FnZTtcbiAgICBvbmNsb3NlO1xuICAgICN0YWJJZDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0YWJJZCkge1xuICAgICAgICB0aGlzLiN0YWJJZCA9IHRhYklkO1xuICAgICAgICBjaHJvbWUuZGVidWdnZXIub25FdmVudC5hZGRMaXN0ZW5lcih0aGlzLiNkZWJ1Z2dlckV2ZW50SGFuZGxlcik7XG4gICAgfVxuICAgICNkZWJ1Z2dlckV2ZW50SGFuZGxlciA9IChzb3VyY2UsIG1ldGhvZCwgcGFyYW1zKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UudGFiSWQgIT09IHRoaXMuI3RhYklkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHNlc3Npb25JZCBpcyBub3QgaW4gc3RhYmxlIHlldC5cbiAgICAgICAgICAgIHNlc3Npb25JZDogc291cmNlLnNlc3Npb25JZCA/PyAncGFnZVRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgICNkaXNwYXRjaFJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5vbm1lc3NhZ2U/LihKU09OLnN0cmluZ2lmeShtZXNzYWdlKSk7XG4gICAgfVxuICAgIHNlbmQobWVzc2FnZSkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgICAgICBzd2l0Y2ggKHBhcnNlZC5tZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Jyb3dzZXIuZ2V0VmVyc2lvbic6IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBhcnNlZC5pZCxcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXJzZWQuc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcnNlZC5tZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xWZXJzaW9uOiAnMS4zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Q6ICdjaHJvbWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb246ICd1bmtub3duJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJBZ2VudDogJ2Nocm9tZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBqc1ZlcnNpb246ICd1bmtub3duJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdUYXJnZXQuZ2V0QnJvd3NlckNvbnRleHRzJzoge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3BhdGNoUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgICAgICBpZDogcGFyc2VkLmlkLFxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHBhcnNlZC5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogcGFyc2VkLm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyQ29udGV4dElkczogW10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnVGFyZ2V0LnNldERpc2NvdmVyVGFyZ2V0cyc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEluZm86IHRhYlRhcmdldEluZm8sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1RhcmdldC50YXJnZXRDcmVhdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbmZvOiBwYWdlVGFyZ2V0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBhcnNlZC5pZCxcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXJzZWQuc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcnNlZC5tZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge30sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnVGFyZ2V0LnNldEF1dG9BdHRhY2gnOiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5zZXNzaW9uSWQgPT09ICd0YWJUYXJnZXRTZXNzaW9uSWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3BhdGNoUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnVGFyZ2V0LmF0dGFjaGVkVG9UYXJnZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5mbzogcGFnZVRhcmdldEluZm8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiAncGFnZVRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXBhcnNlZC5zZXNzaW9uSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdUYXJnZXQuYXR0YWNoZWRUb1RhcmdldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbmZvOiB0YWJUYXJnZXRJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDogJ3RhYlRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBwYXJzZWQuaWQsXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDogcGFyc2VkLnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBwYXJzZWQubWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHt9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLnNlc3Npb25JZCA9PT0gJ3BhZ2VUYXJnZXRTZXNzaW9uSWQnKSB7XG4gICAgICAgICAgICBkZWxldGUgcGFyc2VkLnNlc3Npb25JZDtcbiAgICAgICAgfVxuICAgICAgICBjaHJvbWUuZGVidWdnZXJcbiAgICAgICAgICAgIC5zZW5kQ29tbWFuZChcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzZXNzaW9uSWQgaXMgbm90IGluIHN0YWJsZSB5ZXQuXG4gICAgICAgIHsgdGFiSWQ6IHRoaXMuI3RhYklkLCBzZXNzaW9uSWQ6IHBhcnNlZC5zZXNzaW9uSWQgfSwgcGFyc2VkLm1ldGhvZCwgcGFyc2VkLnBhcmFtcylcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3BhdGNoUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgIGlkOiBwYXJzZWQuaWQsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXJzZWQuc2Vzc2lvbklkID8/ICdwYWdlVGFyZ2V0U2Vzc2lvbklkJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcnNlZC5tZXRob2QsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiByZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICBpZDogcGFyc2VkLmlkLFxuICAgICAgICAgICAgICAgIHNlc3Npb25JZDogcGFyc2VkLnNlc3Npb25JZCA/PyAncGFnZVRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBwYXJzZWQubWV0aG9kLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICBjaHJvbWUuZGVidWdnZXIub25FdmVudC5yZW1vdmVMaXN0ZW5lcih0aGlzLiNkZWJ1Z2dlckV2ZW50SGFuZGxlcik7XG4gICAgICAgIHZvaWQgY2hyb21lLmRlYnVnZ2VyLmRldGFjaCh7IHRhYklkOiB0aGlzLiN0YWJJZCB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeHRlbnNpb25UcmFuc3BvcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IENEUFNlc3Npb25FdmVudCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbi8qKlxuICogRmlyZWZveFRhcmdldE1hbmFnZXIgaW1wbGVtZW50cyB0YXJnZXQgbWFuYWdlbWVudCB1c2luZ1xuICogYFRhcmdldC5zZXREaXNjb3ZlclRhcmdldHNgIHdpdGhvdXQgdXNpbmcgYXV0by1hdHRhY2guIEl0LCB0aGVyZWZvcmUsIGNyZWF0ZXNcbiAqIHRhcmdldHMgdGhhdCBsYXppbHkgZXN0YWJsaXNoIHRoZWlyIENEUCBzZXNzaW9ucy5cbiAqXG4gKiBBbHRob3VnaCB0aGUgYXBwcm9hY2ggaXMgcG90ZW50aWFsbHkgZmxha3ksIHRoZXJlIGlzIG5vIG90aGVyIHdheSBmb3IgRmlyZWZveFxuICogYmVjYXVzZSBGaXJlZm94J3MgQ0RQIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgYXV0by1hdHRhY2guXG4gKlxuICogRmlyZWZveCBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldEluZm9DaGFuZ2VkIGFuZCBkZXRhY2hlZEZyb21UYXJnZXQgZXZlbnRzOlxuICpcbiAqIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMDg1NVxuICogLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM2OTc5XG4gKiAgIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRmlyZWZveFRhcmdldE1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNjb25uZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzOiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnLFxuICAgICAqICdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJy5cbiAgICAgKlxuICAgICAqIEEgdGFyZ2V0IGJlY29tZXMgZGlzY292ZXJlZCB3aGVuICdUYXJnZXQudGFyZ2V0Q3JlYXRlZCcgaXMgcmVjZWl2ZWQuXG4gICAgICogQSB0YXJnZXQgaXMgcmVtb3ZlZCBmcm9tIHRoaXMgbWFwIG9uY2UgJ1RhcmdldC50YXJnZXREZXN0cm95ZWQnIGlzXG4gICAgICogcmVjZWl2ZWQuXG4gICAgICpcbiAgICAgKiBgdGFyZ2V0RmlsdGVyQ2FsbGJhY2tgIGhhcyBubyBlZmZlY3Qgb24gdGhpcyBtYXAuXG4gICAgICovXG4gICAgI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZCA9IG5ldyBNYXAoKTtcbiAgICAvKipcbiAgICAgKiBLZWVwcyB0cmFjayBvZiB0YXJnZXRzIHRoYXQgd2VyZSBjcmVhdGVkIHZpYSAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnXG4gICAgICogYW5kIHdoaWNoIG9uZSBhcmUgbm90IGZpbHRlcmVkIG91dCBieSBgdGFyZ2V0RmlsdGVyQ2FsbGJhY2tgLlxuICAgICAqXG4gICAgICogVGhlIHRhcmdldCBpcyByZW1vdmVkIGZyb20gaGVyZSBvbmNlIGl0J3MgYmVlbiBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkID0gbmV3IE1hcCgpO1xuICAgIC8qKlxuICAgICAqIFRyYWNrcyB3aGljaCBzZXNzaW9ucyBhdHRhY2ggdG8gd2hpY2ggdGFyZ2V0LlxuICAgICAqL1xuICAgICNhdmFpbGFibGVUYXJnZXRzQnlTZXNzaW9uSWQgPSBuZXcgTWFwKCk7XG4gICAgI3RhcmdldEZpbHRlckNhbGxiYWNrO1xuICAgICN0YXJnZXRGYWN0b3J5O1xuICAgICNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uID0gbmV3IFdlYWtNYXAoKTtcbiAgICAjaW5pdGlhbGl6ZURlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgI3RhcmdldHNJZHNGb3JJbml0ID0gbmV3IFNldCgpO1xuICAgIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb24sIHRhcmdldEZhY3RvcnksIHRhcmdldEZpbHRlckNhbGxiYWNrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayA9IHRhcmdldEZpbHRlckNhbGxiYWNrO1xuICAgICAgICB0aGlzLiN0YXJnZXRGYWN0b3J5ID0gdGFyZ2V0RmFjdG9yeTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vbignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKCdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJywgdGhpcy4jb25UYXJnZXREZXN0cm95ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKENEUFNlc3Npb25FdmVudC5TZXNzaW9uRGV0YWNoZWQsIHRoaXMuI29uU2Vzc2lvbkRldGFjaGVkKTtcbiAgICAgICAgdGhpcy5zZXR1cEF0dGFjaG1lbnRMaXN0ZW5lcnModGhpcy4jY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHNldHVwQXR0YWNobWVudExpc3RlbmVycyhzZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KHNlc3Npb24sIGV2ZW50KTtcbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSk7XG4gICAgICAgIHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uc2V0KHNlc3Npb24sIGxpc3RlbmVyKTtcbiAgICAgICAgc2Vzc2lvbi5vbignVGFyZ2V0LmF0dGFjaGVkVG9UYXJnZXQnLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgICNvblNlc3Npb25EZXRhY2hlZCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlU2Vzc2lvbkxpc3RlbmVycyhzZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jYXZhaWxhYmxlVGFyZ2V0c0J5U2Vzc2lvbklkLmRlbGV0ZShzZXNzaW9uLmlkKCkpO1xuICAgIH07XG4gICAgcmVtb3ZlU2Vzc2lvbkxpc3RlbmVycyhzZXNzaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLiNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSkge1xuICAgICAgICAgICAgc2Vzc2lvbi5vZmYoJ1RhcmdldC5hdHRhY2hlZFRvVGFyZ2V0JywgdGhpcy4jYXR0YWNoZWRUb1RhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5nZXQoc2Vzc2lvbikpO1xuICAgICAgICAgICAgdGhpcy4jYXR0YWNoZWRUb1RhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5kZWxldGUoc2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0QXZhaWxhYmxlVGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkO1xuICAgIH1cbiAgICBnZXRDaGlsZFRhcmdldHMoX3RhcmdldCkge1xuICAgICAgICByZXR1cm4gbmV3IFNldCgpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldERlc3Ryb3llZCcsIHRoaXMuI29uVGFyZ2V0RGVzdHJveWVkKTtcbiAgICB9XG4gICAgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY29ubmVjdGlvbi5zZW5kKCdUYXJnZXQuc2V0RGlzY292ZXJUYXJnZXRzJywge1xuICAgICAgICAgICAgZGlzY292ZXI6IHRydWUsXG4gICAgICAgICAgICBmaWx0ZXI6IFt7fV0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdCA9IG5ldyBTZXQodGhpcy4jZGlzY292ZXJlZFRhcmdldHNCeVRhcmdldElkLmtleXMoKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2luaXRpYWxpemVEZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgI29uVGFyZ2V0Q3JlYXRlZCA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy4jZGlzY292ZXJlZFRhcmdldHNCeVRhcmdldElkLmhhcyhldmVudC50YXJnZXRJbmZvLnRhcmdldElkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5zZXQoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCwgZXZlbnQudGFyZ2V0SW5mbyk7XG4gICAgICAgIGlmIChldmVudC50YXJnZXRJbmZvLnR5cGUgPT09ICdicm93c2VyJyAmJiBldmVudC50YXJnZXRJbmZvLmF0dGFjaGVkKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiN0YXJnZXRGYWN0b3J5KGV2ZW50LnRhcmdldEluZm8sIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB0YXJnZXQuX2luaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLnNldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkLCB0YXJnZXQpO1xuICAgICAgICAgICAgdGhpcy4jZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KHRhcmdldC5fdGFyZ2V0SWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI3RhcmdldEZhY3RvcnkoZXZlbnQudGFyZ2V0SW5mbywgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHRoaXMuI3RhcmdldEZpbHRlckNhbGxiYWNrICYmICF0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0Ll9pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLnNldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkLCB0YXJnZXQpO1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0YXJnZXQpO1xuICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkodGFyZ2V0Ll90YXJnZXRJZCk7XG4gICAgfTtcbiAgICAjb25UYXJnZXREZXN0cm95ZWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy4jZGlzY292ZXJlZFRhcmdldHNCeVRhcmdldElkLmRlbGV0ZShldmVudC50YXJnZXRJZCk7XG4gICAgICAgIHRoaXMuI2ZpbmlzaEluaXRpYWxpemF0aW9uSWZSZWFkeShldmVudC50YXJnZXRJZCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLmdldChldmVudC50YXJnZXRJZCk7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldEdvbmVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0R29uZSAqLywgdGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLmRlbGV0ZShldmVudC50YXJnZXRJZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgICNvbkF0dGFjaGVkVG9UYXJnZXQgPSBhc3luYyAocGFyZW50U2Vzc2lvbiwgZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5mbyA9IGV2ZW50LnRhcmdldEluZm87XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLiNjb25uZWN0aW9uLnNlc3Npb24oZXZlbnQuc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlc3Npb24gJHtldmVudC5zZXNzaW9uSWR9IHdhcyBub3QgY3JlYXRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiNhdmFpbGFibGVUYXJnZXRzQnlUYXJnZXRJZC5nZXQodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgIGFzc2VydCh0YXJnZXQsIGBUYXJnZXQgJHt0YXJnZXRJbmZvLnRhcmdldElkfSBpcyBtaXNzaW5nYCk7XG4gICAgICAgIHNlc3Npb24uX3NldFRhcmdldCh0YXJnZXQpO1xuICAgICAgICB0aGlzLnNldHVwQXR0YWNobWVudExpc3RlbmVycyhzZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jYXZhaWxhYmxlVGFyZ2V0c0J5U2Vzc2lvbklkLnNldChzZXNzaW9uLmlkKCksIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLmdldCh0YXJnZXRJbmZvLnRhcmdldElkKSk7XG4gICAgICAgIHBhcmVudFNlc3Npb24uZW1pdChDRFBTZXNzaW9uRXZlbnQuUmVhZHksIHNlc3Npb24pO1xuICAgIH07XG4gICAgI2ZpbmlzaEluaXRpYWxpemF0aW9uSWZSZWFkeSh0YXJnZXRJZCkge1xuICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdC5kZWxldGUodGFyZ2V0SWQpO1xuICAgICAgICBpZiAodGhpcy4jdGFyZ2V0c0lkc0ZvckluaXQuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy4jaW5pdGlhbGl6ZURlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpcmVmb3hUYXJnZXRNYW5hZ2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG5pbXBvcnQgeyBGcmFtZSwgRnJhbWVFdmVudCwgdGhyb3dJZkRldGFjaGVkIH0gZnJvbSAnLi4vYXBpL0ZyYW1lLmpzJztcbmltcG9ydCB7IFVuc3VwcG9ydGVkT3BlcmF0aW9uIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5IH0gZnJvbSAnLi9BY2Nlc3NpYmlsaXR5LmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlckV2ZW50IH0gZnJvbSAnLi9GcmFtZU1hbmFnZXJFdmVudHMuanMnO1xuaW1wb3J0IHsgSXNvbGF0ZWRXb3JsZCB9IGZyb20gJy4vSXNvbGF0ZWRXb3JsZC5qcyc7XG5pbXBvcnQgeyBNQUlOX1dPUkxELCBQVVBQRVRFRVJfV09STEQgfSBmcm9tICcuL0lzb2xhdGVkV29ybGRzLmpzJztcbmltcG9ydCB7IExpZmVjeWNsZVdhdGNoZXIsIH0gZnJvbSAnLi9MaWZlY3ljbGVXYXRjaGVyLmpzJztcbmltcG9ydCB7IENEUF9CSU5ESU5HX1BSRUZJWCB9IGZyb20gJy4vdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xubGV0IENkcEZyYW1lID0gKCgpID0+IHtcbiAgICBsZXQgX2NsYXNzU3VwZXIgPSBGcmFtZTtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX2dvdG9fZGVjb3JhdG9ycztcbiAgICBsZXQgX3dhaXRGb3JOYXZpZ2F0aW9uX2RlY29yYXRvcnM7XG4gICAgbGV0IF9zZXRDb250ZW50X2RlY29yYXRvcnM7XG4gICAgbGV0IF9hZGRQcmVsb2FkU2NyaXB0X2RlY29yYXRvcnM7XG4gICAgbGV0IF9hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnM7XG4gICAgbGV0IF9yZW1vdmVFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnM7XG4gICAgbGV0IF93YWl0Rm9yRGV2aWNlUHJvbXB0X2RlY29yYXRvcnM7XG4gICAgcmV0dXJuIGNsYXNzIENkcEZyYW1lIGV4dGVuZHMgX2NsYXNzU3VwZXIge1xuICAgICAgICBzdGF0aWMge1xuICAgICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZ290b19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZ290b1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZ290b1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmdvdG8gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JOYXZpZ2F0aW9uX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJ3YWl0Rm9yTmF2aWdhdGlvblwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwid2FpdEZvck5hdmlnYXRpb25cIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yTmF2aWdhdGlvbiB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2V0Q29udGVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2V0Q29udGVudFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwic2V0Q29udGVudFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNldENvbnRlbnQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2FkZFByZWxvYWRTY3JpcHRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImFkZFByZWxvYWRTY3JpcHRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImFkZFByZWxvYWRTY3JpcHRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5hZGRQcmVsb2FkU2NyaXB0IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJhZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJhZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYWRkRXhwb3NlZEZ1bmN0aW9uQmluZGluZyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfcmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwicmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZ1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwicmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZ1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnJlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmcgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JEZXZpY2VQcm9tcHRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIndhaXRGb3JEZXZpY2VQcm9tcHRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIndhaXRGb3JEZXZpY2VQcm9tcHRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yRGV2aWNlUHJvbXB0IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgICN1cmwgPSAoX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpLCAnJyk7XG4gICAgICAgICNkZXRhY2hlZCA9IGZhbHNlO1xuICAgICAgICAjY2xpZW50O1xuICAgICAgICBfZnJhbWVNYW5hZ2VyO1xuICAgICAgICBfbG9hZGVySWQgPSAnJztcbiAgICAgICAgX2xpZmVjeWNsZUV2ZW50cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgX2lkO1xuICAgICAgICBfcGFyZW50SWQ7XG4gICAgICAgIGFjY2Vzc2liaWxpdHk7XG4gICAgICAgIHdvcmxkcztcbiAgICAgICAgY29uc3RydWN0b3IoZnJhbWVNYW5hZ2VyLCBmcmFtZUlkLCBwYXJlbnRGcmFtZUlkLCBjbGllbnQpIHtcbiAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZU1hbmFnZXIgPSBmcmFtZU1hbmFnZXI7XG4gICAgICAgICAgICB0aGlzLiN1cmwgPSAnJztcbiAgICAgICAgICAgIHRoaXMuX2lkID0gZnJhbWVJZDtcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudElkID0gcGFyZW50RnJhbWVJZDtcbiAgICAgICAgICAgIHRoaXMuI2RldGFjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZXJJZCA9ICcnO1xuICAgICAgICAgICAgdGhpcy53b3JsZHMgPSB7XG4gICAgICAgICAgICAgICAgW01BSU5fV09STERdOiBuZXcgSXNvbGF0ZWRXb3JsZCh0aGlzLCB0aGlzLl9mcmFtZU1hbmFnZXIudGltZW91dFNldHRpbmdzKSxcbiAgICAgICAgICAgICAgICBbUFVQUEVURUVSX1dPUkxEXTogbmV3IElzb2xhdGVkV29ybGQodGhpcywgdGhpcy5fZnJhbWVNYW5hZ2VyLnRpbWVvdXRTZXR0aW5ncyksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5hY2Nlc3NpYmlsaXR5ID0gbmV3IEFjY2Vzc2liaWxpdHkodGhpcy53b3JsZHNbTUFJTl9XT1JMRF0pO1xuICAgICAgICAgICAgdGhpcy5vbihGcmFtZUV2ZW50LkZyYW1lU3dhcHBlZEJ5QWN0aXZhdGlvbiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEVtdWxhdGUgbG9hZGluZyBwcm9jZXNzIGZvciBzd2FwcGVkIGZyYW1lcy5cbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRpbmdTdGFydGVkKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Mb2FkaW5nU3RvcHBlZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLndvcmxkc1tNQUlOX1dPUkxEXS5lbWl0dGVyLm9uKCdjb25zb2xlYXBpY2FsbGVkJywgdGhpcy4jb25NYWluV29ybGRDb25zb2xlQXBpQ2FsbGVkLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy53b3JsZHNbTUFJTl9XT1JMRF0uZW1pdHRlci5vbignYmluZGluZ2NhbGxlZCcsIHRoaXMuI29uTWFpbldvcmxkQmluZGluZ0NhbGxlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICAjb25NYWluV29ybGRDb25zb2xlQXBpQ2FsbGVkKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZU1hbmFnZXIuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5Db25zb2xlQXBpQ2FsbGVkLCBbXG4gICAgICAgICAgICAgICAgdGhpcy53b3JsZHNbTUFJTl9XT1JMRF0sXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICAjb25NYWluV29ybGRCaW5kaW5nQ2FsbGVkKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZU1hbmFnZXIuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5CaW5kaW5nQ2FsbGVkLCBbXG4gICAgICAgICAgICAgICAgdGhpcy53b3JsZHNbTUFJTl9XT1JMRF0sXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkgaW4gRGV2VG9vbHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX2NsaWVudCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZXMgdGhlIGZyYW1lIElEIHdpdGggdGhlIG5ldyBJRC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIG1haW4gZnJhbWUgaXNcbiAgICAgICAgICogcmVwbGFjZWQgYnkgYSBkaWZmZXJlbnQgZnJhbWUuXG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGVJZChpZCkge1xuICAgICAgICAgICAgdGhpcy5faWQgPSBpZDtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcGFnZSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcmFtZU1hbmFnZXIucGFnZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlzT09QRnJhbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50ICE9PSB0aGlzLl9mcmFtZU1hbmFnZXIuY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGdvdG8odXJsLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmVmZXJlciA9IHRoaXMuX2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5leHRyYUhUVFBIZWFkZXJzKClbJ3JlZmVyZXInXSwgcmVmZXJyZXJQb2xpY3kgPSB0aGlzLl9mcmFtZU1hbmFnZXIubmV0d29ya01hbmFnZXIuZXh0cmFIVFRQSGVhZGVycygpWydyZWZlcmVyLXBvbGljeSddLCB3YWl0VW50aWwgPSBbJ2xvYWQnXSwgdGltZW91dCA9IHRoaXMuX2ZyYW1lTWFuYWdlci50aW1lb3V0U2V0dGluZ3MubmF2aWdhdGlvblRpbWVvdXQoKSwgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBsZXQgZW5zdXJlTmV3RG9jdW1lbnROYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCB3YXRjaGVyID0gbmV3IExpZmVjeWNsZVdhdGNoZXIodGhpcy5fZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLCB0aGlzLCB3YWl0VW50aWwsIHRpbWVvdXQpO1xuICAgICAgICAgICAgbGV0IGVycm9yID0gYXdhaXQgRGVmZXJyZWQucmFjZShbXG4gICAgICAgICAgICAgICAgbmF2aWdhdGUodGhpcy4jY2xpZW50LCB1cmwsIHJlZmVyZXIsIHJlZmVycmVyUG9saWN5LCB0aGlzLl9pZCksXG4gICAgICAgICAgICAgICAgd2F0Y2hlci50ZXJtaW5hdGlvblByb21pc2UoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9yID0gYXdhaXQgRGVmZXJyZWQucmFjZShbXG4gICAgICAgICAgICAgICAgICAgIHdhdGNoZXIudGVybWluYXRpb25Qcm9taXNlKCksXG4gICAgICAgICAgICAgICAgICAgIGVuc3VyZU5ld0RvY3VtZW50TmF2aWdhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgPyB3YXRjaGVyLm5ld0RvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB3YXRjaGVyLnNhbWVEb2N1bWVudE5hdmlnYXRpb25Qcm9taXNlKCksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHdhdGNoZXIubmF2aWdhdGlvblJlc3BvbnNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB3YXRjaGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRlKGNsaWVudCwgdXJsLCByZWZlcnJlciwgcmVmZXJyZXJQb2xpY3ksIGZyYW1lSWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKCdQYWdlLm5hdmlnYXRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3ksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbnN1cmVOZXdEb2N1bWVudE5hdmlnYXRpb24gPSAhIXJlc3BvbnNlLmxvYWRlcklkO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3JUZXh0ID09PSAnbmV0OjpFUlJfSFRUUF9SRVNQT05TRV9DT0RFX0ZBSUxVUkUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZXJyb3JUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBFcnJvcihgJHtyZXNwb25zZS5lcnJvclRleHR9IGF0ICR7dXJsfWApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHdhaXRGb3JOYXZpZ2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgY29uc3QgeyB3YWl0VW50aWwgPSBbJ2xvYWQnXSwgdGltZW91dCA9IHRoaXMuX2ZyYW1lTWFuYWdlci50aW1lb3V0U2V0dGluZ3MubmF2aWdhdGlvblRpbWVvdXQoKSwgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCB3YXRjaGVyID0gbmV3IExpZmVjeWNsZVdhdGNoZXIodGhpcy5fZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLCB0aGlzLCB3YWl0VW50aWwsIHRpbWVvdXQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCBEZWZlcnJlZC5yYWNlKFtcbiAgICAgICAgICAgICAgICB3YXRjaGVyLnRlcm1pbmF0aW9uUHJvbWlzZSgpLFxuICAgICAgICAgICAgICAgIC4uLihvcHRpb25zLmlnbm9yZVNhbWVEb2N1bWVudE5hdmlnYXRpb25cbiAgICAgICAgICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgICAgICAgICA6IFt3YXRjaGVyLnNhbWVEb2N1bWVudE5hdmlnYXRpb25Qcm9taXNlKCldKSxcbiAgICAgICAgICAgICAgICB3YXRjaGVyLm5ld0RvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IERlZmVycmVkLnJhY2UoW3dhdGNoZXIudGVybWluYXRpb25Qcm9taXNlKCksIHdhdGNoZXIubmF2aWdhdGlvblJlc3BvbnNlKCldKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgfHwgbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHdhdGNoZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCBjbGllbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIG1haW5SZWFsbSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndvcmxkc1tNQUlOX1dPUkxEXTtcbiAgICAgICAgfVxuICAgICAgICBpc29sYXRlZFJlYWxtKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud29ybGRzW1BVUFBFVEVFUl9XT1JMRF07XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgc2V0Q29udGVudChodG1sLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgd2FpdFVudGlsID0gWydsb2FkJ10sIHRpbWVvdXQgPSB0aGlzLl9mcmFtZU1hbmFnZXIudGltZW91dFNldHRpbmdzLm5hdmlnYXRpb25UaW1lb3V0KCksIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgLy8gV2UgcmVseSB1cG9uIHRoZSBmYWN0IHRoYXQgZG9jdW1lbnQub3BlbigpIHdpbGwgcmVzZXQgZnJhbWUgbGlmZWN5Y2xlIHdpdGggXCJpbml0XCJcbiAgICAgICAgICAgIC8vIGxpZmVjeWNsZSBldmVudC4gQHNlZSBodHRwczovL2NycmV2LmNvbS82MDg2NThcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0RnJhbWVDb250ZW50KGh0bWwpO1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hlciA9IG5ldyBMaWZlY3ljbGVXYXRjaGVyKHRoaXMuX2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlciwgdGhpcywgd2FpdFVudGlsLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgRGVmZXJyZWQucmFjZShbXG4gICAgICAgICAgICAgICAgd2F0Y2hlci50ZXJtaW5hdGlvblByb21pc2UoKSxcbiAgICAgICAgICAgICAgICB3YXRjaGVyLmxpZmVjeWNsZVByb21pc2UoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgd2F0Y2hlci5kaXNwb3NlKCk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cmwoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jdXJsO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudEZyYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lTWFuYWdlci5fZnJhbWVUcmVlLnBhcmVudEZyYW1lKHRoaXMuX2lkKSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkRnJhbWVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lTWFuYWdlci5fZnJhbWVUcmVlLmNoaWxkRnJhbWVzKHRoaXMuX2lkKTtcbiAgICAgICAgfVxuICAgICAgICAjZGV2aWNlUmVxdWVzdFByb21wdE1hbmFnZXIoKSB7XG4gICAgICAgICAgICBjb25zdCByb290RnJhbWUgPSB0aGlzLnBhZ2UoKS5tYWluRnJhbWUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT09QRnJhbWUoKSB8fCByb290RnJhbWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWVNYW5hZ2VyLl9kZXZpY2VSZXF1ZXN0UHJvbXB0TWFuYWdlcih0aGlzLiNjbGllbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvb3RGcmFtZS5fZnJhbWVNYW5hZ2VyLl9kZXZpY2VSZXF1ZXN0UHJvbXB0TWFuYWdlcih0aGlzLiNjbGllbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGFkZFByZWxvYWRTY3JpcHQocHJlbG9hZFNjcmlwdCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzT09QRnJhbWUoKSAmJiB0aGlzICE9PSB0aGlzLl9mcmFtZU1hbmFnZXIubWFpbkZyYW1lKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJlbG9hZFNjcmlwdC5nZXRJZEZvckZyYW1lKHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnUGFnZS5hZGRTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCcsIHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHByZWxvYWRTY3JpcHQuc291cmNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcmVsb2FkU2NyaXB0LnNldElkRm9yRnJhbWUodGhpcywgaWRlbnRpZmllcik7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgYWRkRXhwb3NlZEZ1bmN0aW9uQmluZGluZyhiaW5kaW5nKSB7XG4gICAgICAgICAgICAvLyBJZiBhIGZyYW1lIGhhcyBub3Qgc3RhcnRlZCBsb2FkaW5nLCBpdCBtaWdodCBuZXZlciBzdGFydC4gUmVseSBvblxuICAgICAgICAgICAgLy8gYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQgaW4gdGhhdCBjYXNlLlxuICAgICAgICAgICAgaWYgKHRoaXMgIT09IHRoaXMuX2ZyYW1lTWFuYWdlci5tYWluRnJhbWUoKSAmJiAhdGhpcy5faGFzU3RhcnRlZExvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1J1bnRpbWUuYWRkQmluZGluZycsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogQ0RQX0JJTkRJTkdfUFJFRklYICsgYmluZGluZy5uYW1lLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGUoYmluZGluZy5pbml0U291cmNlKS5jYXRjaChkZWJ1Z0Vycm9yKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHJlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZykge1xuICAgICAgICAgICAgLy8gSWYgYSBmcmFtZSBoYXMgbm90IHN0YXJ0ZWQgbG9hZGluZywgaXQgbWlnaHQgbmV2ZXIgc3RhcnQuIFJlbHkgb25cbiAgICAgICAgICAgIC8vIGFkZFNjcmlwdFRvRXZhbHVhdGVPbk5ld0RvY3VtZW50IGluIHRoYXQgY2FzZS5cbiAgICAgICAgICAgIGlmICh0aGlzICE9PSB0aGlzLl9mcmFtZU1hbmFnZXIubWFpbkZyYW1lKCkgJiYgIXRoaXMuX2hhc1N0YXJ0ZWRMb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdSdW50aW1lLnJlbW92ZUJpbmRpbmcnLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IENEUF9CSU5ESU5HX1BSRUZJWCArIGJpbmRpbmcubmFtZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0aGlzLmV2YWx1YXRlKG5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmVzIHRoZSBkYW5nbGluZyBQdXBwZXRlZXIgYmluZGluZyB3cmFwcGVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBJbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH0sIGJpbmRpbmcubmFtZSkuY2F0Y2goZGVidWdFcnJvciksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyB3YWl0Rm9yRGV2aWNlUHJvbXB0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyKCkud2FpdEZvckRldmljZVByb21wdChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBfbmF2aWdhdGVkKGZyYW1lUGF5bG9hZCkge1xuICAgICAgICAgICAgdGhpcy5fbmFtZSA9IGZyYW1lUGF5bG9hZC5uYW1lO1xuICAgICAgICAgICAgdGhpcy4jdXJsID0gYCR7ZnJhbWVQYXlsb2FkLnVybH0ke2ZyYW1lUGF5bG9hZC51cmxGcmFnbWVudCB8fCAnJ31gO1xuICAgICAgICB9XG4gICAgICAgIF9uYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCh1cmwpIHtcbiAgICAgICAgICAgIHRoaXMuI3VybCA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBfb25MaWZlY3ljbGVFdmVudChsb2FkZXJJZCwgbmFtZSkge1xuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdpbml0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRlcklkID0gbG9hZGVySWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGlmZWN5Y2xlRXZlbnRzLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9saWZlY3ljbGVFdmVudHMuYWRkKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIF9vbkxvYWRpbmdTdG9wcGVkKCkge1xuICAgICAgICAgICAgdGhpcy5fbGlmZWN5Y2xlRXZlbnRzLmFkZCgnRE9NQ29udGVudExvYWRlZCcpO1xuICAgICAgICAgICAgdGhpcy5fbGlmZWN5Y2xlRXZlbnRzLmFkZCgnbG9hZCcpO1xuICAgICAgICB9XG4gICAgICAgIF9vbkxvYWRpbmdTdGFydGVkKCkge1xuICAgICAgICAgICAgdGhpcy5faGFzU3RhcnRlZExvYWRpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBkZXRhY2hlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkZXRhY2hlZDtcbiAgICAgICAgfVxuICAgICAgICBbKF9nb3RvX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXSwgX3dhaXRGb3JOYXZpZ2F0aW9uX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXSwgX3NldENvbnRlbnRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdLCBfYWRkUHJlbG9hZFNjcmlwdF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF0sIF9hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXSwgX3JlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmdfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdLCBfd2FpdEZvckRldmljZVByb21wdF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF0sIGRpc3Bvc2VTeW1ib2wpXSgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNkZXRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2RldGFjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMud29ybGRzW01BSU5fV09STERdW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgICAgICB0aGlzLndvcmxkc1tQVVBQRVRFRVJfV09STERdW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3NlRnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuZXhwb3J0IHsgQ2RwRnJhbWUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyYW1lLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBGcmFtZUV2ZW50IH0gZnJvbSAnLi4vYXBpL0ZyYW1lLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgUHVwcGV0ZWVyVVJMLCBVVElMSVRZX1dPUkxEX05BTUUgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4uL3V0aWwvRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG5pbXBvcnQgeyBpc0Vycm9yTGlrZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IENkcFByZWxvYWRTY3JpcHQgfSBmcm9tICcuL0NkcFByZWxvYWRTY3JpcHQuanMnO1xuaW1wb3J0IHsgQ2RwQ0RQU2Vzc2lvbiB9IGZyb20gJy4vQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBpc1RhcmdldENsb3NlZEVycm9yIH0gZnJvbSAnLi9Db25uZWN0aW9uLmpzJztcbmltcG9ydCB7IERldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyIH0gZnJvbSAnLi9EZXZpY2VSZXF1ZXN0UHJvbXB0LmpzJztcbmltcG9ydCB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4ZWN1dGlvbkNvbnRleHQuanMnO1xuaW1wb3J0IHsgQ2RwRnJhbWUgfSBmcm9tICcuL0ZyYW1lLmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlckV2ZW50IH0gZnJvbSAnLi9GcmFtZU1hbmFnZXJFdmVudHMuanMnO1xuaW1wb3J0IHsgRnJhbWVUcmVlIH0gZnJvbSAnLi9GcmFtZVRyZWUuanMnO1xuaW1wb3J0IHsgTUFJTl9XT1JMRCwgUFVQUEVURUVSX1dPUkxEIH0gZnJvbSAnLi9Jc29sYXRlZFdvcmxkcy5qcyc7XG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlciB9IGZyb20gJy4vTmV0d29ya01hbmFnZXIuanMnO1xuY29uc3QgVElNRV9GT1JfV0FJVElOR19GT1JfU1dBUCA9IDEwMDsgLy8gbXMuXG4vKipcbiAqIEEgZnJhbWUgbWFuYWdlciBtYW5hZ2VzIHRoZSBmcmFtZXMgZm9yIGEgZ2l2ZW4ge0BsaW5rIFBhZ2UgfCBwYWdlfS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZyYW1lTWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgI3BhZ2U7XG4gICAgI25ldHdvcmtNYW5hZ2VyO1xuICAgICN0aW1lb3V0U2V0dGluZ3M7XG4gICAgI2lzb2xhdGVkV29ybGRzID0gbmV3IFNldCgpO1xuICAgICNjbGllbnQ7XG4gICAgI3NjcmlwdHNUb0V2YWx1YXRlT25OZXdEb2N1bWVudCA9IG5ldyBNYXAoKTtcbiAgICAjYmluZGluZ3MgPSBuZXcgU2V0KCk7XG4gICAgX2ZyYW1lVHJlZSA9IG5ldyBGcmFtZVRyZWUoKTtcbiAgICAvKipcbiAgICAgKiBTZXQgb2YgZnJhbWUgSURzIHN0b3JlZCB0byBpbmRpY2F0ZSBpZiBhIGZyYW1lIGhhcyByZWNlaXZlZCBhXG4gICAgICogZnJhbWVOYXZpZ2F0ZWQgZXZlbnQgc28gdGhhdCBmcmFtZSB0cmVlIHJlc3BvbnNlcyBjb3VsZCBiZSBpZ25vcmVkIGFzIHRoZVxuICAgICAqIGZyYW1lTmF2aWdhdGVkIGV2ZW50IHVzdWFsbHkgY29udGFpbnMgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICAjZnJhbWVOYXZpZ2F0ZWRSZWNlaXZlZCA9IG5ldyBTZXQoKTtcbiAgICAjZGV2aWNlUmVxdWVzdFByb21wdE1hbmFnZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICNmcmFtZVRyZWVIYW5kbGVkO1xuICAgIGdldCB0aW1lb3V0U2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0aW1lb3V0U2V0dGluZ3M7XG4gICAgfVxuICAgIGdldCBuZXR3b3JrTWFuYWdlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25ldHdvcmtNYW5hZ2VyO1xuICAgIH1cbiAgICBnZXQgY2xpZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50O1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIHBhZ2UsIHRpbWVvdXRTZXR0aW5ncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3BhZ2UgPSBwYWdlO1xuICAgICAgICB0aGlzLiNuZXR3b3JrTWFuYWdlciA9IG5ldyBOZXR3b3JrTWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy4jdGltZW91dFNldHRpbmdzID0gdGltZW91dFNldHRpbmdzO1xuICAgICAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnModGhpcy4jY2xpZW50KTtcbiAgICAgICAgY2xpZW50Lm9uY2UoQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jb25DbGllbnREaXNjb25uZWN0KCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhbWUncyBjbGllbnQgaXMgZGlzY29ubmVjdGVkLiBXZSBkb24ndCBrbm93IGlmIHRoZVxuICAgICAqIGRpc2Nvbm5lY3QgbWVhbnMgdGhhdCB0aGUgZnJhbWUgaXMgcmVtb3ZlZCBvciBpZiBpdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IGFcbiAgICAgKiBuZXcgZnJhbWUuIFRoZXJlZm9yZSwgd2Ugd2FpdCBmb3IgYSBzd2FwIGV2ZW50LlxuICAgICAqL1xuICAgIGFzeW5jICNvbkNsaWVudERpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGNvbnN0IG1haW5GcmFtZSA9IHRoaXMuX2ZyYW1lVHJlZS5nZXRNYWluRnJhbWUoKTtcbiAgICAgICAgaWYgKCFtYWluRnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG1haW5GcmFtZS5jaGlsZEZyYW1lcygpKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3dhcHBlZCA9IERlZmVycmVkLmNyZWF0ZSh7XG4gICAgICAgICAgICB0aW1lb3V0OiBUSU1FX0ZPUl9XQUlUSU5HX0ZPUl9TV0FQLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZyYW1lIHdhcyBub3Qgc3dhcHBlZCcsXG4gICAgICAgIH0pO1xuICAgICAgICBtYWluRnJhbWUub25jZShGcmFtZUV2ZW50LkZyYW1lU3dhcHBlZEJ5QWN0aXZhdGlvbiwgKCkgPT4ge1xuICAgICAgICAgICAgc3dhcHBlZC5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgc3dhcHBlZC52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShtYWluRnJhbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIG1haW4gZnJhbWUgaXMgcmVwbGFjZWQgYnkgYW5vdGhlciBtYWluIGZyYW1lLFxuICAgICAqIHdlIG1haW50YWluIHRoZSBtYWluIGZyYW1lIG9iamVjdCBpZGVudGl0eSB3aGlsZSB1cGRhdGluZ1xuICAgICAqIGl0cyBmcmFtZSB0cmVlIGFuZCBJRC5cbiAgICAgKi9cbiAgICBhc3luYyBzd2FwRnJhbWVUcmVlKGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIGFzc2VydCh0aGlzLiNjbGllbnQgaW5zdGFuY2VvZiBDZHBDRFBTZXNzaW9uLCAnQ0RQU2Vzc2lvbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgQ0RQU2Vzc2lvbkltcGwuJyk7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5fZnJhbWVUcmVlLmdldE1haW5GcmFtZSgpO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuI2ZyYW1lTmF2aWdhdGVkUmVjZWl2ZWQuYWRkKHRoaXMuI2NsaWVudC5fdGFyZ2V0KCkuX3RhcmdldElkKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lVHJlZS5yZW1vdmVGcmFtZShmcmFtZSk7XG4gICAgICAgICAgICBmcmFtZS51cGRhdGVJZCh0aGlzLiNjbGllbnQuX3RhcmdldCgpLl90YXJnZXRJZCk7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZVRyZWUuYWRkRnJhbWUoZnJhbWUpO1xuICAgICAgICAgICAgZnJhbWUudXBkYXRlQ2xpZW50KGNsaWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKGNsaWVudCk7XG4gICAgICAgIGNsaWVudC5vbmNlKENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI29uQ2xpZW50RGlzY29ubmVjdCgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplKGNsaWVudCwgZnJhbWUpO1xuICAgICAgICBhd2FpdCB0aGlzLiNuZXR3b3JrTWFuYWdlci5hZGRDbGllbnQoY2xpZW50KTtcbiAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkQnlBY3RpdmF0aW9uLCB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlZ2lzdGVyU3BlY3VsYXRpdmVTZXNzaW9uKGNsaWVudCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNuZXR3b3JrTWFuYWdlci5hZGRDbGllbnQoY2xpZW50KTtcbiAgICB9XG4gICAgc2V0dXBFdmVudExpc3RlbmVycyhzZXNzaW9uKSB7XG4gICAgICAgIHNlc3Npb24ub24oJ1BhZ2UuZnJhbWVBdHRhY2hlZCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jZnJhbWVUcmVlSGFuZGxlZD8udmFsdWVPclRocm93KCk7XG4gICAgICAgICAgICB0aGlzLiNvbkZyYW1lQXR0YWNoZWQoc2Vzc2lvbiwgZXZlbnQuZnJhbWVJZCwgZXZlbnQucGFyZW50RnJhbWVJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdQYWdlLmZyYW1lTmF2aWdhdGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU5hdmlnYXRlZFJlY2VpdmVkLmFkZChldmVudC5mcmFtZS5pZCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25GcmFtZU5hdmlnYXRlZChldmVudC5mcmFtZSwgZXZlbnQudHlwZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdQYWdlLm5hdmlnYXRlZFdpdGhpbkRvY3VtZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudChldmVudC5mcmFtZUlkLCBldmVudC51cmwpO1xuICAgICAgICB9KTtcbiAgICAgICAgc2Vzc2lvbi5vbignUGFnZS5mcmFtZURldGFjaGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRnJhbWVEZXRhY2hlZChldmVudC5mcmFtZUlkLCBldmVudC5yZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgICAgc2Vzc2lvbi5vbignUGFnZS5mcmFtZVN0YXJ0ZWRMb2FkaW5nJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRnJhbWVTdGFydGVkTG9hZGluZyhldmVudC5mcmFtZUlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNlc3Npb24ub24oJ1BhZ2UuZnJhbWVTdG9wcGVkTG9hZGluZycsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jZnJhbWVUcmVlSGFuZGxlZD8udmFsdWVPclRocm93KCk7XG4gICAgICAgICAgICB0aGlzLiNvbkZyYW1lU3RvcHBlZExvYWRpbmcoZXZlbnQuZnJhbWVJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRXhlY3V0aW9uQ29udGV4dENyZWF0ZWQoZXZlbnQuY29udGV4dCwgc2Vzc2lvbik7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdQYWdlLmxpZmVjeWNsZUV2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uTGlmZWN5Y2xlRXZlbnQoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgaW5pdGlhbGl6ZShjbGllbnQsIGZyYW1lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy5yZXNvbHZlKCk7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNjaGVkdWxlIGFsbCB0aGVzZSBjb21tYW5kcyB3aGlsZSB0aGUgdGFyZ2V0IGlzIHBhdXNlZCxcbiAgICAgICAgICAgIC8vIHRoZXJlZm9yZSwgaXQgbmVlZHMgdG8gaGFwcGVuIHN5bmNocm9uaW91c2x5LiBBdCB0aGUgc2FtZSB0aW1lIHdlXG4gICAgICAgICAgICAvLyBzaG91bGQgbm90IHN0YXJ0IHByb2Nlc3NpbmcgZXhlY3V0aW9uIGNvbnRleHQgYW5kIGZyYW1lIGV2ZW50cyBiZWZvcmVcbiAgICAgICAgICAgIC8vIHdlIHJlY2VpdmVkIHRoZSBpbml0aWFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmcmFtZSB0cmVlLlxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI25ldHdvcmtNYW5hZ2VyLmFkZENsaWVudChjbGllbnQpLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdQYWdlLmVuYWJsZScpLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdQYWdlLmdldEZyYW1lVHJlZScpLnRoZW4oKHsgZnJhbWVUcmVlIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jaGFuZGxlRnJhbWVUcmVlKGNsaWVudCwgZnJhbWVUcmVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZnJhbWVUcmVlSGFuZGxlZD8ucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdQYWdlLnNldExpZmVjeWNsZUV2ZW50c0VuYWJsZWQnLCB7IGVuYWJsZWQ6IHRydWUgfSksXG4gICAgICAgICAgICAgICAgY2xpZW50LnNlbmQoJ1J1bnRpbWUuZW5hYmxlJykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNjcmVhdGVJc29sYXRlZFdvcmxkKGNsaWVudCwgVVRJTElUWV9XT1JMRF9OQU1FKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAuLi4oZnJhbWVcbiAgICAgICAgICAgICAgICAgICAgPyBBcnJheS5mcm9tKHRoaXMuI3NjcmlwdHNUb0V2YWx1YXRlT25OZXdEb2N1bWVudC52YWx1ZXMoKSlcbiAgICAgICAgICAgICAgICAgICAgOiBbXSkubWFwKHNjcmlwdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZT8uYWRkUHJlbG9hZFNjcmlwdChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC4uLihmcmFtZSA/IEFycmF5LmZyb20odGhpcy4jYmluZGluZ3MudmFsdWVzKCkpIDogW10pLm1hcChiaW5kaW5nID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lPy5hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nKGJpbmRpbmcpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy5yZXNvbHZlKCk7XG4gICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG1pZ2h0IGhhdmUgYmVlbiBjbG9zZWQgYmVmb3JlIHRoZSBpbml0aWFsaXphdGlvbiBmaW5pc2hlZC5cbiAgICAgICAgICAgIGlmIChpc0Vycm9yTGlrZShlcnJvcikgJiYgaXNUYXJnZXRDbG9zZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGFnZTtcbiAgICB9XG4gICAgbWFpbkZyYW1lKCkge1xuICAgICAgICBjb25zdCBtYWluRnJhbWUgPSB0aGlzLl9mcmFtZVRyZWUuZ2V0TWFpbkZyYW1lKCk7XG4gICAgICAgIGFzc2VydChtYWluRnJhbWUsICdSZXF1ZXN0aW5nIG1haW4gZnJhbWUgdG9vIGVhcmx5IScpO1xuICAgICAgICByZXR1cm4gbWFpbkZyYW1lO1xuICAgIH1cbiAgICBmcmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2ZyYW1lVHJlZS5mcmFtZXMoKSk7XG4gICAgfVxuICAgIGZyYW1lKGZyYW1lSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lVHJlZS5nZXRCeUlkKGZyYW1lSWQpIHx8IG51bGw7XG4gICAgfVxuICAgIGFzeW5jIGFkZEV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZykge1xuICAgICAgICB0aGlzLiNiaW5kaW5ncy5hZGQoYmluZGluZyk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuZnJhbWVzKCkubWFwKGFzeW5jIChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZyYW1lLmFkZEV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgYXN5bmMgcmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZyhiaW5kaW5nKSB7XG4gICAgICAgIHRoaXMuI2JpbmRpbmdzLmRlbGV0ZShiaW5kaW5nKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mcmFtZXMoKS5tYXAoYXN5bmMgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZnJhbWUucmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZyhiaW5kaW5nKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBhc3luYyBldmFsdWF0ZU9uTmV3RG9jdW1lbnQoc291cmNlKSB7XG4gICAgICAgIGNvbnN0IHsgaWRlbnRpZmllciB9ID0gYXdhaXQgdGhpcy5tYWluRnJhbWUoKVxuICAgICAgICAgICAgLl9jbGllbnQoKVxuICAgICAgICAgICAgLnNlbmQoJ1BhZ2UuYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQnLCB7XG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwcmVsb2FkU2NyaXB0ID0gbmV3IENkcFByZWxvYWRTY3JpcHQodGhpcy5tYWluRnJhbWUoKSwgaWRlbnRpZmllciwgc291cmNlKTtcbiAgICAgICAgdGhpcy4jc2NyaXB0c1RvRXZhbHVhdGVPbk5ld0RvY3VtZW50LnNldChpZGVudGlmaWVyLCBwcmVsb2FkU2NyaXB0KTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mcmFtZXMoKS5tYXAoYXN5bmMgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZnJhbWUuYWRkUHJlbG9hZFNjcmlwdChwcmVsb2FkU2NyaXB0KTtcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4geyBpZGVudGlmaWVyIH07XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZVNjcmlwdFRvRXZhbHVhdGVPbk5ld0RvY3VtZW50KGlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgcHJlbG9hZFNjcmlwdCA9IHRoaXMuI3NjcmlwdHNUb0V2YWx1YXRlT25OZXdEb2N1bWVudC5nZXQoaWRlbnRpZmllcik7XG4gICAgICAgIGlmICghcHJlbG9hZFNjcmlwdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgdG8gZXZhbHVhdGUgb24gbmV3IGRvY3VtZW50IHdpdGggaWQgJHtpZGVudGlmaWVyfSBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNzY3JpcHRzVG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQuZGVsZXRlKGlkZW50aWZpZXIpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmZyYW1lcygpLm1hcChmcmFtZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gcHJlbG9hZFNjcmlwdC5nZXRJZEZvckZyYW1lKGZyYW1lKTtcbiAgICAgICAgICAgIGlmICghaWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmcmFtZVxuICAgICAgICAgICAgICAgIC5fY2xpZW50KClcbiAgICAgICAgICAgICAgICAuc2VuZCgnUGFnZS5yZW1vdmVTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCcsIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgb25BdHRhY2hlZFRvVGFyZ2V0KHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0Ll9nZXRUYXJnZXRJbmZvKCkudHlwZSAhPT0gJ2lmcmFtZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUodGFyZ2V0Ll9nZXRUYXJnZXRJbmZvKCkudGFyZ2V0SWQpO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIGZyYW1lLnVwZGF0ZUNsaWVudCh0YXJnZXQuX3Nlc3Npb24oKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKHRhcmdldC5fc2Vzc2lvbigpKTtcbiAgICAgICAgdm9pZCB0aGlzLmluaXRpYWxpemUodGFyZ2V0Ll9zZXNzaW9uKCksIGZyYW1lKTtcbiAgICB9XG4gICAgX2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyKGNsaWVudCkge1xuICAgICAgICBsZXQgbWFuYWdlciA9IHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyTWFwLmdldChjbGllbnQpO1xuICAgICAgICBpZiAobWFuYWdlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtYW5hZ2VyID0gbmV3IERldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyKGNsaWVudCwgdGhpcy4jdGltZW91dFNldHRpbmdzKTtcbiAgICAgICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyTWFwLnNldChjbGllbnQsIG1hbmFnZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYW5hZ2VyO1xuICAgIH1cbiAgICAjb25MaWZlY3ljbGVFdmVudChldmVudCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUoZXZlbnQuZnJhbWVJZCk7XG4gICAgICAgIGlmICghZnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZS5fb25MaWZlY3ljbGVFdmVudChldmVudC5sb2FkZXJJZCwgZXZlbnQubmFtZSk7XG4gICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5MaWZlY3ljbGVFdmVudCwgZnJhbWUpO1xuICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuTGlmZWN5Y2xlRXZlbnQsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgICNvbkZyYW1lU3RhcnRlZExvYWRpbmcoZnJhbWVJZCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUoZnJhbWVJZCk7XG4gICAgICAgIGlmICghZnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZS5fb25Mb2FkaW5nU3RhcnRlZCgpO1xuICAgIH1cbiAgICAjb25GcmFtZVN0b3BwZWRMb2FkaW5nKGZyYW1lSWQpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmZyYW1lKGZyYW1lSWQpO1xuICAgICAgICBpZiAoIWZyYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUuX29uTG9hZGluZ1N0b3BwZWQoKTtcbiAgICAgICAgdGhpcy5lbWl0KEZyYW1lTWFuYWdlckV2ZW50LkxpZmVjeWNsZUV2ZW50LCBmcmFtZSk7XG4gICAgICAgIGZyYW1lLmVtaXQoRnJhbWVFdmVudC5MaWZlY3ljbGVFdmVudCwgdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgI2hhbmRsZUZyYW1lVHJlZShzZXNzaW9uLCBmcmFtZVRyZWUpIHtcbiAgICAgICAgaWYgKGZyYW1lVHJlZS5mcmFtZS5wYXJlbnRJZCkge1xuICAgICAgICAgICAgdGhpcy4jb25GcmFtZUF0dGFjaGVkKHNlc3Npb24sIGZyYW1lVHJlZS5mcmFtZS5pZCwgZnJhbWVUcmVlLmZyYW1lLnBhcmVudElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuI2ZyYW1lTmF2aWdhdGVkUmVjZWl2ZWQuaGFzKGZyYW1lVHJlZS5mcmFtZS5pZCkpIHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25GcmFtZU5hdmlnYXRlZChmcmFtZVRyZWUuZnJhbWUsICdOYXZpZ2F0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU5hdmlnYXRlZFJlY2VpdmVkLmRlbGV0ZShmcmFtZVRyZWUuZnJhbWUuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZnJhbWVUcmVlLmNoaWxkRnJhbWVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmcmFtZVRyZWUuY2hpbGRGcmFtZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZUZyYW1lVHJlZShzZXNzaW9uLCBjaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uRnJhbWVBdHRhY2hlZChzZXNzaW9uLCBmcmFtZUlkLCBwYXJlbnRGcmFtZUlkKSB7XG4gICAgICAgIGxldCBmcmFtZSA9IHRoaXMuZnJhbWUoZnJhbWVJZCk7XG4gICAgICAgIGlmIChmcmFtZSkge1xuICAgICAgICAgICAgaWYgKHNlc3Npb24gJiYgZnJhbWUuaXNPT1BGcmFtZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gT09QIGlmcmFtZXMgYmVjb21lcyBhIG5vcm1hbCBpZnJhbWUgYWdhaW5cbiAgICAgICAgICAgICAgICAvLyBpdCBpcyBmaXJzdCBhdHRhY2hlZCB0byB0aGUgcGFyZW50IHBhZ2UgYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBpcyByZW1vdmVkLlxuICAgICAgICAgICAgICAgIGZyYW1lLnVwZGF0ZUNsaWVudChzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZSA9IG5ldyBDZHBGcmFtZSh0aGlzLCBmcmFtZUlkLCBwYXJlbnRGcmFtZUlkLCBzZXNzaW9uKTtcbiAgICAgICAgdGhpcy5fZnJhbWVUcmVlLmFkZEZyYW1lKGZyYW1lKTtcbiAgICAgICAgdGhpcy5lbWl0KEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lQXR0YWNoZWQsIGZyYW1lKTtcbiAgICB9XG4gICAgYXN5bmMgI29uRnJhbWVOYXZpZ2F0ZWQoZnJhbWVQYXlsb2FkLCBuYXZpZ2F0aW9uVHlwZSkge1xuICAgICAgICBjb25zdCBmcmFtZUlkID0gZnJhbWVQYXlsb2FkLmlkO1xuICAgICAgICBjb25zdCBpc01haW5GcmFtZSA9ICFmcmFtZVBheWxvYWQucGFyZW50SWQ7XG4gICAgICAgIGxldCBmcmFtZSA9IHRoaXMuX2ZyYW1lVHJlZS5nZXRCeUlkKGZyYW1lSWQpO1xuICAgICAgICAvLyBEZXRhY2ggYWxsIGNoaWxkIGZyYW1lcyBmaXJzdC5cbiAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZyYW1lLmNoaWxkRnJhbWVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIG9yIGNyZWF0ZSBtYWluIGZyYW1lLlxuICAgICAgICBpZiAoaXNNYWluRnJhbWUpIHtcbiAgICAgICAgICAgIGlmIChmcmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmcmFtZSBpZCB0byByZXRhaW4gZnJhbWUgaWRlbnRpdHkgb24gY3Jvc3MtcHJvY2VzcyBuYXZpZ2F0aW9uLlxuICAgICAgICAgICAgICAgIHRoaXMuX2ZyYW1lVHJlZS5yZW1vdmVGcmFtZShmcmFtZSk7XG4gICAgICAgICAgICAgICAgZnJhbWUuX2lkID0gZnJhbWVJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgbWFpbiBmcmFtZSBuYXZpZ2F0aW9uLlxuICAgICAgICAgICAgICAgIGZyYW1lID0gbmV3IENkcEZyYW1lKHRoaXMsIGZyYW1lSWQsIHVuZGVmaW5lZCwgdGhpcy4jY2xpZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lVHJlZS5hZGRGcmFtZShmcmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUgPSBhd2FpdCB0aGlzLl9mcmFtZVRyZWUud2FpdEZvckZyYW1lKGZyYW1lSWQpO1xuICAgICAgICBmcmFtZS5fbmF2aWdhdGVkKGZyYW1lUGF5bG9hZCk7XG4gICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5GcmFtZU5hdmlnYXRlZCwgZnJhbWUpO1xuICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuRnJhbWVOYXZpZ2F0ZWQsIG5hdmlnYXRpb25UeXBlKTtcbiAgICB9XG4gICAgYXN5bmMgI2NyZWF0ZUlzb2xhdGVkV29ybGQoc2Vzc2lvbiwgbmFtZSkge1xuICAgICAgICBjb25zdCBrZXkgPSBgJHtzZXNzaW9uLmlkKCl9OiR7bmFtZX1gO1xuICAgICAgICBpZiAodGhpcy4jaXNvbGF0ZWRXb3JsZHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmQoJ1BhZ2UuYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQnLCB7XG4gICAgICAgICAgICBzb3VyY2U6IGAvLyMgc291cmNlVVJMPSR7UHVwcGV0ZWVyVVJMLklOVEVSTkFMX1VSTH1gLFxuICAgICAgICAgICAgd29ybGROYW1lOiBuYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mcmFtZXMoKVxuICAgICAgICAgICAgLmZpbHRlcihmcmFtZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJhbWUuY2xpZW50ID09PSBzZXNzaW9uO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLm1hcChmcmFtZSA9PiB7XG4gICAgICAgICAgICAvLyBGcmFtZXMgbWlnaHQgYmUgcmVtb3ZlZCBiZWZvcmUgd2Ugc2VuZCB0aGlzLCBzbyB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgICAgICAvLyB0aHJvdyBhbiBlcnJvci5cbiAgICAgICAgICAgIHJldHVybiBzZXNzaW9uXG4gICAgICAgICAgICAgICAgLnNlbmQoJ1BhZ2UuY3JlYXRlSXNvbGF0ZWRXb3JsZCcsIHtcbiAgICAgICAgICAgICAgICBmcmFtZUlkOiBmcmFtZS5faWQsXG4gICAgICAgICAgICAgICAgd29ybGROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgIGdyYW50VW5pdmVyYWxBY2Nlc3M6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLiNpc29sYXRlZFdvcmxkcy5hZGQoa2V5KTtcbiAgICB9XG4gICAgI29uRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudChmcmFtZUlkLCB1cmwpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmZyYW1lKGZyYW1lSWQpO1xuICAgICAgICBpZiAoIWZyYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUuX25hdmlnYXRlZFdpdGhpbkRvY3VtZW50KHVybCk7XG4gICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5GcmFtZU5hdmlnYXRlZFdpdGhpbkRvY3VtZW50LCBmcmFtZSk7XG4gICAgICAgIGZyYW1lLmVtaXQoRnJhbWVFdmVudC5GcmFtZU5hdmlnYXRlZFdpdGhpbkRvY3VtZW50LCB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmVtaXQoRnJhbWVNYW5hZ2VyRXZlbnQuRnJhbWVOYXZpZ2F0ZWQsIGZyYW1lKTtcbiAgICAgICAgZnJhbWUuZW1pdChGcmFtZUV2ZW50LkZyYW1lTmF2aWdhdGVkLCAnTmF2aWdhdGlvbicpO1xuICAgIH1cbiAgICAjb25GcmFtZURldGFjaGVkKGZyYW1lSWQsIHJlYXNvbikge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUoZnJhbWVJZCk7XG4gICAgICAgIGlmICghZnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgY2FzZSAncmVtb3ZlJzpcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHJlbW92ZSB0aGUgZnJhbWUgaWYgdGhlIHJlYXNvbiBmb3IgdGhlIGRldGFjaGVkIGV2ZW50IGlzXG4gICAgICAgICAgICAgICAgLy8gYW4gYWN0dWFsIHJlbW92ZW1lbnQgb2YgdGhlIGZyYW1lLlxuICAgICAgICAgICAgICAgIC8vIEZvciBmcmFtZXMgdGhhdCBiZWNvbWUgT09QIGlmcmFtZXMsIHRoZSByZWFzb24gd291bGQgYmUgJ3N3YXAnLlxuICAgICAgICAgICAgICAgIHRoaXMuI3JlbW92ZUZyYW1lc1JlY3Vyc2l2ZWx5KGZyYW1lKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3N3YXAnOlxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5GcmFtZVN3YXBwZWQsIGZyYW1lKTtcbiAgICAgICAgICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgICNvbkV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkKGNvbnRleHRQYXlsb2FkLCBzZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGF1eERhdGEgPSBjb250ZXh0UGF5bG9hZC5hdXhEYXRhO1xuICAgICAgICBjb25zdCBmcmFtZUlkID0gYXV4RGF0YSAmJiBhdXhEYXRhLmZyYW1lSWQ7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdHlwZW9mIGZyYW1lSWQgPT09ICdzdHJpbmcnID8gdGhpcy5mcmFtZShmcmFtZUlkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHdvcmxkO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgY2FyZSBhYm91dCBleGVjdXRpb24gY29udGV4dHMgY3JlYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi5cbiAgICAgICAgICAgIGlmIChmcmFtZS5jbGllbnQgIT09IHNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29udGV4dFBheWxvYWQuYXV4RGF0YSAmJiBjb250ZXh0UGF5bG9hZC5hdXhEYXRhWydpc0RlZmF1bHQnXSkge1xuICAgICAgICAgICAgICAgIHdvcmxkID0gZnJhbWUud29ybGRzW01BSU5fV09STERdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29udGV4dFBheWxvYWQubmFtZSA9PT0gVVRJTElUWV9XT1JMRF9OQU1FKSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBtdWx0aXBsZSBzZXNzaW9ucyB0byB0aGUgc2FtZSB0YXJnZXQsIHRoZXJlJ3MgYSByYWNlIGJldHdlZW5cbiAgICAgICAgICAgICAgICAvLyBjb25uZWN0aW9ucyBzbyB3ZSBtaWdodCBlbmQgdXAgY3JlYXRpbmcgbXVsdGlwbGUgaXNvbGF0ZWQgd29ybGRzLlxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgZWl0aGVyLlxuICAgICAgICAgICAgICAgIHdvcmxkID0gZnJhbWUud29ybGRzW1BVUFBFVEVFUl9XT1JMRF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gd29ybGQsIHRoZSBjb250ZXh0IGlzIG5vdCBtZWFudCB0byBiZSBoYW5kbGVkIGJ5IHVzLlxuICAgICAgICBpZiAoIXdvcmxkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBFeGVjdXRpb25Db250ZXh0KGZyYW1lPy5jbGllbnQgfHwgdGhpcy4jY2xpZW50LCBjb250ZXh0UGF5bG9hZCwgd29ybGQpO1xuICAgICAgICB3b3JsZC5zZXRDb250ZXh0KGNvbnRleHQpO1xuICAgIH1cbiAgICAjcmVtb3ZlRnJhbWVzUmVjdXJzaXZlbHkoZnJhbWUpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmcmFtZS5jaGlsZEZyYW1lcygpKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWVbZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgdGhpcy5fZnJhbWVUcmVlLnJlbW92ZUZyYW1lKGZyYW1lKTtcbiAgICAgICAgdGhpcy5lbWl0KEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lRGV0YWNoZWQsIGZyYW1lKTtcbiAgICAgICAgZnJhbWUuZW1pdChGcmFtZUV2ZW50LkZyYW1lRGV0YWNoZWQsIGZyYW1lKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GcmFtZU1hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogV2UgdXNlIHN5bWJvbHMgdG8gcHJldmVudCBleHRlcm5hbCBwYXJ0aWVzIGxpc3RlbmluZyB0byB0aGVzZSBldmVudHMuXG4gKiBUaGV5IGFyZSBpbnRlcm5hbCB0byBQdXBwZXRlZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIEZyYW1lTWFuYWdlckV2ZW50O1xuKGZ1bmN0aW9uIChGcmFtZU1hbmFnZXJFdmVudCkge1xuICAgIEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lQXR0YWNoZWQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZUF0dGFjaGVkJyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuRnJhbWVOYXZpZ2F0ZWQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZU5hdmlnYXRlZCcpO1xuICAgIEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lRGV0YWNoZWQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZURldGFjaGVkJyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuRnJhbWVTd2FwcGVkID0gU3ltYm9sKCdGcmFtZU1hbmFnZXIuRnJhbWVTd2FwcGVkJyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuTGlmZWN5Y2xlRXZlbnQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5MaWZlY3ljbGVFdmVudCcpO1xuICAgIEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lTmF2aWdhdGVkV2l0aGluRG9jdW1lbnQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZU5hdmlnYXRlZFdpdGhpbkRvY3VtZW50Jyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuQ29uc29sZUFwaUNhbGxlZCA9IFN5bWJvbCgnRnJhbWVNYW5hZ2VyLkNvbnNvbGVBcGlDYWxsZWQnKTtcbiAgICBGcmFtZU1hbmFnZXJFdmVudC5CaW5kaW5nQ2FsbGVkID0gU3ltYm9sKCdGcmFtZU1hbmFnZXIuQmluZGluZ0NhbGxlZCcpO1xufSkoRnJhbWVNYW5hZ2VyRXZlbnQgfHwgKEZyYW1lTWFuYWdlckV2ZW50ID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyYW1lTWFuYWdlckV2ZW50cy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIHBhZ2UgZnJhbWUgdHJlZSBhbmQgaXQncyBpcyBtYW5hZ2VkIGJ5XG4gKiB7QGxpbmsgRnJhbWVNYW5hZ2VyfS4gRnJhbWVUcmVlIHVzZXMgZnJhbWUgSURzIHRvIHJlZmVyZW5jZSBmcmFtZSBhbmQgaXRcbiAqIG1lYW5zIHRoYXQgcmVmZXJlbmNlZCBmcmFtZXMgbWlnaHQgbm90IGJlIGluIHRoZSB0cmVlIGFueW1vcmUuIFRodXMsIHRoZSB0cmVlXG4gKiBzdHJ1Y3R1cmUgaXMgZXZlbnR1YWxseSBjb25zaXN0ZW50LlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBGcmFtZVRyZWUge1xuICAgICNmcmFtZXMgPSBuZXcgTWFwKCk7XG4gICAgLy8gZnJhbWVJRCAtPiBwYXJlbnRGcmFtZUlEXG4gICAgI3BhcmVudElkcyA9IG5ldyBNYXAoKTtcbiAgICAvLyBmcmFtZUlEIC0+IGNoaWxkRnJhbWVJRHNcbiAgICAjY2hpbGRJZHMgPSBuZXcgTWFwKCk7XG4gICAgI21haW5GcmFtZTtcbiAgICAjaXNNYWluRnJhbWVTdGFsZSA9IGZhbHNlO1xuICAgICN3YWl0UmVxdWVzdHMgPSBuZXcgTWFwKCk7XG4gICAgZ2V0TWFpbkZyYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWFpbkZyYW1lO1xuICAgIH1cbiAgICBnZXRCeUlkKGZyYW1lSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZyYW1lcy5nZXQoZnJhbWVJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgZnJhbWUgd2l0aFxuICAgICAqIHRoZSBnaXZlbiBJRCBpcyBhZGRlZCB0byB0aGUgdHJlZS5cbiAgICAgKi9cbiAgICB3YWl0Rm9yRnJhbWUoZnJhbWVJZCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZ2V0QnlJZChmcmFtZUlkKTtcbiAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZyYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLiN3YWl0UmVxdWVzdHMuZ2V0KGZyYW1lSWQpIHx8IG5ldyBTZXQoKTtcbiAgICAgICAgY2FsbGJhY2tzLmFkZChkZWZlcnJlZCk7XG4gICAgICAgIHJldHVybiBkZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgZnJhbWVzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiNmcmFtZXMudmFsdWVzKCkpO1xuICAgIH1cbiAgICBhZGRGcmFtZShmcmFtZSkge1xuICAgICAgICB0aGlzLiNmcmFtZXMuc2V0KGZyYW1lLl9pZCwgZnJhbWUpO1xuICAgICAgICBpZiAoZnJhbWUuX3BhcmVudElkKSB7XG4gICAgICAgICAgICB0aGlzLiNwYXJlbnRJZHMuc2V0KGZyYW1lLl9pZCwgZnJhbWUuX3BhcmVudElkKTtcbiAgICAgICAgICAgIGlmICghdGhpcy4jY2hpbGRJZHMuaGFzKGZyYW1lLl9wYXJlbnRJZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjaGlsZElkcy5zZXQoZnJhbWUuX3BhcmVudElkLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jY2hpbGRJZHMuZ2V0KGZyYW1lLl9wYXJlbnRJZCkuYWRkKGZyYW1lLl9pZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuI21haW5GcmFtZSB8fCB0aGlzLiNpc01haW5GcmFtZVN0YWxlKSB7XG4gICAgICAgICAgICB0aGlzLiNtYWluRnJhbWUgPSBmcmFtZTtcbiAgICAgICAgICAgIHRoaXMuI2lzTWFpbkZyYW1lU3RhbGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN3YWl0UmVxdWVzdHMuZ2V0KGZyYW1lLl9pZCk/LmZvckVhY2gocmVxdWVzdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5yZXNvbHZlKGZyYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZUZyYW1lKGZyYW1lKSB7XG4gICAgICAgIHRoaXMuI2ZyYW1lcy5kZWxldGUoZnJhbWUuX2lkKTtcbiAgICAgICAgdGhpcy4jcGFyZW50SWRzLmRlbGV0ZShmcmFtZS5faWQpO1xuICAgICAgICBpZiAoZnJhbWUuX3BhcmVudElkKSB7XG4gICAgICAgICAgICB0aGlzLiNjaGlsZElkcy5nZXQoZnJhbWUuX3BhcmVudElkKT8uZGVsZXRlKGZyYW1lLl9pZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNpc01haW5GcmFtZVN0YWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjaGlsZEZyYW1lcyhmcmFtZUlkKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkSWRzID0gdGhpcy4jY2hpbGRJZHMuZ2V0KGZyYW1lSWQpO1xuICAgICAgICBpZiAoIWNoaWxkSWRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oY2hpbGRJZHMpXG4gICAgICAgICAgICAubWFwKGlkID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEJ5SWQoaWQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigoZnJhbWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmcmFtZSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGFyZW50RnJhbWUoZnJhbWVJZCkge1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMuI3BhcmVudElkcy5nZXQoZnJhbWVJZCk7XG4gICAgICAgIHJldHVybiBwYXJlbnRJZCA/IHRoaXMuZ2V0QnlJZChwYXJlbnRJZCkgOiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnJhbWVUcmVlLmpzLm1hcCIsImltcG9ydCB7IGhlYWRlcnNBcnJheSwgSFRUUFJlcXVlc3QsIFNUQVRVU19URVhUUywgaGFuZGxlRXJyb3IsIH0gZnJvbSAnLi4vYXBpL0hUVFBSZXF1ZXN0LmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwSFRUUFJlcXVlc3QgZXh0ZW5kcyBIVFRQUmVxdWVzdCB7XG4gICAgaWQ7XG4gICAgI2NsaWVudDtcbiAgICAjaXNOYXZpZ2F0aW9uUmVxdWVzdDtcbiAgICAjdXJsO1xuICAgICNyZXNvdXJjZVR5cGU7XG4gICAgI21ldGhvZDtcbiAgICAjaGFzUG9zdERhdGEgPSBmYWxzZTtcbiAgICAjcG9zdERhdGE7XG4gICAgI2hlYWRlcnMgPSB7fTtcbiAgICAjZnJhbWU7XG4gICAgI2luaXRpYXRvcjtcbiAgICBnZXQgY2xpZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50O1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIGZyYW1lLCBpbnRlcmNlcHRpb25JZCwgYWxsb3dJbnRlcmNlcHRpb24sIGRhdGEsIHJlZGlyZWN0Q2hhaW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB0aGlzLmlkID0gZGF0YS5yZXF1ZXN0SWQ7XG4gICAgICAgIHRoaXMuI2lzTmF2aWdhdGlvblJlcXVlc3QgPVxuICAgICAgICAgICAgZGF0YS5yZXF1ZXN0SWQgPT09IGRhdGEubG9hZGVySWQgJiYgZGF0YS50eXBlID09PSAnRG9jdW1lbnQnO1xuICAgICAgICB0aGlzLl9pbnRlcmNlcHRpb25JZCA9IGludGVyY2VwdGlvbklkO1xuICAgICAgICB0aGlzLiN1cmwgPSBkYXRhLnJlcXVlc3QudXJsO1xuICAgICAgICB0aGlzLiNyZXNvdXJjZVR5cGUgPSAoZGF0YS50eXBlIHx8ICdvdGhlcicpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHRoaXMuI21ldGhvZCA9IGRhdGEucmVxdWVzdC5tZXRob2Q7XG4gICAgICAgIHRoaXMuI3Bvc3REYXRhID0gZGF0YS5yZXF1ZXN0LnBvc3REYXRhO1xuICAgICAgICB0aGlzLiNoYXNQb3N0RGF0YSA9IGRhdGEucmVxdWVzdC5oYXNQb3N0RGF0YSA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy4jZnJhbWUgPSBmcmFtZTtcbiAgICAgICAgdGhpcy5fcmVkaXJlY3RDaGFpbiA9IHJlZGlyZWN0Q2hhaW47XG4gICAgICAgIHRoaXMuI2luaXRpYXRvciA9IGRhdGEuaW5pdGlhdG9yO1xuICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5lbmFibGVkID0gYWxsb3dJbnRlcmNlcHRpb247XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEucmVxdWVzdC5oZWFkZXJzKSkge1xuICAgICAgICAgICAgdGhpcy4jaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN1cmw7XG4gICAgfVxuICAgIHJlc291cmNlVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlVHlwZTtcbiAgICB9XG4gICAgbWV0aG9kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWV0aG9kO1xuICAgIH1cbiAgICBwb3N0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Bvc3REYXRhO1xuICAgIH1cbiAgICBoYXNQb3N0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hhc1Bvc3REYXRhO1xuICAgIH1cbiAgICBhc3luYyBmZXRjaFBvc3REYXRhKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ05ldHdvcmsuZ2V0UmVxdWVzdFBvc3REYXRhJywge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5wb3N0RGF0YTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hlYWRlcnM7XG4gICAgfVxuICAgIHJlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2U7XG4gICAgfVxuICAgIGZyYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWU7XG4gICAgfVxuICAgIGlzTmF2aWdhdGlvblJlcXVlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc05hdmlnYXRpb25SZXF1ZXN0O1xuICAgIH1cbiAgICBpbml0aWF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpbml0aWF0b3I7XG4gICAgfVxuICAgIHJlZGlyZWN0Q2hhaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWRpcmVjdENoYWluLnNsaWNlKCk7XG4gICAgfVxuICAgIGZhaWx1cmUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZmFpbHVyZVRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvclRleHQ6IHRoaXMuX2ZhaWx1cmVUZXh0LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBfY29udGludWUob3ZlcnJpZGVzID0ge30pIHtcbiAgICAgICAgY29uc3QgeyB1cmwsIG1ldGhvZCwgcG9zdERhdGEsIGhlYWRlcnMgfSA9IG92ZXJyaWRlcztcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBvc3REYXRhQmluYXJ5QmFzZTY0ID0gcG9zdERhdGEgPyBidG9hKHBvc3REYXRhKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMuX2ludGVyY2VwdGlvbklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSFRUUFJlcXVlc3QgaXMgbWlzc2luZyBfaW50ZXJjZXB0aW9uSWQgbmVlZGVkIGZvciBGZXRjaC5jb250aW51ZVJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnRcbiAgICAgICAgICAgIC5zZW5kKCdGZXRjaC5jb250aW51ZVJlcXVlc3QnLCB7XG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHRoaXMuX2ludGVyY2VwdGlvbklkLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgcG9zdERhdGE6IHBvc3REYXRhQmluYXJ5QmFzZTY0LFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyA/IGhlYWRlcnNBcnJheShoZWFkZXJzKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5oYW5kbGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX3Jlc3BvbmQocmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGxldCBwYXJzZWRCb2R5O1xuICAgICAgICBpZiAocmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgcGFyc2VkQm9keSA9IEhUVFBSZXF1ZXN0LmdldFJlc3BvbnNlKHJlc3BvbnNlLmJvZHkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgb2YgT2JqZWN0LmtleXMocmVzcG9uc2UuaGVhZGVycykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgICAgICAgICByZXNwb25zZUhlYWRlcnNbaGVhZGVyLnRvTG93ZXJDYXNlKCldID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyB2YWx1ZS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLmNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICByZXNwb25zZUhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gcmVzcG9uc2UuY29udGVudFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZEJvZHk/LmNvbnRlbnRMZW5ndGggJiYgISgnY29udGVudC1sZW5ndGgnIGluIHJlc3BvbnNlSGVhZGVycykpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9IFN0cmluZyhwYXJzZWRCb2R5LmNvbnRlbnRMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cyB8fCAyMDA7XG4gICAgICAgIGlmICh0aGlzLl9pbnRlcmNlcHRpb25JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hUVFBSZXF1ZXN0IGlzIG1pc3NpbmcgX2ludGVyY2VwdGlvbklkIG5lZWRlZCBmb3IgRmV0Y2guZnVsZmlsbFJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnRcbiAgICAgICAgICAgIC5zZW5kKCdGZXRjaC5mdWxmaWxsUmVxdWVzdCcsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZDogdGhpcy5faW50ZXJjZXB0aW9uSWQsXG4gICAgICAgICAgICByZXNwb25zZUNvZGU6IHN0YXR1cyxcbiAgICAgICAgICAgIHJlc3BvbnNlUGhyYXNlOiBTVEFUVVNfVEVYVFNbc3RhdHVzXSxcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyczogaGVhZGVyc0FycmF5KHJlc3BvbnNlSGVhZGVycyksXG4gICAgICAgICAgICBib2R5OiBwYXJzZWRCb2R5Py5iYXNlNjQsXG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIF9hYm9ydChlcnJvclJlYXNvbikge1xuICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5oYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuX2ludGVyY2VwdGlvbklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSFRUUFJlcXVlc3QgaXMgbWlzc2luZyBfaW50ZXJjZXB0aW9uSWQgbmVlZGVkIGZvciBGZXRjaC5mYWlsUmVxdWVzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudFxuICAgICAgICAgICAgLnNlbmQoJ0ZldGNoLmZhaWxSZXF1ZXN0Jywge1xuICAgICAgICAgICAgcmVxdWVzdElkOiB0aGlzLl9pbnRlcmNlcHRpb25JZCxcbiAgICAgICAgICAgIGVycm9yUmVhc29uOiBlcnJvclJlYXNvbiB8fCAnRmFpbGVkJyxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChoYW5kbGVFcnJvcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SFRUUFJlcXVlc3QuanMubWFwIiwiaW1wb3J0IHsgSFRUUFJlc3BvbnNlIH0gZnJvbSAnLi4vYXBpL0hUVFBSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBQcm90b2NvbEVycm9yIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eURldGFpbHMgfSBmcm9tICcuLi9jb21tb24vU2VjdXJpdHlEZXRhaWxzLmpzJztcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi4vdXRpbC9EZWZlcnJlZC5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwSFRUUFJlc3BvbnNlIGV4dGVuZHMgSFRUUFJlc3BvbnNlIHtcbiAgICAjY2xpZW50O1xuICAgICNyZXF1ZXN0O1xuICAgICNjb250ZW50UHJvbWlzZSA9IG51bGw7XG4gICAgI2JvZHlMb2FkZWREZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICNyZW1vdGVBZGRyZXNzO1xuICAgICNzdGF0dXM7XG4gICAgI3N0YXR1c1RleHQ7XG4gICAgI3VybDtcbiAgICAjZnJvbURpc2tDYWNoZTtcbiAgICAjZnJvbVNlcnZpY2VXb3JrZXI7XG4gICAgI2hlYWRlcnMgPSB7fTtcbiAgICAjc2VjdXJpdHlEZXRhaWxzO1xuICAgICN0aW1pbmc7XG4gICAgY29uc3RydWN0b3IoY2xpZW50LCByZXF1ZXN0LCByZXNwb25zZVBheWxvYWQsIGV4dHJhSW5mbykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3JlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICB0aGlzLiNyZW1vdGVBZGRyZXNzID0ge1xuICAgICAgICAgICAgaXA6IHJlc3BvbnNlUGF5bG9hZC5yZW1vdGVJUEFkZHJlc3MsXG4gICAgICAgICAgICBwb3J0OiByZXNwb25zZVBheWxvYWQucmVtb3RlUG9ydCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3RhdHVzVGV4dCA9XG4gICAgICAgICAgICB0aGlzLiNwYXJzZVN0YXR1c1RleHRGcm9tRXh0cmFJbmZvKGV4dHJhSW5mbykgfHxcbiAgICAgICAgICAgICAgICByZXNwb25zZVBheWxvYWQuc3RhdHVzVGV4dDtcbiAgICAgICAgdGhpcy4jdXJsID0gcmVxdWVzdC51cmwoKTtcbiAgICAgICAgdGhpcy4jZnJvbURpc2tDYWNoZSA9ICEhcmVzcG9uc2VQYXlsb2FkLmZyb21EaXNrQ2FjaGU7XG4gICAgICAgIHRoaXMuI2Zyb21TZXJ2aWNlV29ya2VyID0gISFyZXNwb25zZVBheWxvYWQuZnJvbVNlcnZpY2VXb3JrZXI7XG4gICAgICAgIHRoaXMuI3N0YXR1cyA9IGV4dHJhSW5mbyA/IGV4dHJhSW5mby5zdGF0dXNDb2RlIDogcmVzcG9uc2VQYXlsb2FkLnN0YXR1cztcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGV4dHJhSW5mbyA/IGV4dHJhSW5mby5oZWFkZXJzIDogcmVzcG9uc2VQYXlsb2FkLmhlYWRlcnM7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgICB0aGlzLiNoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3NlY3VyaXR5RGV0YWlscyA9IHJlc3BvbnNlUGF5bG9hZC5zZWN1cml0eURldGFpbHNcbiAgICAgICAgICAgID8gbmV3IFNlY3VyaXR5RGV0YWlscyhyZXNwb25zZVBheWxvYWQuc2VjdXJpdHlEZXRhaWxzKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICB0aGlzLiN0aW1pbmcgPSByZXNwb25zZVBheWxvYWQudGltaW5nIHx8IG51bGw7XG4gICAgfVxuICAgICNwYXJzZVN0YXR1c1RleHRGcm9tRXh0cmFJbmZvKGV4dHJhSW5mbykge1xuICAgICAgICBpZiAoIWV4dHJhSW5mbyB8fCAhZXh0cmFJbmZvLmhlYWRlcnNUZXh0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RMaW5lID0gZXh0cmFJbmZvLmhlYWRlcnNUZXh0LnNwbGl0KCdcXHInLCAxKVswXTtcbiAgICAgICAgaWYgKCFmaXJzdExpbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXRjaCA9IGZpcnN0TGluZS5tYXRjaCgvW14gXSogW14gXSogKC4qKS8pO1xuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzVGV4dCA9IG1hdGNoWzFdO1xuICAgICAgICBpZiAoIXN0YXR1c1RleHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdHVzVGV4dDtcbiAgICB9XG4gICAgX3Jlc29sdmVCb2R5KGVycikge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jYm9keUxvYWRlZERlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNib2R5TG9hZGVkRGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdGVBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmVtb3RlQWRkcmVzcztcbiAgICB9XG4gICAgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdXJsO1xuICAgIH1cbiAgICBzdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0dXM7XG4gICAgfVxuICAgIHN0YXR1c1RleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0dXNUZXh0O1xuICAgIH1cbiAgICBoZWFkZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaGVhZGVycztcbiAgICB9XG4gICAgc2VjdXJpdHlEZXRhaWxzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc2VjdXJpdHlEZXRhaWxzO1xuICAgIH1cbiAgICB0aW1pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0aW1pbmc7XG4gICAgfVxuICAgIGJ1ZmZlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNjb250ZW50UHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy4jY29udGVudFByb21pc2UgPSB0aGlzLiNib2R5TG9hZGVkRGVmZXJyZWRcbiAgICAgICAgICAgICAgICAudmFsdWVPclRocm93KClcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnTmV0d29yay5nZXRSZXNwb25zZUJvZHknLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHRoaXMuI3JlcXVlc3QuaWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20ocmVzcG9uc2UuYm9keSwgcmVzcG9uc2UuYmFzZTY0RW5jb2RlZCA/ICdiYXNlNjQnIDogJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFByb3RvY29sRXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm9yaWdpbmFsTWVzc2FnZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTm8gcmVzb3VyY2Ugd2l0aCBnaXZlbiBpZGVudGlmaWVyIGZvdW5kJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGJvZHkgZm9yIHRoaXMgcmVxdWVzdC4gVGhpcyBtaWdodCBoYXBwZW4gaWYgdGhlIHJlcXVlc3QgaXMgYSBwcmVmbGlnaHQgcmVxdWVzdC4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jY29udGVudFByb21pc2U7XG4gICAgfVxuICAgIHJlcXVlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0O1xuICAgIH1cbiAgICBmcm9tQ2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmcm9tRGlza0NhY2hlIHx8IHRoaXMuI3JlcXVlc3QuX2Zyb21NZW1vcnlDYWNoZTtcbiAgICB9XG4gICAgZnJvbVNlcnZpY2VXb3JrZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmcm9tU2VydmljZVdvcmtlcjtcbiAgICB9XG4gICAgZnJhbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0LmZyYW1lKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SFRUUFJlc3BvbnNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBLZXlib2FyZCwgTW91c2UsIE1vdXNlQnV0dG9uLCBUb3VjaHNjcmVlbiwgfSBmcm9tICcuLi9hcGkvSW5wdXQuanMnO1xuaW1wb3J0IHsgX2tleURlZmluaXRpb25zLCB9IGZyb20gJy4uL2NvbW1vbi9VU0tleWJvYXJkTGF5b3V0LmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBLZXlib2FyZCBleHRlbmRzIEtleWJvYXJkIHtcbiAgICAjY2xpZW50O1xuICAgICNwcmVzc2VkS2V5cyA9IG5ldyBTZXQoKTtcbiAgICBfbW9kaWZpZXJzID0gMDtcbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICB1cGRhdGVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgYXN5bmMgZG93bihrZXksIG9wdGlvbnMgPSB7XG4gICAgICAgIHRleHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgY29tbWFuZHM6IFtdLFxuICAgIH0pIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLiNrZXlEZXNjcmlwdGlvbkZvclN0cmluZyhrZXkpO1xuICAgICAgICBjb25zdCBhdXRvUmVwZWF0ID0gdGhpcy4jcHJlc3NlZEtleXMuaGFzKGRlc2NyaXB0aW9uLmNvZGUpO1xuICAgICAgICB0aGlzLiNwcmVzc2VkS2V5cy5hZGQoZGVzY3JpcHRpb24uY29kZSk7XG4gICAgICAgIHRoaXMuX21vZGlmaWVycyB8PSB0aGlzLiNtb2RpZmllckJpdChkZXNjcmlwdGlvbi5rZXkpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gb3B0aW9ucy50ZXh0ID09PSB1bmRlZmluZWQgPyBkZXNjcmlwdGlvbi50ZXh0IDogb3B0aW9ucy50ZXh0O1xuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hLZXlFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6IHRleHQgPyAna2V5RG93bicgOiAncmF3S2V5RG93bicsXG4gICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuX21vZGlmaWVycyxcbiAgICAgICAgICAgIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogZGVzY3JpcHRpb24ua2V5Q29kZSxcbiAgICAgICAgICAgIGNvZGU6IGRlc2NyaXB0aW9uLmNvZGUsXG4gICAgICAgICAgICBrZXk6IGRlc2NyaXB0aW9uLmtleSxcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgICB1bm1vZGlmaWVkVGV4dDogdGV4dCxcbiAgICAgICAgICAgIGF1dG9SZXBlYXQsXG4gICAgICAgICAgICBsb2NhdGlvbjogZGVzY3JpcHRpb24ubG9jYXRpb24sXG4gICAgICAgICAgICBpc0tleXBhZDogZGVzY3JpcHRpb24ubG9jYXRpb24gPT09IDMsXG4gICAgICAgICAgICBjb21tYW5kczogb3B0aW9ucy5jb21tYW5kcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICNtb2RpZmllckJpdChrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ0FsdCcpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdDb250cm9sJykge1xuICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ01ldGEnKSB7XG4gICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSAnU2hpZnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gODtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgI2tleURlc2NyaXB0aW9uRm9yU3RyaW5nKGtleVN0cmluZykge1xuICAgICAgICBjb25zdCBzaGlmdCA9IHRoaXMuX21vZGlmaWVycyAmIDg7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0ge1xuICAgICAgICAgICAga2V5OiAnJyxcbiAgICAgICAgICAgIGtleUNvZGU6IDAsXG4gICAgICAgICAgICBjb2RlOiAnJyxcbiAgICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgICAgbG9jYXRpb246IDAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBfa2V5RGVmaW5pdGlvbnNba2V5U3RyaW5nXTtcbiAgICAgICAgYXNzZXJ0KGRlZmluaXRpb24sIGBVbmtub3duIGtleTogXCIke2tleVN0cmluZ31cImApO1xuICAgICAgICBpZiAoZGVmaW5pdGlvbi5rZXkpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLmtleSA9IGRlZmluaXRpb24ua2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaGlmdCAmJiBkZWZpbml0aW9uLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi5rZXkgPSBkZWZpbml0aW9uLnNoaWZ0S2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZpbml0aW9uLmtleUNvZGUpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLmtleUNvZGUgPSBkZWZpbml0aW9uLmtleUNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoaWZ0ICYmIGRlZmluaXRpb24uc2hpZnRLZXlDb2RlKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi5rZXlDb2RlID0gZGVmaW5pdGlvbi5zaGlmdEtleUNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmluaXRpb24uY29kZSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24uY29kZSA9IGRlZmluaXRpb24uY29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmaW5pdGlvbi5sb2NhdGlvbikge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24ubG9jYXRpb24gPSBkZWZpbml0aW9uLmxvY2F0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbi5rZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi50ZXh0ID0gZGVzY3JpcHRpb24ua2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZpbml0aW9uLnRleHQpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLnRleHQgPSBkZWZpbml0aW9uLnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoaWZ0ICYmIGRlZmluaXRpb24uc2hpZnRUZXh0KSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi50ZXh0ID0gZGVmaW5pdGlvbi5zaGlmdFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYW55IG1vZGlmaWVycyBiZXNpZGVzIHNoaWZ0IGFyZSBwcmVzc2VkLCBubyB0ZXh0IHNob3VsZCBiZSBzZW50XG4gICAgICAgIGlmICh0aGlzLl9tb2RpZmllcnMgJiB+OCkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24udGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgYXN5bmMgdXAoa2V5KSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy4ja2V5RGVzY3JpcHRpb25Gb3JTdHJpbmcoa2V5KTtcbiAgICAgICAgdGhpcy5fbW9kaWZpZXJzICY9IH50aGlzLiNtb2RpZmllckJpdChkZXNjcmlwdGlvbi5rZXkpO1xuICAgICAgICB0aGlzLiNwcmVzc2VkS2V5cy5kZWxldGUoZGVzY3JpcHRpb24uY29kZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaEtleUV2ZW50Jywge1xuICAgICAgICAgICAgdHlwZTogJ2tleVVwJyxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy5fbW9kaWZpZXJzLFxuICAgICAgICAgICAga2V5OiBkZXNjcmlwdGlvbi5rZXksXG4gICAgICAgICAgICB3aW5kb3dzVmlydHVhbEtleUNvZGU6IGRlc2NyaXB0aW9uLmtleUNvZGUsXG4gICAgICAgICAgICBjb2RlOiBkZXNjcmlwdGlvbi5jb2RlLFxuICAgICAgICAgICAgbG9jYXRpb246IGRlc2NyaXB0aW9uLmxvY2F0aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2VuZENoYXJhY3RlcihjaGFyKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5pbnNlcnRUZXh0JywgeyB0ZXh0OiBjaGFyIH0pO1xuICAgIH1cbiAgICBjaGFySXNLZXkoY2hhcikge1xuICAgICAgICByZXR1cm4gISFfa2V5RGVmaW5pdGlvbnNbY2hhcl07XG4gICAgfVxuICAgIGFzeW5jIHR5cGUodGV4dCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gb3B0aW9ucy5kZWxheSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hhciBvZiB0ZXh0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGFySXNLZXkoY2hhcikpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByZXNzKGNoYXIsIHsgZGVsYXkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChmLCBkZWxheSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRDaGFyYWN0ZXIoY2hhcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcHJlc3Moa2V5LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IG51bGwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGF3YWl0IHRoaXMuZG93bihrZXksIG9wdGlvbnMpO1xuICAgICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKGYgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGYsIG9wdGlvbnMuZGVsYXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy51cChrZXkpO1xuICAgIH1cbn1cbmNvbnN0IGdldEZsYWcgPSAoYnV0dG9uKSA9PiB7XG4gICAgc3dpdGNoIChidXR0b24pIHtcbiAgICAgICAgY2FzZSBNb3VzZUJ1dHRvbi5MZWZ0OlxuICAgICAgICAgICAgcmV0dXJuIDEgLyogTW91c2VCdXR0b25GbGFnLkxlZnQgKi87XG4gICAgICAgIGNhc2UgTW91c2VCdXR0b24uUmlnaHQ6XG4gICAgICAgICAgICByZXR1cm4gMiAvKiBNb3VzZUJ1dHRvbkZsYWcuUmlnaHQgKi87XG4gICAgICAgIGNhc2UgTW91c2VCdXR0b24uTWlkZGxlOlxuICAgICAgICAgICAgcmV0dXJuIDQgLyogTW91c2VCdXR0b25GbGFnLk1pZGRsZSAqLztcbiAgICAgICAgY2FzZSBNb3VzZUJ1dHRvbi5CYWNrOlxuICAgICAgICAgICAgcmV0dXJuIDggLyogTW91c2VCdXR0b25GbGFnLkJhY2sgKi87XG4gICAgICAgIGNhc2UgTW91c2VCdXR0b24uRm9yd2FyZDpcbiAgICAgICAgICAgIHJldHVybiAxNiAvKiBNb3VzZUJ1dHRvbkZsYWcuRm9yd2FyZCAqLztcbiAgICB9XG59O1xuLyoqXG4gKiBUaGlzIHNob3VsZCBtYXRjaFxuICogaHR0cHM6Ly9zb3VyY2UuY2hyb21pdW0ub3JnL2Nocm9taXVtL2Nocm9taXVtL3NyYy8rL3JlZnMvaGVhZHMvbWFpbjpjb250ZW50L2Jyb3dzZXIvcmVuZGVyZXJfaG9zdC9pbnB1dC93ZWJfaW5wdXRfZXZlbnRfYnVpbGRlcnNfbWFjLm1tO2RyYz1hNjFiOTVjNjNiMGI3NWMxY2ZlODcyZDljOGNkZjkyN2MyMjYwNDZlO2Jwdj0xO2JwdD0xO2w9MjIxLlxuICovXG5jb25zdCBnZXRCdXR0b25Gcm9tUHJlc3NlZEJ1dHRvbnMgPSAoYnV0dG9ucykgPT4ge1xuICAgIGlmIChidXR0b25zICYgMSAvKiBNb3VzZUJ1dHRvbkZsYWcuTGVmdCAqLykge1xuICAgICAgICByZXR1cm4gTW91c2VCdXR0b24uTGVmdDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnV0dG9ucyAmIDIgLyogTW91c2VCdXR0b25GbGFnLlJpZ2h0ICovKSB7XG4gICAgICAgIHJldHVybiBNb3VzZUJ1dHRvbi5SaWdodDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnV0dG9ucyAmIDQgLyogTW91c2VCdXR0b25GbGFnLk1pZGRsZSAqLykge1xuICAgICAgICByZXR1cm4gTW91c2VCdXR0b24uTWlkZGxlO1xuICAgIH1cbiAgICBlbHNlIGlmIChidXR0b25zICYgOCAvKiBNb3VzZUJ1dHRvbkZsYWcuQmFjayAqLykge1xuICAgICAgICByZXR1cm4gTW91c2VCdXR0b24uQmFjaztcbiAgICB9XG4gICAgZWxzZSBpZiAoYnV0dG9ucyAmIDE2IC8qIE1vdXNlQnV0dG9uRmxhZy5Gb3J3YXJkICovKSB7XG4gICAgICAgIHJldHVybiBNb3VzZUJ1dHRvbi5Gb3J3YXJkO1xuICAgIH1cbiAgICByZXR1cm4gJ25vbmUnO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBNb3VzZSBleHRlbmRzIE1vdXNlIHtcbiAgICAjY2xpZW50O1xuICAgICNrZXlib2FyZDtcbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIGtleWJvYXJkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICAgICAgdGhpcy4ja2V5Ym9hcmQgPSBrZXlib2FyZDtcbiAgICB9XG4gICAgdXBkYXRlQ2xpZW50KGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgICNfc3RhdGUgPSB7XG4gICAgICAgIHBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgYnV0dG9uczogMCAvKiBNb3VzZUJ1dHRvbkZsYWcuTm9uZSAqLyxcbiAgICB9O1xuICAgIGdldCAjc3RhdGUoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgLi4udGhpcy4jX3N0YXRlIH0sIC4uLnRoaXMuI3RyYW5zYWN0aW9ucyk7XG4gICAgfVxuICAgIC8vIFRyYW5zYWN0aW9ucyBjYW4gcnVuIGluIHBhcmFsbGVsLCBzbyB3ZSBzdG9yZSBlYWNoIG9mIHRobWUgaW4gdGhpcyBhcnJheS5cbiAgICAjdHJhbnNhY3Rpb25zID0gW107XG4gICAgI2NyZWF0ZVRyYW5zYWN0aW9uKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHt9O1xuICAgICAgICB0aGlzLiN0cmFuc2FjdGlvbnMucHVzaCh0cmFuc2FjdGlvbik7XG4gICAgICAgIGNvbnN0IHBvcFRyYW5zYWN0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jdHJhbnNhY3Rpb25zLnNwbGljZSh0aGlzLiN0cmFuc2FjdGlvbnMuaW5kZXhPZih0cmFuc2FjdGlvbiksIDEpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXBkYXRlOiAodXBkYXRlcykgPT4ge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odHJhbnNhY3Rpb24sIHVwZGF0ZXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbW1pdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI19zdGF0ZSA9IHsgLi4udGhpcy4jX3N0YXRlLCAuLi50cmFuc2FjdGlvbiB9O1xuICAgICAgICAgICAgICAgIHBvcFRyYW5zYWN0aW9uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm9sbGJhY2s6IHBvcFRyYW5zYWN0aW9uLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIGEgdHlwaWNhbCB1cGRhdGUsIGNvbW1pdC9yb2xsYmFjayBsaWZlY3ljbGUgYmFzZWQgb25cbiAgICAgKiB0aGUgZXJyb3Igb2YgdGhlIGFjdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyAjd2l0aFRyYW5zYWN0aW9uKGFjdGlvbikge1xuICAgICAgICBjb25zdCB7IHVwZGF0ZSwgY29tbWl0LCByb2xsYmFjayB9ID0gdGhpcy4jY3JlYXRlVHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGFjdGlvbih1cGRhdGUpO1xuICAgICAgICAgICAgY29tbWl0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByb2xsYmFjaygpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcmVzZXQoKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbZmxhZywgYnV0dG9uXSBvZiBbXG4gICAgICAgICAgICBbMSAvKiBNb3VzZUJ1dHRvbkZsYWcuTGVmdCAqLywgTW91c2VCdXR0b24uTGVmdF0sXG4gICAgICAgICAgICBbNCAvKiBNb3VzZUJ1dHRvbkZsYWcuTWlkZGxlICovLCBNb3VzZUJ1dHRvbi5NaWRkbGVdLFxuICAgICAgICAgICAgWzIgLyogTW91c2VCdXR0b25GbGFnLlJpZ2h0ICovLCBNb3VzZUJ1dHRvbi5SaWdodF0sXG4gICAgICAgICAgICBbMTYgLyogTW91c2VCdXR0b25GbGFnLkZvcndhcmQgKi8sIE1vdXNlQnV0dG9uLkZvcndhcmRdLFxuICAgICAgICAgICAgWzggLyogTW91c2VCdXR0b25GbGFnLkJhY2sgKi8sIE1vdXNlQnV0dG9uLkJhY2tdLFxuICAgICAgICBdKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jc3RhdGUuYnV0dG9ucyAmIGZsYWcpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zLnB1c2godGhpcy51cCh7IGJ1dHRvbjogYnV0dG9uIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jc3RhdGUucG9zaXRpb24ueCAhPT0gMCB8fCB0aGlzLiNzdGF0ZS5wb3NpdGlvbi55ICE9PSAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2godGhpcy5tb3ZlKDAsIDApKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChhY3Rpb25zKTtcbiAgICB9XG4gICAgYXN5bmMgbW92ZSh4LCB5LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzdGVwcyA9IDEgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGZyb20gPSB0aGlzLiNzdGF0ZS5wb3NpdGlvbjtcbiAgICAgICAgY29uc3QgdG8gPSB7IHgsIHkgfTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gc3RlcHM7IGkrKykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jd2l0aFRyYW5zYWN0aW9uKHVwZGF0ZVN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBmcm9tLnggKyAodG8ueCAtIGZyb20ueCkgKiAoaSAvIHN0ZXBzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGZyb20ueSArICh0by55IC0gZnJvbS55KSAqIChpIC8gc3RlcHMpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYnV0dG9ucywgcG9zaXRpb24gfSA9IHRoaXMuI3N0YXRlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50Jywge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbW91c2VNb3ZlZCcsXG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uOiBnZXRCdXR0b25Gcm9tUHJlc3NlZEJ1dHRvbnMoYnV0dG9ucyksXG4gICAgICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZG93bihvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBidXR0b24gPSBNb3VzZUJ1dHRvbi5MZWZ0LCBjbGlja0NvdW50ID0gMSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZmxhZyA9IGdldEZsYWcoYnV0dG9uKTtcbiAgICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG1vdXNlIGJ1dHRvbjogJHtidXR0b259YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3N0YXRlLmJ1dHRvbnMgJiBmbGFnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2J1dHRvbn0nIGlzIGFscmVhZHkgcHJlc3NlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiN3aXRoVHJhbnNhY3Rpb24odXBkYXRlU3RhdGUgPT4ge1xuICAgICAgICAgICAgdXBkYXRlU3RhdGUoe1xuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IHRoaXMuI3N0YXRlLmJ1dHRvbnMgfCBmbGFnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB7IGJ1dHRvbnMsIHBvc2l0aW9uIH0gPSB0aGlzLiNzdGF0ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50Jywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdtb3VzZVByZXNzZWQnLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgICAgICAgICBjbGlja0NvdW50LFxuICAgICAgICAgICAgICAgIGJ1dHRvbnMsXG4gICAgICAgICAgICAgICAgYnV0dG9uLFxuICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyB1cChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBidXR0b24gPSBNb3VzZUJ1dHRvbi5MZWZ0LCBjbGlja0NvdW50ID0gMSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZmxhZyA9IGdldEZsYWcoYnV0dG9uKTtcbiAgICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG1vdXNlIGJ1dHRvbjogJHtidXR0b259YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEodGhpcy4jc3RhdGUuYnV0dG9ucyAmIGZsYWcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2J1dHRvbn0nIGlzIG5vdCBwcmVzc2VkLmApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI3dpdGhUcmFuc2FjdGlvbih1cGRhdGVTdGF0ZSA9PiB7XG4gICAgICAgICAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgICAgICAgYnV0dG9uczogdGhpcy4jc3RhdGUuYnV0dG9ucyAmIH5mbGFnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB7IGJ1dHRvbnMsIHBvc2l0aW9uIH0gPSB0aGlzLiNzdGF0ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50Jywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdtb3VzZVJlbGVhc2VkJyxcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuI2tleWJvYXJkLl9tb2RpZmllcnMsXG4gICAgICAgICAgICAgICAgY2xpY2tDb3VudCxcbiAgICAgICAgICAgICAgICBidXR0b25zLFxuICAgICAgICAgICAgICAgIGJ1dHRvbixcbiAgICAgICAgICAgICAgICAuLi5wb3NpdGlvbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgY2xpY2soeCwgeSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXksIGNvdW50ID0gMSwgY2xpY2tDb3VudCA9IGNvdW50IH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAoY291bnQgPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NsaWNrIG11c3Qgb2NjdXIgYSBwb3NpdGl2ZSBudW1iZXIgb2YgdGltZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IFt0aGlzLm1vdmUoeCwgeSldO1xuICAgICAgICBpZiAoY2xpY2tDb3VudCA9PT0gY291bnQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY291bnQ7ICsraSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaCh0aGlzLmRvd24oeyAuLi5vcHRpb25zLCBjbGlja0NvdW50OiBpIH0pLCB0aGlzLnVwKHsgLi4ub3B0aW9ucywgY2xpY2tDb3VudDogaSB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWN0aW9ucy5wdXNoKHRoaXMuZG93bih7IC4uLm9wdGlvbnMsIGNsaWNrQ291bnQgfSkpO1xuICAgICAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYWN0aW9ucyk7XG4gICAgICAgICAgICBhY3Rpb25zLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFjdGlvbnMucHVzaCh0aGlzLnVwKHsgLi4ub3B0aW9ucywgY2xpY2tDb3VudCB9KSk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGFjdGlvbnMpO1xuICAgIH1cbiAgICBhc3luYyB3aGVlbChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBkZWx0YVggPSAwLCBkZWx0YVkgPSAwIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCB7IHBvc2l0aW9uLCBidXR0b25zIH0gPSB0aGlzLiNzdGF0ZTtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ0lucHV0LmRpc3BhdGNoTW91c2VFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdtb3VzZVdoZWVsJyxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiAnbW91c2UnLFxuICAgICAgICAgICAgbW9kaWZpZXJzOiB0aGlzLiNrZXlib2FyZC5fbW9kaWZpZXJzLFxuICAgICAgICAgICAgZGVsdGFZLFxuICAgICAgICAgICAgZGVsdGFYLFxuICAgICAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZyhzdGFydCwgdGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5vbmNlKCdJbnB1dC5kcmFnSW50ZXJjZXB0ZWQnLCBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMubW92ZShzdGFydC54LCBzdGFydC55KTtcbiAgICAgICAgYXdhaXQgdGhpcy5kb3duKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubW92ZSh0YXJnZXQueCwgdGFyZ2V0LnkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZ0VudGVyKHRhcmdldCwgZGF0YSkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hEcmFnRXZlbnQnLCB7XG4gICAgICAgICAgICB0eXBlOiAnZHJhZ0VudGVyJyxcbiAgICAgICAgICAgIHg6IHRhcmdldC54LFxuICAgICAgICAgICAgeTogdGFyZ2V0LnksXG4gICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuI2tleWJvYXJkLl9tb2RpZmllcnMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZ092ZXIodGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaERyYWdFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdkcmFnT3ZlcicsXG4gICAgICAgICAgICB4OiB0YXJnZXQueCxcbiAgICAgICAgICAgIHk6IHRhcmdldC55LFxuICAgICAgICAgICAgbW9kaWZpZXJzOiB0aGlzLiNrZXlib2FyZC5fbW9kaWZpZXJzLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGRyb3AodGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaERyYWdFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdkcm9wJyxcbiAgICAgICAgICAgIHg6IHRhcmdldC54LFxuICAgICAgICAgICAgeTogdGFyZ2V0LnksXG4gICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuI2tleWJvYXJkLl9tb2RpZmllcnMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZ0FuZERyb3Aoc3RhcnQsIHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSBudWxsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5kcmFnKHN0YXJ0LCB0YXJnZXQpO1xuICAgICAgICBhd2FpdCB0aGlzLmRyYWdFbnRlcih0YXJnZXQsIGRhdGEpO1xuICAgICAgICBhd2FpdCB0aGlzLmRyYWdPdmVyKHRhcmdldCwgZGF0YSk7XG4gICAgICAgIGlmIChkZWxheSkge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5kcm9wKHRhcmdldCwgZGF0YSk7XG4gICAgICAgIGF3YWl0IHRoaXMudXAoKTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwVG91Y2hzY3JlZW4gZXh0ZW5kcyBUb3VjaHNjcmVlbiB7XG4gICAgI2NsaWVudDtcbiAgICAja2V5Ym9hcmQ7XG4gICAgY29uc3RydWN0b3IoY2xpZW50LCBrZXlib2FyZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI2tleWJvYXJkID0ga2V5Ym9hcmQ7XG4gICAgfVxuICAgIHVwZGF0ZUNsaWVudChjbGllbnQpIHtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICBhc3luYyB0b3VjaFN0YXJ0KHgsIHkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ0lucHV0LmRpc3BhdGNoVG91Y2hFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICd0b3VjaFN0YXJ0JyxcbiAgICAgICAgICAgIHRvdWNoUG9pbnRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB4OiBNYXRoLnJvdW5kKHgpLFxuICAgICAgICAgICAgICAgICAgICB5OiBNYXRoLnJvdW5kKHkpLFxuICAgICAgICAgICAgICAgICAgICByYWRpdXNYOiAwLjUsXG4gICAgICAgICAgICAgICAgICAgIHJhZGl1c1k6IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2U6IDAuNSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHRvdWNoTW92ZSh4LCB5KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaFRvdWNoRXZlbnQnLCB7XG4gICAgICAgICAgICB0eXBlOiAndG91Y2hNb3ZlJyxcbiAgICAgICAgICAgIHRvdWNoUG9pbnRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB4OiBNYXRoLnJvdW5kKHgpLFxuICAgICAgICAgICAgICAgICAgICB5OiBNYXRoLnJvdW5kKHkpLFxuICAgICAgICAgICAgICAgICAgICByYWRpdXNYOiAwLjUsXG4gICAgICAgICAgICAgICAgICAgIHJhZGl1c1k6IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2U6IDAuNSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHRvdWNoRW5kKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50Jywge1xuICAgICAgICAgICAgdHlwZTogJ3RvdWNoRW5kJyxcbiAgICAgICAgICAgIHRvdWNoUG9pbnRzOiBbXSxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBtYXAsIHJhY2VXaXRoIH0gZnJvbSAnLi4vLi4vdGhpcmRfcGFydHkvcnhqcy9yeGpzLmpzJztcbmltcG9ydCB7IFJlYWxtIH0gZnJvbSAnLi4vYXBpL1JlYWxtLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZnJvbUVtaXR0ZXJFdmVudCwgdGltZW91dCwgd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlU3ltYm9sIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IENkcEVsZW1lbnRIYW5kbGUgfSBmcm9tICcuL0VsZW1lbnRIYW5kbGUuanMnO1xuaW1wb3J0IHsgQ2RwSlNIYW5kbGUgfSBmcm9tICcuL0pTSGFuZGxlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBJc29sYXRlZFdvcmxkIGV4dGVuZHMgUmVhbG0ge1xuICAgICNjb250ZXh0O1xuICAgICNlbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICNmcmFtZU9yV29ya2VyO1xuICAgIGNvbnN0cnVjdG9yKGZyYW1lT3JXb3JrZXIsIHRpbWVvdXRTZXR0aW5ncykge1xuICAgICAgICBzdXBlcih0aW1lb3V0U2V0dGluZ3MpO1xuICAgICAgICB0aGlzLiNmcmFtZU9yV29ya2VyID0gZnJhbWVPcldvcmtlcjtcbiAgICB9XG4gICAgZ2V0IGVudmlyb25tZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVPcldvcmtlcjtcbiAgICB9XG4gICAgZ2V0IGNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZyYW1lT3JXb3JrZXIuY2xpZW50O1xuICAgIH1cbiAgICBnZXQgZW1pdHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2VtaXR0ZXI7XG4gICAgfVxuICAgIHNldENvbnRleHQoY29udGV4dCkge1xuICAgICAgICB0aGlzLiNjb250ZXh0Py5bZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgY29udGV4dC5vbmNlKCdkaXNwb3NlZCcsIHRoaXMuI29uQ29udGV4dERpc3Bvc2VkLmJpbmQodGhpcykpO1xuICAgICAgICBjb250ZXh0Lm9uKCdjb25zb2xlYXBpY2FsbGVkJywgdGhpcy4jb25Db250ZXh0Q29uc29sZUFwaUNhbGxlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgY29udGV4dC5vbignYmluZGluZ2NhbGxlZCcsIHRoaXMuI29uQ29udGV4dEJpbmRpbmdDYWxsZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuI2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLiNlbWl0dGVyLmVtaXQoJ2NvbnRleHQnLCBjb250ZXh0KTtcbiAgICAgICAgdm9pZCB0aGlzLnRhc2tNYW5hZ2VyLnJlcnVuQWxsKCk7XG4gICAgfVxuICAgICNvbkNvbnRleHREaXNwb3NlZCgpIHtcbiAgICAgICAgdGhpcy4jY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCdjbGVhckRvY3VtZW50SGFuZGxlJyBpbiB0aGlzLiNmcmFtZU9yV29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU9yV29ya2VyLmNsZWFyRG9jdW1lbnRIYW5kbGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjb25Db250ZXh0Q29uc29sZUFwaUNhbGxlZChldmVudCkge1xuICAgICAgICB0aGlzLiNlbWl0dGVyLmVtaXQoJ2NvbnNvbGVhcGljYWxsZWQnLCBldmVudCk7XG4gICAgfVxuICAgICNvbkNvbnRleHRCaW5kaW5nQ2FsbGVkKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuI2VtaXR0ZXIuZW1pdCgnYmluZGluZ2NhbGxlZCcsIGV2ZW50KTtcbiAgICB9XG4gICAgaGFzQ29udGV4dCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy4jY29udGV4dDtcbiAgICB9XG4gICAgZ2V0IGNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb250ZXh0O1xuICAgIH1cbiAgICAjZXhlY3V0aW9uQ29udGV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhlY3V0aW9uIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBkZXRhY2hlZCBmcmFtZSBvciB3b3JrZXIgXCIke3RoaXMuZW52aXJvbm1lbnQudXJsKCl9XCIgKGFyZSB5b3UgdHJ5aW5nIHRvIGV2YWx1YXRlPylgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jY29udGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgZm9yIHRoZSBuZXh0IGNvbnRleHQgdG8gYmUgc2V0IG9uIHRoZSBpc29sYXRlZCB3b3JsZC5cbiAgICAgKi9cbiAgICBhc3luYyAjd2FpdEZvckV4ZWN1dGlvbkNvbnRleHQoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGZyb21FbWl0dGVyRXZlbnQodGhpcy4jZW1pdHRlciwgJ2NvbnRleHQnKS5waXBlKHJhY2VXaXRoKGZyb21FbWl0dGVyRXZlbnQodGhpcy4jZW1pdHRlciwgJ2Rpc3Bvc2VkJykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIG1lc3NhZ2UgaGFzIHRvIG1hdGNoIHRoZSBDRFAgbWVzc2FnZSBleHBlY3RlZCBieSB0aGUgV2FpdFRhc2sgY2xhc3MuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4ZWN1dGlvbiBjb250ZXh0IHdhcyBkZXN0cm95ZWQnKTtcbiAgICAgICAgfSkpLCB0aW1lb3V0KHRoaXMudGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSkpKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIGV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgLy8gVGhpcyBjb2RlIG5lZWRzIHRvIHNjaGVkdWxlIGV2YWx1YXRlSGFuZGxlIGNhbGwgc3luY2hyb25pb3VzbHkgKGF0XG4gICAgICAgIC8vIGxlYXN0IHdoZW4gdGhlIGNvbnRleHQgaXMgdGhlcmUpIHNvIHdlIGNhbm5vdCB1bmNvbmRpdGlvbmFsbHlcbiAgICAgICAgLy8gYXdhaXQuXG4gICAgICAgIGxldCBjb250ZXh0ID0gdGhpcy4jZXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSBhd2FpdCB0aGlzLiN3YWl0Rm9yRXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgfVxuICAgIGFzeW5jIGV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgLy8gVGhpcyBjb2RlIG5lZWRzIHRvIHNjaGVkdWxlIGV2YWx1YXRlIGNhbGwgc3luY2hyb25pb3VzbHkgKGF0XG4gICAgICAgIC8vIGxlYXN0IHdoZW4gdGhlIGNvbnRleHQgaXMgdGhlcmUpIHNvIHdlIGNhbm5vdCB1bmNvbmRpdGlvbmFsbHlcbiAgICAgICAgLy8gYXdhaXQuXG4gICAgICAgIGxldCBjb250ZXh0ID0gdGhpcy4jZXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSBhd2FpdCB0aGlzLiN3YWl0Rm9yRXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBjb250ZXh0LmV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgfVxuICAgIGFzeW5jIGFkb3B0QmFja2VuZE5vZGUoYmFja2VuZE5vZGVJZCkge1xuICAgICAgICAvLyBUaGlzIGNvZGUgbmVlZHMgdG8gc2NoZWR1bGUgcmVzb2x2ZU5vZGUgY2FsbCBzeW5jaHJvbmlvdXNseSAoYXRcbiAgICAgICAgLy8gbGVhc3Qgd2hlbiB0aGUgY29udGV4dCBpcyB0aGVyZSkgc28gd2UgY2Fubm90IHVuY29uZGl0aW9uYWxseVxuICAgICAgICAvLyBhd2FpdC5cbiAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLiNleGVjdXRpb25Db250ZXh0KCk7XG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgICAgY29udGV4dCA9IGF3YWl0IHRoaXMuI3dhaXRGb3JFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBvYmplY3QgfSA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoJ0RPTS5yZXNvbHZlTm9kZScsIHtcbiAgICAgICAgICAgIGJhY2tlbmROb2RlSWQ6IGJhY2tlbmROb2RlSWQsXG4gICAgICAgICAgICBleGVjdXRpb25Db250ZXh0SWQ6IGNvbnRleHQuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDZHBIYW5kbGUob2JqZWN0KTtcbiAgICB9XG4gICAgYXN5bmMgYWRvcHRIYW5kbGUoaGFuZGxlKSB7XG4gICAgICAgIGlmIChoYW5kbGUucmVhbG0gPT09IHRoaXMpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb250ZXh0IGhhcyBhbHJlYWR5IGFkb3B0ZWQgdGhpcyBoYW5kbGUsIGNsb25lIGl0IHNvIGRvd25zdHJlYW1cbiAgICAgICAgICAgIC8vIGRpc3Bvc2FsIGRvZXNuJ3QgYmVjb21lIGFuIGlzc3VlLlxuICAgICAgICAgICAgcmV0dXJuIChhd2FpdCBoYW5kbGUuZXZhbHVhdGVIYW5kbGUodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub2RlSW5mbyA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoJ0RPTS5kZXNjcmliZU5vZGUnLCB7XG4gICAgICAgICAgICBvYmplY3RJZDogaGFuZGxlLmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmFkb3B0QmFja2VuZE5vZGUobm9kZUluZm8ubm9kZS5iYWNrZW5kTm9kZUlkKSk7XG4gICAgfVxuICAgIGFzeW5jIHRyYW5zZmVySGFuZGxlKGhhbmRsZSkge1xuICAgICAgICBpZiAoaGFuZGxlLnJlYWxtID09PSB0aGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEltcGxpZXMgaXQncyBhIHByaW1pdGl2ZSB2YWx1ZSwgcHJvYmFibHkuXG4gICAgICAgIGlmIChoYW5kbGUucmVtb3RlT2JqZWN0KCkub2JqZWN0SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnRE9NLmRlc2NyaWJlTm9kZScsIHtcbiAgICAgICAgICAgIG9iamVjdElkOiBoYW5kbGUucmVtb3RlT2JqZWN0KCkub2JqZWN0SWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBuZXdIYW5kbGUgPSAoYXdhaXQgdGhpcy5hZG9wdEJhY2tlbmROb2RlKGluZm8ubm9kZS5iYWNrZW5kTm9kZUlkKSk7XG4gICAgICAgIGF3YWl0IGhhbmRsZS5kaXNwb3NlKCk7XG4gICAgICAgIHJldHVybiBuZXdIYW5kbGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNyZWF0ZUNkcEhhbmRsZShyZW1vdGVPYmplY3QpIHtcbiAgICAgICAgaWYgKHJlbW90ZU9iamVjdC5zdWJ0eXBlID09PSAnbm9kZScpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2RwRWxlbWVudEhhbmRsZSh0aGlzLCByZW1vdGVPYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2RwSlNIYW5kbGUodGhpcywgcmVtb3RlT2JqZWN0KTtcbiAgICB9XG4gICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICB0aGlzLiNjb250ZXh0Py5bZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgdGhpcy4jZW1pdHRlci5lbWl0KCdkaXNwb3NlZCcsIHVuZGVmaW5lZCk7XG4gICAgICAgIHN1cGVyW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIHRoaXMuI2VtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SXNvbGF0ZWRXb3JsZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBBIHVuaXF1ZSBrZXkgZm9yIHtAbGluayBJc29sYXRlZFdvcmxkQ2hhcnR9IHRvIGRlbm90ZSB0aGUgZGVmYXVsdCB3b3JsZC5cbiAqIEV4ZWN1dGlvbiBjb250ZXh0cyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGluIHRoZSBkZWZhdWx0IHdvcmxkLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTUFJTl9XT1JMRCA9IFN5bWJvbCgnbWFpbldvcmxkJyk7XG4vKipcbiAqIEEgdW5pcXVlIGtleSBmb3Ige0BsaW5rIElzb2xhdGVkV29ybGRDaGFydH0gdG8gZGVub3RlIHRoZSBwdXBwZXRlZXIgd29ybGQuXG4gKiBUaGlzIHdvcmxkIGNvbnRhaW5zIGFsbCBwdXBwZXRlZXItaW50ZXJuYWwgYmluZGluZ3MvY29kZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFBVUFBFVEVFUl9XT1JMRCA9IFN5bWJvbCgncHVwcGV0ZWVyV29ybGQnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlzb2xhdGVkV29ybGRzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBKU0hhbmRsZSB9IGZyb20gJy4uL2FwaS9KU0hhbmRsZS5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgdmFsdWVGcm9tUmVtb3RlT2JqZWN0IH0gZnJvbSAnLi91dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwSlNIYW5kbGUgZXh0ZW5kcyBKU0hhbmRsZSB7XG4gICAgI2Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgI3JlbW90ZU9iamVjdDtcbiAgICAjd29ybGQ7XG4gICAgY29uc3RydWN0b3Iod29ybGQsIHJlbW90ZU9iamVjdCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiN3b3JsZCA9IHdvcmxkO1xuICAgICAgICB0aGlzLiNyZW1vdGVPYmplY3QgPSByZW1vdGVPYmplY3Q7XG4gICAgfVxuICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VkO1xuICAgIH1cbiAgICBnZXQgcmVhbG0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3b3JsZDtcbiAgICB9XG4gICAgZ2V0IGNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhbG0uZW52aXJvbm1lbnQuY2xpZW50O1xuICAgIH1cbiAgICBhc3luYyBqc29uVmFsdWUoKSB7XG4gICAgICAgIGlmICghdGhpcy4jcmVtb3RlT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVGcm9tUmVtb3RlT2JqZWN0KHRoaXMuI3JlbW90ZU9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKG9iamVjdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHNlcmlhbGl6ZSByZWZlcmVuY2VkIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGBudWxsYCBvciB0aGUgaGFuZGxlIGl0c2VsZiBpZiB0aGUgaGFuZGxlIGlzIGFuXG4gICAgICogaW5zdGFuY2Ugb2Yge0BsaW5rIEVsZW1lbnRIYW5kbGV9LlxuICAgICAqL1xuICAgIGFzRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGFzeW5jIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgcmVsZWFzZU9iamVjdCh0aGlzLmNsaWVudCwgdGhpcy4jcmVtb3RlT2JqZWN0KTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmICghdGhpcy4jcmVtb3RlT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0pTSGFuZGxlOicgKyB2YWx1ZUZyb21SZW1vdGVPYmplY3QodGhpcy4jcmVtb3RlT2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy4jcmVtb3RlT2JqZWN0LnN1YnR5cGUgfHwgdGhpcy4jcmVtb3RlT2JqZWN0LnR5cGU7XG4gICAgICAgIHJldHVybiAnSlNIYW5kbGVAJyArIHR5cGU7XG4gICAgfVxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3JlbW90ZU9iamVjdC5vYmplY3RJZDtcbiAgICB9XG4gICAgcmVtb3RlT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmVtb3RlT2JqZWN0O1xuICAgIH1cbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKCkge1xuICAgICAgICAvLyBXZSB1c2UgUnVudGltZS5nZXRQcm9wZXJ0aWVzIHJhdGhlciB0aGFuIGl0ZXJhdGl2ZSB2ZXJzaW9uIGZvclxuICAgICAgICAvLyBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhcyBpdCBhbGxvd3MgZ2V0dGluZyBldmVyeXRoaW5nIGF0IG9uY2UuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnUnVudGltZS5nZXRQcm9wZXJ0aWVzJywge1xuICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuI3JlbW90ZU9iamVjdC5vYmplY3RJZCxcbiAgICAgICAgICAgIG93blByb3BlcnRpZXM6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcmVzcG9uc2UucmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5LmVudW1lcmFibGUgfHwgIXByb3BlcnR5LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQuc2V0KHByb3BlcnR5Lm5hbWUsIHRoaXMuI3dvcmxkLmNyZWF0ZUNkcEhhbmRsZShwcm9wZXJ0eS52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VPYmplY3QoY2xpZW50LCByZW1vdGVPYmplY3QpIHtcbiAgICBpZiAoIXJlbW90ZU9iamVjdC5vYmplY3RJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGNsaWVudFxuICAgICAgICAuc2VuZCgnUnVudGltZS5yZWxlYXNlT2JqZWN0JywgeyBvYmplY3RJZDogcmVtb3RlT2JqZWN0Lm9iamVjdElkIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIC8vIEV4Y2VwdGlvbnMgbWlnaHQgaGFwcGVuIGluIGNhc2Ugb2YgYSBwYWdlIGJlZW4gbmF2aWdhdGVkIG9yIGNsb3NlZC5cbiAgICAgICAgLy8gU3dhbGxvdyB0aGVzZSBzaW5jZSB0aGV5IGFyZSBoYXJtbGVzcyBhbmQgd2UgZG9uJ3QgbGVhayBhbnl0aGluZyBpbiB0aGlzIGNhc2UuXG4gICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SlNIYW5kbGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IEZyYW1lRXZlbnQgfSBmcm9tICcuLi9hcGkvRnJhbWUuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlckV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL05ldHdvcmtNYW5hZ2VyRXZlbnRzLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi4vdXRpbC9EZWZlcnJlZC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2sgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgRnJhbWVNYW5hZ2VyRXZlbnQgfSBmcm9tICcuL0ZyYW1lTWFuYWdlckV2ZW50cy5qcyc7XG5jb25zdCBwdXBwZXRlZXJUb1Byb3RvY29sTGlmZWN5Y2xlID0gbmV3IE1hcChbXG4gICAgWydsb2FkJywgJ2xvYWQnXSxcbiAgICBbJ2RvbWNvbnRlbnRsb2FkZWQnLCAnRE9NQ29udGVudExvYWRlZCddLFxuICAgIFsnbmV0d29ya2lkbGUwJywgJ25ldHdvcmtJZGxlJ10sXG4gICAgWyduZXR3b3JraWRsZTInLCAnbmV0d29ya0FsbW9zdElkbGUnXSxcbl0pO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIExpZmVjeWNsZVdhdGNoZXIge1xuICAgICNleHBlY3RlZExpZmVjeWNsZTtcbiAgICAjZnJhbWU7XG4gICAgI3RpbWVvdXQ7XG4gICAgI25hdmlnYXRpb25SZXF1ZXN0ID0gbnVsbDtcbiAgICAjc3Vic2NyaXB0aW9ucyA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTtcbiAgICAjaW5pdGlhbExvYWRlcklkO1xuICAgICN0ZXJtaW5hdGlvbkRlZmVycmVkO1xuICAgICNzYW1lRG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAjbGlmZWN5Y2xlRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAjbmV3RG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAjaGFzU2FtZURvY3VtZW50TmF2aWdhdGlvbjtcbiAgICAjc3dhcHBlZDtcbiAgICAjbmF2aWdhdGlvblJlc3BvbnNlUmVjZWl2ZWQ7XG4gICAgY29uc3RydWN0b3IobmV0d29ya01hbmFnZXIsIGZyYW1lLCB3YWl0VW50aWwsIHRpbWVvdXQpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2FpdFVudGlsKSkge1xuICAgICAgICAgICAgd2FpdFVudGlsID0gd2FpdFVudGlsLnNsaWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHdhaXRVbnRpbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHdhaXRVbnRpbCA9IFt3YWl0VW50aWxdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2luaXRpYWxMb2FkZXJJZCA9IGZyYW1lLl9sb2FkZXJJZDtcbiAgICAgICAgdGhpcy4jZXhwZWN0ZWRMaWZlY3ljbGUgPSB3YWl0VW50aWwubWFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3RvY29sRXZlbnQgPSBwdXBwZXRlZXJUb1Byb3RvY29sTGlmZWN5Y2xlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBhc3NlcnQocHJvdG9jb2xFdmVudCwgJ1Vua25vd24gdmFsdWUgZm9yIG9wdGlvbnMud2FpdFVudGlsOiAnICsgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sRXZlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNmcmFtZSA9IGZyYW1lO1xuICAgICAgICB0aGlzLiN0aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgY29uc3QgZnJhbWVNYW5hZ2VyRW1pdHRlciA9IHRoaXMuI3N1YnNjcmlwdGlvbnMudXNlKG5ldyBFdmVudEVtaXR0ZXIoZnJhbWUuX2ZyYW1lTWFuYWdlcikpO1xuICAgICAgICBmcmFtZU1hbmFnZXJFbWl0dGVyLm9uKEZyYW1lTWFuYWdlckV2ZW50LkxpZmVjeWNsZUV2ZW50LCB0aGlzLiNjaGVja0xpZmVjeWNsZUNvbXBsZXRlLmJpbmQodGhpcykpO1xuICAgICAgICBjb25zdCBmcmFtZUVtaXR0ZXIgPSB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRFbWl0dGVyKGZyYW1lKSk7XG4gICAgICAgIGZyYW1lRW1pdHRlci5vbihGcmFtZUV2ZW50LkZyYW1lTmF2aWdhdGVkV2l0aGluRG9jdW1lbnQsIHRoaXMuI25hdmlnYXRlZFdpdGhpbkRvY3VtZW50LmJpbmQodGhpcykpO1xuICAgICAgICBmcmFtZUVtaXR0ZXIub24oRnJhbWVFdmVudC5GcmFtZU5hdmlnYXRlZCwgdGhpcy4jbmF2aWdhdGVkLmJpbmQodGhpcykpO1xuICAgICAgICBmcmFtZUVtaXR0ZXIub24oRnJhbWVFdmVudC5GcmFtZVN3YXBwZWQsIHRoaXMuI2ZyYW1lU3dhcHBlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgZnJhbWVFbWl0dGVyLm9uKEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkQnlBY3RpdmF0aW9uLCB0aGlzLiNmcmFtZVN3YXBwZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIGZyYW1lRW1pdHRlci5vbihGcmFtZUV2ZW50LkZyYW1lRGV0YWNoZWQsIHRoaXMuI29uRnJhbWVEZXRhY2hlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgY29uc3QgbmV0d29ya01hbmFnZXJFbWl0dGVyID0gdGhpcy4jc3Vic2NyaXB0aW9ucy51c2UobmV3IEV2ZW50RW1pdHRlcihuZXR3b3JrTWFuYWdlcikpO1xuICAgICAgICBuZXR3b3JrTWFuYWdlckVtaXR0ZXIub24oTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0LCB0aGlzLiNvblJlcXVlc3QuYmluZCh0aGlzKSk7XG4gICAgICAgIG5ldHdvcmtNYW5hZ2VyRW1pdHRlci5vbihOZXR3b3JrTWFuYWdlckV2ZW50LlJlc3BvbnNlLCB0aGlzLiNvblJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgICAgICBuZXR3b3JrTWFuYWdlckVtaXR0ZXIub24oTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmFpbGVkLCB0aGlzLiNvblJlcXVlc3RGYWlsZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuI3Rlcm1pbmF0aW9uRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoe1xuICAgICAgICAgICAgdGltZW91dDogdGhpcy4jdGltZW91dCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBOYXZpZ2F0aW9uIHRpbWVvdXQgb2YgJHt0aGlzLiN0aW1lb3V0fSBtcyBleGNlZWRlZGAsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNjaGVja0xpZmVjeWNsZUNvbXBsZXRlKCk7XG4gICAgfVxuICAgICNvblJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5mcmFtZSgpICE9PSB0aGlzLiNmcmFtZSB8fCAhcmVxdWVzdC5pc05hdmlnYXRpb25SZXF1ZXN0KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNuYXZpZ2F0aW9uUmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICAgIC8vIFJlc29sdmUgcHJldmlvdXMgbmF2aWdhdGlvbiByZXNwb25zZSBpbiBjYXNlIHRoZXJlIGFyZSBtdWx0aXBsZVxuICAgICAgICAvLyBuYXZpZ2F0aW9uIHJlcXVlc3RzIHJlcG9ydGVkIGJ5IHRoZSBiYWNrZW5kLiBUaGlzIGdlbmVyYWxseSBzaG91bGQgbm90XG4gICAgICAgIC8vIGhhcHBlbiBieSBpdCBsb29rcyBsaWtlIGl0J3MgcG9zc2libGUuXG4gICAgICAgIHRoaXMuI25hdmlnYXRpb25SZXNwb25zZVJlY2VpdmVkPy5yZXNvbHZlKCk7XG4gICAgICAgIHRoaXMuI25hdmlnYXRpb25SZXNwb25zZVJlY2VpdmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgICAgIGlmIChyZXF1ZXN0LnJlc3BvbnNlKCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuI25hdmlnYXRpb25SZXNwb25zZVJlY2VpdmVkPy5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uUmVxdWVzdEZhaWxlZChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICh0aGlzLiNuYXZpZ2F0aW9uUmVxdWVzdD8uaWQgIT09IHJlcXVlc3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNuYXZpZ2F0aW9uUmVzcG9uc2VSZWNlaXZlZD8ucmVzb2x2ZSgpO1xuICAgIH1cbiAgICAjb25SZXNwb25zZShyZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy4jbmF2aWdhdGlvblJlcXVlc3Q/LmlkICE9PSByZXNwb25zZS5yZXF1ZXN0KCkuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNuYXZpZ2F0aW9uUmVzcG9uc2VSZWNlaXZlZD8ucmVzb2x2ZSgpO1xuICAgIH1cbiAgICAjb25GcmFtZURldGFjaGVkKGZyYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLiNmcmFtZSA9PT0gZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuI3Rlcm1pbmF0aW9uRGVmZXJyZWQucmVzb2x2ZShuZXcgRXJyb3IoJ05hdmlnYXRpbmcgZnJhbWUgd2FzIGRldGFjaGVkJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2NoZWNrTGlmZWN5Y2xlQ29tcGxldGUoKTtcbiAgICB9XG4gICAgYXN5bmMgbmF2aWdhdGlvblJlc3BvbnNlKCkge1xuICAgICAgICAvLyBDb250aW51ZSB3aXRoIGEgcG9zc2libHkgbnVsbCByZXNwb25zZS5cbiAgICAgICAgYXdhaXQgdGhpcy4jbmF2aWdhdGlvblJlc3BvbnNlUmVjZWl2ZWQ/LnZhbHVlT3JUaHJvdygpO1xuICAgICAgICByZXR1cm4gdGhpcy4jbmF2aWdhdGlvblJlcXVlc3QgPyB0aGlzLiNuYXZpZ2F0aW9uUmVxdWVzdC5yZXNwb25zZSgpIDogbnVsbDtcbiAgICB9XG4gICAgc2FtZURvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzYW1lRG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQudmFsdWVPclRocm93KCk7XG4gICAgfVxuICAgIG5ld0RvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNuZXdEb2N1bWVudE5hdmlnYXRpb25EZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgbGlmZWN5Y2xlUHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xpZmVjeWNsZURlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgIH1cbiAgICB0ZXJtaW5hdGlvblByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0ZXJtaW5hdGlvbkRlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgIH1cbiAgICAjbmF2aWdhdGVkV2l0aGluRG9jdW1lbnQoKSB7XG4gICAgICAgIHRoaXMuI2hhc1NhbWVEb2N1bWVudE5hdmlnYXRpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLiNjaGVja0xpZmVjeWNsZUNvbXBsZXRlKCk7XG4gICAgfVxuICAgICNuYXZpZ2F0ZWQobmF2aWdhdGlvblR5cGUpIHtcbiAgICAgICAgaWYgKG5hdmlnYXRpb25UeXBlID09PSAnQmFja0ZvcndhcmRDYWNoZVJlc3RvcmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVTd2FwcGVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2hlY2tMaWZlY3ljbGVDb21wbGV0ZSgpO1xuICAgIH1cbiAgICAjZnJhbWVTd2FwcGVkKCkge1xuICAgICAgICB0aGlzLiNzd2FwcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jY2hlY2tMaWZlY3ljbGVDb21wbGV0ZSgpO1xuICAgIH1cbiAgICAjY2hlY2tMaWZlY3ljbGVDb21wbGV0ZSgpIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IG5hdmlnYXRpb24gdG8gY29tbWl0LlxuICAgICAgICBpZiAoIWNoZWNrTGlmZWN5Y2xlKHRoaXMuI2ZyYW1lLCB0aGlzLiNleHBlY3RlZExpZmVjeWNsZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNsaWZlY3ljbGVEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgIGlmICh0aGlzLiNoYXNTYW1lRG9jdW1lbnROYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLiNzYW1lRG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzd2FwcGVkIHx8IHRoaXMuI2ZyYW1lLl9sb2FkZXJJZCAhPT0gdGhpcy4jaW5pdGlhbExvYWRlcklkKSB7XG4gICAgICAgICAgICB0aGlzLiNuZXdEb2N1bWVudE5hdmlnYXRpb25EZWZlcnJlZC5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tMaWZlY3ljbGUoZnJhbWUsIGV4cGVjdGVkTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV4cGVjdGVkTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmcmFtZS5fbGlmZWN5Y2xlRXZlbnRzLmhhcyhldmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE8oIzEpOiBJdHMgcG9zc2libGUgd2UgZG9uJ3QgbmVlZCB0aGlzIGNoZWNrXG4gICAgICAgICAgICAvLyBDRFAgcHJvdmlkZWQgdGhlIGNvcnJlY3Qgb3JkZXIgZm9yIExvYWRpbmcgRXZlbnRzXG4gICAgICAgICAgICAvLyBBbmQgTmV0d29ya0lkbGUgaXMgYSBnbG9iYWwgc3RhdGVcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIHJlbW92aW5nXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZyYW1lLmNoaWxkRnJhbWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuX2hhc1N0YXJ0ZWRMb2FkaW5nICYmXG4gICAgICAgICAgICAgICAgICAgICFjaGVja0xpZmVjeWNsZShjaGlsZCwgZXhwZWN0ZWRMaWZlY3ljbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy4jdGVybWluYXRpb25EZWZlcnJlZC5yZXNvbHZlKG5ldyBFcnJvcignTGlmZWN5Y2xlV2F0Y2hlciBkaXNwb3NlZCcpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaWZlY3ljbGVXYXRjaGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEhlbHBlciBjbGFzcyB0byB0cmFjayBuZXR3b3JrIGV2ZW50cyBieSByZXF1ZXN0IElEXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXR3b3JrRXZlbnRNYW5hZ2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBvcmRlcnMgb2YgZXZlbnRzOlxuICAgICAqIEEuIGBfb25SZXF1ZXN0V2lsbEJlU2VudGBcbiAgICAgKiBCLiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGBcbiAgICAgKiBDLiBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0V2lsbEJlU2VudGBcbiAgICAgKiBELiBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0V2lsbEJlU2VudGAsIGBfb25SZXF1ZXN0UGF1c2VkYCxcbiAgICAgKiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0UGF1c2VkYFxuICAgICAqIChzZWUgY3JidWcuY29tLzExOTYwMDQpXG4gICAgICpcbiAgICAgKiBGb3IgYF9vblJlcXVlc3RgIHdlIG5lZWQgdGhlIGV2ZW50IGZyb20gYF9vblJlcXVlc3RXaWxsQmVTZW50YCBhbmRcbiAgICAgKiBvcHRpb25hbGx5IHRoZSBgaW50ZXJjZXB0aW9uSWRgIGZyb20gYF9vblJlcXVlc3RQYXVzZWRgLlxuICAgICAqXG4gICAgICogSWYgcmVxdWVzdCBpbnRlcmNlcHRpb24gaXMgZGlzYWJsZWQsIGNhbGwgYF9vblJlcXVlc3RgIG9uY2UgcGVyIGNhbGwgdG9cbiAgICAgKiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLlxuICAgICAqIElmIHJlcXVlc3QgaW50ZXJjZXB0aW9uIGlzIGVuYWJsZWQsIGNhbGwgYF9vblJlcXVlc3RgIG9uY2UgcGVyIGNhbGwgdG9cbiAgICAgKiBgX29uUmVxdWVzdFBhdXNlZGAgKG9uY2UgcGVyIGBpbnRlcmNlcHRpb25JZGApLlxuICAgICAqXG4gICAgICogRXZlbnRzIGFyZSBzdG9yZWQgdG8gYWxsb3cgZm9yIHN1YnNlcXVlbnQgZXZlbnRzIHRvIGNhbGwgYF9vblJlcXVlc3RgLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IChjaGFpbnMgb2YpIHJlZGlyZWN0IHJlcXVlc3RzIGhhdmUgdGhlIHNhbWUgYHJlcXVlc3RJZGAgKCEpIGFzXG4gICAgICogdGhlIG9yaWdpbmFsIHJlcXVlc3QuIFdlIGhhdmUgdG8gYW50aWNpcGF0ZSBzZXJpZXMgb2YgZXZlbnRzIGxpa2UgdGhlc2U6XG4gICAgICogQS4gYF9vblJlcXVlc3RXaWxsQmVTZW50YCxcbiAgICAgKiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCAuLi5cbiAgICAgKiBCLiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsXG4gICAgICogYF9vblJlcXVlc3RXaWxsQmVTZW50YCwgYF9vblJlcXVlc3RQYXVzZWRgLCAuLi5cbiAgICAgKiBDLiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsXG4gICAgICogYF9vblJlcXVlc3RQYXVzZWRgLCBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCAuLi5cbiAgICAgKiBELiBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0V2lsbEJlU2VudGAsXG4gICAgICogYF9vblJlcXVlc3RQYXVzZWRgLCBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsXG4gICAgICogYF9vblJlcXVlc3RXaWxsQmVTZW50YCwgYF9vblJlcXVlc3RQYXVzZWRgLCBgX29uUmVxdWVzdFBhdXNlZGAsIC4uLlxuICAgICAqIChzZWUgY3JidWcuY29tLzExOTYwMDQpXG4gICAgICovXG4gICAgI3JlcXVlc3RXaWxsQmVTZW50TWFwID0gbmV3IE1hcCgpO1xuICAgICNyZXF1ZXN0UGF1c2VkTWFwID0gbmV3IE1hcCgpO1xuICAgICNodHRwUmVxdWVzdHNNYXAgPSBuZXcgTWFwKCk7XG4gICAgLypcbiAgICAgKiBUaGUgYmVsb3cgbWFwcyBhcmUgdXNlZCB0byByZWNvbmNpbGUgTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvXG4gICAgICogZXZlbnRzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyByZXF1ZXN0LiBFYWNoIHJlc3BvbnNlIGFuZCByZWRpcmVjdFxuICAgICAqIHJlc3BvbnNlIGdldHMgYW4gRXh0cmFJbmZvIGV2ZW50LCBhbmQgd2UgZG9uJ3Qga25vdyB3aGljaCB3aWxsIGNvbWUgZmlyc3QuXG4gICAgICogVGhpcyBtZWFucyB0aGF0IHdlIGhhdmUgdG8gc3RvcmUgYSBSZXNwb25zZSBvciBhbiBFeHRyYUluZm8gZm9yIGVhY2hcbiAgICAgKiByZXNwb25zZSwgYW5kIGVtaXQgdGhlIGV2ZW50IHdoZW4gd2UgZ2V0IGJvdGggb2YgdGhlbS4gSW4gYWRkaXRpb24sIHRvXG4gICAgICogaGFuZGxlIHJlZGlyZWN0cywgd2UgaGF2ZSB0byBtYWtlIHRoZW0gQXJyYXlzIHRvIHJlcHJlc2VudCB0aGUgY2hhaW4gb2ZcbiAgICAgKiBldmVudHMuXG4gICAgICovXG4gICAgI3Jlc3BvbnNlUmVjZWl2ZWRFeHRyYUluZm9NYXAgPSBuZXcgTWFwKCk7XG4gICAgI3F1ZXVlZFJlZGlyZWN0SW5mb01hcCA9IG5ldyBNYXAoKTtcbiAgICAjcXVldWVkRXZlbnRHcm91cE1hcCA9IG5ldyBNYXAoKTtcbiAgICBmb3JnZXQobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0V2lsbEJlU2VudE1hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgICAgIHRoaXMuI3JlcXVlc3RQYXVzZWRNYXAuZGVsZXRlKG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgICAgICB0aGlzLiNxdWV1ZWRFdmVudEdyb3VwTWFwLmRlbGV0ZShuZXR3b3JrUmVxdWVzdElkKTtcbiAgICAgICAgdGhpcy4jcXVldWVkUmVkaXJlY3RJbmZvTWFwLmRlbGV0ZShuZXR3b3JrUmVxdWVzdElkKTtcbiAgICAgICAgdGhpcy4jcmVzcG9uc2VSZWNlaXZlZEV4dHJhSW5mb01hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHJlc3BvbnNlRXh0cmFJbmZvKG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNyZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvTWFwLmhhcyhuZXR3b3JrUmVxdWVzdElkKSkge1xuICAgICAgICAgICAgdGhpcy4jcmVzcG9uc2VSZWNlaXZlZEV4dHJhSW5mb01hcC5zZXQobmV0d29ya1JlcXVlc3RJZCwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvTWFwLmdldChuZXR3b3JrUmVxdWVzdElkKTtcbiAgICB9XG4gICAgcXVldWVkUmVkaXJlY3RJbmZvKGZldGNoUmVxdWVzdElkKSB7XG4gICAgICAgIGlmICghdGhpcy4jcXVldWVkUmVkaXJlY3RJbmZvTWFwLmhhcyhmZXRjaFJlcXVlc3RJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuI3F1ZXVlZFJlZGlyZWN0SW5mb01hcC5zZXQoZmV0Y2hSZXF1ZXN0SWQsIFtdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jcXVldWVkUmVkaXJlY3RJbmZvTWFwLmdldChmZXRjaFJlcXVlc3RJZCk7XG4gICAgfVxuICAgIHF1ZXVlUmVkaXJlY3RJbmZvKGZldGNoUmVxdWVzdElkLCByZWRpcmVjdEluZm8pIHtcbiAgICAgICAgdGhpcy5xdWV1ZWRSZWRpcmVjdEluZm8oZmV0Y2hSZXF1ZXN0SWQpLnB1c2gocmVkaXJlY3RJbmZvKTtcbiAgICB9XG4gICAgdGFrZVF1ZXVlZFJlZGlyZWN0SW5mbyhmZXRjaFJlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZWRSZWRpcmVjdEluZm8oZmV0Y2hSZXF1ZXN0SWQpLnNoaWZ0KCk7XG4gICAgfVxuICAgIGluRmxpZ2h0UmVxdWVzdHNDb3VudCgpIHtcbiAgICAgICAgbGV0IGluRmxpZ2h0UmVxdWVzdENvdW50ZXIgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgdGhpcy4jaHR0cFJlcXVlc3RzTWFwLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoIXJlcXVlc3QucmVzcG9uc2UoKSkge1xuICAgICAgICAgICAgICAgIGluRmxpZ2h0UmVxdWVzdENvdW50ZXIrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5GbGlnaHRSZXF1ZXN0Q291bnRlcjtcbiAgICB9XG4gICAgc3RvcmVSZXF1ZXN0V2lsbEJlU2VudChuZXR3b3JrUmVxdWVzdElkLCBldmVudCkge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0V2lsbEJlU2VudE1hcC5zZXQobmV0d29ya1JlcXVlc3RJZCwgZXZlbnQpO1xuICAgIH1cbiAgICBnZXRSZXF1ZXN0V2lsbEJlU2VudChuZXR3b3JrUmVxdWVzdElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0V2lsbEJlU2VudE1hcC5nZXQobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIGZvcmdldFJlcXVlc3RXaWxsQmVTZW50KG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhpcy4jcmVxdWVzdFdpbGxCZVNlbnRNYXAuZGVsZXRlKG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgIH1cbiAgICBnZXRSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3JlcXVlc3RQYXVzZWRNYXAuZ2V0KG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgIH1cbiAgICBmb3JnZXRSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhpcy4jcmVxdWVzdFBhdXNlZE1hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHN0b3JlUmVxdWVzdFBhdXNlZChuZXR3b3JrUmVxdWVzdElkLCBldmVudCkge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0UGF1c2VkTWFwLnNldChuZXR3b3JrUmVxdWVzdElkLCBldmVudCk7XG4gICAgfVxuICAgIGdldFJlcXVlc3QobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaHR0cFJlcXVlc3RzTWFwLmdldChuZXR3b3JrUmVxdWVzdElkKTtcbiAgICB9XG4gICAgc3RvcmVSZXF1ZXN0KG5ldHdvcmtSZXF1ZXN0SWQsIHJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy4jaHR0cFJlcXVlc3RzTWFwLnNldChuZXR3b3JrUmVxdWVzdElkLCByZXF1ZXN0KTtcbiAgICB9XG4gICAgZm9yZ2V0UmVxdWVzdChuZXR3b3JrUmVxdWVzdElkKSB7XG4gICAgICAgIHRoaXMuI2h0dHBSZXF1ZXN0c01hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIGdldFF1ZXVlZEV2ZW50R3JvdXAobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcXVldWVkRXZlbnRHcm91cE1hcC5nZXQobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHF1ZXVlRXZlbnRHcm91cChuZXR3b3JrUmVxdWVzdElkLCBldmVudCkge1xuICAgICAgICB0aGlzLiNxdWV1ZWRFdmVudEdyb3VwTWFwLnNldChuZXR3b3JrUmVxdWVzdElkLCBldmVudCk7XG4gICAgfVxuICAgIGZvcmdldFF1ZXVlZEV2ZW50R3JvdXAobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICB0aGlzLiNxdWV1ZWRFdmVudEdyb3VwTWFwLmRlbGV0ZShuZXR3b3JrUmVxdWVzdElkKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OZXR3b3JrRXZlbnRNYW5hZ2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyRXZlbnQsIH0gZnJvbSAnLi4vY29tbW9uL05ldHdvcmtNYW5hZ2VyRXZlbnRzLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIGlzU3RyaW5nIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IENkcEhUVFBSZXF1ZXN0IH0gZnJvbSAnLi9IVFRQUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBDZHBIVFRQUmVzcG9uc2UgfSBmcm9tICcuL0hUVFBSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBOZXR3b3JrRXZlbnRNYW5hZ2VyLCB9IGZyb20gJy4vTmV0d29ya0V2ZW50TWFuYWdlci5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTmV0d29ya01hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNmcmFtZU1hbmFnZXI7XG4gICAgI25ldHdvcmtFdmVudE1hbmFnZXIgPSBuZXcgTmV0d29ya0V2ZW50TWFuYWdlcigpO1xuICAgICNleHRyYUhUVFBIZWFkZXJzO1xuICAgICNjcmVkZW50aWFscyA9IG51bGw7XG4gICAgI2F0dGVtcHRlZEF1dGhlbnRpY2F0aW9ucyA9IG5ldyBTZXQoKTtcbiAgICAjdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICAjdXNlckNhY2hlRGlzYWJsZWQ7XG4gICAgI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnM7XG4gICAgI3VzZXJBZ2VudDtcbiAgICAjdXNlckFnZW50TWV0YWRhdGE7XG4gICAgI2hhbmRsZXJzID0gW1xuICAgICAgICBbJ0ZldGNoLnJlcXVlc3RQYXVzZWQnLCB0aGlzLiNvblJlcXVlc3RQYXVzZWRdLFxuICAgICAgICBbJ0ZldGNoLmF1dGhSZXF1aXJlZCcsIHRoaXMuI29uQXV0aFJlcXVpcmVkXSxcbiAgICAgICAgWydOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50JywgdGhpcy4jb25SZXF1ZXN0V2lsbEJlU2VudF0sXG4gICAgICAgIFsnTmV0d29yay5yZXF1ZXN0U2VydmVkRnJvbUNhY2hlJywgdGhpcy4jb25SZXF1ZXN0U2VydmVkRnJvbUNhY2hlXSxcbiAgICAgICAgWydOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQnLCB0aGlzLiNvblJlc3BvbnNlUmVjZWl2ZWRdLFxuICAgICAgICBbJ05ldHdvcmsubG9hZGluZ0ZpbmlzaGVkJywgdGhpcy4jb25Mb2FkaW5nRmluaXNoZWRdLFxuICAgICAgICBbJ05ldHdvcmsubG9hZGluZ0ZhaWxlZCcsIHRoaXMuI29uTG9hZGluZ0ZhaWxlZF0sXG4gICAgICAgIFsnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvJywgdGhpcy4jb25SZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvXSxcbiAgICAgICAgW0NEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsIHRoaXMuI3JlbW92ZUNsaWVudF0sXG4gICAgXTtcbiAgICAjY2xpZW50cyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihmcmFtZU1hbmFnZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jZnJhbWVNYW5hZ2VyID0gZnJhbWVNYW5hZ2VyO1xuICAgIH1cbiAgICBhc3luYyBhZGRDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIGlmICh0aGlzLiNjbGllbnRzLmhhcyhjbGllbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTtcbiAgICAgICAgdGhpcy4jY2xpZW50cy5zZXQoY2xpZW50LCBzdWJzY3JpcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2xpZW50RW1pdHRlciA9IHN1YnNjcmlwdGlvbnMudXNlKG5ldyBFdmVudEVtaXR0ZXIoY2xpZW50KSk7XG4gICAgICAgIGZvciAoY29uc3QgW2V2ZW50LCBoYW5kbGVyXSBvZiB0aGlzLiNoYW5kbGVycykge1xuICAgICAgICAgICAgY2xpZW50RW1pdHRlci5vbihldmVudCwgKGFyZykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLmJpbmQodGhpcykoY2xpZW50LCBhcmcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgY2xpZW50LnNlbmQoJ05ldHdvcmsuZW5hYmxlJyksXG4gICAgICAgICAgICB0aGlzLiNhcHBseUV4dHJhSFRUUEhlYWRlcnMoY2xpZW50KSxcbiAgICAgICAgICAgIHRoaXMuI2FwcGx5TmV0d29ya0NvbmRpdGlvbnMoY2xpZW50KSxcbiAgICAgICAgICAgIHRoaXMuI2FwcGx5UHJvdG9jb2xDYWNoZURpc2FibGVkKGNsaWVudCksXG4gICAgICAgICAgICB0aGlzLiNhcHBseVByb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbihjbGllbnQpLFxuICAgICAgICAgICAgdGhpcy4jYXBwbHlVc2VyQWdlbnQoY2xpZW50KSxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGFzeW5jICNyZW1vdmVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudHMuZ2V0KGNsaWVudCk/LmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy4jY2xpZW50cy5kZWxldGUoY2xpZW50KTtcbiAgICB9XG4gICAgYXN5bmMgYXV0aGVudGljYXRlKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHRoaXMuI2NyZWRlbnRpYWxzID0gY3JlZGVudGlhbHM7XG4gICAgICAgIGNvbnN0IGVuYWJsZWQgPSB0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgfHwgISF0aGlzLiNjcmVkZW50aWFscztcbiAgICAgICAgaWYgKGVuYWJsZWQgPT09IHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNwcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXBwbHlUb0FsbENsaWVudHModGhpcy4jYXBwbHlQcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb24uYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jIHNldEV4dHJhSFRUUEhlYWRlcnMoaGVhZGVycykge1xuICAgICAgICBjb25zdCBleHRyYUhUVFBIZWFkZXJzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgICBhc3NlcnQoaXNTdHJpbmcodmFsdWUpLCBgRXhwZWN0ZWQgdmFsdWUgb2YgaGVhZGVyIFwiJHtrZXl9XCIgdG8gYmUgU3RyaW5nLCBidXQgXCIke3R5cGVvZiB2YWx1ZX1cIiBpcyBmb3VuZC5gKTtcbiAgICAgICAgICAgIGV4dHJhSFRUUEhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZXh0cmFIVFRQSGVhZGVycyA9IGV4dHJhSFRUUEhlYWRlcnM7XG4gICAgICAgIGF3YWl0IHRoaXMuI2FwcGx5VG9BbGxDbGllbnRzKHRoaXMuI2FwcGx5RXh0cmFIVFRQSGVhZGVycy5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgYXN5bmMgI2FwcGx5RXh0cmFIVFRQSGVhZGVycyhjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2V4dHJhSFRUUEhlYWRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdOZXR3b3JrLnNldEV4dHJhSFRUUEhlYWRlcnMnLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLiNleHRyYUhUVFBIZWFkZXJzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZXh0cmFIVFRQSGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuI2V4dHJhSFRUUEhlYWRlcnMpO1xuICAgIH1cbiAgICBpbkZsaWdodFJlcXVlc3RzQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmluRmxpZ2h0UmVxdWVzdHNDb3VudCgpO1xuICAgIH1cbiAgICBhc3luYyBzZXRPZmZsaW5lTW9kZSh2YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgb2ZmbGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdXBsb2FkOiAtMSxcbiAgICAgICAgICAgICAgICBkb3dubG9hZDogLTEsXG4gICAgICAgICAgICAgICAgbGF0ZW5jeTogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZW11bGF0ZWROZXR3b3JrQ29uZGl0aW9ucy5vZmZsaW5lID0gdmFsdWU7XG4gICAgICAgIGF3YWl0IHRoaXMuI2FwcGx5VG9BbGxDbGllbnRzKHRoaXMuI2FwcGx5TmV0d29ya0NvbmRpdGlvbnMuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jIGVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyhuZXR3b3JrQ29uZGl0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgb2ZmbGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdXBsb2FkOiAtMSxcbiAgICAgICAgICAgICAgICBkb3dubG9hZDogLTEsXG4gICAgICAgICAgICAgICAgbGF0ZW5jeTogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZW11bGF0ZWROZXR3b3JrQ29uZGl0aW9ucy51cGxvYWQgPSBuZXR3b3JrQ29uZGl0aW9uc1xuICAgICAgICAgICAgPyBuZXR3b3JrQ29uZGl0aW9ucy51cGxvYWRcbiAgICAgICAgICAgIDogLTE7XG4gICAgICAgIHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMuZG93bmxvYWQgPSBuZXR3b3JrQ29uZGl0aW9uc1xuICAgICAgICAgICAgPyBuZXR3b3JrQ29uZGl0aW9ucy5kb3dubG9hZFxuICAgICAgICAgICAgOiAtMTtcbiAgICAgICAgdGhpcy4jZW11bGF0ZWROZXR3b3JrQ29uZGl0aW9ucy5sYXRlbmN5ID0gbmV0d29ya0NvbmRpdGlvbnNcbiAgICAgICAgICAgID8gbmV0d29ya0NvbmRpdGlvbnMubGF0ZW5jeVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBhd2FpdCB0aGlzLiNhcHBseVRvQWxsQ2xpZW50cyh0aGlzLiNhcHBseU5ldHdvcmtDb25kaXRpb25zLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBhc3luYyAjYXBwbHlUb0FsbENsaWVudHMoZm4pIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh0aGlzLiNjbGllbnRzLmtleXMoKSkubWFwKGNsaWVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZm4oY2xpZW50KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBhc3luYyAjYXBwbHlOZXR3b3JrQ29uZGl0aW9ucyhjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdOZXR3b3JrLmVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucycsIHtcbiAgICAgICAgICAgIG9mZmxpbmU6IHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMub2ZmbGluZSxcbiAgICAgICAgICAgIGxhdGVuY3k6IHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMubGF0ZW5jeSxcbiAgICAgICAgICAgIHVwbG9hZFRocm91Z2hwdXQ6IHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMudXBsb2FkLFxuICAgICAgICAgICAgZG93bmxvYWRUaHJvdWdocHV0OiB0aGlzLiNlbXVsYXRlZE5ldHdvcmtDb25kaXRpb25zLmRvd25sb2FkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2V0VXNlckFnZW50KHVzZXJBZ2VudCwgdXNlckFnZW50TWV0YWRhdGEpIHtcbiAgICAgICAgdGhpcy4jdXNlckFnZW50ID0gdXNlckFnZW50O1xuICAgICAgICB0aGlzLiN1c2VyQWdlbnRNZXRhZGF0YSA9IHVzZXJBZ2VudE1ldGFkYXRhO1xuICAgICAgICBhd2FpdCB0aGlzLiNhcHBseVRvQWxsQ2xpZW50cyh0aGlzLiNhcHBseVVzZXJBZ2VudC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgYXN5bmMgI2FwcGx5VXNlckFnZW50KGNsaWVudCkge1xuICAgICAgICBpZiAodGhpcy4jdXNlckFnZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnTmV0d29yay5zZXRVc2VyQWdlbnRPdmVycmlkZScsIHtcbiAgICAgICAgICAgIHVzZXJBZ2VudDogdGhpcy4jdXNlckFnZW50LFxuICAgICAgICAgICAgdXNlckFnZW50TWV0YWRhdGE6IHRoaXMuI3VzZXJBZ2VudE1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2V0Q2FjaGVFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy4jdXNlckNhY2hlRGlzYWJsZWQgPSAhZW5hYmxlZDtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXBwbHlUb0FsbENsaWVudHModGhpcy4jYXBwbHlQcm90b2NvbENhY2hlRGlzYWJsZWQuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jIHNldFJlcXVlc3RJbnRlcmNlcHRpb24odmFsdWUpIHtcbiAgICAgICAgdGhpcy4jdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IGVuYWJsZWQgPSB0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgfHwgISF0aGlzLiNjcmVkZW50aWFscztcbiAgICAgICAgaWYgKGVuYWJsZWQgPT09IHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNwcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXBwbHlUb0FsbENsaWVudHModGhpcy4jYXBwbHlQcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb24uYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jICNhcHBseVByb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbihjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI3VzZXJDYWNoZURpc2FibGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuI3VzZXJDYWNoZURpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLiNhcHBseVByb3RvY29sQ2FjaGVEaXNhYmxlZChjbGllbnQpLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdGZXRjaC5lbmFibGUnLCB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZUF1dGhSZXF1ZXN0czogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybnM6IFt7IHVybFBhdHRlcm46ICcqJyB9XSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2FwcGx5UHJvdG9jb2xDYWNoZURpc2FibGVkKGNsaWVudCksXG4gICAgICAgICAgICAgICAgY2xpZW50LnNlbmQoJ0ZldGNoLmRpc2FibGUnKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jICNhcHBseVByb3RvY29sQ2FjaGVEaXNhYmxlZChjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI3VzZXJDYWNoZURpc2FibGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnTmV0d29yay5zZXRDYWNoZURpc2FibGVkJywge1xuICAgICAgICAgICAgY2FjaGVEaXNhYmxlZDogdGhpcy4jdXNlckNhY2hlRGlzYWJsZWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAjb25SZXF1ZXN0V2lsbEJlU2VudChjbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIFJlcXVlc3QgaW50ZXJjZXB0aW9uIGRvZXNuJ3QgaGFwcGVuIGZvciBkYXRhIFVSTHMgd2l0aCBOZXR3b3JrIFNlcnZpY2UuXG4gICAgICAgIGlmICh0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgJiZcbiAgICAgICAgICAgICFldmVudC5yZXF1ZXN0LnVybC5zdGFydHNXaXRoKCdkYXRhOicpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHJlcXVlc3RJZDogbmV0d29ya1JlcXVlc3RJZCB9ID0gZXZlbnQ7XG4gICAgICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLnN0b3JlUmVxdWVzdFdpbGxCZVNlbnQobmV0d29ya1JlcXVlc3RJZCwgZXZlbnQpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDRFAgbWF5IGhhdmUgc2VudCBhIEZldGNoLnJlcXVlc3RQYXVzZWQgZXZlbnQgYWxyZWFkeS4gQ2hlY2sgZm9yIGl0LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0UGF1c2VkRXZlbnQgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFJlcXVlc3RQYXVzZWQobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdFBhdXNlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyByZXF1ZXN0SWQ6IGZldGNoUmVxdWVzdElkIH0gPSByZXF1ZXN0UGF1c2VkRXZlbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy4jcGF0Y2hSZXF1ZXN0RXZlbnRIZWFkZXJzKGV2ZW50LCByZXF1ZXN0UGF1c2VkRXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuI29uUmVxdWVzdChjbGllbnQsIGV2ZW50LCBmZXRjaFJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5mb3JnZXRSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI29uUmVxdWVzdChjbGllbnQsIGV2ZW50LCB1bmRlZmluZWQpO1xuICAgIH1cbiAgICAjb25BdXRoUmVxdWlyZWQoY2xpZW50LCBldmVudCkge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSAnRGVmYXVsdCc7XG4gICAgICAgIGlmICh0aGlzLiNhdHRlbXB0ZWRBdXRoZW50aWNhdGlvbnMuaGFzKGV2ZW50LnJlcXVlc3RJZCkpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gJ0NhbmNlbEF1dGgnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI2NyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICByZXNwb25zZSA9ICdQcm92aWRlQ3JlZGVudGlhbHMnO1xuICAgICAgICAgICAgdGhpcy4jYXR0ZW1wdGVkQXV0aGVudGljYXRpb25zLmFkZChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0gPSB0aGlzLiNjcmVkZW50aWFscyB8fCB7XG4gICAgICAgICAgICB1c2VybmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgY2xpZW50XG4gICAgICAgICAgICAuc2VuZCgnRmV0Y2guY29udGludWVXaXRoQXV0aCcsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZDogZXZlbnQucmVxdWVzdElkLFxuICAgICAgICAgICAgYXV0aENoYWxsZW5nZVJlc3BvbnNlOiB7IHJlc3BvbnNlLCB1c2VybmFtZSwgcGFzc3dvcmQgfSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ0RQIG1heSBzZW5kIGEgRmV0Y2gucmVxdWVzdFBhdXNlZCB3aXRob3V0IG9yIGJlZm9yZSBhXG4gICAgICogTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudFxuICAgICAqXG4gICAgICogQ0RQIG1heSBzZW5kIG11bHRpcGxlIEZldGNoLnJlcXVlc3RQYXVzZWRcbiAgICAgKiBmb3IgdGhlIHNhbWUgTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudC5cbiAgICAgKi9cbiAgICAjb25SZXF1ZXN0UGF1c2VkKGNsaWVudCwgZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgJiZcbiAgICAgICAgICAgIHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGNsaWVudFxuICAgICAgICAgICAgICAgIC5zZW5kKCdGZXRjaC5jb250aW51ZVJlcXVlc3QnLCB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdElkOiBldmVudC5yZXF1ZXN0SWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG5ldHdvcmtJZDogbmV0d29ya1JlcXVlc3RJZCwgcmVxdWVzdElkOiBmZXRjaFJlcXVlc3RJZCB9ID0gZXZlbnQ7XG4gICAgICAgIGlmICghbmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICAgICAgdGhpcy4jb25SZXF1ZXN0V2l0aG91dE5ldHdvcmtJbnN0cnVtZW50YXRpb24oY2xpZW50LCBldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdFdpbGxCZVNlbnRFdmVudCA9ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0V2lsbEJlU2VudEV2ZW50ID0gdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5nZXRSZXF1ZXN0V2lsbEJlU2VudChuZXR3b3JrUmVxdWVzdElkKTtcbiAgICAgICAgICAgIC8vIHJlZGlyZWN0IHJlcXVlc3RzIGhhdmUgdGhlIHNhbWUgYHJlcXVlc3RJZGAsXG4gICAgICAgICAgICBpZiAocmVxdWVzdFdpbGxCZVNlbnRFdmVudCAmJlxuICAgICAgICAgICAgICAgIChyZXF1ZXN0V2lsbEJlU2VudEV2ZW50LnJlcXVlc3QudXJsICE9PSBldmVudC5yZXF1ZXN0LnVybCB8fFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0V2lsbEJlU2VudEV2ZW50LnJlcXVlc3QubWV0aG9kICE9PSBldmVudC5yZXF1ZXN0Lm1ldGhvZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmZvcmdldFJlcXVlc3RXaWxsQmVTZW50KG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0V2lsbEJlU2VudEV2ZW50O1xuICAgICAgICB9KSgpO1xuICAgICAgICBpZiAocmVxdWVzdFdpbGxCZVNlbnRFdmVudCkge1xuICAgICAgICAgICAgdGhpcy4jcGF0Y2hSZXF1ZXN0RXZlbnRIZWFkZXJzKHJlcXVlc3RXaWxsQmVTZW50RXZlbnQsIGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMuI29uUmVxdWVzdChjbGllbnQsIHJlcXVlc3RXaWxsQmVTZW50RXZlbnQsIGZldGNoUmVxdWVzdElkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuc3RvcmVSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjcGF0Y2hSZXF1ZXN0RXZlbnRIZWFkZXJzKHJlcXVlc3RXaWxsQmVTZW50RXZlbnQsIHJlcXVlc3RQYXVzZWRFdmVudCkge1xuICAgICAgICByZXF1ZXN0V2lsbEJlU2VudEV2ZW50LnJlcXVlc3QuaGVhZGVycyA9IHtcbiAgICAgICAgICAgIC4uLnJlcXVlc3RXaWxsQmVTZW50RXZlbnQucmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgICAgLy8gaW5jbHVkZXMgZXh0cmEgaGVhZGVycywgbGlrZTogQWNjZXB0LCBPcmlnaW5cbiAgICAgICAgICAgIC4uLnJlcXVlc3RQYXVzZWRFdmVudC5yZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgIH07XG4gICAgfVxuICAgICNvblJlcXVlc3RXaXRob3V0TmV0d29ya0luc3RydW1lbnRhdGlvbihjbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIElmIGFuIGV2ZW50IGhhcyBubyBuZXR3b3JrSWQgaXQgc2hvdWxkIG5vdCBoYXZlIGFueSBuZXR3b3JrIGV2ZW50cy4gV2VcbiAgICAgICAgLy8gc3RpbGwgd2FudCB0byBkaXNwYXRjaCBpdCBmb3IgdGhlIGludGVyY2VwdGlvbiBieSB0aGUgdXNlci5cbiAgICAgICAgY29uc3QgZnJhbWUgPSBldmVudC5mcmFtZUlkXG4gICAgICAgICAgICA/IHRoaXMuI2ZyYW1lTWFuYWdlci5mcmFtZShldmVudC5mcmFtZUlkKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IENkcEhUVFBSZXF1ZXN0KGNsaWVudCwgZnJhbWUsIGV2ZW50LnJlcXVlc3RJZCwgdGhpcy4jdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkLCBldmVudCwgW10pO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0LCByZXF1ZXN0KTtcbiAgICAgICAgdm9pZCByZXF1ZXN0LmZpbmFsaXplSW50ZXJjZXB0aW9ucygpO1xuICAgIH1cbiAgICAjb25SZXF1ZXN0KGNsaWVudCwgZXZlbnQsIGZldGNoUmVxdWVzdElkKSB7XG4gICAgICAgIGxldCByZWRpcmVjdENoYWluID0gW107XG4gICAgICAgIGlmIChldmVudC5yZWRpcmVjdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAvLyBXZSB3YW50IHRvIGVtaXQgYSByZXNwb25zZSBhbmQgcmVxdWVzdGZpbmlzaGVkIGZvciB0aGVcbiAgICAgICAgICAgIC8vIHJlZGlyZWN0UmVzcG9uc2UsIGJ1dCB3ZSBjYW4ndCBkbyBzbyB1bmxlc3Mgd2UgaGF2ZSBhXG4gICAgICAgICAgICAvLyByZXNwb25zZUV4dHJhSW5mbyByZWFkeSB0byBwYWlyIGl0IHVwIHdpdGguIElmIHdlIGRvbid0IGhhdmUgYW55XG4gICAgICAgICAgICAvLyByZXNwb25zZUV4dHJhSW5mb3Mgc2F2ZWQgaW4gb3VyIHF1ZXVlLCB0aGV5IHdlIGhhdmUgdG8gd2FpdCB1bnRpbFxuICAgICAgICAgICAgLy8gdGhlIG5leHQgb25lIHRvIGVtaXQgcmVzcG9uc2UgYW5kIHJlcXVlc3RmaW5pc2hlZCwgKmFuZCogd2Ugc2hvdWxkXG4gICAgICAgICAgICAvLyBhbHNvIHdhaXQgdG8gZW1pdCB0aGlzIFJlcXVlc3QgdG9vIGJlY2F1c2UgaXQgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAvLyByZXNwb25zZS9yZXF1ZXN0ZmluaXNoZWQuXG4gICAgICAgICAgICBsZXQgcmVkaXJlY3RSZXNwb25zZUV4dHJhSW5mbyA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZXZlbnQucmVkaXJlY3RIYXNFeHRyYUluZm8pIHtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFJlc3BvbnNlRXh0cmFJbmZvID0gdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAucmVzcG9uc2VFeHRyYUluZm8oZXZlbnQucmVxdWVzdElkKVxuICAgICAgICAgICAgICAgICAgICAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0UmVzcG9uc2VFeHRyYUluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5xdWV1ZVJlZGlyZWN0SW5mbyhldmVudC5yZXF1ZXN0SWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hSZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICAgICAgLy8gSWYgd2UgY29ubmVjdCBsYXRlIHRvIHRoZSB0YXJnZXQsIHdlIGNvdWxkIGhhdmUgbWlzc2VkIHRoZVxuICAgICAgICAgICAgLy8gcmVxdWVzdFdpbGxCZVNlbnQgZXZlbnQuXG4gICAgICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2hhbmRsZVJlcXVlc3RSZWRpcmVjdChjbGllbnQsIHJlcXVlc3QsIGV2ZW50LnJlZGlyZWN0UmVzcG9uc2UsIHJlZGlyZWN0UmVzcG9uc2VFeHRyYUluZm8pO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0Q2hhaW4gPSByZXF1ZXN0Ll9yZWRpcmVjdENoYWluO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZyYW1lID0gZXZlbnQuZnJhbWVJZFxuICAgICAgICAgICAgPyB0aGlzLiNmcmFtZU1hbmFnZXIuZnJhbWUoZXZlbnQuZnJhbWVJZClcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBDZHBIVFRQUmVxdWVzdChjbGllbnQsIGZyYW1lLCBmZXRjaFJlcXVlc3RJZCwgdGhpcy4jdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkLCBldmVudCwgcmVkaXJlY3RDaGFpbik7XG4gICAgICAgIHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuc3RvcmVSZXF1ZXN0KGV2ZW50LnJlcXVlc3RJZCwgcmVxdWVzdCk7XG4gICAgICAgIHRoaXMuZW1pdChOZXR3b3JrTWFuYWdlckV2ZW50LlJlcXVlc3QsIHJlcXVlc3QpO1xuICAgICAgICB2b2lkIHJlcXVlc3QuZmluYWxpemVJbnRlcmNlcHRpb25zKCk7XG4gICAgfVxuICAgICNvblJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUoX2NsaWVudCwgZXZlbnQpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmVxdWVzdC5fZnJvbU1lbW9yeUNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0U2VydmVkRnJvbUNhY2hlLCByZXF1ZXN0KTtcbiAgICB9XG4gICAgI2hhbmRsZVJlcXVlc3RSZWRpcmVjdChjbGllbnQsIHJlcXVlc3QsIHJlc3BvbnNlUGF5bG9hZCwgZXh0cmFJbmZvKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IENkcEhUVFBSZXNwb25zZShjbGllbnQsIHJlcXVlc3QsIHJlc3BvbnNlUGF5bG9hZCwgZXh0cmFJbmZvKTtcbiAgICAgICAgcmVxdWVzdC5fcmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgcmVxdWVzdC5fcmVkaXJlY3RDaGFpbi5wdXNoKHJlcXVlc3QpO1xuICAgICAgICByZXNwb25zZS5fcmVzb2x2ZUJvZHkobmV3IEVycm9yKCdSZXNwb25zZSBib2R5IGlzIHVuYXZhaWxhYmxlIGZvciByZWRpcmVjdCByZXNwb25zZXMnKSk7XG4gICAgICAgIHRoaXMuI2ZvcmdldFJlcXVlc3QocmVxdWVzdCwgZmFsc2UpO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmluaXNoZWQsIHJlcXVlc3QpO1xuICAgIH1cbiAgICAjZW1pdFJlc3BvbnNlRXZlbnQoY2xpZW50LCByZXNwb25zZVJlY2VpdmVkLCBleHRyYUluZm8pIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChyZXNwb25zZVJlY2VpdmVkLnJlcXVlc3RJZCk7XG4gICAgICAgIC8vIEZpbGVVcGxvYWQgc2VuZHMgYSByZXNwb25zZSB3aXRob3V0IGEgbWF0Y2hpbmcgcmVxdWVzdC5cbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXh0cmFJbmZvcyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIucmVzcG9uc2VFeHRyYUluZm8ocmVzcG9uc2VSZWNlaXZlZC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAoZXh0cmFJbmZvcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRlYnVnRXJyb3IobmV3IEVycm9yKCdVbmV4cGVjdGVkIGV4dHJhSW5mbyBldmVudHMgZm9yIHJlcXVlc3QgJyArXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VSZWNlaXZlZC5yZXF1ZXN0SWQpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaHJvbWl1bSBzZW5kcyB3cm9uZyBleHRyYUluZm8gZXZlbnRzIGZvciByZXNwb25zZXMgc2VydmVkIGZyb20gY2FjaGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHVwcGV0ZWVyL3B1cHBldGVlci9pc3N1ZXMvOTk2NSBhbmRcbiAgICAgICAgLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vMTM0MDM5OC5cbiAgICAgICAgaWYgKHJlc3BvbnNlUmVjZWl2ZWQucmVzcG9uc2UuZnJvbURpc2tDYWNoZSkge1xuICAgICAgICAgICAgZXh0cmFJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IG5ldyBDZHBIVFRQUmVzcG9uc2UoY2xpZW50LCByZXF1ZXN0LCByZXNwb25zZVJlY2VpdmVkLnJlc3BvbnNlLCBleHRyYUluZm8pO1xuICAgICAgICByZXF1ZXN0Ll9yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgIH1cbiAgICAjb25SZXNwb25zZVJlY2VpdmVkKGNsaWVudCwgZXZlbnQpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBsZXQgZXh0cmFJbmZvID0gbnVsbDtcbiAgICAgICAgaWYgKHJlcXVlc3QgJiYgIXJlcXVlc3QuX2Zyb21NZW1vcnlDYWNoZSAmJiBldmVudC5oYXNFeHRyYUluZm8pIHtcbiAgICAgICAgICAgIGV4dHJhSW5mbyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXJcbiAgICAgICAgICAgICAgICAucmVzcG9uc2VFeHRyYUluZm8oZXZlbnQucmVxdWVzdElkKVxuICAgICAgICAgICAgICAgIC5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKCFleHRyYUluZm8pIHtcbiAgICAgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHdlIGdldCB0aGUgY29ycmVzcG9uZGluZyBFeHRyYUluZm8gZXZlbnQuXG4gICAgICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5xdWV1ZUV2ZW50R3JvdXAoZXZlbnQucmVxdWVzdElkLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUmVjZWl2ZWRFdmVudDogZXZlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2VtaXRSZXNwb25zZUV2ZW50KGNsaWVudCwgZXZlbnQsIGV4dHJhSW5mbyk7XG4gICAgfVxuICAgICNvblJlc3BvbnNlUmVjZWl2ZWRFeHRyYUluZm8oY2xpZW50LCBldmVudCkge1xuICAgICAgICAvLyBXZSBtYXkgaGF2ZSBza2lwcGVkIGEgcmVkaXJlY3QgcmVzcG9uc2UvcmVxdWVzdCBwYWlyIGR1ZSB0byB3YWl0aW5nIGZvclxuICAgICAgICAvLyB0aGlzIEV4dHJhSW5mbyBldmVudC4gSWYgc28sIGNvbnRpbnVlIHRoYXQgd29yayBub3cgdGhhdCB3ZSBoYXZlIHRoZVxuICAgICAgICAvLyByZXF1ZXN0LlxuICAgICAgICBjb25zdCByZWRpcmVjdEluZm8gPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLnRha2VRdWV1ZWRSZWRpcmVjdEluZm8oZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgaWYgKHJlZGlyZWN0SW5mbykge1xuICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5yZXNwb25zZUV4dHJhSW5mbyhldmVudC5yZXF1ZXN0SWQpLnB1c2goZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy4jb25SZXF1ZXN0KGNsaWVudCwgcmVkaXJlY3RJbmZvLmV2ZW50LCByZWRpcmVjdEluZm8uZmV0Y2hSZXF1ZXN0SWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIG1heSBoYXZlIHNraXBwZWQgcmVzcG9uc2UgYW5kIGxvYWRpbmcgZXZlbnRzIGJlY2F1c2Ugd2UgZGlkbid0IGhhdmVcbiAgICAgICAgLy8gdGhpcyBFeHRyYUluZm8gZXZlbnQgeWV0LiBJZiBzbywgZW1pdCB0aG9zZSBldmVudHMgbm93LlxuICAgICAgICBjb25zdCBxdWV1ZWRFdmVudHMgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFF1ZXVlZEV2ZW50R3JvdXAoZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgaWYgKHF1ZXVlZEV2ZW50cykge1xuICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5mb3JnZXRRdWV1ZWRFdmVudEdyb3VwKGV2ZW50LnJlcXVlc3RJZCk7XG4gICAgICAgICAgICB0aGlzLiNlbWl0UmVzcG9uc2VFdmVudChjbGllbnQsIHF1ZXVlZEV2ZW50cy5yZXNwb25zZVJlY2VpdmVkRXZlbnQsIGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChxdWV1ZWRFdmVudHMubG9hZGluZ0ZpbmlzaGVkRXZlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNlbWl0TG9hZGluZ0ZpbmlzaGVkKHF1ZXVlZEV2ZW50cy5sb2FkaW5nRmluaXNoZWRFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocXVldWVkRXZlbnRzLmxvYWRpbmdGYWlsZWRFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXRMb2FkaW5nRmFpbGVkKHF1ZXVlZEV2ZW50cy5sb2FkaW5nRmFpbGVkRXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhaXQgdW50aWwgd2UgZ2V0IGFub3RoZXIgZXZlbnQgdGhhdCBjYW4gdXNlIHRoaXMgRXh0cmFJbmZvIGV2ZW50LlxuICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLnJlc3BvbnNlRXh0cmFJbmZvKGV2ZW50LnJlcXVlc3RJZCkucHVzaChldmVudCk7XG4gICAgfVxuICAgICNmb3JnZXRSZXF1ZXN0KHJlcXVlc3QsIGV2ZW50cykge1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSByZXF1ZXN0LmlkO1xuICAgICAgICBjb25zdCBpbnRlcmNlcHRpb25JZCA9IHJlcXVlc3QuX2ludGVyY2VwdGlvbklkO1xuICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmZvcmdldFJlcXVlc3QocmVxdWVzdElkKTtcbiAgICAgICAgaW50ZXJjZXB0aW9uSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdGhpcy4jYXR0ZW1wdGVkQXV0aGVudGljYXRpb25zLmRlbGV0ZShpbnRlcmNlcHRpb25JZCk7XG4gICAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZm9yZ2V0KHJlcXVlc3RJZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uTG9hZGluZ0ZpbmlzaGVkKF9jbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBldmVudCBmb3IgdGhpcyByZXF1ZXN0IGlzIHN0aWxsIHdhaXRpbmcgb24gYVxuICAgICAgICAvLyBjb3JyZXNwb25kaW5nIEV4dHJhSW5mbyBldmVudCwgdGhlbiB3YWl0IHRvIGVtaXQgdGhpcyBldmVudCB0b28uXG4gICAgICAgIGNvbnN0IHF1ZXVlZEV2ZW50cyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UXVldWVkRXZlbnRHcm91cChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAocXVldWVkRXZlbnRzKSB7XG4gICAgICAgICAgICBxdWV1ZWRFdmVudHMubG9hZGluZ0ZpbmlzaGVkRXZlbnQgPSBldmVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2VtaXRMb2FkaW5nRmluaXNoZWQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNlbWl0TG9hZGluZ0ZpbmlzaGVkKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFJlcXVlc3QoZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgLy8gRm9yIGNlcnRhaW4gcmVxdWVzdElkcyB3ZSBuZXZlciByZWNlaXZlIHJlcXVlc3RXaWxsQmVTZW50IGV2ZW50LlxuICAgICAgICAvLyBAc2VlIGh0dHBzOi8vY3JidWcuY29tLzc1MDQ2OVxuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMgd2UgbmV2ZXIgZ2V0IHRoZSBOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWRcbiAgICAgICAgLy8gZXZlbnQgZnJvbSBwcm90b2NvbC4gQHNlZSBodHRwczovL2NyYnVnLmNvbS84ODM0NzVcbiAgICAgICAgaWYgKHJlcXVlc3QucmVzcG9uc2UoKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZSgpPy5fcmVzb2x2ZUJvZHkoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmb3JnZXRSZXF1ZXN0KHJlcXVlc3QsIHRydWUpO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmluaXNoZWQsIHJlcXVlc3QpO1xuICAgIH1cbiAgICAjb25Mb2FkaW5nRmFpbGVkKF9jbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBldmVudCBmb3IgdGhpcyByZXF1ZXN0IGlzIHN0aWxsIHdhaXRpbmcgb24gYVxuICAgICAgICAvLyBjb3JyZXNwb25kaW5nIEV4dHJhSW5mbyBldmVudCwgdGhlbiB3YWl0IHRvIGVtaXQgdGhpcyBldmVudCB0b28uXG4gICAgICAgIGNvbnN0IHF1ZXVlZEV2ZW50cyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UXVldWVkRXZlbnRHcm91cChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAocXVldWVkRXZlbnRzKSB7XG4gICAgICAgICAgICBxdWV1ZWRFdmVudHMubG9hZGluZ0ZhaWxlZEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNlbWl0TG9hZGluZ0ZhaWxlZChldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2VtaXRMb2FkaW5nRmFpbGVkKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFJlcXVlc3QoZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgLy8gRm9yIGNlcnRhaW4gcmVxdWVzdElkcyB3ZSBuZXZlciByZWNlaXZlIHJlcXVlc3RXaWxsQmVTZW50IGV2ZW50LlxuICAgICAgICAvLyBAc2VlIGh0dHBzOi8vY3JidWcuY29tLzc1MDQ2OVxuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0Ll9mYWlsdXJlVGV4dCA9IGV2ZW50LmVycm9yVGV4dDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXF1ZXN0LnJlc3BvbnNlKCk7XG4gICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgcmVzcG9uc2UuX3Jlc29sdmVCb2R5KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZm9yZ2V0UmVxdWVzdChyZXF1ZXN0LCB0cnVlKTtcbiAgICAgICAgdGhpcy5lbWl0KE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdEZhaWxlZCwgcmVxdWVzdCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmV0d29ya01hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgcmFjZVdpdGggfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMnO1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbkV2ZW50IH0gZnJvbSAnLi4vYXBpL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgUGFnZSwgfSBmcm9tICcuLi9hcGkvUGFnZS5qcyc7XG5pbXBvcnQgeyBDb25zb2xlTWVzc2FnZSwgfSBmcm9tICcuLi9jb21tb24vQ29uc29sZU1lc3NhZ2UuanMnO1xuaW1wb3J0IHsgVGFyZ2V0Q2xvc2VFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgRmlsZUNob29zZXIgfSBmcm9tICcuLi9jb21tb24vRmlsZUNob29zZXIuanMnO1xuaW1wb3J0IHsgTmV0d29ya01hbmFnZXJFdmVudCB9IGZyb20gJy4uL2NvbW1vbi9OZXR3b3JrTWFuYWdlckV2ZW50cy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yLCBldmFsdWF0aW9uU3RyaW5nLCBnZXRSZWFkYWJsZUFzQnVmZmVyLCBnZXRSZWFkYWJsZUZyb21Qcm90b2NvbFN0cmVhbSwgcGFyc2VQREZPcHRpb25zLCB0aW1lb3V0LCB2YWxpZGF0ZURpYWxvZ1R5cGUsIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IEFzeW5jRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IGlzRXJyb3JMaWtlIH0gZnJvbSAnLi4vdXRpbC9FcnJvckxpa2UuanMnO1xuaW1wb3J0IHsgQmluZGluZyB9IGZyb20gJy4vQmluZGluZy5qcyc7XG5pbXBvcnQgeyBDZHBDRFBTZXNzaW9uIH0gZnJvbSAnLi9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IGlzVGFyZ2V0Q2xvc2VkRXJyb3IgfSBmcm9tICcuL0Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHsgQ292ZXJhZ2UgfSBmcm9tICcuL0NvdmVyYWdlLmpzJztcbmltcG9ydCB7IENkcERpYWxvZyB9IGZyb20gJy4vRGlhbG9nLmpzJztcbmltcG9ydCB7IEVtdWxhdGlvbk1hbmFnZXIgfSBmcm9tICcuL0VtdWxhdGlvbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRmlyZWZveFRhcmdldE1hbmFnZXIgfSBmcm9tICcuL0ZpcmVmb3hUYXJnZXRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlciB9IGZyb20gJy4vRnJhbWVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlckV2ZW50IH0gZnJvbSAnLi9GcmFtZU1hbmFnZXJFdmVudHMuanMnO1xuaW1wb3J0IHsgQ2RwS2V5Ym9hcmQsIENkcE1vdXNlLCBDZHBUb3VjaHNjcmVlbiB9IGZyb20gJy4vSW5wdXQuanMnO1xuaW1wb3J0IHsgTUFJTl9XT1JMRCB9IGZyb20gJy4vSXNvbGF0ZWRXb3JsZHMuanMnO1xuaW1wb3J0IHsgcmVsZWFzZU9iamVjdCB9IGZyb20gJy4vSlNIYW5kbGUuanMnO1xuaW1wb3J0IHsgVHJhY2luZyB9IGZyb20gJy4vVHJhY2luZy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVDbGllbnRFcnJvciwgcGFnZUJpbmRpbmdJbml0U3RyaW5nLCB2YWx1ZUZyb21SZW1vdGVPYmplY3QsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBDZHBXZWJXb3JrZXIgfSBmcm9tICcuL1dlYldvcmtlci5qcyc7XG5mdW5jdGlvbiBjb252ZXJ0Q29uc29sZU1lc3NhZ2VMZXZlbChtZXRob2QpIHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICBjYXNlICd3YXJuaW5nJzpcbiAgICAgICAgICAgIHJldHVybiAnd2Fybic7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBQYWdlIGV4dGVuZHMgUGFnZSB7XG4gICAgc3RhdGljIGFzeW5jIF9jcmVhdGUoY2xpZW50LCB0YXJnZXQsIGRlZmF1bHRWaWV3cG9ydCkge1xuICAgICAgICBjb25zdCBwYWdlID0gbmV3IENkcFBhZ2UoY2xpZW50LCB0YXJnZXQpO1xuICAgICAgICBhd2FpdCBwYWdlLiNpbml0aWFsaXplKCk7XG4gICAgICAgIGlmIChkZWZhdWx0Vmlld3BvcnQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5zZXRWaWV3cG9ydChkZWZhdWx0Vmlld3BvcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChpc0Vycm9yTGlrZShlcnIpICYmIGlzVGFyZ2V0Q2xvc2VkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWdlO1xuICAgIH1cbiAgICAjY2xvc2VkID0gZmFsc2U7XG4gICAgI3RhcmdldE1hbmFnZXI7XG4gICAgI3ByaW1hcnlUYXJnZXRDbGllbnQ7XG4gICAgI3ByaW1hcnlUYXJnZXQ7XG4gICAgI3RhYlRhcmdldENsaWVudDtcbiAgICAjdGFiVGFyZ2V0O1xuICAgICNrZXlib2FyZDtcbiAgICAjbW91c2U7XG4gICAgI3RvdWNoc2NyZWVuO1xuICAgICNmcmFtZU1hbmFnZXI7XG4gICAgI2VtdWxhdGlvbk1hbmFnZXI7XG4gICAgI3RyYWNpbmc7XG4gICAgI2JpbmRpbmdzID0gbmV3IE1hcCgpO1xuICAgICNleHBvc2VkRnVuY3Rpb25zID0gbmV3IE1hcCgpO1xuICAgICNjb3ZlcmFnZTtcbiAgICAjdmlld3BvcnQ7XG4gICAgI3dvcmtlcnMgPSBuZXcgTWFwKCk7XG4gICAgI2ZpbGVDaG9vc2VyRGVmZXJyZWRzID0gbmV3IFNldCgpO1xuICAgICNzZXNzaW9uQ2xvc2VEZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICNzZXJ2aWNlV29ya2VyQnlwYXNzZWQgPSBmYWxzZTtcbiAgICAjdXNlckRyYWdJbnRlcmNlcHRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgI2ZyYW1lTWFuYWdlckhhbmRsZXJzID0gW1xuICAgICAgICBbXG4gICAgICAgICAgICBGcmFtZU1hbmFnZXJFdmVudC5GcmFtZUF0dGFjaGVkLFxuICAgICAgICAgICAgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZnJhbWVhdHRhY2hlZFwiIC8qIFBhZ2VFdmVudC5GcmFtZUF0dGFjaGVkICovLCBmcmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICBGcmFtZU1hbmFnZXJFdmVudC5GcmFtZURldGFjaGVkLFxuICAgICAgICAgICAgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZnJhbWVkZXRhY2hlZFwiIC8qIFBhZ2VFdmVudC5GcmFtZURldGFjaGVkICovLCBmcmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICBGcmFtZU1hbmFnZXJFdmVudC5GcmFtZU5hdmlnYXRlZCxcbiAgICAgICAgICAgIChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImZyYW1lbmF2aWdhdGVkXCIgLyogUGFnZUV2ZW50LkZyYW1lTmF2aWdhdGVkICovLCBmcmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgIF07XG4gICAgI25ldHdvcmtNYW5hZ2VySGFuZGxlcnMgPSBbXG4gICAgICAgIFtcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdCxcbiAgICAgICAgICAgIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwicmVxdWVzdFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0ICovLCByZXF1ZXN0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdFNlcnZlZEZyb21DYWNoZSxcbiAgICAgICAgICAgIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwicmVxdWVzdHNlcnZlZGZyb21jYWNoZVwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0U2VydmVkRnJvbUNhY2hlICovLCByZXF1ZXN0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVzcG9uc2UsXG4gICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJyZXNwb25zZVwiIC8qIFBhZ2VFdmVudC5SZXNwb25zZSAqLywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmFpbGVkLFxuICAgICAgICAgICAgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJyZXF1ZXN0ZmFpbGVkXCIgLyogUGFnZUV2ZW50LlJlcXVlc3RGYWlsZWQgKi8sIHJlcXVlc3QpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmluaXNoZWQsXG4gICAgICAgICAgICAocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcInJlcXVlc3RmaW5pc2hlZFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0RmluaXNoZWQgKi8sIHJlcXVlc3QpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICBdO1xuICAgICNzZXNzaW9uSGFuZGxlcnMgPSBbXG4gICAgICAgIFtcbiAgICAgICAgICAgIENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4jc2Vzc2lvbkNsb3NlRGVmZXJyZWQucmVqZWN0KG5ldyBUYXJnZXRDbG9zZUVycm9yKCdUYXJnZXQgY2xvc2VkJykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgJ1BhZ2UuZG9tQ29udGVudEV2ZW50RmlyZWQnLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoXCJkb21jb250ZW50bG9hZGVkXCIgLyogUGFnZUV2ZW50LkRPTUNvbnRlbnRMb2FkZWQgKi8sIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICAnUGFnZS5sb2FkRXZlbnRGaXJlZCcsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdChcImxvYWRcIiAvKiBQYWdlRXZlbnQuTG9hZCAqLywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIFsnUGFnZS5qYXZhc2NyaXB0RGlhbG9nT3BlbmluZycsIHRoaXMuI29uRGlhbG9nLmJpbmQodGhpcyldLFxuICAgICAgICBbJ1J1bnRpbWUuZXhjZXB0aW9uVGhyb3duJywgdGhpcy4jaGFuZGxlRXhjZXB0aW9uLmJpbmQodGhpcyldLFxuICAgICAgICBbJ0luc3BlY3Rvci50YXJnZXRDcmFzaGVkJywgdGhpcy4jb25UYXJnZXRDcmFzaGVkLmJpbmQodGhpcyldLFxuICAgICAgICBbJ1BlcmZvcm1hbmNlLm1ldHJpY3MnLCB0aGlzLiNlbWl0TWV0cmljcy5iaW5kKHRoaXMpXSxcbiAgICAgICAgWydMb2cuZW50cnlBZGRlZCcsIHRoaXMuI29uTG9nRW50cnlBZGRlZC5iaW5kKHRoaXMpXSxcbiAgICAgICAgWydQYWdlLmZpbGVDaG9vc2VyT3BlbmVkJywgdGhpcy4jb25GaWxlQ2hvb3Nlci5iaW5kKHRoaXMpXSxcbiAgICBdO1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCwgdGFyZ2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3RhYlRhcmdldENsaWVudCA9IGNsaWVudC5wYXJlbnRTZXNzaW9uKCk7XG4gICAgICAgIGFzc2VydCh0aGlzLiN0YWJUYXJnZXRDbGllbnQsICdUYWIgdGFyZ2V0IHNlc3Npb24gaXMgbm90IGRlZmluZWQuJyk7XG4gICAgICAgIHRoaXMuI3RhYlRhcmdldCA9IHRoaXMuI3RhYlRhcmdldENsaWVudC5fdGFyZ2V0KCk7XG4gICAgICAgIGFzc2VydCh0aGlzLiN0YWJUYXJnZXQsICdUYWIgdGFyZ2V0IGlzIG5vdCBkZWZpbmVkLicpO1xuICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyID0gdGFyZ2V0Ll90YXJnZXRNYW5hZ2VyKCk7XG4gICAgICAgIHRoaXMuI2tleWJvYXJkID0gbmV3IENkcEtleWJvYXJkKGNsaWVudCk7XG4gICAgICAgIHRoaXMuI21vdXNlID0gbmV3IENkcE1vdXNlKGNsaWVudCwgdGhpcy4ja2V5Ym9hcmQpO1xuICAgICAgICB0aGlzLiN0b3VjaHNjcmVlbiA9IG5ldyBDZHBUb3VjaHNjcmVlbihjbGllbnQsIHRoaXMuI2tleWJvYXJkKTtcbiAgICAgICAgdGhpcy4jZnJhbWVNYW5hZ2VyID0gbmV3IEZyYW1lTWFuYWdlcihjbGllbnQsIHRoaXMsIHRoaXMuX3RpbWVvdXRTZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIgPSBuZXcgRW11bGF0aW9uTWFuYWdlcihjbGllbnQpO1xuICAgICAgICB0aGlzLiN0cmFjaW5nID0gbmV3IFRyYWNpbmcoY2xpZW50KTtcbiAgICAgICAgdGhpcy4jY292ZXJhZ2UgPSBuZXcgQ292ZXJhZ2UoY2xpZW50KTtcbiAgICAgICAgdGhpcy4jdmlld3BvcnQgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIHRoaXMuI2ZyYW1lTWFuYWdlckhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIub24oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIub24oRnJhbWVNYW5hZ2VyRXZlbnQuQ29uc29sZUFwaUNhbGxlZCwgKFt3b3JsZCwgZXZlbnRdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNvbkNvbnNvbGVBUEkod29ybGQsIGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5vbihGcmFtZU1hbmFnZXJFdmVudC5CaW5kaW5nQ2FsbGVkLCAoW3dvcmxkLCBldmVudF0pID0+IHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25CaW5kaW5nQ2FsbGVkKHdvcmxkLCBldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIHRoaXMuI25ldHdvcmtNYW5hZ2VySGFuZGxlcnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBhbnkuXG4gICAgICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIubmV0d29ya01hbmFnZXIub24oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN0YWJUYXJnZXRDbGllbnQub24oQ0RQU2Vzc2lvbkV2ZW50LlN3YXBwZWQsIHRoaXMuI29uQWN0aXZhdGlvbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy4jdGFiVGFyZ2V0Q2xpZW50Lm9uKENEUFNlc3Npb25FdmVudC5SZWFkeSwgdGhpcy4jb25TZWNvbmRhcnlUYXJnZXQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXRHb25lXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldEdvbmUgKi8sIHRoaXMuI29uRGV0YWNoZWRGcm9tVGFyZ2V0KTtcbiAgICAgICAgdGhpcy4jdGFiVGFyZ2V0Ll9pc0Nsb3NlZERlZmVycmVkXG4gICAgICAgICAgICAudmFsdWVPclRocm93KClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub2ZmKFwidGFyZ2V0R29uZVwiIC8qIFRhcmdldE1hbmFnZXJFdmVudC5UYXJnZXRHb25lICovLCB0aGlzLiNvbkRldGFjaGVkRnJvbVRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHRoaXMuI2Nsb3NlZCA9IHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIHRoaXMuI3NldHVwUHJpbWFyeVRhcmdldExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLiNhdHRhY2hFeGlzdGluZ1RhcmdldHMoKTtcbiAgICB9XG4gICAgI2F0dGFjaEV4aXN0aW5nVGFyZ2V0cygpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZFRhcmdldCBvZiB0aGlzLiN0YXJnZXRNYW5hZ2VyLmdldENoaWxkVGFyZ2V0cyh0aGlzLiNwcmltYXJ5VGFyZ2V0KSkge1xuICAgICAgICAgICAgcXVldWUucHVzaChjaGlsZFRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlkeCA9IDA7XG4gICAgICAgIHdoaWxlIChpZHggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBxdWV1ZVtpZHhdO1xuICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gbmV4dC5fc2Vzc2lvbigpO1xuICAgICAgICAgICAgaWYgKHNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNvbkF0dGFjaGVkVG9UYXJnZXQoc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkVGFyZ2V0IG9mIHRoaXMuI3RhcmdldE1hbmFnZXIuZ2V0Q2hpbGRUYXJnZXRzKG5leHQpKSB7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaChjaGlsZFRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI29uQWN0aXZhdGlvbihuZXdTZXNzaW9uKSB7XG4gICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQgPSBuZXdTZXNzaW9uO1xuICAgICAgICBhc3NlcnQodGhpcy4jcHJpbWFyeVRhcmdldENsaWVudCBpbnN0YW5jZW9mIENkcENEUFNlc3Npb24sICdDRFBTZXNzaW9uIGlzIG5vdCBpbnN0YW5jZSBvZiBDRFBTZXNzaW9uSW1wbCcpO1xuICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0ID0gdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5fdGFyZ2V0KCk7XG4gICAgICAgIGFzc2VydCh0aGlzLiNwcmltYXJ5VGFyZ2V0LCAnTWlzc2luZyB0YXJnZXQgb24gc3dhcCcpO1xuICAgICAgICB0aGlzLiNrZXlib2FyZC51cGRhdGVDbGllbnQobmV3U2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI21vdXNlLnVwZGF0ZUNsaWVudChuZXdTZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jdG91Y2hzY3JlZW4udXBkYXRlQ2xpZW50KG5ld1Nlc3Npb24pO1xuICAgICAgICB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLnVwZGF0ZUNsaWVudChuZXdTZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jdHJhY2luZy51cGRhdGVDbGllbnQobmV3U2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI2NvdmVyYWdlLnVwZGF0ZUNsaWVudChuZXdTZXNzaW9uKTtcbiAgICAgICAgYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLnN3YXBGcmFtZVRyZWUobmV3U2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI3NldHVwUHJpbWFyeVRhcmdldExpc3RlbmVycygpO1xuICAgIH1cbiAgICBhc3luYyAjb25TZWNvbmRhcnlUYXJnZXQoc2Vzc2lvbikge1xuICAgICAgICBhc3NlcnQoc2Vzc2lvbiBpbnN0YW5jZW9mIENkcENEUFNlc3Npb24pO1xuICAgICAgICBpZiAoc2Vzc2lvbi5fdGFyZ2V0KCkuX3N1YnR5cGUoKSAhPT0gJ3ByZXJlbmRlcicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIucmVnaXN0ZXJTcGVjdWxhdGl2ZVNlc3Npb24oc2Vzc2lvbikuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIHRoaXMuI2VtdWxhdGlvbk1hbmFnZXJcbiAgICAgICAgICAgIC5yZWdpc3RlclNwZWN1bGF0aXZlU2Vzc2lvbihzZXNzaW9uKVxuICAgICAgICAgICAgLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHVwIGxpc3RlbmVycyBmb3IgdGhlIHByaW1hcnkgdGFyZ2V0LiBUaGUgcHJpbWFyeSB0YXJnZXQgY2FuIGNoYW5nZVxuICAgICAqIGR1cmluZyBhIG5hdmlnYXRpb24gdG8gYSBwcmVyZW5kZWQgcGFnZS5cbiAgICAgKi9cbiAgICAjc2V0dXBQcmltYXJ5VGFyZ2V0TGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50Lm9uKENEUFNlc3Npb25FdmVudC5SZWFkeSwgdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KTtcbiAgICAgICAgZm9yIChjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSBvZiB0aGlzLiNzZXNzaW9uSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBhbnkuXG4gICAgICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50Lm9uKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uRGV0YWNoZWRGcm9tVGFyZ2V0ID0gKHRhcmdldCkgPT4ge1xuICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSB0YXJnZXQuX3Nlc3Npb24oKT8uaWQoKTtcbiAgICAgICAgY29uc3Qgd29ya2VyID0gdGhpcy4jd29ya2Vycy5nZXQoc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCF3b3JrZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN3b3JrZXJzLmRlbGV0ZShzZXNzaW9uSWQpO1xuICAgICAgICB0aGlzLmVtaXQoXCJ3b3JrZXJkZXN0cm95ZWRcIiAvKiBQYWdlRXZlbnQuV29ya2VyRGVzdHJveWVkICovLCB3b3JrZXIpO1xuICAgIH07XG4gICAgI29uQXR0YWNoZWRUb1RhcmdldCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICAgIGFzc2VydChzZXNzaW9uIGluc3RhbmNlb2YgQ2RwQ0RQU2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5vbkF0dGFjaGVkVG9UYXJnZXQoc2Vzc2lvbi5fdGFyZ2V0KCkpO1xuICAgICAgICBpZiAoc2Vzc2lvbi5fdGFyZ2V0KCkuX2dldFRhcmdldEluZm8oKS50eXBlID09PSAnd29ya2VyJykge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gbmV3IENkcFdlYldvcmtlcihzZXNzaW9uLCBzZXNzaW9uLl90YXJnZXQoKS51cmwoKSwgc2Vzc2lvbi5fdGFyZ2V0KCkuX3RhcmdldElkLCBzZXNzaW9uLl90YXJnZXQoKS50eXBlKCksIHRoaXMuI2FkZENvbnNvbGVNZXNzYWdlLmJpbmQodGhpcyksIHRoaXMuI2hhbmRsZUV4Y2VwdGlvbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuI3dvcmtlcnMuc2V0KHNlc3Npb24uaWQoKSwgd29ya2VyKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcIndvcmtlcmNyZWF0ZWRcIiAvKiBQYWdlRXZlbnQuV29ya2VyQ3JlYXRlZCAqLywgd29ya2VyKTtcbiAgICAgICAgfVxuICAgICAgICBzZXNzaW9uLm9uKENEUFNlc3Npb25FdmVudC5SZWFkeSwgdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KTtcbiAgICB9O1xuICAgIGFzeW5jICNpbml0aWFsaXplKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5pbml0aWFsaXplKHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQpLFxuICAgICAgICAgICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnUGVyZm9ybWFuY2UuZW5hYmxlJyksXG4gICAgICAgICAgICAgICAgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdMb2cuZW5hYmxlJyksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyKSAmJiBpc1RhcmdldENsb3NlZEVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI29uRmlsZUNob29zZXIoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzLnNpemUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuI2ZyYW1lTWFuYWdlci5mcmFtZShldmVudC5mcmFtZUlkKTtcbiAgICAgICAgICAgIGFzc2VydChmcmFtZSwgJ1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4nKTtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSBhbiBIVE1MSW5wdXRFbGVtZW50IGhhbmRsZSBieSB0aGUgZXZlbnQuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMSwgKGF3YWl0IGZyYW1lLndvcmxkc1tNQUlOX1dPUkxEXS5hZG9wdEJhY2tlbmROb2RlKGV2ZW50LmJhY2tlbmROb2RlSWQpKSwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc3QgZmlsZUNob29zZXIgPSBuZXcgRmlsZUNob29zZXIoaGFuZGxlLm1vdmUoKSwgZXZlbnQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9taXNlIG9mIHRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKGZpbGVDaG9vc2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMSkge1xuICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICBlbnZfMS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9jbGllbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50O1xuICAgIH1cbiAgICBpc1NlcnZpY2VXb3JrZXJCeXBhc3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NlcnZpY2VXb3JrZXJCeXBhc3NlZDtcbiAgICB9XG4gICAgaXNEcmFnSW50ZXJjZXB0aW9uRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3VzZXJEcmFnSW50ZXJjZXB0aW9uRW5hYmxlZDtcbiAgICB9XG4gICAgaXNKYXZhU2NyaXB0RW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuamF2YXNjcmlwdEVuYWJsZWQ7XG4gICAgfVxuICAgIGFzeW5jIHdhaXRGb3JGaWxlQ2hvb3NlcihvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgbmVlZHNFbmFibGUgPSB0aGlzLiNmaWxlQ2hvb3NlckRlZmVycmVkcy5zaXplID09PSAwO1xuICAgICAgICBjb25zdCB7IHRpbWVvdXQgPSB0aGlzLl90aW1lb3V0U2V0dGluZ3MudGltZW91dCgpIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSh7XG4gICAgICAgICAgICBtZXNzYWdlOiBgV2FpdGluZyBmb3IgXFxgRmlsZUNob29zZXJcXGAgZmFpbGVkOiAke3RpbWVvdXR9bXMgZXhjZWVkZWRgLFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gICAgICAgIGxldCBlbmFibGVQcm9taXNlO1xuICAgICAgICBpZiAobmVlZHNFbmFibGUpIHtcbiAgICAgICAgICAgIGVuYWJsZVByb21pc2UgPSB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ1BhZ2Uuc2V0SW50ZXJjZXB0RmlsZUNob29zZXJEaWFsb2cnLCB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC52YWx1ZU9yVGhyb3coKSxcbiAgICAgICAgICAgICAgICBlbmFibGVQcm9taXNlLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy4jZmlsZUNob29zZXJEZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNldEdlb2xvY2F0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuc2V0R2VvbG9jYXRpb24ob3B0aW9ucyk7XG4gICAgfVxuICAgIHRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3ByaW1hcnlUYXJnZXQ7XG4gICAgfVxuICAgIGJyb3dzZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmltYXJ5VGFyZ2V0LmJyb3dzZXIoKTtcbiAgICB9XG4gICAgYnJvd3NlckNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmltYXJ5VGFyZ2V0LmJyb3dzZXJDb250ZXh0KCk7XG4gICAgfVxuICAgICNvblRhcmdldENyYXNoZWQoKSB7XG4gICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIgLyogUGFnZUV2ZW50LkVycm9yICovLCBuZXcgRXJyb3IoJ1BhZ2UgY3Jhc2hlZCEnKSk7XG4gICAgfVxuICAgICNvbkxvZ0VudHJ5QWRkZWQoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgeyBsZXZlbCwgdGV4dCwgYXJncywgc291cmNlLCB1cmwsIGxpbmVOdW1iZXIgfSA9IGV2ZW50LmVudHJ5O1xuICAgICAgICBpZiAoYXJncykge1xuICAgICAgICAgICAgYXJncy5tYXAoYXJnID0+IHtcbiAgICAgICAgICAgICAgICB2b2lkIHJlbGVhc2VPYmplY3QodGhpcy4jcHJpbWFyeVRhcmdldENsaWVudCwgYXJnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UgIT09ICd3b3JrZXInKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJjb25zb2xlXCIgLyogUGFnZUV2ZW50LkNvbnNvbGUgKi8sIG5ldyBDb25zb2xlTWVzc2FnZShjb252ZXJ0Q29uc29sZU1lc3NhZ2VMZXZlbChsZXZlbCksIHRleHQsIFtdLCBbeyB1cmwsIGxpbmVOdW1iZXIgfV0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtYWluRnJhbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmcmFtZU1hbmFnZXIubWFpbkZyYW1lKCk7XG4gICAgfVxuICAgIGdldCBrZXlib2FyZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2tleWJvYXJkO1xuICAgIH1cbiAgICBnZXQgdG91Y2hzY3JlZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0b3VjaHNjcmVlbjtcbiAgICB9XG4gICAgZ2V0IGNvdmVyYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY292ZXJhZ2U7XG4gICAgfVxuICAgIGdldCB0cmFjaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhY2luZztcbiAgICB9XG4gICAgZnJhbWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVNYW5hZ2VyLmZyYW1lcygpO1xuICAgIH1cbiAgICB3b3JrZXJzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiN3b3JrZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0UmVxdWVzdEludGVyY2VwdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLnNldFJlcXVlc3RJbnRlcmNlcHRpb24odmFsdWUpO1xuICAgIH1cbiAgICBhc3luYyBzZXRCeXBhc3NTZXJ2aWNlV29ya2VyKGJ5cGFzcykge1xuICAgICAgICB0aGlzLiNzZXJ2aWNlV29ya2VyQnlwYXNzZWQgPSBieXBhc3M7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ05ldHdvcmsuc2V0QnlwYXNzU2VydmljZVdvcmtlcicsIHsgYnlwYXNzIH0pO1xuICAgIH1cbiAgICBhc3luYyBzZXREcmFnSW50ZXJjZXB0aW9uKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy4jdXNlckRyYWdJbnRlcmNlcHRpb25FbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnSW5wdXQuc2V0SW50ZXJjZXB0RHJhZ3MnLCB7XG4gICAgICAgICAgICBlbmFibGVkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2V0T2ZmbGluZU1vZGUoZW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLnNldE9mZmxpbmVNb2RlKGVuYWJsZWQpO1xuICAgIH1cbiAgICBhc3luYyBlbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMobmV0d29ya0NvbmRpdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMobmV0d29ya0NvbmRpdGlvbnMpO1xuICAgIH1cbiAgICBzZXREZWZhdWx0TmF2aWdhdGlvblRpbWVvdXQodGltZW91dCkge1xuICAgICAgICB0aGlzLl90aW1lb3V0U2V0dGluZ3Muc2V0RGVmYXVsdE5hdmlnYXRpb25UaW1lb3V0KHRpbWVvdXQpO1xuICAgIH1cbiAgICBzZXREZWZhdWx0VGltZW91dCh0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuX3RpbWVvdXRTZXR0aW5ncy5zZXREZWZhdWx0VGltZW91dCh0aW1lb3V0KTtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdFRpbWVvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lb3V0U2V0dGluZ3MudGltZW91dCgpO1xuICAgIH1cbiAgICBhc3luYyBxdWVyeU9iamVjdHMocHJvdG90eXBlSGFuZGxlKSB7XG4gICAgICAgIGFzc2VydCghcHJvdG90eXBlSGFuZGxlLmRpc3Bvc2VkLCAnUHJvdG90eXBlIEpTSGFuZGxlIGlzIGRpc3Bvc2VkIScpO1xuICAgICAgICBhc3NlcnQocHJvdG90eXBlSGFuZGxlLmlkLCAnUHJvdG90eXBlIEpTSGFuZGxlIG11c3Qgbm90IGJlIHJlZmVyZW5jaW5nIHByaW1pdGl2ZSB2YWx1ZScpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuY2xpZW50LnNlbmQoJ1J1bnRpbWUucXVlcnlPYmplY3RzJywge1xuICAgICAgICAgICAgcHJvdG90eXBlT2JqZWN0SWQ6IHByb3RvdHlwZUhhbmRsZS5pZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpXG4gICAgICAgICAgICAubWFpblJlYWxtKClcbiAgICAgICAgICAgIC5jcmVhdGVDZHBIYW5kbGUocmVzcG9uc2Uub2JqZWN0cyk7XG4gICAgfVxuICAgIGFzeW5jIGNvb2tpZXMoLi4udXJscykge1xuICAgICAgICBjb25zdCBvcmlnaW5hbENvb2tpZXMgPSAoYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdOZXR3b3JrLmdldENvb2tpZXMnLCB7XG4gICAgICAgICAgICB1cmxzOiB1cmxzLmxlbmd0aCA/IHVybHMgOiBbdGhpcy51cmwoKV0sXG4gICAgICAgIH0pKS5jb29raWVzO1xuICAgICAgICBjb25zdCB1bnN1cHBvcnRlZENvb2tpZUF0dHJpYnV0ZXMgPSBbJ3NvdXJjZVBvcnQnXTtcbiAgICAgICAgY29uc3QgZmlsdGVyVW5zdXBwb3J0ZWRBdHRyaWJ1dGVzID0gKGNvb2tpZSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIHVuc3VwcG9ydGVkQ29va2llQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb29raWVbYXR0cl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29va2llO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxDb29raWVzLm1hcChmaWx0ZXJVbnN1cHBvcnRlZEF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgICBhc3luYyBkZWxldGVDb29raWUoLi4uY29va2llcykge1xuICAgICAgICBjb25zdCBwYWdlVVJMID0gdGhpcy51cmwoKTtcbiAgICAgICAgZm9yIChjb25zdCBjb29raWUgb2YgY29va2llcykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGNvb2tpZSk7XG4gICAgICAgICAgICBpZiAoIWNvb2tpZS51cmwgJiYgcGFnZVVSTC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICAgICAgICBpdGVtLnVybCA9IHBhZ2VVUkw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ05ldHdvcmsuZGVsZXRlQ29va2llcycsIGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNldENvb2tpZSguLi5jb29raWVzKSB7XG4gICAgICAgIGNvbnN0IHBhZ2VVUkwgPSB0aGlzLnVybCgpO1xuICAgICAgICBjb25zdCBzdGFydHNXaXRoSFRUUCA9IHBhZ2VVUkwuc3RhcnRzV2l0aCgnaHR0cCcpO1xuICAgICAgICBjb25zdCBpdGVtcyA9IGNvb2tpZXMubWFwKGNvb2tpZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgY29va2llKTtcbiAgICAgICAgICAgIGlmICghaXRlbS51cmwgJiYgc3RhcnRzV2l0aEhUVFApIHtcbiAgICAgICAgICAgICAgICBpdGVtLnVybCA9IHBhZ2VVUkw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQoaXRlbS51cmwgIT09ICdhYm91dDpibGFuaycsIGBCbGFuayBwYWdlIGNhbiBub3QgaGF2ZSBjb29raWUgXCIke2l0ZW0ubmFtZX1cImApO1xuICAgICAgICAgICAgYXNzZXJ0KCFTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGguY2FsbChpdGVtLnVybCB8fCAnJywgJ2RhdGE6JyksIGBEYXRhIFVSTCBwYWdlIGNhbiBub3QgaGF2ZSBjb29raWUgXCIke2l0ZW0ubmFtZX1cImApO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUNvb2tpZSguLi5pdGVtcyk7XG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnTmV0d29yay5zZXRDb29raWVzJywge1xuICAgICAgICAgICAgICAgIGNvb2tpZXM6IGl0ZW1zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZXhwb3NlRnVuY3Rpb24obmFtZSwgcHB0ckZ1bmN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLiNiaW5kaW5ncy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGFkZCBwYWdlIGJpbmRpbmcgd2l0aCBuYW1lICR7bmFtZX06IHdpbmRvd1snJHtuYW1lfSddIGFscmVhZHkgZXhpc3RzIWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHBhZ2VCaW5kaW5nSW5pdFN0cmluZygnZXhwb3NlZEZ1bicsIG5hbWUpO1xuICAgICAgICBsZXQgYmluZGluZztcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgcHB0ckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICAgICAgYmluZGluZyA9IG5ldyBCaW5kaW5nKG5hbWUsIHBwdHJGdW5jdGlvbiwgc291cmNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYmluZGluZyA9IG5ldyBCaW5kaW5nKG5hbWUsIHBwdHJGdW5jdGlvbi5kZWZhdWx0LCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2JpbmRpbmdzLnNldChuYW1lLCBiaW5kaW5nKTtcbiAgICAgICAgY29uc3QgW3sgaWRlbnRpZmllciB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5ldmFsdWF0ZU9uTmV3RG9jdW1lbnQoc291cmNlKSxcbiAgICAgICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nKGJpbmRpbmcpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy4jZXhwb3NlZEZ1bmN0aW9ucy5zZXQobmFtZSwgaWRlbnRpZmllcik7XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZUV4cG9zZWRGdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGV4cG9zZWRGdW5jdGlvbklkID0gdGhpcy4jZXhwb3NlZEZ1bmN0aW9ucy5nZXQobmFtZSk7XG4gICAgICAgIGlmICghZXhwb3NlZEZ1bmN0aW9uSWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb24gd2l0aCBuYW1lIFwiJHtuYW1lfVwiIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gI2JpbmRpbmdzIG11c3QgYmUgdXBkYXRlZCB0b2dldGhlciB3aXRoICNleHBvc2VkRnVuY3Rpb25zLlxuICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy4jYmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgICAgICB0aGlzLiNleHBvc2VkRnVuY3Rpb25zLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgdGhpcy4jYmluZGluZ3MuZGVsZXRlKG5hbWUpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIucmVtb3ZlU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQoZXhwb3NlZEZ1bmN0aW9uSWQpLFxuICAgICAgICAgICAgdGhpcy4jZnJhbWVNYW5hZ2VyLnJlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZyksXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBhc3luYyBhdXRoZW50aWNhdGUoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5hdXRoZW50aWNhdGUoY3JlZGVudGlhbHMpO1xuICAgIH1cbiAgICBhc3luYyBzZXRFeHRyYUhUVFBIZWFkZXJzKGhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5zZXRFeHRyYUhUVFBIZWFkZXJzKGhlYWRlcnMpO1xuICAgIH1cbiAgICBhc3luYyBzZXRVc2VyQWdlbnQodXNlckFnZW50LCB1c2VyQWdlbnRNZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLnNldFVzZXJBZ2VudCh1c2VyQWdlbnQsIHVzZXJBZ2VudE1ldGFkYXRhKTtcbiAgICB9XG4gICAgYXN5bmMgbWV0cmljcygpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ1BlcmZvcm1hbmNlLmdldE1ldHJpY3MnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2J1aWxkTWV0cmljc09iamVjdChyZXNwb25zZS5tZXRyaWNzKTtcbiAgICB9XG4gICAgI2VtaXRNZXRyaWNzKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZW1pdChcIm1ldHJpY3NcIiAvKiBQYWdlRXZlbnQuTWV0cmljcyAqLywge1xuICAgICAgICAgICAgdGl0bGU6IGV2ZW50LnRpdGxlLFxuICAgICAgICAgICAgbWV0cmljczogdGhpcy4jYnVpbGRNZXRyaWNzT2JqZWN0KGV2ZW50Lm1ldHJpY3MpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgI2J1aWxkTWV0cmljc09iamVjdChtZXRyaWNzKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IG1ldHJpYyBvZiBtZXRyaWNzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoc3VwcG9ydGVkTWV0cmljcy5oYXMobWV0cmljLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W21ldHJpYy5uYW1lXSA9IG1ldHJpYy52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAjaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgICB0aGlzLmVtaXQoXCJwYWdlZXJyb3JcIiAvKiBQYWdlRXZlbnQuUGFnZUVycm9yICovLCBjcmVhdGVDbGllbnRFcnJvcihleGNlcHRpb24uZXhjZXB0aW9uRGV0YWlscykpO1xuICAgIH1cbiAgICAjb25Db25zb2xlQVBJKHdvcmxkLCBldmVudCkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBldmVudC5hcmdzLm1hcChhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdvcmxkLmNyZWF0ZUNkcEhhbmRsZShhcmcpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jYWRkQ29uc29sZU1lc3NhZ2UoY29udmVydENvbnNvbGVNZXNzYWdlTGV2ZWwoZXZlbnQudHlwZSksIHZhbHVlcywgZXZlbnQuc3RhY2tUcmFjZSk7XG4gICAgfVxuICAgIGFzeW5jICNvbkJpbmRpbmdDYWxsZWQod29ybGQsIGV2ZW50KSB7XG4gICAgICAgIGxldCBwYXlsb2FkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoZXZlbnQucGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgLy8gVGhlIGJpbmRpbmcgd2FzIGVpdGhlciBjYWxsZWQgYnkgc29tZXRoaW5nIGluIHRoZSBwYWdlIG9yIGl0IHdhc1xuICAgICAgICAgICAgLy8gY2FsbGVkIGJlZm9yZSBvdXIgd3JhcHBlciB3YXMgaW5pdGlhbGl6ZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlLCBuYW1lLCBzZXEsIGFyZ3MsIGlzVHJpdmlhbCB9ID0gcGF5bG9hZDtcbiAgICAgICAgaWYgKHR5cGUgIT09ICdleHBvc2VkRnVuJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB3b3JsZC5jb250ZXh0O1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy4jYmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgICAgICBhd2FpdCBiaW5kaW5nPy5ydW4oY29udGV4dCwgc2VxLCBhcmdzLCBpc1RyaXZpYWwpO1xuICAgIH1cbiAgICAjYWRkQ29uc29sZU1lc3NhZ2UoZXZlbnRUeXBlLCBhcmdzLCBzdGFja1RyYWNlKSB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lckNvdW50KFwiY29uc29sZVwiIC8qIFBhZ2VFdmVudC5Db25zb2xlICovKSkge1xuICAgICAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0VG9rZW5zID0gW107XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuIC0tIFRoZSBjb21tZW50IGlzIGxvbmcuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBydWxlc2Rpci91c2UtdXNpbmcgLS0gVGhlc2UgYXJlIG5vdCBvd25lZCBieSB0aGlzIGZ1bmN0aW9uLlxuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdGVPYmplY3QgPSBhcmcucmVtb3RlT2JqZWN0KCk7XG4gICAgICAgICAgICBpZiAocmVtb3RlT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICAgICAgdGV4dFRva2Vucy5wdXNoKGFyZy50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRleHRUb2tlbnMucHVzaCh2YWx1ZUZyb21SZW1vdGVPYmplY3QocmVtb3RlT2JqZWN0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhY2tUcmFjZUxvY2F0aW9ucyA9IFtdO1xuICAgICAgICBpZiAoc3RhY2tUcmFjZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYWxsRnJhbWUgb2Ygc3RhY2tUcmFjZS5jYWxsRnJhbWVzKSB7XG4gICAgICAgICAgICAgICAgc3RhY2tUcmFjZUxvY2F0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBjYWxsRnJhbWUudXJsLFxuICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBjYWxsRnJhbWUubGluZU51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyOiBjYWxsRnJhbWUuY29sdW1uTnVtYmVyLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgQ29uc29sZU1lc3NhZ2UoY29udmVydENvbnNvbGVNZXNzYWdlTGV2ZWwoZXZlbnRUeXBlKSwgdGV4dFRva2Vucy5qb2luKCcgJyksIGFyZ3MsIHN0YWNrVHJhY2VMb2NhdGlvbnMpO1xuICAgICAgICB0aGlzLmVtaXQoXCJjb25zb2xlXCIgLyogUGFnZUV2ZW50LkNvbnNvbGUgKi8sIG1lc3NhZ2UpO1xuICAgIH1cbiAgICAjb25EaWFsb2coZXZlbnQpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbGlkYXRlRGlhbG9nVHlwZShldmVudC50eXBlKTtcbiAgICAgICAgY29uc3QgZGlhbG9nID0gbmV3IENkcERpYWxvZyh0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LCB0eXBlLCBldmVudC5tZXNzYWdlLCBldmVudC5kZWZhdWx0UHJvbXB0KTtcbiAgICAgICAgdGhpcy5lbWl0KFwiZGlhbG9nXCIgLyogUGFnZUV2ZW50LkRpYWxvZyAqLywgZGlhbG9nKTtcbiAgICB9XG4gICAgYXN5bmMgcmVsb2FkKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLndhaXRGb3JOYXZpZ2F0aW9uKHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgIGlnbm9yZVNhbWVEb2N1bWVudE5hdmlnYXRpb246IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnUGFnZS5yZWxvYWQnKSxcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIGNyZWF0ZUNEUFNlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRhcmdldCgpLmNyZWF0ZUNEUFNlc3Npb24oKTtcbiAgICB9XG4gICAgYXN5bmMgZ29CYWNrKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZ28oLTEsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBhc3luYyBnb0ZvcndhcmQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNnbygrMSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGFzeW5jICNnbyhkZWx0YSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBoaXN0b3J5ID0gYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5Jyk7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gaGlzdG9yeS5lbnRyaWVzW2hpc3RvcnkuY3VycmVudEluZGV4ICsgZGVsdGFdO1xuICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLndhaXRGb3JOYXZpZ2F0aW9uKG9wdGlvbnMpLFxuICAgICAgICAgICAgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLm5hdmlnYXRlVG9IaXN0b3J5RW50cnknLCB7XG4gICAgICAgICAgICAgICAgZW50cnlJZDogZW50cnkuaWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiByZXN1bHRbMF07XG4gICAgfVxuICAgIGFzeW5jIGJyaW5nVG9Gcm9udCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmJyaW5nVG9Gcm9udCcpO1xuICAgIH1cbiAgICBhc3luYyBzZXRKYXZhU2NyaXB0RW5hYmxlZChlbmFibGVkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLnNldEphdmFTY3JpcHRFbmFibGVkKGVuYWJsZWQpO1xuICAgIH1cbiAgICBhc3luYyBzZXRCeXBhc3NDU1AoZW5hYmxlZCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ1BhZ2Uuc2V0QnlwYXNzQ1NQJywgeyBlbmFibGVkIH0pO1xuICAgIH1cbiAgICBhc3luYyBlbXVsYXRlTWVkaWFUeXBlKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuZW11bGF0ZU1lZGlhVHlwZSh0eXBlKTtcbiAgICB9XG4gICAgYXN5bmMgZW11bGF0ZUNQVVRocm90dGxpbmcoZmFjdG9yKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLmVtdWxhdGVDUFVUaHJvdHRsaW5nKGZhY3Rvcik7XG4gICAgfVxuICAgIGFzeW5jIGVtdWxhdGVNZWRpYUZlYXR1cmVzKGZlYXR1cmVzKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLmVtdWxhdGVNZWRpYUZlYXR1cmVzKGZlYXR1cmVzKTtcbiAgICB9XG4gICAgYXN5bmMgZW11bGF0ZVRpbWV6b25lKHRpbWV6b25lSWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuZW11bGF0ZVRpbWV6b25lKHRpbWV6b25lSWQpO1xuICAgIH1cbiAgICBhc3luYyBlbXVsYXRlSWRsZVN0YXRlKG92ZXJyaWRlcykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZW11bGF0aW9uTWFuYWdlci5lbXVsYXRlSWRsZVN0YXRlKG92ZXJyaWRlcyk7XG4gICAgfVxuICAgIGFzeW5jIGVtdWxhdGVWaXNpb25EZWZpY2llbmN5KHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuZW11bGF0ZVZpc2lvbkRlZmljaWVuY3kodHlwZSk7XG4gICAgfVxuICAgIGFzeW5jIHNldFZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgICAgIGNvbnN0IG5lZWRzUmVsb2FkID0gYXdhaXQgdGhpcy4jZW11bGF0aW9uTWFuYWdlci5lbXVsYXRlVmlld3BvcnQodmlld3BvcnQpO1xuICAgICAgICB0aGlzLiN2aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICAgICBpZiAobmVlZHNSZWxvYWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlld3BvcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2aWV3cG9ydDtcbiAgICB9XG4gICAgYXN5bmMgZXZhbHVhdGVPbk5ld0RvY3VtZW50KHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmFsdWF0aW9uU3RyaW5nKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNmcmFtZU1hbmFnZXIuZXZhbHVhdGVPbk5ld0RvY3VtZW50KHNvdXJjZSk7XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZVNjcmlwdFRvRXZhbHVhdGVPbk5ld0RvY3VtZW50KGlkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5yZW1vdmVTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudChpZGVudGlmaWVyKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0Q2FjaGVFbmFibGVkKGVuYWJsZWQgPSB0cnVlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5zZXRDYWNoZUVuYWJsZWQoZW5hYmxlZCk7XG4gICAgfVxuICAgIGFzeW5jIF9zY3JlZW5zaG90KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZW52XzIgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IGZyb21TdXJmYWNlLCBvbWl0QmFja2dyb3VuZCwgb3B0aW1pemVGb3JTcGVlZCwgcXVhbGl0eSwgY2xpcDogdXNlckNsaXAsIHR5cGUsIGNhcHR1cmVCZXlvbmRWaWV3cG9ydCwgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBpc0ZpcmVmb3ggPSB0aGlzLnRhcmdldCgpLl90YXJnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBGaXJlZm94VGFyZ2V0TWFuYWdlcjtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzIsIG5ldyBBc3luY0Rpc3Bvc2FibGVTdGFjaygpLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIEZpcmVmb3ggb21pdHMgYmFja2dyb3VuZCBieSBkZWZhdWx0OyBpdCdzIG5vdCBjb25maWd1cmFibGUuXG4gICAgICAgICAgICBpZiAoIWlzRmlyZWZveCAmJiBvbWl0QmFja2dyb3VuZCAmJiAodHlwZSA9PT0gJ3BuZycgfHwgdHlwZSA9PT0gJ3dlYnAnKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kQ29sb3IoKTtcbiAgICAgICAgICAgICAgICBzdGFjay5kZWZlcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3IoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNsaXAgPSB1c2VyQ2xpcDtcbiAgICAgICAgICAgIGlmIChjbGlwICYmICFjYXB0dXJlQmV5b25kVmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IGF3YWl0IHRoaXMubWFpbkZyYW1lKClcbiAgICAgICAgICAgICAgICAgICAgLmlzb2xhdGVkUmVhbG0oKVxuICAgICAgICAgICAgICAgICAgICAuZXZhbHVhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGhlaWdodCwgcGFnZUxlZnQ6IHgsIHBhZ2VUb3A6IHksIHdpZHRoLCB9ID0gd2luZG93LnZpc3VhbFZpZXdwb3J0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB4LCB5LCBoZWlnaHQsIHdpZHRoIH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2xpcCA9IGdldEludGVyc2VjdGlvblJlY3QoY2xpcCwgdmlld3BvcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGVzZSBzcHJlYWRzIGJlY2F1c2UgRmlyZWZveCBkb2Vzbid0IGFsbG93IHVua25vd24gb3B0aW9ucy5cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmNhcHR1cmVTY3JlZW5zaG90Jywge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogdHlwZSxcbiAgICAgICAgICAgICAgICAuLi4ob3B0aW1pemVGb3JTcGVlZCA/IHsgb3B0aW1pemVGb3JTcGVlZCB9IDoge30pLFxuICAgICAgICAgICAgICAgIC4uLihxdWFsaXR5ICE9PSB1bmRlZmluZWQgPyB7IHF1YWxpdHk6IE1hdGgucm91bmQocXVhbGl0eSkgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAuLi4oY2xpcCA/IHsgY2xpcDogeyAuLi5jbGlwLCBzY2FsZTogY2xpcC5zY2FsZSA/PyAxIH0gfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAuLi4oIWZyb21TdXJmYWNlID8geyBmcm9tU3VyZmFjZSB9IDoge30pLFxuICAgICAgICAgICAgICAgIGNhcHR1cmVCZXlvbmRWaWV3cG9ydCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzI7XG4gICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRfMSA9IF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMik7XG4gICAgICAgICAgICBpZiAocmVzdWx0XzEpXG4gICAgICAgICAgICAgICAgYXdhaXQgcmVzdWx0XzE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgY3JlYXRlUERGU3RyZWFtKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgeyBsYW5kc2NhcGUsIGRpc3BsYXlIZWFkZXJGb290ZXIsIGhlYWRlclRlbXBsYXRlLCBmb290ZXJUZW1wbGF0ZSwgcHJpbnRCYWNrZ3JvdW5kLCBzY2FsZSwgd2lkdGg6IHBhcGVyV2lkdGgsIGhlaWdodDogcGFwZXJIZWlnaHQsIG1hcmdpbiwgcGFnZVJhbmdlcywgcHJlZmVyQ1NTUGFnZVNpemUsIG9taXRCYWNrZ3JvdW5kLCB0YWdnZWQ6IGdlbmVyYXRlVGFnZ2VkUERGLCBvdXRsaW5lOiBnZW5lcmF0ZURvY3VtZW50T3V0bGluZSwgd2FpdEZvckZvbnRzLCB9ID0gcGFyc2VQREZPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAob21pdEJhY2tncm91bmQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kQ29sb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2FpdEZvckZvbnRzKSB7XG4gICAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShmcm9tKHRoaXMubWFpbkZyYW1lKClcbiAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZm9udHMucmVhZHk7XG4gICAgICAgICAgICB9KSkucGlwZShyYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmludENvbW1hbmRQcm9taXNlID0gdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLnByaW50VG9QREYnLCB7XG4gICAgICAgICAgICB0cmFuc2Zlck1vZGU6ICdSZXR1cm5Bc1N0cmVhbScsXG4gICAgICAgICAgICBsYW5kc2NhcGUsXG4gICAgICAgICAgICBkaXNwbGF5SGVhZGVyRm9vdGVyLFxuICAgICAgICAgICAgaGVhZGVyVGVtcGxhdGUsXG4gICAgICAgICAgICBmb290ZXJUZW1wbGF0ZSxcbiAgICAgICAgICAgIHByaW50QmFja2dyb3VuZCxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgcGFwZXJXaWR0aCxcbiAgICAgICAgICAgIHBhcGVySGVpZ2h0LFxuICAgICAgICAgICAgbWFyZ2luVG9wOiBtYXJnaW4udG9wLFxuICAgICAgICAgICAgbWFyZ2luQm90dG9tOiBtYXJnaW4uYm90dG9tLFxuICAgICAgICAgICAgbWFyZ2luTGVmdDogbWFyZ2luLmxlZnQsXG4gICAgICAgICAgICBtYXJnaW5SaWdodDogbWFyZ2luLnJpZ2h0LFxuICAgICAgICAgICAgcGFnZVJhbmdlcyxcbiAgICAgICAgICAgIHByZWZlckNTU1BhZ2VTaXplLFxuICAgICAgICAgICAgZ2VuZXJhdGVUYWdnZWRQREYsXG4gICAgICAgICAgICBnZW5lcmF0ZURvY3VtZW50T3V0bGluZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGZyb20ocHJpbnRDb21tYW5kUHJvbWlzZSkucGlwZShyYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICAgICAgaWYgKG9taXRCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLnJlc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvcigpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChyZXN1bHQuc3RyZWFtLCAnYHN0cmVhbWAgaXMgbWlzc2luZyBmcm9tIGBQYWdlLnByaW50VG9QREYnKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldFJlYWRhYmxlRnJvbVByb3RvY29sU3RyZWFtKHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQsIHJlc3VsdC5zdHJlYW0pO1xuICAgIH1cbiAgICBhc3luYyBwZGYob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgcGF0aCA9IHVuZGVmaW5lZCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgcmVhZGFibGUgPSBhd2FpdCB0aGlzLmNyZWF0ZVBERlN0cmVhbShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZ2V0UmVhZGFibGVBc0J1ZmZlcihyZWFkYWJsZSwgcGF0aCk7XG4gICAgICAgIGFzc2VydChidWZmZXIsICdDb3VsZCBub3QgY3JlYXRlIGJ1ZmZlcicpO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBjbG9zZShvcHRpb25zID0geyBydW5CZWZvcmVVbmxvYWQ6IHVuZGVmaW5lZCB9KSB7XG4gICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgX2d1YXJkID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzMsIGF3YWl0IHRoaXMuYnJvd3NlckNvbnRleHQoKS53YWl0Rm9yU2NyZWVuc2hvdE9wZXJhdGlvbnMoKSwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuY29ubmVjdGlvbigpO1xuICAgICAgICAgICAgYXNzZXJ0KGNvbm5lY3Rpb24sICdQcm90b2NvbCBlcnJvcjogQ29ubmVjdGlvbiBjbG9zZWQuIE1vc3QgbGlrZWx5IHRoZSBwYWdlIGhhcyBiZWVuIGNsb3NlZC4nKTtcbiAgICAgICAgICAgIGNvbnN0IHJ1bkJlZm9yZVVubG9hZCA9ICEhb3B0aW9ucy5ydW5CZWZvcmVVbmxvYWQ7XG4gICAgICAgICAgICBpZiAocnVuQmVmb3JlVW5sb2FkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmNsb3NlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5jbG9zZVRhcmdldCcsIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SWQ6IHRoaXMuI3ByaW1hcnlUYXJnZXQuX3RhcmdldElkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3RhYlRhcmdldC5faXNDbG9zZWREZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8zKSB7XG4gICAgICAgICAgICBlbnZfMy5lcnJvciA9IGVfMztcbiAgICAgICAgICAgIGVudl8zLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNDbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjbG9zZWQ7XG4gICAgfVxuICAgIGdldCBtb3VzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI21vdXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY291cGxlZCB3aXRoIGFuIGFjdGlvbiB0aGF0IHRyaWdnZXJzIGEgZGV2aWNlXG4gICAgICogcmVxdWVzdCBmcm9tIGFuIGFwaSBzdWNoIGFzIFdlYkJsdWV0b290aC5cbiAgICAgKlxuICAgICAqIDo6OmNhdXRpb25cbiAgICAgKlxuICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBkZXZpY2UgcmVxdWVzdCBpcyBtYWRlLiBJdCB3aWxsIG5vdCByZXR1cm4gYVxuICAgICAqIGN1cnJlbnRseSBhY3RpdmUgZGV2aWNlIHByb21wdC5cbiAgICAgKlxuICAgICAqIDo6OlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgW2RldmljZVByb21wdF0gPSBQcm9taXNlLmFsbChbXG4gICAgICogICBwYWdlLndhaXRGb3JEZXZpY2VQcm9tcHQoKSxcbiAgICAgKiAgIHBhZ2UuY2xpY2soJyNjb25uZWN0LWJsdWV0b290aCcpLFxuICAgICAqIF0pO1xuICAgICAqIGF3YWl0IGRldmljZVByb21wdC5zZWxlY3QoXG4gICAgICogICBhd2FpdCBkZXZpY2VQcm9tcHQud2FpdEZvckRldmljZSgoe25hbWV9KSA9PiBuYW1lLmluY2x1ZGVzKCdNeSBEZXZpY2UnKSlcbiAgICAgKiApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JEZXZpY2VQcm9tcHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLndhaXRGb3JEZXZpY2VQcm9tcHQob3B0aW9ucyk7XG4gICAgfVxufVxuY29uc3Qgc3VwcG9ydGVkTWV0cmljcyA9IG5ldyBTZXQoW1xuICAgICdUaW1lc3RhbXAnLFxuICAgICdEb2N1bWVudHMnLFxuICAgICdGcmFtZXMnLFxuICAgICdKU0V2ZW50TGlzdGVuZXJzJyxcbiAgICAnTm9kZXMnLFxuICAgICdMYXlvdXRDb3VudCcsXG4gICAgJ1JlY2FsY1N0eWxlQ291bnQnLFxuICAgICdMYXlvdXREdXJhdGlvbicsXG4gICAgJ1JlY2FsY1N0eWxlRHVyYXRpb24nLFxuICAgICdTY3JpcHREdXJhdGlvbicsXG4gICAgJ1Rhc2tEdXJhdGlvbicsXG4gICAgJ0pTSGVhcFVzZWRTaXplJyxcbiAgICAnSlNIZWFwVG90YWxTaXplJyxcbl0pO1xuLyoqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmRyaXZlci1iaWRpLyNyZWN0YW5nbGUtaW50ZXJzZWN0aW9uICovXG5mdW5jdGlvbiBnZXRJbnRlcnNlY3Rpb25SZWN0KGNsaXAsIHZpZXdwb3J0KSB7XG4gICAgLy8gTm90ZSB0aGVzZSB3aWxsIGFscmVhZHkgYmUgbm9ybWFsaXplZC5cbiAgICBjb25zdCB4ID0gTWF0aC5tYXgoY2xpcC54LCB2aWV3cG9ydC54KTtcbiAgICBjb25zdCB5ID0gTWF0aC5tYXgoY2xpcC55LCB2aWV3cG9ydC55KTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3aWR0aDogTWF0aC5tYXgoTWF0aC5taW4oY2xpcC54ICsgY2xpcC53aWR0aCwgdmlld3BvcnQueCArIHZpZXdwb3J0LndpZHRoKSAtIHgsIDApLFxuICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KE1hdGgubWluKGNsaXAueSArIGNsaXAuaGVpZ2h0LCB2aWV3cG9ydC55ICsgdmlld3BvcnQuaGVpZ2h0KSAtIHksIDApLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QYWdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEEgbGlzdCBvZiBwcmUtZGVmaW5lZCBuZXR3b3JrIGNvbmRpdGlvbnMgdG8gYmUgdXNlZCB3aXRoXG4gKiB7QGxpbmsgUGFnZS5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7UHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zfSBmcm9tICdwdXBwZXRlZXInO1xuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyhcbiAqICAgICBQcmVkZWZpbmVkTmV0d29ya0NvbmRpdGlvbnNbJ1Nsb3cgM0cnXVxuICogICApO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20nKTtcbiAqICAgYXdhaXQgcGFnZS5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMoXG4gKiAgICAgUHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zWydGYXN0IDNHJ11cbiAqICAgKTtcbiAqICAgYXdhaXQgcGFnZS5nb3RvKCdodHRwczovL3d3dy5nb29nbGUuY29tJyk7XG4gKiAgIGF3YWl0IHBhZ2UuZW11bGF0ZU5ldHdvcmtDb25kaXRpb25zKFxuICogICAgIFByZWRlZmluZWROZXR3b3JrQ29uZGl0aW9uc1snU2xvdyA0RyddXG4gKiAgICk7IC8vIGFsaWFzIHRvIEZhc3QgM0cuXG4gKiAgIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbScpO1xuICogICBhd2FpdCBwYWdlLmVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyhcbiAqICAgICBQcmVkZWZpbmVkTmV0d29ya0NvbmRpdGlvbnNbJ0Zhc3QgNEcnXVxuICogICApO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20nKTtcbiAqICAgLy8gb3RoZXIgYWN0aW9ucy4uLlxuICogICBhd2FpdCBicm93c2VyLmNsb3NlKCk7XG4gKiB9KSgpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgUHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgLy8gR2VuZXJhbGx5IGFsaWduZWQgd2l0aCBEZXZUb29sc1xuICAgIC8vIGh0dHBzOi8vc291cmNlLmNocm9taXVtLm9yZy9jaHJvbWl1bS9jaHJvbWl1bS9zcmMvKy9tYWluOnRoaXJkX3BhcnR5L2RldnRvb2xzLWZyb250ZW5kL3NyYy9mcm9udF9lbmQvY29yZS9zZGsvTmV0d29ya01hbmFnZXIudHM7bD0zOTg7ZHJjPTIyNWUxMjQwZjUyMmNhNjg0NDczZjU0MWFlNmRhZTZjZDc2NmRkMzMuXG4gICAgJ1Nsb3cgM0cnOiB7XG4gICAgICAgIC8vIH41MDBLYnBzIGRvd25cbiAgICAgICAgZG93bmxvYWQ6ICgoNTAwICogMTAwMCkgLyA4KSAqIDAuOCxcbiAgICAgICAgLy8gfjUwMEticHMgdXBcbiAgICAgICAgdXBsb2FkOiAoKDUwMCAqIDEwMDApIC8gOCkgKiAwLjgsXG4gICAgICAgIC8vIDQwMG1zIFJUVFxuICAgICAgICBsYXRlbmN5OiA0MDAgKiA1LFxuICAgIH0sXG4gICAgJ0Zhc3QgM0cnOiB7XG4gICAgICAgIC8vIH4xLjYgTWJwcyBkb3duXG4gICAgICAgIGRvd25sb2FkOiAoKDEuNiAqIDEwMDAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyB+MC43NSBNYnBzIHVwXG4gICAgICAgIHVwbG9hZDogKCg3NTAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyAxNTBtcyBSVFRcbiAgICAgICAgbGF0ZW5jeTogMTUwICogMy43NSxcbiAgICB9LFxuICAgIC8vIGFsaWFzIHRvIEZhc3QgM0cgdG8gYWxpZ24gd2l0aCBMaWdodGhvdXNlIChjcmJ1Zy5jb20vMzQyNDA2NjA4KVxuICAgIC8vIGFuZCBEZXZUb29scyAoY3JidWcuY29tLzM0MjQwNjYwOCksXG4gICAgJ1Nsb3cgNEcnOiB7XG4gICAgICAgIC8vIH4xLjYgTWJwcyBkb3duXG4gICAgICAgIGRvd25sb2FkOiAoKDEuNiAqIDEwMDAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyB+MC43NSBNYnBzIHVwXG4gICAgICAgIHVwbG9hZDogKCg3NTAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyAxNTBtcyBSVFRcbiAgICAgICAgbGF0ZW5jeTogMTUwICogMy43NSxcbiAgICB9LFxuICAgICdGYXN0IDRHJzoge1xuICAgICAgICAvLyA5IE1icHMgZG93blxuICAgICAgICBkb3dubG9hZDogKCg5ICogMTAwMCAqIDEwMDApIC8gOCkgKiAwLjksXG4gICAgICAgIC8vIDEuNSBNYnBzIHVwXG4gICAgICAgIHVwbG9hZDogKCgxLjUgKiAxMDAwICogMTAwMCkgLyA4KSAqIDAuOSxcbiAgICAgICAgLy8gNjBtcyBSVFRcbiAgICAgICAgbGF0ZW5jeTogNjAgKiAyLjc1LFxuICAgIH0sXG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByZWRlZmluZWROZXR3b3JrQ29uZGl0aW9ucy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVGFyZ2V0LCBUYXJnZXRUeXBlIH0gZnJvbSAnLi4vYXBpL1RhcmdldC5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IENkcENEUFNlc3Npb24gfSBmcm9tICcuL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgQ2RwUGFnZSB9IGZyb20gJy4vUGFnZS5qcyc7XG5pbXBvcnQgeyBDZHBXZWJXb3JrZXIgfSBmcm9tICcuL1dlYldvcmtlci5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdmFyIEluaXRpYWxpemF0aW9uU3RhdHVzO1xuKGZ1bmN0aW9uIChJbml0aWFsaXphdGlvblN0YXR1cykge1xuICAgIEluaXRpYWxpemF0aW9uU3RhdHVzW1wiU1VDQ0VTU1wiXSA9IFwic3VjY2Vzc1wiO1xuICAgIEluaXRpYWxpemF0aW9uU3RhdHVzW1wiQUJPUlRFRFwiXSA9IFwiYWJvcnRlZFwiO1xufSkoSW5pdGlhbGl6YXRpb25TdGF0dXMgfHwgKEluaXRpYWxpemF0aW9uU3RhdHVzID0ge30pKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBUYXJnZXQgZXh0ZW5kcyBUYXJnZXQge1xuICAgICNicm93c2VyQ29udGV4dDtcbiAgICAjc2Vzc2lvbjtcbiAgICAjdGFyZ2V0SW5mbztcbiAgICAjdGFyZ2V0TWFuYWdlcjtcbiAgICAjc2Vzc2lvbkZhY3Rvcnk7XG4gICAgI2NoaWxkVGFyZ2V0cyA9IG5ldyBTZXQoKTtcbiAgICBfaW5pdGlhbGl6ZWREZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgIF9pc0Nsb3NlZERlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgX3RhcmdldElkO1xuICAgIC8qKlxuICAgICAqIFRvIGluaXRpYWxpemUgdGhlIHRhcmdldCBmb3IgdXNlLCBjYWxsIGluaXRpYWxpemUuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0YXJnZXRJbmZvLCBzZXNzaW9uLCBicm93c2VyQ29udGV4dCwgdGFyZ2V0TWFuYWdlciwgc2Vzc2lvbkZhY3RvcnkpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIgPSB0YXJnZXRNYW5hZ2VyO1xuICAgICAgICB0aGlzLiN0YXJnZXRJbmZvID0gdGFyZ2V0SW5mbztcbiAgICAgICAgdGhpcy4jYnJvd3NlckNvbnRleHQgPSBicm93c2VyQ29udGV4dDtcbiAgICAgICAgdGhpcy5fdGFyZ2V0SWQgPSB0YXJnZXRJbmZvLnRhcmdldElkO1xuICAgICAgICB0aGlzLiNzZXNzaW9uRmFjdG9yeSA9IHNlc3Npb25GYWN0b3J5O1xuICAgICAgICBpZiAodGhpcy4jc2Vzc2lvbiAmJiB0aGlzLiNzZXNzaW9uIGluc3RhbmNlb2YgQ2RwQ0RQU2Vzc2lvbikge1xuICAgICAgICAgICAgdGhpcy4jc2Vzc2lvbi5fc2V0VGFyZ2V0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGFzUGFnZSgpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuX3Nlc3Npb24oKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVDRFBTZXNzaW9uKCkudGhlbihjbGllbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBDZHBQYWdlLl9jcmVhdGUoY2xpZW50LCB0aGlzLCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBDZHBQYWdlLl9jcmVhdGUoc2Vzc2lvbiwgdGhpcywgbnVsbCk7XG4gICAgfVxuICAgIF9zdWJ0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFyZ2V0SW5mby5zdWJ0eXBlO1xuICAgIH1cbiAgICBfc2Vzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Nlc3Npb247XG4gICAgfVxuICAgIF9hZGRDaGlsZFRhcmdldCh0YXJnZXQpIHtcbiAgICAgICAgdGhpcy4jY2hpbGRUYXJnZXRzLmFkZCh0YXJnZXQpO1xuICAgIH1cbiAgICBfcmVtb3ZlQ2hpbGRUYXJnZXQodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuI2NoaWxkVGFyZ2V0cy5kZWxldGUodGFyZ2V0KTtcbiAgICB9XG4gICAgX2NoaWxkVGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NoaWxkVGFyZ2V0cztcbiAgICB9XG4gICAgX3Nlc3Npb25GYWN0b3J5KCkge1xuICAgICAgICBpZiAoIXRoaXMuI3Nlc3Npb25GYWN0b3J5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nlc3Npb25GYWN0b3J5IGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNzZXNzaW9uRmFjdG9yeTtcbiAgICB9XG4gICAgY3JlYXRlQ0RQU2Vzc2lvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNzZXNzaW9uRmFjdG9yeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXNzaW9uRmFjdG9yeSBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jc2Vzc2lvbkZhY3RvcnkoZmFsc2UpLnRoZW4oc2Vzc2lvbiA9PiB7XG4gICAgICAgICAgICBzZXNzaW9uLl9zZXRUYXJnZXQodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhcmdldEluZm8udXJsO1xuICAgIH1cbiAgICB0eXBlKCkge1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy4jdGFyZ2V0SW5mby50eXBlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3BhZ2UnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXRUeXBlLlBBR0U7XG4gICAgICAgICAgICBjYXNlICdiYWNrZ3JvdW5kX3BhZ2UnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXRUeXBlLkJBQ0tHUk9VTkRfUEFHRTtcbiAgICAgICAgICAgIGNhc2UgJ3NlcnZpY2Vfd29ya2VyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0VHlwZS5TRVJWSUNFX1dPUktFUjtcbiAgICAgICAgICAgIGNhc2UgJ3NoYXJlZF93b3JrZXInOlxuICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXRUeXBlLlNIQVJFRF9XT1JLRVI7XG4gICAgICAgICAgICBjYXNlICdicm93c2VyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0VHlwZS5CUk9XU0VSO1xuICAgICAgICAgICAgY2FzZSAnd2Vidmlldyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRhcmdldFR5cGUuV0VCVklFVztcbiAgICAgICAgICAgIGNhc2UgJ3RhYic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRhcmdldFR5cGUuVEFCO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0VHlwZS5PVEhFUjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfdGFyZ2V0TWFuYWdlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiN0YXJnZXRNYW5hZ2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldE1hbmFnZXIgaXMgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhcmdldE1hbmFnZXI7XG4gICAgfVxuICAgIF9nZXRUYXJnZXRJbmZvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFyZ2V0SW5mbztcbiAgICB9XG4gICAgYnJvd3NlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNicm93c2VyQ29udGV4dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdicm93c2VyQ29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlckNvbnRleHQuYnJvd3NlcigpO1xuICAgIH1cbiAgICBicm93c2VyQ29udGV4dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNicm93c2VyQ29udGV4dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdicm93c2VyQ29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlckNvbnRleHQ7XG4gICAgfVxuICAgIG9wZW5lcigpIHtcbiAgICAgICAgY29uc3QgeyBvcGVuZXJJZCB9ID0gdGhpcy4jdGFyZ2V0SW5mbztcbiAgICAgICAgaWYgKCFvcGVuZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJyb3dzZXIoKVxuICAgICAgICAgICAgLnRhcmdldHMoKVxuICAgICAgICAgICAgLmZpbmQodGFyZ2V0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQuX3RhcmdldElkID09PSBvcGVuZXJJZDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF90YXJnZXRJbmZvQ2hhbmdlZCh0YXJnZXRJbmZvKSB7XG4gICAgICAgIHRoaXMuI3RhcmdldEluZm8gPSB0YXJnZXRJbmZvO1xuICAgICAgICB0aGlzLl9jaGVja0lmSW5pdGlhbGl6ZWQoKTtcbiAgICB9XG4gICAgX2luaXRpYWxpemUoKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkRGVmZXJyZWQucmVzb2x2ZShJbml0aWFsaXphdGlvblN0YXR1cy5TVUNDRVNTKTtcbiAgICB9XG4gICAgX2lzVGFyZ2V0RXhwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSgpICE9PSBUYXJnZXRUeXBlLlRBQiAmJiAhdGhpcy5fc3VidHlwZSgpO1xuICAgIH1cbiAgICBfY2hlY2tJZkluaXRpYWxpemVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkRGVmZXJyZWQucmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWREZWZlcnJlZC5yZXNvbHZlKEluaXRpYWxpemF0aW9uU3RhdHVzLlNVQ0NFU1MpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VUYXJnZXQgZXh0ZW5kcyBDZHBUYXJnZXQge1xuICAgICNkZWZhdWx0Vmlld3BvcnQ7XG4gICAgcGFnZVByb21pc2U7XG4gICAgY29uc3RydWN0b3IodGFyZ2V0SW5mbywgc2Vzc2lvbiwgYnJvd3NlckNvbnRleHQsIHRhcmdldE1hbmFnZXIsIHNlc3Npb25GYWN0b3J5LCBkZWZhdWx0Vmlld3BvcnQpIHtcbiAgICAgICAgc3VwZXIodGFyZ2V0SW5mbywgc2Vzc2lvbiwgYnJvd3NlckNvbnRleHQsIHRhcmdldE1hbmFnZXIsIHNlc3Npb25GYWN0b3J5KTtcbiAgICAgICAgdGhpcy4jZGVmYXVsdFZpZXdwb3J0ID0gZGVmYXVsdFZpZXdwb3J0ID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgX2luaXRpYWxpemUoKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkRGVmZXJyZWRcbiAgICAgICAgICAgIC52YWx1ZU9yVGhyb3coKVxuICAgICAgICAgICAgLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gSW5pdGlhbGl6YXRpb25TdGF0dXMuQUJPUlRFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9wZW5lciA9IHRoaXMub3BlbmVyKCk7XG4gICAgICAgICAgICBpZiAoIShvcGVuZXIgaW5zdGFuY2VvZiBQYWdlVGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3BlbmVyIHx8ICFvcGVuZXIucGFnZVByb21pc2UgfHwgdGhpcy50eXBlKCkgIT09ICdwYWdlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3BlbmVyUGFnZSA9IGF3YWl0IG9wZW5lci5wYWdlUHJvbWlzZTtcbiAgICAgICAgICAgIGlmICghb3BlbmVyUGFnZS5saXN0ZW5lckNvdW50KFwicG9wdXBcIiAvKiBQYWdlRXZlbnQuUG9wdXAgKi8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwb3B1cFBhZ2UgPSBhd2FpdCB0aGlzLnBhZ2UoKTtcbiAgICAgICAgICAgIG9wZW5lclBhZ2UuZW1pdChcInBvcHVwXCIgLyogUGFnZUV2ZW50LlBvcHVwICovLCBwb3B1cFBhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIHRoaXMuX2NoZWNrSWZJbml0aWFsaXplZCgpO1xuICAgIH1cbiAgICBhc3luYyBwYWdlKCkge1xuICAgICAgICBpZiAoIXRoaXMucGFnZVByb21pc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9zZXNzaW9uKCk7XG4gICAgICAgICAgICB0aGlzLnBhZ2VQcm9taXNlID0gKHNlc3Npb25cbiAgICAgICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZShzZXNzaW9uKVxuICAgICAgICAgICAgICAgIDogdGhpcy5fc2Vzc2lvbkZhY3RvcnkoKSgvKiBpc0F1dG9BdHRhY2hFbXVsYXRlZD0qLyBmYWxzZSkpLnRoZW4oY2xpZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2RwUGFnZS5fY3JlYXRlKGNsaWVudCwgdGhpcywgdGhpcy4jZGVmYXVsdFZpZXdwb3J0ID8/IG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnBhZ2VQcm9taXNlKSA/PyBudWxsO1xuICAgIH1cbiAgICBfY2hlY2tJZkluaXRpYWxpemVkKCkge1xuICAgICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWREZWZlcnJlZC5yZXNvbHZlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2dldFRhcmdldEluZm8oKS51cmwgIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplZERlZmVycmVkLnJlc29sdmUoSW5pdGlhbGl6YXRpb25TdGF0dXMuU1VDQ0VTUyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRGV2VG9vbHNUYXJnZXQgZXh0ZW5kcyBQYWdlVGFyZ2V0IHtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZXJUYXJnZXQgZXh0ZW5kcyBDZHBUYXJnZXQge1xuICAgICN3b3JrZXJQcm9taXNlO1xuICAgIGFzeW5jIHdvcmtlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiN3b3JrZXJQcm9taXNlKSB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fc2Vzc2lvbigpO1xuICAgICAgICAgICAgLy8gVE9ETyhlaW5iaW5kZXIpOiBNYWtlIHdvcmtlcnMgc2VuZCB0aGVpciBjb25zb2xlIGxvZ3MuXG4gICAgICAgICAgICB0aGlzLiN3b3JrZXJQcm9taXNlID0gKHNlc3Npb25cbiAgICAgICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZShzZXNzaW9uKVxuICAgICAgICAgICAgICAgIDogdGhpcy5fc2Vzc2lvbkZhY3RvcnkoKSgvKiBpc0F1dG9BdHRhY2hFbXVsYXRlZD0qLyBmYWxzZSkpLnRoZW4oY2xpZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENkcFdlYldvcmtlcihjbGllbnQsIHRoaXMuX2dldFRhcmdldEluZm8oKS51cmwsIHRoaXMuX3RhcmdldElkLCB0aGlzLnR5cGUoKSwgKCkgPT4geyB9IC8qIGNvbnNvbGVBUElDYWxsZWQgKi8sICgpID0+IHsgfSAvKiBleGNlcHRpb25UaHJvd24gKi8pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI3dvcmtlclByb21pc2U7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE90aGVyVGFyZ2V0IGV4dGVuZHMgQ2RwVGFyZ2V0IHtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhcmdldC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFyZ2V0TWFuYWdlci5qcy5tYXAiLCJpbXBvcnQgeyBnZXRSZWFkYWJsZUFzQnVmZmVyLCBnZXRSZWFkYWJsZUZyb21Qcm90b2NvbFN0cmVhbSwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4uL3V0aWwvRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG4vKipcbiAqIFRoZSBUcmFjaW5nIGNsYXNzIGV4cG9zZXMgdGhlIHRyYWNpbmcgYXVkaXQgaW50ZXJmYWNlLlxuICogQHJlbWFya3NcbiAqIFlvdSBjYW4gdXNlIGB0cmFjaW5nLnN0YXJ0YCBhbmQgYHRyYWNpbmcuc3RvcGAgdG8gY3JlYXRlIGEgdHJhY2UgZmlsZVxuICogd2hpY2ggY2FuIGJlIG9wZW5lZCBpbiBDaHJvbWUgRGV2VG9vbHMgb3Ige0BsaW5rIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL3RpbWVsaW5lLXZpZXdlci8gfCB0aW1lbGluZSB2aWV3ZXJ9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IHBhZ2UudHJhY2luZy5zdGFydCh7cGF0aDogJ3RyYWNlLmpzb24nfSk7XG4gKiBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20nKTtcbiAqIGF3YWl0IHBhZ2UudHJhY2luZy5zdG9wKCk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFjaW5nIHtcbiAgICAjY2xpZW50O1xuICAgICNyZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAjcGF0aDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB1cGRhdGVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIGEgdHJhY2UgZm9yIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBPbmx5IG9uZSB0cmFjZSBjYW4gYmUgYWN0aXZlIGF0IGEgdGltZSBwZXIgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYFRyYWNpbmdPcHRpb25zYC5cbiAgICAgKi9cbiAgICBhc3luYyBzdGFydChvcHRpb25zID0ge30pIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNyZWNvcmRpbmcsICdDYW5ub3Qgc3RhcnQgcmVjb3JkaW5nIHRyYWNlIHdoaWxlIGFscmVhZHkgcmVjb3JkaW5nIHRyYWNlLicpO1xuICAgICAgICBjb25zdCBkZWZhdWx0Q2F0ZWdvcmllcyA9IFtcbiAgICAgICAgICAgICctKicsXG4gICAgICAgICAgICAnZGV2dG9vbHMudGltZWxpbmUnLFxuICAgICAgICAgICAgJ3Y4LmV4ZWN1dGUnLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUnLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUuZnJhbWUnLFxuICAgICAgICAgICAgJ3RvcGxldmVsJyxcbiAgICAgICAgICAgICdibGluay5jb25zb2xlJyxcbiAgICAgICAgICAgICdibGluay51c2VyX3RpbWluZycsXG4gICAgICAgICAgICAnbGF0ZW5jeUluZm8nLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUuc3RhY2snLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtdjguY3B1X3Byb2ZpbGVyJyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgeyBwYXRoLCBzY3JlZW5zaG90cyA9IGZhbHNlLCBjYXRlZ29yaWVzID0gZGVmYXVsdENhdGVnb3JpZXMgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChzY3JlZW5zaG90cykge1xuICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKCdkaXNhYmxlZC1ieS1kZWZhdWx0LWRldnRvb2xzLnNjcmVlbnNob3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGNsdWRlZENhdGVnb3JpZXMgPSBjYXRlZ29yaWVzXG4gICAgICAgICAgICAuZmlsdGVyKGNhdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2F0LnN0YXJ0c1dpdGgoJy0nKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5tYXAoY2F0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYXQuc2xpY2UoMSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbmNsdWRlZENhdGVnb3JpZXMgPSBjYXRlZ29yaWVzLmZpbHRlcihjYXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFjYXQuc3RhcnRzV2l0aCgnLScpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jcGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuI3JlY29yZGluZyA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdUcmFjaW5nLnN0YXJ0Jywge1xuICAgICAgICAgICAgdHJhbnNmZXJNb2RlOiAnUmV0dXJuQXNTdHJlYW0nLFxuICAgICAgICAgICAgdHJhY2VDb25maWc6IHtcbiAgICAgICAgICAgICAgICBleGNsdWRlZENhdGVnb3JpZXMsXG4gICAgICAgICAgICAgICAgaW5jbHVkZWRDYXRlZ29yaWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3BzIGEgdHJhY2Ugc3RhcnRlZCB3aXRoIHRoZSBgc3RhcnRgIG1ldGhvZC5cbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGJ1ZmZlciB3aXRoIHRyYWNlIGRhdGEuXG4gICAgICovXG4gICAgYXN5bmMgc3RvcCgpIHtcbiAgICAgICAgY29uc3QgY29udGVudERlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbmNlKCdUcmFjaW5nLnRyYWNpbmdDb21wbGV0ZScsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZXZlbnQuc3RyZWFtLCAnTWlzc2luZyBcInN0cmVhbVwiJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZGFibGUgPSBhd2FpdCBnZXRSZWFkYWJsZUZyb21Qcm90b2NvbFN0cmVhbSh0aGlzLiNjbGllbnQsIGV2ZW50LnN0cmVhbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZ2V0UmVhZGFibGVBc0J1ZmZlcihyZWFkYWJsZSwgdGhpcy4jcGF0aCk7XG4gICAgICAgICAgICAgICAgY29udGVudERlZmVycmVkLnJlc29sdmUoYnVmZmVyID8/IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnREZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudERlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoYFVua25vd24gZXJyb3I6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdUcmFjaW5nLmVuZCcpO1xuICAgICAgICB0aGlzLiNyZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRlbnREZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFjaW5nLmpzLm1hcCIsImltcG9ydCB7IENEUFNlc3Npb25FdmVudCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IFRhcmdldFR5cGUgfSBmcm9tICcuLi9hcGkvVGFyZ2V0LmpzJztcbmltcG9ydCB7IFdlYldvcmtlciB9IGZyb20gJy4uL2FwaS9XZWJXb3JrZXIuanMnO1xuaW1wb3J0IHsgVGltZW91dFNldHRpbmdzIH0gZnJvbSAnLi4vY29tbW9uL1RpbWVvdXRTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vRXhlY3V0aW9uQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBJc29sYXRlZFdvcmxkIH0gZnJvbSAnLi9Jc29sYXRlZFdvcmxkLmpzJztcbmltcG9ydCB7IENkcEpTSGFuZGxlIH0gZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwV2ViV29ya2VyIGV4dGVuZHMgV2ViV29ya2VyIHtcbiAgICAjd29ybGQ7XG4gICAgI2NsaWVudDtcbiAgICAjaWQ7XG4gICAgI3RhcmdldFR5cGU7XG4gICAgY29uc3RydWN0b3IoY2xpZW50LCB1cmwsIHRhcmdldElkLCB0YXJnZXRUeXBlLCBjb25zb2xlQVBJQ2FsbGVkLCBleGNlcHRpb25UaHJvd24pIHtcbiAgICAgICAgc3VwZXIodXJsKTtcbiAgICAgICAgdGhpcy4jaWQgPSB0YXJnZXRJZDtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB0aGlzLiN0YXJnZXRUeXBlID0gdGFyZ2V0VHlwZTtcbiAgICAgICAgdGhpcy4jd29ybGQgPSBuZXcgSXNvbGF0ZWRXb3JsZCh0aGlzLCBuZXcgVGltZW91dFNldHRpbmdzKCkpO1xuICAgICAgICB0aGlzLiNjbGllbnQub25jZSgnUnVudGltZS5leGVjdXRpb25Db250ZXh0Q3JlYXRlZCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jd29ybGQuc2V0Q29udGV4dChuZXcgRXhlY3V0aW9uQ29udGV4dChjbGllbnQsIGV2ZW50LmNvbnRleHQsIHRoaXMuI3dvcmxkKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN3b3JsZC5lbWl0dGVyLm9uKCdjb25zb2xlYXBpY2FsbGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zb2xlQVBJQ2FsbGVkKGV2ZW50LnR5cGUsIGV2ZW50LmFyZ3MubWFwKChvYmplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDZHBKU0hhbmRsZSh0aGlzLiN3b3JsZCwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9KSwgZXZlbnQuc3RhY2tUcmFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZGVidWdFcnJvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jY2xpZW50Lm9uKCdSdW50aW1lLmV4Y2VwdGlvblRocm93bicsIGV4Y2VwdGlvblRocm93bik7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbmNlKENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3dvcmxkLmRpc3Bvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFRoaXMgbWlnaHQgZmFpbCBpZiB0aGUgdGFyZ2V0IGlzIGNsb3NlZCBiZWZvcmUgd2UgcmVjZWl2ZSBhbGwgZXhlY3V0aW9uIGNvbnRleHRzLlxuICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnUnVudGltZS5lbmFibGUnKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICB9XG4gICAgbWFpblJlYWxtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jd29ybGQ7XG4gICAgfVxuICAgIGdldCBjbGllbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQ7XG4gICAgfVxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuI3RhcmdldFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVGFyZ2V0VHlwZS5TRVJWSUNFX1dPUktFUjpcbiAgICAgICAgICAgIGNhc2UgVGFyZ2V0VHlwZS5TSEFSRURfV09SS0VSOiB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHNlcnZpY2UgYW5kIHNoYXJlZCB3b3JrZXJzIHdlIG5lZWQgdG8gY2xvc2UgdGhlIHRhcmdldCBhbmQgZGV0YWNoIHRvIGFsbG93XG4gICAgICAgICAgICAgICAgLy8gdGhlIHdvcmtlciB0byBzdG9wLlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LmNvbm5lY3Rpb24oKT8uc2VuZCgnVGFyZ2V0LmNsb3NlVGFyZ2V0Jywge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRJZDogdGhpcy4jaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuY29ubmVjdGlvbigpPy5zZW5kKCdUYXJnZXQuZGV0YWNoRnJvbVRhcmdldCcsIHtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLmNsaWVudC5pZCgpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViV29ya2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL0FjY2Vzc2liaWxpdHkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9BcmlhUXVlcnlIYW5kbGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQmluZGluZy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0Jyb3dzZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Ccm93c2VyQ29ubmVjdG9yLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ0RQU2Vzc2lvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0Nocm9tZVRhcmdldE1hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25uZWN0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ292ZXJhZ2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXZpY2VSZXF1ZXN0UHJvbXB0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRGlhbG9nLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRWxlbWVudEhhbmRsZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0VtdWxhdGlvbk1hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeGVjdXRpb25Db250ZXh0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZW5zaW9uVHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRmlyZWZveFRhcmdldE1hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9GcmFtZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZyYW1lTWFuYWdlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZyYW1lTWFuYWdlckV2ZW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZyYW1lVHJlZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0hUVFBSZXF1ZXN0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSFRUUFJlc3BvbnNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSW5wdXQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Jc29sYXRlZFdvcmxkLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSXNvbGF0ZWRXb3JsZHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0xpZmVjeWNsZVdhdGNoZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9OZXR3b3JrRXZlbnRNYW5hZ2VyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vTmV0d29ya01hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QYWdlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGFyZ2V0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGFyZ2V0TWFuYWdlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1RyYWNpbmcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1dlYldvcmtlci5qcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jZHAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IFB1cHBldGVlclVSTCwgZXZhbHVhdGlvblN0cmluZyB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmFsdWF0aW9uRXJyb3IoZGV0YWlscykge1xuICAgIGxldCBuYW1lO1xuICAgIGxldCBtZXNzYWdlO1xuICAgIGlmICghZGV0YWlscy5leGNlcHRpb24pIHtcbiAgICAgICAgbmFtZSA9ICdFcnJvcic7XG4gICAgICAgIG1lc3NhZ2UgPSBkZXRhaWxzLnRleHQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKChkZXRhaWxzLmV4Y2VwdGlvbi50eXBlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICBkZXRhaWxzLmV4Y2VwdGlvbi5zdWJ0eXBlICE9PSAnZXJyb3InKSAmJlxuICAgICAgICAhZGV0YWlscy5leGNlcHRpb24ub2JqZWN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlRnJvbVJlbW90ZU9iamVjdChkZXRhaWxzLmV4Y2VwdGlvbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBkZXRhaWwgPSBnZXRFcnJvckRldGFpbHMoZGV0YWlscyk7XG4gICAgICAgIG5hbWUgPSBkZXRhaWwubmFtZTtcbiAgICAgICAgbWVzc2FnZSA9IGRldGFpbC5tZXNzYWdlO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlSGVpZ2h0ID0gbWVzc2FnZS5zcGxpdCgnXFxuJykubGVuZ3RoO1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIGVycm9yLm5hbWUgPSBuYW1lO1xuICAgIGNvbnN0IHN0YWNrTGluZXMgPSBlcnJvci5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgY29uc3QgbWVzc2FnZUxpbmVzID0gc3RhY2tMaW5lcy5zcGxpY2UoMCwgbWVzc2FnZUhlaWdodCk7XG4gICAgLy8gVGhlIGZpcnN0IGxpbmUgaXMgdGhpcyBmdW5jdGlvbiB3aGljaCB3ZSBpZ25vcmUuXG4gICAgc3RhY2tMaW5lcy5zaGlmdCgpO1xuICAgIGlmIChkZXRhaWxzLnN0YWNrVHJhY2UgJiYgc3RhY2tMaW5lcy5sZW5ndGggPCBFcnJvci5zdGFja1RyYWNlTGltaXQpIHtcbiAgICAgICAgZm9yIChjb25zdCBmcmFtZSBvZiBkZXRhaWxzLnN0YWNrVHJhY2UuY2FsbEZyYW1lcy5yZXZlcnNlKCkpIHtcbiAgICAgICAgICAgIGlmIChQdXBwZXRlZXJVUkwuaXNQdXBwZXRlZXJVUkwoZnJhbWUudXJsKSAmJlxuICAgICAgICAgICAgICAgIGZyYW1lLnVybCAhPT0gUHVwcGV0ZWVyVVJMLklOVEVSTkFMX1VSTCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IFB1cHBldGVlclVSTC5wYXJzZShmcmFtZS51cmwpO1xuICAgICAgICAgICAgICAgIHN0YWNrTGluZXMudW5zaGlmdChgICAgIGF0ICR7ZnJhbWUuZnVuY3Rpb25OYW1lIHx8IHVybC5mdW5jdGlvbk5hbWV9ICgke3VybC5mdW5jdGlvbk5hbWV9IGF0ICR7dXJsLnNpdGVTdHJpbmd9LCA8YW5vbnltb3VzPjoke2ZyYW1lLmxpbmVOdW1iZXJ9OiR7ZnJhbWUuY29sdW1uTnVtYmVyfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YWNrTGluZXMucHVzaChgICAgIGF0ICR7ZnJhbWUuZnVuY3Rpb25OYW1lIHx8ICc8YW5vbnltb3VzPid9ICgke2ZyYW1lLnVybH06JHtmcmFtZS5saW5lTnVtYmVyfToke2ZyYW1lLmNvbHVtbk51bWJlcn0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhY2tMaW5lcy5sZW5ndGggPj0gRXJyb3Iuc3RhY2tUcmFjZUxpbWl0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXJyb3Iuc3RhY2sgPSBbLi4ubWVzc2FnZUxpbmVzLCAuLi5zdGFja0xpbmVzXS5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gZXJyb3I7XG59XG5jb25zdCBnZXRFcnJvckRldGFpbHMgPSAoZGV0YWlscykgPT4ge1xuICAgIGxldCBuYW1lID0gJyc7XG4gICAgbGV0IG1lc3NhZ2U7XG4gICAgY29uc3QgbGluZXMgPSBkZXRhaWxzLmV4Y2VwdGlvbj8uZGVzY3JpcHRpb24/LnNwbGl0KCdcXG4gICAgYXQgJykgPz8gW107XG4gICAgY29uc3Qgc2l6ZSA9IE1hdGgubWluKGRldGFpbHMuc3RhY2tUcmFjZT8uY2FsbEZyYW1lcy5sZW5ndGggPz8gMCwgbGluZXMubGVuZ3RoIC0gMSk7XG4gICAgbGluZXMuc3BsaWNlKC1zaXplLCBzaXplKTtcbiAgICBpZiAoZGV0YWlscy5leGNlcHRpb24/LmNsYXNzTmFtZSkge1xuICAgICAgICBuYW1lID0gZGV0YWlscy5leGNlcHRpb24uY2xhc3NOYW1lO1xuICAgIH1cbiAgICBtZXNzYWdlID0gbGluZXMuam9pbignXFxuJyk7XG4gICAgaWYgKG5hbWUgJiYgbWVzc2FnZS5zdGFydHNXaXRoKGAke25hbWV9OiBgKSkge1xuICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5zbGljZShuYW1lLmxlbmd0aCArIDIpO1xuICAgIH1cbiAgICByZXR1cm4geyBtZXNzYWdlLCBuYW1lIH07XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNsaWVudEVycm9yKGRldGFpbHMpIHtcbiAgICBsZXQgbmFtZTtcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBpZiAoIWRldGFpbHMuZXhjZXB0aW9uKSB7XG4gICAgICAgIG5hbWUgPSAnRXJyb3InO1xuICAgICAgICBtZXNzYWdlID0gZGV0YWlscy50ZXh0O1xuICAgIH1cbiAgICBlbHNlIGlmICgoZGV0YWlscy5leGNlcHRpb24udHlwZSAhPT0gJ29iamVjdCcgfHxcbiAgICAgICAgZGV0YWlscy5leGNlcHRpb24uc3VidHlwZSAhPT0gJ2Vycm9yJykgJiZcbiAgICAgICAgIWRldGFpbHMuZXhjZXB0aW9uLm9iamVjdElkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZUZyb21SZW1vdGVPYmplY3QoZGV0YWlscy5leGNlcHRpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZGV0YWlsID0gZ2V0RXJyb3JEZXRhaWxzKGRldGFpbHMpO1xuICAgICAgICBuYW1lID0gZGV0YWlsLm5hbWU7XG4gICAgICAgIG1lc3NhZ2UgPSBkZXRhaWwubWVzc2FnZTtcbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgZXJyb3IubmFtZSA9IG5hbWU7XG4gICAgY29uc3QgbWVzc2FnZUhlaWdodCA9IGVycm9yLm1lc3NhZ2Uuc3BsaXQoJ1xcbicpLmxlbmd0aDtcbiAgICBjb25zdCBtZXNzYWdlTGluZXMgPSBlcnJvci5zdGFjay5zcGxpdCgnXFxuJykuc3BsaWNlKDAsIG1lc3NhZ2VIZWlnaHQpO1xuICAgIGNvbnN0IHN0YWNrTGluZXMgPSBbXTtcbiAgICBpZiAoZGV0YWlscy5zdGFja1RyYWNlKSB7XG4gICAgICAgIGZvciAoY29uc3QgZnJhbWUgb2YgZGV0YWlscy5zdGFja1RyYWNlLmNhbGxGcmFtZXMpIHtcbiAgICAgICAgICAgIC8vIE5vdGUgd2UgbmVlZCB0byBhZGQgYDFgIGJlY2F1c2UgdGhlIHZhbHVlcyBhcmUgMC1pbmRleGVkLlxuICAgICAgICAgICAgc3RhY2tMaW5lcy5wdXNoKGAgICAgYXQgJHtmcmFtZS5mdW5jdGlvbk5hbWUgfHwgJzxhbm9ueW1vdXM+J30gKCR7ZnJhbWUudXJsfToke2ZyYW1lLmxpbmVOdW1iZXIgKyAxfToke2ZyYW1lLmNvbHVtbk51bWJlciArIDF9KWApO1xuICAgICAgICAgICAgaWYgKHN0YWNrTGluZXMubGVuZ3RoID49IEVycm9yLnN0YWNrVHJhY2VMaW1pdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVycm9yLnN0YWNrID0gWy4uLm1lc3NhZ2VMaW5lcywgLi4uc3RhY2tMaW5lc10uam9pbignXFxuJyk7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlRnJvbVJlbW90ZU9iamVjdChyZW1vdGVPYmplY3QpIHtcbiAgICBhc3NlcnQoIXJlbW90ZU9iamVjdC5vYmplY3RJZCwgJ0Nhbm5vdCBleHRyYWN0IHZhbHVlIHdoZW4gb2JqZWN0SWQgaXMgZ2l2ZW4nKTtcbiAgICBpZiAocmVtb3RlT2JqZWN0LnVuc2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgaWYgKHJlbW90ZU9iamVjdC50eXBlID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChyZW1vdGVPYmplY3QudW5zZXJpYWxpemFibGVWYWx1ZS5yZXBsYWNlKCduJywgJycpKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHJlbW90ZU9iamVjdC51bnNlcmlhbGl6YWJsZVZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlICctMCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0wO1xuICAgICAgICAgICAgY2FzZSAnTmFOJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgICAgY2FzZSAnSW5maW5pdHknOlxuICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgIGNhc2UgJy1JbmZpbml0eSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB1bnNlcmlhbGl6YWJsZSB2YWx1ZTogJyArXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZU9iamVjdC51bnNlcmlhbGl6YWJsZVZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVtb3RlT2JqZWN0LnZhbHVlO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFBhZ2VCaW5kaW5nKHR5cGUsIG5hbWUsIHByZWZpeCkge1xuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgZnJhbWUgbG9hZGluZyBzdGF0ZSBlaXRoZXIgUnVudGltZS5ldmFsdWF0ZSBvclxuICAgIC8vIFBhZ2UuYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQgbWlnaHQgc3VjY2VlZC4gTGV0J3MgY2hlY2sgdGhhdCB3ZVxuICAgIC8vIGRvbid0IHJlLXdyYXAgUHVwcGV0ZWVyJ3MgYmluZGluZy5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBJbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgIGlmIChnbG9iYWxUaGlzW25hbWVdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gV2UgcmVwbGFjZSB0aGUgQ0RQIGJpbmRpbmcgd2l0aCBhIFB1cHBldGVlciBiaW5kaW5nLlxuICAgIE9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywge1xuICAgICAgICBbbmFtZV0oLi4uYXJncykge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgUHVwcGV0ZWVyIGJpbmRpbmcuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBJbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgICAgICAgICAgY29uc3QgY2FsbFB1cHBldGVlciA9IGdsb2JhbFRoaXNbbmFtZV07XG4gICAgICAgICAgICBjYWxsUHVwcGV0ZWVyLmFyZ3MgPz89IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNhbGxQdXBwZXRlZXIuY2FsbGJhY2tzID8/PSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBzZXEgPSAoY2FsbFB1cHBldGVlci5sYXN0U2VxID8/IDApICsgMTtcbiAgICAgICAgICAgIGNhbGxQdXBwZXRlZXIubGFzdFNlcSA9IHNlcTtcbiAgICAgICAgICAgIGNhbGxQdXBwZXRlZXIuYXJncy5zZXQoc2VxLCBhcmdzKTtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IEluIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gICAgICAgICAgICAvLyBOZWVkcyB0byBiZSB0aGUgc2FtZSBhcyBDRFBfQklORElOR19QUkVGSVguXG4gICAgICAgICAgICBnbG9iYWxUaGlzW3ByZWZpeCArIG5hbWVdKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgaXNUcml2aWFsOiAhYXJncy5zb21lKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgTm9kZTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbFB1cHBldGVlci5jYWxsYmFja3Muc2V0KHNlcSwge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUHVwcGV0ZWVyLmFyZ3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUHVwcGV0ZWVyLmFyZ3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ0RQX0JJTkRJTkdfUFJFRklYID0gJ3B1cHBldGVlcl8nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZ2VCaW5kaW5nSW5pdFN0cmluZyh0eXBlLCBuYW1lKSB7XG4gICAgcmV0dXJuIGV2YWx1YXRpb25TdHJpbmcoYWRkUGFnZUJpbmRpbmcsIHR5cGUsIG5hbWUsIENEUF9CSU5ESU5HX1BSRUZJWCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgX2Nvbm5lY3RUb0JpRGlCcm93c2VyIH0gZnJvbSAnLi4vYmlkaS9Ccm93c2VyQ29ubmVjdG9yLmpzJztcbmltcG9ydCB7IF9jb25uZWN0VG9DZHBCcm93c2VyIH0gZnJvbSAnLi4vY2RwL0Jyb3dzZXJDb25uZWN0b3IuanMnO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi4vZW52aXJvbm1lbnQuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG5jb25zdCBnZXRXZWJTb2NrZXRUcmFuc3BvcnRDbGFzcyA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gaXNOb2RlXG4gICAgICAgID8gKGF3YWl0IGltcG9ydCgnLi4vbm9kZS9Ob2RlV2ViU29ja2V0VHJhbnNwb3J0LmpzJykpLk5vZGVXZWJTb2NrZXRUcmFuc3BvcnRcbiAgICAgICAgOiAoYXdhaXQgaW1wb3J0KCcuLi9jb21tb24vQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydC5qcycpKVxuICAgICAgICAgICAgLkJyb3dzZXJXZWJTb2NrZXRUcmFuc3BvcnQ7XG59O1xuLyoqXG4gKiBVc2VycyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIGRpcmVjdGx5OyBpdCdzIGNhbGxlZCB3aGVuIGNhbGxpbmdcbiAqIGBwdXBwZXRlZXIuY29ubmVjdGAuIFRoaXMgbWV0aG9kIGF0dGFjaGVzIFB1cHBldGVlciB0byBhbiBleGlzdGluZyBicm93c2VyIGluc3RhbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2Nvbm5lY3RUb0Jyb3dzZXIob3B0aW9ucykge1xuICAgIGNvbnN0IHsgY29ubmVjdGlvblRyYW5zcG9ydCwgZW5kcG9pbnRVcmwgfSA9IGF3YWl0IGdldENvbm5lY3Rpb25UcmFuc3BvcnQob3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMucHJvdG9jb2wgPT09ICd3ZWJEcml2ZXJCaURpJykge1xuICAgICAgICBjb25zdCBiaWRpQnJvd3NlciA9IGF3YWl0IF9jb25uZWN0VG9CaURpQnJvd3Nlcihjb25uZWN0aW9uVHJhbnNwb3J0LCBlbmRwb2ludFVybCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBiaWRpQnJvd3NlcjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGNkcEJyb3dzZXIgPSBhd2FpdCBfY29ubmVjdFRvQ2RwQnJvd3Nlcihjb25uZWN0aW9uVHJhbnNwb3J0LCBlbmRwb2ludFVybCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBjZHBCcm93c2VyO1xuICAgIH1cbn1cbi8qKlxuICogRXN0YWJsaXNoZXMgYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiBieSBnaXZlbiBvcHRpb25zIGFuZCByZXR1cm5zIGJvdGggdHJhbnNwb3J0IGFuZFxuICogZW5kcG9pbnQgdXJsIHRoZSB0cmFuc3BvcnQgaXMgY29ubmVjdGVkIHRvLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDb25uZWN0aW9uVHJhbnNwb3J0KG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGJyb3dzZXJXU0VuZHBvaW50LCBicm93c2VyVVJMLCB0cmFuc3BvcnQsIGhlYWRlcnMgPSB7fSB9ID0gb3B0aW9ucztcbiAgICBhc3NlcnQoTnVtYmVyKCEhYnJvd3NlcldTRW5kcG9pbnQpICsgTnVtYmVyKCEhYnJvd3NlclVSTCkgKyBOdW1iZXIoISF0cmFuc3BvcnQpID09PVxuICAgICAgICAxLCAnRXhhY3RseSBvbmUgb2YgYnJvd3NlcldTRW5kcG9pbnQsIGJyb3dzZXJVUkwgb3IgdHJhbnNwb3J0IG11c3QgYmUgcGFzc2VkIHRvIHB1cHBldGVlci5jb25uZWN0Jyk7XG4gICAgaWYgKHRyYW5zcG9ydCkge1xuICAgICAgICByZXR1cm4geyBjb25uZWN0aW9uVHJhbnNwb3J0OiB0cmFuc3BvcnQsIGVuZHBvaW50VXJsOiAnJyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChicm93c2VyV1NFbmRwb2ludCkge1xuICAgICAgICBjb25zdCBXZWJTb2NrZXRDbGFzcyA9IGF3YWl0IGdldFdlYlNvY2tldFRyYW5zcG9ydENsYXNzKCk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25UcmFuc3BvcnQgPSBhd2FpdCBXZWJTb2NrZXRDbGFzcy5jcmVhdGUoYnJvd3NlcldTRW5kcG9pbnQsIGhlYWRlcnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29ubmVjdGlvblRyYW5zcG9ydDogY29ubmVjdGlvblRyYW5zcG9ydCxcbiAgICAgICAgICAgIGVuZHBvaW50VXJsOiBicm93c2VyV1NFbmRwb2ludCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnJvd3NlclVSTCkge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uVVJMID0gYXdhaXQgZ2V0V1NFbmRwb2ludChicm93c2VyVVJMKTtcbiAgICAgICAgY29uc3QgV2ViU29ja2V0Q2xhc3MgPSBhd2FpdCBnZXRXZWJTb2NrZXRUcmFuc3BvcnRDbGFzcygpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uVHJhbnNwb3J0ID0gYXdhaXQgV2ViU29ja2V0Q2xhc3MuY3JlYXRlKGNvbm5lY3Rpb25VUkwpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29ubmVjdGlvblRyYW5zcG9ydDogY29ubmVjdGlvblRyYW5zcG9ydCxcbiAgICAgICAgICAgIGVuZHBvaW50VXJsOiBjb25uZWN0aW9uVVJMLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29ubmVjdGlvbiBvcHRpb25zJyk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRXU0VuZHBvaW50KGJyb3dzZXJVUkwpIHtcbiAgICBjb25zdCBlbmRwb2ludFVSTCA9IG5ldyBVUkwoJy9qc29uL3ZlcnNpb24nLCBicm93c2VyVVJMKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnbG9iYWxUaGlzLmZldGNoKGVuZHBvaW50VVJMLnRvU3RyaW5nKCksIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzdWx0LnN0YXR1c1RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3VsdC5qc29uKCk7XG4gICAgICAgIHJldHVybiBkYXRhLndlYlNvY2tldERlYnVnZ2VyVXJsO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGlzRXJyb3JMaWtlKGVycm9yKSkge1xuICAgICAgICAgICAgZXJyb3IubWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCBicm93c2VyIHdlYlNvY2tldCBVUkwgZnJvbSAke2VuZHBvaW50VVJMfTogYCArXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckNvbm5lY3Rvci5qcy5tYXAiLCIvKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydCB7XG4gICAgc3RhdGljIGNyZWF0ZSh1cmwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh1cmwpO1xuICAgICAgICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShuZXcgQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydCh3cykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAjd3M7XG4gICAgb25tZXNzYWdlO1xuICAgIG9uY2xvc2U7XG4gICAgY29uc3RydWN0b3Iod3MpIHtcbiAgICAgICAgdGhpcy4jd3MgPSB3cztcbiAgICAgICAgdGhpcy4jd3MuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9ubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25tZXNzYWdlLmNhbGwobnVsbCwgZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN3cy5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uY2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2xvc2UuY2FsbChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSBhbGwgZXJyb3JzIC0gd2UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggdGhlbS5cbiAgICAgICAgdGhpcy4jd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7IH0pO1xuICAgIH1cbiAgICBzZW5kKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy4jd3Muc2VuZChtZXNzYWdlKTtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuI3dzLmNsb3NlKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9RdWVyeUhhbmRsZXIuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENTU1F1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3IgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgY3NzUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjc3NRdWVyeVNlbGVjdG9yKGVsZW1lbnQsIHNlbGVjdG9yKTtcbiAgICB9O1xuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yQWxsID0gKGVsZW1lbnQsIHNlbGVjdG9yLCB7IGNzc1F1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY3NzUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNTU1F1ZXJ5SGFuZGxlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IHJld3JpdGVFcnJvciB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IFByb3RvY29sRXJyb3IsIFRhcmdldENsb3NlRXJyb3IgfSBmcm9tICcuL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi91dGlsLmpzJztcbi8qKlxuICogTWFuYWdlcyBjYWxsYmFja3MgYW5kIHRoZWlyIElEcyBmb3IgdGhlIHByb3RvY29sIHJlcXVlc3QvcmVzcG9uc2UgY29tbXVuaWNhdGlvbi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxiYWNrUmVnaXN0cnkge1xuICAgICNjYWxsYmFja3MgPSBuZXcgTWFwKCk7XG4gICAgI2lkR2VuZXJhdG9yID0gY3JlYXRlSW5jcmVtZW50YWxJZEdlbmVyYXRvcigpO1xuICAgIGNyZWF0ZShsYWJlbCwgdGltZW91dCwgcmVxdWVzdCkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IG5ldyBDYWxsYmFjayh0aGlzLiNpZEdlbmVyYXRvcigpLCBsYWJlbCwgdGltZW91dCk7XG4gICAgICAgIHRoaXMuI2NhbGxiYWNrcy5zZXQoY2FsbGJhY2suaWQsIGNhbGxiYWNrKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QoY2FsbGJhY2suaWQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gV2Ugc3RpbGwgdGhyb3cgc3luYyBlcnJvcnMgc3luY2hyb25vdXNseSBhbmQgY2xlYW4gdXAgdGhlIHNjaGVkdWxlZFxuICAgICAgICAgICAgLy8gY2FsbGJhY2suXG4gICAgICAgICAgICBjYWxsYmFjay5wcm9taXNlLmNhdGNoKGRlYnVnRXJyb3IpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2suaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYWxsYmFjay5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTXVzdCBvbmx5IGhhdmUgc3luYyBjb2RlIHVwIHVudGlsIGhlcmUuXG4gICAgICAgIHJldHVybiBjYWxsYmFjay5wcm9taXNlLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jY2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjay5pZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWplY3QoaWQsIG1lc3NhZ2UsIG9yaWdpbmFsTWVzc2FnZSkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuI2NhbGxiYWNrcy5nZXQoaWQpO1xuICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVqZWN0KGNhbGxiYWNrLCBtZXNzYWdlLCBvcmlnaW5hbE1lc3NhZ2UpO1xuICAgIH1cbiAgICBfcmVqZWN0KGNhbGxiYWNrLCBlcnJvck1lc3NhZ2UsIG9yaWdpbmFsTWVzc2FnZSkge1xuICAgICAgICBsZXQgZXJyb3I7XG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlIGluc3RhbmNlb2YgUHJvdG9jb2xFcnJvcikge1xuICAgICAgICAgICAgZXJyb3IgPSBlcnJvck1lc3NhZ2U7XG4gICAgICAgICAgICBlcnJvci5jYXVzZSA9IGNhbGxiYWNrLmVycm9yO1xuICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IgPSBjYWxsYmFjay5lcnJvcjtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2sucmVqZWN0KHJld3JpdGVFcnJvcihlcnJvciwgYFByb3RvY29sIGVycm9yICgke2NhbGxiYWNrLmxhYmVsfSk6ICR7bWVzc2FnZX1gLCBvcmlnaW5hbE1lc3NhZ2UpKTtcbiAgICB9XG4gICAgcmVzb2x2ZShpZCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLiNjYWxsYmFja3MuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrLnJlc29sdmUodmFsdWUpO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLiNjYWxsYmFja3MudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHByb2JhYmx5IHdlIGNhbiBhY2NlcHQgZXJyb3IgbWVzc2FnZXMgYXMgcGFyYW1zLlxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0KGNhbGxiYWNrLCBuZXcgVGFyZ2V0Q2xvc2VFcnJvcignVGFyZ2V0IGNsb3NlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNjYWxsYmFja3MuY2xlYXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLiNjYWxsYmFja3MudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBFcnJvcihgJHtjYWxsYmFjay5sYWJlbH0gdGltZWQgb3V0LiBUcmFjZTogJHtjYWxsYmFjay5lcnJvci5zdGFja31gKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2FsbGJhY2sge1xuICAgICNpZDtcbiAgICAjZXJyb3IgPSBuZXcgUHJvdG9jb2xFcnJvcigpO1xuICAgICNkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICN0aW1lcjtcbiAgICAjbGFiZWw7XG4gICAgY29uc3RydWN0b3IoaWQsIGxhYmVsLCB0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuI2lkID0gaWQ7XG4gICAgICAgIHRoaXMuI2xhYmVsID0gbGFiZWw7XG4gICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgICB0aGlzLiN0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2RlZmVycmVkLnJlamVjdChyZXdyaXRlRXJyb3IodGhpcy4jZXJyb3IsIGAke2xhYmVsfSB0aW1lZCBvdXQuIEluY3JlYXNlIHRoZSAncHJvdG9jb2xUaW1lb3V0JyBzZXR0aW5nIGluIGxhdW5jaC9jb25uZWN0IGNhbGxzIGZvciBhIGhpZ2hlciB0aW1lb3V0IGlmIG5lZWRlZC5gKSk7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0aW1lcik7XG4gICAgICAgIHRoaXMuI2RlZmVycmVkLnJlc29sdmUodmFsdWUpO1xuICAgIH1cbiAgICByZWplY3QoZXJyb3IpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3RpbWVyKTtcbiAgICAgICAgdGhpcy4jZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaWQ7XG4gICAgfVxuICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGVmZXJyZWQudmFsdWVPclRocm93KCk7XG4gICAgfVxuICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Vycm9yO1xuICAgIH1cbiAgICBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYWJlbDtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5jcmVtZW50YWxJZEdlbmVyYXRvcigpIHtcbiAgICBsZXQgaWQgPSAwO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHJldHVybiArK2lkO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYWxsYmFja1JlZ2lzdHJ5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25maWd1cmF0aW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25uZWN0T3B0aW9ucy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvblRyYW5zcG9ydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBDb25zb2xlTWVzc2FnZSBvYmplY3RzIGFyZSBkaXNwYXRjaGVkIGJ5IHBhZ2UgdmlhIHRoZSAnY29uc29sZScgZXZlbnQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25zb2xlTWVzc2FnZSB7XG4gICAgI3R5cGU7XG4gICAgI3RleHQ7XG4gICAgI2FyZ3M7XG4gICAgI3N0YWNrVHJhY2VMb2NhdGlvbnM7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZSwgdGV4dCwgYXJncywgc3RhY2tUcmFjZUxvY2F0aW9ucykge1xuICAgICAgICB0aGlzLiN0eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy4jdGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuI2FyZ3MgPSBhcmdzO1xuICAgICAgICB0aGlzLiNzdGFja1RyYWNlTG9jYXRpb25zID0gc3RhY2tUcmFjZUxvY2F0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGNvbnNvbGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHRleHQgb2YgdGhlIGNvbnNvbGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICB0ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgY29uc29sZS5cbiAgICAgKi9cbiAgICBhcmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYXJncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBjb25zb2xlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgbG9jYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGFja1RyYWNlTG9jYXRpb25zWzBdID8/IHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYXJyYXkgb2YgbG9jYXRpb25zIG9uIHRoZSBzdGFjayBvZiB0aGUgY29uc29sZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIHN0YWNrVHJhY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGFja1RyYWNlTG9jYXRpb25zO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnNvbGVNZXNzYWdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db29raWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IGludGVycG9sYXRlRnVuY3Rpb24sIHN0cmluZ2lmeUZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbC9GdW5jdGlvbi5qcyc7XG5pbXBvcnQgeyBRdWVyeUhhbmRsZXIsIH0gZnJvbSAnLi9RdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgc2NyaXB0SW5qZWN0b3IgfSBmcm9tICcuL1NjcmlwdEluamVjdG9yLmpzJztcbi8qKlxuICogVGhlIHJlZ2lzdHJ5IG9mIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBjdXN0b20gcXVlcnkgaGFuZGxlcnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIFB1cHBldGVlci5jdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKCdsaXQnLCB7IOKApiB9KTtcbiAqIGNvbnN0IGFIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJ2xpdC/igKYnKTtcbiAqIGBgYFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ3VzdG9tUXVlcnlIYW5kbGVyUmVnaXN0cnkge1xuICAgICNoYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBnZXQobmFtZSkge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy4jaGFuZGxlcnMuZ2V0KG5hbWUpO1xuICAgICAgICByZXR1cm4gaGFuZGxlciA/IGhhbmRsZXJbMV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBjdXN0b20gcXVlcnkgaGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFmdGVyIHJlZ2lzdHJhdGlvbiwgdGhlIGhhbmRsZXIgY2FuIGJlIHVzZWQgZXZlcnl3aGVyZSB3aGVyZSBhIHNlbGVjdG9yIGlzXG4gICAgICogZXhwZWN0ZWQgYnkgcHJlcGVuZGluZyB0aGUgc2VsZWN0aW9uIHN0cmluZyB3aXRoIGA8bmFtZT4vYC4gVGhlIG5hbWUgaXNcbiAgICAgKiBvbmx5IGFsbG93ZWQgdG8gY29uc2lzdCBvZiBsb3dlci0gYW5kIHVwcGVyIGNhc2UgbGF0aW4gbGV0dGVycy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIFB1cHBldGVlci5jdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKCdsaXQnLCB7IOKApiB9KTtcbiAgICAgKiBjb25zdCBhSGFuZGxlID0gYXdhaXQgcGFnZS4kKCdsaXQv4oCmJyk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgdG8gcmVnaXN0ZXIgdW5kZXIuXG4gICAgICogQHBhcmFtIHF1ZXJ5SGFuZGxlciAtIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBDdXN0b20gcXVlcnkgaGFuZGxlcn0gdG9cbiAgICAgKiByZWdpc3Rlci5cbiAgICAgKi9cbiAgICByZWdpc3RlcihuYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlcnMuaGFzKG5hbWUpLCBgQ2Fubm90IHJlZ2lzdGVyIG92ZXIgZXhpc3RpbmcgaGFuZGxlcjogJHtuYW1lfWApO1xuICAgICAgICBhc3NlcnQoL15bYS16QS1aXSskLy50ZXN0KG5hbWUpLCBgQ3VzdG9tIHF1ZXJ5IGhhbmRsZXIgbmFtZXMgbWF5IG9ubHkgY29udGFpbiBbYS16QS1aXWApO1xuICAgICAgICBhc3NlcnQoaGFuZGxlci5xdWVyeUFsbCB8fCBoYW5kbGVyLnF1ZXJ5T25lLCBgQXQgbGVhc3Qgb25lIHF1ZXJ5IG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkLmApO1xuICAgICAgICBjb25zdCBIYW5kbGVyID0gY2xhc3MgZXh0ZW5kcyBRdWVyeUhhbmRsZXIge1xuICAgICAgICAgICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JBbGwgPSBpbnRlcnBvbGF0ZUZ1bmN0aW9uKChub2RlLCBzZWxlY3RvciwgUHVwcGV0ZWVyVXRpbCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQdXBwZXRlZXJVdGlsLmN1c3RvbVF1ZXJ5U2VsZWN0b3JzXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoUExBQ0VIT0xERVIoJ25hbWUnKSlcbiAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwobm9kZSwgc2VsZWN0b3IpO1xuICAgICAgICAgICAgfSwgeyBuYW1lOiBKU09OLnN0cmluZ2lmeShuYW1lKSB9KTtcbiAgICAgICAgICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yID0gaW50ZXJwb2xhdGVGdW5jdGlvbigobm9kZSwgc2VsZWN0b3IsIFB1cHBldGVlclV0aWwpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHVwcGV0ZWVyVXRpbC5jdXN0b21RdWVyeVNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICAuZ2V0KFBMQUNFSE9MREVSKCduYW1lJykpXG4gICAgICAgICAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKG5vZGUsIHNlbGVjdG9yKTtcbiAgICAgICAgICAgIH0sIHsgbmFtZTogSlNPTi5zdHJpbmdpZnkobmFtZSkgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyU2NyaXB0ID0gaW50ZXJwb2xhdGVGdW5jdGlvbigoUHVwcGV0ZWVyVXRpbCkgPT4ge1xuICAgICAgICAgICAgUHVwcGV0ZWVyVXRpbC5jdXN0b21RdWVyeVNlbGVjdG9ycy5yZWdpc3RlcihQTEFDRUhPTERFUignbmFtZScpLCB7XG4gICAgICAgICAgICAgICAgcXVlcnlBbGw6IFBMQUNFSE9MREVSKCdxdWVyeUFsbCcpLFxuICAgICAgICAgICAgICAgIHF1ZXJ5T25lOiBQTEFDRUhPTERFUigncXVlcnlPbmUnKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBuYW1lOiBKU09OLnN0cmluZ2lmeShuYW1lKSxcbiAgICAgICAgICAgIHF1ZXJ5QWxsOiBoYW5kbGVyLnF1ZXJ5QWxsXG4gICAgICAgICAgICAgICAgPyBzdHJpbmdpZnlGdW5jdGlvbihoYW5kbGVyLnF1ZXJ5QWxsKVxuICAgICAgICAgICAgICAgIDogU3RyaW5nKHVuZGVmaW5lZCksXG4gICAgICAgICAgICBxdWVyeU9uZTogaGFuZGxlci5xdWVyeU9uZVxuICAgICAgICAgICAgICAgID8gc3RyaW5naWZ5RnVuY3Rpb24oaGFuZGxlci5xdWVyeU9uZSlcbiAgICAgICAgICAgICAgICA6IFN0cmluZyh1bmRlZmluZWQpLFxuICAgICAgICB9KS50b1N0cmluZygpO1xuICAgICAgICB0aGlzLiNoYW5kbGVycy5zZXQobmFtZSwgW3JlZ2lzdGVyU2NyaXB0LCBIYW5kbGVyXSk7XG4gICAgICAgIHNjcmlwdEluamVjdG9yLmFwcGVuZChyZWdpc3RlclNjcmlwdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIHRoZSB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJ9IGZvciB0aGVcbiAgICAgKiBnaXZlbiBuYW1lLlxuICAgICAqXG4gICAgICogQHRocm93cyBgRXJyb3JgIGlmIHRoZXJlIGlzIG5vIGhhbmRsZXIgdW5kZXIgdGhlIGdpdmVuIG5hbWUuXG4gICAgICovXG4gICAgdW5yZWdpc3RlcihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLiNoYW5kbGVycy5nZXQobmFtZSk7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdW5yZWdpc3RlciB1bmtub3duIGhhbmRsZXI6ICR7bmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBzY3JpcHRJbmplY3Rvci5wb3AoaGFuZGxlclswXSk7XG4gICAgICAgIHRoaXMuI2hhbmRsZXJzLmRlbGV0ZShuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBjdXN0b20gcXVlcnkgaGFuZGxlcnN9LlxuICAgICAqL1xuICAgIG5hbWVzKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuI2hhbmRsZXJzLmtleXMoKV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIGFsbCBjdXN0b20gcXVlcnkgaGFuZGxlcnMuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3JlZ2lzdGVyU2NyaXB0XSBvZiB0aGlzLiNoYW5kbGVycykge1xuICAgICAgICAgICAgc2NyaXB0SW5qZWN0b3IucG9wKHJlZ2lzdGVyU2NyaXB0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNoYW5kbGVycy5jbGVhcigpO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21RdWVyeUhhbmRsZXJzID0gbmV3IEN1c3RvbVF1ZXJ5SGFuZGxlclJlZ2lzdHJ5KCk7XG4vKipcbiAqIEBkZXByZWNhdGVkIEltcG9ydCB7QGxpbmsgUHVwcGV0ZWVyfSBhbmQgdXNlIHRoZSBzdGF0aWMgbWV0aG9kXG4gKiB7QGxpbmsgUHVwcGV0ZWVyLnJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyfVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBjdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKG5hbWUsIGhhbmRsZXIpO1xufVxuLyoqXG4gKiBAZGVwcmVjYXRlZCBJbXBvcnQge0BsaW5rIFB1cHBldGVlcn0gYW5kIHVzZSB0aGUgc3RhdGljIG1ldGhvZFxuICoge0BsaW5rIFB1cHBldGVlci51bnJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyfVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJDdXN0b21RdWVyeUhhbmRsZXIobmFtZSkge1xuICAgIGN1c3RvbVF1ZXJ5SGFuZGxlcnMudW5yZWdpc3RlcihuYW1lKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgSW1wb3J0IHtAbGluayBQdXBwZXRlZXJ9IGFuZCB1c2UgdGhlIHN0YXRpYyBtZXRob2RcbiAqIHtAbGluayBQdXBwZXRlZXIuY3VzdG9tUXVlcnlIYW5kbGVyTmFtZXN9XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tUXVlcnlIYW5kbGVyTmFtZXMoKSB7XG4gICAgcmV0dXJuIGN1c3RvbVF1ZXJ5SGFuZGxlcnMubmFtZXMoKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgSW1wb3J0IHtAbGluayBQdXBwZXRlZXJ9IGFuZCB1c2UgdGhlIHN0YXRpYyBtZXRob2RcbiAqIHtAbGluayBQdXBwZXRlZXIuY2xlYXJDdXN0b21RdWVyeUhhbmRsZXJzfVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQ3VzdG9tUXVlcnlIYW5kbGVycygpIHtcbiAgICBjdXN0b21RdWVyeUhhbmRsZXJzLmNsZWFyKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdXN0b21RdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gJy4uL2Vudmlyb25tZW50LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBkZWJ1Z01vZHVsZSA9IG51bGw7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RGVidWcoKSB7XG4gICAgaWYgKCFkZWJ1Z01vZHVsZSkge1xuICAgICAgICBkZWJ1Z01vZHVsZSA9IChhd2FpdCBpbXBvcnQoJ2RlYnVnJykpLmRlZmF1bHQ7XG4gICAgfVxuICAgIHJldHVybiBkZWJ1Z01vZHVsZTtcbn1cbi8qKlxuICogQSBkZWJ1ZyBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGFueSBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgdXNlZCBpbiBOb2RlLCBpdCBmYWxscyBiYWNrIHRvIHRoZVxuICoge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2RlYnVnIHwgZGVidWcgbW9kdWxlfS4gSW4gdGhlIGJyb3dzZXIgaXRcbiAqIHVzZXMgYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBJbiBOb2RlLCB1c2UgdGhlIGBERUJVR2AgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gY29udHJvbCBsb2dnaW5nOlxuICpcbiAqIGBgYFxuICogREVCVUc9KiAvLyBsb2dzIGFsbCBjaGFubmVsc1xuICogREVCVUc9Zm9vIC8vIGxvZ3MgdGhlIGBmb29gIGNoYW5uZWxcbiAqIERFQlVHPWZvbyogLy8gbG9ncyBhbnkgY2hhbm5lbHMgc3RhcnRpbmcgd2l0aCBgZm9vYFxuICogYGBgXG4gKlxuICogSW4gdGhlIGJyb3dzZXIsIHNldCBgd2luZG93Ll9fUFVQUEVURUVSX0RFQlVHYCB0byBhIHN0cmluZzpcbiAqXG4gKiBgYGBcbiAqIHdpbmRvdy5fX1BVUFBFVEVFUl9ERUJVRz0nKic7IC8vIGxvZ3MgYWxsIGNoYW5uZWxzXG4gKiB3aW5kb3cuX19QVVBQRVRFRVJfREVCVUc9J2Zvbyc7IC8vIGxvZ3MgdGhlIGBmb29gIGNoYW5uZWxcbiAqIHdpbmRvdy5fX1BVUFBFVEVFUl9ERUJVRz0nZm9vKic7IC8vIGxvZ3MgYW55IGNoYW5uZWxzIHN0YXJ0aW5nIHdpdGggYGZvb2BcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgXG4gKiBjb25zdCBsb2cgPSBkZWJ1ZygnUGFnZScpO1xuICpcbiAqIGxvZygnbmV3IHBhZ2UgY3JlYXRlZCcpXG4gKiAvLyBsb2dzIFwiUGFnZTogbmV3IHBhZ2UgY3JlYXRlZFwiXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHJlZml4IC0gdGhpcyB3aWxsIGJlIHByZWZpeGVkIHRvIGVhY2ggbG9nLlxuICogQHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gbG9nIHRvIHRoYXQgZGVidWcgY2hhbm5lbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGRlYnVnID0gKHByZWZpeCkgPT4ge1xuICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jICguLi5sb2dBcmdzKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2FwdHVyZUxvZ3MpIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlZExvZ3MucHVzaChwcmVmaXggKyBsb2dBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChhd2FpdCBpbXBvcnREZWJ1ZygpKShwcmVmaXgpKGxvZ0FyZ3MpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gKC4uLmxvZ0FyZ3MpID0+IHtcbiAgICAgICAgY29uc3QgZGVidWdMZXZlbCA9IGdsb2JhbFRoaXMuX19QVVBQRVRFRVJfREVCVUc7XG4gICAgICAgIGlmICghZGVidWdMZXZlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZXJ5dGhpbmdTaG91bGRCZUxvZ2dlZCA9IGRlYnVnTGV2ZWwgPT09ICcqJztcbiAgICAgICAgY29uc3QgcHJlZml4TWF0Y2hlc0RlYnVnTGV2ZWwgPSBldmVyeXRoaW5nU2hvdWxkQmVMb2dnZWQgfHxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSWYgdGhlIGRlYnVnIGxldmVsIGlzIGBmb28qYCwgdGhhdCBtZWFucyB3ZSBtYXRjaCBhbnkgcHJlZml4IHRoYXRcbiAgICAgICAgICAgICAqIHN0YXJ0cyB3aXRoIGBmb29gLiBJZiB0aGUgbGV2ZWwgaXMgYGZvb2AsIHdlIG1hdGNoIG9ubHkgdGhlIHByZWZpeFxuICAgICAgICAgICAgICogYGZvb2AuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIChkZWJ1Z0xldmVsLmVuZHNXaXRoKCcqJylcbiAgICAgICAgICAgICAgICA/IHByZWZpeC5zdGFydHNXaXRoKGRlYnVnTGV2ZWwpXG4gICAgICAgICAgICAgICAgOiBwcmVmaXggPT09IGRlYnVnTGV2ZWwpO1xuICAgICAgICBpZiAoIXByZWZpeE1hdGNoZXNEZWJ1Z0xldmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coYCR7cHJlZml4fTpgLCAuLi5sb2dBcmdzKTtcbiAgICB9O1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBjYXB0dXJlZExvZ3MgPSBbXTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBjYXB0dXJlTG9ncyA9IGZhbHNlO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExvZ0NhcHR1cmUodmFsdWUpIHtcbiAgICBjYXB0dXJlZExvZ3MgPSBbXTtcbiAgICBjYXB0dXJlTG9ncyA9IHZhbHVlO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhcHR1cmVkTG9ncygpIHtcbiAgICByZXR1cm4gY2FwdHVyZWRMb2dzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVidWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmNvbnN0IGtub3duRGV2aWNlcyA9IFtcbiAgICB7XG4gICAgICAgIG5hbWU6ICdCbGFja2JlcnJ5IFBsYXlCb29rJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKFBsYXlCb29rOyBVOyBSSU0gVGFibGV0IE9TIDIuMS4wOyBlbi1VUykgQXBwbGVXZWJLaXQvNTM2LjIrIChLSFRNTCBsaWtlIEdlY2tvKSBWZXJzaW9uLzcuMi4xLjAgU2FmYXJpLzUzNi4yKycsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDI0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDEsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnQmxhY2tiZXJyeSBQbGF5Qm9vayBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoUGxheUJvb2s7IFU7IFJJTSBUYWJsZXQgT1MgMi4xLjA7IGVuLVVTKSBBcHBsZVdlYktpdC81MzYuMisgKEtIVE1MIGxpa2UgR2Vja28pIFZlcnNpb24vNy4yLjEuMCBTYWZhcmkvNTM2LjIrJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDI0LFxuICAgICAgICAgICAgaGVpZ2h0OiA2MDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0JsYWNrQmVycnkgWjMwJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKEJCMTA7IFRvdWNoKSBBcHBsZVdlYktpdC81MzcuMTArIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wLjkuMjM3MiBNb2JpbGUgU2FmYXJpLzUzNy4xMCsnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnQmxhY2tCZXJyeSBaMzAgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKEJCMTA7IFRvdWNoKSBBcHBsZVdlYktpdC81MzcuMTArIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wLjkuMjM3MiBNb2JpbGUgU2FmYXJpLzUzNy4xMCsnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgTm90ZSAzJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMzsgZW4tdXM7IFNNLU45MDBUIEJ1aWxkL0pTUzE1SikgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnR2FsYXh5IE5vdGUgMyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgNC4zOyBlbi11czsgU00tTjkwMFQgQnVpbGQvSlNTMTVKKSBBcHBsZVdlYktpdC81MzQuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBNb2JpbGUgU2FmYXJpLzUzNC4zMCcsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBOb3RlIElJJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMTsgZW4tdXM7IEdULU43MTAwIEJ1aWxkL0pSTzAzQykgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnR2FsYXh5IE5vdGUgSUkgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMTsgZW4tdXM7IEdULU43MTAwIEJ1aWxkL0pSTzAzQykgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUyBJSUknLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgNC4wOyBlbi11czsgR1QtSTkzMDAgQnVpbGQvSU1NNzZEKSBBcHBsZVdlYktpdC81MzQuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBNb2JpbGUgU2FmYXJpLzUzNC4zMCcsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzYwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUyBJSUkgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMDsgZW4tdXM7IEdULUk5MzAwIEJ1aWxkL0lNTTc2RCkgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUzUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNS4wOyBTTS1HOTAwUCBCdWlsZC9MUlgyMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzYwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUzUgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDUuMDsgU00tRzkwMFAgQnVpbGQvTFJYMjFUKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUzgnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNy4wOyBTTS1HOTUwVSBCdWlsZC9OUkQ5ME0pIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS82Mi4wLjMyMDIuODQgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNzQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnR2FsYXh5IFM4IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA3LjA7IFNNLUc5NTBVIEJ1aWxkL05SRDkwTSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzYyLjAuMzIwMi44NCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBTOSsnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4wLjA7IFNNLUc5NjVVIEJ1aWxkL1IxNk5XKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNjMuMC4zMjM5LjExMSBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzIwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NTgsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogNC41LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBTOSsgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBTTS1HOTY1VSBCdWlsZC9SMTZOVykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzYzLjAuMzIzOS4xMTEgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY1OCxcbiAgICAgICAgICAgIGhlaWdodDogMzIwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDQuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBUYWIgUzQnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4xLjA7IFNNLVQ4MzdBKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzAuMC4zNTM4LjgwIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDcxMixcbiAgICAgICAgICAgIGhlaWdodDogMTEzOCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLjI1LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBUYWIgUzQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMS4wOyBTTS1UODM3QSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzcwLjAuMzUzOC44MCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMTM4LFxuICAgICAgICAgICAgaGVpZ2h0OiA3MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi4yNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzQgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTUzNDFmIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzY4LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDI0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzQgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTUzNDFmIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMTAyNCxcbiAgICAgICAgICAgIGhlaWdodDogNzY4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIChnZW4gNiknLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDEyXzIgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDc2OCxcbiAgICAgICAgICAgIGhlaWdodDogMTAyNCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQgKGdlbiA2KSBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDEyXzIgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDEwMjQsXG4gICAgICAgICAgICBoZWlnaHQ6IDc2OCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCAoZ2VuIDcpJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMl8yIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xNS40IE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4MTAsXG4gICAgICAgICAgICBoZWlnaHQ6IDEwODAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIChnZW4gNykgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMl8yIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xNS40IE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDgwLFxuICAgICAgICAgICAgaGVpZ2h0OiA4MTAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQgTWluaScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zNCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBNTM0MWYgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA3NjgsXG4gICAgICAgICAgICBoZWlnaHQ6IDEwMjQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIE1pbmkgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM0IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUE1MzQxZiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDEwMjQsXG4gICAgICAgICAgICBoZWlnaHQ6IDc2OCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzQgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTUzNDFmIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMTAyNCxcbiAgICAgICAgICAgIGhlaWdodDogMTM2NixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQgUHJvIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zNCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBNTM0MWYgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMzY2LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDI0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIFBybyAxMScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgMTJfMiBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODM0LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMTk0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCBQcm8gMTEgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMl8yIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xNS40IE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMTk0LFxuICAgICAgICAgICAgaGVpZ2h0OiA4MzQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA0JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyA3XzFfMiBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC81MzcuNTEuMiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNy4wIE1vYmlsZS8xMUQyNTcgU2FmYXJpLzk1MzcuNTMnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDMyMCxcbiAgICAgICAgICAgIGhlaWdodDogNDgwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyA3XzFfMiBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC81MzcuNTEuMiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNy4wIE1vYmlsZS8xMUQyNTcgU2FmYXJpLzk1MzcuNTMnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQ4MCxcbiAgICAgICAgICAgIGhlaWdodDogMzIwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgNScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTBfM18xIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwMy4xLjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wIE1vYmlsZS8xNEUzMDQgU2FmYXJpLzYwMi4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzMjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDU2OCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA1IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTBfM18xIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwMy4xLjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wIE1vYmlsZS8xNEUzMDQgU2FmYXJpLzYwMi4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA1NjgsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDYnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM3NSxcbiAgICAgICAgICAgIGhlaWdodDogNjY3LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDYgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA2NjcsXG4gICAgICAgICAgICBoZWlnaHQ6IDM3NSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDYgUGx1cycsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDE0LFxuICAgICAgICAgICAgaGVpZ2h0OiA3MzYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgNiBQbHVzIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzM2LFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA3JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNzUsXG4gICAgICAgICAgICBoZWlnaHQ6IDY2NyxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA3IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjY3LFxuICAgICAgICAgICAgaGVpZ2h0OiAzNzUsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA3IFBsdXMnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQxNCxcbiAgICAgICAgICAgIGhlaWdodDogNzM2LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDcgUGx1cyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDczNixcbiAgICAgICAgICAgIGhlaWdodDogNDE0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgOCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzc1LFxuICAgICAgICAgICAgaGVpZ2h0OiA2NjcsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgOCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY2NyxcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgOCBQbHVzJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTQsXG4gICAgICAgICAgICBoZWlnaHQ6IDczNixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA4IFBsdXMgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA3MzYsXG4gICAgICAgICAgICBoZWlnaHQ6IDQxNCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFNFJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMF8zXzEgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjAzLjEuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEwLjAgTW9iaWxlLzE0RTMwNCBTYWZhcmkvNjAyLjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDMyMCxcbiAgICAgICAgICAgIGhlaWdodDogNTY4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFNFIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTBfM18xIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwMy4xLjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wIE1vYmlsZS8xNEUzMDQgU2FmYXJpLzYwMi4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA1NjgsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFgnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM3NSxcbiAgICAgICAgICAgIGhlaWdodDogODEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFggbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4MTIsXG4gICAgICAgICAgICBoZWlnaHQ6IDM3NSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFhSJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMl8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMi4wIE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTQsXG4gICAgICAgICAgICBoZWlnaHQ6IDg5NixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSBYUiBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEyXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEyLjAgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg5NixcbiAgICAgICAgICAgIGhlaWdodDogNDE0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTEnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQxNCxcbiAgICAgICAgICAgIGhlaWdodDogODI4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDExIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTNfNyBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTMuMSBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODI4LFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSAxMSBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM3NSxcbiAgICAgICAgICAgIGhlaWdodDogODEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDExIFBybyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgxMixcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTEgUHJvIE1heCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTNfNyBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTMuMSBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDE0LFxuICAgICAgICAgICAgaGVpZ2h0OiA4OTYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTEgUHJvIE1heCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg5NixcbiAgICAgICAgICAgIGhlaWdodDogNDE0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTInLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEyIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTRfNCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODQ0LFxuICAgICAgICAgICAgaGVpZ2h0OiAzOTAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSAxMiBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEyIFBybyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg0NCxcbiAgICAgICAgICAgIGhlaWdodDogMzkwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgUHJvIE1heCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTRfNCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDI4LFxuICAgICAgICAgICAgaGVpZ2h0OiA5MjYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgUHJvIE1heCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDkyNixcbiAgICAgICAgICAgIGhlaWdodDogNDI4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgTWluaScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTRfNCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzc1LFxuICAgICAgICAgICAgaGVpZ2h0OiA4MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgTWluaSBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgxMixcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEzIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTVfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODQ0LFxuICAgICAgICAgICAgaGVpZ2h0OiAzOTAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSAxMyBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEzIFBybyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg0NCxcbiAgICAgICAgICAgIGhlaWdodDogMzkwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgUHJvIE1heCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTVfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDI4LFxuICAgICAgICAgICAgaGVpZ2h0OiA5MjYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgUHJvIE1heCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDkyNixcbiAgICAgICAgICAgIGhlaWdodDogNDI4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgTWluaScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTVfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzc1LFxuICAgICAgICAgICAgaGVpZ2h0OiA4MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgTWluaSBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgxMixcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdKaW9QaG9uZSAyJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKE1vYmlsZTsgTFlGL0YzMDBCL0xZRi1GMzAwQi0wMDEtMDEtMTUtMTMwNzE4LWk7QW5kcm9pZDsgcnY6NDguMCkgR2Vja28vNDguMCBGaXJlZm94LzQ4LjAgS0FJT1MvMi41JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAyNDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0ppb1Bob25lIDIgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKE1vYmlsZTsgTFlGL0YzMDBCL0xZRi1GMzAwQi0wMDEtMDEtMTUtMTMwNzE4LWk7QW5kcm9pZDsgcnY6NDguMCkgR2Vja28vNDguMCBGaXJlZm94LzQ4LjAgS0FJT1MvMi41JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzMjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDI0MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnS2luZGxlIEZpcmUgSERYJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBlbi11czsgS0ZBUFdJIEJ1aWxkL0pEUTM5KSBBcHBsZVdlYktpdC81MzUuMTkgKEtIVE1MLCBsaWtlIEdlY2tvKSBTaWxrLzMuMTMgU2FmYXJpLzUzNS4xOSBTaWxrLUFjY2VsZXJhdGVkPXRydWUnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgwMCxcbiAgICAgICAgICAgIGhlaWdodDogMTI4MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0tpbmRsZSBGaXJlIEhEWCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IFU7IGVuLXVzOyBLRkFQV0kgQnVpbGQvSkRRMzkpIEFwcGxlV2ViS2l0LzUzNS4xOSAoS0hUTUwsIGxpa2UgR2Vja28pIFNpbGsvMy4xMyBTYWZhcmkvNTM1LjE5IFNpbGstQWNjZWxlcmF0ZWQ9dHJ1ZScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMTI4MCxcbiAgICAgICAgICAgIGhlaWdodDogODAwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdMRyBPcHRpbXVzIEw3MCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgVTsgQW5kcm9pZCA0LjQuMjsgZW4tdXM7IExHTVMzMjMgQnVpbGQvS09UNDlJLk1TMzIzMTBjKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM4NCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDEuMjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTEcgT3B0aW11cyBMNzAgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuNC4yOyBlbi11czsgTEdNUzMyMyBCdWlsZC9LT1Q0OUkuTVMzMjMxMGMpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzODQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMS4yNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ01pY3Jvc29mdCBMdW1pYSA1NTAnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBQaG9uZSAxMC4wOyBBbmRyb2lkIDQuMi4xOyBNaWNyb3NvZnQ7IEx1bWlhIDU1MCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzQ2LjAuMjQ4Ni4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2IEVkZ2UvMTQuMTQyNjMnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTWljcm9zb2Z0IEx1bWlhIDk1MCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChXaW5kb3dzIFBob25lIDEwLjA7IEFuZHJvaWQgNC4yLjE7IE1pY3Jvc29mdDsgTHVtaWEgOTUwKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDYuMC4yNDg2LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYgRWRnZS8xNC4xNDI2MycsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzYwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogNCxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdNaWNyb3NvZnQgTHVtaWEgOTUwIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChXaW5kb3dzIFBob25lIDEwLjA7IEFuZHJvaWQgNC4yLjE7IE1pY3Jvc29mdDsgTHVtaWEgOTUwKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDYuMC4yNDg2LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYgRWRnZS8xNC4xNDI2MycsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogNCxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDEwJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMC4xOyBOZXh1cyAxMCBCdWlsZC9NT0IzMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4MDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDEyODAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyAxMCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wLjE7IE5leHVzIDEwIEJ1aWxkL01PQjMxVCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDEyODAsXG4gICAgICAgICAgICBoZWlnaHQ6IDgwMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTmV4dXMgNCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA0LjQuMjsgTmV4dXMgNCBCdWlsZC9LT1Q0OUgpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzg0LFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyA0IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA0LjQuMjsgTmV4dXMgNCBCdWlsZC9LT1Q0OUgpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzODQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wOyBOZXh1cyA1IEJ1aWxkL01SQTU4TikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDY0MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDUgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMDsgTmV4dXMgNSBCdWlsZC9NUkE1OE4pIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDVYJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBOZXh1cyA1WCBCdWlsZC9PUFI0LjE3MDYyMy4wMDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDEyLFxuICAgICAgICAgICAgaGVpZ2h0OiA3MzIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi42MjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTmV4dXMgNVggbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBOZXh1cyA1WCBCdWlsZC9PUFI0LjE3MDYyMy4wMDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzMyLFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi42MjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyA2JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMS4xOyBOZXh1cyA2IEJ1aWxkL042RjI2VSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTIsXG4gICAgICAgICAgICBoZWlnaHQ6IDczMixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTmV4dXMgNiBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNy4xLjE7IE5leHVzIDYgQnVpbGQvTjZGMjZVKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDczMixcbiAgICAgICAgICAgIGhlaWdodDogNDEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDZQJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBOZXh1cyA2UCBCdWlsZC9PUFAzLjE3MDUxOC4wMDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDEyLFxuICAgICAgICAgICAgaGVpZ2h0OiA3MzIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMy41LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDZQIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA4LjAuMDsgTmV4dXMgNlAgQnVpbGQvT1BQMy4xNzA1MTguMDA2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDczMixcbiAgICAgICAgICAgIGhlaWdodDogNDEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDcnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wLjE7IE5leHVzIDcgQnVpbGQvTU9CMzBYKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiA5NjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyA3IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA2LjAuMTsgTmV4dXMgNyBCdWlsZC9NT0IzMFgpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA5NjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDYwMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTm9raWEgTHVtaWEgNTIwJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IE1TSUUgMTAuMDsgV2luZG93cyBQaG9uZSA4LjA7IFRyaWRlbnQvNi4wOyBJRU1vYmlsZS8xMC4wOyBBUk07IFRvdWNoOyBOT0tJQTsgTHVtaWEgNTIwKScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzIwLFxuICAgICAgICAgICAgaGVpZ2h0OiA1MzMsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMS41LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05va2lhIEx1bWlhIDUyMCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoY29tcGF0aWJsZTsgTVNJRSAxMC4wOyBXaW5kb3dzIFBob25lIDguMDsgVHJpZGVudC82LjA7IElFTW9iaWxlLzEwLjA7IEFSTTsgVG91Y2g7IE5PS0lBOyBMdW1pYSA1MjApJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA1MzMsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOb2tpYSBOOScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChNZWVHbzsgTm9raWFOOSkgQXBwbGVXZWJLaXQvNTM0LjEzIChLSFRNTCwgbGlrZSBHZWNrbykgTm9raWFCcm93c2VyLzguNS4wIE1vYmlsZSBTYWZhcmkvNTM0LjEzJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0ODAsXG4gICAgICAgICAgICBoZWlnaHQ6IDg1NCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05va2lhIE45IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChNZWVHbzsgTm9raWFOOSkgQXBwbGVXZWJLaXQvNTM0LjEzIChLSFRNTCwgbGlrZSBHZWNrbykgTm9raWFCcm93c2VyLzguNS4wIE1vYmlsZSBTYWZhcmkvNTM0LjEzJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4NTQsXG4gICAgICAgICAgICBoZWlnaHQ6IDQ4MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnUGl4ZWwgMicsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA4LjA7IFBpeGVsIDIgQnVpbGQvT1BEMy4xNzA4MTYuMDEyKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQxMSxcbiAgICAgICAgICAgIGhlaWdodDogNzMxLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIuNjI1LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDIgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMDsgUGl4ZWwgMiBCdWlsZC9PUEQzLjE3MDgxNi4wMTIpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzMxLFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTEsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi42MjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdQaXhlbCAyIFhMJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBQaXhlbCAyIFhMIEJ1aWxkL09QRDEuMTcwODE2LjAwNCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTEsXG4gICAgICAgICAgICBoZWlnaHQ6IDgyMyxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnUGl4ZWwgMiBYTCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4wLjA7IFBpeGVsIDIgWEwgQnVpbGQvT1BEMS4xNzA4MTYuMDA0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgyMyxcbiAgICAgICAgICAgIGhlaWdodDogNDExLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDMnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOTsgUGl4ZWwgMyBCdWlsZC9QUTFBLjE4MTEwNS4wMTcuQTEpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS82Ni4wLjMzNTkuMTU4IE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzOTMsXG4gICAgICAgICAgICBoZWlnaHQ6IDc4NixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLjc1LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDMgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDk7IFBpeGVsIDMgQnVpbGQvUFExQS4xODExMDUuMDE3LkExKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNjYuMC4zMzU5LjE1OCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzg2LFxuICAgICAgICAgICAgaGVpZ2h0OiAzOTMsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi43NSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDQnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IFBpeGVsIDQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84MS4wLjQwNDQuMTM4IE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNTMsXG4gICAgICAgICAgICBoZWlnaHQ6IDc0NSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDEwOyBQaXhlbCA0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODEuMC40MDQ0LjEzOCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzQ1LFxuICAgICAgICAgICAgaGVpZ2h0OiAzNTMsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDRhICg1RyknLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTE7IFBpeGVsIDRhICg1RykpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS85OS4wLjQ4MTIuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzUzLFxuICAgICAgICAgICAgaGVpZ2h0OiA3NDUsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdQaXhlbCA0YSAoNUcpIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMTsgUGl4ZWwgNGEgKDVHKSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA3NDUsXG4gICAgICAgICAgICBoZWlnaHQ6IDM1MyxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnUGl4ZWwgNScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMTsgUGl4ZWwgNSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzOTMsXG4gICAgICAgICAgICBoZWlnaHQ6IDg1MSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDUgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDExOyBQaXhlbCA1KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvOTkuMC40ODEyLjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg1MSxcbiAgICAgICAgICAgIGhlaWdodDogMzkzLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdNb3RvIEc0JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMDsgTW90byBHICg0KSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDY0MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ01vdG8gRzQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMDsgTW90byBHICg0KSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA2NDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDM2MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG5dO1xuY29uc3Qga25vd25EZXZpY2VzQnlOYW1lID0ge307XG5mb3IgKGNvbnN0IGRldmljZSBvZiBrbm93bkRldmljZXMpIHtcbiAgICBrbm93bkRldmljZXNCeU5hbWVbZGV2aWNlLm5hbWVdID0gZGV2aWNlO1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgZGV2aWNlcyB0byBiZSB1c2VkIHdpdGgge0BsaW5rIFBhZ2UuZW11bGF0ZX0uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHtLbm93bkRldmljZXN9IGZyb20gJ3B1cHBldGVlcic7XG4gKiBjb25zdCBpUGhvbmUgPSBLbm93bkRldmljZXNbJ2lQaG9uZSA2J107XG4gKlxuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmVtdWxhdGUoaVBob25lKTtcbiAqICAgYXdhaXQgcGFnZS5nb3RvKCdodHRwczovL3d3dy5nb29nbGUuY29tJyk7XG4gKiAgIC8vIG90aGVyIGFjdGlvbnMuLi5cbiAqICAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICogfSkoKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IEtub3duRGV2aWNlcyA9IE9iamVjdC5mcmVlemUoa25vd25EZXZpY2VzQnlOYW1lKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURldmljZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIFB1cHBldGVlci1zcGVjaWZpYyBlcnJvcnNcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQdXBwZXRlZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICB9XG59XG4vKipcbiAqIFRpbWVvdXRFcnJvciBpcyBlbWl0dGVkIHdoZW5ldmVyIGNlcnRhaW4gb3BlcmF0aW9ucyBhcmUgdGVybWluYXRlZCBkdWUgdG9cbiAqIHRpbWVvdXQuXG4gKlxuICogQHJlbWFya3NcbiAqIEV4YW1wbGUgb3BlcmF0aW9ucyBhcmUge0BsaW5rIFBhZ2Uud2FpdEZvclNlbGVjdG9yIHwgcGFnZS53YWl0Rm9yU2VsZWN0b3J9IG9yXG4gKiB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXVuY2ggfCBwdXBwZXRlZXIubGF1bmNofS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lb3V0RXJyb3IgZXh0ZW5kcyBQdXBwZXRlZXJFcnJvciB7XG59XG4vKipcbiAqIFByb3RvY29sRXJyb3IgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGVyZSBpcyBhbiBlcnJvciBmcm9tIHRoZSBwcm90b2NvbC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm90b2NvbEVycm9yIGV4dGVuZHMgUHVwcGV0ZWVyRXJyb3Ige1xuICAgICNjb2RlO1xuICAgICNvcmlnaW5hbE1lc3NhZ2UgPSAnJztcbiAgICBzZXQgY29kZShjb2RlKSB7XG4gICAgICAgIHRoaXMuI2NvZGUgPSBjb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgZ2V0IGNvZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb2RlO1xuICAgIH1cbiAgICBzZXQgb3JpZ2luYWxNZXNzYWdlKG9yaWdpbmFsTWVzc2FnZSkge1xuICAgICAgICB0aGlzLiNvcmlnaW5hbE1lc3NhZ2UgPSBvcmlnaW5hbE1lc3NhZ2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBnZXQgb3JpZ2luYWxNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jb3JpZ2luYWxNZXNzYWdlO1xuICAgIH1cbn1cbi8qKlxuICogUHVwcGV0ZWVyIHdpbGwgdGhyb3cgdGhpcyBlcnJvciBpZiBhIG1ldGhvZCBpcyBub3RcbiAqIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHVzZWQgcHJvdG9jb2xcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZE9wZXJhdGlvbiBleHRlbmRzIFB1cHBldGVlckVycm9yIHtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRDbG9zZUVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcnJvcnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBtaXR0IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L21pdHQvbWl0dC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlU3ltYm9sIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbi8qKlxuICogVGhlIEV2ZW50RW1pdHRlciBjbGFzcyB0aGF0IG1hbnkgUHVwcGV0ZWVyIGNsYXNzZXMgZXh0ZW5kLlxuICpcbiAqIEByZW1hcmtzXG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIGxpc3RlbiB0byBldmVudHMgdGhhdCBQdXBwZXRlZXIgY2xhc3NlcyBmaXJlIGFuZCBhY3RcbiAqIGFjY29yZGluZ2x5LiBUaGVyZWZvcmUgeW91J2xsIG1vc3RseSB1c2Uge0BsaW5rIEV2ZW50RW1pdHRlci5vbiB8IG9ufSBhbmRcbiAqIHtAbGluayBFdmVudEVtaXR0ZXIub2ZmIHwgb2ZmfSB0byBiaW5kXG4gKiBhbmQgdW5iaW5kIHRvIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXIge1xuICAgICNlbWl0dGVyO1xuICAgICNoYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICAvKipcbiAgICAgKiBJZiB5b3UgcGFzcyBhbiBlbWl0dGVyLCB0aGUgcmV0dXJuZWQgZW1pdHRlciB3aWxsIHdyYXAgdGhlIHBhc3NlZCBlbWl0dGVyLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZW1pdHRlciA9IG1pdHQobmV3IE1hcCgpKSkge1xuICAgICAgICB0aGlzLiNlbWl0dGVyID0gZW1pdHRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQmluZCBhbiBldmVudCBsaXN0ZW5lciB0byBmaXJlIHdoZW4gYW4gZXZlbnQgb2NjdXJzLlxuICAgICAqIEBwYXJhbSB0eXBlIC0gdGhlIGV2ZW50IHR5cGUgeW91J2QgbGlrZSB0byBsaXN0ZW4gdG8uIENhbiBiZSBhIHN0cmluZyBvciBzeW1ib2wuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IG9jY3Vycy5cbiAgICAgKiBAcmV0dXJucyBgdGhpc2AgdG8gZW5hYmxlIHlvdSB0byBjaGFpbiBtZXRob2QgY2FsbHMuXG4gICAgICovXG4gICAgb24odHlwZSwgaGFuZGxlcikge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuI2hhbmRsZXJzLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKGhhbmRsZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZXJzLnNldCh0eXBlLCBbaGFuZGxlcl0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNlbWl0dGVyLm9uKHR5cGUsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gZmlyaW5nLlxuICAgICAqIEBwYXJhbSB0eXBlIC0gdGhlIGV2ZW50IHR5cGUgeW91J2QgbGlrZSB0byBzdG9wIGxpc3RlbmluZyB0by5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciAtIHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSByZW1vdmVkLlxuICAgICAqIEByZXR1cm5zIGB0aGlzYCB0byBlbmFibGUgeW91IHRvIGNoYWluIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICBvZmYodHlwZSwgaGFuZGxlcikge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuI2hhbmRsZXJzLmdldCh0eXBlKSA/PyBbXTtcbiAgICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZW1pdHRlci5vZmYodHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNoYW5kbGVycy5kZWxldGUodHlwZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IGhhbmRsZXJzLmxhc3RJbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy4jZW1pdHRlci5vZmYodHlwZSwgLi4uaGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVtaXQgYW4gZXZlbnQgYW5kIGNhbGwgYW55IGFzc29jaWF0ZWQgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgLSB0aGUgZXZlbnQgeW91J2QgbGlrZSB0byBlbWl0XG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSAtIGFueSBkYXRhIHlvdSdkIGxpa2UgdG8gZW1pdCB3aXRoIHRoZSBldmVudFxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGVyZSBhcmUgYW55IGxpc3RlbmVycywgYGZhbHNlYCBpZiB0aGVyZSBhcmUgbm90LlxuICAgICAqL1xuICAgIGVtaXQodHlwZSwgZXZlbnQpIHtcbiAgICAgICAgdGhpcy4jZW1pdHRlci5lbWl0KHR5cGUsIGV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXJDb3VudCh0eXBlKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpa2UgYG9uYCBidXQgdGhlIGxpc3RlbmVyIHdpbGwgb25seSBiZSBmaXJlZCBvbmNlIGFuZCB0aGVuIGl0IHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAgKiBAcGFyYW0gdHlwZSAtIHRoZSBldmVudCB5b3UnZCBsaWtlIHRvIGxpc3RlbiB0b1xuICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gdGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gcnVuIHdoZW4gdGhlIGV2ZW50IG9jY3Vyc1xuICAgICAqIEByZXR1cm5zIGB0aGlzYCB0byBlbmFibGUgeW91IHRvIGNoYWluIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICBvbmNlKHR5cGUsIGhhbmRsZXIpIHtcbiAgICAgICAgY29uc3Qgb25jZUhhbmRsZXIgPSBldmVudERhdGEgPT4ge1xuICAgICAgICAgICAgaGFuZGxlcihldmVudERhdGEpO1xuICAgICAgICAgICAgdGhpcy5vZmYodHlwZSwgb25jZUhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5vbih0eXBlLCBvbmNlSGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSAtIHRoZSBldmVudCB0byBnZXQgdGhlIGxpc3RlbmVyIGNvdW50IGZvclxuICAgICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGJvdW5kIHRvIHRoZSBnaXZlbiBldmVudFxuICAgICAqL1xuICAgIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaGFuZGxlcnMuZ2V0KHR5cGUpPy5sZW5ndGggfHwgMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgbGlzdGVuZXJzLiBJZiBnaXZlbiBhbiBldmVudCBhcmd1bWVudCwgaXQgd2lsbCByZW1vdmUgb25seVxuICAgICAqIGxpc3RlbmVycyBmb3IgdGhhdCBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlIC0gdGhlIGV2ZW50IHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICAgICAqIEByZXR1cm5zIGB0aGlzYCB0byBlbmFibGUgeW91IHRvIGNoYWluIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vZmYodHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpc1tkaXNwb3NlU3ltYm9sXSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICBmb3IgKGNvbnN0IFt0eXBlLCBoYW5kbGVyc10gb2YgdGhpcy4jaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXR0ZXIub2ZmKHR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2hhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50U3Vic2NyaXB0aW9uIHtcbiAgICAjdGFyZ2V0O1xuICAgICN0eXBlO1xuICAgICNoYW5kbGVyO1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgdHlwZSwgaGFuZGxlcikge1xuICAgICAgICB0aGlzLiN0YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLiNoYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgdGhpcy4jdGFyZ2V0Lm9uKHRoaXMuI3R5cGUsIHRoaXMuI2hhbmRsZXIpO1xuICAgIH1cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHRoaXMuI3RhcmdldC5vZmYodGhpcy4jdHlwZSwgdGhpcy4jaGFuZGxlcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRFbWl0dGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG4vKipcbiAqIEZpbGUgY2hvb3NlcnMgbGV0IHlvdSByZWFjdCB0byB0aGUgcGFnZSByZXF1ZXN0aW5nIGZvciBhIGZpbGUuXG4gKlxuICogQHJlbWFya3NcbiAqIGBGaWxlQ2hvb3NlcmAgaW5zdGFuY2VzIGFyZSByZXR1cm5lZCB2aWEgdGhlIHtAbGluayBQYWdlLndhaXRGb3JGaWxlQ2hvb3Nlcn0gbWV0aG9kLlxuICpcbiAqIEluIGJyb3dzZXJzLCBvbmx5IG9uZSBmaWxlIGNob29zZXIgY2FuIGJlIG9wZW5lZCBhdCBhIHRpbWUuXG4gKiBBbGwgZmlsZSBjaG9vc2VycyBtdXN0IGJlIGFjY2VwdGVkIG9yIGNhbmNlbGVkLiBOb3QgZG9pbmcgc28gd2lsbCBwcmV2ZW50XG4gKiBzdWJzZXF1ZW50IGZpbGUgY2hvb3NlcnMgZnJvbSBhcHBlYXJpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgW2ZpbGVDaG9vc2VyXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS53YWl0Rm9yRmlsZUNob29zZXIoKSxcbiAqICAgcGFnZS5jbGljaygnI3VwbG9hZC1maWxlLWJ1dHRvbicpLCAvLyBzb21lIGJ1dHRvbiB0aGF0IHRyaWdnZXJzIGZpbGUgc2VsZWN0aW9uXG4gKiBdKTtcbiAqIGF3YWl0IGZpbGVDaG9vc2VyLmFjY2VwdChbJy90bXAvbXlmaWxlLnBkZiddKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVDaG9vc2VyIHtcbiAgICAjZWxlbWVudDtcbiAgICAjbXVsdGlwbGU7XG4gICAgI2hhbmRsZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBldmVudCkge1xuICAgICAgICB0aGlzLiNlbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy4jbXVsdGlwbGUgPSBldmVudC5tb2RlICE9PSAnc2VsZWN0U2luZ2xlJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciBmaWxlIGNob29zZXIgYWxsb3cgZm9yXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dC9maWxlI2F0dHItbXVsdGlwbGUgfCBtdWx0aXBsZX1cbiAgICAgKiBmaWxlIHNlbGVjdGlvbi5cbiAgICAgKi9cbiAgICBpc011bHRpcGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbXVsdGlwbGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjY2VwdCB0aGUgZmlsZSBjaG9vc2VyIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gZmlsZSBwYXRocy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzIFRoaXMgd2lsbCBub3QgdmFsaWRhdGUgd2hldGhlciB0aGUgZmlsZSBwYXRocyBleGlzdHMuIEFsc28sIGlmIGFcbiAgICAgKiBwYXRoIGlzIHJlbGF0aXZlLCB0aGVuIGl0IGlzIHJlc29sdmVkIGFnYWluc3QgdGhlXG4gICAgICoge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19jd2QgfCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5fS5cbiAgICAgKiBGb3IgbG9jYWxzIHNjcmlwdCBjb25uZWN0aW5nIHRvIHJlbW90ZSBjaHJvbWUgZW52aXJvbm1lbnRzLCBwYXRocyBtdXN0IGJlXG4gICAgICogYWJzb2x1dGUuXG4gICAgICovXG4gICAgYXN5bmMgYWNjZXB0KHBhdGhzKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBhY2NlcHQgRmlsZUNob29zZXIgd2hpY2ggaXMgYWxyZWFkeSBoYW5kbGVkIScpO1xuICAgICAgICB0aGlzLiNoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy4jZWxlbWVudC51cGxvYWRGaWxlKC4uLnBhdGhzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBmaWxlIGNob29zZXIgd2l0aG91dCBzZWxlY3RpbmcgYW55IGZpbGVzLlxuICAgICAqL1xuICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNoYW5kbGVkLCAnQ2Fubm90IGNhbmNlbCBGaWxlQ2hvb3NlciB3aGljaCBpcyBhbHJlYWR5IGhhbmRsZWQhJyk7XG4gICAgICAgIHRoaXMuI2hhbmRsZWQgPSB0cnVlO1xuICAgICAgICAvLyBYWFg6IFRoZXNlIGV2ZW50cyBzaG91bGQgY29udmVydGVkIHRvIHRydXN0ZWQgZXZlbnRzLiBQZXJoYXBzIGRvIHRoaXNcbiAgICAgICAgLy8gaW4gYERPTS5zZXRGaWxlSW5wdXRGaWxlc2A/XG4gICAgICAgIGF3YWl0IHRoaXMuI2VsZW1lbnQuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjYW5jZWwnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaWxlQ2hvb3Nlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQVJJQVF1ZXJ5SGFuZGxlciB9IGZyb20gJy4uL2NkcC9BcmlhUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IENTU1F1ZXJ5SGFuZGxlciB9IGZyb20gJy4vQ1NTUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IGN1c3RvbVF1ZXJ5SGFuZGxlcnMgfSBmcm9tICcuL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG5pbXBvcnQgeyBQaWVyY2VRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1BpZXJjZVF1ZXJ5SGFuZGxlci5qcyc7XG5pbXBvcnQgeyBQUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9QUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IHBhcnNlUFNlbGVjdG9ycyB9IGZyb20gJy4vUFNlbGVjdG9yUGFyc2VyLmpzJztcbmltcG9ydCB7IFRleHRRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1RleHRRdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgWFBhdGhRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1hQYXRoUXVlcnlIYW5kbGVyLmpzJztcbmNvbnN0IEJVSUxUSU5fUVVFUllfSEFORExFUlMgPSB7XG4gICAgYXJpYTogQVJJQVF1ZXJ5SGFuZGxlcixcbiAgICBwaWVyY2U6IFBpZXJjZVF1ZXJ5SGFuZGxlcixcbiAgICB4cGF0aDogWFBhdGhRdWVyeUhhbmRsZXIsXG4gICAgdGV4dDogVGV4dFF1ZXJ5SGFuZGxlcixcbn07XG5jb25zdCBRVUVSWV9TRVBBUkFUT1JTID0gWyc9JywgJy8nXTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGZvciAoY29uc3QgaGFuZGxlck1hcCBvZiBbXG4gICAgICAgIGN1c3RvbVF1ZXJ5SGFuZGxlcnMubmFtZXMoKS5tYXAobmFtZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gW25hbWUsIGN1c3RvbVF1ZXJ5SGFuZGxlcnMuZ2V0KG5hbWUpXTtcbiAgICAgICAgfSksXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKEJVSUxUSU5fUVVFUllfSEFORExFUlMpLFxuICAgIF0pIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgUXVlcnlIYW5kbGVyXSBvZiBoYW5kbGVyTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlcGFyYXRvciBvZiBRVUVSWV9TRVBBUkFUT1JTKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gYCR7bmFtZX0ke3NlcGFyYXRvcn1gO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2xsaW5nOiBuYW1lID09PSAnYXJpYScgPyBcInJhZlwiIC8qIFBvbGxpbmdPcHRpb25zLlJBRiAqLyA6IFwibXV0YXRpb25cIiAvKiBQb2xsaW5nT3B0aW9ucy5NVVRBVElPTiAqLyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5SGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgW3BTZWxlY3RvciwgaXNQdXJlQ1NTLCBoYXNQc2V1ZG9DbGFzc2VzLCBoYXNBcmlhXSA9IHBhcnNlUFNlbGVjdG9ycyhzZWxlY3Rvcik7XG4gICAgICAgIGlmIChpc1B1cmVDU1MpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBwb2xsaW5nOiBoYXNQc2V1ZG9DbGFzc2VzXG4gICAgICAgICAgICAgICAgICAgID8gXCJyYWZcIiAvKiBQb2xsaW5nT3B0aW9ucy5SQUYgKi9cbiAgICAgICAgICAgICAgICAgICAgOiBcIm11dGF0aW9uXCIgLyogUG9sbGluZ09wdGlvbnMuTVVUQVRJT04gKi8sXG4gICAgICAgICAgICAgICAgUXVlcnlIYW5kbGVyOiBDU1NRdWVyeUhhbmRsZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1cGRhdGVkU2VsZWN0b3I6IEpTT04uc3RyaW5naWZ5KHBTZWxlY3RvciksXG4gICAgICAgICAgICBwb2xsaW5nOiBoYXNBcmlhID8gXCJyYWZcIiAvKiBQb2xsaW5nT3B0aW9ucy5SQUYgKi8gOiBcIm11dGF0aW9uXCIgLyogUG9sbGluZ09wdGlvbnMuTVVUQVRJT04gKi8sXG4gICAgICAgICAgICBRdWVyeUhhbmRsZXI6IFBRdWVyeUhhbmRsZXIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVwZGF0ZWRTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICBwb2xsaW5nOiBcIm11dGF0aW9uXCIgLyogUG9sbGluZ09wdGlvbnMuTVVUQVRJT04gKi8sXG4gICAgICAgICAgICBRdWVyeUhhbmRsZXI6IENTU1F1ZXJ5SGFuZGxlcixcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HZXRRdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2ssIGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuY29uc3QgREVGQVVMVF9CQVRDSF9TSVpFID0gMjA7XG4vKipcbiAqIFRoaXMgd2lsbCB0cmFuc3Bvc2UgYW4gaXRlcmF0b3IgSlNIYW5kbGUgaW50byBhIGZhc3QsIFB1cHBldGVlci1zaWRlIGl0ZXJhdG9yXG4gKiBvZiBKU0hhbmRsZXMuXG4gKlxuICogQHBhcmFtIHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRyYW5zcG9zZS4gVGhpcyBzaG91bGQgYmUgc29tZXRoaW5nXG4gKiByZWFzb25hYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiogZmFzdFRyYW5zcG9zZUl0ZXJhdG9ySGFuZGxlKGl0ZXJhdG9yLCBzaXplKSB7XG4gICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMSwgYXdhaXQgaXRlcmF0b3IuZXZhbHVhdGVIYW5kbGUoYXN5bmMgKGl0ZXJhdG9yLCBzaXplKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgICAgICAgICB3aGlsZSAocmVzdWx0cy5sZW5ndGggPCBzaXplKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfSwgc2l6ZSksIGZhbHNlKTtcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IChhd2FpdCBhcnJheS5nZXRQcm9wZXJ0aWVzKCkpO1xuICAgICAgICBjb25zdCBoYW5kbGVzID0gcHJvcGVydGllcy52YWx1ZXMoKTtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMSwgbmV3IERpc3Bvc2FibGVTdGFjaygpLCBmYWxzZSk7XG4gICAgICAgIHN0YWNrLmRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlXzEgb2YgaGFuZGxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8yLCBoYW5kbGVfMSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVbZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgICAgICAgICBlbnZfMi5lcnJvciA9IGVfMjtcbiAgICAgICAgICAgICAgICAgICAgZW52XzIuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB5aWVsZCogaGFuZGxlcztcbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuc2l6ZSA9PT0gMDtcbiAgICB9XG4gICAgY2F0Y2ggKGVfMSkge1xuICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgZW52XzEuaGFzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8xKTtcbiAgICB9XG59XG4vKipcbiAqIFRoaXMgd2lsbCB0cmFuc3Bvc2UgYW4gaXRlcmF0b3IgSlNIYW5kbGUgaW4gYmF0Y2hlcyBiYXNlZCBvbiB0aGUgZGVmYXVsdCBzaXplXG4gKiBvZiB7QGxpbmsgZmFzdFRyYW5zcG9zZUl0ZXJhdG9ySGFuZGxlfS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24qIHRyYW5zcG9zZUl0ZXJhdG9ySGFuZGxlKGl0ZXJhdG9yKSB7XG4gICAgbGV0IHNpemUgPSBERUZBVUxUX0JBVENIX1NJWkU7XG4gICAgd2hpbGUgKCEoeWllbGQqIGZhc3RUcmFuc3Bvc2VJdGVyYXRvckhhbmRsZShpdGVyYXRvciwgc2l6ZSkpKSB7XG4gICAgICAgIHNpemUgPDw9IDE7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uKiB0cmFuc3Bvc2VJdGVyYWJsZUhhbmRsZShoYW5kbGUpIHtcbiAgICBjb25zdCBlbnZfMyA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBnZW5lcmF0b3JIYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMywgYXdhaXQgaGFuZGxlLmV2YWx1YXRlSGFuZGxlKGl0ZXJhYmxlID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoYXN5bmMgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogaXRlcmFibGU7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9KSwgZmFsc2UpO1xuICAgICAgICB5aWVsZCogdHJhbnNwb3NlSXRlcmF0b3JIYW5kbGUoZ2VuZXJhdG9ySGFuZGxlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVfMykge1xuICAgICAgICBlbnZfMy5lcnJvciA9IGVfMztcbiAgICAgICAgZW52XzMuaGFzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8zKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1IYW5kbGVJdGVyYXRvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIExhenlBcmcge1xuICAgIHN0YXRpYyBjcmVhdGUgPSAoZ2V0KSA9PiB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gaW50cm9kdWNlIExhenlBcmcgdG8gdGhlIHR5cGUgc3lzdGVtLCBvdGhlcndpc2Ugd2Ugd291bGRcbiAgICAgICAgLy8gaGF2ZSB0byBtYWtlIGl0IHB1YmxpYy5cbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5QXJnKGdldCk7XG4gICAgfTtcbiAgICAjZ2V0O1xuICAgIGNvbnN0cnVjdG9yKGdldCkge1xuICAgICAgICB0aGlzLiNnZXQgPSBnZXQ7XG4gICAgfVxuICAgIGFzeW5jIGdldChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNnZXQoY29udGV4dCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGF6eUFyZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBXZSB1c2Ugc3ltYm9scyB0byBwcmV2ZW50IGFueSBleHRlcm5hbCBwYXJ0aWVzIGxpc3RlbmluZyB0byB0aGVzZSBldmVudHMuXG4gKiBUaGV5IGFyZSBpbnRlcm5hbCB0byBQdXBwZXRlZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIE5ldHdvcmtNYW5hZ2VyRXZlbnQ7XG4oZnVuY3Rpb24gKE5ldHdvcmtNYW5hZ2VyRXZlbnQpIHtcbiAgICBOZXR3b3JrTWFuYWdlckV2ZW50LlJlcXVlc3QgPSBTeW1ib2woJ05ldHdvcmtNYW5hZ2VyLlJlcXVlc3QnKTtcbiAgICBOZXR3b3JrTWFuYWdlckV2ZW50LlJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUgPSBTeW1ib2woJ05ldHdvcmtNYW5hZ2VyLlJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUnKTtcbiAgICBOZXR3b3JrTWFuYWdlckV2ZW50LlJlc3BvbnNlID0gU3ltYm9sKCdOZXR3b3JrTWFuYWdlci5SZXNwb25zZScpO1xuICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdEZhaWxlZCA9IFN5bWJvbCgnTmV0d29ya01hbmFnZXIuUmVxdWVzdEZhaWxlZCcpO1xuICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdEZpbmlzaGVkID0gU3ltYm9sKCdOZXR3b3JrTWFuYWdlci5SZXF1ZXN0RmluaXNoZWQnKTtcbn0pKE5ldHdvcmtNYW5hZ2VyRXZlbnQgfHwgKE5ldHdvcmtNYW5hZ2VyRXZlbnQgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmV0d29ya01hbmFnZXJFdmVudHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBwYXBlckZvcm1hdHMgPSB7XG4gICAgbGV0dGVyOiB7IHdpZHRoOiA4LjUsIGhlaWdodDogMTEgfSxcbiAgICBsZWdhbDogeyB3aWR0aDogOC41LCBoZWlnaHQ6IDE0IH0sXG4gICAgdGFibG9pZDogeyB3aWR0aDogMTEsIGhlaWdodDogMTcgfSxcbiAgICBsZWRnZXI6IHsgd2lkdGg6IDE3LCBoZWlnaHQ6IDExIH0sXG4gICAgYTA6IHsgd2lkdGg6IDMzLjEsIGhlaWdodDogNDYuOCB9LFxuICAgIGExOiB7IHdpZHRoOiAyMy40LCBoZWlnaHQ6IDMzLjEgfSxcbiAgICBhMjogeyB3aWR0aDogMTYuNTQsIGhlaWdodDogMjMuNCB9LFxuICAgIGEzOiB7IHdpZHRoOiAxMS43LCBoZWlnaHQ6IDE2LjU0IH0sXG4gICAgYTQ6IHsgd2lkdGg6IDguMjcsIGhlaWdodDogMTEuNyB9LFxuICAgIGE1OiB7IHdpZHRoOiA1LjgzLCBoZWlnaHQ6IDguMjcgfSxcbiAgICBhNjogeyB3aWR0aDogNC4xMywgaGVpZ2h0OiA1LjgzIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT3B0aW9ucy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyLCB9IGZyb20gJy4vUXVlcnlIYW5kbGVyLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBQUXVlcnlIYW5kbGVyIGV4dGVuZHMgUXVlcnlIYW5kbGVyIHtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvckFsbCA9IChlbGVtZW50LCBzZWxlY3RvciwgeyBwUXVlcnlTZWxlY3RvckFsbCB9KSA9PiB7XG4gICAgICAgIHJldHVybiBwUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvciA9IChlbGVtZW50LCBzZWxlY3RvciwgeyBwUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBwUXVlcnlTZWxlY3RvcihlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBRdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IHRva2VuaXplLCBUT0tFTlMsIHN0cmluZ2lmeSwgfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9wYXJzZWwtanMvcGFyc2VsLWpzLmpzJztcblRPS0VOU1snbmVzdGluZyddID0gLyYvZztcblRPS0VOU1snY29tYmluYXRvciddID0gL1xccyooPj4+Pj98W1xccz4rfl0pXFxzKi9nO1xuY29uc3QgRVNDQVBFX1JFR0VYUCA9IC9cXFxcW1xcc1xcU10vZztcbmNvbnN0IHVucXVvdGUgPSAodGV4dCkgPT4ge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBpZiAoKHRleHRbMF0gPT09ICdcIicgfHwgdGV4dFswXSA9PT0gXCInXCIpICYmIHRleHQuZW5kc1dpdGgodGV4dFswXSkpIHtcbiAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMSwgLTEpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKEVTQ0FQRV9SRUdFWFAsIG1hdGNoID0+IHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdO1xuICAgIH0pO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBTZWxlY3RvcnMoc2VsZWN0b3IpIHtcbiAgICBsZXQgaXNQdXJlQ1NTID0gdHJ1ZTtcbiAgICBsZXQgaGFzQXJpYSA9IGZhbHNlO1xuICAgIGxldCBoYXNQc2V1ZG9DbGFzc2VzID0gZmFsc2U7XG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemUoc2VsZWN0b3IpO1xuICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbW10sIGlzUHVyZUNTUywgaGFzUHNldWRvQ2xhc3NlcywgZmFsc2VdO1xuICAgIH1cbiAgICBsZXQgY29tcG91bmRTZWxlY3RvciA9IFtdO1xuICAgIGxldCBjb21wbGV4U2VsZWN0b3IgPSBbY29tcG91bmRTZWxlY3Rvcl07XG4gICAgY29uc3Qgc2VsZWN0b3JzID0gW2NvbXBsZXhTZWxlY3Rvcl07XG4gICAgY29uc3Qgc3RvcmFnZSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY29tYmluYXRvcic6XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbi5jb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCI+Pj5cIiAvKiBQQ29tYmluYXRvci5EZXNjZW5kZW50ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQdXJlQ1NTID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3VuZFNlbGVjdG9yLnB1c2goc3RyaW5naWZ5KHN0b3JhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNwbGljZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kU2VsZWN0b3IgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZWxlY3Rvci5wdXNoKFwiPj4+XCIgLyogUENvbWJpbmF0b3IuRGVzY2VuZGVudCAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4U2VsZWN0b3IucHVzaChjb21wb3VuZFNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPj4+PlwiIC8qIFBDb21iaW5hdG9yLkNoaWxkICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQdXJlQ1NTID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3VuZFNlbGVjdG9yLnB1c2goc3RyaW5naWZ5KHN0b3JhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNwbGljZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kU2VsZWN0b3IgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZWxlY3Rvci5wdXNoKFwiPj4+PlwiIC8qIFBDb21iaW5hdG9yLkNoaWxkICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZWxlY3Rvci5wdXNoKGNvbXBvdW5kU2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHNldWRvLWVsZW1lbnQnOlxuICAgICAgICAgICAgICAgIGlmICghdG9rZW4ubmFtZS5zdGFydHNXaXRoKCctcC0nKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNQdXJlQ1NTID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JhZ2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kU2VsZWN0b3IucHVzaChzdHJpbmdpZnkoc3RvcmFnZSkpO1xuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNwbGljZSgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRva2VuLm5hbWUuc2xpY2UoMyk7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdhcmlhJykge1xuICAgICAgICAgICAgICAgICAgICBoYXNBcmlhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcG91bmRTZWxlY3Rvci5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVucXVvdGUodG9rZW4uYXJndW1lbnQgPz8gJycpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgY2FzZSAncHNldWRvLWNsYXNzJzpcbiAgICAgICAgICAgICAgICBoYXNQc2V1ZG9DbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmRTZWxlY3Rvci5wdXNoKHN0cmluZ2lmeShzdG9yYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2Uuc3BsaWNlKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wb3VuZFNlbGVjdG9yID0gW107XG4gICAgICAgICAgICAgICAgY29tcGxleFNlbGVjdG9yID0gW2NvbXBvdW5kU2VsZWN0b3JdO1xuICAgICAgICAgICAgICAgIHNlbGVjdG9ycy5wdXNoKGNvbXBsZXhTZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmFnZS5wdXNoKHRva2VuKTtcbiAgICB9XG4gICAgaWYgKHN0b3JhZ2UubGVuZ3RoKSB7XG4gICAgICAgIGNvbXBvdW5kU2VsZWN0b3IucHVzaChzdHJpbmdpZnkoc3RvcmFnZSkpO1xuICAgIH1cbiAgICByZXR1cm4gW3NlbGVjdG9ycywgaXNQdXJlQ1NTLCBoYXNQc2V1ZG9DbGFzc2VzLCBoYXNBcmlhXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBTZWxlY3RvclBhcnNlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9RdWVyeUhhbmRsZXIuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBpZXJjZVF1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3IgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgcGllcmNlUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBwaWVyY2VRdWVyeVNlbGVjdG9yKGVsZW1lbnQsIHNlbGVjdG9yKTtcbiAgICB9O1xuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yQWxsID0gKGVsZW1lbnQsIHNlbGVjdG9yLCB7IHBpZXJjZVF1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICByZXR1cm4gcGllcmNlUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBpZXJjZVF1ZXJ5SGFuZGxlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvZHVjdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgX2Nvbm5lY3RUb0Jyb3dzZXIgfSBmcm9tICcuL0Jyb3dzZXJDb25uZWN0b3IuanMnO1xuaW1wb3J0IHsgY3VzdG9tUXVlcnlIYW5kbGVycywgfSBmcm9tICcuL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG4vKipcbiAqIFRoZSBtYWluIFB1cHBldGVlciBjbGFzcy5cbiAqXG4gKiBJTVBPUlRBTlQ6IGlmIHlvdSBhcmUgdXNpbmcgUHVwcGV0ZWVyIGluIGEgTm9kZSBlbnZpcm9ubWVudCwgeW91IHdpbGwgZ2V0IGFuXG4gKiBpbnN0YW5jZSBvZiB7QGxpbmsgUHVwcGV0ZWVyTm9kZX0gd2hlbiB5b3UgaW1wb3J0IG9yIHJlcXVpcmUgYHB1cHBldGVlcmAuXG4gKiBUaGF0IGNsYXNzIGV4dGVuZHMgYFB1cHBldGVlcmAsIHNvIGhhcyBhbGwgdGhlIG1ldGhvZHMgZG9jdW1lbnRlZCBiZWxvdyBhc1xuICogd2VsbCBhcyBhbGwgdGhhdCBhcmUgZGVmaW5lZCBvbiB7QGxpbmsgUHVwcGV0ZWVyTm9kZX0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUHVwcGV0ZWVyIHtcbiAgICAvKipcbiAgICAgKiBPcGVyYXRpb25zIGZvciB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJzfS4gU2VlXG4gICAgICoge0BsaW5rIEN1c3RvbVF1ZXJ5SGFuZGxlclJlZ2lzdHJ5fS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBjdXN0b21RdWVyeUhhbmRsZXJzID0gY3VzdG9tUXVlcnlIYW5kbGVycztcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBZnRlciByZWdpc3RyYXRpb24sIHRoZSBoYW5kbGVyIGNhbiBiZSB1c2VkIGV2ZXJ5d2hlcmUgd2hlcmUgYSBzZWxlY3RvciBpc1xuICAgICAqIGV4cGVjdGVkIGJ5IHByZXBlbmRpbmcgdGhlIHNlbGVjdGlvbiBzdHJpbmcgd2l0aCBgPG5hbWU+L2AuIFRoZSBuYW1lIGlzIG9ubHlcbiAgICAgKiBhbGxvd2VkIHRvIGNvbnNpc3Qgb2YgbG93ZXItIGFuZCB1cHBlciBjYXNlIGxhdGluIGxldHRlcnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogcHVwcGV0ZWVyLnJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyKCd0ZXh0JywgeyDigKYgfSk7XG4gICAgICogY29uc3QgYUhhbmRsZSA9IGF3YWl0IHBhZ2UuJCgndGV4dC/igKYnKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgdGhhdCB0aGUgY3VzdG9tIHF1ZXJ5IGhhbmRsZXIgd2lsbCBiZSByZWdpc3RlcmVkXG4gICAgICogdW5kZXIuXG4gICAgICogQHBhcmFtIHF1ZXJ5SGFuZGxlciAtIFRoZSB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJ9XG4gICAgICogdG8gcmVnaXN0ZXIuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyKG5hbWUsIHF1ZXJ5SGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKG5hbWUsIHF1ZXJ5SGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIHF1ZXJ5IGhhbmRsZXIgZm9yIGEgZ2l2ZW4gbmFtZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdW5yZWdpc3RlckN1c3RvbVF1ZXJ5SGFuZGxlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVF1ZXJ5SGFuZGxlcnMudW5yZWdpc3RlcihuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIGN1c3RvbSBxdWVyeSBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3VzdG9tUXVlcnlIYW5kbGVyTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVF1ZXJ5SGFuZGxlcnMubmFtZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgYWxsIGN1c3RvbSBxdWVyeSBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBzdGF0aWMgY2xlYXJDdXN0b21RdWVyeUhhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21RdWVyeUhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9pc1B1cHBldGVlckNvcmU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2NoYW5nZWRQcm9kdWN0ID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5faXNQdXBwZXRlZXJDb3JlID0gc2V0dGluZ3MuaXNQdXBwZXRlZXJDb3JlO1xuICAgICAgICB0aGlzLmNvbm5lY3QgPSB0aGlzLmNvbm5lY3QuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgYXR0YWNoZXMgUHVwcGV0ZWVyIHRvIGFuIGV4aXN0aW5nIGJyb3dzZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTZXQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMgdG8gc2V0IG9uIHRoZSBicm93c2VyLlxuICAgICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gYnJvd3NlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25uZWN0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9jb25uZWN0VG9Ccm93c2VyKG9wdGlvbnMpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVB1cHBldGVlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbmltcG9ydCB7IF9pc0VsZW1lbnRIYW5kbGUgfSBmcm9tICcuLi9hcGkvRWxlbWVudEhhbmRsZVN5bWJvbC5qcyc7XG5pbXBvcnQgeyBpc0Vycm9yTGlrZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IGludGVycG9sYXRlRnVuY3Rpb24sIHN0cmluZ2lmeUZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbC9GdW5jdGlvbi5qcyc7XG5pbXBvcnQgeyB0cmFuc3Bvc2VJdGVyYWJsZUhhbmRsZSB9IGZyb20gJy4vSGFuZGxlSXRlcmF0b3IuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4vTGF6eUFyZy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgUXVlcnlIYW5kbGVyIHtcbiAgICAvLyBFaXRoZXIgb25lIG9mIHRoZXNlIG1heSBiZSBpbXBsZW1lbnRlZCwgYnV0IGF0IGxlYXN0IG9uZSBtdXN0IGJlLlxuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yQWxsO1xuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yO1xuICAgIHN0YXRpYyBnZXQgX3F1ZXJ5U2VsZWN0b3IoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5U2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBkZWZhdWx0IGBxdWVyeVNlbGVjdG9yYC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMucXVlcnlTZWxlY3RvciA9IGludGVycG9sYXRlRnVuY3Rpb24oYXN5bmMgKG5vZGUsIHNlbGVjdG9yLCBQdXBwZXRlZXJVdGlsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVNlbGVjdG9yQWxsID0gUExBQ0VIT0xERVIoJ3F1ZXJ5U2VsZWN0b3JBbGwnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBxdWVyeVNlbGVjdG9yQWxsKG5vZGUsIHNlbGVjdG9yLCBQdXBwZXRlZXJVdGlsKTtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHF1ZXJ5U2VsZWN0b3JBbGw6IHN0cmluZ2lmeUZ1bmN0aW9uKHRoaXMucXVlcnlTZWxlY3RvckFsbCksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBfcXVlcnlTZWxlY3RvckFsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucXVlcnlTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGRlZmF1bHQgYHF1ZXJ5U2VsZWN0b3JBbGxgLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodGhpcy5xdWVyeVNlbGVjdG9yQWxsID0gaW50ZXJwb2xhdGVGdW5jdGlvbihhc3luYyBmdW5jdGlvbiogKG5vZGUsIHNlbGVjdG9yLCBQdXBwZXRlZXJVdGlsKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVNlbGVjdG9yID0gUExBQ0VIT0xERVIoJ3F1ZXJ5U2VsZWN0b3InKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5U2VsZWN0b3Iobm9kZSwgc2VsZWN0b3IsIFB1cHBldGVlclV0aWwpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgcXVlcnlTZWxlY3Rvcjogc3RyaW5naWZ5RnVuY3Rpb24odGhpcy5xdWVyeVNlbGVjdG9yKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIGZvciBtdWx0aXBsZSBub2RlcyBnaXZlbiBhIHNlbGVjdG9yIGFuZCB7QGxpbmsgRWxlbWVudEhhbmRsZX0uXG4gICAgICpcbiAgICAgKiBBa2luIHRvIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvcXVlcnlTZWxlY3RvckFsbCB8IERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoKX0uXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jICpxdWVyeUFsbChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICBjb25zdCBlbnZfMSA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBhd2FpdCBlbGVtZW50LmV2YWx1YXRlSGFuZGxlKHRoaXMuX3F1ZXJ5U2VsZWN0b3JBbGwsIHNlbGVjdG9yLCBMYXp5QXJnLmNyZWF0ZShjb250ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgfSkpLCBmYWxzZSk7XG4gICAgICAgICAgICB5aWVsZCogdHJhbnNwb3NlSXRlcmFibGVIYW5kbGUoaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUXVlcmllcyBmb3IgYSBzaW5nbGUgbm9kZSBnaXZlbiBhIHNlbGVjdG9yIGFuZCB7QGxpbmsgRWxlbWVudEhhbmRsZX0uXG4gICAgICpcbiAgICAgKiBBa2luIHRvIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvcXVlcnlTZWxlY3Rvcn0uXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHF1ZXJ5T25lKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzIsIGF3YWl0IGVsZW1lbnQuZXZhbHVhdGVIYW5kbGUodGhpcy5fcXVlcnlTZWxlY3Rvciwgc2VsZWN0b3IsIExhenlBcmcuY3JlYXRlKGNvbnRleHQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnB1cHBldGVlclV0aWw7XG4gICAgICAgICAgICB9KSksIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghKF9pc0VsZW1lbnRIYW5kbGUgaW4gcmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzI7XG4gICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdhaXRzIHVudGlsIGEgc2luZ2xlIG5vZGUgYXBwZWFycyBmb3IgYSBnaXZlbiBzZWxlY3RvciBhbmRcbiAgICAgKiB7QGxpbmsgRWxlbWVudEhhbmRsZX0uXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIHF1ZXJ5IHRoZSBoYW5kbGUgaW4gdGhlIFB1cHBldGVlciB3b3JsZCBhbmQgbWlncmF0ZSB0aGVcbiAgICAgKiByZXN1bHQgdG8gdGhlIG1haW4gd29ybGQuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHdhaXRGb3IoZWxlbWVudE9yRnJhbWUsIHNlbGVjdG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGZyYW1lO1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8zLCBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKF9pc0VsZW1lbnRIYW5kbGUgaW4gZWxlbWVudE9yRnJhbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyYW1lID0gZWxlbWVudE9yRnJhbWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnJhbWUgPSBlbGVtZW50T3JGcmFtZS5mcmFtZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZnJhbWUuaXNvbGF0ZWRSZWFsbSgpLmFkb3B0SGFuZGxlKGVsZW1lbnRPckZyYW1lKTtcbiAgICAgICAgICAgIH0pKCksIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmlzaWJsZSA9IGZhbHNlLCBoaWRkZW4gPSBmYWxzZSwgdGltZW91dCwgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgcG9sbGluZyA9IG9wdGlvbnMucG9sbGluZyA/P1xuICAgICAgICAgICAgICAgICh2aXNpYmxlIHx8IGhpZGRlbiA/IFwicmFmXCIgLyogUG9sbGluZ09wdGlvbnMuUkFGICovIDogXCJtdXRhdGlvblwiIC8qIFBvbGxpbmdPcHRpb25zLk1VVEFUSU9OICovKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52XzQgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfNCwgYXdhaXQgZnJhbWUuaXNvbGF0ZWRSZWFsbSgpLndhaXRGb3JGdW5jdGlvbihhc3luYyAoUHVwcGV0ZWVyVXRpbCwgcXVlcnksIHNlbGVjdG9yLCByb290LCB2aXNpYmxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVNlbGVjdG9yID0gUHVwcGV0ZWVyVXRpbC5jcmVhdGVGdW5jdGlvbihxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gYXdhaXQgcXVlcnlTZWxlY3Rvcihyb290ID8/IGRvY3VtZW50LCBzZWxlY3RvciwgUHVwcGV0ZWVyVXRpbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHVwcGV0ZWVyVXRpbC5jaGVja1Zpc2liaWxpdHkobm9kZSwgdmlzaWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvbGxpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICByb290OiBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgfSwgTGF6eUFyZy5jcmVhdGUoY29udGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgICAgICAgICB9KSwgc3RyaW5naWZ5RnVuY3Rpb24odGhpcy5fcXVlcnlTZWxlY3RvciksIHNlbGVjdG9yLCBlbGVtZW50LCB2aXNpYmxlID8gdHJ1ZSA6IGhpZGRlbiA/IGZhbHNlIDogdW5kZWZpbmVkKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzaWduYWwucmVhc29uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghKF9pc0VsZW1lbnRIYW5kbGUgaW4gaGFuZGxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZyYW1lLm1haW5SZWFsbSgpLnRyYW5zZmVySGFuZGxlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzMpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52XzQuZXJyb3IgPSBlXzM7XG4gICAgICAgICAgICAgICAgICAgIGVudl80Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0Vycm9yTGlrZShlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPSBgV2FpdGluZyBmb3Igc2VsZWN0b3IgXFxgJHtzZWxlY3Rvcn1cXGAgZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV80KSB7XG4gICAgICAgICAgICBlbnZfMy5lcnJvciA9IGVfNDtcbiAgICAgICAgICAgIGVudl8zLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjQgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IHNvdXJjZSBhcyBpbmplY3RlZFNvdXJjZSB9IGZyb20gJy4uL2dlbmVyYXRlZC9pbmplY3RlZC5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgU2NyaXB0SW5qZWN0b3Ige1xuICAgICN1cGRhdGVkID0gZmFsc2U7XG4gICAgI2FtZW5kbWVudHMgPSBuZXcgU2V0KCk7XG4gICAgLy8gQXBwZW5kcyBhIHN0YXRlbWVudCBvZiB0aGUgZm9ybSBgKFB1cHBldGVlclV0aWwpID0+IHsuLi59YC5cbiAgICBhcHBlbmQoc3RhdGVtZW50KSB7XG4gICAgICAgIHRoaXMuI3VwZGF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNhbWVuZG1lbnRzLmFkZChzdGF0ZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9wKHN0YXRlbWVudCkge1xuICAgICAgICB0aGlzLiN1cGRhdGUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jYW1lbmRtZW50cy5kZWxldGUoc3RhdGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGluamVjdChpbmplY3QsIGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuI3VwZGF0ZWQgfHwgZm9yY2UpIHtcbiAgICAgICAgICAgIGluamVjdCh0aGlzLiNnZXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jdXBkYXRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAjdXBkYXRlKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuI3VwZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICAjZ2V0KCkge1xuICAgICAgICByZXR1cm4gYCgoKSA9PiB7XG4gICAgICBjb25zdCBtb2R1bGUgPSB7fTtcbiAgICAgICR7aW5qZWN0ZWRTb3VyY2V9XG4gICAgICAke1suLi50aGlzLiNhbWVuZG1lbnRzXVxuICAgICAgICAgICAgLm1hcChzdGF0ZW1lbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAoJHtzdGF0ZW1lbnR9KShtb2R1bGUuZXhwb3J0cy5kZWZhdWx0KTtgO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJycpfVxuICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzLmRlZmF1bHQ7XG4gICAgfSkoKWA7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHNjcmlwdEluamVjdG9yID0gbmV3IFNjcmlwdEluamVjdG9yKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY3JpcHRJbmplY3Rvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgU2VjdXJpdHlEZXRhaWxzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHNlY3VyaXR5IGRldGFpbHMgb2YgYVxuICogcmVzcG9uc2UgdGhhdCB3YXMgcmVjZWl2ZWQgb3ZlciBhIHNlY3VyZSBjb25uZWN0aW9uLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3VyaXR5RGV0YWlscyB7XG4gICAgI3N1YmplY3ROYW1lO1xuICAgICNpc3N1ZXI7XG4gICAgI3ZhbGlkRnJvbTtcbiAgICAjdmFsaWRUbztcbiAgICAjcHJvdG9jb2w7XG4gICAgI3Nhbkxpc3Q7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2VjdXJpdHlQYXlsb2FkKSB7XG4gICAgICAgIHRoaXMuI3N1YmplY3ROYW1lID0gc2VjdXJpdHlQYXlsb2FkLnN1YmplY3ROYW1lO1xuICAgICAgICB0aGlzLiNpc3N1ZXIgPSBzZWN1cml0eVBheWxvYWQuaXNzdWVyO1xuICAgICAgICB0aGlzLiN2YWxpZEZyb20gPSBzZWN1cml0eVBheWxvYWQudmFsaWRGcm9tO1xuICAgICAgICB0aGlzLiN2YWxpZFRvID0gc2VjdXJpdHlQYXlsb2FkLnZhbGlkVG87XG4gICAgICAgIHRoaXMuI3Byb3RvY29sID0gc2VjdXJpdHlQYXlsb2FkLnByb3RvY29sO1xuICAgICAgICB0aGlzLiNzYW5MaXN0ID0gc2VjdXJpdHlQYXlsb2FkLnNhbkxpc3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpc3N1ZXIgb2YgdGhlIGNlcnRpZmljYXRlLlxuICAgICAqL1xuICAgIGlzc3VlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzc3VlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfdGltZSB8IFVuaXggdGltZXN0YW1wfVxuICAgICAqIG1hcmtpbmcgdGhlIHN0YXJ0IG9mIHRoZSBjZXJ0aWZpY2F0ZSdzIHZhbGlkaXR5LlxuICAgICAqL1xuICAgIHZhbGlkRnJvbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3ZhbGlkRnJvbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfdGltZSB8IFVuaXggdGltZXN0YW1wfVxuICAgICAqIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgY2VydGlmaWNhdGUncyB2YWxpZGl0eS5cbiAgICAgKi9cbiAgICB2YWxpZFRvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdmFsaWRUbztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHByb3RvY29sIGJlaW5nIHVzZWQsIGUuZy4gXCJUTFMgMS4yXCIuXG4gICAgICovXG4gICAgcHJvdG9jb2woKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm90b2NvbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QgdG8gd2hpY2ggdGhlIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQuXG4gICAgICovXG4gICAgc3ViamVjdE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdWJqZWN0TmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2Yge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N1YmplY3RfQWx0ZXJuYXRpdmVfTmFtZSB8IHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZXMgKFNBTnMpfSBvZiB0aGUgY2VydGlmaWNhdGUuXG4gICAgICovXG4gICAgc3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzYW5MaXN0O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNlY3VyaXR5RGV0YWlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tRdWV1ZSB7XG4gICAgI2NoYWluO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLiNjaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBwb3N0VGFzayh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI2NoYWluLnRoZW4odGFzayk7XG4gICAgICAgIHRoaXMuI2NoYWluID0gcmVzdWx0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFza1F1ZXVlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1F1ZXJ5SGFuZGxlci5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgVGV4dFF1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JBbGwgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgdGV4dFF1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICByZXR1cm4gdGV4dFF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UZXh0UXVlcnlIYW5kbGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSAzMDAwMDtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lb3V0U2V0dGluZ3Mge1xuICAgICNkZWZhdWx0VGltZW91dDtcbiAgICAjZGVmYXVsdE5hdmlnYXRpb25UaW1lb3V0O1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0VGltZW91dCA9IG51bGw7XG4gICAgICAgIHRoaXMuI2RlZmF1bHROYXZpZ2F0aW9uVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIHNldERlZmF1bHRUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy4jZGVmYXVsdFRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIH1cbiAgICBzZXREZWZhdWx0TmF2aWdhdGlvblRpbWVvdXQodGltZW91dCkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0TmF2aWdhdGlvblRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIH1cbiAgICBuYXZpZ2F0aW9uVGltZW91dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RlZmF1bHROYXZpZ2F0aW9uVGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHROYXZpZ2F0aW9uVGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jZGVmYXVsdFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0VGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gREVGQVVMVF9USU1FT1VUO1xuICAgIH1cbiAgICB0aW1lb3V0KCkge1xuICAgICAgICBpZiAodGhpcy4jZGVmYXVsdFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0VGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gREVGQVVMVF9USU1FT1VUO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRpbWVvdXRTZXR0aW5ncy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IF9rZXlEZWZpbml0aW9ucyA9IHtcbiAgICAnMCc6IHsga2V5Q29kZTogNDgsIGtleTogJzAnLCBjb2RlOiAnRGlnaXQwJyB9LFxuICAgICcxJzogeyBrZXlDb2RlOiA0OSwga2V5OiAnMScsIGNvZGU6ICdEaWdpdDEnIH0sXG4gICAgJzInOiB7IGtleUNvZGU6IDUwLCBrZXk6ICcyJywgY29kZTogJ0RpZ2l0MicgfSxcbiAgICAnMyc6IHsga2V5Q29kZTogNTEsIGtleTogJzMnLCBjb2RlOiAnRGlnaXQzJyB9LFxuICAgICc0JzogeyBrZXlDb2RlOiA1Miwga2V5OiAnNCcsIGNvZGU6ICdEaWdpdDQnIH0sXG4gICAgJzUnOiB7IGtleUNvZGU6IDUzLCBrZXk6ICc1JywgY29kZTogJ0RpZ2l0NScgfSxcbiAgICAnNic6IHsga2V5Q29kZTogNTQsIGtleTogJzYnLCBjb2RlOiAnRGlnaXQ2JyB9LFxuICAgICc3JzogeyBrZXlDb2RlOiA1NSwga2V5OiAnNycsIGNvZGU6ICdEaWdpdDcnIH0sXG4gICAgJzgnOiB7IGtleUNvZGU6IDU2LCBrZXk6ICc4JywgY29kZTogJ0RpZ2l0OCcgfSxcbiAgICAnOSc6IHsga2V5Q29kZTogNTcsIGtleTogJzknLCBjb2RlOiAnRGlnaXQ5JyB9LFxuICAgIFBvd2VyOiB7IGtleTogJ1Bvd2VyJywgY29kZTogJ1Bvd2VyJyB9LFxuICAgIEVqZWN0OiB7IGtleTogJ0VqZWN0JywgY29kZTogJ0VqZWN0JyB9LFxuICAgIEFib3J0OiB7IGtleUNvZGU6IDMsIGNvZGU6ICdBYm9ydCcsIGtleTogJ0NhbmNlbCcgfSxcbiAgICBIZWxwOiB7IGtleUNvZGU6IDYsIGNvZGU6ICdIZWxwJywga2V5OiAnSGVscCcgfSxcbiAgICBCYWNrc3BhY2U6IHsga2V5Q29kZTogOCwgY29kZTogJ0JhY2tzcGFjZScsIGtleTogJ0JhY2tzcGFjZScgfSxcbiAgICBUYWI6IHsga2V5Q29kZTogOSwgY29kZTogJ1RhYicsIGtleTogJ1RhYicgfSxcbiAgICBOdW1wYWQ1OiB7XG4gICAgICAgIGtleUNvZGU6IDEyLFxuICAgICAgICBzaGlmdEtleUNvZGU6IDEwMSxcbiAgICAgICAga2V5OiAnQ2xlYXInLFxuICAgICAgICBjb2RlOiAnTnVtcGFkNScsXG4gICAgICAgIHNoaWZ0S2V5OiAnNScsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkRW50ZXI6IHtcbiAgICAgICAga2V5Q29kZTogMTMsXG4gICAgICAgIGNvZGU6ICdOdW1wYWRFbnRlcicsXG4gICAgICAgIGtleTogJ0VudGVyJyxcbiAgICAgICAgdGV4dDogJ1xccicsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgRW50ZXI6IHsga2V5Q29kZTogMTMsIGNvZGU6ICdFbnRlcicsIGtleTogJ0VudGVyJywgdGV4dDogJ1xccicgfSxcbiAgICAnXFxyJzogeyBrZXlDb2RlOiAxMywgY29kZTogJ0VudGVyJywga2V5OiAnRW50ZXInLCB0ZXh0OiAnXFxyJyB9LFxuICAgICdcXG4nOiB7IGtleUNvZGU6IDEzLCBjb2RlOiAnRW50ZXInLCBrZXk6ICdFbnRlcicsIHRleHQ6ICdcXHInIH0sXG4gICAgU2hpZnRMZWZ0OiB7IGtleUNvZGU6IDE2LCBjb2RlOiAnU2hpZnRMZWZ0Jywga2V5OiAnU2hpZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIFNoaWZ0UmlnaHQ6IHsga2V5Q29kZTogMTYsIGNvZGU6ICdTaGlmdFJpZ2h0Jywga2V5OiAnU2hpZnQnLCBsb2NhdGlvbjogMiB9LFxuICAgIENvbnRyb2xMZWZ0OiB7XG4gICAgICAgIGtleUNvZGU6IDE3LFxuICAgICAgICBjb2RlOiAnQ29udHJvbExlZnQnLFxuICAgICAgICBrZXk6ICdDb250cm9sJyxcbiAgICAgICAgbG9jYXRpb246IDEsXG4gICAgfSxcbiAgICBDb250cm9sUmlnaHQ6IHtcbiAgICAgICAga2V5Q29kZTogMTcsXG4gICAgICAgIGNvZGU6ICdDb250cm9sUmlnaHQnLFxuICAgICAgICBrZXk6ICdDb250cm9sJyxcbiAgICAgICAgbG9jYXRpb246IDIsXG4gICAgfSxcbiAgICBBbHRMZWZ0OiB7IGtleUNvZGU6IDE4LCBjb2RlOiAnQWx0TGVmdCcsIGtleTogJ0FsdCcsIGxvY2F0aW9uOiAxIH0sXG4gICAgQWx0UmlnaHQ6IHsga2V5Q29kZTogMTgsIGNvZGU6ICdBbHRSaWdodCcsIGtleTogJ0FsdCcsIGxvY2F0aW9uOiAyIH0sXG4gICAgUGF1c2U6IHsga2V5Q29kZTogMTksIGNvZGU6ICdQYXVzZScsIGtleTogJ1BhdXNlJyB9LFxuICAgIENhcHNMb2NrOiB7IGtleUNvZGU6IDIwLCBjb2RlOiAnQ2Fwc0xvY2snLCBrZXk6ICdDYXBzTG9jaycgfSxcbiAgICBFc2NhcGU6IHsga2V5Q29kZTogMjcsIGNvZGU6ICdFc2NhcGUnLCBrZXk6ICdFc2NhcGUnIH0sXG4gICAgQ29udmVydDogeyBrZXlDb2RlOiAyOCwgY29kZTogJ0NvbnZlcnQnLCBrZXk6ICdDb252ZXJ0JyB9LFxuICAgIE5vbkNvbnZlcnQ6IHsga2V5Q29kZTogMjksIGNvZGU6ICdOb25Db252ZXJ0Jywga2V5OiAnTm9uQ29udmVydCcgfSxcbiAgICBTcGFjZTogeyBrZXlDb2RlOiAzMiwgY29kZTogJ1NwYWNlJywga2V5OiAnICcgfSxcbiAgICBOdW1wYWQ5OiB7XG4gICAgICAgIGtleUNvZGU6IDMzLFxuICAgICAgICBzaGlmdEtleUNvZGU6IDEwNSxcbiAgICAgICAga2V5OiAnUGFnZVVwJyxcbiAgICAgICAgY29kZTogJ051bXBhZDknLFxuICAgICAgICBzaGlmdEtleTogJzknLFxuICAgICAgICBsb2NhdGlvbjogMyxcbiAgICB9LFxuICAgIFBhZ2VVcDogeyBrZXlDb2RlOiAzMywgY29kZTogJ1BhZ2VVcCcsIGtleTogJ1BhZ2VVcCcgfSxcbiAgICBOdW1wYWQzOiB7XG4gICAgICAgIGtleUNvZGU6IDM0LFxuICAgICAgICBzaGlmdEtleUNvZGU6IDk5LFxuICAgICAgICBrZXk6ICdQYWdlRG93bicsXG4gICAgICAgIGNvZGU6ICdOdW1wYWQzJyxcbiAgICAgICAgc2hpZnRLZXk6ICczJyxcbiAgICAgICAgbG9jYXRpb246IDMsXG4gICAgfSxcbiAgICBQYWdlRG93bjogeyBrZXlDb2RlOiAzNCwgY29kZTogJ1BhZ2VEb3duJywga2V5OiAnUGFnZURvd24nIH0sXG4gICAgRW5kOiB7IGtleUNvZGU6IDM1LCBjb2RlOiAnRW5kJywga2V5OiAnRW5kJyB9LFxuICAgIE51bXBhZDE6IHtcbiAgICAgICAga2V5Q29kZTogMzUsXG4gICAgICAgIHNoaWZ0S2V5Q29kZTogOTcsXG4gICAgICAgIGtleTogJ0VuZCcsXG4gICAgICAgIGNvZGU6ICdOdW1wYWQxJyxcbiAgICAgICAgc2hpZnRLZXk6ICcxJyxcbiAgICAgICAgbG9jYXRpb246IDMsXG4gICAgfSxcbiAgICBIb21lOiB7IGtleUNvZGU6IDM2LCBjb2RlOiAnSG9tZScsIGtleTogJ0hvbWUnIH0sXG4gICAgTnVtcGFkNzoge1xuICAgICAgICBrZXlDb2RlOiAzNixcbiAgICAgICAgc2hpZnRLZXlDb2RlOiAxMDMsXG4gICAgICAgIGtleTogJ0hvbWUnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkNycsXG4gICAgICAgIHNoaWZ0S2V5OiAnNycsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgQXJyb3dMZWZ0OiB7IGtleUNvZGU6IDM3LCBjb2RlOiAnQXJyb3dMZWZ0Jywga2V5OiAnQXJyb3dMZWZ0JyB9LFxuICAgIE51bXBhZDQ6IHtcbiAgICAgICAga2V5Q29kZTogMzcsXG4gICAgICAgIHNoaWZ0S2V5Q29kZTogMTAwLFxuICAgICAgICBrZXk6ICdBcnJvd0xlZnQnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkNCcsXG4gICAgICAgIHNoaWZ0S2V5OiAnNCcsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkODoge1xuICAgICAgICBrZXlDb2RlOiAzOCxcbiAgICAgICAgc2hpZnRLZXlDb2RlOiAxMDQsXG4gICAgICAgIGtleTogJ0Fycm93VXAnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkOCcsXG4gICAgICAgIHNoaWZ0S2V5OiAnOCcsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgQXJyb3dVcDogeyBrZXlDb2RlOiAzOCwgY29kZTogJ0Fycm93VXAnLCBrZXk6ICdBcnJvd1VwJyB9LFxuICAgIEFycm93UmlnaHQ6IHsga2V5Q29kZTogMzksIGNvZGU6ICdBcnJvd1JpZ2h0Jywga2V5OiAnQXJyb3dSaWdodCcgfSxcbiAgICBOdW1wYWQ2OiB7XG4gICAgICAgIGtleUNvZGU6IDM5LFxuICAgICAgICBzaGlmdEtleUNvZGU6IDEwMixcbiAgICAgICAga2V5OiAnQXJyb3dSaWdodCcsXG4gICAgICAgIGNvZGU6ICdOdW1wYWQ2JyxcbiAgICAgICAgc2hpZnRLZXk6ICc2JyxcbiAgICAgICAgbG9jYXRpb246IDMsXG4gICAgfSxcbiAgICBOdW1wYWQyOiB7XG4gICAgICAgIGtleUNvZGU6IDQwLFxuICAgICAgICBzaGlmdEtleUNvZGU6IDk4LFxuICAgICAgICBrZXk6ICdBcnJvd0Rvd24nLFxuICAgICAgICBjb2RlOiAnTnVtcGFkMicsXG4gICAgICAgIHNoaWZ0S2V5OiAnMicsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgQXJyb3dEb3duOiB7IGtleUNvZGU6IDQwLCBjb2RlOiAnQXJyb3dEb3duJywga2V5OiAnQXJyb3dEb3duJyB9LFxuICAgIFNlbGVjdDogeyBrZXlDb2RlOiA0MSwgY29kZTogJ1NlbGVjdCcsIGtleTogJ1NlbGVjdCcgfSxcbiAgICBPcGVuOiB7IGtleUNvZGU6IDQzLCBjb2RlOiAnT3BlbicsIGtleTogJ0V4ZWN1dGUnIH0sXG4gICAgUHJpbnRTY3JlZW46IHsga2V5Q29kZTogNDQsIGNvZGU6ICdQcmludFNjcmVlbicsIGtleTogJ1ByaW50U2NyZWVuJyB9LFxuICAgIEluc2VydDogeyBrZXlDb2RlOiA0NSwgY29kZTogJ0luc2VydCcsIGtleTogJ0luc2VydCcgfSxcbiAgICBOdW1wYWQwOiB7XG4gICAgICAgIGtleUNvZGU6IDQ1LFxuICAgICAgICBzaGlmdEtleUNvZGU6IDk2LFxuICAgICAgICBrZXk6ICdJbnNlcnQnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkMCcsXG4gICAgICAgIHNoaWZ0S2V5OiAnMCcsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgRGVsZXRlOiB7IGtleUNvZGU6IDQ2LCBjb2RlOiAnRGVsZXRlJywga2V5OiAnRGVsZXRlJyB9LFxuICAgIE51bXBhZERlY2ltYWw6IHtcbiAgICAgICAga2V5Q29kZTogNDYsXG4gICAgICAgIHNoaWZ0S2V5Q29kZTogMTEwLFxuICAgICAgICBjb2RlOiAnTnVtcGFkRGVjaW1hbCcsXG4gICAgICAgIGtleTogJ1xcdTAwMDAnLFxuICAgICAgICBzaGlmdEtleTogJy4nLFxuICAgICAgICBsb2NhdGlvbjogMyxcbiAgICB9LFxuICAgIERpZ2l0MDogeyBrZXlDb2RlOiA0OCwgY29kZTogJ0RpZ2l0MCcsIHNoaWZ0S2V5OiAnKScsIGtleTogJzAnIH0sXG4gICAgRGlnaXQxOiB7IGtleUNvZGU6IDQ5LCBjb2RlOiAnRGlnaXQxJywgc2hpZnRLZXk6ICchJywga2V5OiAnMScgfSxcbiAgICBEaWdpdDI6IHsga2V5Q29kZTogNTAsIGNvZGU6ICdEaWdpdDInLCBzaGlmdEtleTogJ0AnLCBrZXk6ICcyJyB9LFxuICAgIERpZ2l0MzogeyBrZXlDb2RlOiA1MSwgY29kZTogJ0RpZ2l0MycsIHNoaWZ0S2V5OiAnIycsIGtleTogJzMnIH0sXG4gICAgRGlnaXQ0OiB7IGtleUNvZGU6IDUyLCBjb2RlOiAnRGlnaXQ0Jywgc2hpZnRLZXk6ICckJywga2V5OiAnNCcgfSxcbiAgICBEaWdpdDU6IHsga2V5Q29kZTogNTMsIGNvZGU6ICdEaWdpdDUnLCBzaGlmdEtleTogJyUnLCBrZXk6ICc1JyB9LFxuICAgIERpZ2l0NjogeyBrZXlDb2RlOiA1NCwgY29kZTogJ0RpZ2l0NicsIHNoaWZ0S2V5OiAnXicsIGtleTogJzYnIH0sXG4gICAgRGlnaXQ3OiB7IGtleUNvZGU6IDU1LCBjb2RlOiAnRGlnaXQ3Jywgc2hpZnRLZXk6ICcmJywga2V5OiAnNycgfSxcbiAgICBEaWdpdDg6IHsga2V5Q29kZTogNTYsIGNvZGU6ICdEaWdpdDgnLCBzaGlmdEtleTogJyonLCBrZXk6ICc4JyB9LFxuICAgIERpZ2l0OTogeyBrZXlDb2RlOiA1NywgY29kZTogJ0RpZ2l0OScsIHNoaWZ0S2V5OiAnKCcsIGtleTogJzknIH0sXG4gICAgS2V5QTogeyBrZXlDb2RlOiA2NSwgY29kZTogJ0tleUEnLCBzaGlmdEtleTogJ0EnLCBrZXk6ICdhJyB9LFxuICAgIEtleUI6IHsga2V5Q29kZTogNjYsIGNvZGU6ICdLZXlCJywgc2hpZnRLZXk6ICdCJywga2V5OiAnYicgfSxcbiAgICBLZXlDOiB7IGtleUNvZGU6IDY3LCBjb2RlOiAnS2V5QycsIHNoaWZ0S2V5OiAnQycsIGtleTogJ2MnIH0sXG4gICAgS2V5RDogeyBrZXlDb2RlOiA2OCwgY29kZTogJ0tleUQnLCBzaGlmdEtleTogJ0QnLCBrZXk6ICdkJyB9LFxuICAgIEtleUU6IHsga2V5Q29kZTogNjksIGNvZGU6ICdLZXlFJywgc2hpZnRLZXk6ICdFJywga2V5OiAnZScgfSxcbiAgICBLZXlGOiB7IGtleUNvZGU6IDcwLCBjb2RlOiAnS2V5RicsIHNoaWZ0S2V5OiAnRicsIGtleTogJ2YnIH0sXG4gICAgS2V5RzogeyBrZXlDb2RlOiA3MSwgY29kZTogJ0tleUcnLCBzaGlmdEtleTogJ0cnLCBrZXk6ICdnJyB9LFxuICAgIEtleUg6IHsga2V5Q29kZTogNzIsIGNvZGU6ICdLZXlIJywgc2hpZnRLZXk6ICdIJywga2V5OiAnaCcgfSxcbiAgICBLZXlJOiB7IGtleUNvZGU6IDczLCBjb2RlOiAnS2V5SScsIHNoaWZ0S2V5OiAnSScsIGtleTogJ2knIH0sXG4gICAgS2V5SjogeyBrZXlDb2RlOiA3NCwgY29kZTogJ0tleUonLCBzaGlmdEtleTogJ0onLCBrZXk6ICdqJyB9LFxuICAgIEtleUs6IHsga2V5Q29kZTogNzUsIGNvZGU6ICdLZXlLJywgc2hpZnRLZXk6ICdLJywga2V5OiAnaycgfSxcbiAgICBLZXlMOiB7IGtleUNvZGU6IDc2LCBjb2RlOiAnS2V5TCcsIHNoaWZ0S2V5OiAnTCcsIGtleTogJ2wnIH0sXG4gICAgS2V5TTogeyBrZXlDb2RlOiA3NywgY29kZTogJ0tleU0nLCBzaGlmdEtleTogJ00nLCBrZXk6ICdtJyB9LFxuICAgIEtleU46IHsga2V5Q29kZTogNzgsIGNvZGU6ICdLZXlOJywgc2hpZnRLZXk6ICdOJywga2V5OiAnbicgfSxcbiAgICBLZXlPOiB7IGtleUNvZGU6IDc5LCBjb2RlOiAnS2V5TycsIHNoaWZ0S2V5OiAnTycsIGtleTogJ28nIH0sXG4gICAgS2V5UDogeyBrZXlDb2RlOiA4MCwgY29kZTogJ0tleVAnLCBzaGlmdEtleTogJ1AnLCBrZXk6ICdwJyB9LFxuICAgIEtleVE6IHsga2V5Q29kZTogODEsIGNvZGU6ICdLZXlRJywgc2hpZnRLZXk6ICdRJywga2V5OiAncScgfSxcbiAgICBLZXlSOiB7IGtleUNvZGU6IDgyLCBjb2RlOiAnS2V5UicsIHNoaWZ0S2V5OiAnUicsIGtleTogJ3InIH0sXG4gICAgS2V5UzogeyBrZXlDb2RlOiA4MywgY29kZTogJ0tleVMnLCBzaGlmdEtleTogJ1MnLCBrZXk6ICdzJyB9LFxuICAgIEtleVQ6IHsga2V5Q29kZTogODQsIGNvZGU6ICdLZXlUJywgc2hpZnRLZXk6ICdUJywga2V5OiAndCcgfSxcbiAgICBLZXlVOiB7IGtleUNvZGU6IDg1LCBjb2RlOiAnS2V5VScsIHNoaWZ0S2V5OiAnVScsIGtleTogJ3UnIH0sXG4gICAgS2V5VjogeyBrZXlDb2RlOiA4NiwgY29kZTogJ0tleVYnLCBzaGlmdEtleTogJ1YnLCBrZXk6ICd2JyB9LFxuICAgIEtleVc6IHsga2V5Q29kZTogODcsIGNvZGU6ICdLZXlXJywgc2hpZnRLZXk6ICdXJywga2V5OiAndycgfSxcbiAgICBLZXlYOiB7IGtleUNvZGU6IDg4LCBjb2RlOiAnS2V5WCcsIHNoaWZ0S2V5OiAnWCcsIGtleTogJ3gnIH0sXG4gICAgS2V5WTogeyBrZXlDb2RlOiA4OSwgY29kZTogJ0tleVknLCBzaGlmdEtleTogJ1knLCBrZXk6ICd5JyB9LFxuICAgIEtleVo6IHsga2V5Q29kZTogOTAsIGNvZGU6ICdLZXlaJywgc2hpZnRLZXk6ICdaJywga2V5OiAneicgfSxcbiAgICBNZXRhTGVmdDogeyBrZXlDb2RlOiA5MSwgY29kZTogJ01ldGFMZWZ0Jywga2V5OiAnTWV0YScsIGxvY2F0aW9uOiAxIH0sXG4gICAgTWV0YVJpZ2h0OiB7IGtleUNvZGU6IDkyLCBjb2RlOiAnTWV0YVJpZ2h0Jywga2V5OiAnTWV0YScsIGxvY2F0aW9uOiAyIH0sXG4gICAgQ29udGV4dE1lbnU6IHsga2V5Q29kZTogOTMsIGNvZGU6ICdDb250ZXh0TWVudScsIGtleTogJ0NvbnRleHRNZW51JyB9LFxuICAgIE51bXBhZE11bHRpcGx5OiB7XG4gICAgICAgIGtleUNvZGU6IDEwNixcbiAgICAgICAgY29kZTogJ051bXBhZE11bHRpcGx5JyxcbiAgICAgICAga2V5OiAnKicsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkQWRkOiB7IGtleUNvZGU6IDEwNywgY29kZTogJ051bXBhZEFkZCcsIGtleTogJysnLCBsb2NhdGlvbjogMyB9LFxuICAgIE51bXBhZFN1YnRyYWN0OiB7XG4gICAgICAgIGtleUNvZGU6IDEwOSxcbiAgICAgICAgY29kZTogJ051bXBhZFN1YnRyYWN0JyxcbiAgICAgICAga2V5OiAnLScsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkRGl2aWRlOiB7IGtleUNvZGU6IDExMSwgY29kZTogJ051bXBhZERpdmlkZScsIGtleTogJy8nLCBsb2NhdGlvbjogMyB9LFxuICAgIEYxOiB7IGtleUNvZGU6IDExMiwgY29kZTogJ0YxJywga2V5OiAnRjEnIH0sXG4gICAgRjI6IHsga2V5Q29kZTogMTEzLCBjb2RlOiAnRjInLCBrZXk6ICdGMicgfSxcbiAgICBGMzogeyBrZXlDb2RlOiAxMTQsIGNvZGU6ICdGMycsIGtleTogJ0YzJyB9LFxuICAgIEY0OiB7IGtleUNvZGU6IDExNSwgY29kZTogJ0Y0Jywga2V5OiAnRjQnIH0sXG4gICAgRjU6IHsga2V5Q29kZTogMTE2LCBjb2RlOiAnRjUnLCBrZXk6ICdGNScgfSxcbiAgICBGNjogeyBrZXlDb2RlOiAxMTcsIGNvZGU6ICdGNicsIGtleTogJ0Y2JyB9LFxuICAgIEY3OiB7IGtleUNvZGU6IDExOCwgY29kZTogJ0Y3Jywga2V5OiAnRjcnIH0sXG4gICAgRjg6IHsga2V5Q29kZTogMTE5LCBjb2RlOiAnRjgnLCBrZXk6ICdGOCcgfSxcbiAgICBGOTogeyBrZXlDb2RlOiAxMjAsIGNvZGU6ICdGOScsIGtleTogJ0Y5JyB9LFxuICAgIEYxMDogeyBrZXlDb2RlOiAxMjEsIGNvZGU6ICdGMTAnLCBrZXk6ICdGMTAnIH0sXG4gICAgRjExOiB7IGtleUNvZGU6IDEyMiwgY29kZTogJ0YxMScsIGtleTogJ0YxMScgfSxcbiAgICBGMTI6IHsga2V5Q29kZTogMTIzLCBjb2RlOiAnRjEyJywga2V5OiAnRjEyJyB9LFxuICAgIEYxMzogeyBrZXlDb2RlOiAxMjQsIGNvZGU6ICdGMTMnLCBrZXk6ICdGMTMnIH0sXG4gICAgRjE0OiB7IGtleUNvZGU6IDEyNSwgY29kZTogJ0YxNCcsIGtleTogJ0YxNCcgfSxcbiAgICBGMTU6IHsga2V5Q29kZTogMTI2LCBjb2RlOiAnRjE1Jywga2V5OiAnRjE1JyB9LFxuICAgIEYxNjogeyBrZXlDb2RlOiAxMjcsIGNvZGU6ICdGMTYnLCBrZXk6ICdGMTYnIH0sXG4gICAgRjE3OiB7IGtleUNvZGU6IDEyOCwgY29kZTogJ0YxNycsIGtleTogJ0YxNycgfSxcbiAgICBGMTg6IHsga2V5Q29kZTogMTI5LCBjb2RlOiAnRjE4Jywga2V5OiAnRjE4JyB9LFxuICAgIEYxOTogeyBrZXlDb2RlOiAxMzAsIGNvZGU6ICdGMTknLCBrZXk6ICdGMTknIH0sXG4gICAgRjIwOiB7IGtleUNvZGU6IDEzMSwgY29kZTogJ0YyMCcsIGtleTogJ0YyMCcgfSxcbiAgICBGMjE6IHsga2V5Q29kZTogMTMyLCBjb2RlOiAnRjIxJywga2V5OiAnRjIxJyB9LFxuICAgIEYyMjogeyBrZXlDb2RlOiAxMzMsIGNvZGU6ICdGMjInLCBrZXk6ICdGMjInIH0sXG4gICAgRjIzOiB7IGtleUNvZGU6IDEzNCwgY29kZTogJ0YyMycsIGtleTogJ0YyMycgfSxcbiAgICBGMjQ6IHsga2V5Q29kZTogMTM1LCBjb2RlOiAnRjI0Jywga2V5OiAnRjI0JyB9LFxuICAgIE51bUxvY2s6IHsga2V5Q29kZTogMTQ0LCBjb2RlOiAnTnVtTG9jaycsIGtleTogJ051bUxvY2snIH0sXG4gICAgU2Nyb2xsTG9jazogeyBrZXlDb2RlOiAxNDUsIGNvZGU6ICdTY3JvbGxMb2NrJywga2V5OiAnU2Nyb2xsTG9jaycgfSxcbiAgICBBdWRpb1ZvbHVtZU11dGU6IHtcbiAgICAgICAga2V5Q29kZTogMTczLFxuICAgICAgICBjb2RlOiAnQXVkaW9Wb2x1bWVNdXRlJyxcbiAgICAgICAga2V5OiAnQXVkaW9Wb2x1bWVNdXRlJyxcbiAgICB9LFxuICAgIEF1ZGlvVm9sdW1lRG93bjoge1xuICAgICAgICBrZXlDb2RlOiAxNzQsXG4gICAgICAgIGNvZGU6ICdBdWRpb1ZvbHVtZURvd24nLFxuICAgICAgICBrZXk6ICdBdWRpb1ZvbHVtZURvd24nLFxuICAgIH0sXG4gICAgQXVkaW9Wb2x1bWVVcDogeyBrZXlDb2RlOiAxNzUsIGNvZGU6ICdBdWRpb1ZvbHVtZVVwJywga2V5OiAnQXVkaW9Wb2x1bWVVcCcgfSxcbiAgICBNZWRpYVRyYWNrTmV4dDoge1xuICAgICAgICBrZXlDb2RlOiAxNzYsXG4gICAgICAgIGNvZGU6ICdNZWRpYVRyYWNrTmV4dCcsXG4gICAgICAgIGtleTogJ01lZGlhVHJhY2tOZXh0JyxcbiAgICB9LFxuICAgIE1lZGlhVHJhY2tQcmV2aW91czoge1xuICAgICAgICBrZXlDb2RlOiAxNzcsXG4gICAgICAgIGNvZGU6ICdNZWRpYVRyYWNrUHJldmlvdXMnLFxuICAgICAgICBrZXk6ICdNZWRpYVRyYWNrUHJldmlvdXMnLFxuICAgIH0sXG4gICAgTWVkaWFTdG9wOiB7IGtleUNvZGU6IDE3OCwgY29kZTogJ01lZGlhU3RvcCcsIGtleTogJ01lZGlhU3RvcCcgfSxcbiAgICBNZWRpYVBsYXlQYXVzZToge1xuICAgICAgICBrZXlDb2RlOiAxNzksXG4gICAgICAgIGNvZGU6ICdNZWRpYVBsYXlQYXVzZScsXG4gICAgICAgIGtleTogJ01lZGlhUGxheVBhdXNlJyxcbiAgICB9LFxuICAgIFNlbWljb2xvbjogeyBrZXlDb2RlOiAxODYsIGNvZGU6ICdTZW1pY29sb24nLCBzaGlmdEtleTogJzonLCBrZXk6ICc7JyB9LFxuICAgIEVxdWFsOiB7IGtleUNvZGU6IDE4NywgY29kZTogJ0VxdWFsJywgc2hpZnRLZXk6ICcrJywga2V5OiAnPScgfSxcbiAgICBOdW1wYWRFcXVhbDogeyBrZXlDb2RlOiAxODcsIGNvZGU6ICdOdW1wYWRFcXVhbCcsIGtleTogJz0nLCBsb2NhdGlvbjogMyB9LFxuICAgIENvbW1hOiB7IGtleUNvZGU6IDE4OCwgY29kZTogJ0NvbW1hJywgc2hpZnRLZXk6ICc8Jywga2V5OiAnLCcgfSxcbiAgICBNaW51czogeyBrZXlDb2RlOiAxODksIGNvZGU6ICdNaW51cycsIHNoaWZ0S2V5OiAnXycsIGtleTogJy0nIH0sXG4gICAgUGVyaW9kOiB7IGtleUNvZGU6IDE5MCwgY29kZTogJ1BlcmlvZCcsIHNoaWZ0S2V5OiAnPicsIGtleTogJy4nIH0sXG4gICAgU2xhc2g6IHsga2V5Q29kZTogMTkxLCBjb2RlOiAnU2xhc2gnLCBzaGlmdEtleTogJz8nLCBrZXk6ICcvJyB9LFxuICAgIEJhY2txdW90ZTogeyBrZXlDb2RlOiAxOTIsIGNvZGU6ICdCYWNrcXVvdGUnLCBzaGlmdEtleTogJ34nLCBrZXk6ICdgJyB9LFxuICAgIEJyYWNrZXRMZWZ0OiB7IGtleUNvZGU6IDIxOSwgY29kZTogJ0JyYWNrZXRMZWZ0Jywgc2hpZnRLZXk6ICd7Jywga2V5OiAnWycgfSxcbiAgICBCYWNrc2xhc2g6IHsga2V5Q29kZTogMjIwLCBjb2RlOiAnQmFja3NsYXNoJywgc2hpZnRLZXk6ICd8Jywga2V5OiAnXFxcXCcgfSxcbiAgICBCcmFja2V0UmlnaHQ6IHsga2V5Q29kZTogMjIxLCBjb2RlOiAnQnJhY2tldFJpZ2h0Jywgc2hpZnRLZXk6ICd9Jywga2V5OiAnXScgfSxcbiAgICBRdW90ZTogeyBrZXlDb2RlOiAyMjIsIGNvZGU6ICdRdW90ZScsIHNoaWZ0S2V5OiAnXCInLCBrZXk6IFwiJ1wiIH0sXG4gICAgQWx0R3JhcGg6IHsga2V5Q29kZTogMjI1LCBjb2RlOiAnQWx0R3JhcGgnLCBrZXk6ICdBbHRHcmFwaCcgfSxcbiAgICBQcm9wczogeyBrZXlDb2RlOiAyNDcsIGNvZGU6ICdQcm9wcycsIGtleTogJ0NyU2VsJyB9LFxuICAgIENhbmNlbDogeyBrZXlDb2RlOiAzLCBrZXk6ICdDYW5jZWwnLCBjb2RlOiAnQWJvcnQnIH0sXG4gICAgQ2xlYXI6IHsga2V5Q29kZTogMTIsIGtleTogJ0NsZWFyJywgY29kZTogJ051bXBhZDUnLCBsb2NhdGlvbjogMyB9LFxuICAgIFNoaWZ0OiB7IGtleUNvZGU6IDE2LCBrZXk6ICdTaGlmdCcsIGNvZGU6ICdTaGlmdExlZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIENvbnRyb2w6IHsga2V5Q29kZTogMTcsIGtleTogJ0NvbnRyb2wnLCBjb2RlOiAnQ29udHJvbExlZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIEFsdDogeyBrZXlDb2RlOiAxOCwga2V5OiAnQWx0JywgY29kZTogJ0FsdExlZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIEFjY2VwdDogeyBrZXlDb2RlOiAzMCwga2V5OiAnQWNjZXB0JyB9LFxuICAgIE1vZGVDaGFuZ2U6IHsga2V5Q29kZTogMzEsIGtleTogJ01vZGVDaGFuZ2UnIH0sXG4gICAgJyAnOiB7IGtleUNvZGU6IDMyLCBrZXk6ICcgJywgY29kZTogJ1NwYWNlJyB9LFxuICAgIFByaW50OiB7IGtleUNvZGU6IDQyLCBrZXk6ICdQcmludCcgfSxcbiAgICBFeGVjdXRlOiB7IGtleUNvZGU6IDQzLCBrZXk6ICdFeGVjdXRlJywgY29kZTogJ09wZW4nIH0sXG4gICAgJ1xcdTAwMDAnOiB7IGtleUNvZGU6IDQ2LCBrZXk6ICdcXHUwMDAwJywgY29kZTogJ051bXBhZERlY2ltYWwnLCBsb2NhdGlvbjogMyB9LFxuICAgIGE6IHsga2V5Q29kZTogNjUsIGtleTogJ2EnLCBjb2RlOiAnS2V5QScgfSxcbiAgICBiOiB7IGtleUNvZGU6IDY2LCBrZXk6ICdiJywgY29kZTogJ0tleUInIH0sXG4gICAgYzogeyBrZXlDb2RlOiA2Nywga2V5OiAnYycsIGNvZGU6ICdLZXlDJyB9LFxuICAgIGQ6IHsga2V5Q29kZTogNjgsIGtleTogJ2QnLCBjb2RlOiAnS2V5RCcgfSxcbiAgICBlOiB7IGtleUNvZGU6IDY5LCBrZXk6ICdlJywgY29kZTogJ0tleUUnIH0sXG4gICAgZjogeyBrZXlDb2RlOiA3MCwga2V5OiAnZicsIGNvZGU6ICdLZXlGJyB9LFxuICAgIGc6IHsga2V5Q29kZTogNzEsIGtleTogJ2cnLCBjb2RlOiAnS2V5RycgfSxcbiAgICBoOiB7IGtleUNvZGU6IDcyLCBrZXk6ICdoJywgY29kZTogJ0tleUgnIH0sXG4gICAgaTogeyBrZXlDb2RlOiA3Mywga2V5OiAnaScsIGNvZGU6ICdLZXlJJyB9LFxuICAgIGo6IHsga2V5Q29kZTogNzQsIGtleTogJ2onLCBjb2RlOiAnS2V5SicgfSxcbiAgICBrOiB7IGtleUNvZGU6IDc1LCBrZXk6ICdrJywgY29kZTogJ0tleUsnIH0sXG4gICAgbDogeyBrZXlDb2RlOiA3Niwga2V5OiAnbCcsIGNvZGU6ICdLZXlMJyB9LFxuICAgIG06IHsga2V5Q29kZTogNzcsIGtleTogJ20nLCBjb2RlOiAnS2V5TScgfSxcbiAgICBuOiB7IGtleUNvZGU6IDc4LCBrZXk6ICduJywgY29kZTogJ0tleU4nIH0sXG4gICAgbzogeyBrZXlDb2RlOiA3OSwga2V5OiAnbycsIGNvZGU6ICdLZXlPJyB9LFxuICAgIHA6IHsga2V5Q29kZTogODAsIGtleTogJ3AnLCBjb2RlOiAnS2V5UCcgfSxcbiAgICBxOiB7IGtleUNvZGU6IDgxLCBrZXk6ICdxJywgY29kZTogJ0tleVEnIH0sXG4gICAgcjogeyBrZXlDb2RlOiA4Miwga2V5OiAncicsIGNvZGU6ICdLZXlSJyB9LFxuICAgIHM6IHsga2V5Q29kZTogODMsIGtleTogJ3MnLCBjb2RlOiAnS2V5UycgfSxcbiAgICB0OiB7IGtleUNvZGU6IDg0LCBrZXk6ICd0JywgY29kZTogJ0tleVQnIH0sXG4gICAgdTogeyBrZXlDb2RlOiA4NSwga2V5OiAndScsIGNvZGU6ICdLZXlVJyB9LFxuICAgIHY6IHsga2V5Q29kZTogODYsIGtleTogJ3YnLCBjb2RlOiAnS2V5VicgfSxcbiAgICB3OiB7IGtleUNvZGU6IDg3LCBrZXk6ICd3JywgY29kZTogJ0tleVcnIH0sXG4gICAgeDogeyBrZXlDb2RlOiA4OCwga2V5OiAneCcsIGNvZGU6ICdLZXlYJyB9LFxuICAgIHk6IHsga2V5Q29kZTogODksIGtleTogJ3knLCBjb2RlOiAnS2V5WScgfSxcbiAgICB6OiB7IGtleUNvZGU6IDkwLCBrZXk6ICd6JywgY29kZTogJ0tleVonIH0sXG4gICAgTWV0YTogeyBrZXlDb2RlOiA5MSwga2V5OiAnTWV0YScsIGNvZGU6ICdNZXRhTGVmdCcsIGxvY2F0aW9uOiAxIH0sXG4gICAgJyonOiB7IGtleUNvZGU6IDEwNiwga2V5OiAnKicsIGNvZGU6ICdOdW1wYWRNdWx0aXBseScsIGxvY2F0aW9uOiAzIH0sXG4gICAgJysnOiB7IGtleUNvZGU6IDEwNywga2V5OiAnKycsIGNvZGU6ICdOdW1wYWRBZGQnLCBsb2NhdGlvbjogMyB9LFxuICAgICctJzogeyBrZXlDb2RlOiAxMDksIGtleTogJy0nLCBjb2RlOiAnTnVtcGFkU3VidHJhY3QnLCBsb2NhdGlvbjogMyB9LFxuICAgICcvJzogeyBrZXlDb2RlOiAxMTEsIGtleTogJy8nLCBjb2RlOiAnTnVtcGFkRGl2aWRlJywgbG9jYXRpb246IDMgfSxcbiAgICAnOyc6IHsga2V5Q29kZTogMTg2LCBrZXk6ICc7JywgY29kZTogJ1NlbWljb2xvbicgfSxcbiAgICAnPSc6IHsga2V5Q29kZTogMTg3LCBrZXk6ICc9JywgY29kZTogJ0VxdWFsJyB9LFxuICAgICcsJzogeyBrZXlDb2RlOiAxODgsIGtleTogJywnLCBjb2RlOiAnQ29tbWEnIH0sXG4gICAgJy4nOiB7IGtleUNvZGU6IDE5MCwga2V5OiAnLicsIGNvZGU6ICdQZXJpb2QnIH0sXG4gICAgJ2AnOiB7IGtleUNvZGU6IDE5Miwga2V5OiAnYCcsIGNvZGU6ICdCYWNrcXVvdGUnIH0sXG4gICAgJ1snOiB7IGtleUNvZGU6IDIxOSwga2V5OiAnWycsIGNvZGU6ICdCcmFja2V0TGVmdCcgfSxcbiAgICAnXFxcXCc6IHsga2V5Q29kZTogMjIwLCBrZXk6ICdcXFxcJywgY29kZTogJ0JhY2tzbGFzaCcgfSxcbiAgICAnXSc6IHsga2V5Q29kZTogMjIxLCBrZXk6ICddJywgY29kZTogJ0JyYWNrZXRSaWdodCcgfSxcbiAgICBcIidcIjogeyBrZXlDb2RlOiAyMjIsIGtleTogXCInXCIsIGNvZGU6ICdRdW90ZScgfSxcbiAgICBBdHRuOiB7IGtleUNvZGU6IDI0Niwga2V5OiAnQXR0bicgfSxcbiAgICBDclNlbDogeyBrZXlDb2RlOiAyNDcsIGtleTogJ0NyU2VsJywgY29kZTogJ1Byb3BzJyB9LFxuICAgIEV4U2VsOiB7IGtleUNvZGU6IDI0OCwga2V5OiAnRXhTZWwnIH0sXG4gICAgRXJhc2VFb2Y6IHsga2V5Q29kZTogMjQ5LCBrZXk6ICdFcmFzZUVvZicgfSxcbiAgICBQbGF5OiB7IGtleUNvZGU6IDI1MCwga2V5OiAnUGxheScgfSxcbiAgICBab29tT3V0OiB7IGtleUNvZGU6IDI1MSwga2V5OiAnWm9vbU91dCcgfSxcbiAgICAnKSc6IHsga2V5Q29kZTogNDgsIGtleTogJyknLCBjb2RlOiAnRGlnaXQwJyB9LFxuICAgICchJzogeyBrZXlDb2RlOiA0OSwga2V5OiAnIScsIGNvZGU6ICdEaWdpdDEnIH0sXG4gICAgJ0AnOiB7IGtleUNvZGU6IDUwLCBrZXk6ICdAJywgY29kZTogJ0RpZ2l0MicgfSxcbiAgICAnIyc6IHsga2V5Q29kZTogNTEsIGtleTogJyMnLCBjb2RlOiAnRGlnaXQzJyB9LFxuICAgICQ6IHsga2V5Q29kZTogNTIsIGtleTogJyQnLCBjb2RlOiAnRGlnaXQ0JyB9LFxuICAgICclJzogeyBrZXlDb2RlOiA1Mywga2V5OiAnJScsIGNvZGU6ICdEaWdpdDUnIH0sXG4gICAgJ14nOiB7IGtleUNvZGU6IDU0LCBrZXk6ICdeJywgY29kZTogJ0RpZ2l0NicgfSxcbiAgICAnJic6IHsga2V5Q29kZTogNTUsIGtleTogJyYnLCBjb2RlOiAnRGlnaXQ3JyB9LFxuICAgICcoJzogeyBrZXlDb2RlOiA1Nywga2V5OiAnKCcsIGNvZGU6ICdEaWdpdDknIH0sXG4gICAgQTogeyBrZXlDb2RlOiA2NSwga2V5OiAnQScsIGNvZGU6ICdLZXlBJyB9LFxuICAgIEI6IHsga2V5Q29kZTogNjYsIGtleTogJ0InLCBjb2RlOiAnS2V5QicgfSxcbiAgICBDOiB7IGtleUNvZGU6IDY3LCBrZXk6ICdDJywgY29kZTogJ0tleUMnIH0sXG4gICAgRDogeyBrZXlDb2RlOiA2OCwga2V5OiAnRCcsIGNvZGU6ICdLZXlEJyB9LFxuICAgIEU6IHsga2V5Q29kZTogNjksIGtleTogJ0UnLCBjb2RlOiAnS2V5RScgfSxcbiAgICBGOiB7IGtleUNvZGU6IDcwLCBrZXk6ICdGJywgY29kZTogJ0tleUYnIH0sXG4gICAgRzogeyBrZXlDb2RlOiA3MSwga2V5OiAnRycsIGNvZGU6ICdLZXlHJyB9LFxuICAgIEg6IHsga2V5Q29kZTogNzIsIGtleTogJ0gnLCBjb2RlOiAnS2V5SCcgfSxcbiAgICBJOiB7IGtleUNvZGU6IDczLCBrZXk6ICdJJywgY29kZTogJ0tleUknIH0sXG4gICAgSjogeyBrZXlDb2RlOiA3NCwga2V5OiAnSicsIGNvZGU6ICdLZXlKJyB9LFxuICAgIEs6IHsga2V5Q29kZTogNzUsIGtleTogJ0snLCBjb2RlOiAnS2V5SycgfSxcbiAgICBMOiB7IGtleUNvZGU6IDc2LCBrZXk6ICdMJywgY29kZTogJ0tleUwnIH0sXG4gICAgTTogeyBrZXlDb2RlOiA3Nywga2V5OiAnTScsIGNvZGU6ICdLZXlNJyB9LFxuICAgIE46IHsga2V5Q29kZTogNzgsIGtleTogJ04nLCBjb2RlOiAnS2V5TicgfSxcbiAgICBPOiB7IGtleUNvZGU6IDc5LCBrZXk6ICdPJywgY29kZTogJ0tleU8nIH0sXG4gICAgUDogeyBrZXlDb2RlOiA4MCwga2V5OiAnUCcsIGNvZGU6ICdLZXlQJyB9LFxuICAgIFE6IHsga2V5Q29kZTogODEsIGtleTogJ1EnLCBjb2RlOiAnS2V5UScgfSxcbiAgICBSOiB7IGtleUNvZGU6IDgyLCBrZXk6ICdSJywgY29kZTogJ0tleVInIH0sXG4gICAgUzogeyBrZXlDb2RlOiA4Mywga2V5OiAnUycsIGNvZGU6ICdLZXlTJyB9LFxuICAgIFQ6IHsga2V5Q29kZTogODQsIGtleTogJ1QnLCBjb2RlOiAnS2V5VCcgfSxcbiAgICBVOiB7IGtleUNvZGU6IDg1LCBrZXk6ICdVJywgY29kZTogJ0tleVUnIH0sXG4gICAgVjogeyBrZXlDb2RlOiA4Niwga2V5OiAnVicsIGNvZGU6ICdLZXlWJyB9LFxuICAgIFc6IHsga2V5Q29kZTogODcsIGtleTogJ1cnLCBjb2RlOiAnS2V5VycgfSxcbiAgICBYOiB7IGtleUNvZGU6IDg4LCBrZXk6ICdYJywgY29kZTogJ0tleVgnIH0sXG4gICAgWTogeyBrZXlDb2RlOiA4OSwga2V5OiAnWScsIGNvZGU6ICdLZXlZJyB9LFxuICAgIFo6IHsga2V5Q29kZTogOTAsIGtleTogJ1onLCBjb2RlOiAnS2V5WicgfSxcbiAgICAnOic6IHsga2V5Q29kZTogMTg2LCBrZXk6ICc6JywgY29kZTogJ1NlbWljb2xvbicgfSxcbiAgICAnPCc6IHsga2V5Q29kZTogMTg4LCBrZXk6ICc8JywgY29kZTogJ0NvbW1hJyB9LFxuICAgIF86IHsga2V5Q29kZTogMTg5LCBrZXk6ICdfJywgY29kZTogJ01pbnVzJyB9LFxuICAgICc+JzogeyBrZXlDb2RlOiAxOTAsIGtleTogJz4nLCBjb2RlOiAnUGVyaW9kJyB9LFxuICAgICc/JzogeyBrZXlDb2RlOiAxOTEsIGtleTogJz8nLCBjb2RlOiAnU2xhc2gnIH0sXG4gICAgJ34nOiB7IGtleUNvZGU6IDE5Miwga2V5OiAnficsIGNvZGU6ICdCYWNrcXVvdGUnIH0sXG4gICAgJ3snOiB7IGtleUNvZGU6IDIxOSwga2V5OiAneycsIGNvZGU6ICdCcmFja2V0TGVmdCcgfSxcbiAgICAnfCc6IHsga2V5Q29kZTogMjIwLCBrZXk6ICd8JywgY29kZTogJ0JhY2tzbGFzaCcgfSxcbiAgICAnfSc6IHsga2V5Q29kZTogMjIxLCBrZXk6ICd9JywgY29kZTogJ0JyYWNrZXRSaWdodCcgfSxcbiAgICAnXCInOiB7IGtleUNvZGU6IDIyMiwga2V5OiAnXCInLCBjb2RlOiAnUXVvdGUnIH0sXG4gICAgU29mdExlZnQ6IHsga2V5OiAnU29mdExlZnQnLCBjb2RlOiAnU29mdExlZnQnLCBsb2NhdGlvbjogNCB9LFxuICAgIFNvZnRSaWdodDogeyBrZXk6ICdTb2Z0UmlnaHQnLCBjb2RlOiAnU29mdFJpZ2h0JywgbG9jYXRpb246IDQgfSxcbiAgICBDYW1lcmE6IHsga2V5Q29kZTogNDQsIGtleTogJ0NhbWVyYScsIGNvZGU6ICdDYW1lcmEnLCBsb2NhdGlvbjogNCB9LFxuICAgIENhbGw6IHsga2V5OiAnQ2FsbCcsIGNvZGU6ICdDYWxsJywgbG9jYXRpb246IDQgfSxcbiAgICBFbmRDYWxsOiB7IGtleUNvZGU6IDk1LCBrZXk6ICdFbmRDYWxsJywgY29kZTogJ0VuZENhbGwnLCBsb2NhdGlvbjogNCB9LFxuICAgIFZvbHVtZURvd246IHtcbiAgICAgICAga2V5Q29kZTogMTgyLFxuICAgICAgICBrZXk6ICdWb2x1bWVEb3duJyxcbiAgICAgICAgY29kZTogJ1ZvbHVtZURvd24nLFxuICAgICAgICBsb2NhdGlvbjogNCxcbiAgICB9LFxuICAgIFZvbHVtZVVwOiB7IGtleUNvZGU6IDE4Mywga2V5OiAnVm9sdW1lVXAnLCBjb2RlOiAnVm9sdW1lVXAnLCBsb2NhdGlvbjogNCB9LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVTS2V5Ym9hcmRMYXlvdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZXdwb3J0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4uL3V0aWwvRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlGdW5jdGlvbiB9IGZyb20gJy4uL3V0aWwvRnVuY3Rpb24uanMnO1xuaW1wb3J0IHsgVGltZW91dEVycm9yIH0gZnJvbSAnLi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4vTGF6eUFyZy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgV2FpdFRhc2sge1xuICAgICN3b3JsZDtcbiAgICAjcG9sbGluZztcbiAgICAjcm9vdDtcbiAgICAjZm47XG4gICAgI2FyZ3M7XG4gICAgI3RpbWVvdXQ7XG4gICAgI3RpbWVvdXRFcnJvcjtcbiAgICAjcmVzdWx0ID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgI3BvbGxlcjtcbiAgICAjc2lnbmFsO1xuICAgICNyZXJ1bnMgPSBbXTtcbiAgICBjb25zdHJ1Y3Rvcih3b3JsZCwgb3B0aW9ucywgZm4sIC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy4jd29ybGQgPSB3b3JsZDtcbiAgICAgICAgdGhpcy4jcG9sbGluZyA9IG9wdGlvbnMucG9sbGluZztcbiAgICAgICAgdGhpcy4jcm9vdCA9IG9wdGlvbnMucm9vdDtcbiAgICAgICAgdGhpcy4jc2lnbmFsID0gb3B0aW9ucy5zaWduYWw7XG4gICAgICAgIHRoaXMuI3NpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHRoaXMudGVybWluYXRlKHRoaXMuI3NpZ25hbD8ucmVhc29uKTtcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGZuKSB7XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIHRoaXMuI2ZuID0gYCgpID0+IHtyZXR1cm4gKCR7Zm59KTt9YDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy4jZm4gPSBzdHJpbmdpZnlGdW5jdGlvbihmbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jYXJncyA9IGFyZ3M7XG4gICAgICAgIHRoaXMuI3dvcmxkLnRhc2tNYW5hZ2VyLmFkZCh0aGlzKTtcbiAgICAgICAgaWYgKG9wdGlvbnMudGltZW91dCkge1xuICAgICAgICAgICAgdGhpcy4jdGltZW91dEVycm9yID0gbmV3IFRpbWVvdXRFcnJvcihgV2FpdGluZyBmYWlsZWQ6ICR7b3B0aW9ucy50aW1lb3V0fW1zIGV4Y2VlZGVkYCk7XG4gICAgICAgICAgICB0aGlzLiN0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnRlcm1pbmF0ZSh0aGlzLiN0aW1lb3V0RXJyb3IpO1xuICAgICAgICAgICAgfSwgb3B0aW9ucy50aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICB2b2lkIHRoaXMucmVydW4oKTtcbiAgICB9XG4gICAgZ2V0IHJlc3VsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Jlc3VsdC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgYXN5bmMgcmVydW4oKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJldiBvZiB0aGlzLiNyZXJ1bnMpIHtcbiAgICAgICAgICAgIHByZXYuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNyZXJ1bnMubGVuZ3RoID0gMDtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgdGhpcy4jcmVydW5zLnB1c2goY29udHJvbGxlcik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuI3BvbGxpbmcpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdyYWYnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNwb2xsZXIgPSBhd2FpdCB0aGlzLiN3b3JsZC5ldmFsdWF0ZUhhbmRsZSgoeyBSQUZQb2xsZXIsIGNyZWF0ZUZ1bmN0aW9uIH0sIGZuLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmdW4gPSBjcmVhdGVGdW5jdGlvbihmbik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJBRlBvbGxlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1biguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LCBMYXp5QXJnLmNyZWF0ZShjb250ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnB1cHBldGVlclV0aWw7XG4gICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLiNmbiwgLi4udGhpcy4jYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ211dGF0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcG9sbGVyID0gYXdhaXQgdGhpcy4jd29ybGQuZXZhbHVhdGVIYW5kbGUoKHsgTXV0YXRpb25Qb2xsZXIsIGNyZWF0ZUZ1bmN0aW9uIH0sIHJvb3QsIGZuLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmdW4gPSBjcmVhdGVGdW5jdGlvbihmbik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE11dGF0aW9uUG9sbGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm9vdCB8fCBkb2N1bWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIExhenlBcmcuY3JlYXRlKGNvbnRleHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHVwcGV0ZWVyVXRpbDtcbiAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuI3Jvb3QsIHRoaXMuI2ZuLCAuLi50aGlzLiNhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcG9sbGVyID0gYXdhaXQgdGhpcy4jd29ybGQuZXZhbHVhdGVIYW5kbGUoKHsgSW50ZXJ2YWxQb2xsZXIsIGNyZWF0ZUZ1bmN0aW9uIH0sIG1zLCBmbiwgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVuID0gY3JlYXRlRnVuY3Rpb24oZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbFBvbGxlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1biguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG1zKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgTGF6eUFyZy5jcmVhdGUoY29udGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy4jcG9sbGluZywgdGhpcy4jZm4sIC4uLnRoaXMuI2FyZ3MpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3BvbGxlci5ldmFsdWF0ZShwb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgcG9sbGVyLnN0YXJ0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI3BvbGxlci5ldmFsdWF0ZUhhbmRsZShwb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb2xsZXIucmVzdWx0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuI3Jlc3VsdC5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRlcm1pbmF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiYWRFcnJvciA9IHRoaXMuZ2V0QmFkRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgaWYgKGJhZEVycm9yKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy50ZXJtaW5hdGUoYmFkRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHRlcm1pbmF0ZShlcnJvcikge1xuICAgICAgICB0aGlzLiN3b3JsZC50YXNrTWFuYWdlci5kZWxldGUodGhpcyk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0aW1lb3V0KTtcbiAgICAgICAgaWYgKGVycm9yICYmICF0aGlzLiNyZXN1bHQuZmluaXNoZWQoKSkge1xuICAgICAgICAgICAgdGhpcy4jcmVzdWx0LnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3BvbGxlcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNwb2xsZXIuZXZhbHVhdGVIYW5kbGUoYXN5bmMgKHBvbGxlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwb2xsZXIuc3RvcCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNwb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcG9sbGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcG9sbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIHNpbmNlIHRoZXkgbW9zdCBsaWtlbHkgY29tZSBmcm9tIGxvdy1sZXZlbCBjbGVhbnVwLlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vdCBhbGwgZXJyb3JzIGxlYWQgdG8gdGVybWluYXRpb24uIFRoZXkgdXN1YWxseSBpbXBseSB3ZSBuZWVkIHRvIHJlcnVuIHRoZSB0YXNrLlxuICAgICAqL1xuICAgIGdldEJhZEVycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChpc0Vycm9yTGlrZShlcnJvcikpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gZnJhbWUgaXMgZGV0YWNoZWQgdGhlIHRhc2sgc2hvdWxkIGhhdmUgYmVlbiB0ZXJtaW5hdGVkIGJ5IHRoZSBJc29sYXRlZFdvcmxkLlxuICAgICAgICAgICAgLy8gVGhpcyBjYW4gZmFpbCBpZiB3ZSB3ZXJlIGFkZGluZyB0aGlzIHRhc2sgd2hpbGUgdGhlIGZyYW1lIHdhcyBkZXRhY2hlZCxcbiAgICAgICAgICAgIC8vIHNvIHdlIHRlcm1pbmF0ZSBoZXJlIGluc3RlYWQuXG4gICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRXhlY3V0aW9uIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBkZXRhY2hlZCBmcmFtZScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignV2FpdGluZyBmYWlsZWQ6IEZyYW1lIGRldGFjaGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXaGVuIHRoZSBwYWdlIGlzIG5hdmlnYXRlZCwgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQuXG4gICAgICAgICAgICAvLyBXZSB3aWxsIHRyeSBhZ2FpbiBpbiB0aGUgbmV3IGV4ZWN1dGlvbiBjb250ZXh0LlxuICAgICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0V4ZWN1dGlvbiBjb250ZXh0IHdhcyBkZXN0cm95ZWQnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGNvdWxkIGhhdmUgdHJpZWQgdG8gZXZhbHVhdGUgaW4gYSBjb250ZXh0IHdoaWNoIHdhcyBhbHJlYWR5XG4gICAgICAgICAgICAvLyBkZXN0cm95ZWQuXG4gICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnQ2Fubm90IGZpbmQgY29udGV4dCB3aXRoIHNwZWNpZmllZCBpZCcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRXJyb3JzIGNvbWluZyBmcm9tIFdlYkRyaXZlciBCaURpLiBUT0RPOiBBZGp1c3QgbWVzc2FnZXMgYWZ0ZXJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93M2Mvd2ViZHJpdmVyLWJpZGkvaXNzdWVzLzU0MCBpcyByZXNvbHZlZC5cbiAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQWJvcnRFcnJvcjogQWN0b3IgJ01lc3NhZ2VIYW5kbGVyRnJhbWUnIGRlc3Ryb3llZFwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdXYWl0VGFzayBmYWlsZWQgd2l0aCBhbiBlcnJvcicsIHtcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tNYW5hZ2VyIHtcbiAgICAjdGFza3MgPSBuZXcgU2V0KCk7XG4gICAgYWRkKHRhc2spIHtcbiAgICAgICAgdGhpcy4jdGFza3MuYWRkKHRhc2spO1xuICAgIH1cbiAgICBkZWxldGUodGFzaykge1xuICAgICAgICB0aGlzLiN0YXNrcy5kZWxldGUodGFzayk7XG4gICAgfVxuICAgIHRlcm1pbmF0ZUFsbChlcnJvcikge1xuICAgICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy4jdGFza3MpIHtcbiAgICAgICAgICAgIHZvaWQgdGFzay50ZXJtaW5hdGUoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3Rhc2tzLmNsZWFyKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlcnVuQWxsKCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbLi4udGhpcy4jdGFza3NdLm1hcCh0YXNrID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0YXNrLnJlcnVuKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XYWl0VGFzay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyLCB9IGZyb20gJy4vUXVlcnlIYW5kbGVyLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBYUGF0aFF1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JBbGwgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgeHBhdGhRdWVyeVNlbGVjdG9yQWxsIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHhwYXRoUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvciA9IChlbGVtZW50LCBzZWxlY3RvciwgeyB4cGF0aFF1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiB4cGF0aFF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudCwgc2VsZWN0b3IsIDEpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1YUGF0aFF1ZXJ5SGFuZGxlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9Ccm93c2VyV2ViU29ja2V0VHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FsbGJhY2tSZWdpc3RyeS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbmZpZ3VyYXRpb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25uZWN0aW9uVHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ29ubmVjdE9wdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25zb2xlTWVzc2FnZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0Nvb2tpZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0RlYnVnLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRGV2aWNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXJyb3JzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXZlbnRFbWl0dGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRmlsZUNob29zZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRRdWVyeUhhbmRsZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9IYW5kbGVJdGVyYXRvci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0xhenlBcmcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9OZXR3b3JrTWFuYWdlckV2ZW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1BERk9wdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QaWVyY2VRdWVyeUhhbmRsZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QUXVlcnlIYW5kbGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHJvZHVjdC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1BTZWxlY3RvclBhcnNlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1B1cHBldGVlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5SGFuZGxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1NjcmlwdEluamVjdG9yLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vU2VjdXJpdHlEZXRhaWxzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGFza1F1ZXVlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dFF1ZXJ5SGFuZGxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1RpbWVvdXRTZXR0aW5ncy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVVNLZXlib2FyZExheW91dC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWwuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9WaWV3cG9ydC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1dhaXRUYXNrLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vWFBhdGhRdWVyeUhhbmRsZXIuanMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgZmlsdGVyLCBmcm9tLCBmcm9tRXZlbnQsIG1hcCwgbWVyZ2VNYXAsIE5FVkVSLCBPYnNlcnZhYmxlLCB0aW1lciwgfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuL0RlYnVnLmpzJztcbmltcG9ydCB7IFRpbWVvdXRFcnJvciB9IGZyb20gJy4vRXJyb3JzLmpzJztcbmltcG9ydCB7IHBhcGVyRm9ybWF0cyB9IGZyb20gJy4vUERGT3B0aW9ucy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZGVidWdFcnJvciA9IGRlYnVnKCdwdXBwZXRlZXI6ZXJyb3InKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1ZJRVdQT1JUID0gT2JqZWN0LmZyZWV6ZSh7IHdpZHRoOiA4MDAsIGhlaWdodDogNjAwIH0pO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgU09VUkNFX1VSTCA9IFN5bWJvbCgnU291cmNlIFVSTCBmb3IgUHVwcGV0ZWVyIGV2YWx1YXRpb24gc2NyaXB0cycpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFB1cHBldGVlclVSTCB7XG4gICAgc3RhdGljIElOVEVSTkFMX1VSTCA9ICdwcHRyOmludGVybmFsJztcbiAgICBzdGF0aWMgZnJvbUNhbGxTaXRlKGZ1bmN0aW9uTmFtZSwgc2l0ZSkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgUHVwcGV0ZWVyVVJMKCk7XG4gICAgICAgIHVybC4jZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lO1xuICAgICAgICB1cmwuI3NpdGVTdHJpbmcgPSBzaXRlLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuICAgIHN0YXRpYyBwYXJzZSA9ICh1cmwpID0+IHtcbiAgICAgICAgdXJsID0gdXJsLnNsaWNlKCdwcHRyOicubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgW2Z1bmN0aW9uTmFtZSA9ICcnLCBzaXRlU3RyaW5nID0gJyddID0gdXJsLnNwbGl0KCc7Jyk7XG4gICAgICAgIGNvbnN0IHB1cHBldGVlclVybCA9IG5ldyBQdXBwZXRlZXJVUkwoKTtcbiAgICAgICAgcHVwcGV0ZWVyVXJsLiNmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgIHB1cHBldGVlclVybC4jc2l0ZVN0cmluZyA9IGRlY29kZVVSSUNvbXBvbmVudChzaXRlU3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHB1cHBldGVlclVybDtcbiAgICB9O1xuICAgIHN0YXRpYyBpc1B1cHBldGVlclVSTCA9ICh1cmwpID0+IHtcbiAgICAgICAgcmV0dXJuIHVybC5zdGFydHNXaXRoKCdwcHRyOicpO1xuICAgIH07XG4gICAgI2Z1bmN0aW9uTmFtZTtcbiAgICAjc2l0ZVN0cmluZztcbiAgICBnZXQgZnVuY3Rpb25OYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnVuY3Rpb25OYW1lO1xuICAgIH1cbiAgICBnZXQgc2l0ZVN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NpdGVTdHJpbmc7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYHBwdHI6JHtbXG4gICAgICAgICAgICB0aGlzLiNmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQodGhpcy4jc2l0ZVN0cmluZyksXG4gICAgICAgIF0uam9pbignOycpfWA7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUgPSAoZnVuY3Rpb25OYW1lLCBvYmplY3QpID0+IHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgU09VUkNFX1VSTCkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtcbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IChfLCBzdGFjaykgPT4ge1xuICAgICAgICAvLyBGaXJzdCBlbGVtZW50IGlzIHRoZSBmdW5jdGlvbi5cbiAgICAgICAgLy8gU2Vjb25kIGVsZW1lbnQgaXMgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uLlxuICAgICAgICAvLyBUaGlyZCBlbGVtZW50IGlzIHRoZSBjYWxsZXIgb2YgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uXG4gICAgICAgIC8vIHdoaWNoIGlzIHByZWNpc2VseSB3aGF0IHdlIHdhbnQuXG4gICAgICAgIHJldHVybiBzdGFja1syXTtcbiAgICB9O1xuICAgIGNvbnN0IHNpdGUgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IG9yaWdpbmFsO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG9iamVjdCwge1xuICAgICAgICBbU09VUkNFX1VSTF06IFB1cHBldGVlclVSTC5mcm9tQ2FsbFNpdGUoZnVuY3Rpb25OYW1lLCBzaXRlKSxcbiAgICB9KTtcbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0U291cmNlUHVwcGV0ZWVyVVJMSWZBdmFpbGFibGUgPSAob2JqZWN0KSA9PiB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIFNPVVJDRV9VUkwpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3RbU09VUkNFX1VSTF07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU3RyaW5nID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCBvYmogaW5zdGFuY2VvZiBTdHJpbmc7XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGlzTnVtYmVyID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCBvYmogaW5zdGFuY2VvZiBOdW1iZXI7XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGlzUGxhaW5PYmplY3QgPSAob2JqKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaj8uY29uc3RydWN0b3IgPT09IE9iamVjdDtcbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaXNSZWdFeHAgPSAob2JqKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaj8uY29uc3RydWN0b3IgPT09IFJlZ0V4cDtcbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaXNEYXRlID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmo/LmNvbnN0cnVjdG9yID09PSBEYXRlO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0aW9uU3RyaW5nKGZ1biwgLi4uYXJncykge1xuICAgIGlmIChpc1N0cmluZyhmdW4pKSB7XG4gICAgICAgIGFzc2VydChhcmdzLmxlbmd0aCA9PT0gMCwgJ0Nhbm5vdCBldmFsdWF0ZSBhIHN0cmluZyB3aXRoIGFyZ3VtZW50cycpO1xuICAgICAgICByZXR1cm4gZnVuO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXJpYWxpemVBcmd1bWVudChhcmcpIHtcbiAgICAgICAgaWYgKE9iamVjdC5pcyhhcmcsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIGAoJHtmdW59KSgke2FyZ3MubWFwKHNlcmlhbGl6ZUFyZ3VtZW50KS5qb2luKCcsJyl9KWA7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5sZXQgZnMgPSBudWxsO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEZTUHJvbWlzZXMoKSB7XG4gICAgaWYgKCFmcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZnMgPSBhd2FpdCBpbXBvcnQoJ2ZzL3Byb21pc2VzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB3cml0ZSB0byBhIHBhdGggb3V0c2lkZSBvZiBhIE5vZGUtbGlrZSBlbnZpcm9ubWVudC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWFkYWJsZUFzQnVmZmVyKHJlYWRhYmxlLCBwYXRoKSB7XG4gICAgY29uc3QgYnVmZmVycyA9IFtdO1xuICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgIGlmIChwYXRoKSB7XG4gICAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0RlNQcm9taXNlcygpO1xuICAgICAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgZnMub3BlbihwYXRoLCAndysnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBmaWxlSGFuZGxlLndyaXRlRmlsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBmaWxlSGFuZGxlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlYWRhYmxlRnJvbVByb3RvY29sU3RyZWFtKGNsaWVudCwgaGFuZGxlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0VW5pdDhBcnJheShkYXRhLCBpc0Jhc2U2NCkge1xuICAgICAgICAgICAgICAgIGlmIChpc0Jhc2U2NCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGF0b2IoZGF0YSksIG0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uY29kZVBvaW50QXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZXIuZW5jb2RlKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBiYXNlNjRFbmNvZGVkLCBlb2YgfSA9IGF3YWl0IGNsaWVudC5zZW5kKCdJTy5yZWFkJywge1xuICAgICAgICAgICAgICAgIGhhbmRsZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGdldFVuaXQ4QXJyYXkoZGF0YSwgYmFzZTY0RW5jb2RlZCA/PyBmYWxzZSkpO1xuICAgICAgICAgICAgaWYgKGVvZikge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdJTy5jbG9zZScsIHsgaGFuZGxlIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZURpYWxvZ1R5cGUodHlwZSkge1xuICAgIGxldCBkaWFsb2dUeXBlID0gbnVsbDtcbiAgICBjb25zdCB2YWxpZERpYWxvZ1R5cGVzID0gbmV3IFNldChbXG4gICAgICAgICdhbGVydCcsXG4gICAgICAgICdjb25maXJtJyxcbiAgICAgICAgJ3Byb21wdCcsXG4gICAgICAgICdiZWZvcmV1bmxvYWQnLFxuICAgIF0pO1xuICAgIGlmICh2YWxpZERpYWxvZ1R5cGVzLmhhcyh0eXBlKSkge1xuICAgICAgICBkaWFsb2dUeXBlID0gdHlwZTtcbiAgICB9XG4gICAgYXNzZXJ0KGRpYWxvZ1R5cGUsIGBVbmtub3duIGphdmFzY3JpcHQgZGlhbG9nIHR5cGU6ICR7dHlwZX1gKTtcbiAgICByZXR1cm4gZGlhbG9nVHlwZTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lb3V0KG1zLCBjYXVzZSkge1xuICAgIHJldHVybiBtcyA9PT0gMFxuICAgICAgICA/IE5FVkVSXG4gICAgICAgIDogdGltZXIobXMpLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXJyb3IoYFRpbWVkIG91dCBhZnRlciB3YWl0aW5nICR7bXN9bXNgLCB7IGNhdXNlIH0pO1xuICAgICAgICB9KSk7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVVRJTElUWV9XT1JMRF9OQU1FID0gJ19fcHVwcGV0ZWVyX3V0aWxpdHlfd29ybGRfXyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU09VUkNFX1VSTF9SRUdFWCA9IC9eW1xcMDQwXFx0XSpcXC9cXC9bQCNdIHNvdXJjZVVSTD1cXHMqKFxcUyo/KVxccyokL207XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U291cmNlVXJsQ29tbWVudCh1cmwpIHtcbiAgICByZXR1cm4gYC8vIyBzb3VyY2VVUkw9JHt1cmx9YDtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBORVRXT1JLX0lETEVfVElNRSA9IDUwMDtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBERk9wdGlvbnMob3B0aW9ucyA9IHt9LCBsZW5ndGhVbml0ID0gJ2luJykge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgZGlzcGxheUhlYWRlckZvb3RlcjogZmFsc2UsXG4gICAgICAgIGhlYWRlclRlbXBsYXRlOiAnJyxcbiAgICAgICAgZm9vdGVyVGVtcGxhdGU6ICcnLFxuICAgICAgICBwcmludEJhY2tncm91bmQ6IGZhbHNlLFxuICAgICAgICBsYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICBwYWdlUmFuZ2VzOiAnJyxcbiAgICAgICAgcHJlZmVyQ1NTUGFnZVNpemU6IGZhbHNlLFxuICAgICAgICBvbWl0QmFja2dyb3VuZDogZmFsc2UsXG4gICAgICAgIG91dGxpbmU6IGZhbHNlLFxuICAgICAgICB0YWdnZWQ6IHRydWUsXG4gICAgICAgIHdhaXRGb3JGb250czogdHJ1ZSxcbiAgICB9O1xuICAgIGxldCB3aWR0aCA9IDguNTtcbiAgICBsZXQgaGVpZ2h0ID0gMTE7XG4gICAgaWYgKG9wdGlvbnMuZm9ybWF0KSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IHBhcGVyRm9ybWF0c1tvcHRpb25zLmZvcm1hdC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgYXNzZXJ0KGZvcm1hdCwgJ1Vua25vd24gcGFwZXIgZm9ybWF0OiAnICsgb3B0aW9ucy5mb3JtYXQpO1xuICAgICAgICB3aWR0aCA9IGZvcm1hdC53aWR0aDtcbiAgICAgICAgaGVpZ2h0ID0gZm9ybWF0LmhlaWdodDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdpZHRoID0gY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy53aWR0aCwgbGVuZ3RoVW5pdCkgPz8gd2lkdGg7XG4gICAgICAgIGhlaWdodCA9XG4gICAgICAgICAgICBjb252ZXJ0UHJpbnRQYXJhbWV0ZXJUb0luY2hlcyhvcHRpb25zLmhlaWdodCwgbGVuZ3RoVW5pdCkgPz8gaGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBtYXJnaW4gPSB7XG4gICAgICAgIHRvcDogY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy5tYXJnaW4/LnRvcCwgbGVuZ3RoVW5pdCkgfHwgMCxcbiAgICAgICAgbGVmdDogY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy5tYXJnaW4/LmxlZnQsIGxlbmd0aFVuaXQpIHx8IDAsXG4gICAgICAgIGJvdHRvbTogY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy5tYXJnaW4/LmJvdHRvbSwgbGVuZ3RoVW5pdCkgfHwgMCxcbiAgICAgICAgcmlnaHQ6IGNvbnZlcnRQcmludFBhcmFtZXRlclRvSW5jaGVzKG9wdGlvbnMubWFyZ2luPy5yaWdodCwgbGVuZ3RoVW5pdCkgfHwgMCxcbiAgICB9O1xuICAgIC8vIFF1aXJrIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTg0MDQ1NSNjNDRcbiAgICBpZiAob3B0aW9ucy5vdXRsaW5lKSB7XG4gICAgICAgIG9wdGlvbnMudGFnZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmYXVsdHMsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIG1hcmdpbixcbiAgICB9O1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHVuaXRUb1BpeGVscyA9IHtcbiAgICBweDogMSxcbiAgICBpbjogOTYsXG4gICAgY206IDM3LjgsXG4gICAgbW06IDMuNzgsXG59O1xuZnVuY3Rpb24gY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMocGFyYW1ldGVyLCBsZW5ndGhVbml0ID0gJ2luJykge1xuICAgIGlmICh0eXBlb2YgcGFyYW1ldGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgcGl4ZWxzO1xuICAgIGlmIChpc051bWJlcihwYXJhbWV0ZXIpKSB7XG4gICAgICAgIC8vIFRyZWF0IG51bWJlcnMgYXMgcGl4ZWwgdmFsdWVzIHRvIGJlIGFsaWduZWQgd2l0aCBwaGFudG9tJ3MgcGFwZXJTaXplLlxuICAgICAgICBwaXhlbHMgPSBwYXJhbWV0ZXI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzU3RyaW5nKHBhcmFtZXRlcikpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IHBhcmFtZXRlcjtcbiAgICAgICAgbGV0IHVuaXQgPSB0ZXh0LnN1YnN0cmluZyh0ZXh0Lmxlbmd0aCAtIDIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCB2YWx1ZVRleHQgPSAnJztcbiAgICAgICAgaWYgKHVuaXQgaW4gdW5pdFRvUGl4ZWxzKSB7XG4gICAgICAgICAgICB2YWx1ZVRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCAtIDIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1bmtub3duIHVuaXQgdHJ5IHRvIHBhcnNlIHRoZSB3aG9sZSBwYXJhbWV0ZXIgYXMgbnVtYmVyIG9mIHBpeGVscy5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHBoYW50b20ncyBwYXBlclNpemUgYmVoYXZpb3IuXG4gICAgICAgICAgICB1bml0ID0gJ3B4JztcbiAgICAgICAgICAgIHZhbHVlVGV4dCA9IHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBOdW1iZXIodmFsdWVUZXh0KTtcbiAgICAgICAgYXNzZXJ0KCFpc05hTih2YWx1ZSksICdGYWlsZWQgdG8gcGFyc2UgcGFyYW1ldGVyIHZhbHVlOiAnICsgdGV4dCk7XG4gICAgICAgIHBpeGVscyA9IHZhbHVlICogdW5pdFRvUGl4ZWxzW3VuaXRdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYWdlLnBkZigpIENhbm5vdCBoYW5kbGUgcGFyYW1ldGVyIHR5cGU6ICcgKyB0eXBlb2YgcGFyYW1ldGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHBpeGVscyAvIHVuaXRUb1BpeGVsc1tsZW5ndGhVbml0XTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRW1pdHRlckV2ZW50KGVtaXR0ZXIsIGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChldmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIGVtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBlbWl0dGVyLm9mZihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQWJvcnRTaWduYWwoc2lnbmFsLCBjYXVzZSkge1xuICAgIHJldHVybiBzaWduYWxcbiAgICAgICAgPyBmcm9tRXZlbnQoc2lnbmFsLCAnYWJvcnQnKS5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgc2lnbmFsLnJlYXNvbi5jYXVzZSA9IGNhdXNlO1xuICAgICAgICAgICAgICAgIHRocm93IHNpZ25hbC5yZWFzb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2lnbmFsLnJlYXNvbiwgeyBjYXVzZSB9KTtcbiAgICAgICAgfSkpXG4gICAgICAgIDogTkVWRVI7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyQXN5bmMocHJlZGljYXRlKSB7XG4gICAgcmV0dXJuIG1lcmdlTWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUocHJlZGljYXRlKHZhbHVlKSkpLnBpcGUoZmlsdGVyKGlzTWF0Y2ggPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGlzTWF0Y2g7XG4gICAgICAgIH0pLCBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaXNOb2RlID0gISEodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MudmVyc2lvbik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbnZpcm9ubWVudC5qcy5tYXAiLCIvKipcbiAqIEphdmFTY3JpcHQgY29kZSB0aGF0IHByb3ZpZGVzIHRoZSBwdXBwZXRlZXIgdXRpbGl0aWVzLiBTZWUgdGhlXG4gKiBbUkVBRE1FXShodHRwczovL2dpdGh1Yi5jb20vcHVwcGV0ZWVyL3B1cHBldGVlci9ibG9iL21haW4vc3JjL2luamVjdGVkL1JFQURNRS5tZClcbiAqIGZvciBpbmplY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBzb3VyY2UgPSBcIlxcXCJ1c2Ugc3RyaWN0XFxcIjt2YXIgZz1PYmplY3QuZGVmaW5lUHJvcGVydHk7dmFyIFg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgQj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczt2YXIgWT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBsPSh0LGUpPT57Zm9yKHZhciByIGluIGUpZyh0LHIse2dldDplW3JdLGVudW1lcmFibGU6ITB9KX0sSj0odCxlLHIsbyk9PntpZihlJiZ0eXBlb2YgZT09XFxcIm9iamVjdFxcXCJ8fHR5cGVvZiBlPT1cXFwiZnVuY3Rpb25cXFwiKWZvcihsZXQgbiBvZiBCKGUpKSFZLmNhbGwodCxuKSYmbiE9PXImJmcodCxuLHtnZXQ6KCk9PmVbbl0sZW51bWVyYWJsZTohKG89WChlLG4pKXx8by5lbnVtZXJhYmxlfSk7cmV0dXJuIHR9O3ZhciB6PXQ9PkooZyh7fSxcXFwiX19lc01vZHVsZVxcXCIse3ZhbHVlOiEwfSksdCk7dmFyIHBlPXt9O2wocGUse2RlZmF1bHQ6KCk9PmhlfSk7bW9kdWxlLmV4cG9ydHM9eihwZSk7dmFyIE49Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHIpe3N1cGVyKGUsciksdGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWV9fSxwPWNsYXNzIGV4dGVuZHMgTnt9O3ZhciBjPWNsYXNzIHR7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gbmV3IHQoZSl9c3RhdGljIGFzeW5jIHJhY2UoZSl7bGV0IHI9bmV3IFNldDt0cnl7bGV0IG89ZS5tYXAobj0+biBpbnN0YW5jZW9mIHQ/KG4uI24mJnIuYWRkKG4pLG4udmFsdWVPclRocm93KCkpOm4pO3JldHVybiBhd2FpdCBQcm9taXNlLnJhY2Uobyl9ZmluYWxseXtmb3IobGV0IG8gb2YgcilvLnJlamVjdChuZXcgRXJyb3IoXFxcIlRpbWVvdXQgY2xlYXJlZFxcXCIpKX19I2U9ITE7I3I9ITE7I287I3Q7I2E9bmV3IFByb21pc2UoZT0+e3RoaXMuI3Q9ZX0pOyNuOyNpO2NvbnN0cnVjdG9yKGUpe2UmJmUudGltZW91dD4wJiYodGhpcy4jaT1uZXcgcChlLm1lc3NhZ2UpLHRoaXMuI249c2V0VGltZW91dCgoKT0+e3RoaXMucmVqZWN0KHRoaXMuI2kpfSxlLnRpbWVvdXQpKX0jbChlKXtjbGVhclRpbWVvdXQodGhpcy4jbiksdGhpcy4jbz1lLHRoaXMuI3QoKX1yZXNvbHZlKGUpe3RoaXMuI3J8fHRoaXMuI2V8fCh0aGlzLiNlPSEwLHRoaXMuI2woZSkpfXJlamVjdChlKXt0aGlzLiNyfHx0aGlzLiNlfHwodGhpcy4jcj0hMCx0aGlzLiNsKGUpKX1yZXNvbHZlZCgpe3JldHVybiB0aGlzLiNlfWZpbmlzaGVkKCl7cmV0dXJuIHRoaXMuI2V8fHRoaXMuI3J9dmFsdWUoKXtyZXR1cm4gdGhpcy4jb30jczt2YWx1ZU9yVGhyb3coKXtyZXR1cm4gdGhpcy4jc3x8KHRoaXMuI3M9KGFzeW5jKCk9PntpZihhd2FpdCB0aGlzLiNhLHRoaXMuI3IpdGhyb3cgdGhpcy4jbztyZXR1cm4gdGhpcy4jb30pKCkpLHRoaXMuI3N9fTt2YXIgTD1uZXcgTWFwLEY9dD0+e2xldCBlPUwuZ2V0KHQpO3JldHVybiBlfHwoZT1uZXcgRnVuY3Rpb24oYHJldHVybiAke3R9YCkoKSxMLnNldCh0LGUpLGUpfTt2YXIgeD17fTtsKHgse2FyaWFRdWVyeVNlbGVjdG9yOigpPT5HLGFyaWFRdWVyeVNlbGVjdG9yQWxsOigpPT5ifSk7dmFyIEc9KHQsZSk9Pmdsb2JhbFRoaXMuX19hcmlhUXVlcnlTZWxlY3Rvcih0LGUpLGI9YXN5bmMgZnVuY3Rpb24qKHQsZSl7eWllbGQqYXdhaXQgZ2xvYmFsVGhpcy5fX2FyaWFRdWVyeVNlbGVjdG9yQWxsKHQsZSl9O3ZhciBFPXt9O2woRSx7Y3NzUXVlcnlTZWxlY3RvcjooKT0+Syxjc3NRdWVyeVNlbGVjdG9yQWxsOigpPT5afSk7dmFyIEs9KHQsZSk9PnQucXVlcnlTZWxlY3RvcihlKSxaPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChlKX07dmFyIEE9e307bChBLHtjdXN0b21RdWVyeVNlbGVjdG9yczooKT0+UH0pO3ZhciB2PWNsYXNzeyNlPW5ldyBNYXA7cmVnaXN0ZXIoZSxyKXtpZighci5xdWVyeU9uZSYmci5xdWVyeUFsbCl7bGV0IG89ci5xdWVyeUFsbDtyLnF1ZXJ5T25lPShuLGkpPT57Zm9yKGxldCBzIG9mIG8obixpKSlyZXR1cm4gcztyZXR1cm4gbnVsbH19ZWxzZSBpZihyLnF1ZXJ5T25lJiYhci5xdWVyeUFsbCl7bGV0IG89ci5xdWVyeU9uZTtyLnF1ZXJ5QWxsPShuLGkpPT57bGV0IHM9byhuLGkpO3JldHVybiBzP1tzXTpbXX19ZWxzZSBpZighci5xdWVyeU9uZXx8IXIucXVlcnlBbGwpdGhyb3cgbmV3IEVycm9yKFxcXCJBdCBsZWFzdCBvbmUgcXVlcnkgbWV0aG9kIG11c3QgYmUgZGVmaW5lZC5cXFwiKTt0aGlzLiNlLnNldChlLHtxdWVyeVNlbGVjdG9yOnIucXVlcnlPbmUscXVlcnlTZWxlY3RvckFsbDpyLnF1ZXJ5QWxsfSl9dW5yZWdpc3RlcihlKXt0aGlzLiNlLmRlbGV0ZShlKX1nZXQoZSl7cmV0dXJuIHRoaXMuI2UuZ2V0KGUpfWNsZWFyKCl7dGhpcy4jZS5jbGVhcigpfX0sUD1uZXcgdjt2YXIgUj17fTtsKFIse3BpZXJjZVF1ZXJ5U2VsZWN0b3I6KCk9PmVlLHBpZXJjZVF1ZXJ5U2VsZWN0b3JBbGw6KCk9PnRlfSk7dmFyIGVlPSh0LGUpPT57bGV0IHI9bnVsbCxvPW49PntsZXQgaT1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKG4sTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO2Rve2xldCBzPWkuY3VycmVudE5vZGU7cy5zaGFkb3dSb290JiZvKHMuc2hhZG93Um9vdCksIShzIGluc3RhbmNlb2YgU2hhZG93Um9vdCkmJnMhPT1uJiYhciYmcy5tYXRjaGVzKGUpJiYocj1zKX13aGlsZSghciYmaS5uZXh0Tm9kZSgpKX07cmV0dXJuIHQgaW5zdGFuY2VvZiBEb2N1bWVudCYmKHQ9dC5kb2N1bWVudEVsZW1lbnQpLG8odCkscn0sdGU9KHQsZSk9PntsZXQgcj1bXSxvPW49PntsZXQgaT1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKG4sTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO2Rve2xldCBzPWkuY3VycmVudE5vZGU7cy5zaGFkb3dSb290JiZvKHMuc2hhZG93Um9vdCksIShzIGluc3RhbmNlb2YgU2hhZG93Um9vdCkmJnMhPT1uJiZzLm1hdGNoZXMoZSkmJnIucHVzaChzKX13aGlsZShpLm5leHROb2RlKCkpfTtyZXR1cm4gdCBpbnN0YW5jZW9mIERvY3VtZW50JiYodD10LmRvY3VtZW50RWxlbWVudCksbyh0KSxyfTt2YXIgdT0odCxlKT0+e2lmKCF0KXRocm93IG5ldyBFcnJvcihlKX07dmFyIHk9Y2xhc3N7I2U7I3I7I287I3Q7Y29uc3RydWN0b3IoZSxyKXt0aGlzLiNlPWUsdGhpcy4jcj1yfWFzeW5jIHN0YXJ0KCl7bGV0IGU9dGhpcy4jdD1jLmNyZWF0ZSgpLHI9YXdhaXQgdGhpcy4jZSgpO2lmKHIpe2UucmVzb2x2ZShyKTtyZXR1cm59dGhpcy4jbz1uZXcgTXV0YXRpb25PYnNlcnZlcihhc3luYygpPT57bGV0IG89YXdhaXQgdGhpcy4jZSgpO28mJihlLnJlc29sdmUobyksYXdhaXQgdGhpcy5zdG9wKCkpfSksdGhpcy4jby5vYnNlcnZlKHRoaXMuI3Ise2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwLGF0dHJpYnV0ZXM6ITB9KX1hc3luYyBzdG9wKCl7dSh0aGlzLiN0LFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jdC5maW5pc2hlZCgpfHx0aGlzLiN0LnJlamVjdChuZXcgRXJyb3IoXFxcIlBvbGxpbmcgc3RvcHBlZFxcXCIpKSx0aGlzLiNvJiYodGhpcy4jby5kaXNjb25uZWN0KCksdGhpcy4jbz12b2lkIDApfXJlc3VsdCgpe3JldHVybiB1KHRoaXMuI3QsXFxcIlBvbGxpbmcgbmV2ZXIgc3RhcnRlZC5cXFwiKSx0aGlzLiN0LnZhbHVlT3JUaHJvdygpfX0sdz1jbGFzc3sjZTsjcjtjb25zdHJ1Y3RvcihlKXt0aGlzLiNlPWV9YXN5bmMgc3RhcnQoKXtsZXQgZT10aGlzLiNyPWMuY3JlYXRlKCkscj1hd2FpdCB0aGlzLiNlKCk7aWYocil7ZS5yZXNvbHZlKHIpO3JldHVybn1sZXQgbz1hc3luYygpPT57aWYoZS5maW5pc2hlZCgpKXJldHVybjtsZXQgbj1hd2FpdCB0aGlzLiNlKCk7aWYoIW4pe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobyk7cmV0dXJufWUucmVzb2x2ZShuKSxhd2FpdCB0aGlzLnN0b3AoKX07d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShvKX1hc3luYyBzdG9wKCl7dSh0aGlzLiNyLFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jci5maW5pc2hlZCgpfHx0aGlzLiNyLnJlamVjdChuZXcgRXJyb3IoXFxcIlBvbGxpbmcgc3RvcHBlZFxcXCIpKX1yZXN1bHQoKXtyZXR1cm4gdSh0aGlzLiNyLFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jci52YWx1ZU9yVGhyb3coKX19LFQ9Y2xhc3N7I2U7I3I7I287I3Q7Y29uc3RydWN0b3IoZSxyKXt0aGlzLiNlPWUsdGhpcy4jcj1yfWFzeW5jIHN0YXJ0KCl7bGV0IGU9dGhpcy4jdD1jLmNyZWF0ZSgpLHI9YXdhaXQgdGhpcy4jZSgpO2lmKHIpe2UucmVzb2x2ZShyKTtyZXR1cm59dGhpcy4jbz1zZXRJbnRlcnZhbChhc3luYygpPT57bGV0IG89YXdhaXQgdGhpcy4jZSgpO28mJihlLnJlc29sdmUobyksYXdhaXQgdGhpcy5zdG9wKCkpfSx0aGlzLiNyKX1hc3luYyBzdG9wKCl7dSh0aGlzLiN0LFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jdC5maW5pc2hlZCgpfHx0aGlzLiN0LnJlamVjdChuZXcgRXJyb3IoXFxcIlBvbGxpbmcgc3RvcHBlZFxcXCIpKSx0aGlzLiNvJiYoY2xlYXJJbnRlcnZhbCh0aGlzLiNvKSx0aGlzLiNvPXZvaWQgMCl9cmVzdWx0KCl7cmV0dXJuIHUodGhpcy4jdCxcXFwiUG9sbGluZyBuZXZlciBzdGFydGVkLlxcXCIpLHRoaXMuI3QudmFsdWVPclRocm93KCl9fTt2YXIgXz17fTtsKF8se1BDb21iaW5hdG9yOigpPT5ILHBRdWVyeVNlbGVjdG9yOigpPT5mZSxwUXVlcnlTZWxlY3RvckFsbDooKT0+JH0pO3ZhciBhPWNsYXNze3N0YXRpYyBhc3luYyptYXAoZSxyKXtmb3IgYXdhaXQobGV0IG8gb2YgZSl5aWVsZCBhd2FpdCByKG8pfXN0YXRpYyBhc3luYypmbGF0TWFwKGUscil7Zm9yIGF3YWl0KGxldCBvIG9mIGUpeWllbGQqcihvKX1zdGF0aWMgYXN5bmMgY29sbGVjdChlKXtsZXQgcj1bXTtmb3IgYXdhaXQobGV0IG8gb2YgZSlyLnB1c2gobyk7cmV0dXJuIHJ9c3RhdGljIGFzeW5jIGZpcnN0KGUpe2ZvciBhd2FpdChsZXQgciBvZiBlKXJldHVybiByfX07dmFyIEM9e307bChDLHt0ZXh0UXVlcnlTZWxlY3RvckFsbDooKT0+bX0pO3ZhciByZT1uZXcgU2V0KFtcXFwiY2hlY2tib3hcXFwiLFxcXCJpbWFnZVxcXCIsXFxcInJhZGlvXFxcIl0pLG9lPXQ9PnQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudHx8dCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnR8fHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50JiYhcmUuaGFzKHQudHlwZSksbmU9bmV3IFNldChbXFxcIlNDUklQVFxcXCIsXFxcIlNUWUxFXFxcIl0pLGY9dD0+IW5lLmhhcyh0Lm5vZGVOYW1lKSYmIWRvY3VtZW50LmhlYWQ/LmNvbnRhaW5zKHQpLEk9bmV3IFdlYWtNYXAsaj10PT57Zm9yKDt0OylJLmRlbGV0ZSh0KSx0IGluc3RhbmNlb2YgU2hhZG93Um9vdD90PXQuaG9zdDp0PXQucGFyZW50Tm9kZX0sVz1uZXcgV2Vha1NldCxzZT1uZXcgTXV0YXRpb25PYnNlcnZlcih0PT57Zm9yKGxldCBlIG9mIHQpaihlLnRhcmdldCl9KSxkPXQ9PntsZXQgZT1JLmdldCh0KTtpZihlfHwoZT17ZnVsbDpcXFwiXFxcIixpbW1lZGlhdGU6W119LCFmKHQpKSlyZXR1cm4gZTtsZXQgcj1cXFwiXFxcIjtpZihvZSh0KSllLmZ1bGw9dC52YWx1ZSxlLmltbWVkaWF0ZS5wdXNoKHQudmFsdWUpLHQuYWRkRXZlbnRMaXN0ZW5lcihcXFwiaW5wdXRcXFwiLG89PntqKG8udGFyZ2V0KX0se29uY2U6ITAsY2FwdHVyZTohMH0pO2Vsc2V7Zm9yKGxldCBvPXQuZmlyc3RDaGlsZDtvO289by5uZXh0U2libGluZyl7aWYoby5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXtlLmZ1bGwrPW8ubm9kZVZhbHVlPz9cXFwiXFxcIixyKz1vLm5vZGVWYWx1ZT8/XFxcIlxcXCI7Y29udGludWV9ciYmZS5pbW1lZGlhdGUucHVzaChyKSxyPVxcXCJcXFwiLG8ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGUuZnVsbCs9ZChvKS5mdWxsKX1yJiZlLmltbWVkaWF0ZS5wdXNoKHIpLHQgaW5zdGFuY2VvZiBFbGVtZW50JiZ0LnNoYWRvd1Jvb3QmJihlLmZ1bGwrPWQodC5zaGFkb3dSb290KS5mdWxsKSxXLmhhcyh0KXx8KHNlLm9ic2VydmUodCx7Y2hpbGRMaXN0OiEwLGNoYXJhY3RlckRhdGE6ITAsc3VidHJlZTohMH0pLFcuYWRkKHQpKX1yZXR1cm4gSS5zZXQodCxlKSxlfTt2YXIgbT1mdW5jdGlvbioodCxlKXtsZXQgcj0hMTtmb3IobGV0IG8gb2YgdC5jaGlsZE5vZGVzKWlmKG8gaW5zdGFuY2VvZiBFbGVtZW50JiZmKG8pKXtsZXQgbjtvLnNoYWRvd1Jvb3Q/bj1tKG8uc2hhZG93Um9vdCxlKTpuPW0obyxlKTtmb3IobGV0IGkgb2Ygbil5aWVsZCBpLHI9ITB9cnx8dCBpbnN0YW5jZW9mIEVsZW1lbnQmJmYodCkmJmQodCkuZnVsbC5pbmNsdWRlcyhlKSYmKHlpZWxkIHQpfTt2YXIgaz17fTtsKGsse2NoZWNrVmlzaWJpbGl0eTooKT0+bGUscGllcmNlOigpPT5TLHBpZXJjZUFsbDooKT0+T30pO3ZhciBpZT1bXFxcImhpZGRlblxcXCIsXFxcImNvbGxhcHNlXFxcIl0sbGU9KHQsZSk9PntpZighdClyZXR1cm4gZT09PSExO2lmKGU9PT12b2lkIDApcmV0dXJuIHQ7bGV0IHI9dC5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFP3QucGFyZW50RWxlbWVudDp0LG89d2luZG93LmdldENvbXB1dGVkU3R5bGUociksbj1vJiYhaWUuaW5jbHVkZXMoby52aXNpYmlsaXR5KSYmIWFlKHIpO3JldHVybiBlPT09bj90OiExfTtmdW5jdGlvbiBhZSh0KXtsZXQgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBlLndpZHRoPT09MHx8ZS5oZWlnaHQ9PT0wfXZhciBjZT10PT5cXFwic2hhZG93Um9vdFxcXCJpbiB0JiZ0LnNoYWRvd1Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290O2Z1bmN0aW9uKlModCl7Y2UodCk/eWllbGQgdC5zaGFkb3dSb290OnlpZWxkIHR9ZnVuY3Rpb24qTyh0KXt0PVModCkubmV4dCgpLnZhbHVlLHlpZWxkIHQ7bGV0IGU9W2RvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIodCxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCldO2ZvcihsZXQgciBvZiBlKXtsZXQgbztmb3IoO289ci5uZXh0Tm9kZSgpOylvLnNoYWRvd1Jvb3QmJih5aWVsZCBvLnNoYWRvd1Jvb3QsZS5wdXNoKGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoby5zaGFkb3dSb290LE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKSkpfX12YXIgUT17fTtsKFEse3hwYXRoUXVlcnlTZWxlY3RvckFsbDooKT0+cX0pO3ZhciBxPWZ1bmN0aW9uKih0LGUscj0tMSl7bGV0IG49KHQub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQpLmV2YWx1YXRlKGUsdCxudWxsLFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9JVEVSQVRPUl9UWVBFKSxpPVtdLHM7Zm9yKDsocz1uLml0ZXJhdGVOZXh0KCkpJiYoaS5wdXNoKHMpLCEociYmaS5sZW5ndGg9PT1yKSk7KTtmb3IobGV0IGg9MDtoPGkubGVuZ3RoO2grKylzPWlbaF0seWllbGQgcyxkZWxldGUgaVtoXX07dmFyIHVlPS9bLVxcXFx3XFxcXFB7QVNDSUl9Kl0vLEg9KHI9PihyLkRlc2NlbmRlbnQ9XFxcIj4+PlxcXCIsci5DaGlsZD1cXFwiPj4+PlxcXCIscikpKEh8fHt9KSxWPXQ9PlxcXCJxdWVyeVNlbGVjdG9yQWxsXFxcImluIHQsTT1jbGFzc3sjZTsjcj1bXTsjbz12b2lkIDA7ZWxlbWVudHM7Y29uc3RydWN0b3IoZSxyKXt0aGlzLmVsZW1lbnRzPVtlXSx0aGlzLiNlPXIsdGhpcy4jdCgpfWFzeW5jIHJ1bigpe2lmKHR5cGVvZiB0aGlzLiNvPT1cXFwic3RyaW5nXFxcIilzd2l0Y2godGhpcy4jby50cmltU3RhcnQoKSl7Y2FzZVxcXCI6c2NvcGVcXFwiOnRoaXMuI3QoKTticmVha31mb3IoO3RoaXMuI28hPT12b2lkIDA7dGhpcy4jdCgpKXtsZXQgZT10aGlzLiNvO3R5cGVvZiBlPT1cXFwic3RyaW5nXFxcIj9lWzBdJiZ1ZS50ZXN0KGVbMF0pP3RoaXMuZWxlbWVudHM9YS5mbGF0TWFwKHRoaXMuZWxlbWVudHMsYXN5bmMgZnVuY3Rpb24qKHIpe1YocikmJih5aWVsZCpyLnF1ZXJ5U2VsZWN0b3JBbGwoZSkpfSk6dGhpcy5lbGVtZW50cz1hLmZsYXRNYXAodGhpcy5lbGVtZW50cyxhc3luYyBmdW5jdGlvbioocil7aWYoIXIucGFyZW50RWxlbWVudCl7aWYoIVYocikpcmV0dXJuO3lpZWxkKnIucXVlcnlTZWxlY3RvckFsbChlKTtyZXR1cm59bGV0IG89MDtmb3IobGV0IG4gb2Ygci5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKWlmKCsrbyxuPT09cilicmVhazt5aWVsZCpyLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChgOnNjb3BlPjpudGgtY2hpbGQoJHtvfSkke2V9YCl9KTp0aGlzLmVsZW1lbnRzPWEuZmxhdE1hcCh0aGlzLmVsZW1lbnRzLGFzeW5jIGZ1bmN0aW9uKihyKXtzd2l0Y2goZS5uYW1lKXtjYXNlXFxcInRleHRcXFwiOnlpZWxkKm0ocixlLnZhbHVlKTticmVhaztjYXNlXFxcInhwYXRoXFxcIjp5aWVsZCpxKHIsZS52YWx1ZSk7YnJlYWs7Y2FzZVxcXCJhcmlhXFxcIjp5aWVsZCpiKHIsZS52YWx1ZSk7YnJlYWs7ZGVmYXVsdDpsZXQgbz1QLmdldChlLm5hbWUpO2lmKCFvKXRocm93IG5ldyBFcnJvcihgVW5rbm93biBzZWxlY3RvciB0eXBlOiAke2UubmFtZX1gKTt5aWVsZCpvLnF1ZXJ5U2VsZWN0b3JBbGwocixlLnZhbHVlKX19KX19I3QoKXtpZih0aGlzLiNyLmxlbmd0aCE9PTApe3RoaXMuI289dGhpcy4jci5zaGlmdCgpO3JldHVybn1pZih0aGlzLiNlLmxlbmd0aD09PTApe3RoaXMuI289dm9pZCAwO3JldHVybn1sZXQgZT10aGlzLiNlLnNoaWZ0KCk7c3dpdGNoKGUpe2Nhc2VcXFwiPj4+PlxcXCI6e3RoaXMuZWxlbWVudHM9YS5mbGF0TWFwKHRoaXMuZWxlbWVudHMsUyksdGhpcy4jdCgpO2JyZWFrfWNhc2VcXFwiPj4+XFxcIjp7dGhpcy5lbGVtZW50cz1hLmZsYXRNYXAodGhpcy5lbGVtZW50cyxPKSx0aGlzLiN0KCk7YnJlYWt9ZGVmYXVsdDp0aGlzLiNyPWUsdGhpcy4jdCgpO2JyZWFrfX19LEQ9Y2xhc3N7I2U9bmV3IFdlYWtNYXA7Y2FsY3VsYXRlKGUscj1bXSl7aWYoZT09PW51bGwpcmV0dXJuIHI7ZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QmJihlPWUuaG9zdCk7bGV0IG89dGhpcy4jZS5nZXQoZSk7aWYobylyZXR1cm5bLi4ubywuLi5yXTtsZXQgbj0wO2ZvcihsZXQgcz1lLnByZXZpb3VzU2libGluZztzO3M9cy5wcmV2aW91c1NpYmxpbmcpKytuO2xldCBpPXRoaXMuY2FsY3VsYXRlKGUucGFyZW50Tm9kZSxbbl0pO3JldHVybiB0aGlzLiNlLnNldChlLGkpLFsuLi5pLC4uLnJdfX0sVT0odCxlKT0+e2lmKHQubGVuZ3RoK2UubGVuZ3RoPT09MClyZXR1cm4gMDtsZXRbcj0tMSwuLi5vXT10LFtuPS0xLC4uLmldPWU7cmV0dXJuIHI9PT1uP1UobyxpKTpyPG4/LTE6MX0sZGU9YXN5bmMgZnVuY3Rpb24qKHQpe2xldCBlPW5ldyBTZXQ7Zm9yIGF3YWl0KGxldCBvIG9mIHQpZS5hZGQobyk7bGV0IHI9bmV3IEQ7eWllbGQqWy4uLmUudmFsdWVzKCldLm1hcChvPT5bbyxyLmNhbGN1bGF0ZShvKV0pLnNvcnQoKFssb10sWyxuXSk9PlUobyxuKSkubWFwKChbb10pPT5vKX0sJD1mdW5jdGlvbih0LGUpe2xldCByPUpTT04ucGFyc2UoZSk7aWYoci5zb21lKG89PntsZXQgbj0wO3JldHVybiBvLnNvbWUoaT0+KHR5cGVvZiBpPT1cXFwic3RyaW5nXFxcIj8rK246bj0wLG4+MSkpfSkpdGhyb3cgbmV3IEVycm9yKFxcXCJNdWx0aXBsZSBkZWVwIGNvbWJpbmF0b3JzIGZvdW5kIGluIHNlcXVlbmNlLlxcXCIpO3JldHVybiBkZShhLmZsYXRNYXAocixvPT57bGV0IG49bmV3IE0odCxvKTtyZXR1cm4gbi5ydW4oKSxuLmVsZW1lbnRzfSkpfSxmZT1hc3luYyBmdW5jdGlvbih0LGUpe2ZvciBhd2FpdChsZXQgciBvZiAkKHQsZSkpcmV0dXJuIHI7cmV0dXJuIG51bGx9O3ZhciBtZT1PYmplY3QuZnJlZXplKHsuLi54LC4uLkEsLi4uUiwuLi5fLC4uLkMsLi4uaywuLi5RLC4uLkUsRGVmZXJyZWQ6YyxjcmVhdGVGdW5jdGlvbjpGLGNyZWF0ZVRleHRDb250ZW50OmQsSW50ZXJ2YWxQb2xsZXI6VCxpc1N1aXRhYmxlTm9kZUZvclRleHRNYXRjaGluZzpmLE11dGF0aW9uUG9sbGVyOnksUkFGUG9sbGVyOnd9KSxoZT1tZTtcXG5cIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluamVjdGVkLmpzLm1hcCIsIi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBwYWNrYWdlVmVyc2lvbiA9ICcyMi4xMy4wJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vYXBpL2FwaS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NkcC9jZHAuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vY29tbW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmV2aXNpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbC91dGlsLmpzJztcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBxdWVyeSBoYW5kbGVyIEFQSSBkZWZpbmVkIG9uIHtAbGluayBQdXBwZXRlZXJ9XG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC1icm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL2luZGV4LWJyb3dzZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub2RlL25vZGUuanMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IG1rZHRlbXAgfSBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjb21wdXRlU3lzdGVtRXhlY3V0YWJsZVBhdGgsIEJyb3dzZXIgYXMgU3VwcG9ydGVkQnJvd3NlcnMsIENocm9tZVJlbGVhc2VDaGFubmVsIGFzIEJyb3dzZXJzQ2hyb21lUmVsZWFzZUNoYW5uZWwsIH0gZnJvbSAnQHB1cHBldGVlci9icm93c2Vycyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgUHJvZHVjdExhdW5jaGVyIH0gZnJvbSAnLi9Qcm9kdWN0TGF1bmNoZXIuanMnO1xuaW1wb3J0IHsgcm0gfSBmcm9tICcuL3V0aWwvZnMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENocm9tZUxhdW5jaGVyIGV4dGVuZHMgUHJvZHVjdExhdW5jaGVyIHtcbiAgICBjb25zdHJ1Y3RvcihwdXBwZXRlZXIpIHtcbiAgICAgICAgc3VwZXIocHVwcGV0ZWVyLCAnY2hyb21lJyk7XG4gICAgfVxuICAgIGxhdW5jaChvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24ubG9nTGV2ZWwgPT09ICd3YXJuJyAmJlxuICAgICAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicgJiZcbiAgICAgICAgICAgIHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNwdXMgPSBvcy5jcHVzKCk7XG4gICAgICAgICAgICBpZiAoY3B1c1swXT8ubW9kZWwuaW5jbHVkZXMoJ0FwcGxlJykpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oW1xuICAgICAgICAgICAgICAgICAgICAnXFx4MUJbMW1cXHgxQls0M21cXHgxQlszMG0nLFxuICAgICAgICAgICAgICAgICAgICAnRGVncmFkZWQgcGVyZm9ybWFuY2Ugd2FybmluZzpcXHgxQlswbVxceDFCWzMzbScsXG4gICAgICAgICAgICAgICAgICAgICdMYXVuY2hpbmcgQ2hyb21lIG9uIE1hYyBTaWxpY29uIChhcm02NCkgZnJvbSBhbiB4NjQgTm9kZSBpbnN0YWxsYXRpb24gcmVzdWx0cyBpbicsXG4gICAgICAgICAgICAgICAgICAgICdSb3NldHRhIHRyYW5zbGF0aW5nIHRoZSBDaHJvbWUgYmluYXJ5LCBldmVuIGlmIENocm9tZSBpcyBhbHJlYWR5IGFybTY0LiBUaGlzIHdvdWxkJyxcbiAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCBpbiBodWdlIHBlcmZvcm1hbmNlIGlzc3Vlcy4gVG8gcmVzb2x2ZSB0aGlzLCB5b3UgbXVzdCBydW4gUHVwcGV0ZWVyIHdpdGgnLFxuICAgICAgICAgICAgICAgICAgICAnYSB2ZXJzaW9uIG9mIE5vZGUgYnVpbHQgZm9yIGFybTY0LicsXG4gICAgICAgICAgICAgICAgXS5qb2luKCdcXG4gICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIubGF1bmNoKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBjb21wdXRlTGF1bmNoQXJndW1lbnRzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGlnbm9yZURlZmF1bHRBcmdzID0gZmFsc2UsIGFyZ3MgPSBbXSwgcGlwZSA9IGZhbHNlLCBkZWJ1Z2dpbmdQb3J0LCBjaGFubmVsLCBleGVjdXRhYmxlUGF0aCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGNocm9tZUFyZ3VtZW50cyA9IFtdO1xuICAgICAgICBpZiAoIWlnbm9yZURlZmF1bHRBcmdzKSB7XG4gICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaCguLi50aGlzLmRlZmF1bHRBcmdzKG9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlnbm9yZURlZmF1bHRBcmdzKSkge1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goLi4udGhpcy5kZWZhdWx0QXJncyhvcHRpb25zKS5maWx0ZXIoYXJnID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIWlnbm9yZURlZmF1bHRBcmdzLmluY2x1ZGVzKGFyZyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaCguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNocm9tZUFyZ3VtZW50cy5zb21lKGFyZ3VtZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcmd1bWVudC5zdGFydHNXaXRoKCctLXJlbW90ZS1kZWJ1Z2dpbmctJyk7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBpZiAocGlwZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydCghZGVidWdnaW5nUG9ydCwgJ0Jyb3dzZXIgc2hvdWxkIGJlIGxhdW5jaGVkIHdpdGggZWl0aGVyIHBpcGUgb3IgZGVidWdnaW5nIHBvcnQgLSBub3QgYm90aC4nKTtcbiAgICAgICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaCgnLS1yZW1vdGUtZGVidWdnaW5nLXBpcGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNocm9tZUFyZ3VtZW50cy5wdXNoKGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke2RlYnVnZ2luZ1BvcnQgfHwgMH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgaXNUZW1wVXNlckRhdGFEaXIgPSBmYWxzZTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSB1c2VyIGRhdGEgZGlyIGFyZ3VtZW50LCB3aGljaCB3aWxsIGFsd2F5cyBiZSBzZXQgZXZlblxuICAgICAgICAvLyB3aXRoIGEgY3VzdG9tIGRpcmVjdG9yeSBzcGVjaWZpZWQgdmlhIHRoZSB1c2VyRGF0YURpciBvcHRpb24uXG4gICAgICAgIGxldCB1c2VyRGF0YURpckluZGV4ID0gY2hyb21lQXJndW1lbnRzLmZpbmRJbmRleChhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFyZy5zdGFydHNXaXRoKCctLXVzZXItZGF0YS1kaXInKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh1c2VyRGF0YURpckluZGV4IDwgMCkge1xuICAgICAgICAgICAgaXNUZW1wVXNlckRhdGFEaXIgPSB0cnVlO1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goYC0tdXNlci1kYXRhLWRpcj0ke2F3YWl0IG1rZHRlbXAodGhpcy5nZXRQcm9maWxlUGF0aCgpKX1gKTtcbiAgICAgICAgICAgIHVzZXJEYXRhRGlySW5kZXggPSBjaHJvbWVBcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VyRGF0YURpciA9IGNocm9tZUFyZ3VtZW50c1t1c2VyRGF0YURpckluZGV4XS5zcGxpdCgnPScsIDIpWzFdO1xuICAgICAgICBhc3NlcnQodHlwZW9mIHVzZXJEYXRhRGlyID09PSAnc3RyaW5nJywgJ2AtLXVzZXItZGF0YS1kaXJgIGlzIG1hbGZvcm1lZCcpO1xuICAgICAgICBsZXQgY2hyb21lRXhlY3V0YWJsZSA9IGV4ZWN1dGFibGVQYXRoO1xuICAgICAgICBpZiAoIWNocm9tZUV4ZWN1dGFibGUpIHtcbiAgICAgICAgICAgIGFzc2VydChjaGFubmVsIHx8ICF0aGlzLnB1cHBldGVlci5faXNQdXBwZXRlZXJDb3JlLCBgQW4gXFxgZXhlY3V0YWJsZVBhdGhcXGAgb3IgXFxgY2hhbm5lbFxcYCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgXFxgcHVwcGV0ZWVyLWNvcmVcXGBgKTtcbiAgICAgICAgICAgIGNocm9tZUV4ZWN1dGFibGUgPSB0aGlzLmV4ZWN1dGFibGVQYXRoKGNoYW5uZWwsIG9wdGlvbnMuaGVhZGxlc3MgPz8gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4ZWN1dGFibGVQYXRoOiBjaHJvbWVFeGVjdXRhYmxlLFxuICAgICAgICAgICAgYXJnczogY2hyb21lQXJndW1lbnRzLFxuICAgICAgICAgICAgaXNUZW1wVXNlckRhdGFEaXIsXG4gICAgICAgICAgICB1c2VyRGF0YURpcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY2xlYW5Vc2VyRGF0YURpcihwYXRoLCBvcHRzKSB7XG4gICAgICAgIGlmIChvcHRzLmlzVGVtcCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBybShwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGRlZmF1bHRBcmdzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZS9jaHJvbWUtbGF1bmNoZXIvYmxvYi9tYWluL2RvY3MvY2hyb21lLWZsYWdzLWZvci10b29scy5tZFxuICAgICAgICBjb25zdCB1c2VyRGlzYWJsZWRGZWF0dXJlcyA9IGdldEZlYXR1cmVzKCctLWRpc2FibGUtZmVhdHVyZXMnLCBvcHRpb25zLmFyZ3MpO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzICYmIHVzZXJEaXNhYmxlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlbW92ZU1hdGNoaW5nRmxhZ3Mob3B0aW9ucy5hcmdzLCAnLS1kaXNhYmxlLWZlYXR1cmVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHVybk9uRXhwZXJpbWVudGFsRmVhdHVyZXNGb3JUZXN0aW5nID0gcHJvY2Vzcy5lbnZbJ1BVUFBFVEVFUl9URVNUX0VYUEVSSU1FTlRBTF9DSFJPTUVfRkVBVFVSRVMnXSA9PT0gJ3RydWUnO1xuICAgICAgICAvLyBNZXJnZSBkZWZhdWx0IGRpc2FibGVkIGZlYXR1cmVzIHdpdGggdXNlci1wcm92aWRlZCBvbmVzLCBpZiBhbnkuXG4gICAgICAgIGNvbnN0IGRpc2FibGVkRmVhdHVyZXMgPSBbXG4gICAgICAgICAgICAnVHJhbnNsYXRlJyxcbiAgICAgICAgICAgIC8vIEFjY2VwdENIRnJhbWUgZGlzYWJsZWQgYmVjYXVzZSBvZiBjcmJ1Zy5jb20vMTM0ODEwNi5cbiAgICAgICAgICAgICdBY2NlcHRDSEZyYW1lJyxcbiAgICAgICAgICAgICdNZWRpYVJvdXRlcicsXG4gICAgICAgICAgICAnT3B0aW1pemF0aW9uSGludHMnLFxuICAgICAgICAgICAgLi4uKHR1cm5PbkV4cGVyaW1lbnRhbEZlYXR1cmVzRm9yVGVzdGluZ1xuICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vMTQ5MjA1M1xuICAgICAgICAgICAgICAgICAgICAnUHJvY2Vzc1BlclNpdGVVcFRvTWFpbkZyYW1lVGhyZXNob2xkJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3B1cHBldGVlci9wdXBwZXRlZXIvaXNzdWVzLzEwNzE1XG4gICAgICAgICAgICAgICAgICAgICdJc29sYXRlU2FuZGJveGVkSWZyYW1lcycsXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAuLi51c2VyRGlzYWJsZWRGZWF0dXJlcyxcbiAgICAgICAgXS5maWx0ZXIoZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmVhdHVyZSAhPT0gJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB1c2VyRW5hYmxlZEZlYXR1cmVzID0gZ2V0RmVhdHVyZXMoJy0tZW5hYmxlLWZlYXR1cmVzJywgb3B0aW9ucy5hcmdzKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncyAmJiB1c2VyRW5hYmxlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlbW92ZU1hdGNoaW5nRmxhZ3Mob3B0aW9ucy5hcmdzLCAnLS1lbmFibGUtZmVhdHVyZXMnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNZXJnZSBkZWZhdWx0IGVuYWJsZWQgZmVhdHVyZXMgd2l0aCB1c2VyLXByb3ZpZGVkIG9uZXMsIGlmIGFueS5cbiAgICAgICAgY29uc3QgZW5hYmxlZEZlYXR1cmVzID0gW1xuICAgICAgICAgICAgJ1BkZk9vcGlmJyxcbiAgICAgICAgICAgIC8vIEFkZCBmZWF0dXJlcyB0byBlbmFibGUgYnkgZGVmYXVsdCBoZXJlLlxuICAgICAgICAgICAgLi4udXNlckVuYWJsZWRGZWF0dXJlcyxcbiAgICAgICAgXS5maWx0ZXIoZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmVhdHVyZSAhPT0gJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjaHJvbWVBcmd1bWVudHMgPSBbXG4gICAgICAgICAgICAnLS1hbGxvdy1wcmUtY29tbWl0LWlucHV0JyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYmFja2dyb3VuZC1uZXR3b3JraW5nJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYmFja2dyb3VuZC10aW1lci10aHJvdHRsaW5nJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYmFja2dyb3VuZGluZy1vY2NsdWRlZC13aW5kb3dzJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYnJlYWtwYWQnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1jbGllbnQtc2lkZS1waGlzaGluZy1kZXRlY3Rpb24nLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1jb21wb25lbnQtZXh0ZW5zaW9ucy13aXRoLWJhY2tncm91bmQtcGFnZXMnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1jb21wb25lbnQtdXBkYXRlJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtZGVmYXVsdC1hcHBzJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtZGV2LXNobS11c2FnZScsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLWV4dGVuc2lvbnMnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1oYW5nLW1vbml0b3InLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1pbmZvYmFycycsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLWlwYy1mbG9vZGluZy1wcm90ZWN0aW9uJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtcG9wdXAtYmxvY2tpbmcnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1wcm9tcHQtb24tcmVwb3N0JyxcbiAgICAgICAgICAgICctLWRpc2FibGUtcmVuZGVyZXItYmFja2dyb3VuZGluZycsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLXNlYXJjaC1lbmdpbmUtY2hvaWNlLXNjcmVlbicsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLXN5bmMnLFxuICAgICAgICAgICAgJy0tZW5hYmxlLWF1dG9tYXRpb24nLFxuICAgICAgICAgICAgJy0tZXhwb3J0LXRhZ2dlZC1wZGYnLFxuICAgICAgICAgICAgJy0tZ2VuZXJhdGUtcGRmLWRvY3VtZW50LW91dGxpbmUnLFxuICAgICAgICAgICAgJy0tZm9yY2UtY29sb3ItcHJvZmlsZT1zcmdiJyxcbiAgICAgICAgICAgICctLW1ldHJpY3MtcmVjb3JkaW5nLW9ubHknLFxuICAgICAgICAgICAgJy0tbm8tZmlyc3QtcnVuJyxcbiAgICAgICAgICAgICctLXBhc3N3b3JkLXN0b3JlPWJhc2ljJyxcbiAgICAgICAgICAgICctLXVzZS1tb2NrLWtleWNoYWluJyxcbiAgICAgICAgICAgIGAtLWRpc2FibGUtZmVhdHVyZXM9JHtkaXNhYmxlZEZlYXR1cmVzLmpvaW4oJywnKX1gLFxuICAgICAgICAgICAgYC0tZW5hYmxlLWZlYXR1cmVzPSR7ZW5hYmxlZEZlYXR1cmVzLmpvaW4oJywnKX1gLFxuICAgICAgICBdLmZpbHRlcihhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFyZyAhPT0gJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB7IGRldnRvb2xzID0gZmFsc2UsIGhlYWRsZXNzID0gIWRldnRvb2xzLCBhcmdzID0gW10sIHVzZXJEYXRhRGlyLCB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKHVzZXJEYXRhRGlyKSB7XG4gICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaChgLS11c2VyLWRhdGEtZGlyPSR7cGF0aC5yZXNvbHZlKHVzZXJEYXRhRGlyKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGV2dG9vbHMpIHtcbiAgICAgICAgICAgIGNocm9tZUFyZ3VtZW50cy5wdXNoKCctLWF1dG8tb3Blbi1kZXZ0b29scy1mb3ItdGFicycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkbGVzcykge1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goaGVhZGxlc3MgPT09ICdzaGVsbCcgPyAnLS1oZWFkbGVzcycgOiAnLS1oZWFkbGVzcz1uZXcnLCAnLS1oaWRlLXNjcm9sbGJhcnMnLCAnLS1tdXRlLWF1ZGlvJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZ3MuZXZlcnkoYXJnID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcmcuc3RhcnRzV2l0aCgnLScpO1xuICAgICAgICB9KSkge1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goJ2Fib3V0OmJsYW5rJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBjaHJvbWVBcmd1bWVudHM7XG4gICAgfVxuICAgIGV4ZWN1dGFibGVQYXRoKGNoYW5uZWwsIGhlYWRsZXNzKSB7XG4gICAgICAgIGlmIChjaGFubmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcHV0ZVN5c3RlbUV4ZWN1dGFibGVQYXRoKHtcbiAgICAgICAgICAgICAgICBicm93c2VyOiBTdXBwb3J0ZWRCcm93c2Vycy5DSFJPTUUsXG4gICAgICAgICAgICAgICAgY2hhbm5lbDogY29udmVydFB1cHBldGVlckNoYW5uZWxUb0Jyb3dzZXJzQ2hhbm5lbChjaGFubmVsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUV4ZWN1dGFibGVQYXRoKGhlYWRsZXNzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbnZlcnRQdXBwZXRlZXJDaGFubmVsVG9Ccm93c2Vyc0NoYW5uZWwoY2hhbm5lbCkge1xuICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICBjYXNlICdjaHJvbWUnOlxuICAgICAgICAgICAgcmV0dXJuIEJyb3dzZXJzQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFO1xuICAgICAgICBjYXNlICdjaHJvbWUtZGV2JzpcbiAgICAgICAgICAgIHJldHVybiBCcm93c2Vyc0Nocm9tZVJlbGVhc2VDaGFubmVsLkRFVjtcbiAgICAgICAgY2FzZSAnY2hyb21lLWJldGEnOlxuICAgICAgICAgICAgcmV0dXJuIEJyb3dzZXJzQ2hyb21lUmVsZWFzZUNoYW5uZWwuQkVUQTtcbiAgICAgICAgY2FzZSAnY2hyb21lLWNhbmFyeSc6XG4gICAgICAgICAgICByZXR1cm4gQnJvd3NlcnNDaHJvbWVSZWxlYXNlQ2hhbm5lbC5DQU5BUlk7XG4gICAgfVxufVxuLyoqXG4gKiBFeHRyYWN0cyBhbGwgZmVhdHVyZXMgZnJvbSB0aGUgZ2l2ZW4gY29tbWFuZC1saW5lIGZsYWdcbiAqIChlLmcuIGAtLWVuYWJsZS1mZWF0dXJlc2AsIGAtLWVuYWJsZS1mZWF0dXJlcz1gKS5cbiAqXG4gKiBFeGFtcGxlIGlucHV0OlxuICogW1wiLS1lbmFibGUtZmVhdHVyZXM9TmV0d29ya1NlcnZpY2UsTmV0d29ya1NlcnZpY2VJblByb2Nlc3NcIiwgXCItLWVuYWJsZS1mZWF0dXJlcz1Gb29cIl1cbiAqXG4gKiBFeGFtcGxlIG91dHB1dDpcbiAqIFtcIk5ldHdvcmtTZXJ2aWNlXCIsIFwiTmV0d29ya1NlcnZpY2VJblByb2Nlc3NcIiwgXCJGb29cIl1cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZlYXR1cmVzKGZsYWcsIG9wdGlvbnMgPSBbXSkge1xuICAgIHJldHVybiBvcHRpb25zXG4gICAgICAgIC5maWx0ZXIocyA9PiB7XG4gICAgICAgIHJldHVybiBzLnN0YXJ0c1dpdGgoZmxhZy5lbmRzV2l0aCgnPScpID8gZmxhZyA6IGAke2ZsYWd9PWApO1xuICAgIH0pXG4gICAgICAgIC5tYXAocyA9PiB7XG4gICAgICAgIHJldHVybiBzLnNwbGl0KG5ldyBSZWdFeHAoYCR7ZmxhZ309XFxcXHMqYCkpWzFdPy50cmltKCk7XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihzID0+IHtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfSk7XG59XG4vKipcbiAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGluLXBsYWNlIGZyb20gdGhlIGdpdmVuIHN0cmluZyBhcnJheVxuICogdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gY29tbWFuZC1saW5lIGZsYWcuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVNYXRjaGluZ0ZsYWdzKGFycmF5LCBmbGFnKSB7XG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtmbGFnfT0uKmApO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICBpZiAocmVnZXgudGVzdChhcnJheVtpXSkpIHtcbiAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaHJvbWVMYXVuY2hlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IHJlbmFtZSwgdW5saW5rLCBta2R0ZW1wIH0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQnJvd3NlciBhcyBTdXBwb3J0ZWRCcm93c2VycywgY3JlYXRlUHJvZmlsZSwgQ2FjaGUsIGRldGVjdEJyb3dzZXJQbGF0Zm9ybSwgQnJvd3NlciwgfSBmcm9tICdAcHVwcGV0ZWVyL2Jyb3dzZXJzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBQcm9kdWN0TGF1bmNoZXIgfSBmcm9tICcuL1Byb2R1Y3RMYXVuY2hlci5qcyc7XG5pbXBvcnQgeyBybSB9IGZyb20gJy4vdXRpbC9mcy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRmlyZWZveExhdW5jaGVyIGV4dGVuZHMgUHJvZHVjdExhdW5jaGVyIHtcbiAgICBjb25zdHJ1Y3RvcihwdXBwZXRlZXIpIHtcbiAgICAgICAgc3VwZXIocHVwcGV0ZWVyLCAnZmlyZWZveCcpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0UHJlZmVyZW5jZXMoZXh0cmFQcmVmc0ZpcmVmb3gsIHByb3RvY29sKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5leHRyYVByZWZzRmlyZWZveCxcbiAgICAgICAgICAgIC4uLihwcm90b2NvbCA9PT0gJ3dlYkRyaXZlckJpRGknXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZW5hYmxlIHRoZSBXZWJEcml2ZXIgQmlEaSBwcm90b2NvbFxuICAgICAgICAgICAgICAgICAgICAncmVtb3RlLmFjdGl2ZS1wcm90b2NvbHMnOiAxLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGNsb3NlIHRoZSB3aW5kb3cgd2hlbiB0aGUgbGFzdCB0YWIgZ2V0cyBjbG9zZWRcbiAgICAgICAgICAgICAgICAgICAgJ2Jyb3dzZXIudGFicy5jbG9zZVdpbmRvd1dpdGhMYXN0VGFiJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgdmFyaW91cyBlcnJvciBtZXNzYWdlIG9uIHRoZSBjb25zb2xlXG4gICAgICAgICAgICAgICAgICAgIC8vIGplc3QtcHVwcGV0ZWVyIGFzc2VydHMgdGhhdCBubyBlcnJvciBtZXNzYWdlIGlzIGVtaXR0ZWQgYnkgdGhlIGNvbnNvbGVcbiAgICAgICAgICAgICAgICAgICAgJ25ldHdvcmsuY29va2llLmNvb2tpZUJlaGF2aW9yJzogMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gVGVtcG9yYXJpbHkgZm9yY2UgZGlzYWJsZSBCRkNhY2hlIGluIHBhcmVudCAoaHR0cHM6Ly9iaXQubHkvYnVnLTE3MzIyNjMpXG4gICAgICAgICAgICAgICAgICAgICdmaXNzaW9uLmJmY2FjaGVJblBhcmVudCc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGVuYWJsZSB0aGUgQ0RQIHByb3RvY29sXG4gICAgICAgICAgICAgICAgICAgICdyZW1vdGUuYWN0aXZlLXByb3RvY29scyc6IDIsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAvLyBGb3JjZSBhbGwgd2ViIGNvbnRlbnQgdG8gdXNlIGEgc2luZ2xlIGNvbnRlbnQgcHJvY2Vzcy4gVE9ETzogcmVtb3ZlXG4gICAgICAgICAgICAvLyB0aGlzIG9uY2UgRmlyZWZveCBzdXBwb3J0cyBtb3VzZSBldmVudCBkaXNwYXRjaCBmcm9tIHRoZSBtYWluIGZyYW1lXG4gICAgICAgICAgICAvLyBjb250ZXh0LiBPbmNlIHRoaXMgaGFwcGVucywgd2ViQ29udGVudElzb2xhdGlvblN0cmF0ZWd5IHNob3VsZCBvbmx5XG4gICAgICAgICAgICAvLyBiZSBzZXQgZm9yIENEUC4gU2VlXG4gICAgICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzczMzkzXG4gICAgICAgICAgICAnZmlzc2lvbi53ZWJDb250ZW50SXNvbGF0aW9uU3RyYXRlZ3knOiAwLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBjb21wdXRlTGF1bmNoQXJndW1lbnRzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGlnbm9yZURlZmF1bHRBcmdzID0gZmFsc2UsIGFyZ3MgPSBbXSwgZXhlY3V0YWJsZVBhdGgsIHBpcGUgPSBmYWxzZSwgZXh0cmFQcmVmc0ZpcmVmb3ggPSB7fSwgZGVidWdnaW5nUG9ydCA9IG51bGwsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBmaXJlZm94QXJndW1lbnRzID0gW107XG4gICAgICAgIGlmICghaWdub3JlRGVmYXVsdEFyZ3MpIHtcbiAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCguLi50aGlzLmRlZmF1bHRBcmdzKG9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlnbm9yZURlZmF1bHRBcmdzKSkge1xuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKC4uLnRoaXMuZGVmYXVsdEFyZ3Mob3B0aW9ucykuZmlsdGVyKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFpZ25vcmVEZWZhdWx0QXJncy5pbmNsdWRlcyhhcmcpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmlyZWZveEFyZ3VtZW50cy5zb21lKGFyZ3VtZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcmd1bWVudC5zdGFydHNXaXRoKCctLXJlbW90ZS1kZWJ1Z2dpbmctJyk7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBpZiAocGlwZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydChkZWJ1Z2dpbmdQb3J0ID09PSBudWxsLCAnQnJvd3NlciBzaG91bGQgYmUgbGF1bmNoZWQgd2l0aCBlaXRoZXIgcGlwZSBvciBkZWJ1Z2dpbmcgcG9ydCAtIG5vdCBib3RoLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke2RlYnVnZ2luZ1BvcnQgfHwgMH1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdXNlckRhdGFEaXI7XG4gICAgICAgIGxldCBpc1RlbXBVc2VyRGF0YURpciA9IHRydWU7XG4gICAgICAgIC8vIENoZWNrIGZvciB0aGUgcHJvZmlsZSBhcmd1bWVudCwgd2hpY2ggd2lsbCBhbHdheXMgYmUgc2V0IGV2ZW5cbiAgICAgICAgLy8gd2l0aCBhIGN1c3RvbSBkaXJlY3Rvcnkgc3BlY2lmaWVkIHZpYSB0aGUgdXNlckRhdGFEaXIgb3B0aW9uLlxuICAgICAgICBjb25zdCBwcm9maWxlQXJnSW5kZXggPSBmaXJlZm94QXJndW1lbnRzLmZpbmRJbmRleChhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFsnLXByb2ZpbGUnLCAnLS1wcm9maWxlJ10uaW5jbHVkZXMoYXJnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwcm9maWxlQXJnSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB1c2VyRGF0YURpciA9IGZpcmVmb3hBcmd1bWVudHNbcHJvZmlsZUFyZ0luZGV4ICsgMV07XG4gICAgICAgICAgICBpZiAoIXVzZXJEYXRhRGlyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXJlZm94IHByb2ZpbGUgbm90IGZvdW5kIGF0ICcke3VzZXJEYXRhRGlyfSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBjdXN0b20gRmlyZWZveCBwcm9maWxlIGl0IG5lZWRzIHRvIGJlIHBvcHVsYXRlZFxuICAgICAgICAgICAgLy8gd2l0aCByZXF1aXJlZCBwcmVmZXJlbmNlcy5cbiAgICAgICAgICAgIGlzVGVtcFVzZXJEYXRhRGlyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1c2VyRGF0YURpciA9IGF3YWl0IG1rZHRlbXAodGhpcy5nZXRQcm9maWxlUGF0aCgpKTtcbiAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCgnLS1wcm9maWxlJyk7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2godXNlckRhdGFEaXIpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNyZWF0ZVByb2ZpbGUoU3VwcG9ydGVkQnJvd3NlcnMuRklSRUZPWCwge1xuICAgICAgICAgICAgcGF0aDogdXNlckRhdGFEaXIsXG4gICAgICAgICAgICBwcmVmZXJlbmNlczogRmlyZWZveExhdW5jaGVyLmdldFByZWZlcmVuY2VzKGV4dHJhUHJlZnNGaXJlZm94LCBvcHRpb25zLnByb3RvY29sKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBmaXJlZm94RXhlY3V0YWJsZTtcbiAgICAgICAgaWYgKHRoaXMucHVwcGV0ZWVyLl9pc1B1cHBldGVlckNvcmUgfHwgZXhlY3V0YWJsZVBhdGgpIHtcbiAgICAgICAgICAgIGFzc2VydChleGVjdXRhYmxlUGF0aCwgYEFuIFxcYGV4ZWN1dGFibGVQYXRoXFxgIG11c3QgYmUgc3BlY2lmaWVkIGZvciBcXGBwdXBwZXRlZXItY29yZVxcYGApO1xuICAgICAgICAgICAgZmlyZWZveEV4ZWN1dGFibGUgPSBleGVjdXRhYmxlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZpcmVmb3hFeGVjdXRhYmxlID0gdGhpcy5leGVjdXRhYmxlUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1RlbXBVc2VyRGF0YURpcixcbiAgICAgICAgICAgIHVzZXJEYXRhRGlyLFxuICAgICAgICAgICAgYXJnczogZmlyZWZveEFyZ3VtZW50cyxcbiAgICAgICAgICAgIGV4ZWN1dGFibGVQYXRoOiBmaXJlZm94RXhlY3V0YWJsZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY2xlYW5Vc2VyRGF0YURpcih1c2VyRGF0YURpciwgb3B0cykge1xuICAgICAgICBpZiAob3B0cy5pc1RlbXApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcm0odXNlckRhdGFEaXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZGVidWdFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gYW4gZXhpc3RpbmcgdXNlciBwcm9maWxlIGhhcyBiZWVuIHVzZWQgcmVtb3ZlIHRoZSB1c2VyXG4gICAgICAgICAgICAgICAgLy8gcHJlZmVyZW5jZXMgZmlsZSBhbmQgcmVzdG9yZSBwb3NzaWJseSBiYWNrdXBlZCBwcmVmZXJlbmNlcy5cbiAgICAgICAgICAgICAgICBhd2FpdCB1bmxpbmsocGF0aC5qb2luKHVzZXJEYXRhRGlyLCAndXNlci5qcycpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVmc0JhY2t1cFBhdGggPSBwYXRoLmpvaW4odXNlckRhdGFEaXIsICdwcmVmcy5qcy5wdXBwZXRlZXInKTtcbiAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwcmVmc0JhY2t1cFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZzUGF0aCA9IHBhdGguam9pbih1c2VyRGF0YURpciwgJ3ByZWZzLmpzJyk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHVubGluayhwcmVmc1BhdGgpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZW5hbWUocHJlZnNCYWNrdXBQYXRoLCBwcmVmc1BhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGV4ZWN1dGFibGVQYXRoKCkge1xuICAgICAgICAvLyByZXBsYWNlICdsYXRlc3QnIHBsYWNlaG9sZGVyIHdpdGggYWN0dWFsIGRvd25sb2FkZWQgcmV2aXNpb25cbiAgICAgICAgaWYgKHRoaXMucHVwcGV0ZWVyLmJyb3dzZXJSZXZpc2lvbiA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IENhY2hlKHRoaXMucHVwcGV0ZWVyLmRlZmF1bHREb3dubG9hZFBhdGgpO1xuICAgICAgICAgICAgY29uc3QgaW5zdGFsbGVkRmlyZWZveCA9IGNhY2hlLmdldEluc3RhbGxlZEJyb3dzZXJzKCkuZmluZChicm93c2VyID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGJyb3dzZXIucGxhdGZvcm0gPT09IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSgpICYmXG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXIuYnJvd3NlciA9PT0gQnJvd3Nlci5GSVJFRk9YKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGluc3RhbGxlZEZpcmVmb3gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbEJyb3dzZXJSZXZpc2lvbiA9IGluc3RhbGxlZEZpcmVmb3guYnVpbGRJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlRXhlY3V0YWJsZVBhdGgoKTtcbiAgICB9XG4gICAgZGVmYXVsdEFyZ3Mob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgZGV2dG9vbHMgPSBmYWxzZSwgaGVhZGxlc3MgPSAhZGV2dG9vbHMsIGFyZ3MgPSBbXSwgdXNlckRhdGFEaXIgPSBudWxsLCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZmlyZWZveEFyZ3VtZW50cyA9IFsnLS1uby1yZW1vdGUnXTtcbiAgICAgICAgc3dpdGNoIChvcy5wbGF0Zm9ybSgpKSB7XG4gICAgICAgICAgICBjYXNlICdkYXJ3aW4nOlxuICAgICAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCgnLS1mb3JlZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3aW4zMic6XG4gICAgICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKCctLXdhaXQtZm9yLWJyb3dzZXInKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlckRhdGFEaXIpIHtcbiAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCgnLS1wcm9maWxlJyk7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2godXNlckRhdGFEaXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkbGVzcykge1xuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKCctLWhlYWRsZXNzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRldnRvb2xzKSB7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2goJy0tZGV2dG9vbHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJncy5ldmVyeShhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFyZy5zdGFydHNXaXRoKCctJyk7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2goJ2Fib3V0OmJsYW5rJyk7XG4gICAgICAgIH1cbiAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICByZXR1cm4gZmlyZWZveEFyZ3VtZW50cztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaXJlZm94TGF1bmNoZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxhdW5jaE9wdGlvbnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBOb2RlV2ViU29ja2V0IGZyb20gJ3dzJztcbmltcG9ydCB7IHBhY2thZ2VWZXJzaW9uIH0gZnJvbSAnLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE5vZGVXZWJTb2NrZXRUcmFuc3BvcnQge1xuICAgIHN0YXRpYyBjcmVhdGUodXJsLCBoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3cyA9IG5ldyBOb2RlV2ViU29ja2V0KHVybCwgW10sIHtcbiAgICAgICAgICAgICAgICBmb2xsb3dSZWRpcmVjdHM6IHRydWUsXG4gICAgICAgICAgICAgICAgcGVyTWVzc2FnZURlZmxhdGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvYmxvYi9tYXN0ZXIvZG9jL3dzLm1kI25ldy13ZWJzb2NrZXRhZGRyZXNzLXByb3RvY29scy1vcHRpb25zXG4gICAgICAgICAgICAgICAgYWxsb3dTeW5jaHJvbm91c0V2ZW50czogZmFsc2UsXG4gICAgICAgICAgICAgICAgbWF4UGF5bG9hZDogMjU2ICogMTAyNCAqIDEwMjQsIC8vIDI1Nk1iXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IGBQdXBwZXRlZXIgJHtwYWNrYWdlVmVyc2lvbn1gLFxuICAgICAgICAgICAgICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobmV3IE5vZGVXZWJTb2NrZXRUcmFuc3BvcnQod3MpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgI3dzO1xuICAgIG9ubWVzc2FnZTtcbiAgICBvbmNsb3NlO1xuICAgIGNvbnN0cnVjdG9yKHdzKSB7XG4gICAgICAgIHRoaXMuI3dzID0gd3M7XG4gICAgICAgIHRoaXMuI3dzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vbm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9ubWVzc2FnZS5jYWxsKG51bGwsIGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jd3MuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vbmNsb3NlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNsb3NlLmNhbGwobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBTaWxlbnRseSBpZ25vcmUgYWxsIGVycm9ycyAtIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoZW0uXG4gICAgICAgIHRoaXMuI3dzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4geyB9KTtcbiAgICB9XG4gICAgc2VuZChtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuI3dzLnNlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLiN3cy5jbG9zZSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vZGVXZWJTb2NrZXRUcmFuc3BvcnQuanMubWFwIiwiaW1wb3J0IHsgRXZlbnRTdWJzY3JpcHRpb24gfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2sgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBpcGVUcmFuc3BvcnQge1xuICAgICNwaXBlV3JpdGU7XG4gICAgI3N1YnNjcmlwdGlvbnMgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgI2lzQ2xvc2VkID0gZmFsc2U7XG4gICAgI3BlbmRpbmdNZXNzYWdlID0gJyc7XG4gICAgb25jbG9zZTtcbiAgICBvbm1lc3NhZ2U7XG4gICAgY29uc3RydWN0b3IocGlwZVdyaXRlLCBwaXBlUmVhZCkge1xuICAgICAgICB0aGlzLiNwaXBlV3JpdGUgPSBwaXBlV3JpdGU7XG4gICAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbnMudXNlKG5ldyBFdmVudFN1YnNjcmlwdGlvbihwaXBlUmVhZCwgJ2RhdGEnLCAoYnVmZmVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZGlzcGF0Y2goYnVmZmVyKTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRTdWJzY3JpcHRpb24ocGlwZVJlYWQsICdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uY2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2xvc2UuY2FsbChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRTdWJzY3JpcHRpb24ocGlwZVJlYWQsICdlcnJvcicsIGRlYnVnRXJyb3IpKTtcbiAgICAgICAgdGhpcy4jc3Vic2NyaXB0aW9ucy51c2UobmV3IEV2ZW50U3Vic2NyaXB0aW9uKHBpcGVXcml0ZSwgJ2Vycm9yJywgZGVidWdFcnJvcikpO1xuICAgIH1cbiAgICBzZW5kKG1lc3NhZ2UpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNpc0Nsb3NlZCwgJ2BQaXBlVHJhbnNwb3J0YCBpcyBjbG9zZWQuJyk7XG4gICAgICAgIHRoaXMuI3BpcGVXcml0ZS53cml0ZShtZXNzYWdlKTtcbiAgICAgICAgdGhpcy4jcGlwZVdyaXRlLndyaXRlKCdcXDAnKTtcbiAgICB9XG4gICAgI2Rpc3BhdGNoKGJ1ZmZlcikge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2lzQ2xvc2VkLCAnYFBpcGVUcmFuc3BvcnRgIGlzIGNsb3NlZC4nKTtcbiAgICAgICAgbGV0IGVuZCA9IGJ1ZmZlci5pbmRleE9mKCdcXDAnKTtcbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuI3BlbmRpbmdNZXNzYWdlICs9IGJ1ZmZlci50b1N0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLiNwZW5kaW5nTWVzc2FnZSArIGJ1ZmZlci50b1N0cmluZyh1bmRlZmluZWQsIDAsIGVuZCk7XG4gICAgICAgIGlmICh0aGlzLm9ubWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2UuY2FsbChudWxsLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnQgPSBlbmQgKyAxO1xuICAgICAgICBlbmQgPSBidWZmZXIuaW5kZXhPZignXFwwJywgc3RhcnQpO1xuICAgICAgICB3aGlsZSAoZW5kICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub25tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2UuY2FsbChudWxsLCBidWZmZXIudG9TdHJpbmcodW5kZWZpbmVkLCBzdGFydCwgZW5kKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7XG4gICAgICAgICAgICBlbmQgPSBidWZmZXIuaW5kZXhPZignXFwwJywgc3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3BlbmRpbmdNZXNzYWdlID0gYnVmZmVyLnRvU3RyaW5nKHVuZGVmaW5lZCwgc3RhcnQpO1xuICAgIH1cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy4jaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLmRpc3Bvc2UoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QaXBlVHJhbnNwb3J0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQnJvd3NlciBhcyBJbnN0YWxsZWRCcm93c2VyLCBDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBsYXVuY2gsIFRpbWVvdXRFcnJvciBhcyBCcm93c2Vyc1RpbWVvdXRFcnJvciwgV0VCRFJJVkVSX0JJRElfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBjb21wdXRlRXhlY3V0YWJsZVBhdGgsIH0gZnJvbSAnQHB1cHBldGVlci9icm93c2Vycyc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgbWFwLCByYWNlLCB0aW1lciwgfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMnO1xuaW1wb3J0IHsgQ2RwQnJvd3NlciB9IGZyb20gJy4uL2NkcC9Ccm93c2VyLmpzJztcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuLi9jZHAvQ29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBUaW1lb3V0RXJyb3IgfSBmcm9tICcuLi9jb21tb24vRXJyb3JzLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIERFRkFVTFRfVklFV1BPUlQgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBOb2RlV2ViU29ja2V0VHJhbnNwb3J0IGFzIFdlYlNvY2tldFRyYW5zcG9ydCB9IGZyb20gJy4vTm9kZVdlYlNvY2tldFRyYW5zcG9ydC5qcyc7XG5pbXBvcnQgeyBQaXBlVHJhbnNwb3J0IH0gZnJvbSAnLi9QaXBlVHJhbnNwb3J0LmpzJztcbi8qKlxuICogRGVzY3JpYmVzIGEgbGF1bmNoZXIgLSBhIGNsYXNzIHRoYXQgaXMgYWJsZSB0byBjcmVhdGUgYW5kIGxhdW5jaCBhIGJyb3dzZXIgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUHJvZHVjdExhdW5jaGVyIHtcbiAgICAjcHJvZHVjdDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdXBwZXRlZXI7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYWN0dWFsQnJvd3NlclJldmlzaW9uO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHB1cHBldGVlciwgcHJvZHVjdCkge1xuICAgICAgICB0aGlzLnB1cHBldGVlciA9IHB1cHBldGVlcjtcbiAgICAgICAgdGhpcy4jcHJvZHVjdCA9IHByb2R1Y3Q7XG4gICAgfVxuICAgIGdldCBwcm9kdWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvZHVjdDtcbiAgICB9XG4gICAgYXN5bmMgbGF1bmNoKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGR1bXBpbyA9IGZhbHNlLCBlbnYgPSBwcm9jZXNzLmVudiwgaGFuZGxlU0lHSU5UID0gdHJ1ZSwgaGFuZGxlU0lHVEVSTSA9IHRydWUsIGhhbmRsZVNJR0hVUCA9IHRydWUsIGlnbm9yZUhUVFBTRXJyb3JzID0gZmFsc2UsIGRlZmF1bHRWaWV3cG9ydCA9IERFRkFVTFRfVklFV1BPUlQsIHNsb3dNbyA9IDAsIHRpbWVvdXQgPSAzMDAwMCwgd2FpdEZvckluaXRpYWxQYWdlID0gdHJ1ZSwgcHJvdG9jb2xUaW1lb3V0LCBwcm90b2NvbCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGxhdW5jaEFyZ3MgPSBhd2FpdCB0aGlzLmNvbXB1dGVMYXVuY2hBcmd1bWVudHMob3B0aW9ucyk7XG4gICAgICAgIGlmICghZXhpc3RzU3luYyhsYXVuY2hBcmdzLmV4ZWN1dGFibGVQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm93c2VyIHdhcyBub3QgZm91bmQgYXQgdGhlIGNvbmZpZ3VyZWQgZXhlY3V0YWJsZVBhdGggKCR7bGF1bmNoQXJncy5leGVjdXRhYmxlUGF0aH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlUGlwZSA9IGxhdW5jaEFyZ3MuYXJncy5pbmNsdWRlcygnLS1yZW1vdGUtZGVidWdnaW5nLXBpcGUnKTtcbiAgICAgICAgY29uc3Qgb25Qcm9jZXNzRXhpdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYW5Vc2VyRGF0YURpcihsYXVuY2hBcmdzLnVzZXJEYXRhRGlyLCB7XG4gICAgICAgICAgICAgICAgaXNUZW1wOiBsYXVuY2hBcmdzLmlzVGVtcFVzZXJEYXRhRGlyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLiNwcm9kdWN0ID09PSAnZmlyZWZveCcgJiZcbiAgICAgICAgICAgIHByb3RvY29sICE9PSAnd2ViRHJpdmVyQmlEaScgJiZcbiAgICAgICAgICAgIHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24ubG9nTGV2ZWwgPT09ICd3YXJuJykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2wgKENEUCkgc3VwcG9ydCBmb3IgRmlyZWZveCBpcyBkZXByZWNhdGVkIGluIFB1cHBldGVlciBgICtcbiAgICAgICAgICAgICAgICBgYW5kIGl0IHdpbGwgYmUgZXZlbnR1YWxseSByZW1vdmVkLiBgICtcbiAgICAgICAgICAgICAgICBgVXNlIFdlYkRyaXZlciBCaURpIGluc3RlYWQgKHNlZSBodHRwczovL3BwdHIuZGV2L3dlYmRyaXZlci1iaWRpI2dldC1zdGFydGVkKS5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBicm93c2VyUHJvY2VzcyA9IGxhdW5jaCh7XG4gICAgICAgICAgICBleGVjdXRhYmxlUGF0aDogbGF1bmNoQXJncy5leGVjdXRhYmxlUGF0aCxcbiAgICAgICAgICAgIGFyZ3M6IGxhdW5jaEFyZ3MuYXJncyxcbiAgICAgICAgICAgIGhhbmRsZVNJR0hVUCxcbiAgICAgICAgICAgIGhhbmRsZVNJR1RFUk0sXG4gICAgICAgICAgICBoYW5kbGVTSUdJTlQsXG4gICAgICAgICAgICBkdW1waW8sXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICBwaXBlOiB1c2VQaXBlLFxuICAgICAgICAgICAgb25FeGl0OiBvblByb2Nlc3NFeGl0LFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGJyb3dzZXI7XG4gICAgICAgIGxldCBjZHBDb25uZWN0aW9uO1xuICAgICAgICBsZXQgY2xvc2luZyA9IGZhbHNlO1xuICAgICAgICBjb25zdCBicm93c2VyQ2xvc2VDYWxsYmFjayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChjbG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xvc2luZyA9IHRydWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlQnJvd3Nlcihicm93c2VyUHJvY2VzcywgY2RwQ29ubmVjdGlvbik7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jcHJvZHVjdCA9PT0gJ2ZpcmVmb3gnICYmIHByb3RvY29sID09PSAnd2ViRHJpdmVyQmlEaScpIHtcbiAgICAgICAgICAgICAgICBicm93c2VyID0gYXdhaXQgdGhpcy5jcmVhdGVCaURpQnJvd3Nlcihicm93c2VyUHJvY2VzcywgYnJvd3NlckNsb3NlQ2FsbGJhY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xUaW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICBzbG93TW8sXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodXNlUGlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjZHBDb25uZWN0aW9uID0gYXdhaXQgdGhpcy5jcmVhdGVDZHBQaXBlQ29ubmVjdGlvbihicm93c2VyUHJvY2Vzcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sVGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3dNbyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjZHBDb25uZWN0aW9uID0gYXdhaXQgdGhpcy5jcmVhdGVDZHBTb2NrZXRDb25uZWN0aW9uKGJyb3dzZXJQcm9jZXNzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xUaW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2xvd01vLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb3RvY29sID09PSAnd2ViRHJpdmVyQmlEaScpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlciA9IGF3YWl0IHRoaXMuY3JlYXRlQmlEaU92ZXJDZHBCcm93c2VyKGJyb3dzZXJQcm9jZXNzLCBjZHBDb25uZWN0aW9uLCBicm93c2VyQ2xvc2VDYWxsYmFjaywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlciA9IGF3YWl0IENkcEJyb3dzZXIuX2NyZWF0ZSh0aGlzLnByb2R1Y3QsIGNkcENvbm5lY3Rpb24sIFtdLCBpZ25vcmVIVFRQU0Vycm9ycywgZGVmYXVsdFZpZXdwb3J0LCBicm93c2VyUHJvY2Vzcy5ub2RlUHJvY2VzcywgYnJvd3NlckNsb3NlQ2FsbGJhY2ssIG9wdGlvbnMudGFyZ2V0RmlsdGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB2b2lkIGJyb3dzZXJDbG9zZUNhbGxiYWNrKCk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCcm93c2Vyc1RpbWVvdXRFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2FpdEZvckluaXRpYWxQYWdlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JQYWdlVGFyZ2V0KGJyb3dzZXIsIHRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBicm93c2VyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgb25seSBmb3IgRmlyZWZveCwgYWZ0ZXIgdGhlIGxhdW5jaGVyIHJlc29sdmVzIHRoZSBgbGF0ZXN0YCByZXZpc2lvbiB0b1xuICAgICAqIHRoZSBhY3R1YWwgcmV2aXNpb24uXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0QWN0dWFsQnJvd3NlclJldmlzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3R1YWxCcm93c2VyUmV2aXNpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIGNsb3NlQnJvd3Nlcihicm93c2VyUHJvY2VzcywgY2RwQ29ubmVjdGlvbikge1xuICAgICAgICBpZiAoY2RwQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBjbG9zZSB0aGUgYnJvd3NlciBncmFjZWZ1bGx5XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNkcENvbm5lY3Rpb24uY2xvc2VCcm93c2VyKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYnJvd3NlclByb2Nlc3MuaGFzQ2xvc2VkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBicm93c2VyUHJvY2Vzcy5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV2FpdCBmb3IgYSBwb3NzaWJsZSBncmFjZWZ1bCBzaHV0ZG93bi5cbiAgICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHJhY2UoZnJvbShicm93c2VyUHJvY2Vzcy5oYXNDbG9zZWQoKSksIHRpbWVyKDUwMDApLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShicm93c2VyUHJvY2Vzcy5jbG9zZSgpKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JQYWdlVGFyZ2V0KGJyb3dzZXIsIHRpbWVvdXQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGJyb3dzZXIud2FpdEZvclRhcmdldCh0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC50eXBlKCkgPT09ICdwYWdlJztcbiAgICAgICAgICAgIH0sIHsgdGltZW91dCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUNkcFNvY2tldENvbm5lY3Rpb24oYnJvd3NlclByb2Nlc3MsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgYnJvd3NlcldTRW5kcG9pbnQgPSBhd2FpdCBicm93c2VyUHJvY2Vzcy53YWl0Rm9yTGluZU91dHB1dChDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBvcHRzLnRpbWVvdXQpO1xuICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSBhd2FpdCBXZWJTb2NrZXRUcmFuc3BvcnQuY3JlYXRlKGJyb3dzZXJXU0VuZHBvaW50KTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uKGJyb3dzZXJXU0VuZHBvaW50LCB0cmFuc3BvcnQsIG9wdHMuc2xvd01vLCBvcHRzLnByb3RvY29sVGltZW91dCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUNkcFBpcGVDb25uZWN0aW9uKGJyb3dzZXJQcm9jZXNzLCBvcHRzKSB7XG4gICAgICAgIC8vIHN0ZGlvIHdhcyBhc3NpZ25lZCBkdXJpbmcgc3RhcnQoKSwgYW5kIHRoZSAncGlwZScgb3B0aW9uIHRoZXJlIGFkZHMgdGhlXG4gICAgICAgIC8vIDR0aCBhbmQgNXRoIGl0ZW1zIHRvIHN0ZGlvIGFycmF5XG4gICAgICAgIGNvbnN0IHsgMzogcGlwZVdyaXRlLCA0OiBwaXBlUmVhZCB9ID0gYnJvd3NlclByb2Nlc3Mubm9kZVByb2Nlc3Muc3RkaW87XG4gICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBQaXBlVHJhbnNwb3J0KHBpcGVXcml0ZSwgcGlwZVJlYWQpO1xuICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oJycsIHRyYW5zcG9ydCwgb3B0cy5zbG93TW8sIG9wdHMucHJvdG9jb2xUaW1lb3V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQmlEaU92ZXJDZHBCcm93c2VyKGJyb3dzZXJQcm9jZXNzLCBjb25uZWN0aW9uLCBjbG9zZUNhbGxiYWNrLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IEJpRGkgPSBhd2FpdCBpbXBvcnQoLyogOiB0cnVlICovICcuLi9iaWRpL2JpZGkuanMnKTtcbiAgICAgICAgY29uc3QgYmlkaUNvbm5lY3Rpb24gPSBhd2FpdCBCaURpLmNvbm5lY3RCaWRpT3ZlckNkcChjb25uZWN0aW9uLCB7XG4gICAgICAgICAgICBhY2NlcHRJbnNlY3VyZUNlcnRzOiBvcHRzLmlnbm9yZUhUVFBTRXJyb3JzID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IEJpRGkuQmlkaUJyb3dzZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb246IGJpZGlDb25uZWN0aW9uLFxuICAgICAgICAgICAgY2xvc2VDYWxsYmFjayxcbiAgICAgICAgICAgIHByb2Nlc3M6IGJyb3dzZXJQcm9jZXNzLm5vZGVQcm9jZXNzLFxuICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0OiBvcHRzLmRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiBvcHRzLmlnbm9yZUhUVFBTRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQmlEaUJyb3dzZXIoYnJvd3NlclByb2Nlc3MsIGNsb3NlQ2FsbGJhY2ssIG9wdHMpIHtcbiAgICAgICAgY29uc3QgYnJvd3NlcldTRW5kcG9pbnQgPSAoYXdhaXQgYnJvd3NlclByb2Nlc3Mud2FpdEZvckxpbmVPdXRwdXQoV0VCRFJJVkVSX0JJRElfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBvcHRzLnRpbWVvdXQpKSArICcvc2Vzc2lvbic7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IGF3YWl0IFdlYlNvY2tldFRyYW5zcG9ydC5jcmVhdGUoYnJvd3NlcldTRW5kcG9pbnQpO1xuICAgICAgICBjb25zdCBCaURpID0gYXdhaXQgaW1wb3J0KC8qIDogdHJ1ZSAqLyAnLi4vYmlkaS9iaWRpLmpzJyk7XG4gICAgICAgIGNvbnN0IGJpZGlDb25uZWN0aW9uID0gbmV3IEJpRGkuQmlkaUNvbm5lY3Rpb24oYnJvd3NlcldTRW5kcG9pbnQsIHRyYW5zcG9ydCwgb3B0cy5zbG93TW8sIG9wdHMucHJvdG9jb2xUaW1lb3V0KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IEJpRGkuQmlkaUJyb3dzZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb246IGJpZGlDb25uZWN0aW9uLFxuICAgICAgICAgICAgY2xvc2VDYWxsYmFjayxcbiAgICAgICAgICAgIHByb2Nlc3M6IGJyb3dzZXJQcm9jZXNzLm5vZGVQcm9jZXNzLFxuICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0OiBvcHRzLmRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiBvcHRzLmlnbm9yZUhUVFBTRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0UHJvZmlsZVBhdGgoKSB7XG4gICAgICAgIHJldHVybiBqb2luKHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24udGVtcG9yYXJ5RGlyZWN0b3J5ID8/IHRtcGRpcigpLCBgcHVwcGV0ZWVyX2Rldl8ke3RoaXMucHJvZHVjdH1fcHJvZmlsZS1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcmVzb2x2ZUV4ZWN1dGFibGVQYXRoKGhlYWRsZXNzKSB7XG4gICAgICAgIGxldCBleGVjdXRhYmxlUGF0aCA9IHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24uZXhlY3V0YWJsZVBhdGg7XG4gICAgICAgIGlmIChleGVjdXRhYmxlUGF0aCkge1xuICAgICAgICAgICAgaWYgKCFleGlzdHNTeW5jKGV4ZWN1dGFibGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gZmluZCB0aGUgYnJvd3NlciBhdCB0aGUgY29uZmlndXJlZCBwYXRoICgke2V4ZWN1dGFibGVQYXRofSksIGJ1dCBubyBleGVjdXRhYmxlIHdhcyBmb3VuZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBleGVjdXRhYmxlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBwcm9kdWN0VG9Ccm93c2VyKHByb2R1Y3QsIGhlYWRsZXNzKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHByb2R1Y3QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjaHJvbWUnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGxlc3MgPT09ICdzaGVsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnN0YWxsZWRCcm93c2VyLkNIUk9NRUhFQURMRVNTU0hFTEw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEluc3RhbGxlZEJyb3dzZXIuQ0hST01FO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2ZpcmVmb3gnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW5zdGFsbGVkQnJvd3Nlci5GSVJFRk9YO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEluc3RhbGxlZEJyb3dzZXIuQ0hST01FO1xuICAgICAgICB9XG4gICAgICAgIGV4ZWN1dGFibGVQYXRoID0gY29tcHV0ZUV4ZWN1dGFibGVQYXRoKHtcbiAgICAgICAgICAgIGNhY2hlRGlyOiB0aGlzLnB1cHBldGVlci5kZWZhdWx0RG93bmxvYWRQYXRoLFxuICAgICAgICAgICAgYnJvd3NlcjogcHJvZHVjdFRvQnJvd3Nlcih0aGlzLnByb2R1Y3QsIGhlYWRsZXNzKSxcbiAgICAgICAgICAgIGJ1aWxkSWQ6IHRoaXMucHVwcGV0ZWVyLmJyb3dzZXJSZXZpc2lvbixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZXhpc3RzU3luYyhleGVjdXRhYmxlUGF0aCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnB1cHBldGVlci5jb25maWd1cmF0aW9uLmJyb3dzZXJSZXZpc2lvbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gZmluZCB0aGUgYnJvd3NlciBhdCB0aGUgY29uZmlndXJlZCBwYXRoICgke2V4ZWN1dGFibGVQYXRofSkgZm9yIHJldmlzaW9uICR7dGhpcy5wdXBwZXRlZXIuYnJvd3NlclJldmlzaW9ufSwgYnV0IG5vIGV4ZWN1dGFibGUgd2FzIGZvdW5kLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnByb2R1Y3QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjaHJvbWUnOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIENocm9tZSAodmVyLiAke3RoaXMucHVwcGV0ZWVyLmJyb3dzZXJSZXZpc2lvbn0pLiBUaGlzIGNhbiBvY2N1ciBpZiBlaXRoZXJcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgMS4geW91IGRpZCBub3QgcGVyZm9ybSBhbiBpbnN0YWxsYXRpb24gYmVmb3JlIHJ1bm5pbmcgdGhlIHNjcmlwdCAoZS5nLiBgbnB4IHB1cHBldGVlciBicm93c2VycyBpbnN0YWxsIGNocm9tZWApIG9yXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBgIDIuIHlvdXIgY2FjaGUgcGF0aCBpcyBpbmNvcnJlY3RseSBjb25maWd1cmVkICh3aGljaCBpczogJHt0aGlzLnB1cHBldGVlci5jb25maWd1cmF0aW9uLmNhY2hlRGlyZWN0b3J5fSkuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnRm9yICgyKSwgY2hlY2sgb3V0IG91ciBndWlkZSBvbiBjb25maWd1cmluZyBwdXBwZXRlZXIgYXQgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvY29uZmlndXJhdGlvbi4nKTtcbiAgICAgICAgICAgICAgICBjYXNlICdmaXJlZm94JzpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBGaXJlZm94IChyZXYuICR7dGhpcy5wdXBwZXRlZXIuYnJvd3NlclJldmlzaW9ufSkuIFRoaXMgY2FuIG9jY3VyIGlmIGVpdGhlclxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAxLiB5b3UgZGlkIG5vdCBwZXJmb3JtIGFuIGluc3RhbGxhdGlvbiBmb3IgRmlyZWZveCBiZWZvcmUgcnVubmluZyB0aGUgc2NyaXB0IChlLmcuIGBucHggcHVwcGV0ZWVyIGJyb3dzZXJzIGluc3RhbGwgZmlyZWZveGApIG9yXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBgIDIuIHlvdXIgY2FjaGUgcGF0aCBpcyBpbmNvcnJlY3RseSBjb25maWd1cmVkICh3aGljaCBpczogJHt0aGlzLnB1cHBldGVlci5jb25maWd1cmF0aW9uLmNhY2hlRGlyZWN0b3J5fSkuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnRm9yICgyKSwgY2hlY2sgb3V0IG91ciBndWlkZSBvbiBjb25maWd1cmluZyBwdXBwZXRlZXIgYXQgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvY29uZmlndXJhdGlvbi4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhlY3V0YWJsZVBhdGg7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvZHVjdExhdW5jaGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBCcm93c2VyIGFzIFN1cHBvcnRlZEJyb3dzZXIsIHJlc29sdmVCdWlsZElkLCBkZXRlY3RCcm93c2VyUGxhdGZvcm0sIGdldEluc3RhbGxlZEJyb3dzZXJzLCB1bmluc3RhbGwsIH0gZnJvbSAnQHB1cHBldGVlci9icm93c2Vycyc7XG5pbXBvcnQgeyBQdXBwZXRlZXIgfSBmcm9tICcuLi9jb21tb24vUHVwcGV0ZWVyLmpzJztcbmltcG9ydCB7IFBVUFBFVEVFUl9SRVZJU0lPTlMgfSBmcm9tICcuLi9yZXZpc2lvbnMuanMnO1xuaW1wb3J0IHsgQ2hyb21lTGF1bmNoZXIgfSBmcm9tICcuL0Nocm9tZUxhdW5jaGVyLmpzJztcbmltcG9ydCB7IEZpcmVmb3hMYXVuY2hlciB9IGZyb20gJy4vRmlyZWZveExhdW5jaGVyLmpzJztcbi8qKlxuICogRXh0ZW5kcyB0aGUgbWFpbiB7QGxpbmsgUHVwcGV0ZWVyfSBjbGFzcyB3aXRoIE5vZGUgc3BlY2lmaWMgYmVoYXZpb3VyIGZvclxuICogZmV0Y2hpbmcgYW5kIGRvd25sb2FkaW5nIGJyb3dzZXJzLlxuICpcbiAqIElmIHlvdSdyZSB1c2luZyBQdXBwZXRlZXIgaW4gYSBOb2RlIGVudmlyb25tZW50LCB0aGlzIGlzIHRoZSBjbGFzcyB5b3UnbGwgZ2V0XG4gKiB3aGVuIHlvdSBydW4gYHJlcXVpcmUoJ3B1cHBldGVlcicpYCAob3IgdGhlIGVxdWl2YWxlbnQgRVMgYGltcG9ydGApLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgbW9zdCBjb21tb24gbWV0aG9kIHRvIHVzZSBpcyB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXVuY2ggfCBsYXVuY2h9LCB3aGljaFxuICogaXMgdXNlZCB0byBsYXVuY2ggYW5kIGNvbm5lY3QgdG8gYSBuZXcgYnJvd3NlciBpbnN0YW5jZS5cbiAqXG4gKiBTZWUge0BsaW5rIFB1cHBldGVlciB8IHRoZSBtYWluIFB1cHBldGVlciBjbGFzc30gZm9yIG1ldGhvZHMgY29tbW9uIHRvIGFsbFxuICogZW52aXJvbm1lbnRzLCBzdWNoIGFzIHtAbGluayBQdXBwZXRlZXIuY29ubmVjdH0uXG4gKlxuICogQGV4YW1wbGVcbiAqIFRoZSBmb2xsb3dpbmcgaXMgYSB0eXBpY2FsIGV4YW1wbGUgb2YgdXNpbmcgUHVwcGV0ZWVyIHRvIGRyaXZlIGF1dG9tYXRpb246XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAqXG4gKiAoYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiAgIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbScpO1xuICogICAvLyBvdGhlciBhY3Rpb25zLi4uXG4gKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqIH0pKCk7XG4gKiBgYGBcbiAqXG4gKiBPbmNlIHlvdSBoYXZlIGNyZWF0ZWQgYSBgcGFnZWAgeW91IGhhdmUgYWNjZXNzIHRvIGEgbGFyZ2UgQVBJIHRvIGludGVyYWN0XG4gKiB3aXRoIHRoZSBwYWdlLCBuYXZpZ2F0ZSwgb3IgZmluZCBjZXJ0YWluIGVsZW1lbnRzIGluIHRoYXQgcGFnZS5cbiAqIFRoZSB7QGxpbmsgUGFnZSB8IGBwYWdlYCBkb2N1bWVudGF0aW9ufSBsaXN0cyBhbGwgdGhlIGF2YWlsYWJsZSBtZXRob2RzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFB1cHBldGVlck5vZGUgZXh0ZW5kcyBQdXBwZXRlZXIge1xuICAgICNfbGF1bmNoZXI7XG4gICAgI2xhc3RMYXVuY2hlZFByb2R1Y3Q7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZGVmYXVsdEJyb3dzZXJSZXZpc2lvbjtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25maWd1cmF0aW9uID0ge307XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3QgeyBjb25maWd1cmF0aW9uLCAuLi5jb21tb25TZXR0aW5ncyB9ID0gc2V0dGluZ3M7XG4gICAgICAgIHN1cGVyKGNvbW1vblNldHRpbmdzKTtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFByb2R1Y3QpIHtcbiAgICAgICAgICAgIGNhc2UgJ2ZpcmVmb3gnOlxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJyb3dzZXJSZXZpc2lvbiA9IFBVUFBFVEVFUl9SRVZJU0lPTlMuZmlyZWZveDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRQcm9kdWN0ID0gJ2Nocm9tZSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QnJvd3NlclJldmlzaW9uID0gUFVQUEVURUVSX1JFVklTSU9OUy5jaHJvbWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25uZWN0ID0gdGhpcy5jb25uZWN0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubGF1bmNoID0gdGhpcy5sYXVuY2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5leGVjdXRhYmxlUGF0aCA9IHRoaXMuZXhlY3V0YWJsZVBhdGguYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0QXJncyA9IHRoaXMuZGVmYXVsdEFyZ3MuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy50cmltQ2FjaGUgPSB0aGlzLnRyaW1DYWNoZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBhdHRhY2hlcyBQdXBwZXRlZXIgdG8gYW4gZXhpc3RpbmcgYnJvd3NlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gU2V0IG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zIHRvIHNldCBvbiB0aGUgYnJvd3Nlci5cbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGJyb3dzZXIgaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29ubmVjdChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5jb25uZWN0KG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMYXVuY2hlcyBhIGJyb3dzZXIgaW5zdGFuY2Ugd2l0aCBnaXZlbiBhcmd1bWVudHMgYW5kIG9wdGlvbnMgd2hlblxuICAgICAqIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIFdoZW4gdXNpbmcgd2l0aCBgcHVwcGV0ZWVyLWNvcmVgLFxuICAgICAqIHtAbGluayBMYXVuY2hPcHRpb25zLmV4ZWN1dGFibGVQYXRoIHwgb3B0aW9ucy5leGVjdXRhYmxlUGF0aH0gb3JcbiAgICAgKiB7QGxpbmsgTGF1bmNoT3B0aW9ucy5jaGFubmVsIHwgb3B0aW9ucy5jaGFubmVsfSBtdXN0IGJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBZb3UgY2FuIHVzZSB7QGxpbmsgTGF1bmNoT3B0aW9ucy5pZ25vcmVEZWZhdWx0QXJncyB8IG9wdGlvbnMuaWdub3JlRGVmYXVsdEFyZ3N9XG4gICAgICogdG8gZmlsdGVyIG91dCBgLS1tdXRlLWF1ZGlvYCBmcm9tIGRlZmF1bHQgYXJndW1lbnRzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCh7XG4gICAgICogICBpZ25vcmVEZWZhdWx0QXJnczogWyctLW11dGUtYXVkaW8nXSxcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUHVwcGV0ZWVyIGNhbiBhbHNvIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgQ2hyb21lIGJyb3dzZXIsIGJ1dCBpdCB3b3JrcyBiZXN0XG4gICAgICogd2l0aCB0aGUgdmVyc2lvbiBvZiBDaHJvbWUgZm9yIFRlc3RpbmcgZG93bmxvYWRlZCBieSBkZWZhdWx0LlxuICAgICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSBpdCB3aWxsIHdvcmsgd2l0aCBhbnkgb3RoZXIgdmVyc2lvbi4gSWYgR29vZ2xlIENocm9tZVxuICAgICAqIChyYXRoZXIgdGhhbiBDaHJvbWUgZm9yIFRlc3RpbmcpIGlzIHByZWZlcnJlZCwgYVxuICAgICAqIHtAbGluayBodHRwczovL3d3dy5nb29nbGUuY29tL2Nocm9tZS9icm93c2VyL2NhbmFyeS5odG1sIHwgQ2hyb21lIENhbmFyeX1cbiAgICAgKiBvclxuICAgICAqIHtAbGluayBodHRwczovL3d3dy5jaHJvbWl1bS5vcmcvZ2V0dGluZy1pbnZvbHZlZC9kZXYtY2hhbm5lbCB8IERldiBDaGFubmVsfVxuICAgICAqIGJ1aWxkIGlzIHN1Z2dlc3RlZC4gU2VlXG4gICAgICoge0BsaW5rIGh0dHBzOi8vd3d3Lmhvd3RvZ2Vlay5jb20vMjAyODI1L3doYXQlRTIlODAlOTlzLXRoZS1kaWZmZXJlbmNlLWJldHdlZW4tY2hyb21pdW0tYW5kLWNocm9tZS8gfCB0aGlzIGFydGljbGV9XG4gICAgICogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gQ2hyb21pdW0gYW5kIENocm9tZS5cbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYy8rL2xrZ3IvZG9jcy9jaHJvbWl1bV9icm93c2VyX3ZzX2dvb2dsZV9jaHJvbWUubWQgfCBUaGlzIGFydGljbGV9XG4gICAgICogZGVzY3JpYmVzIHNvbWUgZGlmZmVyZW5jZXMgZm9yIExpbnV4IHVzZXJzLiBTZWVcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9ibG9nL2Nocm9tZS1mb3ItdGVzdGluZy8gfCB0aGlzIGRvY30gZm9yIHRoZSBkZXNjcmlwdGlvblxuICAgICAqIG9mIENocm9tZSBmb3IgVGVzdGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgbGF1bmNoaW5nIGJlaGF2aW9yLlxuICAgICAqL1xuICAgIGxhdW5jaChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBwcm9kdWN0ID0gdGhpcy5kZWZhdWx0UHJvZHVjdCB9ID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy4jbGFzdExhdW5jaGVkUHJvZHVjdCA9IHByb2R1Y3Q7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYXVuY2hlci5sYXVuY2gob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCAjbGF1bmNoZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLiNfbGF1bmNoZXIgJiZcbiAgICAgICAgICAgIHRoaXMuI19sYXVuY2hlci5wcm9kdWN0ID09PSB0aGlzLmxhc3RMYXVuY2hlZFByb2R1Y3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNfbGF1bmNoZXI7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0aGlzLmxhc3RMYXVuY2hlZFByb2R1Y3QpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Nocm9tZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QnJvd3NlclJldmlzaW9uID0gUFVQUEVURUVSX1JFVklTSU9OUy5jaHJvbWU7XG4gICAgICAgICAgICAgICAgdGhpcy4jX2xhdW5jaGVyID0gbmV3IENocm9tZUxhdW5jaGVyKHRoaXMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZmlyZWZveCc6XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QnJvd3NlclJldmlzaW9uID0gUFVQUEVURUVSX1JFVklTSU9OUy5maXJlZm94O1xuICAgICAgICAgICAgICAgIHRoaXMuI19sYXVuY2hlciA9IG5ldyBGaXJlZm94TGF1bmNoZXIodGhpcyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcm9kdWN0OiAke3RoaXMuI2xhc3RMYXVuY2hlZFByb2R1Y3R9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI19sYXVuY2hlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgZXhlY3V0YWJsZSBwYXRoLlxuICAgICAqL1xuICAgIGV4ZWN1dGFibGVQYXRoKGNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xhdW5jaGVyLmV4ZWN1dGFibGVQYXRoKGNoYW5uZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgYnJvd3NlclJldmlzaW9uKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI19sYXVuY2hlcj8uZ2V0QWN0dWFsQnJvd3NlclJldmlzaW9uKCkgPz9cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5icm93c2VyUmV2aXNpb24gPz9cbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJyb3dzZXJSZXZpc2lvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGRvd25sb2FkIHBhdGggZm9yIHB1cHBldGVlci4gRm9yIHB1cHBldGVlci1jb3JlLCB0aGlzXG4gICAgICogY29kZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGFzIGl0IGlzIG5ldmVyIGRlZmluZWQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdERvd25sb2FkUGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5jYWNoZURpcmVjdG9yeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJyb3dzZXIgdGhhdCB3YXMgbGFzdCBsYXVuY2hlZC5cbiAgICAgKi9cbiAgICBnZXQgbGFzdExhdW5jaGVkUHJvZHVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xhc3RMYXVuY2hlZFByb2R1Y3QgPz8gdGhpcy5kZWZhdWx0UHJvZHVjdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJyb3dzZXIgdGhhdCB3aWxsIGJlIGxhdW5jaGVkIGJ5IGRlZmF1bHQuIEZvclxuICAgICAqIGBwdXBwZXRlZXJgLCB0aGlzIGlzIGluZmx1ZW5jZWQgYnkgeW91ciBjb25maWd1cmF0aW9uLiBPdGhlcndpc2UsIGl0J3NcbiAgICAgKiBgY2hyb21lYC5cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByb2R1Y3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFByb2R1Y3QgPz8gJ2Nocm9tZSc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgYXMgdGhpcyBmaWVsZCBhcyBpdCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudFxuICAgICAqIG11bHRpcGxlIGJyb3dzZXJzIG9mIGRpZmZlcmVudCB0eXBlcy4gVXNlXG4gICAgICoge0BsaW5rIFB1cHBldGVlck5vZGUuZGVmYXVsdFByb2R1Y3QgfCBkZWZhdWx0UHJvZHVjdH0gb3JcbiAgICAgKiB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXN0TGF1bmNoZWRQcm9kdWN0IHwgbGFzdExhdW5jaGVkUHJvZHVjdH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgYnJvd3NlciB0aGF0IGlzIHVuZGVyIGF1dG9tYXRpb24uXG4gICAgICovXG4gICAgZ2V0IHByb2R1Y3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYXVuY2hlci5wcm9kdWN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFNldCBvZiBjb25maWd1cmFibGUgb3B0aW9ucyB0byBzZXQgb24gdGhlIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBmbGFncyB0aGF0IENocm9taXVtIHdpbGwgYmUgbGF1bmNoZWQgd2l0aC5cbiAgICAgKi9cbiAgICBkZWZhdWx0QXJncyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xhdW5jaGVyLmRlZmF1bHRBcmdzKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBub24tY3VycmVudCBGaXJlZm94IGFuZCBDaHJvbWUgYmluYXJpZXMgaW4gdGhlIGNhY2hlIGRpcmVjdG9yeVxuICAgICAqIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIFB1cHBldGVlciBjb25maWd1cmF0aW9uLiBUaGUgY3VycmVudCBicm93c2VyXG4gICAgICogdmVyc2lvbiBpcyBkZXRlcm1pbmVkIGJ5IHJlc29sdmluZyBQVVBQRVRFRVJfUkVWSVNJT05TIGZyb20gUHVwcGV0ZWVyXG4gICAgICogdW5sZXNzIGBjb25maWd1cmF0aW9uLmJyb3dzZXJSZXZpc2lvbmAgaXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoZSBtZXRob2QgZG9lcyBub3QgY2hlY2sgaWYgYW55IG90aGVyIFB1cHBldGVlciB2ZXJzaW9uc1xuICAgICAqIGluc3RhbGxlZCBvbiB0aGUgaG9zdCB0aGF0IHVzZSB0aGUgc2FtZSBjYWNoZSBkaXJlY3RvcnkgcmVxdWlyZSB0aGVcbiAgICAgKiBub24tY3VycmVudCBiaW5hcmllcy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBhc3luYyB0cmltQ2FjaGUoKSB7XG4gICAgICAgIGNvbnN0IHBsYXRmb3JtID0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgICAgIGlmICghcGxhdGZvcm0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYWNoZURpciA9IHRoaXMuY29uZmlndXJhdGlvbi5jYWNoZURpcmVjdG9yeTtcbiAgICAgICAgY29uc3QgaW5zdGFsbGVkQnJvd3NlcnMgPSBhd2FpdCBnZXRJbnN0YWxsZWRCcm93c2Vycyh7XG4gICAgICAgICAgICBjYWNoZURpcixcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb2R1Y3QgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFByb2R1Y3Q7XG4gICAgICAgIGNvbnN0IHB1cHBldGVlckJyb3dzZXJzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByb2R1Y3Q6ICdjaHJvbWUnLFxuICAgICAgICAgICAgICAgIGJyb3dzZXI6IFN1cHBvcnRlZEJyb3dzZXIuQ0hST01FLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRCdWlsZElkOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdDogJ2ZpcmVmb3gnLFxuICAgICAgICAgICAgICAgIGJyb3dzZXI6IFN1cHBvcnRlZEJyb3dzZXIuRklSRUZPWCxcbiAgICAgICAgICAgICAgICBjdXJyZW50QnVpbGRJZDogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICAvLyBSZXNvbHZlIGN1cnJlbnQgYnVpbGRJZHMuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwdXBwZXRlZXJCcm93c2Vycykge1xuICAgICAgICAgICAgaXRlbS5jdXJyZW50QnVpbGRJZCA9IGF3YWl0IHJlc29sdmVCdWlsZElkKGl0ZW0uYnJvd3NlciwgcGxhdGZvcm0sIChwcm9kdWN0ID09PSBpdGVtLnByb2R1Y3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuY29uZmlndXJhdGlvbi5icm93c2VyUmV2aXNpb25cbiAgICAgICAgICAgICAgICA6IG51bGwpIHx8IFBVUFBFVEVFUl9SRVZJU0lPTlNbaXRlbS5wcm9kdWN0XSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudEJyb3dzZXJCdWlsZHMgPSBuZXcgU2V0KHB1cHBldGVlckJyb3dzZXJzLm1hcChicm93c2VyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgJHticm93c2VyLmJyb3dzZXJ9XyR7YnJvd3Nlci5jdXJyZW50QnVpbGRJZH1gO1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCcm93c2VycyA9IG5ldyBTZXQocHVwcGV0ZWVyQnJvd3NlcnMubWFwKGJyb3dzZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIuYnJvd3NlcjtcbiAgICAgICAgfSkpO1xuICAgICAgICBmb3IgKGNvbnN0IGluc3RhbGxlZEJyb3dzZXIgb2YgaW5zdGFsbGVkQnJvd3NlcnMpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHVuaW5zdGFsbCBicm93c2VycyB0aGF0IGFyZSBub3QgbWFuYWdlZCBieSBQdXBwZXRlZXIgeWV0LlxuICAgICAgICAgICAgaWYgKCFjdXJyZW50QnJvd3NlcnMuaGFzKGluc3RhbGxlZEJyb3dzZXIuYnJvd3NlcikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIGJyb3dzZXIgYnVpbGQgdXNlZCBieSB0aGUgY3VycmVudCBQdXBwZXRlZXIgaW5zdGFsbGF0aW9uLlxuICAgICAgICAgICAgaWYgKGN1cnJlbnRCcm93c2VyQnVpbGRzLmhhcyhgJHtpbnN0YWxsZWRCcm93c2VyLmJyb3dzZXJ9XyR7aW5zdGFsbGVkQnJvd3Nlci5idWlsZElkfWApKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB1bmluc3RhbGwoe1xuICAgICAgICAgICAgICAgIGJyb3dzZXI6IGluc3RhbGxlZEJyb3dzZXIuYnJvd3NlcixcbiAgICAgICAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICAgICAgICBjYWNoZURpcixcbiAgICAgICAgICAgICAgICBidWlsZElkOiBpbnN0YWxsZWRCcm93c2VyLmJ1aWxkSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVB1cHBldGVlck5vZGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX3J1bkluaXRpYWxpemVycyA9ICh0aGlzICYmIHRoaXMuX19ydW5Jbml0aWFsaXplcnMpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG52YXIgX19lc0RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2VzRGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICAgIGRvbmUgPSB0cnVlO1xufTtcbnZhciBfX3NldEZ1bmN0aW9uTmFtZSA9ICh0aGlzICYmIHRoaXMuX19zZXRGdW5jdGlvbk5hbWUpIHx8IGZ1bmN0aW9uIChmLCBuYW1lLCBwcmVmaXgpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuaW1wb3J0IHsgc3Bhd24sIHNwYXduU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgUGFzc1Rocm91Z2ggfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IGJ1ZmZlckNvdW50LCBjb25jYXRNYXAsIGZpbHRlciwgZnJvbSwgZnJvbUV2ZW50LCBsYXN0VmFsdWVGcm9tLCBtYXAsIHRha2VVbnRpbCwgdGFwLCB9IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyc7XG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yLCBmcm9tRW1pdHRlckV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgZ3VhcmRlZCB9IGZyb20gJy4uL3V0aWwvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBhc3luY0Rpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuY29uc3QgQ1JGX1ZBTFVFID0gMzA7XG5jb25zdCBERUZBVUxUX0ZQUyA9IDMwO1xuY29uc3QgZGVidWdGZm1wZWcgPSBkZWJ1ZygncHVwcGV0ZWVyOmZmbXBlZycpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmxldCBTY3JlZW5SZWNvcmRlciA9ICgoKSA9PiB7XG4gICAgbGV0IF9jbGFzc1N1cGVyID0gUGFzc1Rocm91Z2g7XG4gICAgbGV0IF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzID0gW107XG4gICAgbGV0IF9wcml2YXRlX3dyaXRlRnJhbWVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfd3JpdGVGcmFtZV9kZXNjcmlwdG9yO1xuICAgIGxldCBfc3RvcF9kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBTY3JlZW5SZWNvcmRlciBleHRlbmRzIF9jbGFzc1N1cGVyIHtcbiAgICAgICAgc3RhdGljIHtcbiAgICAgICAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfd3JpdGVGcmFtZV9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jcHJvY2Vzcy5zdGRpbi53cml0ZShidWZmZXIsIHJlc29sdmUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgZmZtcGVnIGZhaWxlZCB0byB3cml0ZTogJHtlcnJvci5tZXNzYWdlfS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIFwiI3dyaXRlRnJhbWVcIikgfSwgX3ByaXZhdGVfd3JpdGVGcmFtZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiI3dyaXRlRnJhbWVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogdHJ1ZSwgYWNjZXNzOiB7IGhhczogb2JqID0+ICN3cml0ZUZyYW1lIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiN3cml0ZUZyYW1lIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9zdG9wX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJzdG9wXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzdG9wXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouc3RvcCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICAjcGFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXMsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgI3Byb2Nlc3M7XG4gICAgICAgICNjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICAjbGFzdEZyYW1lO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdHJ1Y3RvcihwYWdlLCB3aWR0aCwgaGVpZ2h0LCB7IHNwZWVkLCBzY2FsZSwgY3JvcCwgZm9ybWF0LCBwYXRoIH0gPSB7fSkge1xuICAgICAgICAgICAgc3VwZXIoeyBhbGxvd0hhbGZPcGVuOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIHBhdGggPz89ICdmZm1wZWcnO1xuICAgICAgICAgICAgLy8gVGVzdHMgaWYgYGZmbXBlZ2AgZXhpc3RzLlxuICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gc3Bhd25TeW5jKHBhdGgpO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNwcm9jZXNzID0gc3Bhd24ocGF0aCwgXG4gICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly90cmFjLmZmbXBlZy5vcmcvd2lraS9FbmNvZGUvVlA5IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGZsYWdzLlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsnLWxvZ2xldmVsJywgJ2Vycm9yJ10sXG4gICAgICAgICAgICAgICAgLy8gUmVkdWNlcyBnZW5lcmFsIGJ1ZmZlcmluZy5cbiAgICAgICAgICAgICAgICBbJy1hdmlvZmxhZ3MnLCAnZGlyZWN0J10sXG4gICAgICAgICAgICAgICAgLy8gUmVkdWNlcyBpbml0aWFsIGJ1ZmZlcmluZyB3aGlsZSBhbmFseXppbmcgaW5wdXQgZnBzIGFuZCBvdGhlciBzdGF0cy5cbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICctZnBzcHJvYmVzaXplJyxcbiAgICAgICAgICAgICAgICAgICAgJzAnLFxuICAgICAgICAgICAgICAgICAgICAnLXByb2Jlc2l6ZScsXG4gICAgICAgICAgICAgICAgICAgICczMicsXG4gICAgICAgICAgICAgICAgICAgICctYW5hbHl6ZWR1cmF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJzAnLFxuICAgICAgICAgICAgICAgICAgICAnLWZmbGFncycsXG4gICAgICAgICAgICAgICAgICAgICdub2J1ZmZlcicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAvLyBGb3JjZXMgaW5wdXQgdG8gYmUgcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LCBhbmQgZm9yY2VzIHBuZyBpbnB1dFxuICAgICAgICAgICAgICAgIC8vIGltYWdlIGZvcm1hdC5cbiAgICAgICAgICAgICAgICBbJy1mJywgJ2ltYWdlMnBpcGUnLCAnLWM6dicsICdwbmcnLCAnLWknLCAncGlwZTowJ10sXG4gICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIG91dHB1dCBhbmQgbm8gYXVkaW8uXG4gICAgICAgICAgICAgICAgWycteScsICctYW4nXSxcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGRyYXN0aWNhbGx5IHJlZHVjZXMgc3RhbGxpbmcgd2hlbiBjcHUgaXMgb3ZlcmJvb2tlZC4gQnkgZGVmYXVsdFxuICAgICAgICAgICAgICAgIC8vIFZQOSB0cmllcyB0byB1c2UgYWxsIGF2YWlsYWJsZSB0aHJlYWRzP1xuICAgICAgICAgICAgICAgIFsnLXRocmVhZHMnLCAnMSddLFxuICAgICAgICAgICAgICAgIC8vIFNwZWNpZmllcyB0aGUgZnJhbWUgcmF0ZSB3ZSBhcmUgZ2l2aW5nIGZmbXBlZy5cbiAgICAgICAgICAgICAgICBbJy1mcmFtZXJhdGUnLCBgJHtERUZBVUxUX0ZQU31gXSxcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWZpZXMgdGhlIGVuY29kaW5nIGFuZCBmb3JtYXQgd2UgYXJlIHVzaW5nLlxuICAgICAgICAgICAgICAgIHRoaXMuI2dldEZvcm1hdEFyZ3MoZm9ybWF0ID8/ICd3ZWJtJyksXG4gICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBiaXRyYXRlLlxuICAgICAgICAgICAgICAgIFsnLWI6dicsICcwJ10sXG4gICAgICAgICAgICAgICAgLy8gRmlsdGVycyB0byBlbnN1cmUgdGhlIGltYWdlcyBhcmUgcGlwZWQgY29ycmVjdGx5LlxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgJy12ZicsXG4gICAgICAgICAgICAgICAgICAgIGAke3NwZWVkID8gYHNldHB0cz0kezEgLyBzcGVlZH0qUFRTLGAgOiAnJ31jcm9wPSdtaW4oJHt3aWR0aH0saXcpOm1pbigke2hlaWdodH0saWgpOjA6MCcscGFkPSR7d2lkdGh9OiR7aGVpZ2h0fTowOjAke2Nyb3AgPyBgLGNyb3A9JHtjcm9wLndpZHRofToke2Nyb3AuaGVpZ2h0fToke2Nyb3AueH06JHtjcm9wLnl9YCA6ICcnfSR7c2NhbGUgPyBgLHNjYWxlPWl3KiR7c2NhbGV9Oi0xYCA6ICcnfWAsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAncGlwZToxJyxcbiAgICAgICAgICAgIF0uZmxhdCgpLCB7IHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdwaXBlJ10gfSk7XG4gICAgICAgICAgICB0aGlzLiNwcm9jZXNzLnN0ZG91dC5waXBlKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy4jcHJvY2Vzcy5zdGRlcnIub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnRmZtcGVnKGRhdGEudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuI3BhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHRoaXMuI3BhZ2UubWFpbkZyYW1lKCk7XG4gICAgICAgICAgICBjbGllbnQub25jZShDRFBTZXNzaW9uRXZlbnQuRGlzY29ubmVjdGVkLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnN0b3AoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy4jbGFzdEZyYW1lID0gbGFzdFZhbHVlRnJvbShmcm9tRW1pdHRlckV2ZW50KGNsaWVudCwgJ1BhZ2Uuc2NyZWVuY2FzdEZyYW1lJykucGlwZSh0YXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgY2xpZW50LnNlbmQoJ1BhZ2Uuc2NyZWVuY2FzdEZyYW1lQWNrJywge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IGV2ZW50LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLCBmaWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmVudC5tZXRhZGF0YS50aW1lc3RhbXAgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pLCBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogQnVmZmVyLmZyb20oZXZlbnQuZGF0YSwgJ2Jhc2U2NCcpLFxuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IGV2ZW50Lm1ldGFkYXRhLnRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksIGJ1ZmZlckNvdW50KDIsIDEpLCBjb25jYXRNYXAoKFt7IHRpbWVzdGFtcDogcHJldmlvdXNUaW1lc3RhbXAsIGJ1ZmZlciB9LCB7IHRpbWVzdGFtcCB9XSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tKEFycmF5KE1hdGgucm91bmQoREVGQVVMVF9GUFMgKiBNYXRoLm1heCh0aW1lc3RhbXAgLSBwcmV2aW91c1RpbWVzdGFtcCwgMCkpKS5maWxsKGJ1ZmZlcikpO1xuICAgICAgICAgICAgfSksIG1hcChidWZmZXIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy4jd3JpdGVGcmFtZShidWZmZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbYnVmZmVyLCBwZXJmb3JtYW5jZS5ub3coKV07XG4gICAgICAgICAgICB9KSwgdGFrZVVudGlsKGZyb21FdmVudCh0aGlzLiNjb250cm9sbGVyLnNpZ25hbCwgJ2Fib3J0JykpKSwgeyBkZWZhdWx0VmFsdWU6IFtCdWZmZXIuZnJvbShbXSksIHBlcmZvcm1hbmNlLm5vdygpXSB9KTtcbiAgICAgICAgfVxuICAgICAgICAjZ2V0Rm9ybWF0QXJncyhmb3JtYXQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2VibSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBjb2RlYyB0byB1c2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBbJy1jOnYnLCAndnA5J10sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnLWYnLCAnd2VibSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0cyB0aGUgcXVhbGl0eS4gTG93ZXIgdGhlIGJldHRlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIFsnLWNyZicsIGAke0NSRl9WQUxVRX1gXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldHMgdGhlIHF1YWxpdHkgYW5kIGhvdyBlZmZpY2llbnQgdGhlIGNvbXByZXNzaW9uIHdpbGwgYmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBbJy1kZWFkbGluZScsICdyZWFsdGltZScsICctY3B1LXVzZWQnLCAnOCddLFxuICAgICAgICAgICAgICAgICAgICBdLmZsYXQoKTtcbiAgICAgICAgICAgICAgICBjYXNlICdnaWYnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0cyB0aGUgZnJhbWUgcmF0ZSBhbmQgdXNlcyBhIGN1c3RvbSBwYWxldHRlIGdlbmVyYXRlZCBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQuXG4gICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy12ZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zwcz01LHNwbGl0W3MwXVtzMV07W3MwXXBhbGV0dGVnZW49c3RhdHNfbW9kZT1kaWZmW3BdO1tzMV1bcF1wYWxldHRldXNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnLWYnLCAnZ2lmJ10sXG4gICAgICAgICAgICAgICAgICAgIF0uZmxhdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCAjd3JpdGVGcmFtZSgpIHsgcmV0dXJuIF9wcml2YXRlX3dyaXRlRnJhbWVfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICAvKipcbiAgICAgICAgICogU3RvcHMgdGhlIHJlY29yZGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzdG9wKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2NvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTdG9wcGluZyB0aGUgc2NyZWVuY2FzdCB3aWxsIGZsdXNoIHRoZSBmcmFtZXMuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwYWdlLl9zdG9wU2NyZWVuY2FzdCgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy4jY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgLy8gUmVwZWF0IHRoZSBsYXN0IGZyYW1lIGZvciB0aGUgcmVtYWluaW5nIGZyYW1lcy5cbiAgICAgICAgICAgIGNvbnN0IFtidWZmZXIsIHRpbWVzdGFtcF0gPSBhd2FpdCB0aGlzLiNsYXN0RnJhbWU7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheShNYXRoLm1heCgxLCBNYXRoLnJvdW5kKChERUZBVUxUX0ZQUyAqIChwZXJmb3JtYW5jZS5ub3coKSAtIHRpbWVzdGFtcCkpIC8gMTAwMCkpKVxuICAgICAgICAgICAgICAgIC5maWxsKGJ1ZmZlcilcbiAgICAgICAgICAgICAgICAubWFwKHRoaXMuI3dyaXRlRnJhbWUuYmluZCh0aGlzKSkpO1xuICAgICAgICAgICAgLy8gQ2xvc2Ugc3RkaW4gdG8gbm90aWZ5IEZGbXBlZyB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIHRoaXMuI3Byb2Nlc3Muc3RkaW4uZW5kKCk7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNwcm9jZXNzLm9uY2UoJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBbKF9wcml2YXRlX3dyaXRlRnJhbWVfZGVjb3JhdG9ycyA9IFtndWFyZGVkKCldLCBfc3RvcF9kZWNvcmF0b3JzID0gW2d1YXJkZWQoKV0sIGFzeW5jRGlzcG9zZVN5bWJvbCldKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9wKCk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IFNjcmVlblJlY29yZGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY3JlZW5SZWNvcmRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9DaHJvbWVMYXVuY2hlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZpcmVmb3hMYXVuY2hlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0xhdW5jaE9wdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXBlVHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHJvZHVjdExhdW5jaGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHVwcGV0ZWVyTm9kZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1NjcmVlblJlY29yZGVyLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vZGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBmcyBmcm9tICdmcyc7XG5jb25zdCBybU9wdGlvbnMgPSB7XG4gICAgZm9yY2U6IHRydWUsXG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgIG1heFJldHJpZXM6IDUsXG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJtKHBhdGgpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLCBybU9wdGlvbnMpO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJtU3luYyhwYXRoKSB7XG4gICAgZnMucm1TeW5jKHBhdGgsIHJtT3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9pbmRleC5qcyc7XG5pbXBvcnQgeyBQdXBwZXRlZXJOb2RlIH0gZnJvbSAnLi9ub2RlL1B1cHBldGVlck5vZGUuanMnO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IHB1cHBldGVlciA9IG5ldyBQdXBwZXRlZXJOb2RlKHtcbiAgICBpc1B1cHBldGVlckNvcmU6IHRydWUsXG59KTtcbmV4cG9ydCBjb25zdCB7IFxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmNvbm5lY3QsIFxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmRlZmF1bHRBcmdzLCBcbi8qKlxuICogQHB1YmxpY1xuICovXG5leGVjdXRhYmxlUGF0aCwgXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xubGF1bmNoLCB9ID0gcHVwcGV0ZWVyO1xuZXhwb3J0IGRlZmF1bHQgcHVwcGV0ZWVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVwcGV0ZWVyLWNvcmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQVVBQRVRFRVJfUkVWSVNJT05TID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgY2hyb21lOiAnMTI2LjAuNjQ3OC4xMjYnLFxuICAgICdjaHJvbWUtaGVhZGxlc3Mtc2hlbGwnOiAnMTI2LjAuNjQ3OC4xMjYnLFxuICAgIGZpcmVmb3g6ICdsYXRlc3QnLFxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXZpc2lvbnMuanMubWFwIiwiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jSXRlcmFibGVVdGlsIHtcbiAgICBzdGF0aWMgYXN5bmMgKm1hcChpdGVyYWJsZSwgbWFwKSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIHlpZWxkIGF3YWl0IG1hcCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jICpmbGF0TWFwKGl0ZXJhYmxlLCBtYXApIHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgeWllbGQqIG1hcCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGNvbGxlY3QoaXRlcmFibGUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZmlyc3QoaXRlcmFibGUpIHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc3luY0l0ZXJhYmxlVXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyNCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVGltZW91dEVycm9yIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBkZWZlcnJlZCBvYmplY3QgYWxvbmcgd2l0aCB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zLlxuICpcbiAqIElmIHRoZSBkZWZlcnJlZCBoYXMgbm90IGJlZW4gcmVzb2x2ZWQvcmVqZWN0ZWQgd2l0aGluIHRoZSBgdGltZW91dGAgcGVyaW9kLFxuICogdGhlIGRlZmVycmVkIGdldHMgcmVzb2x2ZXMgd2l0aCBhIHRpbWVvdXQgZXJyb3IuIGB0aW1lb3V0YCBoYXMgdG8gYmUgZ3JlYXRlciB0aGFuIDAgb3JcbiAqIGl0IGlzIGlnbm9yZWQuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgc3RhdGljIGNyZWF0ZShvcHRzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVmZXJyZWQob3B0cyk7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyByYWNlKGF3YWl0YWJsZXMpIHtcbiAgICAgICAgY29uc3QgZGVmZXJyZWRXaXRoVGltZW91dCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gYXdhaXRhYmxlcy5tYXAodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERlZmVycmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS4jdGltZW91dElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZFdpdGhUaW1lb3V0LmFkZCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlT3JUaHJvdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShwcm9taXNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlZmVycmVkIG9mIGRlZmVycmVkV2l0aFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHN0b3AgdGhlIHRpbWVvdXQgZWxzZVxuICAgICAgICAgICAgICAgIC8vIE5vZGUuSlMgd2lsbCBrZWVwIHJ1bm5pbmcgdGhlIGV2ZW50IGxvb3AgdGlsbCB0aGVcbiAgICAgICAgICAgICAgICAvLyB0aW1lciBleGVjdXRlc1xuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoJ1RpbWVvdXQgY2xlYXJlZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAjaXNSZXNvbHZlZCA9IGZhbHNlO1xuICAgICNpc1JlamVjdGVkID0gZmFsc2U7XG4gICAgI3ZhbHVlO1xuICAgIC8vIFNBRkVUWTogVGhpcyBpcyBlbnN1cmVkIGJ5ICN0YXNrUHJvbWlzZS5cbiAgICAjcmVzb2x2ZTtcbiAgICAjdGFza1Byb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gICAgI3RpbWVvdXRJZDtcbiAgICAjdGltZW91dEVycm9yO1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy50aW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgdGhpcy4jdGltZW91dEVycm9yID0gbmV3IFRpbWVvdXRFcnJvcihvcHRzLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy4jdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3QodGhpcy4jdGltZW91dEVycm9yKTtcbiAgICAgICAgICAgIH0sIG9wdHMudGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2ZpbmlzaCh2YWx1ZSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jdGltZW91dElkKTtcbiAgICAgICAgdGhpcy4jdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLiNpc1JlamVjdGVkIHx8IHRoaXMuI2lzUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNpc1Jlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jZmluaXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmVqZWN0KGVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLiNpc1JlamVjdGVkIHx8IHRoaXMuI2lzUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNpc1JlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jZmluaXNoKGVycm9yKTtcbiAgICB9XG4gICAgcmVzb2x2ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc1Jlc29sdmVkO1xuICAgIH1cbiAgICBmaW5pc2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzUmVzb2x2ZWQgfHwgdGhpcy4jaXNSZWplY3RlZDtcbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2YWx1ZTtcbiAgICB9XG4gICAgI3Byb21pc2U7XG4gICAgdmFsdWVPclRocm93KCkge1xuICAgICAgICBpZiAoIXRoaXMuI3Byb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMuI3Byb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Rhc2tQcm9taXNlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNpc1JlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMuI3ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4jdmFsdWU7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9taXNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlZmVycmVkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvckxpa2Uob2JqKSB7XG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwgJiYgJ25hbWUnIGluIG9iaiAmJiAnbWVzc2FnZScgaW4gb2JqKTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Vycm5vRXhjZXB0aW9uKG9iaikge1xuICAgIHJldHVybiAoaXNFcnJvckxpa2Uob2JqKSAmJlxuICAgICAgICAoJ2Vycm5vJyBpbiBvYmogfHwgJ2NvZGUnIGluIG9iaiB8fCAncGF0aCcgaW4gb2JqIHx8ICdzeXNjYWxsJyBpbiBvYmopKTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXdyaXRlRXJyb3IoZXJyb3IsIG1lc3NhZ2UsIG9yaWdpbmFsTWVzc2FnZSkge1xuICAgIGVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIGVycm9yLm9yaWdpbmFsTWVzc2FnZSA9IG9yaWdpbmFsTWVzc2FnZSA/PyBlcnJvci5vcmlnaW5hbE1lc3NhZ2U7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3RvY29sRXJyb3JNZXNzYWdlKG9iamVjdCkge1xuICAgIGxldCBtZXNzYWdlID0gb2JqZWN0LmVycm9yLm1lc3NhZ2U7XG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoZSB0eXBlIGNoZWNrcyB3aGVuIHdlIHN0b3AgY29ubmVjdGluZyB0byBCaURpIHdpdGggYSBDRFBcbiAgICAvLyBjbGllbnQuXG4gICAgaWYgKG9iamVjdC5lcnJvciAmJlxuICAgICAgICB0eXBlb2Ygb2JqZWN0LmVycm9yID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAnZGF0YScgaW4gb2JqZWN0LmVycm9yKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYCAke29iamVjdC5lcnJvci5kYXRhfWA7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXJyb3JMaWtlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5jb25zdCBjcmVhdGVkRnVuY3Rpb25zID0gbmV3IE1hcCgpO1xuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gZnJvbSBhIHN0cmluZy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUZ1bmN0aW9uID0gKGZ1bmN0aW9uVmFsdWUpID0+IHtcbiAgICBsZXQgZm4gPSBjcmVhdGVkRnVuY3Rpb25zLmdldChmdW5jdGlvblZhbHVlKTtcbiAgICBpZiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuO1xuICAgIH1cbiAgICBmbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICR7ZnVuY3Rpb25WYWx1ZX1gKSgpO1xuICAgIGNyZWF0ZWRGdW5jdGlvbnMuc2V0KGZ1bmN0aW9uVmFsdWUsIGZuKTtcbiAgICByZXR1cm4gZm47XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeUZ1bmN0aW9uKGZuKSB7XG4gICAgbGV0IHZhbHVlID0gZm4udG9TdHJpbmcoKTtcbiAgICB0cnkge1xuICAgICAgICBuZXcgRnVuY3Rpb24oYCgke3ZhbHVlfSlgKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoYFJlZnVzZWQgdG8gZXZhbHVhdGUgYSBzdHJpbmcgYXMgSmF2YVNjcmlwdCBiZWNhdXNlICd1bnNhZmUtZXZhbCcgaXMgbm90IGFuIGFsbG93ZWQgc291cmNlIG9mIHNjcmlwdCBpbiB0aGUgZm9sbG93aW5nIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGRpcmVjdGl2ZWApKSB7XG4gICAgICAgICAgICAvLyBUaGUgY29udGVudCBzZWN1cml0eSBwb2xpY3kgZG9lcyBub3QgYWxsb3cgRnVuY3Rpb24gZXZhbC4gTGV0J3NcbiAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgdmFsdWUgbWlnaHQgYmUgdmFsaWQgYXMgaXMuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBtaWdodCBoYXZlIGEgZnVuY3Rpb24gc2hvcnRoYW5kIChlLmcuIGB0ZXN0KCl7fWApLiBMZXQnc1xuICAgICAgICAvLyB0cnkgcHJlZml4aW5nLlxuICAgICAgICBsZXQgcHJlZml4ID0gJ2Z1bmN0aW9uICc7XG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdhc3luYyAnKSkge1xuICAgICAgICAgICAgcHJlZml4ID0gYGFzeW5jICR7cHJlZml4fWA7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygnYXN5bmMgJy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gYCR7cHJlZml4fSR7dmFsdWV9YDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ldyBGdW5jdGlvbihgKCR7dmFsdWV9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIC8vIFdlIHRyaWVkIGhhcmQgdG8gc2VyaWFsaXplLCBidXQgdGhlcmUncyBhIHdlaXJkIGJlYXN0IGhlcmUuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Bhc3NlZCBmdW5jdGlvbiBjYW5ub3QgYmUgc2VyaWFsaXplZCEnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4vKipcbiAqIFJlcGxhY2VzIGBQTEFDRUhPTERFUmBzIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50cy5cbiAqXG4gKiBBbGwgcmVwbGFjZW1lbnRzIG11c3QgYmUgdmFsaWQgSlMgY29kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBpbnRlcnBvbGF0ZUZ1bmN0aW9uKCgpID0+IFBMQUNFSE9MREVSKCd0ZXN0JyksIHt0ZXN0OiAndm9pZCAwJ30pO1xuICogLy8gRXF1aXZhbGVudCB0byAoKSA9PiB2b2lkIDBcbiAqIGBgYFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaW50ZXJwb2xhdGVGdW5jdGlvbiA9IChmbiwgcmVwbGFjZW1lbnRzKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gc3RyaW5naWZ5RnVuY3Rpb24oZm4pO1xuICAgIGZvciAoY29uc3QgW25hbWUsIGpzVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcGxhY2VtZW50cykpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYFBMQUNFSE9MREVSXFxcXChcXFxccyooPzonJHtuYW1lfSd8XCIke25hbWV9XCIpXFxcXHMqXFxcXClgLCAnZycpLCBcbiAgICAgICAgLy8gV3JhcHBpbmcgdGhpcyBlbnN1cmVzIHRlcnNlcnMgdGhhdCBhY2NpZGVudGFsbHkgaW5saW5lIFBMQUNFSE9MREVSIGNhbGxzXG4gICAgICAgIC8vIGFyZSBzdGlsbCB2YWxpZC4gV2l0aG91dCwgd2UgbWF5IGdldCBjYWxscyBsaWtlICgpPT57Li4ufSgpIHdoaWNoIGlzXG4gICAgICAgIC8vIG5vdCB2YWxpZC5cbiAgICAgICAgYCgke2pzVmFsdWV9KWApO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb24odmFsdWUpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZ1bmN0aW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4vZGlzcG9zYWJsZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTXV0ZXgge1xuICAgIHN0YXRpYyBHdWFyZCA9IGNsYXNzIEd1YXJkIHtcbiAgICAgICAgI211dGV4O1xuICAgICAgICAjb25SZWxlYXNlO1xuICAgICAgICBjb25zdHJ1Y3RvcihtdXRleCwgb25SZWxlYXNlKSB7XG4gICAgICAgICAgICB0aGlzLiNtdXRleCA9IG11dGV4O1xuICAgICAgICAgICAgdGhpcy4jb25SZWxlYXNlID0gb25SZWxlYXNlO1xuICAgICAgICB9XG4gICAgICAgIFtkaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgICAgIHRoaXMuI29uUmVsZWFzZT8uKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jbXV0ZXgucmVsZWFzZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAjbG9ja2VkID0gZmFsc2U7XG4gICAgI2FjcXVpcmVycyA9IFtdO1xuICAgIC8vIFRoaXMgaXMgRklGTy5cbiAgICBhc3luYyBhY3F1aXJlKG9uUmVsZWFzZSkge1xuICAgICAgICBpZiAoIXRoaXMuI2xvY2tlZCkge1xuICAgICAgICAgICAgdGhpcy4jbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTXV0ZXguR3VhcmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAgICAgdGhpcy4jYWNxdWlyZXJzLnB1c2goZGVmZXJyZWQucmVzb2x2ZS5iaW5kKGRlZmVycmVkKSk7XG4gICAgICAgIGF3YWl0IGRlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgICAgICByZXR1cm4gbmV3IE11dGV4Lkd1YXJkKHRoaXMsIG9uUmVsZWFzZSk7XG4gICAgfVxuICAgIHJlbGVhc2UoKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmUgPSB0aGlzLiNhY3F1aXJlcnMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCFyZXNvbHZlKSB7XG4gICAgICAgICAgICB0aGlzLiNsb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXV0ZXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiB2YWx1ZSBpcyB0cnV0aHkuXG4gKiBAcGFyYW0gdmFsdWUgLSBzb21lIGNvbmRpdGlvbmFsIHN0YXRlbWVudFxuICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHRydXRoeS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGFzc2VydCA9ICh2YWx1ZSwgbWVzc2FnZSkgPT4ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hc3NlcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBhc3luY0Rpc3Bvc2VTeW1ib2wsIGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgTXV0ZXggfSBmcm9tICcuL011dGV4LmpzJztcbmNvbnN0IGluc3RhbmNlcyA9IG5ldyBXZWFrU2V0KCk7XG5leHBvcnQgZnVuY3Rpb24gbW92ZWFibGUoQ2xhc3MsIF8pIHtcbiAgICBsZXQgaGFzRGlzcG9zZSA9IGZhbHNlO1xuICAgIGlmIChDbGFzcy5wcm90b3R5cGVbZGlzcG9zZVN5bWJvbF0pIHtcbiAgICAgICAgY29uc3QgZGlzcG9zZSA9IENsYXNzLnByb3RvdHlwZVtkaXNwb3NlU3ltYm9sXTtcbiAgICAgICAgQ2xhc3MucHJvdG90eXBlW2Rpc3Bvc2VTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlcy5oYXModGhpcykpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXMuZGVsZXRlKHRoaXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkaXNwb3NlLmNhbGwodGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIGhhc0Rpc3Bvc2UgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoQ2xhc3MucHJvdG90eXBlW2FzeW5jRGlzcG9zZVN5bWJvbF0pIHtcbiAgICAgICAgY29uc3QgYXN5bmNEaXNwb3NlID0gQ2xhc3MucHJvdG90eXBlW2FzeW5jRGlzcG9zZVN5bWJvbF07XG4gICAgICAgIENsYXNzLnByb3RvdHlwZVthc3luY0Rpc3Bvc2VTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlcy5oYXModGhpcykpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXMuZGVsZXRlKHRoaXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhc3luY0Rpc3Bvc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgaGFzRGlzcG9zZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChoYXNEaXNwb3NlKSB7XG4gICAgICAgIENsYXNzLnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaW5zdGFuY2VzLmFkZCh0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gQ2xhc3M7XG59XG5leHBvcnQgZnVuY3Rpb24gdGhyb3dJZkRpc3Bvc2VkKG1lc3NhZ2UgPSB2YWx1ZSA9PiB7XG4gICAgcmV0dXJuIGBBdHRlbXB0ZWQgdG8gdXNlIGRpc3Bvc2VkICR7dmFsdWUuY29uc3RydWN0b3IubmFtZX0uYDtcbn0pIHtcbiAgICByZXR1cm4gKHRhcmdldCwgXykgPT4ge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gaW5lcnRJZkRpc3Bvc2VkKHRhcmdldCwgXykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQuY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICB9O1xufVxuLyoqXG4gKiBUaGUgZGVjb3JhdG9yIG9ubHkgaW52b2tlcyB0aGUgdGFyZ2V0IGlmIHRoZSB0YXJnZXQgaGFzIG5vdCBiZWVuIGludm9rZWQgd2l0aFxuICogdGhlIHNhbWUgYXJndW1lbnRzIGJlZm9yZS4gVGhlIGRlY29yYXRlZCBtZXRob2QgdGhyb3dzIGFuIGVycm9yIGlmIGl0J3NcbiAqIGludm9rZWQgd2l0aCBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHM6IGlmIHlvdSBkZWNvcmF0ZSBhIG1ldGhvZCwgaXRcbiAqIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHNcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHModGFyZ2V0LCBfKSB7XG4gICAgY29uc3QgY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuICAgIGxldCBjYWNoZURlcHRoID0gLTE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGlmIChjYWNoZURlcHRoID09PSAtMSkge1xuICAgICAgICAgICAgY2FjaGVEZXB0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWNoZURlcHRoICE9PSBhcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vaXplZCBtZXRob2Qgd2FzIGNhbGxlZCB3aXRoIHRoZSB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZyZXNoQXJndW1lbnRzID0gZmFsc2U7XG4gICAgICAgIGxldCBjYWNoZUl0ZXJhdG9yID0gY2FjaGU7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgIGlmIChjYWNoZUl0ZXJhdG9yLmhhcyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgY2FjaGVJdGVyYXRvciA9IGNhY2hlSXRlcmF0b3IuZ2V0KGFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmVzaEFyZ3VtZW50cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2FjaGVJdGVyYXRvci5zZXQoYXJnLCBuZXcgV2Vha01hcCgpKTtcbiAgICAgICAgICAgICAgICBjYWNoZUl0ZXJhdG9yID0gY2FjaGVJdGVyYXRvci5nZXQoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZyZXNoQXJndW1lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ3VhcmRlZChnZXRLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG59KSB7XG4gICAgcmV0dXJuICh0YXJnZXQsIF8pID0+IHtcbiAgICAgICAgY29uc3QgbXV0ZXhlcyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGdldEtleS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIGxldCBtdXRleCA9IG11dGV4ZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFtdXRleCkge1xuICAgICAgICAgICAgICAgICAgICBtdXRleCA9IG5ldyBNdXRleCgpO1xuICAgICAgICAgICAgICAgICAgICBtdXRleGVzLnNldChrZXksIG11dGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgXyA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBhd2FpdCBtdXRleC5hY3F1aXJlKCksIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0YXJnZXQuY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzEpIHtcbiAgICAgICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgICAgICBlbnZfMS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRfMSA9IF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdF8xKVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXN1bHRfMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xufVxuY29uc3QgYnViYmxlSGFuZGxlcnMgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgYnViYmxlSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZXZlbnRzKSB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSBidWJibGVIYW5kbGVycy5nZXQodGhpcykgPz8gbmV3IE1hcCgpO1xuICAgIGlmIChoYW5kbGVycy5oYXMoZXZlbnRzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXIgPSBldmVudHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/ICh0eXBlLCBldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50cy5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCh0eXBlLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgOiAodHlwZSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCh0eXBlLCBldmVudCk7XG4gICAgICAgIH07XG4gICAgaGFuZGxlcnMuc2V0KGV2ZW50cywgaGFuZGxlcik7XG4gICAgYnViYmxlSGFuZGxlcnMuc2V0KHRoaXMsIGhhbmRsZXJzKTtcbn07XG4vKipcbiAqIEV2ZW50IGVtaXR0ZXIgZmllbGRzIG1hcmtlZCB3aXRoIGBidWJibGVgIHdpbGwgaGF2ZSB0aGVpciBldmVudHMgYnViYmxlIHVwXG4gKiB0aGUgZmllbGQgb3duZXIuXG4gKi9cbi8vIFRoZSB0eXBlIGlzIHRvbyBjb21wbGljYXRlZCB0byB0eXBlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbmV4cG9ydCBmdW5jdGlvbiBidWJibGUoZXZlbnRzKSB7XG4gICAgcmV0dXJuICh7IHNldCwgZ2V0IH0sIGNvbnRleHQpID0+IHtcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gYnViYmxlSW5pdGlhbGl6ZXIuYXBwbHkodGhpcywgW2V2ZW50c10pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNldChlbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IGJ1YmJsZUhhbmRsZXJzLmdldCh0aGlzKS5nZXQoZXZlbnRzKTtcbiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGFyZSByZS1zZXR0aW5nLlxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZEVtaXR0ZXIgPSBnZXQuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAob2xkRW1pdHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZEVtaXR0ZXIub2ZmKCcqJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbWl0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbWl0dGVyLm9uKCcqJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgc2V0LmNhbGwodGhpcywgZW1pdHRlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5pdChlbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVtaXR0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdHRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnViYmxlSW5pdGlhbGl6ZXIuYXBwbHkodGhpcywgW2V2ZW50c10pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBidWJibGVIYW5kbGVycy5nZXQodGhpcykuZ2V0KGV2ZW50cyk7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5vbignKicsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbWl0dGVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVjb3JhdG9ycy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuU3ltYm9sLmRpc3Bvc2UgPz89IFN5bWJvbCgnZGlzcG9zZScpO1xuU3ltYm9sLmFzeW5jRGlzcG9zZSA/Pz0gU3ltYm9sKCdhc3luY0Rpc3Bvc2UnKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBkaXNwb3NlU3ltYm9sID0gU3ltYm9sLmRpc3Bvc2U7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgYXN5bmNEaXNwb3NlU3ltYm9sID0gU3ltYm9sLmFzeW5jRGlzcG9zZTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXNwb3NhYmxlU3RhY2sge1xuICAgICNkaXNwb3NlZCA9IGZhbHNlO1xuICAgICNzdGFjayA9IFtdO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBzdGFjayBoYXMgYmVlbiBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBnZXQgZGlzcG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkaXNwb3NlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZXMgZWFjaCByZXNvdXJjZSBpbiB0aGUgc3RhY2sgaW4gdGhlIHJldmVyc2Ugb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWRkZWQuXG4gICAgICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHRoaXMuI3N0YWNrLnJldmVyc2UoKSkge1xuICAgICAgICAgICAgcmVzb3VyY2VbZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZGlzcG9zYWJsZSByZXNvdXJjZSB0byB0aGUgc3RhY2ssIHJldHVybmluZyB0aGUgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgcmVzb3VyY2UgdG8gYWRkLiBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIHdpbGwgbm90IGJlIGFkZGVkLFxuICAgICAqIGJ1dCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEByZXR1cm5zIFRoZSBwcm92aWRlZCBgdmFsdWVgLlxuICAgICAqL1xuICAgIHVzZSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuI3N0YWNrLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHZhbHVlIGFuZCBhc3NvY2lhdGVkIGRpc3Bvc2FsIGNhbGxiYWNrIGFzIGEgcmVzb3VyY2UgdG8gdGhlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0gb25EaXNwb3NlIC0gVGhlIGNhbGxiYWNrIHRvIHVzZSBpbiBwbGFjZSBvZiBhIGBbZGlzcG9zZVN5bWJvbF0oKWBcbiAgICAgKiBtZXRob2QuIFdpbGwgYmUgaW52b2tlZCB3aXRoIGB2YWx1ZWAgYXMgdGhlIGZpcnN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvdmlkZWQgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBhZG9wdCh2YWx1ZSwgb25EaXNwb3NlKSB7XG4gICAgICAgIHRoaXMuI3N0YWNrLnB1c2goe1xuICAgICAgICAgICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICAgICAgICAgIG9uRGlzcG9zZSh2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBzdGFjayBpcyBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBkZWZlcihvbkRpc3Bvc2UpIHtcbiAgICAgICAgdGhpcy4jc3RhY2sucHVzaCh7XG4gICAgICAgICAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgICAgICAgICAgb25EaXNwb3NlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTW92ZSBhbGwgcmVzb3VyY2VzIG91dCBvZiB0aGlzIHN0YWNrIGFuZCBpbnRvIGEgbmV3IGBEaXNwb3NhYmxlU3RhY2tgLCBhbmRcbiAgICAgKiBtYXJrcyB0aGlzIHN0YWNrIGFzIGRpc3Bvc2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY2xhc3MgQyB7XG4gICAgICogICAjcmVzMTogRGlzcG9zYWJsZTtcbiAgICAgKiAgICNyZXMyOiBEaXNwb3NhYmxlO1xuICAgICAqICAgI2Rpc3Bvc2FibGVzOiBEaXNwb3NhYmxlU3RhY2s7XG4gICAgICogICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgKiAgICAgLy8gc3RhY2sgd2lsbCBiZSBkaXNwb3NlZCB3aGVuIGV4aXRpbmcgY29uc3RydWN0b3IgZm9yIGFueSByZWFzb25cbiAgICAgKiAgICAgdXNpbmcgc3RhY2sgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgICpcbiAgICAgKiAgICAgLy8gZ2V0IGZpcnN0IHJlc291cmNlXG4gICAgICogICAgIHRoaXMuI3JlczEgPSBzdGFjay51c2UoZ2V0UmVzb3VyY2UxKCkpO1xuICAgICAqXG4gICAgICogICAgIC8vIGdldCBzZWNvbmQgcmVzb3VyY2UuIElmIHRoaXMgZmFpbHMsIGJvdGggYHN0YWNrYCBhbmQgYCNyZXMxYCB3aWxsIGJlIGRpc3Bvc2VkLlxuICAgICAqICAgICB0aGlzLiNyZXMyID0gc3RhY2sudXNlKGdldFJlc291cmNlMigpKTtcbiAgICAgKlxuICAgICAqICAgICAvLyBhbGwgb3BlcmF0aW9ucyBzdWNjZWVkZWQsIG1vdmUgcmVzb3VyY2VzIG91dCBvZiBgc3RhY2tgIHNvIHRoYXRcbiAgICAgKiAgICAgLy8gdGhleSBhcmVuJ3QgZGlzcG9zZWQgd2hlbiBjb25zdHJ1Y3RvciBleGl0c1xuICAgICAqICAgICB0aGlzLiNkaXNwb3NhYmxlcyA9IHN0YWNrLm1vdmUoKTtcbiAgICAgKiAgIH1cbiAgICAgKlxuICAgICAqICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAqICAgICB0aGlzLiNkaXNwb3NhYmxlcy5kaXNwb3NlKCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCdhIGRpc3Bvc2VkIHN0YWNrIGNhbiBub3QgdXNlIGFueXRoaW5nIG5ldycpOyAvLyBzdGVwIDNcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFjayA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTsgLy8gc3RlcCA0LTVcbiAgICAgICAgc3RhY2suI3N0YWNrID0gdGhpcy4jc3RhY2s7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH1cbiAgICBbZGlzcG9zZVN5bWJvbF0gPSB0aGlzLmRpc3Bvc2U7XG4gICAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnRGlzcG9zYWJsZVN0YWNrJztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0Rpc3Bvc2FibGVTdGFjayB7XG4gICAgI2Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgI3N0YWNrID0gW107XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHN0YWNrIGhhcyBiZWVuIGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlcyBlYWNoIHJlc291cmNlIGluIHRoZSBzdGFjayBpbiB0aGUgcmV2ZXJzZSBvcmRlciB0aGF0IHRoZXkgd2VyZSBhZGRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNkaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgdGhpcy4jc3RhY2sucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBhd2FpdCByZXNvdXJjZVthc3luY0Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGRpc3Bvc2FibGUgcmVzb3VyY2UgdG8gdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIHJlc291cmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHJlc291cmNlIHRvIGFkZC4gYG51bGxgIGFuZCBgdW5kZWZpbmVkYCB3aWxsIG5vdCBiZSBhZGRlZCxcbiAgICAgKiBidXQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvdmlkZWQgYHZhbHVlYC5cbiAgICAgKi9cbiAgICB1c2UodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLiNzdGFjay5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB2YWx1ZSBhbmQgYXNzb2NpYXRlZCBkaXNwb3NhbCBjYWxsYmFjayBhcyBhIHJlc291cmNlIHRvIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBhZGQuXG4gICAgICogQHBhcmFtIG9uRGlzcG9zZSAtIFRoZSBjYWxsYmFjayB0byB1c2UgaW4gcGxhY2Ugb2YgYSBgW2Rpc3Bvc2VTeW1ib2xdKClgXG4gICAgICogbWV0aG9kLiBXaWxsIGJlIGludm9rZWQgd2l0aCBgdmFsdWVgIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMgVGhlIHByb3ZpZGVkIGB2YWx1ZWAuXG4gICAgICovXG4gICAgYWRvcHQodmFsdWUsIG9uRGlzcG9zZSkge1xuICAgICAgICB0aGlzLiNzdGFjay5wdXNoKHtcbiAgICAgICAgICAgIFthc3luY0Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvbkRpc3Bvc2UodmFsdWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc3RhY2sgaXMgZGlzcG9zZWQuXG4gICAgICovXG4gICAgZGVmZXIob25EaXNwb3NlKSB7XG4gICAgICAgIHRoaXMuI3N0YWNrLnB1c2goe1xuICAgICAgICAgICAgW2FzeW5jRGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9uRGlzcG9zZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmUgYWxsIHJlc291cmNlcyBvdXQgb2YgdGhpcyBzdGFjayBhbmQgaW50byBhIG5ldyBgRGlzcG9zYWJsZVN0YWNrYCwgYW5kXG4gICAgICogbWFya3MgdGhpcyBzdGFjayBhcyBkaXNwb3NlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNsYXNzIEMge1xuICAgICAqICAgI3JlczE6IERpc3Bvc2FibGU7XG4gICAgICogICAjcmVzMjogRGlzcG9zYWJsZTtcbiAgICAgKiAgICNkaXNwb3NhYmxlczogRGlzcG9zYWJsZVN0YWNrO1xuICAgICAqICAgY29uc3RydWN0b3IoKSB7XG4gICAgICogICAgIC8vIHN0YWNrIHdpbGwgYmUgZGlzcG9zZWQgd2hlbiBleGl0aW5nIGNvbnN0cnVjdG9yIGZvciBhbnkgcmVhc29uXG4gICAgICogICAgIHVzaW5nIHN0YWNrID0gbmV3IERpc3Bvc2FibGVTdGFjaygpO1xuICAgICAqXG4gICAgICogICAgIC8vIGdldCBmaXJzdCByZXNvdXJjZVxuICAgICAqICAgICB0aGlzLiNyZXMxID0gc3RhY2sudXNlKGdldFJlc291cmNlMSgpKTtcbiAgICAgKlxuICAgICAqICAgICAvLyBnZXQgc2Vjb25kIHJlc291cmNlLiBJZiB0aGlzIGZhaWxzLCBib3RoIGBzdGFja2AgYW5kIGAjcmVzMWAgd2lsbCBiZSBkaXNwb3NlZC5cbiAgICAgKiAgICAgdGhpcy4jcmVzMiA9IHN0YWNrLnVzZShnZXRSZXNvdXJjZTIoKSk7XG4gICAgICpcbiAgICAgKiAgICAgLy8gYWxsIG9wZXJhdGlvbnMgc3VjY2VlZGVkLCBtb3ZlIHJlc291cmNlcyBvdXQgb2YgYHN0YWNrYCBzbyB0aGF0XG4gICAgICogICAgIC8vIHRoZXkgYXJlbid0IGRpc3Bvc2VkIHdoZW4gY29uc3RydWN0b3IgZXhpdHNcbiAgICAgKiAgICAgdGhpcy4jZGlzcG9zYWJsZXMgPSBzdGFjay5tb3ZlKCk7XG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiAgIFtkaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgKiAgICAgdGhpcy4jZGlzcG9zYWJsZXMuZGlzcG9zZSgpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb3ZlKCkge1xuICAgICAgICBpZiAodGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcignYSBkaXNwb3NlZCBzdGFjayBjYW4gbm90IHVzZSBhbnl0aGluZyBuZXcnKTsgLy8gc3RlcCAzXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgQXN5bmNEaXNwb3NhYmxlU3RhY2soKTsgLy8gc3RlcCA0LTVcbiAgICAgICAgc3RhY2suI3N0YWNrID0gdGhpcy4jc3RhY2s7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH1cbiAgICBbYXN5bmNEaXNwb3NlU3ltYm9sXSA9IHRoaXMuZGlzcG9zZTtcbiAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdBc3luY0Rpc3Bvc2FibGVTdGFjayc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXNwb3NhYmxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL2Fzc2VydC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0RlZmVycmVkLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXJyb3JMaWtlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQXN5bmNJdGVyYWJsZVV0aWwuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXNwb3NhYmxlLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWwuanMubWFwIiwiLyoqXG5NSVQgTGljZW5zZVxuXG5Db3B5cmlnaHQgKGMpIDIwMjEgSmFzb24gTWlsbGVyXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG5jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG5TT0ZUV0FSRS5cblxuKi9cbi8vIC4uLy4uL25vZGVfbW9kdWxlcy9taXR0L2Rpc3QvbWl0dC5tanNcbmZ1bmN0aW9uIG1pdHRfZGVmYXVsdChuKSB7XG4gIHJldHVybiB7IGFsbDogbiA9IG4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgb246IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICB2YXIgaSA9IG4uZ2V0KHQpO1xuICAgIGkgPyBpLnB1c2goZSkgOiBuLnNldCh0LCBbZV0pO1xuICB9LCBvZmY6IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICB2YXIgaSA9IG4uZ2V0KHQpO1xuICAgIGkgJiYgKGUgPyBpLnNwbGljZShpLmluZGV4T2YoZSkgPj4+IDAsIDEpIDogbi5zZXQodCwgW10pKTtcbiAgfSwgZW1pdDogZnVuY3Rpb24odCwgZSkge1xuICAgIHZhciBpID0gbi5nZXQodCk7XG4gICAgaSAmJiBpLnNsaWNlKCkubWFwKGZ1bmN0aW9uKG4yKSB7XG4gICAgICBuMihlKTtcbiAgICB9KSwgKGkgPSBuLmdldChcIipcIikpICYmIGkuc2xpY2UoKS5tYXAoZnVuY3Rpb24objIpIHtcbiAgICAgIG4yKHQsIGUpO1xuICAgIH0pO1xuICB9IH07XG59XG5leHBvcnQge1xuICBtaXR0X2RlZmF1bHQgYXMgZGVmYXVsdFxufTtcbiIsIi8qKlxuTUlUIExpY2Vuc2VcblxuQ29weXJpZ2h0IChjKSAyMDIwIExlYSBWZXJvdVxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuU09GVFdBUkUuXG5cbiovXG4vLyAuLi8uLi9ub2RlX21vZHVsZXMvcGFyc2VsLWpzL2Rpc3QvcGFyc2VsLmpzXG52YXIgVE9LRU5TID0ge1xuICBhdHRyaWJ1dGU6IC9cXFtcXHMqKD86KD88bmFtZXNwYWNlPlxcKnxbLVxcd1xcUHtBU0NJSX1dKilcXHwpPyg/PG5hbWU+Wy1cXHdcXFB7QVNDSUl9XSspXFxzKig/Oig/PG9wZXJhdG9yPlxcVz89KVxccyooPzx2YWx1ZT4uKz8pXFxzKihcXHMoPzxjYXNlU2Vuc2l0aXZlPltpSXNTXSkpP1xccyopP1xcXS9ndSxcbiAgaWQ6IC8jKD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykvZ3UsXG4gIGNsYXNzOiAvXFwuKD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykvZ3UsXG4gIGNvbW1hOiAvXFxzKixcXHMqL2csXG4gIGNvbWJpbmF0b3I6IC9cXHMqW1xccz4rfl1cXHMqL2csXG4gIFwicHNldWRvLWVsZW1lbnRcIjogLzo6KD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykoPzpcXCgoPzxhcmd1bWVudD7CtiopXFwpKT8vZ3UsXG4gIFwicHNldWRvLWNsYXNzXCI6IC86KD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykoPzpcXCgoPzxhcmd1bWVudD7CtiopXFwpKT8vZ3UsXG4gIHVuaXZlcnNhbDogLyg/Oig/PG5hbWVzcGFjZT5cXCp8Wy1cXHdcXFB7QVNDSUl9XSopXFx8KT9cXCovZ3UsXG4gIHR5cGU6IC8oPzooPzxuYW1lc3BhY2U+XFwqfFstXFx3XFxQe0FTQ0lJfV0qKVxcfCk/KD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykvZ3VcbiAgLy8gdGhpcyBtdXN0IGJlIGxhc3Rcbn07XG52YXIgVFJJTV9UT0tFTlMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXCJjb21iaW5hdG9yXCIsIFwiY29tbWFcIl0pO1xudmFyIGdldEFyZ3VtZW50UGF0dGVybkJ5VHlwZSA9ICh0eXBlKSA9PiB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJwc2V1ZG8tZWxlbWVudFwiOlxuICAgIGNhc2UgXCJwc2V1ZG8tY2xhc3NcIjpcbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKFRPS0VOU1t0eXBlXS5zb3VyY2UucmVwbGFjZShcIig/PGFyZ3VtZW50PlxceEI2KilcIiwgXCIoPzxhcmd1bWVudD4uKilcIiksIFwiZ3VcIik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBUT0tFTlNbdHlwZV07XG4gIH1cbn07XG5mdW5jdGlvbiBnb2JibGVQYXJlbnModGV4dCwgb2Zmc2V0KSB7XG4gIGxldCBuZXN0aW5nID0gMDtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGZvciAoOyBvZmZzZXQgPCB0ZXh0Lmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICBjb25zdCBjaGFyID0gdGV4dFtvZmZzZXRdO1xuICAgIHN3aXRjaCAoY2hhcikge1xuICAgICAgY2FzZSBcIihcIjpcbiAgICAgICAgKytuZXN0aW5nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCIpXCI6XG4gICAgICAgIC0tbmVzdGluZztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJlc3VsdCArPSBjaGFyO1xuICAgIGlmIChuZXN0aW5nID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdG9rZW5pemVCeSh0ZXh0LCBncmFtbWFyID0gVE9LRU5TKSB7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCB0b2tlbnMgPSBbdGV4dF07XG4gIGZvciAoY29uc3QgW3R5cGUsIHBhdHRlcm5dIG9mIE9iamVjdC5lbnRyaWVzKGdyYW1tYXIpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKHRva2VuKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBmcm9tID0gbWF0Y2guaW5kZXggLSAxO1xuICAgICAgY29uc3QgYXJncyA9IFtdO1xuICAgICAgY29uc3QgY29udGVudCA9IG1hdGNoWzBdO1xuICAgICAgY29uc3QgYmVmb3JlID0gdG9rZW4uc2xpY2UoMCwgZnJvbSArIDEpO1xuICAgICAgaWYgKGJlZm9yZSkge1xuICAgICAgICBhcmdzLnB1c2goYmVmb3JlKTtcbiAgICAgIH1cbiAgICAgIGFyZ3MucHVzaCh7XG4gICAgICAgIC4uLm1hdGNoLmdyb3VwcyxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgY29udGVudFxuICAgICAgfSk7XG4gICAgICBjb25zdCBhZnRlciA9IHRva2VuLnNsaWNlKGZyb20gKyBjb250ZW50Lmxlbmd0aCArIDEpO1xuICAgICAgaWYgKGFmdGVyKSB7XG4gICAgICAgIGFyZ3MucHVzaChhZnRlcik7XG4gICAgICB9XG4gICAgICB0b2tlbnMuc3BsaWNlKGksIDEsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB0b2tlbikge1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2VxdWVuY2UgJHt0b2tlbn0gZm91bmQgYXQgaW5kZXggJHtvZmZzZXR9YCk7XG4gICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgIG9mZnNldCArPSB0b2tlbi5jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgdG9rZW4ucG9zID0gW29mZnNldCAtIHRva2VuLmNvbnRlbnQubGVuZ3RoLCBvZmZzZXRdO1xuICAgICAgICBpZiAoVFJJTV9UT0tFTlMuaGFzKHRva2VuLnR5cGUpKSB7XG4gICAgICAgICAgdG9rZW4uY29udGVudCA9IHRva2VuLmNvbnRlbnQudHJpbSgpIHx8IFwiIFwiO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG9rZW5zO1xufVxudmFyIFNUUklOR19QQVRURVJOID0gLyhbJ1wiXSkoW15cXFxcXFxuXSs/KVxcMS9nO1xudmFyIEVTQ0FQRV9QQVRURVJOID0gL1xcXFwuL2c7XG5mdW5jdGlvbiB0b2tlbml6ZShzZWxlY3RvciwgZ3JhbW1hciA9IFRPS0VOUykge1xuICBzZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKTtcbiAgaWYgKHNlbGVjdG9yID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHJlcGxhY2VtZW50cyA9IFtdO1xuICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoRVNDQVBFX1BBVFRFUk4sICh2YWx1ZSwgb2Zmc2V0KSA9PiB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyB2YWx1ZSwgb2Zmc2V0IH0pO1xuICAgIHJldHVybiBcIlxcdUUwMDBcIi5yZXBlYXQodmFsdWUubGVuZ3RoKTtcbiAgfSk7XG4gIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZShTVFJJTkdfUEFUVEVSTiwgKHZhbHVlLCBxdW90ZSwgY29udGVudCwgb2Zmc2V0KSA9PiB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyB2YWx1ZSwgb2Zmc2V0IH0pO1xuICAgIHJldHVybiBgJHtxdW90ZX0ke1wiXFx1RTAwMVwiLnJlcGVhdChjb250ZW50Lmxlbmd0aCl9JHtxdW90ZX1gO1xuICB9KTtcbiAge1xuICAgIGxldCBwb3MgPSAwO1xuICAgIGxldCBvZmZzZXQ7XG4gICAgd2hpbGUgKChvZmZzZXQgPSBzZWxlY3Rvci5pbmRleE9mKFwiKFwiLCBwb3MpKSA+IC0xKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGdvYmJsZVBhcmVucyhzZWxlY3Rvciwgb2Zmc2V0KTtcbiAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHsgdmFsdWUsIG9mZnNldCB9KTtcbiAgICAgIHNlbGVjdG9yID0gYCR7c2VsZWN0b3Iuc3Vic3RyaW5nKDAsIG9mZnNldCl9KCR7XCJcXHhCNlwiLnJlcGVhdCh2YWx1ZS5sZW5ndGggLSAyKX0pJHtzZWxlY3Rvci5zdWJzdHJpbmcob2Zmc2V0ICsgdmFsdWUubGVuZ3RoKX1gO1xuICAgICAgcG9zID0gb2Zmc2V0ICsgdmFsdWUubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZUJ5KHNlbGVjdG9yLCBncmFtbWFyKTtcbiAgY29uc3QgY2hhbmdlZFRva2VucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGZvciAoY29uc3QgcmVwbGFjZW1lbnQgb2YgcmVwbGFjZW1lbnRzLnJldmVyc2UoKSkge1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICBjb25zdCB7IG9mZnNldCwgdmFsdWUgfSA9IHJlcGxhY2VtZW50O1xuICAgICAgaWYgKCEodG9rZW4ucG9zWzBdIDw9IG9mZnNldCAmJiBvZmZzZXQgKyB2YWx1ZS5sZW5ndGggPD0gdG9rZW4ucG9zWzFdKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgY29udGVudCB9ID0gdG9rZW47XG4gICAgICBjb25zdCB0b2tlbk9mZnNldCA9IG9mZnNldCAtIHRva2VuLnBvc1swXTtcbiAgICAgIHRva2VuLmNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIHRva2VuT2Zmc2V0KSArIHZhbHVlICsgY29udGVudC5zbGljZSh0b2tlbk9mZnNldCArIHZhbHVlLmxlbmd0aCk7XG4gICAgICBpZiAodG9rZW4uY29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgICBjaGFuZ2VkVG9rZW5zLmFkZCh0b2tlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgdG9rZW4gb2YgY2hhbmdlZFRva2Vucykge1xuICAgIGNvbnN0IHBhdHRlcm4gPSBnZXRBcmd1bWVudFBhdHRlcm5CeVR5cGUodG9rZW4udHlwZSk7XG4gICAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdG9rZW4gdHlwZTogJHt0b2tlbi50eXBlfWApO1xuICAgIH1cbiAgICBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWModG9rZW4uY29udGVudCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgY29udGVudCBmb3IgJHt0b2tlbi50eXBlfTogJHt0b2tlbi5jb250ZW50fWApO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHRva2VuLCBtYXRjaC5ncm91cHMpO1xuICB9XG4gIHJldHVybiB0b2tlbnM7XG59XG5mdW5jdGlvbiogZmxhdHRlbihub2RlLCBwYXJlbnQpIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwibGlzdFwiOlxuICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5saXN0KSB7XG4gICAgICAgIHlpZWxkKiBmbGF0dGVuKGNoaWxkLCBub2RlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJjb21wbGV4XCI6XG4gICAgICB5aWVsZCogZmxhdHRlbihub2RlLmxlZnQsIG5vZGUpO1xuICAgICAgeWllbGQqIGZsYXR0ZW4obm9kZS5yaWdodCwgbm9kZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiY29tcG91bmRcIjpcbiAgICAgIHlpZWxkKiBub2RlLmxpc3QubWFwKCh0b2tlbikgPT4gW3Rva2VuLCBub2RlXSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgeWllbGQgW25vZGUsIHBhcmVudF07XG4gIH1cbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeShsaXN0T3JOb2RlKSB7XG4gIGxldCB0b2tlbnM7XG4gIGlmIChBcnJheS5pc0FycmF5KGxpc3RPck5vZGUpKSB7XG4gICAgdG9rZW5zID0gbGlzdE9yTm9kZTtcbiAgfSBlbHNlIHtcbiAgICB0b2tlbnMgPSBbLi4uZmxhdHRlbihsaXN0T3JOb2RlKV0ubWFwKChbdG9rZW5dKSA9PiB0b2tlbik7XG4gIH1cbiAgcmV0dXJuIHRva2Vucy5tYXAoKHRva2VuKSA9PiB0b2tlbi5jb250ZW50KS5qb2luKFwiXCIpO1xufVxuZXhwb3J0IHtcbiAgVE9LRU5TLFxuICBzdHJpbmdpZnksXG4gIHRva2VuaXplXG59O1xuIiwiLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0XG4gICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL1xuXG4gVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OXG5cbiAxLiBEZWZpbml0aW9ucy5cblxuICAgIFwiTGljZW5zZVwiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbixcbiAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC5cblxuICAgIFwiTGljZW5zb3JcIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnlcbiAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICBcIkxlZ2FsIEVudGl0eVwiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGxcbiAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uXG4gICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbixcbiAgICBcImNvbnRyb2xcIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZVxuICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yXG4gICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlXG4gICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS5cblxuICAgIFwiWW91XCIgKG9yIFwiWW91clwiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5XG4gICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS5cblxuICAgIFwiU291cmNlXCIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsXG4gICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvblxuICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG5cbiAgICBcIk9iamVjdFwiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsXG4gICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dFxuICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbixcbiAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuXG5cbiAgICBcIldvcmtcIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yXG4gICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYVxuICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29ya1xuICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuXG5cbiAgICBcIkRlcml2YXRpdmUgV29ya3NcIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3RcbiAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlXG4gICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9uc1xuICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzXG4gICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluXG4gICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLFxuICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuXG5cbiAgICBcIkNvbnRyaWJ1dGlvblwiIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nXG4gICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9uc1xuICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseVxuICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXJcbiAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2ZcbiAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgXCJzdWJtaXR0ZWRcIlxuICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnRcbiAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0b1xuICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsXG4gICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGVcbiAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXRcbiAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZVxuICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzIFwiTm90IGEgQ29udHJpYnV0aW9uLlwiXG5cbiAgICBcIkNvbnRyaWJ1dG9yXCIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5XG4gICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kXG4gICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuXG5cbiAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsXG4gICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGVcbiAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZixcbiAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGVcbiAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLlxuXG4gMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG4gICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLFxuICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlXG4gICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsXG4gICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssXG4gICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGVcbiAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpclxuICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocylcbiAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdVxuICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhXG4gICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29ya1xuICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0XG4gICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlc1xuICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZVxuICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC5cblxuIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlXG4gICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0XG4gICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3VcbiAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yXG4gICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kXG5cbiAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzXG4gICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZFxuXG4gICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzXG4gICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmRcbiAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yayxcbiAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZlxuICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kXG5cbiAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSBcIk5PVElDRVwiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0c1xuICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0XG4gICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZFxuICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3RcbiAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lXG4gICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkXG4gICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3JcbiAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsXG4gICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmRcbiAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzXG4gICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmRcbiAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb25cbiAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGVcbiAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkXG4gICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZFxuICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmRcbiAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zXG4gICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvclxuICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLFxuICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aFxuICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuXG5cbiA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsXG4gICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrXG4gICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy5cbiAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5XG4gICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWRcbiAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuXG5cbiA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlXG4gICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLFxuICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZVxuICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLlxuXG4gNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yXG4gICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaFxuICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yXG4gICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnNcbiAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBXG4gICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlXG4gICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55XG4gICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLlxuXG4gOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksXG4gICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsXG4gICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHlcbiAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZVxuICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCxcbiAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGFcbiAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlXG4gICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLFxuICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsXG4gICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvclxuICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy5cblxuIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmdcbiAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLFxuICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksXG4gICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXNcbiAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seVxuICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmXG4gICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LFxuICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eVxuICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb25cbiAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS5cblxuIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OU1xuXG4gQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLlxuXG4gICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmdcbiAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBcIltdXCJcbiAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZVxuICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlXG4gICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhXG4gICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZVxuICAgIHNhbWUgXCJwcmludGVkIHBhZ2VcIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyXG4gICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLlxuXG4gQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggR29vZ2xlLCBJbmMuLCBOZXRmbGl4LCBJbmMuLCBNaWNyb3NvZnQgQ29ycC4gYW5kIGNvbnRyaWJ1dG9yc1xuXG4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiBcblxuKi9cbi8vIG5vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikge1xuICAgIGQyLl9fcHJvdG9fXyA9IGIyO1xuICB9IHx8IGZ1bmN0aW9uKGQyLCBiMikge1xuICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdO1xuICB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5mdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7XG4gIH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgfVxuICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdO1xuICAgIHJldHVybiB0WzFdO1xuICB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odikge1xuICAgICAgcmV0dXJuIHN0ZXAoW24sIHZdKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICB5ID0gb3BbMV07XG4gICAgICAgICAgb3AgPSBbMF07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpO1xuICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCBvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkge1xuICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV07XG4gICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9wID0gWzYsIGVdO1xuICAgICAgeSA9IDA7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGYgPSB0ID0gMDtcbiAgICB9XG4gICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07XG4gICAgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cbmZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZSA9IHsgZXJyb3IgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5mdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tMiwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20yLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoYXIgfHwgIShpIGluIGZyb20yKSkge1xuICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tMiwgMCwgaSk7XG4gICAgICBhcltpXSA9IGZyb20yW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20yKSk7XG59XG5mdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5mdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0ZXAoZ1tuXSh2KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2V0dGxlKHFbMF1bM10sIGUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzdGVwKHIpIHtcbiAgICByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTtcbiAgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7XG4gICAgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpO1xuICB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7XG4gICAgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTtcbiAgfVxufVxuZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikge1xuICAgIGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHtcbiAgICBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2Mikge1xuICAgICAgcmVzb2x2ZSh7IHZhbHVlOiB2MiwgZG9uZTogZCB9KTtcbiAgICB9LCByZWplY3QpO1xuICB9XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzRnVuY3Rpb24uanNcbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9jcmVhdGVFcnJvckNsYXNzLmpzXG5mdW5jdGlvbiBjcmVhdGVFcnJvckNsYXNzKGNyZWF0ZUltcGwpIHtcbiAgdmFyIF9zdXBlciA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgRXJyb3IuY2FsbChpbnN0YW5jZSk7XG4gICAgaW5zdGFuY2Uuc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgfTtcbiAgdmFyIGN0b3JGdW5jID0gY3JlYXRlSW1wbChfc3VwZXIpO1xuICBjdG9yRnVuYy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4gIGN0b3JGdW5jLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JGdW5jO1xuICByZXR1cm4gY3RvckZ1bmM7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL1Vuc3Vic2NyaXB0aW9uRXJyb3IuanNcbnZhciBVbnN1YnNjcmlwdGlvbkVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVuc3Vic2NyaXB0aW9uRXJyb3JJbXBsKGVycm9ycykge1xuICAgIF9zdXBlcih0aGlzKTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBlcnJvcnMgPyBlcnJvcnMubGVuZ3RoICsgXCIgZXJyb3JzIG9jY3VycmVkIGR1cmluZyB1bnN1YnNjcmlwdGlvbjpcXG5cIiArIGVycm9ycy5tYXAoZnVuY3Rpb24oZXJyLCBpKSB7XG4gICAgICByZXR1cm4gaSArIDEgKyBcIikgXCIgKyBlcnIudG9TdHJpbmcoKTtcbiAgICB9KS5qb2luKFwiXFxuICBcIikgOiBcIlwiO1xuICAgIHRoaXMubmFtZSA9IFwiVW5zdWJzY3JpcHRpb25FcnJvclwiO1xuICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICB9O1xufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyclJlbW92ZS5qc1xuZnVuY3Rpb24gYXJyUmVtb3ZlKGFyciwgaXRlbSkge1xuICBpZiAoYXJyKSB7XG4gICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7XG4gICAgMCA8PSBpbmRleCAmJiBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvU3Vic2NyaXB0aW9uLmpzXG52YXIgU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIFN1YnNjcmlwdGlvbjIoaW5pdGlhbFRlYXJkb3duKSB7XG4gICAgdGhpcy5pbml0aWFsVGVhcmRvd24gPSBpbml0aWFsVGVhcmRvd247XG4gICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsO1xuICAgIHRoaXMuX2ZpbmFsaXplcnMgPSBudWxsO1xuICB9XG4gIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGVfMSwgX2EsIGVfMiwgX2I7XG4gICAgdmFyIGVycm9ycztcbiAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICAgIGlmIChfcGFyZW50YWdlKSB7XG4gICAgICAgIHRoaXMuX3BhcmVudGFnZSA9IG51bGw7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KF9wYXJlbnRhZ2UpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9wYXJlbnRhZ2VfMSA9IF9fdmFsdWVzKF9wYXJlbnRhZ2UpLCBfcGFyZW50YWdlXzFfMSA9IF9wYXJlbnRhZ2VfMS5uZXh0KCk7ICFfcGFyZW50YWdlXzFfMS5kb25lOyBfcGFyZW50YWdlXzFfMSA9IF9wYXJlbnRhZ2VfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgdmFyIHBhcmVudF8xID0gX3BhcmVudGFnZV8xXzEudmFsdWU7XG4gICAgICAgICAgICAgIHBhcmVudF8xLnJlbW92ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlXzFfMSkge1xuICAgICAgICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKF9wYXJlbnRhZ2VfMV8xICYmICFfcGFyZW50YWdlXzFfMS5kb25lICYmIChfYSA9IF9wYXJlbnRhZ2VfMS5yZXR1cm4pKSBfYS5jYWxsKF9wYXJlbnRhZ2VfMSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9wYXJlbnRhZ2UucmVtb3ZlKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgaW5pdGlhbEZpbmFsaXplciA9IHRoaXMuaW5pdGlhbFRlYXJkb3duO1xuICAgICAgaWYgKGlzRnVuY3Rpb24oaW5pdGlhbEZpbmFsaXplcikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbml0aWFsRmluYWxpemVyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBlcnJvcnMgPSBlIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvciA/IGUuZXJyb3JzIDogW2VdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX2ZpbmFsaXplcnMgPSB0aGlzLl9maW5hbGl6ZXJzO1xuICAgICAgaWYgKF9maW5hbGl6ZXJzKSB7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplcnMgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9maW5hbGl6ZXJzXzEgPSBfX3ZhbHVlcyhfZmluYWxpemVycyksIF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpOyAhX2ZpbmFsaXplcnNfMV8xLmRvbmU7IF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgZmluYWxpemVyID0gX2ZpbmFsaXplcnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZXhlY0ZpbmFsaXplcihmaW5hbGl6ZXIpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycyAhPT0gbnVsbCAmJiBlcnJvcnMgIT09IHZvaWQgMCA/IGVycm9ycyA6IFtdO1xuICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9ycyA9IF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGVycm9ycykpLCBfX3JlYWQoZXJyLmVycm9ycykpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVfMl8xKSB7XG4gICAgICAgICAgZV8yID0geyBlcnJvcjogZV8yXzEgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9maW5hbGl6ZXJzXzFfMSAmJiAhX2ZpbmFsaXplcnNfMV8xLmRvbmUgJiYgKF9iID0gX2ZpbmFsaXplcnNfMS5yZXR1cm4pKSBfYi5jYWxsKF9maW5hbGl6ZXJzXzEpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1YnNjcmlwdGlvbkVycm9yKGVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbih0ZWFyZG93bikge1xuICAgIHZhciBfYTtcbiAgICBpZiAodGVhcmRvd24gJiYgdGVhcmRvd24gIT09IHRoaXMpIHtcbiAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICBleGVjRmluYWxpemVyKHRlYXJkb3duKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0ZWFyZG93biBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbjIpIHtcbiAgICAgICAgICBpZiAodGVhcmRvd24uY2xvc2VkIHx8IHRlYXJkb3duLl9oYXNQYXJlbnQodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGVhcmRvd24uX2FkZFBhcmVudCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICAodGhpcy5fZmluYWxpemVycyA9IChfYSA9IHRoaXMuX2ZpbmFsaXplcnMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKS5wdXNoKHRlYXJkb3duKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9oYXNQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHtcbiAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICByZXR1cm4gX3BhcmVudGFnZSA9PT0gcGFyZW50IHx8IEFycmF5LmlzQXJyYXkoX3BhcmVudGFnZSkgJiYgX3BhcmVudGFnZS5pbmNsdWRlcyhwYXJlbnQpO1xuICB9O1xuICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5fYWRkUGFyZW50ID0gZnVuY3Rpb24ocGFyZW50KSB7XG4gICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7XG4gICAgdGhpcy5fcGFyZW50YWdlID0gQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSA/IChfcGFyZW50YWdlLnB1c2gocGFyZW50KSwgX3BhcmVudGFnZSkgOiBfcGFyZW50YWdlID8gW19wYXJlbnRhZ2UsIHBhcmVudF0gOiBwYXJlbnQ7XG4gIH07XG4gIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9yZW1vdmVQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHtcbiAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICBpZiAoX3BhcmVudGFnZSA9PT0gcGFyZW50KSB7XG4gICAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSkge1xuICAgICAgYXJyUmVtb3ZlKF9wYXJlbnRhZ2UsIHBhcmVudCk7XG4gICAgfVxuICB9O1xuICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbih0ZWFyZG93bikge1xuICAgIHZhciBfZmluYWxpemVycyA9IHRoaXMuX2ZpbmFsaXplcnM7XG4gICAgX2ZpbmFsaXplcnMgJiYgYXJyUmVtb3ZlKF9maW5hbGl6ZXJzLCB0ZWFyZG93bik7XG4gICAgaWYgKHRlYXJkb3duIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uMikge1xuICAgICAgdGVhcmRvd24uX3JlbW92ZVBhcmVudCh0aGlzKTtcbiAgICB9XG4gIH07XG4gIFN1YnNjcmlwdGlvbjIuRU1QVFkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZW1wdHkgPSBuZXcgU3Vic2NyaXB0aW9uMigpO1xuICAgIGVtcHR5LmNsb3NlZCA9IHRydWU7XG4gICAgcmV0dXJuIGVtcHR5O1xuICB9KCk7XG4gIHJldHVybiBTdWJzY3JpcHRpb24yO1xufSgpO1xudmFyIEVNUFRZX1NVQlNDUklQVElPTiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbmZ1bmN0aW9uIGlzU3Vic2NyaXB0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbiB8fCB2YWx1ZSAmJiBcImNsb3NlZFwiIGluIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUucmVtb3ZlKSAmJiBpc0Z1bmN0aW9uKHZhbHVlLmFkZCkgJiYgaXNGdW5jdGlvbih2YWx1ZS51bnN1YnNjcmliZSk7XG59XG5mdW5jdGlvbiBleGVjRmluYWxpemVyKGZpbmFsaXplcikge1xuICBpZiAoaXNGdW5jdGlvbihmaW5hbGl6ZXIpKSB7XG4gICAgZmluYWxpemVyKCk7XG4gIH0gZWxzZSB7XG4gICAgZmluYWxpemVyLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL2NvbmZpZy5qc1xudmFyIGNvbmZpZyA9IHtcbiAgb25VbmhhbmRsZWRFcnJvcjogbnVsbCxcbiAgb25TdG9wcGVkTm90aWZpY2F0aW9uOiBudWxsLFxuICBQcm9taXNlOiB2b2lkIDAsXG4gIHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmc6IGZhbHNlLFxuICB1c2VEZXByZWNhdGVkTmV4dENvbnRleHQ6IGZhbHNlXG59O1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL3RpbWVvdXRQcm92aWRlci5qc1xudmFyIHRpbWVvdXRQcm92aWRlciA9IHtcbiAgc2V0VGltZW91dDogZnVuY3Rpb24oaGFuZGxlciwgdGltZW91dCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGFyZ3NbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBkZWxlZ2F0ZSA9IHRpbWVvdXRQcm92aWRlci5kZWxlZ2F0ZTtcbiAgICBpZiAoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLnNldFRpbWVvdXQpIHtcbiAgICAgIHJldHVybiBkZWxlZ2F0ZS5zZXRUaW1lb3V0LmFwcGx5KGRlbGVnYXRlLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyLCB0aW1lb3V0XSwgX19yZWFkKGFyZ3MpKSk7XG4gICAgfVxuICAgIHJldHVybiBzZXRUaW1lb3V0LmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbaGFuZGxlciwgdGltZW91dF0sIF9fcmVhZChhcmdzKSkpO1xuICB9LFxuICBjbGVhclRpbWVvdXQ6IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgIHZhciBkZWxlZ2F0ZSA9IHRpbWVvdXRQcm92aWRlci5kZWxlZ2F0ZTtcbiAgICByZXR1cm4gKChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuY2xlYXJUaW1lb3V0KSB8fCBjbGVhclRpbWVvdXQpKGhhbmRsZSk7XG4gIH0sXG4gIGRlbGVnYXRlOiB2b2lkIDBcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3JlcG9ydFVuaGFuZGxlZEVycm9yLmpzXG5mdW5jdGlvbiByZXBvcnRVbmhhbmRsZWRFcnJvcihlcnIpIHtcbiAgdGltZW91dFByb3ZpZGVyLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uVW5oYW5kbGVkRXJyb3IgPSBjb25maWcub25VbmhhbmRsZWRFcnJvcjtcbiAgICBpZiAob25VbmhhbmRsZWRFcnJvcikge1xuICAgICAgb25VbmhhbmRsZWRFcnJvcihlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvbm9vcC5qc1xuZnVuY3Rpb24gbm9vcCgpIHtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL05vdGlmaWNhdGlvbkZhY3Rvcmllcy5qc1xudmFyIENPTVBMRVRFX05PVElGSUNBVElPTiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKFwiQ1wiLCB2b2lkIDAsIHZvaWQgMCk7XG59KCk7XG5mdW5jdGlvbiBlcnJvck5vdGlmaWNhdGlvbihlcnJvcikge1xuICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKFwiRVwiLCB2b2lkIDAsIGVycm9yKTtcbn1cbmZ1bmN0aW9uIG5leHROb3RpZmljYXRpb24odmFsdWUpIHtcbiAgcmV0dXJuIGNyZWF0ZU5vdGlmaWNhdGlvbihcIk5cIiwgdmFsdWUsIHZvaWQgMCk7XG59XG5mdW5jdGlvbiBjcmVhdGVOb3RpZmljYXRpb24oa2luZCwgdmFsdWUsIGVycm9yKSB7XG4gIHJldHVybiB7XG4gICAga2luZCxcbiAgICB2YWx1ZSxcbiAgICBlcnJvclxuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9lcnJvckNvbnRleHQuanNcbnZhciBjb250ZXh0ID0gbnVsbDtcbmZ1bmN0aW9uIGVycm9yQ29udGV4dChjYikge1xuICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHtcbiAgICB2YXIgaXNSb290ID0gIWNvbnRleHQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgY29udGV4dCA9IHsgZXJyb3JUaHJvd246IGZhbHNlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cbiAgICBjYigpO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHZhciBfYSA9IGNvbnRleHQsIGVycm9yVGhyb3duID0gX2EuZXJyb3JUaHJvd24sIGVycm9yID0gX2EuZXJyb3I7XG4gICAgICBjb250ZXh0ID0gbnVsbDtcbiAgICAgIGlmIChlcnJvclRocm93bikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY2IoKTtcbiAgfVxufVxuZnVuY3Rpb24gY2FwdHVyZUVycm9yKGVycikge1xuICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgJiYgY29udGV4dCkge1xuICAgIGNvbnRleHQuZXJyb3JUaHJvd24gPSB0cnVlO1xuICAgIGNvbnRleHQuZXJyb3IgPSBlcnI7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1N1YnNjcmliZXIuanNcbnZhciBTdWJzY3JpYmVyID0gZnVuY3Rpb24oX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhTdWJzY3JpYmVyMiwgX3N1cGVyKTtcbiAgZnVuY3Rpb24gU3Vic2NyaWJlcjIoZGVzdGluYXRpb24pIHtcbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgIGlmIChkZXN0aW5hdGlvbikge1xuICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICAgIGlmIChpc1N1YnNjcmlwdGlvbihkZXN0aW5hdGlvbikpIHtcbiAgICAgICAgZGVzdGluYXRpb24uYWRkKF90aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBFTVBUWV9PQlNFUlZFUjtcbiAgICB9XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIFN1YnNjcmliZXIyLmNyZWF0ZSA9IGZ1bmN0aW9uKG5leHQsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgIHJldHVybiBuZXcgU2FmZVN1YnNjcmliZXIobmV4dCwgZXJyb3IsIGNvbXBsZXRlKTtcbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmICh0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgaGFuZGxlU3RvcHBlZE5vdGlmaWNhdGlvbihuZXh0Tm90aWZpY2F0aW9uKHZhbHVlKSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX25leHQodmFsdWUpO1xuICAgIH1cbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKGVycm9yTm90aWZpY2F0aW9uKGVyciksIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICB0aGlzLl9lcnJvcihlcnIpO1xuICAgIH1cbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKENPTVBMRVRFX05PVElGSUNBVElPTiwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NvbXBsZXRlKCk7XG4gICAgfVxuICB9O1xuICBTdWJzY3JpYmVyMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICBfc3VwZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLmRlc3RpbmF0aW9uID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIFN1YnNjcmliZXIyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTtcbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH07XG4gIFN1YnNjcmliZXIyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gU3Vic2NyaWJlcjI7XG59KFN1YnNjcmlwdGlvbik7XG52YXIgX2JpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDtcbmZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIF9iaW5kLmNhbGwoZm4sIHRoaXNBcmcpO1xufVxudmFyIENvbnN1bWVyT2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gQ29uc3VtZXJPYnNlcnZlcjIocGFydGlhbE9ic2VydmVyKSB7XG4gICAgdGhpcy5wYXJ0aWFsT2JzZXJ2ZXIgPSBwYXJ0aWFsT2JzZXJ2ZXI7XG4gIH1cbiAgQ29uc3VtZXJPYnNlcnZlcjIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAocGFydGlhbE9ic2VydmVyLm5leHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnRpYWxPYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIENvbnN1bWVyT2JzZXJ2ZXIyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAocGFydGlhbE9ic2VydmVyLmVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyKTtcbiAgICB9XG4gIH07XG4gIENvbnN1bWVyT2JzZXJ2ZXIyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAocGFydGlhbE9ic2VydmVyLmNvbXBsZXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBDb25zdW1lck9ic2VydmVyMjtcbn0oKTtcbnZhciBTYWZlU3Vic2NyaWJlciA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoU2FmZVN1YnNjcmliZXIyLCBfc3VwZXIpO1xuICBmdW5jdGlvbiBTYWZlU3Vic2NyaWJlcjIob2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgdmFyIHBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAoaXNGdW5jdGlvbihvYnNlcnZlck9yTmV4dCkgfHwgIW9ic2VydmVyT3JOZXh0KSB7XG4gICAgICBwYXJ0aWFsT2JzZXJ2ZXIgPSB7XG4gICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0ICE9PSBudWxsICYmIG9ic2VydmVyT3JOZXh0ICE9PSB2b2lkIDAgPyBvYnNlcnZlck9yTmV4dCA6IHZvaWQgMCxcbiAgICAgICAgZXJyb3I6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6IHZvaWQgMCxcbiAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlICE9PSBudWxsICYmIGNvbXBsZXRlICE9PSB2b2lkIDAgPyBjb21wbGV0ZSA6IHZvaWQgMFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbnRleHRfMTtcbiAgICAgIGlmIChfdGhpcyAmJiBjb25maWcudXNlRGVwcmVjYXRlZE5leHRDb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHRfMSA9IE9iamVjdC5jcmVhdGUob2JzZXJ2ZXJPck5leHQpO1xuICAgICAgICBjb250ZXh0XzEudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgcGFydGlhbE9ic2VydmVyID0ge1xuICAgICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0Lm5leHQgJiYgYmluZChvYnNlcnZlck9yTmV4dC5uZXh0LCBjb250ZXh0XzEpLFxuICAgICAgICAgIGVycm9yOiBvYnNlcnZlck9yTmV4dC5lcnJvciAmJiBiaW5kKG9ic2VydmVyT3JOZXh0LmVycm9yLCBjb250ZXh0XzEpLFxuICAgICAgICAgIGNvbXBsZXRlOiBvYnNlcnZlck9yTmV4dC5jb21wbGV0ZSAmJiBiaW5kKG9ic2VydmVyT3JOZXh0LmNvbXBsZXRlLCBjb250ZXh0XzEpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIgPSBvYnNlcnZlck9yTmV4dDtcbiAgICAgIH1cbiAgICB9XG4gICAgX3RoaXMuZGVzdGluYXRpb24gPSBuZXcgQ29uc3VtZXJPYnNlcnZlcihwYXJ0aWFsT2JzZXJ2ZXIpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICByZXR1cm4gU2FmZVN1YnNjcmliZXIyO1xufShTdWJzY3JpYmVyKTtcbmZ1bmN0aW9uIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKSB7XG4gIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykge1xuICAgIGNhcHR1cmVFcnJvcihlcnJvcik7XG4gIH0gZWxzZSB7XG4gICAgcmVwb3J0VW5oYW5kbGVkRXJyb3IoZXJyb3IpO1xuICB9XG59XG5mdW5jdGlvbiBkZWZhdWx0RXJyb3JIYW5kbGVyKGVycikge1xuICB0aHJvdyBlcnI7XG59XG5mdW5jdGlvbiBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgc3Vic2NyaWJlcikge1xuICB2YXIgb25TdG9wcGVkTm90aWZpY2F0aW9uID0gY29uZmlnLm9uU3RvcHBlZE5vdGlmaWNhdGlvbjtcbiAgb25TdG9wcGVkTm90aWZpY2F0aW9uICYmIHRpbWVvdXRQcm92aWRlci5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBvblN0b3BwZWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBzdWJzY3JpYmVyKTtcbiAgfSk7XG59XG52YXIgRU1QVFlfT0JTRVJWRVIgPSB7XG4gIGNsb3NlZDogdHJ1ZSxcbiAgbmV4dDogbm9vcCxcbiAgZXJyb3I6IGRlZmF1bHRFcnJvckhhbmRsZXIsXG4gIGNvbXBsZXRlOiBub29wXG59O1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc3ltYm9sL29ic2VydmFibGUuanNcbnZhciBvYnNlcnZhYmxlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm9ic2VydmFibGUgfHwgXCJAQG9ic2VydmFibGVcIjtcbn0oKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaWRlbnRpdHkuanNcbmZ1bmN0aW9uIGlkZW50aXR5KHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3BpcGUuanNcbmZ1bmN0aW9uIHBpcGUoKSB7XG4gIHZhciBmbnMgPSBbXTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBmbnNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICByZXR1cm4gcGlwZUZyb21BcnJheShmbnMpO1xufVxuZnVuY3Rpb24gcGlwZUZyb21BcnJheShmbnMpIHtcbiAgaWYgKGZucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgaWYgKGZucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZm5zWzBdO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBwaXBlZChpbnB1dCkge1xuICAgIHJldHVybiBmbnMucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGZuKSB7XG4gICAgICByZXR1cm4gZm4ocHJldik7XG4gICAgfSwgaW5wdXQpO1xuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvT2JzZXJ2YWJsZS5qc1xudmFyIE9ic2VydmFibGUgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gT2JzZXJ2YWJsZTIoc3Vic2NyaWJlKSB7XG4gICAgaWYgKHN1YnNjcmliZSkge1xuICAgICAgdGhpcy5fc3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgIH1cbiAgfVxuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUubGlmdCA9IGZ1bmN0aW9uKG9wZXJhdG9yKSB7XG4gICAgdmFyIG9ic2VydmFibGUyID0gbmV3IE9ic2VydmFibGUyKCk7XG4gICAgb2JzZXJ2YWJsZTIuc291cmNlID0gdGhpcztcbiAgICBvYnNlcnZhYmxlMi5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgIHJldHVybiBvYnNlcnZhYmxlMjtcbiAgfTtcbiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLnN1YnNjcmliZSA9IGZ1bmN0aW9uKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBzdWJzY3JpYmVyID0gaXNTdWJzY3JpYmVyKG9ic2VydmVyT3JOZXh0KSA/IG9ic2VydmVyT3JOZXh0IDogbmV3IFNhZmVTdWJzY3JpYmVyKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpO1xuICAgIGVycm9yQ29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBfYSA9IF90aGlzLCBvcGVyYXRvciA9IF9hLm9wZXJhdG9yLCBzb3VyY2UgPSBfYS5zb3VyY2U7XG4gICAgICBzdWJzY3JpYmVyLmFkZChvcGVyYXRvciA/IG9wZXJhdG9yLmNhbGwoc3Vic2NyaWJlciwgc291cmNlKSA6IHNvdXJjZSA/IF90aGlzLl9zdWJzY3JpYmUoc3Vic2NyaWJlcikgOiBfdGhpcy5fdHJ5U3Vic2NyaWJlKHN1YnNjcmliZXIpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3Vic2NyaWJlcjtcbiAgfTtcbiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLl90cnlTdWJzY3JpYmUgPSBmdW5jdGlvbihzaW5rKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpYmUoc2luayk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzaW5rLmVycm9yKGVycik7XG4gICAgfVxuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKG5leHQsIHByb21pc2VDdG9yKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBwcm9taXNlQ3RvciA9IGdldFByb21pc2VDdG9yKHByb21pc2VDdG9yKTtcbiAgICByZXR1cm4gbmV3IHByb21pc2VDdG9yKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHN1YnNjcmliZXIgPSBuZXcgU2FmZVN1YnNjcmliZXIoe1xuICAgICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXh0KHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IHJlamVjdCxcbiAgICAgICAgY29tcGxldGU6IHJlc29sdmVcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIH0pO1xuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IHRoaXMuc291cmNlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGVbb2JzZXJ2YWJsZV0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3BlcmF0aW9ucyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBvcGVyYXRpb25zW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHJldHVybiBwaXBlRnJvbUFycmF5KG9wZXJhdGlvbnMpKHRoaXMpO1xuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUudG9Qcm9taXNlID0gZnVuY3Rpb24ocHJvbWlzZUN0b3IpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHByb21pc2VDdG9yID0gZ2V0UHJvbWlzZUN0b3IocHJvbWlzZUN0b3IpO1xuICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICBfdGhpcy5zdWJzY3JpYmUoZnVuY3Rpb24oeCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPSB4O1xuICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgT2JzZXJ2YWJsZTIuY3JlYXRlID0gZnVuY3Rpb24oc3Vic2NyaWJlKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlMihzdWJzY3JpYmUpO1xuICB9O1xuICByZXR1cm4gT2JzZXJ2YWJsZTI7XG59KCk7XG5mdW5jdGlvbiBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3Rvcikge1xuICB2YXIgX2E7XG4gIHJldHVybiAoX2EgPSBwcm9taXNlQ3RvciAhPT0gbnVsbCAmJiBwcm9taXNlQ3RvciAhPT0gdm9pZCAwID8gcHJvbWlzZUN0b3IgOiBjb25maWcuUHJvbWlzZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGlzT2JzZXJ2ZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUubmV4dCkgJiYgaXNGdW5jdGlvbih2YWx1ZS5lcnJvcikgJiYgaXNGdW5jdGlvbih2YWx1ZS5jb21wbGV0ZSk7XG59XG5mdW5jdGlvbiBpc1N1YnNjcmliZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgU3Vic2NyaWJlciB8fCBpc09ic2VydmVyKHZhbHVlKSAmJiBpc1N1YnNjcmlwdGlvbih2YWx1ZSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2xpZnQuanNcbmZ1bmN0aW9uIGhhc0xpZnQoc291cmNlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHNvdXJjZSA9PT0gbnVsbCB8fCBzb3VyY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNvdXJjZS5saWZ0KTtcbn1cbmZ1bmN0aW9uIG9wZXJhdGUoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7XG4gICAgaWYgKGhhc0xpZnQoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KGZ1bmN0aW9uKGxpZnRlZFNvdXJjZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBpbml0KGxpZnRlZFNvdXJjZSwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMuZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmFibGUgdG8gbGlmdCB1bmtub3duIE9ic2VydmFibGUgdHlwZVwiKTtcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9PcGVyYXRvclN1YnNjcmliZXIuanNcbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgb25OZXh0LCBvbkNvbXBsZXRlLCBvbkVycm9yLCBvbkZpbmFsaXplKSB7XG4gIHJldHVybiBuZXcgT3BlcmF0b3JTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBvbk5leHQsIG9uQ29tcGxldGUsIG9uRXJyb3IsIG9uRmluYWxpemUpO1xufVxudmFyIE9wZXJhdG9yU3Vic2NyaWJlciA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoT3BlcmF0b3JTdWJzY3JpYmVyMiwgX3N1cGVyKTtcbiAgZnVuY3Rpb24gT3BlcmF0b3JTdWJzY3JpYmVyMihkZXN0aW5hdGlvbiwgb25OZXh0LCBvbkNvbXBsZXRlLCBvbkVycm9yLCBvbkZpbmFsaXplLCBzaG91bGRVbnN1YnNjcmliZSkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKSB8fCB0aGlzO1xuICAgIF90aGlzLm9uRmluYWxpemUgPSBvbkZpbmFsaXplO1xuICAgIF90aGlzLnNob3VsZFVuc3Vic2NyaWJlID0gc2hvdWxkVW5zdWJzY3JpYmU7XG4gICAgX3RoaXMuX25leHQgPSBvbk5leHQgPyBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb25OZXh0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9uZXh0O1xuICAgIF90aGlzLl9lcnJvciA9IG9uRXJyb3IgPyBmdW5jdGlvbihlcnIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgIH0gY2F0Y2ggKGVycjIpIHtcbiAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyMik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfSA6IF9zdXBlci5wcm90b3R5cGUuX2Vycm9yO1xuICAgIF90aGlzLl9jb21wbGV0ZSA9IG9uQ29tcGxldGUgPyBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9uQ29tcGxldGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9jb21wbGV0ZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgT3BlcmF0b3JTdWJzY3JpYmVyMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKCF0aGlzLnNob3VsZFVuc3Vic2NyaWJlIHx8IHRoaXMuc2hvdWxkVW5zdWJzY3JpYmUoKSkge1xuICAgICAgdmFyIGNsb3NlZF8xID0gdGhpcy5jbG9zZWQ7XG4gICAgICBfc3VwZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyk7XG4gICAgICAhY2xvc2VkXzEgJiYgKChfYSA9IHRoaXMub25GaW5hbGl6ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodGhpcykpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIE9wZXJhdG9yU3Vic2NyaWJlcjI7XG59KFN1YnNjcmliZXIpO1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9PYmplY3RVbnN1YnNjcmliZWRFcnJvci5qc1xudmFyIE9iamVjdFVuc3Vic2NyaWJlZEVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIE9iamVjdFVuc3Vic2NyaWJlZEVycm9ySW1wbCgpIHtcbiAgICBfc3VwZXIodGhpcyk7XG4gICAgdGhpcy5uYW1lID0gXCJPYmplY3RVbnN1YnNjcmliZWRFcnJvclwiO1xuICAgIHRoaXMubWVzc2FnZSA9IFwib2JqZWN0IHVuc3Vic2NyaWJlZFwiO1xuICB9O1xufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9TdWJqZWN0LmpzXG52YXIgU3ViamVjdCA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoU3ViamVjdDIsIF9zdXBlcik7XG4gIGZ1bmN0aW9uIFN1YmplY3QyKCkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgX3RoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgX3RoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7XG4gICAgX3RoaXMub2JzZXJ2ZXJzID0gW107XG4gICAgX3RoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgX3RoaXMuaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBfdGhpcy50aHJvd25FcnJvciA9IG51bGw7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIFN1YmplY3QyLnByb3RvdHlwZS5saWZ0ID0gZnVuY3Rpb24ob3BlcmF0b3IpIHtcbiAgICB2YXIgc3ViamVjdCA9IG5ldyBBbm9ueW1vdXNTdWJqZWN0KHRoaXMsIHRoaXMpO1xuICAgIHN1YmplY3Qub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICByZXR1cm4gc3ViamVjdDtcbiAgfTtcbiAgU3ViamVjdDIucHJvdG90eXBlLl90aHJvd0lmQ2xvc2VkID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTtcbiAgICB9XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIGVycm9yQ29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICAgIGlmICghX3RoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIGlmICghX3RoaXMuY3VycmVudE9ic2VydmVycykge1xuICAgICAgICAgIF90aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBBcnJheS5mcm9tKF90aGlzLm9ic2VydmVycyk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKF90aGlzLmN1cnJlbnRPYnNlcnZlcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZV8xXzEpIHtcbiAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgU3ViamVjdDIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5fdGhyb3dJZkNsb3NlZCgpO1xuICAgICAgaWYgKCFfdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgX3RoaXMuaGFzRXJyb3IgPSBfdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICBfdGhpcy50aHJvd25FcnJvciA9IGVycjtcbiAgICAgICAgdmFyIG9ic2VydmVycyA9IF90aGlzLm9ic2VydmVycztcbiAgICAgICAgd2hpbGUgKG9ic2VydmVycy5sZW5ndGgpIHtcbiAgICAgICAgICBvYnNlcnZlcnMuc2hpZnQoKS5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgZXJyb3JDb250ZXh0KGZ1bmN0aW9uKCkge1xuICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICAgIGlmICghX3RoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIF90aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHZhciBvYnNlcnZlcnMgPSBfdGhpcy5vYnNlcnZlcnM7XG4gICAgICAgIHdoaWxlIChvYnNlcnZlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgb2JzZXJ2ZXJzLnNoaWZ0KCkuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBTdWJqZWN0Mi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlzU3RvcHBlZCA9IHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLm9ic2VydmVycyA9IHRoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdWJqZWN0Mi5wcm90b3R5cGUsIFwib2JzZXJ2ZWRcIiwge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgX2E7XG4gICAgICByZXR1cm4gKChfYSA9IHRoaXMub2JzZXJ2ZXJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKSA+IDA7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIFN1YmplY3QyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlLmNhbGwodGhpcywgc3Vic2NyaWJlcik7XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICB0aGlzLl9jaGVja0ZpbmFsaXplZFN0YXR1c2VzKHN1YnNjcmliZXIpO1xuICAgIHJldHVybiB0aGlzLl9pbm5lclN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgfTtcbiAgU3ViamVjdDIucHJvdG90eXBlLl9pbm5lclN1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBfYSA9IHRoaXMsIGhhc0Vycm9yID0gX2EuaGFzRXJyb3IsIGlzU3RvcHBlZCA9IF9hLmlzU3RvcHBlZCwgb2JzZXJ2ZXJzID0gX2Eub2JzZXJ2ZXJzO1xuICAgIGlmIChoYXNFcnJvciB8fCBpc1N0b3BwZWQpIHtcbiAgICAgIHJldHVybiBFTVBUWV9TVUJTQ1JJUFRJT047XG4gICAgfVxuICAgIHRoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7XG4gICAgb2JzZXJ2ZXJzLnB1c2goc3Vic2NyaWJlcik7XG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDtcbiAgICAgIGFyclJlbW92ZShvYnNlcnZlcnMsIHN1YnNjcmliZXIpO1xuICAgIH0pO1xuICB9O1xuICBTdWJqZWN0Mi5wcm90b3R5cGUuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIF9hID0gdGhpcywgaGFzRXJyb3IgPSBfYS5oYXNFcnJvciwgdGhyb3duRXJyb3IgPSBfYS50aHJvd25FcnJvciwgaXNTdG9wcGVkID0gX2EuaXNTdG9wcGVkO1xuICAgIGlmIChoYXNFcnJvcikge1xuICAgICAgc3Vic2NyaWJlci5lcnJvcih0aHJvd25FcnJvcik7XG4gICAgfSBlbHNlIGlmIChpc1N0b3BwZWQpIHtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5hc09ic2VydmFibGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JzZXJ2YWJsZTIgPSBuZXcgT2JzZXJ2YWJsZSgpO1xuICAgIG9ic2VydmFibGUyLnNvdXJjZSA9IHRoaXM7XG4gICAgcmV0dXJuIG9ic2VydmFibGUyO1xuICB9O1xuICBTdWJqZWN0Mi5jcmVhdGUgPSBmdW5jdGlvbihkZXN0aW5hdGlvbiwgc291cmNlKSB7XG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNTdWJqZWN0KGRlc3RpbmF0aW9uLCBzb3VyY2UpO1xuICB9O1xuICByZXR1cm4gU3ViamVjdDI7XG59KE9ic2VydmFibGUpO1xudmFyIEFub255bW91c1N1YmplY3QgPSBmdW5jdGlvbihfc3VwZXIpIHtcbiAgX19leHRlbmRzKEFub255bW91c1N1YmplY3QyLCBfc3VwZXIpO1xuICBmdW5jdGlvbiBBbm9ueW1vdXNTdWJqZWN0MihkZXN0aW5hdGlvbiwgc291cmNlKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICBfdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuICAgIF90aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgKF9iID0gKF9hID0gdGhpcy5kZXN0aW5hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5leHQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCB2YWx1ZSk7XG4gIH07XG4gIEFub255bW91c1N1YmplY3QyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICAgIHZhciBfYSwgX2I7XG4gICAgKF9iID0gKF9hID0gdGhpcy5kZXN0aW5hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVycm9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgZXJyKTtcbiAgfTtcbiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICAoX2IgPSAoX2EgPSB0aGlzLmRlc3RpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29tcGxldGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hKTtcbiAgfTtcbiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5zb3VyY2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdWJzY3JpYmUoc3Vic2NyaWJlcikpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IEVNUFRZX1NVQlNDUklQVElPTjtcbiAgfTtcbiAgcmV0dXJuIEFub255bW91c1N1YmplY3QyO1xufShTdWJqZWN0KTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9kYXRlVGltZXN0YW1wUHJvdmlkZXIuanNcbnZhciBkYXRlVGltZXN0YW1wUHJvdmlkZXIgPSB7XG4gIG5vdzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIChkYXRlVGltZXN0YW1wUHJvdmlkZXIuZGVsZWdhdGUgfHwgRGF0ZSkubm93KCk7XG4gIH0sXG4gIGRlbGVnYXRlOiB2b2lkIDBcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9SZXBsYXlTdWJqZWN0LmpzXG52YXIgUmVwbGF5U3ViamVjdCA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoUmVwbGF5U3ViamVjdDIsIF9zdXBlcik7XG4gIGZ1bmN0aW9uIFJlcGxheVN1YmplY3QyKF9idWZmZXJTaXplLCBfd2luZG93VGltZSwgX3RpbWVzdGFtcFByb3ZpZGVyKSB7XG4gICAgaWYgKF9idWZmZXJTaXplID09PSB2b2lkIDApIHtcbiAgICAgIF9idWZmZXJTaXplID0gSW5maW5pdHk7XG4gICAgfVxuICAgIGlmIChfd2luZG93VGltZSA9PT0gdm9pZCAwKSB7XG4gICAgICBfd2luZG93VGltZSA9IEluZmluaXR5O1xuICAgIH1cbiAgICBpZiAoX3RpbWVzdGFtcFByb3ZpZGVyID09PSB2b2lkIDApIHtcbiAgICAgIF90aW1lc3RhbXBQcm92aWRlciA9IGRhdGVUaW1lc3RhbXBQcm92aWRlcjtcbiAgICB9XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICBfdGhpcy5fYnVmZmVyU2l6ZSA9IF9idWZmZXJTaXplO1xuICAgIF90aGlzLl93aW5kb3dUaW1lID0gX3dpbmRvd1RpbWU7XG4gICAgX3RoaXMuX3RpbWVzdGFtcFByb3ZpZGVyID0gX3RpbWVzdGFtcFByb3ZpZGVyO1xuICAgIF90aGlzLl9idWZmZXIgPSBbXTtcbiAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gdHJ1ZTtcbiAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gX3dpbmRvd1RpbWUgPT09IEluZmluaXR5O1xuICAgIF90aGlzLl9idWZmZXJTaXplID0gTWF0aC5tYXgoMSwgX2J1ZmZlclNpemUpO1xuICAgIF90aGlzLl93aW5kb3dUaW1lID0gTWF0aC5tYXgoMSwgX3dpbmRvd1RpbWUpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBSZXBsYXlTdWJqZWN0Mi5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIF9hID0gdGhpcywgaXNTdG9wcGVkID0gX2EuaXNTdG9wcGVkLCBfYnVmZmVyID0gX2EuX2J1ZmZlciwgX2luZmluaXRlVGltZVdpbmRvdyA9IF9hLl9pbmZpbml0ZVRpbWVXaW5kb3csIF90aW1lc3RhbXBQcm92aWRlciA9IF9hLl90aW1lc3RhbXBQcm92aWRlciwgX3dpbmRvd1RpbWUgPSBfYS5fd2luZG93VGltZTtcbiAgICBpZiAoIWlzU3RvcHBlZCkge1xuICAgICAgX2J1ZmZlci5wdXNoKHZhbHVlKTtcbiAgICAgICFfaW5maW5pdGVUaW1lV2luZG93ICYmIF9idWZmZXIucHVzaChfdGltZXN0YW1wUHJvdmlkZXIubm93KCkgKyBfd2luZG93VGltZSk7XG4gICAgfVxuICAgIHRoaXMuX3RyaW1CdWZmZXIoKTtcbiAgICBfc3VwZXIucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gIH07XG4gIFJlcGxheVN1YmplY3QyLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICB0aGlzLl90cmltQnVmZmVyKCk7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuX2lubmVyU3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIHZhciBfYSA9IHRoaXMsIF9pbmZpbml0ZVRpbWVXaW5kb3cgPSBfYS5faW5maW5pdGVUaW1lV2luZG93LCBfYnVmZmVyID0gX2EuX2J1ZmZlcjtcbiAgICB2YXIgY29weSA9IF9idWZmZXIuc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcHkubGVuZ3RoICYmICFzdWJzY3JpYmVyLmNsb3NlZDsgaSArPSBfaW5maW5pdGVUaW1lV2luZG93ID8gMSA6IDIpIHtcbiAgICAgIHN1YnNjcmliZXIubmV4dChjb3B5W2ldKTtcbiAgICB9XG4gICAgdGhpcy5fY2hlY2tGaW5hbGl6ZWRTdGF0dXNlcyhzdWJzY3JpYmVyKTtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICB9O1xuICBSZXBsYXlTdWJqZWN0Mi5wcm90b3R5cGUuX3RyaW1CdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX2EgPSB0aGlzLCBfYnVmZmVyU2l6ZSA9IF9hLl9idWZmZXJTaXplLCBfdGltZXN0YW1wUHJvdmlkZXIgPSBfYS5fdGltZXN0YW1wUHJvdmlkZXIsIF9idWZmZXIgPSBfYS5fYnVmZmVyLCBfaW5maW5pdGVUaW1lV2luZG93ID0gX2EuX2luZmluaXRlVGltZVdpbmRvdztcbiAgICB2YXIgYWRqdXN0ZWRCdWZmZXJTaXplID0gKF9pbmZpbml0ZVRpbWVXaW5kb3cgPyAxIDogMikgKiBfYnVmZmVyU2l6ZTtcbiAgICBfYnVmZmVyU2l6ZSA8IEluZmluaXR5ICYmIGFkanVzdGVkQnVmZmVyU2l6ZSA8IF9idWZmZXIubGVuZ3RoICYmIF9idWZmZXIuc3BsaWNlKDAsIF9idWZmZXIubGVuZ3RoIC0gYWRqdXN0ZWRCdWZmZXJTaXplKTtcbiAgICBpZiAoIV9pbmZpbml0ZVRpbWVXaW5kb3cpIHtcbiAgICAgIHZhciBub3cgPSBfdGltZXN0YW1wUHJvdmlkZXIubm93KCk7XG4gICAgICB2YXIgbGFzdDIgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBfYnVmZmVyLmxlbmd0aCAmJiBfYnVmZmVyW2ldIDw9IG5vdzsgaSArPSAyKSB7XG4gICAgICAgIGxhc3QyID0gaTtcbiAgICAgIH1cbiAgICAgIGxhc3QyICYmIF9idWZmZXIuc3BsaWNlKDAsIGxhc3QyICsgMSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gUmVwbGF5U3ViamVjdDI7XG59KFN1YmplY3QpO1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FjdGlvbi5qc1xudmFyIEFjdGlvbiA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQWN0aW9uMiwgX3N1cGVyKTtcbiAgZnVuY3Rpb24gQWN0aW9uMihzY2hlZHVsZXIsIHdvcmspIHtcbiAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgfVxuICBBY3Rpb24yLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKHN0YXRlLCBkZWxheTIpIHtcbiAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHtcbiAgICAgIGRlbGF5MiA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICByZXR1cm4gQWN0aW9uMjtcbn0oU3Vic2NyaXB0aW9uKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9pbnRlcnZhbFByb3ZpZGVyLmpzXG52YXIgaW50ZXJ2YWxQcm92aWRlciA9IHtcbiAgc2V0SW50ZXJ2YWw6IGZ1bmN0aW9uKGhhbmRsZXIsIHRpbWVvdXQpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgZGVsZWdhdGUgPSBpbnRlcnZhbFByb3ZpZGVyLmRlbGVnYXRlO1xuICAgIGlmIChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuc2V0SW50ZXJ2YWwpIHtcbiAgICAgIHJldHVybiBkZWxlZ2F0ZS5zZXRJbnRlcnZhbC5hcHBseShkZWxlZ2F0ZSwgX19zcHJlYWRBcnJheShbaGFuZGxlciwgdGltZW91dF0sIF9fcmVhZChhcmdzKSkpO1xuICAgIH1cbiAgICByZXR1cm4gc2V0SW50ZXJ2YWwuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyLCB0aW1lb3V0XSwgX19yZWFkKGFyZ3MpKSk7XG4gIH0sXG4gIGNsZWFySW50ZXJ2YWw6IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgIHZhciBkZWxlZ2F0ZSA9IGludGVydmFsUHJvdmlkZXIuZGVsZWdhdGU7XG4gICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLmNsZWFySW50ZXJ2YWwpIHx8IGNsZWFySW50ZXJ2YWwpKGhhbmRsZSk7XG4gIH0sXG4gIGRlbGVnYXRlOiB2b2lkIDBcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQXN5bmNBY3Rpb24uanNcbnZhciBBc3luY0FjdGlvbiA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQXN5bmNBY3Rpb24yLCBfc3VwZXIpO1xuICBmdW5jdGlvbiBBc3luY0FjdGlvbjIoc2NoZWR1bGVyLCB3b3JrKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyLCB3b3JrKSB8fCB0aGlzO1xuICAgIF90aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICBfdGhpcy53b3JrID0gd29yaztcbiAgICBfdGhpcy5wZW5kaW5nID0gZmFsc2U7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIEFzeW5jQWN0aW9uMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbihzdGF0ZSwgZGVsYXkyKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkge1xuICAgICAgZGVsYXkyID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHZhciBpZCA9IHRoaXMuaWQ7XG4gICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyO1xuICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheTIpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZGVsYXkgPSBkZWxheTI7XG4gICAgdGhpcy5pZCA9IChfYSA9IHRoaXMuaWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMucmVxdWVzdEFzeW5jSWQoc2NoZWR1bGVyLCB0aGlzLmlkLCBkZWxheTIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBBc3luY0FjdGlvbjIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBfaWQsIGRlbGF5Mikge1xuICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkge1xuICAgICAgZGVsYXkyID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGludGVydmFsUHJvdmlkZXIuc2V0SW50ZXJ2YWwoc2NoZWR1bGVyLmZsdXNoLmJpbmQoc2NoZWR1bGVyLCB0aGlzKSwgZGVsYXkyKTtcbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uKF9zY2hlZHVsZXIsIGlkLCBkZWxheTIpIHtcbiAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHtcbiAgICAgIGRlbGF5MiA9IDA7XG4gICAgfVxuICAgIGlmIChkZWxheTIgIT0gbnVsbCAmJiB0aGlzLmRlbGF5ID09PSBkZWxheTIgJiYgdGhpcy5wZW5kaW5nID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgaW50ZXJ2YWxQcm92aWRlci5jbGVhckludGVydmFsKGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24oc3RhdGUsIGRlbGF5Mikge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcihcImV4ZWN1dGluZyBhIGNhbmNlbGxlZCBhY3Rpb25cIik7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZyA9IGZhbHNlO1xuICAgIHZhciBlcnJvciA9IHRoaXMuX2V4ZWN1dGUoc3RhdGUsIGRlbGF5Mik7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBlbmRpbmcgPT09IGZhbHNlICYmIHRoaXMuaWQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQodGhpcy5zY2hlZHVsZXIsIHRoaXMuaWQsIG51bGwpO1xuICAgIH1cbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5fZXhlY3V0ZSA9IGZ1bmN0aW9uKHN0YXRlLCBfZGVsYXkpIHtcbiAgICB2YXIgZXJyb3JlZCA9IGZhbHNlO1xuICAgIHZhciBlcnJvclZhbHVlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLndvcmsoc3RhdGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yZWQgPSB0cnVlO1xuICAgICAgZXJyb3JWYWx1ZSA9IGUgPyBlIDogbmV3IEVycm9yKFwiU2NoZWR1bGVkIGFjdGlvbiB0aHJldyBmYWxzeSBlcnJvclwiKTtcbiAgICB9XG4gICAgaWYgKGVycm9yZWQpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIHJldHVybiBlcnJvclZhbHVlO1xuICAgIH1cbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgIHZhciBfYSA9IHRoaXMsIGlkID0gX2EuaWQsIHNjaGVkdWxlciA9IF9hLnNjaGVkdWxlcjtcbiAgICAgIHZhciBhY3Rpb25zID0gc2NoZWR1bGVyLmFjdGlvbnM7XG4gICAgICB0aGlzLndvcmsgPSB0aGlzLnN0YXRlID0gdGhpcy5zY2hlZHVsZXIgPSBudWxsO1xuICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XG4gICAgICBhcnJSZW1vdmUoYWN0aW9ucywgdGhpcyk7XG4gICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVsYXkgPSBudWxsO1xuICAgICAgX3N1cGVyLnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIEFzeW5jQWN0aW9uMjtcbn0oQWN0aW9uKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1NjaGVkdWxlci5qc1xudmFyIFNjaGVkdWxlciA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBTY2hlZHVsZXIyKHNjaGVkdWxlckFjdGlvbkN0b3IsIG5vdykge1xuICAgIGlmIChub3cgPT09IHZvaWQgMCkge1xuICAgICAgbm93ID0gU2NoZWR1bGVyMi5ub3c7XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3RvciA9IHNjaGVkdWxlckFjdGlvbkN0b3I7XG4gICAgdGhpcy5ub3cgPSBub3c7XG4gIH1cbiAgU2NoZWR1bGVyMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbih3b3JrLCBkZWxheTIsIHN0YXRlKSB7XG4gICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWxheTIgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3Rvcih0aGlzLCB3b3JrKS5zY2hlZHVsZShzdGF0ZSwgZGVsYXkyKTtcbiAgfTtcbiAgU2NoZWR1bGVyMi5ub3cgPSBkYXRlVGltZXN0YW1wUHJvdmlkZXIubm93O1xuICByZXR1cm4gU2NoZWR1bGVyMjtcbn0oKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9Bc3luY1NjaGVkdWxlci5qc1xudmFyIEFzeW5jU2NoZWR1bGVyID0gZnVuY3Rpb24oX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhBc3luY1NjaGVkdWxlcjIsIF9zdXBlcik7XG4gIGZ1bmN0aW9uIEFzeW5jU2NoZWR1bGVyMihTY2hlZHVsZXJBY3Rpb24sIG5vdykge1xuICAgIGlmIChub3cgPT09IHZvaWQgMCkge1xuICAgICAgbm93ID0gU2NoZWR1bGVyLm5vdztcbiAgICB9XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgU2NoZWR1bGVyQWN0aW9uLCBub3cpIHx8IHRoaXM7XG4gICAgX3RoaXMuYWN0aW9ucyA9IFtdO1xuICAgIF90aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgQXN5bmNTY2hlZHVsZXIyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKGFjdGlvbikge1xuICAgIHZhciBhY3Rpb25zID0gdGhpcy5hY3Rpb25zO1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZXJyb3I7XG4gICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICBkbyB7XG4gICAgICBpZiAoZXJyb3IgPSBhY3Rpb24uZXhlY3V0ZShhY3Rpb24uc3RhdGUsIGFjdGlvbi5kZWxheSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKTtcbiAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpIHtcbiAgICAgICAgYWN0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG4gIHJldHVybiBBc3luY1NjaGVkdWxlcjI7XG59KFNjaGVkdWxlcik7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvYXN5bmMuanNcbnZhciBhc3luY1NjaGVkdWxlciA9IG5ldyBBc3luY1NjaGVkdWxlcihBc3luY0FjdGlvbik7XG52YXIgYXN5bmMgPSBhc3luY1NjaGVkdWxlcjtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZW1wdHkuanNcbnZhciBFTVBUWSA9IG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbn0pO1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1NjaGVkdWxlci5qc1xuZnVuY3Rpb24gaXNTY2hlZHVsZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUuc2NoZWR1bGUpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9hcmdzLmpzXG5mdW5jdGlvbiBsYXN0KGFycikge1xuICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbn1cbmZ1bmN0aW9uIHBvcFJlc3VsdFNlbGVjdG9yKGFyZ3MpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24obGFzdChhcmdzKSkgPyBhcmdzLnBvcCgpIDogdm9pZCAwO1xufVxuZnVuY3Rpb24gcG9wU2NoZWR1bGVyKGFyZ3MpIHtcbiAgcmV0dXJuIGlzU2NoZWR1bGVyKGxhc3QoYXJncykpID8gYXJncy5wb3AoKSA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHBvcE51bWJlcihhcmdzLCBkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiBsYXN0KGFyZ3MpID09PSBcIm51bWJlclwiID8gYXJncy5wb3AoKSA6IGRlZmF1bHRWYWx1ZTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNBcnJheUxpa2UuanNcbnZhciBpc0FycmF5TGlrZSA9IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHggJiYgdHlwZW9mIHgubGVuZ3RoID09PSBcIm51bWJlclwiICYmIHR5cGVvZiB4ICE9PSBcImZ1bmN0aW9uXCI7XG59O1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1Byb21pc2UuanNcbmZ1bmN0aW9uIGlzUHJvbWlzZSh2YWx1ZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmFsdWUudGhlbik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzSW50ZXJvcE9ic2VydmFibGUuanNcbmZ1bmN0aW9uIGlzSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24oaW5wdXRbb2JzZXJ2YWJsZV0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0FzeW5jSXRlcmFibGUuanNcbmZ1bmN0aW9uIGlzQXN5bmNJdGVyYWJsZShvYmopIHtcbiAgcmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yICYmIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3Rocm93VW5vYnNlcnZhYmxlRXJyb3IuanNcbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRPYnNlcnZhYmxlVHlwZUVycm9yKGlucHV0KSB7XG4gIHJldHVybiBuZXcgVHlwZUVycm9yKFwiWW91IHByb3ZpZGVkIFwiICsgKGlucHV0ICE9PSBudWxsICYmIHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiA/IFwiYW4gaW52YWxpZCBvYmplY3RcIiA6IFwiJ1wiICsgaW5wdXQgKyBcIidcIikgKyBcIiB3aGVyZSBhIHN0cmVhbSB3YXMgZXhwZWN0ZWQuIFlvdSBjYW4gcHJvdmlkZSBhbiBPYnNlcnZhYmxlLCBQcm9taXNlLCBSZWFkYWJsZVN0cmVhbSwgQXJyYXksIEFzeW5jSXRlcmFibGUsIG9yIEl0ZXJhYmxlLlwiKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3N5bWJvbC9pdGVyYXRvci5qc1xuZnVuY3Rpb24gZ2V0U3ltYm9sSXRlcmF0b3IoKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcImZ1bmN0aW9uXCIgfHwgIVN5bWJvbC5pdGVyYXRvcikge1xuICAgIHJldHVybiBcIkBAaXRlcmF0b3JcIjtcbiAgfVxuICByZXR1cm4gU3ltYm9sLml0ZXJhdG9yO1xufVxudmFyIGl0ZXJhdG9yID0gZ2V0U3ltYm9sSXRlcmF0b3IoKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNJdGVyYWJsZS5qc1xuZnVuY3Rpb24gaXNJdGVyYWJsZShpbnB1dCkge1xuICByZXR1cm4gaXNGdW5jdGlvbihpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5wdXRbaXRlcmF0b3JdKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNSZWFkYWJsZVN0cmVhbUxpa2UuanNcbmZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IocmVhZGFibGVTdHJlYW0pIHtcbiAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiByZWFkYWJsZVN0cmVhbUxpa2VUb0FzeW5jR2VuZXJhdG9yXzEoKSB7XG4gICAgdmFyIHJlYWRlciwgX2EsIHZhbHVlLCBkb25lO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfYikge1xuICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2IudHJ5cy5wdXNoKFsxLCAsIDksIDEwXSk7XG4gICAgICAgICAgX2IubGFiZWwgPSAyO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKGZhbHNlKSByZXR1cm4gWzMsIDhdO1xuICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdChyZWFkZXIucmVhZCgpKV07XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfYSA9IF9iLnNlbnQoKSwgdmFsdWUgPSBfYS52YWx1ZSwgZG9uZSA9IF9hLmRvbmU7XG4gICAgICAgICAgaWYgKCFkb25lKSByZXR1cm4gWzMsIDVdO1xuICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdCh2b2lkIDApXTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiBbMiwgX2Iuc2VudCgpXTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdCh2YWx1ZSldO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgcmV0dXJuIFs0LCBfYi5zZW50KCldO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgIHJldHVybiBbMywgMl07XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gWzMsIDEwXTtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgICAgIHJldHVybiBbN107XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgcmV0dXJuIFsyXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtTGlrZShvYmopIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqLmdldFJlYWRlcik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2lubmVyRnJvbS5qc1xuZnVuY3Rpb24gaW5uZXJGcm9tKGlucHV0KSB7XG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICBpZiAoaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkpIHtcbiAgICAgIHJldHVybiBmcm9tSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheUxpa2UoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZShpbnB1dCk7XG4gICAgfVxuICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIGZyb21Bc3luY0l0ZXJhYmxlKGlucHV0KTtcbiAgICB9XG4gICAgaWYgKGlzSXRlcmFibGUoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gZnJvbUl0ZXJhYmxlKGlucHV0KTtcbiAgICB9XG4gICAgaWYgKGlzUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIGZyb21SZWFkYWJsZVN0cmVhbUxpa2UoaW5wdXQpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCk7XG59XG5mdW5jdGlvbiBmcm9tSW50ZXJvcE9ic2VydmFibGUob2JqKSB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIG9icyA9IG9ialtvYnNlcnZhYmxlXSgpO1xuICAgIGlmIChpc0Z1bmN0aW9uKG9icy5zdWJzY3JpYmUpKSB7XG4gICAgICByZXR1cm4gb2JzLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb3ZpZGVkIG9iamVjdCBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IFN5bWJvbC5vYnNlcnZhYmxlXCIpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UoYXJyYXkpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aCAmJiAhc3Vic2NyaWJlci5jbG9zZWQ7IGkrKykge1xuICAgICAgc3Vic2NyaWJlci5uZXh0KGFycmF5W2ldKTtcbiAgICB9XG4gICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21Qcm9taXNlKHByb21pc2UpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZXJyKTtcbiAgICB9KS50aGVuKG51bGwsIHJlcG9ydFVuaGFuZGxlZEVycm9yKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBmcm9tSXRlcmFibGUoaXRlcmFibGUpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgZV8xLCBfYTtcbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgaXRlcmFibGVfMSA9IF9fdmFsdWVzKGl0ZXJhYmxlKSwgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCk7ICFpdGVyYWJsZV8xXzEuZG9uZTsgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gaXRlcmFibGVfMV8xLnZhbHVlO1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzFfMSkge1xuICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGl0ZXJhYmxlXzFfMSAmJiAhaXRlcmFibGVfMV8xLmRvbmUgJiYgKF9hID0gaXRlcmFibGVfMS5yZXR1cm4pKSBfYS5jYWxsKGl0ZXJhYmxlXzEpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZnJvbUFzeW5jSXRlcmFibGUoYXN5bmNJdGVyYWJsZSkge1xuICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHByb2Nlc3MoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgIH0pO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21SZWFkYWJsZVN0cmVhbUxpa2UocmVhZGFibGVTdHJlYW0pIHtcbiAgcmV0dXJuIGZyb21Bc3luY0l0ZXJhYmxlKHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IocmVhZGFibGVTdHJlYW0pKTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3MoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikge1xuICB2YXIgYXN5bmNJdGVyYWJsZV8xLCBhc3luY0l0ZXJhYmxlXzFfMTtcbiAgdmFyIGVfMiwgX2E7XG4gIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSwgZV8yXzE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9iKSB7XG4gICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDExXSk7XG4gICAgICAgICAgYXN5bmNJdGVyYWJsZV8xID0gX19hc3luY1ZhbHVlcyhhc3luY0l0ZXJhYmxlKTtcbiAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gWzQsIGFzeW5jSXRlcmFibGVfMS5uZXh0KCldO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKCEoYXN5bmNJdGVyYWJsZV8xXzEgPSBfYi5zZW50KCksICFhc3luY0l0ZXJhYmxlXzFfMS5kb25lKSkgcmV0dXJuIFszLCA0XTtcbiAgICAgICAgICB2YWx1ZSA9IGFzeW5jSXRlcmFibGVfMV8xLnZhbHVlO1xuICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gWzJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByZXR1cm4gWzMsIDFdO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIFszLCAxMV07XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBlXzJfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICAgIHJldHVybiBbMywgMTFdO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2IudHJ5cy5wdXNoKFs2LCAsIDksIDEwXSk7XG4gICAgICAgICAgaWYgKCEoYXN5bmNJdGVyYWJsZV8xXzEgJiYgIWFzeW5jSXRlcmFibGVfMV8xLmRvbmUgJiYgKF9hID0gYXN5bmNJdGVyYWJsZV8xLnJldHVybikpKSByZXR1cm4gWzMsIDhdO1xuICAgICAgICAgIHJldHVybiBbNCwgX2EuY2FsbChhc3luY0l0ZXJhYmxlXzEpXTtcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICBfYi5sYWJlbCA9IDg7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gWzMsIDEwXTtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjtcbiAgICAgICAgICByZXR1cm4gWzddO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIHJldHVybiBbN107XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybiBbMl07XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9leGVjdXRlU2NoZWR1bGUuanNcbmZ1bmN0aW9uIGV4ZWN1dGVTY2hlZHVsZShwYXJlbnRTdWJzY3JpcHRpb24sIHNjaGVkdWxlciwgd29yaywgZGVsYXkyLCByZXBlYXQpIHtcbiAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7XG4gICAgZGVsYXkyID0gMDtcbiAgfVxuICBpZiAocmVwZWF0ID09PSB2b2lkIDApIHtcbiAgICByZXBlYXQgPSBmYWxzZTtcbiAgfVxuICB2YXIgc2NoZWR1bGVTdWJzY3JpcHRpb24gPSBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7XG4gICAgd29yaygpO1xuICAgIGlmIChyZXBlYXQpIHtcbiAgICAgIHBhcmVudFN1YnNjcmlwdGlvbi5hZGQodGhpcy5zY2hlZHVsZShudWxsLCBkZWxheTIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfSwgZGVsYXkyKTtcbiAgcGFyZW50U3Vic2NyaXB0aW9uLmFkZChzY2hlZHVsZVN1YnNjcmlwdGlvbik7XG4gIGlmICghcmVwZWF0KSB7XG4gICAgcmV0dXJuIHNjaGVkdWxlU3Vic2NyaXB0aW9uO1xuICB9XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvb2JzZXJ2ZU9uLmpzXG5mdW5jdGlvbiBvYnNlcnZlT24oc2NoZWR1bGVyLCBkZWxheTIpIHtcbiAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7XG4gICAgZGVsYXkyID0gMDtcbiAgfVxuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0sIGRlbGF5Mik7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LCBkZWxheTIpO1xuICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgcmV0dXJuIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgICAgfSwgZGVsYXkyKTtcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N1YnNjcmliZU9uLmpzXG5mdW5jdGlvbiBzdWJzY3JpYmVPbihzY2hlZHVsZXIsIGRlbGF5Mikge1xuICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHtcbiAgICBkZWxheTIgPSAwO1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHN1YnNjcmliZXIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIH0sIGRlbGF5MikpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZU9ic2VydmFibGUuanNcbmZ1bmN0aW9uIHNjaGVkdWxlT2JzZXJ2YWJsZShpbnB1dCwgc2NoZWR1bGVyKSB7XG4gIHJldHVybiBpbm5lckZyb20oaW5wdXQpLnBpcGUoc3Vic2NyaWJlT24oc2NoZWR1bGVyKSwgb2JzZXJ2ZU9uKHNjaGVkdWxlcikpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlUHJvbWlzZS5qc1xuZnVuY3Rpb24gc2NoZWR1bGVQcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpIHtcbiAgcmV0dXJuIGlubmVyRnJvbShpbnB1dCkucGlwZShzdWJzY3JpYmVPbihzY2hlZHVsZXIpLCBvYnNlcnZlT24oc2NoZWR1bGVyKSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVBcnJheS5qc1xuZnVuY3Rpb24gc2NoZWR1bGVBcnJheShpbnB1dCwgc2NoZWR1bGVyKSB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGkgPSAwO1xuICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoaSA9PT0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnNjcmliZXIubmV4dChpbnB1dFtpKytdKTtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUl0ZXJhYmxlLmpzXG5mdW5jdGlvbiBzY2hlZHVsZUl0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgaXRlcmF0b3IyO1xuICAgIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgaXRlcmF0b3IyID0gaW5wdXRbaXRlcmF0b3JdKCk7XG4gICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgIHZhciBkb25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIF9hID0gaXRlcmF0b3IyLm5leHQoKSwgdmFsdWUgPSBfYS52YWx1ZSwgZG9uZSA9IF9hLmRvbmU7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSwgMCwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oaXRlcmF0b3IyID09PSBudWxsIHx8IGl0ZXJhdG9yMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogaXRlcmF0b3IyLnJldHVybikgJiYgaXRlcmF0b3IyLnJldHVybigpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlQXN5bmNJdGVyYWJsZS5qc1xuZnVuY3Rpb24gc2NoZWR1bGVBc3luY0l0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkl0ZXJhYmxlIGNhbm5vdCBiZSBudWxsXCIpO1xuICB9XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaXRlcmF0b3IyID0gaW5wdXRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaXRlcmF0b3IyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgMCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlLmpzXG5mdW5jdGlvbiBzY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCwgc2NoZWR1bGVyKSB7XG4gIHJldHVybiBzY2hlZHVsZUFzeW5jSXRlcmFibGUocmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvcihpbnB1dCksIHNjaGVkdWxlcik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVkLmpzXG5mdW5jdGlvbiBzY2hlZHVsZWQoaW5wdXQsIHNjaGVkdWxlcikge1xuICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgIGlmIChpc0ludGVyb3BPYnNlcnZhYmxlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlT2JzZXJ2YWJsZShpbnB1dCwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXlMaWtlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcik7XG4gICAgfVxuICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVQcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpO1xuICAgIH1cbiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQXN5bmNJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGlzSXRlcmFibGUoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGlzUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0LCBzY2hlZHVsZXIpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb20uanNcbmZ1bmN0aW9uIGZyb20oaW5wdXQsIHNjaGVkdWxlcikge1xuICByZXR1cm4gc2NoZWR1bGVyID8gc2NoZWR1bGVkKGlucHV0LCBzY2hlZHVsZXIpIDogaW5uZXJGcm9tKGlucHV0KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvb2YuanNcbmZ1bmN0aW9uIG9mKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKGFyZ3MpO1xuICByZXR1cm4gZnJvbShhcmdzLCBzY2hlZHVsZXIpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9FbXB0eUVycm9yLmpzXG52YXIgRW1wdHlFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiBFbXB0eUVycm9ySW1wbCgpIHtcbiAgICBfc3VwZXIodGhpcyk7XG4gICAgdGhpcy5uYW1lID0gXCJFbXB0eUVycm9yXCI7XG4gICAgdGhpcy5tZXNzYWdlID0gXCJubyBlbGVtZW50cyBpbiBzZXF1ZW5jZVwiO1xuICB9O1xufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9sYXN0VmFsdWVGcm9tLmpzXG5mdW5jdGlvbiBsYXN0VmFsdWVGcm9tKHNvdXJjZSwgY29uZmlnMikge1xuICB2YXIgaGFzQ29uZmlnID0gdHlwZW9mIGNvbmZpZzIgPT09IFwib2JqZWN0XCI7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgX2hhc1ZhbHVlID0gZmFsc2U7XG4gICAgdmFyIF92YWx1ZTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF92YWx1ZSA9IHZhbHVlO1xuICAgICAgICBfaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChfaGFzVmFsdWUpIHtcbiAgICAgICAgICByZXNvbHZlKF92YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQ29uZmlnKSB7XG4gICAgICAgICAgcmVzb2x2ZShjb25maWcyLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFbXB0eUVycm9yKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvZmlyc3RWYWx1ZUZyb20uanNcbmZ1bmN0aW9uIGZpcnN0VmFsdWVGcm9tKHNvdXJjZSwgY29uZmlnMikge1xuICB2YXIgaGFzQ29uZmlnID0gdHlwZW9mIGNvbmZpZzIgPT09IFwib2JqZWN0XCI7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgc3Vic2NyaWJlciA9IG5ldyBTYWZlU3Vic2NyaWJlcih7XG4gICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChoYXNDb25maWcpIHtcbiAgICAgICAgICByZXNvbHZlKGNvbmZpZzIuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QobmV3IEVtcHR5RXJyb3IoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNEYXRlLmpzXG5mdW5jdGlvbiBpc1ZhbGlkRGF0ZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2YWx1ZSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWFwLmpzXG5mdW5jdGlvbiBtYXAocHJvamVjdCwgdGhpc0FyZykge1xuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBzdWJzY3JpYmVyLm5leHQocHJvamVjdC5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCsrKSk7XG4gICAgfSkpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvbWFwT25lT3JNYW55QXJncy5qc1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gY2FsbE9yQXBwbHkoZm4sIGFyZ3MpIHtcbiAgcmV0dXJuIGlzQXJyYXkoYXJncykgPyBmbi5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhcmdzKSkpIDogZm4oYXJncyk7XG59XG5mdW5jdGlvbiBtYXBPbmVPck1hbnlBcmdzKGZuKSB7XG4gIHJldHVybiBtYXAoZnVuY3Rpb24oYXJncykge1xuICAgIHJldHVybiBjYWxsT3JBcHBseShmbiwgYXJncyk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9hcmdzQXJnQXJyYXlPck9iamVjdC5qc1xudmFyIGlzQXJyYXkyID0gQXJyYXkuaXNBcnJheTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG52YXIgZ2V0S2V5cyA9IE9iamVjdC5rZXlzO1xuZnVuY3Rpb24gYXJnc0FyZ0FycmF5T3JPYmplY3QoYXJncykge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICB2YXIgZmlyc3RfMSA9IGFyZ3NbMF07XG4gICAgaWYgKGlzQXJyYXkyKGZpcnN0XzEpKSB7XG4gICAgICByZXR1cm4geyBhcmdzOiBmaXJzdF8xLCBrZXlzOiBudWxsIH07XG4gICAgfVxuICAgIGlmIChpc1BPSk8oZmlyc3RfMSkpIHtcbiAgICAgIHZhciBrZXlzID0gZ2V0S2V5cyhmaXJzdF8xKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFyZ3M6IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIHJldHVybiBmaXJzdF8xW2tleV07XG4gICAgICAgIH0pLFxuICAgICAgICBrZXlzXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBhcmdzLCBrZXlzOiBudWxsIH07XG59XG5mdW5jdGlvbiBpc1BPSk8ob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiBnZXRQcm90b3R5cGVPZihvYmopID09PSBvYmplY3RQcm90bztcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvY3JlYXRlT2JqZWN0LmpzXG5mdW5jdGlvbiBjcmVhdGVPYmplY3Qoa2V5cywgdmFsdWVzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbihyZXN1bHQsIGtleSwgaSkge1xuICAgIHJldHVybiByZXN1bHRba2V5XSA9IHZhbHVlc1tpXSwgcmVzdWx0O1xuICB9LCB7fSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2NvbWJpbmVMYXRlc3QuanNcbmZ1bmN0aW9uIGNvbWJpbmVMYXRlc3QoKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG4gIHZhciBzY2hlZHVsZXIgPSBwb3BTY2hlZHVsZXIoYXJncyk7XG4gIHZhciByZXN1bHRTZWxlY3RvciA9IHBvcFJlc3VsdFNlbGVjdG9yKGFyZ3MpO1xuICB2YXIgX2EgPSBhcmdzQXJnQXJyYXlPck9iamVjdChhcmdzKSwgb2JzZXJ2YWJsZXMgPSBfYS5hcmdzLCBrZXlzID0gX2Eua2V5cztcbiAgaWYgKG9ic2VydmFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmcm9tKFtdLCBzY2hlZHVsZXIpO1xuICB9XG4gIHZhciByZXN1bHQgPSBuZXcgT2JzZXJ2YWJsZShjb21iaW5lTGF0ZXN0SW5pdChvYnNlcnZhYmxlcywgc2NoZWR1bGVyLCBrZXlzID8gZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU9iamVjdChrZXlzLCB2YWx1ZXMpO1xuICB9IDogaWRlbnRpdHkpKTtcbiAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0LnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpIDogcmVzdWx0O1xufVxuZnVuY3Rpb24gY29tYmluZUxhdGVzdEluaXQob2JzZXJ2YWJsZXMsIHNjaGVkdWxlciwgdmFsdWVUcmFuc2Zvcm0pIHtcbiAgaWYgKHZhbHVlVHJhbnNmb3JtID09PSB2b2lkIDApIHtcbiAgICB2YWx1ZVRyYW5zZm9ybSA9IGlkZW50aXR5O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgbWF5YmVTY2hlZHVsZShzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGxlbmd0aCA9IG9ic2VydmFibGVzLmxlbmd0aDtcbiAgICAgIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICAgIHZhciBhY3RpdmUgPSBsZW5ndGg7XG4gICAgICB2YXIgcmVtYWluaW5nRmlyc3RWYWx1ZXMgPSBsZW5ndGg7XG4gICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uKGkyKSB7XG4gICAgICAgIG1heWJlU2NoZWR1bGUoc2NoZWR1bGVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgc291cmNlID0gZnJvbShvYnNlcnZhYmxlc1tpMl0sIHNjaGVkdWxlcik7XG4gICAgICAgICAgdmFyIGhhc0ZpcnN0VmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWVzW2kyXSA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFoYXNGaXJzdFZhbHVlKSB7XG4gICAgICAgICAgICAgIGhhc0ZpcnN0VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICByZW1haW5pbmdGaXJzdFZhbHVlcy0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZW1haW5pbmdGaXJzdFZhbHVlcykge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWVUcmFuc2Zvcm0odmFsdWVzLnNsaWNlKCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICghLS1hY3RpdmUpIHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSwgc3Vic2NyaWJlcik7XG4gICAgICB9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBfbG9vcF8xKGkpO1xuICAgICAgfVxuICAgIH0sIHN1YnNjcmliZXIpO1xuICB9O1xufVxuZnVuY3Rpb24gbWF5YmVTY2hlZHVsZShzY2hlZHVsZXIsIGV4ZWN1dGUsIHN1YnNjcmlwdGlvbikge1xuICBpZiAoc2NoZWR1bGVyKSB7XG4gICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmlwdGlvbiwgc2NoZWR1bGVyLCBleGVjdXRlKTtcbiAgfSBlbHNlIHtcbiAgICBleGVjdXRlKCk7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUludGVybmFscy5qc1xuZnVuY3Rpb24gbWVyZ2VJbnRlcm5hbHMoc291cmNlLCBzdWJzY3JpYmVyLCBwcm9qZWN0LCBjb25jdXJyZW50LCBvbkJlZm9yZU5leHQsIGV4cGFuZCwgaW5uZXJTdWJTY2hlZHVsZXIsIGFkZGl0aW9uYWxGaW5hbGl6ZXIpIHtcbiAgdmFyIGJ1ZmZlciA9IFtdO1xuICB2YXIgYWN0aXZlID0gMDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGlzQ29tcGxldGUgPSBmYWxzZTtcbiAgdmFyIGNoZWNrQ29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoaXNDb21wbGV0ZSAmJiAhYnVmZmVyLmxlbmd0aCAmJiAhYWN0aXZlKSB7XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfVxuICB9O1xuICB2YXIgb3V0ZXJOZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gYWN0aXZlIDwgY29uY3VycmVudCA/IGRvSW5uZXJTdWIodmFsdWUpIDogYnVmZmVyLnB1c2godmFsdWUpO1xuICB9O1xuICB2YXIgZG9Jbm5lclN1YiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgZXhwYW5kICYmIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgYWN0aXZlKys7XG4gICAgdmFyIGlubmVyQ29tcGxldGUgPSBmYWxzZTtcbiAgICBpbm5lckZyb20ocHJvamVjdCh2YWx1ZSwgaW5kZXgrKykpLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oaW5uZXJWYWx1ZSkge1xuICAgICAgb25CZWZvcmVOZXh0ID09PSBudWxsIHx8IG9uQmVmb3JlTmV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CZWZvcmVOZXh0KGlubmVyVmFsdWUpO1xuICAgICAgaWYgKGV4cGFuZCkge1xuICAgICAgICBvdXRlck5leHQoaW5uZXJWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoaW5uZXJWYWx1ZSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICBpbm5lckNvbXBsZXRlID0gdHJ1ZTtcbiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGlubmVyQ29tcGxldGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhY3RpdmUtLTtcbiAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGJ1ZmZlcmVkVmFsdWUgPSBidWZmZXIuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChpbm5lclN1YlNjaGVkdWxlcikge1xuICAgICAgICAgICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgaW5uZXJTdWJTY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkb0lubmVyU3ViKGJ1ZmZlcmVkVmFsdWUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRvSW5uZXJTdWIoYnVmZmVyZWRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCAmJiBhY3RpdmUgPCBjb25jdXJyZW50KSB7XG4gICAgICAgICAgICBfbG9vcF8xKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoZWNrQ29tcGxldGUoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpO1xuICB9O1xuICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBvdXRlck5leHQsIGZ1bmN0aW9uKCkge1xuICAgIGlzQ29tcGxldGUgPSB0cnVlO1xuICAgIGNoZWNrQ29tcGxldGUoKTtcbiAgfSkpO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgYWRkaXRpb25hbEZpbmFsaXplciA9PT0gbnVsbCB8fCBhZGRpdGlvbmFsRmluYWxpemVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZGRpdGlvbmFsRmluYWxpemVyKCk7XG4gIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VNYXAuanNcbmZ1bmN0aW9uIG1lcmdlTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50KSB7XG4gIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHtcbiAgICBjb25jdXJyZW50ID0gSW5maW5pdHk7XG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24ocmVzdWx0U2VsZWN0b3IpKSB7XG4gICAgcmV0dXJuIG1lcmdlTWFwKGZ1bmN0aW9uKGEsIGkpIHtcbiAgICAgIHJldHVybiBtYXAoZnVuY3Rpb24oYiwgaWkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yKGEsIGIsIGksIGlpKTtcbiAgICAgIH0pKGlubmVyRnJvbShwcm9qZWN0KGEsIGkpKSk7XG4gICAgfSwgY29uY3VycmVudCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSBcIm51bWJlclwiKSB7XG4gICAgY29uY3VycmVudCA9IHJlc3VsdFNlbGVjdG9yO1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBtZXJnZUludGVybmFscyhzb3VyY2UsIHN1YnNjcmliZXIsIHByb2plY3QsIGNvbmN1cnJlbnQpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUFsbC5qc1xuZnVuY3Rpb24gbWVyZ2VBbGwoY29uY3VycmVudCkge1xuICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7XG4gICAgY29uY3VycmVudCA9IEluZmluaXR5O1xuICB9XG4gIHJldHVybiBtZXJnZU1hcChpZGVudGl0eSwgY29uY3VycmVudCk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0QWxsLmpzXG5mdW5jdGlvbiBjb25jYXRBbGwoKSB7XG4gIHJldHVybiBtZXJnZUFsbCgxKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvY29uY2F0LmpzXG5mdW5jdGlvbiBjb25jYXQoKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG4gIHJldHVybiBjb25jYXRBbGwoKShmcm9tKGFyZ3MsIHBvcFNjaGVkdWxlcihhcmdzKSkpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9kZWZlci5qc1xuZnVuY3Rpb24gZGVmZXIob2JzZXJ2YWJsZUZhY3RvcnkpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICBpbm5lckZyb20ob2JzZXJ2YWJsZUZhY3RvcnkoKSkuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZm9ya0pvaW4uanNcbmZ1bmN0aW9uIGZvcmtKb2luKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBwb3BSZXN1bHRTZWxlY3RvcihhcmdzKTtcbiAgdmFyIF9hID0gYXJnc0FyZ0FycmF5T3JPYmplY3QoYXJncyksIHNvdXJjZXMgPSBfYS5hcmdzLCBrZXlzID0gX2Eua2V5cztcbiAgdmFyIHJlc3VsdCA9IG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHZhbHVlcyA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgIHZhciByZW1haW5pbmdDb21wbGV0aW9ucyA9IGxlbmd0aDtcbiAgICB2YXIgcmVtYWluaW5nRW1pc3Npb25zID0gbGVuZ3RoO1xuICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24oc291cmNlSW5kZXgyKSB7XG4gICAgICB2YXIgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgIGlubmVyRnJvbShzb3VyY2VzW3NvdXJjZUluZGV4Ml0pLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKCFoYXNWYWx1ZSkge1xuICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICByZW1haW5pbmdFbWlzc2lvbnMtLTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXNbc291cmNlSW5kZXgyXSA9IHZhbHVlO1xuICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByZW1haW5pbmdDb21wbGV0aW9ucy0tO1xuICAgICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCFyZW1haW5pbmdDb21wbGV0aW9ucyB8fCAhaGFzVmFsdWUpIHtcbiAgICAgICAgICBpZiAoIXJlbWFpbmluZ0VtaXNzaW9ucykge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGtleXMgPyBjcmVhdGVPYmplY3Qoa2V5cywgdmFsdWVzKSA6IHZhbHVlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH07XG4gICAgZm9yICh2YXIgc291cmNlSW5kZXggPSAwOyBzb3VyY2VJbmRleCA8IGxlbmd0aDsgc291cmNlSW5kZXgrKykge1xuICAgICAgX2xvb3BfMShzb3VyY2VJbmRleCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0LnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpIDogcmVzdWx0O1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tRXZlbnQuanNcbnZhciBub2RlRXZlbnRFbWl0dGVyTWV0aG9kcyA9IFtcImFkZExpc3RlbmVyXCIsIFwicmVtb3ZlTGlzdGVuZXJcIl07XG52YXIgZXZlbnRUYXJnZXRNZXRob2RzID0gW1wiYWRkRXZlbnRMaXN0ZW5lclwiLCBcInJlbW92ZUV2ZW50TGlzdGVuZXJcIl07XG52YXIganF1ZXJ5TWV0aG9kcyA9IFtcIm9uXCIsIFwib2ZmXCJdO1xuZnVuY3Rpb24gZnJvbUV2ZW50KHRhcmdldCwgZXZlbnROYW1lLCBvcHRpb25zLCByZXN1bHRTZWxlY3Rvcikge1xuICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgIHJlc3VsdFNlbGVjdG9yID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0gdm9pZCAwO1xuICB9XG4gIGlmIChyZXN1bHRTZWxlY3Rvcikge1xuICAgIHJldHVybiBmcm9tRXZlbnQodGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpLnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpO1xuICB9XG4gIHZhciBfYSA9IF9fcmVhZChpc0V2ZW50VGFyZ2V0KHRhcmdldCkgPyBldmVudFRhcmdldE1ldGhvZHMubWFwKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oaGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRhcmdldFttZXRob2ROYW1lXShldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIH07XG4gIH0pIDogaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSA/IG5vZGVFdmVudEVtaXR0ZXJNZXRob2RzLm1hcCh0b0NvbW1vbkhhbmRsZXJSZWdpc3RyeSh0YXJnZXQsIGV2ZW50TmFtZSkpIDogaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpID8ganF1ZXJ5TWV0aG9kcy5tYXAodG9Db21tb25IYW5kbGVyUmVnaXN0cnkodGFyZ2V0LCBldmVudE5hbWUpKSA6IFtdLCAyKSwgYWRkID0gX2FbMF0sIHJlbW92ZSA9IF9hWzFdO1xuICBpZiAoIWFkZCkge1xuICAgIGlmIChpc0FycmF5TGlrZSh0YXJnZXQpKSB7XG4gICAgICByZXR1cm4gbWVyZ2VNYXAoZnVuY3Rpb24oc3ViVGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBmcm9tRXZlbnQoc3ViVGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpO1xuICAgICAgfSkoaW5uZXJGcm9tKHRhcmdldCkpO1xuICAgIH1cbiAgfVxuICBpZiAoIWFkZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGV2ZW50IHRhcmdldFwiKTtcbiAgfVxuICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1YnNjcmliZXIubmV4dCgxIDwgYXJncy5sZW5ndGggPyBhcmdzIDogYXJnc1swXSk7XG4gICAgfTtcbiAgICBhZGQoaGFuZGxlcik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJlbW92ZShoYW5kbGVyKTtcbiAgICB9O1xuICB9KTtcbn1cbmZ1bmN0aW9uIHRvQ29tbW9uSGFuZGxlclJlZ2lzdHJ5KHRhcmdldCwgZXZlbnROYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHRhcmdldC5hZGRMaXN0ZW5lcikgJiYgaXNGdW5jdGlvbih0YXJnZXQucmVtb3ZlTGlzdGVuZXIpO1xufVxuZnVuY3Rpb24gaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24odGFyZ2V0Lm9uKSAmJiBpc0Z1bmN0aW9uKHRhcmdldC5vZmYpO1xufVxuZnVuY3Rpb24gaXNFdmVudFRhcmdldCh0YXJnZXQpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24odGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpICYmIGlzRnVuY3Rpb24odGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS90aW1lci5qc1xuZnVuY3Rpb24gdGltZXIoZHVlVGltZSwgaW50ZXJ2YWxPclNjaGVkdWxlciwgc2NoZWR1bGVyKSB7XG4gIGlmIChkdWVUaW1lID09PSB2b2lkIDApIHtcbiAgICBkdWVUaW1lID0gMDtcbiAgfVxuICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHtcbiAgICBzY2hlZHVsZXIgPSBhc3luYztcbiAgfVxuICB2YXIgaW50ZXJ2YWxEdXJhdGlvbiA9IC0xO1xuICBpZiAoaW50ZXJ2YWxPclNjaGVkdWxlciAhPSBudWxsKSB7XG4gICAgaWYgKGlzU2NoZWR1bGVyKGludGVydmFsT3JTY2hlZHVsZXIpKSB7XG4gICAgICBzY2hlZHVsZXIgPSBpbnRlcnZhbE9yU2NoZWR1bGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbER1cmF0aW9uID0gaW50ZXJ2YWxPclNjaGVkdWxlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgZHVlID0gaXNWYWxpZERhdGUoZHVlVGltZSkgPyArZHVlVGltZSAtIHNjaGVkdWxlci5ub3coKSA6IGR1ZVRpbWU7XG4gICAgaWYgKGR1ZSA8IDApIHtcbiAgICAgIGR1ZSA9IDA7XG4gICAgfVxuICAgIHZhciBuID0gMDtcbiAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQobisrKTtcbiAgICAgICAgaWYgKDAgPD0gaW50ZXJ2YWxEdXJhdGlvbikge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGUodm9pZCAwLCBpbnRlcnZhbER1cmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBkdWUpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvbWVyZ2UuanNcbmZ1bmN0aW9uIG1lcmdlKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKGFyZ3MpO1xuICB2YXIgY29uY3VycmVudCA9IHBvcE51bWJlcihhcmdzLCBJbmZpbml0eSk7XG4gIHZhciBzb3VyY2VzID0gYXJncztcbiAgcmV0dXJuICFzb3VyY2VzLmxlbmd0aCA/IEVNUFRZIDogc291cmNlcy5sZW5ndGggPT09IDEgPyBpbm5lckZyb20oc291cmNlc1swXSkgOiBtZXJnZUFsbChjb25jdXJyZW50KShmcm9tKHNvdXJjZXMsIHNjaGVkdWxlcikpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9uZXZlci5qc1xudmFyIE5FVkVSID0gbmV3IE9ic2VydmFibGUobm9vcCk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyZ3NPckFyZ0FycmF5LmpzXG52YXIgaXNBcnJheTMgPSBBcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gYXJnc09yQXJnQXJyYXkoYXJncykge1xuICByZXR1cm4gYXJncy5sZW5ndGggPT09IDEgJiYgaXNBcnJheTMoYXJnc1swXSkgPyBhcmdzWzBdIDogYXJncztcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9maWx0ZXIuanNcbmZ1bmN0aW9uIGZpbHRlcihwcmVkaWNhdGUsIHRoaXNBcmcpIHtcbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCsrKSAmJiBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgIH0pKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3JhY2UuanNcbmZ1bmN0aW9uIHJhY2UoKSB7XG4gIHZhciBzb3VyY2VzID0gW107XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgc291cmNlc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG4gIHNvdXJjZXMgPSBhcmdzT3JBcmdBcnJheShzb3VyY2VzKTtcbiAgcmV0dXJuIHNvdXJjZXMubGVuZ3RoID09PSAxID8gaW5uZXJGcm9tKHNvdXJjZXNbMF0pIDogbmV3IE9ic2VydmFibGUocmFjZUluaXQoc291cmNlcykpO1xufVxuZnVuY3Rpb24gcmFjZUluaXQoc291cmNlcykge1xuICByZXR1cm4gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHZhciBzdWJzY3JpcHRpb25zID0gW107XG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbihpMikge1xuICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKGlubmVyRnJvbShzb3VyY2VzW2kyXSkuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucykge1xuICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgc3Vic2NyaXB0aW9ucy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgcyAhPT0gaTIgJiYgc3Vic2NyaXB0aW9uc1tzXS51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdWJzY3JpcHRpb25zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgfSkpKTtcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBzdWJzY3JpcHRpb25zICYmICFzdWJzY3JpYmVyLmNsb3NlZCAmJiBpIDwgc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgX2xvb3BfMShpKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3ppcC5qc1xuZnVuY3Rpb24gemlwKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBwb3BSZXN1bHRTZWxlY3RvcihhcmdzKTtcbiAgdmFyIHNvdXJjZXMgPSBhcmdzT3JBcmdBcnJheShhcmdzKTtcbiAgcmV0dXJuIHNvdXJjZXMubGVuZ3RoID8gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHZhciBidWZmZXJzID0gc291cmNlcy5tYXAoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG4gICAgdmFyIGNvbXBsZXRlZCA9IHNvdXJjZXMubWFwKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIHN1YnNjcmliZXIuYWRkKGZ1bmN0aW9uKCkge1xuICAgICAgYnVmZmVycyA9IGNvbXBsZXRlZCA9IG51bGw7XG4gICAgfSk7XG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbihzb3VyY2VJbmRleDIpIHtcbiAgICAgIGlubmVyRnJvbShzb3VyY2VzW3NvdXJjZUluZGV4Ml0pLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgYnVmZmVyc1tzb3VyY2VJbmRleDJdLnB1c2godmFsdWUpO1xuICAgICAgICBpZiAoYnVmZmVycy5ldmVyeShmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgICAgICByZXR1cm4gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gYnVmZmVycy5tYXAoZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyLnNoaWZ0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0U2VsZWN0b3IuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQocmVzdWx0KSkpIDogcmVzdWx0KTtcbiAgICAgICAgICBpZiAoYnVmZmVycy5zb21lKGZ1bmN0aW9uKGJ1ZmZlciwgaSkge1xuICAgICAgICAgICAgcmV0dXJuICFidWZmZXIubGVuZ3RoICYmIGNvbXBsZXRlZFtpXTtcbiAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbXBsZXRlZFtzb3VyY2VJbmRleDJdID0gdHJ1ZTtcbiAgICAgICAgIWJ1ZmZlcnNbc291cmNlSW5kZXgyXS5sZW5ndGggJiYgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfSkpO1xuICAgIH07XG4gICAgZm9yICh2YXIgc291cmNlSW5kZXggPSAwOyAhc3Vic2NyaWJlci5jbG9zZWQgJiYgc291cmNlSW5kZXggPCBzb3VyY2VzLmxlbmd0aDsgc291cmNlSW5kZXgrKykge1xuICAgICAgX2xvb3BfMShzb3VyY2VJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIGJ1ZmZlcnMgPSBjb21wbGV0ZWQgPSBudWxsO1xuICAgIH07XG4gIH0pIDogRU1QVFk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvYnVmZmVyQ291bnQuanNcbmZ1bmN0aW9uIGJ1ZmZlckNvdW50KGJ1ZmZlclNpemUsIHN0YXJ0QnVmZmVyRXZlcnkpIHtcbiAgaWYgKHN0YXJ0QnVmZmVyRXZlcnkgPT09IHZvaWQgMCkge1xuICAgIHN0YXJ0QnVmZmVyRXZlcnkgPSBudWxsO1xuICB9XG4gIHN0YXJ0QnVmZmVyRXZlcnkgPSBzdGFydEJ1ZmZlckV2ZXJ5ICE9PSBudWxsICYmIHN0YXJ0QnVmZmVyRXZlcnkgIT09IHZvaWQgMCA/IHN0YXJ0QnVmZmVyRXZlcnkgOiBidWZmZXJTaXplO1xuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgYnVmZmVycyA9IFtdO1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBlXzEsIF9hLCBlXzIsIF9iO1xuICAgICAgdmFyIHRvRW1pdCA9IG51bGw7XG4gICAgICBpZiAoY291bnQrKyAlIHN0YXJ0QnVmZmVyRXZlcnkgPT09IDApIHtcbiAgICAgICAgYnVmZmVycy5wdXNoKFtdKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIGJ1ZmZlcnNfMSA9IF9fdmFsdWVzKGJ1ZmZlcnMpLCBidWZmZXJzXzFfMSA9IGJ1ZmZlcnNfMS5uZXh0KCk7ICFidWZmZXJzXzFfMS5kb25lOyBidWZmZXJzXzFfMSA9IGJ1ZmZlcnNfMS5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gYnVmZmVyc18xXzEudmFsdWU7XG4gICAgICAgICAgYnVmZmVyLnB1c2godmFsdWUpO1xuICAgICAgICAgIGlmIChidWZmZXJTaXplIDw9IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRvRW1pdCA9IHRvRW1pdCAhPT0gbnVsbCAmJiB0b0VtaXQgIT09IHZvaWQgMCA/IHRvRW1pdCA6IFtdO1xuICAgICAgICAgICAgdG9FbWl0LnB1c2goYnVmZmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7XG4gICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChidWZmZXJzXzFfMSAmJiAhYnVmZmVyc18xXzEuZG9uZSAmJiAoX2EgPSBidWZmZXJzXzEucmV0dXJuKSkgX2EuY2FsbChidWZmZXJzXzEpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRvRW1pdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIHRvRW1pdF8xID0gX192YWx1ZXModG9FbWl0KSwgdG9FbWl0XzFfMSA9IHRvRW1pdF8xLm5leHQoKTsgIXRvRW1pdF8xXzEuZG9uZTsgdG9FbWl0XzFfMSA9IHRvRW1pdF8xLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IHRvRW1pdF8xXzEudmFsdWU7XG4gICAgICAgICAgICBhcnJSZW1vdmUoYnVmZmVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZV8yXzEpIHtcbiAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodG9FbWl0XzFfMSAmJiAhdG9FbWl0XzFfMS5kb25lICYmIChfYiA9IHRvRW1pdF8xLnJldHVybikpIF9iLmNhbGwodG9FbWl0XzEpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZV8zLCBfYTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIGJ1ZmZlcnNfMiA9IF9fdmFsdWVzKGJ1ZmZlcnMpLCBidWZmZXJzXzJfMSA9IGJ1ZmZlcnNfMi5uZXh0KCk7ICFidWZmZXJzXzJfMS5kb25lOyBidWZmZXJzXzJfMSA9IGJ1ZmZlcnNfMi5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gYnVmZmVyc18yXzEudmFsdWU7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVfM18xKSB7XG4gICAgICAgIGVfMyA9IHsgZXJyb3I6IGVfM18xIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChidWZmZXJzXzJfMSAmJiAhYnVmZmVyc18yXzEuZG9uZSAmJiAoX2EgPSBidWZmZXJzXzIucmV0dXJuKSkgX2EuY2FsbChidWZmZXJzXzIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgIH0sIHZvaWQgMCwgZnVuY3Rpb24oKSB7XG4gICAgICBidWZmZXJzID0gbnVsbDtcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NhdGNoRXJyb3IuanNcbmZ1bmN0aW9uIGNhdGNoRXJyb3Ioc2VsZWN0b3IpIHtcbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGlubmVyU3ViID0gbnVsbDtcbiAgICB2YXIgc3luY1Vuc3ViID0gZmFsc2U7XG4gICAgdmFyIGhhbmRsZWRSZXN1bHQ7XG4gICAgaW5uZXJTdWIgPSBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICBoYW5kbGVkUmVzdWx0ID0gaW5uZXJGcm9tKHNlbGVjdG9yKGVyciwgY2F0Y2hFcnJvcihzZWxlY3Rvcikoc291cmNlKSkpO1xuICAgICAgaWYgKGlubmVyU3ViKSB7XG4gICAgICAgIGlubmVyU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGlubmVyU3ViID0gbnVsbDtcbiAgICAgICAgaGFuZGxlZFJlc3VsdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jVW5zdWIgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pKTtcbiAgICBpZiAoc3luY1Vuc3ViKSB7XG4gICAgICBpbm5lclN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgaW5uZXJTdWIgPSBudWxsO1xuICAgICAgaGFuZGxlZFJlc3VsdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb25jYXRNYXAuanNcbmZ1bmN0aW9uIGNvbmNhdE1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3Rvcikge1xuICByZXR1cm4gaXNGdW5jdGlvbihyZXN1bHRTZWxlY3RvcikgPyBtZXJnZU1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvciwgMSkgOiBtZXJnZU1hcChwcm9qZWN0LCAxKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZWJvdW5jZVRpbWUuanNcbmZ1bmN0aW9uIGRlYm91bmNlVGltZShkdWVUaW1lLCBzY2hlZHVsZXIpIHtcbiAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7XG4gICAgc2NoZWR1bGVyID0gYXN5bmNTY2hlZHVsZXI7XG4gIH1cbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGFjdGl2ZVRhc2sgPSBudWxsO1xuICAgIHZhciBsYXN0VmFsdWUgPSBudWxsO1xuICAgIHZhciBsYXN0VGltZSA9IG51bGw7XG4gICAgdmFyIGVtaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChhY3RpdmVUYXNrKSB7XG4gICAgICAgIGFjdGl2ZVRhc2sudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgYWN0aXZlVGFzayA9IG51bGw7XG4gICAgICAgIHZhciB2YWx1ZSA9IGxhc3RWYWx1ZTtcbiAgICAgICAgbGFzdFZhbHVlID0gbnVsbDtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGVtaXRXaGVuSWRsZSgpIHtcbiAgICAgIHZhciB0YXJnZXRUaW1lID0gbGFzdFRpbWUgKyBkdWVUaW1lO1xuICAgICAgdmFyIG5vdyA9IHNjaGVkdWxlci5ub3coKTtcbiAgICAgIGlmIChub3cgPCB0YXJnZXRUaW1lKSB7XG4gICAgICAgIGFjdGl2ZVRhc2sgPSB0aGlzLnNjaGVkdWxlKHZvaWQgMCwgdGFyZ2V0VGltZSAtIG5vdyk7XG4gICAgICAgIHN1YnNjcmliZXIuYWRkKGFjdGl2ZVRhc2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbWl0KCk7XG4gICAgfVxuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBsYXN0VmFsdWUgPSB2YWx1ZTtcbiAgICAgIGxhc3RUaW1lID0gc2NoZWR1bGVyLm5vdygpO1xuICAgICAgaWYgKCFhY3RpdmVUYXNrKSB7XG4gICAgICAgIGFjdGl2ZVRhc2sgPSBzY2hlZHVsZXIuc2NoZWR1bGUoZW1pdFdoZW5JZGxlLCBkdWVUaW1lKTtcbiAgICAgICAgc3Vic2NyaWJlci5hZGQoYWN0aXZlVGFzayk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICBlbWl0KCk7XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHtcbiAgICAgIGxhc3RWYWx1ZSA9IGFjdGl2ZVRhc2sgPSBudWxsO1xuICAgIH0pKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVmYXVsdElmRW1wdHkuanNcbmZ1bmN0aW9uIGRlZmF1bHRJZkVtcHR5KGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghaGFzVmFsdWUpIHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSkpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YWtlLmpzXG5mdW5jdGlvbiB0YWtlKGNvdW50KSB7XG4gIHJldHVybiBjb3VudCA8PSAwID8gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIEVNUFRZO1xuICB9IDogb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgc2VlbiA9IDA7XG4gICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICgrK3NlZW4gPD0gY291bnQpIHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgaWYgKGNvdW50IDw9IHNlZW4pIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2lnbm9yZUVsZW1lbnRzLmpzXG5mdW5jdGlvbiBpZ25vcmVFbGVtZW50cygpIHtcbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgbm9vcCkpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tYXBUby5qc1xuZnVuY3Rpb24gbWFwVG8odmFsdWUpIHtcbiAgcmV0dXJuIG1hcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlbGF5V2hlbi5qc1xuZnVuY3Rpb24gZGVsYXlXaGVuKGRlbGF5RHVyYXRpb25TZWxlY3Rvciwgc3Vic2NyaXB0aW9uRGVsYXkpIHtcbiAgaWYgKHN1YnNjcmlwdGlvbkRlbGF5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGNvbmNhdChzdWJzY3JpcHRpb25EZWxheS5waXBlKHRha2UoMSksIGlnbm9yZUVsZW1lbnRzKCkpLCBzb3VyY2UucGlwZShkZWxheVdoZW4oZGVsYXlEdXJhdGlvblNlbGVjdG9yKSkpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIG1lcmdlTWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgIHJldHVybiBpbm5lckZyb20oZGVsYXlEdXJhdGlvblNlbGVjdG9yKHZhbHVlLCBpbmRleCkpLnBpcGUodGFrZSgxKSwgbWFwVG8odmFsdWUpKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVsYXkuanNcbmZ1bmN0aW9uIGRlbGF5KGR1ZSwgc2NoZWR1bGVyKSB7XG4gIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkge1xuICAgIHNjaGVkdWxlciA9IGFzeW5jU2NoZWR1bGVyO1xuICB9XG4gIHZhciBkdXJhdGlvbiA9IHRpbWVyKGR1ZSwgc2NoZWR1bGVyKTtcbiAgcmV0dXJuIGRlbGF5V2hlbihmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rocm93SWZFbXB0eS5qc1xuZnVuY3Rpb24gdGhyb3dJZkVtcHR5KGVycm9yRmFjdG9yeSkge1xuICBpZiAoZXJyb3JGYWN0b3J5ID09PSB2b2lkIDApIHtcbiAgICBlcnJvckZhY3RvcnkgPSBkZWZhdWx0RXJyb3JGYWN0b3J5O1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHZhciBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBoYXNWYWx1ZSA9IHRydWU7XG4gICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGhhc1ZhbHVlID8gc3Vic2NyaWJlci5jb21wbGV0ZSgpIDogc3Vic2NyaWJlci5lcnJvcihlcnJvckZhY3RvcnkoKSk7XG4gICAgfSkpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRFcnJvckZhY3RvcnkoKSB7XG4gIHJldHVybiBuZXcgRW1wdHlFcnJvcigpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpcnN0LmpzXG5mdW5jdGlvbiBmaXJzdChwcmVkaWNhdGUsIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgaGFzRGVmYXVsdFZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+PSAyO1xuICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7XG4gICAgcmV0dXJuIHNvdXJjZS5waXBlKHByZWRpY2F0ZSA/IGZpbHRlcihmdW5jdGlvbih2LCBpKSB7XG4gICAgICByZXR1cm4gcHJlZGljYXRlKHYsIGksIHNvdXJjZSk7XG4gICAgfSkgOiBpZGVudGl0eSwgdGFrZSgxKSwgaGFzRGVmYXVsdFZhbHVlID8gZGVmYXVsdElmRW1wdHkoZGVmYXVsdFZhbHVlKSA6IHRocm93SWZFbXB0eShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgRW1wdHlFcnJvcigpO1xuICAgIH0pKTtcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZVNjYW4uanNcbmZ1bmN0aW9uIG1lcmdlU2NhbihhY2N1bXVsYXRvciwgc2VlZCwgY29uY3VycmVudCkge1xuICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7XG4gICAgY29uY3VycmVudCA9IEluZmluaXR5O1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHZhciBzdGF0ZSA9IHNlZWQ7XG4gICAgcmV0dXJuIG1lcmdlSW50ZXJuYWxzKHNvdXJjZSwgc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3Ioc3RhdGUsIHZhbHVlLCBpbmRleCk7XG4gICAgfSwgY29uY3VycmVudCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHN0YXRlID0gdmFsdWU7XG4gICAgfSwgZmFsc2UsIHZvaWQgMCwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3RhdGUgPSBudWxsO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yYWNlV2l0aC5qc1xuZnVuY3Rpb24gcmFjZVdpdGgoKSB7XG4gIHZhciBvdGhlclNvdXJjZXMgPSBbXTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBvdGhlclNvdXJjZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICByZXR1cm4gIW90aGVyU291cmNlcy5sZW5ndGggPyBpZGVudGl0eSA6IG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgcmFjZUluaXQoX19zcHJlYWRBcnJheShbc291cmNlXSwgX19yZWFkKG90aGVyU291cmNlcykpKShzdWJzY3JpYmVyKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmV0cnkuanNcbmZ1bmN0aW9uIHJldHJ5KGNvbmZpZ09yQ291bnQpIHtcbiAgaWYgKGNvbmZpZ09yQ291bnQgPT09IHZvaWQgMCkge1xuICAgIGNvbmZpZ09yQ291bnQgPSBJbmZpbml0eTtcbiAgfVxuICB2YXIgY29uZmlnMjtcbiAgaWYgKGNvbmZpZ09yQ291bnQgJiYgdHlwZW9mIGNvbmZpZ09yQ291bnQgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25maWcyID0gY29uZmlnT3JDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcyID0ge1xuICAgICAgY291bnQ6IGNvbmZpZ09yQ291bnRcbiAgICB9O1xuICB9XG4gIHZhciBfYSA9IGNvbmZpZzIuY291bnQsIGNvdW50ID0gX2EgPT09IHZvaWQgMCA/IEluZmluaXR5IDogX2EsIGRlbGF5MiA9IGNvbmZpZzIuZGVsYXksIF9iID0gY29uZmlnMi5yZXNldE9uU3VjY2VzcywgcmVzZXRPblN1Y2Nlc3MgPSBfYiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYjtcbiAgcmV0dXJuIGNvdW50IDw9IDAgPyBpZGVudGl0eSA6IG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIHNvRmFyID0gMDtcbiAgICB2YXIgaW5uZXJTdWI7XG4gICAgdmFyIHN1YnNjcmliZUZvclJldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc3luY1Vuc3ViID0gZmFsc2U7XG4gICAgICBpbm5lclN1YiA9IHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmIChyZXNldE9uU3VjY2Vzcykge1xuICAgICAgICAgIHNvRmFyID0gMDtcbiAgICAgICAgfVxuICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgfSwgdm9pZCAwLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKHNvRmFyKysgPCBjb3VudCkge1xuICAgICAgICAgIHZhciByZXN1Yl8xID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoaW5uZXJTdWIpIHtcbiAgICAgICAgICAgICAgaW5uZXJTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgaW5uZXJTdWIgPSBudWxsO1xuICAgICAgICAgICAgICBzdWJzY3JpYmVGb3JSZXRyeSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3luY1Vuc3ViID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChkZWxheTIgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIG5vdGlmaWVyID0gdHlwZW9mIGRlbGF5MiA9PT0gXCJudW1iZXJcIiA/IHRpbWVyKGRlbGF5MikgOiBpbm5lckZyb20oZGVsYXkyKGVyciwgc29GYXIpKTtcbiAgICAgICAgICAgIHZhciBub3RpZmllclN1YnNjcmliZXJfMSA9IGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgbm90aWZpZXJTdWJzY3JpYmVyXzEudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgcmVzdWJfMSgpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbm90aWZpZXIuc3Vic2NyaWJlKG5vdGlmaWVyU3Vic2NyaWJlcl8xKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWJfMSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICAgIGlmIChzeW5jVW5zdWIpIHtcbiAgICAgICAgaW5uZXJTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaW5uZXJTdWIgPSBudWxsO1xuICAgICAgICBzdWJzY3JpYmVGb3JSZXRyeSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgc3Vic2NyaWJlRm9yUmV0cnkoKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3RhcnRXaXRoLmpzXG5mdW5jdGlvbiBzdGFydFdpdGgoKSB7XG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YWx1ZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKHZhbHVlcyk7XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIChzY2hlZHVsZXIgPyBjb25jYXQodmFsdWVzLCBzb3VyY2UsIHNjaGVkdWxlcikgOiBjb25jYXQodmFsdWVzLCBzb3VyY2UpKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaE1hcC5qc1xuZnVuY3Rpb24gc3dpdGNoTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yKSB7XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHZhciBpbm5lclN1YnNjcmliZXIgPSBudWxsO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGlzQ29tcGxldGUgPSBmYWxzZTtcbiAgICB2YXIgY2hlY2tDb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGlzQ29tcGxldGUgJiYgIWlubmVyU3Vic2NyaWJlciAmJiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaW5uZXJTdWJzY3JpYmVyID09PSBudWxsIHx8IGlubmVyU3Vic2NyaWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5uZXJTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB2YXIgaW5uZXJJbmRleCA9IDA7XG4gICAgICB2YXIgb3V0ZXJJbmRleCA9IGluZGV4Kys7XG4gICAgICBpbm5lckZyb20ocHJvamVjdCh2YWx1ZSwgb3V0ZXJJbmRleCkpLnN1YnNjcmliZShpbm5lclN1YnNjcmliZXIgPSBjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oaW5uZXJWYWx1ZSkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5uZXh0KHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0U2VsZWN0b3IodmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgrKykgOiBpbm5lclZhbHVlKTtcbiAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICBpbm5lclN1YnNjcmliZXIgPSBudWxsO1xuICAgICAgICBjaGVja0NvbXBsZXRlKCk7XG4gICAgICB9KSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICBpc0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgIGNoZWNrQ29tcGxldGUoKTtcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rha2VVbnRpbC5qc1xuZnVuY3Rpb24gdGFrZVVudGlsKG5vdGlmaWVyKSB7XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIGlubmVyRnJvbShub3RpZmllcikuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSwgbm9vcCkpO1xuICAgICFzdWJzY3JpYmVyLmNsb3NlZCAmJiBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YXAuanNcbmZ1bmN0aW9uIHRhcChvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gIHZhciB0YXBPYnNlcnZlciA9IGlzRnVuY3Rpb24ob2JzZXJ2ZXJPck5leHQpIHx8IGVycm9yIHx8IGNvbXBsZXRlID8geyBuZXh0OiBvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlIH0gOiBvYnNlcnZlck9yTmV4dDtcbiAgcmV0dXJuIHRhcE9ic2VydmVyID8gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgX2E7XG4gICAgKF9hID0gdGFwT2JzZXJ2ZXIuc3Vic2NyaWJlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0YXBPYnNlcnZlcik7XG4gICAgdmFyIGlzVW5zdWIgPSB0cnVlO1xuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgX2EyO1xuICAgICAgKF9hMiA9IHRhcE9ic2VydmVyLm5leHQpID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmNhbGwodGFwT2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgX2EyO1xuICAgICAgaXNVbnN1YiA9IGZhbHNlO1xuICAgICAgKF9hMiA9IHRhcE9ic2VydmVyLmNvbXBsZXRlKSA9PT0gbnVsbCB8fCBfYTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMi5jYWxsKHRhcE9ic2VydmVyKTtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIHZhciBfYTI7XG4gICAgICBpc1Vuc3ViID0gZmFsc2U7XG4gICAgICAoX2EyID0gdGFwT2JzZXJ2ZXIuZXJyb3IpID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmNhbGwodGFwT2JzZXJ2ZXIsIGVycik7XG4gICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgX2EyLCBfYjtcbiAgICAgIGlmIChpc1Vuc3ViKSB7XG4gICAgICAgIChfYTIgPSB0YXBPYnNlcnZlci51bnN1YnNjcmliZSkgPT09IG51bGwgfHwgX2EyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTIuY2FsbCh0YXBPYnNlcnZlcik7XG4gICAgICB9XG4gICAgICAoX2IgPSB0YXBPYnNlcnZlci5maW5hbGl6ZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwodGFwT2JzZXJ2ZXIpO1xuICAgIH0pKTtcbiAgfSkgOiBpZGVudGl0eTtcbn1cbmV4cG9ydCB7XG4gIEVNUFRZLFxuICBORVZFUixcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgYnVmZmVyQ291bnQsXG4gIGNhdGNoRXJyb3IsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGNvbmNhdCxcbiAgY29uY2F0TWFwLFxuICBkZWJvdW5jZVRpbWUsXG4gIGRlZmF1bHRJZkVtcHR5LFxuICBkZWZlcixcbiAgZGVsYXksXG4gIGRlbGF5V2hlbixcbiAgZmlsdGVyLFxuICBmaXJzdCxcbiAgZmlyc3RWYWx1ZUZyb20sXG4gIGZvcmtKb2luLFxuICBmcm9tLFxuICBmcm9tRXZlbnQsXG4gIGlkZW50aXR5LFxuICBpZ25vcmVFbGVtZW50cyxcbiAgbGFzdFZhbHVlRnJvbSxcbiAgbWFwLFxuICBtZXJnZSxcbiAgbWVyZ2VNYXAsXG4gIG1lcmdlU2NhbixcbiAgbm9vcCxcbiAgb2YsXG4gIHBpcGUsXG4gIHJhY2UsXG4gIHJhY2VXaXRoLFxuICByZXRyeSxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB0aHJvd0lmRW1wdHksXG4gIHRpbWVyLFxuICB6aXBcbn07XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG59O1xuIiwiaW1wb3J0IGNyZWF0ZVdlYlNvY2tldFN0cmVhbSBmcm9tICcuL2xpYi9zdHJlYW0uanMnO1xuaW1wb3J0IFJlY2VpdmVyIGZyb20gJy4vbGliL3JlY2VpdmVyLmpzJztcbmltcG9ydCBTZW5kZXIgZnJvbSAnLi9saWIvc2VuZGVyLmpzJztcbmltcG9ydCBXZWJTb2NrZXQgZnJvbSAnLi9saWIvd2Vic29ja2V0LmpzJztcbmltcG9ydCBXZWJTb2NrZXRTZXJ2ZXIgZnJvbSAnLi9saWIvd2Vic29ja2V0LXNlcnZlci5qcyc7XG5cbmV4cG9ydCB7IGNyZWF0ZVdlYlNvY2tldFN0cmVhbSwgUmVjZWl2ZXIsIFNlbmRlciwgV2ViU29ja2V0LCBXZWJTb2NrZXRTZXJ2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IFdlYlNvY2tldDtcbiIsImxldCBzaGltO1xuY2xhc3MgWTE4TiB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICAvLyBjb25maWd1cmFibGUgb3B0aW9ucy5cbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gb3B0cy5kaXJlY3RvcnkgfHwgJy4vbG9jYWxlcyc7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsZXMgPSB0eXBlb2Ygb3B0cy51cGRhdGVGaWxlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy51cGRhdGVGaWxlcyA6IHRydWU7XG4gICAgICAgIHRoaXMubG9jYWxlID0gb3B0cy5sb2NhbGUgfHwgJ2VuJztcbiAgICAgICAgdGhpcy5mYWxsYmFja1RvTGFuZ3VhZ2UgPSB0eXBlb2Ygb3B0cy5mYWxsYmFja1RvTGFuZ3VhZ2UgPT09ICdib29sZWFuJyA/IG9wdHMuZmFsbGJhY2tUb0xhbmd1YWdlIDogdHJ1ZTtcbiAgICAgICAgLy8gaW50ZXJuYWwgc3R1ZmYuXG4gICAgICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLndyaXRlUXVldWUgPSBbXTtcbiAgICB9XG4gICAgX18oLi4uYXJncykge1xuICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90YWdnZWRMaXRlcmFsKGFyZ3VtZW50c1swXSwgLi4uYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHIgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGxldCBjYiA9IGZ1bmN0aW9uICgpIHsgfTsgLy8gc3RhcnQgd2l0aCBub29wLlxuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiID0gYXJncy5wb3AoKTtcbiAgICAgICAgY2IgPSBjYiB8fCBmdW5jdGlvbiAoKSB7IH07IC8vIG5vb3AuXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICAvLyB3ZSd2ZSBvYnNlcnZlZCBhIG5ldyBzdHJpbmcsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgZmlsZS5cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzdHJdICYmIHRoaXMudXBkYXRlRmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gPSBzdHI7XG4gICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgbG9jYWxlLFxuICAgICAgICAgICAgLy8gc2luY2UgdGhlc2UgdmFsdWVzIGNvdWxkIGNoYW5nZSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyB3cml0ZSBpcyBwZXJmb3JtZWQuXG4gICAgICAgICAgICB0aGlzLl9lbnF1ZXVlV3JpdGUoe1xuICAgICAgICAgICAgICAgIGRpcmVjdG9yeTogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICAgICAgICBjYlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgW3RoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gfHwgc3RyXS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgICBfX24oKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICBjb25zdCBzaW5ndWxhciA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgY29uc3QgcGx1cmFsID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBjb25zdCBxdWFudGl0eSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgbGV0IGNiID0gZnVuY3Rpb24gKCkgeyB9OyAvLyBzdGFydCB3aXRoIG5vb3AuXG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IgPSBhcmdzLnBvcCgpO1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdKVxuICAgICAgICAgICAgdGhpcy5fcmVhZExvY2FsZUZpbGUoKTtcbiAgICAgICAgbGV0IHN0ciA9IHF1YW50aXR5ID09PSAxID8gc2luZ3VsYXIgOiBwbHVyYWw7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdO1xuICAgICAgICAgICAgc3RyID0gZW50cnlbcXVhbnRpdHkgPT09IDEgPyAnb25lJyA6ICdvdGhlciddO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdlJ3ZlIG9ic2VydmVkIGEgbmV3IHN0cmluZywgdXBkYXRlIHRoZSBsYW5ndWFnZSBmaWxlLlxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXSAmJiB0aGlzLnVwZGF0ZUZpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0gPSB7XG4gICAgICAgICAgICAgICAgb25lOiBzaW5ndWxhcixcbiAgICAgICAgICAgICAgICBvdGhlcjogcGx1cmFsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGxvY2FsZSxcbiAgICAgICAgICAgIC8vIHNpbmNlIHRoZXNlIHZhbHVlcyBjb3VsZCBjaGFuZ2UgYmVmb3JlIHRoZVxuICAgICAgICAgICAgLy8gd3JpdGUgaXMgcGVyZm9ybWVkLlxuICAgICAgICAgICAgdGhpcy5fZW5xdWV1ZVdyaXRlKHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuZGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgICAgICAgY2JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhICVkIHBsYWNlaG9sZGVyIGlzIHByb3ZpZGVkLCBhZGQgcXVhbnRpdHlcbiAgICAgICAgLy8gdG8gdGhlIGFyZ3VtZW50cyBleHBhbmRlZCBieSB1dGlsLmZvcm1hdC5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gW3N0cl07XG4gICAgICAgIGlmICh+c3RyLmluZGV4T2YoJyVkJykpXG4gICAgICAgICAgICB2YWx1ZXMucHVzaChxdWFudGl0eSk7XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgdmFsdWVzLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICAgIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgfVxuICAgIGdldExvY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlO1xuICAgIH1cbiAgICB1cGRhdGVMb2NhbGUob2JqKSB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1ba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIF90YWdnZWRMaXRlcmFsKHBhcnRzLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgcGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCwgaSkge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpICsgMV07XG4gICAgICAgICAgICBzdHIgKz0gcGFydDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHN0ciArPSAnJXMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX18uYXBwbHkodGhpcywgW3N0cl0uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJncywgMSkpKTtcbiAgICB9XG4gICAgX2VucXVldWVXcml0ZSh3b3JrKSB7XG4gICAgICAgIHRoaXMud3JpdGVRdWV1ZS5wdXNoKHdvcmspO1xuICAgICAgICBpZiAodGhpcy53cml0ZVF1ZXVlLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NXcml0ZVF1ZXVlKCk7XG4gICAgfVxuICAgIF9wcm9jZXNzV3JpdGVRdWV1ZSgpIHtcbiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xuICAgICAgICBjb25zdCB3b3JrID0gdGhpcy53cml0ZVF1ZXVlWzBdO1xuICAgICAgICAvLyBkZXN0cnVjdHVyZSB0aGUgZW5xdWV1ZWQgd29yay5cbiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gd29yay5kaXJlY3Rvcnk7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9IHdvcmsubG9jYWxlO1xuICAgICAgICBjb25zdCBjYiA9IHdvcmsuY2I7XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHRoaXMuX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZExvY2FsZSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY2FjaGVbbG9jYWxlXSwgbnVsbCwgMik7XG4gICAgICAgIHNoaW0uZnMud3JpdGVGaWxlKGxhbmd1YWdlRmlsZSwgc2VyaWFsaXplZExvY2FsZSwgJ3V0Zi04JywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgX3RoaXMud3JpdGVRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKF90aGlzLndyaXRlUXVldWUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBfdGhpcy5fcHJvY2Vzc1dyaXRlUXVldWUoKTtcbiAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcmVhZExvY2FsZUZpbGUoKSB7XG4gICAgICAgIGxldCBsb2NhbGVMb29rdXAgPSB7fTtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VGaWxlID0gdGhpcy5fcmVzb2x2ZUxvY2FsZUZpbGUodGhpcy5kaXJlY3RvcnksIHRoaXMubG9jYWxlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBidW5kbGVyIHN1Y2ggYXMgd2VicGFjaywgcmVhZEZpbGVTeW5jIG1heSBub3QgYmUgZGVmaW5lZDpcbiAgICAgICAgICAgIGlmIChzaGltLmZzLnJlYWRGaWxlU3luYykge1xuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IEpTT04ucGFyc2Uoc2hpbS5mcy5yZWFkRmlsZVN5bmMobGFuZ3VhZ2VGaWxlLCAndXRmLTgnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSAnc3ludGF4IGVycm9yIGluICcgKyBsYW5ndWFnZUZpbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKVxuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IHt9O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSA9IGxvY2FsZUxvb2t1cDtcbiAgICB9XG4gICAgX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKSB7XG4gICAgICAgIGxldCBmaWxlID0gc2hpbS5yZXNvbHZlKGRpcmVjdG9yeSwgJy4vJywgbG9jYWxlICsgJy5qc29uJyk7XG4gICAgICAgIGlmICh0aGlzLmZhbGxiYWNrVG9MYW5ndWFnZSAmJiAhdGhpcy5fZmlsZUV4aXN0c1N5bmMoZmlsZSkgJiYgfmxvY2FsZS5sYXN0SW5kZXhPZignXycpKSB7XG4gICAgICAgICAgICAvLyBhdHRlbXB0IGZhbGxiYWNrIHRvIGxhbmd1YWdlIG9ubHlcbiAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHNoaW0ucmVzb2x2ZShkaXJlY3RvcnksICcuLycsIGxvY2FsZS5zcGxpdCgnXycpWzBdICsgJy5qc29uJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZmlsZUV4aXN0c1N5bmMobGFuZ3VhZ2VGaWxlKSlcbiAgICAgICAgICAgICAgICBmaWxlID0gbGFuZ3VhZ2VGaWxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cbiAgICBfZmlsZUV4aXN0c1N5bmMoZmlsZSkge1xuICAgICAgICByZXR1cm4gc2hpbS5leGlzdHMoZmlsZSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHkxOG4ob3B0cywgX3NoaW0pIHtcbiAgICBzaGltID0gX3NoaW07XG4gICAgY29uc3QgeTE4biA9IG5ldyBZMThOKG9wdHMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIF9fOiB5MThuLl9fLmJpbmQoeTE4biksXG4gICAgICAgIF9fbjogeTE4bi5fX24uYmluZCh5MThuKSxcbiAgICAgICAgc2V0TG9jYWxlOiB5MThuLnNldExvY2FsZS5iaW5kKHkxOG4pLFxuICAgICAgICBnZXRMb2NhbGU6IHkxOG4uZ2V0TG9jYWxlLmJpbmQoeTE4biksXG4gICAgICAgIHVwZGF0ZUxvY2FsZTogeTE4bi51cGRhdGVMb2NhbGUuYmluZCh5MThuKSxcbiAgICAgICAgbG9jYWxlOiB5MThuLmxvY2FsZVxuICAgIH07XG59XG4iLCJpbXBvcnQgeyByZWFkRmlsZVN5bmMsIHN0YXRTeW5jLCB3cml0ZUZpbGUgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBmczoge1xuICAgICAgICByZWFkRmlsZVN5bmMsXG4gICAgICAgIHdyaXRlRmlsZVxuICAgIH0sXG4gICAgZm9ybWF0LFxuICAgIHJlc29sdmUsXG4gICAgZXhpc3RzOiAoZmlsZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRTeW5jKGZpbGUpLmlzRmlsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCJpbXBvcnQgc2hpbSBmcm9tICcuL2J1aWxkL2xpYi9wbGF0Zm9ybS1zaGltcy9ub2RlLmpzJ1xuaW1wb3J0IHsgeTE4biBhcyBfeTE4biB9IGZyb20gJy4vYnVpbGQvbGliL2luZGV4LmpzJ1xuXG5jb25zdCB5MThuID0gKG9wdHMpID0+IHtcbiAgcmV0dXJuIF95MThuKG9wdHMsIHNoaW0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IHkxOG5cbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBNYWluIGVudHJ5cG9pbnQgZm9yIGxpYnJhcmllcyB1c2luZyB5YXJncy1wYXJzZXIgaW4gTm9kZS5qc1xuICogQ0pTIGFuZCBFU00gZW52aXJvbm1lbnRzLlxuICpcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG52YXIgX2EsIF9iLCBfYztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHsgbm9ybWFsaXplLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjYW1lbENhc2UsIGRlY2FtZWxpemUsIGxvb2tzTGlrZU51bWJlciB9IGZyb20gJy4vc3RyaW5nLXV0aWxzLmpzJztcbmltcG9ydCB7IFlhcmdzUGFyc2VyIH0gZnJvbSAnLi95YXJncy1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJncy95YXJncy1wYXJzZXIjc3VwcG9ydGVkLW5vZGVqcy12ZXJzaW9ucyBmb3Igb3VyXG4vLyB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5LiBUaGUgWUFSR1NfTUlOX05PREVfVkVSU0lPTiBpcyB1c2VkIGZvciB0ZXN0aW5nIG9ubHkuXG5jb25zdCBtaW5Ob2RlVmVyc2lvbiA9IChwcm9jZXNzICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52LllBUkdTX01JTl9OT0RFX1ZFUlNJT04pXG4gICAgPyBOdW1iZXIocHJvY2Vzcy5lbnYuWUFSR1NfTUlOX05PREVfVkVSU0lPTilcbiAgICA6IDEyO1xuY29uc3Qgbm9kZVZlcnNpb24gPSAoX2IgPSAoX2EgPSBwcm9jZXNzID09PSBudWxsIHx8IHByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2Nlc3MudmVyc2lvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub2RlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAoX2MgPSBwcm9jZXNzID09PSBudWxsIHx8IHByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2Nlc3MudmVyc2lvbikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnNsaWNlKDEpO1xuaWYgKG5vZGVWZXJzaW9uKSB7XG4gICAgY29uc3QgbWFqb3IgPSBOdW1iZXIobm9kZVZlcnNpb24ubWF0Y2goL14oW14uXSspLylbMV0pO1xuICAgIGlmIChtYWpvciA8IG1pbk5vZGVWZXJzaW9uKSB7XG4gICAgICAgIHRocm93IEVycm9yKGB5YXJncyBwYXJzZXIgc3VwcG9ydHMgYSBtaW5pbXVtIE5vZGUuanMgdmVyc2lvbiBvZiAke21pbk5vZGVWZXJzaW9ufS4gUmVhZCBvdXIgdmVyc2lvbiBzdXBwb3J0IHBvbGljeTogaHR0cHM6Ly9naXRodWIuY29tL3lhcmdzL3lhcmdzLXBhcnNlciNzdXBwb3J0ZWQtbm9kZWpzLXZlcnNpb25zYCk7XG4gICAgfVxufVxuLy8gQ3JlYXRlcyBhIHlhcmdzLXBhcnNlciBpbnN0YW5jZSB1c2luZyBOb2RlLmpzIHN0YW5kYXJkIGxpYnJhcmllczpcbmNvbnN0IGVudiA9IHByb2Nlc3MgPyBwcm9jZXNzLmVudiA6IHt9O1xuY29uc3QgcGFyc2VyID0gbmV3IFlhcmdzUGFyc2VyKHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkLFxuICAgIGVudjogKCkgPT4ge1xuICAgICAgICByZXR1cm4gZW52O1xuICAgIH0sXG4gICAgZm9ybWF0LFxuICAgIG5vcm1hbGl6ZSxcbiAgICByZXNvbHZlLFxuICAgIC8vIFRPRE86IGZpZ3VyZSAgb3V0IGEgIHdheSB0byBjb21iaW5lIEVTTSBhbmQgQ0pTIGNvdmVyYWdlLCBzdWNoICB0aGF0XG4gICAgLy8gd2UgY2FuIGV4ZXJjaXNlIGFsbCB0aGUgbGluZXMgYmVsb3c6XG4gICAgcmVxdWlyZTogKHBhdGgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF0aC5tYXRjaCgvXFwuanNvbiQvKSkge1xuICAgICAgICAgICAgLy8gQWRkcmVzc2VzOiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3MvaXNzdWVzLzIwNDBcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwYXRoLCAndXRmOCcpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdvbmx5IC5qc29uIGNvbmZpZyBmaWxlcyBhcmUgc3VwcG9ydGVkIGluIEVTTScpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5jb25zdCB5YXJnc1BhcnNlciA9IGZ1bmN0aW9uIFBhcnNlcihhcmdzLCBvcHRzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKGFyZ3Muc2xpY2UoKSwgb3B0cyk7XG4gICAgcmV0dXJuIHJlc3VsdC5hcmd2O1xufTtcbnlhcmdzUGFyc2VyLmRldGFpbGVkID0gZnVuY3Rpb24gKGFyZ3MsIG9wdHMpIHtcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGFyZ3Muc2xpY2UoKSwgb3B0cyk7XG59O1xueWFyZ3NQYXJzZXIuY2FtZWxDYXNlID0gY2FtZWxDYXNlO1xueWFyZ3NQYXJzZXIuZGVjYW1lbGl6ZSA9IGRlY2FtZWxpemU7XG55YXJnc1BhcnNlci5sb29rc0xpa2VOdW1iZXIgPSBsb29rc0xpa2VOdW1iZXI7XG5leHBvcnQgZGVmYXVsdCB5YXJnc1BhcnNlcjtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiwgQ29udHJpYnV0b3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogSVNDXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbENhc2Uoc3RyKSB7XG4gICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGFzIGNhbWVsIGNhc2UsIGUuZy4sIGZvb0Jhci5cbiAgICAvLyBieSBlbnN1cmluZyB0aGF0IHRoZSBzdHJpbmcgaXNuJ3QgYWxyZWFkeSBtaXhlZCBjYXNlOlxuICAgIGNvbnN0IGlzQ2FtZWxDYXNlID0gc3RyICE9PSBzdHIudG9Mb3dlckNhc2UoKSAmJiBzdHIgIT09IHN0ci50b1VwcGVyQ2FzZSgpO1xuICAgIGlmICghaXNDYW1lbENhc2UpIHtcbiAgICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmIChzdHIuaW5kZXhPZignLScpID09PSAtMSAmJiBzdHIuaW5kZXhPZignXycpID09PSAtMSkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNhbWVsY2FzZSA9ICcnO1xuICAgICAgICBsZXQgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdIeXBoZW5zID0gc3RyLm1hdGNoKC9eLSsvKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxlYWRpbmdIeXBoZW5zID8gbGVhZGluZ0h5cGhlbnNbMF0ubGVuZ3RoIDogMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNociA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAobmV4dENoclVwcGVyKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hyID0gY2hyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gMCAmJiAoY2hyID09PSAnLScgfHwgY2hyID09PSAnXycpKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNociAhPT0gJy0nICYmIGNociAhPT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgY2FtZWxjYXNlICs9IGNocjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FtZWxjYXNlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNhbWVsaXplKHN0ciwgam9pblN0cmluZykge1xuICAgIGNvbnN0IGxvd2VyY2FzZSA9IHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIGpvaW5TdHJpbmcgPSBqb2luU3RyaW5nIHx8ICctJztcbiAgICBsZXQgbm90Q2FtZWxjYXNlID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hyTG93ZXIgPSBsb3dlcmNhc2UuY2hhckF0KGkpO1xuICAgICAgICBjb25zdCBjaHJTdHJpbmcgPSBzdHIuY2hhckF0KGkpO1xuICAgICAgICBpZiAoY2hyTG93ZXIgIT09IGNoclN0cmluZyAmJiBpID4gMCkge1xuICAgICAgICAgICAgbm90Q2FtZWxjYXNlICs9IGAke2pvaW5TdHJpbmd9JHtsb3dlcmNhc2UuY2hhckF0KGkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub3RDYW1lbGNhc2UgKz0gY2hyU3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub3RDYW1lbGNhc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gbG9va3NMaWtlTnVtYmVyKHgpIHtcbiAgICBpZiAoeCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBpZiBsb2FkZWQgZnJvbSBjb25maWcsIG1heSBhbHJlYWR5IGJlIGEgbnVtYmVyLlxuICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIGhleGFkZWNpbWFsLlxuICAgIGlmICgvXjB4WzAtOWEtZl0rJC9pLnRlc3QoeCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIGRvbid0IHRyZWF0IDAxMjMgYXMgYSBudW1iZXI7IGFzIGl0IGRyb3BzIHRoZSBsZWFkaW5nICcwJy5cbiAgICBpZiAoL14wW14uXS8udGVzdCh4KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAvXlstXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKGVbLStdP1xcZCspPyQvLnRlc3QoeCk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG4vLyB0YWtlIGFuIHVuLXNwbGl0IGFyZ3Ygc3RyaW5nIGFuZCB0b2tlbml6ZSBpdC5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZUFyZ1N0cmluZyhhcmdTdHJpbmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdTdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBhcmdTdHJpbmcubWFwKGUgPT4gdHlwZW9mIGUgIT09ICdzdHJpbmcnID8gZSArICcnIDogZSk7XG4gICAgfVxuICAgIGFyZ1N0cmluZyA9IGFyZ1N0cmluZy50cmltKCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBwcmV2QyA9IG51bGw7XG4gICAgbGV0IGMgPSBudWxsO1xuICAgIGxldCBvcGVuaW5nID0gbnVsbDtcbiAgICBjb25zdCBhcmdzID0gW107XG4gICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGFyZ1N0cmluZy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgcHJldkMgPSBjO1xuICAgICAgICBjID0gYXJnU3RyaW5nLmNoYXJBdChpaSk7XG4gICAgICAgIC8vIHNwbGl0IG9uIHNwYWNlcyB1bmxlc3Mgd2UncmUgaW4gcXVvdGVzLlxuICAgICAgICBpZiAoYyA9PT0gJyAnICYmICFvcGVuaW5nKSB7XG4gICAgICAgICAgICBpZiAoIShwcmV2QyA9PT0gJyAnKSkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRvbid0IHNwbGl0IHRoZSBzdHJpbmcgaWYgd2UncmUgaW4gbWF0Y2hpbmdcbiAgICAgICAgLy8gb3BlbmluZyBvciBjbG9zaW5nIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlcy5cbiAgICAgICAgaWYgKGMgPT09IG9wZW5pbmcpIHtcbiAgICAgICAgICAgIG9wZW5pbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjID09PSBcIidcIiB8fCBjID09PSAnXCInKSAmJiAhb3BlbmluZykge1xuICAgICAgICAgICAgb3BlbmluZyA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmdzW2ldKVxuICAgICAgICAgICAgYXJnc1tpXSA9ICcnO1xuICAgICAgICBhcmdzW2ldICs9IGM7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xuZXhwb3J0IHZhciBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleTtcbihmdW5jdGlvbiAoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkpIHtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIkJPT0xFQU5cIl0gPSBcImJvb2xlYW5cIjtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIlNUUklOR1wiXSA9IFwic3RyaW5nXCI7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJOVU1CRVJcIl0gPSBcIm51bWJlclwiO1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiQVJSQVlcIl0gPSBcImFycmF5XCI7XG59KShEZWZhdWx0VmFsdWVzRm9yVHlwZUtleSB8fCAoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgPSB7fSkpO1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xuaW1wb3J0IHsgdG9rZW5pemVBcmdTdHJpbmcgfSBmcm9tICcuL3Rva2VuaXplLWFyZy1zdHJpbmcuanMnO1xuaW1wb3J0IHsgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgfSBmcm9tICcuL3lhcmdzLXBhcnNlci10eXBlcy5qcyc7XG5pbXBvcnQgeyBjYW1lbENhc2UsIGRlY2FtZWxpemUsIGxvb2tzTGlrZU51bWJlciB9IGZyb20gJy4vc3RyaW5nLXV0aWxzLmpzJztcbmxldCBtaXhpbjtcbmV4cG9ydCBjbGFzcyBZYXJnc1BhcnNlciB7XG4gICAgY29uc3RydWN0b3IoX21peGluKSB7XG4gICAgICAgIG1peGluID0gX21peGluO1xuICAgIH1cbiAgICBwYXJzZShhcmdzSW5wdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgYWxpYXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFycmF5OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib29sZWFuOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZ09iamVjdHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvZXJjZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY291bnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVudlByZWZpeDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbmFyZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbm9ybWFsaXplOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdHJpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG51bWJlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgX186IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGtleTogdW5kZWZpbmVkXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgICAvLyBhbGxvdyBhIHN0cmluZyBhcmd1bWVudCB0byBiZSBwYXNzZWQgaW4gcmF0aGVyXG4gICAgICAgIC8vIHRoYW4gYW4gYXJndiBhcnJheS5cbiAgICAgICAgY29uc3QgYXJncyA9IHRva2VuaXplQXJnU3RyaW5nKGFyZ3NJbnB1dCk7XG4gICAgICAgIC8vIHRva2VuaXplQXJnU3RyaW5nIGFkZHMgZXh0cmEgcXVvdGVzIHRvIGFyZ3MgaWYgYXJnc0lucHV0IGlzIGEgc3RyaW5nXG4gICAgICAgIC8vIG9ubHkgc3RyaXAgdGhvc2UgZXh0cmEgcXVvdGVzIGluIHByb2Nlc3NWYWx1ZSBpZiBhcmdzSW5wdXQgaXMgYSBzdHJpbmdcbiAgICAgICAgY29uc3QgaW5wdXRJc1N0cmluZyA9IHR5cGVvZiBhcmdzSW5wdXQgPT09ICdzdHJpbmcnO1xuICAgICAgICAvLyBhbGlhc2VzIG1pZ2h0IGhhdmUgdHJhbnNpdGl2ZSByZWxhdGlvbnNoaXBzLCBub3JtYWxpemUgdGhpcy5cbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IGNvbWJpbmVBbGlhc2VzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5hbGlhcykpO1xuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAnYm9vbGVhbi1uZWdhdGlvbic6IHRydWUsXG4gICAgICAgICAgICAnY2FtZWwtY2FzZS1leHBhbnNpb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2NvbWJpbmUtYXJyYXlzJzogZmFsc2UsXG4gICAgICAgICAgICAnZG90LW5vdGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgICAgICdkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5JzogdHJ1ZSxcbiAgICAgICAgICAgICdmbGF0dGVuLWR1cGxpY2F0ZS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2dyZWVkeS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2hhbHQtYXQtbm9uLW9wdGlvbic6IGZhbHNlLFxuICAgICAgICAgICAgJ25hcmdzLWVhdHMtb3B0aW9ucyc6IGZhbHNlLFxuICAgICAgICAgICAgJ25lZ2F0aW9uLXByZWZpeCc6ICduby0nLFxuICAgICAgICAgICAgJ3BhcnNlLW51bWJlcnMnOiB0cnVlLFxuICAgICAgICAgICAgJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyc6IHRydWUsXG4gICAgICAgICAgICAncG9wdWxhdGUtLSc6IGZhbHNlLFxuICAgICAgICAgICAgJ3NldC1wbGFjZWhvbGRlci1rZXknOiBmYWxzZSxcbiAgICAgICAgICAgICdzaG9ydC1vcHRpb24tZ3JvdXBzJzogdHJ1ZSxcbiAgICAgICAgICAgICdzdHJpcC1hbGlhc2VkJzogZmFsc2UsXG4gICAgICAgICAgICAnc3RyaXAtZGFzaGVkJzogZmFsc2UsXG4gICAgICAgICAgICAndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnOiBmYWxzZVxuICAgICAgICB9LCBvcHRzLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5kZWZhdWx0KTtcbiAgICAgICAgY29uc3QgY29uZmlnT2JqZWN0cyA9IG9wdHMuY29uZmlnT2JqZWN0cyB8fCBbXTtcbiAgICAgICAgY29uc3QgZW52UHJlZml4ID0gb3B0cy5lbnZQcmVmaXg7XG4gICAgICAgIGNvbnN0IG5vdEZsYWdzT3B0aW9uID0gY29uZmlndXJhdGlvblsncG9wdWxhdGUtLSddO1xuICAgICAgICBjb25zdCBub3RGbGFnc0FyZ3YgPSBub3RGbGFnc09wdGlvbiA/ICctLScgOiAnXyc7XG4gICAgICAgIGNvbnN0IG5ld0FsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBkZWZhdWx0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyBhbGxvdyBhIGkxOG4gaGFuZGxlciB0byBiZSBwYXNzZWQgaW4sIGRlZmF1bHQgdG8gYSBmYWtlIG9uZSAodXRpbC5mb3JtYXQpLlxuICAgICAgICBjb25zdCBfXyA9IG9wdHMuX18gfHwgbWl4aW4uZm9ybWF0O1xuICAgICAgICBjb25zdCBmbGFncyA9IHtcbiAgICAgICAgICAgIGFsaWFzZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBhcnJheXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBib29sczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIHN0cmluZ3M6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBudW1iZXJzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY291bnRzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgbm9ybWFsaXplOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29uZmlnczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG5hcmdzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29lcmNpb25zOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAga2V5czogW11cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmUgPSAvXi0oWzAtOV0rKFxcLlswLTldKyk/fFxcLlswLTldKykkLztcbiAgICAgICAgY29uc3QgbmVnYXRlZEJvb2xlYW4gPSBuZXcgUmVnRXhwKCdeLS0nICsgY29uZmlndXJhdGlvblsnbmVnYXRpb24tcHJlZml4J10gKyAnKC4rKScpO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5hcnJheSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdHlwZW9mIG9wdCA9PT0gJ29iamVjdCcgPyBvcHQua2V5IDogb3B0O1xuICAgICAgICAgICAgLy8gYXNzaWduIHRvIGZsYWdzW2Jvb2xzfHN0cmluZ3N8bnVtYmVyc11cbiAgICAgICAgICAgIGNvbnN0IGFzc2lnbm1lbnQgPSBPYmplY3Qua2V5cyhvcHQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlGbGFnS2V5cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbjogJ2Jvb2xzJyxcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nOiAnc3RyaW5ncycsXG4gICAgICAgICAgICAgICAgICAgIG51bWJlcjogJ251bWJlcnMnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlGbGFnS2V5c1trZXldO1xuICAgICAgICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pLnBvcCgpO1xuICAgICAgICAgICAgLy8gYXNzaWduIGtleSB0byBiZSBjb2VyY2VkXG4gICAgICAgICAgICBpZiAoYXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZsYWdzW2Fzc2lnbm1lbnRdW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmxhZ3MuYXJyYXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5ib29sZWFuIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5ib29sc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMuc3RyaW5nIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5zdHJpbmdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5udW1iZXIgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLm51bWJlcnNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmNvdW50IHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5jb3VudHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLm5vcm1hbGl6ZSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZmxhZ3Mubm9ybWFsaXplW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubmFyZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMubmFyZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MubmFyZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY29lcmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb2VyY2UpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29lcmNpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmNvbmZpZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMuY29uZmlnKSB8fCB0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIFtdLmNvbmNhdChvcHRzLmNvbmZpZykuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5jb25maWdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdHMuY29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMuY29uZmlnKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29uZmlnc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgdGFibGUgdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgYWxsXG4gICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBhbGlhc2VzOiB7ZjogWydmb28nXSwgZm9vOiBbJ2YnXX1cbiAgICAgICAgZXh0ZW5kQWxpYXNlcyhvcHRzLmtleSwgYWxpYXNlcywgb3B0cy5kZWZhdWx0LCBmbGFncy5hcnJheXMpO1xuICAgICAgICAvLyBhcHBseSBkZWZhdWx0IHZhbHVlcyB0byBhbGwgYWxpYXNlcy5cbiAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgKGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1thbGlhc10gPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgbGV0IG5vdEZsYWdzID0gW107XG4gICAgICAgIGNvbnN0IGFyZ3YgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHsgXzogW10gfSk7XG4gICAgICAgIC8vIFRPRE8oYmNvZSk6IGZvciB0aGUgZmlyc3QgcGFzcyBhdCByZW1vdmluZyBvYmplY3QgcHJvdG90eXBlICB3ZSBkaWRuJ3RcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBwcm90b3R5cGVzIGZyb20gb2JqZWN0cyByZXR1cm5lZCBieSB0aGlzIEFQSSwgd2UgbWlnaHQgd2FudFxuICAgICAgICAvLyB0byBncmFkdWFsbHkgbW92ZSB0b3dhcmRzIGRvaW5nIHNvLlxuICAgICAgICBjb25zdCBhcmd2UmV0dXJuID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHRydW5jYXRlZEFyZyA9IGFyZy5yZXBsYWNlKC9eLXszLH0vLCAnLS0tJyk7XG4gICAgICAgICAgICBsZXQgYnJva2VuO1xuICAgICAgICAgICAgbGV0IGtleTtcbiAgICAgICAgICAgIGxldCBsZXR0ZXJzO1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgIC8vIGFueSB1bmtub3duIG9wdGlvbiAoZXhjZXB0IGZvciBlbmQtb2Ytb3B0aW9ucywgXCItLVwiKVxuICAgICAgICAgICAgaWYgKGFyZyAhPT0gJy0tJyAmJiAvXi0vLnRlc3QoYXJnKSAmJiBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgICAgICAvLyAtLS0sIC0tLT0sIC0tLS0sIGV0YyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRydW5jYXRlZEFyZy5tYXRjaCgvXi0tLSsoPXwkKS8pKSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW9ucyB3aXRob3V0IGtleSBuYW1lIGFyZSBpbnZhbGlkLlxuICAgICAgICAgICAgICAgIHB1c2hQb3NpdGlvbmFsKGFyZyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gLS0gc2VwYXJhdGVkIGJ5ID1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLis9LykgfHwgKCFjb25maWd1cmF0aW9uWydzaG9ydC1vcHRpb24tZ3JvdXBzJ10gJiYgYXJnLm1hdGNoKC9eLS4rPS8pKSkge1xuICAgICAgICAgICAgICAgIC8vIFVzaW5nIFtcXHNcXFNdIGluc3RlYWQgb2YgLiBiZWNhdXNlIGpzIGRvZXNuJ3Qgc3VwcG9ydCB0aGVcbiAgICAgICAgICAgICAgICAvLyAnZG90YWxsJyByZWdleCBtb2RpZmllci4gU2VlOlxuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEwNjgzMDgvMTMyMTZcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLS0/KFtePV0rKT0oW1xcc1xcU10qKSQvKTtcbiAgICAgICAgICAgICAgICAvLyBhcnJheXMgZm9ybWF0ID0gJy0tZj1hIGIgYydcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhtWzFdLCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwgbVsxXSwgYXJncywgbVsyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKG1bMV0sIGZsYWdzLm5hcmdzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hcmdzIGZvcm1hdCA9ICctLWY9bW9ua2V5IHdhc2hpbmcgY2F0J1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIG1bMV0sIGFyZ3MsIG1bMl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKSAmJiBjb25maWd1cmF0aW9uWydib29sZWFuLW5lZ2F0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSA/IFtmYWxzZV0gOiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIC0tIHNlcGFyYXRlZCBieSBzcGFjZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLisvKSB8fCAoIWNvbmZpZ3VyYXRpb25bJ3Nob3J0LW9wdGlvbi1ncm91cHMnXSAmJiBhcmcubWF0Y2goL14tW14tXSsvKSkpIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLS0/KC4rKS8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBtWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy0tZm9vIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy0tZm9vIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRydXRoeSBldmVuIGlmOiBmbGFncy5uYXJnc1trZXldID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCFuZXh0Lm1hdGNoKC9eLS8pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRvdC1ub3RhdGlvbiBmbGFnIHNlcGFyYXRlZCBieSAnPScuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2goL14tLlxcLi4rPS8pKSB7XG4gICAgICAgICAgICAgICAgbSA9IGFyZy5tYXRjaCgvXi0oW149XSspPShbXFxzXFxTXSopJC8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBzZXRBcmcobVsxXSwgbVsyXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRvdC1ub3RhdGlvbiBmbGFnIHNlcGFyYXRlZCBieSBzcGFjZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0uXFwuLisvKSAmJiAhYXJnLm1hdGNoKG5lZ2F0aXZlKSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLSguXFwuLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgIW5leHQubWF0Y2goL14tLykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi1bXi1dKy8pICYmICFhcmcubWF0Y2gobmVnYXRpdmUpKSB7XG4gICAgICAgICAgICAgICAgbGV0dGVycyA9IGFyZy5zbGljZSgxLCAtMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgICAgIGJyb2tlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnLnNsaWNlKGogKyAyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnLnNsaWNlKGogKyAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGxldHRlcnNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGZvcm1hdCA9ICctZj1hIGIgYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy1mPW1vbmtleSB3YXNoaW5nIGNhdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBsZXR0ZXIgaXMgYW4gYWxwaGFiZXRpYyBjaGFyYWN0ZXIgYW5kIG5leHQgdmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgL14tP1xcZCsoXFwuXFxkKik/KGUtP1xcZCspPyQvLnRlc3QobmV4dCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhuZXh0LCBmbGFncy5ib29scykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIGRlZmF1bHRWYWx1ZShsZXR0ZXJzW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga2V5ID0gYXJnLnNsaWNlKC0xKVswXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJyb2tlbiAmJiBrZXkgIT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy1mIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy1mIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRydXRoeSBldmVuIGlmOiBmbGFncy5uYXJnc1trZXldID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCEvXigtfC0tKVteLV0vLnRlc3QobmV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Lm1hdGNoKG5lZ2F0aXZlKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgvXih0cnVlfGZhbHNlKSQvLnRlc3QobmV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2goL14tWzAtOV0kLykgJiZcbiAgICAgICAgICAgICAgICBhcmcubWF0Y2gobmVnYXRpdmUpICYmXG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGFyZy5zbGljZSgxKSwgZmxhZ3MuYm9vbHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gc2luZ2xlLWRpZ2l0IGJvb2xlYW4gYWxpYXMsIGUuZzogeGFyZ3MgLTBcbiAgICAgICAgICAgICAgICBrZXkgPSBhcmcuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICAgICAgICAgICAgbm90RmxhZ3MgPSBhcmdzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmZpZ3VyYXRpb25bJ2hhbHQtYXQtbm9uLW9wdGlvbiddKSB7XG4gICAgICAgICAgICAgICAgbm90RmxhZ3MgPSBhcmdzLnNsaWNlKGkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBvcmRlciBvZiBwcmVjZWRlbmNlOlxuICAgICAgICAvLyAxLiBjb21tYW5kIGxpbmUgYXJnXG4gICAgICAgIC8vIDIuIHZhbHVlIGZyb20gZW52IHZhclxuICAgICAgICAvLyAzLiB2YWx1ZSBmcm9tIGNvbmZpZyBmaWxlXG4gICAgICAgIC8vIDQuIHZhbHVlIGZyb20gY29uZmlnIG9iamVjdHNcbiAgICAgICAgLy8gNS4gY29uZmlndXJlZCBkZWZhdWx0IHZhbHVlXG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCB0cnVlKTsgLy8gc3BlY2lhbCBjYXNlOiBjaGVjayBlbnYgdmFycyB0aGF0IHBvaW50IHRvIGNvbmZpZyBmaWxlXG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCBmYWxzZSk7XG4gICAgICAgIHNldENvbmZpZyhhcmd2KTtcbiAgICAgICAgc2V0Q29uZmlnT2JqZWN0cygpO1xuICAgICAgICBhcHBseURlZmF1bHRzQW5kQWxpYXNlcyhhcmd2LCBmbGFncy5hbGlhc2VzLCBkZWZhdWx0cywgdHJ1ZSk7XG4gICAgICAgIGFwcGx5Q29lcmNpb25zKGFyZ3YpO1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnc2V0LXBsYWNlaG9sZGVyLWtleSddKVxuICAgICAgICAgICAgc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpO1xuICAgICAgICAvLyBmb3IgYW55IGNvdW50cyBlaXRoZXIgbm90IGluIGFyZ3Mgb3Igd2l0aG91dCBhbiBleHBsaWNpdCBkZWZhdWx0LCBzZXQgdG8gMFxuICAgICAgICBPYmplY3Qua2V5cyhmbGFncy5jb3VudHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwga2V5LnNwbGl0KCcuJykpKVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gJy0tJyBkZWZhdWx0cyB0byB1bmRlZmluZWQuXG4gICAgICAgIGlmIChub3RGbGFnc09wdGlvbiAmJiBub3RGbGFncy5sZW5ndGgpXG4gICAgICAgICAgICBhcmd2W25vdEZsYWdzQXJndl0gPSBbXTtcbiAgICAgICAgbm90RmxhZ3MuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBhcmd2W25vdEZsYWdzQXJndl0ucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10gJiYgY29uZmlndXJhdGlvblsnc3RyaXAtZGFzaGVkJ10pIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZpbHRlcihrZXkgPT4ga2V5ICE9PSAnLS0nICYmIGtleS5pbmNsdWRlcygnLScpKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3Zba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydzdHJpcC1hbGlhc2VkJ10pIHtcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIFtdLmNvbmNhdCguLi5PYmplY3Qua2V5cyhhbGlhc2VzKS5tYXAoayA9PiBhbGlhc2VzW2tdKSkuZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10gJiYgYWxpYXMuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgYXJndlthbGlhcy5zcGxpdCgnLicpLm1hcChwcm9wID0+IGNhbWVsQ2FzZShwcm9wKSkuam9pbignLicpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3ZbYWxpYXNdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHVzaCBhcmd1bWVudCBpbnRvIHBvc2l0aW9uYWwgYXJyYXksIGFwcGx5aW5nIG51bWVyaWMgY29lcmNpb246XG4gICAgICAgIGZ1bmN0aW9uIHB1c2hQb3NpdGlvbmFsKGFyZykge1xuICAgICAgICAgICAgY29uc3QgbWF5YmVDb2VyY2VkTnVtYmVyID0gbWF5YmVDb2VyY2VOdW1iZXIoJ18nLCBhcmcpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgYXJndi5fLnB1c2gobWF5YmVDb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBob3cgbWFueSBhcmd1bWVudHMgc2hvdWxkIHdlIGNvbnN1bWUsIGJhc2VkXG4gICAgICAgIC8vIG9uIHRoZSBuYXJncyBvcHRpb24/XG4gICAgICAgIGZ1bmN0aW9uIGVhdE5hcmdzKGksIGtleSwgYXJncywgYXJnQWZ0ZXJFcXVhbFNpZ24pIHtcbiAgICAgICAgICAgIGxldCBpaTtcbiAgICAgICAgICAgIGxldCB0b0VhdCA9IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKTtcbiAgICAgICAgICAgIC8vIE5hTiBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgZm9yIHRoZSBhcnJheSB0eXBlLCBpbmRpY2F0aW5nIHRoYXQgb25lIG9yXG4gICAgICAgICAgICAvLyBtb3JlIHZhbHVlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICAgICAgICB0b0VhdCA9IHR5cGVvZiB0b0VhdCAhPT0gJ251bWJlcicgfHwgaXNOYU4odG9FYXQpID8gMSA6IHRvRWF0O1xuICAgICAgICAgICAgaWYgKHRvRWF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnQXJndW1lbnQgdW5leHBlY3RlZCBmb3I6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhdmFpbGFibGUgPSBpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgPyAwIDogMTtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWyduYXJncy1lYXRzLW9wdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgIC8vIGNsYXNzaWMgYmVoYXZpb3IsIHlhcmdzIGVhdHMgcG9zaXRpb25hbCBhbmQgZGFzaCBhcmd1bWVudHMuXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIC0gKGkgKyAxKSArIGF2YWlsYWJsZSA8IHRvRWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gdG9FYXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBuYXJncyB3aWxsIG5vdCBjb25zdW1lIGZsYWcgYXJndW1lbnRzLCBlLmcuLCAtYWJjLCAtLWZvbyxcbiAgICAgICAgICAgICAgICAvLyBhbmQgdGVybWluYXRlcyB3aGVuIG9uZSBpcyBvYnNlcnZlZC5cbiAgICAgICAgICAgICAgICBmb3IgKGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmdzW2lpXS5tYXRjaCgvXi1bXjAtOV0vKSB8fCBhcmdzW2lpXS5tYXRjaChuZWdhdGl2ZSkgfHwgaXNVbmtub3duT3B0aW9uQXNBcmcoYXJnc1tpaV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlKys7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlIDwgdG9FYXQpXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb25zdW1lZCA9IE1hdGgubWluKGF2YWlsYWJsZSwgdG9FYXQpO1xuICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgJiYgY29uc3VtZWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnQWZ0ZXJFcXVhbFNpZ24pO1xuICAgICAgICAgICAgICAgIGNvbnN1bWVkLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGlpID0gaSArIDE7IGlpIDwgKGNvbnN1bWVkICsgaSArIDEpOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnc1tpaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChpICsgY29uc3VtZWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFuIG9wdGlvbiBpcyBhbiBhcnJheSwgZWF0IGFsbCBub24taHlwaGVuYXRlZCBhcmd1bWVudHNcbiAgICAgICAgLy8gZm9sbG93aW5nIGl0Li4uIFlVTSFcbiAgICAgICAgLy8gZS5nLiwgLS1mb28gYXBwbGUgYmFuYW5hIGNhdCBiZWNvbWVzIFtcImFwcGxlXCIsIFwiYmFuYW5hXCIsIFwiY2F0XCJdXG4gICAgICAgIGZ1bmN0aW9uIGVhdEFycmF5KGksIGtleSwgYXJncywgYXJnQWZ0ZXJFcXVhbFNpZ24pIHtcbiAgICAgICAgICAgIGxldCBhcmdzVG9TZXQgPSBbXTtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gYXJnQWZ0ZXJFcXVhbFNpZ24gfHwgYXJnc1tpICsgMV07XG4gICAgICAgICAgICAvLyBJZiBib3RoIGFycmF5IGFuZCBuYXJncyBhcmUgY29uZmlndXJlZCwgZW5mb3JjZSB0aGUgbmFyZ3MgY291bnQ6XG4gICAgICAgICAgICBjb25zdCBuYXJnc0NvdW50ID0gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJiAhKC9eKHRydWV8ZmFsc2UpJC8udGVzdChuZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBhcmdzVG9TZXQucHVzaCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzVW5kZWZpbmVkKG5leHQpIHx8XG4gICAgICAgICAgICAgICAgKGlzVW5kZWZpbmVkKGFyZ0FmdGVyRXF1YWxTaWduKSAmJiAvXi0vLnRlc3QobmV4dCkgJiYgIW5lZ2F0aXZlLnRlc3QobmV4dCkgJiYgIWlzVW5rbm93bk9wdGlvbkFzQXJnKG5leHQpKSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBrZXlzIHdpdGhvdXQgdmFsdWUgPT0+IGFyZ3NUb1NldCByZW1haW5zIGFuIGVtcHR5IFtdXG4gICAgICAgICAgICAgICAgLy8gc2V0IHVzZXIgZGVmYXVsdCB2YWx1ZSwgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZWYWwgPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgICAgICAgICBhcmdzVG9TZXQgPSBBcnJheS5pc0FycmF5KGRlZlZhbCkgPyBkZWZWYWwgOiBbZGVmVmFsXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpbiAtLW9wdGlvbj12YWx1ZSBpcyBlYXRlbiBhcyBpc1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIGFyZ0FmdGVyRXF1YWxTaWduLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghY29uZmlndXJhdGlvblsnZ3JlZWR5LWFycmF5cyddICYmIGFyZ3NUb1NldC5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKG5hcmdzQ291bnQgJiYgdHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmIGFyZ3NUb1NldC5sZW5ndGggPj0gbmFyZ3NDb3VudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaWldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpID0gaWk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIG5leHQsIGlucHV0SXNTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBib3RoIGFycmF5IGFuZCBuYXJncyBhcmUgY29uZmlndXJlZCwgY3JlYXRlIGFuIGVycm9yIGlmIGxlc3MgdGhhblxuICAgICAgICAgICAgLy8gbmFyZ3MgcG9zaXRpb25hbHMgd2VyZSBmb3VuZC4gTmFOIGhhcyBzcGVjaWFsIG1lYW5pbmcsIGluZGljYXRpbmdcbiAgICAgICAgICAgIC8vIHRoYXQgYXQgbGVhc3Qgb25lIHZhbHVlIGlzIHJlcXVpcmVkIChtb3JlIGFyZSBva2F5KS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFyZ3NDb3VudCA9PT0gJ251bWJlcicgJiYgKChuYXJnc0NvdW50ICYmIGFyZ3NUb1NldC5sZW5ndGggPCBuYXJnc0NvdW50KSB8fFxuICAgICAgICAgICAgICAgIChpc05hTihuYXJnc0NvdW50KSAmJiBhcmdzVG9TZXQubGVuZ3RoID09PSAwKSkpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRBcmcoa2V5LCBhcmdzVG9TZXQpO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0QXJnKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3RlcyA9IGlucHV0SXNTdHJpbmcpIHtcbiAgICAgICAgICAgIGlmICgvLS8udGVzdChrZXkpICYmIGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGlhcyA9IGtleS5zcGxpdCgnLicpLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtZWxDYXNlKHByb3ApO1xuICAgICAgICAgICAgICAgIH0pLmpvaW4oJy4nKTtcbiAgICAgICAgICAgICAgICBhZGROZXdBbGlhcyhrZXksIGFsaWFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvY2Vzc1ZhbHVlKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3Rlcyk7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEtleSA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIHNwbGl0S2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAvLyBoYW5kbGUgcG9wdWxhdGluZyBhbGlhc2VzIG9mIHRoZSBmdWxsIGtleVxuICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBoYW5kbGUgcG9wdWxhdGluZyBhbGlhc2VzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBkb3Qtbm90YXRpb24ga2V5XG4gICAgICAgICAgICBpZiAoc3BsaXRLZXkubGVuZ3RoID4gMSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAoZmxhZ3MuYWxpYXNlc1tzcGxpdEtleVswXV0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cGFuZCBhbGlhcyB3aXRoIG5lc3RlZCBvYmplY3RzIGluIGtleVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0gW10uY29uY2F0KHNwbGl0S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgYS5zaGlmdCgpOyAvLyBudWtlIHRoZSBvbGQga2V5LlxuICAgICAgICAgICAgICAgICAgICBrZXlQcm9wZXJ0aWVzID0ga2V5UHJvcGVydGllcy5jb25jYXQoYSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBvcHVsYXRlIGFsaWFzIG9ubHkgaWYgaXMgbm90IGFscmVhZHkgYW4gYWxpYXMgb2YgdGhlIGZ1bGwga2V5XG4gICAgICAgICAgICAgICAgICAgIC8vIChhbHJlYWR5IHBvcHVsYXRlZCBhYm92ZSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKS5pbmNsdWRlcyhrZXlQcm9wZXJ0aWVzLmpvaW4oJy4nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCBub3JtYWxpemUgZ2V0dGVyIGFuZCBzZXR0ZXIgd2hlbiBrZXkgaXMgaW4gJ25vcm1hbGl6ZScgYnV0IGlzbid0IGFuIGFycmF5XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Mubm9ybWFsaXplKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBba2V5XS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKTtcbiAgICAgICAgICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJndlJldHVybiwga2V5LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG1peGluLm5vcm1hbGl6ZSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYWRkTmV3QWxpYXMoa2V5LCBhbGlhcykge1xuICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1trZXldICYmIGZsYWdzLmFsaWFzZXNba2V5XS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldID0gW2FsaWFzXTtcbiAgICAgICAgICAgICAgICBuZXdBbGlhc2VzW2FsaWFzXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2FsaWFzXSAmJiBmbGFncy5hbGlhc2VzW2FsaWFzXS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgYWRkTmV3QWxpYXMoYWxpYXMsIGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc1ZhbHVlKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3Rlcykge1xuICAgICAgICAgICAgLy8gc3RyaW5ncyBtYXkgYmUgcXVvdGVkLCBjbGVhbiB0aGlzIHVwIGFzIHdlIGFzc2lnbiB2YWx1ZXMuXG4gICAgICAgICAgICBpZiAoc2hvdWxkU3RyaXBRdW90ZXMpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBzdHJpcFF1b3Rlcyh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaGFuZGxlIHBhcnNpbmcgYm9vbGVhbiBhcmd1bWVudHMgLS1mb289dHJ1ZSAtLWJhciBmYWxzZS5cbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgfHwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsID09PSAndHJ1ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbClcbiAgICAgICAgICAgICAgICA/IHZhbC5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdik7IH0pXG4gICAgICAgICAgICAgICAgOiBtYXliZUNvZXJjZU51bWJlcihrZXksIHZhbCk7XG4gICAgICAgICAgICAvLyBpbmNyZW1lbnQgYSBjb3VudCBnaXZlbiBhcyBhcmcgKGVpdGhlciBubyB2YWx1ZSBvciB2YWx1ZSBwYXJzZWQgYXMgYm9vbGVhbilcbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpICYmIChpc1VuZGVmaW5lZCh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBpbmNyZW1lbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCBub3JtYWxpemVkIHZhbHVlIHdoZW4ga2V5IGlzIGluICdub3JtYWxpemUnIGFuZCBpbiAnYXJyYXlzJ1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsLm1hcCgodmFsKSA9PiB7IHJldHVybiBtaXhpbi5ub3JtYWxpemUodmFsKTsgfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1peGluLm5vcm1hbGl6ZSh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJ10gJiYga2V5ID09PSAnXycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5zdHJpbmdzKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZENvZXJjZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcih2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsncGFyc2UtbnVtYmVycyddICYmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dmFsdWV9YCkpKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENvZXJjZU51bWJlciB8fCAoIWlzVW5kZWZpbmVkKHZhbHVlKSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgYXJncyBmcm9tIGNvbmZpZy5qc29uIGZpbGUsIHRoaXMgc2hvdWxkIGJlXG4gICAgICAgIC8vIGFwcGxpZWQgbGFzdCBzbyB0aGF0IGRlZmF1bHRzIGNhbiBiZSBhcHBsaWVkLlxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWcoYXJndikge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIC8vIGV4cGFuZCBkZWZhdWx0cy9hbGlhc2VzLCBpbi1jYXNlIGFueSBoYXBwZW4gdG8gcmVmZXJlbmNlXG4gICAgICAgICAgICAvLyB0aGUgY29uZmlnLmpzb24gZmlsZS5cbiAgICAgICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGNvbmZpZ0xvb2t1cCwgZmxhZ3MuYWxpYXNlcywgZGVmYXVsdHMpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmxhZ3MuY29uZmlncykuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGFyZ3ZbY29uZmlnS2V5XSB8fCBjb25maWdMb29rdXBbY29uZmlnS2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbmZpZ1BhdGggPSBtaXhpbi5yZXNvbHZlKG1peGluLmN3ZCgpLCBjb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVDb25maWcgPSBmbGFncy5jb25maWdzW2NvbmZpZ0tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSByZXNvbHZlQ29uZmlnKHJlc29sdmVkQ29uZmlnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1peGluLnJlcXVpcmUocmVzb2x2ZWRDb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVubyB3aWxsIHJlY2VpdmUgYSBQZXJtaXNzaW9uRGVuaWVkIGVycm9yIGlmIGFuIGF0dGVtcHQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hZGUgdG8gbG9hZCBjb25maWcgd2l0aG91dCB0aGUgLS1hbGxvdy1yZWFkIGZsYWc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXgubmFtZSA9PT0gJ1Blcm1pc3Npb25EZW5pZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmd2W2NvbmZpZ0tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnSW52YWxpZCBKU09OIGNvbmZpZyBmaWxlOiAlcycsIGNvbmZpZ1BhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBhcmdzIGZyb20gY29uZmlnIG9iamVjdC5cbiAgICAgICAgLy8gaXQgcmVjdXJzaXZlbHkgY2hlY2tzIG5lc3RlZCBvYmplY3RzLlxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3QoY29uZmlnLCBwcmV2KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbEtleSA9IHByZXYgPyBwcmV2ICsgJy4nICsga2V5IDoga2V5O1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbm5lciBvYmplY3QgYW5kIHdlIGhhdmUgZG90LW5vdGF0aW9uXG4gICAgICAgICAgICAgICAgLy8gZW5hYmxlZCwgdHJlYXQgaW5uZXIgb2JqZWN0cyBpbiBjb25maWcgdGhlIHNhbWUgYXNcbiAgICAgICAgICAgICAgICAvLyBoZWF2aWx5IG5lc3RlZCBkb3Qgbm90YXRpb25zIChmb28uYmFyLmFwcGxlKS5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCBidXQgbm90IGFuIGFycmF5LCBjaGVjayBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdCh2YWx1ZSwgZnVsbEtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXR0aW5nIGFyZ3VtZW50cyB2aWEgQ0xJIHRha2VzIHByZWNlZGVuY2Ugb3ZlclxuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgd2l0aGluIHRoZSBjb25maWcgZmlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwgZnVsbEtleS5zcGxpdCgnLicpKSB8fCAoY2hlY2tBbGxBbGlhc2VzKGZ1bGxLZXksIGZsYWdzLmFycmF5cykgJiYgY29uZmlndXJhdGlvblsnY29tYmluZS1hcnJheXMnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhmdWxsS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgYWxsIGNvbmZpZyBvYmplY3RzIHBhc3NlZCBpbiBvcHRzXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbmZpZ09iamVjdHMoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZ09iamVjdHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnT2JqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChjb25maWdPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0Q29uZmlnT2JqZWN0KGNvbmZpZ09iamVjdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlFbnZWYXJzKGFyZ3YsIGNvbmZpZ09ubHkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW52UHJlZml4ID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSB0eXBlb2YgZW52UHJlZml4ID09PSAnc3RyaW5nJyA/IGVudlByZWZpeCA6ICcnO1xuICAgICAgICAgICAgY29uc3QgZW52ID0gbWl4aW4uZW52KCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhlbnYpLmZvckVhY2goZnVuY3Rpb24gKGVudlZhcikge1xuICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT09ICcnIHx8IGVudlZhci5sYXN0SW5kZXhPZihwcmVmaXgsIDApID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBhcnJheSBvZiBuZXN0ZWQga2V5cyBhbmQgY29udmVydCB0aGVtIHRvIGNhbWVsIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IGVudlZhci5zcGxpdCgnX18nKS5tYXAoZnVuY3Rpb24gKGtleSwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZShrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCgoY29uZmlnT25seSAmJiBmbGFncy5jb25maWdzW2tleXMuam9pbignLicpXSkgfHwgIWNvbmZpZ09ubHkpICYmICFoYXNLZXkoYXJndiwga2V5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXlzLmpvaW4oJy4nKSwgZW52W2VudlZhcl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlDb2VyY2lvbnMoYXJndikge1xuICAgICAgICAgICAgbGV0IGNvZXJjZTtcbiAgICAgICAgICAgIGNvbnN0IGFwcGxpZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFwcGxpZWQuaGFzKGtleSkpIHsgLy8gSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGNvZXJjZWQgdGhpcyBvcHRpb24gdmlhIG9uZSBvZiBpdHMgYWxpYXNlc1xuICAgICAgICAgICAgICAgICAgICBjb2VyY2UgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb2VyY2lvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1heWJlQ29lcmNlTnVtYmVyKGtleSwgY29lcmNlKGFyZ3Zba2V5XSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpKS5mb3JFYWNoKGFsaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQuYWRkKGFsaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbYWxpXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpIHtcbiAgICAgICAgICAgIGZsYWdzLmtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2V0IHBsYWNlaG9sZGVyIGtleXMgZm9yIGRvdCBub3RhdGlvbiBvcHRpb25zICdmb28uYmFyJy5cbiAgICAgICAgICAgICAgICBpZiAofmtleS5pbmRleE9mKCcuJykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3Zba2V5XSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgICAgIGFyZ3Zba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlEZWZhdWx0c0FuZEFsaWFzZXMob2JqLCBhbGlhc2VzLCBkZWZhdWx0cywgY2FuTG9nID0gZmFsc2UpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleShvYmosIGtleS5zcGxpdCgnLicpKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRLZXkob2JqLCBrZXkuc3BsaXQoJy4nKSwgZGVmYXVsdHNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5Mb2cpXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ZWRba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIChhbGlhc2VzW2tleV0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNLZXkob2JqLCB4LnNwbGl0KCcuJykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEtleShvYmosIHguc3BsaXQoJy4nKSwgZGVmYXVsdHNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0tleShvYmosIGtleXMpIHtcbiAgICAgICAgICAgIGxldCBvID0gb2JqO1xuICAgICAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSlcbiAgICAgICAgICAgICAgICBrZXlzID0gW2tleXMuam9pbignLicpXTtcbiAgICAgICAgICAgIGtleXMuc2xpY2UoMCwgLTEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIG8gPSAob1trZXldIHx8IHt9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleSBpbiBvO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNldEtleShvYmosIGtleXMsIHZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG9iajtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pXG4gICAgICAgICAgICAgICAga2V5cyA9IFtrZXlzLmpvaW4oJy4nKV07XG4gICAgICAgICAgICBrZXlzLnNsaWNlKDAsIC0xKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPKGJjb2UpOiBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIHlhcmdzLCBzd2l0Y2ggdG9cbiAgICAgICAgICAgICAgICAvLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG4gICAgICAgICAgICAgICAga2V5ID0gc2FuaXRpemVLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG8gPT09ICdvYmplY3QnICYmIG9ba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IG9ba2V5XSBpcyBhbiBhcnJheSwgYW5kIHRoYXQgdGhlIGxhc3QgaXRlbSBpcyBhbiBlbXB0eSBvYmplY3QuXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XS5wdXNoKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHt9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgZW1wdHkgb2JqZWN0IGF0IHRoZSBlbmQgb2YgdGhlIG9ba2V5XSBhcnJheSwgc28gc2V0IG8gdG8gdGhhdCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgbyA9IG9ba2V5XVtvW2tleV0ubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvID0gb1trZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gVE9ETyhiY29lKTogaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiB5YXJncywgc3dpdGNoIHRvXG4gICAgICAgICAgICAvLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzYW5pdGl6ZUtleShrZXlzW2tleXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlQXJyYXkgPSBjaGVja0FsbEFsaWFzZXMoa2V5cy5qb2luKCcuJyksIGZsYWdzLmFycmF5cyk7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBkdXBsaWNhdGUgPSBjb25maWd1cmF0aW9uWydkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5J107XG4gICAgICAgICAgICAvLyBuYXJncyBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gZHVwbGljYXRlXG4gICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykpIHtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgoIWlzVW5kZWZpbmVkKG9ba2V5XSkgJiYgZmxhZ3MubmFyZ3Nba2V5XSA9PT0gMSkgfHwgKEFycmF5LmlzQXJyYXkob1trZXldKSAmJiBvW2tleV0ubGVuZ3RoID09PSBmbGFncy5uYXJnc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBpbmNyZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IGluY3JlbWVudChvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSAmJiBpc1R5cGVBcnJheSAmJiBpc1ZhbHVlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gY29uZmlndXJhdGlvblsnZmxhdHRlbi1kdXBsaWNhdGUtYXJyYXlzJ10gPyBvW2tleV0uY29uY2F0KHZhbHVlKSA6IChBcnJheS5pc0FycmF5KG9ba2V5XVswXSkgPyBvW2tleV0gOiBbb1trZXldXSkuY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZHVwbGljYXRlICYmIEJvb2xlYW4oaXNUeXBlQXJyYXkpID09PSBCb29sZWFuKGlzVmFsdWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSBvW2tleV0uY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9ba2V5XSA9PT0gdW5kZWZpbmVkICYmIGlzVHlwZUFycmF5KSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gaXNWYWx1ZUFycmF5ID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHVwbGljYXRlICYmICEob1trZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpIHx8XG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGV4dGVuZCB0aGUgYWxpYXNlcyBsaXN0IHdpdGggaW5mZXJyZWQgYWxpYXNlcy5cbiAgICAgICAgZnVuY3Rpb24gZXh0ZW5kQWxpYXNlcyguLi5hcmdzKSB7XG4gICAgICAgICAgICBhcmdzLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9iaiB8fCB7fSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNob3J0LWNpcmN1aXQgaWYgd2UndmUgYWxyZWFkeSBhZGRlZCBhIGtleVxuICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgYWxpYXNlcyBhcnJheSwgZm9yIGV4YW1wbGUgaXQgbWlnaHRcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3QgaW4gYm90aCAnb3B0cy5kZWZhdWx0JyBhbmQgJ29wdHMua2V5Jy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldID0gW10uY29uY2F0KGFsaWFzZXNba2V5XSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBcIi0tb3B0aW9uLW5hbWVcIiwgYWxzbyBzZXQgYXJndi5vcHRpb25OYW1lXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5jb25jYXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoLy0vLnRlc3QoeCkgJiYgY29uZmlndXJhdGlvblsnY2FtZWwtY2FzZS1leHBhbnNpb24nXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBjYW1lbENhc2UoeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT09IGtleSAmJiBmbGFncy5hbGlhc2VzW2tleV0uaW5kZXhPZihjKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FsaWFzZXNbY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBcIi0tb3B0aW9uTmFtZVwiLCBhbHNvIHNldCBhcmd2WydvcHRpb24tbmFtZSddXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5jb25jYXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5sZW5ndGggPiAxICYmIC9bQS1aXS8udGVzdCh4KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGRlY2FtZWxpemUoeCwgJy0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPT0ga2V5ICYmIGZsYWdzLmFsaWFzZXNba2V5XS5pbmRleE9mKGMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0ucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWxpYXNlc1tjXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNbeF0gPSBba2V5XS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldLmZpbHRlcihmdW5jdGlvbiAoeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICE9PSB5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWcpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpO1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZsYWcpO1xuICAgICAgICAgICAgY29uc3Qgc2V0QWxpYXMgPSB0b0NoZWNrLmZpbmQoa2V5ID0+IGtleXMuaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgICAgICByZXR1cm4gc2V0QWxpYXMgPyBmbGFnW3NldEFsaWFzXSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0FueUZsYWcoa2V5KSB7XG4gICAgICAgICAgICBjb25zdCBmbGFnc0tleXMgPSBPYmplY3Qua2V5cyhmbGFncyk7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gW10uY29uY2F0KGZsYWdzS2V5cy5tYXAoayA9PiBmbGFnc1trXSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2suc29tZShmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGZsYWcpID8gZmxhZy5pbmNsdWRlcyhrZXkpIDogZmxhZ1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzRmxhZ3NNYXRjaGluZyhhcmcsIC4uLnBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gW10uY29uY2F0KC4uLnBhdHRlcm5zKTtcbiAgICAgICAgICAgIHJldHVybiB0b0NoZWNrLnNvbWUoZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IGFyZy5tYXRjaChwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2ggJiYgaGFzQW55RmxhZyhtYXRjaFsxXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBiYXNlZCBvbiBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgc2hvcnQgZmxhZyBncm91cCBwYXJzaW5nIGxvZ2ljXG4gICAgICAgIGZ1bmN0aW9uIGhhc0FsbFNob3J0RmxhZ3MoYXJnKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLCBvciBkb2Vzbid0IHN0YXJ0IHdpdGggYSBzaW5nbGUgaHlwaGVuLCBpdCdzIG5vdCBhIHNob3J0IGZsYWcgZ3JvdXBcbiAgICAgICAgICAgIGlmIChhcmcubWF0Y2gobmVnYXRpdmUpIHx8ICFhcmcubWF0Y2goL14tW14tXSsvKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBoYXNBbGxGbGFncyA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgICAgIGNvbnN0IGxldHRlcnMgPSBhcmcuc2xpY2UoMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZXR0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV4dCA9IGFyZy5zbGljZShqICsgMik7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNBbnlGbGFnKGxldHRlcnNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0FsbEZsYWdzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHx8XG4gICAgICAgICAgICAgICAgICAgIG5leHQgPT09ICctJyB8fFxuICAgICAgICAgICAgICAgICAgICAoL1tBLVphLXpdLy50ZXN0KGxldHRlcnNbal0pICYmIC9eLT9cXGQrKFxcLlxcZCopPyhlLT9cXGQrKT8kLy50ZXN0KG5leHQpKSB8fFxuICAgICAgICAgICAgICAgICAgICAobGV0dGVyc1tqICsgMV0gJiYgbGV0dGVyc1tqICsgMV0ubWF0Y2goL1xcVy8pKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGFzQWxsRmxhZ3M7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaXNVbmtub3duT3B0aW9uQXNBcmcoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvblsndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnXSAmJiBpc1Vua25vd25PcHRpb24oYXJnKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1Vua25vd25PcHRpb24oYXJnKSB7XG4gICAgICAgICAgICBhcmcgPSBhcmcucmVwbGFjZSgvXi17Myx9LywgJy0tJyk7XG4gICAgICAgICAgICAvLyBpZ25vcmUgbmVnYXRpdmUgbnVtYmVyc1xuICAgICAgICAgICAgaWYgKGFyZy5tYXRjaChuZWdhdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgc2hvcnQgb3B0aW9uIGdyb3VwIGFuZCBhbGwgb2YgdGhlbSBhcmUgY29uZmlndXJlZCwgaXQgaXNuJ3QgdW5rbm93blxuICAgICAgICAgICAgaWYgKGhhc0FsbFNob3J0RmxhZ3MoYXJnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGUuZy4gJy0tY291bnQ9MidcbiAgICAgICAgICAgIGNvbnN0IGZsYWdXaXRoRXF1YWxzID0gL14tKyhbXj1dKz8pPVtcXHNcXFNdKiQvO1xuICAgICAgICAgICAgLy8gZS5nLiAnLWEnIG9yICctLWFyZydcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbEZsYWcgPSAvXi0rKFtePV0rPykkLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hLSdcbiAgICAgICAgICAgIGNvbnN0IGZsYWdFbmRpbmdJbkh5cGhlbiA9IC9eLSsoW149XSs/KS0kLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hYmMxMjMnXG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5EaWdpdHMgPSAvXi0rKFtePV0rP1xcZCspJC87XG4gICAgICAgICAgICAvLyBlLmcuICctYS91c3IvbG9jYWwnXG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyA9IC9eLSsoW149XSs/KVxcVysuKiQvO1xuICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBmbGFnIHN0eWxlcywgaW5jbHVkaW5nIG5lZ2F0ZWRCb29sZWFuLCBhIHBhdHRlcm4gZGVmaW5lZCBuZWFyIHRoZSBzdGFydCBvZiB0aGUgcGFyc2UgbWV0aG9kXG4gICAgICAgICAgICByZXR1cm4gIWhhc0ZsYWdzTWF0Y2hpbmcoYXJnLCBmbGFnV2l0aEVxdWFscywgbmVnYXRlZEJvb2xlYW4sIG5vcm1hbEZsYWcsIGZsYWdFbmRpbmdJbkh5cGhlbiwgZmxhZ0VuZGluZ0luRGlnaXRzLCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHBpY2sgYSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIC8vIGZvciBhbiBvcHRpb24gYmFzZWQgb24gbmFtZSBhbmQgdHlwZS5cbiAgICAgICAgZnVuY3Rpb24gZGVmYXVsdFZhbHVlKGtleSkge1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSAmJlxuICAgICAgICAgICAgICAgIGAke2tleX1gIGluIGRlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdEZvclR5cGUoZ3Vlc3NUeXBlKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHJldHVybiBhIGRlZmF1bHQgdmFsdWUsIGdpdmVuIHRoZSB0eXBlIG9mIGEgZmxhZy4sXG4gICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRGb3JUeXBlKHR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQk9PTEVBTl06IHRydWUsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LlNUUklOR106ICcnLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5OVU1CRVJdOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkFSUkFZXTogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZGVmW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdpdmVuIGEgZmxhZywgZW5mb3JjZSBhIGRlZmF1bHQgdHlwZS5cbiAgICAgICAgZnVuY3Rpb24gZ3Vlc3NUeXBlKGtleSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLnN0cmluZ3MpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5TVFJJTkc7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSlcbiAgICAgICAgICAgICAgICB0eXBlID0gRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuTlVNQkVSO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSlcbiAgICAgICAgICAgICAgICB0eXBlID0gRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQVJSQVk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZChudW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudW0gPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayB1c2VyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGluY29uc2lzdGVuY2llc1xuICAgICAgICBmdW5jdGlvbiBjaGVja0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgICAgICAvLyBjb3VudCBrZXlzIHNob3VsZCBub3QgYmUgc2V0IGFzIGFycmF5L25hcmdcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZmluZChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgY29uZmlndXJhdGlvbjogJXMsIG9wdHMuY291bnQgZXhjbHVkZXMgb3B0cy5hcnJheS4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb246ICVzLCBvcHRzLmNvdW50IGV4Y2x1ZGVzIG9wdHMubmFyZy4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGlhc2VzOiBPYmplY3QuYXNzaWduKHt9LCBmbGFncy5hbGlhc2VzKSxcbiAgICAgICAgICAgIGFyZ3Y6IE9iamVjdC5hc3NpZ24oYXJndlJldHVybiwgYXJndiksXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdGVkOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0ZWQpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgbmV3QWxpYXNlczogT2JqZWN0LmFzc2lnbih7fSwgbmV3QWxpYXNlcylcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyBpZiBhbnkgYWxpYXNlcyByZWZlcmVuY2UgZWFjaCBvdGhlciwgd2Ugc2hvdWxkXG4vLyBtZXJnZSB0aGVtIHRvZ2V0aGVyLlxuZnVuY3Rpb24gY29tYmluZUFsaWFzZXMoYWxpYXNlcykge1xuICAgIGNvbnN0IGFsaWFzQXJyYXlzID0gW107XG4gICAgY29uc3QgY29tYmluZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjaGFuZ2UgPSB0cnVlO1xuICAgIC8vIHR1cm4gYWxpYXMgbG9va3VwIGhhc2gge2tleTogWydhbGlhczEnLCAnYWxpYXMyJ119IGludG9cbiAgICAvLyBhIHNpbXBsZSBhcnJheSBbJ2tleScsICdhbGlhczEnLCAnYWxpYXMyJ11cbiAgICBPYmplY3Qua2V5cyhhbGlhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgYWxpYXNBcnJheXMucHVzaChbXS5jb25jYXQoYWxpYXNlc1trZXldLCBrZXkpKTtcbiAgICB9KTtcbiAgICAvLyBjb21iaW5lIGFycmF5cyB1bnRpbCB6ZXJvIGNoYW5nZXMgYXJlXG4gICAgLy8gbWFkZSBpbiBhbiBpdGVyYXRpb24uXG4gICAgd2hpbGUgKGNoYW5nZSkge1xuICAgICAgICBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaWkgPSBpICsgMTsgaWkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBhbGlhc0FycmF5c1tpXS5maWx0ZXIoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzQXJyYXlzW2lpXS5pbmRleE9mKHYpICE9PSAtMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5c1tpXSA9IGFsaWFzQXJyYXlzW2ldLmNvbmNhdChhbGlhc0FycmF5c1tpaV0pO1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5cy5zcGxpY2UoaWksIDEpO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbWFwIGFycmF5cyBiYWNrIHRvIHRoZSBoYXNoLWxvb2t1cCAoZGUtZHVwZSB3aGlsZVxuICAgIC8vIHdlJ3JlIGF0IGl0KS5cbiAgICBhbGlhc0FycmF5cy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhc0FycmF5KSB7XG4gICAgICAgIGFsaWFzQXJyYXkgPSBhbGlhc0FycmF5LmZpbHRlcihmdW5jdGlvbiAodiwgaSwgc2VsZikge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZih2KSA9PT0gaTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGxhc3RBbGlhcyA9IGFsaWFzQXJyYXkucG9wKCk7XG4gICAgICAgIGlmIChsYXN0QWxpYXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbGFzdEFsaWFzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29tYmluZWRbbGFzdEFsaWFzXSA9IGFsaWFzQXJyYXk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29tYmluZWQ7XG59XG4vLyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGEgY291bnQgaXMgZ2l2ZW4gYXMgYW4gYXJnXG4vLyBpdCBpcyBOT1QgY2FsbGVkIHRvIHNldCBhIGRlZmF1bHQgdmFsdWVcbi8vIHRodXMgd2UgY2FuIHN0YXJ0IHRoZSBjb3VudCBhdCAxIGluc3RlYWQgb2YgMFxuZnVuY3Rpb24gaW5jcmVtZW50KG9yaWcpIHtcbiAgICByZXR1cm4gb3JpZyAhPT0gdW5kZWZpbmVkID8gb3JpZyArIDEgOiAxO1xufVxuLy8gVE9ETyhiY29lKTogaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiB5YXJncywgc3dpdGNoIHRvXG4vLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG5mdW5jdGlvbiBzYW5pdGl6ZUtleShrZXkpIHtcbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJylcbiAgICAgICAgcmV0dXJuICdfX19wcm90b19fXyc7XG4gICAgcmV0dXJuIGtleTtcbn1cbmZ1bmN0aW9uIHN0cmlwUXVvdGVzKHZhbCkge1xuICAgIHJldHVybiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgKHZhbFswXSA9PT0gXCInXCIgfHwgdmFsWzBdID09PSAnXCInKSAmJlxuICAgICAgICB2YWxbdmFsLmxlbmd0aCAtIDFdID09PSB2YWxbMF0pXG4gICAgICAgID8gdmFsLnN1YnN0cmluZygxLCB2YWwubGVuZ3RoIC0gMSlcbiAgICAgICAgOiB2YWw7XG59XG4iLCJpbXBvcnQgeyBZRXJyb3IgfSBmcm9tICcuLi95ZXJyb3IuanMnO1xubGV0IHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncyA9IFtdO1xubGV0IHNoaW07XG5leHBvcnQgZnVuY3Rpb24gYXBwbHlFeHRlbmRzKGNvbmZpZywgY3dkLCBtZXJnZUV4dGVuZHMsIF9zaGltKSB7XG4gICAgc2hpbSA9IF9zaGltO1xuICAgIGxldCBkZWZhdWx0Q29uZmlnID0ge307XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdleHRlbmRzJykpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcuZXh0ZW5kcyAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdENvbmZpZztcbiAgICAgICAgY29uc3QgaXNQYXRoID0gL1xcLmpzb258XFwuLipyYyQvLnRlc3QoY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICBsZXQgcGF0aFRvRGVmYXVsdCA9IG51bGw7XG4gICAgICAgIGlmICghaXNQYXRoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBhdGhUb0RlZmF1bHQgPSByZXF1aXJlLnJlc29sdmUoY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGF0aFRvRGVmYXVsdCA9IGdldFBhdGhUb0RlZmF1bHRDb25maWcoY3dkLCBjb25maWcuZXh0ZW5kcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tGb3JDaXJjdWxhckV4dGVuZHMocGF0aFRvRGVmYXVsdCk7XG4gICAgICAgIHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncy5wdXNoKHBhdGhUb0RlZmF1bHQpO1xuICAgICAgICBkZWZhdWx0Q29uZmlnID0gaXNQYXRoXG4gICAgICAgICAgICA/IEpTT04ucGFyc2Uoc2hpbS5yZWFkRmlsZVN5bmMocGF0aFRvRGVmYXVsdCwgJ3V0ZjgnKSlcbiAgICAgICAgICAgIDogcmVxdWlyZShjb25maWcuZXh0ZW5kcyk7XG4gICAgICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5kcztcbiAgICAgICAgZGVmYXVsdENvbmZpZyA9IGFwcGx5RXh0ZW5kcyhkZWZhdWx0Q29uZmlnLCBzaGltLnBhdGguZGlybmFtZShwYXRoVG9EZWZhdWx0KSwgbWVyZ2VFeHRlbmRzLCBzaGltKTtcbiAgICB9XG4gICAgcHJldmlvdXNseVZpc2l0ZWRDb25maWdzID0gW107XG4gICAgcmV0dXJuIG1lcmdlRXh0ZW5kc1xuICAgICAgICA/IG1lcmdlRGVlcChkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdENvbmZpZywgY29uZmlnKTtcbn1cbmZ1bmN0aW9uIGNoZWNrRm9yQ2lyY3VsYXJFeHRlbmRzKGNmZ1BhdGgpIHtcbiAgICBpZiAocHJldmlvdXNseVZpc2l0ZWRDb25maWdzLmluZGV4T2YoY2ZnUGF0aCkgPiAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgWUVycm9yKGBDaXJjdWxhciBleHRlbmRlZCBjb25maWd1cmF0aW9uczogJyR7Y2ZnUGF0aH0nLmApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFBhdGhUb0RlZmF1bHRDb25maWcoY3dkLCBwYXRoVG9FeHRlbmQpIHtcbiAgICByZXR1cm4gc2hpbS5wYXRoLnJlc29sdmUoY3dkLCBwYXRoVG9FeHRlbmQpO1xufVxuZnVuY3Rpb24gbWVyZ2VEZWVwKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgICBmdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgY29uZmlnMSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnMikpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGNvbmZpZzJba2V5XSkgJiYgaXNPYmplY3QodGFyZ2V0W2tleV0pKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IG1lcmdlRGVlcChjb25maWcxW2tleV0sIGNvbmZpZzJba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvbmZpZzJba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuIiwiZnVuY3Rpb24gZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCgpIHtcbiAgICBpZiAoaXNCdW5kbGVkRWxlY3Ryb25BcHAoKSlcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgcmV0dXJuIDE7XG59XG5mdW5jdGlvbiBpc0J1bmRsZWRFbGVjdHJvbkFwcCgpIHtcbiAgICByZXR1cm4gaXNFbGVjdHJvbkFwcCgpICYmICFwcm9jZXNzLmRlZmF1bHRBcHA7XG59XG5mdW5jdGlvbiBpc0VsZWN0cm9uQXBwKCkge1xuICAgIHJldHVybiAhIXByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb247XG59XG5leHBvcnQgZnVuY3Rpb24gaGlkZUJpbihhcmd2KSB7XG4gICAgcmV0dXJuIGFyZ3Yuc2xpY2UoZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCgpICsgMSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvY2Vzc0FyZ3ZCaW4oKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuYXJndltnZXRQcm9jZXNzQXJndkJpbkluZGV4KCldO1xufVxuIiwiZXhwb3J0IGNsYXNzIFlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICAgICAgc3VwZXIobXNnIHx8ICd5YXJncyBlcnJvcicpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnWUVycm9yJztcbiAgICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBZRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHthcHBseUV4dGVuZHMgYXMgX2FwcGx5RXh0ZW5kc30gZnJvbSAnLi4vYnVpbGQvbGliL3V0aWxzL2FwcGx5LWV4dGVuZHMuanMnO1xuaW1wb3J0IHtoaWRlQmlufSBmcm9tICcuLi9idWlsZC9saWIvdXRpbHMvcHJvY2Vzcy1hcmd2LmpzJztcbmltcG9ydCBQYXJzZXIgZnJvbSAneWFyZ3MtcGFyc2VyJztcbmltcG9ydCBzaGltIGZyb20gJy4uL2xpYi9wbGF0Zm9ybS1zaGltcy9lc20ubWpzJztcblxuY29uc3QgYXBwbHlFeHRlbmRzID0gKGNvbmZpZywgY3dkLCBtZXJnZUV4dGVuZHMpID0+IHtcbiAgcmV0dXJuIF9hcHBseUV4dGVuZHMoY29uZmlnLCBjd2QsIG1lcmdlRXh0ZW5kcywgc2hpbSk7XG59O1xuXG5leHBvcnQge2FwcGx5RXh0ZW5kcywgaGlkZUJpbiwgUGFyc2VyfTtcbiIsIid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBub3RTdHJpY3RFcXVhbCwgc3RyaWN0RXF1YWwgfSBmcm9tICdhc3NlcnQnXG5pbXBvcnQgY2xpdWkgZnJvbSAnY2xpdWknXG5pbXBvcnQgZXNjYWxhZGUgZnJvbSAnZXNjYWxhZGUvc3luYydcbmltcG9ydCB7IGluc3BlY3QgfSBmcm9tICd1dGlsJ1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnXG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCBQYXJzZXIgZnJvbSAneWFyZ3MtcGFyc2VyJ1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGV4dG5hbWUsIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAncGF0aCdcbmltcG9ydCB7IGdldFByb2Nlc3NBcmd2QmluIH0gZnJvbSAnLi4vLi4vYnVpbGQvbGliL3V0aWxzL3Byb2Nlc3MtYXJndi5qcydcbmltcG9ydCB7IFlFcnJvciB9IGZyb20gJy4uLy4uL2J1aWxkL2xpYi95ZXJyb3IuanMnXG5pbXBvcnQgeTE4biBmcm9tICd5MThuJ1xuXG5jb25zdCBSRVFVSVJFX0VSUk9SID0gJ3JlcXVpcmUgaXMgbm90IHN1cHBvcnRlZCBieSBFU00nXG5jb25zdCBSRVFVSVJFX0RJUkVDVE9SWV9FUlJPUiA9ICdsb2FkaW5nIGEgZGlyZWN0b3J5IG9mIGNvbW1hbmRzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IGZvciBFU00nXG5cbmxldCBfX2Rpcm5hbWU7XG50cnkge1xuICBfX2Rpcm5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG59IGNhdGNoIChlKSB7XG4gIF9fZGlybmFtZSA9IHByb2Nlc3MuY3dkKCk7XG59XG5jb25zdCBtYWluRmlsZW5hbWUgPSBfX2Rpcm5hbWUuc3Vic3RyaW5nKDAsIF9fZGlybmFtZS5sYXN0SW5kZXhPZignbm9kZV9tb2R1bGVzJykpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFzc2VydDoge1xuICAgIG5vdFN0cmljdEVxdWFsLFxuICAgIHN0cmljdEVxdWFsXG4gIH0sXG4gIGNsaXVpLFxuICBmaW5kVXA6IGVzY2FsYWRlLFxuICBnZXRFbnY6IChrZXkpID0+IHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZba2V5XVxuICB9LFxuICBpbnNwZWN0LFxuICBnZXRDYWxsZXJGaWxlOiAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFlFcnJvcihSRVFVSVJFX0RJUkVDVE9SWV9FUlJPUilcbiAgfSxcbiAgZ2V0UHJvY2Vzc0FyZ3ZCaW4sXG4gIG1haW5GaWxlbmFtZTogbWFpbkZpbGVuYW1lIHx8IHByb2Nlc3MuY3dkKCksXG4gIFBhcnNlcixcbiAgcGF0aDoge1xuICAgIGJhc2VuYW1lLFxuICAgIGRpcm5hbWUsXG4gICAgZXh0bmFtZSxcbiAgICByZWxhdGl2ZSxcbiAgICByZXNvbHZlXG4gIH0sXG4gIHByb2Nlc3M6IHtcbiAgICBhcmd2OiAoKSA9PiBwcm9jZXNzLmFyZ3YsXG4gICAgY3dkOiBwcm9jZXNzLmN3ZCxcbiAgICBlbWl0V2FybmluZzogKHdhcm5pbmcsIHR5cGUpID0+IHByb2Nlc3MuZW1pdFdhcm5pbmcod2FybmluZywgdHlwZSksXG4gICAgZXhlY1BhdGg6ICgpID0+IHByb2Nlc3MuZXhlY1BhdGgsXG4gICAgZXhpdDogcHJvY2Vzcy5leGl0LFxuICAgIG5leHRUaWNrOiBwcm9jZXNzLm5leHRUaWNrLFxuICAgIHN0ZENvbHVtbnM6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgOiBudWxsXG4gIH0sXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVxdWlyZTogKCkgPT4ge1xuICAgIHRocm93IG5ldyBZRXJyb3IoUkVRVUlSRV9FUlJPUilcbiAgfSxcbiAgcmVxdWlyZURpcmVjdG9yeTogKCkgPT4ge1xuICAgIHRocm93IG5ldyBZRXJyb3IoUkVRVUlSRV9ESVJFQ1RPUllfRVJST1IpXG4gIH0sXG4gIHN0cmluZ1dpZHRoOiAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIFsuLi5zdHJdLmxlbmd0aFxuICB9LFxuICB5MThuOiB5MThuKHtcbiAgICBkaXJlY3Rvcnk6IHJlc29sdmUoX19kaXJuYW1lLCAnLi4vLi4vLi4vbG9jYWxlcycpLFxuICAgIHVwZGF0ZUZpbGVzOiBmYWxzZVxuICB9KVxufVxuIiwiLy8gVE9ETzogY29uc29saWRhdGUgb24gdXNpbmcgYSBoZWxwZXJzIGZpbGUgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLCB3aGljaFxuLy8gaXMgdGhlIGFwcHJvYWNoIGN1cnJlbnRseSB1c2VkIHRvIGV4cG9ydCBQYXJzZXIgYW5kIGFwcGx5RXh0ZW5kcyBmb3IgRVNNOlxuaW1wb3J0IHBrZyBmcm9tICcuL2J1aWxkL2luZGV4LmNqcyc7XG5jb25zdCB7YXBwbHlFeHRlbmRzLCBjanNQbGF0Zm9ybVNoaW0sIFBhcnNlciwgcHJvY2Vzc0FyZ3YsIFlhcmdzfSA9IHBrZztcbllhcmdzLmFwcGx5RXh0ZW5kcyA9IChjb25maWcsIGN3ZCwgbWVyZ2VFeHRlbmRzKSA9PiB7XG4gIHJldHVybiBhcHBseUV4dGVuZHMoY29uZmlnLCBjd2QsIG1lcmdlRXh0ZW5kcywgY2pzUGxhdGZvcm1TaGltKTtcbn07XG5ZYXJncy5oaWRlQmluID0gcHJvY2Vzc0FyZ3YuaGlkZUJpbjtcbllhcmdzLlBhcnNlciA9IFBhcnNlcjtcbmV4cG9ydCBkZWZhdWx0IFlhcmdzO1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0bG9hZGVkOiBmYWxzZSxcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG5cdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX187XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwidmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mID8gKG9iaikgPT4gKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSA6IChvYmopID0+IChvYmouX19wcm90b19fKTtcbnZhciBsZWFmUHJvdG90eXBlcztcbi8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLy8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLy8gbW9kZSAmIDE2OiByZXR1cm4gdmFsdWUgd2hlbiBpdCdzIFByb21pc2UtbGlrZVxuLy8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuX193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcblx0aWYobW9kZSAmIDEpIHZhbHVlID0gdGhpcyh2YWx1ZSk7XG5cdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG5cdGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUpIHtcblx0XHRpZigobW9kZSAmIDQpICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcblx0XHRpZigobW9kZSAmIDE2KSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHZhbHVlO1xuXHR9XG5cdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG5cdHZhciBkZWYgPSB7fTtcblx0bGVhZlByb3RvdHlwZXMgPSBsZWFmUHJvdG90eXBlcyB8fCBbbnVsbCwgZ2V0UHJvdG8oe30pLCBnZXRQcm90byhbXSksIGdldFByb3RvKGdldFByb3RvKV07XG5cdGZvcih2YXIgY3VycmVudCA9IG1vZGUgJiAyICYmIHZhbHVlOyB0eXBlb2YgY3VycmVudCA9PSAnb2JqZWN0JyAmJiAhfmxlYWZQcm90b3R5cGVzLmluZGV4T2YoY3VycmVudCk7IGN1cnJlbnQgPSBnZXRQcm90byhjdXJyZW50KSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGN1cnJlbnQpLmZvckVhY2goKGtleSkgPT4gKGRlZltrZXldID0gKCkgPT4gKHZhbHVlW2tleV0pKSk7XG5cdH1cblx0ZGVmWydkZWZhdWx0J10gPSAoKSA9PiAodmFsdWUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGRlZik7XG5cdHJldHVybiBucztcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5mID0ge307XG4vLyBUaGlzIGZpbGUgY29udGFpbnMgb25seSB0aGUgZW50cnkgY2h1bmsuXG4vLyBUaGUgY2h1bmsgbG9hZGluZyBmdW5jdGlvbiBmb3IgYWRkaXRpb25hbCBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18uZSA9IChjaHVua0lkKSA9PiB7XG5cdHJldHVybiBQcm9taXNlLmFsbChPYmplY3Qua2V5cyhfX3dlYnBhY2tfcmVxdWlyZV9fLmYpLnJlZHVjZSgocHJvbWlzZXMsIGtleSkgPT4ge1xuXHRcdF9fd2VicGFja19yZXF1aXJlX18uZltrZXldKGNodW5rSWQsIHByb21pc2VzKTtcblx0XHRyZXR1cm4gcHJvbWlzZXM7XG5cdH0sIFtdKSk7XG59OyIsIi8vIFRoaXMgZnVuY3Rpb24gYWxsb3cgdG8gcmVmZXJlbmNlIGFzeW5jIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy51ID0gKGNodW5rSWQpID0+IHtcblx0Ly8gcmV0dXJuIHVybCBmb3IgZmlsZW5hbWVzIGJhc2VkIG9uIHRlbXBsYXRlXG5cdHJldHVybiBcIlwiICsgY2h1bmtJZCArIFwiLmNqc1wiO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBjaHVua3Ncbi8vIFwiMVwiIG1lYW5zIFwibG9hZGVkXCIsIG90aGVyd2lzZSBub3QgbG9hZGVkIHlldFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJmdWxsX2Rpc2tfZW5jcnlwdGlvblwiOiAxXG59O1xuXG4vLyBubyBvbiBjaHVua3MgbG9hZGVkXG5cbnZhciBpbnN0YWxsQ2h1bmsgPSAoY2h1bmspID0+IHtcblx0dmFyIG1vcmVNb2R1bGVzID0gY2h1bmsubW9kdWxlcywgY2h1bmtJZHMgPSBjaHVuay5pZHMsIHJ1bnRpbWUgPSBjaHVuay5ydW50aW1lO1xuXHRmb3IodmFyIG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcblx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0fVxuXHR9XG5cdGlmKHJ1bnRpbWUpIHJ1bnRpbWUoX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBjaHVua0lkcy5sZW5ndGg7IGkrKylcblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHNbaV1dID0gMTtcblxufTtcblxuLy8gcmVxdWlyZSgpIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcbl9fd2VicGFja19yZXF1aXJlX18uZi5yZXF1aXJlID0gKGNodW5rSWQsIHByb21pc2VzKSA9PiB7XG5cdC8vIFwiMVwiIGlzIHRoZSBzaWduYWwgZm9yIFwiYWxyZWFkeSBsb2FkZWRcIlxuXHRpZighaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0aWYodHJ1ZSkgeyAvLyBhbGwgY2h1bmtzIGhhdmUgSlNcblx0XHRcdGluc3RhbGxDaHVuayhyZXF1aXJlKFwiLi9cIiArIF9fd2VicGFja19yZXF1aXJlX18udShjaHVua0lkKSkpO1xuXHRcdH0gZWxzZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAxO1xuXHR9XG59O1xuXG4vLyBubyBleHRlcm5hbCBpbnN0YWxsIGNodW5rXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3QiLCIiLCIvLyBtb2R1bGUgY2FjaGUgYXJlIHVzZWQgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvdGVzdHMvZnVsbF9kaXNrX2VuY3J5cHRpb24udHNcIik7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLDZCQUE2QjtBQUMzRCxpQkFBaUI7QUFDakI7QUFDQSw4QkFBOEIsNkJBQTZCO0FBQzNELGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsdUJBQXVCO0FBQy9DO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHVEQUF1RCxTQUFTO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0ZBQW9GLGtCQUFrQjtBQUN0RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBZTtBQUNmOzs7Ozs7Ozs7Ozs7QUMvUGE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLDJDQUEyQyxtQkFBTyxDQUFDLGdFQUFjO0FBQ2pFLHFDQUFxQyxtQkFBTyxDQUFDLG9EQUFRO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDVmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLHNDQUFzQyxtQkFBTyxDQUFDLDJEQUFjO0FBQzVELHVDQUF1QyxtQkFBTyxDQUFDLDZEQUFlO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDelNhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixzQ0FBc0MsbUJBQU8sQ0FBQywyREFBYztBQUM1RCx1Q0FBdUMsbUJBQU8sQ0FBQyw2REFBZTtBQUM5RCxxQ0FBcUMsbUJBQU8sQ0FBQyxvREFBUTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFlO0FBQ2Y7Ozs7Ozs7Ozs7OztBQ2hDYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0Isb0NBQW9DLG1CQUFPLENBQUMsa0RBQU87QUFDbkQsc0NBQXNDLG1CQUFPLENBQUMsMkRBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDZmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLHFDQUFxQyxtQkFBTyxDQUFDLG9EQUFRO0FBQ3JELHNDQUFzQyxtQkFBTyxDQUFDLDJEQUFjO0FBQzVELHVDQUF1QyxtQkFBTyxDQUFDLDZEQUFlO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGlDQUFpQztBQUMzRDtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDak5hO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixvQ0FBb0MsbUJBQU8sQ0FBQyxrREFBTztBQUNuRCxzQ0FBc0MsbUJBQU8sQ0FBQywyREFBYztBQUM1RCx1Q0FBdUMsbUJBQU8sQ0FBQyw2REFBZTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDakNhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixvQ0FBb0MsbUJBQU8sQ0FBQyxrREFBTztBQUNuRCxzQ0FBc0MsbUJBQU8sQ0FBQywyREFBYztBQUM1RCx1Q0FBdUMsbUJBQU8sQ0FBQyw2REFBZTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFlO0FBQ2Y7Ozs7Ozs7Ozs7OztBQ2hEYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0Isb0NBQW9DLG1CQUFPLENBQUMsa0RBQU87QUFDbkQsaURBQWlELG1CQUFPLENBQUMsNEVBQW9CO0FBQzdFLHNDQUFzQyxtQkFBTyxDQUFDLDJEQUFjO0FBQzVELHVDQUF1QyxtQkFBTyxDQUFDLDZEQUFlO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qix3QkFBd0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEZBQTBGLGtCQUFrQjtBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsYUFBYTtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBZTtBQUNmOzs7Ozs7Ozs7Ozs7QUMxWmE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsY0FBYyxtQkFBTyxDQUFDLGlEQUFPO0FBQzdCLHNDQUFzQyxtQkFBTyxDQUFDLHNEQUFTO0FBQ3ZELDBDQUEwQyxtQkFBTyxDQUFDLDhEQUFhO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG1CQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFVBQVU7QUFDbEM7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGVBQWU7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsZ0JBQWdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFlO0FBQ2Y7Ozs7Ozs7Ozs7OztBQ3RWYTtBQUNiLDhDQUE2QyxFQUFFLGFBQWEsRUFBQztBQUM3RCxjQUFjLG1CQUFPLENBQUMsaURBQU87QUFDN0Isc0NBQXNDLG1CQUFPLENBQUMsc0RBQVM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQXVCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFdBQVc7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFNBQVM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixTQUFTO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLHVCQUF1QjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsdUJBQXVCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsVUFBVTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qix1QkFBdUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qix1QkFBdUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFdBQVc7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixXQUFXO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWU7QUFDZjs7Ozs7Ozs7Ozs7O0FDMVVhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWMsbUJBQU8sQ0FBQyxpREFBTztBQUM3QixzQ0FBc0MsbUJBQU8sQ0FBQyxzREFBUztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGFBQWE7QUFDakMsb0JBQW9CLG1CQUFtQjtBQUN2Qyx3QkFBd0IsdUNBQXVDO0FBQy9ELHFCQUFxQixjQUFjO0FBQ25DLHNCQUFzQixvQkFBb0I7QUFDMUMsd0JBQXdCLFdBQVc7QUFDbkMscUJBQXFCLFdBQVc7QUFDaEMsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0EsZ0VBQWdFLFFBQVEsMEJBQTBCLFlBQVk7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFVBQVU7QUFDNUQ7QUFDQSxpQ0FBaUMsVUFBVTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxRQUFRLFlBQVksVUFBVTtBQUM3RTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RCxXQUFXLEVBQUUsVUFBVTtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDLDJGQUEyRjtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCxRQUFRO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELGlCQUFpQjtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsMkJBQTJCLElBQUk7QUFDakcsa0RBQWtELHlCQUF5QjtBQUMzRTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELFFBQVE7QUFDekQ7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLDRDQUE0Qzs7QUFFNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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O0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxRQUFRO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdURBQXVELFFBQVE7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QyxRQUFRO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsUUFBUTtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSwyQ0FBMkM7QUFDM0MsMkJBQTJCO0FBQzNCO0FBQ0EsK0JBQStCLDZCQUE2QjtBQUM1RDtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQSw2REFBNkQsUUFBUTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QseURBQXlELFFBQVE7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQSx5REFBeUQsUUFBUTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBeUQsUUFBUTtBQUNqRTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsUUFBUTtBQUN6RDtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQSxtREFBbUQsUUFBUTtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsUUFBUTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsUUFBUTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0EsZ0NBQWdDLGdDQUFtQjs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGdCQUFnQixzQ0FBc0Msa0JBQWtCO0FBQ3BGLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxFQUFFO0FBQ0YsZ0RBQWdELGFBQWE7QUFDN0QsbUJBQW1CLGdDQUFtQjtBQUN0QyxlQUFlLGdDQUFtQjtBQUNsQyxvQkFBb0IsZ0NBQW1CO0FBQ3ZDLFlBQVksZ0NBQW1CO0FBQy9CLGdCQUFnQixnQ0FBbUI7QUFDbkMsZUFBZSxnQ0FBbUI7QUFDbEMsd0JBQXdCLGdDQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQiw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQSxnQ0FBZ0MsZ0NBQW1COztBQUVuRDtBQUNBLGdEQUFnRCxhQUFhO0FBQzdELGdCQUFnQixnQ0FBbUI7QUFDbkMsdUJBQXVCLGdDQUFtQjtBQUMxQyxrQkFBa0IsZ0NBQW1CO0FBQ3JDLFlBQVksZ0NBQW1CO0FBQy9CLGlCQUFpQixnQ0FBbUI7QUFDcEMsZ0JBQWdCLGdDQUFtQjtBQUNuQyxlQUFlLGdDQUFtQjtBQUNsQztBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHVCQUF1QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdUJBQXVCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFCQUFxQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSwwQkFBMEI7QUFDMUIsOEJBQThCO0FBQzlCO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0QsMEJBQTBCO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRCwwQkFBMEI7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMEJBQTBCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLDRCQUE0QjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsd0JBQXdCO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLHdCQUF3QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsNkJBQTZCO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGlCQUFpQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMkJBQTJCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw2QkFBNkI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsbUJBQW1CO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxjQUFjO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RkFBOEYsY0FBYztBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qiw4QkFBOEI7QUFDOUI7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSxjQUFjO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLGFBQWE7QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFLGFBQWE7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsb0JBQW9CO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELG1FQUFtRTtBQUMvSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRFQUE0RTtBQUM1RTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQyx1QkFBdUI7QUFDdkIsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsU0FBUztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEIsK0JBQStCO0FBQy9CLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsaUJBQWlCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLE1BQU0sSUFBSSxNQUFNO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxnQkFBZ0IsaUJBQWlCLEVBQUU7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsc0JBQXNCO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsK0ZBQStGO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxhQUFhO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87QUFDUDtBQUNBLGdDQUFnQyxpQ0FBbUI7O0FBRW5EO0FBQ0EsZ0RBQWdELGFBQWE7QUFDN0QsdUJBQXVCLGlDQUFtQjtBQUMxQyxpQkFBaUIsaUNBQW1CO0FBQ3BDLGVBQWUsaUNBQW1CO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFCQUFxQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOzs7QUFHQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOzs7Ozs7Ozs7O0FDcGpOQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0QsUUFBUTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrREFBa0QsUUFBUTtBQUMxRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsUUFBUTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsU0FBUztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1EQUFtRCxTQUFTO0FBQzVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxlQUFlOztBQUU1RDtBQUNBLENBQUM7QUFDRDs7Ozs7Ozs7Ozs7QUNweUJBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7Ozs7Ozs7Ozs7QUNyVWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsZUFBZTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFFBQVE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLFFBQVE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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QUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN0REEsK0dBQStDOzs7Ozs7Ozs7OztBQ0EvQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxlQUFlO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGVBQWU7QUFDMUIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM09hO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9DQUFvQztBQUNuRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSwwQ0FBMEMsNEJBQTRCO0FBQ3RFLENBQUM7QUFDRDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0EsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGtCQUFrQixHQUFHLGVBQWU7QUFDcEMsMEJBQTBCLG1CQUFPLENBQUMsa0JBQU07QUFDeEMsMkJBQTJCLG1CQUFPLENBQUMsb0JBQU87QUFDMUMsY0FBYyxtQkFBTyxDQUFDLGdCQUFLO0FBQzNCLG9DQUFvQyxtQkFBTyxDQUFDLG9EQUFXO0FBQ3ZELHFCQUFxQixtQkFBTyxDQUFDLDJEQUFZO0FBQ3pDLGdDQUFnQyxtQkFBTyxDQUFDLGdEQUFPO0FBQy9DLHlCQUF5QixtQkFBTyxDQUFDLDhEQUFnQjtBQUNqRCwwQkFBMEIsbUJBQU8sQ0FBQyxxRUFBaUI7QUFDbkQsMkJBQTJCLG1CQUFPLENBQUMsdUVBQWtCO0FBQ3JELDRCQUE0QixtQkFBTyxDQUFDLHlFQUFtQjtBQUN2RCw0QkFBNEIsbUJBQU8sQ0FBQyx5RUFBbUI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsU0FBUztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGlCQUFpQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0MsU0FBUyxJQUFJLEtBQUs7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixTQUFTLEdBQUcsTUFBTTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFLE1BQU07QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCOzs7Ozs7Ozs7OztBQ3JJYTs7QUFFYixlQUFlLDZDQUFvQjs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsZUFBZTtBQUMxQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0I7Ozs7Ozs7Ozs7O0FDM0d0QixXQUFXLG1CQUFPLENBQUMseUNBQU07QUFDekIsVUFBVSxtQkFBTyxDQUFDLDREQUFlO0FBQ2pDLFNBQVMsbUJBQU8sQ0FBQyxjQUFJOztBQUVyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUgsZUFBZSxxQ0FBcUM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2pGQTtBQUNBO0FBQ0EsSUFBSSxtQkFBTyxDQUFDLHVFQUFtQjs7Ozs7Ozs7Ozs7QUNGL0I7Ozs7Ozs7Ozs7OztBQ0FhOztBQUViLFNBQVMsbUJBQU8sQ0FBQyxjQUFJO0FBQ3JCLFNBQVMsOENBQW9CO0FBQzdCLFlBQVksaURBQXVCO0FBQ25DLFlBQVksaURBQXVCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qjs7Ozs7Ozs7Ozs7QUNyRnZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpREFBaUQsS0FBSztBQUN0RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEscUJBQXFCLG1CQUFPLENBQUMsa0ZBQTJCO0FBQ3hELFFBQVEsZ0JBQWdCLEVBQUUsbUJBQU8sQ0FBQyw0REFBZ0I7QUFDbEQsWUFBWSxtQkFBTyxDQUFDLGdFQUFrQjtBQUN0QyxjQUFjLG1CQUFPLENBQUMsa0VBQW1CO0FBQ3pDLGVBQWUsbUJBQU8sQ0FBQyx5REFBVTtBQUNqQyxjQUFjLG1CQUFPLENBQUMsdURBQVM7Ozs7Ozs7Ozs7O0FDNUkvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtREFBbUQsU0FBUztBQUM1RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHFCQUFxQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsd0VBQVc7QUFDL0Isd0JBQXdCLFdBQVc7O0FBRW5DLHFCQUFxQixtQkFBTyxDQUFDLGtGQUEyQjtBQUN4RCxtQkFBbUIsbUJBQU8sQ0FBQyxpRUFBYztBQUN6QyxjQUFjLG1CQUFPLENBQUMsa0VBQW1CO0FBQ3pDLGVBQWUsbUJBQU8sQ0FBQyx5REFBVTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEVBQUUsbUJBQU8sQ0FBQyw0REFBZ0I7QUFDNUIsUUFBUSxzQ0FBc0MsRUFBRSxtQkFBTyxDQUFDLDBFQUF1Qjs7QUFFL0U7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGlCQUFpQixFQUFFLFFBQVEsT0FBTztBQUNsQyxNQUFNO0FBQ047QUFDQSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTztBQUMxQyxNQUFNO0FBQ047QUFDQSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDaEMsUUFBUSxHQUFHLEVBQUUsR0FBRyxPQUFPO0FBQ3ZCLE1BQU07QUFDTjtBQUNBLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQzNCLFFBQVEsR0FBRyxFQUFFLEdBQUcsT0FBTztBQUN2Qjs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLGlCQUFpQixFQUFFLE1BQU0sR0FBRyxHQUFHLE9BQU87QUFDdEMsTUFBTTtBQUNOO0FBQ0EsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPO0FBQ2hELFFBQVE7QUFDUixtQkFBbUIsRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsT0FBTztBQUMzQztBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDcEMsWUFBWSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTztBQUNoQyxVQUFVO0FBQ1YscUJBQXFCLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQ3BDLFlBQVksR0FBRyxFQUFFLEdBQUcsT0FBTztBQUMzQjtBQUNBLFFBQVE7QUFDUixtQkFBbUIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDbEMsVUFBVSxHQUFHLE9BQU87QUFDcEI7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EscUJBQXFCLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDL0IsV0FBVyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU87QUFDcEMsVUFBVTtBQUNWLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxHQUFHO0FBQy9CLFdBQVcsRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLE9BQU87QUFDL0I7QUFDQSxRQUFRO0FBQ1IsbUJBQW1CLEVBQUUsR0FBRyxFQUFFLEdBQUc7QUFDN0IsVUFBVSxHQUFHLE9BQU87QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGVBQWUsU0FBUyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRztBQUN2QyxNQUFNO0FBQ04saUJBQWlCLEVBQUUsTUFBTSxJQUFJLEdBQUcsT0FBTztBQUN2QyxNQUFNO0FBQ04saUJBQWlCLEVBQUUsR0FBRyxFQUFFLElBQUk7QUFDNUIsUUFBUSxHQUFHLEVBQUUsR0FBRyxPQUFPO0FBQ3ZCOztBQUVBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osZ0JBQWdCLEdBQUcsTUFBTSxrQkFBa0I7QUFDM0MsSUFBSTtBQUNKLGdCQUFnQixHQUFHLEdBQUcsR0FBRyxJQUFJLGtCQUFrQjtBQUMvQyxJQUFJO0FBQ0osZ0JBQWdCLEtBQUs7QUFDckIsSUFBSTtBQUNKLGdCQUFnQixLQUFLLEVBQUUsa0JBQWtCO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osYUFBYSxRQUFRO0FBQ3JCLElBQUk7QUFDSixhQUFhLEdBQUcsR0FBRyxRQUFRO0FBQzNCLElBQUk7QUFDSixjQUFjLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUk7QUFDcEMsSUFBSTtBQUNKLGFBQWEsR0FBRyxHQUFHLEdBQUcsR0FBRyxRQUFRO0FBQ2pDLElBQUk7QUFDSixjQUFjLEdBQUc7QUFDakI7O0FBRUEsWUFBWSxNQUFNLEVBQUUsR0FBRztBQUN2Qjs7QUFFQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDMWhCQSxjQUFjLG1CQUFPLENBQUMsa0VBQW1CO0FBQ3pDLFFBQVEsK0JBQStCLEVBQUUsbUJBQU8sQ0FBQywwRUFBdUI7QUFDeEUsUUFBUSxnQkFBZ0IsRUFBRSxtQkFBTyxDQUFDLDREQUFnQjs7QUFFbEQscUJBQXFCLG1CQUFPLENBQUMsa0ZBQTJCO0FBQ3hELFFBQVEscUJBQXFCLEVBQUUsbUJBQU8sQ0FBQyw4RUFBeUI7QUFDaEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ04sMEVBQTBFLGVBQWU7QUFDekY7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQyxZQUFZO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLFdBQVcsR0FBRyxXQUFXLEdBQUcsV0FBVztBQUM3RDtBQUNBLDBCQUEwQiwwQkFBMEI7QUFDcEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsUUFBUTtBQUMvRDtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IscUJBQXFCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQzdTQSxjQUFjLG1CQUFPLENBQUMseURBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNMQSxXQUFXLG1CQUFPLENBQUMsbURBQU07QUFDekIsWUFBWSxtQkFBTyxDQUFDLHFEQUFPO0FBQzNCLFdBQVcsbUJBQU8sQ0FBQyxtREFBTTtBQUN6QixZQUFZLG1CQUFPLENBQUMscURBQU87QUFDM0IsV0FBVyxtQkFBTyxDQUFDLG1EQUFNO0FBQ3pCLFlBQVksbUJBQU8sQ0FBQyxxREFBTzs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0MsR0FBRztBQUNsRDtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDbkRBLGVBQWUsbUJBQU8sQ0FBQyxrRUFBbUI7QUFDMUMsY0FBYyxtQkFBTyxDQUFDLHlEQUFTO0FBQy9CLFFBQVEsZ0JBQWdCLEVBQUUsbUJBQU8sQ0FBQyw0REFBZ0I7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRSxTQUFTO0FBQzFFLDREQUE0RCxTQUFTOztBQUVyRSxrQkFBa0IsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU07QUFDL0Q7QUFDQTs7Ozs7Ozs7Ozs7QUMzREEsZUFBZSxtQkFBTyxDQUFDLGtFQUFtQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDTkEsZ0JBQWdCLG1CQUFPLENBQUMsNkRBQVc7QUFDbkM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxlQUFlLG1CQUFPLENBQUMsa0VBQW1CO0FBQzFDO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDSkEsY0FBYyxtQkFBTyxDQUFDLDREQUFZOztBQUVsQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7OztBQ2hFQSxnQkFBZ0IsbUJBQU8sQ0FBQyw2REFBVztBQUNuQztBQUNBOzs7Ozs7Ozs7OztBQ0ZBLGdCQUFnQixtQkFBTyxDQUFDLDZEQUFXO0FBQ25DO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkEsZ0JBQWdCLG1CQUFPLENBQUMsNkRBQVc7QUFDbkM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxlQUFlLG1CQUFPLENBQUMsa0VBQW1COztBQUUxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNsQkEsZ0JBQWdCLG1CQUFPLENBQUMsNkRBQVc7QUFDbkM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxnQkFBZ0IsbUJBQU8sQ0FBQyw2REFBVztBQUNuQztBQUNBOzs7Ozs7Ozs7OztBQ0ZBLGVBQWUsbUJBQU8sQ0FBQyxrRUFBbUI7QUFDMUM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxlQUFlLG1CQUFPLENBQUMsa0VBQW1CO0FBQzFDO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkEsZ0JBQWdCLG1CQUFPLENBQUMsNkRBQVc7QUFDbkM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxlQUFlLG1CQUFPLENBQUMsa0VBQW1CO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDZkEsZUFBZSxtQkFBTyxDQUFDLGtFQUFtQjtBQUMxQztBQUNBOzs7Ozs7Ozs7OztBQ0ZBLGNBQWMsbUJBQU8sQ0FBQyx5REFBUztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ0xBLGdCQUFnQixtQkFBTyxDQUFDLDZEQUFXO0FBQ25DO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkEscUJBQXFCLG1CQUFPLENBQUMseUVBQWlCO0FBQzlDO0FBQ0E7Ozs7Ozs7Ozs7O0FDRkEsY0FBYyxtQkFBTyxDQUFDLGdFQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNUQSxxQkFBcUIsbUJBQU8sQ0FBQyx5RUFBaUI7QUFDOUM7QUFDQTs7Ozs7Ozs7Ozs7QUNGQSxjQUFjLG1CQUFPLENBQUMseURBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNMQTtBQUNBLG1CQUFtQixtQkFBTyxDQUFDLDJEQUFlO0FBQzFDLGtCQUFrQixtQkFBTyxDQUFDLHlFQUFzQjtBQUNoRCxlQUFlLG1CQUFPLENBQUMsaUVBQWtCO0FBQ3pDLG9CQUFvQixtQkFBTyxDQUFDLDZFQUF3QjtBQUNwRCxjQUFjLG1CQUFPLENBQUMsbUVBQW1CO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDekMsY0FBYyxtQkFBTyxDQUFDLG1FQUFtQjtBQUN6QyxZQUFZLG1CQUFPLENBQUMsK0RBQWlCO0FBQ3JDLGFBQWEsbUJBQU8sQ0FBQyxpRUFBa0I7QUFDdkMsY0FBYyxtQkFBTyxDQUFDLG1FQUFtQjtBQUN6QyxjQUFjLG1CQUFPLENBQUMsbUVBQW1CO0FBQ3pDLGNBQWMsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDekMsbUJBQW1CLG1CQUFPLENBQUMsNkVBQXdCO0FBQ25ELGdCQUFnQixtQkFBTyxDQUFDLHVFQUFxQjtBQUM3QyxpQkFBaUIsbUJBQU8sQ0FBQyx5RUFBc0I7QUFDL0MscUJBQXFCLG1CQUFPLENBQUMsbUZBQTJCO0FBQ3hELHFCQUFxQixtQkFBTyxDQUFDLG1GQUEyQjtBQUN4RCxhQUFhLG1CQUFPLENBQUMsaUVBQWtCO0FBQ3ZDLGNBQWMsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDekMsV0FBVyxtQkFBTyxDQUFDLDZEQUFnQjtBQUNuQyxXQUFXLG1CQUFPLENBQUMsNkRBQWdCO0FBQ25DLFdBQVcsbUJBQU8sQ0FBQyw2REFBZ0I7QUFDbkMsWUFBWSxtQkFBTyxDQUFDLCtEQUFpQjtBQUNyQyxZQUFZLG1CQUFPLENBQUMsK0RBQWlCO0FBQ3JDLFlBQVksbUJBQU8sQ0FBQywrREFBaUI7QUFDckMsWUFBWSxtQkFBTyxDQUFDLCtEQUFpQjtBQUNyQyxlQUFlLG1CQUFPLENBQUMscUVBQW9CO0FBQzNDLG1CQUFtQixtQkFBTyxDQUFDLHlFQUFzQjtBQUNqRCxjQUFjLG1CQUFPLENBQUMsK0RBQWlCO0FBQ3ZDLGtCQUFrQixtQkFBTyxDQUFDLDJFQUF1QjtBQUNqRCxzQkFBc0IsbUJBQU8sQ0FBQywrRUFBeUI7QUFDdkQsc0JBQXNCLG1CQUFPLENBQUMsK0VBQXlCO0FBQ3ZELHNCQUFzQixtQkFBTyxDQUFDLCtFQUF5QjtBQUN2RCxtQkFBbUIsbUJBQU8sQ0FBQyx5RUFBc0I7QUFDakQsbUJBQW1CLG1CQUFPLENBQUMsNkRBQWdCO0FBQzNDLGdCQUFnQixtQkFBTyxDQUFDLGlFQUFrQjtBQUMxQyxZQUFZLG1CQUFPLENBQUMseURBQWM7QUFDbEMsWUFBWSxtQkFBTyxDQUFDLHlEQUFjO0FBQ2xDLG1CQUFtQixtQkFBTyxDQUFDLHVFQUFxQjtBQUNoRCxzQkFBc0IsbUJBQU8sQ0FBQyxtRUFBbUI7QUFDakQsZUFBZSxtQkFBTyxDQUFDLCtEQUFpQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3hGQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3RCQTtBQUNBLG9DQUFvQyxhQUFhO0FBQ2pELG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxFQUFFLG1CQUFPLENBQUMsZ0VBQWE7QUFDekIsY0FBYyxtQkFBTyxDQUFDLHdEQUFTO0FBQy9COztBQUVBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLGVBQWUsY0FBYztBQUM3QixZQUFZLFdBQVc7QUFDdkIsVUFBVSxTQUFTO0FBQ25COztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE1BQU0sWUFBWSxPQUFPLElBQUksS0FBSztBQUNsRCxnQkFBZ0IsTUFBTSxZQUFZLE9BQU8sSUFBSSxLQUFLO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9EQUFvRCxpQkFBaUI7O0FBRXJFO0FBQ0E7O0FBRUEsK0JBQStCLHlCQUF5QjtBQUN4RCx1QkFBdUIseUJBQXlCO0FBQ2hELHVCQUF1Qix5QkFBeUI7O0FBRWhELG9DQUFvQyw4QkFBOEI7QUFDbEUsNEJBQTRCLDhCQUE4QjtBQUMxRCw0QkFBNEIsOEJBQThCOztBQUUxRDtBQUNBOztBQUVBLDBDQUEwQztBQUMxQyxDQUFDLEdBQUcsNEJBQTRCOztBQUVoQywrQ0FBK0M7QUFDL0MsQ0FBQyxHQUFHLDRCQUE0Qjs7QUFFaEM7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQyxDQUFDLFFBQVEsNEJBQTRCOztBQUVyQyx3Q0FBd0M7QUFDeEMsQ0FBQyxRQUFRLGlDQUFpQzs7QUFFMUM7QUFDQTs7QUFFQSxrQ0FBa0MsaUJBQWlCOztBQUVuRDtBQUNBO0FBQ0E7O0FBRUEsK0JBQStCO0FBQy9CLENBQUMsUUFBUSx1QkFBdUI7O0FBRWhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7QUFDOUIsQ0FBQyxFQUFFLGtCQUFrQjtBQUNyQixlQUFlOztBQUVmLHdCQUF3QixpQkFBaUI7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxDQUFDLEVBQUUsdUJBQXVCO0FBQzFCLGVBQWU7O0FBRWYseUJBQXlCLGtCQUFrQjs7QUFFM0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLDhCQUE4QjtBQUN0RSxtQ0FBbUMseUJBQXlCOztBQUU1RCx1Q0FBdUMsd0JBQXdCO0FBQy9ELDZCQUE2Qix3QkFBd0I7QUFDckQsNkJBQTZCLHdCQUF3QjtBQUNyRCx5QkFBeUIsa0JBQWtCO0FBQzNDLGtDQUFrQztBQUNsQzs7QUFFQSw0Q0FBNEMsNkJBQTZCO0FBQ3pFLGtDQUFrQyw2QkFBNkI7QUFDL0Qsa0NBQWtDLDZCQUE2QjtBQUMvRCw4QkFBOEIsdUJBQXVCO0FBQ3JELHVDQUF1QztBQUN2Qzs7QUFFQSwwQkFBMEIsWUFBWSxNQUFNLG1CQUFtQjtBQUMvRCwrQkFBK0IsWUFBWSxNQUFNLHdCQUF3Qjs7QUFFekU7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QixvQkFBb0IsSUFBSSxFQUFFLDJCQUEyQjtBQUNyRCwwQkFBMEIsSUFBSSwyQkFBMkI7QUFDekQsMEJBQTBCLElBQUksMkJBQTJCO0FBQ3pELHlCQUF5QixtQkFBbUI7QUFDNUM7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDLG9CQUFvQixhQUFhO0FBQ2pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDLGlCQUFpQjtBQUNuRCx3QkFBd0I7O0FBRXhCLHlCQUF5QixpQkFBaUIsRUFBRSxtQkFBbUI7QUFDL0QsOEJBQThCLGlCQUFpQixFQUFFLHdCQUF3Qjs7QUFFekU7QUFDQTtBQUNBOztBQUVBLGtDQUFrQyxpQkFBaUI7QUFDbkQsd0JBQXdCOztBQUV4Qix5QkFBeUIsaUJBQWlCLEVBQUUsbUJBQW1CO0FBQy9ELDhCQUE4QixpQkFBaUIsRUFBRSx3QkFBd0I7O0FBRXpFO0FBQ0EsbUNBQW1DLFlBQVksT0FBTyxrQkFBa0I7QUFDeEUsOEJBQThCLFlBQVksT0FBTyxpQkFBaUI7O0FBRWxFO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkMsQ0FBQyxPQUFPLGtCQUFrQixHQUFHLG1CQUFtQjtBQUNoRCw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLG1CQUFtQjtBQUN2RDtBQUNBLHVCQUF1QixtQkFBbUI7QUFDMUM7O0FBRUEseUNBQXlDLHdCQUF3QjtBQUNqRTtBQUNBLDRCQUE0Qix3QkFBd0I7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDeE5ZOztBQUVaO0FBQ0EsZ0JBQWdCLG1CQUFPLENBQUMsa0RBQVM7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qjs7QUFFNUIsa0JBQWtCO0FBQ2xCLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBLDJDQUEyQyxnQkFBZ0I7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkNBQTJDLGdCQUFnQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Qy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsU0FBUztBQUMvQix1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTO0FBQ2hDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsU0FBUztBQUMvQix1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTO0FBQ2hDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTO0FBQ2hDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixTQUFTO0FBQy9CLHVCQUF1QixTQUFTO0FBQ2hD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGtDQUFrQyw4RkFBOEY7QUFDN0s7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxrREFBa0QsS0FBSyxvQ0FBb0M7QUFDM0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLGlDQUFpQztBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLHFCQUFxQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQywrREFBK0QsS0FBSyxvQ0FBb0M7QUFDeEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsaUNBQWlDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx3REFBd0QsSUFBSSxzQ0FBc0M7QUFDbEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0dBQStHO0FBQy9HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGlDQUFpQztBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxpQ0FBaUM7QUFDdEU7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O0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOztBQUVYO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsa0NBQWtDO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHVEQUF1RCxZQUFZO0FBQ25FO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsY0FBYztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHdDQUF3QztBQUNoRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxvQkFBb0I7QUFDcEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkNBQTJDLFNBQVM7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBCQUEwQjs7Ozs7Ozs7Ozs7QUN4YTFCLGlCQUFpQixvQkFBb0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIsK0hBQW9EO0FBQzdFLFdBQVcsbUJBQU8sQ0FBQyxxREFBUTs7QUFFM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLFFBQVE7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLFNBQVM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFdBQVc7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxTQUFTO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDLFNBQVM7QUFDbkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxjQUFjO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsV0FBVztBQUNYO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSCxXQUFXO0FBQ1g7O0FBRUEsa0JBQWtCOzs7Ozs7Ozs7OztBQzVabEIsaUJBQWlCLG9CQUFvQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLGNBQWM7O0FBRWQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7O0FBRVosa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBLGVBQWU7QUFDZjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJDQUEyQzs7QUFFM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0I7Ozs7Ozs7Ozs7O0FDdmV4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEpBQXFGO0FBQ3JGLDBKQUFrRjtBQUNsRiw0SEFBNEQ7Ozs7Ozs7Ozs7O0FDUDVEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsRUFBRTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQSxnQ0FBZ0Msb0JBQW9CO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBOEI7QUFDdEMsUUFBUSxlQUFrQjtBQUMxQixRQUFRLGdCQUFtQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxZQUFZLElBQTZDO0FBQ3pELFlBQVksbUNBQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQUEsa0dBQUM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxDQUFDLElBQUk7Ozs7Ozs7Ozs7O0FDdE9MLFFBQVEsZUFBZSxFQUFFLG1CQUFPLENBQUMsc0JBQVE7QUFDekM7QUFDQTs7QUFFQSxrQkFBa0IsbUJBQU8sQ0FBQyxrRUFBWTtBQUN0QyxhQUFhLG1CQUFPLENBQUMsb0RBQVc7QUFDaEMsb0JBQW9CLG1CQUFPLENBQUMsMERBQWM7O0FBRTFDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EseUJBQXlCLGlGQUFpRixJQUFJO0FBQzlHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUIsaUZBQWlGLElBQUk7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHdCQUF3QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnQ0FBZ0MsYUFBYTtBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGtDQUFrQztBQUM5RDtBQUNBOztBQUVB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QUFJO0FBQ3ZCLGFBQWEsbUJBQU8sQ0FBQyxrQkFBTTs7QUFFM0I7O0FBRUEsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBFQUEwRSxnRUFBZ0U7O0FBRTFJLG9DQUFvQztBQUNwQztBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGVBQWU7QUFDZjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FB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QUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUM5UkEsMkJBQTJCLG1CQUFPLENBQUMsMkZBQTRCO0FBQy9ELG9CQUFvQixtQkFBTyxDQUFDLDJFQUFvQjs7QUFFaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQzNEQSxZQUFZLG1CQUFPLENBQUMsd0NBQUs7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNkQSxZQUFZLG1CQUFP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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDM0ZBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsT0FBTztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQSx1QkFBdUIsUUFBUTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZ0JBQWdCOztBQUVuQyxtQkFBbUIsZ0JBQWdCO0FBQ25DLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0EseUJBQXlCLE1BQU07QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxtQkFBbUIsZ0JBQWdCO0FBQ25DLHFCQUFxQjtBQUNyQix1QkFBdUIsY0FBYztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixjQUFjO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsYUFBYTtBQUN6Qyx1QkFBdUIsY0FBYztBQUNyQztBQUNBLHdCQUF3QixhQUFhO0FBQ3JDLG1CQUFtQixjQUFjO0FBQ2pDO0FBQ0Esd0JBQXdCLFlBQVk7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsTUFBTTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixXQUFXO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RkFBeUY7QUFDekY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FDNVdZOztBQUVaLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHLFlBQVksZ0JBQWdCO0FBQy9COztBQUVBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsWUFBWSxnQkFBZ0I7QUFDL0I7Ozs7Ozs7Ozs7OztBQ3ZCYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0EsTUFBTSxzQ0FBc0M7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLHNDQUFzQztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLHNDQUFzQztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FDN0RhOztBQUViO0FBQ0EsbUJBQW1CLG1CQUFPLENBQUMsOERBQWdCO0FBQzNDLEVBQUU7QUFDRixFQUFFLG1HQUFzQztBQUN4Qzs7Ozs7Ozs7Ozs7O0FDTmE7QUFDYixvQkFBb0IsbUJBQU8sQ0FBQywwREFBYztBQUMxQyxrQkFBa0IsbUJBQU8sQ0FBQyxzREFBWTtBQUN0QyxtQkFBbUIsbUJBQU8sQ0FBQyx3REFBYTs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsU0FBUyxHQUFHOztBQUV4Qyw0QkFBNEIsOEJBQThCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxvQkFBb0I7QUFDbEcsb0NBQW9DLDhCQUE4QixFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxpQkFBaUI7O0FBRTlHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVLFFBQVEscUJBQXFCLFNBQVMsbUJBQW1CLGlCQUFpQixZQUFZLGlCQUFpQix3Q0FBd0M7QUFDeko7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDdk5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDaENhOztBQUViLFFBQVEsZUFBZSxFQUFFLG1CQUFPLENBQUMsdURBQWE7O0FBRTlDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsaUJBQWlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG1CQUFtQjtBQUNyQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxZQUFZLFFBQVE7QUFDcEIsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG1CQUFPLENBQUMsc0RBQVk7O0FBRTNDLElBQUksbUJBQW1CO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQSxJQUFJLHFCQUFxQjtBQUN6QjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNsSWE7O0FBRWI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNqQmE7O0FBRWIsUUFBUSxrQ0FBa0MsRUFBRSxtQkFBTyxDQUFDLHVEQUFhOztBQUVqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWMsV0FBVztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbURBQW1ELGtCQUFrQjtBQUNyRSxpREFBaUQsa0JBQWtCOztBQUVuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzREFBc0Qsa0JBQWtCO0FBQ3hFLHdEQUF3RCxrQkFBa0I7QUFDMUUsMERBQTBELGtCQUFrQjs7QUFFNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsR0FBRztBQUNoQixhQUFhLFFBQVE7QUFDckI7QUFDQSxnQ0FBZ0M7QUFDaEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdURBQXVELGtCQUFrQjtBQUN6RSx5REFBeUQsa0JBQWtCOztBQUUzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCO0FBQ0EsZ0NBQWdDO0FBQ2hDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3REFBd0Qsa0JBQWtCOztBQUUxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLG1CQUFtQjtBQUNoQyxhQUFhLFFBQVE7QUFDckI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsbUJBQW1CO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxtQkFBbUI7QUFDOUIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNuU2E7O0FBRWIsUUFBUSxhQUFhLEVBQUUsbUJBQU8sQ0FBQyx5REFBYzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcseUJBQXlCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTLG1CQUFtQjtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLDRCQUE0QjtBQUNwQztBQUNBLGlFQUFpRSxFQUFFO0FBQ25FOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBLFFBQVE7QUFDUiwrREFBK0QsRUFBRTtBQUNqRTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsaUVBQWlFLEVBQUU7QUFDbkU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUiwrREFBK0QsRUFBRTtBQUNqRTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRSxFQUFFO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVixpRUFBaUUsRUFBRTtBQUNuRTtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLFFBQVE7QUFDUjtBQUNBLGlFQUFpRSxFQUFFO0FBQ25FOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLCtEQUErRCxFQUFFO0FBQ2pFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELEVBQUUsR0FBRyxFQUFFO0FBQzFELDJCQUEyQjtBQUMzQixlQUFlO0FBQ2Y7QUFDQSxxQkFBcUI7QUFDckIsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsbUJBQW1COzs7Ozs7Ozs7Ozs7QUMxTU47O0FBRWI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7OztBQ3REYTs7QUFFYixhQUFhLG1CQUFPLENBQUMsa0JBQU07O0FBRTNCLG1CQUFtQixtQkFBTyxDQUFDLDJEQUFlO0FBQzFDLGdCQUFnQixtQkFBTyxDQUFDLG1EQUFXO0FBQ25DLFFBQVEsY0FBYyxFQUFFLG1CQUFPLENBQUMsdURBQWE7O0FBRTdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLGtCQUFrQjtBQUMvQjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGFBQWEsa0JBQWtCO0FBQy9CO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixjQUFjLE9BQU87QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0NBQXdDLElBQUk7QUFDNUM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxJQUFJLEtBQUssTUFBTTtBQUMvRDtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSw4Q0FBOEMsSUFBSSxLQUFLLE1BQU07QUFDN0Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsSUFBSSxLQUFLLE1BQU07QUFDN0Q7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsSUFBSSxLQUFLLE1BQU07QUFDN0Q7QUFDQTtBQUNBLFVBQVU7QUFDVixnREFBZ0QsSUFBSTtBQUNwRDs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsaUJBQWlCO0FBQzlCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBOztBQUVBLGtDQUFrQyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGlCQUFpQjtBQUM5QixhQUFhLFNBQVM7QUFDdEIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGdDQUFnQyxTQUFTO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ2pnQmE7O0FBRWIsUUFBUSxXQUFXLEVBQUUsbUJBQU8sQ0FBQyxzQkFBUTs7QUFFckMsMEJBQTBCLG1CQUFPLENBQUMseUVBQXNCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEVBQUUsbUJBQU8sQ0FBQyx1REFBYTtBQUN6QixRQUFRLGdDQUFnQyxFQUFFLG1CQUFPLENBQUMsMkRBQWU7QUFDakUsUUFBUSxpQ0FBaUMsRUFBRSxtQkFBTyxDQUFDLHlEQUFjOztBQUVqRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07O0FBRU47QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixhQUFhO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msb0JBQW9CO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsMEJBQTBCLGFBQWE7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNB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QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEdBQUc7QUFDaEIsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsR0FBRztBQUNoQixhQUFhLFFBQVE7QUFDckIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsYUFB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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxpQkFBaUI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEdBQUc7QUFDaEIsYUFBYSxTQUFTO0FBQ3RCLGFBQWEsVUFBVTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsU0FBUztBQUN0QixhQUFhLFVBQVU7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQSxhQUFhLFNBQVM7QUFDdEIsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxrQkFBa0I7QUFDM0UsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELE9BQU87QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNILENBQUM7O0FBRUQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFdBQVc7QUFDdEIsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsT0FBTztBQUNsQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxTQUFTO0FBQ3BCO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQSxXQUFXLFVBQVU7QUFDckI7QUFDQSxXQUFXLFNBQVM7QUFDcEI7QUFDQSxXQUFXLFVBQVU7QUFDckI7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QjtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx1Q0FBdUMsc0JBQXNCO0FBQzdELGdDQUFnQyw0QkFBNEI7QUFDNUQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxNQUFNO0FBQ04sNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsbUJBQW1CLEdBQUcsbUJBQW1CO0FBQzVEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCOztBQUVsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDhCQUE4QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLDhCQUE4QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWDtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekIscUNBQXFDO0FBQ3JDLHdDQUF3Qzs7QUFFeEM7QUFDQSxrQ0FBa0M7QUFDbEMsaUNBQWlDO0FBQ2pDLGdDQUFnQzs7QUFFaEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsK0JBQStCO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyx3Q0FBd0M7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwrRUFBK0UsaUVBQWlFLEVBQUU7QUFDbEo7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0Esd0JBQXdCLFNBQVM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzN4QkE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7O0FDQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUSxVQUFVO0FBQzFDLDhEQUE4RDtBQUM5RCw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRSxZQUFZO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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USxpQkFBaUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFdBQVc7QUFDN0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCLGNBQWMsU0FBUztBQUN2Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWMsUUFBUTtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixjQUFjLFNBQVM7QUFDdkI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckIsYUFBYSxR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LE9BQU8sb0JBQW9CLFFBQVE7QUFDckQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLE1BQU0sNEJBQTRCLFNBQVM7QUFDaEU7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBLFlBQVksd0JBQXdCO0FBQ3BDLHVDQUF1Qzs7QUFFdkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQix1QkFBdUI7QUFDbEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGFBQWEsK0JBQStCLElBQUk7QUFDaEQ7QUFDQSw4QkFBOEIsTUFBTTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYywrQkFBK0IsSUFBSTtBQUNqRDtBQUNBLDhCQUE4QixNQUFNO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQyxrQkFBa0I7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQyxrQkFBa0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsK0NBQStDLElBQUk7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksK0JBQStCLElBQUk7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsVUFBVTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFVBQVU7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1Qix5Q0FBeUM7QUFDaEU7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQsa0JBQWtCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0NBQXdDLGtCQUFrQjtBQUMxRDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7OztBQzFzQ2E7O0FBRWIsU0FBUyxtQkFBTyxDQUFDLGNBQUk7QUFDckIsV0FBVyxtQkFBTyxDQUFDLGtCQUFNO0FBQ3pCLFdBQVcsbUJBQU8sQ0FBQyxrQkFBTTs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7OztBQzFNYTs7QUFFYixXQUFXLG1CQUFPLENBQUMsa0JBQU07QUFDekIsV0FBVyxtQkFBTyxDQUFDLGtCQUFNO0FBQ3pCLFNBQVMsbUJBQU8sQ0FBQyxjQUFJOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0UsZ0JBQWdCO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsV0FBVyxFQUFFLG9CQUFvQjtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsdUJBQXVCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQywwREFBMEQ7O0FBRTNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsMERBQTBELE9BQU87QUFDakU7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0EsaURBQWlELEdBQUc7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msb0JBQW9CO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHlCQUF5QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsWUFBWTtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsT0FBTztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5UkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQsVUFBVSxLQUFLO0FBQ1I7QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUk7QUFDM0M7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxQkE7QUFDNEM7QUFDaUI7O0FBRTlDO0FBQ2YsU0FBUywwREFBSztBQUNkO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsYUFBYTtBQUNiLFFBQVE7QUFDUixHQUFHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1ptQzs7QUFFbkM7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEVBQUUsc0NBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2YyQjtBQUNHOztBQUUzQyw2QkFBZSxvQ0FBVTtBQUN6QixXQUFXLDZDQUFPO0FBQ2xCLGtCQUFrQiw0Q0FBUTs7QUFFMUI7QUFDQSxRQUFRLDZDQUFPO0FBQ2Y7O0FBRUE7QUFDQSxzQkFBc0IsK0NBQVc7QUFDakMsa0JBQWtCLDZDQUFPO0FBQ3pCLFFBQVEsNkNBQU87QUFDZjtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3dGO0FBQy9CO0FBQytCO0FBQ2Q7QUFDMUU7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxlQUFlO0FBQ25CO0FBQ0EsdUJBQXVCLHlCQUF5QjtBQUNoRCxrQkFBa0IsMkJBQTJCO0FBQzdDO0FBQ0EsSUFBSSxnQkFBZ0IsaUNBQWlDO0FBQ3JELHNCQUFzQixvQkFBb0I7QUFDMUM7QUFDQSxxQkFBcUIsZUFBZSxhQUFhLFdBQVc7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsY0FBYztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGtCQUFrQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxzQkFBc0IsaUVBQVk7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsdUJBQXVCO0FBQzdDO0FBQ0E7QUFDQSxnQ0FBZ0Msd0NBQXdDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DLGdCQUFnQixzQkFBc0I7QUFDdEMscUJBQXFCLHlFQUFjLENBQUMsZ0VBQUssQ0FBQyxpRUFBZ0IsMERBQTBELGlFQUFnQiwwREFBMEQsK0RBQUksdUJBQXVCLDREQUFXLGFBQWEsbUVBQVEsQ0FBQyx3REFBTztBQUNqUTtBQUNBO0FBQ0EsZ0NBQWdDLG9CQUFvQixhQUFhLGNBQWM7QUFDL0U7QUFDQSw2QkFBNkIsd0NBQXdDO0FBQ3JFLG9CQUFvQixvQkFBb0I7QUFDeEMsUUFBUSx3Q0FBd0M7QUFDaEQ7QUFDQSw2QkFBNkIsbUJBQW1CO0FBQ2hELHlEQUF5RCxrQkFBa0I7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSwrQ0FBK0Msd0JBQXdCO0FBQ3ZFO0FBQ0Esd0JBQXdCLGtDQUFrQztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyw4REFBYTtBQUNsQjtBQUNBLDJDQUEyQyx1REFBVTtBQUNyRDtBQUNBLDRDQUE0Qyx1REFBVTtBQUN0RDtBQUNBO0FBQ0EsS0FBSyxtRUFBa0I7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDd0Y7QUFDL0I7QUFDK0I7QUFDZDtBQUNqQztBQUN6QztBQUNBLElBQUksc0JBQXNCO0FBQzFCLElBQUksd0JBQXdCO0FBQzVCO0FBQ0EsV0FBVyx5QkFBeUI7QUFDcEMsSUFBSSx3Q0FBd0M7QUFDNUMsVUFBVSxtQ0FBbUM7QUFDN0M7QUFDQTtBQUNBLElBQUksdUJBQXVCLDRCQUE0QjtBQUN2RCxzQkFBc0IsMkJBQTJCO0FBQ2pEO0FBQ0EsU0FBUyxtQkFBbUIsZUFBZSxrQkFBa0I7QUFDN0QsdURBQXVEO0FBQ3ZELDRCQUE0QjtBQUM1QjtBQUNBLDRCQUE0Qix1Q0FBdUM7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDZCQUE2QixpRUFBWTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQsaURBQUs7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHVCQUF1QjtBQUM3QztBQUNBO0FBQ0EsZ0NBQWdDLHdDQUF3QztBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQyxnQkFBZ0Isc0JBQXNCO0FBQ3RDLHFCQUFxQix5RUFBYyxDQUFDLGdFQUFLLENBQUMsaUVBQWdCLGlFQUFpRSxpRUFBZ0IsaUVBQWlFLCtEQUFJLHVCQUF1Qiw0REFBVyxhQUFhLG1FQUFRLENBQUMsd0RBQU87QUFDL1E7QUFDQTtBQUNBLHFCQUFxQix3Q0FBd0M7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0Qix1Q0FBdUM7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssOERBQWE7QUFDbEIsdUNBQXVDLHVEQUFVO0FBQ2pEO0FBQ0E7QUFDQSxLQUFLLG1FQUFrQjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsSHlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsMENBQTBDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsdUJBQXVCO0FBQy9EO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsUUFBUSwySEFBMkg7QUFDbkk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDTyx5QkFBeUIsaUVBQVk7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUMyQztBQUMzQztBQUNBLDJDQUEyQyxZQUFZO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx1REFBTTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHVEQUFNO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixTQUFJLElBQUksU0FBSTtBQUNyQztBQUNBLG9CQUFvQix5QkFBeUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsU0FBSSxJQUFJLFNBQUk7QUFDaEMseUJBQXlCLHVGQUF1RjtBQUNoSDtBQUNBO0FBQ0EsMkdBQTJHO0FBQzNHO0FBQ0Esd0NBQXdDLFFBQVE7QUFDaEQ7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQSxnREFBZ0QseUZBQXlGO0FBQ3pJLGdFQUFnRSwyQ0FBMkM7QUFDM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFNBQUksSUFBSSxTQUFJO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qiw4Q0FBOEM7QUFDdkU7QUFDQTtBQUNBLHlCQUF5QixhQUFhO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixTQUFJLElBQUksU0FBSTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJGQUEyRixTQUFTLGdCQUFnQjtBQUNwSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRCx5QkFBeUIsU0FBSSxJQUFJLFNBQUk7QUFDckM7QUFDQSw4Q0FBOEMseUVBQXlFO0FBQ3ZIO0FBQzBFO0FBQzNCO0FBQzRCO0FBQ2hDO0FBQ3NCO0FBQ1Q7QUFDSTtBQUNuQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxjQUFjO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0EsY0FBYyxrQ0FBa0M7QUFDaEQ7QUFDQTtBQUNBLHdEQUF3RCxrQkFBa0I7QUFDMUUsSUFBSSxxQkFBcUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isa0RBQVE7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLG9FQUFlO0FBQ3RELHlDQUF5QyxvRUFBZTtBQUN4RCxxQ0FBcUMsb0VBQWU7QUFDcEQsNkJBQTZCLG9FQUFlO0FBQzVDLDhCQUE4QixvRUFBZTtBQUM3QztBQUNBLDJDQUEyQyxvRUFBZTtBQUMxRCxxQ0FBcUMsb0VBQWU7QUFDcEQsb0NBQW9DLG9FQUFlO0FBQ25ELHFDQUFxQyxvRUFBZTtBQUNwRCwwQ0FBMEMsb0VBQWU7QUFDekQsaUNBQWlDLG9FQUFlO0FBQ2hELGlDQUFpQyxvRUFBZTtBQUNoRCxnQ0FBZ0Msb0VBQWU7QUFDL0MscUNBQXFDLG9FQUFlO0FBQ3BELG9DQUFvQyxvRUFBZTtBQUNuRCxnQ0FBZ0Msb0VBQWU7QUFDL0MsdUNBQXVDLG9FQUFlO0FBQ3RELGtDQUFrQyxvRUFBZTtBQUNqRCwrQkFBK0Isb0VBQWU7QUFDOUMsc0NBQXNDLG9FQUFlO0FBQ3JELHFDQUFxQyxvRUFBZTtBQUNwRCxvQ0FBb0Msb0VBQWU7QUFDbkQsaUNBQWlDLG9FQUFlO0FBQ2hELGdDQUFnQyxvRUFBZTtBQUMvQyxpQ0FBaUMsb0VBQWU7QUFDaEQsdUNBQXVDLG9FQUFlO0FBQ3RELG9DQUFvQyxvRUFBZTtBQUNuRCxzQ0FBc0Msb0VBQWU7QUFDckQsa0RBQWtELG9FQUFlO0FBQ2pFLDBDQUEwQyxvRUFBZTtBQUN6RCxnRUFBZ0UsOEVBQThFLCtEQUErRCx1QkFBdUI7QUFDcE8sa0VBQWtFLGdGQUFnRixtRUFBbUUsdUJBQXVCO0FBQzVPLDhEQUE4RCw0RUFBNEUsMkRBQTJELHVCQUF1QjtBQUM1TixzREFBc0Qsb0VBQW9FLDJDQUEyQyx1QkFBdUI7QUFDNUwsdURBQXVELHFFQUFxRSw2Q0FBNkMsdUJBQXVCO0FBQ2hNLDBEQUEwRDtBQUMxRDtBQUNBLGlCQUFpQixVQUFVLDRCQUE0QixxRUFBcUUsNkNBQTZDLHVCQUF1QjtBQUNoTSxvRUFBb0Usa0ZBQWtGLHVFQUF1RSx1QkFBdUI7QUFDcFAsOERBQThELDRFQUE0RSwyREFBMkQsdUJBQXVCO0FBQzVOLDZEQUE2RCwyRUFBMkUseURBQXlELHVCQUF1QjtBQUN4Tiw4REFBOEQsNEVBQTRFLDJEQUEyRCx1QkFBdUI7QUFDNU4sbUVBQW1FLGlGQUFpRixxRUFBcUUsdUJBQXVCO0FBQ2hQLDBEQUEwRCx3RUFBd0UsbURBQW1ELHVCQUF1QjtBQUM1TSwwREFBMEQsd0VBQXdFLG1EQUFtRCx1QkFBdUI7QUFDNU0seURBQXlELHVFQUF1RSxpREFBaUQsdUJBQXVCO0FBQ3hNLDhEQUE4RCw0RUFBNEUsMkRBQTJELHVCQUF1QjtBQUM1Tiw2REFBNkQsMkVBQTJFLHlEQUF5RCx1QkFBdUI7QUFDeE4seURBQXlELHVFQUF1RSxpREFBaUQsdUJBQXVCO0FBQ3hNLGdFQUFnRSw4RUFBOEUsK0RBQStELHVCQUF1QjtBQUNwTywyREFBMkQseUVBQXlFLHFEQUFxRCx1QkFBdUI7QUFDaE4sd0RBQXdELHNFQUFzRSwrQ0FBK0MsdUJBQXVCO0FBQ3BNLCtEQUErRCw2RUFBNkUsNkRBQTZELHVCQUF1QjtBQUNoTyw4REFBOEQsNEVBQTRFLDJEQUEyRCx1QkFBdUI7QUFDNU4sNkRBQTZELDJFQUEyRSx5REFBeUQsdUJBQXVCO0FBQ3hOLDBEQUEwRCx3RUFBd0UsbURBQW1ELHVCQUF1QjtBQUM1TSx5REFBeUQsdUVBQXVFLGlEQUFpRCx1QkFBdUI7QUFDeE0sMERBQTBELHdFQUF3RSxtREFBbUQsdUJBQXVCO0FBQzVNLGdFQUFnRSw4RUFBOEUsK0RBQStELHVCQUF1QjtBQUNwTyw2REFBNkQsMkVBQTJFLHlEQUF5RCx1QkFBdUI7QUFDeE4sK0RBQStELDZFQUE2RSw2REFBNkQsdUJBQXVCO0FBQ2hPLDJFQUEyRSx5RkFBeUYscUZBQXFGLHVCQUF1QjtBQUNoUixtRUFBbUUsaUZBQWlGLHFFQUFxRSx1QkFBdUI7QUFDaFAsMEVBQTBFLHdFQUF3RTtBQUNsSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxrREFBUTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsa0RBQVE7QUFDcEQ7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsa0RBQVE7QUFDckQ7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLHFFQUFnQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDZFQUE0QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsNkVBQTRCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVksOEVBQThFO0FBQzFGLFlBQVksNEZBQTRGO0FBQ3hHO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWSw4SEFBOEg7QUFDMUk7QUFDQSxZQUFZLGtGQUFrRjtBQUM5Rix1QkFBdUIsc0NBQXNDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQ0FBZ0MsRUFBRSxzRkFBMEI7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWSw4RUFBOEU7QUFDMUYsWUFBWSw0RkFBNEY7QUFDeEc7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZLDhIQUE4SDtBQUMxSTtBQUNBLFlBQVksa0ZBQWtGO0FBQzlGLGlDQUFpQyx1Q0FBdUM7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHdCQUF3QjtBQUM3QztBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSwrQkFBK0IsdUJBQXVCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdDQUFnQyxFQUFFLHNGQUEwQjtBQUNoRix5QkFBeUIseUVBQWlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVksOEVBQThFO0FBQzFGLFlBQVksNEZBQTRGO0FBQ3hHO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWSw4SEFBOEg7QUFDMUk7QUFDQSxZQUFZLGtGQUFrRjtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBLCtCQUErQiw2RUFBNEI7QUFDM0Q7QUFDQTtBQUNBLHdGQUF3RixTQUFTO0FBQ2pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZLDhFQUE4RTtBQUMxRixZQUFZLDRGQUE0RjtBQUN4RztBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVksOEhBQThIO0FBQzFJO0FBQ0EsWUFBWSxrRkFBa0Y7QUFDOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQSwrQkFBK0IsNkVBQTRCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsNEJBQTRCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRCxvQkFBb0IseUNBQXlDLEVBQUUsc0ZBQTBCO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsRUFBRSx1REFBTztBQUN0QjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGlHQUFpRztBQUMvRztBQUNBO0FBQ0EsY0FBYyw0R0FBNEc7QUFDMUg7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxpR0FBaUc7QUFDL0c7QUFDQTtBQUNBLGNBQWMsNEdBQTRHO0FBQzFIO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSx5REFBeUQsUUFBUTtBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0NBQWtDO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0Msa0NBQWtDO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHVEQUFNO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVEQUFNLENBQUMseURBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsZUFBZTtBQUMxRSw0REFBNEQsZUFBZTtBQUMzRTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxZQUFZLHVCQUF1QjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrRkFBa0Y7QUFDcEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDBCQUEwQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5Qyw4Q0FBOEMsV0FBVyxHQUFHO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxxQkFBcUIsS0FBSyxrQkFBa0I7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZ0JBQWdCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQ0FBZ0M7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsS0FBSztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxzQkFBc0IsMkJBQTJCO0FBQ2pELHNCQUFzQix3Q0FBd0M7QUFDOUQsc0JBQXNCLHNEQUFzRDtBQUM1RSxzQkFBc0IseUNBQXlDO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQyxvQkFBb0IsOEJBQThCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQywrQkFBK0I7QUFDMUU7QUFDQTtBQUNBO0FBQ0EsWUFBWSx1REFBTTtBQUNsQixZQUFZLHVEQUFNO0FBQ2xCLFlBQVksdURBQU07QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLENBQUM7QUFDd0I7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUN6ekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQOzs7Ozs7Ozs7Ozs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1U7QUFDVjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixTQUFJLElBQUksU0FBSTtBQUNyQztBQUNBLG9CQUFvQix5QkFBeUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsU0FBSSxJQUFJLFNBQUk7QUFDaEMseUJBQXlCLHVGQUF1RjtBQUNoSDtBQUNBO0FBQ0EsMkdBQTJHO0FBQzNHO0FBQ0Esd0NBQXdDLFFBQVE7QUFDaEQ7QUFDQSxrRUFBa0U7QUFDbEU7QUFDQSxnREFBZ0QseUZBQXlGO0FBQ3pJLGdFQUFnRSwyQ0FBMkM7QUFDM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLFNBQUksSUFBSSxTQUFJO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qiw4Q0FBOEM7QUFDdkU7QUFDQTtBQUNBLHlCQUF5QixhQUFhO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixTQUFJLElBQUksU0FBSTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJGQUEyRixTQUFTLGdCQUFnQjtBQUNwSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDd0Q7QUFDaUI7QUFDSjtBQUNjO0FBQ3pDO0FBQ2E7QUFDZTtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGdDQUFnQztBQUNqQztBQUNBO0FBQ0E7QUFDTyx3QkFBd0Isb0VBQWU7QUFDOUMsK0NBQStDLFVBQVU7QUFDekQsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixvQkFBb0I7QUFDOUMsaUJBQWlCLHNCQUFzQixLQUFLLHlCQUF5QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQSxNQUFNO0FBQ04sTUFBTTtBQUNOLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixpRUFBWTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLCtFQUErRSxpRUFBaUUsdUJBQXVCO0FBQ3hPLG1FQUFtRSxpRkFBaUYscUVBQXFFLHVCQUF1QjtBQUNoUCw2REFBNkQsMkVBQTJFLHlEQUF5RCx1QkFBdUI7QUFDeE4sNERBQTRELDBFQUEwRSx1REFBdUQsdUJBQXVCO0FBQ3BOLHNEQUFzRCxvRUFBb0UsMkNBQTJDLHVCQUF1QjtBQUM1TCx1REFBdUQscUVBQXFFLDZDQUE2Qyx1QkFBdUI7QUFDaE0sMERBQTBELHdFQUF3RSxtREFBbUQsdUJBQXVCO0FBQzVNLDJEQUEyRCx5RUFBeUUscURBQXFELHVCQUF1QjtBQUNoTixvRUFBb0Usa0ZBQWtGLHVFQUF1RSx1QkFBdUI7QUFDcFAsb0VBQW9FLGtGQUFrRix1RUFBdUUsdUJBQXVCO0FBQ3BQLDREQUE0RCwwRUFBMEUsdURBQXVELHVCQUF1QjtBQUNwTixpRUFBaUUsK0VBQStFLGlFQUFpRSx1QkFBdUI7QUFDeE8sZ0VBQWdFLDhFQUE4RSwrREFBK0QsdUJBQXVCO0FBQ3BPLDBEQUEwRCx3RUFBd0UsbURBQW1ELHVCQUF1QjtBQUM1TSwwREFBMEQsd0VBQXdFLG1EQUFtRCx1QkFBdUI7QUFDNU0sMERBQTBELHdFQUF3RSxtREFBbUQsdUJBQXVCO0FBQzVNLDJEQUEyRCx5RUFBeUUscURBQXFELHVCQUF1QjtBQUNoTix3REFBd0Qsc0VBQXNFLCtDQUErQyx1QkFBdUI7QUFDcE0seURBQXlELHVFQUF1RSxpREFBaUQsdUJBQXVCO0FBQ3hNLDBEQUEwRCx3RUFBd0UsbURBQW1ELHVCQUF1QjtBQUM1TSwwRUFBMEUsd0VBQXdFO0FBQ2xKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQiw2Q0FBNkMsa0ZBQXVCO0FBQ3BFLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLDJCQUEyQjtBQUM5RDtBQUNBO0FBQ0EsZ0JBQWdCLDJCQUEyQjtBQUMzQztBQUNBO0FBQ0EsMkJBQTJCLDZFQUE0QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMscUJBQXFCO0FBQ3hEO0FBQ0E7QUFDQSxnQkFBZ0IscUJBQXFCO0FBQ3JDO0FBQ0E7QUFDQSwyQkFBMkIsNkVBQTRCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDhEQUFXO0FBQ2xDO0FBQ0E7QUFDQSx1QkFBdUIsa0VBQWU7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWSw4RUFBOEU7QUFDMUYsWUFBWSw0RkFBNEY7QUFDeEc7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZLDhIQUE4SDtBQUMxSTtBQUNBLFlBQVksa0ZBQWtGO0FBQzlGO0FBQ0EsdUJBQXVCLHNDQUFzQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWSw4RUFBOEU7QUFDMUYsWUFBWSw0RkFBNEY7QUFDeEc7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZLDhIQUE4SDtBQUMxSTtBQUNBLFlBQVksa0ZBQWtGO0FBQzlGO0FBQ0EsaUNBQWlDLHVDQUF1QztBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZLDhFQUE4RTtBQUMxRixZQUFZLDRGQUE0RjtBQUN4RztBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVksOEhBQThIO0FBQzFJO0FBQ0EsWUFBWSxrRkFBa0Y7QUFDOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsNkVBQTRCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVk7QUFDWjtBQUNBLFlBQVksOEVBQThFO0FBQzFGLFlBQVksNEZBQTRGO0FBQ3hHO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWSw4SEFBOEg7QUFDMUk7QUFDQSxZQUFZLGtGQUFrRjtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQiw2RUFBNEI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0Q7QUFDcEQsb0JBQW9CLHlDQUF5QyxFQUFFLHNGQUEwQjtBQUN6RjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHNCQUFzQjtBQUN0RDtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isc0NBQXNDO0FBQzlEO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkMsb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsaUVBQWdCO0FBQ2pEO0FBQ0EsNENBQTRDLHdCQUF3QjtBQUNwRTtBQUNBO0FBQ0EsNEdBQTRHLHdCQUF3QjtBQUNwSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsSUFBSSxZQUFZO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLElBQUksWUFBWTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYSxJQUFJLDJCQUEyQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGVBQWU7QUFDakMsb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsaUVBQWdCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEdBQTRHLGNBQWM7QUFDMUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixJQUFJLFlBQVk7QUFDckM7QUFDQTtBQUNBLHFCQUFxQixJQUFJLFlBQVk7QUFDckM7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUMsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxnQkFBZ0IsdURBQU0sMkNBQTJDLFNBQVM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxnQkFBZ0IsdURBQU0sMkNBQTJDLFNBQVM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxnQkFBZ0IsdURBQU0sMkNBQTJDLFNBQVM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRCxrRUFBa0U7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBLGdCQUFnQix1REFBTSwyQ0FBMkMsU0FBUztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQSxnQkFBZ0IsdURBQU0sMkNBQTJDLFNBQVM7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFCQUFxQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRCxxREFBcUQsV0FBVyxHQUFHO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0EsZ0JBQWdCLHVEQUFNLDJDQUEyQyxTQUFTO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxDQUFDO0FBQ2dCO0FBQ2pCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbjNCeUQ7QUFDZDtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHVEQUFNO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHVEQUFNO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSx1REFBTTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCx5Q0FBeUM7QUFDekMsZ0JBQWdCLFNBQVM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsMkJBQTJCLFFBQVE7QUFDbkMsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsa0NBQWtDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdURBQU07QUFDZCxRQUFRLHVEQUFNO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsa0NBQWtDO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHVEQUFNO0FBQ2QsUUFBUSx1REFBTTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxrQ0FBa0M7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdURBQU07QUFDZCxRQUFRLHVEQUFNO0FBQ2QsUUFBUSx1REFBTTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qix5REFBUTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw4REFBOEQ7QUFDL0Q7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksMkRBQVU7QUFDZDtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUMvY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVk7QUFDaEI7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3lEO0FBQ2Q7QUFDc0I7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHVEQUFNLHlEQUF5RCxVQUFVO0FBQ2pGO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDdUQ7QUFDRTtBQUNnQjtBQUNoQjtBQUNkO0FBQ2E7QUFDTjtBQUNFO0FBQ1k7QUFDaEU7QUFDQTtBQUNBO0FBQ08sNkJBQTZCLGlFQUFZO0FBQ2hEO0FB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QTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGFBQWEsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGFBQWEsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGFBQWEsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGFBQWEsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGFBQWEsT0FBTztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGFBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsYUFBYTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUMsdUNBQXVDLFNBQVM7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx5Q0FBeUMsdUNBQXVDLFNBQVM7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsR0FBRyxPQUFPO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLEdBQUcsT0FBTztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGVBQWUsT0FBTztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxHQUFHLGVBQWUsT0FBTztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFEQUFxRCxlQUFlLFdBQVc7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxxREFBcUQsZUFBZSxXQUFXO0FBQy9FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EscURBQXFELGVBQWUsV0FBVztBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGFBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsYUFBYTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSw2Q0FBNkMsV0FBVyxtQkFBbUIsYUFBYSxlQUFlLEtBQUssT0FBTyxPQUFPO0FBQzFIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsNkNBQTZDLFdBQVcsbUJBQW1CLGFBQWEsZUFBZSxLQUFLLE9BQU8sT0FBTztBQUMxSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGFBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsZUFBZTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxlQUFlO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxZQUFZO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLFlBQVk7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsWUFBWTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxZQUFZO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLFlBQVk7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSx3Q0FBd0MsWUFBWTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdDQUF3QyxhQUFhO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0Esd0NBQXdDLGFBQWE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxtQkFBbUI7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3I0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLG1EQUFtRDtBQUM5RSxJQUFJLDhDQUE4QztBQUNsRDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2tEO0FBQ0k7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLDRCQUE0QjtBQUN6RSxJQUFJLDhCQUE4QjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIscUVBQUk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSw4REFBYTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyw4REFBYTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLDhEQUFhO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsK0JBQStCO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsMEZBQTBGO0FBQ2xHO0FB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Q2pPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUZBQW1GO0FBQ25GO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFh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LEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHVCQUF1QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHVCQUF1QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFLFVBQVU7QUFDcEY7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLGtCQUFrQjtBQUNsQixVQUFVO0FBQ1Y7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUNBQXVDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix5Q0FBeUM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsdUJBQXVCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsS0FBSyxFQUFFLEVBQWM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQix3Q0FBd0M7QUFDNUQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRkFBa0Ysb0JBQW9CO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTixjQUFjO0FBQ2QsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsdUJBQXVCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG9CQUFvQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQsMkRBQVM7QUFDdEU7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0Esc0RBQXNEO1dBQ3RELHNDQUFzQyxpRUFBaUU7V0FDdkc7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBOzs7OztXQ3pCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBOzs7OztXQ1BBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsRUFBRTtXQUNGOzs7OztXQ1JBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7Ozs7O1dDSkE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7OztXQ05BO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7Ozs7O1dDSkE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsZ0JBQWdCLHFCQUFxQjtXQUNyQzs7V0FFQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGFBQWE7V0FDYjtXQUNBLElBQUk7V0FDSjtXQUNBOztXQUVBOztXQUVBOztXQUVBOzs7OztVRXJDQTtVQUNBO1VBQ0E7VUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvbm9kZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2FzeW5jaWZ5LWhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9jb250ZXh0LWFzeW5jaWZ5LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvY29udGV4dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2RlYnVnLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvZGVmZXJyZWQtcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2Vycm9ycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L2VzbUhlbHBlcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9nZW5lcmF0ZWQvZW1zY3JpcHRlbi1tb2R1bGUuV0FTTV9SRUxFQVNFX1NZTkMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9nZW5lcmF0ZWQvZmZpLldBU01fUkVMRUFTRV9TWU5DLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC9saWZldGltZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L21lbW9yeS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L21vZHVsZS1hc3luY2lmeS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L21vZHVsZS10ZXN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvbW9kdWxlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3QvcnVudGltZS1hc3luY2lmeS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L3J1bnRpbWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC90eXBlcy1mZmkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0B0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW4vZGlzdC90eXBlcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHRvb3RhbGxuYXRlL3F1aWNranMtZW1zY3JpcHRlbi9kaXN0L3ZhcmlhbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AdG9vdGFsbG5hdGUvcXVpY2tqcy1lbXNjcmlwdGVuL2Rpc3Qvdm0taW50ZXJmYWNlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hZ2VudC1iYXNlL2Rpc3QvaGVscGVycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYWdlbnQtYmFzZS9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hbnNpLXJlZ2V4L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hbnNpLXN0eWxlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi9iYWJlbC1jb3JlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2JhYmVsLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2NvcmUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvZXMtcHJvcG9zYWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2VzMjAyMC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi9lczYuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvZXM3LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZGVmL2VzcHJpbWEuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvZmxvdy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi9qc3guanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9kZWYvdHlwZS1hbm5vdGF0aW9ucy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2RlZi90eXBlc2NyaXB0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvZm9yay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2dlbi9uYW1lZFR5cGVzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvbGliL2VxdWl2LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9hc3QtdHlwZXMvbGliL25vZGUtcGF0aC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2xpYi9wYXRoLXZpc2l0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9saWIvcGF0aC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2xpYi9zY29wZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYXN0LXR5cGVzL2xpYi9zaGFyZWQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9saWIvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2FzdC10eXBlcy9tYWluLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iNGEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L0NsaWVudC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvRmlsZUluZm8uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L0Z0cENvbnRleHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L1Byb2dyZXNzVHJhY2tlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvU3RyaW5nRW5jb2RpbmcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L1N0cmluZ1dyaXRlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L25ldFV0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC9wYXJzZUNvbnRyb2xSZXNwb25zZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvYmFzaWMtZnRwL2Rpc3QvcGFyc2VMaXN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9iYXNpYy1mdHAvZGlzdC9wYXJzZUxpc3RET1MuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L3BhcnNlTGlzdE1MU0QuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L3BhcnNlTGlzdFVuaXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2Jhc2ljLWZ0cC9kaXN0L3RyYW5zZmVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9idWZmZXItY3JjMzIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2J1ZmZlcnV0aWwvZmFsbGJhY2suanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2J1ZmZlcnV0aWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvY29udmVyc2lvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbG9yLWNvbnZlcnQvcm91dGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbG9yLW5hbWUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RhdGEtdXJpLXRvLWJ1ZmZlci9kaXN0L2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGF0YS11cmktdG8tYnVmZmVyL2Rpc3Qvbm9kZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9jb21tb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2RlZ2VuZXJhdG9yL2Rpc3QvY29tcGlsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGVnZW5lcmF0b3IvZGlzdC9kZWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZGVnZW5lcmF0b3IvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZW1vamktcmVnZXgvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VuZC1vZi1zdHJlYW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzY2FsYWRlL3N5bmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzY29kZWdlbi9lc2NvZGVnZW4uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzcHJpbWEvZGlzdC9lc3ByaW1hLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9lc3RyYXZlcnNlL2VzdHJhdmVyc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2VzdXRpbHMvbGliL2FzdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZXN1dGlscy9saWIvY29kZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZXN1dGlscy9saWIva2V5d29yZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZXN1dGlscy9saWIvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2V4dHJhY3QtemlwL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mYXN0LWZpZm8vZml4ZWQtc2l6ZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZmFzdC1maWZvL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mZC1zbGljZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9jb3B5L2NvcHktc3luYy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2NvcHkvY29weS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2NvcHkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9lbXB0eS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2Vuc3VyZS9maWxlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvZW5zdXJlL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvZW5zdXJlL2xpbmsuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9lbnN1cmUvc3ltbGluay1wYXRocy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2Vuc3VyZS9zeW1saW5rLXR5cGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9lbnN1cmUvc3ltbGluay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2ZzL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9qc29uL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvanNvbi9qc29uZmlsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2pzb24vb3V0cHV0LWpzb24tc3luYy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL2pzb24vb3V0cHV0LWpzb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9ta2RpcnMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9ta2RpcnMvbWFrZS1kaXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9ta2RpcnMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9tb3ZlL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvbW92ZS9tb3ZlLXN5bmMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9tb3ZlL21vdmUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2ZzLWV4dHJhL2xpYi9vdXRwdXQtZmlsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZnMtZXh0cmEvbGliL3BhdGgtZXhpc3RzL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvcmVtb3ZlL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvdXRpbC9zdGF0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9mcy1leHRyYS9saWIvdXRpbC91dGltZXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC1jYWxsZXItZmlsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXN0cmVhbS9idWZmZXItc3RyZWFtLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtc3RyZWFtL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtdXJpL2Rpc3QvZGF0YS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXVyaS9kaXN0L2ZpbGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC11cmkvZGlzdC9mdHAuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC11cmkvZGlzdC9odHRwLWVycm9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtdXJpL2Rpc3QvaHR0cC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXVyaS9kaXN0L2h0dHBzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9nZXQtdXJpL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dldC11cmkvZGlzdC9ub3Rmb3VuZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ2V0LXVyaS9kaXN0L25vdG1vZGlmaWVkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9ncmFjZWZ1bC1mcy9jbG9uZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvZ3JhY2VmdWwtZnMvZ3JhY2VmdWwtZnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2dyYWNlZnVsLWZzL2xlZ2FjeS1zdHJlYW1zLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9ncmFjZWZ1bC1mcy9wb2x5ZmlsbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2hhcy1mbGFnL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9odHRwLXByb3h5LWFnZW50L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2h0dHBzLXByb3h5LWFnZW50L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2h0dHBzLXByb3h5LWFnZW50L2Rpc3QvcGFyc2UtcHJveHktcmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2lwLWFkZHJlc3MvZGlzdC9hZGRyZXNzLWVycm9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvY29tbW9uLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvaXAtYWRkcmVzcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvaXAtYWRkcmVzcy9kaXN0L2lwdjQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2lwLWFkZHJlc3MvZGlzdC9pcHY2LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvdjQvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvdjYvY29uc3RhbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9pcC1hZGRyZXNzL2Rpc3QvdjYvaGVscGVycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvaXAtYWRkcmVzcy9kaXN0L3Y2L3JlZ3VsYXItZXhwcmVzc2lvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9qc2JuL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9qc29uZmlsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvanNvbmZpbGUvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9uZXRtYXNrL2xpYi9uZXRtYXNrLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9ub2RlLWd5cC1idWlsZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvbm9kZS1neXAtYnVpbGQvbm9kZS1neXAtYnVpbGQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL29uY2Uvb25jZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXByb3h5LWFnZW50L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2RhdGVSYW5nZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvZG5zRG9tYWluSXMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2Ruc0RvbWFpbkxldmVscy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvZG5zUmVzb2x2ZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2lwLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wYWMtcmVzb2x2ZXIvZGlzdC9pc0luTmV0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wYWMtcmVzb2x2ZXIvZGlzdC9pc1BsYWluSG9zdE5hbWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L2lzUmVzb2x2YWJsZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvbG9jYWxIb3N0T3JEb21haW5Jcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvbXlJcEFkZHJlc3MuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L3NoRXhwTWF0Y2guanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3BhYy1yZXNvbHZlci9kaXN0L3RpbWVSYW5nZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3QvdXRpbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcGFjLXJlc29sdmVyL2Rpc3Qvd2Vla2RheVJhbmdlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wZW5kL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wcm9ncmVzcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHJvZ3Jlc3MvbGliL25vZGUtcHJvZ3Jlc3MuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Byb3h5LWFnZW50L2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Byb3h5LWZyb20tZW52L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdW1wL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9xdWV1ZS10aWNrL3Byb2Nlc3MtbmV4dC10aWNrLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9xdWV1ZS10aWNrL3F1ZXVlLW1pY3JvdGFzay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcmVxdWlyZS1kaXJlY3RvcnkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9jbGFzc2VzL2NvbXBhcmF0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9jbGFzc2VzL3JhbmdlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvY2xhc3Nlcy9zZW12ZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY2xlYW4uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY21wLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2NvZXJjZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLWJ1aWxkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUtbG9vc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9kaWZmLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2VxLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2d0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2d0ZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9pbmMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvbHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvbHRlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL21ham9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL21pbm9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL25lcS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9wYXJzZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9wYXRjaC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9wcmVyZWxlYXNlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3Jjb21wYXJlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3Jzb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3NhdGlzZmllcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9zb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3ZhbGlkLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9kZWJ1Zy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL2lkZW50aWZpZXJzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvcGFyc2Utb3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL3JlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zZW12ZXIvbm9kZV9tb2R1bGVzL2xydS1jYWNoZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9ndHIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvaW50ZXJzZWN0cy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9sdHIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvbWF4LXNhdGlzZnlpbmcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvbWluLXNhdGlzZnlpbmcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvb3V0c2lkZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9zaW1wbGlmeS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9zdWJzZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvdG8tY29tcGFyYXRvcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NlbXZlci9yYW5nZXMvdmFsaWQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NtYXJ0LWJ1ZmZlci9idWlsZC9zbWFydGJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc21hcnQtYnVmZmVyL2J1aWxkL3V0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb2Nrcy1wcm94eS1hZ2VudC9kaXN0L2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb2Nrcy9idWlsZC9jbGllbnQvc29ja3NjbGllbnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvY2tzL2J1aWxkL2NvbW1vbi9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvY2tzL2J1aWxkL2NvbW1vbi9oZWxwZXJzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb2Nrcy9idWlsZC9jb21tb24vcmVjZWl2ZWJ1ZmZlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc29ja3MvYnVpbGQvY29tbW9uL3V0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvY2tzL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9hcnJheS1zZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2Jhc2U2NC12bHEuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2Jhc2U2NC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYmluYXJ5LXNlYXJjaC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvbWFwcGluZy1saXN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9xdWljay1zb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwLWNvbnN1bWVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW5vZGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3V0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvc291cmNlLW1hcC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc3ByaW50Zi1qcy9zcmMvc3ByaW50Zi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc3RyZWFteC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvc3RyaW5nLXdpZHRoL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zdHJpcC1hbnNpL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9zdXBwb3J0cy1jb2xvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGFyLWZzL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGFyLXN0cmVhbS9leHRyYWN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90YXItc3RyZWFtL2hlYWRlcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Rhci1zdHJlYW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3Rhci1zdHJlYW0vcGFjay5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGV4dC1kZWNvZGVyL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90ZXh0LWRlY29kZXIvbGliL3Bhc3MtdGhyb3VnaC1kZWNvZGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy90ZXh0LWRlY29kZXIvbGliL3V0ZjgtZGVjb2Rlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdGhyb3VnaC9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9zcmMvY29uZmlndXJhdGlvbi50cyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9zcmMvcGFnZXMvbG9naW4tYXMtcm9vdC1wYWdlLnRzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL3NyYy9wYWdlcy9zaWRlYmFyLXBhZ2UudHMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vc3JjL3BhZ2VzL3N0b3JhZ2UtZW5jcnlwdGlvbi1wYWdlLnRzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL3NyYy9wYWdlcy9zdG9yYWdlLXBhZ2UudHMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vc3JjL3Rlc3RzL2Z1bGxfZGlza19lbmNyeXB0aW9uLnRzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy91bmJ6aXAyLXN0cmVhbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdW5iemlwMi1zdHJlYW0vbGliL2JpdF9pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvdW5iemlwMi1zdHJlYW0vbGliL2J6aXAyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy91bml2ZXJzYWxpZnkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3V0Zi04LXZhbGlkYXRlL2ZhbGxiYWNrLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy91dGYtOC12YWxpZGF0ZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3JhcC1hbnNpL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cmFwcHkvd3JhcHB5LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cy9saWIvYnVmZmVyLXV0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9ldmVudC10YXJnZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9leHRlbnNpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9saW1pdGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cy9saWIvcGVybWVzc2FnZS1kZWZsYXRlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cy9saWIvcmVjZWl2ZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9zZW5kZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9zdHJlYW0uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi9zdWJwcm90b2NvbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvd3MvbGliL3ZhbGlkYXRpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL2xpYi93ZWJzb2NrZXQtc2VydmVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy93cy9saWIvd2Vic29ja2V0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YWxsaXN0L2l0ZXJhdG9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YWxsaXN0L3lhbGxpc3QuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC8gc3luYyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvIHN5bmMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhdXpsL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiYXNzZXJ0XCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJidWZmZXJcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImNoaWxkX3Byb2Nlc3NcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImNvbnN0YW50c1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiY3J5cHRvXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJkbnNcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImV2ZW50c1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiZnNcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImZzL3Byb21pc2VzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJodHRwXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJodHRwc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwibmV0XCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJub2RlOmFzc2VydC9zdHJpY3RcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwibm9kZTpldmVudHNcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm5vZGU6ZnNcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm5vZGU6cGF0aFwiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwibm9kZTpwcm9jZXNzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJub2RlOnRlc3RcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcIm9zXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJwYXRoXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJwcm9jZXNzXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJyZWFkbGluZVwiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwic3RyZWFtXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJ0bHNcIiIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcInR0eVwiIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwidXJsXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJ1dGlsXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJ6bGliXCIiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NsaXVpL2J1aWxkL2luZGV4LmNqcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY29tbWFuZGVyL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jb21tYW5kZXIvbGliL2FyZ3VtZW50LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jb21tYW5kZXIvbGliL2NvbW1hbmQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvZXJyb3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvaGVscC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY29tbWFuZGVyL2xpYi9vcHRpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvc3VnZ2VzdFNpbWlsYXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2xydS1jYWNoZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveTE4bi9idWlsZC9pbmRleC5janMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9pbmRleC5janMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2luZGV4LmNqcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL0NMSS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL0NhY2hlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2Jyb3dzZXItZGF0YS9jaHJvbWUtaGVhZGxlc3Mtc2hlbGwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9icm93c2VyLWRhdGEvY2hyb21lLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vYnJvd3Nlci1kYXRhL2Nocm9tZWRyaXZlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2Jyb3dzZXItZGF0YS9jaHJvbWl1bS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2Jyb3dzZXItZGF0YS9maXJlZm94LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vYnJvd3Nlci1kYXRhL3R5cGVzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vZGVidWcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9kZXRlY3RQbGF0Zm9ybS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvQHB1cHBldGVlci9icm93c2Vycy9saWIvZXNtL2ZpbGVVdGlsLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vaHR0cFV0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL0BwdXBwZXRlZXIvYnJvd3NlcnMvbGliL2VzbS9pbnN0YWxsLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vbGF1bmNoLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9AcHVwcGV0ZWVyL2Jyb3dzZXJzL2xpYi9lc20vbWFpbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvY2xpdWkvYnVpbGQvbGliL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jbGl1aS9idWlsZC9saWIvc3RyaW5nLXV0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9jbGl1aS9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9lc20ubWpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9lc2NhbGFkZS9zeW5jL2luZGV4Lm1qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9Ccm93c2VyQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0NEUFNlc3Npb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9EaWFsb2cuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9FbGVtZW50SGFuZGxlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvRWxlbWVudEhhbmRsZVN5bWJvbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0Vudmlyb25tZW50LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvRnJhbWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9IVFRQUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0hUVFBSZXNwb25zZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYXBpL0lucHV0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvSlNIYW5kbGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9QYWdlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9hcGkvUmVhbG0uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9UYXJnZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9XZWJXb3JrZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9hcGkuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2FwaS9sb2NhdG9ycy9sb2NhdG9ycy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvYmlkaS9Ccm93c2VyQ29ubmVjdG9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQWNjZXNzaWJpbGl0eS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0FyaWFRdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9CaW5kaW5nLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0Jyb3dzZXJDb25uZWN0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9Ccm93c2VyQ29udGV4dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0NEUFNlc3Npb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9DZHBQcmVsb2FkU2NyaXB0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvQ2hyb21lVGFyZ2V0TWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0Nvbm5lY3Rpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9Db3ZlcmFnZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0RldmljZVJlcXVlc3RQcm9tcHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9EaWFsb2cuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9FbGVtZW50SGFuZGxlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRW11bGF0aW9uTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0V4ZWN1dGlvbkNvbnRleHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9FeHRlbnNpb25UcmFuc3BvcnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9GaXJlZm94VGFyZ2V0TWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0ZyYW1lLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRnJhbWVNYW5hZ2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRnJhbWVNYW5hZ2VyRXZlbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvRnJhbWVUcmVlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvSFRUUFJlcXVlc3QuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9IVFRQUmVzcG9uc2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9JbnB1dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0lzb2xhdGVkV29ybGQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9Jc29sYXRlZFdvcmxkcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL0pTSGFuZGxlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvTGlmZWN5Y2xlV2F0Y2hlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL05ldHdvcmtFdmVudE1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9OZXR3b3JrTWFuYWdlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL1BhZ2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9QcmVkZWZpbmVkTmV0d29ya0NvbmRpdGlvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9UYXJnZXQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NkcC9UYXJnZXRNYW5hZ2VyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jZHAvVHJhY2luZy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL1dlYldvcmtlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL2NkcC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY2RwL3V0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQnJvd3NlckNvbm5lY3Rvci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0Jyb3dzZXJXZWJTb2NrZXRUcmFuc3BvcnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9DU1NRdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9DYWxsYmFja1JlZ2lzdHJ5LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQ29uZmlndXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0Nvbm5lY3RPcHRpb25zLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQ29ubmVjdGlvblRyYW5zcG9ydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0NvbnNvbGVNZXNzYWdlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQ29va2llLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vQ3VzdG9tUXVlcnlIYW5kbGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vRGVidWcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9EZXZpY2UuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9FcnJvcnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9GaWxlQ2hvb3Nlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0dldFF1ZXJ5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL0hhbmRsZUl0ZXJhdG9yLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vTGF6eUFyZy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL05ldHdvcmtNYW5hZ2VyRXZlbnRzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vUERGT3B0aW9ucy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1BRdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9QU2VsZWN0b3JQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9QaWVyY2VRdWVyeUhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9Qcm9kdWN0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vUHVwcGV0ZWVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vUXVlcnlIYW5kbGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vU2NyaXB0SW5qZWN0b3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9TZWN1cml0eURldGFpbHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9UYXNrUXVldWUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9UZXh0UXVlcnlIYW5kbGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vVGltZW91dFNldHRpbmdzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vVVNLZXlib2FyZExheW91dC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL1ZpZXdwb3J0LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vV2FpdFRhc2suanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2NvbW1vbi9YUGF0aFF1ZXJ5SGFuZGxlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvY29tbW9uL3R5cGVzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9jb21tb24vdXRpbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvZW52aXJvbm1lbnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2dlbmVyYXRlZC9pbmplY3RlZC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvZ2VuZXJhdGVkL3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2luZGV4LWJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL2luZGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL0Nocm9tZUxhdW5jaGVyLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL0ZpcmVmb3hMYXVuY2hlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvbm9kZS9MYXVuY2hPcHRpb25zLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL05vZGVXZWJTb2NrZXRUcmFuc3BvcnQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL25vZGUvUGlwZVRyYW5zcG9ydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvbm9kZS9Qcm9kdWN0TGF1bmNoZXIuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL25vZGUvUHVwcGV0ZWVyTm9kZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvbm9kZS9TY3JlZW5SZWNvcmRlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvbm9kZS9ub2RlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9ub2RlL3V0aWwvZnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3B1cHBldGVlci1jb3JlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci9yZXZpc2lvbnMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvQXN5bmNJdGVyYWJsZVV0aWwuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvRGVmZXJyZWQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvRXJyb3JMaWtlLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci91dGlsL0Z1bmN0aW9uLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci91dGlsL011dGV4LmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci91dGlsL2Fzc2VydC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS9wdXBwZXRlZXIvdXRpbC9kZWNvcmF0b3JzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy9wdXBwZXRlZXItY29yZS9saWIvZXNtL3B1cHBldGVlci91dGlsL2Rpc3Bvc2FibGUuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vcHVwcGV0ZWVyL3V0aWwvdXRpbC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS90aGlyZF9wYXJ0eS9taXR0L21pdHQuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3B1cHBldGVlci1jb3JlL2xpYi9lc20vdGhpcmRfcGFydHkvcGFyc2VsLWpzL3BhcnNlbC1qcy5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMvcHVwcGV0ZWVyLWNvcmUvbGliL2VzbS90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3dzL3dyYXBwZXIubWpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95MThuL2J1aWxkL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveTE4bi9idWlsZC9saWIvcGxhdGZvcm0tc2hpbXMvbm9kZS5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveTE4bi9pbmRleC5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIvc3RyaW5nLXV0aWxzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YXJncy1wYXJzZXIvYnVpbGQvbGliL3Rva2VuaXplLWFyZy1zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzLXBhcnNlci9idWlsZC9saWIveWFyZ3MtcGFyc2VyLXR5cGVzLmpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YXJncy1wYXJzZXIvYnVpbGQvbGliL3lhcmdzLXBhcnNlci5qcyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3QvLi9ub2RlX21vZHVsZXMveWFyZ3MvYnVpbGQvbGliL3V0aWxzL2FwcGx5LWV4dGVuZHMuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi91dGlscy9wcm9jZXNzLWFyZ3YuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkL2xpYi95ZXJyb3IuanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzL2hlbHBlcnMvaGVscGVycy5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0Ly4vbm9kZV9tb2R1bGVzL3lhcmdzL2xpYi9wbGF0Zm9ybS1zaGltcy9lc20ubWpzIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC8uL25vZGVfbW9kdWxlcy95YXJncy95YXJncy5tanMiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3Qvd2VicGFjay9ydW50aW1lL2NyZWF0ZSBmYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3Qvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9hZ2FtYS13ZWJwYWNrLXRlc3Qvd2VicGFjay9ydW50aW1lL2dldCBqYXZhc2NyaXB0IGNodW5rIGZpbGVuYW1lIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvbm9kZSBtb2R1bGUgZGVjb3JhdG9yIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3J1bnRpbWUvcmVxdWlyZSBjaHVuayBsb2FkaW5nIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL2JlZm9yZS1zdGFydHVwIiwid2VicGFjazovL2FnYW1hLXdlYnBhY2stdGVzdC93ZWJwYWNrL3N0YXJ0dXAiLCJ3ZWJwYWNrOi8vYWdhbWEtd2VicGFjay10ZXN0L3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSBsb2NhbHN0b3JhZ2UoKTtcbmV4cG9ydHMuZGVzdHJveSA9ICgoKSA9PiB7XG5cdGxldCB3YXJuZWQgPSBmYWxzZTtcblxuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGlmICghd2FybmVkKSB7XG5cdFx0XHR3YXJuZWQgPSB0cnVlO1xuXHRcdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdFx0fVxuXHR9O1xufSkoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG5cdCcjMDAwMENDJyxcblx0JyMwMDAwRkYnLFxuXHQnIzAwMzNDQycsXG5cdCcjMDAzM0ZGJyxcblx0JyMwMDY2Q0MnLFxuXHQnIzAwNjZGRicsXG5cdCcjMDA5OUNDJyxcblx0JyMwMDk5RkYnLFxuXHQnIzAwQ0MwMCcsXG5cdCcjMDBDQzMzJyxcblx0JyMwMENDNjYnLFxuXHQnIzAwQ0M5OScsXG5cdCcjMDBDQ0NDJyxcblx0JyMwMENDRkYnLFxuXHQnIzMzMDBDQycsXG5cdCcjMzMwMEZGJyxcblx0JyMzMzMzQ0MnLFxuXHQnIzMzMzNGRicsXG5cdCcjMzM2NkNDJyxcblx0JyMzMzY2RkYnLFxuXHQnIzMzOTlDQycsXG5cdCcjMzM5OUZGJyxcblx0JyMzM0NDMDAnLFxuXHQnIzMzQ0MzMycsXG5cdCcjMzNDQzY2Jyxcblx0JyMzM0NDOTknLFxuXHQnIzMzQ0NDQycsXG5cdCcjMzNDQ0ZGJyxcblx0JyM2NjAwQ0MnLFxuXHQnIzY2MDBGRicsXG5cdCcjNjYzM0NDJyxcblx0JyM2NjMzRkYnLFxuXHQnIzY2Q0MwMCcsXG5cdCcjNjZDQzMzJyxcblx0JyM5OTAwQ0MnLFxuXHQnIzk5MDBGRicsXG5cdCcjOTkzM0NDJyxcblx0JyM5OTMzRkYnLFxuXHQnIzk5Q0MwMCcsXG5cdCcjOTlDQzMzJyxcblx0JyNDQzAwMDAnLFxuXHQnI0NDMDAzMycsXG5cdCcjQ0MwMDY2Jyxcblx0JyNDQzAwOTknLFxuXHQnI0NDMDBDQycsXG5cdCcjQ0MwMEZGJyxcblx0JyNDQzMzMDAnLFxuXHQnI0NDMzMzMycsXG5cdCcjQ0MzMzY2Jyxcblx0JyNDQzMzOTknLFxuXHQnI0NDMzNDQycsXG5cdCcjQ0MzM0ZGJyxcblx0JyNDQzY2MDAnLFxuXHQnI0NDNjYzMycsXG5cdCcjQ0M5OTAwJyxcblx0JyNDQzk5MzMnLFxuXHQnI0NDQ0MwMCcsXG5cdCcjQ0NDQzMzJyxcblx0JyNGRjAwMDAnLFxuXHQnI0ZGMDAzMycsXG5cdCcjRkYwMDY2Jyxcblx0JyNGRjAwOTknLFxuXHQnI0ZGMDBDQycsXG5cdCcjRkYwMEZGJyxcblx0JyNGRjMzMDAnLFxuXHQnI0ZGMzMzMycsXG5cdCcjRkYzMzY2Jyxcblx0JyNGRjMzOTknLFxuXHQnI0ZGMzNDQycsXG5cdCcjRkYzM0ZGJyxcblx0JyNGRjY2MDAnLFxuXHQnI0ZGNjYzMycsXG5cdCcjRkY5OTAwJyxcblx0JyNGRjk5MzMnLFxuXHQnI0ZGQ0MwMCcsXG5cdCcjRkZDQzMzJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHQvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG5cdC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG5cdC8vIGV4cGxpY2l0bHlcblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmICh3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHdpbmRvdy5wcm9jZXNzLl9fbndqcykpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0IGNvbG9ycy5cblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVxcLyhcXGQrKS8pKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gSXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcblx0Ly8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcblx0cmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG5cdFx0Ly8gSXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuXHRcdCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG5cdFx0Ly8gSXMgZmlyZWZveCA+PSB2MzE/XG5cdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykgJiYgcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCkgPj0gMzEpIHx8XG5cdFx0Ly8gRG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKSk7XG59XG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdGFyZ3NbMF0gPSAodGhpcy51c2VDb2xvcnMgPyAnJWMnIDogJycpICtcblx0XHR0aGlzLm5hbWVzcGFjZSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyAlYycgOiAnICcpICtcblx0XHRhcmdzWzBdICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnJWMgJyA6ICcgJykgK1xuXHRcdCcrJyArIG1vZHVsZS5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cblx0aWYgKCF0aGlzLnVzZUNvbG9ycykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuXHRhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKTtcblxuXHQvLyBUaGUgZmluYWwgXCIlY1wiIGlzIHNvbWV3aGF0IHRyaWNreSwgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlclxuXHQvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG5cdC8vIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgaW5kZXggdG8gaW5zZXJ0IHRoZSBDU1MgaW50b1xuXHRsZXQgaW5kZXggPSAwO1xuXHRsZXQgbGFzdEMgPSAwO1xuXHRhcmdzWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZywgbWF0Y2ggPT4ge1xuXHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpbmRleCsrO1xuXHRcdGlmIChtYXRjaCA9PT0gJyVjJykge1xuXHRcdFx0Ly8gV2Ugb25seSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgKmxhc3QqICVjXG5cdFx0XHQvLyAodGhlIHVzZXIgbWF5IGhhdmUgcHJvdmlkZWQgdGhlaXIgb3duKVxuXHRcdFx0bGFzdEMgPSBpbmRleDtcblx0XHR9XG5cdH0pO1xuXG5cdGFyZ3Muc3BsaWNlKGxhc3RDLCAwLCBjKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGBjb25zb2xlLmRlYnVnKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGEgXCJmdW5jdGlvblwiLlxuICogSWYgYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhdmFpbGFibGUsIGZhbGxzIGJhY2tcbiAqIHRvIGBjb25zb2xlLmxvZ2AuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuZXhwb3J0cy5sb2cgPSBjb25zb2xlLmRlYnVnIHx8IGNvbnNvbGUubG9nIHx8ICgoKSA9PiB7fSk7XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcblx0dHJ5IHtcblx0XHRpZiAobmFtZXNwYWNlcykge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnNldEl0ZW0oJ2RlYnVnJywgbmFtZXNwYWNlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuXHRcdH1cblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbG9hZCgpIHtcblx0bGV0IHI7XG5cdHRyeSB7XG5cdFx0ciA9IGV4cG9ydHMuc3RvcmFnZS5nZXRJdGVtKCdkZWJ1ZycpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxuXG5cdC8vIElmIGRlYnVnIGlzbid0IHNldCBpbiBMUywgYW5kIHdlJ3JlIGluIEVsZWN0cm9uLCB0cnkgdG8gbG9hZCAkREVCVUdcblx0aWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG5cdFx0ciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG5cblx0cmV0dXJuIHI7XG59XG5cbi8qKlxuICogTG9jYWxzdG9yYWdlIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgbG9jYWxzdG9yYWdlLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc2FmYXJpIHRocm93c1xuICogd2hlbiBhIHVzZXIgZGlzYWJsZXMgY29va2llcy9sb2NhbHN0b3JhZ2VcbiAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG4gKlxuICogQHJldHVybiB7TG9jYWxTdG9yYWdlfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9jYWxzdG9yYWdlKCkge1xuXHR0cnkge1xuXHRcdC8vIFRWTUxLaXQgKEFwcGxlIFRWIEpTIFJ1bnRpbWUpIGRvZXMgbm90IGhhdmUgYSB3aW5kb3cgb2JqZWN0LCBqdXN0IGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHRcblx0XHQvLyBUaGUgQnJvd3NlciBhbHNvIGhhcyBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0LlxuXHRcdHJldHVybiBsb2NhbFN0b3JhZ2U7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9jb21tb24nKShleHBvcnRzKTtcblxuY29uc3Qge2Zvcm1hdHRlcnN9ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uICh2KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnJvci5tZXNzYWdlO1xuXHR9XG59O1xuIiwiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKi9cblxuZnVuY3Rpb24gc2V0dXAoZW52KSB7XG5cdGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmRlZmF1bHQgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuY29lcmNlID0gY29lcmNlO1xuXHRjcmVhdGVEZWJ1Zy5kaXNhYmxlID0gZGlzYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlID0gZW5hYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGVkID0gZW5hYmxlZDtcblx0Y3JlYXRlRGVidWcuaHVtYW5pemUgPSByZXF1aXJlKCdtcycpO1xuXHRjcmVhdGVEZWJ1Zy5kZXN0cm95ID0gZGVzdHJveTtcblxuXHRPYmplY3Qua2V5cyhlbnYpLmZvckVhY2goa2V5ID0+IHtcblx0XHRjcmVhdGVEZWJ1Z1trZXldID0gZW52W2tleV07XG5cdH0pO1xuXG5cdC8qKlxuXHQqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGRlYnVnIG1vZGUgbmFtZXMsIGFuZCBuYW1lcyB0byBza2lwLlxuXHQqL1xuXG5cdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0LyoqXG5cdCogTWFwIG9mIHNwZWNpYWwgXCIlblwiIGhhbmRsaW5nIGZ1bmN0aW9ucywgZm9yIHRoZSBkZWJ1ZyBcImZvcm1hdFwiIGFyZ3VtZW50LlxuXHQqXG5cdCogVmFsaWQga2V5IG5hbWVzIGFyZSBhIHNpbmdsZSwgbG93ZXIgb3IgdXBwZXItY2FzZSBsZXR0ZXIsIGkuZS4gXCJuXCIgYW5kIFwiTlwiLlxuXHQqL1xuXHRjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzID0ge307XG5cblx0LyoqXG5cdCogU2VsZWN0cyBhIGNvbG9yIGZvciBhIGRlYnVnIG5hbWVzcGFjZVxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBzdHJpbmcgZm9yIHRoZSBkZWJ1ZyBpbnN0YW5jZSB0byBiZSBjb2xvcmVkXG5cdCogQHJldHVybiB7TnVtYmVyfFN0cmluZ30gQW4gQU5TSSBjb2xvciBjb2RlIGZvciB0aGUgZ2l2ZW4gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHNlbGVjdENvbG9yKG5hbWVzcGFjZSkge1xuXHRcdGxldCBoYXNoID0gMDtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBuYW1lc3BhY2UuY2hhckNvZGVBdChpKTtcblx0XHRcdGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNyZWF0ZURlYnVnLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGNyZWF0ZURlYnVnLmNvbG9ycy5sZW5ndGhdO1xuXHR9XG5cdGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yID0gc2VsZWN0Q29sb3I7XG5cblx0LyoqXG5cdCogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQHJldHVybiB7RnVuY3Rpb259XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gY3JlYXRlRGVidWcobmFtZXNwYWNlKSB7XG5cdFx0bGV0IHByZXZUaW1lO1xuXHRcdGxldCBlbmFibGVPdmVycmlkZSA9IG51bGw7XG5cdFx0bGV0IG5hbWVzcGFjZXNDYWNoZTtcblx0XHRsZXQgZW5hYmxlZENhY2hlO1xuXG5cdFx0ZnVuY3Rpb24gZGVidWcoLi4uYXJncykge1xuXHRcdFx0Ly8gRGlzYWJsZWQ/XG5cdFx0XHRpZiAoIWRlYnVnLmVuYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzZWxmID0gZGVidWc7XG5cblx0XHRcdC8vIFNldCBgZGlmZmAgdGltZXN0YW1wXG5cdFx0XHRjb25zdCBjdXJyID0gTnVtYmVyKG5ldyBEYXRlKCkpO1xuXHRcdFx0Y29uc3QgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuXHRcdFx0c2VsZi5kaWZmID0gbXM7XG5cdFx0XHRzZWxmLnByZXYgPSBwcmV2VGltZTtcblx0XHRcdHNlbGYuY3VyciA9IGN1cnI7XG5cdFx0XHRwcmV2VGltZSA9IGN1cnI7XG5cblx0XHRcdGFyZ3NbMF0gPSBjcmVhdGVEZWJ1Zy5jb2VyY2UoYXJnc1swXSk7XG5cblx0XHRcdGlmICh0eXBlb2YgYXJnc1swXSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cblx0XHRcdFx0YXJncy51bnNoaWZ0KCclTycpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuXHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCAobWF0Y2gsIGZvcm1hdCkgPT4ge1xuXHRcdFx0XHQvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG5cdFx0XHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0XHRcdHJldHVybiAnJSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0Y29uc3QgZm9ybWF0dGVyID0gY3JlYXRlRGVidWcuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXHRcdFx0XHRpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdGNvbnN0IHZhbCA9IGFyZ3NbaW5kZXhdO1xuXHRcdFx0XHRcdG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuXHRcdFx0XHRcdC8vIE5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcblx0XHRcdFx0XHRhcmdzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHRcdFx0aW5kZXgtLTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcblx0XHRcdGNyZWF0ZURlYnVnLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuXHRcdFx0Y29uc3QgbG9nRm4gPSBzZWxmLmxvZyB8fCBjcmVhdGVEZWJ1Zy5sb2c7XG5cdFx0XHRsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcblx0XHR9XG5cblx0XHRkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdFx0ZGVidWcudXNlQ29sb3JzID0gY3JlYXRlRGVidWcudXNlQ29sb3JzKCk7XG5cdFx0ZGVidWcuY29sb3IgPSBjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXHRcdGRlYnVnLmV4dGVuZCA9IGV4dGVuZDtcblx0XHRkZWJ1Zy5kZXN0cm95ID0gY3JlYXRlRGVidWcuZGVzdHJveTsgLy8gWFhYIFRlbXBvcmFyeS4gV2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVidWcsICdlbmFibGVkJywge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0aWYgKGVuYWJsZU92ZXJyaWRlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVuYWJsZU92ZXJyaWRlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChuYW1lc3BhY2VzQ2FjaGUgIT09IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMpIHtcblx0XHRcdFx0XHRuYW1lc3BhY2VzQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzO1xuXHRcdFx0XHRcdGVuYWJsZWRDYWNoZSA9IGNyZWF0ZURlYnVnLmVuYWJsZWQobmFtZXNwYWNlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBlbmFibGVkQ2FjaGU7XG5cdFx0XHR9LFxuXHRcdFx0c2V0OiB2ID0+IHtcblx0XHRcdFx0ZW5hYmxlT3ZlcnJpZGUgPSB2O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gRW52LXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGxvZ2ljIGZvciBkZWJ1ZyBpbnN0YW5jZXNcblx0XHRpZiAodHlwZW9mIGNyZWF0ZURlYnVnLmluaXQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNyZWF0ZURlYnVnLmluaXQoZGVidWcpO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWJ1Zztcblx0fVxuXG5cdGZ1bmN0aW9uIGV4dGVuZChuYW1lc3BhY2UsIGRlbGltaXRlcikge1xuXHRcdGNvbnN0IG5ld0RlYnVnID0gY3JlYXRlRGVidWcodGhpcy5uYW1lc3BhY2UgKyAodHlwZW9mIGRlbGltaXRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnOicgOiBkZWxpbWl0ZXIpICsgbmFtZXNwYWNlKTtcblx0XHRuZXdEZWJ1Zy5sb2cgPSB0aGlzLmxvZztcblx0XHRyZXR1cm4gbmV3RGVidWc7XG5cdH1cblxuXHQvKipcblx0KiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG5cdCogc2VwYXJhdGVkIGJ5IGEgY29sb24gYW5kIHdpbGRjYXJkcy5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcblx0XHRjcmVhdGVEZWJ1Zy5zYXZlKG5hbWVzcGFjZXMpO1xuXHRcdGNyZWF0ZURlYnVnLm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzO1xuXG5cdFx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0XHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdFx0bGV0IGk7XG5cdFx0Y29uc3Qgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuXHRcdGNvbnN0IGxlbiA9IHNwbGl0Lmxlbmd0aDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKCFzcGxpdFtpXSkge1xuXHRcdFx0XHQvLyBpZ25vcmUgZW1wdHkgc3RyaW5nc1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bmFtZXNwYWNlcyA9IHNwbGl0W2ldLnJlcGxhY2UoL1xcKi9nLCAnLio/Jyk7XG5cblx0XHRcdGlmIChuYW1lc3BhY2VzWzBdID09PSAnLScpIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcuc2tpcHMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMuc2xpY2UoMSkgKyAnJCcpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG5cdCpcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBkaXNhYmxlKCkge1xuXHRcdGNvbnN0IG5hbWVzcGFjZXMgPSBbXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5uYW1lcy5tYXAodG9OYW1lc3BhY2UpLFxuXHRcdFx0Li4uY3JlYXRlRGVidWcuc2tpcHMubWFwKHRvTmFtZXNwYWNlKS5tYXAobmFtZXNwYWNlID0+ICctJyArIG5hbWVzcGFjZSlcblx0XHRdLmpvaW4oJywnKTtcblx0XHRjcmVhdGVEZWJ1Zy5lbmFibGUoJycpO1xuXHRcdHJldHVybiBuYW1lc3BhY2VzO1xuXHR9XG5cblx0LyoqXG5cdCogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0KiBAcmV0dXJuIHtCb29sZWFufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuXHRcdGlmIChuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcqJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0bGV0IGk7XG5cdFx0bGV0IGxlbjtcblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQqIENvbnZlcnQgcmVnZXhwIHRvIG5hbWVzcGFjZVxuXHQqXG5cdCogQHBhcmFtIHtSZWdFeHB9IHJlZ3hlcFxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHRvTmFtZXNwYWNlKHJlZ2V4cCkge1xuXHRcdHJldHVybiByZWdleHAudG9TdHJpbmcoKVxuXHRcdFx0LnN1YnN0cmluZygyLCByZWdleHAudG9TdHJpbmcoKS5sZW5ndGggLSAyKVxuXHRcdFx0LnJlcGxhY2UoL1xcLlxcKlxcPyQvLCAnKicpO1xuXHR9XG5cblx0LyoqXG5cdCogQ29lcmNlIGB2YWxgLlxuXHQqXG5cdCogQHBhcmFtIHtNaXhlZH0gdmFsXG5cdCogQHJldHVybiB7TWl4ZWR9XG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcblx0XHRpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRcdHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHQvKipcblx0KiBYWFggRE8gTk9UIFVTRS4gVGhpcyBpcyBhIHRlbXBvcmFyeSBzdHViIGZ1bmN0aW9uLlxuXHQqIFhYWCBJdCBXSUxMIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblx0Ki9cblx0ZnVuY3Rpb24gZGVzdHJveSgpIHtcblx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0fVxuXG5cdGNyZWF0ZURlYnVnLmVuYWJsZShjcmVhdGVEZWJ1Zy5sb2FkKCkpO1xuXG5cdHJldHVybiBjcmVhdGVEZWJ1Zztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXR1cDtcbiIsIi8qKlxuICogRGV0ZWN0IEVsZWN0cm9uIHJlbmRlcmVyIC8gbndqcyBwcm9jZXNzLCB3aGljaCBpcyBub2RlLCBidXQgd2Ugc2hvdWxkXG4gKiB0cmVhdCBhcyBhIGJyb3dzZXIuXG4gKi9cblxuaWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJyB8fCBwcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgcHJvY2Vzcy5icm93c2VyID09PSB0cnVlIHx8IHByb2Nlc3MuX19ud2pzKSB7XG5cdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9icm93c2VyLmpzJyk7XG59IGVsc2Uge1xuXHRtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbm9kZS5qcycpO1xufVxuIiwiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbmNvbnN0IHR0eSA9IHJlcXVpcmUoJ3R0eScpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuZGVzdHJveSA9IHV0aWwuZGVwcmVjYXRlKFxuXHQoKSA9PiB7fSxcblx0J0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nXG4pO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFs2LCAyLCAzLCA0LCA1LCAxXTtcblxudHJ5IHtcblx0Ly8gT3B0aW9uYWwgZGVwZW5kZW5jeSAoYXMgaW4sIGRvZXNuJ3QgbmVlZCB0byBiZSBpbnN0YWxsZWQsIE5PVCBsaWtlIG9wdGlvbmFsRGVwZW5kZW5jaWVzIGluIHBhY2thZ2UuanNvbilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuXHRjb25zdCBzdXBwb3J0c0NvbG9yID0gcmVxdWlyZSgnc3VwcG9ydHMtY29sb3InKTtcblxuXHRpZiAoc3VwcG9ydHNDb2xvciAmJiAoc3VwcG9ydHNDb2xvci5zdGRlcnIgfHwgc3VwcG9ydHNDb2xvcikubGV2ZWwgPj0gMikge1xuXHRcdGV4cG9ydHMuY29sb3JzID0gW1xuXHRcdFx0MjAsXG5cdFx0XHQyMSxcblx0XHRcdDI2LFxuXHRcdFx0MjcsXG5cdFx0XHQzMixcblx0XHRcdDMzLFxuXHRcdFx0MzgsXG5cdFx0XHQzOSxcblx0XHRcdDQwLFxuXHRcdFx0NDEsXG5cdFx0XHQ0Mixcblx0XHRcdDQzLFxuXHRcdFx0NDQsXG5cdFx0XHQ0NSxcblx0XHRcdDU2LFxuXHRcdFx0NTcsXG5cdFx0XHQ2Mixcblx0XHRcdDYzLFxuXHRcdFx0NjgsXG5cdFx0XHQ2OSxcblx0XHRcdDc0LFxuXHRcdFx0NzUsXG5cdFx0XHQ3Nixcblx0XHRcdDc3LFxuXHRcdFx0NzgsXG5cdFx0XHQ3OSxcblx0XHRcdDgwLFxuXHRcdFx0ODEsXG5cdFx0XHQ5Mixcblx0XHRcdDkzLFxuXHRcdFx0OTgsXG5cdFx0XHQ5OSxcblx0XHRcdDExMixcblx0XHRcdDExMyxcblx0XHRcdDEyOCxcblx0XHRcdDEyOSxcblx0XHRcdDEzNCxcblx0XHRcdDEzNSxcblx0XHRcdDE0OCxcblx0XHRcdDE0OSxcblx0XHRcdDE2MCxcblx0XHRcdDE2MSxcblx0XHRcdDE2Mixcblx0XHRcdDE2Myxcblx0XHRcdDE2NCxcblx0XHRcdDE2NSxcblx0XHRcdDE2Nixcblx0XHRcdDE2Nyxcblx0XHRcdDE2OCxcblx0XHRcdDE2OSxcblx0XHRcdDE3MCxcblx0XHRcdDE3MSxcblx0XHRcdDE3Mixcblx0XHRcdDE3Myxcblx0XHRcdDE3OCxcblx0XHRcdDE3OSxcblx0XHRcdDE4NCxcblx0XHRcdDE4NSxcblx0XHRcdDE5Nixcblx0XHRcdDE5Nyxcblx0XHRcdDE5OCxcblx0XHRcdDE5OSxcblx0XHRcdDIwMCxcblx0XHRcdDIwMSxcblx0XHRcdDIwMixcblx0XHRcdDIwMyxcblx0XHRcdDIwNCxcblx0XHRcdDIwNSxcblx0XHRcdDIwNixcblx0XHRcdDIwNyxcblx0XHRcdDIwOCxcblx0XHRcdDIwOSxcblx0XHRcdDIxNCxcblx0XHRcdDIxNSxcblx0XHRcdDIyMCxcblx0XHRcdDIyMVxuXHRcdF07XG5cdH1cbn0gY2F0Y2ggKGVycm9yKSB7XG5cdC8vIFN3YWxsb3cgLSB3ZSBvbmx5IGNhcmUgaWYgYHN1cHBvcnRzLWNvbG9yYCBpcyBhdmFpbGFibGU7IGl0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbn1cblxuLyoqXG4gKiBCdWlsZCB1cCB0aGUgZGVmYXVsdCBgaW5zcGVjdE9wdHNgIG9iamVjdCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKlxuICogICAkIERFQlVHX0NPTE9SUz1ubyBERUJVR19ERVBUSD0xMCBERUJVR19TSE9XX0hJRERFTj1lbmFibGVkIG5vZGUgc2NyaXB0LmpzXG4gKi9cblxuZXhwb3J0cy5pbnNwZWN0T3B0cyA9IE9iamVjdC5rZXlzKHByb2Nlc3MuZW52KS5maWx0ZXIoa2V5ID0+IHtcblx0cmV0dXJuIC9eZGVidWdfL2kudGVzdChrZXkpO1xufSkucmVkdWNlKChvYmosIGtleSkgPT4ge1xuXHQvLyBDYW1lbC1jYXNlXG5cdGNvbnN0IHByb3AgPSBrZXlcblx0XHQuc3Vic3RyaW5nKDYpXG5cdFx0LnRvTG93ZXJDYXNlKClcblx0XHQucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGspID0+IHtcblx0XHRcdHJldHVybiBrLnRvVXBwZXJDYXNlKCk7XG5cdFx0fSk7XG5cblx0Ly8gQ29lcmNlIHN0cmluZyB2YWx1ZSBpbnRvIEpTIHZhbHVlXG5cdGxldCB2YWwgPSBwcm9jZXNzLmVudltrZXldO1xuXHRpZiAoL14oeWVzfG9ufHRydWV8ZW5hYmxlZCkkL2kudGVzdCh2YWwpKSB7XG5cdFx0dmFsID0gdHJ1ZTtcblx0fSBlbHNlIGlmICgvXihub3xvZmZ8ZmFsc2V8ZGlzYWJsZWQpJC9pLnRlc3QodmFsKSkge1xuXHRcdHZhbCA9IGZhbHNlO1xuXHR9IGVsc2UgaWYgKHZhbCA9PT0gJ251bGwnKSB7XG5cdFx0dmFsID0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHR2YWwgPSBOdW1iZXIodmFsKTtcblx0fVxuXG5cdG9ialtwcm9wXSA9IHZhbDtcblx0cmV0dXJuIG9iajtcbn0sIHt9KTtcblxuLyoqXG4gKiBJcyBzdGRvdXQgYSBUVFk/IENvbG9yZWQgb3V0cHV0IGlzIGVuYWJsZWQgd2hlbiBgdHJ1ZWAuXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHRyZXR1cm4gJ2NvbG9ycycgaW4gZXhwb3J0cy5pbnNwZWN0T3B0cyA/XG5cdFx0Qm9vbGVhbihleHBvcnRzLmluc3BlY3RPcHRzLmNvbG9ycykgOlxuXHRcdHR0eS5pc2F0dHkocHJvY2Vzcy5zdGRlcnIuZmQpO1xufVxuXG4vKipcbiAqIEFkZHMgQU5TSSBjb2xvciBlc2NhcGUgY29kZXMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuXHRjb25zdCB7bmFtZXNwYWNlOiBuYW1lLCB1c2VDb2xvcnN9ID0gdGhpcztcblxuXHRpZiAodXNlQ29sb3JzKSB7XG5cdFx0Y29uc3QgYyA9IHRoaXMuY29sb3I7XG5cdFx0Y29uc3QgY29sb3JDb2RlID0gJ1xcdTAwMUJbMycgKyAoYyA8IDggPyBjIDogJzg7NTsnICsgYyk7XG5cdFx0Y29uc3QgcHJlZml4ID0gYCAgJHtjb2xvckNvZGV9OzFtJHtuYW1lfSBcXHUwMDFCWzBtYDtcblxuXHRcdGFyZ3NbMF0gPSBwcmVmaXggKyBhcmdzWzBdLnNwbGl0KCdcXG4nKS5qb2luKCdcXG4nICsgcHJlZml4KTtcblx0XHRhcmdzLnB1c2goY29sb3JDb2RlICsgJ20rJyArIG1vZHVsZS5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZikgKyAnXFx1MDAxQlswbScpO1xuXHR9IGVsc2Uge1xuXHRcdGFyZ3NbMF0gPSBnZXREYXRlKCkgKyBuYW1lICsgJyAnICsgYXJnc1swXTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXREYXRlKCkge1xuXHRpZiAoZXhwb3J0cy5pbnNwZWN0T3B0cy5oaWRlRGF0ZSkge1xuXHRcdHJldHVybiAnJztcblx0fVxuXHRyZXR1cm4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpICsgJyAnO1xufVxuXG4vKipcbiAqIEludm9rZXMgYHV0aWwuZm9ybWF0KClgIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIHdyaXRlcyB0byBzdGRlcnIuXG4gKi9cblxuZnVuY3Rpb24gbG9nKC4uLmFyZ3MpIHtcblx0cmV0dXJuIHByb2Nlc3Muc3RkZXJyLndyaXRlKHV0aWwuZm9ybWF0KC4uLmFyZ3MpICsgJ1xcbicpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0cHJvY2Vzcy5lbnYuREVCVUcgPSBuYW1lc3BhY2VzO1xuXHR9IGVsc2Uge1xuXHRcdC8vIElmIHlvdSBzZXQgYSBwcm9jZXNzLmVudiBmaWVsZCB0byBudWxsIG9yIHVuZGVmaW5lZCwgaXQgZ2V0cyBjYXN0IHRvIHRoZVxuXHRcdC8vIHN0cmluZyAnbnVsbCcgb3IgJ3VuZGVmaW5lZCcuIEp1c3QgZGVsZXRlIGluc3RlYWQuXG5cdFx0ZGVsZXRlIHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcblx0cmV0dXJuIHByb2Nlc3MuZW52LkRFQlVHO1xufVxuXG4vKipcbiAqIEluaXQgbG9naWMgZm9yIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuICpcbiAqIENyZWF0ZSBhIG5ldyBgaW5zcGVjdE9wdHNgIG9iamVjdCBpbiBjYXNlIGB1c2VDb2xvcnNgIGlzIHNldFxuICogZGlmZmVyZW50bHkgZm9yIGEgcGFydGljdWxhciBgZGVidWdgIGluc3RhbmNlLlxuICovXG5cbmZ1bmN0aW9uIGluaXQoZGVidWcpIHtcblx0ZGVidWcuaW5zcGVjdE9wdHMgPSB7fTtcblxuXHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXhwb3J0cy5pbnNwZWN0T3B0cyk7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdGRlYnVnLmluc3BlY3RPcHRzW2tleXNbaV1dID0gZXhwb3J0cy5pbnNwZWN0T3B0c1trZXlzW2ldXTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlbyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGwgb24gYSBzaW5nbGUgbGluZS5cbiAqL1xuXG5mb3JtYXR0ZXJzLm8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpXG5cdFx0LnNwbGl0KCdcXG4nKVxuXHRcdC5tYXAoc3RyID0+IHN0ci50cmltKCkpXG5cdFx0LmpvaW4oJyAnKTtcbn07XG5cbi8qKlxuICogTWFwICVPIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbG93aW5nIG11bHRpcGxlIGxpbmVzIGlmIG5lZWRlZC5cbiAqL1xuXG5mb3JtYXR0ZXJzLk8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5hd2FpdEVhY2hZaWVsZGVkUHJvbWlzZSA9IGV4cG9ydHMubWF5YmVBc3luYyA9IGV4cG9ydHMubWF5YmVBc3luY0ZuID0gdm9pZCAwO1xuZnVuY3Rpb24qIGF3YWl0WWllbGQodmFsdWUpIHtcbiAgICByZXR1cm4gKHlpZWxkIHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGF3YWl0WWllbGRPZihnZW5lcmF0b3IpIHtcbiAgICByZXR1cm4gYXdhaXRZaWVsZChhd2FpdEVhY2hZaWVsZGVkUHJvbWlzZShnZW5lcmF0b3IpKTtcbn1cbmNvbnN0IEF3YWl0WWllbGQgPSBhd2FpdFlpZWxkO1xuQXdhaXRZaWVsZC5vZiA9IGF3YWl0WWllbGRPZjtcbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBhc3luYywgdXNpbmcgYSBnZW5lcmF0b3JcbiAqXG4gKiBXaXRoaW4gdGhlIGdlbmVyYXRvciwgY2FsbCBgeWllbGQqIGF3YWl0ZWQobWF5YmVQcm9taXNlKWAgdG8gYXdhaXQgYSB2YWx1ZVxuICogdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBhIHByb21pc2UuXG4gKlxuICogSWYgdGhlIGlubmVyIGZ1bmN0aW9uIG5ldmVyIHlpZWxkcyBhIHByb21pc2UsIGl0IHdpbGwgcmV0dXJuIHN5bmNocm9ub3VzbHkuXG4gKi9cbmZ1bmN0aW9uIG1heWJlQXN5bmNGbih0aGF0LCBmbikge1xuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCBnZW5lcmF0b3IgPSBmbi5jYWxsKHRoYXQsIEF3YWl0WWllbGQsIC4uLmFyZ3MpO1xuICAgICAgICByZXR1cm4gYXdhaXRFYWNoWWllbGRlZFByb21pc2UoZ2VuZXJhdG9yKTtcbiAgICB9O1xufVxuZXhwb3J0cy5tYXliZUFzeW5jRm4gPSBtYXliZUFzeW5jRm47XG5jbGFzcyBFeGFtcGxlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tYXliZUFzeW5jTWV0aG9kID0gbWF5YmVBc3luY0ZuKHRoaXMsIGZ1bmN0aW9uKiAoYXdhaXRlZCwgYSkge1xuICAgICAgICAgICAgeWllbGQqIGF3YWl0ZWQobmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgYSkpKTtcbiAgICAgICAgICAgIHJldHVybiA1O1xuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBtYXliZUFzeW5jKHRoYXQsIHN0YXJ0R2VuZXJhdG9yKSB7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gc3RhcnRHZW5lcmF0b3IuY2FsbCh0aGF0LCBBd2FpdFlpZWxkKTtcbiAgICByZXR1cm4gYXdhaXRFYWNoWWllbGRlZFByb21pc2UoZ2VuZXJhdG9yKTtcbn1cbmV4cG9ydHMubWF5YmVBc3luYyA9IG1heWJlQXN5bmM7XG5mdW5jdGlvbiBhd2FpdEVhY2hZaWVsZGVkUHJvbWlzZShnZW4pIHtcbiAgICBmdW5jdGlvbiBoYW5kbGVOZXh0U3RlcChzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGVwLnZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXAudmFsdWUudGhlbigodmFsdWUpID0+IGhhbmRsZU5leHRTdGVwKGdlbi5uZXh0KHZhbHVlKSksIChlcnJvcikgPT4gaGFuZGxlTmV4dFN0ZXAoZ2VuLnRocm93KGVycm9yKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVOZXh0U3RlcChnZW4ubmV4dChzdGVwLnZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVOZXh0U3RlcChnZW4ubmV4dCgpKTtcbn1cbmV4cG9ydHMuYXdhaXRFYWNoWWllbGRlZFByb21pc2UgPSBhd2FpdEVhY2hZaWVsZGVkUHJvbWlzZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzeW5jaWZ5LWhlbHBlcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlF1aWNrSlNBc3luY0NvbnRleHQgPSB2b2lkIDA7XG5jb25zdCBjb250ZXh0XzEgPSByZXF1aXJlKFwiLi9jb250ZXh0XCIpO1xuY29uc3QgZGVidWdfMSA9IHJlcXVpcmUoXCIuL2RlYnVnXCIpO1xuY29uc3QgdHlwZXNfMSA9IHJlcXVpcmUoXCIuL3R5cGVzXCIpO1xuLyoqXG4gKiBBc3luY2lmaWVkIHZlcnNpb24gb2YgW1tRdWlja0pTQ29udGV4dF1dLlxuICpcbiAqICpBc3luY2lmeSogYWxsb3dzIG5vcm1hbGx5IHN5bmNocm9ub3VzIGNvZGUgdG8gd2FpdCBmb3IgYXN5bmNocm9ub3VzIFByb21pc2VzXG4gKiBvciBjYWxsYmFja3MuIFRoZSBhc3luY2lmaWVkIHZlcnNpb24gb2YgUXVpY2tKU0NvbnRleHQgY2FuIHdhaXQgZm9yIGFzeW5jXG4gKiBob3N0IGZ1bmN0aW9ucyBhcyB0aG91Z2ggdGhleSB3ZXJlIHN5bmNocm9ub3VzLlxuICovXG5jbGFzcyBRdWlja0pTQXN5bmNDb250ZXh0IGV4dGVuZHMgY29udGV4dF8xLlF1aWNrSlNDb250ZXh0IHtcbiAgICAvKipcbiAgICAgKiBBc3luY2lmaWVkIHZlcnNpb24gb2YgW1tldmFsQ29kZV1dLlxuICAgICAqL1xuICAgIGFzeW5jIGV2YWxDb2RlQXN5bmMoY29kZSwgZmlsZW5hbWUgPSBcImV2YWwuanNcIiwgXG4gICAgLyoqIFNlZSBbW0V2YWxGbGFnc11dIGZvciBudW1iZXIgc2VtYW50aWNzICovXG4gICAgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBkZXRlY3RNb2R1bGUgPSAob3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gMSA6IDApO1xuICAgICAgICBjb25zdCBmbGFncyA9ICgwLCB0eXBlc18xLmV2YWxPcHRpb25zVG9GbGFncykob3B0aW9ucyk7XG4gICAgICAgIGxldCByZXN1bHRQdHIgPSAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0UHRyID0gYXdhaXQgdGhpcy5tZW1vcnlcbiAgICAgICAgICAgICAgICAubmV3SGVhcENoYXJQb2ludGVyKGNvZGUpXG4gICAgICAgICAgICAgICAgLmNvbnN1bWUoKGNoYXJIYW5kbGUpID0+IHRoaXMuZmZpLlFUU19FdmFsX01heWJlQXN5bmModGhpcy5jdHgudmFsdWUsIGNoYXJIYW5kbGUudmFsdWUsIGZpbGVuYW1lLCBkZXRlY3RNb2R1bGUsIGZsYWdzKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJRVFNfRXZhbF9NYXliZUFzeW5jIHRocmV3XCIsIGVycm9yKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVycm9yUHRyID0gdGhpcy5mZmkuUVRTX1Jlc29sdmVFeGNlcHRpb24odGhpcy5jdHgudmFsdWUsIHJlc3VsdFB0cik7XG4gICAgICAgIGlmIChlcnJvclB0cikge1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX0ZyZWVWYWx1ZVBvaW50ZXIodGhpcy5jdHgudmFsdWUsIHJlc3VsdFB0cik7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvcjogdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKGVycm9yUHRyKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocmVzdWx0UHRyKSB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1pbGFyIHRvIFtbbmV3RnVuY3Rpb25dXS5cbiAgICAgKiBDb252ZXJ0IGFuIGFzeW5jIGhvc3QgSmF2YXNjcmlwdCBmdW5jdGlvbiBpbnRvIGEgc3luY2hyb25vdXMgUXVpY2tKUyBmdW5jdGlvbiB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFdoZW5ldmVyIFF1aWNrSlMgY2FsbHMgdGhpcyBmdW5jdGlvbiwgdGhlIFZNJ3Mgc3RhY2sgd2lsbCBiZSB1bndvdW5kIHdoaWxlXG4gICAgICogd2FpdGluZyB0aGUgYXN5bmMgZnVuY3Rpb24gdG8gY29tcGxldGUsIGFuZCB0aGVuIHJlc3RvcmVkIHdoZW4gdGhlIHJldHVybmVkXG4gICAgICogcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgKlxuICAgICAqIEFzeW5jaWZpZWQgZnVuY3Rpb25zIG11c3QgbmV2ZXIgY2FsbCBvdGhlciBhc3luY2lmaWVkIGZ1bmN0aW9ucyBvclxuICAgICAqIGBpbXBvcnRgLCBldmVuIGluZGlyZWN0bHksIGJlY2F1c2UgdGhlIHN0YWNrIGNhbm5vdCBiZSB1bndvdW5kIHR3aWNlLlxuICAgICAqXG4gICAgICogU2VlIFtFbXNjcmlwdGVuJ3MgZG9jcyBvbiBBc3luY2lmeV0oaHR0cHM6Ly9lbXNjcmlwdGVuLm9yZy9kb2NzL3BvcnRpbmcvYXN5bmNpZnkuaHRtbCkuXG4gICAgICovXG4gICAgbmV3QXN5bmNpZmllZEZ1bmN0aW9uKG5hbWUsIGZuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ld0Z1bmN0aW9uKG5hbWUsIGZuKTtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNBc3luY0NvbnRleHQgPSBRdWlja0pTQXN5bmNDb250ZXh0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29udGV4dC1hc3luY2lmeS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU0NvbnRleHQgPSB2b2lkIDA7XG5jb25zdCBkZWJ1Z18xID0gcmVxdWlyZShcIi4vZGVidWdcIik7XG5jb25zdCBkZWZlcnJlZF9wcm9taXNlXzEgPSByZXF1aXJlKFwiLi9kZWZlcnJlZC1wcm9taXNlXCIpO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi9lcnJvcnNcIik7XG5jb25zdCBsaWZldGltZV8xID0gcmVxdWlyZShcIi4vbGlmZXRpbWVcIik7XG5jb25zdCBtZW1vcnlfMSA9IHJlcXVpcmUoXCIuL21lbW9yeVwiKTtcbmNvbnN0IHR5cGVzXzEgPSByZXF1aXJlKFwiLi90eXBlc1wiKTtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ29udGV4dE1lbW9yeSBleHRlbmRzIG1lbW9yeV8xLk1vZHVsZU1lbW9yeSB7XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgY29uc3RydWN0b3IoYXJncykge1xuICAgICAgICBzdXBlcihhcmdzLm1vZHVsZSk7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBuZXcgbGlmZXRpbWVfMS5TY29wZSgpO1xuICAgICAgICB0aGlzLmNvcHlKU1ZhbHVlID0gKHB0cikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmZpLlFUU19EdXBWYWx1ZVBvaW50ZXIodGhpcy5jdHgudmFsdWUsIHB0cik7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZnJlZUpTVmFsdWUgPSAocHRyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZVZhbHVlUG9pbnRlcih0aGlzLmN0eC52YWx1ZSwgcHRyKTtcbiAgICAgICAgfTtcbiAgICAgICAgYXJncy5vd25lZExpZmV0aW1lcz8uZm9yRWFjaCgobGlmZXRpbWUpID0+IHRoaXMuc2NvcGUubWFuYWdlKGxpZmV0aW1lKSk7XG4gICAgICAgIHRoaXMub3duZXIgPSBhcmdzLm93bmVyO1xuICAgICAgICB0aGlzLm1vZHVsZSA9IGFyZ3MubW9kdWxlO1xuICAgICAgICB0aGlzLmZmaSA9IGFyZ3MuZmZpO1xuICAgICAgICB0aGlzLnJ0ID0gYXJncy5ydDtcbiAgICAgICAgdGhpcy5jdHggPSB0aGlzLnNjb3BlLm1hbmFnZShhcmdzLmN0eCk7XG4gICAgfVxuICAgIGdldCBhbGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGUuYWxpdmU7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJhY2sgYGxpZmV0aW1lYCBzbyB0aGF0IGl0IGlzIGRpc3Bvc2VkIHdoZW4gdGhpcyBzY29wZSBpcyBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBtYW5hZ2UobGlmZXRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGUubWFuYWdlKGxpZmV0aW1lKTtcbiAgICB9XG4gICAgY29uc3VtZUpTQ2hhclBvaW50ZXIocHRyKSB7XG4gICAgICAgIGNvbnN0IHN0ciA9IHRoaXMubW9kdWxlLlVURjhUb1N0cmluZyhwdHIpO1xuICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZUNTdHJpbmcodGhpcy5jdHgudmFsdWUsIHB0cik7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIGhlYXBWYWx1ZUhhbmRsZShwdHIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBsaWZldGltZV8xLkxpZmV0aW1lKHB0ciwgdGhpcy5jb3B5SlNWYWx1ZSwgdGhpcy5mcmVlSlNWYWx1ZSwgdGhpcy5vd25lcik7XG4gICAgfVxufVxuLyoqXG4gKiBRdWlja0pTQ29udGV4dCB3cmFwcyBhIFF1aWNrSlMgSmF2YXNjcmlwdCBjb250ZXh0IChKU0NvbnRleHQqKSB3aXRoaW4gYVxuICogcnVudGltZS4gVGhlIGNvbnRleHRzIHdpdGhpbiB0aGUgc2FtZSBydW50aW1lIG1heSBleGNoYW5nZSBvYmplY3RzIGZyZWVseS5cbiAqIFlvdSBjYW4gdGhpbmsgb2Ygc2VwYXJhdGUgcnVudGltZXMgbGlrZSBkaWZmZXJlbnQgZG9tYWlucyBpbiBhIGJyb3dzZXIsIGFuZFxuICogdGhlIGNvbnRleHRzIHdpdGhpbiBhIHJ1bnRpbWUgbGlrZSB0aGUgZGlmZmVyZW50IHdpbmRvd3Mgb3BlbiB0byB0aGUgc2FtZVxuICogZG9tYWluLiBUaGUge0BsaW5rIHJ1bnRpbWV9IHJlZmVyZW5jZXMgdGhlIGNvbnRleHQncyBydW50aW1lLlxuICpcbiAqIFRoaXMgY2xhc3MncyBtZXRob2RzIHJldHVybiB7QGxpbmsgUXVpY2tKU0hhbmRsZX0sIHdoaWNoIHdyYXAgQyBwb2ludGVycyAoSlNWYWx1ZSopLlxuICogSXQncyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2FsbCBgLmRpc3Bvc2UoKWAgb24gYW55XG4gKiBoYW5kbGVzIHlvdSBjcmVhdGUgdG8gZnJlZSBtZW1vcnkgb25jZSB5b3UncmUgZG9uZSB3aXRoIHRoZSBoYW5kbGUuXG4gKlxuICogVXNlIHtAbGluayBRdWlja0pTUnVudGltZS5uZXdDb250ZXh0fSBvciB7QGxpbmsgUXVpY2tKU1dBU01Nb2R1bGUubmV3Q29udGV4dH1cbiAqIHRvIGNyZWF0ZSBhIG5ldyBRdWlja0pTQ29udGV4dC5cbiAqXG4gKiBDcmVhdGUgUXVpY2tKUyB2YWx1ZXMgaW5zaWRlIHRoZSBpbnRlcnByZXRlciB3aXRoIG1ldGhvZHMgbGlrZVxuICogW1tuZXdOdW1iZXJdXSwgW1tuZXdTdHJpbmddXSwgW1tuZXdBcnJheV1dLCBbW25ld09iamVjdF1dLFxuICogW1tuZXdGdW5jdGlvbl1dLCBhbmQgW1tuZXdQcm9taXNlXV0uXG4gKlxuICogQ2FsbCBbW3NldFByb3BdXSBvciBbW2RlZmluZVByb3BdXSB0byBjdXN0b21pemUgb2JqZWN0cy4gVXNlIHRob3NlIG1ldGhvZHNcbiAqIHdpdGggW1tnbG9iYWxdXSB0byBleHBvc2UgdGhlIHZhbHVlcyB5b3UgY3JlYXRlIHRvIHRoZSBpbnRlcmlvciBvZiB0aGVcbiAqIGludGVycHJldGVyLCBzbyB0aGV5IGNhbiBiZSB1c2VkIGluIFtbZXZhbENvZGVdXS5cbiAqXG4gKiBVc2UgW1tldmFsQ29kZV1dIG9yIFtbY2FsbEZ1bmN0aW9uXV0gdG8gZXhlY3V0ZSBKYXZhc2NyaXB0IGluc2lkZSB0aGUgVk0uIElmXG4gKiB5b3UncmUgdXNpbmcgYXN5bmNocm9ub3VzIGNvZGUgaW5zaWRlIHRoZSBRdWlja0pTQ29udGV4dCwgeW91IG1heSBuZWVkIHRvIGFsc29cbiAqIGNhbGwgW1tleGVjdXRlUGVuZGluZ0pvYnNdXS4gRXhlY3V0aW5nIGNvZGUgaW5zaWRlIHRoZSBydW50aW1lIHJldHVybnMgYVxuICogcmVzdWx0IG9iamVjdCByZXByZXNlbnRpbmcgc3VjY2Vzc2Z1bCBleGVjdXRpb24gb3IgYW4gZXJyb3IuIFlvdSBtdXN0IGRpc3Bvc2VcbiAqIG9mIGFueSBzdWNoIHJlc3VsdHMgdG8gYXZvaWQgbGVha2luZyBtZW1vcnkgaW5zaWRlIHRoZSBWTS5cbiAqXG4gKiBJbXBsZW1lbnQgbWVtb3J5IGFuZCBDUFUgY29uc3RyYWludHMgYXQgdGhlIHJ1bnRpbWUgbGV2ZWwsIHVzaW5nIFtbcnVudGltZV1dLlxuICogU2VlIHtAbGluayBRdWlja0pTUnVudGltZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICovXG4vLyBUT0RPOiBNYW5hZ2Ugb3duIGNhbGxiYWNrIHJlZ2lzdHJhdGlvblxuY2xhc3MgUXVpY2tKU0NvbnRleHQge1xuICAgIC8qKlxuICAgICAqIFVzZSB7QGxpbmsgUXVpY2tKUy5jcmVhdGVWbX0gdG8gY3JlYXRlIGEgUXVpY2tKU0NvbnRleHQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYXJncykge1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5fdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5fbnVsbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuX2ZhbHNlID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5fdHJ1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuX2dsb2JhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuX0JpZ0ludCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyoqIEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuZm5OZXh0SWQgPSAtMzI3Njg7IC8vIG1pbiB2YWx1ZSBvZiBzaWduZWQgMTZiaXQgaW50IHVzZWQgYnkgUXVpY2tqc1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5mbk1hcHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaGlkZGVuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNUb0hvc3RDYWxsYmFja3MgPSB7XG4gICAgICAgICAgICBjYWxsRnVuY3Rpb246IChjdHgsIHRoaXNfcHRyLCBhcmdjLCBhcmd2LCBmbl9pZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdHggIT09IHRoaXMuY3R4LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlF1aWNrSlNDb250ZXh0IGluc3RhbmNlIHJlY2VpdmVkIEMgLT4gSlMgY2FsbCB3aXRoIG1pc21hdGNoZWQgY3R4XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBmbiA9IHRoaXMuZ2V0RnVuY3Rpb24oZm5faWQpO1xuICAgICAgICAgICAgICAgIGlmICghZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBcInRocm93XCIgaXMgbm90IGNhdGNoLWFibGUgZnJvbSB0aGUgVFMgc2lkZS4gY291bGQgd2Ugc29tZWhvdyBoYW5kbGUgdGhpcyBoaWdoZXIgdXA/XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVpY2tKU0NvbnRleHQgaGFkIG5vIGNhbGxiYWNrIHdpdGggaWQgJHtmbl9pZH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlTWF5YmVBc3luYyh0aGlzLCBmdW5jdGlvbiogKGF3YWl0ZWQsIHNjb3BlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRoaXNIYW5kbGUgPSBzY29wZS5tYW5hZ2UobmV3IGxpZmV0aW1lXzEuV2Vha0xpZmV0aW1lKHRoaXNfcHRyLCB0aGlzLm1lbW9yeS5jb3B5SlNWYWx1ZSwgdGhpcy5tZW1vcnkuZnJlZUpTVmFsdWUsIHRoaXMucnVudGltZSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcmdIYW5kbGVzID0gbmV3IEFycmF5KGFyZ2MpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ2M7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHRyID0gdGhpcy5mZmkuUVRTX0FyZ3ZHZXRKU1ZhbHVlQ29uc3RQb2ludGVyKGFyZ3YsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnSGFuZGxlc1tpXSA9IHNjb3BlLm1hbmFnZShuZXcgbGlmZXRpbWVfMS5XZWFrTGlmZXRpbWUocHRyLCB0aGlzLm1lbW9yeS5jb3B5SlNWYWx1ZSwgdGhpcy5tZW1vcnkuZnJlZUpTVmFsdWUsIHRoaXMucnVudGltZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCogYXdhaXRlZChmbi5hcHBseSh0aGlzSGFuZGxlLCBhcmdIYW5kbGVzKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFwiZXJyb3JcIiBpbiByZXN1bHQgJiYgcmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBkZWJ1Z18xLmRlYnVnTG9nKShcInRocm93IGVycm9yXCIsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2NvcGUubWFuYWdlKHJlc3VsdCBpbnN0YW5jZW9mIGxpZmV0aW1lXzEuTGlmZXRpbWUgPyByZXN1bHQgOiByZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZmaS5RVFNfRHVwVmFsdWVQb2ludGVyKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvclRvSGFuZGxlKGVycm9yKS5jb25zdW1lKChlcnJvckhhbmRsZSkgPT4gdGhpcy5mZmkuUVRTX1Rocm93KHRoaXMuY3R4LnZhbHVlLCBlcnJvckhhbmRsZS52YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnJ1bnRpbWUgPSBhcmdzLnJ1bnRpbWU7XG4gICAgICAgIHRoaXMubW9kdWxlID0gYXJncy5tb2R1bGU7XG4gICAgICAgIHRoaXMuZmZpID0gYXJncy5mZmk7XG4gICAgICAgIHRoaXMucnQgPSBhcmdzLnJ0O1xuICAgICAgICB0aGlzLmN0eCA9IGFyZ3MuY3R4O1xuICAgICAgICB0aGlzLm1lbW9yeSA9IG5ldyBDb250ZXh0TWVtb3J5KHtcbiAgICAgICAgICAgIC4uLmFyZ3MsXG4gICAgICAgICAgICBvd25lcjogdGhpcy5ydW50aW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgYXJncy5jYWxsYmFja3Muc2V0Q29udGV4dENhbGxiYWNrcyh0aGlzLmN0eC52YWx1ZSwgdGhpcy5jVG9Ib3N0Q2FsbGJhY2tzKTtcbiAgICAgICAgdGhpcy5kdW1wID0gdGhpcy5kdW1wLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZ2V0U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5nZXROdW1iZXIgPSB0aGlzLmdldE51bWJlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlc29sdmVQcm9taXNlID0gdGhpcy5yZXNvbHZlUHJvbWlzZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICAvLyBAaW1wbGVtZW50IERpc3Bvc2FibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGdldCBhbGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmFsaXZlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlIG9mIHRoaXMgVk0ncyB1bmRlcmx5aW5nIHJlc291cmNlcy5cbiAgICAgKlxuICAgICAqIEB0aHJvd3MgQ2FsbGluZyB0aGlzIG1ldGhvZCB3aXRob3V0IGRpc3Bvc2luZyBvZiBhbGwgY3JlYXRlZCBoYW5kbGVzXG4gICAgICogd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuXG4gICAgICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5tZW1vcnkuZGlzcG9zZSgpO1xuICAgIH1cbiAgICAvLyBHbG9iYWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIFtgdW5kZWZpbmVkYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvdW5kZWZpbmVkKS5cbiAgICAgKi9cbiAgICBnZXQgdW5kZWZpbmVkKCkge1xuICAgICAgICBpZiAodGhpcy5fdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVuZGVmaW5lZCBpcyBhIGNvbnN0YW50LCBpbW11dGFibGUgdmFsdWUgaW4gUXVpY2tKUy5cbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5mZmkuUVRTX0dldFVuZGVmaW5lZCgpO1xuICAgICAgICByZXR1cm4gKHRoaXMuX3VuZGVmaW5lZCA9IG5ldyBsaWZldGltZV8xLlN0YXRpY0xpZmV0aW1lKHB0cikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbYG51bGxgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9udWxsKS5cbiAgICAgKi9cbiAgICBnZXQgbnVsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX251bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9udWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIE51bGwgaXMgYSBjb25zdGFudCwgaW1tdXRhYmxlIHZhbHVlIGluIFF1aWNrSlMuXG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMuZmZpLlFUU19HZXROdWxsKCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fbnVsbCA9IG5ldyBsaWZldGltZV8xLlN0YXRpY0xpZmV0aW1lKHB0cikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbYHRydWVgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy90cnVlKS5cbiAgICAgKi9cbiAgICBnZXQgdHJ1ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RydWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRydWUgaXMgYSBjb25zdGFudCwgaW1tdXRhYmxlIHZhbHVlIGluIFF1aWNrSlMuXG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMuZmZpLlFUU19HZXRUcnVlKCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fdHJ1ZSA9IG5ldyBsaWZldGltZV8xLlN0YXRpY0xpZmV0aW1lKHB0cikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbYGZhbHNlYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZmFsc2UpLlxuICAgICAqL1xuICAgIGdldCBmYWxzZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsc2UgaXMgYSBjb25zdGFudCwgaW1tdXRhYmxlIHZhbHVlIGluIFF1aWNrSlMuXG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMuZmZpLlFUU19HZXRGYWxzZSgpO1xuICAgICAgICByZXR1cm4gKHRoaXMuX2ZhbHNlID0gbmV3IGxpZmV0aW1lXzEuU3RhdGljTGlmZXRpbWUocHRyKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtgZ2xvYmFsYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMpLlxuICAgICAqIEEgaGFuZGxlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IGluc2lkZSB0aGUgaW50ZXJwcmV0ZXIuXG4gICAgICogWW91IGNhbiBzZXQgcHJvcGVydGllcyB0byBjcmVhdGUgZ2xvYmFsIHZhcmlhYmxlcy5cbiAgICAgKi9cbiAgICBnZXQgZ2xvYmFsKCkge1xuICAgICAgICBpZiAodGhpcy5fZ2xvYmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2xvYmFsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBnbG9iYWwgaXMgYSBKU1ZhbHVlLCBidXQgc2luY2UgaXQncyBsaWZldGltZSBpcyBhcyBsb25nIGFzIHRoZSBWTSdzLFxuICAgICAgICAvLyB3ZSBzaG91bGQgbWFuYWdlIGl0LlxuICAgICAgICBjb25zdCBwdHIgPSB0aGlzLmZmaS5RVFNfR2V0R2xvYmFsT2JqZWN0KHRoaXMuY3R4LnZhbHVlKTtcbiAgICAgICAgLy8gQXV0b21hdGljYWxseSBjbGVhbiB1cCB0aGlzIHJlZmVyZW5jZSB3aGVuIHdlIGRpc3Bvc2VcbiAgICAgICAgdGhpcy5tZW1vcnkubWFuYWdlKHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShwdHIpKTtcbiAgICAgICAgLy8gVGhpcyBpc24ndCB0ZWNobmljYWxseSBhIHN0YXRpYyBsaWZldGltZSwgYnV0IHNpbmNlIGl0IGhhcyB0aGUgc2FtZVxuICAgICAgICAvLyBsaWZldGltZSBhcyB0aGUgVk0sIGl0J3Mgb2theSB0byBmYWtlIG9uZSBzaW5jZSB3aGVuIHRoZSBWTSBpc1xuICAgICAgICAvLyBkaXNwb3NlZCwgbm8gb3RoZXIgZnVuY3Rpb25zIHdpbGwgYWNjZXB0IHRoZSB2YWx1ZS5cbiAgICAgICAgdGhpcy5fZ2xvYmFsID0gbmV3IGxpZmV0aW1lXzEuU3RhdGljTGlmZXRpbWUocHRyLCB0aGlzLnJ1bnRpbWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2xvYmFsO1xuICAgIH1cbiAgICAvLyBOZXcgdmFsdWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGEgSmF2YXNjcmlwdCBudW1iZXIgaW50byBhIFF1aWNrSlMgdmFsdWUuXG4gICAgICovXG4gICAgbmV3TnVtYmVyKG51bSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHRoaXMuZmZpLlFUU19OZXdGbG9hdDY0KHRoaXMuY3R4LnZhbHVlLCBudW0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgUXVpY2tKUyBbc3RyaW5nXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcpIHZhbHVlLlxuICAgICAqL1xuICAgIG5ld1N0cmluZyhzdHIpIHtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5tZW1vcnlcbiAgICAgICAgICAgIC5uZXdIZWFwQ2hhclBvaW50ZXIoc3RyKVxuICAgICAgICAgICAgLmNvbnN1bWUoKGNoYXJIYW5kbGUpID0+IHRoaXMuZmZpLlFUU19OZXdTdHJpbmcodGhpcy5jdHgudmFsdWUsIGNoYXJIYW5kbGUudmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShwdHIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBRdWlja0pTIFtzeW1ib2xdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N5bWJvbCkgdmFsdWUuXG4gICAgICogTm8gdHdvIHN5bWJvbHMgY3JlYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSB0aGUgc2FtZSB2YWx1ZS5cbiAgICAgKi9cbiAgICBuZXdVbmlxdWVTeW1ib2woZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gKHR5cGVvZiBkZXNjcmlwdGlvbiA9PT0gXCJzeW1ib2xcIiA/IGRlc2NyaXB0aW9uLmRlc2NyaXB0aW9uIDogZGVzY3JpcHRpb24pID8/IFwiXCI7XG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMubWVtb3J5XG4gICAgICAgICAgICAubmV3SGVhcENoYXJQb2ludGVyKGtleSlcbiAgICAgICAgICAgIC5jb25zdW1lKChjaGFySGFuZGxlKSA9PiB0aGlzLmZmaS5RVFNfTmV3U3ltYm9sKHRoaXMuY3R4LnZhbHVlLCBjaGFySGFuZGxlLnZhbHVlLCAwKSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocHRyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEgc3ltYm9sIGZyb20gdGhlIFtnbG9iYWwgcmVnaXN0cnldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1N5bWJvbCNzaGFyZWRfc3ltYm9sc19pbl90aGVfZ2xvYmFsX3N5bWJvbF9yZWdpc3RyeSkgZm9yIHRoZSBnaXZlbiBrZXkuXG4gICAgICogQWxsIHN5bWJvbHMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGtleSB3aWxsIGJlIHRoZSBzYW1lIHZhbHVlLlxuICAgICAqL1xuICAgIG5ld1N5bWJvbEZvcihrZXkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiA/IGtleS5kZXNjcmlwdGlvbiA6IGtleSkgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5tZW1vcnlcbiAgICAgICAgICAgIC5uZXdIZWFwQ2hhclBvaW50ZXIoZGVzY3JpcHRpb24pXG4gICAgICAgICAgICAuY29uc3VtZSgoY2hhckhhbmRsZSkgPT4gdGhpcy5mZmkuUVRTX05ld1N5bWJvbCh0aGlzLmN0eC52YWx1ZSwgY2hhckhhbmRsZS52YWx1ZSwgMSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHB0cik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIFF1aWNrSlMgW2JpZ2ludF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQmlnSW50KSB2YWx1ZS5cbiAgICAgKi9cbiAgICBuZXdCaWdJbnQobnVtKSB7XG4gICAgICAgIGlmICghdGhpcy5fQmlnSW50KSB7XG4gICAgICAgICAgICBjb25zdCBiaWdJbnRIYW5kbGUgPSB0aGlzLmdldFByb3AodGhpcy5nbG9iYWwsIFwiQmlnSW50XCIpO1xuICAgICAgICAgICAgdGhpcy5tZW1vcnkubWFuYWdlKGJpZ0ludEhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLl9CaWdJbnQgPSBuZXcgbGlmZXRpbWVfMS5TdGF0aWNMaWZldGltZShiaWdJbnRIYW5kbGUudmFsdWUsIHRoaXMucnVudGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmlnSW50SGFuZGxlID0gdGhpcy5fQmlnSW50O1xuICAgICAgICBjb25zdCBhc1N0cmluZyA9IFN0cmluZyhudW0pO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXdTdHJpbmcoYXNTdHJpbmcpLmNvbnN1bWUoKGhhbmRsZSkgPT4gdGhpcy51bndyYXBSZXN1bHQodGhpcy5jYWxsRnVuY3Rpb24oYmlnSW50SGFuZGxlLCB0aGlzLnVuZGVmaW5lZCwgaGFuZGxlKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBge31gLlxuICAgICAqIENyZWF0ZSBhIG5ldyBRdWlja0pTIFtvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9PYmplY3RfaW5pdGlhbGl6ZXIpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3RvdHlwZSAtIExpa2UgW2BPYmplY3QuY3JlYXRlYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2NyZWF0ZSkuXG4gICAgICovXG4gICAgbmV3T2JqZWN0KHByb3RvdHlwZSkge1xuICAgICAgICBpZiAocHJvdG90eXBlKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQocHJvdG90eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwdHIgPSBwcm90b3R5cGVcbiAgICAgICAgICAgID8gdGhpcy5mZmkuUVRTX05ld09iamVjdFByb3RvKHRoaXMuY3R4LnZhbHVlLCBwcm90b3R5cGUudmFsdWUpXG4gICAgICAgICAgICA6IHRoaXMuZmZpLlFUU19OZXdPYmplY3QodGhpcy5jdHgudmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHB0cik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGBbXWAuXG4gICAgICogQ3JlYXRlIGEgbmV3IFF1aWNrSlMgW2FycmF5XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheSkuXG4gICAgICovXG4gICAgbmV3QXJyYXkoKSB7XG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMuZmZpLlFUU19OZXdBcnJheSh0aGlzLmN0eC52YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUocHRyKTtcbiAgICB9XG4gICAgbmV3UHJvbWlzZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBkZWZlcnJlZFByb21pc2UgPSBsaWZldGltZV8xLlNjb3BlLndpdGhTY29wZSgoc2NvcGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG11dGFibGVQb2ludGVyQXJyYXkgPSBzY29wZS5tYW5hZ2UodGhpcy5tZW1vcnkubmV3TXV0YWJsZVBvaW50ZXJBcnJheSgyKSk7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlUHRyID0gdGhpcy5mZmkuUVRTX05ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMuY3R4LnZhbHVlLCBtdXRhYmxlUG9pbnRlckFycmF5LnZhbHVlLnB0cik7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlSGFuZGxlID0gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHByb21pc2VQdHIpO1xuICAgICAgICAgICAgY29uc3QgW3Jlc29sdmVIYW5kbGUsIHJlamVjdEhhbmRsZV0gPSBBcnJheS5mcm9tKG11dGFibGVQb2ludGVyQXJyYXkudmFsdWUudHlwZWRBcnJheSkubWFwKChqc3ZhbHVlUHRyKSA9PiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUoanN2YWx1ZVB0cikpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBkZWZlcnJlZF9wcm9taXNlXzEuUXVpY2tKU0RlZmVycmVkUHJvbWlzZSh7XG4gICAgICAgICAgICAgICAgY29udGV4dDogdGhpcyxcbiAgICAgICAgICAgICAgICBwcm9taXNlSGFuZGxlLFxuICAgICAgICAgICAgICAgIHJlc29sdmVIYW5kbGUsXG4gICAgICAgICAgICAgICAgcmVqZWN0SGFuZGxlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3IFByb21pc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGRlZmVycmVkUHJvbWlzZS5yZXNvbHZlLCAoZXJyb3IpID0+IGVycm9yIGluc3RhbmNlb2YgbGlmZXRpbWVfMS5MaWZldGltZVxuICAgICAgICAgICAgICAgID8gZGVmZXJyZWRQcm9taXNlLnJlamVjdChlcnJvcilcbiAgICAgICAgICAgICAgICA6IHRoaXMubmV3RXJyb3IoZXJyb3IpLmNvbnN1bWUoZGVmZXJyZWRQcm9taXNlLnJlamVjdCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZlcnJlZFByb21pc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSBKYXZhc2NyaXB0IGZ1bmN0aW9uIGludG8gYSBRdWlja0pTIGZ1bmN0aW9uIHZhbHVlLlxuICAgICAqIFNlZSBbW1ZtRnVuY3Rpb25JbXBsZW1lbnRhdGlvbl1dIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBBIFtbVm1GdW5jdGlvbkltcGxlbWVudGF0aW9uXV0gc2hvdWxkIG5vdCBmcmVlIGl0cyBhcmd1bWVudHMgb3IgaXRzIHJldHVyblxuICAgICAqIHZhbHVlLiBBIFZtRnVuY3Rpb25JbXBsZW1lbnRhdGlvbiBzaG91bGQgYWxzbyBub3QgcmV0YWluIGFueSByZWZlcmVuY2VzIHRvXG4gICAgICogaXRzIHJldHVybiB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFRvIGltcGxlbWVudCBhbiBhc3luYyBmdW5jdGlvbiwgY3JlYXRlIGEgcHJvbWlzZSB3aXRoIFtbbmV3UHJvbWlzZV1dLCB0aGVuXG4gICAgICogcmV0dXJuIHRoZSBkZWZlcnJlZCBwcm9taXNlIGhhbmRsZSBmcm9tIGBkZWZlcnJlZC5oYW5kbGVgIGZyb20geW91clxuICAgICAqIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uOlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogY29uc3QgZGVmZXJyZWQgPSB2bS5uZXdQcm9taXNlKClcbiAgICAgKiBzb21lTmF0aXZlQXN5bmNGdW5jdGlvbigpLnRoZW4oZGVmZXJyZWQucmVzb2x2ZSlcbiAgICAgKiByZXR1cm4gZGVmZXJyZWQuaGFuZGxlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbmV3RnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICAgICAgY29uc3QgZm5JZCA9ICsrdGhpcy5mbk5leHRJZDtcbiAgICAgICAgdGhpcy5zZXRGdW5jdGlvbihmbklkLCBmbik7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUodGhpcy5mZmkuUVRTX05ld0Z1bmN0aW9uKHRoaXMuY3R4LnZhbHVlLCBmbklkLCBuYW1lKSk7XG4gICAgfVxuICAgIG5ld0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9ySGFuZGxlID0gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHRoaXMuZmZpLlFUU19OZXdFcnJvcih0aGlzLmN0eC52YWx1ZSkpO1xuICAgICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXdTdHJpbmcoZXJyb3IubmFtZSkuY29uc3VtZSgoaGFuZGxlKSA9PiB0aGlzLnNldFByb3AoZXJyb3JIYW5kbGUsIFwibmFtZVwiLCBoYW5kbGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5ld1N0cmluZyhlcnJvci5tZXNzYWdlKS5jb25zdW1lKChoYW5kbGUpID0+IHRoaXMuc2V0UHJvcChlcnJvckhhbmRsZSwgXCJtZXNzYWdlXCIsIGhhbmRsZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBlcnJvciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5uZXdTdHJpbmcoZXJyb3IpLmNvbnN1bWUoKGhhbmRsZSkgPT4gdGhpcy5zZXRQcm9wKGVycm9ySGFuZGxlLCBcIm1lc3NhZ2VcIiwgaGFuZGxlKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBzdXBwb3J0ZWQgaW4gdGhlIHR5cGUgc2lnbmF0dXJlIGJ1dCBtYXliZSBpdCB3aWxsIG1ha2UgbGlmZSBlYXNpZXIuXG4gICAgICAgICAgICB0aGlzLm5ld1N0cmluZyhTdHJpbmcoZXJyb3IpKS5jb25zdW1lKChoYW5kbGUpID0+IHRoaXMuc2V0UHJvcChlcnJvckhhbmRsZSwgXCJtZXNzYWdlXCIsIGhhbmRsZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnJvckhhbmRsZTtcbiAgICB9XG4gICAgLy8gUmVhZCB2YWx1ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBgdHlwZW9mYCBvcGVyYXRvci4gKipOb3QqKiBbc3RhbmRhcmRzIGNvbXBsaWFudF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvT3BlcmF0b3JzL3R5cGVvZikuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIERvZXMgbm90IHN1cHBvcnQgQmlnSW50IHZhbHVlcyBjb3JyZWN0bHkuXG4gICAgICovXG4gICAgdHlwZW9mKGhhbmRsZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmNvbnN1bWVIZWFwQ2hhclBvaW50ZXIodGhpcy5mZmkuUVRTX1R5cGVvZih0aGlzLmN0eC52YWx1ZSwgaGFuZGxlLnZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBoYW5kbGVgIGludG8gYSBKYXZhc2NyaXB0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBgTmFOYCBvbiBlcnJvciwgb3RoZXJ3aXNlIGEgYG51bWJlcmAuXG4gICAgICovXG4gICAgZ2V0TnVtYmVyKGhhbmRsZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmZpLlFUU19HZXRGbG9hdDY0KHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgaGFuZGxlYCB0byBhIEphdmFzY3JpcHQgc3RyaW5nLlxuICAgICAqL1xuICAgIGdldFN0cmluZyhoYW5kbGUpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmFzc2VydE93bmVkKGhhbmRsZSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5jb25zdW1lSlNDaGFyUG9pbnRlcih0aGlzLmZmaS5RVFNfR2V0U3RyaW5nKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYGhhbmRsZWAgaW50byBhIEphdmFzY3JpcHQgc3ltYm9sLiBJZiB0aGUgc3ltYm9sIGlzIGluIHRoZSBnbG9iYWxcbiAgICAgKiByZWdpc3RyeSBpbiB0aGUgZ3Vlc3QsIGl0IHdpbGwgYmUgY3JlYXRlZCB3aXRoIFN5bWJvbC5mb3Igb24gdGhlIGhvc3QuXG4gICAgICovXG4gICAgZ2V0U3ltYm9sKGhhbmRsZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5tZW1vcnkuY29uc3VtZUpTQ2hhclBvaW50ZXIodGhpcy5mZmkuUVRTX0dldFN5bWJvbERlc2NyaXB0aW9uT3JLZXkodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSkpO1xuICAgICAgICBjb25zdCBpc0dsb2JhbCA9IHRoaXMuZmZpLlFUU19Jc0dsb2JhbFN5bWJvbCh0aGlzLmN0eC52YWx1ZSwgaGFuZGxlLnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGlzR2xvYmFsID8gU3ltYm9sLmZvcihrZXkpIDogU3ltYm9sKGtleSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBoYW5kbGVgIHRvIGEgSmF2YXNjcmlwdCBiaWdpbnQuXG4gICAgICovXG4gICAgZ2V0QmlnSW50KGhhbmRsZSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgY29uc3QgYXNTdHJpbmcgPSB0aGlzLmdldFN0cmluZyhoYW5kbGUpO1xuICAgICAgICByZXR1cm4gQmlnSW50KGFzU3RyaW5nKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogYFByb21pc2UucmVzb2x2ZSh2YWx1ZSlgLlxuICAgICAqIENvbnZlcnQgYSBoYW5kbGUgY29udGFpbmluZyBhIFByb21pc2UtbGlrZSB2YWx1ZSBpbnNpZGUgdGhlIFZNIGludG8gYW5cbiAgICAgKiBhY3R1YWwgcHJvbWlzZSBvbiB0aGUgaG9zdC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogWW91IG1heSBuZWVkIHRvIGNhbGwgW1tleGVjdXRlUGVuZGluZ0pvYnNdXSB0byBlbnN1cmUgdGhhdCB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9taXNlTGlrZUhhbmRsZSAtIEEgaGFuZGxlIHRvIGEgUHJvbWlzZS1saWtlIHZhbHVlIHdpdGggYSBgLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKWAgbWV0aG9kLlxuICAgICAqL1xuICAgIHJlc29sdmVQcm9taXNlKHByb21pc2VMaWtlSGFuZGxlKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChwcm9taXNlTGlrZUhhbmRsZSk7XG4gICAgICAgIGNvbnN0IHZtUmVzb2x2ZVJlc3VsdCA9IGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlKChzY29wZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgdm1Qcm9taXNlID0gc2NvcGUubWFuYWdlKHRoaXMuZ2V0UHJvcCh0aGlzLmdsb2JhbCwgXCJQcm9taXNlXCIpKTtcbiAgICAgICAgICAgIGNvbnN0IHZtUHJvbWlzZVJlc29sdmUgPSBzY29wZS5tYW5hZ2UodGhpcy5nZXRQcm9wKHZtUHJvbWlzZSwgXCJyZXNvbHZlXCIpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhbGxGdW5jdGlvbih2bVByb21pc2VSZXNvbHZlLCB2bVByb21pc2UsIHByb21pc2VMaWtlSGFuZGxlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh2bVJlc29sdmVSZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodm1SZXNvbHZlUmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlKChzY29wZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVIYW5kbGUgPSBzY29wZS5tYW5hZ2UodGhpcy5uZXdGdW5jdGlvbihcInJlc29sdmVcIiwgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyB2YWx1ZTogdmFsdWUgJiYgdmFsdWUuZHVwKCkgfSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdEhhbmRsZSA9IHNjb3BlLm1hbmFnZSh0aGlzLm5ld0Z1bmN0aW9uKFwicmVqZWN0XCIsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZXJyb3I6IGVycm9yICYmIGVycm9yLmR1cCgpIH0pO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlSGFuZGxlID0gc2NvcGUubWFuYWdlKHZtUmVzb2x2ZVJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZVRoZW5IYW5kbGUgPSBzY29wZS5tYW5hZ2UodGhpcy5nZXRQcm9wKHByb21pc2VIYW5kbGUsIFwidGhlblwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy51bndyYXBSZXN1bHQodGhpcy5jYWxsRnVuY3Rpb24ocHJvbWlzZVRoZW5IYW5kbGUsIHByb21pc2VIYW5kbGUsIHJlc29sdmVIYW5kbGUsIHJlamVjdEhhbmRsZSkpLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gUHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvKipcbiAgICAgKiBgaGFuZGxlW2tleV1gLlxuICAgICAqIEdldCBhIHByb3BlcnR5IGZyb20gYSBKU1ZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgSlNWYWx1ZSBoYW5kbGUsIG9yIGFzIGFcbiAgICAgKiBKYXZhc2NyaXB0IHN0cmluZyAod2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgYXV0b21hdGljYWxseSkuXG4gICAgICovXG4gICAgZ2V0UHJvcChoYW5kbGUsIGtleSkge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuYXNzZXJ0T3duZWQoaGFuZGxlKTtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5ib3Jyb3dQcm9wZXJ0eUtleShrZXkpLmNvbnN1bWUoKHF1aWNrSlNLZXkpID0+IHRoaXMuZmZpLlFUU19HZXRQcm9wKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUsIHF1aWNrSlNLZXkudmFsdWUpKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHB0cik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGBoYW5kbGVba2V5XSA9IHZhbHVlYC5cbiAgICAgKiBTZXQgYSBwcm9wZXJ0eSBvbiBhIEpTVmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIE5vdGUgdGhhdCB0aGUgUXVpY2tKUyBhdXRob3JzIHJlY29tbWVuZCB1c2luZyBbW2RlZmluZVByb3BdXSB0byBkZWZpbmUgbmV3XG4gICAgICogcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkgbWF5IGJlIHNwZWNpZmllZCBhcyBhIEpTVmFsdWUgaGFuZGxlLCBvciBhcyBhXG4gICAgICogSmF2YXNjcmlwdCBzdHJpbmcgb3IgbnVtYmVyICh3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5IHRvIGEgSlNWYWx1ZSkuXG4gICAgICovXG4gICAgc2V0UHJvcChoYW5kbGUsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmFzc2VydE93bmVkKGhhbmRsZSk7XG4gICAgICAgIC8vIGZyZWUgbmV3bHkgYWxsb2NhdGVkIHZhbHVlIGlmIGtleSB3YXMgYSBzdHJpbmcgb3IgbnVtYmVyLiBOby1vcCBpZiBzdHJpbmcgd2FzIGFscmVhZHlcbiAgICAgICAgLy8gYSBRdWlja0pTIGhhbmRsZS5cbiAgICAgICAgdGhpcy5ib3Jyb3dQcm9wZXJ0eUtleShrZXkpLmNvbnN1bWUoKHF1aWNrSlNLZXkpID0+IHRoaXMuZmZpLlFUU19TZXRQcm9wKHRoaXMuY3R4LnZhbHVlLCBoYW5kbGUudmFsdWUsIHF1aWNrSlNLZXkudmFsdWUsIHZhbHVlLnZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtgT2JqZWN0LmRlZmluZVByb3BlcnR5KGhhbmRsZSwga2V5LCBkZXNjcmlwdG9yKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9kZWZpbmVQcm9wZXJ0eSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IC0gVGhlIHByb3BlcnR5IG1heSBiZSBzcGVjaWZpZWQgYXMgYSBKU1ZhbHVlIGhhbmRsZSwgb3IgYXMgYVxuICAgICAqIEphdmFzY3JpcHQgc3RyaW5nIG9yIG51bWJlciAod2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgYXV0b21hdGljYWxseSB0byBhIEpTVmFsdWUpLlxuICAgICAqL1xuICAgIGRlZmluZVByb3AoaGFuZGxlLCBrZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmFzc2VydE93bmVkKGhhbmRsZSk7XG4gICAgICAgIGxpZmV0aW1lXzEuU2NvcGUud2l0aFNjb3BlKChzY29wZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcXVpY2tKU0tleSA9IHNjb3BlLm1hbmFnZSh0aGlzLmJvcnJvd1Byb3BlcnR5S2V5KGtleSkpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkZXNjcmlwdG9yLnZhbHVlIHx8IHRoaXMudW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgY29uZmlndXJhYmxlID0gQm9vbGVhbihkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSk7XG4gICAgICAgICAgICBjb25zdCBlbnVtZXJhYmxlID0gQm9vbGVhbihkZXNjcmlwdG9yLmVudW1lcmFibGUpO1xuICAgICAgICAgICAgY29uc3QgaGFzVmFsdWUgPSBCb29sZWFuKGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgZ2V0ID0gZGVzY3JpcHRvci5nZXRcbiAgICAgICAgICAgICAgICA/IHNjb3BlLm1hbmFnZSh0aGlzLm5ld0Z1bmN0aW9uKGRlc2NyaXB0b3IuZ2V0Lm5hbWUsIGRlc2NyaXB0b3IuZ2V0KSlcbiAgICAgICAgICAgICAgICA6IHRoaXMudW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3Qgc2V0ID0gZGVzY3JpcHRvci5zZXRcbiAgICAgICAgICAgICAgICA/IHNjb3BlLm1hbmFnZSh0aGlzLm5ld0Z1bmN0aW9uKGRlc2NyaXB0b3Iuc2V0Lm5hbWUsIGRlc2NyaXB0b3Iuc2V0KSlcbiAgICAgICAgICAgICAgICA6IHRoaXMudW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX0RlZmluZVByb3AodGhpcy5jdHgudmFsdWUsIGhhbmRsZS52YWx1ZSwgcXVpY2tKU0tleS52YWx1ZSwgdmFsdWUudmFsdWUsIGdldC52YWx1ZSwgc2V0LnZhbHVlLCBjb25maWd1cmFibGUsIGVudW1lcmFibGUsIGhhc1ZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEV2YWx1YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogW2BmdW5jLmNhbGwodGhpc1ZhbCwgLi4uYXJncylgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9jYWxsKS5cbiAgICAgKiBDYWxsIGEgSlNWYWx1ZSBhcyBhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogU2VlIFtbdW53cmFwUmVzdWx0XV0sIHdoaWNoIHdpbGwgdGhyb3cgaWYgdGhlIGZ1bmN0aW9uIHJldHVybmVkIGFuIGVycm9yLCBvclxuICAgICAqIHJldHVybiB0aGUgcmVzdWx0IGhhbmRsZSBkaXJlY3RseS4gSWYgZXZhbHVhdGlvbiByZXR1cm5lZCBhIGhhbmRsZSBjb250YWluaW5nXG4gICAgICogYSBwcm9taXNlLCB1c2UgW1tyZXNvbHZlUHJvbWlzZV1dIHRvIGNvbnZlcnQgaXQgdG8gYSBuYXRpdmUgcHJvbWlzZSBhbmRcbiAgICAgKiBbW2V4ZWN1dGVQZW5kaW5nSm9ic11dIHRvIGZpbmlzaCBldmFsdWF0aW5nIHRoZSBwcm9taXNlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQSByZXN1bHQuIElmIHRoZSBmdW5jdGlvbiB0aHJldyBzeW5jaHJvbm91c2x5LCBgcmVzdWx0LmVycm9yYCBiZSBhXG4gICAgICogaGFuZGxlIHRvIHRoZSBleGNlcHRpb24uIE90aGVyd2lzZSBgcmVzdWx0LnZhbHVlYCB3aWxsIGJlIGEgaGFuZGxlIHRvIHRoZVxuICAgICAqIHZhbHVlLlxuICAgICAqL1xuICAgIGNhbGxGdW5jdGlvbihmdW5jLCB0aGlzVmFsLCAuLi5hcmdzKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5hc3NlcnRPd25lZChmdW5jKTtcbiAgICAgICAgY29uc3QgcmVzdWx0UHRyID0gdGhpcy5tZW1vcnlcbiAgICAgICAgICAgIC50b1BvaW50ZXJBcnJheShhcmdzKVxuICAgICAgICAgICAgLmNvbnN1bWUoKGFyZ3NBcnJheVB0cikgPT4gdGhpcy5mZmkuUVRTX0NhbGwodGhpcy5jdHgudmFsdWUsIGZ1bmMudmFsdWUsIHRoaXNWYWwudmFsdWUsIGFyZ3MubGVuZ3RoLCBhcmdzQXJyYXlQdHIudmFsdWUpKTtcbiAgICAgICAgY29uc3QgZXJyb3JQdHIgPSB0aGlzLmZmaS5RVFNfUmVzb2x2ZUV4Y2VwdGlvbih0aGlzLmN0eC52YWx1ZSwgcmVzdWx0UHRyKTtcbiAgICAgICAgaWYgKGVycm9yUHRyKSB7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZVZhbHVlUG9pbnRlcih0aGlzLmN0eC52YWx1ZSwgcmVzdWx0UHRyKTtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0aGlzLm1lbW9yeS5oZWFwVmFsdWVIYW5kbGUoZXJyb3JQdHIpIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShyZXN1bHRQdHIpIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpa2UgW2BldmFsKGNvZGUpYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvZXZhbCNEZXNjcmlwdGlvbikuXG4gICAgICogRXZhbHVhdGVzIHRoZSBKYXZhc2NyaXB0IHNvdXJjZSBgY29kZWAgaW4gdGhlIGdsb2JhbCBzY29wZSBvZiB0aGlzIFZNLlxuICAgICAqIFdoZW4gd29ya2luZyB3aXRoIGFzeW5jIGNvZGUsIHlvdSBtYW55IG5lZWQgdG8gY2FsbCBbW2V4ZWN1dGVQZW5kaW5nSm9ic11dXG4gICAgICogdG8gZXhlY3V0ZSBjYWxsYmFja3MgcGVuZGluZyBhZnRlciBzeW5jaHJvbm91cyBldmFsdWF0aW9uIHJldHVybnMuXG4gICAgICpcbiAgICAgKiBTZWUgW1t1bndyYXBSZXN1bHRdXSwgd2hpY2ggd2lsbCB0aHJvdyBpZiB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYW4gZXJyb3IsIG9yXG4gICAgICogcmV0dXJuIHRoZSByZXN1bHQgaGFuZGxlIGRpcmVjdGx5LiBJZiBldmFsdWF0aW9uIHJldHVybmVkIGEgaGFuZGxlIGNvbnRhaW5pbmdcbiAgICAgKiBhIHByb21pc2UsIHVzZSBbW3Jlc29sdmVQcm9taXNlXV0gdG8gY29udmVydCBpdCB0byBhIG5hdGl2ZSBwcm9taXNlIGFuZFxuICAgICAqIFtbZXhlY3V0ZVBlbmRpbmdKb2JzXV0gdG8gZmluaXNoIGV2YWx1YXRpbmcgdGhlIHByb21pc2UuXG4gICAgICpcbiAgICAgKiAqTm90ZSo6IHRvIHByb3RlY3QgYWdhaW5zdCBpbmZpbml0ZSBsb29wcywgcHJvdmlkZSBhbiBpbnRlcnJ1cHQgaGFuZGxlciB0b1xuICAgICAqIFtbc2V0SW50ZXJydXB0SGFuZGxlcl1dLiBZb3UgY2FuIHVzZSBbW3Nob3VsZEludGVycnVwdEFmdGVyRGVhZGxpbmVdXSB0b1xuICAgICAqIGNyZWF0ZSBhIHRpbWUtYmFzZWQgZGVhZGxpbmUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbGFzdCBzdGF0ZW1lbnQncyB2YWx1ZS4gSWYgdGhlIGNvZGUgdGhyZXcgc3luY2hyb25vdXNseSxcbiAgICAgKiBgcmVzdWx0LmVycm9yYCB3aWxsIGJlIGEgaGFuZGxlIHRvIHRoZSBleGNlcHRpb24uIElmIGV4ZWN1dGlvbiB3YXNcbiAgICAgKiBpbnRlcnJ1cHRlZCwgdGhlIGVycm9yIHdpbGwgaGF2ZSBuYW1lIGBJbnRlcm5hbEVycm9yYCBhbmQgbWVzc2FnZVxuICAgICAqIGBpbnRlcnJ1cHRlZGAuXG4gICAgICovXG4gICAgZXZhbENvZGUoY29kZSwgZmlsZW5hbWUgPSBcImV2YWwuanNcIiwgXG4gICAgLyoqXG4gICAgICogSWYgbm8gb3B0aW9ucyBhcmUgcGFzc2VkLCBhIGhldXJpc3RpYyB3aWxsIGJlIHVzZWQgdG8gZGV0ZWN0IGlmIGBjb2RlYCBpc1xuICAgICAqIGFuIEVTIG1vZHVsZS5cbiAgICAgKlxuICAgICAqIFNlZSBbW0V2YWxGbGFnc11dIGZvciBudW1iZXIgc2VtYW50aWNzLlxuICAgICAqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZGV0ZWN0TW9kdWxlID0gKG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IDEgOiAwKTtcbiAgICAgICAgY29uc3QgZmxhZ3MgPSAoMCwgdHlwZXNfMS5ldmFsT3B0aW9uc1RvRmxhZ3MpKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZXN1bHRQdHIgPSB0aGlzLm1lbW9yeVxuICAgICAgICAgICAgLm5ld0hlYXBDaGFyUG9pbnRlcihjb2RlKVxuICAgICAgICAgICAgLmNvbnN1bWUoKGNoYXJIYW5kbGUpID0+IHRoaXMuZmZpLlFUU19FdmFsKHRoaXMuY3R4LnZhbHVlLCBjaGFySGFuZGxlLnZhbHVlLCBmaWxlbmFtZSwgZGV0ZWN0TW9kdWxlLCBmbGFncykpO1xuICAgICAgICBjb25zdCBlcnJvclB0ciA9IHRoaXMuZmZpLlFUU19SZXNvbHZlRXhjZXB0aW9uKHRoaXMuY3R4LnZhbHVlLCByZXN1bHRQdHIpO1xuICAgICAgICBpZiAoZXJyb3JQdHIpIHtcbiAgICAgICAgICAgIHRoaXMuZmZpLlFUU19GcmVlVmFsdWVQb2ludGVyKHRoaXMuY3R4LnZhbHVlLCByZXN1bHRQdHIpO1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRoaXMubWVtb3J5LmhlYXBWYWx1ZUhhbmRsZShlcnJvclB0cikgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWx1ZTogdGhpcy5tZW1vcnkuaGVhcFZhbHVlSGFuZGxlKHJlc3VsdFB0cikgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhyb3cgYW4gZXJyb3IgaW4gdGhlIFZNLCBpbnRlcnJ1cHRlZCB3aGF0ZXZlciBjdXJyZW50IGV4ZWN1dGlvbiBpcyBpbiBwcm9ncmVzcyB3aGVuIGV4ZWN1dGlvbiByZXN1bWVzLlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKi9cbiAgICB0aHJvdyhlcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvclRvSGFuZGxlKGVycm9yKS5jb25zdW1lKChoYW5kbGUpID0+IHRoaXMuZmZpLlFUU19UaHJvdyh0aGlzLmN0eC52YWx1ZSwgaGFuZGxlLnZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYm9ycm93UHJvcGVydHlLZXkoa2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uZXdOdW1iZXIoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV3U3RyaW5nKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8ga2V5IGlzIGFscmVhZHkgYSBKU1ZhbHVlLCBidXQgd2UncmUgYm9ycm93aW5nIGl0LiBSZXR1cm4gYSBzdGF0aWMgaGFuZGxlXG4gICAgICAgIC8vIGZvciBpbnRlcm5hbCB1c2Ugb25seS5cbiAgICAgICAgcmV0dXJuIG5ldyBsaWZldGltZV8xLlN0YXRpY0xpZmV0aW1lKGtleS52YWx1ZSwgdGhpcy5ydW50aW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRNZW1vcnkocnQpIHtcbiAgICAgICAgaWYgKHJ0ID09PSB0aGlzLnJ0LnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZW1vcnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcml2YXRlIEFQSS4gQ2Fubm90IGdldCBtZW1vcnkgZnJvbSBhIGRpZmZlcmVudCBydW50aW1lXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLyoqXG4gICAgICogRHVtcCBhIEpTVmFsdWUgdG8gSmF2YXNjcmlwdCBpbiBhIGJlc3QtZWZmb3J0IGZhc2hpb24uXG4gICAgICogUmV0dXJucyBgaGFuZGxlLnRvU3RyaW5nKClgIGlmIGl0IGNhbm5vdCBiZSBzZXJpYWxpemVkIHRvIEpTT04uXG4gICAgICovXG4gICAgZHVtcChoYW5kbGUpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmFzc2VydE93bmVkKGhhbmRsZSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGVvZihoYW5kbGUpO1xuICAgICAgICBpZiAodHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyKGhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QmlnSW50KGhhbmRsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTeW1ib2woaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHIgPSB0aGlzLm1lbW9yeS5jb25zdW1lSlNDaGFyUG9pbnRlcih0aGlzLmZmaS5RVFNfRHVtcCh0aGlzLmN0eC52YWx1ZSwgaGFuZGxlLnZhbHVlKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVW53cmFwIGEgU3VjY2Vzc09yRmFpbCByZXN1bHQgc3VjaCBhcyBhIFtbVm1DYWxsUmVzdWx0XV0gb3IgYVxuICAgICAqIFtbRXhlY3V0ZVBlbmRpbmdKb2JzUmVzdWx0XV0sIHdoZXJlIHRoZSBmYWlsIGJyYW5jaCBjb250YWlucyBhIGhhbmRsZSB0byBhIFF1aWNrSlMgZXJyb3IgdmFsdWUuXG4gICAgICogSWYgdGhlIHJlc3VsdCBpcyBhIHN1Y2Nlc3MsIHJldHVybnMgdGhlIHZhbHVlLlxuICAgICAqIElmIHRoZSByZXN1bHQgaXMgYW4gZXJyb3IsIGNvbnZlcnRzIHRoZSBlcnJvciB0byBhIG5hdGl2ZSBvYmplY3QgYW5kIHRocm93cyB0aGUgZXJyb3IuXG4gICAgICovXG4gICAgdW53cmFwUmVzdWx0KHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gXCJjb250ZXh0XCIgaW4gcmVzdWx0LmVycm9yID8gcmVzdWx0LmVycm9yLmNvbnRleHQgOiB0aGlzO1xuICAgICAgICAgICAgY29uc3QgY2F1c2UgPSByZXN1bHQuZXJyb3IuY29uc3VtZSgoZXJyb3IpID0+IHRoaXMuZHVtcChlcnJvcikpO1xuICAgICAgICAgICAgaWYgKGNhdXNlICYmIHR5cGVvZiBjYXVzZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgY2F1c2UubWVzc2FnZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgbmFtZSwgc3RhY2sgfSA9IGNhdXNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IG5ldyBlcnJvcnNfMS5RdWlja0pTVW53cmFwRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFN0YWNrID0gZXhjZXB0aW9uLnN0YWNrO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24ubmFtZSA9IGNhdXNlLm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RhY2sgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLnN0YWNrID0gYCR7bmFtZX06ICR7bWVzc2FnZX1cXG4ke2NhdXNlLnN0YWNrfUhvc3Q6ICR7aG9zdFN0YWNrfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXhjZXB0aW9uLCB7IGNhdXNlLCBjb250ZXh0LCBtZXNzYWdlIH0pO1xuICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTVW53cmFwRXJyb3IoY2F1c2UsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldEZ1bmN0aW9uKGZuX2lkKSB7XG4gICAgICAgIGNvbnN0IG1hcF9pZCA9IGZuX2lkID4+IDg7XG4gICAgICAgIGNvbnN0IGZuTWFwID0gdGhpcy5mbk1hcHMuZ2V0KG1hcF9pZCk7XG4gICAgICAgIGlmICghZm5NYXApIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuTWFwLmdldChmbl9pZCk7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIHNldEZ1bmN0aW9uKGZuX2lkLCBoYW5kbGUpIHtcbiAgICAgICAgY29uc3QgbWFwX2lkID0gZm5faWQgPj4gODtcbiAgICAgICAgbGV0IGZuTWFwID0gdGhpcy5mbk1hcHMuZ2V0KG1hcF9pZCk7XG4gICAgICAgIGlmICghZm5NYXApIHtcbiAgICAgICAgICAgIGZuTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgdGhpcy5mbk1hcHMuc2V0KG1hcF9pZCwgZm5NYXApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbk1hcC5zZXQoZm5faWQsIGhhbmRsZSk7XG4gICAgfVxuICAgIGVycm9yVG9IYW5kbGUoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgbGlmZXRpbWVfMS5MaWZldGltZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5ld0Vycm9yKGVycm9yKTtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNDb250ZXh0ID0gUXVpY2tKU0NvbnRleHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb250ZXh0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWJ1Z0xvZyA9IGV4cG9ydHMuUVRTX0RFQlVHID0gdm9pZCAwO1xuZXhwb3J0cy5RVFNfREVCVUcgPSBmYWxzZSB8fCBCb29sZWFuKHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MuZW52LlFUU19ERUJVRyk7XG5leHBvcnRzLmRlYnVnTG9nID0gZXhwb3J0cy5RVFNfREVCVUcgPyBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpIDogKCkgPT4geyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVidWcuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlF1aWNrSlNEZWZlcnJlZFByb21pc2UgPSB2b2lkIDA7XG4vKipcbiAqIFF1aWNrSlNEZWZlcnJlZFByb21pc2Ugd3JhcHMgYSBRdWlja0pTIHByb21pc2UgW1toYW5kbGVdXSBhbmQgYWxsb3dzXG4gKiBbW3Jlc29sdmVdXWluZyBvciBbW3JlamVjdF1daW5nIHRoYXQgcHJvbWlzZS4gVXNlIGl0IHRvIGJyaWRnZSBhc3luY2hyb25vdXNcbiAqIGNvZGUgb24gdGhlIGhvc3QgdG8gQVBJcyBpbnNpZGUgYSBRdWlja0pTQ29udGV4dC5cbiAqXG4gKiBNYW5hZ2luZyB0aGUgbGlmZXRpbWUgb2YgcHJvbWlzZXMgaXMgdHJpY2t5LiBUaGVyZSBhcmUgdGhyZWVcbiAqIFtbUXVpY2tKU0hhbmRsZV1dcyBpbnNpZGUgb2YgZWFjaCBkZWZlcnJlZCBwcm9taXNlIG9iamVjdDogKDEpIHRoZSBwcm9taXNlXG4gKiBpdHNlbGYsICgyKSB0aGUgYHJlc29sdmVgIGNhbGxiYWNrLCBhbmQgKDMpIHRoZSBgcmVqZWN0YCBjYWxsYmFjay5cbiAqXG4gKiAtIElmIHRoZSBwcm9taXNlIHdpbGwgYmUgZnVsZmlsbGVkIGJlZm9yZSB0aGUgZW5kIG9mIGl0J3MgW1tvd25lcl1dJ3MgbGlmZXRpbWUsXG4gKiAgIHRoZSBvbmx5IGNsZWFudXAgbmVjZXNzYXJ5IGlzIGBkZWZlcnJlZC5oYW5kbGUuZGlzcG9zZSgpYCwgYmVjYXVzZVxuICogICBjYWxsaW5nIFtbcmVzb2x2ZV1dIG9yIFtbcmVqZWN0XV0gd2lsbCBkaXNwb3NlIG9mIGJvdGggY2FsbGJhY2tzIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogLSBBcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgW1tWbUZ1bmN0aW9uSW1wbGVtZW50YXRpb25dXSwgcmV0dXJuIFtbaGFuZGxlXV0sXG4gKiAgIGFuZCBlbnN1cmUgdGhhdCBlaXRoZXIgW1tyZXNvbHZlXV0gb3IgW1tyZWplY3RdXSB3aWxsIGJlIGNhbGxlZC4gTm8gb3RoZXJcbiAqICAgY2xlYW4tdXAgaXMgbmVjZXNzYXJ5LlxuICpcbiAqIC0gSW4gb3RoZXIgY2FzZXMsIGNhbGwgW1tkaXNwb3NlXV0sIHdoaWNoIHdpbGwgZGlzcG9zZSBbW2hhbmRsZV1dIGFzIHdlbGwgYXMgdGhlXG4gKiAgIFF1aWNrSlMgaGFuZGxlcyB0aGF0IGJhY2sgW1tyZXNvbHZlXV0gYW5kIFtbcmVqZWN0XV0uIEZvciB0aGlzIG9iamVjdCxcbiAqICAgW1tkaXNwb3NlXV0gaXMgaWRlbXBvdGVudC5cbiAqL1xuY2xhc3MgUXVpY2tKU0RlZmVycmVkUHJvbWlzZSB7XG4gICAgLyoqXG4gICAgICogVXNlIFtbUXVpY2tKU0NvbnRleHQubmV3UHJvbWlzZV1dIHRvIGNyZWF0ZSBhIG5ldyBwcm9taXNlIGluc3RlYWQgb2YgY2FsbGluZ1xuICAgICAqIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gICAgICogQHVuc3RhYmxlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYXJncykge1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVzb2x2ZSBbW2hhbmRsZV1dIHdpdGggdGhlIGdpdmVuIHZhbHVlLCBpZiBhbnkuXG4gICAgICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgYWZ0ZXIgY2FsbGluZyBbW2Rpc3Bvc2VdXSBpcyBhIG5vLW9wLlxuICAgICAgICAgKlxuICAgICAgICAgKiBOb3RlIHRoYXQgYWZ0ZXIgcmVzb2x2aW5nIGEgcHJvbWlzZSwgeW91IG1heSBuZWVkIHRvIGNhbGxcbiAgICAgICAgICogW1tRdWlja0pTQ29udGV4dC5leGVjdXRlUGVuZGluZ0pvYnNdXSB0byBwcm9wYWdhdGUgdGhlIHJlc3VsdCB0byB0aGUgcHJvbWlzZSdzXG4gICAgICAgICAqIGNhbGxiYWNrcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVzb2x2ZSA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlc29sdmVIYW5kbGUuYWxpdmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICAgICAgICAgICAudW53cmFwUmVzdWx0KHRoaXMuY29udGV4dC5jYWxsRnVuY3Rpb24odGhpcy5yZXNvbHZlSGFuZGxlLCB0aGlzLmNvbnRleHQudW5kZWZpbmVkLCB2YWx1ZSB8fCB0aGlzLmNvbnRleHQudW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgICAuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NlUmVzb2x2ZXJzKCk7XG4gICAgICAgICAgICB0aGlzLm9uU2V0dGxlZCgpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogUmVqZWN0IFtbaGFuZGxlXV0gd2l0aCB0aGUgZ2l2ZW4gdmFsdWUsIGlmIGFueS5cbiAgICAgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBhZnRlciBjYWxsaW5nIFtbZGlzcG9zZV1dIGlzIGEgbm8tb3AuXG4gICAgICAgICAqXG4gICAgICAgICAqIE5vdGUgdGhhdCBhZnRlciByZWplY3RpbmcgYSBwcm9taXNlLCB5b3UgbWF5IG5lZWQgdG8gY2FsbFxuICAgICAgICAgKiBbW1F1aWNrSlNDb250ZXh0LmV4ZWN1dGVQZW5kaW5nSm9ic11dIHRvIHByb3BhZ2F0ZSB0aGUgcmVzdWx0IHRvIHRoZSBwcm9taXNlJ3NcbiAgICAgICAgICogY2FsbGJhY2tzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWplY3QgPSAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZWplY3RIYW5kbGUuYWxpdmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICAgICAgICAgICAudW53cmFwUmVzdWx0KHRoaXMuY29udGV4dC5jYWxsRnVuY3Rpb24odGhpcy5yZWplY3RIYW5kbGUsIHRoaXMuY29udGV4dC51bmRlZmluZWQsIHZhbHVlIHx8IHRoaXMuY29udGV4dC51bmRlZmluZWQpKVxuICAgICAgICAgICAgICAgIC5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VSZXNvbHZlcnMoKTtcbiAgICAgICAgICAgIHRoaXMub25TZXR0bGVkKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhbmRsZS5hbGl2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZVJlc29sdmVycygpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBhcmdzLmNvbnRleHQ7XG4gICAgICAgIHRoaXMub3duZXIgPSBhcmdzLmNvbnRleHQucnVudGltZTtcbiAgICAgICAgdGhpcy5oYW5kbGUgPSBhcmdzLnByb21pc2VIYW5kbGU7XG4gICAgICAgIHRoaXMuc2V0dGxlZCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uU2V0dGxlZCA9IHJlc29sdmU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc29sdmVIYW5kbGUgPSBhcmdzLnJlc29sdmVIYW5kbGU7XG4gICAgICAgIHRoaXMucmVqZWN0SGFuZGxlID0gYXJncy5yZWplY3RIYW5kbGU7XG4gICAgfVxuICAgIGdldCBhbGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLmFsaXZlIHx8IHRoaXMucmVzb2x2ZUhhbmRsZS5hbGl2ZSB8fCB0aGlzLnJlamVjdEhhbmRsZS5hbGl2ZTtcbiAgICB9XG4gICAgZGlzcG9zZVJlc29sdmVycygpIHtcbiAgICAgICAgaWYgKHRoaXMucmVzb2x2ZUhhbmRsZS5hbGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlSGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWplY3RIYW5kbGUuYWxpdmUpIHtcbiAgICAgICAgICAgIHRoaXMucmVqZWN0SGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU0RlZmVycmVkUHJvbWlzZSA9IFF1aWNrSlNEZWZlcnJlZFByb21pc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWZlcnJlZC1wcm9taXNlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5RdWlja0pTTWVtb3J5TGVha0RldGVjdGVkID0gZXhwb3J0cy5RdWlja0pTQXN5bmNpZnlTdXNwZW5kZWQgPSBleHBvcnRzLlF1aWNrSlNBc3luY2lmeUVycm9yID0gZXhwb3J0cy5RdWlja0pTTm90SW1wbGVtZW50ZWQgPSBleHBvcnRzLlF1aWNrSlNVc2VBZnRlckZyZWUgPSBleHBvcnRzLlF1aWNrSlNXcm9uZ093bmVyID0gZXhwb3J0cy5RdWlja0pTVW53cmFwRXJyb3IgPSB2b2lkIDA7XG4vKipcbiAqIEVycm9yIHRocm93biBpZiBbW1F1aWNrSlNDb250ZXh0LnVud3JhcFJlc3VsdF1dIHVud3JhcHMgYW4gZXJyb3IgdmFsdWUgdGhhdCBpc24ndCBhbiBvYmplY3QuXG4gKi9cbmNsYXNzIFF1aWNrSlNVbndyYXBFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihjYXVzZSwgY29udGV4dCkge1xuICAgICAgICBzdXBlcihTdHJpbmcoY2F1c2UpKTtcbiAgICAgICAgdGhpcy5jYXVzZSA9IGNhdXNlO1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlF1aWNrSlNVbndyYXBFcnJvclwiO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU1Vud3JhcEVycm9yID0gUXVpY2tKU1Vud3JhcEVycm9yO1xuY2xhc3MgUXVpY2tKU1dyb25nT3duZXIgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU1dyb25nT3duZXJcIjtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNXcm9uZ093bmVyID0gUXVpY2tKU1dyb25nT3duZXI7XG5jbGFzcyBRdWlja0pTVXNlQWZ0ZXJGcmVlIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlF1aWNrSlNVc2VBZnRlckZyZWVcIjtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNVc2VBZnRlckZyZWUgPSBRdWlja0pTVXNlQWZ0ZXJGcmVlO1xuY2xhc3MgUXVpY2tKU05vdEltcGxlbWVudGVkIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlF1aWNrSlNOb3RJbXBsZW1lbnRlZFwiO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU05vdEltcGxlbWVudGVkID0gUXVpY2tKU05vdEltcGxlbWVudGVkO1xuY2xhc3MgUXVpY2tKU0FzeW5jaWZ5RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU0FzeW5jaWZ5RXJyb3JcIjtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNBc3luY2lmeUVycm9yID0gUXVpY2tKU0FzeW5jaWZ5RXJyb3I7XG5jbGFzcyBRdWlja0pTQXN5bmNpZnlTdXNwZW5kZWQgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUXVpY2tKU0FzeW5jaWZ5U3VzcGVuZGVkXCI7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTQXN5bmNpZnlTdXNwZW5kZWQgPSBRdWlja0pTQXN5bmNpZnlTdXNwZW5kZWQ7XG5jbGFzcyBRdWlja0pTTWVtb3J5TGVha0RldGVjdGVkIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWRcIjtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQgPSBRdWlja0pTTWVtb3J5TGVha0RldGVjdGVkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy51bndyYXBKYXZhc2NyaXB0ID0gZXhwb3J0cy51bndyYXBUeXBlc2NyaXB0ID0gdm9pZCAwO1xuLyoqIFR5cGVzY3JpcHQgdGhpbmtzIGltcG9ydCgnLi4uanMvLmQudHMnKSBuZWVkcyBtb2QuZGVmYXVsdC5kZWZhdWx0ICovXG5mdW5jdGlvbiBmYWtlVW53cmFwRGVmYXVsdChtb2QpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcImZha2VVbndyYXBEZWZhdWx0XCIsIG1vZClcbiAgICByZXR1cm4gbW9kLmRlZmF1bHQ7XG59XG4vKiogVHlwZXNjcmlwdCB0aGlua3MgaW1wb3J0KCcuLi50cycpIGRvZXNuJ3QgbmVlZCBtb2QuZGVmYXVsdC5kZWZhdWx0LCBidXQgZG9lcyAqL1xuZnVuY3Rpb24gYWN0dWFsVW53cmFwRGVmYXVsdChtb2QpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcImFjdHVhbFVud3JhcERlZmF1bHRcIiwgbW9kKVxuICAgIGNvbnN0IG1heWJlVW53cmFwID0gbW9kLmRlZmF1bHQ7XG4gICAgcmV0dXJuIG1heWJlVW53cmFwID8/IG1vZDtcbn1cbi8vIEknbSBub3Qgc3VyZSBpZiB0aGlzIGJlaGF2aW9yIGlzIG5lZWRlZCBpbiBhbGwgcnVudGltZXMsXG4vLyBvciBqdXN0IGZvciBtb2NoYSArIHRzLW5vZGUuXG5leHBvcnRzLnVud3JhcFR5cGVzY3JpcHQgPSBhY3R1YWxVbndyYXBEZWZhdWx0O1xuZXhwb3J0cy51bndyYXBKYXZhc2NyaXB0ID0gZmFrZVVud3JhcERlZmF1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lc21IZWxwZXJzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIFF1aWNrSlNSYXcgPSAoKCkgPT4ge1xuICAgIHZhciBfc2NyaXB0RGlyID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lICE9PSAndW5kZWZpbmVkJylcbiAgICAgICAgX3NjcmlwdERpciA9IF9zY3JpcHREaXIgfHwgX19maWxlbmFtZTtcbiAgICByZXR1cm4gKGZ1bmN0aW9uIChRdWlja0pTUmF3ID0ge30pIHtcbiAgICAgICAgdmFyIGE7XG4gICAgICAgIGEgfHwgKGEgPSB0eXBlb2YgUXVpY2tKU1JhdyAhPT0gJ3VuZGVmaW5lZCcgPyBRdWlja0pTUmF3IDoge30pO1xuICAgICAgICB2YXIgbSwgbjtcbiAgICAgICAgYS5yZWFkeSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChiLCBjKSB7IG0gPSBiOyBuID0gYzsgfSk7XG4gICAgICAgIHZhciBwID0gT2JqZWN0LmFzc2lnbih7fSwgYSksIHQgPSBcIi4vdGhpcy5wcm9ncmFtXCIsIHUgPSBcIm9iamVjdFwiID09IHR5cGVvZiB3aW5kb3csIHYgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGltcG9ydFNjcmlwdHMsIHcgPSBcIm9iamVjdFwiID09IHR5cGVvZiBwcm9jZXNzICYmIFwib2JqZWN0XCIgPT0gdHlwZW9mIHByb2Nlc3MudmVyc2lvbnMgJiYgXCJzdHJpbmdcIiA9PSB0eXBlb2YgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLCB4ID0gXCJcIiwgeSwgeiwgQTtcbiAgICAgICAgaWYgKHcpIHtcbiAgICAgICAgICAgIHZhciBmcyA9IHJlcXVpcmUoXCJmc1wiKSwgQiA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuICAgICAgICAgICAgeCA9IHYgPyBCLmRpcm5hbWUoeCkgKyBcIi9cIiA6IF9fZGlybmFtZSArIFwiL1wiO1xuICAgICAgICAgICAgeSA9IChiLCBjKSA9PiB7IHZhciBkID0gQyhiKTsgaWYgKGQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGMgPyBkIDogZC50b1N0cmluZygpOyBiID0gYi5zdGFydHNXaXRoKFwiZmlsZTovL1wiKSA/IG5ldyBVUkwoYikgOiBCLm5vcm1hbGl6ZShiKTsgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhiLCBjID8gdm9pZCAwIDogXCJ1dGY4XCIpOyB9O1xuICAgICAgICAgICAgQSA9IGIgPT4geyBiID0geShiLCAhMCk7IGIuYnVmZmVyIHx8IChiID0gbmV3IFVpbnQ4QXJyYXkoYikpOyByZXR1cm4gYjsgfTtcbiAgICAgICAgICAgIHogPSAoYiwgYywgZCkgPT4geyB2YXIgZSA9IEMoYik7IGUgJiYgYyhlKTsgYiA9IGIuc3RhcnRzV2l0aChcImZpbGU6Ly9cIikgPyBuZXcgVVJMKGIpIDogQi5ub3JtYWxpemUoYik7IGZzLnJlYWRGaWxlKGIsIGZ1bmN0aW9uIChmLCBnKSB7IGYgPyBkKGYpIDogYyhnLmJ1ZmZlcik7IH0pOyB9O1xuICAgICAgICAgICAgIWEudGhpc1Byb2dyYW0gJiYgMSA8IHByb2Nlc3MuYXJndi5sZW5ndGggJiYgKHQgPSBwcm9jZXNzLmFyZ3ZbMV0ucmVwbGFjZSgvXFxcXC9nLCBcIi9cIikpO1xuICAgICAgICAgICAgcHJvY2Vzcy5hcmd2LnNsaWNlKDIpO1xuICAgICAgICAgICAgYS5pbnNwZWN0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gXCJbRW1zY3JpcHRlbiBNb2R1bGUgb2JqZWN0XVwiOyB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHUgfHwgdilcbiAgICAgICAgICAgIHYgPyB4ID0gc2VsZi5sb2NhdGlvbi5ocmVmIDogXCJ1bmRlZmluZWRcIiAhPSB0eXBlb2YgZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCAmJiAoeCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjKSwgX3NjcmlwdERpciAmJiAoeCA9IF9zY3JpcHREaXIpLCAwICE9PSB4LmluZGV4T2YoXCJibG9iOlwiKSA/IHggPSB4LnN1YnN0cigwLCB4LnJlcGxhY2UoL1s/I10uKi8sIFwiXCIpLmxhc3RJbmRleE9mKFwiL1wiKSArIDEpIDogeCA9IFwiXCIsIHkgPSBiID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IG5ldyBYTUxIdHRwUmVxdWVzdDtcbiAgICAgICAgICAgICAgICAgICAgYy5vcGVuKFwiR0VUXCIsIGIsICExKTtcbiAgICAgICAgICAgICAgICAgICAgYy5zZW5kKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5yZXNwb25zZVRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChmKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiID0gQyhiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBiLmxlbmd0aDsgZCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBiW2RdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSA8IGUgJiYgKGUgJj0gMjU1KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdiAmJiAoQSA9IGIgPT4geyB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBjID0gbmV3IFhNTEh0dHBSZXF1ZXN0O1xuICAgICAgICAgICAgICAgIGMub3BlbihcIkdFVFwiLCBiLCAhMSk7XG4gICAgICAgICAgICAgICAgYy5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XG4gICAgICAgICAgICAgICAgYy5zZW5kKG51bGwpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShjLnJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGIgPSBDKGIpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjtcbiAgICAgICAgICAgICAgICB0aHJvdyBkO1xuICAgICAgICAgICAgfSB9KSwgeiA9IChiLCBjLCBkKSA9PiB7IHZhciBlID0gbmV3IFhNTEh0dHBSZXF1ZXN0OyBlLm9wZW4oXCJHRVRcIiwgYiwgITApOyBlLnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjsgZS5vbmxvYWQgPSAoKSA9PiB7IGlmICgyMDAgPT0gZS5zdGF0dXMgfHwgMCA9PSBlLnN0YXR1cyAmJiBlLnJlc3BvbnNlKVxuICAgICAgICAgICAgICAgIGMoZS5yZXNwb25zZSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IEMoYik7XG4gICAgICAgICAgICAgICAgZiA/IGMoZi5idWZmZXIpIDogZCgpO1xuICAgICAgICAgICAgfSB9OyBlLm9uZXJyb3IgPSBkOyBlLnNlbmQobnVsbCk7IH07XG4gICAgICAgIHZhciBhYSA9IGEucHJpbnQgfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwgRCA9IGEucHJpbnRFcnIgfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oYSwgcCk7XG4gICAgICAgIHAgPSBudWxsO1xuICAgICAgICBhLnRoaXNQcm9ncmFtICYmICh0ID0gYS50aGlzUHJvZ3JhbSk7XG4gICAgICAgIHZhciBFO1xuICAgICAgICBhLndhc21CaW5hcnkgJiYgKEUgPSBhLndhc21CaW5hcnkpO1xuICAgICAgICB2YXIgbm9FeGl0UnVudGltZSA9IGEubm9FeGl0UnVudGltZSB8fCAhMDtcbiAgICAgICAgXCJvYmplY3RcIiAhPSB0eXBlb2YgV2ViQXNzZW1ibHkgJiYgRihcIm5vIG5hdGl2ZSB3YXNtIHN1cHBvcnQgZGV0ZWN0ZWRcIik7XG4gICAgICAgIHZhciBHLCBIID0gITEsIEksIEosIEssIEw7XG4gICAgICAgIGZ1bmN0aW9uIE0oKSB7IHZhciBiID0gRy5idWZmZXI7IGEuSEVBUDggPSBJID0gbmV3IEludDhBcnJheShiKTsgYS5IRUFQMTYgPSBuZXcgSW50MTZBcnJheShiKTsgYS5IRUFQMzIgPSBLID0gbmV3IEludDMyQXJyYXkoYik7IGEuSEVBUFU4ID0gSiA9IG5ldyBVaW50OEFycmF5KGIpOyBhLkhFQVBVMTYgPSBuZXcgVWludDE2QXJyYXkoYik7IGEuSEVBUFUzMiA9IEwgPSBuZXcgVWludDMyQXJyYXkoYik7IGEuSEVBUEYzMiA9IG5ldyBGbG9hdDMyQXJyYXkoYik7IGEuSEVBUEY2NCA9IG5ldyBGbG9hdDY0QXJyYXkoYik7IH1cbiAgICAgICAgdmFyIGJhID0gW10sIGNhID0gW10sIGRhID0gW107XG4gICAgICAgIGZ1bmN0aW9uIGVhKCkgeyB2YXIgYiA9IGEucHJlUnVuLnNoaWZ0KCk7IGJhLnVuc2hpZnQoYik7IH1cbiAgICAgICAgdmFyIE4gPSAwLCBPID0gbnVsbCwgUCA9IG51bGw7XG4gICAgICAgIGZ1bmN0aW9uIEYoYikgeyBpZiAoYS5vbkFib3J0KVxuICAgICAgICAgICAgYS5vbkFib3J0KGIpOyBiID0gXCJBYm9ydGVkKFwiICsgYiArIFwiKVwiOyBEKGIpOyBIID0gITA7IGIgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGIgKyBcIi4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby5cIik7IG4oYik7IHRocm93IGI7IH1cbiAgICAgICAgdmFyIFEgPSBcImRhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCxcIiwgUjtcbiAgICAgICAgUiA9IFwiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LEFHRnpiUUVBQUFBQjlRWnhZQUovZndCZ0EzOS9md0YvWUFSL2ZuOS9BWDVnQW45L0FYOWdBWDhCZjJBRmYzNS9mMzhCZm1BRGYzOS9BR0FFZjM5L2Z3Ri9ZQUovZmdGK1lBRi9BR0FGZjM5L2YzOEJmMkFCZkFGOFlBSi9mZ0JnQW45L0FYNWdBbjkrQVg5Z0EzOS9mZ0YvWUFOL2ZuOEJmbUFEZjM1L0FHQUdmMzUvZjM5L0FYNWdCbjkvZjM5L2Z3Ri9ZQVIvZjM5L0FHQURmMzUvQVg5Z0JuOStmbjkvZndGK1lBUi9mMzUvQVg5Z0EzOStmZ0YrWUFOL2YzOEJmbUFGZjM5L2ZuNEJmMkFFZjM5L2ZnRi9ZQVIvZjM1K0FYOWdCWDkrZm41K0FHQUJmd0YrWUFOL2ZuNEJmMkFFZjM5L2Z3RitZQWQvZjM5L2YzOS9BWDlnQlg5L2YzOS9BWDVnQW54OEFYeGdBQUYvWUFWL2YzOS9md0JnQlg5K2YzNS9BWDlnQlg5K2ZuOS9BWDVnQVg0QmYyQUVmMzUrZndCZ0IzOStmMzUrZm44QmYyQUlmMzkvZjM5L2YzOEJmMkFGZjM1K2ZuOEJmMkFHZjM1L2ZuNS9BWDlnQkg5K2YzNEJmbUFFZjM1L2Z3QmdCSDkrZjM0QVlBWi9mMzkvZjM4QmZtQUVmMzUrZndGL1lBbC9mMzkvZjM5L2YzOEJmMkFFZjM1K2Z3RitZQVIvZm45L0FYOWdBMzkrZmdCZ0EzNS9md0YvWUFWL2ZuNS9md0JnQTM5L2ZnRitZQWQvZm45L2YzOS9BWDVnQUFCZ0EzOS9mZ0JnQkg5K2YzNEJmMkFGZjM5K2YzOEJmMkFFZjM1K2ZnRi9ZQWQvZjM5L2YzOS9BR0FDZkg4QmZHQUJmQUYvWUFOOGZIOEJmR0FDZjM4QmZHQUVmMzkrZndCZ0JIOStmbjRCZm1BQmZnRitZQUovZkFGL1lBWi9mSDkvZjM4QmYyQUFBWHhnQlg5K2YzNS9BWDVnQm45L2ZuNStmZ0YvWUFKK2Z3QmdBbjk4QUdBRWYzOStmd0YrWUFWL2YzOS9mZ0YrWUFkL2ZuNStmMzkvQVg1Z0JINStmbjRCZjJBSGYzOS9mMzkvZmdGK1lBcC9mMzkvZjM5L2YzOS9BWDlnQjM5L2ZuNS9mMzhCZjJBRmYzeC9mMzhCZm1BQ2ZuOEJmMkFHZkg5L2YzOS9BR0FGZjM1L2YzOEFZQVYvZjM1L2Z3QmdCbjkrZm41K2Z3Ri9ZQVYvZjM1K2Z3Ri9ZQVovZm45L2YzOEJmMkFEZjN4L0FYOWdCWDkrZjM5L0FYOWdCWDkvZm41K0FYNWdCWDkrZm41K0FYOWdCbjkvZm41L2Z3Ri9ZQWQvZjM5K2ZuNS9BWDlnQkg5L2YzNEJmbUFDZkg4QmYyQUdmMzkvZjM5L0FHQUlmMzkvZjM5L2YzOEFZQU4vZm53QmZtQUFBWDVnQW54OEFYOWdBbjUrQVh4Z0FYOEJmR0FEZm41K0FYOWdBMzkvZkFCZ0NIOStmbjUrZjM1K0FYNWdDWDkvZjM5L2YzOS9md0FDV3c4QllRRmhBQlFCWVFGaUFEc0JZUUZqQUFjQllRRmtBQVFCWVFGbEFBTUJZUUZtQUFNQllRRm5BQWNCWVFGb0FBRUJZUUZwQUFvQllRRnFBQVFCWVFGckFBWUJZUUZzQUFBQllRRnRBRW9CWVFGdUFBUUJZUUZ2QUFvRHlnbklDUXdBQUFRQVN3WUdBQU1tQUFrQkFBQUJQQ2N2REFrSURnRUlBd0FCQXcwZEp3NE9CQVllQ1I0SURnQUdBdzhCSGdRd0F3OEtBejBHQ0FBUUF4VUhHQWNCQmdjZktBQUVCRDRCQ0FZR0RRWUdBdzRCRFNVQUVCMHBBUUUvQ1FncUR3RWRGUVlZVEQ0TkR3b0FCd1FKQXdFT0JCY3hBeUF5UHc0REFBd0RBQWdLQmdFRURoVUdDZ1FlRHc0UUNRWk5BVE1IQUFRUEJqMFBBZ2NHQTA0QkZUUW1FQVFRRGhVckF3UUJBdzhQTWl4UFVBbEFFd29LQkFNQkdBTU9DZ2NJQVRFbUF5d0RBVFVQTEZFQVFUWUdBekFEUUFNSkdBb1BBUkFJQ1FFQUFGSUVKZ0ZUQkFrRFZBa0tJUU1mQVE0T0JRQUdCQU1EQUZVQUNBRUJOeklJRGlsV0VBQUdHUVJYT0FzSEFRQVBBQUVCQmdRQkF3UUtCZ1FCQ1FZQ0dBVUZBRFZDQkFNQkRRa0pBU0lJRGc4SVFpVTVBUU1YQVJnVUJnQUtXRmtIQ3cwVVF5TUVDd1phQUFjVEFRTUVFd01JSUFGRUJnUUhBUUFFQndjQkF3RUVBUU1FRGhBREUxc1BHUTRPR0VVQUNnQUFFQTRCQVFrWkFRQUVBeGtIWEFNTkl5TW5Cd01EQUYwdkFTUUJGQVluQlFNTlhnTUFLQWtFQXdzREFRb0VCd01DQkFFTEFRb0lBQTVmS0FRQkF3TUREd0VKQndrQkNnQUhCd016QXdjSEJ3UUREZ01lQ0J4Z0FpZ0VBd0poTkFBVlBBQUhEd2NLSVFFVUV4RUFDd0JpR1FZR0F3TVVDZ01BQkNrQkdBZ0RGd01HR1dNZENBNDNMVFlKRHhZSEFnZ1FBQUFERkFOR0Z3eGtHQW9KQm1VTEV4Um1Ld29KRXhNaEt6ZG5Cd2NEQkNzREJnRUdCd1FCQkFBQkFBRTdBZ0lJQkFRQkFRb09BUVVtQldnTlIwY0JBUVZwQWdRSkRBRUFBd1FEQVFFQUF3TUpBd0VUQXdFQUFBTVRNd29URkEwSkFTRUNBd0VCQndnRkJTNEJEd1pxQ0E4UUVBaEZOUUFCQUFBQUtROGxBUTRJRHdFREFRb0hFQVFBQVJBTkJBUUVDUkVKQ1FBUERRTURCQU1JRHdFREV3Y0RNQUVCQXdBZU1RRUJTQUVIQXg5ckh4QVhCZzhQS0JZbkFUb1hEZzBEQUI4R0FRTXNCUVVOSHhVQUVBZ1hSZ0FOQXdRZGJBQVpBQUJ0Q1JRR0FBRVpKUU1BQXlJZ0RRTWRBZ1UyQWk4UkJ3Z0RGQVFoUVVNZUtSMXVBUXNqQkFRQkZBY1RBd1FUQWdvSEpSUUhFeVVoQUFNSkJnY2hBd01CQXdRQkFRTWZid0lGQkFFQ0FnSUNBZ0lDQWdJQ0JRVUNBZ0lDQlFVRkFnSUNBZ0lGQlFVQ0FnSUNFZ0lDQ3dJQ0N5TUxCUUlDQlFJRkFnVUNBZ1VDQWdnQ0FnSUNFZ0lDQWdVQ0FnSUNBZ0lFQ1JZV0ZoWUNBZ0lDQWdJQ0FnSVFDQWdTQ0NJQ0FoRU1MUzRWS2hVYkd4Y1NBZ1VGRUFVYUJRVUZCUklDQlRrUURRME5EUTBORFEwRERRMEJBUUVCQVFFQkFRRUJCUVVCQWdJQ0FnVUNCUVVrQWdnRkFnZ0NKQUlHQlNRRkVCRWtEQkVNREF3UkRCSVNKQklDQWdJSUFnQVNCUUlTQlJrU0JSa0JBZ0lFQlFVRkJRTUNBUUFBRVF3UkRBd01FUXdSREF3UkRBd01FUXdFRVF3UkRCRU1EQkVNRVF3cUtoVVhGUU1BQUFBU0FTQWdJQWtCRWdRSkpCa0pBQWNCQ1FrREF3RUZBd1FEQ2dNRENuQVVBUUVFQXdNQkEwUklCQU1FQXdBQUFBQUpBaUliR2h3SUZoWVdGZ0lDQWdJRkZnSTZBZ0VBU1FJTEN3c0xFQXNMQVJBTEN3c0xDd3NqQ3dzTEN3c0xBUkFFQndJSEJ3b0tDZ0lDQmdZR0JnWUdCZ1lHQmdFRkFnSUZBZ0lDQlFJQ0FnSUNCUVVGR0FnQ0FnSUNBZ2dJQWdJQ0FnVUNCUUVDQWdJQ0JRSUNCUUlDQWdJQ0FnSUNCUVVDQWdJRkFnSUNDd1FGQVhBQW13TUZCd0VCZ0FLQWdBSUdDUUYvQVVHUTNzUUNDd2ZBQWp3QmNBSUFBWEVBdXdRQmNnQ3hBUUZ6QUtNSUFYUUFrZ2dCZFFDQUNBRjJBUHdIQVhjQTl3Y0JlQUNZQXdGNUFKZ0RBWG9BNmdjQlFRRGpCd0ZDQU5rSEFVTUExUWNCUkFEUkJ3RkZBTW9IQVVZQStnWUJSd0Q1QmdGSUFOY0lBVWtBMWdnQlNnQ2JBUUZMQU5VSUFVd0ExQWdCVFFEVENBRk9BTklJQVU4QTBRZ0JVQURRQ0FGUkFNOElBVklBemdnQlV3RE5DQUZVQU13SUFWVUE5d1VCVmdETENBRlhBTW9JQVZnQXlRZ0JXUURJQ0FGYUFNY0lBVjhBeGdnQkpBREZDQUpoWVFERUNBSmlZUUREQ0FKallRRENDQUprWVFEQkNBSmxZUURBQ0FKbVlRQy9DQUpuWVFDK0NBSm9ZUUM5Q0FKcFlRQ3NDQUpxWVFDWUF3SnJZUUNZQXdKc1lRQzdDQUp0WVFDNkNBSnVZUUM0Q0FKdllRQzNDQUp3WVFDMENBSnhZUUN6Q0FKeVlRRUFBbk5oQUxFSUFuUmhBTEFJQW5WaEFLOElDYnNHQVFCQkFRdWFBL2NJaXdiMkNOZ0QyQU95QjZnSG9BZVhCNDBIakFmMEJQNEcvUWI4QnZzRytBYkNCdFVKdlFtcENad0pyZ09RQ1k4Smx3YUpDZTRJNmdqcENKZ0U2QWpuQ1B3RjVnamxDT1FJNHdqNkJlSUk0UWpnQ044STNnajVCZDBJM0FqYkNOb0kyUWpZQ1BNRTh3ZThDTGtJdGdpMUNPc0k5QVN5Q05VRnJnaXRDS2NJcUFpbUNLVUlwQWowQjQ0SmpRbUtDWWdKakFud0IvRUg3Z2ZyQitRSDRnZmhCOU1Id1FlYUIvRUV2QW1iQ1pvSm1RbVlDWmNKbGdtVkNaUUprd21TQ1pFSml3bnRDT3dJblFpY0NKc0ltZ2laQ0tBRm1BaVhDSllJbFFpVUNKTUlrUWlRQ0k4SWpnaU5DSXdJaXdpS0NJa0lpQWlIQ0lZSTZRT0ZDT2tEaEFpRENJSUlnUWllQ0tFSW9BaWZDS0lJMlFQL0IvNEhrUWVRQjVrSG1BZVdCNVVIbEFlVEI1SUg0QWZmQjk0SDZRUGRCNkFGM0FmYkI5b0gyQWVyQ0tvSXFRai9Cb29IaVFlSUI0Y0hoZ2VGQjRRSGd3ZUNCNEVIZ0Fmb0I0c0hqd2VPQjVzSHBBZWhCNk1Ib2dlZkI1NEhuUWVjQjZVSDV3Zm1CK1VIL2dIc0Ira0g3UWZ2Qi9JSDlRYlBCUFFHOHdieUJ2RUd5QVR3QnU4Rzl3YlJCUFlHOWdmMUIvc0grZ2Y1Qi9nSC9RZW9DZU1HcHdubUJxWUpwUW1rQ2FNSjRRYmZCc1lFb2dtaENhQUpzUWFmQ1o0Sm5RbXdCcklKc1Ftd0NhOEpyZ210Q2F3SnF3bXFDYmdKblFPM0NiWUp0UW0wQ2JNSnhnbkpCOGdIeFFuRUNjTUp3Z25XQThFSndBbjNCUGdFdndtK0Nic0p1Z201Q2NrSnlBbkhDZEFKendtOUJMd0V6Z25OQ2N3Snl3bktDYlFHMUFuVENkSUowUW00QnJjR3RnYTFCcm9HdVFhOUJyd0d1d2JTQnRFRzBBYlBCczRHelFiTUJzc0d5Z2JKQnNnR3h3YkdCc1VHeEFiREJzRUd3QWEvQnI0RzB3YmNCb0FKK2dqN0NOc0dnd21FQ1lFSm5RVCtDUGtJNndQTUF0b0c5UWp4Q084STJRYjRDUFFJOEFpQ0NmOEkvUWlYQXFjRDFnbnlDUHdJMkFiWEJ0WUcxUWJVQnVnRzV3YmxCdVFHNGdiZ0J0NEczUWJyQnVvRzZRYnRCdXdHN2dhcEI2Y0hwZ2ZQQjRFRjF3ZUFCYzRIelFmTUI4c0h4d2ZHQjhVSHhBZkRCOElId0FlL0I5SUgwQWZXQjlRSHRBZXpCN0VIc0FldkI2NEhyUWVzQjZzSHFnZStCNzBIdkFlN0I3b0h1UWU0QjdjSHRnZTFCNGNKaFFtR0NkZ0Q4d2dLMTVZWHlBazFBUUYvQWtBZ0FVSWdpS2RCZFVrTkFDQUJweUlDSUFJb0FnQWlBa0VCYXpZQ0FDQUNRUUZLRFFBZ0FDZ0NFQ0FCRUpZRUN3dE5BUUovSUFBb0FrQWlBa0dBQW1vaEF5QUNLQUtjQWlBQUtBSUVSd1JBSUFOQndnRVFFU0FESUFBb0FnUVFIU0FDSUFBb0FnUTJBcHdDQ3lBQ0lBSW9Bb1FDTmdLWUFpQURJQUVRRVFzbUFRRi9Jd0JCRUdzaUFpUUFJQUlnQVRvQUR5QUFJQUpCRDJwQkFSQnlJQUpCRUdva0FBdi9Gd0lHZndKK0l3QkJFR3NpQWlRQUFuOENRQ0FBS0FJQUtBSVFLQUo0SUFKTEJFQWdBRUdOSWtFQUVCWU1BUXNnQUNBQVFSQnFJZ1FRL3dFZ0FDQUFLQUk0SWdFMkFqUWdBaUFCTmdJTUlBQkJBRFlDTUNBQUlBQW9BaFEyQWdRRFFDQUFJQUUyQWhnZ0FDQUFLQUlJSWdNMkFoUUNRQUpBQWtBQ1FBSkFBa0FDUUFKL0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBU3dBQUNJRlFmOEJjU0lHRG4wQUZ4Y1hGeGNYRnhjRUF3UUVBaGNYRnhjWEZ4Y1hGeGNYRnhjWEZ4Y1hGd1FTR2dnSERCTWFGeGNMRFJjT0NRVUtIUjBkSFIwZEhSMGRGeGNQRVJBV0Z3Y0hCd2NIQndjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NIQndjSEZ3WVhGQWNCQndjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NIQndjSEJ3Y0hCd2NYRlJjTFFRQWhCU0FCSUFBb0FqeEpEUmdnQkVHc2Z6WUNBQXdnQ3lBQUlBRkJBV29RendNTkhTQUNJQUFvQWpnMkFnd01Id3NnQVVFQmFpQUJJQUV0QUFGQkNrWWJJUUVMSUFJZ0FVRUJhallDREF3ZUN5QUNJQUZCQVdvMkFnd01IZ3NDUUFKQUlBRXRBQUVpQTBFcVJ3UkFJQU5CTDBZTkFTQURRVDFIRFFJZ0FpQUJRUUpxTmdJTUlBUkJobjgyQWdBTUhnc2dBaUFCUVFKcUlnRTJBZ3dEUUFKQUFrQUNRQUpBQWtBQ1FDQUJMUUFBSWdOQkNtc09CQUVEQXdJQUN5QURRU3BIQkVBZ0F3MERJQUVnQUNnQ1BFa05CQ0FBUWRVc1FRQVFGZ3dpQ3lBQkxRQUJRUzlIRFFNZ0FpQUJRUUpxTmdJTURDVUxJQUJCQVRZQ01DQUFJQUFvQWdoQkFXbzJBZ2dnQWlBQlFRRnFOZ0lNREFNTElBQkJBVFlDTUNBQ0lBRkJBV28yQWd3TUFnc2dBOEJCQUU0TkFDQUJRUVlnQWtFTWFoQllJZ0ZCZm5GQnFNQUFSZ1JBSUFCQkFUWUNNQXdDQ3lBQlFYOUhEUUVnQWlBQ0tBSU1RUUZxTmdJTURBRUxJQUlnQVVFQmFqWUNEQXNnQWlnQ0RDRUJEQUFMQUFzZ0FVRUNhaUVCUVFBTUZ3c2dBaUFCUVFGcU5nSU1JQVJCTHpZQ0FBd2JDMEhjQUNFRklBRXRBQUZCOVFCSERSSWdBaUFCUVFGcU5nSUVJQUpCQkdwQkFSRDVBU0lHUVFCSURSSWdCaER2QWtVTkVpQUNJQUlvQWdRMkFnd2dBa0VCTmdJSURCY0xJQUpCQURZQ0NDQUNJQUZCQVdvMkFnd01GZ3NnQWlBQlFRSnFOZ0lFUWR3QUlRTUNRQ0FCTFFBQklnVkIzQUJHQkVBZ0FTMEFBa0gxQUVjTkFTQUNRUVJxUVFFUStRRWhBd3dCQ3lBRklnUEFRUUJPRFFBZ0FVRUJha0VHSUFKQkJHb1FXQ0VEQ3lBREVPOENSUVJBSUFCQnhPY0FRUUFRRmd3WEN5QUNJQUlvQWdRMkFnd2dBQ0FDUVF4cUlBSkJDR29nQTBFQkVPb0VJZ0ZGRFJZZ0FFR3JmellDRUNBQUlBRTJBaUFNR0F0QkxpRUZJQUV0QUFFaUEwRXVSdzBPSUFFdEFBSkJMa2NORHlBQ0lBRkJBMm8yQWd3Z0JFR25mellDQUF3WEN5QUJMUUFCUVRwclFYWkpEUklnQUNnQ1FDMEFia0VCY1VVTkVpQUFRZnZzQUVFQUVCWU1GQXRCS2lFRklBRXRBQUVpQTBFcVJ3UkFJQU5CUFVjTkRpQUNJQUZCQW1vMkFnd2dCRUdGZnpZQ0FBd1dDeUFCTFFBQ1FUMUdCRUFnQWlBQlFRTnFOZ0lNSUFSQmtYODJBZ0FNRmdzZ0FpQUJRUUpxTmdJTUlBUkJwWDgyQWdBTUZRdEJKU0VGSUFFdEFBRkJQVWNORENBQ0lBRkJBbW8yQWd3Z0JFR0hmellDQUF3VUMwRXJJUVVnQVMwQUFTSURRU3RIQkVBZ0EwRTlSdzBNSUFJZ0FVRUNhallDRENBRVFZaC9OZ0lBREJRTElBSWdBVUVDYWpZQ0RDQUVRWlovTmdJQURCTUxRUzBoQlNBQkxRQUJJZ1pCTFVjRVFDQUdRVDFIRFFzZ0FpQUJRUUpxTmdJTUlBUkJpWDgyQWdBTUV3c0NRQ0FBS0FKSVJRMEFJQUV0QUFKQlBrY05BQ0FBS0FJRUlBTkhEUTBMSUFJZ0FVRUNhallDRENBRVFaVi9OZ0lBREJJTEFrQUNRQUpBSUFFdEFBRWlBMEU4YXc0Q0FRQUNDeUFDSUFGQkFtbzJBZ3dnQkVHYmZ6WUNBQXdUQ3lBQkxRQUNRVDFHQkVBZ0FpQUJRUU5xTmdJTUlBUkJpbjgyQWdBTUV3c2dBaUFCUVFKcU5nSU1JQVJCbDM4MkFnQU1FZ3RCUENFRklBTkJJVWNOQ1NBQUtBSklSUTBKSUFFdEFBSkJMVWNOQ1NBQkxRQURRUzFHRFFzTUNRdEJQaUVGQWtBQ1FDQUJMUUFCUVQxckRnSUFBUW9MSUFJZ0FVRUNhallDRENBRVFaMS9OZ0lBREJFTEFrQUNRQUpBSUFFdEFBSkJQV3NPQWdFQUFnc2dBUzBBQTBFOVJnUkFJQUlnQVVFRWFqWUNEQ0FFUVl4L05nSUFEQk1MSUFJZ0FVRURhallDRENBRVFabC9OZ0lBREJJTElBSWdBVUVEYWpZQ0RDQUVRWXQvTmdJQURCRUxJQUlnQVVFQ2FqWUNEQ0FFUVpoL05nSUFEQkFMUVQwaEJRSkFBa0FnQVMwQUFVRTlhdzRDQUFFSkN5QUJMUUFDUVQxR0JFQWdBaUFCUVFOcU5nSU1JQVJCbjM4MkFnQU1FUXNnQWlBQlFRSnFOZ0lNSUFSQm5uODJBZ0FNRUFzZ0FpQUJRUUpxTmdJTUlBUkJwbjgyQWdBTUR3dEJJU0VGSUFFdEFBRkJQVWNOQmlBQkxRQUNRVDFHQkVBZ0FpQUJRUU5xTmdJTUlBUkJvWDgyQWdBTUR3c2dBaUFCUVFKcU5nSU1JQVJCb0g4MkFnQU1EZ3RCSmlFRklBRXRBQUVpQTBFbVJ3UkFJQU5CUFVjTkJpQUNJQUZCQW1vMkFnd2dCRUdOZnpZQ0FBd09DeUFCTFFBQ1FUMUdCRUFnQWlBQlFRTnFOZ0lNSUFSQmtuODJBZ0FNRGdzZ0FpQUJRUUpxTmdJTUlBUkJvbjgyQWdBTURRc0NRQ0FCTFFBQklnTkIzZ0JIQkVBZ0EwRTlSdzBCSUFJZ0FVRUNhallDRENBQUtBSkFMUUJ1UVFSeEJFQWdCRUdRZnpZQ0FBd1BDeUFFUVk1L05nSUFEQTRMSUFFdEFBSkJQVVlFUUNBQ0lBRkJBMm8yQWd3Z0JFR09mellDQUF3T0N5QUNJQUZCQW1vMkFnd2dCRUhlQURZQ0FBd05DeUFDSUFGQkFXbzJBZ3dnQUNnQ1FDMEFia0VFY1FSQUlBUkJwSDgyQWdBTURRc2dCRUhlQURZQ0FBd01DMEg4QUNFRklBRXRBQUVpQTBIOEFFY0VRQ0FEUVQxSERRUWdBaUFCUVFKcU5nSU1JQVJCajM4MkFnQU1EQXNnQVMwQUFrRTlSZ1JBSUFJZ0FVRURhallDRENBRVFaTi9OZ0lBREF3TElBSWdBVUVDYWpZQ0RDQUVRYU4vTmdJQURBc0xRVDhoQlNBQkxRQUJJZ05CTGtjRVFDQURRVDlIRFFNZ0FTMEFBa0U5UmdSQUlBSWdBVUVEYWpZQ0RDQUVRWlIvTmdJQURBd0xJQUlnQVVFQ2FqWUNEQ0FFUWFoL05nSUFEQXNMSUFFdEFBSkJNR3RCL3dGeFFRcEpEUUlnQWlBQlFRSnFOZ0lNSUFSQnFYODJBZ0FNQ2dzZ0JVRUFUZzBCSUFGQkJpQUNRUXhxRUZnaUJrRitjVUdvd0FCR0JFQWdBQ2dDQ0NFRERBc0xJQVlRaHdNTkN5QUdFTzhDQkVBZ0FrRUFOZ0lJREFjTElBQkIwY01BUVFBUUZnd0hDeUFEUVRCclFmOEJjVUVLU1EwRUN5QUVJQVZCL3dGeE5nSUFJQUlnQVVFQmFqWUNEQXdIQ3lBQUlBWkJBU0FCUVFGcUlBUWdBa0VNYWhEekFrVU5CZ3dFQzBFQkN5RURBMEFDZndKQUFrQUNRQUpBSUFORkJFQWdBaUFCTmdJTURBRUxJQUV0QUFBaUEwVU5BZ0pBSUFOQkNtc09CQTBBQUEwQUN5QUR3RUVBVGcwRElBRkJCaUFDUVF4cUVGZ2lBMEYrY1VHb3dBQkdEUXdnQWlnQ0RDRUJJQU5CZjBZTkFRdEJBU0VEREFRTElBRkJBV29NQWdzZ0FTQUFLQUk4VHcwSkN5QUJRUUZxQ3lFQlFRQWhBd3dBQ3dBTElBQW9Ba0F0QUc0aEF5QUFRU2hxSWdWQkFEWUNBQUpBSUFBb0FnQWdBU0FDUVF4cVFRQkI5QVpCOUFBZ0EwRUVjUnNnQlJDM0JTSUhRb0NBZ0lCd2d5SUlRb0NBZ0lEQWZsSUVRQ0FJUW9DQWdJRGdBRkVOQXlBQ0tBSU1RUVlnQWtFSWFoQllFTVVCUlEwQkN5QUFLQUlBSUFjUUR5QUFRZFhWQUVFQUVCWU1BZ3NnQUNBSE53TWdJQUJCZ0g4MkFoQU1Bd3NnQUNBQ1FReHFJQUpCQ0dvZ0JrRUFFT29FSWdGRkRRQWdBQ0FCTmdJZ0lBSW9BZ2doQlNBQVFRQTJBaWdnQUNBRk5nSWtBa0FnQVVFbFNRMEFJQUZCTFUwRVFDQUFLQUpBSWdNdEFHNUJBWEVOQVNBQlFTMUhEUU1nQXk4QmJDSUdRUUZ4RFFFZ0JrR0EvZ054UVlBR1J3MERJQU1vQW1RTkF5QURLQUlFSWdORkRRTWdBeTBBYkVFQmNRMEJEQU1MSUFGQkxrY05BaUFBS0FKRURRQWdBQ2dDUUNJREx3RnNJZ1pCQW5FTkFDQUdRWUQrQTNGQmdBWkhEUUlnQXlnQ1pBMENJQU1vQWdRaUEwVU5BaUFETFFCc1FRSnhSUTBDQ3lBRkJFQWdBRUdEZnpZQ0VDQUFRUUUyQWlnTUF3c2dCQ0FCUWRRQWF6WUNBQXdDQ3lBRVFhcC9OZ0lBREFVTElBUkJnMzgyQWdBTElBQWdBaWdDRERZQ09FRUFEQVFMSUFCQkFUWUNNQ0FBSUFOQkFXbzJBZ2dMSUFJb0Fnd2hBUXdBQ3dBTFFYOExJUUVnQWtFUWFpUUFJQUVMRlFBZ0FVSGVBVTRFUUNBQUtBSVFJQUVRNkFVTEM3b0hBZ1ovQVg0akFFRWdheUlISkFCQ2dJQ0FnT0FBSVFzQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUJRaUNJcHlJR1FRRnFEZ2dEQlFVQUFRVUZDUUlMSUFBZ0FrR0gxQUFRandFTUJnc2dBQ0FDUWZmNEFCQ1BBUXdGQ3lBR1FYbEdEUUVNQWdzZ0FhY2hCZ3dDQ3lBQnB5RUdJQUpCQUVnRVFDQUNRZi8vLy84SGNTSUZJQVlwQWdRaUM2ZEIvLy8vL3dkeFR3MEJJQVpCRUdvaEFpQUFBbjhnQzBLQWdJQ0FDSU5RUlFSQUlBSWdCVUVCZEdvdkFRQU1BUXNnQWlBRmFpMEFBQXRCLy84RGNSQ2ZBeUVMREFVTElBSkJNRWNOQUNBR0tRSUVRdi8vLy84SGd5RUxEQVFMSUFBZ0FSQ05CS2NpQmtVTkFnc2dBa0gvLy8vL0IzRWhDUU5BSUFZb0FoQWlCVUV3YWlFS0lBVWdCU2dDR0NBQ2NVRi9jMEVDZEdvb0FnQWhCUUpBQTBBZ0JVVU5BU0FDSUFvZ0JVRUJhMEVEZENJRmFpSUlLQUlFUndSQUlBZ29BZ0JCLy8vL0gzRWhCUXdCQ3dzZ0JpZ0NGQ0FGYWlFRkFrQUNRQUpBQWtBZ0NDZ0NBRUVlZGtFQmF3NERBQUVDQXdzZ0JTZ0NBQ0lDUlEwR0lBSWdBaWdDQUVFQmFqWUNBQ0FBSUFLdFFvQ0FnSUJ3aENBRFFRQkJBQkF2SVFzTUJ3c2dCU2dDQUNnQ0VDa0RBQ0lMUW9DQWdJQndnMEtBZ0lDQXdBQlJCRUFnQUNBQ0VOa0JEQVVMSUF0Q0lJaW5RWFZKRFFZZ0M2Y2lBQ0FBS0FJQVFRRnFOZ0lBREFZTElBQWdCaUFDSUFVZ0NCRElBa1VOQWd3REN5QUZLUU1BSWd0Q0lJaW5RWFZKRFFRZ0M2Y2lBQ0FBS0FJQVFRRnFOZ0lBREFRTEFrQWdCaTBBQlNJRlFRUnhSUTBBSUFWQkNIRUVRQ0FDUVFCSUJFQWdCaWdDS0NBSlN3UkFJQUFnQnExQ2dJQ0FnSENFSUFrUXNBRWhDd3dIQ3lBR0x3RUdRU0JyUWYvL0EzRkI5ZjhEVHcwRkRBSUxJQVl2QVFaQkZXdEIvLzhEY1VFS1N3MEJJQUFnQWhDZUF5SUZSUTBCUW9DQWdJRGdBRUtBZ0lDQU1DQUZRUUJJR3lFTERBVUxJQUFvQWhBb0FrUWdCaThCQmtFWWJHb29BaFFpQlVVTkFDQUZLQUlVSWdnRVFDQUdJQVlvQWdCQkFXbzJBZ0FnQUNBR3JVS0FnSUNBY0lRaUFTQUNJQU1nQ0JFdUFDRUxJQUFnQVJBUERBVUxJQVVvQWdBaUJVVU5BQ0FHSUFZb0FnQkJBV28yQWdBZ0FDQUhJQWF0UW9DQWdJQndoQ0lCSUFJZ0JSRVhBQ0VGSUFBZ0FSQVBJQVZCQUVnTkFpQUZSUTBBSUFjdEFBQkJFSEVFUUNBQUlBY3BBeGdRRHlBQUlBY3BBeEFnQTBFQVFRQVFMeUVMREFVTElBY3BBd2doQ3d3RUN5QUdLQUlRS0FJc0lnWU5BQXRDZ0lDQWdEQWhDeUFFUlEwQ0lBQWdBaERIQWd0Q2dJQ0FnT0FBSVFzTUFRdENnSUNBZ0RBaEN3c2dCMEVnYWlRQUlBc0xEUUFnQUNBQklBSkJCQkRPQWd0ZkFRTi9Jd0JCRUdzaUJDUUFJQUFvQWdBaEF5QUVJQUkyQWd3Z0EwRURJQUVnQWtFQUVQQUZJQU1nQXlnQ0VDa0RnQUVnQUNnQ0RDQUFLQUlJSUFBb0FrQWlBUVIvSUFFb0FtaEJBRWRCQVhRRlFRQUxFTW9DSUFSQkVHb2tBQXNNQUNBQVFZQUNhaUFCRUNvTEt3QWdBVUhlQVU0RVFDQUFLQUlRS0FJNElBRkJBblJxS0FJQUlnQWdBQ2dDQUVFQmFqWUNBQXNnQVFzcEFDQUFJQUVnQWlBRFFvQ0FnSUF3UW9DQWdJQXdJQVJCZ000QWNoQnRJUUlnQUNBREVBOGdBZ3NaQUNBQUtBSUFJQUVRR0NFQklBQkJRR3NvQWdBZ0FSQTVDeTBCQVg4Q1FDQUFLQUlBSWdGRkRRQWdBQ2dDRUNJQVJRMEFJQUVvQWdBZ0FFRUFJQUVvQWdRUkFRQWFDd3RjQVFGL0lBQkJRR3NvQWdBaUF4RG1Ba1VFUUVGL0R3c2dBa0VBU0FSQUlBTVFNaUVDQ3lBQUlBRkIvd0Z4RUJBZ0FFRkFheUlBS0FJQUlBSVFPU0FBS0FJQUtBS2tBaUFDUVJSc2FpSUFJQUFvQWdCQkFXbzJBZ0FnQWdzbUFRRi9Jd0JCRUdzaUFpUUFJQUlnQVRZQ0RDQUFJQUpCREdwQkJCQnlJQUpCRUdva0FBczVBQ0FCUVFCT0JFQWdBRUcyQVJBUUlBQkJRR3NpQUNnQ0FDQUJFRGtnQUNnQ0FDSUFLQUtrQWlBQlFSUnNhaUFBS0FLRUFqWUNCQXNMTXdFQmZ5QUNCRUFnQUNFREEwQWdBeUFCTFFBQU9nQUFJQU5CQVdvaEF5QUJRUUZxSVFFZ0FrRUJheUlDRFFBTEN5QUFDeGdCQVg0Z0FTa0RBQ0VESUFFZ0FqY0RBQ0FBSUFNUUR3c1hBQ0FBSUFFZ0FrS0FnSUNBTUNBRElBUkJBaERZQVF2QUJRSUNmZ1ovSXdCQjRBQnJJZ2trQUNBRFFRQWdBMEVBU2hzaEN3TkFJQW9nQzBaRkJFQWdBQ0FDSUFwQkJIUnFJZ01vQWdBUXRBVWhCaUFETFFBRUlRZENnSUNBZ0RBaEJBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQU10QUFVT0NnRUNBZ1VIQXdRSUJRQUdDeUFBSUFNb0FnZ1F0QVVoQ0FKK0FrQUNRQUpBSUFNb0FneEJBV29PQXdJQUFRa0xJQUFnQUNrRHdBRWlCQ0FJSUFSQkFCQVVEQUlMSUFBZ0FDZ0NLQ2tERUNJRUlBZ2dCRUVBRUJRTUFRc2dBQ0FCSUFnZ0FVRUFFQlFMSVFRZ0FDQUlFQk1nQmtIUUFVWUVRRUVCSVFjTUNBc2dCa0haQVVjTkIwRUFJUWNNQndzQ1FDQUdRZEFCUmdSQVFRRWhCd3dCQ3lBR1Fka0JSdzBBUVFBaEJ3c2dBQ0FCSUFaQkFpQURJQWNRbFFNYURBY0xRb0NBZ0lBd0lRVWdBeWdDQ0FSQUlBa2dBeWdDQURZQ0VDQUpRU0JxSWdoQndBQkJ6RHdnQ1VFUWFoQk9HaUFBSUFNb0FnZ2dDRUVBUVFwQkNDQURMUUFGUVFKR0d5QURMZ0VHRUlJQklRVUxJQU1vQWd3RVFDQUpJQU1vQWdBMkFnQWdDVUVnYWlJSVFjQUFRY1U4SUFrUVRob2dBQ0FES0FJTUlBaEJBVUVMUVFrZ0F5MEFCVUVDUmhzZ0F5NEJCaENDQVNFRUN5QUFJQUVnQmtLQWdJQ0FNQ0FGSUFRZ0IwR0FPbklRYlJvZ0FDQUZFQThnQUNBRUVBOE1CZ3NnQXlrRENDSUVRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUVRdi8vLy84UGd5RUVEQVVMUW9DQWdJREFmaUFFdWIwaUJFS0FnSUNBd0lHQS9QOEFmU0FFUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeUVFREFRTFFvQ0FnSURBZmlBREtRTUlJZ1JDZ0lDQWdNQ0JnUHovQUgwZ0JFTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzaEJBd0RDeUFBSUFFZ0JrRUNJQU1nQnhDVkF4b01Bd3NRQVFBTElBTTFBZ2doQkFzZ0FDQUJJQVlnQkNBSEVCa2FDeUFBSUFZUUV5QUtRUUZxSVFvTUFRc0xJQWxCNEFCcUpBQUxNZ0VCZndKQUlBRkNJSWluUVhWSkRRQWdBYWNpQWlBQ0tBSUFJZ0pCQVdzMkFnQWdBa0VCU2cwQUlBQWdBUkNXQkFzTEN3QWdBRUdBTVVFQUVCVUxvZ0lDQW40QmZ3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0JCQnlBQlFpQ0lweUlFSUFSQkIydEJia2tiUVF0cURoTUVBZ01JQmdBQUFBQUFBUVVIQUFBQUFBRUZBQXNnQUVHVk1FRUFFQlZDZ0lDQWdPQUFEd3NnQkVGMVNRMElJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FBd0lDeUFBUVNFUWRpRUNEQVlMSUFCQkloQjJJUUlNQlFzZ0FFRWtFSFloQWd3RUN5QUFRUVFRZGlFQ0RBTUxJQUFnQUVFRkVIWWlBa0V3SUFHbktRSUVRdi8vLy84SGcwRUFFQmthREFJTElBQkJCaEIySVFJTUFRc2dBRUVIRUhZaEFndENnSUNBZ09BQUlRTWdBa0tBZ0lDQWNJTkNnSUNBZ09BQVVnUitJQVJCZFU4RVFDQUJweUlFSUFRb0FnQkJBV28yQWdBTElBQWdBaUFCRU5zQklBSUZRb0NBZ0lEZ0FBc1BDeUFCQzlrQkFnSi9BWDVCZnlFQ0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQlFpQ0lweUlEUVF0cURoSUhCd2NGQWdVRkJRVUZCQUFCQVFFRkJRWUZDeUFCcDBFQVJ3OExJQUduRHdzZ0FhY3BBZ1FoQkNBQUlBRVFEeUFFUXYvLy8vOEhnMElBVWc4TEFBc2dBYWNzQUFVaEFpQUFJQUVRRHlBQ1FRQk9Ed3NnQTBFSGEwRnRUUVJBSUFGQ2dJQ0FnTUNCZ1B6L0FIeEMvLy8vLy8vLy8vLy9BSU5DQVgxQ2dJQ0FnSUNBZ1BqL0FGUVBDeUFBSUFFUUQwRUJJUUlMSUFJUEN5QUJweWdDRENFQ0lBQWdBUkFQSUFKQi8vLy8vd2RxUVg1SkM2Z0VBUXQvSUFBb0FnQWhCU01BUVJCcklnZ2dBallDREVGL0lRa0NRQU5BQWtBZ0NDQUNJZ05CQkdvaUFqWUNEQ0FES0FJQUlnZEJmMFlOQUNBQUtBSUVJUW9EUUNBQklnUWdDazROQXlBRUlBUWdCV29pREMwQUFDSUdRUUowSWcxQmdMZ0JhaTBBQUdvaUFTQUtTZzBESUFaQndnRkdCRUFnRENnQUFTRUpEQUVMQ3lBR0lBZEhCRUFnQmlBSFFmOEJjVVlnQmlBSFFRaDJRZjhCY1VaeUlBWWdCMEVRZGtIL0FYRkdja1VnQjBFWWRpQUdSM0VnQmtVZ0IwR0FBa2x5Y2cwRElBQWdCallDRUFzZ0JFRUJhaUVFQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FOUVlPNEFXb3RBQUJCQldzT0dBQUpBQWtKQVFrSkFRa0pBUUVCQWdJQ0FnUUZCZ2NKQXdrTElBUWdCV290QUFBaEJDQUlJQU5CQ0dvaUFqWUNEQ0FES0FJRUlnTkJmMFlFUUNBQUlBUTJBaFFNQ1FzZ0F5QUVSZzBJREFrTElBUWdCV292QUFBaEJDQUlJQU5CQ0dvaUFqWUNEQ0FES0FJRUlnTkJmMFlFUUNBQUlBUTJBaFFNQ0FzZ0F5QUVSZzBIREFnTElBQWdCQ0FGYWlnQUFEWUNHQXdHQ3lBQUlBUWdCV29pQXlnQUFEWUNHQ0FBSUFNdkFBUTJBaHdNQlFzZ0FDQUVJQVZxS0FBQU5nSWdEQVFMSUFBZ0JDQUZhaUlES0FBQU5nSWdJQUFnQXkwQUJEWUNIQXdEQ3lBQUlBUWdCV29pQXlnQUFEWUNJQ0FBSUFNdkFBUTJBaHdNQWdzZ0FDQUVJQVZxSWdNb0FBQTJBaUFnQUNBREtBQUVOZ0lZSUFBZ0F5MEFDRFlDSEF3QkN3c2dBQ0FKTmdJTUlBQWdBVFlDQ0VFQklRc0xJQXNMQ3dBZ0FDQUJRUUFRamdRTEpBRUJmeUFBS0FJUUlnSkJFR29nQVNBQ0tBSUFFUU1BSWdGRkJFQWdBQkI4Q3lBQkN5WUJBWDhqQUVFUWF5SUNKQUFnQWlBQk93RU9JQUFnQWtFT2FrRUNFSElnQWtFUWFpUUFDeWtCQVg4Z0FnUkFJQUFoQXdOQUlBTWdBVG9BQUNBRFFRRnFJUU1nQWtFQmF5SUNEUUFMQ3lBQUN6OEJBWDhqQUVFUWF5SUNKQUFDZnlBQklBQW9BaEJIQkVBZ0FpQUJOZ0lBSUFCQm9KZ0JJQUlRRmtGL0RBRUxJQUFRRWdzaEFDQUNRUkJxSkFBZ0FBc0xBQ0FBSUFGQkFSRG1CUXZEQ2dJRmZ3OStJd0JCNEFCcklnVWtBQ0FFUXYvLy8vLy8veitESVF3Z0FpQUVoVUtBZ0lDQWdJQ0FnSUIvZ3lFS0lBSkMvLy8vLy8vL1A0TWlEVUlnaUNFT0lBUkNNSWluUWYvL0FYRWhCd0pBQWtBZ0FrSXdpS2RCLy84QmNTSUpRZi8vQVd0QmdvQitUd1JBSUFkQi8vOEJhMEdCZ0g1TERRRUxJQUZRSUFKQy8vLy8vLy8vLy8vL0FJTWlDMEtBZ0lDQWdJREEvLzhBVkNBTFFvQ0FnSUNBZ01ELy93QlJHMFVFUUNBQ1FvQ0FnSUNBZ0NDRUlRb01BZ3NnQTFBZ0JFTC8vLy8vLy8vLy8vOEFneUlDUW9DQWdJQ0FnTUQvL3dCVUlBSkNnSUNBZ0lDQXdQLy9BRkViUlFSQUlBUkNnSUNBZ0lDQUlJUWhDaUFESVFFTUFnc2dBU0FMUW9DQWdJQ0FnTUQvL3dDRmhGQUVRQ0FDSUFPRVVBUkFRb0NBZ0lDQWdPRC8vd0FoQ2tJQUlRRU1Bd3NnQ2tLQWdJQ0FnSURBLy84QWhDRUtRZ0FoQVF3Q0N5QURJQUpDZ0lDQWdJQ0F3UC8vQUlXRVVBUkFJQUVnQzRRaEFrSUFJUUVnQWxBRVFFS0FnSUNBZ0lEZy8vOEFJUW9NQXdzZ0NrS0FnSUNBZ0lEQS8vOEFoQ0VLREFJTElBRWdDNFJRQkVCQ0FDRUJEQUlMSUFJZ0E0UlFCRUJDQUNFQkRBSUxJQXRDLy8vLy8vLy9QMWdFUUNBRlFkQUFhaUFCSUEwZ0FTQU5JQTFRSWdZYmVTQUdRUVowclh5bklnWkJEMnNRWjBFUUlBWnJJUVlnQlNrRFdDSU5RaUNJSVE0Z0JTa0RVQ0VCQ3lBQ1F2Ly8vLy8vL3o5V0RRQWdCVUZBYXlBRElBd2dBeUFNSUF4UUlnZ2JlU0FJUVFaMHJYeW5JZ2hCRDJzUVp5QUdJQWhyUVJCcUlRWWdCU2tEU0NFTUlBVXBBMEFoQXdzZ0EwSVBoaUlMUW9DQS92OFBneUlDSUFGQ0lJZ2lCSDRpRUNBTFFpQ0lJaE1nQVVMLy8vLy9ENE1pQVg1OElnOUNJSVlpRVNBQklBSitmQ0lMSUJGVXJTQUNJQTFDLy8vLy93K0RJZzErSWhVZ0JDQVRmbndpRVNBTVFnK0dJaElnQTBJeGlJUkMvLy8vL3crRElnTWdBWDU4SWhRZ0R5QVFWSzFDSUlZZ0QwSWdpSVI4SWc4Z0FpQU9Rb0NBQklRaURINGlGaUFOSUJOK2ZDSU9JQkpDSUloQ2dJQ0FnQWlFSWdJZ0FYNThJaEFnQXlBRWZud2lFa0lnaG53aUYzd2hBU0FISUFscUlBWnFRZi8vQUdzaEJnSkFJQUlnQkg0aUdDQU1JQk4rZkNJRUlCaFVyU0FFSUFRZ0F5QU5mbndpQkZhdGZDQUNJQXgrZkNBRUlBUWdFU0FWVkswZ0VTQVVWcTE4ZkNJRVZxMThJQU1nREg0aUF5QUNJQTErZkNJQ0lBTlVyVUlnaGlBQ1FpQ0loSHdnQkNBQ1FpQ0dmQ0lDSUFSVXJYd2dBaUFDSUJBZ0VsYXRJQTRnRmxTdElBNGdFRmF0Zkh4Q0lJWWdFa0lnaUlSOElnSldyWHdnQWlBQ0lBOGdGRlN0SUE4Z0YxYXRmSHdpQWxhdGZDSUVRb0NBZ0lDQWdNQUFnMUJGQkVBZ0JrRUJhaUVHREFFTElBdENQNGdoQXlBRVFnR0dJQUpDUDRpRUlRUWdBa0lCaGlBQlFqK0loQ0VDSUF0Q0FZWWhDeUFESUFGQ0FZYUVJUUVMSUFaQi8vOEJUZ1JBSUFwQ2dJQ0FnSUNBd1AvL0FJUWhDa0lBSVFFTUFRc0NmaUFHUVFCTUJFQkJBU0FHYXlJSFFmOEFUUVJBSUFWQk1Hb2dDeUFCSUFaQi93QnFJZ1lRWnlBRlFTQnFJQUlnQkNBR0VHY2dCVUVRYWlBTElBRWdCeENPQWlBRklBSWdCQ0FIRUk0Q0lBVXBBekFnQlNrRE9JUkNBRkt0SUFVcEF5QWdCU2tERUlTRUlRc2dCU2tES0NBRktRTVloQ0VCSUFVcEF3QWhBaUFGS1FNSURBSUxRZ0FoQVF3Q0N5QUVRdi8vLy8vLy96K0RJQWF0UWpDR2hBc2dDb1FoQ2lBTFVDQUJRZ0JaSUFGQ2dJQ0FnSUNBZ0lDQWYxRWJSUVJBSUFvZ0FrSUJmQ0lCVUsxOElRb01BUXNnQ3lBQlFvQ0FnSUNBZ0lDQWdIK0ZoRkJGQkVBZ0FpRUJEQUVMSUFvZ0FpQUNRZ0dEZkNJQklBSlVyWHdoQ2dzZ0FDQUJOd01BSUFBZ0NqY0RDQ0FGUWVBQWFpUUFDeUVBSUFBZ0FTQUNRb0NBZ0lBd0lBTWdCRUVDRU5nQklRSWdBQ0FCRUE4Z0FndW1BUUVFZnlBQVFRQTJBZ1FnQVZBRVFDQUFRWUNBZ0lCNE5nSUlJQUJCQUJCQkdrRUFEd3NDUUNBQlF2Ly8vLzhQV0FSQUlBQkJBUkJCRFFFZ0FDZ0NFQ0FCSUFHblp5SUNyWVkrQWdBZ0FFRWdJQUpyTmdJSVFRQVBDeUFBUVFJUVFRMEFJQUFvQWhBaUF5QUJweUlFSUFGQ0lJaW5JZ1ZuSWdKME5nSUFJQU1nQlNBQ2RDQUVRU0FnQW10MmNqWUNCQ0FBUWNBQUlBSnJOZ0lJUVFBUEN5QUFFRFZCSUF0L0FnSi9BWDRnQVVJZ2lLY2lBeUFCcHlJQ1FRQklja1VFUUNBQ1FZQ0FnSUI0Y2c4TElBTkJlRVlFUUNBQUlBQW9BaEFnQWhEQkFoQVlEd3NnQUNBQkVJTUVJZ0ZDZ0lDQWdIQ0RJZ1JDZ0lDQWdPQUFVUVJBUVFBUEN5QUVRb0NBZ0lDQWYxRUVRQ0FBS0FJUUlBRVFqUUlQQ3lBQUtBSVFJQUduRVB3REN3a0FJQUJCZnhESUF3dHFBUUovQWtBZ0FDZ0MyQUlpQTBVTkFDQUFLQUxnQWlJRUlBQW9BdHdDVGcwQUlBQW9BdWdDSUFGTERRQWdBQ2dDNUFJZ0FrWU5BQ0FESUFSQkEzUnFJZ01nQWpZQ0JDQURJQUUyQWdBZ0FDQUJOZ0xvQWlBQUlBUkJBV28yQXVBQ0lBQWdBallDNUFJTEN4QUFJQUFnQUNnQ0tDa0RDRUVCRUVrTEdRQWdBRUVBRUVFYUlBQkNnSUNBZ1BELy8vLy9BRGNDQkF1REFnSURmd0YrUW9DQWdJRGdBQ0VFSUFBb0FoUUVma0tBZ0lDQTRBQUZJQUFvQWdRaEFTQUFLQUlJSWdKRkJFQWdBQ2dDQUNnQ0VDSUNRUkJxSUFFZ0FpZ0NCQkVBQUNBQVFRQTJBZ1FnQUNnQ0FFRXZFQzBQQ3lBQUtBSU1JQUpLQkVBZ0FDZ0NBQ2dDRUNJRFFSQnFJQUVnQWlBQUtBSVFJZ0YwSUFGclFSRnFJQU1vQWdnUkFRQWlBVVVFUUNBQUtBSUVJUUVMSUFBZ0FUWUNCQXNnQVNBQUtBSVFJZ0lFZnlBQ0JTQUJJQUFvQWdocVFRQTZBQkFnQUNnQ0VBdEJIM1N0SUFFcEFnUkMvLy8vLzNlRGhDSUVOd0lFSUFFZ0JFS0FnSUNBZUlNZ0FEVUNDRUwvLy8vL0I0T0VOd0lFSUFCQkFEWUNCQ0FCclVLQWdJQ0FrSCtFQ3dzVUFRRitJQUFnQVJBb0lRSWdBQ0FCRUE4Z0FndExBUUovSUFGQ2dJQ0FnSEJhQkg4Z0FhY2lBeThCQmlJQ1FRMUdCRUJCQVE4TElBSkJNRVlFUUNBREtBSWdMUUFRRHdzZ0FDZ0NFQ2dDUkNBQ1FSaHNhaWdDRUVFQVJ3VkJBQXNMREFBZ0FFR0FBbW9nQVJBZEN5d0JBWDhqQUVFUWF5SURKQUFnQXlBQ05nSU1JQUJCM0FCcVFZQUJJQUVnQWhETEFob2dBMEVRYWlRQUMya0JBbjhDZnlBQUtBSUlJZ0lnQUNnQ0RFNEVRRUYvSUFBZ0FrRUJhaUFCRUxjQ0RRRWFJQUFvQWdnaEFnc2dBQ0FDUVFGcU5nSUlJQUFvQWdSQkVHb2hBd0pBSUFBb0FoQUVRQ0FESUFKQkFYUnFJQUU3QVFBTUFRc2dBaUFEYWlBQk9nQUFDMEVBQ3dzMUFDQUFJQUpCTUNBQ1FRQVFGQ0lDUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQVVJQU53TUFRWDhQQ3lBQUlBRWdBaENqQVFzTkFDQUFJQUVnQWtFQUVJb0RDeDhCQVg4Z0FDZ0NKQ0lCSUFFb0FnQkJBV28yQWdBZ0FDQUJRUUlRN3dVTGFRRURmd0pBSUFBaUFVRURjUVJBQTBBZ0FTMEFBRVVOQWlBQlFRRnFJZ0ZCQTNFTkFBc0xBMEFnQVNJQ1FRUnFJUUVnQWlnQ0FDSURRWDl6SUFOQmdZS0VDR3R4UVlDQmdvUjRjVVVOQUFzRFFDQUNJZ0ZCQVdvaEFpQUJMUUFBRFFBTEN5QUJJQUJyQ3g4QUlBQWdBU0FBSUFJUXFnRWlBaUFEUVlDQUFSRFFBUm9nQUNBQ0VCTUxUd0VCZndKL1FRQWdBQ2dDRENBQlJnMEFHaUFBS0FJQUlnSW9BZ0FnQUNnQ0VDQUJRUUowSUFJb0FnUVJBUUFoQWlBQkJFQkJmeUFDUlEwQkdnc2dBQ0FCTmdJTUlBQWdBallDRUVFQUN3c29BUUYvSUFKQ0lJaW5RWFZQQkVBZ0FxY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBRWdBaEJ1QzdJRUFRaC9Jd0JCSUdzaUJ5UUFJQUVnQWlBQktBSU1JQUlvQWd4SklnWWJJZ2dvQWdRZ0FpQUJJQVliSWdrb0FnUnpJUW9DUUFKQUlBZ29BZ3dpQWtVRVFBSkFJQWtvQWdnaUFVSC8vLy8vQjBjRVFDQUlLQUlJSWdKQi8vLy8vd2RIRFFFTElBQVFOVUVBSVFJTUF3c2dBVUgrLy8vL0IwY2dBa0grLy8vL0IwZHhSUVJBQWtBZ0FVSCsvLy8vQjBZRVFDQUNRWUNBZ0lCNFJnMEJEQVFMSUFGQmdJQ0FnSGhISUFKQi92Ly8vd2RIY2cwREN5QUFFRFZCQVNFQ0RBTUxJQUFnQ2hDSkFVRUFJUUlNQWdzZ0NTZ0NEQ0lHSVFVZ0FpRUJJQVJCQjNGQkJrWUVRQ0FDSUFOQklXcEJCWFlpQlNBQ0lBVklHeUVCSUFZZ0JTQUZJQVpLR3lFRkN5QUlLQUlRSUFKQkFuUnFJQUZCQW5ScklRc2dDU2dDRUNBR1FRSjBhaUFGUVFKMGF5RU1BbjhDUUFKQUFrQWdBVUhrQUU4RVFFRUFJUVlnQUNnQ0FDQUFJQXdnQlNBTElBRWdBQ0FKUmlJQlFRSnlJQUVnQUNBSVJoc1Fud1lOQVF3REN3Si9Ba0FnQUNBSlJnMEFRUUFoQmlBQUlBaEdEUUFnQUF3QkN5QUFLQUlBSVFJZ0IwSUFOd0lZSUFkQ2dJQ0FnSUNBZ0lDQWZ6Y0NFQ0FISUFJMkFnd2dBQ0VHSUFkQkRHb0xJZ0lnQVNBRmFoQkJSUTBCSUFJaEFBc2dBQkExUVNBTUFnc2dBaWdDRUNBTUlBVWdDeUFCRUo0R0lBSWhBQXNnQUNBS05nSUVJQUFnQ0NnQ0NDQUpLQUlJYWpZQ0NDQUFJQU1nQkJDekFnc2hBaUFBSUFkQkRHcEhEUUVnQmlBSFFReHFFS0FHREFFTElBQWdDaENNQVVFQUlRSUxJQWRCSUdva0FDQUNDMGdBSUFBZ0FVY0VRQ0FBSUFFb0Fnd1FRUVJBSUFBUU5VRWdEd3NnQUNBQktBSUVOZ0lFSUFBZ0FTZ0NDRFlDQ0NBQUtBSVFJQUVvQWhBZ0FTZ0NERUVDZEJBZkdndEJBQXNSQUNBQUlBRWdBaUFEUVlDQUFSRFFBUXNOQUNBQUlBRWdBa0VHRU00Q0N3b0FJQUFnQVVFQkVFa0xIUUFnQUNBQktRTVFFQThnQUNBQktRTVlFQThnQUNBQktRTUlFQThMcGdFQkEzOGdBQ2dDRUNJREtBTFVBU0FCcDBFQUlBRkMvLy8vLzI5V0d5SUVRWUdBM1BGNWJFSC8vNk9PQm1zaUJVRWdJQU1vQXNnQmEzWkJBblJxSVFNQ1FBSkFBMEFnQXlnQ0FDSURCRUFDUUNBREtBSVVJQVZIRFFBZ0F5Z0NMQ0FFUncwQUlBTW9BaUJGRFFNTElBTkJLR29oQXd3QkN3c2dBQ0FFUVFJUXhRUWlBdzBCUW9DQWdJRGdBQThMSUFNZ0F5Z0NBRUVCYWpZQ0FBc2dBQ0FESUFJUTd3VUxKZ0VCZndKQUlBQW9BaEJCZzM5SERRQWdBQ2dDSUNBQlJ3MEFJQUFvQWlSRklRSUxJQUlMT0FFQmZ3SkFBa0FnQVVLQWdJQ0FjRlFOQUNBQnB5SURMd0VHSUFKSERRQWdBeWdDSUNJRERRRUxJQUFnQWhDR0EwRUFJUU1MSUFNTGxRVUNBMzhCZmdKQUFrQUNRQUpBQWtBQ1FBTkFJQUlvQWhBaUJFRXdhaUVGSUFRZ0JDZ0NHQ0FEY1VGL2MwRUNkR29vQWdBaEJBTkFJQVJGRFFRZ0F5QUZJQVJCQVd0QkEzUWlCbW9pQkNnQ0JFY0VRQ0FFS0FJQVFmLy8veDl4SVFRTUFRc0xJQUlvQWhRZ0Jtb2hCU0FFS0FJQUlRWWdBVVVOQVNBQlFvQ0FnSUF3TndNWUlBRkNnSUNBZ0RBM0F4QWdBVUtBZ0lDQU1EY0RDQ0FCSUFaQkduWkJCM0VpQmpZQ0FBSkFBa0FDUUFKQUlBUW9BZ0JCSG5aQkFXc09Bd0FCQWdNTElBRWdCa0VRY2pZQ0FDQUZLQUlBSWdBRVFDQUFJQUFvQWdCQkFXbzJBZ0FnQVNBQXJVS0FnSUNBY0lRM0F4QUxJQVVvQWdRaUFFVU5DU0FBSUFBb0FnQkJBV28yQWdBZ0FTQUFyVUtBZ0lDQWNJUTNBeGhCQVE4TElBVW9BZ0FvQWhBcEF3QWlCMEtBZ0lDQWNJTkNnSUNBZ01BQVVRMEVJQWRDSUlpblFYVlBCRUFnQjZjaUFDQUFLQUlBUVFGcU5nSUFDeUFCSUFjM0F3Z01DQXNnQUNBQ0lBTWdCU0FFRU1nQ1JRMEJEQVlMQ3lBRktRTUFJZ2RDSUlpblFYVlBCRUFnQjZjaUFDQUFLQUlBUVFGcU5nSUFDeUFCSUFjM0F3Z01CUXRCQVNFRUlBWkJnSUNBZ0h4eFFZQ0FnSUI0UncwQ0lBVW9BZ0FvQWhBMUFnUkNJSVpDZ0lDQWdNQUFVZzBDQ3lBQUlBTVEyUUVNQWd0QkFDRUVJQUl0QUFVaUJVRUVjVVVOQUNBRlFRaHhCRUFnQTBFQVRnMEJJQU5CLy8vLy93ZHhJZ01nQWlnQ0tDSUZTU0VFSUFGRklBTWdCVTl5RFFFZ0FVS0FnSUNBTURjREdDQUJRb0NBZ0lBd053TVFJQUZCQnpZQ0FDQUJJQUFnQXExQ2dJQ0FnSENFSUFNUXNBRTNBd2dNQXdzZ0FDZ0NFQ2dDUkNBQ0x3RUdRUmhzYWlnQ0ZDSUZSUTBBSUFVb0FnQWlCVVVOQUNBQUlBRWdBcTFDZ0lDQWdIQ0VJQU1nQlJFWEFDRUVDeUFFRHd0QmZ3OExRUUVMb1FRQkFuOENRQUpBSUFGQ2dJQ0FnSEJVSUFKQy8vLy8vdzlXY2cwQUlBS25JZ1FnQWFjaUF5Z0NLRThOQUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBeThCQmtFQ2F3NGVBQXNMQ3dzTEFBc0xDd3NMQ3dzTEN3c0xDd0lCQWdNRUJRWUhDQWtLQ3dzZ0F5Z0NKQ0FFUVFOMGFpa0RBQ0lCUWlDSXAwRjFTUTBMSUFHbklnQWdBQ2dDQUVFQmFqWUNBQ0FCRHdzZ0F5Z0NKQ0FFYWpBQUFFTC8vLy8vRDRNUEN5QURLQUlrSUFScU1RQUFEd3NnQXlnQ0pDQUVRUUYwYWpJQkFFTC8vLy8vRDRNUEN5QURLQUlrSUFSQkFYUnFNd0VBRHdzZ0F5Z0NKQ0FFUVFKMGFqVUNBQThMSUFNb0FpUWdCRUVDZEdvb0FnQWlBRUVBVGdSQUlBQ3REd3RDZ0lDQWdNQitJQUM0dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJEd3NnQUNBREtBSWtJQVJCQTNScUtRTUFFSWNDRHdzZ0FDQURLQUlrSUFSQkEzUnFLUU1BRVBzRER3dENnSUNBZ01CK0lBTW9BaVFnQkVFQ2RHb3FBZ0M3dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJEd3RDZ0lDQWdNQitJQU1vQWlRZ0JFRURkR29wQXdBaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHdzhMSUFBZ0FoQXhJUU1nQUNBQ0VBOGdBMFVFUUVLQWdJQ0E0QUFQQ3lBQUlBRWdBeUFCUVFBUUZDRUJJQUFnQXhBVEN5QUJDeW9CQVg4akFFRVFheUlFSkFBZ0JDQUROZ0lNSUFBZ0FTQUNJQU1ReXdJaEFDQUVRUkJxSkFBZ0FBdU1BUUVDZnlBQktBSjhJZ1JCZ0lBRVRnUkFJQUJCalRwQkFCQkdRWDhQQzBGL0lRTWdBQ0FCUWZRQWFrRVFJQUZCK0FCcUlBUkJBV29RZUFSL1FYOEZJQUVnQVNnQ2ZDSURRUUZxTmdKOElBRW9BblFnQTBFRWRHb2lBMElBTndJQUlBTkNBRGNDQ0NBRElBQWdBaEFZTmdJQUlBTWdBeWdDREVHQS8vLy9CM0kyQWd3Z0FTZ0NmRUVCYXdzTERRQWdBQ0FCSUFKQkFSRE9BZ3VyQWdFRWZ3SkFJQUlnQTA4TkFDQURJQUpySVFVZ0FVRVFhaUVFSUFFdEFBZEJnQUZ4QkVCQkFDRURJQVZCQUNBRlFRQktHeUVHSUFRZ0FrRUJkR29oQVVFQUlRSURRQ0FDSUFaR1JRUkFJQU1nQVNBQ1FRRjBhaThCQUhJaEF5QUNRUUZxSVFJTUFRc0xBa0FnQUNnQ0NDQUZhaUlDSUFBb0Fnd2lCMG9FUUVGL0lRUWdBQ0FDSUFNUXR3SkZEUUVNQXdzZ0FDZ0NFQ0FEUVlBQ1NISU5BRUYvSVFRZ0FDQUhFUFVERFFJTEFrQWdBQ2dDRUVVRVFFRUFJUUlEUUNBQ0lBWkdEUUlnQUNnQ0JDQUFLQUlJSUFKcWFpQUJJQUpCQVhScUxRQUFPZ0FRSUFKQkFXb2hBZ3dBQ3dBTElBQW9BZ1FnQUNnQ0NFRUJkR3BCRUdvZ0FTQUZRUUYwRUI4YUN5QUFJQUFvQWdnZ0JXbzJBZ2hCQUE4TElBQWdBaUFFYWlBRkVJZ0NJUVFMSUFRTFJ3RUJmeUFCUWlDSXAwRjFUd1JBSUFHbklnTWdBeWdDQUVFQmFqWUNBQXNnQWtJZ2lLZEJkVThFUUNBQ3B5SURJQU1vQWdCQkFXbzJBZ0FMSUFBZ0FTQUNRUUVRdkFFTEZ3RUJmMEVJRUxFQklnRUVRQ0FCSUFBM0F3QUxJQUVMR1FBZ0FRUkFJQUFnQVVFUWE2MUNnSUNBZ0pCL2hCQVBDd3VDQXdJRWZ3SitBa0FnQUNrRGNDSUZVRVVnQlNBQUtRTjRJQUFvQWdRaUFTQUFLQUlzSWdKcnJId2lCbGR4UlFSQUl3QkJFR3NpQWlRQVFYOGhBUUpBQW44Z0FDQUFLQUpJSWdOQkFXc2dBM0kyQWtnZ0FDZ0NGQ0FBS0FJY1J3UkFJQUJCQUVFQUlBQW9BaVFSQVFBYUN5QUFRUUEyQWh3Z0FFSUFOd01RSUFBb0FnQWlBMEVFY1FSQUlBQWdBMEVnY2pZQ0FFRi9EQUVMSUFBZ0FDZ0NMQ0FBS0FJd2FpSUVOZ0lJSUFBZ0JEWUNCQ0FEUVJ0MFFSOTFDdzBBSUFBZ0FrRVBha0VCSUFBb0FpQVJBUUJCQVVjTkFDQUNMUUFQSVFFTElBSkJFR29rQUNBQklnTkJBRTROQVNBQUtBSUVJUUVnQUNnQ0xDRUNDeUFBUW44M0EzQWdBQ0FCTmdKb0lBQWdCaUFDSUFGcnJIdzNBM2hCZnc4TElBWkNBWHdoQmlBQUtBSUVJUUVnQUNnQ0NDRUNBa0FnQUNrRGNDSUZVQTBBSUFVZ0JuMGlCU0FDSUFGcnJGa05BQ0FCSUFXbmFpRUNDeUFBSUFJMkFtZ2dBQ0FHSUFBb0Fpd2lBQ0FCYTZ4OE53TjRJQUFnQVU4RVFDQUJRUUZySUFNNkFBQUxJQU1MQ1FBZ0FFRUJFTFlCQzJNQkFYOGdBa0lnaUtkQmRVOEVRQ0FDcHlJRklBVW9BZ0JCQVdvMkFnQUxBa0FnQUNBQklBSVFpd1VpQlEwQUFrQWdBU2dDQUNJQVFRQklCRUFnQUNBRWFpSUFRUUFnQUVFQVNoc2hBd3dCQ3lBQUlBTk1EUUVMSUFFZ0F6WUNBQXNnQlF2UkFRRUdmeUFBUVFGcUlRVUNRQUpBSUFBdEFBQWlBOEFpQjBFQVRnUkFJQVVoQVF3QkMwRi9JUVFnQjBGQWEwSC9BWEVpQTBFOVN3MEJJQU5CQW5SQjVKOEVhaWdDQUNJR0lBRk9EUUVnQmtFQmF5RUlJQUFnQm1wQkFXb2hBU0FISUFaQndwOEVhaTBBQUhFaEEwRUFJUUFEUUNBQUlBWkhCRUFnQlN3QUFDSUVRYjkvU2dSQVFYOFBCU0FFUVQ5eElBTkJCblJ5SVFNZ0FFRUJhaUVBSUFWQkFXb2hCUXdDQ3dBTEMwRi9JUVFnQXlBSVFRSjBRZENmQkdvb0FnQkpEUUVMSUFJZ0FUWUNBQ0FESVFRTElBUUxMUUFnQVVLQWdJQ0FZSU5DZ0lDQWdDQlJCRUFnQUVHNzBRQkJBQkFWUW9DQWdJRGdBQThMSUFBZ0FSQW9DMEVCQVg4Z0FRUkFBMEFnQWlBRFJrVUVRQ0FBSUFFZ0EwRURkR29vQWdRUUV5QURRUUZxSVFNTUFRc0xJQUFvQWhBaUFFRVFhaUFCSUFBb0FnUVJBQUFMQ3hnQUlBQXRBQUJCSUhGRkJFQWdBU0FDSUFBUXVnUWFDd3NMQUNBQUlBRkJBQkRtQlF1dUFnQUNRQUpBQWtBQ1FDQUNRUU5NQkVBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FVSFlBR3NPQ1FBQkFnTUVCUVlIQ0FvTElBQWdBa0U3YTBIL0FYRVFFUThMSUFBZ0FrRTNhMEgvQVhFUUVROExJQUFnQWtFemEwSC9BWEVRRVE4TElBQWdBa0V2YTBIL0FYRVFFUThMSUFBZ0FrRXJhMEgvQVhFUUVROExJQUFnQWtFbmEwSC9BWEVRRVE4TElBQWdBa0VqYTBIL0FYRVFFUThMSUFBZ0FrRWZhMEgvQVhFUUVROExJQUFnQWtFYmEwSC9BWEVRRVE4TElBSkIvd0ZMRFFFQ1FBSkFBa0FnQVVIWUFHc09Bd0FCQWdRTElBQkJ3Z0VRRVF3RkN5QUFRY01CRUJFTUJBc2dBRUhFQVJBUkRBTUxJQUZCSWtZTkFRc2dBQ0FCUWY4QmNSQVJJQUFnQWtILy93TnhFQ29QQ3lBQUlBSkJFbXRCL3dGeEVCRVBDeUFBSUFKQi93RnhFQkVMSVFBZ0FTQUNSZ1JBSUFFUUd3OExJQUFnQVVFRWE2MUNnSUNBZ1BCK2hCQVBDeXdCQVg4Z0FDZ0NFQ0lDUVJCcUlBRWdBaWdDQUJFREFDSUNCRUFnQWtFQUlBRVFLdzhMSUFBUWZDQUNDeHdCQVg4Z0FDQUJFRGdFZjBFQUJTQUFRWnZNQUVFQUVCVkJmd3NMUXdFRGZ3SkFJQUpGRFFBRFFDQUFMUUFBSWdRZ0FTMEFBQ0lGUmdSQUlBRkJBV29oQVNBQVFRRnFJUUFnQWtFQmF5SUNEUUVNQWdzTElBUWdCV3NoQXdzZ0F3c05BQ0FBSUFFZ0FSQS9FSk1DQzIwQkFYOGpBRUdBQW1zaUJTUUFJQVJCZ01BRWNTQUNJQU5NY2tVRVFDQUZJQUZCL3dGeElBSWdBMnNpQTBHQUFpQURRWUFDU1NJQkd4QXJHaUFCUlFSQUEwQWdBQ0FGUVlBQ0VGc2dBMEdBQW1zaUEwSC9BVXNOQUFzTElBQWdCU0FERUZzTElBVkJnQUpxSkFBTERBQWdBRUdBQW1vZ0FSQVJDNzRCQWdGK0FYOENRQUpBSUFGQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFBb0FpZ2dBa0VEZEdvcEF3QWlBMElnaUtkQmRFc05BUXdDQ3lBQUlBRkJPeUFCUVFBUUZDSURRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBdzhMSUFOQy8vLy8vMjlXRFFFZ0FDQURFQThnQUNBQkVJQURJZ1JGQkVCQ2dJQ0FnT0FBRHdzZ0JDZ0NLQ0FDUVFOMGFpa0RBQ0lEUWlDSXAwRjFTUTBCQ3lBRHB5SUVJQVFvQWdCQkFXbzJBZ0FMSUFBZ0F5QUNFRWtoQVNBQUlBTVFEeUFCQzNVQkFYNGdBQ0FCSUFSK0lBSWdBMzU4SUFOQ0lJZ2lBaUFCUWlDSUlnUitmQ0FEUXYvLy8vOFBneUlESUFGQy8vLy8vdytESWdGK0lnVkNJSWdnQXlBRWZud2lBMElnaUh3Z0FTQUNmaUFEUXYvLy8vOFBnM3dpQVVJZ2lIdzNBd2dnQUNBRlF2Ly8vLzhQZ3lBQlFpQ0doRGNEQUF0UUFRRitBa0FnQTBIQUFIRUVRQ0FCSUFOQlFHcXRoaUVDUWdBaEFRd0JDeUFEUlEwQUlBSWdBNjBpQklZZ0FVSEFBQ0FEYTYySWhDRUNJQUVnQklZaEFRc2dBQ0FCTndNQUlBQWdBamNEQ0F0VkFRTi9JQUVnQWtFRmRTSUVTd1JBSUFBZ0JFRUNkR29vQWdBaEF3c2dBa0VmY1NJQ0JIOGdBU0FFUVFGcUlnUkxCSDhnQUNBRVFRSjBhaWdDQUFWQkFBdEJBWFFnQWtFZmMzUWdBeUFDZG5JRklBTUxDMlFBQWtBQ1FDQUJRUUJJRFFBZ0FDZ0NyQUlnQVV3TkFDQUFLQUtrQWlBQlFSUnNhaUlBSUFBb0FnQWdBbW9pQURZQ0FDQUFRUUJJRFFFZ0FBOExRWVVwUWE3OEFFSElxQUZCbE5VQUVBQUFDMEdtamdGQnJ2d0FRY3VvQVVHVTFRQVFBQUFMWUFBZ0FDQUJJQUpDZ0lDQWdBaDhRdi8vLy84UFdBUitJQUpDLy8vLy93K0RCVUtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xJQU5CaDRBQkVMMEJDd3dBSUFCQmh2c0FRUUFRRlFzTEFDQUFJQUZCQVJEQkJRdlNFQUlNZndGK0l3QkJFR3NpQ2lRQUFrQUNRQ0FCUXYvLy8vOXZXQVJBSUFBUUpBd0JDeUFHUVlBd2NTSU9SU0FHSUFaQkNIWWlFSEVnRUVGL2MzSkJCM0VpRVVFSFJuRWhFaUFHUVlEQUFIRWhEQ0FDUWYvLy8vOEhjU0VOSUFHbklRa0NRQUpBQWtBQ1FBSkFBMEFnQ1NnQ0VDSUhRVEJxSVFnZ0J5QUhLQUlZSUFKeFFYOXpRUUowYWlnQ0FDRUhBa0FEUUNBSFJRMEJJQUlnQ0NBSFFRRnJRUU4wSWd0cUlnY29BZ1JIQkVBZ0J5Z0NBRUgvLy84ZmNTRUhEQUVMQ3lBSktBSVVJQXRxSVFnZ0NpQUhOZ0lNSUF4RklBY29BZ0FpQzBHQWdJQ0FBbkZGY2tVRVFDQURRaUNJcDBGMVR3UkFJQU9uSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dBQ0FLUVFocUlBTkJBQkRDQWcwSUFuNGdDaWdDQ0NJSFFRQk9CRUFnQjYwTUFRdENnSUNBZ01CK0lBZTR2U0lEUW9DQWdJREFnWUQ4L3dCOUlBTkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN5RURJQWtvQWhBaUIwRXdhaUVJSUFjZ0J5Z0NHQ0FDY1VGL2MwRUNkR29vQWdBaEJ3SkFBMEFnQndSQUlBZ2dCMEVCYTBFRGRDSUxhaUlIS0FJRUlBSkdEUUlnQnlnQ0FFSC8vLzhmY1NFSERBRUxDMEg0Z3dGQnJ2d0FRZGpHQUVIUEhCQUFBQXNnQ1NnQ0ZDQUxhaUVJSUFvZ0J6WUNEQ0FIS0FJQUlRc0xJQXRCR25ZaUR5QUdFSk1EUlEwR0lBOUJNSEVpRDBFd1JnUkFJQUFnQ1NBQ0lBZ2dCeERJQWtVTkFnd0lDeUFHUVlEMEFIRkZEUVVnRGdSQUlBU25JZzFCQUNBQUlBUVFPQnNoQWlBRnB5SU9RUUFnQUNBRkVEZ2JJUXdDUUNBTFFZQ0FnSUI4Y1VHQWdJQ0FCRWNFUUVGL0lRY2dBQ0FKSUFwQkRHb1ExQUVOQ3dKQUlBb29BZ3dvQWdCQmdJQ0FnSHh4UVlDQWdJQjRSZ1JBSUFBb0FoQWdDQ2dDQUJEckFRd0JDeUFBSUFncEF3QVFEd3NnQ2lnQ0RDSUhJQWNvQWdCQi8vLy92d0Z4UVlDQWdJQUVjallDQUNBSVFnQTNBd0FNQVFzZ0MwR0FnSUFnY1EwQUlBWkJnQkJ4QkVBZ0FpQUlLQUlBUncwSkN5QUdRWUFnY1VVTkFDQU1JQWdvQWdSSERRZ0xJQVpCZ0JCeEJFQWdDQ2dDQUNJSEJFQWdBQ0FIclVLQWdJQ0FjSVFRRHdzZ0FrVWdCRUlnaUtkQmRVbHlSUVJBSUEwZ0RTZ0NBRUVCYWpZQ0FBc2dDQ0FDTmdJQUN5QUdRWUFnY1VVTkJpQUlLQUlFSWdJRVFDQUFJQUt0UW9DQWdJQndoQkFQQ3lBTVJTQUZRaUNJcDBGMVNYSkZCRUFnRGlBT0tBSUFRUUZxTmdJQUN5QUlJQXcyQWdRTUJnc2dEMEVnUmcwRUlBOUJFRVlFUUVGL0lRY2dBQ0FKSUFwQkRHb1ExQUVOQ1NBSUtBSUFJZ0lFUUNBQUlBS3RRb0NBZ0lCd2hCQVBDeUFJS0FJRUlnSUVRQ0FBSUFLdFFvQ0FnSUJ3aEJBUEN5QUtLQUlNSWdJZ0FpZ0NBRUgvLy8rL0EzRTJBZ0FnQ0VLQWdJQ0FNRGNEQUNBS0tBSU1LQUlBSVFzTUJRc2dERVVnQzBHQWdJRGdBSEZ5RFFSQkFTRUhJQUFnQXlBSUtRTUFFRkpGRFFZTUNBc2dDa0VBTmdJTUlBa3RBQVZCQ0hGRkRRSWdDUzhCQmlJSFFRSkhEUUVnQWtFQVRnMENJQTBnQ1NnQ0tFOE5BaUFTUlFSQUlBQWdDUkNTQTBVTkFRd0hDd3RCQVNFSElBeEZEUVlnQ1NnQ0pDQU5RUU4wYWlFQ0lBTkNJSWluUVhWUEJFQWdBNmNpQmlBR0tBSUFRUUZxTmdJQUN5QUFJQUlnQXhBZ0RBWUxJQWRCRld0Qi8vOERjVUVLU3cwQUFrQUNRQ0FDUVFCT0JFQWdBQ0FDRU0wRklnRkNnSUNBZ0hDREloTkNnSUNBZ0RCUkRRTkJmeUVISUJOQ2dJQ0FnT0FBVVEwSUlBQWdBUkRNQlNJQ1FRQklCRUFnQUNBQkVBOE1DUXNnQWtVRVFDQUFJQUVRRHlBQUlBWkJ2aDRRYnlFSERBa0xRUUFoQndKQUFrQUNRQUpBQWtCQkJ5QUJRaUNJcHlJQ0lBSkJCMnRCYmtrYklnSkJDMm9PQXdNQkFnQUxJQUpCQjBjRVFDQUNEUVFnQVVLQWdJQ0FDSU5DSDRpbklRY01CQXNnQVVLQWdJQ0F3SUdBL1A4QWZFSS9pS2NoQnd3REN5QUJweUlDS0FJSVJRMENJQUlvQWd4QmdJQ0FnSGhISVFjTUFnc2dBYWNvQWdnaEJ3d0JDeUFCcHlnQ0NDRUhDeUFBSUFFUUR5QUhSUTBCSUFBZ0JrSGZIaEJ2SVFjTUNBc2dEU0FKS0FJZ0tBSVVJQWRCNWFZQmFpMEFBSFpKRFFFTElBQWdCa0g5SGhCdklRY01CZ3NnRGtVZ0VVRUhSbkZGQkVBZ0FDQUdRYmM0RUc4aEJ3d0dDMEVCSVFjZ0RFVU5CU0FEUWlDSXAwRjFUd1JBSUFPbklnSWdBaWdDQUVFQmFqWUNBQXNnQUNBQklBMnRJQU1nQmhEWEFTRUhEQVVMSUFBZ0NTQUNJQU1nQkNBRklBWVFnUVFoQnd3RUN5QUxRWUNBZ0lCOGNVR0FnSUNBZUVZRVFDQU1CRUFnQ1M4QkJrRUxSZ1JBSUFBZ0F5QUlLQUlBS0FJUUtRTUFFRkpGRFFRTElBZ29BZ0FvQWhBaEFpQURRaUNJcDBGMVR3UkFJQU9uSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dBQ0FDSUFNUUlBc2dCa0dDQkhGQmdBUkhEUUZCZnlFSElBQWdDU0FLUVF4cUVOUUJEUVFnQ0NnQ0FDSUhLQUlRS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQWlBQ0tBSUFRUUZxTmdJQUlBZ29BZ0FoQndzZ0FDZ0NFQ0FIRU9zQklBZ2dBVGNEQUNBS0tBSU1JZ0lnQWlnQ0FFSC8vLysvQTNFMkFnQU1BUXNnQzBHQWdJQ0FBbkVFUUVFQklRSWdEQVJBSUFOQ0lJaW5RWFZQQkVBZ0E2Y2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQUlBa2dBeUFHRU1zRklRSUxJQVpCZ2dSeFFZQUVSZ1JBSUFvZ0NTZ0NFQ0lHUVRCcU5nSU1RWDhoQnlBQUlBa2dDa0VNYWlBR0tBSXdRUnAyUVQxeEVKRUREUVVMSUFJaEJ3d0VDeUFNQkVBZ0FDQUlLUU1BRUE4Z0EwSWdpS2RCZFU4RVFDQURweUlDSUFJb0FnQkJBV28yQWdBTElBZ2dBemNEQUFzZ0JrR0FCSEZGRFFCQmZ5RUhJQUFnQ1NBS1FReHFJQW9vQWd3b0FnQkJHblpCUFhFZ0JrRUNjWElRa1FNTkF3dEJmMEVCSUFBZ0NTQUtRUXhxSUJCQkJYRWlBRUYvY3lBS0tBSU1LQUlBUVJwMmNTQUFJQVp4Y2hDUkF4c2hCd3dDQ3lBQUlBWkI0ZWtBRUc4aEJ3d0JDMEYvSVFjTElBcEJFR29rQUNBSEMvOEJBZ0ovQVh3akFFRVFheUlFSkFBQ1FDQUNRaUNJcHlJRFFRSk5CRUFnQVNBQ3A3YzVBd0JCQUNFQURBRUxJQU5CQjJ0QmJVMEVRQ0FCSUFKQ2dJQ0FnTUNCZ1B6L0FIdzNBd0JCQUNFQURBRUxBbjhnQUNBQ0VJMEJJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRVFBQUFBQUFBRDRmeUVGUVg4TUFRc0NmQUpBQWtCQkJ5QUNRaUNJcHlJRElBTkJCMnRCYmtrYklnTkJDbXBCQWs4RVFDQURRUWRHRFFJZ0F3MEJJQUtudHd3REN5QUNwMEVFYWlBRVFRaHFFTFVGSUFBZ0FoQVBJQVFyQXdnaEJVRUFEQU1MRUFFQUN5QUNRb0NBZ0lEQWdZRDgvd0I4dndzaEJVRUFDeUVBSUFFZ0JUa0RBQXNnQkVFUWFpUUFJQUFMWFFFQ2Z5TUFRUkJySWdNa0FBSkFJQUZCZ0lBQmNVVUVRQ0FCUVlDQUFuRkZEUUVnQUNnQ0VDZ0NqQUVpQVVVTkFTQUJMUUFvUVFGeFJRMEJDeUFEUVFBMkFnd2dBRUVFSUFKQkFCQ1NCRUYvSVFRTElBTkJFR29rQUNBRUM4WUpBZ1IvQlg0akFFSHdBR3NpQmlRQUlBUkMvLy8vLy8vLy8vLy9BSU1oQ1FKQUFrQWdBVkFpQlNBQ1F2Ly8vLy8vLy8vLy93Q0RJZ3BDZ0lDQWdJQ0F3UC8vQUgxQ2dJQ0FnSUNBd0lDQWYxUWdDbEFiUlFSQUlBTkNBRklnQ1VLQWdJQ0FnSURBLy84QWZTSUxRb0NBZ0lDQWdNQ0FnSDlXSUF0Q2dJQ0FnSUNBd0lDQWYxRWJEUUVMSUFVZ0NrS0FnSUNBZ0lEQS8vOEFWQ0FLUW9DQWdJQ0FnTUQvL3dCUkcwVUVRQ0FDUW9DQWdJQ0FnQ0NFSVFRZ0FTRUREQUlMSUFOUUlBbENnSUNBZ0lDQXdQLy9BRlFnQ1VLQWdJQ0FnSURBLy84QVVSdEZCRUFnQkVLQWdJQ0FnSUFnaENFRURBSUxJQUVnQ2tLQWdJQ0FnSURBLy84QWhZUlFCRUJDZ0lDQWdJQ0E0UC8vQUNBQ0lBRWdBNFVnQWlBRWhVS0FnSUNBZ0lDQWdJQi9oWVJRSWdVYklRUkNBQ0FCSUFVYklRTU1BZ3NnQXlBSlFvQ0FnSUNBZ01ELy93Q0ZoRkFOQVNBQklBcUVVQVJBSUFNZ0NZUkNBRklOQWlBQklBT0RJUU1nQWlBRWd5RUVEQUlMSUFNZ0NZUlFSUTBBSUFFaEF5QUNJUVFNQVFzZ0F5QUJJQUVnQTFRZ0NTQUtWaUFKSUFwUkd5SUlHeUVLSUFRZ0FpQUlHeUlMUXYvLy8vLy8veitESVFrZ0FpQUVJQWdiSWdKQ01JaW5RZi8vQVhFaEJ5QUxRakNJcDBILy93RnhJZ1ZGQkVBZ0JrSGdBR29nQ2lBSklBb2dDU0FKVUNJRkcza2dCVUVHZEsxOHB5SUZRUTlyRUdjZ0Jpa0RhQ0VKSUFZcEEyQWhDa0VRSUFWcklRVUxJQUVnQXlBSUd5RURJQUpDLy8vLy8vLy9QNE1oQkNBSFJRUkFJQVpCMEFCcUlBTWdCQ0FESUFRZ0JGQWlCeHQ1SUFkQkJuU3RmS2NpQjBFUGF4Qm5RUkFnQjJzaEJ5QUdLUU5ZSVFRZ0Jpa0RVQ0VEQ3lBRVFnT0dJQU5DUFlpRVFvQ0FnSUNBZ0lBRWhDRUJJQWxDQTRZZ0NrSTlpSVFoQkNBQ0lBdUZJUTBDZmlBRFFnT0dJZ0lnQlNBSFJnMEFHaUFGSUFkcklnZEIvd0JMQkVCQ0FDRUJRZ0VNQVFzZ0JrRkFheUFDSUFGQmdBRWdCMnNRWnlBR1FUQnFJQUlnQVNBSEVJNENJQVlwQXpnaEFTQUdLUU13SUFZcEEwQWdCaWtEU0lSQ0FGS3RoQXNoQ1NBRVFvQ0FnSUNBZ0lBRWhDRU1JQXBDQTRZaENnSkFJQTFDQUZNRVFFSUFJUU5DQUNFRUlBa2dDb1VnQVNBTWhZUlFEUUlnQ2lBSmZTRUNJQXdnQVgwZ0NTQUtWcTE5SWdSQy8vLy8vLy8vL3dOV0RRRWdCa0VnYWlBQ0lBUWdBaUFFSUFSUUlnY2JlU0FIUVFaMHJYeW5RUXhySWdjUVp5QUZJQWRySVFVZ0Jpa0RLQ0VFSUFZcEF5QWhBZ3dCQ3lBSklBcDhJZ0lnQ1ZTdElBRWdESHg4SWdSQ2dJQ0FnSUNBZ0FpRFVBMEFJQWxDQVlNZ0JFSS9oaUFDUWdHSWhJUWhBaUFGUVFGcUlRVWdCRUlCaUNFRUN5QUxRb0NBZ0lDQWdJQ0FnSCtESVFFZ0JVSC8vd0ZPQkVBZ0FVS0FnSUNBZ0lEQS8vOEFoQ0VFUWdBaEF3d0JDMEVBSVFjQ1FDQUZRUUJLQkVBZ0JTRUhEQUVMSUFaQkVHb2dBaUFFSUFWQi93QnFFR2NnQmlBQ0lBUkJBU0FGYXhDT0FpQUdLUU1BSUFZcEF4QWdCaWtER0lSQ0FGS3RoQ0VDSUFZcEF3Z2hCQXNnQXFkQkIzRWlCVUVFUzYwZ0JFSTloaUFDUWdPSWhDSUNmQ0lESUFKVXJTQUVRZ09JUXYvLy8vLy8veitESUFldFFqQ0doQ0FCaEh3aEJBSkFJQVZCQkVZRVFDQUVJQU5DQVlNaUFTQURmQ0lESUFGVXJYd2hCQXdCQ3lBRlJRMEJDd3NnQUNBRE53TUFJQUFnQkRjRENDQUdRZkFBYWlRQUM5MEJBUUovQWtBZ0FVS0FnSUNBY0ZvRVFDQUJweUVEQTBBQ1FDQURMUUFGUVFSeFJRMEFJQUFvQWhBb0FrUWdBeThCQmtFWWJHb29BaFFpQkVVTkFDQUVLQUlRSWdSRkRRQWdBeUFES0FJQVFRRnFOZ0lBSUFBZ0E2MUNnSUNBZ0hDRUlnRWdBaUFFRVJVQUlRSWdBQ0FCRUE4Z0FnOExJQU1nQXlnQ0FFRUJhallDQUNBQVFRQWdBeUFDRUV3aEJDQUFJQU90UW9DQWdJQndoQkFQSUFRTkFnSkFJQU12QVFaQkZXdEIvLzhEY1VFS1N3MEFJQUFnQWhDZUF5SUVSUTBBSUFSQkgzVVBDeUFES0FJUUtBSXNJZ01OQUFzTFFRQWhCQXNnQkF0TkFRSi9BbjhnQUNnQ0JDSURJQUpxSWdRZ0FDZ0NDRXNFZjBGL0lBQWdCQkRHQVEwQkdpQUFLQUlFQlNBREN5QUFLQUlBYWlBQklBSVFIeG9nQUNBQUtBSUVJQUpxTmdJRVFRQUxHZ3RFQVFGL0lBSkMvLy8vL3dkWUJFQWdBQ0FCSUFJUVRROExJQUFnQWhENEFpSURSUVJBUW9DQWdJRGdBQThMSUFBZ0FTQURJQUZCQUJBVUlRRWdBQ0FERUJNZ0FRdGpBUUYvSUFKQ0lJaW5RWFZQQkVBZ0FxY2lCaUFHS0FJQVFRRnFOZ0lBQ3dKQUlBQWdBU0FDRUpBRklnQU5BQ0FCS1FNQUlnSkNBRk1FUUNBQklBSWdCWHdpQWpjREFBc2dBaUFEV1FSQUlBUWlBeUFDV1EwQkN5QUJJQU0zQXdBTElBQUxYd0VEZnlNQVFTQnJJZ1VrQUNBQUtBSUFJUVlnQlVJQU53SVlJQVZDZ0lDQWdJQ0FnSUNBZnpjQ0VDQUZJQVkyQWd3Z0JVRU1haUlISUFJUXVnSWhCaUFBSUFFZ0J5QURJQVFReXdFaEFDQUhFQnNnQlVFZ2FpUUFJQUFnQm5JTEZnQWdBQ0FBS0FJb0lBRkJBM1JxS1FNQUlBRVFTUXNwQVFGL0lBSkNJSWluUVhWUEJFQWdBcWNpQXlBREtBSUFRUUZxTmdJQUN5QUFJQUVnQWhDWUFRdHdBUUYvSUFRZ0F5Z0NBRW9FZnlNQVFSQnJJZ1VrQUNBQUlBRW9BZ0FnQkNBREtBSUFRUU5zUVFKdElnQWdBQ0FFU0JzaUFDQUNiQ0FGUVF4cUVLZ0JJZ1FFZnlBRElBVW9BZ3dnQW00Z0FHbzJBZ0FnQVNBRU5nSUFRUUFGUVg4TElRQWdCVUVRYWlRQUlBQUZRUUFMQzM0Q0FuOEJmaU1BUVJCcklnTWtBQ0FBQW40Z0FVVUVRRUlBREFFTElBTWdBU0FCUVI5MUlnSnpJQUpySWdLdFFnQWdBbWNpQWtIUkFHb1FaeUFES1FNSVFvQ0FnSUNBZ01BQWhVR2VnQUVnQW11dFFqQ0dmQ0FCUVlDQWdJQjRjYTFDSUlhRUlRUWdBeWtEQUFzM0F3QWdBQ0FFTndNSUlBTkJFR29rQUF2ZEF3RUpmeUFCUVJCcUlRY0NRQUpBQW44Q1FBSkFJQUVvQWhBaUJDMEFFQVJBSUFBb0FoQWlDQ2dDMUFFZ0JDZ0NGQ0FDYWtHQmdOenhlV3dnQTJwQmdZRGM4WGxzSWd0QklDQUlLQUxJQVd0MlFRSjBhaUVHQWtBRFFDQUdLQUlBSWdWRkRRRUNRQUpBSUFVb0FoUWdDMGNOQUNBRktBSXNJQVFvQWl4SERRQkJBQ0VHSUFVb0FpQWdCQ2dDSUNJS1FRRnFSdzBBQTBBZ0JpQUtSd1JBSUFVZ0JrRURkQ0lKYWlJTUtBSTBJQVFnQ1dvaUNTZ0NORWNOQWlBR1FRRnFJUVlnQ1NnQ01DQU1LQUl3YzBHQWdJQWdTUTBCREFJTEN5QUZJQXBCQTNScUlnWW9BalFnQWtjTkFDQUdLQUl3UVJwMklBTkdEUUVMSUFWQktHb2hCZ3dCQ3dzZ0JTZ0NIQ0lDSUFRb0FoeEhCRUFnQUNBQktBSVVJQUpCQTNRUWlRSWlBa1VOQnlBQklBSTJBaFFnQUNnQ0VDRUlDeUFGSUFVb0FnQkJBV28yQWdBZ0J5QUZOZ0lBSUFnZ0JCQ1JBZ3dEQ3lBRUtBSUFRUUZHRFFFZ0FDQUVFTTRGSWdSRkRRVWdCRUVCT2dBUUlBQW9BaEFnQkJDVUF5QUFLQUlRSUFjb0FnQVFrUUlnQnlBRU5nSUFDeUFFS0FJQVFRRkhEUU1MUVFBZ0FDQUhJQUVnQWlBREVNTUVEUUVhSUFjb0FnQWhCUXNnQVNnQ0ZDQUZLQUlnUVFOMGFrRUlhd3NQQzBIOGpBRkJydndBUWN3K1FkY2FFQUFBQzBFQUM1RUJBZ04vQVg0Z0FDQUFLQUxzQVNJQlFRRnJOZ0xzQVNBQlFRRk1CSDlCQUNFQklBQkJrTTRBTmdMc0FRSkFJQUFvQWhBaUFpZ0NrQUVpQTBVTkFDQUNJQUlvQXBRQklBTVJBd0JGRFFBZ0FFRy85Z0JCQUJCR1FYOGhBU0FBS0FJUUtRT0FBU0lFUW9DQWdJQndWQTBBSUFTbklnQXZBUVpCQTBjTkFDQUFJQUF0QUFWQklISTZBQVVMSUFFRlFRQUxDeXdCQVg4Z0FDZ0NFQ0lCTFFDSUFVVUVRQ0FCUVFFNkFJZ0JJQUJCL2h4QkFCQkdJQUZCQURvQWlBRUxDNW9IQVFkL0l3QkI0QUJySWdRa0FDQUVJQUUyQWx3Q1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBMEFnQkNBQ1FRRnJJZ0ZCRkd4cUlRVURRQUpBSUFRZ0JDZ0NYQ0lEUVFScU5nSmNBa0FDUUFKQUFrQUNRQ0FES0FJQUlnY09DQUFCQWdNREF3UUlCUXNnQWtFRVRnMFFJQVFnQTBFSWFqWUNYQ0FES0FJRUlRVWdBQ2dDRUNFRElBUWdBa0VVYkdvaUFTQUFLQUlNTmdJTUlBRkJBRFlDQ0NBQlFnQTNBZ0FnQVNBRFFkY0FJQU1iTmdJUUlBSkJBV29oQWlBQklBVVFvUVpGRFFZTUNRc2dBa0VFVGcwT0lBUWdBMEVJYWpZQ1hDQURLQUlFSVFVZ0FDZ0NFQ0VESUFRZ0FrRVViR29pQVNBQUtBSU1OZ0lNSUFGQkFEWUNDQ0FCUWdBM0FnQWdBU0FEUWRjQUlBTWJOZ0lRSUFKQkFXb2hBaUFCSUFVUXBnWkZEUVVNQ0FzZ0FrRUVUZzBNSUFRZ0EwRUlhallDWENBREtBSUVJUVVnQUNnQ0VDRURJQVFnQWtFVWJHb2lBU0FBS0FJTU5nSU1JQUZCQURZQ0NDQUJRZ0EzQWdBZ0FTQURRZGNBSUFNYk5nSVFJQUpCQVdvaEFpQUJJQVVRclFORkRRUU1Cd3NnQWtFQlRBMEtJQUpCQkU4TkNTQUFLQUlNSVFZZ0JDQUNRUlJzYWlJRElBQW9BaEFpQ0VIWEFDQUlHellDRUNBRElBWTJBZ3dnQTBFQU5nSUlJQU5DQURjQ0FDQURJQU5CS0dzaUJpZ0NDQ0FHS0FJQUlBVW9BZ2dnQlNnQ0FDQUhRUU5yRU5zQ0RRVWdCQ0FDUVFKclFSUnNhaUlDS0FJTUlBWW9BZ2hCQUNBQ0tBSVFFUUVBR2lBRktBSU1JQVVvQWdoQkFDQUZLQUlRRVFFQUdpQUdJQU1vQWhBMkFoQWdCaUFES1FJSU53SUlJQVlnQXlrQ0FEY0NBQ0FCSVFJTUF3c2dBa0VBVEEwSElBVVEyZ0pGRFFFTUJRc0xDeEFCQUFzZ0FrRUJSdzBDQW44Z0FDQUVLQUlBSWdFUTJRSUVRQ0FFS0FJSUlRSkJmd3dCQ3lBQUtBSUlJQVFvQWdnaUFpQUJRUUowRUI4YUlBQWdBVFlDQUVFQUN5RUJJQVFvQWd3Z0FrRUFJQVFvQWhBUkFRQWFEQWtMSUFKQkFXb2hBZ3NnQWtFQUlBSkJBRW9iSVFKQkFDRUJBMEFnQVNBQ1JnUkFRWDhoQVF3SkJTQUVJQUZCRkd4cUlnQW9BZ3dnQUNnQ0NFRUFJQUFvQWhBUkFRQWFJQUZCQVdvaEFRd0JDd0FMQUF0Qm5JMEJRZVQ4QUVHbUNrR0ROaEFBQUF0QjFJd0JRZVQ4QUVHYkNrR0ROaEFBQUF0Qjk0QUJRZVQ4QUVHTUNrR0ROaEFBQUF0QjQ0c0JRZVQ4QUVHTENrR0ROaEFBQUF0Qjk0QUJRZVQ4QUVHQUNrR0ROaEFBQUF0Qjk0QUJRZVQ4QUVINUNVR0ROaEFBQUF0Qjk0QUJRZVQ4QUVIeUNVR0ROaEFBQUFzZ0JFSGdBR29rQUNBQkMya0JBbjhDZnlBQUtBSUFJZ05CQW1vaUJDQUFLQUlFU2dSQVFYOGdBQ0FFRU5rQ0RRRWFJQUFvQWdBaEF3c2dBQ0FEUVFGcU5nSUFJQUFvQWdnaUJDQURRUUowYWlBQk5nSUFJQUFnQUNnQ0FDSUFRUUZxTmdJQUlBUWdBRUVDZEdvZ0FqWUNBRUVBQ3d0MkFRRi9JQUFvQWhRRVFDQUFLQUlBSUFFUUQwRi9Ed3NDUUNBQlFvQ0FnSUJ3ZzBLQWdJQ0FrSDlSRFFBZ0FDZ0NBQ0FCRURjaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQUlBQVFnd05CZnc4TElBQWdBYWNpQWtFQUlBSW9BZ1JCLy8vLy93ZHhFRkVoQWlBQUtBSUFJQUVRRHlBQ0M3VUNBUWQvSXdCQkVHc2lCU1FBQWtBZ0FFRkFheWdDQUNJQlJRUkFEQUVMQWtBZ0FRSi9JQUVvQXNnQklnUWdBU2dDeEFFaUFrZ0VRQ0FCS0FMTUFTRURJQVFNQVFzZ0JFRUJhaUlESUFKQkEyeEJBbTBpQWlBQ0lBTklHeUlHUVFOMElRSWdBQ2dDQUNFREFrQWdBU2dDekFFaUJ5QUJRZEFCYWtZRVFDQURRUUFnQWlBRlFReHFFS2dCSWdORkRRTWdBeUFCS0FMTUFTQUJLQUxJQVVFRGRCQWZHZ3dCQ3lBRElBY2dBaUFGUVF4cUVLZ0JJZ05GRFFJTElBVW9BZ3doQWlBQklBTTJBc3dCSUFFZ0FrRURkaUFHYWpZQ3hBRWdBU2dDeUFFTFFRRnFOZ0xJQVNBRElBUkJBM1JxSWdJZ0FTZ0N2QUUyQWdBZ0FpQUJLQUxBQVRZQ0JDQUFRYlFCRUJBZ0FFRkFheWdDQUNBRVFmLy9BM0VRRnlBQklBUTJBcndCREFFTFFYOGhCQXNnQlVFUWFpUUFJQVFMb1FFQ0EzOEJmaU1BSVFZQ1FDQUNRb0NBZ0lCd1ZBMEFJQUtuSWdVdkFRWkJNRWNOQUNBRktBSWdJUVFMQW44Z0JpQUFLQUlRS0FKNFNRUkFJQUFRNlFGQkFBd0JDeUFFTFFBUkJFQWdBQkMyQWtFQURBRUxRUUFnQUNBRUtRTUlJZ0lnQXlBQ1FRQVFGQ0lIUW9DQWdJQndneUlDUW9DQWdJRGdBRkVOQUJvZ0FVS0FnSUNBTUNBSElBSkNnSUNBZ0NCUkd6Y0RBQ0FFQ3lFRklBWWtBQ0FGQ3hZQUlBQWdBU0FDSUFNZ0JDQUZJQUFwQXpBUThRRUxLUUVCZnlNQVFSQnJJZ0lrQUNBQ0lBQTJBZ3dnQWtFTWFpQUJFSk1FSVFBZ0FrRVFhaVFBSUFBTG5nSUNBMzhCZmlBQ0lBRXBBZ1FpQjZkQi8vLy8vd2R4SUFOSGNrVUVRQ0FCSUFFb0FnQkJBV28yQWdBZ0FhMUNnSUNBZ0pCL2hBOExJQUZCRUdvaEJTQUhRb0NBZ0lBSWcxQWdBeUFDYXlJRVFRQk1ja1VFUUNBRElBSWdBaUFEU0JzaEJrRUFJUU1nQWlFQkEwQWdBU0FHUmtVRVFDQUZJQUZCQVhScUx3RUFJQU55SVFNZ0FVRUJhaUVCREFFTEN5QURRZi8vQTNGQmdBSlBCRUFnQUNBRklBSkJBWFJxSUFRUTdnTVBDMEVBSVFFZ0FDQUVRUUFRNmdFaUFFVUVRRUtBZ0lDQTRBQVBDeUFBUVJCcUlRTURRQ0FCSUFSR1JRUkFJQUVnQTJvZ0JTQUJJQUpxUVFGMGFpMEFBRG9BQUNBQlFRRnFJUUVNQVFzTElBTWdCR3BCQURvQUFDQUFyVUtBZ0lDQWtIK0VEd3NnQUNBQ0lBVnFJQVFRaEFNTHVnRUJBbjhDUUFKQUlBSkMvLy8vL3dkWUJFQWdBQ0FCSUFLblFZQ0FnSUI0Y2hCeElnUkJBRXdOQVNBQUlBRWdBaEJOSWdKQ2dJQ0FnSENEUW9DQWdJRGdBRklOQWtGL0lRUU1BZ3NnQUNBQ0VQZ0NJZ1ZGQkVCQmZ5RUVEQUVMQWtBZ0FDQUJJQVVRY1NJRVFRQk1CRUJDZ0lDQWdEQWhBZ3dCQ3lBQUlBRWdCU0FCUVFBUUZDSUNRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRQkJmeUVFQ3lBQUlBVVFFd3dCQzBLQWdJQ0FNQ0VDQ3lBRElBSTNBd0FnQkF0S0FRSi9JQUpDLy8vLy93ZFlCRUFnQUNBQklBSWdBMEdBZ0FFUTF3RVBDeUFBSUFJUStBSWlCRVVFUUNBQUlBTVFEMEYvRHdzZ0FDQUJJQVFnQXhCRklRVWdBQ0FFRUJNZ0JRdUlBUUVCZjBGL0lRSWdBQ2dDRkFSL1FYOEZJQUZDZ0lDQWdIQ0RRb0NBZ0lDUWYxSUVRQ0FBS0FJQUlBRVFLQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUJDREEwRi9Ed3NnQUNBQnB5SUNRUUFnQWlnQ0JFSC8vLy8vQjNFUVVTRUNJQUFvQWdBZ0FSQVBJQUlQQ3lBQUlBR25JZ0JCQUNBQUtBSUVRZi8vLy84SGNSQlJDd3NOQUNBQUlBRWdBUkEvRUlnQ0N4c0FJQUJCQUJCQkdpQUFJQUUyQWdRZ0FFR0FnSUNBZURZQ0NBc1pBQ0FBSUFBb0FoQWlBQ2tEZ0FFUUR5QUFJQUUzQTRBQkM0UUNBUUYvQWtBZ0FDZ0NDQ0lDSUFBb0FneE9EUUFnQUNnQ0VBUkFJQUFnQWtFQmFqWUNDQ0FBS0FJRUlBSkJBWFJxSUFFN0FSQkJBQThMSUFGQi93RkxEUUFnQUNBQ1FRRnFOZ0lJSUFBb0FnUWdBbW9nQVRvQUVFRUFEd3NDZnlBQUtBSUlJZ0lnQUNnQ0RFNEVRRUYvSUFBZ0FrRUJhaUFCRUxjQ0RRRWFDd0pBSUFBb0FoQUVRQ0FBSUFBb0FnZ2lBa0VCYWpZQ0NDQUFLQUlFSUFKQkFYUnFJQUU3QVJBTUFRc2dBVUgvQVUwRVFDQUFJQUFvQWdnaUFrRUJhallDQ0NBQ0lBQW9BZ1JxSUFFNkFCQU1BUXRCZnlBQUlBQW9BZ3dROVFNTkFSb2dBQ0FBS0FJSUlnSkJBV28yQWdnZ0FDZ0NCQ0FDUVFGMGFpQUJPd0VRQzBFQUN3c2JBQ0FBUVFBUVFSb2dBQ0FCTmdJRUlBQkIvdi8vL3djMkFnZ0xDd0FnQUNBQlFRQVF3UVVMMmdvQ0VuOEJmaU1BUVRCcklnZ2tBQ0FCUVFBMkFnQWdBa0VBTmdJQUlBaEJBRFlDTENBSVFRQTJBaWdnQkVFd2NTRU5JQVJCRUhFaEVDQURLQUlRSWc1Qk1Hb2hCZ0pBQWtBQ1FBSkFBMEFnRGlnQ0lDQUpTZ1JBQWtBZ0JpZ0NCQ0lGUlEwQVFRQWdFQ0FHS0FJQVFZQ0FnSUFCY1JzZ0JDQUFJQVVRakFNaUIzWkJBWEZGY2cwQUFrQWdEVVVnQmlnQ0FFR0FnSUNBZkhGQmdJQ0FnSGhIY2cwQUlBTW9BaFFnQ1VFRGRHb29BZ0FvQWhBMUFnUkNJSVpDZ0lDQWdNQUFVZzBBSUFBZ0JpZ0NCQkRaQVVGL0lRa01CQXNnQUNBSVFTUnFJQVVRckFFRVFDQUxRUUZxSVFzTUFRc2dCMFVFUUNBTVFRRnFJUXdNQVFzZ0NrRUJhaUVLQ3lBR1FRaHFJUVlnQ1VFQmFpRUpEQUVMQzBFQUlRWUNRQ0FETFFBRklnVkJCSEZGRFFBZ0JVRUljUVJBSUFSQkFYRkZEUUVnQXlnQ0tDQUxhaUVMREFFTElBTXZBUVlpQlVFRlJnUkFJQVJCQVhGRkRRRkJBQ0VKSUFNcEF5QWlGMEtBZ0lDQWNJTkNnSUNBZ0pCL1VRUi9JQmVuS0FJRVFmLy8vLzhIY1FWQkFBc2dDMm9oQ3d3QkN5QUFLQUlRS0FKRUlBVkJHR3hxS0FJVUlnVkZEUUFnQlNnQ0JDSUZSUTBBUVg4aENTQUFJQWhCTEdvZ0NFRW9haUFEclVLQWdJQ0FjSVFnQlJFYkFBMEJRUUFoQlFOQUlBVWdDQ2dDS0U4TkFRSkFJQVFnQUNBRlFRTjBJZzRnQ0NnQ0xHb29BZ1FpQnhDTUEzWkJBWEVFUUFKQUlBMUZCRUJCQUNFSERBRUxJQUFnQ0NBRElBY1FUQ0lIUVFCSURRSWdCd1IvSUFnb0FnQWhCeUFBSUFnUVNDQUhRUUoyUVFGeEJVRUFDeUVISUFnb0Fpd2dEbW9nQnpZQ0FBc2dCaUFRUlNBSGNtb2hCZ3NnQlVFQmFpRUZEQUVMQ3lBQUlBZ29BaXdnQ0NnQ0tCQmFEQUVMSUFCQkFTQUxJQXhxSWhNZ0Ntb2dCbW9pRVNBUlFRRk1HMEVEZEJBcElnOUZCRUFnQUNBSUtBSXNJQWdvQWlnUVdrRi9JUWtNQVFzZ0F5Z0NFQ0lWUVRCcUlRWkJBQ0VGSUFzaERDQVRJUWRCQVNFVVFRQWhDUU5BSUFrZ0ZTZ0NJRTVGQkVBQ1FDQUdLQUlFSWhKRkRRQkJBQ0FRSUFZb0FnQkJnSUNBZ0FGeElnb2JJQVFnQUNBU0VJd0RJZzEyUVFGeFJYSU5BQ0FLUVJ4MklSWUNmeUFBSUFoQkpHb2dFaENzQVFSQUlBVkJBV29oQ2tFQUlSUWdCeUVPSUF3TUFRc2dEVVVFUUNBRklRb2dCeUVPSUF3aUJVRUJhZ3dCQ3lBSFFRRnFJUTRnQlNFS0lBY2hCU0FNQ3lFTklBQWdFaEFZSVFjZ0R5QUZRUU4wYWlJRklCWTJBZ0FnQlNBSE5nSUVJQW9oQlNBTklRd2dEaUVIQ3lBR1FRaHFJUVlnQ1VFQmFpRUpEQUVMQ3dKQUlBTXRBQVVpQ2tFRWNVVU5BQUovSUFwQkNIRUVRQ0FFUVFGeFJRMENJQU1vQWlnTUFRc2dBeThCQmtFRlJ3UkFRUUFoQmdOQUlBZ29BaXdoQXlBR0lBZ29BaWhQUlFSQUFrQkJBQ0FRSUFNZ0JrRURkR29pQ2lnQ0FDSURHeUFFSUFBZ0NpZ0NCQ0lLRUl3RGRrRUJjVVZ5UlFSQUlBOGdCMEVEZEdvaURTQUROZ0lBSUEwZ0NqWUNCQ0FIUVFGcUlRY01BUXNnQUNBS0VCTUxJQVpCQVdvaEJnd0JDd3NnQUNnQ0VDSUVRUkJxSUFNZ0JDZ0NCQkVBQUF3Q0N5QUVRUUZ4UlEwQlFRQWdBeWtESUNJWFFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFBYUlCZW5LQUlFUWYvLy8vOEhjUXNoQ1VFQUlRWWdDVUVBSUFsQkFFb2JJUU1EUUNBRElBWkdEUUVnRHlBRlFRTjBhaUlFUVFFMkFnQWdCQ0FHUVlDQWdJQjRjallDQkNBR1FRRnFJUVlnQlVFQmFpRUZEQUFMQUFzZ0JTQUxSdzBCSUF3Z0UwY05BaUFISUJGSERRTWdDMFVnRkhKRkJFQWdEeUFMUVFoQlB5QUFFTDRDQ3lBQklBODJBZ0FnQWlBUk5nSUFRUUFoQ1FzZ0NFRXdhaVFBSUFrUEMwRzhLRUd1L0FCQnlqdEJ6OVlBRUFBQUMwR1BLRUd1L0FCQnl6dEJ6OVlBRUFBQUMwSHRLRUd1L0FCQnpEdEJ6OVlBRUFBQUN6SUJBWDhqQUVIUUFHc2lBeVFBSUFNZ0FDZ0NFQ0FEUVJCcUlBRVFrQUUyQWdBZ0FDQUNJQU1RRlNBRFFkQUFhaVFBQ3dzQUlBQWdBU0FDRUlZRkN3a0FJQUJCQVJEWkJBczJBUUovUVg4aEF5QUFJQUZCQUJDVEFTSUNCSDhnQWlnQ0lDZ0NEQ2dDSUMwQUJBUkFJQUFRYTBGL0R3c2dBaWdDS0FWQmZ3c0xhUUVEZnlNQVFSQnJJZ01rQUFKQUFrQWdBVUtBZ0lDQWNGUU5BQ0FCcHlJRUx3RUdJUVVnQWdSQUlBVkJJRWNOQVF3Q0N5QUZRUlZyUWYvL0EzRkJDMGtOQVFzZ0EwRzdJa0hTSHlBQ0d6WUNBQ0FBUWZjOElBTVFGVUVBSVFRTElBTkJFR29rQUNBRUN5UUJBWDhqQUVFUWF5SURKQUFnQXlBQ05nSU1JQUFnQVNBQ0VKc0VJQU5CRUdva0FBc1NBQ0FBSUFFZ0FpQURJQVJCeGdBUXBBUUxEUUFnQUVFYVFTUkJHUkQvQlFzT0FDQUFRb0NBZ0lEZ2ZoQ0FCZ3V4QWdJQ2Z3RjhJd0JCRUdzaUJDUUFBbjhDUUFOQUFrQUNRQUpBQW44Q1FBSkFRUWNnQWtJZ2lLY2lBeUFEUVFkclFXNUpHeUlERGdnQUFBQUFCUVVGQVFRTElBS25EQUVMSUFKQ2dJQ0FnTUNCZ1B6L0FId2lBa0kwaUtkQi93OXhJZ0JCblFoTERRRWdBcjhpQlpsRUFBQUFBQUFBNEVGakJFQWdCYW9NQVF0QmdJQ0FnSGdMSVFOQkFBd0ZDMEVBSVFOQkFDQUFRZElJU3cwRUdrRUFJQUpDLy8vLy8vLy8vd2VEUW9DQWdJQ0FnSUFJaENBQVFaTUlhNjJHUWlDSXB5SURheUFESUFKQ0FGTWJJUU5CQUF3RUN5QURRWGRHRFFJTElBQWdBaENOQVNJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFBTFFRQWhBMEYvREFFTElBUkJER29nQXFkQkJHcEJBUkNwQVNBQUlBSVFEeUFFS0FJTUlRTkJBQXNoQUNBQklBTTJBZ0FnQkVFUWFpUUFJQUFMemdFQkEzOGpBRUVRYXlJRUpBQUNRQ0FCUW9DQWdJQndWQVJBREFFTElBR25JZ0l2QVFaQk1FWUVRQUpBSUFBZ0JFRUlhaUFCUWVFQUVJRUJJZ05GRFFBZ0JDa0RDQ0lCUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FBSUFNcEF3QVFtUUVoQWd3REN5QUFJQUVnQXlrRENFRUJJQU1RTHlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUJFQ1loQWlBQUlBTXBBd0FRbVFFaUEwRUFTQTBBSUFJZ0EwWU5BaUFBUVpEcEFFRUFFQlVMUVg4aEFnd0JDeUFDTFFBRlFRRnhJUUlMSUFSQkVHb2tBQ0FDQzRnREFnSitBbjhqQUVFUWF5SUdKQUFDUUNBQlFvQ0FnSUJ3VkFSQUlBRWhBd3dCQ3lBQ1FXOXhJUVVDUUFKQUFrQWdBa0VRY1EwQUlBQWdBVUhRQVNBQlFRQVFGQ0lFUW9DQWdJQndneUlEUW9DQWdJQWdVU0FEUW9DQWdJQXdVWElOQUNBRFFvQ0FnSURnQUZFTkFTQUdJQUJCeGdCQkZpQUZRUUZHRzBISUFDQUZHeEF0TndNSUlBQWdCQ0FCUVFFZ0JrRUlhaEF2SVFNZ0FDQUdLUU1JRUE4Z0EwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBQWdBUkFQSUFOQ2dJQ0FnSEJVRFFNZ0FDQURFQThnQUVHVzRRQkJBQkFWREFJTElBVkJBRWNoQlVFQUlRSURRQ0FDUVFKSEJFQWdBQ0FCUVRkQk9TQUNJQVZHR3lBQlFRQVFGQ0lEUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlDUUNBQUlBTVFPRVVOQUNBQUlBTWdBVUVBUVFBUUx5SURRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdBMEwvLy8vL2IxWU5BQ0FBSUFFUUR3d0ZDeUFBSUFNUUR5QUNRUUZxSVFJTUFRc0xJQUJCbHVFQVFRQVFGUXNnQUNBQkVBOExRb0NBZ0lEZ0FDRURDeUFHUVJCcUpBQWdBd3Z1Q3dFSGZ3SkFJQUJGRFFBZ0FFRUlheUlDSUFCQkJHc29BZ0FpQVVGNGNTSUFhaUVGQWtBZ0FVRUJjUTBBSUFGQkEzRkZEUUVnQWlBQ0tBSUFJZ0ZySWdKQndOQUVLQUlBU1EwQklBQWdBV29oQUVIRTBBUW9BZ0FnQWtjRVFDQUJRZjhCVFFSQUlBRkJBM1loQVNBQ0tBSU1JZ01nQWlnQ0NDSUVSZ1JBUWJEUUJFR3cwQVFvQWdCQmZpQUJkM0UyQWdBTUF3c2dCQ0FETmdJTUlBTWdCRFlDQ0F3Q0N5QUNLQUlZSVFZQ1FDQUNJQUlvQWd3aUFVY0VRQ0FDS0FJSUlnTWdBVFlDRENBQklBTTJBZ2dNQVFzQ1FDQUNRUlJxSWdRb0FnQWlBdzBBSUFKQkVHb2lCQ2dDQUNJRERRQkJBQ0VCREFFTEEwQWdCQ0VISUFNaUFVRVVhaUlFS0FJQUlnTU5BQ0FCUVJCcUlRUWdBU2dDRUNJRERRQUxJQWRCQURZQ0FBc2dCa1VOQVFKQUlBSW9BaHdpQkVFQ2RFSGcwZ1JxSWdNb0FnQWdBa1lFUUNBRElBRTJBZ0FnQVEwQlFiVFFCRUcwMEFRb0FnQkJmaUFFZDNFMkFnQU1Bd3NnQmtFUVFSUWdCaWdDRUNBQ1JodHFJQUUyQWdBZ0FVVU5BZ3NnQVNBR05nSVlJQUlvQWhBaUF3UkFJQUVnQXpZQ0VDQURJQUUyQWhnTElBSW9BaFFpQTBVTkFTQUJJQU0yQWhRZ0F5QUJOZ0lZREFFTElBVW9BZ1FpQVVFRGNVRURSdzBBUWJqUUJDQUFOZ0lBSUFVZ0FVRitjVFlDQkNBQ0lBQkJBWEkyQWdRZ0FDQUNhaUFBTmdJQUR3c2dBaUFGVHcwQUlBVW9BZ1FpQVVFQmNVVU5BQUpBSUFGQkFuRkZCRUJCeU5BRUtBSUFJQVZHQkVCQnlOQUVJQUkyQWdCQnZOQUVRYnpRQkNnQ0FDQUFhaUlBTmdJQUlBSWdBRUVCY2pZQ0JDQUNRY1RRQkNnQ0FFY05BMEc0MEFSQkFEWUNBRUhFMEFSQkFEWUNBQThMUWNUUUJDZ0NBQ0FGUmdSQVFjVFFCQ0FDTmdJQVFialFCRUc0MEFRb0FnQWdBR29pQURZQ0FDQUNJQUJCQVhJMkFnUWdBQ0FDYWlBQU5nSUFEd3NnQVVGNGNTQUFhaUVBQWtBZ0FVSC9BVTBFUUNBQlFRTjJJUUVnQlNnQ0RDSURJQVVvQWdnaUJFWUVRRUd3MEFSQnNOQUVLQUlBUVg0Z0FYZHhOZ0lBREFJTElBUWdBellDRENBRElBUTJBZ2dNQVFzZ0JTZ0NHQ0VHQWtBZ0JTQUZLQUlNSWdGSEJFQkJ3TkFFS0FJQUdpQUZLQUlJSWdNZ0FUWUNEQ0FCSUFNMkFnZ01BUXNDUUNBRlFSUnFJZ1FvQWdBaUF3MEFJQVZCRUdvaUJDZ0NBQ0lERFFCQkFDRUJEQUVMQTBBZ0JDRUhJQU1pQVVFVWFpSUVLQUlBSWdNTkFDQUJRUkJxSVFRZ0FTZ0NFQ0lERFFBTElBZEJBRFlDQUFzZ0JrVU5BQUpBSUFVb0Fod2lCRUVDZEVIZzBnUnFJZ01vQWdBZ0JVWUVRQ0FESUFFMkFnQWdBUTBCUWJUUUJFRzAwQVFvQWdCQmZpQUVkM0UyQWdBTUFnc2dCa0VRUVJRZ0JpZ0NFQ0FGUmh0cUlBRTJBZ0FnQVVVTkFRc2dBU0FHTmdJWUlBVW9BaEFpQXdSQUlBRWdBellDRUNBRElBRTJBaGdMSUFVb0FoUWlBMFVOQUNBQklBTTJBaFFnQXlBQk5nSVlDeUFDSUFCQkFYSTJBZ1FnQUNBQ2FpQUFOZ0lBSUFKQnhOQUVLQUlBUncwQlFialFCQ0FBTmdJQUR3c2dCU0FCUVg1eE5nSUVJQUlnQUVFQmNqWUNCQ0FBSUFKcUlBQTJBZ0FMSUFCQi93Rk5CRUFnQUVGNGNVSFkwQVJxSVFFQ2YwR3cwQVFvQWdBaUEwRUJJQUJCQTNaMElnQnhSUVJBUWJEUUJDQUFJQU55TmdJQUlBRU1BUXNnQVNnQ0NBc2hBQ0FCSUFJMkFnZ2dBQ0FDTmdJTUlBSWdBVFlDRENBQ0lBQTJBZ2dQQzBFZklRUWdBRUgvLy84SFRRUkFJQUJCSmlBQVFRaDJaeUlCYTNaQkFYRWdBVUVCZEd0QlBtb2hCQXNnQWlBRU5nSWNJQUpDQURjQ0VDQUVRUUowUWVEU0JHb2hCd0pBQWtBQ1FFRzAwQVFvQWdBaUEwRUJJQVIwSWdGeFJRUkFRYlRRQkNBQklBTnlOZ0lBSUFjZ0FqWUNBQ0FDSUFjMkFoZ01BUXNnQUVFWklBUkJBWFpyUVFBZ0JFRWZSeHQwSVFRZ0J5Z0NBQ0VCQTBBZ0FTSURLQUlFUVhoeElBQkdEUUlnQkVFZGRpRUJJQVJCQVhRaEJDQURJQUZCQkhGcUlnZEJFR29vQWdBaUFRMEFDeUFISUFJMkFoQWdBaUFETmdJWUN5QUNJQUkyQWd3Z0FpQUNOZ0lJREFFTElBTW9BZ2dpQUNBQ05nSU1JQU1nQWpZQ0NDQUNRUUEyQWhnZ0FpQUROZ0lNSUFJZ0FEWUNDQXRCME5BRVFkRFFCQ2dDQUVFQmF5SUFRWDhnQUJzMkFnQUxDMGNBSUFBZ0FVa0VRQ0FBSUFFZ0FoQWZHZzhMSUFJRVFDQUFJQUpxSVFBZ0FTQUNhaUVCQTBBZ0FFRUJheUlBSUFGQkFXc2lBUzBBQURvQUFDQUNRUUZySWdJTkFBc0xDeDRBSUFCQ2dJQ0FnSENEUW9DQWdJQ1FmMUVFUUNBQXB5QUJFTGNFQ3d1L0JRRUhmeU1BUVpBQ2F5SUdKQUFnQmtFQU9nQVFJQVlnQUNnQ0JEWUNBQ0FHSUFBb0FoUTJBZ1FnQmlBQUtBSVlOZ0lNSUFZZ0FDZ0NNRFlDQ0NBQVFSQnFJUWxCQVNFRUFrQUNRQU5BUVg0aENBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQ1NnQ0FDSURRZjRBYWc0RkFRa0pDUWNBQ3dKQUFrQUNRQUpBQWtBZ0EwRW9hdzRDQVFJQUN3SkFJQU5CTzJzT0F3Y05DUUFMQWtBZ0EwSGJBR3NPQXdFTkF3QUxBa0FnQTBIN0FHc09Bd0VOQkFBTElBTkJwMzlHRFFjZ0EwRXZSZzBKSUFOQnJIOUhEUXdNRUFzZ0JFSC9BVTBOQkF3T0N5QUVRUUZySWdRZ0JrRVFhbW90QUFCQktFY05EUXdKQ3lBRVFRRnJJZ1FnQmtFUWFtb3RBQUJCMndCSERRd01DQXRCL1FBaEJTQUVRUUZySWdRZ0JrRVFhbW90QUFBaUNFSDdBRVlOQ1VHc2Z5RURJQWhCNEFCSERRd2dBQ0FKRVA4QklBQkJBRFlDTUNBQUlBQW9BaFEyQWdRZ0FDQUFLQUk0RU04RERRd0xJQUFvQWloQjRBQkdEUVpCNEFBaEF5QUVRZjhCU3cwS0N5QUdRUkJxSUFScUlBTTZBQUFnQkVFQmFpRUVEQVVMSUFjZ0JFRUNSbkloQjBFN0lRVU1CZ3NnQjBFQ2NpQUhJQVJCQWtZYklRZEJwMzhoQlF3RkN5QUhRUVJ5SVFkQlBTRUZEQVFMUVg4aENBc2dCVUdBQVdvaUEwRVdUVUVBUVFFZ0EzUkJtNENBQTNFYkRRQWdCVUVwUmlBRlFkMEFSbklnQlVIVEFHb2lBMEVIVFVFQVFRRWdBM1JCaHdGeEczSWdCVUg5QUVaeURRQWdBQ0FBS0FJNElBaHFOZ0k0SUFBUTJBUU5CQXNnQ1NnQ0FDRURDeUFEUVlOL1J3UkFJQU1oQlF3QkMwRmJJUVVnQUVIREFCQktEUUFnQUVFdEVFb05BRUdEZnlFRkN5QUFFQklOQVNBRVFRRkxEUUFMUVZzZ0FDZ0NFQ0FBUWNNQUVFb2JJUU1nQWtVTkFVRUtJQU1nQUNnQ0JDQUFLQUlVUnhzaEF3d0JDMEdzZnlFREN5QUJCRUFnQVNBSE5nSUFDeUFBSUFZUTdnSWhBQ0FHUVpBQ2FpUUFRWDhnQXlBQUd3c1pBQ0FBSUFFZ0FrRUJJQU1nQkNBRklBWWdCeUFJRVBVQkM2b0dBUVovSUFBb0FnQWhCUUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUREZ2NFQUFBQUFBRUNBd3NnQVNBQ0lBRW9Bc0FCUVFFUXdRTWlDVUVBU0FSQUlBRW9BcndCSVFRTUJnc0NRQ0FKUWYvLy8vOERUUVJBSUFFb0FuUWlDQ0FKUVFSMGFpSUhLQUlFSWdZZ0FTZ0N2QUVpQkVZRVFDQURRUU5IRFFJZ0FTMEFia0VCY1EwQ0lBZ2dDVUVFZEdvb0FneEIrQUJ4UVFoSERRSU1DUXNnQnlnQ0RFSDRBSEZCR0VjZ0JrRUNhaUFFUjNJTkJ3d0JDeUFCS0FLOEFTSUVJQUVvQXZBQlJ3MEdDeUFBUVpERUFFRUFFQllNQndzZ0JTQUJJQUpCQXhEakFnOExJQUVnQWlBQktBTEFBVUVBRU1FRFFRQk9EUUlnQVNnQ0tBUkFBa0FnQVNBQ0VLSUNJZ05GRFFBZ0F5MEFCRUVDY1VVTkFDQURLQUlJSUFFb0Fyd0JSdzBBSUFFb0FpUkJBVVlOQkF0QmdJQ0FnQVJCZnlBRklBRWdBaERrQWhzUEN5QUJJQUlROUFFaUJFRUFUZzBJSUFVZ0FTQUNFRThpQkVFQVNBMElBa0FnQWtITkFFY05BQ0FCS0FKSVJRMEFJQUVnQkRZQ21BRUxJQUVvQW5RZ0JFRUVkR29nQVNnQ3ZBRTJBZ2dnQkE4TEVBRUFDeUFGSUFFZ0FrRUFFT01DSVFRTUJnc2dBRUdReEFCQkFCQVdEQUlMQWtBZ0EwRUNTdzBBSUFRZ0FTZ0M4QUZIRFFBZ0JDRUdJQUVnQWhEZ0JFRUFTQTBCSUFCQnkrWUFRUUFRRmd3Q0N5QUVJUVlMUVFBaEJDQUJLQUo4SWdkQkFDQUhRUUJLR3lFSEFrQURRQ0FFSUFkR0RRRUNRQUpBSUFFb0FuUWdCRUVFZEdvaUNDZ0NBQ0FDUncwQUlBZ29BZ1FOQUNBQklBZ29BZ2dnQmhEYUJBMEJDeUFFUVFGcUlRUU1BUXNMSUFSQkFFZ05BQ0FBUWVIcUFFRUFFQllNQVFzQ1FDQUJLQUlvUlEwQUlBRWdBaENpQWlJRVJRMEFJQUVnQkNnQ0NDQUdFTm9FUlEwQUlBQkI0OFFBUVFBUUZnd0JDeUFCS0FJZ1JRMENJQUVvQWlSQkFVc05BaUFHSUFFb0F2QUJSdzBDSUFVZ0FTQUNFT1FDSWdBTkFRdEJmdzhMSUFBZ0FDMEFCRUg1QVhGQkJrRUNJQU5CQWtZYmNqb0FCRUdBZ0lDQUJBOExJQVVnQVNBQ1FRRWdBMEVFUmtFQmRDQURRUU5HR3hEakFpSUVRUUJJRFFBZ0FTZ0NkQ0FFUVFSMGFpSUFJQUFvQWd4QmZIRWdBMEVDUm5KQkFuSTJBZ3dnQkE4TElBUUxzZ0VCQlg4Q1FBSkFJQUFvQWtBaUFpZ0NtQUlpQTBFQVNBMEFJQUlvQW9BQ0lnUWdBMm9pQlMwQUFDSUdRY0VCUndSQUlBWkJ6UUJIRFFFZ0FrRi9OZ0tZQWlBQ0lBTTJBb1FDSUFCQnpRQVFFQ0FBSUFFUUdnOExJQVFnQXlBRktBQUJhMEVCYWlJRGFpSUVMUUFBUWRZQVJ3MEJJQUFvQWdBZ0JDZ0FBUkFUSUFJb0FvQUNJQU5xSUFBb0FnQWdBUkFZTmdBQklBSkJmellDbUFJTER3dEIzVFJCcnZ3QVFkT3dBVUhONVFBUUFBQUwyUWtDQ0g4QmZpTUFRWkFCYXlJQ0pBQUNmd0pBSUFBb0FnQW9BaEFvQW5nZ0Frc0VRQ0FBUVkwaVFRQVFGZ3dCQ3lBQUlBQkJFR29pQmhEL0FTQUFJQUFvQWpnaUFUWUNOQ0FDSUFFMkFnUWdBQ0FBS0FJVU5nSUVBa0FEUUFKQUlBQWdBVFlDR0NBQUlBQW9BZ2dpQlRZQ0ZBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FTd0FBQ0lEUWY4QmNTSUVEbnNBQ1FrSkNRa0pDUWtHQkFVRkF3a0pDUWtKQ1FrSkNRa0pDUWtKQ1FrSkNRWUpBZ2tPQ1FrQkNRa0pDd2tLQ1FjSURBd01EQXdNREF3TUNRa0pDUWtKQ1E0T0RnNE9EZzRPRGc0T0RnNE9EZzRPRGc0T0RnNE9EZzRPQ1FrSkNRNEpEZzRPRGc0T0RnNE9EZzRPRGc0T0RnNE9EZzRPRGc0T0RnNEpDMEVBSVFNZ0FTQUFLQUk4U1EwTUlBWkJySDgyQWdBTURndEJKeUVESUFBb0FreEZEUXRCSnlFRUN5QUFJQVJCQVNBQlFRRnFJQVlnQWtFRWFoRHpBa1VOREF3UUN5QUJRUUZxSUFFZ0FTMEFBVUVLUmhzaEFRc2dBaUFCUVFGcUlnRTJBZ1FnQUNBRlFRRnFOZ0lJREEwTElBQW9Ba3hGRFFjTElBSWdBVUVCYWlJQk5nSUVEQXNMSUFBb0FreEZCRUJCTHlFRERBWUxRUzhoQXlBQkxRQUJJZ1JCTDBZTkNDQUVRU3BIRFFVZ0FVRUNhaUVCQTBBZ0FpQUJOZ0lFQTBBQ1FBSkFBa0FDUUNBQkxRQUFJZ05CQ21zT0JBRUNBZ01BQ3lBRFFTcEhCRUFnQXcwQ0lBRWdBQ2dDUEVrTkEwSFZMQ0VCREE4TElBRXRBQUZCTDBjTkFpQUNJQUZCQW1vaUFUWUNCQXdQQ3lBQUlBQW9BZ2hCQVdvMkFnZ01BUXNnQThCQkFFNE5BQ0FCUVFZZ0FrRUVhaEJZSVFNZ0FpZ0NCQ0VCSUFOQmYwY05BUXNMSUFGQkFXb2hBUXdBQ3dBTFFUQWhBeUFCTFFBQlFUcHJRWFpKRFFNTUJBc2dBMEVBVGcwRFFkSERBQ0VCREFjTFFTMGhBeUFCTFFBQlFUcHJRWFpKRFFJTUFRdEJLeUVESUFBb0FreEZEUUVnQVMwQUFVRTZhMEYyU1EwQkN5QUFLQUlBSUFFZ0FrRUVha0VBUVFvZ0FDZ0NUQ0lCR3lBQlFRQkhRUUowRUxnQ0lnbENnSUNBZ0hDRFFvQ0FnSURnQUZFTkJpQUFRWUIvTmdJUUlBQWdDVGNESUF3Q0N5QUdJQU5CL3dGeE5nSUFJQUlnQVVFQmFqWUNCQXdCQ3lBQ0lBRkJBV29pQnpZQ0JFR0FBU0VFSUFKQmdBRTJBZ2dnQWlBQ1FSQnFJZ1UyQWd4QkFDRUJBbjhEUUNBRVFRWnJJUWdDUUFOQUlBRWdCV29nQXpvQUFDQUJRUUZxSVFFZ0J5MEFBQ0lFd0NJRFFRQklEUUVnQkVFRGRrRWNjVUdnZ1FKcUtBSUFJQVIyUVFGeFJRMEJJQWRCQVdvaEJ5QUJJQWhKRFFBTElBQW9BZ0FnQWtFTWFpQUNRUWhxSUFKQkVHb1E5UVFoQkNBQ0tBSU1JUVZCQUNBRURRSWFJQUlvQWdnaEJBd0JDd3NnQUNnQ0FDQUZJQUVRaFFNTElRRWdBa0VRYWlBRlJ3UkFJQUFvQWdBb0FoQWlBMEVRYWlBRklBTW9BZ1FSQUFBTElBSWdCellDQkNBQlJRMEVJQUJDQURjQ0pDQUFRWU4vTmdJUUlBQWdBVFlDSUFzZ0FDQUNLQUlFTmdJNFFRQU1CUXNnQVVFQ2FpRUJBMEFnQWlBQk5nSUVBMEFDUUFKQUlBRXRBQUFpQXdSQUlBTkJDbXNPQkFZQkFRWUJDeUFCSUFBb0FqeFBEUVVNQVFzZ0E4QkJBRTROQUNBQlFRWWdBa0VFYWhCWUlnTkJmbkZCcU1BQVJnUkFJQUlvQWdRaEFRd0ZDeUFDS0FJRUlRRWdBMEYvUncwQkN3c2dBVUVCYWlFQkRBQUxBQXNMSUFBZ0FVRUFFQllMSUFaQnFuODJBZ0FMUVg4TElRRWdBa0dRQVdva0FDQUJDeUVBSUFBZ0FTQUNRZ0JDLy8vLy8vLy8vdzlDQUJCMElRRWdBQ0FDRUE4Z0FRc3FBUUYvSXdCQkVHc2lBeVFBSUFNZ0FqWUNEQ0FBSUFFZ0FrSGpBRUVBRUprRUdpQURRUkJxSkFBTFR3QWdBQ0FCSUFKQkFFNEVmaUFDclFWQ2dJQ0FnTUIrSUFLNHZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3lBRFFZQ0FBUkRYQVF0WkFRSi9Jd0JCRUdzaUF5UUFRWDhoQkNBQUlBTkJDR29nQWhEaUEwVUVRRUVBSVFRZ0FTQURLUU1JSWdKQ2dJQ0FnSUNBZ0JCYUJINGdBRUdBSUVFQUVGQkJmeUVFUWdBRklBSUxOd01BQ3lBRFFSQnFKQUFnQkFzUkFDQUFJQUVnQVNBQ0lBTkJBaENLQkF0VEFRRi9JQUFvQWhBaUJFRVFhaUFCSUFJZ0JDZ0NDQkVCQUNJQklBSkZja1VFUUNBQUVId2dBUThMSUFNRVFDQURJQUVnQUNnQ0VDZ0NEQkVFQUNJQUlBSnJJZ0pCQUNBQUlBSlBHellDQUFzZ0FRdkFBUUFnQUFKL0lBRW9BZ2dpQUVIKy8vLy9CMDRFUUVFQUlBSkJBWEVOQVJwQi8vLy8vd2NnQUVIKy8vLy9CMGNOQVJvZ0FTZ0NCRUgvLy8vL0Iyb01BUXRCQUNBQVFRQk1EUUFhSUFCQkgwMEVRRUVBSUFFb0FoQWdBU2dDREVFQ2RHcEJCR3NvQWdCQklDQUFhM1lpQW1zZ0FpQUJLQUlFR3d3QkN5QUNRUUZ4UlFSQVFZQ0FnSUI0UWYvLy8vOEhJQUVvQWdRYkRBRUxRUUFnQVNnQ0VDQUJLQUlNSWdJZ0FrRUZkQ0FBYXhCb0lnSnJJQUlnQVNnQ0JCc0xOZ0lBQ3cwQUlBQWdBU0FCRUQ4UWhRTUwrUUVDQTM0Q2Z5TUFRUkJySWdVa0FBSitJQUc5SWdOQy8vLy8vLy8vLy8vL0FJTWlBa0tBZ0lDQWdJQ0FDSDFDLy8vLy8vLy8vKy8vQUZnRVFDQUNRanlHSVFRZ0FrSUVpRUtBZ0lDQWdJQ0FnRHg4REFFTElBSkNnSUNBZ0lDQWdQai9BRm9FUUNBRFFqeUdJUVFnQTBJRWlFS0FnSUNBZ0lEQS8vOEFoQXdCQ3lBQ1VBUkFRZ0FNQVFzZ0JTQUNRZ0FnQTZkblFTQnFJQUpDSUlpblp5QUNRb0NBZ0lBUVZCc2lCa0V4YWhCbklBVXBBd0FoQkNBRktRTUlRb0NBZ0lDQWdNQUFoVUdNK0FBZ0JtdXRRakNHaEFzaEFpQUFJQVEzQXdBZ0FDQUNJQU5DZ0lDQWdJQ0FnSUNBZjRPRU53TUlJQVZCRUdva0FBdTJBUUVCZnlNQVFSQnJJZ01rQUFKQUFrQWdBa0VBU0FSQUlBRWdBa0gvLy8vL0IzRTJBZ0JCQVNFQ0RBRUxJQUFvQWhBaUFDZ0NMQ0FDVFEwQkFuOENRQ0FBS0FJNElBSkJBblJxS0FJQUlnQXBBZ1JDZ0lDQWdJQ0FnSUJBZzBLQWdJQ0FnSUNBZ01BQVVnMEFJQU5CREdvZ0FCQzlCVVVOQUVFQklBTW9BZ3dpQUVGL1J3MEJHZ3RCQUNFQVFRQUxJUUlnQVNBQU5nSUFDeUFEUVJCcUpBQWdBZzhMUWUvZkFFR3UvQUJCdnhoQnJ5QVFBQUFMMVFFQ0FuOERmZ0ovSUFKRkJFQkNnSUNBZ0RBaEJVRUFEQUVMSUFBb0FoQWlBeWtEZ0FFaEJTQURRb0NBZ0lBZ053T0FBVUYvQ3lFREFrQWdBQ0FCUVFZZ0FVRUFFQlFpQjBLQWdJQ0FjSU1pQmtLQWdJQ0FJRkVnQmtLQWdJQ0FNRkZ5UlFSQVFYOGhCQ0FHUW9DQWdJRGdBRkVOQVNBQUlBY2dBVUVBUVFBUUx5RUJBbjhnQXlBQ0RRQWFRWDhnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2lBRElBRkMvLy8vLzI5V0RRQWFJQUFRSkVGL0N5RUVJQUFnQVJBUERBRUxJQU1oQkFzZ0FnUkFJQUFnQlJDS0FRc2dCQXZGQVFJQmZnSi9Jd0JCRUdzaUJTUUFRb0NBZ0lEZ0FDRUVBa0FDUUNBQUlBRWdBa0VBUVFBZ0JVRU1haERIQlNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0JTZ0NEQ0lHUVFKSEJFQWdBeUFHTmdJQUlBRWhCQXdDQ3lBQUlBRkI2UUFnQVVFQUVCUWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQU1nQUNBQ0VDWWlBellDQUVLQWdJQ0FNQ0VFSUFORkJFQWdBQ0FCUWNBQUlBRkJBQkFVSVFRTElBQWdBUkFQREFFTElBQWdBUkFQSUFOQkFEWUNBQXNnQlVFUWFpUUFJQVFMVFFBZ0FDQUJJQUpCQUU0RWZpQUNyUVZDZ0lDQWdNQitJQUs0dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeUFESUFRUXZRRUxTQUFnQUNBQklBSkJBRTRFZmlBQ3JRVkNnSUNBZ01CK0lBSzR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4Qk5DNmNwQVF0L0l3QkJFR3NpQ3lRQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQVFmUUJUUVJBUWJEUUJDZ0NBQ0lKUVJBZ0FFRUxha0Y0Y1NBQVFRdEpHeUlHUVFOMklnRjJJZ0pCQTNFRVFBSkFJQUpCZjNOQkFYRWdBV29pQVVFRGRDSUFRZGpRQkdvaUFpQUFRZURRQkdvb0FnQWlBeWdDQ0NJQVJnUkFRYkRRQkNBSlFYNGdBWGR4TmdJQURBRUxJQUFnQWpZQ0RDQUNJQUEyQWdnTElBTkJDR29oQUNBRElBRkJBM1FpQWtFRGNqWUNCQ0FDSUFOcUlnSWdBaWdDQkVFQmNqWUNCQXdKQ3lBR1FialFCQ2dDQUNJS1RRMEJJQUlFUUFKQVFRSWdBWFFpQUVFQUlBQnJjaUFDSUFGMGNTSUFRUUFnQUd0eGFDSURRUU4wSWdCQjJOQUVhaUlDSUFCQjROQUVhaWdDQUNJSEtBSUlJZ0JHQkVCQnNOQUVJQWxCZmlBRGQzRWlDVFlDQUF3QkN5QUFJQUkyQWd3Z0FpQUFOZ0lJQ3lBSElBWkJBM0kyQWdRZ0JpQUhhaUlCSUFOQkEzUWlBQ0FHYXlJRVFRRnlOZ0lFSUFBZ0Iyb2dCRFlDQUNBS0JFQWdDa0Y0Y1VIWTBBUnFJUUJCeE5BRUtBSUFJUVVDZnlBSlFRRWdDa0VEZG5RaUFuRkZCRUJCc05BRUlBSWdDWEkyQWdBZ0FBd0JDeUFBS0FJSUN5RURJQUFnQlRZQ0NDQURJQVUyQWd3Z0JTQUFOZ0lNSUFVZ0F6WUNDQXNnQjBFSWFpRUFRY1RRQkNBQk5nSUFRYmpRQkNBRU5nSUFEQWtMUWJUUUJDZ0NBQ0lIUlEwQklBZEJBQ0FIYTNGb1FRSjBRZURTQkdvb0FnQWlBU2dDQkVGNGNTQUdheUVFSUFFaEFnTkFBa0FnQWlnQ0VDSUFSUVJBSUFJb0FoUWlBRVVOQVFzZ0FDZ0NCRUY0Y1NBR2F5SUNJQVFnQWlBRVNTSUNHeUVFSUFBZ0FTQUNHeUVCSUFBaEFnd0JDd3NnQVNnQ0dDRUlJQUVnQVNnQ0RDSURSd1JBUWNEUUJDZ0NBQm9nQVNnQ0NDSUFJQU0yQWd3Z0F5QUFOZ0lJREFnTElBRkJGR29pQWlnQ0FDSUFSUVJBSUFFb0FoQWlBRVVOQXlBQlFSQnFJUUlMQTBBZ0FpRUZJQUFpQTBFVWFpSUNLQUlBSWdBTkFDQURRUkJxSVFJZ0F5Z0NFQ0lBRFFBTElBVkJBRFlDQUF3SEMwRi9JUVlnQUVHL2Ywc05BQ0FBUVF0cUlnQkJlSEVoQmtHMDBBUW9BZ0FpQ0VVTkFFRUFJQVpySVFRQ1FBSkFBa0FDZjBFQUlBWkJnQUpKRFFBYVFSOGdCa0gvLy84SFN3MEFHaUFHUVNZZ0FFRUlkbWNpQUd0MlFRRnhJQUJCQVhSclFUNXFDeUlIUVFKMFFlRFNCR29vQWdBaUFrVUVRRUVBSVFBTUFRdEJBQ0VBSUFaQkdTQUhRUUYyYTBFQUlBZEJIMGNiZENFQkEwQUNRQ0FDS0FJRVFYaHhJQVpySWdVZ0JFOE5BQ0FDSVFNZ0JTSUVEUUJCQUNFRUlBSWhBQXdEQ3lBQUlBSW9BaFFpQlNBRklBSWdBVUVkZGtFRWNXb29BaEFpQWtZYklBQWdCUnNoQUNBQlFRRjBJUUVnQWcwQUN3c2dBQ0FEY2tVRVFFRUFJUU5CQWlBSGRDSUFRUUFnQUd0eUlBaHhJZ0JGRFFNZ0FFRUFJQUJyY1doQkFuUkI0TklFYWlnQ0FDRUFDeUFBUlEwQkN3TkFJQUFvQWdSQmVIRWdCbXNpQVNBRVNTRUZJQUVnQkNBRkd5RUVJQUFnQXlBRkd5RURJQUFvQWhBaUFnUi9JQUlGSUFBb0FoUUxJZ0FOQUFzTElBTkZEUUFnQkVHNDBBUW9BZ0FnQm10UERRQWdBeWdDR0NFSElBTWdBeWdDRENJQlJ3UkFRY0RRQkNnQ0FCb2dBeWdDQ0NJQUlBRTJBZ3dnQVNBQU5nSUlEQVlMSUFOQkZHb2lBaWdDQUNJQVJRUkFJQU1vQWhBaUFFVU5BeUFEUVJCcUlRSUxBMEFnQWlFRklBQWlBVUVVYWlJQ0tBSUFJZ0FOQUNBQlFSQnFJUUlnQVNnQ0VDSUFEUUFMSUFWQkFEWUNBQXdGQ3lBR1FialFCQ2dDQUNJQVRRUkFRY1RRQkNnQ0FDRURBa0FnQUNBR2F5SUNRUkJQQkVBZ0F5QUdhaUlCSUFKQkFYSTJBZ1FnQUNBRGFpQUNOZ0lBSUFNZ0JrRURjallDQkF3QkN5QURJQUJCQTNJMkFnUWdBQ0FEYWlJQUlBQW9BZ1JCQVhJMkFnUkJBQ0VCUVFBaEFndEJ1TkFFSUFJMkFnQkJ4TkFFSUFFMkFnQWdBMEVJYWlFQURBY0xJQVpCdk5BRUtBSUFJZ3BKQkVCQnZOQUVJQW9nQm1zaUFqWUNBRUhJMEFSQnlOQUVLQUlBSWdFZ0Jtb2lBRFlDQUNBQUlBSkJBWEkyQWdRZ0FTQUdRUU55TmdJRUlBRkJDR29oQUF3SEMwRUFJUUFnQmtFdmFpSUlBbjlCaU5RRUtBSUFCRUJCa05RRUtBSUFEQUVMUVpUVUJFSi9Od0lBUVl6VUJFS0FvSUNBZ0lBRU53SUFRWWpVQkNBTFFReHFRWEJ4UWRpcTFhb0ZjellDQUVHYzFBUkJBRFlDQUVIczB3UkJBRFlDQUVHQUlBc2lCR29pQjBFQUlBUnJJZ1Z4SWdJZ0JrME5Ca0hvMHdRb0FnQWlCQVJBUWVEVEJDZ0NBQ0lESUFKcUlnRWdBMDBnQVNBRVMzSU5Cd3NDUUVIczB3UXRBQUJCQkhGRkJFQUNRQUpBQWtBQ1FFSEkwQVFvQWdBaUF3UkFRZkRUQkNFRUEwQWdBeUFFS0FJQUlnRlBCRUFnQVNBRUtBSUVhaUFEU3cwREN5QUVLQUlJSWdRTkFBc0xRUUFRbEFJaUFVRi9SZzBESUFJaEIwR00xQVFvQWdBaUJFRUJheUlESUFGeEJFQWdBaUFCYXlBQklBTnFRUUFnQkd0eGFpRUhDeUFHSUFkUERRTkI2Tk1FS0FJQUlnVUVRRUhnMHdRb0FnQWlCQ0FIYWlJRElBUk5JQU1nQlV0eURRUUxJQWNRbEFJaUJDQUJSdzBCREFVTElBY2dDbXNnQlhFaUJ4Q1VBaUlCSUFRb0FnQWdCQ2dDQkdwR0RRRWdBU0VFQ3lBRVFYOUdEUUVnQnlBR1FUQnFUd1JBSUFRaEFRd0VDMEdRMUFRb0FnQWlBU0FJSUFkcmFrRUFJQUZyY1NJQkVKUUNRWDlHRFFFZ0FTQUhhaUVISUFRaEFRd0RDeUFCUVg5SERRSUxRZXpUQkVIczB3UW9BZ0JCQkhJMkFnQUxJQUlRbEFJaUFVRi9Sa0VBRUpRQ0lnSkJmMFp5SUFFZ0FrOXlEUWNnQWlBQmF5SUhJQVpCS0dwTkRRY0xRZURUQkVIZzB3UW9BZ0FnQjJvaUFEWUNBRUhrMHdRb0FnQWdBRWtFUUVIazB3UWdBRFlDQUFzQ1FFSEkwQVFvQWdBaUJRUkFRZkRUQkNFQUEwQWdBU0FBS0FJQUlnTWdBQ2dDQkNJQ2FrWU5BaUFBS0FJSUlnQU5BQXNNQkF0QndOQUVLQUlBSWdCQkFDQUFJQUZORzBVRVFFSEEwQVFnQVRZQ0FBdEJBQ0VBUWZUVEJDQUhOZ0lBUWZEVEJDQUJOZ0lBUWREUUJFRi9OZ0lBUWRUUUJFR0kxQVFvQWdBMkFnQkIvTk1FUVFBMkFnQURRQ0FBUVFOMElnTkI0TkFFYWlBRFFkalFCR29pQWpZQ0FDQURRZVRRQkdvZ0FqWUNBQ0FBUVFGcUlnQkJJRWNOQUF0QnZOQUVJQWRCS0dzaUEwRjRJQUZyUVFkeFFRQWdBVUVJYWtFSGNSc2lBR3NpQWpZQ0FFSEkwQVFnQUNBQmFpSUFOZ0lBSUFBZ0FrRUJjallDQkNBQklBTnFRU2cyQWdSQnpOQUVRWmpVQkNnQ0FEWUNBQXdFQ3lBQUxRQU1RUWh4SUFNZ0JVdHlJQUVnQlUxeURRSWdBQ0FDSUFkcU5nSUVRY2pRQkNBRlFYZ2dCV3RCQjNGQkFDQUZRUWhxUVFkeEd5SUFhaUlCTmdJQVFielFCRUc4MEFRb0FnQWdCMm9pQWlBQWF5SUFOZ0lBSUFFZ0FFRUJjallDQkNBQ0lBVnFRU2cyQWdSQnpOQUVRWmpVQkNnQ0FEWUNBQXdEQzBFQUlRTU1CQXRCQUNFQkRBSUxRY0RRQkNnQ0FDQUJTd1JBUWNEUUJDQUJOZ0lBQ3lBQklBZHFJUUpCOE5NRUlRQUNRQUpBQWtBQ1FBSkFBa0FEUUNBQ0lBQW9BZ0JIQkVBZ0FDZ0NDQ0lBRFFFTUFnc0xJQUF0QUF4QkNIRkZEUUVMUWZEVEJDRUFBMEFnQlNBQUtBSUFJZ0pQQkVBZ0FpQUFLQUlFYWlJRUlBVkxEUU1MSUFBb0FnZ2hBQXdBQ3dBTElBQWdBVFlDQUNBQUlBQW9BZ1FnQjJvMkFnUWdBVUY0SUFGclFRZHhRUUFnQVVFSWFrRUhjUnRxSWdjZ0JrRURjallDQkNBQ1FYZ2dBbXRCQjNGQkFDQUNRUWhxUVFkeEcyb2lDU0FHSUFkcUlnaHJJUUFnQlNBSlJnUkFRY2pRQkNBSU5nSUFRYnpRQkVHODBBUW9BZ0FnQUdvaUFEWUNBQ0FJSUFCQkFYSTJBZ1FNQXd0QnhOQUVLQUlBSUFsR0JFQkJ4TkFFSUFnMkFnQkJ1TkFFUWJqUUJDZ0NBQ0FBYWlJQU5nSUFJQWdnQUVFQmNqWUNCQ0FBSUFocUlBQTJBZ0FNQXdzZ0NTZ0NCQ0lFUVFOeFFRRkdCRUFnQkVGNGNTRUZBa0FnQkVIL0FVMEVRQ0FFUVFOMklRSWdDU2dDRENJQklBa29BZ2dpQTBZRVFFR3cwQVJCc05BRUtBSUFRWDRnQW5keE5nSUFEQUlMSUFNZ0FUWUNEQ0FCSUFNMkFnZ01BUXNnQ1NnQ0dDRUdBa0FnQ1NBSktBSU1JZ0ZIQkVBZ0NTZ0NDQ0lDSUFFMkFnd2dBU0FDTmdJSURBRUxBa0FnQ1VFVWFpSUVLQUlBSWdJTkFDQUpRUkJxSWdRb0FnQWlBZzBBUVFBaEFRd0JDd05BSUFRaEF5QUNJZ0ZCRkdvaUJDZ0NBQ0lDRFFBZ0FVRVFhaUVFSUFFb0FoQWlBZzBBQ3lBRFFRQTJBZ0FMSUFaRkRRQUNRQ0FKS0FJY0lnTkJBblJCNE5JRWFpSUNLQUlBSUFsR0JFQWdBaUFCTmdJQUlBRU5BVUcwMEFSQnROQUVLQUlBUVg0Z0EzZHhOZ0lBREFJTElBWkJFRUVVSUFZb0FoQWdDVVliYWlBQk5nSUFJQUZGRFFFTElBRWdCallDR0NBSktBSVFJZ0lFUUNBQklBSTJBaEFnQWlBQk5nSVlDeUFKS0FJVUlnSkZEUUFnQVNBQ05nSVVJQUlnQVRZQ0dBc2dCU0FKYWlJSktBSUVJUVFnQUNBRmFpRUFDeUFKSUFSQmZuRTJBZ1FnQ0NBQVFRRnlOZ0lFSUFBZ0NHb2dBRFlDQUNBQVFmOEJUUVJBSUFCQmVIRkIyTkFFYWlFQ0FuOUJzTkFFS0FJQUlnRkJBU0FBUVFOMmRDSUFjVVVFUUVHdzBBUWdBQ0FCY2pZQ0FDQUNEQUVMSUFJb0FnZ0xJUUFnQWlBSU5nSUlJQUFnQ0RZQ0RDQUlJQUkyQWd3Z0NDQUFOZ0lJREFNTFFSOGhCQ0FBUWYvLy93ZE5CRUFnQUVFbUlBQkJDSFpuSWdKcmRrRUJjU0FDUVFGMGEwRSthaUVFQ3lBSUlBUTJBaHdnQ0VJQU53SVFJQVJCQW5SQjROSUVhaUVEQWtCQnROQUVLQUlBSWdGQkFTQUVkQ0lDY1VVRVFFRzAwQVFnQVNBQ2NqWUNBQ0FESUFnMkFnQWdDQ0FETmdJWURBRUxJQUJCR1NBRVFRRjJhMEVBSUFSQkgwY2JkQ0VFSUFNb0FnQWhBUU5BSUFFaUFpZ0NCRUY0Y1NBQVJnMERJQVJCSFhZaEFTQUVRUUYwSVFRZ0FpQUJRUVJ4YWlJRFFSQnFLQUlBSWdFTkFBc2dBeUFJTmdJUUlBZ2dBallDR0FzZ0NDQUlOZ0lNSUFnZ0NEWUNDQXdDQzBHODBBUWdCMEVvYXlJRFFYZ2dBV3RCQjNGQkFDQUJRUWhxUVFkeEd5SUFheUlDTmdJQVFjalFCQ0FBSUFGcUlnQTJBZ0FnQUNBQ1FRRnlOZ0lFSUFFZ0EycEJLRFlDQkVITTBBUkJtTlFFS0FJQU5nSUFJQVVnQkVFbklBUnJRUWR4UVFBZ0JFRW5hMEVIY1J0cVFTOXJJZ0FnQUNBRlFSQnFTUnNpQTBFYk5nSUVJQU5CK05NRUtRSUFOd0lRSUFOQjhOTUVLUUlBTndJSVFmalRCQ0FEUVFocU5nSUFRZlRUQkNBSE5nSUFRZkRUQkNBQk5nSUFRZnpUQkVFQU5nSUFJQU5CR0dvaEFBTkFJQUJCQnpZQ0JDQUFRUWhxSVFJZ0FFRUVhaUVBSUFJZ0JFa05BQXNnQXlBRlJnMERJQU1nQXlnQ0JFRitjVFlDQkNBRklBTWdCV3NpQkVFQmNqWUNCQ0FESUFRMkFnQWdCRUgvQVUwRVFDQUVRWGh4UWRqUUJHb2hBQUovUWJEUUJDZ0NBQ0lCUVFFZ0JFRURkblFpQW5GRkJFQkJzTkFFSUFFZ0FuSTJBZ0FnQUF3QkN5QUFLQUlJQ3lFQ0lBQWdCVFlDQ0NBQ0lBVTJBZ3dnQlNBQU5nSU1JQVVnQWpZQ0NBd0VDMEVmSVFBZ0JFSC8vLzhIVFFSQUlBUkJKaUFFUVFoMlp5SUFhM1pCQVhFZ0FFRUJkR3RCUG1vaEFBc2dCU0FBTmdJY0lBVkNBRGNDRUNBQVFRSjBRZURTQkdvaEF3SkFRYlRRQkNnQ0FDSUJRUUVnQUhRaUFuRkZCRUJCdE5BRUlBRWdBbkkyQWdBZ0F5QUZOZ0lBSUFVZ0F6WUNHQXdCQ3lBRVFSa2dBRUVCZG10QkFDQUFRUjlIRzNRaEFDQURLQUlBSVFNRFFDQURJZ0lvQWdSQmVIRWdCRVlOQkNBQVFSMTJJUUVnQUVFQmRDRUFJQUlnQVVFRWNXb2lBVUVRYWlnQ0FDSUREUUFMSUFFZ0JUWUNFQ0FGSUFJMkFoZ0xJQVVnQlRZQ0RDQUZJQVUyQWdnTUF3c2dBaWdDQ0NJQUlBZzJBZ3dnQWlBSU5nSUlJQWhCQURZQ0dDQUlJQUkyQWd3Z0NDQUFOZ0lJQ3lBSFFRaHFJUUFNQkFzZ0FpZ0NDQ0lBSUFVMkFnd2dBaUFGTmdJSUlBVkJBRFlDR0NBRklBSTJBZ3dnQlNBQU5nSUlDMEVBSVFCQnZOQUVLQUlBSWdJZ0JrME5Ba0c4MEFRZ0FpQUdheUlDTmdJQVFjalFCRUhJMEFRb0FnQWlBU0FHYWlJQU5nSUFJQUFnQWtFQmNqWUNCQ0FCSUFaQkEzSTJBZ1FnQVVFSWFpRUFEQUlMQWtBZ0IwVU5BQUpBSUFNb0Fod2lBa0VDZEVIZzBnUnFJZ0FvQWdBZ0EwWUVRQ0FBSUFFMkFnQWdBUTBCUWJUUUJDQUlRWDRnQW5keElnZzJBZ0FNQWdzZ0IwRVFRUlFnQnlnQ0VDQURSaHRxSUFFMkFnQWdBVVVOQVFzZ0FTQUhOZ0lZSUFNb0FoQWlBQVJBSUFFZ0FEWUNFQ0FBSUFFMkFoZ0xJQU1vQWhRaUFFVU5BQ0FCSUFBMkFoUWdBQ0FCTmdJWUN3SkFJQVJCRDAwRVFDQURJQVFnQm1vaUFFRURjallDQkNBQUlBTnFJZ0FnQUNnQ0JFRUJjallDQkF3QkN5QURJQVpCQTNJMkFnUWdBeUFHYWlJRklBUkJBWEkyQWdRZ0JDQUZhaUFFTmdJQUlBUkIvd0ZOQkVBZ0JFRjRjVUhZMEFScUlRQUNmMEd3MEFRb0FnQWlBVUVCSUFSQkEzWjBJZ0p4UlFSQVFiRFFCQ0FCSUFKeU5nSUFJQUFNQVFzZ0FDZ0NDQXNoQkNBQUlBVTJBZ2dnQkNBRk5nSU1JQVVnQURZQ0RDQUZJQVEyQWdnTUFRdEJIeUVBSUFSQi8vLy9CMDBFUUNBRVFTWWdCRUVJZG1jaUFHdDJRUUZ4SUFCQkFYUnJRVDVxSVFBTElBVWdBRFlDSENBRlFnQTNBaEFnQUVFQ2RFSGcwZ1JxSVFFQ1FBSkFJQWhCQVNBQWRDSUNjVVVFUUVHMDBBUWdBaUFJY2pZQ0FDQUJJQVUyQWdBZ0JTQUJOZ0lZREFFTElBUkJHU0FBUVFGMmEwRUFJQUJCSDBjYmRDRUFJQUVvQWdBaEJnTkFJQVlpQWlnQ0JFRjRjU0FFUmcwQ0lBQkJIWFloQVNBQVFRRjBJUUFnQWlBQlFRUnhhaUlCUVJCcUtBSUFJZ1lOQUFzZ0FTQUZOZ0lRSUFVZ0FqWUNHQXNnQlNBRk5nSU1JQVVnQlRZQ0NBd0JDeUFDS0FJSUlnQWdCVFlDRENBQ0lBVTJBZ2dnQlVFQU5nSVlJQVVnQWpZQ0RDQUZJQUEyQWdnTElBTkJDR29oQUF3QkN3SkFJQWhGRFFBQ1FDQUJLQUljSWdKQkFuUkI0TklFYWlJQUtBSUFJQUZHQkVBZ0FDQUROZ0lBSUFNTkFVRzAwQVFnQjBGK0lBSjNjVFlDQUF3Q0N5QUlRUkJCRkNBSUtBSVFJQUZHRzJvZ0F6WUNBQ0FEUlEwQkN5QURJQWcyQWhnZ0FTZ0NFQ0lBQkVBZ0F5QUFOZ0lRSUFBZ0F6WUNHQXNnQVNnQ0ZDSUFSUTBBSUFNZ0FEWUNGQ0FBSUFNMkFoZ0xBa0FnQkVFUFRRUkFJQUVnQkNBR2FpSUFRUU55TmdJRUlBQWdBV29pQUNBQUtBSUVRUUZ5TmdJRURBRUxJQUVnQmtFRGNqWUNCQ0FCSUFacUlnVWdCRUVCY2pZQ0JDQUVJQVZxSUFRMkFnQWdDZ1JBSUFwQmVIRkIyTkFFYWlFQVFjVFFCQ2dDQUNFSEFuOUJBU0FLUVFOMmRDSUNJQWx4UlFSQVFiRFFCQ0FDSUFseU5nSUFJQUFNQVFzZ0FDZ0NDQXNoQXlBQUlBYzJBZ2dnQXlBSE5nSU1JQWNnQURZQ0RDQUhJQU0yQWdnTFFjVFFCQ0FGTmdJQVFialFCQ0FFTmdJQUN5QUJRUWhxSVFBTElBdEJFR29rQUNBQUN4OEFJQUFnQVNBQUlBSVFxZ0VpQWlBQlFRQVFGQ0VCSUFBZ0FoQVRJQUVMRFFBZ0FFRUFJQUZCQUJDVkJBdVlBUUVCZndKQUlBSkZJQUZDZ0lDQWdIQ0RRb0NBZ0lDUWYxSnlSUVJBSUFHbklnTWdBeWdDQUVFQmFqWUNBRUVFSVFJZ0FDZ0NBQ2dDRUNBREVQd0RJZ05CQUVvTkFRc2dBVUlnaUtkQmRVOEVRQ0FCcHlJQ0lBSW9BZ0JCQVdvMkFnQUxRUUloQWlBQUtBSUFJQUJCUUdzb0FnQWdBUkMrQXlJRFFRQk9EUUJCZnc4TElBQWdBaEFRSUFCQlFHc29BZ0FnQXhBNVFRQUxzUVVCQjM4Q1FBSkFBa0FnQUVGQWF5Z0NBQ0lMS0FLWUFpSU9RUUJJRFFCQkFpRU5Ba0FDUUNBTEtBS0FBaUFPYWlJTUxRQUFJZ2hCeHdCckRnUUVBZ0lCQUFzZ0NFSEJBRVlOQWlBSVFiNEJSd1JBSUFoQnVBRkhEUUlnRENnQUFTSUpRUWhHRFFJZ0RDOEFCU0VLSUFsQk9rY0VRQ0FKUWZFQVJnMERJQWxCelFCSERRVUxJQXN0QUc1QkFYRkZEUVFnQUVIUzZ3QkJBQkFXUVg4UEN5QU1Md0FGSVFvZ0RDZ0FBU0VKUVFFaERRd0RDMEVESVEwTUFnc2dCMEc5ZjBZRVFDQUFRWlB2QUVFQUVCWkJmdzhMSUFkQjZ3QnFRUUZOQkVBZ0FFSGE4d0JCQUJBV1FYOFBDeUFIUVY5eFFkc0FSZ1JBSUFCQmhTOUJBQkFXUVg4UEN5QUFRYlR2QUVFQUVCWkJmdzhMSUF3b0FBRWhDVUVCSVEwTFFYOGhCeUFMUVg4MkFwZ0NJQXNnRGpZQ2hBSUNRQUpBSUFZRVFBSkFBa0FDUUFKQUlBaEJ4d0JyRGdRQkF3TUNBQXNDUUNBSVFjRUFSd1JBSUFoQnZnRkdEUUVnQ0VHNEFVY05CQ0FMRURJaEJ5QUFRYnNCRUJBZ0FDQUpFQm9nQUVGQWF5SUdLQUlBSUFjUU9TQUdLQUlBSUFvUUZ5QUxJQWRCQVJCcEdrRThJUWdnQUVFOEVCQU1Cd3NnQUVIQ0FCQVFJQUFnQ1JBYVFjRUFJUWdNQmdzZ0FFRy9BUkFRSUFBZ0NSQWFJQUJCUUdzb0FnQWdDaEFYUWI0QklRZ01CUXNnQUVIeEFCQVFJQUJCRXhBUVFjY0FJUWdNQXdzZ0FFSHdBQkFRSUFCQkZCQVFRY29BSVFnTUFnc1FBUUFMQWtBQ1FBSkFJQWhCeHdCckRnUUJCQVFDQUFzZ0NFRzRBVWNOQXlBTEVESWhCeUFBUWJzQkVCQWdBQ0FKRUJvZ0FFRkFheUlBS0FJQUlBY1FPU0FBS0FJQUlBb1FGeUFMSUFkQkFSQnBHa0U4SVFnTUF3c2dBRUh4QUJBUVFjY0FJUWdNQWdzZ0FFSHdBQkFRUWNvQUlRZ01BUXNnQUNBSUVCQUxJQUVnQ0RZQ0FDQUNJQW8yQWdBZ0F5QUpOZ0lBSUFRZ0J6WUNBQ0FGQkVBZ0JTQU5OZ0lBQzBFQUM4Y01BUVovSXdCQklHc2lCQ1FBQWtBQ1FBSkFBa0FDUUFKQUFrQUNmeUFBS0FJUUlnSkJnMzlIQkVCQkFDQUNRVmxIRFFFYUlBQkJRR3NvQWdBaUFpMEFiRUVCY1VVRVFDQUFRWm54QUVFQUVCWU1Bd3NnQWlnQ1pFVUVRQ0FBUWF6TkFFRUFFQllNQXd0QmZ5RURJQUFRRWcwSUFrQUNRQUpBQWtBZ0FDZ0NFQ0lGUVNsckRnUUNBUUVDQUFzZ0JVSGRBRVlnQlVFNmEwRUNTWElnQlVIOUFFWnlEUUVMSUFBb0FqQU5BRUVBSVFJZ0JVRXFSZ1JBSUFBUUVnMExRUUVoQWdzZ0FDQUJFTFlCUlEwQkRBb0xJQUJCQmhBUVFRQWhBZ3NnQUVGQWF5SUZLQUlBSWdNdEFHd2hBU0FDQkVBZ0F4QXlJUU1nQlNnQ0FCQXlJUUlnQUVIK0FFSDlBQ0FCUVFOR0d4QVFJQUJCRGhBUUlBQkJCaEFRSUFCQkJoQVFJQUFnQXhBZUlBQkJoUUVRRUNBQlFRTkhJZ2RGQkVBZ0FFR0xBUkFRQ3lBQVFZRUJFQkFnQUVIQ0FCQVFJQUJCNlFBUUdpQUFRZW9BUVg4UUhDRUdJQUFnQWhBZVFZa0JJUVVnQUNBSEJIOUJpUUVGSUFCQndRQVFFQ0FBUWNBQUVCb2dBRUdMQVJBUVFZb0JDeEFRSUFCQkVSQVFJQUJCNmdCQmZ4QWNJUVVnQUVFT0VCQWdBRUhyQUNBREVCd2FJQUFnQlJBZUlBQkJBUkFRSUFCQlFHc2lBeWdDQUVFQ0VEa2dBRUdyQVJBUUlBQkI2Z0JCZnhBY0lRVWdBVUVEUnlJSFJRUkFJQUJCaXdFUUVBc2dBRUdHQVJBUUlBTW9BZ0JCQUJCa0lBQkI2Z0JCZnhBY0lRTWdCMFVFUUNBQVFZc0JFQkFMSUFCQmdRRVFFQ0FBUWNJQUVCQWdBRUhwQUJBYUlBQkI2UUFnQWhBY0dpQUFRY0VBRUJBZ0FFSEFBQkFhSUFBZ0F4QWVJQUJCRHhBUUlBQkJEeEFRSUFCQkR4QVFJQUJCQVJEbEFpQUFJQVVRSGlBQVFZWUJFQkFnQUVGQWF5SURLQUlBUVFFUVpDQUFRZW9BUVg4UUhDRUZJQUZCQTBjaUFVVUVRQ0FBUVlzQkVCQUxJQUJCZ1FFUUVDQUFRY0lBRUJBZ0FFSHBBQkFhSUFCQjZRQWdBaEFjR2lBQVFlc0FJQVlRSEJvZ0FDQUZFQjRnQUVHR0FSQVFJQU1vQWdCQkFoQmtJQUJCNmdCQmZ4QWNJUUlnQVVVRVFDQUFRWXNCRUJBTElBQWdBaEFlSUFCQk1CQVFRUUFoQXlBQVFRQVFHaUFBUVVCcktBSUFRUVFRWkNBQUlBWVFIaUFBUWNFQUVCQWdBRUhBQUJBYUlBQkJEeEFRSUFCQkR4QVFJQUJCRHhBUURBa0xJQUZCQTBZRVFDQUFRWXNCRUJBTElBQkJpQUVRRUNBQVFla0FRWDhRSENFQklBQkJBUkRsQWd3RUN5QUFLQUlnQ3lFRlFYOGhBeUFBUWFOL0lBRkJCSElRdWdNTkJpQUFLQUlRSWdKQnFIOUdCRUFnQVVGN2NTRUdJQUJCUUdzb0FnQVFNaUVDQTBBZ0FCQVNEUWdnQUVFUkVCQWdBRUd3QVJBUUlBQkI2UUFnQWhBY0dpQUFRUTRRRUNBQVFRZ2dCaENlQWcwSUlBQW9BaEJCcUg5R0RRQUxJQUFnQWhBZUlBQW9BaEFoQWdzZ0FrRS9SZ1JBSUFBUUVnMEhJQUJCNlFCQmZ4QWNJUUlnQUJCV0RRY2dBRUU2RUN3TkJ5QUFRZXNBUVg4UUhDRUdJQUFnQWhBZUlBQWdBVUVCY1JDMkFRMEhJQUFnQmhBZUlBQW9BaEFoQWdzZ0FrRTlSeUFDUWZzQWFpSURRUXhMY1VVRVFDQUFFQklOQVNBQUlBUkJIR29nQkVFWWFpQUVRUlJxSUFSQkVHcEJBQ0FDUVQxSElBSVF0UUZCQUVnTkFTQUFJQUVRdGdFRVFDQUFLQUlBSUFRb0FoUVFFd3dDQ3lBQ1FUMUdCRUFnQkNnQ0hDSUJRVHhIRFFjZ0JDZ0NGQ0FGUncwR0lBQWdCUkNoQVF3R0N5QUFRYkovSUFOQjhOSUJhaTBBQUNJQklBTkJBa1liSUFFZ0FDZ0NRQzBBYmtFRWNSdEIvd0Z4RUJBZ0JDZ0NIQ0VCREFZTFFRQWhBeUFDUWU0QWFrRUNTdzBHSUFBUUVnMEFJQUFnQkVFY2FpQUVRUmhxSUFSQkZHb2dCRUVRYWlBRVFReHFRUUVnQWhDMUFVRUFTQTBBSUFCQkVSQVFJQUpCbEg5R0JFQWdBRUd3QVJBUUN5QUFRZW9BUWVrQUlBSkJrMzlHRzBGL0VCd2hBaUFBUVE0UUVDQUFJQUVRdGdGRkRRRWdBQ2dDQUNBRUtBSVVFQk1MUVg4aEF3d0ZDeUFFS0FJY0lnRkJQRWNnQkNnQ0ZDSURJQVZIY2tVRVFDQUFJQVVRb1FFTElBUW9BZ3hCQVdzaUJVRURUdzBCSUFBZ0JVRVZha0gvQVhFUUVDQUFJQUVnQkNnQ0dDQURJQVFvQWhCQkFVRUFFTUVCSUFCQjZ3QkJmeEFjSVFFZ0FDQUNFQjRnQkNnQ0RDRURBMEFnQXdSQUlBQkJEeEFRSUFRZ0JDZ0NERUVCYXlJRE5nSU1EQUVMQ3dzZ0FDQUJFQjVCQUNFRERBTUxFQUVBQzBFOElRRUxRUUFoQXlBQUlBRWdCQ2dDR0NBRUtBSVVJQVFvQWhCQkFrRUFFTUVCQ3lBRVFTQnFKQUFnQXd0YUFRTi9Jd0JCRUdzaUFTUUFBa0FnQUNnQ0VDSURRYXgvUmcwQUlBTkJPMGNFUUNBRFFmMEFSZzBCSUFBb0FqQU5BU0FCUVRzMkFnQWdBRUdnbUFFZ0FSQVdRWDhoQWd3QkN5QUFFQkloQWdzZ0FVRVFhaVFBSUFJTEd3QWdBQ0FCUWY4QmNSQVJJQUFvQWdRaEFTQUFJQUlRSFNBQkN6c0FBbjhnQUNBQlFZQ0FCRThFZjBGL0lBQWdBVUdBZ0FSclFRcDJRWUN3QTJvUWl3RU5BUm9nQVVIL0IzRkJnTGdEY2dVZ0FRc1Fpd0VMQ3lrQkFYOGdBa0lnaUtkQmRVOEVRQ0FDcHlJRElBTW9BZ0JCQVdvMkFnQUxJQUFnQVNBQ0VJc0ZDeWtCQVg4Z0FrSWdpS2RCZFU4RVFDQUNweUlESUFNb0FnQkJBV28yQWdBTElBQWdBU0FDRUtzRkM0WUdBd2QvQW53Q2ZpTUFRVEJySWdja0FFRUhJQUpDSUlpbklnUWdCRUVIYTBGdVNSc2hCVUVBSVFRQ1FBSkFBa0FDUUFKQUFud0NRQUpBQWtBQ1FBSkFBa0FDUUVFSElBRkNJSWluSWdZZ0JrRUhhMEZ1U1JzaUJrRUxhZzRUQ2dnSkF3SUxDd3NMQ3dRRkFBRUJDd3NMQmdzTElBVkJBVWNOQ2lBQnB5QUNwMFloQkF3TEN5QUZJQVpHSVFRTUNRc2dCVUY1UncwSUlBR25JQUtuRUlNQ1JTRUVEQWdMSUFHbklBS25SaUFGUVhoR2NTRUVEQWNMSUFWQmYwY05CaUFCcHlBQ3AwWWhCQXdHQ3lBQnA3Y2hDeUFGUVFkSEJFQWdCUTBHSUFLbnR3d0NDeUFDUW9DQWdJREFnWUQ4L3dCOHZ3d0JDeUFCUW9DQWdJREFnWUQ4L3dCOHZ5RUxJQVVFUUNBRlFRZEhEUVVnQWtLQWdJQ0F3SUdBL1A4QWZMOE1BUXNnQXFlM0N5RU1Ba0FnQXdSQUlBeTlJZ0pDLy8vLy8vLy8vLy8vQUlNaUFVS0JnSUNBZ0lDQStQOEFWQ0FMdlNJTlF2Ly8vLy8vLy8vLy93Q0RJZzVDZ0lDQWdJQ0FnUGovQUZoeFJRUkFJQTVDZ1lDQWdJQ0FnUGovQUZRZ0FVS0FnSUNBZ0lDQStQOEFWbk1oQkF3SEN5QURRUUpIRFFFTElBc2dER0VoQkF3RkN5QUNJQTFSSVFRTUJBc2dCVUYyUncwQ0lBQWdCMEVjYWlJR0lBRVF1d0lpQXlBQUlBZEJDR29nQWhDN0FpSUZFSUlDSVFRZ0F5QUdSZ1JBSUFkQkhHb1FHd3NnQlNBSFFRaHFSdzBDSUFkQkNHb1FHd3dDQ3lBRlFYZEhEUUVnQXFjaUJVRUVhaUVJSUFHbklnWkJCR29oQ1FKQUFrQUNRQUpBQWtBQ1FBSkFJQU1PQXdZQkFBRUxJQVlvQWd3aUJFR0FnSUNBZUVjTkFVRUJJUVFnQlNnQ0RFR0FnSUNBZUVZTkJ5QUZLQUlNSVFOQmdJQ0FnSGdoQkF3Q0N5QUdLQUlNSVFRTElBVW9BZ3doQXlBRVFmLy8vLzhIUmcwQkN5QURRZi8vLy84SFJ5RUtRZi8vLy84SElRTWdDZzBCQ3lBRElBUkdJUVFNQXd0QkFDRUVJQVlvQWdnaUF5QUZLQUlJUncwQ1FRQWdDU0FJRU5NQklnUnJJQVFnQXh0RklRUU1BZ3NnQ1NBSUVJSUNJUVFNQVFzZ0JVRjFSdzBBSUFHblFRUnFJQUtuUVFScUVJZ0RSU0VFQ3lBQUlBRVFEeUFBSUFJUUR3c2dCMEV3YWlRQUlBUUxOd0VCZnlBQUlBSVFNU0VGSUFBZ0FoQVBJQVZGQkVBZ0FDQURFQTlCZnc4TElBQWdBU0FGSUFNZ0JCQVpJUVFnQUNBRkVCTWdCQXZDQVFFRmZ5TUFRU0JySWdVa0FBSitBa0FnQWtLQWdJQ0FjSU5DZ0lDQWdKQi9VZ1JBSUFBZ0FoQTNJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BUXNnQUNBRlFRaHFJQUVRUHlJSElBTVFQeUlJYWlBQ3B5SUdLQUlFSWdSQi8vLy8vd2R4YWlBRVFSOTJFSW9ERFFBZ0JVRUlhaUlFSUFFZ0J4Q0lBaG9nQkNBR1FRQWdCaWdDQkVILy8vLy9CM0VRVVJvZ0JDQURJQWdRaUFJYUlBQWdBaEFQSUFRUU5nd0JDeUFBSUFJUUQwS0FnSUNBNEFBTElRSWdCVUVnYWlRQUlBSUxJQUVCZmlBQUlBQWdBaUFCSUFOQkJFRUFFSUlCSWdVZ0FTQUVFTjRCSUFVTE5BRUJmeUFBUVVCcklnRW9BZ0FvQXFRQlFRQk9CRUFnQUVFR0VCQWdBRUhaQUJBUUlBRW9BZ0FpQUNBQUx3R2tBUkFYQ3d1SkF3QUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBRkJ4d0JyRGdRQkRRMENBQXNnQVVFOFJ3UkFJQUZCdmdGSEJFQWdBVUc0QVVZTkJ5QUJRY0VBUncwT0MwRVZJUVFDUUNBRkRnVUdCZ1VFQUE0TFFSc2hCQXdFQ3lBQUtBSUFJQU1RRXlBQUlBUVFIZ3RCc3dFaEJBSkFBa0FDUUNBRkRnVUZCZ0FCQWc0TFFSWWhCQXdFQzBFWklRUU1Bd3RCSFNFRURBSUxRUmNoQVFKQUlBVU9CUW9LQ1FnQUN3dEJIeUVCREFnTFFSZ2hCQXNnQUNBRUVCQUxBa0FnQVVISEFHc09CQU1JQ0FjQUN5QUJRVHhHRFFNZ0FVSEJBRVlOQ0NBQlFiNEJSZzBCSUFGQnVBRkhEUWNMSUFWQkFrOE5DQ0FBUWIwQlFia0JJQVliRUJBTUNRc2dBRUhBQVJBUURBZ0xJQUJCeVFBUUVBOExJQUJCUFJBUUR3dEJHaUVCQ3lBQUlBRVFFQXNnQUVITEFCQVFEd3NRQVFBTElBQkJ3d0FRRUNBQVFVQnJLQUlBSUFNUU9ROExRZjZFQVVHdS9BQkJ0N2tCUWFMaEFCQUFBQXNnQUVGQWF5SUFLQUlBSUFNUU9TQUFLQUlBSUFKQi8vOERjUkFYQzgwVEFRdC9Jd0JCUUdvaUJpUUFJQVJCQUVnRVFDQUFJQVpCS0dwQkFCQ2VBUm9nQmlnQ0tFRUNjU0VFQ3lBQVFVQnJJZ2NvQWdBUU1pRUxJQWNvQWdBUU1pRU1JQWNvQWdBb0FvUUNJUTRDUUNBREJFQWdBRUVSRUJBZ0FFRUdFQkFnQUVHckFSQVFJQUJCNmdBZ0N4QWNHaUFBSUF3UUhnd0JDeUFBUWVzQUlBc1FIQm9nQUNBTUVCNGdBRUVSRUJBTElBQkJRR3NvQWdBb0FvUUNJUThDUUFKQUFrQUNRQUpBSUFBb0FoQWlCMEhiQUVjRVFDQUhRZnNBUmdSQVFYOGhCeUFBRUJJTkJpQUFRZThBRUJBZ0JBUkFJQUJCQ3hBUUlBQkJHeEFRQ3lBQlFVdEdJQUZCVTBaeUlRMGdBVUd6ZjBjaEVBTkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQUtBSVFJZ2RCcDM5SEJFQWdCMEg5QUVZTkN5QUFJQVpCT0dwQkFFRUJRUUFReEFNaUIwRUFTQTBTSUFaQnVBRTJBakFnQmtFQU5nSTBJQUJCUUdzaUNTZ0NBQ0lLS0FLOEFTRUlJQVpCZnpZQ1BDQUdJQWcyQWl3Z0JrRUFOZ0lJSUFjTkFpQUFFQkpGRFFFZ0JpZ0NPQ0VIREFZTElBUkZCRUFnQUNnQ0FFR0kwUUJCQUJCR0RCSUxRWDhoQnlBQUVCSU5FZ0pBSUFFRVFDQUdJQUFnQWhDOEF5SUlOZ0kwSUFoRkRSUWdCa0c0QVRZQ01DQUFRVUJyS0FJQUtBSzhBU0VISUFaQmZ6WUNQQ0FHSUFjMkFpd2dCa0VBTmdJSURBRUxJQUFRb3dJTkV5QUFJQVpCTUdvZ0JrRXNhaUFHUVRScUlBWkJQR29nQmtFSWFrRUFRZnNBRUxVQkRSTUxJQUFvQWhCQi9RQkdEUUlnQUVIb0prRUFFQllNRUFzQ1FDQUFLQUlRUVNCeVFmc0FSdzBBSUFBZ0JrRW9ha0VBRUo0QklnZEJMRVlnQjBIOUFFWnlSU0FIUVQxSGNRMEFBa0FnQmlnQ09DSUhSUVJBSUFRRVFDQUFRZkFBRUJBZ0FFRVlFQkFnQUVFSEVCQWdBRUhSQUJBUUlBQkJHQkFRQ3lBQVFjZ0FFQkFNQVFzZ0JBUkFJQUJCR3hBUUlBQkJCeEFRSUFCQnpBQVFFQ0FBSUFjUUdpQUFRUnNRRUFzZ0FFSENBQkFRSUFrb0FnQWdCeEE1QzBGL0lRY2dBQ0FCSUFKQkFVRi9RUUVRd2dGQkFFZ05FaUFBS0FJUVFmMEFSZzBLSUFCQkxCQXNSUTBMREJJTEFrQUNmeUFHS0FJNElnZEZCRUFnQUVIeEFCQVFJQVJGQkVCQkVpRUlEQU1MUVJnaENpQUFRUmdRRUNBQVFRY1FFQ0FBUWRFQUVCQkJFZ3dCQ3lBRVJRUkFRUkVoQ0F3Q0MwRWJJUW9nQUVFYkVCQWdBRUVIRUJBZ0FFSE1BQkFRSUFBZ0J4QWFRUkVMSVFnZ0FDQUtFQkFMSUFBZ0NCQVFJQUVFUUNBR0lBQWdBaEM4QXlJSU5nSTBJQWhGRFFVZ0IwVU5CQXdHQ3lBQUVLTUNEUVFNQWdzQ1FDQUNCSDhnQUNBR0tBSTRJZ2NRMXdRTkJTQUpLQUlBQlNBS0N5MEFia0VCY1VVTkFDQUdLQUk0SWdkQnpRQkhJQWRCT2tkeERRQWdBRUdGTDBFQUVCWU1CQXNnQkFSQUlBQkJHeEFRSUFCQkJ4QVFJQUJCekFBUUVDQUFJQVlvQWpnUUdpQUFRUnNRRUFzZ0FVRUFJQkFiUlFSQUlBQkJFUkFRSUFCQnVBRVFFQ0FBSUFZb0FqZ2lCeEFhSUFrb0FnQWlDQ0FJTHdHOEFSQVhEQUlMSUFZZ0FDZ0NBQ0FHS0FJNEVCZ2lCellDTkNBQVFjSUFFQkFnQ1NnQ0FDQUhFRGtNQmdzZ0FFRUxFQkFnQUVIVEFCQVFJQUJCUUdzb0FnQWdCaWdDQ0NJSFFRSjBRUVJxSUFkQkJYUkJRR3R5UWZ3QmNSQmtEQVFMSUFBZ0JrRXdhaUFHUVN4cUlBWkJOR29nQmtFOGFpQUdRUWhxUVFCQit3QVF0UUVOQVNBR0tBSUlJUWdDUUFKQUlBZEZCRUJCSGlFSEFrQWdDRUVCYXc0REF3SUFCQXRCSUNFSElBQkJJQkFRREFJTElBaEJBV3NpQ0VFRFR3MEVJQUFnQ0VFQmRFRWJha0gvQVhFUUVBd0VDMEVjSVFjTElBQWdCeEFRQ3lBQVFjY0FFQkFNQWdzZ0FDZ0NBQ0FIRUJNTUNnc2dBRUhCQUJBUUlBa29BZ0FnQnhBNUN5QUJSUTBCSUFZb0FqUWhCd3NnQUNBSElBRVFvUUlOQnlBR0lBQkJRR3NvQWdBb0Fyd0JOZ0lzQ3dKQUlBQW9BaEJCUFVjRVFDQUdLQUl3SVFjTUFRc2dBRUVSRUJBZ0FFRUdFQkFnQUVHckFSQVFJQUJCNlFCQmZ4QWNJUWdnQUJBU0RRY2dBRUVPRUJBZ0FCQldEUWNnQmlnQ01DSUhRYmdCUnlBSFFUeEhjVVVFUUNBQUlBWW9BalFRb1FFTElBQWdDQkFlQ3lBQUlBY2dCaWdDTENBR0tBSTBJQVlvQWp4QkFTQU5FTUVCSUFBb0FoQkIvUUJHRFFCQmZ5RUhJQUJCTEJBc1JRMEJEQWdMQ3lBQVFRNFFFQ0FFQkVBZ0FFRU9FQkFMUVg4aEJ5QUFFQkpGRFFJTUJnc2dBRUhqSUVFQUVCWU1CQXNnQUJBU0RRTWdCaUFBUVVCcklna29BZ0FpQkNnQ3NBSTJBZ2dnQkNBR1FRaHFOZ0t3QWlBR1FYODJBaHdnQmtMLy8vLy9MemNDRkNBR1FvQ0FnSUJ3TndJTUlBUW9BcndCSVFRZ0JrRUJOZ0lrSUFZZ0JEWUNJQ0FBUWYwQUVCQWdBVUZMUmlBQlFWTkdjaUVOQTBBQ1FDQUFLQUlRSWdkQjNRQkdEUUFnQnlJRVFhZC9SeUlLUlFSQUlBQVFFZzBHUWNDUUFTRUlJQUFvQWhBaUJFRXNSaUFFUWQwQVJuSU5CQXNDUUFKQUlBUkIrd0JHSUFSQjJ3Qkdja1VFUUNBRVFTeEhEUUVnQUVHQUFSQVFJQWtvQWdCQkFCQmtJQUJCRGhBUUlBQkJEaEFRREFJTElBQWdCa0VvYWtFQUVKNEJJZ1JCTEVZZ0JFSGRBRVp5UlNBRVFUMUhjUTBBQWtBZ0NrVUVRQ0FFUVQxR0JFQkJ6T0VBSVFnTUNBc2dBRUVBRU5ZRURBRUxJQUJCZ0FFUUVDQUpLQUlBUVFBUVpDQUFRUTRRRUFzZ0FDQUJJQUpCQVNBR0tBSW9RUUp4UVFFUXdnRkJBRWdOQnd3QkN5QUdRUUEyQWpnZ0JrRUFOZ0kwQWtBZ0FRUkFJQVlnQUNBQ0VMd0RJZ1EyQWpRZ0JFVU5CeUFBSUFRZ0FSQ2hBZzBISUFaQnVBRTJBakFnQmlBSktBSUFLQUs4QVRZQ0xBd0JDeUFBRUtNQ0RRY2dBQ0FHUVRCcUlBWkJMR29nQmtFMGFpQUdRVHhxSUFaQk9HcEJBRUhiQUJDMUFRMEhDd0pBSUFwRkJFQWdBQ0FHS0FJNEVOWUVEQUVMSUFCQmdBRVFFQ0FKS0FJQUlBWXRBRGdRWkNBQVFRNFFFQ0FBS0FJUVFUMUhEUUFnQUVFUkVCQWdBRUVHRUJBZ0FFR3JBUkFRSUFCQjZRQkJmeEFjSVFRZ0FCQVNEUVlnQUVFT0VCQWdBQkJXRFFZZ0JpZ0NNQ0lJUWJnQlJ5QUlRVHhIY1VVRVFDQUFJQVlvQWpRUW9RRUxJQUFnQkJBZUN5QUFJQVlvQWpBZ0JpZ0NMQ0FHS0FJMElBWW9BanhCQVNBTkVNRUJDeUFBS0FJUVFkMEFSZzBBSUFkQnAzOUdCRUJCNmVRQUlRZ01CQXNnQUVFc0VDeEZEUUVNQlFzTElBQkJnd0VRRUNBQVFVQnJLQUlBSWdFZ0FTZ0NzQUlvQWdBMkFyQUNJQUFRRWcwREN3SkFJQVZGRFFBZ0FDZ0NFRUU5UncwQVFYOGhCeUFBUWVzQVFYOFFIQ0VCSUFBUUVnMEVJQUFnQ3hBZUlBTUVRQ0FBUVE0UUVBc2dBQkJXRFFRZ0FFSHJBQ0FNRUJ3YUlBQWdBUkFlUVFFaEJ3d0VDeUFEUlFSQUlBQkJoYzhBUVFBUUZnd0RDeUFBUVVCcklnQW9BZ0FvQW9BQ0lBNXFRYk1CSUE4Z0Rtc1FLeG9nQUNnQ0FDZ0NwQUlnQzBFVWJHb2lBQ0FBS0FJQVFRRnJOZ0lBUVFBaEJ3d0RDeUFBSUFoQkFCQVdEQUVMSUFBb0FnQWdCaWdDTkJBVEMwRi9JUWNMSUFaQlFHc2tBQ0FIQzQwQ0FRSi9Jd0JCTUdzaUJTUUFBbjhnQWlBQktBSUFUd1JBSUFVZ0FqWUNKQ0FGSUFNMkFpQWdBRUg3a2dFZ0JVRWdhaEJHUVg4TUFRc0NRQ0FCS0FJRUlBUk9EUUFnQVNBRU5nSUVJQVJCLy84RFNBMEFJQVVnQWpZQ0JDQUZJQU0yQWdBZ0FFR2prd0VnQlJCR1FYOE1BUXNnQVNnQ0NDQUNRUUYwYWlJREx3RUFJZ1pCLy84RFJ3UkFRUUFnQkNBR1JnMEJHaUFGSUFJMkFoZ2dCU0FFTmdJVUlBVWdCallDRUNBQVFkU1NBU0FGUVJCcUVFWkJmd3dCQ3lBRElBUTdBUUJCZnlBQUlBRkJER3BCQkNBQlFSUnFJQUVvQWhCQkFXb1FlQTBBR2lBQklBRW9BaEFpQUVFQmFqWUNFQ0FCS0FJTUlBQkJBblJxSUFJMkFnQkJBQXNoQXlBRlFUQnFKQUFnQXdzVEFDQUFJQUVnQWlBRElBUkJBRUVBRVBnQkN6a0FJQUJCL3dCTkJFQWdBRUVEZGtIOC8vLy9BWEZCb0lFQ2FpZ0NBQ0FBZGtFQmNROExJQUJCZm5GQmpNQUFSaUFBRU5JRVFRQkhjZ3RtQVFGL0FuOUJBQ0FBS0FJSUlnSWdBVThOQUJwQmZ5QUFLQUlNRFFBYUlBQW9BaFFnQUNnQ0FDQUNRUU5zUVFGMklnSWdBU0FCSUFKSkd5SUJJQUFvQWhBUkFRQWlBa1VFUUNBQVFRRTJBZ3hCZnc4TElBQWdBVFlDQ0NBQUlBSTJBZ0JCQUFzTHJBRUNBWDhCZmlBQUtRSUVJZ1NuUWYvLy8vOEhjU0VEQWtBQ1FDQUVRb0NBZ0lBSWcxQkZCRUFnQWlBRElBSWdBMG9iSVFNZ0FFRVFhaUVBQTBBZ0FpQURSZzBDSUFBZ0FrRUJkR292QVFBZ0FVWU5BeUFDUVFGcUlRSU1BQXNBQ3lBQlFmOEJTdzBBSUFJZ0F5QUNJQU5LR3lFRElBQkJFR29oQUNBQlFmOEJjU0VCQTBBZ0FpQURSZzBCSUFBZ0Ftb3RBQUFnQVVZTkFpQUNRUUZxSVFJTUFBc0FDMEYvSVFJTElBSUxwZ0VCQVg4akFFRVFheUlESkFBZ0F5QUNOd01JQWtBZ0FDQUJRWVlCSUFGQkFCQVVJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFJUU9BUkFJQUFnQWlBQlFRRWdBMEVJYWhBdklnSkMvLy8vLzI5V0lBSkNnSUNBZ0xCL2cwS0FnSUNBSUZGeURRRWdBQ0FDRUE4Z0FFR0swd0JCQUJBVlFvQ0FnSURnQUNFQ0RBRUxJQUFnQWhBUElBQWdBU0FESUFOQkNHb1E4UVFoQWdzZ0EwRVFhaVFBSUFJTG93RUNBMzhCZmlBQVFSQnFJUUlnQVNnQ0FDSUVRUUZxSVFNQ1FDQUFLUUlFSWdWQ2dJQ0FnQWlEVUVVRVFDQUNJQVJCQVhScUx3RUFJZ0JCZ1BnRGNVR0FzQU5ISUFNZ0JhZEIvLy8vL3dkeFRuSU5BU0FDSUFOQkFYUnFMd0VBSWdKQmdQZ0RjVUdBdUFOSERRRWdBRUVLZEVHQStEOXhJQUpCL3dkeGNrR0FnQVJxSVFBZ0JFRUNhaUVEREFFTElBSWdCR290QUFBaEFBc2dBU0FETmdJQUlBQUxVUUVEZndKQUEwQWdBVUtBZ0lDQWNGUU5BU0FCcHlJQ0x3RUdJZ1JCTUVZRVFDQUNLQUlnSWdKRkRRSWdBaTBBRVFSQUlBQVF0Z0pCZnc4TElBSXBBd0FoQVF3QkN3c2dCRUVDUmlFREN5QURDeElBSUFBZ0FTQUNJQU1nQkVIS0FCQ2tCQXRPQVFGL0lBQW9BZ3dpQkVVRVFFRUFEd3NnQUNBQUtBSUlRZi8vLy84RFFZR0FnSUI4SUFFZ0FVR0JnSUNBZkV3YklnRWdBVUgvLy8vL0EwNGJhallDQ0NBQUlBSWdBeUFFUVFBUXFnTUxKUUFnQUNBQklBQW9BaEFvQW93QklnQUVmeUFBS0FJb1FRSjJRUUZ4QlVFQUN4Q1dCUXNmQVFGL0lBQW9BZ3dpQTBVRVFFRUFEd3NnQUNBQklBSWdBMEVBRUtvREM5MEJBZ0ovQW40Q1FDQUFJQUFwQXpCQkR4QkpJZ2hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFSQkEzUkJDR29RS1NJR1JRUkFJQUFnQ0JBUERBRUxJQVlnQXpzQkJpQUdJQVE2QUFVZ0JpQUNPZ0FFSUFZZ0FUWUNBRUVBSVFNZ0JFRUFJQVJCQUVvYklRRURRQ0FCSUFOSEJFQWdCU0FEUVFOMElnUnFLUU1BSWdsQ0lJaW5RWFZQQkVBZ0NhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBRUlBWnFJQWszQXdnZ0EwRUJhaUVEREFFTEN5QUlRb0NBZ0lCd1dnUkFJQWluSUFZMkFpQUxJQUFnQ0VFdklBSVFsZ01nQ0E4TFFvQ0FnSURnQUF1REN3SUhmd0YrSXdCQklHc2lDU1FBQWtBQ1FBSkFBa0FDUUFKQUFuOENRQUpBQWtBQ1FBSkFJQUZDSUlpblFRRnFEZ1VEQWdJQUFRSUxJQUFnQXhBUElBQWdBa0htMHdBUWp3RkJmeUVGREFvTElBQWdBeEFQSUFBZ0FrSFIrQUFRandGQmZ5RUZEQWtMSUFBZ0FSQ05CS2NoQmd3QkN5QUJweUVHQWtBRFFDQUdLQUlRSWdkQk1Hb2hDQ0FISUFjb0FoZ2dBbkZCZjNOQkFuUnFLQUlBSVFVRFFDQUZSUVJBSUFZaEIwRUFEQVVMSUFJZ0NDQUZRUUZyUVFOMElnZHFJZ1VvQWdSSEJFQWdCU2dDQUVILy8vOGZjU0VGREFFTEN5QUdLQUlVSUFkcUlRY2dCU2dDQUNJSVFZQ0FnTUIrY1VHQWdJREFBRVlFUUNBQUlBY2dBeEFnREFVTEFrQWdDRUdBZ0lDQUFuRUVRQ0FHTHdFR1FRSkhEUUVnQWtFd1J3MERJQUFnQmlBRElBUVF5d1VoQlF3TEN5QUlRUnAyUVRCeElnaEJNRWNFUUNBSVFTQkhCRUFnQ0VFUVJ3MElJQUFnQnlnQ0JDQUJJQU1nQkJDTEF5RUZEQXdMSUFZdkFRWkJDMFlOQnlBQUlBY29BZ0FvQWhBZ0F4QWdEQVlMSUFBZ0JpQUNJQWNnQlJESUFrVU5BUXdKQ3d0QjJZQUJRYTc4QUVHUHdnQkJ1TllBRUFBQUMwSEsyQUJCcnZ3QVFaRENBRUc0MWdBUUFBQUxRUUVMSVFVRFFBSkFBa0FnQlVVRVFBSkFJQVl0QUFVaUJVRUVjVVVOQUFKQUlBVkJDSEVFUUNBQ1FRQklCRUFnQWtILy8vLy9CM0VpQlNBR0tBSW9UdzBDSUFZZ0IwY05CU0FBSUFFZ0JhMGdBeUFFRU5jQklRVU1EUXNnQmk4QkJrRVZhMEgvL3dOeFFRcExEUUlnQUNBQ0VKNERJZ2hGRFFKQmZ5RUZJQWhCQUU0TkNRd0tDeUFBS0FJUUtBSkVJQVl2QVFaQkdHeHFLQUlVSWdWRkRRRWdCU2dDR0NJSUJFQWdCaUFHS0FJQVFRRnFOZ0lBSUFBZ0JxMUNnSUNBZ0hDRUlnd2dBaUFESUFFZ0JDQUlFUzBBSVFVZ0FDQU1FQThNQ2dzZ0JTZ0NBQ0lGUlEwQklBWWdCaWdDQUVFQmFqWUNBQ0FBSUFrZ0JxMUNnSUNBZ0hDRUlnd2dBaUFGRVJjQUlRVWdBQ0FNRUE4Z0JVRUFTQTBKSUFWRkRRRWdDUzBBQUVFUWNRUkFJQUFnQ1NrREdDSU1wMEVBSUF4Q2dJQ0FnSENEUW9DQWdJQXdVaHNnQVNBRElBUVFpd01oQlNBQUlBa3BBeEFRRHlBQUlBa3BBeGdRRHd3TUN5QUFJQWtwQXdnUUR5QUpMUUFBUVFKeFJRMEhJQVlnQjBjTkF5QUFJQUVnQWlBRFFvQ0FnSUF3UW9DQWdJQXdRWURBQUJCdElRVU1DUXNnQmk4QkJrRVZhMEgvL3dOeFFRdEpEUWNMSUFZb0FoQW9BaXdoQmtFQklRVU1Bd3NnQmtVTkFBTkFJQVlvQWhBaUJVRXdhaUVLSUFVZ0JTZ0NHQ0FDY1VGL2MwRUNkR29vQWdBaEJRTkFJQVZGRFFNZ0FpQUtJQVZCQVd0QkEzUWlCV29pQ0NnQ0JFY0VRQ0FJS0FJQVFmLy8veDl4SVFVTUFRc0xJQVlvQWhRZ0JXb2hDZ0pBSUFnb0FnQWlCVUVhZGtFd2NTSUxRVEJIQkVBZ0MwRVFSdzBCSUFBZ0NpZ0NCQ0FCSUFNZ0JCQ0xBeUVGREFzTFFYOGhCU0FBSUFZZ0FpQUtJQWdReUFKRkRRRU1DZ3NMSUFWQmdJQ0F3QUJ4RFFFTUJBc2dCRUdBZ0FSeEJFQWdBQ0FERUE4Z0FDQUNFTWNDUVg4aEJRd0lDeUFIUlFSQUlBQWdBeEFQSUFBZ0JFR0FNUkJ2SVFVTUNBc2dCeTBBQlNJR1FRRnhSUVJBSUFBZ0F4QVBJQUFnQkVIMzZBQVFieUVGREFnTElBWkJCSEVFUUFKQUlBSkJBRTROQUNBR1FRaHhSU0FITHdFR1FRSkhjZzBBSUFjb0FpZ2dBa0gvLy8vL0IzRkhEUUFnQUNBSElBTWdCQkQ5QXlFRkRBa0xJQUFnQnlBQ0lBTkNnSUNBZ0RCQ2dJQ0FnREFnQkVHSHpnQnlFSUVFSVFVTUJnc2dBQ0FISUFKQkJ4QjZJZ0pGRFFZZ0FpQUROd01BREFJTFFRQWhCUXdBQ3dBTFFRRWhCUXdFQ3lBQUlBTVFEeUFBSUFRZ0FoREFBaUVGREFNTElBQWdBQ0FERUkwQklnRVFEMEYvSVFVZ0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ0lBQWdCRUdVSUJCdklRVU1BZ3NnQUNBREVBOE1BUXNnQUNBREVBOUJmeUVGQ3lBSlFTQnFKQUFnQlFzT0FDQUFRUUFnQVVFUWNoRE9BUXRoQUNBQUlBRWdBa0tBZ0lDQUNIeEMvLy8vL3c5WUJINGdBa0wvLy8vL0Q0TUZRb0NBZ0lEQWZpQUN1YjBpQWtLQWdJQ0F3SUdBL1A4QWZTQUNRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c2dBeUFFUVFkeUVMMEJDNnNCQVFoL0lBQW9BZ2dpQXlBQktBSUlJZ0pIQkVCQmYwRUJJQUlnQTBvYkR3c2dBU2dDRENJRklBQW9BZ3dpQmlBRklBVWdCa2diSWdKcklRZ2dCaUFDYXlFSkFuOERRRUVBSUFKQkFXc2lBa0VBU0EwQkdrRUFJUU5CQUNFRUlBSWdDV29pQnlBR1NRUkFJQUFvQWhBZ0IwRUNkR29vQWdBaEJBc2dBaUFJYWlJSElBVkpCRUFnQVNnQ0VDQUhRUUowYWlnQ0FDRURDeUFESUFSR0RRQUxRWDlCQVNBRElBUkxHd3NMaWdFQkFuOGdBU2dDRUNJRExRQVFSUVJBUVFBUEN3SkFJQU1vQWdCQkFVY0VRQ0FDQkg4Z0FpZ0NBQ0FEYTBFd2EwRURkUVZCQUFzaEJDQUFJQU1RemdVaUEwVUVRRUYvRHdzZ0FDZ0NFQ0FCS0FJUUVKRUNJQUVnQXpZQ0VDQUNSUTBCSUFJZ0F5QUVRUU4wYWtFd2FqWUNBRUVBRHdzZ0FDZ0NFQ0FERUpBRUlBTkJBRG9BRUF0QkFBdDdBUUYvUVg4aEJBSkFJQUFnQVJBbElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQUduSUFJUStRTWhCQ0FBSUFFUUR5QUVEUUFnQTBHQWdBRnhSUVJBUVFBaEJDQURRWUNBQW5GRkRRRWdBQ2dDRUNnQ2pBRWlBa1VOQVNBQ0xRQW9RUUZ4UlEwQkN5QUFRYXdiUVFBUUZVRi9JUVFMSUFRTE5RQWdBQ0FDUVRBZ0FrRUFFQlFpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFGQkFEWUNBRUYvRHdzZ0FDQUJJQUlRbUFFTHhBVUJCSDhqQUVFZ2F5SUlKQUFDUUFKQUFrQUNRQUpBSUFGQ2dJQ0FnSEJVSUFKQy8vLy8vdzlXY2cwQUlBS25JUVlDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQnB5SUZMd0VHUVFKckRoNEFDZ29LQ2dvSkNnb0tDZ29LQ2dvS0Nnb0tCd1lHQlFVRUJBTURBZ0VLQ3lBRktBSW9JZ2NnQmtzTkN5QUdJQWRIRFFrZ0JTMEFCVUVKY1VFSlJ3MEpJQVVvQWhBaEJnTkFBa0FnQmlnQ0xDSUhCRUFnQnlnQ0VDRUdBa0FnQnk4QkJrRUJhdzRDQUFJTkN5QUdMUUFSUlEwQ0RBd0xJQUFnQlNBRElBUVEvUU1oQnd3UEN5QUhMUUFGUVFoeERRQUxEQWtMUVg4aEJ5QUFJQWhCR0dvZ0F4QnVEUXdnQlNnQ0tDQUdUUTBHSUFVb0FpUWdCa0VEZEdvZ0NDc0RHRGtEQUF3TEMwRi9JUWNnQUNBSVFSaHFJQU1RYmcwTElBVW9BaWdnQmswTkJTQUZLQUlrSUFaQkFuUnFJQWdyQXhpMk9BSUFEQW9MSUFBZ0NFRUlhaUFERU1VRkRRY2dCU2dDS0NBR1RRMEVJQVVvQWlRZ0JrRURkR29nQ0NrRENEY0RBQXdKQzBGL0lRY2dBQ0FJUVJScUlBTVFtQUVOQ1NBRktBSW9JQVpORFFNZ0JTZ0NKQ0FHUVFKMGFpQUlLQUlVTmdJQURBZ0xRWDhoQnlBQUlBaEJGR29nQXhDWUFRMElJQVVvQWlnZ0JrME5Ba0VCSVFjZ0JTZ0NKQ0FHUVFGMGFpQUlLQUlVT3dFQURBZ0xRWDhoQnlBQUlBaEJGR29nQXhDWUFRMEhJQVVvQWlnZ0JrME5BU0FGS0FJa0lBWnFJQWdvQWhRNkFBQU1CZ3RCZnlFSElBQWdDRUVVYWlBREVNUUZEUVlnQlNnQ0tDQUdUUTBBSUFVb0FpUWdCbW9nQ0NnQ0ZEb0FBQXdGQ3lBQUlBUkJsQ0FRYnlFSERBVUxJQVVvQWlnZ0JrME5BQ0FBSUFVb0FpUWdCa0VEZEdvZ0F4QWdEQU1MSUFBZ0FoQXhJUVVnQUNBQ0VBOGdCVVVFUUNBQUlBTVFEd3dCQ3lBQUlBRWdCU0FESUFRUTBBRWhCeUFBSUFVUUV3d0RDMEYvSVFjTUFnc2dBQ0FGS0FJa0lBWkJBM1JxSUFNUUlBdEJBU0VIQ3lBSVFTQnFKQUFnQnd1dXlBRURKbjhIZmdOOEl3QkJvQUZySWdnaERpQUlKQUFnQUNnQ0VDRVdRb0NBZ0lEZ0FDRXVBa0FnQUJCN0RRQUNmd0pBQWtBQ1FBSkFBa0FnQVVMLy8vLy9iMWdFUUNBR1FRUnhSUTBCSUFHbklnY29BandoQ0NBSEtBSVlJaG9vQWlRaEZDQWFLQUlnSWhNb0FqQWhCaUFUTHdFcUlRMGdCMEVBTmdJOElBY2dGaWdDakFFMkFoQWdCeWdDSUNFVklBY29BakFoQ2lBSEtBSWtJUkVnRmlBSFFSQnFJaEkyQW93QklCRWdEVUVEZEdvaEhDQVZJUmNnQ2lFTklBY29BZ3hGRFFRTUJRc2dBYWNpR2k4QkJpSUhRUTFHRFFJZ0ZpZ0NSQ0FIUVJoc2FpZ0NFQ0lJRFFFTElBQkJtOHdBUVFBUUZRd0ZDeUFBSUFFZ0FpQUVJQVVnQmlBSUVSWUFJUzRNQkFzZ0ZpZ0NlQ0FPSUJvb0FpQWlFeThCTGlBVEx3RXFJZ3RxSUJNdkFTZ2lCeUFIUVFBZ0JDQUhTQnNnQmtFQ2NVRUJkaHNpQm1wQkEzUWlGV3RMQkVBZ0FCRHBBUXdFQ3lBVExRQVFJUW9nRGlBT1FjZ0FhaUlYTmdKTUlBNGdCRFlDVkNBT0lBbzJBbGdnRGlBWE5nSklJQTRnQVRjRE9DQWFLQUlrSVJRZ0NDQVZRUTlxUWZELy93RnhheUlYSkFBZ0JTRVZJQVlFUUNBSElBUWdCeUFFSUFkSUd5SUlRUUFnQ0VFQVNoc2lDR3NpRlVFQUlBY2dGVThiSVJFRFFBSkFJQWdnQ1VZRVFBTkFJQWdnRVVZTkFpQVhJQWhCQTNScVFvQ0FnSUF3TndNQUlBaEJBV29oQ0F3QUN3QUxJQVVnQ1VFRGRDSVZhaWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ29nQ2lnQ0FFRUJhallDQUFzZ0ZTQVhhaUFCTndNQUlCRkJBV29oRVNBSlFRRnFJUWtNQVFzTElBNGdCellDVkNBWElSVUxJQTRnRlRZQ1FDQU9JQmNnQmtFRGRHb2lFVFlDUkVFQUlRZ0RRQ0FJSUF0SEJFQWdFU0FJUVFOMGFrS0FnSUNBTURjREFDQUlRUUZxSVFnTUFRc0xJQk1vQWhRaENpQU9JQllvQW93Qk5nSXdJQllnRGtFd2FpSVNOZ0tNQVNBVEtBSXdJUVlnRVNBTFFRTjBhaUlJSVJ3TFFRQU1BUXRCQVFzaEJ3TkFBa0FDUUFKQUFrQWdCMFVFUUNBRVFRTjBJU2NnQTBLQWdJQ0FjSU1oTXlBUlFRaHFJUjBnRVVFUWFpRWVJQkZCR0dvaEh5QVZRUWhxSVNBZ0ZVRVFhaUVoSUJWQkdHb2hJaUFTUVJocUlTZ2dCa0hJQVdvaEd5QWNRUmhxSVNrZ0JrSEFBV29oR1NBQ1FpQ0lweUlrUVg1eElTb2dBMElnaUtjaEt5QUVyU0V5SUFPbklTVWdEa0V3YWlFc0lBNUI2QUJxSVNZZ0NDRUhBa0FEUUFKQUlBcEJBV29oRFVJQklTNUNnSUNBZ0RBaEFRSi9Ba0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUovQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQ2kwQUFDSUpRUUZyRHZVQkFBRWxDWklCQ2dzTURRNFBFQkVTRXhRVkdCWVhHUm9iSENFaUl5UWRJQjRmS1Njbktpb3JMTnNCK2dFdExpOHcyUUV4TWpNME5UWTNPRGs1T2pvN253R2lBVDA4UG84QmtBR1JBWk1CbEFHVkFaMEJuZ0doQWFBQm93R1dBWmNCbUFHWkFab0JwQUdtQWFjQm13R2JBWndCbkFFL1FFRkNRMFJzYlc1eWMzUjFiM0J4ZG4xOGVZQUJnUUdDQWNzQnpBSE5BYzRCemdIT0FjNEJ6Z0hPQVhkM2QzaURBWVVCaHdHRUFZWUJpUUdJQVlvQml3R01BWTBCMlFINUFkZ0IyQUhhQWJBQnJ3R3lBYkVCc3dHekFiVUJ0QUdwQWJZQmpnSElBY2tCeWdHckFhd0JyUUdvQWFvQnJnRzNBYmtCdUFHOUFiNEJ2d0hBQWNjQnhnSEJBY0lCd3dIRUFib0J2QUc3QWRRQnhRR3RBZk1CQWdJQ0FnSUNBZ0lDQXdRRkJnZEZSa2RJU1VwTFRFMU9UMUJSVWxOVVZWWlhXRmxhVzF4ZFhsOWdZV0pqWkdWbVoyaHBhbXNJZjM1N2VpWW1KaWJQQWRBQjBRSFNBZFlCQ3lBSUlBbzFBQUUzQXdBZ0NrRUZhaUVOSUFoQkNHb2hCd3p5QVFzZ0V5Z0NOQ0FOS0FBQVFRTjBhaWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQUJOd01BSUFwQkJXb2hEU0FJUVFocUlRY004UUVMSUFnZ0NVRzFBV3V0TndNQUlBaEJDR29oQnd6d0FRc2dDQ0FLTUFBQlF2Ly8vLzhQZ3pjREFDQUtRUUpxSVEwZ0NFRUlhaUVIRE84QkN5QUlJQW95QUFGQy8vLy8vdytETndNQUlBcEJBMm9oRFNBSVFRaHFJUWNNN2dFTElCTW9BalFnQ2kwQUFVRURkR29wQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBcEJBbW9oRFNBSUlBRTNBd0FnQ0VFSWFpRUhETzBCQ3lBVEtBSTBJQW90QUFGQkEzUnFLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBS1FRSnFJUTBnQ0NBR0lBRWdGQ0FTRUl3RUlnRTNBd0FnQ0VFSWFpRUhJQUZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU43QUVNN2dFTElBZ2dCa0V2RUMwM0F3QWdDRUVJYWlFSERPc0JDeUFHSUFoQkNHc2lCeWtEQUNJQlFUQWdBVUVBRUJRaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEzdUFTQUdJQWNwQXdBUUR5QUhJQUUzQXdBTTVBRUxJQWdnQmlBS0tBQUJFRnczQXdBZ0NrRUZhaUVOSUFoQkNHb2hCd3pwQVFzZ0NFS0FnSUNBTURjREFDQUlRUWhxSVFjTTZBRUxJQWhDZ0lDQWdDQTNBd0FnQ0VFSWFpRUhET2NCQ3dKQUFrQUNRQ0FrUVg5R0RRQWdFeTBBRUVFQmNRMEFJQ3BCQWtZRVFDQVpLUU1BSWk1Q0lJaW5RWFJMRFFJTUF3c2dCaUFDRUNVaUxrS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQ0RPMEJDeUFDSVM0Z0pFRjFTUTBCQ3lBdXB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0xqY0RBQ0FJUVFocUlRY001Z0VMSUFoQ2dJQ0FnQkEzQXdBZ0NFRUlhaUVIRE9VQkN5QUlRb0dBZ0lBUU53TUFJQWhCQ0dvaEJ3emtBUXNnQ0NBR0VEUWlBVGNEQUNBSVFRaHFJUWNnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZzNqQVF6bEFRc2dDa0VDYWlFTkFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBS0xRQUJEZ2NBQVFJREJBVUdCd3NDUUNBR0lBWW9BaWdwQXdoQkNCQkpJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FHSUFHbklndEJNRUVERUhvZ01qY0RBQ0FFUVFCTUJFQkJBQ0VKRE9zQkMwRUFJUWNnQmlBbkVDa2lDUTBCSUFZZ0FSQVBDeUFJUW9DQWdJRGdBRGNEQUNBSVFRaHFJUWdNN2dFTEEwQWdCQ0FIUmczcEFTQUZJQWRCQTNRaUNtb3BBd0FpTFVJZ2lLZEJkVThFUUNBdHB5SU1JQXdvQWdCQkFXbzJBZ0FMSUFrZ0Ntb2dMVGNEQUNBSFFRRnFJUWNNQUFzQUN5QVRMd0VvSVFrZ0JpQUdLQUlvS1FNSVFRa1FTU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEZVlCSUFZZ0FhY2lERUV3UVFNUWVpQXlOd01BUVFBaEJ5QUVJQWtnQkNBSlNCc2lDVUVBSUFsQkFFb2JJUThEUUNBSElBOUhCRUFnQmlBU0lBZEJBUkNMQkNJTFJRM25BU0FHSUF3Z0IwR0FnSUNBZUhKQkp4QjZJaEFFUUNBUUlBczJBZ0FnQjBFQmFpRUhEQUlGSUFZb0FoQWdDeERyQVF6b0FRc0FDd3NEUUNBRUlBbEhCRUFnQlNBSlFRTjBhaWtEQUNJdFFpQ0lwMEYxVHdSQUlDMm5JZ2NnQnlnQ0FFRUJhallDQUFzZ0JpQUJJQWtnTFVFSEVLOEJJUWNnQ1VFQmFpRUpJQWRCQUU0TkFRem5BUXNMSUFZcEE2Z0JJaTFDSUlpblFYVlBCRUFnTGFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUFGQjBRRWdMVUVERUJrYUlBWW9BaEFvQW93QktRTUlJaTFDSUlpblFYVlBCRUFnTGFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUFGQnpnQWdMVUVERUJrYUlBZ2dBVGNEQUNBSVFRaHFJUWNNNkFFTElCSXBBd2dpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0FUY0RBQ0FJUVFocUlRY001d0VMSUN0QmRVOEVRQ0FsSUNVb0FnQkJBV28yQWdBTElBZ2dBemNEQUNBSVFRaHFJUWNNNWdFTElBZ2dHaWdDS0NJSEJINGdCeUFIS0FJQVFRRnFOZ0lBSUFldFFvQ0FnSUJ3aEFWQ2dJQ0FnREFMTndNQUlBaEJDR29oQnd6bEFRc2dDQ0FHUW9DQWdJQWdFRWNpQVRjREFDQUlRUWhxSVFjZ0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcza0FRem1BUXNDUUNBR0VPSUZJZ2tFUUNBR0lBa1E0UVVoQnlBR0lBa1FFeUFIRFFFTElBWkJneVZCQUJBVklBaENnSUNBZ09BQU53TUFJQWhCQ0dvaENBem9BUXNnQnlrRGFDSXVRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUdRb0NBZ0lBZ0VFY2lMa0tBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQWhDZ0lDQWdPQUFOd01BSUFoQkNHb2hDQXpwQVFzZ0J5QXVOd05vQ3lBdVFpQ0lwMEYxVHdSQUlDNm5JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQXVOd01BSUFoQkNHb2hCeUF1UW9DQWdJQndnMEtBZ0lDQTRBQlNEZU1CRE9VQkN4QUJBQXNnQ2tFRGFpRU5JQW92QUFFaENRSkFJQVlRUGlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0JDQUpJQVFnQ1VvYklRc2dDU0VIQTBBZ0J5QUxSZzBDSUFVZ0IwRURkR29wQXdBaUxVSWdpS2RCZFU4RVFDQXRweUlNSUF3b0FnQkJBV28yQWdBTElBY2dDV3NoRENBSFFRRnFJUWNnQmlBQklBd2dMVUVIRUs4QlFRQk9EUUFMSUFZZ0FSQVBDeUFJUW9DQWdJRGdBRGNEQUNBSVFRaHFJUWdNNWdFTElBZ2dBVGNEQUNBSVFRaHFJUWNNNFFFTElBWWdDRUVJYXlJSEtRTUFFQThNNEFFTElBWWdDRUVRYXlJSEtRTUFFQThnQnlBSVFRaHJJZ2NwQXdBM0F3QU0zd0VMSUFZZ0NFRVlheUlIS1FNQUVBOGdCeUFJUVJCcklnY3BBd0EzQXdBZ0J5QUlRUWhySWdjcEF3QTNBd0FNM2dFTElBaEJDR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dBVGNEQUNBSVFRaHFJUWNNM1FFTElBaEJFR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dBVGNEQUNBSVFRaHJLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBSUlBRTNBd2dnQ0VFUWFpRUhETndCQ3lBSVFSaHJLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBSUlBRTNBd0FnQ0VFUWF5a0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnY2dCeWdDQUVFQmFqWUNBQXNnQ0NBQk53TUlJQWhCQ0dzcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnQVRjREVDQUlRUmhxSVFjTTJ3RUxJQWdnQ0VFSWF5SUhLUU1BTndNQUlBaEJFR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlLSUFvb0FnQkJBV28yQWdBTElBY2dBVGNEQUNBSVFRaHFJUWNNMmdFTElBZ2dDRUVJYXlJSEtRTUFJZ0UzQXdBZ0J5QUlRUkJySWdjcEF3QTNBd0FnQVVJZ2lLZEJkVThFUUNBQnB5SUtJQW9vQWdCQkFXbzJBZ0FMSUFjZ0FUY0RBQ0FJUVFocUlRY00yUUVMSUFnZ0NFRUlheUlIS1FNQUlnRTNBd0FnQ0VFUWF5SUtLUU1BSVMwZ0NpQUlRUmhySWdvcEF3QTNBd0FnQnlBdE53TUFJQUZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFLSUFFM0F3QWdDRUVJYWlFSEROZ0JDeUFJSUFoQkNHc2lCeWtEQUNJQk53TUFJQWhCRUdzaUNpa0RBQ0V0SUFvZ0NFRVlheUlLS1FNQU53TUFJQWNnTFRjREFDQUtJQWhCSUdzaUJ5a0RBRGNEQUNBQlFpQ0lwMEYxVHdSQUlBR25JZ29nQ2lnQ0FFRUJhallDQUFzZ0J5QUJOd01BSUFoQkNHb2hCd3pYQVFzZ0NFRVFheUlIS1FNQUlRRWdCeUFJUVJocklnY3BBd0EzQXdBZ0J5QUJOd01BRE5BQkN5QUlRUmhySWdjcEF3QWhBU0FISUFoQkVHc2lCeWtEQURjREFDQUlRUWhySWdvcEF3QWhMU0FLSUFFM0F3QWdCeUF0TndNQURNOEJDeUFJUVNCcklnY3BBd0FoQVNBSElBaEJHR3NpQnlrREFEY0RBQ0FJUVJCcklnb3BBd0FoTFNBS0lBaEJDR3NpQ2lrREFEY0RBQ0FISUMwM0F3QWdDaUFCTndNQURNNEJDeUFJUVNocklnY3BBd0FoQVNBSElBaEJJR3NpQnlrREFEY0RBQ0FJUVJocklnb3BBd0FoTFNBS0lBaEJFR3NpQ2lrREFEY0RBQ0FISUMwM0F3QWdDaUFJUVFocklnY3BBd0EzQXdBZ0J5QUJOd01BRE0wQkN5QUlRUWhySWdjcEF3QWhBU0FISUFoQkVHc2lCeWtEQURjREFDQUlRUmhySWdvcEF3QWhMU0FLSUFFM0F3QWdCeUF0TndNQURNd0JDeUFJUVJCcklnY3BBd0FoQVNBSElBaEJHR3NpQnlrREFEY0RBQ0FJUVNCcklnb3BBd0FoTFNBS0lBRTNBd0FnQnlBdE53TUFETXNCQ3lBSVFSQnJJZ2NwQXdBaEFTQUhJQWhCR0dzaUJ5a0RBRGNEQUNBSVFTQnJJZ29wQXdBaExTQUtJQWhCS0dzaUNpa0RBRGNEQUNBSElDMDNBd0FnQ2lBQk53TUFETW9CQ3lBSVFRaHJJZ2NwQXdBaEFTQUhJQWhCRUdzaUJ5a0RBRGNEQUNBSElBRTNBd0FNeVFFTElBaEJJR3NpQnlrREFDRUJJQWNnQ0VFUWF5SUhLUU1BTndNQUlBaEJDR3NpQ2lrREFDRXRJQW9nQ0VFWWF5SUtLUU1BTndNQUlBY2dBVGNEQUNBS0lDMDNBd0FNeUFFTElCTW9BalFnRFNnQUFFRURkR29wQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dCaUFCSUJRZ0VoQ01CQ0lCTndNQUlBaEJDR29oQnlBS1FRVnFJUTBnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTEvRE0wQkN5QUpRZTRCYXd3QkN5QUtRUU5xSVEwZ0NpOEFBUXNoQ3lBU0lBMDJBaUFnQmlBSUlBdEJBM1JySWd4QkNHc3BBd0JDZ0lDQWdEQkNnSUNBZ0RBZ0N5QU1RUUFRMkFFaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEzT0FVRi9JUWNnQ1VFalJnM1JBUU5BSUFjZ0MwY0VRQ0FHSUF3Z0IwRURkR29wQXdBUUR5QUhRUUZxSVFjTUFRc0xJQWdnQzBGL2MwRURkR29pQ0NBQk53TUFJQWhCQ0dvaEJ3ektBUXNnQ2k4QUFTRUpJQklnQ2tFRGFpSU5OZ0lnUVg0aEJ5QUdJQWdnQ1VFRGRHc2lDMEVRYXlrREFDQUxRUWhyS1FNQUlBa2dDMEVBRUlvRUlnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTnpRRURRQ0FISUFsSEJFQWdCaUFMSUFkQkEzUnFLUU1BRUE4Z0IwRUJhaUVIREFFTEN5QUlRWDRnQ1d0QkEzUnFJZ2dnQVRjREFDQUlRUWhxSVFjTXlRRUxJQW92QUFFaEN5QVNJQXBCQTJvaURUWUNJQ0FHSUFnZ0MwRURkR3NpREVFSWF5a0RBQ0FNUVJCcktRTUFRb0NBZ0lBd0lBc2dERUVBRU5nQklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTnpBRkJmaUVISUFsQkpVWU56d0VEUUNBSElBdEhCRUFnQmlBTUlBZEJBM1JxS1FNQUVBOGdCMEVCYWlFSERBRUxDeUFJUVg0Z0MydEJBM1JxSWdnZ0FUY0RBQ0FJUVFocUlRY015QUVMSUFwQkEyb2hEU0FLTHdBQklRc2dCaEErSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOeXdFZ0NDQUxRUU4wYXlFSlFRQWhCd0pBQTBBZ0J5QUxSZzBCSUFZZ0FTQUhRWUNBZ0lCNGNpQUpJQWRCQTNScUlnd3BBd0JCaDRBQkVCa2hEeUFNUW9DQWdJQXdOd01BSUFkQkFXb2hCeUFQUVFCT0RRQUxJQVlnQVJBUERNd0JDeUFKSUFFM0F3QWdDVUVJYWlFSERNY0JDeUFLUVFOcUlRMGdCaUFJUVJocklna3BBd0FnQ0NBSVFSQnJJZ2NnQ2k4QUFSQ2RBeUlCUW9DQWdJQndnMEtBZ0lDQTRBQlJEY29CSUFZZ0NTa0RBQkFQSUFZZ0J5a0RBQkFQSUFZZ0NFRUlheWtEQUJBUElBa2dBVGNEQUF6R0FRdENnSUNBZ0JBaExnSkFJQWhCQ0dzcEF3QWlBVUwvLy8vL2IxWU5BRUtCZ0lDQUVDRXVJQUZDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFJQUJCbFBnQVFRQVFGUXpLQVFzZ0NDQXVOd01BSUFoQkNHb2hCd3pGQVFzZ00wS0FnSUNBTUZJTnZnRWdCa0hSbEFGQkFCQVZETWdCQ3lBSVFRaHJLUU1BSWkxQy8vLy8vMjlZRGI4QklBaEJFR3NwQXdBaEFTQXRweUlITHdFR0VPNEJSUTIvQVNBSEtBSW9JZ2RGRGI4QklBY29BaEFpQ1VFd2FpRUxJQWtnQ1NnQ0dFRi9jMEVDZEVIQWVYSnFLQUlBSVFrQ1FBTkFJQWtFUUNBTElBbEJBV3RCQTNRaUNXb2lEQ2dDQkVIUEFVWU5BaUFNS0FJQVFmLy8veDl4SVFrTUFRc0xJQVpCbi9VQVFRQVFGUXpJQVFzZ0FVS0FnSUNBY0ZRTnZ3RWdCeWdDRkNBSmFpa0RBQ0l0UW9DQWdJQndnMEtBZ0lDQWdIOVNEYjhCSUFZb0FoQWdMUkNOQWlFSklBR25LQUlRSWdkQk1Hb2hDeUFISUFrZ0J5Z0NHSEZCZjNOQkFuUnFLQUlBSVFjRFFDQUhCRUFnQ3lBSFFRRnJRUU4wYWlJSEtBSUVJQWxHRGI4QklBY29BZ0JCLy8vL0gzRWhCd3dCQ3dzZ0JrR3VNRUVBRUJVTXh3RUxJQWhCQ0dzaURDa0RBQ0lCUXYvLy8vOXZXQTIrQVNBSVFSQnJJZ2twQXdBaExTQUJweUlMS0FJUUlnZEJNR29oRHlBSElBY29BaGhCZjNOQkFuUkJ3SGx5YWlnQ0FDRUhBa0FDUUFOQUlBY0VRQ0FQSUFkQkFXdEJBM1FpQjJvaUVDZ0NCRUhQQVVZTkFpQVFLQUlBUWYvLy94OXhJUWNNQVFzTElBWkI5d0FRNEFVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEzSUFTQUdJQXRCendGQkJ4QjZJZ2RGQkVBZ0JpQUJFQThNeVFFTElBRkNJSWluUVhWUEJFQWdBYWNpQ3lBTEtBSUFRUUZxTmdJQUN5QUhJQUUzQXdBTUFRc2dDeWdDRkNBSGFpa0RBQ0lCUWlDSXAwRjFTUTBBSUFHbklnY2dCeWdDQUVFQmFqWUNBQXNnQmlnQ0VDQUJFSTBDSVFjZ0xVTC8vLy8vYjFnRVFDQUdFQ1FnQmlBSEVCTU14d0VMSUFZZ0xhY2dCMEVIRUhvaEN5QUdJQWNRRXlBTFJRM0dBU0FMUW9DQWdJQXdOd01BSUFZZ0NTa0RBQkFQSUFZZ0RDa0RBQkFQSUFraEJ3ekNBUXNnQmlBSVFRaHJJZ2dwQXdBUWlnRU14UUVMSUFwQkJtb2hEU0FLS0FBQklRY0NRQUpBQWtBQ1FBSkFBa0FnQ2kwQUJTSUpEZ1VBQVFJREJBVUxJQVlnQjBIT0hSQ1BBUXpKQVFzZ0JpQUhFTjhGRE1nQkN5QUdJQWNRMlFFTXh3RUxJQVpCdnBjQlFRQVF4Z0lNeGdFTElBWkJ4dkVBUVFBUUZRekZBUXNnRGlBSk5nSVFJQVpCM2ZzQUlBNUJFR29RUmd6RUFRc2dDaThBQVNFSklBb3ZBQU1oRENBU0lBcEJCV29pRFRZQ0lFRi9JUWNDZmlBR0lBZ2dDVUVEZEdzaUMwRUlheUlQS1FNQUlBWXBBN2dCRUZJRVFDQUdRb0NBZ0lBd0lBa0VmaUFMS1FNQUJVS0FnSUNBTUF0QkFpQU1RUUZyRUp3RERBRUxJQVlnRHlrREFFS0FnSUNBTUVLQWdJQ0FNQ0FKSUF0QkFCRFlBUXNpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTNEQVFOQUlBY2dDVWNFUUNBR0lBc2dCMEVEZEdvcEF3QVFEeUFIUVFGcUlRY01BUXNMSUFnZ0NVRi9jMEVEZEdvaUNDQUJOd01BSUFoQkNHb2hCd3kvQVFzZ0NrRURhaUVOSUFvdkFBRWhEeUFHSUE1QjRBQnFJQWhCQ0dzaUJ5a0RBQkNKQkNJSlJRM0NBUUorSUFZZ0NFRVFheUlMS1FNQUlBWXBBN2dCRUZJRVFDQUdRb0NBZ0lBd0lBNG9BbUFpREFSK0lBa3BBd0FGUW9DQWdJQXdDMEVDSUE5QkFXc1FuQU1NQVFzZ0JpQUxLUU1BUW9DQWdJQXdJQTRvQW1BaURDQUpFQ0VMSVFFZ0JpQUpJQXdRbXdNZ0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEzQ0FTQUdJQXNwQXdBUUR5QUdJQWNwQXdBUUR5QUxJQUUzQXdBTXZnRUxJQWhCRUdzaUJ5QUdRb0NBZ0lBd0lBY3BBd0FnQ0VFSWF5SUhLUU1BRU40Rk53TUFETDBCQ3lBR0lBaEJDR3NpQnlrREFCRG9BU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEY0FCSUFZZ0J5a0RBQkFQSUFjZ0FUY0RBQXkyQVFzZ0NFRUlheUlIS1FNQUlRRUNRQ0FHRU9JRklnbEZCRUJDZ0lDQWdDQWhMZ3dCQ3lBR0lBa1FYQ0V1SUFZZ0NSQVRJQzVDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU53QUVMSUFZZ0RrR0FBV29RelFJaUxVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBWWdMaEFQRE1BQkN5QU9JQTRwQTRBQklpODNBMkFnRGlBQk53TjRJQTRnTGpjRGNDQU9JQTRwQTRnQklnRTNBMmdnQmtFOFFRUWdEa0hnQUdvUW1nTWdCaUF1RUE4Z0JpQXZFQThnQmlBQkVBOGdCaUFIS1FNQUVBOGdCeUF0TndNQURMVUJDeUFLUVFWcUlRMGdHeWdDQUNnQ0VDSUhRVEJxSVF3Z0J5QUtLQUFCSWdrZ0J5Z0NHSEZCZjNOQkFuUnFLQUlBSVFjQ1FBTkFJQWNFUUVFQklRc2dEQ0FIUVFGclFRTjBhaUlIS0FJRUlBbEdEUUlnQnlnQ0FFSC8vLzhmY1NFSERBRUxDeUFHSUFZcEE4QUJJQWtRY1NJTFFRQklEYjhCQ3lBSUlBdEJBRWV0UW9DQWdJQVFoRGNEQUNBSVFRaHFJUWNNdWdFTElBbEJOMnNoQ3lBS1FRVnFJUTBnR3lnQ0FDSU1LQUlRSWdkQk1Hb2hEeUFISUFvb0FBRWlDU0FIS0FJWWNVRi9jMEVDZEdvb0FnQWhCd0pBQWtBRFFDQUhSUTBCSUFrZ0R5QUhRUUZyUVFOMElnZHFJaEFvQWdSSEJFQWdFQ2dDQUVILy8vOGZjU0VIREFFTEN5QU1LQUlVSUFkcUtRTUFJaTVDZ0lDQWdIQ0RJZ0ZDZ0lDQWdNQUFVUVJBSUFZZ0NSRFpBUXpBQVFzZ0xrSWdpS2RCZFVrTkFTQXVweUlISUFjb0FnQkJBV28yQWdBTUFRc2dCaUFHS1FQQUFTSUJJQWtnQVNBTEVCUWlMa0tBZ0lDQWNJTWhBUXNnQVVLQWdJQ0E0QUJSRGIwQklBZ2dMamNEQUNBSVFRaHFJUWNNdVFFTElBcEJCV29oRFNBR0lBb29BQUVnQ0VFSWF5SUhLUU1BSUFsQk9Xc1EzUVZCQUVnTmFneTRBUXNnQ2tFRmFpRU5JQW9vQUFFaENTQUlRUkJySWdjb0FnQkZCRUFnQmlBSkVNY0NETHdCQ3lBR0lBa2dDRUVJYXlrREFFRUNFTjBGSWdoQkFFNE50d0VnQ0VFZWRrRUNjUXk0QVFzZ0NrRUdhaUVOSUJrb0FnQWlEQ2dDRUNJSlFUQnFJUThnQ1NBS0tBQUJJZ2NnQ1NnQ0dIRkJmM05CQW5ScUtBSUFJUWtnQ2l3QUJTRUxBa0FEUUNBSlJRMEJJQWNnQ1VFRGRDQVBha0VJYXlJSktBSUVSd1JBSUFrb0FnQkIvLy8vSDNFaENRd0JDd3NnQzBFQVNBUkFJQWt0QUFOQkJIRU5zUUVNc3dFTElBdEJ3QUJ4UlEyd0FTQUpLQUlBSWdsQmdJQ0FJSEVOc0FFZ0NVR0FnSUNBZkhGQmdJQ0FnQVJHRGE4QklBbEJnSUNBd0FGeFFZQ0FnTUFCUmcyd0FReXZBUXNnQzBFQVRnMnRBUXl2QVFzZ0Npd0FCU0lIUVFGeFFRWnlJQWRCQW5GQkJYSWdCMEVBVGlJSEd5RVFJQmtnR3lBSEd5Z0NBQ0lKS0FJUUlnd2dDaWdBQVNJUElBd29BaGh4UVg5elFRSjBhaWdDQUNFTElBcEJCbW9oRFNBTVFUQnFJUXdEUUNBTEJFQWdEQ0FMUVFGclFRTjBhaUlMS0FJRUlBOUdEYkVCSUFzb0FnQkIvLy8vSDNFaEN3d0JDd3NnQ1MwQUJVRUJjVVVOcndFZ0JpQUpJQThnRUJCNklnbEZEYmtCSUFsQ2dJQ0FnREJDZ0lDQWdNQUFJQWNiTndNQURLOEJDeUFLUVFacUlRMGdHU2tEQUNJQnB5Z0NFQ0lIUVRCcUlRd2dCeUFLS0FBQklnc2dCeWdDR0hGQmYzTkJBblJxS0FJQUlRY2dDaTBBQlNFUElBWWdBU0FMSUFoQkNHc2lDU2tEQUVLQWdJQ0FNRUtBZ0lDQU1BSi9Ba0FEUUNBSFJRMEJJQWRCQTNRZ0RHcEJDR3NpRUNnQ0FDRUhJQXNnRUNnQ0JFY0VRQ0FIUWYvLy94OXhJUWNNQVFzTFFZREFBU0FIUVlDQWdDQnhSUTBCR2dzZ0QwR0d6Z0Z5Q3hCdFFRQklEYmdCSUFZZ0NTa0RBQkFQSUFraEJ3eTBBUXNnRVNBS0x3QUJRUU4wYWlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDa0VEYWlFTklBZ2dBVGNEQUNBSVFRaHFJUWNNc3dFTElBWWdFU0FLTHdBQlFRTjBhaUFJUVFocklnY3BBd0FRSUNBS1FRTnFJUTBNc2dFTElCRWdDaThBQVVFRGRHb2hCeUFJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaURTQU5LQUlBUVFGcU5nSUFDeUFLUVFOcUlRMGdCaUFISUFFUUlBeXJBUXNnRlNBS0x3QUJRUU4wYWlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDa0VEYWlFTklBZ2dBVGNEQUNBSVFRaHFJUWNNc0FFTElBWWdGU0FLTHdBQlFRTjBhaUFJUVFocklnY3BBd0FRSUNBS1FRTnFJUTBNcndFTElCVWdDaThBQVVFRGRHb2hCeUFJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaURTQU5LQUlBUVFGcU5nSUFDeUFLUVFOcUlRMGdCaUFISUFFUUlBeW9BUXNnRVNBS0xRQUJRUU4wYWlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDa0VDYWlFTklBZ2dBVGNEQUNBSVFRaHFJUWNNclFFTElBWWdFU0FLTFFBQlFRTjBhaUFJUVFocklnY3BBd0FRSUNBS1FRSnFJUTBNckFFTElCRWdDaTBBQVVFRGRHb2hCeUFJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaURTQU5LQUlBUVFGcU5nSUFDeUFLUVFKcUlRMGdCaUFISUFFUUlBeWxBUXNnRVNrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDQ0FCTndNQUlBaEJDR29oQnd5cUFRc2dIU2tEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQUJOd01BSUFoQkNHb2hCd3lwQVFzZ0hpa0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnY2dCeWdDQUVFQmFqWUNBQXNnQ0NBQk53TUFJQWhCQ0dvaEJ3eW9BUXNnSHlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDQ0FCTndNQUlBaEJDR29oQnd5bkFRc2dCaUFSSUFoQkNHc2lCeWtEQUJBZ0RLWUJDeUFHSUIwZ0NFRUlheUlIS1FNQUVDQU1wUUVMSUFZZ0hpQUlRUWhySWdjcEF3QVFJQXlrQVFzZ0JpQWZJQWhCQ0dzaUJ5a0RBQkFnREtNQkN5QUlRUWhyS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUdJQkVnQVJBZ0RKd0JDeUFJUVFocktRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUIwZ0FSQWdESnNCQ3lBSVFRaHJLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBR0lCNGdBUkFnREpvQkN5QUlRUWhyS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUdJQjhnQVJBZ0RKa0JDeUFWS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUlJQUUzQXdBZ0NFRUlhaUVIREo0QkN5QWdLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBSUlBRTNBd0FnQ0VFSWFpRUhESjBCQ3lBaEtRTUFJZ0ZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFJSUFFM0F3QWdDRUVJYWlFSERKd0JDeUFpS1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQnlBSEtBSUFRUUZxTmdJQUN5QUlJQUUzQXdBZ0NFRUlhaUVIREpzQkN5QUdJQlVnQ0VFSWF5SUhLUU1BRUNBTW1nRUxJQVlnSUNBSVFRaHJJZ2NwQXdBUUlBeVpBUXNnQmlBaElBaEJDR3NpQnlrREFCQWdESmdCQ3lBR0lDSWdDRUVJYXlJSEtRTUFFQ0FNbHdFTElBaEJDR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBWWdGU0FCRUNBTWtBRUxJQWhCQ0dzcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQVlnSUNBQkVDQU1qd0VMSUFoQkNHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFZZ0lTQUJFQ0FNamdFTElBaEJDR3NwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBWWdJaUFCRUNBTWpRRUxJQlFvQWdBb0FoQXBBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0FUY0RBQ0FJUVFocUlRY01rZ0VMSUJRb0FnUW9BaEFwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlISUFjb0FnQkJBV28yQWdBTElBZ2dBVGNEQUNBSVFRaHFJUWNNa1FFTElCUW9BZ2dvQWhBcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnQVRjREFDQUlRUWhxSVFjTWtBRUxJQlFvQWd3b0FoQXBBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFnZ0FUY0RBQ0FJUVFocUlRY01qd0VMSUFZZ0ZDZ0NBQ2dDRUNBSVFRaHJJZ2NwQXdBUUlBeU9BUXNnQmlBVUtBSUVLQUlRSUFoQkNHc2lCeWtEQUJBZ0RJMEJDeUFHSUJRb0FnZ29BaEFnQ0VFSWF5SUhLUU1BRUNBTWpBRUxJQVlnRkNnQ0RDZ0NFQ0FJUVFocklnY3BBd0FRSUF5TEFRc2dGQ2dDQUNnQ0VDRUhJQWhCQ0dzcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJS0lBb29BZ0JCQVdvMkFnQUxJQVlnQnlBQkVDQU1oQUVMSUJRb0FnUW9BaEFoQnlBSVFRaHJLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lDaUFLS0FJQVFRRnFOZ0lBQ3lBR0lBY2dBUkFnRElNQkN5QVVLQUlJS0FJUUlRY2dDRUVJYXlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdvZ0NpZ0NBRUVCYWpZQ0FBc2dCaUFISUFFUUlBeUNBUXNnRkNnQ0RDZ0NFQ0VISUFoQkNHc3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SUtJQW9vQWdCQkFXbzJBZ0FMSUFZZ0J5QUJFQ0FNZ1FFTElCUWdDaThBQVVFQ2RHb29BZ0FvQWhBcEF3QWlBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQXBCQTJvaERTQUlJQUUzQXdBZ0NFRUlhaUVIRElZQkN5QUdJQlFnQ2k4QUFVRUNkR29vQWdBb0FoQWdDRUVJYXlJSEtRTUFFQ0FnQ2tFRGFpRU5ESVVCQ3lBVUlBb3ZBQUZCQW5ScUtBSUFLQUlRSVFjZ0NFRUlheWtEQUNJQlFpQ0lwMEYxVHdSQUlBR25JZzBnRFNnQ0FFRUJhallDQUFzZ0NrRURhaUVOSUFZZ0J5QUJFQ0FNZmdzZ0NrRURhaUVOSUJRZ0NpOEFBU0lIUVFKMGFpZ0NBQ2dDRUNrREFDSUJRb0NBZ0lCd2cwS0FnSUNBd0FCU0JFQWdBVUlnaUtkQmRVOEVRQ0FCcHlJSElBY29BZ0JCQVdvMkFnQUxJQWdnQVRjREFDQUlRUWhxSVFjTWhBRUxJQVlnRXlBSFFRRVF4UUlNaHdFTElBcEJBMm9oRFNBVUlBb3ZBQUVpQjBFQ2RHb29BZ0FvQWhBaUNUVUNCRUlnaGtLQWdJQ0F3QUJTQkVBZ0JpQUpJQWhCQ0dzaUJ5a0RBQkFnRElNQkN5QUdJQk1nQjBFQkVNVUNESVlCQ3lBS1FRTnFJUTBnRkNBS0x3QUJJZ2RCQW5ScUtBSUFLQUlRSWdrMUFnUkNJSVpDZ0lDQWdNQUFVZ1JBSUFZZ0V5QUhRUUVReFFJTWhnRUxJQVlnQ1NBSVFRaHJJZ2NwQXdBUUlBeUJBUXNnQmlBUklBb3ZBQUZCQTNScVFvQ0FnSURBQUJBZ0lBcEJBMm9oRFF4NkN5QUtRUU5xSVEwZ0VTQUtMd0FCSWdkQkEzUnFLUU1BSWdGQ2dJQ0FnSENEUW9DQWdJREFBRklFUUNBQlFpQ0lwMEYxVHdSQUlBR25JZ2NnQnlnQ0FFRUJhallDQUFzZ0NDQUJOd01BSUFoQkNHb2hCd3lBQVFzZ0JpQVRJQWRCQUJERkFneURBUXNnQ2tFRGFpRU5JQkVnQ2k4QUFTSUhRUU4wYWlJSk5RSUVRaUNHUW9DQWdJREFBRklFUUNBR0lBa2dDRUVJYXlJSEtRTUFFQ0FNZndzZ0JpQVRJQWRCQUJERkFneUNBUXNnQ2tFRGFpRU5JQkVnQ2k4QUFVRURkR29pQnpVQ0JFSWdoa0tBZ0lDQXdBQlNCRUFnQmtIazd3QkJBQkRHQWd5Q0FRc2dCaUFISUFoQkNHc2lCeWtEQUJBZ0RIMExJQklvQWh3aENTQU5Md0FBSVFzRFFDQUpJZ2NnS0VZTllTQUhLQUlFSVFrZ0IwRUNheThCQUNBTFJ3MEFJQWRCQTJzaURTMEFBRUVDY1EwQUlCSW9BaFFnQzBFRGRHb3BBd0FpQVVJZ2lLZEJkVThFUUNBQnB5SU1JQXdvQWdCQkFXbzJBZ0FMSUFjZ0FUY0RFQ0FISUFkQkVHbzJBZ2dnQnlnQ0FDSU1JQWsyQWdRZ0NTQU1OZ0lBSUFkQkFEWUNBQ0FOSUEwdEFBQkJBWEk2QUFBZ0JpZ0NFQ0VOSUFkQkJHdEJBem9BQUNBTktBSlFJZ3dnQnpZQ0JDQUhJQTFCMEFCcU5nSUVJQWNnRERZQ0FDQU5JQWMyQWxBTUFBc0FDeUFLTHdBRklRc2dDaWdBQVNFTUlBZ2dCa0tBZ0lDQUlCQkhJZ0UzQXdBZ0NFRUlhaUVISUFwQkIyb2hEUUpBQWtBZ0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUFrQWdDVUg2QUVZRVFDQVVJQXRCQW5ScUtBSUFJZ2tnQ1NnQ0FFRUJhallDQUF3QkN5QUdJQklnQ3lBSlFma0FSaENMQkNJSlJRMEJDeUFHSUFnb0FnQWdERUVpRUhvaUN3MEJJQllnQ1JEckFRc2dCeUVJRElBQkN5QUxJQWsyQWdBZ0NDQUdJQXdRWERjRENDQUlRUkJxSVFjTWV3c2dDa0VGYWlFTklCc3BBd0FpTHFjaUN5Z0NFQ0lIUVRCcUlRd2dCeUFLS0FBQklna2dCeWdDR0hGQmYzTkJBblJxS0FJQUlRY0NRQUpBQWtBQ1FBTkFJQWRGRFFFZ0NTQU1JQWRCQVd0QkEzUWlEMm9pQnlnQ0JFY0VRQ0FIS0FJQVFmLy8veDl4SVFjTUFRc0xJQXNvQWhRZ0QybzFBZ1JDSUlaQ2dJQ0FnTUFBVVFSQUlBWWdDUkRaQVF5REFRc2dCeTBBQTBFSWNVVU5BeUF1UWlDSXAwRjBTdzBCREFJTElBWWdCaWtEd0FFZ0NSQnhJZ2RCQUVnTmdRRWdCMFVFUUVLQWdJQ0FNQ0V1REFJTElCa3BBd0FpTGtJZ2lLZEJkVWtOQVNBdXB5RUxDeUFMSUFzb0FnQkJBV28yQWdBTElBZ2dMamNEQUNBSUlBWWdDUkJjTndNSUlBaEJFR29oQnd4N0N5QUdJQWxCemgwUWp3RU1mZ3NnRFNBTktBQUFhaUVOSUFnaEJ5QUdFSHRGRFhrTWZRc2dEU0FOTGdBQWFpRU5JQWdoQnlBR0VIdEZEWGdNZkFzZ0RTQU5MQUFBYWlFTklBZ2hCeUFHRUh0RkRYY01ld3NnQ2tFRmFpRUpBbjhnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vejlZQkVBZ0FhY01BUXNnQmlBQkVDWUxCSDhnRFNnQUFDQUpha0VFYXdVZ0NRc2hEU0FHRUh0RkRYWU1LQXNnQ2tFRmFpRUpBbjhnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vejlZQkVBZ0FhY01BUXNnQmlBQkVDWUxCSDhnQ1FVZ0RTZ0FBQ0FKYWtFRWF3c2hEU0FHRUh0RkRYVU1Kd3NnQ2tFQ2FpRUpBbjhnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vejlZQkVBZ0FhY01BUXNnQmlBQkVDWUxCSDhnRFN3QUFDQUpha0VCYXdVZ0NRc2hEU0FHRUh0RkRYUU1KZ3NnQ2tFQ2FpRUpBbjhnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vejlZQkVBZ0FhY01BUXNnQmlBQkVDWUxCSDhnQ1FVZ0RTd0FBQ0FKYWtFQmF3c2hEU0FHRUh0RkRYTU1KUXNnQ0NBTklBb29BQUZxSUJNb0FoUnJyVUtBZ0lDQTBBQ0VOd01BSUFwQkJXb2hEU0FJUVFocUlRY01jZ3NnQ2lnQUFTRUhJQWdnQ2lBVEtBSVVhMEVGYXEwM0F3QWdCeUFOYWlFTklBaEJDR29oQnd4eEN3SkFJQWhCQ0dzaUJ5a0RBQ0lCUXYvLy8vOFBWZzBBSUFHbklna2dFeWdDR0U4TkFDQVRLQUlVSUFscUlRME1jUXNnQmtIMTRRQkJBQkJHREhRTElBaEJDR3NpRHlrREFDSXRRaUNJcHlJSFFRRnFJZ2xCQkUxQkFFRUJJQWwwUVJseEcwVUVRQ0FHSUMwUTNBVWhMUXNDUUNBR1FSZ1FLU0lKQkVBZ0JrS0FnSUNBSUVFUkVFa2lMa0tBZ0lDQWNJTkNnSUNBZ09BQVVnMEJJQVlvQWhBaUIwRVFhaUFKSUFjb0FnUVJBQUFMSUMwaExneGxDeUFKUVFBMkFoQWdDU0F0TndNQUlBbEJBRFlDQ0NBdXB5QUpOZ0lnSUFkQmZuRkJBa1lOWlNBdElnRkNJSWluSWdkQmRVOEVRQ0F0cHlJTElBc29BZ0JCQVdvMkFnQUxBMEFnQmlBQkVJd0NJZ0ZDZ0lDQWdIQ0RJaTlDZ0lDQWdDQlNCRUFnTDBLQWdJQ0E0QUJSRFdZZ0JpQU9RZUFBYWlBT1FZQUJhaUFCcDBFUkVJNEJEV1VnQmlBT0tBSmdJQTRvQW9BQklnc1FXaUFMQkVBZ0JpQUJFQThnQjBGMVNRMWxJQzJuSWdjZ0J5Z0NBRUVCYWpZQ0FBeGxDeUFHRUh0RkRRRU1aUXNMQWtBQ1FDQXRweUlNTFFBRlFRaHhSUTBBUVFBaEJ5QU1LQUlRSWdzb0FpQWlFRUVBSUJCQkFFb2JJUkFnQzBFd2FpRUxBMEFnQnlBUVJnMENJQXN0QUFOQkVIRU5BU0FMUVFocUlRc2dCMEVCYWlFSERBQUxBQXNnQmlBT1FlQUFhaUFPUVlBQmFpQU1RUkVRamdFTlpVRUFJUWNnRGlnQ1lDRUtJQTRvQW9BQklRa0RRQ0FISUFsSEJFQWdCaUF1SUFvZ0IwRURkR29vQWdSQ2dJQ0FnQ0JCQUJEUUFSb2dCMEVCYWlFSERBRUxDeUFHSUFvZ0NSQmFER1lMSUFsQkFUWUNDQ0FKSUF3b0FpZzJBZ3dNWlF0Q2dZQ0FnQkFoTGdKQUlBaEJDR3NwQXdBaUxVS0FnSUNBY0ZRTkFDQXRweUlMTHdFR1FSRkhEUUFnQ3lnQ0lDRUhBMEFDUUNBSEtBSUlCRUFnQnlnQ0VDSUpJQWNvQWd4UERRTWdCeUFKUVFGcU5nSVFJQWxCZ0lDQWdIaHlJUWtNQVFzZ0J5Z0NFQ0lNSUFzb0FoQWlDU2dDSUU4TkFpQUpRVEJxSUF4QkEzUnFJZzhvQWdRaENTQUhJQXhCQVdvMkFoQWdDVVVOQVNBUExRQURRUkJ4UlEwQkN5QUdJQWNwQXdBZ0NSQnhJZ3hCQUVnTmRDQU1SUTBBQzBLQWdJQ0FFQ0V1SUFZZ0NSQmNJUUVMSUFnZ0xqY0RDQ0FJSUFFM0F3QWdDRUVRYWlFSERHNExJQVlnQ0VFQUVKa0REWEVnQ0VLQWdJQ0EwQUEzQXdnZ0NFRVFhaUVIREcwTElBb3RBQUVoQ1VFQklRY2dEa0VCTmdKZ0lBcEJBbW9oRFVLQWdJQ0FNQ0V1SUFoQmZTQUphMEVEZEdvaUN5a0RBQ0lCUW9DQWdJQndnMEtBZ0lDQU1GRU5YaUFHSUFFZ0NFRitJQWxyUVFOMGFpa0RBQ0FPUWVBQWFoQ3VBU0l1UW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJCZnlFSElBNUJmellDWUF4ZUN5QU9LQUpnSWdjTlhVRUFJUWNNWGdzZ0JpQUlRUUVRbVFNTmJ5QUlRb0NBZ0lEUUFEY0RDQ0FJUVJCcUlRY01hd3NnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vMjlZQkVBZ0JrR09NVUVBRUJVTWJ3c2dCaUFCSUE1QjRBQnFFTnNGSWkxQ2dJQ0FnSENEUW9DQWdJRGdBRkVOYmlBR0lBRVFEeUFISUMwM0F3QWdDQ0FPS0FKZ1FRQkhyVUtBZ0lDQUVJUTNBd0FnQ0VFSWFpRUhER29MSUFoQkNHc3BBd0JDLy8vLy8yOVdEV01nQmtHT01VRUFFQlVNYlFzZ0JpQUlRUkJySWdrcEF3QVFEeUFJUVJocklnY3BBd0FpQVVLQWdJQ0FjSU5DZ0lDQWdEQlJEV2dnQmlBQlFRQVFyUUVFUUNBSklRZ01iUXNnQmlBSEtRTUFFQThNYUFzZ0NFRUlheUlJS1FNQUlRRURRQUpBSUFnZ0hFME5BQ0FJUVFocklnY3BBd0FpTFVLQWdJQ0FjSU5DZ0lDQWdOQUFVUTBBSUFZZ0xSQVBJQWNoQ0F3QkN3c2dDQ0FwU1FSQUlBWkIzY29BUVFBUVJpQUdJQUVRRHd4c0N5QUlJQWhCQ0dzaUJ5a0RBRGNEQUNBSVFSQnJJZ29wQXdBaExTQUtJQWhCR0dzaUNpa0RBRGNEQUNBSElDMDNBd0FnQ2lBQk53TUFJQWhCQ0dvaEJ3eG5DeUFHSUFoQkdHc3BBd0FnQ0VFZ2F5a0RBRUVCSUFoQkNHc2lCeEFoSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOYWlBR0lBY3BBd0FRRHlBSElBRTNBd0FNWUFzZ0NrRUNhaUVOSUFnZ0JpQUlRU0JySWdjcEF3QWlBVUVYUVFZZ0NpMEFBU0lKUVFGeEd5QUJRUUFRRkNJQlFvQ0FnSUJ3Z3lJdFFvQ0FnSUFnVVNBdFFvQ0FnSUF3VVhJRWZrS0JnSUNBRUFVZ0xVS0FnSUNBNEFCUkRXb2dCeWtEQUNFdEFuNGdDVUVDY1FSQUlBWWdBU0F0UVFCQkFCQXZEQUVMSUFZZ0FTQXRRUUVnQ0VFSWF4QXZDeUlCUW9DQWdJQndnMEtBZ0lDQTRBQlJEV29nQmlBSVFRaHJJZ2NwQXdBUUR5QUhJQUUzQXdCQ2dJQ0FnQkFMTndNQUlBaEJDR29oQnd4bEN3Si9JQWhCQ0dzaUJ5a0RBQ0lCUXYvLy8vOC9XQVJBSUFHblFRQkhEQUVMSUFZZ0FSQW1DeUVLSUFjZ0NrV3RRb0NBZ0lBUWhEY0RBQXhlQ3lBS1FRVnFJUTBnQmlBSVFRaHJJZ2NwQXdBaUFTQUtLQUFCSUFGQkFCQVVJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5aeUFHSUFjcEF3QVFEeUFISUFFM0F3QU1YUXNnQ2tFRmFpRU5JQVlnQ0VFSWF5a0RBQ0lCSUFvb0FBRWdBVUVBRUJRaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVExbUlBZ2dBVGNEQUNBSVFRaHFJUWNNWWdzZ0JpQUlRUkJySWdjcEF3QWdDaWdBQVNBSVFRaHJLUU1BUVlDQUFoRFFBU0VJSUFZZ0J5a0RBQkFQSUFwQkJXb2hEU0FJUVFCT0RXRU1Fd3NnQ2tFRmFpRU5JQVlnQ2lnQUFSRGdCU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEV1FnQ0NBQk53TUFJQWhCQ0dvaEJ3eGdDeUFJUVFocklRY0NRQ0FJUVJCcklna3BBd0FpQVVMLy8vLy9iMWdFUUNBR0VDUkNnSUNBZ09BQUlTNE1BUXNnQnlrREFDSXRRb0NBZ0lCd2cwS0FnSUNBZ0g5U0JFQWdCaENJQkVLQWdJQ0E0QUFoTGd3QkN5QUdLQUlRSUMwUWpRSWhDQ0FCcHlJTUtBSVFJZ3RCTUdvaER5QUxJQWdnQ3lnQ0dIRkJmM05CQW5ScUtBSUFJUXNDUUFOQUlBc0VRQ0FQSUF0QkFXdEJBM1FpQzJvaUVDZ0NCQ0FJUmcwQ0lCQW9BZ0JCLy8vL0gzRWhDd3dCQ3dzZ0JpQUlFTm9GUW9DQWdJRGdBQ0V1REFFTElBd29BaFFnQzJvcEF3QWlMa0lnaUtkQmRVa05BQ0F1cHlJSUlBZ29BZ0JCQVdvMkFnQUxJQVlnQnlrREFCQVBJQVlnQ1NrREFCQVBJQWtnTGpjREFDQXVRb0NBZ0lCd2cwS0FnSUNBNEFCU0RWOE1FUXNnQ0VFUWF5a0RBQ0VCSUFoQkNHc2hDUUpBQWtBZ0NFRVlheUlIS1FNQUlpMUMvLy8vLzI5WUJFQWdCaEFrREFFTElBa3BBd0FpTGtLQWdJQ0FjSU5DZ0lDQWdJQi9VZ1JBSUFZUWlBUU1BUXNnQmlnQ0VDQXVFSTBDSVFnZ0xhY2lEQ2dDRUNJTFFUQnFJUThnQ3lBSUlBc29BaGh4UVg5elFRSjBhaWdDQUNFTEEwQWdDd1JBSUE4Z0MwRUJhMEVEZENJTGFpSVFLQUlFSUFoR0RRTWdFQ2dDQUVILy8vOGZjU0VMREFFTEN5QUdJQWdRMmdVTElBWWdBUkFQSUFZZ0J5a0RBQkFQSUFZZ0NTa0RBQkFQSUFjaENBeGpDeUFHSUF3b0FoUWdDMm9nQVJBZ0lBWWdCeWtEQUJBUElBWWdDU2tEQUJBUERGNExJQWhCR0dzaEJ5QUlRUWhyS1FNQUlRRWdDRUVRYXlFSUFrQUNRQ0FIS1FNQUlpMUMvLy8vLzI5WUJFQWdCaEFrREFFTElBZ3BBd0FpTGtLQWdJQ0FjSU5DZ0lDQWdJQi9VZ1JBSUFZUWlBUU1BUXNnQmlnQ0VDQXVFSTBDSVFjZ0xhY2lDeWdDRUNJSlFUQnFJUXdnQ1NBSElBa29BaGh4UVg5elFRSjBhaWdDQUNFSkFrQURRQ0FKUlEwQklBY2dEQ0FKUVFGclFRTjBhaUlKS0FJRVJ3UkFJQWtvQWdCQi8vLy9IM0VoQ1F3QkN3c2dCaUFIUVpnekVJOEJEQUVMSUFZZ0N5QUhRUWNRZWlJSERRRUxJQVlnQVJBUElBWWdDQ2tEQUJBUERHSUxJQWNnQVRjREFDQUdJQWdwQXdBUUR3eFhDeUFLUVFWcUlRMGdCaUFJUVJCcktRTUFJQW9vQUFFZ0NFRUlheUlIS1FNQVFZZUFBUkFaUVFCT0RWd01EZ3NnQ2tFRmFpRU5JQWdoQnlBR0lBaEJDR3NwQXdBZ0NpZ0FBUkRaQlVFQVRnMWJERjhMSUFnaEJ5QUdJQWhCQ0dzcEF3QWdDRUVRYXlrREFCRFlCVUVBVGcxYURGNExJQWhCQ0dzaUJ5a0RBQ0lCUXYvLy8vOXZXQ0FCUW9DQWdJQndnMEtBZ0lDQUlGSnhSUVJBSUFZZ0NFRVFheWtEQUNBQlFRRVFpd0pCQUVnTlhnc2dCaUFCRUE4TVdRc2dCaUFJUVFocktRTUFJQWhCRUdzcEF3QVFod1FNVWdzZ0NBSi9JQWxCMVFCR0JFQkJmU0FHSUFoQkVHc3BBd0FRTVNJTERRRWFERjBMSUFwQkJXb2hEU0FLS0FBQklRdEJmZ3RCQTNScUlRY0NmZ0orQWtBQ1FBSkFJQTB0QUFBaURFRURjUTRDQUFFQ0MwR0R6Z0VoQ2lBSVFRaHJLUU1BSWdFaEwwS0FnSUNBTUF3Q0MwS0FnSUNBTUNFdlFZR2FBU0VLUW9DQWdJQXdJUzBnQ0VFSWF5a0RBQ0lCREFJTFFvQ0FnSUF3SVM5Qmdhb0JJUW9nQ0VFSWF5a0RBQ0lCQ3lFdFFvQ0FnSUF3Q3lFeElBY3BBd0FoTUVHMm1RRWhCeUFHSUFzUTF3VWhMZ0pBSUFwQmdCQnhSUVJBUWJHWkFTRUhJQXBCZ0NCeFJRMEJDeUFHSUFjZ0xrSE1uZ0VRdmdFaExnc2dDRUVJYXlFSEFuOUJmeUF1UW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFhUVg4Z0JpQUJRVFlnTGtFQkVCbEJBRWdOQUJvZ0JpQUJJREFRaHdRZ0JpQXdJQXNnTHlBeElDMGdDaUFNUVFSeGNoQnRDeUVLSUFZZ0J5a0RBQkFQSUExQkFXb2hEU0FJSUFsQjFRQkdCSDhnQmlBTEVCTWdCaUFJUVJCcktRTUFFQTlCZmdWQmZ3dEJBM1JxSVFjZ0NrRUFUZzFYSUFwQkhuWkJBbkVNV0FzZ0NrRUdhaUVOSUFoQkNHc2lEQ2tEQUNFeElBaEJFR3NoQ3lBS0tBQUJJUThDUUFKQUlBb3RBQVZCQVhFRVFFS0FnSUNBSUNFdElBc3BBd0FpTUVLQWdJQ0FjSU5DZ0lDQWdDQlJCRUFnQmlrRE1DSXdRaUNJcDBGMFN3MENEQU1MUW9DQWdJQXdJUzlCZ1Q0aEJ5QXdRb0NBZ0lCd1ZBMUdJRENuTFFBRlFSQnhSUTFHSUFZZ01FRTdJREJCQUJBVUlpMUNnSUNBZ0hDRElnRkNnSUNBZ0NCUkRRSWdBVUtBZ0lDQTRBQlJEVWdnTFVLQWdJQ0FjRm9OQWtHNzB3QWhCd3hIQ3lBR0tBSW9LUU1JSWkxQ0lJaW5RWFZQQkVBZ0xhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBR0tRTXdJakJDSUlpblFYVkpEUUVMSURDbklnY2dCeWdDQUVFQmFqWUNBQXRDZ0lDQWdPQUFJUzhnQmlBdEVFY2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMUZJREduSWdjdEFCRkJNSEVOUDBLQWdJQ0E0QUFoTGlBR0lEQkJEUkJKSWk5Q2dJQ0FnSENEUW9DQWdJRGdBRkVOUWtLQWdJQ0FNQ0V4SUFZZ0x5QUhJQlFnRWhEV0JTSXVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRVSWdCaUF1SUFFUWh3UWdMa0tBZ0lDQWNGb0VRQ0F1cHlJUUlCQXRBQVZCRUhJNkFBVUxJQVlnTGtFd0lBY3pBU3hCQVJBWkdnSkFJQWxCMXdCR0JFQWdCaUF1SUFoQkdHc3BBd0FRMkFWQkFFZ05SQXdCQ3lBR0lDNGdEeERaQlVFQVNBMURDeUF1UWlDSXAwRjFUd1JBSUM2bklnY2dCeWdDQUVFQmFqWUNBQXNnQmlBQlFUd2dMa0dEZ0FFUUdVRUFTQTFDSUFGQ0lJaW5RWFZQQkVBZ0FhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBR0lDNUJPeUFCUVlDQUFSQVpRUUJJRFVJZ0JpQXRFQThnQmlBd0VBOGdDeUF1TndNQUlBd2dBVGNEQUF4UUN5QUdJQWhCRUdzaUNTa0RBQ0FJUVFocklnY3BBd0FRVFNFQklBWWdDU2tEQUJBUElBa2dBVGNEQUNBQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFZVTUJ3c2dDRUVJYXlJSElBWWdDRUVRYXlrREFDQUhLUU1BRUUwaUFUY0RBQ0FJSVFjZ0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVWcxVURGZ0xJQWhCQ0dzcEF3QWhBU0FJUVJCcktRTUFJaTFDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQVlnQVJBeElnZEZEVmdnQmlBSEVNY0NJQVlnQnhBVERGZ0xJQUZDSUlpblFYVlBCRUFnQWFjaUJ5QUhLQUlBUVFGcU5nSUFDeUFHSUMwZ0FSQk5JZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5WeUFJSUFFM0F3QWdDRUVJYWlFSERGTUxJQVlnQ0VFSWF5SU1LUU1BRURFaUNVVU5WaUFHSUFoQkVHc2lCeWtEQUNBSklBaEJHR3NpQ3lrREFFRUFFQlFoQVNBR0lBa1FFeUFCUW9DQWdJQndnMEtBZ0lDQTRBQlJEVllnQmlBTUtRTUFFQThnQmlBSEtRTUFFQThnQmlBTEtRTUFFQThnQ3lBQk53TUFERklMSUFZZ0NFRVlheUlIS1FNQUlBaEJFR3NwQXdBZ0NFRUlheWtEQUVHQWdBSVExd0VoQ0NBR0lBY3BBd0FRRHlBSVFRQk9EVkVNQXdzZ0JpZ0NFQ2dDakFFaENRSi9Ba0FnQ0VFWWF5SUhLUU1BSWk1Q2dJQ0FnSENEUW9DQWdJQXdVUVJBQWtBZ0NVVU5BQ0FKTFFBb1FRRnhSUTBBSUFZZ0NFRVFheWtEQUJBeElnZEZEVmdnQmlBSEVNY0NJQVlnQnhBVERGZ0xJQmtwQXdBaUxrSWdpS2RCZFU4RVFDQXVweUlLSUFvb0FnQkJBV28yQWdBTElBY2dMamNEQUF3QkN5QUpSUTBBUVlDQUJpQUpLQUlvUVFGeERRRWFDMEdBZ0FJTElRb2dCaUF1SUFoQkVHc3BBd0FnQ0VFSWF5a0RBQ0FLRU5jQklRZ2dCaUFIS1FNQUVBOGdDRUVBVGcxUUlBaEJIblpCQW5FTVVRc2dDRUVZYXlJSktRTUFRdi8vLy85dldBMUxJQVlnQ0VFUWF5SU1LUU1BRURFaUMwVU5VeUFHSUFrcEF3QWdDeUFJUVFocktRTUFJQWhCSUdzaUJ5a0RBRUdBZ0FJUWhnUWhDQ0FHSUFzUUV5QUdJQWNwQXdBUUR5QUdJQWtwQXdBUUR5QUdJQXdwQXdBUUR5QUlRUUJPRFU4Z0NFRWVka0VDY1F4UUN5QUlRUmhyS1FNQUlTMGdDRUVRYXlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dCaUF0SUFFZ0NFRUlheUlIS1FNQVFZZUFBUkM5QVVFQVRnMU9DeUFISVFnTVVRc2dDRUVRYXlJTUtRTUFJaTVDZ0lDQWdCQmFCRUFnQmtIMjhnQkJBQkJHREZFTElBWWdDRUVJYXlJSEtRTUFJZ0ZCMFFFZ0FVRUFFQlFpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTFRSUFGQlBVRUJFSVVFSVFzZ0JpQUJFQThnQmlBSEtRTUFRUUFRNXdFaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVExUUlBWWdBVUhxQUNBQlFRQVFGQ0l0UW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQmlBQkVBOE1VUXNnTHFjaENRSkFBa0FnQzBVTkFDQXRRVDVCQUJDRkJFVU5BQ0FIS1FNQUlpNGdEa0hnQUdvZ0RrR0FBV29RaWdKRkRRQWdCaUFPUVp3QmFpQXVFTllCRFRrZ0RpZ0NuQUVpRHlBT0tBS0FBVWNOQUNBSVFSaHJJUkJCQUNFTElBNG9BbUFoSXdOQUlBc2dEMFlOQWlBUUtRTUFJUzhnSXlBTFFRTjBhaWtEQUNJdVFpQ0lwMEYxVHdSQUlDNm5JaGdnR0NnQ0FFRUJhallDQUFzZ0JpQXZJQWtnTGtFSEVLOEJJUmdnQzBFQmFpRUxJQWxCQVdvaENTQVlRUUJPRFFBTEREa0xJQWhCR0dzaEN3TkFJQVlnQVNBdElBNUJuQUZxRUs0QklpNUNnSUNBZ0hDRFFvQ0FnSURnQUZFTk9TQU9LQUtjQVEwQklBWWdDeWtEQUNBSklDNUJCeEN2QVVFQVNBMDVJQWxCQVdvaENRd0FDd0FMSUF3Z0NhMDNBd0FnQmlBQkVBOGdCaUF0RUE4Z0JpQUhLUU1BRUE4TVRBc2dDa0VDYWlFTklBZ2hCeUFHSUFnZ0NpMEFBU0lKUVg5eklndEJBM1JCWUhKcUtRTUFJQWdnQzBFQmRFRkFja0Y0Y1dvcEF3QWdDQ0FKUVFWMlFYOXpRUU4wYWlrREFFRUFFTlFGUlExTERFOExBa0FnQ0VFSWF5SUhLUU1BSWdGQ0lJaW5JZ3NnQ0VFUWF5SUpLUU1BSWkxQ0lJaW5JZ3h5UlFSQUlBSEVJQzNFZkNJQlFvQ0FnSUFJZkVMLy8vLy9EMVlOQVNBSklBRkMvLy8vL3crRE53TUFERXdMSUF4QkIydEJiVXNnQzBFSGEwRnRTM0lOQUNBSlFvQ0FnSURBZmlBdFFvQ0FnSURBZ1lEOC93Qjh2eUFCUW9DQWdJREFnWUQ4L3dCOHY2QzlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzM0F3QU1Td3NnQmlBSUVOTUZSUTFLREU0TElBcEJBbW9oRFFKQUlBaEJDR3NpQ0NrREFDSXRJQkVnQ2kwQUFVRURkR29pQnlrREFDSUJoRUwvLy8vL0QxZ0VRQ0F0eENBQnhId2lMVUtBZ0lDQUNIeEMvLy8vL3c5V0RRRWdCeUF0UXYvLy8vOFBnemNEQUF4RkN5QUJRb0NBZ0lCd2cwS0FnSUNBa0g5U0RRQWdCaUF0UVFJUW1nRWlMVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMU9JQWNwQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlKSUFrb0FnQkJBV28yQWdBTElBWWdBU0F0RU1RQ0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTlRpQUdJQWNnQVJBZ0RFUUxJQUZDSUlpblFYVlBCRUFnQWFjaUNTQUpLQUlBUVFGcU5nSUFDeUFPSUFFM0F5QWdEaUFJS1FNQU53TW9JQVlnTEJEVEJRMU5JQVlnQnlBT0tRTWdFQ0FNUXdzZ0NFRUlheUlIS1FNQUlnRkNJSWluSWd3Z0NFRVFheUlMS1FNQUlpMUNJSWluSWc5eVJRUkFJQzNFSUFIRWZTSUJRb0NBZ0lBSWZFTC8vLy8vRDFZTkJDQUxJQUZDLy8vLy93K0ROd01BREVrTElBOUJCMnRCYlVzZ0RFRUhhMEZ0UzNJTkF5QUxRb0NBZ0lEQWZpQXRRb0NBZ0lEQWdZRDgvd0I4dnlBQlFvQ0FnSURBZ1lEOC93Qjh2Nkc5SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoczNBd0FNU0FzQ2ZDQUlRUWhySWdjcEF3QWlMVUlnaUtjaURDQUlRUkJySWdzcEF3QWlMa0lnaUtjaUQzSkZCRUFnTGNRZ0xzUitJZ0ZDZ0lDQWdBaDhRb0NBZ0lBUVdnUkFJQkl0QUNoQkJIRkJBQ0FCUW9DQWdJQ0FnSUFRZlVLQmdJQ0FnSUNBWUZRYkRRVWdBYmtNQWd0RUFBQUFBQUFBQUlBZ0xTQXVoRUtBZ0lDQUNJTlFJQUZDQUZKeVJRMEJHaUFMSUFGQy8vLy8vdytETndNQURFa0xJQTlCQjJ0QmJVc2dERUVIYTBGdFMzSU5BeUFTTFFBb1FRUnhEUU1nTGtLQWdJQ0F3SUdBL1A4QWZMOGdMVUtBZ0lDQXdJR0EvUDhBZkwraUN5RTBJQXRDZ0lDQWdNQitJRFM5SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoczNBd0FNUndzZ0NFRUlheUlIS1FNQUlnRWdDRUVRYXlJTEtRTUFJaTJFUXYvLy8vOFBWZzBCSUJJdEFDaEJCSEVOQVNBTEFuNGdMYWUzSUFHbnQ2TWlOTDBpQVFKL0lEU1pSQUFBQUFBQUFPQkJZd1JBSURTcURBRUxRWUNBZ0lCNEN5SUl0NzFSQkVBZ0NLME1BUXRDZ0lDQWdNQitJQUZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTE53TUFERVlMSUFoQkNHc2lCeWtEQUNJQklBaEJFR3NpQ3lrREFDSXRoRUwvLy8vL0QxWU5BQ0F0cHlJTVFRQklEUUFnQWFjaUQwRUFUQTBBSUFzZ0RDQVBjSzAzQXdBTVJRc2pBRUVnYXlJSEpBQUNmd0pBQWtBQ1FBSkFBbjRDUUFKQUFrQUNRQUpBQWtBQ1FFRUhJQWhCRUdzaUN5a0RBQ0lCUWlDSXB5SU1JQXhCQjJ0QmJra2JJZ3hCQjBkQkJ5QUlRUWhySWlNcEF3QWlMa0lnaUtjaUR5QVBRUWRyUVc1Skd5SVBRUWRIY2tVRVFDQUhJQzVDZ0lDQWdNQ0JnUHovQUh3M0F3Z2dCeUFCUW9DQWdJREFnWUQ4L3dCOE53TVFEQUVMQWtBZ0RFRi9SaUFQUVg1eFFRSkhjVVVnREVGK2NVRUNSaUFQUVg5SGNuRU5BQ0FHSUFkQkdHb2dBU0F1SUFsQkFVRUFFSVVDSWd4RkRRQWdCaUFCRUE4Z0JpQXVFQThnREVFQVNBME1JQXNnQnlrREdEY0RBQXdKQ3lBR0lBRVFiQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUW9nQmlBdUVHd2lMa0tBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQVlnQVJBUERBd0xRUWNnQVVJZ2lLY2lEQ0FNUVFkclFXNUpHeUlNUVFjZ0xrSWdpS2NpRHlBUFFRZHJRVzVKR3lJUGNrVUVRQ0F1cHlFTUlBR25JUThDUUFKQUFrQUNRQUpBQWtBZ0NVR2FBV3NPQmdBQkFna0ZBd1FMSUM3RUlBSEVmaUV0QWtBZ0JpZ0NFQ0lRS0FLTUFTSVlSUTBBSUJndEFDaEJCSEZGRFFBZ0xVS0FnSUNBZ0lDQUVIMUNnWUNBZ0lDQWdHQlVEUWdMUWdBaEFTQXRRZ0JTRFFvZ0RDQVBja0VBVGcwTElBdENnSUNBZ01EKy93TTNBd0FNRGdzZ0JpZ0NFQ0lRS0FLTUFTSVlCRUFnR0MwQUtFRUVjUTBIQ3lBTFFvQ0FnSURBZmlBUHR5QU10Nk85SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoczNBd0FNRFFzZ0RFRUFTaUFQUVFCT2NVVUVRQ0FMQW40Z0Q3Y2dETGNRamdNaU5MMGlBUUovSURTWlJBQUFBQUFBQU9CQll3UkFJRFNxREFFTFFZQ0FnSUI0Q3lJSnQ3MVJCRUFnQ2EwTUFRdENnSUNBZ01CK0lBRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMTndNQURBMExJQThnREhDdElTME1DQXNnQmlnQ0VDSVFLQUtNQVNJWUJFQWdHQzBBS0VFRWNRMEZDeUFQdHlFMElBc0NmZ0o4SUF5M0lqVzlRb0NBZ0lDQWdJRDQvd0NEUW9DQWdJQ0FnSUQ0L3dCUkJFQkVBQUFBQUFBQStIOGdOSmxFQUFBQUFBQUE4RDloRFFFYUN5QTBJRFVRandNTElqUzlJZ0VDZnlBMG1VUUFBQUFBQUFEZ1FXTUVRQ0EwcWd3QkMwR0FnSUNBZUFzaUNiZTlVUVJBSUFtdERBRUxRb0NBZ0lEQWZpQUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3pjREFBd0xDeUFKUWJJQlJnMEZEQVFMSUFIRUlDN0VmU0V0REFVTElBeEJkVWNnRDBGMVIzRkZCRUFnQmlBSklBc2dBU0F1SUFZb0FoQW9BdGdDRVJvQURRd01DUXNnREVGM1J5QVBRWGRIY1VVRVFDQUdJQWtnQ3lBQklDNGdCaWdDRUNnQ3ZBSVJHZ0JGRFFrTURBc2dERUYyUnlBUFFYWkhjVVVFUUNBR0tBSVFJUkFNQWdzZ0JpQUhRUkJxSUFFUWJnMEtJQVlnQjBFSWFpQXVFRzROQ3dzQ1FDQUdLQUlRSWhBb0Fvd0JJZ3hGRFFBZ0RDMEFLRUVFY1VVTkFDQUhLd01RRUwwQ1JRMEFJQWNyQXdnUXZRSU5BUXNDUUFKQUFrQUNRQUpBQWtBQ1FDQUpRWm9CYXc0R0FBRUNDQVVFQXdzZ0J5c0RFQ0FIS3dNSW9pRTBEQVVMSUFjckF4QWdCeXNEQ0tNaE5Bd0VDeUFIS3dNUUlBY3JBd2dRamdNaE5Bd0RDeUFKUWJJQlJ3MEVJQWNyQXhBZ0J5c0RDSmtpTlJDT0F5STBSQUFBQUFBQUFBQUFZMFVOQWlBMUlEU2dJVFFNQWdzZ0J5c0RFQ0UxSUFjckF3Z2lOcjFDZ0lDQWdJQ0FnUGovQUlOQ2dJQ0FnSUNBZ1BqL0FGRUVRRVFBQUFBQUFBRDRmeUUwSURXWlJBQUFBQUFBQVBBL1lRMENDeUExSURZUWp3TWhOQXdCQ3lBSEt3TVFJQWNyQXdpaElUUUxJQXRDZ0lDQWdNQitJRFM5SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoczNBd0FNQndzZ0JpQUpJQXNnQVNBdUlCQW9BcUFDRVJvQVJRMEdEQWtMRUFFQUN5QU1SUTBGSUFIRUlDN0VJZ0dCSWkxQ0FGa05BQ0FNUVFCSUJFQWdMU0FCZlNFdERBRUxJQUVnTFh3aExRc2dMVUtBZ0lDQUNIeEMvLy8vL3c5V0RRRWdMU0VCQ3lBQlF2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0xibTlJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElRRWdDeUFCTndNQUMwRUFEQU1MSUFaQkFoQ0VBZ3dCQ3lBR0lDNFFEd3NnQzBLQWdJQ0FNRGNEQUNBalFvQ0FnSUF3TndNQVFYOExJUWtnQjBFZ2FpUUFJQWtOU0NBSVFRaHJJUWNNUkFzZ0NFRUVheWdDQUNJSFJTQUhRUWRyUVc1SmNnMDlJQWdoQnlBR0lBaEJqUUVRNWdGRkRVTU1Sd3NDUUFKOElBaEJDR3NpQnlrREFDSUJRaUNJcHlJSlJRUkFSQUFBQUFBQUFBQ0FJQUduSWdwRkRRRWFSQUFBQUFBQUFPQkJJQXBCZ0lDQWdIaEdEUUVhSUFkQ0FDQUJmVUwvLy8vL0Q0TTNBd0FNUHdzZ0NVRUhhMEZ0U3cwQklBRkNnSUNBZ01EKy93Tjl2d3NoTkNBSFFvQ0FnSURBZmlBMHZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliTndNQUREMExJQWdoQnlBR0lBaEJqQUVRNWdGRkRVSU1SZ3NnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vdzlXSUFGQy8vLy8vdytEUXYvLy8vOEhVWEpGQkVBZ0J5QUJRZ0Y4UXYvLy8vOFBnemNEQUF3OEN5QUlJUWNnQmlBSVFZOEJFT1lCUlExQkRFVUxJQWhCQ0dzaUJ5a0RBQ0lCUXYvLy8vOFBWaUFCUXYvLy8vOFBnMEtBZ0lDQUNGRnlSUVJBSUFjZ0FVSUJmVUwvLy8vL0Q0TTNBd0FNT3dzZ0NDRUhJQVlnQ0VHT0FSRG1BVVVOUUF4RUN5QUdJQWhCQ0dzaUJ5a0RBQkJzSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBSFFvQ0FnSUF3TndNQURFUUxJQWNnQVRjREFDQUJRaUNJcDBGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dDQ0FCTndNQUlBWWdDRUVJYWlJSElBbEJBbXNRNWdGRkRUOE1Rd3NnQ2tFQ2FpRU5JQkVnQ2kwQUFVRURkR29pQnlrREFDSUJRdi8vLy84UFZpQUJRdi8vLy84UGcwTC8vLy8vQjFGeVJRUkFJQWNnQVVJQmZFTC8vLy8vRDRNM0F3QU1PUXNnQVVJZ2lLZEJkVThFUUNBQnB5SUpJQWtvQWdCQkFXbzJBZ0FMSUE0Z0FUY0RZQ0FHSUNaQmp3RVE1Z0VOUWlBR0lBY2dEaWtEWUJBZ0REZ0xJQXBCQW1vaERTQVJJQW90QUFGQkEzUnFJZ2NwQXdBaUFVTC8vLy8vRDFZZ0FVTC8vLy8vRDROQ2dJQ0FnQWhSY2tVRVFDQUhJQUZDQVgxQy8vLy8vdytETndNQUREZ0xJQUZDSUlpblFYVlBCRUFnQWFjaUNTQUpLQUlBUVFGcU5nSUFDeUFPSUFFM0EyQWdCaUFtUVk0QkVPWUJEVUVnQmlBSElBNHBBMkFRSUF3M0N5QUlRUWhySWdjcEF3QWlBVUwvLy8vL0QxZ0VRQ0FISUFGQy8vLy8vdytGTndNQUREY0xJQWdoQnlNQVFSQnJJZ2trQUFKL0FrQUNRQUpBSUFoQkNHc2lDeWtEQUNJQlFvQ0FnSUJ3VkEwQUlBWWdDVUVJYWlBQlFaVUJFTUlGSWd4QkFFZ05BU0FNUlEwQUlBWWdBUkFQSUFzZ0NTa0RDRGNEQUF3Q0N3SkFJQVlnQVJCc0lnRkNnSUNBZ0hDRElpMUNnSUNBZ09BQVVRMEFJQVlvQWhBaURDZ0NqQUVpRHdSL0lBOHRBQ2hCQkhGQkFuWUZRUUFMUlNBdFFvQ0FnSURnZmxKeFJRUkFJQVlnQzBHVkFTQUJJQXdvQXB3Q0VSc0FEUUVNQXdzZ0JpQUpRUVJxSUFFUW1BRU5BQ0FMSUFrMUFnUkMvLy8vL3crRk53TUFEQUlMSUF0Q2dJQ0FnREEzQXdBTFFYOE1BUXRCQUFzaEN5QUpRUkJxSkFBZ0MwVU5QQXhBQ3dKQUFrQUNRQ0FJUVFocklnY3BBd0FpQVNBSVFSQnJJZ3NwQXdBaUxZUkMvLy8vL3c5V0RRQWdBYWNoQ1NBU0xRQW9RUVJ4UlEwQklBbEJIMHNOQUNBdElBR0dRb0NBZ0lBSWZFS0FnSUNBRUZRTkFnc2dCaUFJUWFBQkVNTUNSUTA5REVFTElBbEJIM0VoQ1FzZ0N5QXRweUFKZEswM0F3QU1Pd3NnQ0VFSWF5SUhLUU1BSWdFZ0NFRVFheUlKS1FNQUlpMkVRdi8vLy84UFdBUkFJQWtDZmlBdHB5QUJwM1lpQ0VFQVRnUkFJQWl0REFFTFFvQ0FnSURBZmlBSXVMMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzM0F3QU1Pd3NqQUVFUWF5SUpKQUFnQ0VFSWF5SU1LUU1BSVMwQ2Z3SkFBa0FnQmlBSVFSQnJJZ3NwQXdBUWJDSUJRb0NBZ0lCd2d5SXVRb0NBZ0lEZ0FGRUVRQ0FHSUMwUUR3d0JDeUFHSUMwUWJDSXRRb0NBZ0lCd2d5SXZRb0NBZ0lEZ0FGRUVRQ0FHSUFFUUR3d0JDeUFHS0FJUUtBS01BU0lQQkVBZ0R5MEFLRUVFY1EwQ0N5QXVRb0NBZ0lEZ2ZsSWdMMEtBZ0lDQTRINVNjUTBCSUFaQitvZ0JRUUFRRlNBR0lBRVFEeUFHSUMwUUR3c2dDMEtBZ0lDQU1EY0RBQ0FNUW9DQWdJQXdOd01BUVg4TUFRc2dCaUFKUVF4cUlBRVFtQUVhSUFZZ0NVRUlhaUF0RUpnQkdpQUxBbjRnQ1NnQ0RDQUpLQUlJZGlJTFFRQk9CRUFnQzYwTUFRdENnSUNBZ01CK0lBdTR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN6Y0RBRUVBQ3lFTElBbEJFR29rQUNBTFJRMDZERDRMQWtBZ0NFRUlheUlIS1FNQUlnRWdDRUVRYXlJSktRTUFJaTJFUXYvLy8vOFBWZzBBSUFrZ0xhY2dBYWNpQ1VFZ1R3Ui9JQkl0QUNoQkJIRU5BU0FKUVI5eEJTQUpDM1d0TndNQUREb0xJQVlnQ0VHaEFSRERBa1VOT1F3OUN5QUlRUWhySWdjcEF3QWlBU0FJUVJCcklna3BBd0FpTFlSQy8vLy8vdzlZQkVBZ0NTQUJJQzJETndNQUREa0xJQVlnQ0VHdEFSRERBa1VOT0F3OEN5QUlRUWhySWdjcEF3QWdDRUVRYXlJSktRTUFoQ0lCUXYvLy8vOFBXQVJBSUFrZ0FUY0RBQXc0Q3lBR0lBaEJyd0VRd3dKRkRUY01Pd3NnQ0VFSWF5SUhLUU1BSWdFZ0NFRVFheUlKS1FNQUlpMkVRdi8vLy84UFdBUkFJQWtnQVNBdGhUY0RBQXczQ3lBR0lBaEJyZ0VRd3dKRkRUWU1PZ3NnQ0VFSWF5SUhLUU1BSWdFZ0NFRVFheUlKS1FNQUlpMkVRdi8vLy84UFdBUkFJQWtnTGFjZ0FhZElyVUtBZ0lDQUVJUTNBd0FNTmdzZ0JpQUlRYU1CRUpjRFJRMDFERGtMSUFoQkNHc2lCeWtEQUNJQklBaEJFR3NpQ1NrREFDSXRoRUwvLy8vL0QxZ0VRQ0FKSUMybklBR25USzFDZ0lDQWdCQ0VOd01BRERVTElBWWdDRUdrQVJDWEEwVU5OQXc0Q3lBSVFRaHJJZ2NwQXdBaUFTQUlRUkJySWdrcEF3QWlMWVJDLy8vLy93OVlCRUFnQ1NBdHB5QUJwMHF0UW9DQWdJQVFoRGNEQUF3MEN5QUdJQWhCcFFFUWx3TkZEVE1NTndzZ0NFRUlheUlIS1FNQUlnRWdDRUVRYXlJSktRTUFJaTJFUXYvLy8vOFBXQVJBSUFrZ0xhY2dBYWRPclVLQWdJQ0FFSVEzQXdBTU13c2dCaUFJUWFZQkVKY0RSUTB5RERZTElBaEJDR3NpQnlrREFDSUJJQWhCRUdzaUNTa0RBQ0l0aEVMLy8vLy9EMWdFUUNBSklDMm5JQUduUnExQ2dJQ0FnQkNFTndNQURESUxJQVlnQ0VFQUVOSUZSUTB4RERVTElBaEJDR3NpQnlrREFDSUJJQWhCRUdzaUNTa0RBQ0l0aEVMLy8vLy9EMWdFUUNBSklDMm5JQUduUjYxQ2dJQ0FnQkNFTndNQURERUxJQVlnQ0VFQkVOSUZSUTB3RERRTElBaEJDR3NpQnlrREFDSUJJQWhCRUdzaUNpa0RBQ0l0aEVMLy8vLy9EMWdFUUNBS0lDMm5JQUduUnExQ2dJQ0FnQkNFTndNQUREQUxJQVlnQ0VFQUVORUZEQzhMSUFoQkNHc2lCeWtEQUNJQklBaEJFR3NpQ2lrREFDSXRoRUwvLy8vL0QxZ0VRQ0FLSUMybklBR25SNjFDZ0lDQWdCQ0VOd01BREM4TElBWWdDRUVCRU5FRkRDNExJQVlnQ0NBV0tBTElBaEVEQUEweElBaEJDR3NoQnd3dEN5QUlRUWhySWdjcEF3QWlBVUwvLy8vL2IxZ0VRQ0FHUWFIMEFFRUFFQlVNTVFzZ0JpQUlRUkJySWd3cEF3QWlMUkF4SWdsRkRUQWdCaUFCSUFrUWNTRUxJQVlnQ1JBVElBdEJBRWdOTUNBR0lDMFFEeUFHSUFFUUR5QU1JQXRCQUVldFFvQ0FnSUFRaERjREFBd3NDeUFHSUFoQkVHc2lDU2tEQUNJQklBaEJDR3NpQnlrREFDSXRFTkFGSWd0QkFFZ05MeUFHSUFFUUR5QUdJQzBRRHlBSklBdEJBRWV0UW9DQWdJQVFoRGNEQUF3ckN5QUdJQWhCQ0dzaUJ5a0RBQ0lCRUlRRUlRb2dCaUFCRUE4Z0J5QUdJQW9RTFRjREFBd2tDeUFJUVJCcklnd3BBd0FoQVNBR0lBaEJDR3NpQnlrREFDSXRFREVpQ1VVTkxTQUdJQUVnQ1VHQWdBSVExUUVoQ3lBR0lBa1FFeUFMUVFCSURTMGdCaUFCRUE4Z0JpQXRFQThnRENBTFFRQkhyVUtBZ0lDQUVJUTNBd0FNS1FzZ0NrRUZhaUVOSUFZZ0Jpa0R3QUVnQ2lnQUFVRUFFTlVCSWdkQkFFZ05MQ0FJSUFkQkFFZXRRb0NBZ0lBUWhEY0RBQ0FJUVFocUlRY01LQXNnQ0VFSWF5SUhLUU1BSWdGQy8vLy8vMjlXRFNFZ0JpQUJFQ1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBySUFZZ0J5a0RBQkFQSUFjZ0FUY0RBQXdoQ3lBSVFRaHJJZ2NwQXdBaUFVSWdpS2RCQ0dvaUNVRUlUVUVBUVFFZ0NYUkJnd0p4R3cwZ0lBWWdBUkNEQkNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFNvZ0JpQUhLUU1BRUE4Z0J5QUJOd01BRENBTElBaEJFR3NwQXdCQ2dJQ0FnQkNFUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FHUVpZYlFRQVFGUXdxQ3lBSVFRaHJJZ2NwQXdBaUFVSWdpS2RCQ0dvaUNVRUlUVUVBUVFFZ0NYUkJnd0p4R3cwZklBWWdBUkNEQkNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFNrZ0JpQUhLUU1BRUE4Z0J5QUJOd01BREI4TElBcEJDbW9oRFNBS0xRQUpJUXNnQ2lnQUJTRVBJQVlnQ0VFSWF5SUhLUU1BSWdFZ0NpZ0FBU0lNRUhFaUVFRUFTQTBvQWtBZ0VFVU5BQ0FMQkVCQkFDRUxJQVlnQVVIYkFTQUJRUUFRRkNJdFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFNvZ0xVS0FnSUNBY0ZvRVFDQUdJQVlnTFNBTUlDMUJBQkFVRUNZaEN3c2dCaUF0RUE4Z0MwRUFTQTBxSUFzTkFRc0NRQUpBQWtBQ1FBSkFBa0FDUUNBSlFmSUFhdzRHQUFFQ0F3UUZCZ3NnQmlBQklBd2dBVUVBRUJRaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwdklBWWdCeUFCRUNBTUJRc2dCaUFCSUF3Z0NFRVFheUlJS1FNQVFZQ0FBaERRQVNFSklBWWdCeWtEQUJBUElBbEJBRTROQkF3dUN5QUdJQUVnREVFQUVOVUJJZ2xCQUVnTkxTQUdJQWNwQXdBUUR5QUhJQWxCQUVldFFvQ0FnSUFRaERjREFBd0RDeUFJSUFZZ0RCQmNOd01BSUFoQkNHb2hDQXdDQ3lBR0lBRWdEQ0FCUVFBUUZDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRTc2dDQ0FCTndNQUlBaEJDR29oQ0F3QkN5QUdJQUVnRENBQlFRQVFGQ0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEU29nQmlBSEtRTUFFQThnQjBLQWdJQ0FNRGNEQUNBSUlBRTNBd0FnQ0VFSWFpRUlDeUFOSUE5cVFRVnJJUTBNSHdzZ0JpQUhLUU1BRUE4TUpBc2dDRUVJYXlrREFDSXVRb0NBZ0lCd2cwS0FnSUNBTUZFTkRRd0ZDeUFJUVFocktRTUFJaTVDZ0lDQWdIQ0RRb0NBZ0lBZ1VRME1EQVFMSUFZZ0NFRUlheWtEQUNJdUVJUUVRY1VBUmcwQkRBTUxJQVlnQ0VFSWF5a0RBQ0l1RUlRRVFSdEhEUUlMSUFZZ0xoQVBEQWtMSUFoQkNHc3BBd0FpTGtLQWdJQ0FZSU5DZ0lDQWdDQlJEUWdMSUFZZ0xoQVBJQWhCQ0d0Q2dJQ0FnQkEzQXdBTUZ3c2dFeWdDRkNFSElBNGdDVFlDQkNBT0lBZEJmM01nRFdvMkFnQWdCa0dJSVNBT0VFWU1JQXNnQ2tFRGFpRU5EQlVMUWdJaExnd2dDMEtBZ0lDQU1DRXVEQjhMUWdBaExnd2VDeUFJUVFocklnZ3BBd0FoQVF3ZUMwSEloQUZCcnZ3QVFhajhBRUhLTkJBQUFBc2dDRUVJYTBLQmdJQ0FFRGNEQUF3UEN5QUdJQUZCQVJDdEFSb2dCaUFCRUE4Z0JpQXRFQThNR0FzZ0FTRXZEQU1MUW9DQWdJQXdJUzBMSUFZZ0IwRUFFQlVMUW9DQWdJQXdJUzRMSUFZZ01CQVBJQVlnTFJBUElBWWdNUkFQSUFZZ0x4QVBJQVlnTGhBUElBdENnSUNBZ0RBM0F3QWdERUtBZ0lDQU1EY0RBQXdUQ3lBR0lBc3BBd0FRRHlBTFFvQ0FnSUF3TndNQUlBZEJBRWdORWlBR0lDNFFEMEtBZ0lDQU1DRXVDeUFJSUM0M0F3QWdDQ0FIUVFCSHJVS0FnSUNBRUlRM0F3Z2dDRUVRYWlFSERBMExJQzBoQVFOQUlBWWdEa0hnQUdvZ0RrR0FBV29nQWFkQklSQ09BUTBCUVFBaEJ5QU9LQUpnSVFrZ0RpZ0NnQUVoQ3dOQUlBY2dDMGNFUUNBR0lDNGdDU0FIUVFOMGFpSU1LQUlFUW9DQWdJQWdJQXdvQWdCQkFFZEJBblFRR1JvZ0IwRUJhaUVIREFFTEN5QUdJQWtnQ3hCYUlBWWdBUkNNQWlJQlFvQ0FnSUJ3Z3lJdFFvQ0FnSUFnVVEwRElDMUNnSUNBZ09BQVVRMENJQVlRZTBVTkFBc0xJQVlnQVJBUEN5QUdJQzRRRHlBUFFvQ0FnSURnQURjREFBd09DeUFQSUM0M0F3QU1Bd3NnREMwQUJVRUJjUTBCQ3lBR0lBZEJoWmNCRUk4QkRBc0xJQnNvQWdBb0FoQWlDVUV3YWlFTElBa2dDU2dDR0NBSGNVRi9jMEVDZEdvb0FnQWhDUU5BSUFsRkRRRWdDeUFKUVFGclFRTjBhaUlKS0FJRUlBZEdEUUlnQ1NnQ0FFSC8vLzhmY1NFSkRBQUxBQXNnQ0NFSERBVUxJQVlnQnhEZkJRd0lDeUFHRUNRTUJ3c2dCaUFCRUE4TElBaENnSUNBZ09BQU53TUFJQWhCQ0dvaENBd0ZDeUFMSUFrMkFpUWdDeUFFTmdJb0lBWXBBNmdCSWkxQ0lJaW5RWFZQQkVBZ0xhY2lCeUFIS0FJQVFRRnFOZ0lBQ3lBR0lBRkIwUUVnTFVFREVCa2FJQVlnQVVIT0FFS0FnSUNBTUNBR0tRT3dBU0l0SUMxQmdEQVFiUm9nQ0NBQk53TUFJQWhCQ0dvaEJ3dEJBQXNoQ1NBSElRZ2dEU0VLSUFsRkRRRUxDeUFISVFnTFFRRWhCd3dGQ3dKQUFrQWdGaWtEZ0FFaUxrS0FnSUNBY0ZRTkFDQXVweUlITHdFR1FRTkhEUUFnQnlnQ0VDSUhRVEJxSVFvZ0J5QUhLQUlZUVg5elFRSjBRYWgrY21vb0FnQWhCd0pBQTBBZ0J3UkFJQW9nQjBFQmEwRURkR29pQnlnQ0JFRTFSZzBDSUFjb0FnQkIvLy8vSDNFaEJ3d0JDd3NnRWlBTk5nSWdJQVlnTGtFQVFRQkJBQkRLQWlBV0tRT0FBU0V1Q3lBdVFvQ0FnSUJ3VkEwQUlDNm5JZ2N2QVFaQkEwY05BQ0FITFFBRlFTQnhEUUVMQTBBZ0hDQUlJZ2RQRFFFZ0JpQUhRUWhySWdncEF3QWlBUkFQSUFGQ2dJQ0FnSENEUW9DQWdJRFFBRklOQUNBQnB5SUtEUVVnQmlBSFFSQnJJZ2dwQXdBUUR5QUdJQWRCR0dzcEF3QkJBUkN0QVJvTUFBc0FDMEtBZ0lDQTRBQWhMa0tBZ0lDQTRBQWhBU0FUTFFBUlFUQnhSUTBCQ3lBU0lBZzJBaXdnRWlBTk5nSWdEQUVMSUJJb0Fod2dFa0VZYWtjRVFDQVdJQklRendVTEEzNGdDQ0FYVFFSK0lBRUZJQVlnRnlrREFCQVBJQmRCQ0dvaEZ3d0JDd3NoTGdzZ0ZpQVNLQUlBTmdLTUFRd0NDeUFJSUJZcEE0QUJOd01BSUJaQ2dJQ0FnQ0EzQTRBQklCTW9BaFFnQ21vaENpQUhJUWhCQUNFSERBQUxBQXNnRGtHZ0FXb2tBQ0F1Q3o4QkFYOGpBRUhRQUdzaUFpUUFJQUlnQVFSL0lBQW9BaEFnQWtFUWFpQUJFSkFCQlVIUTZnQUxOZ0lBSUFCQnYvVUFJQUlReGdJZ0FrSFFBR29rQUF1b0FRQUNRQ0FCUVlBSVRnUkFJQUJFQUFBQUFBQUE0SCtpSVFBZ0FVSC9EMGtFUUNBQlFmOEhheUVCREFJTElBQkVBQUFBQUFBQTRIK2lJUUJCL1JjZ0FTQUJRZjBYVGh0Qi9nOXJJUUVNQVFzZ0FVR0JlRW9OQUNBQVJBQUFBQUFBQUdBRG9pRUFJQUZCdUhCTEJFQWdBVUhKQjJvaEFRd0JDeUFBUkFBQUFBQUFBR0FEb2lFQVFmQm9JQUVnQVVId2FFd2JRWklQYWlFQkN5QUFJQUZCL3dkcXJVSTBocitpQzNVQkEzOENRQUpBSUFGQ2dJQ0FnSEJhQkVBZ0FhY2lBeThCQmlJRVFRcHJJZ1ZCR2sxQkFFRUJJQVYwUVlHQWdDeHhHeUFFUVFSclFRUkpjZzBCQ3lBQUlBSVFEeUFCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQUVISDVBQkJBQkFWRHdzZ0FDQURLUU1nRUE4Z0F5QUNOd01nQ3dzYkFDQUFJQUZCL3dGeEVCRWdBQ0FDSUFBb0FnUnJRUVJyRUIwTGpnRUJBbjhqQUVFUWF5SUNKQUFDZnlBQkJFQWdBRUVnYWlBQUlBQkJ3UUJyUVJwSkd5QUFRZjhBVFEwQkdpQUNRUVJxSUFCQkFoQ3lBeG9nQWlnQ0JBd0JDeUFBUVNCcklBQWdBRUhoQUd0Qkdra2JJQUJCL3dCTkRRQWFJQUpCQkdvZ0FFRUFFTElESVFFZ0FpZ0NCQ0lESUFBZ0EwSC9BRXNiSUFBZ0FVRUJSaHNMSVFBZ0FrRVFhaVFBSUFBTFJ3SUJmZ0YvSUFBcEE4QUJJUVFnQVVJZ2lLZEJkVThFUUNBQnB5SUZJQVVvQWdCQkFXbzJBZ0FMSUFBZ0JDQUNJQUZCQXhEdkFSb2dBQ0FCSUFNUSt3VWdBQ0FCRUE4TGlBZ0NCWDhCZmlNQVFSQnJJZ01rQUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FBS0FJUUlnSkJ5d0JxRGdNRUFRTUFDeUFDUWVzQWFrRUNTUTBCQWtBZ0FrRXJhdzREQVFZQkFBc2dBa0ZhUmcwRUlBSkIvZ0JHRFFBZ0FrRWhSdzBGQzBGL0lRUWdBQkFTRFFrZ0FFRVFFTjhCRFFrQ1FBSkFBa0FDUUFKQUFrQWdBa0VyYXc0REFnVUJBQXNnQWtHMmYwWU5BeUFDUVNGR0RRSWdBa0grQUVjTkJDQUFRWlVCRUJBTURRc2dBRUdNQVJBUURBd0xJQUJCalFFUUVBd0xDeUFBUVpZQkVCQU1DZ3NnQUVFT0VCQWdBRUVHRUJBTUNRc1FBUUFMSUFBUUVnMEZJQUJCQUJEZkFRMEZJQUFnQTBFTWFpQURRUWhxSUFNZ0EwRUVha0VBUVFFZ0FoQzFBUTBGSUFBZ0FrRUhhMEgvQVhFUUVDQUFJQU1vQWd3Z0F5Z0NDQ0FES0FJQUlBTW9BZ1JCQWtFQUVNRUJEQVFMUVg4aEJDQUFFQklOQnlBQVFSQVEzd0VOQjBFQUlRUUNRQ0FBS0FKQUlnRW9BcGdDSWdKQkFFZ05BQ0FCS0FLQUFpQUNhaUlCTFFBQVFiZ0JSdzBBSUFGQnR3RTZBQUFMSUFCQmx3RVFFQXdIQ3lBQVFVQnJLQUlBSVFGQmZ5RUVJQUFRRWcwR0lBQkJFQkRmQVEwR1FRQWhCQUpBSUFFb0FwZ0NJZ0pCQUVnTkFBSkFBa0FDUUFKQUFrQUNRQ0FCS0FLQUFpQUNhaUlGTFFBQUlnWkJ4d0JyRGdRQkJnWUZBQXNnQmtHK0FVWU5BeUFHUWJnQlJnMENJQVpCd1FCSERRVWdCU2dBQVNFRlFYOGhCQ0FCUVg4MkFwZ0NJQUVnQWpZQ2hBSWdBQ0FBS0FJQUlBVVFYQ0lIUVFFUXRBRWhBU0FBS0FJQUlBY1FEeUFBS0FJQUlBVVFFeUFCUlEwQkRBd0xJQUZCZnpZQ21BSWdBU0FDTmdLRUFnc2dBRUdZQVJBUURBa0xJQVVvQUFFaUFrRUlSaUFDUWZFQVJuSU5BaUFCTFFCdVFRRnhCRUFnQUVHVjdBQkJBQkFXREFjTElBVkJ1Z0U2QUFBTUNBc2dBRUg3OUFCQkFCQVdEQVVMSUFCQk1CQVFJQUJCQUJBYUlBQkJRR3NvQWdCQkF4QmtEQWNMSUFCQkRoQVFJQUJCQ2hBUURBWUxJQUFvQWtBaUFTMEFiRUVDY1VVRVFDQUFRZjd3QUVFQUVCWU1Bd3NnQVNnQ1pFVUVRQ0FBUVpETkFFRUFFQllNQXd0QmZ5RUVJQUFRRWcwRklBQkJFQkRmQVEwRklBQkJpd0VRRUF3RUMwRi9JUVFnQUNBQlFRUnhRUUp5RUxzRERRUWdBQ2dDTUEwQUlBQW9BaEFpQWtIckFHcEJBVXNOQUNBQUlBTkJER29nQTBFSWFpQURJQU5CQkdwQkFFRUJJQUlRdFFFTkJDQUFJQUpCQld0Qi93RnhFQkFnQUNBREtBSU1JQU1vQWdnZ0F5Z0NBQ0FES0FJRVFRTkJBQkRCQVNBQUVCSU5CQXRCQUNFRUlBRkJHSEZGRFFNZ0FDZ0NFRUYrY1VHa2YwY05BeUFCUVJCeFJRMEJJQUFvQWtBdEFHNUJCSEVOQVNBQUtBSUFRYStZQVVFQUVJQUNDMEYvSVFRTUFndEJmeUVFSUFBUUVnMEJJQUJCQ0JEZkFRMEJJQUJCbndFUUVBdEJBQ0VFQ3lBRFFSQnFKQUFnQkF0Z0FDQUVRZklBSUFOQnhnQnJJQU5CdHdGR0cwSC9BWEVRRVNBRUlBQWdBaEFZRUIwZ0JTQUJJQVVvQWdBUXlBTWlBRFlDQUNBRUlBQVFIU0FFSUFaQi93RnhFQkVnQVNBRktBSUFRUUVRYVJvZ0FTQUJLQUxRQWtFQmFqWUMwQUlMOGlzQkVYOGpBRUdRQVdzaUF5UUFJQUFvQWdBaERnSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQUtBSVFJZ1JCZzM5SERRQWdBQ2dDS0EwQ0lBQW9BamhCQUJDREFVRTZSdzBCSUE0Z0FDZ0NJQkFZSVFrZ0FFRkFheWdDQUVHd0Ftb2hBZ0pBQTBBZ0FpZ0NBQ0lDUlEwQklBSW9BZ1FnQ1VjTkFBc2dBRUd2NXdCQkFCQVdEQnNMSUFBUUVnMGFJQUJCT2hBc0RSb2dBQ2dDRUNJRVFjVUFha0VEU1EwQUlBQkJRR3NpQlNnQ0FCQXlJUWNnQXlBRktBSUFJZ1FvQXJBQ05nSlFJQVFnQTBIUUFHbzJBckFDSUFOQmZ6WUNaQ0FEUXYvLy8vOFBOd0pjSUFNZ0J6WUNXQ0FESUFrMkFsUWdBeUFFS0FLOEFUWUNhRUVBSVFJZ0EwRUFOZ0pzSUFBZ0FVRWVkRUVmZFVFQVFRTWdCQzBBYmtFQmNSdHhFT0VCRFJvZ0FDQUhFQjRnQlNnQ0FDSUFJQUFvQXJBQ0tBSUFOZ0t3QWd3Y0N3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBUkIwQUJxRGlRREZBRWxGQlFVRkJRVUZBVUVCZ2NIQ0JRVUFna1VGQXdTQ3hFa0V4TVRGQlFVRkNRQUN5QUVRWU4vUmcwTUlBUkJPMFlOQ1NBRVFmc0FSdzBUSUFBUTRnSU5KUXdtQ3lBQUtBSkFLQUlnQkVBZ0FFR3F6QUJCQUJBV0RDVUxJQUFRRWcwa1FRQWhBaUFBQW45QkFDQUFLQUlRSWdSQk8wWU5BQnBCQUNBRVFmMEFSZzBBR2tFQUlBQW9BakFOQUJvZ0FCQ1JBUTBsUVFFTEVPVUNJQUFRdHdFTkpBd21DeUFBRUJJTkl5QUFLQUl3QkVBZ0FFSEpJVUVBRUJZTUpBc2dBQkNSQVEwaklBQkJMeEFRSUFBUXR3RkZEU1FNSXdzZ0FCQVNEU0lnQUJDQUFSb2dBQkRBQVNBQUVQSUJEU0lnQUVIcEFFRi9FQndoQVNBQUlBQW9Ba0F0QUc1QkFYRkZJZ0lRNFFFTklnSkFJQUFvQWhCQnNYOUhCRUFnQVNFRURBRUxJQUJCNndCQmZ4QWNJUVFnQUJBU0RTTWdBQ0FCRUI0Z0FDQUNFT0VCRFNNTElBQWdCQkFlREI4TElBQkJRR3NpQkNnQ0FCQXlJUUVnQkNnQ0FCQXlJUUlnQXlBRUtBSUFJZ1FvQXJBQ05nSlFJQVFnQTBIUUFHbzJBckFDSUFOQ2dJQ0FnSEEzQW1BZ0F5QUJOZ0pjSUFNZ0FqWUNXQ0FESUFrMkFsUWdCQ2dDdkFFaEJDQURRUUEyQW13Z0F5QUVOZ0pvSUFBUUVnMGhJQUFRd0FFZ0FDQUJFQjRnQUJEeUFRMGhJQUJCNlFBZ0FoQWNHaUFBRUtBQ0RTRWdBRUhyQUNBQkVCd2FJQUFnQWhBZUlBQkJRR3NvQWdBaUFDQUFLQUt3QWlnQ0FEWUNzQUlNSWdzZ0FFRkFheUlCS0FJQUVESWhBaUFCS0FJQUVESWhCQ0FCS0FJQUVESWhCU0FESUFFb0FnQWlBU2dDc0FJMkFsQWdBU0FEUWRBQWFqWUNzQUlnQTBLQWdJQ0FjRGNDWUNBRElBSTJBbHdnQXlBRU5nSllJQU1nQ1RZQ1ZDQUJLQUs4QVNFQklBTkJBRFlDYkNBRElBRTJBbWdnQUJBU0RTQWdBQ0FGRUI0Z0FCREFBU0FBRUtBQ0RTQWdBQ0FDRUI0Z0FFRzhmeEFzRFNBZ0FCRHlBUTBnSUFBb0FoQkJPMFlFUUNBQUVCSU5JUXNnQUVIcUFDQUZFQndhSUFBZ0JCQWVJQUJCUUdzb0FnQWlBQ0FBS0FLd0FpZ0NBRFlDc0FJTUlRc2dBQkFTRFI4Z0FCREFBU0FEUVFBMkFoZ0NRQ0FBS0FJUUlnSkJXa2NFUUVFQklRRWdBa0VvUncwQklBQWdBMEVZYWtFQUVKNEJHZ3dCQ3lBQUtBSkFMUUJzUVFKeFJRUkFJQUJCbVRaQkFCQVdEQ0VMSUFBUUVnMGdRUUFoQVFzZ0FFRW9FQ3dOSDBFQklRUWdBeTBBR0VFQmNVVUVRQ0FBS0FJQUlRb2dBRUZBYXlJQ0tBSUFJZ2dvQXJ3QklROGdDQkF5SVFjZ0FpZ0NBQkF5SVJBZ0FpZ0NBQkF5SVJFZ0FpZ0NBQkF5SVJJZ0FCQ0FBUm9nQXlBQ0tBSUFJZ1VvQXJBQ05nSlFJQVVnQTBIUUFHbzJBckFDSUFOQkFEWUNiQ0FEUW9HQWdJQndOd0pnSUFNZ0J6WUNYQ0FESUJFMkFsZ2dBeUFKTmdKVUlBTWdEellDYUNBQVFlc0FRWDhRSENFTUlBSW9BZ0FvQW9RQ0lRc2dBQ0FTRUI0Z0FDZ0NFQ0VDUVZNaEJRSkFBa0FDUUFKQUlBQkJCQkM5QXc0Q0FBRWtDeUFDUVV0R0lRMGdBa0ZUUmlFRUlBUWdBa0d6ZjBaeVJTQUNRVXRIY1EwQklBSWhCUXNnQUJBU0RTSWdBQ2dDRUNJQ1Fmc0FSaUFDUWRzQVJuSU5FZ0pBSUFKQmczOUdCRUFnQUNnQ0tFVU5BUXNnQUVISjl3QkJBQkFXRENNTElBb2dBQ2dDSUJBWUlRWWdBQkFTQkVBZ0FDZ0NBQ0FHRUJNTUl3c2dBQ0FHSUFVUW9RSUVRQ0FBS0FJQUlBWVFFd3dqQ3lBQVFiMEJRYjBCUWJrQklBUWJJQTBiRUJBZ0FDQUdFQm9nQUVGQWF5Z0NBQ0FJTHdHOEFSQVhEQUVMQWtBQ1FDQUFLQUlRUVNCeVFmc0FSdzBBSUFBZ0EwRkFhMEVBRUo0QklnUkJXMGNnQkVHNWYwZHhEUUFnQUVFQVFRQkJBU0FES0FKQVFRSnhRUUVRd2dGQkFFNE5BUXdqQ3lBQUVLTUNEU0lnQUNBRFFjZ0FhaUFEUWNRQWFpQURRY3dBYWlBRFFUeHFRUUJCQUVHOWZ4QzFBUTBpSUFBZ0F5Z0NTQ0FES0FKRUlBTW9Ba3dnQXlnQ1BFRUVRUUFRd1FFTElBSWhCUXRCQUNFQ0RCd0xJQUJCUUdzb0FnQW9BcndCSVFZZ0FCQ0FBUm9nQUNnQ0VDSUJRVHRHRFJwQlV5RUVBa0FnQUVFRUVMMEREZ0lBR1NBTElBRkJzMzlHSUFGQlUwWnlEUmNnQVNJRVFVdEdEUmdnQUVFQUVOa0VEUjhnQUVFT0VCQU1HUXNnQUJBU0RSNENRQ0FBS0FJd0RRQWdBQ2dDRUVHRGYwY05BQ0FBS0FJb0RRQWdBQ2dDSUNFSEN5QUFLQUpBSWdKQnNBSnFJUUVnQWlnQ3ZBRWhCU0FFUWI1L1JpRUdBa0FEUUNBQktBSUFJZ0VFUUNBQUlBVWdBU2dDR0JDZkFpQUJLQUlZSVFVQ1FDQUdSUVJBSUFFb0Fnd2lBa0YvUmcwQklBZEZEUVFnQVNnQ0JDQUhSdzBCREJrTElBRW9BZ2dpQWtGL1JnMEFJQWRGRFFNZ0FTZ0NCQ0FIUmcwWUN5QUJLQUljQkg4Z0FFR0RBUkFRUVFNRlFRQUxJUUlEUUNBQ0lBRW9BaEJPUlFSQUlBQkJEaEFRSUFKQkFXb2hBZ3dCQ3dzZ0FTZ0NGRUYvUmcwQklBQkJCaEFRSUFCQjdRQWdBU2dDRkJBY0dpQUFRUTRRRUF3QkN3c2dCMFVFUUNBRVFiNS9SZzBQSUFCQjA4a0FRUUFRRmd3Z0N5QUFRY0R5QUVFQUVCWU1Id3NnQUVIckFDQUNFQndhREJVTElBQVFFZzBkSUFBUXdBRWdBQkR5QVEwZElBQVFnQUVhSUFCQlFHc2lCQ2dDQUJBeUlRVWdBeUFFS0FJQUlnSW9BckFDTmdKUUlBSWdBMEhRQUdvMkFyQUNRWDhoQVNBRFFYODJBbVFnQTBMLy8vLy9IemNDWENBRElBVTJBbGdnQXlBSk5nSlVJQUlvQXJ3QklRSWdBMEVBTmdKc0lBTWdBallDYUNBQVFmc0FFQ3dOSFVGL0lRY0RRQUpBQWtBQ1FDQUFLQUlRSWdKQlAyb09BZ0FCQWdzZ0FVRUFTQVIvUVg4RklBQkI2d0JCZnhBY0N5RUNJQUFnQVJBZUEwQWdBQkFTRFNFZ0FFRVJFQkFnQUJDUkFRMGhJQUJCT2hBc0RTRWdBRUdyQVJBUUlBQW9BaEJCUVVZRVFDQUFRZW9BSUFJUUhDRUNEQUVMQ3lBQVFla0FRWDhRSENFQklBQWdBaEFlREFJTElBQVFFZzBmSUFCQk9oQXNEUjhnQjBFQVRnUkFRWmd0SVFJTUZRc2dBVUVBU0FSQUlBQkI2d0JCZnhBY0lRRUxJQUJCdGdFUUVDQUVLQUlBUVFBUU9TQUVLQUlBS0FLRUFrRUVheUVIREFFTElBSkIvUUJIQkVBZ0FVRUFTQVJBUWU4c0lRSU1GUXNnQUVFSEVPRUJSUTBCREI4TEN5QUFRZjBBRUN3TkhRSkFJQWRCQUU0RVFDQUFRVUJyS0FJQUlnSW9Bb0FDSUFkcUlBRTJBQUFnQWlnQ3BBSWdBVUVVYkdvZ0IwRUVhallDQkF3QkN5QUFJQUVRSGdzZ0FDQUZFQjRnQUVFT0VCQWdBRUZBYXlnQ0FDSUJJQUVvQXJBQ0tBSUFOZ0t3QWd3YUN5QUFFTUFCSUFBUUVnMGNJQUJCUUdzaUJDZ0NBQkF5SVFVZ0JDZ0NBQkF5SVFFZ0JDZ0NBQkF5SVFJZ0JDZ0NBQkF5SVFjZ0FFSHNBQ0FGRUJ3YUlBTWdCQ2dDQUNJR0tBS3dBallDVUNBR0lBTkIwQUJxTmdLd0FpQURRdi8vLy84Zk53SmNJQU5DZ0lDQWdIQTNBbFFnQmlnQ3ZBRWhCaUFEUVFBMkFtd2dBeUFHTmdKb0lBTWdBallDWkNBQUVPSUNEUndnQkNnQ0FDSUVJQVFvQXJBQ0tBSUFOZ0t3QWlBRUVPWUNCRUFnQUVFT0VCQWdBRUVHRUJBZ0FFSHRBQ0FDRUJ3YUlBQkJEaEFRSUFCQjZ3QWdCeEFjR2dzQ1FBSkFBa0FnQUNnQ0VFRTdhZzRDQUJNQkN5QUFFQklOSGlBQUVJQUJHaUFBSUFVUUhpQUFLQUlRUWZzQVJnUkFJQUJCRGhBUURCSUxJQUJCS0JBc0RSNGdBQ2dDRUNJRVFmc0FSaUFFUWRzQVJuSU5BUUpBSUFSQmczOUdCRUFnQUNnQ0tFVU5BUXNnQUVIZTlnQkJBQkFXREI4TElBNGdBQ2dDSUJBWUlRUUNRQ0FBRUJKRkJFQWdBQ0FFUVVVUW9RSkJBRTROQVFzZ0RpQUVFQk1NSHdzZ0FFRzVBUkFRSUFCQlFHc2lCU2dDQUNBRUVEa2dCU2dDQUNJRUlBUXZBYndCRUJjTUVBc2dBRUhnSFVFQUVCWU1IUXNnQUVGVFFRQkJBVUYvUVFFUXdnRkJBRTRORGd3Y0N5QUFFQkpGRFJ3TUd3c2dBRUZBYXlnQ0FDMEFia0VCY1FSQUlBQkJvTmdBUVFBUUZnd2JDeUFBRUJJTkdpQUFFUElCRFJvZ0FCQ0FBUm9nQUNBQVFVQnJJZ0VvQWdCQjFBQkJBQkNnQVNJQ1FRQklEUm9nQUVIdkFCQVFJQUJCMlFBUUVDQUJLQUlBSUFKQi8vOERjUkFYSUFBUXdBRWdBQkNnQWcwYURCY0xJQUZCQVhGRkRRTWdBVUVFY1EwS0lBQW9BamhCQUJDREFVRXFSZzBEREFvTElBQW9BaWhGRFFFTElBQVE0Z0VNRnd0QlV5RUVBa0FnQUNBQkVMMEREZ0lBRlJjTElBQkJoUUVRU2tVTkJDQUFLQUk0UVFFUWd3RkJSMGNOQkNBQlFRUnhEUWNMSUFCQm15TkJBQkFXREJVTElBRkJCSEZGQkVBZ0FFSGZJa0VBRUJZTUZRdEJmeUVCUVFBaEFpQUFRUUJCQUJEdEFrVU5GZ3dYQ3lBQUVCSU5FeUFBRUxjQlJRMFVEQk1MSUFNZ0FDZ0NBQ2dDRUNBRFFkQUFhaUFBS0FJZ0VKQUJOZ0lRSUFCQmdEMGdBMEVRYWhBV0RCSUxJQUFRa1FFTkVRSkFJQUJCUUdzaUFTZ0NBQ2dDcEFGQkFFNEVRQ0FBUWRrQUVCQWdBU2dDQUNJQklBRXZBYVFCRUJjTUFRc2dBRUVPRUJBTElBQVF0d0ZGRFJJTUVRc2dBRUhyMlFCQkFCQVdEQkFMUVFFaEFpQUFJQVZCQUVFQlFYOUJBQkRDQVVFQVRnMExEQThMUVFBaEFpQUFRUUZCQUNBQUtBSVlJQUFvQWhRUXhBRU5EZ3dRQ3lBQVFTa1FMQTBOQ3lBQVFld0FJQUVRSEJvZ0FCQ0FBUm9nQXlBQVFVQnJJZ1FvQWdBaUJTZ0NzQUkyQWxBZ0JTQURRZEFBYWpZQ3NBSWdBMEwvLy8vL0h6Y0NYQ0FEUW9DQWdJQndOd0pVSUFVb0Fyd0JJUVVnQTBFQU5nSnNJQU1nQlRZQ2FDQURJQUkyQW1RZ0FCRGlBZzBNSUFRb0FnQWlCU0FGS0FLd0FpZ0NBRFlDc0FJZ0FCRHpBU0FBRVBNQklBUW9BZ0FRNWdJRVFDQUFRUTRRRUNBQVFRWVFFQ0FBUWUwQUlBSVFIQm9nQUVFT0VCQWdBRUhyQUNBSEVCd2FDeUFCSVFVTElBQWdCUkFlSUFCQjdRQWdBaEFjR2lBQVFTOFFFQ0FBSUFJUUhpQUFLQUlRUVVaR0JFQWdBQkFTRFF3Z0F5QUFRVUJyS0FJQUlnSW9BckFDTmdKUUlBSWdBMEhRQUdvMkFyQUNJQU5CZnpZQ1pDQURRdi8vLy84dk53SmNJQU5DZ0lDQWdIQTNBbFFnQWlnQ3ZBRWhCRUVBSVFFZ0EwRUFOZ0pzSUFNZ0JEWUNhQ0FDS0FLa0FVRUFUZ1JBSUFBb0FnQWdBa0hSQUJCUElnRkJBRWdORFNBQVFkZ0FFQkFnQUVGQWF5SUNLQUlBSWdRZ0JDOEJwQUVRRnlBQVFka0FFQkFnQWlnQ0FDQUJRZi8vQTNFUUZ5QUFFTUFCQ3lBQUVPSUNEUXdnQUVGQWF5SUVLQUlBSWdJb0FxUUJRUUJPQkVBZ0FFSFlBQkFRSUFRb0FnQWdBVUgvL3dOeEVCY2dBRUhaQUJBUUlBUW9BZ0FpQVNBQkx3R2tBUkFYSUFRb0FnQWhBZ3NnQWlBQ0tBS3dBaWdDQURZQ3NBSUxJQUJCN2dBUUVDQUFJQWNRSGd3TUN5QUFJQUpCQUJBV0RBb0xJQUJCNndBZ0FoQWNHaUFBRUJJTkNRc2dBQkMzQVVVTkNRd0lDeUFCSVFRTElBQVFFZzBHSUFCQkFDQUVRUUFRekFNTkJnc2dBQ0FBUVVCcktBSUFLQUs4QVNBR0VKOENDeUFBUVRzUUxBMEVJQUJCUUdzaUFpZ0NBQkF5SVFVZ0FpZ0NBQkF5SVFRZ0FpZ0NBQkF5SVFFZ0FpZ0NBQkF5SVFjZ0F5QUNLQUlBSWdJb0FyQUNOZ0ljSUFJZ0EwRWNhallDc0FJZ0EwS0FnSUNBY0RjQ0xDQURJQVEyQWlnZ0F5QUhOZ0lrSUFNZ0NUWUNJQ0FDS0FLOEFTRUNJQU5CQURZQ09DQURJQUkyQWpRZ0FTRUNJQUFvQWhCQk8wY0VRQ0FBSUFVUUhpQUFFSkVCRFFVZ0FFSHBBQ0FIRUJ3YUlBVWhBZ3NnQUVFN0VDd05CQUpBSUFBb0FoQkJLVVlFUUNBRElBSTJBaWhCQUNFRklBSWhCQXdCQ3lBQVFlc0FJQUVRSEJvZ0FFRkFheWdDQUNnQ2hBSWhCU0FBSUFRUUhpQUFFSkVCRFFVZ0FFRU9FQkFnQVNBQ1JnMEFJQUJCNndBZ0FoQWNHZ3NnQUVFcEVDd05CQ0FBUVVCcklnZ29BZ0FvQW9RQ0lRc2dBQ0FCRUI0Z0FCQ2dBZzBFSUFBZ0NDZ0NBQ2dDdkFFZ0JoQ2ZBZ0pBSUFFZ0FrWWdBaUFFUm5KRkJFQWdBRUZBYXlJR0tBSUFJZ0ZCZ0FKcUlnZ2dBU2dDaEFJaUNpQUxJQVZySWdKcUVNWUJHaUFJSUFFb0FvQUNJQVZxSUFJUWNpQUJLQUtBQWlBRmFrR3pBU0FDRUNzYUlBWW9BZ0FpQWlBQktBS0VBa0VGYXpZQ21BSWdCQ0FDS0FLc0FpSUJJQUVnQkVnYklRWWdDaUFGYXlFSUEwQWdCQ0FHUmcwQ0lBSW9BcVFDSUFSQkZHeHFJZ29vQWdRaUFTQUZTQ0FCSUF0T2NrVUVRQ0FLSUFFZ0NHbzJBZ1FMSUFSQkFXb2hCQXdBQ3dBTElBQkI2d0FnQkJBY0dnc2dBQ0FIRUI0Z0FFRkFheWdDQUNJQklBRW9BckFDS0FJQU5nS3dBZ3dCQ3lBQVFlc0FJQkFRSEJvZ0FFRkFheWdDQUNnQ2hBSWhEU0FBSUF3UUhnSkFJQUFvQWhBaURFRTlSdzBBQWtBZ0FCQVNSUVJBSUFCQkFCQzJBVVVOQVFzZ0NpQUdFQk1NQlFzZ0JrVU5BQ0FBUWJrQkVCQWdBQ0FHRUJvZ0FFRkFheWdDQUNBSUx3RzhBUkFYQ3lBS0lBWVFFd0pBQWtBQ1FDQUFRY01BRUVvaUJBUkFJQU5CQVRZQ2JDQURJQU1vQW1CQkFtbzJBbUJCcWQwQUlRWWdERUU5UmcwQkRBTUxJQUFvQWhCQnVYOUhEUUVnQVVVRVFDQUFRZmFYQVVFQUVCWU1Cd3NnREVFOVJ3MENRY1RRQUNFR0lBVkJzMzlIRFFBZ0NDMEFia0VCY1VVZ0FrRi9jM0VOQWdzZ0F5QUdOZ0lBSUFCQi9jQUFJQU1RRmd3RkN5QUFRZFhPQUVFQUVCWU1CQXNnQUJBU0RRTUNRQ0FFQkVBZ0FCQldSUTBCREFVTElBQVFrUUVOQkFzZ0FDQUFRVUJySWdVb0FnQW9BcndCSUE4UW53SWdBRUg5QUVIK0FDQUJHMEg4QUNBRUd4QVFJQUJCNndBZ0J4QWNHaUFBUVNrUUxBMERJQVVvQWdBaUFrR0FBbW9pQ0NBQ0tBS0VBaUlLSUEwZ0Myc2lCbW9ReGdFYUlBZ2dBaWdDZ0FJZ0Myb2dCaEJ5SUFJb0FvQUNJQXRxUWJNQklBWVFLeG9nQlNnQ0FDSUZJQUlvQW9RQ1FRVnJOZ0tZQWlBSElBVW9BcXdDSWdJZ0FpQUhTQnNoQ0NBS0lBdHJJUW9nQnlFQ0EwQWdBaUFJUndSQUlBVW9BcVFDSUFKQkZHeHFJZ3dvQWdRaUJpQUxTQ0FHSUExT2NrVUVRQ0FNSUFZZ0NtbzJBZ1FMSUFKQkFXb2hBZ3dCQ3dzZ0FDQVFFQjRnQUJDZ0FnMERJQUFnQUVGQWF5Z0NBQ2dDdkFFZ0R4Q2ZBaUFBSUFjUUhnSi9JQVFFUUNBQlJRUkFJQUJCRkJBUUlBQkJEaEFRSUFCQkpCQVFJQUJCUUdzb0FnQkJBQkFYSUFCQml3RVFFQ0FBUVlJQkVCQkJnd0VNQWdzZ0FFR0FBUkFRSUFCQlFHc29BZ0JCQUJCa1FZTUJEQUVMSUFCQi93QVFFRUVPQ3lFQ0lBQkI2UUFnRWhBY0dpQUFRUTRRRUNBQUlCRVFIaUFBSUFJUUVDQUFRVUJyS0FJQUlnRWdBU2dDc0FJb0FnQTJBckFDQ3lBQUVQTUJEQU1MSUFGQkJIRU5BQ0FBUWRvalFRQVFGZ3dCQ3lBQUVCSU5BRUVBSVFJZ0FFRUJJQVJCQUJETUF3MEFJQUFRdHdGRkRRSUxRWDhoQWd3QkMwRUFJUUlMSUE0Z0NSQVRJQUloQVFzZ0EwR1FBV29rQUNBQkN6b0JBWDhqQUVIUUFHc2lBU1FBSUFFZ0FDZ0NBQ2dDRUNBQlFSQnFJQUFvQWlBUWtBRTJBZ0FnQUVHc3hRQWdBUkFXSUFGQjBBQnFKQUFMamdJQkFYNENRQUpBQWtBQ1FDQUJRdi8vLy85dldBMEFJQUFnQVVFOElBRkJBQkFVSWdGQ2dJQ0FnSENESWdOQ2dJQ0FnT0FBVVFSQUlBRVBDeUFEUW9DQWdJQXdVUVJBSUFKQ0lJaW5RWFZKRFFNTUJBc2dBVUwvLy8vL2IxZ0VRQ0FBSUFFUUR3d0JDeUFBSUFGQjJnRWdBVUVBRUJRaEF5QUFJQUVRRHdKQUFrQWdBMEtBZ0lDQWNJTWlBVUtBZ0lDQUlGSUVRQ0FCUW9DQWdJRGdBRkVOQWlBQlFvQ0FnSUF3VWcwQkN5QUNRaUNJcDBGMVNRMEVEQVVMSUFOQ2dJQ0FnSEJhQkVBZ0E2Y3RBQVZCRUhFTkFRc2dBQ0FERUE4Z0FFR2lQa0VBRUJVTUFnc2dBdzhMSUFBUUpBdENnSUNBZ09BQUlRSUxJQUlQQ3lBQ3B5SUFJQUFvQWdCQkFXbzJBZ0FnQWdzU0FDQUFJQUVnQWlBRElBUkJ4d0FRcEFRTERRQWdBQ0FCSUFKQkFCQ1ZCQXZzQkFNQ2ZnRjhBMzhqQUVFUWF5SUhKQUFDUUFKQUFrQUNRQUorQWtBQ1FBSkFBa0FnQVVFSWF5SUdLUU1BSWdSQ0lJaW5RUWRyUVc1SkRRQUNRQ0FFUW9DQWdJQndWQTBBSUFBZ0IwRUlhaUFFSUFJUXdnVWlBVUVBU0FSQVFYOGhBUXdLQ3lBQlJRMEFJQUFnQkJBUFFRQWhBU0FIS1FNSUlRTU1DQXRCZnlFQlFvQ0FnSUF3SVFNZ0FDQUVFR3dpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBIQWtBQ1FBSkFBa0FnQkVJZ2lLY2lDRUVMYWc0REF3RUNBQXNnQ0EwRElBVEVJUU1DUUFKQUFrQWdBa0dNQVdzT0JBQUNBUUVIQ3lBRVFpQ0dVQVJBUVFBaEFVS0FnSUNBd1A3L0F5RUREQTBMUWdBZ0EzMGhBd3dCQ3lBRElBSkJBWFJCblFKcnJId2hBd3NnQTBMLy8vLy9ENE1nQTBLQWdJQ0FDSHhDLy8vLy93OVlEUWNhUW9DQWdJREFmaUFEdWIwaUEwS0FnSUNBd0lHQS9QOEFmU0FEUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3dIQ3lBQUtBSVFJUUVNQndzZ0FDQUdJQUlnQkNBQUtBSVFLQUs0QWhFYkFFVU5Cd3dJQ3lBQUlBWWdBaUFFSUFBb0FoQW9BdFFDRVJzQURRY01CZ3NnQUNnQ0VDSUJLQUtNQVNJSUJFQWdDQzBBS0VFRWNRMEZDeUFFUW9DQWdJREFnWUQ4L3dCOHZ5RUZBa0FnQWtHTUFXc09CQUFEQWdJQkN5QUZtaUVGREFJTEVBRUFDeUFDUVFGMFFaMENhN2NnQmFBaEJRdENnSUNBZ01CK0lBVzlJZ05DZ0lDQWdNQ0JnUHovQUgwZ0EwTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElRTkJBQ0VCREFJTElBQWdCaUFDSUFRZ0FTZ0NuQUlSR3dCRkRRQkJmeUVCUW9DQWdJQXdJUU1NQVF0QkFDRUJEQUVMSUFZZ0F6Y0RBQXNnQjBFUWFpUUFJQUVMbmdNQ0EzNEJmd0pBQWtBZ0FnUkFJQUFnQVVIY0FTQUJRUUFRRkNJRFFvQ0FnSUJ3Z3lJRVFvQ0FnSUFnVWdSQUlBUkNnSUNBZ09BQVVRMERJQVJDZ0lDQWdEQlNEUUlMSUFBZ0FVSFJBU0FCUVFBUUZDSURRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSWdBQ0FCSUFNUStnTWhCQ0FBSUFNUUR5QUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdCQThMUW9DQWdJRGdBQ0VEQWtBZ0FDQUVRZW9BSUFSQkFCQVVJZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBUVRjUWRpSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQ0FGRUE4TUFRc2dBRUVRRUY4aUFrVUVRQ0FBSUFFUUR5QUFJQVVRRHd3QkN5QUVRaUNJcDBGMVR3UkFJQVNuSWdZZ0JpZ0NBRUVCYWpZQ0FBc2dBaUFGTndNSUlBSWdCRGNEQUNBQlFvQ0FnSUJ3V2dSQUlBR25JQUkyQWlBTElBRWhBd3NnQUNBRUVBOGdBdzhMSUFBZ0FVSFJBU0FCUVFBUUZDSURRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRUxJQUFnQXhBNFJRUkFJQUFnQXhBUElBQkIvdWtBUVFBUUZVS0FnSUNBNEFBUEN5QUFJQUVnQXhENkF5RUJJQUFnQXhBUElBRWhBd3NnQXd2L0FnSURmd0orSXdCQkVHc2lBeVFBQWtBQ1FDQUJRb0NBZ0lCd1dnUkFJQUduSWdJdkFRWkJNRVlFUUFKQUlBQWdBMEVJYWlBQlFkOEFFSUVCSWdKRkRRQWdBeWtEQ0NJQlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQUlBSXBBd0FRNkFFaEFRd0ZDeUFBSUFFZ0Fpa0RDRUVCSUFJUUx5SUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTUNRQUpBSUFWQ0lJaW5RUUZxRGdRQUFRRUFBUXNnQUNBQ0tRTUFFSmtCSWdSQkFFZ0VRQ0FBSUFVUUR3d0NDeUFFRFFSQ2dJQ0FnT0FBSVFFZ0FDQUNLUU1BRU9nQklnWkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUFJQVVRRHd3R0N5QUFJQVlRRHlBR3B5QUZwMFlOQkFzZ0FDQUZFQThnQUVHRTVBQkJBQkFWQzBLQWdJQ0E0QUFoQVF3REN5QUNLQUlRS0FJc0lnQkZCRUJDZ0lDQWdDQWhBUXdEQ3lBQUlBQW9BZ0JCQVdvMkFnQWdBSzFDZ0lDQWdIQ0VJUUVNQWdzZ0FDQUJFSTBFSWdGQ0lJaW5RWFZKRFFFZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBREFFTElBVWhBUXNnQTBFUWFpUUFJQUVMQ3dBZ0FFR05Ja0VBRUVZTEdnQWdBQ2dDRUNBQklBSVE3d1FpQVVVRVFDQUFFSHdMSUFFTGdBRUJBbjhDUUFKQUlBRkZEUUFnQVNnQ0FDSUNRUUJNRFFFZ0FTQUNRUUZySWdJMkFnQWdBZzBBSUFFdEFBVkJBWEVFUUNBQUlBRXBBeGdRSXdzZ0FTZ0NDQ0lDSUFFb0Fnd2lBellDQkNBRElBSTJBZ0FnQVVJQU53SUlJQUJCRUdvZ0FTQUFLQUlFRVFBQUN3OExRZGFOQVVHdS9BQkI5Q2hCNnQwQUVBQUFDeElBSUFGQjNnRk9CRUFnQUNBQkVPZ0ZDd3ZiQVFJQmZ3SitRUUVoQkFKQUlBQkNBRklnQVVMLy8vLy8vLy8vLy84QWd5SUZRb0NBZ0lDQWdNRC8vd0JXSUFWQ2dJQ0FnSUNBd1AvL0FGRWJEUUFnQWtJQVVpQURRdi8vLy8vLy8vLy8vd0NESWdaQ2dJQ0FnSUNBd1AvL0FGWWdCa0tBZ0lDQWdJREEvLzhBVVJzTkFDQUFJQUtFSUFVZ0JvU0VVQVJBUVFBUEN5QUJJQU9EUWdCWkJFQkJmeUVFSUFBZ0FsUWdBU0FEVXlBQklBTlJHdzBCSUFBZ0FvVWdBU0FEaFlSQ0FGSVBDMEYvSVFRZ0FDQUNWaUFCSUFOVklBRWdBMUViRFFBZ0FDQUNoU0FCSUFPRmhFSUFVaUVFQ3lBRUN5MEJBWDlCQVNFQkFrQUNRQUpBSUFCQkRXc09CQUlCQVFJQUN5QUFRVFJHRFFFTElBQkJPRVloQVFzZ0FRc2ZBQ0FBSUFFZ0FDQUNFS29CSWdJZ0F5QUVFQmtoQkNBQUlBSVFFeUFFQzBRQkFYOUJmeUVESUFBZ0FDZ0NCQ0FDYWhER0FRUi9RWDhGSUFBb0FnQWdBV29pQXlBQ2FpQURJQUFvQWdRZ0FXc1FuQUVnQUNBQUtBSUVJQUpxTmdJRVFRQUxDNDRCQVFGL0lBQWdCa0VNRUVraUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBQWdBQ2dDQUVFQmFqWUNBQ0FHcHlJSElBVTdBU29nQnlBRU9nQXBJQWNnQXpvQUtDQUhJQUUyQWlRZ0J5QUFOZ0lnSUFjZ0J5MEFCVUh2QVhFZ0JFRUNhMEVFU1VFRWRISTZBQVVnQUNBR0lBQWdBa0hNbmdFZ0Foc1FxZ0VpQVNBREVKWURJQUFnQVJBVEN5QUdDeWtCQVg5QmZ5RUJBa0FnQUVFb0VDd05BQ0FBRUpFQkRRQkJmMEVBSUFCQktSQXNHeUVCQ3lBQkM0SUJBUU4vSUFCQlFHc2lBeWdDQUNJQkJFQWdBU2dDdkFFaEFpQUFRYlVCRUJBZ0F5Z0NBQ0FDUWYvL0EzRVFGeUFCSUFFb0Fzd0JJZ01nQWtFRGRHb29BZ0FpQURZQ3ZBRURRQUpBSUFCQkFFZ0VRRUYvSVFBTUFRc2dBeUFBUVFOMGFpSUNLQUlFSWdCQkFFNE5BQ0FDS0FJQUlRQU1BUXNMSUFFZ0FEWUN3QUVMQzBjQkFuOGdBQ2dDZkNFQ0FrQURRQ0FDUVFCS0JFQWdBQ2dDZENBQ1FRRnJJZ0pCQkhScUlnTW9BZ0FnQVVjTkFTQURLQUlFRFFFTUFnc0xJQUFnQVJEZ0JDRUNDeUFDQzdZQkFRSi9Ba0FnQWlBQktBSUVJZ3BHQkVBZ0F5RUxEQUVMSUFBZ0NpQUNJQU1nQkNBRklBWWdCeUFJSUFrUTlRRWlCVUVBVGcwQVFYOFBDMEVBSVFJZ0FTZ0N3QUlpQTBFQUlBTkJBRW9iSVFNQ1FBTkFJQUlnQTBjRVFBSkFJQVVnQVNnQ3lBSWdBa0VEZEdvaUNpOEJBa2NOQUNBS0xRQUFJZ3BCQVhaQkFYRWdCRWNOQUNBTElBcEJBWEZHRFFNTElBSkJBV29oQWd3QkN3c2dBQ0FCSUFzZ0JDQUZJQVlnQnlBSUlBa1F5UU1oQWdzZ0FnczFBUUYvSUFBb0FnQWlBUVJBSUFBb0FoUWdBVUVBSUFBb0FoQVJBUUFhQ3lBQVFnQTNBZ0FnQUVJQU53SVFJQUJDQURjQ0NBdkVBUUVDZnlNQVFkQUFheUlGSkFBZ0FDZ0NBQ0VHQWtBZ0FTQURFSzBGQkVBZ0JTQUdLQUlRSUFWQkVHb2dBeENRQVRZQ0FDQUFRZVNWQVNBRkVCWkJBQ0VBREFFTFFRQWhBQ0FHSUFGQkhHcEJGQ0FCUVNScUlBRW9BaUJCQVdvUWVBMEFJQUVnQVNnQ0lDSUFRUUZxTmdJZ0lBRW9BaHdnQUVFVWJHb2lBRUlBTndJQUlBQkJFR3BCQURZQ0FDQUFRUWhxUWdBM0FnQWdBQ0FHSUFJUUdEWUNEQ0FHSUFNUUdDRUJJQUFnQkRZQ0NDQUFJQUUyQWhBTElBVkIwQUJxSkFBZ0FBdjNGZ0VNZnlNQVFSQnJJaEFrQUNBQVFVQnJLQUlBSVFnZ0FDZ0NBQ0VMQWtBQ1FBSkFJQUZCQWtzTkFBSkFJQUlOQUVFQUlRSWdBRUdGQVJCS1JRMEFJQUFvQWpoQkFSQ0RBVUVLUmcwQVFYOGhCeUFBRUJJTkEwRUNJUUlMUVg4aEJ5QUFFQklOQWlBQUtBSVFJZ2xCS2tZRVFDQUFFQklOQXlBQUtBSVFJUWtnQWtFQmNpRUNDd0pBQWtBQ1FBSkFBa0FnQ1VFbmFnNENBUUlBQ3lBSlFZTi9SdzBEQWtBZ0FDZ0NLQTBBSUFGQkFrY2lEQ0FDUVFGeFJYSkZJQUFvQWlBaUNVRXRSbkVOQUNBTUlBSkJBbkZGY2lBSlFTNUhjZzBEQ3lBQUVPSUJEQVlMSUFGQkFrY05BaUFJTFFCdVFRRnhSUTBCREFJTElBRkJBa2NOQVNBQUtBSkVEUUVMSUFzZ0FDZ0NJQkFZSVF3Z0FCQVNSUTBCREFJTElBRkJBa1lnQlVFQ1JuSU5BQ0FBUWJMM0FFRUFFQllNQWdzQ1FBSkFBa0FnQ0NnQ0lDSUhSU0FCUVFGTGNnMEFJQWdvQWlSQkFVY05BQ0FJSUF3UW9nSWlDVVVOQUNBSktBSUlJQWdvQXJ3QlJ3MEFJQUJCcCs0QVFRQVFGZ3dCQzBGL0lSRUNRQ0FCUVFGSEJFQU1BUXNDUUNBQ0RRQWdDQzBBYmtFQmNRMEFJQWdnRENBSUtBTEFBVUVBRU1FRFFRQk9EUUFnQ0NBTUVQUUJRWUNBZ0lCNmNVR0FnSUNBQWtZTkFDQU1RYzBBUmdSQUlBZ29Ba2dOQVF0QkFTRVBDd0pBSUFkRkRRQWdDQ2dDSkVFQlN3MEFJQWdvQXJ3QklnY2dDQ2dDOEFGSERRQWdDQ0FNRUtJQ0lnbEZEUUVnQ1NnQ0NDQUhSdzBCSUFCQjQ4UUFRUUFRRmd3Q0MwRi9JUWNnQUNBSUlBeEJCRUVESUFJYkVLQUJJaEZCQUVnTkF3c2dDeUFJUVFBZ0FVRUJTeUFBS0FJTUlBUVE2QU1pQkEwQkN5QUxJQXdRRTBGL0lRY01BZ3NnQmdSQUlBWWdCRFlDQUFzZ0FFRkFheUFFTmdJQUlBUWdBa1VnQVVFRFNYRTJBalFnQkNBTU5nSndJQVFnQVVFSVJpSUhOZ0pnSUFRZ0FVRURSeUlOTmdKTUlBUWdEVFlDU0NBRUlBY2dBVUY4Y1VFRVJuSWlDVFlDTUVFQklRaEJBU0VLSUExRkJFQWdCQ2dDQkNJSUtBSmNJUW9nQ0NnQ1dDRUpJQWdvQWxRaEJ5QUlLQUpRSVFnTElBUWdDallDWENBRUlBazJBbGdnQkNBSE5nSlVJQVFnQ0RZQ1VDQUVJQUpCL3dGeElBRkJDSFJ5T3dGc0FrQUNRQUpBQWtBQ1FDQUJRUWRyUVFGTkJFQWdBRUVyRUJBZ0FVRUhSZ1JBSUFBUXdBTUxJQVJDQVRjQ09DQUVRVHhxSVFrZ0JFRTRhaUVJREFFTElBUkNBVGNDT0NBRVFUeHFJUWtnQkVFNGFpRUlJQUZCQTBjTkFDQUFLQUlRUVlOL1J3MEFJQUFvQWlnTkF5QUxJQVFnQUNnQ0lCQy9BMEVBU0EwRUlBUkJBVFlDakFFTUFRc0NRQ0FBS0FJUVFTaEdCRUFnQUNBUVFReHFRUUFRbmdFYUlCQXRBQXhCQkhFRVFDQUpRUUUyQWdBTElBQVFFa1VOQVF3RkN5QUFRU2dRTEEwRUN5QUpLQUlBQkVCQmZ5RUhJQVJCZnpZQ3ZBRWdBQkNBQVVFQVNBMEdDeUFBUVVCcklRMUJBQ0VLQWtBRFFDQUFLQUlRSWdkQktVWU5BU0FIUWFkL1J5SU9SUVJBSUFoQkFEWUNBQ0FBRUJJTkJpQUFLQUlRSVFjTEFrQUNRQUpBQWtBZ0IwR0RmMGNFUUNBSFFmc0FSeUFIUWRzQVIzRU5CQ0FJUVFBMkFnQUNRQ0FPUlFSQUlBQkJEUkFRSUFRb0FvZ0JJUWNNQVFzZ0N5QUVRUUFRdndNaEJ5QUFRZHNBRUJBTElBMG9BZ0FnQjBILy93TnhFQmNnQUVGVFFiTi9JQWtvQWdBYlFRRkJBVUYvUVFFUXdnRWlCMEVBU0EwS0lBY2dDbkloQjBFQklRb2dCMFVFUUNBRUlBUW9Bb3dCUVFGcU5nS01BVUVBSVFvTElBNUZEUUVNQXdzZ0FDZ0NLQTBJSUFBb0FpQWlCMEV0UmdSQUlBUXRBR3hCQVVZTkNRc2dDU2dDQUFSQUlBQWdCQ0FIUVFFUW9BRkJBRWdOQ2dzZ0N5QUVJQWNRdndNaUVrRUFTQTBKSUFBUUVnMEpJQTROQVNBQVFRMFFFQ0FBUVVCcklnb29BZ0FnRWtILy93TnhJZzBRRnlBSktBSUFCRUFnQUVFUkVCQWdBRUc5QVJBUUlBQWdCeEFhSUFvb0FnQWdCQzhCdkFFUUZ3c2dBRUhjQUJBUUlBb29BZ0FnRFJBWElBaEJBRFlDQUFzZ0FDZ0NFRUVwUmcwRUlBQkJLUkFzR2d3SUN3SkFJQUFvQWhCQlBVWUVRQ0FJUVFBMkFnQWdBQkFTRFFrZ0RTZ0NBQkF5SVFvZ0FFSGJBQkFRSUEwb0FnQWdFa0gvL3dOeElnNFFGeUFBUVJFUUVDQUFRUVlRRUNBQVFhc0JFQkFnQUVIcEFDQUtFQndhSUFCQkRoQVFJQUFRVmcwSklBQWdCeENoQVNBQVFSRVFFQ0FBUWR3QUVCQWdEU2dDQUNBT0VCY2dBQ0FLRUI1QkFTRUtEQUVMSUFwRkJFQWdCQ0FFS0FLTUFVRUJhallDakFFTElBa29BZ0JGRFFFZ0FFSGJBQkFRSUEwb0FnQWdFa0gvL3dOeEVCY0xJQUJCdlFFUUVDQUFJQWNRR2lBTktBSUFJQVF2QWJ3QkVCY0xJQUFvQWhCQktVWU5BaUFBUVN3UUxFVU5BUXdHQ3dzZ0FFSFp3Z0JCQUJBV0RBUUxBa0FDUUNBQlFRUnJEZ0lCQUFJTElBUW9Bb2dCUVFGR0RRRU1BZ3NnQkNnQ2lBRU5BUXNnQ1NnQ0FBUkFJQVFvQXN3QklBUW9BcndCUVFOMGFrRUVhaUVISUFCQlFHc2hDQU5BQWtBZ0J5Z0NBQ0lKUVFCSURRQWdCQ2dDZENJSElBbEJCSFFpQ1dvaUNpZ0NCQ0FFS0FLOEFVY05BQ0FFSUFvb0FnQWlDaEQwQVVFQVNBUkFJQXNnQkNBS0VFOUJBRWdOQmlBRUtBSjBJUWNnQUVHNEFSQVFJQUFnQnlBSmFpSUtLQUlBRUJvZ0NDZ0NBQ0FFTHdHOEFSQVhJQUJCdVFFUUVDQUFJQW9vQWdBUUdpQUlLQUlBUVFBUUZ3c2dCeUFKYWtFSWFpRUhEQUVMQ3lBQVFiVUJFQkFnQUVGQWF5Z0NBQ0FFTHdHOEFSQVhJQVJCQURZQ3ZBRWdCQ0FFS0FMTUFTZ0NCRFlDd0FFTElBQVFFZzBDSUFKQmZYRkJBVVlFUUNBQVFZY0JFQkFMSUFSQkFUWUNaQ0FBRUlBQkdpQUVJQVFvQXJ3Qk5nTHdBUUpBQWtBZ0FDZ0NFRUdtZjBjTkFDQUFFQklOQkNBQUtBSVFRZnNBUmcwQUlBQWdCQ0FNRU5zRURRUWdBQkJXRFFRZ0FFRXVRU2dnQWhzUUVDQUVMUUJ1UVFKeERRRWdCQ0FBS0FJMElBTnJJZ0kyQXBBRElBUWdDeUFESUFJUWdRTWlBallDakFNZ0FnMEJEQVFMSUFCQit3QVFMQTBESUFBUW5RVU5BeUFBSUFRZ0RCRGJCQTBEQTBBZ0FDZ0NFRUg5QUVjRVFDQUFFSndGUlEwQkRBVUxDeUFFTFFCdVFRSnhSUVJBSUFRZ0FDZ0NPQ0FEYXlJQ05nS1FBeUFFSUFzZ0F5QUNFSUVESWdJMkFvd0RJQUpGRFFRTElBQVFFZzBESUFCQlFHc29BZ0FRNWdKRkRRQWdBRUVBRU9VQ0N5QUFRVUJySUFRb0FnUWlBellDQUNBRUtBSndJUUlnQkNBQUtBSUFJQU5DZ0lDQWdDQVF2Z01pQXpZQ0NDQUJRUUpQQkVCQkFDRUhJQUZCQ1d0QmZVc05CU0FBUVFNUUVDQUFRVUJySWdFb0FnQWdBeEE1SUFJTkJTQUFRYzBBRUJBZ0FTZ0NBRUVBRURrTUJRc2dBVUVCUmdSQUlBQkJBeEFRSUFCQlFHc2lBU2dDQUNBREVEa2dEd1JBQWtBZ0FTZ0NBQ0lCS0FJb0JFQWdDeUFCSUFJUTVBSWlBVVVOQmlBQlFRQTJBZ2dnQVNBQkxRQUVRZjRCY1NBQVFVQnJLQUlBTFFCdVFRRnhjam9BQkF3QkN5QUJJQUlROUFGQkFFNE5BQ0FMSUFFZ0FoQlBRUUJJRFFVTElBQkJFUkFRSUFCQnVRRVFFQ0FBSUFJUUdpQUFRVUJyS0FJQVFRQVFGd3RCQUNFSElCRkJBRTRFUUNBQVFVQnJLQUlBS0FKMElCRkJCSFJxSWdFZ0FTZ0NERUgvZ0lDQWVIRWdBMEVIZEVHQS8vLy9CM0Z5TmdJTUlBQkJEaEFRREFZTElBQkJ2UUVRRUNBQUlBSVFHaUFBUVVCcktBSUFJZ0FnQUM4QnZBRVFGd3dGQ3dKQUFrQWdBRUZBYXlnQ0FDSUJLQUlvUlFSQUlBQWdBU0FDUVFZUW9BRWlBVUVBU0EwRklBQkJRR3NvQWdBaEFDQUJRWUNBZ0lBQ2NRUkFJQUFvQW9BQklBRkJCSFJxSWdBZ0FDZ0NERUgvZ0lDQWVIRWdBMEVIZEVHQS8vLy9CM0Z5TmdJTURBSUxJQUFvQW5RZ0FVRUVkR29pQUNBQUtBSU1RZitBZ0lCNGNTQURRUWQwUVlELy8vOEhjWEkyQWd3TUFRc2dDeUFCSUFKQi9BQWdBaHNpQVJEa0FpSUNSUTBFSUFJZ0F6WUNBQ0FGRFFFTFFRQWhCd3dGQzBFQUlRY2dBQ0FBUVVCcktBSUFLQUtVQXlBQlFSWWdBU0FGUVFGSEcwRUFFUGNCRFFRTUFnc2dBRUdEd2dCQkFCQVdEQUVMSUFBUTRnRUxJQUJCUUdzZ0JDZ0NCRFlDQUNBTElBUVEvUUpCZnlFSElBWkZEUUVnQmtFQU5nSUFEQUVMSUFzZ0RCQVRDeUFRUVJCcUpBQWdCd3ZsQkFFR2Z5QUFLQUlBSWdSQkFXb2hBa0VJSVFNQ1FBSkFBa0FnQkMwQUFDSUdRVEJySWdkQkNFOEVRRUYrSVFVQ1FBSkFBa0FDUUFKQUFrQWdCa0h1QUdzT0N3RUpDUWtDQ1FNRkJBa0ZBQXNDUUNBR1FlSUFhdzRGQ0FrSkNRQUpDMEVNSVFNTUJ3dEJDaUVEREFZTFFRMGhBd3dGQzBFSklRTU1CQXRCQ3lFRERBTUxBa0FnQVVVTkFDQUNMUUFBUWZzQVJ3MEFJQVJCQW1vaEFpQUVMUUFDSVFSQkFDRURBMEFnQWlFQlFYOGhCU0FFRUxZRUlnSkJBRWdOQlNBQ0lBTkJCSFJ5SWdOQi8vL0RBRXNOQlNBQlFRRnFJZ0l0QUFBaUJFSDlBRWNOQUFzZ0FVRUNhaUVDREFNTElBUkJBa0VFSUFaQitBQkdHeUlIYWtFQmFpRUVRUUFoQTBFQUlRVURRQ0FGSUFkSEJFQWdBaTBBQUJDMkJDSUdRUUJJQkVCQmZ3OEZJQVZCQVdvaEJTQUNRUUZxSVFJZ0JpQURRUVIwY2lFRERBSUxBQXNMSUFGQkFrY2dBMEdBZUhGQmdMQURSM0lOQVNBRUxRQUFRZHdBUncwQklBUXRBQUZCOVFCSERRRkJBQ0VDUVFBaEJRTkFBa0FnQWtFRVJnMEFJQUlnQkdvdEFBSVF0Z1FpQVVFQVNBMEFJQUpCQVdvaEFpQUJJQVZCQkhSeUlRVU1BUXNMSUFKQkJFY2dCVUdBdUFOSmNpQUZRZisvQTB0eURRRWdBMEVLZEVHQStEOXhJQVZCL3dkeGNrR0FnQVJxSVFNZ0JFRUdhaUVDREFJTElBRkJBa1lFUUVGL0lRVWdCdzBEUVFBaEF5QUNMUUFBUVRwclFYWkpEUUlNQXdzZ0FpMEFBRUV3YXlJQlFRZExCRUFnQnlFRERBSUxJQVJCQW1vaEFpQUJJQWRCQTNSeUlnTkJIMHNOQVNBRUxRQUNRVEJySWdGQkIwc05BU0FFUVFOcUlRSWdBU0FEUVFOMGNpRUREQUVMSUFRaEFnc2dBQ0FDTmdJQUlBTWhCUXNnQlF0TkFRSi9JQUpDLy8vLy93ZFlCRUFnQUNBQklBS25RWUNBZ0lCNGNrR0FnQUVRMVFFUEN5QUFJQUlRK0FJaUEwVUVRRUYvRHdzZ0FDQUJJQU5CZ0lBQkVOVUJJUVFnQUNBREVCTWdCQXZnQVFFQ2Z5QUNRUUJISVFNQ1FBSkFBa0FnQUVFRGNVVWdBa1Z5RFFBZ0FVSC9BWEVoQkFOQUlBQXRBQUFnQkVZTkFpQUNRUUZySWdKQkFFY2hBeUFBUVFGcUlnQkJBM0ZGRFFFZ0FnMEFDd3NnQTBVTkFTQUFMUUFBSUFGQi93RnhSaUFDUVFSSmNrVUVRQ0FCUWY4QmNVR0Jnb1FJYkNFREEwQWdBQ2dDQUNBRGN5SUVRWDl6SUFSQmdZS0VDR3R4UVlDQmdvUjRjUTBDSUFCQkJHb2hBQ0FDUVFScklnSkJBMHNOQUFzTElBSkZEUUVMSUFGQi93RnhJUUVEUUNBQklBQXRBQUJHQkVBZ0FBOExJQUJCQVdvaEFDQUNRUUZySWdJTkFBc0xRUUFMR1FBZ0FDQUJFQThnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUXNtQVFGL0lBRkNJSWluUVhWUEJFQWdBYWNpQWlBQ0tBSUFRUUZxTmdJQUN5QUFJQUVRSmd1b0FnSUJmZ0YvSXdCQkVHc2lBaVFBQWtBZ0FVTC8vLy8vYjFnRVFDQUFFQ1JDZ0lDQWdPQUFJUVVNQVFzQ1FDQUVEUUFnQXlrREFDSUZRb0NBZ0lCd1ZBMEFJQVduSWdZdkFRWkJNVWNOQUNBR0tBSWdSUTBBSUFBZ0JVRThJQVZCQUJBVUlnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQVVnQVJCU0lRWWdBQ0FGRUE4Z0JrVU5BQ0FES1FNQUlnVkNJSWluUVhWSkRRRWdCYWNpQUNBQUtBSUFRUUZxTmdJQURBRUxJQUFnQWlBQkVMOENJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FBSUFJZ0JFRURkR29wQXdCQ2dJQ0FnREJCQVNBREVDRWhCU0FBSUFJcEF3QVFEeUFBSUFJcEF3Z1FEeUFGUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBQkVBOE1BZ3NnQUNBRkVBOExJQUVoQlFzZ0FrRVFhaVFBSUFVTGVRRUJmd0pBQWtBQ1FBSkFBa0FnQVNnQ0FDSUNRWUFCYWc0RkJBUUVBZ0FCQ3lBQUtBSUFJQUVwQXhBUUR5QUFLQUlBSUFFcEF4Z1FEdzhMSUFKQnEzOUhEUUVMSUFBb0FnQWdBU2dDRUJBVER3c2dBa0hUQUdwQkxVMEVRQ0FBS0FJQUlBRW9BaEFRRXdzUEN5QUFLQUlBSUFFcEF4QVFEd3NOQUNBQUlBRWdBa0VERU00Q0MzQUJBMzhqQUVFUWF5SUNKQUFnQUNFQkEwQUNRQ0FCTEFBQUlnTkJBRTRFUUNBRFFmOEJjVUVKYXlJRFFSZExRUUVnQTNSQm40Q0FCSEZGY2cwQklBRkJBV29oQVF3Q0N5QUJRUVlnQWtFTWFoQllFSWNEUlEwQUlBSW9BZ3doQVF3QkN3c2dBa0VRYWlRQUlBRWdBR3NMQ2dBZ0FDQUJFSWdEUlF0TkFRRi9Ba0FnQUNBQklBQW9BZ1JCLy8vLy93ZHhJZ0FnQVNnQ0JFSC8vLy8vQjNFaUFpQUFJQUpJR3hDN0JTSUJEUUJCQUNFQklBQWdBa1lOQUVGL1FRRWdBQ0FDU1JzaEFRc2dBUXRLQVFGL0l3QkJFR3NpQWlRQUFrQWdBVUVnY1FSQUlBQVFmQXdCQ3lBQ1FjVEtBRUhvekFCQi9DRWdBVUVCY1JzZ0FVRUNjUnMyQWdBZ0FFR1ZQU0FDRUZBTElBSkJFR29rQUF2MEJRSUdmd04rSXdCQklHc2lDU1FBQW45QkFDQUFMd0hvQVVHQUFra05BQnBDZ0lDQWdEQWhEa0VBSUFBZ0FrSGRBU0FDUVFBUUZDSVBRb0NBZ0lCd2d5SU5Rb0NBZ0lBd1VRMEFHZ0pBSUExQ2dJQ0FnT0FBVVEwQUlBQWdEMEVsRUVzaUNFVU5BQ0FBSUFOQjNRRWdBMEVBRUJRaURrS0FnSUNBY0lNaURVS0FnSUNBNEFCUkRRQWdEVUtBZ0lDQU1GRUVRQ0FBSUE4UUQwRUFEQUlMSUFBZ0RrRWxFRXNpQzBVTkFBSkFJQWdvQWdSRkRRQWdDeWdDQkVVTkFDQUFJQThRRHlBQUlBNFFEMEVBREFJTElBUVE5d01oQndKL0lBZ29BZ0FpQ2lBTEtBSUFJZ3hHQkVBZ0NDQUhRUUowYWlnQ0NBd0JDeUFLSUF4TEJFQWdDRUhVQUdvZ0RDQUhFTGdGREFFTElBdEIzQUJxSUFvZ0J4QzRCUXNpQ2tVRVFDQUpJQWRCQW5SQndNQUJhallDQUNBQVFaTDZBQ0FKRUJVTUFRc0NRQ0FJS0FJRUJFQUNmaUFGQkVBZ0FDQUNFTGtDREFFTElBQWdBaUFHRUpBQ0N5SUNRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRRU1BZ3NnQWtJZ2lLZEJkVWtOQUNBQ3B5SUlJQWdvQWdCQkFXbzJBZ0FMQWtBZ0N5Z0NCQVJBQW40Z0JRUkFJQUFnQXhDNUFnd0JDeUFBSUFNZ0JoQ1FBZ3NpQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBCSUFBZ0FoQVBEQUlMSUFOQ0lJaW5RWFZKRFFBZ0E2Y2lCU0FGS0FJQVFRRnFOZ0lBQ3lBS0lBb29BZ0JCQVdvMkFnQWdDU0FDSUFNZ0JFRitjVUdrQVVZZ0IwRU5SbkVpQlJzM0F4Z2dDU0FESUFJZ0JSczNBeEFnQUNBS3JVS0FnSUNBY0lSQ2dJQ0FnREJCQWlBSlFSQnFFQzhoRFNBQUlBSVFEeUFBSUFNUUR5QU5Rb0NBZ0lCd2d5SUNRb0NBZ0lEZ0FGRU5BQUorSUFkQkRFWUVRQ0FBSUEwUUppQUVRYW9CUmtldFFvQ0FnSUFRaEF3QkN5QU5JQWRCRFVjTkFCcENnSUNBZ0JBZ0FrS0FnSUNBTUZFTkFCb2dBQ0FORUNZZ0JFRjljVUdrQVVaSHJVS0FnSUNBRUlRTElRTWdBQ0FQRUE4Z0FDQU9FQThnQVNBRE53TUFRUUVNQVFzZ0FDQVBFQThnQUNBT0VBOGdBVUtBZ0lDQU1EY0RBRUYvQ3lFSElBbEJJR29rQUNBSEMyTUNBWDhCZmlNQVFSQnJJZ0lrQUNBQUFuNGdBVVVFUUVJQURBRUxJQUlnQWExQ0FDQUJaeUlCUWRFQWFoQm5JQUlwQXdoQ2dJQ0FnSUNBd0FDRlFaNkFBU0FCYTYxQ01JWjhJUU1nQWlrREFBczNBd0FnQUNBRE53TUlJQUpCRUdva0FBdkhBUUlCZmdGL0FrQWdBQ2dDRUNnQ2pBRWlBMFVnQVVMLy8vLy8vLy8vRDN4Qy92Ly8vLy8vL3g5V2NnMEFJQU1vQWloQkJIRkZEUUFnQVVLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQVVMLy8vLy9ENE1QQzBLQWdJQ0F3SDRnQWJtOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNQQ3lBQUVKY0JJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FDcDBFRWFpQUJFTG9DUlFSQUlBSVBDeUFBSUFJUUR5QUFFSHdMUW9DQWdJRGdBQXVUQVFFQ2Z3Si9JQUFvQWdnZ0Ftb2lCQ0FBS0FJTVNnUkFRWDhnQUNBRVFRQVF0d0lOQVJvTEFrQWdBQ2dDRUFSQUlBSkJBQ0FDUVFCS0d5RUVBMEFnQXlBRVJnMENJQUFvQWdRZ0FDZ0NDQ0FEYWtFQmRHb2dBU0FEYWkwQUFEc0JFQ0FEUVFGcUlRTU1BQXNBQ3lBQUtBSUVJQUFvQWdocVFSQnFJQUVnQWhBZkdnc2dBQ0FBS0FJSUlBSnFOZ0lJUVFBTEN5b0JBWDhnQUNnQ0VDSURRUkJxSUFFZ0FpQURLQUlJRVFFQUlnRWdBa1Z5UlFSQUlBQVFmQXNnQVF0RUFRSi9Ba0FnQUVLQWdJQ0FjRlFOQUNBQXB5SURMd0VHUVFKSERRQWdBeTBBQlVFSWNVVU5BQ0FDSUFNb0FpZzJBZ0FnQVNBREtBSWtOZ0lBUVFFaEJBc2dCQXVnQkFJRmZ3RitJd0JCSUdzaUJpUUFBa0FDUUFKQUFrQWdBd1JBSUFGQ2dJQ0FnR0NEUW9DQWdJQWdVZzBCREFJTElBRkNnSUNBZ0hCVURRRUxRUUVoQkFKQUFrQWdBa0lnaUtjaUNFRUJhZzRFQUFJQ0FRSUxJQUtuSVFVTElBRkMvLy8vLzI5WVFRQWdBeHNOQWdKQUlBR25JZ2N2QVFaQk1FWUVRQ0FBSUFaQkdHb2dBVUhnQUJDQkFTSUZSUTBESUFVcEF3QWhDU0FHS1FNWUlnRkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQWdDU0FDSUFNUWl3SWhCQXdGQ3lBR0lBSTNBd2dnQmlBSk53TUFJQUFnQVNBRktRTUlRUUlnQmhBdklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF5QUFJQUVRSmtVRVFDQURSUTBDSUFCQm91UUFRUUFRRlF3RUN5QUFJQVVwQXdBUW1RRWlBMEVBU0EwRElBTU5CQ0FBSUFVcEF3QVE2QUVpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBESUFBZ0FSQVBJQUtuSUFHblJnMEVJQUJCaE9RQVFRQVFGUXdEQ3lBSEtBSVFLQUlzSUFWR0RRTWdCeTBBQlVFQmNVVUVRQ0FEUlEwQklBQkI5K2dBUVFBUUZRd0RDd0pBSUFWRkRRQWdCU0VFQTBBZ0JDQUhSZ1JBSUFORkRRTWdBRUd1MEFCQkFCQVZEQVVMSUFRb0FoQW9BaXdpQkEwQUN5QUlRWFZKRFFBZ0FxY2lBeUFES0FJQVFRRnFOZ0lBQzBGL0lRUWdBQ0FIUVFBUTFBRU5BeUFIS0FJUUlnUW9BaXdpQXdSQUlBQWdBNjFDZ0lDQWdIQ0VFQThMSUFRZ0JUWUNMRUVCSVFRTUF3dEJBQ0VFREFJTElBQVFKQXRCZnlFRUN5QUdRU0JxSkFBZ0JBc1ZBUUYrSUFBZ0FSRG9BU0VDSUFBZ0FSQVBJQUlMQ2dBZ0FDQUJweERCQWd0UUFRRitBa0FnQTBIQUFIRUVRQ0FDSUFOQlFHcXRpQ0VCUWdBaEFnd0JDeUFEUlEwQUlBSkJ3QUFnQTJ1dGhpQUJJQU90SWdTSWhDRUJJQUlnQklnaEFnc2dBQ0FCTndNQUlBQWdBamNEQ0F2UkN3SUVmd1IrSXdCQm9BTnJJZ1VrQUFKQUlBRzlJZ2xDZ0lDQWdJQ0FnUGovQUlOQ2dJQ0FnSUNBZ1BqL0FGRUVRQ0FKUXYvLy8vLy8vLy8vL3dDRFFvR0FnSUNBZ0lENC93QmFCRUFnQlVIT3dya0NOZ0tnQWd3Q0N5QUZRYUFDYWlFRElBRkVBQUFBQUFBQUFBQmpCRUFnQlVFdE9nQ2dBaUFGUWFBQ2FrRUJjaUVEQ3lBRFFmMGNMUUFBT2dBSUlBTkI5UndwQUFBM0FBQU1BUXNDUUFKQUFrQWdCRVVFUUFKK0lBR1pSQUFBQUFBQUFPQkRZd1JBSUFHd0RBRUxRb0NBZ0lDQWdJQ0FnSDhMSWdwQ2dJQ0FnSUNBZ0JCOVFvR0FnSUNBZ0lCZ1ZDQUt1U0FCWW5JTkFTQUZRUUE2QU9VQklBb2dDa0kvaHlJSmhTQUpmU0VKSUFLdElRc2dCVUhsQVdvaEF3TkFJQU1pQWtFQmF5SURRVEJCMXdBZ0NTQUpJQXVBSWd3Z0MzNTlweUlFUVFwSUd5QUVham9BQUNBSklBdGFJUVFnRENFSklBUU5BQXNnQ2tJQVV3UkFJQUpCQW1zaUEwRXRPZ0FBQ3lBRlFhQUNhaUFERU9VRkRBUUxSQUFBQUFBQUFBQUFJQUVnQVVRQUFBQUFBQUFBQUdFYklRRWdCRUVDUmdSQUFrQWdCVUdnQW1vZ0FTQURRUUZxSWdJUW9BTWdCV290QUo4Q1FUVkhEUUFnQlVHZ0Ftb2dBU0FDRUtBRElnUWdCVUdnQVdvZ0FTQUNFS0FEUncwQUlBVkJvQUpxSUFWQm9BRnFJQVFRWVEwQUlBVXRBS0FDR2dzZ0JVR2dBbW9nQVNBREVLQURHZ3dFQ3lBRVFRTnhRUUZHRFFFTFFSRWhCa0VCSVFjRFFDQUdJQWROQkVCQkZTRUREQU1MSUFFZ0JpQUhha0VCZGlJRElBVkJIR29nQlVFZ2FpQUZRYUFCYWlBRlFhQUNhaUlDRU1rQ0lBSVE1QVVnQVdFRVFFRUJJQU1nQTBFQVNoc2hCZ05BSUFNaUFrRUNTQTBDSUFKQkFXc2lBeUFGUWFBQmFtb3RBQUJCTUVZTkFBc2dBaUVHQlNBRFFRRnFJUWNMREFBTEFBc2dBU0FEUVFGcUlnSWdCVUVjYWlBRlFSaHFJQVZCb0FGcUlnWWdCVUdnQW1vUXlRSUNRQ0FESUFacUxRQUFRVFZIRFFBZ0FTQUNJQVZCSEdvZ0JVRVlhaUFGUWFBQmFpSUdJQVZCb0FKcUlnY1F5UUlnQVNBQ0lBVkJGR29nQlVFUWFpQUZRU0JxSWdnZ0J4REpBaUFHSUFnZ0FoQmhEUUFnQlNnQ0hDQUZLQUlVUncwQUlBVW9BaGdhQ3lBRElRWUxJQUVnQmlBRlFSeHFJQVZCSUdvZ0JVR2dBV29nQlVHZ0Ftb1F5UUlnQlNnQ0lBUi9JQVZCTFRvQW9BSWdCVUdnQW1wQkFYSUZJQVZCb0FKcUN5RUNJQVVvQWh3aEJ3SkFJQVJCQkhFTkFDQURJQWRJSUFkQkFFeHlSUVJBSUFZZ0Iwd0VRRUVBSVFNZ0J5QUdheUlFUVFBZ0JFRUFTaHNoQkNBQ0lBVkJvQUZxSUFZUUh5QUdhaUVDQTBBZ0F5QUVSd1JBSUFKQk1Eb0FBQ0FEUVFGcUlRTWdBa0VCYWlFQ0RBRUxDeUFDUVFBNkFBQU1Bd3NnQWlBRlFhQUJhaUFIRUI4Z0Iyb2lBa0V1T2dBQVFRQWhBeUFHSUFkcklnUkJBQ0FFUVFCS0d5RUVBMEFnQWtFQmFpRUNJQU1nQkVjRVFDQUNJQVZCb0FGcUlBTWdCMnBxTFFBQU9nQUFJQU5CQVdvaEF3d0JDd3NnQWtFQU9nQUFEQUlMSUFkQkJXcEJCVXNOQUNBQ1FiRGNBRHNBQUVFQUlRTkJBQ0FIYXlFRUlBSkJBbW9oQWdOQUlBTWdCRWNFUUNBQ1FUQTZBQUFnQTBFQmFpRURJQUpCQVdvaEFnd0JDd3NnQWlBRlFhQUJhaUFHRUI4Z0JtcEJBRG9BQUF3QkN5QUNJQVV0QUtBQk9nQUFBa0FnQmtFQ1NBUkFJQUpCQVdvaEFnd0JDeUFDUVM0NkFBRWdBa0VDYWlFQ1FRRWhBd05BSUFNZ0JrWU5BU0FDSUFWQm9BRnFJQU5xTFFBQU9nQUFJQU5CQVdvaEF5QUNRUUZxSVFJTUFBc0FDeUFDUWVVQU9nQUFJQWRCQVdzaEF5QUhRUUJNQkg4Z0FrRUJhZ1VnQWtFck9nQUJJQUpCQW1vTElRSWdCU0FETmdJQUl3QkJFR3NpQkNRQUlBUWdCVFlDRENNQVFaQUJheUlESkFBZ0EwSEF4UVJCa0FFUUh5SURJQUkyQWl3Z0F5QUNOZ0lVSUFOQi8vLy8vd2RCZmlBQ2F5SUdJQVpCLy8vLy93ZFBHeUlHTmdJd0lBTWdBaUFHYWlJQ05nSWNJQU1nQWpZQ0VDQURRZlQ3QUNBRkVKc0VJQVlFUUNBREtBSVVJZ0lnQWlBREtBSVFSbXRCQURvQUFBc2dBMEdRQVdva0FDQUVRUkJxSkFBTElBQWdCVUdnQW1vUVlpRUpJQVZCb0FOcUpBQWdDUXNwQVFGL0lBRkNJSWluUVhWUEJFQWdBYWNpQXlBREtBSUFRUUZxTmdJQUN5QUFJQUVnQWhDYUFRdk1BUUVDZnlBQklBRW9BZ0FpQWtFQmF5SUROZ0lBQWtBZ0FrRUJUQVJBSUFNTkFTQUJMUUFRQkVBZ0FDQUJFSkFFQ3lBQktBSXNJZ0lFUUNBQUlBS3RRb0NBZ0lCd2hCQWpDeUFCUVRCcUlRSkJBQ0VEQTBBZ0F5QUJLQUlnVDBVRVFDQUFJQUlvQWdRUTdBRWdBMEVCYWlFRElBSkJDR29oQWd3QkN3c2dBU2dDQ0NJQ0lBRW9BZ3dpQXpZQ0JDQURJQUkyQWdBZ0FVSUFOd0lJSUFCQkVHb2dBU0FCS0FJWVFYOXpRUUowYWlBQUtBSUVFUUFBQ3c4TFFZNlBBVUd1L0FCQnd5SkJxNDBCRUFBQUM0UUJBUU4vSXdCQmtBRnJJZ01rQUNBRElBSTJBb3dCQWtBZ0EwR0FBU0FCSUFJUXl3SWlCRUgvQUUwRVFDQUFJQU1nQkJCeURBRUxJQUFnQkNBQUtBSUVha0VCYWhER0FRMEFJQU1nQWpZQ2pBRWdBQ2dDQkNJRklBQW9BZ0JxSUFBb0FnZ2dCV3NnQVNBQ0VNc0NHaUFBSUFBb0FnUWdCR28yQWdRTElBTkJrQUZxSkFBTG9BTUNCSDhCZmlNQVFTQnJJZ1FrQUNBQklBSnFJUVVnQVNFREEwQUNRQ0FESUFWUERRQWdBeXdBQUVFQVNBMEFJQU5CQVdvaEF3d0JDd3NDZmdKQUlBTWdBV3NpQmtHQWdJQ0FCRThFUUNBQVFjRGFBRUVBRUVZTUFRc2dBeUFGUmdSQUlBQWdBU0FDRUlRRERBSUxJQUFnQkVFRWFpQUNFRDFGQkVBZ0JFRUVhaUFCSUFZUWlBSWFBMEFnQXlBRlNRUkFJQU1zQUFBaUFFRUFUZ1JBSUFSQkJHb2dBRUgvQVhFUU94b2dBMEVCYWlFRERBSUZBa0FnQXlBRklBTnJJQVJCSEdvUVdDSUJRZi8vQTAwRVFDQUVLQUljSVFNTUFRc2dBVUgvLzhNQVRRUkFJQVFvQWh3aEF5QUVRUVJxSUFGQmdJQUVhMEVLZGtHQXNBTnFFSXNCR2lBQlFmOEhjVUdBdUFOeUlRRU1BUXNEUUVIOS93TWhBU0FESUFWUERRRWdBeXdBQUVGQVNBUkFJQU5CQVdvaEF3d0JDd3NEUUNBRklBTkJBV29pQTAwRVFDQUZJUU1NQWdzZ0F5d0FBRUZBU0EwQUN3c2dCRUVFYWlBQkVJc0JHZ3dDQ3dBTEN5QUVRUVJxRURZTUFnc2dCQ2dDQkNnQ0VDSUFRUkJxSUFRb0FnZ2dBQ2dDQkJFQUFBdENnSUNBZ09BQUN5RUhJQVJCSUdva0FDQUhDMDRCQTM5QjBNWUVLQUlBSWdJZ0FFRUhha0Y0Y1NJRGFpRUJRWDhoQUFKQUlBTkJBQ0FCSUFKTkd3MEFJQUUvQUVFUWRFc0VRQ0FCRUFsRkRRRUxRZERHQkNBQk5nSUFJQUloQUFzZ0FBdUZBUUlEZndGK0FrQWdBRUtBZ0lDQUVGUUVRQ0FBSVFVTUFRc0RRQ0FCUVFGcklnRWdBRUlLZ0NJRlF2WUJmaUFBZktkQk1ISTZBQUFnQUVMLy8vLy9ud0ZXSVFJZ0JTRUFJQUlOQUFzTElBV25JZ0lFUUFOQUlBRkJBV3NpQVNBQ1FRcHVJZ05COWdGc0lBSnFRVEJ5T2dBQUlBSkJDVXNoQkNBRElRSWdCQTBBQ3dzZ0FRdFdBUUYvSUFKQ0lJaW5RWFZQQkVBZ0FxY2lCU0FGS0FJQVFRRnFOZ0lBQ3lBQUlBRkJPeUFDSUFNUUdSb2dBVUlnaUtkQmRVOEVRQ0FCcHlJRElBTW9BZ0JCQVdvMkFnQUxJQUFnQWtFOElBRWdCQkFaR2d2bEJRTUVmQUYvQVg0Q1FBSkFBa0FDZkFKQUlBQzlJZ1pDSUlpblFmLy8vLzhIY1NJRlFmclFqWUlFVHdSQUlBQzlRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0RRVWdCa0lBVXdSQVJBQUFBQUFBQVBDL0R3c2dBRVR2T2ZyK1FpNkdRR1JGRFFFZ0FFUUFBQUFBQUFEZ2Y2SVBDeUFGUWNQYzJQNERTUTBDSUFWQnNjWEMvd05MRFFBZ0JrSUFXUVJBUVFFaEJVUjJQSGsxN3pucVBTRUJJQUJFQUFEZy9rSXU1citnREFJTFFYOGhCVVIyUEhrMTd6bnF2U0VCSUFCRUFBRGcva0l1NWorZ0RBRUxBbjhnQUVUK2dpdGxSeFgzUDZKRUFBQUFBQUFBNEQ4Z0FLYWdJZ0daUkFBQUFBQUFBT0JCWXdSQUlBR3FEQUVMUVlDQWdJQjRDeUlGdHlJQ1JIWThlVFh2T2VvOW9pRUJJQUFnQWtRQUFPRCtRaTdtdjZLZ0N5SUFJQUFnQWFFaUFLRWdBYUVoQVF3QkN5QUZRWUNBd09RRFNRMEJRUUFoQlFzZ0FDQUFSQUFBQUFBQUFPQS9vaUlEb2lJQ0lBSWdBaUFDSUFJZ0FrUXR3d2x1dC8yS3ZxSkVPVkxtaHNyUDBENmdva1MzMjZxZUdjNFV2NkNpUklWVi9obWdBVm8vb0tKRTlCQVJFUkVSb2IrZ29rUUFBQUFBQUFEd1A2QWlCRVFBQUFBQUFBQUlRQ0FFSUFPaW9TSURvVVFBQUFBQUFBQVlRQ0FBSUFPaW9hT2lJUU1nQlVVRVFDQUFJQUFnQTZJZ0FxR2hEd3NnQUNBRElBR2hvaUFCb1NBQ29TRUJBa0FDUUFKQUlBVkJBV29PQXdBQ0FRSUxJQUFnQWFGRUFBQUFBQUFBNEQraVJBQUFBQUFBQU9DL29BOExJQUJFQUFBQUFBQUEwTDlqQkVBZ0FTQUFSQUFBQUFBQUFPQS9vS0ZFQUFBQUFBQUFBTUNpRHdzZ0FDQUJvU0lBSUFDZ1JBQUFBQUFBQVBBL29BOExJQVZCL3dkcXJVSTBocjhoQWlBRlFUbFBCRUFnQUNBQm9VUUFBQUFBQUFEd1A2QWlBQ0FBb0VRQUFBQUFBQURnZjZJZ0FDQUNvaUFGUVlBSVJodEVBQUFBQUFBQThMK2dEd3RFQUFBQUFBQUE4RDlCL3djZ0JXdXRRalNHdnlJRG9TQUFJQUdob0NBQUlBRWdBNkNoUkFBQUFBQUFBUEEvb0NBRlFSTk5HeUFDb2lFQUN5QUFDMThCQlg4Z0EwRUFJQU5CQUVvYklRWkJBQ0VEQTBBZ0F5QUdSa1VFUUNBQUlBTkJBblFpQldvZ0FTQUZhaWdDQUNJSElBSWdCV29vQWdBaUJXc2lDQ0FFYXpZQ0FDQUZJQWRMSUFRZ0NFdHlJUVFnQTBFQmFpRUREQUVMQ3lBRUN5OEJBWDhDUUNBQ1FRQklEUUFnQVNBQ1FRVjFJZ0ZORFFBZ0FDQUJRUUowYWlnQ0FDQUNka0VCY1NFREN5QURDNXdCQVFSL0l3QkJFR3NpQWlRQUlBSkJKVG9BQ2tFQklRTWdBVUdBQWs0RVFDQUNRZlVBT2dBTElBSWdBVUVJZGtFUGNVR0ZoZ0ZxTFFBQU9nQU5JQUlnQVVFTWRrRVBjVUdGaGdGcUxRQUFPZ0FNUVFRaEF3c2dBa0VLYWlJRUlBTnFJZ1VnQVVFUGNVR0ZoZ0ZxTFFBQU9nQUJJQVVnQVVFRWRrRVBjVUdGaGdGcUxRQUFPZ0FBSUFBZ0JDQURRUUp5RUlnQ0dpQUNRUkJxSkFBTFRRRUJmd0pBSUFKQ2dJQ0FnSEJVRFFBZ0FxY2lBeThCQmtFS1J3MEFJQU1wQXlBaUFrSWdpS2NpQTBFQUlBTkJDMnBCRWtrYkRRQWdBQ0FCSUFJUVFnOExJQUJCclRGQkFCQVZRWDhMWndJQ2Z3RitJQUJCRUdvaEF5QUJLQUlBSVFJRFFBSkFJQUlnQUNrQ0JDSUVwMEgvLy8vL0IzRk9EUUFDZnlBRVFvQ0FnSUFJZzFCRkJFQWdBeUFDUVFGMGFpOEJBQXdCQ3lBQ0lBTnFMUUFBQzBFZ1J3MEFJQUVnQWtFQmFpSUNOZ0lBREFFTEN3dTNBUUlDZmdWL1FYOGhCUUpBSUFFb0FnQWlCaUFBS1FJRUlnT25RZi8vLy84SGNTSUhUZzBBSUFCQkVHb2hDQ0FEUW9DQWdJQUlneUVFUWdBaEF5QUdJUUFEUUFKQUFrQWdBQ0FIUmdSQUlBY2hBQXdCQ3dKL0lBUlFSUVJBSUFnZ0FFRUJkR292QVFBTUFRc2dBQ0FJYWkwQUFBc2lDVUV3YTBFS1NRMEJJQUFnQmtZTkF3c2dBaUFETndNQUlBRWdBRFlDQUVFQUlRVU1BZ3NnQUVFQmFpRUFJQW10SUFOQ0NuNThRakI5SVFNTUFBc0FDeUFGQzdzREFRVi9JQUZGQkVBZ0FDQUNRUVJ4UVFoeUVOOEJEd3RCZnlFREFrQUNRQ0FBSUFGQkFXc2lCQ0FDRUo0Q0RRQWdBa0Y3Y1NFRklBSkJBWEVoQmlBQlFRRnJJUWNEUUNBQUtBSVFJUUVDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBSERnY0FBUUlEQkFVR0J3c2dBVUVsUndSQVFab0JJUUlnQVVFcVJnMEpJQUZCTDBjTkRFR2JBU0VDREFrTFFiSi9RWngvSUFBb0FrQXRBRzVCQkhFYklRSU1DQXRCblFFaEFrRUFJUU1DUUNBQlFTdHJEZ01JQ2dBS0MwR2VBU0VDREFjTElBRkI2UUJxSWdGQkEwOE5DU0FCUWVBQWF5RUNEQVlMUVFBaEF3SkFBa0FDUUFKQUlBRkI1UUJxRGdNQkN3SUFDd0pBSUFGQnh3QnFEZ0lJQXdBTFFhTUJJUUlDUUNBQlFUeHJEZ01KQ3dBTEMwR2xBU0VDREFnTFFhUUJJUUlNQnd0QnBnRWhBZ3dHQzBHbkFTRUNEQVVMSUFGQjRnQnFJZ0ZCQkU4TkIwR3AxNnJsZWlBQlFRTjBkaUVDREFRTFFhMEJJUUlnQVVFbVJ3MEdEQU1MUWE0QklRSWdBVUhlQUVjTkJRd0NDMEd2QVNFQ0lBRkIvQUJIRFFRTUFRdEJxQUVoQWlBR1JRMENDMEYvSVFNZ0FCQVNEUUVnQUNBRUlBVVFuZ0lOQVNBQUlBSkIvd0Z4RUJBTUFBc0FDeUFERHd0QkFBdENBUUYvSUFCQlFHc2hBd05BSUFFZ0FreEZCRUFnQUVHMUFSQVFJQU1vQWdBZ0FVSC8vd054RUJjZ0F5Z0NBQ2dDekFFZ0FVRURkR29vQWdBaEFRd0JDd3NMQ1FBZ0FFRUFFT0VCQzlvQkFRRi9JQUFnQUNnQ1FDSURJQUVDZndKQUFrQUNRQUpBQWtBZ0FVRW5SZzBBSUFGQnpRQkdJQUZCT2taeVJRUkFJQUZCeFFCR0RRRWdBVUV0UncwQ0lBTXRBR3hCQVVjTkFpQUFRWTNGQUVFQUVCWkJmdzhMSUFNdEFHNUJBWEVFUUNBQVFmRHJBRUVBRUJaQmZ3OExJQUZCeFFCSERRRUxJQUpCczM5R0RRTWdBa0ZGUmcwQklBSkJVMGNnQWtGTFIzRU5BaUFBUWV6bkFFRUFFQlpCZnc4TElBSkJzMzlHRFFJZ0FrRkZSZzBBUVFFZ0FrRlRSZzBER2lBQ1FVdEhEUUZCQWd3REMwRUZEQUlMRUFFQUMwRUdDeENnQVVFZmRRdFRBUVIvSUFBb0F2UUJJZ0pCQUNBQ1FRQktHeUVFUVFBaEFnSkFBMEFnQWlBRVJnMEJJQUVnQUNnQy9BRWlCU0FDUVFSMGFpZ0NERWNFUUNBQ1FRRnFJUUlNQVFzTElBVWdBa0VFZEdvaEF3c2dBd3NKQUNBQVFRSVF1d01MN3dFQkJIOERRQUpBSUFJZ0Ewd05BQ0FCSUFOcUlnVXRBQUFpQmtFQ2RDSUhRWUM0QVdvdEFBQWhDQUpBQWtBZ0JrRzJBVWNFUUNBR1FjSUJSdzBCSUFRZ0JTZ0FBVFlDQUF3Q0N5QUFJQVVvQUFFaUJVRUFFR2tOQWlBQUtBS2tBaUFGUVJSc2FpZ0NFRVVOQVVHcmd3RkJydndBUVlqd0FVSE83UUFRQUFBTElBZEJnN2dCYWkwQUFDSUdRUnhMRFFCQkFTQUdkQ0lHUVlDQWdCeHhSUVJBSUFaQmdJQ0E0QUJ4UlFSQUlBWkJnSUNBZ2dGeFJRMENJQUFnQlNnQUFVRi9FR2thREFJTElBQWdCU2dBQlVGL0VHa2FDeUFBS0FJQUlBVW9BQUVRRXdzZ0F5QUlhaUVEREFFTEN5QURDeG9BSUFCQjNnQkIyQUFnQVJzUUVTQUFJQUpCLy84RGNSQXFDL3dCQVFkL0l3QkJFR3NpQkNRQUFrQWdCRUVNYWlBQVFiREtBMEViRUtRR0lnRkJBRWdOQUNBQlFaRExBMm9oQWlBRUtBSU1JUUVEUUNBQklRVWdBaTBBQUNJQndDSUhRUUJPQW44Z0FrRUJhaUFCUVQ5eElnRkJNRWtOQUJvZ0FVRUlkQ0VHSUFGQk4wMEVRQ0FHSUFJdEFBRnFRZERmQUdzaEFTQUNRUUpxREFFTElBSXRBQUlnQmtHQThBQnJJQUl0QUFGQkNIUnlha0d3RUdvaEFTQUNRUU5xQzJvaEFpQUJJQVZxUVFGcUlnRWdBRTBOQUFzQ1FBSkFBa0FnQjBIQUFYRkJCbllPQXdBQkF3SUxJQUpCQVdzdEFBQWhBd3dDQ3lBQ1FRRnJMUUFBSUFBZ0JXdHFJUU1NQVF0QjVnRWhBd3NnQkVFUWFpUUFJQU1McVFjQ0NYOEJmZ0pBQWtBQ1FBSi9JQUpCQWt3RVFDQUNJQUVwQWdRaURFSStpS2RHQkVBZ0FDQUJFTUVDSWdSQjNRRktEUVVnQVNBQktBSUFRUUZyTmdJQUlBUVBDeUFBS0FJMElBQW9BaVJCQVdzZ0FTQUNFTEFGUWYvLy8vOERjU0lIY1NJS1FRSjBhaUVESUF5blFmLy8vLzhIY1NFRkEwQWdBaUFES0FJQUlnUkZEUUlhQWtBZ0FDZ0NPQ0FFUVFKMGFpZ0NBQ0lES1FJRUlneENJSWluUWYvLy8vOERjU0FIUnlBTVFqNklweUFDUjNJZ0RLZEIvLy8vL3dkeElBVkhjZzBBSUFNZ0FTQUZFTHNGRFFBZ0JFSGVBVWdOQkNBRElBTW9BZ0JCQVdvMkFnQU1CQXNnQTBFTWFpRUREQUFMQUFzZ0FrRURSeUVIUVFNTElRVUNRQ0FBS0FJOERRQkJBQ0VFSUFCQkVHb2lDeUFBS0FJNFFkTUJJQUFvQWl4QkEyeEJBbTBpQWlBQ1FkTUJUQnNpQWtFQ2RDQUFLQUlJRVFFQUlnaEZEUUVnQUNnQ0xDSUpJUU1nQ1VVRVFDQUxRUkFnQUNnQ0FCRURBQ0lHUlFSQUlBc2dDQ0FBS0FJRUVRQUFEQU1MSUFaQ2dJQ0FnSUNBZ0lCQU53SUVJQVpCQVRZQ0FDQUdRUUEyQUF3Z0NDQUdOZ0lBSUFBZ0FDZ0NLRUVCYWpZQ0tFRUJJUU1MSUFBZ0F6WUNQQ0FBSUFnMkFqZ2dBQ0FDTmdJc0lBa2dBaUFDSUFsSkd5RUVJQUpCQVdzaEJnTkFJQU1nQkVZTkFTQUFLQUk0SUFOQkFuUnFRUUVnQTBFQmFpSUNRUUYwUVFGeUlBTWdCa1liTmdJQUlBSWhBd3dBQ3dBTEFrQWdBUVJBSUFFcEFnUWlERUwvLy8vLy8vLy8vejlZQkVBZ0FTQU1JQVd0UWo2R2hEY0NCQXdDQ3lBQVFSQnFJQXluSWdKQkgzVWdBa0gvLy8vL0IzRWdBa0VmZG5ScVFSRnFJQUFvQWdBUkF3QWlBa1VFUUVFQUlRUU1CQXNnQWtFQk5nSUFJQUlnQWlrQ0JFTC8vLy8vZDRNZ0FTa0NCRUtBZ0lDQUNJT0VJZ3czQWdRZ0FpQU1Rb0NBZ0lCNGd5QUJLUUlFUXYvLy8vOEhnNFEzQWdRZ0FrRVFhaUFCUVJCcUlBRW9BZ1FpQTBILy8vLy9CM0VnQTBFZmRuUWdBMEYvYzBFZmRtb1FIeG9nQUNBQkVQWURJQUloQVF3QkN5QUFRUkJxUVJBZ0FDZ0NBQkVEQUNJQlJRUkFRUUFQQ3lBQlFvR0FnSUNBZ0lDQWdIODNBZ0FMSUFBZ0FDZ0NPQ0FBS0FJOElnUkJBblJxSWdJb0FnQkJBWFkyQWp3Z0FpQUJOZ0lBSUFFZ0JEWUNEQ0FCSUFFMUFnUWdCNjFDSUlhRUlBV3RRajZHaERjQ0JDQUFJQUFvQWloQkFXbzJBaWdnQlVFRFJnMENJQUVnQUNnQ05DQUtRUUowYWlJQktBSUFOZ0lNSUFFZ0JEWUNBQ0FBS0FJb0lBQW9BakJJRFFJZ0FDQUFLQUlrUVFGMEVQSUVHZ3dDQ3lBQlJRMEJDeUFBSUFFUTlnTWdCQThMSUFRTEN3QWdBRUgrSEVFQUVEb0xGZ0FnQUNBQlFmOEJjUkFSSUFBZ0FrSC9BWEVRRVF1T0JBSUlmd04rSXdCQk1Hc2lCQ1FBUW9DQWdJRGdBQ0VOSUFBZ0FSQWxJZ3hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQUpBSUFBQ2ZrS0FnSUNBTUNBQUlBUkJMR29nQkVFb2FpQU1weUlJSUFKQmIzRVFqZ0VOQUJwQ2dJQ0FnT0FBSUFBUVBpSU5Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWFJQUpCRUhFaENTQUVLQUlzSVFVZ0JDZ0NLQ0VHSUFOQkFXc2hDa0VBSVFJQ1FBTkFJQUlnQmtZTkF5QUZJQUpCQTNScUtBSUVJUU1DUUFKQUlBa0VRQ0FBSUFSQkNHb2dDQ0FERUV3aUMwRUFTQTBFSUF0RkRRRWdBQ0FFUVFocUVFZ2dCQ2dDQ0VFRWNVVU5BUXNDUUFKQUFrQUNRQ0FLRGdJQkFnQUxJQUFnQXhCY0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZJTkFnd0dDeUFBSUF3Z0F5QU1RUUFRRkNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTUJRc2dBQkErSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQkNBQUlBTVFYQ0lPUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlnQUNBQlFnQWdEa0dIZ0FFUXZRRkJBRWdOQWlBQUlBd2dBeUFNUVFBUUZDSU9Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSWdBQ0FCUWdFZ0RrR0hnQUVRdlFGQkFFZ05BZ3NnQUNBTklBZXRJQUZCQUJEU0FVRUFTQTBESUFkQkFXb2hCd3NnQWtFQmFpRUNEQUVMQ3lBQUlBRVFEd3NnRFFzUUQwS0FnSUNBNEFBaERTQUVLQUlvSVFZZ0JDZ0NMQ0VGQ3lBQUlBVWdCaEJhSUFBZ0RCQVBDeUFFUVRCcUpBQWdEUXZRQWdFQ2Z5TUFRUkJySWdNa0FDQURJQUkzQXdnQ1FBSkFJQUFnQVJES0FTSUVRUUJJRFFBZ0JFVUVRQ0FBUW9DQWdJQXdRUUVnQTBFSWFoQ3VBeUVCREFJTElBQWdBVUU4SUFGQkFCQVVJZ0pDZ0lDQWdIQ0RJZ0ZDZ0lDQWdPQUFVUVJBSUFJaEFRd0NDd0pBQWtBZ0FrS0FnSUNBY0ZvRWZnSkFJQUtuTFFBRlFSQnhSUTBBSUFBZ0FoQ0FBeUlFUlFSQUlBQWdBaEFQREFVTElBQWdCRVlOQUNBQUlBSWdCQ2tEUUJCU1JRMEFJQUFnQWhBUERBSUxJQUFnQWtIYUFTQUNRUUFRRkNFQklBQWdBaEFQSUFGQ2dJQ0FnSENESWdKQ2dJQ0FnT0FBVVEwRVFvQ0FnSUF3SUFFZ0FrS0FnSUNBSUZFYklnSkNnSUNBZ0hDREJTQUJDMEtBZ0lDQU1GSU5BUXNnQUVLQWdJQ0FNRUVCSUFOQkNHb1FyZ01oQVF3Q0N5QUFJQUpCQVNBRFFRaHFFS2NCSVFFZ0FDQUNFQThNQVF0Q2dJQ0FnT0FBSVFFTElBTkJFR29rQUNBQkN6TUJBWDRnQUNBQklBSWdBVUVBRUJRaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSK0lBQWdCU0FCSUFNZ0JCQXZCU0FGQ3dzYkFRRitJQUFnQVNBQ0lBTWdCQkNzQWlFRklBQWdBUkFQSUFVTExBQWdBQ0FCS1FNSUVDTWdBQ0FCS1FNUUVDTWdBQ0FCS1FNWUVDTWdBRUVRYWlBQklBQW9BZ1FSQUFBTDBnUUNCMzhCZmlNQVFUQnJJZ1VrQUFKL1FRQWdBVUtBZ0lDQWNGUU5BQnBCQUNBQnB5SUVMd0VHUVRGSERRQWFJQVFvQWlBTElRY2dCVUlBTndJb0FrQURRQ0FHUVFKSEJFQkJBQ0VFSUFCQklCQmZJZ2hGQkVCQmZ5RUVJQVpCQVVjTkF5QUFLQUlRSUFVb0FpZ1FyZ0lNQXdzRFFDQUVRUUpIQkVBZ0F5QUVRUU4wSWdscUtRTUFJZ3RDSUlpblFYVlBCRUFnQzZjaUNpQUtLQUlBUVFGcU5nSUFDeUFJSUFscUlBczNBd2dnQkVFQmFpRUVEQUVMQ3lBQ0lBWkJBM1JxS1FNQUlndENnSUNBZ0RBZ0FDQUxFRGdiSWd0Q0lJaW5RWFZQQkVBZ0M2Y2lCQ0FFS0FJQVFRRnFOZ0lBQ3lBSUlBczNBeGdnQlVFb2FpQUdRUUowYWlBSU5nSUFJQVpCQVdvaEJnd0JDd3NDUUNBSEtBSUFJZ1JGQkVCQkFDRUVBMEFnQkVFQ1JnMENJQWNnQkVFRGRHb2lBa0VFYWlJREtBSUFJZ1lnQlVFb2FpQUVRUUowYWlnQ0FDSUFOZ0lFSUFBZ0F6WUNCQ0FBSUFZMkFnQWdBaUFBTmdJRUlBUkJBV29oQkF3QUN3QUxBa0FnQkVFQ1J3MEFRUUloQkNBSEtBSVVEUUFnQUNnQ0VDSUNLQUtZQVNJRFJRMEFJQUFnQVNBSEtRTVlRUUVnQWlnQ25BRWdBeEU0QUNBSEtBSUFJUVFMSUFVZ0JVRW9haUFFUVFGcklnTkJBblJxS0FJQUlnSXBBd2czQXdBZ0JTQUNLUU1RTndNSUlBVWdBaWtER0RjREVFRUFJUVFnQlNBRFFRQkhyVUtBZ0lDQUVJUTNBeGdnQlNBSEtRTVlOd01nSUFCQnl3QkJCU0FGRUpvREEwQWdCRUVDUmcwQklBQW9BaEFnQlVFb2FpQUVRUUowYWlnQ0FCQ3VBaUFFUVFGcUlRUU1BQXNBQ3lBSFFRRTJBaFJCQUNFRUN5QUZRVEJxSkFBZ0JBc0pBQ0FBdlVJMGlLY0xUQUVFZnlBQUtBSU1JUUlEUUFKQUlBRWdBa2NFZnlBQUtBSVFJQUZCQW5ScUtBSUFJZ1JGRFFFZ0FDZ0NDQ0FFYUNBQklBSnJRUVYwY21vRlFRQUxEd3NnQVVFQmFpRUJEQUFMQUFzTUFDQUFJQUVRaUFOQkgzWUx2Z0VCQjM4Z0FDZ0NEQ0lGSVFNQ1FBTkFJQU1pQkVVTkFTQUFLQUlRSWdrZ0JFRUJheUlEUVFKMGFpSUdLQUlBUlEwQUN5QUFJQUFvQWdnZ0JDQUZhMEVGZEdvMkFnZ2dCaWdDQUdjaUJ3UkFRU0FnQjJzaEJVRUFJUU1EUUNBRElBUkdSUVJBSUFrZ0EwRUNkR29pQmlBSUlBVjJJQVlvQWdBaUNDQUhkSEkyQWdBZ0EwRUJhaUVEREFFTEN5QUFJQUFvQWdnZ0IyczJBZ2dMSUFBZ0FTQUNJQVJCQUJDcUF3OExJQUJCZ0lDQWdIZzJBZ2dnQUVFQUVFRWFRUUFMVGdJQmZ3RitBbjRqQUNJQ0lBQW9BaEFvQW5oSkJFQWdBQkRwQVVLQWdJQ0E0QUFNQVFzZ0FDQUJyU0FCS1FNQVFvQ0FnSUF3SUFFb0FnZ2dBU2dDSUVFRUVOZ0JDeUVESUFJa0FDQURDd3dBSUFCQitzd0FRUUFRRlFzTEFDQUFRY01hUVFBUUZRdlZBUUVEZnlNQVFSQnJJZ1VrQUVGL0lRTUNRQ0FBS0FJVURRQUNRQUpBSUFGQmdJQ0FnQVJPQkVBZ0FDZ0NBRUhBMmdCQkFCQkdEQUVMSUFFZ0FDZ0NERUVEYkVFQ2JTSUVJQUVnQkVvYklRRWdBQ2dDRUNJRUlBSkJnQUpJY2tVRVFDQUFJQUVROVFNaEF3d0RDeUFBS0FJQUlBQW9BZ1FnQVNBRWRDQUVhMEVSYWlBRlFReHFFS2dCSWdJTkFRc2dBQkNEQXd3QkN5QUZLQUlNSVFNZ0FDQUNOZ0lFSUFCQi8vLy8vd01nQXlBQUtBSVFkaUFCYWlJQUlBQkIvLy8vL3dOT0d6WUNERUVBSVFNTElBVkJFR29rQUNBREN4RUFJQUFnQVNBQ0lBTWdCRUVBRUxjRkN5WUJBWDhnQVVJZ2lLZEJkVThFUUNBQnB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFBZ0FSQnNDeWNCQVg4Z0FVSUFVd1JBSUFCQ0FDQUJmUkF3SVFJZ0FFRUJOZ0lFSUFJUEN5QUFJQUVRTUF2c0FRRUJmd0pBQWtBQ1FBSkFBa0FDUUFKQVFRY2dBa0lnaUtjaUF5QURRUWRyUVc1Skd5SUREZ2dBQUFBRUJBUUVBUU1MSUFBb0F0Z0JJUUFnQVVJQU53SU1JQUZDZ0lDQWdJQ0FnSUNBZnpjQ0JDQUJJQUEyQWdBZ0FTQUN4QkM2QWcwQkRBUUxJQUFvQXRnQklRQWdBVUlBTndJTUlBRkNnSUNBZ0lDQWdJQ0FmemNDQkNBQklBQTJBZ0FnQVNBQ1FvQ0FnSURBZ1lEOC93Qjh2eEM2QlVVTkF3c2dBUkFiUVFBUEN5QURRUXBxUVFKSkRRSUxJQUFvQXRnQklRQWdBVUlBTndJTUlBRkNnSUNBZ0lDQWdJQ0FmemNDQkNBQklBQTJBZ0FnQVJBMUN5QUJEd3NnQXFkQkJHb0w1QUVCQkg4akFFRVFheUlDSkFBZ0FDQUNRUWhxSUFFUTVRRWhBeUFBSUFFUUR3SkFJQU5GQkVCQ2dJQ0FnT0FBSVFFTUFRc2dBaUFESUFNUWdRSWlCR29pQlRZQ0RBSkFJQUlvQWdnZ0JFWUVRQ0FBUWdBUWh3SWhBUXdCQ3lBQUlBVWdBa0VNYWtFQUFuOGdBQ2dDRUNnQ2pBRWlCQVJBUVlVRklBUW9BaWhCQkhFTkFSb0xRWVVCQ3hDNEFpRUJJQUlnQWlnQ0RCQ0JBaUFDS0FJTWFpSUVOZ0lNSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQ0tBSUlJQVFnQTJ0R0RRQWdBQ0FCRUE5Q2dJQ0FnTUIrSVFFTElBQWdBeEJVQ3lBQ1FSQnFKQUFnQVFzeUFDQUF2VUtBZ0lDQWdJQ0ErUDhBZzBLQWdJQ0FnSUNBK1A4QVVpQUFuQ0FBWVhFZ0FKbEUvLy8vLy8vL1AwTmxjUXVJQ0FFUGZ5TUFRZUFFYXlJTkpBQWdBQ0FDRUt3RUlRNGdBQ0FDUVlBQmNoQ3NCQ0VTQWtBZ0FrVWdBVUVDU1hJTkFDQU5JQUUyQWdRZ0RTQUFOZ0lBSUExQkFEWUNDRUVBSUFKcklROGdEVUVNY2lFSkEwQWdDU0FOVFEwQlFUSWdDVUVNYXlJSktBSUlJZ3dnREVFeVRCc2hFeUFKS0FJQUlRQWdDU2dDQkNFSEEwQUNRQ0FIUVFkSkRRQWdEQ0FUUmdSQUlBSWdCMndpQmlBQ2F5RUtJQWRCQVhZZ0Ftd2hCeUFBSUFJUXJBUWhDQU5BSUFjRVFDQUhJQUpySWdjaEJRTkFJQVZCQVhRZ0Ftb2lBU0FHVHcwQ0lBRWdDa2tFUUNBQklBSkJBQ0FBSUFGcUlnRWdBU0FDYWlBRUlBTVJBUUJCQUV3YmFpRUJDeUFBSUFWcUlnVWdBQ0FCYWlJTUlBUWdBeEVCQUVFQVNnMENJQVVnRENBQ0lBZ1JCZ0FnQVNFRkRBQUxBQXNMQTBBZ0JpQUNheUlHUlFSQVFRQWhCd3dEQ3lBQUlBQWdCbW9nQWlBSUVRWUFJQVlnQW1zaEIwRUFJUVVEUUNBRlFRRjBJQUpxSWdFZ0JrOE5BU0FCSUFkSkJFQWdBU0FDUVFBZ0FDQUJhaUlCSUFFZ0Ftb2dCQ0FERVFFQVFRQk1HMm9oQVFzZ0FDQUZhaUlGSUFBZ0FXb2lDaUFFSUFNUkFRQkJBRW9OQVNBRklBb2dBaUFJRVFZQUlBRWhCUXdBQ3dBTEFBc2dBQ0FIUVFKMklBSnNJZ1ZxSWdZZ0FDQUZRUUYwYWlJQklBUWdBeEVCQUNFS0lBRWdBQ0FGUVFOc2FpSUZJQVFnQXhFQkFDRUlBa0FnQ2tFQVNBUkFJQWhCQUVnTkFTQUZJQVlnQmlBRklBUWdBeEVCQUVFQVNCc2hBUXdCQ3lBSVFRQktEUUFnQmlBRklBWWdCU0FFSUFNUkFRQkJBRWdiSVFFTElBeEJBV29oRENBQUlBRWdBaUFPRVFZQVFRRWhCaUFBSUFJZ0IyeHFJZ2doQlNBSUlRb2dBQ0FDYWlJTElRRkJBU0VRQTBBQ1FBSkFJQUVnQlU4TkFDQUFJQUVnQkNBREVRRUFJaEZCQUVnTkFDQVJEUUVnQ3lBQklBSWdEaEVHQUNBQ0lBdHFJUXNnRUVFQmFpRVFEQUVMQWtBRFFDQUJJQVVnRDJvaUJVOE5BU0FBSUFVZ0JDQURFUUVBSWhGQkFFd0VRQ0FSRFFFZ0NpQVBhaUlLSUFVZ0FpQU9FUVlBSUFkQkFXc2hCd3dCQ3dzZ0FTQUZJQUlnRGhFR0FBd0JDeUFBSUFFZ0N5QUFheUlGSUFFZ0Myc2lDeUFGSUF0Skd5SUZheUFGSUJJUkJnQWdBU0FJSUFnZ0Ntc2lDeUFLSUFGcklnVWdCU0FMU3hzaUFXc2dBU0FTRVFZQUlBY2dCbXNoQVNBSUlBVnJJUVVDUUNBQklBWWdFR3NpQjBrRVFDQUFJUVlnQnlFSUlBVWhBQ0FCSVFjTUFRc2dCU0VHSUFFaENBc2dDU0FNTmdJSUlBa2dDRFlDQkNBSklBWTJBZ0FnQ1VFTWFpRUpEQU1MSUFFZ0Ftb2hBU0FHUVFGcUlRWU1BQXNBQ3dzZ0FDQUNJQWRzYWlFSElBQWhCZ05BSUFJZ0Jtb2lCaUVCSUFZZ0IwOE5BUU5BSUFBZ0FVOE5BU0FCSUE5cUlnVWdBU0FFSUFNUkFRQkJBRXdOQVNBQklBVWdBaUFPRVFZQUlBVWhBUXdBQ3dBTEFBc0FDeUFOUWVBRWFpUUFDK29DQWdSL0FuNGpBRUVnYXlJREpBQWdBMEtBZ0lDQU1EY0RHQ0FEUW9DQWdJQXdOd01RSUFNZ0FFSEFBRUVDUVFCQkFpQURRUkJxRU04QklnYzNBd2dnQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBUW9DQWdJRGdBQ0VISUFBQ2ZnSitJQUpDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUFnQWtFQUlBTkJDR29RK1FVTUFRc2dBQ0FDUVFFZ0EwRUlhaENuQVFzaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUFuOUJBQ0FES1FNSUlnaENnSUNBZ0hCVURRQWFRUUFnQ0tjaUJTOEJCa0VQUncwQUdpQUZLQUlnQ3lFR0EwQWdCRUVDUmdSQVFRQWhCQU5BSUFSQkFrY0VRQ0FHSUFSQkEzUWlCV29wQXdnaUIwSWdpS2RCZFU4RVFDQUhweUlBSUFBb0FnQkJBV28yQWdBTElBRWdCV29nQnpjREFDQUVRUUZxSVFRTUFRc0xJQUloQnlBREtRTUlEQU1MSUFSQkEzUWhCU0FFUVFGcUlRUWdBQ0FGSUFacUtRTUlFR0JGRFFBTEN5QUFJQU1wQXdnUUR5QUNDeEFQQ3lBRFFTQnFKQUFnQnd0RkFRRi9Ba0FnQVVHQWdBRnhSUVJBSUFGQmdJQUNjVVVOQVNBQUtBSVFLQUtNQVNJQlJRMEJJQUV0QUNoQkFYRkZEUUVMSUFBZ0FrSE9IUkNQQVVGL0lRTUxJQU1MZ1FFQ0FuOEJmZ0pBSUFFcEFnUWlCRUwvLy8vLy8vLy8vNzkvVmdSQUlBRW9BZ3doQUF3QkN5QUFLQUkwSUFSQ0lJaW5JQUFvQWlSQkFXdHhRUUowYWlFQ0lBQW9BamdoQXdOQUlBTWdBaWdDQUNJQVFRSjBhaWdDQUNJQ0lBRkdEUUVnQWtFTWFpRUNJQUFOQUF0Qm1aQUJRYTc4QUVINEZFSHVIeEFBQUFzZ0FBdWlBd0lEZndGOEl3QkJJR3NpQkNRQUFrQUNRQUpBSUFKQ0lJaW5JZ1ZCQTA4RVFDQUZRUXBxUVFKSkJFQWdCRUVjYWlBQ3AwRUVhaUlGUVFFUXFRRWdBQ2dDMkFFaEF5QUVRZ0EzQWhRZ0JFS0FnSUNBZ0lDQWdJQi9Od0lNSUFRZ0F6WUNDQ0FFUVFocUlnWWdCQ2dDSENJRHJSQXdHaUFHSUFVUWdnSWhCU0FHRUJzZ0FDQUNFQThnQlVVTkF3d0NDeUFGUVFkclFXMU5CRUFDZnlBQ1FvQ0FnSURBZ1lEOC93Qjh2eUlIUkFBQUFBQUFBUEJCWXlBSFJBQUFBQUFBQUFBQVpuRUVRQ0FIcXd3QkMwRUFDeUlEdUNBSFlnMEREQUlMSUFNRVFFRi9JUU1nQUNBQ0VJMEJJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQ0FBSUFSQkhHb2dBa0VCRU1JQ0RRUWdCQ2dDSENFRERBSUxJQUFnQkVFY2FpQUNFSGNFUUNBQUlBSVFEMEYvSVFNTUJBdEJmeUVESUFBZ0FoQ05BU0lDUW9DQWdJQndnMEtBZ0lDQTRBQlJEUU1nQUNBRVFRUnFJQUpCQUJEQ0FnMERJQVFvQWdRaUF5QUVLQUljUmcwQkRBSUxJQUtuSWdOQkFFZ05BUXNnQVNBRE5nSUFRUUFoQXd3QkN5QUFRZUhZQUVFQUVGQkJmeUVEQ3lBRVFTQnFKQUFnQXd1akJBSUZmd0orSXdCQkVHc2lBeVFBUVFjZ0FVRUlheUlHS1FNQUlnaENJSWluSWdRZ0JFRUhhMEZ1U1JzaEJBSi9Ba0FDUUFKQVFRY2dBVUVRYXlJQktRTUFJZ2xDSUlpbklnVWdCVUVIYTBGdVNSc2lCVUYvUmlBRVFYNXhRUUpIY1VVZ0JVRitjVUVDUmlBRVFYOUhjbkVOQUNBQUlBTkJDR29nQ1NBSUlBSkJBVUVBRUlVQ0lnUkZEUUFnQUNBSkVBOGdBQ0FJRUE4Z0JFRUFTQTBCSUFFZ0F5a0RDRGNEQUF3Q0N5QUFJQWtRYkNJSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUlFQThNQVFzZ0FDQUlFR3dpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFBZ0NSQVBEQUVMQWtBQ1FDQUFLQUlRSWdVb0Fvd0JJZ1FFUUNBRUxRQW9RUVJ4RFFFTElBbENJSWluSWdkQmRrY2dDRUlnaUtjaUJFRjJSM0VOQVNBRUlBZEdEUUFnQUNBSkVBOGdBQ0FJRUE4Z0FFR0ZMRUVBRUJVTUFnc2dBQ0FDSUFFZ0NTQUlJQVVvQXFBQ0VSb0FEUUVNQWdzZ0FDQURRUVJxSUFrUW1BRUVRQ0FBSUFnUUR3d0JDeUFBSUFNZ0NCQ1lBUTBBSUFFQ2Z3SkFBa0FDUUFKQUFrQUNRQ0FDUWEwQmF3NERBUU1DQUFzQ1FDQUNRYUFCYXc0Q0JRQUVDeUFES0FJRUlBTW9BZ0IxREFVTElBTW9BZ0FnQXlnQ0JIRU1CQXNnQXlnQ0FDQURLQUlFY2d3REN5QURLQUlBSUFNb0FnUnpEQUlMRUFFQUN5QURLQUlFSUFNb0FnQjBDNjAzQXdBTUFRc2dBVUtBZ0lDQU1EY0RBQ0FHUW9DQWdJQXdOd01BUVg4TUFRdEJBQXNoQUNBRFFSQnFKQUFnQUF1R0JRSUhmd0orQWtBZ0FVS0FnSUNBY0lOQ2dJQ0FnSkIvVWdSQVFvQ0FnSURnQUNFS0lBQWdBUkEzSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVFzQ1FDQUNRb0NBZ0lCd2cwS0FnSUNBa0g5UkRRQkNnSUNBZ09BQUlRb2dBQ0FDRURjaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVWcwQUlBRWhBZ3dCQ3dKQUlBS25JZ1VwQWdRaUNrTC8vLy8vQjROUURRQWdBYWNpQXlrQ0JDRUxBa0FnQXlnQ0FFRUJSeUFLSUF1RlFvQ0FnSUFJZzBJQVVuSU5BQ0FESUFBb0FoQW9BZ3dSQkFBZ0JTa0NCQ0lLcHlJRVFmLy8vLzhIY1NJSElBTXBBZ1FpQzZjaUJrSC8vLy8vQjNFaUNHb2dCRUVmZG5RZ0JrRWZkaUlKUVJGemFra05BQ0FGUVJCcUlRWWdBMEVRYWlFRUlBa0VRQ0FFSUFoQkFYUnFJQVlnQjBFQmRCQWZHaUFESUFNcEFnUWlDaUFGS1FJRWZFTC8vLy8vQjRNZ0NrS0FnSUNBZUlPRU53SUVEQUlMSUFRZ0NHb2dCaUFIRUI4YUlBTWdBeWtDQkNJS0lBVXBBZ1I4UXYvLy8vOEhneUlMSUFwQ2dJQ0FnSGlEaERjQ0JDQUVJQXVuYWtFQU9nQUFEQUVMQW40Q1FBSkFJQXVuUWYvLy8vOEhjU0FLcDBILy8vLy9CM0ZxSWdkQmdJQ0FnQVJQQkVBZ0FFSEEyZ0JCQUJCR0RBRUxJQUFnQnlBS0lBdUVweUlHUVI5MkVPb0JJZ2dOQVF0Q2dJQ0FnT0FBREFFTElBaEJFR29oQkFKQUlBWkJBRTRFUUNBRUlBTkJFR29nQXlnQ0JFSC8vLy8vQjNFUUh5SUVJQU1vQWdSQi8vLy8vd2R4YWlBRlFSQnFJQVVvQWdSQi8vLy8vd2R4RUI4YUlBUWdCMnBCQURvQUFBd0JDeUFFSUFNZ0F5Z0NCRUgvLy8vL0IzRVF3d1VnQkNBREtBSUVRUUYwYWlBRklBVW9BZ1JCLy8vLy93ZHhFTU1GQ3lBSXJVS0FnSUNBa0grRUN5RUtJQUFnQVJBUERBRUxJQUVoQ2dzZ0FDQUNFQThnQ2d0QUFDQUFBbjhDZnlBREJFQWdBU2dDSkNBQ1FRTjBha0VFYWd3QkMwRUFJQUVvQWlBaUEwVU5BUm9nQXlBQkx3RW9JQUpxUVFSMGFnc29BZ0FMRU5rQkN3MEFJQUFnQVNBQ1FRSVF6Z0lMTlFFQmZ5TUFRZEFBYXlJQ0pBQWdBaUFBS0FJUUlBSkJFR29nQVJDUUFUWUNBQ0FBUWVmNUFDQUNFTVlDSUFKQjBBQnFKQUFMb3dFQ0FYOEJmaU1BUVJCcklnVWtBQ0FGSUFRMkFneEJmeUVFSUFBZ0FTQUZRUXhxRU5RQlJRUkFJQU1vQWdBaUFFRjhjU0FCSUFJZ0F5Z0NCQ0FBUVFOeFFRSjBRWlRBQVdvb0FnQVJJQUFoQmlBREtBSUFFT29GSUFVb0Fnd2lBQ0FBS0FJQVFmLy8vLzhEY1RZQ0FDQURRb0NBZ0lBd0lBWWdCa0tBZ0lDQWNJTkNnSUNBZ09BQVVTSUFHemNEQUVGL1FRQWdBQnNoQkFzZ0JVRVFhaVFBSUFRTDlRRUJBMzhqQUVFUWF5SUdKQUFnQmlBQU9RTUlJQVlnQVVFQmF5SUhOZ0lBSUFWQmdBRkIrUEFBSUFZUVRob2dBeUFGTFFBQVFTMUdOZ0lBSUFRZ0JTMEFBVG9BQUNBQlFRSk9CRUFnQkVFQmFpQUZRUU5xSUFjUUh4b0xJQUVnQkdwQkFEb0FBQ0FDSVFnZ0FTQUZhaUFCUVFGS2FrRUNhaUVDUVFBaEEwRUFJUVFEUUNBQ0lnRkJBV29oQWlBQkxBQUFJZ1VRamdZTkFBc0NRQUpBQWtBZ0JVRXJhdzREQVFJQUFndEJBU0VFQ3lBQ0lRRUxBMEFnQVN3QUFDSUNFTkVDQkVBZ0FVRUJhaUVCSUFOQkNtd2dBbXRCTUdvaEF3d0JDd3NnQ0NBRFFRQWdBMnNnQkJ0QkFXbzJBZ0FnQmtFUWFpUUFDNWtIQWdwL0FYNGpBRUh3QUdzaUJTUUFJQUFvQWhBaEJpQUZRZ0EzQTFnZ0JVSUFOd05RSUFVZ0JqWUNaQ0FGUVRzMkFtQUNRQ0FDQkg4Z0JTQUNOZ0pBSUFWQjBBQnFRZE04SUFWQlFHc1FrZ0lnQTBGL1J3UkFJQVVnQXpZQ01DQUZRZEFBYWtIWit3QWdCVUV3YWhDU0Fnc2dCVUhRQUdwQkNoQVJJQUFnQVVFeElBQWdBaEJpUVFNUUdSb2dBQ0FCUVRJZ0E2MUJBeEFaR2lBRVFRSnhEUUVnQUNnQ0VBVWdCZ3RCakFGcUlRZ2dCRUVCY1VVaEN3TkFJQWdvQWdBaUNFVU5BU0FMUlFSQVFRRWhDd3dCQzBIZ2lBRWhBa0VBSVFZQ1FDQUlLUU1JSWc5Q2dJQ0FnSEJVRFFBZ0Q2Y2lCQ2dDRUNJRFFUQnFJUWNnQXlBREtBSVlRWDl6UVFKMFFhUitjbW9vQWdBaEF3TkFJQU5GRFFFZ0J5QURRUUZyUVFOMElnbHFJZ29vQWdBaEF5QUtLQUlFUVRaSEJFQWdBMEgvLy84ZmNTRUREQUVMQ3lBRFFmLy8vLzhEU3cwQUlBUW9BaFFnQ1dvcEF3QWlEMEtBZ0lDQWNJTkNnSUNBZ0pCL1VnMEFJQUFnRHhDekFTSURSUTBBSUFOQjRJZ0JJQU10QUFBYklRSWdBeUVHQ3lBRklBSTJBaUFnQlVIUUFHcEIwendnQlVFZ2FoQ1NBaUFBSUFZUVZBSkFJQWdvQWdnaUFpOEJCaER1QVFSQUlBSW9BaUFpQnk4QUVTSUNRUXQyUVFGeElRb2dBa0dBQ0hGRkRRRkJmeUVHQWtBZ0J5Z0NVQ0lDUlEwQUlBZ29BaUFnQnlnQ0ZFRi9jMm9oRGlBQ0lBY29Ba3hxSVFrZ0J5Z0NSQ0VFUVFBaERBTkFJQVFoQmlBQ0lBbFBEUUVnQWtFQmFpRURBbjhnQWkwQUFDSUNSUVJBQWtBZ0JVSG9BR29nQXlBSkVPNEZJZ0pCQUVnTkFDQUZLQUpvSVEwZ0JVSHNBR29nQWlBRGFpSUNJQWtRN2dVaUEwRUFTQTBBSUFVb0Ftd2lCRUVCZGtFQUlBUkJBWEZyY3lBR2FpRUVJQUlnQTJvTUFnc2dCeWdDUkNFR0RBTUxJQVlnQWtFQmF5SUNRZjhCY1VFRmJpSU5RWHRzSUFKcVFmOEJjV3BCQVdzaEJDQURDeUVDSUF3Z0RXb2lEQ0FPVFEwQUN3c2dCU0FBSUFjb0FrQVFrUVFpQWtIemlBRWdBaHMyQWhBZ0JVSFFBR3BCd0R3Z0JVRVFhaENTQWlBQUlBSVFWQ0FHUVg5SEJFQWdCU0FHTmdJQUlBVkIwQUJxUWRuN0FDQUZFSklDQ3lBRlFkQUFha0VwRUJFTUFRdEJBQ0VLSUFWQjBBQnFRYWVTQVVFQUVKSUNDeUFGUWRBQWFrRUtFQkVnQ2tVTkFBc0xJQVZCMEFCcVFRQVFFVUtBZ0lDQUlDRVBJQVVvQWxBaEFpQUZLQUpjUlFSQUlBQWdBaEJpSVE4TElBSUVRQ0FGS0FKa0lBSkJBQ0FGS0FKZ0VRRUFHZ3NnQUNBQlFUVWdEMEVERUJrYUlBVkI4QUJxSkFBTHBnRUJBMzhqQUVHZ0FXc2lCQ1FBSUFRZ0FDQUVRWjRCYWlBQkd5SUZOZ0tVQVVGL0lRQWdCQ0FCUVFGcklnWkJBQ0FCSUFaUEd6WUNtQUVnQkVFQVFaQUJFQ3NpQkVGL05nSk1JQVJCT2pZQ0pDQUVRWDgyQWxBZ0JDQUVRWjhCYWpZQ0xDQUVJQVJCbEFGcU5nSlVBa0FnQVVFQVNBUkFRYURVQkVFOU5nSUFEQUVMSUFWQkFEb0FBQ0FFSUFJZ0EwSGpBRUhrQUJDWkJDRUFDeUFFUWFBQmFpUUFJQUFMblFNREFYNERmd044QWtBQ1FBSkFBa0FnQUwwaUFVSUFXUVJBSUFGQ0lJaW5JZ0pCLy84L1N3MEJDeUFCUXYvLy8vLy8vLy8vL3dDRFVBUkFSQUFBQUFBQUFQQy9JQUFnQUtLakR3c2dBVUlBV1EwQklBQWdBS0ZFQUFBQUFBQUFBQUNqRHdzZ0FrSC8vNy8vQjBzTkFrR0FnTUQvQXlFRFFZRjRJUVFnQWtHQWdNRC9BMGNFUUNBQ0lRTU1BZ3NnQWFjTkFVUUFBQUFBQUFBQUFBOExJQUJFQUFBQUFBQUFVRU9pdlNJQlFpQ0lweUVEUWN0M0lRUUxJQVFnQTBIaXZpVnFJZ0pCRkhacXR5SUdSQUFBNFA1Q0x1WS9vaUFCUXYvLy8vOFBneUFDUWYvL1AzRkJuc0dhL3dOcXJVSWdob1MvUkFBQUFBQUFBUEMvb0NJQUlBQWdBRVFBQUFBQUFBQUFRS0NqSWdVZ0FDQUFSQUFBQUFBQUFPQS9vcUlpQnlBRklBV2lJZ1VnQmFJaUFDQUFJQUJFbjhaNDBBbWF3eitpUks5NGpoM0ZjY3cvb0tKRUJQcVhtWm1aMlQrZ29pQUZJQUFnQUNBQVJFUlNQdDhTOGNJL29rVGVBOHVXWkViSFA2Q2lSRm1USXBRa1NkSS9vS0pFazFWVlZWVlY1VCtnb3FDZ29pQUdSSFk4ZVRYdk9lbzlvcUFnQjZHZ29DRUFDeUFBQ3c4QUlBQWdBVUtBZ0lDQU1CQy9BZ3NtQVFGL0l3QkJFR3NpQkNRQUlBUWdBallDRENBQUlBTWdBU0FDRUpJRUlBUkJFR29rQUF1WkFRRURmQ0FBSUFDaUlnTWdBeUFEb3FJZ0EwUjgxYzlhT3RubFBhSkU2NXdyaXVibFdyNmdvaUFESUFORWZmNnhWK01keHo2aVJOVmh3Um1nQVNxL29LSkVwdmdRRVJFUmdUK2dvQ0VGSUFNZ0FLSWhCQ0FDUlFSQUlBUWdBeUFGb2tSSlZWVlZWVlhGdjZDaUlBQ2dEd3NnQUNBRElBRkVBQUFBQUFBQTREK2lJQVVnQktLaG9pQUJvU0FFUkVsVlZWVlZWY1Uvb3FDaEM1SUJBUU44UkFBQUFBQUFBUEEvSUFBZ0FLSWlBa1FBQUFBQUFBRGdQNklpQTZFaUJFUUFBQUFBQUFEd1B5QUVvU0FEb1NBQ0lBSWdBaUFDUkpBVnl4bWdBZm8rb2tSM1VjRVdiTUZXdjZDaVJFeFZWVlZWVmFVL29LSWdBaUFDb2lJRElBT2lJQUlnQWtUVU9JaSs2ZnFvdmFKRXhMRzB2Wjd1SVQ2Z29rU3RVcHlBVDM2U3ZxQ2lvS0lnQUNBQm9xR2dvQXNLQUNBQVFUQnJRUXBKQzQwQkFDQUFJQUFnQUNBQUlBQkVDZmY5RGVFOUFqK2lSSWl5QVhYZzcway9vS0pFTzQ5b3RTaUNwTCtnb2tSVlJJZ09WY0hKUDZDaVJIMXY2d01TMXRTL29LSkVWVlZWVlZWVnhUK2dJQUNpSUFBZ0FDQUFJQUJFZ3BJdXNjVzRzeitpUkZrQmpSdHNCdWEvb0tKRXlJcFpuT1VxQUVDZ29rUkxMWW9jSnpvRHdLQ2lSQUFBQUFBQUFQQS9vS01McXdJQkNIOGpBRUV3YXlJRUpBQWdBa0VIY1NFSklBQW9BZ0FpQlVFSWFpRUdRU0FoQndOQUlBVW9BaHdpQXlBQklBZHFJZ2hKQkVBQ1FDQUZLQUlVQkVBZ0JpZ0NBQ0VEREFFTElBQW9BZ0FoQXlBRlFnQTNBaFFnQlVLQWdJQ0FnSUNBZ0lCL053SU1JQVVnQXpZQ0NBc2dCRUlBTndJb0lBUkNnSUNBZ0lDQWdJQ0FmemNDSUNBRUlBTTJBaHdnQkVJQU53SVVJQVJDZ0lDQWdJQ0FnSUNBZnpjQ0RDQUVJQU0yQWdnZ0JpQUVRUnhxSWdvZ0JFRUlhaUlEUVFBZ0NFRVBha0VEYmtFQmFrRUFFS0FFSUFZZ0JpQURJQWhCQUJDVkFSb2dDaEFiSUFNUUd5QUZJQWcyQWh3Z0NDRURDeUFBSUFZUVJCb2dBRUVBTmdJRUlBQWdBU0FKSUFNUTRRTkZCRUFnQjBFQmRpQUhhaUVIREFFTEN5QUFJQUVnQWhET0FSb2dCRUV3YWlRQUMxY0JBbjhqQUVFZ2F5SUZKQUFnQUNnQ0FDRUdJQVZDQURjQ0dDQUZRb0NBZ0lDQWdJQ0FnSDgzQWhBZ0JTQUdOZ0lNSUFWQkRHb2lCaUFDRUxvQ0dpQUFJQUVnQmlBRElBUVFReG9nQmhBYklBVkJJR29rQUFzZUFDQUJCRUFnQUNnQ0FDSUFLQUlBSUFGQkFDQUFLQUlFRVFFQUdnc0xFQUFnQWEwZ0FLMStJQUlnQXhDb0JBdGlBUUYvSXdCQklHc2lCaVFBQWtBQ1FDQURJQVVnQXlBRlNCdEI1QUJPQkVBZ0JpQUJOZ0ljUVg4aEFTQUFJQVpCREdvZ0FpQURJQVFnQlVFRUVKOEdSUTBCREFJTElBRWdBaUFESUFRZ0JSQ2VCZ3RCQUNFQkN5QUdRU0JxSkFBZ0FRdFFBUUovSUFKQkFDQUNRUUJLR3lFQ0FrQURRQ0FDSUFSR0RRRWdBQ0FFUVFKMGFpSURJQU1vQWdBaUF5QUJhellDQUNBRVFRRnFJUVFnQVNBRFN5RURRUUVoQVNBRERRQUxRUUFoQVFzZ0FRdFRBUUYvSUFFZ0FDZ0NCQ0lDU2dSQUlBQW9BZ3dnQUNnQ0NDQUJJQUpCQTJ4QkFtMGlBaUFCSUFKS0d5SUJRUUowSUFBb0FoQVJBUUFpQWtVRVFFRi9Ed3NnQUNBQk5nSUVJQUFnQWpZQ0NBdEJBQXRaQVFOL1FYOGhBU0FBSUFBb0FnQWlBa0VDYWlJREVOa0NCSDlCZndVZ0FDZ0NDQ0lCUVFScUlBRWdBa0VDZENJQ0VKd0JJQUFvQWdnaUFVRUFOZ0lBSUFFZ0FtcEJmellDQkNBQUlBTTJBZ0FnQUJDaUJrRUFDd3VsQWdFRmZ3TkFBa0FDUUFKQUFrQUNmeUFDSUFkTUlna2dCQ0FHVEhKRkJFQWdBU0FIUVFKMGFpZ0NBQ0lJSUFNZ0JrRUNkR29vQWdBaUNVa0VRQ0FJREFJTElBZ2dDVWNOQXlBR1FRRnFJUVlnQjBFQmFpRUhJQWdoQ1F3RUN5QUpEUUVnQVNBSFFRSjBhaWdDQUFzaENTQUhRUUZxSVFjTUFnc2dCQ0FHVEEwQ0lBTWdCa0VDZEdvb0FnQWhDUXNnQmtFQmFpRUdDd0ovQWtBQ1FBSkFBa0FnQlE0REF3QUJBZ3NnQmlBSGNVRUJjUXdEQ3lBR0lBZHpRUUZ4REFJTEVBRUFDeUFHSUFkeVFRRnhDeUVLSUFvZ0FDZ0NBQ0lJUVFGeFJnMEJJQUFvQWdRZ0NFd0VRQ0FBSUFoQkFXb1EyUUlFUUVGL0R3c2dBQ2dDQUNFSUN5QUFJQWhCQVdvMkFnQWdBQ2dDQ0NBSVFRSjBhaUFKTmdJQURBRUxDeUFBRUtJR1FRQUxhd0lCZmdKL0lBQW9BZ0FoQXdOQUlBTXRBQUFpQkVFNmEwSC9BWEZCOWdGUEJFQWdBa0lLZmlBRXJVTC9BWU44UWpCOUlnSkMvLy8vL3dkVUlnUWdBWElFUUNBQ1F2Ly8vLzhISUFRYklRSWdBMEVCYWlFRERBSUZRWDhQQ3dBTEN5QUFJQU0yQWdBZ0FxY0xaQUVCZndKQUlBRkNJSWluSWdKRklBSkJDMnBCRVV0eURRQUNRQ0FCUW9DQWdJQndWQTBBSUFHbklnSXZBUVpCQkVjTkFDQUNLUU1nSWdGQ0lJaW5JZ0pGSUFKQkMycEJFVXR5RFFFTElBQkI5c2NBUVFBUUZVS0FnSUNBNEFBaEFRc2dBUXNSQUNBQUlBRWdBaUFEUVFCQkFCQ0NBUXUrQVFJR2Z3SitJQUVvQWdBaUF5QUFLUUlFSWdtblFmLy8vLzhIY1NJRUlBTWdCRW9iSUFOcklRY2dBRUVRYWlFRklBTkJBbW9oQ0NBSlFvQ0FnSUFJZ3lFS1FRQWhBRUlBSVFrQ1FBTkFJQUJCQWtjRVFFRi9JUVlnQUNBSFJnMENBbjhnQ2xCRkJFQWdCU0FEUVFGMGFpOEJBQXdCQ3lBRElBVnFMUUFBQ3lJRVFUQnJRUWxMRFFJZ0FFRUJhaUVBSUFOQkFXb2hBeUFFclNBSlFncCtmRUl3ZlNFSkRBRUxDeUFDSUFrM0F3QWdBU0FJTmdJQVFRQWhCZ3NnQmd1YUF3TUNmQU4vQVg0Q2Z5QUFLd01JSWdKRUFBQUFBQUFBS0VBUWpnTWlBNWxFQUFBQUFBQUE0RUZqQkVBZ0E2b01BUXRCZ0lDQWdIZ0xJZ1JCREdvZ0JDQUVRUUJJR3lJRVFRQktJUVlnQkVFQUlBWWJJUVlDZmlBQUt3TUFJQUpFQUFBQUFBQUFLRUNqbktBaUFwbEVBQUFBQUFBQTRFTmpCRUFnQXJBTUFRdENnSUNBZ0lDQWdJQ0Fmd3NpQnhETUJMa2hBZ05BSUFVZ0JrWkZCRUFnQlVFQ2RFR1EwZ0ZxS0FJQUlRUWdCVUVCUmdSQUlBUWdCeERMQktkcVFlMENheUVFQ3lBRlFRRnFJUVVnQWlBRXQ2QWhBZ3dCQ3dzZ0FpQUFLd01RUkFBQUFBQUFBUEMvb0tCRUFBQUFBSENabEVHaUlBQXJBekFnQUNzREtFUUFBQUFBQUVDUFFLSWdBQ3NER0VRQUFBQUFRSGRMUWFJZ0FDc0RJRVFBQUFBQUFFenRRS0tnb0tDZ0lRSWdBUVJBSUFJQ2ZpQUNtVVFBQUFBQUFBRGdRMk1FUUNBQ3NBd0JDMEtBZ0lDQWdJQ0FnSUIvQ3hDNEEwSGcxQU5zdDZBaEFnc2dBcDFFQUFBQUFBQUFBQUNnUkFBQUFBQUFBUGgvSUFKRUFBRGN3Z2l5UGtObEcwUUFBQUFBQUFENGZ5QUNSQUFBM01JSXNqN0RaaHNMZGdFQ2Z5QUJLQUlBUVFCSUJFQWdBU0FBUVVCcktBSUFFREkyQWdBTElBQkJFUkFRSUFCQnNBRVFFQ0FDUVFBZ0FrRUFTaHNoQWlBQVFla0FRWDhRSENFRUEwQWdBaUFEUmtVRVFDQUFRUTRRRUNBRFFRRnFJUU1NQVFzTElBQkJCaEFRSUFCQjZ3QWdBU2dDQUJBY0dpQUFJQVFRSGd0UEFRRi9RWDhoQVFKQUlBQkIrd0FRTEEwQUlBQW9BaEJCL1FCSEJFQWdBQkNBQVJvRFFDQUFRUWNRNFFFTkFpQUFLQUlRUWYwQVJ3MEFDeUFBRVBNQkMwRi9RUUFnQUJBU0d5RUJDeUFCQzJnQUlBQWdBU0FDRUU4aUFFRUFUZ1JBSUFFb0FuUWdBRUVFZEdvaUFpQUNLQUlNUVlkL2NTQURRUU4wUWZnQWNYSTJBZ3dnQWlBQktBSzhBU0lETmdJRUlBSWdBU2dDd0FFMkFnZ2dBU2dDekFFZ0EwRURkR29nQURZQ0JDQUJJQUEyQXNBQkN5QUFDMjBCQVg4Z0FDQUJRZndCYWtFUUlBRkIrQUZxSUFFb0F2UUJRUUZxRUhoRkJFQWdBU0FCS0FMMEFTSURRUUZxTmdMMEFTQUJLQUw4QVNBRFFRUjBhaUlEUVg4MkFnQWdBeUFETFFBRVFmZ0JjVG9BQkNBRElBRW9BcndCTmdJSUlBTWdBQ0FDRUJnMkFnd0xJQU1MeGdNQkJIOGdBRUZBYXlJRktBSUFRYkFDYWlFREEwQkJBQ0VDQWtBRFFDQURLQUlBSWdORkRRRWdBeWdDSEFSQUlBRkZCRUFnQUVFR0VCQUxJQUJCaEFFUUVFR0RBU0VDSUFBZ0JTZ0NBQzBBYkVFRFJnUi9JQUJCRGhBUUlBQkJEaEFRSUFCQndnQVFFQ0FBUVFZUUdpQUFRUkVRRUNBQVFiQUJFQkFnQUVIcUFFRi9FQndoQVNBQVFTUVFFQ0FGS0FJQVFRQVFGeUFBUVlFQkVCQWdBRUdMQVJBUUlBQkI2d0JCZnhBY0lRUWdBQ0FCRUI0Z0FFRU9FQkFnQUNBRUVCNUJEZ1ZCZ3dFTEVCQkJmU0VDUVFFaEFRc2dBeWdDRUNBQ2FpRUNJQU1vQWhSQmYwWU5BQXRCRDBFT0lBRWJJUVFEUUNBQ0JFQWdBQ0FFRUJBZ0FrRUJheUVDREFFTEN5QUJSUVJBSUFCQkJoQVFDeUFBUWUwQUlBTW9BaFFRSEJwQkFTRUJEQUVMQ3dKQUlBQkJRR3NvQWdBaUFpZ0NZQVJBQWtBZ0FVVUVRRUYvSVFJTUFRc2dBRUVxRUJBZ0FFSHBBRUYvRUJ3aEFpQUFRUTRRRUFzZ0FFRzRBUkFRSUFCQkNCQWFJQUJCUUdzb0FnQkJBQkFYSUFBZ0FoQWVRU2doQWd3QkN5QUNMUUJzSWdNRVFDQUJSUVJBSUFCQkJoQVFRUzRoQWd3Q0MwRXVJUUlnQTBFRFJ3MEJJQUJCaXdFUUVBd0JDMEVvUVNrZ0FSc2hBZ3NnQUNBQ0VCQUxYUUVDZndKQUFrQWdBQ2dDbUFJaUFVRUFTQTBBSUFBb0FvQUNJQUZxTFFBQUlnQkJJMnNpQVVFTlRVRUFRUUVnQVhSQjVmQUFjUnNOQVFKQUlBQkI2d0JyRGdRQ0FRRUNBQXNnQUVIc0FXdEJBa2tOQVF0QkFTRUNDeUFDQ3k4QUlBQWdBU0FDSUFNUTR3SWlBRUVBVGdSQUlBRW9BblFnQUVFRWRHb2lBU0FCS0FJTVFRTnlOZ0lNQ3lBQUN5NEFJQUJCREJBcElnQUVRQ0FBSUFNMkFnZ2dBQ0FDTmdJRUlBQWdBU2dDRURZQ0FDQUJJQUEyQWhBTElBQUxhd0VCZndKQUlBRW9BcUFCSWdOQkFFNE5BQ0FBSUFFZ0FoQlBJZ05CQUVnTkFDQUJJQU0yQXFBQklBTkJCSFFpQUNBQktBSjBhaUlDSUFJb0FneEJoMzl4UVNCeU5nSU1JQUV0QUc1QkFYRkZEUUFnQVNnQ2RDQUFhaUlBSUFBb0FneEJBWEkyQWd3TElBTUxMZ0VCZndKQUlBRW9BcGdCSWdKQkFFNE5BQ0FBSUFGQnpRQVFUeUlDUVFCSURRQWdBU0FDTmdLWUFRc2dBZ3VZQVFFRWZ5QUJLQUlVSWdWQkFDQUZRUUJLR3lFR0lBRkJFR29oQkFKQUEwQWdBeUFHUndSQUlBUW9BZ0FnQTBFRGRHb29BZ0FnQWtZTkFpQURRUUZxSVFNTUFRc0xRWDhoQXlBQUlBUkJDQ0FCUVJocUlBVkJBV29RZUEwQUlBRWdBU2dDRkNJRVFRRnFOZ0lVSUFFb0FoQWhBeUFBSUFJUUdDRUJJQU1nQkVFRGRHb2lBRUVBTmdJRUlBQWdBVFlDQUNBR0lRTUxJQU1MWlFFQmZ5QUFRZm9BRUVwRkJFQWdBRUdkOXdCQkFCQVdRUUFQQ3dKQUlBQVFFZzBBSUFBb0FoQkJnWDlIQkVBZ0FFR045d0JCQUJBV1FRQVBDeUFBS0FJQUlBQXBBeUFRTVNJQlJRMEFJQUFRRWtVRVFDQUJEd3NnQUNnQ0FDQUJFQk1MUVFBTDRCTUJHSDhqQUVIUUFHc2lCQ1FBSUFCQlFHc29BZ0FoQlNBQUtBSUFJUWNnQkVFQU5nSThJQUFvQWhnaEVpQUZJQVV0QUc0aUZVRUJjam9BYmdKL0FrQUNRQ0FBRUJJTkFBSkFBa0FnQUNnQ0VFR0RmMFlFUUNBQUtBSW9SUTBCSUFBUTRnRU1Bd3NnQVNBQ1FRSkdjZzBCSUFCQnh1Z0FRUUFRRmd3Q0N5QUhJQUFvQWlBUUdDRUpJQUFRRWcwQ0N5QUJSUVJBSUFjZ0NVSDhBQ0FKR3hBWUlRc0xJQUFRZ0FFYUFuOGdBQ2dDRUNJT1FVNUdCRUFnQUJBU0RRTWdBQkNqQWcwRFFRRU1BUXNnQUVFR0VCQkJBQXNoQVNBSkJFQWdBQ0FGSUFsQkFoQ2dBVUVBU0EwQ0N5QUFRZnNBRUN3TkFTQU9RVTVHSVJZZ0FCQ0FBUm9nQUVFQ0VCQWdCU2dDaEFJaEZ5QUFRVUJySWdNb0FnQkJBQkE1SUFCQjFnQVFFQ0FBSUFsQkZrRXZJQXNiSUFrYkVCb2dBeWdDQUNBQkVHUWdCU2dDbUFJaEdFRUFJUU1EUUNBRFFRSkdSUVJBSUFSQkVHb2dBMEVFZEdvaUFVRUFOZ0lJSUFGQ0FEY0RBQ0FEUVFGcUlRTU1BUXNMSUFSQkFEWUNORUVJUVFjZ0RrRk9SaHNoRXlBT1FVNUhJUmtnQUVGQWF5RUtBMEFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDZndKL0FrQWdBQ2dDRUNJRFFUdEhCRUFnQTBIOUFFWU5CRUVBSUFOQldFY05BaG9nQUJBU1JRMEJEQXdMUVFBaEF5QUFFQkpGRFF3TURnc0NRQUpBSUFBb0FoQkJPMnNPQXdBQkFBRUxRU3doQVNBRVFTdzJBandnQUNnQ0dDRVJRUUFoRDBFQUlRWkJBQXdDQ3lBQVFSc1FFRUVCQ3lFUElBQW9BaGdoRVNBQUlBUkJQR3BCQVVFQVFRRVF4QU1oQmlBRUtBSThJUUVnQmtFQVNBMEVJQU5CV0VZTElSQkJQQ0VEQWtBZ0FVRThSeUFRY2lJYVFRRWdCa0Z2Y1NJTkd3UkFJQUZCTzBZZ0VIRkZJQUZCK0FCSGNRMEJJQUVoQXdzZ0FFR0s2QUJCQUJBV0RBd0xJQVpCRUhFaERBSkFBa0FDUUNBR1FXNXhRUUpHQkVBZ0RFVU5CaUFGSUFFZ0JTZ0N2QUVRd3dNaUEwRUFUZ1JBSUFVb0FuUWdBMEVFZEdvaUJpZ0NEQ0lJUVFOMlFROXhJZ05CQ1UxQkFFRUJJQU4wUWVBRWNSc2dBeUFOUVFWcVJuSU5BaUFHSUFoQmgzOXhRY2dBY2pZQ0RBd0dDeUFBS0FJQUlBVWdBU0FOUVFWcUVPY0NRUUJPRFFVTUJ3dEJCaUVVUVFFaEEwRUFJUWhCQUNFR0FrQUNRQUpBQWtBQ1FBSkFJQTBPQndBQ0FnSUZBd0VDQ3lBQUtBSVFRU2hHRFFFZ0FVRTdhMEVCVFFSQUlBQkJzK2dBUVFBUUZnd01DeUFNQkVBZ0JTQUJJQVVvQXJ3QkVNTURRUUJPRFFZZ0FDZ0NBQ0FGSUFGQkJSRG5Ba0VBU0EwTUlBQkJCUkFRSUFBZ0FSQWFJQUJCdlFFUUVDQUFJQUVRR2lBS0tBSUFJZ01nQXk4QnZBRVFGd3NnQkVFUWFpQVBRUVIwYWlJSUtBSUFSUVJBSUFBZ0NCRGVCQTBNQ3lBQlJRUkFJQVFnQ0NnQ0JEWUNBQ0FFUVVCcklnWkJFRUhjSWlBRUVFNGFRUUFoQXlBSFFmVUFRZlFBSUJBYklBWVE0UVFpQmtVTkZDQUFJQVVnQmtFQ0VLQUJRUUJJQkVBZ0J5QUdFQk1NRlFzZ0FFSHdBQkFRSUFCQnZRRVFFQ0FBSUFZUUdpQUtLQUlBSWdNZ0F5OEJ2QUVRRndzZ0NpQUlLQUlBTmdJQUlBQkJ1QUVRRUNBQVFRZ1FHaUFLS0FJQVFRQVFGd0pBSUFGRkJFQWdBRUc0QVJBUUlBQWdCaEFhSUFvb0FnQWlBeUFETHdHOEFSQVhJQWdnQ0NnQ0JFRUJhallDQkNBSElBWVFFd3dCQ3lBTVJRMEFJQUJCdUFFUUVDQUFJQUVRR2lBS0tBSUFJZ01nQXk4QnZBRVFGd3NDUUNBQUtBSVFRVDFHQkVBZ0FCQVNEUTBnQUJCV0RRME1BUXNnQUVFR0VCQUxBa0FnREFSQUlBQVF3Z01nQUVIR0FCQVFEQUVMSUFGRkJFQWdBQkRDQXlBQVFkRUFFQkFnQUVFT0VCQU1BUXNnQUNBQkVLRUJJQUJCekFBUUVDQUFJQUVRR2dzZ0NpQUtLQUlBS0FJRU5nSUFJQUFRdHdFTkN3d1BDMEVESVFNTUFndEJBQ0VESUJvRVFBd0NDeUFXSVFnZ0dTRUdJQk1oRkNBRUtBSTBSUTBDSUFCQmlQQUFRUUFRRmtFOElRTU1FUXRCQWlFREN3c2dEQVJBSUFBZ0JFRVFhaUFQUVFSMGFoRGRCRUVBU0EwSEN5QUFJQlFnQXlBUklBQW9BaFJCQUNBRVFUaHFFUGdCRFFZZ0JpQUlja0VCUmdSQUlBUWdCQ2dDT0RZQ05Bd0xDeUFNUlEwQ0lBUW9BamhCQVRZQ3VBRWdCU0FCSUFVb0Fyd0JFTU1EUVFCSURRRUxJQUJCd1BrQVFRQVFGZ3dGQ3lBQUtBSUFJQVVnQVVFR0VPY0NRUUJJRFFRZ0FFSFFBQkFRSUFCQnpRQVFFQ0FBSUFFUUdpQUFRYjBCRUJBZ0FDQUJFQm9nQ2lnQ0FDSURJQU12QWJ3QkVCY01DQXNDUUNBQlJRUkFJQUJCMVFBUUVBd0JDeUFBUWRRQUVCQWdBQ0FCRUJvTElBb29BZ0JCQUJCa0RBY0xJQVFvQWpRaUEwVUVRQ0FFSUFBb0FnUTJBa0FnQkNBQUtBSVVJZ1kyQWtRZ0JDQUFLQUlZTmdKTUlBUWdBQ2dDTURZQ1NDQUFRYVVaUWFBWklBNUJUa1lpQVJzaUF6WUNPQ0FBS0FJOElRZ2dBQ0FEUVJoQkJDQUJHMm8yQWp4QmZ5RUJJQUFRRWtVRVFDQUFJQk5CQUNBRElBWkJBQ0FFUVRScUVQZ0JJUUVMSUFBZ0NEWUNQRUVBSVFNZ0FDQUVRVUJyRU80Q0lBRnlEUXNnQkNnQ05DRURDeUFGS0FLQUFpQVhhaUFES0FJSU5nQUFJQVV0QUc1QkFuRkZCRUFnQnlnQ0VDSUJRUkJxSUFNb0Fvd0RJQUVvQWdRUkFBQWdCQ2dDTkNBQUtBSTRJQkpySWdFMkFwQURJQWNnRWlBQkVJRURJUUVnQkNnQ05DQUJOZ0tNQXlBQlJRMElDMEVBSVFNZ0FCQVNEUW9nQUNBRlFmWUFRUUlRb0FGQkFFZ05DZ0pBSUFRb0FoQUVRQ0FBSUFSQkVHb1EzQVFNQVFzZ0FFRUdFQkFMSUFCQnZRRVFFQ0FBUWZZQUVCb2dBRUZBYXlJQktBSUFJZ01nQXk4QnZBRVFGeUFBUVE0UUVDQUVLQUlnQkVBZ0FFRVJFQkFnQUNBRVFTQnFFTndFSUFCQkpCQVFJQUVvQWdCQkFCQVhJQUJCRGhBUUN5QUpCRUFnQUVFUkVCQWdBRUc5QVJBUUlBQWdDUkFhSUFCQlFHc29BZ0FnQlM4QnZBRVFGd3NnQUJEekFTQUFFUE1CQWtBZ0N3UkFRUUFoQXlBQUlBVWdDMEVCRUtBQlFRQklEUXdnQUVHOUFSQVFJQUFnQ3hBYUlBQkJRR3NvQWdBZ0JTOEJ2QUVRRnd3QkN5QUpEUUFnQUVIQkFSQVFJQUJCUUdzb0FnQWdCU2dDbUFJZ0dHdEJBV29RT1F0QkFDQUNSUTBMR2tFQUlnTWdBQ0FGS0FLVUF5QUxRUllnQ3lBQ1FRRkhHMEVBRVBjQkRRc2FEQW9MSUFBZ0JFRVFhaUFQUVFSMGFoRGRCRUVBU0EwQkN5QUFJQTFCQW1wQkFDQVJJQUFvQWhSQkFDQUVRVUJyRVBnQkRRQWdERVVOQXlBRUtBSkFRUUUyQXJnQklBQkIwQUFRRUNBQVFiMEJFQkFnRFVFQ1JnMEJJQWNnQVJEbkJDSURSUTBBSUFBZ0F4QWFJQUFvQWdBZ0JTQURRUWdRNXdJaEJpQUhJQU1RRXlBR1FRQk9EUUlMSUFFaEF3d0hDeUFBSUFFUUdnc2dDaWdDQUNJRElBTXZBYndCRUJjTUFRc0NRQ0FCUlFSQUlBQkIxUUFRRUF3QkN5QUFRZFFBRUJBZ0FDQUJFQm9MSUFvb0FnQWdEVUVCYTBIL0FYRVFaQXNnRUFSQUlBQkJHeEFRQ3lBSElBRVFFeUFFUVFBMkFqd01BUXNMUVFBaEF3d0JDd3NnQnlBREVCTkJmd3NoQXlBSElBa1FFeUFISUFzUUV5QUZJQlU2QUc0Z0JFSFFBR29rQUNBREN5NEFJQUFnQVNnQ0FEWUNGQ0FBSUFFb0FnUTJBZ2dnQUNBQktBSU1OZ0k0SUFBZ0FTZ0NDRFlDTUNBQUVCSUxLd0FnQUVIL0FFMEVRQ0FBUVFOMlFmei8vLzhCY1VHUWdRSnFLQUlBSUFCMlFRRnhEd3NnQUJDNUF3c3VBUUYvQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlDTHdFR1FSSkhEUUFnQWtFZ2FnOExJQUJCRWhDR0EwRUFDMmNDQVg4QmZpTUFRUkJySWdNa0FBSitBa0FDUUNBQ1JRMEFJQUFwQWdRaUJFTC8vLy8vQjRNZ0FWY05BQ0FFUW9DQWdJQUlnMElBVWcwQkN5QUJRZ0Y4REFFTElBTWdBVDRDRENBQUlBTkJER29ReVFFYUlBTTBBZ3dMSVFFZ0EwRVFhaVFBSUFFTHpnRUJCSDhDUUNNQUlnVWdBQ2dDUUNnQ0VDZ0NlRWtFUUNBQVFZMGlRUUFRT2tGL0lRUU1BUXNnQUNnQ0JDRURRWDhoQkNBQUlBRVFyUVlOQUFOQUlBQW9BaGdpQWkwQUFFSDhBRWNFUUVFQUlRUU1BZ3NnQUNBQ1FRRnFOZ0lZSUFBb0FnUWhBaUFBSUFOQkJSRHdBUVJBSUFBUXFBSU1BZ3NnQUNnQ0FDQURha0VKT2dBQUlBQW9BZ0FnQTJvZ0FpQURhMEVGYWpZQUFTQUFRUWRCQUJDNEFTRUNJQUFnQVJDdEJnMEJJQUFvQWdBZ0Ftb2dBQ2dDQkNBQ2EwRUVhellBQUF3QUN3QUxJQVVrQUNBRUM1RUdBUVovSXdCQklHc2lCeVFBSUFjZ0F6WUNIQUovQWtBZ0FDZ0NBQ0FIUVFScVFTQVFQUTBBSUFGQjRBQkhJUXNEUUFKQUFrQUNRQUpBSUFNZ0FDZ0NQQ0lLVHcwQUFrQWdBeTBBQUNJR1FSOUxEUUFnQUNnQ1FFVUVRRUd2MndBaEJpQUNEUU1NQndzZ0MwVUVRQ0FHUVExSERRRkJDaUVHSUFOQkFXb2dBeUFETFFBQlFRcEdHeUVEREFFTElBWkJDbXNPQkFFQUFBRUFDeUFISUFOQkFXb2lDRFlDSEFKQUFrQUNRQUpBQWtBZ0FTQUdSd1JBSUFaQjNBQkdEUUVnQmtFa1J3MENRU1FoQmlBTERRa2dDQzBBQUVIN0FFY05DU0FEUVFKcUlRaEJKQ0VCQ3lBRVFZRi9OZ0lBSUFRZ0FUWUNHQ0FFSUFkQkJHb1FOamNERUNBRklBZzJBZ0JCQUF3TEMwRUJJUVlDUUFKQUFrQUNRQ0FJTFFBQUlnbEJDbXNPQkFJREF3RUFDeUFKUWR3QVJpQUpRU0pHY2lBSlFTZEdjZzBFSUFrTkFpQUlJQXBQRFFjZ0J5QURRUUpxTmdJY1FRQWhCZ3dLQzBFQ1FRRWdBeTBBQWtFS1Joc2hCZ3NnQnlBR0lBaHFJZ00yQWh3Z0FVSGdBRVlOQ1NBQUlBQW9BZ2hCQVdvMkFnZ01DUXNDUUFKQUFrQWdDY0FpQmtFd2EwSC9BWEZCQ1UwRVFDQUFLQUpBSWdwRkRRSWdBVUhnQUVjRVFDQUtMUUJ1UVFGeFJRMENDeUFCUWVBQVJpQUdRVEJHQkg4Z0F5MEFBa0V3YTBIL0FYRkJDazhOQzBFd0JTQUdDMEUzUzNJTkFrSEY3QUFoQmlBQ0RRa01EUXNnQmtFQVRnMEFJQWhCQmlBSEVGZ2lCa0dBZ01RQVR3MEdJQWNnQnlnQ0FDSUROZ0ljSUFaQmZuRkJxTUFBUmcwTERBb0xJQWRCSEdwQkFSRDVBU0lHUVg5SERRRUxRZXpWQUNFR0lBSU5CZ3dLQ3lBR1FRQk9EUWNnQnlBSEtBSWNRUUZxTmdJY0RBSUxJQWJBUVFCT0RRWWdBMEVHSUFjUVdDSUdRZi8vd3dCTERRSWdCeUFIS0FJQU5nSWNEQVlMSUFjZ0EwRUNhallDSEFzZ0NTRUdEQVFMUWJUd0FDRUdJQUlOQVF3RkMwR0oyd0FoQmlBQ1JRMEVDeUFBSUFaQkFCQVdEQU1MSUFjZ0EwRUNhallDSEVFQUlRWUxJQWRCQkdvZ0JoQzVBUTBCSUFjb0Fod2hBd3dBQ3dBTElBY29BZ1FvQWhBaUFFRVFhaUFIS0FJSUlBQW9BZ1FSQUFCQmZ3c2hCaUFIUVNCcUpBQWdCZ3VqQVFJRGZnTi9Jd0JCRUdzaUNTUUFJQVJDQUNBRVFnQlZHeUVJSUFWQkFFZ2hDZ05BQWtBZ0JpQUlVUVJBUVFBaEJRd0JDMEYvSVFVZ0FDQUJJQVpDZjRVZ0JId2dCaUFLR3lJSElBTjhJQWxCQ0dvUWhRRWlDMEVBU0EwQUlBSWdCM3doQndKQUlBc0VRQ0FBSUFFZ0J5QUpLUU1JRUlZQlFRQk9EUUVNQWdzZ0FDQUJJQWNRK2dGQkFFZ05BUXNnQmtJQmZDRUdEQUVMQ3lBSlFSQnFKQUFnQlF1a0FRSUZmd0YrSUFFb0FoQWlCQ0FCS0FJVVFRRnJJQUlRMXdOeFFRTjBJZ1pxUVFScUlRTWdBcWNoQlNBQ1FpQ0lwMEYxU1NFSEEzOGdBeWdDQUNJRElBUWdCbXBHQkVCQkFBOExJQU1wQXdnaUNFSWdpS2RCZFU4RVFDQUlweUlFSUFRb0FnQkJBV28yQWdBTElBZEZCRUFnQlNBRktBSUFRUUZxTmdJQUN5QUFJQWdnQWtFQ0VMd0JCSDhnQTBFWWF3VWdBMEVFYWlFRElBRW9BaEFoQkF3QkN3c0xrQUVDQW40QmZ5QUFJQUlwQXdBaUEwRUFFSk1CSWdWRkJFQkNnSUNBZ09BQUR3c2dBQ0FEUW9DQWdJQXdFT01CSWdOQ2dJQ0FnSENESWdSQ2dJQ0FnT0FBVVFSQUlBTVBDeUFDUVFocUlRSWdCRUtBZ0lDQU1GRUVRQ0FBUW9DQWdJQXdJQUFnQWlBRkx3RUdFUG9GRHdzZ0FDQURRUUVnQVNBQlFRRk1HMEVCYXlBQ0VOb0RJUVFnQUNBREVBOGdCQXN3QVFKL0FrQWdBQ0FCUVFBUWt3RWlBd1JBSUFNb0FpQW9BZ3dvQWlBdEFBUkZEUUVnQUJCckMwRi9JUUlMSUFJTGN3RUNmeU1BUVRCcklnSWtBQUovSUFHblFZQ0FnSUI0Y2lBQlF2Ly8vLzhIV0EwQUdpQUNJQUUzQXdBZ0FrRVFhaUlEUVJoQnl2UUFJQUlRVGhwQkFDQUFJQU1RWWlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBYUlBQW9BaEFnQWFkQkFSQ25BZ3NoQUNBQ1FUQnFKQUFnQUFzTkFDQUFJQUVnQWtFVEVOd0RDejhCQVg4Z0FrSWdpS2RCZFU4RVFDQUNweUlFSUFRb0FnQkJBV28yQWdBTElBQWdBaUFERVA4Q0lRSWdBQ0FCS0FKTUlBSkJBQkNEQlNBQUlBSVFEd3NNQUNBQUlBRWdBUkEvRUhJTGdnRUJBbjhqQUVFZ2F5SUZKQUFDUUNBQlFRcEhJQUpCQ1V0eVJRUkFJQUFnQWtFQ2RFR1FwUVJxTlFJQUVEQWhBZ3dCQ3lBQUtBSUFJUVlnQlVJQU53SVlJQVZDZ0lDQWdJQ0FnSUNBZnpjQ0VDQUZJQVkyQWd3Z0JVRU1haUlHSUFHdEVEQWdBQ0FHSUFJZ0F5QUVFS0lFY2lFQ0lBWVFHd3NnQlVFZ2FpUUFJQUlMbXdVQkEzOGdBVUVRYWlFRElBRW9BaFFoQWdOQUlBSWdBMFpGQkVBZ0FrRVlheUVFSUFJb0FnUWhBaUFBSUFRUS9RSU1BUXNMSUFBb0FoQWdBU2dDZ0FJZ0FTZ0NoQUlnQVNnQ29BSVE2d1VnQVVHQUFtb1E5Z0VnQUNnQ0VDSUNRUkJxSUFFb0Fzd0NJQUlvQWdRUkFBQWdBQ2dDRUNJQ1FSQnFJQUVvQXFRQ0lBSW9BZ1FSQUFBZ0FDZ0NFQ0lDUVJCcUlBRW9BdGdDSUFJb0FnUVJBQUJCQUNFQ0EwQWdBU2dDdEFJaEF5QUNJQUVvQXJnQ1RrVUVRQ0FBSUFNZ0FrRURkR29wQXdBUUR5QUNRUUZxSVFJTUFRc0xJQUFvQWhBaUFrRVFhaUFESUFJb0FnUVJBQUFnQUNBQktBSndFQk5CQUNFQ0EwQWdBU2dDZENFRElBSWdBU2dDZkU1RkJFQWdBQ0FESUFKQkJIUnFLQUlBRUJNZ0FrRUJhaUVDREFFTEN5QUFLQUlRSWdKQkVHb2dBeUFDS0FJRUVRQUFRUUFoQWdOQUlBRW9Bb0FCSVFNZ0FpQUJLQUtJQVU1RkJFQWdBQ0FESUFKQkJIUnFLQUlBRUJNZ0FrRUJhaUVDREFFTEN5QUFLQUlRSWdKQkVHb2dBeUFDS0FJRUVRQUFRUUFoQWdOQUlBRW9BdndCSVFNZ0FpQUJLQUwwQVU1RkJFQWdBQ0FESUFKQkJIUnFLQUlNRUJNZ0FrRUJhaUVDREFFTEN5QUFLQUlRSWdKQkVHb2dBeUFDS0FJRUVRQUFRUUFoQWdOQUlBRW9Bc2dDSVFNZ0FpQUJLQUxBQWs1RkJFQWdBQ0FESUFKQkEzUnFLQUlFRUJNZ0FrRUJhaUVDREFFTEN5QUFLQUlRSWdKQkVHb2dBeUFDS0FJRUVRQUFJQUVvQXN3QklnSWdBVUhRQVdwSEJFQWdBQ2dDRUNJRFFSQnFJQUlnQXlnQ0JCRUFBQXNnQUNBQktBTHNBaEFUSUFGQjlBSnFFUFlCSUFBb0FoQWlBa0VRYWlBQktBS01BeUFDS0FJRUVRQUFJQUVvQWdRRVFDQUJLQUlZSWdJZ0FTZ0NIQ0lETmdJRUlBTWdBallDQUNBQlFnQTNBaGdMSUFBb0FoQWlBRUVRYWlBQklBQW9BZ1FSQUFBTGdnRUJBbjhnQUNBQlFSQnFFTThGQWtBZ0FTZ0NJQ0lDQkVBZ0FTZ0NQQ0lEUlEwQkEwQWdBaUFEVDBVRVFDQUFJQUlwQXdBUUl5QUNRUWhxSVFJZ0FTZ0NQQ0VEREFFTEN5QUFRUkJxSUFFb0FpQWdBQ2dDQkJFQUFBc2dBQ0FCS1FNWUVDTWdBQ0FCS1FNQUVDTVBDMEdFaEFGQnJ2d0FRWW1VQVVIQzZ3QVFBQUFMYUFFQmZnSkFBa0FnQUJBMElnTkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUU1NQVFzZ0FDQURRY0FBSUFGQkJ4QVpRUUJJRFFBZ0FDQURRZWtBSUFKQkFFZXRRb0NBZ0lBUWhFRUhFQmxCQUU0TkFRc2dBQ0FERUE5Q2dJQ0FnT0FBSVFNTElBTUxqQUVCQW44Q1FBTkFJQUZDZ0lDQWdIQlVEUUVDUUFKQUFrQUNRQUpBQWtBZ0FhY2lBaThCQmlJRFFReHJEZ1VGQVFNSEFRQUxJQU5CTUVZTkFTQURRVFJyRGdVQUJnWUdBQVlMSUFJb0FpQW9BakFQQ3lBQ0tBSWdJZ0pGRFFRZ0FpMEFFVVVOQVNBQUVMWUNRUUFQQ3lBQ0tBSWdJUUlMSUFJcEF3QWhBUXdCQ3dzZ0FpZ0NJQ0VBQ3lBQUN5SUFJQUFnQWtFQmFoQXBJZ0FFUUNBQUlBRWdBaEFmSUFKcVFRQTZBQUFMSUFBTGpRTUNBMzRFZndKQUlBRW9BZ2dpQmtIKy8vLy9CMDRFUUVFQklRY2dBa0VCY1EwQlF2Ly8vLy8vLy8vLy93QWhBeUFHUWY3Ly8vOEhSdzBCSUFFMEFnUkMvLy8vLy8vLy8vLy9BSHdoQXd3QkN5QUdRUUJNQkVBTUFRc2dCa0UvVFFSQUlBRW9BaEFpQ1NBQktBSU1JZ0pCQW5ScVFRUnJLQUlBSVFoQ0FDQUdRU0JOQkg0Z0NFRWdJQVpyZHEwRklBSkJBazhFZmlBQ1FRSjBJQWxxUVFock5RSUFCVUlBQ3lBSXJVSWdob1JCd0FBZ0JtdXRpQXNpQTMwZ0F5QUJLQUlFR3lFRERBRUxJQUpCQVhGRkJFQWdBU2dDQkVVRVFFTC8vLy8vLy8vLy8vOEFJUU5CQVNFSERBSUxRb0NBZ0lDQWdJQ0FnSDhoQTBFQklRY2dCa0hBQUVjTkFTQUJLQUlRSUFFb0Fnd2lBVUVDZEdvaUFrRUVhelVDQUVJZ2hpRUVJQUZCQWs4RWZpQUNRUWhyTlFJQUJVSUFDeUFFaEVLQWdJQ0FnSUNBZ0lCL1VpRUhEQUVMUWdBZ0FTZ0NFQ0lJSUFFb0Fnd2lBaUFDUVFWMElBWnJJZ1lRYUswZ0NDQUNJQVpCSUdvUWFLMUNJSWFFSWdOOUlBTWdBU2dDQkJzaEF3c2dBQ0FETndNQUlBY0xNd0VCZnlBQUtBSUFLQUlRSWdGQkVHb2dBQ2dDQkNBQktBSUVFUUFBSUFCQkFEWUNEQ0FBUWdBM0FnUWdBRUYvTmdJVUMwWUFJQUpCQUV3RVFDQUFRUzhRTFE4TElBQWdBa0VBRU9vQklnQkZCRUJDZ0lDQWdPQUFEd3NnQUVFUWFpQUJJQUlRSHlBQ2FrRUFPZ0FBSUFDdFFvQ0FnSUNRZjRRTGJ3SUJmd0YrQWtBQ1FBSi9JQUpGQkVBZ0FDZ0NFQ0FCUVFBUXN3VU1BUXNnQVN3QUFFRTZhMEYyVHcwQklBQW9BaEFnQVNBQ0VMTUZDeUlERFFFTFFRQWhBeUFBSUFFZ0FoQ1RBaUlFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNnQ0VDQUVweEQ4QXlFREN5QURDeHdBSUFBZ0FDZ0NFQ2dDUkNBQlFSaHNhaWdDQkVITDlnQVFqd0VMU0FFQ2Z3SkFBMEFnQVVFS1JnMEJJQUZCQW5SQjRvQUNhaThCQUNBQVNnMEJJQUZCQVhRaEFpQUJRUUZxSVFFZ0FrRUJkRUhrZ0FKcUx3RUFJQUJNRFFBTFFRRVBDMEVBQzNRQkJIOUJBaUVDQWtBZ0FDZ0NDQ0lFUWYvLy8vOEhSZzBBSUFFb0FnZ2lCVUgvLy8vL0IwWU5BQ0FBS0FJRUlnTWdBU2dDQkVjRVFDQUVRWUNBZ0lCNFJnUkFRUUFoQWlBRlFZQ0FnSUI0UmcwQ0MwRUJJQU5CQVhSckR3dEJBQ0FBSUFFUTB3RWlBR3NnQUNBREd5RUNDeUFDQzRrQkFRUitJQUFRUGlJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0FVRUFJQUZCQUVvYnJTRUdBMEFnQXlBR1VRUkFJQVFQQ3lBQ0lBT25RUU4wYWlrREFDSUZRaUNJcDBGMVR3UkFJQVduSWdFZ0FTZ0NBRUVCYWpZQ0FBc2dBQ0FFSUFNZ0JVRUFFTklCSVFFZ0EwSUJmQ0VESUFGQkFFNE5BQXNnQUNBRUVBOExRb0NBZ0lEZ0FBdFBBUUYvSUFFZ0FqWUNEQ0FCSUFBMkFnQWdBVUVBTmdJVUlBRWdBellDRUNBQlFRQTJBZ2dnQVNBQUlBSWdBeERxQVNJQU5nSUVJQUFFZjBFQUJTQUJRWDgyQWhRZ0FVRUFOZ0lNUVg4TEM3d0JBUUYvSXdCQkVHc2lCU1FBSUFVZ0F6Y0RDQUpBSUFFRVFDQUJJQUVvQWdCQkFXbzJBZ0FnQUNBQnJVS0FnSUNBY0lRZ0FrRUJJQVZCQ0dvUUx5RUNJQUFnQlNrRENCQVBRWDhoQVNBQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FDQUNFQTlCQVNFQkRBRUxJQUFnQXhBUElBUkJnSUFCY1VVRVFFRUFJUUVnQkVHQWdBSnhSUTBCSUFBb0FoQW9Bb3dCSWdSRkRRRWdCQzBBS0VFQmNVVU5BUXNnQUVIL0drRUFFQlZCZnlFQkN5QUZRUkJxSkFBZ0FRdGhBZ0YvQVg0Q1FDQUJRUUJJRFFBQ1FBSkFBa0FnQUNnQ0VDZ0NPQ0FCUVFKMGFpZ0NBQ2tDQkNJRFFqNklwMEVCYXc0REF3SUFBUXRCQVNFQ0FrQWdBMElnaUtkQi8vLy8vd054RGdJREFBRUxRUUlQQ3hBQkFBdEJBU0VDQ3lBQ0M2Y0ZBZ2wvQW40akFFRWdheUlESkFBQ1FDQUJLUU5BSWd0Q2dJQ0FnSENEUW9DQWdJQXdVUVJBUW9DQWdJRGdBQ0VNSUFCQkN4QjJJZ3RDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FEUWdBM0F4Z2dBMElBTndNUUlBTkNBRGNEQ0NBQUlBTkJDR29nQVVFQUVLOEZJUVFnQUNnQ0VDSUNRUkJxSUFNb0FnZ2dBaWdDQkJFQUFBSkFBa0FnQkFSQUlBTW9BaFFoQmd3QkN5QUxweUVISUFNb0Fod2lDRUVBSUFoQkFFb2JJUWtnQXlnQ0ZDRUdRUUFoQkFKQUEwQWdCQ0FKUndSQUFrQUNRQUpBSUFZZ0JFRU1iR29pQWlnQ0NDSUZCRUFnQXlBQk5nSUFEQUVMQWtBZ0FDQURJQU5CQkdvZ0FTQUNLQUlBRVBRRElnVU9CQUFHQmdJR0N5QURLQUlFSVFVTElBVW9BZ3hCL1FCR0JFQWdBa0VDTmdJRUlBSWdBeWdDQUNnQ0VDQUZLQUlBUVFOMGFpZ0NCRFlDQ0F3Q0N5QUNRUUUyQWdRZ0JTZ0NCQ0lLQkVBZ0FpQUtOZ0lJREFJTElBSWdBeWdDQUNnQ1NDZ0NKQ0FGS0FJQVFRSjBhaWdDQURZQ0NBd0JDeUFDUVFBMkFnUUxJQVJCQVdvaEJBd0JDd3NnQmlBSVFReEJ3UUFnQUJDK0FrRUFJUVFEUUNBRUlBbEdEUU1DUUFKQUFrQWdCaUFFUVF4c2FpSUNLQUlFUVFGckRnSUFBUUlMSUFJb0FnZ2hCU0FBSUFjZ0FpZ0NBRUVtRUhvaUFrVU5CQ0FGSUFVb0FnQkJBV28yQWdBZ0FpQUZOZ0lBREFFTElBQWdDeUFDS0FJQVFRRWdBaWdDQ0VFR0VKVURRUUJJRFFNTElBUkJBV29oQkF3QUN3QUxJQUFnQlNBQklBSW9BZ0FROHdNTElBQW9BaEFpQVVFUWFpQUdJQUVvQWdRUkFBQWdBQ0FMRUE4TUFnc2dBQ2dDRUNJRVFSQnFJQVlnQkNnQ0JCRUFBQ0FBSUF0QjF3RWdBRUgrQUJBdFFRQVFHUm9nQnlBSExRQUZRZjRCY1RvQUJTQUJJQXMzQTBBTElBdENJSWluUVhWUEJFQWdDNmNpQUNBQUtBSUFRUUZxTmdJQUN5QUxJUXdMSUFOQklHb2tBQ0FNQzRrRUFnUitBbjhDUUFKQUlBRzlJZ1JDQVlZaUExQU5BQ0FCdlNFQ0lBQzlJZ1ZDTklpblFmOFBjU0lHUWY4UFJnMEFJQUpDLy8vLy8vLy8vLy8vQUlOQ2dZQ0FnSUNBZ1BqL0FGUU5BUXNnQUNBQm9pSUFJQUNqRHdzZ0F5QUZRZ0dHSWdKYUJFQWdBRVFBQUFBQUFBQUFBS0lnQUNBQ0lBTlJHdzhMSUFSQ05JaW5RZjhQY1NFSEFuNGdCa1VFUUVFQUlRWWdCVUlNaGlJQ1FnQlpCRUFEUUNBR1FRRnJJUVlnQWtJQmhpSUNRZ0JaRFFBTEN5QUZRUUVnQm11dGhnd0JDeUFGUXYvLy8vLy8vLzhIZzBLQWdJQ0FnSUNBQ0lRTElRSUNmaUFIUlFSQVFRQWhCeUFFUWd5R0lnTkNBRmtFUUFOQUlBZEJBV3NoQnlBRFFnR0dJZ05DQUZrTkFBc0xJQVJCQVNBSGE2MkdEQUVMSUFSQy8vLy8vLy8vL3dlRFFvQ0FnSUNBZ0lBSWhBc2hCQ0FHSUFkS0JFQURRQUpBSUFJZ0JIMGlBMElBVXcwQUlBTWlBa0lBVWcwQUlBQkVBQUFBQUFBQUFBQ2lEd3NnQWtJQmhpRUNJQVpCQVdzaUJpQUhTZzBBQ3lBSElRWUxBa0FnQWlBRWZTSURRZ0JURFFBZ0F5SUNRZ0JTRFFBZ0FFUUFBQUFBQUFBQUFLSVBDd0pBSUFKQy8vLy8vLy8vL3dkV0JFQWdBaUVEREFFTEEwQWdCa0VCYXlFR0lBSkNnSUNBZ0lDQWdBUlVJUWNnQWtJQmhpSURJUUlnQncwQUN3c2dCVUtBZ0lDQWdJQ0FnSUIvZ3lBRFFvQ0FnSUNBZ0lBSWZTQUdyVUkwaG9RZ0EwRUJJQVpycllnZ0JrRUFTaHVFdnd2b0R3TUhmQWgvQW41RUFBQUFBQUFBOEQ4aEF3SkFBa0FDUUNBQnZTSVJRaUNJcHlJUFFmLy8vLzhIY1NJSklCR25JZ3h5UlEwQUlBQzlJaEpDSUlpbklRb2dFcWNpRUVVZ0NrR0FnTUQvQTBaeERRQWdDa0gvLy8vL0IzRWlDMEdBZ01EL0Iwc2dDMEdBZ01EL0IwWWdFRUVBUjNGeUlBbEJnSURBL3dkTGNrVWdERVVnQ1VHQWdNRC9CMGR5Y1VVRVFDQUFJQUdnRHdzQ1FBSkFBa0FDUUFKQUFuOUJBQ0FTUWdCWkRRQWFRUUlnQ1VILy8vK1pCRXNOQUJwQkFDQUpRWUNBd1A4RFNRMEFHaUFKUVJSMklRMGdDVUdBZ0lDS0JFa05BVUVBSUF4QnN3Z2dEV3NpRG5ZaURTQU9kQ0FNUncwQUdrRUNJQTFCQVhGckN5RU9JQXdOQWlBSlFZQ0F3UDhIUncwQklBdEJnSURBL3dOcklCQnlSUTBGSUF0QmdJREEvd05KRFFNZ0FVUUFBQUFBQUFBQUFDQVJRZ0JaR3c4TElBd05BU0FKUVpNSUlBMXJJZ3gySWcwZ0RIUWdDVWNOQUVFQ0lBMUJBWEZySVE0TElBbEJnSURBL3dOR0JFQWdFVUlBV1FSQUlBQVBDMFFBQUFBQUFBRHdQeUFBb3c4TElBOUJnSUNBZ0FSR0JFQWdBQ0FBb2c4TElBOUJnSUNBL3dOSElCSkNBRk55RFFBZ0FKOFBDeUFBbVNFQ0lCQU5BUUpBSUFwQkFFZ0VRQ0FLUVlDQWdJQjRSaUFLUVlDQXdQOTdSbklnQ2tHQWdFQkdjZzBCREFNTElBcEZJQXBCZ0lEQS93ZEdjZzBBSUFwQmdJREEvd05IRFFJTFJBQUFBQUFBQVBBL0lBS2pJQUlnRVVJQVV4c2hBeUFTUWdCWkRRSWdEaUFMUVlDQXdQOERhM0pGQkVBZ0F5QURvU0lBSUFDakR3c2dBNW9nQXlBT1FRRkdHdzhMUkFBQUFBQUFBQUFBSUFHYUlCRkNBRmtiRHdzQ1FDQVNRZ0JaRFFBQ1FBSkFJQTRPQWdBQkFnc2dBQ0FBb1NJQUlBQ2pEd3RFQUFBQUFBQUE4TDhoQXdzQ2ZDQUpRWUdBZ0k4RVR3UkFJQWxCZ1lEQW53UlBCRUFnQzBILy83Ly9BMDBFUUVRQUFBQUFBQUR3ZjBRQUFBQUFBQUFBQUNBUlFnQlRHdzhMUkFBQUFBQUFBUEIvUkFBQUFBQUFBQUFBSUE5QkFFb2JEd3NnQzBIKy83Ly9BMDBFUUNBRFJKeDFBSWc4NURkK29rU2NkUUNJUE9RM2ZxSWdBMFJaOC9qQ0gyNmxBYUpFV2ZQNHdoOXVwUUdpSUJGQ0FGTWJEd3NnQzBHQmdNRC9BMDhFUUNBRFJKeDFBSWc4NURkK29rU2NkUUNJUE9RM2ZxSWdBMFJaOC9qQ0gyNmxBYUpFV2ZQNHdoOXVwUUdpSUE5QkFFb2JEd3NnQWtRQUFBQUFBQUR3djZBaUFFUkUzMTM0QzY1VVBxSWdBQ0FBb2tRQUFBQUFBQURnUHlBQUlBQkVBQUFBQUFBQTBMK2lSRlZWVlZWVlZkVS9vS0tob2tUK2dpdGxSeFgzdjZLZ0lnSWdBaUFBUkFBQUFHQkhGZmMvb2lJQ29MMUNnSUNBZ0hDRHZ5SUFJQUtob1F3QkN5QUNSQUFBQUFBQUFFQkRvaUlBSUFJZ0MwR0FnTUFBU1NJSkd5RUNJQUM5UWlDSXB5QUxJQWtiSWd4Qi8vOC9jU0lLUVlDQXdQOERjaUVMSUF4QkZIVkJ6SGRCZ1hnZ0NSdHFJUXhCQUNFSkFrQWdDa0dQc1E1SkRRQWdDa0g2N0M1SkJFQkJBU0VKREFFTElBcEJnSUNBL3dOeUlRc2dERUVCYWlFTUN5QUpRUU4wSWdwQmdCbHFLd01BSUFLOVF2Ly8vLzhQZ3lBTHJVSWdob1MvSWdRZ0NrSHdHR29yQXdBaUJhRWlCa1FBQUFBQUFBRHdQeUFGSUFTZ295SUhvaUlDdlVLQWdJQ0FjSU8vSWdBZ0FDQUFvaUlJUkFBQUFBQUFBQWhBb0NBSElBWWdBQ0FKUVJKMElBdEJBWFpxUVlDQW9JQUNhcTFDSUlhL0lnYWlvU0FBSUFRZ0JpQUZvYUdpb2FJaUJDQUNJQUNnb2lBQ0lBS2lJZ0FnQUtJZ0FDQUFJQUFnQUNBQVJPOU9SVW9vZnNvL29rUmwyOG1UU29iTlA2Q2lSQUZCSGFsZ2RORS9vS0pFVFNhUFVWVlYxVCtnb2tUL3EyL2J0bTNiUDZDaVJBTXpNek16TStNL29LS2dJZ1dndlVLQWdJQ0FjSU8vSWdDaUlnWWdCQ0FBb2lBQ0lBVWdBRVFBQUFBQUFBQUl3S0FnQ0tHaG9xQWlBcUM5UW9DQWdJQndnNzhpQUVUMUFWc1U0QzgrdnFJZ0FpQUFJQWFob1VUOUF6cmNDY2Z1UDZLZ29DSUNJQXBCa0JscUt3TUFJZ1FnQWlBQVJBQUFBT0FKeCs0L29pSUNvS0FnRExjaUJhQzlRb0NBZ0lCd2c3OGlBQ0FGb1NBRW9TQUNvYUVMSVFJZ0FTQVJRb0NBZ0lCd2c3OGlCS0VnQUtJZ0FpQUJvcUFpQWlBQUlBU2lJZ0dnSWdDOUloR25JUWtDUUNBUlFpQ0lweUlLUVlDQXdJUUVUZ1JBSUFwQmdJREFoQVJySUFseURRTWdBa1QrZ2l0bFJ4V1hQS0FnQUNBQm9XUkZEUUVNQXdzZ0NrR0ErUC8vQjNGQmdKakRoQVJKRFFBZ0NrR0E2THo3QTJvZ0NYSU5BeUFDSUFBZ0FhRmxSUTBBREFNTFFRQWhDU0FEQW53Z0NrSC8vLy8vQjNFaUMwR0JnSUQvQTA4RWZrRUFRWUNBd0FBZ0MwRVVka0grQjJ0MklBcHFJZ3BCLy84L2NVR0FnTUFBY2tHVENDQUtRUlIyUWY4UGNTSUxhM1lpQ1dzZ0NTQVJRZ0JUR3lFSklBSWdBVUdBZ0VBZ0MwSC9CMnQxSUFweHJVSWdocitoSWdHZ3ZRVWdFUXRDZ0lDQWdIQ0R2eUlBUkFBQUFBQkRMdVkvb2lJRElBSWdBQ0FCb2FGRTd6bjYva0l1NWoraUlBQkVPV3lvREdGY0lMNmlvQ0lDb0NJQUlBQWdBQ0FBSUFDaUlnRWdBU0FCSUFFZ0FVVFFwTDV5YVRkbVBxSkU4V3ZTeFVHOXU3Nmdva1FzM2lXdmFsWVJQNkNpUkpPOXZoWnN3V2Evb0tKRVBsVlZWVlZWeFQrZ29xRWlBYUlnQVVRQUFBQUFBQUFBd0tDaklBQWdBaUFBSUFPaG9TSUFvaUFBb0tHaFJBQUFBQUFBQVBBL29DSUF2U0lSUWlDSXB5QUpRUlIwYWlJS1FmLy9QMHdFUUNBQUlBa1EyZ0VNQVFzZ0VVTC8vLy8vRDRNZ0NxMUNJSWFFdnd1aUlRTUxJQU1QQ3lBRFJKeDFBSWc4NURkK29rU2NkUUNJUE9RM2ZxSVBDeUFEUkZueitNSWZicVVCb2tSWjgvakNIMjZsQWFJTEVRQWdBQ0FCSUFJZ0F5QUVRUUlRaWdRTFF3QUNmMEVBSUFJb0FnQW9BZ0JCR25ZZ0EwWU5BQnBCZnlBQUlBRWdBaERVQVEwQUdpQUNLQUlBSWdBZ0FDZ0NBRUgvLy84ZmNTQURRUnAwY2pZQ0FFRUFDd3U4QVFFRWYwRi9JUUlDUUNBQUlBRkJBQkRVQVEwQUlBRW9BaWdpQkNBQktBSVFJZ01vQWlCcUlnVWdBeWdDSEVzRVFDQUFJQUZCRUdvZ0FTQUZFTHdGRFFFTElBRW9BaVFoQTBFQUlRSURRQ0FDSUFSR1JRUkFJQUFnQVNBQ1FZQ0FnSUI0Y2tFSEVIb2dBeWtEQURjREFDQUNRUUZxSVFJZ0EwRUlhaUVEREFFTEN5QUFLQUlRSWdCQkVHb2dBU2dDSkNBQUtBSUVFUUFBUVFBaEFpQUJRUUEyQWlnZ0FVSUFOd01nSUFFZ0FTMEFCVUgzQVhFNkFBVUxJQUlMZEFFRGZ3SkFBa0FnQUVFQmNRMEFJQUZCZ1FKeFFZRUNSaUFCUVlBSWNVRUFJQUFnQVhOQkJIRWJjZzBCSUFGQmdQUUFjVVVOQUNBQVFUQnhJZ05CRUVZZ0FVR0FNSEVpQkVFQVIzTU5BU0FBUVFKeElBRkJnZ1J4UVlJRVIzSWdBMEVRUm5JTkFDQUVSUTBCQzBFQklRSUxJQUlMUFFFQmZ5QUJJQUFvQXRRQklBRW9BaFJCSUNBQUtBTElBV3QyUVFKMGFpSUNLQUlBTmdJb0lBSWdBVFlDQUNBQUlBQW9BdEFCUVFGcU5nTFFBUXZKQVFFRGZ3SkFJQUZDZ0lDQWdIQmFCRUFnQWFjaUJ5Z0NFQ0lHUVRCcUlRZ2dCaUFHS0FJWUlBSnhRWDl6UVFKMGFpZ0NBQ0VHQWtBRFFDQUdSUTBCSUFJZ0NDQUdRUUZyUVFOMGFpSUdLQUlFUndSQUlBWW9BZ0JCLy8vL0gzRWhCZ3dCQ3dzUUFRQUxJQUFnQnlBQ0lBVkJCM0ZCTUhJUWVpSUNSUVJBUVg4UEMwRUJJUVlnQUNBQUtBSUFRUUZxTmdJQUlBSWdBRFlDQUNBQVFRTnhEUUVnQWlBRU5nSUVJQUlnQUNBRGNqWUNBQXNnQmc4TFFjdVBBVUd1L0FCQjNzZ0FRZUFiRUFBQUN5RUFJQUFnQVVFd0lBT3RRUUVRR1JvZ0FDQUJRVFlnQUNBQ0VDMUJBUkFaR2d2RkJ3TUNmZ1YvQW53akFFRVFheUlHSkFCQkJ5QUJRUWhySWdncEF3QWlCRUlnaUtjaUJTQUZRUWRyUVc1Skd5RUZBbjhDUUFKQVFRY2dBVUVRYXlJSEtRTUFJZ05DSUlpbklnRWdBVUVIYTBGdVNSc2lBVUYvUmlBRlFYNXhRUUpIY1VVZ0FVRitjVUVDUmlBRlFYOUhjbkVOQUNBQUlBWkJDR29nQXlBRUlBSkJBRUVCRUlVQ0lnRkZEUUFnQUNBREVBOGdBQ0FFRUE4Z0FVRUFTQTBCSUFjZ0Jpa0RDRGNEQUVFQURBSUxBa0FnQUNBRFFRRVFtZ0VpQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFRaEF3d0JDeUFBSUFSQkFSQ2FBU0lFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFDUUVFSElBTkNJSWluSWdFZ0FVRUhhMEZ1U1JzaUJVRjVSMEVISUFSQ0lJaW5JZ0VnQVVFSGEwRnVTUnNpQVVGNVIzSkZCRUFnQTZjZ0JLY1Fnd0loQVFKL0FrQUNRQUpBQWtBZ0FrR2pBV3NPQXdBQkFnTUxJQUZCSDNZTUF3c2dBVUVBVEF3Q0N5QUJRUUJLREFFTElBRkJBRTRMSVFFZ0FDQURFQThnQUNBRUVBOE1BUXNDUUVFQklBVjBRWWNCY1VVZ0JVRUhTM0lnQVVFSFMzSkJBVUVCSUFGMFFZY0JjUnRGRFFBQ1FBSkFJQVZCZGtZZ0FVRjVSbkVnQVVGMlJpQUZRWGxHY1hKRkRRQWdBQ2dDRUNnQ2pBRWlDUVJBSUFrdEFDaEJCSEVOQVFzQ1FDQUZRWGxHQkVBZ0FDQURFTHdDSWdOQ2dJQ0FnSENEUW9DQWdJRGdmbElOQVFzZ0FVRjVSdzBDSUFBZ0JCQzhBaUlFUW9DQWdJQndnMEtBZ0lDQTRINVJEUUlMSUFBZ0F4QVBJQUFnQkJBUFFRQWhBUXdEQ3lBQUlBTVFiQ0lEUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQkNFRERBUUxJQUFnQkJCc0lnUkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF3c0NRRUVISUFOQ0lJaW5JZ0VnQVVFSGEwRnVTUnNpQlVGMVJ3UkFRUWNnQkVJZ2lLY2lBU0FCUVFkclFXNUpHeUlCUVhWSERRRUxJQUFnQWlBRElBUWdBQ2dDRUNnQzNBSVJIQUFpQVVFQVNBMEVEQUlMSUFWQmQwY2dBVUYzUjNGRkJFQWdBQ0FDSUFNZ0JDQUFLQUlRS0FMQUFoRWNBQ0lCUVFCSURRUU1BZ3NnQlVGMlJ5QUJRWFpIY1EwQUlBQWdBaUFESUFRZ0FDZ0NFQ2dDcEFJUkhBQWlBVUVBVGcwQkRBTUxJQVJDZ0lDQWdNQ0JnUHovQUh5L0lBU250eUFCUVFkR0d5RUtJQU5DZ0lDQWdNQ0JnUHovQUh5L0lBT250eUFGUVFkR0d5RUxBa0FDUUFKQUFrQWdBa0dqQVdzT0F3QUJBZ01MSUFvZ0MyUWhBUXdEQ3lBS0lBdG1JUUVNQWdzZ0NpQUxZeUVCREFFTElBb2dDMlVoQVFzZ0J5QUJRUUJIclVLQWdJQ0FFSVEzQXdCQkFBd0NDeUFBSUFNUUR3c2dCMEtBZ0lDQU1EY0RBQ0FJUW9DQWdJQXdOd01BUVg4TElRQWdCa0VRYWlRQUlBQUxCQUJCQUF0dEFnSitBbjlCZnlFRkFrQWdBQ0FCUVFocklnWXBBd0FpQkNBQ0VPY0JJZ05DZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFRUUR5QUdJQU0zQXdBZ0FDQURRZW9BSUFOQkFCQVVJZ05DZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FCSUFNM0F3QkJBQ0VGQ3lBRkM3RUJBZ04vQVg0Z0FDZ0NFQ0VGSUFBZ0FrRURkRUVZYWhBcElnUUVRQ0FFSUFJMkFoQWdCQ0FCTmdJTUlBUWdBRFlDQ0VFQUlRQWdBa0VBSUFKQkFFb2JJUUVEUUNBQUlBRkhCRUFnQXlBQVFRTjBJZ0pxS1FNQUlnZENJSWluUVhWUEJFQWdCNmNpQmlBR0tBSUFRUUZxTmdJQUN5QUNJQVJxSUFjM0F4Z2dBRUVCYWlFQURBRUxDeUFGS0FLZ0FTSUFJQVEyQWdRZ0JDQUZRYUFCYWpZQ0JDQUVJQUEyQWdBZ0JTQUVOZ0tnQVFzTFBBRUJmd05BSUFJZ0EwWkZCRUFnQUNBQklBTkJBM1JxS1FNQUVBOGdBMEVCYWlFRERBRUxDeUFBS0FJUUlnQkJFR29nQVNBQUtBSUVFUUFBQzRVQkFRSi9Jd0JCRUdzaUJTUUFBa0FnQWtLQWdJQ0FjSU5DZ0lDQWdKQi9VZ1JBSUFKQ0lJaW5RWFZKRFFFZ0FxY2lBQ0FBS0FJQVFRRnFOZ0lBREFFTElBQWdCVUVNYWlBQ0VPVUJJZ1pGQkVCQ2dJQ0FnT0FBSVFJTUFRc2dBQ0FCSUFZZ0JTZ0NERUhTaUFFZ0F5QUVFTW9GSVFJZ0FDQUdFRlFMSUFWQkVHb2tBQ0FDQzd3QkFnTitBWDhqQUVFUWF5SUNKQUJDZ0lDQWdPQUFJUVVDUUNBQUlBRVFZQTBBSUFNcEF3QWhCZ0pBQWtBZ0F5a0RDQ0lIUWlDSXB5SURRUU5IQkVBZ0JFRUNSZzBDSUFOQkFrWU5BUXdDQ3lBRVFRSkdEUUVMSUFBZ0FTQUdRUUJCQUJBaElRVU1BUXNnQUNBQ1FReHFJQWNRaVFRaUEwVU5BQ0FDS0FJTUlRZ0NmaUFFUVFGeEJFQWdBQ0FCSUFZZ0NDQURFSkFEREFFTElBQWdBU0FHSUFnZ0F4QWhDeUVGSUFBZ0F5QUlFSnNEQ3lBQ1FSQnFKQUFnQlFzOUFnRi9BbjRnQUNBQkVNMEZJZ05DZ0lDQWdIQ0RJZ1JDZ0lDQWdEQlNCSDhnQkVLQWdJQ0E0QUJTQkVBZ0FDQURFQTlCQVE4TFFYOEZRUUFMQzA0Q0FYOEJmaU1BUVJCcklnSWtBQUorSUFGQi93Rk5CRUFnQWlBQk9nQVBJQUFnQWtFUGFrRUJFSVFEREFFTElBSWdBVHNCRENBQUlBSkJER3BCQVJEdUF3c2hBeUFDUVJCcUpBQWdBd3ROQVFGL0l3QkJFR3NpQXlRQUlBTWdBVGtEQ0NBRElBSTJBZ0FnQUVHQUFVR1Yzd0FnQXhCT0lnQkJnQUZPQkVCQm9PQUFRYTc4QUVHRDJRQkJpWXdCRUFBQUN5QURRUkJxSkFBZ0FBdVlBZ0VDZndKL0lBRkIvd0JOQkVBZ0FDQUJPZ0FBSUFCQkFXb01BUXNDUUNBQlFmOFBUUVJBSUFBZ0FVRUdka0hBQVhJNkFBQWdBQ0VDREFFTEFuOGdBVUgvL3dOTkJFQWdBQ0FCUVF4MlFlQUJjam9BQUNBQVFRRnFEQUVMQWtBZ0FVSC8vLzhBVFFSQUlBQWdBVUVTZGtId0FYSTZBQUFnQUNFQ0RBRUxBbjhnQVVILy8vOGZUUVJBSUFGQkdIWkJlSEloQXlBQVFRRnFEQUVMSUFBZ0FVRVlka0UvY1VHQUFYSTZBQUVnQVVFZWRrRjhjaUVESUFCQkFtb0xJUUlnQUNBRE9nQUFJQUlnQVVFU2RrRS9jVUdBQVhJNkFBQUxJQUlnQVVFTWRrRS9jVUdBQVhJNkFBRWdBa0VDYWdzaUFpQUJRUVoyUVQ5eFFZQUJjam9BQUFzZ0FpQUJRVDl4UVlBQmNqb0FBU0FDUVFKcUN5QUFhd3VJQWdJRmZ3RitJQUVvQWd3aEFnSkFBa0FDUUNBQktRSUVJZ2RDZ0lDQWdJQ0FnSUJBV2dSQUlBQW9BamdoQkF3QkN3SkFJQUVnQUNnQ09DSUVJQUFvQWpRZ0IwSWdpS2NnQUNnQ0pFRUJhM0ZCQW5ScUlnTW9BZ0FpQlVFQ2RHb29BZ0FpQmtZRVFDQURJQUkyQWdBTUFRc0RRQ0FHSVFNZ0JVVU5BeUFFSUFNb0Fnd2lCVUVDZEdvb0FnQWlCaUFCUncwQUN5QURJQUkyQWd3TElBVWhBZ3NnQkNBQ1FRSjBhaUFBS0FJOFFRRjBRUUZ5TmdJQUlBQWdBallDUENBQVFSQnFJQUVnQUNnQ0JCRUFBQ0FBSUFBb0FpZ2lBRUVCYXpZQ0tDQUFRUUJNRFFFUEMwR1prQUZCcnZ3QVFkZ1dRY3d2RUFBQUMwR1NqZ0ZCcnZ3QVFld1dRY3d2RUFBQUN5a0JBbjhDUUNBQVFvQ0FnSUJ3VkEwQUlBQ25JZ0l2QVFZUTdnRkZEUUFnQWlnQ0lDRUJDeUFCQzRvREFRTi9JQUFnQUNnQ0FDSUJRUUZySWdJMkFnQUNRQ0FCUVFGS0RRQWdBa1VFUUNBQUtBSVFJUUpCQUNFQklBQkJBQkNQQkNBQUlBQXBBOEFCRUE4Z0FDQUFLUVBJQVJBUElBQWdBQ2tEc0FFUUR5QUFJQUFwQTdnQkVBOGdBQ0FBS1FPb0FSQVBBMEFnQVVFSVJnUkFRUUFoQVFOQUlBQW9BaWdoQXlBQklBSW9Ba0JPUlFSQUlBQWdBeUFCUVFOMGFpa0RBQkFQSUFGQkFXb2hBUXdCQ3dzZ0FrRVFhaUFESUFJb0FnUVJBQUFnQUNBQUtRT1lBUkFQSUFBZ0FDa0RvQUVRRHlBQUlBQXBBMUFRRHlBQUlBQXBBMEFRRHlBQUlBQXBBMGdRRHlBQUlBQXBBemdRRHlBQUlBQXBBekFRRHlBQUtBSWtJZ0VFUUNBQUtBSVFJQUVRa1FJTElBQW9BaFFpQVNBQUtBSVlJZ0kyQWdRZ0FpQUJOZ0lBSUFCQ0FEY0NGQ0FBS0FJSUlnRWdBQ2dDRENJQ05nSUVJQUlnQVRZQ0FDQUFRZ0EzQWdnZ0FDZ0NFQ0lCUVJCcUlBQWdBU2dDQkJFQUFBd0RCU0FBSUFBZ0FVRURkR29wQTFnUUR5QUJRUUZxSVFFTUFRc0FDd0FMUWZPT0FVR3UvQUJCNkJGQnJTVVFBQUFMQy9ZQkFRTi9Ba0FnQUVVRVFFR2d5UVFvQWdBRVFFR2d5UVFvQWdBUXBRTWhBUXRCaU1nRUtBSUFCRUJCaU1nRUtBSUFFS1VESUFGeUlRRUxRYVRVQkNnQ0FDSUFSUTBCQTBBZ0FDZ0NUQm9nQUNnQ0ZDQUFLQUljUndSQUlBQVFwUU1nQVhJaEFRc2dBQ2dDT0NJQURRQUxEQUVMSUFBb0FreEJBRTRoQWdKQUFrQWdBQ2dDRkNBQUtBSWNSZzBBSUFCQkFFRUFJQUFvQWlRUkFRQWFJQUFvQWhRTkFFRi9JUUVnQWcwQkRBSUxJQUFvQWdRaUFTQUFLQUlJSWdOSEJFQWdBQ0FCSUFOcnJFRUJJQUFvQWlnUkVBQWFDMEVBSVFFZ0FFRUFOZ0ljSUFCQ0FEY0RFQ0FBUWdBM0FnUWdBa1VOQVFzTElBRUw3d0VCQW44Q2Z3SkFJQUZCL3dGeElnTUVRQ0FBUVFOeEJFQURRQ0FBTFFBQUlnSkZJQUlnQVVIL0FYRkdjZzBESUFCQkFXb2lBRUVEY1EwQUN3c0NRQ0FBS0FJQUlnSkJmM01nQWtHQmdvUUlhM0ZCZ0lHQ2hIaHhEUUFnQTBHQmdvUUliQ0VEQTBBZ0FpQURjeUlDUVg5eklBSkJnWUtFQ0d0eFFZQ0Jnb1I0Y1EwQklBQW9BZ1FoQWlBQVFRUnFJUUFnQWtHQmdvUUlheUFDUVg5emNVR0FnWUtFZUhGRkRRQUxDd05BSUFBaUFpMEFBQ0lEQkVBZ0FrRUJhaUVBSUFNZ0FVSC9BWEZIRFFFTEN5QUNEQUlMSUFBUVB5QUFhZ3dCQ3lBQUN5SUFRUUFnQUMwQUFDQUJRZjhCY1VZYkM5UURBd0ovQkh3QmZpQUF2U0lIUWlDSXB5RUJBa0FDZkFKOEFrQWdBVUg1aE9yK0Ewc2dCMElBV1hGRkJFQWdBVUdBZ01EL2UwOEVRRVFBQUFBQUFBRHcveUFBUkFBQUFBQUFBUEMvWVEwRUdpQUFJQUNoUkFBQUFBQUFBQUFBb3c4TElBRkJBWFJCZ0lDQXlnZEpEUVFnQVVIRi9jcitlMDhOQVVRQUFBQUFBQUFBQUF3Q0N5QUJRZi8vdi84SFN3MERDeUFBUkFBQUFBQUFBUEEvb0NJRHZTSUhRaUNJcDBIaXZpVnFJZ0ZCRkhaQi93ZHJJUUlnQUNBRG9VUUFBQUFBQUFEd1A2QWdBQ0FEUkFBQUFBQUFBUEMvb0tFZ0FVSC8vNytBQkVzYklBT2pSQUFBQUFBQUFBQUFJQUZCLy8rL21nUk5HeUVGSUFkQy8vLy8vdytESUFGQi8vOC9jVUdld1pyL0EycXRRaUNHaEw5RUFBQUFBQUFBOEwrZ0lRQWdBcmNMSWdORUFBRGcva0l1NWoraUlBQWdBQ0FBUkFBQUFBQUFBQUJBb0tNaUJDQUFJQUJFQUFBQUFBQUE0RCtpb2lJR0lBUWdCS0lpQkNBRW9pSUFJQUFnQUVTZnhualFDWnJEUDZKRXIzaU9IY1Z4ekQrZ29rUUUrcGVabVpuWlA2Q2lJQVFnQUNBQUlBQkVSRkkrM3hMeHdqK2lSTjREeTVaa1JzYy9vS0pFV1pNaWxDUkowaitnb2tTVFZWVlZWVlhsUDZDaW9LQ2lJQU5FZGp4NU5lODU2ajJpSUFXZ29DQUdvYUNnQ3c4TElBQUxPUUVDZnlBQlFRQWdBVUVBU2hzaEFRTkFJQUVnQWtZRVFFRUFEd3NnQWtFQ2RDRURJQUpCQVdvaEFpQUFJQU5xS0FJQVJRMEFDMEVCQ3o4QkFuOERRQ0FCUlNBQ0lBTk5ja1VFUUNBQUlBTkJBblJxSWdRZ0FTQUVLQUlBSWdGcUlnUTJBZ0FnQVNBRVN5RUJJQU5CQVdvaEF3d0JDd3NnQVF1Q0J3RU1mMEVEUVlDQWdJQUNRUUZCSENBQ1FRVjJRVDl4SWdWcmRDQUZRVDlHR3lJT2F5RVBBa0FDUUFKQUFuOGdBa0VRY1FSQVFmLy8vLzhESUFGQi8vLy8vd05HRFFFYUlBQW9BZ2dnQVdvTUFRc2dBU0FBS0FJSUlnVWdEMDROQUJvZ0FTQUNRUWh4UlEwQUdpQUJRZi8vLy84RFJnMEJJQTVCQTJzZ0FXb2dCV29MSVFZZ0EwRUZkQ0VMQWtBQ1FDQUNRUWR4SWd4QkJrWUVRQ0FBS0FJUUlnY2dBeUFMSUFaQmYzTnFFSmtDSVFVTUFRc0NmeUFMUVg4Z0JpQUdRUUJJRzJ0QkFtc2lDRUVBU0FSQUlBQW9BaEFoQjBFQURBRUxRUUVoQ1NBQUtBSVFJZ2NnQ0VFRmRpSUZRUUowYWlnQ0FFRi9RWDRnQ0hSQmYzTWdDRUVmY1VFZlJodHhSUVJBQTBBZ0JVRUFTaUVKUVFBZ0JVRUFUQTBDR2lBSElBVkJBV3NpQlVFQ2RHb29BZ0JGRFFBTEMwRUJDeUFISUFNZ0N5QUdRWDl6YWhDWkFpSUljaUVLUVFBaEJRSkFBa0FDUUFKQUFrQUNRQ0FNRGdjQUJRUUVBZ0VDQXdzZ0NTQUlJZ1ZGY2cwRUlBY2dBeUFMSUFackVKa0NJUVVNQkF0QkFTRUZJQW9OQkNBR1FRQktEUWNNQ0FzZ0NDRUZJQW9OQXd3RUN4QUJBQXNnQ2tFQUlBQW9BZ1FnREVFQ1JrWWJJUVVMSUFwRkRRRUxJQVJCRUhJaEJBc2dCa0VBVEFSQUlBVkZEUU1nQUVFQkVFRWFJQUFvQWhCQmdJQ0FnSGcyQWdBZ0FDQUFLQUlJSUFaclFRRnFOZ0lJSUFSQkdISVBDeUFGUlEwQklBc2dCbXNpQlVFRmRTSUlJQU1nQXlBSVNSc2hERUVCSVFwQkFTQUZkQ0VKSUFnaEJRTkFJQVVnREVZRVFDQURJUVVEUUNBRlFRRnJJZ1VnQ0VoRkJFQWdCeUFGUVFKMGFpSUpJQXBCSDNRZ0NTZ0NBQ0lLUVFGMmNqWUNBQXdCQ3dzZ0FDQUFLQUlJUVFGcU5nSUlEQU1MSUFjZ0JVRUNkR29pRFNBTktBSUFJZzBnQ1dvaUVEWUNBRUVCSVFrZ0JVRUJhaUVGSUEwZ0VFc05BQXNNQVF0QjhJVUJRZFQ4QUVINUEwRzE4Z0FRQUFBTElBOGdBQ2dDQ0NJRlNnUkFJQUpCQ0hGRkRRRWdCRUVCZGtFSWNTQUVjaUVFQ3lBRklBNUtCRUFnQUNBQUtBSUVJQUVnQWhDckJBOExRUUFoQlFKQUlBc2dCbXNpQVVFQVNBMEFJQUZCQlhVaEJTQUJRUjl4SWdGRkRRQWdCeUFGUVFKMGFpSUNJQUlvQWdCQmYwRWdJQUZyZEVGL2N5QUJkSEUyQWdBTEEwQWdCU0lCUVFGcUlRVWdCeUFCUVFKMGFpSUNLQUlBUlEwQUN5QUJRUUJLQkVBZ0J5QUNJQU1nQVdzaUEwRUNkQkNjQVFzZ0FDQURFRUVhSUFRUEN5QUFJQUFvQWdRUWlRRWdCRUVZY2dzckFDQUFRWUFCVHdSL0lBQkJ6d0ZOQkVBZ0FFR0FCV29QQ3lBQVFRRjBRZjdHQTJvdkFRQUZJQUFMQzRzQ0FRTi9Jd0JCRUdzaUJDUUFBa0FnQkVFTWFpQUFJQUlnQXhDa0JpSUNRUUJJRFFBZ0FTQUNhaUVESUFRb0Fnd2hBUU5BSUFOQkFXb2hBZ0pBSUFNdEFBQWlCVUUvVFFSQUlBVkJBM1lnQVdwQkFXb2lBU0FBU3cwRElBUWdCVUVIY1NBQmFrRUJhaUlCTmdJTUlBWkJBWE1oQmd3QkN5QUZ3RUVBU0FSQUlBUWdBU0FGYWtIL0FHc2lBVFlDREF3QkN5QUNMUUFBSVFJZ0JVSGZBRTBFUUNBRUlBVkJDSFFnQW5JZ0FXcEIvLzhBYXlJQk5nSU1JQU5CQW1vaEFnd0JDeUFFSUFNdEFBSWdCVUVRZENBQ1FRaDBjbklnQVdwQi8vLy9BbXNpQVRZQ0RDQURRUU5xSVFJTElBQWdBVWtOQVNBR1FRRnpJUVlnQWlFRERBQUxBQXNnQkVFUWFpUUFJQVlMdlFJQkIzOENRQ0FCUlEwQUEwQWdBa0VEUmdSQUlBRkJBWEVpQlVVZ0FVRUdjVVZ5SVFjRFFDQUVRZWtDUmcwREFrQUNRQ0FESUFSQkFuUkJrSUlDYWlnQ0FDSUNRUVIyUVE5eElnWjJRUUZ4UlEwQUlBSkJEM1loQVNBQ1FRaDJRZjhBY1NFSUFrQUNRQUpBSUFaQkJHc09BZ0FCQWdzZ0IwVU5BU0FCSUFWcUlRWkJBQ0VDQTBBZ0FpQUlUdzBESUFJZ0Jtb2hBU0FDUVFKcUlRSWdBQ0FCSUFGQkFXb1Fma1VOQUFzTUF3c2dCMFVOQUNBQlFRRnFJUUlnQlVVRVFDQUFJQUVnQWhCK0RRTUxJQUFnQWlBQlFRSnFJZ0lRZmtVRVFDQUZSUTBDSUFBZ0FpQUJRUU5xRUg1RkRRSUxRWDhQQ3lBQUlBRWdBU0FJYWhCK0RRRUxJQVJCQVdvaEJBd0JDd3RCZnc4RklBRWdBblpCQVhFRVFDQUNRUUowUWJEK0Eyb29BZ0FnQTNJaEF3c2dBa0VCYWlFQ0RBRUxBQXNBQzBFQUM3QUNBZ04vQVg0akFFRVFheUlGSkFBQ1FDQUFJQUZCQWhCbElnZENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFBSkFBa0FnQWtFQlJ3MEFJQU1wQXdBaUFVSWdpS2NpQkVFQUlBUkJDMnBCRWtrYkRRQWdBQ0FGUVF4cUlBRkJBUkRDQWcwQklBQWdCMEV3QW40Z0JTZ0NEQ0lDUVFCT0JFQWdBcTBNQVF0Q2dJQ0FnTUIrSUFLNHZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCRlFRQklEUUVNQWd0QkFDRUVJQUpCQUNBQ1FRQktHeUVDQTBBZ0FpQUVSZzBDSUFNZ0JFRURkR29wQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlHSUFZb0FnQkJBV28yQWdBTElBQWdCeUFFSUFFUXBRRWhCaUFFUVFGcUlRUWdCa0VBVGcwQUN3c2dBQ0FIRUE5Q2dJQ0FnT0FBSVFjTElBVkJFR29rQUNBSEN4NEFJQUJCTUd0QkNra2dBRUZmY1VIQkFHdEJHa2x5SUFCQjN3QkdjZ3RNQVFKL0l3QkJFR3NpQXlRQUFuOGdBaUFCS0FJQUlnUXRBQUJIQkVBZ0F5QUNOZ0lBSUFCQm9KZ0JJQU1RT2tGL0RBRUxJQUVnQkVFQmFqWUNBRUVBQ3lFQklBTkJFR29rQUNBQkM2d0JBd0Y4QVg0QmZ5QUF2U0lDUWpTSXAwSC9EM0VpQTBHeUNFMEVmQ0FEUWYwSFRRUkFJQUJFQUFBQUFBQUFBQUNpRHdzQ2ZDQUFJQUNhSUFKQ0FGa2JJZ0JFQUFBQUFBQUFNRU9nUkFBQUFBQUFBREREb0NBQW9TSUJSQUFBQUFBQUFPQS9aQVJBSUFBZ0FhQkVBQUFBQUFBQThMK2dEQUVMSUFBZ0FhQWlBQ0FCUkFBQUFBQUFBT0MvWlVVTkFCb2dBRVFBQUFBQUFBRHdQNkFMSWdBZ0FKb2dBa0lBV1JzRklBQUxDNUFGQVFkL0FrQUNRQ0FCUWY4QVRRUkFJQUpGRFFFZ0FVRWdhaUFCSUFGQndRQnJRUnBKR3lFQkRBSUxJQUpCQUVjaENFSG9BaUVGQTBBZ0F5QUZTZzBDSUFFZ0F5QUZha0VCZGlJR1FRSjBRWkNDQW1vb0FnQWlCMEVQZGlJRVNRUkFJQVpCQVdzaEJRd0JDeUFCSUFkQkNIWkIvd0J4SUFScVR3UkFJQVpCQVdvaEF3d0JDd3NnQjBFSWRFR0FIbkVpQ1NBR1FjQ05BbW90QUFBaUJYSWhBd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FIUVFSMklnZEJEM0VpQmc0TkFBQUFBQUVDQXdRRkJnWUhCd2dMSUFKQkFrY2dCa0VDU1hJZ0FpQUhRUUZ4UjNFTkNTQUJJQVJySUFOQkFuUkJrSUlDYWlnQ0FFRVBkbW9oQVF3SkN5QUJJQVJySWdOQkFYRWdBa0VBUjBZTkNDQURRUUZ6SUFScUlRRU1DQXNnQVNBRWF5SUVRUUZHQkVCQkFVRi9JQUliSUFGcUlRRU1DQXNnQkNBQ1JVRUJkRWNOQjBFQ1FYNGdBaHNnQVdvaEFRd0hDeUFCSUFScklRRWdBa1VFUUNBQVFaa0hOZ0lFSUFBZ0FTQURRUVYyUWY0QWNVR3drQUpxTHdFQWFqWUNBRUVDRHdzZ0FTQUZRVDl4UVFGMFFiQ1FBbW92QVFCcUlRRU1CZ3NnQWtFQlJnMEZJQU1nQWtFQ1JrRUZkR29oQVF3RkN5QUNRUUZHRFFRZ0EwRUJkRUd3a0FKcUx3RUFJQUpCQWtacUlRRU1CQXNnQmtFSmF5QUlSdzBESUFOQkFYUkJzSkFDYWk4QkFDRUJEQU1MSUFaQkMyc2dBa2NOQWlBQUlBVkJQM0ZCQVhSQnNKQUNhaThCQURZQ0JDQUFJQU5CQlhaQi9nQnhRYkNRQW1vdkFRQWdBU0FFYTJvMkFnQkJBZzhMSUFJTkFTQUFJQWxCQjNaQnNKQUNhaThCQURZQ0FDQUFJQVZCRDNGQkFYUkJzSkFDYWk4QkFEWUNDQ0FBSUFWQkEzWkJIbkZCc0pBQ2FpOEJBRFlDQkVFRER3c2dBVUVnYXlBQklBRkI0UUJyUVJwSkd5RUJDeUFBSUFFMkFnQkJBUXVnQVFFR2Z5QUVRUUFnQkVFQVNoc2hDU0FCUVJCcUlRY2dBRUVRYWlFSUlBQWhDa0VBSVFRQ1FBTkFJQVFnQ1VZTkFTQUNJQVJxSVFBZ0F5QUVhaUVGSUFSQkFXb2hCQUovSUFvdEFBZEJnQUZ4QkVBZ0NDQUFRUUYwYWk4QkFBd0JDeUFBSUFocUxRQUFDeUlBQW44Z0FTMEFCMEdBQVhFRVFDQUhJQVZCQVhScUx3RUFEQUVMSUFVZ0Iyb3RBQUFMSWdWR0RRQUxJQUFnQldzaEJnc2dCZ3RzQVFGL0FrQUNRQ0FCUWlDSXB5SUNRWDlIQkVBZ0FrRjRSdzBCREFJTElBR25JZ0l2QVFaQkIwY05BQ0FDS1FNZ0lnRkNnSUNBZ0hDRFFvQ0FnSUNBZjFJTkFBd0JDeUFBUWZiU0FFRUFFQlZDZ0lDQWdPQUFEd3NnQWFjaUFDQUFLQUlBUVFGcU5nSUFJQUVMQ1FBZ0FDQUJFT3dEQzl3QkFRTi9Jd0JCRUdzaUJDUUFBa0FDUUNBQlFvQ0FnSUJ3VkEwQUlBR25JZ0l2QVFaQk1FWUVRQUpBSUFBZ0JFRUlhaUFCUWVJQUVJRUJJZ05GRFFBZ0JDa0RDQ0lCUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FBSUFNcEF3QVF0Z01oQWd3RUN5QUFJQUVnQXlrRENFRUJJQU1RTHlJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUJFQ1lpQWtVTkFpQUFJQU1wQXdBUW1RRWlBMEVBU0EwQUlBTkZEUU1nQUVHVE4wRUFFQlVMUVg4aEFnd0NDeUFDSUFJdEFBVkIvZ0Z4T2dBRlFRRWhBZ3dCQzBFQUlRSUxJQVJCRUdva0FDQUNDN0FFQXdWK0EzOEJmQ01BUVJCcklnc2tBRUYvSVFvQ1FDQUFJQXRCQ0dvZ0FSQ2JBZzBBQW53Z0N5c0RDQ0lOdlVMLy8vLy8vLy8vLy84QWcwS0JnSUNBZ0lDQStQOEFXZ1JBSUFRRVFFSUFJUUZFQUFBQUFBQUFBQUFNQWd0QkFDRUtEQUlMQW40Z0RabEVBQUFBQUFBQTRFTmpCRUFnRGJBTUFRdENnSUNBZ0lDQWdJQ0Fmd3NoQVVRQUFBQUFBQUFBQUNBRFJRMEFHa0VBSUFFUXVBTnJJZ0NzUXVEVUEzNGdBWHdoQVNBQXR3c2hEU0FCSUFGQ2dMaVpLWUVpQVVJL2gwS0F1SmtwZ3lBQmZDSUZmVUtBdUprcGZ5SUlRcERPQUg0aUFTQUJRc24yM2dHQklnRjlJQUZDUDRkQ3Q0bWhmb044UXNuMjNnRi9RcklQZkNFQklBV25JZ3hCNE5RRGJTRUFJQWhDQkh4Q0I0RWhDUU5BQWtBZ0NDQUJFTXdFZlNJSFFnQlRCRUJDZnlFR0RBRUxRZ0VoQmlBSElBRVF5d1FpQlZvTkFDQUZRdTBDZlNFSUlBeEJnTjNiQVcwaENpQUF3VUU4YnlFRUlBeEI2QWR0SWdCQlBHOGhBeUFKUWorSFFnZURJQWw4SVFrZ0FFR1llR3dnREdvaEFFSUFJUVlEUUVJTElRVUNRQ0FHUWd0U0JFQWdCeUFHcDBFQ2RFR1EwZ0ZxTkFJQUlBaENBQ0FHUWdGUkczd2lCVmtOQVNBR0lRVUxJQUlnRFRrRFFDQUNJQW01T1FNNElBSWdBTGM1QXpBZ0FpQUR0emtES0NBQ0lBUzNPUU1nSUFJZ0NyYzVBeGdnQWlBRnVUa0RDQ0FDSUFHNU9RTUFJQUlnQjBJQmZMazVBeEJCQVNFS0RBUUxJQVpDQVh3aEJpQUhJQVY5SVFjTUFBc0FDeUFCSUFaOElRRU1BQXNBQ3lBTFFSQnFKQUFnQ2d0L0FRSi9Jd0JCUUdvaUFTUUFJQUVnQUVMb0IzODNBemdDUUVINDNRUXRBQUJCQVhFTkFFSDQzUVF0QUFCQkFYRU5BRUg4M1FSQmdONEVRWVRlQkJBS1FmamRCRUVCT2dBQUN5QUJRVGhxSUFGQkRHb1FDeUFCUVlqZUJFR0UzZ1FnQVNnQ0xCc29BZ0EyQWpRZ0FTZ0NNQ0VDSUFGQlFHc2tBQ0FDUVVSdEN4RUFJQUJCa0prQ1FiQ2hBa0VoRUt3REM5b0JBUU4vQWtBQ1FDQUJRYUovUmdSQVFYOGhBeUFBUVFnZ0FoQ2VBa1VOQVF3Q0MwRi9JUU1nQUVHaWZ5QUNFTG9ERFFFTFFRQWhBeUFBS0FJUUlBRkhEUUJCNlFCQjZnQWdBVUdpZjBZYklRVWdBa0Y3Y1NFQ0lBQkJRR3NvQWdBUU1pRUVBMEJCZnlFRElBQVFFZzBCSUFCQkVSQVFJQUFnQlNBRUVCd2FJQUJCRGhBUUFrQWdBVUdpZjBZRVFDQUFRUWdnQWhDZUFrVU5BUXdEQ3lBQVFhSi9JQUlRdWdNTkFnc2dBQ2dDRUNJRElBRkdEUUFMSUFOQnFIOUdCRUFnQUVIWEdVRUFFQlpCZnc4TElBQWdCQkFlUVFBaEF3c2dBd3UxSXdJS2Z3RitJd0JCSUdzaUJTUUFJQUZCQW5FaUJrRUJkaUVLUVg0aEJBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FDZ0NFQ0lEUVlBQmFnNEhBZ01QRFFFQkJRQUxBa0FnQTBIVEFHb09EQWtMREFFQkFRRUtBUUVCRWdBTEFrQWdBMEU1YWc0S0J3RUJDQUVCQVFFUUVRQUxJQU5CS0VZTkJTQURRUzlHRFFNZ0EwSGJBRVlnQTBIN0FFWnlEUTBMSUFBb0FqZ2hBU0FGSUFBb0FoZ2lBellDQkNBRklBRWdBMnMyQWdBZ0FFR09sUUVnQlJBV0RCWUxBa0FDUUFKQUlBQXBBeUFpREVJZ2lLY2lBVUYzUndSQUlBRU5BU0FBUVFFUUVDQUFRVUJyS0FJQUlBeW5FRGtNQXdzZ0FDQU1RUUFRdEFGQkFFNE5BUXdZQ3lBQUlBeEJBQkMwQVVFQVNBMFhEQUVMSUFBb0FpZ2hBU0FBUVFFUUVDQUFRVUJyS0FJQUlBRVFPU0FBUWJFQkVCQUxRWDhoQWlBQUVCSU5GZ3dUQzBGL0lRSWdBQ0FBS1FNZ1FRRVF0QUVORlNBQUVCSkZEUklNRlF0QmZ5RUVDeUFBSUFBb0FqZ2dCR28yQWpnZ0FDZ0NBQ2dDL0FGRkJFQWdBRUdtOWdCQkFCQVdEQk1MUVg4aEFpQUFFTmdFRFJOQkFDRUJJQUFnQUNrRElFRUFFTFFCR2lBQUtBSUFJZ01nQUNrRElDQUFLUU1vSUFNb0F2d0JFUmdBSWd4Q2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUtBSkFJZ01FUUNBREtBSm9RUUJIUVFGMElRRUxJQUFvQWdBaUF5QURLQUlRS1FPQUFTQUFLQUlNSUFBb0FoUWdBUkRLQWd3VUN5QUFJQXhCQUJDMEFTRUJJQUFvQWdBZ0RCQVBJQUVORXlBQVFUTVFFQ0FBRUJKRkRSQU1Fd3NDUUNBQlFRUnhSUTBBUVFBaEJDQUFRUUJCQVJDZUFVR21mMGNOQUVGL0lRSWdBRUVEUVFBZ0FDZ0NHQ0FBS0FJVUVNUUJSUTBSREJNTFFYOGhBaUFBRVBJQlJRMFBEQklMUVg4aEFrRUFJUVFnQUVFQ1FRQWdBQ2dDR0NBQUtBSVVFTVFCUlEwUERCRUxRWDhoQWtFQUlRUWdBRUVCUVFBUTdRSkZEUTRNRUF0QmZ5RUNJQUFRRWcwUElBQkJCeEFRREF3TFFYOGhBaUFBRUJJTkRpQUFRYmdCRUJBZ0FFRUlFQnBCQUNFRUlBQkJRR3NvQWdCQkFCQVhEQXdMUVg4aEFpQUFFQklORFNBQVFRa1FFQXdLQzBGL0lRSWdBQkFTRFF3Z0FFRUtFQkFNQ1FzZ0FDZ0NLQVJBSUFBUTRnRU1Dd3NDUUNBQlFRUnhJZ2RGRFFBZ0FDZ0NPRUVCRUlNQlFhWi9SdzBBUVg4aEFrRUFJUVFnQUVFRFFRQWdBQ2dDR0NBQUtBSVVFTVFCUlEwS0RBd0xBa0FnQUVHRkFSQktSUTBBSUFBb0FqaEJBUkNEQVVFS1JnMEFJQUFvQWhRaEFTQUFLQUlZSVFaQmZ5RUNJQUFRRWcwTUlBQW9BaEFpQTBGSFJnUkFJQUJCQWtFQ0lBWWdBUkRFQVVVTkNnd05DMEdGQVNFRUlBZEZEUWdDUUNBRFFTaEdCSDhnQUVFQVFRRVFuZ0ZCcG45R0RRRWdBQ2dDRUFVZ0F3dEJnMzlIRFFrZ0FDZ0NLQTBKSUFBb0FqaEJBUkNEQVVHbWYwY05DUXNnQUVFRFFRSWdCaUFCRU1RQlJRMEpEQXdMSUFBb0FpQWlCRUhOQUVjRVFDQUFLQUlBSUFRUUdCb01Cd3NnQUNnQ1FDZ0NYQTBHSUFCQndzRUFRUUFRRmd3S0N5QUFJQVZCR0dwQkFCQ2VBVUU5UmdSQUlBQkJBRUVBUVFBZ0JTZ0NHRUVDY1VFQkVNSUJRUUJJRFFvTUNBc2dBQ2dDRUVIN0FFWUVRRUVBSVFFZ0JVRUFOZ0ljSUFBUUVnMEZJQUJCQ3hBUUlBQkJRR3NoQWtFQUlRUUNRQU5BSUFBb0FoQWlBVUg5QUVZTkFRSkFBa0FnQVVHbmYwWUVRQ0FBRUJJTkR5QUFFRllORHlBQVFRY1FFQ0FBUWRNQUVCQWdBaWdDQUVFR0VHUWdBRUVPRUJBZ0FFRU9FQkFNQVFzZ0FDZ0NGQ0VISUFBb0FoZ2hDQ0FBSUFWQkhHcEJBVUVCUVFBUXhBTWlCa0VBU0EwQkFrQUNRQ0FHUVFGR0JFQWdBRUc0QVJBUUlBQWdCU2dDSENJQkVCb2dBaWdDQUNJRElBTXZBYndCRUJjTUFRc2dBQ2dDRUVFb1JnUkFJQUFDZnlBR1FYNXhJZ2xCQWtZRVFFRUFJUU1nQmtFQ2Fnd0JDeUFHUVFOclFRQWdCa0VFYTBFRFNSc2hBMEVHQ3lBRElBZ2dCeERFQVEwRUFrQWdCU2dDSENJQlJRUkFJQUJCMVFBUUVBd0JDeUFBUWRRQUVCQWdBQ0FCRUJvTElBSW9BZ0JCQkNBR1FRRnJRUVJ5SUFsQkFrY2JRZjhCY1JCa0RBSUxJQUJCT2hBc0RRTWdBQkJXRFFNQ1FDQUZLQUljSWdGQnhBQkhCRUFnQVEwQklBQVF3Z01nQUVIUkFCQVFJQUJCRGhBUVFRQWhBUXdEQ3lBRUJFQWdBRUdwNWdCQkFCQVdRY1FBSVFFTURRc2dBRUhQQUJBUVFRRWhCRUhFQUNFQkRBSUxJQUFnQVJDaEFRc2dBRUhNQUJBUUlBQWdBUkFhQ3lBQUtBSUFJQUVRRXdzZ0JVRUFOZ0ljSUFBb0FoQkJMRWNOQWlBQUVCSkZEUUVMQ3lBRktBSWNJUUVNQmd0QkFDRUJJQUJCL1FBUUxFVU5DQXdGQ3lBQUVCSU5DVUVBSVFFQ1FBTkFJQUFvQWhBaEFnSkFBMEFnQWtIZEFFWWdBVUVmUzNJZ0FrR25mMFp5SUFKQkxFWnlEUUVnQUJCV0RRMGdBVUVCYWlFQklBQW9BaEFpQWtIZEFFWU5BQXNnQWtFc1J3MENJQUFRRWcwTURBRUxDeUFBUVNZUUVDQUFRVUJySWdNb0FnQWdBVUgvL3dOeEVCZEJBQ0VFQWtBQ1FBTkFJQUFvQWhBaEFnSkFBMEFnQVVILy8vLy9CMFlOQVNBQ1FhZC9SZzBFSUFKQjNRQkdEUU1DUUNBQ1FTeEdCRUJCQVNFRUlBRkJBV29oQVF3QkN5QUFFRllORUNBQVFjd0FFQkFnQXlnQ0FDQUJRWUNBZ0lCNGNoQTVJQUZCQVdvaEFVRUFJUVFnQUNnQ0VDSUNRU3hIRFFFTEN5QUFFQklORGd3QkN3dEIvLy8vL3djaEFTQUNRZDBBUncwQkN5QUVSUTBCSUFCQkVSQVFJQUJCQVJBUUlBQkJRR3NvQWdBZ0FSQTVJQUJCd3dBUUVDQUFRVEFRR2d3QkN5QUFRUUVRRUNBQVFVQnJLQUlBSUFFUU9RTkFBa0FDUUFKQUlBQW9BaEFpQVVHbmYwY0VRRUdQQVNFQ0lBRkJMRWNOQVVFQklRUU1BZ3NnQUJBU0RRNUIwZ0FoQWlBQUVGWU5EZ3dCQ3lBQlFkMEFSZzBCSUFBUVZnME5JQUJCMFFBUUVFRUFJUVFMSUFBZ0FoQVFJQUFvQWhCQkxFY05BQ0FBRUJKRkRRRU1EQXNMSUFRRVFDQUFRUklRRUNBQVFjTUFFQkFnQUVFd0VCb01BUXNnQUVFT0VCQUxJQUJCM1FBUUxBMEpEQWNMUVg4aEFrRUFJUVFnQUVFQVFRQVExUVFOQ1F3SEMwRi9JUUlnQUJBU0RRZ2dBQ2dDRUVFdVJnUkFJQUFRRWcwSklBQkIrd0FRU2tVRVFDQUFRZUQzQUVFQUVCWU1DZ3NnQUNnQ1JFVUVRQ0FBUWVEdUFFRUFFQllNQ2dzZ0FCQVNEUWtnQUVFTUVCQWdBRUZBYXlnQ0FFRUdFR1FNQmdzZ0FFRW9FQ3dOQ0NBR1JRUkFJQUJCKzVnQlFRQVFGZ3dKQ3lBQUVGWU5DQ0FBUVNrUUxBMElJQUJCTlJBUVFRQWhCRUVCSVFvTUJndEJmeUVDSUFBUUVnMEhBa0FnQUNnQ0VDSUJRZHNBUmlBQlFTNUdja1VFUUNBQlFTaEhEUUZCQWlFRUlBQW9Ba0FvQWxRTkJ5QUFRY3c5UVFBUUZnd0pDeUFBUVVCcklnRW9BZ0FvQWxoRkJFQWdBRUdNOGdCQkFCQVdEQWtMSUFCQnVBRVFFQ0FBUVFnUUdrRUFJUVFnQVNnQ0FFRUFFQmNnQUVHNEFSQVFJQUJCOHdBUUdpQUJLQUlBUVFBUUZ5QUFRVFFRRUF3R0N5QUFRZCtYQVVFQUVCWU1Cd3RCZnlFQ0lBQVFFZzBHSUFBb0FoQkJMa1lFUUNBQUVCSU5CeUFBUWRZQUVFcEZCRUFnQUVIMExrRUFFQllNQ0FzZ0FFRkFheWdDQUNnQ1VFVUVRQ0FBUWNzMlFRQVFGZ3dJQ3lBQUVCSU5CeUFBUWJnQkVCQWdBRUh4QUJBYVFRQWhCQ0FBUVVCcktBSUFRUUFRRnd3RkN5QUFRUUFRdXdNTkJrRUJJUW9nQUNnQ0VFRW9SZ1JBUVFFaEJBd0ZDeUFBUVJFUUVDQUFRU0VRRUVFQUlRUWdBRUZBYXlnQ0FFRUFFQmNNQkFzZ0FDZ0NBQ0FCRUJNTUJBdEJmeUVDSUFBUUVnMEVDeUFBUWJnQkVCQWdBRUZBYXlJQktBSUFJQVFRT1NBQktBSUFJZ0VnQVM4QnZBRVFGd3RCQUNFRUN5QUZRWDgyQWh3Z0FFRkFheUVIQTBBZ0J5Z0NBQ0VHQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQW44Q1FDQUFLQUlRSWdGQnFYOUhJZ05GQkVBZ0FCQVNEUTBnQUNnQ0VDSUJRU2hHQkVCQkFTRUpJQW9OQWdzZ0FVSGJBRWNOQ0F3TEN5QUJRWUovUnlBRWNrVUVRRUVBSVFrZ0JTZ0NIRUVBU0FSQVFRQWhDRUVEREFNTElBQkIrczhBUVFBUUZnd05DeUFCUVNoSERRWkJBQ0VKSUFwRkRRWUxJQUFRRWcwTElBUU5BVUVCSVFoQkFBc2hCRUVBSVFOQkFTRUJBa0FDUUNBR0tBS1lBaUlDUVFCSURRQUNmd0ovQWtBQ1FBSkFBa0FnQmlnQ2dBSWdBbW9pQ3kwQUFDSUNRY2NBYXc0RUFRWUdBd0FMSUFKQndRQkdCRUJCd2dBaENDQUNEQVFMSUFKQnVBRkdEUUVnQWtHK0FVY05CVUcvQVNFSVFiNEJEQU1MUWNnQUlRaEJ4d0FNQWdzZ0NVVUVRRUV4SVFNZ0NDQUxLQUFCUVRwR2NRMEZDeUFMTHdBRklRSWdCaUVEQTBBZ0EwVUVRRUc0QVNFRERBVUxJQU1vQXN3QklBSkJBM1JxUVFScUlRSURRQ0FDS0FJQUlnSkJBRTRFUUNBREtBSjBJQUpCQkhScUlnSW9BZ0JCMUFCR0JFQkJ2QUVoQ0VHOEFTRURRUUVNQmdVZ0FrRUlhaUVDREFJTEFBc0xJQU1vQWd3aEFpQURLQUlFSVFNTUFBc0FDMEhIQUNFSVFjY0FDeUVEUVFJTElRRWdDeUFJT2dBQUN5QUpSUTBBSUFBZ0JVRWNhaUFCRU9FQ0MwRUFJUWtnQkVFRFJ3MEJJQUJCQVNBRlFSUnFFTlVFRFFvTUF3c2dCRUVDUmlFSlFRQWhBeUFFUVFKSERRQWdBRUc0QVJBUUlBQkI4Z0FRR2lBSEtBSUFRUUFRRnlBQVFUUVFFQ0FBUWJnQkVCQWdBRUh4QUJBYUlBY29BZ0JCQUJBWFFRQWhBUXdCQzBFQUlRRWdCRUVCUncwQUlBQkJFUkFRQ3dKQUEwQWdBQ2dDRUNJQ1FTbEdEUUVnQVVILy93TkdCRUFnQUVIVE0wRUFFQllNQ2dzZ0FrR25mMGNFUUVGL0lRSWdBQkJXRFFzZ0FVRUJhaUVCSUFBb0FoQkJLVVlOQWlBQVFTd1FMRVVOQVF3TEN3c2dCU0FCTmdJVUlBQkJKaEFRSUFjb0FnQWdBVUgvL3dOeEVCY2dBRUVCRUJBZ0J5Z0NBQ0FCRURrRFFBSkFBa0FnQUNnQ0VDSUJRYWQvUndSQUlBRkJLVVlOQWlBQUVGWU5EQ0FBUWRFQUVCQkJqd0VoQVF3QkMwRi9JUUlnQUJBU0RReEIwZ0FoQVNBQUVGWU5EQXNnQUNBQkVCQWdBQ2dDRUVFcFJnMEFRWDhoQWlBQVFTd1FMRVVOQVF3TEN3c2dBQkFTRFFnZ0FFRU9FQkFDUUFKQUFrQUNRQ0FEUWJ3QmF3NERBUU1CQUFzZ0EwRXhSZzBCSUFOQnh3QkdEUUFnQTBIQkFFY05BZ3NnQUVFWUVCQWdBRUVuRUJBZ0J5Z0NBQ0FFUVFGR0VCZEJBQ0VFREFrTElBQkJNaEFRREFZTElBa0VRQ0FBUVNjUUVDQUhLQUlBUVFFUUZ5QUFRUkVRRUNBQVFiMEJFQkFnQUVFSUVCcEJBQ0VFSUFjb0FnQkJBQkFYSUFBUXdBTU1DQXNnQkVFQlJnUkFJQUJCR0JBUUlBQkJKeEFRSUFjb0FnQkJBUkFYUVFBaEJBd0lDeUFBUVFZUUVDQUFRUnNRRUNBQVFTY1FFRUVBSVFRZ0J5Z0NBRUVBRUJjTUJ3c2dCU0FCTmdJVUlBQVFFZzBIQ3dKQUFrQUNRQUpBSUFOQnZBRnJEZ01CQXdFQUN5QURRVEZHRFFFZ0EwSEhBRVlOQUNBRFFjRUFSdzBDQ3lBQVFTUVFFQ0FIS0FJQUlBVXZBUlFRRjBFQUlRUU1Cd3NnQUVFeEVCQWdCeWdDQUNBRkx3RVVFQmNNQkFzQ1FBSkFBa0FnQkVFQmF3NENBUUFDQ3lBQVFTRVFFQ0FIS0FJQUlBVXZBUlFRRnlBQVFSRVFFQ0FBUWIwQkVCQWdBRUVJRUJwQkFDRUVJQWNvQWdCQkFCQVhJQUFRd0FNTUJ3c2dBRUVoRUJBZ0J5Z0NBQ0FGTHdFVUVCZEJBQ0VFREFZTElBQkJJaEFRSUFjb0FnQWdCUzhCRkJBWFFRQWhCQXdGQ3lBQlFkc0FSZzBESUFGQkxrY05BU0FBRUJJTkJTQUFLQUlRSVFFTEFrQWdBVUdyZjBZRVFBSkFJQVlvQXBnQ0lnRkJBRWdOQUNBR0tBS0FBaUFCYWkwQUFFRTBSdzBBSUFCQjVzTUFRUUFRRmd3SEN5QURSUVJBSUFBZ0JVRWNha0VCRU9FQ0N5QUFRYjRCRUJBZ0FDQUFLQUlnRUJvZ0J5Z0NBQ0lCSUFFdkFid0JFQmNNQVFzZ0FVR0RmMFlnQVVFbGFrRlJTM0pGQkVBZ0FFR2U2QUJCQUJBV0RBWUxBa0FnQmlnQ21BSWlBVUVBU0EwQUlBWW9Bb0FDSUFGcUxRQUFRVFJIRFFBZ0FDQUFLQUlBSUFBb0FpQVFYQ0lNUVFFUXRBRWhBU0FBS0FJQUlBd1FEeUFCRFFZZ0FFSEtBQkFRREFFTElBTkZCRUFnQUNBRlFSeHFRUUVRNFFJTElBQkJ3UUFRRUNBQUlBQW9BaUFRR2d0QmZ5RUNJQUFRRWtVTkF3d0ZDMEVBSVFJZ0JTZ0NIQ0lCUVFCSURRUWdBQ0FCRUI0TUJBc2dCeWdDQUNBR0x3RzhBUkFYSUFaQkFUWUNSRUVBSVFRTUFRdEJBQ0VCSUFZb0FwZ0NJZ0pCQUU0RVFDQUdLQUtBQWlBQ2FpMEFBQ0VCQ3lBRFJRUkFJQUFnQlVFY2FrRUJFT0VDQzBGL0lRSWdBQkFTRFFJZ0FCQ1JBUTBDSUFCQjNRQVFMQTBDSUFGQk5FWUVRQ0FBUWNvQUVCQUZJQUJCeHdBUUVBc01BQXNBQzBGL0lRSUxJQVZCSUdva0FDQUNDNEVCQVFGL0FrQUNRQ0FBS0FJUVFZTi9SdzBBSUFBb0FpZ05BQ0FBS0FJZ0lRSWdBQ2dDUUMwQWJrRUJjVVVOQVNBQ1FjMEFSZzBBSUFKQk9rY05BUXNnQUVHRkwwRUFFQlpCQUE4TElBQW9BZ0FnQWhBWUlRSUNRQUpBSUFFRVFDQUFJQUlRMXdRTkFRc2dBQkFTUlEwQkN5QUFLQUlBSUFJUUUwRUFJUUlMSUFJTHdBRUJBMzhqQUVFUWF5SUNKQUFnQUVFbkVFb0VmeUFDSUFBb0FnUTJBZ0FnQWlBQUtBSVVOZ0lFSUFJZ0FDZ0NHRFlDRENBQ0lBQW9BakEyQWdoQmZ3Si9RWDhnQUJBU0RRQWFBa0FnQUNnQ0VDSURRUzFxSWdSQkIwMUJBRUVCSUFSMFFjRUJjUnNnQTBIN0FFWnlSUVJBUVFFZ0EwSGJBRVlOQWhvZ0EwR0RmMGNOQVVFQUlBQW9BaWdOQWhvTElBRkJCSEZCQW5ZZ0FDZ0NCQ0FBS0FJVVJuSU1BUXRCQUFzZ0FDQUNFTzRDR3dWQkFBc2hBQ0FDUVJCcUpBQWdBQXRMQVFGL1FYOGhBeUFBSUFGQnRBSnFRUWdnQVVHOEFtb2dBU2dDdUFKQkFXb1FlRVVFUUNBQklBRW9BcmdDSWdOQkFXbzJBcmdDSUFFb0FyUUNJQU5CQTNScUlBSTNBd0FMSUFNTGtRRUJBbjhnQVNnQ2lBRWlCRUdBZ0FST0JFQWdBRUhBTTBFQUVFWkJmdzhMUVg4aEF5QUFJQUZCZ0FGcVFSQWdBVUdFQVdvZ0JFRUJhaEI0Qkg5QmZ3VWdBU0FCS0FLSUFTSURRUUZxTmdLSUFTQUJLQUtBQVNBRFFRUjBhaUlEUWdBM0FnQWdBMElBTndJSUlBTWdBQ0FDRUJnMkFnQWdBeUFES0FJTVFZRC8vLzhIY2pZQ0RDQUJLQUtJQVVFQmF3c0xiZ0VDZnlBQVFiZ0JFQkFnQUVIMkFCQWFJQUJCUUdzaUFpZ0NBQ0lCSUFFdkFid0JFQmNnQUVFUkVCQWdBRUhwQUVGL0VCd2hBU0FBUWJnQkVCQWdBRUVJRUJvZ0FpZ0NBRUVBRUJjZ0FFRWJFQkFnQUVFa0VCQWdBaWdDQUVFQUVCY2dBQ0FCRUI0Z0FFRU9FQkFMaGdFQkFuOENRQU5BSUFKQkFFNEVRQUpBSUFBb0FuUWdBa0VFZEdvaUJDZ0NBQ0FCUncwQUlBUW9BZ3dpQlVFQ2NRMERJQU5GRFFBZ0JVSDRBSEZCR0VZTkF3c2dCQ2dDQ0NFQ0RBRUxDMEYvSVFJZ0FDZ0NJRVVOQUNBQUtBSWtEUUFnQUNBQkVLSUNJZ0FFUUVHQWdJQ0FCQ0VDSUFBdEFBUkJBbkVOQVF0QmZ5RUNDeUFDQzVFQkFRVi9Ba0FDUUNBQUtBSkFJZ0VvQXBnQ0lnSkJBRWdOQUNBQktBS0FBaUlESUFKcUlnUXRBQUFpQlVIQkFVY0VRQ0FGUWMwQVJ3MEJJQUZCZnpZQ21BSWdBU0FDTmdLRUFpQUFRYzRBRUJBUEN5QUNJQVFvQUFGcklBTnFJZ0JCQVdvdEFBQkIxZ0JIRFFFZ0FFSFhBRG9BQVNBQlFYODJBcGdDQ3c4TFFkMDBRYTc4QUVIdHNBRkI0L1VBRUFBQUMxa0JBMzhnQUNnQ3pBRWdBa0VEZEdwQkJHb2hBd05BQWtCQmZ5RUVJQU1vQWdBaUEwRi9SZzBBSUFBb0FuUWdBMEVFZEdvaUJTZ0NCQ0FDUncwQUlBTWhCQ0FGS0FJQUlBRkdEUUFnQlVFSWFpRUREQUVMQ3lBRUM4b0ZBZ1IvQVg0Q1FBSkFBa0FDZndKQUFrQUNRQUpBQWtBZ0FrVU5BQUpBSUFCQndRQVFTa1VFUUNBQVFjSUFFRXBGRFFFTElBQW9BZ0FnQUNnQ0lCQVlJUVVnQUJBU0RRUkJBU0VIQWtBQ1FDQUFLQUlRSWdoQktHc09CUVFCQVFFRUFBc2dDRUU2UmlBSVFmMEFSbklOQXdzZ0FDZ0NBQ0FGRUJOQkEwRUNJQVZCd2dCR0d5RUdEQUVMSUFBb0FoQkJLa1lFUUNBQUVCSU5DRUVFSVFZTUFRc2dBRUdGQVJCS1JRMEFJQUFvQWpoQkFSQ0RBVUVLUmcwQUlBQW9BZ0FnQUNnQ0lCQVlJUVVnQUJBU0RRTkJBU0VIQWtBQ1FDQUFLQUlRSWdoQktHc09CUU1CQVFFREFBc2dDRUU2UmlBSVFmMEFSbklOQWdzZ0FDZ0NBQ0FGRUJOQkJTRUdJQUFvQWhCQktrY05BQ0FBRUJJTkIwRUdJUVlMSUFBb0FoQWlCVUdEZjBjZ0JVRWxha0ZTU1hFTkFVRUFJUWNnQlVHRGYwWUVRQ0FBS0FJb1JTRUhDeUFBS0FJQUlBQW9BaUFRR0NFRklBQVFFZzBDQzBFQUlBWWdBMFVnQjBWeWNnMERHaUFBS0FJUUlnQkJPa2NnQWtVZ0FFRW9SM0p4SVFaQkFDRUVEQVlMQWtBQ1FBSkFJQVZCZ0FGcURnSUJBQUlMSUFBb0FnQWdBQ2tESUJBeElnVkZEUVlnQUJBU0RRSU1Bd3NDUUNBQUtRTWdJZ2xDZ0lDQWdIQ0RRb0NBZ0lEd2ZsRUVRQ0FBS0FJQUlnSWdDYWRCQkdvZ0FEUUNLQ0FDS0FJUUtBTEVBaEU1QUNJSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFjZ0FDZ0NBQ0FKRURFaEJTQUFLQUlBSUFrUUR3d0JDeUFBS0FJQUlBa1FNU0VGQ3lBRlJRMEZJQUFRRWtVTkFnd0JDeUFGUWRzQVJ3UkFJQVJGSUFWQnEzOUhjZzBFSUFBb0FnQWdBQ2dDSUJBWUlRVWdBQkFTRFFGQkVBd0RDeUFBRUJJTkJDQUFFSkVCRFFRZ0FFSGRBQkFzRFFSQkFDRUZRUUFNQWdzZ0FDZ0NBQ0FGRUJNTUF3dEJBQXNoQkNBR1FRSkpEUUlnQUNnQ0VFRW9SZzBDSUFBb0FnQWdCUkFUQ3lBQVFaUG1BRUVBRUJZTElBRkJBRFlDQUVGL0R3c2dBU0FGTmdJQUlBUWdCbklMYVFBZ0FVRUJha0VJVFFSQUlBQWdBVUhMQUd0Qi93RnhFQkVQQ3lBQlFZQUJha0gvQVUwRVFDQUFRYjBCRUJFZ0FDQUJRZjhCY1JBUkR3c2dBVUdBZ0FKcVFmLy9BMDBFUUNBQVFiNEJFQkVnQUNBQlFmLy9BM0VRS2c4TElBQkJBUkFSSUFBZ0FSQWRDMThCQTM4Q1FBTkFJQUVnQWt3TkFRSkFBa0FnQUNBQ2FpSUZMUUFBSWdaQnRnRkhCRUFnQmtIQ0FVWU5BU0FHUWVzQVJ3MEVJQVVvQUFFZ0EwY05CQXdDQ3lBRktBQUJJQU5HRFFFTElBSkJCV29oQWd3QkN3dEJBU0VFQ3lBRUM0RUNBUVYvSUFBZ0FVRi9FR2thQWtBRFFDQUdRUXBHQkVCQjZ3QWhCQXdDQ3dKQUlBRkJBRWdOQUNBQklBQW9BcXdDVGcwQUlBQW9BcVFDSUFGQkZHeHFLQUlJSVFVZ0FDZ0NnQUloQndOQUFrQUNRQ0FGSUFkcUlnZ3RBQUFpQkVHMkFVWU5BQ0FFUWNJQlJ3UkFJQVJCRGtjTkFrRU9JUVFEUUNBSElBVkJBV29pQldvdEFBQWlBMEVPUmcwQUN5QURRU2xIRFFaQktTRUVEQVlMSUFORkRRQWdBeUFJS0FBQk5nSUFDeUFGSUFSQkFuUkJnTGdCYWkwQUFHb2hCUXdCQ3dzZ0JFSHJBRWNOQWlBR1FRRnFJUVlnQ0NnQUFTRUJEQUVMQzBHRktVR3UvQUJCLy9NQlFlTXVFQUFBQ3lBQ0lBUTJBZ0FnQUNBQlFRRVFhUm9nQVF0b0FBSkFJQUZCQUU0TkFFRi9JUUVnQUNnQ0FDQUFRYVFDYWtFVUlBQkJxQUpxSUFBb0Fxd0NRUUZxRUhnTkFDQUFJQUFvQXF3Q0lnRkJBV28yQXF3Q0lBQW9BcVFDSUFGQkZHeHFJZ0JCQURZQ0VDQUFRbjgzQWdnZ0FFS0FnSUNBY0RjQ0FBc2dBUXVrQVFFQ2Z5QUJLQUxBQWlJS1FZQ0FCRTRFUUNBQVFhWTZRUUFRUmtGL0R3dEJmeUVKSUFBZ0FVSElBbXBCQ0NBQlFjUUNhaUFLUVFGcUVIZ0VmMEYvQlNBQklBRW9Bc0FDSWdsQkFXbzJBc0FDSUFFb0FzZ0NJQWxCQTNScUlna2dCRHNCQWlBSklBZEJBM1JCQ0hFZ0JrRUNkRUVFY1NBRFFRRjBRUUp4SUFKQkFYRnljbklnQ0VFRWRISTZBQUFnQ1NBQUlBVVFHRFlDQkNBQktBTEFBa0VCYXdzTE5nQUNRQ0FBSUFGQkNCQlBJZ0JCQUVnTkFDQUJLQUpnUlEwQUlBRW9BblFnQUVFRWRHb2lBU0FCS0FJTVFRSnlOZ0lNQ3lBQUM0SUNBUVYvQWtBQ1FBSkFJQUpCelFCR0lBSkJPa1p5UlFSQUlBQW9BZ0FoQlNBQ1FSWkhEUUVnQUNnQ1FDRUdEQUlMSUFCQjhOd0FRUUFRRmd3Q0N5QUFLQUpBSWdZb0FzQUNJZ2RCQUNBSFFRQktHeUVIQTBBZ0JDQUhSZzBCSUFSQkEzUWhDQ0FFUVFGcUlRUWdDQ0FHS0FMSUFtb29BZ1FnQWtjTkFBc2dBRUhYM0FCQkFCQVdEQUVMSUFVZ0JpQURRZjBBUmtFQUlBRW9BamdnQWtFQlFRRkJBQkRKQXlJQVFRQklEUUFnQlNBQlFUUnFRUXdnQVVFOGFpQUJLQUk0UVFGcUVIZ05BQ0FCSUFFb0FqZ2lBa0VCYWpZQ09DQUJLQUkwSVFFZ0JTQURFQmdoQXlBQklBSkJER3hxSWdFZ0FEWUNBQ0FCSUFNMkFnUkJBQThMUVg4THZRUUJDSDhqQUVFUWF5SUZKQUFnQUVGQWF5SUdLQUlBSVFnZ0FDZ0NBQ0VISUFKQnMzOUhJUXBCdlg5QnZYOUJ1WDhnQWtGVFJpSUpHeUFDUVV0R0cwSC9BWEVoQ3dKL0FrQUNRQU5BQWtBQ1FDQUFLQUlRSWdSQmczOUdCRUFnQUNnQ0tBUkFJQUFRNGdFTUJnc2dDVVVnQWtGTFIzRWdCeUFBS0FJZ0VCZ2lCRUVuUjNKRkJFQWdBRUc3eEFCQkFCQVdRU2NoQkF3RkN5QUFFQklOQkNBQUlBUWdBaENoQWcwRUlBTUVRQ0FBSUFZb0FnQW9BcFFESUFRZ0JFRUFFUGNCUlEwRkN3SkFJQUFvQWhCQlBVWUVRQ0FBRUJJTkJpQUtSUVJBSUFCQnVBRVFFQ0FBSUFRUUdpQUdLQUlBSUFndkFid0JFQmNnQUNBRlFReHFJQVZCQ0dvZ0JTQUZRUVJxUVFCQkFFRTlFTFVCUVFCSURRY2dBQ0FCRUxZQkJFQWdCeUFGS0FJQUVCTU1DQXNnQUNBRUVLRUJJQUFnQlNnQ0RDQUZLQUlJSUFVb0FnQWdCU2dDQkVFQVFRQVF3UUVNQWdzZ0FDQUJFTFlCRFFZZ0FDQUVFS0VCSUFBZ0N4QVFJQUFnQkJBYUlBWW9BZ0FnQ0M4QnZBRVFGd3dCQ3lBSlJRUkFJQUpCUzBjTkFTQUFRYW5xQUVFQUVCWU1CZ3NnQUVFR0VCQWdBRUc5QVJBUUlBQWdCQkFhSUFZb0FnQWdDQzhCdkFFUUZ3c2dCeUFFRUJNTUFRc2dCRUVnY2tIN0FFY05BU0FBSUFWQkRHcEJBQkNlQVVFOVJ3MEJJQUJCQmhBUVFYOGdBQ0FDUVFCQkFTQUZLQUlNUVFKeFFRRVF3Z0ZCQUVnTkJSb0xRUUFnQUNnQ0VFRXNSdzBFR2lBQUVCSkZEUUVNQXdzTElBQkJ5ZmNBUVFBUUZnd0JDeUFISUFRUUV3dEJmd3NoQkNBRlFSQnFKQUFnQkF2SUF3RU9mMEdBZ0FRZ0Ftc2lDVUVBSUFsQmdJQUVUUnNoRENBRFFRQWdBMEVBU2hzaERTQUFRUkJxSVFzZ0FFSE1BR29oQ1NBQVFjZ0FhaUVPQTBBZ0JDQU5SZ1JBUVFBUEN3SkFJQVFnREVZTkFDQUJJQVJCREd4cUlnTW9BZ0FoQ2lBREtBSUlJUThnQXlnQ0JDRVFBa0FnQUNnQ1FDSURJQUlnQkdvaUJVc0VRQ0FBS0FKRUlnTWdCVUVZYkdvb0FnQkZEUUVNQWd0Qk9pQUZRUUZxSWdZZ0EwRURiRUVCZGlJRElBTWdCa2diSWdNZ0EwRTZUQnNpQmtFRGRDRVJJQWtoQXdOQUFrQWdBQ2dDQ0NFSElBTW9BZ0FpQ0NBT1JnMEFJQXNnQ0NnQ0ZDQVJJQWNSQVFBaUIwVU5BeUFBS0FKQUlRTURRQ0FESUFaT1JRUkFJQWNnQTBFRGRHcENnSUNBZ0NBM0F3QWdBMEVCYWlFRERBRUxDeUFJSUFjMkFoUWdDRUVFYWlFRERBRUxDeUFMSUFBb0FrUWdCa0VZYkNBSEVRRUFJZ05GRFFFZ0F5QUFLQUpBSWdoQkdHeHFRUUFnQmlBSWEwRVliQkFyR2lBQUlBWTJBa0FnQUNBRE5nSkVDeUFESUFWQkdHeHFJZ01nQlRZQ0FDQUtRZDRCVGdSQUlBQW9BamdnQ2tFQ2RHb29BZ0FpQlNBRktBSUFRUUZxTmdJQUN5QURRZ0EzQWhBZ0F5QVBOZ0lNSUFNZ0VEWUNDQ0FESUFvMkFnUWdCRUVCYWlFRURBRUxDMEYvQzFrQkFYOGdBQ0FBS0FKSUlnRkJBV3NnQVhJMkFrZ2dBQ2dDQUNJQlFRaHhCRUFnQUNBQlFTQnlOZ0lBUVg4UEN5QUFRZ0EzQWdRZ0FDQUFLQUlzSWdFMkFod2dBQ0FCTmdJVUlBQWdBU0FBS0FJd2FqWUNFRUVBQy9nQ0FnUi9BWDRqQUVFZ2F5SUNKQUFDZndKQUlBQW9BZ0FnQWtFSWFrRWdFRDBOQUFKQUEwQUNRQ0FCSWdNZ0FDZ0NQRThOQUNBRFFRRnFJUUVDUUFKQUFrQUNRQUpBSUFNdEFBQWlCVUhjQUdzT0JRSURBd01CQUFzZ0JVRWtSdzBDUVNRaEJDQUJMUUFBUWZzQVJ3MERJQU5CQW1vaEFRc2dBRUdDZnpZQ0VDQUFJQVUyQWlnZ0FrRUlhaEEySVFZZ0FDQUJOZ0k0SUFBZ0JqY0RJRUVBREFjTElBSkJDR3BCM0FBUU93MEZJQUVnQUNnQ1BFOE5BaUFEUVFKcUlRRWdBeTBBQVNFRkN3SkFBa0FDUUNBRklnUkJDbXNPQkFFQ0FnQUNDeUFCSUFFdEFBQkJDa1pxSVFFTElBQWdBQ2dDQ0VFQmFqWUNDRUVLSVFRTUFRc2dCTUJCQUU0TkFDQUJRUUZyUVFZZ0FrRUVhaEJZSWdSQi8vL0RBRXNOQXlBQ0tBSUVJUUVMSUFKQkNHb2dCQkM1QVVVTkFRd0RDd3NnQUVHSjJ3QkJBQkFXREFFTElBQkJ0UEFBUVFBUUZnc2dBaWdDQ0NnQ0VDSUFRUkJxSUFJb0Fnd2dBQ2dDQkJFQUFFRi9DeUVCSUFKQklHb2tBQ0FCQzFZQkFuNENmMEVBSUFGQ2dJQ0FnSEJVRFFBYUlBQWdBVUhTQVNBQlFRQVFGQ0lDUW9DQWdJQndneUlEUW9DQWdJQXdVZ1JBUVg4Z0EwS0FnSUNBNEFCUkRRRWFJQUFnQWhBbUR3c2dBYWN2QVFaQkVrWUxDMEFCQVg4akFFRVFheUlDSkFBQ2Z5QUJJQUFvQWhCSEJFQWdBaUFCTmdJQUlBQkJvSmdCSUFJUUZrRi9EQUVMSUFBUW9nRUxJUUFnQWtFUWFpUUFJQUFMendVQ0FuNEVmeU1BUVJCcklnWWtBQ0FBS0FJQUlRVUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFBb0FoQWlCRUdBQVdvT0JBSUJCUU1BQ3lBRVFheC9SZzBESUFSQjJ3QkhCRUFnQkVIN0FFY05CVUtBZ0lDQUlDRUJJQUFRb2dFTkNVS0FnSUNBNEFBaEFTQUZFRFFpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBKQWtBZ0FDZ0NFQ0lEUWYwQVJnMEFBMEFDUUNBRFFZRi9SZ1JBSUFVZ0FDa0RJQkF4SWdNTkFRd01DeUFBS0FKTVJTQURRWU4vUjNJTkNpQUZJQUFvQWlBUUdDRURDd0pBQWtBZ0FCQ2lBUTBBSUFCQk9oRFJBdzBBSUFBUTBnTWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJDeUFGSUFNUUV3d0xDeUFGSUFJZ0F5QUJRUWNRR1NFRUlBVWdBeEFUSUFSQkFFZ05DaUFBS0FJUVFTeEhEUUVnQUJDaUFRMEtJQUFvQWt4RklBQW9BaEFpQTBIOUFFZHlEUUFMQ3lBQ0lRRWdBRUg5QUJEUkF3MEpEQW9MUW9DQWdJQWdJUUVnQUJDaUFRMElRb0NBZ0lEZ0FDRUJJQVVRUGlJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFnQ1FDQUFLQUlRUWQwQVJnMEFBMEFnQUJEU0F5SUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRa2dCU0FDSUFNZ0FVRUhFSzhCUVFCSURRa2dBQ2dDRUVFc1J3MEJJQUFRb2dFTkNTQURRUUZxSVFNZ0FDZ0NURVVOQUNBQUtBSVFRZDBBUncwQUN3c2dBaUVCSUFCQjNRQVEwUU1OQ0F3SkN5QUFLUU1nSWdGQ0lJaW5RWFZQQkVBZ0FhY2lCQ0FFS0FJQVFRRnFOZ0lBQ3lBQklRSWdBQkNpQVEwSERBZ0xJQUFwQXlBaUFTRUNJQUFRb2dFTkJnd0hDeUFBS0FJZ1FRRnJJZ1JCQWtzTkFTQUVRUU4wUWFqK0FXb3BBd0FpQVNFQ0lBQVFvZ0VOQlF3R0N5QUFRZm9sUVFBUUZnd0JDeUFBS0FJNElRTWdCaUFBS0FJWUlnUTJBZ1FnQmlBRElBUnJOZ0lBSUFCQnRaVUJJQVlRRmd0Q2dJQ0FnQ0FoQVF3Q0N5QUFRZDNsQUVFQUVCWUxJQUloQVFzZ0JTQUJFQTlDZ0lDQWdPQUFJUUlMSUFaQkVHb2tBQ0FDQ3hVQkFYNGdBQ0FCRVBZRUlRSWdBQ0FCRUE4Z0FndTREd0lFZndwK0l3QkJFR3NpQlNRQUlBVWdBamNEQ0FKQUFrQUNmZ0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRRUVISUFKQ0lJaW5JZ1FnQkVFSGEwRnVTUnRCQ21vT0VnY0VBZ01DQWdJQ0FnQUVCQVFDQWdJQ0FRSUxBa0FDUUFKQUFrQUNRQUpBSUFLbklnUXZBUVlpQmtFRWF3NERBZ0VEQUFzZ0JrRWhhdzRDQ3dNRUMwS0FnSUNBTUNFS0lBQWdBaEEzSWdKQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQ3lBQUlBSVEwd01pQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBMSUFFb0FpZ2dBaEIvSVFRTURndENnSUNBZ0RBaENpQUFJQUlRalFFaUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwS0lBRW9BaWdnQWhCL0lRUU1EUXNnQVNnQ0tDQUVLUU1nRUljQklRUWdBQ0FDRUE4TURBc2dBU2dDS0NBQ0VIOGhCQXdMQzBLQWdJQ0FNQ0VMSUFBZ0FTa0RDRUVCSUFWQkNHb1ExZ01pQ0VLQWdJQ0E4QUNEUW9DQWdJRGdBRkVOQlNBQUlBZ1FKZ1JBSUFCQnkvQUFRUUFRRlF3R0N5QURRaUNJcDBGMVR3UkFJQU9uSWdRZ0JDZ0NBRUVCYWpZQ0FBc2dBU2tER0NJSVFpQ0lwMEYxVHdSQUlBaW5JZ1FnQkNnQ0FFRUJhallDQUFzQ1FBSkFBa0FDUUNBQUlBTWdDQkRFQWlJTVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVCQ2dJQ0FnREFoQ2d3QkN5QUJLUU1ZSWdoQ2dJQ0FnSENEUW9DQWdJQ1FmMUVFUUNBSXB5Z0NCRUgvLy8vL0IzRkZEUU1MSUF4Q0lJaW5RWFZQQkVBZ0RLY2lCQ0FFS0FJQVFRRnFOZ0lBQ3lBQVFjdWVBU0FNUWN5ZUFSQytBU0lLUW9DQWdJQndnMEtBZ0lDQTRBQlNEUUVMUW9DQWdJQXdJUTBNQndzZ0FFR0VtZ0VRWWlJTlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTUJnc2dBU2tESUNJS1FpQ0lwMEYxVHdSQUlBcW5JZ1FnQkNnQ0FFRUNhallDQUFzZ0NpRU5DeUFBSUFBZ0FTa0RDRUVCSUFWQkNHcEJBQkQ0QkJEOEFRMEVJQUFnQWhES0FTSUVRUUJJRFFRQ1FBSkFJQVFFUUNBQUlBVWdBaEE4RFFjZ0FTZ0NLRUhiQUJBN0dpQUZLUU1BSWc1Q0FDQU9RZ0JWR3lFUUlBRkJLR29oQmdKQUEwQWdDU0FRVVEwQklBRW9BaWdoQkFKQUFrQWdDVkJGQkVBZ0JFRXNFRHNhSUFFb0FpZ2dDaENIQVJvZ0FDQUNJQWtRY3lJUFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFF3Z0NVS0FnSUNBQ0ZvTkFTQUpJUWdNQWdzZ0JDQUtFSWNCR2tJQUlRZ2dBQ0FDUWdBUVRTSVBRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRc01BUXRDZ0lDQWdNQitJQW01dlNJSVFvQ0FnSURBZ1lEOC93QjlJQWhDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJJUWdMSUFBZ0NCQTNJZ2hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5EaUFBSUFFZ0FpQVBJQWdRMVFNaER5QUFJQWdRRHlBUFFvQ0FnSUJ3Z3lJUlFvQ0FnSURnQUZFTkNTQUpRZ0Y4SVFsQ2dJQ0FnREFoQ0NBQUlBRkNnSUNBZ0NBZ0R5QVJRb0NBZ0lBd1VSc2dEQkRVQTBVTkFBc01EUXNnRGtJQVZ3UkFRZDBBSVFSQ2dJQ0FnREFoQ0F3REN5QUJLUU1ZSWdsQ2dJQ0FnSENEUW9DQWdJQ1FmMUlFUUVIZEFDRUVRb0NBZ0lBd0lRZ01BZ3RCM1FBaEJFS0FnSUNBTUNFSUlBbW5LQUlFUWYvLy8vOEhjUTBCREFJTEFrQWdBU2tERUNJTFFvQ0FnSUJ3Z3lJSlFvQ0FnSUF3VWdSQUlBdENJSWluUVhWSkRRRWdDNmNpQkNBRUtBSUFRUUZxTmdJQURBRUxJQUFnQWtFUlFRQVFxZ0lpQzBLQWdJQ0FjSU1oQ1F0Q2dJQ0FnREFoQ0NBSlFvQ0FnSURnQUZFTkN5QUFJQVVnQ3hBOERRc2dBU2dDS0VIN0FCQTdHa0lBSVFrZ0JTa0RBQ0lJUWdBZ0NFSUFWUnNoRHlBQlFTaHFJUVpCQUNFRVFvQ0FnSUF3SVFnRFFDQUpJQTlTQkVBZ0FDQUlFQThnQUNBTElBa1FjeUlJUW9DQWdJQndnMEtBZ0lDQTRBQlJEUTBnQ0VJZ2lLZEJkVThFUUNBSXB5SUhJQWNvQWdCQkFXbzJBZ0FMSUFBZ0FpQUlFRTBpRGtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBOSUFBZ0FTQUNJQTRnQ0JEVkF5SU9Rb0NBZ0lCd2d5SVFRb0NBZ0lBd1VnUkFJQkJDZ0lDQWdPQUFVUTBPSUFRRVFDQUJLQUlvUVN3UU94b0xJQUFnQ0JEVEF5SUlRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQ0FPRUE4TUR3c2dBU2dDS0NBS0VJY0JHaUFCS0FJb0lBZ1Fod0VhSUFFb0FpaEJPaEE3R2lBQktBSW9JQTBRaHdFYVFRRWhCQ0FBSUFFZ0RpQU1FTlFERFE0TElBbENBWHdoQ1F3QkN3c2dCRVVFUUVIOUFDRUVEQUlMUWYwQUlRUWdBU2dDR0NnQ0JFSC8vLy8vQjNGRkRRRUxJQVlvQWdCQkNoQTdHaUFHS0FJQUlBTVFod0VhQ3lBQktBSW9JQVFRT3hwQkFDRUVJQUFnQUNBQktRTUlJQVVnQlVFQUVQY0VFUHdCRFFrZ0FDQUNFQThnQUNBTEVBOGdBQ0FLRUE4Z0FDQU5FQThnQUNBTUVBOGdBQ0FJRUE4TUNndENnSUNBZ0NBZ0FpQUNRb0NBZ0lEQWdZRDgvd0I4UW9DQWdJQ0FnSUQ0L3dDRFFvQ0FnSUNBZ0lENC93QlJHeUVDREFJTElBQWdBaEFQUVFBaEJBd0lDMEtBZ0lDQU1DRUtRb0NBZ0lBd0lRMUNnSUNBZ0RBaEMwS0FnSUNBTUNFSVFvQ0FnSUF3SVF3Z0FDQUNFTk1ESWdKQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQmdzZ0FTZ0NLQ0FDRUg4aEJBd0dDMEtBZ0lDQU1DRUlEQVFMUW9DQWdJQXdJUXBDZ0lDQWdEQU1BZ3NnQUVHQ0hrRUFFQlZDZ0lDQWdEQWhDZ3RDZ0lDQWdEQWhDMEtBZ0lDQU1Bc2hEVUtBZ0lDQU1DRUlRb0NBZ0lBd0lRd0xJQUFnQWhBUElBQWdDeEFQSUFBZ0NoQVBJQUFnRFJBUElBQWdEQkFQSUFBZ0NCQVBRWDhoQkFzZ0JVRVFhaVFBSUFRTC9BSUNBWDhCZmlNQVFTQnJJZ1VrQUNBRklBUTNBeGdDUUFKQUFrQWdBMEtBZ0lDQWNJTkNnSUNBZ09CK1VpQURRdi8vLy85dldIRkZCRUJDZ0lDQWdPQUFJUVlnQUNBRFFaRUJJQU5CQUJBVUlnUkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQURJUVFNQXdzZ0FDQUVFRGdFUUNBQUlBUWdBMEVCSUFWQkdHb1FMeUVFSUFBZ0F4QVBJQVJDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5BZ3dEQ3lBQUlBUVFEd3NnQXlFRUN3SkFJQUVwQXdBaUEwS0FnSUNBY0lOQ2dJQ0FnREJSQkVBZ0JDRUREQUVMSUFVZ0JEY0RDQ0FGSUFVcEF4ZzNBd0FnQUNBRElBSkJBaUFGRUNFaEF5QUFJQVFRRDBLQWdJQ0E0QUFoQmlBRElRUWdBMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMEJDd0pBUVFjZ0EwSWdpS2NpQVNBQlFRZHJRVzVKRzBFS2FpSUJRUkZMRFFCQkFTQUJkRUdMdUF4eERRSWdBVUVKUncwQUlBTWhCRUtBZ0lDQU1DRUdJQUFnQXhBNFJRMENEQUVMSUFNaEJFS0FnSUNBTUNFR0N5QUFJQVFRRHlBR0lRTUxJQVZCSUdva0FDQURDNTREQWdWK0FuOGpBRUVnYXlJSkpBQkNnSUNBZ09BQUlRUUNRQ0FBSUFsQkdHb2dBQ0FCRUNVaUJ4QThEUUFDUUNBSktRTVlJZ1ZDQUZjTkFDQUpRZ0EzQXhBZ0FrRUNUZ1JBSUFBZ0NVRVFhaUFES1FNSVFnQWdCU0FGRUhRTkFnc0NRQUpBSUFjZ0NVRU1haUFKUVFocUVJb0NSUVJBSUFrcEF4QWhBUXdCQ3lBSktRTVFJZ0VnQ1RVQ0NDSUVJQUVnQkZVYklRZ2dDU2dDRENFQ0EwQWdBU0FJVVEwQklBTXBBd0FpQkVJZ2lLZEJkVThFUUNBRXB5SUtJQW9vQWdCQkFXbzJBZ0FMSUFJZ0FhZEJBM1JxS1FNQUlnWkNJSWluUVhWUEJFQWdCcWNpQ2lBS0tBSUFRUUZxTmdJQUN5QUFJQVFnQmtFQ0VMd0JEUUlnQVVJQmZDRUJEQUFMQUFzZ0FTQUZJQUVnQlZVYklRVURRQ0FCSUFWUkRRSkNnSUNBZ09BQUlRUWdBQ0FISUFFUWN5SUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRTWdBeWtEQUNJRVFpQ0lwMEYxVHdSQUlBU25JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUVJQVpCQWhDOEFRMEJJQUZDQVh3aEFRd0FDd0FMUW9HQWdJQVFJUVFNQVF0Q2dJQ0FnQkFoQkFzZ0FDQUhFQThnQ1VFZ2FpUUFJQVFMdHdFQkFuOENRQUo4QWtBQ1FBSkFBa0FDUUVFSElBQkNJSWluSWdJZ0FrRUhhMEZ1U1JzaUFrRUlhZzRLQWdFR0JnWUdCZ0lEQUFRTElBQ25JUUVNQlFzZ0FLZEJBQkN3QlNFQkRBUUxJQUNuUWRzWWJDRUJEQU1MSUFDblFkc1liTGNNQVFzZ0FrRUhSdzBCUkFBQUFBQUFBUGgvSUFCQ2dJQ0FnTUNCZ1B6L0FId2lBTDhnQUVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMdlNJQVFpQ0lJQUNGcDBIYkdHd2hBUXNnQVNBQ2N3c0VBRUVBQzFnQkFuOGdBUVJBQWtBZ0FDZ0NDQ0FBS0FJRUlnTWdBV3BKRFFBZ0FSQ3hBU0lCUlEwQUlBQWdBMEVJYWpZQ0JDQUFJQUFvQWdCQkFXbzJBZ0FnQVNFQ0N5QUNEd3RCb0pBQlFhNzhBRUdpRFVINit3QVFBQUFMcEFFQ0FuOEJmaU1BUVJCcklnUWtBQUpBSUFBZ0FTQUNJQU1RcHdFaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUFrQWdBQ0FCRUpJQklnVkJBRWdOQUNBQ1FRRkhEUUVnQXlrREFDSUdRaUNJcDBGMVR3UkFJQWFuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dBQ0FFUVFocUlBWVFvd0VOQUNBRUtRTUlJQVd0VncwQklBQkIwTlFBUVFBUUZRc2dBQ0FCRUE5Q2dJQ0FnT0FBSVFFTElBUkJFR29rQUNBQkM1Z0JBUVIvSUFHbklnWXZBUVpCNWFZQmFqRUFBQ0VCSUFCQkdCQXBJZ1ZGQkVBZ0FDQUNFQTlCZnc4TElBS25JZ2NvQWlBaEFDQUZJQVFnQVlZK0FoUWdCU0FEcHlJSU5nSVFJQVVnQnpZQ0RDQUZJQVkyQWdnZ0FDZ0NEQ0lISUFVMkFnUWdCU0FBUVF4cU5nSUVJQVVnQnpZQ0FDQUFJQVUyQWd3Z0JpQUVQZ0lvSUFZZ0JUWUNJQ0FHSUFBb0FnZ2dDR28yQWlSQkFBdW9BZ0VFZnlBQUtBSVFJUVlDUUFKQUlBQWdBU0FERUdVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBSkNnSUNBZ0FoYUJFQWdBRUgyMkFCQkFCQlFEQUlMSUFCQkhCQXBJZ1JGQkVCQkFDRUVEQUlMSUFRZ0FxY2lCVFlDQUFKQUFrQWdBMEVVUncwQUlBWW9BcmdCSWdkRkRRQWdCQ0FHS0FMRUFVRUJJQVVnQlVFQlRCc2dCeEVEQUNJR05nSUlJQVpGRFFNZ0JrRUFJQVVRS3hvTUFRc2dCQ0FBUVFFZ0JTQUZRUUZNR3hCZklnVTJBZ2dnQlVVTkFnc2dCRUhTQURZQ0dDQUVRUUEyQWhRZ0JFRUFPZ0FFSUFRZ0JFRU1haUlBTmdJUUlBUWdBRFlDRENBRUlBTkJGRVk2QUFVZ0FVS0FnSUNBY0ZRTkFDQUJweUFFTmdJZ0N5QUJEd3NnQUNBQkVBOGdBQ2dDRUNJQVFSQnFJQVFnQUNnQ0JCRUFBRUtBZ0lDQTRBQUxHd0FnQVNnQ0lBUkFJQUFnQVVFb2FoRCtBaUFCUVFBMkFpQUxDMllDQW44QmZpTUFRUkJySWdNa0FFRi9JUVFDUUNBQUlBRkNBQkJOSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBTkJER29nQlJDWUFRMEFJQUFnQVVFQUlBTW9BZ3dnQW1vaUFLMFFwUUZCQUVnTkFDQUFSU0VFQ3lBRFFSQnFKQUFnQkFzTkFDQUFJQUVnQWtFQkVJTUZDeUVBSUFFb0FnUkJCVWNFUUNBQlFRVTJBZ1FnQUNnQ0VDQUJRUWhxRVA0Q0N3dVJBUUVEZndKQUlBQW9BZ2dpQkVIOS8vLy9CMG9OQUNBQ1FRWkdCRUFnQVNBRFNBOExJQVJCZ0lDQWdIaEdJQUZCQW1vZ0EwcHlEUUFnQUNnQ0VDSUdJQUFvQWd3aUJDQUJRWDl6SWdBZ0JFRUZkR29pQVJDWkFpQUNRWHR4UlhNaEFpQUFJQU5xSVFBRFFDQUFSUTBCSUFCQkFXc2hBQ0FHSUFRZ0FVRUJheUlCRUprQ0lBSkdEUUFMUVFFaEJRc2dCUXNwQVFGL0lBSkNJSWluUVhWUEJFQWdBcWNpQXlBREtBSUFRUUZxTmdJQUN5QUFJQUVnQWhDUUJRdWpCUUVNZnlNQVFUQnJJZ1FrQUFKQUFrQUNRQ0FBSUFGR0lBQWdBa1p5UlFSQUlBRW9BZ2hCQUVvRVFDQUJLQUlFSVFZTElBSW9BZ2hCQUVvRVFDQUNLQUlFSVFjTElBWkZCRUFnQVNFRkRBSUxJQUFvQWdBaEJTQUVRZ0EzQWhRZ0JFS0FnSUNBZ0lDQWdJQi9Od0lNSUFRZ0JUWUNDQ0FFUVFocUlRVWdCU0FCUWdGQi8vLy8vd05CQVJCMVJRMEJRUUFoQWd3Q0MwR3FqQUZCMVB3QVFab1NRZkRKQUJBQUFBc0NRQUpBQW44Z0IwVUVRRUVBSUFOQkFrOE5BUm9nQmtVaENTQUdJUWdNQWdzZ0FDZ0NBQ0VCSUFSQ0FEY0NLQ0FFUW9DQWdJQ0FnSUNBZ0g4M0FpQWdCQ0FCTmdJY0lBUkJIR29nQWtJQlFmLy8vLzhEUVFFUWRRUkFJQVJCSEdvaEFnd0VDeUFFUVJ4cUlRSWdCaUFISUFNUWtBWUxJZ2hGSVFrZ0EwRUNSeUFJY2cwQUFuOGdCaUFIY2tVRVFDQUZLQUlJSWdFZ0FpZ0NDQ0lJSUFFZ0NFZ2JEQUVMSUFaRkJFQWdCU2dDQ0F3QkN5QUNLQUlJQ3lFQlFRQWhDRUVCSVFrTUFRc2dCU2dDQ0NJQklBSW9BZ2dpQ2lBQklBcEtHeUVCQ3lBQVFRRWdBU0FCUVFGTUcwRWZhaUlLUVFWMklnc1FRUTBBUVFBaEFVRUFJQWhySVF4QkFDQUhheUVIUVFBZ0Jtc2hCaUFDS0FJTVFRVjBJQUlvQWdocklRMGdCU2dDREVFRmRDQUZLQUlJYXlFT0EwQWdBU0FMUmtVRVFDQUFLQUlRSUFGQkFuUnFJQVVvQWhBZ0JTZ0NEQ0FPSUFGQkJYUWlEMm9RYUNBR2N5QUNLQUlRSUFJb0Fnd2dEU0FQYWhCb0lBZHpJQU1Ra0FZZ0RITTJBZ0FnQVVFQmFpRUJEQUVMQ3lBQUlBZzJBZ1FnQUNBS1FXQnhOZ0lJSUFCQi8vLy8vd05CQVJDekFocEJBQ0VCSUFrTkFTQUFJQUJDZjBILy8vLy9BMEVCRUhWRkRRRUxJQUFRTlVFZ0lRRUxJQVJCQ0dvZ0JVWUVRQ0FFUVFocUVCc0xJQVJCSEdvZ0FrWUVRQ0FFUVJ4cUVCc0xJQVJCTUdva0FDQUJDLzRGQVFkL0l3QkJNR3NpQlNRQUFrQUNRQ0FBSUFKR0lBQWdBMFp5UlFSQUlBRWdBa1lnQVNBRFJuSU5BU0FBSUFGR0RRSUNRQUpBSUFJb0Fnd2lDQVJBSUFNb0Fnd2lDUTBCQzBFQUlRUWdBRUVBRUlrQkFrQWdBaWdDQ0NJQVFmLy8vLzhIUndSQUlBTW9BZ2dpQTBILy8vLy9CMGNOQVFzZ0FSQTFEQUlMSUFCQi92Ly8vd2RISUFOQmdJQ0FnSGhIY1VVRVFDQUJFRFZCQVNFRURBSUxJQUVnQWhCRUdpQUJRZi8vLy84RFFRRVF6Z0VoQkF3QkN5QUNLQUlFSWdjZ0F5Z0NCSE1oQ2dKQUFrQUNRQUpBQWtBZ0JFRUNhdzRGQUFFRUFnTUVDeUFLSVFZTUF3c2dDa0VCY3lFR0RBSUxRUUVoQmd3QkN5QUhJUVlMSUFVZ0FpZ0NDQ0lITmdJa0lBSW9BaEFoQ3lBRklBZzJBaWdnQlNBTE5nSXNJQVZCQURZQ0lDQUZJQU1vQWdnaUNEWUNFQ0FES0FJUUlRTWdCU0FKTmdJVUlBVWdBellDR0NBRlFRQTJBZ3dDUUNBRlFSeHFJQVZCQ0dvUTB3RkJBRWdFUUNBQVFnQVFNQm9nQVNBRlFSeHFFRVFhREFFTElBQWdCVUVjYWlJSklBVkJDR29pQzBFQklBY2dDR3NpQXlBRFFRRk1HMEVCYWtFQkVKVUJHaUFBUVFFUTBRRWFJQUVnQUNBTFFmLy8vLzhEUVFFUVF4b2dBU0FKSUFGQi8vLy8vd05CQVJEa0FSb0xBa0FnQUNnQ0NDSUhRZi8vLy84SFJnMEFJQUVvQWdoQi8vLy8vd2RHRFFBQ1FDQUJLQUlNUlEwQUFrQUNRQUpBSUFRT0JRQUJBUUVBQVFzZ0JTQUZLQUlRSWdaQkFXczJBaEFnQVNBRlFRaHFFTk1CSVFNZ0JTQUdOZ0lRSUFOQkFFb05BU0FERFFJZ0JFRUVSZzBCSUFBb0FoQWdBQ2dDRENJRElBTkJCWFFnQjJzUW1RSU5BUXdDQ3lBR1JRMEJDeUFBSUFCQ0FVSC8vLy8vQTBFQkVIVWdBU0FCSUFWQkNHcEIvLy8vL3dOQkFSRGtBWEpCSUhFTkFRc2dBU0FCS0FJRUlBSW9BZ1J6TmdJRUlBQWdDallDQkNBQlFmLy8vLzhEUVFFUXpnRWhCQXdCQ3lBQUVEVWdBUkExUVNBaEJBc2dCVUV3YWlRQUlBUVBDMEhEL1FCQjFQd0FRY3dOUWQvU0FCQUFBQXRCc3YwQVFkVDhBRUhORFVIZjBnQVFBQUFMUWZISUFFSFUvQUJCemcxQjM5SUFFQUFBQy9jQkFRUi9Jd0JCSUdzaUJ5UUFBa0FnQWtFQlJnUkFJQUFnQVRVQ0FCQXdJUU1NQVFzZ0JFRUJkQ0FEUVFGcUlnbDJRUUZxUVFGMklRZ2dCaUFEUVJSc2FpSUtLQUlNUlFSQUlBb2dCU0FJUWYvLy8vOERRUUVRL0FJaUF3MEJDeUFBSUFFZ0NFRUNkR29nQWlBSWF5QUpJQVFnQlNBR0VPVURJZ01OQUNBQUlBQWdDa0gvLy8vL0EwRUJFRU1pQXcwQUlBQW9BZ0FoQWlBSFFnQTNBaGdnQjBLQWdJQ0FnSUNBZ0lCL053SVFJQWNnQWpZQ0RDQUhRUXhxSUFFZ0NDQUpJQVFnQlNBR0VPVURJZ05GQkVBZ0FDQUFJQWRCREdwQi8vLy8vd05CQVJETEFTRURDeUFIUVF4cUVCc0xJQWRCSUdva0FDQURDNllCQVFWL1FYOGhCZ0pBSUFFb0FnQWlCRUVBU0FSQUlBQW9BZ0FpQlNnQ0FDQUFLQUlRSUFBb0Fnd2lBMEVCYWlJSElBTkJBMnhCQVhZaUF5QURJQWRJR3lJRFFRSjBJQVVvQWdRUkFRQWlCVVVOQVNBQUlBVTJBaEFnQlNBRElBQW9BZ3dpQm1zaUIwRUNkR29nQlNBR1FRSjBFSndCSUFBZ0F6WUNEQ0FFSUFkcUlRUUxJQUFvQWhBZ0JFRUNkR29nQWpZQ0FDQUJJQVJCQVdzMkFnQkJBQ0VHQ3lBR0MzWUJBbjhnQVNBQkxRQUFRWHh4UVFGeUlnUTZBQUFnQVNBQ0xRQU1RUUowUVFSeElBUkJlWEZ5SWdRNkFBQWdBU0FFUVhWeElBSXRBQXhCQW5SQkNIRnlJZ1E2QUFBZ0FpMEFEQ0VGSUFFZ0F6c0JBaUFCSUFSQkRYRWdCVUVCZEVId0FYRnlPZ0FBSUFFZ0FDQUNLQUlBRUJnMkFnUUx5d0lCQTM4Z0FFR1lBeEJmSWdZRVFDQUdJQUEyQWdBZ0JrRi9OZ0lJSUFZZ0FUWUNCQ0FHSUFaQkVHb2lCellDRkNBR0lBYzJBaEFnQVFSQUlBRW9BaEFpQnlBR1FSaHFJZ2cyQWdRZ0JpQUJRUkJxTmdJY0lBWWdCellDR0NBQklBZzJBaEFnQmlBQkxRQnVPZ0J1SUFZZ0FTZ0N2QUUyQWd3TElBWWdBellDTENBR0lBSTJBaUFnQUNnQ0VDRUJJQVpDQURjQ2lBSWdCa0lBTndLQUFpQUdJQUUyQXBRQ0lBWkJmellDbUFJZ0JrRTdOZ0tRQWlBR1FRQTJBbkFnQmtHUUFXcEIvd0ZCS0JBckdpQUdRb1NBZ0lBUU53TEVBU0FHSUFaQjBBRnFOZ0xNQVNBR1FuODNBdEFCSUFaQmZ6WUM4QUVnQmtLQWdJQ0FjRGNDdkFFZ0FDQUVFS29CSVFFZ0JpQUZOZ0x3QWlBR0lBRTJBdXdDSUFBb0FoQWhBQ0FHUWdBM0F2d0NJQVpDQURjQzlBSWdCaUFBTmdLSUF5QUdRVHMyQW9RRElBWWdCVFlDbkFJTElBWUxMQUVCZndKQUlBR25LQUlnSWdORkRRQWdBeWtEQUNJQlFvQ0FnSUJnVkEwQUlBQWdBYWNnQWhFQUFBc0xaUUVDZnlBQklBRW9BZ0JCQVdzaUFqWUNBQUpBSUFKRkJFQWdBU2dDQkVVTkFTQUJLQUlRSWdJZ0FTZ0NGQ0lETmdJRUlBTWdBallDQUNBQlFnQTNBaEFnQUVFUWFpQUJJQUFvQWdRUkFBQUxEd3RCNGh4QnJ2d0FRY2JsQWtHMDhRQVFBQUFMdkFRREEzd0Rmd0orQW53Q1FDQUFFTEFDUWY4UGNTSUZSQUFBQUFBQUFKQThFTEFDSWdSclJBQUFBQUFBQUlCQUVMQUNJQVJyU1FSQUlBVWhCQXdCQ3lBRUlBVkxCRUFnQUVRQUFBQUFBQUR3UDZBUEMwRUFJUVJFQUFBQUFBQUFrRUFRc0FJZ0JVc05BRVFBQUFBQUFBQUFBQ0FBdlNJSFFvQ0FnSUNBZ0lCNFVRMEJHa1FBQUFBQUFBRHdmeEN3QWlBRlRRUkFJQUJFQUFBQUFBQUE4RCtnRHdzZ0IwSUFVd1JBUkFBQUFBQUFBQUFRRUl3R0R3dEVBQUFBQUFBQUFIQVFqQVlQQzBHQUNDc0RBQ0FBb2tHSUNDc0RBQ0lCb0NJQ0lBR2hJZ0ZCbUFnckF3Q2lJQUZCa0FnckF3Q2lJQUNnb0NJQklBR2lJZ0FnQUtJZ0FVRzRDQ3NEQUtKQnNBZ3JBd0Nnb2lBQUlBRkJxQWdyQXdDaVFhQUlLd01Bb0tJZ0FyMGlCNmRCQkhSQjhBOXhJZ1ZCOEFocUt3TUFJQUdnb0tBaEFTQUZRZmdJYWlrREFDQUhRaTJHZkNFSUlBUkZCRUFDZkNBSFFvQ0FnSUFJZzFBRVFDQUlRb0NBZ0lDQWdJQ0lQMzIvSWdBZ0FhSWdBS0JFQUFBQUFBQUFBSCtpREFFTElBaENnSUNBZ0lDQWdQQS9mTDhpQWlBQm9pSUJJQUtnSWdORUFBQUFBQUFBOEQ5akJId2pBRUVRYXlJRUlRWWdCRUtBZ0lDQWdJQ0FDRGNEQ0NBR0lBUXJBd2hFQUFBQUFBQUFFQUNpT1FNSVJBQUFBQUFBQUFBQUlBTkVBQUFBQUFBQThEK2dJZ0FnQVNBQ0lBT2hvQ0FEUkFBQUFBQUFBUEEvSUFDaG9LQ2dSQUFBQUFBQUFQQy9vQ0lBSUFCRUFBQUFBQUFBQUFCaEd3VWdBd3RFQUFBQUFBQUFFQUNpQ3c4TElBaS9JZ0FnQWFJZ0FLQUxDeDRBSUFFb0FnQkJCRWNFUUNBQUlBRkJDR29RL2dJZ0FVRUVOZ0lBQ3d2ekFnRUZmeUFCSUFGQktHb2lCallDTENBQklBWTJBaWdnQVNBQ3B5SUhLQUlnSWdZdEFCQTJBamdnQVNBR0tBSVVOZ0l3SUFFZ0FFRUJJQVl2QVM0Z0JpOEJLQ0lBSUFRZ0FDQUVTaHNpQ0NBR0x3RXFhbW9pQUNBQVFRRk1HMEVEZEJBcElnQTJBaUFnQUVVRVFFRi9Ed3NnQWtJZ2lLZEJkVThFUUNBSElBY29BZ0JCQVdvMkFnQUxJQUVnQWpjREdDQURRaUNJcDBGMVR3UkFJQU9uSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dBU0FFTmdJSUlBRWdBemNEQUNBQklBZzJBalFnQVNBQUlBaEJBM1JxSWdjMkFpUWdBU0FISUFZdkFTb2lCa0VEZEdvMkFqeEJBQ0VCSUFSQkFDQUVRUUJLR3lFSEEwQWdBU0FIUndSQUlBVWdBVUVEZENJSmFpa0RBQ0lDUWlDSXAwRjFUd1JBSUFLbklnb2dDaWdDQUVFQmFqWUNBQXNnQUNBSmFpQUNOd01BSUFGQkFXb2hBUXdCQ3dzZ0JDQUdJQWhxSWdFZ0FTQUVTQnNoQVFOL0lBRWdCRVlFZjBFQUJTQUFJQVJCQTNScVFvQ0FnSUF3TndNQUlBUkJBV29oQkF3QkN3c0xNd0FnQUNBQ1FRRVE2Z0VpQUVVRVFFS0FnSUNBNEFBUEN5QUFRUkJxSUFFZ0FrRUJkQkFmR2lBQXJVS0FnSUNBa0grRUM0WUJBZ0YrQW44Z0FTa0RHQ0lEUW9DQWdJQmdXZ1JBSUFBZ0E2Y2dBaEVBQUFzZ0FTa0RBQ0lEUW9DQWdJQmdXZ1JBSUFBZ0E2Y2dBaEVBQUFzQ1FDQUJLQUk4SWdWRkRRQWdBU2dDSUNFRUEwQWdCQ0FGVHcwQklBUXBBd0FpQTBLQWdJQ0FZRm9FUUNBQUlBT25JQUlSQUFBZ0FTZ0NQQ0VGQ3lBRVFRaHFJUVFNQUFzQUN3dlZDUUlCZmdWL0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBUzBBQkVFUGNRNEdBQUVFQWdNRkNBc2dBQ0FCS0FJUUlnWWdBaEVBQUNBR1FUQnFJUWNEUUNBRUlBWW9BaUJPUlFSQUFrQWdCeWdDQkVVTkFDQUJLQUlVSUFSQkEzUnFJUVVDUUFKQUFrQUNRQ0FIS0FJQVFSNTJRUUZyRGdNQUFRSURDeUFGS0FJQUlnZ0VRQ0FBSUFnZ0FoRUFBQXNnQlNnQ0JDSUZSUTBESUFBZ0JTQUNFUUFBREFNTElBVW9BZ0FpQlMwQUJVRUJjVVVOQWlBQUlBVWdBaEVBQUF3Q0N5QUFJQVVvQWdCQmZIRWdBaEVBQUF3QkN5QUZLUU1BSWdOQ2dJQ0FnR0JVRFFBZ0FDQURweUFDRVFBQUN5QUVRUUZxSVFRZ0IwRUlhaUVIREFFTEN5QUJMd0VHSWdSQkFVWU5CU0FBS0FKRUlBUkJHR3hxS0FJTUlnUkZEUVVnQUNBQnJVS0FnSUNBY0lRZ0FpQUVFUkVBRHdzRFFDQUJLQUk0SUFSS0JFQWdBU2dDTkNBRVFRTjBhaWtEQUNJRFFvQ0FnSUJnV2dSQUlBQWdBNmNnQWhFQUFBc2dCRUVCYWlFRURBRUxDeUFCS0FJd0lnRkZEUVFnQUNBQklBSVJBQUFQQ3lBQkxRQUZRUUZ4UlEwRUlBRW9BaEFwQXdBaUEwS0FnSUNBWUZRTkF3d0dDeUFCS0FJZ0JFQWdBQ0FCUVNocUlBSVE3d01MSUFFcEF4QWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFcEF4Z2lBMEtBZ0lDQVlGUU5BZ3dGQ3lBQktBSXNJZ0ZGRFFFZ0FDQUJJQUlSQUFBUEN5QUJRZmdCYWlFRUlBRkI5QUZxSVFjRFFDQUhJQVFvQWdBaUJVY0VRRUVBSVFRRFFDQUVJQVVvQWhoT1JRUkFBa0FnQlNnQ0ZDQUVRUlJzYWlJR0tBSUlEUUFnQmlnQ0JDSUdSUTBBSUFBZ0JpQUNFUUFBQ3lBRVFRRnFJUVFNQVFzTElBVXBBemdpQTBLQWdJQ0FZRm9FUUNBQUlBT25JQUlSQUFBTElBVXBBMEFpQTBLQWdJQ0FZRm9FUUNBQUlBT25JQUlSQUFBTElBVXBBMWdpQTBLQWdJQ0FZRm9FUUNBQUlBT25JQUlSQUFBTElBVXBBMkFpQTBLQWdJQ0FZRm9FUUNBQUlBT25JQUlSQUFBTElBVkJCR29oQkF3QkN3c2dBU2tEd0FFaUEwS0FnSUNBWUZvRVFDQUFJQU9uSUFJUkFBQUxJQUVwQThnQklnTkNnSUNBZ0dCYUJFQWdBQ0FEcHlBQ0VRQUFDeUFCS1FPd0FTSURRb0NBZ0lCZ1dnUkFJQUFnQTZjZ0FoRUFBQXNnQVNrRHVBRWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMUVFBaEJDQUJLUU9vQVNJRFFvQ0FnSUJnV2dSQUlBQWdBNmNnQWhFQUFBc0RRQUpBSUFSQkNFWUVRRUVBSVFRRFFDQUVJQUFvQWtCT0RRSWdBU2dDS0NBRVFRTjBhaWtEQUNJRFFvQ0FnSUJnV2dSQUlBQWdBNmNnQWhFQUFBc2dCRUVCYWlFRURBQUxBQXNnQVNBRVFRTjBhaWtEV0NJRFFvQ0FnSUJnV2dSQUlBQWdBNmNnQWhFQUFBc2dCRUVCYWlFRURBRUxDeUFCS1FPWUFTSURRb0NBZ0lCZ1dnUkFJQUFnQTZjZ0FoRUFBQXNnQVNrRG9BRWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFcEExQWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFcEEwQWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFcEEwZ2lBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFcEF6Z2lBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFcEF6QWlBMEtBZ0lDQVlGb0VRQ0FBSUFPbklBSVJBQUFMSUFFb0FpUWlBVVVOQUNBQUlBRWdBaEVBQUFzUEMwSHgrZ0JCcnZ3QVFZNHNRZURRQUJBQUFBc1FBUUFMSUFBZ0E2Y2dBaEVBQUF0OEFRSi9JQUJCSUJBcElnSUVRQ0FDUVFFMkFnQWdBa0tBZ0lDQXdBQkNnSUNBZ0RBZ0FSczNBeGdnQWlBQ1FSaHFOZ0lRSUFJZ0FpMEFCVUVCY2pvQUJTQUFLQUlRSVFBZ0FrRURPZ0FFSUFBb0FsQWlBU0FDUVFocUlnTTJBZ1FnQWlBQVFkQUFhallDRENBQ0lBRTJBZ2dnQUNBRE5nSlFDeUFDQzBvQkFuOENRQ0FBTFFBQUlnSkZJQUlnQVMwQUFDSURSM0lOQUFOQUlBRXRBQUVoQXlBQUxRQUJJZ0pGRFFFZ0FVRUJhaUVCSUFCQkFXb2hBQ0FDSUFOR0RRQUxDeUFDSUFOckMzc0JBbjhqQUVHUUFXc2lCQ1FBUWNDV0FTRUZBa0FDUUFKQUFrQWdBVUVCYWc0RkF3SUNBQUVDQzBHQmxnRWhCUXdCQzBId01pRUZDeUFBS0FJUUlBUkIwQUJxSUFNUWtBRWhBU0FFSUFBb0FoQWdCRUVRYWlBQ0tBSUVFSkFCTmdJRUlBUWdBVFlDQUNBQUlBVWdCQkNBQWdzZ0JFR1FBV29rQUF1SUFRRUNmeU1BUVJCcklnVWtBQ0FGUVFBMkFnd2dCVUlBTndJRUlBQWdBU0FDSUFNZ0JDQUZRUVJxRUs0RklRSWdCU2dDRENJQlFRQWdBVUVBU2hzaEF5QUZLQUlFSVFFRFFDQURJQVpHUlFSQUlBQWdBU0FHUVFOMGFpZ0NCQkFUSUFaQkFXb2hCZ3dCQ3dzZ0FDZ0NFQ0lBUVJCcUlBRWdBQ2dDQkJFQUFDQUZRUkJxSkFBZ0FndWxBUUVGZnlNQVFSQnJJZ01rQUVGL0lRSUNRQ0FBS0FJVURRQWdBQ2dDQUNBQUtBSUVJQUZCQVhSQkVHb2dBMEVNYWhDb0FTSUVSUVJBSUFBUWd3TU1BUXNnQkVFUWFpRUZJQUFvQWdnaEFpQURLQUlNSVFZRFFDQUNRUUJNUlFSQUlBVWdBa0VCYXlJQ1FRRjBhaUFDSUFWcUxRQUFPd0VBREFFTEN5QUFRUUUyQWhBZ0FDQUVOZ0lFSUFBZ0JrRUJkaUFCYWpZQ0RFRUFJUUlMSUFOQkVHb2tBQ0FDQzBZQkFYOGdBU0FCS0FJQUlnSkJBV3MyQWdBZ0FrRUJUQVJBSUFFcEFnUkNnSUNBZ0lDQWdJREFBRm9FUUNBQUlBRVFvZ01QQ3lBQVFSQnFJQUVnQUNnQ0JCRUFBQXNMTWdBZ0FFR01BV3NpQUVFblQwS1BnUCsvNWdrZ0FLMklRZ0dEVUhKRkJFQWdBRUVDZEVIQS9nRnFLQUlBRHdzUUFRQUxjUUVCZmdKQUlBQWdBU0FBSUFNUXFnRWlBeUFCUVFBUUZDSUVRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFJQUlnQXlBQ1FRQVFGQ0lDUW9DQWdJQndneUlFUW9DQWdJQXdVU0FFUW9DQWdJRGdBRkZ5RFFFZ0FDQUJJQU1nQWhDeEJRd0JDeUFBSUFRUUR3c2dBQ0FERUJNTGl3a0JDMzhqQUVFUWF5SUlKQUFDUUFKQUFrQUNRQUpBQWtBRFFDQUJLQUlRSWdOQk1Hb2hCaUFESUFNb0FoZ2dBbkZCZjNNaUNVRUNkR29vQWdBaEJFRUFJUU1EUUNBRUJFQWdDQ0FHSUFSQkFXc2lDa0VEZEdvaUJUWUNEQ0FGS0FJQUlRY2dBaUFGS0FJRVJnUkFRUUFoQkNBSFFZQ0FnQ0J4UlEwSlFYOGhCQ0FBSUFFZ0NFRU1haERVQVEwSklBRW9BaEFoQWdKQUlBTUVRQ0FDSUFNZ0JtdEJBM1ZCQUNBREcwRURkR29pQTBFd2FpQURLQUl3UVlDQWdHQnhJQWdvQWd3b0FnQkIvLy8vSDNGeU5nSUFJQWdvQWd3aENRd0JDeUFDSUFsQkFuUnFJQWdvQWd3aUNTZ0NBRUgvLy84ZmNUWUNBQXRCQVNFRUlBSWdBaWdDSkVFQmFqWUNKQ0FBS0FJUUlBRW9BaFFnQ2tFRGRHb2lBeUFKS0FJQVFScDJFT3dGSUFBZ0NDZ0NEQ2dDQkJBVElBZ29BZ3dpQlNBRktBSUFRZi8vL3g5eE5nSUFJQWdvQWd4QkFEWUNCQ0FEUW9DQWdJQXdOd01BSUFJb0FpUWlBMEVJU0EwSklBTWdBaWdDSUVFQmRra05DU0FCS0FJUUlnY3RBQkFOQlVFQ0lBY29BaUFnQnlnQ0pHc2lBaUFDUVFKTUd5SUtJQWNvQWh4TERRWWdCeWdDR0VFQmFpRUVBMEFnQkNJQ1FRRjJJZ1FnQ2s4TkFBc2dBQ0FLUVFOMElnMGdBa0VDZENJRmFrRXdhaEFwSWdSRkRRZ2dBa0VCYXlFTElBY29BZ2dpQWlBSEtBSU1JZ00yQWdRZ0F5QUNOZ0lBSUFkQ0FEY0NDQ0FFSUFWcUlBZEJNQkFmSVFZZ0FDZ0NFQ0lDS0FKUUlnTWdCa0VJYWlJSk5nSUVJQVlnQWtIUUFHbzJBZ3dnQmlBRE5nSUlJQUlnQ1RZQ1VFRUFJUU1nQkVFQUlBVVFLeG9nQjBFd2FpRUVJQVpCTUdvaEFpQUJLQUlVSVF4QkFDRUpBMEFnQ1NBR0tBSWdJZ1ZQUlFSQUlBUW9BZ1FpQlFSQUlBSWdCVFlDQkNBQ0lBUW9BZ0JCZ0lDQVlIRWlCU0FDS0FJQVFmLy8veDl4Y2pZQ0FDQUNJQVVnQmlBRUtBSUVJQXR4UVg5elFRSjBhaUlGS0FJQVFmLy8veDl4Y2pZQ0FDQUZJQU5CQVdvaUJUWUNBQ0FNSUFOQkEzUnFJQXdnQ1VFRGRHb3BBd0EzQXdBZ0JTRURJQUpCQ0dvaEFnc2dDVUVCYWlFSklBUkJDR29oQkF3QkN3c2dBeUFGSUFZb0FpUnJSdzBISUFaQkFEWUNKQ0FHSUFvMkFod2dCaUFMTmdJWUlBWWdBellDSUNBQklBWTJBaEFnQUNnQ0VDSUNRUkJxSUFjZ0J5Z0NHRUYvYzBFQ2RHb2dBaWdDQkJFQUFFRUJJUVFnQUNBQktBSVVJQTBRaVFJaUFFVU5DU0FCSUFBMkFoUU1DUVVnQjBILy8vOGZjU0VFSUFVaEF3d0NDd0FMQzBFQklRUWdBUzBBQlNJRFFRUnhSUTBHSUFOQkNIRkZEUUVnQUNBSVFRaHFJQUlRckFGRkRRWWdDQ2dDQ0NJRElBRW9BaWdpQlU4TkJpQUJMd0VHSWdSQkNFWWdCRUVDUm5KRkJFQkJBQ0VFREFjTElBVkJBV3NnQTBZRVFDQUFJQUVvQWlRZ0EwRURkR29wQXdBUUR5QUJJQU0yQWlnTUJnc2dBQ0FCRUpJRFJRMEFDMEYvSVFRTUJRc2dBQ2dDRUNnQ1JDQUJMd0VHUVJoc2FpZ0NGQ0lEUlEwRUlBTW9BZ2dpQTBVTkJDQUFJQUd0UW9DQWdJQndoQ0FDSUFNUkZRQWhCQXdFQzBIaStnQkJydndBUWEwalFjRTZFQUFBQzBHLzN3QkJydndBUWJFalFjRTZFQUFBQzBHcWtRRkJydndBUWRZalFjRTZFQUFBQzBFQklRUUxJQWhCRUdva0FDQUVDMEVBSUFBZ0FpQUJRUUJCQUJBaElnRkMvLy8vLzI5V0lBRkNnSUNBZ0hDRFFvQ0FnSURnQUZGeVJRUkFJQUFnQVJBUElBQVFKRUtBZ0lDQTRBQVBDeUFCQzY0QkFnRitBWDhDUUNBQUtBSVFLQUtNQVNJRFJTQUJRdi8vLy8vLy8vOFBWbklOQUNBREtBSW9RUVJ4UlEwQUlBRkNnSUNBZ0FoVUJFQWdBUThMUW9DQWdJREFmaUFCdWIwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHdzhMSUFBUWx3RWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQUtuUVFScUlBRVFNRVVFUUNBQ0R3c2dBQ0FDRUE4Z0FCQjhDMEtBZ0lDQTRBQUxVZ0VDZnlNQVFSQnJJZ0lrQUFKL0FrQWdBa0VNYWlBQkVMMEZSUTBBSUFJb0Fnd2lBMEVBU0EwQUlBQWdBUkQyQXlBRFFZQ0FnSUI0Y2d3QkN5QUFJQUZCQVJDbkFnc2hBU0FDUVJCcUpBQWdBUXVRQVFJRGZ3RitJQUVvQWhRaUJTa0RBQ0lIUXYvLy8vOFBWaUFCS0FJb0lnWkJBV29pQkNBSHAwMXlSUVJBSUFFb0FoQXRBRE5CQ0hGRkJFQWdBQ0FDRUE4Z0FDQURRVEFRd0FJUEN5QUZJQVN0TndNQUN3SkFJQVFnQVNnQ0lFME5BQ0FBSUFFZ0JCQ3NCVVVOQUNBQUlBSVFEMEYvRHdzZ0FTZ0NKQ0FHUVFOMGFpQUNOd01BSUFFZ0JEWUNLRUVCQzYwQkFnWi9BWDRDUUNBQktRSlVJZ2luUWY4QmNRMEFJQUVnQ0VLQWZvTkNBWVEzQWxRRFFDQUJLQUlVSUFKTUJFQkJBQThMSUFFb0FoQWdBa0VEZEdvaUJ5Z0NBQ0VEUVg4aEJpQUFJQUVvQWdRUWtRUWlCRVVOQVFKQUlBQWdBeENSQkNJRFJRUkFRUUFoQlF3QkN5QUFJQVFnQXhESkJTRUZJQUFnQkJCVUlBTWhCQXNnQUNBRUVGUWdCVVVOQVNBSElBVTJBZ1FnQWtFQmFpRUNJQUFnQlJEK0EwRUFUZzBBQ3dzZ0Jnc3pBUUYvSXdCQjBBQnJJZ01rQUNBRElBQW9BaEFnQTBFUWFpQUJFSkFCTmdJQUlBQWdBaUFERUlBQ0lBTkIwQUJxSkFBTE9nRUJmeUFBS0FJUUlnTWdBU0FDRUtjQ0lnRkZCRUFnQUJCOFFvQ0FnSURnQUE4TElBTW9BamdnQVVFQ2RHbzFBZ0JDZ0lDQWdJQi9oQXVPQmdJRGZ3RitJd0JCRUdzaUNDUUFBa0FDUUFKQUFrQUNRQ0FCTFFBRklnZEJCSEZGRFFBZ0FTOEJCaUlKUVFKR0JFQUNRQ0FIUVFoeEJFQUNRQ0FDUVFCSUJFQWdDQ0FDUWYvLy8vOEhjU0lKTmdJTUlBa2dBU2dDS0VjTkFTQUhRUUZ4UlEwR0lBWkJnREJ4SUFZZ0JrRUlkbkZCQjNGQkIwZHlEUUVnQTBJZ2lLZEJkVThFUUNBRHB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFBZ0FTQURJQVlRL1FNaEJ3d0pDeUFBSUFoQkRHb2dBaENzQVVVTkJBdEJmeUVISUFBZ0FSQ1NBMFVOQVF3SEN5QUFJQWhCREdvZ0FoQ3NBVVVOQWdzZ0FDQUlRUWhxSUFFb0FoUWlDU2tEQUJCM0dpQUlLQUlNUVFGcUlnY2dDQ2dDQ0UwTkFTQUJLQUlRTFFBelFRaHhSUVJBSUFBZ0JrRXdFTUFDSVFjTUJnc2dBQ0FKSUFkQkFFNEVmaUFIclFWQ2dJQ0FnTUIrSUFlNHZTSUtRb0NBZ0lEQWdZRDgvd0I5SUFwQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hBZ0RBRUxJQWxCRld0Qi8vOERjVUVLVFFSQUlBQWdBaENlQXlJSFJRMEJJQWRCQUVnTkJDQUFJQVpCbng4UWJ5RUhEQVVMSUFaQmdJQUljUTBBSUFBb0FoQW9Ba1FnQ1VFWWJHb29BaFFpQjBVTkFDQUJyVUtBZ0lDQWNJUWhDaUFIS0FJTUlnY0VRQ0FBSUFvZ0FpQURJQVFnQlNBR0lBY1JLZ0FoQnd3RkN5QUFJQW9RbVFFaUIwRUFTQTBESUFkRkRRRUxJQUV0QUFWQkFYRU5BUXNnQUNBR1FmZm9BQkJ2SVFjTUFnc2dBQ0FCSUFJZ0JrRUZjVUVRY2lBR1FRZHhJQVpCZ0RCeElnSWJFSG9pQVVVTkFDQUNCRUFnQVVFQU5nSUFBa0FnQmtHQUVIRkZEUUFnQUNBRUVEaEZEUUFnQktjaEFpQUVRaUNJcDBGMVR3UkFJQUlnQWlnQ0FFRUJhallDQUFzZ0FTQUNOZ0lBQ3lBQlFRQTJBZ1JCQVNFSElBWkJnQ0J4UlEwQ0lBQWdCUkE0UlEwQ0lBV25JUUFnQlVJZ2lLZEJkVThFUUNBQUlBQW9BZ0JCQVdvMkFnQUxJQUVnQURZQ0JBd0NDd0pBSUFaQmdNQUFjUVJBSUFOQ0lJaW5RWFZQQkVBZ0E2Y2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBQklBTTNBd0FNQVFzZ0FVS0FnSUNBTURjREFBdEJBU0VIREFFTFFYOGhCd3NnQ0VFUWFpUUFJQWNMUkFFQmZ5TUFRUkJySWdVa0FDQUZJQUVnQWlBRElBUkNnSUNBZ0lDQWdJQ0FmNFVRY0NBRktRTUFJUUVnQUNBRktRTUlOd01JSUFBZ0FUY0RBQ0FGUVJCcUpBQUxDd0FnQUNBQlFRRVFqZ1FMbHdFQkFuOUJpd0VoQWdKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRRUVISUFGQ0lJaW5JZ01nQTBFSGEwRnVTUnRCQzJvT0V3RUxBQWtFQ2dvS0Nnb0ZBZ01JQmdvS0NnSUtDMEdNQVE4TFFZMEJEd3RCeGdBUEMwSEhBQThMUWNnQUR3c2dBYWNzQUFWQkFFNE5BUXRCeFFBUEMwRWJJUUlnQUNBQkVEZ05Bd3RCeVFBUEMwSEtBQThMUWN3QUlRSUxJQUlMTlFFQ2Z3SkFJQUJDZ0lDQWdIQlVEUUFnQUtjaUJDOEJCa0VNUncwQUlBUW9BaVFnQVVjTkFDQUVMZ0VxSUFKR0lRTUxJQU1MbXdRQ0EzOEJmaU1BUVNCcklnY2tBQ0FCUWlDSXAwRjFUd1JBSUFHbklnWWdCaWdDQUVFQmFqWUNBQXNDUUFKQUFrQUNRQUpBQTBBQ1FBSkFBa0FnQWFjaUJpMEFCVUVFY1VVTkFDQUFLQUlRS0FKRUlBWXZBUVpCR0d4cUtBSVVJZ2hGRFFBZ0NDZ0NHQ0lJUlEwQUlBQWdBU0FDSUFNZ0JDQUZJQWdSTFFBaEJnd0JDeUFBSUFjZ0JpQUNFRXdpQmtFQVRnMEJDeUFBSUFFUUR3d0ZDd0pBSUFZRVFDQUhMUUFBUVJCeEJFQWdBQ0FIS1FNWUlnbW5RUUFnQ1VLQWdJQ0FjSU5DZ0lDQWdEQlNHeUFFSUFNZ0JSQ0xBeUVHSUFBZ0J5a0RFQkFQSUFBZ0J5a0RHQkFQSUFBZ0FSQVBEQWdMSUFBZ0J5a0RDQkFQSUFjdEFBQkJBbkVOQVNBQUlBRVFEd3dEQ3lBQUlBRVFqQUlpQVVLQWdJQ0FjSU5DZ0lDQWdDQlNEUUVMQ3lBQUlBRVFEeUFFUXYvLy8vOXZXQVJBSUFBZ0F4QVBJQUFnQlVIME1CQnZJUVlNQlFzZ0FDQUhJQVNuSWdnZ0FoQk1JZ1pCQUVnTkF5QUdSUTBDSUFjdEFBQkJFSEVFUUNBQUlBY3BBeEFRRHlBQUlBY3BBeGdRRHlBQUlBTVFEeUFBSUFWQnA5RUFFRzhoQmd3RkN5QUFJQWNwQXdnUUR5QUhMUUFBUVFKeFJRMEFJQWd2QVFaQkMwY05BUXNnQUNBREVBOGdBQ0FGSUFJUXdBSWhCZ3dEQ3lBQUlBUWdBaUFEUW9DQWdJQXdRb0NBZ0lBd1FZREFBQkJ0SVFZTUFRc2dBQ0FJSUFJZ0EwS0FnSUNBTUVLQWdJQ0FNQ0FGUVlmT0FISVFnUVFoQmdzZ0FDQURFQThMSUFkQklHb2tBQ0FHQzIwQkFuOENRQ0FCUW9DQWdJQndWQTBBSUFHbklnTXZBUVlRN2dGRkRRQWdBeWdDSUMwQUVVRUljVVVOQUNBREtBSW9JZ1FFUUNBQUlBU3RRb0NBZ0lCd2hCQVBDMEVBSVFBZ0FrS0FnSUNBY0ZvRVFDQUNweUlBSUFBb0FnQkJBV28yQWdBTElBTWdBRFlDS0FzTERBQWdBRUgyMGdCQkFCQVZDOEVDQWdaL0FYNGpBRUVRYXlJR0pBQUNRQ0FDUXYvLy8vOXZXQVJBSUFCQnZ6RkJBQkFWREFFTElBQWdCa0VNYWlBQ0VOWUJEUUFnQmlnQ0RDSUVRWUdBQkU4RVFDQUFRY0F6UVFBUVJnd0JDeUFBUVFFZ0JDQUVRUUZORzBFRGRCQmZJZ1ZGRFFBQ1FBSkFJQUtuSWdjdkFRWWlDRUVJUnlBSVFRSkhjUTBBSUFjdEFBVkJDSEZGRFFBZ0JDQUhLQUlvUncwQUEwQWdBeUFFUmcwQ0lBTkJBM1FpQ0NBSEtBSWthaWtEQUNJQ1FpQ0lwMEYxVHdSQUlBS25JZ0FnQUNnQ0FFRUJhallDQUFzZ0JTQUlhaUFDTndNQUlBTkJBV29oQXd3QUN3QUxBMEFnQXlBRVJnMEJJQUFnQWlBREVMQUJJZ2xDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FGSUFOQkEzUnFJQWszQXdBZ0EwRUJhaUVEREFFTEN5QUFJQVVnQXhDYkEwRUFJUU1NQVFzZ0FTQUVOZ0lBSUFVaEF3c2dCa0VRYWlRQUlBTUxuUUlDQW44QmZnSitRb0NBZ0lEZ0FDQUFFSHNOQUJvQ1FBSkFJQUZDZ0lDQWdIQmFCRUFnQWFjaUJ5MEFCVUVRY1VVRVFDQUFRYUkrUVFBUUZVS0FnSUNBNEFBUEN5QUZRUUZ5SVFZZ0J5OEJCaUlGUVExR0RRSWdBQ2dDRUNnQ1JDQUZRUmhzYWlnQ0VDSUZEUUVMSUFCQm04d0FRUUFRRlVLQWdJQ0E0QUFQQ3lBQUlBRWdBaUFESUFRZ0JpQUZFUllBRHdzZ0J5Z0NJQzBBRVVFRWNRUkFJQUFnQVVLQWdJQ0FNQ0FDSUFNZ0JDQUdFTmdCRHd0Q2dJQ0FnT0FBSUFBZ0FrRUJFR1VpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2lBQUlBRWdDQ0FDSUFNZ0JDQUdFTmdCSWdGQy8vLy8vMjlZSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkp4UlFSQUlBQWdDQkFQSUFFUEN5QUFJQUVRRHlBSUN3dm1BUUVEZnlBQlFSeHFJUVFnQVVFWWFpRUZBMEFnQlNBRUtBSUFJZ1JIQkVBQ1FDQUVRUUpyTHdFQUlBSkhEUUFnQkVFRGF5MEFBRUVCZGtFQmNTQURSdzBBSUFSQkNHc2lBQ0FBS0FJQVFRRnFOZ0lBSUFBUEN5QUVRUVJxSVFRTUFRc0xJQUJCSUJBcElnQkZCRUJCQUE4TElBQkJBVFlDQUNBQUlBSTdBUVlnQUNBQUxRQUZRZndCY1NBRFFRRjBRUUp4Y2pvQUJTQUJLQUlZSWdRZ0FFRUlhaUlHTmdJRUlBQWdCVFlDRENBQUlBUTJBZ2dnQVNBR05nSVlJQUZCRUVFVUlBTWJhaWdDQUNFQklBQkNnSUNBZ0RBM0F4Z2dBQ0FCSUFKQkEzUnFOZ0lRSUFBTGl3SUNBWDhCZmdKQUFrQWdBQ0FCcHlJRUx3QVJRUU4yUVFaeFFhN0FBV292QVFBUWRpSUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQU1BUXNDUUNBQUlBVWdCQ0FDSUFNUTFnVWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQVNBRUtBSWNJZ0pCTHlBQ0d5QUVMd0VzRUpZRElBUXZBQkVpQWtFUWNRUkFJQUFnQUNnQ0tFSElBMEg0QWlBQ1FUQnhRVEJHRzJvcEF3QVFSeUlGUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQUNBQlFUc2dCVUVDRUJrYUlBRVBDeUFDUVFGeFJRMENJQUZDZ0lDQWdIQmFCRUFnQWFjaUFpQUNMUUFGUVJCeU9nQUZDeUFBSUFGQk8wRUFRUUJCQWhDVkF4b2dBUThMQ3lBQUlBRVFEMEtBZ0lDQTRBQWhBUXNnQVF0WUFnRi9BWDVDZ0lDQWdDQWhBMEVTSUFGQ0lJaW5JZ0pCQzJvZ0FrRUhhMEZ1U1JzaUFrRVNTMEdmc0JBZ0FuWkJBWEZGY2dSK1FvQ0FnSUFnQlNBQUtBSW9JQUpCQW5SQnNQMEJhaWdDQUVFRGRHb3BBd0FMQzZjREFnRitBMzhqQUVFd2F5SUVKQUJCNVA4QUlRVkNnSUNBZ09BQUlRTUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0JCQnlBQlFpQ0lweUlHSUFaQkIydEJia2tiUVF0cURoTUtDQWtHQUFzTEN3c01CUUVDQXdRTEN3NEhDd3NnQmtGMVNRME1JQUduSWdBZ0FDZ0NBRUVCYWpZQ0FBd01DeUFFSUFFK0FnQWdCRUVRYWlJRlFTQkI5UHNBSUFRUVRob01DZ3NnQUVFRFFRSWdBYWNiRUMwaEF3d0xDeUFBUVFFUUxTRUREQW9MSUFCQnhRQVFMU0VEREFrTElBQWdBVUVBRUpBQ0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUU1NQ1FzZ0FDQUJJQUlRamdRaEF5QUFJQUVRRHd3SUN5QUNCRUFnQmtGMVNRMEhJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FBd0hDeUFBUWVuYUFFRUFFQlVNQndzZ0FDQUJRb0NBZ0lEQWdZRDgvd0I4djBFS1FRQkJBQkNQQWlFRERBWUxJQUFnQVNBQUtBSVFLQUtVQWhFSUFDRUREQVVMSUFBZ0FTQUFLQUlRS0FLd0FoRUlBQ0VEREFRTElBQWdBU0FBS0FJUUtBTE1BaEVJQUNFRERBTUxRZEgvQUNFRkN5QUFJQVVRWWlFRERBRUxJQUVoQXdzZ0JFRXdhaVFBSUFNTFhBRURmeUFBUWZRQmFpRUVJQUFvQXZnQklRTURRQ0FFSUFNaUFrY0VRQ0FDS0FJRUlRTUNRQUpBQWtBZ0FRNERBZ0FCQkFzZ0FpMEFUQTBEREFFTElBSXBBa3hDSUlaQ09JZW5EUUlMSUFBZ0FrRUlheERuQlF3QkN3c0xVQUVEZnlBQUtBTFVBU0FCS0FJVVFTQWdBQ2dDeUFGcmRrRUNkR29oQWdOQUlBSWlBeWdDQUNJRVFTaHFJUUlnQVNBRVJ3MEFDeUFESUFFb0FpZzJBZ0FnQUNBQUtBTFFBVUVCYXpZQzBBRUxNUUlCZndGK0lBQWdBUkF0SWdOQ2dJQ0FnSENEUW9DQWdJRGdBRklFUUNBQUlBTVFzd0VoQWlBQUlBTVFEd3NnQWdzM0FDQUFJQUVnQWlBREFuOUJBQ0FBS0FJUUlnQXRBSWdCRFFBYVFRRWdBQ2dDakFFaUFFVU5BQm9nQUNrRENCQ2pBMFVMRVBBRkMvb0VBUVYvSUFBb0FnQWhBd0pBQWtBRFFDQURMUUFBSVFRZ0F5RUNBa0FEUUNBQ1FRRnFJUU1nQkNJR1FTOUhCRUFnQmtFSmF5SUZRUmRMRFFSQkFTQUZkQ0lGUVkyQWdBUnhEUU1nQlVFU2NVVU5CQ0FCUlEwRERBSUxJQU10QUFBaUFrRXFSZ1JBSUFNaEFnTkFJQUlpQTBFQmFpRUNJQU10QUFFaUJFRU5Sd1JBSUFSRkRRTWdBVUVBSUFSQkNrWWJEUVFnQkVFcVJ3MEJJQU10QUFKQkwwY05BU0FEUVFOcUlRTU1CUXNnQVVVTkFBc01BZ3NMUVM4aEJTQUNRUzlIRFFOQkx5RUVJQUVOQUFOQUFrQUNRQ0FFSWdKQkNtc09CQVFCQVFRQUN5QUNSUTBEQ3lBRExRQUJJUVFnQTBFQmFpRUREQUFMQUFzTFFRb1BDMEU5SVFVQ2Z5QUdRVDFHQkVCQnBuOGdBeTBBQUVFK1JnMEJHZ3dDQ3lBRUlnVVE3d0pGRFFFQ1FBSkFBa0FDUUFKQUlBUWlBVUhsQUdzT0JRRUNCQVFBQXdzQ1FBSkFJQU10QUFCQjdRQnJEZ0lCQUFVTElBSXRBQUlReFFFTkJFRzVmdzhMSUFJdEFBSkI4QUJIRFFNZ0FpMEFBMEh2QUVjTkF5QUNMUUFFUWZJQVJ3MERJQUl0QUFWQjlBQkhEUU1nQWkwQUJoREZBUTBESUFBZ0FrRUdhallDQUVGUER3c2dBeTBBQUVINEFFY05BaUFDTFFBQ1FmQUFSdzBDSUFJdEFBTkI3d0JIRFFJZ0FpMEFCRUh5QUVjTkFpQUNMUUFGUWZRQVJ3MENJQUl0QUFZUXhRRU5BaUFBSUFKQkJtbzJBZ0JCVFE4TElBTXRBQUJCOVFCSERRRWdBaTBBQWtIdUFFY05BU0FDTFFBRFFlTUFSdzBCSUFJdEFBUkI5QUJIRFFFZ0FpMEFCVUhwQUVjTkFTQUNMUUFHUWU4QVJ3MEJJQUl0QUFkQjdnQkhEUUVnQWkwQUNCREZBUTBCUVVjUEN5QUJRZThBUncwQUlBTXRBQUJCNWdCSERRQWdBaTBBQWhERkFRMEFRVnNQQzBHRGZ3c1BDeUFGQzRVSkFnUi9DWDRqQUVIZ0FHc2lCQ1FBUW9DQWdJQXdJUXNnQkVLQWdJQ0FNRGNETUNBRVFvQ0FnSUF3TndNb0lBUkNnSUNBZ0RBM0F4Z2dCQ0FFUWNnQWFpSUdOZ0pBSUFRZ0FFRXZFQzBpQ2pjRE9DQUFJQVpCQUJBOUdpQUVJQUFRUGlJSU53TWdRb0NBZ0lEZ0FDRUpBa0FDUUNBSVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBQ1FBSkFJQUFnQWhBNEJFQWdCQ0FDTndNWURBRUxJQUFnQWhES0FTSUZRUUJJRFFJZ0JVVU5BQ0FFSUFBUVBpSU5Od01vSUExQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQWlBQUlBUkJDR29nQWhBOERRSWdCQ2tEQ0NJSlFnQWdDVUlBVlJzaEVBTkFJQXdnRUZFTkFTQUVJQUFnQWlBTUVITWlDRGNERUVLQWdJQ0E0QUFoQ1NBSVFvQ0FnSUJ3Z3lJUFFvQ0FnSURnQUZFTkF3SkFBa0FDUUNBSVFvQ0FnSUJ3V2dSQUlBaW5Md0VHUWY3L0EzRkJCRWNOQWlBRUlBQWdDQkEzSWdnM0F4QWdDRUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQVlMSUFoQ0lJaW5JZ1ZCQUNBRlFRdHFRUkpKRzBVRVFDQUVJQUFnQ0JBM0lnZzNBeEFnQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBHREFFTElBOUNnSUNBZ0pCL1VnMEJDeUFBSUExQkFTQUVRUkJxRU5ZRElnOUNnSUNBZ1BBQWcwS0FnSUNBNEFCUkJFQWdBQ0FJRUE4TUJnc2dBQ0FQRUNZTkFDQUFJQTBnRGlBSUVJWUJHaUFPUWdGOElRNE1BUXNnQUNBSUVBOExJQXhDQVh3aERBd0FDd0FMSUFOQ0lJaW5JZ1ZCZFU4RVFDQURweUlISUFjb0FnQkJBV28yQWdBTEFrQWdBMEtBZ0lDQWNGb0VRQUpBQWtBQ1FDQURweThCQmtFRWF3NENBQUVDQ3lBQUlBTVFqUUVoQXd3QkN5QUFJQU1RTnlFREMwS0FnSUNBNEFBaENTQURRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBMElnaUtjaEJRc0NRQ0FGUVFBZ0JVRUxha0VTU1J0RkJFQWdBQ0FFUVFScUlBTkJDa0VBRUZjTkF5QUVJQUJCKzVrQklBUW9BZ1FRa3dJaUFqY0RNQXdCQ3lBRFFvQ0FnSUJ3ZzBLQWdJQ0FrSDlSQkVBZ0JDQUFJQU9uSWdWQkFFRUtJQVVvQWdSQi8vLy8vd2R4SWdVZ0JVRUtUeHNRaEFFaUFqY0RNQXdCQ3lBS1FpQ0lwMEYxVHdSQUlBcW5JZ1VnQlNnQ0FFRUJhallDQUFzZ0JDQUtOd013SUFvaEFnc2dBQ0FERUE5Q2dJQ0FnT0FBSVFrZ0FrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ0lBQVFOQ0lMUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJDZ0lDQWdPQUFJUXNNQXdzZ0FVSWdpS2NpQlVGMVR3UkFJQUduSWdjZ0J5Z0NBRUVCYWpZQ0FBc2dBQ0FMUVM4Z0FVRUhFQmxCQUVnTkFpQUZRWFZQQkVBZ0FhY2lCU0FGS0FJQVFRRnFOZ0lBQzBLQWdJQ0FNQ0VKSUFBZ0JFRVlhaUFMSUFFZ0NoRFZBeUlDUW9DQWdJQndneUlCUW9DQWdJQXdVUTBDUW9DQWdJRGdBQ0VKSUFGQ2dJQ0FnT0FBVVFSQUlBRWhDUXdEQ3lBQUlBUkJHR29nQWlBS0VOUURJUVVnQkNnQ1FDRUdJQVVOQWlBR0VEWWhDUXdEQ3lBQUlBTVFEd3dCQzBLQWdJQ0E0QUFoQ1FzZ0JpZ0NBQ2dDRUNJRlFSQnFJQVlvQWdRZ0JTZ0NCQkVBQUNBR1FRQTJBZ1FMSUFBZ0N4QVBJQUFnQkNrRE9CQVBJQUFnQkNrRE1CQVBJQUFnQkNrREtCQVBJQUFnQkNrRElCQVBJQVJCNEFCcUpBQWdDUXZGQkFJSWZ3RitBa0FDUUFKQUFrQUNRQ0FDUW9DQWdJQndnMEtBZ0lDQWtIOVNCRUFnQUNBQ0VDZ2lBa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMENJQUtuSVFRTUFRc2dBcWNpQkNBRUtBSUFRUUZxTmdJQUN5QUVRUkJxSVFjZ0JDa0NCQ0lNcDBILy8vLy9CM0VoQmdKQUlBeENnSUNBZ0FpRFVBUkFRUUFoQkVFQUlRTURRQ0FFSUFaR1JRUkFJQU1nQkNBSGFpMEFBRUVIZG1vaEF5QUVRUUZxSVFRTUFRc0xJQU5GQkVBZ0J5RUVJQUVOQkF3R0N5QUFJQU1nQm1wQkFCRHFBU0lJUlEwQ0lBaEJFR29oQkVFQUlRTURRQ0FESUFaR0RRSWdBeUFIYWl3QUFDSUZRUUJPQkg4Z0JFRUJhZ1VnQkNBRlFUOXhRWUFCY2pvQUFTQUZRY0FCY1VFR2RrRkFjaUVGSUFSQkFtb0xJUWtnQkNBRk9nQUFJQU5CQVdvaEF5QUpJUVFNQUFzQUN5QUFJQVpCQTJ4QkFCRHFBU0lJUlEwQklBaEJFR29oQkFOQUlBVWlDaUFHVGcwQklBcEJBV29oQlNBSElBcEJBWFJxTHdFQUlnbEIvd0JOQkVBZ0JDQUpPZ0FBSUFSQkFXb2hCQVVDUUNBSlFZRDRBM0ZCZ0xBRFJ5QURjaUFGSUFaT2NnMEFJQWNnQlVFQmRHb3ZBUUFpQzBHQStBTnhRWUM0QTBjTkFDQUpRUXAwUVlENFAzRWdDMEgvQjNGeVFZQ0FCR29oQ1NBS1FRSnFJUVVMSUFRZ0NSQ2hBeUFFYWlFRUN3d0FDd0FMSUFSQkFEb0FBQ0FJSUFRZ0NFRVFhaUlIYTBILy8vLy9CM0d0SUFncEFnUkNnSUNBZ0hpRGhEY0NCQ0FBSUFJUUR5QUJSUTBDSUFnb0FnUkIvLy8vL3dkeElRWU1BUXRCQUNFR1FRQWhCMEVBSVFRZ0FVVU5BZ3NnQVNBR05nSUFDeUFISVFRTElBUUxqd01CQkg4akFFRVFheUlFSkFBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUJRaUNJcHlJQ1FRdHFEZ3NEQWdJRUFBVUZCUVlCQVFVTElBR25JZ0lwQWdSQ2dJQ0FnSUNBZ0lEQUFGUU5CaUFBSUFJUW9nTU1Cd3NnQUMwQWFFRUNSZzBHSUFHbklnSW9BZ2dpQXlBQ0tBSU1JZ1UyQWdRZ0JTQUROZ0lBSUFKQkFEWUNEQ0FBS0FKY0lRTWdBQ0FDUVFocUlnVTJBbHdnQWlBRE5nSU1JQUlnQUVIWUFHb2lBallDQ0NBRElBVTJBZ0FnQUMwQWFBMEdJQUJCQVRvQWFBTkFJQUlnQUNnQ1hDSURSd1JBSUFOQkNHc2lBeWdDQUEwSklBQWdBeER0QlF3QkN3c2dBRUVBT2dCb0RBWUxJQUduSWdKQkJHb1FHeUFBUVJCcUlBSWdBQ2dDQkJFQUFBd0ZDeUFCcHlJQ1FRUnFFQnNnQUVFUWFpQUNJQUFvQWdRUkFBQU1CQXNnQUNBQnB4Q2lBd3dEQ3lBRUlBSTJBZ0FqQUVFUWF5SUFKQUFnQUNBRU5nSU1RWkRJQkVHVG13RWdCQkNiQkNBQVFSQnFKQUFMRUFFQUN5QUFRUkJxSUFJZ0FDZ0NCQkVBQUFzZ0JFRVFhaVFBRHd0QjRZNEJRYTc4QUVIYktrSFhKeEFBQUFzZ0FRRitJQUFnQUNBQ0lBRkJBVUVDUVFBUWdnRWlCQ0FCSUFNUTNnRWdCQXY5Q1FJTGZ3RitJd0JCd0FKcklnTWtBQUpBSUFKQ2dJQ0FnSENEUW9DQWdJQXdVZ1JBUW9DQWdJRGdBQ0VPSUFBZ0EwSGNBR29nQWhEbEFTSUdSUTBCSUFNb0Fsd2hDQU5BSUFRZ0NFY0VRQUpBSUFRZ0Jtb3NBQUJCNXdCclFSOTNJZ2RCQ1V0Qnl3VWdCM1pCQVhGRmNrVUVRQ0FIUVFKMFFmejlBV29vQWdBaUJ5QUZjVVVOQVFzZ0FDQUdFRlFnQUVIUU9FRUFFSUFDREFRTElBUkJBV29oQkNBRklBZHlJUVVNQVFzTElBQWdCaEJVQzBLQWdJQ0E0QUFoRGlBQUlBTkIzQUJxSUFFZ0JVRUVka0VCY1NJRVJSQ1ZCQ0lJUlEwQUlBTW9BbHdoQmlBRFFid0Jha0VBUVlBQkVDc2FJQU5DQURjRGFDQURRZ0EzQXF3QklBTWdBRFlDdUFFZ0EwRTBOZ0swQVNBRFFYODJBcHdCSUFOQ2dZQ0FnSEEzQXBRQklBTWdCRFlDaUFFZ0F5QUlOZ0tBQVNBRElBWWdDR28yQW53Z0F5QUlOZ0o0SUFNZ0FEWUNvQUVnQTBJQU53TmdJQU1nQURZQ2RDQURRZ0EzQXFRQklBTkJORFlDY0NBRElBVTJBb1FCSUFNZ0JVRURka0VCY1RZQ2tBRWdBeUFGUVFGMlFRRnhOZ0tNQVNBRFFlQUFhaUlFSUFWQi93RnhFQkVnQkVFQUVCRWdCRUVBRUJFZ0JFRUFFQjBnQlVFZ2NVVUVRQ0FEUWVBQWFpSUVRUWhCQmhDNEFSb2dCRUVFRUJFZ0JFRUhRWFVRdUFFYUN5QURRZUFBYWlJRVFRdEJBQkNwQWdKL0FrQWdCRUVBRVBJQ0RRQWdBMEhnQUdvaUJFRU1RUUFRcVFJZ0JFRUtFQkVnQXlnQ2VDMEFBQVJBSUFOQjRBQnFRWS96QUVFQUVEb01BUXNnQXlnQ2JBUkFJQU5CNEFCcUVLZ0NEQUVMSUFNb0FtUkJCMnNoQ3lBREtBSmdJZ3hCQjJvaERVRUFJUVJCQUNFRkFrQUNRQUpBQWtBQ1FBTkFJQVVnQzBnRVFDQUZJQTFxSWdZdEFBQWlDa0VkVHcwRUlBVWdDa0h3Z1FKcUxRQUFJZ2RxSUF0S0RRVUNRQUpBQWtBQ1FBSkFJQXBCRDJzT0RBQUJCQVFFQkFJREJBUUFBUVFMSUFSQkFXb2hCaUFFSUFsSUJFQWdCaUVFREFRTElBUkIvZ0ZLSVFvZ0JpSUVJUWtnQ2tVTkF3d0dDeUFFUVFCTURRa2dCRUVCYXlFRURBSUxJQVl2QUFGQkFuUWdCMm9oQnd3QkN5QUdMd0FCUVFOMElBZHFJUWNMSUFVZ0Iyb2hCUXdCQ3dzZ0NVRUFUZzBCQ3lBRFFlQUFha0hqTlVFQUVEb01CQXNnRENBREtBS1VBVG9BQVNBREtBSmdJQWs2QUFJZ0F5Z0NZQ0FES0FKa1FRZHJOZ0FESUFNb0FxZ0JJZ1FnQXlnQ2xBRkJBV3RMQkVBZ0EwSGdBR29nQXlnQ3BBRWdCQkJ5SUFNb0FtQWlCQ0FFTFFBQVFZQUJjam9BQUFzZ0F5Z0NwQUVpQkFSQUlBTW9BcmdCSUFSQkFDQURLQUswQVJFQkFCb0xJQU5CQURvQUVDQURLQUpnSVFVZ0F5Z0NaQXdFQzBHeGdRRkJ3UHdBUWZvTlFZVGdBQkFBQUF0Qjd0QUFRY0Q4QUVIN0RVR0U0QUFRQUFBTFFmU05BVUhBL0FCQmlBNUJoT0FBRUFBQUN5QURLQUpnSWdRRVFDQURLQUowSUFSQkFDQURLQUp3RVFFQUdnc2dBMElBTndOd0lBTkNBRGNEYUNBRFFnQTNBMkFnQXlnQ3BBRWlCQVJBSUFNb0FyZ0JJQVJCQUNBREtBSzBBUkVCQUJvTElBTkJwQUZxSWdSQ0FEY0NBQ0FFUWdBM0FoQWdCRUlBTndJSUlBTkJ2QUZxSVFSQkFDRUZBMEFnQTBFUWFpQUZhaUVHSUFRdEFBQWlCMFVnQlVFK1MzSkZCRUFnQmlBSE9nQUFJQVZCQVdvaEJTQUVRUUZxSVFRTUFRc0xJQVpCQURvQUFFRUFJUVZCQUFzaEJDQUFJQWdRVkNBRlJRUkFJQU1nQTBFUWFqWUNBQ0FBUVpVOUlBTVFnQUlNQVFzZ0FDQUZJQVFRaEFNaERpQUFLQUlRSWdCQkVHb2dCU0FBS0FJRUVRQUFDeUFEUWNBQ2FpUUFJQTRMMUFJQkJIOGpBRUhRQVdzaUJTUUFJQVVnQWpZQ3pBRWdCVUdnQVdvaUFrRUFRU2dRS3hvZ0JTQUZLQUxNQVRZQ3lBRUNRRUVBSUFFZ0JVSElBV29nQlVIUUFHb2dBaUFESUFRUWhBWkJBRWdFUUVGL0lRUU1BUXNnQUNnQ1RFRUFUaUVHSUFBb0FnQWhCeUFBS0FKSVFRQk1CRUFnQUNBSFFWOXhOZ0lBQ3dKL0FrQUNRQ0FBS0FJd1JRUkFJQUJCMEFBMkFqQWdBRUVBTmdJY0lBQkNBRGNERUNBQUtBSXNJUWdnQUNBRk5nSXNEQUVMSUFBb0FoQU5BUXRCZnlBQUVNNEREUUVhQ3lBQUlBRWdCVUhJQVdvZ0JVSFFBR29nQlVHZ0FXb2dBeUFFRUlRR0N5RUNJQWdFUUNBQVFRQkJBQ0FBS0FJa0VRRUFHaUFBUVFBMkFqQWdBQ0FJTmdJc0lBQkJBRFlDSENBQUtBSVVJUUVnQUVJQU53TVFJQUpCZnlBQkd5RUNDeUFBSUFBb0FnQWlBQ0FIUVNCeGNqWUNBRUYvSUFJZ0FFRWdjUnNoQkNBR1JRMEFDeUFGUWRBQmFpUUFJQVFMSkFBZ0FFSUFOd053SUFBZ0FDZ0NDRFlDYUNBQUlBQW9BaXdnQUNnQ0JHdXNOd040Q3hBQUlBQWdBU0FDUVFCQkFCQ1pCQm9MdFJnREZIOEVmQUYrSXdCQk1Hc2lDU1FBQWtBQ1FBSkFJQUM5SWhwQ0lJaW5JZ0pCLy8vLy93ZHhJZ05CK3RTOWdBUk5CRUFnQWtILy96OXhRZnZESkVZTkFTQURRZnl5aTRBRVRRUkFJQnBDQUZrRVFDQUJJQUJFQUFCQVZQc2grYitnSWdCRU1XTmlHbUcwMEwyZ0loWTVBd0FnQVNBQUlCYWhSREZqWWhwaHROQzlvRGtEQ0VFQklRSU1CUXNnQVNBQVJBQUFRRlQ3SWZrL29DSUFSREZqWWhwaHROQTlvQ0lXT1FNQUlBRWdBQ0FXb1VReFkySWFZYlRRUGFBNUF3aEJmeUVDREFRTElCcENBRmtFUUNBQklBQkVBQUJBVlBzaENjQ2dJZ0JFTVdOaUdtRzA0TDJnSWhZNUF3QWdBU0FBSUJhaFJERmpZaHBodE9DOW9Ea0RDRUVDSVFJTUJBc2dBU0FBUkFBQVFGVDdJUWxBb0NJQVJERmpZaHBodE9BOW9DSVdPUU1BSUFFZ0FDQVdvVVF4WTJJYVliVGdQYUE1QXdoQmZpRUNEQU1MSUFOQnU0enhnQVJOQkVBZ0EwRzgrOWVBQkUwRVFDQURRZnl5eTRBRVJnMENJQnBDQUZrRVFDQUJJQUJFQUFBd2YzelpFc0NnSWdCRXlwU1RwNUVPNmIyZ0loWTVBd0FnQVNBQUlCYWhSTXFVazZlUkR1bTlvRGtEQ0VFRElRSU1CUXNnQVNBQVJBQUFNSDk4MlJKQW9DSUFSTXFVazZlUkR1azlvQ0lXT1FNQUlBRWdBQ0FXb1VUS2xKT25rUTdwUGFBNUF3aEJmU0VDREFRTElBTkIrOFBrZ0FSR0RRRWdHa0lBV1FSQUlBRWdBRVFBQUVCVSt5RVp3S0FpQUVReFkySWFZYlR3dmFBaUZqa0RBQ0FCSUFBZ0ZxRkVNV05pR21HMDhMMmdPUU1JUVFRaEFnd0VDeUFCSUFCRUFBQkFWUHNoR1VDZ0lnQkVNV05pR21HMDhEMmdJaFk1QXdBZ0FTQUFJQmFoUkRGallocGh0UEE5b0RrRENFRjhJUUlNQXdzZ0EwSDZ3K1NKQkVzTkFRc2dBQ0FBUklQSXlXMHdYK1Evb2tRQUFBQUFBQUE0UTZCRUFBQUFBQUFBT01PZ0loZEVBQUJBVlBzaCtiK2lvQ0lXSUJkRU1XTmlHbUcwMEQyaUloaWhJaGxFR0MxRVZQc2g2YjlqSVFRQ2Z5QVhtVVFBQUFBQUFBRGdRV01FUUNBWHFnd0JDMEdBZ0lDQWVBc2hBZ0pBSUFRRVFDQUNRUUZySVFJZ0YwUUFBQUFBQUFEd3Y2QWlGMFF4WTJJYVliVFFQYUloR0NBQUlCZEVBQUJBVlBzaCtiK2lvQ0VXREFFTElCbEVHQzFFVlBzaDZUOWtSUTBBSUFKQkFXb2hBaUFYUkFBQUFBQUFBUEEvb0NJWFJERmpZaHBodE5BOW9pRVlJQUFnRjBRQUFFQlUreUg1djZLZ0lSWUxJQUVnRmlBWW9TSUFPUU1BQWtBZ0EwRVVkaUlFSUFDOVFqU0lwMEgvRDNGclFSRklEUUFnQVNBV0lCZEVBQUJnR21HMDBEMmlJZ0NoSWhrZ0YwUnpjQU11aWhtak82SWdGaUFab1NBQW9hRWlHS0VpQURrREFDQUVJQUM5UWpTSXAwSC9EM0ZyUVRKSUJFQWdHU0VXREFFTElBRWdHU0FYUkFBQUFDNktHYU03b2lJQW9TSVdJQmRFd1VrZ0pacURlem1pSUJrZ0ZxRWdBS0doSWhpaElnQTVBd0FMSUFFZ0ZpQUFvU0FZb1RrRENBd0JDeUFEUVlDQXdQOEhUd1JBSUFFZ0FDQUFvU0lBT1FNQUlBRWdBRGtEQ0VFQUlRSU1BUXNnR2tMLy8vLy8vLy8vQjROQ2dJQ0FnSUNBZ0xEQkFJUy9JUUJCQUNFQ1FRRWhCQU5BSUFsQkVHb2dBa0VEZEdvQ2Z5QUFtVVFBQUFBQUFBRGdRV01FUUNBQXFnd0JDMEdBZ0lDQWVBdTNJaFk1QXdBZ0FDQVdvVVFBQUFBQUFBQndRYUloQUVFQklRSWdCQ0VHUVFBaEJDQUdEUUFMSUFrZ0FEa0RJRUVDSVFJRFFDQUNJZ3BCQVdzaEFpQUpRUkJxSUFwQkEzUnFLd01BUkFBQUFBQUFBQUFBWVEwQUN5QUpRUkJxSVE0akFFR3dCR3NpQlNRQUlBTkJGSFpCbGdocklnSkJBMnRCR0cwaUJrRUFJQVpCQUVvYklnOUJhR3dnQW1vaEJrR1Vxd1FvQWdBaUN5QUtRUUZxSWd4QkFXc2lDR3BCQUU0RVFDQUxJQXhxSVFJZ0R5QUlheUVEQTBBZ0JVSEFBbW9nQkVFRGRHb2dBMEVBU0FSOFJBQUFBQUFBQUFBQUJTQURRUUowUWFDckJHb29BZ0MzQ3prREFDQURRUUZxSVFNZ0JFRUJhaUlFSUFKSERRQUxDeUFHUVJocklRcEJBQ0VDSUF0QkFDQUxRUUJLR3lFRUlBeEJBRXdoRFFOQUFrQWdEUVJBUkFBQUFBQUFBQUFBSVFBTUFRc2dBaUFJYWlFSFFRQWhBMFFBQUFBQUFBQUFBQ0VBQTBBZ0RpQURRUU4wYWlzREFDQUZRY0FDYWlBSElBTnJRUU4wYWlzREFLSWdBS0FoQUNBRFFRRnFJZ01nREVjTkFBc0xJQVVnQWtFRGRHb2dBRGtEQUNBQ0lBUkdJUU1nQWtFQmFpRUNJQU5GRFFBTFFTOGdCbXNoRTBFd0lBWnJJUkFnQmtFWlNDRVJJQVpCR1dzaEZDQUxJUUlDUUFOQUlBVWdBa0VEZEdvckF3QWhBRUVBSVFNZ0FpRUVJQUpCQUV3aUIwVUVRQU5BSUFWQjRBTnFJQU5CQW5ScUFuOENmeUFBUkFBQUFBQUFBSEErb2lJV21VUUFBQUFBQUFEZ1FXTUVRQ0FXcWd3QkMwR0FnSUNBZUF1M0loWkVBQUFBQUFBQWNNR2lJQUNnSWdDWlJBQUFBQUFBQU9CQll3UkFJQUNxREFFTFFZQ0FnSUI0Q3pZQ0FDQUZJQVJCQVdzaUJFRURkR29yQXdBZ0ZxQWhBQ0FEUVFGcUlnTWdBa2NOQUFzTEFuOGdBQ0FLRU5vQklnQWdBRVFBQUFBQUFBREFQNktjUkFBQUFBQUFBQ0RBb3FBaUFKbEVBQUFBQUFBQTRFRmpCRUFnQUtvTUFRdEJnSUNBZ0hnTElRZ2dBQ0FJdDZFaEFBSkFBa0FDUUFKL0lCRkZCRUFnQWtFQ2RDQUZhaUlFSUFRb0F0d0RJZ1FnQkNBUWRTSUVJQkIwYXlJRE5nTGNBeUFFSUFocUlRZ2dBeUFUZFF3QkN5QUtEUUVnQWtFQ2RDQUZhaWdDM0FOQkYzVUxJZzFCQUV3TkFnd0JDMEVDSVEwZ0FFUUFBQUFBQUFEZ1AyWU5BRUVBSVEwTUFRdEJBQ0VEUVFBaEJDQUhSUVJBQTBBZ0JVSGdBMm9nQTBFQ2RHb2lGU2dDQUNFU1FmLy8vd2NoQndKL0FrQWdCQTBBUVlDQWdBZ2hCeUFTRFFCQkFBd0JDeUFWSUFjZ0VtczJBZ0JCQVFzaEJDQURRUUZxSWdNZ0FrY05BQXNMQWtBZ0VRMEFRZi8vL3dNaEF3SkFBa0FnRkE0Q0FRQUNDMEgvLy84QklRTUxJQUpCQW5RZ0JXb2lCeUFIS0FMY0F5QURjVFlDM0FNTElBaEJBV29oQ0NBTlFRSkhEUUJFQUFBQUFBQUE4RDhnQUtFaEFFRUNJUTBnQkVVTkFDQUFSQUFBQUFBQUFQQS9JQW9RMmdHaElRQUxJQUJFQUFBQUFBQUFBQUJoQkVCQkFTRURRUUFoQnlBQ0lRUUNRQ0FDSUF0TURRQURRQ0FGUWVBRGFpQUVRUUZySWdSQkFuUnFLQUlBSUFkeUlRY2dCQ0FMU2cwQUN5QUhSUTBBSUFvaEJnTkFJQVpCR0dzaEJpQUZRZUFEYWlBQ1FRRnJJZ0pCQW5ScUtBSUFSUTBBQ3d3REN3TkFJQU1pQkVFQmFpRURJQVZCNEFOcUlBc2dCR3RCQW5ScUtBSUFSUTBBQ3lBQ0lBUnFJUVFEUUNBRlFjQUNhaUFDSUF4cUlnaEJBM1JxSUFKQkFXb2lBaUFQYWtFQ2RFR2dxd1JxS0FJQXR6a0RBRUVBSVFORUFBQUFBQUFBQUFBaEFDQU1RUUJLQkVBRFFDQU9JQU5CQTNScUt3TUFJQVZCd0FKcUlBZ2dBMnRCQTNScUt3TUFvaUFBb0NFQUlBTkJBV29pQXlBTVJ3MEFDd3NnQlNBQ1FRTjBhaUFBT1FNQUlBSWdCRWdOQUFzZ0JDRUNEQUVMQ3dKQUlBQkJHQ0FHYXhEYUFTSUFSQUFBQUFBQUFIQkJaZ1JBSUFWQjRBTnFJQUpCQW5ScUFuOENmeUFBUkFBQUFBQUFBSEErb2lJV21VUUFBQUFBQUFEZ1FXTUVRQ0FXcWd3QkMwR0FnSUNBZUFzaUE3ZEVBQUFBQUFBQWNNR2lJQUNnSWdDWlJBQUFBQUFBQU9CQll3UkFJQUNxREFFTFFZQ0FnSUI0Q3pZQ0FDQUNRUUZxSVFJTUFRc0NmeUFBbVVRQUFBQUFBQURnUVdNRVFDQUFxZ3dCQzBHQWdJQ0FlQXNoQXlBS0lRWUxJQVZCNEFOcUlBSkJBblJxSUFNMkFnQUxSQUFBQUFBQUFQQS9JQVlRMmdFaEFDQUNRUUJPQkVBZ0FpRUVBMEFnQlNBRUlnWkJBM1JxSUFBZ0JVSGdBMm9nQkVFQ2RHb29BZ0Mzb2prREFDQUVRUUZySVFRZ0FFUUFBQUFBQUFCd1BxSWhBQ0FHRFFBTElBSWhCQU5BUkFBQUFBQUFBQUFBSVFCQkFDRURJQXNnQWlBRWF5SUdJQVlnQzBvYklncEJBRTRFUUFOQUlBTkJBM1JCOE1BRWFpc0RBQ0FGSUFNZ0JHcEJBM1JxS3dNQW9pQUFvQ0VBSUFNZ0NrY2hEQ0FEUVFGcUlRTWdEQTBBQ3dzZ0JVR2dBV29nQmtFRGRHb2dBRGtEQUNBRVFRQktJUVlnQkVFQmF5RUVJQVlOQUFzTFJBQUFBQUFBQUFBQUlRQWdBa0VBVGdSQUlBSWhCQU5BSUFRaUJrRUJheUVFSUFBZ0JVR2dBV29nQmtFRGRHb3JBd0NnSVFBZ0JnMEFDd3NnQ1NBQW1pQUFJQTBiT1FNQUlBVXJBNkFCSUFDaElRQkJBU0VESUFKQkFFb0VRQU5BSUFBZ0JVR2dBV29nQTBFRGRHb3JBd0NnSVFBZ0FpQURSeUVFSUFOQkFXb2hBeUFFRFFBTEN5QUpJQUNhSUFBZ0RSczVBd2dnQlVHd0JHb2tBQ0FJUVFkeElRSWdDU3NEQUNFQUlCcENBRk1FUUNBQklBQ2FPUU1BSUFFZ0NTc0RDSm81QXdoQkFDQUNheUVDREFFTElBRWdBRGtEQUNBQklBa3JBd2c1QXdnTElBbEJNR29rQUNBQ0MvNERBd044QW44QmZpQUF2U0lHUWlDSXAwSC8vLy8vQjNFaUJFR0FnTUNnQkU4RVFDQUFSQmd0UkZUN0lmay9JQUNtSUFDOVF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3c4TEFrQUNmeUFFUWYvLzcvNERUUVJBUVg4Z0JFR0FnSUR5QTA4TkFSb01BZ3NnQUpraEFDQUVRZi8veS84RFRRUkFJQVJCLy8rWC93Tk5CRUFnQUNBQW9FUUFBQUFBQUFEd3Y2QWdBRVFBQUFBQUFBQUFRS0NqSVFCQkFBd0NDeUFBUkFBQUFBQUFBUEMvb0NBQVJBQUFBQUFBQVBBL29LTWhBRUVCREFFTElBUkIvLytOZ0FSTkJFQWdBRVFBQUFBQUFBRDR2NkFnQUVRQUFBQUFBQUQ0UDZKRUFBQUFBQUFBOEQrZ295RUFRUUlNQVF0RUFBQUFBQUFBOEw4Z0FLTWhBRUVEQ3lFRklBQWdBS0lpQWlBQ29pSUJJQUVnQVNBQklBRkVMMnhxTEVTMG9yK2lSSnI5M2xJdDNxMi9vS0pFYlpwMHIvS3dzNytnb2tSeEZpUCt4bkc4djZDaVJNVHJtSm1abWNtL29LSWhBeUFDSUFFZ0FTQUJJQUVnQVVRUjJpTGpPcTJRUDZKRTZ3MTJKRXQ3cVQrZ29rUlJQZENnWmcyeFA2Q2lSRzRnVE1YTlJiYy9vS0pFLzRNQWtpUkp3aitnb2tRTlZWVlZWVlhWUDZDaUlRRWdCRUgvLysvK0EwMEVRQ0FBSUFBZ0F5QUJvS0toRHdzZ0JVRURkQ0lFUVpDcUJHb3JBd0FnQUNBRElBR2dvaUFFUWJDcUJHb3JBd0NoSUFDaG9TSUFtaUFBSUFaQ0FGTWJJUUFMSUFBTGlBRUJCSDhDUUFKL0FrQWdBMEVIY1NJSVFRWkhCRUJCSUNFSEEwQWdBQ0FCSUFJZ0Iyb2lDU0FGSUFRUkJ3QWlCa0VzY1EwRUlBWkJFSEZGRFFJZ0IwRUJkQ0VISUFBZ0FpQUlJQWtRNFFORkRRQUxRUkFNQWdzZ0FDQUJJQUlnQlNBRUVRY0FHZ3RCQUFzaEJpQUFLQUlNSWdGRkRRQWdBQ0FDSUFNZ0FTQUdFS29ESVFZTElBWUw0Z0VCQW44akFFRWdheUlFSkFBZ0FDQUJSd1JBQWtBQ1FBSkFJQUVvQWd4RkJFQUNRQUpBSUFFb0FnaEIvdi8vL3dkckRnSUFBd0VMSUFFb0FnUU5BaUFBUVFBUWpBRU1CQXNnQUVFQkVJd0JEQU1MSUFFb0FnUkZEUUVMSUFBUU5Rd0JDeUFBS0FJQUlRVWdCRUlBTndJWUlBUkNnSUNBZ0lDQWdJQ0FmemNDRUNBRUlBVTJBZ3dnQkVFTWFpSUZRZ0VRTUJvZ0FTQUZFSUlDQkVBZ0FFRUFFSWtCSUFSQkRHb1FHd3dCQ3lBRVFReHFFQnNnQUNBQklBSWdBMEhpQUVFQUVKNEVHZ3NnQkVFZ2FpUUFEd3RCMlAwQVFkVDhBRUczSTBHcTJnQVFBQUFMOGdJQkEzOGpBRUZBYWlJR0pBQUNRQ0FFSUFOcklnaEJBVVlFUUFKQUlBTkZCRUFnQVVJREVEQWFEQUVMSUFFZ0E2MFFNQm9nQVVFQk5nSUVDeUFDSUFOQkFYUkJBWEt0RURBYUlBSWdBaWdDQ0VFQ2FqWUNDQ0FBSUFFUVJCb01BUXNnQUNnQ0FDRUhJQUFnQVNBQ0lBTWdDRUVCZGlBRGFpSURRUUVRb0FRZ0JrSUFOd0k0SUFaQ2dJQ0FnSUNBZ0lDQWZ6Y0NNQ0FHSUFjMkFpd2dCa0lBTndJa0lBWkNnSUNBZ0lDQWdJQ0FmemNDSENBR0lBYzJBaGdnQmtJQU53SVFJQVpDZ0lDQWdJQ0FnSUNBZnpjQ0NDQUdJQWMyQWdRZ0JrRXNhaUlISUFaQkdHb2dCa0VFYWlJSUlBTWdCQ0FGRUtBRUlBQWdBQ0FJUWYvLy8vOERRUUVRUXhvZ0J5QUhJQUZCLy8vLy93TkJBUkJER2lBQUlBQWdCMEgvLy8vL0EwRUJFTXNCR2lBRkJFQWdBU0FCSUFaQkdHcEIvLy8vL3dOQkFSQkRHZ3NnQWlBQ0lBWkJCR29pQUVILy8vLy9BMEVCRUVNYUlBWkJMR29RR3lBR1FSaHFFQnNnQUJBYkN5QUdRVUJySkFBTHpnVUNCMzhEZmlNQVFUQnJJZ2drQUFKL0FrQUNRQUpBQWtBQ1FDQUREZ01BQVFJREMwSGNqQUZCMVB3QVFiVWFRWmI4QUJBQUFBc2dBU0FDS0FJUUlBSW9BZ3dpQUNBQVFRVjBJQUlvQWdockVHZzJBZ0FNQWdzZ0FpZ0NFQ0lESUFJb0Fnd2lBQ0FBUVFWMElBSW9BZ2hySWdKQklHb1FhSzFDSUlZZ0F5QUFJQUlRYUsyRUlROGdCa0dBbE92Y0EwWUVRQ0FCSUE5Q2dKVHIzQU9BSWhBK0FnUWdBU0FRUW9Ec2xLTU1maUFQZkQ0Q0FBd0NDeUFCSUE4Z0JxMGlFSUFpRVQ0Q0JDQUJJQThnRUNBUmZuMCtBZ0FNQVFzZ0FpZ0NBQ0VLSUFoQ0FEY0NLQ0FJUW9DQWdJQ0FnSUNBZ0g4M0FpQWdDQ0FLTmdJY0lBaENBRGNDRkNBSVFvQ0FnSUNBZ0lDQWdIODNBZ3dnQ0NBS05nSUlJQU1nQlVFQmRDQUVRUUZxSWd0MlFRRnFRUUYySWdwcklRd2dBQ0FFUVFGMFFRRnlRUlJzYWlFTlFRQWhBeUFBSUFSQktHeHFJZ1FvQWd4RkJFQWdCQ0FHSUFwQi8vLy8vd05CQVJEOEFpQUlRUWhxSWdsQ0FSQXdjaUFOSUFrZ0JDQUtRUUZxSUFkc1FRSnFRUUFRbFFGeUlRa0xBa0FDUUNBSVFSeHFJZzRnQWlBTklBY2dER3hCQUJCRElBbHlJQTVCQVJEUkFYSWdDRUVJYWlJSklBNGdCRUgvLy8vL0EwRUJFRU55SUFrZ0FpQUpRZi8vLy84RFFRRVE1QUZ5UVNCeERRQURRQUpBSUFnb0FneEZEUUFnQ0NnQ0ZFVU5BQ0FJUVFocUlnSWdBaUFFUWYvLy8vOERRUUVReXdFTkFpQURRUUZySVFNTUFRc0xBMEFnQ0VFSWFpQUVFTk1CUVFCT0JFQWdDRUVJYWlJQ0lBSWdCRUgvLy8vL0EwRUJFT1FCRFFJZ0EwRUJhaUVEREFFTEN5QURCRUFnQ0VFY2FpSUNJQUlnQTZ4Qi8vLy8vd05CQVJCMURRRUxJQUFnQVNBS1FRSjBhaUFJUVJ4cUlBd2dDeUFGSUFZZ0J4Q2hCQTBBSUFBZ0FTQUlRUWhxSUFvZ0N5QUZJQVlnQnhDaEJFVU5BUXNnQ0VFY2FoQWJJQWhCQ0dvUUcwRi9EQUlMSUFoQkhHb1FHeUFJUVFocUVCc0xRUUFMSVFNZ0NFRXdhaVFBSUFNTGhBRUJBbjhDUUNBQUlBRkhCRUFnQWtVRVFDQUFRZ0VRTUNFRkRBSUxRUjRnQW1kcklRWWdBQ0FCRUVRaEJRTkFJQVpCQUVnTkFpQUFJQUFnQUNBRElBUVFReUFGY2lFRklBSWdCblpCQVhFRVFDQUFJQUFnQVNBRElBUVFReUFGY2lFRkN5QUdRUUZySVFZTUFBc0FDMEhZL1FCQjFQd0FRZG9SUWV6WEFCQUFBQXNnQlF0MUFnSjhBWDRnQUFKK0VBd2lBVVFBQUFBQUFFQ1BRS01pQXBsRUFBQUFBQUFBNEVOakJFQWdBckFNQVF0Q2dJQ0FnSUNBZ0lDQWZ3c2lBemNEQUNBQUFuOGdBU0FEUXVnSGZybWhSQUFBQUFBQVFJOUFvaUlCbVVRQUFBQUFBQURnUVdNRVFDQUJxZ3dCQzBHQWdJQ0FlQXMyQWdnTGZRRUNmeU1BUVNCcklnWWtBQUpBSUFBZ0FVY2dBQ0FDUjNGRkJFQWdBQ2dDQUNFSElBWkNBRGNDR0NBR1FvQ0FnSUNBZ0lDQWdIODNBaEFnQmlBSE5nSU1JQVpCREdvaUJ5QUJJQUlnQXlBRUlBVVJDZ0FoQVNBQUlBY1FvQVlNQVFzZ0FDQUJJQUlnQXlBRUlBVVJDZ0FoQVFzZ0JrRWdhaVFBSUFFTDVnb0NDMzhEZmlNQVFSQnJJZzBrQUNBRUlBVkJBV3NpQmtFQ2RHb29BZ0FoQndKQUFrQUNRQ0FGUVFGR0JFQkJBQ0VHSUExQkFEWUNEQUpBSUFOQkFrMEVRQ0FIclNFUkEwQWdBMEVBVEEwQ0lBRWdBMEVCYXlJRFFRSjBJZ0JxSUFBZ0FtbzFBZ0FnQnExQ0lJYUVJaElnRVlBaUV6NENBQ0FTSUJFZ0UzNTlweUVHREFBTEFBc2dCMEYvYzYxQ0lJWkMvLy8vL3crRUlBZXRnS2NoQUFOQUlBTkJBV3NpQTBFQVNBMEJJQUVnQTBFQ2RDSUVhaUFOUVF4cUlBWWdBaUFFYWlnQ0FDQUhJQUFRbUFZMkFnQWdEU2dDRENFR0RBQUxBQXNnQWlBR05nSUFEQUVMQWtBQ1FBSkFBa0FDUUNBRElBVnJJZ2dnQlNBRklBaEtHMEV5VGdSQUlBZ0VRQ0FBS0FJQVFRQWdDRUVCYWlJT0lBZ2dCU0FJU3hzaUNVRUJhaUlNUVFKMElBQW9BZ1FSQVFBaUMwVWdBQ2dDQUVFQUlBeEJBM1FnQUNnQ0JCRUJBQ0lIUlhJTkJTQUZJQWxMRFFJZ0NTQUZheUVQUVFBaEJnTkFJQW9nRDBZRVFBTkFJQVVnQmtZTkJpQUhJQVlnRDJwQkFuUnFJQVFnQmtFQ2RHb29BZ0EyQWdBZ0JrRUJhaUVHREFBTEFBVWdCeUFLUVFKMGFrRUFOZ0lBSUFwQkFXb2hDZ3dCQ3dBTEFBdEJ6SXdCUWRUOEFFR2tDMEdWNndBUUFBQUxJQWhCQTA4RVFDQUhRWDl6clVJZ2hrTC8vLy8vRDRRZ0I2MkFweUVKQ3dKQUFrQUNRQU5BSUFaQkFFZ05BU0FHUVFKMElRQWdCaUFJYWlFRElBWkJBV3NoQmlBQ0lBTkJBblJxS0FJQUlnTWdBQ0FFYWlnQ0FDSUFSZzBBQ3lBQklBaEJBblJxSUFBZ0EwMGlBRFlDQUNBQURRRU1BZ3NnQVNBSVFRSjBha0VCTmdJQUN5QUNJQWhCQW5ScUlnQWdBQ0FFSUFVUW1BSWFDeUFIclNFUkEwQWdDRUVCYXlJSVFRQklEUWdnQWlBSVFRSjBJZzVxSVF3Q2YwRi9JQWNnQWlBRklBaHFRUUowYWlJR0tBSUFJZ0JORFFBYUlBa0VRQ0FOUVFocUlBQWdCa0VFYXlnQ0FDQUhJQWtRbUFZTUFRc2dCa0VFYXpVQ0FDQUFyVUlnaG9RZ0VZQ25DeUlBclNFU1FRQWhDa0VBSVFNRFFDQURJQVZHUlFSQUlBd2dBMEVDZENJUGFpSVFJQkExQWdBZ0NxMGdCQ0FQYWpVQ0FDQVNmbng5SWhNK0FnQkJBQ0FUUWlDSXAyc2hDaUFEUVFGcUlRTU1BUXNMSUFZZ0JpZ0NBQ0lESUFwck5nSUFJQU1nQ2trRVFBTkFJQUJCQVdzaEFDQU1JQXdnQkNBRkVLb0VSUTBBSUFZZ0JpZ0NBRUVCYWlJRE5nSUFJQU1OQUFzTElBRWdEbW9nQURZQ0FBd0FDd0FMSUFVZ0NXc2hDa0VBSVFZRFFDQUdJQWxHUlFSQUlBY2dCa0VDZEdvZ0JDQUdJQXBxUVFKMGFpZ0NBRFlDQUNBR1FRRnFJUVlNQVFzTElBZEJBU0FKRUtrRFJRMEFJQXRCQUNBSlFRSjBJZ1lRS3lBR2FrRUJOZ0lBREFFTElBQWdDeUFISUFrUW1RWU5BUXNnQUNBSElBc2dEQ0FDSUFOQkFuUnFJQWxCZjNOQkFuUnFJQXdRMXdJTkFDQUlRWDl6SUF4QkFYUnFJUWhCQUNFR0EwQWdCaUFPUmtVRVFDQUJJQVpCQW5ScUlBY2dCaUFJYWtFQ2RHb29BZ0EyQWdBZ0JrRUJhaUVHREFFTEN5QUFLQUlBSUFkQkFDQUFLQUlFRVFFQUdpQUFLQUlBSUF0QkFDQUFLQUlFRVFFQUdpQUFLQUlBUVFBZ0EwRUNkRUVFYWlBQUtBSUVFUUVBSWdkRkRRTWdBQ0FISUFFZ0RpQUVJQVVRMXdJTkFTQUNJQUlnQnlBRlFRRnFFSmdDR2lBQUtBSUFJQWRCQUNBQUtBSUVFUUVBR2lBQ0lBVkJBblJxSVFBRFFDQUZJUU1DUUNBQUtBSUFEUUFEUUNBRFFRQk1EUUVnQWlBRFFRRnJJZ05CQW5RaUJtb29BZ0FpQ0NBRUlBWnFLQUlBSWdaR0RRQUxJQVlnQ0VzTkJBc2dBaUFDSUFRZ0JSQ1lBaUVESUFBZ0FDZ0NBQ0FEYXpZQ0FDQUJRUUVnRGhDcEF4b01BQXNBQ3lBTEJFQWdBQ2dDQUNBTFFRQWdBQ2dDQkJFQkFCb0xJQWRGRFFJTElBQW9BZ0FnQjBFQUlBQW9BZ1FSQVFBYURBRUxRUUFoQ3d3QkMwRi9JUXNMSUExQkVHb2tBQ0FMQzVZRkFoRi9BMzVCQVNBRWRDSVFRUUYySVJJZ0JrRUNkRUdRcVFScUtBSUFJaFZCQVhRaENrRUJJUXNEUUNBQ0lRd0NRQUpBSUJCQkFrWUVRRUVBSVFBRFFDQVJJQkpHRFFJZ0FTQVJRUUowSWdOcUlBd2dFU0FTYWtFQ2RDSUVhaWdDQUNJQ0lBTWdER29vQWdBaUEyb2lCU0FLUVFBZ0JTQUtUeHRyTmdJQUlBRWdCR29nQXlBQ2F5QUtRUUFnQWlBRFN4dHFOZ0lBSUJGQkFXb2hFUXdBQ3dBTFFRQWhBZ0pBSUFSQkUwb05BQ0FBSUFaQm9BRnNhaUFGUWRBQWJHb2dCRUVDZEdwQnFBMXFJZzBvQWdBaUFnMEFJQVpCQW5SQmtLa0VhaWdDQUNFSFFRQWhBaUFBS0FJQUlnZ29BZ0JCQUVFRUlBUjBJQWdvQWdRUkFRQWlDRVVOQUNBRVFRRnJJUTRnQUNBR1FhZ0JiR29nQlVIVUFHeHFJQVJCQW5ScUlnSTFBdUFHSVJnZ0FpZ0NHQ0VUSUFldElSbEJBU0VDUVFBaENRTkFJQWtnRG5aRkJFQWdDQ0FKUVFOMGFpSVBJQUkyQWdBZ0R5QUNyU0lhUWlDR0lCbUFQZ0lFSUFJZ0Uyd2dCeUFZSUJwK1FpQ0lwMnhySWdJZ0IwRUFJQUlnQjA4YmF5RUNJQWxCQVdvaENRd0JDd3NnRFNBSU5nSUFJQWdoQWdzZ0FpSUhEUUZCZnlFQUN5QUFEd3NnRUVFQmRpRVFJQXRCQVhRaENFRUFJUWxCQUNFTlFRQWhEZ05BSUFrZ0VFY0VRQ0FITlFJRUlSZ2dCeWdDQUNFVFFRQWhBZ05BSUFJZ0MwY0VRQ0FESUFJZ0Rtb2lEMEVDZEdvZ0RDQUNJQTFxSWhRZ0VtcEJBblJxS0FJQUloWWdEQ0FVUVFKMGFpZ0NBQ0lVYWlJWElBcEJBQ0FLSUJkTkcyczJBZ0FnQXlBTElBOXFRUUowYWlBVUlCWnJJQXBxSWc4Z0Uyd2dGU0FQclNBWWZrSWdpS2RzYXpZQ0FDQUNRUUZxSVFJTUFRc0xJQWxCQVdvaENTQUlJQTVxSVE0Z0N5QU5haUVOSUFkQkNHb2hCd3dCQ3dzZ0JFRUJheUVFSUFNaEFpQU1JUU1nQ0NFTERBQUxBQXZVQkFFSmZ3SkFJQUFvQWdBaUNTZ0NBRUVBSUFSQkFuUWdDU2dDQkJFQkFDSUxSUTBBQWtBZ0EwVUVRQ0FBSUFFZ0FTQUxJQUlnQmlBSEVLWUVSUTBCREFJTElBQW9BZ0FpQ1NnQ0FFRUFJQVJCQm5RZ0NTZ0NCQkVCQUNJSlJRMEJBa0FnQlVFUGNVVUVRQ0FBSUFkQnFBRnNhaUFHUWRRQWJHb2dBaUFEYWtFQ2RHb29BaGdoRUNBSFFRSjBJZ05Ca0trRWFpZ0NBQ0VPSUFBZ0Eyb29BZ1FoRDBFQklRMERRRUVBSVFNZ0JTQU1UUTBDQTBCQkFDRUtJQU1nQkVZRVFFRUFJUWdEUUFKQUlBaEJFRWNFUUNBSklBUWdDR3hCQW5ScUlRTUNRQ0FHUlFSQUlBQWdBeUFESUFzZ0FrRUFJQWNRcGdRTkFTQURJQVFnRFNBT0lBOFFtZ1lNQXdzZ0F5QUVJQTBnRGlBUEVKb0dJQUFnQXlBRElBc2dBa0VCSUFjUXBnUkZEUUlMSUFraENBd0pDd05BQWtBZ0JDQUtSd1JBSUFVZ0Ntd2dER29oQTBFQUlRZ0RRQ0FJUVJCR0RRSWdBU0FESUFocVFRSjBhaUFKSUFRZ0NHd2dDbXBCQW5ScUtBSUFOZ0lBSUFoQkFXb2hDQXdBQ3dBTElBeEJFR29oREF3R0N5QUtRUUZxSVFvTUFBc0FDeUFJUVFGcUlRZ2dEU0FRSUE0Z0R4RFdBaUVOREFBTEFBVWdBeUFGYkNBTWFpRUtRUUFoQ0FOQUlBaEJFRVpGQkVBZ0NTQUVJQWhzSUFOcVFRSjBhaUFCSUFnZ0NtcEJBblJxS0FJQU5nSUFJQWhCQVdvaENBd0JDd3NnQTBFQmFpRUREQUVMQUFzQUN3QUxRYldQQVVIVS9BQkI0VDFCaTljQUVBQUFDeUFBS0FJQUlnRW9BZ0FnQ1VFQUlBRW9BZ1FSQVFBYUN5QUFLQUlBSWdBb0FnQWdDMEVBSUFBb0FnUVJBUUFhUVFBUEN5QUFJQWdRMVFJZ0FDQUxFTlVDUVg4TFFBQWdBQ0FCUVFGMHJTQUJyU0FDclNBQVFoMklRdi8vLy84UGczNUNJSWgrZkgwaUFDQUFRaUNJcDBFQmRTQUJjYTE4SWdCQ0lJaW5JQUZ4SUFDbmFndjlBZ0lMZndKK0lBRkJBQ0FDSUFkc1FRSjBFQ3NoQ3lBQ0lBVWdCRUVGZEdwQkFXc2dCVzRpQVNBQklBSktHeUlCUVFBZ0FVRUFTaHNoREVGL0lBVjBRWDl6UVg4Z0JVRWZjUnNoQ2lBSFFRQWdCMEVBU2hzaERTQUZRU0JLSVE0Z0JVRStTQ0VQSUFWQlBVc2hFQ0FGUWNFQVNTRVJBMEFnQ1NBTVJrVUVRQ0FESUFRZ0JTQUpiQ0lCRUdnaEJ3SitJQTVGQkVBZ0J5QUtjYTBpRXd3QkN5QURJQVFnQVVFZ2FoQm9JUWdnRUVVRVFDQUhyU0lUSUFnZ0NuR3RRaUNHaEF3QkN3Si9JQkZGQkVBZ0F5QUVJQUZCUUdzUWFDQUtjUXdCQ3lBSUlBcHhJUWhCQUFzaEFTQUhRZi8vLy84SGNhMGhFeUFIUVI5MnJTQUlyVUlCaG9RZ0FhMUNJWWFFQ3lFVVFRQWhCd05BSUFjZ0RVWkZCRUFnRkNBR0lBZHFRUUowSWdGQmtLa0VhaWdDQUNJSUlBQWdBV29vQWdRaUVoQ29CQ0VCSUFzZ0FpQUhiQ0FKYWtFQ2RHb2dEd1IvSUFFRklBR3RRaCtHSUJPRUlBZ2dFaENvQkFzMkFnQWdCMEVCYWlFSERBRUxDeUFKUVFGcUlRa01BUXNMQzA4QkJIOERRQ0FESUFWR1JRUkFJQUFnQlVFQ2RDSUdhaUFFSUFJZ0Jtb29BZ0FpQnlBQklBWnFLQUlBYWlJRWFpSUdOZ0lBSUFRZ0Iwa2dCQ0FHUzNJaEJDQUZRUUZxSVFVTUFRc0xJQVFMNHdFQkEzOENRQUpBSUFOQkEzRkZJQU5CQjNFaUJFRUZSaUFDUWYvLy8vOERSbkp5SUFGQkFVWWdCRUVDUm5GeVJRUkFJQUVnQkVFRFIzSU5BUXNnQUNBQkVJd0JEQUVMSUFBZ0FrRWZha0VGZGlJRUVFRUVRQ0FBRURWQklBOExJQUFvQWhBaUJVRi9RU0JCQUNBQ2F5SUNRUjl4SWdacmRFRi9jeUFDZEVGL0lBWWJOZ0lBUVFFZ0JDQUVRUUZOR3lFRVFRRWhBZ05BSUFJZ0JFWkZCRUFnQlNBQ1FRSjBha0YvTmdJQUlBSkJBV29oQWd3QkN3c2dBQ0FCTmdJRUlBQkJnSUNBZ0FKQkFVRWNJQU5CQlhaQlAzRWlBR3QwSUFCQlAwWWJOZ0lJQzBFVUMyc0FBa0FDUUFKQUFrQUNRQ0FBSUFGeVFROXhEZzhBQkFNRUFnUURCQUVFQXdRQ0JBTUVDMEhZQUVIWkFDQUJRUkJHR3c4TFFkb0FRZHNBSUFGQkNFWWJEd3RCM0FCQjNRQWdBVUVFUmhzUEMwSGVBRUhmQUNBQlFRSkdHdzhMUWVBQVFlRUFJQUZCQVVZYkN6RUJBWDlCQVNFQkFrQUNRQUpBSUFCQkNtc09CQUlCQVFJQUN5QUFRYWpBQUVZTkFRc2dBRUdwd0FCR0lRRUxJQUVMdFFJQkEzOENRQUpBSUFBb0FqQWlDVUVCYWlJS0lBQW9BaXdpQ0UwRVFDQUFLQUlvSVFnTUFRc2dBQ2dDSUNnQ0VDSUpRUkJxSUFBb0FpaEJDQ0FJUVFOc1FRRjJJZ2dnQ0VFSVRSc2lDaUFBS0FJa2JDQUpLQUlJRVFFQUlnaEZCRUJCZnlFSURBSUxJQUFnQ0RZQ0tDQUFJQW8yQWl3Z0FDZ0NNQ0lKUVFGcUlRb0xJQUFnQ2pZQ01DQUlJQUFvQWlRZ0NXeHFJZ2dnQnpZQ0JDQUlJQVk2QUFBZ0NDQUVOZ0lNSUFnZ0JUWUNDQ0FJSUFNNkFBRWdDRUVRYWlFRUlBQW9BZ3hCQVhRaEJVRUFJUUFEUUNBQUlBVkdSUVJBSUFRZ0FFRUNkQ0lHYWlBQklBWnFLQUlBTmdJQUlBQkJBV29oQUF3QkN3c2dCQ0FGUVFKMGFpRUJRUUFoQ0VFQUlRQURRQ0FBSUFOR0RRRWdBU0FBUVFKMElnUnFJQUlnQkdvb0FnQTJBZ0FnQUVFQmFpRUFEQUFMQUFzZ0NBdHBBUVIvSUFFUVB5RURBMEFDUUNBQUxRQUFSUVJBUVg4aEFnd0JDd05BQW44Z0FFRXNFS1lESWdSRkJFQWdBQkEvREFFTElBUWdBR3NMSWdVZ0EwWUVRQ0FBSUFFZ0F4QmhSUTBDQ3lBQUlBVnFRUUZxSVFBZ0JBMEFDeUFDUVFGcUlRSU1BUXNMSUFJTFRBRUNmd0pBSUFBb0FnUWlBeUFDYWlJRUlBQW9BZ2hMQkg4Z0FDQUVFTVlCRFFFZ0FDZ0NCQVVnQXdzZ0FDZ0NBQ0lEYWlBQklBTnFJQUlRSHhvZ0FDQUFLQUlFSUFKcU5nSUVDd3ROQVFSL0lBQW9BZ2doQXlBQVFRQTJBZ2dnQUNnQ0FDRUVJQUJDQURjQ0FDQUFLQUlRSVFVZ0FDZ0NEQ0VHSUFBZ0F5QUVJQUVnQWtFQUVOc0NJUUFnQmlBRFFRQWdCUkVCQUJvZ0FBc1hBQ0FBSUFGQi93RnhFQkVnQUNBQ1FmLy9BM0VRS2d1akdnRU5meU1BUWRBRmF5SUVKQUFnQkNBQ0tBSUFJZ1UyQXB3RUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FGTFFBQUlnZ0VRQ0FJUWR3QVJ3MEdJQVZCQVdvaUJ5QUFLQUljVHcwQklBUWdCVUVDYWlJR05nS2NCQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFVdEFBRWlDRUhUQUdzT0JRUUJBUUVHQUFzQ1FDQUlRZU1BYXc0Q0NBY0FDd0pBSUFoQjh3QnJEZ1VEQVFFQkJRQUxJQWhCeEFCR0RRRWdDRUhRQUVZZ0NFSHdBRVp5RFFnTElBQW9BaWdoQVF3TkMwRUJJUWtNQkF0QkFpRUpEQU1MUVFNaENRd0NDMEVFSVFrTUFRdEJCU0VKQ3lBSlFRRjBRUXh4UWJDQkFtb29BZ0FpQmk4QkFDRUZJQUFvQWtBaEFDQUJRVFEyQWhBZ0FTQUFOZ0lNUVFBaEF5QUJRUUEyQWdnZ0FVSUFOd0lBSUFsQkFYRWhBQ0FHUVFKcUlRWWdCVUVCZENFSlFRQWhDQUpBQTBBZ0NDQUpSd1JBSUFZZ0NFRUJkR292QVFBaEJ5QUJLQUlBSWdVZ0FTZ0NCRTRFUUNBQklBVkJBV29RMlFJTkF5QUJLQUlBSVFVZ0FTZ0NDQ0VEQ3lBQklBVkJBV28yQWdBZ0F5QUZRUUowYWlBSE5nSUFJQWhCQVdvaENBd0JDd3RCZ0lDQWdBUWhDQ0FBUlEwTElBRVEyZ0pGRFFzTElBRW9BZ3dnQVNnQ0NFRUFJQUVvQWhBUkFRQWFEQXdMQWtBZ0JpMEFBQ0lCUWQ4QmNVSEJBR3RCL3dGeFFScFBCRUFnQUNnQ0tDRUdJQU5GSUFGQjN3QkdJQUZCTUd0Qi93RnhRUXBKY2tWeURRRWdCZzBNQ3lBRUlBVkJBMm8yQXB3RUlBRkJIM0VoQ0F3S0N5QUdEUW9nQkNBSE5nS2NCRUhjQUNFSURBa0xJQUFvQWloRkJFQkJBQ0VCREFZTElBWXRBQUJCK3dCSERRSWdCRUhnQkdvaEJRSkFBa0FDUUFKQUFrQURRQUpBSUFaQkFXb2hDU0FHTFFBQklnTVFyd05GRFFBZ0JTQUVRZUFFYW10QlBrc05BaUFGSUFNNkFBQWdCVUVCYWlFRklBa2hCZ3dCQ3dzZ0JVRUFPZ0FBSUFSQm9BUnFJUVVDUUNBSkxRQUFJZ05CUFVjTkFDQUdRUUpxSVFrZ0JFR2dCR29oQlFOQUlBa3RBQUFpQXhDdkEwVU5BU0FGSUFSQm9BUnFhMEUvVHdSQUlBQkJyZUVBUVFBUU9nd1NCU0FGSUFNNkFBQWdCVUVCYWlFRklBbEJBV29oQ1F3QkN3QUxBQXNnQlVFQU9nQUFJQU5CL1FCSEJFQWdBRUhEbEFGQkFCQTZEQkFMUVFFaEF3SkFBa0FnQkVIZ0JHcEJ5aWRCQnhCaFJRMEFJQVJCNEFScVFmZjdBRUVERUdGRkRRQkJBQ0VESUFSQjRBUnFRYmszUVJJUVlVVU5BQ0FFS0FMZ0JFSHp4dUVEUncwQkN5QUFLQUpBSVFZZ0FVRTBOZ0lRSUFFZ0JqWUNEQ0FCUVFBMkFnZ2dBVUlBTndJQVFlQ25BaUFFUWFBRWFoQ3ZCQ0lNUVFCSUJFQWdCa0VBUVFBUTh3UWFJQUJCc3lkQkFCQTZEQkVMSUFFaEJTQURSUVJBSUFSQk5EWUN6QVVnQkNBR05nTElCU0FFUVFBMkFzUUZJQVJDQURjQ3ZBVWdCRUUwTmdLNEJTQUVJQVkyQXJRRklBUkJBRFlDc0FVZ0JFSUFOd0tvQlNBRVFid0ZhaUVGQ3lBTVFRRnFJUTVCMExrQ0lRQkJBQ0VIQWtBRFFDQUFRWUhPQWtrRVFDQUhJUXNnQUMwQUFDSUd3Q0VOQW44Z0FFRUJhaUFHUWY4QWNTSUhRZUFBU1EwQUdpQUFMUUFCSVFvZ0IwSHZBRTBFUUNBSFFRaDBJQXB5UWFDL0FXc2hCeUFBUVFKcURBRUxJQUF0QUFJZ0IwRVFkSElnQ2tFSWRISkJvTisvQTJzaEJ5QUFRUU5xQ3lFR0lBMUJBRTRFUUNBSElBdHFRUUZxSVFjZ0JpRUFEQUlMSUFaQkFXb2hBQ0FISUF0cVFRRnFJUWNnRGlBR0xRQUFSdzBCSUFVZ0N5QUhFSDVGRFFFTUFnc0xJQU1OQzBHUXpnSWhBRUVBSVFZZ0RFRTJSaUVOSUF4QkdFY2hEd05BSUFCQnI5UUNTUVJBSUFZaEN5QUFMQUFBSWdaQi93RnhJUWNDZnlBQVFRRnFJQVpCQUU0TkFCb2dBQzBBQVNFS0lBWkJ2MzlOQkVBZ0IwRUlkQ0FLY2tHQS93RnJJUWNnQUVFQ2Fnd0JDeUFBTFFBQ0lBZEJFSFJ5SUFwQkNIUnlRWUQvL2dWcklRY2dBRUVEYWdzaUFFRUJhaUVLSUFjZ0MycEJBV29oQmlBQUxRQUFJUWNDUUFKQUlBMUZCRUJCQUNFQUlBOE5BUXNnQjBVTkFTQUVRYWdGYWlBTElBWVFma1VOQVF3RUN3TkFJQUFnQjBZTkFTQUFJQXBxSVJBZ0FFRUJhaUVBSUE0Z0VDMEFBRWNOQUFzZ0JFR29CV29nQ3lBR0VINE5Bd3NnQnlBS2FpRUFEQUVMQ3lBTVFUWkhJQXhCR0VkeFJRUkFJQVJCcUFWcUVOb0NEUUVnQVNBRktBSUlJQVVvQWdBZ0JDZ0NzQVVpQUNBRUtBS29CVUVCRU5zQ0RRRU1Dd3NnQVNBRktBSUlJQVVvQWdBZ0JDZ0NzQVVpQUNBRUtBS29CVUVBRU5zQ1JRMEtDeUFFS0FLd0JTRUFJQVFvQXJRRklRRWdCQ2dDdUFVaEFnTkFJQU1OQUNBRktBSU1JQVVvQWdoQkFDQUZLQUlRRVFFQUdpQUJJQUJCQUNBQ0VRRUFHZ3dBQ3dBTEFrQWdCRUhnQkdwQnJSMUJFUkJoQkVBZ0JFSGdCR3BCanZ3QVFRTVFZUTBCQ3lBQUtBSkFJUU1nQVVFME5nSVFJQUVnQXpZQ0RDQUJRUUEyQWdnZ0FVSUFOd0lBSUFFZ0JFR2dCR29RcHdZaUEwVU5DaUFCS0FJTUlBRW9BZ2hCQUNBQktBSVFFUUVBR2lBRFFYNUhEUVVnQUVHTUhVRUFFRG9NRUFzZ0JDMEFvQVFOQUNBQUtBSkFJUU1nQVVFME5nSVFJQUVnQXpZQ0RDQUJRUUEyQWdnZ0FVSUFOd0lBSUFFZ0JFSGdCR29RcHdZaUEwRi9SZzBESUFOQkFFNE5DUUpBUWZEWkFpQUVRZUFFYWhDdkJDSURRUUJJRFFBQ2Z3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQURRU0pyRGhNV0JSVUFCQTRNQ3c4TkNnWUhFQUlCQXdrSUVRc2dCRUtHZ0lDQThBQTNBd2dnQkVLQWdJQ0FFRGNEQUNBQklBUVFmUXdSQ3lBRVFvT0FnSUR3QURjRElDQUVRb0dBZ0lBUU53TVlJQVJDZ0lDQWdJQ0FCRGNERUNBQklBUkJFR29RZlF3UUN5QUVRVUJyUW9PQWdJRHdBRGNEQUNBRVFvR0FnSUF3TndNNElBUkNnSUNBZ01BQU53TXdJQUVnQkVFd2FoQjlEQThMSUFSQ2c0Q0FnUEFBTndOZ0lBUkNnWUNBZ01BQU53TllJQVJDZ0lDQWdDQTNBMUFnQVNBRVFkQUFhaEI5REE0TElBUkJCellDa0FFZ0JFS0RnSUNBTURjRGlBRWdCRUtEZ0lDQUVEY0RnQUVnQkVLQmdJQ0F3QUEzQTNnZ0JFS0FnSUNBNEFFM0EzQWdBU0FFUWZBQWFoQjlEQTBMSUFSQ2c0Q0FnUEFBTndQSUFTQUVRb0dBZ0lBZ053UEFBU0FFUW9PQWdJQXdOd080QVNBRVFvT0FnSUFRTndPd0FTQUVRb0dBZ0lEQUFEY0RxQUVnQkVLQWdJQ0E0SWNCTndPZ0FTQUJJQVJCb0FGcUVIME1EQXNnQkVFSE5nTG9BU0FFUW9PQWdJRGdBRGNENEFFZ0JFS0JnSUNBMEFBM0E5Z0JJQVJDZ0lDQWdKQ29nSUEvTndQUUFTQUJJQVJCMEFGcUVIME1Dd3NnQkVLRGdJQ0E4QUEzQTRBQ0lBUkNnWUNBZ05BQU53UDRBU0FFUW9DQWdJQ0FLRGNEOEFFZ0FTQUVRZkFCYWhCOURBb0xJQVJDaElDQWdQQUFOd1BJQWlBRVFvT0FnSURnQURjRHdBSWdCRUtCZ0lDQXNBRTNBN2dDSUFSQ25vQ0FnREEzQTdBQ0lBUkNuWUNBZ0JBM0E2Z0NJQVJDZzRDQWdCQTNBNkFDSUFSQ2dZQ0FnUEFBTndPWUFpQUVRb0NBZ0lEZ2h3RTNBNUFDSUFFZ0JFR1FBbW9RZlF3SkN5QUVRUWMyQXBnRElBUkNob0NBZ01BQU53T1FBeUFFUW95QWdJQXdOd09JQXlBRVFvT0FnSUFRTndPQUF5QUVRb0dBZ0lEZ0F6Y0QrQUlnQkVLQmdJQ0EwQU0zQS9BQ0lBUkNpSUNBZ0RBM0ErZ0NJQVJDZzRDQWdCQTNBK0FDSUFSQ2dZQ0FnUEFBTndQWUFpQUVRb0NBZ0lEZzM4RUFOd1BRQWlBQklBUkIwQUpxRUgwTUNBc2dBVUVCRUswRERBY0xJQUZCQWhDdEF3d0dDeUFCUVFjUXJRTU1CUXNnQkVLRmdJQ0E4QUEzQTdBRElBUkNnWUNBZ05BQk53T29BeUFFUW9LQWdJQVFOd09nQXlBQklBUkJvQU5xRUgwTUJBc2dCRUtGZ0lDQThBQTNBOUFESUFSQ2dZQ0FnT0FCTndQSUF5QUVRb0tBZ0lEQUFEY0R3QU1nQVNBRVFjQURhaEI5REFNTElBUkNoWUNBZ1BBQU53UHdBeUFFUW9HQWdJRHdBVGNENkFNZ0JFS0NnSUNBd0FBM0ErQURJQUVnQkVIZ0Eyb1FmUXdDQ3lBRVFvV0FnSUR3QURjRGtBUWdCRUtCZ0lDQW9BRTNBNGdFSUFSQ2dZQ0FnSUFHTndPQUJDQUJJQVJCZ0FScUVIME1BUXNnQTBFaFN3MEJJQUVnQTBFUWFoQ21CZ3RGRFFvTUJBc2dBU2dDRENBQktBSUlRUUFnQVNnQ0VCRUJBQm9MSUFCQjllVUFRUUFRT2d3T0N5QUJRUUJCZ0lERUFCQitEUUVNQndzZ0FVRUFRWUFCRUg1RkRRWUxJQUVvQWd3Z0FTZ0NDRUVBSUFFb0FoQVJBUUFhQ3lBQUVLZ0NEQW9MUVFBaENDQUZJQUFvQWh4SkRRWUxJQUJCeS9NQVFRQVFPZ3dJQ3lBQVFhZktBRUVBRURvTUJ3c2dCU2dDRENBRktBSUlRUUFnQlNnQ0VCRUJBQm9nQkNnQ3RBVWdBRUVBSUFRb0FyZ0ZFUUVBR2dzQ1FDQUlRZEFBUncwQUlBRVEyZ0pGRFFBZ0FTZ0NEQ0FCS0FJSVFRQWdBU2dDRUJFQkFCb01CZ3NnQkNBSlFRRnFOZ0tjQkVHQWdJQ0FCQ0VJREFNTElBUWdCellDbkFRZ0JFR2NCR29nQVVFQmRCRDVBU0lEUVFCT0JFQWdBeUVJREFNTEFrQWdBMEYrUncwQUlBUW9BcHdFSWdVdEFBQWlBMFVOQUVHcWtBRWdBMEVRRVBzQklBRkZjZzBCREFRTElBRU5BeUFFS0FLY0JDRUZDeUFJd0VFQVRnMEFJQVZCQmlBRVFad0VhaEJZSWdoQmdJQUVTUTBCSUFBb0FpZ05BU0FBUVk3SUFFRUFFRG9NQXdzZ0JDQUZRUUZxTmdLY0JBc2dBaUFFS0FLY0JEWUNBQXdDQ3lBQVFhZk9BRUVBRURvTFFYOGhDQXNnQkVIUUJXb2tBQ0FJQ3g4QkFYOGdBQ2dDUENJQlFRQklCSDhnQUJDcUJob2dBQ2dDUEFVZ0FRc0xnUU1CQkg4akFFRVFheUlFSkFBZ0JDQUJLQUlBSWdVMkFnd2dBa0VCZENFR0lBQWhBd0ovQTBBQ1FBSkFBa0FDZndKQUFrQWdCUzBBQUNJQ1Fkd0FSd1JBSUFKQlBrY05BU0FBSUFOR0RRWWdBMEVBT2dBQUlBRWdCQ2dDREVFQmFqWUNBRUVBREFnTElBUWdCVUVCYWpZQ0RDQUZMUUFCUWZVQVJnMEJEQVVMSUFMQVFRQk9EUUlnQlVFR0lBUkJER29RV0F3QkN5QUVRUXhxSUFZUStRRUxJZ0pCLy8vREFFc05BZ3dCQ3lBRUlBVkJBV28yQWd3TEFrQWdBQ0FEUmdSQUFuOGdBa0gvQUUwRVFDQUNRUU4yUWZ6Ly8vOEJjVUdRZ1FKcUtBSUFJQUoyUVFGeERBRUxJQUlRdVFNTFJRMENEQUVMQW44Z0FrSC9BRTBFUUNBQ1FRTjJRZnovLy84QmNVR2dnUUpxS0FJQUlBSjJRUUZ4REFFTElBSkIvdi8vQUhGQmpNQUFSaUFDRU5JRVFRQkhjZ3RGRFFFTElBTWdBR3RCK1FCS0RRQUNmeUFDUWY4QVRRUkFJQU1nQWpvQUFDQURRUUZxREFFTElBTWdBaENoQXlBRGFnc2hBeUFFS0FJTUlRVU1BUXNMUVg4TElRSWdCRUVRYWlRQUlBSUxEUUFnQUVFR1FYOUJCUkQvQlF0Z0FRRjhJQUFwQWdSQy8vLy8vLy8vLy84L1dBUkFJQUVnQVNzRENFUUFBQUFBQUFEd1B5QUFLQUlBdHlJQ282QTVBd2dnQVNBQkt3TVFJQUFvQWdRaUFFRWZkU0FBUWYvLy8vOEhjU0FBUVI5MmRHcEJFV3E0SUFLam9Ea0RFQXNMbWdFQkJIOGdBRUVRYWlFRklBQWhCZ0pBQTBBZ0FrRUFUQTBCQWtBQ1FBSi9JQVl0QUFkQmdBRnhCRUFnQlNBQlFRRjBhaThCQUF3QkN5QUJJQVZxTFFBQUN5SUFRVEJySWdSQkNra05BQ0FBUWNFQWEwRUZUUVJBSUFCQk4yc2hCQXdCQ3lBQVFlY0FhMEY2U1EwQklBQkIxd0JySVFRTElBSkJBV3NoQWlBQlFRRnFJUUVnQkNBRFFRUjBjaUVEREFFTEMwRi9JUU1MSUFNTEpnRUJmeU1BUVJCcklnSWtBQ0FDUVFBMkFnd2dBRUVGSUFGQkFCQ1NCQ0FDUVJCcUpBQUx3UUVCQTM4Q1FDQUJJQUlvQWhBaUF3Ui9JQU1GSUFJUXpnTU5BU0FDS0FJUUN5QUNLQUlVSWdWclN3UkFJQUlnQUNBQklBSW9BaVFSQVFBUEN3SkFJQUlvQWxCQkFFZ0VRRUVBSVFNTUFRc2dBU0VFQTBBZ0JDSURSUVJBUVFBaEF3d0NDeUFBSUFOQkFXc2lCR290QUFCQkNrY05BQXNnQWlBQUlBTWdBaWdDSkJFQkFDSUVJQU5KRFFFZ0FDQURhaUVBSUFFZ0Eyc2hBU0FDS0FJVUlRVUxJQVVnQUNBQkVCOGFJQUlnQWlnQ0ZDQUJhallDRkNBQklBTnFJUVFMSUFRTGl3RUJBMzhqQUVFUWF5SUFKQUFDUUNBQVFReHFJQUJCQ0dvUUJRMEFRWXplQkNBQUtBSU1RUUowUVFScUVMRUJJZ0UyQWdBZ0FVVU5BQ0FBS0FJSUVMRUJJZ0VFUUVHTTNnUW9BZ0FpQWlBQUtBSU1RUUowYWtFQU5nSUFJQUlnQVJBRVJRMEJDMEdNM2dSQkFEWUNBQXNnQUVFUWFpUUFRWWpWQkVITTFRUTJBZ0JCd05RRVFTbzJBZ0FMVkFBakFFRVFheUlDSkFBZ0FDQUNRUWhxSUFNcEF3QVFRZ1IrUW9DQWdJRGdBQVVnQWlrRENFS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVXExQ2dJQ0FnQkNFQ3lFQklBSkJFR29rQUNBQkMxUUFJd0JCRUdzaUFpUUFJQUFnQWtFSWFpQURLUU1BRUVJRWZrS0FnSUNBNEFBRklBSXBBd2hDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGYXRRb0NBZ0lBUWhBc2hBU0FDUVJCcUpBQWdBUXRWQVFGL0FrQUNRQUpBSUFGQ0lJaW5RUUZxRGdNQUFRSUJDeUFCcHlJQ0x3RUdRUVpIRFFBZ0Fpa0RJQ0lCUW9DQWdJQndnMEtBZ0lDQUVGRU5BUXNnQUVIazBRQkJBQkFWUW9DQWdJRGdBQ0VCQ3lBQkMyNEJCWDlCNkFJaEFRTkFJQUVnQWs0RVFDQUFJQUVnQW1wQkFYWWlBMEVDZEVHUWdnSnFLQUlBSWdSQkQzWWlCVWtFUUNBRFFRRnJJUUVNQWdzZ0FDQUVRUWgyUWY4QWNTQUZha2tFUUVFQkR3VWdBMEVCYWlFQ0RBSUxBQXNMSUFCQnNKRUNRZUNTQWtFR0VLd0RDeEVBSUFCQmdKTUNRY0NZQWtFV0VLd0RDMFlCQVg4Q1FDQUFLQUlJSUFKcUlnTWdBQ2dDREVvRVFDQUFJQU1nQVJDM0FnMEJDd05BSUFKQkFFd0VRRUVBRHdzZ0FrRUJheUVDSUFBZ0FSQ0xBVVVOQUFzTFFYOExtQUVDQlg4QmZpQUJLUUlFSWdpblFmLy8vLzhIY1NJRVJRUkFJQUlQQ3lBQUtBSUVJUU1DZnlBSVFvQ0FnSUFJZzFCRkJFQWdBUzhCRUF3QkN5QUJMUUFRQ3lFR0lBTkIvLy8vL3dkeElRVWdCRUVCYXlFSEFrQURRQ0FDSUFScUlBVktEUUVnQUNBR0lBSVF4d0VpQTBFQVNDQURJQVJxSUFWS2NnMEJJQUFnQVNBRFFRRnFJZ0pCQVNBSEVMTUREUUFMSUFNUEMwRi9DNVlDQVFSL0lBQW9BaEFoQmlBQktBSUFJZ1V0QUJBRWZ5QUdJQVVRa0FRZ0JTZ0NGQ0FEYWtHQmdOenhlV3dnQkdwQmdZRGM4WGxzQlVFQUN5RUhBbjhnQlNnQ0lDSUlJQVVvQWh4T0JFQWdBQ0FCSUFJZ0NFRUJhaEM4QlFSQVFYOGdCUzBBRUVVTkFob2dCaUFGRUpRRFFYOFBDeUFCS0FJQUlRVUxJQVV0QUJBRVFDQUZJQWMyQWhRZ0JpQUZFSlFEQ3lBRklBVW9BaUFpQVVFQmFqWUNJQ0FGSUFGQkEzUnFJZ0VnQUNBREVCZ2lBRFlDTkNBQklBRW9BakJCLy8vL0gzRWdCRUVhZEhJMkFqQWdCU0FGTFFBUklBQkJIM1p5T2dBUklBRWdBU2dDTUVHQWdJQmdjU0FGSUFBZ0JTZ0NHSEZCZjNOQkFuUnFJZ0FvQWdCQi8vLy9IM0Z5TmdJd0lBQWdCU2dDSURZQ0FFRUFDd3VuQVFJQ2Z3RitBa0FDUUNBQUlBRVEwQU1pQTBFQVNBMEFJQU5GRFFGQmxUQWhBaUFBSUFBZ0FVSHRBQ0FCUVFBUUZDSUVRb0NBZ0lCd2d5SUJRb0NBZ0lBZ1VTQUJRb0NBZ0lBd1VYSUVmMEdWTUFVZ0FVS0FnSUNBNEFCUkRRRWdBQ0FFRURjaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQlFRQWhBaUFCcDBIbkFFRUFFTWNCSVFNZ0FDQUJFQThnQTBFQVRnMENRWXZkQUF0QkFCQVZDMEYvSVFJTElBSUxxUU1CQzM4Q1FDQUFLQUlRSWdRb0F0QUJRUUYwUVFKcUlBUW9Bc3dCVEEwQUlBUkJFR29pQ1VFRUlBUW9Bc2dCSWdOQkFXb2lDSFFpQlNBRUtBSUFFUU1BSWdkRkRRQkJBU0FJZENFS0lBZEJBQ0FGRUNzaEJ5QUVLQUxNQVNJRlFRQWdCVUVBU2hzaEMwRWZJQU5ySVF3RFFDQUVLQUxVQVNFRElBWWdDMFpGQkVBZ0F5QUdRUUowYWlnQ0FDRURBMEFnQXdSQUlBTW9BaWdoQlNBRElBY2dBeWdDRkNBTWRrRUNkR29pRFNnQ0FEWUNLQ0FOSUFNMkFnQWdCU0VEREFFTEN5QUdRUUZxSVFZTUFRc0xJQWtnQXlBRUtBSUVFUUFBSUFRZ0J6WUMxQUVnQkNBS05nTE1BU0FFSUFnMkFzZ0JDeUFBSUFKQkEzUkJRR3NRS1NJRFJRUkFRUUFQQ3lBRFFRSTZBQlFnQTBFQk5nSVFJQVFvQWxBaUJTQURRUmhxSWdZMkFnUWdBeUFFUWRBQWFqWUNIQ0FESUFVMkFoZ2dCQ0FHTmdKUUlBRUVRQ0FCSUFFb0FnQkJBV28yQWdBTElBTkNBRGNDQUNBRElBRTJBandnQTBJQU53SXdJQU1nQWpZQ0xDQURRUU0yQWlnZ0EwRUJPd0VnSUFOQ0FEY0NDQ0FESUFGQmdZRGM4WGxzUWYvL280NEdhellDSkNBQUtBSVFJQU5CRUdvaUFCQ1VBeUFBQzQ0RUFRSitJd0JCSUdzaUFpUUFJQU1wQXdBaEJRSkFBa0FDUUNBRUJFQWdCVUwvLy8vL2IxZ0VRQ0FBRUNRTUF3c2dCYWNpQkNBRUtBSUFRUUZxTmdJQURBRUxJQUFnQlJBbElnVWhBU0FGUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlMQWtBZ0FDQURLUU1JRURFaUEwVU5BRUtBZ0lDQU1DRUJBa0FDUUNBRlFvQ0FnSUJ3VkEwQUlBQWdBaUFGcHlBREVFd2lCRUVBU0EwQ0lBUkZEUUFnQUJBMElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFRSkFJQUl0QUFCQkVIRUVRQ0FDS1FNUUlnWkNJSWluUVhWUEJFQWdCcWNpQkNBRUtBSUFRUUZxTmdJQUN5QUFJQUZCd1FBZ0JrR0hnQUVRR1VFQVNBMERJQUlwQXhnaUJrSWdpS2RCZFU4RVFDQUdweUlFSUFRb0FnQkJBV28yQWdBTElBQWdBVUhDQUNBR1FZZUFBUkFaUVFCT0RRRU1Bd3NnQWlrRENDSUdRaUNJcDBGMVR3UkFJQWFuSWdRZ0JDZ0NBRUVCYWpZQ0FBc2dBQ0FCUWNBQUlBWkJoNEFCRUJsQkFFZ05BaUFBSUFGQlBpQUNOUUlBUWdHSVFnR0RRb0NBZ0lBUWhFR0hnQUVRR1VFQVNBMENDeUFBSUFGQlB5QUNOUUlBUWdLSVFnR0RRb0NBZ0lBUWhFR0hnQUVRR1VFQVNBMEJJQUFnQVVFOUlBSTFBZ0JDQVlOQ2dJQ0FnQkNFUVllQUFSQVpRUUJJRFFFZ0FDQUNFRWdMSUFBZ0F4QVRJQUFnQlJBUERBTUxJQUFnQWhCSUlBQWdBUkFQQ3lBQUlBTVFFeUFBSUFVUUR3dENnSUNBZ09BQUlRRUxJQUpCSUdva0FDQUJDMVVCQVg4akFFRWdheUlGSkFBQ1FDQUFJQVVnQXhEN0JFRUFTQVJBUVg4aEJBd0JDeUFBSUFFZ0FpQUZLUU1JSUFVcEF4QWdCU2tER0NBRktBSUFJQVJ5RUcwaEJDQUFJQVVRU0FzZ0JVRWdhaVFBSUFRTGdnSURCSDhCZmdKOEl3QkI0QUJySWdZa0FFS0FnSUNBNEFBaENRSkFJQUFnQVNBR1FSQnFJQVJCRDNFaUNDQUVRUWgyUVE5eElnZEZFTGNESWdWQkFFZ05BRVFBQUFBQUFBRDRmeUVLQWtBZ0JVVWdBa0VBVEhJTkFFRUFJUVVnQkVFRWRrRVBjU0FIYXlJRUlBSWdBaUFFU2hzaUFrRUFJQUpCQUVvYklRSURRQ0FDSUFWSEJFQWdBQ0FHUVFocUlBTWdCVUVEZEdvcEF3QVFRZzBESUFZckF3Z2lDNzFDZ0lDQWdJQ0FnUGovQUlOQ2dJQ0FnSUNBZ1BqL0FGRU5BaUFHUVJCcUlBVWdCMnBCQTNScUlBdWRPUU1BSUFWQkFXb2hCUXdCQ3dzZ0JrRVFhaUFJRU9BQ0lRb0xJQUFnQVNBS0VNa0VJUWtMSUFaQjRBQnFKQUFnQ1F2SEFRRUJmd0pBQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlETHdFR1FRcEhEUUFnQUNBREtRTWdFQThnQXdKK0lBSzlJZ0VDZnlBQ21VUUFBQUFBQUFEZ1FXTUVRQ0FDcWd3QkMwR0FnSUNBZUFzaUFMZTlVUVJBSUFDdERBRUxRb0NBZ0lEQWZpQUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3lJQk53TWdJQUZDSUlpblFYVkpEUUVnQWFjaUFDQUFLQUlBUVFGcU5nSUFJQUVQQ3lBQVFhMHhRUUFRRlVLQWdJQ0E0QUFoQVFzZ0FRc3BBUUYrSUFBZ0FSQ3FBU0lCUlFSQVFvQ0FnSURnQUE4TElBQWdBUkF0SVFJZ0FDQUJFQk1nQWdzaEFDQUFRcEFEZ1ZDdFF1NENRdTBDSUFCQ0E0TlFHeUFBUXVRQWdWQ3RmWHdMV1FFQmZpQUFRdTBDZmlBQVFyRVBmVUlDaDN3Z0FFTHREbjBpQVNBQlF1UUFnU0lCZlNBQlFqK0hRcHgvZzN4Q25IOS9mQ0FBUXNFTWZTSUFJQUJDa0FPQklnQjlJQUJDUDRkQzhIeURmRUtRQTM5OFFzcnhLMzBMeFFFQ0NIOEJmaUFBSUFFUW5BSkJmeUVFQWtBZ0FTZ0NBQ0lIUVFOcUlnZ2dBQ2tDQkNJTHAwSC8vLy8vQjNGS0RRQWdBRUVRYWlFRklBdENnSUNBZ0FpRElRc0RRQ0FEUVF4R0RRRWdBMEVEYkNFSlFRQWhBQUpBQTBBZ0FFRURSZzBCSUFBZ0Iyb2hCaUFBSUFscUlRb2dBRUVCYWlFQUFuOGdDMUJGQkVBZ0JTQUdRUUYwYWk4QkFBd0JDeUFGSUFacUxRQUFDeUFLUWVEUkFXb3NBQUJHRFFBTElBTkJBV29oQXd3QkN3c2dBaUFEclRjREFDQUJJQWcyQWdCQkFDRUVDeUFFQzdRQkFnUi9BWDRqQUVFUWF5SURKQUFnQXlBQktBSUFJZ1EyQWd4QmZ5RUdJQUFwQWdRaUI2ZEIvLy8vL3dkeElBUktCRUFnQUVFUWFpRUZBa0FDUUFKL0lBZENnSUNBZ0FpRFVFVUVRQ0FGSUFSQkFYUnFMd0VBREFFTElBUWdCV290QUFBTElnVkJLMnNPQXdBQkFBRUxJQU1nQkVFQmFqWUNEQXNnQUNBRFFReHFJQUlRblFJaUJpQUZRUzFIY2tVRVFDQUNRZ0FnQWlrREFIMDNBd0FMSUFFZ0F5Z0NERFlDQUFzZ0EwRVFhaVFBSUFZTDhRa0RBWHdMZndGK0l3QkIwQUpySWdJa0FFS0FnSUNBNEFBaEVRSkFJQUFnQVNBQ1FjQUJhaUFFUVFSMklnTkJBWEZCQUJDM0F5SUdRUUJJRFFBZ0EwRVBjU0VOSUFaRkJFQWdEVUVDUmdSQUlBQkI4NElCUVFBUVVBd0NDeUFBUWQzaUFCQmlJUkVNQVFzQ2Z5QUNLd09BQWlJRm1VUUFBQUFBQUFEZ1FXTUVRQ0FGcWd3QkMwR0FnSUNBZUFzaERnSi9JQUlyQS9nQklnV1pSQUFBQUFBQUFPQkJZd1JBSUFXcURBRUxRWUNBZ0lCNEN5RVBBbjhnQWlzRDhBRWlCWmxFQUFBQUFBQUE0RUZqQkVBZ0Jhb01BUXRCZ0lDQWdIZ0xJUkFDZnlBQ0t3UG9BU0lGbVVRQUFBQUFBQURnUVdNRVFDQUZxZ3dCQzBHQWdJQ0FlQXNoQ1FKL0lBSXJBK0FCSWdXWlJBQUFBQUFBQU9CQll3UkFJQVdxREFFTFFZQ0FnSUI0Q3lFS0FuOGdBaXNEMkFFaUJabEVBQUFBQUFBQTRFRmpCRUFnQmFvTUFRdEJnSUNBZ0hnTElRY0NmeUFDS3dQUUFTSUZtVVFBQUFBQUFBRGdRV01FUUNBRnFnd0JDMEdBZ0lDQWVBc2hDd0ovSUFJckE4Z0JJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDeUVNSUFSQkFYRWhDQUovSUFJckE4QUJJZ1daUkFBQUFBQUFBT0JCWXdSQUlBV3FEQUVMUVlDQWdJQjRDeUVHUVFBaEF3SkFJQWhGRFFBZ0JFRVBjU0VJQWtBQ1FBSkFBa0FnRFE0RUFBRUNBd1FMSUFJZ0JqWUNZQ0FDSUFzMkFsUWdBaUFHUVI5MlFRUnlOZ0pjSUFJZ0RFRURiRUhnMFFGcU5nSllJQUlnRDBFRGJFSEEwUUZxTmdKUUlBSkJrQUpxUWNBQVFkdVpBU0FDUWRBQWFoQk9JUU1NQXdzZ0FpQUdOZ0tBQVNBQ0lBczJBbmdnQWlBR1FSOTJRUVJ5TmdKOElBSWdERUVEYkVIZzBRRnFOZ0owSUFJZ0QwRURiRUhBMFFGcU5nSndJQUpCa0FKcVFjQUFRY1g3QUNBQ1FmQUFhaEJPSVFNZ0NFRURSdzBDSUFKQmtBSnFJQU5xUVNBNkFBQWdBMEVCYWlFRERBSUxJQUlnQmpZQ29BRWdBa0dRQW1vaUNFSEFBRUdvK3dCQm92c0FJQVpCa000QVNSc2dBa0dnQVdvUVRpRURJQUlnQ3pZQ2xBRWdBaUFNUVFGcU5nS1FBU0FESUFocVFjQUFJQU5yUVpXQkFTQUNRWkFCYWhCT0lBTnFJUU1NQVFzZ0FpQUxOZ0swQVNBQ0lBeEJBV28yQXJBQklBSWdCallDdkFFZ0FpQUdRUjkyUVFSeU5nSzRBU0FDUVpBQ2FrSEFBRUcyK3dBZ0FrR3dBV29RVGlFRElBaEJBMGNOQUNBQ1FaQUNhaUFEYWtHc3dBQTdBQUFnQTBFQ2FpRURDd0pBSUFSQkFuRkZEUUFDUUFKQUFrQUNRQ0FORGdRQUFRSURCQXNnQWlBSk5nSUlJQUlnQ2pZQ0JDQUNJQWMyQWdBZ0FrR1FBbW9nQTJwQndBQWdBMnRCMTRFQklBSVFUaUFEYWlFRERBTUxJQUlnQ1RZQ0tDQUNJQW8yQWlRZ0FpQUhOZ0lnSUFKQmtBSnFJZ2NnQTJwQndBQWdBMnRCMTRFQklBSkJJR29RVGlBRGFpSURJQWRxUVMxQkt5QU9RUUJJR3pvQUFDQUNJQTRnRGtFZmRTSUVjeUFFYXlJRVFUeHVJZ1kyQWhBZ0FpQUdRVVJzSUFScU5nSVVJQWNnQTBFQmFpSUVha0UvSUFOclFhMzdBQ0FDUVJCcUVFNGdCR29oQXd3Q0N5QUNJQkEyQWp3Z0FpQUpOZ0k0SUFJZ0NqWUNOQ0FDSUFjMkFqQWdBa0dRQW1vZ0EycEJ3QUFnQTJ0Qm9JQUJJQUpCTUdvUVRpQURhaUVEREFFTElBSWdDVFlDU0NBQ0lBbzJBa1FnQWtIQkFFSFFBQ0FIUVF4SUd6WUNUQ0FDSUFkQkFXcEJERzlCQVdzMkFrQWdBa0dRQW1vZ0EycEJ3QUFnQTJ0Qm1JTUJJQUpCUUdzUVRpQURhaUVEQ3lBQUlBSkJrQUpxSUFNUWt3SWhFUXNnQWtIUUFtb2tBQ0FSQ3pjQ0FuOEJmaU1BUVJCcklnQWtBQ0FBRUtNRUlBQXBBd0FoQWlBQUtBSUlJUUVnQUVFUWFpUUFJQUZCNkFkdHJDQUNRdWdIZm53TGxBd0RDMzhEZmdGOEl3QkJvQUZySWdRa0FDQUVRZUFBYWtFQVFUZ1FLeG9nQkVJQk53TndJQVJDQVRjRGFFS0FnSUNBNEFBaEFTQUFJQU1wQXdBUUtDSVJRb0NBZ0lCd2cwS0FnSUNBNEFCU0JFQWdCRUVBTmdJTUlCR25JZ1VwQWdRaUQwS0FnSUNBQ0lNaEVBSkFBa0FDUUFKQUlBOUMvLy8vL3dlRFVBMEFJQVZCRUdvaEJ3SkFBbjhnRUZBaURFVUVRQ0FITHdFQURBRUxJQWN0QUFBTElnTkJNR3RCQ2trTkFDQURRU3RyRGdNQUFRQUJDMEtBZ0lDQXdINGhBU0FGSUFSQkRHb2dCRUhnQUdvUXpnUU5BeUFQcDBILy8vLy9CM0VoQmtFQklRa0RRQUpBQWtBQ1FDQUpRUWRHSUFRb0Fnd2lBeUFHVG5JTkFDQUpRUUowUWRqL0FXb29BZ0FoQWdKL0lBeEZCRUFnQnlBRFFRRjBhaThCQUF3QkN5QURJQWRxTFFBQUN5QUNSdzBBSUFRZ0EwRUJhaUlJTmdJTUlBbEJCa2NOQVNBR0lBaE1EUWRCNkFjaEFrRUFJUXNnQ0NFREEwQUNRQUpBSUFNZ0JrWUVRQ0FHSVFNTUFRc0NmeUFNUlFSQUlBY2dBMEVCZEdvdkFRQU1BUXNnQXlBSGFpMEFBQXNpQ2tFd2F5SU5RUXBKRFFFZ0F5QUlSZzBLQ3lBRUlBTTJBZ3dnQkNBTHJEY0RrQUVNQkFzZ0FrRUJSaUVPSUEwZ0FrRUtiU0lDYkNBTGFpQU9JQXBCTkV0eGFpRUxJQU5CQVdvaEF3d0FDd0FMSUFRZ0JDa0RhRUlCZlRjRGFDQURJQVpPQkVBZ0NVRURTeUVLREFVTEFuOENRQUpBQW44Z0RFVUVRQ0FISUFOQkFYUnFMd0VBREFFTElBTWdCMm90QUFBTElnSkJLMnNPQXdFSkFRQUxJQUpCMmdCSERRaENBQ0VQSUFOQkFXb01BUXNnQkNBRFFRRnFJZ00yQWd3Z0JpQURheUlEUVFaclFYNUpEUWNnQlNBRVFReHFJQVJCR0dvUTN3SU5CeUFEUVFWR0JFQWdCQ2dDRENFREFuOGdERVVFUUNBSElBTkJBWFJxTHdFQURBRUxJQU1nQjJvdEFBQUxRVHBIRFFnZ0JDQURRUUZxTmdJTUN5QUZJQVJCREdvZ0JFRVFhaERmQWcwSFFnQWdCQ2tERUNBRUtRTVlRangrZkNJUGZTQVBJQUpCTFVZYklROGdCQ2dDREFzaEEwRUFJUW9nQXlBR1JnMEZEQVlMSUFVZ0JFRU1haUFFUWVBQWFpQUpRUU4wYWhDZEFnMEZDeUFKUVFGcUlRa01BQXNBQ3lBRlFSQnFJUWdnRDZkQi8vLy8vd2R4SVFaQkFDRUNBMEFDUUNBR0lBSWlBMFlFUUNBR0lRTU1BUXNnQTBFQmFpRUNBbjhnRUZCRkJFQWdDQ0FEUVFGMGFpOEJBQXdCQ3lBRElBaHFMUUFBQzBFZ1J3MEJDd3NnQkNBRE5nSU1JQVVnQkVFTWFoQ2NBa0tBZ0lDQXdINGhBU0FFS0FJTUlnSWdCazROQWlBRVFmQUFhaUVLSUFSQjRBQnFRUWh5SVFjQ1FBSi9JQkJRSWdsRkJFQWdDQ0FDUVFGMGFpOEJBQXdCQ3lBQ0lBaHFMUUFBQzBFd2EwRUpUUVJBSUFVZ0JFRU1haUFLRUowQ0RRUWdCU0FFUVF4cUlBY1F6UVJGRFFFTUJBc2dCU0FFUVF4cUlBY1F6UVFOQXlBRklBUkJER29pQWhDY0FpQUZJQUlnQ2hDZEFnMERDeUFGSUFSQkRHb2lBaENjQWlBRklBSWdCRUhnQUdvUXpnUU5BaUFGSUFSQkRHb1FuQUpCQUNFREEwQWdBMEVEUmdSQUlBUW9BZ3dpQXlBR0lBTWdCa29iSVFJRFFFRUFJUW9nQWlBRFJnMERBa0FDUUFKL0lBbEZCRUFnQ0NBRFFRRjBhaThCQUF3QkN5QURJQWhxTFFBQUN5SUxRU3RyRGdNQUFRQUJDeUFFSUFOQkFXbzJBZ3dnQlNBRVFReHFJQVJCR0dvUTN3SU5CaUFGSUFSQkRHb2dCRUVRYWhEZkFnMEdRZ0FnQkNrREVDQUVLUU1ZUWp4K2ZDSUJmU0FCSUF0QkxVWWJJUThNQlFzZ0EwRUJhaUVEREFBTEFBc2dBMEVCYTBFQlRRUkFJQVFvQWd3aUFpQUdUZzBFQW44Z0NVVUVRQ0FJSUFKQkFYUnFMd0VBREFFTElBSWdDR290QUFBTFFUcEhEUVFnQkNBQ1FRRnFOZ0lNQ3lBRFFRTjBJUUlnQTBFQmFpRURJQVVnQkVFTWFpQUNJQVJxUWZnQWFoQ2RBa1VOQUFzTUFndENBQ0VQQzBFQUlRTURRQ0FEUVFkR1JRUkFJQU5CQTNRaUFpQUVRU0JxYWlBRVFlQUFhaUFDYWlrREFMazVBd0FnQTBFQmFpRUREQUVMQ3lBRVFTQnFJQW9RNEFJZ0QwTGcxQU4rdWFFaUVyMGlBUUovSUJLWlJBQUFBQUFBQU9CQll3UkFJQktxREFFTFFZQ0FnSUI0Q3lJRHQ3MVJCRUFnQTYwaEFRd0JDMEtBZ0lDQXdINGdBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3lFQkN5QUFJQkVRRHdzZ0JFR2dBV29rQUNBQkN5SUJBWDlCQVNFQklBQVF1UU1FZjBFQkJTQUFRYUNpQWtHZ3B3SkJGQkNzQXdzTGZRRUNmeU1BUVJCcklnRWtBQ0FCUVFvNkFBOENRQUpBSUFBb0FoQWlBZ1IvSUFJRklBQVF6Z01OQWlBQUtBSVFDeUFBS0FJVUlnSkdEUUFnQUNnQ1VFRUtSZzBBSUFBZ0FrRUJhallDRkNBQ1FRbzZBQUFNQVFzZ0FDQUJRUTlxUVFFZ0FDZ0NKQkVCQUVFQlJ3MEFJQUV0QUE4YUN5QUJRUkJxSkFBTG13RUJCSDhqQUVFUWF5SURKQUFnQWFjaUJDZ0NFQ0lDUVRCcUlRVWdBaUFDS0FJWVFYOXpRUUowUWJ4K2Ntb29BZ0FoQWdKQUFrQURRQ0FDUlEwQklBSkJBM1FnQldwQkNHc2lBaWdDQkVFd1J3UkFJQUlvQWdCQi8vLy9IM0VoQWd3QkN3c2dBeUFDTmdJTUlBQWdCQ0FEUVF4cUlBSW9BZ0JCR25aQlBIRVFrUU1OQVFzZ0JDQUVMUUFGUWY0QmNUb0FCUXNnQTBFUWFpUUFDN2NGQWdaL0EzNGpBRUV3YXlJRUpBQWdBQ2dDQUNFRlFvQ0FnSUF3SVF0Q2dJQ0FnREFoQ2dKQUlBRUVRRUYvSVFNZ0JSQStJZ3BDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFwQkFCQzBBU0VHSUFVZ0NoQVBJQVlOQVNBRkVENGlDMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMEJJQVVnQ2tId0FDQUxRWUNBQVJBWlFRQklEUUVMSUFCQkVHb2hCa0VBSVFNQ1FBSkFBMEFnQmlnQ0FFR0NmMFlFUUNBQUtBSVlJUWNnQkNBR0tRTVlOd01vSUFRZ0Jpa0RFRGNESUNBRUlBWXBBd2czQXhnZ0JDQUdLUU1BTndNUUlBZEJBV29oQnlBQUtRTWdJUWtDUUFKQUFrQWdBUVJBSUFsQ0lJaW5RWFZQQkVBZ0NhY2lDQ0FJS0FJQVFRRnFOZ0lBQ3lBRklBc2dBeUFKUVlTQUFSQ3ZBVUVBU0EwQ0lBVWdDaUFEQW40Z0FFSGdBRUVBSUFjZ0JFRVFhaUFFUVF4cUVQTUNSUVJBSUFRcEF5QU1BUXNnQkVLQWdJQ0FNRGNESUVLQWdJQ0FNQXRCaElBQkVLOEJRUUJJRFFJZ0FDZ0NLRUhnQUVjTkFTQUZJQXNRMUFRZ0JTQUtFTlFFSUFJZ0EwRUJhallDQUF3SEN5QUZJQWtRRHlBQVFvQ0FnSUF3TndNZ0lBQkI0QUJCQVNBSElBUkJFR29nQkVFTWFoRHpBZzBCQWtBZ0JDa0RJQ0lKcHlnQ0JFSC8vLy8vQjNGQkFTQURHd1JBSUFBZ0NVRUJFTFFCSVFjZ0FDZ0NBQ0FKRUE4Z0J3MERJQU5GQkVBZ0FDZ0NLRUhnQUVZTkNTQUFRY0lBRUJBZ0FFSGNBQkFhQ3lBRFFRRnFJUU1NQVFzZ0FDZ0NBQ0FKRUE4TElBQW9BaWhCNEFCR0RRVUxJQUFRRWcwQUlBQVFrUUVOQUNBR0tBSUFRZjBBUndSQUlBQkJyczhBUVFBUUZnd0JDeUFBSUFZUS93RWdBRUVBTmdJd0lBQWdBQ2dDRkRZQ0JDQUFJQUFvQWpnUXp3TkZEUUVMUVg4aEF3d0ZDeUFEUVFGcUlRTU1BUXNMSUFCQmduOFFMQ0VEREFJTElBQkJKQkFRSUFCQlFHc29BZ0FnQTBFQmEwSC8vd054RUJjTElBQVFFaUVEQ3lBRVFUQnFKQUFnQXd1QUFRRUNmeUFBUVNZUUVDQUFRVUJySWdJb0FnQkJBQkFYSUFCQkFSQVFJQUlvQWdCQkFCQTVJQUFnQWlnQ0FCQXlJZ01RSGlBQVFZQUJFQkFnQWlnQ0FDQUJRUUpxUWY4QmNSQmtJQUJCNmdCQmZ4QWNJUUVnQUVIUkFCQVFJQUJCandFUUVDQUFRZXNBSUFNUUhCb2dBQ0FCRUI0Z0FFRU9FQkFnQUVFT0VCQUxuUUVCQlg4Z0FDZ0NRQ0lFS0FLSUFTSURRUUFnQTBFQVNoc2hBd0pBQTBBQ1FDQUNJQU5HQkVCQkFDRURJQVFvQW53aUFrRUFJQUpCQUVvYklRVkJBQ0VDQTBBZ0FpQUZSZzBFSUFKQkJIUWhCaUFDUVFGcUlRSWdCaUFFS0FKMGFpZ0NBQ0FCUncwQUN3d0JDeUFDUVFSMElRVWdBa0VCYWlFQ0lBVWdCQ2dDZ0FGcUtBSUFJQUZIRFFFTEN5QUFRYzBrUVFBUUZrRi9JUU1MSUFNTGhnVUNDSDhCZmlNQVFVQnFJZ0VrQUNBQUtBSTRJUUpCZnlFSUFrQWdBQ2dDQUNBQlFTaHFRU0FRUFEwQUFrQWdBQ2dDQUNBQlFSQnFRUUVRUFEwQUlBSkJBV29oQTBFQUlRSUNRQU5BSUFNaUJTQUFLQUk4VHcwQklBSWhCa0VCSVFJZ0JVRUJhaUVEQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FGTFFBQUlnUkIyd0JyRGdNR0F3RUFDeUFFUVM5SEJFQWdCRUVLYXc0RUJ3SUNCd0lMUVM4aEJDQUdEUVVEUUNBQklBTkJBV28yQWd3Q1FDQURMQUFBSWdKQkFFNEVRQ0FDUWY4QmNTRUNEQUVMSUFOQkJpQUJRUXhxRUZnaUFrR0FnTVFBVHcwR0N5QUNFTVVCQkVBZ0FVRVFhaUFDRUxrQkRRc2dBU2dDRENFRERBRUxDeUFBUVlSL05nSVFJQUFnQVVFb2FoQTJOd01nSUFGQkVHb1FOaUVKSUFBZ0F6WUNPQ0FBSUFrM0F5aEJBQ0VJREFvTFFkMEFJUVJCQUNFQ0RBUUxJQVRBUVFCT0RRRWdCVUVHSUFGQkNHb1FXQ0lFUVlDQXhBQlBEUUlnQkVGK2NVR293QUJHRFFRZ0FTZ0NDQ0VEREFFTElBRkJLR3BCM0FBUU93MEdJQVZCQW1vaEJ3SkFJQVV0QUFFaUJBUkFJQVJCQ21zT0JBVUJBUVVCQzBFQUlRUWdCaUVDSUFjaUF5QUFLQUk4VHcwR0RBTUxJQVRBUVFCT0JFQWdCaUVDSUFjaEF3d0RDMEVIUVFaQkFDQURRUVlnQVVFTWFoQllJZ1JCZm5GQnFNQUFSaHNnQkVILy84TUFTeUlDR3lJRFJRUkFJQWNnQVNnQ0RDQUNHeUVEREFFTElBTkJCbXNPQWdNQkJ3c2dCaUVDREFFTElBQkJ0UEFBUVFBUUZnd0VDeUFCUVNocUlBUVF1UUZGRFFFTUF3c0xJQUJCK01nQVFRQVFGZ3dCQ3lBQVFaM0pBRUVBRUJZTElBRW9BaWdvQWhBaUFFRVFhaUFCS0FJc0lBQW9BZ1FSQUFBZ0FTZ0NFQ2dDRUNJQVFSQnFJQUVvQWhRZ0FDZ0NCQkVBQUFzZ0FVRkFheVFBSUFnTFVRRUNmMEYvSVFKQkFTRURBMEFDUUNBQUlBRVF0Z0VOQUNBRFJRUkFJQUFvQWtCQmZ6WUNtQUlMSUFBb0FoQkJMRWNFUUVFQUlRSU1BUXNnQUJBU0RRQWdBRUVPRUJCQkFDRUREQUVMQ3lBQ0N6TUJBWDhEUUFKQUlBRkJBRTRFZnlBQklBSkhEUUZCQVFWQkFBc1BDeUFBS0FMTUFTQUJRUU4wYWlnQ0FDRUJEQUFMQUF1RUF3RUdmeUFCS0FJNElRTUNRQUpBQWtBZ0FTMEFia0VCY1FSQUlBTkZCRUJCOHNJQUlRTWdBU2dDUUEwREMwR0M3Z0FoQXlBQ1FUcEdJQUpCelFCR2NnMENRUUFoQWlBQktBS0lBU0lEUVFBZ0EwRUFTaHNoQkFOQUlBSWdCRVlOQWtIZDdRQWhBeUFCS0FLQUFTQUNRUVIwYWlnQ0FDSUdRVHBHSUFaQnpRQkdjZzBESUFKQkFXb2hBZ3dBQ3dBTElBTkZEUUFnQVM4QmJDSUNRWUlNUmcwQUlBSkJDSFpCQTJzT0JBQUNBZ0FDQzBFQUlRUWdBU2dDaUFFaUFrRUFJQUpCQUVvYklRaEJBQ0VEQTBBZ0F5QUlSZzBDUVFBaEFnSkFJQUVvQW9BQklnVWdBMEVFZEdvb0FnQWlCa1VOQUFOQUFrQWdBaUFEUmdSQVFRQWhBaUFCS0FKOElnVkJBQ0FGUVFCS0d5RUZBMEFnQWlBRlJnMEVJQVlnQVNnQ2RDQUNRUVIwYWlJSEtBSUFSZ1JBSUFjb0FnUkZEUU1MSUFKQkFXb2hBZ3dBQ3dBTElBSkJCSFFoQnlBQ1FRRnFJUUlnQlNBSGFpZ0NBQ0FHUncwQkN3dEJtQ1FoQXd3Q0N5QURRUUZxSVFNTUFBc0FDeUFBSUFOQkFCQVdRWDhoQkFzZ0JBdGFBUUovSUFCQlFHc2lBeUFCS0FJQU5nSUFJQUJCS1JBUUlBTWdBeWdDQUNnQ0JDSUNOZ0lBSUFBb0FnQWdBa0tBZ0lDQUlCQytBeUVDSUFFb0FnQWdBallDQ0NBQVFRTVFFQ0FES0FJQUlBSVFPU0FBUWRBQUVCQUxSd0VCZndKL1FRQWdBU2dDQ0EwQUdpQUJLQUlBSWdJRWZ5QUNCVUYvSUFBZ0FSRGVCQTBCR2lBQktBSUFDeWdDZ0FJZ0FTZ0NER3BCQ2pvQUFDQUJRUUUyQWdoQkFBc0wzQUVCQW44Z0FDZ0NBQ0FBUVVCcklnTW9BZ0JCQUVFQUlBQW9BZ3hCQUJEb0F5SUNSUVJBSUFGQkFEWUNBRUYvRHdzZ0FrRUFOZ0p3SUFKQkFEWUNZQ0FDUW9DQWdJQVFOd0pJSUFKQ0FUY0NNQ0FDUVlBTU93RnNJQUpDQVRjQ1dDQUNRZ0UzQWxBZ0FTQUNOZ0lBSUFNZ0FqWUNBQ0FBUVFrUUVDQUJJQUVvQWdBb0FwZ0NOZ0lNSUFCQjZRQkJmeEFjSVFFZ0FFRzRBUkFRSUFCQkNCQWFJQU1vQWdCQkFCQVhJQUJCdUFFUUVDQUFRZk1BRUJvZ0F5Z0NBRUVBRUJjZ0FFRXRFQkFnQUNBQkVCNGdBeUFES0FJQUtBSUVOZ0lBUVFBTDNnUUJDWDhqQUVFUWF5SUdKQUFnQUNBQUtRT0FBUkFqSUFCQkVHb2hBeUFBUWFBQmFpRUVJQUFvQXFRQklRRURRQ0FCSUFSR1JRUkFJQUVvQWdRaEJVRUFJUUlEUUNBQ0lBRW9BaEJPUlFSQUlBQWdBU0FDUVFOMGFpa0RHQkFqSUFKQkFXb2hBZ3dCQ3dzZ0F5QUJJQUFvQWdRUkFBQWdCU0VCREFFTEN5QUFJQVEyQXFRQklBQWdBRUdnQVdvMkFxQUJJQUFRb2dVZ0FDZ0NWQ0FBUWRBQWFrWUVRRUVBSVFJRFFBSkFJQUFvQWtRaEFTQUNJQUFvQWtCT0RRQWdBU0FDUVJoc2FpSUJLQUlBQkVBZ0FDQUJLQUlFRU93QkN5QUNRUUZxSVFJTUFRc0xJQU1nQVNBQUtBSUVFUUFBSUFBb0FwQUNJZ1FFUUVFQUlRRURRRUVBSVFVZ0FVRUZSa1VFUUFOQVFRQWhBaUFGUVFKR1JRUkFBMEFnQWtFVVJ3UkFJQVFnQVVHZ0FXeHFJQVZCMEFCc2FpQUNRUUowYWtHb0RXb2lCeWdDQUNJSUJFQWdCQ2dDQUNJSktBSUFJQWhCQUNBSktBSUVFUUVBR2lBSFFRQTJBZ0FMSUFKQkFXb2hBZ3dCQ3dzZ0JVRUJhaUVGREFFTEN5QUJRUUZxSVFFTUFRc0xJQUFvQXRnQklBUkJBQ0FBS0FMY0FSRUJBQm9nQUVFQU5nS1FBZ3NnQUVIZ0FXb1FvUVVnQUVINEFXb1FvUVZCQUNFQ0EwQUNRQ0FBS0FJNElRRWdBaUFBS0FJc1RnMEFJQUVnQWtFQ2RHb29BZ0FpQVVFQmNVVUVRQ0FESUFFZ0FDZ0NCQkVBQUFzZ0FrRUJhaUVDREFFTEN5QURJQUVnQUNnQ0JCRUFBQ0FESUFBb0FqUWdBQ2dDQkJFQUFDQURJQUFvQXRRQklBQW9BZ1FSQUFBZ0JpQURLUUlJTndNSUlBWWdBeWtDQURjREFDQUdJQUFnQUNnQ0JCRUFBQ0FHUVJCcUpBQVBDMEdOa1FGQnJ2d0FRYjhQUWFUbEFCQUFBQXREQVFKL0lBQW9Bb2dCSVFKQmZ5RURBa0FEUUNBQ1FRQk1EUUVnQUNnQ2dBRWdBa0VCYXlJQ1FRUjBhaWdDQUNBQlJ3MEFDeUFDUVlDQWdJQUNjaUVEQ3lBREM4WUJBZ1IvQVg0akFFRVFheUlESkFBZ0FDQUJFQzBpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBQWtBZ0FDQURRUXhxSUFjUTVRRWlCa1VFUUF3QkN3SkFJQUFnQWhBL0lnRWdBeWdDREdwQkFXb1FLU0lFUlFSQVFRQWhCQXdCQ3lBRUlBWWdBeWdDREJBZklnVWdBeWdDREdvZ0FpQUJFQjhhSUFVZ0F5Z0NEQ0FCYW1wQkFEb0FBQ0FBSUFVZ0F5Z0NEQ0FCYWhDRkF5RUVJQUFvQWhBaUFVRVFhaUFGSUFFb0FnUVJBQUFMSUFBZ0JoQlVDeUFBSUFjUUR3c2dBMEVRYWlRQUlBUUx2d0VCQVg4Z0FTQURhaTBBQUVFOFJnUkFJQUFnQkVIL0FYRVFFU0FBSUFWQi8vOERjUkFxSUFOQkFXb2hBd3NnQVNBQ0tBSUVJZ0JCQldzaUFtb2lCaTBBQUVHMkFVWUVRQ0FBSUFGcUxRQUFRUlpHQkVBZ0JrRVJPZ0FBSUFCQkJHc2hBZ3NnQUVFQ2FpRUFJQUVnQW1vaUJpQUZPd0FCSUFZZ0JFRUJham9BQUNBQ1FRTnFJUUlEUUNBQUlBSk1SUVJBSUFFZ0FtcEJzd0U2QUFBZ0FrRUJhaUVDREFFTEN5QUREd3RCb2RVQVFhNzhBRUhzNVFGQnRkNEFFQUFBQzBJQkFYOENRQ0FBSUFGcUlnQXRBQUZCUFVjTkFFRUJJUUlDUUFKQUlBQXRBQUFpQUVFV2F3NEVBZ0VCQWdBTElBQkJzd0ZHRFFFTElBQkJIVVloQWdzZ0FndXpBUUVCZjBGL0lRTUNRQ0FCS0FKTVJRMEFBa0FDUUFKQUFrQWdBa0h4QUdzT0F3SUJBQU1MSUFFb0FyUUJJZ05CQUU0TkF5QUJJQUFnQVVIekFCQlBJZ0EyQXJRQklBQVBDeUFCS0FLd0FTSURRUUJPRFFJZ0FTQUFJQUZCOGdBUVR5SUFOZ0t3QVNBQUR3c2dBU2dDckFFaUEwRUFUZzBCSUFFZ0FDQUJRZkVBRUU4aUFEWUNyQUVnQUE4TElBSkJDRWNOQUNBQktBS29BU0lEUVFCT0RRQWdBU0FBSUFFUXlnTWlBellDcUFFTElBTUxSUUFnQUNnQ3pBRWdBVUVEZEdwQkJHb2hBUU5BSUFFb0FnQWlBVUVBU0VVRVFDQUFLQUowSUFGQkJIUnFJZ0VnQVNnQ0RFRUVjallDRENBQlFRaHFJUUVNQVFzTEN6QUFBMEFnQVVHQUFVbEZCRUFnQUNBQlFZQUJja0gvQVhFUUVTQUJRUWQySVFFTUFRc0xJQUFnQVVIL0FYRVFFUXNOQUNBQUlBRkIyb2dCRU9FRUMva0NBUVIvUVFFaENTQURJUWNDUUFOQUlBY29Bc3dCSUFWQkEzUnFRUVJxSVFVQ1FBSkFBMEFnQlNnQ0FDSUZRUUJJRFFFZ0JDQUhLQUowSWdZZ0JVRUVkR29pQ0NnQ0FFY0VRQ0FJUVFocUlRVU1BUXNMSUFZZ0JVRUVkR29vQWd4QkEzWkJEM0VoQ0VFQklRWWdDUVJBUVFBaEJnd0NDeUFBSUFNZ0IwRUFJQVVnQkVFQlFRRkJBQkNmQVNJRlFRQk9EUUVNQXdzZ0J5Z0NCQ0lHUlFSQUFrQWdCeWdDSUVVTkFFRUFJUVVnQnlnQ3dBSWlCa0VBSUFaQkFFb2JJUVlEUUNBRklBWkdEUUVnQkNBSEtBTElBaUlJSUFWQkEzUnFLQUlFUmdSQUlBZ2dCVUVEZEdvdEFBQWlDVUVFZGlFSUlBTWdCMFlFUUVFQklRWU1CUXRCQVNFR0lBQWdBeUFIUVFBZ0NVRUJka0VCY1NBRklBUWdDVUVDZGtFQmNTQUpRUU4yUVFGeElBZ1E5UUVpQlVFQVNBMEdEQVFGSUFWQkFXb2hCUXdCQ3dBTEFBc2dBQ0FFUWFHWEFSRC9Bd3dEQ3lBSEtBSU1JUVZCQUNFSklBWWhCd3dCQ3dzZ0FTQUdOZ0lBSUFJZ0NEWUNBQ0FGRHd0QmZ3dkdGd0VHZnlNQVFSQnJJZ3drQUNBTVFYODJBZ3dDZjBFQklBSkI4UUJyUVFOSkRRQWFRUUVnQWtFSVJnMEFHa0VBQ3lFTElBRW9Bc3dCSUFOQkEzUnFRUVJxSVFNQ1FBSkFBa0FDUUFKQUFrQURRQ0FES0FJQUlnTkJBRTRFUUNBQ0lBRW9BblFpQ2lBRFFRUjBhaUlKS0FJQUlnMUdCRUFnQkVGOWNVRzVBVWNFUUNBRElRa01CQXNnQ2lBRElnbEJCSFJxTFFBTVFRRnhSUTBESUFWQk1CQVJJQVVnQUNBQ0VCZ1FIU0FGUVFBUUVRd0hDeUFMSUExQjFBQkhja1VFUUNBRlFkZ0FFQkVnQlNBRFFmLy9BM0VRS2lBQUlBRWdBaUFFSUFVZ0RFRU1ha0VCRU9BQkN5QUpRUWhxSVFNTUFRc0xRWDhoQ1NBRFFYNUhCRUFnQVNBQ0VQUUJJUWtMSUF0QkFYTWdDVUVBVG5KRkJFQWdBQ0FCSUFJUTVBUWhDUXNDUUNBQ1FjMEFSeUFKUVFCT2NrVUVRQ0FCS0FKSVJRMEJJQUFnQVJEcUFpRUpDeUFKUVFCT0RRRUxBa0FnQVNnQ0xBUkFJQUVvQW5BZ0FrWU5BUXNnQTBGK1J3MEREQVFMSUFBZ0FTQUNFT2tDSWdsQkFFZ05BUXNDUUFKQUFrQUNRQ0FFUWJjQmF3NEhBZ0lBQXdBQkFnY0xBa0FnQ1VHQWdJQ0FBbkVpQXcwQUlBRW9BblFnQ1VFRWRHb3RBQXhCQVhGRkRRQWdCVUV3RUJFZ0JTQUFJQUlRR0JBZElBVkJBQkFSREFjTEFrQWdCRUc1QVdzT0F3SURBQWNMQWtBZ0F3MEFJQUVvQW5RZ0NVRUVkR29vQWd4QitBQnhRU0JIRFFBZ0JVRUxFQkVnQlVIWUFCQVJJQVVnQ1VILy93TnhFQ29nQlVITUFCQVJJQVVnQUNBQ0VCZ2lBaEFkSUFWQkJCQVJJQVVnQUNBQ0VCZ1FIUXdIQ3dKQUlBd29BZ3hCZjBjTkFDQUdJQWNvQWdRUTR3UkZEUUFnQlNBR0lBY2dDQUovSUFNRVFDQUpRWUNBZ0lBQ2F5RUpRZHNBREFFTFFlSUFRZGdBSUFFb0FuUWdDVUVFZEdvdEFBeEJBbkViQ3lBSkVPSUVJUWdNQndzZ0F3UkFJQVZCK1FBUUVTQUZJQUFnQWhBWUVCMGdCU0FKUWYvL0EzRVFLZ3dIQ3lBRlFmZ0FFQkVnQlNBQUlBSVFHQkFkSUFVZ0NVSC8vd054RUNvTUJnc2dCVUVHRUJFTElBbEJnSUNBZ0FKeEJFQWdCVUhjQUVIY0FFSGJBQ0FFUWIwQlJoc2dCRUc1QVVZYkVCRWdCU0FKUWYvL0EzRVFLZ3dGQ3dKQUFrQUNRQ0FFUWJrQmF3NEZBQUVCQVFBQkMwSGpBRUhaQUNBQktBSjBJQWxCQkhScUtBSU1RUUp4SWdCQkFYWWJJUU1nQUVVZ0JFRzlBVWR5RFFGQjVBQkIyUUFnQWtFSVJoc2hBd3dCQzBIaUFFSFlBQ0FCS0FKMElBbEJCSFJxTFFBTVFRSnhHeUVEQ3lBRklBTVFFU0FGSUFsQi8vOERjUkFxREFRTElBVkJDUkFSREFNTElBTkJma1lOQVFzZ0N5QUJLQUtRQVVFQVNISU5BQ0FGUWRnQUVCRWdCU0FCTHdHUUFSQXFJQUFnQVNBQ0lBUWdCU0FNUVF4cVFRQVE0QUVMSUFzZ0FTSURLQUtVQVVFQVNISkZCRUFnQlVIWUFCQVJJQVVnQVM4QmxBRVFLaUFBSUFFZ0FpQUVJQVVnREVFTWFrRUFFT0FCQ3dKQUFrQUNmd0pBQWtBQ1FBTkFJQU1vQWdRaUNrVUVRQ0FESVFvTUF3c2dDaWdDekFFZ0F5Z0NERUVEZEdwQkJHb2hBd05BSUFNb0FnQWlDVUVBVGdSQUlBSWdDaWdDZENJTklBbEJCSFJxSWdNb0FnQWlEa1lFUUNBRVFYMXhRYmtCUndSQUlBa2hBd3dGQ3lBTklBa2lBMEVFZEdvdEFBeEJBWEZGRFFRZ0JVRXdFQkVnQlNBQUlBSVFHQkFkSUFWQkFCQVJEQW9GQWtBZ0N5QU9RZFFBUjNJTkFDQURJQU1vQWd4QkJISTJBZ3dnQUNBQklBcEJBQ0FKUWRRQVFRQkJBRUVBRUo4QklnbEJBRWdOQUNBRlFkNEFFQkVnQlNBSlFmLy9BM0VRS2lBQUlBRWdBaUFFSUFVZ0RFRU1ha0VCRU9BQkN5QURRUWhxSVFNTUFnc0FDd3NnQ1VGK1J3UkFJQW9nQWhEMEFTSURRUUJPRFFJTElBc0VRQ0FBSUFvZ0FoRGtCQ0lEUVFCT0RRSUxBa0FDUUNBQ1FjMEFSdzBBSUFvb0FraEZEUUFnQUNBS0VPb0NJUU1NQVFzQ1FDQUtLQUlzUlEwQUlBb29BbkFnQWtjTkFDQUFJQW9nQWhEcEFpRUREQUVMQWtBZ0NVRitSZzBBSUFzZ0NpZ0NrQUVpQTBFQVNISU5BQ0FLS0FKMElBTkJCSFJxSWdNZ0F5Z0NERUVFY2pZQ0RDQUFJQUVnQ2tFQUlBb29BcEFCSUFNb0FnQkJBRUVBUVFBUW53RWhBeUFGUWQ0QUVCRWdCU0FEUWYvL0EzRVFLaUFBSUFFZ0FpQUVJQVVnREVFTWFrRUFFT0FCQ3lBTElBb29BcFFCSWdOQkFFaHlSUVJBSUFvb0FuUWdBMEVFZEdvaUF5QURLQUlNUVFSeU5nSU1JQUFnQVNBS1FRQWdDaWdDbEFFZ0F5Z0NBRUVBUVFCQkFCQ2ZBU0VESUFWQjNnQVFFU0FGSUFOQi8vOERjUkFxSUFBZ0FTQUNJQVFnQlNBTVFReHFRUUFRNEFFTElBb2lBeWdDSUVVTkFRd0RDd3NnQTBFQVNBMEJDeUFEUVlDQWdJQUNjVVVOQVNBS0tBS0FBU0FEUVlDQWdJQUNheUlEUVFSMGFpSUpJQWtvQWd4QkJISTJBZ3dnQUNBQklBcEJBU0FESUFKQkFFRUFRUUFRbndFTUFnc2dDaWdDSUVVTkEwRUFJUU1EUUNBRElBb29Bc0FDVGcwRUlBSWdDaWdDeUFJZ0EwRURkR29pRGlnQ0JDSU5SZ1JBSUFFZ0NrWU5CQ0FBSUFFZ0NrRUFJQTR0QUFBaUNrRUJka0VCY1NBRElBSWdDa0VDZGtFQmNTQUtRUU4yUVFGeElBcEJCSFlROVFFaEF3d0VCUUpBQWtBZ0RVRitjVUhTQUVjRVFDQUxJQTFCMUFCSGNrVU5BUXdDQ3lBTERRRUxJQU1oQ1NBQklBcEhCRUFnQUNBQklBcEJBQ0FPTFFBQVFRRjJRUUZ4SUFNZ0RVRUFRUUJCQUJEMUFTRUpDeUFGUWQ0QUVCRWdCU0FKUWYvL0EzRVFLaUFBSUFFZ0FpQUVJQVVnREVFTWFpQU5RZFFBUmhEZ0FRc2dBMEVCYWlFRERBRUxBQXNBQ3lBRFFRUjBJZ2tnQ2lnQ2RHb2lDeUFMS0FJTVFRUnlOZ0lNSUFBZ0FTQUtRUUFnQXlBQ0lBb29BblFnQ1dvb0Fnd2lBMEVCY1NBRFFRRjJRUUZ4SUFOQkEzWkJEM0VRbndFTElnTkJBRWdOQVFzQ1FBSkFBa0FDUUFKQUFrQUNRQ0FFUWJjQmF3NEhBUUVBQmdBREFRZ0xJQUVvQXNnQ0lBTkJBM1JxTFFBQUlnbEJCSEVFUUNBRlFUQVFFU0FGSUFBZ0FoQVlFQjBnQlVFQUVCRU1DQXRCQUNFS0FrQWdCRUc1QVdzT0F3SUdBQWdMSUFsQjhBRnhRY0FBUmdSQUlBVkJDeEFSSUFWQjNnQVFFU0FGSUFOQi8vOERjUkFxSUFWQnpBQVFFU0FGSUFBZ0FoQVlJZ0lRSFNBRlFRUVFFU0FGSUFBZ0FoQVlFQjBNQ0FzQ1FDQU1LQUlNUVg5SERRQWdCaUFIS0FJRUVPTUVSUTBBSUFVZ0JpQUhJQWhCNVFCQjNnQWdDVUVJY1JzZ0F4RGlCQ0VJREFnTElBVkIrZ0FRRVNBRklBQWdBaEFZRUIwZ0JTQURRZi8vQTNFUUtnd0hDeUFFUWIwQlJpRUtJQVJCdVFGckRnVUFBZ0lDQUFJTFFlWUFRZDhBSUFFb0FzZ0NJQU5CQTNScUxRQUFRUWh4SWdCQkEzWWJJUWtnQUVVZ0NrVnlEUUpCNXdCQjN3QWdBa0VJUmhzaENRd0NDeUFGUVFZUUVRdEI1UUJCM2dBZ0FTZ0N5QUlnQTBFRGRHb3RBQUJCQ0hFYklRa0xJQVVnQ1JBUklBVWdBMEgvL3dOeEVDb01BZ3NnQlVFSkVCRU1BUXNDUUFKQUFrQUNRQUpBSUFSQnR3RnJEZ2NDQWdJRUFBRURCUXNDUUNBTUtBSU1RWDlIRFFBZ0J5Z0NCQ0FHYWlJRExRQUJRVDFIRFFBQ1FBSkFJQU10QUFBaUEwRVphdzRGQVFJQ0FnRUFDeUFEUWJNQlJnMEFJQU5CRmtjTkFRc2dBUzBBYmtFQmNTSUVCRUFnQlVFMkVCRWdCU0FBSUFJUUdCQWRDeUFHSUFocUxRQUFRVHhHQkVBZ0JVRTRFQkVnQlNBQUlBSVFHQkFkSUFoQkFXb2hDQXNnQmlBSEtBSUVJZ2RCQldzaUNtb2lDUzBBQUVHMkFVY05CaUFHSUFkcUxRQUFJUU1DUUFKQUlBUUVRRUU3SVFzQ1FBSkFBa0FDUUNBRFFSbHJEZ1VDQVFFQkF3QUxRUlVoQkNBRFFSWkdEUVFnQTBHekFVWU5CUXNRQVFBTFFSZ2hCQXdDQzBFYklRUU1BUXRCT1NFTFFSRWhCQ0FEUVJaSERRRUxJQWtnQkRvQUFDQUhRUVJySVFvTElBZEJBbW9oQkNBR0lBcHFJZ01nQ3pvQUFDQURJQUFnQWhBWU5nQUJJQXBCQldvaEF3TkFJQU1nQkU0TkJpQURJQVpxUWJNQk9nQUFJQU5CQVdvaEF3d0FDd0FMSUFWQit3QVFFU0FGSUFBZ0FoQVlFQjBNQkFzZ0JVRUdFQkVnQlVFNEVCRWdCU0FBSUFJUUdCQWREQU1MSUFVZ0JFR0FBWE5CL3dGeEVCRWdCU0FBSUFJUUdCQWREQUlMSUFWQk9oQVJJQVVnQUNBQ0VCZ1FIUXdCQ3lBRlFaa0JFQkVnQlNBQUlBSVFHQkFkQ3lBTUtBSU1JZ0JCQUU0RVFDQUZRYllCRUJFZ0JTQUFFQjBnQVNnQ3BBSWdBRUVVYkdvZ0JTZ0NCRFlDQ0FzZ0RFRVFhaVFBSUFnUEMwR2gxUUJCcnZ3QVFaM21BVUgzM1FBUUFBQUwxZ0lCQkg4akFFR2dBV3NpQlNRQUlBRW9BZ0FoQmlBRlFZQUJOZ0lJSUFVZ0JVRVFhallDRENBRUJIOGdCVUVqT2dBUVFRRUZRUUFMSVFRQ2Z3SkFBMEFDZnlBRFFmOEFUQVJBSUFVb0Fnd2lCeUFFYWlBRE9nQUFJQVJCQVdvTUFRc2dCU2dDRENJSElBUnFJQU1Rb1FNZ0JHb0xJUVFnQlNBR1FRRnFOZ0tjQVVIY0FDRURBa0FnQmkwQUFDSUlRZHdBUmdSQUlBWXRBQUZCOVFCSERRRWdCVUdjQVdwQkFSRDVBU0VESUFKQkFUWUNBQXdCQ3lBSUlnUEFRUUJPRFFBZ0JrRUdJQVZCbkFGcUVGZ2hBd3NnQXhERkFVVU5BU0FGS0FLY0FTRUdJQVFnQlNnQ0NFRUdhMGtOQUNBQUtBSUFJQVZCREdvZ0JVRUlhaUFGUVJCcUVQVUVSUTBBQ3lBRktBSU1JUWRCQUF3QkN5QUFLQUlBSUFjZ0JCQ0ZBd3NoQXlBRlFSQnFJQWRIQkVBZ0FDZ0NBQ2dDRUNJQVFSQnFJQWNnQUNnQ0JCRUFBQXNnQVNBR05nSUFJQVZCb0FGcUpBQWdBd3VhQmdFRWYwRUJJUWtnQWtFQmRFSGc5d0pxTHdFQUlRSWdCVVVFUUNBQUlBSTJBZ0JCQVE4TElBSkIwSUlEYWlFR1FSSWhCd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQVZCQVdzT0lnQUFBQUFBQUFBQkFRSUNBZ0lDQkFNREF3TURBd1VGQlFVRkJRVUZCZ2NJQ1FrTEN5QUdJQUVnQTJzZ0JXeEJBWFJxSVFGQkFDRUNBMEFnQWlBRlJnUkFJQVVQQ3lBQUlBSkJBblJxSUFFZ0FrRUJkR292QUFBaUF6WUNBQ0FDUVFGcUlRSWdBdzBBQ3d3TEN5QUZRUWRySWdnZ0FTQURhMndoQWlBRUlBaHNRUUYwSVFGQkFDRUhBMEFnQnlBSVJnMEtJQVlnQWtFQmRDSURhaThBQUNBR0lBSkJBbllnQVdwcUxRQUFJQU5CQm5GMlFSQjBRWUNBREhGeUlnTkZEUXNnQUNBSFFRSjBhaUFETmdJQUlBZEJBV29oQnlBQ1FRRnFJUUlNQUFzQUN5QUdJQVZCQ1dzaUNDQUJJQU5yYkdvaEFVRUFJUUlEUUNBQ0lBaEdEUWtnQUNBQ1FRSjBhaUFCSUFKcUxRQUFFS3NESWdNMkFnQWdBa0VCYWlFQ0lBTU5BQXNNQ1FzZ0JVRUJjU0FGUVJCcklnSkJBVXRxSVFnZ0FrRUJka0VDYWlFSkN5QUJJQU5ySVFGQkFDRUNBMEFnQWlBSlJnUkFJQWtQQlNBQUlBSkJBblJxSUFZZ0FrRUJkR292QUFBZ0FVRUFJQUlnQ0VZYmFqWUNBQ0FDUVFGcUlRSU1BUXNBQ3dBTElBVkJGV3NoQndzZ0J5QUJJQU5yYkNBR2FrRUNhaUVCSUFZdkFBQWhBMEVBSVFJRFFDQUNJQWRHQkVBZ0J3OEZJQUFnQWtFQ2RHcEJJQ0FESUFFZ0Ftb3RBQUFpQkdvZ0JFSC9BVVliTmdJQUlBSkJBV29oQWd3QkN3QUxBQXNnQUNBR0lBRWdBMnRCQTJ4cUlnRXZBQUFpQWpZQ0FDQUNSUTBESUFBZ0FTMEFBaENyQXpZQ0JBd0NDeUFBSUFZdkFBSTJBZ2dnQUNBR0x3QUFOZ0lBSUFBZ0FTQURhMEVCZENBR2FpOEFCRFlDQkVFRER3c2dBU0FEYXlFQkFuOGdCVUVoUmdSQUlBWWdBVUYrY1dvaUFrRUJhaUVESUFJdEFBQVFxd01NQVFzZ0JpQUJRUUYyUVFOc2FpSUNRUUpxSVFNZ0FpOEFBQXNoQWlBQVFTQkJJRUVCSUFKQmtBaHJRU0JKR3lBQ1FZQUNTUnNnQW1vZ0FpQUJRUUZ4R3pZQ0FDQUFJQU10QUFBUXF3TTJBZ1FMUVFJaENBc2dDQThMUVFBTHRBSUJDSDhqQUVIUUFHc2lCeVFBSUFKQkFDQUNRUUJLR3lFTEEwQUNRQUpBSUFZZ0MwY0VRQ0FCSUFaQkFuUnFLQUlBSWdWQmdOZ0NheUlDUWFQWEFFME5BVUd4QlNFQ1FRQWhCQUpBQTBBZ0FpQUVTQTBCSUFVZ0FpQUVha0VDYlNJSVFRSjBRWkRpQW1vb0FnQWlDVUVPZGlJS1NRUkFJQWhCQVdzaEFnd0JDeUFGSUFsQkIzWkIvd0J4SWdRZ0NtcFBCRUFnQ0VFQmFpRUVEQUVMQ3lBSlFRRnhJQU5MRFFBZ0J5QUZJQWdnQ2lBRUlBbEJBWFpCUDNFUTZ3UWlBa1VOQUNBQUlBY2dBaUFERU93RURBTUxJQUFnQlJBZERBSUxJQWRCMEFCcUpBQVBDeUFBSUFKQi8vOERjU0lGUWN3RWJpSUVRWUFpY2hBZElBQWdCRUcwZTJ3Z0FtcEIvLzhEY1VFY2JrSGhJbW9RSFNBRlFSeHdJZ0pGRFFBZ0FDQUNRYWNqYWhBZEN5QUdRUUZxSVFZTUFBc0FDOXNHQWd4L0JuNGpBRUV3YXlJQ0pBQUNmZ0pBQWtBZ0FTa0RLQ0lPUW9DQWdJQndnMEtBZ0lDQWtIOVJCRUFnQVNrRENDSVFRb0NBZ0lCd2cwS0FnSUNBa0g5UkRRRUxJQUJCb3RzQVFRQVFGUXdCQ3lBQktRTWdJUklnQVNrREdDRVBJQUVwQXdBaEV5QUFJQUpCREdwQkFCQTlHaUFDUVFBMkFpUUNRQ0FQUW9DQWdJQndnMEtBZ0lDQU1GSUVRQ0FBSUFKQkpHb2dEeERXQVEwQkN5QUFJQUpCS0dvZ0V4RFdBUTBBSUFBZ0FrRXNhaUFCS1FNUUVIZEJBRWdOQUNBUXB5RUlJQkpDZ0lDQWdIQ0RJUkFnQWlnQ0xDSU1JQUlvQWlocUlRMGdEcWNpQkVFUWFpRUhJQVFvQWdSQi8vLy8vd2R4SVFvZ0FpZ0NKQ0VMUVFBaEFRTkFBa0FDUUFKQUlBUkJKQ0FCRU1jQklnWkJBRWdOQUNBR1FRRnFJZ01nQ2s4TkFDQUNRUXhxSUFRZ0FTQUdFRkVhSUFaQkFtb2hBUUpBQWtBQ1FBSkFBbjhnQkNrQ0JFS0FnSUNBQ0lOUUlnbEZCRUFnQnlBRFFRRjBhaThCQUF3QkN5QURJQWRxTFFBQUN5SURRU1JyRGdRQUF3VUJBZ3NnQWtFTWFrRWtFRHNhREFZTElBSkJER29nQ0NBTklBZ29BZ1JCLy8vLy93ZHhFRkVhREFVTElBTkI0QUJHRFFNTEFrQWdBMEV3YXlJRlFRbE5CRUFDUUNBQklBcFBEUUFDZnlBSlJRUkFJQWNnQVVFQmRHb3ZBUUFNQVFzZ0FTQUhhaTBBQUFzaUEwRXdhMEVKU3cwQUlBWkJBMm9nQVNBRElBVkJDbXhxSWdGQk1Fc2dBVUV3YXlJRElBdEpjU0lKR3lFQklBTWdCU0FKR3lFRkN5QUZSU0FGSUF0UGNnMEJJQUFnRHlBRnJSQnpJZzVDZ0lDQWdIQ0RJaEZDZ0lDQWdEQlJEUVVnRVVLQWdJQ0E0QUJSRFFZZ0FrRU1haUFPRUg5RkRRVU1CZ3NnQTBFOFJ5QVFRb0NBZ0lBd1VYSU5BQ0FFUVQ0Z0FSREhBU0lEUVFCSURRQWdBQ0FFSUFFZ0F4Q0VBU0lPUW9DQWdJQndnMEtBZ0lDQTRBQlJEUVVnQUNBU0lBNFFUU0lPUW9DQWdJQndneUlSUW9DQWdJQXdVZ1JBSUJGQ2dJQ0FnT0FBVVEwR0lBSkJER29nRGhCL0RRWUxJQU5CQVdvaEFRd0VDeUFDUVF4cUlBUWdCaUFCRUZFYURBTUxJQUpCREdvaUFDQUVJQUVnQkNnQ0JFSC8vLy8vQjNFUVVSb2dBQkEyREFVTElBSkJER29nRXhDSEFVVU5BUXdDQ3lBQ1FReHFJQWhCQUNBTUVGRWFEQUFMQUFzZ0FpZ0NEQ2dDRUNJQVFSQnFJQUlvQWhBZ0FDZ0NCQkVBQUF0Q2dJQ0FnT0FBQ3lFUElBSkJNR29rQUNBUEMyOEJBMzhEUUNBQUtBSW9JZ0ZCQUV4RkJFQWdBQ0FCUVFGcklnRTJBaWdnQUNnQ0FDQUFLQUlFSUFGQkEzUnFLUU1BRUE4TUFRc0xJQUFvQWdRaUFTQUFRUWhxSWdKSEJFQWdBQ2dDQUNnQ0VDSURRUkJxSUFFZ0F5Z0NCQkVBQUFzZ0FFRUVOZ0lzSUFBZ0FqWUNCQXRFQUNBQVFSQnFJQUVnQW5RZ0FtdEJFV29nQUNnQ0FCRURBQ0lBQkVBZ0FFRUFOZ0lNSUFCQkFUWUNBQ0FBSUFGQi8vLy8vd2R4SUFKQkgzUnlyVGNDQkFzZ0FBdXBBZ0VFZnlNQVFVQnFJZ2NrQUNBSElBRXRBQUFpQ0VFQmRrRUJjVFlDSkNBSElBaEJBblpCQVhFMkFpQWdCeUFJUVFSMlFRRnhJZ2cyQWlnZ0J5QUJMUUFCSWdrMkFoZ2dBUzBBQWlFS0lBZEJBRFlDUENBSElBWTJBaXdnQnlBRlFRSWdCU0FJR3lBRlFRRkhHellDRkNBSElBSWdCQ0FGZEdvMkFoQWdCeUFDTmdJTUlBY2dDallDSENBSFFnQTNBalFnQnlBS1FRSjBJZ1lnQ1VFRGRHcEJFR28yQWpBZ0NVRUJkQ0VFUVFBaENBTkFJQVFnQ0VaRkJFQWdBQ0FJUVFKMGFrRUFOZ0lBSUFoQkFXb2hDQXdCQ3dzZ0J5QUdRUTlxUWZBUGNXc2lCQ1FBSUFkQkRHb2dBQ0FFUVFBZ0FVRUhhaUFDSUFNZ0JYUnFRUUFRcFFZaEFTQUhLQUlzS0FJUUlnQkJFR29nQnlnQ05FRUFJQUFvQWdnUkFRQWFJQWRCUUdza0FDQUJDL3dHQWdoL0EzNGpBRUVRYXlJR0pBQUNRQUpBSUFBZ0FSRHdBaUlDUlEwQUlBQWdBeWtEQUJBb0lnNUNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQU9JUUVNQWdzQ1FDQUFJQUZCMVFBZ0FVRUFFQlFpREVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0JrRUlhaUFNRUtNQkRRQWdBaWdDQkNJRkxRQVFRU0Z4SWdORkJFQWdCa0lBTndNSUN3SkFJQVV0QUJFaUNVVUVRRUVBSVFJTUFRc2dBQ0FKUVFOMEVDa2lBa1VOQVFzQ1FBSitBa0FDUUFKQUFrQUNRQUpBQWtBZ0Jpa0RDQ0lNSUE2bklnb3BBZ1FpRFVMLy8vLy9CNE5WRFFBZ0FpQUZRUkJxSUFwQkVHb2lCeUFNcHlBTnB5SUVRZi8vLy84SGNTQUVRUjkySWdnZ0FCRHdCQ0lFUVFGR0RRTWdCRUVBU0EwQklBTU5BQ0FFUVFKSERRSUxJQUFnQVVIVkFFSUFFRVZCQUU0TkFRd0ZDeUFBUVl2TEFFRUFFRVlNQkFzZ0FDQU9FQTlDZ0lDQWdDQWhBUXdCQ3lBREJFQWdBQ0FCUWRVQUlBSW9BZ1FnQjJzZ0NIV3RFRVZCQUVnTkF3dENnSUNBZ0RBaERVS0FnSUNBNEFBZ0FCQStJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BeHBCQUNFRFFRQWhCQ0FGTEFBUVFRQklCRUFnQlNnQUV5RUVJQUJDZ0lDQWdDQVFSeUlOUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJDZ0lDQWdPQUFJUTBNQXdzZ0JDQUZha0VYYWlFRUN3TkFJQU1nQ1VjRVFFS0FnSUNBTUNFTUFrQWdBaUFEUVFOMGFpZ0NBQ0lGUlEwQUlBSWdBMEVEZEVFRWNtb29BZ0FpQzBVTkFDQUFJQW9nQlNBSGF5QUlkU0FMSUFkcklBaDFFSVFCSWd4Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQkFzZ0JFVWdBMFZ5UlFSQUFrQWdCQzBBQUVVTkFDQU1RaUNJcDBGMVR3UkFJQXluSWdVZ0JTZ0NBRUVCYWpZQ0FBc2dBQ0FOSUFRZ0RFR0hnQUVRN3dGQkFFNE5BQ0FBSUF3UUR3d0ZDeUFFRUQ4Z0JHcEJBV29oQkFzZ0FDQUJJQU1nREVHSGdBRVFyd0VoQlNBRFFRRnFJUU1nQlVFQVRnMEJEQU1MQ3lBQUlBRkJod0VnRFVHSGdBRVFHVUVBU0EwQklBQWdBVUhYQUNBQ0tBSUFJQWRySUFoMXJVR0hnQUVRR1VFQVNBMEJJQUVoRENBQUlBRkIyQUFnRGtHSGdBRVFHVUVBU0EwRUN5QUFLQUlRSWdCQkVHb2dBaUFBS0FJRUVRQUFEQVlMSUFFTUFRdENnSUNBZ0RBaERVS0FnSUNBSUFzaERDQUFJQTBRRHlBQUlBNFFEd3NnQUNBTUVBOGdBQ2dDRUNJQVFSQnFJQUlnQUNnQ0JCRUFBQXdCQ3lBQUlBNFFEd3RDZ0lDQWdPQUFJUUVMSUFaQkVHb2tBQ0FCQy9VQkFRaC9RWDhoQWlBQklBRkJBV3R4UlFSQUlBQkJFR29pQ0NBQlFRSjBJZ01nQUNnQ0FCRURBQ0lGQkg4Z0JVRUFJQU1RS3lFR0lBRkIvLy8vL3dOcVFmLy8vLzhEY1NFSklBQW9BalFoQndOQUlBUWdBQ2dDSkU5RkJFQWdCeUFFUVFKMGFpZ0NBQ0VDQTBBZ0FnUkFJQUFvQWpnZ0FrRUNkR29vQWdBaUF5Z0NEQ0VGSUFNZ0JpQUpJQU1vQWdoeFFRSjBhaUlES0FJQU5nSU1JQU1nQWpZQ0FDQUZJUUlNQVFzTElBUkJBV29oQkF3QkN3c2dDQ0FISUFBb0FnUVJBQUFnQUNBQlFRRjBOZ0l3SUFBZ0FUWUNKQ0FBSUFZMkFqUkJBQVZCZndzUEMwSHVqd0ZCcnZ3QVFZQVVRYzNaQUJBQUFBc1lBQ0FBS0FJUUlnQkJFR29nQVNBQ0lBQW9BZ2dSQVFBTEV3QWdBRUVRYWlBQklBSWdBQ2dDQ0JFQkFBdHVBUVIvUVg4aEJrRi9JQUlvQWdBaUJFRUJkaUFFYWlBRVFhblZxdFY2U3hzaEJRSkFBa0FnQXlBQktBSUFJZ2RHQkVBZ0FDQUZFQ2tpQUVVTkFpQUFJQU1nQkJBZkdnd0JDeUFBSUFjZ0JSQ0pBaUlBUlEwQkN5QUJJQUEyQWdBZ0FpQUZOZ0lBUVFBaEJnc2dCZ3VOQXdFRGZ5TUFRVUJxSWdJa0FBSkFJQUFnQVJCWklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFBSkFJQUFnQWtFa2FpQUJweUlFS0FJRVFmLy8vLzhIY1VFQ2FoQTlEUUFnQWtFa2FrRWlFRHNOQUNBQ1FRQTJBandEUUNBRUtBSUVRZi8vLy84SGNTQURTZ1JBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0JDQUNRVHhxRU1rQklnTkJDR3NPQmdVQ0JBRUdBd0FMSUFOQklrWWdBMEhjQUVaeURRWUxJQU5CZ1BEL0FIRkJnTEFEUnlBRFFTQlBjUTBHSUFJZ0F6WUNBQ0FDUVJCcUlnTkJFRUdCSVNBQ0VFNGFJQUpCSkdvZ0F4Q0lBUTBLREFjTFFmUUFJUU1NQkF0QjhnQWhBd3dEQzBIdUFDRUREQUlMUWVJQUlRTU1BUXRCNWdBaEF3c2dBa0VrYWtIY0FCQTdEUVFnQWtFa2FpQURFRHRGRFFFTUJBc2dBa0VrYWlBREVMa0JEUU1MSUFJb0Fqd2hBd3dCQ3dzZ0FrRWtha0VpRURzTkFDQUFJQUVRRHlBQ1FTUnFFRFloQVF3QkN5QUFJQUVRRHlBQ0tBSWtLQUlRSWdCQkVHb2dBaWdDS0NBQUtBSUVFUUFBUW9DQWdJRGdBQ0VCQ3lBQ1FVQnJKQUFnQVF1S0F3SURmZ0ovSXdCQkVHc2lBaVFBUW9DQWdJQXdJUVlDUUFKQUlBQWdBa0VJYWlBQUlBRVFKU0lCRUR3TkFBSkFJQUlwQXdnaUIwSUFWd1JBREFFTElBZENBWDBoQlFKQUFrQUNRQUpBSUFFZ0FrRUVhaUFDRUlvQ1JRMEFJQWNnQWlnQ0FDSUlyVklOQUNBQnB5RUpJQUlvQWdRaEF5QUVSUTBCSUFNcEF3QWhCaUFESUFOQkNHb2dDRUVEZEVFSWF4Q2NBUXdDQ3dKQUlBUUVRQ0FBSUFGQ0FCQk5JZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CaUFBSUFGQ0FFSUJJQVZCQVJEMEFrVU5BUXdHQ3lBQUlBRWdCUkJ6SWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQlFzZ0FDQUJJQVVRK2dGQkFFNE5BZ3dFQ3lBSVFRTjBJQU5xUVFocktRTUFJUVlMSUFrZ0NTZ0NLRUVCYXpZQ0tBc2dCMEtCZ0lDQUNGUU5BRUtBZ0lDQXdINGdCYm05SWdWQ2dJQ0FnTUNCZ1B6L0FIMGdCVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2hCUXNnQUNBQlFUQWdCUkJGUVFCT0RRRUxJQUFnQmhBUFFvQ0FnSURnQUNFR0N5QUFJQUVRRHlBQ1FSQnFKQUFnQmd2a0JRSUdmZ1IvSXdCQkVHc2lEQ1FBQW40Q1FBSkFBa0FnQUNBQkVDVWlCa0tBZ0lDQWNGUU5BQ0FHcHlJTEx3RUdRUUpIRFFBZ0N5MEFCVUVKY1VFSlJ3MEFJQXNvQWhBdEFETkJDSEZGRFFBZ0N5Z0NGQ2tEQUNJQlF2Ly8vLzhQVmcwQUlBd2dBY1FpQnpjRENDQUhJQXMxQWloU0RRQWdCeUFDckh3aUJVTC8vLy8vQjFVTkFDQUxOUUlnSUFWVEJFQWdBQ0FMSUFXbkVLd0ZEUU1MQW44Z0JFVWdBa0VBVEhKRkJFQWdDeWdDSkNJRUlBSkJBM1JxSUFRZ0FhZEJBM1FRbkFGQkFBd0JDeUFCcHdzaERVRUFJUVFnQWtFQUlBSkJBRW9iSVFJRFFDQUNJQVJIQkVBZ0F5QUVRUU4wYWlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWc0Z0RpZ0NBRUVCYWpZQ0FBc2dDeWdDSkNBRUlBMXFRUU4wYWlBQk53TUFJQVJCQVdvaEJBd0JDd3NnQ3lBRlBnSW9JQXNvQWhRZ0JVTC8vLy8vRDRNM0F3QWdCVUtBZ0lDQUNId2hBUXdCQ3lBQUlBeEJDR29nQmhBOERRRWdEQ2tEQ0NJQklBS3NJZ2g4SWdWQ2dJQ0FnSUNBZ0JCWkJFQWdBRUhRMmdCQkFCQVZEQUlMQWtBZ0JFVWdBa0VBVEhKRkJFQkNBQ0VISUFBZ0JpQUlRZ0FnQVVGL0VQUUNEUU1NQVFzZ0FTRUhDeUFDUVFBZ0FrRUFTaHV0SVFsQ0FDRUJBMEFnQVNBSlVnUkFJQU1nQWFkQkEzUnFLUU1BSWdoQ0lJaW5RWFZQQkVBZ0NLY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQklBZDhJUW9nQVVJQmZDRUJJQUFnQmlBS0lBZ1FoZ0ZCQUU0TkFRd0RDd3NnQUNBR1FUQWdCVUtBZ0lDQUNId2lBVUwvLy8vL0QxZ0VmaUFGUXYvLy8vOFBnd1ZDZ0lDQWdNQitJQVc1dlNJSFFvQ0FnSURBZ1lEOC93QjlJQWRDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJGUVFCSURRRUxJQUFnQmhBUElBVkMvLy8vL3crRElBRkMvLy8vL3c5WURRRWFRb0NBZ0lEQWZpQUZ1YjBpQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3d0JDeUFBSUFZUUQwS0FnSUNBNEFBTElRRWdERUVRYWlRQUlBRUwwZ01DQjM4RGZpTUFRU0JySWdRa0FDQUVRUUEyQWd3Z0JFRUFOZ0lJQWtBQ1FDQUVJQUFvQWhBb0FuaEpCRUFnQUJEcEFRd0JDeUFBSUFFZ0FpQUJRUUFRRkNJTFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0N5RUJEQUlMQWtBQ1FDQUxRb0NBZ0lCd1ZBMEFJQUFnQ3hES0FTSUtRUUJJRFFFQ1FDQUtCRUFnQUNBRVFReHFJQXNRMWdGRkRRRU1Bd3NnQUNBRVFRaHFJQVJCREdvZ0M2ZEJFUkNPQVNFSklBUW9BZ2doQlNBSlFRQklEUUlMSUFRb0Fnd2hDQU5BSUFjZ0NFWU5BUUpBSUFvRVFDQUFJQWNRcVFVaUJrVU5CQXdCQ3lBQUlBVWdCMEVEZEdvb0FnUVFHQ0VHQ3dKL0FrQWdBQ0FMSUFZZ0F4RDVCQ0lOUW9DQWdJQndneUlNUW9DQWdJQXdVZ1JBSUF4Q2dJQ0FnT0FBVWcwQklBQWdCaEFUREFVTElBQWdDeUFHUVFBUTFRRU1BUXNnQUNBTElBWWdEVUVIRUJrTElRa2dBQ0FHRUJNZ0IwRUJhaUVISUFsQkFFNE5BQXNNQVFzZ0FDQUZJQWdRV2tFQUlRVWdBQ0FDRUZ3aURFS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBUWdDemNER0NBRUlBdzNBeEFnQUNBRElBRkJBaUFFUVJCcUVDRWhBU0FBSUF3UUR5QUFJQXNRRHd3Q0N5QUFJQVVnQkNnQ0RCQmFJQUFnQ3hBUEMwS0FnSUNBNEFBaEFRc2dCRUVnYWlRQUlBRUxQd0VCZnlBQlFRQWdBVUVBU2hzaEFRTkFBa0FnQVNBRFJnUkFRWDhoQXd3QkN5QUFJQU5CQTNScUtBSUVJQUpHRFFBZ0EwRUJhaUVEREFFTEN5QURDLzhFQWdKL0JINENRQ0FDUXYvLy8vOXZXQVJBSUFBUUpBd0JDd0pBSUFBZ0FrRTlFSEVFZjBLQWdJQ0FNQ0VGUW9DQWdJQXdJUVpDZ0lDQWdEQWhDQ0FBSUFKQlBTQUNRUUFRRkNJSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFGQmdRSkJnQUlnQUNBSEVDWWJCVUVBQ3lFRElBQWdBa0UrRUhFRVFFS0FnSUNBTUNFRlFvQ0FnSUF3SVFaQ2dJQ0FnREFoQ0NBQUlBSkJQaUFDUVFBUUZDSUhRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRkJnZ1JCZ0FRZ0FDQUhFQ1liSUFOeUlRTUxJQUFnQWtFL0VIRUVRRUtBZ0lDQU1DRUZRb0NBZ0lBd0lRWkNnSUNBZ0RBaENDQUFJQUpCUHlBQ1FRQVFGQ0lIUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUZCaEFoQmdBZ2dBQ0FIRUNZYklBTnlJUU1MUW9DQWdJQXdJUVlDUUNBQUlBSkJ3QUFRY1VVRVFFS0FnSUNBTUNFSURBRUxRb0NBZ0lBd0lRVWdBQ0FDUWNBQUlBSkJBQkFVSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUF3Q0N5QURRWURBQUhJaEF3c0NRQUpBSUFBZ0FrSEJBQkJ4UlEwQVFvQ0FnSUF3SVFVZ0EwR0FFSEloQXlBQUlBSkJ3UUFnQWtFQUVCUWlCa0tBZ0lDQWNJTWlCMEtBZ0lDQU1GRU5BRUhEd2dBaEJDQUhRb0NBZ0lEZ0FGRU5BU0FBSUFZUU9FVU5BUXNDUUNBQUlBSkJ3Z0FRY1VVRVFFS0FnSUNBTUNFRkRBRUxJQU5CZ0NCeUlRTWdBQ0FDUWNJQUlBSkJBQkFVSWdWQ2dJQ0FnSENESWdKQ2dJQ0FnREJSRFFCQnRNSUFJUVFnQWtLQWdJQ0E0QUJSRFFFZ0FDQUZFRGhGRFFFTElBTkJnREJ4QkVCQnNla0FJUVFnQTBHQXhBQnhEUUVMSUFFZ0JUY0RHQ0FCSUFZM0F4QWdBU0FJTndNSUlBRWdBellDQUVFQUR3c2dBQ0FFUVFBUUZRc2dBQ0FJRUE4Z0FDQUdFQThnQUNBRkVBOExRWDhMd2dFQkFuOGdBaWdDQkVVRVFDQUNLQUlZSWdNZ0FpZ0NIQ0lFTmdJRUlBUWdBellDQUNBQ1FnQTNBaGdDUUNBQktBSUFCRUFnQWhDZkJRd0JDeUFBSUFJcEF5QVFJd3NnQUNBQ0tRTW9FQ01nQWlBQ0tBSUFRUUZySWdNMkFnQUNRQ0FEUlFSQUlBSW9BaEFpQXlBQ0tBSVVJZ1EyQWdRZ0JDQUROZ0lBSUFKQ0FEY0NFQ0FBUVJCcUlBSWdBQ2dDQkJFQUFBd0JDeUFDUW9DQWdJQXdOd01vSUFKQ2dJQ0FnREEzQXlBZ0FrRUJOZ0lFQ3lBQklBRW9BZ3hCQVdzMkFnd0xDNVVCQVFOK0lBRzlJZ0pDLy8vLy8vLy8vLy8vQUlNaEF5QUF2U0lFUXYvLy8vLy8vLy8vL3dDRFFvR0FnSUNBZ0lENC93QmFCRUFnQTBLQmdJQ0FnSUNBK1A4QVZBOExBbjlCZnlBRFFvQ0FnSUNBZ0lENC93QldJQUFnQVdOeURRQWFRUUVnQUNBQlpBMEFHa0VBSUFCRUFBQUFBQUFBQUFCaURRQWFJQVJDQUZNRVFDQUNRaitIcDBGL2N3OExJQUpDUDRpbkN3c3dBQ0FCUW9DQWdJQVFoRUtBZ0lDQWNJTkNnSUNBZ0RCUkJFQWdBQ0FCRURjUEN5QUFJQUZCT0VFQVFRQVFyUUlMS1FFQmZ5QUNRaUNJcDBGMVR3UkFJQUtuSWdNZ0F5Z0NBRUVCYWpZQ0FBc2dBQ0FCSUFJUXhRVUxVZ0lCZndGK1FvQ0FnSURnQUNFRUlBQWdBU0FDRUpNQklnTUVmaUFES0FJZ0lnTW9BZ3dvQWlBdEFBUUVRQ0FDUlFSQVFnQVBDeUFBRUd0Q2dJQ0FnT0FBRHdzZ0F6VUNFQVZDZ0lDQWdPQUFDd3M0QUNBQUlBRWdBaENUQVNJQVJRUkFRb0NBZ0lEZ0FBOExJQUFvQWlBb0Fnd2lBQ0FBS0FJQVFRRnFOZ0lBSUFDdFFvQ0FnSUJ3aEF0UkFnRitBWDhnQUNBQUtRT1FBVUVERUVraUFrS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBRkNJSWluUVhWUEJFQWdBYWNpQXlBREtBSUFRUUZxTmdJQUN5QUFJQUpCTkNBQlFRTVFHUm9MSUFJTGxRRUJBMzhqQUVFUWF5SUVKQUFnQkNBQ053TUlJQUVvQWdBaUJTQUJLQUlFSWdZMkFnUWdCaUFGTmdJQUlBRkNBRGNDQUNBQUlBQWdBVUVnYWlBRFFRTjBhaWtEQUVLQWdJQ0FNRUVCSUFSQkNHb1FJUkFQSUFBZ0FTa0RFQkFQSUFBZ0FTa0RHQkFQSUFBZ0FTa0RJQkFQSUFBZ0FTa0RLQkFQSUFBb0FoQWlBRUVRYWlBQklBQW9BZ1FSQUFBZ0JFRVFhaVFBQzQwQkFRTi9Jd0JCRUdzaUJDUUFJQVFnQVRjRENDQURRUUYwSVFaQkFDRURBMEFDUUFKQUlBTkJBa1lOQUNBQVFjd0FRUUVnQXlBR2FrRUJJQVJCQ0dvUXp3RWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJRWDhoQlNBRFFRRkhEUUFnQUNBQ0tRTUFFQThMSUFSQkVHb2tBQ0FGRHdzZ0FpQURRUU4wYWlBQk53TUFJQU5CQVdvaEF3d0FDd0FMeUFZQ0JuOENmaU1BUVRCcklnTWtBQ0FCUVFocUlRVWdBVUhJQUdvaEJnSkFBa0FDUUFKQUEwQWdBU2dDVENJQ0lBWkdEUVFDUUFKQUFuOENRQUpBQWtBQ1FDQUJLQUlFSWdRT0JnQUNBZ1VMQVFZTElBSW9BZ2hGRFFJZ0FDQUJFT0FEREFZTEFrQUNRQ0FDS0FJSURnSUlBQUVMSUFGQkJEWUNCQ0FESUFJcEF4QTNBeWdnQUNBQUtRTlFJQUVnQTBFb2FrRUFFUDRCSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQ2lBQUlBRTFBZ0JDZ0lDQWdIQ0VJQU5CQVJDRUJVVUVRQ0FEUW9DQWdJQXdOd01ZSUFOQ2dJQ0FnREEzQXhBZ0FDQUlJQU1nQTBFUWFoQ3ZBaG9nQUNBREtRTUFFQThnQUNBREtRTUlFQThMSUFBZ0NCQVBEQW9MSUFBZ0FpQUNLUU1RRU44RERBa0xJQUlwQXhBaUNFSWdpS2RCZFU4RVFDQUlweUlISUFjb0FnQkJBV28yQWdBTElBUkJBVWNnQWlnQ0NDSUVRUUpIY2tVRVFDQUFJQWdRaWdGQkFRd0NDeUFCS0FKRUlnSWdCSzAzQXdBZ0FrRUlheUFJTndNQUlBRWdBa0VJYWpZQ1JBdEJBQXNoQWlBQlFRTTJBZ1FnQVNBQ05nSVVDeUFBSUFVUXRBSWlDVUtBZ0lDQWNJTWlDRUtBZ0lDQTRBQlJCRUFnQUNnQ0VDSUNLUU9BQVNFSUlBSkNnSUNBZ0NBM0E0QUJJQUFnQVJEZ0F5QUFJQUVvQWt3Z0NCRGZBeUFBSUFnUUR3d0NDeUFKUXYvLy8vOFBXQVJBSUFFb0FrUkJDR3NpQWlrREFDRUlJQUpDZ0lDQWdEQTNBd0FDUUFKQUlBbW5JZ0lPQXdFQUFBTUxJQUVnQWpZQ0JDQUFJQUVnQ0VFQUVQb0NJQUFnQ0JBUERBTUxJQU1nQ0RjREtDQUFJQUFwQTFBZ0FTQURRU2hxUVFBUS9nRWlDVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEZJQUFnQVRVQ0FFS0FnSUNBY0lRZ0EwRVFha0VBRUlRRkJFQWdBQ0FKRUE4TUJnc2dBMEtBZ0lDQU1EY0RDQ0FEUW9DQWdJQXdOd01BSUFBZ0NTQURRUkJxSUFNUXJ3SWFJQUFnQ1JBUFFRQWhBUU5BSUFGQkFrWU5CaUFBSUFOQkVHb2dBVUVEZEdvcEF3QVFEeUFCUVFGcUlRRU1BQXNBQ3lBSVFvQ0FnSUF3VWcwRElBRW9Ba1JCQ0dzaUFpa0RBQ0VJSUFKQ2dJQ0FnREEzQXdBZ0FDQUJFT0FESUFBZ0FTQUlRUUVRK2dJZ0FDQUlFQThNQVFzTEVBRUFDeUFBSUFGQ2dJQ0FnREJCQVJENkFnd0NDMEhaa1FGQnJ2d0FRYldaQVVIYkpSQUFBQXNnQUNBSUVBOExJQU5CTUdva0FBdWxBd0lFZndGK0l3QkJFR3NpQmlRQUFrQUNRQUpBQWtBZ0FrRUFTQVJBSUFZZ0FrSC8vLy8vQjNFMkFnQWdBVUhBQUVIY0lpQUdFRTRhREFFTElBQW9BaXdnQWswTkFpQUNSUVJBSUFGQjlvZ0JLQUFBTmdBRElBRkI4NGdCS0FBQU5nQUFEQUVMSUFBb0FqZ2dBa0VDZEdvb0FnQWlCRUVCY1EwRElBRWhBZ0pBSUFSRkRRQWdCQ2tDQkNJSFFvQ0FnSUFJZzFBRVFDQUVRUkJxSVFNZ0I2ZEIvLy8vL3dkeElRVkJBQ0VDUVFBaEFBTkFJQUlnQlVaRkJFQWdBQ0FDSUFOcUxRQUFjaUVBSUFKQkFXb2hBZ3dCQ3dzZ0FFR0FBVWdOQXdzZ0JFRVFhaUVGUVFBaEFDQUJJUUlEUUNBQUlBZW5RZi8vLy84SGNVOE5BUUovSUFkQ2dJQ0FnQWlEVUVVRVFDQUZJQUJCQVhScUx3RUFEQUVMSUFBZ0JXb3RBQUFMSVFNZ0FpQUJhMEU1U2cwQkFuOGdBMEgvQUUwRVFDQUNJQU02QUFBZ0FrRUJhZ3dCQ3lBQ0lBTVFvUU1nQW1vTElRSWdBRUVCYWlFQUlBUXBBZ1FoQnd3QUN3QUxJQUpCQURvQUFBc2dBU0VEQ3lBR1FSQnFKQUFnQXc4TFFlL2ZBRUd1L0FCQjN4ZEJvWUVCRUFBQUMwR1BrZ0ZCcnZ3QVFla1hRYUdCQVJBQUFBdUhBUUVFZnlBQVFSQnFJUU1nQVVISUFHb2hCQ0FCS0FKTUlRSURRQ0FDSUFSR1JRUkFJQUlvQWdRaEJTQUFJQUlwQXhBUUl5QUFJQUlwQXhnUUl5QUFJQUlwQXlBUUl5QUFJQUlwQXlnUUl5QURJQUlnQUNnQ0JCRUFBQ0FGSVFJTUFRc0xJQUVvQWdSQmZuRkJCRWNFUUNBQUlBRkJDR29RL2dJTElBTWdBU0FBS0FJRUVRQUFDMkFCQW44Z0FTQUJLQUlBUVFGcklnSTJBZ0FnQWtVRVFDQUFJQUVRM1FNZ0FDQUJLUU1RRUNNZ0FDQUJLUU1ZRUNNZ0FTZ0NDQ0lDSUFFb0Fnd2lBellDQkNBRElBSTJBZ0FnQVVJQU53SUlJQUJCRUdvZ0FTQUFLQUlFRVFBQUN3dnpBd0lEZndKK0l3QkJNR3NpQWlRQUFrQUNRQ0FBSUFGQktHb1F0QUlpQlVLQWdJQ0FjSU1pQmtLQWdJQ0E0QUJSRFFBZ0FpQUJLQUprUVFocklnTXBBd0EzQXlBZ0EwS0FnSUNBTURjREFDQUdRb0NBZ0lBd1VRUkFJQUFnQUNBQktRTVFRb0NBZ0lBd1FRRWdBa0VnYWhBaEVBOGdBQ0FDS1FNZ0VBOGdBQ2dDRUNBQkVOMEREQUlMSUFBZ0JSQVBRUUFoQXlBQUlBQXBBMUFnQUNBQ1FTQnFRUUFRL2dFaEJTQUFJQUlwQXlBUUR5QUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQURRQUpBSUFOQkFrY0VRQ0FDUVJCcUlBTkJBM1JxSUFBZ0FDa0RNQ0FEUVRWcUVFa2lCamNEQUNBR1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFZ0EwRUJSZ1JBSUFBZ0Fpa0RFQkFQQ3lBQUlBVVFEd3dEQ3lBQ1FvQ0FnSUF3TndNSUlBSkNnSUNBZ0RBM0F3QWdBQ0FGSUFKQkVHb2dBaEN2QWlFRUlBQWdCUkFQUVFBaEF3TkFJQU5CQWtaRkJFQWdBQ0FDUVJCcUlBTkJBM1JxS1FNQUVBOGdBMEVCYWlFRERBRUxDeUFFRFFJTUF3c2dBU0FCS0FJQVFRRnFOZ0lBSUFhbklBRTJBaUFnQTBFQmFpRUREQUFMQUFzZ0FDZ0NFQ0lES1FPQUFTRUZJQU5DZ0lDQWdDQTNBNEFCSUFJZ0JUY0RLQ0FBSUFFcEF4aENnSUNBZ0RCQkFTQUNRU2hxRUNFaEJTQUFJQUlwQXlnUUR5QUFLQUlRSUFFUTNRTWdBQ0FGRUE4TElBSkJNR29rQUF1ZkF3SUhmd0YrSXdCQk1Hc2lCaVFBQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlFTHdFR1FURkhEUUFnQkNnQ0lDSUZSUTBBSUFVb0FnQU5BQ0FDUWlDSXAwRjFUd1JBSUFLbklnUWdCQ2dDQUVFQmFqWUNBQXNnQUNBRlFSaHFJQUlRSUNBRklBTkJBV29pQkRZQ0FBSkFJQVJCQWtjTkFDQUZLQUlVRFFBZ0FDZ0NFQ0lFS0FLWUFTSUhSUTBBSUFBZ0FTQUNRUUFnQkNnQ25BRWdCeEU0QUFzZ0EwRUFSNjFDZ0lDQWdCQ0VJUUVnQlNBRFFRTjBhaUlFUVFScUlRZ2dCQ2dDQ0NFRUEwQWdCQ0FJUmtVRVFDQUVLQUlFSVFjZ0JpQUVLUU1JTndNQUlBWWdCQ2tERURjRENDQUVLUU1ZSVFzZ0JpQUNOd01nSUFZZ0FUY0RHQ0FHSUFzM0F4QWdBRUhMQUVFRklBWVFtZ01nQkNnQ0FDSUpJQVFvQWdRaUNqWUNCQ0FLSUFrMkFnQWdCRUlBTndJQUlBQW9BaEFnQkJDdUFpQUhJUVFNQVFzTElBVkJBU0FEYTBFRGRHb2lBMEVFYWlFSElBTW9BZ2doQkFOQUlBUWdCMFlOQVNBRUtBSUFJZ1VnQkNnQ0JDSUROZ0lFSUFNZ0JUWUNBQ0FFUWdBM0FnQWdBQ2dDRUNBRUVLNENJQU1oQkF3QUN3QUxJQVpCTUdva0FBdW9BZ0lFZndGOEl3QkJFR3NpQlNRQUEwQUNRRUYvSVFRQ1FBSkFBa0FDUUVFSElBSkNJSWluSWdZZ0JrRUhhMEZ1U1J0QkNXb09FUUlEQXdNREF3TURBd0FBQUFBREF3UUJBd3NnQXFjaEEwRUFJUVFNQXd0QkFDRUVJQUpDZ0lDQWdNQ0JnUHovQUh3aUFrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmdSQURBTUxRWUNBZ0lCNElRTWdBcjhpQjBRQUFBQUFBQURnd1dNTkFrSC8vLy8vQnlFRElBZEVBQURBLy8vLzMwRmtEUUlnQjVsRUFBQUFBQUFBNEVGakJFQWdCNm9oQXd3REMwR0FnSUNBZUNFRERBSUxRUUFoQkNBRlFReHFJQUtuUVFScVFRQVFxUUVnQUNBQ0VBOGdCU2dDRENFRERBRUxJQUFnQWhDTkFTSUNRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRRUxDeUFCSUFNMkFnQWdCVUVRYWlRQUlBUUxzUVlCRFg4akFFSHdBR3NpQnlRQUFrQUNRQUovSUFJZ0FrRUJheUlGY1VVRVFDQUJLQUlNUVFWMElBRW9BZ2hCSUNBRloyc2lDVzhpQldzZ0NVRUFJQVZCQUVvYmFpRU5JQWxCSUNBSlFmOEJjVzRpREd3aERpQUJEQUVMSUFJUWx3VWhDQ0FCS0FJQUlRVWdCMElBTndJWUlBZENnSUNBZ0lDQWdJQ0FmemNDRUNBSElBVTJBZ3dnQjBFTWFpQURJQUpCM3FnRWFpMEFBQ0lNYWtFQmF5QU1iaUlORUVFTkFVRUFJUVVnQnlnQ0RDSUxLQUlBUVFCQkJFSEVBQ0FIS0FJWUlnbEJBV3RuUVFGMGF5QUpRUUpKR3lJS1FSUnNJQXNvQWdRUkFRQWlCa1VOQVFOQUlBVWdDa1pGQkVBZ0J5Z0NEQ0VRSUFZZ0JVRVViR29pRGtJQU53SU1JQTVDZ0lDQWdJQ0FnSUNBZnpjQ0JDQU9JQkEyQWdBZ0JVRUJhaUVGREFFTEMwRUFJUVVnQmlBSEtBSWNJQUVnQ1VFQUlBa2dDRUVnSUFoQkFXdG5hMEVBSUFoQkFrOGJFS0VFSVFnRFFDQUZJQXBHUlFSQUlBWWdCVUVVYkdvUUd5QUZRUUZxSVFVTUFRc0xRUUFoQ1NBTEtBSUFJQVpCQUNBTEtBSUVFUUVBR2lBSURRRWdEQ0FOYkNBRGF5RUxRUUVoRGlBSFFReHFDeUVJUVg4Z0NYUkJmM01oRUVFQUlRb2dBa0VLUnlFUklBd2hCUU5BSUFNZ0NrME5BaUFGSUF4R0JFQWdEU0FPYXlFTkFrQWdDVVVFUUVFQUlRVWdEU0FJS0FJTVNRUkFJQWdvQWhBZ0RVRUNkR29vQWdBaEJRc2dEQ0VHSUJGRkJFQURRQ0FHUVFCTURRTWdCa0VCYXlJR0lBZEJJR3BxSUFVZ0JVRUtiaUlGUWZZQmJHcEJNSEk2QUFBTUFBc0FDd05BSUFaQkFFd05BaUFHUVFGcklnWWdCMEVnYW1wQk1FSFhBQ0FGSUFVZ0FtNGlCU0FDYkdzaUQwRUtTQnNnRDJvNkFBQU1BQXNBQ3lBSUtBSVFJQWdvQWd3Z0RSQm9JUVlnRENFRkEwQWdCVUVBVEEwQklBVkJBV3NpQlNBSFFTQnFha0V3UWRjQUlBWWdFSEVpRDBFS1NCc2dEMm82QUFBZ0JpQUpkaUVHREFBTEFBc2dDeUVGUVFBaEN3c0NRQ0FLSUFRaUJra05BQ0FESVFZZ0JDQUtSdzBBSUFCQkxoQVJDeUFBSUFkQklHb2dCV29nRENBRmF5SVBJQVlnQ21zaUJpQUdJQTlLR3lJR0VISWdCaUFLYWlFS0lBVWdCbW9oQlF3QUN3QUxJQUJCQVRZQ0RDQUhRUXhxSVFnTElBRWdDRWNFUUNBSUVCc0xJQWRCOEFCcUpBQUx3Z0VDQTM4QmZpQUFJQUJCSDNVaUEzTWdBMnNoQTBFQUFuOGdBU0FCUVFGcklnUnhSUVJBUVNBZ0JHY2lCV3NoQkNBQ0JFQkJIeUFGYTBFQUlBQkJBRTRiSUFOcUlBUnVEQUlMSUFSQkFDQUJRUUpQR3lBRGJBd0JDeUFBUVg5elFSOTJJUVFnQVVFQ2F5RUJJQVFDZmlBQ0JFQWdBNjBpQmlBQlFRTjBJZ0ZCNUtFRWFqVUNBSDVDSUlnZ0FVSGdvUVJxTlFJQUlBWitmRUlmaUF3QkN5QUJRUUowUVlDa0JHbzFBZ0FnQTYxK1FoMklDNmRxQ3lJQmF5QUJJQUJCQUVnYkMwZ0JBbjhqQUVFUWF5SUNKQUJCZnlFREFrQWdBQ0FDUVF4cUlBRVF1Z0VOQUNBQ0tBSU1JZ05CSld0QlhFc05BQ0FBUWRtSkFVRUFFRkJCZnlFREN5QUNRUkJxSkFBZ0F3dDFBUUYvQWtBZ0FVS0FnSUNBY0lOQ2dJQ0FnT0IrVVFSQURBRUxBa0FnQVVLQWdJQ0FjRlFOQUNBQnB5SUNMd0VHUVNGSERRQWdBaWtESUNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0SDVTRFFBTUFRc2dBRUdpTEVFQUVCVkNnSUNBZ09BQUR3c2dBYWNpQUNBQUtBSUFRUUZxTmdJQUlBRUxyZ0lDQVh3QmZ3SkFBMEFDUUFKQUFrQUNRQUpBUVFjZ0FrSWdpS2NpQkNBRVFRZHJRVzVKRzBFSmFnNFJBZ01EQXdNREF3TURBQUFBQUFNREJBRURDeUFCSUFMRU53TUFEQVVMSUFKQ2dJQ0FnTUNCZ1B6L0FId2lBa0wvLy8vLy8vLy8vLzhBZzBLQmdJQ0FnSUNBK1A4QVdnUkFJQUZDQURjREFBd0ZDeUFDdnlJRFJBQUFBQUFBQU9ERFl3UkFJQUZDZ0lDQWdJQ0FnSUNBZnpjREFBd0ZDeUFEUkFBQUFBQUFBT0JEWkFSQUlBRkMvLy8vLy8vLy8vLy9BRGNEQUF3RkN5QUJBbjRnQTVsRUFBQUFBQUFBNEVOakJFQWdBN0FNQVF0Q2dJQ0FnSUNBZ0lDQWZ3czNBd0FNQkFzZ0FTQUNwMEVFYWtFQUVJSURHaUFBSUFJUUR3d0RDeUFBSUFJUWpRRWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVnMEJDd3NnQVVJQU53TUFRWDhQQzBFQUM3RUNBUUovSXdCQklHc2lCQ1FBQWtBQ1FBSkFJQUlvQWd4RkJFQUNRQUpBQWtBQ1FDQUNLQUlJUWY3Ly8vOEhhdzRDQVFBQ0N5QUFFRFVNQWdzZ0FpZ0NCQTBEQ3lBQUlBSVFSQm9MUVFBaEFpQUJSUTBESUFGQ0FCQXdHZ3dEQ3lBQ0tBSUVSUTBCQ3lBQUVEVkJBU0VDSUFGRkRRRWdBVUlBRURBYURBRUxJQUFnQWlBQ0tBSUlRUUZxUVFKdFFRRVFrUVlnQUVFQkVORUJHaUFCSWdORkJFQWdBQ2dDQUNFRElBUkNBRGNDR0NBRVFvQ0FnSUNBZ0lDQWdIODNBaEFnQkNBRE5nSU1JQVJCREdvaEF3c2dBeUFBSUFCQi8vLy8vd05CQVJCREdpQURJQU1vQWdSQkFYTTJBZ1FnQXlBRElBSkIvLy8vL3dOQkFSRExBUnBCSUNFQ0lBTW9BZ2hCLy8vLy93ZEhCRUFnQXlnQ0RFRUFSMEVFZENFQ0N5QUJEUUFnQXhBYkN5QUVRU0JxSkFBZ0Fnc01BQ0FBSUFFUWlBTkJBRXdMRFFBZ0FDQUJJQUpCQWhEakF3dlJEQUVJZnlNQVFZQUJheUlGSkFBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQVNnQ0RBUkFJQUlvQWd3TkFRc2dBaWdDQ0VHQWdJQ0FlRVlFUUNBQVFnRVFNQm9NQ3dzZ0FTZ0NDRUgvLy8vL0IwWU5DU0FBUWdFUU1Cb0NRQ0FCSUFBUTB3RWlBeUFFUVlDQUJIRkZja1VFUUNBQ0tBSUlRZjcvLy84SFRnMExEQUVMSUFNTkFnc2dBU2dDQkVVTkNpQUNLQUlJUWYvLy8vOEhSZzBKREFvTElBQW9BZ0FoQnlBRlFnQTNBandnQlVLQWdJQ0FnSUNBZ0lCL053STBJQVVnQnpZQ01DQUZRVEJxSUFFUVJCb2dBaEN4QWlFS0lBUWhDQ0FCS0FJRUJFQWdDa0VBU0FSQUlBQVFOU0FGUVRCcUVCdEJBU0VHREF3TElBVWdCU2dDTkVFQmN6WUNOQ0FLUlNJTUlBUkJCbkZCQWtaeElBUnpJUWdMSUFCQ0FSQXdHaUFGUVRCcUlBQVFnZ0lOQkNBRlFnQTNBaWdnQlVLQWdJQ0FnSUNBZ0lCL053SWdJQVVnQnpZQ0hDQUZRZ0EzQWhRZ0JVS0FnSUNBZ0lDQWdJQi9Od0lNSUFVZ0J6WUNDQ0FGUVJ4cUlnRWdCVUV3YWlJSlFTQkJBaENmQkNBRlFRaHFJZ1lnQ1VFZ1FRTVFud1FnQVNBQklBSkJJQ0FDS0FJRVFRSnpFRU1hSUFZZ0JpQUNRU0FnQWlnQ0JFRURjeEJER2tFQUlRWUNRQ0FGS0FJUVFRQk1EUUFnQlVJQU53SmtJQVZDZ0lDQWdJQ0FnSUNBZnpjQ1hDQUZJQWMyQWxnZ0JVSUFOd0pRSUFWQ2dJQ0FnSUNBZ0lDQWZ6Y0NTQ0FGSUFjMkFrUWdCVUhFQUdvaUNVRWdRUU1RMHdJZ0JVSUFOd0o0SUFWQ2dJQ0FnSUNBZ0lDQWZ6Y0NjQ0FGSUFVb0FsZzJBbXdnQlVIc0FHb2lCMEdBZ0lDQUFrRUJRUndnQ0VFRmRrRS9jU0lCYTNRZ0FVRS9SaHNpQWF3UU1Cb2dCVUhZQUdvaUN5QUpJQWRCSUVFREVFTWFJQWNRR3lBTElBVkJIR29Rc2dJRVFDQUZRZGdBYWhBYklBVkJ4QUJxRUJzZ0FFRUFJQU1nQ0JDckJDRUdEQUVMSUFWQnhBQnFJZ2RCSUVFQ0VOTUNJQVZCMkFCcUlna2dCMEVCSUFFZ0EwRUJheUFJUVJ4MFFSOTFjV29pQVd1c1FTQkJBaERVQWlBRlFRaHFJQWtRc2dJRVFDQUZRZGdBYWhBYklBVkJ4QUJxRUJzZ0NFRUhjVUVEUmdSQUlBQkNBUkF3R2lBQVFRTWdBV3MyQWdoQkdDRUdEQUlMSUFCQkFCQ0pBVUVZSVFZTUFRc2dCVUhFQUdvUUd5QUZRZGdBYWhBYkN5QUZRUnhxRUJzZ0JVRUlhaEFiSUFZTkJDQUVRUWR4SVFZZ0NrRUFUZzBDSUFaQkJrWU5BMEVBSVFjZ0FDZ0NBQ0VKSUFWQk1Hb1FzUUloQVFKQVFRQWdDbXNpQkVFZ1R3UkFJQUZGRFFFTUJRc2dBVUYvSUFSMFFYOXpjUTBFSUFFZ0JIVWhCd3NnQlNnQ1FDQUZLQUk4SWdzZ0FTQUZLQUk0YXlBTFFRVjBhaEJvUVFkeFFRRkhEUU1nQlVJQU53SjRJQVZDZ0lDQWdJQ0FnSUNBZnpjQ2NDQUZJQWsyQW13Z0JVSHNBR29nQlVFd2FoQkVHaUFGSUFVb0FuUWdBV3MyQW5SQkFDRUJBMEFnQVNBRVJnMENJQUVFUUNBRlFld0FhaUFBRUVRYUN5QUJRUUZxSVFFZ0FFRUFJQVZCN0FCcUVKRUZSUTBBQ3d3REN5QUNLQUlJUWY3Ly8vOEhhdzRDQmdjRkN5QUFJQUFvQWdnZ0IybzJBZ2dnQlVFd2FpQUFFRVFhSUFVZ0FpZ0NFRFlDZkNBRklBSW9BZ3cyQW5nZ0JTQUNLQUlFTmdKd0lBVWdBaWdDQ0NBS2F6WUNkQ0FGUWV3QWFpRUNDeUFGS0FJNElnRWdCVUV3YWhDeEFtc2lCRUVCUmdSQUlBVkJNR29pQkNBQ0lBRkJBV3VzUVNCQkFSRFVBaUFGUVFScUlBUkJBQkNwQVNBQVFnRVFNQm9nQUNBRktBSUVJQU1nQ0JETUFTRUdEQUlMSUFOQi8vLy8vd05HQkVBZ0JVSFlBR29nQWtFQUVLa0JJQUlvQWdRTkF5QUZLQUpZSWdGQi8vLy8vd0ZNQkVBZ0FDQUZRVEJxSUFGQi8vLy8vd05CQVJDaUJDRUdEQU1MSUFWQk1Hb1FHeUFBUVFCQi8vLy8vd01nQ0JDckJDRUdEQWdMSUFJb0FnaEJJRTRFUUNBR1FRWkdEUUVnQWlnQ0JBMEJJQUFnQWlBRVFRRnJyRUVnUVFFUTFBSWdCVUVFYWlBQVFRQVFxUUVnQlNnQ0JDQURTdzBCQ3lBQUlBVkJNR29nQXlBSVFjZ0FJQUlRbmdRaEJnd0JDeUFBSUFWQk1Hb2dBeUFJUWNrQUlBSVFuZ1FoQmdzZ0JVRXdhaEFiSUFBZ0REWUNCQXdGQzBITzBBQkIxUHdBUWFFbFFmRWhFQUFBQ3lBQktBSUVJQUlRc1FKRmNTRURJQUlvQWdRZ0FTZ0NDRUdBZ0lDQWVFWkdCRUFnQUNBREVJd0JRUUloQmlBQ0tBSUVSUTBEREFRTElBQWdBeENKQVF3Q0N5QUNLQUlFSUFOQkFFcEdCRUFnQUVFQUVJa0JEQUlMSUFCQkFCQ01BUXdCQ3lBQUVEVUxRUUFoQmdzZ0JVR0FBV29rQUNBR0MxTUJBbjhqQUVFZ2F5SUVKQUFnQUNnQ0FDRUZJQVJDQURjQ0dDQUVRb0NBZ0lDQWdJQ0FnSDgzQWhBZ0JDQUZOZ0lNSUFSQkRHb2lCU0FBSUFFZ0FpQURFT1FESVFBZ0JSQWJJQVJCSUdva0FDQUFDNGdDQWdKL0FYNGpBRUVRYXlJRUpBQUNRQUpBSUFGQ2dJQ0FnSENEUW9DQWdJRGdmbElOQUNBQnB5RURBa0FnQWtVTkFDQUVRUWhxSUFOQkJHcEJBQkNDQXcwQUlBUXBBd2dpQlVLQmdJQ0FnSUNBY0ZNZ0JVTC8vLy8vLy8vL0QxVnlEUUFnQUNBQkVBOGdCVUtBZ0lDQUNIeEMvLy8vL3c5WUJFQWdCVUwvLy8vL0Q0TWhBUXdDQzBLQWdJQ0F3SDRnQmJtOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNoQVF3QkN5QURLQUlNUVlDQWdJQjRSdzBBSUFNb0FnaEZEUUFnQXlnQ0FFRUJSdzBCSUFOQkFEWUNDQXNnQkVFUWFpUUFJQUVQQzBIampBRkJydndBUWJIZ0FFR1NqQUVRQUFBTFFBRURmMEVCSUFCQjNxZ0VhaTBBQUNJQklBRkJBVTBiSVFOQkFTRUNJQUFoQVFOQUlBSWdBMFpGQkVBZ0FrRUJhaUVDSUFBZ0FXd2hBUXdCQ3dzZ0FRdTJGUU1KZnd4K0Fud2pBRUZBYWlJQ0pBQWdBa0VBUWNBQUVDc2hCQ0FCUVFCQjBBRVFLeUlDSUFBMUFoQTNBeGdnQWlBQU5RSVVOd01BSUFBMUFoZ2hDeUFDUWdJM0F5QWdBaUFMTndNSUlBSWdBQ2dDUUVFRGRFSHdBbXF0TndNUUlBQkJ6QUJxSVFFZ0FFSElBR29oQ0FOQUlBRW9BZ0FpQlNBSVJrVUVRQ0FGS0FJUUlRRWdBaUFDS1FNZ1FnSjhOd01nSUFJZ0Fpa0RFQ0FBS0FKQVFRTjBRWWdDYXExOE53TVFJQUlnQWlrRHdBRWdCVE1CQ0h3M0E4QUJJQUlnQWlrRHlBRWdCVFFDREh3M0E4Z0JBa0FnQVVVTkFDQUJMUUFRRFFBZ0FTZ0NHQ0VESUFJZ0Fpa0RhRUlCZkRjRGFDQUNJQUlwQTNBZ0EwRUNkQ0FCS0FJY1FRTjBha0UwYXExOE53TndDeUFGUWVRQmFpRUJJQVZCNEFGcUlRa0RRQ0FKSUFFb0FnQWlBMGNFUUNBQ0lBSXBBeUFpRFVJQmZDSU1Od01nSUFJZ0Fpa0RFRUx3QUh3aUN6Y0RFQ0FES0FJSUJFQWdBaUFOUWdKOElndzNBeUFnQWlBTElBTW9BZ3hCQTNTdGZDSUxOd01RQ3dKQUlBTW9BaFJGRFFBZ0FpQU1RZ0Y4TndNZ0lBSWdDeUFES0FJWUlnWkJGR3l0ZkRjREVFRUFJUUVEUUNBQklBWk9EUUVDUUNBREtBSVVJQUZCRkd4cUlnY29BZ2dOQUNBSEtBSUVSUTBBSUFJZ0Fpa0RJRUlCZkRjRElDQUhLQUlFS1FNWUlBUVFuUUVnQXlnQ0dDRUdDeUFCUVFGcUlRRU1BQXNBQ3lBREtBSWdCRUFnQWlBQ0tRTWdRZ0Y4TndNZ0lBSWdBaWtERUNBREtBSWtRUUowclh3M0F4QUxJQU1vQWl3RVFDQUNJQUlwQXlCQ0FYdzNBeUFnQWlBQ0tRTVFJQU1vQWpCQkRHeXRmRGNERUFzZ0F5a0RPQ0FFRUowQklBTXBBMEFnQkJDZEFTQURRUVJxSVFFTUFRc0xJQVZCQkdvaEFRd0JDd3NnQUVIVUFHb2hBU0FBUWRBQWFpRUlBMEFnQVNnQ0FDSURJQWhHUlFSQUFrQUNRQUpBSUFOQkJHc3RBQUJCRDNFT0FnRUFBZ3NnQXlnQ0dBUi9JQU12QVNJZ0F5OEJJR3BCQkhSQlFHc0ZRY0FBQ3lFR0lBTW9BaXdFUUVFQUlRRWdBeWdDTUNJSElRVURRQ0FCSUFWT1JRUkFJQU1vQWl3Z0FVRURkR29wQXdBZ0JCQ2RBU0FCUVFGcUlRRWdBeWdDTUNFRkRBRUxDeUFIUVFOMElBWnFJUVlMSUFNb0Fod0VRQ0FES0FJMFFRTjBJQVpxSVFZTEFrQWdBeThBQ1NJRlFZQWdjUTBBSUFNb0FneEZEUUFnQkNBRUtRTW9JQU0wQWhCOE53TW9Dd0ovUVFBZ0JVR0FDSEZGRFFBYUFuOGdBeWdDVEVVRVFDQUdRUmhxSVFaQkFBd0JDeUFHSUFNb0FrQnFRUmxxSVFaQkFRc2lBU0FES0FKRUlnVkZEUUFhSUFRZ0JDa0RNRUlCZkRjRE1DQUVJQVFwQXpnZ0JheDhOd000SUFGQkFXb0xJUUVnQkNBRUtRTVlRZ0Y4TndNWUlBUWdCQ3NESUNBR3Q2QTVBeUFnQkNBRUt3TUFJQUczb0RrREFBd0JDeUFES0FJSUlRY2dBaUFDS1FOSVFnRjhOd05JQWtBZ0F5Z0NERVVOQUNBQ0lBSXBBeUJDQVh3M0F5QWdBaUFDS1FOZ0lBY29BaHhCQTNTdGZEY0RZQ0FDSUFJcEExZ2dCeWdDSUNJR3JIdzNBMWdnQjBFd2FpRUJRUUFoQlFOQUlBVWdCazROQVFKQUlBRW9BZ1JGRFFBZ0FTZ0NBRUgvLy8vL0Ewc05BQ0FES0FJTUlBVkJBM1JxS1FNQUlBUVFuUUVnQnlnQ0lDRUdDeUFGUVFGcUlRVWdBVUVJYWlFQkRBQUxBQXNnQnkwQUVFVUVRQ0FIS0FJWUlRRWdBaUFDS1FOb1FnRjhOd05vSUFJZ0Fpa0RjQ0FCUVFKMElBY29BaHhCQTNScVFUUnFyWHczQTNBTEFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBMEVDYXk4QkFFRUNhdzRqQUFrQkFRRUJBQWtCQ1FJREJBVUpCd1lJQ0FrSkNRa0pDUWtKQ1FrSkNRRUJDUUVKQ3lBQ0lBSXBBNmdCUWdGOE53T29BU0FEUVFOckxRQUFRUWh4UlEwSklBSWdBaWtEc0FGQ0FYdzNBN0FCSUFNb0FoeEZEUWtnQWlBQ0tRTWdRZ0Y4TndNZ0lBSWdBaWtERUNBREtBSWdRUU4wclh3M0F4QWdBaUFDS1FPNEFTQUROUUlnZkRjRHVBRkJBQ0VCQTBBZ0FTQURLQUlnVHcwS0lBTW9BaHdnQVVFRGRHb3BBd0FnQkJDZEFTQUJRUUZxSVFFTUFBc0FDeUFES1FNWUlBUVFuUUVNQ0FzZ0FpQUNLUU9nQVVJQmZEY0RvQUVNQndzZ0F5Z0NIQ0lKUlEwR0lBTW9BaGdoQnlBQ0lBSXBBeUJDQVh3M0F5QWdBaUFDS1FPQUFTQUhLQUk4SWdaQkFuU3RmRGNEZ0FGQkFDRUJBMEFnQVNBR1RnMEhBa0FnQ1NBQlFRSjBhaWdDQUNJRlJRMEFJQUlDZmtRQUFBQUFBQUR3UHlBRktBSUF0eUlYb3lBQ0tRTWd1YUFpR0psRUFBQUFBQUFBNEVOakJFQWdHTEFNQVF0Q2dJQ0FnSUNBZ0lDQWZ3czNBeUFnQWdKK1JBQUFBQUFBQUVCQUlCZWpJQUlwQTRBQnVhQWlGNWxFQUFBQUFBQUE0RU5qQkVBZ0Y3QU1BUXRDZ0lDQWdJQ0FnSUNBZndzM0E0QUJJQVVvQWhBaUNpQUZRUmhxUncwQUlBb3BBd0FnQkJDZEFTQUhLQUk4SVFZTElBRkJBV29oQVF3QUN3QUxJQU1vQWhnaEJrRUFJUUVEUUNBQklBWW9BaEFpQlU1RkJFQWdCaUFCUVFOMGFpa0RHQ0FFRUowQklBRkJBV29oQVF3QkN3c2dBaUFDS1FNZ1FnRjhOd01nSUFJZ0Fpa0RFQ0FGUVFOMFFSaHFyWHczQXhBTUJRc2dBeWdDR0NJR1JRMEVRUUFoQVFOQUlBRWdCaTBBQlNJRlQwVUVRQ0FHSUFGQkEzUnFLUU1JSUFRUW5RRWdBVUVCYWlFQkRBRUxDeUFDSUFJcEF5QkNBWHczQXlBZ0FpQUNLUU1RSUFXdFFnT0dmRUlJZkRjREVBd0VDeUFES0FJWUlBUVF0d1FnQXlnQ0hDQUVFTGNFREFNTElBTW9BaGdpQVVVTkFpQUJLUU1BSUFRUW5RRWdBaUFDS1FNZ1FnRjhOd01nSUFJZ0Fpa0RFRUlZZkRjREVBd0NDeUFES0FJWUlnRkZEUUVnQWlBQ0tRTWdJZ3RDQVh3M0F5QWdBaUFDS1FNUVFoeDhJZ3czQXhBZ0FTZ0NDRVVOQVNBQ0lBdENBbnczQXlBZ0FpQU1JQUUwQWdCOE53TVFEQUVMSUFNb0FoaEZEUUFnQWlBQ0tRTWdRZ0Y4TndNZ0N5QURRUVJxSVFFTUFRc0xJQUlnQWlrRFVDQUNLUU5JSWc1Q01INThJZzgzQTFBZ0FpQUNLUU1RSUFBb0Fzd0JJZ0ZCQW5TdGZDSVFOd01RUVFBaEJTQUJRUUFnQVVFQVNoc2hBeUFDS1FNZ0lRc0RRQ0FESUFWR1JRUkFJQUFvQXRRQklBVkJBblJxSVFFRFFDQUJLQUlBSWdFRVFDQUJLQUlZSVFZZ0FpQUNLUU5vUWdGOE53Tm9JQUlnQWlrRGNDQUdRUUowSUFFb0FoeEJBM1JxUVRScXJYdzNBM0FnQVVFb2FpRUJEQUVMQ3lBRlFRRnFJUVVNQVFzTElBSWdDMElEZkNJUk53TWdJQUlnQUNnQ0tDSUdyRGNES0NBQ0lBQW9BaXdpQXlBQUtBSWtha0VDZEswaUN6Y0RNRUVBSVFFZ0EwRUFJQU5CQUVvYklRVURRQ0FCSUFWSEJFQWdBQ2dDT0NBQlFRSjBhaWdDQUNJRFFRRnhSUVJBSUFJZ0N5QURLQUlFSWdOQkgzVWdBMEgvLy8vL0IzRWdBMEVmZG5ScVFSRnFyWHdpQ3pjRE1Bc2dBVUVCYWlFQkRBRUxDeUFDQW40Z0JDc0RDQkN4QXlJWG1VUUFBQUFBQUFEZ1EyTUVRQ0FYc0F3QkMwS0FnSUNBZ0lDQWdJQi9DeUlNTndNNElBSUNmaUFFS3dNUUVMRURJaGVaUkFBQUFBQUFBT0JEWXdSQUlCZXdEQUVMUW9DQWdJQ0FnSUNBZ0g4TElnMDNBMEFnQWlBRUtRTVlJaEkzQTNnZ0FnSitJQVFyQXlBUXNRTWlGNWxFQUFBQUFBQUE0RU5qQkVBZ0Y3QU1BUXRDZ0lDQWdJQ0FnSUNBZndzaUV6Y0RnQUVnQWlBRUtRTW9JaFEzQTRnQklBSWdCQ2tETUNJVk53T1FBU0FDSUFRcEF6Z2lGamNEbUFFZ0JDc0RBQ0VYSUFJZ0Fpa0RjQ0FDS1FOZ0lCWWdGQ0FQSUJCOElBMThJQk44Zkh3Z0MzeDhmRGNERUNBQ0FuNGdGeEN4QXlBR3Q2QWdETG1nSUE2NW9DQUNLUU5vdWFBZ0VybWdJQlc1b0NBUnVhQWlGNWxFQUFBQUFBQUE0RU5qQkVBZ0Y3QU1BUXRDZ0lDQWdJQ0FnSUNBZndzM0F5QWdCRUZBYXlRQUMxQUJBbjhEUUNBQkxBQUFJZ1FFUUNBRUlBQXNBQUFpQTBFZ2FpQURJQU5Cd1FCclFScEpHMGNFUUVFQUR3VWdBVUVCYWlFQklBQkJBV29oQUF3Q0N3QUxDeUFDQkVBZ0FpQUFOZ0lBQzBFQkM3MEhBZ3AvQVg0akFFSGdBR3NpQXlRQVFvQ0FnSURnQUNFTkFrQWdBQ0FEUVF4cUlBRVF1d0VpQmtVTkFDQUdLQUlFSWd3aEJTQUdLQUlJSWdSQmdJQ0FnSGhHQkVBZ0JrRUFOZ0lFUVFBaEJRc2dCaWdDQUNFS0lBTkNBRGNEVUNBRFFnQTNBMGdnQXlBS05nSmNJQU5CeFFBMkFsZ0Nmd0pBQWtBZ0JFSC8vLy8vQjBZRVFDQURRY2dBYWtHQmd3RVErd0lNQVFzZ0JRUkFJQU5CeUFCcVFTMFFFU0FHS0FJSUlRUUxJQVJCL3YvLy93ZEdCRUFnQTBISUFHcEI5UndRK3dJTUFRdEJBQ0VGSUFOQ0FEY0NRQ0FEUW9DQWdJQ0FnSUNBZ0g4M0FqZ2dBeUFLTmdJMElBSWdBa0VCYXlJSWNVVUVRRUVnSUFobmEwRUFJQUpCQWs4YklRVUxBa0FDUUFKQUFrQWdCUVJBSUFOQk5Hb2dCaEJFRFFFZ0EwRTBha0VBUVJFUXpnRkJJSEVOQVNBREtBSThJZ1FnQlVFQmEwRUFJQVJCQUU0YmFpQUZiU0VGSUFSQmdJQ0FnSGhHQkVBZ0EwSElBR3BCcUpBQkVQc0NEQVVMUVFBaEJDQUZRUUJLRFFJZ0EwSElBR3BCdlpBQkVQc0NRUUFnQldzaEFnTkFJQUlnQkVZTkJTQURRY2dBYWtFd0VCRWdCRUVCYWlFRURBQUxBQXNnQXlBR0tBSVFOZ0l3SUFNZ0JpZ0NEQ0lGTmdJc0lBTkJBRFlDSkNBRElBUTJBaWdnQkVFQUlBUkJBRW9iSUFKQkFSQ05CVUVCYWlFSUFrQWdCUVJBSUFnZ0FrRUFFSTBGSVFWQkVDRUVBMEFnQTBFMGFpSUxJQUpCQUNBRUlBVnFJZ2xCQVdvaUIwSGdEeEQ4QWlBTElBc2dBMEVnYWlBSFFlQVBFRU55SWdkQklIRU5BeUFIUVJCeFJRMENJQU5CTkdvZ0F5Z0NQRUVCSUFrUTRRTU5BaUFFUVFKdElBUnFJUVFNQUFzQUN5QURRVFJxSUFOQklHb1FSQTBCREFNTElBTkJOR3BCQVJEUkFVRWdjVVVOQWdzZ0EwRTBhaEFiREFRTElBTkJ5QUJxSUFOQk5Hb2dBaUFGSUFVUWpBVU1BUXNnQXlnQ1RDRUZJQU5CeUFCcUlBTkJOR29nQWlBSUlBZ1FqQVVnQXlnQ1RDSUpJQVZCQVdvaUFpQUNJQWxKRzBFQmF5RUlJQU1vQWtnaEJ5QUZJUVFEUUFKQUlBa2dCQ0lDUVFGcUlnUk5CRUFnQ0NFQ0RBRUxJQUlnQjJvdEFBQkJNRWNOQUNBRUlBZHFMUUFBUVM1SERRRUxDeUFDSUFWTkRRQWdCU0FIYWlBQ0lBZHFJQWtnQW1zUW5BRWdBeUFGSUFKcklBbHFOZ0pNQ3lBRFFUUnFFQnNMSUFOQnlBQnFRUUFRRVNBREtBSlVEUUFnQXlnQ1NBd0JDMEVBSUFNb0FrZ2lBa1VOQUJvZ0NpZ0NBQ0FDUVFBZ0NpZ0NCQkVCQUJwQkFBc2hCQ0FHSUF3MkFnUWdBQ0FHSUFOQkRHb1FYaUFFUlFSQUlBQVFmQXdCQ3lBQUlBUVFZaUVOSUFBb0F0Z0JJZ0FvQWdBZ0JFRUFJQUFvQWdRUkFRQWFDeUFEUWVBQWFpUUFJQTBMdzNVQ0VuOEJmaU1BUWFBR2F5SURKQUFnQVNnQ3lBRWlCRUVBSUFSQkFFb2JJUVlEUUNBQ0lBWkdSUVJBSUFFb0Fzd0JJQUpCQTNScVFYODJBZ1FnQWtFQmFpRUNEQUVMQ3lBQktBSThCRUFnQVNnQ3pBRkJmallDREF0QkFDRUNJQUVvQW53aUJrRUFJQVpCQUVvYklRWUNmZ0pBQWtBRFFDQUNJQVpHQkVBQ1FFRUNJUUpCQWlBRUlBUkJBa3diSVFnRFFBSkFJQUlnQ0VZRVFFRUFJUUlEUUNBQ0lBWkdEUUlDUUNBQktBSjBJQUpCQkhScUlnUW9BZ2hCQUU0TkFDQUVLQUlFSWdoQkFrZ05BQ0FFSUFFb0Fzd0JJZ1FnQkNBSVFRTjBhaWdDQUVFRGRHb29BZ1EyQWdnTElBSkJBV29oQWd3QUN3QUxJQUVvQXN3QklnY2dBa0VEZEdvaUJDZ0NCRUVBU0FSQUlBUWdCeUFFS0FJQVFRTjBhaWdDQkRZQ0JBc2dBa0VCYWlFQ0RBRUxDd0pBSUFFb0FrUkZEUUFDUUNBQktBSWdEUUFnQVMwQWJrRUJjUTBBSUFFZ0FDQUJRZElBRUU4MkFwQUJJQUVvQWp4RkRRQWdBU0FBSUFGQjB3QVFUellDbEFFTEFrQWdBU2dDVENJSVJRMEFJQUVvQXFnQlFRQklCRUFnQVNBQUlBRVF5Z00yQXFnQkN5QUJLQUtzQVVFQVNBUkFJQUVnQUNBQlFmRUFFRTgyQXF3QkN3SkFJQUVvQW1CRkRRQWdBU2dDc0FGQkFFNE5BQ0FCSUFBZ0FVSHlBQkJQTmdLd0FRc2dBU2dDTUVVTkFDQUJLQUswQVVFQVRnMEFJQUVnQUNBQlFmTUFFRTgyQXJRQkN3SkFJQUVvQWtnaUJFVU5BQ0FBSUFFUTZnSWFJQUVvQWp4RkRRQWdBUzBBYmtFQmNRMEFJQUVvQXB3QlFRQk9EUUFnQVNnQ3pBRkJER29oQWdOQUFrQWdBaWdDQUNJQ1FRQklEUUFnQVNnQ2RDQUNRUVIwYWlJQ0tBSUVRUUZIRFFBZ0FpZ0NBRUhOQUVZTkFpQUNRUWhxSVFJTUFRc0xJQUFnQVVITkFCQlBJZ0pCQUVnTkFDQUJLQUowSUFKQkJIUnFJZ1lnQVNnQ3pBRWlCMEVNYWlnQ0FEWUNDQ0FISUFJMkFnd2dCa0VCTmdJRUlBWWdCaWdDREVFQ2NqWUNEQ0FCSUFJMkFwd0JDd0pBSUFFb0FpeEZEUUFnQVNnQ2NDSUNSUTBBSUFBZ0FTQUNFT2tDR2dzQ1FDQUJLQUlnQkVBZ0FTRUZEQUVMSUFFaEJTQUJLQUxBQWcwQ0N3TkFJQVVvQWdRaUFrVU5BU0FGS0FJTUlRWUNRQ0FJRFFBZ0FpZ0NURVVFUUVFQUlRZ01BUXNnQWlnQ3FBRkJBRWdFUUNBQ0lBQWdBaERLQXpZQ3FBRUxJQUlvQXF3QlFRQklCRUFnQWlBQUlBSkI4UUFRVHpZQ3JBRUxBa0FnQWlnQ1lFVU5BQ0FDS0FLd0FVRUFUZzBBSUFJZ0FDQUNRZklBRUU4MkFyQUJDMEVCSVFnZ0FpZ0NNRVVOQUNBQ0tBSzBBVUVBVGcwQUlBSWdBQ0FDUWZNQUVFODJBclFCQ3dKQUlBUU5BQ0FDS0FKSVJRUkFRUUFoQkF3QkN5QUFJQUlRNmdJYVFRRWhCQXNDUUNBQ0tBSXNSUTBBSUFJb0FuQWlCMFVOQUNBQUlBSWdCeERwQWhvTElBSW9Bc3dCSUFaQkEzUnFRUVJxSVFVRFFDQUZLQUlBSWdaQkFFaEZCRUFnQWlnQ2RDQUdRUVIwYWlJSElBY29BZ3dpQlVFRWNqWUNEQ0FBSUFFZ0FrRUFJQVlnQnlnQ0FDQUZRUUZ4SUFWQkFYWkJBWEVnQlVFRGRrRVBjUkNmQVJvZ0IwRUlhaUVGREFFTEN3SkFJQVpCZmtjRVFFRUFJUVVEUUNBQ0tBS0lBU0FGVEFSQVFRQWhCUU5BSUFVZ0FpZ0NmRTROQkFKQUlBSW9BblFnQlVFRWRHb2lCaWdDQkEwQUlBWW9BZ0FpQmtVZ0JrSFJBRVp5RFFBZ0FDQUJJQUpCQUNBRklBWkJBRUVBUVFBUW53RWFDeUFGUVFGcUlRVU1BQXNBQ3lBQ0tBS0FBU0FGUVFSMGFpZ0NBQ0lHQkVBZ0FDQUJJQUpCQVNBRklBWkJBRUVBUVFBUW53RWFDeUFGUVFGcUlRVU1BQXNBQzBFQUlRVURRQ0FGSUFJb0FueE9EUUVDUUNBQ0tBSjBJQVZCQkhScUlnWW9BZ1FOQUNBR0VKNEZSUTBBSUFBZ0FTQUNRUUFnQlNBR0tBSUFRUUJCQUVFQUVKOEJHZ3NnQlVFQmFpRUZEQUFMQUFzZ0FpSUZLQUlnUlEwQVFRQWhCUU5BSUFJb0FzQUNJQVZNQkVBZ0FpRUZEQUlGSUFBZ0FTQUNRUUFnQWlnQ3lBSWdCVUVEZEdvaUJ5MEFBQ0lHUVFGMlFRRnhJQVVnQnlnQ0JDQUdRUUoyUVFGeElBWkJBM1pCQVhFZ0JrRUVkaEQxQVJvZ0JVRUJhaUVGREFFTEFBc0FDd0FMSUFFb0FwUURJZ1JGRFFOQkFDRUNBMEFnQVNnQzlBRWdBa3dFUUVFQUlRY0RRQ0FISUFRb0FpQk9EUVlnQkNnQ0hDQUhRUlJzYWlJR0tBSUlSUVJBUVFBaEFpQUJLQUxBQWlJSVFRQWdDRUVBU2hzaEJTQUdLQUlNSVFnQ1FBSkFBMEFnQWlBRlJnMEJJQWdnQVNnQ3lBSWdBa0VEZEdvb0FnUkhCRUFnQWtFQmFpRUNEQUVMQ3lBQ1FRQk9EUUVMSUFBZ0NFR1ZKaEQvQXd3SkN5QUdJQUkyQWdBTElBZEJBV29oQnd3QUN3QUxJQUFnQVVFQlFRQWdBaUFCS0FMOEFTQUNRUVIwYWlJR0tBSU1JQVl0QUFRaUJrRUNka0VCY1NBR1FRRjJRUUZ4UVFBUXlRTWhCaUFDUVFGcUlRSWdCa0VBVGcwQUN3d0VDd1VnQVNnQ2RDQUNRUVIwYWlJSUlBRW9Bc3dCSUFnb0FnUkJBM1JxSWdnb0FnUTJBZ2dnQ0NBQ05nSUVJQUpCQVdvaEFnd0JDd3RCdVk0QlFhNzhBRUcxN0FGQjZEa1FBQUFMSUFGQkVHb2hDQ0FCS0FJVUlRSUNRQU5BSUFJZ0NFY0VRQ0FDS0FJRUlRUWdBa0VRYXlnQ0FDRUdJQUFnQWtFWWF4Q2JCU0lVUW9DQWdJQndnMEtBZ0lDQTRBQlJEUU1nQmtFQVNBMENJQUVvQXJRQ0lBWkJBM1JxSUJRM0F3QWdCQ0VDREFFTEN5QURJQUVvQW9BQ0lnMDJBdHdGSUFNZ0FTZ0NoQUlpRGpZQzRBVWdBQ2dDRUNFQ0lBTkNBRGNEaUFZZ0EwSUFOd09BQmlBRElBSTJBcFFHSUFOQk96WUNrQVlnQVVHQUFtb2hERUVBSVFRRFFDQUJLQUwwQVNBRVRBUkFRUUFoQmtFQUlRZ0ZRUUFoQWlBQktBTEFBaUlHUVFBZ0JrRUFTaHNoQ0NBQktBTDhBU0FFUVFSMGFpRUdBa0FnQTBHQUJtb0Nmd05BSUFJZ0NFY0VRQ0FCS0FMSUFpQUNRUU4wYWlJSEtBSUVJZ1VnQmlnQ0RFWUVRQ0FCS0FJa1FRSkhEUVFnQnkwQUFFRUljVVVOQkNBRFFZQUdhaUlDUVRBUUVTQUNJQUFnQmlnQ0RCQVlFQjFCQVF3REN5QUZRWDV4UWRJQVJnMERJQUpCQVdvaEFnd0JDd3NnQTBHQUJtb2lBa0UvRUJFZ0FpQUFJQVlvQWd3UUdCQWRJQVl0QUFSQkJuUWlBa0dBZjNFZ0FrSEFBSElnQmlnQ0FFRUFTQnNMUWY4QmNSQVJDeUFFUVFGcUlRUU1BUXNMQTBBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0RpQUlJZ0pLQkVBZ0FpQUNJQTFxSWdrdEFBQWlCRUVDZEVHQXVBRnFMUUFBSWc5cUlRZ0NRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FFUWJNQmF3NFFGQVVOQkFFQkFRRUNBUUVEQXdNVUN3QUxJQVJCRVdzaUFrRWZTdzBPUVFFZ0FuUkJnSURRakh4eERROGdBa1VOQ3lBQ1FRVkhEUTRnQTBGL05nSVlJQU5DeWZxQWdPQUJOd01RSUFOQjNBVnFJQWdnQTBFUWFoQW5SUTBSSUFOQmdBWnFJQU10QU93RkVCRWdBeWdDNUFVaENDQURLQUxvQlNJQ1FYOUdJQUlnQmtaeURSTWdBU0FCS0FMY0FrRUJhallDM0FJZ0EwR0FCbW9pQkVIQ0FSQVJJQVFnQWhBZElBSWhCZ3dUQ3lBQUlBRWdDU2dBQVNJQ0lBa3ZBQVVnQkNBRFFZQUdha0VBUVFBZ0NCRHBCQ0VJSUFBZ0FoQVREQklMSUFrdkFBa2hCeUFKS0FBQklRSWdBU2dDcEFJZ0NTZ0FCVUVVYkdvaUJDQUVLQUlBUVFGck5nSUFJQUFnQVNBQ0lBZEJ1d0VnQTBHQUJtb2dEU0FFSUFnUTZRUWhDQ0FBSUFJUUV3d1JDeUFBSUFOQm1BWnFJQU5CbkFacUlBRWdDU2dBQVNJSElBa3ZBQVVpQ1JEb0JDSUZRUUJJRFFVZ0F5Z0NuQVlpQ2tVTkJBSkFBa0FDUUFKQUFrQWdCRUcrQVdzT0F3QUFBUUlMQWtBQ1FBSkFJQXBCQldzT0JRQUJBZ1VDQkFzZ0JFRy9BVVlFUUNBRFFZQUdha0VSRUJFTElBTkJnQVpxSWdJZ0F5Z0NtQVlnQlJDbEFpQUNRY1FBRUJFTUJRc2dBMEdBQm1vaUFpQURLQUtZQmlBRkVLVUNJQUpCTEJBUklBUkJ2d0ZHRFFRZ0EwR0FCbXBCRHhBUkRBUUxJQVJCdndGR0JFQWdBMEdBQm1wQkVSQVJDeUFEUVlBR2FpSUNJQU1vQXBnR0lBVVFwUUlnQWtFc0VCRWdBa0VrRUJFZ0FrRUFFQ29NQXdzQ1FBSkFBa0FnQ2tFRmF3NEZBQUVCQWdJREN5QURRWUFHYWlJQ0lBTW9BcGdHSUFVUXBRSWdBa0hGQUJBUkRBUUxJQU5CZ0FacUlnSkJNQkFSSUFJZ0FDQUhFQmdRSFNBQ1FRQVFFUXdEQ3lBQUlBY1E1d1FpQkVVTkNDQUFJQU5CbUFacUlBTkJuQVpxSUFFZ0JDQUpFT2dFSVFVZ0FDQUVFQk1nQlVFQVNBMElJQU1vQXB3R1FRaEhEUVlnQTBHQUJtb2lBaUFES0FLWUJpQUZFS1VDSUFKQkd4QVJJQUpCSGhBUklBSkJMQkFSSUFKQkhSQVJJQUpCSkJBUklBSkJBUkFxREFJTEVBRUFDeUFEUVlBR2FpSUNRVEFRRVNBQ0lBQWdCeEFZRUIwZ0FrRUFFQkVMSUFBZ0J4QVREQkFMSUFrb0FBRWlBa0VBU0EwQklBSWdBU2dDckFKT0RRRWdBU2dDcEFJZ0FrRVViR29nQXlnQ2hBWWdEMm8yQWdnTURRdEJBQ0VGUVFBaEFpQUpMd0FCSWc4Z0FTZ0M4QUZIRFFnRFFDQUJLQUtJQVNBQ1NnUkFJQUVvQW9BQklBSkJCSFJxSWdRdEFBOUJ3QUJ4UlFSQUlBTkJnQVpxSWdkQkF4QVJJQWNnQkNnQ0RFRUJkRUVJZFJBZElBZEIzQUFRRVNBSElBSkIvLzhEY1JBcUN5QUNRUUZxSVFJTUFRc0xBMEFnQlNBQktBSjhUa1VFUUFKQUlBRW9BblFnQlVFRWRHb2lBaWdDQkEwQUlBSXRBQTlCd0FCeERRQWdBMEdBQm1vaUJFRURFQkVnQkNBQ0tBSU1RUUYwUVFoMUVCMGdCRUhaQUJBUklBUWdCVUgvL3dOeEVDb0xJQVZCQVdvaEJRd0JDd3NDUUNBQktBS1VBMFVFUUVGL0lRc01BUXNnQVVGL0VNZ0RJUXNnQTBHQUJtb2lBa0VJRUJFZ0FrSHBBQkFSSUFJZ0N4QWRJQUVnQzBFQkVHa2FJQUVnQVNnQzBBSkJBV28yQXRBQ0MwRUFJUVFEUUFKQUFrQWdBU2dDOUFFZ0JFb0VRRUVBSVFJZ0FTZ0N3QUlpQjBFQUlBZEJBRW9iSVFjZ0FTZ0MvQUVnQkVFRWRHb2lDUzBBQkNJUVFRRnhJUW9DZndOQUlBSWdCMGNFUUNBQktBTElBaUFDUVFOMGFpZ0NCQ0lGSUFrb0FneEdCRUJCQUNFS0lBSWhCMEVDREFNTElBVkJmbkZCMGdCR0JFQWdBMEdBQm1vaUJVSGVBQkFSSUFVZ0FrSC8vd054RUNwQkFTRUtJQUloQjBFQkRBTUZJQUpCQVdvaEFnd0NDd0FMQ3lBQktBSWtRUUJISVJFZ0VFRUNjU0lDUlNBSktBSUFRUUJPY1EwQ0lBTkJnQVpxSWdWQlBoQVJJQVVnQUNBSktBSU1FQmdRSFNBRlFZQi9RWUovSUJCQkJIRWJRUUFnQWhzZ0VYSkJnd0Z4RUJGQkFBc2hCU0FLUlNBSktBSUFJZ0pCQUVoeERRSUNRQ0FDUVFCT0JFQWdBMEdBQm1vaUFrRURFQkVnQWlBSktBSUFFQjBnQ1NnQ0RFSDhBRWNOQVNBRFFZQUdhaUlDUWMwQUVCRWdBa0VXRUIwTUFRc2dBMEdBQm1wQkJoQVJDd0pBQWtBQ1FDQUZRUUZyRGdJQkFBSUxJQU5CZ0FacUlnSkIzd0FRRVNBQ0lBZEIvLzhEY1JBcURBUUxJQU5CZ0FacUlnSkJ6QUFRRVNBQ0lBQWdDU2dDREJBWUVCMGdBa0VPRUJFTUF3c2dBMEdBQm1vaUFrRTVFQkVnQWlBQUlBa29BZ3dRR0JBZERBSUxJQUVvQXBRREJFQWdBMEdBQm1vaUFrRXBFQkVnQWtHMkFSQVJJQUlnQ3hBZElBRW9BcVFDSUF0QkZHeHFJQU1vQW9RR05nSUlDeUFBS0FJUUlnSkJFR29nQVNnQy9BRWdBaWdDQkJFQUFDQUJRZ0EzQXZRQklBRkJBRFlDL0FFTUN3c2dBMEdBQm1vaUFrRURFQkVnQWlBSktBSUFFQjBnQWtIQUFCQVJJQUlnQUNBSktBSU1FQmdRSFNBQ0lCRVFFUXNnQUNBSktBSU1FQk1nQkVFQmFpRUVEQUFMQUF0QmhTbEJydndBUVl6eUFVSDdPUkFBQUF0Qm1vSUJRYTc4QUVIWTZ3RkIzL1FBRUFBQUMwR3VoQUZCcnZ3QVFadnJBVUhmOUFBUUFBQUxBMEFnQWlBT1RrVUVRQ0FEUVlBR2FpQUNJQTFxSWdRZ0JDMEFBRUVDZEVHQXVBRnFMUUFBSWdRUWNpQUNJQVJxSVFJTUFRc0xJQXdROWdFZ0RDQURLUU9RQmpjQ0VDQU1JQU1wQTRnR053SUlJQXdnQXlrRGdBWTNBZ0FNREFzZ0RCRDJBU0FNSUFNcEE1QUdOd0lRSUF3Z0F5a0RpQVkzQWdnZ0RDQURLUU9BQmpjQ0FBSkFJQUVvQW93Q0RRQWdBU2dDcEFJaERTQURJQUVvQXZBQ05nS1lCaUFESUFFb0FvQUNJZ2syQXR3RklBTWdBU2dDaEFJaUN6WUM0QVVnQUNnQ0VDRUNJQU5DQURjRGlBWWdBMElBTndPQUJpQURJQUkyQXBRR0lBTkJPellDa0FZZ0FTZ0MwQUlpQWdSQUlBRWdBU2dDQUNBQ1FRUjBFRjhpQWpZQ3pBSWdBa1VORFFzQ1FDQUJLQUxjQWlJQ1JRMEFJQUV0QUc1QkFuRU5BQ0FCSUFFb0FnQWdBa0VEZEJCZklnSTJBdGdDSUFKRkRRMGdBVUVBTmdMb0FpQUJJQUVvQXZBQ05nTGtBZ3NnQVNnQ3RBRkJBRTRFUUNBRFFZQUdhaUlDUVF3UUVTQUNRUVFRRVNBQ1Fka0FJQUVvQXJRQkVGMExJQUVvQXJBQlFRQk9CRUFnQTBHQUJtb2lBa0VNRUJFZ0FrRUNFQkVnQWtIWkFDQUJLQUt3QVJCZEN5QUJLQUtzQVVFQVRnUkFJQU5CZ0FacUlnSkJEQkFSSUFKQkF4QVJJQUpCMlFBZ0FTZ0NyQUVRWFFzQ1FDQUJLQUtvQVVFQVNBMEFJQUVvQW1BRVFDQURRWUFHYWlJQ1FlRUFFQkVnQWlBQkx3R29BUkFxREFFTElBTkJnQVpxSWdKQkNCQVJJQUpCMlFBZ0FTZ0NxQUVRWFFzZ0FTZ0NtQUZCQUU0RVFFRUFJUUlnQVMwQWJrRUJjVVVFUUNBQktBSTRRUUJISVFJTElBTkJnQVpxSWdSQkRCQVJJQVFnQWhBUklBRW9BcHdCSWdKQkFFNEVRQ0FEUVlBR2FrSGFBQ0FDRUYwTElBTkJnQVpxUWRrQUlBRW9BcGdCRUYwTElBRW9BcUFCUVFCT0JFQWdBMEdBQm1vaUFrRU1FQkVnQWtFQ0VCRWdBa0haQUNBQktBS2dBUkJkQ3lBQktBS1FBVUVBVGdSQUlBTkJnQVpxSWdKQkRCQVJJQUpCQlJBUklBSkIyUUFnQVNnQ2tBRVFYUXNnQVNnQ2xBRkJBRTRFUUNBRFFZQUdhaUlDUVF3UUVTQUNRUVVRRVNBQ1Fka0FJQUVvQXBRQkVGMExRUUFoQWdKQUEwQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQWlBTFRnUkFRUUFoQWlBQktBS3NBaUlFUVFBZ0JFRUFTaHNoQkFOQUlBSWdCRVlOQWlBQ1FSUnNJUVlnQWtFQmFpRUNJQVlnRFdvb0FoQkZEUUFMUWRXREFVR3UvQUJCL2ZvQlFaUTRFQUFBQ3lBQ0lBSWdDV29pQmkwQUFDSUZRUUowUVlDNEFXb3RBQUFpQjJvaEJBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQlVIWUFHc09JQkFTR2hFU0doRVNHaG9hR2hvYUdob2FCQVFCQXdJYUdnd01CUVVGQlFVRkFBc0NRQ0FGUVFGckRoVUpDZ29MR2cwSEdnZ0lHaG9hQmhvYUR4b2FHZzRBQ3lBRlFTSnJJZ2hCSDBzTkdFRUJJQWgwSWdwQndPRUJjUTBTSUFwQkJYRkZCRUFnQ0VFZlJ3MFpJQVlvQUFGQk1FY05HaUFCSUFNb0FvUUdJQU1vQXBnR0VETWdBMEdBQm1wQjZRRVFFU0FFSVFJTUl3c2dCaThBQVNFQ0lBTkNxSUNBZ0hBM0ExQWdBMEhjQldvZ0JDQURRZEFBYWhBbkJFQUNRQ0FES0FMb0JTSUVRUUJJQkVBZ0F5Z0NtQVloQkF3QkN5QURJQVEyQXBnR0N5QUJJQU1vQW9RR0lBUVFNeUFEUVlBR2FpQUZRUUZxSUFJUVhTQUJJQWtnQ3lBREtBTGtCU0FEUVpnR2FoQ2tBaUVDRENNTElBRWdBeWdDaEFZZ0F5Z0NtQVlRTXlBRFFZQUdhaUFGSUFJUVhTQUVJUUlNSWdzZ0JpZ0FBU0VGSUFRaEJnd1dDeUFHS0FBQklRZEI3UUFoQlF3VUN5QUdLQUFCSVFkQjdBQWhCUXdUQ3lBQklBWW9BQUVnQTBHY0JtcEJBQkRIQXlFSElBTW9BdHdGSUFNb0F1QUZJQVFnQnhER0F3UkFJQUVnQjBGL0VHa2FJQU5CZ0FacVFRNFFFU0FFSVFJTUh3c2dBMExyZ0lDQWNEY0RZQ0FEUWR3RmFpQUVJQU5CNEFCcUVDZEZEUklnQXlnQzZBVWhDQ0FES0FMY0JTQURLQUxnQlNBREtBTGtCU0lHSUFjUXhnTkZEUklnQ0VFQVRnUkFJQU1nQ0RZQ21BWUxJQUVnQjBGL0VHa2FJQVZCQTNNaEJTQURLQUwwQlNFSERCd0xJQVl0QUFraENDQUdLQUFCSVFjZ0FTQUdLQUFGSUFOQm5BWnFRUUFReHdNaUFrRUFTQTBQSUFJZ0FTZ0NyQUpPRFE4Z0FTQURLQUtFQmlBREtBS1lCaEF6SUFFZ0FTZ0MxQUlpQmtFQmFqWUMxQUlnQVNnQ3pBSWdCa0VFZEdvaUJrRUVOZ0lFSUFZZ0JUWUNBQ0FES0FLRUJpRUtJQVlnQWpZQ0RDQUdJQXBCQldvMkFnZ2dBMEdBQm1vaUJpQUZFQkVnQmlBSEVCMGdCaUFOSUFKQkZHeHFJZ0lvQWd3Z0F5Z0NoQVpyRUIwZ0FpZ0NERUYvUmdSQUlBQWdBaUFES0FLRUJrRUVhMEVFRU9nQ1JRMGRDeUFEUVlBR2FpQUlFQkVnQkNFQ0RCMExJQU5DcVlDQWdIQTNBM0FnQTBIY0JXb2dCQ0FEUWZBQWFoQW5SUTBUSUFRaEFpQURLQUxvQlNJRVFRQklEUndnQXlBRU5nS1lCZ3djQ3lBRFFxdUJnSUJ3TndPZ0FTQURRZHdGYWlBRUlBTkJvQUZxRUNjRVFBSkFJQU1vQXVnRklnSkJBRWdFUUNBREtBS1lCaUVDREFFTElBTWdBallDbUFZTElBRWdBeWdDaEFZZ0FoQXpJQU5CZ0FacVFmTUJFQkVNR0FzZ0EwRi9OZ0tZQVNBRFFxeUJnSUNRelJvM0E1QUJJQU5CM0FWcUlBUWdBMEdRQVdvUUowVU5BQUpBSUFNb0F1Z0ZJZ1ZCQUVnRVFDQURLQUtZQmlFRkRBRUxJQU1nQlRZQ21BWUxJQUVnQXlnQ2hBWWdCUkF6SUFOQmdBWnFRZk1CRUJFZ0F5Z0M3QVZCQTNNaEJRd1lDeUFEUXVuVWdZQndOd09BQVNBRFFkd0ZhaUFFSUFOQmdBRnFFQ2RGRFJFZ0JVRUtSaUVLREEwTEFrQWdCaWdBQVNJR1FZQ0FnSUI0Y2tHQWdJQ0FlRVlOQUNBRFFveUJnSUJ3TndQZ0FTQURRZHdGYWlBRUlBTkI0QUZxRUNkRkRRQWdBeWdDNkFVaUFrRUFUZ1JBSUFNZ0FqWUNtQVlMSUFOQ2pvQ0FnSEEzQTlBQklBTkIzQVZxSUFNb0F1UUZJQU5CMEFGcUVDY0VRQ0FES0FMb0JTSUNRUUJJRFJjZ0F5QUNOZ0tZQmd3WEN5QUJJQU1vQW9RR0lBTW9BcGdHRURNZ0EwR0FCbXBCQUNBR2F4REZBd3dXQ3lBRFFvNkFnSUJ3TndQQUFTQURRZHdGYWlBRUlBTkJ3QUZxRUNjRVFDQURLQUxvQlNJQ1FRQklEUllnQXlBQ05nS1lCZ3dXQ3lBRFF1blVnWUJ3TndPd0FTQURRZHdGYWlBRUlBTkJzQUZxRUNjRVFDQUdRUUJISVFvTURRc2dBU0FES0FLRUJpQURLQUtZQmhBeklBTkJnQVpxSUFZUXhRTWdCQ0VDREJrTElBWW9BQUVpQWtIL0FVb05EeUFCSUFNb0FvUUdJQU1vQXBnR0VETWdBMEdBQm1vaUJpQUZRY01BYTBIL0FYRVFFU0FHSUFKQi93RnhFQkVnQkNFQ0RCZ0xJQVlvQUFFaEFpQURRbzZBZ0lCd053UHdBU0FEUWR3RmFpQUVJQU5COEFGcUVDY0VRQ0FBSUFJUUV5QURLQUxvQlNJQ1FRQklEUlFnQXlBQ05nS1lCZ3dVQ3lBQ1FTOUhEUTRnQVNBREtBS0VCaUFES0FLWUJoQXpJQU5CZ0FacVFjRUJFQkVnQkNFQ0RCY0xJQU5DeVlDQWdIQTNBNmdDSUFOQzJMYjVnbkEzQTZBQ0lBTkIzQVZxSUFRaUFpQURRYUFDYWhBbkRSWWdBMEYvTmdLWUFpQURRb0dFa0lDUUNUY0RrQUlnQTBIY0JXb2dBaUFEUVpBQ2FoQW5EUllnQTBGL05nS0lBaUFEUW9hT3FNaVFDVGNEZ0FJZ0EwSGNCV29nQWlBRFFZQUNhaEFuRFJZTURRc2dBMEtPZ0lDQWNEY0Q4QUlnQTBIY0JXb2dCQ0FEUWZBQ2FoQW5CRUFnQXlnQzZBVWlBa0VBU0EwU0lBTWdBallDbUFZTUVnc2dBMEtvZ0lDQWNEY0Q0QUlnQTBIY0JXb2dCQ0FEUWVBQ2FoQW5CRUFDUUNBREtBTG9CU0lDUVFCSUJFQWdBeWdDbUFZaEFnd0JDeUFESUFJMkFwZ0dDeUFCSUFNb0FvUUdJQUlRTXlBRFFZQUdha0VwRUJFTUVnc2dBMExwMUlHQWNEY0QwQUpCQUNFS0lBTkIzQVZxSUFRZ0EwSFFBbW9RSncwSUlBTkNxNEdBZ0hBM0E4QUNJQU5CM0FWcUlBUWdBMEhBQW1vUUp3UkFBa0FnQXlnQzZBVWlBa0VBU0FSQUlBTW9BcGdHSVFJTUFRc2dBeUFDTmdLWUJnc2dBU0FES0FLRUJpQUNFRE1nQTBHQUJtcEI4Z0VRRVF3U0N5QURRWDgyQXJnQ0lBTkNySUdBZ0pETkdqY0RzQUlnQTBIY0JXb2dCQ0FEUWJBQ2FoQW5SUTBNQWtBZ0F5Z0M2QVVpQlVFQVNBUkFJQU1vQXBnR0lRVU1BUXNnQXlBRk5nS1lCZ3NnQVNBREtBS0VCaUFGRURNZ0EwR0FCbXBCOGdFUUVTQURLQUxzQlVFRGN5RUZEQklMSUFOQmZ6WUNpQU1nQTBMRDlvQ0E0QUUzQTRBRElBTkIzQVZxSUFRZ0EwR0FBMm9RSjBVTkN3SkFJQU1vQXVnRklnSkJBRWdFUUNBREtBS1lCaUVDREFFTElBTWdBallDbUFZTElBRWdBeWdDaEFZZ0FoQXpJQU5CZ0FacUlnSWdBeTBBN0FVUUVTQUNJQU1vQXZ3RkVCME1FQXNnQTBGL05nSzRBeUFEUXRtNC9ZSndOd093QXlBRFFkd0ZhaUFFSUFOQnNBTnFFQ2RGRFFvZ0F5Z0M2QVVpQWtFQVRnUkFJQU1nQWpZQ21BWUxJQU5Dam9DQWdIQTNBNkFESUFNb0F1d0ZJZ1ZCQVdvaEJnSkFJQU5CM0FWcUlBTW9BdVFGSWdJZ0EwR2dBMm9RSndSL0lBTW9BdWdGSWdKQkFFNEVRQ0FESUFJMkFwZ0dDeUFESUFNb0F2QUZOZ0tVQTBGL0lRUWdBMEYvTmdLWUF5QURJQVZCQVdzMkFwQURJQU5CM0FWcUlBTW9BdVFGSWdJZ0EwR1FBMm9RSjBVTkFTQURLQUxrQlNFQ0lBTW9BdWdGQlVGL0N5RUVJQVloQlFzZ0FTQURLQUtFQmlBREtBS1lCaEF6SUFOQmdBWnFJQVVnQXlnQzhBVVFYU0FFUVFCSURSTWdBeUFFTmdLWUJnd1RDeUFHTHdBQklnSkIvd0ZMRFFrZ0EwS09nSUNBY0RjQ3pBUWdBeUFDTmdMSUJDQURRcENqZ29DUUN6Y0R3QVFDUUNBRFFkd0ZhaUFFSUFOQndBUnFFQ2RGQkVBZ0EwS09nSUNBY0RjRHNBUWdBeUFDTmdLc0JDQURRZGtBTmdLb0JDQURRbzZmZ29DUUFqY0RvQVFnQTBIY0JXb2dCQ0FEUWFBRWFoQW5SUTBCQ3dKQUlBTW9BdWdGSWdWQkFFZ0VRQ0FES0FLWUJpRUZEQUVMSUFNZ0JUWUNtQVlMSUFFZ0F5Z0NoQVlnQlJBeklBTkJnQVpxSWdaQmt3RkJrd0ZCa2dFZ0F5Z0M3QVVpQkVHUkFVWWJJQVJCandGR0d4QVJJQVlnQWtIL0FYRVFFUXdQQ3lBRFFvNkFnSUJ3TndLVUJDQURJQUkyQXBBRUlBTkNrWUNBZ0pBTE53T0lCQ0FEUW9TQWdJRFFFemNEZ0FRZ0EwSGNCV29nQkNBRFFZQUVhaEFuQkVBQ1FDQURLQUxvQlNJRlFRQklCRUFnQXlnQ21BWWhCUXdCQ3lBRElBVTJBcGdHQ3lBQklBTW9Bb1FHSUFVUU13SkFJQU1vQXZ3RlFTOUdCRUFnQTBHQUJtcEJ3UUVRRVF3QkN5QURRWUFHYWlJRVFRUVFFU0FFSUFNb0F2d0ZFQjBMSUFOQmdBWnFJZ1JCbEFFUUVTQUVJQUpCL3dGeEVCRU1Ed3NnQTBLT2dJQ0FjRGNDOUFNZ0F5QUNOZ0x3QXlBRFFwR0FnSUNRQ3pjRDZBTWdBMEtCZ0lDQTBCTTNBK0FESUFOQjNBVnFJQVFnQTBIZ0Eyb1FKd1JBQWtBZ0F5Z0M2QVVpQlVFQVNBUkFJQU1vQXBnR0lRVU1BUXNnQXlBRk5nS1lCZ3NnQVNBREtBS0VCaUFGRURNZ0EwR0FCbW9pQkNBREtBTDBCUkRGQXlBRVFaUUJFQkVnQkNBQ1FmOEJjUkFSREE4TElBTkNqb0NBZ0hBM0E5Z0RJQU1nQWpZQzFBTWdBMEhaQURZQzBBTWdBMEtkZ1lDQWtBSTNBOGdESUFOQzJMYjVnbkEzQThBRElBTkIzQVZxSUFRZ0EwSEFBMm9RSndSQUFrQWdBeWdDNkFVaUJVRUFTQVJBSUFNb0FwZ0dJUVVNQVFzZ0F5QUZOZ0tZQmdzZ0FTQURLQUtFQmlBRkVETWdBMEdBQm1vaUJDQURLQUxzQlNBREtBTHdCUkJkSUFSQmxBRVFFU0FFSUFKQi93RnhFQkVNRHdzZ0FTQURLQUtFQmlBREtBS1lCaEF6SUFOQmdBWnFRZGdBSUFJUVhTQUVJUUlNRWdzZ0JpOEFBU0VDSUFFZ0F5Z0NoQVlnQXlnQ21BWVFNeUFEUVlBR2FpQUZJQUlRWFNBRUlRSU1FUXNnQXlBR0x3QUJJZ0kyQXVRRUlBTkJmellDNkFRZ0F5QUZRUUZyTmdMZ0JDQURRZHdGYWlBRUlBTkI0QVJxRUNjRVFBSkFJQU1vQXVnRklnUkJBRWdFUUNBREtBS1lCaUVFREFFTElBTWdCRFlDbUFZTElBRWdBeWdDaEFZZ0JCQXpJQU5CZ0FacUlBVkJBV29nQWhCZERBMExJQUVnQXlnQ2hBWWdBeWdDbUFZUU15QURRWUFHYWlBRklBSVFYU0FFSVFJTUVBc2dBU0FKSUFzZ0JDQURRWmdHYWhDa0FpRUVEQVlMSUFFb0F0UUNJUXNnQVNnQ3pBSWhCa0VBSVFwQkFDRUpBMEFDUUNBS0lBdElCRUJCQXlFSUlBWW9BZ0FpQWtIcEFHdEJBMDhFUUNBQ1FlMEJSdzBDUVFFaENBc0NRQ0FCS0FLa0FpQUdLQUlNUVJSc2FpZ0NEQ0FHS0FJSUlnVnJJZ1JCZ0g5SUlBUWdDRUgvQUdwS2NrVUVRQ0FHUVFFMkFnUWdBa0h0QVVZRVFFSHNBU0VDSUFaQjdBRTJBZ0FNQWdzZ0JpQUNRWUVCYWlJQ05nSUFEQUVMSUFKQjZ3QkhJQVJCZ0lBQ2FrSC8vd05MY2cwQ0lBWkM3WUdBZ0NBM0FnQkJBaUVJUWUwQklRSUxJQVVnQXlnQ2dBWnFRUUZySUFJNkFBQWdCaWdDQkNJQ0lBTW9Bb0FHSUFWcWFpSUVJQVFnQ0dvZ0F5Z0NoQVlnQlNBSWFpQUNhbXNRbkFFZ0F5QURLQUtFQmlBSWF6WUNoQVpCQUNFRUlBRW9BcXdDSWdKQkFDQUNRUUJLR3lFSElBRW9BcVFDSVFJRFFDQUVJQWRHQkVBZ0FTZ0MxQUloQ3lBR0lRY2dDaUVFQTBBQ1FDQUxJQVJCQVdvaUJFd0VRRUVBSVFJZ0FTZ0M0QUlpQkVFQUlBUkJBRW9iSVFRRFFDQUNJQVJHRFFJZ0JTQUJLQUxZQWlBQ1FRTjBhaUlIS0FJQUlnMUpCRUFnQnlBTklBaHJOZ0lBQ3lBQ1FRRnFJUUlNQUFzQUN5QUhJZ0pCRUdvaEJ5QUNLQUlZSWcwZ0JVd05BU0FDSUEwZ0NHczJBaGdNQVFzTElBbEJBV29oQ1F3REN5QUZJQUlvQWd3aUMwZ0VRQ0FDSUFzZ0NHczJBZ3dMSUFKQkZHb2hBaUFFUVFGcUlRUU1BQXNBQ3dKQUlBbEZEUUFnQVNnQ3pBSWhBa0VBSVFVRFFDQUZJQXRPRFFFZ0FTZ0NwQUlnQWlnQ0RFRVViR29vQWd3Z0FpZ0NDQ0lFYXlFR0FrQUNRQUpBQWtBZ0FpZ0NCRUVCYXc0RUFBRURBZ01MSUFNb0FvQUdJQVJxSUFZNkFBQWdBU2dDMUFJaEN3d0NDeUFES0FLQUJpQUVhaUFHT3dBQURBRUxJQU1vQW9BR0lBUnFJQVkyQUFBTElBSkJFR29oQWlBRlFRRnFJUVVNQUFzQUN5QUFLQUlRSWdKQkVHb2dBU2dDekFJZ0FpZ0NCQkVBQUNBQlFRQTJBc3dDSUFBb0FoQWlBa0VRYWlBQktBS2tBaUFDS0FJRUVRQUFJQUZCQURZQ3BBSUNRQ0FCTFFCdVFRSnhEUUFnQVNnQzJBSkZEUUFnQVNnQ0FDZ0NFQ0VDSUFGQ0FEY0M5QUlnQVVJQU53TDhBaUFCSUFJMkFvZ0RJQUZCT3pZQ2hBTWdBVUgwQW1vaEJTQUJLQUx3QWlFSFFRQWhBa0VBSVFnRFFDQUNJQUVvQXVBQ1RnMEJBa0FnQVNnQzJBSWdBa0VEZEdvaUJpZ0NCQ0lFUVFCSUlBUWdCMFp5RFFBZ0JpZ0NBQ0lHSUFocklncEJBRWdOQUFKQUlBUWdCMnNpQ0VFQmFpSUhRUVJMSUFwQk1rdHlSUVJBSUFVZ0J5QUtRUVZzYWtFQmFrSC9BWEVRRVF3QkN5QUZRUUFRRVNBRklBb1E1Z1FnQlNBSVFRRjBJQWhCSDNWekVPWUVDeUFHSVFnZ0JDRUhDeUFDUVFGcUlRSU1BQXNBQ3lBQUtBSVFJZ0pCRUdvZ0FTZ0MyQUlnQWlnQ0JCRUFBQ0FCUVFBMkF0Z0NJQXdROWdFZ0RDQURLUU9RQmpjQ0VDQU1JQU1wQTRnR053SUlJQXdnQXlrRGdBWTNBZ0FnQVVFQk5nS2dBaUFCS0FLTUFnMFNJQUVvQW9BQ0lRY2dBeUFCS0FLRUFpSUVOZ0xjQlNBRElBQWdCRUVCZEJBcElnWTJBdVFGSUFaRkRSNUJBQ0VDSUFSQkFDQUVRUUJLR3lFRUEwQWdBaUFFUmtVRVFDQUdJQUpCQVhScVFmLy9BenNCQUNBQ1FRRnFJUUlNQVFzTElBTkJBRFlDOEFVZ0EwSUFOd0xvQlNBRFFRQTJBdUFGQWtBZ0FDQURRZHdGYWtFQVFRQkJBQkREQVEwQUEwQUNRQUpBQWtBZ0F5Z0M3QVVpQWtFQVNnUkFJQU1nQWtFQmF5SUNOZ0xzQlNBSElBTW9BdWdGSUFKQkFuUnFLQUlBSWdScUlnZ3RBQUFpQWtFS2FrSC9BWEZCQzBrRVFFSGdrd0VoQlF3RUN5QUVJQUpCRDJvZ0FpQUNRYk1CU3hzaUJrRUNkQ0lLUVlDNEFXb3RBQUJxSWdrZ0F5Z0MzQVZLQkVCQis1SUJJUVVNQkFzZ0F5Z0M1QVVnQkVFQmRHb3ZBUUFoRENBS1FZRzRBV290QUFBaEJRSkFJQVpCSVdzaUMwRVFTMEVCSUF0MFFiK0FCSEZGY2tVRVFDQUlMd0FCSUFWcUlRVU1BUXNnQmtIOUFXdEJBMHNOQUNBQ0lBVnFRZTRCYXlFRkN5QUZJQXhLQkVCQndaTUJJUVVNQkFzQ1FDQUtRWUs0QVdvdEFBQWdCV3NnREdvaUJpQURLQUxnQlV3TkFDQURJQVkyQXVBRklBWkIvdjhEVEEwQVFhT1RBU0VGREFRTEFrQUNRQUpBQWtBQ1FBSkFBa0FnQWtIcEFHc09Ed0lDQVFJREN3a0pDUVFHQkFVRkJRQUxJQUpCSTJzaUJVRU5TdzBIUVFFZ0JYUkI1ZkFBY1EwS0RBY0xJQVFnQ0NnQUFXcEJBV29oQ1F3SEN5QUFJQU5CM0FWcUlBUWdDQ2dBQVdwQkFXb2dBaUFHRU1NQlJRMEdEQWtMSUFBZ0EwSGNCV29nQkNBSUtBQUJha0VCYWlBQ0lBWkJBV29Rd3dGRkRRVU1DQXNnQUNBRFFkd0ZhaUFFSUFnb0FBVnFRUVZxSUFJZ0JrRUJhaEREQVVVTkJBd0hDeUFBSUFOQjNBVnFJQVFnQ0NnQUJXcEJCV29nQWlBR1FRSnFFTU1CUlEwRERBWUxJQUFnQTBIY0JXb2dCQ0FJS0FBRmFrRUZhaUFDSUFaQkFXc1F3d0VOQlF3Q0N5QUFLQUlRSWdKQkVHb2dBeWdDNUFVZ0FpZ0NCQkVBQUNBQUtBSVFJZ0pCRUdvZ0F5Z0M2QVVnQWlnQ0JCRUFBRUhBQUVIWUFDQUJMUUJ1UVFKeElnUWJJZ2dnQVNnQ3VBSkJBM1JxSVFJZ0F5Z0M0QVVoQ2lBQUFuOGdCQVJBSUFJZ0FTZ0NSRVVOQVJvTElBRW9BbndnQVNnQ2lBRnFRUVIwSUFKcUN5SUhJQUVvQXNBQ1FRTjBhaUlFSUFFb0FvUUNhaEJmSWdaRkRTTWdCa0VCTmdJQUlBWWdCQ0FHYWlJRU5nSVVJQVlnQVNnQ2hBSWlCVFlDR0NBRUlBRW9Bb0FDSUFVUUh4b2dBQ2dDRUNJRVFSQnFJQUVvQW9BQ0lBUW9BZ1FSQUFBZ0FVRUFOZ0tBQWlBR0lBRW9BbkEyQWh3Z0FTZ0NmQ0lFSUFFb0FvZ0JJZ1ZxUVFCS0JFQUNRQUpBSUFFdEFHNUJBbkZGRFFBZ0FTZ0NSQTBBUVFBaEJRTkFJQVFnQlV3RVFFRUFJUVVEUUNBQktBS0lBU0FGVEFSQVFRQWhCUU5BSUFVZ0FTZ0N3QUpPRFFZZ0FDQUZRUU4wSWdJZ0FTZ0N5QUpxS0FJRUVCTWdBU2dDeUFJZ0FtcEJBRFlDQkNBRlFRRnFJUVVNQUFzQUJTQUFJQUVvQW9BQklBVkJCSFJxS0FJQUVCTWdCVUVCYWlFRkRBRUxBQXNBQlNBQUlBRW9BblFnQlVFRWRHb29BZ0FRRXlBRlFRRnFJUVVnQVNnQ2ZDRUVEQUVMQUFzQUN5QUdJQUlnQm1vaUFqWUNJQ0FDSUFFb0FvQUJJQVZCQkhRUUh4b2dCaWdDSUNBQktBS0lBVUVFZEdvZ0FTZ0NkQ0FCS0FKOFFRUjBFQjhhQ3lBR0lBRW9Bbnc3QVNvZ0JpQUJLQUtJQVRzQktDQUdJQUVvQW93Qk93RXNJQUFvQWhBaUFrRVFhaUFCS0FLQUFTQUNLQUlFRVFBQUlBQW9BaEFpQWtFUWFpQUJLQUowSUFJb0FnUVJBQUFMSUFZZ0FTZ0N1QUlpQWpZQ09DQUNCRUFnQmlBR0lBaHFJZ1EyQWpRZ0JDQUJLQUswQWlBQ1FRTjBFQjhhQ3lBQUtBSVFJZ0pCRUdvZ0FTZ0N0QUlnQWlnQ0JCRUFBQ0FCUVFBMkFyUUNJQVlnQ2pzQkxnSkFJQUV0QUc1QkFuRUVRQ0FBSUFFb0F1d0NFQk1nQVVIMEFtb1E5Z0VNQVFzZ0JpQUdMd0FSUVlBSWNqc0FFU0FHSUFFb0F1d0NOZ0pBSUFZZ0FTZ0M4QUkyQWtRZ0JpQUFJQUVvQXZRQ0lBRW9BdmdDRUlrQ0lnSTJBbEFnQWtVRVFDQUdJQUVvQXZRQ05nSlFDeUFHSUFFb0F2Z0NOZ0pNSUFZZ0FTZ0NqQU0yQWxRZ0JpQUJLQUtRQXpZQ1NBc2dBU2dDekFFaUFpQUJRZEFCYWtjRVFDQUFLQUlRSWdSQkVHb2dBaUFFS0FJRUVRQUFDeUFHSUFFb0FzQUNJZ0kyQWp3Z0FnUkFJQVlnQmlBSGFpSUVOZ0lrSUFRZ0FTZ0N5QUlnQWtFRGRCQWZHZ3NnQUNnQ0VDSUNRUkJxSUFFb0FzZ0NJQUlvQWdRUkFBQWdBVUVBTmdMSUFpQUdJQVl2QUJGQmZuRWdBUzhCTkVFQmNYSWlBanNBRVNBR0lBRXZBVGhCQVhSQkFuRWdBa0Y5Y1hJaUFqc0FFU0FHSUFFdEFHNDZBQkFnQmlBQkx3RmdRUUowUVFSeElBSkJlM0Z5SWdJN0FCRWdCaUFDUVU5eElBRXZBV3hCQkhSQk1IRnlJZ0k3QUJGQkNDRUZJQVlnQVNnQ3RBRkJBRWdFZnlBQktBSzRBVUVBUjBFRGRBVkJDQXNnQWtGM2NYSWlBanNBRVNBR0lBRXZBVkJCQm5SQndBQnhJQUpCdjM5eGNpSUNPd0FSSUFZZ0FrSC9mbkVnQVM4QlZFRUhkRUdBQVhGeUlnSTdBQkVnQmlBQ1FmOTljU0FCTHdGWVFRaDBRWUFDY1hJaUFqc0FFU0FHSUFKQi8zdHhJQUV2QVZ4QkNYUkJnQVJ4Y2lJQ093QVJJQVlnQWtILzd3TnhJQUV2QVdoQkMzUkJnQkJ4Y2pzQUVTQUFJQUFvQWdCQkFXbzJBZ0FnQmlBQU5nSXdJQUFvQWhBaEFpQUdRUUU2QUFRZ0FpZ0NVQ0lFSUFaQkNHb2lDRFlDQkNBR0lBSkIwQUJxTmdJTUlBWWdCRFlDQ0NBQ0lBZzJBbEFnQVNnQ0JBUkFJQUVvQWhnaUFpQUJLQUljSWdRMkFnUWdCQ0FDTmdJQUlBRkNBRGNDR0FzZ0FDZ0NFQ0lBUVJCcUlBRWdBQ2dDQkJFQUFDQUdyVUtBZ0lDQVlJUU1KQXNDUUFKQUFrQWdBa0hxQVdzT0JBSUNBUUFEQ3lBRUlBZ3VBQUZxUVFGcUlRa01BZ3NnQkVFQmFpSUVJQVFnQjJvc0FBQnFJUWtNQVFzZ0FDQURRZHdGYWlBRVFRRnFJZ1FnQkNBSGFpd0FBR29nQWlBR0VNTUJEUU1MSUFBZ0EwSGNCV29nQ1NBQ0lBWVF3d0ZGRFFFTUFnc0xJQU1nQkRZQzFBVWdBeUFDTmdMUUJTQUFJQVVnQTBIUUJXb1FSZ3NnQUNnQ0VDSUNRUkJxSUFNb0F1UUZJQUlvQWdRUkFBQWdBQ2dDRUNJQ1FSQnFJQU1vQXVnRklBSW9BZ1FSQUFBTUhnc2dCa0VRYWlFR0lBcEJBV29oQ2d3QUN3QUxRWVVwUWE3OEFFR3M5d0ZCbERnUUFBQUxJQU1vQXVnRklnUkJBRTRFUUNBRElBUTJBcGdHQ3lBREtBTDBCU0VGSUFNb0F1UUZJUVlnQXlnQzdBVkI2UUJySUFwR0RRRWdBU0FGUVg4UWFSb2dCaUVDREF3TElBUWhCZ3dKQ3lBRFFYODJBdGdGSUFFZ0JTQURRWndHYWlBRFFkZ0ZhaERIQXlFSElBTW9BdHdGSUFNb0F1QUZJQVlnQnhER0F3UkFJQUVnQjBGL0VHa2FJQVloQWd3TEN5QURLQUtjQmlJRVFTaHJJZ2hCQjB0QkFTQUlkRUdEQVhGRmNrVUVRQ0FCSUFkQmZ4QnBHaUFCSUFNb0FvUUdJQU1vQXBnR0VETWdBMEdBQm1vZ0JFSC9BWEVRRVNBQklBa2dDeUFHSUFOQm1BWnFFS1FDSVFJTUN3dEI2d0FoQlF3SUN3SkFJQVZCa0FGclFRSlBCRUFnQlVHWEFVWU5BU0FGUWJZQlJ3UkFJQVZCd2dGSERRTWdBeUFHS0FBQk5nS1lCaUFFSVFJTURBc2dCaWdBQVNJQ1FRQklEUU1nQWlBQktBS3NBazROQXlBTklBSkJGR3hxSWdnb0FneEJmMGNOQkNBSUlBTW9Bb1FHTmdJTUlBZ29BaEFoQndOQUlBY2lBZ1JBSUFnb0Fnd2dBaWdDQkNJRmF5RUdJQUlvQWdBaEJ3SkFBa0FDUUFKQUlBSW9BZ2hCQVdzT0JBSUJBd0FEQ3lBREtBS0FCaUFGYWlBR05nQUFEQUlMSUFaQmdJQUNha0dBZ0FSUERRa2dBeWdDZ0FZZ0JXb2dCanNBQUF3QkN5QUdRWUFCYWtHQUFrOE5DU0FES0FLQUJpQUZhaUFHT2dBQUN5QUFLQUlRSWdaQkVHb2dBaUFHS0FJRUVRQUFEQUVMQ3lBSVFRQTJBaEFnQkNFQ0RBc0xJQU5Dam9DQWdIQTNBNmdGSUFOQzJiajlnbkEzQTZBRklBTkIzQVZxSUFRZ0EwR2dCV29RSndSQUlBTW9BdWdGSWdKQkFFNEVRQ0FESUFJMkFwZ0dDeUFESUFNb0F2QUZJZ1kyQXBRRklBTkJmellDbUFVZ0F5QURLQUxzQlNJRVFRRnJOZ0tRQlNBRFFkd0ZhaUFES0FMa0JTSUNJQU5Ca0FWcUVDY0VRQ0FES0FMb0JTSUNRUUJPQkVBZ0F5QUNOZ0tZQmdzZ0JFRUJhaUVFSUFNb0F1UUZJUUlMSUFFZ0F5Z0NoQVlnQXlnQ21BWVFNeUFEUVlBR2FpSUhJQVZCQW10Qi93RnhFQkVnQnlBRUlBWVFYUXdMQ3lBRFFvNkFnSUJ3TndPSUJTQURRcGlBZ0lDdzZBNDNBNEFGSUFOQjNBVnFJQVFnQTBHQUJXb1FKd1JBQWtBZ0F5Z0M2QVVpQWtFQVNBUkFJQU1vQXBnR0lRSU1BUXNnQXlBQ05nS1lCZ3NnQVNBREtBS0VCaUFDRURNZ0EwR0FCbW9pQWlBRlFRSnJRZjhCY1JBUklBSWdBeTBBN0FVUUVTQUNJQU1vQXZ3RkVCME1Cd3NnQTBLT2dJQ0FjRGNEK0FRZ0EwS1pnSUNBa0FrM0EvQUVJQU5CM0FWcUlBUWdBMEh3QkdvUUowVU5BUUpBSUFNb0F1Z0ZJZ0pCQUVnRVFDQURLQUtZQmlFQ0RBRUxJQU1nQWpZQ21BWUxJQUVnQXlnQ2hBWWdBaEF6SUFOQmdBWnFJZ0lnQlVFQ2EwSC9BWEVRRVNBQ1Fja0FFQkVNQmdzZ0EwRi9OZ0xJQlNBRFFvU0FnSUN3bGV2VXFuODNBOEFGSUFOQjNBVnFJQVFnQTBIQUJXb1FKMFVOQUNBREtBTG9CU0lJUVFCT0JFQWdBeUFJTmdLWUJnc2dBeWdDN0FVaENDQURLQUw4QlNJRlFjVUFSZ1IvUWZRQkJTQUZRUnRIRFFGQjlRRUxJUW9nQ0VGOWNVR3BBVVlFUUNBQklBTW9Bb1FHSUFNb0FwZ0dFRE1nQTBHQUJtb2dDaEFSSUFBZ0F5Z0MvQVVRRXd3R0N5QURRdW1BZ0lCd053T3dCU0FEUWR3RmFpQURLQUxrQlNBRFFiQUZhaEFuUlEwQUFrQWdBeWdDNkFVaUJVRUFTQVJBSUFNb0FwZ0dJUVVNQVFzZ0F5QUZOZ0tZQmdzZ0FTQURLQUtFQmlBRkVETWdBMEdBQm1vZ0NoQVJJQUFnQXlnQy9BVVFFMEhxQUNFRkRBWUxJQUVnQXlnQ2hBWWdBeWdDbUFZUU15QURRWUFHYWlBR0lBY1FjaUFFSVFJTUNBdEJoU2xCcnZ3QVFlUDFBVUdVT0JBQUFBdEJ2WXdCUWE3OEFFSGw5UUZCbERnUUFBQUxRY1hkQUVHdS9BQkI4UFVCUVpRNEVBQUFDMEd3M1FCQnJ2d0FRZlQxQVVHVU9CQUFBQXNnQXlnQzVBVWhBZ3dEQ3lBREtBTDBCU0VISUFNb0F1UUZJUVlMSUFFZ0F5Z0NoQVlnQXlnQ21BWVFNeUFGUWVzQVJ5SUtSUVJBSUFFZ0NTQUxJQVlnQTBHWUJtb1FwQUloQmdzZ0IwRUFTQTBDSUFjZ0FTZ0NyQUpPRFFJZ0FTQUJLQUxVQWlJRVFRRnFOZ0xVQWlBQktBTE1BaUFFUVFSMGFpSUVRUVEyQWdRZ0JDQUZOZ0lBSUFNb0FvUUdJUTRnQkNBSE5nSU1JQVFnRGtFQmFqWUNDQUpBSUEwZ0IwRVViR29pQ0NnQ0RDSUhRWDlHQkVBZ0NDZ0NDQ0FDUVg5emFpSUNRZjhBU2lBRlFla0FhMEVDUzNKRkJFQWdCRUVCTmdJRUlBUWdCVUdCQVdvaUFqWUNBQ0FEUVlBR2FpSUVJQUpCL3dGeEVCRWdCRUVBRUJFZ0JpRUNJQUFnQ0NBREtBS0VCa0VCYTBFQkVPZ0NEUVFNQXdzZ0NpQUNRZi8vQVVweURRRWdCRUVDTmdJRUlBUkI3UUUyQWdBZ0EwR0FCbW9pQWtIdEFSQVJJQUpCQUJBcUlBWWhBaUFBSUFnZ0F5Z0NoQVpCQW10QkFoRG9BZzBEREFJTElBY2dEa0YvYzJvaUFrR0FBV3BCL3dGTElBVkI2UUJyUVFKTGNrVUVRQ0FFUVFFMkFnUWdCQ0FGUVlFQmFpSUVOZ0lBSUFOQmdBWnFJZ1VnQkVIL0FYRVFFU0FGSUFKQi93RnhFQkVnQmlFQ0RBTUxJQW9nQWtHQWdBSnFRZi8vQTB0eURRQWdCRUVDTmdJRUlBUkI3UUUyQWdBZ0EwR0FCbW9pQkVIdEFSQVJJQVFnQWtILy93TnhFQ29nQmlFQ0RBSUxJQU5CZ0FacUlnSWdCVUgvQVhFUUVTQUNJQWdvQWd3Z0F5Z0NoQVpyRUIwZ0JpRUNJQWdvQWd4QmYwY05BU0FBSUFnZ0F5Z0NoQVpCQkd0QkJCRG9BZzBCQ3dzZ0F5Z0NnQVlpQWtVTkRTQURLQUtVQmlBQ1FRQWdBeWdDa0FZUkFRQWFEQTBMUVlVcFFhNzhBRUhsOWdGQmxEZ1FBQUFMSUFBUWZBd0xDeUFKS0FBQklRWWdBU0FCS0FMY0FrRUJhallDM0FJTUJnc2dBMEYvTmdKSUlBTkM2ZFNCZ09BQk53TkFJQU5CM0FWcUlBZ2dBMEZBYXhBblJRMEZBa0FnQXlnQzlBVWlCMEVBU0EwQUlBY2dBU2dDckFKT0RRQWdBeWdDNkFVaEJDQURLQUxrQlNFS0lBTW9BdXdGSVJBZ0J5RUZBMEFnQVNnQ2dBSWhFU0FCS0FLa0FpRVNRUUFoQ3dOQUFrQWdDMEVVUmcwQUlCSWdCVUVVYkdvb0FnUWhBZ05BSUFJZ0VXb2lFeTBBQUNJRlFiWUJSaUFGUWNJQlJuSUVRQ0FDUVFWcUlRSU1BUVVnQlVIckFFY05BaUFMUVFGcUlRc2dFeWdBQVNFRkRBTUxBQXNBQ3dzZ0EwS09nSUNBY0RjRE9DQURJQkEyQWpRZ0EwRVJOZ0l3SUFOQjNBVnFJQUlnQTBFd2FoQW5CRUFnQXlnQzlBVWhCUXdCQ3dzZ0EwRi9OZ0lrSUFNZ0VEWUNJQ0FEUWR3RmFpQUNJQU5CSUdvUUowVU5CaUFCSUFFb0F0QUNRUUZxTmdMUUFpQUJJQWRCZnhCcEdpQUJJQU1vQXZRRklnSkJBUkJwR2lBRFFZQUdhaUlGSUJCQi93RnhFQkVnQlNBQ0VCMGdDaUVJSUFSQmYwWWdCQ0FHUm5JTkNDQUJJQUVvQXR3Q1FRRnFOZ0xjQWlBRFFZQUdhaUlDUWNJQkVCRWdBaUFFRUIwZ0JDRUdEQWdMUWFvcFFhNzhBRUhkOGdGQit6a1FBQUFMSUFFb0Fzd0JJQWt2QUFFaUIwRURkR3BCQkdvaEFnTkFJQUlvQWdBaUFrRUFTQTBISUFFb0FuUWdBa0VFZEdvaUJDZ0NCQ0FIUncwSElBUXRBQXhCQkhFRVFDQURRWUFHYWlJRlFlZ0FFQkVnQlNBQ1FmLy9BM0VRS2dzZ0JFRUlhaUVDREFBTEFBc2dBU2dDekFFZ0QwRURkR3BCQkdvaEFnTkFJQUlvQWdBaUFrRUFTQTBHSUFFb0FuUWdBa0VFZEdvaUJ5Z0NCQ0FQUncwR0lBRW9BcHdCSUFKSEJFQkI0UUFoQkNBRFFZQUdhaUlGSUFjb0FneEJBM1pCRDNGQkFXdEJBVTBFZnlBRFFZQUdhaUlFUVFNUUVTQUVJQWNvQWd4QkFYUkJDSFVRSFVIWkFBVkI0UUFMRUJFZ0JTQUNRZi8vQTNFUUtnc2dCMEVJYWlFQ0RBQUxBQXNDUUFKQUFrQWdCRUhwQUdzT0JnUUVBZ1FCQXdBTElBUkJNVVlFUUNBSkx3QUJJUUlnQVNBSkx3QURJZ1FRNVFRZ0EwR0FCbW9pQlVFeEVCRWdCU0FDRUNvZ0JTQUJLQUxNQVNBRVFRTjBhaThCQkVFQmFrSC8vd054RUNvTUJ3c2dCRUV5UndSQUlBUkJ6UUJIRFFVZ0NTZ0FBVVVOQnd3RkN5QUJJQWt2QUFFaUFoRGxCQ0FEUVlBR2FpSUVRVElRRVNBRUlBRW9Bc3dCSUFKQkEzUnFMd0VFUVFGcVFmLy9BM0VRS2d3R0N5QUJJQUVvQXRBQ1FRRnFOZ0xRQWlBSktBQUJJZ0pCQUVnTkJDQUNJQUVvQXF3Q1RnMEVJQUVvQXFRQ0lBSkJGR3hxSWdJb0FnUWhCQ0FEUXU2QWdJQndOd01BSUFOQjNBVnFJQVFnQXhBblJRMERJQUlnQWlnQ0FFRUJhellDQUF3RkN5QUJJQUVvQXRBQ1FRRnFOZ0xRQWdzZ0EwRi9OZ0tjQmlBRFFZQUdhaUFKSUE4UWNpQUJJQTBnRGlBSUlBTkJuQVpxRUtRQ0lnZ2dEazROQXlBREtBS2NCaUlDUVFCSUlBSWdCa1p5RFFNZ0FTQUJLQUxjQWtFQmFqWUMzQUlnQTBHQUJtb2lCRUhDQVJBUklBUWdBaEFkSUFJaEJnd0RDeUFCSUFFb0F0QUNRUUZxTmdMUUFnc2dBMEdBQm1vZ0NTQVBFSElNQVFzTFFZVXBRYTc4QUVHODhRRkIremtRQUFBTFFZT09BVUd1L0FCQmcvNEJRZjNMQUJBQUFBc2dBQ0FCRVAwQ1FvQ0FnSURnQUFzaEZDQURRYUFHYWlRQUlCUUx4dzBCQjM4Q1FBSkFBa0FDUUFKQUlBQW9BaEFpQTBGSFJ3UkFJQUJCUUdzb0FnQWhBU0FBUVlVQkVFcEZEUUVnQUNnQ09FRUJFSU1CUVVkSERRRUxRWDhoQmlBQVFRQkJBQ0FBS0FJWUlBQW9BaFFReEFGRkRRRU1BZ3NDUUFKQUFrQUNRQUpBQWtBZ0EwRXphZzREQUFJQkFnc2dBU2dDbEFNaUEwVU5BU0FBS0FJQUlRRkJmeUVHSUFBUUVnMEdBa0FDUUFKQUFrQWdBQ2dDRUNJQ1FUbHFEZ1FDQVFFQUFRc2dBRUVBUVFFUTdRSWhBQXdIQ3lBQVFZVUJFRXBGRFFFZ0FDZ0NPRUVCRUlNQlFVZEhEUUVMSUFCQkFFRUFJQUFvQWhnZ0FDZ0NGRUVCUVFBUStBRWhBQXdGQ3lBQUVCSU5CZ0pBQWtBZ0FrR3pmMFlOQUFKQUlBSkJRa2NFUUNBQ1FVdEdJQUpCVTBaeURRSWdBa0VxUndSQUlBSkIrd0JIRFFRZ0F5Z0NJQ0VFQTBBQ1FDQUFLQUlRSWdKQi9RQkdEUUFnQWtHRGYwWWdBa0VsYWtGUlMzSkZCRUFNRHd0QkFDRUNJQUVnQUNnQ0lCQVlJUVVDUUFKQUFrQWdBQkFTRFFBZ0FFSDVBQkJLUlEwQklBQVFFZzBBSUFBb0FoQWlBa0dEZjBZZ0FrRWxha0ZSUzNKRkJFQkJBQ0VDSUFCQjN2WUFRUUFRRmd3QkN5QUJJQUFvQWlBUUdDRUNJQUFRRWtVTkFnc2dBU0FGRUJNTURBc2dBU0FGRUJnaEFnc2dBQ0FESUFVZ0FrRUFFUGNCSVFjZ0FTQUZFQk1nQVNBQ0VCTWdCMFVORFNBQUtBSVFRU3hIRFFBZ0FCQVNSUTBCREEwTEN5QUFRZjBBRUN3TkN5QUFRZm9BRUVwRkRRSWdBQkRzQWlJQ1JRMExJQUVnQXlBQ0VPc0NJUVVnQVNBQ0VCTWdCVUVBU0EwTEEwQWdCQ0FES0FJZ1RnMERJQU1vQWh3Z0JFRVViR29pQVNBRk5nSUFJQUZCQVRZQ0NDQUVRUUZxSVFRTUFBc0FDeUFBUWZrQUVFb0VRQ0FBRUJJTkN5QUFLQUlRSWdKQmczOUdJQUpCSldwQlVVdHlSUVJBREEwTElBRWdBQ2dDSUJBWUlRSWdBQkFTRFFnZ0FCRHNBaUlFUlEwSUlBRWdBeUFFRU9zQ0lRVWdBU0FFRUJNZ0JVRUFTQTBJSUFBZ0EwSDlBQ0FDUVFFUTl3RWhBeUFCSUFJUUV5QURSUTBMSUFNZ0JUWUNBQXdDQ3lBQUVPd0NJZ0pGRFFvZ0FTQURJQUlRNndJaEJDQUJJQUlRRXlBRVFRQklEUW9nQVNBRFFTaHFRUVFnQTBFd2FpQURLQUlzUVFGcUVIZ05DaUFESUFNb0Fpd2lBVUVCYWpZQ0xDQURLQUlvSUFGQkFuUnFJQVEyQWdBTUFRc0NRQUpBQWtBQ1FDQUFLQUlRUVRscURnUUNBUUVBQVFzZ0FFRUFRUUlRN1FJaEFBd0tDeUFBUVlVQkVFcEZEUUVnQUNnQ09FRUJFSU1CUVVkSERRRUxJQUJCQUVFQUlBQW9BaGdnQUNnQ0ZFRUNRUUFRK0FFaEFBd0lDeUFBRUZZTkNTQUFRUllRb1FFZ0FDQUFRVUJySWdFb0FnQkIvQUJCQVJDZ0FVRUFTQTBKSUFCQnZRRVFFQ0FBUWZ3QUVCb2dBU2dDQUVFQUVCY2dBQ0FEUWZ3QVFSWkJBQkQzQVVVTkNRc2dBQkMzQVNFQURBWUxJQUJCQVNBQ1FRRVF6QU1oQUF3RkN5QUFRYzBnUVFBUUZnd0lDeUFCS0FLVUF5SUVSUTBBSUFBb0FqaEJBQkNEQVNJQlFTaEdJQUZCTGtaeURRQWdBQ2dDQUNFRFFYOGhCaUFBRUJJTkJTQUVLQUk0SVFVQ1FBSkFBa0FDUUFKQUlBQW9BaEFpQVVIL0FHb09Bd0FDQVFJTElBTWdBQ2tESUJBeElnSkZEUWtnQUJBU1JRMERJQU1nQWhBVERBc0xJQUFvQWlnRVFDQUFFT0lCREFzTFFSWWhBaUFESUFBb0FpQVFHQ0VCSUFBUUVnMEVJQUFnQkNBQlFSWVF5d01OQkNBRElBRVFFeUFBS0FJUVFTeEhEUUVnQUJBU0RRZ2dBQ2dDRUNFQkN5QUJRZnNBUndSQUlBRkJLa2NOQVNBQUVCSU5DQ0FBUWZrQUVFcEZCRUFnQUVIL2xBRkJBQkFXREFzTElBQVFFZzBJSUFBb0FoQWlBVUdEZjBZZ0FVRWxha0ZSUzNKRkJFQU1DZ3RCL1FBaEFpQURJQUFvQWlBUUdDRUJJQUFRRWcwRUlBQWdCQ0FCUWYwQUVNc0REUVFnQXlBQkVCTU1BUXNnQUJBU0RRY0RRQUpBSUFBb0FoQWlBVUg5QUVZTkFDQUJRWU4vUmlBQlFTVnFRVkZMY2tVRVFBd0xDMEVBSVFFZ0F5QUFLQUlnRUJnaEFpQUFFQklOQlFKQUlBQkIrUUFRU2dSQUlBQVFFZzBISUFBb0FoQWlBVUdEZjBZZ0FVRWxha0ZSUzNKRkJFQkJBQ0VCSUFCQjN2WUFRUUFRRmd3SUN5QURJQUFvQWlBUUdDRUJJQUFRRWtVTkFRd0hDeUFESUFJUUdDRUJDeUFBSUFRZ0FTQUNFTXNERFFVZ0F5QUJFQk1nQXlBQ0VCTWdBQ2dDRUVFc1J3MEFJQUFRRWtVTkFRd0pDd3NnQUVIOUFCQXNEUWNMSUFBUTdBSWlBa1VOQmdzZ0F5QUVJQUlRNndJaEFTQURJQUlRRXlBQlFRQklEUVVnQlNBRUtBSTRJZ01nQXlBRlNCc2hBd05BSUFNZ0JVWkZCRUFnQkNnQ05DQUZRUXhzYWlBQk5nSUlJQVZCQVdvaEJRd0JDd3NnQUJDM0FVVU5CQXdGQzBGL0lRWWdBRUVIRU9FQkRRUU1Bd3NnQXlBQkVCTWdBeUFDRUJNTUJRc2dBU0FDRUJNTUJBc2dBQTBCQzBFQUlRWUxJQVlQQ3lBQVFkNzJBRUVBRUJZTFFYOEx0UU1CQTM4akFFRkFhaUlCSkFBQ1FDQUFLQUlRUVlGL1J3MEFJQUVnQUNnQ0JEWUNFQ0FCSUFBb0FoUTJBaFFnQVNBQUtBSVlOZ0ljSUFFZ0FDZ0NNRFlDR0VHQmZ5RUNBMEFDUUNBQ1FZRi9SdzBBSUFBb0FqZ2hBaUFCSUFBb0FoZ2lBMEVCYWpZQ0JDQUJJQUlnQTJ0QkFtczJBZ0FnQVVFZ2FrRVVRYnM4SUFFUVRocEJmeUVDSUFBUUVnMENBa0FDUUFKQUlBQW9BaEFpQTBHQUFXb09XUUVCQVFFQkF3TURBd01EQXdNREF3TURBd01EQXdFQkF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBZ0VCQVFFREFRRUJBUU1CQVFNREFRRUJBd01CQXdNQkFRTURBUUVCQVFFQkFRTUJBUU1CQVFFQkFRRUJBQXNnQTBIOUFFWU5BU0FEUVR0SERRSWdBQkFTUlEwQkRBUUxJQUFvQWpCRkRRRUxBa0FDZnlBQlFTQnFRZDR2UVFzUVlVVUVRQ0FBS0FKQUlnSkJBVFlDUUVFQkRBRUxJQUZCSUdwQmljb0FRUW9RWVVVRVFDQUFLQUpBSVFKQkFnd0JDeUFBS0FJQUxRRG9BVVVOQVNBQlFTQnFRYlRaQUVFSkVHRU5BU0FBS0FKQUlRSkJCQXNoQXlBQ0lBSXRBRzRnQTNJNkFHNExJQUFvQWhBaEFnd0JDd3NnQUNBQlFSQnFFTzRDSVFJTElBRkJRR3NrQUNBQ0N6VUJBbjlCQVNFQ0lBQW9BZ0FpQVVIeEFHdEJBMGtnQVVFSVJuSWdBVUhUQUVaeUJIOUJBUVVnQUNnQ0RFSDRBSEZCSUVZTEMwd0JBMzhnQUNnQ0lFRVlhaUVCQWtBRFFDQUJJZ01vQWdBaUFrVU5BU0FDUVF4cUlRRWdBQ0FDUncwQUN5QURJQUFvQWd3MkFnQVBDMEdpaEFGQnJ2d0FRYVBsQWtHbDNnQVFBQUFMR0FFQmZ5QUJweWdDSUNJREJFQWdBQ0FESUFJUkFBQUxDeHNBSUFBUUd5QUFRZ0EzQWhBZ0FFSUFOd0lJSUFCQ0FEY0NBQXZFQkFFSWZ5QUFRZVFBYWlJSElBQkI0QUJxSWdNMkFnQWdBQ0FETmdKZ0lBQkIwQUJxSVFRZ0FFSFVBR29pQlNnQ0FDRUNBMEFnQkNBQ0lnRkdCRUFDUUFKQUEwQUNRQ0FFSUFVb0FnQWlBVVlFUUNBSElRRURRQ0FCS0FJQUlnRWdBMFlOQWlBQUlBRkJDR3RCd2dBUThBTWdBVUVFYWlFQkRBQUxBQXNnQVVFSWF5SUNLQUlBUVFCTURRSWdBVUVFYXlJRklBVXRBQUJCRDNFNkFBQWdBQ0FDUWNNQUVQQURJQUZCQkdvaEJRd0JDd3NnQUVFQ09nQm9JQUJCMkFCcUlRSURRQ0FESUFjb0FnQWlBVWNFUUNBQlFRUnJMUUFBUVE1eEJFQWdBU2dDQUNJRUlBRW9BZ1FpQlRZQ0JDQUZJQVEyQWdBZ0FVRUFOZ0lBSUFJb0FnQWlCQ0FCTmdJRUlBRWdBallDQkNBQklBUTJBZ0FnQWlBQk5nSUFEQUlGSUFBZ0FVRUlheER0QlF3Q0N3QUxDeUFBUVFBNkFHZ2dBRUVRYWlFRElBQW9BbHdoQVFOQUlBRWdBa2NFUUNBQlFRUnJMUUFBUVE1eERRTWdBU2dDQkNFSElBTWdBVUVJYXlBQUtBSUVFUUFBSUFjaEFRd0JDd3NnQUNBQ05nSmNJQUFnQUVIWUFHbzJBbGdQQzBIRmpRRkJydndBUWVjc1FmclJBQkFBQUF0QitZWUJRYTc4QUVHZExVSFpPUkFBQUFzZ0FVRUVheUlHTFFBQVFSQkpCRUFnQVNnQ0JDRUNJQUFnQVVFSWF5SUlRY1FBRVBBRElBWWdCaTBBQUVFUGNVRVFjam9BQUNBSUtBSUFEUUVnQVNnQ0FDSUdJQUVvQWdRaUNEWUNCQ0FJSUFZMkFnQWdBVUVBTmdJQUlBTW9BZ0FpQmlBQk5nSUVJQUVnQXpZQ0JDQUJJQVkyQWdBZ0F5QUJOZ0lBREFFTEMwR29qd0ZCcnZ3QVFjUXNRZURkQUJBQUFBc29BUUYvSUFFZ0FTZ0NBRUVCYXlJQ05nSUFJQUpGQkVBZ0FFRVFhaUFCSUFBb0FnUVJBQUFMQy9FQkFnWi9BWDRnQUVFSUVDa2lCRVVFUUVGL0R3c2dCRUlCTndJQUlBS25JUVlnQWtJZ2lLZEJkVWtoQ0FOQUFrQUNRQ0FEUVFKR0RRQWdBQ0FBS1FNd0lBTkJNbW9RU1NJSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0FFRVFFQ2tpQlEwQ0lBQWdDUkFQQzBGL0lRY2dBMFVOQUNBQUlBRXBBd0FRRHdzZ0FDZ0NFQ0FFRUtNRklBY1BDeUFFSUFRb0FnQkJBV28yQWdBZ0JTQUVOZ0lJSUFoRkJFQWdCaUFHS0FJQVFRRnFOZ0lBQ3lBRklBSTNBd0FnQ1VLQWdJQ0FjRm9FUUNBSnB5QUZOZ0lnQ3lBQUlBbEJMMEVCRUpZRElBRWdBMEVEZEdvZ0NUY0RBQ0FEUVFGcUlRTU1BQXNBQzVnREFnSitBbjlDZ0lDQWdEQWhBZ0pBQWtBZ0FTa0NWQ0lEUWhpR1FqaUhwdzBBSUFOQ0lJWkNPSWVuQkVBZ0EwSVFoa0k0aDZkRkRRRWdBU2tEWUNJQ1FpQ0lwMEYxVHdSQUlBS25JZ0VnQVNnQ0FFRUJhallDQUFzZ0FDQUNFSW9CUW9DQWdJRGdBQThMSUFFZ0EwTC8vLy8vajJDRFFvQ0FnSUFRaERjQ1ZBTkFJQUVvQWhRZ0JFb0VRQ0FCS0FJUUlBUkJBM1JxS0FJRUlnVXBBbFJDR0laQ09JZW5SUVJBSUFBZ0JSQ2xCU0lDUW9DQWdJQndnMEtBZ0lDQTRBQlJEUVFnQUNBQ0VBOExJQVJCQVdvaEJBd0JDd3NDUUNBQktBSlFJZ1FFUUVLQWdJQ0E0QUJDZ0lDQWdEQWdBQ0FCSUFRUkF3QkJBRWdiSVFJTUFRc2dBQ0FCS1FOSVFvQ0FnSUF3UVFCQkFCQXZJUUlnQVVLQWdJQ0FNRGNEU0FzZ0FrS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBRkJBVG9BV1NBQUtBSVFLUU9BQVNJRFFpQ0lwMEYxVHdSQUlBT25JZ0FnQUNnQ0FFRUJhallDQUFzZ0FTQUROd05nQ3lBQklBRXBBbFJDLy8vL2g0QmdnMEtBZ0lBSWhEY0NWQXNnQWc4TElBRWdBU2tDVkVMLy8vLy9qMkNETndKVUlBSUw1Z1VDQjM4QmZpTUFRUkJySWdVa0FBSkFJQUVwQWxRaUNVSW9oa0k0aDZjTkFDQUJJQWxDLy8rRGVJTkNnSUFFaERjQ1ZBTkFBa0FnQVNnQ0ZDQURUQVJBUVFBaEF3TkFJQUVvQWlBZ0Ewb0VRQUpBSUFFb0Fod2lCQ0FEUVJSc2FpSUNLQUlJUVFGSERRQWdBaWdDRENJSFFmMEFSZzBBSUFBZ0JVRUlhaUFGUVF4cUlBRW9BaEFnQWlnQ0FFRURkR29vQWdRZ0J4RDBBeUlDUlEwQUlBQWdBaUFCSUFRZ0EwRVViR29vQWhBUTh3TU1CQXNnQTBFQmFpRUREQUVMQzBFQUlRSWdBU2dDVUEwRElBRW9Ba2dvQWlRaENFRUFJUU5CQUNFRUEwQUNRQ0FCS0FJNElBUk1CRUFEUUNBRElBRW9BaUJPRFFJZ0FTZ0NIQ0FEUVJSc2FpSUNLQUlJUlFSQUlBZ2dBaWdDQUVFQ2RHb29BZ0FpQkNBRUtBSUFRUUZxTmdJQUlBSWdCRFlDQkFzZ0EwRUJhaUVEREFBTEFBc2dBU2dDRUNBQktBSTBJQVJCREd4cUlnY29BZ2hCQTNScUtBSUVJUUlDUUFKQUlBY29BZ1FpQmtIOUFFWUVRQ0FBSUFJUWpRTWlDVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQVlMSUFBZ0JVRUlhaUFGUVF4cUlBSWdCaEQwQXlJR0JFQWdBQ0FHSUFJZ0J5Z0NCQkR6QXd3R0N3SkFJQVVvQWd3aUJpZ0NERUg5QUVZRVFDQUFJQVVvQWdnb0FoQWdCaWdDQUVFRGRHb29BZ1FRalFNaUNVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwSElBQkJBUkR4QXlJQ1JRUkFJQUFnQ1JBUERBZ0xJQUFnQWtFWWFpQUpFQ0FNQVFzZ0JpZ0NCQ0lDUlFSQUlBVW9BZ2dvQWtnb0FpUWdCaWdDQUVFQ2RHb29BZ0FoQWdzZ0FpQUNLQUlBUVFGcU5nSUFDeUFJSUFjb0FnQkJBblJxSUFJMkFnQU1BUXNnQUNBSUlBY29BZ0JCQW5ScUtBSUFRUmhxSUFrUUlBc2dCRUVCYWlFRURBRUxDMEYvSVFJZ0FDQUJLUU5JUW9HQWdJQVFRUUJCQUJBaElnbENnSUNBZ0hDRFFvQ0FnSURnQUZFTkF5QUFJQWtRRDBFQUlRSU1Bd3NnQTBFRGRDRUVRWDhoQWlBRFFRRnFJUU1nQUNBRUlBRW9BaEJxS0FJRUVLWUZRUUJPRFFFTUFnc0xRWDhoQWdzZ0JVRVFhaVFBSUFJTC9nSUNCSDhDZmdKQUlBRXBBbFJDTUlaQ09JZW5EUUFDUUNBQktBSlFCRUFEUUNBQ0lBRW9BaUJPRFFJZ0FTZ0NIQ0FDUVJSc2FpSURLQUlJUlFSQUlBQkJBQkR4QXlJRVJRUkFRWDhQQ3lBRElBUTJBZ1FMSUFKQkFXb2hBZ3dBQ3dBTElBRXBBMGdoQjBGL0lRTWdBQ0FBS1FNd1FRMFFTU0lHUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQnFjaUFpQUhweUlETmdJZ0lBTWdBeWdDQUVFQmFqWUNBQ0FDUWdBM0FpUUNRQ0FES0FJOElnUkZEUUFDUUNBQUlBUkJBblFRWHlJRVJRMEFJQUlnQkRZQ0pFRUFJUUlEUUNBQ0lBTW9BanhPRFFJZ0F5Z0NKQ0FDUVFOMGFpMEFBQ0lGUVFGeEJFQWdBQ0FGUVFOMlFRRnhFUEVESWdWRkRRSWdCQ0FDUVFKMGFpQUZOZ0lBQ3lBQ1FRRnFJUUlNQUFzQUN5QUFJQVlRRDBGL0R3c2dBU0FHTndOSUlBQWdCeEFQQ3lBQlFRRTZBRlZCQUNFQ0EwQWdBU2dDRkNBQ1RBUkFRUUFQQ3lBQ1FRTjBJUVJCZnlFRElBSkJBV29oQWlBQUlBUWdBU2dDRUdvb0FnUVFwd1ZCQUU0TkFBc0xJQU1MTVFFQ2Z3Si9JQUFRUDBFQmFpRUJBMEJCQUNBQlJRMEJHaUFBSUFGQkFXc2lBV29pQWkwQUFFRXZSdzBBQ3lBQ0N3dHdBZ0ovQVg0akFFRVFheUlDSkFBQ1FDQUJRUUJPQkVBZ0FVR0FnSUNBZUhJaEF3d0JDeUFDSUFFMkFnQWdBa0VGYWlJQlFRdEIzQ0lnQWhCT0dpQUFJQUVRWWlJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDZ0NFQ0FFcDBFQkVLY0NJUU1MSUFKQkVHb2tBQ0FEQ3pJQUlBQWdBUkM4QWlJQlFvQ0FnSUJ3ZzBLQWdJQ0F3SDVSQkg0Z0FFRysxUUJCQUJDQUFrS0FnSUNBNEFBRklBRUxDOUFEQWdKL0FYNENRQU5BQWtBQ1FBSkFBa0FDUUFKQUFrQUNRRUVISUFKQ0lJaW5JZ01nQTBFSGEwRnVTUnRCQ21vT0VnTUVCd1VIQndjSEJ3WUFBUUFBQndjSEFnY0xJQUFvQWhBb0Fvd0JJZ05GRFFZZ0F5MEFLRUVFY1VVTkJnc2dBQ2dDMkFFaEFDQUJRZ0EzQWd3Z0FVS0FnSUNBZ0lDQWdJQi9Od0lFSUFFZ0FEWUNBQ0FCSUFMRUVMb0NHaUFCRHdzZ0FDZ0NFQ2dDakFFaUEwVU5CQ0FETFFBb1FRUnhSUTBFSUFKQ2dJQ0FnTUNCZ1B6L0FId2lCVUtBZ0lDQWdJQ0ErUDhBZzBLQWdJQ0FnSUNBK1A4QVVRMEVJQUFvQXRnQklRQWdBVUlBTndJTUlBRkNnSUNBZ0lDQWdJQ0FmemNDQkNBQklBQTJBZ0FnQVNBRnY1MFF1Z1VhSUFFUEN5QUNwMEVFYWc4TElBQW9BaEFvQW93QklnTkZEUUlnQXkwQUtFRUVjVVVOQWlBQ3B5SURLQUlNUWYzLy8vOEhTZzBDSUFBb0F0Z0JJUVFnQVVJQU53SU1JQUZDZ0lDQWdJQ0FnSUNBZnpjQ0JDQUJJQVEyQWdBZ0FTQURRUVJxRUVRYUlBRkJBUkRSQVJvZ0FDQUNFQThnQVE4TElBQWdBaENxQlNJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFJTUF3c2dBQ0FDUVFFUW1nRWlBa0tBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQUlMQ3lBQUlBSVFEeUFBUWV3clFRQVFGVUVBRHd0QkFBdG1BUUovSXdCQkVHc2lBeVFBSUFBZ0FTZ0NKQ0FDSUFFb0FpQkJBMnhCQVhZaUFDQUFJQUpJR3lJQVFRTjBJQU5CREdvUXFBRWlBZ1IvSUFNb0Fnd2hCQ0FCSUFJMkFpUWdBU0FFUVFOMklBQnFOZ0lnUVFBRlFYOExJUUVnQTBFUWFpUUFJQUVMVWdFRWZ5QUFLQUlnSWdKQkFDQUNRUUJLR3lFRVFRQWhBZ05BQWtBZ0FpQUVSd1IvSUFBb0Fod2lCU0FDUVJSc2FpZ0NFQ0FCUncwQklBVWdBa0VVYkdvRlFRQUxEd3NnQWtFQmFpRUNEQUFMQUF2aEF3RUdmeU1BUVJCcklnY2tBQ0FGUVFScUlRa0NRQUpBQTBCQkFDRUdJQUZCQURZQ0FDQUNRUUEyQWdBZ0JTZ0NDQ0lJUVFBZ0NFRUFTaHNoQ2dKQUEwQWdCaUFLUmcwQkFrQWdBeUFGS0FJQUlBWkJBM1JxSWdzb0FnQkdCRUFnQ3lnQ0JDQUVSZzBCQ3lBR1FRRnFJUVlNQVFzTElBWkJBRWdOQUVFQ0lRUU1Bd3NnQUNBRlFRZ2dDU0FJUVFGcUVIZ0VRRUYvSVFRTUF3c2dCU0FGS0FJSUlnWkJBV28yQWdnZ0JTZ0NBQ0FHUVFOMGFpSUdJQU0yQWdBZ0JpQUFJQVFRR0NJSU5nSUVJQU1nQ0JDdEJTSUdCRUFnQmlnQ0NFVU5BaUFHS0FJTUlnUkIvUUJHRFFJZ0F5Z0NFQ0FHS0FJQVFRTjBhaWdDQkNFRERBRUxDeUFJUVJaSEJFQkJBQ0VHQTBBZ0F5Z0NMQ0FHU2dSQUFrQUNRQ0FBSUFkQkRHb2dCMEVJYWlBREtBSVFJQU1vQWlnZ0JrRUNkR29vQWdCQkEzUnFLQUlFSUFnZ0JSQ3VCU0lFUVFGcURnVUdBQUVCQmdFTElBSW9BZ0FpQkFSQUlBRW9BZ0FnQnlnQ0RFWUVRQ0FIS0FJSUtBSU1JQVFvQWd4R0RRSUxJQUZCQURZQ0FDQUNRUUEyQWdCQkF5RUVEQVlMSUFFZ0J5Z0NERFlDQUNBQ0lBY29BZ2cyQWdBTElBWkJBV29oQmd3QkN3dEJBQ0VFSUFJb0FnQU5BZ3RCQVNFRURBRUxJQUVnQXpZQ0FDQUNJQVkyQWdCQkFDRUVDeUFIUVJCcUpBQWdCQXZDQXdFSmZ5QUJLQUlJSWdaQkFDQUdRUUJLR3lFRkFrQUNRQU5BSUFRZ0JVWU5BU0FFUVFKMElRY2dCRUVCYWlFRUlBY2dBU2dDQUdvb0FnQWdBa2NOQUF0QkFDRUZEQUVMUVg4aEJTQUFJQUZCQkNBQlFRUnFJQVpCQVdvUWVBMEFJQUVnQVNnQ0NDSUVRUUZxTmdJSUlBRW9BZ0FnQkVFQ2RHb2dBallDQUNBQlFSQnFJUWtnQVVFTWFpRUhRUUFoQlFOQUFrQWdBaWdDSUNBRlRBUkFRUUFoQlVFQUlRUURRQ0FFSUFJb0FpeE9EUVFnQkVFQ2RDRURJQVJCQVdvaEJDQUFJQUVnQWlnQ0VDQURJQUlvQWlocUtBSUFRUU4wYWlnQ0JFRUJFSzhGUlEwQUN3d0JDd0pBSUFOQkFDQUNLQUljSUFWQkZHeHFJZ1lvQWhBaUNrRVdSaHNOQUVFQUlRUWdBU2dDRkNJSVFRQWdDRUVBU2hzaEN3SkFBa0FEUUNBRUlBdEdEUUVnQ2lBSEtBSUFJQVJCREd4cUlnd29BZ0JIQkVBZ0JFRUJhaUVFREFFTEN5QUVRUUJPRFFFTElBQWdCMEVNSUFrZ0NFRUJhaEI0RFFJZ0FTQUJLQUlVSWdSQkFXbzJBaFFnQVNnQ0RDQUVRUXhzYWlJRUlBWW9BaEEyQWdBQ1FDQURSUVJBSUFZb0FnaEZEUUVMSUFSQkFEWUNDQXdDQ3lBRUlBWTJBZ2dNQVFzZ0RFRUFOZ0lJQ3lBRlFRRnFJUVVNQVFzTFFYOFBDeUFGQzJnQ0FuOEJmaUFBUVJCcUlRSWdBQ2tDQkNJRXAwSC8vLy8vQjNFaEF3SkFJQVJDZ0lDQWdBaURVRVVFUUVFQUlRQURRQ0FBSUFOR0RRSWdBaUFBUVFGMGFpOEJBQ0FCUVljQ2JHb2hBU0FBUVFGcUlRQU1BQXNBQ3lBQ0lBTWdBUkN5QlNFQkN5QUJDeElBSUFBZ0FTQUNJQU5CZ0lBQkVOQUJHZ3NzQVFGL0EwQWdBU0FEUmtVRVFDQUFJQU5xTFFBQUlBSkJod0pzYWlFQ0lBTkJBV29oQXd3QkN3c2dBZ3ZPQVFJRGZ3RitJQUVnQWtFQkVMSUZJZ05CLy8vLy93TnhJUVVnQUNnQ05DQUFLQUlrUVFGcklBTnhRUUowYWlFREEwQWdBeWdDQUNJRVJRUkFRUUFQQ3dKQUlBQW9BamdnQkVFQ2RHb29BZ0FpQXlrQ0JDSUdRaUNJcDBILy8vLy9BM0VnQlVjZ0JrS0FnSUNBZ0lDQWdFQ0RRb0NBZ0lDQWdJQ0F3QUJTY2lBR3AwSC8vLy8vQjNFZ0FrY2dCa0tBZ0lDQUNJTkNBRkp5Y2cwQUlBTkJFR29nQVNBQ0VHRU5BQ0FFUWQ0QlRnUkFJQU1nQXlnQ0FFRUJhallDQUFzZ0JBOExJQU5CREdvaEF3d0FDd0FMZndFRWZ5QUJMUUFBUWRzQVJnUkFJQUZCQVdvaUF4QS9RUUZySVFJZ0FDZ0NFQ2dDT0NFRVFkQUJJUUVEUUNBQlFkNEJSd1JBQWtBZ0JDQUJRUUowYWlnQ0FDSUZLQUlFUWYvLy8vOEhjU0FDUncwQUlBVkJFR29nQXlBQ0VHRU5BQ0FBSUFFUUdBOExJQUZCQVdvaEFRd0JDd3NRQVFBTElBQWdBUkNxQVF1c0FnTUNmd0orQVh3akFFRWdheUlDSkFCRUFBQUFBQUFBK0g4aEJpQUFLQUlJUWYvLy8vOEhSd1JBSUFBb0FnQWhBeUFDUWdBM0FoZ2dBa0tBZ0lDQWdJQ0FnSUIvTndJUUlBSWdBellDRENBQ1FReHFJQUFRUkJvQ2ZpQUNLQUlVSWdCQi9mLy8vd2RNQkVBZ0FrRU1ha0UxUWNnRUVNNEJHaUFDS0FJVUlRQUxRb0NBZ0lDQWdJRDQvd0FnQUVIKy8vLy9CMFlOQUJvZ0FFR0FnSUNBZUVZRVFFSUFEQUVMSUFJb0Fod2hBd0orSUFJb0FoaEJBa1lFUUNBREtRSUFEQUVMSUFNMUFnQkNJSVlMSVFRZ0FFR0NlRXdFUUNBRVFZNTRJQUJycllnaEJFSUFEQUVMSUFSQ0M0aEMvLy8vLy8vLy93ZURJUVFnQUVIK0IycXRRalNHQ3lFRklBUWdCWVFnQWpVQ0VFSS9ob1MvSVFZZ0FrRU1haEFiQ3lBQklBWTVBd0FnQWtFZ2FpUUFDdzRBSUFCQ2dJQ0FnUEIrRUlBR0MrNFBBd3QvQTM0QmZDTUFRVUJxSWhBa0FFSGZBRUdBQWlBRVFTQnhHeUVKSUFSQmdBTnhJUXNDUUFKQUFrQUNmd0pBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FCTFFBQUlnWkJLMnNPQXdFREFBTUxRUUVoRGlBQlFRRnFJUUVNQVFzZ0FVRUJhaUVCQ3lBRVFZQUljVVVOQVNBQkxRQUFJUVlMSUFaQi93RnhRVEJIRFFBQ1FBSkFBa0FnQVMwQUFTSUhRZmdBUndSQUlBZEI3d0JHRFFJZ0IwSFlBRWNOQVFzZ0EwRnZjUTBGSUFGQkFtb2hCMEVRSVFNTUNRc2dBeUFIUWM4QVIzSU5BUXdGQ3lBRFJRMEVEQU1MQWtBQ1FDQUhRZUlBUndSQUlBTkZJQWRCd2dCR2NRMEJJQU1nQjBFd2EwSC9BWEZCQ1V0eURRUWdCRUVRY1EwQ0RBY0xJQU1OQkFzZ0JFRUVjVVVOQlVFQ0lRTWdBVUVDYWlFSERBY0xJQUZCQVdvaEIwRUJJUVlEUUNBQklBWnFJUU1nQmtFQmFpRUdJQU10QUFBaUNFSDRBWEZCTUVZTkFBdEJDQ0VEUVlBQ0lRbEJBU0VLSUFoQi9nRnhRVGhHRFFRTUJnc2dCRUVCY1NBTFFZQUNja0dBQWtkeURRQWdBVUVJYWlFSFFmVWNJUVlnQVNFSUEwQWdCa0g5SEVjRVFDQUlMUUFBSUFZdEFBQkhEUUlnQmtFQmFpRUdJQWhCQVdvaENBd0JDd3NnQzBHQUFrWUVRQ0FBRUxZRkloRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFS0FnSUNBNEFBaEVRd0pDeUFScDBFRWFpQU9FSXdCREFnTFJBQUFBQUFBQVBEL1JBQUFBQUFBQVBCL0lBNGJJaFM5SWhFQ2Z5QVVtVVFBQUFBQUFBRGdRV01FUUNBVXFnd0JDMEdBZ0lDQWVBc2lCcmU5VVFSQUlBYXRJUkVNQ0F0Q2dJQ0FnTUIrSUJGQ2dJQ0FnTUNCZ1B6L0FIMGdFVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2hFUXdIQ3lBQklnY2dBMFVOQXhvTUJRc2dBU0VIREFRTElBUkJCSEZGRFFBZ0FVRUNhaUVIUVFnaEF3d0NDeUFCQ3lFSFFRb2hBd3dCQzBLQWdJQ0F3SDRoRVNBSExRQUFFSllCSUFOUERRRUxRUUFoQmlBRFFRcEhJUXdnQnlFQkEwQUNRQ0FHSUFkcUlnMHRBQUFpQ01BaER5QUlFSllCSUFOT0JFQWdDU0FQUncwQkFrQWdEQ0FHUVFGSGNnMEFJQTFCQVdzdEFBQkJNRWNOQUVFQklRWU1BZ3NnRFMwQUFSQ1dBU0FEVGcwQkN5QUhJQVpCQVdvaUJtb2hBUXdCQ3d0QkFDRU1Ba0FDUUNBRVFRRnhEUUFDUUNBSVFTNUhEUUFnRFMwQUFTRUlJQVpGQkVBZ0NCQ1dBU0FEVGcwQkN5QU5RUUZxSVFGQ2dJQ0FnTUIrSVJFZ0NTQUl3RVlOQWdOQUFrQWdDRUgvQVhFUWxnRWdBMGdFUUNBQkxRQUJJUWdNQVF0QkFTRU1JQWtnQ01CSERRSWdBUzBBQVNJSUVKWUJJQU5PRFFJTElBRkJBV29oQVF3QUN3QUxJQUVnQjAwTkFBSkFJQUV0QUFBaUJrSGxBRWNFUUNBRFFRcEdJQVpCeFFCR2NRMEJJQVpCSUhKQjhBQkhJQU5CRUV0eURRSkJBU0FEZEVHRWdnUnhEUUVNQWdzZ0EwRUtSdzBCQzBFQklRd2dBVUVCYWlFR0FrQUNRQUpBSUFFdEFBRkJLMnNPQXdBQ0FRSUxJQUZCQW1vaEJnd0JDeUFCUVFKcUlRWUxJQVl0QUFCQk9tdEJka2tOQUNBR0lRRURRQ0FCSWdaQkFXb2hBU0FHTFFBQklnakFJUTBnQ0VFNmEwRjFTdzBBSUFrZ0RVY05BU0FHTFFBQ1FUcHJRWFZMRFFBTEN5QUJJQWRHQkVCQ2dJQ0FnTUIrSVJFTUFRc2dFQ0VKQWtBZ0FTQUhheUlOUVFKcUlnOUJ3UUJQQkVBZ0FDZ0NFQ0lHUVJCcUlBOGdCaWdDQUJFREFDSUpSUTBCQzBFQUlRWkJBQ0VJSUE0RVFDQUpRUzA2QUFCQkFTRUlDeUFOUVFBZ0RVRUFTaHNoRGdOQUlBWWdEa1pGQkVBZ0JpQUhhaTBBQUNJTlFkOEFSd1JBSUFnZ0NXb2dEVG9BQUNBSVFRRnFJUWdMSUFaQkFXb2hCZ3dCQ3dzZ0NDQUpha0VBT2dBQUFuNENRQUpBSUFSQndBQnhCRUFDUUFKQUFrQUNRQ0FCTFFBQVFld0FhdzREQVFJQUF3c2dBVUVCYWlFQlFZQUJJUXNNQlFzZ0FVRUJhaUVCUVlBQ0lRc01CQXNnQVVFQmFpRUJRWUFESVFzTUF3c2dCRUdBQkhFRVFFS0FnSUNBd0g0Z0NnMEVHaUFMUVlBQklBd2JJUXNNQXdzZ0EwRUtSdzBCREFJTElBc05BU0FFUVlBRWNRUkFRb0NBZ0lEQWZpQUtEUU1hSUF4RlFRZDBJUXNNQWd0QkFDRUxJQU5CQ2tZTkFRdENnSUNBZ01CK0lBd05BUm9MQWtBQ1FBSkFBa0FDUUFKQUlBdEJHWGNPQkFBQkFnTUVDd0o4SUF3Z0EwRUtSbkZGQkVBZ0NTQUpMUUFBSWdSQkxVWnFJUWNEUUNBSElnWkJBV29oQnlBR0xRQUFJZ2hCTUVZTkFBdENtTFBtekptejVzd1pJUklnQTBFS1J3UkFRUUFnQTJ1c0lBT3NnQ0VTQ3lBRHJTRVRRUUFoQjBJQUlSRURRQUpBSUFoQi93RnhJZ1ZGRFFBZ0JSQ1dBU0lGSUFOT0RRQWdFU0FGclNBUklCTitmQ0FSSUJKV0lnVWJJUkVnQlNBSGFpRUhJQVl0QUFFaENDQUdRUUZxSVFZTUFRc0xJQkc2SVJRZ0J3UkFJQU8zSUFlM0VJOERJQlNpSVJRTElCU2FJQlFnQkVFdFJoc01BUXNnQ1JEa0JRc2lGTDBoRVNBUkFuOGdGSmxFQUFBQUFBQUE0RUZqQkVBZ0ZLb01BUXRCZ0lDQWdIZ0xJZ2EzdlZJTkJDQUdyUXdGQzBLQWdJQ0F3SDRnQ2lBTWNnMEVHaUFBSUFrZ0F5QUVRUUFnQUNnQ0VDZ0NtQUlSSWdBTUJBdENnSUNBZ01CK0lBb05BeG9nQUNBSklBTWdCQ0FGSUFBb0FoQW9BclFDRVNJQURBTUxRb0NBZ0lEQWZpQURRUXBIRFFJYUlBQWdDVUVLSUFSQkFDQUFLQUlRS0FMUUFoRWlBQXdDQ3hBQkFBdENnSUNBZ01CK0lCRkNnSUNBZ01DQmdQei9BSDBnRVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMSVJFZ0QwSEJBRWtOQVNBQUtBSVFJZ0JCRUdvZ0NTQUFLQUlFRVFBQURBRUxJQUFRZkVLQWdJQ0E0QUFoRVFzZ0FTRUhDeUFDQkVBZ0FpQUhOZ0lBQ3lBUVFVQnJKQUFnRVF0YkFRUi9JQUFvQWdBaUEwRUFJQU5CQUVvYklRVkJBQ0VEQTBBQ1FDQURJQVZIQkg4Z0FDZ0NCQ0lHSUFOQlBHeHFLQUlBSUFGSERRRWdCaUFEUVR4c2FpQUNRUUowYWlnQ0JBVkJBQXNQQ3lBRFFRRnFJUU1NQUFzQUMwZ0JBMzhnQWtFQUlBSkJBRW9iSVFJRFFDQUNJQU5HQkVCQkFBOExJQUVnQTJvaEJDQURRUUYwSVFVZ0EwRUJhaUVESUFBZ0JXb3ZBUUFnQkMwQUFHc2lCRVVOQUFzZ0JBdS9BUUlDZmdKL0lBRzlJZ05DLy8vLy8vLy8vd2VESVFJZ0EwSS9pS2NoQkFKQUFrQWdBMEkwaUtkQi93OXhJZ1VFUUNBRlFmOFBSdzBCSUFKUVJRUkFJQUFRTlVFQUR3c2dBQ0FFRUl3QlFRQVBDeUFDVUFSQUlBQWdCQkNKQVVFQUR3c2dBa0lNaGlJQ0lBSjVJZ09HSVFKQkFDQURwMnNoQlF3QkN5QUNRZ3VHUW9DQWdJQ0FnSUNBZ0grRUlRSUxJQUFnQlVIK0IyczJBZ2dnQUVFQ0VFRkZCRUFnQUNnQ0VDQUNOd0lBSUFBZ0JEWUNCRUVBRHdzZ0FCQTFRU0FMcXdFQ0FYNENmeUFCS1FJRVFvQ0FnSUFJZ3lFRElBQXRBQWRCZ0FGeFJRUkFJQU5RQkVBZ0FFRVFhaUFCUVJCcUlBSVFZUThMUVFBZ0FVRVFhaUFBUVJCcUlBSVF1UVZyRHdzZ0FVRVFhaUVFSUFCQkVHb2hBQ0FEVUFSQUlBQWdCQ0FDRUxrRkR3c2dBa0VBSUFKQkFFb2JJUVZCQUNFQkEwQWdBU0FGUmdSQVFRQVBDeUFCUVFGMElRSWdBVUVCYWlFQklBQWdBbW92QVFBZ0FpQUVhaThCQUdzaUFrVU5BQXNnQWd2VEJBRUlmeUFESUFFb0FnQWlCQ2dDSEVFRGJFRUNiU0lGSUFNZ0JVb2JJUWdDUUNBQ0JFQWdBQ0FDS0FJVUlBaEJBM1FRaVFJaUEwVU5BU0FDSUFNMkFoUUxJQVFvQWhnaUJrRUJhaUlGSVFNRFFDQURJZ0pCQVhRaEF5QUNJQWhKRFFBTEFrQWdBaUFGUndSQUlBQWdBa0VDZENJSElBaEJBM1JxUVRCcUVDa2lDa1VOQWlBRUtBSUlJZ01nQkNnQ0RDSUZOZ0lFSUFVZ0F6WUNBQ0FFUWdBM0FnZ2dCeUFLYWlJR0lBUWdCQ2dDSUVFRGRFRXdhaEFmSVFVZ0FDZ0NFQ0lES0FKUUlna2dCVUVJYWlJTE5nSUVJQVVnQTBIUUFHbzJBZ3dnQlNBSk5nSUlJQU1nQ3pZQ1VDQUZJQUpCQVdzaUNUWUNHRUVBSVFNZ0NrRUFJQWNRS3hvZ0JVRXdhaUVDQTBBZ0F5QUZLQUlnVDBVRVFBSkFJQUlvQWdRaUIwVUVRQ0FEUVFGcUlRTU1BUXNnQWlBQ0tBSUFRWUNBZ0dCeElBVWdCeUFKY1VGL2MwRUNkR29pQnlnQ0FFSC8vLzhmY1hJMkFnQWdCeUFEUVFGcUlnTTJBZ0FMSUFKQkNHb2hBZ3dCQ3dzZ0FDZ0NFQ0lBUVJCcUlBUWdCQ2dDR0VGL2MwRUNkR29nQUNnQ0JCRUFBQXdCQ3lBRUtBSUlJZ0lnQkNnQ0RDSUROZ0lFSUFNZ0FqWUNBQ0FFUWdBM0FnZ2dBQ0FFSUFaQmYzTkJBblJxSUFWQkFuUWlBaUFJUVFOMGFrRXdhaENKQWlJRFJRUkFJQUFvQWhBaUFDZ0NVQ0lCSUFSQkNHb2lBallDQkNBRUlBQkIwQUJxTmdJTUlBUWdBVFlDQ0NBQUlBSTJBbEJCZnc4TElBQW9BaEFpQUNnQ1VDSUVJQUlnQTJvaUJrRUlhaUlDTmdJRUlBWWdBRUhRQUdvMkFnd2dCaUFFTmdJSUlBQWdBallDVUFzZ0FTQUdOZ0lBSUFZZ0NEWUNIRUVBRHd0QmZ3dlRBUUlGZndGK0FrQWdBU2tDQkNJSHAwSC8vLy8vQjNFaUJFRUxhMEYyU1EwQUlBRkJFR29oQWdKL0lBZENnSUNBZ0FpRFVDSUZSUVJBSUFJdkFRQU1BUXNnQWkwQUFBc2lBVUV3YXlJRFFRbExEUUFDZndKQUlBRkJNRWNFUUVFQklRRURRQ0FCSUFSR0RRSUNmeUFGUlFSQUlBSWdBVUVCZEdvdkFRQU1BUXNnQVNBQ2FpMEFBQXRCTUdzaUJrRUpTdzBFSUFGQkFXb2hBU0FHclNBRHJVSUtmbndpQjZjaEF5QUhRb0NBZ0lBUVZBMEFDd3dEQzBFQUlnTWdCRUVCUncwQkdnc2dBQ0FETmdJQVFRRUxEd3RCQUF1cEFnSURmd0YrQWtBZ0FDQUNFRGhGRFFBZ0FxY2lCQzhCQmtFT1JnUkFJQUFnQVNBRUtBSWdLUU1BRU5BRkR3c2dBVUtBZ0lDQWNGUU5BQUpBSUFBZ0FrRTdJQUpCQUJBVUlnSkMvLy8vLzI5WUJFQkJmeUVESUFKQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQVFjWXdRUUFRRlF3QkN5QUJweUVFSUFLbklRVUNRQU5BQWtBZ0JDZ0NFQ2dDTENJRFJRUkFRUUFoQXlBRUx3RUdRVEJIRFFRZ0JDQUVLQUlBUVFGcU5nSUFJQVN0UW9DQWdJQndoQ0VCQTBBZ0FDQUJFSXdDSWdGQ2dJQ0FnSENESWdaQ2dJQ0FnQ0JSRFFSQmZ5RURJQVpDZ0lDQWdPQUFVUTBGSUFHbklBVkdCRUFnQUNBQkVBOE1Bd3NnQUJCN1JRMEFDeUFBSUFFUUR3d0VDeUFESWdRZ0JVY05BUXNMUVFFaEF3d0JDMEVBSVFNTElBQWdBaEFQQ3lBREM5SURBZ0orQW44akFFRWdheUlFSkFBQ1FDQUJRdi8vLy8vLy8vLy8vd0NESWdOQ2dJQ0FnSUNBd0lBOGZTQURRb0NBZ0lDQWdNRC93d0I5VkFSQUlBRkNCSVlnQUVJOGlJUWhBeUFBUXYvLy8vLy8vLy8vRDRNaUFFS0JnSUNBZ0lDQWdBaGFCRUFnQTBLQmdJQ0FnSUNBZ01BQWZDRUNEQUlMSUFOQ2dJQ0FnSUNBZ0lCQWZTRUNJQUJDZ0lDQWdJQ0FnSUFJVWcwQklBSWdBMElCZzN3aEFnd0JDeUFBVUNBRFFvQ0FnSUNBZ01ELy93QlVJQU5DZ0lDQWdJQ0F3UC8vQUZFYlJRUkFJQUZDQklZZ0FFSThpSVJDLy8vLy8vLy8vd09EUW9DQWdJQ0FnSUQ4L3dDRUlRSU1BUXRDZ0lDQWdJQ0FnUGovQUNFQ0lBTkMvLy8vLy8vL3YvL0RBRllOQUVJQUlRSWdBMEl3aUtjaUJVR1I5d0JKRFFBZ0JFRVFhaUFBSUFGQy8vLy8vLy8vUDROQ2dJQ0FnSUNBd0FDRUlnSWdCVUdCOXdCckVHY2dCQ0FBSUFKQmdmZ0FJQVZyRUk0Q0lBUXBBd2hDQklZZ0JDa0RBQ0lBUWp5SWhDRUNJQVFwQXhBZ0JDa0RHSVJDQUZLdElBQkMvLy8vLy8vLy8vOFBnNFFpQUVLQmdJQ0FnSUNBZ0FoYUJFQWdBa0lCZkNFQ0RBRUxJQUJDZ0lDQWdJQ0FnSUFJVWcwQUlBSkNBWU1nQW53aEFnc2dCRUVnYWlRQUlBSWdBVUtBZ0lDQWdJQ0FnSUIvZzRTL0N3MEFJQUFnQVNBQ1FRQVF2QUVMdWdNQ0FYNERmeU1BUVJCcklnUWtBQUpBQWtBQ1FBSkFBa0FEUUFKQUlBRWhBd0pBQWtBQ1FBSkFBa0FDUUFKQVFRY2dBVUlnaUtjaUJTQUZRUWRyUVc1SkcwRUxhZzRUQUFFQ0NRY0tDZ29LQ2dZTkJRVUxDZ29ORFFvTElBSkJBVVlOQWlBQUlBRVFEeUFBUWRMSEFFRUFFQlVNQ3dzZ0FrRUJSZzBCSUFBZ0FSQVBJQUJCOE1ZQVFRQVFGUXdLQ3lBQ1FRRkhEUUVMSUFFaEF3d0pDeUFBSUFFUUR5QUFRWkRIQUVFQUVCVU1Cd3NnQVVMLy8vLy9ENE1oQXd3SEMwS0FnSUNBNEFBaEF5QUFJQUZCQVJDYUFTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCU0RRRU1CZ3NMSUFBZ0JFRUlhaUFCRU9VQklRSWdBQ0FCRUE4Z0FrVU5BeUFFSUFJZ0FoQ0JBaUlGYWlJR05nSU1RZ0FoQXdKQUlBVWdCQ2dDQ0VZTkFDQUFJQVlnQkVFTWFrRUFRUVFRdUFJaUEwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBUWdCQ2dDREJDQkFpQUVLQUlNYWlJRk5nSU1JQVFvQWdnZ0JTQUNhMFlOQUNBQUlBTVFEMEtBZ0lDQXdINGhBd3NnQUNBQ0VGUU1CQXNnQUNBQkVBOGdBRUd5eHdCQkFCQVZEQUlMSUFBZ0FSQVBDMEtBZ0lDQXdINGhBd3dCQzBLQWdJQ0E0QUFoQXdzZ0JFRVFhaVFBSUFNTGl3SUNBMzhCZmlNQVFSQnJJZ1VrQUNBRklBSTNBd2dDUUNBQUx3SG9BVUdBQWtrTkFDQUFJQUpCM1FFZ0FrRUFFQlFpQWtLQWdJQ0FjSU1pQjBLQWdJQ0FNRkVOQUFKQUlBZENnSUNBZ09BQVVRMEFJQUFnQWtFbEVFc2lCa1VOQUNBR0tBSUVCRUFnQUNBQ0VBOE1BZ3NnQmlBREVQY0RRUUowSWdScUtBSUlJZ05GQkVBZ0JTQUVRY0RBQVdvMkFnQWdBRUhkUENBRkVCVU1BUXRCQVNFRUlBTWdBeWdDQUVFQmFqWUNBQ0FBSUFPdFFvQ0FnSUJ3aEVLQWdJQ0FNRUVCSUFWQkNHb1FMeUlIUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBQ0VBOGdBU0FITndNQURBRUxJQUFnQWhBUElBRkNnSUNBZ0RBM0F3QkJmeUVFQ3lBRlFSQnFKQUFnQkF0ZkFRRi9JQUZCRUdvaEF3SkFJQUV0QUFkQmdBRnhCRUFnQUNBRElBSkJBWFFRSHhvTUFRdEJBQ0VCSUFKQkFDQUNRUUJLR3lFQ0EwQWdBU0FDUmcwQklBQWdBVUVCZEdvZ0FTQURhaTBBQURzQkFDQUJRUUZxSVFFTUFBc0FDd3Z2QWdJQmZ3RjhJd0JCSUdzaUF5UUFJQUVDZndKL0FrQUNRQU5BQWtBQ1FBSkFBa0JCQnlBQ1FpQ0lweUlCSUFGQkIydEJia2tiSWdFT0NBQUFBQUFEQXdNQkFnc2dBcWNNQmd0QkFDRUFJQUpDZ0lDQWdNQ0JnUHovQUh3aUFrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmcwRElBSy9JZ1JFQUFBQUFBQUFBQUJqRFFOQi93RWdCRVFBQUFBQUFPQnZRR1FOQmhvQ2Z5QUVuaUlFbVVRQUFBQUFBQURnUVdNRVFDQUVxZ3dCQzBHQWdJQ0FlQXNNQmdzZ0FVRjNSZzBEQ3lBQUlBSVFqUUVpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBBQzBGL0lRQUxRUUFNQWdzZ0FDZ0MyQUVoQVNBRFFnQTNBaFFnQTBLQWdJQ0FnSUNBZ0lCL053SU1JQU1nQVRZQ0NDQURRUWhxSWdFZ0FxZEJCR29RUkJvZ0FVRUFFTkVCR2lBRFFSeHFJQUZCQUJDcEFTQUJFQnNnQUNBQ0VBOGdBeWdDSEFzaEFVRUFJUUJCL3dFZ0FTQUJRZjhCVGhzaUFVRUFJQUZCQUVvYkN6WUNBQ0FEUVNCcUpBQWdBQXRQQVFKL0l3QkJJR3NpQXlRQUFuOGdBQ0FEUVF4cUlBSVFxd1VpQkVVRVFDQUJRZ0EzQXdCQmZ3d0JDeUFCSUFSQkFSQ0NBeG9nQUNBRUlBTkJER29RWGtFQUN5RUFJQU5CSUdva0FDQUFDNmdCQVFWL0lBQ25JZ01vQWhBaUFVRXdhaUVFSUFFZ0FTZ0NHRUYvYzBFQ2RFR2tmbkpxS0FJQUlRRURRQ0FCUlFSQVFRQVBDeUFFSUFGQkFXc2lCVUVEZEdvaUFTZ0NBQ0VDSUFFb0FnUkJOa2NFUUNBQ1FmLy8veDl4SVFFTUFRc0xRUUVoQVFKQUlBSkIvLy8vL3dOTERRQWdBeWdDRkNBRlFRTjBhaWtEQUNJQVFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFBZ0FLY29BZ1JCLy8vLy93ZHhRUUJISVFFTElBRUx5d0VDQW44QmZpTUFRUkJySWdZa0FBSkFBa0FnQWtLQWdJQ0FjRlFOQUNBQ3B5SUhMd0VHUVF4SERRQWdCeTBBS1VFTVJ3MEFJQUFnQVNBRElBTUVmeUFFQlNBR1FvQ0FnSUF3TndNSUlBWkJDR29MSUFVZ0J5NEJLaUFIS0FJa0VSSUFJUWdNQVF0Q2dJQ0FnT0FBSVFnQ1FDQUFJQUlnQVNBRElBUVFJU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlNCRUFnQVVMLy8vLy9iMVlOQVNBQUlBRVFEeUFBUVk0eFFRQVFGUXNnQlVFQU5nSUFEQUVMSUFWQkFqWUNBQ0FCSVFnTElBWkJFR29rQUNBSUM1Y0JBQUpBQWtBQ1FBSkFBa0FnQVVJZ2lLZEJBMm9PQWdFQUFnc2dBQ0FBSUFFZ0F5QUVFSXdFSUFKQkFFRUFFQzhQQ3lBQUlBRVFEd0pBSUFBZ0FhY2lBeENuQlVFQVNBMEFJQUFnQXhDbUJVRUFTQTBBSUFBZ0F4Q2xCU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlNEUU1MSUFCQkFoQ1BCQXdCQ3lBQUlBRVFEeUFBUWZMMkFFRUFFQlVMUW9DQWdJRGdBQ0VCQ3lBQkMrb0RBUVYvSXdCQkVHc2lCaVFBQWtBQ1FBSkFBbjhnQUNnQ0VDSUVLQUtvQVNJRFJRUkFJQUl0QUFCQkxrY0VRQ0FBSUFJUThRVU1BZ3NnQVJDb0JTRUZRUUFoQXlBQUlBSVFQeUFGSUFGclFRQWdCUnNpQldwQkFtb1FLU0lIUlEwRUlBY2dBU0FGRUI4aUFTQUZha0VBT2dBQUFrQURRQUpBSUFJdEFBQkJMa2NOQUVFQ0lRTUNRQUpBSUFJdEFBRkJMbXNPQWdBQkFnc2dBaTBBQWtFdlJ3MEJJQUV0QUFCRkRRTWdBUkNvQlNJRFFRRnFJQUVnQXhzaUEwSFprQUVROGdORkRRRWdBMEhZa0FFUThnTkZEUUVnQXlBQklBTkphMEVBT2dBQVFRTWhBd3NnQWlBRGFpRUNEQUVMQ3lBQkxRQUFSUTBBSUFFUVB5QUJha0V2T3dBQUN5QUJFRDhnQVdvZ0FoRGxCU0FCSVFJTUFnc2dBQ0FCSUFJZ0JDZ0NzQUVnQXhFSEFBc2lBa1VOQVFzZ0FDQUNFS29CSWdGRkJFQWdBQ2dDRUNJQVFSQnFJQUlnQUNnQ0JCRUFBQXdCQ3lBQUlBRVE0UVVpQXdSQUlBQW9BaEFpQkVFUWFpQUNJQVFvQWdRUkFBQWdBQ0FCRUJNTUFnc2dBQ0FCRUJNZ0JDZ0NyQUVpQVVVRVFDQUdJQUkyQWdBZ0FFSHFsZ0VnQmhER0FpQUFLQUlRSWdCQkVHb2dBaUFBS0FJRUVRQUFEQUVMSUFBZ0FpQUVLQUt3QVNBQkVRRUFJUU1nQUNnQ0VDSUFRUkJxSUFJZ0FDZ0NCQkVBQUF3QkMwRUFJUU1MSUFaQkVHb2tBQ0FEQ3pVQkFYOGdBQ2dDZ0FJaUIwVUVRQ0FBUVpEMkFFRUFFQlZDZ0lDQWdPQUFEd3NnQUNBQklBSWdBeUFFSUFVZ0JpQUhFVG9BQy80RUFRbC9Jd0JCRUdzaUJpUUFBbjlCZnlBQUlBWkJER29nQWtFQUVNSUNEUUFhSUFFb0FoQXRBRE5CQ0hGRkJFQWdBQ0FEUVRBUXdBSU1BUXNnQVMwQUJVRUljUVJBSUFZb0Fnd2lBeUFCS0FJb0lnVkpCRUFnQXlFRUEwQWdCQ0FGUmtVRVFDQUFJQUVvQWlRZ0JFRURkR29wQXdBUUR5QUVRUUZxSVFRTUFRc0xJQUVnQXpZQ0tBc2dBU2dDRkNBRFFRQk9CSDRnQTYwRlFvQ0FnSURBZmlBRHVMMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzM0F3QkJBUXdCQ3lBQUlBWkJCR29nQVNnQ0ZDa0RBQkIzR2lBR0tBSU1JZ2doQlFKQUlBWW9BZ1FpQnlBSVRRMEFJQUVvQWhBaUNpZ0NJQ0lFSUFjZ0NHdFBCRUFEUUNBSElnVWdDRTBOQWlBQUlBRWdBQ0FGUVFGcklnY1FxUVVpQ1JENUF5RUVJQUFnQ1JBVElBUU5BQXdDQ3dBTElBcEJNR29pQnlFTUEwQWdCQ0FKVEFSQUEwQWdCQ0FMVEEwREFrQWdCeWdDQkNJRVJRMEFJQUFnQmtFSWFpQUVFS3dCUlEwQUlBWW9BZ2dnQlVrTkFDQUFJQUVnQnlnQ0JCRDVBeG9nQVNnQ0VDSUtJQXRCQTNScVFUQnFJUWNMSUFkQkNHb2hCeUFMUVFGcUlRc2dDaWdDSUNFRURBQUxBQVVDUUNBTUtBSUVJZ1JGRFFBZ0FDQUdRUWhxSUFRUXJBRkZEUUFnQmlnQ0NDSUVJQVZKRFFBZ0JTQUVRUUZxSUF3dEFBTkJCSEViSVFVTElBeEJDR29oRENBSlFRRnFJUWtnQ2lnQ0lDRUVEQUVMQUFzQUN5QUFJQUVvQWhRZ0JVRUFUZ1IrSUFXdEJVS0FnSUNBd0g0Z0JiaTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVDQkJBU0FGSUFoTkRRQWFJQUFnQTBIdDZRQVFid3NoQkNBR1FSQnFKQUFnQkF0c0FnSi9BWHdqQUVFUWF5SUNKQUFDZnlBQlFpQ0lweUlEQkVCQkFDQURRUXRxUVJKSkRRRWFDMEYvSUFBZ0FrRUlhaUFCRUVJTkFCb2dBaXNEQ0NJRXZVS0FnSUNBZ0lDQStQOEFnMEtBZ0lDQWdJQ0ErUDhBVWlBRW5DQUVZWEVMSVFBZ0FrRVFhaVFBSUFBTDRBTUNCSDhDZmlBQlFRQklCRUFnQVVILy8vLy9CM0d0RHdzQ1FDQUJJQUFvQWhBaUJDZ0NMRWtFUUFKK0FrQWdCQ2dDT0NBQlFRSjBhaWdDQUNJQ0tRSUVJZ1pDZ0lDQWdJQ0FnSUJBZzBLQWdJQ0FnSUNBZ01BQVVnMEFJQUpCRUdvaEJDQUdwMEgvLy8vL0IzRWhCUUpBSUFaQ2dJQ0FnQWlEVUVVRVFDQUZSUTBDQWtBZ0JDSUJMd0VBSWdOQkxVY05BQ0FDUVJKcUlRRWdBaThCRWlJRFFUQkhEUUJDZ0lDQWdNRCsvd01nQlVFQ1JnMEVHZ3NnQTBFNmEwRjFTdzBCSUFOQnlRQkhJQVFnQlVFQmRHb2dBV3RCRUVkeURRSWdBVUVDYWtHZ3dBRkJEaEJoUlEwQkRBSUxJQVZGRFFFQ1FDQUVJZ0V0QUFBaUEwRXRSdzBBSUFKQkVXb2hBU0FDTFFBUklnTkJNRWNOQUVLQWdJQ0F3UDcvQXlBRlFRSkdEUU1hQ3lBRFFUcHJRWFZMRFFBZ0EwSEpBRWNnQkNBRmFpQUJhMEVJUjNJTkFTQUJRUUZxUWZZY1FRY1FZUTBCQ3lBQ0lBSW9BZ0JCQVdvMkFnQWdBQ0FDclVLQWdJQ0FrSCtFRUkwQklnWkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF5QUFJQVlRS0NJSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUdFQThnQnc4TElBSWdCNmNRZ3dJaEFTQUFJQWNRRHlBQlJRMERJQUFnQmhBUEMwS0FnSUNBTUFzUEMwSHYzd0JCcnZ3QVFka1lRZktMQVJBQUFBc2dCZ3ZiQVFFRGZ3SkFJQUFnQVNnQ0dFRUJha0VDZENJQ0lBRW9BaHhCQTNScVFUQnFJZ01RS1NJRVJRUkFRUUFoQWd3QkN5QUVJQUVnQVNnQ0dFRi9jMEVDZEdvZ0F4QWZJQUpxSWdKQkFUWUNBQ0FBS0FJUUlRRWdBa0VDT2dBRUlBRW9BbEFpQXlBQ1FRaHFJZ1EyQWdRZ0FpQUJRZEFBYWpZQ0RDQUNJQU0yQWdnZ0FTQUVOZ0pRUVFBaEFTQUNRUUE2QUJBZ0FpZ0NMQ0lEQkVBZ0F5QURLQUlBUVFGcU5nSUFDeUFDUVRCcUlRTURRQ0FCSUFJb0FpQlBEUUVnQUNBREtBSUVFQmdhSUFOQkNHb2hBeUFCUVFGcUlRRU1BQXNBQ3lBQ0Mrb0JBZ2QvQVg0Z0FDSURRZEFBYWlFR0lBRkJHR29oQnlBQktBSWNJUUFEUUNBQUlBZEdSUVJBSUFBb0FnUWhDQ0FBUVFKckx3RUFJUUlDUUFKQUlBQkJBMnNpQkMwQUFDSUZRUUp4QkVBZ0FTZ0NFQ0FDUVFOMGFpa0RBQ0lKUWlDSXAwRjBTdzBCREFJTElBRW9BaFFnQWtFRGRHb3BBd0FpQ1VJZ2lLZEJkVWtOQVFzZ0NhY2lBaUFDS0FJQVFRRnFOZ0lBSUFRdEFBQWhCUXNnQUNBSk53TVFJQUFnQUVFUWFqWUNDQ0FFSUFWQkFYSTZBQUFnQUVFRWEwRURPZ0FBSUFNb0FsQWlBaUFBTmdJRUlBQWdCallDQkNBQUlBSTJBZ0FnQXlBQU5nSlFJQWdoQUF3QkN3c0xvd0VDQVg4Q2ZpTUFRUkJySWdNa0FDQURJQUUzQXdnQ2Z3SkFJQUpDZ0lDQWdIQmFCRUFnQUNBQ1Fka0JJQUpCQUJBVUlnVkNnSUNBZ0hDRElnUkNnSUNBZ0NCUklBUkNnSUNBZ0RCUmNrVUVRRUYvSUFSQ2dJQ0FnT0FBVVEwREdpQUFJQUFnQlNBQ1FRRWdBMEVJYWhBdkVDWU1Bd3NnQUNBQ0VEZ05BUXNnQUVIKzh3QkJBQkFWUVg4TUFRc2dBQ0FCSUFJUXZnVUxJUUFnQTBFUWFpUUFJQUFMS3dFQmZ5QUJRUkJySWdNZ0FDQURLUU1BSUFGQkNHc3BBd0FRd0FVZ0FrZXRRb0NBZ0lBUWhEY0RBQXVWQ2dNRWZnbC9BbndqQUVFUWF5SUtKQUJCcWdGQnFRRWdBaHNoRGlBQlFRaHJJZzhwQXdBaEF5QUJRUkJySWd3cEF3QWhCUUpBQWtBQ1FBSkFBMEJCQnlBRFFpQ0lweUlCSUFGQkIydEJia2tiSVFjZ0JVTC8vLy8vRDRNaEJnSkFBa0FDUUFKQUFrQUNRQU5BQWtCQkJ5QUZJZ1JDSUlpbklnRWdBVUVIYTBGdVNSc2lBVUVMYWlJSVFSSkxRUUVnQ0hSQmg1QVFjVVZ5RFFBZ0IwRUxhaUlJUVJKTFFRRWdDSFJCaDVBUWNVVnlEUUFnQVNBSGNrVUVRQ0FFcHlBRHAwWWhDUXdNQ3dKQUFud0NmQ0FCUVFkR0JFQWdCMEVBSUFkQkIwY2JEUU1nQkVLQWdJQ0F3SUdBL1A4QWZMOGlFQ0FIUVFkR0RRRWFJQU9udHd3Q0N5QUhRUWRISUFGeURRSWdCS2UzQ3lFUUlBTkNnSUNBZ01DQmdQei9BSHkvQ3lFUklCQWdFV0VoQ1F3TUN5QUJRWFZISUFkQmRVZHhSUVJBSUFCQnFRRWdCQ0FESUFBb0FoQW9BdHdDRVJ3QUlnbEJBRTROREF3TEN5QUFLQUlRSVFnZ0FVRjNSeUFIUVhkSGNVVUVRQ0FBUWFrQklBUWdBeUFJS0FMQUFoRWNBQ0lKUVFCT0RRd01Dd3NnQUVHcEFTQUVJQU1nQ0NnQ3BBSVJIQUFpQ1VFQVRnMExEQW9MSUFFZ0IwWUVRQUpBSUFkQmYwY05BQ0FBSUFwQkNHb2dCQ0FESUE1QkFFRUNFSVVDSWdGRkRRQWdBQ0FFRUE4Z0FDQURFQThnQVVFQVNBMExJQXdnQ2lrRENEY0RBRUVBSVFFTURRc2dBQ0FFSUFOQkFCQzhBU0VKREFzTFFRRWhDU0FCUVFKR0lBZEJBMFp4SUFkQkFrWWdBVUVEUm5GeURRb0NRQUpBSUFGQmVVWUVRRUVBSVFsQmVTRUxJQWNpRFNFSUFrQWdCMEVMYWc0TkFnSUNCd2dIQndjSEJ3Y0NCUUFMSUFkQkIwWU5BUXdHQ3lBSFFYbEhEUUZCZVNFTklBWWhCU0FCSVFnQ1FBSkFJQUZCQVdvT0NRa0JCQWdJQ0FnSUFRQUxJQUZCQzJwQkEwa05BQXdIQ3lBQlFYWkdJUWxCZVNFSEN3SkFBa0FnQ1VVZ0IwRjJSM0VOQUNBQUtBSVFLQUtNQVNJSUJFQWdDQzBBS0VFRWNRMEJDd0pBQWtBZ0FVRjVSd1JBSUFRaEJRd0JDeUFBSUFRUXZBSWlCVUtBZ0lDQWNJTkNnSUNBZ09CK1VnMEJDeUFIUVhsSERRSWdBQ0FERUx3Q0lnTkNnSUNBZ0hDRFFvQ0FnSURnZmxFTkFnc2dBQ0FGRUE4Z0FDQURFQTlCQUNFSkRBMExJQUFnQkJCc0lnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkNDQUFJQU1RYkNJRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFvTElBQWdCU0FERU1BRklRa01Dd3NnQmlFRklBRkJBVVlOQUFzZ0IwRUJSdzBCQ3lBRFF2Ly8vLzhQZ3lFRElBUWhCUXdGQ3lBQklndEJmMGNOQUNBSFFRdHFJZ0ZCRWsxQkFFRUJJQUYwUVllUUVIRWJEUUpCZnlFTElBZEJmbkZCZUVZTkFnc2dCMEYvUndSL0lBY0ZJQXRCZm5GQmVFWWdDMEVMYWlJQlFSSk5RUUJCQVNBQmRFR0hrQkJ4RzNJTkFrRi9DeUVOSUFzaENBc0Nmd0pBSUFSQ2dJQ0FnSEJVRFFBZ0JLY3NBQVZCQUU0TkFFRUJJQTFCZm5GQkFrWU5BUm9MUVFBaEFTQURRb0NBZ0lCd1dnUi9JQU9uTEFBRlFRQklCVUVBQ3lBSVFYNXhRUUpHY1FzaENTQUFJQVFRRHlBQUlBTVFEd3dGQ3lBQUlBcEJDR29nQkNBRElBNUJBRUVDRUlVQ0lnZ0VRQ0FBSUFRUUR5QUFJQU1RRDBFQUlRRWdDRUVBU0EwRUlBd2dDaWtEQ0RjREFBd0dDeUFBSUFSQkFoQ2FBU0lGUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBRFFRSVFtZ0VpQTBLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBCREFJTEN5QURJUVVMSUFBZ0JSQVBDeUFNUW9DQWdJQXdOd01BSUE5Q2dJQ0FnREEzQXdCQmZ5RUJEQUVMSUF3Z0FpQUpSNjFDZ0lDQWdCQ0VOd01BUVFBaEFRc2dDa0VRYWlRQUlBRUxoQWdDQW40RmZ5TUFRU0JySWdZa0FFRUhJQUZCQ0dzaUJ5a0RBQ0lEUWlDSXB5SUZJQVZCQjJ0QmJra2JJUVFDUUFKQUFrQUNRRUVISUFGQkVHc2lCU2tEQUNJQ1FpQ0lweUlCSUFGQkIydEJia2tiSWdGQkIwY2dCRUVIUjNKRkJFQWdCVUtBZ0lDQXdINGdBa0tBZ0lDQXdJR0EvUDhBZkw4Z0EwS0FnSUNBd0lHQS9QOEFmTCtndlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJOd01BREFFTElBRkJmMGNnQkVGL1IzRUVmeUFCQlFKQUFrQWdBVUYvUmdSQUlBUkJCMm9pQ0VFS1MwRUJJQWgwUVlFTWNVVnlEUUVMSUFSQmYwY05BU0FCUVFkcUlnRkJDa3NOQUVFQklBRjBRWUVNY1EwQkN5QUFJQVpCR0dvZ0FpQURRWjBCUVFCQkFoQ0ZBaUlCUlEwQUlBQWdBaEFQSUFBZ0F4QVBJQUZCQUVnTkJDQUZJQVlwQXhnM0F3QU1BZ3NnQUNBQ1FRSVFtZ0VpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBZ0EwRUNFSm9CSWdOQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUlBSVFEd3dFQzBFSElBTkNJSWluSWdFZ0FVRUhhMEZ1U1JzaEJFRUhJQUpDSUlpbklnRWdBVUVIYTBGdVNSc0xRWGxISUFSQmVVZHhSUVJBSUFVZ0FDQUNJQU1ReEFJaUFqY0RBRUVBSVFFZ0FrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRERBUUxJQUFnQWhCc0lnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQU1RYkNJRFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUNFQThNQXd0QkJ5QUNRaUNJcHlJQklBRkJCMnRCYmtrYklnRkJCeUFEUWlDSXB5SUVJQVJCQjJ0QmJra2JJZ1J5UlFSQUlBVUNmaUFEeENBQ3hId2lBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDemNEQUF3QkN5QUJRWFZISUFSQmRVZHhSUVJBSUFCQm5RRWdCU0FDSUFNZ0FDZ0NFQ2dDMkFJUkdnQU5Bd3dCQ3lBQlFYZEhJQVJCZDBkeFJRUkFJQUJCblFFZ0JTQUNJQU1nQUNnQ0VDZ0N2QUlSR2dCRkRRRU1Bd3NDUUNBQlFYWkhJQVJCZGtkeFJRUkFJQUFvQWhBaEFRd0JDeUFBSUFaQkVHb2dBaEJ1QkVBZ0FDQURFQThNQkFzZ0FDQUdRUWhxSUFNUWJnMERBa0FnQUNnQ0VDSUJLQUtNQVNJRVJRMEFJQVF0QUNoQkJIRkZEUUFnQmlzREVCQzlBa1VOQUNBR0t3TUlFTDBDRFFFTElBVkNnSUNBZ01CK0lBWXJBeEFnQmlzRENLQzlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzM0F3QU1BUXNnQUVHZEFTQUZJQUlnQXlBQktBS2dBaEVhQUEwQ0MwRUFJUUVNQWdzZ0FDQURFQThMSUFWQ2dJQ0FnREEzQXdBZ0IwS0FnSUNBTURjREFFRi9JUUVMSUFaQklHb2tBQ0FCQzVBREFRbC9Jd0JCTUdzaUJ5UUFBa0FnQWtLQWdJQ0FjRlFOQUVFVElRVUNRQ0FDcHlJS0xRQUZRUVJ4UlEwQUlBQW9BaEFvQWtRZ0NpOEJCa0VZYkdvb0FoUWlDRVVOQUVFRFFSTWdDQ2dDQkJzaEJRdEJmeUVKSUFBZ0IwRXNhaUFIUVNocUlBb2dCUkNPQVEwQUlBT25RUUFnQTBMLy8vLy9iMVliSVF3Z0J5Z0NMQ0VJSUFjb0FpZ2hDeUFGUVE5TElRMUJBQ0VGQWtBRFFDQUZJQXRIQkVBQ1FBSkFJQXhGRFFBZ0FFRUFJQXdnQ0NBRlFRTjBhaWdDQkJCTUlnWkZEUUFnQmtFQVRnMEJEQVFMSUExRkJFQWdBQ0FIUVFocUlBb2dDQ0FGUVFOMGFpZ0NCQkJNSWdaQkFFZ05CQ0FHUlEwQklBY29BZ2doQmlBQUlBZEJDR29RU0NBR1FRUnhSUTBCQ3lBQUlBSWdDQ0FGUVFOMGFpSUdLQUlFSUFKQkFCQVVJZ05DZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BeUFHS0FJRUlRWUNmeUFFQkVBZ0FDQUJJQVlnQXhCRkRBRUxJQUFnQVNBR0lBTkJCeEFaQzBFQVNBMERDeUFGUVFGcUlRVU1BUXNMSUFBZ0NDQUxFRnBCQUNFSkRBRUxJQUFnQ0NBTEVGb0xJQWRCTUdva0FDQUpDNlVCQVFGK0FrQUNRQUorSUFSQkJIRUVRRUV0SVFJZ0FDQUJFRmtNQVF0QkxDRUNJQUFnQVJBbEN5SUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FDRUhZaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQkJFQkFwSWdJRVFDQUNRUUEyQWd3Z0FpQUVRUU54TmdJSUlBSWdBVGNEQUNBRlFvQ0FnSUJ3VkEwQ0lBV25JQUkyQWlBTUFnc2dBQ0FGRUE4TElBQWdBUkFQUW9DQWdJRGdBQThMSUFVTHhBRUJCSDhnQWFjaUJTQUNOZ0lnSUFWQ0FEY0NKQUpBSUFJb0Fqd2lCa1VOQUFKQUlBQWdCa0VDZEJCZklnaEZEUUFnQlNBSU5nSWtRUUFoQlFOQUlBVWdBaWdDUEU0TkFpQUNLQUlrSUFWQkEzUnFJZ2N2QVFJaEJnSkFJQWN0QUFBaUIwRUJjUVJBSUFBZ0JDQUdJQWRCQVhaQkFYRVFpd1FpQmcwQkRBTUxJQU1nQmtFQ2RHb29BZ0FpQmlBR0tBSUFRUUZxTmdJQUN5QUlJQVZCQW5ScUlBWTJBZ0FnQlVFQmFpRUZEQUFMQUFzZ0FDQUJFQTlDZ0lDQWdPQUFJUUVMSUFFTGlBRUJBbjRnQUNBQkVDMGhBZ0pBSUFGQkFFZ05BQ0FBS0FJUUtBSTRJQUZCQW5ScUtBSUFLUUlFSWdOQ2dJQ0FnSUNBZ0lCQWcwS0FnSUNBZ0lDQWdJQi9VaUFEUW9DQWdJRHcvLy8vUDROQ0FGSWdBMEtBZ0lDQWdJQ0FnRUJVY25FZ0EwTC8vLy8vRDROQ2dJQ0FnQWhSY2cwQUlBQkJub0FCSUFKQm5JQUJFTDRCSVFJTElBSUxaQUVDZndKQUFrQWdBVUtBZ0lDQWNGUU5BQ0FCRU1ZRkRRQkJmeUVESUFBZ0FoQXhJZ1JGRFFFZ0FDQUVFTmNGSVFJZ0FDQUVFQk1nQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCSUFBZ0FVRTJJQUpCQVJBWlFRQklEUUVMUVFBaEF3c2dBd3MxQUFKQUlBSkZJQUZDZ0lDQWdIQlVjZzBBSUFFUXhnVU5BQ0FBSUFGQk5pQUFJQUlRTFVFQkVCbEJBRTROQUVGL0R3dEJBQXNNQUNBQUlBRkJ1eVlRandFTGFBSUJmd0YrQWtBZ0FDQUJRZWtBSUFGQkFCQVVJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FBSUFRUUppRURJQUFnQVVIQUFDQUJRUUFRRkNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTFFRQWhBMEtBZ0lDQTRBQWhBUXNnQWlBRE5nSUFJQUVMRkFFQmZpQUFJQUVRSlNFQ0lBQWdBUkFQSUFJTDlnRUJCSDhnQUNnQ3lBRWlCU2dDRUNJRVFUQnFJUVlnQkNBRUtBSVlJQUZ4UVg5elFRSjBhaWdDQUNFRUFrQURRQ0FFUlEwQklBRWdCaUFFUVFGcklnZEJBM1JxSWdRb0FnUkhCRUFnQkNnQ0FFSC8vLzhmY1NFRURBRUxDeUFGS0FJVUlBZEJBM1JxSVFVQ1FDQURRUUZHRFFBZ0JUVUNCRUlnaGtLQWdJQ0F3QUJSQkVBZ0FDQUNFQThnQUNBRUtBSUVFTmtCUVg4UEN5QUVMUUFEUVFoeERRQWdBQ0FDRUE4Z0FDQUJRYzRkRUk4QlFYOFBDeUFBSUFVZ0FoQWdRUUFQQ3lBQUlBQXBBOEFCSUFFZ0FnSi9JQUFvQWhBb0Fvd0JJZ01FUUVHQWdBWWdBeWdDS0VFQmNRMEJHZ3RCZ0lBQ0N4RFFBUXVLQVFFQmZ3SkFJQUpDZ0lDQWdIQ0RRb0NBZ0lDUWYxRWdBMEtBZ0lDQWNJTkNnSUNBZ0pCL1VYRkZCRUFnQUVHTjl3QkJBQkFWREFFTElBQWdBVUVTRUdVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBR25JZ1FnQXo0Q0pDQUVJQUkrQWlBZ0FDQUJRZFVBUWdCQkFoQVpHaUFCRHdzZ0FDQURFQThnQUNBQ0VBOUNnSUNBZ09BQUN3MEFJQUFnQVVIT2xRRVEvd01MWndFQmZ3SkFJQUZCQUU0RVFDQUFLQUlRSWdJb0Fpd2dBVTBOQVNBQ0tBSTRJQUZCQW5ScUtBSUFJZ0VnQVNnQ0FFRUJhallDQUNBQUlBRkJCQkNBQkE4TFFmS1JBVUd1L0FCQnpoZEJtZElBRUFBQUMwSFozd0JCcnZ3QVFjOFhRWm5TQUJBQUFBdEVBUUYvSUFCQitBRnFJUUlnQUVIMEFXb2hBQU4vSUFBZ0FpZ0NBQ0lDUmdSQVFRQVBDeUFCSUFKQkJHc29BZ0JHQkg4Z0FrRUlhd1VnQWtFRWFpRUNEQUVMQ3d0U0FnSi9BWDRDUUNBQUtBSVFLQUtNQVNJQlJRMEFJQUVwQXdnaUEwS0FnSUNBY0ZRTkFDQURweUlCTHdFR0VPNEJSUTBBSUFFb0FpQWlBUzBBRWtFRWNVVU5BQ0FBSUFFb0FrQVFHQ0VDQ3lBQ0M2b1BBZ1YvRDM0akFFSFFBbXNpQlNRQUlBUkMvLy8vLy8vL1A0TWhDeUFDUXYvLy8vLy8veitESVFvZ0FpQUVoVUtBZ0lDQWdJQ0FnSUIvZ3lFTklBUkNNSWluUWYvL0FYRWhDQUpBQWtBZ0FrSXdpS2RCLy84QmNTSUpRZi8vQVd0QmdvQitUd1JBSUFoQi8vOEJhMEdCZ0g1TERRRUxJQUZRSUFKQy8vLy8vLy8vLy8vL0FJTWlERUtBZ0lDQWdJREEvLzhBVkNBTVFvQ0FnSUNBZ01ELy93QlJHMFVFUUNBQ1FvQ0FnSUNBZ0NDRUlRME1BZ3NnQTFBZ0JFTC8vLy8vLy8vLy8vOEFneUlDUW9DQWdJQ0FnTUQvL3dCVUlBSkNnSUNBZ0lDQXdQLy9BRkViUlFSQUlBUkNnSUNBZ0lDQUlJUWhEU0FESVFFTUFnc2dBU0FNUW9DQWdJQ0FnTUQvL3dDRmhGQUVRQ0FESUFKQ2dJQ0FnSUNBd1AvL0FJV0VVQVJBUWdBaEFVS0FnSUNBZ0lEZy8vOEFJUTBNQXdzZ0RVS0FnSUNBZ0lEQS8vOEFoQ0VOUWdBaEFRd0NDeUFESUFKQ2dJQ0FnSUNBd1AvL0FJV0VVQVJBUWdBaEFRd0NDeUFCSUF5RVVBUkFRb0NBZ0lDQWdPRC8vd0FnRFNBQ0lBT0VVQnNoRFVJQUlRRU1BZ3NnQWlBRGhGQUVRQ0FOUW9DQWdJQ0FnTUQvL3dDRUlRMUNBQ0VCREFJTElBeEMvLy8vLy8vL1AxZ0VRQ0FGUWNBQ2FpQUJJQW9nQVNBS0lBcFFJZ1liZVNBR1FRWjByWHluSWdaQkQyc1FaMEVRSUFacklRWWdCU2tEeUFJaENpQUZLUVBBQWlFQkN5QUNRdi8vLy8vLy96OVdEUUFnQlVHd0Ftb2dBeUFMSUFNZ0N5QUxVQ0lIRzNrZ0IwRUdkSzE4cHlJSFFROXJFR2NnQmlBSGFrRVFheUVHSUFVcEE3Z0NJUXNnQlNrRHNBSWhBd3NnQlVHZ0Ftb2dDMEtBZ0lDQWdJREFBSVFpRWtJUGhpQURRakdJaENJQ1FnQkNnSUNBZ0xEbXZJTDFBQ0FDZlNJRVFnQVFaaUFGUVpBQ2FrSUFJQVVwQTZnQ2ZVSUFJQVJDQUJCbUlBVkJnQUpxSUFVcEE1Z0NRZ0dHSUFVcEE1QUNRaitJaENJRVFnQWdBa0lBRUdZZ0JVSHdBV29nQkVJQVFnQWdCU2tEaUFKOVFnQVFaaUFGUWVBQmFpQUZLUVA0QVVJQmhpQUZLUVB3QVVJL2lJUWlCRUlBSUFKQ0FCQm1JQVZCMEFGcUlBUkNBRUlBSUFVcEErZ0JmVUlBRUdZZ0JVSEFBV29nQlNrRDJBRkNBWVlnQlNrRDBBRkNQNGlFSWdSQ0FDQUNRZ0FRWmlBRlFiQUJhaUFFUWdCQ0FDQUZLUVBJQVgxQ0FCQm1JQVZCb0FGcUlBSkNBQ0FGS1FPNEFVSUJoaUFGS1FPd0FVSS9pSVJDQVgwaUFrSUFFR1lnQlVHUUFXb2dBMElQaGtJQUlBSkNBQkJtSUFWQjhBQnFJQUpDQUVJQUlBVXBBNmdCSUFVcEE2QUJJZ3dnQlNrRG1BRjhJZ1FnREZTdGZDQUVRZ0ZXclh4OVFnQVFaaUFGUVlBQmFrSUJJQVI5UWdBZ0FrSUFFR1lnQmlBSklBaHJhaUVHQW44Z0JTa0RjQ0lUUWdHR0lnNGdCU2tEaUFFaUQwSUJoaUFGS1FPQUFVSS9pSVI4SWhCQzUrd0FmU0lVUWlDSUlnSWdDa0tBZ0lDQWdJREFBSVFpRlVJQmhpSVdRaUNJSWdSK0loRWdBVUlCaGlJTVFpQ0lJZ3NnRUNBVVZxMGdEaUFRVnEwZ0JTa0RlRUlCaGlBVFFqK0loQ0FQUWorSWZIeDhRZ0Y5SWhOQ0lJZ2lFSDU4SWc0Z0VWU3RJQTRnRGlBVFF2Ly8vLzhQZ3lJVElBRkNQNGdpRnlBS1FnR0doRUwvLy8vL0Q0TWlDbjU4SWc1V3JYd2dCQ0FRZm53Z0JDQVRmaUlSSUFvZ0VINThJZzhnRVZTdFFpQ0dJQTlDSUlpRWZDQU9JQTRnRDBJZ2hud2lEbGF0ZkNBT0lBNGdGRUwvLy8vL0Q0TWlGQ0FLZmlJUklBSWdDMzU4SWc4Z0VWU3RJQThnRHlBVElBeEMvdi8vL3crREloRitmQ0lQVnExOGZDSU9WcTE4SUE0Z0JDQVVmaUlZSUJBZ0VYNThJZ1FnQWlBS2Zud2lDaUFMSUJOK2ZDSVFRaUNJSUFvZ0VGYXRJQVFnR0ZTdElBUWdDbGF0Zkh4Q0lJYUVmQ0lFSUE1VXJYd2dCQ0FQSUFJZ0VYNGlBaUFMSUJSK2ZDSUxRaUNJSUFJZ0MxYXRRaUNHaEh3aUFpQVBWSzBnQWlBUVFpQ0dmQ0FDVksxOGZDSUNJQVJVclh3aUJFTC8vLy8vLy8vL0FGZ0VRQ0FXSUJlRUlSVWdCVUhRQUdvZ0FpQUVJQU1nRWhCbUlBRkNNWVlnQlNrRFdIMGdCU2tEVUNJQlFnQlNyWDBoQ2tJQUlBRjlJUXNnQmtIKy93QnFEQUVMSUFWQjRBQnFJQVJDUDRZZ0FrSUJpSVFpQWlBRVFnR0lJZ1FnQXlBU0VHWWdBVUl3aGlBRktRTm9mU0FGS1FOZ0lneENBRkt0ZlNFS1FnQWdESDBoQ3lBQklRd2dCa0gvL3dCcUN5SUdRZi8vQVU0RVFDQU5Rb0NBZ0lDQWdNRC8vd0NFSVExQ0FDRUJEQUVMQW40Z0JrRUFTZ1JBSUFwQ0FZWWdDMEkvaUlRaENpQUVRdi8vLy8vLy96K0RJQWF0UWpDR2hDRU1JQXRDQVlZTUFRc2dCa0dQZjB3RVFFSUFJUUVNQWdzZ0JVRkFheUFDSUFSQkFTQUdheENPQWlBRlFUQnFJQXdnRlNBR1FmQUFhaEJuSUFWQklHb2dBeUFTSUFVcEEwQWlBaUFGS1FOSUlnd1FaaUFGS1FNNElBVXBBeWhDQVlZZ0JTa0RJQ0lCUWorSWhIMGdCU2tETUNJRUlBRkNBWVlpQVZTdGZTRUtJQVFnQVgwTElRUWdCVUVRYWlBRElCSkNBMElBRUdZZ0JTQURJQkpDQlVJQUVHWWdEQ0FDSUFJZ0F5QUNRZ0dESWdFZ0JId2lBMVFnQ2lBQklBTldyWHdpQVNBU1ZpQUJJQkpSRzYxOElnSldyWHdpQkNBQ0lBSWdCRUtBZ0lDQWdJREEvLzhBVkNBRElBVXBBeEJXSUFFZ0JTa0RHQ0lFVmlBQklBUlJHM0d0ZkNJQ1ZxMThJZ1FnQWlBRVFvQ0FnSUNBZ01ELy93QlVJQU1nQlNrREFGWWdBU0FGS1FNSUlnTldJQUVnQTFFYmNhMThJZ0VnQWxTdGZDQU5oQ0VOQ3lBQUlBRTNBd0FnQUNBTk53TUlJQVZCMEFKcUpBQUx5RElERVg4SGZnRjhJd0JCRUdzaUVDUUFJd0JCb0FGcklnOGtBQ0FQSUFBMkFqd2dEeUFBTmdJVUlBOUJmellDR0NBUFFSQnFJZ0lRbWdRakFFRXdheUlPSkFBRFFBSi9JQUlvQWdRaUFDQUNLQUpvUndSQUlBSWdBRUVCYWpZQ0JDQUFMUUFBREFFTElBSVFWUXNpQlJDT0JnMEFDMEVCSVFNQ1FBSkFJQVZCSzJzT0F3QUJBQUVMUVg5QkFTQUZRUzFHR3lFRElBSW9BZ1FpQUNBQ0tBSm9Sd1JBSUFJZ0FFRUJhallDQkNBQUxRQUFJUVVNQVFzZ0FoQlZJUVVMQWtBQ1FBSkFBMEFnQmtIc0hHb3NBQUFnQlVFZ2NrWUVRQUpBSUFaQkJrc05BQ0FDS0FJRUlnQWdBaWdDYUVjRVFDQUNJQUJCQVdvMkFnUWdBQzBBQUNFRkRBRUxJQUlRVlNFRkN5QUdRUUZxSWdaQkNFY05BUXdDQ3dzZ0JrRURSd1JBSUFaQkNFWU5BU0FHUVFSSkRRSWdCa0VJUmcwQkN5QUNLUU53SWhKQ0FGa0VRQ0FDSUFJb0FnUkJBV3MyQWdRTElBWkJCRWtOQUNBU1FnQlRJUUFEUUNBQVJRUkFJQUlnQWlnQ0JFRUJhellDQkFzZ0JrRUJheUlHUVFOTERRQUxDMElBSVJJakFFRVFheUlGSkFBQ2ZpQURza01BQUlCL2xMd2lBMEgvLy8vL0IzRWlBRUdBZ0lBRWEwSC8vLy8zQjAwRVFDQUFyVUlaaGtLQWdJQ0FnSUNBd0Q5OERBRUxJQU90UWhtR1FvQ0FnSUNBZ01ELy93Q0VJQUJCZ0lDQS9BZFBEUUFhUWdBZ0FFVU5BQm9nQlNBQXJVSUFJQUJuSWdCQjBRQnFFR2NnQlNrREFDRVNJQVVwQXdoQ2dJQ0FnSUNBd0FDRlFZbi9BQ0FBYTYxQ01JYUVDeUVUSUE0Z0VqY0RBQ0FPSUJNZ0EwR0FnSUNBZUhHdFFpQ0doRGNEQ0NBRlFSQnFKQUFnRGlrRENDRVNJQTRwQXdBaEV3d0JDd0pBQWtBZ0JnMEFRUUFoQmdOQUlBWkI0TkVBYWl3QUFDQUZRU0J5UncwQkFrQWdCa0VCU3cwQUlBSW9BZ1FpQUNBQ0tBSm9Sd1JBSUFJZ0FFRUJhallDQkNBQUxRQUFJUVVNQVFzZ0FoQlZJUVVMSUFaQkFXb2lCa0VEUncwQUN3d0JDd0pBQWtBZ0JnNEVBQUVCQWdFTEFrQWdCVUV3UncwQUFuOGdBaWdDQkNJQUlBSW9BbWhIQkVBZ0FpQUFRUUZxTmdJRUlBQXRBQUFNQVFzZ0FoQlZDMEZmY1VIWUFFWUVRQ0FESVFCQkFDRURJd0JCc0FOcklnUWtBQUovQWtBZ0FpZ0NCQ0lGSUFJb0FtaEhCRUFnQWlBRlFRRnFOZ0lFSUFVdEFBQWhBd3dCQzBFQURBRUxRUUVMSVFZRFFBSkFBa0FDUUFKQUFuNENRQUpBQW44Z0JrVUVRQ0FDRUZVTUFRc2dBMEV3UndSQVFvQ0FnSUNBZ01EL1B5RVRJQU5CTGtZTkEwSUFEQVFMSUFJb0FnUWlCU0FDS0FKb1JnMEJRUUVoQ3lBQ0lBVkJBV28yQWdRZ0JTMEFBQXNoQTBFQklRWU1Cd3RCQVNFTERBUUxBbjhnQWlnQ0JDSURJQUlvQW1oSEJFQWdBaUFEUVFGcU5nSUVJQU10QUFBTUFRc2dBaEJWQ3lJRFFUQkdEUUZCQVNFTVFnQUxJUllNQVFzRFFDQVZRZ0Y5SVJWQkFTRU1BbjhnQWlnQ0JDSURJQUlvQW1oSEJFQWdBaUFEUVFGcU5nSUVJQU10QUFBTUFRc2dBaEJWQ3lJRFFUQkdEUUFMUVFFaEN3c0RRQ0FEUVNCeUlRb0NRQUpBSUFOQk1Hc2lCVUVLU1EwQUlBTkJMa1lnQ2tIaEFHdEJCa2x5UlFSQUlBTWhCZ3dGQzBFdUlRWWdBMEV1UncwQUlBd05CRUVCSVF3Z0VpRVZEQUVMSUFwQjF3QnJJQVVnQTBFNVNoc2hBd0pBSUJKQ0IxY0VRQ0FESUFkQkJIUnFJUWNNQVFzZ0VrSWNXQVJBSUFSQk1Hb2dBeEI1SUFSQklHb2dGeUFUUWdCQ2dJQ0FnSUNBd1AwL0VDNGdCRUVRYWlBRUtRTXdJQVFwQXpnZ0JDa0RJQ0lYSUFRcEF5Z2lFeEF1SUFRZ0JDa0RFQ0FFS1FNWUlCUWdGaEJ3SUFRcEF3Z2hGaUFFS1FNQUlSUU1BUXNnQTBVZ0NISU5BQ0FFUWRBQWFpQVhJQk5DQUVLQWdJQ0FnSUNBL3o4UUxpQUVRVUJySUFRcEExQWdCQ2tEV0NBVUlCWVFjQ0FFS1FOSUlSWkJBU0VJSUFRcEEwQWhGQXNnRWtJQmZDRVNRUUVoQ3dzZ0FpZ0NCQ0lESUFJb0FtaEhCSDhnQWlBRFFRRnFOZ0lFSUFNdEFBQUZJQUlRVlFzaEF3d0FDd0FMUVFBaEJnd0JDd3NDZmlBTFJRUkFBa0FnQWlrRGNFSUFVdzBBSUFJZ0FpZ0NCQ0lEUVFKck5nSUVJQXhGRFFBZ0FpQURRUU5yTmdJRUN5QUVRZUFBYWlBQXQwUUFBQUFBQUFBQUFLSVFxd0VnQkNrRFlDRVVJQVFwQTJnTUFRc2dFa0lIVndSQUlCSWhFd05BSUFkQkJIUWhCeUFUUWdGOEloTkNDRklOQUFzTEFrQUNRQUpBSUFaQlgzRkIwQUJHQkVBZ0FoQ0hCaUlUUW9DQWdJQ0FnSUNBZ0g5U0RRTWdBaWtEY0VJQVdRMEJEQUlMUWdBaEV5QUNLUU53UWdCVERRSUxJQUlnQWlnQ0JFRUJhellDQkF0Q0FDRVRDeUFIUlFSQUlBUkI4QUJxSUFDM1JBQUFBQUFBQUFBQW9oQ3JBU0FFS1FOd0lSUWdCQ2tEZUF3QkN5QVZJQklnREJ0Q0FvWWdFM3hDSUgwaUVrS3pDRmtFUUVHZzFBUkJ4QUEyQWdBZ0JFR2dBV29nQUJCNUlBUkJrQUZxSUFRcEE2QUJJQVFwQTZnQlFuOUMvLy8vLy8vL3YvLy9BQkF1SUFSQmdBRnFJQVFwQTVBQklBUXBBNWdCUW45Qy8vLy8vLy8vdi8vL0FCQXVJQVFwQTRBQklSUWdCQ2tEaUFFTUFRc2dFa0xzZFZrRVFDQUhRUUJPQkVBRFFDQUVRYUFEYWlBVUlCWkNBRUtBZ0lDQWdJREEvNzkvRUhBZ0ZDQVdRb0NBZ0lDQWdJRC9QeERwQlNFRElBUkJrQU5xSUJRZ0ZpQUVLUU9nQXlBVUlBTkJBRTRpQXhzZ0JDa0RxQU1nRmlBREd4QndJQkpDQVgwaEVpQUVLUU9ZQXlFV0lBUXBBNUFESVJRZ0IwRUJkQ0FEY2lJSFFRQk9EUUFMQ3dKK1FUVWdFa0xTQ0h3aUU2Y2lBMEVBSUFOQkFFb2JJQk5DTlZrYklnTkI4UUJQQkVBZ0JFR0FBMm9nQUJCNUlBUXBBNGdESVJVZ0JDa0RnQU1oRjBJQURBRUxJQVJCNEFKcVJBQUFBQUFBQVBBL1FaQUJJQU5yRU5vQkVLc0JJQVJCMEFKcUlBQVFlU0FFUWZBQ2FpQUVLUVBnQWlBRUtRUG9BaUFFS1FQUUFpSVhJQVFwQTlnQ0loVVFpUVlnQkNrRCtBSWhHQ0FFS1FQd0Fnc2hFeUFFUWNBQ2FpQUhJQWRCQVhGRklCUWdGa0lBUWdBUTdRRkJBRWNnQTBFZ1NYRnhJZ0JxRUlZQ0lBUkJzQUpxSUJjZ0ZTQUVLUVBBQWlBRUtRUElBaEF1SUFSQmtBSnFJQVFwQTdBQ0lBUXBBN2dDSUJNZ0dCQndJQVJCb0FKcUlCY2dGVUlBSUJRZ0FCdENBQ0FXSUFBYkVDNGdCRUdBQW1vZ0JDa0RvQUlnQkNrRHFBSWdCQ2tEa0FJZ0JDa0RtQUlRY0NBRVFmQUJhaUFFS1FPQUFpQUVLUU9JQWlBVElCZ1FnZ1FnQkNrRDhBRWlGU0FFS1FQNEFTSVRRZ0JDQUJEdEFVVUVRRUdnMUFSQnhBQTJBZ0FMSUFSQjRBRnFJQlVnRXlBU3B4Q0lCaUFFS1FQZ0FTRVVJQVFwQStnQkRBRUxRYURVQkVIRUFEWUNBQ0FFUWRBQmFpQUFFSGtnQkVIQUFXb2dCQ2tEMEFFZ0JDa0QyQUZDQUVLQWdJQ0FnSURBQUJBdUlBUkJzQUZxSUFRcEE4QUJJQVFwQThnQlFnQkNnSUNBZ0lDQXdBQVFMaUFFS1FPd0FTRVVJQVFwQTdnQkN5RVNJQTRnRkRjREVDQU9JQkkzQXhnZ0JFR3dBMm9rQUNBT0tRTVlJUklnRGlrREVDRVREQVFMSUFJcEEzQkNBRk1OQUNBQ0lBSW9BZ1JCQVdzMkFnUUxJQVVoQUNBRElRWkJBQ0VESXdCQmtNWUFheUlCSkFBQ1FBSi9BMEFnQUVFd1J3UkFBa0FnQUVFdVJ3MEVJQUlvQWdRaUFDQUNLQUpvUmcwQUlBSWdBRUVCYWpZQ0JDQUFMUUFBREFNTEJTQUNLQUlFSWdBZ0FpZ0NhRWNFZjBFQklRTWdBaUFBUVFGcU5nSUVJQUF0QUFBRlFRRWhBeUFDRUZVTElRQU1BUXNMSUFJUVZRc2hBRUVCSVFnZ0FFRXdSdzBBQTBBZ0VrSUJmU0VTQW44Z0FpZ0NCQ0lBSUFJb0FtaEhCRUFnQWlBQVFRRnFOZ0lFSUFBdEFBQU1BUXNnQWhCVkN5SUFRVEJHRFFBTFFRRWhBd3NnQVVFQU5nS1FCaUFPQW40Q1FBSkFBa0FnQUVFdVJpSUZJQUJCTUdzaURVRUpUWElFUUFOQUFrQWdCVUVCY1FSQUlBaEZCRUFnRXlFU1FRRWhDQXdDQ3lBRFJTRUZEQVFMSUJOQ0FYd2hFeUFIUWZ3UFRBUkFJQXNnRTZjZ0FFRXdSaHNoQ3lBQlFaQUdhaUFIUVFKMGFpSURJQW9FZnlBQUlBTW9BZ0JCQ214cVFUQnJCU0FOQ3pZQ0FFRUJJUU5CQUNBS1FRRnFJZ0FnQUVFSlJpSUFHeUVLSUFBZ0Iyb2hCd3dCQ3lBQVFUQkdEUUFnQVNBQktBS0FSa0VCY2pZQ2dFWkIzSThCSVFzTEFuOGdBaWdDQkNJQUlBSW9BbWhIQkVBZ0FpQUFRUUZxTmdJRUlBQXRBQUFNQVFzZ0FoQlZDeUlBUVM1R0lnVWdBRUV3YXlJTlFRcEpjZzBBQ3dzZ0VpQVRJQWdiSVJJZ0EwVWdBRUZmY1VIRkFFZHlSUVJBQWtBZ0FoQ0hCaUlVUW9DQWdJQ0FnSUNBZ0g5U0RRQkNBQ0VVSUFJcEEzQkNBRk1OQUNBQ0lBSW9BZ1JCQVdzMkFnUUxJQklnRkh3aEVnd0RDeUFEUlNFRklBQkJBRWdOQVFzZ0Fpa0RjRUlBVXcwQUlBSWdBaWdDQkVFQmF6WUNCQXNnQlVVTkFFR2cxQVJCSERZQ0FDQUNFSm9FUWdBaEUwSUFEQUVMSUFFb0FwQUdJZ0JGQkVBZ0FTQUd0MFFBQUFBQUFBQUFBS0lRcXdFZ0FTa0RBQ0VUSUFFcEF3Z01BUXNnRWlBVFVpQVRRZ2xWY2tVRVFDQUJRVEJxSUFZUWVTQUJRU0JxSUFBUWhnSWdBVUVRYWlBQktRTXdJQUVwQXpnZ0FTa0RJQ0FCS1FNb0VDNGdBU2tERUNFVElBRXBBeGdNQVFzZ0VrS2FCRmtFUUVHZzFBUkJ4QUEyQWdBZ0FVSGdBR29nQmhCNUlBRkIwQUJxSUFFcEEyQWdBU2tEYUVKL1F2Ly8vLy8vLzcvLy93QVFMaUFCUVVCcklBRXBBMUFnQVNrRFdFSi9Rdi8vLy8vLy83Ly8vd0FRTGlBQktRTkFJUk1nQVNrRFNBd0JDeUFTUXV0MVZ3UkFRYURVQkVIRUFEWUNBQ0FCUVpBQmFpQUdFSGtnQVVHQUFXb2dBU2tEa0FFZ0FTa0RtQUZDQUVLQWdJQ0FnSURBQUJBdUlBRkI4QUJxSUFFcEE0QUJJQUVwQTRnQlFnQkNnSUNBZ0lDQXdBQVFMaUFCS1FOd0lSTWdBU2tEZUF3QkN5QUtCRUFnQ2tFSVRBUkFJQUZCa0FacUlBZEJBblJxSWdBb0FnQWhDUU5BSUFsQkNtd2hDU0FLUVFGcUlncEJDVWNOQUFzZ0FDQUpOZ0lBQ3lBSFFRRnFJUWNMQWtBZ0N5QVNweUlJU2lBTFFRaEtjaUFJUVJGS2NnMEFJQWhCQ1VZRVFDQUJRY0FCYWlBR0VIa2dBVUd3QVdvZ0FTZ0NrQVlRaGdJZ0FVR2dBV29nQVNrRHdBRWdBU2tEeUFFZ0FTa0RzQUVnQVNrRHVBRVFMaUFCS1FPZ0FTRVRJQUVwQTZnQkRBSUxJQWhCQ0V3RVFDQUJRWkFDYWlBR0VIa2dBVUdBQW1vZ0FTZ0NrQVlRaGdJZ0FVSHdBV29nQVNrRGtBSWdBU2tEbUFJZ0FTa0RnQUlnQVNrRGlBSVFMaUFCUWVBQmFrRUFJQWhyUVFKMFFlREJCR29vQWdBUWVTQUJRZEFCYWlBQktRUHdBU0FCS1FQNEFTQUJLUVBnQVNBQktRUG9BUkRqQlNBQktRUFFBU0VUSUFFcEE5Z0JEQUlMSUFoQkVVNUJBQ0FCS0FLUUJpSUFJQWhCZld4QjBBQnFkaHNOQUNBQlFlQUNhaUFHRUhrZ0FVSFFBbW9nQUJDR0FpQUJRY0FDYWlBQktRUGdBaUFCS1FQb0FpQUJLUVBRQWlBQktRUFlBaEF1SUFGQnNBSnFJQWhCQW5SQm1NRUVhaWdDQUJCNUlBRkJvQUpxSUFFcEE4QUNJQUVwQThnQ0lBRXBBN0FDSUFFcEE3Z0NFQzRnQVNrRG9BSWhFeUFCS1FPb0Fnd0JDd05BSUFGQmtBWnFJQWNpQUVFQmF5SUhRUUowYWlnQ0FFVU5BQXNDUUNBSVFRbHZJZ05GQkVCQkFDRUtRUUFoQlF3QkMwRUFJUW9nQTBFSmFpQURJQWhCQUVnYklRUUNRQ0FBUlFSQVFRQWhCVUVBSVFBTUFRdEJnSlRyM0FOQkFDQUVhMEVDZEVIZ3dRUnFLQUlBSWd0dElReEJBQ0VOUVFBaENVRUFJUVVEUUNBQlFaQUdhaUFKUVFKMGFpSURJQTBnQXlnQ0FDSUNJQXR1SWdkcUlnTTJBZ0FnQlVFQmFrSC9EM0VnQlNBRFJTQUZJQWxHY1NJREd5RUZJQWhCQ1dzZ0NDQURHeUVJSUF3Z0FpQUhJQXRzYTJ3aERTQUpRUUZxSWdrZ0FFY05BQXNnRFVVTkFDQUJRWkFHYWlBQVFRSjBhaUFOTmdJQUlBQkJBV29oQUFzZ0NDQUVhMEVKYWlFSUN3TkFJQUZCa0FacUlBVkJBblJxSVF3Z0NFRWtTQ0VDQWtBRFFBSkFJQUlOQUNBSVFTUkhEUUlnRENnQ0FFSFE2ZmtFVFEwQVFTUWhDQXdDQ3lBQVFmOFBhaUVIUVFBaERTQUFJUU1EUUNBRElRQWdEYTBnQVVHUUJtb2dCMEgvRDNFaUMwRUNkR29pQXpVQ0FFSWRobndpRWtLQmxPdmNBMVFFZjBFQUJTQVNRb0NVNjl3RGdDSVRRb0RzbEtOOGZpQVNmQ0VTSUJPbkN5RU5JQU1nRXFjaUF6WUNBQ0FBSUFBZ0FDQUxJQU1iSUFVZ0MwWWJJQXNnQUVFQmEwSC9EM0ZIR3lFRElBdEJBV3NoQnlBRklBdEhEUUFMSUFwQkhXc2hDaUFOUlEwQUN5QURJQVZCQVd0Qi93OXhJZ1ZHQkVBZ0FVR1FCbW9pQnlBRFFmNFBha0gvRDNGQkFuUnFJZ0FnQUNnQ0FDQUhJQU5CQVd0Qi93OXhJZ0JCQW5ScUtBSUFjallDQUFzZ0NFRUphaUVJSUFGQmtBWnFJQVZCQW5ScUlBMDJBZ0FNQVFzTEFrQURRQ0FBUVFGcVFmOFBjU0VISUFGQmtBWnFJQUJCQVd0Qi93OXhRUUowYWlFTkEwQkJDVUVCSUFoQkxVb2JJUkVDUUFOQUlBVWhBMEVBSVFrQ1FBTkFBa0FnQXlBSmFrSC9EM0VpQlNBQVJnMEFJQUZCa0FacUlBVkJBblJxS0FJQUlnSWdDVUVDZEVHd3dRUnFLQUlBSWdWSkRRQWdBaUFGU3cwQ0lBbEJBV29pQ1VFRVJ3MEJDd3NnQ0VFa1J3MEFRZ0FoRWtFQUlRbENBQ0VUQTBBZ0FDQURJQWxxUWY4UGNTSUZSZ1JBSUFCQkFXcEIvdzl4SWdCQkFuUWdBV3BCQURZQ2pBWUxJQUZCZ0FacUlBRkJrQVpxSUFWQkFuUnFLQUlBRUlZQ0lBRkI4QVZxSUJJZ0UwSUFRb0NBZ0lEbG1yZU93QUFRTGlBQlFlQUZhaUFCS1FQd0JTQUJLUVA0QlNBQktRT0FCaUFCS1FPSUJoQndJQUVwQStnRklSTWdBU2tENEFVaEVpQUpRUUZxSWdsQkJFY05BQXNnQVVIUUJXb2dCaEI1SUFGQndBVnFJQklnRXlBQktRUFFCU0FCS1FQWUJSQXVJQUVwQThnRklSTkNBQ0VTSUFFcEE4QUZJUlJCTlNBS1FhTUphaUlDUVFBZ0FrRUFTaHNnQ2tHU2QwNGJJZ3hCOEFCTkRRSU1CUXNnQ2lBUmFpRUtJQUFoQlNBQUlBTkdEUUFMUVlDVTY5d0RJQkYySVFSQmZ5QVJkRUYvY3lFTFFRQWhDU0FESVFVRFFDQUJRWkFHYWlBRFFRSjBhaUlDSUFrZ0FpZ0NBQ0lNSUJGMmFpSUNOZ0lBSUFWQkFXcEIvdzl4SUFVZ0FrVWdBeUFGUm5FaUFoc2hCU0FJUVFscklBZ2dBaHNoQ0NBTElBeHhJQVJzSVFrZ0EwRUJha0gvRDNFaUF5QUFSdzBBQ3lBSlJRMEJJQVVnQjBjRVFDQUJRWkFHYWlBQVFRSjBhaUFKTmdJQUlBY2hBQXdEQ3lBTklBMG9BZ0JCQVhJMkFnQU1BUXNMQ3lBQlFaQUZha1FBQUFBQUFBRHdQMEhoQVNBTWF4RGFBUkNyQVNBQlFiQUZhaUFCS1FPUUJTQUJLUU9ZQlNBVUlCTVFpUVlnQVNrRHVBVWhGeUFCS1FPd0JTRVdJQUZCZ0FWcVJBQUFBQUFBQVBBL1FmRUFJQXhyRU5vQkVLc0JJQUZCb0FWcUlCUWdFeUFCS1FPQUJTQUJLUU9JQlJENEJTQUJRZkFFYWlBVUlCTWdBU2tEb0FVaUVpQUJLUU9vQlNJVkVJSUVJQUZCNEFScUlCWWdGeUFCS1FQd0JDQUJLUVA0QkJCd0lBRXBBK2dFSVJNZ0FTa0Q0QVFoRkFzZ0NrSHhBR29oQndKQUlBTkJCR3BCL3c5eElnVWdBRVlOQUFKQUlBRkJrQVpxSUFWQkFuUnFLQUlBSWdWQi84bTE3Z0ZOQkVBZ0JVVWdBMEVGYWtIL0QzRWdBRVp4RFFFZ0FVSHdBMm9nQnJkRUFBQUFBQUFBMEQraUVLc0JJQUZCNEFOcUlCSWdGU0FCS1FQd0F5QUJLUVA0QXhCd0lBRXBBK2dESVJVZ0FTa0Q0QU1oRWd3QkN5QUZRWURLdGU0QlJ3UkFJQUZCMEFScUlBYTNSQUFBQUFBQUFPZy9vaENyQVNBQlFjQUVhaUFTSUJVZ0FTa0QwQVFnQVNrRDJBUVFjQ0FCS1FQSUJDRVZJQUVwQThBRUlSSU1BUXNnQnJjaEdTQUFJQU5CQldwQi93OXhSZ1JBSUFGQmtBUnFJQmxFQUFBQUFBQUE0RCtpRUtzQklBRkJnQVJxSUJJZ0ZTQUJLUU9RQkNBQktRT1lCQkJ3SUFFcEE0Z0VJUlVnQVNrRGdBUWhFZ3dCQ3lBQlFiQUVhaUFaUkFBQUFBQUFBT2cvb2hDckFTQUJRYUFFYWlBU0lCVWdBU2tEc0FRZ0FTa0R1QVFRY0NBQktRT29CQ0VWSUFFcEE2QUVJUklMSUF4Qjd3QkxEUUFnQVVIUUEyb2dFaUFWUWdCQ2dJQ0FnSUNBd1A4L0VQZ0ZJQUVwQTlBRElBRXBBOWdEUWdCQ0FCRHRBUTBBSUFGQndBTnFJQklnRlVJQVFvQ0FnSUNBZ01EL1B4QndJQUVwQThnRElSVWdBU2tEd0FNaEVnc2dBVUd3QTJvZ0ZDQVRJQklnRlJCd0lBRkJvQU5xSUFFcEE3QURJQUVwQTdnRElCWWdGeENDQkNBQktRT29BeUVUSUFFcEE2QURJUlFDUUNBSFFmei8vLzhIY1VIOEIwa0VRQ0FLSVFBTUFRc2dBU0FUUXYvLy8vLy8vLy8vL3dDRE53T1lBeUFCSUJRM0E1QURJQUZCZ0FOcUlCUWdFMElBUW9DQWdJQ0FnSUQvUHhBdUlBRXBBNUFESUFFcEE1Z0RRb0NBZ0lDQWdJQzR3QUFRNlFVaEFDQUJLUU9JQXlBVElBQkJBRTRpQlJzaEV5QUJLUU9BQXlBVUlBVWJJUlFnRWlBVlFnQkNBQkR0QVNFRElBVWdDbW9pQUVHUEIwd0VRQ0FEUVFCSElBcEJrbmRJSWdNZ0FpQU1SM0VnQXlBRkczRkZEUUVMUWFEVUJFSEVBRFlDQUFzZ0FVSHdBbW9nRkNBVElBQVFpQVlnQVNrRDhBSWhFeUFCS1FQNEFnczNBeWdnRGlBVE53TWdJQUZCa01ZQWFpUUFJQTRwQXlnaEVpQU9LUU1nSVJNTUFnc2dBaWtEY0VJQVdRUkFJQUlnQWlnQ0JFRUJhellDQkF0Qm9OUUVRUncyQWdBZ0FoQ2FCQXdCQ3dKQUFuOGdBaWdDQkNJQUlBSW9BbWhIQkVBZ0FpQUFRUUZxTmdJRUlBQXRBQUFNQVFzZ0FoQlZDMEVvUmdSQVFRRWhCZ3dCQzBLQWdJQ0FnSURnLy84QUlSSWdBaWtEY0VJQVV3MEJJQUlnQWlnQ0JFRUJhellDQkF3QkN3TkFBbjhnQWlnQ0JDSUFJQUlvQW1oSEJFQWdBaUFBUVFGcU5nSUVJQUF0QUFBTUFRc2dBaEJWQ3lJQVFUQnJRUXBKSUFCQndRQnJRUnBKY2lBQVFkOEFSbkpGSUFCQjRRQnJRUnBQY1VVRVFDQUdRUUZxSVFZTUFRc0xRb0NBZ0lDQWdPRC8vd0FoRWlBQVFTbEdEUUFnQWlrRGNDSVZRZ0JaQkVBZ0FpQUNLQUlFUVFGck5nSUVDeUFHUlEwQUEwQWdCa0VCYXlFR0lCVkNBRmtFUUNBQ0lBSW9BZ1JCQVdzMkFnUUxJQVlOQUFzTElBOGdFemNEQUNBUElCSTNBd2dnRGtFd2FpUUFJQThwQXdBaEVpQVFJQThwQXdnM0F3Z2dFQ0FTTndNQUlBOUJvQUZxSkFBZ0VDa0RBQ0FRS1FNSUVMOEZJUmtnRUVFUWFpUUFJQmtMMFFFQkFYOENRQUpBSUFBZ0FYTkJBM0VFUUNBQkxRQUFJUUlNQVFzZ0FVRURjUVJBQTBBZ0FDQUJMUUFBSWdJNkFBQWdBa1VOQXlBQVFRRnFJUUFnQVVFQmFpSUJRUU54RFFBTEN5QUJLQUlBSWdKQmYzTWdBa0dCZ29RSWEzRkJnSUdDaEhoeERRQURRQ0FBSUFJMkFnQWdBU2dDQkNFQ0lBQkJCR29oQUNBQlFRUnFJUUVnQWtHQmdvUUlheUFDUVg5emNVR0FnWUtFZUhGRkRRQUxDeUFBSUFJNkFBQWdBa0gvQVhGRkRRQURRQ0FBSUFFdEFBRWlBam9BQVNBQVFRRnFJUUFnQVVFQmFpRUJJQUlOQUFzTEMvVUJBZ0YvQVg0akFFSFFBR3NpQXlRQUFrQUNmaUFCUVFCSUJFQWdBeUFCUWYvLy8vOEhjVFlDQUNBRFFSQnFJZ0ZCd0FCQjNDSWdBeEJPR2lBQUlBRVFZZ3dCQ3lBQUtBSVFJZ0FvQWl3Z0FVME5BUUpBQWtBZ0FDZ0NPQ0lBSUFGQkFuUnFLQUlBSWdFcEFnUWlCRUtBZ0lDQWdJQ0FnRUNEUW9DQWdJQ0FnSUNBd0FCUkRRQWdBa1VOQVNBRXAwR0FnSUNBZUVjTkFDQUFLQUs4QVNFQkN5QUJJQUVvQWdCQkFXbzJBZ0FnQWExQ2dJQ0FnSkIvaEF3QkN5QUJJQUVvQWdCQkFXbzJBZ0FnQWExQ2dJQ0FnSUIvaEFzaEJDQURRZEFBYWlRQUlBUVBDMEh2M3dCQnJ2d0FRWmdZUVlmaUFCQUFBQXZyQWdFQ2Z5QUFJQUVvQWdRUUV3TkFJQUVvQWhBaEF5QUNJQUVvQWhST1JRUkFJQUFnQXlBQ1FRTjBhaWdDQUJBVElBSkJBV29oQWd3QkN3c2dBQ2dDRUNJQ1FSQnFJQU1nQWlnQ0JCRUFBRUVBSVFJRFFBSkFJQUVvQWh3aEF5QUNJQUVvQWlCT0RRQWdBeUFDUVJSc2FpSURLQUlJUlFSQUlBQW9BaEFnQXlnQ0JCRHJBUXNnQUNBREtBSVFFQk1nQUNBREtBSU1FQk1nQWtFQmFpRUNEQUVMQ3lBQUtBSVFJZ0pCRUdvZ0F5QUNLQUlFRVFBQUlBQW9BaEFpQWtFUWFpQUJLQUlvSUFJb0FnUVJBQUJCQUNFQ0EwQWdBU2dDTkNFRElBSWdBU2dDT0U1RkJFQWdBQ0FESUFKQkRHeHFLQUlFRUJNZ0FrRUJhaUVDREFFTEN5QUFLQUlRSWdKQkVHb2dBeUFDS0FJRUVRQUFJQUFnQVNrRFFCQVBJQUFnQVNrRFNCQVBJQUFnQVNrRFlCQVBJQUFnQVNrRGFCQVBJQUVvQWdnaUFpQUJLQUlNSWdNMkFnUWdBeUFDTmdJQUlBRkNBRGNDQ0NBQUtBSVFJZ0JCRUdvZ0FTQUFLQUlFRVFBQUN6QUJBWDhnQUNnQ09DQUJRUUowYWlnQ0FDSUJJQUVvQWdBaUFrRUJhellDQUNBQ1FRRk1CRUFnQUNBQkVLSURDd3ZBQVFJQmZ3SitRWDhoQXdKQUlBQkNBRklnQVVMLy8vLy8vLy8vLy84QWd5SUVRb0NBZ0lDQWdNRC8vd0JXSUFSQ2dJQ0FnSUNBd1AvL0FGRWJEUUFnQWtMLy8vLy8vLy8vLy84QWd5SUZRb0NBZ0lDQWdNRC8vd0JXSUFWQ2dJQ0FnSUNBd1AvL0FGSnhEUUFnQUNBRUlBV0VoRkFFUUVFQUR3c2dBU0FDZzBJQVdRUkFJQUVnQWxJZ0FTQUNVM0VOQVNBQUlBRWdBb1dFUWdCU0R3c2dBRUlBVWlBQklBSlZJQUVnQWxFYkRRQWdBQ0FCSUFLRmhFSUFVaUVEQ3lBREN3b0FJQUJCZkhFUXBBTUxaUUVFZndOQUlBSWdCVW9FUUNBQklBVnFJZ1l0QUFBaUJFRVBhaUFFSUFSQnN3RkxHeUFFSUFNYlFRSjBJZ1JCZ0xnQmFpMEFBQ0VISUFSQmc3Z0JhaTBBQUVFWGEwSC9BWEZCQkUwRVFDQUFJQVlvQUFFUTdBRUxJQVVnQjJvaEJRd0JDd3NMY0FBQ1FBSkFBa0FDUUFKQUlBSkJCSFpCQTNGQkFXc09Bd0FCQWdNTElBRW9BZ0FpQWdSQUlBQWdBcTFDZ0lDQWdIQ0VFQ01MSUFFb0FnUWlBVVVOQXlBQUlBR3RRb0NBZ0lCd2hCQWpEd3NnQUNBQktBSUFFT3NCRHdzZ0FTZ0NBQkRxQlE4TElBQWdBU2tEQUJBakN3dkpCZ0VGZndKQUFrQUNRQUpBQWtBQ1FBSkFJQUV0QUFSQkQzRU9BZ0FCQlFzZ0FTQUJMUUFGUVFKeU9nQUZJQUVvQWhBaUJFRXdhaUVEQTBBZ0FTZ0NGQ0VGSUFJZ0JDZ0NJRTVGQkVBZ0FDQUZJQUpCQTNScUlBTW9BZ0JCR25ZUTdBVWdBa0VCYWlFQ0lBTkJDR29oQXd3QkN3c2dBRUVRYWlJR0lBVWdBQ2dDQkJFQUFDQUFJQVFRa1FJZ0FVSUFOd01RSUFFb0FoZ2lBZ1JBSUFJaEF3TkFJQU1FUUNBREtBSUlLQUlBUlEwRklBTW9BZ1FOQkNBREtBSVlJZ1FnQXlnQ0hDSUZOZ0lFSUFVZ0JEWUNBQ0FEUWdBM0FoZ2dBeWdDRUNJRUlBTW9BaFFpQlRZQ0JDQUZJQVEyQWdBZ0EwSUFOd0lRSUFNb0Fnd2hBd3dCQ3dzRFFDQUNCRUFnQWlnQ0RDRURJQUFnQWlrREtCQWpJQVlnQWlBQUtBSUVFUUFBSUFNaEFnd0JDd3NnQVVFQU5nSVlDeUFBS0FKRUlBRXZBUVpCR0d4cUtBSUlJZ0lFUUNBQUlBR3RRb0NBZ0lCd2hDQUNFUXdBQ3lBQlFnQTNBeUFnQVVFQU93RUdJQUZCQURZQ0tDQUJLQUlJSWdJZ0FTZ0NEQ0lETmdJRUlBTWdBallDQUNBQlFnQTNBZ2dnQUMwQWFFRUNSdzBESUFFb0FnQkZEUU1NQlFzZ0FDQUJLQUlVSUFFb0FoaEJBUkRyQlFKQUlBRW9BaUJGRFFBRFFDQUNJQUV2QVNvZ0FTOEJLR3BQRFFFZ0FDQUJLQUlnSUFKQkJIUnFLQUlBRU93QklBSkJBV29oQWd3QUN3QUxRUUFoQWdOQUlBRW9BamdnQWt3RVFFRUFJUUlEUUNBQ0lBRW9BanhPUlFSQUlBQWdBU2dDSkNBQ1FRTjBhaWdDQkJEc0FTQUNRUUZxSVFJTUFRc0xJQUVvQWpBaUFnUkFJQUlRcEFNTElBQWdBU2dDSEJEc0FTQUJMUUFTUVFSeEJFQWdBQ0FCS0FKQUVPd0JJQUJCRUdvaUFpQUJLQUpRSUFBb0FnUVJBQUFnQWlBQktBSlVJQUFvQWdRUkFBQUxJQUVvQWdnaUFpQUJLQUlNSWdNMkFnUWdBeUFDTmdJQUlBRkNBRGNDQ0FKQUlBQXRBR2hCQWtjTkFDQUJLQUlBUlEwQURBY0xJQUJCRUdvZ0FTQUFLQUlFRVFBQUR3VWdBQ0FCS0FJMElBSkJBM1JxS1FNQUVDTWdBa0VCYWlFQ0RBRUxBQXNBQzBIaEhFR3UvQUJCMXVVQ1FaYmVBQkFBQUF0QjRkY0FRYTc4QUVIVjVRSkJsdDRBRUFBQUN5QUdJQUVnQUNnQ0JCRUFBQThMRUFFQUN5QUFLQUpZSWdJZ0FVRUlhaUlETmdJRUlBRWdBRUhZQUdvMkFnd2dBU0FDTmdJSUlBQWdBellDV0F0Y0FRUi9JQUVoQXdKQUEwQWdBaUFEVFNBRVFRUkxjZzBCSUFNc0FBQWlCa0gvQUhFZ0JFRUhiSFFnQlhJaEJTQUVRUUZxSVFRZ0EwRUJhaUVESUFaQkFFZ05BQXNnQUNBRk5nSUFJQU1nQVdzUEN5QUFRUUEyQWdCQmZ3dkhBd0VDZnlBQUtBSVFJZ01vQWhSQk1Hb2dBeWdDYkVzRVFDQURFS0lGSUFNZ0F5Z0NGQ0lEUVFGMklBTnFOZ0pzQ3dKQUlBQkJNQkFwSWdNRVFDQURRUUEyQWlBZ0EwRUFOZ0lZSUFOQkFUb0FCU0FESUFJN0FRWWdBeUFCTmdJUUlBTWdBQ0FCS0FJY1FRTjBFQ2tpQkRZQ0ZDQUVEUUVnQUNnQ0VDSUNRUkJxSUFNZ0FpZ0NCQkVBQUFzZ0FDZ0NFQ0FCRUpFQ1FvQ0FnSURnQUE4TEFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQ1FRRnJEaVFIQUFZRUJBUUVBZ1lFQmdFR0JnWUdCZ1VHQmdJQ0FnSUNBZ0lDQWdJQ0F3UUVCZ1FHQ3lBRFFnQTNBeUFnQTBFQU5nSW9JQU1nQXkwQUJVRU1jam9BQlNBQklBQW9BaVJIQkg4Z0FDQURRVEJCQ2hCNkJTQUVDMElBTndNQURBWUxJQVJDZ0lDQWdEQTNBd0FNQlFzZ0EwSUFOd0lrSUFNZ0F5MEFCVUVNY2pvQUJRd0VDeUFEUWdBM0FpUU1Bd3NnQTBLQWdJQ0FNRGNESUF3QkN5QURRZ0EzQXlBTElBQW9BaEFvQWtRZ0FrRVliR29vQWhSRkRRQWdBeUFETFFBRlFRUnlPZ0FGQ3lBRFFRRTJBZ0FnQUNnQ0VDRUFJQU5CQURvQUJDQUFLQUpRSWdFZ0EwRUlhaUlDTmdJRUlBTWdBRUhRQUdvMkFnd2dBeUFCTmdJSUlBQWdBallDVUNBRHJVS0FnSUNBY0lRTGdRRUNBWDRCZnlNQVFZQUNheUlHSkFBZ0JrR0FBaUFDSUFNUXl3SWFBa0FnQUNBQUlBRkJBM1JxS1FOWVFRTVFTU0lGUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJDZ0lDQWdDQWhCUXdCQ3lBQUlBVkJNeUFBSUFZUVlrRURFQmthQ3lBRUJFQWdBQ0FGUVFCQkFFRUFFTW9DQ3lBQUlBVVFpZ0VnQmtHQUFtb2tBQXNOQUNBQUlBRWdBUkEvRUlFREM2b0xBUVovSUFBZ0FXb2hCUUpBQWtBZ0FDZ0NCQ0lDUVFGeERRQWdBa0VEY1VVTkFTQUFLQUlBSWdJZ0FXb2hBUUpBSUFBZ0Ftc2lBRUhFMEFRb0FnQkhCRUFnQWtIL0FVMEVRQ0FDUVFOMklRSWdBQ2dDQ0NJRUlBQW9BZ3dpQTBjTkFrR3cwQVJCc05BRUtBSUFRWDRnQW5keE5nSUFEQU1MSUFBb0FoZ2hCZ0pBSUFBZ0FDZ0NEQ0lDUndSQVFjRFFCQ2dDQUJvZ0FDZ0NDQ0lESUFJMkFnd2dBaUFETmdJSURBRUxBa0FnQUVFVWFpSUVLQUlBSWdNTkFDQUFRUkJxSWdRb0FnQWlBdzBBUVFBaEFnd0JDd05BSUFRaEJ5QURJZ0pCRkdvaUJDZ0NBQ0lERFFBZ0FrRVFhaUVFSUFJb0FoQWlBdzBBQ3lBSFFRQTJBZ0FMSUFaRkRRSUNRQ0FBS0FJY0lnUkJBblJCNE5JRWFpSURLQUlBSUFCR0JFQWdBeUFDTmdJQUlBSU5BVUcwMEFSQnROQUVLQUlBUVg0Z0JIZHhOZ0lBREFRTElBWkJFRUVVSUFZb0FoQWdBRVliYWlBQ05nSUFJQUpGRFFNTElBSWdCallDR0NBQUtBSVFJZ01FUUNBQ0lBTTJBaEFnQXlBQ05nSVlDeUFBS0FJVUlnTkZEUUlnQWlBRE5nSVVJQU1nQWpZQ0dBd0NDeUFGS0FJRUlnSkJBM0ZCQTBjTkFVRzQwQVFnQVRZQ0FDQUZJQUpCZm5FMkFnUWdBQ0FCUVFGeU5nSUVJQVVnQVRZQ0FBOExJQVFnQXpZQ0RDQURJQVEyQWdnTEFrQWdCU2dDQkNJQ1FRSnhSUVJBUWNqUUJDZ0NBQ0FGUmdSQVFjalFCQ0FBTmdJQVFielFCRUc4MEFRb0FnQWdBV29pQVRZQ0FDQUFJQUZCQVhJMkFnUWdBRUhFMEFRb0FnQkhEUU5CdU5BRVFRQTJBZ0JCeE5BRVFRQTJBZ0FQQzBIRTBBUW9BZ0FnQlVZRVFFSEUwQVFnQURZQ0FFRzQwQVJCdU5BRUtBSUFJQUZxSWdFMkFnQWdBQ0FCUVFGeU5nSUVJQUFnQVdvZ0FUWUNBQThMSUFKQmVIRWdBV29oQVFKQUlBSkIvd0ZOQkVBZ0FrRURkaUVDSUFVb0Fnd2lBeUFGS0FJSUlnUkdCRUJCc05BRVFiRFFCQ2dDQUVGK0lBSjNjVFlDQUF3Q0N5QUVJQU0yQWd3Z0F5QUVOZ0lJREFFTElBVW9BaGdoQmdKQUlBVWdCU2dDRENJQ1J3UkFRY0RRQkNnQ0FCb2dCU2dDQ0NJRElBSTJBZ3dnQWlBRE5nSUlEQUVMQWtBZ0JVRVVhaUlES0FJQUlnUU5BQ0FGUVJCcUlnTW9BZ0FpQkEwQVFRQWhBZ3dCQ3dOQUlBTWhCeUFFSWdKQkZHb2lBeWdDQUNJRURRQWdBa0VRYWlFRElBSW9BaEFpQkEwQUN5QUhRUUEyQWdBTElBWkZEUUFDUUNBRktBSWNJZ1JCQW5SQjROSUVhaUlES0FJQUlBVkdCRUFnQXlBQ05nSUFJQUlOQVVHMDBBUkJ0TkFFS0FJQVFYNGdCSGR4TmdJQURBSUxJQVpCRUVFVUlBWW9BaEFnQlVZYmFpQUNOZ0lBSUFKRkRRRUxJQUlnQmpZQ0dDQUZLQUlRSWdNRVFDQUNJQU0yQWhBZ0F5QUNOZ0lZQ3lBRktBSVVJZ05GRFFBZ0FpQUROZ0lVSUFNZ0FqWUNHQXNnQUNBQlFRRnlOZ0lFSUFBZ0FXb2dBVFlDQUNBQVFjVFFCQ2dDQUVjTkFVRzQwQVFnQVRZQ0FBOExJQVVnQWtGK2NUWUNCQ0FBSUFGQkFYSTJBZ1FnQUNBQmFpQUJOZ0lBQ3lBQlFmOEJUUVJBSUFGQmVIRkIyTkFFYWlFQ0FuOUJzTkFFS0FJQUlnTkJBU0FCUVFOMmRDSUJjVVVFUUVHdzBBUWdBU0FEY2pZQ0FDQUNEQUVMSUFJb0FnZ0xJUUVnQWlBQU5nSUlJQUVnQURZQ0RDQUFJQUkyQWd3Z0FDQUJOZ0lJRHd0Qkh5RUVJQUZCLy8vL0IwMEVRQ0FCUVNZZ0FVRUlkbWNpQW10MlFRRnhJQUpCQVhSclFUNXFJUVFMSUFBZ0JEWUNIQ0FBUWdBM0FoQWdCRUVDZEVIZzBnUnFJUWNDUUFKQVFiVFFCQ2dDQUNJRFFRRWdCSFFpQW5GRkJFQkJ0TkFFSUFJZ0EzSTJBZ0FnQnlBQU5nSUFJQUFnQnpZQ0dBd0JDeUFCUVJrZ0JFRUJkbXRCQUNBRVFSOUhHM1FoQkNBSEtBSUFJUUlEUUNBQ0lnTW9BZ1JCZUhFZ0FVWU5BaUFFUVIxMklRSWdCRUVCZENFRUlBTWdBa0VFY1dvaUIwRVFhaWdDQUNJQ0RRQUxJQWNnQURZQ0VDQUFJQU0yQWhnTElBQWdBRFlDRENBQUlBQTJBZ2dQQ3lBREtBSUlJZ0VnQURZQ0RDQURJQUEyQWdnZ0FFRUFOZ0lZSUFBZ0F6WUNEQ0FBSUFFMkFnZ0xDLzhIQVF4L0lBQkZCRUFnQVJDeEFROExBa0FnQVVHL2Ywc05BQUovUVJBZ0FVRUxha0Y0Y1NBQlFRdEpHeUVGSUFCQkNHc2lCQ2dDQkNJSVFYaHhJUUlDUUNBSVFRTnhSUVJBUVFBZ0JVR0FBa2tOQWhvZ0JVRUVhaUFDVFFSQUlBUWhBeUFDSUFWclFaRFVCQ2dDQUVFQmRFME5BZ3RCQUF3Q0N5QUNJQVJxSVFZQ1FDQUNJQVZQQkVBZ0FpQUZheUlEUVJCSkRRRWdCQ0FJUVFGeElBVnlRUUp5TmdJRUlBUWdCV29pQWlBRFFRTnlOZ0lFSUFZZ0JpZ0NCRUVCY2pZQ0JDQUNJQU1ROGdVTUFRdEJ5TkFFS0FJQUlBWkdCRUJCdk5BRUtBSUFJQUpxSWdJZ0JVME5BaUFFSUFoQkFYRWdCWEpCQW5JMkFnUWdCQ0FGYWlJRElBSWdCV3NpQWtFQmNqWUNCRUc4MEFRZ0FqWUNBRUhJMEFRZ0F6WUNBQXdCQzBIRTBBUW9BZ0FnQmtZRVFFRzQwQVFvQWdBZ0Ftb2lBaUFGU1EwQ0FrQWdBaUFGYXlJRFFSQlBCRUFnQkNBSVFRRnhJQVZ5UVFKeU5nSUVJQVFnQldvaUJ5QURRUUZ5TmdJRUlBSWdCR29pQWlBRE5nSUFJQUlnQWlnQ0JFRitjVFlDQkF3QkN5QUVJQWhCQVhFZ0FuSkJBbkkyQWdRZ0FpQUVhaUlESUFNb0FnUkJBWEkyQWdSQkFDRURDMEhFMEFRZ0J6WUNBRUc0MEFRZ0F6WUNBQXdCQ3lBR0tBSUVJZ2RCQW5FTkFTQUhRWGh4SUFKcUlna2dCVWtOQVNBSklBVnJJUXNDUUNBSFFmOEJUUVJBSUFZb0Fnd2lBeUFHS0FJSUlnSkdCRUJCc05BRVFiRFFCQ2dDQUVGK0lBZEJBM1ozY1RZQ0FBd0NDeUFDSUFNMkFnd2dBeUFDTmdJSURBRUxJQVlvQWhnaENnSkFJQVlnQmlnQ0RDSUNSd1JBUWNEUUJDZ0NBQm9nQmlnQ0NDSURJQUkyQWd3Z0FpQUROZ0lJREFFTEFrQWdCa0VVYWlJSEtBSUFJZ01OQUNBR1FSQnFJZ2NvQWdBaUF3MEFRUUFoQWd3QkN3TkFJQWNoRENBRElnSkJGR29pQnlnQ0FDSUREUUFnQWtFUWFpRUhJQUlvQWhBaUF3MEFDeUFNUVFBMkFnQUxJQXBGRFFBQ1FDQUdLQUljSWdOQkFuUkI0TklFYWlJSEtBSUFJQVpHQkVBZ0J5QUNOZ0lBSUFJTkFVRzAwQVJCdE5BRUtBSUFRWDRnQTNkeE5nSUFEQUlMSUFwQkVFRVVJQW9vQWhBZ0JrWWJhaUFDTmdJQUlBSkZEUUVMSUFJZ0NqWUNHQ0FHS0FJUUlnTUVRQ0FDSUFNMkFoQWdBeUFDTmdJWUN5QUdLQUlVSWdORkRRQWdBaUFETmdJVUlBTWdBallDR0FzZ0MwRVBUUVJBSUFRZ0NFRUJjU0FKY2tFQ2NqWUNCQ0FFSUFscUlnTWdBeWdDQkVFQmNqWUNCQXdCQ3lBRUlBaEJBWEVnQlhKQkFuSTJBZ1FnQkNBRmFpSURJQXRCQTNJMkFnUWdCQ0FKYWlJQ0lBSW9BZ1JCQVhJMkFnUWdBeUFMRVBJRkN5QUVJUU1MSUFNTElnTUVRQ0FEUVFocUR3c2dBUkN4QVNJRFJRMEFJQU1nQUVGOFFYZ2dBRUVFYXlnQ0FDSUVRUU54R3lBRVFYaHhhaUlFSUFFZ0FTQUVTeHNRSHhvZ0FCQ2JBU0FESVEwTElBMExNUUFnQkVFQ2NRUkFRYlNHQVVHdS9BQkJ2SWNDUWFNNEVBQUFDeUFBSUFBcEE4QUJJQUVnQWlBRElBUkJmeERLQlF1dkFRSUJmd0YrSXdCQjBBQnJJZ1FrQUNBRVFRQkIwQUFRS3lJRUlBTTJBZ3dnQkNBQU5nSUFJQVJCQVRZQ0NDQUVRcUNBZ0lBUU53TVFJQVFnQVRZQ09DQUVJQUVnQW1vMkFqeENnSUNBZ0RBaEJRSkFBa0FnQkJDaUFRMEFJQVFRMGdNaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBUW9BaEJCckg5R0RRRWdCRUd3OHdCQkFCQVdDeUFBSUFVUUR5QUVJQVJCRUdvUS93RkNnSUNBZ09BQUlRVUxJQVJCMEFCcUpBQWdCUXRpQWdOK0FYOGdBQ2tEd0FFaUFrSWdpS2RCZFU4RVFDQUNweUlGSUFVb0FnQkJBV28yQWdBTElBQWdBa0dEMHdBUXNnRWhBeUFBSUFJUUR5QUFJQUFnQTBIZHdBQVFzZ0VpQWlBRFFRRWdBUkFoSVFRZ0FDQUNFQThnQUNBREVBOGdCQXNNQUNBQUlBRXBBd0FRc3dFTHlnWUNCSDhEZmlNQVFZQUJheUlGSkFBQ1FBSkFBa0FnQXlBRVFnQkNBQkR0QVVVTkFBSi9JQVJDLy8vLy8vLy9QNE1oQ2dKL0lBUkNNSWluUWYvL0FYRWlCa0gvL3dGSEJFQkJCQ0FHRFFFYVFRSkJBeUFESUFxRVVCc01BZ3NnQXlBS2hGQUxDeUVHSUFKQ01JaW5JZ2hCLy84QmNTSUhRZi8vQVVZTkFDQUdEUUVMSUFWQkVHb2dBU0FDSUFNZ0JCQXVJQVVnQlNrREVDSUNJQVVwQXhnaUFTQUNJQUVRNHdVZ0JTa0RDQ0VDSUFVcEF3QWhCQXdCQ3lBQklBSkMvLy8vLy8vLy8vLy9BSU1pQ2lBRElBUkMvLy8vLy8vLy8vLy9BSU1pQ1JEdEFVRUFUQVJBSUFFZ0NpQURJQWtRN1FFRVFDQUJJUVFNQWdzZ0JVSHdBR29nQVNBQ1FnQkNBQkF1SUFVcEEzZ2hBaUFGS1FOd0lRUU1BUXNnQkVJd2lLZEIvLzhCY1NFR0lBY0VmaUFCQlNBRlFlQUFhaUFCSUFwQ0FFS0FnSUNBZ0lEQXU4QUFFQzRnQlNrRGFDSUtRakNJcDBINEFHc2hCeUFGS1FOZ0N5RUVJQVpGQkVBZ0JVSFFBR29nQXlBSlFnQkNnSUNBZ0lDQXdMdkFBQkF1SUFVcEExZ2lDVUl3aUtkQitBQnJJUVlnQlNrRFVDRURDeUFKUXYvLy8vLy8veitEUW9DQWdJQ0FnTUFBaENFTElBcEMvLy8vLy8vL1A0TkNnSUNBZ0lDQXdBQ0VJUW9nQmlBSFNBUkFBMEFDZmlBS0lBdDlJQU1nQkZhdGZTSUpRZ0JaQkVBZ0NTQUVJQU45SWdTRVVBUkFJQVZCSUdvZ0FTQUNRZ0JDQUJBdUlBVXBBeWdoQWlBRktRTWdJUVFNQlFzZ0NVSUJoaUFFUWorSWhBd0JDeUFLUWdHR0lBUkNQNGlFQ3lFS0lBUkNBWVloQkNBSFFRRnJJZ2NnQmtvTkFBc2dCaUVIQ3dKQUlBb2dDMzBnQXlBRVZxMTlJZ2xDQUZNRVFDQUtJUWtNQVFzZ0NTQUVJQU45SWdTRVFnQlNEUUFnQlVFd2FpQUJJQUpDQUVJQUVDNGdCU2tET0NFQ0lBVXBBekFoQkF3QkN5QUpRdi8vLy8vLy96OVlCRUFEUUNBRVFqK0lJUUVnQjBFQmF5RUhJQVJDQVlZaEJDQUJJQWxDQVlhRUlnbENnSUNBZ0lDQXdBQlVEUUFMQ3lBSVFZQ0FBbkVoQmlBSFFRQk1CRUFnQlVGQWF5QUVJQWxDLy8vLy8vLy9QNE1nQjBINEFHb2dCbkt0UWpDR2hFSUFRb0NBZ0lDQWdNRERQeEF1SUFVcEEwZ2hBaUFGS1FOQUlRUU1BUXNnQ1VMLy8vLy8vLzgvZ3lBR0lBZHlyVUl3aG9RaEFnc2dBQ0FFTndNQUlBQWdBamNEQ0NBRlFZQUJhaVFBQzRzREFnSitBMzhqQUVFZ2F5SUNKQUJDZ0lDQWdPQUFJUVFDUUNBQUlBTXBBd0FpQlJCZ0RRQWdBQ0FCUVRFUVpTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQUorQWtBZ0FFRWdFRjhpQmtVTkFFRUFJUU1nQmtFQU5nSVVJQVpCQURZQ0FBTkFJQU5CQWtaRkJFQWdCaUFEUVFOMGFpSUhJQWRCQkdvaUNEWUNDQ0FISUFnMkFnUWdBMEVCYWlFRERBRUxDeUFHUW9DQWdJQXdOd01ZSUFGQ2dJQ0FnSEJhQkVBZ0FhY2dCallDSUFzZ0FDQUNRUkJxSUFFUXBBVU5BQUpBSUFBZ0JVS0FnSUNBTUVFQ0lBSkJFR29RSVNJRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDZ0NFQ0lES1FPQUFTRUVJQU5DZ0lDQWdDQTNBNEFCSUFJZ0JEY0RDQ0FBSUFJcEF4aENnSUNBZ0RCQkFTQUNRUWhxRUNFaEJDQUFJQUlwQXdnUUR5QUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBQ0FFRUE4TElBQWdCUkFQSUFBZ0Fpa0RFQkFQSUFFaEJDQUNLUU1ZREFJTElBQWdBaWtERUJBUElBQWdBaWtER0JBUFFvQ0FnSURnQUNFRUN5QUJDeEFQQ3lBQ1FTQnFKQUFnQkF1U0N3SUhmZ1YvSXdCQkVHc2lBaVFBSUFSQjVhWUJhaTBBQUNJTnJTRUpBa0FDUUFKQUlBTXBBd0FpQmtMLy8vLy9iMWdFUUVLQWdJQ0E0QUFoQlNBQUlBSkJDR29nQmhDbUFRMERJQUJDZ0lDQWdEQWdBaWtEQ0NJSElBbUdFUGtDSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXd3QkN3SkFBa0FnQnFjaURDOEJCaUlPUVJOclFmLy9BM0ZCQVUwRVFDQU1LQUlnSVF4Q2dJQ0FnT0FBSVFVZ0FDQUNJQU1wQXdnUXBnRU5CU0FNTFFBRURRSUNRQ0FDS1FNQUlnaEJmeUFOZEVGL2N5SU5ySU5RQkVBZ0NDQU1LQUlBSWc2c0lnWllEUUVMSUFCQitDMUJBQkJRREFZTEFrQWdBeWtERUNJSFFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBTklBNXhEUUVnQmlBSWZTQUppQ0VIREFNTElBQWdBa0VJYWlBSEVLWUJEUVlnREMwQUJBMERJQXcwQWdBZ0Fpa0RDQ0lISUFtR0lBaDhXZzBDQ3lBQVFaTFpBRUVBRUZBTUJRc0NmZ0pBQWtBZ0FFS0FnSUNBTUFKK0FrQUNRQUorQWtBQ1FBSkFJQTVCRld0Qi8vOERjVUVLVFFSQUlBQWdBU0FFRUdVaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwUEFrQUNRQ0FNS0FJZ0lnOG9BZ3dpQXlnQ0lDSU5MUUFFUlFSQUlBd29BaWdoRGtLQWdJQ0FNQ0VCSUEwdEFBVkZCRUFnQUNBRHJVS0FnSUNBY0lSQ2dJQ0FnREFRNHdFaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwREN5QUFJQUVnRHEwaUNDQUpoaEQ1QWlFSElBQWdBUkFQSUFkQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQWlBTUtBSWdLQUlNS0FJZ0xRQUVSUTBCSUFBZ0J4QVBDeUFBRUdzTUFRdEJBQ0VEQWtBZ0IwS0FnSUNBY0ZRTkFDQUhweUlRTHdFR1FSTkhEUUFnRUNnQ0lDRURDeUFBSUFVZ0IwSUFJQWdRMndNTkFDQU1Md0VHSUFSR0RRSkJBQ0VFQTBBZ0JDQU9SZzBSSUFBZ0JpQUVFTEFCSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBVWdCQ0FCRUtVQklRTWdCRUVCYWlFRUlBTkJBRTROQUFzTElBQWdCUkFQREE0TFFvQ0FnSURnQUNFRklBQWdBU0FFRUdVaUNrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwT1FvQ0FnSUF3SVFVZ0FDQUdRZEVCSUFaQkFCQVVJZ3RDZ0lDQWdIQ0RJZ2RDZ0lDQWdDQlJJQWRDZ0lDQWdEQlJjZzBCUW9DQWdJRGdBQ0VCSUFkQ2dJQ0FnT0FBVVEwSVFRQWhBeUFBRUQ0aUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRklBQWdCaUFMRVBvRElnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFS0FnSUNBTUF3RUN5QUFJQVZCNmdBZ0JVRUFFQlFpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDUVFBaEJBTkFJQUFnQlNBR0lBSkJDR29RcmdFaUNFS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRElBSW9BZ2dFUUNBRUlRTWdCeUVCREFZTElBQWdCeUFFclNBSVFZQ0FBUkRTQVVFQVNBUkFJQVloQ0NBRklRWWdCeUVGREFZRklBUkJBV29oQkF3QkN3QUxBQXNnQXlnQ0NDQU5LQUlJSUE4b0FoQnFJQU1vQWdBUUh4b01EUXNnQUNBQ1FRaHFJQVlRUEEwR0lBd2dEQ2dDQUVFQmFqWUNBQ0FHSVFFZ0Fpa0RDQXdFQ3lBR0N5RUlJQVVoQmlBSElRVUxJQUFnQ0JBUElBQWdCaEFQSUFBZ0JSQVBDeUFBSUFzUUR5QUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBNjBMSWdVZ0NZWVErUUlpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0NpQUdRZ0FnQlJEYkF3MEFRUUFoQkFOQUlBb2dCSzBnQlZrTkF4b2dBQ0FCSUFRUXNBRWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEJJQUFnQ2lBRUlBWVFwUUVoQXlBRVFRRnFJUVFnQTBFQVRnMEFDd3NnQVNFRkN5QUFJQVVRRHlBS0lRRkNnSUNBZ09BQUN5RUZJQUFnQVJBUERBUUxJQU1wQXdBaUJrSWdpS2RCZFVrTkFTQUdweUlESUFNb0FnQkJBV28yQWdBTUFRc2dBQkJyREFJTElBQWdBU0FFRUdVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBQWdCaEFQREFJTElBQWdBU0FHSUFnZ0J4RGJBMFVFUUNBQklRVU1BZ3NnQUNBQkVBOExRb0NBZ0lEZ0FDRUZDeUFDUVJCcUpBQWdCUXNQQUNBQUlBRWdBa0VBUVFNUWxnSUw5QUVDQTM0QmZ3SkFJQU1wQXdBaUJFS0FnSUNBY0ZvRVFDQURLUU1JSWdWQy8vLy8vMjlXRFFFTElBQVFKRUtBZ0lDQTRBQVBDMEtBZ0lDQTRBQWhCaUFBUW9DQWdJQWdRVEFRU1NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkg0Z0FFRVlFQ2tpQWtVRVFDQUFJQUVRRDBLQWdJQ0E0QUFQQ3lBRXB5SURJQU1vQWdCQkFXbzJBZ0FnQWlBRU53TUFJQVduSWdjZ0J5Z0NBRUVCYWpZQ0FDQUNJQVUzQXdnZ0FDQUVFRGdoQUNBQ1FRQTZBQkVnQWlBQU9nQVFJQUZDZ0lDQWdIQmFCRUFnQWFjaUFDQUNOZ0lnSUFBZ0FDMEFCVUh2QVhFZ0F5MEFCVUVRY1hJNkFBVUxJQUVGUW9DQWdJRGdBQXNMWGdFQmZ3SkFJQUZDZ0lDQWdIQlVEUUFnQWFjaUJDOEJCaUFEUncwQUlBUW9BaUFpQkVVTkFDQUVLUU1BSWdGQ2dJQ0FnR0JhQkVBZ0FDQUJweUFDRVFBQUN5QUVLUU1JSWdGQ2dJQ0FnR0JVRFFBZ0FDQUJweUFDRVFBQUN3dEtBUUYvQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlETHdFR0lBSkhEUUFnQXlnQ0lDSURSUTBBSUFBZ0F5a0RBQkFqSUFBZ0F5a0RDQkFqSUFCQkVHb2dBeUFBS0FJRUVRQUFDd3M0QVFGL0lBQkJNR3NpQkVFS1R3Ui9JQUJCd1FCcklBTk5CRUFnQUVFM2F3OExJQUlnQUVIWEFHc2dBRUhoQUdzZ0FVOGJCU0FFQ3d0TEFRRi9JQUJCR0JBcElnSkZCRUJDZ0lDQWdPQUFEd3NnQWtFQk5nSUFJQUFvQXRnQklRQWdBa0lBTndJUUlBSkNnSUNBZ0lDQWdJQ0FmemNDQ0NBQ0lBQTJBZ1FnQXEwZ0FZUUxrUUlBSUFCRkJFQkJBQThMQW44Q1FDQUJRZjhBVFEwQUFrQkJpTlVFS0FJQUtBSUFSUVJBSUFGQmdIOXhRWUMvQTBZTkFnd0JDeUFCUWY4UFRRUkFJQUFnQVVFL2NVR0FBWEk2QUFFZ0FDQUJRUVoyUWNBQmNqb0FBRUVDREFNTElBRkJnRUJ4UVlEQUEwY2dBVUdBc0FOUGNVVUVRQ0FBSUFGQlAzRkJnQUZ5T2dBQ0lBQWdBVUVNZGtIZ0FYSTZBQUFnQUNBQlFRWjJRVDl4UVlBQmNqb0FBVUVEREFNTElBRkJnSUFFYTBILy96OU5CRUFnQUNBQlFUOXhRWUFCY2pvQUF5QUFJQUZCRW5aQjhBRnlPZ0FBSUFBZ0FVRUdka0UvY1VHQUFYSTZBQUlnQUNBQlFReDJRVDl4UVlBQmNqb0FBVUVFREFNTEMwR2cxQVJCR1RZQ0FFRi9EQUVMSUFBZ0FUb0FBRUVCQ3d2RUFnQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUJRUWxyRGhJQUNnc01DZ3NDQXdRRkRBc01EQW9MQndnSkN5QUNJQUlvQWdBaUFVRUVhallDQUNBQUlBRW9BZ0EyQWdBUEN3QUxJQUlnQWlnQ0FDSUJRUVJxTmdJQUlBQWdBVElCQURjREFBOExJQUlnQWlnQ0FDSUJRUVJxTmdJQUlBQWdBVE1CQURjREFBOExJQUlnQWlnQ0FDSUJRUVJxTmdJQUlBQWdBVEFBQURjREFBOExJQUlnQWlnQ0FDSUJRUVJxTmdJQUlBQWdBVEVBQURjREFBOExBQXNnQWlBQ0tBSUFRUWRxUVhoeElnRkJDR28yQWdBZ0FDQUJLd01BT1FNQUR3c2dBQ0FDSUFNUkFBQUxEd3NnQWlBQ0tBSUFJZ0ZCQkdvMkFnQWdBQ0FCTkFJQU53TUFEd3NnQWlBQ0tBSUFJZ0ZCQkdvMkFnQWdBQ0FCTlFJQU53TUFEd3NnQWlBQ0tBSUFRUWRxUVhoeElnRkJDR28yQWdBZ0FDQUJLUU1BTndNQUMxNEJCSDhnQUNnQ0FDRUNBMEFnQWl3QUFDSURFTkVDQkVCQmZ5RUVJQUFnQWtFQmFpSUNOZ0lBSUFGQnpKbXo1Z0JOQkg5QmZ5QURRVEJySWdNZ0FVRUtiQ0lFYWlBRElBUkIvLy8vL3dkelNoc0ZRWDhMSVFFTUFRc0xJQUVMM0JJQ0VuOEJmaU1BUWRBQWF5SUlKQUFnQ0NBQk5nSk1JQWhCTjJvaEZ5QUlRVGhxSVJJQ1FBSkFBa0FDUUFOQUlBRWhEQ0FISUE1Qi8vLy8vd2R6U2cwQklBY2dEbW9oRGdKQUFrQUNRQ0FNSWdjdEFBQWlDUVJBQTBBQ1FBSkFJQWxCL3dGeElnRkZCRUFnQnlFQkRBRUxJQUZCSlVjTkFTQUhJUWtEUUNBSkxRQUJRU1ZIQkVBZ0NTRUJEQUlMSUFkQkFXb2hCeUFKTFFBQ0lRb2dDVUVDYWlJQklRa2dDa0VsUmcwQUN3c2dCeUFNYXlJSElBNUIvLy8vL3dkekloaEtEUWNnQUFSQUlBQWdEQ0FIRUZzTElBY05CaUFJSUFFMkFrd2dBVUVCYWlFSFFYOGhEd0pBSUFFc0FBRWlDaERSQWtVTkFDQUJMUUFDUVNSSERRQWdBVUVEYWlFSElBcEJNR3NoRDBFQklSTUxJQWdnQnpZQ1RFRUFJUTBDUUNBSExBQUFJZ2xCSUdzaUFVRWZTd1JBSUFjaENnd0JDeUFISVFwQkFTQUJkQ0lCUVluUkJIRkZEUUFEUUNBSUlBZEJBV29pQ2pZQ1RDQUJJQTF5SVEwZ0J5d0FBU0lKUVNCcklnRkJJRThOQVNBS0lRZEJBU0FCZENJQlFZblJCSEVOQUFzTEFrQWdDVUVxUmdSQUFuOENRQ0FLTEFBQklnRVEwUUpGRFFBZ0NpMEFBa0VrUncwQUlBRkJBblFnQkdwQndBRnJRUW8yQWdBZ0NrRURhaUVKUVFFaEV5QUtMQUFCUVFOMElBTnFRWUFEYXlnQ0FBd0JDeUFURFFZZ0NrRUJhaUVKSUFCRkJFQWdDQ0FKTmdKTVFRQWhFMEVBSVJBTUF3c2dBaUFDS0FJQUlnRkJCR28yQWdCQkFDRVRJQUVvQWdBTElSQWdDQ0FKTmdKTUlCQkJBRTROQVVFQUlCQnJJUkFnRFVHQXdBQnlJUTBNQVFzZ0NFSE1BR29RZ3dZaUVFRUFTQTBJSUFnb0Frd2hDUXRCQUNFSFFYOGhDd0ovSUFrdEFBQkJMa2NFUUNBSklRRkJBQXdCQ3lBSkxRQUJRU3BHQkVBQ2Z3SkFJQWtzQUFJaUFSRFJBa1VOQUNBSkxRQURRU1JIRFFBZ0FVRUNkQ0FFYWtIQUFXdEJDallDQUNBSlFRUnFJUUVnQ1N3QUFrRURkQ0FEYWtHQUEyc29BZ0FNQVFzZ0V3MEdJQWxCQW1vaEFVRUFJQUJGRFFBYUlBSWdBaWdDQUNJS1FRUnFOZ0lBSUFvb0FnQUxJUXNnQ0NBQk5nSk1JQXRCZjNOQkgzWU1BUXNnQ0NBSlFRRnFOZ0pNSUFoQnpBQnFFSU1HSVFzZ0NDZ0NUQ0VCUVFFTElSUURRQ0FISVJWQkhDRUtJQUVpRVN3QUFDSUhRZnNBYTBGR1NRMEpJQkZCQVdvaEFTQUhJQlZCT214cVFaL0JCR290QUFBaUIwRUJhMEVJU1EwQUN5QUlJQUUyQWt3Q1FBSkFJQWRCRzBjRVFDQUhSUTBMSUE5QkFFNEVRQ0FFSUE5QkFuUnFJQWMyQWdBZ0NDQURJQTlCQTNScUtRTUFOd05BREFJTElBQkZEUWdnQ0VGQWF5QUhJQUlnQmhDQ0Jnd0NDeUFQUVFCT0RRb0xRUUFoQnlBQVJRMEhDeUFOUWYvL2UzRWlDU0FOSUExQmdNQUFjUnNoRFVFQUlROUJyQ0VoRmlBU0lRb0NRQUpBQWtBQ2Z3SkFBa0FDUUFKQUFuOENRQUpBQWtBQ1FBSkFBa0FDUUNBUkxBQUFJZ2RCWDNFZ0J5QUhRUTl4UVFOR0d5QUhJQlViSWdkQjJBQnJEaUVFRkJRVUZCUVVGQlFPRkE4R0RnNE9GQVlVRkJRVUFnVURGQlFKRkFFVUZBUUFDd0pBSUFkQndRQnJEZ2NPRkFzVURnNE9BQXNnQjBIVEFFWU5DUXdUQ3lBSUtRTkFJUmxCckNFTUJRdEJBQ0VIQWtBQ1FBSkFBa0FDUUFKQUFrQWdGVUgvQVhFT0NBQUJBZ01FR2dVR0dnc2dDQ2dDUUNBT05nSUFEQmtMSUFnb0FrQWdEallDQUF3WUN5QUlLQUpBSUE2c053TUFEQmNMSUFnb0FrQWdEanNCQUF3V0N5QUlLQUpBSUE0NkFBQU1GUXNnQ0NnQ1FDQU9OZ0lBREJRTElBZ29Ba0FnRHF3M0F3QU1Fd3RCQ0NBTElBdEJDRTBiSVFzZ0RVRUljaUVOUWZnQUlRY0xJQkloRENBSFFTQnhJUkVnQ0NrRFFDSVpVRVVFUUFOQUlBeEJBV3NpRENBWnAwRVBjVUd3eFFScUxRQUFJQkZ5T2dBQUlCbENEMVloQ1NBWlFnU0lJUmtnQ1EwQUN3c2dEVUVJY1VVZ0NDa0RRRkJ5RFFNZ0IwRUVka0dzSVdvaEZrRUNJUThNQXdzZ0VpRUhJQWdwQTBBaUdWQkZCRUFEUUNBSFFRRnJJZ2NnR2FkQkIzRkJNSEk2QUFBZ0dVSUhWaUVNSUJsQ0E0Z2hHU0FNRFFBTEN5QUhJUXdnRFVFSWNVVU5BaUFMSUJJZ0RHc2lCMEVCYWlBSElBdElHeUVMREFJTElBZ3BBMEFpR1VJQVV3UkFJQWhDQUNBWmZTSVpOd05BUVFFaEQwR3NJUXdCQ3lBTlFZQVFjUVJBUVFFaEQwR3RJUXdCQzBHdUlVR3NJU0FOUVFGeElnOGJDeUVXSUJrZ0VoQ1ZBaUVNQ3lBVVFRQWdDMEVBU0JzTkRpQU5RZi8vZTNFZ0RTQVVHeUVOSUFncEEwQWlHVUlBVWlBTGNrVUVRQ0FTSVF4QkFDRUxEQXdMSUFzZ0dWQWdFaUFNYTJvaUJ5QUhJQXRJR3lFTERBc0xJQWdvQWtBaUIwR2drZ0VnQnhzaURFRUFRZi8vLy84SElBc2dDMEgvLy8vL0IwOGJJZ29RK3dFaUJ5QU1heUFLSUFjYklnY2dER29oQ2lBTFFRQk9CRUFnQ1NFTklBY2hDd3dMQ3lBSklRMGdCeUVMSUFvdEFBQU5EUXdLQ3lBTEJFQWdDQ2dDUUF3Q0MwRUFJUWNnQUVFZ0lCQkJBQ0FORUdNTUFnc2dDRUVBTmdJTUlBZ2dDQ2tEUUQ0Q0NDQUlJQWhCQ0dvaUJ6WUNRRUYvSVFzZ0J3c2hDVUVBSVFjQ1FBTkFJQWtvQWdBaURFVU5BU0FJUVFScUlBd1FnUVlpQ2tFQVNDSU1JQW9nQ3lBSGEwdHlSUVJBSUFsQkJHb2hDU0FMSUFjZ0Ntb2lCMHNOQVF3Q0N3c2dEQTBOQzBFOUlRb2dCMEVBU0EwTElBQkJJQ0FRSUFjZ0RSQmpJQWRGQkVCQkFDRUhEQUVMUVFBaENpQUlLQUpBSVFrRFFDQUpLQUlBSWd4RkRRRWdDRUVFYWlBTUVJRUdJZ3dnQ21vaUNpQUhTdzBCSUFBZ0NFRUVhaUFNRUZzZ0NVRUVhaUVKSUFjZ0Nrc05BQXNMSUFCQklDQVFJQWNnRFVHQXdBQnpFR01nRUNBSElBY2dFRWdiSVFjTUNBc2dGRUVBSUF0QkFFZ2JEUWhCUFNFS0lBQWdDQ3NEUUNBUUlBc2dEU0FISUFVUlNRQWlCMEVBVGcwSERBa0xJQWdnQ0NrRFFEd0FOMEVCSVFzZ0Z5RU1JQWtoRFF3RUN5QUhMUUFCSVFrZ0IwRUJhaUVIREFBTEFBc2dBQTBISUJORkRRSkJBU0VIQTBBZ0JDQUhRUUowYWlnQ0FDSUFCRUFnQXlBSFFRTjBhaUFBSUFJZ0JoQ0NCa0VCSVE0Z0IwRUJhaUlIUVFwSERRRU1DUXNMUVFFaERpQUhRUXBQRFFjRFFDQUVJQWRCQW5ScUtBSUFEUUVnQjBFQmFpSUhRUXBIRFFBTERBY0xRUndoQ2d3RUN5QUxJQW9nREdzaUVTQUxJQkZLR3lJSklBOUIvLy8vL3dkelNnMENRVDBoQ2lBUUlBa2dEMm9pQ3lBTElCQklHeUlISUJoS0RRTWdBRUVnSUFjZ0N5QU5FR01nQUNBV0lBOFFXeUFBUVRBZ0J5QUxJQTFCZ0lBRWN4QmpJQUJCTUNBSklCRkJBQkJqSUFBZ0RDQVJFRnNnQUVFZ0lBY2dDeUFOUVlEQUFITVFZd3dCQ3d0QkFDRU9EQU1MUVQwaENndEJvTlFFSUFvMkFnQUxRWDhoRGdzZ0NFSFFBR29rQUNBT0MzOENBWDhCZmlBQXZTSURRalNJcDBIL0QzRWlBa0gvRDBjRWZDQUNSUVJBSUFFZ0FFUUFBQUFBQUFBQUFHRUVmMEVBQlNBQVJBQUFBQUFBQVBCRG9pQUJFSVVHSVFBZ0FTZ0NBRUZBYWdzMkFnQWdBQThMSUFFZ0FrSCtCMnMyQWdBZ0EwTC8vLy8vLy8vL2g0Qi9nMEtBZ0lDQWdJQ0E4RCtFdndVZ0FBc0xxQU1EQW53RGZ3RitJQUM5SWdoQ0lJaW5JZ1ZCK1AvLy93ZHhRYWlvbHY4RFNTSUdSUVJBUkJndFJGVDdJZWsvSUFBZ0FKb2dDRUlBV1NJSEc2RkVCMXdVTXlhbWdUd2dBU0FCbWlBSEc2R2dJUUFnQlVFZmRpRUZSQUFBQUFBQUFBQUFJUUVMSUFBZ0FDQUFJQUNpSWdTaUlnTkVZMVZWVlZWVjFUK2lJQVFnQXlBRUlBU2lJZ01nQXlBRElBTWdBMFJ6VTJEYnkzWHp2cUpFcHBJM29JaCtGRCtnb2tRQlpmTHkyRVJEUDZDaVJDZ0RWc2tpYlcwL29LSkVOOVlHaFBSa2xqK2dva1I2L2hBUkVSSEJQNkFnQkNBRElBTWdBeUFESUFORTFIcS9kSEFxK3o2aVJPbW44RElQdUJJL29LSkVhQkNOR3ZjbU1EK2dva1FWZytEK3lOdFhQNkNpUkpPRWJ1bmpKb0kvb0tKRS9rR3pHN3FocXorZ29xQ2lJQUdnb2lBQm9LQWlBNkFoQVNBR1JRUkFRUUVnQWtFQmRHdTNJZ1FnQUNBRElBRWdBYUlnQVNBRW9LT2hvQ0lBSUFDZ29TSUFtaUFBSUFVYkR3c2dBZ1I4UkFBQUFBQUFBUEMvSUFHaklnUWdCTDFDZ0lDQWdIQ0R2eUlFSUFNZ0FiMUNnSUNBZ0hDRHZ5SUJJQUNob2FJZ0JDQUJva1FBQUFBQUFBRHdQNkNnb2lBRW9BVWdBUXNMOXdNQ0JIOEJmZ0pBQWtBQ1FBSkFBa0FDUUFKQUFuOGdBQ2dDQkNJQklBQW9BbWhIQkVBZ0FDQUJRUUZxTmdJRUlBRXRBQUFNQVFzZ0FCQlZDeUlDUVN0ckRnTUFBUUFCQ3dKL0lBQW9BZ1FpQVNBQUtBSm9Sd1JBSUFBZ0FVRUJhallDQkNBQkxRQUFEQUVMSUFBUVZRc2lBVUU2YTBGMVN3UkFJQUpCTFVZaEJDQUJJUUlNQWdzZ0FDa0RjRUlBV1EwQ0RBVUxJQUpCT210QmRra05BZ3NnQWtFd2F5SURRUXBKQkVCQkFDRUJBMEFnQWlBQlFRcHNhaUVCSUFGQk1Hc2lBVUhNbWJQbUFFZ0NmeUFBS0FJRUlnSWdBQ2dDYUVjRVFDQUFJQUpCQVdvMkFnUWdBaTBBQUF3QkN5QUFFRlVMSWdKQk1Hc2lBMEVKVFhFTkFBc2dBYXdoQlFzQ1FDQURRUXBQRFFBRFFDQUNyU0FGUWdwK2ZFSXdmU0VGQW44Z0FDZ0NCQ0lCSUFBb0FtaEhCRUFnQUNBQlFRRnFOZ0lFSUFFdEFBQU1BUXNnQUJCVkN5SUNRVEJySWdOQkNVc05BU0FGUXE2UGhkZkh3dXVqQVZNTkFBc0xJQU5CQ2trRVFBTkFBbjhnQUNnQ0JDSUJJQUFvQW1oSEJFQWdBQ0FCUVFGcU5nSUVJQUV0QUFBTUFRc2dBQkJWQzBFd2EwRUtTUTBBQ3dzZ0FDa0RjRUlBV1FSQUlBQWdBQ2dDQkVFQmF6WUNCQXRDQUNBRmZTQUZJQVFiRHdzZ0FDQUFLQUlFUVFGck5nSUVEQUVMSUFBcEEzQkNBRk1OQVFzZ0FDQUFLQUlFUVFGck5nSUVDMEtBZ0lDQWdJQ0FnSUIvQzc4Q0FRRi9Jd0JCMEFCcklnUWtBQUpBSUFOQmdJQUJUZ1JBSUFSQklHb2dBU0FDUWdCQ2dJQ0FnSUNBZ1AvL0FCQXVJQVFwQXlnaEFpQUVLUU1nSVFFZ0EwSC8vd0ZKQkVBZ0EwSC8vd0JySVFNTUFnc2dCRUVRYWlBQklBSkNBRUtBZ0lDQWdJQ0EvLzhBRUM1Qi9mOENJQU1nQTBIOS93Sk9HMEgrL3dGcklRTWdCQ2tER0NFQ0lBUXBBeEFoQVF3QkN5QURRWUdBZjBvTkFDQUVRVUJySUFFZ0FrSUFRb0NBZ0lDQWdJQTVFQzRnQkNrRFNDRUNJQVFwQTBBaEFTQURRZlNBZmtzRVFDQURRWTMvQUdvaEF3d0JDeUFFUVRCcUlBRWdBa0lBUW9DQWdJQ0FnSUE1RUM1QjZJRjlJQU1nQTBIb2dYMU1HMEdhL2dGcUlRTWdCQ2tET0NFQ0lBUXBBekFoQVFzZ0JDQUJJQUpDQUNBRFFmLy9BR3F0UWpDR0VDNGdBQ0FFS1FNSU53TUlJQUFnQkNrREFEY0RBQ0FFUWRBQWFpUUFDelVBSUFBZ0FUY0RBQ0FBSUFKQy8vLy8vLy8vUDRNZ0JFSXdpS2RCZ0lBQ2NTQUNRakNJcDBILy93RnhjcTFDTUlhRU53TUlDMFVCQW53Z0FDQUNJQUtpSWdRNUF3QWdBU0FDSUFKRUFBQUFBZ0FBb0VHaUlnTWdBaUFEb2FBaUFxRWlBeUFEb2lBQ0lBS2dJQU9pSUFJZ0FxSWdCS0dnb0RrREFBdmFBUUVFZnlBQUtBSlVJUU1DUUNBQUtBSVVJZ1lnQUNnQ0hDSUZSd1JBSUFBZ0JUWUNGQ0FBSUFVZ0JpQUZheUlGRUlzR0lBVkpEUUVMQWtBZ0F5Z0NFRUhoQUVjRVFDQURLQUlBSVFRTUFRc2dBeUFES0FJRUlnUTJBZ0FMSUFNb0Fnd2dCR29nQVNBREtBSUlJQVJySWdFZ0FpQUJJQUpKR3lJRUVCOGFJQU1nQXlnQ0FDQUVhaUlCTmdJQUlBRWdBeWdDQkUwTkFDQURJQUUyQWdRQ2Z5QURLQUlJSWdJZ0FVc0VRQ0FES0FJTUlBRnFEQUVMSUFBdEFBQkJCSEZGSUFKRmNnMEJJQUlnQXlnQ0RHcEJBV3NMUVFBNkFBQUxJQVFMR0FFQmZ5TUFRUkJySWdFZ0FEa0RDQ0FCS3dNSUlBQ2lDeWdBSUFGRUFBQUFBQUFBd0graUlBQkVpOTBhRldZZ2xzQ2dFT3NEb2tRQUFBQUFBQURBZjZJTEVBQWdBRUVnUmlBQVFRbHJRUVZKY2dzV0FDQUFSUVJBUVFBUEMwR2cxQVFnQURZQ0FFRi9DeU1BQWtBQ1FBSkFJQUlPQWdBQkFnc2dBQ0FCY2c4TElBQWdBWE1QQ3lBQUlBRnhDNDRFQVFwL0l3QkJJR3NpQ1NRQUlBQWdBVWNFUUFKQUFrQUNRQ0FCS0FJTVJRUkFBa0FDUUNBQktBSUlRZjcvLy84SGF3NENBQU1CQ3lBQktBSUVEUUlMSUFBZ0FSQkVHZ3dEQ3lBQktBSUVEUUFnQVNnQ0FDRUZJQUFnQWtFQmRFSERBR29pREVFR2RpSUlFRUVOQUNBRktBSUFRUUFnQ0VFRGRDSUVJQVVvQWdRUkFRQWlCa1VOQUNBRUlBWkJBQ0FJUVFGMElnY2dCeUFCS0FJTUlnUWdCQ0FIU2hzaUMydEJBblFRS3lJR2FpQUxRUUowSWdScklBRW9BaEFnQVNnQ0RFRUNkR29nQkdzZ0JCQWZHaUFCTFFBSVFRRnhCRUFnQmlBR0lBZEJBQkNTQmlFS0N5QUFLQUlRSVEwZ0NTRUVBa0FnREVHQUNFOEVRQ0FGS0FJQVFRQWdCMEg4Ly84L2NVRUVhaUFGS0FJRUVRRUFJZ1JGRFFFTElBVWdEU0FHSUFnZ0JDQUdJQWhCQW5ScUVKTUdJUWNnQkNBSlJ3UkFJQVVvQWdBZ0JFRUFJQVVvQWdRUkFRQWFDeUFIUlEwQ0N5QUZLQUlBSUFaQkFDQUZLQUlFRVFFQUdnc2dBQkExREFFTEFrQUNRQ0FLUlFSQUlBWWdDRUVCYWhDb0F5RUVJQVVvQWdBZ0JrRUFJQVVvQWdRUkFRQWFJQVFOQVNBQktBSVFJQUVvQWd3Z0Myc1FxQU1OQVF3Q0N5QUZLQUlBSUFaQkFDQUZLQUlFRVFFQUdnc2dBQ2dDRUNJRUlBUW9BZ0JCQVhJMkFnQUxJQUJCQURZQ0JDQUFJQUVvQWdoQkFXcEJBWFUyQWdnZ0FDQUNJQU1RemdFYUN5QUpRU0JxSkFBUEMwSFkvUUJCMVB3QVFkTVFRWTRuRUFBQUN6d0JBWDhEUUNBQ1FRQk1SUVJBSUFBZ0FrRUJheUlDUVFKMElnUnFJQU5CSDNRZ0FTQUVhaWdDQUNJRFFRRjJjallDQUF3QkN3c2dBMEVCY1F1ZUJBSU1md0orSXdCQkVHc2lDQ1FBQWtBQ1FDQURRUUZHQkVBZ0FpZ0NBQ0VBSUFoQkRHb2dBaWdDQkJDVUJpRURJQUJCLy84RGNhMGdBRUVRZHEwZ0NEVUNERUlRaG9RaUVpQVNJQU5CQVhTdEloT0FJaElnRTM1OVFoQ0doQ0VUSUFOQkVIUWhBQ0FTcHlJRFFZQ0FCRThFZmlBVFFvQ0FnSUFRZlFVZ0V5QVNJQkorUXYzLy8vOFBnMzBMSVJJZ0FDQURhaUVHSUJKQ0FGTUVRQ0FTSUFaQkFXc2lCcTFDQVlaOFFnRjhJUklMSUFFZ0JqWUNBQ0FDSUJJK0FnQWdFa0lnaUtjaEJnd0JDMEYvSVEwZ0FDQUJJQU5CQVhZaUIwRUNkR29pQ1NBQ0lBTkJmbkVpRDBFQ2RHb2lEQ0FESUFkcklnb2dCQ0FJUVFocUVKTUdEUUVnQ0NnQ0NDSUxCRUFnRENBTUlBa2dDaENZQWhvTElBQWdCQ0FDSUFkQkFuUWlCbW9pRGlBRElBa2dDaENsQkEwQklBUWdCbW9vQWdBaEVFRUFJUVlEUUNBR0lBZEdSUVJBSUFFZ0JrRUNkQ0lSYWlBRUlCRnFLQUlBTmdJQUlBWkJBV29oQmd3QkN3c2dDeUFRYWlJTFFRRjJJUVlnQVNBQklBY2dDMEVCY1JDU0JnUi9JQTRnRGlBSklBb1FxZ1FGUVFBTElRUWdDU0FHSUFvUXFRTWFJQVFnRENBTFFRRk5CSDhnQUNBQ0lBTkJBblJxSWdBZ0FTQUhJQUVnQnhEWEFnMENJQUlnQWlBQUlBOFFtQUlGSUFZTElBTkJBWEVRMkFKcklnWkJBRTROQUNBQlFRRWdBeERZQWhvZ0FpQUJJQU5CQWhDY0JpQUdhaUFDUVFFZ0F4Q3BBMm9oQmdzZ0JTQUdOZ0lBUVFBaERRc2dDRUVRYWlRQUlBMExtQUVCQW44Z0FDQUJRZjhCY1NBQlFRaDJRZjhCY1NBQlFSZDJRZjREY1VIZ3BBUnFMd0VBSWdCQkFYUWlBa0YvYzBFQUlBRkJFSFlnQUNBQWJHc2lBU0FDU3lJQ0d5QUJha0VJZEhJaUFTQUFJQUpxSWdKQkFYUWlBMjRpQUNBQWJHc2dBU0FBSUFOc2EwRUlkR29pQVVFZmRTQUNRUWgwSUFCcUlnQkJBV3NpQWtFQmRFRUJjbkVnQVdvMkFnQWdBaUFBSUFGQkFFZ2JDemtCQVg4akFFRVFheUlCSkFBZ0FBUi9JQUZCREdvZ0FDQUFaeUlBUVI1eGRCQ1VCaUFBUVFGMmRnVkJBQXNoQUNBQlFSQnFKQUFnQUF2ZUNBRVFmeUFDSUFFZ0FTQUNFTk1CSWdsQkFFZ2lCeHNoQ0FKQUlBa2dBaWdDQkNBRmN5SUZJQUVvQWdRaUJuTWlEa1Z5RFFBZ0NDZ0NDRUg5Ly8vL0Iwb05BQ0FBSUFSQkIzRkJBa1lRaVFGQkFBOExJQVVnQmlBSEd5RUZJQUVnQWlBSEd5RUpBa0FDUUFKQUlBZ29BZ3dpQmdSQUlBa29BZ3dpQ3cwQkN5QUlLQUlJSWdGQi92Ly8vd2RPQkVBZ0FVSC8vLy8vQjBZRVFDQUFFRFZCQUE4TElBNUZJQWtvQWdoQi92Ly8vd2RIY2tVRVFDQUFFRFZCQVE4TElBQWdCUkNNQVVFQUR3c2dBQ0FJRUVRYUlBQWdCVFlDQkF3QkN5QUFJQVUyQWdRZ0FDQUlLQUlJTmdJSUlBZ29BZ2dpQVNBSktBSUlJZ2RySVFvQ1FDQU9SUVJBUVFBaEJRd0JDMEVCSVFVZ0NrRUJTZzBBSUFaQkJYUkJBV3NoQWlBTElBWnJRUVYwSUFGcUlBZHJRUjlySVE4Z0NTZ0NFQ0VRUVFBaEJRTkFRUUFoQVNBQ1FRVjFJZ2NnQmtrRVFDQUlLQUlRSUFkQkFuUnFLQUlBSVFFTElCQWdDeUFDSUE5cUVHZ2lCeUFCUmdSQUlBSkJJR3NoQWlBRlFTQnFJUVVNQVFzTElBRWdCM01pRFdjaUVVRUJhaUVNQWtBZ0RVRUNTUVJBSUFVZ0RHb2hCUXdCQ3lBRklBRkJmMEVmSUJGcklnMTBRWDl6SWdWeFp5SUJJQVVnQjBGL2MzRm5JZ1VnQVNBRlNCc2lBV29oQlNBQklBeHJJQTFIRFFFTEEwQWdCU0VIUVFBaEFTQUNRU0JySWdKQkJYVWlCU0FHU1FSQUlBZ29BaEFnQlVFQ2RHb29BZ0FoQVFzZ0VDQUxJQUlnRDJvUWFDRU1JQUZGQkVBZ0IwRWdhaUVGSUF4QmYwWU5BUXNMSUFGbklnRWdERUYvYzJjaUFpQUJJQUpJR3lBSGFpRUZDeUFBSUFNZ0JXcEJJV3BCQlhZaUFpQUdJQXBCSDJwQklHMGdDMm9pQVNBQklBWklHeUlCSUFFZ0Frb2JJZ2NRUVEwQlFRQWdDQ2dDRENJVElBZHJJZzlySWdKQkgzVWdBbkVoRkNBSElBRnJJUUpCQUNBT2F5RVFJQWtvQWd3aURFRUZkQ0VOUVFBZ0RDQUhhMEVGZENBS2FpSVJhMEVGZFNFU0lBNGhBVUVBSVFzRFFDQUNRUUJPQkVBQ1FFRUFJUUlEUUNBQ0lBZEdEUUZCQUNFRklBQW9BaEFnQWtFQ2RHb2dBU0FDSUE5cUlnWWdDQ2dDREVrRWZ5QUlLQUlRSUFaQkFuUnFLQUlBQlVFQUN5QUpLQUlRSUFrb0Fnd2dBa0VGZENBUmFoQm9JQkJ6SWdWcUlnRnFJZ1kyQWdBZ0FTQUZTU0FCSUFaTGNpRUJJQUpCQVdvaEFnd0FDd0FMQlNBQ1FRVjBJQkZxSVFZQ1FBSi9Ba0FnQWlBUGFpSUtRUUJPSUFvZ0UwbHhSUVJBSUFaQllVZ2lGVVVFUUVFQUlRVWdCaUFOU0EwQ0N5QUtRUjkxSUJSeElnSWdFaUFDSUJKSUd5QUNJQlViSVFKQkFDRUZRUUFoQ2d3REN5QUlLQUlRSUFwQkFuUnFLQUlBSVFWQkFDQUdRV0ZJSUFZZ0RVNXlEUUVhQ3lBSktBSVFJQXdnQmhCb0N5RUtJQUpCQVdvaEFnc2dDaUFRY3lJR0lBVnFJZ1VnQmtrZ0JTQUJJQVZxSWdWTGNpRUJJQVVnQzNJaEN3d0JDd3NnQUNnQ0VDSUNJQUlvQWdBZ0MwRUFSM0kyQWdBZ0RpQUJSWElOQUNBQUlBZEJBV29RUVEwQklBQW9BaEFnQjBFQ2RHcEJBVFlDQUNBQUlBQW9BZ2hCSUdvMkFnZ0xJQUFnQXlBRUVMTUNEd3NnQUJBMVFTQUwyZ0VCQW40Q1FBSkFJQUpGQkVBZ0FVS0FnSUNBY0lNaEJTQUFRUzhRTFNFRURBRUxBbjRnQVVLQWdJQ0FjSU1pQlVLQWdJQ0FNRklnQXlrREFDSUVRb0NBZ0lCd2cwS0FnSUNBZ0g5U2NrVUVRQ0FBUWJ1VUFTQUFJQUFvQWhBZ0JLY1F3UUlRTFVHdGxBRVF2Z0VNQVFzZ0FDQUVFQ2dMSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVFzZ0JVS0FnSUNBTUZFTkFDQUFJQUZCQlJCbElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFDQUFJQUVnQkJEYkFTQUFJQUZCTUNBRXB5a0NCRUwvLy8vL0I0TkJBQkFaR2dzZ0FTRUVDeUFFQzFVQkFYNGdBQ0FEclNBRXJTQUJJQUpCSDNVaUFHdXRmaUFBSUFOeElBSnFyWHhDSUlpbklBRnFJZ0N0UW4rRmZpQUNyU0FCclVJZ2hvUjhJZ1ZDSUlpbklnRWdBM0VnQmFkcU5nSUFJQUFnQVdwQkFXb0x0Z1VCQzM4Q1FBSkFBa0FDUUFKQUFrQWdBMEVDVFFSQUlBQW9BZ0JCQUNBRFFRRjBJZ2RCQVhJaUNFRUNkQ0FBS0FJRUVRRUFJUVlnQUNnQ0FFRUFJQU5CQW5SQkNHb2dBQ2dDQkJFQkFDSUZSU0FHUlhJTkFnTkFJQVFnQjBaRkJFQWdCaUFFUVFKMGFrRUFOZ0lBSUFSQkFXb2hCQXdCQ3dzZ0JpQUhRUUowYWtFQk5nSUFJQUFnQlNBR0lBZ2dBaUFERUtVRURRSWdBMEVCYWlFQ1FRQWhCQU5BSUFJZ0JFWkZCRUFnQVNBRVFRSjBJZ2RxSUFVZ0Iyb29BZ0EyQWdBZ0JFRUJhaUVFREFFTEN5QUdJQU1RcUFNTkFTQUJRUUVnQWhEWUFob01BUXNnQUNnQ0FFRUFJQU1nQTBFQmEwRUJkaUlIYXlJSUlBTnFJZ1JCQVdvaURFRUNkQ0FBS0FJRUVRRUFJZ1ZGSUFBb0FnQkJBQ0FJUVF4c1FRaHFJQUFvQWdRUkFRQWlCa1Z5RFFFZ0FDQUJJQWRCQW5RaUNXb2lDaUFDSUFscUlBZ1FtUVlOQWlBQUlBVWdBaUFESUFvZ0NFRUJhaUlKRU5jQ0RRSWdCU0FEUVFKMGFpRUxJQVVnQkVFQ2RHb2hEUU5BSUEwb0FnQUVRQ0FLUVFFZ0NSRFlBaG9nQ3lBRklBVWdBaUFERUpnQ0lBa1EyQUlhREFFTEN5QU1RUUFnREVFQVNoc2hBMEVBSVFKQkFDRUVBMEFnQXlBRVJrVUVRQ0FGSUFSQkFuUnFJZ3RCQUNBTEtBSUFJZ3RySWc0Z0FtczJBZ0FnQzBFQVJ5QUNJQTVMY2lFQ0lBUkJBV29oQkF3QkN3c2dEU0FOS0FJQVFRRnFOZ0lBSUFBZ0JpQUZJQWRCQW5ScUlBd2dCMnNnQ2lBSkVOY0NEUUlnQ0VFQmRDSUNJQWRySVFOQkFDRUVBMEFnQkNBSFJrVUVRQ0FCSUFSQkFuUnFJQVlnQXlBRWFrRUNkR29vQWdBMkFnQWdCRUVCYWlFRURBRUxDeUFLSUFvZ0JpQUNRUUowYWlBSUVLb0VHZ3RCQUNFRUlBQW9BZ0FnQlVFQUlBQW9BZ1FSQVFBYURBTUxJQVZGRFFFTElBQW9BZ0FnQlVFQUlBQW9BZ1FSQVFBYUMwRi9JUVFnQmtVTkFRc2dBQ2dDQUNBR1FRQWdBQ2dDQkJFQkFCb0xJQVFMYndJRGZ3RitJQUt0UWlDR0lBT3RnRUwvLy8vL0Q0TWhDRUVCSVFVRFFDQUJJQVpHUlFSQUlBQWdCa0VDZEdvaUJ5QUhLQUlBSUFVZ0F5QUVFTllDTmdJQUlBSWdCV3dnQ0NBRnJYNUNJSWluSUFOc2F5SUZJQU5CQUNBRElBVk5HMnNoQlNBR1FRRnFJUVlNQVFzTEMxOEJBbjhnQWtFZmNTRUVJQUVnQWtFRmRTSUNTd1JBSUFBZ0FrRUNkR29pQlNBRktBSUFJQU1nQkhSeU5nSUFDd0pBSUFSRkRRQWdBU0FDUVFGcUlnRk5EUUFnQUNBQlFRSjBhaUlBSUFBb0FnQWdBMEVnSUFScmRuSTJBZ0FMQzFRQ0EzOENmaUFEclNFSFFRQWhBd05BSUFJZ0EwWkZCRUFnQUNBRFFRSjBJZ1ZxSWdZZ0JqVUNBQ0FFclNBQklBVnFOUUlBSUFkK2ZId2lDRDRDQUNBSVFpQ0lweUVFSUFOQkFXb2hBd3dCQ3dzZ0JBdlZBZ0lKZndGK1FYOGhCZ0pBSUFBZ0FTQURRUk1nQTBFQmRpSUhJQWRCRTA4YklBTkJGRWdiSWdjZ0F5QUhheUlJUVFFZ0IzUWlDVUVCSUFoMElneEJBQ0FGRUtjRURRQWdBQ0FDSUFjZ0NDQUpJQXhCQUNBRkVLY0VEUUFDUUNBRElBZEhCRUJCQUNFR0EwQWdCaUFKUmcwQ0lBQWdBU0FHSUFoMFFRSjBJZ05xSUFJZ0Eyb2dDQ0FFSUFVUW5RWWFJQVpCQVdvaEJnd0FDd0FMSUFBZ0JVR29BV3hxSUFSQkEzUnFJZ1JCekJOcU5RSUFJUThnQkVISUUyb29BZ0FoRFNBRlFRSjBJZ1pCa0trRWFpZ0NBQ0VFSUFBZ0Jtb29BZ1FoRGtFQUlRWURRQ0FHSUFOMkRRRWdBU0FHUVFKMElncHFJZ3NnQ3lnQ0FDSUxJQVJCQUNBRUlBdE5HMnNnQWlBS2FpZ0NBQ0FFSUE0UTFnSWlDaUFOYkNBRUlBcXRJQTkrUWlDSXAyeHJOZ0lBSUFaQkFXb2hCZ3dBQ3dBTFFYOUJBQ0FBSUFFZ0J5QUlJQWtnREVFQklBVVFwd1FiSVFZTElBWUxvUUVDQTM4Q2ZpQUROUUlBSVFnRFFDQUNJQVZHUlFSQUlBQWdCVUVDZENJSGFpQUdyU0FCSUFkcU5RSUFJQWgrZkNJSlBnSUFJQVZCQVdvaEJTQUpRaUNJcHlFR0RBRUxDeUFBSUFKQkFuUnFJQVkyQWdCQkFTQUVJQVJCQVUwYklRUkJBU0VGQTBBZ0JDQUZSa1VFUUNBQUlBSWdCV3BCQW5ScUlBQWdCVUVDZENJR2FpQUJJQUlnQXlBR2FpZ0NBQkNjQmpZQ0FDQUZRUUZxSVFVTUFRc0xDNVVTQWhwL0FuNENRQ0FBS0FJNElnb05BQ0FBS0FJQVFRQkJ1Qm9nQUNnQ0JCRUJBQ0lLUlFSQVFYOFBDeUFLUVFScVFRQkJ0Qm9RS3hvZ0FDQUtOZ0k0SUFvZ0FEWUNBQU5BSUFsQkJVWUVRRUVBSVFkQkFDRUlBMEFnQjBFRVJnMERJQWRCQVdvaUJ5RUFBMEFnQUVFRlJnMEJJQW9nQ0VFQ2RDSU5ha0dRR21vZ0RVSGdxUVJxTlFJQVFpQ0dJQUJCQW5SQmtLa0VhalVDQUlBK0FnQWdBRUVCYWlFQUlBaEJBV29oQ0F3QUN3QUxBQXNnQ2lBSlFRSjBJZ3RxUW9DQWdJQ0FnSUNBSUNBTFFaQ3BCR29vQWdBaURhMGlJWUNuSWc0MkFnUkJBU0VJSUExQkFXcEJBWFloREVFQUlRZEJBQ0VBQTBBZ0FFRVZSd1JBSUFvZ0NVR29BV3hxSUFCQkEzUnFJaEJCekJOcUlBaXRRaUNHSUNHQVBnSUFJQkJCeUJOcUlBZzJBZ0FnQUVFQmFpRUFJQWdnRENBTklBNFExZ0loQ0F3QkN3c0RRQUpBSUFkQkFrY0VRQ0FIUVJSc0lBdHFRYkNwQkdvb0FnQWhBRUVBSVFnRFFDQUlRUlJHRFFJZ0NpQUpRYWdCYkdvZ0IwSFVBR3hxUVJRZ0NHdEJBblJxSWd3Z0FLMUNJSVlnSVlBK0F1QUdJQXdnQURZQ0dDQUlRUUZxSVFnZ0FDQUFJQTBnRGhEV0FpRUFEQUFMQUFzZ0NVRUJhaUVKREFJTElBZEJBV29oQnd3QUN3QUxBQXNnQXlBRmFpSVFRUVYwSVE5QkJDRUxRUU1oQ1VFQUlRZEJBQ0VPUVg4aERRTkFJQWxCQmtjRVFFSGNBRUVBSUFsclFRSjBRZFNsQkdvb0FnQWlFVUVFYTBFQ2JTSUFJQUJCM0FCT0d5RUFBMEFDUUVFZ0lBQkJBV3NpQ0NBUGFpQUFiaUlNUVFGcloydEJBQ0FNUVFKUEd5SU1RUlJMRFFBZ0VTQU1JQUJCQVhScVRnUkFJQXhCQVdvZ0RIUWdDV3dpQ0NBTlR3MEJJQUFoQnlBTUlRNGdDU0VMSUFnaERRd0JDeUFJSWdBTkFRc0xJQWxCQVdvaENRd0JDd3NnQndSQUFrQUNRQUpBSUFaQkEzRkZCRUFnQmtFRWNRMEJJQUZCQUJCQkdnd0JDeUFHUVFKeERRRUxJQVVoRENBRUlRME1BUXNnQXlFTUlBSWhEU0FGSVFNZ0JDRUNDeUFLS0FJQUlnQW9BZ0JCQUNBTFFRUWdEblFpQ0d3aUVTQUFLQUlFRVFFQUlnUUVmeUFLSUFSQkFTQU9kQ0lGSUFJZ0EwRTlJQWRCUFNBT2RDQVBUeHNnQnlBSFFUMUtHeUlDUVFVZ0Myc2lCeUFMRUtrRUlBWkJCM0ZCQVVZRVFDQUJRUUFRUVJvTElBWkJCSEVoQXlBS0tBSUFJZ0FvQWdBaEJpQUFLQUlFSVFrQ1FBSkFBa0FDUUNBT1FRMU5CRUJCQUNFQUlBWkJBQ0FSSUFrUkFRQWlDVVVOQWlBS0lBa2dCU0FOSUF3Z0FpQUhJQXNRcVFRZ0F3MEJJQUZCQUJCQkdnd0JDMEVBSVFBZ0JrRUFJQWdnQ1JFQkFDSUpSUTBCQ3lBTFFRQWdDMEVBU2hzaEJ5QU9RUTVKSVE4Q1FBTkFJQUFnQjBZTkFRSi9JQTlGQkVBZ0NpQUpJQVVnRFNBTUlBSWdBQ0FMYTBFRmFpSUlRUUVRcVFRZ0FDQU9kQ0VHSUFrTUFRc2dBQ0FMYTBFRmFpRUlJQWtnQUNBT2RDSUdRUUowYWdzaEVTQUFRUUZxSVFBZ0NpQUVJQVpCQW5ScUlCRWdEaUFPSUFnUW5RWkZEUUFMSUFraEFBd0JDeUFERFFGQkFDRUFJQUZCQUJCQkdpQUtJQWtRMVFJZ0FTQVFFRUZGRFFJTElBb29BZ0FpQVNnQ0FDQUVRUUFnQVNnQ0JCRUJBQm9nQ2lBQUVOVUNRWDhQQ3lBS0lBa1ExUUlMSUFFb0FoQWhBeUFRSVFVZ0JDRUpRUUFoQUVFQUlSQWpBRUhnQUdzaUJ5UUFJQUlpQmtFZmNTRUlRWDhnQW5SQmYzTWhCQ0FMUVFGcklnRWdDMnhCZm0xQkNtb2hGQU5BSUFCQkJVWUVRQUpBSUFaQkFXc2hBa0VBSUF0cklROUJBQ0VBQTBBZ0FFRUZSd1JBSUFkQklHb2dBRUVDZEdwQkFEWUNBQ0FBUVFGcUlRQU1BUXNMSUFOQkFDQUZRUUowRUNzaEVVRUJJQTUwSWdBZ0FpQUZRUVYwYWlBR2JpSURJQUFnQTBnYklnQkJBQ0FBUVFCS0d5RVZJQVJCZnlBSUd5RVdJQUpCQlhZaUF5QUJJQUVnQTBnYklSY2dBVUVBSUFGQkFFb2JJUmdnQzBFQUlBdEJBRW9iSVJrZ0MwRUNheUVNSUFOQkFXb2hEU0FQUVFKMFFhU3BCR29oRHlBVVFRSjBJZ0JCNEtrRWFpRVVJQUFnQ21wQmtCcHFJUm9nQVVFQ2RDSUFJQWRCSUdvaUFtb2hHeUFIUVVCcklBQnFJUndnQTBFQ2RDQUNhaUVkSUFjZ0FTQURhMEVDZEdvaEhpQUlRUjl6SVI4RFFFRUFJUUFnRUNBVlJnMEJBMEFnQUNBWlJnUkFRUUFoQUVFQUlRRURRQ0FBSUJoSEJFQWdCMEZBYXlBQVFRSjBhaUVTSUFCQkFXb2lBaUVBQTBBZ0FDQUxUZ1JBSUFJaEFBd0RCU0FBUVFKMElnUWdCMEZBYTJvaUV5QUVJQTlxS0FJQUlnUWdFeWdDQUNBU0tBSUFhMm9pRXlBVUlBRkJBblFpSUdvb0FnQnNJQVFnR2lBZ2FqVUNBQ0FUclg1Q0lJaW5iR3NpRXlBRVFRQWdCQ0FUVFJ0ck5nSUFJQUJCQVdvaEFDQUJRUUZxSVFFTUFRc0FDd0FMQ3lBSElCd29BZ0EyQWlCQkFTRUJJQXdoQkFOQUlBUkJBRW9FUUNBUElBUkJBblFpQUdvMUFnQWhJU0FIUVVCcklBQnFLQUlBSVFKQkFDRUFBMEFnQUNBQlJ3UkFJQWRCSUdvZ0FFRUNkR29pRWlBQ3JTQWhJQkkxQWdCK2ZDSWlQZ0lBSUFCQkFXb2hBQ0FpUWlDSXB5RUNEQUVMQ3lBSFFTQnFJQUZCQW5ScUlBSTJBZ0FnQkVFQmF5RUVJQUZCQVdvaEFRd0JDd3NnRHlBRVFRSjBhalVDQUNFaFFRQWhBQ0FIS0FKQUlRSURRQ0FBSUFGSkJFQWdBRUVDZENJRUlBZEJJR3BxSWhJZ0JDQUhhalVDQUNBQ3JTQWhJQkkxQWdCK2ZId2lJajRDQUNBaVFpQ0lweUVDSUFCQkFXb2hBQXdCQ3dzZ0FVRUNkQ0lBSUFkQklHcHFJQUFnQjJvb0FnQWdBbW8yQWdBZ0JpQVFiQ0VDUVFBaEFBTkFJQUFnQTBjRVFDQVJJQVVnQWlBSFFTQnFJQUJCQW5ScUtBSUFFSnNHSUFCQkFXb2hBQ0FDUVNCcUlRSU1BUXNMSUJFZ0JTQUNJQjBvQWdBaUFTQVdjUkNiQmlBTklRSWdBeUVBQWtBZ0NFVUVRQU5BSUFJZ0MwNE5BaUFISUFJZ0RXdEJBblJxSUFkQklHb2dBa0VDZEdvb0FnQTJBZ0FnQWtFQmFpRUNEQUFMQUFzRFFDQUFJQmRIQkVBZ0J5QUFJQU5yUVFKMGFpQUhRU0JxSUFCQkFXb2lBRUVDZEdvb0FnQWlBa0VCZENBZmRDQUJJQWgyY2pZQ0FDQUNJUUVNQVFzTElCNGdHeWdDQUNBSWRqWUNBQXNnRUVFQmFpRVFEQUlGSUFCQkFuUWlBU0FIUVVCcmFpQUpJQUFnRG5RZ0VHcEJBblJxS0FJQUlnSWdBU0FQYWlnQ0FDSUJRUUFnQVNBQ1RSdHJOZ0lBSUFCQkFXb2hBQXdCQ3dBTEFBc0FDd1VnQnlBQVFRSjBha0VBTmdJQUlBQkJBV29oQUF3QkN3c2dCMEhnQUdva0FDQUtLQUlBSWdBb0FnQWdDVUVBSUFBb0FnUVJBUUFhUVFBRlFYOExEd3NRQVFBTFN3RUNmeUFBSUFGSEJFQWdBQ2dDRUNJQ0JFQWdBQ2dDQUNJREtBSUFJQUpCQUNBREtBSUVFUUVBR2dzZ0FDQUJLUUlBTndJQUlBQWdBU2dDRURZQ0VDQUFJQUVwQWdnM0FnZ0xDNlFDQVFsL0lBRkJCbkVoQmlBQlFRSjJRUUZ4SVFwQjRPQURJUU1DUUFOQUlBTkJydjREVHcwQklBSWhCQ0FETFFBQUlnSkJIM0VoQlFKL0lBTkJBV29nQWtFRmRpSUNRUWRIRFFBYUlBTXNBQUVpQ0VIL0FYRWhBaUFJUVFCT0JFQWdBa0VIYWlFQ0lBTkJBbW9NQVFzZ0F5MEFBaUVKSUFoQnYzOU5CRUFnQWtFSWRDQUpja0g1L2dGcklRSWdBMEVEYWd3QkN5QURMUUFESUFKQkVIUnlJQWxCQ0hSeVFmbisvZ1ZySVFJZ0EwRUVhZ3NoQXlBQ0lBUnFRUUZxSVFJQ1FBSkFJQVZCSDBZRVFDQUdSUTBESUFaQkJrWU5BU0FFSUFwcUlRUURRQ0FDSUFSTkRRUWdBQ0FFSUFSQkFXb1FmaUVGSUFSQkFtb2hCQ0FGUlEwQUN3d0NDeUFCSUFWMlFRRnhSUTBDQ3lBQUlBUWdBaEIrUlEwQkN3dEJmeUVIQ3lBSEM3VUJBUWQvSUFBb0FnQWhCU0FBS0FJSUlRSURRQ0FCUVFGcUlnTWdCVTVGQkVBQ1FDQUNJQUZCQW5ScUtBSUFJZ2NnQWlBRFFRSjBhaWdDQUVZRVFDQUJJUU1NQVFzRFFBSkFJQUVpQTBFQmFpRUdJQUZCQTJvZ0JVNE5BQ0FDSUFaQkFuUnFLQUlBSUFJZ0EwRUNhaUlCUVFKMGFpZ0NBRVlOQVFzTElBSWdCRUVDZEdvaUFTQUhOZ0lBSUFFZ0FpQUdRUUowYWlnQ0FEWUNCQ0FFUVFKcUlRUUxJQU5CQW1vaEFRd0JDd3NnQUNBRU5nSUFDek1BSUFFQ2Z5QUNLQUpNUVFCSUJFQWdBQ0FCSUFJUXVnUU1BUXNnQUNBQklBSVF1Z1FMSWdCR0JFQVBDeUFBSUFGdUdndlBBUUVEZnlBQklBSXZBQUFnQWkwQUFrRVFkRUdBZ1B3QWNYSkpCRUFnQUVFQU5nSUFRUUFQQzBGL0lRVWdBU0FDSUFOQkFXc2lCRUVEYkdvaUF5OEFBQ0FETFFBQ1FSQjBja2tFZjBFQUlRTURRQ0FFSUFOclFRSklSUVJBSUFNZ0JHcEJBbTBpQlNBRUlBSWdCVUVEYkdvaUJDOEFBQ0FFTFFBQ1FSQjBRWUNBL0FCeGNpQUJTeUlHR3lFRUlBTWdCU0FHR3lFRERBRUxDeUFBSUFJZ0EwRURiR29pQUM4QUFDQUFMUUFDSWdCQkVIUkJnSUQ4QUhGeU5nSUFJQU5CQlhRZ0FFRUZkbkpCSUdvRlFYOExDOW9hQVFwL0lBQW9BZ1FoRFNBQUtBSUlJUXdEUUNBRklRY2dCRUVCYWlFSUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSi9Ba0FDUUFKQUlBUXRBQUFpQ1VFQmF3NGNBZ0VJQ1FZSEJSVVZBQW9LQ3c0TURSRVJFaElhR1FRRUR4QVlGeFlMUVFFaENTQUdSUTBmSUFjUEMwRUZJUW9nQ0NnQUFBd0JDMEVESVFvZ0NDOEFBQXNoQ0NBSElBMVBEUnNDUUNBTVJRUkFJQWRCQVdvaEJTQUhMUUFBSVFrTUFRc2dCeThCQUNJSlFZRDRBM0ZCZ0xBRFJ5QU1RUUpIY2lBTklBZEJBbW9pQlUxeURRQWdCUzhCQUNJTFFZRDRBM0ZCZ0xnRFJ3MEFJQWxCQ25SQmdQZy9jU0FMUWY4SGNYSkJnSUFFYWlFSklBZEJCR29oQlFzZ0JDQUthaUVFSUFBb0FoZ0VmeUFKSUFBb0Fod1EzUUVGSUFrTElBaEdEU0FNR3dzZ0FDQUJJQUlnQXlBRUtBQUJJQVJCQldvaUJHb2dCeUFKUVJaclFRQVFyZ1JCQUU0Tkh3d1pDeUFJS0FBQUlBaHFRUVJxSVFRTUZ3c2dDQ0VFSUFVZ0FDZ0NBQ0lIUmcwZElBQW9BaFJGRFJnQ1FDQU1SUVJBSUFWQkFXc3RBQUFoQ2d3QkN5QUZRUUpyTHdFQUlncEJnUGdEY1VHQXVBTkhJQXhCQWtkeURRQWdCeUFGUVFScklnZExEUUFnQnk4QkFDSUhRWUQ0QTNGQmdMQURSdzBBSUFwQi93ZHhJQWRCL3dkeFFRcDBja0dBZ0FScUlRb0xJQW9RclFRTkhRd1lDeUFJSVFRZ0J5QU5JZ1ZHRFJ3Z0FDZ0NGRVVORndKQUlBeEZCRUFnQnkwQUFDRUpEQUVMSUFjdkFRQWlDVUdBK0FOeFFZQ3dBMGNnREVFQ1IzSWdCMEVDYWlBTlQzSU5BQ0FITHdFQ0lnVkJnUGdEY1VHQXVBTkhEUUFnQ1VFS2RFR0ErRDl4SUFWQi93ZHhja0dBZ0FScUlRa0xJQWNoQlNBSkVLMEVEUndNRndzZ0J5QU5SZzBXQWtBZ0RFVUVRQ0FIUVFGcUlRVWdCeTBBQUNFSkRBRUxJQWN2QVFBaUNVR0ErQU54UVlDd0EwY2dERUVDUjNJZ0RTQUhRUUpxSWdWTmNnMEFJQVV2QVFBaUJFR0ErQU54UVlDNEEwY05BQ0FKUVFwMFFZRDRQM0VnQkVIL0IzRnlRWUNBQkdvaENTQUhRUVJxSVFVTElBZ2hCQ0FKRUswRVJRMGJEQllMSUFjZ0RVWU5GU0FNUlFSQUlBZEJBV29oQlNBSUlRUU1Hd3NnQjBFQ2FpRUZJQWdoQkNBSEx3RUFRWUQ0QTNGQmdMQURSeUFNUVFKSGNnMGFJQVVnRFU4TkdpQUhRUVJxSUFVZ0J5OEJBa0dBK0FOeFFZQzRBMFliSVFVTUdnc2dDQzBBQUNJRklBQW9BZ3hQRFFrZ0NTQUZRUUYwYWtFQ2RDQUJha0VzYXlBSE5nSUFJQVJCQW1vaEJBd1NDeUFFTFFBQ0lna2dBQ2dDREU4TkJ5QUVRUU5xSVFRZ0NDMEFBQ0VGQTBBZ0JTQUpTdzBTSUFFZ0JVRURkR3BDQURjQ0FDQUZRUUZxSVFVTUFBc0FDeUFDSUFOQkFuUnFJQVFvQUFFMkFnQWdBMEVCYWlFRElBUkJCV29oQkF3UUN5QURRUUZySVFNTURnc2dCQ2dBQVNFRklBTkJBblFnQW1wQkJHc2lDQ0FJS0FJQVFRRnJJZ2cyQWdBZ0JDQUZRUUFnQ0J0cVFRVnFJUVFNRGdzZ0FpQURRUUowYWlBSE5nSUFJQU5CQVdvaEF3d01DeUFFSUFRb0FBRkJBQ0FDSUFOQkFXc2lBMEVDZEdvb0FnQWdCMGNiYWtFRmFpRUVEQXdMUVFBaEMwRUFJUW9nQUNnQ0FDSUVJQWRIQkVBQ1FDQU1SUVJBSUFkQkFXc3RBQUFoQlF3QkN5QUhRUUpyTHdFQUlnVkJnUGdEY1VHQXVBTkhJQXhCQWtkeURRQWdCQ0FIUVFScklnUkxEUUFnQkM4QkFDSUVRWUQ0QTNGQmdMQURSdzBBSUFWQi93ZHhJQVJCL3dkeFFRcDBja0dBZ0FScUlRVUxJQVVRcndNaENnc2dCeUFOU1FSQUFrQWdERVVFUUNBSExRQUFJUVVNQVFzZ0J5OEJBQ0lGUVlENEEzRkJnTEFEUnlBTVFRSkhjaUFIUVFKcUlBMVBjZzBBSUFjdkFRSWlCRUdBK0FOeFFZQzRBMGNOQUNBRlFRcDBRWUQ0UDNFZ0JFSC9CM0Z5UVlDQUJHb2hCUXNnQlJDdkF5RUxDeUFISVFVZ0NDRUVRUklnQ1dzZ0NpQUxjMFlORWd3TkN5QUVMUUFCSWdnZ0FDZ0NERThORENBRVFRSnFJUVFnQVNBSVFRTjBhaUlIS0FJQUlnaEZEUkVnQnlnQ0JDSUtSUTBSSUFsQkUwWU5DQU5BSUFnZ0NrOE5FaUFGSUFBb0FnQWlEa1lORFFKQUFrQUNRQ0FNQkVBZ0NrRUNheUlITHdFQUlnbEJnUGdEY1VHQXVBTkhJQXhCQWtkeUlBY2dDRTF5RFFFZ0NrRUVheUlLTHdFQUlndEJnUGdEY1VHQXNBTkhEUUVnQ1VIL0IzRWdDMEgvQjNGQkNuUnlRWUNBQkdvaENRd0NDeUFGUVFGcklnVXRBQUFoQ3lBS1FRRnJJZ290QUFBaENRd0NDeUFISVFvTEFrQWdCVUVDYXlJSEx3RUFJZ3RCZ1BnRGNVR0F1QU5ISUF4QkFrZHlJQWNnRGsxeURRQWdCVUVFYXlJRkx3RUFJZzVCZ1BnRGNVR0FzQU5IRFFBZ0MwSC9CM0VnRGtIL0IzRkJDblJ5UVlDQUJHb2hDd3dCQ3lBSElRVUxJQUFvQWhnRWZ5QUpJQUFvQWh3aUJ4RGRBU0VKSUFzZ0J4RGRBUVVnQ3dzZ0NVWU5BQXNNREF0QjdpbEJ3UHdBUWQwUlFjN1hBQkFBQUF0QjF5bEJ3UHdBUWRRUlFjN1hBQkFBQUFzZ0JFRUZhaUlJSUFnZ0JDZ0FBV29pQ2lBSlFRbEdJZ3NiSVFSQmZ5RUpJQUFnQVNBQ0lBTWdDaUFJSUFzYklBZEJBRUVBRUs0RVFRQk9EUTRNQ3dzUUFRQUxJQVJCRVdvaUVDQUVLQUFCYWlFTElBUW9BQWtoRHlBRUtBQUZJUTVCQUNFS0EwQUNRQUpBSUFBZ0FTQUNJQU1nRUNBRlFRRVFwUVlpQ1VFQmFnNENEQUVBQ3lBS1FRRnFJUW9nQ1NFRklBOUIvLy8vL3dkR0lBb2dEMGx5RFFFTEN5QUtJQTVKRFFjZ0N5RUVJQW9nRGswTkRDQUFJQUVnQWlBRElBZ2dCVUVESUFvZ0Rtc1FyZ1JCQUU0TkRBd0dDeUFISUFBb0FnQWlDVVlOQmlBTVJRUkFJQWRCQVdzaEJTQUlJUVFNREFzZ0IwRUNheUVGSUFnaEJDQU1RUUpIRFFzZ0JTOEJBRUdBK0FOeFFZQzRBMGNnQlNBSlRYSU5DeUFIUVFScklnY2dCU0FITHdFQVFZRDRBM0ZCZ0xBRFJoc2hCUXdMQ3lBSElBMVBEUVVDUUNBTVJRUkFJQWRCQVdvaEJTQUhMUUFBSVFnTUFRc2dCeThCQUNJSVFZRDRBM0ZCZ0xBRFJ5QU1RUUpIY2lBTklBZEJBbW9pQlUxeURRQWdCUzhCQUNJSlFZRDRBM0ZCZ0xnRFJ3MEFJQWhCQ25SQmdQZy9jU0FKUWY4SGNYSkJnSUFFYWlFSUlBZEJCR29oQlFzZ0JDOEFBU0VISUFBb0FoZ0VRQ0FJSUFBb0Fod1EzUUVoQ0FzZ0NDQUVRUU5xSWdvb0FBQkpEUVZCQUNFTElBZ2dCQ0FIUVFGcklnbEJBM1JxS0FBSFN3MEZBMEFnQ1NBTFNRMEdJQW9nQ1NBTGFrRUJkaUlFUVFOMGFpSU9LQUFBSUFoTEJFQWdCRUVCYXlFSkRBRUxJQTRvQUFRZ0NFa0VRQ0FFUVFGcUlRc01BUXNMSUFvZ0IwRURkR29oQkF3S0N5QUhJQTFQRFFRQ1FDQU1SUVJBSUFkQkFXb2hCU0FITFFBQUlRZ01BUXNnQnk4QkFDSUlRWUQ0QTNGQmdMQURSeUFNUVFKSGNpQU5JQWRCQW1vaUJVMXlEUUFnQlM4QkFDSUpRWUQ0QTNGQmdMZ0RSdzBBSUFoQkNuUkJnUGcvY1NBSlFmOEhjWEpCZ0lBRWFpRUlJQWRCQkdvaEJRc2dCQzhBQVNFSElBQW9BaGdFUUNBSUlBQW9BaHdRM1FFaENBc2dDQ0FFUVFOcUlnb3ZBQUJKRFFRQ1FDQUVJQWRCQVdzaUNVRUNkR292QUFVaUJFSC8vd05HSUFoQi8vOERUM0VOQUNBRUlBaEpEUVZCQUNFRUEwQWdCQ0FKU3cwR0lBaEIvLzhEY1NJT0lBb2dCQ0FKYWtFQmRpSUxRUUowYWlJUEx3QUFTUVJBSUF0QkFXc2hDUXdCQ3lBUEx3QUNJQTVQRFFFZ0MwRUJhaUVFREFBTEFBc2dDaUFIUVFKMGFpRUVEQWtMQTBBZ0NDQUtUdzBKSUFVZ0RVOE5CQUovQW44Q1FDQU1CRUFnQ0M4QkFDSUpRWUQ0QTNGQmdMQURSeUFNUVFKSGNpQUlRUUpxSWdjZ0NrOXlEUUVnQnk4QkFDSUxRWUQ0QTNGQmdMZ0RSdzBCSUFsQkNuUkJnUGcvY1NBTFFmOEhjWEpCZ0lBRWFpRUpJQWhCQkdvTUFnc2dCUzBBQUNFTElBZ3RBQUFoQ1NBSVFRRnFJUWdnQlVFQmFnd0NDeUFIQ3lFSUFrQWdCUzhCQUNJTFFZRDRBM0ZCZ0xBRFJ5QU1RUUpIY2lBRlFRSnFJZ2NnRFU5eURRQWdCeThCQUNJT1FZRDRBM0ZCZ0xnRFJ3MEFJQXRCQ25SQmdQZy9jU0FPUWY4SGNYSkJnSUFFYWlFTElBVkJCR29NQVFzZ0J3c2hCU0FBS0FJWUJIOGdDU0FBS0FJY0lnY1EzUUVoQ1NBTElBY1EzUUVGSUFzTElBbEdEUUFMREFNTElBZ2hCQXdIQ3lBSElRVU1CZ3RCZnc4TFFRQWhDU0FHRFFFTElBQW9BakFoQlFOQUlBa2hBeUFGUlFSQUlBTVBDd0pBQWtBQ1FBSkFJQUFvQWlnZ0JVRUJheUlGSUFBb0FpUnNhaUlJTFFBQUlnUU9CQUFDQWdFQ0MwRUJJUWtnQXcwQ0RBVUxRUUVoQ1NBRERRRWdBU0FJUVJCcUlnTWdBQ2dDREVFRGRCQWZHaUFDSUFNZ0FDZ0NERUVEZEdvZ0NDMEFBU0lEUVFKMEVCOGFJQWdvQWdnaEJTQUlLQUlNSWdrb0FBd2hDa0VBSVFRRFFBSi9Ba0FnQkNBS1J3UkFJQVZCQVdzZ0RFVU5BaG9nQlVFQ2F5RUhJQXhCQWtjTkFTQUhMd0VBUVlENEEzRkJnTGdEUncwQklBY2dBQ2dDQUUwTkFTQUZRUVJySWdVZ0J5QUZMd0VBUVlENEEzRkJnTEFEUmhzTUFnc2dDU2dBQUNFRUlBZ2dCVFlDQ0NBSUlBZ29BZ1JCQVdzaUJ6WUNCQ0FFSUFscVFSQnFJUVFnQncwSklBQWdBQ2dDTUVFQmF6WUNNQXdKQ3lBSEN5RUZJQVJCQVdvaEJBd0FDd0FMSUFOQkFDQUVRUUZHR3cwRVFRQWhDU0FERFFBZ0JFRUNSZzBEQ3lBQUlBVTJBakFNQUFzQUN5QUpEd3NnQVNBSVFSQnFJQUFvQWd4QkEzUVFIeG9MSUFnb0FnZ2hCU0FJS0FJTUlRUWdBaUFJSUFBb0FneEJBM1JxUVJCcUlBZ3RBQUVpQTBFQ2RCQWZHaUFBSUFBb0FqQkJBV3MyQWpBTUFBc0FDNHNDQVFkL0lBRkJBblJCd1A0RGFpZ0NBQ0lDSUFGQkFYUkJrSUFFYWk4QkFHb2hDRUVBSVFFQ1FBTkFJQUlnQ0U4TkFTQUNRUUZxSVFZQ1FBSkFJQUl0QUFBaUJFRS9UUVJBSUFNZ0JFRURkbXBCQVdvaEFpQUJCRUFnQUNBRElBSVFmZzBEQ3lBQlFRRnpJUUVnQkVFSGNTQUNha0VCYWlFRkRBRUxBbjhnQXlBRWFrSC9BR3NnQk1CQkFFZ05BQm9nQmkwQUFDRUZJQVJCM3dCTkJFQWdBa0VDYWlFR0lBTWdCRUVJZEdvZ0JXcEIvLzhBYXd3QkN5QUNRUU5xSVFZZ0FpMEFBaUFESUFSQkVIUnFJQVZCQ0hScWFrSC8vLzhDYXdzaEJTQURJUUlMSUFFRVFDQUFJQUlnQlJCK0RRRUxJQUZCQVhNaEFTQUdJUUlnQlNFRERBRUxDMEYvSVFjTElBY0xPQUJCc05RQ0lBRVFyd1FpQVVFQVNBUkFRWDRQQ3lBQUlBRkJIVTBFZjBJQklBR3RocWNGSUFGQkFuUkIyTmdDYWlnQ0FBc1FvUVlMTlFFQmZ5TUFRUkJySWdNa0FDQURJQUUyQWdnZ0F5QUNRUUZxTmdJTUlBQWdBMEVJYWtFQ0VMRUVJUUFnQTBFUWFpUUFJQUFMbHdJQkEzOGdBU2dDQUNJQ1FmNy9CMDhFUUNBQVFZWTdRUUFRT2tGL0R3c0NRQ0FDUVFGTkJFQWdBRUVDUVg4UXVBRWFEQUVMSUFFb0FnZ2dBa0VDZEdvaUJFRUVheWdDQUNJRFFYOUdCRUFnQkVFSWF5Z0NBQ0VEQ3lBQ1FRRjJJUUlnQTBILy93Tk5CRUFnQUVFVklBSVFzZ1JCQUNFQ0EwQWdBaUFCS0FJQVRnMENJQUFnQWtFQ2RDSURJQUVvQWdocUx3RUFFQ29nQUVGL0lBRW9BZ2dnQTBFRWNtb29BZ0JCQVdzaUF5QURRWDVHRzBILy93TnhFQ29nQWtFQ2FpRUNEQUFMQUFzZ0FFRVdJQUlRc2dSQkFDRUNBMEFnQWlBQktBSUFUZzBCSUFBZ0FrRUNkQ0lESUFFb0FnaHFLQUlBRUIwZ0FDQUJLQUlJSUFOQkJISnFLQUlBUVFGckVCMGdBa0VDYWlFQ0RBQUxBQXRCQUFzbUFRRi9JQUFvQWpnaUFVRUFTQVJBSUFBZ0FDQUFRVHhxUVFBUXF3WWlBVFlDT0FzZ0FRdmdBZ0VGZnlNQVFaQUJheUlFSkFBZ0FVRUFOZ0lBSUFBb0FpQWhBMEVCSVFZRFFDQUVJQU0yQW93QkFrQUNRQUpBSUFBb0Fod2lCeUFEVFFSQUlBWWhCUXdCQ3dKQUFrQUNRQUpBSUFNdEFBQWlCVUhiQUdzT0FnRUNBQXNnQlVFb1J3MEZJQU10QUFGQlAwY05BaUFETFFBQ1FUeEhEUVVnQXkwQUF5SUZRU0ZHSUFWQlBVWnlEUVVnQVVFQk5nSUFBa0FnQWtVTkFDQUVJQU5CQTJvMkFvd0JJQVFnQkVHTUFXb2dBQ2dDS0JDMUJBMEFJQVFnQWhEeUEwVU5CUXNnQmtFQmFpRUZJQVpCL1FGS0RRTWdCQ2dDakFFaEF5QUZJUVlNQlFzRFFDQUVJQU1pQlVFQmFpSUROZ0tNQVNBRElBZFBEUVVDUUNBRExRQUFRZHdBYXc0Q0FBWUJDeUFFSUFWQkFtb2lBellDakFFTUFBc0FDeUFFSUFOQkFXb2lBellDakFFTUF3c2dCa0g5QVVvaEJ5QUdRUUZxSWdVaEJpQUhSUTBDQzBGL0lBVWdBaHNoQmdzZ0JFR1FBV29rQUNBR0R3c2dBMEVCYWlFRERBQUxBQXRWQVFOL0lBQWdBV29oQkNBQ0VEOGhBMEVCSVFFRFFBSkFJQUFnQkU4RVFFRi9JUUVNQVFzZ0F5QUFFRDhpQlVZRVFDQUNJQUFnQXhCaFJRMEJDeUFCUVFGcUlRRWdBQ0FGYWtFQmFpRUFEQUVMQ3lBQkMrUWhBUmQvSXdCQjRBSnJJZ0lrQUVFTUlBRnJJUllnQVVFTGFpRVhJQUJCeEFCcUlSSWdBVUVUYWlFWUlBQkIzQUJxSVE4Z0FDZ0NCQ0VUQWtBQ1FBSkFBMEFnQUNnQ0dDSURJQUFvQWh4UERRTWdBeTBBQUNJRVFTbEdJQVJCL0FCR2NnMERJQUFvQWdRaEVDQUNJQU0yQWh3Q1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ2Z3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQVJCMndCckRnUUNBUU1JQUFzQ1FBSkFBa0FDUUFKQUlBUkJKR3NPQ3dFSkNRa0VDUmtaQ1FrQ0FBc2dCRUg3QUdzT0F3SUlCZ2NMSUFJZ0EwRUJhaUlJTmdJY0lBQkJCaEFSREJRTElBSWdBMEVCYWpZQ0hDQUFLQUkwSVFvZ0FVVU5DQ0FBUVJzUUVTQUFRUVJCQXlBQUtBSXdHeEFSREF3TElBQW9BaWdFUUNBQVFkVS9RUUFRT2d3WEN5QURMUUFCUVRwclFYWkpEUVVnQWlBRFFRRnFOZ0lnSUFKQklHcEJBUkRjQWhvQ1FDQUNLQUlnSWdNdEFBQWlCVUVzUncwQUlBSWdBMEVCYWpZQ0lDQURMUUFCSWdWQk9tdEJka2tOQUNBQ1FTQnFRUUVRM0FJYUlBSW9BaUF0QUFBaEJRc2dCVUgvQVhGQi9RQkhEUVVNRlFzQ1FDQURMUUFCUVQ5R0JFQkJBeUVIUVFBaENrRUFJUVZCQUNFR0FrQUNRQUpBQWtBZ0F5MEFBaUlFUVRwckRnUUFBd0VTQWdzZ0FDQURRUU5xTmdJWUlBQW9BalFoQ2lBQUlBRVE4Z0lOR2lBQ0lBQW9BaGcyQWh3Z0VDRURJQUFnQWtFY2FrRXBFTEFEUlEwU0RCb0xRUUVoQlVFRUlRY2dBeTBBQXlJRVFUMUdCRUJCQVNFR0RCRUxRUUVoQmlBRVFTRkdEUkFnQWlBRFFRTnFOZ0ljSUE4Z0FrRWNhaUFBS0FJb0VMVUVCRUFnQUVHYzV3QkJBQkE2REJvTElCSW9BZ0FnQUNnQ1NDQVBFS3dHUVFCS0JFQWdBRUdINXdCQkFCQTZEQm9MSUJJZ0R5QVBFRDlCQVdvUWNpQUFRUUUyQWp3TUF3c2dCRUVoUmcwUEN5QUFRY0hKQUVFQUVEb01Gd3NnQWlBRFFRRnFOZ0ljSUJKQkFCQVJDeUFBS0FJMElncEIvd0ZPQkVBZ0FFR3FPVUVBRURvTUZnc2dBQ0FLUVFGcU5nSTBJQUFvQWdRaEF5QUFJQmNnQ2hDcEFpQUFJQUlvQWh3MkFoZ2dBQ0FCRVBJQ0RSVWdBaUFBS0FJWU5nSWNJQUFnRmlBS0VLa0NJQUFnQWtFY2FrRXBFTEFEUlEwTkRCVUxBa0FDUUFKQUFrQUNRQUpBQWtBZ0F5MEFBU0lFUVRCckRoTURCQVFFQkFRRUJBUUVDZ29LQ2dvS0Nnb0JBQXNnQkVIckFFWU5BU0FFUWVJQVJ3MEpDeUFBUVJGQkVpQUVRZUlBUmhzUUVTQURRUUpxSVFnTUVnc0NRQ0FETFFBQ1FUeEhCRUJCOHVZQUlRVWdBQ2dDS0EwQklBQVF0QVFOQVF3SkN5QUNJQU5CQTJvMkFpQWdEeUFDUVNCcUlBQW9BaWdRdFFRRVFFR2M1d0FoQlNBQUtBSW9EUUVnQUJDMEJBMEJEQWtMSUJJb0FnQWdBQ2dDU0NBUEVLd0dJZ1JCQUU0TkF5QUFJQUpCd0FKcUlBOFFxd1lpQkVFQVRnMERRZnY1QUNFRklBQW9BaWdOQUNBQUVMUUVSUTBJQ3lBQUlBVkJBQkE2REJnTElBSWdBMEVDYWpZQ0hDQURMUUFDSVFZZ0FDZ0NLQVJBUVFBaEJDQUdRVHByUVhaSkRRZ2dBRUhJelFCQkFCQTZEQmdMUVFBaEJDQUdRZmdCY1VFd1J3MEhJQUlnQTBFRGFqWUNIQ0FHUVRCcklRUWdBeTBBQXlJR1FmZ0JjVUV3UncwSElBSWdBMEVFYWpZQ0hDQUVRUU4wSUFacVFUQnJJUVFNQndzZ0FpQURRUUZxSWdVMkFod2dBa0VjYWtFQUVOd0NJZ1JCQUU0RVFDQUVJQUFvQWpSSURRSWdBQkNxQmlBRVNnMENDeUFBS0FJb1JRUkFJQUlnQlRZQ0hDQUZMUUFBSWdSQk4wMEVRRUVBSVFZZ0JFRXpUUVJBSUFJZ0EwRUNhaUlGTmdJY0lBUkJNR3NoQmlBRExRQUNJUVFMSUFSQitBRnhRVEJIQkVBZ0JpRUVEQWtMSUFJZ0JVRUJhallDSENBRVFmOEJjU0FHUVFOMGFrRXdheUVFSUFVdEFBRWlBMEg0QVhGQk1FY05DQ0FDSUFWQkFtbzJBaHdnQkVFRGRDQURha0V3YXlFRURBZ0xJQUlnQTBFQ2FqWUNIQXdIQ3lBQVFmWE5BRUVBRURvTUZnc2dBaUFDS0FJZ05nSWNDeUFBS0FJMElRb2dBQ2dDQkNFRElBQWdHQ0FFRUtrQ0RBd0xJQUFvQWpRaENpQUJCRUFnQUVFYkVCRUxJQUFvQWtBaEJDQUNRVFEyQXRBQ0lBSWdCRFlDekFJZ0FrRUFOZ0xJQWlBQ1FnQTNBc0FDSUFJZ0EwRUJhaUlITmdMVUFpQURMUUFCSWdSQjNnQkhJZ2dOQmlBQ0lBTkJBbW9pQnpZQzFBSkJBQXdIQ3lBQUtBSW9SUTBCSUFCQjFUOUJBQkE2REJJTElBUkJQMFlORUFzZ0FDQUNRUWhxSUFKQkhHcEJBQkN6QkNJRVFRQklEUkFMSUFBb0FqUWhDaUFBS0FJRUlRTWdBUVJBSUFCQkd4QVJDd0pBSUFSQmdJQ0FnQVJPQkVBZ0FDQUNRUWhxRUtrR0lRUWdBaWdDRkNBQ0tBSVFRUUFnQWlnQ0dCRUJBQm9nQkVVTkFRd1JDeUFBS0FJc0JFQWdCQ0FBS0FJb0VOMEJJUVFMSUFSQi8vOERUQVJBSUFCQkFTQUVFTElFREFFTElBQkJBaUFFRUxnQkdnc2dBVVVOQnlBQVFSc1FFUXdIQ3lBQVFRUkJBeUFBS0FJd0d4QVJEQVFMSUFJZ0EwRUJhaUlJTmdJY0lBQkJCUkFSREFrTFFRRUxJUVVEUUNBRlJRUkFJQWN0QUFBaEJFRUJJUVVNQVFzQ1FBSkFBa0FDUUNBRVFmOEJjVUhkQUVjRVFDQUFJQUpCckFKcUlBSkIxQUpxUVFFUXN3UWlBMEVBU0EwREFrQUNRQUpBQWtBZ0FpZ0MxQUlpQnkwQUFFRXRSdzBBSUFjdEFBRkIzUUJHRFFBZ0FpQUhRUUZxTmdJZ0lBTkJnSUNBZ0FSUEJFQWdBQ2dDS0VVTkFTQUNLQUs0QWlBQ0tBSzBBa0VBSUFJb0Fyd0NFUUVBR2d3REN5QUFJQUpCckFKcUlBSkJJR3BCQVJDekJDSUdRUUJJRFFjZ0JrR0FnSUNBQkVrTkFTQUNLQUs0QWlBQ0tBSzBBa0VBSUFJb0Fyd0NFUUVBR2lBQUtBSW9EUUlMSUFOQmdJQ0FnQVJKRFFJZ0FrSEFBbW9nQWlnQ3RBSWlBeUFDS0FLc0FoQ3hCQ0VHSUFJb0FyZ0NJQU5CQUNBQ0tBSzhBaEVCQUJvZ0JrVU5Cd3dGQ3lBQ0lBSW9BaUFpQnpZQzFBSWdBeUFHVFEwREN5QUFRYWJyQUVFQUVEb01CQXNnQWtIQUFtb2dBeUFERUtnR1JRMEVEQUlMSUFBb0Fpd0VRQ0FDUVRRMkFqQWdBaUFDS0FMTUFqWUNMQ0FDUVFBMkFpZ2dBa0lBTndJZ0lBSkM0WUNBZ0xBUE53TFlBa0VCSVFVZ0FrRWdhaUFDS0FMSUFpQUNLQUxBQWlBQ1FkZ0Nha0VDUVFFUTJ3SWhCQ0FDS0FJb0lRTWdCRVVFUUVFQUlRVWdBaWdDSUNJRVFRQWdCRUVBU2hzaEJnTkFJQVVnQmtaRkJFQWdBeUFGUVFKMGFpSUpJQWtvQWdCQklHczJBZ0FnQlVFQmFpRUZEQUVMQ3lBQ1FjQUNhaUFESUFRUXNRUWhCUXNnQWlnQ0xDQURRUUFnQWlnQ01CRUJBQm9nQlEwQ0N5QUlSUVJBSUFKQndBSnFFTm9DRFFJTElBQWdBa0hBQW1vUXFRWU5BaUFDS0FMTUFpQUNLQUxJQWtFQUlBSW9BdEFDRVFFQUdpQUNJQWRCQVdvMkFod2dBVVVOQmd3RkN5QUNRY0FDYWlBRElBWVFxQVpGRFFJTElBQVFxQUlMSUFJb0Fzd0NJQUlvQXNnQ1FRQWdBaWdDMEFJUkFRQWFEQTBMUVFBaEJRd0FDd0FMSUFCQkd4QVJDeUFRSVFNTUFRc2dBeUFIYWlFSFFYOGhBd0pBSUFVTkFDQUFLQUlvRFFBZ0FDZ0NOQ0VLSUJBaEF3c2dBRUVZUVJjZ0JFRWhSaHRCQUJDNEFTRUVJQUFnQnpZQ0dDQUFJQVlROGdJTkNDQUNJQUFvQWhnMkFod2dBQ0FDUVJ4cVFTa1FzQU1OQ0NBQVFRb1FFU0FBS0FJTURRZ2dBQ2dDQUNBRWFpQUFLQUlFSUFSclFRUnJOZ0FBQ3lBQ0tBSWNJUWdnQTBFQVNBMERBa0FDUUFKQUFrQUNRQ0FJTFFBQUlnUkJLbXNPQWdFQ0FBc2dCRUUvUmcwQ0lBUkIrd0JIRFFjZ0NDMEFBVUU2YTBGMVN3MERJQUFvQWloRkRRY01DQXNnQ0VFQmFpRUlRUUFoQzBILy8vLy9CeUVKREFVTFFRRWhDeUFJUVFGcUlRaEIvLy8vL3djaENRd0VDMEVCSVFrZ0FpQUlRUUZxSWdnMkFoeEJBQ0VMREFNTElBSWdDRUVCYWpZQ0hDQUNRUnhxUVFFUTNBSWlDeUVKQWtBZ0FpZ0NIQ0lFTFFBQUlnVkJMRWNOQUNBQ0lBUkJBV28yQWh4Qi8vLy8vd2NoQ1NBRUxRQUJJZ1ZCT210QmRra05BQ0FDUVJ4cVFRRVEzQUlpQ1NBTFNBMEZJQUlvQWh3dEFBQWhCUXNnQlVIL0FYRkIvUUJHRFFFZ0FDZ0NLQTBCQ3lBQ0lBZzJBaHdNQWdzZ0FDQUNRUnhxUWYwQUVMQUREUVVnQWlnQ0hDRUlDd0pBQW44Z0NDMEFBRUUvUmdSQUlBSWdDRUVCYWlJSU5nSWNJQUFvQWdRZ0Eyc2hCMEVBSVFWQkFBd0JDeUFBS0FJTUlRUUNRQ0FKUVFCS0JFQWdCQTBESUFBb0FnUWdBMnNoQnlBQUtBSUFJaEVnQTJvaERVRUFJUVZCQUNFTUEwQWdCU0FIU0FSQUlBVWdEV29pRGkwQUFDSVVRZkNCQW1vdEFBQWhCRUVDSVFZQ1FBSkFBa0FDUUNBVVFRRnJEaFlDQWdJQ0F3TUhCd2NIQndjSEJ3Y0hBd01IQndFQUJ3dEJBeUVHQ3lBT0x3QUJJQVowSUFScUlRUUxJQXhCQVdvaERBc2dCQ0FGYWlFRkRBRUxDeUFNUVFCTURRRWdBRUVLRUJFZ0FDQURRUkVROEFFTkF5QUFLQUlBSUFOcVFSdzZBQUFnQUNnQ0JDRUdJQU1nQUNnQ0FHb2lCQ0FNTmdBTklBUWdDVFlBQ1NBRUlBczJBQVVnQkNBR0lBTnJRUkZyTmdBQkRBUUxJQVFOQWlBQUtBSUVJQU5ySVFjZ0FDZ0NBQ0VSQzBFQUlRUWdBa0VnYWtFQVFmOEJFQ3NhSUFNZ0VXb2hGRUYrSVExQkFDRVJBMEFnQkNBSFRrVUVRQ0FFSUJScUlnNHRBQUFpQlVId2dRSnFMUUFBSVFaQkFpRU1Ba0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUZRUUZyRGhzQ0FnSUNCd2NHQmdZR0F3TUVCZ2NIQndjRkJRRUFCZ1lIQmdjR0MwRURJUXdMSUE0dkFBRWdESFFnQm1vaEJndEJBU0FOSUExQmZrWWJJUTBNQkFzZ0RpMEFBU0FDUVNCcWFpSUZJQVV0QUFCQkFYSTZBQUFNQXdzZ0RpMEFBU0lGSUE0dEFBSWlEQ0FGSUF4TEd5RU1BMEFnQlNBTVJnMERJQUpCSUdvZ0JXb2lEaUFPTFFBQVFRRnlPZ0FBSUFWQkFXb2hCUXdBQ3dBTFFRRWhFU0FPTFFBQklBSkJJR3BxSWdVZ0JTMEFBRUVDY2pvQUFBd0JDeUFOUVFBZ0RVRitSeHNoRFFzZ0JDQUdhaUVFREFFTEMwRUFJUVVDZndKQUlCRkZEUUFEUUNBRlFmOEJSZzBCSUFKQklHb2dCV29oQkNBRlFRRnFJUVVnQkMwQUFFRURSdzBBQzBGL0RBRUxJQTFCQUNBTlFYNUhHd3RGSVFWQkFRc2hCQUpBSUF0RkJFQWdBQ2dDTkNBS1J3UkFJQUFnQTBFREVQQUJEUU1nQUNnQ0FDQURha0VOT2dBQUlBTWdBQ2dDQUdvZ0Nqb0FBU0FESUFBb0FnQnFJQUF0QURSQkFXczZBQUlnQTBFRGFpRURDd0pBQWtBQ1FDQUpEZ0lBQVFJTElBQWdBellDQkF3RkN5QUFJQU5CQlJEd0FRMERJQUFvQWdBZ0Eyb2dCRUVJY2pvQUFDQUFLQUlBSUFOcUlBYzJBQUVNQkFzZ0NVSC8vLy8vQjBZTkFTQUFJQU5CQ2hEd0FRMENJQUFvQWdBZ0EycEJEem9BQUNBQUtBSUFJZ1lnQTBFRmFpSUZhaUFFUVFoeU9nQUFJQU1nQm1vZ0NUWUFBU0FESUFBb0FnQnFJQWRCQldvMkFBWWdBRUVPSUFVUTNBRWdBRUVRRUJFTUF3c2dCU0FMUVFGSElBbEIvLy8vL3dkSGNuSkZCRUFnQUNBRVFRbHpJQU1RM0FFTUF3c2dDMEVCUndSQUlBQWdBMEVGRVBBQkRRSWdBQ2dDQUNBRGFrRVBPZ0FBSUFBb0FnQWdBMm9nQ3pZQUFTQUFRUTRnQTBFRmFpSURFTndCSUFCQkVCQVJDeUFKUWYvLy8vOEhSZ1JBSUFBb0FnUWhCaUFBSUFSQkNISWdCU0FIYWtFRmFoQzRBUm9nQlFSQUlBQkJHUkFSSUFBZ0F5QUhFTEFFSUFCQkdpQUdFTndCREFRTElBQWdBeUFIRUxBRUlBQkJCeUFHRU53QkRBTUxJQWtnQzB3TkFpQUFRUThnQ1NBTGF4QzRBUm9nQUNnQ0JDRUdJQUFnQkVFSWNpQUhRUVZxRUxnQkdpQUFJQU1nQnhDd0JDQUFRUTRnQmhEY0FTQUFRUkFRRVF3Q0N5QUFJQU1nQlVFRmFoRHdBUTBBSUFBb0FnQWdBMm9nQkVFSWNqb0FBQ0FBS0FJQUlBTnFJZ1FnQlNBSGFrRUZhallBQVNBRkJFQWdCRUVaT2dBRklBQkJHaUFERU53QkRBSUxJQUJCQnlBREVOd0JEQUVMSUFBUXFBSU1CQXNnQUNBSU5nSVlJQUZGRFFFZ0FDQUFLQUlFSWdNZ0VHc2lFQ0FEYWhER0FRMERJQUFvQWdBZ0Uyb2lCQ0FRYWlBRUlBTWdFMnNRbkFFZ0FDZ0NBQ0lFSUJOcUlBTWdCR29nRUJBZkdnd0JDd3NnQUVIM0trRUFFRG9NQVFzZ0FFSHVNVUVBRURvTFFYOGhGUXNnQWtIZ0Ftb2tBQ0FWQzQ0Q0FnWi9BWDRqQUVFUWF5SURKQUFDUUNBQlF2Ly8vLzl2V0FSQUlBQVFKRUYvSVFRTUFRdEJmeUVFSUFBZ0FoQWxJZ2xDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQUpBSUFBZ0EwRU1haUFEUVFocUlBbW5RUk1RamdGQkFFZ0VRRUtBZ0lDQU1DRUNJQU1vQWdnaEJpQURLQUlNSVFjTUFRdEJBQ0VFUW9DQWdJQXdJUUlnQXlnQ0RDRUhJQU1vQWdnaEJnTkFJQVVnQmtZTkFTQUFJQUlRRHlBQUlBa2dCeUFGUVFOMGFpSUlLQUlFSUFsQkFCQVVJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FGUVFGcUlRVWdBQ0FCSUFnb0FnUWdBa0dBZ0FFUXh3UkJBRTROQVFzTFFYOGhCQXNnQUNBSElBWVFXaUFBSUFrUUR5QUFJQUlRRHdzZ0EwRVFhaVFBSUFRTDJnTUNBMzhFZmlNQVFUQnJJZ2drQUFKQUlBQW9BaEFvQW5nZ0NFMEVRQ0FEUWdBZ0EwSUFWUnNoRFNBRlFRRnJJUWtnQmtLQWdJQ0FjSU1oRGlBRlFRQk1JUXBDQUNFREEwQWdBeUFOVVFSQUlBUWhEQXdEQzBKL0lRd2dBQ0FDSUFNZ0NFRW9haENGQVNJRlFRQklEUUlDUUNBRlJRMEFJQTVDZ0lDQWdEQlNCRUFnQ0NBSUtRTW9Od01BSUFNaEN5QUlJQUkzQXhBZ0NDQURRb0NBZ0lBSVdnUitRb0NBZ0lEQWZpQUR1YjBpQzBLQWdJQ0F3SUdBL1A4QWZTQUxRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3VWdDd3MzQXdnZ0NDQUFJQVlnQjBFRElBZ1FJU0lMTndNb0lBQWdDQ2tEQUJBUElBQWdDQ2tEQ0JBUElBdENnSUNBZ0hDRFFvQ0FnSURnQUZFTkJBc0NRQUpBQWtBZ0NnMEFJQUFnQ0NrREtDSUxFTW9CSWdWQkFFZ05BU0FGUlEwQUlBQWdDRUVnYWlBTEVEeEJBRWdOQVNBQUlBRWdDeUFJS1FNZ0lBUWdDVUtBZ0lDQU1FS0FnSUNBTUJDdkJpSUVRZ0JURFFFZ0FDQUxFQThNQXdzZ0JFTC8vLy8vLy8vL0QxTU5BU0FBUWJIYUFFRUFFQlVnQ0NrREtDRUxDeUFBSUFzUUR3d0VDeUFBSUFFZ0JDQUlLUU1vRUdwQkFFZ05BeUFFUWdGOElRUUxJQU5DQVh3aEF3d0FDd0FMSUFBUTZRRkNmeUVNQ3lBSVFUQnFKQUFnREF1WkFnRUJmZ0pBQWtBQ1FDQUJRb0NBZ0lCd2d5SUVRb0NBZ0lBd1VnUkFJQVJDZ0lDQWdDQlNEUUVnQUVHcDFBQVFZaUVFREFJTElBQkJ0dmtBRUdJaEJBd0JDeUFBSUFFUUpTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBQ0FCRU1vQklnTkJBRWdFUUNBQUlBRVFEMEtBZ0lDQTRBQVBDd0ovUVpNQklBTU5BQnBCblFFZ0FDQUJFRGdOQUJwQmtnRWdBYWN2QVFZaUEwRVNTMEVCSUFOMFFmaU9FSEZGY2cwQUdpQUFLQUlRS0FKRUlBTkJHR3hxS0FJRUN5RUNJQUFnQVVIWEFTQUJRUUFRRkNFRUlBQWdBUkFQSUFSQ2dJQ0FnSENESWdGQ2dJQ0FnSkIvVVEwQUlBRkNnSUNBZ09BQVVRMEJJQUFnQkJBUElBQWdBaEF0SVFRTElBQkJ1NWtCSUFSQm5JQUJFTDRCSVFFTElBRUwwQUlDQm44QmZpTUFRVEJySWdJa0FBSkFBa0FnQXlrREFDSUJRdi8vLy85dldBUkFJQUZDSUlpblFYVkpEUUVnQWFjaUFDQUFLQUlBUVFGcU5nSUFEQUVMUW9DQWdJRGdBQ0VMSUFBZ0FSQzJBeUlEUVFCSURRRWdBMFVFUUNBQVFmamlBRUVBRUJVTUFnc2dBQ0FDUVN4cUlBSkJLR29nQWFjaUJrRURFSTRCRFFFZ0FpZ0NMQ0VISUFJb0FpZ2hDRUVBSVFNQ1FBTkFJQU1nQ0VjRVFDQUhJQU5CQTNScUtBSUVJUWxCZ0lJQklRVUNRQ0FFUlEwQUlBQWdBa0VJYWlBR0lBa1FUQ0lLUVFCSURRTWdDa1VOQUNBQ0tBSUlJUVVnQUNBQ1FRaHFFRWhCZ0lZQlFZQ0NBU0FGUVFKeEd5RUZDeUFBSUFFZ0NVS0FnSUNBTUVLQWdJQ0FNRUtBZ0lDQU1DQUZFRzFCQUVnTkFpQURRUUZxSVFNTUFRc0xJQUFnQnlBSUVGb2dCaUFHS0FJQVFRRnFOZ0lBREFFTElBQWdCeUFJRUZvTUFRc2dBU0VMQ3lBQ1FUQnFKQUFnQ3dzUUFFR2ltUUVnQUVFTEVQc0JRUUJIQzRrQkFnTi9BWDVCbFprQklRTUNRQUpBSUFFcEFnUWlCcWRCLy8vLy93ZHhJZ1VnQWt3TkFDQUJRUkJxSVFRQ2Z5QUdRb0NBZ0lBSWcxQkZCRUFnQkNBQ1FRRjBhaThCQUF3QkN5QUNJQVJxTFFBQUMwRWxSdzBBUWIwdElRTWdBa0VDYWlBRlRnMEFJQUVnQWtFQmFrRUNFTGdFSWdKQkFFNE5BUXNnQUNBREVMa0VRWDhoQWdzZ0FndUxBZ0lCZmdGOEl3QkJFR3NpQWlRQVFvQ0FnSURnQUNFRUFrQWdBQ0FCRU4wQ0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUVFNQVFzZ0FDQUNJQUVRYmcwQUlBQWdBa0VNYWlBREtRTUFFTG9CRFFBZ0Fpc0RBQ0lGdlNJQlFvQ0FnSUNBZ0lENC93Q0RRb0NBZ0lDQWdJRDQvd0JSQkVBZ0FFS0FnSUNBd0g0Z0FVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeEEzSVFRTUFRc2dBelVDQkVJZ2hrS0FnSUNBTUZFRVFDQUFJQVZCQ2tFQVFRUVFqd0loQkF3QkN5QUNLQUlNSWdOQjVRQlBCRUFnQUVHS05FRUFFRkFNQVFzZ0FDQUZRUW9nQTBFQmFrRUZFSThDSVFRTElBSkJFR29rQUNBRUMxOEFJd0JCRUdzaUFpUUFBbjRnQXlrREFDSUJRaUNJcHlJREJFQkNnSUNBZ0JBZ0EwRUxha0VTU1EwQkdndENnSUNBZ09BQUlBQWdBa0VJYWlBQkVFSU5BQm9nQWlzRENCQzlBcTFDZ0lDQWdCQ0VDeUVCSUFKQkVHb2tBQ0FCQ3lZQVFvQ0FnSURnQUNBQUlBTXBBd0FRekFVaUFFRUFSNjFDZ0lDQWdCQ0VJQUJCQUVnYkN5OEJBWDRDZmlBREtBSUVJZ0lFUUVLQWdJQ0FFQ0lFSUFKQkMycEJFa2tOQVJvTElBQWdCQ0FESUFNUXZBUUxDeThCQVg0Q2ZpQURLQUlFSWdJRVFFS0FnSUNBRUNJRUlBSkJDMnBCRWtrTkFSb0xJQUFnQkNBRElBTVF2UVFMQ3drQUlBQWdBUkMrQkFzc0FDQUFJQUVRdmdRaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSK0lBQkJBMEVDSUFHbkd4QXRCU0FCQ3d2TUFnSUJmd2QrSXdCQklHc2lCQ1FBSUFBZ0JFRUlha0VBRUQwYVFvQ0FnSURnQUNFSVFvQ0FnSUF3SVFVQ1FBSkFBa0FnQUNBREtRTUFFQ1VpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0FDQUdRZkFBSUFaQkFCQVVFTndGSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBUWdCUkE4UVFCSURRQkNBQ0VCSUFRcEF3QWlCMElBSUFkQ0FGVWJJUWtnQjBJQmZTRUhJQUtzSVFvRFFDQUJJQWxSRFFJZ0FDQUFJQVVnQVJCekVEY2lDMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMEJJQVJCQ0dvZ0N4Qi9HaUFCSUFkWklRSWdBVUlCZkNFQklBRWdDbGtnQW5JTkFDQUVRUWhxSUFNZ0FhZEJBM1JxS1FNQUVJY0JSUTBBQ3dzZ0FDQUdFQThnQUNBRkVBOGdCQ2dDQ0NnQ0VDSUFRUkJxSUFRb0Fnd2dBQ2dDQkJFQUFBd0JDeUFBSUFZUUR5QUFJQVVRRHlBRVFRaHFFRFloQ0FzZ0JFRWdhaVFBSUFnTGd3SUNBMzhCZkNNQVFTQnJJZ1FrQUFKK0FrQWdBQ0FFSUFJUVBRMEFJQUpCQUNBQ1FRQktHeUVHQWtBRFFDQUZJQVpIQkVBQ1FDQURJQVZCQTNScUtRTUFJZ0ZDLy8vLy93OVlCRUFnQWFjaUFrSC8vOE1BVFEwQkRBUUxJQUFnQkVFWWFpQUJFRUlOQkNBRUt3TVlJZ2RFQUFBQUFBQUFBQUJqSUFkRUFBQUFBUC8vTUVGa2NnMERJQWNDZnlBSG1VUUFBQUFBQUFEZ1FXTUVRQ0FIcWd3QkMwR0FnSUNBZUFzaUFyZGlEUU1MSUFWQkFXb2hCU0FFSUFJUXVRRkZEUUVNQXdzTElBUVFOZ3dDQ3lBQVFaVXJRUUFRVUFzZ0JDZ0NBQ2dDRUNJQVFSQnFJQVFvQWdRZ0FDZ0NCQkVBQUVLQWdJQ0E0QUFMSVFFZ0JFRWdhaVFBSUFFTG5BRUJBbjhqQUVFZ2F5SUVKQUFnQUNBRVFRaHFJQUlRUFJvZ0FrRUFJQUpCQUVvYklRSUNmZ05BSUFJZ0JVY0VRQUpBSUFBZ0JFRUVhaUFESUFWQkEzUnFLUU1BRUhkRkJFQWdCRUVJYWlBRUx3RUVFSXNCUlEwQkN5QUVLQUlJS0FJUUlnQkJFR29nQkNnQ0RDQUFLQUlFRVFBQVFvQ0FnSURnQUF3REN5QUZRUUZxSVFVTUFRc0xJQVJCQ0dvUU5nc2hBU0FFUVNCcUpBQWdBUXViQXdJRGZ3SitJd0JCSUdzaUFpUUFRb0NBZ0lEZ0FDRUlBa0FnQUNBQkVGa2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQWtFSWFpSUZRUWNRUFJvZ0JVRThFRHNhSUFVZ0JFRURkQ0lGUVlEckFXb29BZ0FpQmhDSUFScEJuajBnQkhaQkFYRkZCRUFnQWtFSWFpSUVRU0FRT3hvZ0JDQUZRWVRyQVdvb0FnQVFpQUVhSUFSQnJwa0JFSWdCR2lBQUlBTXBBd0FRV1NJSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUJFQThnQWlnQ0NDZ0NFQ0lBUVJCcUlBSW9BZ3dnQUNnQ0JCRUFBQXdDQ3lBSnB5SUhRUkJxSVFWQkFDRUVBMEFnQkNBSEtRSUVJZ2luUWYvLy8vOEhjVTlGQkVBQ1FBSi9JQWhDZ0lDQWdBaURVRVVFUUNBRklBUkJBWFJxTHdFQURBRUxJQVFnQldvdEFBQUxJZ05CSWtZRVFDQUNRUWhxUWFDSkFSQ0lBUm9NQVFzZ0FrRUlhaUFERUlzQkdnc2dCRUVCYWlFRURBRUxDeUFBSUFrUUR5QUNRUWhxUVNJUU94b0xJQUpCQ0dvaUFFRStFRHNhSUFBZ0FSQi9HaUFBUWJxUUFSQ0lBUm9nQUNBR0VJZ0JHaUFDUVFocVFUNFFPeG9nQUJBMklRZ0xJQUpCSUdva0FDQUlDNU1FQWdoL0FYNGpBRUV3YXlJRkpBQUNRQ0FBSUFFUVdTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBYWNpQnlnQ0JFSC8vLy8vQjNFaUFrVU5BQUpBSUFBZ0JVRVVhaUFDRUQwTkFFRUFJUUlnQlVFQU5nSVFJQWRCRUdvaENBTkFBa0FnQnlrQ0JDSU5wMEgvLy8vL0IzRWlDU0FDU2dSQUFuOENRQ0FFUlNBSElBVkJFR29ReVFFaUNrR2pCMGR5RFFBZ0JTZ0NFQ0lMUVFGcklRSURRQUpBSUFKQkFFd0VRRUVBSVFZTUFRc2dBa0VCYXlFREFrQWdEVUtBZ0lDQUNJTlFSUVJBSUFnZ0EwRUJkR292QVFBaUJrR0ErQU54UVlDNEEwY2dBa0VDU1hJTkFTQUlJQUpCQW1zaUFrRUJkR292QVFBaURFR0EwQUJxUWYvL0EzRkJnQWhMRFFFZ0JrSC9CM0VnREVIL0IzRkJDblJ5UVlDQUJHb2hCZ3dDQ3lBRElBaHFMUUFBSVFZTElBTWhBZ3NnQmhEQUJBMEFDeUFHRUw4RVJRMEFJQVVnQ3pZQ0xBSkFBMEFnQlNnQ0xDQUpUZzBCSUFjZ0JVRXNhaERKQVNJQ0VNQUVEUUFMSUFJUXZ3UU5BUXNnQlVIQ0J6WUNCRUVCREFFTElBVkJCR29nQ2lBRUVMSURDeUVEUVFBaEFnTkFJQUlnQTBZTkFpQUNRUUowSVFZZ0FrRUJhaUVDSUFWQkZHb2dCaUFGUVFScWFpZ0NBQkM1QVVVTkFBc01Bd3NnQUNBQkVBOGdCVUVVYWhBMklRRU1Bd3NnQlNnQ0VDRUNEQUFMQUFzZ0FDQUJFQThnQlNnQ0ZDZ0NFQ0lBUVJCcUlBVW9BaGdnQUNnQ0JCRUFBRUtBZ0lDQTRBQWhBUXNnQlVFd2FpUUFJQUVMZEFFQmZrS0FnSUNBNEFBaEJDQUFJQUVRV1NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkg0Z0FDQURLUU1BRUNnaUJFS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBQWdBUkFQUW9DQWdJRGdBQThMSUFHbklBU25FSU1DSVFJZ0FDQUJFQThnQUNBRUVBOGdBcTBGUW9DQWdJRGdBQXNMQ1FBZ0FDQUJFUFlFQ3hJQUlBQkJzalJCQUJBVlFvQ0FnSURnQUF0cUFBSkFBa0FnQVVJZ2lLY2lBa0YvUndSQUlBSkJlVWNOQVF3Q0N5QUJweUlDTHdFR1FRVkhEUUFnQWlrRElDSUJRb0NBZ0lCd2cwS0FnSUNBa0g5U0RRQU1BUXNnQUVHaTJ3QkJBQkFWUW9DQWdJRGdBQThMSUFHbklnQWdBQ2dDQUVFQmFqWUNBQ0FCQzRRQ0FnSi9BbjRnQUNBQkVGa2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQUVQQ3lBQnB5SUdLUUlFSWdlblFmLy8vLzhIY1NFQ0FrQWdCRUVCY1VVTkFDQUdRUkJxSVFNZ0IwS0FnSUNBQ0lNaENBTkFJQUlnQlVZRVFDQUNJUVVNQWdzQ2Z5QUlVRVVFUUNBRElBVkJBWFJxTHdFQURBRUxJQU1nQldvdEFBQUxFSWNEUlEwQklBVkJBV29oQlF3QUN3QUxBa0FnQkVFQ2NVVUVRQ0FDSVFNTUFRc2dCa0VRYWlFRUlBZENnSUNBZ0FpRElRY0RRQ0FDSWdNZ0JVd05BU0FEUVFGcklRSUNmeUFIVUVVRVFDQUVJQUpCQVhScUx3RUFEQUVMSUFJZ0JHb3RBQUFMRUljRERRQUxDeUFBSUFZZ0JTQURFSVFCSVFjZ0FDQUJFQThnQnd2cUF3SUdmd04rSXdCQklHc2lCU1FBUW9DQWdJRGdBQ0VNQWtBZ0FDQUJFRmtpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBQWtBQ1FDQUFJQVZCQkdvZ0F5a0RBQkM2QVEwQUlBVW9BZ1FpQnlBQnB5SUpLQUlFUWYvLy8vOEhjU0lJVEEwQlFTQWhDa0tBZ0lDQU1DRUxBa0FnQWtFQ1NBMEFJQU1wQXdnaURVS0FnSUNBY0lOQ2dJQ0FnREJSRFFBZ0FDQU5FQ2dpQzBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCQWtBQ1FDQUxweUlHS1FJRUlnMm5RZi8vLy84SGNRNENBQUVDQ3lBQUlBc1FEd3dEQ3dKL0lBMUNnSUNBZ0FpRFVFVUVRQ0FHTHdFUURBRUxJQVl0QUJBTElRcEJBQ0VHQ3lBSFFZQ0FnSUFFVGdSQUlBQkJ3Tm9BUVFBUVJnd0JDeUFBSUFWQkNHb2dCeEE5UlFSQUFrQWdCQVJBSUFWQkNHb2dDVUVBSUFnUVVRMEJDeUFISUFocklRTUNRQ0FHQkVBRFFDQURRUUJNRFFJZ0F5QURJQVlvQWdSQi8vLy8vd2R4SWdJZ0FpQURTaHNpQW1zaEF5QUZRUWhxSUFaQkFDQUNFRkZGRFFBTUF3c0FDeUFGUVFocUlBb2dBeERCQkEwQkN5QUVSUVJBSUFWQkNHb2dDVUVBSUFnUVVRMEJDeUFBSUFzUUR5QUFJQUVRRHlBRlFRaHFFRFloREF3RUN5QUZLQUlJS0FJUUlnSkJFR29nQlNnQ0RDQUNLQUlFRVFBQUN5QUFJQXNRRHdzZ0FDQUJFQThNQVFzZ0FTRU1DeUFGUVNCcUpBQWdEQXVCQmdJRmZnVi9Jd0JCMEFCcklnSWtBQUpBQWtBQ1FBSkFJQUZDZ0lDQWdCQ0VRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFRWlV3UVFBUUZRd0JDeUFES1FNSUlRa2dBeWtEQUNJRlFvQ0FnSUFRaEVLQWdJQ0FjSU5DZ0lDQWdEQlJEUUlnQkVVTkFTQUFJQVVReEFSQkFFNE5BUXRDZ0lDQWdPQUFJUVlNQWdzZ0FDQUZRZFFCSUFWQkFCQVVJZ2RDZ0lDQWdIQ0RJZ1pDZ0lDQWdDQlJJQVpDZ0lDQWdEQlJjZzBBSUFaQ2dJQ0FnT0FBVVEwQklBSWdDVGNES0NBQ0lBRTNBeUFnQUNBSElBVkJBaUFDUVNCcUVDOGhCZ3dCQ3lBQUlBSkJDR3BCQUJBOUdrS0FnSUNBNEFBaEJrS0FnSUNBTUNFSUFrQWdBQ0FCRUNnaUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQVFvQ0FnSUF3SVFVTUFRc2dBQ0FGRUNnaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdDUkE0SWc1RkJFQWdBQ0FKRUNnaUNFS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQkN5QUhweUVMSUFXbklnMHBBZ1FoQVFOQUFrQUNRQ0FCUXYvLy8vOEhnMUFFUUVFQUlRTWdERVVOQVNBS0lBc29BZ1JCLy8vLy93ZHhUdzBDSUFwQkFXb2hBd3dCQ3lBTElBMGdDaERDQkNJRFFRQk9EUUFnREEwQklBSW9BZ2dvQWhBaUEwRVFhaUFDS0FJTUlBTW9BZ1FSQUFBZ0FDQUZFQThnQUNBSUVBOGdCeUVHREFRTElBSWdCVGNESUFKK0lBNEVRQ0FDSUFjM0F6QWdBaUFEclRjREtDQUFJQUFnQ1VLQWdJQ0FNRUVESUFKQklHb1FJUkEzREFFTElBSWdDRGNEU0NBQ1FvQ0FnSUF3TndOQUlBSkNnSUNBZ0RBM0F6Z2dBaUFITndNb0lBSWdBNjAzQXpBZ0FDQUNRU0JxRU8wRUN5SUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSWdBa0VJYWlJTUlBc2dDaUFERUZFYUlBd2dBUkIvR2lBTktRSUVJZ0duUWYvLy8vOEhjU0FEYWlFS1FRRWhEQ0FFRFFFTEN5QUNRUWhxSWdNZ0N5QUtJQXNvQWdSQi8vLy8vd2R4RUZFYUlBQWdCUkFQSUFBZ0NCQVBJQUFnQnhBUElBTVFOaUVHREFFTElBSW9BZ2dvQWhBaUEwRVFhaUFDS0FJTUlBTW9BZ1FSQUFBZ0FDQUZFQThnQUNBSUVBOGdBQ0FIRUE4TElBSkIwQUJxSkFBZ0JndTRBZ0lEZndOK0l3QkJJR3NpQWlRQVFvQ0FnSURnQUNFSEFrQUNRQUpBSUFBZ0FSQlpJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFJZ0F5a0RBQkRpQXcwQUlBSXBBd0FpQ0VLQWdJQ0FDRm9FUUNBQVFlSXFRUUFRVUF3QkN5QUJweUlFS1FJRUlnbW5JZ1pCLy8vLy93ZHhJZ1ZGRFFFZ0NLY2lBMEVCUmcwQklBbEMvLy8vL3dlRElBaCtRb0NBZ0lBRVdnUkFJQUJCd05vQVFRQVFSZ3dCQ3lBQUlBSkJDR29nQXlBRmJDQUdRUjkyRUlvRERRQUNRQ0FGUVFGSEJFQURRQ0FEUVFCTURRSWdBa0VJYWlBRVFRQWdCUkJSR2lBRFFRRnJJUU1NQUFzQUN5QUNRUWhxQW44Z0JDMEFCMEdBQVhFRVFDQUVMd0VRREFFTElBUXRBQkFMSUFNUXdRUWFDeUFBSUFFUUR5QUNRUWhxRURZaEJ3d0NDeUFBSUFFUUR3d0JDeUFCSVFjTElBSkJJR29rQUNBSEM4RUJBZ0ovQW40akFFRVFheUlFSkFCQ2dJQ0FnT0FBSVFZQ1FDQUFJQUVRV1NJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FTRUdEQUVMQWtBZ0FDQUVRUXhxSUFNcEF3QWdBYWNpQlNnQ0JFSC8vLy8vQjNFaUFpQUNFRmNOQUNBRUlBSTJBZ2dnQXlrRENDSUhRb0NBZ0lCd2cwS0FnSUNBTUZJRVFDQUFJQVJCQ0dvZ0J5QUNJQUlRVncwQklBUW9BZ2doQWdzZ0FDQUZJQVFvQWd3aUF5QUNJQU1nQWlBRFNoc1FoQUVoQmdzZ0FDQUJFQThMSUFSQkVHb2tBQ0FHQzhBQkFnTi9BbjRqQUVFUWF5SUNKQUJDZ0lDQWdPQUFJUWNDUUNBQUlBRVFXU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQVNFSERBRUxBa0FnQUNBQ1FReHFJQU1wQXdBZ0FhY2lCaWdDQkVILy8vLy9CM0VpQkNBRUVGY05BQ0FDSUFRZ0FpZ0NEQ0lGYXlJRU5nSUlJQUFnQmlBRklBTXBBd2dpQ0VLQWdJQ0FjSU5DZ0lDQWdEQlNCSDhnQUNBQ1FRaHFJQWdnQkVFQUVGY05BU0FDS0FJSUJTQUVDeUFGYWhDRUFTRUhDeUFBSUFFUUR3c2dBa0VRYWlRQUlBY0wwd0VDQW44Q2ZpTUFRUkJySWdJa0FFS0FnSUNBNEFBaEJnSkFJQUFnQVJCWklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUVlNQVFzQ1FDQUFJQUpCREdvZ0F5a0RBQ0FCcHlJRktBSUVRZi8vLy84SGNVRUFFRmNOQUNBQ0lBVW9BZ1JCLy8vLy93ZHhJZ1EyQWdnZ0F5a0RDQ0lIUW9DQWdJQndnMEtBZ0lDQU1GSUVRQ0FBSUFKQkNHb2dCeUFFUVFBUVZ3MEJJQUlvQWdnaEJBc2dBQ0FGSUFJb0Fnd2lBeUFFSUFNZ0JFZ2JJQU1nQkNBRElBUktHeENFQVNFR0N5QUFJQUVRRHdzZ0FrRVFhaVFBSUFZTHFBVUNDMzRDZnlNQVFSQnJJZ0lrQUFKQUlBRkNnSUNBZ0JDRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQVFaVXdRUUFRRlVLQWdJQ0E0QUFoQnd3QkN5QURLUU1JSVFZQ1FDQURLUU1BSWdSQ2dJQ0FnSENESWdsQ2dJQ0FnQkNFUW9DQWdJQXdVUTBBSUFBZ0JFSFdBU0FFUVFBUUZDSUZRb0NBZ0lCd2d5SUhRb0NBZ0lBZ1VTQUhRb0NBZ0lBd1VYSU5BQ0FIUW9DQWdJRGdBRkVOQVNBQ0lBWTNBd2dnQWlBQk53TUFJQUFnQlNBRVFRSWdBaEF2SVFjTUFRdENnSUNBZ09BQUlRZENnSUNBZ0RBaENDQUFBbjVDZ0lDQWdEQWdBQ0FCRUNnaUNrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUdrS0FnSUNBNEFBZ0FCQStJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQm9DUUFKQUlBWkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBSkJmellDQUF3QkN5QUFJQUlnQmhCM1FRQklEUUVMSUFxbklnTXBBZ1FoQ3lBQUlBUVFLQ0lJUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFDUUNBQ0tBSUFJZzlGRFFCQ0FDRUVBa0FnQ1VLQWdJQ0FNRkVFUUVJQUlRVU1BUXNnQ0tjaUVDa0NCRUwvLy8vL0I0TWhCaUFMUXYvLy8vOEhneUlGVUVVRVFDQUZJQVo5SUFaUXJTSUpmU0VNSUErdElRMUNBQ0VGQTBBQ1FDQUVJQWw4SWc0Z0RGVU5BQ0FESUJBZ0RxY1F3Z1FpRDBFQVNBMEFJQUFnQXlBRXB5QVBFSVFCSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQlNBQUlBRWdCU0FFUVFBUTBnRkJBRWdOQlNBR0lBK3NmQ0VFSUFWQ0FYd2lCU0FOVWcwQkRBUUxDeUFGUXYvLy8vOFBneUVGREFFTFFnQWhCU0FHVUEwQkN5QUFJQU1nQktjZ0M2ZEIvLy8vL3dkeEVJUUJJZ1JDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFFZ0JTQUVRUUFRMGdGQkFFZ05BUXNnQUNBS0VBOGdBQ0FJRUE4Z0FTRUhEQUlMSUFFTEVBOGdBQ0FLRUE4Z0FDQUlFQThMSUFKQkVHb2tBQ0FIQzZBREFRUitJd0JCTUdzaUFpUUFJQUlnQVRjREtBSkFJQUZDZ0lDQWdCQ0VRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFRWlV3UVFBUUZVS0FnSUNBNEFBaEJnd0JDd0pBSUFNcEF3QWlCVUtBZ0lDQUVJUkNnSUNBZ0hDRFFvQ0FnSUF3VVEwQVFvQ0FnSURnQUNFR0lBQWdCU0FFSUFWQkFCQVVJZ2RDZ0lDQWdIQ0RJZ2hDZ0lDQWdPQUFVUTBCQWtBZ0JFSFRBVWNOQUNBQUlBVVF4QVJCQUU0TkFDQUFJQWNRRHd3Q0N5QUlRb0NBZ0lBUWhFS0FnSUNBTUZFTkFDQUFJQWNnQlVFQklBSkJLR29RTHlFR0RBRUxJQUlnQUNBQkVDZ2lCemNEQ0VLQWdJQ0E0QUFoQmlBSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FpQUZOd01RQWtBQ1FBSi9JQVJCMHdGSEJFQkNnSUNBZ0RBaEFVRUJEQUVMSUFCQnA5MEFFR0lpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCSUFJZ0FUY0RHRUVDQ3lFRElBQWdBQ2tEU0NBRElBSkJFR29RcHdFaEJTQUFJQUVRRHlBRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTElBQWdCeEFQREFFTElBQWdCU0FFUVFFZ0FrRUlhaEN0QWlFR0lBQWdBaWtEQ0JBUEN5QUNRVEJxSkFBZ0JndVlBd0lGZndOK0l3QkJFR3NpQmlRQUFrQWdBQ0FCRUZraUNrS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBb2hBUXdCQ3dKQUlBQWdBeWtEQUJEUUF5SUZCRUJDZ0lDQWdPQUFJUUZDZ0lDQWdEQWhDeUFGUVFCTURRRWdBRUg4OVFCQkFCQVZEQUVMUW9DQWdJRGdBQ0VCSUFBZ0F5a0RBQkFvSWd0Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBTHB5SUhLQUlFSVFnZ0JpQUtweUlKS0FJRVFmLy8vLzhIY1NJRlFRQWdCRUVDUmhzMkFnd0NRQ0FDUVFKSURRQWdBeWtEQ0NJTVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQUNBQUlBWkJER29nRENBRlFRQVFWdzBCQ3lBRklBaEIvLy8vL3dkeElnVnJJUUlDUUFKQUFrQUNRQ0FFRGdJQUFRSUxJQVlvQWd3aEF3d0NDeUFHS0FJTUlnTWdBa29oQkVLQWdJQ0FFQ0VCSUFNaEFpQUVSUTBCREFJTElBWW9BZ3dnQldzaUF5RUNDMEtBZ0lDQUVDRUJJQU5CQUVnZ0FpQURTSElOQUFOQUlBa2dCeUFEUVFBZ0JSQ3pBMFVFUUVLQmdJQ0FFQ0VCREFJTElBSWdBMGNoQkNBRFFRRnFJUU1nQkEwQUN3c2dBQ0FLRUE4Z0FDQUxFQThMSUFaQkVHb2tBQ0FCQzdBREF3ZC9BWHdCZmlNQVFSQnJJZ1VrQUFKQUlBQWdBUkJaSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUFKQUFrQWdBQ0FES1FNQUVDZ2lEVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQTJuSWdrb0FnUkIvLy8vL3dkeElRWWdBYWNpQ2lnQ0JFSC8vLy8vQjNFaEJ3SkFJQVFFUUNBRklBY2dCbXNpQ3pZQ0RFRi9JUWhCQUNFRUlBSkJBa2dOQVNBQUlBVWdBeWtEQ0JCQ0RRSWdCU3NEQUNJTXZVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmcwQklBeEVBQUFBQUFBQUFBQmxCRUFnQlVFQU5nSU1EQUlMSUF3Z0M3ZGpSUTBCSUFVQ2Z5QU1tVVFBQUFBQUFBRGdRV01FUUNBTXFnd0JDMEdBZ0lDQWVBczJBZ3dNQVFzZ0JVRUFOZ0lNSUFKQkFrNEVRQ0FBSUFWQkRHb2dBeWtEQ0NBSFFRQVFWdzBDQ3lBSElBWnJJUVJCQVNFSUMwRi9JUUlnQmlBSFN3MEJJQVFnQlNnQ0RDSURheUFJYkVFQVNBMEJBMEFnQ2lBSklBTkJBQ0FHRUxNRFJRUkFJQU1oQWd3REN5QURJQVJHRFFJZ0F5QUlhaUVEREFBTEFBc2dBQ0FCRUE4Z0FDQU5FQTlDZ0lDQWdPQUFJUUVNQVFzZ0FDQUJFQThnQUNBTkVBOGdBcTBoQVFzZ0JVRVFhaVFBSUFFTGt3RUNBWDRCZnlNQVFSQnJJZ0lrQUVLQWdJQ0E0QUFoQkFKQUlBQWdBUkJaSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRUU1BUXNDUUNBQUlBSkJER29nQXlrREFCQzZBUTBBUW9DQWdJQXdJUVFnQWlnQ0RDSURRUUJJRFFBZ0F5QUJweUlGS0FJRVFmLy8vLzhIY1U4TkFDQUZJQUpCREdvUXlRR3RJUVFMSUFBZ0FSQVBDeUFDUVJCcUpBQWdCQXRwQWdKL0FYNGdBQ0FCRUZraEFRTkFJQUlnQkV3Z0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVhKRkJFQWdBeUFFUVFOMGFpa0RBQ0lHUWlDSXAwRjFUd1JBSUFhbklnVWdCU2dDQUVFQmFqWUNBQXNnQkVFQmFpRUVJQUFnQVNBR0VNUUNJUUVNQVFzTElBRUx5QUVDQVg0QmZ5TUFRUkJySWdJa0FFS0FnSUNBNEFBaEJBSkFJQUFnQVJCWklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUVFNQVFzQ1FDQUFJQUpCREdvZ0F5a0RBQkM2QVEwQUFrQWdBaWdDRENJRFFRQk9CRUFnQXlBQnB5SUZLUUlFSWdTblFmLy8vLzhIY1VrTkFRc2dBRUV2RUMwaEJBd0JDeUFGUVJCcUlRVWdBQUovSUFSQ2dJQ0FnQWlEVUVVRVFDQUZJQU5CQVhScUx3RUFEQUVMSUFNZ0JXb3RBQUFMUWYvL0EzRVFud01oQkFzZ0FDQUJFQThMSUFKQkVHb2tBQ0FFQzdnQkFnSitBWDhqQUVFUWF5SUNKQUJDZ0lDQWdPQUFJUVFDUUNBQUlBRVFXU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQVNFRURBRUxBa0FnQUNBQ1FReHFJQU1wQXdBUXVnRU5BRUtBZ0lDQXdINGhCQ0FDS0FJTUlnTkJBRWdOQUNBRElBR25JZ1lwQWdRaUJhZEIvLy8vL3dkeFR3MEFJQVpCRUdvaEJpQUZRb0NBZ0lBSWcxQkZCRUFnQmlBRFFRRjBhak1CQUNFRURBRUxJQU1nQm1veEFBQWhCQXNnQUNBQkVBOExJQUpCRUdva0FDQUVDK01CQWdGK0FuOGpBRUVRYXlJQ0pBQUNRQ0FBSUFGQkxSQkxJZ05GQkVBZ0JFRUFOZ0lBUW9DQWdJRGdBQ0VCREFFTFFvQ0FnSUF3SVFFQ1FDQURLUU1BSWdaQ2dJQ0FnSENEUW9DQWdJQXdVZ1JBSUFJZ0F5Z0NEQ0lGTmdJTUlBVWdCcWNpQnlnQ0JFSC8vLy8vQjNGSkRRRWdBQ0FHRUE4Z0EwS0FnSUNBTURjREFBc2dCRUVCTmdJQURBRUxJQWNnQWtFTWFoREpBU0VJSUFNZ0FpZ0NERFlDRENBRVFRQTJBZ0FnQ0VILy93Tk5CRUFnQUNBSVFmLy9BM0VRbndNaEFRd0JDeUFBSUFjZ0JVRUJkR3BCRUdwQkFoRHVBeUVCQ3lBQ1FSQnFKQUFnQVFzM0FDTUFRUkJySWdJa0FDQUFJQUpCREdvZ0F5a0RBQkIzSVFBZ0FpZ0NEQ0VESUFKQkVHb2tBRUtBZ0lDQTRBQWdBMmV0SUFBYkMwNEFJd0JCRUdzaUFpUUFRb0NBZ0lEZ0FDRUJBa0FnQUNBQ1FReHFJQU1wQXdBUWR3MEFJQUFnQWtFSWFpQURLUU1JRUhjTkFDQUNLQUlJSUFJb0FneHNyU0VCQ3lBQ1FSQnFKQUFnQVFzR0FDQUF0cnNMZndBZ0FDQUFLUVBRQVNJQlFneUlJQUdGSWdGQ0dZWWdBWVVpQVVJYmlDQUJoU0lCTndQUUFVS0FnSUNBd0g0Z0FVS2R1clA3bEpMOW9pVitRZ3lJUW9DQWdJQ0FnSUQ0UDRTL1JBQUFBQUFBQVBDL29MMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3d1akJBTURmQVYvQTM0akFFRVFheUlJSkFBZ0NFSUFOd01JQWtBQ1FDQUNRUUJNRFFCQ2dJQ0FnT0FBSVFFZ0FDQUlRUWhxSUFNcEF3QVFRZzBCUVFFaENTQUlLd01JSVFRZ0FrRUJSd1JBQTBBZ0FpQUpSZzBDSUFBZ0NDQURJQWxCQTNScUtRTUFFRUlOQXlBSlFRRnFJUWtnQ0NzREFDRUZJd0JCSUdzaUJ5UUFJQVM5UXYvLy8vLy8vLy8vL3dDRElnMGdCYjFDLy8vLy8vLy8vLy8vQUlNaURDQU1JQTFXR3lJT3Z5RUVBa0FnRGtJMGlLY2lDa0gvRDBZTkFDQU5JQXdnRENBTlZCc2lETDhoQlFKQUlBNVFEUUFnREVJMGlLY2lDMEgvRDBZTkFDQUxJQXByUWNFQVRnUkFJQVVnQktBaEJBd0NDd0o4SUF0Qi9ndFBCRUFnQkVRQUFBQUFBQUF3RktJaEJDQUZSQUFBQUFBQUFEQVVvaUVGUkFBQUFBQUFBTEJyREFFTFJBQUFBQUFBQVBBL0lBcEJ2QVJMRFFBYUlBUkVBQUFBQUFBQXNHdWlJUVFnQlVRQUFBQUFBQUN3YTZJaEJVUUFBQUFBQUFBd0ZBc2hCaUFIUVJocUlBZEJFR29nQlJDS0JpQUhRUWhxSUFjZ0JCQ0tCaUFHSUFjckF3QWdCeXNERUtBZ0J5c0RDS0FnQnlzREdLQ2ZvaUVFREFFTElBVWhCQXNnQjBFZ2FpUUFEQUFMQUFzZ0JKa2hCQXNnQkwwaUFRSi9JQVNaUkFBQUFBQUFBT0JCWXdSQUlBU3FEQUVMUVlDQWdJQjRDeUlBdDcxUkJFQWdBSzBoQVF3QkMwS0FnSUNBd0g0Z0FVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeUVCQ3lBSVFSQnFKQUFnQVF0T0FDQUFJQUJFQUFBQUFBQUE4TDlFQUFBQUFBQUE4RDhnQUVRQUFBQUFBQUFBQUdNYklBQzlRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d5QUFSQUFBQUFBQUFBQUFZUnNMUXdBQ2ZDQUJ2VUtBZ0lDQWdJQ0ErUDhBZzBLQWdJQ0FnSUNBK1A4QVVRUkFSQUFBQUFBQUFQaC9JQUNaUkFBQUFBQUFBUEEvWVEwQkdnc2dBQ0FCRUk4REN3dURBUUlDZmdGL0lBQzlJZ0ZDTklpblFmOFBjU0lEUWY0SFRRUkFJQUZDZ0lDQWdJQ0FnSUNBZjRNaEFpQURRZjRIUnlBQlFvQ0FnSUNBZ0lEd3YzOVJja1VFUUNBQ1FvQ0FnSUNBZ0lENFA0Uy9Ed3NnQXI4UEN5QURRYklJVFFSOElBRkNQNGNnQVh4Q0FVR3pDQ0FEYTYyR0lnRkNBWWg4UWdBZ0FYMkR2d1VnQUFzTGdnVURBbndGZndGK0l3QkJFR3NpQ1NRQUFuNUNnSUNBZ01EKy8vdi9BRUtBZ0lDQXdQNy9leUFFR3lBQ1JRMEFHZ0o4SUFNcEF3QWlBVUwvLy8vL0QxZ0VRRUVCSUFJZ0FrRUJUQnNoQ2lBQnB5RUlRUUVoQndOQUlBY2dDa2NFUUNBSXR5QURJQWRCQTNScUtRTUFJZ0ZDZ0lDQWdCQmFEUU1hSUFnZ0FhY2lDeUFJSUF0S0d5QUlJQXNnQ0NBTFNCc2dCQnNoQ0NBSFFRRnFJUWNNQVFzTElBaXREQUlMUW9DQWdJRGdBQ0FBSUFsQkNHb2dBUkJDRFFFYVFRRWhCeUFKS3dNSUN5RUZJQWNnQWlBQ0lBZElHeUVDQTBBZ0FpQUhSd1JBUW9DQWdJRGdBQ0FBSUFrZ0F5QUhRUU4wYWlrREFCQkNEUUlhQWtBZ0JiMGlERUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZnMEFJQWtyQXdBaUJyMGlBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZnUkFJQVloQlF3QkN5QUZSQUFBQUFBQUFBQUFZU0FHUkFBQUFBQUFBQUFBWVhFaENpQUVCRUFnQ2dSQUlBRWdESU8vSVFVTUFnc2dCU0FGSUFhbElBYTlRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d5QUdJQVc5UXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QllHeUVGREFFTElBb0VRQ0FCSUF5RXZ5RUZEQUVMSUFVZ0JTQUdwQ0FHdlVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNnQmlBRnZVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBV0JzaEJRc2dCMEVCYWlFSERBRUxDeUFGdlNJQkFuOGdCWmxFQUFBQUFBQUE0RUZqQkVBZ0Jhb01BUXRCZ0lDQWdIZ0xJZ0MzdlZFRVFDQUFyUXdCQzBLQWdJQ0F3SDRnQVVLQWdJQ0F3SUdBL1A4QWZTQUJRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c2hBU0FKUVJCcUpBQWdBUXN0QUVLQWdJQ0E0QUFnQUNBREtRTUFJQU1wQXdoQkFCQ0xBaUlBUVFCSHJVS0FnSUNBRUlRZ0FFRUFTQnNMb0FFQkEzNGdBeWtEQUNJRklRUWdBa0VFVGdSQUlBTXBBeGdoQkFzZ0JVTC8vLy8vYjFnRVFDQUFFQ1JDZ0lDQWdPQUFEd3NnQXlrREVDRUJRb0NBZ0lEZ0FDRUdBa0FnQUNBREtRTUlFREVpQWtVTkFDQUJRaUNJcDBGMVR3UkFJQUduSWdNZ0F5Z0NBRUVCYWpZQ0FBc2dBQ0FGSUFJZ0FTQUVRUUFRaGdRaEF5QUFJQUlRRXlBRFFRQklEUUFnQTBFQVI2MUNnSUNBZ0JDRUlRWUxJQVlMandFQUFrQUNRQ0FES1FNQUlnRkMvLy8vLzI5WUJFQWdCQVJBSUFBUUpBd0RDeUFCUWlDSXAwRjFTUTBCSUFHbklnQWdBQ2dDQUVFQmFqWUNBQ0FCRHdzZ0FDQUJFTFlESWdKQkFFZ05BU0FFQkVBZ0FrRUFSNjFDZ0lDQWdCQ0VEd3NnQWtVRVFDQUFRZmppQUVFQUVCVU1BZ3NnQWFjaUFDQUFLQUlBUVFGcU5nSUFDeUFCRHd0Q2dJQ0FnT0FBQ3lvQUlBTXBBd0FpQVVMLy8vLy9iMWdFUUNBQUVDUkNnSUNBZ09BQUR3c2dBQ0FCUVFOQkFCQ3FBZ3RQQUFKQUFrQWdBeWtEQUNJQlF2Ly8vLzl2V0FSQUlBUkZCRUJDZ0lDQWdCQVBDeUFBRUNRTUFRc2dBQ0FCRUprQklnQkJBRTROQVF0Q2dJQ0FnT0FBRHdzZ0FFRUFSNjFDZ0lDQWdCQ0VDMk1CQVg0Z0F5a0RBQ0lFUXYvLy8vOXZXQVJBSUFBUUpFS0FnSUNBNEFBUEMwS0FnSUNBNEFBaEFRSkFJQUFnQXlrRENCQXhJZ0pGRFFBZ0FDQUVJQUlRY1NFRElBQWdBaEFUSUFOQkFFZ05BQ0FEUVFCSHJVS0FnSUNBRUlRaEFRc2dBUXMyQUNBREtRTUFJZ0ZDSUlpbklnSkJmMFlnQkVVZ0FrRitjVUVDUjNGeVJRUkFJQUFRSkVLQWdJQ0E0QUFQQ3lBQUlBRVE2QUVMWXdFQ2ZnSkFBa0FnQXlrREFDSUJRdi8vLy85dldBUkFJQUFRSkF3QkN5QURLUU1JSVFVZ0FTRUVJQUpCQTA0RVFDQURLUU1RSVFRTElBQWdCUkF4SWdJTkFRdENnSUNBZ09BQUR3c2dBQ0FCSUFJZ0JFRUFFQlFoQVNBQUlBSVFFeUFCQzJZQkFYNGdBeWtEQUNJRVF2Ly8vLzl2V0FSQUlBQVFKRUtBZ0lDQTRBQVBDMEtBZ0lDQTRBQWhBUUpBSUFBZ0F5a0RDQkF4SWdKRkRRQWdBQ0FFSUFKQkFCRFZBU0VESUFBZ0FoQVRJQU5CQUVnTkFDQURRUUJIclVLQWdJQ0FFSVFoQVFzZ0FRdUxBUUVDZmlBREtRTUFJZ0ZDLy8vLy8yOVlCRUFnQUJBa1FvQ0FnSURnQUE4TElBTXBBeEFoQmtLQWdJQ0E0QUFoQlFKQUlBQWdBeWtEQ0JBeElnSkZEUUFnQUNBQklBSWdCaUFFUlVFT2RCREhCQ0VESUFBZ0FoQVRJQU5CQUVnTkFDQUVCRUFnQTBFQVI2MUNnSUNBZ0JDRUR3c2dBYWNpQUNBQUtBSUFRUUZxTmdJQUlBRWhCUXNnQlF1YUFRSUJmd0orSXdCQkVHc2lCQ1FBSUFNcEF3Z2hCU0FES1FNQUlnWWhBUUpBQWtBQ1FBSkFJQUpCQTBnTkFDQURLUU1RSWdGQ2dJQ0FnSEJhQkVBZ0FhY3RBQVZCRUhFTkFRc2dBRUdpUGtFQUVCVU1BUXNnQUNBRVFReHFJQVVRaVFRaUFnMEJDMEtBZ0lDQTRBQWhBUXdCQ3lBQUlBWWdBU0FFS0FJTUlnTWdBaENRQXlFQklBQWdBaUFERUpzREN5QUVRUkJxSkFBZ0FRc1ZBQ0FBSUFNcEF3QWdBeUFEUVFocVFRSVFuUU1MVmdJQmZnRi9JQUFnQVJDMEF5SUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBUThMUW9DQWdJQXdJUUlnQWFjaUF5Z0NCRUdBZ0lDQWVFY0VRQ0FBSUFBb0FoQWdBeERCQWhBdElRSUxJQUFnQVJBUElBSUxDUUFnQUNBQkVMUURDMXNCQVg0akFFRVFheUlDSkFBZ0FpQUFJQUVRdEFNaUFUY0RDQUpBSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRUU1BUXNnQUVLQWdJQ0FNRUVCSUFKQkNHb1Fsd1loQkNBQUlBRVFEd3NnQWtFUWFpUUFJQVFMZmdFQmZpQURLUU1BSWdGQ2dJQ0FnSENEUW9DQWdJQ0FmMUlFUUNBQVFmYlNBRUVBRUJWQ2dJQ0FnT0FBRHd0Q2dJQ0FnREFoQkNBQnB5SUFLUUlFUW9DQWdJQ0FnSUNBUUlOQ2dJQ0FnSUNBZ0lDQWYxRUVmaUFBSUFBb0FnQkJBV28yQWdBZ0FVTC8vLy8vRDROQ2dJQ0FnSkIvaEFWQ2dJQ0FnREFMQ3p3QkFYNUNnSUNBZ09BQUlRRWdBQ0FES1FNQUVDZ2lCRUtBZ0lDQWNJTkNnSUNBZ09BQVVnUitJQUFnQktkQkFoQ0FCQVZDZ0lDQWdPQUFDd3VCQkFJQmZnRi9Ba0FDUUFKQUFrQUNRQ0FCUW9DQWdJQndXZ1JBSUFHbklnSXZBUVpCTDBZTkFRc2dCRUVCTmdJQURBRUxJQUlvQWlBaEFpQUVRUUUyQWdBZ0FnMEJDeUFBUWJZL1FRQVFGUXdCQ3dKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQWlnQ0FDSUhRUUZyRGdRQ0FnY0JBQXNnQlVVTkFpQUFLQUlRSUFJUXRRTUxRb0NBZ0lBd0lRRWdCVUVCYXc0Q0F3UUhDeUFES1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQXlBREtBSUFRUUZxTmdJQUN3SkFJQVZCQWtjTkFFRUJJUU1nQjBFQlJ3MEFJQUFnQVJDS0FRd0NDeUFDS0FKRUlnTWdCYTAzQXdBZ0EwRUlheUFCTndNQUlBSWdBMEVJYWpZQ1JBdEJBQ0VEQ3lBQ1FRTTJBZ0FnQWlBRE5nSVVJQUFnQWtFSWFoQzBBaUVCSUFKQkFUWUNBQ0FCUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNnQ0VDQUNFTFVESUFFUEN5QUNLQUpFUVFocklnTXBBd0FoQmlBRFFvQ0FnSUF3TndNQUlBRkMvLy8vL3c5WUJFQWdBVUlDVVFSQUlBSkJBallDQUNBRVFRSTJBZ0FnQmc4TElBUkJBRFlDQUNBR0R3c2dBQ0FCRUE4Z0FDZ0NFQ0FDRUxVRElBWVBDeUFES1FNQUlnRkNJSWluUVhWSkRRTWdBYWNpQUNBQUtBSUFRUUZxTmdJQUlBRVBDeUFES1FNQUlnRkNJSWluUVhWUEJFQWdBYWNpQWlBQ0tBSUFRUUZxTmdJQUN5QUFJQUVRaWdFTUFRc2dBRUdVUDBFQUVCVUxRb0NBZ0lEZ0FDRUJDeUFCQys4QkFRTitJd0JCRUdzaUFpUUFRb0NBZ0lEZ0FDRUVBa0FnQUNBQUlBRVFKU0lCUVFFUWtBSWlCVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQVZDSUlpbklnTkJBQ0FEUVF0cVFSSkpHMFVFUUNBQUlBSkJDR29nQlJCQ1FRQklEUUZDZ0lDQWdDQWhCQ0FDS1FNSVFvQ0FnSUNBZ0lENC93Q0RRb0NBZ0lDQWdJRDQvd0JSRFFFTFFvQ0FnSURnQUNFRUlBQWdBVUcvM0FBUXNnRWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQmhBNFJRUkFJQUJCN1BFQVFRQVFGU0FBSUFZUUR3d0JDeUFBSUFZZ0FVRUFRUUFRTHlFRUN5QUFJQUVRRHlBQUlBVVFEeUFDUVJCcUpBQWdCQXVOQWdJQmZBRitJd0JCRUdzaUFpUUFRb0NBZ0lEZ0FDRUZBa0FnQUNBQ1FRaHFJQUVRbXdJTkFDQUFJQUpCQ0dvZ0F5a0RBQkJDRFFBZ0FnSitJQUlyQXdnaUJMMGlCVUtBZ0lDQWdJQ0ErUDhBZzBLQWdJQ0FnSUNBK1A4QVVnUkFJQVNkSWdSRUFBQUFBQUN3blVDZ0lBUWdCRVFBQUFBQUFBQlpRR01iSUFRZ0JFUUFBQUFBQUFBQUFHWWJJZ1M5SVFVTEFuOGdCSmxFQUFBQUFBQUE0RUZqQkVBZ0JLb01BUXRCZ0lDQWdIZ0xJZ08zdlNBRlVRUkFJQU90REFFTFFvQ0FnSURBZmlBRlFvQ0FnSURBZ1lEOC93QjlJQVZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDemNEQUNBQUlBRkJBU0FDUVJFUXlBUWhCUXNnQWtFUWFpUUFJQVVMaVFFQ0FYNEJmQ01BUVJCcklnSWtBRUtBZ0lDQTRBQWhCQUpBSUFBZ0FrRUlhaUFCRUpzQ0RRQWdBQ0FDUVFocUlBTXBBd0FRUWcwQUlBQWdBU0FDS3dNSUlnV2RSQUFBQUFBQUFBQUFvRVFBQUFBQUFBRDRmeUFGUkFBQTNNSUlzajVEWlJ0RUFBQUFBQUFBK0g4Z0JVUUFBTnpDQ0xJK3cyWWJFTWtFSVFRTElBSkJFR29rQUNBRUM5Y0JBUUY4SXdCQjBBQnJJZ0lrQUFKK1FvQ0FnSURnQUNBQUlBRWdBaUFFUVE5eFFRQVF0d01pQUVFQVNBMEFHa0tBZ0lDQXdINGdBRVVOQUJvZ0JFR0FBbkVFUUNBQ0lBSXJBd0JFQUFBQUFBQ3duY0NnT1FNQUN5QUNJQVJCQkhaQkQzRkJBM1JxS3dNQUlnVzlJZ0VDZnlBRm1VUUFBQUFBQUFEZ1FXTUVRQ0FGcWd3QkMwR0FnSUNBZUFzaUJMZTlVUVJBSUFTdERBRUxRb0NBZ0lEQWZpQUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3lFQklBSkIwQUJxSkFBZ0FRdUZBUUVCZkNNQVFSQnJJZ0lrQUFKK1FvQ0FnSURnQUNBQUlBSkJDR29nQVJDYkFnMEFHa0tBZ0lDQXdINGdBaXNEQ0NJRXZVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmcwQUdnSitJQVNkSWdTWlJBQUFBQUFBQU9CRFl3UkFJQVN3REFFTFFvQ0FnSUNBZ0lDQWdIOExFTGdEclFzaEFTQUNRUkJxSkFBZ0FRdUdBUUVCZmdKQUlBRkMvLy8vLzI5WUJFQWdBQkFrREFFTEFrQWdBeWtEQUNJRVFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTRFFBZ0FDQUVFREVpQWtVTkFTQUFJQUlRRTBFUklRTUNRQUpBQWtBZ0FrSEdBR3NPQmdJREFRTURBZ0FMSUFKQkZrY05BZ3RCRUNFREN5QUFJQUVnQXhDUUFnOExJQUJCdGl0QkFCQVZDMEtBZ0lDQTRBQUxsZ0VCQVh3akFFRVFheUlDSkFBQ2ZrS0FnSUNBNEFBZ0FDQUNRUWhxSUFFUW13SU5BQm9nQWlzRENDSUV2U0lCQW44Z0JKbEVBQUFBQUFBQTRFRmpCRUFnQktvTUFRdEJnSUNBZ0hnTElnQzN2VkVFUUNBQXJRd0JDMEtBZ0lDQXdINGdBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzaEFTQUNRUkJxSkFBZ0FRdnNBZ0lEZndGOEl3QkIwQUJySWdRa0FDQUVRUkJxUVFCQk9CQXJHaUFFUW9DQWdJQ0FnSUQ0UHpjRElFS0FnSUNBd0g0aEFRSkFJQUpGRFFCQkJ5QUNJQUpCQjA0YklnSkJBQ0FDUVFCS0d5RUNBMEFnQWlBRlJ3UkFJQUFnQkVFSWFpQURJQVZCQTNRaUJtb3BBd0FRUWdSQVFvQ0FnSURnQUNFQkRBTUxJQVFyQXdnaUI3MUNnSUNBZ0lDQWdQai9BSU5DZ0lDQWdJQ0FnUGovQUZFTkFpQUVRUkJxSUFacUlBZWRPUU1BQWtBZ0JRMEFJQVFyQXhBaUIwUUFBQUFBQUFBQUFHWkZJQWRFQUFBQUFBQUFXVUJqUlhJTkFDQUVJQWRFQUFBQUFBQ3duVUNnT1FNUUN5QUZRUUZxSVFVTUFRc0xJQVJCRUdwQkFCRGdBaUlIdlNJQkFuOGdCNWxFQUFBQUFBQUE0RUZqQkVBZ0I2b01BUXRCZ0lDQWdIZ0xJZ1czdlZFRVFDQUZyU0VCREFFTFFvQ0FnSURBZmlBQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJJUUVMSUFSQjBBQnFKQUFnQVF0V0FCRFFCQ0lCUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FCUXYvLy8vOFBndzhMUW9DQWdJREFmaUFCdWIwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NJQUVLQWdJQ0FNQXVxSFFJR2Z3UitJd0JCMEFCcklnWWtBQUpBQWtBZ0FFRVFhaUlEUVlnQ0lBQW9BZ0FSQXdBaUFVVU5BQ0FCUVFWcVFRQkJnd0lRS3hvZ0FVRUZPZ0FFSUFGQkFUWUNBQ0FBS0FKUUlnUWdBVUVJYWlJRk5nSUVJQUVnQUVIUUFHbzJBZ3dnQVNBRU5nSUlJQUFnQlRZQ1VDQUJJQU1nQUNnQ1FFRURkQ0FBS0FJQUVRTUFJZ1EyQWlnZ0JFVUVRQ0FESUFFZ0FDZ0NCQkVBQUF3QkN5QUJJQUEyQWhBZ0FDZ0NTQ0lESUFGQkZHb2lCVFlDQkNBQklBQkJ5QUJxTmdJWUlBRWdBellDRkNBQUlBVTJBa2dnQVVMeGdJQ0FnRGszQXR3QklBRWdBRUhZQVdvMkF0Z0JJQUFvQWtBaUFFRUFJQUJCQUVvYklRQURRQ0FBSUFKR1JRUkFJQVFnQWtFRGRHcENnSUNBZ0NBM0F3QWdBa0VCYWlFQ0RBRUxDeUFCUW9DQWdJQWdOd05RSUFGQ2dJQ0FnQ0EzQTBnZ0FVS0FnSUNBSURjRFFDQUJJQUZCOUFGcUlnQTJBdmdCSUFFZ0FEWUM5QUVnQVVLQWdJQ0FJQkJISVFjZ0FTZ0NLQ0FITndNSVFRQWhBaUFCSUFGQkVVSE1uZ0ZCQUVFQVFRQWdCeER4QVNJSE53TXdJQWRDSUlpblFYVlBCRUFnQjZjaUFDQUFLQUlBUVFGcU5nSUFDeUFCS0FJb0lBYzNBMmdnQVJBMElRY2dBU2dDS0NBSE53TVlJQUVnQjBHUTFRRkJBeEFpQTBBZ0FTZ0NLQ0VBSUFKQkNFWkZCRUFnQWtFQ2RFR1FwZ0ZxS0FJQUlRTWdBU0FCSUFBcEF4Z1FSeUlIUVRZZ0FTQURFTW9FUVFNUUdSb2dBU0FIUVRNZ0FVRXZFQzFCQXhBWkdpQUJJQUpCQTNScUlBYzNBMWdnQWtFQmFpRUNEQUVMQ3lBQklBQXBBd2hCQWhCSklRY2dBU2dDS0NBSE53TVFRUUFoQWlBQklBRWdCNmRCQUNBSFF2Ly8vLzl2Vmh0QkFSREZCRFlDSkNBQklBRkJKR3BCQUVFd1FRb1F3d1FhSUFFZ0FVRVNRUUJCQUJEZUFqY0RzQUVnQVVFVFFRQkJBQkRlQWlFSElBRWdBU2tETUVIUEFFS0FnSUNBTUNBSElBRXBBN0FCUVlFeUVHMGFJQUVnQVNrRE1FSE5BRUtBZ0lDQU1DQUhJQUVwQTdBQlFZRXlFRzBhSUFFZ0J4QVBJQUVnQVNBSElBRWdBVUd3QVdwQkFSQ3hCaEFQSUFFZ0FSQTBOd1BBQVNBQklBRkNnSUNBZ0NBUVJ6Y0R5QUVnQVNBQlFjNHhRUlJCQVNBQktBSW9LUU1JRUw4QlFjRFZBVUVXRUNJZ0FTQUJLQUlvS1FNSVFhRFlBVUVMRUNJZ0FTQUJLUU13UWREWkFVRUhFQ0lnQVNBQlFSVkIzOHdBUVFGQkJVRUFFSUlCSWdjM0F6Z2dCMElnaUtkQmRVOEVRQ0FIcHlJQUlBQW9BZ0JCQVdvMkFnQUxJQUVnQjBIZnpBQWdBU2tETUJEZUFTQUJJQUZCRmtHOHdBQkJBVUVGUVg4UWdnRWlCMEc4d0FBZ0FTZ0NLQ2tER0JEZUFRTkFJQUpCQ0VaRkJFQWdBU0FCUVJZZ0FrRUNkRUdRcGdGcUtBSUFJZ0JCQWtFQklBSkJCMFliUVFVZ0FpQUhFUEVCSUFBZ0FTQUNRUU4wYWlrRFdCRGVBU0FDUVFGcUlRSU1BUXNMSUFFZ0FSQTBJZ2MzQTVnQklBRWdCMEhBMmdGQkFSQWlJQUVnQVNnQ0tDa0RFRUhRMmdGQklCQWlJQUZCMXg5QkYwRUJJQUVvQWlncEF4QVF2d0VpQjBJZ2lLZEJkVThFUUNBSHB5SUFJQUFvQWdCQkFXbzJBZ0FMSUFFZ0J6Y0RRQ0FCSUFkQjBONEJRUVFRSWlBR1FiQ21BVUhLQUJBZklnTWhBa0hqQUNFQUlBRkNnSUNBZ0NBUVJ5RUhBMEFnQUVIL0FYRUVRQ0FCSUFjZ0FrS0JnSUNBRUVFSEVPOEJHaUFDRUQ4Z0FtcEJBV29pQWkwQUFDRUFEQUVMQ3lBQklBRW9BaWdwQXhCQjJ3RWdCMEVCRUJrYUlBRWdBU0FCS0FJb0tRTVFJZ2RCNndBZ0IwRUFFQlEzQTZnQklBRWdBU2tEbUFFUVJ5RUhJQUVvQWlnZ0J6Y0Q0QUlnQVNBSFFaRGZBVUVDRUNJZ0FTQUJLUVBBQVVHdzN3RkJEaEFpSUFFZ0FTZ0NLQ2tEQ0VFRUVFa2hCeUFCS0FJb0lBYzNBeUFnQVNBSFFnQVEyd0VnQVNBQktBSW9LUU1nUWVEaEFVRUdFQ0lnQVNBQlFZZklBRUVZUVFFZ0FTZ0NLQ2tESUJDL0FVSEE0Z0ZCRGhBaUlBRWdBU2dDS0NrRENFRUdFRWtoQnlBQktBSW9JQWMzQXpBZ0FTQUhRb0NBZ0lBUUVOc0JJQUVnQVNnQ0tDa0RNRUdnNUFGQkFoQWlJQUZCOHRFQVFSbEJBU0FCS0FJb0tRTXdFTDhCR2lBQklBRW9BaWdwQXdoQkJSQkpJUWNnQVNnQ0tDQUhOd01vSUFFZ0J5QUJRUzhRTFJEYkFTQUJJQUZCME53QVFScEJBU0FCS0FJb0tRTW9FTDhCUWNEa0FVRURFQ0lnQVNBQktBSW9LUU1vUWZEa0FVRXhFQ0lnQVNBQktRT1lBUkJISVFjZ0FTZ0NLQ0FITndQb0FpQUJJQWRCOE9zQlFRSVFJaUFERUtNRUlBRkNBU0FETkFJSUlBTXBBd0JDd0lROWZud2lCeUFIUWdGWUd6Y0QwQUVnQVNBQktRUEFBVUdRN0FGQkFSQWlJQUVnQVNrRHdBRkI0UEVCUVFFUUlpQUJFRFFoQnlBQktBSW9JQWMzQXpnZ0FTQUhRZER6QVVFRkVDSWdBU0FCUVlQVEFFRWJRUUFnQVNnQ0tDa0RPQkMvQVNJSFFhRDBBVUVDRUNKQjBBRWhBaUFCSVFBRFFDQUNRZDRCUmtVRVFDQUFJQWNnQUNnQ0VDQURJQUlRa0FFaUJFRXVFS1lESWdWQkFXb2dCQ0FGR3lBQUlBSVFYRUVBRU84QkdpQUNRUUZxSVFJTUFRc0xJQUFnQUNrRG1BRVFSeUVISUFBb0FpZ2dCemNEK0FJZ0FDQUhRY0QwQVVFRUVDSWdBQ0FBS1FNd0VFY2hCeUFBS0FJb0lBYzNBNEFCSUFCQkZVSEl6QUJCQVVFRlFRRVFnZ0VoQnlBQUlBQW9BaWdwQTRBQlFZRDFBVUVCRUNJZ0FDQUFLQUlvSWdJcEE0QUJJQUlwQS9nQ1FRRkJBUkNXQWlBQUlBY2dBQ2dDS0NrRGdBRkJBRUVCRUpZQ0lBQWdCeEFQSUFBZ0FFRWNRYm5WQUVFQkVONENJZ2MzQTdnQklBQXBBOEFCSVFnZ0IwSWdpS2RCZFU4RVFDQUhweUlDSUFJb0FnQkJBV28yQWdBTElBQWdDRUU2SUFkQkF4QVpHaUFBS1FQQUFTSUhRaUNJcDBGMVR3UkFJQWVuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dBQ0FIUVlvQklBZEJBeEFaR2lBQUVEUWhCeUFBS0FJb0lBYzNBMUFnQUNBSFFkRExBVUV2RUNJZ0FDQUFRZVhpQUVFZFFRY2dBQ2dDS0NrRFVCQy9BVUhBMGdGQkF4QWlJQUJCSGpZQ2dBSWdBQ0FBS0FJb0tRTW9RWkRCQVVFQkVDSWdBRUVmTmdMOEFTQUFFRFFoQnlBQUtBSW9JQWMzQTVBQklBQWdCMEdnd1FGQkVSQWlJQUJCdHNrQVFTQkJBaUFBS0FJb0tRT1FBUkMvQVNJSFFpQ0lwMEYxVHdSQUlBZW5JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUhOd05JSUFBZ0IwR3d3d0ZCQVJBaUlBQWdBQ2tEbUFFUVJ5RUhJQUFvQWlnZ0J6Y0Q4QUlnQUNBSFFjRERBVUVDRUNJZ0FDQUFLUVBBQVVIZ3d3RkJBUkFpQWtBZ0FDZ0NFQ0lDS0FKQVFURlBCRUFnQWlnQ1JDZ0NnQWtOQVFzZ0FrSFlwQUZCTUVFQkVNMERHaUFDS0FKRUlnSkJrQWxxUVNFMkFnQWdBa0dVQ1dwQjVLUUJOZ0lBQ3lBQVFTSkIwUnBCQWtFQ1FRQVFnZ0VpQjBLQWdJQ0FjRm9FUUNBSHB5SUNJQUl0QUFWQkVISTZBQVVMSUFBZ0IwR2d4QUZCQVJBaUlBQWdBQ2tEd0FGQjBSb2dCMEVERU84QkdrRUFJUUlEUUFKQUlBSkJCRVlFUUVFQUlRSURRQ0FDUVFKR0RRSWdBQ0FBS1FPWUFSQkhJUWNnQUNnQ0tDQUNRUU4wYWlBSE53UFFBaUFBSUFjZ0FrRUNkRUdRcFFGcUtBSUFJQUpCbktVQmFpMEFBQkFpSUFKQkFXb2hBZ3dBQ3dBTElBQW9BaEFnQXlBQ1FiVUJhaENRQVNFRUlBQVFOQ0VISUFKQkptcEJBM1FpQlNBQUtBSW9haUFITndNQUlBQWdCeUFDUVFKMFFZQ2xBV29vQWdBZ0FrR1lwUUZxTFFBQUVDSWdBRUVqSUFSQkFFRURJQUlRZ2dFaEJ5QUNRUUZOQkVBZ0FDQUhRZkRJQVVFQkVDSUxJQUFnQnlBRUlBQW9BaWdnQldvcEF3QVEzZ0VnQWtFQmFpRUNEQUVMQ3lBQUVEUWhCeUFBS0FJb0lBYzNBNWdCSUFBZ0IwR1E5UUZCQXhBaUlBQWdBRUhreGdCQkpDQUFLQUlvS1FPWUFSQ1hCRUhBOVFGQkFoQWlJQUFRTkNFSElBQW9BaWdnQnpjRG9BRWdBQ0FIUWVEMUFVRURFQ0lnQUNBQVFiM0dBRUVsSUFBb0FpZ3BBNkFCRUpjRVFaRDJBVUVCRUNJZ0FDQUFFRFFpQjBHZzlnRkJIaEFpSUFBZ0IwRTNJQUFnQUNnQ0tDa0RFQ0lJUVRjZ0NFRUFFQlJCQXhBWkdpQUFJQUJCSmtIU0gwRUFFTjRDSWdoQmdQb0JRUU1RSWlBQUlBZ2dCeEQ3QlVFVklRSURRQ0FDUVNCR1JRUkFJQUVnQnhCSElRa2dBa0VEZENJQUlBRW9BaWhxSUFrM0F3QWdBU0FKUWNXQkFVRUJJQUpCNWFZQmFpMEFBSFN0SWdsQkFCRHZBUm9nQVNBQlFTY2dBU2dDRUNBRElBSkJqZ0ZxRUpBQklnUkJBMEVESUFJZ0NCRHhBU0lLSUFRZ0FTZ0NLQ0FBYWlrREFCRGVBU0FCSUFwQnhZRUJJQWxCQUJEdkFSb2dBa0VCYWlFQ0RBRUxDeUFCSUFjUUR5QUJJQWdRRHlBQkVEUWhCeUFCS0FJb0lBYzNBNEFDSUFFZ0IwR3crZ0ZCR0JBaUlBRkJ1eUpCS0NBQktBSW9LUU9BQWhDWEJCb0NRQ0FCS0FJUUlnQW9Ba0JCTWs4RVFDQUFLQUpFS0FLWUNRMEJDeUFBUWFDbEFVRXhRUWtRelFNYUlBQW9Ba1FpQUVIUUNtcEJLVFlDQUNBQVFhQUtha0VxTmdJQUlBQkJpQXBxUVNvMkFnQWdBRUh3Q1dwQkt6WUNBQ0FBUWRnSmFrRXNOZ0lBSUFCQndBbHFRU3cyQWdBTElBRVFOQ0VISUFFb0FpZ2dCemNEaUFNZ0FTQUhRWURKQVVFRUVDSWdBVUV0UWFmakFFRUJRUUpCQUJDQ0FTSUhRaUNJcDBGMVR3UkFJQWVuSWdBZ0FDZ0NBRUVCYWpZQ0FBc2dBU0FITndOUUlBRWdCMEhBeVFGQkJ4QWlJQUVnQjBHbjR3QWdBU2dDS0NrRGlBTVEzZ0VnQVNBQktRTXdFRWNoQnlBQktBSW9JQWMzQTZBRElBRkJGVUhhekFCQkFVRUZRUUlnQVNrRE9CRHhBU0VISUFFZ0FTZ0NLQ2tEb0FOQnNNb0JRUUVRSWlBQklBY2dBU2dDS0NrRG9BTkJBRUVCRUpZQ0lBRWdCeEFQSUFFZ0FSQTBJZ2MzQTZBQklBRWdCMEhBeWdGQkFSQWlJQUVnQVNrRG9BRVFSeUVISUFFb0FpZ2dCemNEdUFNZ0FTQUhRZERLQVVFREVDSWdBU0FCS1FPZ0FSQkhJUWNnQVNnQ0tDQUhOd1BJQXlBQklBZEJnTXNCUVFRUUlpQUJJQUVwQXpBUVJ5RUhJQUVvQWlnZ0J6Y0R3QU1nQVVFVlFjUE1BRUVCUVFWQkF5QUJLUU00RVBFQklRY2dBU0FCS0FJb0tRUEFBMEhBeXdGQkFSQWlJQUVnQVNnQ0tDSUFLUVBBQXlBQUtRUElBMEVCUVFFUWxnSWdBU0FISUFFb0FpZ3BBOEFEUVFCQkFSQ1dBaUFCSUFjUUR5QUJLQUlRSWdCQkxqWUNsQUlnQUVFdk5nS2tBaUFBUVRBMkFxQUNJQUJCTVRZQ25BSWdBRUV5TmdLWUFpQUJFRFFoQnlBQktBSW9JQWMzQTRnQ0lBRWdCMEdBMHdGQkF4QWlJQUVnQVVHSUxVRXpRUUVnQVNnQ0tDa0RpQUlRdndGQnNOTUJRUTRRSWd3QkMwRUFJUUVMSUFaQjBBQnFKQUFnQVFzSEFDQUFFTjhFQzRjQ0FRaC9BbjRnQUNnQ0VDZ0NlQ01BSWdjaURDQUJweWdDSUNJSUtBSVFJZ2tnQTJvaUMwRURkQ0lLYTBzRVFDQUFFT2tCUW9DQWdJRGdBQXdCQ3lBSlFRQWdDVUVBU2hzaERTQUhJQXBCRDJwQmNIRnJJZ2NrQUFOK0lBWWdEVVlFZmtFQUlRWWdBMEVBSUFOQkFFb2JJUU1EUUNBRElBWkdSUVJBSUFjZ0JpQUpha0VEZEdvZ0JDQUdRUU4wYWlrREFEY0RBQ0FHUVFGcUlRWU1BUXNMSUFWQkFYRUVRQ0FBSUFFZ0FoQlNJUU1nQUNBSUtRTUFJZ0VnQVNBQ0lBTWJJQXNnQnhDUUF3d0RDeUFBSUFncEF3QWdDQ2tEQ0NBTElBY1FJUVVnQnlBR1FRTjBJZ3BxSUFnZ0Ntb3BBeGczQXdBZ0JrRUJhaUVHREFFTEN3c2hBU0FNSkFBZ0FRdXhBUUVCZnlBQVFjZ0FFRjhpQlFSQUlBVkJBRFlDQUFKQUlBQWdCVUVJYWlJR0lBRWdBaUFESUFRUTdRTUVRQ0FGUVFRMkFnQU1BUXNnQUNBR0VMUUNJZ0pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFJUUR5QUFJQUZCTHhCbElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUJRb0NBZ0lCd1dnUkFJQUduSUFVMkFpQUxJQUVQQ3lBQUtBSVFJQVVRN0FNZ0FDZ0NFQ0lBUVJCcUlBVWdBQ2dDQkJFQUFBdENnSUNBZ09BQUM0Z0hBZ2wvQVh3akFFRkFhaUlHSkFBQ1FDQUFLQUlRSWdvb0FuZ2dCaUFCcHlJSUxRQW9JZ3RCQTNRaURHdExCRUFnQUJEcEFVS0FnSUNBNEFBaEFRd0JDeUFJTFFBcElRMGdCaUFLS0FLTUFTSUFOZ0lRSUFvZ0JrRVFhallDakFFZ0FBUi9JQUFvQWloQkJIRUZRUUFMSVFBZ0NDZ0NJQ0VISUFZZ0FUY0RHQ0FHSUFBMkFqZ2dCaUFETmdJMEFrQWdBeUFMVGdSQUlBUWhBQXdCQ3lBRFFRQWdBMEVBU2hzaERpQUdJQXhCRDJwQjhCOXhheUlBSkFBRFFDQUpJQTVHQkVBZ0F5RUVBMEFnQkNBTFJrVUVRQ0FBSUFSQkEzUnFRb0NBZ0lBd053TUFJQVJCQVdvaEJBd0JDd3NnQmlBTE5nSTBCU0FBSUFsQkEzUWlER29nQkNBTWFpa0RBRGNEQUNBSlFRRnFJUWtNQVFzTEN5QUdJQUEyQWlBZ0NDZ0NKQ0VFQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBME9EUXNDQUFFQUFRY0lBd1FGQmdrS0N5QUZRUUZ4RFFwQ2dJQ0FnREFoQWlBTlFRSkhEUW9NQ3dzZ0JVRUJjUTBBUW9DQWdJQXdJUUlnRFVFRFJnMEtDeUFISUFJZ0F5QUFJQWd1QVNvZ0JCRUZBQ0VCREFzTElBY2dBaUFFRVFnQUlRRU1DZ3NnQnlBQ0lBQXBBd0FnQkJFWUFDRUJEQWtMSUFjZ0FpQUlMZ0VxSUFRUkVBQWhBUXdJQ3lBSElBSWdBQ2tEQUNBSUxnRXFJQVFSTkFBaEFRd0hDeUFISUFaQkNHb2dBQ2tEQUJCQ0RRVWdCaXNEQ0NBRUVRc0FJZys5SWdFQ2Z5QVBtVVFBQUFBQUFBRGdRV01FUUNBUHFnd0JDMEdBZ0lDQWVBc2lBTGU5VVFSQUlBQ3RJUUVNQnd0Q2dJQ0FnTUIrSUFGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2hBUXdHQzBLQWdJQ0E0QUFoQVNBSElBWkJDR29nQUNrREFCQkNEUVVnQnlBR0lBQXBBd2dRUWcwRklBWXJBd2dnQmlzREFDQUVFU01BSWcrOUlnRUNmeUFQbVVRQUFBQUFBQURnUVdNRVFDQVBxZ3dCQzBHQWdJQ0FlQXNpQUxlOVVRUkFJQUN0SVFFTUJndENnSUNBZ01CK0lBRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNoQVF3RkN5QUhJQUlnQXlBQUlBWkJDR29nQ0M0QktpQUVFUklBSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQkNBR0tBSUlJZ0JCQWtZTkJDQUhJQUVnQUJEL0FpRUJEQVFMRUFFQUN5QUhJQUlnQXlBQUlBUVJBZ0FoQVF3Q0N5QUhRWndpUVFBUUZRdENnSUNBZ09BQUlRRUxJQW9nQmlnQ0VEWUNqQUVMSUFaQlFHc2tBQ0FCQzlVQkFRVi9Jd0FpQlNFSUFrQWdBVUtBZ0lDQWNGUU5BQ0FCcHlJR0x3RUdRUTlIRFFBZ0JpZ0NJQ0VIQ3lBQUlBSWdBeUFESUFjdEFBUWlBRWdFZjBFQUlRWWdBMEVBSUFOQkFFb2JJUWtnQlNBQVFRTjBRUTlxUWZBZmNXc2lCU1FBQTM4Z0JpQUpSZ1IvSUFNaEJBTi9JQUFnQkVZRWZ5QUZCU0FGSUFSQkEzUnFRb0NBZ0lBd053TUFJQVJCQVdvaEJBd0JDd3NGSUFVZ0JrRURkQ0lLYWlBRUlBcHFLUU1BTndNQUlBWkJBV29oQmd3QkN3c0ZJQVFMSUFjdkFRWWdCMEVJYWlBSEtBSUFFUklBSVFFZ0NDUUFJQUVMMHdvQ0QzOEJmaU1BUVRCcklnVWtBQUpBSUFBZ0FSQlpJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQUpBSUFBZ0FSQW9JaE5DZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRUYvSVFRTUFRc0NRQ0FBUVFFZ0U2Y2lEQ2dDQkVILy8vLy9CM0VpQmlBR1FRRk5HMEVDZEJBcElndEZCRUJCZnlFRURBRUxJQVZCQURZQ0VBTkFJQVlnQjB3TkFTQUxJQVJCQW5ScUlBd2dCVUVRYWhESkFUWUNBQ0FFUVFGcUlRUWdCU2dDRUNFSERBQUxBQXNnQUNBVEVBOExJQUFnQVJBUFFvQ0FnSURnQUNFQklBUkJBRWdOQUFKQUFrQWdBa1VOQUNBREtRTUFJaE5DZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFBa0FnQUNBRlFReHFJQk1RNVFFaUFnUkFBa0FnQWkwQUFFSE9BRWNOQUNBQ0xRQUJRY1lBUncwQUlBSkJBMEVDSUFJdEFBSkJ5d0JHSWdNYmFpMEFBQ0lHUWNNQWEwSC9BWEZCQVVzTkFDQUZLQUlNSUFKQkEyb2dBa0VDYWlBREd5QUNhMEVCYWtZTkFnc2dBQ0FDRUZRZ0FFR0MwZ0JCQUJCUUN5QUFRUkJxSVJBZ0N5RUdEQUlMSUFBZ0FoQlVJQVlnQTBFQmRHcEJ3d0JySVFnTElBQW9BaEFoQWlBRlFnQTNBeGdnQlVJQU53TVFJQVVnQWpZQ0pDQUZRVHMyQWlBZ0FDSU1RUkJxSVJCQmZ5RUFBa0FnQlVFUWFpQUVRUUowSWdJUXhnRUVRRUVBSVFZTUFRc0NRQ0FJUlFSQVFRQWhCeUFFUVFBZ0JFRUFTaHNoQXdOQUlBTWdCMFlOQWlBSFFRSjBJUVlnQjBFQmFpRUhJQVlnQzJvb0FnQkIvd0ZORFFBTEN5QUZRUkJxSUFzZ0JDQUlRUUYyRU93RVFRQWhCaUFGS0FJY0RRRWdCU2dDRkNJSFFRSjJJZ0JCQVdzaENrRUFJUUlnQlNnQ0VDRUdBMEFDUUNBQUlBSktCRUFnQmlBQ0lnUkJBblJxS0FJQUVLWUNSUTBCQTBBZ0JDQUtSZ1JBSUFBaEFnd0RDeUFHSUFSQkFXb2lBMEVDZEdvb0FnQWlEUkNtQWlJSkJFQURRQUpBSUFJZ0JFb05BQ0FHSUFSQkFuUnFJZzRvQWdBaUR4Q21BaUFKVEEwQUlBNGdEellDQkNBRVFRRnJJUVFNQVFzTElBUkJBblFnQm1vZ0RUWUNCQ0FESVFRTUFRVWdBeUVDREFNTEFBc0FDeUFJUVFGeElBZEJDRWx5RFFOQkFTQUFJQUJCQVUwYklRNUJBU0VJUVFFaEFBTkFJQWdnRGtZTkJDQUdJQWhCQW5ScUtBSUFJZ01RcGdJaEJ5QUFJUVFDUUFKQUEwQWdCRUVBVEEwQklBWWdCRUVCYXlJRVFRSjBhaUlQS0FJQUlnSVFwZ0lpQ2dSQUlBY2dDa29oQWtHQUFpRUhJQUlOQVF3Q0N3c0NRQ0FEUWVFaWEwRVVTeUFDUVlBaWEwRVNTM0pGQkVBZ0EwRWNiQ0FDUWN3RWJHcEJuSTJoQVdzaEJ3d0JDd0pBSUFKQmdOZ0NheUlFUWFQWEFFc05BQ0FFUWYvL0EzRkJISEFnQTBHbkkyc2lCRUViUzNJTkFDQUNJQVJxSVFjTUFRdEJzQWNoQkVFQUlRb0RRQ0FFSUFwSURRSWdCVUVvYWlBRUlBcHFRUUp0SWcxQkFYUkI4TkVEYWk4QkFDSUhRUVoySWhGQkFuUkJrT0lDYWlnQ0FDSUpRUTUySWhJZ0IwRS9jV29pQnlBUklCSWdDVUVIZGtIL0FIRWdDVUVCZGtFL2NSRHJCQm9nQXlBRktBSXNheUFDSUFVb0FpZ2lDV3NnQWlBSlJoc2lDVUVBU0FSQUlBMUJBV3NoQkF3QkN5QUpCRUFnRFVFQmFpRUtEQUVMQ3lBSFJRMEJDeUFQSUFjMkFnQU1BUXNnQmlBQVFRSjBhaUFETmdJQUlBQkJBV29oQUFzZ0NFRUJhaUVJREFBTEFBc2dBa0VCYWlFQ0RBQUxBQXNnQlNnQ0VDSUdJQXNnQWhBZkdpQUVJUUFMSUF3b0FoQWlBa0VRYWlBTElBSW9BZ1FSQUFBZ0FFRUFTQTBCSUF3Z0JVRVFhaUFBRUQwTkFFRUFJUVFDUUFOQUlBQWdCRVlOQVNBRVFRSjBJUUlnQkVFQmFpRUVJQVZCRUdvZ0FpQUdhaWdDQUJDNUFVVU5BQXNnQlNnQ0VDZ0NFQ0lBUVJCcUlBVW9BaFFnQUNnQ0JCRUFBQXdCQ3lBRlFSQnFFRFloQVFzZ0VDZ0NBQ0lBUVJCcUlBWWdBQ2dDQkJFQUFBc2dCVUV3YWlRQUlBRUw3QWNDQzM0RWZ5TUFRVEJySWc4a0FBSkFJQUZDLy8vLy8yOVlCRUFnQUJBa1FvQ0FnSURnQUNFQkRBRUxRb0NBZ0lBd0lRWUNRQUpBSUFBZ0F5a0RBQkFvSWd0Q2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0FNQ0VIUW9DQWdJQXdJUUZDZ0lDQWdEQWhDVUtBZ0lDQU1DRU1EQUVMSUFBZ0FTQUFLUU5JRU9NQklneENnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFS0FnSUNBTUNFSFFvQ0FnSUF3SVFGQ2dJQ0FnREFoQ1F3QkN3SkFBa0FnQUNBQUlBRkI3UUFnQVVFQUVCUVFOeUlKUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQ2FjaUFrSDFBRUVBRU1jQklSSWdBa0g1QUVFQUVNY0JRUUJJQkVBZ0FFSE1uZ0VnQ1VIc0h4QytBU0lKUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVMSUE4Z0NUY0RLQ0FQSUFFM0F5QWdBQ0FNUVFJZ0QwRWdhaENuQVNJSFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FCQStJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRUtBZ0lDQTRBQWhBUXdEQzBGL0lRSUNRQ0FES1FNSUlnUkNnSUNBZ0hDRFFvQ0FnSUF3VVEwQUlBQWdEMEVjYWlBRUVIZEJBRWdOQXlBUEtBSWNJZ0lOQUF3RUN3SitJQXVuSWhBcEFnUWlCS2RCLy8vLy93ZHhJaEVFUUNBU1FYOXpRUjkySVJJZ0JFTC8vLy8vQjRNaERTQUNyU0VPUVFBaEFnTkFJQUt0SVFRZ0FpRURBMEFnQXlBUlR3UkFJQUFnRUNBQ0lCRWdBaUFSU1JzZ0VSQ0VBUXdFQ3lBQUlBZEIxUUFnQTYwaUNoQkZRUUJJRFFZZ0FDQUdFQThDUUNBQUlBY2dDeERJQVNJR1FvQ0FnSUJ3Z3lJRlFvQ0FnSUFnVWdSQUlBVkNnSUNBZ09BQVVRMElJQUFnRDBFUWFpQUFJQWRCMVFBZ0IwRUFFQlFRb3dFTkNDQVBJQThwQXhBaUJTQU5JQVVnRFZNYklnVTNBeEFnQkNBRlVnMEJDeUFRSUFvZ0VoRHhBcWNoQXd3QkN3c2dBQ0FRSUFJZ0F4Q0VBU0lFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUVVnQUNBQklBZ2dCQkJxUVFCSURRVWdDRUlCZkNJRUlBNVJEUVlnQUNBUFFRaHFJQVlRUEEwRklBV25JUUpDQVNFRklBaENBU0FQS1FNSUlnb2dDa0lCVnh0OElRZ0RRQ0FFSUFoUkJFQWdCQ0VJREFJTElBQWdBQ0FHSUFVUWN4QTNJZ3BDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CaUFBSUFFZ0JDQUtFR3BCQUVnTkJpQUZRZ0Y4SVFVZ0JFSUJmQ0lFSUE1U0RRQUxDd3dGQ3lBQUlBY2dDeERJQVNJR1FvQ0FnSUJ3Z3lJRVFvQ0FnSURnQUZFTkF5QUVRb0NBZ0lBZ1VnMEVJQUFnRUVFQVFRQVFoQUVMSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQWlBQUlBRWdDQ0FFRUdwQkFFNE5Bd3dDQzBLQWdJQ0FNQ0VIQzBLQWdJQ0FNQ0VCQ3lBQUlBRVFEMEtBZ0lDQTRBQWhBUXNnQUNBTEVBOGdBQ0FNRUE4Z0FDQUhFQThnQUNBSkVBOGdBQ0FHRUE4TElBOUJNR29rQUNBQkMrQUNBUVorSUFGQy8vLy8vMjlZQkVBZ0FCQWtRb0NBZ0lEZ0FBOExRb0NBZ0lEZ0FDRUlRb0NBZ0lBd0lRWUNRQUpBQWtBZ0FDQURLUU1BRUNnaUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQVFvQ0FnSUF3SVFRTUFRc2dBQ0FCUWRVQUlBRkJBQkFVSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBUkNBQkJTUlFSQUlBQWdBVUhWQUVJQUVFVkJBRWdOQVFzZ0FDQUJJQWNReUFFaUJVS0FnSUNBY0lNaUNVS0FnSUNBNEFCUkRRRWdBQ0FCUWRVQUlBRkJBQkFVSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVFKQUlBQWdCaUFFRUZJRVFDQUFJQVFRRHd3QkN5QUFJQUZCMVFBZ0JCQkZRUUJPRFFCQ2dJQ0FnREFoQkF3Q0N5QUFJQWNRRHlBQUlBWVFEMEwvLy8vL0R5RUlJQWxDZ0lDQWdDQlJEUUlnQUNBRlFkY0FJQVZCQUJBVUlRRWdBQ0FGRUE4Z0FROExRb0NBZ0lBd0lRVUxJQUFnQlJBUElBQWdCeEFQSUFBZ0JoQVBJQUFnQkJBUEN5QUlDODBFQWdaK0FYOGpBRUVnYXlJQ0pBQUNRQ0FCUXYvLy8vOXZXQVJBSUFBUUpFS0FnSUNBNEFBaEJ3d0JDMEtBZ0lDQTRBQWhCMEtBZ0lDQU1DRUlBa0FnQUNBREtRTUFFQ2dpQ1VLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBUW9DQWdJQXdJUVJDZ0lDQWdEQWhCVUtBZ0lDQU1DRUdEQUVMQWtBQ1FDQUFJQUVnQUNrRFNCRGpBU0lHUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJDZ0lDQWdEQWhCQXdCQ3lBQUlBQWdBVUh0QUNBQlFRQVFGQkEzSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRklOQVF0Q2dJQ0FnREFoQlF3QkN5QUNJQVEzQXhnZ0FpQUJOd01RSUFBZ0JrRUNJQUpCRUdvUXB3RWlCVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFJQUFnQWtFSWFpQUFJQUZCMVFBZ0FVRUFFQlFRb3dFTkFDQUFJQVZCMVFBQ2ZpQUNLUU1JSWdGQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFGQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBQnViMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVJVRUFTQTBBUW9DQWdJRGdBQ0VJSUFCQkxoQjJJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBUVNBUUtTSURSUVJBSUFFaENBd0JDeUFESUFrM0F3Z2dBeUFGTndNQUlBTWdCS2NpQ2tIbkFFRUFFTWNCUVg5elFSOTJOZ0lRSUFwQjlRQkJBQkRIQVNFS0lBTkJBRFlDR0NBRElBcEJmM05CSDNZMkFoUWdBVUtBZ0lDQWNGb0VRQ0FCcHlBRE5nSWdDeUFBSUFZUUR5QUFJQVFRRHlBQklRY01BUXNnQUNBSkVBOGdBQ0FHRUE4Z0FDQUVFQThnQUNBRkVBOGdBQ0FJRUE4TElBSkJJR29rQUNBSEM3NEVBZ2QrQW44akFFRVFheUlDSkFBQ1FDQUJRdi8vLy85dldBUkFJQUFRSkVLQWdJQ0E0QUFoQmd3QkMwS0FnSUNBNEFBaEJrS0FnSUNBTUNFRkFrQWdBQUorQWtBZ0FDQURLUU1BRUNnaUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdBQ0FCUWU0QUlBRkJBQkFVRUNZaUEwRUFTQTBBSUFORkJFQWdBQ0FCSUFjUXlBRWhCZ3dEQ3lBQUlBQWdBVUh2QUNBQlFRQVFGQkFtSWd0QkFFZ05BQ0FBSUFGQjFRQkNBQkJGUVFCSURRQkNnSUNBZ09BQUlBQVFQaUlJUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVhSUFlbklRd0NRQU5BSUFBZ0JSQVBJQUFnQVNBSEVNZ0JJZ1ZDZ0lDQWdIQ0RJZ1JDZ0lDQWdDQlJEUUVDUUNBRVFvQ0FnSURnQUZFTkFBSi9JQUFnQUNBRlFnQVFUUkEzSWdSQ2dJQ0FnSENESWdwQ2dJQ0FnSkIvVWdSQVFRQWdDa0tBZ0lDQTRBQlNEUUVhREFJTElBU25LQUlFUWYvLy8vOEhjVVVMSVFNZ0FDQUlJQWtnQkJDR0FVRUFTQTBBSUFsQ0FYd2hDU0FEUlEwQklBQWdBa0VJYWlBQUlBRkIxUUFnQVVFQUVCUVFvd0ZCQUVnTkFDQUFJQUZCMVFBQ2ZpQU1JQUlwQXdnZ0N4RHhBaUlFUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FFUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQkxtOUlnUkNnSUNBZ01DQmdQei9BSDBnQkVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUVWQkFFNE5BUXNMSUFnTUFnc2dDYWNFUUNBSUlRWU1Bd3NnQUNBSUVBOUNnSUNBZ0NBaEJnd0NDMEtBZ0lDQU1Bc1FEd3NnQUNBRkVBOGdBQ0FIRUE4TElBSkJFR29rQUNBR0M0MFZBZ3AvRFg0akFFR1FBV3NpQkNRQUFrQWdBVUwvLy8vL2IxZ0VRQ0FBRUNSQ2dJQ0FnT0FBSVJBTUFRc2dBeWtEQ0NFWklBQWdCRUU0YWtFQUVEMGFJQVJCQURZQ01DQUVRb0NBZ0lEQUFEY0RLQ0FFSUFBMkFnQWdCQ0FFUVFocUlnbzJBZ1JDZ0lDQWdPQUFJUkJDZ0lDQWdEQWhFUUpBQWtBZ0FDQURLUU1BRUNnaUZFS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQVFvQ0FnSUF3SVJOQ2dJQ0FnREFoQVVLQWdJQ0FNQ0VQUW9DQWdJQXdJUmNNQVF0Q2dJQ0FnREFoRndKQUlBQWdHUkE0SWdoRkJFQWdBQ0FaRUNnaUYwS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQURBSUxJQmVuSVFVTElBQWdBQ0FCUWU0QUlBRkJBQkFVRUNZaURFRUFTQTBBSUF3RVFDQUFJQUFnQVVIdkFDQUJRUUFRRkJBbUlnMUJBRWdOQVNBQUlBRkIxUUJDQUJCRlFRQklEUUVMSUJTbklRbENnSUNBZ0RBaER3SkFBa0FDUUFKQUlBVkZEUUFnREVVTkFDQUZLUUlFUXYvLy8vOEhnMElBVWcwQUFrQWdBQ0FCUVR3Z0FVRUFFQlFpRGtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0RpQUFLUU5JRUZJaEFpQUFJQTRRRHlBQ1JRMEJJQUFnQVVHR0FTQUJRUUFRRkNJT1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0RrSFZBRUVBRUlVRUlRSWdBQ0FPRUE4Z0FrVU5BUXNnQUNBQkVQQUNJZ0pGRFFOQkFDRURJQUFnQkVIUUFHcEJBQkE5R2lBQUlCUVFLQ0lTUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlDUUNBQ0tBSUVJZ2N0QUJBaUJrRWhjU0lLUlFSQUlBUkNBRGNEZ0FFTUFRc2dBQ0FCUWRVQUlBRkJBQkFVSWc1Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQUlBUkJnQUZxSUE0UW93RU5Bd3RCQUNFSUFrQWdCeTBBRVNJQ1JRMEFJQUFnQWtFRGRCQXBJZ01OQUVFQUlRTU1Bd3NnQjBFUWFpRU1JQVpCRUhFaERTQUdRUUZ4SVFjZ0VxY2lDMEVRYWlFRklBc3BBZ1FpRDZkQkgzWWhDU0FFS1FPQUFTRVJBMEFnRVNBUFF2Ly8vLzhIZzFVTkFnSkFJQU1nRENBRklCR25JQStuUWYvLy8vOEhjU0FKSUFBUThBUWlBa0VCUndSQUlBSkJBRWdOQVNBS1JTQUNRUUpIY1EwRUlBQWdBVUhWQUVJQUVFVkJBRWdOQlF3RUN5QURLQUlBSVFZZ0JDQURLQUlFSUFWcklBbDFJZ0kyQW93QklBWWdCV3NnQ1hVaUJpQUlTZ1JBSUFSQjBBQnFJQXNnQ0NBR0VGRU5CUXNnQjBVRVFDQUFJQUZCMVFBZ0FpSUlyUkJGUVFCT0RRUU1CUXNnQWlFSUFrQWdBaUFHUncwQUFrQUNRQ0FOUlEwQUlBWWdDeWtDQkNJT3AwSC8vLy8vQjNGUERRQWdEa0tBZ0lDQUNJTkNBRklOQVFzZ0JDQUdRUUZxSWdnMkFvd0JEQUVMSUFzZ0JFR01BV29ReVFFYUlBUW9Bb3dCSVFnTElBc3BBZ1FoRHlBSXJDRVJJQUloQ0F3QkN3c2dBRUdMeXdCQkFCQkdEQUlMQWtBQ1FBSkFBMEFDUUNBQUlBRWdGQkRJQVNJU1FvQ0FnSUJ3Z3lJT1FvQ0FnSUFnVWdSQUlBNUNnSUNBZ09BQVVRUkFJQTRoRUF3RkN5QUVLQUl3RFFRQ1FDQUVLQUlvSWdNZ0JDZ0NMRWdFUUNBRUtBSUVJUVVNQVFzZ0F5QURRUUYxYWtFZmFrRnZjU0lEUVFOMElRY2dCQ2dDQUNFR0FrQUNRQ0FLSUFRb0FnUWlBa1lFUUNBR1FRQWdCeUFFUWRBQWFoQ29BU0lGUlEwQklBVWdDaWtEQURjREFDQUZJQW9wQXhnM0F4Z2dCU0FLS1FNUU53TVFJQVVnQ2lrRENEY0RDQXdDQ3lBR0lBSWdCeUFFUWRBQWFoQ29BU0lGRFFFTElBUVE3Z1FnQkNnQ0FDQVNFQThnQkVGL05nSXdEQVlMSUFRZ0JUWUNCQ0FFSUFRb0FsQkJBM1lnQTJvMkFpd2dCQ2dDS0NFREN5QUVJQU5CQVdvMkFpZ2dCU0FEUVFOMGFpQVNOd01BSUF3TkFVS0FnSUNBTUNFUEN5QVVRaUNJcDBGMVNTRURRUUFoQjBFQUlRVkNnSUNBZ0RBaEUwS0FnSUNBTUNFQkEwQWdCQ2dDS0NBRlNnUkFJQUFnQkVHTUFXb2dCQ2dDQkNBRlFRTjBhaWtEQUNJV0VOWUJRUUJJRFFRZ0FDQVBFQThnQUNBQUlCWkNBQkJORURjaUQwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwTElBQWdCRUdBQVdvZ0FDQVdRZGNBSUJaQkFCQVVFS01CRFFzQ1FDQUVLUU9BQVNJU0lBa3BBZ1JDLy8vLy93ZURJaEJWQkVBZ0JDQVFOd09BQVNBUUlSSU1BUXNnRWtJQVdRMEFRZ0FoRWlBRVFnQTNBNEFCQ3lBQUlBRVFEMEtBZ0lDQTRBQWhFQ0FBRUQ0aUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQVFvQ0FnSURnQUNFQkRBd0xJQTlDSUlpblFYVlBCRUFnRDZjaUFpQUNLQUlBUVFGcU5nSUFDeUFBSUFGQ0FDQVBRWWVBQVJDOUFVRUFTQTBMUVFFZ0JDZ0NqQUVpQWlBQ1FRRk5HeUlHclNFYVFnRWhHQU5BSUJnZ0dsSUVRQ0FBSUJZZ0dCQnpJaFZDZ0lDQWdIQ0RJZzVDZ0lDQWdEQlNCRUFnRGtLQWdJQ0E0QUJSQkVBZ0RpRVFEQThMSUFBZ0ZSQTNJaFZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5Cd3NnQUNBQklCZ2dGUkJxSVFJZ0dFSUJmQ0VZSUFKQkFFNE5BUXdOQ3dzZ0FDQVJFQThnQUNBV1FZY0JJQlpCQUJBVUloRkNnSUNBZ0hDRElnNUNnSUNBZ09BQVVRMExBa0FnQ0FSQUlBQWdBU0FhSUJKQy8vLy8vdytERUdwQkFFZ05EU0FEUlFSQUlBa2dDU2dDQUVFQmFqWUNBQXNnQUNBQklBWkJBV3F0SUJRUWFrRUFTQTBOSUE1Q2dJQ0FnREJTQkVBZ0VVSWdpS2RCZFU4RVFDQVJweUlDSUFJb0FnQkJBV28yQWdBTElBQWdBU0FHUVFKcXJTQVJFR3BCQUVnTkRnc2dCQ0FCTndOWUlBUkNnSUNBZ0RBM0ExQWdBQ0FURUE4Z0FDQUFJQmtnQkNBRVFkQUFha0VBRUowREVEY2hFd3dCQzBLQWdJQ0FNQ0VWSUE1Q2dJQ0FnREJTQkVBZ0FDQVJFQ1VpRlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBOQ3lBRUlCYzNBM2dnQkNBVk53TndJQVFnQVRjRGFDQUVJQlEzQTFnZ0JDQVBOd05RSUFRZ0VrTC8vLy8vRDRNM0EyQWdBQ0FURUE4Z0FDQUVRZEFBYWhEdEJDRVRJQUFnRlJBUEN5QVRRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRc2dCNndnRWxjRVFDQUVRVGhxSWdJZ0NTQUhJQktuRUZFYUlBSWdFeENIQVJvZ0Q2Y3BBZ1JDLy8vLy93ZURJQko4cHlFSEN5QUZRUUZxSVFVTUFRc0xJQVJCT0dvaUFpQUpJQWNnQ1NnQ0JFSC8vLy8vQjNFUVVSb2dBaEEySVJBTUNnc2dBQ0FQRUE5Q2dJQ0FnREFoRXdKQUFuOENRQ0FBSUFBZ0VrSUFFRTBRTnlJUFFvQ0FnSUJ3Z3lJT1FvQ0FnSUNRZjFJRVFDQU9Rb0NBZ0lEZ0FGSU5BU0FPSVJBTUF3c2dENmNvQWdSQi8vLy8vd2R4RFFBZ0FDQUVRZEFBYWlBQUlBRkIxUUFnQVVFQUVCUVFvd0ZCQUVnTkFpQUFJQUZCMVFBQ2ZpQUpJQVFwQTFBZ0RSRHhBaUlPUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FPUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnRHJtOUlnNUNnSUNBZ01DQmdQei9BSDBnRGtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUVVaUFrRUFUZzBBSUFKQkhuWkJBbkVNQVF0QkFBdEZEUUVMQ3d3Q0N3d0dDMEtBZ0lDQU1DRVRDMEtBZ0lDQU1DRUJEQVFMSUFSQjBBQnFJQXNnQ0NBTEtBSUVRZi8vLy84SGNSQlJEUUFnQUNBU0VBOGdBQ2dDRUNJQ1FSQnFJQU1nQWlnQ0JCRUFBQ0FFUWRBQWFoQTJJUkFNQVFzZ0FDQVNFQThnQUNnQ0VDSUNRUkJxSUFNZ0FpZ0NCQkVBQUNBRUtBSlFLQUlRSWdKQkVHb2dCQ2dDVkNBQ0tBSUVFUUFBQzBLQWdJQ0FNQ0VSQzBLQWdJQ0FNQ0VUUW9DQWdJQXdJUUZDZ0lDQWdEQWhEd3NnQkNnQ09DZ0NFQ0lDUVJCcUlBUW9BandnQWlnQ0JCRUFBQXNnQkJEdUJDQUFJQmNRRHlBQUlBOFFEeUFBSUFFUUR5QUFJQk1RRHlBQUlCRVFEeUFBSUJRUUR3c2dCRUdRQVdva0FDQVFDNklCQUNNQVFTQnJJZ0lrQUFKK0FrQWdBVUwvLy8vL2IxZ0VRQ0FBRUNRTUFRc2dBQ0FDUVFocUlnTkJBQkE5R2lBRFFTOFFPeG9DUUNBRElBQWdBVUhzQUNBQlFRQVFGQkIvRFFBZ0FrRUlhaUlEUVM4UU94b2dBeUFBSUFGQjdRQWdBVUVBRUJRUWZ3MEFJQUpCQ0dvUU5nd0NDeUFDS0FJSUtBSVFJZ0JCRUdvZ0FpZ0NEQ0FBS0FJRUVRQUFDMEtBZ0lDQTRBQUxJUUVnQWtFZ2FpUUFJQUVMVGdFQ2ZrS0FnSUNBNEFBaEJDQUFJQUVnQXlrREFCRElBU0lCUW9DQWdJQndneUlGUW9DQWdJRGdBRklFZmlBQUlBRVFEeUFGUW9DQWdJQWdVcTFDZ0lDQWdCQ0VCVUtBZ0lDQTRBQUxDL2dDQWdOK0FYOENRQUpBSUFBZ0FSRHdBaUlDUlEwQUlBTXBBd2doQmdKQUFrQUNRQ0FES1FNQUlnUkNnSUNBZ0hCVURRQWdCS2NpQXk4QkJrRVNSdzBBSUFaQ2dJQ0FnSENEUW9DQWdJQXdVZ1JBSUFCQm52a0FRUUFRRlVLQWdJQ0E0QUFQQ3lBREtBSWdJZ2NnQnlnQ0FFRUJhallDQUNBREtBSWtJZ01nQXlnQ0FFRUJhallDQUNBSHJVS0FnSUNBa0grRUlRUWdBNjFDZ0lDQWdKQi9oQ0VGREFFTFFvQ0FnSUF3SVFVQ2ZpQUVRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFRUzhRTFF3QkN5QUFJQVFRS0FzaUJFS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBQWdCQ0FHRUpnRUlnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFRc2dBQ0FDTlFJQVFvQ0FnSUNRZjRRUUR5QUFJQUkxQWdSQ2dJQ0FnSkIvaEJBUElBSWdCVDRDQkNBQ0lBUStBZ0FnQUNBQlFkVUFRZ0FRUlVFQVNBMEJJQUZDSUlpblFYVkpEUUlnQWFjaUFDQUFLQUlBUVFGcU5nSUFEQUlMSUFBZ0JCQVBJQUFnQlJBUEMwS0FnSUNBNEFBUEN5QUJDMm9CQVg4Z0FVTC8vLy8vYjFnRVFDQUFFQ1JDZ0lDQWdPQUFEd3NDZmlBQnB5SURMd0VHUVJKSEJFQkNnSUNBZ0RBZ0FDQUJJQUFvQWlncEE1QUJFRklOQVJvZ0FFRVNFSVlEUW9DQWdJRGdBQThMSUFNb0FpUXRBQkFnQW5GQkFFZXRRb0NBZ0lBUWhBc0x2UVFCQ1g4akFFRWdheUlISkFBQ1FBSkFBa0FDUUFKQUlBRkMvLy8vLzI5WUJFQWdBQkFrREFFTElBQWdBU0FBS0FJb0tRT1FBUkJTRFFJZ0FDQUJFUEFDSWdJTkFRdENnSUNBZ09BQUlRRU1Bd3NnQWlnQ0FDSUlLQUlFSWdKQi8vLy8vd2R4SWdNTkFRc2dBRUgra3dFUVlpRUJEQUVMSUFBZ0IwRUlhaUFESUFKQkgzWVFpZ01hSUFoQkVHb2hCaUFJS0FJRVFmLy8vLzhIY1NFSlFRQWhBQU5BQWtBQ1FDQUFJQWxJQkVBZ0FFRUJhaUVDUVg4aEJRSkFBbjhDUUFKQUFrQUNRQUpBQWtBQ1FBSi9JQWdwQWdSQ2dJQ0FnQWlESWdGUUlncEZCRUFnQmlBQVFRRjBhaThCQUF3QkN5QUFJQVpxTFFBQUN5SURRZHNBYXc0REF3RUNBQXNnQWlFQUFrQWdBMEVLYXc0RUJBc0xCUUFMSUFOQkwwY05CeUFFUlEwRlFRRWhCRUV2SVFNTUJ3dEIzQUFoQXlBQ0lBbE9EUVlnQUVFQ2FpRUFJQXBGQkVBZ0JpQUNRUUYwYWk4QkFDRUZEQW9MSUFJZ0Jtb3RBQUFoQlF3SkMwRUFJUVJCM1FBaEF3d0ZDMEhiQUNFRElBUWdBaUFKVG5JTkJpQUFRUUpxSVFBZ0FWQUVRRUhkQUVGL0lBSWdCbW90QUFCQjNRQkdJZ1FiSVFVZ0FDQUNJQVFiSVFCQkFTRUVEQWdMUVFFaEJFSGRBRUYvSUFZZ0FrRUJkR292QVFCQjNRQkdJZ29iSVFVZ0FDQUNJQW9iSVFBTUJ3dEI3Z0FNQWd0QjhnQU1BUXRCQUNFRVFTOExJUVZCM0FBaEF3c2dBaUVBREFJTElBZEJDR29RTmlFQkRBTUxJQUloQUVFQklRUUxJQWRCQ0dvZ0F4Q0xBUm9nQlVFQVNBMEFJQWRCQ0dvZ0JSQ0xBUm9NQUFzQUN5QUhRU0JxSkFBZ0FRdldBZ0lEZndGK0l3QkJFR3NpQkNRQUFrQWdBVUwvLy8vL2IxZ0VRQ0FBRUNSQ2dJQ0FnT0FBSVFVTUFRdENnSUNBZ09BQUlRVWdBQ0FBSUFGQjdnQWdBVUVBRUJRUUppSUNRUUJJRFFBZ0FnUi9JQVJCNXdBNkFBZ2dCRUVKYWdVZ0JFRUlhZ3NoQWlBQUlBQWdBVUhyNHdBUXNnRVFKaUlEUVFCSURRQWdBd1JBSUFKQjZRQTZBQUFnQWtFQmFpRUNDeUFBSUFBZ0FVR0w1UUFRc2dFUUppSURRUUJJRFFBZ0F3UkFJQUpCN1FBNkFBQWdBa0VCYWlFQ0N5QUFJQUFnQVVIMDFBQVFzZ0VRSmlJRFFRQklEUUFnQXdSQUlBSkI4d0E2QUFBZ0FrRUJhaUVDQ3lBQUlBQWdBVUh2QUNBQlFRQVFGQkFtSWdOQkFFZ05BQ0FEQkVBZ0FrSDFBRG9BQUNBQ1FRRnFJUUlMSUFBZ0FDQUJRZnNkRUxJQkVDWWlBMEVBU0EwQUlBQWdCRUVJYWlJQUlBTUVmeUFDUWZrQU9nQUFJQUpCQVdvRklBSUxJQUJyRUpNQ0lRVUxJQVJCRUdva0FDQUZDNlVEQVFSK0l3QkJFR3NpQXlRQUlBUUNmd0pBQWtBQ1FBSkFJQUFnQVVFdUVFc2lBa1VFUUVLQWdJQ0FNQ0VCREFFTElBSW9BaGdFUUVLQWdJQ0FNQ0VCUVFFTUJRc2dBQ0FDS1FNQUlnZ2dBaWtEQ0NJR0VNZ0JJZ0ZDZ0lDQWdIQ0RJZ2RDZ0lDQWdPQUFVZzBCQzBLQWdJQ0FNQ0VIREFFTElBZENnSUNBZ0NCUkJFQWdBa0VCTmdJWVFvQ0FnSUF3SVFGQkFRd0RDeUFDS0FJUUJFQWdBQ0FBSUFGQ0FCQk5FRGNpQjBLQWdJQ0FjSU1pQ1VLQWdJQ0E0QUJSRFFFQ1FDQUpRb0NBZ0lDUWYxSU5BQ0FIcHlnQ0JFSC8vLy8vQjNFTkFDQUFJQU5CQ0dvZ0FDQUlRZFVBSUFoQkFCQVVFS01CUVFCSURRSWdBQ0FJUWRVQUFuNGdCcWNnQXlrRENDQUNLQUlVRVBFQ0lnWkNnSUNBZ0FoOFF2Ly8vLzhQV0FSQUlBWkMvLy8vL3crRERBRUxRb0NBZ0lEQWZpQUd1YjBpQmtLQWdJQ0F3SUdBL1A4QWZTQUdRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c1FSVUVBU0EwQ0N5QUFJQWNRRHd3Q0N5QUNRUUUyQWhnTUFRc2dBQ0FCRUE4Z0FDQUhFQTlDZ0lDQWdPQUFJUUVMUVFBTE5nSUFJQU5CRUdva0FDQUJDdzRBSUFBUXRRSkNnSUNBZ09BQUN3a0FRb0NBZ0lEQWZnc1dBQ0FBSUFNcEF3QWdBeWtEQ0NBREtRTVFFSlFFQzlFQkFnTitBbjhqQUVFUWF5SUhKQUFDUUNBQUlBZEJER29nQXlrREFCRGxBU0lJUlFSQVFvQ0FnSURnQUNFRURBRUxJQUFnQ0NBSEtBSU1RZEtJQVJEMUJTRUJJQUFnQ0JCVUFrQWdBa0VDU0NBQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSY2cwQUlBQWdBeWtEQ0NJR0VEaEZEUUJDZ0lDQWdPQUFJUVFDUUNBQUVEUWlCVUtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQUVoQlF3QkN5QUFJQVZCTHlBQlFRY1FHVUVBU0EwQUlBQWdCVUV2SUFZUStRUWhCQXNnQUNBRkVBOE1BUXNnQVNFRUN5QUhRUkJxSkFBZ0JBc05BQ0FBSUFFZ0FrRXdFUDBGQ3dzQUlBQWdBVUV3RVA0RkM3UURBZ04vQW40akFFSFFBR3NpQmlRQVFYOGhCd0pBSUFBZ0JrSElBR29nQVVIQ0FCQ0JBU0lJUlEwQUlBWXBBMGdpQVVLQWdJQ0FjSU5DZ0lDQWdEQlJCRUFnQ0NrREFDRUJJQU5DSUlpblFYVlBCRUFnQTZjaUJ5QUhLQUlBUVFGcU5nSUFDeUFBSUFFZ0FpQURJQVFnQlJDR0JDRUhEQUVMSUFBZ0FoQmNJZ2xDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FBSUFFUUR3d0JDeUFJS1FNQUlRb2dCaUFFTndNNElBWWdBemNETUNBR0lBazNBeWdnQmlBS053TWdJQUFnQVNBSUtRTUlRUVFnQmtFZ2FoQXZJUUVnQUNBSkVBOGdBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEFBa0FDUUNBQUlBRVFKaUlIQkVBZ0FDQUdJQWdvQWdBZ0FoQk1JZ0pCQUVnTkFTQUNSUTBEQWtBZ0JpZ0NBQ0lDUVJOeFJRUkFJQUFnQmlrRENDQURFRkpGRFFFTUJBc2dBa0VSY1VFUVJ3MERJQVkxQWh4Q0lJWkNnSUNBZ0RCU0RRTUxJQUFnQmhCSUlBQkJ5eTVCQUJBVkRBRUxJQVZCZ0lBQmNVVUVRRUVBSVFjZ0JVR0FnQUp4UlEwRElBQW9BaEFvQW93QklnSkZEUU1nQWkwQUtFRUJjVVVOQXdzZ0FFSGtHa0VBRUJVTFFYOGhCd3dCQ3lBQUlBWVFTQXNnQmtIUUFHb2tBQ0FIQzlRQ0FnSi9BbjRqQUVGQWFpSUVKQUFDUUFKQUlBQWdCRUU0YWlBQlFjRUFFSUVCSWdWRkRRQWdCQ2tET0NJQlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBQUlBVXBBd0FnQWlBRFFRQVFGQ0VCREFJTElBQWdBaEJjSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUlBRVFEd3dCQ3lBRktRTUFJUWNnQkNBRE53TXdJQVFnQmpjREtDQUVJQWMzQXlBZ0FDQUJJQVVwQXdoQkF5QUVRU0JxRUM4aEFTQUFJQVlRRHlBQlFvQ0FnSUJ3Z3lJRFFvQ0FnSURnQUZFTkFDQUFJQVFnQlNnQ0FDQUNFRXdpQWtFQVNBMEFJQUpGRFFFQ1FBSkFJQVFvQWdBaUFrRVRjVVVFUUNBQUlBUXBBd2dnQVJCU1JRMEJEQUlMSUFKQkVYRkJFRWNOQVNBRFFvQ0FnSUF3VVNBRU5RSVVRaUNHUW9DQWdJQXdVbklOQVFzZ0FDQUVFRWdnQUNBQkVBOGdBRUdpTDBFQUVCVU1BUXNnQUNBRUVFZ01BUXRDZ0lDQWdPQUFJUUVMSUFSQlFHc2tBQ0FCQzVrQ0FnTi9BbjRqQUVGQWFpSURKQUJCZnlFRUFrQWdBQ0FEUVRocUlBRkI0d0FRZ1FFaUJVVU5BQ0FES1FNNElnRkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQWdCU2tEQUNBQ0VIRWhCQXdCQ3lBQUlBSVFYQ0lHUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQUNBQkVBOE1BUXNnQlNrREFDRUhJQU1nQmpjREtDQURJQWMzQXlBZ0FDQUJJQVVwQXdoQkFpQURRU0JxRUM4aEFTQUFJQVlRRHlBQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUJFQ1lpQkEwQUFrQWdBQ0FESUFVb0FnQWlCQ0FDRUV3aUFrRUFUZ1JBSUFKRkRRRWdBeWdDQUNFQ0lBQWdBeEJJSUFKQkFYRUVRQ0FFTFFBRlFRRnhEUUlMSUFCQm96eEJBQkFWQzBGL0lRUU1BUXRCQUNFRUN5QURRVUJySkFBZ0JBdWVCZ0lIZndOK0l3QkJRR29pQnlRQVFYOGhDQUpBSUFBZ0IwRTRhaUFCUWVVQUVJRUJJZ2xGRFFBZ0J5a0RPQ0lPUW9DQWdJQndnMEtBZ0lDQU1GRUVRQ0FBSUFrcEF3QWdBaUFESUFRZ0JTQUdFRzBoQ0F3QkN5QUFJQUlRWENJUFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTQkVBZ0FCQTBJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSUVRQ0FHUVlBUWNTSU5CRUFnQkVJZ2lLZEJkVThFUUNBRXB5SUtJQW9vQWdCQkFXbzJBZ0FMSUFBZ0FVSEJBQ0FFUVFjUUdSb0xJQVpCZ0NCeElnb0VRQ0FGUWlDSXAwRjFUd1JBSUFXbklnc2dDeWdDQUVFQmFqWUNBQXNnQUNBQlFjSUFJQVZCQnhBWkdnc2dCa0dBd0FCeElnc0VRQ0FEUWlDSXAwRjFUd1JBSUFPbklnd2dEQ2dDQUVFQmFqWUNBQXNnQUNBQlFjQUFJQU5CQnhBWkdnc2dCa0dBQkhFaURBUkFJQUFnQVVFK0lBWkJBWFpCQVhHdFFvQ0FnSUFRaEVFSEVCa2FDeUFHUVlBSWNRUkFJQUFnQVVFL0lBWkJBblpCQVhHdFFvQ0FnSUFRaEVFSEVCa2FDeUFHUVlBQ2NRUkFJQUFnQVVFOUlBWkJBWEd0UW9DQWdJQVFoRUVIRUJrYUN5QUpLUU1BSVJBZ0J5QUJOd013SUFjZ0R6Y0RLQ0FISUJBM0F5QWdBQ0FPSUFrcEF3aEJBeUFIUVNCcUVDOGhEaUFBSUE4UUR5QUFJQUVRRHlBT1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJZ0FDQU9FQ1pGQkVCQkFDRUlJQVpCZ0lBQmNVVU5BeUFBUWJuTEFFRUFFQlZCZnlFSURBTUxJQUFnQnlBSktBSUFJZ2tnQWhCTUlnSkJBRWdOQWlBR1FZRUNjU0VJQWtBQ1FDQUNSUVJBSUFoQmdBSkdEUUZCQVNFSUlBa3RBQVZCQVhGRkRRRU1CUXNDUUNBSEtBSUFJZ0lnQmhDVEEwVWdBa0VCY1NBSVFZQUNSbkZ5RFFBQ1FDQUdRWUF3Y1FSQUlBSkJFWEZCRUVjTkFTQU5CRUFnQUNBRUlBY3BBeEFRVWtVTkF3c2dDa1VOQVNBQUlBVWdCeWtER0JCU0RRRU1BZ3NnQzBVTkFDQUdRUUp4UlNBQ1FRTnhJZ0pCQWtaeERRRWdBZzBBSUFBZ0F5QUhLUU1JRUZKRkRRRUxJQXhGRFFJZ0J5Z0NBRUVUY1VFQ1J3MENDeUFBSUFjUVNBc2dBRUdzSEVFQUVCVkJmeUVJREFNTElBQWdCeEJJUVFFaENBd0NDeUFBSUE4UUR3c2dBQ0FPRUE4TElBZEJRR3NrQUNBSUM2NENBZ04vQW40akFFRkFhaUlESkFCQmZ5RUVBa0FnQUNBRFFUaHFJQUZCNUFBUWdRRWlCVVVOQUNBREtRTTRJZ0ZDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUFnQlNrREFDQUNRUUFRMVFFaEJBd0JDeUFBSUFJUVhDSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkJFQWdBQ0FCRUE4TUFRc2dCU2tEQUNFSElBTWdCamNES0NBRElBYzNBeUFnQUNBQklBVXBBd2hCQWlBRFFTQnFFQzhoQVNBQUlBWVFEeUFCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBQkVDWWlCRVVFUUVFQUlRUU1BUXNDUUNBQUlBTWdCU2dDQUNBQ0VFd2lBa0VBVGdSQUlBSkZEUUlDUUNBRExRQUFRUUZ4QkVBZ0FDQUZLUU1BRUprQklnSkJBRWdOQVNBQ0RRTUxJQUJCaVJ4QkFCQVZDeUFBSUFNUVNBdEJmeUVFREFFTElBQWdBeEJJQ3lBRFFVQnJKQUFnQkFzUEFDQUFJQU1RRHlBQUVMVUNRWDhMbEFZQ0MzOENmaU1BUVVCcUlnVWtBRUYvSVFzQ1FDQUFJQVZCT0dvZ0EwSG5BQkNCQVNJR1JRMEFJQVVwQXpnaUEwS0FnSUNBY0lOQ2dJQ0FnREJSQkVBZ0FDQUJJQUlnQmlnQ0FFRURFSTRCSVFzTUFRc2dBQ0FESUFZcEF3aEJBU0FHRUM4aUEwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBVkJBRFlDTENBRlFRQTJBalFnQlVFQU5nSXdJQUFnQlVFMGFpQURFTllCSVFjZ0JTZ0NOQ0VLQWtBZ0J3MEFBa0FnQ2tVTkFDQUFJQXBCQTNRUVh5SUpEUUJCQUNFSkRBRUxBbjhDUUFOQUFrQWdCQ0FLUmdSQVFRRWdDaUFLUVFGTkd5RUlRUUVoQkFOQUlBUWdDRVlOQWlBSklBUWdDU0FFUVFOMGFpZ0NCQkQ2QkNFSElBUkJBV29oQkNBSFFRQklEUUFMSUFCQnhodEJBQkFWUVFBTUJBc2dBQ0FESUFRUXNBRWlEMEtBZ0lDQWNJTWlFRUtBZ0lDQWdIOVJJQkJDZ0lDQWdKQi9VWEpGQkVCQkFDQVFRb0NBZ0lEZ0FGRU5CQm9nQUNBUEVBOGdBRUhSTjBFQUVCVkJBQXdFQ3lBQUlBOFFNU0VJSUFBZ0R4QVBJQWhGRFFJZ0NTQUVRUU4wYWlJSFFRQTJBZ0FnQnlBSU5nSUVJQVJCQVdvaEJBd0JDd3RCQUNBQUlBWXBBd0FRbVFFaURFRUFTQTBCR2lBR0xRQVJCRUFnQUJDMkFnd0JDeUFBSUFWQkxHb2dCVUV3YWlBR0tBSUFRUU1RamdFRVFDQUZLQUl3SVFRZ0JTZ0NMQ0VJREFNTElBVW9BaXdoQ0NBRktBSXdJUVJCQUNFSEEwQWdCQ0FIUndSQUlBWXRBQkVFUUNBQUVMWUNEQVVMSUFBZ0JVRUlhaUFHS0FJQUlBZ2dCMEVEZEdvaURTZ0NCQkJNSWc1QkFFZ05CQUpBSUE1RkRRQWdBQ0FGUVFocUVFZ2dCUzBBQ0VFQmNVRUFJQXdiRFFBZ0NTQUtJQTBvQWdRUStnUWlEVUVBU0FSQUlBQkJxakpCQUJBVkRBWUxJQXdOQUNBSklBMUJBM1JxUVFFMkFnQUxJQWRCQVdvaEJ3d0JDd3NDUUNBTURRQkJBQ0VHQTBBZ0JpQUtSZzBCSUFaQkEzUWhCeUFHUVFGcUlRWWdCeUFKYWlnQ0FBMEFDeUFBUWZjWlFRQVFGUXdEQ3lBQUlBZ2dCQkJhSUFBZ0F4QVBJQUVnQ1RZQ0FDQUNJQW8yQWdCQkFDRUxEQU1MUVFBTElRUkJBQ0VJQ3lBQUlBZ2dCQkJhSUFBZ0NTQUtFRm9nQUNBREVBOExJQVZCUUdza0FDQUxDNjhFQWdSL0FuNGpBRUhnQUdzaUJDUUFRWDhoQlFKQUlBQWdCRUhZQUdvZ0FrSG1BQkNCQVNJR1JRMEFJQVlvQWdBaEJ5QUVLUU5ZSWdKQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFBZ0FTQUhJQU1RVENFRkRBRUxJQUFnQXhCY0lnaENnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUFJQUlRRHd3QkN5QUdLUU1BSVFrZ0JDQUlOd05JSUFRZ0NUY0RRQ0FBSUFJZ0Jpa0RDRUVDSUFSQlFHc1FMeUVDSUFBZ0NCQVBJQUpDZ0lDQWdIQ0RJZ2hDZ0lDQWdPQUFVUTBBQWtBQ1FBSkFJQWhDZ0lDQWdEQlJJQUpDLy8vLy8yOVdja1VFUUNBQUlBSVFEd3dCQ3lBQUlBUWdCeUFERUV3aUEwRUFTQTBDQWtBZ0EwVUVRRUVBSVFVZ0NFS0FnSUNBTUZFTkJRd0JDeUFBSUFRUVNDQUlRb0NBZ0lBd1VnMEFJQVF0QUFCQkFYRkZEUUZCQUNFRklBY3RBQVZCQVhGRkRRRU1CQXRCZnlFRklBQWdCaWtEQUJDWkFTSUdRUUJJRFFJZ0FDQUVRU0JxSUFJUSt3UWhCeUFBSUFJUUR5QUhRUUJJRFFNQ1FDQURCRUFnQkNnQ0FDSUZRWUE2UVlET0FDQUVLQUlnSWdOQkVIRWJJQU55RUpNRFJRMEJJQU5CQVhFTkF5QUZRUUZ4RFFFZ0EwRVNjUTBESUFWQkFuRU5BUXdEQ3lBR1JRMEFJQVF0QUNCQkFYRU5BZ3NnQUNBRVFTQnFFRWdMSUFCQm56MUJBQkFWUVg4aEJRd0NDd0pBSUFFRVFDQUJJQVFwQXlBM0F3QWdBU0FFS1FNNE53TVlJQUVnQkNrRE1EY0RFQ0FCSUFRcEF5ZzNBd2dNQVFzZ0FDQUVRU0JxRUVnTFFRRWhCUXdCQ3lBQUlBSVFEd3NnQkVIZ0FHb2tBQ0FGQzBvQUFrQWdCU2tEQUNJQlFvQ0FnSUJ3VkEwQUlBR25JZ0l2QVFaQk1FY05BQ0FDS0FJZ0lnSkZEUUFnQWtFQk9nQVJJQUFnQVJBUElBVkNnSUNBZ0NBM0F3QUxRb0NBZ0lBd0M4OEJBUU4rSXdCQkVHc2lBaVFBUW9DQWdJRGdBQ0VGQWtBQ1FBSitRb0NBZ0lBd0lBQkNnSUNBZ0RBZ0FDQURFUHdGSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUJvZ0FpQUVOd01JUW9DQWdJRGdBQ0FBUWRRQVFRQkJBRUVCSUFKQkNHb1F6d0VpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2lBQUVEUWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJJQVlMSVFFZ0FDQUVFQThnQUNBQkVBOE1BUXNnQUNBQlFZTUJJQVJCQnhBWkdpQUFJQUZCaEFFZ0JrRUhFQmthSUFFaEJRc2dBa0VRYWlRQUlBVUxzZ0VCQW40Z0FDQUJJQVJCQTNFaUFrRW1haEJMUlFSQVFvQ0FnSURnQUE4TFFvQ0FnSURnQUNFR0lBQWdBa0VxYWhCMklnVkNnSUNBZ0hDRFFvQ0FnSURnQUZJRWZpQUFRUkFRS1NJQ1JRUkFJQUFnQlJBUFFvQ0FnSURnQUE4TElBRkNJSWluUVhWUEJFQWdBYWNpQUNBQUtBSUFRUUZxTmdJQUN5QUNRUUEyQWd3Z0FpQUVRUUoxTmdJSUlBSWdBVGNEQUNBRlFvQ0FnSUJ3V2dSQUlBV25JQUkyQWlBTElBVUZRb0NBZ0lEZ0FBc0wwZ0lDQTM0RGZ5TUFRU0JySWdna0FFS0FnSUNBNEFBaEJRSkFJQUFnQVNBRVFTWnFFRXNpQ1VVTkFDQURLUU1BSVFkQ2dJQ0FnREFoQmlBQ1FRSk9CRUFnQXlrRENDRUdDeUFBSUFjUVlBMEFJQWxCQkdvaENpQUpLQUlJSVFNRFFDQURJQXBHQkVCQ2dJQ0FnREFoQlF3Q0N5QURRUXhyS0FJQUJFQWdBeWdDQkNFREJTQURRUkJySWdJZ0FpZ0NBRUVCYWpZQ0FDQURLUU1RSWdWQ0lJaW5RWFZQQkVBZ0JhY2lDU0FKS0FJQVFRRnFOZ0lBQ3lBSUlBVTNBd2dDUUNBRURRQWdBeWtER0NJRlFpQ0lwMEYxU1EwQUlBV25JZ2tnQ1NnQ0FFRUJhallDQUFzZ0NDQUJOd01RSUFnZ0JUY0RBQ0FBSUFjZ0JrRURJQWdRSVNFRklBQWdDQ2tEQUJBUElBUkZCRUFnQUNBSUtRTUlFQThMSUFNb0FnUWhBeUFBS0FJUUlBSVE2Z01nQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBZ0JSQVBDd3dBQ3dBTElBaEJJR29rQUNBRkMyQUFJQUFnQVNBQ1FTWnFFRXNpQUVVRVFFS0FnSUNBNEFBUEN5QUFLQUlNSWdCQkFFNEVRQ0FBclE4TFFvQ0FnSURBZmlBQXVMMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3d0WkFRRi9JQUFnQVNBRVFTWnFFRXNpQWtVRVFFS0FnSUNBNEFBUEN5QUNRUVJxSVFNZ0FpZ0NDQ0VFQTM0Z0F5QUVSZ1IrUW9DQWdJQXdCU0FFUVJCcklRVWdCQ2dDQkNFRUlBQW9BaEFnQWlBRkVQd0VEQUVMQ3dzVkFDQUFJQU1RRHlBQUlBUVFEeUFBRUxVQ1FYOExoZ0VBSUFBZ0FTQUVRU1pxRUVzaUFrVUVRRUtBZ0lDQTRBQVBDeUFBSUFJZ0F5a0RBQ0lCUWdBZ0FVSWdpS2RCQjJ0QmJrOGJJQUVnQVVLQWdJQ0F3SUdBL1A4QWZFTC8vLy8vLy8vLy8vOEFnMUFiRVBVQ0lnQkZCRUJDZ0lDQWdEQVBDeUFBS1FNb0lnRkNJSWluUVhWUEJFQWdBYWNpQUNBQUtBSUFRUUZxTmdJQUN5QUJDM1VBSUFBZ0FTQUVRU1pxRUVzaUFrVUVRRUtBZ0lDQTRBQVBDeUFBSUFJZ0F5a0RBQ0lCUWdBZ0FVSWdpS2RCQjJ0QmJrOGJJQUVnQVVLQWdJQ0F3SUdBL1A4QWZFTC8vLy8vLy8vLy8vOEFnMUFiRVBVQ0lnTkZCRUJDZ0lDQWdCQVBDeUFBS0FJUUlBSWdBeEQ4QkVLQmdJQ0FFQXRoQUNBQUlBRWdCRUVtYWhCTElnSkZCRUJDZ0lDQWdPQUFEd3NnQUNBQ0lBTXBBd0FpQVVJQUlBRkNJSWluUVFkclFXNVBHeUFCSUFGQ2dJQ0FnTUNCZ1B6L0FIeEMvLy8vLy8vLy8vLy9BSU5RR3hEMUFrRUFSNjFDZ0lDQWdCQ0VDN3NGQWdOK0IzOGpBRUVRYXlJTEpBQkNnSUNBZ09BQUlRY0NRQ0FBSUFFZ0JFRW1haEJMSWdKRkRRQWdBaWdDQUVVZ0F5a0RBQ0lGUWdBZ0JVSWdpS2RCQjJ0QmJrOGJJQVVnQlVLQWdJQ0F3SUdBL1A4QWZFTC8vLy8vLy8vLy8vOEFnMUFiSWdWQy8vLy8vMjlXY2tVRVFDQUFFQ1FNQVF0Q2dJQ0FnREFoQmlBRVFRRnhSUVJBSUFNcEF3Z2hCZ3NDUUNBQUlBSWdCUkQxQWlJREJFQWdBQ0FES1FNb0VBOE1BUXNnQUVFd0VDa2lBMFVOQVNBRElBSTJBZ2dnQTBJQk53TUFBa0FnQWlnQ0FBUkFJQU1nQmFjaUJDZ0NHRFlDRENBRUlBTTJBaGdNQVFzZ0JVSWdpS2RCZFVrTkFDQUZweUlFSUFRb0FnQkJBV28yQWdBTElBTWdCVGNESUNBQ0tBSVFJZ2tnQWlnQ0ZDSUVRUUZySUFVUTF3TnhRUU4wYWlJSUtBSUFJZ29nQTBFWWFpSU1OZ0lFSUFNZ0NEWUNIQ0FESUFvMkFoZ2dDQ0FNTmdJQUlBSW9BZ1FpQ0NBRFFSQnFJZ28yQWdRZ0F5QUNRUVJxSWd3MkFoUWdBeUFJTmdJUUlBSWdDallDQkNBQ0lBSW9BZ3hCQVdvaUNEWUNEQ0FJSUFJb0FoaEpEUUFnQUNBSlFRUWdCRUVCZENBRVFRRkdHeUlBUVFOMElBdEJER29RcUFFaUNFVU5BQ0FMS0FJTVFRTjJJQUJxSVFSQkFDRUFBMEFnQUNBRVJrVUVRQ0FJSUFCQkEzUnFJZ2tnQ1RZQ0JDQUpJQWsyQWdBZ0FFRUJhaUVBREFFTEN5QUVRUUZySVFvZ0FrRUlhaUVBQTBBZ0RDQUFLQUlBSWdCSEJFQWdBRUVNYXlnQ0FFVUVRQ0FJSUFBcEF4QVExd01nQ25GQkEzUnFJZ2tvQWdBaURTQUFRUWhxSWc0MkFnUWdBQ0FKTmdJTUlBQWdEVFlDQ0NBSklBNDJBZ0FMSUFCQkJHb2hBQXdCQ3dzZ0FpQUVOZ0lVSUFJZ0NEWUNFQ0FDSUFSQkFYUTJBaGdMSUFaQ0lJaW5RWFZQQkVBZ0JxY2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBRElBWTNBeWdnQVVJZ2lLZEJkVThFUUNBQnB5SUFJQUFvQWdCQkFXbzJBZ0FMSUFFaEJ3c2dDMEVRYWlRQUlBY0xxd01DQTM4QmZpTUFRUkJySWdja0FBSkFJQUFnQVNBRlFTcHFFRXNpQTBVRVFDQUVRUUEyQWdCQ2dJQ0FnT0FBSVFFTUFRdENnSUNBZ0RBaEFRSkFJQU1wQXdBaUNVS0FnSUNBY0lOQ2dJQ0FnREJSRFFBQ1FDQUpRb0NBZ0lCd1ZBMEFJQW1uSWdJdkFRWWdCVUVtYWtjTkFDQUNLQUlnSWdaRkRRQUNRQ0FES0FJTUlnaEZCRUFnQmlnQ0NDRUNEQUVMSUFnb0FoUWhBaUFBS0FJUUlBZ1E2Z01MSUFaQkJHb2hCZ05BSUFJZ0JrWUVRQ0FEUVFBMkFnd2dBQ0FES1FNQUVBOGdBMEtBZ0lDQU1EY0RBQXdEQ3lBQ1FReHJLQUlBQkVBZ0FpZ0NCQ0VDREFFTEN5QUNRUkJySWdZZ0JpZ0NBRUVCYWpZQ0FDQURJQVkyQWd3Z0JFRUFOZ0lBSUFNb0FnZ2lBMFVFUUNBQ0tRTVFJZ0ZDSUlpblFYVkpEUU1nQWFjaUFDQUFLQUlBUVFGcU5nSUFEQU1MSUFjZ0Fpa0RFQ0lCTndNQUlBVkZCRUFnQWlrREdDRUJDeUFISUFFM0F3Z2dBMEVCUmdSQUlBRkNJSWluUVhWSkRRTWdBYWNpQUNBQUtBSUFRUUZxTmdJQURBTUxJQUJCQWlBSEVJa0RJUUVNQWd0QitvTUJRYTc4QUVIOTV3SkJ4aVVRQUFBTElBUkJBVFlDQUFzZ0IwRVFhaVFBSUFFTFBRRUJma0tBZ0lDQUVDRUJJQU1wQXdBaUJFS0FnSUNBY0ZvRWZpQUVweThCQmtFVmEwSC8vd054UVF4SnJVS0FnSUNBRUlRRlFvQ0FnSUFRQ3d2cUF3SUVmZ0YvSXdCQklHc2lBaVFBUW9DQWdJRGdBQ0VGQWtBZ0FDQUJJQVFRU3lJSlJRMEFJQWt0QUFRRVFDQUFFR3NNQVFzZ0FDQUNRUmhxSUFNcEF3QkNBQ0FKTkFJQUlnWWdCaEIwRFFBZ0FpQUdOd01RSUFNcEF3Z2lCMEtBZ0lDQWNJTkNnSUNBZ0RCU0JFQWdBQ0FDUVJCcUlBZENBQ0FHSUFZUWRBMEJJQUlwQXhBaEJnc2dBaWtER0NFSUlBQWdBVUtBZ0lDQU1CRGpBU0lIUW9DQWdJQndneUlGUW9DQWdJRGdBRkVFUUNBSElRVU1BUXNnQmlBSWZTSUdRZ0FnQmtJQVZSc2hCZ0pBSUFWQ2dJQ0FnREJSQkVBZ0FFS0FnSUNBTUNBR0lBUVEzQU1oQlF3QkN5QUNJQVlpQlVLQWdJQ0FDRm9FZmtLQWdJQ0F3SDRnQnJtOUlnVkNnSUNBZ01DQmdQei9BSDBnQlVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNGSUFVTE53TUlJQUFnQjBFQklBSkJDR29RcHdFaEJTQUFJQWNRRHlBQUlBSXBBd2dRRHdzZ0JVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUFrQWdBQ0FGSUFRUVN5SURSUTBBSUFBZ0JTQUJFRklFUUNBQVFjL0dBRUVBRUJVTUFRc0NRQ0FETFFBRURRQWdBelFDQUNBR1V3UkFJQUJCczlRQVFRQVFGUXdDQ3lBSkxRQUVEUUFnQXlnQ0NDQUpLQUlJSUFpbmFpQUdweEFmR2d3Q0N5QUFFR3NMSUFBZ0JSQVBRb0NBZ0lEZ0FDRUZDeUFDUVNCcUpBQWdCUXNPQUNBQUVMVUNRb0NBZ0lEZ0FBdGRBQ0FBSUFFZ0FoQkxJZ0JGQkVCQ2dJQ0FnT0FBRHdzZ0FDZ0NBQ0lBUVFCT0JFQWdBSzBQQzBLQWdJQ0F3SDRnQUxpOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMT1FFQmZrS0FnSUNBd0g0Z0FTa0RBQ0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN6c0JBWDVDZ0lDQWdNQitJQUVxQWdDN3ZTSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3d3QUlBQWdBU2tEQUJEN0F3c01BQ0FBSUFFcEF3QVFod0lMU1FFQmZpQUJLQUlBSWdCQkFFNEVRQ0FBclE4TFFvQ0FnSURBZmlBQXVMMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzSEFDQUJOUUlBQ3djQUlBRXpBUUFMRGdBZ0FUSUJBRUwvLy8vL0Q0TUxDUUFnQUJDMUFrRi9DdzRBSUFFd0FBQkMvLy8vL3crREN3Y0FJQUV4QUFBTER3QWdBQ3NEQUNBQkt3TUFFUDBFQ3hFQUlBQXFBZ0M3SUFFcUFnQzdFUDBFQ3hrQkFuNGdBU2tEQUNJRElBQXBBd0FpQkZRZ0F5QUVWbXNMR1FFQ2ZpQUJLUU1BSWdNZ0FDa0RBQ0lFVXlBRElBUlZhd3NYQUNBQktBSUFJZ0VnQUNnQ0FDSUFTU0FBSUFGSmF3c1hBQ0FCS0FJQUlnRWdBQ2dDQUNJQVNDQUFJQUZJYXdzTkFDQUFMd0VBSUFFdkFRQnJDdzBBSUFBdUFRQWdBUzRCQUdzTERRQWdBQ3dBQUNBQkxBQUFhd3NOQUNBQUxRQUFJQUV0QUFCckM4d05CQWQvQVh3QmZnRjlJd0JCSUdzaUJpUUFRb0NBZ0lEZ0FDRU5Ba0FnQUNBQkVKSUJJZ3BCQUVnTkFFRi9JUVVDUUFKQUFrQWdDa1VOQUVFQklRZ0NRQUpBSUFSQkFVWUVRRUYvSVFnZ0JpQUtRUUZySWdVMkFod2dBa0VDU0EwQklBQWdCa0VJYWlBREtRTUlFRUlOQmlBR0t3TUlJZ3k5UXYvLy8vLy8vLy8vL3dDRFFvR0FnSUNBZ0lENC93QmFCRUFnQmtFQU5nSWNEQUlMSUF4RUFBQUFBQUFBQUFCbUJFQWdEQ0FGdDJORkRRSWdCZ0ovSUF5WlJBQUFBQUFBQU9CQll3UkFJQXlxREFFTFFZQ0FnSUI0Q3pZQ0hBd0NDMEYvSVFVZ0RDQUt0NkFpREVRQUFBQUFBQUFBQUdNTkJDQUdBbjhnREpsRUFBQUFBQUFBNEVGakJFQWdES29NQVF0QmdJQ0FnSGdMTmdJY0RBRUxJQVpCQURZQ0hDQUNRUUpJQkVBZ0NpRUNEQUlMSUFBZ0JrRWNhaUFES1FNSUlBb2lBaUFDRUZjTkJRd0JDMEYvSVFJTElBR25JZ2tvQWlBb0Fnd29BaUF0QUFRRVFFRi9JUVVnQkVGL1J3MENRWDlCQUNBRE5RSUVRaUNHUW9DQWdJQXdVaHNoQlF3REN5QUdRZ0EzQXhBQ2YwRUhJQU1wQXdBaUFVSWdpS2NpQXlBRFFRZHJRVzVKR3lJRFFYWkhCRUFnQTBFSFJ3UkFRWDhoQlNBRERRTWdCaUFCeENJQk53TVFJQUc1SVF4QkFTRUhRUUVNQWdzZ0JnSitJQUZDZ0lDQWdNQ0JnUHovQUh5L0lneVpSQUFBQUFBQUFPQkRZd1JBSUF5d0RBRUxRb0NBZ0lDQWdJQ0FnSDhMSWcwM0F4QkJBU0VISUF3Z0RibGhEQUVMSUFHbklRTkJmeUVGQW44Q1FBSkFJQWt2QVFaQkhHc09BZ0FCQkF0QkFDQUdRUkJxSUFOQkJHcEJBQkNDQTBVTkFSb01Bd3NnQXlnQ0RDSUhRZi8vLy84SFJnMENJQVlDZmtJQUlBZEJBRXdOQUJvZ0F5Z0NDQTBESUFkQndBQkxEUU1nQXlnQ0ZDSUxJQU1vQWhBaUEwRUNkR3BCQkdzb0FnQWhCU0FGUVNBZ0IydDJyU0FIUVNCTkRRQWFRZ0FoRFNBRFFRSlBCSDRnQTBFQ2RDQUxha0VJYXpVQ0FBVkNBQXNnQmExQ0lJYUVRY0FBSUFkcnJZZ0xOd01RUVFBTElRZEVBQUFBQUFBQUFBQWhERUVBQ3lFRFFYOGhCUUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBSkx3RUdRUlZyRGdzQkFBRURCQVlIQ3d3SkNnOExJQU5GRFE0Z0Jpa0RFQ0lOUW9BQmZFS0FBbG9ORGd3QkN5QURSUTBOSUFZcEF4QWlEVUwvQVZZTkRRc2dDU2dDSkNFQUlBUkJBVVlFUUNBTnAwSC8vd054SVFNZ0JpZ0NIQ0VGQTBBZ0FpQUZSZzBOSUFNZ0FDQUZhaTBBQUVZTkRpQUZJQWhxSVFVTUFBc0FDeUFBSUFZb0Fod2lBbW9nRGFkQi8vOERjU0FLSUFKckVQc0JJZ0pGRFF3Z0FpQUFheUVGREF3TElBTkZEUXNnQmlrREVDSU5Rb0NBQW54Q2dJQUVXZzBMREFFTElBTkZEUW9nQmlrREVDSU5Rdi8vQTFZTkNnc2dDU2dDSkNFQUlBWW9BaHdoQlNBTnAwSC8vd054SVFNRFFDQUNJQVZHRFFrZ0FDQUZRUUYwYWk4QkFDQURSZzBLSUFVZ0NHb2hCUXdBQ3dBTElBTkZEUWdnQmlrREVDSU5Rb0NBZ0lBSWZFS0FnSUNBRUZvTkNBd0JDeUFEUlEwSElBWXBBeEFpRFVMLy8vLy9EMVlOQndzZ0RhY2hBQ0FKS0FJa0lRTWdCaWdDSENFRkEwQWdBaUFGUmcwR0lBTWdCVUVDZEdvb0FnQWdBRVlOQnlBRklBaHFJUVVNQUFzQUN5QUhSUTBGSUF5OVF2Ly8vLy8vLy8vLy93Q0RRb0dBZ0lDQWdJRDQvd0JhQkVBZ0JFRi9SdzBISUFrb0FpUWhBQ0FHS0FJY0lRVURRQ0FDSUFWR0RRWWdBQ0FGUVFKMGFpZ0NBRUgvLy8vL0IzRkJnSUNBL0FkTERRY2dCU0FJYWlFRkRBQUxBQXNnRENBTXRpSU91MklOQlNBSktBSWtJUUFnQmlnQ0hDRUZBMEFnQWlBRlJnMEZJQUFnQlVFQ2RHb3FBZ0FnRGxzTkJpQUZJQWhxSVFVTUFBc0FDeUFIUlEwRUlBa29BaVFoQUNBTXZVTC8vLy8vLy8vLy8vOEFnMEtCZ0lDQWdJQ0ErUDhBV2dSQUlBUkJmMGNOQmlBR0tBSWNJUVVEUUNBQ0lBVkdEUVVnQUNBRlFRTjBhaWtEQUVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWZzBHSUFVZ0NHb2hCUXdBQ3dBTElBWW9BaHdoQlFOQUlBSWdCVVlOQkNBQUlBVkJBM1JxS3dNQUlBeGhEUVVnQlNBSWFpRUZEQUFMQUFzZ0IwVU5BU0FBS0FJUUtBS01BU0lBQkg4Z0FDMEFLRUVFY1VFQ2RnVkJBQXRGRFFNZ0EwVU5BeUFHS1FNUUlnRkNnWUNBZ0lDQWdIQlREUU1nQVVLQWdJQ0FnSUNBRUZrTkF3d0JDeUFIUlEwQUlBQW9BaEFvQW93QklnQUVmeUFBTFFBb1FRUnhRUUoyQlVFQUMwVU5BaUFEUlEwQ0lBWXBBeEFpQVVJQVV3MENJQUZDLy8vLy8vLy8vdzlWRFFJTElBa29BaVFoQUNBR0tBSWNJUVVnQmlrREVDRUJBMEFnQWlBRlJnMEJJQUFnQlVFRGRHb3BBd0FnQVZFTkFpQUZJQWhxSVFVTUFBc0FDMEYvSVFVTElBUkJmMFlOQVFzZ0JhMGhEUXdCQ3lBRlFRQk9yVUtBZ0lDQUVJUWhEUXNnQmtFZ2FpUUFJQTBMZ2dNQ0JIOERmaU1BUVNCcklnVWtBQUorSUFBZ0FSQ1NBU0lJUVFCT0JFQkJMQ0VIQWtBZ0FrRUFUQ0FFY2tVRVFFS0FnSUNBTUNFSklBTXBBd0FpQ2tLQWdJQ0FjSU5DZ0lDQWdEQlJEUUZDZ0lDQWdPQUFJQUFnQ2hBb0lnbENnSUNBZ0hDRFFvQ0FnSURnQUZFTkF4cEJmeUVISUFtbklnWW9BZ1JCQVVjTkFTQUdMUUFRSVFjTUFRdENnSUNBZ0RBaENRc2dBQ0FGUVFocVFRQVFQUnBCQUNFQ0FrQURRQ0FDSUFoSEJFQUNRQ0FDUlEwQUlBZEJBRTRFUUNBRlFRaHFJQWNRTzBVTkFRd0VDeUFGUVFocUlBWkJBQ0FHS0FJRVFmLy8vLzhIY1JCUkRRTUxJQUFnQVNBQ0VMQUJJZ3RDZ0lDQWdIQ0RJZ3BDZ0lDQWdDQlJJQXBDZ0lDQWdEQlJja1VFUUNBS1FvQ0FnSURnQUZFTkF5QUZRUWhxSUFRRWZpQUFJQXNRL2dRRklBc0xFSDhOQXdzZ0FrRUJhaUVDREFFTEN5QUFJQWtRRHlBRlFRaHFFRFlNQWdzZ0JTZ0NDQ2dDRUNJQ1FSQnFJQVVvQWd3Z0FpZ0NCQkVBQUNBQUlBa1FEd3RDZ0lDQWdPQUFDeUVMSUFWQklHb2tBQ0FMQzdnQ0F3Ti9BWDRCZkNNQVFTQnJJZ01rQUNBQ0tBSUVSUVJBSUFFb0FnQWhCU0FESUFJb0FnQWlBU0FDS0FJY0lBQW9BZ0FpQUNBQ0tBSWdiR29nQWlnQ0dCRU5BRGNERUNBRElBRWdBaWdDSENBRklBSW9BaUJzYWlBQ0tBSVlFUTBBTndNWUFrQWdBU0FDS1FNUVFvQ0FnSUF3UVFJZ0EwRVFhaEFoSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQ1FRRTJBZ1FNQVFzQ1FBSi9JQVpDLy8vLy93OVlCRUFnQnFjaUJFRWZkU0FFUVFCSGNnd0JDeUFCSUFOQkNHb2dCaEJ1UVFCSURRRWdBeXNEQ0NJSFJBQUFBQUFBQUFBQVpDQUhSQUFBQUFBQUFBQUFZMnNMSWdSRkJFQWdBQ0FGU3lBQUlBVkpheUVFQ3lBQklBSXBBd2dROXdKQkFFNE5BU0FDUVFFMkFnUU1BUXNnQWtFQk5nSUVDeUFCSUFNcEF4QVFEeUFCSUFNcEF4Z1FEd3NnQTBFZ2FpUUFJQVFMdHdVQ0JYOERmaU1BUVRCcklnSWtBQ0FDSUFFM0F4QWdBaUFBTmdJSUlBSkJBRFlDRENBQ0lBTXBBd0FpQ1RjREdFS0FnSUNBNEFBaENnSkFBa0FnQUNBQkVKSUJJZ1ZCQUVnTkFDQUpRb0NBZ0lCd2d5SUxRb0NBZ0lBd1VnUkFJQUFnQ1JCZ0RRRUxBa0FnQlVFQ1NRMEFJQUduSWdNdkFRWkJGV3NpQkVILy93TnhRUXRQRFFJZ0FpQUVRUUowUWZ6L0QzRWlCRUdBZ0FKcUtBSUFOZ0lnUVFFZ0F5OEJCa0hscGdGcUxRQUFJZ1owSVFnZ0F5Z0NKQ0VISUF0Q2dJQ0FnREJTQkVBZ0FDQUZRUUowRUNraUJFVU5Ba0VBSVFNRFFDQURJQVZHUlFSQUlBUWdBMEVDZEdvZ0F6WUNBQ0FEUVFGcUlRTU1BUXNMSUFJZ0NEWUNLQ0FDSUFjMkFpUWdCQ0FGUVFSQjB3QWdBa0VJYWhDK0FnSkFJQUlvQWd4RkJFQWdBQ0FGSUFaMElnTVFLU0lHRFFFTElBQW9BaEFpQUVFUWFpQUVJQUFvQWdRUkFBQU1Bd3NnQmlBSElBTVFIeUVHUVFBaEF3SkFBa0FDUUFKQUFrQWdDRUVCYXc0SUFBRUlBZ2dJQ0FNSUN3TkFJQU1nQlVZTkJDQURJQWRxSUFZZ0JDQURRUUowYWlnQ0FHb3RBQUE2QUFBZ0EwRUJhaUVEREFBTEFBc0RRQ0FESUFWR0RRTWdCeUFEUVFGMGFpQUdJQVFnQTBFQ2RHb29BZ0JCQVhScUx3RUFPd0VBSUFOQkFXb2hBd3dBQ3dBTEEwQWdBeUFGUmcwQ0lBY2dBMEVDZENJSWFpQUdJQVFnQ0dvb0FnQkJBblJxS0FJQU5nSUFJQU5CQVdvaEF3d0FDd0FMQTBBZ0F5QUZSZzBCSUFjZ0EwRURkR29nQmlBRUlBTkJBblJxS0FJQVFRTjBhaWtEQURjREFDQURRUUZxSVFNTUFBc0FDeUFBS0FJUUlnTkJFR29nQmlBREtBSUVFUUFBSUFBb0FoQWlBRUVRYWlBRUlBQW9BZ1FSQUFBTUFRc2dCeUFGSUFnZ0JFR3NnQUpxS0FJQUlBSkJDR29RdmdJZ0FpZ0NEQTBCQ3lBQlFpQ0lwMEYxVHdSQUlBR25JZ0FnQUNnQ0FFRUJhallDQUFzZ0FTRUtDeUFDUVRCcUpBQWdDZzhMRUFFQUM2RUNBZ0ovQTM0akFFRXdheUlDSkFCQ2dJQ0FnT0FBSVFZQ1FDQUFJQUZCQUJDVEFTSUZSUTBBSUFBZ0FrRU1haUFES1FNQUlBVW9BaWdpQkNBRUVGY05BQ0FDSUFRMkFnZ2dBeWtEQ0NJSFFvQ0FnSUJ3ZzBLQWdJQ0FNRklFUUNBQUlBSkJDR29nQnlBRUlBUVFWdzBCSUFJb0FnZ2hCQXNnQWlnQ0RDRURJQUFnQVVFQUVJQUZJZ2RDZ0lDQWdQQUFnMEtBZ0lDQTRBQlJEUUFnQlM4QkJpRUZJQUFnQnhBUElBQWdBVUVBRUlFRklnaENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUZRZVdtQVdvdEFBQWhCU0FDSUFnM0F4Z2dBaUFCTndNUUlBSWdCQ0FEYXlJRVFRQWdCRUVBU2h1dE53TW9JQUlnQjZjZ0F5QUZkR3F0TndNZ0lBQkJCQ0FDUVJCcUVQWUNJUVlnQUNBSUVBOExJQUpCTUdva0FDQUdDOElEQWdWL0JINGpBRUVnYXlJQ0pBQkNnSUNBZ0RBaENRSkFBa0FnQUNBQkVKSUJJZ1JCQUVnTkFDQUFJQUpCREdvZ0F5a0RBQ0FFSUFRUVZ3MEFJQUlnQkRZQ0NDQURLUU1JSWdwQ2dJQ0FnSENEUW9DQWdJQXdVZ1JBSUFBZ0FrRUlhaUFLSUFRZ0JCQlhEUUVnQWlnQ0NDRUVDeUFDS0FJTUlRTWdBQ0FCUVFBUWt3RWlCa1VOQUNBR0x3RUdJUWNnQWlBRUlBTnJJZ1ZCQUNBRlFRQktHeUlFclNJTE53TVlJQUlnQVRjREVDQUFRUUlnQWtFUWFoRDJBaUlKUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQlVFQVRBMEJJQWRCNWFZQmFpMEFBQ0VISUFBZ0FSRDNBZzBBSUFBZ0NSRDNBZzBBUWdBaENnSkFJQUFnQ1VFQUVKTUJJZ1ZGRFFBZ0JpOEJCaUlJSUFVdkFRWkhEUUFnQlNnQ0lDZ0NGQ0FJUWVXbUFXb3RBQUFpQ0hZZ0JFa05BQ0FESUFScUlBWW9BaUFvQWhRZ0NIWkxEUUFnQlNnQ0pDQUdLQUlrSUFNZ0IzUnFJQVFnQjNRUUh4b01BZ3NEUUNBS0lBdFJEUUlnQUNBQklBTWdDcWRxclJCTklneENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQWtnQ2lBTVFZQ0FBUkRYQVNFRUlBcENBWHdoQ2lBRVFRQk9EUUFMQ3lBQUlBa1FEMEtBZ0lDQTRBQWhDUXNnQWtFZ2FpUUFJQWtMNXdJQkFYNGdBQ0FCRUpJQklnSkJBRWdFUUVLQWdJQ0E0QUFQQ3dKQUlBSkZEUUFDUUFKQUFrQUNRQUpBSUFHbklnQXZBUVpCNWFZQmFpMEFBQTRFQUFFQ0F3UUxJQUFvQWlRaUFDQUNhaUVDQTBBZ0FDQUNRUUZySWdKUERRVWdBQzBBQUNFRElBQWdBaTBBQURvQUFDQUNJQU02QUFBZ0FFRUJhaUVBREFBTEFBc2dBQ2dDSkNJQUlBSkJBWFJxSVFJRFFDQUFJQUpCQW1zaUFrOE5CQ0FBTHdFQUlRTWdBQ0FDTHdFQU93RUFJQUlnQXpzQkFDQUFRUUpxSVFBTUFBc0FDeUFBS0FJa0lnQWdBa0VDZEdvaEFnTkFJQUFnQWtFRWF5SUNUdzBESUFBb0FnQWhBeUFBSUFJb0FnQTJBZ0FnQWlBRE5nSUFJQUJCQkdvaEFBd0FDd0FMSUFBb0FpUWlBQ0FDUVFOMGFpRUNBMEFnQUNBQ1FRaHJJZ0pQRFFJZ0FDa0RBQ0VFSUFBZ0Fpa0RBRGNEQUNBQ0lBUTNBd0FnQUVFSWFpRUFEQUFMQUFzUUFRQUxJQUZDSUlpblFYVlBCRUFnQWFjaUFDQUFLQUlBUVFGcU5nSUFDeUFCQzRjQ0FnWitBbjhqQUVFZ2F5SUxKQUJDZ0lDQWdEQWhCZ0pBQWtBZ0FDQUJFSklCSWd4QkFFZ05BQ0FBSUFNcEF3QWlDQkJnRFFCQ2dJQ0FnREFoQnlBQ1FRSk9CRUFnQXlrRENDRUhDeUFNclNFSkEwQWdCU0FKVWdSQUlBQWdBU0FGRUUwaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ0lBc2dBVGNERUNBTElBVTNBd2dnQ3lBR053TUFJQUFnQ0NBSFFRTWdDeEFoSWdwQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQWlBQUlBb1FKZ1JBSUFSRkJFQWdCaUVGREFVTElBQWdCaEFQREFRRklBQWdCaEFQSUFWQ0FYd2hCUXdDQ3dBTEMwTC8vLy8vRDBLQWdJQ0FNQ0FFR3lFRkRBRUxJQUFnQmhBUFFvQ0FnSURnQUNFRkN5QUxRU0JxSkFBZ0JRdWZCUUlFZndKK0l3QkJJR3NpQkNRQVFvQ0FnSURnQUNFSUFrQWdBQ0FCRUpJQklnWkJBRWdOQUFKQUlBR25JZ1V2QVFZaUIwRVZSZ1JBSUFNcEF3QWlDVUlnaUtkQmRVOEVRQ0FKcHlJSElBY29BZ0JCQVdvMkFnQUxJQUFnQkVFSWFpQUpFTVFGRFFJZ0JDQUVOQUlJTndNUURBRUxJQWRCRzAwRVFDQUFJQVJCQ0dvZ0F5a0RBQkIzRFFJZ0JDQUVOUUlJTndNUURBRUxJQWRCSFUwRVFDQUFJQVJCRUdvZ0F5a0RBQkQvQkVVTkFRd0NDeUFBSUFSQkNHb2dBeWtEQUJCQ0RRRWdCQUorSUFVdkFRWkJIa1lFUUNBRUt3TUl0cnl0REFFTElBUXBBd2dMTndNUUN5QUVRUUEyQWdnQ1FDQUNRUUZNQkVBZ0JDQUdOZ0ljREFFTElBQWdCRUVJYWlBREtRTUlJQVlnQmhCWERRRWdCQ0FHTmdJY0lBSkJBMGtOQUNBREtRTVFJZ2xDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFJQUFnQkVFY2FpQUpJQVlnQmhCWERRRUxJQVVvQWlBb0Fnd29BaUF0QUFRRVFDQUFFR3NNQVFzQ1FBSkFBa0FDUUFKQUFrQWdCUzhCQmtIbHBnRnFMUUFBRGdRQUFRSURCQXNnQkNnQ0hDSUNJQVFvQWdnaUFFd05CQ0FGS0FJa0lBQnFJQVF0QUJBZ0FpQUFheEFyR2d3RUN5QUVLQUlJSWdBZ0JDZ0NIQ0lDSUFBZ0Frb2JJUUlnQkM4QkVDRURBMEFnQUNBQ1JnMEVJQVVvQWlRZ0FFRUJkR29nQXpzQkFDQUFRUUZxSVFBTUFBc0FDeUFFS0FJSUlnQWdCQ2dDSENJQ0lBQWdBa29iSVFJZ0JDZ0NFQ0VEQTBBZ0FDQUNSZzBESUFVb0FpUWdBRUVDZEdvZ0F6WUNBQ0FBUVFGcUlRQU1BQXNBQ3lBRUtBSUlJZ0FnQkNnQ0hDSUNJQUFnQWtvYklRSWdCQ2tERUNFSUEwQWdBQ0FDUmcwQ0lBVW9BaVFnQUVFRGRHb2dDRGNEQUNBQVFRRnFJUUFNQUFzQUN4QUJBQXNnQVVJZ2lLZEJkVThFUUNBRklBVW9BZ0JCQVdvMkFnQUxJQUVoQ0FzZ0JFRWdhaVFBSUFnTDJ3VUNBMzhJZmlNQVFVQnFJZ1VrQUVLQWdJQ0FNQ0VMSUFWQ2dJQ0FnREEzQXpnZ0JVS0FnSUNBTURjRE1BSkFBa0FDUUNBRVFRaHhJZ2NFUUNBQlFpQ0lwMEYxVHdSQUlBR25JZ1lnQmlnQ0FFRUJhallDQUFzZ0JTQUFJQUVRa2dFaUJxdzNBd2dnQmtFQVRnMEJEQUlMSUFBZ0JVRUlhaUFBSUFFUUpTSUJFRHdOQVFzZ0FDQURLUU1BSWcwUVlBMEFBa0FnQWtFQlRBUkFJQVVwQXdnaURFSUFJQXhDQUZVYklRb2dCRUVCY1NFRUEwQWdDQ0FLVVFSQUlBQkJzaDVCQUJBVkRBUUxJQXdnQ0VKL2hYd2dDQ0FFR3lFSklBaENBWHdoQ0NBSEJFQWdCU0FBSUFFZ0NSQnpJZ2szQXpBZ0NVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwRURBTUxJQUFnQVNBSklBVkJNR29RaFFFaUFrRUFTQTBESUFKRkRRQUxJQVVwQXpBaENRd0JDeUFES1FNSUlnbENJSWluUVhWUEJFQWdDYWNpQWlBQ0tBSUFRUUZxTmdJQUN5QUVRUUZ4SVFRZ0JTa0RDQ0VNQ3lBSUlBd2dDQ0FNVlJzaERnTkFJQWdnRGxFTkFpQU1JQWhDZjRWOElBZ2dCQnNoQ2dKQUFrQUNRQ0FIQkVBZ0JTQUFJQUVnQ2hCeklnczNBemdnQzBLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBCREFNTElBQWdBU0FLSUFWQk9Hb1FoUUVpQWtFQVNBMENJQUpGRFFFTElBcENnSUNBZ0FoOFF2Ly8vLzhQV0FSK0lBcEMvLy8vL3crREJVS0FnSUNBd0g0Z0NybTlJZ3BDZ0lDQWdNQ0JnUHovQUgwZ0NrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElndENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUZJQWszQXhBZ0JTQUJOd01vSUFVZ0N6Y0RJQ0FGSUFVcEF6Z2lEemNER0NBQUlBMUNnSUNBZ0RCQkJDQUZRUkJxRUNFaENpQUFJQXNRRHlBQUlBOFFEeUFGUW9DQWdJQXdOd000SUFwQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBa1FEeUFLSVFrTElBaENBWHdoQ0F3QkN3c2dCU0FKTndNd0lBVXBBemdoQ3dzZ0FDQUZLUU13RUE4Z0FDQUxFQTlDZ0lDQWdPQUFJUWtMSUFBZ0FSQVBJQVZCUUdza0FDQUpDNndJQWdOL0NYNGpBRUV3YXlJRkpBQkNnSUNBZ0RBaENTQUZRb0NBZ0lBd053TW9Ba0FDUUFKQUFrQWdCRUVJY1NJSEJFQWdBVUlnaUtkQmRVOEVRQ0FCcHlJR0lBWW9BZ0JCQVdvMkFnQUxJQVVnQUNBQkVKSUJJZ2FzTndNSUlBWkJBRTROQVF3Q0N5QUFJQVZCQ0dvZ0FDQUJFQ1VpQVJBOERRRUxJQU1wQXdBaEQwS0FnSUNBTUNFT0lBSkJBazRFUUNBREtRTUlJUTRMSUFBZ0R4QmdEUUFDUUFKQUFrQUNRQUpBQWtBQ1FDQUVEZzBGQUFZQkFnWUdCZ1VBQmdNRUJndENnSUNBZ0JBaENRd0ZDeUFBSUFFQ2ZpQUZLUU1JSWdoQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFoQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBSXViMGlDRUtBZ0lDQXdJR0EvUDhBZlNBSVF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUXF3SWlDVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEVEQVVMSUFBZ0FVSUFFS3NDSWdsQ2dJQ0FnSENEUW9DQWdJRGdBRklOQXd3RUN5QUZJQUUzQXhBZ0JTQUZOUUlJTndNWUlBQkJBaUFGUVJCcUVQWUNJZ2xDZ0lDQWdIQ0RRb0NBZ0lEZ0FGSU5BZ3dEQ3lBQUVENGlDVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJRb0NBZ0lEZ0FDRUpEQUlMUW9HQWdJQVFJUWtMUWdBaENDQUZLUU1JSWdwQ0FDQUtRZ0JWR3lFUUEwQWdDQ0FRVWdSQUFrQUNRQ0FIQkVBZ0JTQUFJQUVnQ0JCeklnbzNBeWdnQ2tLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBCREFVTElBQWdBU0FJSUFWQktHb1FoUUVpQWtFQVNBMEVJQUpGRFFFTElBZ2hDaUFJUW9DQWdJQUlXZ1JBUW9DQWdJREFmaUFJdWIwaUNrS0FnSUNBd0lHQS9QOEFmU0FLUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeUVLQ3lBS1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFNZ0JTQUJOd01nSUFVZ0NqY0RHQ0FGSUFVcEF5Z2lEVGNERUNBQUlBOGdEa0VESUFWQkVHb1FJU0VMSUFBZ0NoQVBJQXRDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5Bd0pBQWtBQ1FBSkFBa0FDUUFKQUlBUU9EUUFCQlFJRUJRVUZBQUVGQXdRRkN5QUFJQXNRSmcwRlFvQ0FnSUFRSVFnTUN3c2dBQ0FMRUNaRkRRUkNnWUNBZ0JBaENBd0tDeUFBSUFrZ0NDQUxFR3BCQUU0TkF3d0hDeUFBSUFrZ0NFTC8vLy8vRDRNZ0MwR0FnQUVRMXdGQkFFNE5BZ3dHQ3lBQUlBc1FKa1VOQVNBTlFpQ0lwMEYxVHdSQUlBMm5JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUpJQXdnRFJCcVFRQklEUVVnREVJQmZDRU1EQUVMSUFBZ0N4QVBDeUFBSUEwUUR5QUZRb0NBZ0lBd053TW9DeUFJUWdGOElRZ01BUXNMSUFSQkRFY0VRQ0FKSVFnTUF3c2dCU0FCTndNUUlBVWdERUwvLy8vL0Q0TTNBeGdnQUVFQ0lBVkJFR29ROWdJaUNFS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBVWdDVGNERUNBQUlBQWdDRUhDQUVFQklBVkJFR29RckFJUS9BRkZEUUVMUW9DQWdJRGdBQ0VJQ3lBQUlBa1FEd3NnQUNBRktRTW9FQThnQUNBQkVBOGdCVUV3YWlRQUlBZ0wrQVVDQjM4Q2ZpTUFRUkJySWdJa0FDQUNRZ0EzQXdBZ0FrTC8vLy8vRHpjRENBSkFJQUpCOEFJUTJRTWlBRVVFUUF3QkN5QUFRU0JxUVFCQjBBSVFLeG9nQUVHZ3BBRXBBZ0EzQWdnZ0FFR1lwQUVwQWdBM0FnQWdBRUVGTmdJTUlBSXBBd2doQnlBQ0tRTUFJUWdnQUVHQWdCQTJBbXdnQUNBSU53TVFJQUFnQnpjREdDQUFRZUFCYWtFQVFUUVFLeG9nQUVFR05nTGtBaUFBUVFjMkF1QUNJQUJCQ0RZQzJBSWdBRUVKTmdMVUFpQUFRUW8yQXRBQ0lBQkJDellDekFJZ0FFRUdOZ0xJQWlBQVFRYzJBc1FDSUFCQkNEWUN2QUlnQUVFSk5nSzRBaUFBUVFvMkFyUUNJQUJCQ3pZQ3NBSWdBRUVHTmdLc0FpQUFRUWMyQXFnQ0lBQkJDRFlDb0FJZ0FFRUpOZ0tjQWlBQVFRbzJBcGdDSUFCQkN6WUNsQUlnQUVFTU5nTGNBU0FBSUFBMkF0Z0JJQUFnQUVHZ0FXb2lBVFlDcEFFZ0FDQUJOZ0tnQVNBQVFRQTZBR2dnQUNBQVFkZ0FhaUlCTmdKY0lBQWdBVFlDV0NBQUlBQkIwQUJxSWdFMkFsUWdBQ0FCTmdKUUlBQWdBRUhJQUdvaUFUWUNUQ0FBSUFFMkFrZ2dBRUVBTmdJa0lBQkJBRFlDTkNBQVFRQTJBandnQUVJQU53TW9Ba0FDUUNBQVFZQUNFUElFRFFCQmtLY0JJUVJCQVNFQkEwQWdBVUhlQVVjRVFDQUFJQVFRUHlJRlFRQVE3d1FpQmtVTkFpQUdRUkJxSUFRZ0JSQWZJQVZxUVFBNkFBQWdBQ0FHUVFSQkEwRUJJQUZCendGTEd5QUJRYzhCUmhzUXB3SkZEUUlnQVVFQmFpRUJJQVFnQldwQkFXb2hCQXdCQ3dzZ0FFR1Fud0ZCQVVFdkVNMERRUUJJRFFBZ0FDZ0NSQ0lCUVEwMkF2Z0NJQUZCRGpZQ3NBSWdBVUg4b3dFMkFwd0NJQUZCNEtNQk5nS01BU0FCUWNTakFUWUMxQUVnQVVFUE5nS1FBeUFCUVJBMkF1QUNJQUJCQURZQzBBRWdBRUtFZ0lDQWdBSTNBOGdCSUFCQkVHcEJ3QUFnQUNnQ0FCRURBQ0lCRFFFZ0FFRUFOZ0xVQVFzZ0FCRGZCQXdCQ3lBQlFRQkJ3QUFRS3lFRElBQkNnSUNBZ0NBM0E0QUJJQUFnQWtHQWdCQnJOZ0o0SUFBZ0FqWUNkQ0FBUVlDQUVEWUNjQ0FBSUFNMkF0UUJJQUFoQXdzZ0FrRVFhaVFBSUFNTHBnSUNCSDhDZmlNQVFSQnJJZ1VrQUVLQWdJQ0E0QUFoQ0FKQUlBQWdBUkNTQVNJRVFRQklEUUFnQUNBRlFReHFJQU1wQXdBZ0JDQUVFRmNOQUNBQUlBVkJDR29nQXlrRENDQUVJQVFRVncwQUlBVWdCRFlDQkFKL0lBUWdBa0VEU0EwQUdpQUVJQU1wQXhBaUNVS0FnSUNBY0lOQ2dJQ0FnREJSRFFBYUlBQWdCVUVFYWlBSklBUWdCQkJYRFFFZ0JTZ0NCQXNnQlNnQ0NDSUhheUlHSUFRZ0JTZ0NEQ0lEYXlJQ0lBSWdCa29iSWdKQkFFb0VRQ0FCcHlJR0tBSWdLQUlNS0FJZ0xRQUVCRUFnQUJCckRBSUxJQVlvQWlRaUFDQURJQVl2QVFaQjVhWUJhaTBBQUNJRGRHb2dBQ0FISUFOMGFpQUNJQU4wRUp3QkN5QUJRaUNJcDBGMVR3UkFJQUduSWdBZ0FDZ0NBRUVCYWpZQ0FBc2dBU0VJQ3lBRlFSQnFKQUFnQ0F0S0FnRitBWDlDZ0lDQWdEQWhBZ0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY3ZBUVlpQTBFVmEwSC8vd054UVFwTERRQWdBQ0FBS0FJUUtBSkVJQU5CR0d4cUtBSUVFQzBoQWdzZ0Fnc3NBUUYrUW9DQWdJRGdBQ0VGSUFBZ0FSRDNBZ1IrUW9DQWdJRGdBQVVnQUNBQklBQWdBQ0FFRU5VRkN3dkNBd0lFZmdSL0l3QkJFR3NpQ0NRQVFvQ0FnSUF3SVFWQ2dJQ0FnREFoQkNBQ1FRSk9CRUFnQXlrRENDRUVDeUFES1FNQUlRWkNnSUNBZ09BQUlRY0NRQ0FBSUFGQkFCQ1RBU0lDUlEwQUlBQWdDQ0FFRU9JRERRQUNRQUpBQWtBQ1FBSkFJQWdwQXdBaUJFSUFVd1JBREFFTElBSW9BaUFvQWd3b0FpQXRBQVFOQkNBQUlBWVFKU0lGUW9DQWdJQndnMEtBZ0lDQTRBQlJEUU1nQmFjaUF5OEJCaUlKUVJWclFmLy9BM0ZCQ2swRVFDQURLQUlnSWdvb0Fnd29BaUFpQ3kwQUJBMEZJQVFnQWpVQ0tDQUROUUlvSWdaOVZRMEJJQWtnQWk4QkJpSURSdzBDSUFRZ0EwSGxwZ0ZxTVFBQUlnR0dweUFDS0FJZ0lnSW9BZ3dvQWlBb0FnZ2dBaWdDRUdwcUlBc29BZ2dnQ2lnQ0VHb2dCaUFCaHFjUW5BRU1Bd3NnQUNBSVFRaHFJQVVRUEEwRElBUWdBalVDS0NBSUtRTUlJZ1o5VncwQkN5QUFRZUhZQUVFQUVGQU1CQXNnQktjaEFrRUFJUU1EUUNBR0lBT3RWdzBCSUFBZ0JTQURFTEFCSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQkNBQ0lBTnFJUWtnQTBFQmFpRURJQUFnQVNBSklBUVFwUUZCQUU0TkFBc01Bd3RDZ0lDQWdEQWhCd3dDQ3d3QkN5QUFFR3NMSUFBZ0JSQVBJQWhCRUdva0FDQUhDeDRBSUFBZ0FVRUFFSk1CSWdCRkJFQkNnSUNBZ09BQUR3c2dBRFVDS0F1ckFRSURmd0YrSXdCQkVHc2lCU1FBSUFVZ0FxMDNBd2dDUUNBQUlBRkJBU0FGUVFocUVOb0RJZ0ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FDUVFBZ0FrRUFTaHNoQWdOQUlBSWdCRVlOQVNBRElBUkJBM1JxS1FNQUlnZENJSWluUVhWUEJFQWdCNmNpQmlBR0tBSUFRUUZxTmdJQUN5QUFJQUVnQkNBSEVLVUJJUVlnQkVFQmFpRUVJQVpCQUU0TkFBc2dBQ0FCRUE5Q2dJQ0FnT0FBSVFFTElBVkJFR29rQUNBQkN3WUFRZkRHQkF1Q0J3SUpmZ0ovSXdCQk1Hc2lEU1FBSUFNcEF3QWhCQ0FOUW9DQWdJQXdOd01ZUVFFaERnSkFBa0FDZmlBQ1FRSklCRUJDZ0lDQWdEQWhDa0tBZ0lDQU1Bd0JDMEtBZ0lDQU1DQURLUU1JSWdwQ2dJQ0FnSENEUW9DQWdJQXdVUTBBR2tLQWdJQ0FNQ0VKUW9DQWdJQXdJUVpDZ0lDQWdEQWhCMEtBZ0lDQU1DRUZJQUFnQ2hCZ0RRRkJBQ0VPUW9DQWdJQXdJQUpCQTBrTkFCb2dBeWtERUFzaEN3SkFBa0FnQUNBRVFkRUJJQVJCQUJBVUlnWkNnSUNBZ0hDRElnVkNnSUNBZ0RCU0JFQWdCVUtBZ0lDQTRBQlJCRUJDZ0lDQWdEQWhDVUtBZ0lDQU1DRUdRb0NBZ0lBd0lRY01Bd3NnQUNBR0VBOGdBQkErSWdkQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0FNQ0VKUW9DQWdJQXdJUVpDZ0lDQWdPQUFJUWNNQXdzZ0JFSWdpS2RCZFU4RVFDQUVweUlDSUFJb0FnQkJBV28yQWdBTElBMGdCRGNERUNBQUlBMUJFR3BCQ0hKQkFCQ1pBeUVDSUEwcEF4Z2hDU0FOS1FNUUlRWWdBZzBDUWdBaEJRTkFJQUFnQmlBSklBMUJCR29RcmdFaUJFS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQUlBMG9BZ1FOQXlBQUlBY2dCU0FFRUdvaEFpQUZRZ0Y4SVFVZ0FrRUFUZzBCQ3d0Q2dJQ0FnREFoQlNBR1FvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQXlBQUlBWkJBUkN0QVJvTUF3dENnSUNBZ0RBaENVS0FnSUNBTUNFR1FvQ0FnSUF3SVFVZ0FDQUVFQ1VpQjBLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDQ3lBQUlBMUJDR29nQnhBOFFRQklEUUFnRFFKK0lBMHBBd2dpQkVLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQkVMLy8vLy9ENE1NQVF0Q2dJQ0FnTUIrSUFTNXZTSUZRb0NBZ0lEQWdZRDgvd0I5SUFWQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3lJSU53TWdJQUFnQVVFQklBMUJJR29RMmdNaEJTQUFJQWdRRHdKQUlBVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFFSUFJUWdnQkVJQUlBUkNBRlViSVF3RFFDQUlJQXhSRFFRZ0FDQUhJQWdRY3lJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFQ1FDQU9CRUFnQkNFQkRBRUxJQTBnQkRjRElDQU5JQWhDLy8vLy93K0ROd01vSUFBZ0NpQUxRUUlnRFVFZ2FoQWhJUUVnQUNBRUVBOGdBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMENDeUFBSUFVZ0NDQUJFSVlCSVFJZ0NFSUJmQ0VJSUFKQkFFNE5BQXNMREFFTFFvQ0FnSUF3SVFVTElBQWdCUkFQUW9DQWdJRGdBQ0VGQ3lBQUlBY1FEeUFBSUFZUUR5QUFJQWtRRHlBTlFUQnFKQUFnQlFzUkFDQUFRUkJxSUFJZ0FDZ0NCQkVBQUF1bkJBSUVmd0YrSXdCQklHc2lCU1FBUW9DQWdJRGdBQ0VKQWtBZ0FDQUJRU0FRU3lJSFJRMEFJQVJCNWFZQmFpMEFBQ0VJSUFBZ0JVRUlhaUFES1FNQUVLWUJEUUFnQXlrRENDRUJJQVZDQURjREdDQUZRUUEyQWhRQ1FDQUVRUnRNQkVBZ0FDQUZRUlJxSUFFUWQwVU5BUXdDQ3lBRVFSMU5CRUFnQUNBRlFSaHFJQUVRL3dSRkRRRU1BZ3NnQUNBRklBRVFRZzBCSUFSQkhrWUVRQ0FGSUFVckF3QzJPQUlVREFFTElBVWdCU2tEQURjREdBdEJBU0VHSUFKQkEwNEVRQ0FBSUFNcEF4QVEvUUZCQVhNaEJnc2dCeWdDRENnQ0lDSUNMUUFFQkVBZ0FCQnJEQUVMSUFjMUFoUWdCU2tEQ0NJQlFRRWdDSFNzZkZRRVFDQUFRZC95QUVFQUVGQU1BUXNnQWFjZ0FpZ0NDQ0FIS0FJUWFtb2hBQUpBQWtBQ1FBSkFBa0FnQkVFV2F3NEtBQUFCQVFJQ0F3TUNBd1FMSUFBZ0JTZ0NGRG9BQUVLQWdJQ0FNQ0VKREFRTElBQWdCUzhCRkNJQVFRaDBJQUJCQ0haeUlBQWdCaHM3QUFCQ2dJQ0FnREFoQ1F3REN5QUFJQVVvQWhRaUFFRVlkQ0FBUVlEK0EzRkJDSFJ5SUFCQkNIWkJnUDREY1NBQVFSaDJjbklnQUNBR0d6WUFBRUtBZ0lDQU1DRUpEQUlMSUFBZ0JTa0RHQ0lCUWppR0lBRkNnUDREZzBJb2hvUWdBVUtBZ1B3SGcwSVloaUFCUW9DQWdQZ1BnMElJaG9TRUlBRkNDSWhDZ0lDQStBK0RJQUZDR0loQ2dJRDhCNE9FSUFGQ0tJaENnUDREZ3lBQlFqaUloSVNFSUFFZ0JoczNBQUJDZ0lDQWdEQWhDUXdCQ3hBQkFBc2dCVUVnYWlRQUlBa0xCZ0JCNk1ZRUM2SUhBZ0YrQkg4akFFRVFheUlISkFCQ2dJQ0FnT0FBSVFVQ1FDQUFJQUZCSUJCTElnaEZEUUFnQkVIbHBnRnFMUUFBSVFrZ0FDQUhRUWhxSUFNcEF3QVFwZ0VOQUVFQklRWWdBa0VDVGdSQUlBQWdBeWtEQ0JEOUFVRUJjeUVHQ3lBSUtBSU1LQUlnSWdJdEFBUUVRQ0FBRUdzTUFRc2dDRFVDRkNBSEtRTUlJZ0ZCQVNBSmRLeDhWQVJBSUFCQjMvSUFRUUFRVUF3QkN5QUJweUFDS0FJSUlBZ29BaEJxYWlFQ0FrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FFUVJackRnb0tBQUVDQXdRRkJnY0lDUXNnQWpFQUFDRUZEQW9MSUFJdkFBQWlBRUVJZENBQVFRaDJjaUFBSUFZYnJjTkMvLy8vL3crRElRVU1DUXNnQWk4QUFDSUFRUWgwSUFCQkNIWnlJQUFnQmh1dFF2Ly9BNE1oQlF3SUN5QUNLQUFBSWdCQkdIUWdBRUdBL2dOeFFRaDBjaUFBUVFoMlFZRCtBM0VnQUVFWWRuSnlJQUFnQmh1dElRVU1Cd3NnQWlnQUFDSUFRUmgwSUFCQmdQNERjVUVJZEhJZ0FFRUlka0dBL2dOeElBQkJHSFp5Y2lBQUlBWWJJZ0JCQUU0RVFDQUFyU0VGREFjTFFvQ0FnSURBZmlBQXVMMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3lFRkRBWUxJQUFnQWlrQUFDSUJRamlHSUFGQ2dQNERnMElvaG9RZ0FVS0FnUHdIZzBJWWhpQUJRb0NBZ1BnUGcwSUlob1NFSUFGQ0NJaENnSUNBK0ErRElBRkNHSWhDZ0lEOEI0T0VJQUZDS0loQ2dQNERneUFCUWppSWhJU0VJQUVnQmhzUWh3SWhCUXdGQ3lBQUlBSXBBQUFpQVVJNGhpQUJRb0QrQTROQ0tJYUVJQUZDZ0lEOEI0TkNHSVlnQVVLQWdJRDRENE5DQ0lhRWhDQUJRZ2lJUW9DQWdQZ1BneUFCUWhpSVFvQ0EvQWVEaENBQlFpaUlRb0QrQTRNZ0FVSTRpSVNFaENBQklBWWJFUHNESVFVTUJBdENnSUNBZ01CK0lBSW9BQUFpQUVFWWRDQUFRWUQrQTNGQkNIUnlJQUJCQ0haQmdQNERjU0FBUVJoMmNuSWdBQ0FHRzc2N3ZTSUJRb0NBZ0lEQWdZRDgvd0I5SUFGQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliSVFVTUF3dENnSUNBZ01CK0lBSXBBQUFpQVVJNGhpQUJRb0QrQTROQ0tJYUVJQUZDZ0lEOEI0TkNHSVlnQVVLQWdJRDRENE5DQ0lhRWhDQUJRZ2lJUW9DQWdQZ1BneUFCUWhpSVFvQ0EvQWVEaENBQlFpaUlRb0QrQTRNZ0FVSTRpSVNFaENBQklBWWJJZ0ZDZ0lDQWdNQ0JnUHovQUgwZ0FVTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzaEJRd0NDeEFCQUFzZ0FqQUFBRUwvLy8vL0Q0TWhCUXNnQjBFUWFpUUFJQVVMVWdJQmZ3RitRb0NBZ0lEZ0FDRUVJQUFnQVNBQ0VKTUJJZ01FZmlBREtBSWdJZ01vQWd3b0FpQXRBQVFFUUNBQ1JRUkFRZ0FQQ3lBQUVHdENnSUNBZ09BQUR3c2dBelVDRkFWQ2dJQ0FnT0FBQ3d2WEFRRURmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBeThCQmtFNVJ3MEFJQU1vQWlBaUJFVU5BQ0FFUWN3QWFpRURJQVJCeUFCcUlRVURRQ0FGSUFNb0FnQWlBMGNFUUNBREtRTVFJZ0ZDZ0lDQWdHQmFCRUFnQUNBQnB5QUNFUUFBQ3lBREtRTVlJZ0ZDZ0lDQWdHQmFCRUFnQUNBQnB5QUNFUUFBQ3lBREtRTWdJZ0ZDZ0lDQWdHQmFCRUFnQUNBQnB5QUNFUUFBQ3lBREtRTW9JZ0ZDZ0lDQWdHQmFCRUFnQUNBQnB5QUNFUUFBQ3lBRFFRUnFJUU1NQVFzTElBUW9BZ1JCZm5GQkJFWU5BQ0FBSUFSQkNHb2dBaER2QXdzTEJnQkI0TVlFQ3pBQkFYOENRQ0FCUW9DQWdJQndWQTBBSUFHbklnSXZBUVpCT1VjTkFDQUNLQUlnSWdKRkRRQWdBQ0FDRUljRkN3c05BQ0FBSUFFZ0FrRTNFUDBGQ3dzQUlBQWdBVUUzRVA0RkN4WUJBWDhnQWFjb0FpQWlBZ1JBSUFBZ0FoQ0lCUXNMTVFFQmZ5QUJweWdDSUNJQ0JFQWdBQ0FDS0FJSUVLTUZJQUFnQWlrREFCQWpJQUJCRUdvZ0FpQUFLQUlFRVFBQUN3dmNBUUVFZndKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQkM4QkJrRXhSdzBBSUFRb0FpQWlCa1VOQUVFQUlRUURRQ0FFUVFKR1JRUkFJQVlnQkVFRGRHb2lCVUVJYWlFRElBVkJCR29oQlFOQUlBVWdBeWdDQUNJRFJ3UkFJQU1wQXdnaUFVS0FnSUNBWUZvRVFDQUFJQUduSUFJUkFBQUxJQU1wQXhBaUFVS0FnSUNBWUZvRVFDQUFJQUduSUFJUkFBQUxJQU1wQXhnaUFVS0FnSUNBWUZvRVFDQUFJQUduSUFJUkFBQUxJQU5CQkdvaEF3d0JDd3NnQkVFQmFpRUVEQUVMQ3lBR0tRTVlJZ0ZDZ0lDQWdHQlVEUUFnQUNBQnB5QUNFUUFBQ3d1TUFRRUZmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBaThCQmtFeFJ3MEFJQUlvQWlBaUJFVU5BQU5BSUFOQkFrWkZCRUFnQkNBRFFRTjBhaUlDUVFScUlRVWdBaWdDQ0NFQ0EwQWdBaUFGUmtVRVFDQUNLQUlFSVFZZ0FDQUNFSzRDSUFZaEFnd0JDd3NnQTBFQmFpRUREQUVMQ3lBQUlBUXBBeGdRSXlBQVFSQnFJQVFnQUNnQ0JCRUFBQXNMSlFBZ0JTa0RBQ0lCUWlDSXAwRjFUd1JBSUFHbklnQWdBQ2dDQUVFQmFqWUNBQXNnQVFzeEFDQUZLUU1BSWdGQ0lJaW5RWFZQQkVBZ0FhY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQUlBRVFpZ0ZDZ0lDQWdPQUFDd1lBUWRqR0JBdllBUUVDZmlNQVFSQnJJZ0lrQUNBRktRTUFJUVlnQWlBQUlBVXBBd2hDZ0lDQWdEQkJBRUVBRUNFaUFUY0RDQUpBSUFGQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBWWdBaUFDUVFocVFRQVEvZ0VoQmlBQUlBSXBBd2dRRHlBR1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0JpRUJEQUVMSUFJZ0FFSFFBRUhSQUNBRUcwRUFRUUJCQVNBREVNOEJJZ2MzQXdCQ2dJQ0FnT0FBSVFFZ0FDQUhRb0NBZ0lCd2cwS0FnSUNBNEFCU0JINGdBQ0FHUWY4QVFRRWdBaEN0QWlFQklBSXBBd0FGSUFZTEVBOExJQUpCRUdva0FDQUJDNklDQVFKK0l3QkJJR3NpQWlRQUlBTXBBd0FoQkFKQUlBQWdBVUtBZ0lDQU1CRGpBU0lGUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFDUUNBQUlBUVFPRVVFUUNBRVFpQ0lwMEYxVHdSQUlBU25JZ01nQXlnQ0FFRUNhallDQUFzZ0FpQUVOd01ZSUFJZ0JEY0RFQXdCQ3lBQ0lBUTNBd2dnQWlBRk53TUFRUUFoQXdOQUlBTkJBa1lOQVNBQ1FSQnFJQU5CQTNScUlBQkJ6d0JCQVNBRFFRSWdBaERQQVNJRU53TUFJQVJDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRQ0FEUVFGR0JFQWdBQ0FDS1FNUUVBOExJQUFnQlJBUFFvQ0FnSURnQUNFRkRBTUZJQU5CQVdvaEF3d0JDd0FMQUFzZ0FDQUZFQThnQUNBQlFmOEFRUUlnQWtFUWFoQ3NBaUVGSUFBZ0Fpa0RFQkFQSUFBZ0Fpa0RHQkFQQ3lBQ1FTQnFKQUFnQlFzNUFDTUFRUkJySWdJa0FDQUNRb0NBZ0lBd053TUFJQUlnQXlrREFEY0RDQ0FBSUFGQi93QkJBaUFDRUt3Q0lRRWdBa0VRYWlRQUlBRUx1QUVDQW40Q2Z5TUFRUkJySWdZa0FBSkFBa0FnQUNBQlFURVFTd1JBSUFBZ0FVS0FnSUNBTUJEakFTSUVRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSWdBQ0FHSUFRUXZ3SWhCU0FBSUFRUUR5QUZRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBQ0FCSUFNZ0JoQ3ZBaUVDQTBBZ0IwRUNSa1VFUUNBQUlBWWdCMEVEZEdvcEF3QVFEeUFIUVFGcUlRY01BUXNMSUFKRkRRRWdBQ0FGRUE4TFFvQ0FnSURnQUNFRURBRUxJQVVoQkFzZ0JrRVFhaVFBSUFRTElBQWdBVUlnaUtkQmRVOEVRQ0FCcHlJQUlBQW9BZ0JCQVdvMkFnQUxJQUVMNVFNQkJYNGpBRUV3YXlJQ0pBQUNRQ0FCUXYvLy8vOXZXQVJBSUFBUUpFS0FnSUNBNEFBaEJRd0JDeUFBSUFKQklHb2dBUkMvQWlJRlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFCQ2dJQ0FnREFoQmtLQWdJQ0FNQ0VFQWtBQ1FDQUFJQUZCZ0FFZ0FVRUFFQlFpQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBSUFBZ0NCQmdEUUFnQUNBREtRTUFRUUFRNXdFaUJFS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQURBRUxJQUFnQkVIcUFDQUVRUUFRRkNJR1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBRFFDQUNJQUFnQkNBR0lBSkJGR29RcmdFaUJ6Y0RHQ0FIUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQWlnQ0ZBMENJQUFnQ0NBQlFRRWdBa0VZYWhBaElRY2dBQ0FDS1FNWUVBOGdCMEtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQUFnQUNBSFFmOEFRUUlnQWtFZ2FoQ3RBaEQ4QVVVTkFRc0xJQUFnQkVFQkVLMEJHZ3NnQUNnQ0VDSURLUU9BQVNFQklBTkNnSUNBZ0NBM0E0QUJJQUlnQVRjRENDQUFJQUlwQXloQ2dJQ0FnREJCQVNBQ1FRaHFFQ0VoQVNBQUlBSXBBd2dRRHlBQUlBVWdBU0FCUW9DQWdJQndnMEtBZ0lDQTRBQlJJZ01iRUE5Q2dJQ0FnT0FBSUFVZ0F4c2hCUXNnQUNBSUVBOGdBQ0FHRUE4Z0FDQUVFQThnQUNBQ0tRTWdFQThnQUNBQ0tRTW9FQThMSUFKQk1Hb2tBQ0FGQ3g0QUlBQWdBVFlDY0NBQUlBRUVmeUFBS0FKMElBRnJCVUVBQ3pZQ2VBdnpBd0lGZmdGL0l3QkJJR3NpQWlRQUlBQWdCU2tEQUJEOUFTRUxJQUlnQlNrREVDSUlOd01ZSUFVcEF5QWhDaUFGS1FNWUlRa0NRQUpBSUFBZ0FrRVVhaUFGS1FNSUVIY05BQUpBSUFzTkFDQUZRb0dBZ0lBUU53TUFBa0FnQkVFRGNTSUZRUUZHQkVCQ2dJQ0FnT0FBSVFFZ0FCQTBJZ1pDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQUpBSUFCQjd2Y0FRYjc2QUNBRVFRUnhJZ1FiRUdJaUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdCa0dJQVNBSFFRY1FHVUVBU0EwQUlBTXBBd0FpQjBJZ2lLZEJkVThFUUNBSHB5SURJQU1vQWdCQkFXbzJBZ0FMSUFBZ0JrR0pBVUhBQUNBRUd5QUhRUWNRR1VFQVRnMENDeUFBSUFZUUR3d0VDeUFES1FNQUlnWkNJSWluUVhWSkRRQWdCcWNpQXlBREtBSUFRUUZxTmdJQUN5QUFJQWdnQWlnQ0ZDQUdRUWNRcndGQkFFZ05BVUtBZ0lDQTRBQWhBU0FBSUFwQmZ4RGVBeUlEUVFCSURRSWdBMFVOQUFKQUlBVkJBa1lFUUNBQ0lBQWdDQkNDQlNJR053TUlJQVpDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5CQ0FBSUFsQ2dJQ0FnREJCQVNBQ1FRaHFFQ0VoQVNBQUlBSXBBd2dRRHd3QkN5QUFJQWxDZ0lDQWdEQkJBU0FDUVJocUVDRWhBUXNnQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBZ0FSQVBDMEtBZ0lDQU1DRUJEQUVMUW9DQWdJRGdBQ0VCQ3lBQ1FTQnFKQUFnQVF1cENBSURmdzErSXdCQjhBQnJJZ1VrQUNBRlFvQ0FnSUF3TndOUUFrQWdBVUwvLy8vL2IxZ0VRQ0FBRUNSQ2dJQ0FnT0FBSVF3TUFRc2dBQ0FGUWVBQWFpQUJFTDhDSWd4Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQUVLQWdJQ0FNQ0VOUW9DQWdJQXdJUWhDZ0lDQWdEQWhDd0pBQWtBZ0FDQUJRWUFCSUFGQkFCQVVJaEpDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUJJUVlBMEFBa0FnQUNBREtRTUFRUUFRNXdFaUMwS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQURBRUxJQUFnQzBIcUFDQUxRUUFRRkNJTlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0JTQUFFRDRpRGpjRFVDQU9Rb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQkErSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUVLQWdJQ0E0QUFoQ0F3Q0N5QUFJQWhDQUVJQlFRY1F2UUZCQUVnTkFTQUZRZUFBYWlBRVFRSkdRUU4wY2lFR0lBVXBBMkFpRTBJZ2lLZEJkRXNoQnlBRktRTm9JaFJDSUlpblFYVkpJUU1DUUFKQUFrQURRQ0FGSUFBZ0N5QU5JQVZCREdvUXJnRWlDVGNEV0NBSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFVZ0JTZ0NERVVFUUNBQUlCSWdBVUVCSUFWQjJBQnFFQ0VoRVNBQUlBVXBBMWdRRHlBUlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFRZ0JTQU9Od01nSUFVZ0VEY0RHQ0FGUW9DQWdJQVFOd01RSUFZcEF3QWhDU0FGSUFnM0F6QWdCU0FKTndNb0lBQkJ6Z0JCQVNBRVFRVWdCVUVRYWhEUEFTSUtRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRSUNRQ0FFUVFGR0JFQWdDaUVQSUFCQnpnQkJBVUVGUVFVZ0JVRVFhaERQQVNJS1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFRTUFRc0NRQ0FFUVFKR0JFQWdBQ0FPSUJDblFvQ0FnSUF3UVFjUXJ3RkJBRWdOQnlBVElna2hEeUFIRFFFTUFnc2dDaUVQSUJRaUNTRUtJQU1OQVFzZ0NhY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBQUlBaEJBUkRlQTBFQVNBUkFJQUFnRVJBUElBQWdEeEFQREFRTElBVWdDamNEU0NBRklBODNBMEFnQUNBUlFmOEFRUUlnQlVGQWF4Q3RBaUVKSUFBZ0R4QVBJQUFnQ2hBUElCQkNBWHdoRUNBQUlBa1EvQUZGRFFFTUJBc0xJQUFnQ0VGL0VONERJZ0pCQUVnTkJDQUNSUTBGSUFSQkFrWUVRQ0FBSUE0UWdnVWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVRMEZJQUFnRGhBUElBVWdBVGNEVUFzZ0FDQUFJQVlwQXdCQ2dJQ0FnREJCQVNBRlFkQUFhaEFoRVB3QkRRUU1CUXNnRVNFS0N5QUFJQW9RRHdzZ0FDQUxRUUVRclFFYURBRUxDeUFBS0FJUUlnSXBBNEFCSVFFZ0FrS0FnSUNBSURjRGdBRWdCU0FCTndNQUlBQWdCU2tEYUNJVVFvQ0FnSUF3UVFFZ0JSQWhJUUVnQUNBRktRTUFFQThnQUNBTUlBRWdBVUtBZ0lDQWNJTkNnSUNBZ09BQVVTSUNHeEFQUW9DQWdJRGdBQ0FNSUFJYklRd2dCU2tEWUNFVEN5QUFJQklRRHlBQUlBZ1FEeUFBSUFVcEExQVFEeUFBSUEwUUR5QUFJQXNRRHlBQUlCTVFEeUFBSUJRUUR3c2dCVUh3QUdva0FDQU1DeUFBSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBQ0FBS0FJQVFRRnFOZ0lBQ3lBQkN6UUFJQU1wQXdBaUFVSWdpS2RCZFU4RVFDQUJweUlDSUFJb0FnQkJBV28yQWdBTElBQWdBU0FBSUFVcEF3QVEvUUVRL3dJTG9BWUNBbjhEZmlNQVFVQnFJZ1VrQUVLQWdJQ0E0QUFoQndKQUlBQWdCVUVnYWhETkFpSUlRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQUNRQ0FBSUFWQklHb0Nmd0pBQWtBQ1FBSkFJQUZDZ0lDQWdIQlVEUUFnQWFjaUJpOEJCa0UzUncwQUlBWW9BaUFpQmcwQkN5QUFRZlErUVFBUUZRd0JDd0pBSUFSRkJFQWdCaWtEQ0NJSFFpQ0lwMEYxU1EwQklBZW5JZ1FnQkNnQ0FFRUJhallDQUF3QkN5QUFJQVlwQXdBaUFVRUdRUmNnQkVFQlJoc2dBVUVBRUJRaUIwS0FnSUNBY0lNaUFVS0FnSUNBSUZJRVFDQUJRb0NBZ0lEZ0FGRU5BaUFCUW9DQWdJQXdVZzBCQ3lBREtRTUFJZ0ZDSUlpbklRSWdCRUVCUmdSQUlBSkJkVThFUUNBQnB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFVZ0FDQUJRUUVRL3dJM0F3QkJBQXdFQ3lBQ1FYVlBCRUFnQWFjaUFpQUNLQUlBUVFGcU5nSUFDd3dDQ3lBRklBQWdCaWtEQUNBSElBSkJBRW9nQXlBRlFSUnFFTWNGSWdFM0F4Z2dBQ0FIRUE4Z0FVS0FnSUNBY0lNaUIwS0FnSUNBNEFCUkRRQWdCU2dDRkVFQ1JnUkFJQVVnQUNBQklBVkJGR29RMndVaUJ6Y0RHQ0FBSUFFUUR5QUhRb0NBZ0lCd2d5SUhRb0NBZ0lEZ0FGRU5BUXNnQjBLQWdJQ0E0QUJSRFFBZ0FDQUFLUU5RSUFVZ0JVRVlha0VBRVA0QklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUFJQVVwQXhnUUR3d0JDeUFGSUFVb0FoUkJBRWV0UW9DQWdJQVFoRGNET0NBRklBQkJ6UUJCQVVFQVFRRWdCVUU0YWhEUEFTSUpOd01BUW9DQWdJRGdBQ0VISUFsQ2dJQ0FnSENEUW9DQWdJRGdBRklFUUNBQUlBVXBBeGdRRHlBRlFvQ0FnSUF3TndNSUlBQWdBU0FGSUFWQklHb1Fyd0loQWlBQUlBa1FEeUFBSUFFUUR5QUFJQVVwQXlBUUR5QUFJQVVwQXlnUUR5QUNSUTBFSUFBZ0NCQVBEQVVMSUFBZ0FSQVBJQUFnQlNrREdCQVBJQUFnQlNrRElCQVBJQUFnQlNrREtCQVBJQUFnQ0JBUERBUUxJQUFvQWhBaUFpa0RnQUVoQVNBQ1FvQ0FnSUFnTndPQUFRc2dCU0FCTndNQVFRRUxRUU4wY2lrREFFS0FnSUNBTUVFQklBVVFJU0VCSUFBZ0JTa0RBQkFQSUFBZ0FSQVBJQUFnQlNrRElCQVBJQUFnQlNrREtCQVBDeUFJSVFjTElBVkJRR3NrQUNBSEM5QUNBZ04rQW44akFFRVFheUlHSkFBZ0FVRUZSZ1JBSUFJcEF4QWhCQ0FBSUFJcEF4Z1EvUUVoQnlBR0lBSXBBeUFpQXpjRENBSi9Ba0FDUUNBRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVFUUNBRFFpQ0lweUVCSUFjRVFDQUJRWFZQQkVBZ0E2Y2lBU0FCS0FJQVFRRnFOZ0lBQ3lBQUlBTVFpZ0VNQXdzZ0FVRjFTUTBCSUFPbklnRWdBU2dDQUVFQmFqWUNBQXdCQ3lBQUlBUkNnSUNBZ0RCQkFTQUdRUWhxRUNFaEF3c2dCaUFETndNQVFRQWdBMEtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJHZ3NnQUNnQ0VDSUJLUU9BQVNFRElBRkNnSUNBZ0NBM0E0QUJJQVlnQXpjREFFRUJDeUVCUW9DQWdJQXdJUVFnQUNBQ0lBRkJBM1JxS1FNQUlnVkNnSUNBZ0hDRFFvQ0FnSUF3VWdSK0lBQWdCVUtBZ0lDQU1FRUJJQVlRSVNFRUlBWXBBd0FGSUFNTEVBOGdCa0VRYWlRQUlBUVBDMEdlaWdGQnJ2d0FRZGZwQWtIOS9BQVFBQUFMbmdJQkFYOUJBQ0VDQWtBZ0JTa0RBQ0lCUW9DQWdJQndWQTBBSUFHbklnVXZBUVpCT1VjTkFDQUZLQUlnSVFJTElBUkJBWEVoQlNBQ0tBSUVJUVlnQXlrREFDRUJBa0FDUUFKQUlBUkJBazRFUUNBR1FYNXhRUVJIRFFJZ0FrRUZOZ0lFSUFVRVFDQUFJQUlvQWt3Z0FSRGZBd3dDQ3lBQUlBSWdBVUVCRVBvQ0RBRUxJQVpCQTBjTkFpQUNJQVUyQWhRZ0FVSWdpS2NoQXdKQUlBVUVRQ0FEUVhWUEJFQWdBYWNpQXlBREtBSUFRUUZxTmdJQUN5QUFJQUVRaWdFTUFRc2dBMEYxVHdSQUlBR25JZ01nQXlnQ0FFRUJhallDQUFzZ0FpZ0NSRUVJYXlBQk53TUFDeUFBSUFJUWhRVUxRb0NBZ0lBd0R3dEI1NGNCUWE3OEFFSFRtUUZCMmNzQUVBQUFDMEhCaFFGQnJ2d0FRZHlaQVVIWnl3QVFBQUFMamdNQ0FuOENmaU1BUVNCcklnSWtBQUpBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lCUzhCQmtFNVJ3MEFJQVVvQWlBaEJnc0NRQ0FBSUFKQkVHb1F6UUlpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBSUFaRkJFQWdBRUg0TDBFQUVCVWdBQ2dDRUNJREtRT0FBU0VISUFOQ2dJQ0FnQ0EzQTRBQklBSWdCemNEQ0NBQUlBSXBBeGdpQjBLQWdJQ0FNRUVCSUFKQkNHb1FJU0VJSUFBZ0Fpa0RDQkFQSUFBZ0NCQVBJQUFnQWlrREVCQVBJQUFnQnhBUERBSUxJQUJCTUJCZklnVUVRQ0FGSUFRMkFnZ2dBeWtEQUNJSFFpQ0lwMEYxVHdSQUlBZW5JZ01nQXlnQ0FFRUJhallDQUFzZ0JTQUhOd01RSUFGQ0lJaW5RWFZQQkVBZ0FhY2lBeUFES0FJQVFRRnFOZ0lBQ3lBRklBRTNBeGdnQlNBQ0tRTVFOd01nSUFVZ0Fpa0RHRGNES0NBR0tBSklJZ01nQlRZQ0JDQUZJQVpCeUFCcU5nSUVJQVVnQXpZQ0FDQUdJQVUyQWtnZ0JpZ0NCRUVEUmcwQ0lBQWdCaENGQlF3Q0N5QUFJQUlwQXhBUUR5QUFJQUlwQXhnUUR5QUFJQUVRRHd0Q2dJQ0FnT0FBSVFFTElBSkJJR29rQUNBQkM5c0JBZ0YvQW40akFFRWdheUlESkFBZ0FVRURSZ1JBSUFJcEF4QWhCQ0FDS1FNSUlRVUNRQ0FBSUFOQkVHb2dBaWtEQUJDa0JVRUFTQVJBUW9DQWdJRGdBQ0VFREFFTElBQWdCQ0FGUVFJZ0EwRVFhaEFoSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQUtBSVFJZ0VwQTRBQklRUWdBVUtBZ0lDQUlEY0RnQUVnQXlBRU53TUlJQUFnQXlrREdFS0FnSUNBTUVFQklBTkJDR29RSVNFRUlBQWdBeWtEQ0JBUEN5QUFJQU1wQXhBUUR5QUFJQU1wQXhnUUR3c2dBMEVnYWlRQUlBUVBDMEh3aWdGQnJ2d0FRYnZxQWtHUy9RQVFBQUFMRXdBZ0FDZ0NBQ0FCSUFJZ0FDZ0NCQkVCQUFzSkFDQUFJQUVRandVTGRBSUJmZ0YvSUFBZ0FSQ1BCU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQVE4TFFRb2hCUUorQWtBZ0FrVU5BQ0FES1FNQUlnUkNnSUNBZ0hDRFFvQ0FnSUF3VVEwQUlBQWdCQkNPQlNJRlFRQk9EUUJDZ0lDQWdPQUFEQUVMSUFBZ0FTQUZFSm9GQ3lFRUlBQWdBUkFQSUFRTHpSQUNDbjhDZmlNQVFhQUlheUlCSkFBQ2YwR0FDQkN4QVNJSUlRUkJ4aUpCS3hDbUF5RUZBa0FDUUVIVS9RQkI5d0FRcGdORkJFQkJvTlFFUVJ3MkFnQU1BUXRCc0FsQnNCRWdCQnNRc1FFaUFnMEJDMEVBREFFTElBSkJBRUdrQVJBckdpQUNRWDgyQWxBZ0FrRi9OZ0k4SUFJZ0FrR1FBV28yQWxRZ0FrR0FDRFlDTUNBQ0lBSkJyQUZxTmdJc0lBUkZCRUFnQWtHc0NXb2lCRUVBUVlBSUVDc2FDeUFDUWZjQU5nS2dBU0FDUVlBSU5nS1lBU0FDSUFRMkFwd0JBa0FnQlVVRVFDQUNRUVEyQWdBTUFRc2dCRUVBT2dBQUN5QUNRUUUyQWlnZ0FrRUNOZ0lrSUFKQkF6WUNJQ0FDUVFRMkFneEJyZFVFTFFBQVJRUkFJQUpCZnpZQ1RBc2dBa0drMUFRb0FnQWlCRFlDT0NBRUJFQWdCQ0FDTmdJMEMwR2sxQVFnQWpZQ0FDQUNDeUVDSUFBZ0FVR2dCR29RbUFVZ0FVRWdOZ0tRQkNBQklBRTBBcWdFTndPWUJDQUNRZjJkQVNBQlFaQUVhaENVQVNBQUJFQWdBRUVRYWlFRkEwQWdBMEVGUndSQUlBVWdBMEVEZENJSlFiU2tBV29vQWdBaUJDQUFLQUlBRVFNQUlnWUVRQ0FFSUFZZ0FDZ0NEQkVFQUNJS1RRUkFJQUVnQ1VHd3BBRnFLQUlBTmdLSUJDQUJJQVEyQW9BRUlBRWdDaUFFYXpZQ2hBUWdBa0cvbWdFZ0FVR0FCR29RbEFGQkFTRUhDeUFGSUFZZ0FDZ0NCQkVBQUFzZ0EwRUJhaUVEREFFTEN5QUhSUVJBUWRHYUFVRWhJQUlRb3dZTElBRkJzQVpxUVFCQjdBRVFLeG9nQUVIVUFHb2hBeUFBUWRBQWFpRUVBMEFnQkNBREtBSUFJZ05IQkVBZ0EwRUVheTBBQUVFUGNVVUVRQ0FCUWJBR2FrRTZJQU5CQW1zdkFRQWlCU0FGUVRwUEcwRUNkR29pQlNBRktBSUFRUUZxTmdJQUN5QURRUVJxSVFNTUFRc0xRUUVoQTBHTW1nRkJFaUFDRUtNR0lBRW9BckFHSWdRRVFDQUJRZVRrQURZQytBTWdBVUVBTmdMMEF5QUJJQVEyQXZBRElBSkJycG9CSUFGQjhBTnFFSlFCQ3dOQUlBTkJPa2NFUUNBQlFiQUdhaUFEUVFKMGFpZ0NBQ0lFQkVBZ0FTQUFJQUZCOEFWcUlBTkJER3hCaEo4QmFpZ0NBQkNHQlRZQzZBTWdBU0FETmdMa0F5QUJJQVEyQXVBRElBSkJycG9CSUFGQjRBTnFFSlFCQ3lBRFFRRnFJUU1NQVFzTElBRW9BcGdJSWdBRVFDQUJRY3JGQURZQzJBTWdBVUVBTmdMVUF5QUJJQUEyQXRBRElBSkJycG9CSUFGQjBBTnFFSlFCQ3dKQUFrQWdBaWdDVENJQVFRQk9CRUFnQUVVTkFVSEExQVFvQWdBZ0FFSC8vLy8vZTNGSERRRUxBa0FnQWlnQ1VFRUtSZzBBSUFJb0FoUWlBQ0FDS0FJUVJnMEFJQUlnQUVFQmFqWUNGQ0FBUVFvNkFBQU1BZ3NnQWhEVEJBd0JDeUFDSUFJb0Frd2lBRUgvLy8vL0F5QUFHellDVEFKQUFrQWdBaWdDVUVFS1JnMEFJQUlvQWhRaUFDQUNLQUlRUmcwQUlBSWdBRUVCYWpZQ0ZDQUFRUW82QUFBTUFRc2dBaERUQkFzZ0FpZ0NUQm9nQWtFQU5nSk1Dd3NnQVVHV2hnRTJBc2dESUFGQnY0RUJOZ0xFQXlBQlFhK0dBVFlDd0FNZ0FrR2ZtZ0VnQVVIQUEyb1FsQUVnQVNrRHVBUWlDMUJGQkVBZ0FTQUJLUU9nQkNJTU53T3dBeUFCSUFzM0E2Z0RJQUVnRExrZ0M3bWpPUU80QXlBQlFmZjNBRFlDb0FNZ0FrSFRuQUVnQVVHZ0Eyb1FwQUVnQVVFSU5nS0lBeUFCSUFFcEE3QUVJZ3MzQTRBRElBRWdBU2tEb0FRZ0MzMjVJQUVwQThBRUlndTVvemtEa0FNZ0FVR0krQUEyQXZBQ0lBRWdDemNEK0FJZ0FrSDVuQUVnQVVId0Ftb1FwQUVMSUFFcEE4Z0VJZ3RRUlFSQUlBRWdBU2tEMEFRaUREY0Q0QUlnQVNBTE53UFlBaUFCSUF5NUlBdTVvemtENkFJZ0FVSExOellDMEFJZ0FrR3VuQUVnQVVIUUFtb1FwQUVMSUFFcEE5Z0VJZ3RRUlFSQUlBRWdBU2tENEFRaUREY0R3QUlnQVNBTE53TzRBaUFCSUF5NUlBdTVvemtEeUFJZ0FVR3ZPRFlDc0FJZ0FrR3duUUVnQVVHd0Ftb1FwQUVMSUFFcEErZ0VJZ3RRUlFSQUlBRWdBU2tEOEFRaUREY0RvQUlnQVNBTE53T1lBaUFCSUF5NUlBdTVvemtEcUFJZ0FVR3FORFlDa0FJZ0FrSGVtd0VnQVVHUUFtb1FwQUVnQVNBQktRT0FCVGNEZ0FJZ0FTQUJLUVA0QkNJTHVTQUJLUVBvQkxtak9RT0lBaUFCUWRRNk5nTHdBU0FCSUFzM0EvZ0JJQUpCM3BzQklBRkI4QUZxRUtRQklBRWdBU2tEa0FVaUN6Y0Q0QUVnQVNBTHVTQUJLUU9JQlNJTHVhTTVBK2dCSUFGQnZEazJBdEFCSUFFZ0N6Y0QyQUVnQWtIWG5RRWdBVUhRQVdvUXBBRUxBa0FnQVNrRG1BVWlDMUFOQUNBQklBRXBBNkFGTndQQUFTQUJRZlEyTmdLd0FTQUJJQXMzQTdnQklBSkJnSnNCSUFGQnNBRnFFSlFCSUFFZ0FTa0RxQVVpQ3pjRG9BRWdBU0FMdVNBQktRT1lCU0lMdWFNNUE2Z0JJQUZCc08wQU5nS1FBU0FCSUFzM0E1Z0JJQUpCaFp3QklBRkJrQUZxRUtRQklBRXBBN0FGSWd0UURRQWdBU0FCS1FPNEJTSU1Od09BQVNBQklBczNBM2dnQVNBTXVTQUx1YU01QTRnQklBRkJsZVVBTmdKd0lBSkJoWndCSUFGQjhBQnFFS1FCQ3lBQktRUEFCU0lMVUVVRVFDQUJJQXMzQTJnZ0FVR0hOellDWUNBQ1FmT2FBU0FCUWVBQWFoQ1VBUXNDUUNBQktRUElCU0lMVUEwQUlBRWdDemNEV0NBQlFla3lOZ0pRSUFKQjg1b0JJQUZCMEFCcUVKUUJJQUVwQTlBRklndFFEUUFnQVNBTE53TklJQUZCNGpJMkFrQWdBa0h6bWdFZ0FVRkFheENVQVNBQklBRXBBOWdGSWd0Q0E0WTNBekFnQVNBTHVTQUJLUVBRQmJtak9RTTRJQUZCL3pNMkFpQWdBU0FMTndNb0lBSkJzNXNCSUFGQklHb1FwQUVMSUFFcEErQUZJZ3RRUlFSQUlBRWdBU2tENkFVM0F4QWdBVUdqTkRZQ0FDQUJJQXMzQXdnZ0FrR0Ftd0VnQVJDVUFRc2dBaWdDVEJvZ0FoQ2xBeG9nQWlBQ0tBSU1FUVFBR2lBQ0xRQUFRUUZ4UlFSQUlBSW9BalFpQUFSQUlBQWdBaWdDT0RZQ09Bc2dBaWdDT0NJREJFQWdBeUFBTmdJMEN5QUNRYVRVQkNnQ0FFWUVRRUdrMUFRZ0F6WUNBQXNnQWlnQ1lCQ2JBU0FDRUpzQkN5QUJRYUFJYWlRQUlBZ0xtQUVCQVg4akFFRWdheUlGSkFBQ1FDQUFJQVZCREdvZ0F5a0RBQkM3QVNJQ0JINENRQUpBQWtBZ0JBNENBQUVFQzBKL0lRRWdBaWdDQkEwQklBSW9BZ2dpQTBFQVRBMEJJQU5CQVd1dElRRU1BUXRDZnlFQklBSW9BZ2hCZ0lDQWdIaEdEUUFnQWhDeEFxd2hBUXNnQUNBQ0lBVkJER29RWGlBQUlBRVFod0lGUW9DQWdJRGdBQXNoQVNBRlFTQnFKQUFnQVE4TEVBRUFDL29CQWdOK0FYOGpBRUVnYXlJQ0pBQkNnSUNBZ09BQUlRRUNRQ0FBRUpjQklnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFFSmNCSWdaQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUFKQUlBQWdBa0VNYWlBREtRTUFFTHNCSWdORkRRQWdCYWRCQkdvZ0JxZEJCR29nQXhDUkJTRUlJQUFnQXlBQ1FReHFFRjRnQ0VFdmNRUkFJQUFnQ0JDRUFnd0JDeUFBSUFVUXpRRWhCU0FFQkVBZ0FCQStJZ2RDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BU0FBSUFkQkFDQUZFS1VCR2lBQUlBZEJBU0FBSUFZUXpRRVFwUUVhSUFjaEFRd0NDeUFBSUFZUUR5QUZJUUVNQVFzZ0FDQUZFQThnQUNBR0VBOExJQUpCSUdva0FDQUJDNjRDQWdOK0FuOGpBRUV3YXlJQ0pBQkNnSUNBZ09BQUlRRUNRQ0FBRUpjQklnVkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFBSkFJQUFRbHdFaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdBa0VjYWlBREtRTUFFTHNCSWdoRkRRQWdBQ0FDUVFocUlBTXBBd2dRdXdFaUEwVUVRQ0FBSUFnZ0FrRWNhaEJlREFFTElBV25RUVJxSUFhblFRUnFJQWdnQXlBRVFROXhFT1FESVFrZ0FDQUlJQUpCSEdvUVhpQUFJQU1nQWtFSWFoQmVJQWtFUUNBQUlBa1FoQUlNQVFzZ0FDQUZFTTBCSVFVZ0JFRVFjUVJBSUFBUVBpSUhRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWdBQ0FIUVFBZ0JSQ2xBUm9nQUNBSFFRRWdBQ0FHRU0wQkVLVUJHaUFISVFFTUFnc2dBQ0FHRUE4Z0JTRUJEQUVMSUFBZ0JSQVBJQUFnQmhBUEN5QUNRVEJxSkFBZ0FRdkRBZ0lCZmdKL0l3QkJNR3NpQWlRQVFvQ0FnSURnQUNFQkFrQWdBQ0FDUVNocUlBTXBBd0FRcGdFTkFDQUFFSmNCSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBQUlBSkJGR29nQXlrRENCQzdBU0lHUlFSQUlBQWdCUkFQREFFTElBQW9BdGdCSVFNZ0FrSUFOd0lNSUFKQ2dJQ0FnSUNBZ0lDQWZ6Y0NCQ0FDSUFNMkFnQWdBa0lCRURBYUlBSWdBaWtES0NJQnB5SUhRZi8vLy84RFFRRVF6QUVhSUFJZ0FrSi9RZi8vLy84RFFRRVFkUm9nQmFkQkJHb2lBeUFHSUFJUWt3VWFBa0FnQkVVZ0FWQnlEUUFnQWtJQkVEQWFJQUlnQjBFQmEwSC8vLy8vQTBFQkVNd0JHaUFESUFJUTB3RkJBRWdOQUNBQ1FnRVFNQm9nQWlBSFFmLy8vLzhEUVFFUXpBRWFJQU1nQXlBQ1FmLy8vLzhEUVFFUTVBRWFDeUFDRUJzZ0FDQUdJQUpCRkdvUVhpQUFJQVVRelFFaEFRc2dBa0V3YWlRQUlBRUw2aE1DQW40QmZ5TUFRZEFCYXlJRUpBQWdBQ0FFRUpnRklBRWdBUkEwSWdOQnFpMENmaUFFS1FNSUlnSkNnSUNBZ0FoOFF2Ly8vLzhQV0FSQUlBSkMvLy8vL3crRERBRUxRb0NBZ0lEQWZpQUN1YjBpQWtLQWdJQ0F3SUdBL1A4QWZTQUNRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c1FRQ0FCSUFOQjMrQUFBbjRnQkNrREVDSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFib3FBbjRnQkNrREdDSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFhZ3FBbjRnQkNrRElDSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFmb29BbjRnQkNrREtDSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFmcmZBQUorSUFRcEF6QWlBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFFZ0EwSFlLQUorSUFRcEF6Z2lBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFFZ0EwRzIzd0FDZmlBRUtRTkFJZ0pDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQUpDLy8vLy93K0REQUVMUW9DQWdJREFmaUFDdWIwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUUNBQklBTkJ6U2tDZmlBRUtRTklJZ0pDZ0lDQWdBaDhRdi8vLy84UFdBUkFJQUpDLy8vLy93K0REQUVMUW9DQWdJREFmaUFDdWIwaUFrS0FnSUNBd0lHQS9QOEFmU0FDUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUUNBQklBTkJsK0FBQW40Z0JDa0RVQ0lDUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FDUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQXJtOUlnSkNnSUNBZ01DQmdQei9BSDBnQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUVBZ0FTQURRZUlvQW40Z0JDa0RXQ0lDUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FDUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQXJtOUlnSkNnSUNBZ01DQmdQei9BSDBnQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUVBZ0FTQURRYy9mQUFKK0lBUXBBMkFpQWtLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQWtMLy8vLy9ENE1NQVF0Q2dJQ0FnTUIrSUFLNXZTSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCQUlBRWdBMEdHS2dKK0lBUXBBMmdpQWtLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQWtMLy8vLy9ENE1NQVF0Q2dJQ0FnTUIrSUFLNXZTSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCQUlBRWdBMEd0NEFBQ2ZpQUVLUU53SWdKQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFKQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBQ3ViMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVFDQUJJQU5CeHlvQ2ZpQUVLUU40SWdKQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFKQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBQ3ViMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVFDQUJJQU5COE9BQUFuNGdCQ2tEZ0FFaUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkFJQUVnQTBITjRBQUNmaUFFS1FPSUFTSUNRb0NBZ0lBSWZFTC8vLy8vRDFnRVFDQUNRdi8vLy84UGd3d0JDMEtBZ0lDQXdINGdBcm05SWdKQ2dJQ0FnTUNCZ1B6L0FIMGdBa0wvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xFRUFnQVNBRFFaSXFBbjRnQkNrRGtBRWlBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFFZ0EwRzQ0QUFDZmlBRUtRT1lBU0lDUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FDUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQXJtOUlnSkNnSUNBZ01DQmdQei9BSDBnQWtMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMRUVBZ0FTQURRZFVxQW40Z0JDa0RvQUVpQWtLQWdJQ0FDSHhDLy8vLy93OVlCRUFnQWtMLy8vLy9ENE1NQVF0Q2dJQ0FnTUIrSUFLNXZTSUNRb0NBZ0lEQWdZRDgvd0I5SUFKQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3hCQUlBRWdBMEh2SndKK0lBUXBBNmdCSWdKQ2dJQ0FnQWg4UXYvLy8vOFBXQVJBSUFKQy8vLy8vdytEREFFTFFvQ0FnSURBZmlBQ3ViMGlBa0tBZ0lDQXdJR0EvUDhBZlNBQ1F2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3dzUVFDQUJJQU5CNmljQ2ZpQUVLUU93QVNJQ1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBQ1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0FybTlJZ0pDZ0lDQWdNQ0JnUHovQUgwZ0FrTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTEVFQWdBU0FEUWVzekFuNGdCQ2tEdUFFaUFrS0FnSUNBQ0h4Qy8vLy8vdzlZQkVBZ0FrTC8vLy8vRDRNTUFRdENnSUNBZ01CK0lBSzV2U0lDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkFJQUVnQTBIN0p3SitJQVFwQThBQklnSkNnSUNBZ0FoOFF2Ly8vLzhQV0FSQUlBSkMvLy8vL3crRERBRUxRb0NBZ0lEQWZpQUN1YjBpQWtLQWdJQ0F3SUdBL1A4QWZTQUNRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3c1FRQ0FCSUFOQm85OEFBbjRnQkNrRHlBRWlBa0tBZ0lDQUNIeEMvLy8vL3c5WUJFQWdBa0wvLy8vL0Q0TU1BUXRDZ0lDQWdNQitJQUs1dlNJQ1FvQ0FnSURBZ1lEOC93QjlJQUpDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJBSUFNUVV5RUFJQVJCMEFGcUpBQWdBQXVmQWdFRGZpQUJRdi8vLy85dldBUkFJQUFRSkVLQWdJQ0E0QUFQQzBLQWdJQ0E0QUFoQlFKK0lBQWdBVUUySUFGQkFCQVVJZ1JDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUJCbEFFUUxRd0JDeUFBSUFRUU53c2lCRUtBZ0lDQWNJTWlCa0tBZ0lDQTRBQlNCSDRDZmlBQUlBRkJNeUFCUVFBUUZDSUJRb0NBZ0lCd2cwS0FnSUNBTUZFRVFDQUFRUzhRTFF3QkN5QUFJQUVRTndzaUFVS0FnSUNBY0lNaUJVS0FnSUNBNEFCUkJFQWdBQ0FFRUE5Q2dJQ0FnT0FBRHdzQ1FDQUdRb0NBZ0lDUWYxRUVRQ0FFcHlnQ0JFSC8vLy8vQjNGRkRRRUxJQVZDZ0lDQWdKQi9VUVJBSUFHbktBSUVRZi8vLy84SGNVVU5BUXNnQUVITW5nRWdCRUg0bVFFUXZnRWhCQXNnQUNBRUlBRVF4QUlGUW9DQWdJRGdBQXNMWHdFQmZ3SkFJQUZGQkVBZ0FrVU5BU0FBSUFJUTJRTVBDeUFDUlFSQUlBQWdBQ2dDQUVFQmF6WUNBQ0FBSUFBb0FnUkJDR3MyQWdRZ0FSQ2JBUXdCQ3lBQUtBSUlJQUFvQWdRZ0FtcFBCSDhnQVNBQ0VQTUZCVUVBQ3c4TFFRQUxKZ0FnQVFSQUlBQWdBQ2dDQUVFQmF6WUNBQ0FBSUFBb0FnUkJDR3MyQWdRZ0FSQ2JBUXNMQ1FBZ0FDQUJOZ0lZQ3lnQkFYOENRQ0FCcHlnQ0lDSURSUTBBSUFNb0FnQkJCRVlOQUNBQUlBTkJDR29nQWhEdkF3c0xQd0VCZndKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQWk4QkJrRXZSdzBBSUFJb0FpQWlBa1VOQUNBQUlBSVE3QU1nQUVFUWFpQUNJQUFvQWdRUkFBQUxDMGNCQVg4Q1FDQUJweWdDSUNJRFJRMEFJQU1wQXdBaUFVS0FnSUNBWUZvRVFDQUFJQUduSUFJUkFBQUxJQU1wQXdnaUFVS0FnSUNBWUZRTkFDQUFJQUduSUFJUkFBQUxDekFCQVg4Z0FhY29BaUFpQWdSQUlBQWdBaWtEQUJBaklBQWdBaWtEQ0JBaklBQkJFR29nQWlBQUtBSUVFUUFBQ3dzbkFRRi9JQUduS0FJZ0lnSUVRQ0FBSUFJcEF3QVFJeUFBUVJCcUlBSWdBQ2dDQkJFQUFBc0xXZ0VDZnlBQnB5Z0NJQ0lDQkVBQ1FDQUNLUU1BSWdGQ2dJQ0FnSEJVRFFBZ0FhY3RBQVZCQW5FTkFDQUNLQUlNSWdORkRRQWdBQ0FERU9vRElBSXBBd0FoQVFzZ0FDQUJFQ01nQUVFUWFpQUNJQUFvQWdRUkFBQUxDM2dCQTM4Q1FDQUJweWdDSUNJRVJRMEFJQVJCQ0dvaEF5QUVRUVJxSVFVRFFDQURLQUlBSWdNZ0JVWU5BUUpBSUFRb0FnQU5BQ0FES1FNUUlnRkNnSUNBZ0dCVURRQWdBQ0FCcHlBQ0VRQUFDeUFES1FNWUlnRkNnSUNBZ0dCYUJFQWdBQ0FCcHlBQ0VRQUFDeUFEUVFScUlRTU1BQXNBQ3d1YUFRRUdmeUFCcHlnQ0lDSURCRUFnQUVFUWFpRUVJQU5CQkdvaEJpQURLQUlJSVFJRFFDQUNJQVpIQkVBZ0FpZ0NCQ0VISUFKQkVHc2hCU0FDUVF4cktBSUFSUVJBQWtBZ0F5Z0NBQVJBSUFVUW53VU1BUXNnQUNBQ0tRTVFFQ01MSUFBZ0Fpa0RHQkFqQ3lBRUlBVWdBQ2dDQkJFQUFDQUhJUUlNQVFzTElBUWdBeWdDRUNBQUtBSUVFUUFBSUFRZ0F5QUFLQUlFRVFBQUN3dVVBZ0VGZndKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQXk4QkJrRWxSdzBBSUFNb0FpQWlCVVVOQUVFQUlRTURRQUpBSUFOQkUwWUVRRUVBSVFRTUFRc2dCU0FEUVFKMGFpZ0NDQ0lFQkVBZ0FDQUVJQUlSQUFBTElBTkJBV29oQXd3QkN3c0RRQ0FGS0FKVUlBUk1CRUJCQUNFRUEwQWdCQ0FGS0FKY1RnMERJQVVvQW1BaEJrRUFJUU1EUUNBRFFRNUhCRUFnQmlBRVFUeHNhaUFEUVFKMGFpZ0NCQ0lIQkVBZ0FDQUhJQUlSQUFBTElBTkJBV29oQXd3QkN3c2dCRUVCYWlFRURBQUxBQVVnQlNnQ1dDRUdRUUFoQXdOQUlBTkJEa2NFUUNBR0lBUkJQR3hxSUFOQkFuUnFLQUlFSWdjRVFDQUFJQWNnQWhFQUFBc2dBMEVCYWlFRERBRUxDeUFFUVFGcUlRUU1BUXNBQ3dBTEM4MENBUVovQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweUlDTHdFR1FTVkhEUUFnQWlnQ0lDSUVSUTBBUVFBaEFnTkFJQUpCRTBZRVFFRUFJUU1EUUNBRUtBSllJUVZCQUNFQ0lBUW9BbFFnQTB3RVFDQUFRUkJxSWdZZ0JTQUFLQUlFRVFBQVFRQWhBd05BSUFRb0FtQWhCVUVBSVFJZ0JDZ0NYQ0FEVEFSQUlBWWdCU0FBS0FJRUVRQUFJQVlnQkNBQUtBSUVFUUFBREFZRkEwQWdBa0VPUndSQUlBVWdBMEU4YkdvZ0FrRUNkR29vQWdRaUJ3UkFJQUFnQjYxQ2dJQ0FnSENFRUNNTElBSkJBV29oQWd3QkN3c2dBMEVCYWlFRERBRUxBQXNBQlFOQUlBSkJEa2NFUUNBRklBTkJQR3hxSUFKQkFuUnFLQUlFSWdZRVFDQUFJQWF0UW9DQWdJQndoQkFqQ3lBQ1FRRnFJUUlNQVFzTElBTkJBV29oQXd3QkN3QUxBQXNnQkNBQ1FRSjBhaWdDQ0NJREJFQWdBQ0FEclVLQWdJQ0FjSVFRSXdzZ0FrRUJhaUVDREFBTEFBc0xOUUVDZndKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQXk4QkJrRWpSdzBBSUFNb0FpQWhBZ3NnQUVFUWFpQUNJQUFvQWdRUkFBQUxHd0VCZnlBQnB5Z0NJQ0lEQkVBZ0FDQURLQUlNSUFJUkFBQUxDMkFCQTM4Z0FhY29BaUFpQWdSQUlBSW9BZ3dpQTYxQ2dJQ0FnSENFSVFFZ0F5MEFCVUVDY1VVRVFDQUNLQUlBSWdNZ0FpZ0NCQ0lFTmdJRUlBUWdBellDQUNBQ1FnQTNBZ0FMSUFBZ0FSQWpJQUJCRUdvZ0FpQUFLQUlFRVFBQUN3dGtBUUovSUFHbktBSWdJZ0lFUUFKQUFrQWdBaTBBQlVVTkFDQUFLQUs4QVNJRFJRMEFJQUFvQXNRQklBSW9BZ2dnQXhFQUFBd0JDeUFDS0FJWUlnTkZEUUFnQUNBQ0tBSVVJQUlvQWdnZ0F4RUdBQXNnQUVFUWFpQUNJQUFvQWdRUkFBQUxDeWtCQVg4Z0FDQUJweUlDTlFJa1FvQ0FnSUNRZjRRUUl5QUFJQUkxQWlCQ2dJQ0FnSkIvaEJBakN5RUFJQUduS0FJZ0tRTUFJZ0ZDZ0lDQWdHQmFCRUFnQUNBQnB5QUNFUUFBQ3dzaUFRRi9JQUFnQWFjb0FpQWlBaWtEQUJBaklBQkJFR29nQWlBQUtBSUVFUUFBQ3dvQUlBQkJBeEIyRUZNTFpRRUNmd0pBSUFGQ2dJQ0FnSEJVRFFBZ0FhY2lBeThCQmtFUFJ3MEFJQU1vQWlBaUJFVU5BRUVBSVFNRFFDQURJQVF0QUFWUERRRWdCQ0FEUVFOMGFpa0RDQ0lCUW9DQWdJQmdXZ1JBSUFBZ0FhY2dBaEVBQUFzZ0EwRUJhaUVEREFBTEFBc0xZd0VDZndKQUlBRkNnSUNBZ0hCVURRQWdBYWNpQWk4QkJrRVBSdzBBSUFJb0FpQWlBMFVOQUVFQUlRSURRQ0FDSUFNdEFBVlBSUVJBSUFBZ0F5QUNRUU4wYWlrRENCQWpJQUpCQVdvaEFnd0JDd3NnQUVFUWFpQURJQUFvQWdRUkFBQUxDM2dCQW44Z0FhY29BaUFpQkNrREFDSUJRb0NBZ0lCZ1dnUkFJQUFnQWFjZ0FoRUFBQXNnQkNrRENDSUJRb0NBZ0lCZ1dnUkFJQUFnQWFjZ0FoRUFBQXNEUUNBRUtBSVFJQU5LQkVBZ0JDQURRUU4wYWlrREdDSUJRb0NBZ0lCZ1dnUkFJQUFnQWFjZ0FoRUFBQXNnQTBFQmFpRUREQUVMQ3d0U0FRSi9JQUFnQWFjb0FpQWlBaWtEQUJBaklBQWdBaWtEQ0JBakEwQWdBeUFDS0FJUVRrVUVRQ0FBSUFJZ0EwRURkR29wQXhnUUl5QURRUUZxSVFNTUFRc0xJQUJCRUdvZ0FpQUFLQUlFRVFBQUM0QUJBUVIvSUFHbklnTW9BaUFoQkNBREtBSWtJUVVnQXlnQ0tDSURCRUFnQUNBRElBSVJBQUFMSUFRRVFBSkFJQVZGRFFCQkFDRURBMEFnQXlBRUtBSThUZzBCQWtBZ0JTQURRUUowYWlnQ0FDSUdSUTBBSUFZdEFBVkJBWEZGRFFBZ0FDQUdJQUlSQUFBTElBTkJBV29oQXd3QUN3QUxJQUFnQkNBQ0VRQUFDd3Q4QVFOL0lBR25JZ0lvQWlnaUF3UkFJQUFnQTYxQ2dJQ0FnSENFRUNNTElBSW9BaUFpQXdSQUlBSW9BaVFpQkFSQVFRQWhBZ05BSUFJZ0F5Z0NQRTVGQkVBZ0FDQUVJQUpCQW5ScUtBSUFFT3NCSUFKQkFXb2hBZ3dCQ3dzZ0FFRVFhaUFFSUFBb0FnUVJBQUFMSUFBZ0E2MUNnSUNBZ0dDRUVDTUxDeElBSUFHbktBSWdJZ0FFUUNBQUVLUURDd3NlQUNBQnB5a0RJQ0lCUW9DQWdJQmdXZ1JBSUFBZ0FhY2dBaEVBQUFzTEdRQWdBQ0FCcHlJQUtRTWdFQ01nQUVLQWdJQ0FNRGNESUF0RUFRSi9JQUduSVFRRFFDQUVLQUlvSUFOTEJFQWdCQ2dDSkNBRFFRTjBhaWtEQUNJQlFvQ0FnSUJnV2dSQUlBQWdBYWNnQWhFQUFBc2dBMEVCYWlFRERBRUxDd3RHQVFOL0lBR25JUU1EUUNBREtBSWtJUVFnQWlBREtBSW9UMFVFUUNBQUlBUWdBa0VEZEdvcEF3QVFJeUFDUVFGcUlRSU1BUXNMSUFCQkVHb2dCQ0FBS0FJRUVRQUFDMmtCQW44akFFRVFheUlISkFBQ2Z3SkFJQUduSWdndEFBVkJDSEZGRFFBZ0FDQUhRUXhxSUFJUXJBRkZEUUFnQnlnQ0RDQUlLQUlvVHcwQVFYOGdBQ0FJRUpJRERRRWFDeUFBSUFFZ0FpQURJQVFnQlNBR1FZQ0FDSElRYlFzaEFDQUhRUkJxSkFBZ0FBdUJBZ0lEZndGK0FrQUNRQ0FDUVFCT0RRQWdBYWNwQXlBaUNrS0FnSUNBY0lOQ2dJQ0FnSkIvVWcwQUlBSkIvLy8vL3dkeElnZ2dDcWNpQnlrQ0JDSUtwMEgvLy8vL0IzRlBEUUFDUUVFRUlBWVFrd05GRFFCQkFTRUNJQVpCZ01BQWNVVU5BaUFEUW9DQWdJQndnMEtBZ0lDQWtIOVNEUUFnQTZjaUNTa0NCQ0lCUXYvLy8vOEhnMElCVWcwQUlBZEJFR29oQndKL0lBcENnSUNBZ0FpRFVFVUVRQ0FISUFoQkFYUnFMd0VBREFFTElBY2dDR290QUFBTEFuOGdBVUtBZ0lDQUNJTlFSUVJBSUFrdkFSQU1BUXNnQ1MwQUVBdEdEUUlMSUFBZ0JrSGg2UUFRYnc4TElBQWdBU0FDSUFNZ0JDQUZJQVpCZ0lBSWNoQnRJUUlMSUFJTFJnQUNmd0pBSUFKQkFFNE5BQ0FCcHlrRElDSUJRb0NBZ0lCd2cwS0FnSUNBa0g5U0RRQkJBQ0FDUWYvLy8vOEhjU0FCcHlnQ0JFSC8vLy8vQjNGSkRRRWFDMEVCQ3d1ekFRRUNmd0pBSUFOQkFFNE5BQ0FDcHlrRElDSUNRb0NBZ0lCd2cwS0FnSUNBa0g5U0RRQWdBMEgvLy8vL0IzRWlBeUFDcHlJRUtRSUVJZ0tuUWYvLy8vOEhjVThOQUVFQklRVWdBVVVOQUNBRVFSQnFJUVFDZnlBQ1FvQ0FnSUFJZzFCRkJFQWdCQ0FEUVFGMGFpOEJBQXdCQ3lBRElBUnFMUUFBQ3lFRElBRkJCRFlDQUNBQUlBTkIvLzhEY1JDZkF5RUNJQUZDZ0lDQWdEQTNBeGdnQVVLQWdJQ0FNRGNERUNBQklBSTNBd2dMSUFVTFd3RUNmeUFCcHlnQ0VDSUFRVEJxSVFNZ0FDQUFLQUlZSUFKeFFYOXpRUUowYWlnQ0FDRUFBMEFDUUNBQVJRMEFJQU1nQUVFQmEwRURkR29pQkNnQ0JDQUNSZzBBSUFRb0FnQkIvLy8vSDNFaEFBd0JDd3NnQUVFQVJ3czFBUUYrSUFFcEF3QWlBa0lnaUtkQmRVOEVRQ0FDcHlJQklBRW9BZ0JCQVdvMkFnQUxJQUFnQWhDS0FVS0FnSUNBNEFBUVV3dU9BUUVDZnlBQktBSUFJZ0pCQUVvRVFDQUJJQUpCQVdzaUFqWUNBQUpBSUFJTkFDQUJMUUFFUWZBQmNVRVFSdzBBSUFFb0FnZ2lBaUFCS0FJTUlnTTJBZ1FnQXlBQ05nSUFJQUZCQURZQ0NDQUFLQUpnSWdJZ0FVRUlhaUlETmdJRUlBRWdBRUhnQUdvMkFnd2dBU0FDTmdJSUlBQWdBellDWUFzUEMwSEZqUUZCcnZ3QVFiQXNRYy8wQUJBQUFBdHZBUUovSUFFZ0FTZ0NBQ0lDUVFGcU5nSUFJQUpGQkVBZ0FTZ0NDQ0lDSUFFb0Fnd2lBellDQkNBRElBSTJBZ0FnQVVFQU5nSUlJQUFvQWxBaUFpQUJRUWhxSWdNMkFnUWdBU0FBUWRBQWFqWUNEQ0FCSUFJMkFnZ2dBQ0FETmdKUUlBRWdBUzBBQkVFUGNUb0FCQXNMRHdBZ0FTQUJLQUlBUVFGcU5nSUFDNGdCQWdGK0FYOUJBQ0VDUW9DQWdJQXdJUUVEUUFKQUlBSkJBa2NFZmlBRklBSkJBM1FpQkdvaUJ6VUNCRUlnaGtLQWdJQ0FNRkVOQVNBQVFhd3VRUUFRRlVLQWdJQ0E0QUFGUW9DQWdJQXdDdzhMSUFNZ0JHb3BBd0FpQmtJZ2lLZEJkVThFUUNBR3B5SUVJQVFvQWdCQkFXbzJBZ0FMSUFjZ0JqY0RBQ0FDUVFGcUlRSU1BQXNBQzF3QkFuNGdBaUFBS0FJQUVDMGhBMEVBSVFBZ0EwS0FnSUNBY0lOQ2dJQ0FnT0FBVVNBQ0lBRW9BZ0FRTFNJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSY2tVRVFDQURweUFFcHhDREFpRUFDeUFDSUFNUUR5QUNJQVFRRHlBQUMyc0JBWDRDUUFKQUFrQUNRQUpBSUFNdEFBVWlBUTRFQXdJQ0FBRUxJQUFnQXlnQ0NCREtCQThMSUFGQkNFWU5BZ3NRQVFBTElBQWdBeWdDRENBREtBSUFJQU10QUFnZ0F5MEFDU0FETGdFR0VJSUJEd3NnQUNBQUVEUWlCQ0FES0FJSUlBTW9BZ3dRSWlBRUN3a0FJQUFnQXhDTkF3dFRBUUYrSUFBUU5DSUVRb0NBZ0lCd2cwS0FnSUNBNEFCU0JFQWdBU0FCS0FJQVFRRnFOZ0lBSUFBZ0JFRThJQUd0UW9DQWdJQndoRUVERUJsQkFFNEVRQ0FFRHdzZ0FDQUVFQThMUW9DQWdJRGdBQXNEQUFFTGFnRUJmeU1BUVJCcklnTWtBQ0FCS0FJRUlRRWdBaUFEUVF4cUlBQW9BZ1FRckFGQkFDQUNJQU5CQ0dvZ0FSQ3NBUnRGQkVCQjBNVUFRYTc4QUVHRE9rSDh5UUFRQUFBTElBTW9BZ2doQUNBREtBSU1JUUVnQTBFUWFpUUFRWDhnQUNBQlJ5QUFJQUZMR3d2YUF3SUNmZ0YvSXdCQklHc2lCU1FBQWtBQ1FDQUFJQUZCTEJCTElnSkZEUUJDZ0lDQWdEQWhBUUpBSUFJcEF3QWlCa0tBZ0lDQWNJTkNnSUNBZ0RCU0JFQUNmd0pBSUFhbklnTXZBUVpCRld0Qi8vOERjVUVLVFFSQUlBTW9BaUFvQWd3b0FpQXRBQVJGRFFFZ0FCQnJEQVVMSUFBZ0JVRWNhaUFHRU5ZQkRRUWdCVUVjYWd3QkN5QURRU2hxQ3lFSUlBSW9BZ3dpQXlBSUtBSUFTUTBCSUFBZ0Fpa0RBQkFQSUFKQ2dJQ0FnREEzQXdBTElBUkJBVFlDQUF3Q0N5QUNJQU5CQVdvMkFnd2dCRUVBTmdJQUlBSW9BZ2hGQkVBZ0EwRUFUZ1JBSUFPdElRRU1Bd3RDZ0lDQWdNQitJQU80dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJJUUVNQWd0Q2dJQ0FnT0FBSVFFZ0FDQUNLUU1BSUFNUXNBRWlCa0tBZ0lDQWNJTkNnSUNBZ09BQVVRMEJJQUlvQWdoQkFVWUVRQ0FHSVFFTUFnc2dCU0FHTndNSUlBVWdBMEVBVGdSK0lBT3RCVUtBZ0lDQXdINGdBN2k5SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xJZ2MzQXdBZ0FFRUNJQVVRaVFNaEFTQUFJQVlRRHlBQUlBY1FEd3dCQ3lBRVFRQTJBZ0JDZ0lDQWdPQUFJUUVMSUFWQklHb2tBQ0FCQ3hBQUl3QWdBR3RCY0hFaUFDUUFJQUFMQmdBZ0FDUUFDd1FBSXdBTDdnSUNCSDhDZmlNQVFSQnJJZ01rQUFKQUFrQWdBaWtERUNJSFFvQ0FnSUJ3ZzBLQWdJQ0FrSDlTQkVBZ0FFR0RsQUZCQUJBVkRBRUxJQUlwQXhnaENDQUFJQWNRc3dFaUJFVUVRRUVBSVFRTUFRc2dBQ0FJRUxNQklnWkZEUUFDUUNBQUlBUWdCaERKQlNJQlJRMEFJQUFnQVJEK0EwRUFTQVJBSUFCQkFSQ1BCQXdCQ3lBQklBRW9BZ0JCQVdvMkFnQWdBQ0FCclVLQWdJQ0FVSVFnQUNrRHdBRkJBRUVBRU1nRklnZENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQWNRRHlBQklRVUxJQUFnQmhCVUlBVkZEUUFnQXlBQUlBVVFqUU1pQnpjREFDQUhRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FBSUFJcEF3QkNnSUNBZ0RCQkFTQURFQ0VRRHlBQUlBTXBBd0FRRHd3QkN5QUFLQUlRSWdFcEE0QUJJUWNnQVVLQWdJQ0FJRGNEZ0FFZ0F5QUhOd01JSUFBZ0FDQUNLUU1JUW9DQWdJQXdRUUVnQTBFSWFoQWhFQThnQUNBREtRTUlFQThMSUFBZ0JCQlVJQU5CRUdva0FFS0FnSUNBTUFzU0FDQUFRUUEyQXJBQklBQkNBRGNEcUFFTEh3QWdBRUVBTmdLd0FTQUFRVGcyQXF3QklBQkJPVUVBSUFFYk5nS29BUXNmQUNBQUlBQW9BaEFnQUNBQklBSVFCaUlBRVBFRklRRWdBQkNiQVNBQkMwOENBWDhCZmlBQUtBSVFJQUFnQVJBSElnSkZCRUJCQUE4TElBQWdBaUFDRUQ4Z0FVRWhFUFFGSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRklFUUNBQUlBUVFEeUFFcHlFREN5QUNFSnNCSUFNTENnQWdBRUlBTndPUUFRc1NBQ0FBUVFBMkFwUUJJQUJCTnpZQ2tBRUxCZ0FnQUJBTkN3b0FJQUFnQVVFRGRHb0xFd0FnQUVFMklBSkJBRUVCSUFFUWdnRVFVd3RMQVFGL0l3QkJFR3NpQlNRQUlBVWdBVGNEQ0FKQUlBQWdCVUVJYWlBQ0lBTWdCQkFPSWdCRkJFQkNnSUNBZ0RBaEFRd0JDeUFBS1FNQUlRRWdBQkNiQVFzZ0JVRVFhaVFBSUFFTFB3SUJmd0YrSXdCQkVHc2lBaVFBSUFBZ0FoRE5BaUVESUFFZ0Fpa0RBQkJUTmdJQUlBRWdBaWtEQ0JCVE5nSUVJQU1RVXlFQUlBSkJFR29rQUNBQUN5b0JBWDRnQUNrRHdBRWlBVUlnaUtkQmRVOEVRQ0FCcHlJQUlBQW9BZ0JCQVdvMkFnQUxJQUVRVXd2WEFRSUNmZ0YvQW45Qi9NY0FJQUVwQXdBaUFrSWdpS2NpQVVVZ0FVRUxha0VSUzNJTkFCb0NRQUpBSUFKQ2dJQ0FnSENESWdOQ2dJQ0FnTkIrVWdSQVFhZ3NJQU5DZ0lDQWdPQitVUTBER2lBRFFvQ0FnSUR3ZmxJRVFFRzZ6QUFnQUNBQ0VEZ05CQm9nQTBLQWdJQ0FnQUY4UWlDSXB5SUFRUTFKRFFJTUF3dEIxVEVNQXd0QmdOY0FEQUlMUVlNOElBQjJRUUZ4UlEwQUlBQkJBblJCMEo0QmFpZ0NBQXdCQzBIVnlnQkJ4VEVnQWtLQWdJQ0FjRlFiQ3lJQUVEOUJBV29pQVJDeEFTSUVCSDhnQkNBQUlBRVFId1ZCQUFzTGVRRUJmeU1BUVJCcklnVWtBQ0FEQkVBZ0JTQUJOZ0lNUVFFaEF3SkFBa0FDUUNBRlFReHFRUUFRa3dSQk0yb09Bd0lCQUFFTElBVkJER3BCQUJDVEJDSURRUzVISUFOQktFZHhJUU1NQVF0QkFDRURDeUFESUFSeUlRUUxJQUFnQVNBQkVEOGdBaUFFRVBRRkVGTWhBQ0FGUVJCcUpBQWdBQXZVQVFJQ2ZnRi9Ba0FnQUNBQktRTUFRb0NBZ0lBd1FvQ0FnSUF3RUpRRUlnSkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQUlRc3dFaEJDQUFJQUlRRHlBRVJRMEFJQUFnQkNBRUVEOUI3SWdCRVBVRklRSWdBQ0FFRUZRZ0FrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdBaUFCS1FNQVFlSG9BQkQ0QXlBQUlBSWdBU2tEQUVHNjZ3QVErQU1nQUNBQ0lBRXBBd0JCeU5jQUVQZ0RJQUFnQWtLQWdJQ0FNRUtBZ0lDQU1CQ1VCQ0VESUFBZ0FoQVBJQUFnQXhDekFTRUJJQUFnQXhBUElBRVBDeUFBSUFFUTl3VUxPUUlCZndGK0lBRTFBZ1JDSUlaQ2dJQ0FnT0FBVVFSL0lBQW9BaEFpQUNrRGdBRWhBeUFBUW9DQWdJQWdOd09BQVNBREVGTUZRUUFMQzNJQkJIOGpBQ0lHSVFjZ0EwRUFJQU5CQUVvYklRZ2dCaUFEUVFOMFFROXFRWEJ4YXlJR0pBQURRQ0FGSUFoR1JRUkFJQVlnQlVFRGRHb2dCQ0FGUVFKMGFpZ0NBQ2tEQURjREFDQUZRUUZxSVFVTUFRc0xJQUFnQVNrREFDQUNLUU1BSUFNZ0JoQWhFRk1oQUNBSEpBQWdBQXVOQVFFQ2ZpQUFJQUlwQXdBUU1TRUNJQUFnQVNrREFDQUNJQU1wQXdBZ0JDa0RBQ0lKSUFVcEF3QWlDa0dCQWtFQklBZ2JRUUFnQmh0QmhBaEJCQ0FJRzBFQUlBY2JjaUlCSUFGQmdCQnlJQWxDZ0lDQWdIQ0RRb0NBZ0lBd1VSc2lBU0FCUVlBZ2NpQUtRb0NBZ0lCd2cwS0FnSUNBTUZFYklnRkJnTUFBY2lBQklBZ2JFRzBhSUFBZ0FoQVRDMFFCQVg0Z0FDQUNLUU1BRURFaEFpQURLUU1BSWdSQ0lJaW5RWFZQQkVBZ0JLY2lBeUFES0FJQVFRRnFOZ0lBQ3lBQUlBRXBBd0FnQWlBRUVMRUZJQUFnQWhBVEN5d0JBWDRnQUNBQ0tRTUFFREVoQWlBQUlBRXBBd0FpQXlBQ0lBTkJBQkFVSVFNZ0FDQUNFQk1nQXhCVEMvUUJBZ1YvQVg0Z0FFR2dBV29oQndKQUEwQUNRQ0FCSUFaR0RRQWdBQ2dDcEFFaUF5QUhSZzBBSUFNb0FnQWlCU0FES0FJRUlnUTJBZ1FnQkNBRk5nSUFJQU5DQURjQ0FFRUFJUVFnQXlnQ0NDSUZJQU1vQWhBZ0EwRVlhaUFES0FJTUVSa0FJUWdEUUNBRUlBTW9BaEJPUlFSQUlBVWdBeUFFUVFOMGFpa0RHQkFQSUFSQkFXb2hCQXdCQ3dzZ0JTQUlFQThnQlNnQ0VDSUVRUkJxSUFNZ0JDZ0NCQkVBQUNBQ0lBVTJBZ0FnQ0VLQWdJQ0FjSU5DZ0lDQWdPQUFVUVJBSUFVb0FoQWlBQ2tEZ0FFaENDQUFRb0NBZ0lBZ053T0FBUXdEQlNBR1FRRnFJUVlNQWdzQUN3c2dCcTBoQ0FzZ0NCQlRDdzhBSUFBb0FxUUJJQUJCb0FGcVJ3c2hBUUYrSUFBZ0FDQUJFUFlGSWdJUUR5QUNRb0NBZ0lCd2cwS0FnSUNBTUZJTFB3RUJmaUFBSUFFUTlnVWlBa0tBZ0lDQWNJTkNnSUNBZ0RCUkJFQWdBQ0FCS1FNQVFhM0xBQkN5QVNFQ0N5QUFJQUlRc3dFaEFTQUFJQUlRRHlBQkM3VUJBZ0ovQTM0akFFRVFheUlESkFBZ0FDa0R3QUVpQlVJZ2lLZEJkVThFUUNBRnB5SUVJQVFvQWdCQkFXbzJBZ0FMSUFBZ0JVR0Qwd0FRc2dFaEJpQUFJQVVRRHlBRElBQWdBUkJpTndNSUFrQWdBZ1JBSUFBZ0FDQUdRZG5BQUJDeUFTSUZJQVpCQVNBRFFRaHFFQ0VoQnlBQUlBTXBBd2dRRHd3QkN5QUFJQVpDZ0lDQWdEQkJBU0FEUVFocUVDRWhCeUFES1FNSUlRVUxJQUFnQlJBUElBQWdCaEFQSUFjUVV5RUFJQU5CRUdva0FDQUFDd29BSUFBZ0FSQmlFRk1MUGdJQmZ3RjhJd0JCRUdzaUFpUUFJQUpDZ0lDQWdJQ0FnUHovQURjRENDQUFJQUpCQ0dvZ0FTa0RBQkJDR2lBQ0t3TUlJUU1nQWtFUWFpUUFJQU1MYVFFQmZnSitJQUc5SWdJQ2Z5QUJtVVFBQUFBQUFBRGdRV01FUUNBQnFnd0JDMEdBZ0lDQWVBc2lBTGU5VVFSQUlBQ3REQUVMUW9DQWdJREFmaUFDUW9DQWdJREFnWUQ4L3dCOUlBSkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QlRDd2dBSUFBUVBoQlRDdzBBSUFBZ0FTa0RBQkJIRUZNTENBQWdBQkEwRUZNTEtRRUJmaUFCS1FNQUlnSkNJSWluUVhWUEJFQWdBcWNpQUNBQUtBSUFRUUZxTmdJQUN5QUNFRk1MQ0FBZ0FDQUJFRlFMRmdBZ0FDZ0NFQ0lBUVJCcUlBRWdBQ2dDQkJFQUFBcytBZ0YvQVg0Q1FDQUJLUU1BSWdOQ0lJaW5RWFZKRFFBZ0E2Y2lBaUFDS0FJQUlnSkJBV3MyQWdBZ0FrRUJTZzBBSUFBZ0F4Q1dCQXNnQVJDYkFRc1FBQ0FBSUFFcEF3QVFEeUFCRUpzQkN3Y0FJQUFRcEFNTDJRTUNBbjhCZmlNQVFTQnJJZ0lrQUFKQUFrQWdBVUtBZ0lDQWNJTkNnSUNBZ0RCU0JFQWdBRUdpUGtFQUVCVU1BUXNnQXlrREFDSUJRaUNJcDBGMVR3UkFJQUduSWdNZ0F5Z0NBRUVCYWpZQ0FBc0RRQUpBQWtBQ1FBSkFBa0FDUUVFSElBRkNJSWluSWdNZ0EwRUhhMEZ1U1J0QkMyb09Fd0lJQVFVREJRVUZCUVVFQUFBRkJRVUZCUUVGQ3lBQUlBSEVFSWNDSVFFTUJ3c0NRQUorSUFBZ0FrRU1haUFCRUxzQ0lnTW9BZ2hCL3YvLy93ZE9CRUFnQUNBQkVBOGdBRUhESzBFQUVGQkNnSUNBZ09BQURBRUxJQUFRbHdFaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBYW5RUVJxSWdRZ0F4QkVJUVVnQkVFQkVORUJJUVFnQUNBQkVBOGdCQ0FGY2lJRVFTQnhCRUFnQUNBR0VBOGdBQkI4UW9DQWdJRGdBQXdCQ3lBRVFSQnhCRUFnQUNBR0VBOGdBRUgxeFFCQkFCQlFRb0NBZ0lEZ0FBd0JDeUFBSUFZUXpRRUxJUUVnQXlBQ1FReHFSdzBISUFKQkRHb1FHd3dIQ3lBQUlBRVFEd3dGQ3lBQUlBRVFOeUlCUW9DQWdJQndnMEtBZ0lDQTRBQlNEUU1NQlFzZ0FDQUJFS29GSVFFTUJBc2dBQ0FCUVFFUW1nRWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnMEJEQU1MQ3lBQUlBRVFEeUFBUWV3clFRQVFGUXRDZ0lDQWdPQUFJUUVMSUFKQklHb2tBQ0FCQzU0T0FnMS9BbjRqQUVIUUFHc2lCU1FBUW9DQWdJRGdBQ0VUQWtBZ0FCQ1hBU0lTUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQlNBQk5nSTRJQktuUVFScUlRb0NRQUpBQWtBQ1FBSkFJQUpCRUV3RVFDQUJRZURSQUNBRlFUaHFFSmtGRFFFZ0JTZ0NPQ0VCQ3dKQUFrQUNRQ0FCTFFBQUlnUkJLMnNPQXdFQ0FBSUxRUUVoRUFzZ0JTQUJRUUZxSWd3MkFqZ2dBUzBBQVNFRUlBd2hBUXNDUUFKQUFrQUNRQ0FFUWY4QmNVRXdSZ1JBQWtBQ1FDQUJMUUFCSWdSQitBQkhCRUFnQkVIdkFFWU5CU0FFUWRnQVJ3MEJDeUFDUVc5eFJRUkFJQVVnQVVFQ2FqWUNPRUVRSVFJZ0FTMEFBaENXQVVFUVNRMEhEQWdMSUFSQjd3QkdEUVlnQWtVaEJnd0JDeUFDUlNFR0lBSU5BQ0FFUWM4QVJnMEVDeUFFUWVJQVJnMEJJQVlnQkVIQ0FFWnhEUU1NQWdzZ0FrRVFTZzBESUFGQnJOMEFJQVZCT0dvUW1RVkZEUUVNQndzZ0JpQUNSWEpGRFFJTUFRc2dBZzBCQzBFS0lRSUxBbjhnQWlBQ1FRRnJJZ1J4QkVBZ0NpZ0NBQ0VFSUFWQ0FEY0NMQ0FGUW9DQWdJQ0FnSUNBZ0g4M0FpUWdCU0FFTmdJZ0lBVkJJR29NQVF0QklDQUVaMnRCQUNBQ1FRSlBHeUVKSUFvTElRMGdCU2dDT0NFRUEwQWdCQzBBQUVFd1IwVUVRQ0FGSUFSQkFXb2lCRFlDT0F3QkN3dEJJQ0VNSUFsRkJFQWdBa0hlcUFScUxRQUFJUXdMSUExQkFSQkJHaUFGUVFBMkFqUWdEQ0VFUVFBaEJnSkFBa0FDUUFKQUEwQUNRQUpBSUFVb0FqZ2lDQzBBQUNJUlFTNUhEUUFnQVNBSVR3UkFRUzRoRVNBSUxBQUJFSllCSUFKT0RRRUxJQTROQTBFQklRNGdCU0FJUVFGcUlnYzJBamdnQ0MwQUFTRVJJQXNoRHd3QkN5QUlJUWNMSUFJZ0VjQVFsZ0VpQ0VzRVFDQUZJQWRCQVdvMkFqZ2dDMEVCYWlFTElBa0VRQ0FFSUFscklnUkJBRXdFUUNBTklBVkJOR29nQ0VFQUlBUnJkaUFHY2hEbUF3MEdJQVJCSDNVZ0NDQUVRU0JxSWdSMGNTRUdEQU1MSUFnZ0JIUWdCbkloQmd3Q0N5QUlJQUlnQm14cUlRWWdCRUVCYXlJRURRRWdEU0FGUVRScUlBWVE1Z01oQnlBTUlRUkJBQ0VHSUFkRkRRRU1Bd3NMSUE4Z0N5QU9HeUVQQ3lBRUlBeEdEUUlnQ1NBRVJYSkZCRUFEUUNBQ0lBWnNJUVlnQkVFQmF5SUVEUUFMQ3lBTklBVkJOR29nQmhEbUEwVU5BaUFKRFFFTElBMFFHd3NnQ2hBMURBTUxJQTBvQWhCQkFDQUZLQUkwSWc1QkFuUkJCR29RS3hvZ0JTZ0NPQ0lJSUFGSERRRWdDUTBBSUEwUUd3c2dDaEExREFNTElBZ3RBQUFoQkFKQUFrQUNmd0ovQWtBZ0FrRUtSZ1JBSUFRaUIwRWdja0hsQUVZTkFVRUFJUXRCQUF3Q0MwSEFBQ0VISUFSQndBQkdEUUFnQ1VVRVFFRUFJUVlNQkFzZ0JDSUhRU0J5UWZBQVJnMEFRUUFoQmlBSkRBSUxRUUFoQzBFQUlBRWdDRThOQUJvZ0JTQUlRUUZxSWdZMkFqZ2dCMEhmQVhFaEFVRUJJUWNDUUFKQUFrQWdDQzBBQVVFcmF3NERBQUlCQWdzZ0JTQUlRUUpxSWdZMkFqZ01BUXNnQlNBSVFRSnFJZ1kyQWpoQkFDRUhDeUFCUWRBQVJpRUxRUUFoQkFOQUlBWXNBQUFRbGdFaUFVRUpUUVJBSUFSQnpKbXo1Z0JPQkVBZ0J3MElJQW9nRUJDSkFRd0pCU0FGSUFaQkFXb2lCallDT0NBQklBUkJDbXhxSVFRTUFnc0FDd3NnQkVFQUlBUnJJQWNiQ3lFR0lBbEZEUUZCQVNBSklBc2JDeUVFSUEwZ0VEWUNCQ0FOSUFRZ0Jtd2dDU0FQYkdvMkFnZ2dEVUgvLy8vL0EwRUJFTE1DSVFRTUFRc0NRQ0FOS0FJTUlnY2dEa0VCYWlJTFJnUkFJQW9nRUJDSkFVRUFJUVFNQVFzZ0NpZ0NBQ0VCSUFWQ0FEY0NHQ0FGUW9DQWdJQ0FnSUNBZ0g4M0FoQWdCU0FCTmdJTUlBMG9BaEFoRGlBQ0VKY0ZJUkZCQUNFRUFrQUNRQ0FCS0FJQVFRQkJBa0VpSUFjZ0Myc2lCMEVCYTJkcklBZEJBa2tiSWdoQkZHd2dBU2dDQkJFQkFDSUpCRUFnRGlBTFFRSjBhaUVPSUE4Z0J5QU1iR3NnQm1vaERBTkFJQVFnQ0VaRkJFQWdCU2dDRENFUElBa2dCRUVVYkdvaUMwSUFOd0lNSUF0Q2dJQ0FnSUNBZ0lDQWZ6Y0NCQ0FMSUE4MkFnQWdCRUVCYWlFRURBRUxDMEVBSVFRZ0JVRU1haUFPSUFkQkFDQUhJQkVnQ1JEbEF5RUhBMEFnQkNBSVJrVUVRQ0FKSUFSQkZHeHFFQnNnQkVFQmFpRUVEQUVMQ3lBQktBSUFJQWxCQUNBQktBSUVFUUVBR2lBSFJRMEJDeUFLRURWQklDRUVEQUVMSUFVZ0VEWUNFQ0FGS0FJWVJRUkFJQW9nQlVFTWFoQkVJUVFNQVFzZ0RFVUVRQ0FLSUFWQkRHb1FSQ0FLUWYvLy8vOERRUUVRemdGeUlRUU1BUXNnQ2lnQ0FDRUJJQVZDQURjQ1NDQUZRb0NBZ0lDQWdJQ0FnSDgzQWtBZ0JTQUJOZ0k4SUFWQlBHb2dBaUFNSUF4QkgzVWlBWE1nQVd0Qi8vLy8vd05CQUJEOEFpRUJBbjhnREVFQVNBUkFJQW9nQlVFTWFpQUZRVHhxSUFVb0FoaEJCWFJCQUJDVkFRd0JDeUFLSUFWQkRHb2dCVUU4YWtILy8vLy9BMEVBRUVNTElBRnlJUVFnQlVFOGFoQWJDeUFGUVF4cUVCc0xJQTBRR3dzZ0JFRWdjVVVOQWdzZ0FDQVNFQThnQUJCOERBSUxJQW9nRUJDTUFRc2dBQ0FTSUFOQkNYWkJBWEVRbGdVaEV3c2dCVUhRQUdva0FDQVRDOFVDQWdSL0FYNGpBRUVnYXlJSEpBQUNmd0pBQWtBQ1FDQUNRWTBCUncwQUlBQW9BaEFvQW93QklnUUVRQ0FFTFFBb1FRUnhEUUVMSUFCQjI1QUJRUUFRRlF3QkN5QUFFSmNCSWdoQ2dJQ0FnSENEUW9DQWdJRGdBRklOQVFzZ0FDQURFQTlCZnd3QkN5QUlweUlGUVFScUlRWWdBQ0FIUVF4cUlBTVF1d0VoQkFKQUFrQUNRQUpBQWtBQ1FDQUNRWXdCYXc0S0FRQUVCQU1EQXdNREFnTUxJQVlnQkJCRUlRSU1CQXNnQmlBRUVFUWhBaUFGSUFVb0FnaEJBWE0yQWdnTUF3c2dCaUFFUWdGQi8vLy8vd05CQVJCMUlRSWdCU0FGS0FJSVFRRnpOZ0lJREFJTEVBRUFDeUFHSUFRZ0FrRUJkRUdkQW11c1FmLy8vLzhEUVFFUWRTRUNDeUFBSUFRZ0IwRU1haEJlSUFBZ0F4QVBJQUlFUUNBQUlBZ1FEeUFBSUFJUWhBSkJmd3dCQ3lBQklBQWdDQkROQVRjREFFRUFDeUVBSUFkQklHb2tBQ0FBQzdZSkFnWi9CSDRqQUVGQWFpSUdKQUJDZ0lDQWdPQUFJUXdDZndKQUFrQWdBQkNYQVNJTFFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBQ1FDQUFJQVpCTEdvZ0F4QzdBU0lIUlEwQUlBQWdCa0VZYWlBRUVMc0JJZ2hGQkVBZ0FDQUhJQVpCTEdvUVhnd0JDeUFMcDBFRWFpRUpBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FVR2FBV3NPR1FFQ0JBMEFCUWdJREF3TURBd01EQXdNREF3SkN3b01EQU1NQ3lBSklBY2dDRUgvLy8vL0EwRUJFT1FCSVFVTURRc2dDU0FISUFoQi8vLy8vd05CQVJCRElRVU1EQXNnQUNnQ0VDZ0NqQUVpQlFSQUlBVXRBQ2hCQkhFTkJBc2dBQ2dDMkFFaEFTQUdRZ0EzQWd3Z0JrS0FnSUNBZ0lDQWdJQi9Od0lFSUFZZ0FUWUNBQ0FKSUFZZ0J5QUlRUUVRNUFNaEJTQUdFQnNNQ3dzZ0NTQUhJQWhCQmhDVkJVRUJjU0VGREFvTElBa2dCeUFJUVFFUWxRVkJBWEVoQlF3SkN5QUlLQUlFUlEwQlFRRWhCU0FBS0FJUUtBS01BU0lKUlEwSUlBa3RBQ2hCQkhGRkRRZ0xJQUFnQ3hBUEFrQUNmd0pBQWtBZ0FDQUFLQUlvS1FPSUFpSUxRZDBCSUF0QkFCQVVJZ3RDZ0lDQWdIQ0RJZ3hDZ0lDQWdEQlNCRUFnREVLQWdJQ0E0QUJSRFFJZ0FDQUxRU1VRU3lJRlJRMENJQVVnQVJEM0EwRUNkR29vQWdnaUJRMEJJQUFnQ3hBUEMwS0FnSUNBNEFBaERDQUFFTFlGSWd0Q2dJQ0FnSENEUW9DQWdJRGdBRklOQXlBQUlBY2dCa0VzYWhCZUlBQWdDQ0FHUVJocUVGNE1EZ3NnQUNBREVMa0NJZ3hDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQ0FBSUFRUXVRSWlEa0tBZ0lDQWNJTkNnSUNBZ09BQVVRUkFJQUFnREJBUERBRUxJQVVnQlNnQ0FFRUJhallDQUNBR0lBNDNBd2dnQmlBTU53TUFJQUFnQmExQ2dJQ0FnSENFUW9DQWdJQXdRUUlnQmhBdklRMGdBQ0FNRUE4Z0FDQU9FQTlCQUNBTlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFYUMwS0FnSUNBTUNFTlFRRUxJUUVnQUNBTEVBOGdBQ0FISUFaQkxHb1FYaUFBSUFnZ0JrRVlhaEJlSUFBZ0F4QVBJQUFnQkJBUFFYOGdBUTBOR2lBQ0lBMDNBd0FNQ1FzZ0M2ZEJCR29oQlNBQUtBTGdBU0VKSUFBb0F0d0JJUW9DZnlBQlFac0JSZ1JBSUFVZ0J5QUlJQW9nQ1JDVkFRd0JDeUFGSUFjZ0NDQUtJQWxCZ0lBRWNoQ1VCUXNoQVNBQUlBY2dCa0VzYWhCZUlBQWdDQ0FHUVJocUVGNGdBQ0FERUE4Z0FDQUVFQThnQVVFZ2NTSUJCRUFnQUNBTEVBOGdBQ0FCRUlRQ0RBd0xJQUlnQ3pjREFBd0lDeUFKSUFjZ0NFSC8vLy8vQTBHQmdBUVFsQVVoQlF3R0N5QUdJQWhCQUJDcEFTQUdLQUlBSVFVZ0NTQUhFRVFnQ1VFQVFZR0FnSUI0SUFVZ0JVR0JnSUNBZUV3YklnVnJJQVVnQVVHaEFVWWJJZ0ZCLy8vLy93TkJBUkRNQVhJaEJTQUJRUUJPRFFVZ0NVRUNFTkVCUVNSeElBVnlJUVVNQlFzZ0NTQUhJQWdRa3dVaEJRd0VDeUFKSUFjZ0NFRUFFT01ESVFVTUF3c2dDU0FISUFoQkFSRGpBeUVGREFJTEVBRUFDeUFKSUFjZ0NFSC8vLy8vQTBFQkVNc0JJUVVMSUFBZ0J5QUdRU3hxRUY0Z0FDQUlJQVpCR0dvUVhpQUFJQU1RRHlBQUlBUVFEeUFGQkVBZ0FDQUxFQThnQUNBRkVJUUNEQVFMSUFJZ0FDQUxFTTBCTndNQUMwRUFEQU1MSUFzaERBc2dBQ0FNRUE4Z0FDQURFQThnQUNBRUVBOExRWDhMSVFBZ0JrRkFheVFBSUFBTDRRRUJCSDhqQUVFd2F5SUVKQUJCZnlFSEFrQWdBQ0FFUVJ4cUlBSVF1d0lpQlVVTkFBSkFJQUFnQkVFSWFpQURFTHNDSWdaRkJFQWdCU0FFUVJ4cVJ3MEJJQVJCSEdvUUd3d0JDd0ovQWtBQ1FBSkFBa0FDUUFKQUlBRkJvd0ZyRGdjRkFBRUNCQVFEQkFzZ0JTQUdFSklGREFVTElBWWdCUkN5QWd3RUN5QUdJQVVRa2dVTUF3c2dCU0FHRUlJQ0RBSUxFQUVBQ3lBRklBWVFzZ0lMSVFjZ0JFRWNhaUFGUmdSQUlBUkJIR29RR3dzZ0JFRUlhaUFHUmdSQUlBUkJDR29RR3dzZ0FDQUNFQThNQVFzZ0FpRURDeUFBSUFNUUR5QUVRVEJxSkFBZ0J3c0xBQ0FBSUFGQkNoQ2FCUXV1QWdJRGZ3RitJd0JCSUdzaUJTUUFBa0FnQWFjaUJ5Z0NJQ0lHUlEwQUlBWW9BZ2dpQ0NnQ0JBMEFJQWhCQVRZQ0JDQUhMd0VHUVRKcklRY0NRQUpBSUFOQkFFd0VRRUtBZ0lDQU1DRUJEQUVMSUFjZ0JDa0RBQ0lCUW9DQWdJQndWSElOQUFKQUFrQWdBQ0FCSUFZcEF3QVFVZ1JBSUFCQjg4b0FRUUFRRlF3QkN5QUFJQUZCL3dBZ0FVRUFFQlFpQWtLQWdJQ0FjSU5DZ0lDQWdPQUFVZzBCQ3lBQUtBSVFJZ01wQTRBQklRRWdBMEtBZ0lDQUlEY0RnQUVnQUNBR0tRTUFJQUZCQVJDS0JTQUFJQUVRRHd3REN5QUFJQUlRT0EwQklBQWdBaEFQQ3lBQUlBWXBBd0FnQVNBSEVJb0ZEQUVMSUFZcEF3QWhDU0FGSUFJM0F4QWdCU0FCTndNSUlBVWdDVGNEQUNBQVFUVkJBeUFGRUpvRElBQWdBaEFQQ3lBRlFTQnFKQUJDZ0lDQWdEQUwzd0VDQTM4Q2ZpQUFRZWdBRUY4aUJVVUVRRUtBZ0lDQTRBQVBDeUFGUVFFMkFnQWdBQ2dDRUNFR0lBVkJCRG9BQkNBR0tBSlFJZ2NnQlVFSWFpSUlOZ0lFSUFVZ0JrSFFBR28yQWd3Z0JTQUhOZ0lJSUFZZ0NEWUNVQ0FGUW9DQWdJQXdOd01ZSUFWQ2dJQ0FnREEzQXhBZ0JVRUFOZ0lnUW9DQWdJRGdBQ0VKQWtBQ1FDQUFJQVZCRUdvUXpRSWlDa0tBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQUFnQlVFb2FpQUJJQUlnQXlBRUVPMERSUTBCQ3lBQUlBb1FEd3dCQ3lBRlFRRTJBaUFnQUNBRkVJa0ZJQW9oQ1FzZ0FDZ0NFQ0FGRUlnRklBa0xtQUVCQVg4Z0FhY2lCUzhCQmtFMWF5RUdJQVVvQWlBaEJTQURRUUJNQkg1Q2dJQ0FnREFGSUFRcEF3QUxJUUVnQlNBR05nSTBJQUZDSUlpbklRTUNRQ0FHQkVBZ0EwRjFUd1JBSUFHbklnTWdBeWdDQUVFQmFqWUNBQXNnQUNBQkVJb0JEQUVMSUFOQmRVOEVRQ0FCcHlJRElBTW9BZ0JCQVdvMkFnQUxJQVVvQW1SQkNHc2dBVGNEQUFzZ0FDQUZFSWtGUW9DQWdJQXdDN29CQVFGL0lBQkIwQUFRWHlJRkJFQWdCVUVBTmdJRUlBVWdCVUhJQUdvaUJqWUNUQ0FGSUFZMkFrZ0NRQ0FBSUFWQkNHb2lCaUFCSUFJZ0F5QUVFTzBEQkVBZ0JVRUZOZ0lFREFFTElBQWdCaEMwQWlJQ1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUNFQThnQUNBQlFUa1FaU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQlNBQnB5SUFOZ0lBSUFGQ2dJQ0FnSEJhQkVBZ0FDQUZOZ0lnQ3lBQkR3c2dBQ2dDRUNBRkVJY0ZDMEtBZ0lDQTRBQUxzZ01DQlg4RGZpTUFRUkJySWdRa0FBSkFBa0FnQXlrREFDSUxRb0NBZ0lCd1dnUkFJQXVuSWdjdkFRWkJFMnRCLy84RGNVRUNTUTBCQ3lBQVFSTVFoZ05DZ0lDQWdPQUFJUW9NQVF0Q2dJQ0FnT0FBSVFvZ0J5Z0NJQ0lGUlEwQUlBUkNBRGNEQ0NBQ1FRSk9CRUFnQUNBRVFRaHFJQU1wQXdnUXBnRU5BUXNnQlMwQUJBUkFJQUFRYXd3QkN5QUVLUU1JSWdrZ0JTZ0NBQ0lHckZZRVFDQUFRWWN1UVFBUVVBd0JDeUFHSUFtbklnaHJJUVlDUUNBQ1FRTklEUUFnQXlrREVDSUpRb0NBZ0lCd2cwS0FnSUNBTUZFTkFDQUFJQVFnQ1JDbUFRMEJJQVFwQXdBaUNTQUdyVllFUUNBQVFhSFpBRUVBRUZBTUFnc2dDYWNoQmdzZ0FDQUJRU0FRWlNJQlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBQ1FBSkFJQVV0QUFRRVFDQUFFR3NNQVFzZ0FFRVlFQ2tpQWcwQkN5QUFJQUVRRHd3QkN5QUNJQUduSWdBMkFnZ2dDMElnaUtkQmRVOEVRQ0FISUFjb0FnQkJBV28yQWdBTElBSWdCallDRkNBQ0lBZzJBaEFnQWlBSE5nSU1JQVVvQWd3aUF5QUNOZ0lFSUFJZ0JVRU1hallDQkNBQ0lBTTJBZ0FnQlNBQ05nSU1JQUFnQWpZQ0lDQUJJUW9MSUFSQkVHb2tBQ0FLQ3hNQUlBQkJ5UG9BUVFBUUZVS0FnSUNBNEFBTFFnRUJmaU1BUVJCcklnSWtBRUtBZ0lDQTRBQWhCQ0FBSUFKQkNHb2dBeWtEQUJDbUFVVUVRQ0FBSUFFZ0Fpa0RDRUVVRU53RElRUUxJQUpCRUdva0FDQUVDMEFCQVg0akFFRVFheUlDSkFCQ2dJQ0FnT0FBSVFRZ0FDQUNRUWhxSUFNcEF3QVFwZ0ZGQkVBZ0FDQUJJQUlwQXdnUStRSWhCQXNnQWtFUWFpUUFJQVFMaEFZQ0EzOEhmaU1BUVNCcklnVWtBRUtBZ0lDQTRBQWhEUUpBSUFBZ0FTQUVRU1pxRUdVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQVFvQ0FnSUF3SVFvQ1FBSkFBa0FDUUNBQVFSd1FYeUlHUlEwQUlBWWdCRUVCZGtFQmNUWUNBQ0FHSUFaQkJHb2lCellDQ0NBR0lBYzJBZ1FnQVVLQWdJQ0FjRm9FUUNBQnB5QUdOZ0lnQ3lBR1FRRTJBaFFnQmlBQVFRZ1FLU0lITmdJUVFvQ0FnSUF3SVF0Q2dJQ0FnREFoQ0NBSFJRMENJQWNnQnpZQ0JDQUhJQWMyQWdBZ0JrRUVOZ0lZSUFKQkFFd05BeUFES1FNQUlnaENnSUNBZ0JDRVFvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQXlBQUlBRkI2QUJCd2dBZ0JFRUJjU0lDR3lBQlFRQVFGQ0lLUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBS0VEZ05BU0FBUVpETUFFRUFFQlVMUW9DQWdJQXdJUXRDZ0lDQWdEQWhDQXdCQ3lBQUlBaEJBQkRuQVNJSVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBTUFRc0NRQ0FBSUFoQjZnQWdDRUVBRUJRaUMwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUFrQURRQ0FGSUFBZ0NDQUxJQVZCRkdvUXJnRWlDVGNER0NBSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFJZ0JTZ0NGRVVFUUFKQUlBSUVRQ0FBSUFvZ0FVRUJJQVZCR0dvUUlTSU9Rb0NBZ0lCd2cwS0FnSUNBNEFCU0RRRWdBQ0FGS1FNWUVBOE1CUXNDUUFKQUlBbEMvLy8vLzI5WUJFQWdBQkFrUW9DQWdJQXdJUWtNQVFzZ0FDQUpRZ0FRVFNJSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJTRFFFTFFvQ0FnSUF3SVF3TUJBc2dBQ0FGS1FNWVFnRVFUU0lNUW9DQWdJQndnMEtBZ0lDQTRBQlJEUU1nQlNBTU53TUlJQVVnQ1RjREFDQUFJQW9nQVVFQ0lBVVFJU0lPUW9DQWdJQndnMEtBZ0lDQTRBQlJEUU1nQUNBSkVBOGdBQ0FNRUE4TElBQWdEaEFQSUFBZ0JTa0RHQkFQREFFTEN5QUFJQWtRRHlBQUlBc1FEeUFBSUFnUUR5QUFJQW9RRHd3REN5QUFJQVVwQXhnUUR5QUFJQWtRRHlBQUlBd1FEd3NnQ0VLQWdJQ0FjRlFOQUNBQUlBaEJBUkN0QVJvTElBQWdDeEFQSUFBZ0NCQVBJQUFnQ2hBUElBQWdBUkFQREFFTElBRWhEUXNnQlVFZ2FpUUFJQTBMMXdNQ0FYOERmaU1BUVNCcklnWWtBQUpBQWtBQ1FDQUZRUUZ4QkVCQ2dJQ0FnT0FBSVFjZ0FDQUdRUmhxSUFGQjNnQVFnUUVpQlVVTkF3SkFJQVVwQXdBaUFVS0FnSUNBY0ZvRVFDQUJweTBBQlVFUWNRMEJDeUFBUWFJK1FRQVFGUXdFQ3lBR0tRTVlJZ2hDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUFnQVNBQ0lBTWdCQkNRQXlFSERBUUxJQUFnQXlBRUVJa0RJZ2xDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BaUFGS1FNQUlRRWdCaUFDTndNUUlBWWdDVGNEQ0NBR0lBRTNBd0FnQUNBSUlBVXBBd2hCQXlBR0VDRWlBVUwvLy8vL2IxWU5BU0FCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUVnQUNBQkVBOGdBQkFrREFJTFFvQ0FnSURnQUNFSElBQWdCa0VZYWlBQlFkb0FFSUVCSWdWRkRRSWdCaWtER0NFQklBVXRBQkJGQkVBZ0FDQUJFQThnQUVHYnpBQkJBQkFWREFNTElBRkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBQWdCU2tEQUNBQ0lBTWdCQkFoSVFjTUF3c2dBQ0FESUFRUWlRTWlDRUtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQVVwQXdBaEJ5QUdJQWczQXhBZ0JpQUNOd01JSUFZZ0J6Y0RBQ0FBSUFFZ0JTa0RDRUVESUFZUUlTRUhDeUFBSUFFUUR5QUFJQWdRRHd3Q0N5QUJJUWNMSUFBZ0NCQVBJQUFnQ1JBUEN5QUdRU0JxSkFBZ0J3dUNCUUVEZmlBREtRTUlJUVlDUUNBQUlBTXBBd0FpQkJEUUF5SUNRUUJPQkVBQ1FDQUJRb0NBZ0lCd2cwS0FnSUNBTUZJTkFDQUFLQUlRS0FLTUFTa0RDQ0VCSUFKRklBWkNnSUNBZ0hDRFFvQ0FnSUF3VW5JTkFDQUFJQVJCUENBRVFRQVFGQ0lGUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUFnQlE4TElBQWdCU0FCRUZJaEF5QUFJQVVRRHlBRFJRMEFJQVJDSUlpblFYVkpEUUlnQktjaUFDQUFLQUlBUVFGcU5nSUFEQUlMQWtBQ1FBSkFBa0FDUUNBRVFvQ0FnSUJ3VkEwQUlBU25JZ012QVFaQkVrY05BQ0FES0FJZ0lnSWdBaWdDQUVFQmFqWUNBQ0FDclVLQWdJQ0FrSCtFSVFVZ0JrS0FnSUNBY0lOQ2dJQ0FnREJTRFFFZ0F5Z0NKQ0lDSUFJb0FnQkJBV28yQWdBZ0FxMUNnSUNBZ0pCL2hDRUVEQU1MQWtBQ1FBSkFJQUlFUUNBQUlBUkI3QUFnQkVFQUVCUWlCVUtBZ0lDQWNJTkNnSUNBZ09BQVVRUkFRb0NBZ0lBd0lRWU1DQXNnQmtLQWdJQ0FjSU5DZ0lDQWdEQlJCRUFnQUNBRVFlMEFJQVJCQUJBVUlnWkNnSUNBZ0hDRFFvQ0FnSURnQUZJTkJBd0lDeUFGSVFRZ0JrSWdpS2RCZEVzTkFRd0RDeUFFUWlDSXAwRjFUd1JBSUFTbklnSWdBaWdDQUVFQmFqWUNBQXNnQmtJZ2lLZEJkVWtOQVFzZ0JxY2lBaUFDS0FJQVFRRnFOZ0lBQ3lBRUlRVUxJQVZDZ0lDQWdIQ0RRb0NBZ0lBd1VRUkFJQUJCTHhBdElRVU1BZ3NnQUNBRkVDZ2hCQ0FBSUFVUUR5QUVJZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5Bd3dCQ3lBQUlBWVFLQ0lHUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlMSUFBZ0JTQUdFSmdFSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBWVFEd3NnQUNBQklBVWdCQkRlQlE4TElBQWdCUkFQSUFBZ0JoQVBDMEtBZ0lDQTRBQVBDeUFFQzZJT0FnZC9BWDRqQUVIZ0FHc2lCeVFBSUFkQkNHcEJBRUhRQUJBckdpQUhJQVEyQWhRZ0J5QUFOZ0lJSUFjZ0FpQURhaUlETmdKRUlBY2dBallDUUNBSFFRRTJBaEFnQjBLZ2dJQ0FFRGNER0FKQUlBSXRBQUJCSTBjTkFDQUNMUUFCUVNGSERRQWdCeUFDUVFKcUlnSTJBbHdEUUFKQUFrQUNRQ0FDSUFOUERRQUNRQ0FDTFFBQUlnaEJDbXNPQkFFQUFBRUFDeUFJd0VFQVRnMENJQUpCQmlBSFFkd0FhaEJZSWdoQmZuRkJxTUFBUncwQklBY29BbHdoQWdzZ0J5QUNOZ0pBREFNTElBY29BbHdoQWlBSVFYOUhEUUVMSUFjZ0FrRUJhaUlDTmdKY0RBQUxBQXNDUUFKQUFrQUNRQUpBQWtBQ2Z3SkFBa0FDUUFKQUFuOGdCVUVEY1NJS1FRSkdCRUFnQUNnQ0VDZ0NqQUVpQzBVTkJDQUxLUU1JSWc1Qy8vLy8vMjlZRFFNZ0RxY2lBaThCQmhEdUFVVU5BaUFDS0FJa0lReEJBQ0VJSUFJb0FpQWlBeTBBRUF3QkN5QUZRUU4ySVFJZ0NrRUJSd1JBUVFBaEEwRUFJUWdnQWtFRGNRd0JDMEtBZ0lDQTRBQWhEaUFBSUFRUXFnRWlBMFVOQ3lBQVFmQUFFRjhpQ0VVRVFDQUFJQU1RRXd3TUN5QUlRb0NBZ0lBd053Tm9JQWhDZ0lDQWdEQTNBMkFnQ0VLQWdJQ0FNRGNEU0NBSVFvQ0FnSUF3TndOQUlBZ2dBellDQkNBSVFRRTJBZ0FnQUNnQzlBRWlBeUFJUVFocUlnazJBZ1FnQ0NBQVFmUUJhallDRENBSUlBTTJBZ2dnQUNBSk5nTDBBVUVBSVFNZ0FrRUNjVUVCY2dzaENTQUFRUUJCQVVFQUlBUkJBUkRvQXlJQ1JRMEhJQWNnQWpZQ1NDQUNJQXBCQWtjaUJEWUNUQ0FDSUFvMkFpUWdBaUFGUVFaMlFRRnhOZ0pvQWtBZ0JFVUVRQ0FDSUFNdkFCRkJCblpCQVhFMkFsQWdBaUFETHdBUlFRZDJRUUZ4TmdKVUlBSWdBeTBBRWtFQmNUWUNXQ0FETHdBUklRUWdBa0hRQURZQ2NDQUNJQWs2QUc0Z0FpQUVRUWwyUVFGeE5nSmNEQUVMSUFKQjBBQTJBbkFnQWlBSk9nQnVJQUpDZ0lDQWdCQTNBbGdnQWtJQU53SlFJQUlnQTBVTkJSb0xJQU1vQWp3aEJDQURMd0VxSVFrZ0F5OEJLQ0VLSUFKQkFEWUN3QUlnQWtFQU5nTElBaUFDSUFRZ0NTQUthbW9pQ1RZQ3hBSWdBaUFKUlEwRUdpQUNJQUFnQ1VFRGRCQXBJZ1EyQXNnQ0lBUkZEUVVEUUNBR1FRQk9CRUFnQXlnQ0lDQUdJQU12QVNocVFRUjBhaUlFS0FJRVFRQktCRUFnQWlBQ0tBTEFBaUlKUVFGcU5nTEFBaUFBSUFJb0FzZ0NJQWxCQTNScUlBUWdCaERuQXdzZ0JDZ0NDQ0VHREFFTEMwRUFJUVFnQmtGK1JnUkFBMEFnQkNBREx3RXFUdzBGQWtBZ0F5Z0NJQ0FFSUFNdkFTaHFRUVIwYWlJR0tBSUVEUUFnQmhDZUJVVU5BQ0FDSUFJb0FzQUNJZ2xCQVdvMkFzQUNJQUFnQWlnQ3lBSWdDVUVEZEdvZ0JpQUVFT2NEQ3lBRVFRRnFJUVFNQUFzQUN3TkFJQU12QVNnZ0JFMEVRRUVBSVFRRFFDQUVJQU12QVNwUERRWUNRQ0FES0FJZ0lBUWdBeThCS0dwQkJIUnFJZ1lvQWdRTkFDQUdLQUlBUWRFQVJnMEFJQUlnQWlnQ3dBSWlDVUVCYWpZQ3dBSWdBQ0FDS0FMSUFpQUpRUU4wYWlBR0lBUVE1d01MSUFSQkFXb2hCQXdBQ3dBRklBSWdBaWdDd0FJaUJrRUJhallDd0FJZ0F5Z0NJQ0VKSUFJb0FzZ0NJQVpCQTNScUlnWWdCRHNCQWlBR1FRTTZBQUFnQmlBQUlBa2dCRUVFZEdvb0FnQVFHRFlDQkNBRVFRRnFJUVFNQVFzQUN3QUxRYkdTQVVHdS9BQkJ3SVlDUWU3V0FCQUFBQXRCNm9FQlFhNzhBRUcraGdKQjd0WUFFQUFBQzBHWGhBRkJydndBUWIyR0FrSHUxZ0FRQUFBTFFRQWhCZ05BSUFZZ0F5Z0NQRTVGQkVBZ0F5Z0NKQ0VKSUFJZ0FpZ0N3QUlpQkVFQmFqWUN3QUlnQWlnQ3lBSWdCRUVEZEdvaUJDQUVMUUFBSWdwQi9nRnhPZ0FBSUFRZ0NTQUdRUU4wYWlJSkxRQUFRUUp4SUFwQi9BRnhjaUlLT2dBQUlBUWdDa0g2QVhFZ0NTMEFBRUVFY1hJaUNqb0FBQ0FFSUFwQjlnRnhJQWt0QUFCQkNIRnlJZ282QUFBZ0NTMEFBQ0VOSUFRZ0Jqc0JBaUFFSUFwQkRuRWdEVUh3QVhGeU9nQUFJQVFnQUNBSktBSUVFQmcyQWdRZ0JrRUJhaUVHREFFTEN5QUhLQUpJQ3lFRUlBSWdDRFlDbEFNZ0J5QUlSVFlDVUNBSElBaEJBRWMyQWt3Z0IwRUlhaUlERUlBQkdpQUNJQUlvQXJ3Qk5nTHdBU0FERUJJTkFDQUhRUWhxRUowRkRRQkJBU0VESUFRZ0JDZ0NKRUVDVHdSL0lBUXRBRzVCQVhFRlFRQUxSVFlDS0NBSEtBSk1SUVJBSUFRZ0J5Z0NDQ0FFUWRFQUVFOGlBellDcEFFZ0EwRUFTQTBCQ3dOQUlBY29BaGhCckg5R0RRSWdCMEVJYWhDY0JVVU5BQXNMSUFkQkNHb2dCMEVZYWhEL0FTQUFJQUlRL1FJTUFRdEJLU0VESUFkQkNHb2dCeWdDVEFSL1FTa0ZJQWRCQ0dwQjJBQVFFQ0FIS0FKSVFZQUNhaUFFTHdHa0FSQXFRU2dMRUJBZ0FDQUNFSnNGSWc1Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQUNBSUJFQWdDQ0FPTndOSUlBQWdDQkQrQTBFQVNBMENJQWdnQ0NnQ0FFRUJhallDQUNBSXJVS0FnSUNBVUlRaERnc2dCVUVnY1EwRElBQWdEaUFCSUF3Z0N4RElCU0VPREFNTElBaEZEUUVMSUFBZ0NCRG5CUXRDZ0lDQWdPQUFJUTRMSUFkQjRBQnFKQUFnRGd2YkJRTUZmd04rQVh3akFFRkFhaUlGSkFBQ1FBSjhBa0FDUUFKQUFrQUNRQ0FDUVFBZ0FVS0FnSUNBY0lNaUMwS0FnSUNBTUZJYklnSU9BZ0lBQVFzQ1FDQURLUU1BSWdsQ2dJQ0FnSEJVRFFBZ0NhY2lCQzhCQmtFS1J3MEFJQVFwQXlBaUNrSWdpS2NpQkVFQUlBUkJDMnBCRWtrYkRRQWdBQ0FGSUFvUVFnMEREQVFMSUFVZ0FDQUpRUUlRa0FJaUNUY0RPQ0FKUW9DQWdJQndnMEtBZ0lDQWtIOVJCRUFnQUNBQklBUWdCVUU0YWhEUkJDRUtJQUFnQ1JBUElBcENnSUNBZ0hDRFFvQ0FnSURnQUZFTkF5QUFJQVVnQ2hCdVJRMEVEQU1MSUFBZ0JTQUpFRzVGRFFNTUFnc2dCVUVBUVRnUUt5SUdRb0NBZ0lDQWdJRDRQemNERUVFSElBSWdBa0VIVGhzaUIwRUFJQWRCQUVvYklRSURRQUpBSUFJZ0JFY0VRQ0FBSUFaQk9Hb2dBeUFFUVFOMElnaHFLUU1BRUVJTkJDQUdLd000SWd5OVFvQ0FnSUNBZ0lENC93Q0RRb0NBZ0lDQWdJRDQvd0JTRFFFZ0JDRUNDMFFBQUFBQUFBRDRmeUFDSUFkSERRVWFJQVpCQVJEZ0Fnd0ZDeUFHSUFocUlBeWRPUU1BQWtBZ0JBMEFJQVlyQXdBaURFUUFBQUFBQUFBQUFHWkZJQXhFQUFBQUFBQUFXVUJqUlhJTkFDQUdJQXhFQUFBQUFBQ3duVUNnT1FNQUN5QUVRUUZxSVFRTUFBc0FDeERRQkxrTUFndENnSUNBZ09BQUlRRU1BZ3NnQlNzREFDSU1uVVFBQUFBQUFBQUFBS0JFQUFBQUFBQUErSDhnREVRQUFOekNDTEkrUTJVYlJBQUFBQUFBQVBoL0lBeEVBQURjd2dpeVBzTm1Hd3NoREFKQUlBQWdBVUVLRUdVaUNVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdDUUorSUF5OUlnRUNmeUFNbVVRQUFBQUFBQURnUVdNRVFDQU1xZ3dCQzBHQWdJQ0FlQXNpQkxlOVVRUkFJQVN0REFFTFFvQ0FnSURBZmlBQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeERiQVNBTFFvQ0FnSUF3VWcwQUlBQWdDU0FFSUFSQkV4RFBCQ0VCSUFBZ0NSQVBEQUVMSUFraEFRc2dCVUZBYXlRQUlBRUxxQUVCQlg4Z0FDZ0NWQ0lES0FJQUlRVWdBeWdDQkNJRUlBQW9BaFFnQUNnQ0hDSUhheUlHSUFRZ0Jra2JJZ1lFUUNBRklBY2dCaEFmR2lBRElBTW9BZ0FnQm1vaUJUWUNBQ0FESUFNb0FnUWdCbXNpQkRZQ0JBc2dCQ0FDSUFJZ0JFc2JJZ1FFUUNBRklBRWdCQkFmR2lBRElBTW9BZ0FnQkdvaUJUWUNBQ0FESUFNb0FnUWdCR3MyQWdRTElBVkJBRG9BQUNBQUlBQW9BaXdpQVRZQ0hDQUFJQUUyQWhRZ0Fnc3BBQ0FCSUFFb0FnQkJCMnBCZUhFaUFVRVFhallDQUNBQUlBRXBBd0FnQVNrRENCQy9CVGtEQUF1VEdBTVNmd0Y4QTM0akFFR3dCR3NpRENRQUlBeEJBRFlDTEFKQUlBRzlJaGxDQUZNRVFFRUJJUkZCdGlFaEV5QUJtaUlCdlNFWkRBRUxJQVJCZ0JCeEJFQkJBU0VSUWJraElSTU1BUXRCdkNGQnR5RWdCRUVCY1NJUkd5RVRJQkZGSVJVTEFrQWdHVUtBZ0lDQWdJQ0ErUDhBZzBLQWdJQ0FnSUNBK1A4QVVRUkFJQUJCSUNBQ0lCRkJBMm9pQXlBRVFmLy9lM0VRWXlBQUlCTWdFUkJiSUFCQjRORUFRWlNEQVNBRlFTQnhJZ1ViUWF6ZEFFR0JoZ0VnQlJzZ0FTQUJZaHRCQXhCYklBQkJJQ0FDSUFNZ0JFR0F3QUJ6RUdNZ0F5QUNJQUlnQTBnYklRa01BUXNnREVFUWFpRVNBa0FDZndKQUlBRWdERUVzYWhDRkJpSUJJQUdnSWdGRUFBQUFBQUFBQUFCaUJFQWdEQ0FNS0FJc0lnWkJBV3MyQWl3Z0JVRWdjaUlPUWVFQVJ3MEJEQU1MSUFWQklISWlEa0hoQUVZTkFpQU1LQUlzSVFwQkJpQURJQU5CQUVnYkRBRUxJQXdnQmtFZGF5SUtOZ0lzSUFGRUFBQUFBQUFBc0VHaUlRRkJCaUFESUFOQkFFZ2JDeUVMSUF4Qk1HcEJvQUpCQUNBS1FRQk9HMm9pRFNFSEEwQWdCd0ovSUFGRUFBQUFBQUFBOEVGaklBRkVBQUFBQUFBQUFBQm1jUVJBSUFHckRBRUxRUUFMSWdNMkFnQWdCMEVFYWlFSElBRWdBN2loUkFBQUFBQmx6YzFCb2lJQlJBQUFBQUFBQUFBQVlnMEFDd0pBSUFwQkFFd0VRQ0FLSVFNZ0J5RUdJQTBoQ0F3QkN5QU5JUWdnQ2lFREEwQkJIU0FESUFOQkhVNGJJUU1DUUNBSFFRUnJJZ1lnQ0VrTkFDQURyU0VhUWdBaEdRTkFJQVlnR1VMLy8vLy9ENE1nQmpVQ0FDQWFobndpRzBLQWxPdmNBNEFpR1VLQTdKU2pESDRnRzN3K0FnQWdCa0VFYXlJR0lBaFBEUUFMSUJtbklnWkZEUUFnQ0VFRWF5SUlJQVkyQWdBTEEwQWdDQ0FISWdaSkJFQWdCa0VFYXlJSEtBSUFSUTBCQ3dzZ0RDQU1LQUlzSUFOcklnTTJBaXdnQmlFSElBTkJBRW9OQUFzTElBTkJBRWdFUUNBTFFSbHFRUWx1UVFGcUlROGdEa0htQUVZaEVBTkFRUWxCQUNBRGF5SURJQU5CQ1U0YklRa0NRQ0FHSUFoTkJFQWdDQ2dDQUNFSERBRUxRWUNVNjl3RElBbDJJUlJCZnlBSmRFRi9jeUVXUVFBaEF5QUlJUWNEUUNBSElBTWdCeWdDQUNJWElBbDJhallDQUNBV0lCZHhJQlJzSVFNZ0IwRUVhaUlISUFaSkRRQUxJQWdvQWdBaEJ5QURSUTBBSUFZZ0F6WUNBQ0FHUVFScUlRWUxJQXdnRENnQ0xDQUphaUlETmdJc0lBMGdDQ0FIUlVFQ2RHb2lDQ0FRR3lJSElBOUJBblJxSUFZZ0JpQUhhMEVDZFNBUFNoc2hCaUFEUVFCSURRQUxDMEVBSVFNQ1FDQUdJQWhORFFBZ0RTQUlhMEVDZFVFSmJDRURRUW9oQnlBSUtBSUFJZ2xCQ2trTkFBTkFJQU5CQVdvaEF5QUpJQWRCQ213aUIwOE5BQXNMSUFzZ0EwRUFJQTVCNWdCSEcyc2dEa0huQUVZZ0MwRUFSM0ZySWdjZ0JpQU5hMEVDZFVFSmJFRUphMGdFUUVFRVFhUUNJQXBCQUVnYklBeHFJQWRCZ01nQWFpSUpRUWx0SWc5QkFuUnFRZEFmYXlFS1FRb2hCeUFQUVhkc0lBbHFJZ2xCQjB3RVFBTkFJQWRCQ213aEJ5QUpRUUZxSWdsQkNFY05BQXNMQWtBZ0NpZ0NBQ0lRSUJBZ0IyNGlEeUFIYkNJSlJpQUtRUVJxSWhRZ0JrWnhEUUFnRUNBSmF5RVFBa0FnRDBFQmNVVUVRRVFBQUFBQUFBQkFReUVCSUFkQmdKVHIzQU5ISUFnZ0NrOXlEUUVnQ2tFRWF5MEFBRUVCY1VVTkFRdEVBUUFBQUFBQVFFTWhBUXRFQUFBQUFBQUE0RDlFQUFBQUFBQUE4RDlFQUFBQUFBQUErRDhnQmlBVVJodEVBQUFBQUFBQStEOGdFQ0FIUVFGMkloUkdHeUFRSUJSSkd5RVlBa0FnRlEwQUlCTXRBQUJCTFVjTkFDQVltaUVZSUFHYUlRRUxJQW9nQ1RZQ0FDQUJJQmlnSUFGaERRQWdDaUFISUFscUlnTTJBZ0FnQTBHQWxPdmNBMDhFUUFOQUlBcEJBRFlDQUNBSUlBcEJCR3NpQ2tzRVFDQUlRUVJySWdoQkFEWUNBQXNnQ2lBS0tBSUFRUUZxSWdNMkFnQWdBMEgvayt2Y0Ewc05BQXNMSUEwZ0NHdEJBblZCQ1d3aEEwRUtJUWNnQ0NnQ0FDSUpRUXBKRFFBRFFDQURRUUZxSVFNZ0NTQUhRUXBzSWdkUERRQUxDeUFLUVFScUlnY2dCaUFHSUFkTEd5RUdDd05BSUFZaUJ5QUlUU0lKUlFSQUlBZEJCR3NpQmlnQ0FFVU5BUXNMQWtBZ0RrSG5BRWNFUUNBRVFRaHhJUW9NQVFzZ0EwRi9jMEYvSUF0QkFTQUxHeUlHSUFOS0lBTkJlMHB4SWdvYklBWnFJUXRCZjBGK0lBb2JJQVZxSVFVZ0JFRUljU0lLRFFCQmR5RUdBa0FnQ1EwQUlBZEJCR3NvQWdBaURrVU5BRUVLSVFsQkFDRUdJQTVCQ25BTkFBTkFJQVlpQ2tFQmFpRUdJQTRnQ1VFS2JDSUpjRVVOQUFzZ0NrRi9jeUVHQ3lBSElBMXJRUUoxUVFsc0lRa2dCVUZmY1VIR0FFWUVRRUVBSVFvZ0N5QUdJQWxxUVFscklnWkJBQ0FHUVFCS0d5SUdJQVlnQzBvYklRc01BUXRCQUNFS0lBc2dBeUFKYWlBR2FrRUpheUlHUVFBZ0JrRUFTaHNpQmlBR0lBdEtHeUVMQzBGL0lRa2dDMEg5Ly8vL0IwSCsvLy8vQnlBS0lBdHlJaEFiU2cwQklBc2dFRUVBUjJwQkFXb2hEZ0pBSUFWQlgzRWlGVUhHQUVZRVFDQURJQTVCLy8vLy93ZHpTZzBESUFOQkFDQURRUUJLR3lFR0RBRUxJQklnQXlBRFFSOTFJZ1p6SUFacnJTQVNFSlVDSWdaclFRRk1CRUFEUUNBR1FRRnJJZ1pCTURvQUFDQVNJQVpyUVFKSURRQUxDeUFHUVFKcklnOGdCVG9BQUNBR1FRRnJRUzFCS3lBRFFRQklHem9BQUNBU0lBOXJJZ1lnRGtILy8vLy9CM05LRFFJTElBWWdEbW9pQXlBUlFmLy8vLzhIYzBvTkFTQUFRU0FnQWlBRElCRnFJZ1VnQkJCaklBQWdFeUFSRUZzZ0FFRXdJQUlnQlNBRVFZQ0FCSE1RWXdKQUFrQUNRQ0FWUWNZQVJnUkFJQXhCRUdvaUJrRUljaUVESUFaQkNYSWhDaUFOSUFnZ0NDQU5TeHNpQ1NFSUEwQWdDRFVDQUNBS0VKVUNJUVlDUUNBSUlBbEhCRUFnQmlBTVFSQnFUUTBCQTBBZ0JrRUJheUlHUVRBNkFBQWdCaUFNUVJCcVN3MEFDd3dCQ3lBR0lBcEhEUUFnREVFd09nQVlJQU1oQmdzZ0FDQUdJQW9nQm1zUVd5QUlRUVJxSWdnZ0RVME5BQXNnRUFSQUlBQkIyWkFCUVFFUVd3c2dDMEVBVENBSElBaE5jZzBCQTBBZ0NEVUNBQ0FLRUpVQ0lnWWdERUVRYWtzRVFBTkFJQVpCQVdzaUJrRXdPZ0FBSUFZZ0RFRVFha3NOQUFzTElBQWdCa0VKSUFzZ0MwRUpUaHNRV3lBTFFRbHJJUVlnQ0VFRWFpSUlJQWRQRFFNZ0MwRUpTaUVESUFZaEN5QUREUUFMREFJTEFrQWdDMEVBU0EwQUlBY2dDRUVFYWlBSElBaExHeUVKSUF4QkVHb2lCa0VJY2lFRElBWkJDWEloRFNBSUlRY0RRQ0FOSUFjMUFnQWdEUkNWQWlJR1JnUkFJQXhCTURvQUdDQURJUVlMQWtBZ0J5QUlSd1JBSUFZZ0RFRVFhazBOQVFOQUlBWkJBV3NpQmtFd09nQUFJQVlnREVFUWFrc05BQXNNQVFzZ0FDQUdRUUVRV3lBR1FRRnFJUVlnQ2lBTGNrVU5BQ0FBUWRtUUFVRUJFRnNMSUFBZ0JpQUxJQTBnQm1zaUJpQUdJQXRLR3hCYklBc2dCbXNoQ3lBSFFRUnFJZ2NnQ1U4TkFTQUxRUUJPRFFBTEN5QUFRVEFnQzBFU2FrRVNRUUFRWXlBQUlBOGdFaUFQYXhCYkRBSUxJQXNoQmdzZ0FFRXdJQVpCQ1dwQkNVRUFFR01MSUFCQklDQUNJQVVnQkVHQXdBQnpFR01nQlNBQ0lBSWdCVWdiSVFrTUFRc2dFeUFGUVJwMFFSOTFRUWx4YWlFSUFrQWdBMEVMU3cwQVFRd2dBMnNoQmtRQUFBQUFBQUF3UUNFWUEwQWdHRVFBQUFBQUFBQXdRS0loR0NBR1FRRnJJZ1lOQUFzZ0NDMEFBRUV0UmdSQUlCZ2dBWm9nR0tHZ21pRUJEQUVMSUFFZ0dLQWdHS0VoQVFzZ0VVRUNjaUVMSUFWQklIRWhEU0FTSUF3b0Fpd2lCeUFIUVI5MUlnWnpJQVpyclNBU0VKVUNJZ1pHQkVBZ0RFRXdPZ0FQSUF4QkQyb2hCZ3NnQmtFQ2F5SUtJQVZCRDJvNkFBQWdCa0VCYTBFdFFTc2dCMEVBU0JzNkFBQWdCRUVJY1NFR0lBeEJFR29oQndOQUlBY2lCUUovSUFHWlJBQUFBQUFBQU9CQll3UkFJQUdxREFFTFFZQ0FnSUI0Q3lJSFFiREZCR290QUFBZ0RYSTZBQUFnQmlBRFFRQktja1VnQVNBSHQ2RkVBQUFBQUFBQU1FQ2lJZ0ZFQUFBQUFBQUFBQUJoY1NBRlFRRnFJZ2NnREVFUWFtdEJBVWR5UlFSQUlBVkJMam9BQVNBRlFRSnFJUWNMSUFGRUFBQUFBQUFBQUFCaURRQUxRWDhoQ1VIOS8vLy9CeUFMSUJJZ0Ntc2lCbW9pRFdzZ0EwZ05BQ0FBUVNBZ0FpQU5JQU5CQW1vZ0J5QU1RUkJxSWdkcklnVWdCVUVDYXlBRFNCc2dCU0FER3lJSmFpSURJQVFRWXlBQUlBZ2dDeEJiSUFCQk1DQUNJQU1nQkVHQWdBUnpFR01nQUNBSElBVVFXeUFBUVRBZ0NTQUZhMEVBUVFBUVl5QUFJQW9nQmhCYklBQkJJQ0FDSUFNZ0JFR0F3QUJ6RUdNZ0F5QUNJQUlnQTBnYklRa0xJQXhCc0FScUpBQWdDUXNXQUNBQUlBQXBBOEFCSUFNcEF3QkJBMEYvRUp3REN3VUFJQUNkQzk0QkF3RjhBWDhCZmlBQW1TRUJBa0FnQUwwaUEwS0FnSUNBOFAvLy8vOEFnMElnaUtjaUFrSHJwNGIvQTA4RVFDQUNRWUdBMElFRVR3UkFSQUFBQUFBQUFBQ0FJQUdqUkFBQUFBQUFBUEEvb0NFQkRBSUxSQUFBQUFBQUFQQS9SQUFBQUFBQUFBQkFJQUVnQWFBUWx3SkVBQUFBQUFBQUFFQ2dvNkVoQVF3QkN5QUNRYSt4d2Y0RFR3UkFJQUVnQWFBUWx3SWlBQ0FBUkFBQUFBQUFBQUJBb0tNaEFRd0JDeUFDUVlDQXdBQkpEUUFnQVVRQUFBQUFBQUFBd0tJUWx3SWlBSm9nQUVRQUFBQUFBQUFBUUtDaklRRUxJQUdhSUFFZ0EwSUFVeHNMaEFFQkFuOGpBRUVRYXlJQkpBQUNRQ0FBdlVJZ2lLZEIvLy8vL3dkeElnSkIrOE9rL3dOTkJFQWdBa0dBZ0lEeUEwa05BU0FBUkFBQUFBQUFBQUFBUVFBUWhnWWhBQXdCQ3lBQ1FZQ0F3UDhIVHdSQUlBQWdBS0VoQUF3QkN5QUFJQUVRbkFRaEFpQUJLd01BSUFFckF3Z2dBa0VCY1JDR0JpRUFDeUFCUVJCcUpBQWdBQXZtQXdNR2ZBRitBMzhDUUFKQUFrQUNRQ0FBdlNJSFFnQlpCRUFnQjBJZ2lLY2lDRUgvL3o5TERRRUxJQWRDLy8vLy8vLy8vLy8vQUlOUUJFQkVBQUFBQUFBQThMOGdBQ0FBb3FNUEN5QUhRZ0JaRFFFZ0FDQUFvVVFBQUFBQUFBQUFBS01QQ3lBSVFmLy92LzhIU3cwQ1FZQ0F3UDhESVFsQmdYZ2hDaUFJUVlDQXdQOERSd1JBSUFnaENRd0NDeUFIcHcwQlJBQUFBQUFBQUFBQUR3c2dBRVFBQUFBQUFBQlFRNks5SWdkQ0lJaW5JUWxCeTNjaENnc2dDaUFKUWVLK0pXb2lDRUVVZG1xM0lnVkVBR0NmVUJORTB6K2lJZ0VnQjBMLy8vLy9ENE1nQ0VILy96OXhRWjdCbXY4RGFxMUNJSWFFdjBRQUFBQUFBQUR3djZBaUFDQUFJQUJFQUFBQUFBQUE0RCtpb2lJRG9iMUNnSUNBZ0hDRHZ5SUVSQUFBSUJWN3k5cy9vaUlDb0NJR0lBSWdBU0FHb2FBZ0FDQUFSQUFBQUFBQUFBQkFvS01pQVNBRElBRWdBYUlpQWlBQ29pSUJJQUVnQVVTZnhualFDWnJEUDZKRXIzaU9IY1Z4ekQrZ29rUUUrcGVabVpuWlA2Q2lJQUlnQVNBQklBRkVSRkkrM3hMeHdqK2lSTjREeTVaa1JzYy9vS0pFV1pNaWxDUkowaitnb2tTVFZWVlZWVlhsUDZDaW9LQ2lJQUFnQktFZ0E2R2dJZ0JFQUFBZ0ZYdkwyeitpSUFWRU5pdnhFZlArV1QyaUlBQWdCS0JFMWEyYXlqaVV1ejJpb0tDZ29DRUFDeUFBQ3dRQVFnQUxtUUVDQW53QmYwUUFBQUFBQUFEZ1B5QUFwaUVDSUFDWklRRUNRQ0FBdlVLQWdJQ0E4UC8vLy84QWcwSWdpS2NpQTBIQjNKaUVCRTBFUUNBQkVKY0NJUUVnQTBILy83Ly9BMDBFUUNBRFFZQ0F3UElEU1EwQ0lBSWdBU0FCb0NBQklBR2lJQUZFQUFBQUFBQUE4RCtnbzZHaUR3c2dBaUFCSUFFZ0FVUUFBQUFBQUFEd1A2Q2pvS0lQQ3lBQklBSWdBcUFRalFZaEFBc2dBQXZMQVFFQ2Z5TUFRUkJySWdFa0FBSkFJQUM5UWlDSXAwSC8vLy8vQjNFaUFrSDd3NlQvQTAwRVFDQUNRWUNBd1BJRFNRMEJJQUJFQUFBQUFBQUFBQUJCQUJEUEFpRUFEQUVMSUFKQmdJREEvd2RQQkVBZ0FDQUFvU0VBREFFTEFrQUNRQUpBQWtBZ0FDQUJFSndFUVFOeERnTUFBUUlEQ3lBQkt3TUFJQUVyQXdoQkFSRFBBaUVBREFNTElBRXJBd0FnQVNzRENCRFFBaUVBREFJTElBRXJBd0FnQVNzRENFRUJFTThDbWlFQURBRUxJQUVyQXdBZ0FTc0RDQkRRQXBvaEFBc2dBVUVRYWlRQUlBQUxvUUVCQkg4Z0FpQUFLQUpVSWdNb0FnUWlCQ0FES0FJQUlnVnJJZ1pCQUNBRUlBWlBHeUlFU3dSQUlBQWdBQ2dDQUVFUWNqWUNBQ0FFSVFJTElBRWdBeWdDRENBRmFpQUNFQjhhSUFNZ0F5Z0NBQ0FDYWlJRk5nSUFJQUFnQUNnQ0xDSUJOZ0lFSUFBZ0FTQUVJQUpySWdRZ0FDZ0NNQ0lBSUFBZ0JFc2JJZ0JxTmdJSUlBRWdBeWdDRENBRmFpQUFFQjhhSUFNZ0F5Z0NBQ0FBYWpZQ0FDQUNDNHNCQVFGL0l3QkJFR3NpQXlRQUFuNENRQ0FDUVFOUERRQWdBQ2dDVkNFQUlBTkJBRFlDQkNBRElBQW9BZ0EyQWdnZ0F5QUFLQUlFTmdJTVFRQWdBMEVFYWlBQ1FRSjBhaWdDQUNJQ2E2d2dBVlVOQUNBQUtBSUlJQUpyckNBQlV3MEFJQUFnQWlBQnAyb2lBRFlDQUNBQXJRd0JDMEdnMUFSQkhEWUNBRUovQ3lFQklBTkJFR29rQUNBQkM2SUJBZ0Y4QVg4Z0FKa2hBUUo4SUFDOVFvQ0FnSUR3Ly8vLy93Q0RRaUNJcHlJQ1FjSGNtUDhEVFFSQVJBQUFBQUFBQVBBL0lBSkJnSURBOGdOSkRRRWFJQUVRbHdJaUFDQUFvaUFBUkFBQUFBQUFBUEEvb0NJQUlBQ2dvMFFBQUFBQUFBRHdQNkFQQ3lBQ1FjSGNtSVFFVFFSQUlBRVE2d01pQUVRQUFBQUFBQUR3UHlBQW82QkVBQUFBQUFBQTREK2lEd3NnQVVRQUFBQUFBQUR3UHhDTkJnc0x4d0VCQW44akFFRVFheUlCSkFBQ2ZDQUF2VUlnaUtkQi8vLy8vd2R4SWdKQis4T2svd05OQkVCRUFBQUFBQUFBOEQ4Z0FrR2V3WnJ5QTBrTkFSb2dBRVFBQUFBQUFBQUFBQkRRQWd3QkN5QUFJQUNoSUFKQmdJREEvd2RQRFFBYUFrQUNRQUpBQWtBZ0FDQUJFSndFUVFOeERnTUFBUUlEQ3lBQkt3TUFJQUVyQXdnUTBBSU1Bd3NnQVNzREFDQUJLd01JUVFFUXp3S2FEQUlMSUFFckF3QWdBU3NEQ0JEUUFwb01BUXNnQVNzREFDQUJLd01JUVFFUXp3SUxJUUFnQVVFUWFpUUFJQUFMQlFBZ0FKd0xCUUFnQUpzTGd3SURBbndDZndGK0lBQzlJZ1ZDSUlpblFmLy8vLzhIY1NJRFFZQ0F3UDhIVHdSQUlBQWdBS0FQQzBHVDhmM1VBaUVFQWtBZ0EwSC8vejlOQkVCQmsvSDl5d0loQkNBQVJBQUFBQUFBQUZCRG9yMGlCVUlnaUtkQi8vLy8vd2R4SWdORkRRRUxJQVZDZ0lDQWdJQ0FnSUNBZjRNZ0EwRURiaUFFYXExQ0lJYUV2eUlDSUFLaUlBSWdBS09pSWdFZ0FTQUJvcUlnQVVUWDdlVFVBTERDUDZKRTJWSG52c3RFNkwrZ29pQUJJQUZFd3RaSlNtRHgrVCtpUkNBazhKTGdLUDYvb0tKRWt1WmhEK1lEL2orZ29DQUNvcjFDZ0lDQWdIeURRb0NBZ0lBSWZMOGlBU0FBSUFFZ0FhS2pJZ0FnQWFFZ0FTQUJvQ0FBb0tPaUlBR2dJUUFMSUFBTGV3TUJmQUYrQVg4Z0FKa2hBUUpBQW53Z0FMMGlBa0kwaUtkQi93OXhJZ05CL1FkTkJFQWdBMEhmQjBrTkFpQUJJQUdnSWdBZ0FDQUJva1FBQUFBQUFBRHdQeUFCb2FPZ0RBRUxJQUZFQUFBQUFBQUE4RDhnQWFHaklnQWdBS0FMRUtjRFJBQUFBQUFBQU9BL29pRUJDeUFCbWlBQklBSkNBRk1iQzZnREFnVi9BWDRnQUwxQy8vLy8vLy8vLy8vL0FJTkNnWUNBZ0lDQWdQai9BRlFnQWIxQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRmh4UlFSQUlBQWdBYUFQQ3lBQnZTSUhRaUNJcHlJQ1FZQ0F3UDhEYXlBSHB5SUZja1VFUUNBQUVKMEVEd3NnQWtFZWRrRUNjU0lHSUFDOUlnZENQNGluY2lFREFrQWdCMElnaUtkQi8vLy8vd2R4SWdRZ0I2ZHlSUVJBQWtBQ1FDQURRUUpyRGdJQUFRTUxSQmd0UkZUN0lRbEFEd3RFR0MxRVZQc2hDY0FQQ3lBQ1FmLy8vLzhIY1NJQ0lBVnlSUVJBUkJndFJGVDdJZmsvSUFDbUR3c0NRQ0FDUVlDQXdQOEhSZ1JBSUFSQmdJREEvd2RIRFFFZ0EwRURkRUhRcWdScUt3TUFEd3NnQkVHQWdNRC9CMGNnQWtHQWdJQWdhaUFFVDNGRkJFQkVHQzFFVlBzaCtUOGdBS1lQQ3dKOElBWUVRRVFBQUFBQUFBQUFBQ0FFUVlDQWdDQnFJQUpKRFFFYUN5QUFJQUdqbVJDZEJBc2hBQUpBQWtBQ1FDQUREZ01FQUFFQ0N5QUFtZzhMUkJndFJGVDdJUWxBSUFCRUIxd1VNeWFtb2J5Z29ROExJQUJFQjF3VU15YW1vYnlnUkJndFJGVDdJUW5Bb0E4TElBTkJBM1JCOEtvRWFpc0RBQ0VBQ3lBQUM2WUJBd0Y4QVg4QmZpQUFtU0VCQWtBZ0FMMGlBMEkwaUtkQi93OXhJZ0pCbVFoUEJFQWdBUkRNQWtUdk9mcitRaTdtUDZBaEFRd0JDeUFDUVlBSVR3UkFJQUVnQWFCRUFBQUFBQUFBOEQ4Z0FTQUJva1FBQUFBQUFBRHdQNkNmSUFHZ282QVF6QUloQVF3QkN5QUNRZVVIU1EwQUlBRWdBYUlpQUNBQVJBQUFBQUFBQVBBL29KOUVBQUFBQUFBQThEK2dveUFCb0JDbkF5RUJDeUFCbWlBQklBTkNBRk1iQ3dVQUlBQ1pDN2tDQXdGL0Ezd0JmaUFBdlNJRlFpQ0lwMEgvLy8vL0IzRWlBVUdBZ01EL0EwOEVRQ0FGcHlBQlFZQ0F3UDhEYTNKRkJFQWdBRVFZTFVSVSt5SDVQNkpFQUFBQUFBQUFjRGlnRHd0RUFBQUFBQUFBQUFBZ0FDQUFvYU1QQ3dKQUlBRkIvLy8vL2dOTkJFQWdBVUdBZ0VCcVFZQ0FnUElEU1EwQklBQWdBQ0FBb2hEU0FxSWdBS0FQQzBRQUFBQUFBQUR3UHlBQW1hRkVBQUFBQUFBQTREK2lJZ09mSVFBZ0F4RFNBaUVFQW53Z0FVR3o1cnovQTA4RVFFUVlMVVJVK3lINVB5QUFJQVNpSUFDZ0lnQWdBS0JFQjF3VU15YW1rYnlnb1F3QkMwUVlMVVJVK3lIcFB5QUF2VUtBZ0lDQWNJTy9JZ0lnQXFDaElBQWdBS0FnQktKRUIxd1VNeWFta1R3Z0F5QUNJQUtpb1NBQUlBS2dveUlBSUFDZ29hR2hSQmd0UkZUN0llay9vQXNpQUpvZ0FDQUZRZ0JUR3lFQUN5QUFDM1lCQVg4Z0FMMUNOSWluUWY4UGNTSUJRZjhIVFFSQUlBQkVBQUFBQUFBQThMK2dJZ0FnQUNBQW9pQUFJQUNnb0orZ0VLY0REd3NnQVVHWUNFMEVRQ0FBSUFDZ1JBQUFBQUFBQVBDL0lBQWdBS0pFQUFBQUFBQUE4TCtnbnlBQW9LT2dFTXdDRHdzZ0FCRE1Ba1R2T2ZyK1FpN21QNkFMQlFBZ0FKOExyZ0lEQVh3QmZnRi9JQUM5SWdKQ0lJaW5RZi8vLy84SGNTSURRWUNBd1A4RFR3UkFJQUtuSUFOQmdJREEvd05yY2tVRVFFUUFBQUFBQUFBQUFFUVlMVVJVK3lFSlFDQUNRZ0JaR3c4TFJBQUFBQUFBQUFBQUlBQWdBS0dqRHdzQ2ZDQURRZi8vLy80RFRRUkFSQmd0UkZUN0lmay9JQU5CZ1lDQTR3TkpEUUVhUkFkY0ZETW1wcEU4SUFBZ0FDQUFvaERTQXFLaElBQ2hSQmd0UkZUN0lmay9vQThMSUFKQ0FGTUVRRVFZTFVSVSt5SDVQeUFBUkFBQUFBQUFBUEEvb0VRQUFBQUFBQURnUDZJaUFKOGlBU0FCSUFBUTBnS2lSQWRjRkRNbXBwRzhvS0NoSWdBZ0FLQVBDMFFBQUFBQUFBRHdQeUFBb1VRQUFBQUFBQURnUDZJaUFKOGlBU0FBRU5JQ29pQUFJQUc5UW9DQWdJQndnNzhpQUNBQW9xRWdBU0FBb0tPZ0lBQ2dJZ0FnQUtBTEM3NENBUWQvSXdCQklHc2lBeVFBSUFNZ0FDZ0NIQ0lFTmdJUUlBQW9BaFFoQlNBRElBSTJBaHdnQXlBQk5nSVlJQU1nQlNBRWF5SUJOZ0lVSUFFZ0Ftb2hCVUVDSVFZZ0EwRVFhaUVCQW44RFFBSkFBa0FDUUNBQUtBSThJQUVnQmlBRFFReHFFQUlRandaRkJFQWdCU0FES0FJTUlnZEdEUUVnQjBFQVRnMENEQU1MSUFWQmYwY05BZ3NnQUNBQUtBSXNJZ0UyQWh3Z0FDQUJOZ0lVSUFBZ0FTQUFLQUl3YWpZQ0VDQUNEQU1MSUFFZ0J5QUJLQUlFSWdoTElnbEJBM1JxSWdRZ0J5QUlRUUFnQ1J0cklnZ2dCQ2dDQUdvMkFnQWdBVUVNUVFRZ0NSdHFJZ0VnQVNnQ0FDQUlhellDQUNBRklBZHJJUVVnQmlBSmF5RUdJQVFoQVF3QkN3c2dBRUVBTmdJY0lBQkNBRGNERUNBQUlBQW9BZ0JCSUhJMkFnQkJBQ0FHUVFKR0RRQWFJQUlnQVNnQ0JHc0xJUVFnQTBFZ2FpUUFJQVFMUmdFQmZ5QUFLQUk4SVFNakFFRVFheUlBSkFBZ0F5QUJweUFCUWlDSXB5QUNRZjhCY1NBQVFRaHFFQWdRandZaEFpQUFLUU1JSVFFZ0FFRVFhaVFBUW44Z0FTQUNHd3NKQUNBQUtBSThFQU1MdmdRQ0JIOEJmaU1BUVVCcUlnUWtBQ0FBS0FJQUlRWWdCRUlBTndJTUlBUkNnSUNBZ0lDQWdJQ0FmemNDQkNBRUlBWTJBZ0FnQkNBQklBSkJJR29pQVVIbUR4Q2ZCQ0FFSUFRZ0F5QUJRZVlQRUVNYUFrQUNRQ0FFS0FJSUlnRkIvLy8vL3dkR0JFQWdBQkExREFFTElBQWdCRVlOQVNBQUtBSUFJUWNnQkVJQU53STRJQVJDZ0lDQWdJQ0FnSUNBZnpjQ01DQUVJQWMyQWl3Q2Z5QUJRUUJJQkVCQmYwRUFJQVFvQWdRYkRBRUxJQVJCTEdvaUFVRWdRUUVRMHdJZ0FTQUVJQUZCSUVFQ0VKVUJHaUFFUVNocUlBRkJBQkNwQVNBRUtBSUlJUUVnQkNnQ0tBc2hCaUFFUVN4cUlnVWdBaUFCUVFBZ0FVRUFTaHRxSUFKQkgyb2dBa0VoYWtFQmRoQ1ZCaUlEYmtFQmFpSUJJQU5xUVFGMGFrRTZhaUlDUVFZUTB3SWdCU0FGSUFhc0lBSkJBQkRVQWlBRklBUWdCU0FDUVFBUTVBRWFJQVZCQUNBRGEwSC8vLy8vQTBFQkVNd0JHaUFFUWdBM0FpQWdCRUtBZ0lDQWdJQ0FnSUIvTndJWUlBUWdCellDRkNBQVFnRVFNQm9nQWEwaENBTkFJQWluUVFCTVJRUkFJQVJCRkdvaUFTQUlFREFhSUFFZ0JFRXNhaUFCSUFKQkFCQ1ZBUm9nQUNBQUlBRWdBa0VBRUVNYUlBQWdBRUlCSUFKQkFCQjFHaUFJUWdGOUlRZ01BUXNMUVFBaEFTQURRUUFnQTBFQVNoc2hBeUFFUVJScUVCc2dCRUVzYWhBYkEwQWdBU0FEUmtVRVFDQUFJQUFnQUNBQ1FlQVBFRU1hSUFGQkFXb2hBUXdCQ3dzZ0FDQUdRZi8vLy84RFFlRVBFTXdCR2dzZ0JCQWJJQVJCUUdza0FFRVFEd3RCMlAwQVFkVDhBRUcrSVVHWTFnQVFBQUFMZVFFQmZ5QUJRb0NBZ0lCd2cwS0FnSUNBTUZJRVFDQUFRYUkrUVFBUUZVS0FnSUNBNEFBUEN3SitBa0FnQWtVTkFDQURLUU1BSWdGQ2dJQ0FnSENEUW9DQWdJQXdVUTBBUW9DQWdJRGdBQ0FBSUFFUUtDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRWFJQUduSVFRTElBQWdCRUVERUlBRUN3dXZBUUVDZnlNQVFTQnJJZ1FrQUNBQUtBSUFJUVVnQkVFSWFpQURRUUFRcVFFZ0FDQUJJQVFvQWdnaUFTQUJRUjkxSWdGeklBRnJJZ0VnQWtIQUFDQUJRUUZyWjBFQmRHdEJBQ0FCUVFKUEcycEJDR29pQWtIZ0R4Q2lCQ0VCSUFNb0FnUUVRQ0FFUWdBM0FoZ2dCRUtBZ0lDQWdJQ0FnSUIvTndJUUlBUWdCVFlDRENBRVFReHFJZ05DQVJBd0dpQUFJQU1nQUNBQ1FlQVBFSlVCSUFGeUlRRWdBeEFiQ3lBRVFTQnFKQUFnQVF1UUJnSUlmd0YrSXdCQjhBQnJJZ01rQUNBQUlBRkhCRUFnQUNnQ0FDRUVJQU5DQURjQ2FDQURRb0NBZ0lDQWdJQ0FnSDgzQW1BZ0F5QUVOZ0pjSUFOQjNBQnFJZ1VnQVJCRUdpQURRZ0EzQWxRZ0EwS0FnSUNBZ0lDQWdJQi9Od0pNSUFNZ0JEWUNTQ0FES0FKa0lRWWdBMEVBTmdKa0lBTkJ5QUJxSWdGQ3F0V3ExUW9RTUJvZ0EwRUFOZ0pRSUFVZ0FSQ3lBZ1JBSUFNZ0F5Z0NaRUVCYWpZQ1pDQUdRUUZySVFZTElBTkJ5QUJxRUJzZ0FrRUJha0VCZGhDVkJpRUZJQU5DQURjQ1ZDQURRb0NBZ0lDQWdJQ0FnSDgzQWt3Z0F5QUVOZ0pJSUFOQ0FEY0NRQ0FEUW9DQWdJQ0FnSUNBZ0g4M0FqZ2dBeUFFTmdJMElBTkIzQUJxSWdFZ0FVSi9RZi8vLy84RFFRQVFkUm9nQlVFQUlBVkJBRW9iSVFrZ0FpQUZhaUFDSUFWQkFYUnVRUUZxSWdwQkFYUnFRU0JxSVFKQkFDRUJBMEFnQVNBSlJrVUVRQ0FEUWNnQWFpSUhJQU5CM0FCcUlnaENBU0FDUVFBUWRSb2dBMEUwYWlJTElBY2dBa0VHRUpFR0lBY2dDMElCSUFKQkFCQjFHaUFJSUFnZ0J5QUNRUUFRbFFFYUlBRkJBV29oQVF3QkN3c2dBMElBTndJc0lBTkNnSUNBZ0lDQWdJQ0FmemNDSkNBRElBUTJBaUFnQTBJQU53SVlJQU5DZ0lDQWdJQ0FnSUNBZnpjQ0VDQURJQVEyQWd3Z0EwRWdhaUlCSUFOQjNBQnFJZ1JDQWlBQ1FRQVFkUm9nQVNBRUlBRWdBa0VBRUpVQkdpQURRUXhxSUFFZ0FTQUNRUUFRUXhvZ0FFSUFFREFhSUFxc0lRd0RRQ0FNUWdCWFJRUkFJQU5CeUFCcUlnRkNBUkF3R2lBRFFUUnFJZ1FnREtkQkFYUkJBWEtzRURBYUlBRWdBU0FFSUFKQkFCQ1ZBUm9nQUNBQUlBRWdBa0VBRU1zQkdpQUFJQUFnQTBFTWFpQUNRUUFRUXhvZ0RFSUJmU0VNREFFTEN5QUFJQUJDQVNBQ1FRQVFkUm9nQUNBQUlBTkJJR29pQVNBQ1FRQVFReG9nQVJBYklBTkJER29RR3lBRFFUUnFFQnNnQTBISUFHb1FHeUFBSUFWQkFXcEIvLy8vL3dOQkFSRE1BUm9nQTBIY0FHb2lBU0FDUVFZUTB3SWdBU0FCSUFhc0lBSkJBQkRVQWlBQUlBQWdBU0FDUVFBUXl3RWFJQUVRR3lBRFFmQUFhaVFBUVJBUEMwSFkvUUJCMVB3QVFkY2lRYWpXQUJBQUFBc1JBQ0FBSUFFZ0FpQURJQVJCQUJDV0Jnc1JBQ0FBSUFFZ0FpQURJQVJCQVJDV0JndllBd0VIZnlBQ0tBSUVJQUVvQWdSeklRY0NRQUpBQWtBQ1FBSkFBa0FDUUNBQktBSUlJZ1pCL2YvLy93ZE1CRUFnQWlnQ0NDSUZRZjMvLy84SFNnMEJJQVpCZ0lDQWdIaEhEUVlnQlVHQWdJQ0FlRVlOQkF3SEN5QUdRZi8vLy84SFJnMEJJQUlvQWdnaEJRc2dCVUgvLy8vL0IwY05BUXNnQUJBMVFRQVBDeUFHUWY3Ly8vOEhSeUlCSUFWQi92Ly8vd2RIY2cwQkN5QUFFRFZCQVE4TElBRU5BU0FBSUFjUWpBRkJBQThMSUFWQmdJQ0FnSGhHQkVBZ0FDQUhFSXdCUVFJUEN3SkFJQUFvQWdBaUJTZ0NBRUVBSUFFb0Fnd2lCaUFEUVNGcVFRVjJJZ2dnQmlBSVNoc2lDaUFDS0FJTUlnaHFJZ2xCQW5SQkJHb2dCU2dDQkJFQkFDSUdCRUFnQmtFQUlBa2dBU2dDREd0QkFuUWlDeEFySWdZZ0Myb2dBU2dDRUNBQktBSU1RUUowRUI4YUlBQWdDa0VCYWhCQlJRUkFJQVVnQUNnQ0VDQUdJQWtnQWlnQ0VDQUlFS1VFUlEwQ0N5QUZLQUlBSUFaQkFDQUZLQUlFRVFFQUdnc2dBQkExUVNBUEN5QUdJQWdRcUFNRVFDQUFLQUlRSWdVZ0JTZ0NBRUVCY2pZQ0FBc2dBQ2dDQUNJRktBSUFJQVpCQUNBRktBSUVFUUVBR2lBQ0tBSUlJUUlnQVNnQ0NDRUJJQUFnQnpZQ0JDQUFJQUVnQW10QklHbzJBZ2dnQUNBRElBUVFzd0lQQ3lBQUlBY1FpUUZCQUF0WUFRRitJQUFnQXlrREFCRDlBVUVBUjYxQ2dJQ0FnQkNFSVFRZ0FVS0FnSUNBY0lOQ2dJQ0FnREJSQkVBZ0JBOExJQUFnQVVFR0VHVWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQUFnQVNBRUVOc0JDeUFCQzVNQ0FnRitBWDhqQUVFUWF5SUZKQUFDUUFKQUlBSkZCRUFNQVFzZ0FDQURLUU1BRUxrQ0lnUkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFRSkFBa0FnQkVJZ2lLZEJDMm9PQXdFQUFBSUxJQVNuUVFScUlBVkJDR29RdFFVZ0FDQUVFQTlDZ0lDQWdNQitJQVVwQXdnaUJFS0FnSUNBd0lHQS9QOEFmU0FFUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHeUVFREFFTElBQWdCQkEzSWdSQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBUVFqUUVpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBCQ3lBQlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQUNBQUlBRkJCQkJsSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRklFUUNBQUlBRWdCQkRiQVFzZ0FTRUVDeUFGUVJCcUpBQWdCQXM3QVFGL0EwQWdBZ1JBSUFBdEFBQWhBeUFBSUFFdEFBQTZBQUFnQVNBRE9nQUFJQUZCQVdvaEFTQUFRUUZxSVFBZ0FrRUJheUVDREFFTEN3c2FBQ0FBTFFBQUlRSWdBQ0FCTFFBQU9nQUFJQUVnQWpvQUFBdENBUUYvSUFKQkFYWWhBZ05BSUFJRVFDQUFMd0VBSVFNZ0FDQUJMd0VBT3dFQUlBRWdBenNCQUNBQlFRSnFJUUVnQUVFQ2FpRUFJQUpCQVdzaEFnd0JDd3NMR2dBZ0FDOEJBQ0VDSUFBZ0FTOEJBRHNCQUNBQklBSTdBUUFMUWdFQmZ5QUNRUUoySVFJRFFDQUNCRUFnQUNnQ0FDRURJQUFnQVNnQ0FEWUNBQ0FCSUFNMkFnQWdBVUVFYWlFQklBQkJCR29oQUNBQ1FRRnJJUUlNQVFzTEN4b0FJQUFvQWdBaEFpQUFJQUVvQWdBMkFnQWdBU0FDTmdJQUMwSUJBWDRnQWtFRGRpRUNBMEFnQWdSQUlBQXBBd0FoQXlBQUlBRXBBd0EzQXdBZ0FTQUROd01BSUFGQkNHb2hBU0FBUVFocUlRQWdBa0VCYXlFQ0RBRUxDd3NjQVFGK0lBQXBBd0FoQXlBQUlBRXBBd0EzQXdBZ0FTQUROd01BQzFvQkFuNGdBa0VFZGlFQ0EwQWdBZ1JBSUFBcEF3QWhBeUFBSUFFcEF3QTNBd0FnQUNrRENDRUVJQUFnQVNrRENEY0RDQ0FCSUFRM0F3Z2dBU0FETndNQUlBRkJFR29oQVNBQVFSQnFJUUFnQWtFQmF5RUNEQUVMQ3dzMEFRSitJQUFwQXdBaEF5QUFJQUVwQXdBM0F3QWdBQ2tEQ0NFRUlBQWdBU2tEQ0RjRENDQUJJQVEzQXdnZ0FTQUROd01BQ3drQUlBRWdBaER6QlF2a0JBSUdmZ0YvSXdCQkVHc2lBaVFBSUFGQ2dJQ0FnSENEUW9DQWdJQXdVUVJBSUFBb0FoQW9Bb3dCS1FNSUlRRUxBa0FnQUNBQlFUc2dBVUVBRUJRaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBVWhBUXdCQ3dKQUFrQWdCVUwvLy8vL2IxWU5BQ0FBSUFVUUR5QUFJQUVRZ0FNaUMwVU5BUUovSUFSQkFFZ0VRQ0FMS0FJb1FSaHFEQUVMSUFzZ0JFRURkR3BCMkFCcUN5a0RBQ0lGUWlDSXAwRjFTUTBBSUFXbklnc2dDeWdDQUVFQmFqWUNBQXNnQUNBRlFRTVFTU0VCSUFBZ0JSQVBJQUZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRU5BQUpBSUFNZ0JFRUhSa0VEZEdvcEF3QWlCVUtBZ0lDQWNJTkNnSUNBZ0RCU0JFQWdBQ0FGRUNnaUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQklBQWdBVUV6SUFWQkF4QVpHZ3NnQkVFSFJnUkFRb0NBZ0lEZ0FDRUhRb0NBZ0lBd0lRVUNRQUpBSUFBZ0F5a0RBRUVBRU9jQklnWkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFFS0FnSUNBTUNFSURBRUxJQUFnQmtIcUFDQUdRUUFRRkNJSVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FCQStJZ1ZDZ0lDQWdIQ0RRb0NBZ0lEZ0FGRUVRRUtBZ0lDQTRBQWhCUXdCQ3dOQUlBQWdCaUFJSUFKQkRHb1FyZ0VpQ2tLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBSUFJb0Fnd0VRQ0FGSVFjTUJBc2dBQ0FGSUFrZ0NoQnFJUU1nQ1VJQmZDRUpJQU5CQUU0TkFRc0xJQUFnQmtFQkVLMEJHZ3NnQUNBRkVBOExJQUFnQ0JBUElBQWdCaEFQSUFkQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQUlBRkJOQ0FIUVFNUUdSb0xJQUFnQVVFQVFRQkJBUkRLQWd3Q0N5QUFJQUVRRHd0Q2dJQ0FnT0FBSVFFTElBSkJFR29rQUNBQkMrc0NBUVorSXdCQkVHc2lBaVFBSUFNcEF3QWhBVUtBZ0lDQTRBQWhCU0FBRURRaUIwS0FnSUNBY0lOQ2dJQ0FnT0FBVWdSQVFvQ0FnSUF3SVFRQ1FDQUFJQUZCQUJEbkFTSUJRb0NBZ0lCd2cwS0FnSUNBNEFCU0JFQUNRQ0FBSUFGQjZnQWdBVUVBRUJRaUJrS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUEwQWdBQ0FCSUFZZ0FrRU1haEN1QVNJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FpZ0NEQVJBSUFjaEJRd0VDd0pBQWtBZ0JFTC8vLy8vYjFnRVFDQUFFQ1FNQVFzZ0FDQUVRZ0FRVFNJSVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FDQUVRZ0VRVFNJSlFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSQkVBZ0FDQUlFQThNQVFzZ0FDQUhJQWdnQ1VHSGdBRVF2UUZCQUU0TkFRc2dBQ0FFRUE4TUFnc2dBQ0FFRUE4TUFBc0FDeUFCUW9DQWdJQndXZ1JBSUFBZ0FVRUJFSzBCR2dzZ0JpRUVDeUFCSVFZZ0J5RUJDeUFBSUFRUUR5QUFJQVlRRHlBQUlBRVFEd3NnQWtFUWFpUUFJQVVMU2dCQkx5RUNJQUFnQXlrREFDSUJRb0NBZ0lCd1dnUi9JQUduTHdFR0lnSkJNRVlFUUVFTlFUQWdBQ0FCRURnYklRSUxJQUFvQWhBb0FrUWdBa0VZYkdvb0FnUUZRUzhMRUMwTDhnRUNCSDhCZmlNQVFUQnJJZ0lrQUVLQmdJQ0FFQ0VCQWtBZ0F5a0RBQ0lKUW9DQWdJQndWQTBBUW9DQWdJRGdBQ0VCSUFBZ0FrRXNhaUFDUVNocUlBbW5JZ2hCQXhDT0FRMEFJQUlvQWl3aEJpQUNLQUlvSVFkQkFDRURBa0FEUUNBRElBZEhCRUFnQUNBQ1FRaHFJQWdnQmlBRFFRTjBhaWdDQkJCTUlnVkJBRWdOQWdKQUlBVkZEUUFnQUNBQ1FRaHFFRWdnQWlnQ0NDSUZRUUZ4UlNBRVJTQUZRUUp4UlhKeERRQkNnSUNBZ0JBaEFRd0RDeUFEUVFGcUlRTU1BUXNMSUFBZ0NSQ1pBU0lEUVFCSURRRWdBMEVCUjYxQ2dJQ0FnQkNFSVFFTElBQWdCaUFIRUZvTElBSkJNR29rQUNBQkM3OEJBZ0YrQVg5Q2dJQ0FnREFoQVFKQUlBQWdBeWtEQUJBbElnUkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFFRUJJQUlnQWtFQlRCc2hCVUVCSVFJRFFDQUNJQVZHQkVBZ0JBOExJQU1nQWtFRGRHb3BBd0FpQVVLQWdJQ0FFSVJDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFJQUFnQVJBbElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFpQUFJQVFnQVVLQWdJQ0FNRUVCRU5RRkRRSWdBQ0FCRUE4TElBSkJBV29oQWd3QUN3QUxJQUFnQkJBUElBQWdBUkFQUW9DQWdJRGdBQXNZQUNBQUlBTXBBd0FnQXlrRENCQlNyVUtBZ0lDQUVJUUw0Z0lDQTM0RGZ5TUFRU0JySWdJa0FFS0FnSUNBNEFBaEJDQUFJQU1wQXdBUUpTSUZRb0NBZ0lCd2cwS0FnSUNBNEFCU0JFQkNnSUNBZ0RBaEFRSkFBa0FnQUNBQ1FSeHFJQUpCR0dvZ0JhZEJBeENPQVEwQVFvQ0FnSURnQUNFQklBQVFOQ0lFUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQWlnQ0hDRUhJQUlvQWhnaENFRUFJUU1EUUNBRElBaEhCRUFDUUFKQUlBQWdCeUFEUVFOMGFpSUpLQUlFRUZ3aUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBSWdBVGNEQ0NBQ0lBVTNBd0FnQUNBRUlBQWdBa0VBRU1ZRUlRWWdBQ0FCRUE4Z0JrS0FnSUNBY0lNaUFVS0FnSUNBTUZFTkFTQUJRb0NBZ0lEZ0FGRU5BQ0FBSUFRZ0NTZ0NCQ0FHUVllQUFSQVpRUUJPRFFFTElBUWhBUXdEQ3lBRFFRRnFJUU1NQVFzTElBQWdCeUFJRUZvZ0JTRUJEQUVMSUFBZ0FpZ0NIQ0FDS0FJWUVGb2dBQ0FGRUE5Q2dJQ0FnT0FBSVFRTElBQWdBUkFQQ3lBQ1FTQnFKQUFnQkFzUUFDQUFJQU1wQXdCQkVTQUVFS29DQ3hBQUlBQWdBeWtEQUVFQ1FRQVFxZ0lMRUFBZ0FDQURLUU1BUVFGQkFCQ3FBZ3RIQVFGK1FvQ0FnSURnQUNFRUlBQWdBeWtEQUNJQklBTXBBd2dRcmdZRWZrS0FnSUNBNEFBRklBRkNJSWluUVhWUEJFQWdBYWNpQUNBQUtBSUFRUUZxTmdJQUN5QUJDd3RCQUNBQUlBTXBBd0FpQVNBREtRTUlRUUVRaXdKQkFFZ0VRRUtBZ0lDQTRBQVBDeUFCUWlDSXAwRjFUd1JBSUFHbklnQWdBQ2dDQUVFQmFqWUNBQXNnQVF1SkFRRUJmaUFES1FNQUlnRkMvLy8vLzI5V0lBRkNnSUNBZ0hDRFFvQ0FnSUFnVVhKRkJFQWdBRUczNUFCQkFCQVZRb0NBZ0lEZ0FBOExBa0FnQUNBQkVFY2lBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnUkFJQU1wQXdnaUJFS0FnSUNBY0lOQ2dJQ0FnREJSRFFFZ0FDQUJJQVFRcmdaRkRRRWdBQ0FCRUE4TFFvQ0FnSURnQUE4TElBRUxwUVFDQlg4Q2ZpTUFRU0JySWdVa0FDQUFJQVZCQ0dvaUJrRUFFRDBhSUFaQktCQTdHaUFFUVg1eFFRSkdCRUFnQlVFSWFrSHhtUUVRaUFFYUN5QUZRUWhxUWJyTUFCQ0lBUm9nQkVGOWNVRUJSZ1JBSUFWQkNHcEJLaEE3R2dzZ0JVRUlha0d2bEFFUWlBRWFRUUFoQmlBQ1FRRnJJZ2RCQUNBSFFRQktHeUVJQWtBQ1FBSkFBMEFnQmlBSVJ3UkFJQVlFUUNBRlFRaHFRU3dRT3hvTElBWkJBM1FoQ1NBR1FRRnFJUVlnQlVFSWFpQURJQWxxS1FNQUVJY0JSUTBCREFJTEN5QUZRUWhxUVlhYUFSQ0lBUm9nQWtFQVNnUkFJQVZCQ0dvZ0F5QUhRUU4wYWlrREFCQ0hBUTBCQ3lBRlFRaHFJZ0pCaVpFQkVJZ0JHa0tBZ0lDQU1DRUxJQUlRTmlJS1FvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFFZ0FDQUFLUVBBQVNBS1FRTkJmeENjQXlFTElBQWdDaEFQSUF0Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQVNBQlFvQ0FnSUJ3ZzBLQWdJQ0FNRkVOQWlBQUlBRkJPeUFCUVFBUUZDSUtRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRRUNRQ0FLUXYvLy8vOXZWZzBBSUFBZ0NoQVBJQUFnQVJDQUF5SUNSUTBDSUFJb0FpZ2dCRUVCZEVHdXdBRnFMd0VBUVFOMGFpa0RBQ0lLUWlDSXAwRjFTUTBBSUFxbklnSWdBaWdDQUVFQmFqWUNBQXNnQUNBTElBcEJBUkNMQWlFQ0lBQWdDaEFQSUFKQkFFNE5BZ3dCQ3lBRktBSUlLQUlRSWdKQkVHb2dCU2dDRENBQ0tBSUVFUUFBUW9DQWdJQXdJUXNMSUFBZ0N4QVBRb0NBZ0lEZ0FDRUxDeUFGUVNCcUpBQWdDd3VBQWdJQ2ZnRi9Jd0JCSUdzaUJ5UUFRb0NBZ0lEZ0FDRUZBa0FDUUNBQUlBRVFKU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBREtRTUFFREVpQTBVTkFBTkFJQUFnQnlBQnB5QURFRXdpQWtFQVNBMENJQUlFUUVLQWdJQ0FNQ0VGQWtBZ0J5MEFBRUVRY1VVTkFDQUhRUmhCRUNBRUcyb3BBd0FpQlVJZ2lLZEJkVWtOQUNBRnB5SUNJQUlvQWdCQkFXbzJBZ0FMSUFBZ0J4QklEQU1MSUFBZ0FSQ01BaUlCUW9DQWdJQndneUlHUW9DQWdJQWdVZ1JBSUFaQ2dJQ0FnT0FBVVFSQUlBWWhCUXdFQ3lBQUVIdEZEUUVNQXdzTFFvQ0FnSUF3SVFVTUFRdEJBQ0VEQ3lBQUlBTVFFeUFBSUFFUUR5QUhRU0JxSkFBZ0JRdXhBUUVEZmlBREtRTUlJUVVnQXlrREFDRUdRb0NBZ0lEZ0FDRUhBa0FnQUNBQkVDVWlBVUtBZ0lDQWNJTkNnSUNBZ09BQVVnUitJQUFnQlJCZ0RRRWdBQ0FHRURFaUFrVU5BU0FBSUFFZ0FrS0FnSUNBTUVLQWdJQ0FNQ0FGSUFRYklBVkNnSUNBZ0RBZ0JCdEJoYW9CUVlXYUFTQUVHeEJ0SVFNZ0FDQUJFQThnQUNBQ0VCTkNnSUNBZ09BQVFvQ0FnSUF3SUFOQkFFZ2JCVUtBZ0lDQTRBQUxEd3NnQUNBQkVBOUNnSUNBZ09BQUMzSUJBWDVDZ0lDQWdEQWhBeUFCUW9DQWdJQVFoRUtBZ0lDQWNJTkNnSUNBZ0RCUkJFQWdBQkFrUW9DQWdJRGdBQThMSUFKQ2dJQ0FnSENEUW9DQWdJQWdVaUFDUXYvLy8vOXZXSEVFZmtLQWdJQ0FNQVZDZ0lDQWdPQUFRb0NBZ0lBd0lBQWdBU0FDUVFFUWl3SkJBRWdiQ3dzeUFRRitJQUFnQVJBbElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJEd3NnQUNBQkVPZ0JJUUlnQUNBQkVBOGdBZ3VnQVFJQmZnRi9Jd0JCSUdzaUFpUUFRb0NBZ0lEZ0FDRUVBa0FDUUNBQUlBRVFKU0lCUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUFnQUNBREtRTUFFREVpQTBVTkFDQUFJQUlnQWFjZ0F4Qk1JZ1ZCQUVnTkFTQUZSUVJBUW9DQWdJQVFJUVFNQWdzZ0FqVUNBQ0VFSUFBZ0FoQklJQVJDQW9oQ0FZTkNnSUNBZ0JDRUlRUU1BUXRCQUNFREN5QUFJQU1RRXlBQUlBRVFEeUFDUVNCcUpBQWdCQXZCQVFFQ2ZnSkFBbjVDZ0lDQWdCQWdBeWtEQUNJRVFvQ0FnSUJ3VkEwQUdrS0FnSUNBNEFBZ0FDQUJFQ1VpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2lBRXB5SUNJQUlvQWdCQkFXbzJBZ0FnQWFjaEFnTkFJQUFnQkJDTUFpSUVRb0NBZ0lCd2d5SUZRb0NBZ0lEZ0FGSUVRQ0FDSUFTblJpQUZRb0NBZ0lBZ1VYSU5BeUFBRUh0RkRRRUxDeUFBSUFRUUR5QUFJQUVRRDBLQWdJQ0E0QUFMRHdzZ0FDQUVFQThnQUNBQkVBOGdCVUtBZ0lDQUlGS3RRb0NBZ0lBUWhBdDZBUUYrSUFBZ0F5a0RBQkF4SWdKRkJFQkNnSUNBZ09BQUR3dENnSUNBZ09BQUlRUWdBQ0FCRUNVaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQUlBQWdBaEFUSUFFUEN5QUFRUUFnQWFjZ0FoQk1JUU1nQUNBQ0VCTWdBQ0FCRUE5Q2dJQ0FnT0FBSUFOQkFFZXRRb0NBZ0lBUWhDQURRUUJJR3dzSUFDQUFJQUVRSlFzUEFDQUFJQUZCTjBFQVFRQVFyQUlMTFFFQmZrS0FnSUNBTUNFQ0FrQWdBUkNqQXlJQVJRMEFJQUF0QUJKQkJIRkZEUUFnQURVQ1JDRUNDeUFDQ3pNQ0FYNEJmMEtBZ0lDQU1DRUNBa0FnQVJDakF5SURSUTBBSUFNdEFCSkJCSEZGRFFBZ0FDQURLQUpBRUMwaEFnc2dBZ3NvQUVLQWdJQ0E0QUFnQUNBREtRTUFJQUVRdmdVaUFFRUFSNjFDZ0lDQWdCQ0VJQUJCQUVnYkM3Y0JBZ0YrQW45Q2dJQ0FnT0FBSVFRZ0FDQUJFR0FFZmtLQWdJQ0E0QUFGUWNxWkFTRUNBa0FnQWFjaUF5OEJCaER1QVVVTkFBSkFJQU1vQWlBaUF5OEFFU0lGUVlBSWNVVU5BQ0FES0FKVUlnWkZEUUFnQUNBR0lBTW9Ba2dRa3dJUEN5QUZRUVIyUVFOeFFRRnJJZ05CQWtzTkFDQURRUUowUWZUL0FXb29BZ0FoQWdzZ0FDQUNJQUFnQVVFMklBRkJBQkFVSWdGQ2dJQ0FnSENEUW9DQWdJQXdVUVIrSUFCQkx4QXRCU0FCQzBHK0dSQytBUXNMNlFVREEzNEdmd044QWtBQ2ZrS0FnSUNBNEFBZ0FDQUJFR0FOQUJwQ2dJQ0FnT0FBSUFBZ0FDa0RNRUVPRUVraUJVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUdpQUZweUlLSUFGQ2dJQ0FnSEJhQkg4Z0FhY3RBQVZCRUhFRlFRQUxJQW90QUFWQjd3Rnhjam9BQlNBQVFRRWdBaUFDUVFGTUd5SUxRUUZySWdoQkEzUkJHR29RS1NJSFJRMEJJQUZDSUlpblFYVlBCRUFnQWFjaUFpQUNLQUlBUVFGcU5nSUFDeUFISUFFM0F3QWdBeWtEQUNJRVFpQ0lwMEYxVHdSQUlBU25JZ0lnQWlnQ0FFRUJhallDQUFzZ0J5QUlOZ0lRSUFjZ0JEY0RDRUVBSVFJRFFDQUNJQWhIQkVBZ0F5QUNRUUZxSWdsQkEzUnFLUU1BSWdSQ0lJaW5RWFZQQkVBZ0JLY2lEQ0FNS0FJQVFRRnFOZ0lBQ3lBSElBSkJBM1JxSUFRM0F4Z2dDU0VDREFFTEN5QUtJQWMyQWlBZ0FVTC8vLy8vYjFnRVFDQUFFQ1FNQWdzZ0FFRUFJQUduUVRBUVRDSUNRUUJJRFFGQ0FDRUVBa0FnQWtVTkFDQUFJQUZCTUNBQlFRQVFGQ0lHUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlnQmtMLy8vLy9EMWdFUUNBR3B5SUNJQWhyUVFBZ0FpQUxUaHV0SVFRTUFRc2dCa0lnaUtkQkIydEJiVTBFUUFKQUlBWkNnSUNBZ01DQmdQei9BSHdpQkVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWZzBBSUFTL25TSU9JQWkzSWc5bERRQWdEaUFQb1NFTkN5QU52U0lFQW44Z0RabEVBQUFBQUFBQTRFRmpCRUFnRGFvTUFRdEJnSUNBZ0hnTElnSzN2VkVFUUNBQ3JTRUVEQUlMUW9DQWdJREFmaUFFUW9DQWdJREFnWUQ4L3dCOUlBUkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYklRUU1BUXNnQUNBR0VBOExJQUFnQlVFd0lBUkJBUkFaR2lBQVFkU1pBU0FBSUFGQk5pQUJRUUFRRkNJRVFvQ0FnSUJ3Z3lJQlFvQ0FnSUNRZjFJRWZpQUJRb0NBZ0lEZ0FGRU5BaUFBSUFRUUR5QUFRUzhRTFFVZ0JBdEJ6SjRCRUw0QklnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFTQUFJQVZCTmlBQlFRRVFHUm9nQlFzUEN5QUFJQVVRRDBLQWdJQ0E0QUFMTUFBZ0FrRUFUQVJBSUFBZ0FVS0FnSUNBTUVFQVFRQVFJUThMSUFBZ0FTQURLUU1BSUFKQkFXc2dBMEVJYWhBaEM2TUNBZ0YvQkg0akFFRVFheUlGSkFCQ2dJQ0FnREFoQmdKQUFrQWdBQ0FGUVFocUlBQWdBUkFsSWdrUVBBMEFJQVZCQVRZQ0JBSkFJQVFFUUNBREtRTUFJUWhDZ0lDQWdEQWhCeUFDUVFKT0JFQWdBeWtEQ0NFSEN5QUFJQWdRWUVVTkFRd0NDeUFDUVFCTUJFQkNnSUNBZ0RBaENFS0FnSUNBTUNFSERBRUxRb0NBZ0lBd0lRaENnSUNBZ0RBaEJ5QURLUU1BSWdGQ2dJQ0FnSENEUW9DQWdJQXdVUTBBSUFBZ0JVRUVhaUFCRUxvQlFRQklEUUVMSUFBZ0NVSUFFS3NDSWdGQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBQklRWU1BUXNnQVNFR0lBQWdBU0FKSUFVcEF3aENBQ0FGS0FJRUlBZ2dCeEN2QmtJQVV3MEFJQWtoQmd3QkN5QUFJQWtRRDBLQWdJQ0E0QUFoQVFzZ0FDQUdFQThnQlVFUWFpUUFJQUVMK1FFQ0JINEJmeU1BUVNCcklnZ2tBQUpBQWtBZ0FDQUlRUmhxSUFBZ0FSQWxJZ0VRUEEwQUlBQWdDRUVJYWlBREtRTUFRZ0FnQ0NrREdDSUVJQVFRZEEwQUlBQWdDRUVRYWlBREtRTUlRZ0FnQkNBRUVIUU5BQ0FJSUFRM0F3QUNmaUFFSUFKQkEwZ05BQm9nQkNBREtRTVFJZ1ZDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFHaUFBSUFnZ0JVSUFJQVFnQkJCMERRRWdDQ2tEQUFzaEJpQUFJQUVnQ0NrRENDSUZJQWdwQXhBaUJ5QUdJQWQ5SWdZZ0JDQUZmU0lFSUFRZ0JsVWJJZ1JCQVVGL1FRRWdCU0FFSUFkOFV4c2dCU0FIVnhzUTlBSkZEUUVMSUFBZ0FSQVBRb0NBZ0lEZ0FDRUJDeUFJUVNCcUpBQWdBUXV5Q0FJSmZnTi9Jd0JCTUdzaURpUUFRb0NBZ0lBd0lRVUNRQUpBSUFBZ0RrRWdhaUFBSUFFUUpTSUtFRHdOQUNBQUlBNUJHR29nQXlrREFFSUFJQTRwQXlBaUJ5QUhFSFFOQUFKQUlBUUVRQUpBQWtBQ1FDQUNEZ0lDQUFFTElBY2dEaWtER0gwaENFRUFJUUlNQVFzZ0FDQU9RUkJxSUFNcEF3aENBQ0FISUE0cEF4aDlRZ0FRZEEwRElBSkJBbXNoQWlBT0tRTVFJUWdMSUFjZ0FxMThJQWg5UW9DQWdJQ0FnSUFRVXcwQklBQkIwTm9BUVFBUUZRd0NDeUFPSUFjM0F4QWdCeUVCSUFNcEF3Z2lDMEtBZ0lDQWNJTkNnSUNBZ0RCU0JINGdBQ0FPUVJCcUlBdENBQ0FISUFjUWRBMENJQTRwQXhBRklBRUxJQTRwQXhoOUlnRkNBQ0FCUWdCVkd5RUlRUUFoQWdzZ0FDQUtJQWhDZ0lDQWdBaDhRdi8vLy84UFdBUitJQWhDLy8vLy93K0RCVUtBZ0lDQXdINGdDTG05SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xJZ1VRcXdJaEFTQUFJQVVRRHdKQUlBRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQU9LUU1ZSWdzZ0NId2hDUUpBQWtBZ0NpQU9RUXhxSUE1QkNHb1FpZ0pGSUFGQy8vLy8vMjlZY2cwQUlBR25JZzh2QVFaQkFrY05BQ0FMSVFVZ0R5MEFCVUVJY1VVTkFTQU9LQUlNSVE4Z0RqVUNDQ0VOQTBBZ0JTQUpXU0FGSUExWmNnMENJQThnQmFkQkEzUnFLUU1BSWd4Q0lJaW5RWFZQQkVBZ0RLY2lFQ0FRS0FJQVFRRnFOZ0lBQ3lBQUlBRWdCaUFNUVlDQUFSRFNBVUVBU0EwRElBWkNBWHdoQmlBRlFnRjhJUVVNQUFzQUN5QUxJUVVMSUFVZ0NTQUZJQWxWR3lFSkEwQWdCU0FKVWdSQUlBQWdDaUFGSUE1QktHb1FoUUVpRDBFQVNBMENJQThFUUNBQUlBRWdCaUFPS1FNb1FZQ0FBUkRTQVVFQVNBMERDeUFHUWdGOElRWWdCVUlCZkNFRkRBRUxDeUFBSUFGQk1DQUdRb0NBZ0lBSVdnUitRb0NBZ0lEQWZpQUd1YjBpQlVLQWdJQ0F3SUdBL1A4QWZTQUZRdi8vLy8vLy8vLy8vd0NEUW9DQWdJQ0FnSUQ0L3dCV0d3VWdCZ3NRUlVFQVNBMEFJQVFFUUNBSElBS3RJZ1o4SUFoOUlRbENBQ0VGQWtBZ0JpQUlVUTBBSUFBZ0NpQUdJQXQ4SUFnZ0Mzd2lEQ0FISUF4OVFYOUJBU0FHSUFoVkd4RDBBa0VBU0EwQ0EwQWdCeUFKVncwQklBQWdDaUFIUWdGOUlnY1ErZ0ZCQUU0TkFBc01BZ3NEUUNBRklBWlNCRUFnQmFkQkEzUWdBMm9wQXhBaUIwSWdpS2RCZFU4RVFDQUhweUlDSUFJb0FnQkJBV28yQWdBTElBVWdDM3doQ0NBRlFnRjhJUVVnQUNBS0lBZ2dCeENHQVVFQVRnMEJEQU1MQ3lBSlFvQ0FnSUFJZkVMLy8vLy9EMWdFZmlBSlF2Ly8vLzhQZ3dWQ2dJQ0FnTUIrSUFtNXZTSUZRb0NBZ0lEQWdZRDgvd0I5SUFWQy8vLy8vLy8vLy8vL0FJTkNnSUNBZ0lDQWdQai9BRlliQ3lFR0lBRWhCU0FBSUFwQk1DQUdFRVZCQUVnTkFnc2dDaUVGREFJTElBRWhCUXNnQUNBS0VBOUNnSUNBZ09BQUlRRUxJQUFnQlJBUElBNUJNR29rQUNBQkMrSUNBd0orQlg4QmZDTUFRU0JySWdVa0FBSkFJQUlvQWdRTkFDQUNLQUlBSVFZQ1FBSkFBbjhnQWlnQ0NBUkFJQUFnQVVFSUVHRkZEUUlnQlNBQUtRTUFOd01RSUFVZ0FTa0RBRGNER0NBR0lBSXBBeEJDZ0lDQWdEQkJBaUFGUVJCcUVDRWlBMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMERJQU5DLy8vLy93OVlCRUFnQTZjaUFrRWZkU0FDUVFCSGNnd0NDeUFHSUFWQkNHb2dBeEJ1UVFCSURRTWdCU3NEQ0NJS1JBQUFBQUFBQUFBQVpDQUtSQUFBQUFBQUFBQUFZMnNNQVFzZ0FDZ0NDQ0lJUlFSQUlBWWdBQ2tEQUJBb0lnTkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF5QUFJQU9uSWdnMkFnZ0xJQUVvQWdnaUNRUi9JQWdGSUFZZ0FTa0RBQkFvSWdOQ2dJQ0FnSENEUW9DQWdJRGdBRkVOQXlBQklBT25JZ2syQWdnZ0FDZ0NDQXNnQ1JDREFnc2lCdzBDQ3lBQUtRTVFJZ01nQVNrREVDSUVWU0FESUFSVGF5RUhEQUVMSUFKQkFUWUNCQXNnQlVFZ2FpUUFJQWNMWFFBQ1FDQUJRb0NBZ0lCd2cwS0FnSUNBTUZFTkFDQUFLQUlRS0FLTUFTZ0NDQ0FCcDBZTkFDQUFJQUZCQVJCbER3c2dBeWtEQUNJQlFpQ0lweUlDUVF0cVFSRkxJQUpCZm5GQkFrZHlSUVJBSUFBUU5BOExJQUFnQVJBbEM2NEZBZ1YrQkg4akFFRXdheUlMSkFBZ0MwSUFOd0ljSUFzZ0FEWUNHQ0FMSUFNcEF3QWlCRGNES0VLQWdJQ0FNQ0VHQWtBQ1FBSi9JQVJDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFRUUFoQWtFQUlBQWdCQkJnRFFFYUlBdEJBVFlDSUF0QkFDRUNBa0FnQUNBTFFSQnFJQUFnQVJBbElnWVFQQVJBREFFTFFnQWhCQU5BSUFzcEF4QWlDQ0FGVlFSQUlBa2dDazhFUUNBQUlBSWdDaUFLUVFGMmFrRWZha0Z3Y1NJS1FSaHNJQXRCREdvUXFBRWlBMFVOQXlBTEtBSU1RUmh1SUFwcUlRb2dBeUVDQzBFQUlBQWdCaUFGSUFJZ0NVRVliR29pREJDRkFTSURRUUJJRFFNYUFrQWdBMFVOQUNBTU5RSUVRaUNHUW9DQWdJQXdVUVJBSUFSQ0FYd2hCQXdCQ3lBTUlBVTNBeEFnREVFQU5nSUlJQWxCQVdvaENRc2dCVUlCZkNFRkRBRUxDeUFDSUFsQkdFSFdBQ0FMUVJocUVMNENRUUFnQ3lnQ0hBMEJHaUFFSUFtdElnRjhJQVJDUDRjZ0JJTjlJUVJDQUNFRkEwQUNRQ0FCSUFWU0JFQWdBaUFGcHlJS1FSaHNhaUlES0FJSUlnd0VRQ0FBSUF5dFFvQ0FnSUNRZjRRUUR3c2dBeWtEQUNFSElBVWdBeWtERUZFRVFDQUFJQWNRRHd3Q0N5QUFJQVlnQlNBSEVJWUJRUUJPRFFFZ0NrRUJhZ3dFQ3lBQUtBSVFJZ05CRUdvZ0FpQURLQUlFRVFBQUEwQWdBU0FFVVFSQUEwQWdCQ0FJV1EwSUlBQWdCaUFFRVBvQklRSWdCRUlCZkNFRUlBSkJBRTROQUF3SEN3QUxJQUFnQmlBQlFvQ0FnSUF3RUlZQklRSWdBVUlCZkNFQklBSkJBRTROQUFzTUJBc2dCVUlCZkNFRkRBQUxBQXRCQUFzaEF5QUpJQU1nQXlBSlNSc2hDUU5BSUFNZ0NVY0VRQ0FBSUFJZ0EwRVliR29pQ2lrREFCQVBJQW9vQWdnaUNnUkFJQUFnQ3ExQ2dJQ0FnSkIvaEJBUEN5QURRUUZxSVFNTUFRc0xJQUFvQWhBaUEwRVFhaUFDSUFNb0FnUVJBQUFMSUFBZ0JoQVBRb0NBZ0lEZ0FDRUdDeUFMUVRCcUpBQWdCZ3V3QXdJRGZnSi9Jd0JCTUdzaUFpUUFRb0NBZ0lBd0lRWWdBa0tBZ0lDQU1EY0RLQUpBQWtBZ0FDQUNRUkJxSUFBZ0FSQWxJZ0VRUEEwQUFrQWdBU0FDUVJ4cUlBSkJER29RaWdKRkJFQWdBaWtERUNFRkRBRUxJQUlwQXhBaUJTQUNLQUlNSWdPdFVnMEFJQU5CQWtrTkFrRUFJUUFnQWlnQ0hDRUhBMEFnQUNBRFFRRnJJZ05QRFFNZ0J5QUFRUU4wYWlJSUtRTUFJUVFnQ0NBSElBTkJBM1JxSWdncEF3QTNBd0FnQ0NBRU53TUFJQUJCQVdvaEFBd0FDd0FMQTBBZ0JDQUZRZ0Y5SWdWWkRRSUNRQUpBSUFBZ0FTQUVJQUpCS0dvUWhRRWlBMEVBU0EwQUlBQWdBU0FGSUFKQklHb1FoUUVpQjBFQVNBMEFBa0FnQndSQUlBQWdBU0FFSUFJcEF5QVFoZ0ZCQUVnTkFpQURSUTBCSUFBZ0FTQUZJQUlwQXlnUWhnRkJBRWdOQlNBQ1FvQ0FnSUF3TndNb0RBTUxJQU5GRFFJZ0FDQUJJQVFRK2dGQkFFZ05BU0FBSUFFZ0JTQUNLUU1vRUlZQlFRQklEUVFnQWtLQWdJQ0FNRGNES0F3Q0N5QUFJQUVnQlJENkFVRUFUZzBCQ3lBQ0tRTW9JUVlNQWdzZ0JFSUJmQ0VFREFBTEFBc2dBQ0FHRUE4Z0FDQUJFQTlDZ0lDQWdPQUFJUUVMSUFKQk1Hb2tBQ0FCQzRVQkFRRitRb0NBZ0lEZ0FDRUVJQUFnQVJBbElnRkNnSUNBZ0hDRFFvQ0FnSURnQUZJRVFBSitRb0NBZ0lEZ0FDQUFJQUZCMndBZ0FVRUFFQlFpQkVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBBR2lBQUlBUVFPRVVFUUNBQUlBUVFEeUFBSUFFZ0FDQUFFTEFHREFFTElBQWdCQ0FCUVFCQkFCQXZDeUVFSUFBZ0FSQVBDeUFFQzZFREFnSi9CWDRqQUVFZ2F5SUZKQUFDZmdKQUlBQWdCU0FBSUFFUUpTSUpFRHdOQUVFc0lRWUNRQ0FDUVFCTUlBUnlSUVJBUW9DQWdJQXdJUWRCQUNFQ0lBTXBBd0FpQVVLQWdJQ0FjSU5DZ0lDQWdEQlJEUUVnQUNBQkVDZ2lCMEtBZ0lDQWNJTkNnSUNBZ09BQVVRMENRWDhoQmlBSHB5SUNLQUlFUVFGSERRRWdBaTBBRUNFR0RBRUxRb0NBZ0lBd0lRZEJBQ0VDQ3lBQUlBVkJDR3BCQUJBOUdrSUFJUUVnQlNrREFDSUlRZ0FnQ0VJQVZSc2hDd0pBQTBBZ0FTQUxVZ1JBQWtBZ0FWQU5BQ0FHUVFCT0JFQWdCVUVJYWlBR0VEc2FEQUVMSUFWQkNHb2dBa0VBSUFJb0FnUkIvLy8vL3dkeEVGRWFDeUFBSUFrZ0FhY1FzQUVpQ0VLQWdJQ0FjSU1pQ2tLQWdJQ0FJRkVnQ2tLQWdJQ0FNRkZ5UlFSQUlBcENnSUNBZ09BQVVRMERJQVZCQ0dvZ0JBUitJQUFnQ0JEK0JBVWdDQXNRZncwREN5QUJRZ0Y4SVFFTUFRc0xJQUFnQnhBUElBQWdDUkFQSUFWQkNHb1FOZ3dDQ3lBRktBSUlLQUlRSWdKQkVHb2dCU2dDRENBQ0tBSUVFUUFBSUFBZ0J4QVBDeUFBSUFrUUQwS0FnSUNBNEFBTElRRWdCVUVnYWlRQUlBRUx4UUlDQVg4RGZpTUFRU0JySWdRa0FBSitBa0FDUUNBQUlBUkJFR29nQUNBQkVDVWlCeEE4RFFCQ2Z5RUdJQVFwQXhBaUJVSUFWdzBCSUFRZ0JVSUJmU0lCTndNSUlBSkJBazRFUUNBQUlBUkJDR29nQXlrRENFSi9JQUVnQlJCMERRRWdCQ2tEQ0NFQkN3TkFJQUZDQUZNTkFpQUFJQWNnQVNBRVFSaHFFSVVCSWdKQkFFZ05BUUpBSUFKRkRRQWdBeWtEQUNJRlFpQ0lwMEYxVHdSQUlBV25JZ0lnQWlnQ0FFRUJhallDQUFzZ0FDQUZJQVFwQXhoQkFCQzhBVVVOQUNBQklRWU1Bd3NnQVVJQmZTRUJEQUFMQUFzZ0FDQUhFQTlDZ0lDQWdPQUFEQUVMSUFBZ0J4QVBJQVpDLy8vLy93K0RJQVpDZ0lDQWdBaDhRdi8vLy84UFdBMEFHa0tBZ0lDQXdINGdCcm05SWdGQ2dJQ0FnTUNCZ1B6L0FIMGdBVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc0xJUUVnQkVFZ2FpUUFJQUVMNVFNQ0FuOEdmaU1BUVNCcklnUWtBQUorQWtBZ0FDQUVRUkJxSUFBZ0FSQWxJZ2dRUEEwQVFuOGhDUUpBSUFRcEF4QWlCa0lBVncwQUlBUkNBRGNEQ0NBQ1FRSk9CRUFnQUNBRVFRaHFJQU1wQXdoQ0FDQUdJQVlRZEEwQ0N3SkFBa0FnQ0NBRVFRUnFJQVFRaWdKRkJFQWdCQ2tEQ0NFQkRBRUxJQVFwQXdnaUFTQUVOUUlBSWdjZ0FTQUhWUnNoQ3lBRUtBSUVJUUlEUUNBQklBdFJEUUVnQXlrREFDSUhRaUNJcDBGMVR3UkFJQWVuSWdVZ0JTZ0NBRUVCYWpZQ0FBc2dBaUFCcDBFRGRHb3BBd0FpQ2tJZ2lLZEJkVThFUUNBS3B5SUZJQVVvQWdCQkFXbzJBZ0FMSUFBZ0J5QUtRUUFRdkFFTkFpQUJRZ0Y4SVFFTUFBc0FDeUFCSUFZZ0FTQUdWUnNoQndOQUlBRWdCMUVOQWlBQUlBZ2dBU0FFUVJocUVJVUJJZ0pCQUVnTkF5QUNCRUFnQXlrREFDSUdRaUNJcDBGMVR3UkFJQWFuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dBQ0FHSUFRcEF4aEJBQkM4QVEwQ0N5QUJRZ0Y4SVFFTUFBc0FDeUFCSVFrTElBQWdDQkFQSUFsQy8vLy8vdytESUFsQ2dJQ0FnQWg4UXYvLy8vOFBXQTBCR2tLQWdJQ0F3SDRnQ2JtOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNNQVFzZ0FDQUlFQTlDZ0lDQWdPQUFDeUVCSUFSQklHb2tBQ0FCQzY0REFnaCtBWDhqQUVFd2F5SU5KQUJDZ0lDQWdEQWhCZ0pBQWtBZ0FDQU5RUWhxSUFBZ0FSQWxJZ2NRUEFSQVFvQ0FnSUF3SVFVTUFRdENnSUNBZ0RBaEJTQUFJQU1wQXdBaUNoQmdEUUJDZ0lDQWdEQWhDU0FDUVFKT0JFQWdBeWtEQ0NFSkN5QU5LUU1JSWdWQ0FDQUZRZ0JWR3lFTEEwQWdDQ0FMVWdSQUlBZ2lCVUtBZ0lDQUNGb0VRRUtBZ0lDQXdINGdDTG05SWdWQ2dJQ0FnTUNCZ1B6L0FIMGdCVUwvLy8vLy8vLy8vLzhBZzBLQWdJQ0FnSUNBK1A4QVZoc2hCUXNnQlVLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFBZ0J5QUZFRTBpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUEwZ0FUY0RJQ0FOSUFVM0F4Z2dEU0FHTndNUUlBQWdDaUFKUVFNZ0RVRVFhaEFoSWd4Q2dJQ0FnSENEUW9DQWdJRGdBRkVOQWlBQUlBd1FKZ1JBSUFRRVFDQUFJQVlRRHlBQUlBY1FEd3dGQ3lBQUlBVVFEeUFBSUFjUUR5QUdJUVVNQkFVZ0FDQUdFQThnQUNBRkVBOGdDRUlCZkNFSURBSUxBQXNMSUFBZ0J4QVBRdi8vLy84UFFvQ0FnSUF3SUFRYklRVU1BUXNnQUNBRkVBOGdBQ0FHRUE4Z0FDQUhFQTlDZ0lDQWdPQUFJUVVMSUExQk1Hb2tBQ0FGQzZJQ0FnTitBWDhqQUVFZ2F5SUhKQUFDUUFKQUlBQWdCMEVZYWlBQUlBRVFKU0lGRUR3TkFDQUhRZ0EzQXhBQ1FDQUNRUUZNQkVBZ0J5a0RHQ0VFREFFTElBY3BBeGdoQkNBREtRTUlJZ0ZDZ0lDQWdIQ0RRb0NBZ0lBd1VnUkFJQUFnQjBFUWFpQUJRZ0FnQkNBRUVIUU5BZ3NnQnlBRU53TUlJQUpCQTBrTkFDQURLUU1RSWdGQ2dJQ0FnSENEUW9DQWdJQXdVUTBBSUFBZ0IwRUlhaUFCUWdBZ0JDQUVFSFFOQVNBSEtRTUlJUVFMSUFRZ0J5a0RFQ0lCSUFFZ0JGTWJJUVlEUUNBQklBWlJEUUlnQXlrREFDSUVRaUNJcDBGMVR3UkFJQVNuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dBQ0FGSUFFZ0JCQ0dBVUVBU0EwQklBRkNBWHdoQVF3QUN3QUxJQUFnQlJBUFFvQ0FnSURnQUNFRkN5QUhRU0JxSkFBZ0JRdXVCQUlGZmdOL0l3QkJFR3NpQ1NRQVFvQ0FnSUF3SVFZQ1FBSkFJQUFnQVJBbElnaENnSUNBZ0hDRFFvQ0FnSURnQUZFTkFDQUFJQWhDQUJDckFpSUdRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQkJmeUVLUVg4Z0FpQUNRUUJJR3lFTEFrQURRQ0FLSUF0SEJFQWdDQ0VGSUFwQkFFNEVRQ0FESUFwQkEzUnFLUU1BSVFVTEFrQUNRQ0FGUW9DQWdJQndWQTBBQW44Z0FDQUZRZGdCSUFWQkFCQVVJZ0ZDZ0lDQWdIQ0RJZ2RDZ0lDQWdEQlNCRUFnQjBLQWdJQ0E0QUJSRFFjZ0FDQUJFQ1lNQVFzZ0FDQUZFTW9CQ3lJQ1FRQklEUVVnQWtVTkFDQUFJQWtnQlJBOERRVWdDU2tEQUNJSElBUjhRdi8vLy8vLy8vOFBWUTBFUWdBaEFTQUhRZ0FnQjBJQVZSc2hCd05BSUFFZ0IxRU5BaUFBSUFVZ0FTQUpRUWhxRUlVQklnSkJBRWdOQmlBQ0JFQWdBQ0FHSUFRZ0NTa0RDQkJxUVFCSURRY0xJQVJDQVh3aEJDQUJRZ0Y4SVFFTUFBc0FDeUFFUXY3Ly8vLy8vLzhQVlEwRElBVkNJSWluUVhWUEJFQWdCYWNpQWlBQ0tBSUFRUUZxTmdJQUN5QUFJQVlnQkNBRkVHcEJBRWdOQkNBRVFnRjhJUVFMSUFwQkFXb2hDZ3dCQ3dzZ0FDQUdRVEFnQkVLQWdJQ0FDSHhDLy8vLy93OVlCSDRnQkVMLy8vLy9ENE1GUW9DQWdJREFmaUFFdWIwaUFVS0FnSUNBd0lHQS9QOEFmU0FCUXYvLy8vLy8vLy8vL3dDRFFvQ0FnSUNBZ0lENC93QldHd3NRUlVFQVNBMEJEQUlMSUFCQjBOb0FRUUFRRlFzZ0FDQUdFQTlDZ0lDQWdPQUFJUVlMSUFBZ0NCQVBJQWxCRUdva0FDQUdDN0VDQWdSK0FuOGpBRUVRYXlJSUpBQkNnSUNBZ09BQUlRVUNRQUorQWtBZ0FVS0FnSUNBY0ZRTkFDQUJweTBBQlVFUWNVVU5BQ0FJSUFLdE53TUlJQUFnQVVFQklBaEJDR29RcHdFTUFRc2dBQkErQ3lJRVFvQ0FnSUJ3ZzBLQWdJQ0E0QUJSRFFBZ0FrRUFJQUpCQUVvYnJTRUhRZ0FoQVFKQUEwQWdBU0FIVWdSQUlBTWdBYWRCQTNScUtRTUFJZ1pDSUlpblFYVlBCRUFnQnFjaUNTQUpLQUlBUVFGcU5nSUFDeUFBSUFRZ0FTQUdRWUNBQVJEU0FTRUpJQUZDQVh3aEFTQUpRUUJPRFFFTUFnc0xJQUFnQkVFd0lBSkJBRTRFZmlBQ3JRVkNnSUNBZ01CK0lBSzR2U0lCUW9DQWdJREFnWUQ4L3dCOUlBRkMvLy8vLy8vLy8vLy9BSU5DZ0lDQWdJQ0FnUGovQUZZYkN4QkZRUUJJRFFBZ0JDRUZEQUVMSUFBZ0JCQVBDeUFJUVJCcUpBQWdCUXU2Q1FJQ2Z3aCtJd0JCTUdzaUJDUUFJQU1wQXdBaEJpQUVRb0NBZ0lBd053TVlRUUVoQlFKQUFrQUNmaUFDUVFKSUJFQkNnSUNBZ0RBaERFS0FnSUNBTUF3QkMwS0FnSUNBTUNBREtRTUlJZ3hDZ0lDQWdIQ0RRb0NBZ0lBd1VRMEFHa0tBZ0lDQU1DRUtRb0NBZ0lBd0lRbENnSUNBZ0RBaENFS0FnSUNBTUNFTElBQWdEQkJnRFFGQkFDRUZRb0NBZ0lBd0lBSkJBMGtOQUJvZ0F5a0RFQXNoRFFKQUFrQUNRQUpBSUFBZ0JrSFJBU0FHUVFBUUZDSUhRb0NBZ0lCd2d5SUlRb0NBZ0lBd1VnUkFBa0FDUUNBSVFvQ0FnSURnQUZFRVFFS0FnSUNBTUNFS1FvQ0FnSUF3SVFsQ2dJQ0FnREFoQ0F3QkN5QUFJQWNRRHdKK0FrQWdBVUtBZ0lDQWNGUU5BQ0FCcHkwQUJVRVFjVVVOQUNBQUlBRkJBRUVBRUtjQkRBRUxJQUFRUGdzaUNFS0FnSUNBY0lOQ2dJQ0FnT0FBVVFSQVFvQ0FnSUF3SVFwQ2dJQ0FnREFoQ1F3QkN5QUdRaUNJcDBGMVR3UkFJQWFuSWdJZ0FpZ0NBRUVCYWpZQ0FBc2dCQ0FHTndNUUlBQWdCRUVRYWtFSWNrRUFFSmtESVFJZ0JDa0RHQ0VLSUFRcEF4QWhDU0FDUlEwQkMwS0FnSUNBTUNFTERBWUxRZ0FoQndOQUlBQWdDU0FLSUFSQkNHb1FyZ0VpQmtLQWdJQ0FjSU5DZ0lDQWdPQUFVUTBDSUFRb0FnZ0VRRUtBZ0lDQU1DRUxEQVlMQWtBZ0JRUkFJQVloQVF3QkN5QUVJQVkzQXlBZ0JDQUhRdi8vLy84UGd6Y0RLQ0FBSUF3Z0RVRUNJQVJCSUdvUUlTRUJJQUFnQmhBUElBRkNnSUNBZ0hDRFFvQ0FnSURnQUZFTkF3c2dBQ0FJSUFjZ0FSQnFRUUJJRFFJZ0IwSUJmQ0VIREFBTEFBc2dBQ0FHRUNVaUMwS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQ0lBQWdCRUVJYWlBTEVEeEJBRWdOQWlBRUFuNGdCQ2tEQ0NJR1FvQ0FnSUFJZkVMLy8vLy9EMWdFUUNBR1F2Ly8vLzhQZ3d3QkMwS0FnSUNBd0g0Z0JybTlJZ2RDZ0lDQWdNQ0JnUHovQUgwZ0IwTC8vLy8vLy8vLy8vOEFnMEtBZ0lDQWdJQ0ErUDhBVmhzTElnYzNBeUFDZmdKQUlBRkNnSUNBZ0hCVURRQWdBYWN0QUFWQkVIRkZEUUFnQUNBQlFRRWdCRUVnYWhDbkFRd0JDeUFBUW9DQWdJQXdRUUVnQkVFZ2FoQ3VBd3NoQ0NBQUlBY1FEeUFJUW9DQWdJQndnMEtBZ0lDQTRBQlJCRUJDZ0lDQWdEQWhDZ3dDQzBJQUlRY2dCa0lBSUFaQ0FGVWJJUWtEUUNBSElBbFJCRUJDZ0lDQWdEQWhDa0tBZ0lDQU1DRUpEQVVMUW9DQWdJQXdJUW9nQUNBTElBY1FjeUlHUW9DQWdJQndnMEtBZ0lDQTRBQlJEUUlDUUNBRkJFQWdCaUVCREFFTElBUWdCamNESUNBRUlBZEMvLy8vL3crRE53TW9JQUFnRENBTlFRSWdCRUVnYWhBaElRRWdBQ0FHRUE4Z0FVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwREN5QUFJQWdnQnlBQkVHcEJBRWdOQWlBSFFnRjhJUWNNQUFzQUMwS0FnSUNBTUNFTElBbENnSUNBZ0hDRFFvQ0FnSUF3VVEwRElBQWdDVUVCRUswQkdnd0RDMEtBZ0lDQU1DRUpEQUlMUW9DQWdJQXdJUXBDZ0lDQWdEQWhDVUtBZ0lDQU1DRUlEQUVMSUFBZ0NFRXdJQWVuSWdKQkFFNEVmaUFIUXYvLy8vOFBnd1ZDZ0lDQWdNQitJQUs0dlNJQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJDeEJGUVFCT0RRRUxJQUFnQ0JBUFFvQ0FnSURnQUNFSUN5QUFJQXNRRHlBQUlBa1FEeUFBSUFvUUR5QUVRVEJxSkFBZ0NBc21BRUtBZ0lDQTRBQWdBQ0FES1FNQUVNb0JJZ0JCQUVldFFvQ0FnSUFRaENBQVFRQklHd3VBQVFBakFFRVFheUlBSkFBZ0FCQ2pCQUorSUFBMEFnZ2dBQ2tEQUVMQWhEMStmQ0lCUW9DQWdJQUlmRUwvLy8vL0QxZ0VRQ0FCUXYvLy8vOFBnd3dCQzBLQWdJQ0F3SDRnQWJtOUlnRkNnSUNBZ01DQmdQei9BSDBnQVVMLy8vLy8vLy8vLy84QWcwS0FnSUNBZ0lDQStQOEFWaHNMSVFFZ0FFRVFhaVFBSUFFTHh3SUJCWDhqQUVFZ2F5SUVKQUFnQUNBREtRTUFFQ2dpQVVLQWdJQ0FjSU5DZ0lDQWdPQUFVZ1JBSUFBZ0JFRUlha0VBRUQwYUlBR25JZ1ZCRUdvaEJpQUZLQUlFUWYvLy8vOEhjU0VIUVFBaEF3TkFJQU1nQjA1RkJFQUNRQUovSUFVcEFnUkNnSUNBZ0FpRFVDSUlSUVJBSUFZZ0EwRUJkR292QVFBTUFRc2dBeUFHYWkwQUFBc2lBa0VsUncwQUFrQWdBMEVHYWlBSFNnMEFJQU5CQVdvaEFnSi9JQWhGQkVBZ0JpQUNRUUYwYWk4QkFBd0JDeUFDSUFacUxRQUFDMEgxQUVjTkFDQUZJQU5CQW1wQkJCQzRCQ0lDUVFCSURRQWdBMEVGYWlFRERBRUxRU1VoQWlBRFFRTnFJQWRLRFFBZ0JTQURRUUZxUVFJUXVBUWlBa0VsSUFKQkFFNGlDQnNoQWlBRFFRSnFJQU1nQ0JzaEF3c2dCRUVJYWlBQ0VJc0JHaUFEUVFGcUlRTU1BUXNMSUFBZ0FSQVBJQVJCQ0dvUU5pRUJDeUFFUVNCcUpBQWdBUXZrQVFFRWZ5TUFRU0JySWdJa0FDQUFJQU1wQXdBUUtDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCU0JFQWdBQ0FDUVFocUlBR25JZ1VvQWdSQi8vLy8vd2R4RUQwYUlBVkJFR29oQmlBRktBSUVRZi8vLy84SGNTRUhRUUFoQXdOQUlBTWdCMFpGQkVBQ1FBSkFBa0FnQlMwQUIwR0FBWEZGQkVBZ0F5QUdhaTBBQUNFRURBRUxJQVlnQTBFQmRHb3ZBUUFpQkVIL0FVc05BUXRCa09FQklBUkJ4UUFRK3dGRkRRQWdBa0VJYWlBRUVJc0JHZ3dCQ3lBQ1FRaHFJQVFRbWdJTElBTkJBV29oQXd3QkN3c2dBQ0FCRUE4Z0FrRUlhaEEySVFFTElBSkJJR29rQUNBQkM4NEVBZ1ovQVg0akFFRWdheUlHSkFBQ1FDQUFJQU1wQXdBUUtDSUJRb0NBZ0lCd2cwS0FnSUNBNEFCUkRRQWdBQ0FHUVFocUlBR25JZ2tvQWdSQi8vLy8vd2R4RUQwYUlBbEJFR29oQ0VFQUlRSUNRQU5BSUFrcEFnUWlDNmRCLy8vLy93ZHhJZ29nQWtvRVFDQUNRUUZxSVFVQ1FBSkFJQXRDZ0lDQWdBaURJZ3RRQkVBZ0FpQUlhaTBBQUNFRERBRUxJQWdnQWtFQmRHb3ZBUUFpQTBIL0FVc05BUXNDUUNBRFFUQnJRUXBKSUFOQjMvOERjVUhCQUd0QkdrbHlEUUJCcFpRQklBTkJDUkQ3QVEwQUlBUU5BU0FERUxJR1JRMEJDeUFHUVFocUlBTVFpd0VhSUFVaEFnd0NDd0ovQW44Q1FDQURRWUQ0QTNFaUIwR0FzQU5IQkVBZ0IwR0F1QU5IRFFGQnY4TUFJUWNNQmd0QjVNQUFJUWNnQlNBS1RnMEZBbjhnQzFCRkJFQWdDQ0FGUVFGMGFpOEJBQXdCQ3lBRklBaHFMUUFBQ3lJRlFZREFBMnRCZ0hoSkRRVWdCa0VJYWlBRlFmOEhjU0FEUVFwMFFZRDRQM0Z5UVlDQUJHb2lBMEVTZGtId0FYSVFtZ0lnQTBFTWRrRS9jVUdBQVhJaEJ5QUNRUUpxREFFTElBTkIvd0JOQkVBZ0JrRUlhaUFERUpvQ0lBVWhBZ3dFQ3lBRFFmOFBUUVJBSUFVaEFpQURRUVoyUWNBQmNnd0NDeUFEUVF4MlFlQUJjaUVISUFVTElRSWdCa0VJYWlBSEVKb0NJQU5CQm5aQlAzRkJnQUZ5Q3lFSElBWkJDR29pQlNBSEVKb0NJQVVnQTBFL2NVR0FBWElRbWdJTUFRc0xJQUFnQVJBUElBWkJDR29RTmlFQkRBRUxJQUFnQnhDNUJDQUFJQUVRRHlBR0tBSUlLQUlRSWdCQkVHb2dCaWdDRENBQUtBSUVFUUFBUW9DQWdJRGdBQ0VCQ3lBR1FTQnFKQUFnQVF1VkJBSUdmd0YrSXdCQklHc2lCU1FBQWtBZ0FDQURLUU1BRUNnaUFVS0FnSUNBY0lOQ2dJQ0FnT0FBVVEwQUlBQWdCVUVJYWtFQUVEMGFJQUduSWdoQkVHb2hDVUVBSVFJRFFBSkFBa0FDUUNBSUtRSUVJZ3VuUWYvLy8vOEhjU0FDU2dSQUFuOGdDMEtBZ0lDQUNJTlFSUVJBSUFrZ0FrRUJkR292QVFBTUFRc2dBaUFKYWkwQUFBc2lBMEVsUmdSQUlBQWdDQ0FDRUxNR0lnTkJBRWdOQXlBQ1FRTnFJUVlnQTBIL0FFMEVRQ0FFQkVBZ0JpRUNEQVlMUVNVZ0F5QURFTElHSWdjYklRTWdBa0VCYWlBR0lBY2JJUUlNQlFzQ2Z5QURRV0J4UWNBQlJnUkFJQU5CSDNFaEEwR0FBU0VIUVFFTUFRc2dBMEZ3Y1VIZ0FVWUVRQ0FEUVE5eElRTkJnQkFoQjBFQ0RBRUxJQU5CZUhGQjhBRkhCRUJCQVNFSFFRQWhBMEVBREFFTElBTkJCM0VoQTBHQWdBUWhCMEVEQ3lFQ0EwQWdBa0VBVEEwRElBQWdDQ0FHRUxNR0lncEJBRWdOQkNBR1FRTnFJUVlnQ2tIQUFYRkJnQUZIQkVCQkFDRUREQVFGSUFKQkFXc2hBaUFLUVQ5eElBTkJCblJ5SVFNTUFRc0FDd0FMSUFKQkFXb2hBZ3dEQ3lBQUlBRVFEeUFGUVFocUVEWWhBUXdFQ3lBR0lRSWdBeUFIU0NBRFFmLy93d0JLY2tVZ0EwR0FjSEZCZ0xBRFIzRU5BU0FBUWNtSkFSQzVCQXNnQUNBQkVBOGdCU2dDQ0NnQ0VDSUFRUkJxSUFVb0Fnd2dBQ2dDQkJFQUFFS0FnSUNBNEFBaEFRd0NDeUFGUVFocUlBTVF1UUVhREFBTEFBc2dCVUVnYWlRQUlBRUxOd0FnQUNBREtRTUFFTE1CSWdKRkJFQkNnSUNBZ09BQUR3c2dBQ0FDRUlFQ0lBSnFRUUJCQ2tFQUVMZ0NJUUVnQUNBQ0VGUWdBUXVIQVFFQmZ5TUFRUkJySWdJa0FBSkFJQUFnQXlrREFCQ3pBU0lFUlFSQVFvQ0FnSURnQUNFQkRBRUxBbjVDZ0lDQWdPQUFJQUFnQWtFTWFpQURLUU1JRUhjTkFCb2dBaWdDRENJREJFQkNnSUNBZ01CK0lBTkJKV3RCWFVrTkFSb0xJQUFnQkJDQkFpQUVha0VBSUFOQmdRZ1F1QUlMSVFFZ0FDQUVFRlFMSUFKQkVHb2tBQ0FCQ3drQUlBQWdBUkRkQWd1akFRSUJmZ0YvSXdCQkVHc2lBaVFBQW40Z0FDQUJFTjBDSWdWQ2dJQ0FnSENEUW9DQWdJRGdBRkVFUUNBRkRBRUxRUW9oQmdKQUFrQWdCQTBBSUFNcEF3QWlBVUtBZ0lDQWNJTkNnSUNBZ0RCUkRRQWdBQ0FCRUk0RklnWkJBRWdOQVF0Q2dJQ0FnT0FBSUFBZ0FrRUlhaUFGRUc0TkFSb2dBQ0FDS3dNSUlBWkJBRUVBRUk4Q0RBRUxJQUFnQlJBUFFvQ0FnSURnQUFzaEFTQUNRUkJxSkFBZ0FRdU1BZ0lCZmdGOEl3QkJFR3NpQWlRQVFvQ0FnSURnQUNFRUFrQWdBQ0FCRU4wQ0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUVFNQVFzZ0FDQUNJQUVRYmcwQUFrQUNRQ0FES1FNQUlnRkNnSUNBZ0hDRFFvQ0FnSUF3VVFSQUlBSXBBd0FoQVF3QkN5QUFJQUpCREdvZ0FSQzZBUTBDSUFJckF3QWlCYjBpQVVLQWdJQ0FnSUNBK1A4QWcwS0FnSUNBZ0lDQStQOEFVZzBCQ3lBQVFvQ0FnSURBZmlBQlFvQ0FnSURBZ1lEOC93QjlJQUZDLy8vLy8vLy8vLy8vQUlOQ2dJQ0FnSUNBZ1BqL0FGWWJFRGNoQkF3QkN5QUNLQUlNSWdOQjVRQnJRWnQvVFFSQUlBQkJpalJCQUJCUURBRUxJQUFnQlVFS0lBTkJBUkNQQWlFRUN5QUNRUkJxSkFBZ0JBdllBUUlCZmdGOEl3QkJFR3NpQWlRQVFvQ0FnSURnQUNFRUFrQWdBQ0FCRU4wQ0lnRkNnSUNBZ0hDRFFvQ0FnSURnQUZFRVFDQUJJUVFNQVFzZ0FDQUNJQUVRYmcwQUlBQWdBa0VNYWlBREtRTUFFTG9CRFFBZ0FpZ0NEQ0lEUWVVQVR3UkFJQUJCaWpSQkFCQlFEQUVMSUFJckF3QWlCWmxFVU8vaTF1UWFTMFJtQkVBZ0FFS0FnSUNBd0g0Z0JiMGlBVUtBZ0lDQXdJR0EvUDhBZlNBQlF2Ly8vLy8vLy8vLy93Q0RRb0NBZ0lDQWdJRDQvd0JXR3hBM0lRUU1BUXNnQUNBRlFRb2dBMEVDRUk4Q0lRUUxJQUpCRUdva0FDQUVDejBBQW40Q1FDQUJFS01ESWdKRkRRQWdBaTBBRUVFQmNRMEFRb0NBZ0lBd0lBSXRBQkZCQVhFTkFSb0xJQUJCc2pSQkFCQVZRb0NBZ0lEZ0FBc0x6UU1EQlh3QmZnTi9Ba0FDUUFKQUFrQWdBTDBpQmtJQVdRUkFJQVpDSUlpbklnZEIvLzgvU3cwQkN5QUdRdi8vLy8vLy8vLy8vd0NEVUFSQVJBQUFBQUFBQVBDL0lBQWdBS0tqRHdzZ0JrSUFXUTBCSUFBZ0FLRkVBQUFBQUFBQUFBQ2pEd3NnQjBILy83Ly9CMHNOQWtHQWdNRC9BeUVJUVlGNElRa2dCMEdBZ01EL0EwY0VRQ0FISVFnTUFnc2dCcWNOQVVRQUFBQUFBQUFBQUE4TElBQkVBQUFBQUFBQVVFT2l2U0lHUWlDSXB5RUlRY3QzSVFrTElBWkMvLy8vL3crRElBaEI0cjRsYWlJSFFmLy9QM0ZCbnNHYS93TnFyVUlnaG9TL1JBQUFBQUFBQVBDL29DSUFJQUFnQUVRQUFBQUFBQURnUDZLaUlnT2h2VUtBZ0lDQWNJTy9JZ1JFQUFBZ1pVY1Y5eitpSWdFZ0NTQUhRUlIyYXJjaUFxQWlCU0FCSUFJZ0JhR2dJQUFnQUVRQUFBQUFBQUFBUUtDaklnRWdBeUFCSUFHaUlnSWdBcUlpQVNBQklBRkVuOFo0MEFtYXd6K2lSSzk0amgzRmNjdy9vS0pFQlBxWG1abVoyVCtnb2lBQ0lBRWdBU0FCUkVSU1B0OFM4Y0kvb2tUZUE4dVdaRWJIUDZDaVJGbVRJcFFrU2RJL29LSkVrMVZWVlZWVjVUK2dvcUNnb2lBQUlBU2hJQU9ob0NJQUlBU2dSQUNpN3k3OEJlYzlvaUFBUkFBQUlHVkhGZmMvb3FDZ29DRUFDeUFBQ3d2bHVnUmxBRUdBQ0F0dy9vSXJaVWNWWjBBQUFBQUFBQUE0UXdBQSt2NUNMbmEvT2p1ZXZKcjNETDI5L2YvLy8vL2ZQenhVVlZWVlZjVS9rU3NYejFWVnBUOFgwS1JuRVJHQlB3QUFBQUFBQU1oQzd6bjYva0l1NWo4a3hJTC92Yi9PUDdYMEROY0lhNncvekZCRzBxdXlneitFT2s2YjROZFZQd0JCL2dnTGtoRHdQMjYvaUJwUE81czhOVFA3cVQzMjd6OWQzTmljRTJCeHZHR0FkejZhN084LzBXYUhFSHBla0x5RmYyN29GZVB2UHhQMlp6VlMwb3c4ZElVVjA3RFo3ei82anZramdNNkx2TjcyM1NscjBPOC9ZY2ptWVU3M1lEekltM1VZUmNmdlA1blRNMXZrbzVBOGcvUEd5ajYrN3o5dGU0TmRwcHFYUEErSitXeFl0ZTgvL08vOWtocTFqanozUjNJcmtxenZQOUdjTDNBOXZqNDhvdEhUTXV5ajd6OExicENKTkFOcXZCdlQvcTltbSs4L0RyMHZLbEpXbGJ4Uld4TFFBWlB2UDFYcVRvenZnRkM4ekRGc3dMMks3ejhXOU5XNUk4bVJ2T0F0cWE2YWd1OC9yMVZjNmVQVGdEeFJqcVhJbUhydlAwaVRwZW9WRzRDOGUxRjlQTGh5N3o4OU10NVY4QitQdk9xTmpEajVhdTgvdjFNVFA0eUppengxeTIvclcyUHZQeWJyRVhhYzJaYTgxRndFaE9CYjd6OWdMem8rOSt5YVBLcTVhREdIVk84L25UaUd5NExuajd3ZDJmd2lVRTN2UDQzRHBrUkJiNG84MW94aWlEdEc3ejk5Qk9Td0JYcUFQSmJjZlpGSlArOC9sS2lvNC8yT2xqdzRZblZ1ZWpqdlAzMUlkUElZWG9jOFA2YXlUODR4N3oveTV4K1lLMGVBUE4xODRtVkZLKzgvWGdoeFAzdTRscnlCWS9YaDN5VHZQekdyQ1czaDk0STg0ZDRmOVowZTd6LzZ2MjhhbXlFOXZKRFoydEIvR084L3RBb01jb0kzaXp3TEErU21oUkx2UDQvTHpvbVNGRzQ4Vmk4K3FhOE03eisycTdCTmRVMkRQQlczTVFyK0J1OC9USFNzNGdGQ2hqd3gyRXo4Y0FIdlAwcjQwMTA1M1k4OC94WmtzZ2o4N2o4RVc0NDdnS09HdlBHZmtsL0Y5dTQvYUZCTHpPMUtrcnpMcVRvM3AvSHVQNDR0VVJ2NEI1bThadGdGYmE3czdqL1NOcFErNk5GeHZQZWY1VFRiNSs0L0ZSdk9zeGtabWJ6bHFCUERMZVB1UDIxTUtxZEluNFU4SWpRU1RLYmU3aitLYVNoNllCS1R2QnlBckFSRjJ1NC9XNGtYU0krbldMd3FMdmNoQ3RidVB4dWFTV2ViTEh5OGw2aFEyZlhSN2o4UnJNSmc3V05EUEMySllXQUl6dTQvNzJRR093bG1sanhYQUIzdFFjcnVQM2tEb2RyaHpHNDgwRHpCdGFMRzdqOHdFZzgvanYrVFBON1QxL0Fxdys0L3NLOTZ1ODZRZGp3bktqYlYyci91UDNmZ1ZPdTlIWk04RGQzOW1iSzg3aitPbzNFQU5KU1B2S2NzblhheXVlNC9TYU9UM016ZWg3eENacytpMnJidVAxODRENzNHM25pOGdrK2RWaXUwN2ovMlhIdnNSaEtHdkErU1hjcWtzZTQvanRmOUdBVTFrenphSjdVMlI2L3VQd1diaWkrM21IczgvY2VYMUJLdDdqOEpWQnppNFdPUVBDbFVTTjBIcSs0LzZzWVpVSVhITkR5M1JsbUtKcW51UHpYQVpDdm1NcFE4U0NHdEZXK243aitmZHBsaFN1U012QW5jZHJuaHBlNC9xRTN2TzhVempMeUZWVHF3ZnFUdVA2N3BLNGw0VTRTOElNUE1ORWFqN2o5WVdGWjQzYzZUdkNVaVZZSTRvdTQvWkJsK2dLb1FWenh6cVV6VVZhSHVQeWdpWHIvdnM1Tzh6VHQvWnA2ZzdqK0N1VFNIclJKcXZML2FDM1VTb080LzdxbHR1TzluWTd3dkdtVThzcC91UDFHSTRGUTkzSUM4aEpSUitYMmY3ai9QUGxwK1pCOTR2SFJmN09oMW4rNC9zSDJMd0VydWhyeDBnYVZJbXAvdVA0cm1WUjR5R1lhOHlXZENWdXVmN2ovVDFBbGV5NXlRUEQ5ZDNrOXBvTzQvSGFWTnVkd3llN3lIQWV0ekZLSHVQMnZBWjFUOTdKUThNc0V3QWUyaDdqOVZiTmFyNGV0bFBHSk96emJ6b3U0L1FzK3pMOFdoaUx3U0dqNVVKNlR1UHpRM08vRzJhWk84RTg1TW1ZbWw3ajhlL3hrNmhGNkF2SzNISTBZYXArNC9ibGR5MkZEVWxMenRra1NiMmFqdVB3Q0tEbHRuclpBOG1XYUsyY2VxN2orMDZ2REJMN2VOUE51Z0trTGxyTzQvLytmRm5HQzJaYnlNUkxVV01xL3VQMFJmODFtRDluczhObmNWbWE2eDdqK0RQUjZuSHdtVHZNYi9rUXRidE80L0tSNXNpN2lwWGJ6bHhjMndON2Z1UDFtNWtIejVJMnk4RDFMSXkwUzY3aitxK2ZRaVEwT1N2RkJPM3ArQ3ZlNC9TNDVtMTJ6S2hieTZCOHB3OGNEdVB5Zk9rU3Y4cjNFOGtQQ2pncEhFN2orN2N3cmhOZEp0UENNajR4bGp5TzQvWXlKaUlnVEZoN3hsNVYxN1pzenVQOVV4NHVPR0hJczhNeTFLN0p2UTdqOFZ1N3pUMGJ1UnZGMGxQcklEMWU0LzBqSHVuREhNa0R4WXN6QVRudG51UDdOYWMyNkVhWVE4di8xNVZXdmU3aiswblk2WHpkK0N2SHJ6MDc5cjQrNC9oelBMa25jYWpEeXQwMXFabitqdVAvclowVXFQZTVDOFpyYU5LUWZ1N2orNnJ0eFcyY05WdlBzVlQ3aWk4KzQvUVBhbVBRNmtrTHc2V2VXTmN2bnVQelNUclRqMDFtaThSMTc3OG5iLzdqODFpbGhyNHU2UnZFb0dvVEN3QmU4L3pkMWZDdGYvZER6U3dVdVFIZ3p2UDZ5WWt2cjd2Wkc4Q1I3WFc4SVM3eit6REs4d3JtNXpQSnhTaGQyYkdlOC9sUDJmWERMampqeDYwUDlmcXlEdlA2eFpDZEdQNElROFM5RlhMdkVuN3o5bkdrNDRyODFqUExYbkJwUnRMKzgvYUJtU2JDeHJaenhwa08vY0lEZnZQOUsxeklNWWlvQzgrc05kVlFzLzd6OXYrdjgvWGEyUHZIeUpCMG90Uis4L1NhbDFPSzROa0x6eWlRMEloMC92UDZjSFBhYUZvM1E4aDZUNzNCaFk3ejhQSWtBZ25wR0N2SmlEeVJiallPOC9ySkxCMVZCYWpqeUZNdHNENW1udlAwdHJBYXhaT29ROFlMUUI4eUZ6N3o4ZlByUUhJZFdDdkYrYmV6T1hmTzgveVExSE83a3FpYndwb2ZVVVJvYnZQOU9JT21BRXRuUTg5aitMNXk2UTd6OXhjcDFSN01XRFBJTk14L3RSbXU4LzhKSFRqeEwzajd6YWtLU2lyNlR2UDMxMEkrS1lybzI4OFdlT0xVaXY3ejhJSUtwQnZNT09QQ2RhWWU0YnV1OC9NdXVwdzVRcmhEeVh1bXMzSzhYdlArNkYwVEdwWklvOFFFVnVXM2JRN3ovdDR6dmt1amVPdkJTK25LMzkyKzgvbmMyUlRUdUpkenpZa0o2QndlZnZQNG5NWUVIQkJWTTg4WEdQSzhMejd6OEFBQUFBQUFEd1B3QUFBQUFBQVBnL0FBQUFBQUFBQUFBRzBNOUQ2LzFNUGdCQm14a0w1NFVCUUFPNDRqOG9LWHQ5QUNncGUzTjFjR1Z5S0M0dUxtRnlaM1Z0Wlc1MGN5azdmUUFvS1NCN0NpQWdJQ0JiYm1GMGFYWmxJR052WkdWZENuMEFZMkZ1Ym05MElHMXBlQ0EvUHlCM2FYUm9JQ1ltSUc5eUlIeDhBR04wZWdCd2NtOTRlVG9nY0hKdmNHVnlkSGtnYm05MElIQnlaWE5sYm5RZ2FXNGdkR0Z5WjJWMElIZGxjbVVnY21WMGRYSnVaV1FnWW5rZ2JtOXVJR1Y0ZEdWdWMybGliR1VnY0hKdmVIa0FjbVYyYjJ0bFpDQndjbTk0ZVFCUWNtOTRlUUJoWkdSZmNISnZjR1Z5ZEhrQWNISnZlSGs2SUdOaGJtNXZkQ0J6WlhRZ2NISnZjR1Z5ZEhrQWJtOGdjMlYwZEdWeUlHWnZjaUJ3Y205d1pYSjBlUUIyWVd4MVpTQm9ZWE1nYm04Z2NISnZjR1Z5ZEhrQVkyOTFiR1FnYm05MElHUmxiR1YwWlNCd2NtOXdaWEowZVFCd2NtOTRlVG9nWkhWd2JHbGpZWFJsSUhCeWIzQmxjblI1QUVwVFgwUmxabWx1WlVGMWRHOUpibWwwVUhKdmNHVnlkSGtBYUdGelQzZHVVSEp2Y0dWeWRIa0FjSEp2ZUhrNklHbHVZMjl1YzJsemRHVnVkQ0JrWld4bGRHVlFjbTl3WlhKMGVRQndjbTk0ZVRvZ2FXNWpiMjV6YVhOMFpXNTBJR1JsWm1sdVpWQnliM0JsY25SNUFFcFRYMFJsWm1sdVpWQnliM0JsY25SNUFDRnRjaTArWlcxd2RIa0FhVzVtYVc1cGRIa0FTVzVtYVc1cGRIa0FiM1YwSUc5bUlHMWxiVzl5ZVFCMWJtdHViM2R1SUhWdWFXTnZaR1VnWjJWdVpYSmhiQ0JqWVhSbFoyOXllUUJIWlc1bGNtRnNYME5oZEdWbmIzSjVBR1YyWlhKNUFHRnVlUUJoY0hCc2VRQW5KWE1uSUdseklISmxZV1F0YjI1c2VRQmxlSEJsWTNScGJtY2dZMkYwWTJnZ2IzSWdabWx1WVd4c2VRQnpkR2xqYTNrQVltbG5hVzUwSUdGeVpTQm1iM0ppYVdSa1pXNGdhVzRnU2xOUFRpNXpkSEpwYm1kcFpua0FjM1ZpWVhKeVlYa0FaVzF3ZEhrZ1lYSnlZWGtBYm05dUlHbHVkR1ZuWlhJZ2FXNWtaWGdnYVc0Z2RIbHdaV1FnWVhKeVlYa0FibVZuWVhScGRtVWdhVzVrWlhnZ2FXNGdkSGx3WldRZ1lYSnlZWGtBYjNWMExXOW1MV0p2ZFc1a0lHbHVaR1Y0SUdsdUlIUjVjR1ZrSUdGeWNtRjVBR05oYm01dmRDQmpjbVZoZEdVZ2JuVnRaWEpwWXlCcGJtUmxlQ0JwYmlCMGVYQmxaQ0JoY25KaGVRQnBjMEZ5Y21GNUFGUjVjR1ZrUVhKeVlYa0FaMlYwUkdGNUFHZGxkRlZVUTBSaGVRQnFjMTluWlhSZllYUnZiVjlwYm1SbGVBQnBiblpoYkdsa0lHRnljbUY1SUdsdVpHVjRBRzkxZEMxdlppMWliM1Z1WkNCdWRXMWxjbWxqSUdsdVpHVjRBRXBUWDBGMGIyMUpjMEZ5Y21GNVNXNWtaWGdBWm1sdVpFbHVaR1Y0QUdsdWRtRnNhV1FnWlhod2IzSjBJSE41Ym5SaGVBQnBiblpoYkdsa0lHRnpjMmxuYm0xbGJuUWdjM2x1ZEdGNEFHMWhlQUJjZFNVd05IZ0FhVzUyWVd4cFpDQnZjR052WkdVNklIQmpQU1YxSUc5d1kyOWtaVDB3ZUNVd01uZ0FMU3NnSUNBd1dEQjRBQzB3V0Nzd1dDQXdXQzB3ZUNzd2VDQXdlQUJzYVc1bElIUmxjbTFwYm1GMGIzSWdibTkwSUdGc2JHOTNaV1FnWVdaMFpYSWdkR2h5YjNjQVltWmZjRzkzQUc1dmR3QnBiblJsWjJWeUlHOTJaWEptYkc5M0FITjBZV05ySUc5MlpYSm1iRzkzQUcxMWMzUWdZbVVnWTJGc2JHVmtJSGRwZEdnZ2JtVjNBR2x6Vm1sbGR3QkVZWFJoVm1sbGR3QnlZWGNBZEdScGRnQm1aR2wyQUdWa2FYWUFZMlJwZGdBbGRRQmpiR0Z6Y3lCa1pXTnNZWEpoZEdsdmJuTWdZMkZ1SjNRZ1lYQndaV0Z5SUdsdUlITnBibWRzWlMxemRHRjBaVzFsYm5RZ1kyOXVkR1Y0ZEFCbWRXNWpkR2x2YmlCa1pXTnNZWEpoZEdsdmJuTWdZMkZ1SjNRZ1lYQndaV0Z5SUdsdUlITnBibWRzWlMxemRHRjBaVzFsYm5RZ1kyOXVkR1Y0ZEFCc1pYaHBZMkZzSUdSbFkyeGhjbUYwYVc5dWN5QmpZVzRuZENCaGNIQmxZWElnYVc0Z2MybHVaMnhsTFhOMFlYUmxiV1Z1ZENCamIyNTBaWGgwQUdSMWNHeHBZMkYwWlNCaGNtZDFiV1Z1ZENCdVlXMWxjeUJ1YjNRZ1lXeHNiM2RsWkNCcGJpQjBhR2x6SUdOdmJuUmxlSFFBWkhWd2JHbGpZWFJsSUhCaGNtRnRaWFJsY2lCdVlXMWxjeUJ1YjNRZ1lXeHNiM2RsWkNCcGJpQjBhR2x6SUdOdmJuUmxlSFFBYVcxd2IzSjBMbTFsZEdFZ2JtOTBJSE4xY0hCdmNuUmxaQ0JwYmlCMGFHbHpJR052Ym5SbGVIUUFTbE5mUm5KbFpVTnZiblJsZUhRQVNsTkRiMjUwWlhoMEFHcHpYMjFoY0Y5cGRHVnlZWFJ2Y2w5dVpYaDBBR3B6WDJGemVXNWpYMmRsYm1WeVlYUnZjbDl5WlhOMWJXVmZibVY0ZEFCMWJtVjRjR1ZqZEdWa0lHVnVaQ0J2WmlCcGJuQjFkQUIwZEFCbGVIQnZjblJsWkNCMllYSnBZV0pzWlNBbkpYTW5JR1J2WlhNZ2JtOTBJR1Y0YVhOMEFIQnlhWFpoZEdVZ1kyeGhjM01nWm1sbGJHUWdKeVZ6SnlCa2IyVnpJRzV2ZENCbGVHbHpkQUIwWlhOMEFHRnpjMmxuYm0xbGJuUWdjbVZ6ZENCd2NtOXdaWEowZVNCdGRYTjBJR0psSUd4aGMzUUFZbVpmYzNGeWRBQnpiM0owQUdOaWNuUUFkSEpwYlZOMFlYSjBBSEJoWkZOMFlYSjBBSFZ1YTI1dmQyNGdkVzVwWTI5a1pTQnpZM0pwY0hRQVUyTnlhWEIwQUdoNWNHOTBBR1p5WldWZmVtVnliMTl5WldaamIzVnVkQUJtWVhOMFgyRnljbUY1WDJOdmRXNTBBR0pwYm1GeWVWOXZZbXBsWTNSZlkyOTFiblFBYzNSeVgybHVaR1Y0SUQwOUlHNTFiVjlyWlhselgyTnZkVzUwSUNzZ2MzUnlYMnRsZVhOZlkyOTFiblFBYm5WdFgybHVaR1Y0SUQwOUlHNTFiVjlyWlhselgyTnZkVzUwQUhOMGNsOWpiM1Z1ZEFCd2NtOXdYMk52ZFc1MEFITjViVjlwYm1SbGVDQTlQU0JoZEc5dFgyTnZkVzUwQUd4aFltVnNJRDQ5SURBZ0ppWWdiR0ZpWld3Z1BDQnpMVDVzWVdKbGJGOWpiM1Z1ZEFCc1lXSXhJRDQ5SURBZ0ppWWdiR0ZpTVNBOElITXRQbXhoWW1Wc1gyTnZkVzUwQUc5aWFsOWpiM1Z1ZEFCMllXd2dQQ0J6TFQ1allYQjBkWEpsWDJOdmRXNTBBSFpoYkRJZ1BDQnpMVDVqWVhCMGRYSmxYMk52ZFc1MEFITm9ZWEJsWDJOdmRXNTBBR3B6WDJaMWJtTmZjR015YkdsdVpWOWpiM1Z1ZEFCdFpXMXZjbmxmZFhObFpGOWpiM1Z1ZEFCdFlXeHNiMk5mWTI5MWJuUUFhbk5mWm5WdVkxOWpiM1Z1ZEFCalgyWjFibU5mWTI5MWJuUUFhVzUyWVd4cFpDQnlaWEJsWVhRZ1kyOTFiblFBYVc1MllXeHBaQ0J5WlhCbGRHbDBhVzl1SUdOdmRXNTBBR1p2Ym5RQWFXNTJZV3hwWkNCamIyUmxJSEJ2YVc1MEFHWnliMjFEYjJSbFVHOXBiblFBYVc1MllXeHBaQ0JvYVc1MEFHTmhibTV2ZENCamIyNTJaWEowSUU1aFRpQnZjaUJKYm1acGJtbDBlU0IwYnlCaWFXZHBiblFBWTJGdWJtOTBJR052Ym5abGNuUWdkRzhnWW1sbmFXNTBBR0p2ZEdnZ2IzQmxjbUZ1WkhNZ2JYVnpkQ0JpWlNCaWFXZHBiblFBYm05MElHRWdZbWxuYVc1MEFHVnVZMjlrWlZWU1NVTnZiWEJ2Ym1WdWRBQmtaV052WkdWVlVrbERiMjF3YjI1bGJuUUFkVzVsZUhCbFkzUmxaQ0JsYm1RZ2IyWWdZMjl0YldWdWRBQnBiblpoYkdsa0lITjNhWFJqYUNCemRHRjBaVzFsYm5RQVFtbG5TVzUwQUhCaGNuTmxTVzUwQUdSMWNHeHBZMkYwWlNCa1pXWmhkV3gwQUcxaGJHeHZZMTlzYVcxcGRBQnpjR3hwZEFCbGVIQmxZM1JwYm1jZ2FHVjRJR1JwWjJsMEFIUnlhVzFTYVdkb2RBQnlaV1IxWTJWU2FXZG9kQUIxYm5Ob2FXWjBBSFJ5YVcxTVpXWjBBR2x1ZG1Gc2FXUWdiMlptYzJWMEFHbHVkbUZzYVdRZ1lubDBaVTltWm5ObGRBQm5aWFJVYVcxbGVtOXVaVTltWm5ObGRBQnlaWE52YkhacGJtY2dablZ1WTNScGIyNGdZV3h5WldGa2VTQnpaWFFBY0hKdmVIazZJR2x1WTI5dWMybHpkR1Z1ZENCelpYUUFabWx1WkY5cWRXMXdYM1JoY21kbGRBQmxlSEJsWTNScGJtY2dkR0Z5WjJWMEFHbHVkbUZzYVdRZ1pHVnpkSEoxWTNSMWNtbHVaeUIwWVhKblpYUUFjSEp2ZUhrNklHbHVZMjl1YzJsemRHVnVkQ0JuWlhRQVYyVmhhMU5sZEFCamIyNXpkSEoxWTNRQVNsTmZSbkpsWlVGMGIyMVRkSEoxWTNRQWRYTmxJSE4wY21samRBQlNaV1pzWldOMEFISmxhbVZqZEFCdWIzUWdZVzRnUVhONWJtTkhaVzVsY21GMGIzSWdiMkpxWldOMEFHTmhibTV2ZENCamIyNTJaWEowSUhSdklHOWlhbVZqZEFCcGJuWmhiR2xrSUdKeVlXNWtJRzl1SUc5aWFtVmpkQUJ2Y0dWeVlXNWtJQ2R3Y205MGIzUjVjR1VuSUhCeWIzQmxjblI1SUdseklHNXZkQ0JoYmlCdlltcGxZM1FBY21WalpXbDJaWElnYVhNZ2JtOTBJR0Z1SUc5aWFtVmpkQUJwZEdWeVlYUnZjaUJ0ZFhOMElISmxkSFZ5YmlCaGJpQnZZbXBsWTNRQWJtOTBJR0VnUkdGMFpTQnZZbXBsWTNRQWJtOTBJR0VnYjJKcVpXTjBBRXBUVDJKcVpXTjBBR0pwWjJac2IyRjBBSEJoY25ObFJteHZZWFFBWm14aGRBQnViM1JvYVc1bklIUnZJSEpsY0dWaGRBQmpiMjVqWVhRQVkyOWtaVkJ2YVc1MFFYUUFZMmhoY2tGMEFHTm9ZWEpEYjJSbFFYUUFhMlY1Y3dCd2NtOTRlVG9nZEdGeVoyVjBJSEJ5YjNCbGNuUjVJRzExYzNRZ1ltVWdjSEpsYzJWdWRDQnBiaUJ3Y205NGVTQnZkMjVMWlhsekFDQWdabUZ6ZENCaGNuSmhlWE1BWlhod2IzSjBJQ2NsY3ljZ2FXNGdiVzlrZFd4bElDY2xjeWNnYVhNZ1lXMWlhV2QxYjNWekFIQnlhWFpoZEdVZ1kyeGhjM01nWm1sbGJHUWdKeVZ6SnlCaGJISmxZV1I1SUdWNGFYTjBjd0IwYjI4Z2JXRnVlU0JoY21kMWJXVnVkSE1BVkc5dklHMWhibmtnWTJGc2JDQmhjbWQxYldWdWRITUFabUZ6ZEY5aGNuSmhlVjlsYkdWdFpXNTBjd0FnSUdWc1pXMWxiblJ6QUdsdWRtRnNhV1FnYm5WdFltVnlJRzltSUdScFoybDBjd0JpYVc1aGNua2diMkpxWldOMGN3QnBiblpoYkdsa0lIQnliM0JsY25SNUlHRmpZMlZ6Y3dCcWMxOXZjRjlrWldacGJtVmZZMnhoYzNNQVptUXRQbUo1ZEdWZlkyOWtaUzVpZFdaYlpHVm1hVzVsWDJOc1lYTnpYM0J2YzEwZ1BUMGdUMUJmWkdWbWFXNWxYMk5zWVhOekFGOWZaMlYwUTJ4aGMzTUFjMlYwU0c5MWNuTUFaMlYwU0c5MWNuTUFjMlYwVlZSRFNHOTFjbk1BWjJWMFZWUkRTRzkxY25NQVoyVjBUM2R1VUhKdmNHVnlkSGxFWlhOamNtbHdkRzl5Y3dCMGIyOGdiV0Z1ZVNCcGJXSnlhV05oZEdWa0lIRjFZVzUwYVdacFpYSnpBSFZ1YVdOdlpHVmZjSEp2Y0Y5dmNITUFZV052Y3dCbWIzSWdZWGRoYVhRZ2FYTWdiMjVzZVNCMllXeHBaQ0JwYmlCaGMzbHVZMmh5YjI1dmRYTWdablZ1WTNScGIyNXpBRzVsZHk1MFlYSm5aWFFnYjI1c2VTQmhiR3h2ZDJWa0lIZHBkR2hwYmlCbWRXNWpkR2x2Ym5NQVlubDBaV052WkdVZ1puVnVZM1JwYjI1ekFFTWdablZ1WTNScGIyNXpBSEJ5YjNoNU9pQnBibU52Ym5OcGMzUmxiblFnY0hKbGRtVnVkRVY0ZEdWdWMybHZibk1BVTJOeWFYQjBYMFY0ZEdWdWMybHZibk1BWVhSdmJYTUFjSEp2ZUhrNklIQnliM0JsY25ScFpYTWdiWFZ6ZENCaVpTQnpkSEpwYm1keklHOXlJSE41YldKdmJITUFaMlYwVDNkdVVISnZjR1Z5ZEhsVGVXMWliMnh6QUhKbGMyOXNkbVZmYkdGaVpXeHpBRXBUWDBWMllXeFVhR2x6QUhOMGNtbHVaM01BYVc1MllXeHBaQ0JrWlhOamNtbHdkRzl5SUdac1lXZHpBR2x1ZG1Gc2FXUWdjbVZuZFd4aGNpQmxlSEJ5WlhOemFXOXVJR1pzWVdkekFIWmhiSFZsY3dCelpYUk5hVzUxZEdWekFHZGxkRTFwYm5WMFpYTUFjMlYwVlZSRFRXbHVkWFJsY3dCblpYUlZWRU5OYVc1MWRHVnpBSFJ2YnlCdFlXNTVJR05oY0hSMWNtVnpBQ0FnYzJoaGNHVnpBR2RsZEU5M2JsQnliM0JsY25SNVRtRnRaWE1BWjJOZlpuSmxaVjlqZVdOc1pYTUFZV1JrWDJWMllXeGZkbUZ5YVdGaWJHVnpBSEpsYzI5c2RtVmZkbUZ5YVdGaWJHVnpBSFJ2YnlCdFlXNTVJR3h2WTJGc0lIWmhjbWxoWW14bGN3QjBiMjhnYldGdWVTQmpiRzl6ZFhKbElIWmhjbWxoWW14bGN3QmpiMjF3WVdOMFgzQnliM0JsY25ScFpYTUFJQ0J3Y205d1pYSjBhV1Z6QUdSbFptbHVaVkJ5YjNCbGNuUnBaWE1BWlc1MGNtbGxjd0JtY205dFJXNTBjbWxsY3dCMGIyOGdiV0Z1ZVNCeVlXNW5aWE1BYVc1amJIVmtaWE1BYzJWMFRXbHNiR2x6WldOdmJtUnpBR2RsZEUxcGJHeHBjMlZqYjI1a2N3QnpaWFJWVkVOTmFXeHNhWE5sWTI5dVpITUFaMlYwVlZSRFRXbHNiR2x6WldOdmJtUnpBSE5sZEZObFkyOXVaSE1BWjJWMFUyVmpiMjVrY3dCelpYUlZWRU5UWldOdmJtUnpBR2RsZEZWVVExTmxZMjl1WkhNQWFYUmhiR2xqY3dCaFluTUFjSEp2ZUhrNklHbHVZMjl1YzJsemRHVnVkQ0JvWVhNQUpTNHFjd0FnS0NWekFITmxkQ0FsY3dCblpYUWdKWE1BSUNBZ0lHRjBJQ1Z6QUc1dklHOTJaWEpzYjJGa1pXUWdiM0JsY21GMGIzSWdKWE1BYm05MElHRWdKWE1BZFc1emRYQndiM0owWldRZ2EyVjVkMjl5WkRvZ0pYTUFjM1ZpYzNSeUFIQnliM2g1T2lCcGJtTnZibk5wYzNSbGJuUWdaMlYwVDNkdVVISnZjR1Z5ZEhsRVpYTmpjbWx3ZEc5eUFITjFjR1Z5S0NrZ2FYTWdiMjVzZVNCMllXeHBaQ0JwYmlCaElHUmxjbWwyWldRZ1kyeGhjM01nWTI5dWMzUnlkV04wYjNJQWNHRnlaVzUwSUdOc1lYTnpJRzExYzNRZ1ltVWdZMjl1YzNSeWRXTjBiM0lBYm05MElHRWdZMjl1YzNSeWRXTjBiM0lBUVhKeVlYa2dTWFJsY21GMGIzSUFVMlYwSUVsMFpYSmhkRzl5QUUxaGNDQkpkR1Z5WVhSdmNnQlNaV2RGZUhBZ1UzUnlhVzVuSUVsMFpYSmhkRzl5QUc1dmRDQmhiaUJCYzNsdVl5MW1jbTl0TFZONWJtTWdTWFJsY21GMGIzSUFZMkZ1Ym05MElHbHVkbTlyWlNCaElISjFibTVwYm1jZ1oyVnVaWEpoZEc5eUFHNXZkQ0JoSUdkbGJtVnlZWFJ2Y2dCQmMzbHVZMGRsYm1WeVlYUnZjZ0J6ZVc1MFlYZ2daWEp5YjNJQVUzbHVkR0Y0UlhKeWIzSUFSWFpoYkVWeWNtOXlBRWx1ZEdWeWJtRnNSWEp5YjNJQVFXZG5jbVZuWVhSbFJYSnliM0lBVkhsd1pVVnljbTl5QUZKaGJtZGxSWEp5YjNJQVVtVm1aWEpsYm1ObFJYSnliM0lBVlZKSlJYSnliM0lBWm14dmIzSUFabTl1ZEdOdmJHOXlBR0Z1WTJodmNnQm1iM0lBYTJWNVJtOXlBR1Y0Y0dWamRHbHVaeUJ6ZFhKeWIyZGhkR1VnY0dGcGNnQmhJR1JsWTJ4aGNtRjBhVzl1SUdsdUlIUm9aU0JvWldGa0lHOW1JR0VnWm05eUxTVnpJR3h2YjNBZ1kyRnVKM1FnYUdGMlpTQmhiaUJwYm1sMGFXRnNhWHBsY2dBbllYSm5kVzFsYm5Sekp5QnBaR1Z1ZEdsbWFXVnlJR2x6SUc1dmRDQmhiR3h2ZDJWa0lHbHVJR05zWVhOeklHWnBaV3hrSUdsdWFYUnBZV3hwZW1WeUFHbHVkbUZzYVdRZ2JuVnRZbVZ5SUc5bUlHRnlaM1Z0Wlc1MGN5Qm1iM0lnWjJWMGRHVnlJRzl5SUhObGRIUmxjZ0JwYm5aaGJHbGtJSE5sZEhSbGNnQnBiblpoYkdsa0lHZGxkSFJsY2dCbWFXeDBaWElBYldsemMybHVaeUJtYjNKdFlXd2djR0Z5WVcxbGRHVnlBQ0oxYzJVZ2MzUnlhV04wSWlCdWIzUWdZV3hzYjNkbFpDQnBiaUJtZFc1amRHbHZiaUIzYVhSb0lHUmxabUYxYkhRZ2IzSWdaR1Z6ZEhKMVkzUjFjbWx1WnlCd1lYSmhiV1YwWlhJQWFXNTJZV3hwWkNCamFHRnlZV04wWlhJQWRXNWxlSEJsWTNSbFpDQmphR0Z5WVdOMFpYSUFjSEpwZG1GMFpTQmpiR0Z6Y3lCbWFXVnNaQ0JtYjNKaWFXUmtaVzRnWVdaMFpYSWdjM1Z3WlhJQWFXNTJZV3hwWkNCeVpXUmxabWx1YVhScGIyNGdiMllnYkdWNGFXTmhiQ0JwWkdWdWRHbG1hV1Z5QUNkc1pYUW5JR2x6SUc1dmRDQmhJSFpoYkdsa0lHeGxlR2xqWVd3Z2FXUmxiblJwWm1sbGNnQnBiblpoYkdsa0lISmxaR1ZtYVc1cGRHbHZiaUJ2WmlCbmJHOWlZV3dnYVdSbGJuUnBabWxsY2dCNWFXVnNaQ0JwY3lCaElISmxjMlZ5ZG1Wa0lHbGtaVzUwYVdacFpYSUFKeVZ6SnlCcGN5QmhJSEpsYzJWeWRtVmtJR2xrWlc1MGFXWnBaWElBYjNSb1pYSUFZWFJ2YlRGZmFYTmZhVzUwWldkbGNpQW1KaUJoZEc5dE1sOXBjMTlwYm5SbFoyVnlBR05oYm01dmRDQmpiMjUyWlhKMElIUnZJR0pwWjJsdWREb2dibTkwSUdGdUlHbHVkR1ZuWlhJQWFYTkpiblJsWjJWeUFHbHpVMkZtWlVsdWRHVm5aWElBWW5WbVptVnlBRk5vWVhKbFpFRnljbUY1UW5WbVptVnlBR05oYm01dmRDQjFjMlVnYVdSbGJuUnBZMkZzSUVGeWNtRjVRblZtWm1WeUFHTmhibTV2ZENCamIyNTJaWEowSUdKcFoybHVkQ0IwYnlCdWRXMWlaWElBWTJGdWJtOTBJR052Ym5abGNuUWdZbWxuWm14dllYUWdkRzhnYm5WdFltVnlBR05oYm01dmRDQmpiMjUyWlhKMElITjViV0p2YkNCMGJ5QnVkVzFpWlhJQVkyRnVibTkwSUdOdmJuWmxjblFnWW1sblpHVmphVzFoYkNCMGJ5QnVkVzFpWlhJQWJtOTBJR0VnYm5WdFltVnlBR3hwYm1WT2RXMWlaWElBYldGc1ptOXliV1ZrSUhWdWFXTnZaR1VnWTJoaGNnQmpiR1ZoY2dCelpYUlpaV0Z5QUdkbGRGbGxZWElBYzJWMFJuVnNiRmxsWVhJQVoyVjBSblZzYkZsbFlYSUFjMlYwVlZSRFJuVnNiRmxsWVhJQVoyVjBWVlJEUm5Wc2JGbGxZWElBY1NBaFBTQnlBSFZ1Wlhod1pXTjBaV1FnYkdsdVpTQjBaWEp0YVc1aGRHOXlJR2x1SUhKbFoyVjRjQUIxYm1WNGNHVmpkR1ZrSUdWdVpDQnZaaUJ5WldkbGVIQUFVbVZuUlhod0FITjFjQUJwYm5aaGJHbGtJR2R5YjNWd0FIQnZjQUJqYjI1MGFXNTFaU0J0ZFhOMElHSmxJR2x1YzJsa1pTQnNiMjl3QUdKbVgyeHZaMmxqWDI5d0FHNTFiVjlyWlhselgyTnRjQUIxYzJVZ2MzUnlhWEFBYldGd0FHWnNZWFJOWVhBQVYyVmhhMDFoY0FCbGVIQmxZM1JwYm1jZ0ozc25JR0ZtZEdWeUlGeHdBR3h2WnpGd0FHUnBkbWx6YVc5dUlHSjVJSHBsY204QWRXNXJibTkzYmdCcGRHVnlZWFJ2Y2w5amJHOXpaVjl5WlhSMWNtNEFjSEp2YldselpTQnpaV3htSUhKbGMyOXNkWFJwYjI0QWIzVjBJRzltSUcxbGJXOXllU0JwYmlCeVpXZGxlSEFnWlhobFkzVjBhVzl1QUdSbGMyTnlhWEIwYVc5dUFIQnliM2g1T2lCa1pXWnBibVZRY205d1pYSjBlU0JsZUdObGNIUnBiMjRBYW5OZllYTjVibU5mWjJWdVpYSmhkRzl5WDNKbGMyOXNkbVZmWm5WdVkzUnBiMjRBYW5OZlkzSmxZWFJsWDJaMWJtTjBhVzl1QUhObGRDOWhaR1FnYVhNZ2JtOTBJR0VnWm5WdVkzUnBiMjRBY21WMGRYSnVJRzV2ZENCcGJpQmhJR1oxYm1OMGFXOXVBRUZ6ZVc1alIyVnVaWEpoZEc5eVJuVnVZM1JwYjI0QVFYTjVibU5HZFc1amRHbHZiZ0JwYm5aaGJHbGtJRzl3WlhKaGRHbHZiZ0IxYm5OMWNIQnZjblJsWkNCdmNHVnlZWFJwYjI0QVlYZGhhWFFnYVc0Z1pHVm1ZWFZzZENCbGVIQnlaWE56YVc5dUFIbHBaV3hrSUdsdUlHUmxabUYxYkhRZ1pYaHdjbVZ6YzJsdmJnQnBiblpoYkdsa0lHUmxZMmx0WVd3Z1pYTmpZWEJsSUdsdUlISmxaM1ZzWVhJZ1pYaHdjbVZ6YzJsdmJnQmlZV05ySUhKbFptVnlaVzVqWlNCdmRYUWdiMllnY21GdVoyVWdhVzRnY21WbmRXeGhjaUJsZUhCeVpYTnphVzl1QUdsdWRtRnNhV1FnWlhOallYQmxJSE5sY1hWbGJtTmxJR2x1SUhKbFozVnNZWElnWlhod2NtVnpjMmx2YmdCbGVIQmxZM1JsWkNBbmIyWW5JRzl5SUNkcGJpY2dhVzRnWm05eUlHTnZiblJ5YjJ3Z1pYaHdjbVZ6YzJsdmJnQjBiMjhnWTI5dGNHeHBZMkYwWldRZ1pHVnpkSEoxWTNSMWNtbHVaeUJsZUhCeVpYTnphVzl1QUdWNGNHVmpkR1ZrSUNkOUp5QmhablJsY2lCMFpXMXdiR0YwWlNCbGVIQnlaWE56YVc5dUFIUnZVSEpsWTJsemFXOXVBR0Z6YVc0QWFtOXBiZ0J0YVc0QVkyOXdlVmRwZEdocGJnQjBaVzF3YkdGMFpTQnNhWFJsY21Gc0lHTmhibTV2ZENCaGNIQmxZWElnYVc0Z1lXNGdiM0IwYVc5dVlXd2dZMmhoYVc0QVkybHlZM1ZzWVhJZ2NISnZkRzkwZVhCbElHTm9ZV2x1QUdGemMybG5iZ0FoZVMwK2MybG5iZ0JwYzBaeWIzcGxiZ0J0WVhKclgyTm9hV3hrY21WdUFDaHdiM01nS3lCc1pXNHBJRHc5SUdKalgySjFabDlzWlc0QWRXNWxlSEJsWTNSbFpDQmxiR3hwY0hOcGN5QjBiMnRsYmdCMGFHVnVBSE5sZEhSbGNpQnBjeUJtYjNKaWFXUmtaVzRBYm5Wc2JDQnZjaUIxYm1SbFptbHVaV1FnWVhKbElHWnZjbUpwWkdSbGJnQmhkR0Z1QUc1aGJnQnViM1FnWVNCaWIyOXNaV0Z1QUVKdmIyeGxZVzRBWjJOZmMyTmhiZ0JpWVdRZ2JtOXliV0ZzYVhwaGRHbHZiaUJtYjNKdEFFcFRYMDVsZDFONWJXSnZiRVp5YjIxQmRHOXRBR1p5YjIwQWNtRnVaRzl0QUhSeWFXMEFkR1JwZG5KbGJRQm1aR2wyY21WdEFHVmthWFp5WlcwQVkyUnBkbkpsYlFCaVpsOWthWFp5WlcwQWMzRnlkSEpsYlFCcGJYVnNBRzV2ZENCaElITjViV0p2YkFCVGVXMWliMndBVW1WblJYaHdJR1Y0WldNZ2JXVjBhRzlrSUcxMWMzUWdjbVYwZFhKdUlHRnVJRzlpYW1WamRDQnZjaUJ1ZFd4c0FIQmhjbVZ1ZENCd2NtOTBiM1I1Y0dVZ2JYVnpkQ0JpWlNCaGJpQnZZbXBsWTNRZ2IzSWdiblZzYkFCallXNXViM1FnYzJWMElIQnliM0JsY25SNUlDY2xjeWNnYjJZZ2JuVnNiQUJqWVc1dWIzUWdjbVZoWkNCd2NtOXdaWEowZVNBbkpYTW5JRzltSUc1MWJHd0FUblZzYkFCbWFXeHNBRzVsZHlCQmNuSmhlVUoxWm1abGNpQnBjeUIwYjI4Z2MyMWhiR3dBVkhsd1pXUkJjbkpoZVNCc1pXNW5kR2dnYVhNZ2RHOXZJSE50WVd4c0FHTmhiR3dBWkc5MFFXeHNBRzFoZEdOb1FXeHNBSEpsY0d4aFkyVkJiR3dBWTJWcGJBQjFjR1JoZEdWZmJHRmlaV3dBWW1OZlluVm1XM0J2YzEwZ1BUMGdUMUJmYkdGaVpXd0FaWFpoYkFCcGJuWmhiR2xrSUdKcFoybHVkQ0JzYVhSbGNtRnNBR2x1ZG1Gc2FXUWdiblZ0WW1WeUlHeHBkR1Z5WVd3QWJXRnNabTl5YldWa0lHVnpZMkZ3WlNCelpYRjFaVzVqWlNCcGJpQnpkSEpwYm1jZ2JHbDBaWEpoYkFCaVpsOWxlSEJmYVc1MFpYSnVZV3dBWW1aZmJHOW5YMmx1ZEdWeWJtRnNBRXBUWDFObGRGQnliM0JsY25SNVNXNTBaWEp1WVd3QVNsTmZSMlYwVDNkdVVISnZjR1Z5ZEhsT1lXMWxjMGx1ZEdWeWJtRnNBRjlmU2xOZlJYWmhiRWx1ZEdWeWJtRnNBR0pwWjJSbFkybHRZV3dBYm5SMFgyWm1kRjl3WVhKMGFXRnNBSFJ2Ulhod2IyNWxiblJwWVd3QWMyVmhiQUJuYkc5aVlXd0FZbXhwYm1zQVgxOWtZWFJsWDJOc2IyTnJBSE4wWVdOckFHeHlaVjlsZUdWalgySmhZMnQwY21GamF3QnpMVDVwYzE5M1pXRnJBR0ptWDNCdmQxOTFhUUJ6WlhSTmIyNTBhQUJuWlhSTmIyNTBhQUJ6WlhSVlZFTk5iMjUwYUFCblpYUlZWRU5OYjI1MGFBQnBiblpoYkdsa0lHdGxlWGR2Y21RNklIZHBkR2dBYzNSaGNuUnpWMmwwYUFCbGJtUnpWMmwwYUFCd2NtOXdJRDA5SUVwVFgwRlVUMDFmYkdWdVozUm9BR2x1ZG1Gc2FXUWdZWEp5WVhrZ2JHVnVaM1JvQUdsdWRtRnNhV1FnWVhKeVlYa2dZblZtWm1WeUlHeGxibWQwYUFCcGJuWmhiR2xrSUd4bGJtZDBhQUJwYm5aaGJHbGtJR0o1ZEdWTVpXNW5kR2dBZFhObElHMWhkR2dBVFdGMGFBQndkWE5vQUdGamIzTm9BRXBUWDFKbGMybDZaVUYwYjIxSVlYTm9BR0Z6YVc1b0FHRjBZVzVvQUdKeVpXRnJJRzExYzNRZ1ltVWdhVzV6YVdSbElHeHZiM0FnYjNJZ2MzZHBkR05vQUcxaGRHTm9BR05oZEdOb0FITmxZWEpqYUFCbWIzSkZZV05vQUdKbVgyeHZad0JCY25KaGVTQjBiMjhnYkc5dVp3QnpkSEpwYm1jZ2RHOXZJR3h2Ym1jQVFYSnlZWGtnYkc5dklHeHZibWNBYzNWaWMzUnlhVzVuQUdOaGJtNXZkQ0JqYjI1MlpYSjBJSE41YldKdmJDQjBieUJ6ZEhKcGJtY0FkVzVsZUhCbFkzUmxaQ0JsYm1RZ2IyWWdjM1J5YVc1bkFHNXZkQ0JoSUhOMGNtbHVad0JwYm5aaGJHbGtJR05vWVhKaFkzUmxjaUJwYmlCaElFcFRUMDRnYzNSeWFXNW5BSFJ2VTNSeWFXNW5BSFJ2UkdGMFpWTjBjbWx1WndCMGIweHZZMkZzWlVSaGRHVlRkSEpwYm1jQWRHOVVhVzFsVTNSeWFXNW5BSFJ2VEc5allXeGxWR2x0WlZOMGNtbHVad0IwYjB4dlkyRnNaVk4wY21sdVp3QjBiMGROVkZOMGNtbHVad0JLVTFOMGNtbHVad0IwYjBsVFQxTjBjbWx1WndCMGIxVlVRMU4wY21sdVp3QmtkWEJzYVdOaGRHVWdhVzF3YjNKMElHSnBibVJwYm1jQWFXNTJZV3hwWkNCcGJYQnZjblFnWW1sdVpHbHVad0JpYVdjQWNtVm5aWGh3SUcxMWMzUWdhR0YyWlNCMGFHVWdKMmNuSUdac1lXY0FiMllBYVc1bUFHUnBabVlnUFQwZ0tHbHVkRGhmZENsa2FXWm1BR1JwWm1ZZ1BUMGdLR2x1ZERFMlgzUXBaR2xtWmdCb2NtVm1BR2RqWDJSbFkzSmxaZ0JtY21WbFgzWmhjbDl5WldZQWIzQjBhVzFwZW1WZmMyTnZjR1ZmYldGclpWOW5iRzlpWVd4ZmNtVm1BSEpsYzJWMFgzZGxZV3RmY21WbUFHUmxiR1YwWlY5M1pXRnJYM0psWmdCdmNIUnBiV2w2WlY5elkyOXdaVjl0WVd0bFgzSmxaZ0JwYm1SbGVFOW1BR3hoYzNSSmJtUmxlRTltQUhaaGJIVmxUMllBYzJWMFVISnZkRzkwZVhCbFQyWUFaMlYwVUhKdmRHOTBlWEJsVDJZQWFYTlFjbTkwYjNSNWNHVlBaZ0FsTGlwbUFHWnZiblJ6YVhwbEFHSnBibUZ5ZVY5dlltcGxZM1JmYzJsNlpRQnpkSEpmYzJsNlpRQnVaWGRmYzJsNlpTQThQU0J6YUMwK2NISnZjRjl6YVhwbEFHUmxjMk55SUR3Z2NuUXRQbUYwYjIxZmMybDZaUUJoZEc5dElEd2djblF0UG1GMGIyMWZjMmw2WlFCamIyMXdkWFJsWDNOMFlXTnJYM05wZW1VQWIySnFYM05wZW1VQWJpQThJR0oxWmw5emFYcGxBSE5vWVhCbFgzTnBlbVVBYW5OZlpuVnVZMTl3WXpKc2FXNWxYM05wZW1VQWFuTmZablZ1WTE5amIyUmxYM05wZW1VQWJXVnRiM0o1WDNWelpXUmZjMmw2WlFCcWMxOW1kVzVqWDNOcGVtVUFibTl5YldGc2FYcGxBR1p5WldWNlpRQnlaWE52YkhabEFIUnZVSEpwYldsMGFYWmxBSEIxZEY5c2RtRnNkV1VBZFc1cmJtOTNiaUIxYm1samIyUmxJSEJ5YjNCbGNuUjVJSFpoYkhWbEFISmxjM1FnWld4bGJXVnVkQ0JqWVc1dWIzUWdhR0YyWlNCaElHUmxabUYxYkhRZ2RtRnNkV1VBYVc1MllXeHBaQ0J5WlhRZ2RtRnNkV1VBWDE5S1UxOUJkRzl0Vkc5V1lXeDFaUUJmWDNGMWIzUmxBR2x6Um1sdWFYUmxBR1JsYkdWMFpRQmpjbVZoZEdVQWMyVjBSR0YwWlFCblpYUkVZWFJsQUhObGRGVlVRMFJoZEdVQVoyVjBWVlJEUkdGMFpRQkpiblpoYkdsa0lFUmhkR1VBY21WMlpYSnpaUUJ3WVhKelpRQndjbTk0ZVNCd2NtVjJaVzUwUlhoMFpXNXphVzl1Y3lCb1lXNWtiR1Z5SUhKbGRIVnlibVZrSUdaaGJITmxBRkJ5YjIxcGMyVUFkRzlNYjNkbGNrTmhjMlVBZEc5TWIyTmhiR1ZNYjNkbGNrTmhjMlVBZEc5VmNIQmxja05oYzJVQWRHOU1iMk5oYkdWVmNIQmxja05oYzJVQWFXZHViM0psUTJGelpRQnNiMk5oYkdWRGIyMXdZWEpsQUhCeWIzaDVPaUJwYm1OdmJuTnBjM1JsYm5RZ2NISnZkRzkwZVhCbEFIQnliM2g1T2lCaVlXUWdjSEp2ZEc5MGVYQmxBRzV2ZENCaElIQnliM1J2ZEhsd1pRQnBiblpoYkdsa0lHOWlhbVZqZENCMGVYQmxBSFZ1WlhOallYQmxBRzV2Ym1VQWNtVnpkQ0JsYkdWdFpXNTBJRzExYzNRZ1ltVWdkR2hsSUd4aGMzUWdiMjVsQUcxMWJIUnBiR2x1WlFBZ0lIQmpNbXhwYm1VQWMyOXRaUUJLVTE5R2NtVmxVblZ1ZEdsdFpRQktVMUoxYm5ScGJXVUFjMlYwVkdsdFpRQm5aWFJVYVcxbEFITmxkRjl2WW1wbFkzUmZibUZ0WlFCbGVIQmxZM1JwYm1jZ2NISnZjR1Z5ZEhrZ2JtRnRaUUIxYm10dWIzZHVJSFZ1YVdOdlpHVWdjSEp2Y0dWeWRIa2dibUZ0WlFCcGJuWmhiR2xrSUhCeWIzQmxjblI1SUc1aGJXVUFaSFZ3YkdsallYUmxJRjlmY0hKdmRHOWZYeUJ3Y205d1pYSjBlU0J1WVcxbEFHbHVkbUZzYVdRZ2NtVmtaV1pwYm1sMGFXOXVJRzltSUhCaGNtRnRaWFJsY2lCdVlXMWxBR1Y0Y0dWamRHbHVaeUJuY205MWNDQnVZVzFsQUdSMWNHeHBZMkYwWlNCbmNtOTFjQ0J1WVcxbEFHbHVkbUZzYVdRZ1ozSnZkWEFnYm1GdFpRQmtkWEJzYVdOaGRHVWdiR0ZpWld3Z2JtRnRaUUJwYm5aaGJHbGtJR1pwY25OMElHTm9ZWEpoWTNSbGNpQnZaaUJ3Y21sMllYUmxJRzVoYldVQWFXNTJZV3hwWkNCc1pYaHBZMkZzSUhaaGNtbGhZbXhsSUc1aGJXVUFhVzUyWVd4cFpDQnRaWFJvYjJRZ2JtRnRaUUJsZUhCbFkzUnBibWNnWm1sbGJHUWdibUZ0WlFCcGJuWmhiR2xrSUdacFpXeGtJRzVoYldVQVkyeGhjM01nYzNSaGRHVnRaVzUwSUhKbGNYVnBjbVZ6SUdFZ2JtRnRaUUJtYVd4bFRtRnRaUUJqYjIxd2FXeGxBRzlpYW1WamRDQnBjeUJ1YjNRZ1pYaDBaVzV6YVdKc1pRQndjbTk0ZVRvZ2FXNWpiMjV6YVhOMFpXNTBJR2x6UlhoMFpXNXphV0pzWlFCallXNXViM1FnYUdGMlpTQnpaWFIwWlhJdloyVjBkR1Z5SUdGdVpDQjJZV3gxWlNCdmNpQjNjbWwwWVdKc1pRQndjbTl3WlhKMGVTQnBjeUJ1YjNRZ1kyOXVabWxuZFhKaFlteGxBSFpoYkhWbElHbHpJRzV2ZENCcGRHVnlZV0pzWlFCd2NtOXdaWEowZVVselJXNTFiV1Z5WVdKc1pRQnRhWE56YVc1bklHbHVhWFJwWVd4cGVtVnlJR1p2Y2lCamIyNXpkQ0IyWVhKcFlXSnNaUUJzWlhocFkyRnNJSFpoY21saFlteGxBR2x1ZG1Gc2FXUWdjbVZrWldacGJtbDBhVzl1SUc5bUlHRWdkbUZ5YVdGaWJHVUFjbVYyYjJOaFlteGxBSE4wY21sclpRQnRjRjlrYVhadWIzSnRYMnhoY21kbEFHbHVkbUZzYVdRZ1kyeGhjM01nY21GdVoyVUFiV1Z6YzJGblpRQmhjM2x1WTE5bWRXNWpYMlp5WldVQWFXNTJZV3hwWkNCc2RtRnNkV1VnYVc0Z2MzUnlhV04wSUcxdlpHVUFhVzUyWVd4cFpDQjJZWEpwWVdKc1pTQnVZVzFsSUdsdUlITjBjbWxqZENCdGIyUmxBR05oYm01dmRDQmtaV3hsZEdVZ1lTQmthWEpsWTNRZ2NtVm1aWEpsYm1ObElHbHVJSE4wY21samRDQnRiMlJsQUc5amRHRnNJR1Z6WTJGd1pTQnpaWEYxWlc1alpYTWdZWEpsSUc1dmRDQmhiR3h2ZDJWa0lHbHVJSE4wY21samRDQnRiMlJsQUc5amRHRnNJR3hwZEdWeVlXeHpJR0Z5WlNCa1pYQnlaV05oZEdWa0lHbHVJSE4wY21samRDQnRiMlJsQUhWdWFXTnZaR1VBSUNCaWVYUmxZMjlrWlFCS1UwWjFibU4wYVc5dVFubDBaV052WkdVQWMydHBjRjlrWldGa1gyTnZaR1VBYVc1MllXeHBaQ0JoY21kMWJXVnVkQ0J1WVcxbElHbHVJSE4wY21samRDQmpiMlJsQUdsdWRtRnNhV1FnWm5WdVkzUnBiMjRnYm1GdFpTQnBiaUJ6ZEhKcFkzUWdZMjlrWlFCcGJuWmhiR2xrSUhKbFpHVm1hVzVwZEdsdmJpQnZaaUJuYkc5aVlXd2dhV1JsYm5ScFptbGxjaUJwYmlCdGIyUjFiR1VnWTI5a1pRQnBiWEJ2Y25RdWJXVjBZU0J2Ym14NUlIWmhiR2xrSUdsdUlHMXZaSFZzWlNCamIyUmxBR1p5YjIxRGFHRnlRMjlrWlFCcGJuWmhiR2xrSUdadmNpQnBiaTl2WmlCc1pXWjBJR2hoYm1RdGMybGtaUUJwYm5aaGJHbGtJR0Z6YzJsbmJtMWxiblFnYkdWbWRDMW9ZVzVrSUhOcFpHVUFjbVZrZFdObEFITnZkWEpqWlFBbmRHaHBjeWNnWTJGdUlHSmxJR2x1YVhScFlXeHBlbVZrSUc5dWJIa2diMjVqWlFCd2NtOXdaWEowZVNCamIyNXpkSEoxWTNSdmNpQmhjSEJsWVhKeklHMXZjbVVnZEdoaGJpQnZibU5sQUdsdWRtRnNhV1FnVlZSR0xUZ2djMlZ4ZFdWdVkyVUFZMmx5WTNWc1lYSWdjbVZtWlhKbGJtTmxBSE5zYVdObEFITndiR2xqWlFCeVlXTmxBSEpsY0d4aFkyVUFKU3N1S21VQWRXNWxlSEJsWTNSbFpDQW5ZWGRoYVhRbklHdGxlWGR2Y21RQWRXNWxlSEJsWTNSbFpDQW5lV2xsYkdRbklHdGxlWGR2Y21RQWJXRndYMlJsWTNKbFpsOXlaV052Y21RQWFYUmxjbUYwYjNJZ1pHOWxjeUJ1YjNRZ2FHRjJaU0JoSUhSb2NtOTNJRzFsZEdodlpBQnZZbXBsWTNRZ2JtVmxaSE1nZEc5SlUwOVRkSEpwYm1jZ2JXVjBhRzlrQUNkemRYQmxjaWNnYVhNZ2IyNXNlU0IyWVd4cFpDQnBiaUJoSUcxbGRHaHZaQUJtY205MWJtUUFYMTlpWmw5eWIzVnVaQUJpY21WaGF5OWpiMjUwYVc1MVpTQnNZV0psYkNCdWIzUWdabTkxYm1RQWIzVjBJRzltSUdKdmRXNWtBR1pwYm1RQVltbHVaQUJwYm5aaGJHbGtJR2x1WkdWNElHWnZjaUJoY0hCbGJtUUFaWGgwY21GdVpXOTFjeUJqYUdGeVlXTjBaWEp6SUdGMElIUm9aU0JsYm1RQWRXNWxlSEJsWTNSbFpDQmtZWFJoSUdGMElIUm9aU0JsYm1RQWRXNWxlSEJsWTNSbFpDQmxibVFBYVc1MllXeHBaQ0JwYm1OeVpXMWxiblF2WkdWamNtVnRaVzUwSUc5d1pYSmhibVFBYVc1MllXeHBaQ0FuYVc1emRHRnVZMlZ2WmljZ2NtbG5hSFFnYjNCbGNtRnVaQUJwYm5aaGJHbGtJQ2RwYmljZ2IzQmxjbUZ1WkFCMGNtbHRSVzVrQUhCaFpFVnVaQUJpYjJ4a0FDVnNiR1FBWjJOZlpHVmpjbVZtWDJOb2FXeGtBSEpsYzI5c2RtVmZjMk52Y0dWZmNISnBkbUYwWlY5bWFXVnNaQUJqWVc1dWIzUWdaR1ZzWlhSbElHRWdjSEpwZG1GMFpTQmpiR0Z6Y3lCbWFXVnNaQUJsZUhCbFkzUnBibWNnUEdKeVlXNWtQaUJ3Y21sMllYUmxJR1pwWld4a0FDVnpJR2x6SUc1dmRDQnBibWwwYVdGc2FYcGxaQUJtYVhobFpBQjBiMFpwZUdWa0FITmxkRjl2WW1wbFkzUmZibUZ0WlY5amIyMXdkWFJsWkFCeVpXZGxlQ0J1YjNRZ2MzVndjRzl5ZEdWa0FHVjJZV3dnYVhNZ2JtOTBJSE4xY0hCdmNuUmxaQUJTWldkRmVIQWdZWEpsSUc1dmRDQnpkWEJ3YjNKMFpXUUFhVzUwWlhKeWRYQjBaV1FBSlhNZ2IySnFaV04wSUdWNGNHVmpkR1ZrQUdsa1pXNTBhV1pwWlhJZ1pYaHdaV04wWldRQVlubDBaV052WkdVZ1puVnVZM1JwYjI0Z1pYaHdaV04wWldRQWMzUnlhVzVuSUdWNGNHVmpkR1ZrQUdaeWIyMGdZMnhoZFhObElHVjRjR1ZqZEdWa0FHWjFibU4wYVc5dUlHNWhiV1VnWlhod1pXTjBaV1FBZG1GeWFXRmliR1VnYm1GdFpTQmxlSEJsWTNSbFpBQnRaWFJoSUdWNGNHVmpkR1ZrQUhKbGFtVmpkR1ZrQUcxbGJXOXllU0JoYkd4dlkyRjBaV1FBYldWdGIzSjVJSFZ6WldRQVpHVnlhWFpsWkNCamJHRnpjeUJqYjI1emRISjFZM1J2Y2lCdGRYTjBJSEpsZEhWeWJpQmhiaUJ2WW1wbFkzUWdiM0lnZFc1a1pXWnBibVZrQUdOaGJtNXZkQ0J6WlhRZ2NISnZjR1Z5ZEhrZ0p5VnpKeUJ2WmlCMWJtUmxabWx1WldRQVkyRnVibTkwSUhKbFlXUWdjSEp2Y0dWeWRIa2dKeVZ6SnlCdlppQjFibVJsWm1sdVpXUUFabXhoWjNNZ2JYVnpkQ0JpWlNCMWJtUmxabWx1WldRQVZXNWtaV1pwYm1Wa0FIQnlhWFpoZEdVZ1kyeGhjM01nWm1sbGJHUWdhWE1nWVd4eVpXRmtlU0JrWldacGJtVmtBQ2NsY3ljZ2FYTWdibTkwSUdSbFptbHVaV1FBWjNKdmRYQWdibUZ0WlNCdWIzUWdaR1ZtYVc1bFpBQnZjR1Z5WVhSdmNpQWxjem9nYm04Z1puVnVZM1JwYjI0Z1pHVm1hVzVsWkFCaGJHeFRaWFIwYkdWa0FHWjFiR1pwYkd4bFpBQmpZVzV1YjNRZ1ltVWdZMkZzYkdWa0FHbHpVMlZoYkdWa0FDRnphQzArYVhOZmFHRnphR1ZrQUhaaGNsOXlaV1l0UG1selgyUmxkR0ZqYUdWa0FFRnljbUY1UW5WbVptVnlJR2x6SUdSbGRHRmphR1ZrQUdGa1pBQWxLekEzWkFBbE1EUmtBQ1V3TW1RbE1ESmtBQ1V3TW1RdkpUQXlaQzhsTUNwa0FDVXVNM01nSlM0emN5QWxNREprSUNVd0ttUUFPaVZrQUdsdWRtRnNhV1FnZEdoeWIzY2dkbUZ5SUhSNWNHVWdKV1FBYzJNQWFuTmZaR1ZtWDIxaGJHeHZZd0IwY25WdVl3Qm5Zd0JsZUdWakFHSm1YMmx1ZEdWblpYSmZkRzlmY21Ga2FYaGZjbVZqQUhGMWFXTnJhbk12Y1hWcFkydHFjeTVqQUhGMWFXTnJhbk12YkdsaWNtVm5aWGh3TG1NQWNYVnBZMnRxY3k5c2FXSmlaaTVqQUhGMWFXTnJhbk12YkdsaWRXNXBZMjlrWlM1akFITjFZZ0J3Y205dGFYTmxYM0psWVdOMGFXOXVYMnB2WWdCcWMxOXdjbTl0YVhObFgzSmxjMjlzZG1WZmRHaGxibUZpYkdWZmFtOWlBSElnSVQwZ1lTQW1KaUJ5SUNFOUlHSUFjU0FoUFNCaElDWW1JSEVnSVQwZ1lnQnlkMkVBY2lBaFBTQmhBRjlmYkc5dmEzVndVMlYwZEdWeVgxOEFYMTlrWldacGJtVlRaWFIwWlhKZlh3QmZYMnh2YjJ0MWNFZGxkSFJsY2w5ZkFGOWZaR1ZtYVc1bFIyVjBkR1Z5WDE4QVgxOXdjbTkwYjE5ZkFGdFRlVzFpYjJ3dWMzQnNhWFJkQUZ0VGVXMWliMnd1YzNCbFkybGxjMTBBVzFONWJXSnZiQzVwZEdWeVlYUnZjbDBBVzFONWJXSnZiQzVoYzNsdVkwbDBaWEpoZEc5eVhRQmJVM2x0WW05c0xtMWhkR05vUVd4c1hRQmJVM2x0WW05c0xtMWhkR05vWFFCYlUzbHRZbTlzTG5ObFlYSmphRjBBVzFONWJXSnZiQzUwYjFOMGNtbHVaMVJoWjEwQVcxTjViV0p2YkM1MGIxQnlhVzFwZEdsMlpWMEFXM1Z1YzNWd2NHOXlkR1ZrSUhSNWNHVmRBRnRtZFc1amRHbHZiaUJpZVhSbFkyOWtaVjBBVzFONWJXSnZiQzVvWVhOSmJuTjBZVzVqWlYwQVcxTjViV0p2YkM1eVpYQnNZV05sWFFCYkFDVXdNbVE2SlRBeVpEb2xNREprTGlVd00yUmFBRkJQVTBsVVNWWkZYMGxPUmtsT1NWUlpBRTVGUjBGVVNWWkZYMGxPUmtsT1NWUlpBSEF0UG1Oc1lYTnpYMmxrSUQwOUlFcFRYME5NUVZOVFgwRlNVa0ZaQUhOMFlXTnJYMnhsYmlBOElGQlBVRjlUVkVGRFMxOU1SVTVmVFVGWUFDMGxNREprTFNVd01tUlVBRXBUWDBGMGIyMUhaWFJUZEhKU1ZBQnZjR052WkdVZ1BDQlNSVTlRWDBOUFZVNVVBRUpaVkVWVFgxQkZVbDlGVEVWTlJVNVVBQ1V3TW1RNkpUQXlaRG9sTURKa0lFZE5WQUJLVTE5V1FVeFZSVjlIUlZSZlZFRkhLSE5tTFQ1amRYSmZablZ1WXlrZ1BUMGdTbE5mVkVGSFgwOUNTa1ZEVkFCMllYSmZhMmx1WkNBOVBTQktVMTlXUVZKZlVGSkpWa0ZVUlY5VFJWUlVSVklBVFVGWVgxTkJSa1ZmU1U1VVJVZEZVZ0JOU1U1ZlUwRkdSVjlKVGxSRlIwVlNBR0Z6VldsdWRFNEFZWE5KYm5ST0FHbHpUbUZPQUVSaGRHVWdkbUZzZFdVZ2FYTWdUbUZPQUhSdlNsTlBUZ0JGVUZOSlRFOU9BRTVCVGdBbE1ESmtPaVV3TW1RNkpUQXlaQ0FsWTAwQWN5MCtiR0ZpWld4ZmMyeHZkSE5iYkdGaVpXeGRMbVpwY25OMFgzSmxiRzlqSUQwOUlFNVZURXdBYkdGaVpXeGZjMnh2ZEhOYmFWMHVabWx5YzNSZmNtVnNiMk1nUFQwZ1RsVk1UQUJ3Y25NZ0lUMGdUbFZNVEFCelppMCtZM1Z5WDNOd0lDRTlJRTVWVEV3QWMyWWdJVDBnVGxWTVRBQnRjakVnSVQwZ1RsVk1UQUIyWVhKZmEybHVaQ0FoUFNCS1UxOVdRVkpmVGs5U1RVRk1BR0l0UG1aMWJtTmZhMmx1WkNBOVBTQktVMTlHVlU1RFgwNVBVazFCVEFCbGJtTnZaR1ZWVWtrQVpHVmpiMlJsVlZKSkFGQkpBSE53WldOcFlXd2dQVDBnVUZWVVgweFdRVXhWUlY5T1QwdEZSVkFnZkh3Z2MzQmxZMmxoYkNBOVBTQlFWVlJmVEZaQlRGVkZYMDVQUzBWRlVGOUVSVkJVU0FCekxUNXpkR0YwWlNBOVBTQktVMTlCVTFsT1ExOUhSVTVGVWtGVVQxSmZVMVJCVkVWZlJWaEZRMVZVU1U1SEFIQnlaV014SUNFOUlFSkdYMUJTUlVOZlNVNUdBREF4TWpNME5UWTNPRGxCUWtORVJVWUFVMGxhUlFCTlFWaGZWa0ZNVlVVQVRVbE9YMVpCVEZWRkFFNUJUVVVBWlhaaGJGOTBlWEJsSUQwOUlFcFRYMFZXUVV4ZlZGbFFSVjlIVEU5Q1FVd2dmSHdnWlhaaGJGOTBlWEJsSUQwOUlFcFRYMFZXUVV4ZlZGbFFSVjlOVDBSVlRFVUFjQzArWjJOZmIySnFYM1I1Y0dVZ1BUMGdTbE5mUjBOZlQwSktYMVJaVUVWZlNsTmZUMEpLUlVOVUlIeDhJSEF0UG1kalgyOWlhbDkwZVhCbElEMDlJRXBUWDBkRFgwOUNTbDlVV1ZCRlgwWlZUa05VU1U5T1gwSlpWRVZEVDBSRkFFeFBSekpGQUV4UFJ6RXdSUUJ6TFQ1emRHRjBaU0E5UFNCS1UxOUJVMWxPUTE5SFJVNUZVa0ZVVDFKZlUxUkJWRVZmUVZkQlNWUkpUa2RmVWtWVVZWSk9JSHg4SUhNdFBuTjBZWFJsSUQwOUlFcFRYMEZUV1U1RFgwZEZUa1ZTUVZSUFVsOVRWRUZVUlY5RFQwMVFURVZVUlVRQVZWUkRBRHhwYm5CMWRENEFQSE5sZEQ0QVBHRnViMjU1Ylc5MWN6NEFQR1IxYlhBK0FEeHVkV3hzUGdCaWFXZHBiblFnYjNCbGNtRnVaSE1nWVhKbElHWnZjbUpwWkdSbGJpQm1iM0lnUGo0K0FDWnhkVzkwT3dCelpYUlZhVzUwT0FCblpYUlZhVzUwT0FCelpYUkpiblE0QUdkbGRFbHVkRGdBYldGc1ptOXliV1ZrSUZWVVJpMDRBSEpoWkdsNElHMTFjM1FnWW1VZ1ltVjBkMlZsYmlBeUlHRnVaQ0F6TmdCelpYUlZhVzUwTVRZQVoyVjBWV2x1ZERFMkFITmxkRWx1ZERFMkFHZGxkRWx1ZERFMkFHRnlaMk1nUFQwZ05RQnpaWFJDYVdkVmFXNTBOalFBWjJWMFFtbG5WV2x1ZERZMEFITmxkRUpwWjBsdWREWTBBR2RsZEVKcFowbHVkRFkwQUhObGRFWnNiMkYwTmpRQVoyVjBSbXh2WVhRMk5BQmhjbWRqSUQwOUlETUFZWFJoYmpJQWJHOW5NZ0JtYkc5dmNreHZaeklBVTFGU1ZERmZNZ0JUVVZKVU1nQk1UaklBWTJ4Nk16SUFjMlYwVldsdWRETXlBR2RsZEZWcGJuUXpNZ0J6WlhSSmJuUXpNZ0JuWlhSSmJuUXpNZ0J6WlhSR2JHOWhkRE15QUdkbGRFWnNiMkYwTXpJQWMzUmhZMnRmYkdWdUlENDlJRElBU2xOZlFYUnZiVWx6VG5WdFpYSnBZMGx1WkdWNE1RQnFjMTltWTNaME1RQktVMTlEYjIxd1lXTjBRbWxuU1c1ME1RQmxlSEJ0TVFCeUlDRTlJR0V4SUNZbUlISWdJVDBnWWpFQWJITXRQbUZrWkhJZ1BUMGdMVEVBYm5FZ1BqMGdNUUJ6ZEdGamExOXNaVzRnUGowZ01RQndMVDVvWldGa1pYSXVjbVZtWDJOdmRXNTBJRDA5SURFQWNDMCtjMmhoY0dVdFBtaGxZV1JsY2k1eVpXWmZZMjkxYm5RZ1BUMGdNUUJ6ZEdGamExOXNaVzRnUFQwZ01RQnFjMTltY21WbFgzTm9ZWEJsTUFCc2IyY3hNQUJNVGpFd0FIQXRQbkpsWmw5amIzVnVkQ0ErSURBQWRtRnlYM0psWmkwK2FHVmhaR1Z5TG5KbFpsOWpiM1Z1ZENBK0lEQUFjM1JoWTJ0ZmMybDZaU0ErSURBQVkzQnZiMnhmYVdSNElENDlJREFBY25RdFBtRjBiMjFmWTI5MWJuUWdQajBnTUFCc2N5MCtjbVZtWDJOdmRXNTBJRDQ5SURBQWN5MCthWE5mWlhaaGJDQjhmQ0J6TFQ1amJHOXpkWEpsWDNaaGNsOWpiM1Z1ZENBOVBTQXdBSEF0UG5KbFpsOWpiM1Z1ZENBOVBTQXdBR04wZUMwK2FHVmhaR1Z5TG5KbFpsOWpiM1Z1ZENBOVBTQXdBSE5vTFQ1b1pXRmtaWEl1Y21WbVgyTnZkVzUwSUQwOUlEQUFjQzArYldGeWF5QTlQU0F3QUNodU1pQWxJSE4wY21sd1gyeGxiaWtnUFQwZ01BQW9jSEl0UG5VdWFXNXBkQzV5WldGc2JWOWhibVJmYVdRZ0ppQXpLU0E5UFNBd0FDaHVaWGRmYUdGemFGOXphWHBsSUNZZ0tHNWxkMTlvWVhOb1gzTnBlbVVnTFNBeEtTa2dQVDBnTUFCcElDRTlJREFBYzJsNlpTQWhQU0F3QUY0a1hDNHFLejhvS1Z0ZGUzMThMd0E4THdBd0xnQnRhWE56YVc1bklHSnBibVJwYm1jZ2NHRjBkR1Z5Ymk0dUxnQmlhV2RwYm5RZ1lYSm5kVzFsYm5RZ2QybDBhQ0IxYm1GeWVTQXJBR0Z6ZVc1aklHWjFibU4wYVc5dUlDb0FDbjBwQUd4cGMzUmZaVzF3ZEhrb0puSjBMVDVuWTE5dlltcGZiR2x6ZENrQWFpQTlQU0FvYzJndFBuQnliM0JmWTI5MWJuUWdMU0J6YUMwK1pHVnNaWFJsWkY5d2NtOXdYMk52ZFc1MEtRQktVMTlKYzFWdVpHVm1hVzVsWkNobWRXNWpYM0psZENrQUlWOWZTbE5mUVhSdmJVbHpWR0ZuWjJWa1NXNTBLR1JsYzJOeUtRQWhZWFJ2YlY5cGMxOW1jbVZsS0hBcEFDaHVkV3hzS1FBZ0tHNWhkR2wyWlNrQWFuTmZZMnhoYzNOZmFHRnpYMko1ZEdWamIyUmxLSEF0UG1Oc1lYTnpYMmxrS1FCMWJtTnZibk5wYzNSbGJuUWdjM1JoWTJzZ2MybDZaVG9nSldRZ0pXUWdLSEJqUFNWa0tRQmllWFJsWTI5a1pTQmlkV1ptWlhJZ2IzWmxjbVpzYjNjZ0tHOXdQU1ZrTENCd1l6MGxaQ2tBYzNSaFkyc2diM1psY21ac2IzY2dLRzl3UFNWa0xDQndZejBsWkNrQWMzUmhZMnNnZFc1a1pYSm1iRzkzSUNodmNEMGxaQ3dnY0dNOUpXUXBBR2x1ZG1Gc2FXUWdiM0JqYjJSbElDaHZjRDBsWkN3Z2NHTTlKV1FwQUNnL09pa0FibThnWm5WdVkzUnBiMjRnWm1sc1pXNWhiV1VnWm05eUlHbHRjRzl5ZENncEFDMWZMaUYrS2ljb0tRQWdZVzV2Ym5sdGIzVnpLQUJUZVcxaWIyd29BR1Y0Y0dWamRHbHVaeUFuZlNjQVkyeGhjM01nWTI5dWMzUnlkV04wYjNKeklHMTFjM1FnWW1VZ2FXNTJiMnRsWkNCM2FYUm9JQ2R1WlhjbkFHVjRjR1ZqZEdsdVp5QW5ZWE1uQUhWdVpYaHdaV04wWldRZ2RHOXJaVzRnYVc0Z1pYaHdjbVZ6YzJsdmJqb2dKeVV1S25NbkFIVnVaWGh3WldOMFpXUWdkRzlyWlc0NklDY2xMaXB6SndCeVpXUmxZMnhoY21GMGFXOXVJRzltSUNjbGN5Y0FaSFZ3YkdsallYUmxJR1Y0Y0c5eWRHVmtJRzVoYldVZ0p5VnpKd0JqYVhKamRXeGhjaUJ5WldabGNtVnVZMlVnZDJobGJpQnNiMjlyYVc1bklHWnZjaUJsZUhCdmNuUWdKeVZ6SnlCcGJpQnRiMlIxYkdVZ0p5VnpKd0JEYjNWc1pDQnViM1FnWm1sdVpDQmxlSEJ2Y25RZ0p5VnpKeUJwYmlCdGIyUjFiR1VnSnlWekp3QmpiM1ZzWkNCdWIzUWdiRzloWkNCdGIyUjFiR1VnSnlWekp3QmpZVzV1YjNRZ1pHVm1hVzVsSUhaaGNtbGhZbXhsSUNjbGN5Y0FkVzVrWldacGJtVmtJSEJ5YVhaaGRHVWdabWxsYkdRZ0p5VnpKd0IxYm5OMWNIQnZjblJsWkNCeVpXWmxjbVZ1WTJVZ2RHOGdKM04xY0dWeUp3QnBiblpoYkdsa0lIVnpaU0J2WmlBbmMzVndaWEluQUNkbWIzSWdZWGRoYVhRbklHeHZiM0FnYzJodmRXeGtJR0psSUhWelpXUWdkMmwwYUNBbmIyWW5BR1Y0Y0dWamRHbHVaeUFuSldNbkFIVnVjR0Z5Wlc1MGFHVnphWHBsWkNCMWJtRnllU0JsZUhCeVpYTnphVzl1SUdOaGJpZDBJR0Z3Y0dWaGNpQnZiaUIwYUdVZ2JHVm1kQzFvWVc1a0lITnBaR1VnYjJZZ0p5b3FKd0JwYm5aaGJHbGtJSFZ6WlNCdlppQW5hVzF3YjNKMEtDa25BR1Y0Y0dWamRHbHVaeUFsSlFBN0x6ODZRQ1k5S3lRc0l3QTlJZ0J6WlhRZ0FHZGxkQ0FBVzI5aWFtVmpkQ0FBWVhONWJtTWdablZ1WTNScGIyNGdBR0p2ZFc1a0lBQWxMak56TENBbE1ESmtJQ1V1TTNNZ0pUQXFaQ0FBWVhONWJtTWdBRG9nQUNBZ0lDQWdJQ0FnSUNBQUNpa2dld29BQ2twVFQySnFaV04wSUdOc1lYTnpaWE1LQUNVdE1qQnpJQ1U0Y3lBbE9ITUtBQ0FnSlRWa0lDQWxNaTR3WkNBbGN3b0FJQ0FsTTNVZ0t5QWxMVEoxSUNBbGN3b0FJQ0J0WVd4c2IyTmZkWE5oWW14bFgzTnBlbVVnZFc1aGRtRnBiR0ZpYkdVS0FDVXRNakJ6SUNVNGJHeGtDZ0FsTFRJd2N5QWxPR3hzWkNBbE9HeHNaQW9BWDE5S1UxOUdjbVZsVm1Gc2RXVTZJSFZ1YTI1dmQyNGdkR0ZuUFNWa0NnQWxMVEl3Y3lBbE9HeHNaQ0FsT0d4c1pDQWdLQ1V3TGpGbUlIQmxjaUJtWVhOMElHRnljbUY1S1FvQUpTMHlNSE1nSlRoc2JHUWdKVGhzYkdRZ0lDZ2xNQzR4WmlCd1pYSWdiMkpxWldOMEtRb0FKUzB5TUhNZ0pUaHNiR1FnSlRoc2JHUWdJQ2dsTUM0eFppQndaWElnWm5WdVkzUnBiMjRwQ2dBbExUSXdjeUFsT0d4c1pDQWxPR3hzWkNBZ0tDVXdMakZtSUhCbGNpQmhkRzl0S1FvQUpTMHlNSE1nSlRoc2JHUWdKVGhzYkdRZ0lDZ2xNQzR4WmlCd1pYSWdZbXh2WTJzcENnQWxMVEl3Y3lBbE9HeHNaQ0FsT0d4c1pDQWdLQ1ZrSUc5MlpYSm9aV0ZrTENBbE1DNHhaaUJoZG1WeVlXZGxJSE5zWVdOcktRb0FKUzB5TUhNZ0pUaHNiR1FnSlRoc2JHUWdJQ2dsTUM0eFppQndaWElnYzNSeWFXNW5LUW9BSlMweU1ITWdKVGhzYkdRZ0pUaHNiR1FnSUNnbE1DNHhaaUJ3WlhJZ2MyaGhjR1VwQ2dCUmRXbGphMHBUSUcxbGJXOXllU0IxYzJGblpTQXRMU0JDYVdkT2RXMGdNakF5TVMwd015MHlOeUIyWlhKemFXOXVMQ0FsWkMxaWFYUXNJRzFoYkd4dll5QnNhVzFwZERvZ0pXeHNaQW9LQUFBQUFId3BBQURMTFFBQTZpZ0FBT29vQUFEcUtBQUE2aWdBQU9vb0FBRHFLQUFBNmlnQUFPb29BQURGR0FBQXJEd0FBS3c4QUVHUW53RUxBWklBUVp5ZkFRc05rd0FBQUdVQUFBQm1BQUFBbEFCQnRKOEJDejJWQUFBQVp3QUFBR2dBQUFDV0FBQUFad0FBQUdnQUFBQ1hBQUFBWndBQUFHZ0FBQUNZQUFBQVp3QUFBR2dBQUFDWkFBQUFaUUFBQUdZQUFBQ1pBRUg4bndFTERad0FBQUJuQUFBQWFBQUFBSklBUVpTZ0FRdXRBNTBBQUFCcEFBQUFhZ0FBQUowQUFBQnJBQUFBYkFBQUFKMEFBQUJ0QUFBQWJnQUFBSjBBQUFCdkFBQUFjQUFBQUo0QUFBQnJBQUFBYkFBQUFKOEFBQUJ4QUFBQWNnQUFBS0FBQUFCekFBQUFBQUFBQUtFQUFBQjBBQUFBQUFBQUFLSUFBQUIwQUFBQUFBQUFBS01BQUFCMUFBQUFkZ0FBQUtRQUFBQjFBQUFBZGdBQUFLVUFBQUIxQUFBQWRnQUFBS1lBQUFCMUFBQUFkZ0FBQUtjQUFBQjFBQUFBZGdBQUFLZ0FBQUIxQUFBQWRnQUFBS2tBQUFCMUFBQUFkZ0FBQUtvQUFBQjFBQUFBZGdBQUFLc0FBQUIxQUFBQWRnQUFBS3dBQUFCMUFBQUFkZ0FBQUswQUFBQjFBQUFBZGdBQUFLNEFBQUIxQUFBQWRnQUFBSzhBQUFCbkFBQUFhQUFBQUxBQUFBQm5BQUFBYUFBQUFMRUFBQUIzQUFBQUFBQUFBTElBQUFCbkFBQUFhQUFBQUxNQUFBQjRBQUFBZVFBQUFMVUFBQUI2QUFBQWV3QUFBTFlBQUFCNkFBQUFld0FBQUxjQUFBQjZBQUFBZXdBQUFMZ0FBQUI2QUFBQWV3QUFBTGtBQUFCOEFBQUFmUUFBQUxvQUFBQjhBQUFBZlFBQUFMc0FBQUIrQUFBQWZ3QUFBTHdBQUFCK0FBQUFmd0FBQUwwQUFBQ0FBQUFBZ1FBQUFMNEFBQUNDQUFBQWd3QkIwS01CQ3dHRUFFSGdvd0VMRFlVQUFBQUFBQUFBaGdBQUFJY0FRWXlrQVFzQmlBQkJtS1FCQ3dtSkFBQUFpZ0FBQUlzQVFiQ2tBUXZWQXJNeUFBQndBUUFBdkJJQUFBZ0JBQURNR0FBQU1BQUFBRFl1QUFBUUFBQUF1ellBQUZnQUFBQ1NBQUFBakFBQUFJMEFBQUNPQUFBQWp3QUFBSkFBQUFDUkFBQUFrZ0FBQUpNQUFBQ1VBQUFBTUdJQUFQQmlBQUNnWXdBQThHTUFBREJrQUFCUVpBQUFEQXNGQkFJQ0FBREFBQUFBbFFBQUFKWUFBQURCQUFBQWx3QUFBSmdBQUFEQ0FBQUFsd0FBQUpnQUFBRERBQUFBYXdBQUFHd0FBQURFQUFBQW1RQUFBSm9BQUFERkFBQUFtUUFBQUpvQUFBQXZBQUFBbXdBQUFKd0FBQURHQUFBQWF3QUFBR3dBQUFESEFBQUFuUUFBQUo0QUFBQUFBQUFBN2g4QUFCOGdBQUFxSUFBQTRoOEFBQlVnQUFBNUlBQUErQjhBQUFZZ0FBQmpiM0I1VjJsMGFHbHVBR1Z1ZEhKcFpYTUFabWxzYkFCbWFXNWtBR1pwYm1SSmJtUmxlQUJtYkdGMEFHWnNZWFJOWVhBQWFXNWpiSFZrWlhNQWEyVjVjd0IyWVd4MVpYTUFBQUFBQUFFQkFnSURBd0lEQUVHUXB3RUwzeEJ1ZFd4c0FHWmhiSE5sQUhSeWRXVUFhV1lBWld4elpRQnlaWFIxY200QWRtRnlBSFJvYVhNQVpHVnNaWFJsQUhadmFXUUFkSGx3Wlc5bUFHNWxkd0JwYmdCcGJuTjBZVzVqWlc5bUFHUnZBSGRvYVd4bEFHWnZjZ0JpY21WaGF3QmpiMjUwYVc1MVpRQnpkMmwwWTJnQVkyRnpaUUJrWldaaGRXeDBBSFJvY205M0FIUnllUUJqWVhSamFBQm1hVzVoYkd4NUFHWjFibU4wYVc5dUFHUmxZblZuWjJWeUFIZHBkR2dBWTJ4aGMzTUFZMjl1YzNRQVpXNTFiUUJsZUhCdmNuUUFaWGgwWlc1a2N3QnBiWEJ2Y25RQWMzVndaWElBYVcxd2JHVnRaVzUwY3dCcGJuUmxjbVpoWTJVQWJHVjBBSEJoWTJ0aFoyVUFjSEpwZG1GMFpRQndjbTkwWldOMFpXUUFjSFZpYkdsakFITjBZWFJwWXdCNWFXVnNaQUJoZDJGcGRBQUFiR1Z1WjNSb0FHWnBiR1ZPWVcxbEFHeHBibVZPZFcxaVpYSUFiV1Z6YzJGblpRQmxjbkp2Y25NQWMzUmhZMnNBYm1GdFpRQjBiMU4wY21sdVp3QjBiMHh2WTJGc1pWTjBjbWx1WndCMllXeDFaVTltQUdWMllXd0FjSEp2ZEc5MGVYQmxBR052Ym5OMGNuVmpkRzl5QUdOdmJtWnBaM1Z5WVdKc1pRQjNjbWwwWVdKc1pRQmxiblZ0WlhKaFlteGxBSFpoYkhWbEFHZGxkQUJ6WlhRQWIyWUFYMTl3Y205MGIxOWZBSFZ1WkdWbWFXNWxaQUJ1ZFcxaVpYSUFZbTl2YkdWaGJnQnpkSEpwYm1jQWIySnFaV04wQUhONWJXSnZiQUJwYm5SbFoyVnlBSFZ1YTI1dmQyNEFZWEpuZFcxbGJuUnpBR05oYkd4bFpRQmpZV3hzWlhJQVBHVjJZV3crQUR4eVpYUStBRHgyWVhJK0FEeGhjbWRmZG1GeVBnQThkMmwwYUQ0QWJHRnpkRWx1WkdWNEFIUmhjbWRsZEFCcGJtUmxlQUJwYm5CMWRBQmtaV1pwYm1WUWNtOXdaWEowYVdWekFHRndjR3g1QUdwdmFXNEFZMjl1WTJGMEFITndiR2wwQUdOdmJuTjBjblZqZEFCblpYUlFjbTkwYjNSNWNHVlBaZ0J6WlhSUWNtOTBiM1I1Y0dWUFpnQnBjMFY0ZEdWdWMybGliR1VBY0hKbGRtVnVkRVY0ZEdWdWMybHZibk1BYUdGekFHUmxiR1YwWlZCeWIzQmxjblI1QUdSbFptbHVaVkJ5YjNCbGNuUjVBR2RsZEU5M2JsQnliM0JsY25SNVJHVnpZM0pwY0hSdmNnQnZkMjVMWlhsekFHRmtaQUJrYjI1bEFHNWxlSFFBZG1Gc2RXVnpBSE52ZFhKalpRQm1iR0ZuY3dCbmJHOWlZV3dBZFc1cFkyOWtaUUJ5WVhjQWJtVjNMblJoY21kbGRBQjBhR2x6TG1GamRHbDJaVjltZFc1akFEeG9iMjFsWDI5aWFtVmpkRDRBUEdOdmJYQjFkR1ZrWDJacFpXeGtQZ0E4YzNSaGRHbGpYMk52YlhCMWRHVmtYMlpwWld4a1BnQThZMnhoYzNOZlptbGxiR1J6WDJsdWFYUStBRHhpY21GdVpENEFJMk52Ym5OMGNuVmpkRzl5QUdGekFHWnliMjBBYldWMFlRQXFaR1ZtWVhWc2RDb0FLZ0JOYjJSMWJHVUFkR2hsYmdCeVpYTnZiSFpsQUhKbGFtVmpkQUJ3Y205dGFYTmxBSEJ5YjNoNUFISmxkbTlyWlFCaGMzbHVZd0JsZUdWakFHZHliM1Z3Y3dCemRHRjBkWE1BY21WaGMyOXVBR2RzYjJKaGJGUm9hWE1BWW1sbmFXNTBBR0pwWjJac2IyRjBBR0pwWjJSbFkybHRZV3dBY205MWJtUnBibWROYjJSbEFHMWhlR2x0ZFcxVGFXZHVhV1pwWTJGdWRFUnBaMmwwY3dCdFlYaHBiWFZ0Um5KaFkzUnBiMjVFYVdkcGRITUFkRzlLVTA5T0FFOWlhbVZqZEFCQmNuSmhlUUJGY25KdmNnQk9kVzFpWlhJQVUzUnlhVzVuQUVKdmIyeGxZVzRBVTNsdFltOXNBRUZ5WjNWdFpXNTBjd0JOWVhSb0FFcFRUMDRBUkdGMFpRQkdkVzVqZEdsdmJnQkhaVzVsY21GMGIzSkdkVzVqZEdsdmJnQkdiM0pKYmtsMFpYSmhkRzl5QUZKbFowVjRjQUJCY25KaGVVSjFabVpsY2dCVGFHRnlaV1JCY25KaGVVSjFabVpsY2dCVmFXNTBPRU5zWVcxd1pXUkJjbkpoZVFCSmJuUTRRWEp5WVhrQVZXbHVkRGhCY25KaGVRQkpiblF4TmtGeWNtRjVBRlZwYm5ReE5rRnljbUY1QUVsdWRETXlRWEp5WVhrQVZXbHVkRE15UVhKeVlYa0FRbWxuU1c1ME5qUkJjbkpoZVFCQ2FXZFZhVzUwTmpSQmNuSmhlUUJHYkc5aGRETXlRWEp5WVhrQVJteHZZWFEyTkVGeWNtRjVBRVJoZEdGV2FXVjNBRUpwWjBsdWRBQkNhV2RHYkc5aGRBQkNhV2RHYkc5aGRFVnVkZ0JDYVdkRVpXTnBiV0ZzQUU5d1pYSmhkRzl5VTJWMEFFOXdaWEpoZEc5eWN3Qk5ZWEFBVTJWMEFGZGxZV3ROWVhBQVYyVmhhMU5sZEFCTllYQWdTWFJsY21GMGIzSUFVMlYwSUVsMFpYSmhkRzl5QUVGeWNtRjVJRWwwWlhKaGRHOXlBRk4wY21sdVp5QkpkR1Z5WVhSdmNnQlNaV2RGZUhBZ1UzUnlhVzVuSUVsMFpYSmhkRzl5QUVkbGJtVnlZWFJ2Y2dCUWNtOTRlUUJRY205dGFYTmxBRkJ5YjIxcGMyVlNaWE52YkhabFJuVnVZM1JwYjI0QVVISnZiV2x6WlZKbGFtVmpkRVoxYm1OMGFXOXVBRUZ6ZVc1alJuVnVZM1JwYjI0QVFYTjVibU5HZFc1amRHbHZibEpsYzI5c2RtVUFRWE41Ym1OR2RXNWpkR2x2YmxKbGFtVmpkQUJCYzNsdVkwZGxibVZ5WVhSdmNrWjFibU4wYVc5dUFFRnplVzVqUjJWdVpYSmhkRzl5QUVWMllXeEZjbkp2Y2dCU1lXNW5aVVZ5Y205eUFGSmxabVZ5Wlc1alpVVnljbTl5QUZONWJuUmhlRVZ5Y205eUFGUjVjR1ZGY25KdmNnQlZVa2xGY25KdmNnQkpiblJsY201aGJFVnljbTl5QUR4aWNtRnVaRDRBVTNsdFltOXNMblJ2VUhKcGJXbDBhWFpsQUZONWJXSnZiQzVwZEdWeVlYUnZjZ0JUZVcxaWIyd3ViV0YwWTJnQVUzbHRZbTlzTG0xaGRHTm9RV3hzQUZONWJXSnZiQzV5WlhCc1lXTmxBRk41YldKdmJDNXpaV0Z5WTJnQVUzbHRZbTlzTG5Od2JHbDBBRk41YldKdmJDNTBiMU4wY21sdVoxUmhad0JUZVcxaWIyd3VhWE5EYjI1allYUlRjSEpsWVdSaFlteGxBRk41YldKdmJDNW9ZWE5KYm5OMFlXNWpaUUJUZVcxaWIyd3VjM0JsWTJsbGN3QlRlVzFpYjJ3dWRXNXpZMjl3WVdKc1pYTUFVM2x0WW05c0xtRnplVzVqU1hSbGNtRjBiM0lBVTNsdFltOXNMbTl3WlhKaGRHOXlVMlYwQUVHQXVBRUx0UWdCQUFBQUJRQUJGQVVBQVJVRkFBRVZCUUFCRndVQUFSY0JBQUVBQVFBQkFBRUFBUUFCQUFFQUFRQUJBQUVBQVFBQ0FBRUZBd0FCQ2dFQkFBQUJBZ0VBQVFNQ0FBRUJBZ0FCQWdNQUFRSUVBQUVEQmdBQkFnTUFBUU1FQUFFRUJRQUJBd01BQVFRRUFBRUZCUUFCQWdJQUFRUUVBQUVEQXdBQkF3TUFBUVFFQUFFRkJRQURBZ0VOQXdFQkRRTUJBQTBEQWdFTkF3SUFEUU1BQVEwREF3RUtBUUVBQUFFQUFBQUJBUUlBQVFBQUFBRUNBZ0FCQWdBQUFRRUFBQUVCQUFBR0FBQVlCUUVCRHdNQ0FRb0JBZ0VBQVFFQkFBRUJBUUFGQUFFWEJRQUJGd1VBQVJjRkFRQVhCUUVBRndVQ0FCY0JBZ01BQVFNQUFBWUFBQmdHQUFBWUJnRUFHQVVCQVJjRkFRSVhCUUlBRndFQ0FRQUJBd0FBQVFNQkFBRUNBUUFCQWdJQUFRTUFBQUVEQVFBQkJBQUFCUUlCRndVQkFSY0JBZ0lBQVFJQkFBRUNBZ0FCQXdJQUFRTUNBQUlEQXdVR0FnRVlBZ01CQlFZQ0FoZ0dBd01ZQXdBQkVBTUJBQkFEQVFFUUF3QUJFUU1CQUJFREFRRVJBd0FCRWdNQkFCSURBUUVTQXdBQUVBTUFBUkFEQVFBUUF3RUFFQU1BQVJJREFRQVNBd0VBRWdNQUFCQUZBUUFXQlFFQUZnVUFBQllGQUFFV0JRQUFGZ0VCQUFBQkFRRUFBUUVCQUFFQ0FnQUtBUUFhQ2dJQkdnb0JBQm9LQVFBYUNnRUFHZ29CQUJvSEFBSVpCd0FDR1FjQUFoa0ZBQUlYQVFFQkFBRUJBd0FCQVFNQUFRRURBQUlEQlFVQkFRRUFBUUVDQUFFREFBQUJCQVFBQVFRRUFBSUVCUVVCQUFBQUFRRUNBQUVCQWdBQkFRSUFBUUVCQUFFQkFRQUJBUUVBQVFFQkFBRUJBUUFCQVFJQUFRRUNBQUlBQUFjQ0FBQUhBZ0VBQndFQkFRQUJBUUVBQVFFQkFBRUNBUUFGQUFFWEFRSUJBQUVDQVFBQkFnRUFBUUlCQUFFQ0FRQUJBZ0VBQVFJQkFBRUNBUUFCQWdFQUFRSUJBQUVDQVFBQkFnRUFBUUlCQUFFQ0FRQUJBZ0VBQVFJQkFBRUNBUUFCQWdFQUFRSUJBQUVDQVFBQkFnRUFBUUlCQUFFQkFRQUJBZ0VBQVFJQkFBRUFBQUFEQUFBS0F3QUFDZ1VBQUJZSEFBRVpCd0FCR1FjQkFCa0hBQUVaQ3dBQ0d3Y0FBaGtIQUFJWkJ3RUJHUWNCQWhrSEFRRVpCUUVCRXdVQUFCTUJBQUVCQVFBQkFRRUFBUUVCQUFFQkFRQUJBUUVBQVFFQkFBRUJBUUFCQVFFQUFRRUNBQUVHQXdBQkN3SUFBUWdDQUFFSUFRQUJBQUlBQVFjQ0FRQUhBZ0VCQndFQUFRSUJBQUVDQVFBQkFnRUFBUUlCQVFBQ0FRRUFBZ0VCQUFJQkFRQUNBUUVCQWdFQkFRSUJBUUVDQVFFQkFnRUFBUU1CQUFFREFRQUJBd0VBQVFNQkFRQURBUUVBQXdFQkFBTUJBUUFEQVFFQkF3RUJBUU1CQVFFREFRRUJBd0VBQVFRQkFBRUVBUUFCQkFFQUFRUUJBUUFFQVFFQUJBRUJBQVFCQVFBRUFRRUJCQUVCQVFRQkFRRUVBUUVCQkFFQkFRQUNBUUFKQWdFQUNRSUFBQWtEQUFBTUFRRUJEZ0VCQVE0QkFRRU9BUUVCRGdFQkFRQUJBUUVBQVFFQkFBRUJBUUNmQUFBQW9BQUFBS0VBQUFCdUFHWUFhUUJ1QUdrQWRBQjVBQTBBRUFBMEFEZ0FRY0RBQVF1VkVTc0FBQUF0QUFBQUtnQUFBQzhBQUFBbEFBQUFLaW9BQUh3QUFBQW1BQUFBWGdBQUFEdzhBQUErUGdBQVBqNCtBRDA5QUFBOEFBQUFjRzl6QUc1bFp3QXJLd0FBTFMwQUFINEFBQUFBQUFBQWZUQUFBQU1BQUFBQUFBQUFvZ0FBQUdzY0FBQUJBUUFBb3dBQUFBQUFBQURkTndBQUFRRUFBS1FBQUFBQUFBQUFyaXNBQUFFQ0FRQ2xBQUFBQUFBQUFPc3hBQUFCQWdJQXBRQUFBQUFBQUFDTE1nQUFBUUlFQUtVQUFBQUFBQUFBZENvQUFBRUNDQUNsQUFBQUFBQUFBS2cyQUFBQkFoQUFwUUFBQUFBQUFBRDdEZ0FBQVFJZ0FLVUFBQUFBQUFBQUVUNEFBQU1BQUFBQkFBQUFWUUFBQUc4MEFBQURBQUFBQWdBQUFLWUFBQUJqRXdBQUF3QUFBQUVBQUFDbkFBQUEwaTBBQUFNQUFBQUFBQUFBcUFBQUFBMUFBQUFEQUFBQUFnQUFBS2tBQUFDSVB3QUFBd0FBQUFFQUFBQ3FBQUFBZGo4QUFBTUFBQUFCQUFBQXF3QUFBSmMvQUFBREFBQUFBUUFBQUt3QUFBQXRQd0FBQXdBQUFBSUFBQUN0QUFBQVBEOEFBQUVCQUFDdUFBQUFBQUFBQVBVU0FBQURBQUFBQUF3QUFLOEFBQUNuUHdBQUFRTUFBRjBmQUFBQUFBQUFoMEVBQUFNSUFBRHdZUUFBQXdBQUFISXhBQUFEQUFBQUFnQUFBTEFBQUFBZkR3QUFBd0FBQUFNQUFBQ3hBQUFBcHo4QUFBRURBQUNIUVFBQUFBQUFBSVExQUFBREFBQUFBZ0FBQUxJQUFBQmZGd0FBQXdBQUFBSUJBQUN6QUFBQXRoY0FBQU1BQUFBQkFRQUF0QUFBQURjZUFBQURBQUFBQVFFQUFMVUFBQUFwTVFBQUF3QUFBQUVCQUFDMkFBQUFKU1FBQUFNQUFBQUFBUUFBdHdBQUFIZ3dBQUFCQWdBQXVBQUFBQUFBQUFBaUxRQUFBd0FBQUFFQkFBQzVBQUFBY1J3QUFBTUFCQUFBQVFBQXVnQUFBQ1VaQUFBREFBQUFBQUVBQUxvQUFBQnlIUUFBQXdBSUFBQUJBQUM2QUFBQVRUOEFBQU1KQUFCeUhRQUEvLy8vLzZjL0FBQUJBd0FBSXlVQUFBQUFBQUNlUFFBQUF3QUJBQUVCQUFDekFBQUFOeDRBQUFNQUFRQUJBUUFBdFFBQUFDa3hBQUFEQUFFQUFRRUFBTFlBQUFBbEpBQUFBd0FCQUFBQkFBQzNBQUFBZURBQUFBRUNBUUM0QUFBQUFBQUFBQ0l0QUFBREFBRUFBUUVBQUxrQUFBQnhIQUFBQXdBQkFBQUJBQUM2QUFBQUpSa0FBQU1KQUFCeEhBQUEvLy8vLzAwL0FBQURDUUFBY1J3QUFQLy8vLzl5SFFBQUF3QUpBQUFCQUFDNkFBQUFwejhBQUFFREFBQytGd0FBQUFBQUFGOFhBQUFEQUFJQUFnRUFBTE1BQUFDMkZ3QUFBd0FDQUFFQkFBQzBBQUFBTng0QUFBTUFBZ0FCQVFBQXRRQUFBQ2t4QUFBREFBSUFBUUVBQUxZQUFBQ25Qd0FBQVFNQUFCOGxBQUFBQUFBQW5qMEFBQU1BQXdBQkFRQUFzd0FBQURjZUFBQURBQU1BQVFFQUFMVUFBQUFwTVFBQUF3QURBQUVCQUFDMkFBQUFwejhBQUFFREFBQzZGd0FBQUFBQUFQVVNBQUFEQUFBQUFBd0FBTHNBQUFDblB3QUFBUU1BQUZBZkFBQUFBQUFBOVJJQUFBTUFBUUFBREFBQXV3QUFBS2MvQUFBQkF3QUFReDhBQUFBQUFBQThQd0FBQVFFQUFLNEFBQUFBQUFBQW9pZ0FBQU1BQUFBQ0FBQUF2QUFBQUJVdEFBQURBQUFBQVFBQUFMMEFBQUR6RGdBQUF3QUFBQUVBQUFDK0FBQUFwejhBQUFFREFBQ25NUUFBQUFBQUFJNHdBQUFEQUFBQUFRRUFBTDhBQUFEeEZ3QUFBd0FCQUFFQkFBQy9BQUFBY0NvQUFBTUFBQUFCQVFBQXdBQUFBRE05QUFBREFBRUFBUUVBQU1BQUFBREVEZ0FBQXdBQ0FBRUJBQURBQUFBQWF6Z0FBQU1BQUFBQkFBQUF3UUFBQUR3L0FBQUJBUUFBcmdBQUFBQUFBQUNuUHdBQUFRTUFBRm9tQUFBQUFBQUFYejhBQUFNQUFBQUFBQUFBd2dBQUFQVVNBQUFEQUFBQUFRRUFBTU1BQUFCc0pRQUFBd0FCQUFFQkFBRERBQUFBNnhBQUFBTUFBZ0FCQVFBQXd3QUFBUFVTQUFBREFBQUFBUUVBQU1RQUFBQnNKUUFBQXdBQkFBRUJBQURFQUFBQTZ4QUFBQU1BQWdBQkFRQUF4QUFBQUtjL0FBQUJBd0FBeGg4QUFBQUFBQUNuUHdBQUFRTUFBRU1tQUFBQUFBQUFZUzhBQUFNQUFBQUFBQUFBeFFBQUFOSXRBQUFEQUJNQUFBRUFBTVlBQUFDOFB3QUFBd0FBQUFFQUFBREhBQUFBU3k0QUFBTUFBd0FBQVFBQXhnQUFBQ291QUFBRENRQUFTeTRBQVAvLy8vOC9MZ0FBQXdBakFBQUJBQURHQUFBQTJ5MEFBQU1BRVFBQUFRQUF4Z0FBQVBzdEFBQURBQklBQUFFQUFNWUFBQUFiTGdBQUF3QXpBQUFCQUFER0FBQUE2QzBBQUFNQU1RQUFBUUFBeGdBQUFBZ3VBQUFEQURJQUFBRUFBTVlBQUFBYUZ3QUFBd0FBQUFBQUFBRElBQUFBeFRJQUFBTUFBQUFBQUFBQXhRQUFBRE1rQUFBREFBRUJBQUVBQU1rQUFBQkhKQUFBQXdBQkFBQUJBQURKQUFBQVlpUUFBQU1BQUFBQUFRQUF5UUFBQVA4ckFBQURBQkVBQUFFQUFNa0FBQUFVTEFBQUF3QVFBQUFCQUFESkFBQUFQekVBQUFNQUlRQUFBUUFBeVFBQUFGSXhBQUFEQUNBQUFBRUFBTWtBQUFDb0dnQUFBd0F4QUFBQkFBREpBQUFBdlJvQUFBTUFNQUFBQVFBQXlRQUFBSU1jQUFBREFFRUFBQUVBQU1rQUFBQ2NIQUFBQXdCQUFBQUJBQURKQUFBQThCMEFBQU1BVVFBQUFRQUF5UUFBQUFrZUFBQURBRkFBQUFFQUFNa0FBQUN2SFFBQUF3QmhBQUFCQUFESkFBQUEwaDBBQUFNQVlBQUFBUUFBeVFBQUFOMFBBQUFEQUhFQUFBRUFBTWtBQUFEa0R3QUFBd0J3QUFBQkFBREpBQUFBdlRJQUFBTUFBQUFCQUFBQXlnQUFBSjhkQUFBREFIRUdBUUVBQU1zQUFBQy9IUUFBQXdCd0JnRUJBQURMQUFBQTVSMEFBQU1BY1FVQ0FRQUF5d0FBQVBzZEFBQURBSEFGQWdFQUFNc0FBQUI0SEFBQUF3QnhCQU1CQUFETEFBQUFqaHdBQUFNQWNBUURBUUFBeXdBQUFKOGFBQUFEQUhFREJBRUFBTXNBQUFDeEdnQUFBd0J3QXdRQkFBRExBQUFBTnpFQUFBTUFNUUlCQVFBQXl3QUFBRWN4QUFBREFEQUNBUUVBQU1zQUFBRDJLd0FBQXdBeEFRSUJBQURMQUFBQUNDd0FBQU1BTUFFQ0FRQUF5d0FBQUNza0FBQURBQUFBQVFBQUFNd0FBQUE3SkFBQUF3QXhBQU1CQUFETEFBQUFVeVFBQUFNQU1BQURBUUFBeXdBQUFJVkJBQUFEQUFBQUFRQUFBTTBBQUFCVGRXNU5iMjVVZFdWWFpXUlVhSFZHY21sVFlYUUFRZURSQVFza1NtRnVSbVZpVFdGeVFYQnlUV0Y1U25WdVNuVnNRWFZuVTJWd1QyTjBUbTkyUkdWakFFR1EwZ0VMNWc0ZkFBQUFIQUFBQUI4QUFBQWVBQUFBSHdBQUFCNEFBQUFmQUFBQUh3QUFBQjRBQUFBZkFBQUFIZ0FBQUI4QUFBRDRFQUFBQXdBQUFBQUFBQURPQUFBQWNqRUFBQU1BQUFBQkFBQUF6d0FBQUU1RUFBQURBQUFBQndBQUFOQUFBQUNhbTV5ZG5xQ2hvcTJ1cjUrZkFBQUEwaTBBQUFNQUFBQUFBQUFBMFFBQUFHRXZBQUFEQUFBQUFBQUFBTklBQUFDblB3QUFBUU1BQUlnV0FBQUFBQUFBWGtFQUFBTUFBQUFDQVFBQTB3QUFBR1pCQUFBREFBRUFBZ0VBQU5NQUFBQklFUUFBQXdBQkFBSUJBQURVQUFBQVRSRUFBQU1BQWdBQ0FRQUExQUFBQUZjUkFBQURBQU1BQWdFQUFOUUFBQUJTRVFBQUF3QUdBQUlCQUFEVUFBQUFQeWtBQUFNQUVRQUNBUUFBMUFBQUFFY3BBQUFEQUJJQUFnRUFBTlFBQUFCWEtRQUFBd0FUQUFJQkFBRFVBQUFBVHlrQUFBTUFGZ0FDQVFBQTFBQUFBSkVUQUFBREFBQUFBUUVBQU5VQUFBQnBLUUFBQXdBQkFBRUJBQURWQUFBQWhVVUFBQU1BQUFBQkFRQUExZ0FBQVBNTUFBQURBQUVBQVFFQUFOWUFBQURTTFFBQUF3QUFBQUFBQUFEWEFBQUFZVFFBQUFNREFBQThJQUFBQUFBQUFMbzFBQUFEQXdBQVRFOEFBQUFBQUFBd01RQUFBd0FBQUFJQUFBRFlBQUFBZUM4QUFBTUFBQUFCQVFBQTJRQUFBR2t2QUFBREFBQUFBZ0FBQU5vQUFBQkFEZ0FBQXdBQUFBTUJBQURiQUFBQVlSMEFBQU1BQUFBQ0FBQUEzQUFBQU1VY0FBQURBQUFBQVFBQUFOMEFBQUQrR3dBQUF3QUFBQUVBQUFEZUFBQUFKUmtBQUFNQUFBQUJBUUFBM3dBQUFIRWNBQUFEQUFFQUFRRUFBTjhBQUFCeUhRQUFBd0FDQUFFQkFBRGZBQUFBcERRQUFBTUFBQUFCQVFBQTRBQUFBS2NiQUFBREFBQUFBUUVBQU9FQUFBQ3pIZ0FBQXdBQUFBSUJBQURpQUFBQXlSb0FBQU1BQUFBQkFBQUE0d0FBQUN3Y0FBQURBQUFBQWdBQUFPUUFBQUJIS0FBQUF3QUFBQUlBQUFEbEFBQUFxU3NBQUFNQUFBQUJBUUFBNWdBQUFJY3dBQUFEQUFFQUFRRUFBT1lBQUFCWlBRQUFBd0FBQUFFQkFBRG5BQUFBVnlnQUFBTUFBUUFCQVFBQTV3QUFBSlFhQUFBREFBQUFBUUFBQU9nQUFBQjZIUUFBQXdBQUFBRUFBQURwQUFBQTBpMEFBQU1BQUFBQUFBQUE2Z0FBQUJzdUFBQURBQUFBQUFBQUFPc0FBQUJoTHdBQUF3QUFBQUFBQUFEc0FBQUErZzBBQUFNQUFBQUJBQUFBN1FBQUFJY3ZBQUFEQUFBQUFRQUFBTzRBQUFBVU5RQUFBd0FBQUFFQUFBRHZBQUFBSXo4QUFBRUJBQUR3QUFBQThRQUFBQkkvQUFBREFBQUFBZ0VBQVBJQUFBRHdQZ0FBQXdBQkFBSUJBQUR5QUFBQUFUOEFBQU1BQUFBQkFRQUE4d0FBQU44K0FBQURBQUVBQVFFQUFQTUFBQUJ2S2dBQUF3QUFBQUVBQUFEMEFBQUF5QTRBQUFNQUFBQUNBUUFBOVFBQUFIRTVBQUFEQUFBQUFRQUFBUFlBQUFEU0xRQUFBd0FBQUFBQUFBRDNBQUFBK0Q4QUFBTUFBQUFCQUFBQStBQUFBR1kwQUFBQkFRQUErUUFBQUFBQUFBQURKQUFBQVFFQUFQb0FBQUFBQUFBQVRUOEFBQU1BQUFBQUFBQUF3Z0FBQUFBWkFBQURBQUFBQVFBQUFQc0FBQUMrRGdBQUF3QUFBQUVCQUFEOEFBQUFueklBQUFNQUFRQUJBUUFBL0FBQUFDSXRBQUFEQUFJQUFRRUFBUHdBQUFBVEpRQUFBd0FEQUFFQkFBRDhBQUFBVWlFQUFBTUFCQUFCQVFBQS9BQUFBTlkzQUFBREFBQUFBUUVBQVAwQUFBRGJGZ0FBQXdBQkFBRUJBQUQ5QUFBQUxpb0FBQU1BQUFBQkFBQUEvZ0FBQUd3NUFBQURBQUFBQVFFQUFQOEFBQUJERUFBQUF3QUJBQUVCQUFEL0FBQUFUUzhBQUFNQUFBQUJBQUFBQUFFQUFGVXZBQUFEQUFBQUFRQUFBQUVCQUFDV0hRQUFBd0FBQUFFQUFBQUNBUUFBNWljQUFBTUFBQUFCQVFBQUF3RUFBTkl0QUFBREFBQUFBQUFBQUFRQkFBQWJMZ0FBQXdBQkFBQUJBQUFEQVFBQXp5UUFBQU1BQUFBQUFRQUFCUUVBQU1Jc0FBQURBQUFBQVFFQUFBWUJBQURwRmdBQUF3QUJBQUFCQUFBRkFRQUE1eFlBQUFNQUFRQUJBUUFBQmdFQUFHb3hBQUFEQUFBQUFBQUFBQWNCQUFDV0V3QUFBd0FBQUFFQUFBQUlBUUFBWGpnQUFBTUFBQUFDQVFBQUNRRUFBR1E0QUFBREFBRUFBZ0VBQUFrQkFBRHZKd0FBQXdBQUFBSUFBQUFLQVFBQUZ5VUFBQU1BQVFBQkFRQUFDd0VBQU9rWUFBQURBQUFBQUFFQUFBc0JBQUJ4SEFBQUF3QUJBQUFCQUFBOUFBQUFUVDhBQUFNSkFBQnhIQUFBLy8vLy95VVpBQUFEQUFBQUFBRUFBRDBBQUFCeUhRQUFBd0FDQUFBQkFBQTlBQUFBeWc4QUFBTUFBQUFCQUFBQURBRUFBQzRwQUFBREFBQUFBUUFBQUEwQkFBQ3BMZ0FBQXdBQUFBQUFBQUFPQVFBQVBEOEFBQUVCQUFDdUFBQUFBQUFBQVBVU0FBQURBQUFBQUF3QUFENEFBQUNuUHdBQUFRTUFBRFFmQUFBQUFBQUFqeFlBQUFNQUFBQUNBQUFBRHdFQUFONFlBQUFEQUFBQUFRQUFBQkFCQUFCdFFRQUFBd0FBQUFFQUFBQVJBUUFBSURFQUFBTUFBQUFCQUFBQUVnRUFBSEZDQUFBREFBQUFBUUVBQUJNQkFBQkNGZ0FBQXdBQkFBRUJBQUFUQVFBQVowSUFBQU1BQUFBQkFRQUFGQUVBQUM4V0FBQURBQUVBQVFFQUFCUUJBQUJkTWdBQUF3QUFBQUVBQUFBVkFRQUFXeklBQUFNQUFBQUJBQUFBRmdFQUFIVU9BQUFBQmdBQUFBQUFBQUFBOEgrQlFRQUFBQVlBQUFBQUFBQUFBUGgvckR3QUFBQUhBRUdBNFFFTFZic3JBQUFEQUFBQUFBQUFBQmNCQUFCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV21GaVkyUmxabWRvYVdwcmJHMXViM0J4Y25OMGRYWjNlSGw2TURFeU16UTFOamM0T1VBcVh5c3RMaThBUWVEaEFRdVdBNXNyQUFBREFBQUFBUUFBQUJnQkFBRGJPZ0FBQXdBQUFBRUFBQUFaQVFBQTFTY0FBQU1BQUFBQkFBQUFHZ0VBQU5JdEFBQURBQUFBQVFFQUFCc0JBQUFiTGdBQUF3QUJBQUFCQUFBYkFRQUFZUzhBQUFNQUFBQUFBQUFBSEFFQUFJOFdBQUFEQ1FBQWp4WUFBQUFBQUFEZUdBQUFBd2tBQU40WUFBQUFBQUFBYlVFQUFBTUFBQUFCQUFBQUhRRUFBQ0F4QUFBREFBQUFBUUFBQUI0QkFBQWVJd0FBQXdBQUFBRUFBQUFmQVFBQUtDTUFBQU1BQUFBQkFBQUFJQUVBQUJ0REFBQUFCZ0FBLy8vLy8vLy83MzhsUXdBQUFBWUFBQUVBQUFBQUFBQUFnVUVBQUFBR0FBQUFBQUFBQUFENGYwZEFBQUFBQmdBQUFBQUFBQUFBOFA4MVFBQUFBQVlBQUFBQUFBQUFBUEIvakVFQUFBQUdBQUFBQUFBQUFBQ3dQRHhCQUFBQUJnQUEvLy8vLy8vL1AwTk5RUUFBQUFZQUFQLy8vLy8vL3ovRDBpMEFBQU1BQUFBQUFBQUFJUUVBQUdFdkFBQURBQUFBQUFBQUFDSUJBQUNHTndBQUF3QUFBQUVBQUFBakFRQUFxQlVBQUFNQUFBQUJBQUFBSkFFQUFFUVJBQUFEQUFBQUFRQUFBQ1VCQUFDYUxBQUFBUVFBUVlEbEFRdmlCaG9aQUFBREFBQUFBUUFBQUNZQkFBQVRHUUFBQXdBQUFBRUFBQUFuQVFBQUFCa0FBQU1BQUFBQkFBQUFLQUVBQUFjWkFBQURBQUFBQVFBQUFDa0JBQUJOTHdBQUF3QUFBQUVCQUFBcUFRQUFWUzhBQUFNQUFRQUJBUUFBS2dFQUFKWWRBQUFEQUFBQUFRRUFBQ3NCQUFCQkxBQUFBd0FDQUFFQkFBQXJBUUFBTml3QUFBTUFBUUFCQVFBQUt3RUFBQTh0QUFBREFOSUFBUUVBQUN3QkFBQjdLZ0FBQXdEVEFBRUJBQUFzQVFBQUd5MEFBQU1BMVFBQkFRQUFMQUVBQUxjV0FBQURBQUFBQWdBQUFDMEJBQUJmTFFBQUF3QUFBQUlBQUFBdUFRQUFtQjRBQUFNQUFBQUNBQUFBTHdFQUFGNDRBQUFEQUFBQUFnQUFBREFCQUFENUdBQUFBd0FBQUFFQUFBQXhBUUFBY0RnQUFBTUFBQUFDQVFBQU1nRUFBSVFxQUFBREFBRUFBZ0VBQURJQkFBQStPZ0FBQXdBQkFBRUJBQUF6QVFBQXFoTUFBQU1BQUFBQkFRQUFNd0VBQURvcEFBQURBQU1BQUFFQUFEUUJBQUEyT2dBQUF3QUNBQUFCQUFBMEFRQUEwUllBQUFNSkFBQTJPZ0FBLy8vLy82QVRBQUFEQUFFQUFBRUFBRFFCQUFEdkZnQUFBd2tBQUtBVEFBRC8vLy8vMGkwQUFBTUFBQUFBQUFBQU5RRUFBR0V2QUFBREFBQUFBQUFBQURVQkFBQVlNUUFBQXdBQUFBRUFBQUEyQVFBQTlqRUFBQU1BQUFBQkFBQUFOd0VBQUs4eEFBQURBQUVBQUFFQUFEZ0JBQUROTVFBQUF3QUFBQUFCQUFBNEFRQUF1ekVBQUFNQUFRQUFBUUFBT0FFQUFOa3hBQUFEQUFBQUFBRUFBRGdCQUFCTlB3QUFBd0FGQUFBQkFBQTlBQUFBVWlBQUFBTUFBQUFCQVFBQU9RRUFBSWN1QUFBREFBRUFBQUVBQURrQkFBQzFLd0FBQXdBQ0FBQUJBQUE1QVFBQVJUb0FBQU1BQXdBQUFRQUFPUUVBQU5VNkFBQURBQVFBQUFFQUFEa0JBQUJJSUFBQUF3QUZBQUVCQUFBNUFRQUFtaThBQUFNQUJnQUJBUUFBT1FFQUFCY2VBQUFEQUFjQUFBRUFBRGtCQUFDMkt3QUFBd0FJQUFFQkFBQTVBUUFBYVNvQUFBTUFDUUFBQVFBQU9RRUFBSTQxQUFBREFBb0FBQUVBQURrQkFBQjVQZ0FBQXdBTEFBQUJBQUE1QVFBQXZTUUFBQU1BREFBQUFRQUFPUUVBQU4wK0FBQmhOQUFBaHk0QUFBQUFBQUMxS3dBQUFBQUFBTkkrQUFBQUFBQUFFaE1BQUFBQUFBQ1FGUUFBVENBQUFKQVZBQUI0TUFBQTlDc0FBQUFBQUFEZFBnQUEyeTRBQUdrcUFBQUFBQUFBampVQUFBQUFBQUI1UGdBQUFBQUFBTDBrQUVIdzZ3RUxzUkwxRWdBQUF3QUFBQUFNQUFBNkFRQUFwejhBQUFFREFBQmtId0FBQUFBQUFMMHNBQUFEQ0FBQUlIWUFBQ3dBQUFEckp3QUFBd0FBQUFJQkFBQTdBUUFBZlJBQUFBTUFBUUFDQVFBQU93RUFBQjhlQUFBREFBQUFBUVlBQUR3QkFBQkNJQUFBQXdBQUFBRUdBQUE5QVFBQWp5b0FBQU1BQUFBQkJnQUFQZ0VBQURvNUFBQURBQUFBQVFZQUFEOEJBQUNSRXdBQUF3QUFBQUVHQUFCQUFRQUFGQnNBQUFNQUFBQUJCZ0FBUVFFQUFPRW5BQUFEQUFBQUFRWUFBRUlCQUFEYktBQUFBd0FBQUFFR0FBQkRBUUFBZWtVQUFBTUFBQUFDQndBQVJBRUFBQlViQUFBREFBQUFBUVlBQUVVQkFBQ3lKQUFBQXdBQUFBRUdBQUJHQVFBQUxTMEFBQU1BQUFBQkJnQUFSd0VBQVBRUUFBQURBQUFBQWdjQUFFZ0JBQURpSndBQUF3QUFBQUVHQUFCSkFRQUEzQ2dBQUFNQUFBQUJCZ0FBU2dFQUFBZytBQUFEQUFBQUFRWUFBRXNCQUFCU0tBQUFBd0FBQUFFR0FBQk1BUUFBeUN3QUFBTUFBQUFCQmdBQVRRRUFBT0FzQUFBREFBQUFBUVlBQUU0QkFBRG1MQUFBQXdBQUFBRUdBQUJQQVFBQXh5d0FBQU1BQUFBQkJnQUFVQUVBQU44c0FBQURBQUFBQVFZQUFGRUJBQURsTEFBQUF3QUFBQUVHQUFCU0FRQUFKRVlBQUFNQUFBQUJCZ0FBVXdFQUFENGxBQUFEQUFBQUFRWUFBRlFCQUFDQVJRQUFBd0FBQUFFR0FBQlZBUUFBdWtZQUFBTUFBQUFCQmdBQVZnRUFBSnNUQUFBREFBQUFBUVlBQUZjQkFBRFJFd0FBQXdBQUFBSUFBQUJZQVFBQU15a0FBQU1BQUFBQUFBQUFXUUVBQUM0NUFBQURBQUFBQVFZQUFGb0JBQUJ4S1FBQUF3QUFBQUlBQUFCYkFRQUFvVVVBQUFNQUFBQUJBQUFBWEFFQUFLYy9BQUFCQXdBQXZTd0FBQUFBQUFEbFF3QUFBQVlBQUdsWEZJc0t2d1ZBd0VZQUFBQUdBQUFXVmJXN3NXc0NRSjFGQUFBQUJnQUE3em42L2tJdTVqL2FRd0FBQUFZQUFQNkNLMlZIRmZjLzRFTUFBQUFHQUFBTzVTWVZlOHZiUDN0Q0FBQUFCZ0FBR0MxRVZQc2hDVUNQUlFBQUFBWUFBTTA3ZjJhZW9PWS9sMFVBQUFBR0FBRE5PMzltbnFEMlAra1hBQUFEQ0FBQThIZ0FBQTRBQUFESURnQUFBd0FBQUFNQUFBQmRBUUFBd2hjQUFBTUFBQUFDQUFBQVhnRUFBRUFPQUFBREFBRUFBd0VBQU5zQUFBQWREZ0FBQXdBQUFBSUFBQUJmQVFBQXRoY0FBQU1BQUFBQ0FBQUFZQUVBQUxNZUFBQURBQUVBQWdFQUFPSUFBQUI0THdBQUF3QUJBQUVCQUFEWkFBQUFOeDRBQUFNQUFBQUNBQUFBWVFFQUFLUTBBQUFEQUFFQUFRRUFBT0FBQUFCYUdRQUFBd0FBQUFFQUFBQmlBUUFBcHhzQUFBTUFBUUFCQVFBQTRRQUFBRjhYQUFBREFBQUFBd0FBQUdNQkFBQnBMd0FBQXdBQUFBSUFBQUJrQVFBQXB6OEFBQUVEQUFEcEZ3QUFBQUFBQU5JdEFBQURBQUFBQUFBQUFHVUJBQUJoTHdBQUF3QUFBQUFBQUFCbUFRQUF2RDhBQUFNQUFBQUJBQUFBWmdFQUFLYy9BQUFCQXdBQWd5a0FBQUFBQUFDdEpRQUFBUUVBQUdjQkFBQUFBQUFBV1NBQUFBTUFBQUFCQUFBQWFBRUFBRjBnQUFBREFBQUFBUUFBQUdrQkFBRDFFZ0FBQXdBQUFBRU1BQUJxQVFBQWJDVUFBQU1BQVFBQkRBQUFhZ0VBQU9zUUFBQURBQUlBQVF3QUFHb0JBQUNuUHdBQUFRTUFBTXNmQUFBQUFBQUFwejhBQUFFREFBQklKZ0FBQUFBQUFLa3NBQUFCQWhNQWF3RUFBQUFBQUFCZU9BQUFBd0FUQUFJQkFBQnNBUUFBcHo4QUFBRURBQUJrSXdBQUFBQUFBRFFSQUFBREFBQUFBUUFBQUcwQkFBQThQd0FBQVFFQUFLNEFBQUFBQUFBQXFTd0FBQUVDRkFCckFRQUFBQUFBQUY0NEFBQURBQlFBQWdFQUFHd0JBQUNuUHdBQUFRTUFBRDBqQUFBQUFBQUFQRDhBQUFFQkFBQ3VBQUFBQUFBQUFKb3NBQUFCQVFBQWJnRUFBQUFBQUFBMkl3QUFBUUlBQUc4QkFBQUFBQUFBcVN3QUFBRUNBQUJ3QVFBQUFBQUFBQThYQUFBQkFnQUFjUUVBQUFBQUFBQmZGd0FBQXdBQUFBRUFBQUJ5QVFBQWNSd0FBQU1BQVFBQUFRQUFjd0VBQUUwL0FBQURDUUFBY1J3QUFQLy8vLzhsR1FBQUF3QUFBQUFCQUFCekFRQUFjaDBBQUFNQUFnQUFBUUFBY3dFQUFLYy9BQUFCQVFBQWRBRUFBQUFBQUFEdkp3QUFBd0FBQUFJQUFBQjFBUUFBdmc0QUFBTUFDQUFCQVFBQS9BQUFBSjh5QUFBREFBa0FBUUVBQVB3QUFBQWlMUUFBQXdBS0FBRUJBQUQ4QUFBQUV5VUFBQU1BQ3dBQkFRQUEvQUFBQUZJaEFBQURBQXdBQVFFQUFQd0FBQURXTndBQUF3QUlBQUVCQUFEOUFBQUEyeFlBQUFNQUNRQUJBUUFBL1FBQUFDNHFBQUFEQUFBQUFRQUFBSFlCQUFCc09RQUFBd0FBQUFFQkFBQjNBUUFBUXhBQUFBTUFBUUFCQVFBQWR3RUFBR294QUFBREFBQUFBQUFBQUhnQkFBQmVPQUFBQXdBQUFBSUFBQUI1QVFBQUtROEFBQU1BQUFBQ0FBQUFlZ0VBQUpZVEFBQURBQUFBQVFBQUFIc0JBQURtSndBQUF3QUFBQUVCQUFCOEFRQUFHeTRBQUFNQUFRQUFBUUFBZkFFQUFFMHZBQUFEQUFBQUFRRUFBSDBCQUFCVkx3QUFBd0FCQUFFQkFBQjlBUUFBbGgwQUFBTUEvLzhCQVFBQWZRRUFBQzRwQUFBREFBQUFBUUFBQUg0QkFBQ3BMZ0FBQXdBQUFBQUFBQUIvQVFBQVBEOEFBQUVCQUFDdUFBQUFBQUFBQURZakFBQUJBZ0VBYndFQUFBQUFBQUNwTEFBQUFRSUJBSEFCQUFBQUFBQUFEeGNBQUFFQ0FRQnhBUUFBQUFBQUFNRkVBQUFEQUJZQUFRRUFBSUFCQUFDd1JBQUFBd0FYQUFFQkFBQ0FBUUFBRlVVQUFBTUFHQUFCQVFBQWdBRUFBQUpGQUFBREFCa0FBUUVBQUlBQkFBREVSUUFBQXdBYUFBRUJBQUNBQVFBQXNVVUFBQU1BR3dBQkFRQUFnQUVBQUU1RkFBQURBQndBQVFFQUFJQUJBQUExUlFBQUF3QWRBQUVCQUFDQUFRQUEyRVVBQUFNQUhnQUJBUUFBZ0FFQUFHVkZBQUFEQUI4QUFRRUFBSUFCQUFDNVJBQUFBd0FXQUFJQkFBQ0JBUUFBcDBRQUFBTUFGd0FDQVFBQWdRRUFBQXhGQUFBREFCZ0FBZ0VBQUlFQkFBRDRSQUFBQXdBWkFBSUJBQUNCQVFBQXUwVUFBQU1BR2dBQ0FRQUFnUUVBQUtkRkFBQURBQnNBQWdFQUFJRUJBQUJDUlFBQUF3QWNBQUlCQUFDQkFRQUFLRVVBQUFNQUhRQUNBUUFBZ1FFQUFNMUZBQUFEQUI0QUFnRUFBSUVCQUFCYVJRQUFBd0FmQUFJQkFBQ0JBUUFBcHo4QUFBRURBQUE3RVFBQUFBQUFBQ1FBQUFBaEFBQUFJZ0FBQUFjQUFBQUZBQUFBSVFBQUFDRUFBQUFoQUFBQUlRQUFBQ0VBQUFBaEFBQUFCQUFBQUFZQUFBQWhBQUFBSVFBQUFDRUFBQUFoQUFBQUlRQUFBQVFBQUFBQkFBQUFBZ0FBQUFFQUFBQUVBQUFBQVFBQUFBRUFBQUFJQUFBQUVBQUFBQUVBQUFBZ0FFR3MvZ0VMSVFJQUFBQUFBQUFBQVFBQUFBRUFBQUFCQUFBQUR3QUFBQTRBQUFBUkFBQUFFQUJCK1A0QkN6RUNBQUFBQXdBQUFBUUFBQUFBQUFBQUFRQUFBQVVBQUFBSkFBQUFDZ0FBQUFzQUFBQU5BQUFBRFFBQUFBMEFBQUFOQUVHMC93RUxCUXdBQUFBTUFFSEUvd0VMQ1FjQUFBQUlBQUFBQmdCQjJQOEJDMzRFQUFBQUxRQUFBQzBBQUFCVUFBQUFPZ0FBQURvQUFBQXVBQUFBZmtnQUFNUk1BQUI0U0FBQWdnRUFBSU1CQUFDQ0FRQUFoQUVBQUlVQkFBQ0dBUUFBaHdFQUFJZ0JBQUNKQVFBQWlnRUFBSXNCQUFDTUFRQUFqUUVBQUl3QkFBQ09BUUFBandFQUFKQUJBQUNSQVFBQWtnRUFBSk1CQUFDVUFRQUFsUUVBUWVDQUFnc3FDZ0FKQUE0QUlBQWhBS0FBb1FDQUZvRVdBQ0FMSUNnZ0tpQXZJREFnWHlCZ0lBQXdBVEQvL2dEL0FFR1VnUUlMTFJBQUFBRCsvLytIL3YvL0J3QUFBQUFRQVA4RC92Ly9oLzcvL3dlOGdBQUFZSUFBQU5DQUFBQUJBREFBT2dCQjBJRUNDeEVFQURBQU9nQkJBRnNBWHdCZ0FHRUFld0JCOElFQ0M4UUxBUU1GQVFFQkFRVUZCUUVDQWdNRkJRRUJBUUlDQXdNRkJRRUZBUkVBQUFBd21pQUFBSm93QUhPQldnQXdGMkFBTUFkc0FMT0Jid0FBRjNBQUFBZDhBQUNCZndCQU1JQUF3d0dZQUpDQm1BQkFCcGtBUUpDY0FMU0JwQUJBTHFVQU1BRzhBRUNHdkFCd2diOEFBQUhBQURDQndBQkFCTUVBTUFIREFFQ0N3d0F3Z3NRQVFJTEZBREFCeHdBd2djY0FNQUhJQUVDQ3lBQXdnY2tBTUFIS0FBQ0J5Z0F3QWNzQU1JSExBRUFDekFBQUFjMEFNQUhPQURDQnpnQUFBYzhBTUlIUEFFQUcwQUF3QWRNQVFJTFRBRENCMUFCQUF0WUFNQUhYQUVDQzF3QXdndGdBUUlUWkFEQ0Iyd0JBQXR3QVFBTGVBQUNCM3dCUUErSUFVSVBqQUZBRDVRQkFrT1lBQUlIdUFFQVM3d0MwQWZnQVVJUDRBRUFDK2dBd0Fmc0FNSUg3QUVBby9BQXdBUkFCUUJJUkFURUJIUUZBZ2gwQk1JRWVBVEVCSHdFQmdoOEJRSUlnQVRDQklRRXdBU0lCTUlFaUFVQUtJd0VCQVNnQkFZRW9BUUVCS1FFQWdTa0JBQUVxQVFBQ0t3RUFnU3dCQUlFdEFRRUJMZ0VBQVRBQkFZRXdBUUNCTVFFQmdUSUJBUUV6QVFBQk5BRUFnVFFCQVFFMUFRR0JOUUVCQVRZQkFJRTNBUUdCT0FFQUFUa0JBSUU2QVFHQlBnRUFBVUFCQVFGQkFRQ0JRUUVCZ1VNQkFBRkVBUUNCUkFFQUFrVUJBQUZHQVFBQlNRRUJnVTRCQVFGUEFYT0JvZ0ZBQkxnQlFBSzdBUUNEdlFFd2diOEJNQUhEQVRBRHhBRXdBY1lCTUFMSEFkQUJ5QUV3a2NnQk1JblJBUUFCMWdFQWc5WUIwd0hZQVFDUjJBRnpBZUVCQUluaEFRQUI1Z0VBZ3VZQk1JSG5BWE1CNkFGemdlZ0JjNEhxQVhNQjZ3RUFnZXNCUUJqc0FYTUIrQUZ6Z2ZnQkFBSDVBUUNCK1FHZ0Fmb0JjNEg2QVVDQyt3RXdnZndCUUFMOUFUQ0QvZ0V3RUFBQ01DQUlBZ0FnR0FJQUVDZ0NRQ0l3QWtBMlJRSXdBV0FDUUk1Z0FnQ0Jad0pBWUdnQ01LYVlBZ0Ntc0FLMWdjTUNNU1pRQ0RHQll3Z3hnV1lJQUN0b0NBQ0RmZ2dSVU5BSkVBYjRDU0FHL0FsMEFVQU9kSUZBRG5RQlFRNTBnVUVPZEFGQ0RuU0JRZzUwQVVNT2dJRkREb0FCUkE0d0swZ09NSU5lRGdHQnZBNEJnYjRPQVFISERrQitBQTlBR0Q4UHRRRkxEN2FCU3crMkFVd1B0b0ZNRDdjQlRRK0FnVTBQTUFGUEQwQmdVQThBQ0lBUE1BaUVEd0FHaUE4d0Jvd1BBQWlRRHpBSWxBOEFDSmdQTUFpY0R3QUdvQTh3QnFRUHNBR29Ed0NCcUEvVEFha1BBSUdwRDlNQnFnOEFnYW9QMHdHckR3Q0Jxdzh3Z2F3UE1JR3REekNCcmc4d2dhOFBBQWl3RHpBSXRBOEFBcmdQQUFTNUR3QUN1dzhCQXJ3UEFRSzlEd0VDdmcrM0NNQVBad2pFRDdnSXlBOW9DTXdQdUFqUUQyZ0kxQThBQXRnUHVRSFpEN0dCMlErNUFkb1BzUUhiRDllQjJ3OHdBdHdQTUFMZEQyRUIzZzl6QWQ4UHVRSGhEN0tCNFErNkFlSVBzZ0hqRDlpQjR3OHdCT1FQWWdIbUR3QUM2QS9RQWVrUDBJSHBEN0FCNncvUWdlc1BNQUxzRHpBQzdROEJBdkFQMHdIeEQ5T0I4USs2QWZJUEFZSHlEN0FCOHcvVGdmTVBNQUwwRHpBQzlROHhBZllQdWdINUQ3S0IrUSs3QWZvUHNnSDdEOW1CK3c4d0F2d1BNQUw5RDJJQi9nK2dBWk1Rb0FHVkVLQ0JsUkF4QVprUUFRR25FREVRc0JBQkVMZ1FRSUxCRURFYVd4SUJHbWdTTVM4QUZnRXZHQlpBQWpBV01BRXhGakNCTVJZd0FUSVdBSUV5RmdBQk14WkFoak1XTUlFMkZqQUJOeFl3Z1RjV01BRTRGa0FDT1JaQWdqb1dNQUkvRmtCa1FCWkFoSFVXUUFKNUZnQW1nQllBZ1pNV0FJR1dGa0F1SUZOQUhFQlRRQTZSVTBBK21WTkFoTHhUTUlHK1UwQUt2MU5BZ3NWVE1JSEdVMEFFeUZNQkFjcFRRQlRMVXpBQjFWTXdnZFZUTUFIV1V6Q0IxbE13QWRkVE1BSFlVekNCMkZNd0FkbFRNWUhaVTBBTTJsTkFBdUZUTVFIaVV6Q0I0bE13QWVOVFFJVGpVMENDK2xNQmdhbFZJRkM0VmJJQmdIMnlnWUI5c2dHQmZkcUJnWDNhQVlKOXM0R0NmYk1CZzMyN2dZbDl1d0dLZmJ1QmluMjhBWXQ5dTRHTGZUR2FrSDhCbXFCL01TZ0FnZ0VvRklJeEpGaUNBU1JzZ2pFelFJWUJNMkNHTVNCUWpBRWdZSXd4SUNDM0FTQXd0ekVpZ1BRQklwSDBBRUhBalFJTDR3TUJBSndHQjAwREJCQUFqd3NBQUJFQUNBQlRTbEVBVWdCVEFEcFVWUUJYV1Q5ZFhBQkdZV05DWkFCbUFHZ0FhZ0JzQUc0QUFFQUFBQUFBR2dDVEFBQWdOUUFuQUNFQUpDSXFBQk5yYlFBbUpDY1VGaGdiSEQ0ZVB4ODVQU0loUVI1QUpTVW1LQ0FxU1N4RExrc3dUREpFUXBrQUFKV1BmWDZEaEJLQWduWjNFbnVqZkhoNWlwS1lwcUNGQUpxaGszVXpsUUNPQUhTWm1KZVdBQUNlQUp3QW9hQVZMaTh3dExWT3Fxa1NGQjRoSWlJcU5EV21wellmU2dBQWx3RmEyaDAyQlFERXc4YkZ5TWZLeWN6THhOVkYxa0xYUnRqTzBOTFUydG51OXY0T0J3K0Fud0FoZ0tQdEFNQkF4bURuMithWndBQUFCbURjS2YwVkVnWVcrTjBHRlJLRUNNWVcvOThEd0VBQVJtRGU0RzAzT0RrVkZCY1dBQm9aSEJzQVg3ZGxSRWNBVDJKT1VBQUFTQUFBQUtPa3BRQUFBQUFBdGdBQVdnQklBRnRXV0dCZWNHbHZUUUFBTzJlNEFBQkZxSXFMakt1c1dGaXZsTEJ2c2x4YlhsMWdYMkpoWkdObVpXaG5BQUFBQUFBQUFKa0RDQU1CQTZVREV3TUFBMElEa1FPWEE2a0RSZ0JKQUV3QVV3QnBBQWNEdkFKT0FFb0FEQU0xQlZJRlNBQXhBMVFBVndBS0Exa0FRUUMrQWdnZmdCOG9INUFmYUIrZ0g3b2ZoZ096SDhvZmlRUERINkVEK2grUEEvTWZSQVZHQlRzRlRnVTlCYmdEWWdSS3BtQWV5UU5yQU9VQVFiQ1JBZ3ZDQVVDcGdJNkEvSURUZ0l5QWpZR05Bb0RoZ0pHRm1nRUFBUkVBQVFRSUFRZ3dDQUVWSUFBNW1UR2RoRUNVZ05hQ3BvQkJZb0NtZ0ZkMitBS0FqNEN3UU5zSWdFSFFnSXlBajR6a0F3R0pBQlFvRUJFQ0FSZ0xKRXNtQVFHRzVZQmdlYmFCUUpHQnZZaVVCWUNZZ01lQ1F6U2lCb0NNWVNpVzFJREdBUWdKQzRDTEFBYUF3QU1QQm9DYkF3UUFGb0JCVTRHWWdKaUFub0NZZ0o2QW1JQ2VnSmlBbm9DWUIxbGptWVdaaFprQUFBQUF1UUxnb0I1QW5xWkF1dFFCaWRjQml2RUJBRUdBa3dJTHRBV21CWUNLZ0tJQWdNWURBQU1CZ1VIMlFMOFpHSWdJZ0VENmhrRE9CSUN3ckFBQkFRQ3JnSXFGaVlvQW9vQ0psSStBNURpSkE2QUFnSjJhMm9xNWloZ0lsNWVxZ3ZhdnRnQURPd0tHaVlHTWdJNkF1UU1mZ0pPQm1RR0J1QU1MQ1JLQW5RcUFpb0c0QXlBTGdKT0JsU2lBdVFFQUh3YUJpb0dkZ0x5QWk0Q3hBb0M0RkJBZWdZcUJuSUM1QVFVRWdaT0JtNEc0Q3grQWs0R2NnTWNHRUlEWkFZYUtpT0VCaUlnQWhjbUJtZ0FBZ0xhTkJBR0Vpb0NqaUlEbEdDZ0pnWmdMZ28rRGpBRU5nSTZBM1lCQ1g0SkRzWUtjZ3B5Qm5ZRy9DRGNCaWhBZ3JJT3pnTUNCb1lEMUU0R0lCWUpBMmdtQXVRQXdBQUU5aVFpbUI1QytnNjhBSUFTQXA0aUxnWjhaQ0lLM0FBb0Fncms1Z2IrRjBSQ01CaGdvRWJHK2pJQ2gzZ1JCdkFDQ2lvS01nb3lDaklHTEo0R0pBUUdFc0NDSkFJeUFqNHl5b0V1S2dmQ0MvSUNPZ04rZnJvQkIxSUNqR2lTQTNJWGNnbUJ2RllCRTRZVkJEWURoR0lrQW00UFBnWTJoellDV2d1d1BBZ09BbUF5QVFKYUJtWkdNZ0tXSG1JcXRncThCR1lHUWdKU0J3U2tKZ1lzSGdLS0Fpb0N5QUJFTUNJQ2FnSTBNQ0lEamhJaUMrQUVEZ0dCUEw0QkFrbzlDUFk4UWk0K2hBWUJBcUFZRmdJcUFvZ0NBcm9Dc2djS0FsSUpDQUlCQTRZQkFsSVJHaFJBTWc2Y1RnRUNrZ1VJOGcwR0NnVUNZaWtDdmdMV090NEt3R1FtQWpvQ3hncU1naDcyQWk0R3ppSWtaZ040UkFBMkFRSjhDaDVTQnVBcUFwREtFUU1JNUVJQ1dnTk1vQXdpQlFPMGRDSUdhZ2RRNUFJSHBBQUVvZ09RUkdJUkJBb2dCUVA4SUE0QkFqeGtMZ0orSnB5a2ZnSWdwZ3EyTUFVR1ZNQ2lBMFpVT0FRSDVLZ0FJTUlESENnQ0FRVnFCVlRxSVlEYTJoTHFHaUlORUNvQytrTDhJZ1dCTXR3aURWTUtDaUk4T25ZTkFrNEpIdXJhRHNUaU5nSlVnamtWUE1KQU9BUVJCQkkxQnJZTkYzNGJzaDBxdWhHd01BSUNkMy85QTd3QkJ3SmdDQzBLK0JRRCtCd0JTQ2lBRkRDQTdEa0JoRUVBUEdDQkRHMkI1SFFEeElBQU5wa0F1cVNEZXFnQVAveURuQ2tHQ0VTSEVGR0ZFR1FGSUhTR2t2QUUrNFFId0FRNEFRWkNaQWd1VkNNQ1poWm11Z0lrREJKYUFub0JCeVlPTGpTWUFnRUNBSUFrWUJRQVFBSk9BMG9CQWlvZEFwWUNsQ0lXb3hwb2JyS3FpQ09JQWpnNkJpUkdBandDZG5OaUtnSmVnaUFzRWxSaUlBb0NXbUlhS3RKU0FrYnUxRUpFR2lZNlBId21CbFFZQUV4Q1BnSXdJZ28yQmlRY3JDWlVHQVFFQm5oaUFrb0tQaUFLQWxRWUJCQkNSZ0k2QmxvQ0tPUW1WQmdFRUVKMElnbzZBa0FBcUVCb0lBQW9LRW91VmdMTTRFSmFBanhDWkZJR2RBemdRbG9DSkJCQ2ZBSUdPZ1pDSUFvQ29DSThFRjRLWExKR0NsNENJQUE2NXJ3R0xocmtJQUNDWEFJQ0pBWWdCSUlDVWc1K0F2amlqbW9UeXFwT0FqeXNhQWc0VGpJdUFrS1VBSUlHcWdFRk1BdzRBQTRHb0E0R2dBdzRBQTRHT2dMZ0RnY0trajQvVkRZSkNhNEdRZ0ptRXlvS0tob3dEalpHTmtZMk1BbzZ6b2dPQXd0aUdxQUNFeFltZXNKME1pcXVEbWJXV2lMVFJnTnl1a0lhMm5ZeUJpYXVabzZpQ2lhT0JpSWFxQ3FnWUtBb0VRTCsvUVJVTmdhVU5Ed0FBQUlDZWdiUUdBQklHRXcyRGpDSUc4NENNZ0krTTVBTUJpUUFOS0FBQWdJOExKQmlRcUVwMnJvQ3VnRUNFS3hHTHBRQWdnYmN3ajVhSU1EQXdNREF3TUlaQ0pZS1lpRFFNZzlVY2dOa0RoS3FBM1pDZnI0OUIvMW0vdjJCUi9JSkVqTUt0Z1VFTWdvK0pnWk91ajU2Qno2YUlnZWFCdElHSXFZd0NBNENXbkxPTnNiMHFBSUdLbTRtV21KeUdycHVBanlDSmlTQ29saENIazVZUWdyRUFFUXdJQUpjUmlqS0xLU21GaURBd3FvQ05oZktjWUN1amk1YURzR0FoQTBGdGdlbWxob3NrQUltQWpBUUFBUUdBNjZCQmFwRy9nYlduaS9NZ1FJYWptWVdaaXRnVkRRMEtvb3VBbVlDU0FZQ09nWTJoK3NTMFFRcWNnckN1bjR5ZGhLV0puWUdqSHdTcFFKMlJvNE9qZzZlSHMwQ2JRVGFJbFltSFFKY3BBS3NCRUlHV2laYUluc0NTQVltVmlabkZ0eW0vZ0k0WUVKeXBuSUtjb2ppYm1yV0psWW1TakpIdHlMYXlqTEtNbzBGYnFTbk5uSWtIbGVtVW1wYUx0TXFzbjVpWm81d0JCNklRaTYrTmc1UUFnS0tSZ0pqVE1BQVlqb0NKaHE2bE9RbVZCZ0VFRUpHQWk0UkFuYlNSZzVPQ25hK1RDSUJBdDY2b2c2T3ZrNEM2cW95QXhwcEE1S3Z6djU0NUFUZ0lsNDRBZ04wNXBvOEFnSnVBaWFjd2xJQ0tyWktBb2JoQkJvaUFwSkNBc0ozdk1BaWxsSUNZS0FpZmpZQkJScEpBdklET1E1bmw3cEJBdzBxN1JDNVAwRUpHWUNHNFFqaUdudkNka2ErUGc1NlVoSkpDcjcvL3lpREJqTDhJZ0p0WDk0ZEUxYW1JWUNMMlFSNndncEFmUVl0SkErcUVqSUtJaG9sWFpkU0F4Z0VJQ1F1QWl3QUdnTUFERHdhQW13TUVBQmFBUVZPQm1JQ1lnSjZBbUlDZWdKaUFub0NZZ0o2QW1BZEpNNnlKaG8rQVFYQ3JSUk5BeExyRE1FU3pHSm9CQUFpQWlRTUFBQ2dZQUFBQ0FRQUlBQUFBQUFFQUN3WURBd0NBaVlDUUlnU0FrRkZEWUtiZG9WQTBpa0RkZ1ZhQmpWMHdUQjVDSFVYaFUwb0FRYkNoQWd0ajlnTWdwZ2NBcVFrQXRBb0F1Z3NBUGcwQTRBNGdWeElBNnhZQXloa2d3QjFnZ0NBQUxpMEF3REVnaWFjZzhLa0E0NnNBUHYwQSt3QWhOd2RoQVFvQkhROGhMQklCeUJRaDBSa2hSeDBCT1dvaENZMEJ2TlFCcWRjaE91NEIzcVlpU3hNREFFR2dvZ0lMOGdTdmlhU0Exb0JDUisrV2dFRDZoRUVJckFBQkFRREhpcStlS09ReEtRZ1ppWmFBblpyYWlvNkpvSWlJZ0pjWWlBSUVxb0wyam9DZ3RSQ1JCb2tKaVpDQ3R3QXhDWUtJZ0lrSmlZMEJncmNBSXdrU2dKT0xFSXFDdHdBNEVJS1RDWW1KS0lLM0FERUpGb0tKQ1ltUmdMb2lFSU9JZ0kySmo0UzRNQkFlZ1lvSmlaQ0N0d0F3RUI2QmlnbUpqNE8yQ0RBUWc0aUFpUW1Ka0lMRkF5Z0FQWWtKdkFHR2l6aUoxZ0dJaWltSnZRMkppZ0FBQTRHd2t3R0Vpb0NqaUlEams0Q0ppeHNRRVRLRGpJdUFqa0srZ29pSVE1K0NuSUtjZ1oyQnY1K0lBWW1nRVlsQWpvRDFpNE9MaVluL2lydUV1SW1BbklHS2hZbVZqUUcraEs2UWlvbVFpSXVDbll5QmlhdU5yNU9IaVlXSjlSQ1VHQ2dLUU1XNUJFSStnWktBK293WWdvdEwvWUpBaklEZm4wSXBoZWlCWUhXRWljUURpWitCejRGQkR3SURnSllqZ05LQnNaR0ppWVdSaklxYmg1aU1xNE91alk2SmlvQ0ppYTZOaXdjSmlhQ0NzUUFSREFpQXFDU0JRT3M0Q1lsZ1R5T0FRdUNQajQ4Umw0SkF2NG1rZ0VLOGdFRGhnRUNVaEVFa2lVVldFQXlEcHhPQVFLU0JRandmaVVGd2dVQ1lpa0N1Z3JTT25vbU9nNnlLdElrcW80MkFpU0dyZ0l1Q3I0MDdnSXZSaXloQW40dUVpU3UyQ0RFSmdvaUFpUWt5aEVDL2tZaUpHTkNUaTRsQTFER0ltb0hSa0k2SjBJeUhpZEtPZzRsQThZNUFwSW5GS0FrWUFJR0xpZll4TW9DYmlhY3dINENJaXEyUFFaUTRoNCtKdDVXQWpma3FBQWd3QjRtdklBZ25pVUZJZzJCTGFJbEFoWVM2aHBpSlEvUUF0alBRZ0lxQllFeXFnVlRGSWk4NWhwMkRRSk9DUllpeFFmKzJnN0U0allDVklJNUZUekNRRGdFRVFRU0dpSWxCb1kxRjFZYnNOSWxTbFlsc0JRVkE3d0JCb0tjQ0M2TVMrZ1lBaEFrQThBb0FjQXdBOUEwQVNoQWdHaGdnZEJzZzNTQUFES2dBV3FvZ0d2OEFyUTRCT0JJaHdSVWg1UmtocWgwaGpORkJTdUVoOEFFT0FBQUFBRUZrYkdGdExFRmtiRzBBUVdodmJTeEJhRzl0QUVGdVlYUnZiR2xoYmw5SWFXVnliMmRzZVhCb2N5eEliSFYzQUVGeVlXSnBZeXhCY21GaUFFRnliV1Z1YVdGdUxFRnliVzRBUVhabGMzUmhiaXhCZG5OMEFFSmhiR2x1WlhObExFSmhiR2tBUW1GdGRXMHNRbUZ0ZFFCQ1lYTnpZVjlXWVdnc1FtRnpjd0JDWVhSaGF5eENZWFJyQUVKbGJtZGhiR2tzUW1WdVp3QkNhR0ZwYTNOMWEya3NRbWhyY3dCQ2IzQnZiVzltYnl4Q2IzQnZBRUp5WVdodGFTeENjbUZvQUVKeVlXbHNiR1VzUW5KaGFRQkNkV2RwYm1WelpTeENkV2RwQUVKMWFHbGtMRUoxYUdRQVEyRnVZV1JwWVc1ZlFXSnZjbWxuYVc1aGJDeERZVzV6QUVOaGNtbGhiaXhEWVhKcEFFTmhkV05oYzJsaGJsOUJiR0poYm1saGJpeEJaMmhpQUVOb1lXdHRZU3hEWVd0dEFFTm9ZVzBzUTJoaGJRQkRhR1Z5YjJ0bFpTeERhR1Z5QUVOb2IzSmhjMjFwWVc0c1EyaHljd0JEYjIxdGIyNHNXbmw1ZVFCRGIzQjBhV01zUTI5d2RDeFJZV0ZqQUVOMWJtVnBabTl5YlN4WWMzVjRBRU41Y0hKcGIzUXNRM0J5ZEFCRGVYSnBiR3hwWXl4RGVYSnNBRVJsYzJWeVpYUXNSSE55ZEFCRVpYWmhibUZuWVhKcExFUmxkbUVBUkdsMlpYTmZRV3QxY25Vc1JHbGhhd0JFYjJkeVlTeEViMmR5QUVSMWNHeHZlV0Z1TEVSMWNHd0FSV2Q1Y0hScFlXNWZTR2xsY205bmJIbHdhSE1zUldkNWNBQkZiR0poYzJGdUxFVnNZbUVBUld4NWJXRnBZeXhGYkhsdEFFVjBhR2x2Y0dsakxFVjBhR2tBUjJWdmNtZHBZVzRzUjJWdmNnQkhiR0ZuYjJ4cGRHbGpMRWRzWVdjQVIyOTBhR2xqTEVkdmRHZ0FSM0poYm5Sb1lTeEhjbUZ1QUVkeVpXVnJMRWR5WldzQVIzVnFZWEpoZEdrc1IzVnFjZ0JIZFc1cVlXeGhYMGR2Ym1ScExFZHZibWNBUjNWeWJYVnJhR2tzUjNWeWRRQklZVzRzU0dGdWFRQklZVzVuZFd3c1NHRnVad0JJWVc1cFptbGZVbTlvYVc1bmVXRXNVbTlvWndCSVlXNTFibTl2TEVoaGJtOEFTR0YwY21GdUxFaGhkSElBU0dWaWNtVjNMRWhsWW5JQVNHbHlZV2RoYm1Fc1NHbHlZUUJKYlhCbGNtbGhiRjlCY21GdFlXbGpMRUZ5YldrQVNXNW9aWEpwZEdWa0xGcHBibWdzVVdGaGFRQkpibk5qY21sd2RHbHZibUZzWDFCaGFHeGhkbWtzVUdoc2FRQkpibk5qY21sd2RHbHZibUZzWDFCaGNuUm9hV0Z1TEZCeWRHa0FTbUYyWVc1bGMyVXNTbUYyWVFCTFlXbDBhR2tzUzNSb2FRQkxZVzV1WVdSaExFdHVaR0VBUzJGMFlXdGhibUVzUzJGdVlRQkxZWGxoYUY5TWFTeExZV3hwQUV0b1lYSnZjMmgwYUdrc1MyaGhjZ0JMYUcxbGNpeExhRzF5QUV0b2IycHJhU3hMYUc5cUFFdG9hWFJoYmw5VGJXRnNiRjlUWTNKcGNIUXNTMmwwY3dCTGFIVmtZWGRoWkdrc1UybHVaQUJNWVc4c1RHRnZid0JNWVhScGJpeE1ZWFJ1QUV4bGNHTm9ZU3hNWlhCakFFeHBiV0oxTEV4cGJXSUFUR2x1WldGeVgwRXNUR2x1WVFCTWFXNWxZWEpmUWl4TWFXNWlBRXhwYzNVc1RHbHpkUUJNZVdOcFlXNHNUSGxqYVFCTWVXUnBZVzRzVEhsa2FRQk5ZV3RoYzJGeUxFMWhhMkVBVFdGb1lXcGhibWtzVFdGb2FnQk5ZV3hoZVdGc1lXMHNUV3g1YlFCTllXNWtZV2xqTEUxaGJtUUFUV0Z1YVdOb1lXVmhiaXhOWVc1cEFFMWhjbU5vWlc0c1RXRnlZd0JOWVhOaGNtRnRYMGR2Ym1ScExFZHZibTBBVFdWa1pXWmhhV1J5YVc0c1RXVmtaZ0JOWldWMFpXbGZUV0Y1Wldzc1RYUmxhUUJOWlc1a1pWOUxhV3RoYTNWcExFMWxibVFBVFdWeWIybDBhV05mUTNWeWMybDJaU3hOWlhKakFFMWxjbTlwZEdsalgwaHBaWEp2WjJ4NWNHaHpMRTFsY204QVRXbGhieXhRYkhKa0FFMXZaR2tzVFc5a2FRQk5iMjVuYjJ4cFlXNHNUVzl1WndCTmNtOHNUWEp2YndCTmRXeDBZVzVwTEUxMWJIUUFUWGxoYm0xaGNpeE5lVzF5QUU1aFltRjBZV1ZoYml4T1ltRjBBRTVoYm1ScGJtRm5ZWEpwTEU1aGJtUUFUbVYzWDFSaGFWOU1kV1VzVkdGc2RRQk9aWGRoTEU1bGQyRUFUbXR2TEU1cmIyOEFUblZ6YUhVc1RuTm9kUUJPZVdsaGEyVnVaMTlRZFdGamFIVmxYMGh0YjI1bkxFaHRibkFBVDJkb1lXMHNUMmRoYlFCUGJGOURhR2xyYVN4UGJHTnJBRTlzWkY5SWRXNW5ZWEpwWVc0c1NIVnVad0JQYkdSZlNYUmhiR2xqTEVsMFlXd0FUMnhrWDA1dmNuUm9YMEZ5WVdKcFlXNHNUbUZ5WWdCUGJHUmZVR1Z5YldsakxGQmxjbTBBVDJ4a1gxQmxjbk5wWVc0c1dIQmxid0JQYkdSZlUyOW5aR2xoYml4VGIyZHZBRTlzWkY5VGIzVjBhRjlCY21GaWFXRnVMRk5oY21JQVQyeGtYMVIxY210cFl5eFBjbXRvQUU5eWFYbGhMRTl5ZVdFQVQzTmhaMlVzVDNOblpRQlBjMjFoYm5saExFOXpiV0VBVUdGb1lYZG9YMGh0YjI1bkxFaHRibWNBVUdGc2JYbHlaVzVsTEZCaGJHMEFVR0YxWDBOcGJsOUlZWFVzVUdGMVl3QlFhR0ZuYzE5UVlTeFFhR0ZuQUZCb2IyVnVhV05wWVc0c1VHaHVlQUJRYzJGc2RHVnlYMUJoYUd4aGRta3NVR2hzY0FCU1pXcGhibWNzVW1wdVp3QlNkVzVwWXl4U2RXNXlBRk5oYldGeWFYUmhiaXhUWVcxeUFGTmhkWEpoYzJoMGNtRXNVMkYxY2dCVGFHRnlZV1JoTEZOb2NtUUFVMmhoZG1saGJpeFRhR0YzQUZOcFpHUm9ZVzBzVTJsa1pBQlRhV2R1VjNKcGRHbHVaeXhUWjI1M0FGTnBibWhoYkdFc1UybHVhQUJUYjJka2FXRnVMRk52WjJRQVUyOXlZVjlUYjIxd1pXNW5MRk52Y21FQVUyOTViMjFpYnl4VGIzbHZBRk4xYm1SaGJtVnpaU3hUZFc1a0FGTjViRzkwYVY5T1lXZHlhU3hUZVd4dkFGTjVjbWxoWXl4VGVYSmpBRlJoWjJGc2IyY3NWR2RzWndCVVlXZGlZVzUzWVN4VVlXZGlBRlJoYVY5TVpTeFVZV3hsQUZSaGFWOVVhR0Z0TEV4aGJtRUFWR0ZwWDFacFpYUXNWR0YyZEFCVVlXdHlhU3hVWVd0eUFGUmhiV2xzTEZSaGJXd0FWR0Z1WjNWMExGUmhibWNBVkdWc2RXZDFMRlJsYkhVQVZHaGhZVzVoTEZSb1lXRUFWR2hoYVN4VWFHRnBBRlJwWW1WMFlXNHNWR2xpZEFCVWFXWnBibUZuYUN4VVptNW5BRlJwY21oMWRHRXNWR2x5YUFCVloyRnlhWFJwWXl4VloyRnlBRlpoYVN4V1lXbHBBRmRoYm1Ob2J5eFhZMmh2QUZkaGNtRnVaMTlEYVhScExGZGhjbUVBV1dWNmFXUnBMRmxsZW1rQVdXa3NXV2xwYVFCYVlXNWhZbUY2WVhKZlUzRjFZWEpsTEZwaGJtSUFRZEM1QWd1eEZNQVptVVdGR1psRnJobUFSWTRaZ0VXRUdaWkZnQm1lUllBWjRXQkZwaG1FUllRWmdRMlRHZUFQTjRNcmdCbUNLd0dESzRBWmdDc0RnQ3VBR1lBcmdCbUNLd0NBS3dDVEt3QytLNDBhanl2Z0pCMkJOK0JJSFFDbEJRR3hCUUdDQlFDMk5BZWFOQU9GTkFxRUJJQVpoUVNBR1kwRWdCbUFCQUNBQklBWm53U0FHWWtFaWplWkJJQTM0QXNFZ0JtaEJJMkhBTHVIQVlLSHJ3U3hrUTI2WXdHQ1k2MTdBWTU3QUp0UUFZQlFBSXFITkpRRUFKRUVDbzRFZ0JtY0JOQWZnemVPSDRFWm1SK0RDd0NIQ3dHQkN3R1ZDd0NHQ3dDQUN3S0RDd0dJQ3dHQkN3R0RDd2VBQ3dPQkN3Q0VDd0dZQ3dHQ0xnQ0ZMZ09CTGdHVkxnQ0dMZ0NCTGdDQkxnQ0JMZ0dBTGdDRUxnT0JMZ0dDTGdLQUxnYURMZ0NBTGdhUUxnbUNMQUNJTEFDQ0xBQ1ZMQUNHTEFDQkxBQ0VMQUdKTEFDQ0xBQ0NMQUdBTEE2RExBR0xMQWFHTEFDQ2NBQ0hjQUdCY0FHVmNBQ0djQUNCY0FDRWNBR0ljQUdCY0FHQ2NBYUNjQU9CY0FDRWNBR1JjQW1CamdDRmpnS0NqZ0NEamdLQmpnQ0FqZ0NCamdLQmpnS0NqZ0tMamdPRWpnS0NqZ0NEamdHQWpnV0FqZzJVamdTTWtBQ0NrQUNXa0FDUGtBS0hrQUNDa0FDRGtBYUJrQUNDa0FTRGtBR0prQWFJa0l3OEFJSThBSlk4QUlrOEFJUThBWWc4QUlJOEFJTThCb0U4Qm9BOEFJTThBWWs4QUlFOERJeFBBSUpQQUxKUEFJSlBBSVZQQTQ5UEFabFBBSUtCQUpHQkFwZUJBSWlCQUlDQkFZYUJBb0NCQTRXQkFJQ0JBSWVCQlltQkFZS0JDN21TQTRBWm01SWtnVVFBZ0VRQWhFUUFsMFFBZ0VRQWxrUUJoRVFBZ0VRQWhVUUJpVVFCZzBRZng1TUFvNU1EcHBNQW81TUFqcE1BaHBPREdZR1RKT0EvWHFVbkFJQW5CSUFuQWFvbmdCbURKK0NmTU1nbUFJTW1BWVltQUlBbUFJTW1BYWdtQUlNbUFhQW1BSU1tQVlZbUFJQW1BSU1tQVk0bUFMZ21BSU1tQWNJbUFaOG1BcGttQmRVWEFZVVhBZUlmRXB4bUFzcDZnaG1LZWdhTWlBQ0dpQXFVTW9FWkNKTVJDNHlKQUlLSkFJR0pDOTFBQVlsQUJZbEFCWUZiZ1JtQVc0QVppRnNBaVZzRjJGc0dxbHNFeFJJSm5rY0FpMGNEaTBjRGdFY0NpMGVkaWdHRWlncXJZUU9aWVFXS1lRS0JZWjlBbXhBQmdSQytpd0NjaXdHS2l3V0ppd1dOaXdHUU56N0xCd09zQndLL2hiTUtCNE1LdDBZQ2prWUNna2F2WjRnZEJxb25BWUluaDRVSGdqZUFHWXczZ0JtR040TVpnRGVGR1lBM2dobUJONEFaQktWRmhDdUFIYkJGaEN1RFJZUXJqRVdBSGNWRmdDdTVOd0NFTitDZlJaVXJBWVVyQWFVckFZVXJBWWNyQUlBckFJQXJBSUFyQUo0ckFiUXJBSTRyQUkwckFZVXJBSklyQVlJckFJZ3JBSXNaZ1RmV0dRQ0tHWUJGQVlvWmdFV09HUUNNUlFLZkdRK2dOdzZsR1lBcmdobUJSWVVaZ0VXYUdZQkZrQm1vUllJWkErSTJHUmlLR1JUalB4bmdudy9pRXhrQm54a0E0QWdacmlnQXJpZ0FuMFhnRXhvRWhocWxKd0NBSndTQUp3RzNsQWFCbEEyQWxKWW1DSVltQUlZbUFJWW1BSVltQUlZbUFJWW1BSVltQUlZbUFKOGQwaGtzbVM4QTJDOEw0SFV2R1lzWkE0UVpnQytBR1lBdm1CbUlMNE0zZ1RDSEdZTXZneGtBMVRVQmdUZUJHWUkxZ0JuWlBZRVpnajBFcWcwQTNUQUFqeG1mRGFNWkM0ODluakFBdnhtZU1OQVpyajJBR2RjOTRFY1o4QWxmTDc4WjhFR2NMd0xrTEpzQ3Rwc0lyMHJneTVjVDN4M1hDQWVoR2VBRlJZSVp0RVVCaUVVcGlrV3NoZ0tKR1FXM2RnZkZmQWVMZkFXZkg2MCtnQm1BUHFONUNvQjVuREFDelRvQWdCbUpPZ09CT3A1ZUFMWVdDSTBXQVlrV0FZTVduMTdDakJlRWpKWlZDWVVtQVlVbUFZVW1DSVltQUlZbUFLcEZnQm1JUllBcmcwV0JHUVBQRjYxVkFZbFZCZkFiUXpBTGxqQURzREJ3RUtQaERTOEI0QWt2SllaRkM0UUZCSmswQUlRMEFJQTBBSUUwQUlFMEFJazA0QkVFRU9FS0JJRVpENzhFQWJVRUo0MEVBWTgzaVJrRmpUZUJIYUlaQUpJWkFJTVpBNFFFQU9BbUJBR0FHUUNmR1psRmhSbVpSWW9aaVQyQUdhdzlnUm1lTUFLRk1BR0ZNQUdGTUFHQ01BS0dHUUNHR1FtRUdRR0xTUUNaU1FDU1NRQ0JTUUNPU1FHTlNTSGdHa2tFZ2hrRHJCa0NpQm5PS3dDTUdRS0FLeTZzR1lBM1lDR2NTd0t3RXc2QU41b1pBNk5wQ0lKcG1pa0VxbXNFblpZQWdKYWpiQU9OYkNuUEhxOStuWElCaVhJRm8zRURvM0VEcHlRSHN4UUtnQlJnTCtEV1NBaVZTQW1IU0dBM2hSd0JnQndBcXh3QWdSd0NnQndCZ0J5Vk5nQ0lOcDkwbmw4SGlGOHZrak1BZ1RNRWhET2Jkd0tBZDVsTUJJQk1QNTlZbDFjRGsxY0JyVmVEUHdDQlB3U0hQd0NDUHdDY1B3R0NQd09KUHdhSVB3YWZicDlxSDZaUkE0dFJDTFVHQW9ZR2xUa0Joem1TT0FTSE9KRjRCb040QzRaNFQ4aHZOckpvRExKb0JvVm9wekVIaVRGZ3haNEVBS21hQUlLYUFZR2FUYWR0QjZtQ1Zac1lFNVlsQ00wT0E1ME9Eb0FPd1RzS2dEc0JtSU1HaVlNRnRCVUFrUlVIcGs0STMzMEFrNEVLa1VFQXEwRkFobDBBZ0YwQWcxMEFqbDBBaWwwRnVrTUVpVU1GZ3lvQWh5b0JnU29CbFNvQWhpb0FnU29BaENvQWdEZUlLZ0dCS2dHQ0tnR0FLZ1dBS2dTR0tnR0dLZ0tFS21BcTIySUFoR0lkeDVVSGlaVmdSYlYvQWFWL0ljUmFDb2xhQll4YkVyaU5Cb21OTlpvQ0FZNENBNDhDWUYrN0lXQUQwcGtMZ0ptR0lBR0FJQUdISUFDQklBQ2RJQUNCSUFHTElBaUpJRVdIWUFHdFlBR0tZQnJIbkFmU2hCeTRkV0NtaUF3QXJBd0FqUXdKbkF3Q24xSUJsVklBalZKSWhsTUFnVk1BcTFNQ2dGTUFnVk1BaUZNSGlWTUZoUzBBZ1MwQXBDMEFnUzBBaFMwR2lTMWcxWmhOWUZhQVNnNnhqZ3lBanVNNUcyQUY0QTRiQUlRYkN1QmpHMnBiNDg0akFJZ2piMmJoNWdOd0VWamgyQWdHbmx3QWlWd0RnVnhmblFrQmhRa0p4WE1KaVhNQWhuTUFsSE1Fa25OaVQ5cFVZQVRLV1FPNFdRYVFXVCtBajRCa2dSbUFRZ3FCTHczd0I1ZVBCK0tmaitGMVFpbUlqM0FTbG9BOTRMMDFNSUkxRUlNOUIrRXJaR2lqNEFvaUJJd2lBb2dpQm9raUFZTWlneGx3QXZ2Z2xSa0pwaGtCdlJtQ041QVpoemVCR1lZM25SbURON29aRnNVcllEbVRHUXZXR1FpWUdXQW0xQmtBeGhrQWdSa0JnQmtCZ1JrQmd4a0FpeGtBZ0JrQWhoa0F3QmtBZ3hrQmh4a0FoaGtBbXhrQWd4a0FoQmtBZ0JrQ2hoa0E0UE1aQWVEREdRR3hHZUlyZ0E2RWdBQ09nR1R2aGlnQWtDZ0JoaWdBZ1NnQWhDaGdkS3hsQW8xbEFZbGxBNEZsWVErNW1BU0FtR1NmNEdSV0FZOVdLTXNCQTRrQkE0RUJZckRER1V1OEdXQmhnd1FBbWdRQWdRUUFnQVFCZ0FRQWlRUUFnd1FBZ0FRQWdBUUZnQVFEZ0FRQWdBUUFnQVFBZ2dRQWdRUUFnQVFCZ0FRQWdBUUFnQVFBZ0FRQWdBUUFnUVFBZ0FRQmd3UUFoZ1FBZ3dRQWd3UUFnQVFBaVFRQWtBUUVnZ1FBaEFRQWtBUXpnUVJncmFzWkErQURHUXVPR1FHT0dRQ09HUUNrR1FuZ1RSazNtUm1BTllFWkRLc1pBNGdaQm9FWkRZVVpZRG5qZHhrSGpCa0NqQmtDNEJNWkM5Z1pCb3NaRTRzWkE3Y1pCNGtaQmFjWkI1MFpBWUVaVGVBWUdRRFJHUURnSmhrTGpSa0JoQmtDZ2hrRWhoa0ltQmtHaGhrSWdoa01oaGtvNERJWkFMWVpKSWtaWTZYd2xuMHZJZS9VTHdyZ2ZTOEI4QVloTHczd0ROQXZhNzdodlM5bGdmQUM2aTk2M0ZXQUdSM2ZHV0FmNEk4M0FFR1F6Z0lMc2d1Q3dRQUFBU3NCQUFBQkt4d0FEQUZGZ0pJQUFBSWRhd0FDSFNnQkFoMUZBQUlkS0lFREFBQUZCREdIa1pvTkFBQUZCREdIa1pvQUF3U0hrUUVBQUFVRU1ZZVJtaDhBQUFnQkJGQlJlREdDaHdrQUNnSUVod2tBQ1FNRWtab0ZBQUFDQklkaUFBQUNCREdCK3dBQURRc2ZLaXd1UEVWUGNIMk9rSlVBREFzZktpd3VQRVZQY0k2UWxSQUFBQlFMSHlFdFV5b3NManhPVDJCd1E0R0dqWTZRbFFBVkN4OGhMVk1xTEM0OFIwNVBZSEJEZ1lhTmpwQ1ZDUVFmSVR0T2RRQUpBd3NWaG5VQUNRSXVYWFVBQ1FJc1FZQjFBQTBDS282QWNRQUpBanhnZ3M4QUNRTVZYb3FBTUFBQUFpZEZoYmdBQVFRUk1vbUlnRW9BQVFKYmRnQUFBQUpiZG9SSkFBQUVDeDhxUEFBQkh3QUVDeDhxUEFBQ0h5b0FBUjhCQWdzZkFBSWZmUUFDQ3g4QUFoOTlBQVlmUEU5d2pwQUFBUjhCQWg5OUFRRWZBQUlmZlFBQ0N4OEdBUjhBQWg5Z0FBSUxId0VCSHdBQ0N4OERBUjhBQ0FzZktqeGdjSkNWQUFJZktnQURIeW84QVFJTEh3QUJDd0VDSHlvQUFXQ0FSQUFCQVNzMUFBQUNIWWVCdFFBQUFrVmJnRDhBQUFNZktrV00wUUFBQWgwb2dUd0FBUVlOTUM4MVBac0FCUTB3THpVOUFRQUFBUzhBQUFrR0RUQXZOVDJiQUFBQUJRMHdMelU5QndZTk1DODFQWnNEQlEwd0x6VTlDUUFEQWcwdkFRQUFCUTB3THpVOUJBSTFQUUFBQUFVTk1DODFQUU1BQVFNdk5UMEJBUzlZQUFNQ05UMENBQUFDTlQxWkFBQUdEVEF2TlQyYkFBSTFQWUFTQUE4Qkx4OEFJd0V2T3dBbkFTODNBREFCTHc0QUN3RXZNZ0FBQVM5WEFCZ0JMd2tBQkFFdlh3QWVBUy9BTWU4QUFBSWRLSUFQQUFjQ0wwV0Fwd0FDRGg4aExDNUJQRHRPVDFwZ1E0MlZBZzBmSVN3dVFUdzdUbHBnUTQyVkF3c2ZJU3d1UVR0T1drT05sWUEyQUFBQ0N4OEFBQUFDSDQ0NUFBQURQa1ZlZ0I4QUFBSVFPc0FUb1FBQUFnU1JDUUFBQWdTUlJnQUJCUTB3THpVOWdKa0FCQVlOTUM4MVBac0pBQUFDTlQwc0FBRUNOVDJBM3dBQ0FoeEpBd0FzQXh4SVNRSUFDQUljU1lFZkFCc0NCQnFQaEFBQUFpcU9BQUFBQWlxT05nQUJBaXFPakJJQUFRSXFqZ0FBQUFJcWpzQmNTd0FEQVNLV093QVJBUytlWFFBQkFTL096UzBBQUVOdUxGVnVZWE56YVdkdVpXUUFUSFVzVlhCd1pYSmpZWE5sWDB4bGRIUmxjZ0JNYkN4TWIzZGxjbU5oYzJWZlRHVjBkR1Z5QUV4MExGUnBkR3hsWTJGelpWOU1aWFIwWlhJQVRHMHNUVzlrYVdacFpYSmZUR1YwZEdWeUFFeHZMRTkwYUdWeVgweGxkSFJsY2dCTmJpeE9iMjV6Y0dGamFXNW5YMDFoY21zQVRXTXNVM0JoWTJsdVoxOU5ZWEpyQUUxbExFVnVZMnh2YzJsdVoxOU5ZWEpyQUU1a0xFUmxZMmx0WVd4ZlRuVnRZbVZ5TEdScFoybDBBRTVzTEV4bGRIUmxjbDlPZFcxaVpYSUFUbThzVDNSb1pYSmZUblZ0WW1WeUFGTnRMRTFoZEdoZlUzbHRZbTlzQUZOakxFTjFjbkpsYm1ONVgxTjViV0p2YkFCVGF5eE5iMlJwWm1sbGNsOVRlVzFpYjJ3QVUyOHNUM1JvWlhKZlUzbHRZbTlzQUZCakxFTnZibTVsWTNSdmNsOVFkVzVqZEhWaGRHbHZiZ0JRWkN4RVlYTm9YMUIxYm1OMGRXRjBhVzl1QUZCekxFOXdaVzVmVUhWdVkzUjFZWFJwYjI0QVVHVXNRMnh2YzJWZlVIVnVZM1IxWVhScGIyNEFVR2tzU1c1cGRHbGhiRjlRZFc1amRIVmhkR2x2YmdCUVppeEdhVzVoYkY5UWRXNWpkSFZoZEdsdmJnQlFieXhQZEdobGNsOVFkVzVqZEhWaGRHbHZiZ0JhY3l4VGNHRmpaVjlUWlhCaGNtRjBiM0lBV213c1RHbHVaVjlUWlhCaGNtRjBiM0lBV25Bc1VHRnlZV2R5WVhCb1gxTmxjR0Z5WVhSdmNnQkRZeXhEYjI1MGNtOXNMR051ZEhKc0FFTm1MRVp2Y20xaGRBQkRjeXhUZFhKeWIyZGhkR1VBUTI4c1VISnBkbUYwWlY5VmMyVUFURU1zUTJGelpXUmZUR1YwZEdWeUFFd3NUR1YwZEdWeUFFMHNUV0Z5YXl4RGIyMWlhVzVwYm1kZlRXRnlhd0JPTEU1MWJXSmxjZ0JUTEZONWJXSnZiQUJRTEZCMWJtTjBkV0YwYVc5dUxIQjFibU4wQUZvc1UyVndZWEpoZEc5eUFFTXNUM1JvWlhJQVFkRFpBZ3V3Q0E0QUFBQStBQUFBd0FFQUFBQU9BQUFBOEFBQUFBQi9BQUFBZ0FNQkFBQThRVk5EU1VsZlNHVjRYMFJwWjJsMExFRklaWGdBUW1sa2FWOURiMjUwY205c0xFSnBaR2xmUXdCRVlYTm9BRVJsY0hKbFkyRjBaV1FzUkdWd0FFUnBZV055YVhScFl5eEVhV0VBUlhoMFpXNWtaWElzUlhoMEFFaGxlRjlFYVdkcGRDeElaWGdBU1VSVFgwSnBibUZ5ZVY5UGNHVnlZWFJ2Y2l4SlJGTkNBRWxFVTE5VWNtbHVZWEo1WDA5d1pYSmhkRzl5TEVsRVUxUUFTV1JsYjJkeVlYQm9hV01zU1dSbGJ3QktiMmx1WDBOdmJuUnliMndzU205cGJsOURBRXh2WjJsallXeGZUM0prWlhKZlJYaGpaWEIwYVc5dUxFeFBSUUJPYjI1amFHRnlZV04wWlhKZlEyOWtaVjlRYjJsdWRDeE9RMmhoY2dCUVlYUjBaWEp1WDFONWJuUmhlQ3hRWVhSZlUzbHVBRkJoZEhSbGNtNWZWMmhwZEdWZlUzQmhZMlVzVUdGMFgxZFRBRkYxYjNSaGRHbHZibDlOWVhKckxGRk5ZWEpyQUZKaFpHbGpZV3dBVW1WbmFXOXVZV3hmU1c1a2FXTmhkRzl5TEZKSkFGTmxiblJsYm1ObFgxUmxjbTFwYm1Gc0xGTlVaWEp0QUZOdlpuUmZSRzkwZEdWa0xGTkVBRlJsY20xcGJtRnNYMUIxYm1OMGRXRjBhVzl1TEZSbGNtMEFWVzVwWm1sbFpGOUpaR1Z2WjNKaGNHZ3NWVWxrWlc4QVZtRnlhV0YwYVc5dVgxTmxiR1ZqZEc5eUxGWlRBRmRvYVhSbFgxTndZV05sTEhOd1lXTmxBRUpwWkdsZlRXbHljbTl5WldRc1FtbGthVjlOQUVWdGIycHBBRVZ0YjJwcFgwTnZiWEJ2Ym1WdWRDeEZRMjl0Y0FCRmJXOXFhVjlOYjJScFptbGxjaXhGVFc5a0FFVnRiMnBwWDAxdlpHbG1hV1Z5WDBKaGMyVXNSVUpoYzJVQVJXMXZhbWxmVUhKbGMyVnVkR0YwYVc5dUxFVlFjbVZ6QUVWNGRHVnVaR1ZrWDFCcFkzUnZaM0poY0docFl5eEZlSFJRYVdOMEFFUmxabUYxYkhSZlNXZHViM0poWW14bFgwTnZaR1ZmVUc5cGJuUXNSRWtBU1VSZlUzUmhjblFzU1VSVEFFTmhjMlZmU1dkdWIzSmhZbXhsTEVOSkFFRlRRMGxKQUVGc2NHaGhZbVYwYVdNc1FXeHdhR0VBUVc1NUFFRnpjMmxuYm1Wa0FFTmhjMlZrQUVOb1lXNW5aWE5mVjJobGJsOURZWE5sWm05c1pHVmtMRU5YUTBZQVEyaGhibWRsYzE5WGFHVnVYME5oYzJWdFlYQndaV1FzUTFkRFRRQkRhR0Z1WjJWelgxZG9aVzVmVEc5M1pYSmpZWE5sWkN4RFYwd0FRMmhoYm1kbGMxOVhhR1Z1WDA1R1MwTmZRMkZ6WldadmJHUmxaQ3hEVjB0RFJnQkRhR0Z1WjJWelgxZG9aVzVmVkdsMGJHVmpZWE5sWkN4RFYxUUFRMmhoYm1kbGMxOVhhR1Z1WDFWd2NHVnlZMkZ6WldRc1ExZFZBRWR5WVhCb1pXMWxYMEpoYzJVc1IzSmZRbUZ6WlFCSGNtRndhR1Z0WlY5RmVIUmxibVFzUjNKZlJYaDBBRWxFWDBOdmJuUnBiblZsTEVsRVF3Qk1iM2RsY21OaGMyVXNURzkzWlhJQVRXRjBhQUJWY0hCbGNtTmhjMlVzVlhCd1pYSUFXRWxFWDBOdmJuUnBiblZsTEZoSlJFTUFXRWxFWDFOMFlYSjBMRmhKUkZNQVFaRGlBZ3UwSUlFQUtBQ1hBQ29BZ1lBcUFKZkFLd0FWZ1N3QWx3QXRBSUZBTFFDWEFDNEFGVUV1QUprQkx3QVdJREFBUWdoQUFFS0tSQUJDQkVvQWxnQk1BQmVCVEFCQ0FrMEFRa05PQUMvQlR3QkN3MUFBdjBCU0FFSURVd0JDQ1ZVQVFnaGFBSllBWGdCQ1ExNEFnY0JmQUVJQmFBQkN3V3NBaFFGeEFCZkRjUUJFU0hNQVJJTjNBRUtEZVFDK0Fuc0FsMEY4QUVJQmZRQkVCSDRBUWc2QUFFS0Jod0JFaDRrQWd3U3NBQmNEdGdDREFyZ0FGQUxRQUpZQTBRQ0FBTjBBbDREZUFJQ0Ezd0NYQU9FQVBrSGhBSURBNFFDK0JPSUFyb1BxQUs2QzhnQ3RBZlFBTHNIMEFBTkI5UUFEQS93QWdVRCtBRDRDQUFHK3dBRUJ2Z0VEQWI1QUJnRytRQTRCUGdJVUFiN0FGUUcrQVJjQlJJRWRBVVJCTUFGRUFqUUJSSUUxQVVTRE5nRkVnemdCUklZNkFVUUJQZ0dGd0dFQnJvS0lBUzlDblFHRUFiQUJoTUMwQVlSQVNnS0VRRXdDaEFCTkFpNEVWZ0l1d1hJQ0lBRjNBb1RBZHdLRXdJd0NoSUNOQXE1QmxnS0VnSmNDaEFEU0FpN0IwZ0lnQWRjQ2hBRGxBcTZCOGdLRUFCSURoQUF3QXlMQk1RTXVnVElEcm9GU0E0U0FkZ091QVhjRGhjQ01BNFhBckFNdkFiY0RnUUREQTRUQTBBT0VRTk1EaElEVUE0VEExUU9FQU5jRGhFRGFBNFRBM0FNdVFkMERoY0RkQTRRQTNnT0ZRTjREaEVEZ0E0VEE1QU9FUU9jRGhJRG9BNFRBNlFPRUFPc0RoRUR1QTRTQUNRU0JBRDhFaElUQkJvU0F4QWFFd2M0R0lBSFFCb1RBMEFhREEwc0hIOFJNQjRNWFR3ZUJBRjRIZzlKbUIwUWRnQWRDaVk0SFJCaVRCMElObndjV2dxVUhoWUNtQjc3QXBnZEVEYWdIUktDdUJ5SUJ3QWRFZzhBSElnSENCMFNEd2djaUFjUUhSSUxFQnlJQnhnZEVnc1lIUGhISUIwU0MwQWNpQWRJSFJJTFNCeUlCMUFkRWc5UUhQa3pXQjRCQTNBZStnTndIZ01EY0I3NEEzUWVBUU4wSHZvRGRCNERBM1FlK0FONEhnRURlQjc2QTNnZUF3TjRIdmdEZkI0QkEzd2NnQ09BSElBamtCeUFJNkFlK0Jld0hnTUR1Qjc0QTd3ZVhRTzhIZ0lEdkJ4ZkI3d2MrUlBBSGdFRHlCNzZBOGdlQXdQSUh2Z1B6QjREQTlBZXVndlVIZ01EMkJ6NUQ5d2VBd1BnSHJnUDVCNERBK2djK0Fmc0hBb0g3Qjc2RC9BZUFRUDRIdm9EK0I0REEvZ2UrQVA4SGdFRC9CNWVBL3djZUFRQUlsWVFBQ0lGQUJBaVh3QVVJZ1FBSkNKZEFDUWlaZ0FrSWdjQUxDSVhBREFpeEFBMEloWUFOQ0xIQURRaVhBUThJbDhFUkNMUEFGUWlCd0JjSWxRVWNDSUhBSGdnVkFoOElId1VnQ0lPRklnZ1ZSQ1VJbHdBcUNCa0JRQWlCZ0VBSXY4QkFDQmxCUVFpQndFRUl2MEJDQ0MyRlFnaUJRRVVJbDRCRkNKVkNSZ2lYQUVnSW1VQklDSmVBU0FpQkFFa0lnSUJKQ0lFQVNnZ0NnVW9JbFFSTENCOUNUUWlCUUU0SW1jQk9DSU1DVHdpVlFsRUlHUUZVQ0p1QVZBZ1p4bFFJbDhCWENJRUFXQWlYUUZnSW1ZQllDSmZBV0FpQkFGa0lsMEJaQ0ptQVdRaWJ3RmtJbHdCYUNJRkFXZ2lYZ0ZvSW1jQmFDSlVDV3dpWFFGd0ltWUJjQ0pmQVhBaUJBRjBJbDBCZENKbUFYUWlid0YwSWx3QmVDSUZBWGdpWGdGNEltY0JlQ0JVQ1h3aVpRR0lJUG9GbUNMNkFhd2krUVhNSXZnQ0JDTDVBZ2dpK0FJTUl2Z0dKQ0lVQWl3aXhRSXNJaGNDTENMRUFqQWkrUUpBSXZnQ1JDTDdCa1FpK0FaZ0l2a0tiQ0VRQm5RaEVBWjRJUkFHZ0NFUUJvUWhFQWFJSVBnS3JDRVFDdUFnZ2dyb0lIa0hLQ0o4RUdBa2pSUm9KbDhBY0NhVUVIUWtyUlI4Sm04QWhDYUVFSWdrbFJTUUptY0FtQ1NVTkp3a2ZqUzBKSHcwMENZR0FPZ216QUlNS21RQ2RDcGRBblFxWmdKMEt2Z0MzQ2hVQkh3dUJ3RnNMZ2NDbkM0SEF2QXV0Qk1BTHJVVENDNjJFeEF1RDg4WUxMWVhnQ3dNZDR3c3RpUEVMZ1FBQURJT0NEUXlFQ3hNTWhFSVpEQ0lCSEF3aXdSd01Jb0VkRENKQkhnd2lBUjhNaEFBbERDUEJKZ3lFZ0NjTWhjQW5ESVFMS3d5RVFqRU1JZ0UwRENMQk5Bd2lnVFVNSWtFMkRDSUJOd3lFQUQwTUlNSTlESVNBUHd5RndEOE1MVXBNREI5RlVReWZ5bE1NclJWWkRBT0haQXhCQjRBTWlZQ0REQ25CZ3d5cFFZUU1pUUNGRENsQmhReXB3b1VNaVFDSERJOUFod3lOZ0ljTVFSS0lEQU1Da1F5WkFKUU1vMFNVRENPRGxnd3RCNWdNcjRTYkRLSENuUXkxQUo4TXMwQ2ZESVdBbnd5REdLQU1JMEtzRENORnJReVh3SzhNb1FTd0RLVkJzZ3lYQUxNTW1VQ3pESmVBc3d5WndMTU1yUmUwRElYQXZ3eXpBY0FNc2NEQURMTUF3UXd4UWNFTXRjREJETE1Bd2d5eFFjSU1Nd0hERERHQnd3eUZBTVFNc1VERURET0J4QXlGQU1VTXRVREZETGVBeFF5MXdNVU1zUURHRERWQnhneXp3TVlNc1FISERMUEF4d3kxQU1nTXMwRElETEdCeUF3dlFza01NVUhLRExYQXlneXhBTXNNczBETERMV0F5d3l4d01zTUx3SE1ETFdBekF5endNd010UURORExGQXpReTFnTTBNaGNETkRMRUN6Z3l6UU04TXNZRFBESVhBend5eEFkQU1zOERRRExFQjBReTF3TkVNc3dEU0RJVkEwZ3kxZ05JTWhjRFNERE1CMHd5eGdkTU1zMERVRElXQTFBeXh3TlFNc3dEVkRJVkExUXkxZ05VTXNjRFZEQ0VGMWd3bGhkZ01wUUxiREpsQTNBd1hnZHdNbVFEZERKZEIzUXduQWQ0TWhZTGVESW5BM3d3L0JPQU1tUURpREp0QTRneS9nK0lNR1VMa0RBVkM1UXcvUStZTU1jSG5ESVZBNkF5eGdlZ01oVURwREFlQjZReUpBT29NbDBEcURCbUM2Z3lkZ09zTWpjRHJERDhJN0F3RkFmQU1tNER3REpmQjhBeWJnUEVNbWNEeERCY0Y4Z3laZ1BRTUY4SDBEQmxCOVF5WHdQVU1td0QyREpsQTlnd1hndllNR1lIM0RLRUUrQXdsUmZvTUpjWDhEQ1ZCL3d5WndQOE1Bd0duS1lFQTNDa0RBZjRwQXdMWEtvRkEyaXFDRkVBK2duOUtQb0kvYWo0Q29ZbytFQUdiUG9Jdm5ENlF4Yk0rbHdIQVBobkJ3RDQvUWNFK3I4TEVQb1JCeHo2dEJNZytnVURLUGdTRHlqNmdBOHcrb0FMT1BvU0F6ejRnQWRBK0lNSFFQcTZFMFQ2RndOTStMVEhVUHEzTDlENHZpZm8rTFFML1BpOHZBRCtsZ2hjL3NjQVlQNjhIR1Qrdi94dy9wWUU4UDY5a1BUOHhJRlEvTVp0a1B6RUJmRCt6ZzN3L3NVQitQNzJBZmorN3dINC9zd0IvUHdNRmhEK3RBWXcvRmNPTVB5MUdqajhEekpFL2xjYVhQNjhCbkQrRkFKMC9MNFdkUDYwNm9EOHZSTDAvSDIvQVB4L0Ixeit0WDlnL2dRRG9QeDlQNkQ4ZmcvQS9INFB5UHgrRDlEK2ZnZlkvZ3dmNFA1S0JKa1NTd0NwRUVvRkxSQkxCMGtRU3dpNUZFb0Z1UlpJQVRrYVNnMWQwRXNOdWRCOE5BSFVmalFaMUh3ME5kWitERTNVZmlSVjFIdzBhZFIrTklIVVZFQ2QxbjBNdmRaOUZNWFVmRFRSMUg0MDZkWlVEUVhVZlJFTjFuNE5GZFIrTlIzV1ZCMDUxbjROU2RSK05WSFVmRFZ0MUg0MWhkUjhOYUhVZmpXNTFIdzExZFIrTmUzVWZEWUoxSDQySWRSOE5qM1VmalpWMUh3MmNkUitOb25VREFhbDFud2lxZFlGQXJuV2ZnNjUxZ1VDd2RaK01zSFdCd0xaMUxRTzNkWitJdUhXQndMeDFud085ZFlIQXZuV2ZETDkxZ1VERmRTMkR4WFdmQ01kMWdVRExkWitEeTNXQlFNMTFuNHpOZFlIQTAzVXRBOVIxbjRqVmRZSEEyWFdmQTlwMWdjRGJkWjhNM0hXQlFPSjFMWVBpZFo4STVIV0JRT2gxbjRQb2RZRkE2bldmak9wMWdjRHdkUzBFOFhVZmhmTjFId1gyZFIrRitIVWZCZnQxSDRYOWRTMENnSHV0VFlGN0EwS0llNEhBaVhzdFJZcDdBd1NOZTRHQWtIc0QzSkY3TFFXZ2U2M0lvbnVEUktoN3JjaXFlNWNBUUh3aFJVQjhKUTFFZkllQVNud1Z3VXA4RjBGTGZCOE5USHdYZ2xKOG1ZQlRmSmZBVTN5WGdWcDhsd0JrZkM4QmdIeUJnSUI4QXhhRWZNRUVrSHdEQVpSOEh3WDhmcXdCQUw0UTBRQytyRWNKdmhBNURiNHNoeW0rTEFJdHZwQTNMcjZRLzBtK0VMeHB2Z0FBQUFBQUFBQUFJQUFBQUdFQUFnQUVBQVlBdkFNSUFBb0FEQUFWQUpVQXBRQzVBTUVBd3dESEFNc0EwUURYQU4wQTRBRG1BUGdBQ0FFS0FYTUFFQUVTQVJRQklBRXNBVVFCVFFGVEFXSUJhQUZxQVhZQmtnR1VBYWtCdXdISEFkRUIxUUc1QXRjQk93RFpBZHNCdHdEaEFmd0JEQUlZQWgwQ0l3SW5BcU1ETXdJL0FrSUNTd0pPQWxFQ1hRSmdBbWtDYkFKdkFuVUNlQUtCQW9vQ25BS2ZBcU1DcndLNUFzVUN5UUxOQXRFQzFRTG5BdTBDOFFMMUF2a0MvUUlGQXdrRERRTVRBeGNER3dNakF5Y0RLd012QXpVRFBRTkJBMGtEVFFOUkF3c1BWd05iQTE4RFl3Tm5BMnNEYndOekEza0RmUU9CQTRVRGlRT05BNUVEbFFPWkE1MERvUVBjRUtVRHlRUE5BOWtEM1FQaEErOEQ4UU05QkU4RW1RVHdCQUlGU2dWa0JXd0ZjQVZ6QlpvRitnWCtCUWNHQ3dZVUJoZ0dIZ1lpQmlnR2pnYVVCcGdHbmdhaUJxc0dyQVB6QnEwRDlnYXVBL2tHcndQOEJzd0Qvd2JOQXdJSHpnTUZCd2tIRFFjUkI0WURNZ2MxQjdrRE53YzdCNGdEVXdlSkExWUhrQU5yQjRvRGR3ZXdBNGtIamdPWkI1OEhvd2VNQTdnSGp3TzdCN1FBdmdmQUI4SUhFQ0RMQnk0QXpRZlBCeUFBMGdmV0I5c0gzd2ZrQitvSDhBY2dBUFlIRWlJQkNBVUlCd2dkQ0NVSUp3aERBQzBJTUFpUUFUWUlPUWhPQUVVSVJ3aE1DRTRJVVFoYUFLa0RXZ0JUQ0ZjSVlBaHBBR0lJWlFodkNIUUllZ2grQ0tJSVNRQ2tDS1lJcVFoV0FLc0lyUWl3Q0xRSVdBQzJDTGdJdXdqQUNNSUl4UWgyQU1jSXlRak1DTkFJZUFEU0NOUUkxd2piQ040STVBam5DUEFJOHdqMkNQa0lBZ2tHQ1FzSkR3a1VDUmNKR2drakNTd0pPd2srQ1VFSlJBbEhDVW9KVmdsY0NXQUpZZ2xrQ1dnSmFnbHdDWGdKZkFtQUNZWUppUW1QQ1pFSk1BQ1RDWmtKbkFtZUNhRUpwQWxoTGMxcm41K21DYkVKdkFuSENaVUtvUW9WQ3lBQUp3c3hDNDBMb1F1bEM2a0xyUXV4QzdVTHVRdTlDOEVMeFFzaEREVU1PUXc5REVFTVJReEpERTBNVVF4VkRGa01id3h4REhNTW9BeThETndNNUF6c0RQUU0vQXdFRFF3TkZBMGlEUzROZWcyQ0RZVU5pUTJORFowTnNRMjFEYndOd2czR0RTZ09MQTR3RGpJT05nNDhEajRPUVE1RERrWU9kdzU3RG9rT2pnNlVEcHdPb3c2cERyUU92ZzdHRHNvT3p3N1pEdDBPNUE3c0R2TU8rQTRFRHdvUEZROGJEeUlQS0E4ekR6MFBSUTlNRDFFUFZ3OWVEMk1QYVE5d0QzWVBmUStDRDRrUGpRK2VENlFQcVErdEQ3Z1B2Zy9KRDlBUDFnL2FEK0VQNVEvdkQvb1BBQkFFRUFrUUR4QVRFQm9RSHhBakVDa1FMeEF5RURZUU9SQS9FRVVRV1JCaEVIa1FmQkNBRUpVUW9SQ3hFTU1ReXhEUEVOb1EzaERxRVBJUTlCQUFFUVVSRVJGQkVVa1JUUkZURVZjUldoRnVFWEVSZFJGN0VYMFJnUkdFRVl3UmtoR1dFWndSb2hHb0Vhc1JiNmV2RWJNUmpRSzdFUTBTQ3hNSkZJMFVraFJRRldrVmJ4VjFGWHNWaHhXVEZTc0FuaFcyRmJvVnZoWENGY1lWeWhYZUZlSVZSaFpmRm9VV2l4WkpGMDhYVkJkMEYzUVllaGdPR2RBWmRCcDhHcG9hbnhxekdyMGF3eHJYR3R3YTRocndHaUFiTFJzMUd6a2JUeHZHRzlnYjJodmNHMlF4SFJ3ZkhDRWNJeHdsSENjY1JSeFRIRmdjWVJ4cUhId2NoUnlLSEtvY3hSekhITWtjeXh6TkhNOGMwUnpUSFBNYzlSejNIUGtjK3h3Q0hRUWRCaDBJSFJjZEdSMGJIUjBkSHgwaEhTTWRKUjBuSFNrZEt4MHRIUzhkTVIwekhUY2Q5QU01SFFjaU94MENJajBkUlIzMEEwY2RCeUpKSFFJaVN4MVRIZlFEVlIwSElsY2RBaUpaSFdFZDlBTmpIUWNpWlIwQ0ltY2RieDMwQTNFZEJ5SnpIUUlpZFIxL0hZRWRneDJGSFljZGlSMlBIYXdkTFFhMEhjQWRMQWJRSFVBZVRCNWZIbkVlaEI2R0hvb2VrQjZXSHBnZW5CNmVIcVllcVI2ckhyRWVzeDYxTUxrZUVSOG5IeXNmTFI4eUgzOGZrQitSSUtFZ3B5Q2hJYjhpQUVIUWdnTUwwa2NnaUNDRU1qTWdnU0NuTVc4eDBEUXgwREl6MERSQmdFR0JRWUpCZzBHSVFZb0FBRU9uUllCRmdVV0NSWWhKZ0VtQlNZSkppQUFBVG9OUGdFK0JUNEpQZzArSUFBQUFBRldBVllGVmdsV0lXWUVBQUFBQVlZQmhnV0dDWVlOaGlHR0tBQUJqcDJXQVpZRmxnbVdJYVlCcGdXbUNhWWdBQUc2RGI0QnZnVytDYjROdmlBQUFBQUIxZ0hXQmRZSjFpSG1CQUFCNWlFR0VRWVpCcUVPQlE0SkRoME9NUkl4RmhFV0dSWWRGcUVXTVI0Skhoa2VIUjZkSWdrbURTWVJKaGttb1NZZEpTbWxxU29KTHAweUJUS2RNakV3QUFHc2dhMDZCVHFkT2pMd0NiaytFVDRaUGkxS0JVcWRTakZPQlU0SlRwMU9NVktkVWpGV0RWWVJWaGxXS1ZZdFZxRmVDV1lKWmlGcUJXb2RhakUrYlZadEVBSDBCUkFCK0FXUUFmZ0ZNU2t4cWJHcE9TazVxYm1wQkFJeEpBSXhQQUl4VkFJemNBSVRjQUlIY0FJemNBSURFQUlRbUFvVEdBSVJIakV1TVQ2anFBWVRyQVlTM0FZeVNBb3hxQUl4RVdrUjZaSHBIZ1U0QWdNVUFnY1lBZ2RnQWdVR1BRWkZGajBXUlNZOUprVStQVDVGU2oxS1JWWTlWa1ZPbVZLWklqRUVBaDBVQXA5WUFoTlVBaEU4QWh5NENoRmtBaEdnQVpnSnFBSElBZVFKN0FvRUNkd0I1QUNDR0lJY2dpaUNvSUlNZ2kyTUNiQUJ6QUhnQWxRS0FnUUNUaUlFZ3hTQ0JxQUNCa1FPQmxRT0Jsd09CbVFPQkFBQUFud09CQUFBQXBRT0JxUU9CeWdPQkFRT1lCNlFIc0FDMEFMWUF1QURLQUFFRHVBZkVCNzRBeEFESUFLVUREUk1BQVFQUkFORUh4Z1BBQTdvRHdRUENBd0FBbUFPMUF4VUVnQlVFaUFBQUFCTUVnUVlFaUJvRWdSZ0VnQ01FaGhnRWhqZ0VoalVFZ0RVRWlBQUFBRE1FZ1ZZRWlEb0VnVGdFZ0VNRWhuUUVqeFlFaGhBRWhoQUVpQlVFaHRnRWlCWUVpQmNFaUJnRWhCZ0VpQjRFaU9nRWlDMEVpQ01FaENNRWlDTUVpeWNFaUNzRWlHVUZnZ1VuQmdBc0FDMGhMUUF1SXkwbkJnQk5JVTJnVFNOTjFRWlVCZ0FBQUFEQkJsUUcwZ1pVQmlnSlBBa3dDVHdKTXdrOENSVUpBQ2NCSndJbkJ5Y01KdzBuRmljYUo3NEpDUUFKR2FFSnZBbXZDYndKTWdvOENqZ0tQQW9XQ2dBbUFTWUdKaXNLUEFwSEMxWUxQZ3NKQUFrWklRczhDNUlMMXd1K0N3Z0FDUUFJR1VZTVZneS9ETlVNeGd6VkRNSU1CQUFJRXo0TkNBQUpBQWdaMlEzS0Rjb05Ed1VTQUE4VlRRNHlEczBPc2c2WkRoSUFFZ2hDRDdjUFRBKzNEMUVQdHc5V0Q3Y1BXdyszRDBBUHRROXhEM0lQY1E4QUEwRVBzZytCRDdNUGdBK3pENEVQY1ErQUQ1SVB0dytjRDdjUG9RKzNENllQdHcrckQ3Y1BrQSsxRHlVUUxoQUZHelViQUFBQUFBY2JOUnNBQUFBQUNSczFHd0FBQUFBTEd6VWJBQUFBQUEwYk5Sc1JHelViT2hzMUd3QUFBQUE4R3pVYlBoczFHMEliTlJ0QkFNWUFRZ0FBQUVRQVJRQ09BVWNBVHdBaUFsQUFVZ0JVQUZVQVZ3QmhBRkFDVVFJQ0hXSUFaQUJsQUZrQ1d3SmNBbWNBQUFCckFHMEFTd0Z2QUZRQ0ZoMFhIWEFBZEFCMUFCMGRid0oyQUNVZHNnT3pBN1FEeGdQSEEya0FjZ0IxQUhZQXNnT3pBOEVEeGdQSEExSUNZd0JWQXZBQVhBSm1BRjhDWVFKbEFtZ0NhUUpxQW5zZG5RSnRBb1VkbndKeEFuQUNjZ0p6QW5RQ2RRSjRBb0lDZ3dLckFZa0NpZ0ljSFlzQ2pBSjZBSkFDa1FLU0FyZ0RRUUNsUWdDSFFnQ2pRZ0N4eHdDQlJBQ0hSQUNqUkFDeFJBQ25SQUN0RWdHQUVnR0JSUUN0UlFDd0tBS0dSZ0NIUndDRVNBQ0hTQUNqU0FDSVNBQ25TQUN1U1FDd3p3Q0JTd0NCU3dDalN3Q3hUQUNqTmg2RVRMRk1yVTJCVFlkTm8wNkhUcU5Pc1U2dDFRQ0IxUUNJVEFHQVRBR0JVQUNCVUFDSFVnQ0hVZ0NqV2g2RVVnQ3hVd0NIVXdDaldnR0hZQUdIWWg2SFZBQ0hWQUNqVkFDeFZBQ3RWUUNrVlFDd1ZRQ3RhQUdCYWdHSVZvTldvMWVBVjRGWGlGZUhWNk5ZaDFpSVdZZGFnbHFqV3JGb3NYU0lkNHA1aW1FQXZnSi9BWWRCQUtOQkFJbkNBSUhDQUlEQ0FJbkNBSU9nSG9JQ0FZRUNBWUFDQVlrQ0FZT2dIb1pGQUtORkFJbEZBSVBLQUlIS0FJREtBSW5LQUlPNEhvSkpBSWxKQUtOUEFLTlBBSW5VQUlIVUFJRFVBSW5VQUlQTUhvS2dBWUdnQVlDZ0FZbWdBWU9nQWFOVkFLTlZBSW12QVlHdkFZQ3ZBWW12QVlPdkFhTlpBSUJaQUtOWkFJbFpBSU94QXhNREFCK0FBQitCQUIvQ2tRTVRBd2dmZ0FnZmdRZ2Z3clVERXdNUUg0QVFINEdWQXhNREdCK0FHQitCdHdPVHR3T1VJQitBSVIrQUlCK0JJUitCSUIvQ0lSL0Nsd09UbHdPVUtCK0FLUitBS0IrQktSK0JLQi9DS1IvQ3VRT1R1UU9VTUIrQU1SK0FNQitCTVIrQk1CL0NNUi9DbVFPVG1RT1VPQitBT1IrQU9CK0JPUitCT0IvQ09SL0N2d09UdndPVVFCK0FRQitCbndNVEEwZ2ZnRWdmZ2NVREV3TlFINEJRSDRGUUg4S2xBNVFBQUFCWkg0QUFBQUJaSDRFQUFBQlpIOExKQTVQSkE1UmdINEJoSDRCZ0g0RmhINEZnSDhKaEg4S3BBNU9wQTVSb0g0QnBINEJvSDRGcEg0Rm9IOEpwSDhLeEE0QzFBNEMzQTRDNUE0Qy9BNERGQTRESkE0QUFIMFVESUI5RkEyQWZSUU94QTRheEE0UndIOFd4QThXc0E4VUFBQUN4QThLMkg4V1JBNGFSQTRTUkE0Q1JBOFVna3lDVElNS29BTUowSDhXM0E4V3VBOFVBQUFDM0E4TEdIOFdWQTRDWEE0Q1hBOFcvSDRDL0g0Ry9IOEs1QTRhNUE0VEtBNEFBQTdsQ3lrS1pCcGtFbVFEK0g0RCtINEgrSDhMRkE0YkZBNFRMQTRBQUE4RVR3UlRGUXN0Q3BRYWxCS1VBb1FPVXFBQ0FoUU5nQUh3Znhja0R4YzREeFFBQUFNa0R3dllmeFo4RGdLa0RnS2tEeFNDVUFpQWdJQ0FnSUNBZ0lDQWdzeTR1TGk0dU1pQXlJRElnQUFBQU5TQTFJRFVnQUFBQUlTRUFBQ0NGUHo4L0lTRS9NaUFBQUFBQU1Ha0FBRFExTmpjNE9TczlLQ2x1TUFBckFCSWlQUUFvQUNrQUFBQmhBR1VBYndCNEFGa0NhR3RzYlc1d2MzUlNjMkV2WTJFdmM3QUFRMk12YjJNdmRiQUFSa2dBSHdBQUFDRGZBUUVFSkU1dlVGRlNVbEpUVFZSRlRGUk5Td0RGQUVKREFHVkZSZ0JOYjlBRlJrRll3QU96QTVNRG9BTVJJa1JrWldscU1kQTNNZEE1TWRBeE1ESFFNekxRTXpIUU5UTFFOVFBRTlRUUU5USFFOalhRTmpIUU9EUFFPRFhRT0RmUU9ESFFTVWxKU1VsSlZsWkpWa2xKVmtsSlNVbFlXRWxZU1VsTVEwUk5hV2xwYVdscGFYWjJhWFpwYVhacGFXbHBlSGhwZUdscGJHTmtiVERRTTVBaHVKSWh1SlFodU5BaHVOUWh1TklodUFNaXVBZ2l1QXNpdUNNaXVBQUFBQ1VpdUNzaUt5SXJJZ0FBQUM0aUxpSXVJZ0FBQUR3aXVFTWl1RVVpdUFBQUFFZ2l1RDBBdUFBQUFHRWl1RTBpdUR3QXVENEF1R1FpdUdVaXVISWl1SFlpdUhvaXVJSWl1SVlpdUtJaXVLZ2l1S2tpdUtzaXVId2l1SkVpdUxJaU9BTUlNREVBTVFBd0FESXdLQUF4QUNrQUtBQXhBREFBS1FBb01qQXBNUUF1QURFQU1BQXVBREl3TGlnQVlRQXBBRUVBWVFBcklnQUFBQUE2T2owOVBUMDlQZDBxdUdwV0FFNEFLRFkvV1lXTW9Mby9VUUFtTEVOWGJLRzJ3WnRTQUY1NmY1Mm13YzdudGxQSVUrTlQxMVlmVit0WUFsa0tXUlZaSjFseldWQmJnRnY0V3c5Y0lsdzRYRzVjY1Z6YlhlVmQ4VjMrWFhKZWVsNS9YdlJlL2w0TFh4TmZVRjloWDNOZncxOElZalppUzJJdlpUUmxoMldYWmFSbHVXWGdaZVZsOEdZSVp5aG5JR3RpYTNscnMydkxhOVJyMjJzUGJCUnNOR3hyY0NweU5uSTdjajl5UjNKWmNsdHlySEtFYzRsejNIVG1kQmgxSDNVb2RUQjFpM1dTZFhaMmZYYXVkcjkyN25iYmQrSjM4M2M2ZWJoNXZubDBlc3Q2K1hwemZQaDhObjlSZjRwL3ZYOEJnQXlBRW9BemdIK0FpWURqZ1FBSEVCa3BPRHlMajVWTmhtdUdRSWhNaUdPSWZvbUxpZEtKQUlvM2pFYU1WWXg0akoyTVpJMXdqYk9OcTQ3S2pwdVBzSSsxajVHUVNaSEdrY3lSMFpGM2xZQ1ZISmEybHJtVzZKWlJsMTZYWXBkcGw4dVg3WmZ6bHdHWXFKamJtTitZbHBtWm1heVpxSnJZbXQrYUpac3ZtektiUEp0YW0rV2NkWjUvbnFXZUFCWWVLQ3hVV0dsdWU1YWxyZWozK3hJd0FBQkJVMFJUUlZOTE1Ka3dBQUFBQUUwd21UQUFBQUFBVHpDWk1BQUFBQUJSTUprd0FBQUFBRk13bVRBQUFBQUFWVENaTUFBQUFBQlhNSmt3QUFBQUFGa3dtVEFBQUFBQVd6Q1pNQUFBQUFCZE1Ka3dBQUFBQUY4d21UQUFBQUFBWVRDWk1HUXdtVEFBQUFBQVpqQ1pNQUFBQUFCb01Ka3diekNaTUhJd21UQjFNSmt3ZURDWk1Ic3dtVEJHTUprd0lBQ1pNSjB3bVRDSU1Jb3dxekNaTUFBQUFBQ3RNSmt3QUFBQUFLOHdtVEFBQUFBQXNUQ1pNQUFBQUFDek1Ka3dBQUFBQUxVd21UQUFBQUFBdHpDWk1BQUFBQUM1TUprd0FBQUFBTHN3bVRBQUFBQUF2VENaTUFBQUFBQy9NSmt3QUFBQUFNRXdtVERFTUprd0FBQUFBTVl3bVRBQUFBQUF5RENaTU04d21URFNNSmt3MVRDWk1OZ3dtVERiTUprd3BqQ1pNTzh3bVREOU1Ka3dzekRJTUFBUkFBR3FBcXl0QXdRRnNMR3lzN1MxR2dZSENDRUpFV0VSRkJGTUFBR3p0TGk2djhQRkNNbkxDUW9NRGc4VEZSY1lHUm9iSGlJc016amQza05FUlhCeGRIMStnSXFOQUU2TVRnbE8yMVlLVGkxT0MwNHlkVmxPR1U0QlRpbFpNRmU2VGlnQUtRQUFFUUlSQXhFRkVRWVJCeEVKRVFzUkRCRU9FUThSRUJFUkVSSVJLQUFBRVdFUktRQW9BQUlSWVJFcEFDZ0FCUkZoRVNrQUtBQUpFV0VSS1FBb0FBc1JZUkVwQUNnQURoRmhFU2tBS0FBTUVXNFJLUUFvQUFzUmFSRU1FV1VScXhFcEFDZ0FDeEZwRVJJUmJoRXBBQ2dBS1FBQVRveE9DVTdiVnBST2JWRURUbXRSWFU1QlV3aG5hM0EwYkNobjBaRWZWK1ZsS21nSlp6NTVEVlI1Y3FHTVhYbTBVdU5PZkZSbVcrTjJBVS9IakZSVGJYa1JUK3FCODRGUFZYeGVoMldQZTFCVVJUSUFNUUF6QURBQUFCRUFBZ01GQmdjSkN3d09EeEFSRWdBUkFHRUNZUU5oQldFR1lRZGhDV0VMWVF4aERoRmhFUUFSRG1HM0FHa0xFUUZqQUdrTEVXNFJBRTZNVGdsTzIxYVVUbTFSQTA1clVWMU9RVk1JWjJ0d05Hd29aOUdSSDFmbFpTcG9DV2MrZVExVWVYS2hqRjE1dEZMWWVUZDFjMWxwa0NwUmNGUG9iQVdZRVUrWlVXTnJDazR0VGd0TzVsM3pVenRUbDF0bVcrTjJBVS9IakZSVEhGa3pBRFlBTkFBd0FEVXdNUUFJWnpFQU1BQUlaMGhuWlhKblpWWk1WRVNpTUFBQ0JBWUlDUXNORHhFVEZSY1pHeDBmSWlRbUtDa3FLeXd0TURNMk9UdzlQajlBUWtSR1IwaEpTa3ROVGs5UTVFNk1WS0V3QVRCYkp3RktOQUFCVWprQm9qQUFXa21rTUFBblR3eWtNQUJQSFFJRlQ2Z3dBQkVIVkNHb01BQlVBMVNrTUFaUEZRWllQQWNBUnFzd0FENFlIUUJDUDFHc01BQkJSd0JITXE0d3JEQ3VNQUFkVHEwd0FEZzlUd0UrRTArdE1PMHdyVEFBUUFNOE02MHdBRUEwVHhzK3JUQUFRRUlXRzdBd0FEa3dwREFNUlR3a1R3dEhHQUJKcnpBQVBrMGVzVEFBU3dnQ09oa0NTeXlrTUJFQUMwZTFNQUErREVjcnNEQUhPa01BdVRBQ09nZ0NPZzhIUXdDM01CQUFFalFSUEJNWHBEQXFIeVFyQUNDN01CWkJBRGdOeERBTk9BRFFNQUFzSEJ1aU1ESUFGeVpKcnpBbEFEeXpNQ0VBSURpaE1EUUFTQ0lvb3pBeUFGa2xwekF2SEJBQVJOVXdBQlFlcnpBcEFCQk5QTm93dlRDNE1DSVRHaUF6RENJN0FTSkVBQ0ZFQjZRd09RQlBKTWd3RkNNQTJ6RHpNTWt3RkNvQUVqTWlFak1xcERBNkFBdEpwREE2QUVjNkh5czZSd3UzTUNjOEFEQThyekF3QUQ1RTN6RHFNTkF3RHhvQUxCdmhNS3d3ckRBMUFCeEhOVkFjUDZJd1Fsb25RbHBKUkFCUnd6QW5BQVVvNmpEcE1OUXdGd0FvMWpBVkpnQVY3RERnTUxJd09rRVdBRUhETUN3QUJUQUF1WEF4QURBQXVYQXlBREFBdVhCb1VHRmtZVUZWWW1GeWIxWndZMlJ0WkFCdEFMSUFTUUJWQUhOZUVHSXRab3hVSjFsamF3NW11MndxYUE5ZkdrOCtlWEFBUVc0QVFid0RRVzBBUVdzQVFVc0FRazBBUWtjQVFtTmhiR3RqWVd4d0FFWnVBRWE4QTBhOEEyZHRBR2RyQUdkSUFIcHJTSHBOU0hwSFNIcFVTSHE4QXhNaGJRQVRJV1FBRXlGckFCTWhaZ0J0YmdCdHZBTnRiUUJ0WXdCdGF3QnRZd0FLQ2s4QUNrOXRBTElBWXdBSUNrOEtDbEFBQ2xCdEFMTUFhd0J0QUxNQWJRQVZJbk1BYlFBVkluTUFzZ0JRWVd0UVlVMVFZVWRRWVhKaFpISmhaTkZ6Y2dCaEFHUUFGU0p6QUxJQWNBQnpiZ0J6dkFOemJRQnpjQUJXYmdCV3ZBTldiUUJXYXdCV1RRQldjQUJYYmdCWHZBTlhiUUJYYXdCWFRRQlhhd0NwQTAwQXFRTmhMbTB1UW5GalkyTmtROUZyWjBOdkxtUkNSM2xvWVVoUWFXNUxTMHROYTNSc2JXeHViRzluYkhodFltMXBiRzF2YkZCSWNDNXRMbEJRVFZCU2MzSlRkbGRpVnRGdFFkRnRNUURsWlRFQU1BRGxaVElBTUFEbFpUTUFNQURsWldkaGJFb0VUQVFtQVZNQko2YzNxMnNDVXF0SWpQUm15bzdJak5GdU1rN2xVNXlmbko5UldkR1JoMVZJV2ZaaGFYYUZmeitHdW9mNGlJK1FBbW9iYmRsdzNuTTloR3FSOFptQ1RuVlRCR3NiY2kyR0hwNVFYZXR2ellWa2ljbGkySUVmaU1wZUYyZHFiZnh5enBDR1Q3ZFIzbExFWk5OcUVITG5kZ0dBQm9aY2h1K05NcGR2bS9xZGpIaC9lYUI5eVlNRWszK2Uxb3JmV0FSZllIeCtnR0p5eW5qQ2pQZVcyRmhpWEJOcTJtMFBieTk5TjM1TGx0SlNpNERjVWN4UkhIcStmZkdEZFphQWk4OWlBbXIraWpsTzUxc1NZSWR6Y0hVWFUvdDR2MCtwWHcxT3pHeDRaU0o5dzFOZVdBRjNTWVNxaXJwcnNJK0liUDVpNVlLZ1kyVjFyazVwVWNsUmdXam5mRytDMG9yUGtmVlNRbFJ6V2V4ZXhXWCtieXA1clpWcW1wZWV6cDZiVXNabWQydGlqM1Jla0dFQVlwcGtJMjlKY1lsMHlubjBmVytBSm8vdWhDT1FTcE1YVXFOU3ZWVEljTUtJcW9ySlh2VmZlMk91YXo1OGRYUGtUdmxXNTF1NlhSeGdzbk5wZEpwL1JvQTBrdmFXU0pjWW1JdFBybm0wa2JpVzRXQ0dUdHBRN2xzL1hKbGxBbXJPY1VKMi9JUjhrSTJmaUdZdWxvbFNlMmZ6WjBGdG5HNEpkRmwxYTNnUWZWNlliVkV1WW5pV0sxQVpYZXB0S28rTFgwUmhGMmlIYzRhV0tWSVBWR1ZjRTJaT1o2aG81V3dHZE9KMWVYL1BpT0dJekpIaWxqOVR1bTRkVk5CeG1IVDZoYU9XVjV5Zm5wZG55MjNvZ2N0NklIdVNmTUJ5bVhCWWk4Qk9Ob002VWdkU3BsN1RZdFo4aFZzZWJiUm1PNDlNaUUyV2k0blRYa0JSd0ZVQUFBQUFXbGdBQUhSbUFBQUFBTjVSS25QS2RqeDVYbmxsZVk5NVZwZStmTDEvQUFBU2hnQUErSW9BQUFBQU9KRDlrTytZL0pnb21iU2QzcEMzbHE1UDUxQk5VY2xTNUZKUlU1MVZCbFpvVmtCWXFGaGtYRzVjbEdCb1lZNWg4bUZQWmVKbGtXYUZhSGR0R200aWIyNXhLM0lpZEpGNFBubEplVWg1VUhsV2VWMTVqWG1PZVVCNmdYckFlL1I5Q1g1QmZuSi9CWUR0Z1htQ2VZSlhoQkNKbG9rQml6bUwwNHdJamJhUE9KRGpsditYTzVoMVlPNUNHSUlDSms2MVVXaFJnRTlGVVlCUngxTDZVcDFWVlZXWlZlSlZXbGl6V0VSWlZGbGlXaWhiMGw3WlhtbGZyVi9ZWUU1aENHR09ZV0JoOG1FMFlzUmpIR1JTWkZabGRHWVhaeHRuVm1kNWE3cHJRVzNiYnN0dUltOGVjRzV4cDNjMWNxOXlLbk54ZEFaMU8zVWRkaDkyeW5iYmR2UjJTbmRBZDh4NHNYckFlM3Q4VzMzMGZUNS9CWUJTZysrRGVZZEJpWWFKbG9tL2l2aUt5NG9CaS82SzdZbzVpNHFMQ0kwNGozS1FtWkYya255VzQ1WldsOXVYLzVjTG1EdVlFcHVjbjBvb1JDalZNNTA3R0VBNVFFbFMwRnpUZmtPZmpwOHFvQUptWm1acFpteG1abWxtWm14L0FYUnpBSFJsQlE4UkR3QVBCaGtSRHdqWkJiUUZBQUFBQVBJRnR3WFFCUklBQXdRTERBMFlHdWtGd1FYcEJjSUZTZnZCQlVuN3dnWFFCYmNGMEFXNEJkQUZ2QVhZQmJ3RjNnVzhCZUFGdkFYakJid0Z1UVV0QXk0REx3TXdBekVESEFBWUJpSUdLd2JRQmR3RmNRWUFBQW9LQ2dvTkRRME5EdzhQRHdrSkNRa09EZzRPQ0FnSUNETXpNek0xTlRVMUV4TVRFeElTRWhJVkZSVVZGaFlXRmh3Y0d4c2RIUmNYSnljZ0lEZzRPRGcrUGo0K1FrSkNRa0JBUUVCSlNVcEtTa3BQVDFCUVVGQk5UVTFOWVdGaVlra0daR1JrWkg1K2ZYMS9meTZDZ254OGdJQ0hoNGVIQUFBbUJnQUJBQUVBcndDdkFDSUFJZ0NoQUtFQW9BQ2dBS0lBb2dDcUFLb0FxZ0FqQUNNQUk4d0dBQUFBQUNZR0FBWUFCd0FmQUNNQUpBSUdBZ2NDQ0FJZkFpTUNKQVFHQkFjRUNBUWZCQ01FSkFVR0JSOEZJd1VrQmdjR0h3Y0dCeDhJQmdnSENCOE5CZzBIRFFnTkh3OEhEeDhRQmhBSEVBZ1FIeEVIRVI4U0h4TUdFeDhVQmhRZkd3WWJCeHNJR3g4Ykl4c2tIQWNjSHh3akhDUWRBUjBHSFFjZENCMGVIUjhkSXgwa0hnWWVCeDRJSGg4ZUl4NGtId1lmQng4SUh4OGZJeDhrSUFZZ0J5QUlJQjhnSXlBa0lRWWhIeUVqSVNRa0JpUUhKQWdrSHlRakpDUUtTZ3RLSTBvZ0FFd0dVUVpSQnY4QUh5WUdBQXNBREFBZkFDQUFJd0FrQWdzQ0RBSWZBaUFDSXdJa0JBc0VEQVFmSmdZRUlBUWpCQ1FGQ3dVTUJSOEZJQVVqQlNRYkl4c2tIQ01jSkIwQkhSNGRIeDBqSFNRZUh4NGpIaVFmQVI4ZklBc2dEQ0FmSUNBZ0l5QWtJMG9rQ3lRTUpCOGtJQ1FqSkNRQUJnQUhBQWdBSHdBaEFnWUNCd0lJQWg4Q0lRUUdCQWNFQ0FRZkJDRUZId1lIQmg4SEJnY2ZDQVlJSHcwR0RRY05DQTBmRHdjUENBOGZFQVlRQnhBSUVCOFJCeElmRXdZVEh4UUdGQjhiQmhzSEd3Z2JIeHdISEI4ZEJoMEhIUWdkSGgwZkhnWWVCeDRJSGg4ZUlSOEdId2NmQ0I4ZklBWWdCeUFJSUI4Z0lTRUdJUjhoU2lRR0pBY2tDQ1FmSkNFQUh3QWhBaDhDSVFRZkJDRUZId1VoRFI4TklRNGZEaUVkSGgwZkhoOGdIeUFoSkI4a0lVQUdUZ1pSQmljR0VDSVFJeElpRWlNVEloTWpEQ0lNSXcwaURTTUdJZ1lqQlNJRkl3Y2lCeU1PSWc0akR5SVBJdzBGRFFZTkJ3MGVEUW9NQ2c0S0R3b1FJaEFqRWlJU0l4TWlFeU1NSWd3akRTSU5Jd1lpQmlNRklnVWpCeUlISXc0aURpTVBJZzhqRFFVTkJnMEhEUjROQ2d3S0Rnb1BDZzBGRFFZTkJ3MGVEQ0FOSUJBZURBVU1CZ3dIRFFVTkJnMEhFQjRSSGdBa0FDUXFCZ0FDR3dBREFnQURBZ0FER3dBRUd3QWJBZ0FiQXdBYkJBSWJBd0liQXdNYklBTWJId2tEQWdrQ0F3a0NId2tiQXdrYkF3a2JBZ2tiR3drYkd3c0RBd3NEQXdzYkd3b0RHd29ER3dvQ0lBb2JCQW9iQkFvYkd3b2JHd3dESHd3RUd3d0VHdzBiQXcwYkF3MGJHdzBiSUE4Q0d3OGJHdzhiR3c4Ykh4QWJHeEFiSUJBYkh4Y0VHeGNFR3hnYkF4Z2JHeG9ER3hvRElCb0RIeG9DQWhvQ0Fob0VHeG9FR3hvYkF4b2JBeHNEQWhzREd4c0RJQnNDQXhzQ0d4c0VBaHNFR3lnR0hRUUdIeDBFSHgwZEhnVWRIZ1VoSGdRZEhnUWRIZ1FoSGgwaUhoMGhJaDBkSWgwZEFBWWlBZ1FpQWdRaEFnWWlBZ1loQWgwaUFoMGhCQjBpQkFVaEJCMGhDd1loRFFVaURBVWlEZ1VpSEFRaUhCMGlJZ1VpSWdRaUloMGlIUjBpR2gwaUhnVWlHaDBGSEFVZEVSMGlHeDBpSGdRRkhRWWlIQVFkR3gwZEhBUWRIZ1FGQkFVaUJRUWlIUVFpR1IwaUFBVWlHeDBkRVFRZERSMGRDd1lpSGdRaU5RWUFENTBORDUwbkJnQWRIU0FBSEFFS0hnWWVDQTRkRWg0S0RDRWRFaDBqSUNFTUhSNDFCZ0FQRkNjR0RoMGkvd0FkSFNEL0VoMGpJUDhoREIwZUp3WUZIZjhGSFFBZElDY0dDcVVBSFN3QUFUQUNNRG9BT3dBaEFEOEFGakFYTUNZZ0V5QVNBUUJmWHlncGUzMElNQXdOQ0FrQ0F3QUJCQVVHQjFzQVhRQStJRDRnUGlBK0lGOEFYd0JmQUN3QUFUQXVBQUFBT3dBNkFEOEFJUUFVSUNnQUtRQjdBSDBBRkRBVk1DTW1LaXN0UEQ0OUFGd2tKVUJBQnY4TEFBdi9EQ0FBVFFaQUJ2OE9BQTcvRHdBUC94QUFFUDhSQUJIL0VnQVNJUVlBQVFFQ0FnTURCQVFGQlFVRkJnWUhCd2NIQ0FnSkNRa0pDZ29LQ2dzTEN3c01EQXdNRFEwTkRRNE9EdzhRRUJFUkVoSVNFaE1URXhNVUZCUVVGUlVWRlJZV0ZoWVhGeGNYR0JnWUdCa1pHUmtnSUNBZ0lTRWhJU0lpSWlJakl5TWpKQ1FrSkNVbEpTVW1KaVltSnljb0tDa3BLU2tpQmlJQUlnQWlBU0lCSWdNaUF5SUZJZ1VoQUlVcEFUQUJDd3dBK3ZHZ29xU21xT0xrNXNMN29hT2xwNm1xcks2d3NyUzJ1THE4dnNERHhjZkp5c3ZNemM3UjFOZmEzZDdmNE9IajVlZm82ZXJyN083eW1Ka3hNVTh4VlRGYk1XRXhvZ0NqQUt3QXJ3Q21BS1VBcVNBQUFBSWxrQ0dSSVpJaGt5R2dKY3NsbVJDNkVBQUFBQUNiRUxvUUJRV2xFTG9RQlRFUkp4RXlFU2NSVlVjVFBoTkhFMWNUVmJrVXVoUzVGTEFVQUFBQUFMa1V2UlJWVUxnVnJ4VzVGYThWVlRVWk1Ca0ZWOUZsMFZqUlpkRmYwVzdSWDlGdjBWL1JjTkZmMFhIUlg5RnkwVlZWVlFXNTBXWFJ1dEZsMGJ2UmJ0RzgwVzdSdTlGdjBielJiOUZWVlZWQkFHRUFRUUJoQUdrQVFRQmhBRUVBUTBRQUFFY0FBRXBMQUFCT1QxQlJBRk5VVlZaWFdGbGFZV0pqWkFCbWFBQndBRUVBWVFCQlFnQkVSVVpIU2dCVEFHRUFRVUlBUkVWR1J3QkpTa3RNVFFCUFV3QmhBRUVBWVFCQkFHRUFRUUJoQUVFQVlRQkJBR0VBUVFCaEFERUJOd0tSQTZNRHNRUFJBeVFBSHdRZ0JaRURvd094QTlFREpBQWZCQ0FGa1FPakE3RUQwUU1rQUI4RUlBV1JBNk1Ec1FQUkF5UUFId1FnQlpFRG93T3hBOUVESkFBZkJDQUZDd3d3QURBQU1BQXdBREFBSndZQUFRVUlLZ1llQ0FNTklCa2FHeHdKRHhjTEdBY0tBQUVFQmd3T0VFU1FkMFVvQml3R0FBQkhCak1HRnhBUkVoTUFCZzRDRHpRR0tnWXJCaTRHQUFBMkJnQUFPZ1l0QmdBQVNnWUFBRVFHQUFCR0JqTUdPUVlBQURVR1FnWUFBRFFHQUFBQUFDNEdBQUEyQmdBQU9nWUFBTG9HQUFCdkJnQUFLQVlzQmdBQVJ3WUFBQUFBTFFZM0Jrb0dRd1lBQUVVR1JnWXpCamtHUVFZMUJrSUdBQUEwQmlvR0t3WXVCZ0FBTmdZNEJqb0diZ1lBQUtFR0p3WUFBUVVJSUNFTEJoQWpLZ1lhR3h3SkR4Y0xHQWNLQUFFRUJnd09FQ2dHTEFZdkJnQUFTQVl5QmkwR053WktCaW9HR2hzY0NROFhDeGdIQ2dBQkJBWU1EaEF3TGpBQUxBQW9BRUVBS1FBVU1GTUFGVEJEVWtORVYxcEJBRWhXVFZaVFJGTlRVRkJXVjBOTlEwMUVUVkpFU2tzd01BQm9hRXRpVjF2TVU4Y3dqRTRhV2VPSktWbWtUaUJtSVhHWlpVMVNqRitOVWJCbEhWSkNmUjkxcVl6d1dEbFVGRytWWWxWakFFNEpUa3FRNWwwdFR2TlRCMk53alZOaWdYbDZlZ2hVZ0c0Slp3aG5NM1Z5VXJaVlRaRVVNQlV3TEdjSlRveE9pVnU1Y0ZOaTEzYmRVbGRsbDEvdlV6QUFPRTRGQUFraUFXQlByays3VHdKUWVsQ1pVT2RRejFDZU5Eb0dUVkZVVVdSUmQxRWNCYmswWjFHTlVVc0ZsMUdrVWN4T3JGRzFVZCtSOVZFRFV0ODBPMUpHVW5KU2QxSVZOUUlBSUlDQUFBZ0FBTWRTQUFJZE16NC9VSUtLazZ5MnVMaTRMQXB3Y01wVDMxTmpDK3RUOFZNR1ZKNVVPRlJJVkdoVW9sVDJWQkJWVTFWalZZUlZoRldaVmF0VnMxWENWUlpYQmxZWFYxRldkRllIVXU1WXpsZjBWdzFZaTFjeVdERllyRmprRlBKWTkxZ0dXUnBaSWxsaVdhZ1c2aGJzV1J0YUoxcllXV1phN2piOE5naGJQbHMrVzhnWncxdllXK2RiODFzWUcvOWJCbHhUWHlKY2dUZGdYRzVjd0Z5TlhPUWRRMTNtSFc1ZGExMThYZUZkNGwwdk9QMWRLRjQ5WG1sZVlqaURJWHc0c0Y2elhyWmV5bDZTby81ZU1TTXhJd0dDSWw4aVg4YzR1RExhWVdKZmExL2pPSnBmelYvWFgvbGZnV0E2T1J3NWxHRFVKc2RnQWdJQUFBQUFBQUFBQ0FBS0FBQUNDQUNBQ0FBQUNJQW9nQUlBQUFKSVlRQUVCZ1F5Um1wY1o1YXFyc2pUWFdJQVZIZnpEQ3M5WS94aWFHT0RZK1JqOFNzaVpNVmpxV011T21sa2ZtU2RaSGRrYkRwUFpXeGxDakRqWmZobVNXWVpPNUZtQ0R2a09wSlJsVkVBWjV4bXJZRFpReGRuRzJjaFoxNW5VMmZETTBrNyttZUZaMUpvaFdodE5JNW9IMmdVYVowN1FtbWphZXBwcUdxak50dHFHRHdoYTZjNFZHdE9QSEpybjJ1NmE3dHJqVG9MSGZvNlRteThQTDlzeld4bmJCWnRQbTEzYlVGdGFXMTRiWVZ0SGowMGJTOXVibTR6UGN0dXgyN1JQdmx0Ym05ZVA0NC94bTg1Y0I1d0czQ1dQVXB3ZlhCM2NLMXdKUVZGY1dOQ25IR3JReWh5TlhKUWNnaEdnSEtWY2pWSEFpQUFBQ0FBQUFBQUNJQUFBQUlDZ0lvQUFDQUFDQW9BZ0lpQUlCUkllbk9MYzZ3K3BYTzRQcmcrUjNSY2RIRjBoWFRLZEJzL0pIVTJURDUxa2t4d2RaOGhFSGFoVDdoUFJGRDhQd2hBOUhielVQSlFHVkV6VVI1M0gzY2ZkMHAzT1VDTGQwWkFsa0FkVkU1NGpIak1lT05BSmxaV2VacFd4VmFQZWV0NUwwRkFla3A2VDNwOFdhZGFwMXJ1ZWdKQ3ExdkdlOGw3SjBLQVhOSjhvRUxvZk9OOEFIMkdYMk45QVVQSGZRSitSWDQwUXloaVIySlpROWxpZW44K1k1Vi8rbjhGZ05wa0kyVmdnS2hsY0lCZk05VkRzb0FEZ1F0RVBvRzFXcWRudFdlVE01d3pBWUlFZ3A2UGEwU1Jnb3VDbllLelVyR0NzNEs5Z3VhQ1BHdmxnaDJEWTRPdGd5T0R2WVBuZzFlRVU0UEtnOHlEM0lNMmJHdHRBZ0FBSUNJcW9Bb0FJSUFvQUtnZ0lBQUNnQ0lDaWdnQXFnQUFBQUlBQUNqVmJDdEY4WVR6aEJhRnluTmtoU3h2WFVWaFJiRnYwbkJyUlZDR1hJWm5obW1HcVlhSWhnNkg0b1o1aHlpSGE0ZUdoOWRGNFljQmlQbEZZSWhqaUdkMjE0amVpRFZHK29pN05LNTRabm0rUnNkR29JcnRpb3FMVll5b2ZLdU13WXdialhlTkwzOEVDTXVOdkkzd2pkNEkxSTQ0ajlLRjdZV1VrUEdRRVpFdWh4dVJPSkxYa3RpU2ZKTDVreFdVK291TGxaVkp0NVYzamVaSnc1YXlYU09YUlpFYWttNUtka3JnbHdxVXNrcVdsQXVZQzVncG1MYVY0cGd6U3ltWnA1bkNtZjZaemtzd214S2JRSno5bk01TTdVeG5uYzZnK0V3Rm9RNmlrYUs3bmxaTitaNytuZ1dmRDU4V256dWZBS1lDaUtBQUFBQUFnQUFvQUFpZ2dLQ0FBSUNBQUFxSWdBQ0FBQ0FxQUlBQVJDQVZJZ0JCc01vREMxRk5Bd0NYQlNER0JRRG5CZ0JGQndEaUNBQlRDUUROQ3lBNERnQnpEeUJkRXlCZ0dpQ3FHd0QwSEFEK0hTQi9MU0R3cGdDeXFnRCtBUUdyRGdGekVTRndFd0c0RmdHYUdnR2Z2QUVpNEFGTDZRRUFRWkRMQXd2VEJyTFAxQURvQTl3QTZBRFlCTndCeWdQY0Fjb0szQVFCQTl6SEFQREFBdHpDQWR5QXdnUGN3QURvQWR6QVFla0E2a0hwQU9vQTZjeXc0c1N3MkFEY3d3RGN3Z0RlQU56RkJkekJBTnpCQU40QTVNQkpDa01UZ0FBWGdFRVlnTUFBM0lBQUVyQVh4MEllcjBjYndRSGN4QURjd1FEY2p3QWpzRFRHZ2NNQTNNQ0J3WUFBM01FQTNLSUFKSjNBQU56QkFOekJBdHpBQWR6QUFOekNBTnpBQU56QUFOekFBTnpCc0cvR0FOekFpQURjbDhPQXlJRENnTVNxQXR5d1JnRGN6WUFBM01FQTNNRUEzTUlDM0VJYndnRGN3UUhjeExBTEFBZVBBQW1Dd0FEY3diQTJBQWVQQUFtdndMQU1BQWVQQUFtd1BRQUhqd0FKc0QwQUI0OEFDYkJPQUFtd1RnQUpoZ0JVQUZ1d05BQUhqd0FKc0R3QkNZOEFDYkJMQUFtd1BBRm5BQW1NQTJ1d093RjJBQW1NQTNxd0d3SGNtZ0RjZ0FEY2dBRFlzQVpCZ1lBQWhJUURnb0VBZ29EQkFBbUF3YkFOQU55d1B3QUhnQUVKc0NFQTNMS2V3ck9EQUFtZUFBbXdiQUFKaWNDd21nRGtzRjRBM3NBQTNMQ3F3QURjc0JZQUNaUEhnUURjcjhRRjNNRUEzSUFCM0xCQ0FBZU9BQW1sd0FEY3hyQUZBUW13Q1FBSGlnRUpzQklBQjdCbndrRUFCTnpCQTl6QVFRQUZBWU1BM0lYQWdzR3dsY0VBM01ZQTNNRUE2Z0RXQU53QXl1UUE2QUhrQU55QXdBRHBBTnpBQU55eW44RUJBY01DQWNHRHdJSUJBY0FBM01BQkFRUGN3TGdEemNLd1hBQUpzQy9mc2ZrQTJnRGtBT2dBM2dIZ3NEZ0JDTGh0bzhDRHlaL0JzQi9Cc09NQUNhUUFDYkJtQUFtYTBiQUlBdHlrQUFtd0xnQUhpd0FKc0w3QWdNRUEzSUhCaE1HQXdMQURBQW13eFFBSnVFYi9BQnF5ME1ZRzNNR3puQURjc0xFQTNMQmt4TFpoQU55QXdLZkFBQUVBM0lNQUNiQjB3QURjc2d6RHNWTEJzR2dCM01JQTNNQUQzTERFQUFtd0J3QUpzQWdBQ1FBSHNCVENyd0VKc0EwQUI3QWJBQW1JQUFld09RQUpBQWV3Z1FBSEFBbXdId0VIandBSmw4YUN4TENjQUFtQ0FBZVd3TEF5QUFrQUI3REtBQWtBQjdCTkFBbXdSUUFKQUFld1FnQUpzTndBQ1FBSHNORUJDWU1BQjdCckFBbXdJZ0FKa1FBSnNDQUFDYkYwQUFtdzBRQUhnQUVKc0NBQUNiaEZKd1FCc0FyR3RJZ0JCcmhFZXdBQnVBeVZBZGdDQVlJQTRnVFlod2ZjZ2NRQjNKM0RzR1BDdUFXS3hvRFFnY2FBd1lERXNOVEdzWVREdGE4RzNMQTh4UUFIQUVIdzBRTUw0ZzRCU3NCSkFrcUFBb0VDZ2dLREFzQUN3Z0lBQ29RQ1FpU0ZBc0FIZ0FtQ0NVQWtnQ0xFQW9JaWhDS0dJc1lDeUFMS0Fzd0Nod0tLSXM0Q2pDS1FJcElpamlLSUFva0NpZ0tDSkFBREFnTUVBNHNDZ0NRSUE0UUpoZ2xZSkFJS0JnT1lJcG9pbmlJQUNRb0RvQ0lNQXc0RFFBZ1FBeElEb2lLbUlzQUpwQ0tvSXFvaWpBS05BbzRDUUFOQ0EwUURnQU9QQW80a3dnZUlDWW9Ka0NSR0E2d2lBQVN3SWtJSXNpSUNCTFFpUUFSRUJMWWlRZ1RDSXNBaXhDTEdJc2dpUUFuQUJKRUN5aUxFQk13aXdnVFFJczRpa2dLVEFwUUNsUUpBQlVJRkNBcVdBcFFrUkFYRUI0d0pqZ25BQnBJa1JBZ0lJd29qZ0FVTUk0UUZrQW1TQ1E0amdnVVNJNFlGaUFVVUk0d0ZGaU9ZQ1lvRkhpT1FCU0FqbWdtT0JTUWpJaU9aQXBvQ213TEFCY0lGeEFXY0Fxd2t4Z1hJQmNZSGxBbVdDUUFIcWlRbUk4b0ZLaU1vSTBBalFpTkVJMFlqekFWS0kwZ2pUQ05PSTFBanVDU2RBczRGdmlRTUNsSWpBQWE4Skxva1FBWlVJMElHUkFaV0kxZ2pvQUtoQXFJQ293TEJBc01DQVFxa0FrTWtwUUxCQjRFSmd3bEJKSUVpeFFLRElvVWloeUxIQXNrQ3l3TE5BcWNDaXlMUEFvMGlrU0tUSW84aXFBS3BBcW9DZ3lRQkF3TURCUU9yQW9Fa0NRT0ZDWWNKV1NRRENnY0RtU0tiSXA4aUFRa0xBNkVpRFFNUEEwRUlFUU1UQTZNaXB5TEJDYVVpcVNLcklvQWpyQUt0QXE0Q1FRTkRBMFVEcndLUEpNTUhpUW1MQ1pFa1J3T3RJZ0VFaEFpeElrTUlzeUlEQkxVaVFRUkZCTGNpUXdURElzRWl4U0xISXNraVFRbkJCTEVDeXlMRkJNMGl3d1RSSXM4aXNnS3pBclFDdFFKQkJVTUZDUXEyQXBVa1JRWEZCNDBKanduQkJwTWtSUWdKSXdzamdRVU5JNFVGa1FtVENROGpnd1VUSTRjRmlRVVZJNDBGRnlPWkNZc0ZIeU9CSTVFRklTT2JDWThGSlNNakk3a0N1Z0s3QXNFRnd3WEZCYndDclNUSEJja0Z4d2VWQ1pjSkFRZXJKQ2NqeXdVckl5a2pRU05ESTBValJ5UE5CVXNqU1NPQ0kwMGpUeU5SSTdra3ZRTFBCYjhrRFFwVEk3OEN2U1NESTdza1FRWlZJME1HUlFaWEkxa2pBVEdBREFBdVJpUkVKRW9rU0NRQUNFSUpSQWtFQ0lnaWhpU0VKSW9raUNTdUlwZ2tsaVNjSkpva0FDTUdDZ0lqQkFwR0NjNEh5Z2ZJQjh3SFJ5UkZKRXNrU1NRQkNFTUpSUWtGQ0lraWh5U0ZKSXNraVNTdklwa2tseVNkSkpza0FTTUhDZ01qQlFwSENjOEh5d2ZKQjgwSFVDUk9KRlFrVWlSUkpFOGtWU1JUSkpRaWxpS1ZJcGNpQkNNR0l3VWpCeU1ZSXhrakdpTWJJeXdqTFNNdUl5OGpBQ1NpSktBa3BpU2tKS2drb3lTaEpLY2twU1NwSkxBa3JpUzBKTElrdGlTeEpLOGt0U1N6Skxja2dnaUFDSUVJQWdnRENKd2luU0lLQ2dzS2d3aEFDNG9zZ1F5SkxJZ3NRQ1ZCSlFBdEJ5NEFEVUFtUVNhQUxnRU55Q2JKSmdBdmhDOENEWU12Z2k5QURkZ20yU2FHTVFRTlFDZEJKd0F4aGpBR0RZVXdoREJCRFVBb0FESUhEVThvVUNpQU1vUXNBeTVYS0VJTmdTeUFMTUFrd1NTR0xJTXN3Q2hERGNBbHdTVkFLVVFOd0NiQkpnVXVBaTdBS1VVTkJTOEVMNEFOMENiUkpvQXZRQ3FDRGVBbTRTYUFNSUV3d0NxRERRUXdBekNCRGNBbndTZUNNRUFyaEExSEtFZ29oREdCTVFZdkNBMkJMd1V3UmcyRE1JSXhBQTRCRGtBUGdCR0NFUU1QQUEvQUVRRVBRQkVDRWdRU2dROUFFc0FQUWhLQUQwUVNoQktDRDRZU2lCS0tFc0FTZ2hLQkVZTVJReEJBRU1FUlFSQkJFUU1TQlJMQkVFRVNBQkJERXNBUVJSS0ZFc0lRaHhLSkVvc1N3UktERW9BUUFCRUJFUUFTQVJLQUVvRVNRQk5CRTBNVFFoTkVFOElUQUJUQUUwQVVnQlRBRkVBVlFSVkFGd0FYUVJmQUZ3QVlBaGdCR0VBWWdCZ0FHY0FZd1JnQkdVQVpRaGxCR1lBWndCbkNHY0VaZ0J6QUhNQWRnQjhBSUFJZ0JDQUdJQWdnUUNDQUlJSWd3Q0RCSUFBaHVDSzVJaEFqRVNNY0l4MGpUQ1JXSkUwa1Z5U01KSTBrbmlTZkpBQWxBaVVFSmNBckFTVURKUVVsd1N2Q0s4TXJ4Q3ZGSzhZcnh5dUFKWUlsaENYSUs0RWxneVdGSmNrcnlpdkxLOHdyelN2T0s4OHJBQ1lDSmdFbUF5YUFKb0ltZ1NhREpzSW14Q2JHSmdBc3d5YkZKc2NtQVN3Q0xBTXNCQ3dGTEFZc0J5ektKc3dtemlZSUxNc216U2JQSmdrc0Npd0xMQXdzRFN3T0xBOHMwaWJVSnRZbTB5YlZKdGNtMmliY0p0NG0yeWJkSnQ4bUFDY0NKd0VuQXllQUo0SW5nU2VESndBb0FpZ0VLQUVvQXlnRktFSW9SQ2hHS0Vrb1N5aE5LRUFzU2loTUtFNG9RU3hDTEVNc1JDeEZMRVlzUnl4UktGTW9WU2hJTEZJb1ZDaFdLRWtzU2l4TExFd3NUU3hPTEU4c2dpd0JMb0F4aHl3Qkx3SXZBeThHTG9VeEFEQUJNQUl3UUVaQlJvQkd3RWJDUnNGR0FFZEFSNEJId0VmQ1J3QkpRRW1BU1lKSkFFckNTUU5LQkVwQVNrRktnRXFCU3NCS3dVckFTOEZMQUVzQlMwQkxRVXZDUzhOTGdFdUJTNEpMZzBzQVRBRk1Ba3dEVEFCV1FGUkNWRVJVUmxSSVZFcFVURlJPVkZCVVVsUlVWRlpVZ0ZTQ1ZJUlV3RlRCVkFCVkFWVkFWVUZWZ0ZXQlZjQlZ3VldBVnNCWUFGY0NWd1JYQmxjSVZ3cFhERmNPVnhCWEVsY1VWeFpYUUZkQ1YwUlhnRmVCVjhCWHdWY0FXQUZZUUZoQldJQllnVmdBV1FGWkFsa0RXVUJaZ0k2Q2pzQ09BSThCajBDUFFZK0JqNENQZzQvQWo4R1BBSkFBUWVEZ0F3dW1IL29ZRjFZTlZoSVRGZ3dXRVRicEFqWk1OdUVTRWhZVERoQU80aElTREJNTStoa1hGbTBQRmc0UEJSUU1HdzhPRHd3ckRnSTJEZ3NGRlVzVzRROE13ZUlRRE9JQS96QUMvd2dDL3llL0lpRUNYMThoSW1FQ0lRSkJRaUVDSVFLZmZ3SmZYeUVDWHo4Q0JUOGlaUUVEQWdFREFnRURBdjhJQXY4S0FnRURBbDhoQXY4eW9pRUNJU0pmUVFML0FPSThCZUlUNUFwdTVBVHVCb1RPQkE0RTdnbm1hSDhFRGo4Z0JFSVdBV0F1QVJaQkFBRUFJUUxoQ1FEaEFlSWJQd0pCUXY4UVlqOE1YejhDNFN2aUtQOGFENFlvL3kvL0JnTC9XQURoSGlBRXR1SWhGaEVnTHcwQTVpVVJCaFltRmlZV0J1QUE1Uk5nWlRiZ0E3dE1OZzAyTCtZREZoc0FOdVVZQk9VQzVnM3BBbllsQnVWYkZnWEdHdyttSkNZUFppWHBBa1V2QmZZR0FCc0ZCdVVXNWhNZzVWSG1Bd1hnQnVrQzVSbm1BU1FQVmdRZ0JpM2xEbVlFNWdFRVJnU0dJUFlIQU9VUlJpQVdBT1VENEMzbERRRGxDdUFENWdjYjVoZ0g1UzRHQndZRlIrWUFad1luQmNibEFpWTI2UUlXQk9VSEJpY0E1UUFnSlNEbERnREZBQVZBWlNBR0JVZG1JQ2NnSndZRjRBQUhZQ1VBUlNZZzZRSWxMYXNQRFFVV0JpQW1Cd0NsWUNVZzVRNEF4UUFsQUNVQUpTQUdBRWNtWUNZZ1JrQUd3R1VBQmNEcEFpWkZCaGJnQWlZSEFPVUJBRVVBNVE0QXhRQWxBSVVnQmdWSGhnQW1Cd0FuQmlBRjRBY2xKaURwQWhZTndBV21BQVluQU9VQUlDVWc1UTRBeFFBbEFJVWdCZ1VIQmdkbUlDY2dKd2JBSmdkZ0pRQkZKaURwQWc4RnErQUNCZ1VBcFVCRkFHVkFKUUFGQUNWQUpVQkZRT1VFWUNjR0owQkhBRWNHSUFXZ0IrQUc2UUpMcncwUGdBWkhCdVVBQUVVQTVROEE1UWhBQlVabkFFWUFac0FtQUVXQUpTWWc2UUxBRnNzUEJRWW5GdVVBQUVVQTVROEE1UUlBaFNBR0JRY0dod0FHSndBbkpzQW53QVVBSlNZZzZRSUFKZUFGSmlmbEFRQkZBT1VoSmdWSFpnQkhBRWNHQlE5Z1JRZkxSU1lnNlFMckFRK2xBQVluQU9VS1FPVVFBT1VCQUFVZ3hVQUdZRWRHQUFZQTV3Q2c2UUlnSnhiZ0JPVW9CaVhHWUEybEJPWUFGdWtDTnVBZEpRQUZBSVVBNVJBQUJRRGxBZ1lsNWdFRklJVUFCQUNtSU9rQ0lHWGdHQVZQOWdjUEZrOG1yK2tDNndJUEJnOEdEd1lTRXhJVEorVUFBT1VjWU9ZR0I0WVdKb1htQXdEbUhBRHZBQWF2QUMrV2J6YmdIZVVqSjJZSHBnY21KeVlGNlFLMnBTY21aVVlGUnlYSFJXYmxCUVluSnFjR0JRZnBBa2NHTCtFZUFBR0FBU0RpSXhZRVF1V0F3UUJsSU1VQUJRQmxJT1VoQUdVZzVSa0FaU0RGQUFVQVpTRGxCd0RsTVFCbElPVTdJRWIyQWVzTVFPVUk3d0tnNFU0Z29pQVI1WUhrRHhibENSZmxFaElUUU9WRFZrcmxBTURsQlFCbFJ1QUQ1UXBHTnVBQjVRb200QVRsQlFCRkFDYmdCT1VzSmdmRzV3QUdKK1lEVmdSV0RRVUdJT2tDb09zQ29MWVJka1liQU9rQ29PVWJCT1V0d0lVbTVSb0dCWURsUHVBQzVSY0FSbWNtUjJBbkJxZEdZQTlBTnVrQzVSWWdoZUFENVNSZzVSS2c2UUlMUU84YTVROG1Kd1lnTnVVdEJ3WUh4Z0FHQndZbjVnQ241Z0lnQnVrQ29Pa0NvTllFdGlEbUJnZ200RGRtQitVbkJnZUdCd2FIQmlmRllPa0MxdThDNWdIdkFVQW1CK1VXQjJZbkpnZEdKZWtDNVNRR0J5WkhCZ2RHSitBQWR1VWM1d0RtQUNjbVFKYnBBa0JGNlFMbEZxUTI0Z0hBNFNNZ1FmWUE0QUJHRnVZRkI4WmxCcVVHSlFjbUJZRGlKT1EzNGdVRTRocmtIZVl5QUliL2dBN2lBUDlhNGdEaEFLSWdvU0RpQU9FQTRnRGhBS0lnb1NEaUFBQUJBQUVBQVFBL3d1RUE0Z1lnNGdEakFPSUE0d0RpQU9NQWdnQWlZUU1PQWs1Q0FDSmhBMDVpSUNKaEFFN2lBSUZPSUVJQUltRURMZ0QzQTV1eE5oUVZFalFWRWhUMkFCZ1pteGYyQVJRVmRqQldEQklUOWdNTUZoRDJBaGViQVBzQ0N3UWdxMHdTRXdUckFrd1NFd0RrQlVEdEdPQUk1Z1ZvQmtqbUJPQUhMd0Z2QVM4Q1FTSkJBZzhCTHd5QnJ3RVBBUThCRDJFUEFtRUNaUUl2SWlHTVAwSVBEQzhDRCtzSTZocy9hZ3N2WUl5UExHOE1Md3d2RE04TTd4Y3NMd3dQRE84WDdJQ0U3d0FTRXhJVDd3d3N6eElUNzBrTTd4YnNFZThnck84OTRCSHZBK0FONnpUdlJ1c083NEF2RE84QkRPOHU3QUR2Wnd6dmdIQVNFeElURWhNU0V4SVRFaE1TRStzVzd5U01FaFBzRnhJVEVoTVNFeElURWhQc0NPK0FlT3g3RWhNU0V4SVRFaE1TRXhJVEVoTVNFeElURWhNU0UrdzNFaE1TRSt3WUVoUHNnSHJ2S093Tkw2enZIeUR2R0FEdlllRW5BT0luQUY4aEl0OUJBajhDUDRJa1FRTC9XZ0t2ZjBZL2dIWUxOdUllQUFLQUFpRGxNTUFFRnVBR0J1VVA0QUhGQU1VQXhRREZBTVVBeFFERkFNVUE1aGcyRkJVVUZWWVVGUllVRmZZQkVUWVJGaFFWTmhRVkVoTVNFeElURWhPV0JQWUNNWFlSRmhMMkJTOFc0Q1h2RWdEdlVlQUU3NEJPNEJMdkJHQVhWZzhFQlFvU0V4SVRFaE1TRXhJVEx4SVRFaE1TRXhJVEVSSXpEK29CWmljUmhDOUtCQVVXTHdEbFRpQW1MaVFGRWVWU0ZrUUZnT1VqQU9WV0FDOXI3d0xsR084YzRBVGxDTzhYQU9zQzd4YnJBQS9yQis4WTZ3THZIK3NINzRDNDVaazQ3empsd0JGMVFPVU5CT1dENzBEdkwrQUI1U0NrTnVXQWhBUlc1UWpwQWlYZ0RQOG1CUVpJRnVZQ0ZnVC9GQ1FtNVQ3cUFpYTI0QUR1RCtRQkx2OEdJdjgyQk9JQW4vOENCQzUvQlg4aS93MWhBb0VDL3dJZ1gwRUNQK0FpUHdVa0FzVUdSUVpsQnVVUEp5WUhid1pBcXk4TkQ2RGxMSGJnQUNmbEt1Y0lKdUFBTnVrQ29PWUtwVllGRmlVRzZRTGxGT1lBTnVVUDVnTW40QU1XNVJWQVJnZmxKd1luWmljbVIvWUZBQVRwQW1BMmhRWUU1UUhwQW9VQTVTR21KeVluSnVBQlJRYmxBQVlISU9rQ0lIYmxDQVNsVHdVSEJnZmxLZ1lGUmlVbWhTWUZCZ1hnRUNVRU51VURCeVluTmdVa0J3YmdBcVVncFNDbDRBSEZBTVVBNGlNT1pPSUJCQzVnNGtqbEd5Y0dKd1luRmdjR0lPa0NvT1dySE9BRTVROWc1U2xnL0lkNC9aaDQ1WURtSU9WaTRCN0M0QVNDZ0FVRzVRSU01UVVBaFFBRkFDVUFKUURsWk80STRBbmxnT01URXVBSTVUZ2c1UzdnSU9VRURROGc1Z2pXRWhNV29PWUlGakV3RWhNU0V4SVRFaE1TRXhJVEVoTVNFellTRTNaUVZnQjJFUklURWhNU0UxWU1FVXdBRmcwMllJVUE1WDhnR3dCV0RWWVNFeFlNRmhFMjZRSTJURGJoRWhJV0V3NFFEdUlTRWd3VERCSVRGaElUTnVVQ0JPVWxKT1VYUUtVZ3BTQ2xJRVZBTFF3T0R5MEFEMnd2NEFKYkx5RGxCQURsRWdEbEN3QWxBT1VISU9VRzRCcmxjNEJXWU9zbFFPOEI2aTFyN3drclR3RHZCVUFQNENmdkpRYmdldVVWUU9VcDRBY0c2eE5nNVJocjRBSGxEQXJsQUFxQTVSNkdnT1VXQUJibEhHRGxBQmFLNENMaElPSWc1VVlnNlFLZzRSeGc0aHhnNVNEZ0FPVXM0QU1XNElBSTVZQ3Y0QUhsRHVBQzVRRGdnQkNsSUFVQTVTUUFKVUFGSU9VUEFCYnJBT1VQTDh2bEYrQUE2d0hnS09VTEFDV0FpK1VPcTBBVzVSS0FGdUE0NVRCZ0t5WHJDQ0RySmdWR0FDYUFabVVBUlFEbEZTQkdZQWJyQWNEMkFjRGxGU3NXNVJWTDRCamxBQS9sRkNaZ2k5YmdBZVV1UU5ibERpRHJBT1VMZ09zQTVRckFkdUFFeStCSTVVSGdMK0VyNEFYaUs4Q3I1UnhtNEFEcEF1Q0FudXNYQU9VaUFDWVJJQ1hnUnVVVjZ3SUY0QURsRHVZRGE1YmdUdVVOeStBTTVRL2dBUWNHQitVdDVnZldZT3NNNlFMZ0IwWUg1U1ZIWmljbU5odDI0QU1iSU9VUndPa0NvRWJsSElZSDVnQUE2UUoyQlNjRjRBRGxHd1kyQmVBQkpnZmxLRWZtQVNkbGRtWVdCd2JwQWdVV0JWWUE2d3pnQStVS0FPVVJSMFluQmdjbXRnYmdPY1VBQlFCbEFPVUhBT1VDRnFEbEp3Wkg1Z0NBNlFLZ0ppY0E1UUFnSlNEbERnREZBQ1VBaFFBbUJTY0daeUFuSUVjZ0JhQUhnSVVuSU1aQWh1Q0FBK1V0UitZQUowWUhCbVdXNlFJMkFCWUdSZUFXNVNoSHBnY0daeVlISmlVV0JlQUE2UUxnZ0I3bEowZG1JR2NtQnliMkQyVW00QnJsS0VmbUFDY0dCeVpXQmVBRDZRS2c5Z1hnQytVakJnY0dKNllIQmdYQTZRTGdMdVVUSUVZblpnZUdZT2tDSzFZUDRJQTQ1U1JINWdFSEpoYmdYT0VZNGhqcEF1c0I0QVRsQUNBRklPVUFBQ1VBNVJDbkFDY2dKZ2NHQlFjRkJ3Wlc0QUhwQXVBKzVRQWc1UjlIWmlBbVp3WUZGZ1VINEJNRjVnTGxJS1lIQldiMkFBYmdBQVdtSjBibEp1WUZCeVpXQlpiZ0ZlVXg0SUIvNVFFQTVSMEh4Z0NtQndZRmx1QUM2UUxyQzBBMjVSWWc1ZzRBQjhZSEpnY200RUhGQUNVQTVSNm1RQVlBSmdER0JRYmdBT2tDb0tVQUpRRGxHSWNBSmdBbkJnY0dCY0RwQXVDQXJ1VUxKaWMyNElBdkJlQUg2dzN2QUczdkNlQUZGdVdERXVCZTZtY0FsdUFENVlBODRJbzA1WU9uQVBzQjRJOC81WUcvNEtFeDVZR3h3T1VYQU9rQ1lEYmdXT1VXSUlZVzRBTGxLTWFXYjJRV0QrQUM2UUlBeXdEbERZRGxDK0NDS09FWTRoanJEM2JnWGVWRFlBWUY1eS9BWnVRRjREZ2tGZ1FHNEFNbjRBYmxsM0RnQU9XRVR1QWk1UUhnb20vbGdKZmdLVVhnQ1dYZ0FPV0JCT0NJZk9WamdPVUZRT1VCd09VQ0lBOG1GbnZna3RUdmdHN2dBdThmSU84MEowWlBwL3NBNWdBdnh1OFdadTh6NEEvdk9rWVA0SUFTNnd6Z0JPOVA0QUhyRWVCLzRSTGlFdUVTd2dEaUN1RVM0aElCQUNFZ0FTQWhJR0VBNFFCaUFBSUF3Z0RpQStFUzRoSWhBR0VnNFFBQXdRRGlFaUVBWVFDQkFBRkF3UURpRXVFUzRoTGhFdUlTNFJMaUV1RVM0aExoRXVJUzRSTGlGQ0RoRVF6aUVReWk0UkVNNGhFTW91RVJET0lSREtMaEVRemlFUXlpNFJFTTRoRU1vajhnNlNydmdYam1MMi9tS3U4QUJ1OEdCaStXNEFlR0FPWUg0SVRJeGdEbUNTREdBQ1lBaHVDQVRlVWxRTWJFSU9rQ1lBVVA0SURvNVNSbTZRS0FEZUNFZU9XQVBTRHJBY2JnSWVFYTRockdCR0RwQW1BMjRJS0o2ek1QU3cxcjRFVHJKUS9yQitDQU9tVUE1Uk1BSlFBRklBVUE1UUlBWlFBRkFBV2dCV0FGQUFVQUJRQkZBQ1VBQlNBRkFBVUFCUUFGQUFVQUpRQUZJR1VBeFFCbEFHVUFCUURsQWdEbENZQkZBSVVBNVFuZ0xDemdnSWJ2SkdEdlhPQUU3d2NnN3djQTd3Y0E3eDNnQXVzRjc0QVo0RER2RmVBRjd5Umc3d0hBTCtBR3IrQ0FFdStBYzQ3dmdsRGdBTzhGUU84RlFPOXM0QVR2VWNEdkJPQU03d1JnN3pEZ0FPOENvTzhnNEFEdkZpQXY0RWJ2Y1FEdlNnRHZmK0FFN3dZZ2owQlBnTS9nQWU4UndNL2dBVS9nQmMvZ0llK0FDd0R2TCtBZDZRTGdnMzdsd0daVzRCcmxqNjNnQStXQVZpRGxsZnJnQnVXY3FlQ0xsK1dCbHVDRld1V1N3K0RLckM0YjRCYjdXT0I0NW9CbzRNQzlpUDNBdjNZZy9jQy9kaUFBQVBVckFBQjZGQUFBL0FVQUFBQUFBQUNBQUFFQW9BQUJBSEFCQVFBUUF3RUFRd01CQUdBREFRQ3dBd0VBMEFNQkFOc0RBUUR3QXdFQUlKRUFBQkFFQVFBd0JBRUFVQVFCQUhBRUFRQ2dCQUVBV1FZQkFGNEdBUUJ3QmdFQXNBWUJBTkFHQVFCQUNBRUFtUWdCQUtVSUFRQ3FDQUVBc0FnQkFQSUlBUUQyQ0FFQUVBa0JBR0FKQVFDYUNRRUFzQWtCQU04SkFRRFlDUUVBNEFrQkFLQUtBUUR3Q2dFQThBc0JBQm9NQVFBd0RBRUFVQXdCQUFBTkFRRHdEUUVBREE0QkFCQU9BUUJnRGdFQThBNEJBSkFQQVFDUWpBQUFnSWtBUVpDQUJBdGtIQURJQUpzQk13QVBBRUVBSUFBTEFBd0FFUUJ5QWg4QUZ3QVdBQ0VBdVFFRkFBb0FOUUFYQUdZQldRQU1BQVVBQkFCQ0FBUUFEd0JIQURvQUN3QWZBQWtBQkFDOEFFY0E4UUFxQUF3QUZnQ3JBTzRBSEFBRUFFSUFrQUNjQURNQUZRUzBBZ0JCZ0lFRUM5SUZySUQrZ0VUYmdGSjZnRWdJZ1U0RWdFTGlnR0ROWm9CQXFJRFdnQUFBQUFEZGdFTndFWUNaQ1lGY0g0Q2Fnb3FBbjRPWGdZMkJ3SXdZRVJ5UkF3R0pBQlFvRVFrQ0JSTWt5aUVZQ0FnQUlRc0xrUWtBQmdBcFFTR0RRS2NJZ0plQWtJQkJ2SUdMaUNRaENSU05BQUdGbDRHNEFJQ2NnNGlCUVZXQm5vbEJrcFcrZzUrQllOUmlBQU9BUU5JQWdHRFV3TlNBeGdFSUNRdUFpd0FHZ01BRER3YUFtd01FQUJhQVFWT0JtSUNZZ0o2QW1JQ2VnSmlBbm9DWWdKNkFtQWVCc1ZYL0dKb0JBQWlBaVFNQUFDZ1lBQUFDQVFBSUFBQUFBQUVBQ3dZREF3Q0FpWUNRSWdTQWtBQUFBQUFBQUFBQVEwU0FRbW1OQUFFQkFNZUtyNHdHajREa014a0xnS0tBblkvbGl1UUtpQUlEUUthTEZvV1R0UW1PQVNLSmdaeUN1VEVKZ1ltQWlZR2NncmtqQ1F1QW5RcUFpb0s1T0JDQmxJR1ZFNEs1TVFtQmlJR0pnWjJBdWlJUWdvbUFwNE81TUJBWGdZcUJuSUs1TUJBWGdZcUJtNE81TUJDQ2lZQ0pnWnlDeWlnQWg1R0J2QUdHa1lEaUFTaUJqNEJBb3BDS2lvQ2o3WXNBQzVZYkVCRXlnNHlMQUltRFJuT0JuWUdkZ1oyQndaSkF1NEdoZ1BXTGc0aEEzWVM0aVlHVHlZRytoSytPdTRLZGlBbTRpckdTUWErTlJzQ3pTUFdmWUhoemg2R0JRV0VIZ0phRTE0R3hqd0M0Z0tXRW00dXNnNitMcElEQ2pZc0hnYXlDc1FBUkRJQ3JKSUJBN0lkZ1R6S0FTRmFFUm9VUURJTkRFNE5CZ29GQlVvSzBqYnVBcklqR2dxT0xrWUc0Z3ErTWpZSGJpQWdvUUorSmxvTzVNUW1CaVlDSmdVRFFqQUxwa1VEc01ZYWNnZEdPQU9tSzVvMUJBSXhBOWlnSkNnQ0FRSTB4SzRDYmlha2dnNUdLclkxQmxqaUcwcFdBamZrcUFBZ1FBb0RCSUFpRFFWdURZRkJYQUxZejNJRmdUS3VBWUNOZ01KQU9BUVJKRzRCSDU1bUZtWVdaQUFBQUFBQkFxWUNPZ0VIMGlER2RoTitBczRCWnNMNk1nS0drUXJDQWpJQ1BqRURTajBOUG1VZVJnV0I2SFlGQTBZQkFob0ZEWVlOZ0lWK1BRMFdaWWN4Zm1ZV1poWmtBUWVDR0JBdEJTYjJBbDRCQlpZQ1hnT1dBbDRCQTZZQ1JnZWFBbDREMmdJNkFUVlNBUk5XQVVDQ0JZTTl0Z1ZPZGdKZUFRVmVBaTRCQThJQkRmNEJndURNSGhHd3VyTjhBUWJDSEJBczNRMDZBVGc2QlJsS0JTSzZBVVAyQVlNNDZnTTZJYlFBR0FKM2YvMER2VGc5WWhJRklrSUNVZ0U5cmdVQzJnRUxPZ0UvZ2lFWm5nQUJCOEljRUN4RkYvNFZBMW9Dd2dFSFJnR0VIMllDT2dBQkJrSWdFQ3pkRGVZQkt0NEQrZ0dBaDVvRmd5OENGUVpXQjh3QUFBQUFBQUFDQVFSNkJBRU41Z0dBdEg0Rmd5OENGUVpXQjh3QUFBQUFBQUFDQUFFSFFpQVFMRmtIRENBaUJwSUZPM0tvS1RvYy9QNGVMZ0k2QXJvQUFRZkNJQkFzaFFONkF6NENYZ0VROGdGa1JnRURrUHorSGlSRUZBaEdBcVJHQVlOc0hob3VFQUVHZ2lRUUxoUVJBbndZQUFRQUJFaENDbjREUEFZQ0xCNEQ3QVFHQXBZQkF1NGllS1lUYUNJR0pnS01FQWdRSWdNbUNuSUJCazRCQWs0RFhnMExlaC9zSWdOSUJnS0VSZ0VEOGdVTFVnUDZBcDRHdGdMV0FpQU1EQTRDTGdJZ0FKb0NRZ0lnREF3T0FpNEJCUVlEaGdVWlNnZFNEUlJ3UWlvQ1JnSnVNZ0tHa1FObUFRTlVBQUFBQUFBQUJQeitIaVJFRUFDa0VFb0NJRW9DSUVSRUVDSThBSUlzU0tnZ0xBQWVDakFhU2dacUFqSXFBMWhnUWlnRU1DZ0FRRVFJR0JSeUZqNCtQaUlCQW9RaUJRUGVCUVRUVm1acEZJSURtZ3VTQVFaNkJRUENBUVM2QTBvQ0xRTldwZ0xRQWd0OEpnTjZBc04yQ2pkK2VnS2VIcm9CQmYyQnltNEZBMFlCQWhvRkRZWU9JZ0dCTmxVRU5DQUNCaVFBQUNZTERnZW1saG9za0FKY0VBQUVCZ091Z1FXcVJ2NEcxcDR5Q21aV1VnWXVBa2dNYUFJQkFoZ2lBbjVsQWd4VU5EUW9XQm9DSVlMeW1nMVM1aG8ySHY0VkNQdFNBeGdFSUNRdUFpd0FHZ01BRER3YUFtd01FQUJhQVFWT0JRU09Cc1ZYL0dKb0JBQWlBaVFNQUFDZ1lBQUFDQVFBSUFBQUFBQUVBQ3dZREF3Q0FpWUNRSWdTQWtFSkRpb1NlZ0orWmdxS0E3b0tNcTRPSU1VbWRpV0Q4QlVJZGF3WGhULyt2aVRXWmhVWWJnRm53Z1ptRXRvTUFBQUFBQUFBQUFLeUFSVnVBc29CT1FJQkVCSUJJQ0lXOGdLYUFqb0JCaFlCTUF3R0FuZ3VBUWRxQWtvRHVnR0ROajRHa2dJbUFRS2lBVDU2QUFFR3dqUVFMRjBGSWdFVW9nRWtDQUlCSUtJRkl4SVZDdUlGdDNOV0FBRUhRalFRTDVnTGRBSURHQlFNQmdVSDJRSjRISlpBTGdJaUJRUHlFUU5DQXRwQ0FtZ0FCQUVDRk80RkFoUXNLZ3NLYTJvcTVpcUdCUU1pYnZJQ1BBb09iZ01tQWo0RHRnSStBN1lDUGdLNkN1NENQQm9EMmdQNkE3WUNQZ095Qmo0RDdnUHNvZ09xQWpJVEtnWm9BQUFPQndSQ0J2WUR2QUlHbkM0U1lNSUNKZ1VMQWdrUm9pb2lBUVZxQ1FUZzVnSytOOVlDT2dLV0l0WUZBaVlHL2hkR1lHQ2dLc2I3WWk2UWlna0c4QUlLS2dveUNqSUtNZ1V6dmdrRThnRUg1aGVpRDNvQmdkWEdBaXdpQW00SFJnWTJoNVlMc2dVREpnSnFSdUlPamdONkFpNENqZ0VDVWdzQ0Rzb0RqaElpQy80RmdUeStBUXdDUFFRMEFnSzZBcklIQ2dFTDdnRWdEZ1VJNmhVSWRpa0ZuZ2ZlQnZZRExnSWlDNTRGQXNZSFFnSStBbHpLRVFNd0NnUHFCUVBxQi9ZRDFnZktBUVF5QlFRRUxnRUNiZ05LQWtZRFFnRUdrZ0VFQkFJSFFnR0JOVjRTNmhrUlhrTStCWUdGMEVpODVocDJEVDRHR1FiU0RSZCtHN0JDQ0FFSEFrQVFMeFFGQXRvQkNGNEZEYllCQnVJQkRXWUJDNzREK2dFbENnTGVBUW1LQVFZMkF3NEJUaUlDcWhPYUIzSUpnYnhXQVJmV0FROEdBbFlCQWlJRHJnSlNCWUZSNmdGUHJnRUpuZ2tUT2dHQlFxSUZFbXdpQVlIRlhnVWdGZ3ErSk5abUZZUDZvaVRXWmhXQXY3d21IWUMveGdRQUFZREFGZ1ppSWpZSkR4Rm0vdjJCUi9HQlpBa0Z0Z2VsZ2RRbUFtbGYzaDBUVnFZaGdKR1pCaTJCTkEyQ20zYUZRTklwQTNZRldnWTFkTUV3ZVFoMUY0Vk5LWUNBTGdVNC9oUHFFU3U4UmdHQ1ErUWtBZ1FCQmtKSUVDMGRnL2MrZlFnMkJZUC85Z1dELy9ZRmcvLzJCWVAvOWdXRC8vWUZnLy8yQllQLzlnV0QvL1lGZy8vMkJZUC85Z1dELy9ZRmcvLzJCWVAvOWdXRC8vWUZnLy8yQllQLzlnUUJCNEpJRUMwV2dqb21HbVJpQW1ZT2hNQUFJQUFzREFvQ1dnSjZBWHhlWGg0NkJrb0NKUVRCQ3owQ2ZRbldkUkd0Qi8vOUJnQk9Zam9CZ3pReUJRUVNCaUlTUmdPT0FYNGVCbDRFQVFiQ1RCQXUzQXFFRGdFQ0NnSTZBWDF1SG1JRk9Cb0JCeUlPTWdtRE9JSU5BdkFPQTJZRmdMbitaZ05pTFFOVmg4ZVdaQUFBQUFLQ0FpNENQZ0VWSWdFQ1RnVUN6Z0txQ1FQV0F2QUFDZ1VFa2dVYmpnVU1WQTRGREJJQkF4WUZBeXdTQVFUbUJRV0dEUUswSmdVRGFnY0NCUTd1QmlJSk40NENNZ0VIRWdHQjArNEJCRFlGQTRnS0FRWDJCMVlIZWdFQ1hnVUNTZ2tDUGdVRDRnR0JTWlFLQlFLaUFpNENQZ01DQVN2T0JSUHlFUU95QjlJUCtna0NBRFlDUGdkY0lnZXVBUWFDQlFYUU1qdWlCUVBpQ1FnUUFnRUQ2Z2RhQlFhT0JRck9CWUV0MGdVQ0VnTUNCaW9CRFVvQmdUZ1dBWGVlQUFBQUFBT2lCUU1PQVFSaUFuWUN6Z0pPQVFUK0E0UUNBV1FpQXNvQ01Bb0JBZzRCQW5JQkJwSUJBMVlGTE1ZQmhwNlNCc1lHeGdiR0JzWUd4Z2JHQnNZR3hnYkdCc1lHeGdiR0JBRUh3bFFRTDhRR2dnSWtBZ0lvS2dFTTlCNEJDQUlDNGdNZUFqUUdCUUxPQXFvb0FRT3FCdFk2ZWdFRUVnVVR6Z1VDckE0VkJOb0ZERklkREJJRDdnc2FCUUp3U2dLWVpnVUU1Z1VGaGcwQ3RDSUpBMm9TOWdVTzdnWWlDVGVPQWpBT0FpUUNCUWJDQllIVDZnVUVNZ2tEaWhFRjlnZFdCM29CQWxvSkFrb0wrZ0krQlFQaUFZRkpqRUlOQXFJQ0pBSUNLQ29EQUFZQkVPWUN2Z0VTRmdFREdnRUUxZ1VDWGhjT0YySU5EdDRSQTdJYnZnLzZDUUlBTmdJK0IxNFRyZ0VHZ2dvdUJRV1VhanVpQlFQaUNRZ1FBZ0VENmdkWUxnVUdkZ3F5QVFvU0JSWGFFWUVYNGdVQ0VnTUNDaVlCRFVZRmdUZ1dBWGVhREFFSHdsd1FMTm1Bei8xbS92MkJSL0dCYUVBZ0FnWWtBQUFtQ1lRWFZZS2Jkb1ZBMGlrRGRnVmFCalYwd1ZCNVRTbGdLZ21EbDhZOXRBdTlBN3dCQnNKZ0VDeGFJaEpHQTQ0Q1pnRlhlZ0VsK2lwd01nSzZBVDUrQUFFSFFtQVFMZ2dTbmdaRUFnSnNBZ0p3QWdLeUFqb0JPZllOSFhJRkptNEdKZ2JXQmpZRkFzSUJBdnhvcUFnb1lHQUFEaUNDQWtTT0lDQUE1bmdzZ2lBbVNJWWdoQzVlQmp6dVREb0ZFUEkzSkFSZ0lGQndTalVHU2xRMkFqVGcxRUJ3QkRCZ0NDWWtwZ1l1U0F3Z0FDQU1oS3BlQmlnc1lDUXVxRDRDbklBQVVJaGdVQUVEL2dFSUNHZ2lCalFtSlFkMkpEMkRPUEN5QlFLR0JrUUNBbXdDQW5BQUFDSUZnMTNhQXVJQzRnTGlBdUlBQUFBQUFBS0lGQkludUE0QmZqSUNMZ0VEWGdKV0EyWVdPZ1VGdWdZdUFRS1dBbUlvYVFNYUFRT2FCaVlDSWdMa1loSWdCQVFrREFRQUpBZ0lQRkFBRWk0b0pBQWlBa1FHQmtTZ0FDZ3dCQzRHS0RBa0VDQUNCa3d3b0dRTUJBU2dCQUFBRkFnV0FpWUdPQVFNQUF4Q0Fpb0d2Z29pQWpZQ05nRUZ6Z1VIT2dwS0JzZ09BUk5tQWk0QkNXQUNBWWIxcGdFREpnRUNmZ1l1QmpRR0p5cGtCbG9DVEFZaVVnVUN0b1lIdkNRS0IwZ3FBUVFhQXZvb29sekVQaXdFWkE0R01DUWVCaUFTQ2l4Y1JBQU1GQWdYVnI4VW5DajBRQVJDQmlVRGlpMEVmcm9DSmdMR0EwWUN5N3lJVWhvaVlOb2lDaklZQUFLSUZCSWxmMG9CQTFJQmczU3FBWVBQVm1VSDZoRVd2ZzJ3R2E5OWg4L3FFWUNZY2dFRGFnSStEWWN4MmdMc1JBWUwwQ1lxVWtoQWFBakFBbDRCQXlBdUFsQU9CUUswU2hOS0FqNEtJZ0lxQVFqNEJCejJBaUlrS3Q0QzhDQWlBa0JDTUFFSGduQVFMK1FSZ0l4bUJRTXdhQVlCQ0NJR1VnYkdMcW9DU2dJd0hnWkFNRHdTQWxBWUlBd0VHQTRHYmdLSUFBeENBdklLWGdJMkFRMXFCc2dPQVljU3RnRURKZ0VDOUFZbkttUUNYZ0pNQklJS1VnVUN0b0l1SWdNV0FsWXVxSEl1UUVJTEdBSUJBdW9HK2pCaVhrWUNaZ1l5QTFkU3Z4U2dTQ3BJT2lFRGlpMEVmcm9DSmdMR0EwWUN5N3lJVWhvaVlOb2lDaklaQXFBT0FYNHlBaTRCQTE0Q1ZnTm1Gam9GQmJvR0xnTjZBeFlDWWlocEF4b0JBNW9HSmdJaUF1UmdvaTREeGlmV0JpZ0FBS0JBb2lZR09BUU1BQXhDQWlvU3Nnb2lBallDTmdFRnpnVUhPZ3BLQnNnT0FSTm1BaTRCQ1dBQ0FZYjFsUVArTWdwNkF1NFdMZ1kwQmlaRzRtbzZKZ0pNQmlBT0lRYkdFUVQySFFRbXYvL09MMUtxTGc3ZUhpWVduaDUzUmk2NkFpWUJCdUVEL1EvMEFBQUFBUUt5QVFxQ0FRc3VBUzBHQlJsS0IxSU5IKzRTWmhMQ1BVUE9BWU15YWowRHVnRUNmZ002SVlMeW1nMVRPaDJ3dWhFLy9IdzhIQXdFQUFBQUFBQUFBQUlBQUFBQUFDQUFBQUFBQkFBQUFJQUFBQUFBRUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUNBQUFBQWdBQUFBSUFBQUFDQUFBQUFnQUFBQUlBQUFBQ0FBQUFBZ0FBQUFJQUFBQUNBQUFBQWdBQUFBSUFBQUFDQUFBQUFnQUFBQUlBQUFBQ0FBQUFBd0FBQUFNQUFBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBRUFBQUFCQUFBQUFRQUFBQUVBQUFBQlFBQUFBVUFRZU9oQkF1VkFvQUFBQUFBWUU3Q1VLZjAxTlFBQUFCQUFBQUFBTkpvSURmSzVSNEtqV1NFTVhvK0ZiaDFNcGd0eEdsVG5hcXFxaXFycXFxcU1DZGhLRlI2YW1xaEpvZ201djN6UG9NVEFDVkVwOGk2Qm1lMEl3bkh3SUx4S1pjaTdUM0lzdjEvbmlFclY2MmxpRHZESUtzcGZOb0FBQUFnQUFBQUFINjFVQit6aEZpc3hpeXlIbS9pcG9vWTRTRWVzcXBkRENITm5SM2tOSmhEZUV3a0hXVU5lamFKQmJRY0RENFhyRnZaU3h3Tks5ZW9hTmZxRzB6TytKaHBOSkFiNVhJUEJUOURPeHNWYjdBdWRXL3JHamo4UnB6ck9LQWFGLzA3RG1Jd1dScFdqSTJ6dy9RVkd1YWlsU3ZjTU5ZWitkNTl6Sm1abVJtYW1abVpnT3hmR1RHVVlJcDc3aWdaK1NKUEM4OXE5QmdZNHdhTVJqTENHRDJmQ3R3QVFZT2tCQXZPQVNCSEE3Z3lBQUFBUUNZOFRVcEhBN2hTL2RuVldRQUFBR0NPQm5CbEpqeE5hdkNwczI1SEE3aHlqZ0JxZHYzWjFYbHRQd1Y5QUFBQWdOOSt6SUtPQm5DRnJnWHZoeVk4VFlwRjNZMk04S216amdFRndaQkhBN2lTVEhpYWxJNEFhcGJXQ1NpWS9kblZtWStVZEp0dFB3V2RzOGFJbmdBQUFLQTNyV3VoMzM3TW9pTVdJNlNPQm5DbEFBQUFBQUVBQUFBS0FBQUFaQUFBQU9nREFBQVFKd0FBb0lZQkFFQkNEd0NBbHBnQUFPSDFCUURLbWpzQUFBQUFBQUFBQUpRQUFBQjNBQUFBV1FBQUFEc0FBQUFkQUVIZ3BRUUxvd09BQUlBQWdRQ0NBSU1BaEFDRkFJWUFod0NJQUlrQWlnQ0xBSXdBalFDT0FJOEFrQUNRQUpFQWtnQ1RBSlFBbFFDV0FKWUFsd0NZQUprQW1nQ2JBSnNBbkFDZEFKNEFud0NnQUtBQW9RQ2lBS01Bb3dDa0FLVUFwZ0NuQUtjQXFBQ3BBS29BcWdDckFLd0FyUUN0QUs0QXJ3Q3dBTEFBc1FDeUFMSUFzd0MwQUxVQXRRQzJBTGNBdHdDNEFMa0F1UUM2QUxzQXV3QzhBTDBBdlFDK0FMOEF3QURBQU1FQXdRRENBTU1Bd3dERUFNVUF4UURHQU1jQXh3RElBTWtBeVFES0FNc0F5d0RNQU13QXpRRE9BTTRBendEUUFOQUEwUURSQU5JQTB3RFRBTlFBMUFEVkFOWUExZ0RYQU5jQTJBRFpBTmtBMmdEYUFOc0Eyd0RjQU4wQTNRRGVBTjRBM3dEZ0FPQUE0UURoQU9JQTRnRGpBT01BNUFEbEFPVUE1Z0RtQU9jQTV3RG9BT2dBNlFEcUFPb0E2d0RyQU93QTdBRHRBTzBBN2dEdUFPOEE4QUR3QVBFQThRRHlBUElBOHdEekFQUUE5QUQxQVBVQTlnRDJBUGNBOXdENEFQZ0ErUUQ1QVBvQStnRDdBUHNBL0FEOEFQMEEvUUQrQVA0QS93QWdGQkFOREFzS0Nna0pDQWdJQ0FnSEJ3Y0hCd2NIQmdZR0JnWUdCZ1lHQmdZR0JnQkJrS2tFQ3hRQkFMQXlBUUJ3TXdFQTBEWUJBREEzQVFCUVBnQkJzS2tFQzhBQk1WOVNNamM3NndXZjJtNGtBVm55TldoWEx3SWF1aDRGRHVGN0VPQjAxUnptQmpnRm1ML1dMQUFBQUFBQUFBQUFtbFZKQktsc3VoNUdqc0V1Q3haZ0NBY1RNZzBnRWZVTE9DbG1EejZyTWduNDdrQXZCUWwyTGdBQUFBQUFBQUFBVDd0aEJXZXMzVDhZTFVSVSt5SHBQNXYyZ2RJTGMrOC9HQzFFVlBzaCtUL2laUzhpZnl0NlBBZGNGRE1tcG9FOHZjdndlb2dIY0R3SFhCUXpKcWFSUEJndFJGVDdJZWsvR0MxRVZQc2g2Yi9TSVROL2ZOa0NRTkloTTM5ODJRTEFBRUgvcWdRTDZCV0FHQzFFVlBzaENVQVlMVVJVK3lFSndBTUFBQUFFQUFBQUJBQUFBQVlBQUFDRCthSUFSRTV1QVB3cEZRRFJWeWNBM1RUMUFHTGJ3QUE4bVpVQVFaQkRBR05SL2dDNzNxc0F0MkhGQURwdUpBRFNUVUlBU1FiZ0FBbnFMZ0Fja3RFQTZ4MytBQ214SEFEb1BxY0E5VFdDQUVTN0xnQ2M2WVFBdENad0FFRitYd0RXa1RrQVU0TTVBSnowT1FDTFg0UUFLUG05QVBnZk93RGUvNWNBRDVnRkFCRXY3d0FLV29zQWJSOXRBTTkrTmdBSnl5Y0FSayszQUo1bVB3QXQ2bDhBdWlkMUFPWHJ4d0E5ZS9FQTl6a0hBSkpTaWdEN2Erb0FIN0ZmQUFoZGpRQXdBMVlBZS94R0FQQ3Jhd0Fndk04QU52U2FBT09wSFFCZVlaRUFDQnZtQUlXWlpRQ2dGRjhBalVCb0FJRFkvd0FuYzAwQUJnWXhBTXBXRlFESnFITUFlK0pnQUd1TXdBQVp4RWNBeldmREFBbm8zQUJaZ3lvQWkzYkVBS1ljbGdCRXI5MEFHVmZSQUtVK0JRQUZCLzhBTTM0L0FNSXk2QUNZVDk0QXUzMHlBQ1k5d3dBZWErOEFuL2hlQURVZk9nQi84c29BOFljZEFIeVFJUUJxSkh3QTFXNzZBREF0ZHdBVk8wTUF0UlRHQU1NWm5RQ3R4TUlBTEUxQkFBd0FYUUNHZlVZQTQzRXRBSnZHbWdBellnQUF0Tko4QUxTbmx3QTNWZFVBMXo3MkFLTVFHQUJOZHZ3QVpKMHFBSERYcXdCamZQZ0FlckJYQUJjVjV3REFTVllBTzliWkFLZUVPQUFrSThzQTFvcDNBRnBVSXdBQUg3a0E4UW9iQUJuTzN3Q2ZNZjhBWmg1cUFKbFhZUUNzKzBjQWZuL1lBQ0psdHdBeTZJa0E1cjlnQU8vRXpRQnNOZ2tBWFQvVUFCYmUxd0JZTzk0QTNwdVNBTklpS0FBb2h1Z0E0bGhOQU1iS01nQUk0eFlBNEgzTEFCZkFVQUR6SGFjQUdPQmJBQzRUTkFDREVtSUFnMGdCQVBXT1d3Q3RzSDhBSHVueUFFaEtRd0FRWjlNQXF0M1lBSzVmUWdCcVljNEFDaWlrQU5PWnRBQUdwdklBWEhkL0FLUENnd0JoUElnQWluTjRBSytNV2dCdjE3MEFMYVpqQVBTL3l3Q05nZThBSnNGbkFGWEtSUURLMlRZQUtLalNBTUpoalFBU3lYY0FCQ1lVQUJKR213REVXY1FBeU1WRUFFMnlrUUFBRi9NQTFFT3RBQ2xKNVFEOTFSQUFBTDc4QUI2VXpBQnd6dTRBRXo3MUFPenhnQUN6NThNQXgvZ29BSk1GbEFEQmNUNEFMZ216QUF0Rjh3Q0lFcHdBcXlCN0FDNjFud0JIa3NJQWV6SXZBQXhWYlFCeXA1QUFhK2NmQURITGxnQjVGa29BUVhuaUFQVGZpUURvbEpjQTR1YUVBSmt4bHdDSTdXc0FYMTgyQUx2OURnQkltclFBWjZSc0FIRnlRZ0NOWFRJQW54VzRBTHpsQ1FDTk1TVUE5M1E1QURBRkhBQU5EQUVBU3dob0FDenVXQUJIcXBBQWRPY0NBTDNXSkFEM2ZhWUFia2h5QUo4Vzd3Q09sS1lBdEpIMkFORlRVUURQQ3ZJQUlKZ3pBUFZMZmdDeVkyZ0EzVDVmQUVCZEF3Q0ZpWDhBVlZJcEFEZGt3QUJ0MkJBQU1rZ3lBRnRNZFFCT2NkUUFSVlJ1QUFzSndRQXE5V2tBRkdiVkFDY0huUUJkQkZBQXREdmJBT3AyeFFDSCtSY0FTV3Q5QUIwbnVnQ1dhU2tBeHN5c0FLMFVWQUNRNG1vQWlObUpBQ3h5VUFBRXBMNEFkd2VVQVBNd2NBQUEvQ2NBNm5Hb0FHYkNTUUJrNEQwQWw5MkRBS00vbHdCRGxQMEFEWWFNQURGQjNnQ1NPWjBBM1hDTUFCZTM1d0FJM3pzQUZUY3JBRnlBb0FCYWdKTUFFQkdTQUEvbzJBQnNnSzhBMi85TEFEaVFEd0JaR0hZQVlxVVZBR0hMdXdESGlia0FFRUM5QU5MeUJBQkpkU2NBNjdiMkFOc2l1d0FLRktvQWlTWXZBR1NEZGdBSk96TUFEcFFhQUZFNnFnQWRvOElBcisydUFGd21FZ0J0d2swQUxYcWNBTUJXbHdBRFA0TUFDZkQyQUN0QWpBQnRNWmtBT2JRSEFBd2dGUURZdzFzQTlaTEVBTWF0U3dCT3lxVUFwemZOQU9hcE5nQ3JrcFFBM1VKb0FCbGozZ0Iyak84QWFJdFNBUHpiTndDdW9hc0EzeFV4QUFDdW9RQU0rOW9BWkUxbUFPMEZ0d0FwWlRBQVYxYS9BRWYvT2dCcStia0FkYjd6QUNpVDN3Q3JnREFBWm96MkFBVExGUUQ2SWdZQTJlUWRBRDJ6cEFCWEc0OEFOczBKQUU1QzZRQVR2cVFBTXlPMUFQQ3FHZ0JQWmFnQTBzR2xBQXMvRHdCYmVNMEFJL2wyQUh1TEJBQ0pGM0lBeHFaVEFHOXU0Z0R2NndBQW0wcFlBTVRhdHdDcVpyb0Fkcy9QQU5FQ0hRQ3g4UzBBakpuQkFNT3Rkd0NHU05vQTkxMmdBTWFBOUFDczhDOEEzZXlhQUQ5Y3ZBRFEzbTBBa01jZkFDcmJ0Z0NqSlRvQUFLK2FBSzFUa3dDMlZ3UUFLUzIwQUV1QWZnRGFCNmNBZHFvT0FIdFpvUUFXRWlvQTNMY3RBUHJsL1FDSjIvNEFpYjc5QU9SMmJBQUdxZndBUG9Cd0FJVnVGUUQ5aC84QUtENEhBR0ZuTXdBcUdJWUFUYjNxQUxQbnJ3Q1BiVzRBbFdjNUFERy9Xd0NFMTBnQU1OOFdBTWN0UXdBbFlUVUF5WERPQURETHVBQy9iUDBBcEFDaUFBVnM1QUJhM2FBQUlXOUhBR0lTMGdDNVhJUUFjR0ZKQUd0VzRBQ1pVZ0VBVUZVM0FCN1Z0d0F6OGNRQUUyNWZBRjB3NUFDRkxxa0FIYkxEQUtFeU5nQUl0NlFBNnJIVUFCYjNJUUNQYWVRQUovOTNBQXdEZ0FDTlFDMEFUODJnQUNDbG1RQ3pvdE1BTDEwS0FMVDVRZ0FSMnNzQWZiN1FBSnZid1FDckY3MEF5cUtCQUFocVhBQXVWUmNBSndCVkFIOFU4QURoQjRZQUZBdGtBSlpCalFDSHZ0NEEydjBxQUdzbHRnQjdpVFFBQmZQK0FMbS9uZ0JvYWs4QVNpcW9BRS9FV2dBdCtMd0ExMXFZQVBUSGxRQU5UWTBBSURxbUFLUlhYd0FVUDdFQWdEaVZBTXdnQVFCeDNZWUF5ZDYyQUw5ZzlRQk5aUkVBQVFkckFJeXdyQUN5d05BQVVWVklBQjc3RGdDVmNzTUFvd1k3QU1CQU5RQUczSHNBNEVYTUFFNHArZ0RXeXNnQTZQTkJBSHhrM2dDYlpOZ0EyYjR4QUtTWHd3QjNXTlFBYWVQRkFQRGFFd0M2T2p3QVJoaEdBRlYxWHdEU3ZmVUFicExHQUt3dVhRQU9STzBBSEQ1Q0FHSEVod0FwL2VrQTU5YnpBQ0o4eWdCdmtUVUFDT0RGQVAvWGpRQnVhdUlBc1AzR0FKTUl3UUI4WFhRQWE2MnlBTTF1blFBK2Nuc0F4aEZxQVBmUHFRQXBjOThBdGNtNkFMY0FVUURpc2cwQWRMb2tBT1Y5WUFCMDJJb0FEUlVzQUlFWURBQitacFFBQVNrV0FKOTZkZ0Q5L2I0QVZrWHZBTmwrTmdEczJSTUFpN3E1QU1TWC9BQXhxQ2NBOFc3REFKVEZOZ0RZcUZZQXRLaTFBTS9NRGdBU2lTMEFiMWMwQUN4V2lRQ1p6dU1BMWlDNUFHdGVxZ0ErS3B3QUVWL01BUDBMU2dEaDlQc0FqanR0QU9LR0xBRHAxSVFBL0xTcEFPL3UwUUF1TmNrQUx6bGhBRGdoUkFBYjJjZ0FnZndLQVB0S2FnQXZITmdBVTdTRUFFNlpqQUJVSXN3QUtsWGNBTURHMWdBTEdaWUFHbkM0QUdtVlpBQW1XbUFBUDFMdUFIOFJEd0QwdFJFQS9NdjFBRFM4TFFBMHZPNEE2RjNNQU4xZVlBQm5qcHNBa2pQdkFNa1h1QUJoV0pzQTRWZThBRkdEeGdEWVBoQUEzWEZJQUMwYzNRQ3ZHS0VBSVN4R0FGbnoxd0RaZXBnQW5sVEFBRStHK2dCV0J2d0E1WG11QUlraU5nQTRyU0lBWjVQY0FGWG9xZ0NDSmpnQXl1ZWJBRkVOcEFDWk03RUFxZGNPQUdrRlNBQmxzdkFBZjRpbkFJaE1sd0Q1MFRZQUlaS3pBSHVDU2dDWXp5RUFRSi9jQU54SFZRRGhkRG9BWit0Q0FQNmQzd0JlMUY4QWUyZWtBTHFzZWdCVjlxSUFLNGdqQUVHNlZRQlpiZ2dBSVNxR0FEbEhnd0NKNCtZQTVaN1VBRW43UUFEL1Z1a0FIQS9LQU1WWmlnQ1UraXNBMDhIRkFBL0Z6d0RiV3E0QVI4V0dBSVZEWWdBaGhqc0FMSG1VQUJCaGh3QXFUSHNBZ0N3YUFFTy9FZ0NJSnBBQWVEeUpBS2pFNUFEbDIzc0F4RHJDQUNiMDZnRDNaNG9BRFpLL0FHV2pLd0E5azdFQXZYd0xBS1JSM0FBbjNXTUFhZUhkQUpxVUdRQ29LWlVBYU00b0FBbnR0QUJFbnlBQVRwaktBSENDWXdCK2ZDTUFEN2t5QUtmMWpnQVVWdWNBSWZFSUFMV2RLZ0J2ZmswQXBSbFJBTFg1cXdDQzM5WUFsdDFoQUJZMkFnREVPcDhBZzZLaEFITHRiUUE1alhvQWdyaXBBR3N5WEFCR0oxc0FBRFR0QU5JQWR3RDg5RlVBQVZsTkFPQnhnQUJCODhBRUM2NEJRUHNoK1Q4QUFBQUFMVVIwUGdBQUFJQ1lSdmc4QUFBQVlGSE1lRHNBQUFDQWd4dndPUUFBQUVBZ0pYbzRBQUFBZ0NLQzR6WUFBQUFBSGZOcE5kRjBuZ0JYbmIwcWdIQlNELy8vUGljS0FBQUFaQUFBQU9nREFBQVFKd0FBb0lZQkFFQkNEd0NBbHBnQUFPSDFCUmtBQ2dBWkdSa0FBQUFBQlFBQUFBQUFBQWtBQUFBQUN3QUFBQUFBQUFBQUdRQVJDaGtaR1FNS0J3QUJBQWtMR0FBQUNRWUxBQUFMQUFZWkFBQUFHUmtaQUVHeHdnUUxJUTRBQUFBQUFBQUFBQmtBQ2cwWkdSa0FEUUFBQWdBSkRnQUFBQWtBRGdBQURnQkI2OElFQ3dFTUFFSDN3Z1FMRlJNQUFBQUFFd0FBQUFBSkRBQUFBQUFBREFBQURBQkJwY01FQ3dFUUFFR3h3d1FMRlE4QUFBQUVEd0FBQUFBSkVBQUFBQUFBRUFBQUVBQkIzOE1FQ3dFU0FFSHJ3d1FMSGhFQUFBQUFFUUFBQUFBSkVnQUFBQUFBRWdBQUVnQUFHZ0FBQUJvYUdnQkJvc1FFQ3c0YUFBQUFHaG9hQUFBQUFBQUFDUUJCMDhRRUN3RVVBRUhmeEFRTEZSY0FBQUFBRndBQUFBQUpGQUFBQUFBQUZBQUFGQUJCamNVRUN3RVdBRUdaeFFRTEp4VUFBQUFBRlFBQUFBQUpGZ0FBQUFBQUZnQUFGZ0FBTURFeU16UTFOamM0T1VGQ1EwUkZSZ0JCNU1VRUN3RTZBRUdNeGdRTENQLy8vLy8vLy8vL0FFSFF4Z1FMQXhBdlVRQkIzTVlFQ3gwREFBQUFBQUFBQUFJQUFBQUFBQUFBQVFBQUFBRUFBQUFCQUFBQUJRQkJoTWNFQ3dLV0FRQkJuTWNFQ3d1WEFRQUFtQUVBQU93cUFRQkJ0TWNFQ3dFQ0FFSEV4d1FMQ1AvLy8vLy8vLy8vQUVHSXlBUUxDWGdqQVFBQUFBQUFCUUJCbk1nRUN3S1pBUUJCdE1nRUN3NlhBUUFBbWdFQUFQZ3FBUUFBQkFCQnpNZ0VDd0VCQUVIY3lBUUxCZi8vLy84S0FFR2d5UVFMQXhBa0FRPT1cIjtcbiAgICAgICAgaWYgKCFSLnN0YXJ0c1dpdGgoUSkpIHtcbiAgICAgICAgICAgIHZhciBmYSA9IFI7XG4gICAgICAgICAgICBSID0gYS5sb2NhdGVGaWxlID8gYS5sb2NhdGVGaWxlKGZhLCB4KSA6IHggKyBmYTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYShiKSB7IHRyeSB7XG4gICAgICAgICAgICBpZiAoYiA9PSBSICYmIEUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEUpO1xuICAgICAgICAgICAgdmFyIGMgPSBDKGIpO1xuICAgICAgICAgICAgaWYgKGMpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICBpZiAoQSlcbiAgICAgICAgICAgICAgICByZXR1cm4gQShiKTtcbiAgICAgICAgICAgIHRocm93IFwiYm90aCBhc3luYyBhbmQgc3luYyBmZXRjaGluZyBvZiB0aGUgd2FzbSBmYWlsZWRcIjtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZCkge1xuICAgICAgICAgICAgRihkKTtcbiAgICAgICAgfSB9XG4gICAgICAgIGZ1bmN0aW9uIGlhKGIpIHsgaWYgKCFFICYmICh1IHx8IHYpKSB7XG4gICAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBmZXRjaCAmJiAhYi5zdGFydHNXaXRoKFwiZmlsZTovL1wiKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2goYiwgeyBjcmVkZW50aWFsczogXCJzYW1lLW9yaWdpblwiIH0pLnRoZW4oZnVuY3Rpb24gKGMpIHsgaWYgKCFjLm9rKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBcImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJ1wiICsgYiArIFwiJ1wiOyByZXR1cm4gYy5hcnJheUJ1ZmZlcigpOyB9KS5jYXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBoYShiKTsgfSk7XG4gICAgICAgICAgICBpZiAoeilcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGMsIGQpIHsgeihiLCBmdW5jdGlvbiAoZSkgeyBjKG5ldyBVaW50OEFycmF5KGUpKTsgfSwgZCk7IH0pO1xuICAgICAgICB9IHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGhhKGIpOyB9KTsgfVxuICAgICAgICBmdW5jdGlvbiBqYShiLCBjLCBkKSB7IHJldHVybiBpYShiKS50aGVuKGZ1bmN0aW9uIChlKSB7IHJldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLCBjKTsgfSkudGhlbihmdW5jdGlvbiAoZSkgeyByZXR1cm4gZTsgfSkudGhlbihkLCBmdW5jdGlvbiAoZSkgeyBEKFwiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogXCIgKyBlKTsgRihlKTsgfSk7IH1cbiAgICAgICAgZnVuY3Rpb24ga2EoYiwgYykgeyB2YXIgZCA9IFI7IHJldHVybiBFIHx8IFwiZnVuY3Rpb25cIiAhPSB0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcgfHwgZC5zdGFydHNXaXRoKFEpIHx8IGQuc3RhcnRzV2l0aChcImZpbGU6Ly9cIikgfHwgdyB8fCBcImZ1bmN0aW9uXCIgIT0gdHlwZW9mIGZldGNoID8gamEoZCwgYiwgYykgOiBmZXRjaChkLCB7IGNyZWRlbnRpYWxzOiBcInNhbWUtb3JpZ2luXCIgfSkudGhlbihmdW5jdGlvbiAoZSkgeyByZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcoZSwgYikudGhlbihjLCBmdW5jdGlvbiAoZikgeyBEKFwid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6IFwiICsgZik7IEQoXCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvblwiKTsgcmV0dXJuIGphKGQsIGIsIGMpOyB9KTsgfSk7IH1cbiAgICAgICAgZnVuY3Rpb24gUyhiKSB7IGZvciAoOyAwIDwgYi5sZW5ndGg7KVxuICAgICAgICAgICAgYi5zaGlmdCgpKGEpOyB9XG4gICAgICAgIHZhciBsYSA9IFwidW5kZWZpbmVkXCIgIT0gdHlwZW9mIFRleHREZWNvZGVyID8gbmV3IFRleHREZWNvZGVyKFwidXRmOFwiKSA6IHZvaWQgMDtcbiAgICAgICAgZnVuY3Rpb24gbmEoYiwgYywgZCkgeyB2YXIgZSA9IGMgKyBkOyBmb3IgKGQgPSBjOyBiW2RdICYmICEoZCA+PSBlKTspXG4gICAgICAgICAgICArK2Q7IGlmICgxNiA8IGQgLSBjICYmIGIuYnVmZmVyICYmIGxhKVxuICAgICAgICAgICAgcmV0dXJuIGxhLmRlY29kZShiLnN1YmFycmF5KGMsIGQpKTsgZm9yIChlID0gXCJcIjsgYyA8IGQ7KSB7XG4gICAgICAgICAgICB2YXIgZiA9IGJbYysrXTtcbiAgICAgICAgICAgIGlmIChmICYgMTI4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGcgPSBiW2MrK10gJiA2MztcbiAgICAgICAgICAgICAgICBpZiAoMTkyID09IChmICYgMjI0KSlcbiAgICAgICAgICAgICAgICAgICAgZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChmICYgMzEpIDw8IDYgfCBnKTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBiW2MrK10gJiA2MztcbiAgICAgICAgICAgICAgICAgICAgZiA9IDIyNCA9PSAoZiAmIDI0MCkgPyAoZiAmIDE1KSA8PCAxMiB8IGcgPDwgNiB8IGggOiAoZiAmIDcpIDw8IDE4IHwgZyA8PCAxMiB8IGggPDwgNiB8IGJbYysrXSAmIDYzO1xuICAgICAgICAgICAgICAgICAgICA2NTUzNiA+IGYgPyBlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZikgOiAoZiAtPSA2NTUzNiwgZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2IHwgZiA+PiAxMCwgNTYzMjAgfCBmICYgMTAyMykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZik7XG4gICAgICAgIH0gcmV0dXJuIGU7IH1cbiAgICAgICAgZnVuY3Rpb24gVChiLCBjKSB7IHJldHVybiBiID8gbmEoSiwgYiwgYykgOiBcIlwiOyB9XG4gICAgICAgIHZhciBvYSA9IFswLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNV0sIHBhID0gWzAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0XTtcbiAgICAgICAgZnVuY3Rpb24gVShiKSB7IGZvciAodmFyIGMgPSAwLCBkID0gMDsgZCA8IGIubGVuZ3RoOyArK2QpIHtcbiAgICAgICAgICAgIHZhciBlID0gYi5jaGFyQ29kZUF0KGQpO1xuICAgICAgICAgICAgMTI3ID49IGUgPyBjKysgOiAyMDQ3ID49IGUgPyBjICs9IDIgOiA1NTI5NiA8PSBlICYmIDU3MzQzID49IGUgPyAoYyArPSA0LCArK2QpIDogYyArPSAzO1xuICAgICAgICB9IHJldHVybiBjOyB9XG4gICAgICAgIGZ1bmN0aW9uIFYoYiwgYywgZCkgeyB2YXIgZSA9IEo7IGlmICghKDAgPCBkKSlcbiAgICAgICAgICAgIHJldHVybiAwOyB2YXIgZiA9IGM7IGQgPSBjICsgZCAtIDE7IGZvciAodmFyIGcgPSAwOyBnIDwgYi5sZW5ndGg7ICsrZykge1xuICAgICAgICAgICAgdmFyIGggPSBiLmNoYXJDb2RlQXQoZyk7XG4gICAgICAgICAgICBpZiAoNTUyOTYgPD0gaCAmJiA1NzM0MyA+PSBoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSBiLmNoYXJDb2RlQXQoKytnKTtcbiAgICAgICAgICAgICAgICBoID0gNjU1MzYgKyAoKGggJiAxMDIzKSA8PCAxMCkgfCBrICYgMTAyMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgxMjcgPj0gaCkge1xuICAgICAgICAgICAgICAgIGlmIChjID49IGQpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGVbYysrXSA9IGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoMjA0NyA+PSBoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjICsgMSA+PSBkKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGVbYysrXSA9IDE5MiB8IGggPj4gNjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICg2NTUzNSA+PSBoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyArIDIgPj0gZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVbYysrXSA9IDIyNCB8IGggPj4gMTI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyArIDMgPj0gZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVbYysrXSA9IDI0MCB8IGggPj4gMTg7XG4gICAgICAgICAgICAgICAgICAgICAgICBlW2MrK10gPSAxMjggfCBoID4+IDEyICYgNjM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZVtjKytdID0gMTI4IHwgaCA+PiA2ICYgNjM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVbYysrXSA9IDEyOCB8IGggJiA2MztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlW2NdID0gMDsgcmV0dXJuIGMgLSBmOyB9XG4gICAgICAgIGZ1bmN0aW9uIHFhKGIpIHsgdmFyIGMgPSBVKGIpICsgMSwgZCA9IHJhKGMpOyBkICYmIFYoYiwgZCwgYyk7IHJldHVybiBkOyB9XG4gICAgICAgIHZhciBXID0ge307XG4gICAgICAgIGZ1bmN0aW9uIHNhKCkgeyBpZiAoIVgpIHtcbiAgICAgICAgICAgIHZhciBiID0geyBVU0VSOiBcIndlYl91c2VyXCIsIExPR05BTUU6IFwid2ViX3VzZXJcIiwgUEFUSDogXCIvXCIsIFBXRDogXCIvXCIsIEhPTUU6IFwiL2hvbWUvd2ViX3VzZXJcIiwgTEFORzogKFwib2JqZWN0XCIgPT0gdHlwZW9mIG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzICYmIG5hdmlnYXRvci5sYW5ndWFnZXNbMF0gfHwgXCJDXCIpLnJlcGxhY2UoXCItXCIsIFwiX1wiKSArIFwiLlVURi04XCIsIF86IHQgfHwgXCIuL3RoaXMucHJvZ3JhbVwiIH0sIGM7XG4gICAgICAgICAgICBmb3IgKGMgaW4gVylcbiAgICAgICAgICAgICAgICB2b2lkIDAgPT09IFdbY10gPyBkZWxldGUgYltjXSA6IGJbY10gPSBXW2NdO1xuICAgICAgICAgICAgdmFyIGQgPSBbXTtcbiAgICAgICAgICAgIGZvciAoYyBpbiBiKVxuICAgICAgICAgICAgICAgIGQucHVzaChjICsgXCI9XCIgKyBiW2NdKTtcbiAgICAgICAgICAgIFggPSBkO1xuICAgICAgICB9IHJldHVybiBYOyB9XG4gICAgICAgIHZhciBYLCB0YSA9IFtudWxsLCBbXSwgW11dO1xuICAgICAgICBmdW5jdGlvbiB1YShiLCBjLCBkLCBlKSB7IHZhciBmID0geyBzdHJpbmc6IGwgPT4geyB2YXIgcSA9IDA7IGlmIChudWxsICE9PSBsICYmIHZvaWQgMCAhPT0gbCAmJiAwICE9PSBsKSB7XG4gICAgICAgICAgICAgICAgcSA9IFUobCkgKyAxO1xuICAgICAgICAgICAgICAgIHZhciBtYSA9IFkocSk7XG4gICAgICAgICAgICAgICAgVihsLCBtYSwgcSk7XG4gICAgICAgICAgICAgICAgcSA9IG1hO1xuICAgICAgICAgICAgfSByZXR1cm4gcTsgfSwgYXJyYXk6IGwgPT4geyB2YXIgcSA9IFkobC5sZW5ndGgpOyBJLnNldChsLCBxKTsgcmV0dXJuIHE7IH0gfTsgYiA9IGFbXCJfXCIgKyBiXTsgdmFyIGcgPSBbXSwgaCA9IDA7IGlmIChlKVxuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBlLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHIgPSBmW2Rba11dO1xuICAgICAgICAgICAgICAgIHIgPyAoMCA9PT0gaCAmJiAoaCA9IHZhKCkpLCBnW2tdID0gcihlW2tdKSkgOiBnW2tdID0gZVtrXTtcbiAgICAgICAgICAgIH0gZCA9IGIuYXBwbHkobnVsbCwgZyk7IHJldHVybiBkID0gZnVuY3Rpb24gKGwpIHsgMCAhPT0gaCAmJiB3YShoKTsgcmV0dXJuIFwic3RyaW5nXCIgPT09IGMgPyBUKGwpIDogXCJib29sZWFuXCIgPT09IGMgPyAhIWwgOiBsOyB9KGQpOyB9XG4gICAgICAgIHZhciB4YSA9IFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgYXRvYiA/IGF0b2IgOiBmdW5jdGlvbiAoYikge1xuICAgICAgICAgICAgdmFyIGMgPSBcIlwiLCBkID0gMDtcbiAgICAgICAgICAgIGIgPSBiLnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvPV0vZywgXCJcIik7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCIuaW5kZXhPZihiLmNoYXJBdChkKyspKTtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cIi5pbmRleE9mKGIuY2hhckF0KGQrKykpO1xuICAgICAgICAgICAgICAgIHZhciBnID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiLmluZGV4T2YoYi5jaGFyQXQoZCsrKSk7XG4gICAgICAgICAgICAgICAgdmFyIGggPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCIuaW5kZXhPZihiLmNoYXJBdChkKyspKTtcbiAgICAgICAgICAgICAgICBlID0gZSA8PCAyIHwgZiA+PiA0O1xuICAgICAgICAgICAgICAgIGYgPSAoZiAmIDE1KSA8PCA0IHwgZyA+PiAyO1xuICAgICAgICAgICAgICAgIHZhciBrID0gKGcgJiAzKSA8PCA2IHwgaDtcbiAgICAgICAgICAgICAgICBjICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZSk7XG4gICAgICAgICAgICAgICAgNjQgIT09IGcgJiYgKGMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShmKSk7XG4gICAgICAgICAgICAgICAgNjQgIT09IGggJiYgKGMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShrKSk7XG4gICAgICAgICAgICB9IHdoaWxlIChkIDwgYi5sZW5ndGgpO1xuICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgIH07XG4gICAgICAgIGZ1bmN0aW9uIEMoYikgeyBpZiAoYi5zdGFydHNXaXRoKFEpKSB7XG4gICAgICAgICAgICBiID0gYi5zbGljZShRLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoXCJib29sZWFuXCIgPT0gdHlwZW9mIHcgJiYgdykge1xuICAgICAgICAgICAgICAgIHZhciBjID0gQnVmZmVyLmZyb20oYiwgXCJiYXNlNjRcIik7XG4gICAgICAgICAgICAgICAgYyA9IG5ldyBVaW50OEFycmF5KGMuYnVmZmVyLCBjLmJ5dGVPZmZzZXQsIGMuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB4YShiKSwgZSA9IG5ldyBVaW50OEFycmF5KGQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IGQubGVuZ3RoOyArK2IpXG4gICAgICAgICAgICAgICAgICAgICAgICBlW2JdID0gZC5jaGFyQ29kZUF0KGIpO1xuICAgICAgICAgICAgICAgICAgICBjID0gZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGYpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJDb252ZXJ0aW5nIGJhc2U2NCBzdHJpbmcgdG8gYnl0ZXMgZmFpbGVkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgfSB9XG4gICAgICAgIHZhciB5YSA9IHsgYTogZnVuY3Rpb24gKGIsIGMsIGQsIGUpIHsgRihcIkFzc2VydGlvbiBmYWlsZWQ6IFwiICsgVChiKSArIFwiLCBhdDogXCIgKyBbYyA/IFQoYykgOiBcInVua25vd24gZmlsZW5hbWVcIiwgZCwgZSA/IFQoZSkgOiBcInVua25vd24gZnVuY3Rpb25cIl0pOyB9LCBsOiBmdW5jdGlvbiAoYiwgYykge1xuICAgICAgICAgICAgICAgIGIgPSBuZXcgRGF0ZSgxRTMgKiAoTFtiID4+IDJdICsgNDI5NDk2NzI5NiAqIEtbYiArIDQgPj4gMl0pKTtcbiAgICAgICAgICAgICAgICBLW2MgPj4gMl0gPSBiLmdldFNlY29uZHMoKTtcbiAgICAgICAgICAgICAgICBLW2MgKyA0ID4+IDJdID0gYi5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgICAgICAgS1tjICsgOCA+PiAyXSA9IGIuZ2V0SG91cnMoKTtcbiAgICAgICAgICAgICAgICBLW2MgKyAxMiA+PiAyXSA9IGIuZ2V0RGF0ZSgpO1xuICAgICAgICAgICAgICAgIEtbYyArIDE2ID4+IDJdID0gYi5nZXRNb250aCgpO1xuICAgICAgICAgICAgICAgIEtbYyArIDIwID4+IDJdID0gYi5nZXRGdWxsWWVhcigpIC0gMTkwMDtcbiAgICAgICAgICAgICAgICBLW2MgKyAyNCA+PiAyXSA9IGIuZ2V0RGF5KCk7XG4gICAgICAgICAgICAgICAgdmFyIGQgPSBiLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICAgICAgS1tjICsgMjggPj4gMl0gPSAoMCAhPT0gZCAlIDQgfHwgMCA9PT0gZCAlIDEwMCAmJiAwICE9PSBkICUgNDAwID8gcGEgOiBvYSlbYi5nZXRNb250aCgpXSArIGIuZ2V0RGF0ZSgpIC0gMSB8IDA7XG4gICAgICAgICAgICAgICAgS1tjICsgMzYgPj4gMl0gPSAtKDYwICogYi5nZXRUaW1lem9uZU9mZnNldCgpKTtcbiAgICAgICAgICAgICAgICBkID0gKG5ldyBEYXRlKGIuZ2V0RnVsbFllYXIoKSwgNiwgMSkpLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSAobmV3IERhdGUoYi5nZXRGdWxsWWVhcigpLCAwLCAxKSkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgICAgICAgICBLW2MgKyAzMiA+PiAyXSA9IChkICE9IGUgJiYgYi5nZXRUaW1lem9uZU9mZnNldCgpID09IE1hdGgubWluKGUsIGQpKSB8IDA7XG4gICAgICAgICAgICB9LCBrOiBmdW5jdGlvbiAoYiwgYywgZCkgeyBmdW5jdGlvbiBlKHIpIHsgcmV0dXJuIChyID0gci50b1RpbWVTdHJpbmcoKS5tYXRjaCgvXFwoKFtBLVphLXogXSspXFwpJC8pKSA/IHJbMV0gOiBcIkdNVFwiOyB9IHZhciBmID0gKG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLCBnID0gbmV3IERhdGUoZiwgMCwgMSksIGggPSBuZXcgRGF0ZShmLCA2LCAxKTsgZiA9IGcuZ2V0VGltZXpvbmVPZmZzZXQoKTsgdmFyIGsgPSBoLmdldFRpbWV6b25lT2Zmc2V0KCk7IExbYiA+PiAyXSA9IDYwICogTWF0aC5tYXgoZiwgayk7IEtbYyA+PiAyXSA9IE51bWJlcihmICE9IGspOyBiID0gZShnKTsgYyA9IGUoaCk7IGIgPSBxYShiKTsgYyA9IHFhKGMpOyBrIDwgZiA/IChMW2QgPj4gMl0gPSBiLCBMW2QgKyA0ID4+IDJdID0gYykgOiAoTFtkID4+IDJdID0gYywgTFtkICsgNCA+PiAyXSA9IGIpOyB9LCBiOiBmdW5jdGlvbiAoKSB7IEYoXCJcIik7IH0sXG4gICAgICAgICAgICBtOiBmdW5jdGlvbiAoKSB7IHJldHVybiBEYXRlLm5vdygpOyB9LCBqOiBmdW5jdGlvbiAoYikgeyB2YXIgYyA9IEoubGVuZ3RoOyBiID4+Pj0gMDsgaWYgKDIxNDc0ODM2NDggPCBiKVxuICAgICAgICAgICAgICAgIHJldHVybiAhMTsgZm9yICh2YXIgZCA9IDE7IDQgPj0gZDsgZCAqPSAyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGUgPSBjICogKDEgKyAuMiAvIGQpO1xuICAgICAgICAgICAgICAgIGUgPSBNYXRoLm1pbihlLCBiICsgMTAwNjYzMjk2KTtcbiAgICAgICAgICAgICAgICB2YXIgZiA9IE1hdGgsIGcgPSBmLm1pbjtcbiAgICAgICAgICAgICAgICBlID0gTWF0aC5tYXgoYiwgZSk7XG4gICAgICAgICAgICAgICAgZSArPSAoNjU1MzYgLSBlICUgNjU1MzYpICUgNjU1MzY7XG4gICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IEcuYnVmZmVyO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgRy5ncm93KGcuY2FsbChmLCAyMTQ3NDgzNjQ4LCBlKSAtIGguYnl0ZUxlbmd0aCArIDY1NTM1ID4+PiAxNik7XG4gICAgICAgICAgICAgICAgICAgICAgICBNKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgayA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChyKSB7IH1cbiAgICAgICAgICAgICAgICAgICAgayA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICAgIH0gcmV0dXJuICExOyB9LCBlOiBmdW5jdGlvbiAoYiwgYykge1xuICAgICAgICAgICAgICAgIHZhciBkID0gMDtcbiAgICAgICAgICAgICAgICBzYSgpLmZvckVhY2goZnVuY3Rpb24gKGUsIGYpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBjICsgZDtcbiAgICAgICAgICAgICAgICAgICAgZiA9IExbYiArIDQgKiBmID4+IDJdID0gZztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChnID0gMDsgZyA8IGUubGVuZ3RoOyArK2cpXG4gICAgICAgICAgICAgICAgICAgICAgICBJW2YrKyA+PiAwXSA9IGUuY2hhckNvZGVBdChnKTtcbiAgICAgICAgICAgICAgICAgICAgSVtmID4+IDBdID0gMDtcbiAgICAgICAgICAgICAgICAgICAgZCArPSBlLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAxO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfSwgZjogZnVuY3Rpb24gKGIsIGMpIHsgdmFyIGQgPSBzYSgpOyBMW2IgPj4gMl0gPSBkLmxlbmd0aDsgdmFyIGUgPSAwOyBkLmZvckVhY2goZnVuY3Rpb24gKGYpIHsgZSArPSBmLmxlbmd0aCArIDE7IH0pOyBMW2MgPj4gMl0gPSBlOyByZXR1cm4gMDsgfSwgZDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNTI7IH0sIGk6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDcwOyB9LCBjOiBmdW5jdGlvbiAoYiwgYywgZCwgZSkgeyBmb3IgKHZhciBmID0gMCwgZyA9IDA7IGcgPCBkOyBnKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgaCA9IExbYyA+PiAyXSwgayA9IExbYyArIDQgPj4gMl07XG4gICAgICAgICAgICAgICAgYyArPSA4O1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgazsgcisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsID0gSltoICsgcl0sIHEgPSB0YVtiXTtcbiAgICAgICAgICAgICAgICAgICAgMCA9PT0gbCB8fCAxMCA9PT0gbCA/ICgoMSA9PT0gYiA/IGFhIDogRCkobmEocSwgMCkpLCBxLmxlbmd0aCA9IDApIDogcS5wdXNoKGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmICs9IGs7XG4gICAgICAgICAgICB9IExbZSA+PiAyXSA9IGY7IHJldHVybiAwOyB9LCBvOiBmdW5jdGlvbiAoYiwgYywgZCwgZSwgZikgeyByZXR1cm4gYS5jYWxsYmFja3MuY2FsbEZ1bmN0aW9uKHZvaWQgMCwgYiwgYywgZCwgZSwgZik7IH0sIG46IGZ1bmN0aW9uIChiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEuY2FsbGJhY2tzLnNob3VsZEludGVycnVwdCh2b2lkIDAsIGIpO1xuICAgICAgICAgICAgfSwgaDogZnVuY3Rpb24gKGIsIGMsIGQpIHsgZCA9IFQoZCk7IHJldHVybiBhLmNhbGxiYWNrcy5sb2FkTW9kdWxlU291cmNlKHZvaWQgMCwgYiwgYywgZCk7IH0sIGc6IGZ1bmN0aW9uIChiLCBjLCBkLCBlKSB7IGQgPSBUKGQpOyBlID0gVChlKTsgcmV0dXJuIGEuY2FsbGJhY2tzLm5vcm1hbGl6ZU1vZHVsZSh2b2lkIDAsIGIsIGMsIGQsIGUpOyB9IH07XG4gICAgICAgIChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGIoZCkgeyBkID0gZC5leHBvcnRzOyBhLmFzbSA9IGQ7IEcgPSBhLmFzbS5wOyBNKCk7IGNhLnVuc2hpZnQoYS5hc20ucSk7IE4tLTsgYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzICYmIGEubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhOKTsgaWYgKDAgPT0gTiAmJiAobnVsbCAhPT0gTyAmJiAoY2xlYXJJbnRlcnZhbChPKSwgTyA9IG51bGwpLCBQKSkge1xuICAgICAgICAgICAgdmFyIGUgPSBQO1xuICAgICAgICAgICAgUCA9IG51bGw7XG4gICAgICAgICAgICBlKCk7XG4gICAgICAgIH0gcmV0dXJuIGQ7IH0gdmFyIGMgPSB7IGE6IHlhIH07IE4rKzsgYS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzICYmIGEubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhOKTsgaWYgKGEuaW5zdGFudGlhdGVXYXNtKVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5pbnN0YW50aWF0ZVdhc20oYywgYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZCkge1xuICAgICAgICAgICAgICAgIEQoXCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiBcIiArIGQpLCBuKGQpO1xuICAgICAgICAgICAgfSBrYShjLCBmdW5jdGlvbiAoZCkgeyBiKGQuaW5zdGFuY2UpOyB9KS5jYXRjaChuKTsgcmV0dXJuIHt9OyB9KSgpO1xuICAgICAgICB2YXIgcmEgPSBhLl9tYWxsb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAocmEgPSBhLl9tYWxsb2MgPSBhLmFzbS5yKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfVGhyb3cgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1Rocm93ID0gYS5hc20ucykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld0Vycm9yID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19OZXdFcnJvciA9IGEuYXNtLnQpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SdW50aW1lU2V0TWVtb3J5TGltaXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1J1bnRpbWVTZXRNZW1vcnlMaW1pdCA9IGEuYXNtLnUpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SdW50aW1lQ29tcHV0ZU1lbW9yeVVzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19SdW50aW1lQ29tcHV0ZU1lbW9yeVVzYWdlID0gYS5hc20udikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVEdW1wTWVtb3J5VXNhZ2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1J1bnRpbWVEdW1wTWVtb3J5VXNhZ2UgPSBhLmFzbS53KS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfUmVjb3ZlcmFibGVMZWFrQ2hlY2sgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1JlY292ZXJhYmxlTGVha0NoZWNrID0gYS5hc20ueCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0J1aWxkSXNTYW5pdGl6ZUxlYWsgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0J1aWxkSXNTYW5pdGl6ZUxlYWsgPSBhLmFzbS55KS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfUnVudGltZVNldE1heFN0YWNrU2l6ZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUnVudGltZVNldE1heFN0YWNrU2l6ZSA9IGEuYXNtLnopLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRVbmRlZmluZWQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldFVuZGVmaW5lZCA9IGEuYXNtLkEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXROdWxsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19HZXROdWxsID0gYS5hc20uQikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0dldEZhbHNlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19HZXRGYWxzZSA9IGEuYXNtLkMpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRUcnVlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19HZXRUcnVlID0gYS5hc20uRCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld1J1bnRpbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld1J1bnRpbWUgPSBhLmFzbS5FKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRnJlZVJ1bnRpbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0ZyZWVSdW50aW1lID0gYS5hc20uRikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld0NvbnRleHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld0NvbnRleHQgPSBhLmFzbS5HKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRnJlZUNvbnRleHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0ZyZWVDb250ZXh0ID0gYS5hc20uSCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0ZyZWVWYWx1ZVBvaW50ZXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0ZyZWVWYWx1ZVBvaW50ZXIgPSBhLmFzbS5JKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9mcmVlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX2ZyZWUgPSBhLmFzbS5KKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfRnJlZVZhbHVlUG9pbnRlclJ1bnRpbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0ZyZWVWYWx1ZVBvaW50ZXJSdW50aW1lID0gYS5hc20uSykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0ZyZWVWb2lkUG9pbnRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRnJlZVZvaWRQb2ludGVyID0gYS5hc20uTCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0ZyZWVDU3RyaW5nID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19GcmVlQ1N0cmluZyA9IGEuYXNtLk0pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19EdXBWYWx1ZVBvaW50ZXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0R1cFZhbHVlUG9pbnRlciA9IGEuYXNtLk4pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19OZXdPYmplY3QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld09iamVjdCA9IGEuYXNtLk8pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19OZXdPYmplY3RQcm90byA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfTmV3T2JqZWN0UHJvdG8gPSBhLmFzbS5QKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3QXJyYXkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld0FycmF5ID0gYS5hc20uUSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld0Zsb2F0NjQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld0Zsb2F0NjQgPSBhLmFzbS5SKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfR2V0RmxvYXQ2NCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfR2V0RmxvYXQ2NCA9IGEuYXNtLlMpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19OZXdTdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld1N0cmluZyA9IGEuYXNtLlQpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRTdHJpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldFN0cmluZyA9IGEuYXNtLlUpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19OZXdTeW1ib2wgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld1N5bWJvbCA9IGEuYXNtLlYpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRTeW1ib2xEZXNjcmlwdGlvbk9yS2V5ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19HZXRTeW1ib2xEZXNjcmlwdGlvbk9yS2V5ID0gYS5hc20uVykuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0lzR2xvYmFsU3ltYm9sID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19Jc0dsb2JhbFN5bWJvbCA9IGEuYXNtLlgpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19Jc0pvYlBlbmRpbmcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0lzSm9iUGVuZGluZyA9IGEuYXNtLlkpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19FeGVjdXRlUGVuZGluZ0pvYiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfRXhlY3V0ZVBlbmRpbmdKb2IgPSBhLmFzbS5aKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfR2V0UHJvcCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfR2V0UHJvcCA9IGEuYXNtLl8pLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19TZXRQcm9wID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19TZXRQcm9wID0gYS5hc20uJCkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0RlZmluZVByb3AgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0RlZmluZVByb3AgPSBhLmFzbS5hYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0NhbGwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0NhbGwgPSBhLmFzbS5iYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1Jlc29sdmVFeGNlcHRpb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX1Jlc29sdmVFeGNlcHRpb24gPSBhLmFzbS5jYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0R1bXAgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0R1bXAgPSBhLmFzbS5kYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX0V2YWwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0V2YWwgPSBhLmFzbS5lYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1R5cGVvZiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfVHlwZW9mID0gYS5hc20uZmEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19HZXRHbG9iYWxPYmplY3QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0dldEdsb2JhbE9iamVjdCA9IGEuYXNtLmdhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfTmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX05ld1Byb21pc2VDYXBhYmlsaXR5ID0gYS5hc20uaGEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19UZXN0U3RyaW5nQXJnID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19UZXN0U3RyaW5nQXJnID0gYS5hc20uaWEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19CdWlsZElzRGVidWcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0J1aWxkSXNEZWJ1ZyA9IGEuYXNtLmphKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfQnVpbGRJc0FzeW5jaWZ5ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19CdWlsZElzQXN5bmNpZnkgPSBhLmFzbS5rYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX05ld0Z1bmN0aW9uID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19OZXdGdW5jdGlvbiA9IGEuYXNtLmxhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICBhLl9RVFNfQXJndkdldEpTVmFsdWVDb25zdFBvaW50ZXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoYS5fUVRTX0FyZ3ZHZXRKU1ZhbHVlQ29uc3RQb2ludGVyID0gYS5hc20ubWEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SdW50aW1lRW5hYmxlSW50ZXJydXB0SGFuZGxlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUnVudGltZUVuYWJsZUludGVycnVwdEhhbmRsZXIgPSBhLmFzbS5uYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgYS5fUVRTX1J1bnRpbWVEaXNhYmxlSW50ZXJydXB0SGFuZGxlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUnVudGltZURpc2FibGVJbnRlcnJ1cHRIYW5kbGVyID0gYS5hc20ub2EpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SdW50aW1lRW5hYmxlTW9kdWxlTG9hZGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gKGEuX1FUU19SdW50aW1lRW5hYmxlTW9kdWxlTG9hZGVyID0gYS5hc20ucGEpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH07XG4gICAgICAgIGEuX1FUU19SdW50aW1lRGlzYWJsZU1vZHVsZUxvYWRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChhLl9RVFNfUnVudGltZURpc2FibGVNb2R1bGVMb2FkZXIgPSBhLmFzbS5xYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgZnVuY3Rpb24gdmEoKSB7IHJldHVybiAodmEgPSBhLmFzbS5zYSkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuICAgICAgICBmdW5jdGlvbiB3YSgpIHsgcmV0dXJuICh3YSA9IGEuYXNtLnRhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG4gICAgICAgIGZ1bmN0aW9uIFkoKSB7IHJldHVybiAoWSA9IGEuYXNtLnVhKS5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG4gICAgICAgIGEuX19fc3RhcnRfZW1fanMgPSA3NDkxNjtcbiAgICAgICAgYS5fX19zdG9wX2VtX2pzID0gNzU4MTg7XG4gICAgICAgIGEuY3dyYXAgPSBmdW5jdGlvbiAoYiwgYywgZCwgZSkgeyB2YXIgZiA9ICFkIHx8IGQuZXZlcnkoZyA9PiBcIm51bWJlclwiID09PSBnIHx8IFwiYm9vbGVhblwiID09PSBnKTsgcmV0dXJuIFwic3RyaW5nXCIgIT09IGMgJiYgZiAmJiAhZSA/IGFbXCJfXCIgKyBiXSA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVhKGIsIGMsIGQsIGFyZ3VtZW50cyk7IH07IH07XG4gICAgICAgIGEuVVRGOFRvU3RyaW5nID0gVDtcbiAgICAgICAgYS5zdHJpbmdUb1VURjggPSBmdW5jdGlvbiAoYiwgYywgZCkgeyByZXR1cm4gVihiLCBjLCBkKTsgfTtcbiAgICAgICAgYS5sZW5ndGhCeXRlc1VURjggPSBVO1xuICAgICAgICB2YXIgWjtcbiAgICAgICAgUCA9IGZ1bmN0aW9uIHphKCkgeyBaIHx8IEFhKCk7IFogfHwgKFAgPSB6YSk7IH07XG4gICAgICAgIGZ1bmN0aW9uIEFhKCkgeyBmdW5jdGlvbiBiKCkgeyBpZiAoIVogJiYgKFogPSAhMCwgYS5jYWxsZWRSdW4gPSAhMCwgIUgpKSB7XG4gICAgICAgICAgICBTKGNhKTtcbiAgICAgICAgICAgIG0oYSk7XG4gICAgICAgICAgICBpZiAoYS5vblJ1bnRpbWVJbml0aWFsaXplZClcbiAgICAgICAgICAgICAgICBhLm9uUnVudGltZUluaXRpYWxpemVkKCk7XG4gICAgICAgICAgICBpZiAoYS5wb3N0UnVuKVxuICAgICAgICAgICAgICAgIGZvciAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBhLnBvc3RSdW4gJiYgKGEucG9zdFJ1biA9IFthLnBvc3RSdW5dKTsgYS5wb3N0UnVuLmxlbmd0aDspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhLnBvc3RSdW4uc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZGEudW5zaGlmdChjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBTKGRhKTtcbiAgICAgICAgfSB9IGlmICghKDAgPCBOKSkge1xuICAgICAgICAgICAgaWYgKGEucHJlUnVuKVxuICAgICAgICAgICAgICAgIGZvciAoXCJmdW5jdGlvblwiID09IHR5cGVvZiBhLnByZVJ1biAmJiAoYS5wcmVSdW4gPSBbYS5wcmVSdW5dKTsgYS5wcmVSdW4ubGVuZ3RoOylcbiAgICAgICAgICAgICAgICAgICAgZWEoKTtcbiAgICAgICAgICAgIFMoYmEpO1xuICAgICAgICAgICAgMCA8IE4gfHwgKGEuc2V0U3RhdHVzID8gKGEuc2V0U3RhdHVzKFwiUnVubmluZy4uLlwiKSwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBhLnNldFN0YXR1cyhcIlwiKTsgfSwgMSk7IGIoKTsgfSwgMSkpIDogYigpKTtcbiAgICAgICAgfSB9XG4gICAgICAgIGlmIChhLnByZUluaXQpXG4gICAgICAgICAgICBmb3IgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgYS5wcmVJbml0ICYmIChhLnByZUluaXQgPSBbYS5wcmVJbml0XSk7IDAgPCBhLnByZUluaXQubGVuZ3RoOylcbiAgICAgICAgICAgICAgICBhLnByZUluaXQucG9wKCkoKTtcbiAgICAgICAgQWEoKTtcbiAgICAgICAgcmV0dXJuIFF1aWNrSlNSYXcucmVhZHk7XG4gICAgfSk7XG59KSgpO1xuaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JylcbiAgICBtb2R1bGUuZXhwb3J0cyA9IFF1aWNrSlNSYXc7XG5lbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pXG4gICAgZGVmaW5lKFtdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBRdWlja0pTUmF3OyB9KTtcbmVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JylcbiAgICBleHBvcnRzW1wiUXVpY2tKU1Jhd1wiXSA9IFF1aWNrSlNSYXc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbXNjcmlwdGVuLW1vZHVsZS5XQVNNX1JFTEVBU0VfU1lOQy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU0ZGSSA9IHZvaWQgMDtcbi8qKlxuICogTG93LWxldmVsIEZGSSBiaW5kaW5ncyB0byBRdWlja0pTJ3MgRW1zY3JpcHRlbiBtb2R1bGUuXG4gKiBTZWUgaW5zdGVhZCBbW1F1aWNrSlNDb250ZXh0XV0sIHRoZSBwdWJsaWMgSmF2YXNjcmlwdCBpbnRlcmZhY2UgZXhwb3NlZCBieSB0aGlzXG4gKiBsaWJyYXJ5LlxuICpcbiAqIEB1bnN0YWJsZSBUaGUgRkZJIGludGVyZmFjZSBpcyBjb25zaWRlcmVkIHByaXZhdGUgYW5kIG1heSBjaGFuZ2UuXG4gKi9cbmNsYXNzIFF1aWNrSlNGRkkge1xuICAgIGNvbnN0cnVjdG9yKG1vZHVsZSkge1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTtcbiAgICAgICAgLyoqIFNldCBhdCBjb21waWxlIHRpbWUuICovXG4gICAgICAgIHRoaXMuREVCVUcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5RVFNfVGhyb3cgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19UaHJvd1wiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19OZXdFcnJvciA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld0Vycm9yXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVTZXRNZW1vcnlMaW1pdCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX1J1bnRpbWVTZXRNZW1vcnlMaW1pdFwiLCBudWxsLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19SdW50aW1lQ29tcHV0ZU1lbW9yeVVzYWdlID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZUNvbXB1dGVNZW1vcnlVc2FnZVwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19SdW50aW1lRHVtcE1lbW9yeVVzYWdlID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZUR1bXBNZW1vcnlVc2FnZVwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19SZWNvdmVyYWJsZUxlYWtDaGVjayA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX1JlY292ZXJhYmxlTGVha0NoZWNrXCIsIFwibnVtYmVyXCIsIFtdKTtcbiAgICAgICAgdGhpcy5RVFNfQnVpbGRJc1Nhbml0aXplTGVhayA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0J1aWxkSXNTYW5pdGl6ZUxlYWtcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19SdW50aW1lU2V0TWF4U3RhY2tTaXplID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZVNldE1heFN0YWNrU2l6ZVwiLCBudWxsLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19HZXRVbmRlZmluZWQgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19HZXRVbmRlZmluZWRcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19HZXROdWxsID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0TnVsbFwiLCBcIm51bWJlclwiLCBbXSk7XG4gICAgICAgIHRoaXMuUVRTX0dldEZhbHNlID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0RmFsc2VcIiwgXCJudW1iZXJcIiwgW10pO1xuICAgICAgICB0aGlzLlFUU19HZXRUcnVlID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0VHJ1ZVwiLCBcIm51bWJlclwiLCBbXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld1J1bnRpbWUgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdSdW50aW1lXCIsIFwibnVtYmVyXCIsIFtdKTtcbiAgICAgICAgdGhpcy5RVFNfRnJlZVJ1bnRpbWUgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19GcmVlUnVudGltZVwiLCBudWxsLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19OZXdDb250ZXh0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3Q29udGV4dFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19GcmVlQ29udGV4dCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0ZyZWVDb250ZXh0XCIsIG51bGwsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0ZyZWVWYWx1ZVBvaW50ZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19GcmVlVmFsdWVQb2ludGVyXCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0ZyZWVWYWx1ZVBvaW50ZXJSdW50aW1lID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRnJlZVZhbHVlUG9pbnRlclJ1bnRpbWVcIiwgbnVsbCwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfRnJlZVZvaWRQb2ludGVyID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRnJlZVZvaWRQb2ludGVyXCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0ZyZWVDU3RyaW5nID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRnJlZUNTdHJpbmdcIiwgbnVsbCwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfRHVwVmFsdWVQb2ludGVyID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRHVwVmFsdWVQb2ludGVyXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld09iamVjdCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld09iamVjdFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19OZXdPYmplY3RQcm90byA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld09iamVjdFByb3RvXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld0FycmF5ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3QXJyYXlcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3RmxvYXQ2NCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX05ld0Zsb2F0NjRcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfR2V0RmxvYXQ2NCA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0dldEZsb2F0NjRcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3U3RyaW5nID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3U3RyaW5nXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX0dldFN0cmluZyA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0dldFN0cmluZ1wiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19OZXdTeW1ib2wgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdTeW1ib2xcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfR2V0U3ltYm9sRGVzY3JpcHRpb25PcktleSA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0dldFN5bWJvbERlc2NyaXB0aW9uT3JLZXlcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfSXNHbG9iYWxTeW1ib2wgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19Jc0dsb2JhbFN5bWJvbFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19Jc0pvYlBlbmRpbmcgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19Jc0pvYlBlbmRpbmdcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfRXhlY3V0ZVBlbmRpbmdKb2IgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19FeGVjdXRlUGVuZGluZ0pvYlwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19HZXRQcm9wID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0UHJvcFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19TZXRQcm9wID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfU2V0UHJvcFwiLCBudWxsLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19EZWZpbmVQcm9wID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRGVmaW5lUHJvcFwiLCBudWxsLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCIsIFwiYm9vbGVhblwiLCBcImJvb2xlYW5cIl0pO1xuICAgICAgICB0aGlzLlFUU19DYWxsID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfQ2FsbFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19SZXNvbHZlRXhjZXB0aW9uID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUmVzb2x2ZUV4Y2VwdGlvblwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19EdW1wID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRHVtcFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19FdmFsID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfRXZhbFwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJudW1iZXJcIl0pO1xuICAgICAgICB0aGlzLlFUU19UeXBlb2YgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19UeXBlb2ZcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfR2V0R2xvYmFsT2JqZWN0ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfR2V0R2xvYmFsT2JqZWN0XCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX05ld1Byb21pc2VDYXBhYmlsaXR5ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfTmV3UHJvbWlzZUNhcGFiaWxpdHlcIiwgXCJudW1iZXJcIiwgW1wibnVtYmVyXCIsIFwibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfVGVzdFN0cmluZ0FyZyA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX1Rlc3RTdHJpbmdBcmdcIiwgbnVsbCwgW1wic3RyaW5nXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfQnVpbGRJc0RlYnVnID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfQnVpbGRJc0RlYnVnXCIsIFwibnVtYmVyXCIsIFtdKTtcbiAgICAgICAgdGhpcy5RVFNfQnVpbGRJc0FzeW5jaWZ5ID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfQnVpbGRJc0FzeW5jaWZ5XCIsIFwibnVtYmVyXCIsIFtdKTtcbiAgICAgICAgdGhpcy5RVFNfTmV3RnVuY3Rpb24gPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19OZXdGdW5jdGlvblwiLCBcIm51bWJlclwiLCBbXCJudW1iZXJcIiwgXCJudW1iZXJcIiwgXCJzdHJpbmdcIl0pO1xuICAgICAgICB0aGlzLlFUU19Bcmd2R2V0SlNWYWx1ZUNvbnN0UG9pbnRlciA9IHRoaXMubW9kdWxlLmN3cmFwKFwiUVRTX0FyZ3ZHZXRKU1ZhbHVlQ29uc3RQb2ludGVyXCIsIFwibnVtYmVyXCIsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVFbmFibGVJbnRlcnJ1cHRIYW5kbGVyID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZUVuYWJsZUludGVycnVwdEhhbmRsZXJcIiwgbnVsbCwgW1wibnVtYmVyXCJdKTtcbiAgICAgICAgdGhpcy5RVFNfUnVudGltZURpc2FibGVJbnRlcnJ1cHRIYW5kbGVyID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZURpc2FibGVJbnRlcnJ1cHRIYW5kbGVyXCIsIG51bGwsIFtcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVFbmFibGVNb2R1bGVMb2FkZXIgPSB0aGlzLm1vZHVsZS5jd3JhcChcIlFUU19SdW50aW1lRW5hYmxlTW9kdWxlTG9hZGVyXCIsIG51bGwsIFtcIm51bWJlclwiLCBcIm51bWJlclwiXSk7XG4gICAgICAgIHRoaXMuUVRTX1J1bnRpbWVEaXNhYmxlTW9kdWxlTG9hZGVyID0gdGhpcy5tb2R1bGUuY3dyYXAoXCJRVFNfUnVudGltZURpc2FibGVNb2R1bGVMb2FkZXJcIiwgbnVsbCwgW1wibnVtYmVyXCJdKTtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNGRkkgPSBRdWlja0pTRkZJO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmZpLldBU01fUkVMRUFTRV9TWU5DLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zaG91bGRJbnRlcnJ1cHRBZnRlckRlYWRsaW5lID0gZXhwb3J0cy5uZXdBc3luY0NvbnRleHQgPSBleHBvcnRzLm5ld0FzeW5jUnVudGltZSA9IGV4cG9ydHMuZ2V0UXVpY2tKU1N5bmMgPSBleHBvcnRzLmdldFF1aWNrSlMgPSBleHBvcnRzLmVycm9ycyA9IGV4cG9ydHMuUkVMRUFTRV9TWU5DID0gZXhwb3J0cy5SRUxFQVNFX0FTWU5DID0gZXhwb3J0cy5ERUJVR19TWU5DID0gZXhwb3J0cy5ERUJVR19BU1lOQyA9IGV4cG9ydHMubmV3UXVpY2tKU0FzeW5jV0FTTU1vZHVsZSA9IGV4cG9ydHMubmV3UXVpY2tKU1dBU01Nb2R1bGUgPSB2b2lkIDA7XG4vLyBCdWlsZCB2YXJpYW50c1xuY29uc3QgdmFyaWFudHNfMSA9IHJlcXVpcmUoXCIuL3ZhcmlhbnRzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibmV3UXVpY2tKU1dBU01Nb2R1bGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhcmlhbnRzXzEubmV3UXVpY2tKU1dBU01Nb2R1bGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJuZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB2YXJpYW50c18xLm5ld1F1aWNrSlNBc3luY1dBU01Nb2R1bGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJERUJVR19BU1lOQ1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFyaWFudHNfMS5ERUJVR19BU1lOQzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRFQlVHX1NZTkNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhcmlhbnRzXzEuREVCVUdfU1lOQzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJFTEVBU0VfQVNZTkNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhcmlhbnRzXzEuUkVMRUFTRV9BU1lOQzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJFTEVBU0VfU1lOQ1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFyaWFudHNfMS5SRUxFQVNFX1NZTkM7IH0gfSk7XG4vLyBFeHBvcnQgaGVscGVyc1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3ZtLWludGVyZmFjZVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vbGlmZXRpbWVcIiksIGV4cG9ydHMpO1xuLyoqIENvbGxlY3RzIHRoZSBpbmZvcm1hdGl2ZSBlcnJvcnMgdGhpcyBsaWJyYXJ5IG1heSB0aHJvdy4gKi9cbmV4cG9ydHMuZXJyb3JzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2Vycm9yc1wiKSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZGVmZXJyZWQtcHJvbWlzZVwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vbW9kdWxlLXRlc3RcIiksIGV4cG9ydHMpO1xubGV0IHNpbmdsZXRvbiA9IHVuZGVmaW5lZDtcbmxldCBzaW5nbGV0b25Qcm9taXNlID0gdW5kZWZpbmVkO1xuLyoqXG4gKiBHZXQgYSBzaGFyZWQgc2luZ2xldG9uIHtAbGluayBRdWlja0pTV0FTTU1vZHVsZX0uIFVzZSB0aGlzIHRvIGV2YWx1YXRlIGNvZGVcbiAqIG9yIGNyZWF0ZSBKYXZhc2NyaXB0IGVudmlyb25tZW50cy5cbiAqXG4gKiBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgZW50cnlwb2ludCBmb3IgdGhlIHF1aWNranMtZW1zY3JpcHRlbiBsaWJyYXJ5LlxuICpcbiAqIElmIHlvdSBuZWVkIHN0cmljdGVzdCBwb3NzaWJsZSBpc29sYXRpb24gZ3VhcmFudGVlcywgeW91IG1heSBjcmVhdGUgYVxuICogc2VwYXJhdGUge0BsaW5rIFF1aWNrSlNXQVNNTW9kdWxlfSB2aWEge0BsaW5rIG5ld1F1aWNrSlNXQVNNTW9kdWxlfS5cbiAqXG4gKiBUbyB3b3JrIHdpdGggdGhlIGFzeW5jaWZpZWQgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnksIHNlZSB0aGVzZSBmdW5jdGlvbnM6XG4gKlxuICogLSB7QGxpbmsgbmV3QXN5bmNSdW50aW1lfS5cbiAqIC0ge0BsaW5rIG5ld0FzeW5jQ29udGV4dH0uXG4gKiAtIHtAbGluayBuZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlfS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UXVpY2tKUygpIHtcbiAgICBzaW5nbGV0b25Qcm9taXNlID8/IChzaW5nbGV0b25Qcm9taXNlID0gKDAsIHZhcmlhbnRzXzEubmV3UXVpY2tKU1dBU01Nb2R1bGUpKCkudGhlbigoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgc2luZ2xldG9uID0gaW5zdGFuY2U7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9KSk7XG4gICAgcmV0dXJuIGF3YWl0IHNpbmdsZXRvblByb21pc2U7XG59XG5leHBvcnRzLmdldFF1aWNrSlMgPSBnZXRRdWlja0pTO1xuLyoqXG4gKiBQcm92aWRlcyBzeW5jaHJvbm91cyBhY2Nlc3MgdG8gdGhlIHNoYXJlZCB7QGxpbmsgUXVpY2tKU1dBU01Nb2R1bGV9IGluc3RhbmNlIHJldHVybmVkIGJ5IHtAbGluayBnZXRRdWlja0pTfSwgYXMgbG9uZyBhc1xuICogbGVhc3Qgb25jZS5cbiAqIEB0aHJvd3MgSWYgY2FsbGVkIGJlZm9yZSBgZ2V0UXVpY2tKU2AgcmVzb2x2ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFF1aWNrSlNTeW5jKCkge1xuICAgIGlmICghc2luZ2xldG9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlF1aWNrSlMgbm90IGluaXRpYWxpemVkLiBBd2FpdCBnZXRRdWlja0pTKCkgYXQgbGVhc3Qgb25jZS5cIik7XG4gICAgfVxuICAgIHJldHVybiBzaW5nbGV0b247XG59XG5leHBvcnRzLmdldFF1aWNrSlNTeW5jID0gZ2V0UXVpY2tKU1N5bmM7XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBbW1F1aWNrSlNBc3luY1J1bnRpbWVdXSBpbiBhIHNlcGFyYXRlIFdlYkFzc2VtYmx5IG1vZHVsZS5cbiAqXG4gKiBFYWNoIHJ1bnRpbWUgaXMgaXNvbGF0ZWQgaW4gYSBzZXBhcmF0ZSBXZWJBc3NlbWJseSBtb2R1bGUsIHNvIHRoYXQgZXJyb3JzIGluXG4gKiBvbmUgcnVudGltZSBjYW5ub3QgY29udGFtaW5hdGUgYW5vdGhlciBydW50aW1lLCBhbmQgZWFjaCBydW50aW1lIGNhbiBleGVjdXRlXG4gKiBhbiBhc3luY2hyb25vdXMgYWN0aW9uIHdpdGhvdXQgY29uZmxpY3RzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBhIGhhcmQgbGltaXQgb24gdGhlIG51bWJlciBvZiBXZWJBc3NlbWJseSBtb2R1bGVzIGluIG9sZGVyXG4gKiB2ZXJzaW9ucyBvZiB2ODpcbiAqIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTEyMDc2XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5ld0FzeW5jUnVudGltZShvcHRpb25zKSB7XG4gICAgY29uc3QgbW9kdWxlID0gYXdhaXQgKDAsIHZhcmlhbnRzXzEubmV3UXVpY2tKU0FzeW5jV0FTTU1vZHVsZSkoKTtcbiAgICByZXR1cm4gbW9kdWxlLm5ld1J1bnRpbWUob3B0aW9ucyk7XG59XG5leHBvcnRzLm5ld0FzeW5jUnVudGltZSA9IG5ld0FzeW5jUnVudGltZTtcbi8qKlxuICogQ3JlYXRlIGEgbmV3IFtbUXVpY2tKU0FzeW5jQ29udGV4dF1dICh3aXRoIGFuIGFzc29jaWF0ZWQgcnVudGltZSkgaW4gYW5cbiAqIHNlcGFyYXRlIFdlYkFzc2VtYmx5IG1vZHVsZS5cbiAqXG4gKiBFYWNoIGNvbnRleHQgaXMgaXNvbGF0ZWQgaW4gYSBzZXBhcmF0ZSBXZWJBc3NlbWJseSBtb2R1bGUsIHNvIHRoYXQgZXJyb3JzIGluXG4gKiBvbmUgcnVudGltZSBjYW5ub3QgY29udGFtaW5hdGUgYW5vdGhlciBydW50aW1lLCBhbmQgZWFjaCBydW50aW1lIGNhbiBleGVjdXRlXG4gKiBhbiBhc3luY2hyb25vdXMgYWN0aW9uIHdpdGhvdXQgY29uZmxpY3RzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGVyZSBpcyBhIGhhcmQgbGltaXQgb24gdGhlIG51bWJlciBvZiBXZWJBc3NlbWJseSBtb2R1bGVzIGluIG9sZGVyXG4gKiB2ZXJzaW9ucyBvZiB2ODpcbiAqIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTEyMDc2XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5ld0FzeW5jQ29udGV4dChvcHRpb25zKSB7XG4gICAgY29uc3QgbW9kdWxlID0gYXdhaXQgKDAsIHZhcmlhbnRzXzEubmV3UXVpY2tKU0FzeW5jV0FTTU1vZHVsZSkoKTtcbiAgICByZXR1cm4gbW9kdWxlLm5ld0NvbnRleHQob3B0aW9ucyk7XG59XG5leHBvcnRzLm5ld0FzeW5jQ29udGV4dCA9IG5ld0FzeW5jQ29udGV4dDtcbi8qKlxuICogUmV0dXJucyBhbiBpbnRlcnJ1cHQgaGFuZGxlciB0aGF0IGludGVycnVwdHMgSmF2YXNjcmlwdCBleGVjdXRpb24gYWZ0ZXIgYSBkZWFkbGluZSB0aW1lLlxuICpcbiAqIEBwYXJhbSBkZWFkbGluZSAtIEludGVycnVwdCBleGVjdXRpb24gaWYgaXQncyBzdGlsbCBydW5uaW5nIGFmdGVyIHRoaXMgdGltZS5cbiAqICAgTnVtYmVyIHZhbHVlcyBhcmUgY29tcGFyZWQgYWdhaW5zdCBgRGF0ZS5ub3coKWBcbiAqL1xuZnVuY3Rpb24gc2hvdWxkSW50ZXJydXB0QWZ0ZXJEZWFkbGluZShkZWFkbGluZSkge1xuICAgIGNvbnN0IGRlYWRsaW5lQXNOdW1iZXIgPSB0eXBlb2YgZGVhZGxpbmUgPT09IFwibnVtYmVyXCIgPyBkZWFkbGluZSA6IGRlYWRsaW5lLmdldFRpbWUoKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3coKSA+IGRlYWRsaW5lQXNOdW1iZXI7XG4gICAgfTtcbn1cbmV4cG9ydHMuc2hvdWxkSW50ZXJydXB0QWZ0ZXJEZWFkbGluZSA9IHNob3VsZEludGVycnVwdEFmdGVyRGVhZGxpbmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU2NvcGUgPSBleHBvcnRzLldlYWtMaWZldGltZSA9IGV4cG9ydHMuU3RhdGljTGlmZXRpbWUgPSBleHBvcnRzLkxpZmV0aW1lID0gdm9pZCAwO1xuY29uc3QgYXN5bmNpZnlfaGVscGVyc18xID0gcmVxdWlyZShcIi4vYXN5bmNpZnktaGVscGVyc1wiKTtcbmNvbnN0IGRlYnVnXzEgPSByZXF1aXJlKFwiLi9kZWJ1Z1wiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuLyoqXG4gKiBBIGxpZmV0aW1lIHByZXZlbnRzIGFjY2VzcyB0byBhIHZhbHVlIGFmdGVyIHRoZSBsaWZldGltZSBoYXMgYmVlblxuICogW1tkaXNwb3NlXV1lZC5cbiAqXG4gKiBUeXBpY2FsbHksIHF1aWNranMtZW1zY3JpcHRlbiB1c2VzIExpZmV0aW1lcyB0byBwcm90ZWN0IEMgbWVtb3J5IHBvaW50ZXJzLlxuICovXG5jbGFzcyBMaWZldGltZSB7XG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgTGlmZXRpbWUgaXMgZGlzcG9zZWQsIGl0IHdpbGwgY2FsbCBgZGlzcG9zZXIoX3ZhbHVlKWAuIFVzZSB0aGVcbiAgICAgKiBkaXNwb3NlciBmdW5jdGlvbiB0byBpbXBsZW1lbnQgd2hhdGV2ZXIgY2xlYW51cCBuZWVkcyB0byBoYXBwZW4gYXQgdGhlIGVuZFxuICAgICAqIG9mIGB2YWx1ZWAncyBsaWZldGltZS5cbiAgICAgKlxuICAgICAqIGBfb3duZXJgIGlzIG5vdCB1c2VkIG9yIGNvbnRyb2xsZWQgYnkgdGhlIGxpZmV0aW1lLiBJdCdzIGp1c3QgbWV0YWRhdGEgZm9yXG4gICAgICogdGhlIGNyZWF0b3IuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX3ZhbHVlLCBjb3BpZXIsIGRpc3Bvc2VyLCBfb3duZXIpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7XG4gICAgICAgIHRoaXMuY29waWVyID0gY29waWVyO1xuICAgICAgICB0aGlzLmRpc3Bvc2VyID0gZGlzcG9zZXI7XG4gICAgICAgIHRoaXMuX293bmVyID0gX293bmVyO1xuICAgICAgICB0aGlzLl9hbGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuX2NvbnN0cnVjdG9yU3RhY2sgPSBkZWJ1Z18xLlFUU19ERUJVRyA/IG5ldyBFcnJvcihcIkxpZmV0aW1lIGNvbnN0cnVjdGVkXCIpLnN0YWNrIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgYWxpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGl2ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIHRoaXMgTGlmZXRpbWUgcHJvdGVjdHMuIFlvdSBtdXN0IG5ldmVyIHJldGFpbiB0aGUgdmFsdWUgLSBpdFxuICAgICAqIG1heSBiZWNvbWUgaW52YWxpZCwgbGVhZGluZyB0byBtZW1vcnkgZXJyb3JzLlxuICAgICAqXG4gICAgICogQHRocm93cyBJZiB0aGUgbGlmZXRpbWUgaGFzIGJlZW4gW1tkaXNwb3NlXV1kIGFscmVhZHkuXG4gICAgICovXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICB0aGlzLmFzc2VydEFsaXZlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG4gICAgZ2V0IG93bmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3duZXI7XG4gICAgfVxuICAgIGdldCBkdXBhYmxlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLmNvcGllcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGhhbmRsZSBwb2ludGluZyB0byB0aGUgc2FtZSBbW3ZhbHVlXV0uXG4gICAgICovXG4gICAgZHVwKCkge1xuICAgICAgICB0aGlzLmFzc2VydEFsaXZlKCk7XG4gICAgICAgIGlmICghdGhpcy5jb3BpZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi1kdXBhYmxlIGxpZmV0aW1lXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTGlmZXRpbWUodGhpcy5jb3BpZXIodGhpcy5fdmFsdWUpLCB0aGlzLmNvcGllciwgdGhpcy5kaXNwb3NlciwgdGhpcy5fb3duZXIpO1xuICAgIH1cbiAgICBjb25zdW1lKG1hcCkge1xuICAgICAgICB0aGlzLmFzc2VydEFsaXZlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG1hcCh0aGlzKTtcbiAgICAgICAgdGhpcy5kaXNwb3NlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc3Bvc2Ugb2YgW1t2YWx1ZV1dIGFuZCBwZXJmb3JtIGNsZWFudXAuXG4gICAgICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5hc3NlcnRBbGl2ZSgpO1xuICAgICAgICBpZiAodGhpcy5kaXNwb3Nlcikge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3Nlcih0aGlzLl92YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYWxpdmUgPSBmYWxzZTtcbiAgICB9XG4gICAgYXNzZXJ0QWxpdmUoKSB7XG4gICAgICAgIGlmICghdGhpcy5hbGl2ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnN0cnVjdG9yU3RhY2spIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuUXVpY2tKU1VzZUFmdGVyRnJlZShgTGlmZXRpbWUgbm90IGFsaXZlXFxuJHt0aGlzLl9jb25zdHJ1Y3RvclN0YWNrfVxcbkxpZmV0aW1lIHVzZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTVXNlQWZ0ZXJGcmVlKFwiTGlmZXRpbWUgbm90IGFsaXZlXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5MaWZldGltZSA9IExpZmV0aW1lO1xuLyoqXG4gKiBBIExpZmV0aW1lIHRoYXQgbGl2ZXMgZm9yZXZlci4gVXNlZCBmb3IgY29uc3RhbnRzLlxuICovXG5jbGFzcyBTdGF0aWNMaWZldGltZSBleHRlbmRzIExpZmV0aW1lIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSwgb3duZXIpIHtcbiAgICAgICAgc3VwZXIodmFsdWUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBvd25lcik7XG4gICAgfVxuICAgIC8vIFN0YXRpYyBsaWZldGltZSBkb2Vzbid0IG5lZWQgYSBjb3BpZXIgdG8gYmUgY29waWFibGVcbiAgICBnZXQgZHVwYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIENvcHkgcmV0dXJucyB0aGUgc2FtZSBpbnN0YW5jZS5cbiAgICBkdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBEaXNwb3NlIGRvZXMgbm90aGluZy5cbiAgICBkaXNwb3NlKCkgeyB9XG59XG5leHBvcnRzLlN0YXRpY0xpZmV0aW1lID0gU3RhdGljTGlmZXRpbWU7XG4vKipcbiAqIEEgTGlmZXRpbWUgdGhhdCBkb2VzIG5vdCBvd24gaXRzIGB2YWx1ZWAuIEEgV2Vha0xpZmV0aW1lIG5ldmVyIGNhbGxzIGl0c1xuICogYGRpc3Bvc2VyYCBmdW5jdGlvbiwgYnV0IGNhbiBiZSBgZHVwYGVkIHRvIHByb2R1Y2UgcmVndWxhciBsaWZldGltZXMgdGhhdFxuICogZG8uXG4gKlxuICogVXNlZCBmb3IgZnVuY3Rpb24gYXJndW1lbnRzLlxuICovXG5jbGFzcyBXZWFrTGlmZXRpbWUgZXh0ZW5kcyBMaWZldGltZSB7XG4gICAgY29uc3RydWN0b3IodmFsdWUsIGNvcGllciwgZGlzcG9zZXIsIG93bmVyKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IGNhcmUgaWYgdGhlIGRpc3Bvc2VyIGRvZXNuJ3Qgc3VwcG9ydCBmcmVlaW5nIFRcbiAgICAgICAgc3VwZXIodmFsdWUsIGNvcGllciwgZGlzcG9zZXIsIG93bmVyKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5fYWxpdmUgPSBmYWxzZTtcbiAgICB9XG59XG5leHBvcnRzLldlYWtMaWZldGltZSA9IFdlYWtMaWZldGltZTtcbmZ1bmN0aW9uIHNjb3BlRmluYWxseShzY29wZSwgYmxvY2tFcnJvcikge1xuICAgIC8vIGNvbnNvbGUubG9nKCdzY29wZUZpbmFsbHknLCBzY29wZSwgYmxvY2tFcnJvcilcbiAgICBsZXQgZGlzcG9zZUVycm9yO1xuICAgIHRyeSB7XG4gICAgICAgIHNjb3BlLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGRpc3Bvc2VFcnJvciA9IGVycm9yO1xuICAgIH1cbiAgICBpZiAoYmxvY2tFcnJvciAmJiBkaXNwb3NlRXJyb3IpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihibG9ja0Vycm9yLCB7XG4gICAgICAgICAgICBtZXNzYWdlOiBgJHtibG9ja0Vycm9yLm1lc3NhZ2V9XFxuIFRoZW4sIGZhaWxlZCB0byBkaXNwb3NlIHNjb3BlOiAke2Rpc3Bvc2VFcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICBkaXNwb3NlRXJyb3IsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBibG9ja0Vycm9yO1xuICAgIH1cbiAgICBpZiAoYmxvY2tFcnJvciB8fCBkaXNwb3NlRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgYmxvY2tFcnJvciB8fCBkaXNwb3NlRXJyb3I7XG4gICAgfVxufVxuLyoqXG4gKiBTY29wZSBoZWxwcyByZWR1Y2UgdGhlIGJ1cmRlbiBvZiBtYW51YWxseSB0cmFja2luZyBhbmQgZGlzcG9zaW5nIG9mXG4gKiBMaWZldGltZXMuIFNlZSBbW3dpdGhTY29wZV1dLiBhbmQgW1t3aXRoU2NvcGVBc3luY11dLlxuICovXG5jbGFzcyBTY29wZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2FibGVzID0gbmV3IExpZmV0aW1lKG5ldyBTZXQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJ1biBgYmxvY2tgIHdpdGggYSBuZXcgU2NvcGUgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIGRpc3Bvc2VkIGFmdGVyIHRoZSBibG9jayByZXR1cm5zLlxuICAgICAqIEluc2lkZSBgYmxvY2tgLCBjYWxsIGBzY29wZS5tYW5hZ2VgIG9uIGVhY2ggbGlmZXRpbWUgeW91IGNyZWF0ZSB0byBoYXZlIHRoZSBsaWZldGltZVxuICAgICAqIGF1dG9tYXRpY2FsbHkgZGlzcG9zZWQgYWZ0ZXIgdGhlIGJsb2NrIHJldHVybnMuXG4gICAgICpcbiAgICAgKiBAd2FybmluZyBEbyBub3QgdXNlIHdpdGggYXN5bmMgZnVuY3Rpb25zLiBJbnN0ZWFkLCB1c2UgW1t3aXRoU2NvcGVBc3luY11dLlxuICAgICAqL1xuICAgIHN0YXRpYyB3aXRoU2NvcGUoYmxvY2spIHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBuZXcgU2NvcGUoKTtcbiAgICAgICAgbGV0IGJsb2NrRXJyb3I7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvY2soc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYmxvY2tFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBzY29wZUZpbmFsbHkoc2NvcGUsIGJsb2NrRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyB3aXRoU2NvcGVNYXliZUFzeW5jKF90aGlzLCBibG9jaykge1xuICAgICAgICByZXR1cm4gKDAsIGFzeW5jaWZ5X2hlbHBlcnNfMS5tYXliZUFzeW5jKSh1bmRlZmluZWQsIGZ1bmN0aW9uKiAoYXdhaXRlZCkge1xuICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBuZXcgU2NvcGUoKTtcbiAgICAgICAgICAgIGxldCBibG9ja0Vycm9yO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIGF3YWl0ZWQub2YoYmxvY2suY2FsbChfdGhpcywgYXdhaXRlZCwgc2NvcGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGJsb2NrRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNjb3BlRmluYWxseShzY29wZSwgYmxvY2tFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gYGJsb2NrYCB3aXRoIGEgbmV3IFNjb3BlIGluc3RhbmNlIHRoYXQgd2lsbCBiZSBkaXNwb3NlZCBhZnRlciB0aGVcbiAgICAgKiBibG9jaydzIHJldHVybmVkIHByb21pc2Ugc2V0dGxlcy4gSW5zaWRlIGBibG9ja2AsIGNhbGwgYHNjb3BlLm1hbmFnZWAgb24gZWFjaFxuICAgICAqIGxpZmV0aW1lIHlvdSBjcmVhdGUgdG8gaGF2ZSB0aGUgbGlmZXRpbWUgYXV0b21hdGljYWxseSBkaXNwb3NlZCBhZnRlciB0aGVcbiAgICAgKiBibG9jayByZXR1cm5zLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyB3aXRoU2NvcGVBc3luYyhibG9jaykge1xuICAgICAgICBjb25zdCBzY29wZSA9IG5ldyBTY29wZSgpO1xuICAgICAgICBsZXQgYmxvY2tFcnJvcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBibG9jayhzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBibG9ja0Vycm9yID0gZXJyb3I7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNjb3BlRmluYWxseShzY29wZSwgYmxvY2tFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJhY2sgYGxpZmV0aW1lYCBzbyB0aGF0IGl0IGlzIGRpc3Bvc2VkIHdoZW4gdGhpcyBzY29wZSBpcyBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBtYW5hZ2UobGlmZXRpbWUpIHtcbiAgICAgICAgdGhpcy5fZGlzcG9zYWJsZXMudmFsdWUuYWRkKGxpZmV0aW1lKTtcbiAgICAgICAgcmV0dXJuIGxpZmV0aW1lO1xuICAgIH1cbiAgICBnZXQgYWxpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwb3NhYmxlcy5hbGl2ZTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgY29uc3QgbGlmZXRpbWVzID0gQXJyYXkuZnJvbSh0aGlzLl9kaXNwb3NhYmxlcy52YWx1ZS52YWx1ZXMoKSkucmV2ZXJzZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGxpZmV0aW1lIG9mIGxpZmV0aW1lcykge1xuICAgICAgICAgICAgaWYgKGxpZmV0aW1lLmFsaXZlKSB7XG4gICAgICAgICAgICAgICAgbGlmZXRpbWUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2FibGVzLmRpc3Bvc2UoKTtcbiAgICB9XG59XG5leHBvcnRzLlNjb3BlID0gU2NvcGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1saWZldGltZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTW9kdWxlTWVtb3J5ID0gdm9pZCAwO1xuY29uc3QgbGlmZXRpbWVfMSA9IHJlcXVpcmUoXCIuL2xpZmV0aW1lXCIpO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBNb2R1bGVNZW1vcnkge1xuICAgIGNvbnN0cnVjdG9yKG1vZHVsZSkge1xuICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTtcbiAgICB9XG4gICAgdG9Qb2ludGVyQXJyYXkoaGFuZGxlQXJyYXkpIHtcbiAgICAgICAgY29uc3QgdHlwZWRBcnJheSA9IG5ldyBJbnQzMkFycmF5KGhhbmRsZUFycmF5Lm1hcCgoaGFuZGxlKSA9PiBoYW5kbGUudmFsdWUpKTtcbiAgICAgICAgY29uc3QgbnVtQnl0ZXMgPSB0eXBlZEFycmF5Lmxlbmd0aCAqIHR5cGVkQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgIGNvbnN0IHB0ciA9IHRoaXMubW9kdWxlLl9tYWxsb2MobnVtQnl0ZXMpO1xuICAgICAgICB2YXIgaGVhcEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5tb2R1bGUuSEVBUFU4LmJ1ZmZlciwgcHRyLCBudW1CeXRlcyk7XG4gICAgICAgIGhlYXBCeXRlcy5zZXQobmV3IFVpbnQ4QXJyYXkodHlwZWRBcnJheS5idWZmZXIpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBsaWZldGltZV8xLkxpZmV0aW1lKHB0ciwgdW5kZWZpbmVkLCAocHRyKSA9PiB0aGlzLm1vZHVsZS5fZnJlZShwdHIpKTtcbiAgICB9XG4gICAgbmV3TXV0YWJsZVBvaW50ZXJBcnJheShsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgemVyb3MgPSBuZXcgSW50MzJBcnJheShuZXcgQXJyYXkobGVuZ3RoKS5maWxsKDApKTtcbiAgICAgICAgY29uc3QgbnVtQnl0ZXMgPSB6ZXJvcy5sZW5ndGggKiB6ZXJvcy5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5tb2R1bGUuX21hbGxvYyhudW1CeXRlcyk7XG4gICAgICAgIGNvbnN0IHR5cGVkQXJyYXkgPSBuZXcgSW50MzJBcnJheSh0aGlzLm1vZHVsZS5IRUFQVTguYnVmZmVyLCBwdHIsIGxlbmd0aCk7XG4gICAgICAgIHR5cGVkQXJyYXkuc2V0KHplcm9zKTtcbiAgICAgICAgcmV0dXJuIG5ldyBsaWZldGltZV8xLkxpZmV0aW1lKHsgdHlwZWRBcnJheSwgcHRyIH0sIHVuZGVmaW5lZCwgKHZhbHVlKSA9PiB0aGlzLm1vZHVsZS5fZnJlZSh2YWx1ZS5wdHIpKTtcbiAgICB9XG4gICAgbmV3SGVhcENoYXJQb2ludGVyKHN0cmluZykge1xuICAgICAgICBjb25zdCBudW1CeXRlcyA9IHRoaXMubW9kdWxlLmxlbmd0aEJ5dGVzVVRGOChzdHJpbmcpICsgMTtcbiAgICAgICAgY29uc3QgcHRyID0gdGhpcy5tb2R1bGUuX21hbGxvYyhudW1CeXRlcyk7XG4gICAgICAgIHRoaXMubW9kdWxlLnN0cmluZ1RvVVRGOChzdHJpbmcsIHB0ciwgbnVtQnl0ZXMpO1xuICAgICAgICByZXR1cm4gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUocHRyLCB1bmRlZmluZWQsICh2YWx1ZSkgPT4gdGhpcy5tb2R1bGUuX2ZyZWUodmFsdWUpKTtcbiAgICB9XG4gICAgY29uc3VtZUhlYXBDaGFyUG9pbnRlcihwdHIpIHtcbiAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5tb2R1bGUuVVRGOFRvU3RyaW5nKHB0cik7XG4gICAgICAgIHRoaXMubW9kdWxlLl9mcmVlKHB0cik7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxufVxuZXhwb3J0cy5Nb2R1bGVNZW1vcnkgPSBNb2R1bGVNZW1vcnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vcnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlF1aWNrSlNBc3luY1dBU01Nb2R1bGUgPSB2b2lkIDA7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuL2Vycm9yc1wiKTtcbmNvbnN0IGxpZmV0aW1lXzEgPSByZXF1aXJlKFwiLi9saWZldGltZVwiKTtcbmNvbnN0IG1vZHVsZV8xID0gcmVxdWlyZShcIi4vbW9kdWxlXCIpO1xuY29uc3QgcnVudGltZV9hc3luY2lmeV8xID0gcmVxdWlyZShcIi4vcnVudGltZS1hc3luY2lmeVwiKTtcbi8qKlxuICogQXN5bmNpZmllZCB2ZXJzaW9uIG9mIFtbUXVpY2tKU1dBU01Nb2R1bGVdXS5cbiAqXG4gKiBEdWUgdG8gbGltaXRhdGlvbnMgb2YgRW1zY3JpcHRlbidzIEFTWU5DSUZZIHByb2Nlc3MsIG9ubHkgYSBzaW5nbGUgYXN5bmNcbiAqIGZ1bmN0aW9uIGNhbGwgY2FuIGhhcHBlbiBhdCBhIHRpbWUgYWNyb3NzIHRoZSBlbnRpcmUgV2ViQXNzZW1ibHkgbW9kdWxlLlxuICpcbiAqIFRoYXQgbWVhbnMgdGhhdCBhbGwgcnVudGltZXMsIGNvbnRleHRzLCBmdW5jdGlvbnMsIGV0YyBjcmVhdGVkIGluc2lkZSB0aGlzXG4gKiBXZWJBc3NlbWJseSBhcmUgbGltaXRlZCB0byBhIHNpbmdsZSBjb25jdXJyZW50IGFzeW5jIGFjdGlvbi5cbiAqICoqTXVsdGlwbGUgY29uY3VycmVudCBhc3luYyBhY3Rpb25zIGlzIGFuIGVycm9yLioqXG4gKlxuICogVG8gYWxsb3cgZm9yIG11bHRpcGxlIGNvbmN1cnJlbnQgYXN5bmMgYWN0aW9ucywgeW91IG11c3QgY3JlYXRlIG11bHRpcGxlIFdlYkFzc2VtYmx5XG4gKiBtb2R1bGVzLlxuICovXG5jbGFzcyBRdWlja0pTQXN5bmNXQVNNTW9kdWxlIGV4dGVuZHMgbW9kdWxlXzEuUXVpY2tKU1dBU01Nb2R1bGUge1xuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGNvbnN0cnVjdG9yKG1vZHVsZSwgZmZpKSB7XG4gICAgICAgIHN1cGVyKG1vZHVsZSwgZmZpKTtcbiAgICAgICAgdGhpcy5mZmkgPSBmZmk7XG4gICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgYXN5bmMgcnVudGltZSBpbnNpZGUgdGhpcyBXZWJBc3NlbWJseSBtb2R1bGUuIEFsbCBydW50aW1lcyBpbnNpZGUgYVxuICAgICAqIG1vZHVsZSBhcmUgbGltaXRlZCB0byBhIHNpbmdsZSBhc3luYyBjYWxsIGF0IGEgdGltZS4gRm9yIG11bHRpcGxlXG4gICAgICogY29uY3VycmVudCBhc3luYyBhY3Rpb25zLCBjcmVhdGUgbXVsdGlwbGUgV2ViQXNzZW1ibHkgbW9kdWxlcy5cbiAgICAgKi9cbiAgICBuZXdSdW50aW1lKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBydCA9IG5ldyBsaWZldGltZV8xLkxpZmV0aW1lKHRoaXMuZmZpLlFUU19OZXdSdW50aW1lKCksIHVuZGVmaW5lZCwgKHJ0X3B0cikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3MuZGVsZXRlUnVudGltZShydF9wdHIpO1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX0ZyZWVSdW50aW1lKHJ0X3B0cik7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBydW50aW1lID0gbmV3IHJ1bnRpbWVfYXN5bmNpZnlfMS5RdWlja0pTQXN5bmNSdW50aW1lKHtcbiAgICAgICAgICAgIG1vZHVsZTogdGhpcy5tb2R1bGUsXG4gICAgICAgICAgICBmZmk6IHRoaXMuZmZpLFxuICAgICAgICAgICAgcnQsXG4gICAgICAgICAgICBjYWxsYmFja3M6IHRoaXMuY2FsbGJhY2tzLFxuICAgICAgICB9KTtcbiAgICAgICAgKDAsIG1vZHVsZV8xLmFwcGx5QmFzZVJ1bnRpbWVPcHRpb25zKShydW50aW1lLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKG9wdGlvbnMubW9kdWxlTG9hZGVyKSB7XG4gICAgICAgICAgICBydW50aW1lLnNldE1vZHVsZUxvYWRlcihvcHRpb25zLm1vZHVsZUxvYWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJ1bnRpbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2ltcGxpZmllZCBBUEkgdG8gY3JlYXRlIGEgbmV3IFtbUXVpY2tKU1J1bnRpbWVdXSBhbmQgYVxuICAgICAqIFtbUXVpY2tKU0NvbnRleHRdXSBpbnNpZGUgdGhhdCBydW50aW1lIGF0IHRoZSBzYW1lIHRpbWUuIFRoZSBydW50aW1lIHdpbGxcbiAgICAgKiBiZSBkaXNwb3NlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIG5ld0NvbnRleHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLm5ld1J1bnRpbWUoKTtcbiAgICAgICAgY29uc3QgbGlmZXRpbWVzID0gb3B0aW9ucy5vd25lZExpZmV0aW1lcyA/IG9wdGlvbnMub3duZWRMaWZldGltZXMuY29uY2F0KFtydW50aW1lXSkgOiBbcnVudGltZV07XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBydW50aW1lLm5ld0NvbnRleHQoeyAuLi5vcHRpb25zLCBvd25lZExpZmV0aW1lczogbGlmZXRpbWVzIH0pO1xuICAgICAgICBydW50aW1lLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG4gICAgLyoqIFN5bmNocm9ub3VzIGV2YWxDb2RlIGlzIG5vdCBzdXBwb3J0ZWQuICovXG4gICAgZXZhbENvZGUoKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTTm90SW1wbGVtZW50ZWQoXCJRdWlja0pTV0FTTU1vZHVsZUFzeW5jaWZ5LmV2YWxDb2RlOiB1c2UgZXZhbENvZGVBc3luYyBpbnN0ZWFkXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbmUtb2ZmIGV2YWx1YXRlIGNvZGUgd2l0aG91dCBuZWVkaW5nIHRvIGNyZWF0ZSBhIFtbUXVpY2tKU1J1bnRpbWVBc3luY11dIG9yXG4gICAgICogW1tRdWlja0pTQ29udGV4dFN5bmNdXSBleHBsaWNpdGx5LlxuICAgICAqXG4gICAgICogVGhpcyB2ZXJzaW9uIGFsbG93cyBmb3IgYXN5bmNocm9ub3VzIEVjbWFzY3JpcHQgbW9kdWxlIGxvYWRpbmcuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgb25seSBhIHNpbmdsZSBhc3luYyBhY3Rpb24gY2FuIG9jY3VyIGF0IGEgdGltZSBpbnNpZGUgdGhlIGVudGlyZSBXZWJBc3NlbWJseSBtb2R1bGUuXG4gICAgICogKipNdWx0aXBsZSBjb25jdXJyZW50IGFzeW5jIGFjdGlvbnMgaXMgYW4gZXJyb3IuKipcbiAgICAgKlxuICAgICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgW1tRdWlja0pTV0FTTU1vZHVsZS5ldmFsQ29kZV1dIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgZXZhbENvZGVBc3luYyhjb2RlLCBvcHRpb25zKSB7XG4gICAgICAgIC8vIFRPRE86IHdlIHNob3VsZCByZWFsbHkgZmlndXJlIG91dCBnZW5lcmF0b3IgZm9yIHRoZSBQcm9taXNlIG1vbmFkLi4uXG4gICAgICAgIHJldHVybiBsaWZldGltZV8xLlNjb3BlLndpdGhTY29wZUFzeW5jKGFzeW5jIChzY29wZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgdm0gPSBzY29wZS5tYW5hZ2UodGhpcy5uZXdDb250ZXh0KCkpO1xuICAgICAgICAgICAgKDAsIG1vZHVsZV8xLmFwcGx5TW9kdWxlRXZhbFJ1bnRpbWVPcHRpb25zKSh2bS5ydW50aW1lLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZtLmV2YWxDb2RlQXN5bmMoY29kZSwgXCJldmFsLmpzXCIpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubWVtb3J5TGltaXRCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG1lbW9yeSBsaW1pdCBzbyB3ZSBjYW4gZHVtcCB0aGUgcmVzdWx0IHdpdGhvdXQgZXhjZWVkaW5nIGl0LlxuICAgICAgICAgICAgICAgIHZtLnJ1bnRpbWUuc2V0TWVtb3J5TGltaXQoLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdm0uZHVtcChzY29wZS5tYW5hZ2UocmVzdWx0LmVycm9yKSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZtLmR1bXAoc2NvcGUubWFuYWdlKHJlc3VsdC52YWx1ZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlF1aWNrSlNBc3luY1dBU01Nb2R1bGUgPSBRdWlja0pTQXN5bmNXQVNNTW9kdWxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW9kdWxlLWFzeW5jaWZ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UZXN0UXVpY2tKU1dBU01Nb2R1bGUgPSB2b2lkIDA7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuL2Vycm9yc1wiKTtcbmNvbnN0IGxpZmV0aW1lXzEgPSByZXF1aXJlKFwiLi9saWZldGltZVwiKTtcbi8qKlxuICogQSB0ZXN0IHdyYXBwZXIgb2YgW1tRdWlja0pTV0FTTU1vZHVsZV1dIHRoYXQga2VlcHMgYSByZWZlcmVuY2UgdG8gZWFjaFxuICogY29udGV4dCBvciBydW50aW1lIGNyZWF0ZWQuXG4gKlxuICogQ2FsbCBbW2Rpc3Bvc2VBbGxdXSB0byByZXNldCB0aGVzZSBzZXRzIGFuZCBjYWxscyBgZGlzcG9zZWAgb24gYW55IGxlZnQgYWxpdmVcbiAqICh3aGljaCBtYXkgdGhyb3cgYW4gZXJyb3IpLlxuICpcbiAqIENhbGwgW1thc3NlcnROb01lbW9yeUFsbG9jYXRlZF1dIGF0IHRoZSBlbmQgb2YgYSB0ZXN0LCB3aGVuIHlvdSBleHBlY3QgdGhhdCB5b3UndmVcbiAqIGZyZWVkIGFsbCB0aGUgbWVtb3J5IHlvdSd2ZSBldmVyIGFsbG9jYXRlZC5cbiAqL1xuY2xhc3MgVGVzdFF1aWNrSlNXQVNNTW9kdWxlIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuY29udGV4dHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMucnVudGltZXMgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIG5ld1J1bnRpbWUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBydW50aW1lID0gdGhpcy5wYXJlbnQubmV3UnVudGltZSh7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgb3duZWRMaWZldGltZXM6IFtcbiAgICAgICAgICAgICAgICBuZXcgbGlmZXRpbWVfMS5MaWZldGltZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgKCkgPT4gdGhpcy5ydW50aW1lcy5kZWxldGUocnVudGltZSkpLFxuICAgICAgICAgICAgICAgIC4uLihvcHRpb25zPy5vd25lZExpZmV0aW1lcyA/PyBbXSksXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ydW50aW1lcy5hZGQocnVudGltZSk7XG4gICAgICAgIHJldHVybiBydW50aW1lO1xuICAgIH1cbiAgICBuZXdDb250ZXh0KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMucGFyZW50Lm5ld0NvbnRleHQoe1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIG93bmVkTGlmZXRpbWVzOiBbXG4gICAgICAgICAgICAgICAgbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUodW5kZWZpbmVkLCB1bmRlZmluZWQsICgpID0+IHRoaXMuY29udGV4dHMuZGVsZXRlKGNvbnRleHQpKSxcbiAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucz8ub3duZWRMaWZldGltZXMgPz8gW10pLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udGV4dHMuYWRkKGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG4gICAgZXZhbENvZGUoY29kZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZXZhbENvZGUoY29kZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGRpc3Bvc2VBbGwoKSB7XG4gICAgICAgIGNvbnN0IGFsbERpc3Bvc2FibGVzID0gWy4uLnRoaXMuY29udGV4dHMsIC4uLnRoaXMucnVudGltZXNdO1xuICAgICAgICB0aGlzLnJ1bnRpbWVzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuY29udGV4dHMuY2xlYXIoKTtcbiAgICAgICAgYWxsRGlzcG9zYWJsZXMuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICAgICAgaWYgKGQuYWxpdmUpIHtcbiAgICAgICAgICAgICAgICBkLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzc2VydE5vTWVtb3J5QWxsb2NhdGVkKCkge1xuICAgICAgICBjb25zdCBsZWFrc0RldGVjdGVkID0gdGhpcy5nZXRGRkkoKS5RVFNfUmVjb3ZlcmFibGVMZWFrQ2hlY2soKTtcbiAgICAgICAgaWYgKGxlYWtzRGV0ZWN0ZWQpIHtcbiAgICAgICAgICAgIC8vIE5vdGU6IHRoaXMgaXMgY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIHdoZW4gYnVpbGRpbmcgZnJvbSBzb3VyY2VcbiAgICAgICAgICAgIC8vIHdpdGggZGVidWcgYnVpbGRzLlxuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlF1aWNrSlNNZW1vcnlMZWFrRGV0ZWN0ZWQoXCJMZWFrIHNhbml0aXplciBkZXRlY3RlZCB1bi1mcmVlZCBtZW1vcnlcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGV4dHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTTWVtb3J5TGVha0RldGVjdGVkKGAke3RoaXMuY29udGV4dHMuc2l6ZX0gY29udGV4dHMgbGVha2VkYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucnVudGltZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTTWVtb3J5TGVha0RldGVjdGVkKGAke3RoaXMucnVudGltZXMuc2l6ZX0gcnVudGltZXMgbGVha2VkYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0RkZJKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0RkZJKCk7XG4gICAgfVxufVxuZXhwb3J0cy5UZXN0UXVpY2tKU1dBU01Nb2R1bGUgPSBUZXN0UXVpY2tKU1dBU01Nb2R1bGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2R1bGUtdGVzdC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU1dBU01Nb2R1bGUgPSBleHBvcnRzLmFwcGx5TW9kdWxlRXZhbFJ1bnRpbWVPcHRpb25zID0gZXhwb3J0cy5hcHBseUJhc2VSdW50aW1lT3B0aW9ucyA9IGV4cG9ydHMuUXVpY2tKU01vZHVsZUNhbGxiYWNrcyA9IHZvaWQgMDtcbmNvbnN0IGRlYnVnXzEgPSByZXF1aXJlKFwiLi9kZWJ1Z1wiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuY29uc3QgbGlmZXRpbWVfMSA9IHJlcXVpcmUoXCIuL2xpZmV0aW1lXCIpO1xuY29uc3QgcnVudGltZV8xID0gcmVxdWlyZShcIi4vcnVudGltZVwiKTtcbmNvbnN0IHR5cGVzXzEgPSByZXF1aXJlKFwiLi90eXBlc1wiKTtcbmNsYXNzIFF1aWNrSlNFbXNjcmlwdGVuTW9kdWxlQ2FsbGJhY2tzIHtcbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIHRoaXMuY2FsbEZ1bmN0aW9uID0gYXJncy5jYWxsRnVuY3Rpb247XG4gICAgICAgIHRoaXMuc2hvdWxkSW50ZXJydXB0ID0gYXJncy5zaG91bGRJbnRlcnJ1cHQ7XG4gICAgICAgIHRoaXMubG9hZE1vZHVsZVNvdXJjZSA9IGFyZ3MubG9hZE1vZHVsZVNvdXJjZTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVNb2R1bGUgPSBhcmdzLm5vcm1hbGl6ZU1vZHVsZTtcbiAgICB9XG59XG4vKipcbiAqIFdlIHVzZSBzdGF0aWMgZnVuY3Rpb25zIHBlciBtb2R1bGUgdG8gZGlzcGF0Y2ggcnVudGltZSBvciBjb250ZXh0IGNhbGxzIGZyb21cbiAqIEMgdG8gdGhlIGhvc3QuICBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGluZGlyZWN0aW9uIGZyb20gYSBzcGVjaWZpYyBydW50aW1lIG9yXG4gKiBjb250ZXh0IHBvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrIGhhbmRsZXIuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgUXVpY2tKU01vZHVsZUNhbGxiYWNrcyB7XG4gICAgY29uc3RydWN0b3IobW9kdWxlKSB7XG4gICAgICAgIHRoaXMuY29udGV4dENhbGxiYWNrcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5ydW50aW1lQ2FsbGJhY2tzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnN1c3BlbmRlZENvdW50ID0gMDtcbiAgICAgICAgdGhpcy5jVG9Ib3N0Q2FsbGJhY2tzID0gbmV3IFF1aWNrSlNFbXNjcmlwdGVuTW9kdWxlQ2FsbGJhY2tzKHtcbiAgICAgICAgICAgIGNhbGxGdW5jdGlvbjogKGFzeW5jaWZ5LCBjdHgsIHRoaXNfcHRyLCBhcmdjLCBhcmd2LCBmbl9pZCkgPT4gdGhpcy5oYW5kbGVBc3luY2lmeShhc3luY2lmeSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZtID0gdGhpcy5jb250ZXh0Q2FsbGJhY2tzLmdldChjdHgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1aWNrSlNDb250ZXh0KGN0eCA9ICR7Y3R4fSkgbm90IGZvdW5kIGZvciBDIGZ1bmN0aW9uIGNhbGwgXCIke2ZuX2lkfVwiYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZtLmNhbGxGdW5jdGlvbihjdHgsIHRoaXNfcHRyLCBhcmdjLCBhcmd2LCBmbl9pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0MgdG8gaG9zdCBlcnJvcjogcmV0dXJuaW5nIG51bGxdXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzaG91bGRJbnRlcnJ1cHQ6IChhc3luY2lmeSwgcnQpID0+IHRoaXMuaGFuZGxlQXN5bmNpZnkoYXN5bmNpZnksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2bSA9IHRoaXMucnVudGltZUNhbGxiYWNrcy5nZXQocnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFF1aWNrSlNSdW50aW1lKHJ0ID0gJHtydH0pIG5vdCBmb3VuZCBmb3IgQyBpbnRlcnJ1cHRgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm0uc2hvdWxkSW50ZXJydXB0KHJ0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQyB0byBob3N0IGludGVycnVwdDogcmV0dXJuaW5nIGVycm9yXVwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbG9hZE1vZHVsZVNvdXJjZTogKGFzeW5jaWZ5LCBydCwgY3R4LCBtb2R1bGVOYW1lKSA9PiB0aGlzLmhhbmRsZUFzeW5jaWZ5KGFzeW5jaWZ5LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVudGltZUNhbGxiYWNrcyA9IHRoaXMucnVudGltZUNhbGxiYWNrcy5nZXQocnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bnRpbWVDYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVpY2tKU1J1bnRpbWUocnQgPSAke3J0fSkgbm90IGZvdW5kIGZvciBDIG1vZHVsZSBsb2FkZXJgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkTW9kdWxlID0gcnVudGltZUNhbGxiYWNrcy5sb2FkTW9kdWxlU291cmNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxvYWRNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUXVpY2tKU1J1bnRpbWUocnQgPSAke3J0fSkgZG9lcyBub3Qgc3VwcG9ydCBtb2R1bGUgbG9hZGluZ2ApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2FkTW9kdWxlKHJ0LCBjdHgsIG1vZHVsZU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltDIHRvIGhvc3QgbW9kdWxlIGxvYWRlciBlcnJvcjogcmV0dXJuaW5nIG51bGxdXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBub3JtYWxpemVNb2R1bGU6IChhc3luY2lmeSwgcnQsIGN0eCwgbW9kdWxlQmFzZU5hbWUsIG1vZHVsZU5hbWUpID0+IHRoaXMuaGFuZGxlQXN5bmNpZnkoYXN5bmNpZnksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBydW50aW1lQ2FsbGJhY2tzID0gdGhpcy5ydW50aW1lQ2FsbGJhY2tzLmdldChydCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcnVudGltZUNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWlja0pTUnVudGltZShydCA9ICR7cnR9KSBub3QgZm91bmQgZm9yIEMgbW9kdWxlIGxvYWRlcmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZU1vZHVsZSA9IHJ1bnRpbWVDYWxsYmFja3Mubm9ybWFsaXplTW9kdWxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5vcm1hbGl6ZU1vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBRdWlja0pTUnVudGltZShydCA9ICR7cnR9KSBkb2VzIG5vdCBzdXBwb3J0IG1vZHVsZSBsb2FkaW5nYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZU1vZHVsZShydCwgY3R4LCBtb2R1bGVCYXNlTmFtZSwgbW9kdWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0MgdG8gaG9zdCBtb2R1bGUgbG9hZGVyIGVycm9yOiByZXR1cm5pbmcgbnVsbF1cIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlO1xuICAgICAgICB0aGlzLm1vZHVsZS5jYWxsYmFja3MgPSB0aGlzLmNUb0hvc3RDYWxsYmFja3M7XG4gICAgfVxuICAgIHNldFJ1bnRpbWVDYWxsYmFja3MocnQsIGNhbGxiYWNrcykge1xuICAgICAgICB0aGlzLnJ1bnRpbWVDYWxsYmFja3Muc2V0KHJ0LCBjYWxsYmFja3MpO1xuICAgIH1cbiAgICBkZWxldGVSdW50aW1lKHJ0KSB7XG4gICAgICAgIHRoaXMucnVudGltZUNhbGxiYWNrcy5kZWxldGUocnQpO1xuICAgIH1cbiAgICBzZXRDb250ZXh0Q2FsbGJhY2tzKGN0eCwgY2FsbGJhY2tzKSB7XG4gICAgICAgIHRoaXMuY29udGV4dENhbGxiYWNrcy5zZXQoY3R4LCBjYWxsYmFja3MpO1xuICAgIH1cbiAgICBkZWxldGVDb250ZXh0KGN0eCkge1xuICAgICAgICB0aGlzLmNvbnRleHRDYWxsYmFja3MuZGVsZXRlKGN0eCk7XG4gICAgfVxuICAgIGhhbmRsZUFzeW5jaWZ5KGFzeW5jaWZ5LCBmbikge1xuICAgICAgICBpZiAoYXN5bmNpZnkpIHtcbiAgICAgICAgICAgIC8vIFdlIG11c3QgYWx3YXlzIGNhbGwgYXN5bmNpZnkuaGFuZGxlU3luYyBhcm91bmQgb3VyIGZ1bmN0aW9uLlxuICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgYXN5bmNpZnkgdG8gcmVzdW1lIHN1c3BlbmRlZCBleGVjdXRpb24gb24gdGhlIHNlY29uZCBjYWxsLlxuICAgICAgICAgICAgLy8gQXN5bmNpZnkgaW50ZXJuYWxseSBjYW4gZGV0ZWN0IHN5bmMgYmVoYXZpb3IsIGFuZCBhdm9pZCBzdXNwZW5kaW5nLlxuICAgICAgICAgICAgcmV0dXJuIGFzeW5jaWZ5LmhhbmRsZVNsZWVwKChkb25lKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICgwLCBkZWJ1Z18xLmRlYnVnTG9nKShcImFzeW5jaWZ5LmhhbmRsZVNsZWVwOiBub3Qgc3VzcGVuZGluZzpcIiwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJcyBwcm9taXNlLCB3ZSBpbnRlbmQgdG8gc3VzcGVuZC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3VzcGVuZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuUXVpY2tKU0FzeW5jaWZ5RXJyb3IoYEFscmVhZHkgc3VzcGVuZGVkIGF0OiAke3RoaXMuc3VzcGVuZGVkLnN0YWNrfVxcbkF0dGVtcHRlZCB0byBzdXNwZW5kIGF0OmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWQgPSBuZXcgZXJyb3JzXzEuUXVpY2tKU0FzeW5jaWZ5U3VzcGVuZGVkKGAoJHt0aGlzLnN1c3BlbmRlZENvdW50Kyt9KWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwiYXN5bmNpZnkuaGFuZGxlU2xlZXA6IHN1c3BlbmRpbmc6XCIsIHRoaXMuc3VzcGVuZGVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQudGhlbigocmVzb2x2ZWRSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VzcGVuZGVkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwiYXN5bmNpZnkuaGFuZGxlU2xlZXA6IHJlc29sdmVkOlwiLCByZXNvbHZlZFJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKHJlc29sdmVkUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJhc3luY2lmeS5oYW5kbGVTbGVlcDogcmVqZWN0ZWQ6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJRdWlja0pTOiBjYW5ub3QgaGFuZGxlIGVycm9yIGluIHN1c3BlbmRlZCBmdW5jdGlvblwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1c3BlbmRlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAoMCwgZGVidWdfMS5kZWJ1Z0xvZykoXCJhc3luY2lmeS5oYW5kbGVTbGVlcDogZXJyb3I6XCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGFzeW5jaWZ5IC0gd2Ugc2hvdWxkIG5ldmVyIHJldHVybiBhIHByb21pc2UuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZm4oKTtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvbWlzZSByZXR1cm4gdmFsdWUgbm90IHN1cHBvcnRlZCBpbiBub24tYXN5bmNpZnkgY29udGV4dC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU01vZHVsZUNhbGxiYWNrcyA9IFF1aWNrSlNNb2R1bGVDYWxsYmFja3M7XG4vKipcbiAqIFByb2Nlc3MgUnVudGltZU9wdGlvbnMgYW5kIGFwcGx5IHRoZW0gdG8gYSBRdWlja0pTUnVudGltZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5QmFzZVJ1bnRpbWVPcHRpb25zKHJ1bnRpbWUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5pbnRlcnJ1cHRIYW5kbGVyKSB7XG4gICAgICAgIHJ1bnRpbWUuc2V0SW50ZXJydXB0SGFuZGxlcihvcHRpb25zLmludGVycnVwdEhhbmRsZXIpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5tYXhTdGFja1NpemVCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJ1bnRpbWUuc2V0TWF4U3RhY2tTaXplKG9wdGlvbnMubWF4U3RhY2tTaXplQnl0ZXMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5tZW1vcnlMaW1pdEJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcnVudGltZS5zZXRNZW1vcnlMaW1pdChvcHRpb25zLm1lbW9yeUxpbWl0Qnl0ZXMpO1xuICAgIH1cbn1cbmV4cG9ydHMuYXBwbHlCYXNlUnVudGltZU9wdGlvbnMgPSBhcHBseUJhc2VSdW50aW1lT3B0aW9ucztcbi8qKlxuICogUHJvY2VzcyBNb2R1bGVFdmFsT3B0aW9ucyBhbmQgYXBwbHkgdGhlbSB0byBhIFF1aWNrSlNSdW50aW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYXBwbHlNb2R1bGVFdmFsUnVudGltZU9wdGlvbnMocnVudGltZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLm1vZHVsZUxvYWRlcikge1xuICAgICAgICBydW50aW1lLnNldE1vZHVsZUxvYWRlcihvcHRpb25zLm1vZHVsZUxvYWRlcik7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNob3VsZEludGVycnVwdCkge1xuICAgICAgICBydW50aW1lLnNldEludGVycnVwdEhhbmRsZXIob3B0aW9ucy5zaG91bGRJbnRlcnJ1cHQpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5tZW1vcnlMaW1pdEJ5dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcnVudGltZS5zZXRNZW1vcnlMaW1pdChvcHRpb25zLm1lbW9yeUxpbWl0Qnl0ZXMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5tYXhTdGFja1NpemVCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJ1bnRpbWUuc2V0TWF4U3RhY2tTaXplKG9wdGlvbnMubWF4U3RhY2tTaXplQnl0ZXMpO1xuICAgIH1cbn1cbmV4cG9ydHMuYXBwbHlNb2R1bGVFdmFsUnVudGltZU9wdGlvbnMgPSBhcHBseU1vZHVsZUV2YWxSdW50aW1lT3B0aW9ucztcbi8qKlxuICogVGhpcyBjbGFzcyBwcmVzZW50cyBhIEphdmFzY3JpcHQgaW50ZXJmYWNlIHRvIFF1aWNrSlMsIGEgSmF2YXNjcmlwdCBpbnRlcnByZXRlclxuICogdGhhdCBzdXBwb3J0cyBFY21hU2NyaXB0IDIwMjAgKEVTMjAyMCkuXG4gKlxuICogSXQgd3JhcHMgYSBzaW5nbGUgV2ViQXNzZW1ibHkgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIFF1aWNrSlMgbGlicmFyeSBhbmRcbiAqIGFzc29jaWF0ZWQgaGVscGVyIEMgY29kZS4gV2ViQXNzZW1ibHkgbW9kdWxlcyBhcmUgY29tcGxldGVseSBpc29sYXRlZCBmcm9tXG4gKiBlYWNoIG90aGVyIGJ5IHRoZSBob3N0J3MgV2ViQXNzZW1ibHkgcnVudGltZS4gU2VwYXJhdGUgV2ViQXNzZW1ibHkgbW9kdWxlc1xuICogaGF2ZSB0aGUgbW9zdCBpc29sYXRpb24gZ3VhcmFudGVlcyBwb3NzaWJsZSB3aXRoIHRoaXMgbGlicmFyeS5cbiAqXG4gKiBUaGUgc2ltcGxlc3Qgd2F5IHRvIHN0YXJ0IHJ1bm5pbmcgY29kZSBpcyB7QGxpbmsgZXZhbENvZGV9LiBUaGlzIHNob3J0Y3V0XG4gKiBtZXRob2Qgd2lsbCBldmFsdWF0ZSBKYXZhc2NyaXB0IHNhZmVseSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBuYXRpdmVcbiAqIEphdmFzY3JpcHQgdmFsdWUuXG4gKlxuICogRm9yIG1vcmUgY29udHJvbCBvdmVyIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQsIG9yIHRvIGludGVyYWN0IHdpdGggdmFsdWVzXG4gKiBpbnNpZGUgUXVpY2tKUywgY3JlYXRlIGEgY29udGV4dCB3aXRoIHtAbGluayBuZXdDb250ZXh0fSBvciBhIHJ1bnRpbWUgd2l0aFxuICoge0BsaW5rIG5ld1J1bnRpbWV9LlxuICovXG5jbGFzcyBRdWlja0pTV0FTTU1vZHVsZSB7XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgY29uc3RydWN0b3IobW9kdWxlLCBmZmkpIHtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGU7XG4gICAgICAgIHRoaXMuZmZpID0gZmZpO1xuICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBRdWlja0pTTW9kdWxlQ2FsbGJhY2tzKG1vZHVsZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHJ1bnRpbWUuXG4gICAgICogVXNlIHRoZSBydW50aW1lIHRvIHNldCBsaW1pdHMgb24gQ1BVIGFuZCBtZW1vcnkgdXNhZ2UgYW5kIGNvbmZpZ3VyZSBtb2R1bGVcbiAgICAgKiBsb2FkaW5nIGZvciBvbmUgb3IgbW9yZSBbW1F1aWNrSlNDb250ZXh0XV1zIGluc2lkZSB0aGUgcnVudGltZS5cbiAgICAgKi9cbiAgICBuZXdSdW50aW1lKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBydCA9IG5ldyBsaWZldGltZV8xLkxpZmV0aW1lKHRoaXMuZmZpLlFUU19OZXdSdW50aW1lKCksIHVuZGVmaW5lZCwgKHJ0X3B0cikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3MuZGVsZXRlUnVudGltZShydF9wdHIpO1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX0ZyZWVSdW50aW1lKHJ0X3B0cik7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBydW50aW1lID0gbmV3IHJ1bnRpbWVfMS5RdWlja0pTUnVudGltZSh7XG4gICAgICAgICAgICBtb2R1bGU6IHRoaXMubW9kdWxlLFxuICAgICAgICAgICAgY2FsbGJhY2tzOiB0aGlzLmNhbGxiYWNrcyxcbiAgICAgICAgICAgIGZmaTogdGhpcy5mZmksXG4gICAgICAgICAgICBydCxcbiAgICAgICAgfSk7XG4gICAgICAgIGFwcGx5QmFzZVJ1bnRpbWVPcHRpb25zKHJ1bnRpbWUsIG9wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucy5tb2R1bGVMb2FkZXIpIHtcbiAgICAgICAgICAgIHJ1bnRpbWUuc2V0TW9kdWxlTG9hZGVyKG9wdGlvbnMubW9kdWxlTG9hZGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnVudGltZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzaW1wbGlmaWVkIEFQSSB0byBjcmVhdGUgYSBuZXcgW1tRdWlja0pTUnVudGltZV1dIGFuZCBhXG4gICAgICogW1tRdWlja0pTQ29udGV4dF1dIGluc2lkZSB0aGF0IHJ1bnRpbWUgYXQgdGhlIHNhbWUgdGltZS4gVGhlIHJ1bnRpbWUgd2lsbFxuICAgICAqIGJlIGRpc3Bvc2VkIHdoZW4gdGhlIGNvbnRleHQgaXMgZGlzcG9zZWQuXG4gICAgICovXG4gICAgbmV3Q29udGV4dChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgcnVudGltZSA9IHRoaXMubmV3UnVudGltZSgpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gcnVudGltZS5uZXdDb250ZXh0KHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBvd25lZExpZmV0aW1lczogKDAsIHR5cGVzXzEuY29uY2F0KShydW50aW1lLCBvcHRpb25zLm93bmVkTGlmZXRpbWVzKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJ1bnRpbWUuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbmUtb2ZmIGV2YWx1YXRlIGNvZGUgd2l0aG91dCBuZWVkaW5nIHRvIGNyZWF0ZSBhIFtbUXVpY2tKU1J1bnRpbWVdXSBvclxuICAgICAqIFtbUXVpY2tKU0NvbnRleHRdXSBleHBsaWNpdGx5LlxuICAgICAqXG4gICAgICogVG8gcHJvdGVjdCBhZ2FpbnN0IGluZmluaXRlIGxvb3BzLCB1c2UgdGhlIGBzaG91bGRJbnRlcnJ1cHRgIG9wdGlvbi4gVGhlXG4gICAgICogW1tzaG91bGRJbnRlcnJ1cHRBZnRlckRlYWRsaW5lXV0gZnVuY3Rpb24gd2lsbCBjcmVhdGUgYSB0aW1lLWJhc2VkIGRlYWRsaW5lLlxuICAgICAqXG4gICAgICogSWYgeW91IG5lZWQgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb2RlIGV4ZWN1dGVzLCBjcmVhdGUgYVxuICAgICAqIFtbUXVpY2tKU1J1bnRpbWVdXSAod2l0aCBbW25ld1J1bnRpbWVdXSkgb3IgYSBbW1F1aWNrSlNDb250ZXh0XV0gKHdpdGhcbiAgICAgKiBbW25ld0NvbnRleHRdXSBvciBbW1F1aWNrSlNSdW50aW1lLm5ld0NvbnRleHRdXSksIGFuZCB1c2UgaXRzXG4gICAgICogW1tRdWlja0pTQ29udGV4dC5ldmFsQ29kZV1dIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEFzeW5jaHJvbm91cyBjYWxsYmFja3MgbWF5IG5vdCBydW4gZHVyaW5nIHRoZSBmaXJzdCBjYWxsIHRvIGBldmFsQ29kZWAuIElmXG4gICAgICogeW91IG5lZWQgdG8gd29yayB3aXRoIGFzeW5jIGNvZGUgaW5zaWRlIFF1aWNrSlMsIGNyZWF0ZSBhIHJ1bnRpbWUgYW5kIHVzZVxuICAgICAqIFtbUXVpY2tKU1J1bnRpbWUuZXhlY3V0ZVBlbmRpbmdKb2JzXV0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IGlzIGNvZXJjZWQgdG8gYSBuYXRpdmUgSmF2YXNjcmlwdCB2YWx1ZSB1c2luZyBKU09OXG4gICAgICogc2VyaWFsaXphdGlvbiwgc28gcHJvcGVydGllcyBhbmQgdmFsdWVzIHVuc3VwcG9ydGVkIGJ5IEpTT04gd2lsbCBiZSBkcm9wcGVkLlxuICAgICAqXG4gICAgICogQHRocm93cyBJZiBgY29kZWAgdGhyb3dzIGR1cmluZyBldmFsdWF0aW9uLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmVcbiAgICAgKiBjb252ZXJ0ZWQgaW50byBhIG5hdGl2ZSBKYXZhc2NyaXB0IHZhbHVlIGFuZCB0aHJvd24uXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIGlmIGBvcHRpb25zLnNob3VsZEludGVycnVwdGAgaW50ZXJydXB0ZWQgZXhlY3V0aW9uLCB3aWxsIHRocm93IGEgRXJyb3JcbiAgICAgKiB3aXRoIG5hbWUgYFwiSW50ZXJuYWxFcnJvclwiYCBhbmQgIG1lc3NhZ2UgYFwiaW50ZXJydXB0ZWRcImAuXG4gICAgICovXG4gICAgZXZhbENvZGUoY29kZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBsaWZldGltZV8xLlNjb3BlLndpdGhTY29wZSgoc2NvcGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZtID0gc2NvcGUubWFuYWdlKHRoaXMubmV3Q29udGV4dCgpKTtcbiAgICAgICAgICAgIGFwcGx5TW9kdWxlRXZhbFJ1bnRpbWVPcHRpb25zKHZtLnJ1bnRpbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdm0uZXZhbENvZGUoY29kZSwgXCJldmFsLmpzXCIpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubWVtb3J5TGltaXRCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG1lbW9yeSBsaW1pdCBzbyB3ZSBjYW4gZHVtcCB0aGUgcmVzdWx0IHdpdGhvdXQgZXhjZWVkaW5nIGl0LlxuICAgICAgICAgICAgICAgIHZtLnJ1bnRpbWUuc2V0TWVtb3J5TGltaXQoLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdm0uZHVtcChzY29wZS5tYW5hZ2UocmVzdWx0LmVycm9yKSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZtLmR1bXAoc2NvcGUubWFuYWdlKHJlc3VsdC52YWx1ZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGEgbG93LWxldmVsIGludGVyZmFjZSB0byB0aGUgUXVpY2tKUyBmdW5jdGlvbnMgaW4gdGhpcyBXZWJBc3NlbWJseVxuICAgICAqIG1vZHVsZS5cbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICogQHVuc3RhYmxlIE5vIHdhcnJhbnR5IGlzIHByb3ZpZGVkIHdpdGggdGhpcyBBUEkuIEl0IGNvdWxkIGNoYW5nZSBhdCBhbnkgdGltZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldEZGSSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmZpO1xuICAgIH1cbn1cbmV4cG9ydHMuUXVpY2tKU1dBU01Nb2R1bGUgPSBRdWlja0pTV0FTTU1vZHVsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1vZHVsZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUXVpY2tKU0FzeW5jUnVudGltZSA9IHZvaWQgMDtcbmNvbnN0IF8xID0gcmVxdWlyZShcIi5cIik7XG5jb25zdCBjb250ZXh0X2FzeW5jaWZ5XzEgPSByZXF1aXJlKFwiLi9jb250ZXh0LWFzeW5jaWZ5XCIpO1xuY29uc3QgcnVudGltZV8xID0gcmVxdWlyZShcIi4vcnVudGltZVwiKTtcbmNvbnN0IHR5cGVzXzEgPSByZXF1aXJlKFwiLi90eXBlc1wiKTtcbmNsYXNzIFF1aWNrSlNBc3luY1J1bnRpbWUgZXh0ZW5kcyBydW50aW1lXzEuUXVpY2tKU1J1bnRpbWUge1xuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MpIHtcbiAgICAgICAgc3VwZXIoYXJncyk7XG4gICAgfVxuICAgIG5ld0NvbnRleHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmludHJpbnNpY3MgJiYgb3B0aW9ucy5pbnRyaW5zaWNzICE9PSB0eXBlc18xLkRlZmF1bHRJbnRyaW5zaWNzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUT0RPOiBDdXN0b20gaW50cmluc2ljcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3R4ID0gbmV3IF8xLkxpZmV0aW1lKHRoaXMuZmZpLlFUU19OZXdDb250ZXh0KHRoaXMucnQudmFsdWUpLCB1bmRlZmluZWQsIChjdHhfcHRyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNYXAuZGVsZXRlKGN0eF9wdHIpO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3MuZGVsZXRlQ29udGV4dChjdHhfcHRyKTtcbiAgICAgICAgICAgIHRoaXMuZmZpLlFUU19GcmVlQ29udGV4dChjdHhfcHRyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgY29udGV4dF9hc3luY2lmeV8xLlF1aWNrSlNBc3luY0NvbnRleHQoe1xuICAgICAgICAgICAgbW9kdWxlOiB0aGlzLm1vZHVsZSxcbiAgICAgICAgICAgIGN0eCxcbiAgICAgICAgICAgIGZmaTogdGhpcy5mZmksXG4gICAgICAgICAgICBydDogdGhpcy5ydCxcbiAgICAgICAgICAgIG93bmVkTGlmZXRpbWVzOiBbXSxcbiAgICAgICAgICAgIHJ1bnRpbWU6IHRoaXMsXG4gICAgICAgICAgICBjYWxsYmFja3M6IHRoaXMuY2FsbGJhY2tzLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb250ZXh0TWFwLnNldChjdHgudmFsdWUsIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG4gICAgc2V0TW9kdWxlTG9hZGVyKG1vZHVsZUxvYWRlciwgbW9kdWxlTm9ybWFsaXplcikge1xuICAgICAgICBzdXBlci5zZXRNb2R1bGVMb2FkZXIobW9kdWxlTG9hZGVyLCBtb2R1bGVOb3JtYWxpemVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBtYXggc3RhY2sgc2l6ZSBmb3IgdGhpcyBydW50aW1lIGluIGJ5dGVzLlxuICAgICAqIFRvIHJlbW92ZSB0aGUgbGltaXQsIHNldCB0byBgMGAuXG4gICAgICpcbiAgICAgKiBTZXR0aW5nIHRoaXMgbGltaXQgYWxzbyBhZGp1c3RzIHRoZSBnbG9iYWwgYEFTWU5DSUZZX1NUQUNLX1NJWkVgIGZvciB0aGUgZW50aXJlIHtAbGluayBRdWlja0pTQXN5bmNXQVNNTW9kdWxlfS5cbiAgICAgKiBTZWUgdGhlIFtwdWxsIHJlcXVlc3RdKGh0dHBzOi8vZ2l0aHViLmNvbS9qdXN0amFrZS9xdWlja2pzLWVtc2NyaXB0ZW4vcHVsbC8xMTQpIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICovXG4gICAgc2V0TWF4U3RhY2tTaXplKHN0YWNrU2l6ZSkge1xuICAgICAgICByZXR1cm4gc3VwZXIuc2V0TWF4U3RhY2tTaXplKHN0YWNrU2l6ZSk7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTQXN5bmNSdW50aW1lID0gUXVpY2tKU0FzeW5jUnVudGltZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJ1bnRpbWUtYXN5bmNpZnkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlF1aWNrSlNSdW50aW1lID0gdm9pZCAwO1xuY29uc3QgYXN5bmNpZnlfaGVscGVyc18xID0gcmVxdWlyZShcIi4vYXN5bmNpZnktaGVscGVyc1wiKTtcbmNvbnN0IGNvbnRleHRfMSA9IHJlcXVpcmUoXCIuL2NvbnRleHRcIik7XG5jb25zdCBkZWJ1Z18xID0gcmVxdWlyZShcIi4vZGVidWdcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuL2Vycm9yc1wiKTtcbmNvbnN0IGxpZmV0aW1lXzEgPSByZXF1aXJlKFwiLi9saWZldGltZVwiKTtcbmNvbnN0IG1lbW9yeV8xID0gcmVxdWlyZShcIi4vbWVtb3J5XCIpO1xuY29uc3QgdHlwZXNfMSA9IHJlcXVpcmUoXCIuL3R5cGVzXCIpO1xuLyoqXG4gKiBBIHJ1bnRpbWUgcmVwcmVzZW50cyBhIEphdmFzY3JpcHQgcnVudGltZSBjb3JyZXNwb25kaW5nIHRvIGFuIG9iamVjdCBoZWFwLlxuICogU2V2ZXJhbCBydW50aW1lcyBjYW4gZXhpc3QgYXQgdGhlIHNhbWUgdGltZSBidXQgdGhleSBjYW5ub3QgZXhjaGFuZ2Ugb2JqZWN0cy5cbiAqIEluc2lkZSBhIGdpdmVuIHJ1bnRpbWUsIG5vIG11bHRpLXRocmVhZGluZyBpcyBzdXBwb3J0ZWQuXG4gKlxuICogWW91IGNhbiB0aGluayBvZiBzZXBhcmF0ZSBydW50aW1lcyBsaWtlIGRpZmZlcmVudCBkb21haW5zIGluIGEgYnJvd3NlciwgYW5kXG4gKiB0aGUgY29udGV4dHMgd2l0aGluIGEgcnVudGltZSBsaWtlIHRoZSBkaWZmZXJlbnQgd2luZG93cyBvcGVuIHRvIHRoZSBzYW1lXG4gKiBkb21haW4uXG4gKlxuICogQ3JlYXRlIGEgcnVudGltZSB2aWEge0BsaW5rIFF1aWNrSlNXQVNNTW9kdWxlLm5ld1J1bnRpbWV9LlxuICpcbiAqIFlvdSBzaG91bGQgY3JlYXRlIHNlcGFyYXRlIHJ1bnRpbWUgaW5zdGFuY2VzIGZvciB1bnRydXN0ZWQgY29kZSBmcm9tXG4gKiBkaWZmZXJlbnQgc291cmNlcyBmb3IgaXNvbGF0aW9uLiBIb3dldmVyLCBzdHJvbmdlciBpc29sYXRpb24gaXMgYWxzb1xuICogYXZhaWxhYmxlIChhdCB0aGUgY29zdCBvZiBtZW1vcnkgdXNhZ2UpLCBieSBjcmVhdGluZyBzZXBhcmF0ZSBXZWJBc3NlbWJseVxuICogbW9kdWxlcyB0byBmdXJ0aGVyIGlzb2xhdGUgdW50cnVzdGVkIGNvZGUuXG4gKiBTZWUge0BsaW5rIG5ld1F1aWNrSlNXQVNNTW9kdWxlfS5cbiAqXG4gKiBJbXBsZW1lbnQgbWVtb3J5IGFuZCBDUFUgY29uc3RyYWludHMgd2l0aCBbW3NldEludGVycnVwdEhhbmRsZXJdXVxuICogKGNhbGxlZCByZWd1bGFybHkgd2hpbGUgdGhlIGludGVycHJldGVyIHJ1bnMpLCBbW3NldE1lbW9yeUxpbWl0XV0sIGFuZFxuICogW1tzZXRNYXhTdGFja1NpemVdXS5cbiAqIFVzZSBbW2NvbXB1dGVNZW1vcnlVc2FnZV1dIG9yIFtbZHVtcE1lbW9yeVVzYWdlXV0gdG8gZ3VpZGUgbWVtb3J5IGxpbWl0XG4gKiB0dW5pbmcuXG4gKlxuICogQ29uZmlndXJlIEVTIG1vZHVsZSBsb2FkaW5nIHdpdGggW1tzZXRNb2R1bGVMb2FkZXJdXS5cbiAqL1xuY2xhc3MgUXVpY2tKU1J1bnRpbWUge1xuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGNvbnN0cnVjdG9yKGFyZ3MpIHtcbiAgICAgICAgLyoqIEBwcml2YXRlICovXG4gICAgICAgIHRoaXMuc2NvcGUgPSBuZXcgbGlmZXRpbWVfMS5TY29wZSgpO1xuICAgICAgICAvKiogQHByaXZhdGUgKi9cbiAgICAgICAgdGhpcy5jb250ZXh0TWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmNUb0hvc3RDYWxsYmFja3MgPSB7XG4gICAgICAgICAgICBzaG91bGRJbnRlcnJ1cHQ6IChydCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChydCAhPT0gdGhpcy5ydC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJRdWlja0pTQ29udGV4dCBpbnN0YW5jZSByZWNlaXZlZCBDIC0+IEpTIGludGVycnVwdCB3aXRoIG1pc21hdGNoZWQgcnRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZuID0gdGhpcy5pbnRlcnJ1cHRIYW5kbGVyO1xuICAgICAgICAgICAgICAgIGlmICghZm4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUXVpY2tKU0NvbnRleHQgaGFkIG5vIGludGVycnVwdCBoYW5kbGVyXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZm4odGhpcykgPyAxIDogMDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2FkTW9kdWxlU291cmNlOiAoMCwgYXN5bmNpZnlfaGVscGVyc18xLm1heWJlQXN5bmNGbikodGhpcywgZnVuY3Rpb24qIChhd2FpdGVkLCBydCwgY3R4LCBtb2R1bGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlTG9hZGVyID0gdGhpcy5tb2R1bGVMb2FkZXI7XG4gICAgICAgICAgICAgICAgaWYgKCFtb2R1bGVMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVudGltZSBoYXMgbm8gbW9kdWxlIGxvYWRlclwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJ0ICE9PSB0aGlzLnJ0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bnRpbWUgcG9pbnRlciBtaXNtYXRjaFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dE1hcC5nZXQoY3R4KSA/P1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0NvbnRleHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dFBvaW50ZXI6IGN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQqIGF3YWl0ZWQobW9kdWxlTG9hZGVyKG1vZHVsZU5hbWUsIGNvbnRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgJiYgXCJlcnJvclwiIGluIHJlc3VsdCAmJiByZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICgwLCBkZWJ1Z18xLmRlYnVnTG9nKShcImNUb0hvc3RMb2FkTW9kdWxlOiBsb2FkZXIgcmV0dXJuZWQgZXJyb3JcIiwgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVTb3VyY2UgPSB0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiID8gcmVzdWx0IDogXCJ2YWx1ZVwiIGluIHJlc3VsdCA/IHJlc3VsdC52YWx1ZSA6IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVtb3J5Lm5ld0hlYXBDaGFyUG9pbnRlcihtb2R1bGVTb3VyY2UpLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwiY1RvSG9zdExvYWRNb2R1bGU6IGNhdWdodCBlcnJvclwiLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudGhyb3coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZU1vZHVsZTogKDAsIGFzeW5jaWZ5X2hlbHBlcnNfMS5tYXliZUFzeW5jRm4pKHRoaXMsIGZ1bmN0aW9uKiAoYXdhaXRlZCwgcnQsIGN0eCwgYmFzZU1vZHVsZU5hbWUsIG1vZHVsZU5hbWVSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlTm9ybWFsaXplciA9IHRoaXMubW9kdWxlTm9ybWFsaXplcjtcbiAgICAgICAgICAgICAgICBpZiAoIW1vZHVsZU5vcm1hbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVudGltZSBoYXMgbm8gbW9kdWxlIG5vcm1hbGl6ZXJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChydCAhPT0gdGhpcy5ydC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdW50aW1lIHBvaW50ZXIgbWlzbWF0Y2hcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHRNYXAuZ2V0KGN0eCkgPz9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXdDb250ZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IERvZXMgdGhpcyBoYXBwZW4/IEFyZSB3ZSByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nPyBJIGRvbid0IHRoaW5rIHNvICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0UG9pbnRlcjogY3R4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCogYXdhaXRlZChtb2R1bGVOb3JtYWxpemVyKGJhc2VNb2R1bGVOYW1lLCBtb2R1bGVOYW1lUmVxdWVzdCwgY29udGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiBcImVycm9yXCIgaW4gcmVzdWx0ICYmIHJlc3VsdC5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwiY1RvSG9zdE5vcm1hbGl6ZU1vZHVsZTogbm9ybWFsaXplciByZXR1cm5lZCBlcnJvclwiLCByZXN1bHQuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiID8gcmVzdWx0IDogcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRNZW1vcnkodGhpcy5ydC52YWx1ZSkubmV3SGVhcENoYXJQb2ludGVyKG5hbWUpLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgKDAsIGRlYnVnXzEuZGVidWdMb2cpKFwibm9ybWFsaXplTW9kdWxlOiBjYXVnaHQgZXJyb3JcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnRocm93KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICAgIGFyZ3Mub3duZWRMaWZldGltZXM/LmZvckVhY2goKGxpZmV0aW1lKSA9PiB0aGlzLnNjb3BlLm1hbmFnZShsaWZldGltZSkpO1xuICAgICAgICB0aGlzLm1vZHVsZSA9IGFyZ3MubW9kdWxlO1xuICAgICAgICB0aGlzLm1lbW9yeSA9IG5ldyBtZW1vcnlfMS5Nb2R1bGVNZW1vcnkodGhpcy5tb2R1bGUpO1xuICAgICAgICB0aGlzLmZmaSA9IGFyZ3MuZmZpO1xuICAgICAgICB0aGlzLnJ0ID0gYXJncy5ydDtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MgPSBhcmdzLmNhbGxiYWNrcztcbiAgICAgICAgdGhpcy5zY29wZS5tYW5hZ2UodGhpcy5ydCk7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLnNldFJ1bnRpbWVDYWxsYmFja3ModGhpcy5ydC52YWx1ZSwgdGhpcy5jVG9Ib3N0Q2FsbGJhY2tzKTtcbiAgICAgICAgdGhpcy5leGVjdXRlUGVuZGluZ0pvYnMgPSB0aGlzLmV4ZWN1dGVQZW5kaW5nSm9icy5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBnZXQgYWxpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlLmFsaXZlO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIG5ld0NvbnRleHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmludHJpbnNpY3MgJiYgb3B0aW9ucy5pbnRyaW5zaWNzICE9PSB0eXBlc18xLkRlZmF1bHRJbnRyaW5zaWNzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUT0RPOiBDdXN0b20gaW50cmluc2ljcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3R4ID0gbmV3IGxpZmV0aW1lXzEuTGlmZXRpbWUob3B0aW9ucy5jb250ZXh0UG9pbnRlciB8fCB0aGlzLmZmaS5RVFNfTmV3Q29udGV4dCh0aGlzLnJ0LnZhbHVlKSwgdW5kZWZpbmVkLCAoY3R4X3B0cikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0TWFwLmRlbGV0ZShjdHhfcHRyKTtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzLmRlbGV0ZUNvbnRleHQoY3R4X3B0cik7XG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZUNvbnRleHQoY3R4X3B0cik7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gbmV3IGNvbnRleHRfMS5RdWlja0pTQ29udGV4dCh7XG4gICAgICAgICAgICBtb2R1bGU6IHRoaXMubW9kdWxlLFxuICAgICAgICAgICAgY3R4LFxuICAgICAgICAgICAgZmZpOiB0aGlzLmZmaSxcbiAgICAgICAgICAgIHJ0OiB0aGlzLnJ0LFxuICAgICAgICAgICAgb3duZWRMaWZldGltZXM6IG9wdGlvbnMub3duZWRMaWZldGltZXMsXG4gICAgICAgICAgICBydW50aW1lOiB0aGlzLFxuICAgICAgICAgICAgY2FsbGJhY2tzOiB0aGlzLmNhbGxiYWNrcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udGV4dE1hcC5zZXQoY3R4LnZhbHVlLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbG9hZGVyIGZvciBFY21hU2NyaXB0IG1vZHVsZXMgcmVxdWVzdGVkIGJ5IGFueSBjb250ZXh0IGluIHRoaXNcbiAgICAgKiBydW50aW1lLlxuICAgICAqXG4gICAgICogVGhlIGxvYWRlciBjYW4gYmUgcmVtb3ZlZCB3aXRoIFtbcmVtb3ZlTW9kdWxlTG9hZGVyXV0uXG4gICAgICovXG4gICAgc2V0TW9kdWxlTG9hZGVyKG1vZHVsZUxvYWRlciwgbW9kdWxlTm9ybWFsaXplcikge1xuICAgICAgICB0aGlzLm1vZHVsZUxvYWRlciA9IG1vZHVsZUxvYWRlcjtcbiAgICAgICAgdGhpcy5tb2R1bGVOb3JtYWxpemVyID0gbW9kdWxlTm9ybWFsaXplcjtcbiAgICAgICAgdGhpcy5mZmkuUVRTX1J1bnRpbWVFbmFibGVNb2R1bGVMb2FkZXIodGhpcy5ydC52YWx1ZSwgdGhpcy5tb2R1bGVOb3JtYWxpemVyID8gMSA6IDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIHRoZSBsb2FkZXIgc2V0IGJ5IFtbc2V0TW9kdWxlTG9hZGVyXV0uIFRoaXMgZGlzYWJsZXMgbW9kdWxlIGxvYWRpbmcuXG4gICAgICovXG4gICAgcmVtb3ZlTW9kdWxlTG9hZGVyKCkge1xuICAgICAgICB0aGlzLm1vZHVsZUxvYWRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5mZmkuUVRTX1J1bnRpbWVEaXNhYmxlTW9kdWxlTG9hZGVyKHRoaXMucnQudmFsdWUpO1xuICAgIH1cbiAgICAvLyBSdW50aW1lIG1hbmFnZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8qKlxuICAgICAqIEluIFF1aWNrSlMsIHByb21pc2VzIGFuZCBhc3luYyBmdW5jdGlvbnMgY3JlYXRlIHBlbmRpbmdKb2JzLiBUaGVzZSBkbyBub3QgZXhlY3V0ZVxuICAgICAqIGltbWVkaWF0ZWx5IGFuZCBuZWVkIHRvIGJlIHJ1biBieSBjYWxsaW5nIFtbZXhlY3V0ZVBlbmRpbmdKb2JzXV0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBlbmRpbmdKb2IgcXVldWVkIHVwLlxuICAgICAqL1xuICAgIGhhc1BlbmRpbmdKb2IoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuZmZpLlFUU19Jc0pvYlBlbmRpbmcodGhpcy5ydC52YWx1ZSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgYSBjYWxsYmFjayB3aGljaCBpcyByZWd1bGFybHkgY2FsbGVkIGJ5IHRoZSBRdWlja0pTIGVuZ2luZSB3aGVuIGl0IGlzXG4gICAgICogZXhlY3V0aW5nIGNvZGUuIFRoaXMgY2FsbGJhY2sgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGFuIGV4ZWN1dGlvblxuICAgICAqIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgY2FuIGJlIHJlbW92ZWQgd2l0aCBbW3JlbW92ZUludGVycnVwdEhhbmRsZXJdXS5cbiAgICAgKi9cbiAgICBzZXRJbnRlcnJ1cHRIYW5kbGVyKGNiKSB7XG4gICAgICAgIGNvbnN0IHByZXZJbnRlcnJ1cHRIYW5kbGVyID0gdGhpcy5pbnRlcnJ1cHRIYW5kbGVyO1xuICAgICAgICB0aGlzLmludGVycnVwdEhhbmRsZXIgPSBjYjtcbiAgICAgICAgaWYgKCFwcmV2SW50ZXJydXB0SGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX1J1bnRpbWVFbmFibGVJbnRlcnJ1cHRIYW5kbGVyKHRoaXMucnQudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIGlmIGFueS5cbiAgICAgKiBTZWUgW1tzZXRJbnRlcnJ1cHRIYW5kbGVyXV0uXG4gICAgICovXG4gICAgcmVtb3ZlSW50ZXJydXB0SGFuZGxlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJydXB0SGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5mZmkuUVRTX1J1bnRpbWVEaXNhYmxlSW50ZXJydXB0SGFuZGxlcih0aGlzLnJ0LnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJydXB0SGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIHBlbmRpbmdKb2JzIG9uIHRoZSBydW50aW1lIHVudGlsIGBtYXhKb2JzVG9FeGVjdXRlYCBqb2JzIGFyZVxuICAgICAqIGV4ZWN1dGVkIChkZWZhdWx0IGFsbCBwZW5kaW5nSm9icyksIHRoZSBxdWV1ZSBpcyBleGhhdXN0ZWQsIG9yIHRoZSBydW50aW1lXG4gICAgICogZW5jb3VudGVycyBhbiBleGNlcHRpb24uXG4gICAgICpcbiAgICAgKiBJbiBRdWlja0pTLCBwcm9taXNlcyBhbmQgYXN5bmMgZnVuY3Rpb25zICppbnNpZGUgdGhlIHJ1bnRpbWUqIGNyZWF0ZVxuICAgICAqIHBlbmRpbmdKb2JzLiBUaGVzZSBkbyBub3QgZXhlY3V0ZSBpbW1lZGlhdGVseSBhbmQgbmVlZCB0byB0cmlnZ2VyZWQgdG8gcnVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1heEpvYnNUb0V4ZWN1dGUgLSBXaGVuIG5lZ2F0aXZlLCBydW4gYWxsIHBlbmRpbmcgam9icy4gT3RoZXJ3aXNlIGV4ZWN1dGVcbiAgICAgKiBhdCBtb3N0IGBtYXhKb2JzVG9FeGVjdXRlYCBiZWZvcmUgcmV0dXJuaW5nLlxuICAgICAqXG4gICAgICogQHJldHVybiBPbiBzdWNjZXNzLCB0aGUgbnVtYmVyIG9mIGV4ZWN1dGVkIGpvYnMuIE9uIGVycm9yLCB0aGUgZXhjZXB0aW9uXG4gICAgICogdGhhdCBzdG9wcGVkIGV4ZWN1dGlvbiwgYW5kIHRoZSBjb250ZXh0IGl0IG9jY3VycmVkIGluLiBOb3RlIHRoYXRcbiAgICAgKiBleGVjdXRlUGVuZGluZ0pvYnMgd2lsbCBub3Qgbm9ybWFsbHkgcmV0dXJuIGVycm9ycyB0aHJvd24gaW5zaWRlIGFzeW5jXG4gICAgICogZnVuY3Rpb25zIG9yIHJlamVjdGVkIHByb21pc2VzLiBUaG9zZSBlcnJvcnMgYXJlIGF2YWlsYWJsZSBieSBjYWxsaW5nXG4gICAgICogW1tyZXNvbHZlUHJvbWlzZV1dIG9uIHRoZSBwcm9taXNlIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgYXN5bmMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZXhlY3V0ZVBlbmRpbmdKb2JzKG1heEpvYnNUb0V4ZWN1dGUgPSAtMSkge1xuICAgICAgICBjb25zdCBjdHhQdHJPdXQgPSB0aGlzLm1lbW9yeS5uZXdNdXRhYmxlUG9pbnRlckFycmF5KDEpO1xuICAgICAgICBjb25zdCB2YWx1ZVB0ciA9IHRoaXMuZmZpLlFUU19FeGVjdXRlUGVuZGluZ0pvYih0aGlzLnJ0LnZhbHVlLCBtYXhKb2JzVG9FeGVjdXRlID8/IC0xLCBjdHhQdHJPdXQudmFsdWUucHRyKTtcbiAgICAgICAgY29uc3QgY3R4UHRyID0gY3R4UHRyT3V0LnZhbHVlLnR5cGVkQXJyYXlbMF07XG4gICAgICAgIGN0eFB0ck91dC5kaXNwb3NlKCk7XG4gICAgICAgIGlmIChjdHhQdHIgPT09IDApIHtcbiAgICAgICAgICAgIC8vIE5vIGpvYnMgZXhlY3V0ZWQuXG4gICAgICAgICAgICB0aGlzLmZmaS5RVFNfRnJlZVZhbHVlUG9pbnRlclJ1bnRpbWUodGhpcy5ydC52YWx1ZSwgdmFsdWVQdHIpO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IDAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0TWFwLmdldChjdHhQdHIpID8/XG4gICAgICAgICAgICB0aGlzLm5ld0NvbnRleHQoe1xuICAgICAgICAgICAgICAgIGNvbnRleHRQb2ludGVyOiBjdHhQdHIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0VmFsdWUgPSBjb250ZXh0LmdldE1lbW9yeSh0aGlzLnJ0LnZhbHVlKS5oZWFwVmFsdWVIYW5kbGUodmFsdWVQdHIpO1xuICAgICAgICBjb25zdCB0eXBlT2ZSZXQgPSBjb250ZXh0LnR5cGVvZihyZXN1bHRWYWx1ZSk7XG4gICAgICAgIGlmICh0eXBlT2ZSZXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkSm9icyA9IGNvbnRleHQuZ2V0TnVtYmVyKHJlc3VsdFZhbHVlKTtcbiAgICAgICAgICAgIHJlc3VsdFZhbHVlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBleGVjdXRlZEpvYnMgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gT2JqZWN0LmFzc2lnbihyZXN1bHRWYWx1ZSwgeyBjb250ZXh0IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBtYXggbWVtb3J5IHRoaXMgcnVudGltZSBjYW4gYWxsb2NhdGUuXG4gICAgICogVG8gcmVtb3ZlIHRoZSBsaW1pdCwgc2V0IHRvIGAtMWAuXG4gICAgICovXG4gICAgc2V0TWVtb3J5TGltaXQobGltaXRCeXRlcykge1xuICAgICAgICBpZiAobGltaXRCeXRlcyA8IDAgJiYgbGltaXRCeXRlcyAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgbWVtb3J5IGxpbWl0IHRvIG5lZ2F0aXZlIG51bWJlci4gVG8gdW5zZXQsIHBhc3MgLTFcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mZmkuUVRTX1J1bnRpbWVTZXRNZW1vcnlMaW1pdCh0aGlzLnJ0LnZhbHVlLCBsaW1pdEJ5dGVzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSBtZW1vcnkgdXNhZ2UgZm9yIHRoaXMgcnVudGltZS4gUmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgaGFuZGxlIHRvIGFcbiAgICAgKiBKU1ZhbHVlIG9iamVjdC4gVXNlIFtbUXVpY2tKU0NvbnRleHQuZHVtcF1dIHRvIGNvbnZlcnQgdG8gYSBuYXRpdmUgb2JqZWN0LlxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBhbGxvY2F0ZSBtb3JlIG1lbW9yeSBpbnNpZGUgdGhlIHJ1bnRpbWUuIFRoZSBpbmZvcm1hdGlvblxuICAgICAqIGlzIGFjY3VyYXRlIGFzIG9mIGp1c3QgYmVmb3JlIHRoZSBjYWxsIHRvIGBjb21wdXRlTWVtb3J5VXNhZ2VgLlxuICAgICAqIEZvciBhIGh1bWFuLWRpZ2VzdGlibGUgcmVwcmVzZW50YXRpb24sIHNlZSBbW2R1bXBNZW1vcnlVc2FnZV1dLlxuICAgICAqL1xuICAgIGNvbXB1dGVNZW1vcnlVc2FnZSgpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZUNvbnRleHRNZW1vcnkgPSB0aGlzLmdldFN5c3RlbUNvbnRleHQoKS5nZXRNZW1vcnkodGhpcy5ydC52YWx1ZSk7XG4gICAgICAgIHJldHVybiBzZXJ2aWNlQ29udGV4dE1lbW9yeS5oZWFwVmFsdWVIYW5kbGUodGhpcy5mZmkuUVRTX1J1bnRpbWVDb21wdXRlTWVtb3J5VXNhZ2UodGhpcy5ydC52YWx1ZSwgc2VydmljZUNvbnRleHRNZW1vcnkuY3R4LnZhbHVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgbWVtb3J5IHVzYWdlIGluIHRoaXMgcnVudGltZS5cbiAgICAgKiBGb3IgcHJvZ3JhbW1hdGljIGFjY2VzcyB0byB0aGlzIGluZm9ybWF0aW9uLCBzZWUgW1tjb21wdXRlTWVtb3J5VXNhZ2VdXS5cbiAgICAgKi9cbiAgICBkdW1wTWVtb3J5VXNhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5jb25zdW1lSGVhcENoYXJQb2ludGVyKHRoaXMuZmZpLlFUU19SdW50aW1lRHVtcE1lbW9yeVVzYWdlKHRoaXMucnQudmFsdWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBtYXggc3RhY2sgc2l6ZSBmb3IgdGhpcyBydW50aW1lLCBpbiBieXRlcy5cbiAgICAgKiBUbyByZW1vdmUgdGhlIGxpbWl0LCBzZXQgdG8gYDBgLlxuICAgICAqL1xuICAgIHNldE1heFN0YWNrU2l6ZShzdGFja1NpemUpIHtcbiAgICAgICAgaWYgKHN0YWNrU2l6ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZXQgbWVtb3J5IGxpbWl0IHRvIG5lZ2F0aXZlIG51bWJlci4gVG8gdW5zZXQsIHBhc3MgMC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mZmkuUVRTX1J1bnRpbWVTZXRNYXhTdGFja1NpemUodGhpcy5ydC52YWx1ZSwgc3RhY2tTaXplKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXNzZXJ0IHRoYXQgYGhhbmRsZWAgaXMgb3duZWQgYnkgdGhpcyBydW50aW1lLlxuICAgICAqIEB0aHJvd3MgUXVpY2tKU1dyb25nT3duZXIgaWYgb3duZWQgYnkgYSBkaWZmZXJlbnQgcnVudGltZS5cbiAgICAgKi9cbiAgICBhc3NlcnRPd25lZChoYW5kbGUpIHtcbiAgICAgICAgaWYgKGhhbmRsZS5vd25lciAmJiBoYW5kbGUub3duZXIucnQgIT09IHRoaXMucnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5RdWlja0pTV3JvbmdPd25lcihgSGFuZGxlIGlzIG5vdCBvd25lZCBieSB0aGlzIHJ1bnRpbWU6ICR7aGFuZGxlLm93bmVyLnJ0LnZhbHVlfSAhPSAke3RoaXMucnQudmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0U3lzdGVtQ29udGV4dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIFdlIG93biB0aGlzIGNvbnRleHQgYW5kIHNob3VsZCBkaXNwb3NlIG9mIGl0LlxuICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5zY29wZS5tYW5hZ2UodGhpcy5uZXdDb250ZXh0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQ7XG4gICAgfVxufVxuZXhwb3J0cy5RdWlja0pTUnVudGltZSA9IFF1aWNrSlNSdW50aW1lO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cnVudGltZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRXZhbEZsYWdzID0gZXhwb3J0cy5hc3NlcnRTeW5jID0gdm9pZCAwO1xuZnVuY3Rpb24gYXNzZXJ0U3luYyhmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiBtdXN0QmVTeW5jKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZm4oLi4uYXJncyk7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gXCJvYmplY3RcIiAmJiByZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGdW5jdGlvbiB1bmV4cGVjdGVkbHkgcmV0dXJuZWQgYSBQcm9taXNlXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn1cbmV4cG9ydHMuYXNzZXJ0U3luYyA9IGFzc2VydFN5bmM7XG4vKiogQml0ZmllbGQgb3B0aW9ucyBmb3IgSlNfRXZhbCgpIEMgZnVuY3Rpb24uICovXG5leHBvcnRzLkV2YWxGbGFncyA9IHtcbiAgICAvKiogZ2xvYmFsIGNvZGUgKGRlZmF1bHQpICovXG4gICAgSlNfRVZBTF9UWVBFX0dMT0JBTDogMCA8PCAwLFxuICAgIC8qKiBtb2R1bGUgY29kZSAqL1xuICAgIEpTX0VWQUxfVFlQRV9NT0RVTEU6IDEgPDwgMCxcbiAgICAvKiogZGlyZWN0IGNhbGwgKGludGVybmFsIHVzZSkgKi9cbiAgICBKU19FVkFMX1RZUEVfRElSRUNUOiAyIDw8IDAsXG4gICAgLyoqIGluZGlyZWN0IGNhbGwgKGludGVybmFsIHVzZSkgKi9cbiAgICBKU19FVkFMX1RZUEVfSU5ESVJFQ1Q6IDMgPDwgMCxcbiAgICBKU19FVkFMX1RZUEVfTUFTSzogMyA8PCAwLFxuICAgIC8qKiBmb3JjZSAnc3RyaWN0JyBtb2RlICovXG4gICAgSlNfRVZBTF9GTEFHX1NUUklDVDogMSA8PCAzLFxuICAgIC8qKiBmb3JjZSAnc3RyaXAnIG1vZGUgKi9cbiAgICBKU19FVkFMX0ZMQUdfU1RSSVA6IDEgPDwgNCxcbiAgICAvKipcbiAgICAgKiBjb21waWxlIGJ1dCBkbyBub3QgcnVuLiBUaGUgcmVzdWx0IGlzIGFuIG9iamVjdCB3aXRoIGFcbiAgICAgKiBKU19UQUdfRlVOQ1RJT05fQllURUNPREUgb3IgSlNfVEFHX01PRFVMRSB0YWcuIEl0IGNhbiBiZSBleGVjdXRlZFxuICAgICAqIHdpdGggSlNfRXZhbEZ1bmN0aW9uKCkuXG4gICAgICovXG4gICAgSlNfRVZBTF9GTEFHX0NPTVBJTEVfT05MWTogMSA8PCA1LFxuICAgIC8qKiBkb24ndCBpbmNsdWRlIHRoZSBzdGFjayBmcmFtZXMgYmVmb3JlIHRoaXMgZXZhbCBpbiB0aGUgRXJyb3IoKSBiYWNrdHJhY2VzICovXG4gICAgSlNfRVZBTF9GTEFHX0JBQ0tUUkFDRV9CQVJSSUVSOiAxIDw8IDYsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMtZmZpLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jb25jYXQgPSBleHBvcnRzLmV2YWxPcHRpb25zVG9GbGFncyA9IGV4cG9ydHMuRGVmYXVsdEludHJpbnNpY3MgPSB2b2lkIDA7XG5jb25zdCB0eXBlc19mZmlfMSA9IHJlcXVpcmUoXCIuL3R5cGVzLWZmaVwiKTtcbmNvbnN0IFVuc3RhYmxlU3ltYm9sID0gU3ltYm9sKFwiVW5zdGFibGVcIik7XG4vLyBGb3IgaW5mb3JtYXRpb25hbCBwdXJwb3Nlc1xuY29uc3QgRGVmYXVsdEludHJpbnNpY3NMaXN0ID0gW1xuICAgIFwiQmFzZU9iamVjdHNcIixcbiAgICBcIkRhdGVcIixcbiAgICBcIkV2YWxcIixcbiAgICBcIlN0cmluZ05vcm1hbGl6ZVwiLFxuICAgIFwiUmVnRXhwXCIsXG4gICAgXCJKU09OXCIsXG4gICAgXCJQcm94eVwiLFxuICAgIFwiTWFwU2V0XCIsXG4gICAgXCJUeXBlZEFycmF5c1wiLFxuICAgIFwiUHJvbWlzZVwiLFxuXTtcbi8qKlxuICogV29yayBpbiBwcm9ncmVzcy5cbiAqL1xuZXhwb3J0cy5EZWZhdWx0SW50cmluc2ljcyA9IFN5bWJvbChcIkRlZmF1bHRJbnRyaW5zaWNzXCIpO1xuLyoqIENvbnZlcnQgW1tDb250ZXh0RXZhbE9wdGlvbnNdXSB0byBhIGJpdGZpZWxkIGZsYWdzICovXG5mdW5jdGlvbiBldmFsT3B0aW9uc1RvRmxhZ3MoZXZhbE9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIGV2YWxPcHRpb25zID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBldmFsT3B0aW9ucztcbiAgICB9XG4gICAgaWYgKGV2YWxPcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IHsgdHlwZSwgc3RyaWN0LCBzdHJpcCwgY29tcGlsZU9ubHksIGJhY2t0cmFjZUJhcnJpZXIgfSA9IGV2YWxPcHRpb25zO1xuICAgIGxldCBmbGFncyA9IDA7XG4gICAgaWYgKHR5cGUgPT09IFwiZ2xvYmFsXCIpXG4gICAgICAgIGZsYWdzIHw9IHR5cGVzX2ZmaV8xLkV2YWxGbGFncy5KU19FVkFMX1RZUEVfR0xPQkFMO1xuICAgIGlmICh0eXBlID09PSBcIm1vZHVsZVwiKVxuICAgICAgICBmbGFncyB8PSB0eXBlc19mZmlfMS5FdmFsRmxhZ3MuSlNfRVZBTF9UWVBFX01PRFVMRTtcbiAgICBpZiAoc3RyaWN0KVxuICAgICAgICBmbGFncyB8PSB0eXBlc19mZmlfMS5FdmFsRmxhZ3MuSlNfRVZBTF9GTEFHX1NUUklDVDtcbiAgICBpZiAoc3RyaXApXG4gICAgICAgIGZsYWdzIHw9IHR5cGVzX2ZmaV8xLkV2YWxGbGFncy5KU19FVkFMX0ZMQUdfU1RSSVA7XG4gICAgaWYgKGNvbXBpbGVPbmx5KVxuICAgICAgICBmbGFncyB8PSB0eXBlc19mZmlfMS5FdmFsRmxhZ3MuSlNfRVZBTF9GTEFHX0NPTVBJTEVfT05MWTtcbiAgICBpZiAoYmFja3RyYWNlQmFycmllcilcbiAgICAgICAgZmxhZ3MgfD0gdHlwZXNfZmZpXzEuRXZhbEZsYWdzLkpTX0VWQUxfRkxBR19CQUNLVFJBQ0VfQkFSUklFUjtcbiAgICByZXR1cm4gZmxhZ3M7XG59XG5leHBvcnRzLmV2YWxPcHRpb25zVG9GbGFncyA9IGV2YWxPcHRpb25zVG9GbGFncztcbmZ1bmN0aW9uIGNvbmNhdCguLi52YWx1ZXMpIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnRzLmNvbmNhdCA9IGNvbmNhdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlJFTEVBU0VfQVNZTkMgPSBleHBvcnRzLkRFQlVHX0FTWU5DID0gZXhwb3J0cy5SRUxFQVNFX1NZTkMgPSBleHBvcnRzLkRFQlVHX1NZTkMgPSBleHBvcnRzLm1lbW9pemVQcm9taXNlRmFjdG9yeSA9IGV4cG9ydHMubmV3UXVpY2tKU0FzeW5jV0FTTU1vZHVsZSA9IGV4cG9ydHMubmV3UXVpY2tKU1dBU01Nb2R1bGUgPSB2b2lkIDA7XG5jb25zdCBlc21IZWxwZXJzXzEgPSByZXF1aXJlKFwiLi9lc21IZWxwZXJzXCIpO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcsIGNvbXBsZXRlbHkgaXNvbGF0ZWQgV2ViQXNzZW1ibHkgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIFF1aWNrSlMgbGlicmFyeS5cbiAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiBbW1F1aWNrSlNXQVNNTW9kdWxlXV0uXG4gKlxuICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgaGFyZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIFdlYkFzc2VtYmx5IG1vZHVsZXMgaW4gb2xkZXJcbiAqIHZlcnNpb25zIG9mIHY4OlxuICogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MTIwNzZcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbmV3UXVpY2tKU1dBU01Nb2R1bGUoXG4vKipcbiAqIE9wdGlvbmFsbHksIHBhc3MgYSB7QGxpbmsgU3luY0J1aWxkVmFyaWFudH0gdG8gY29uc3RydWN0IGEgZGlmZmVyZW50IFdlYkFzc2VtYmx5IG1vZHVsZS5cbiAqL1xudmFyaWFudCA9IGV4cG9ydHMuUkVMRUFTRV9TWU5DKSB7XG4gICAgY29uc3QgW3dhc21Nb2R1bGVMb2FkZXIsIFF1aWNrSlNGRkksIHsgUXVpY2tKU1dBU01Nb2R1bGUgfV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHZhcmlhbnQuaW1wb3J0TW9kdWxlTG9hZGVyKCksXG4gICAgICAgIHZhcmlhbnQuaW1wb3J0RkZJKCksXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL21vZHVsZS5qc1wiKSkpLnRoZW4oZXNtSGVscGVyc18xLnVud3JhcFR5cGVzY3JpcHQpLFxuICAgIF0pO1xuICAgIGNvbnN0IHdhc21Nb2R1bGUgPSBhd2FpdCB3YXNtTW9kdWxlTG9hZGVyKCk7XG4gICAgd2FzbU1vZHVsZS50eXBlID0gXCJzeW5jXCI7XG4gICAgY29uc3QgZmZpID0gbmV3IFF1aWNrSlNGRkkod2FzbU1vZHVsZSk7XG4gICAgcmV0dXJuIG5ldyBRdWlja0pTV0FTTU1vZHVsZSh3YXNtTW9kdWxlLCBmZmkpO1xufVxuZXhwb3J0cy5uZXdRdWlja0pTV0FTTU1vZHVsZSA9IG5ld1F1aWNrSlNXQVNNTW9kdWxlO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcsIGNvbXBsZXRlbHkgaXNvbGF0ZWQgV2ViQXNzZW1ibHkgbW9kdWxlIGNvbnRhaW5pbmcgYSB2ZXJzaW9uIG9mIHRoZSBRdWlja0pTIGxpYnJhcnlcbiAqIGNvbXBpbGVkIHdpdGggRW1zY3JpcHRlbidzIFtBU1lOQ0lGWV0oaHR0cHM6Ly9lbXNjcmlwdGVuLm9yZy9kb2NzL3BvcnRpbmcvYXN5bmNpZnkuaHRtbCkgdHJhbnNmb3JtLlxuICpcbiAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBvZmZlcnMgZmVhdHVyZXMgdGhhdCBlbmFibGUgc3luY2hyb25vdXMgY29kZVxuICogaW5zaWRlIHRoZSBWTSB0byBpbnRlcmFjdCB3aXRoIGFzeW5jaHJvbm91cyBjb2RlIGluIHRoZSBob3N0IGVudmlyb25tZW50LlxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIFtbUXVpY2tKU0FzeW5jV0FTTU1vZHVsZV1dLCBbW1F1aWNrSlNBc3luY1J1bnRpbWVdXSxcbiAqIGFuZCBbW1F1aWNrSlNBc3luY0NvbnRleHRdXS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlcmUgaXMgYSBoYXJkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgV2ViQXNzZW1ibHkgbW9kdWxlcyBpbiBvbGRlclxuICogdmVyc2lvbnMgb2Ygdjg6XG4gKiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMjA3NlxuICovXG5hc3luYyBmdW5jdGlvbiBuZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlKFxuLyoqXG4gKiBPcHRpb25hbGx5LCBwYXNzIGEge0BsaW5rIEFzeW5jQnVpbGRWYXJpYW50fSB0byBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgV2ViQXNzZW1ibHkgbW9kdWxlLlxuICovXG52YXJpYW50ID0gZXhwb3J0cy5SRUxFQVNFX0FTWU5DKSB7XG4gICAgY29uc3QgW3dhc21Nb2R1bGVMb2FkZXIsIFF1aWNrSlNBc3luY0ZGSSwgeyBRdWlja0pTQXN5bmNXQVNNTW9kdWxlIH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB2YXJpYW50LmltcG9ydE1vZHVsZUxvYWRlcigpLFxuICAgICAgICB2YXJpYW50LmltcG9ydEZGSSgpLFxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9tb2R1bGUtYXN5bmNpZnkuanNcIikpKS50aGVuKGVzbUhlbHBlcnNfMS51bndyYXBUeXBlc2NyaXB0KSxcbiAgICBdKTtcbiAgICBjb25zdCB3YXNtTW9kdWxlID0gYXdhaXQgd2FzbU1vZHVsZUxvYWRlcigpO1xuICAgIHdhc21Nb2R1bGUudHlwZSA9IFwiYXN5bmNcIjtcbiAgICBjb25zdCBmZmkgPSBuZXcgUXVpY2tKU0FzeW5jRkZJKHdhc21Nb2R1bGUpO1xuICAgIHJldHVybiBuZXcgUXVpY2tKU0FzeW5jV0FTTU1vZHVsZSh3YXNtTW9kdWxlLCBmZmkpO1xufVxuZXhwb3J0cy5uZXdRdWlja0pTQXN5bmNXQVNNTW9kdWxlID0gbmV3UXVpY2tKU0FzeW5jV0FTTU1vZHVsZTtcbi8qKlxuICogSGVscGVyIGludGVuZGVkIHRvIG1lbW9pemUgdGhlIGNyZWF0aW9uIG9mIGEgV2ViQXNzZW1ibHkgbW9kdWxlLlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZ2V0RGVidWdNb2R1bGUgPSBtZW1vaXplUHJvbWlzZUZhY3RvcnkoKCkgPT4gbmV3UXVpY2tKU1dBU01Nb2R1bGUoREVCVUdfU1lOQykpXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZVByb21pc2VGYWN0b3J5KGZuKSB7XG4gICAgbGV0IHByb21pc2U7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgcmV0dXJuIChwcm9taXNlID8/IChwcm9taXNlID0gZm4oKSkpO1xuICAgIH07XG59XG5leHBvcnRzLm1lbW9pemVQcm9taXNlRmFjdG9yeSA9IG1lbW9pemVQcm9taXNlRmFjdG9yeTtcbi8qKlxuICogVGhpcyBidWlsZCB2YXJpYW50IGlzIGNvbXBpbGVkIHdpdGggYC1mc2FuaXRpemU9bGVha2AuIEl0IGluc3RydW1lbnRzIGFsbFxuICogbWVtb3J5IGFsbG9jYXRpb25zIGFuZCB3aGVuIGNvbWJpbmVkIHdpdGggc291cmNlbWFwcywgY2FuIHByZXNlbnQgc3RhY2sgdHJhY2VcbiAqIGxvY2F0aW9ucyB3aGVyZSBtZW1vcnkgbGVha3Mgb2NjdXIuXG4gKlxuICogU2VlIFtbVGVzdFF1aWNrSlNXQVNNTW9kdWxlXV0gd2hpY2ggcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBsZWFrIHNhbml0aXplciB2aWFcbiAqIHtAbGluayBUZXN0UXVpY2tKU1dBU01Nb2R1bGUuYXNzZXJ0Tm9NZW1vcnlBbGxvY2F0ZWR9LlxuICpcbiAqIFRoZSBkb3duc2lkZSBpcyB0aGF0IGl0J3MgMTAwLTEwMDB4IHNsb3dlciB0aGFuIHRoZSBvdGhlciB2YXJpYW50cy5cbiAqIFN1Z2dlc3RlZCB1c2UgY2FzZTogYXV0b21hdGVkIHRlc3RpbmcsIHJlZ3Jlc3Npb24gdGVzdGluZywgYW5kIGludGVyYWN0aXZlXG4gKiBkZWJ1Z2dpbmcuXG4gKi9cbmV4cG9ydHMuREVCVUdfU1lOQyA9IHtcbiAgICB0eXBlOiBcInN5bmNcIixcbiAgICBhc3luYyBpbXBvcnRGRkkoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgLy8gY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KFwiLi9nZW5lcmF0ZWQvZmZpLldBU01fREVCVUdfU1lOQy5qc1wiKVxuICAgICAgICAvLyByZXR1cm4gdW53cmFwVHlwZXNjcmlwdChtb2QpLlF1aWNrSlNGRklcbiAgICB9LFxuICAgIGFzeW5jIGltcG9ydE1vZHVsZUxvYWRlcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICAvLyBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoXCIuL2dlbmVyYXRlZC9lbXNjcmlwdGVuLW1vZHVsZS5XQVNNX0RFQlVHX1NZTkMuanNcIilcbiAgICAgICAgLy8gcmV0dXJuIHVud3JhcEphdmFzY3JpcHQobW9kKS5kZWZhdWx0XG4gICAgfSxcbn07XG4vKipcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgKHN5bmNocm9ub3VzKSBidWlsZCB2YXJpYW50LlxuICoge0BsaW5rIGdldFF1aWNrSlN9IHJldHVybnMgYSBtZW1vaXplZCBpbnN0YW5jZSBvZiB0aGlzIGJ1aWxkIHZhcmlhbnQuXG4gKi9cbmV4cG9ydHMuUkVMRUFTRV9TWU5DID0ge1xuICAgIHR5cGU6IFwic3luY1wiLFxuICAgIGFzeW5jIGltcG9ydEZGSSgpIHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vZ2VuZXJhdGVkL2ZmaS5XQVNNX1JFTEVBU0VfU1lOQy5qc1wiKSkpO1xuICAgICAgICByZXR1cm4gKDAsIGVzbUhlbHBlcnNfMS51bndyYXBUeXBlc2NyaXB0KShtb2QpLlF1aWNrSlNGRkk7XG4gICAgfSxcbiAgICBhc3luYyBpbXBvcnRNb2R1bGVMb2FkZXIoKSB7XG4gICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2dlbmVyYXRlZC9lbXNjcmlwdGVuLW1vZHVsZS5XQVNNX1JFTEVBU0VfU1lOQy5qc1wiKSkpO1xuICAgICAgICByZXR1cm4gKDAsIGVzbUhlbHBlcnNfMS51bndyYXBKYXZhc2NyaXB0KShtb2QpO1xuICAgIH0sXG59O1xuLyoqXG4gKiBUaGUgYXN5bmMgZGVidWcgYnVpbGQgdmFyaWFudCBtYXkgb3IgbWF5IG5vdCBoYXZlIHRoZSBzYW5pdGl6ZXIgZW5hYmxlZC5cbiAqIEl0IGRvZXMgcHJpbnQgYSBsb3Qgb2YgZGVidWcgbG9ncy5cbiAqXG4gKiBTdWdnZXN0ZWQgdXNlIGNhc2U6IGludGVyYWN0aXZlIGRlYnVnZ2luZyBvbmx5LlxuICovXG5leHBvcnRzLkRFQlVHX0FTWU5DID0ge1xuICAgIHR5cGU6IFwiYXN5bmNcIixcbiAgICBhc3luYyBpbXBvcnRGRkkoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgLy8gY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KFwiLi9nZW5lcmF0ZWQvZmZpLldBU01fREVCVUdfQVNZTkNJRlkuanNcIilcbiAgICAgICAgLy8gcmV0dXJuIHVud3JhcFR5cGVzY3JpcHQobW9kKS5RdWlja0pTQXN5bmNGRklcbiAgICB9LFxuICAgIGFzeW5jIGltcG9ydE1vZHVsZUxvYWRlcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICAvLyBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQoXCIuL2dlbmVyYXRlZC9lbXNjcmlwdGVuLW1vZHVsZS5XQVNNX0RFQlVHX0FTWU5DSUZZLmpzXCIpXG4gICAgICAgIC8vIHJldHVybiB1bndyYXBKYXZhc2NyaXB0KG1vZCkuZGVmYXVsdFxuICAgIH0sXG59O1xuLyoqXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGFzeW5jaWZpZWQgYnVpbGQgdmFyaWFudC5cbiAqL1xuZXhwb3J0cy5SRUxFQVNFX0FTWU5DID0ge1xuICAgIHR5cGU6IFwiYXN5bmNcIixcbiAgICBhc3luYyBpbXBvcnRGRkkoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgLy8gY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KFwiLi9nZW5lcmF0ZWQvZmZpLldBU01fUkVMRUFTRV9BU1lOQ0lGWS5qc1wiKVxuICAgICAgICAvLyByZXR1cm4gdW53cmFwVHlwZXNjcmlwdChtb2QpLlF1aWNrSlNBc3luY0ZGSVxuICAgIH0sXG4gICAgYXN5bmMgaW1wb3J0TW9kdWxlTG9hZGVyKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgIC8vIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChcIi4vZ2VuZXJhdGVkL2Vtc2NyaXB0ZW4tbW9kdWxlLldBU01fUkVMRUFTRV9BU1lOQ0lGWS5qc1wiKVxuICAgICAgICAvLyByZXR1cm4gdW53cmFwSmF2YXNjcmlwdChtb2QpLmRlZmF1bHRcbiAgICB9LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZhcmlhbnRzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0ZhaWwgPSBleHBvcnRzLmlzU3VjY2VzcyA9IHZvaWQgMDtcbmZ1bmN0aW9uIGlzU3VjY2VzcyhzdWNjZXNzT3JGYWlsKSB7XG4gICAgcmV0dXJuIFwiZXJyb3JcIiBpbiBzdWNjZXNzT3JGYWlsID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuaXNTdWNjZXNzID0gaXNTdWNjZXNzO1xuZnVuY3Rpb24gaXNGYWlsKHN1Y2Nlc3NPckZhaWwpIHtcbiAgICByZXR1cm4gXCJlcnJvclwiIGluIHN1Y2Nlc3NPckZhaWwgPT09IHRydWU7XG59XG5leHBvcnRzLmlzRmFpbCA9IGlzRmFpbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZtLWludGVyZmFjZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZXEgPSBleHBvcnRzLmpzb24gPSBleHBvcnRzLnRvQnVmZmVyID0gdm9pZCAwO1xuY29uc3QgaHR0cCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiaHR0cFwiKSk7XG5jb25zdCBodHRwcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiaHR0cHNcIikpO1xuYXN5bmMgZnVuY3Rpb24gdG9CdWZmZXIoc3RyZWFtKSB7XG4gICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBzdHJlYW0pIHtcbiAgICAgICAgbGVuZ3RoICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChjaHVua3MsIGxlbmd0aCk7XG59XG5leHBvcnRzLnRvQnVmZmVyID0gdG9CdWZmZXI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuYXN5bmMgZnVuY3Rpb24ganNvbihzdHJlYW0pIHtcbiAgICBjb25zdCBidWYgPSBhd2FpdCB0b0J1ZmZlcihzdHJlYW0pO1xuICAgIGNvbnN0IHN0ciA9IGJ1Zi50b1N0cmluZygndXRmOCcpO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0cik7XG4gICAgfVxuICAgIGNhdGNoIChfZXJyKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IF9lcnI7XG4gICAgICAgIGVyci5tZXNzYWdlICs9IGAgKGlucHV0OiAke3N0cn0pYDtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn1cbmV4cG9ydHMuanNvbiA9IGpzb247XG5mdW5jdGlvbiByZXEodXJsLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBocmVmID0gdHlwZW9mIHVybCA9PT0gJ3N0cmluZycgPyB1cmwgOiB1cmwuaHJlZjtcbiAgICBjb25zdCByZXEgPSAoaHJlZi5zdGFydHNXaXRoKCdodHRwczonKSA/IGh0dHBzIDogaHR0cCkucmVxdWVzdCh1cmwsIG9wdHMpO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlcVxuICAgICAgICAgICAgLm9uY2UoJ3Jlc3BvbnNlJywgcmVzb2x2ZSlcbiAgICAgICAgICAgIC5vbmNlKCdlcnJvcicsIHJlamVjdClcbiAgICAgICAgICAgIC5lbmQoKTtcbiAgICB9KTtcbiAgICByZXEudGhlbiA9IHByb21pc2UudGhlbi5iaW5kKHByb21pc2UpO1xuICAgIHJldHVybiByZXE7XG59XG5leHBvcnRzLnJlcSA9IHJlcTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhlbHBlcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFnZW50ID0gdm9pZCAwO1xuY29uc3QgbmV0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJuZXRcIikpO1xuY29uc3QgaHR0cCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiaHR0cFwiKSk7XG5jb25zdCBodHRwc18xID0gcmVxdWlyZShcImh0dHBzXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2hlbHBlcnNcIiksIGV4cG9ydHMpO1xuY29uc3QgSU5URVJOQUwgPSBTeW1ib2woJ0FnZW50QmFzZUludGVybmFsU3RhdGUnKTtcbmNsYXNzIEFnZW50IGV4dGVuZHMgaHR0cC5BZ2VudCB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpc1tJTlRFUk5BTF0gPSB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhbiBgaHR0cGAgb3IgYGh0dHBzYCByZXF1ZXN0LlxuICAgICAqL1xuICAgIGlzU2VjdXJlRW5kcG9pbnQob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgdGhlIGBzZWN1cmVFbmRwb2ludGAgcHJvcGVydHkgZXhwbGljaXRseSwgc2luY2UgdGhpc1xuICAgICAgICAgICAgLy8gbWVhbnMgdGhhdCBhIHBhcmVudCBgQWdlbnRgIGlzIFwicGFzc2luZyB0aHJvdWdoXCIgdG8gdGhpcyBpbnN0YW5jZS5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VjdXJlRW5kcG9pbnQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnNlY3VyZUVuZHBvaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gZXhwbGljaXQgYHNlY3VyZWAgZW5kcG9pbnQsIGNoZWNrIGlmIGBwcm90b2NvbGAgcHJvcGVydHkgaXNcbiAgICAgICAgICAgIC8vIHNldC4gVGhpcyB3aWxsIHVzdWFsbHkgYmUgdGhlIGNhc2Ugc2luY2UgdXNpbmcgYSBmdWxsIHN0cmluZyBVUkxcbiAgICAgICAgICAgIC8vIG9yIGBVUkxgIGluc3RhbmNlIHNob3VsZCBiZSB0aGUgbW9zdCBjb21tb24gdXNhZ2UuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucHJvdG9jb2wgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZpbmFsbHksIGlmIG5vIGBwcm90b2NvbGAgcHJvcGVydHkgd2FzIHNldCwgdGhlbiBmYWxsIGJhY2sgdG9cbiAgICAgICAgLy8gY2hlY2tpbmcgdGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBjdXJyZW50IGNhbGwgc3RhY2ssIGFuZCB0cnkgdG9cbiAgICAgICAgLy8gZGV0ZWN0IHRoZSBcImh0dHBzXCIgbW9kdWxlLlxuICAgICAgICBjb25zdCB7IHN0YWNrIH0gPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzdGFjayAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBzdGFja1xuICAgICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgLnNvbWUoKGwpID0+IGwuaW5kZXhPZignKGh0dHBzLmpzOicpICE9PSAtMSB8fFxuICAgICAgICAgICAgbC5pbmRleE9mKCdub2RlOmh0dHBzOicpICE9PSAtMSk7XG4gICAgfVxuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgYXN5bmMgc2lnbmF0dXJlcyBpbiBgY29ubmVjdCgpYCBhbmQgTm9kZSdzIG5hdGl2ZVxuICAgIC8vIGNvbm5lY3Rpb24gcG9vbGluZyBpbiBgaHR0cC5BZ2VudGAsIHRoZSBhcnJheSBvZiBzb2NrZXRzIGZvciBlYWNoIG9yaWdpblxuICAgIC8vIGhhcyB0byBiZSB1cGRhdGVkIHN5bmNocm9ub3VzbHkuIFRoaXMgaXMgc28gdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgaXNcbiAgICAvLyBhY2N1cmF0ZSB3aGVuIGBhZGRSZXF1ZXN0KClgIGlzIG5leHQgY2FsbGVkLiBXZSBhY2hpZXZlIHRoaXMgYnkgY3JlYXRpbmcgYVxuICAgIC8vIGZha2Ugc29ja2V0IGFuZCBhZGRpbmcgaXQgdG8gYHNvY2tldHNbb3JpZ2luXWAgYW5kIGluY3JlbWVudGluZ1xuICAgIC8vIGB0b3RhbFNvY2tldENvdW50YC5cbiAgICBpbmNyZW1lbnRTb2NrZXRzKG5hbWUpIHtcbiAgICAgICAgLy8gSWYgYG1heFNvY2tldHNgIGFuZCBgbWF4VG90YWxTb2NrZXRzYCBhcmUgYm90aCBJbmZpbml0eSB0aGVuIHRoZXJlIGlzIG5vXG4gICAgICAgIC8vIG5lZWQgdG8gY3JlYXRlIGEgZmFrZSBzb2NrZXQgYmVjYXVzZSBOb2RlLmpzIG5hdGl2ZSBjb25uZWN0aW9uIHBvb2xpbmdcbiAgICAgICAgLy8gd2lsbCBuZXZlciBiZSBpbnZva2VkLlxuICAgICAgICBpZiAodGhpcy5tYXhTb2NrZXRzID09PSBJbmZpbml0eSAmJiB0aGlzLm1heFRvdGFsU29ja2V0cyA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsbCBpbnN0YW5jZXMgb2YgYHNvY2tldHNgIGFyZSBleHBlY3RlZCBUeXBlU2NyaXB0IGVycm9ycy4gVGhlXG4gICAgICAgIC8vIGFsdGVybmF0aXZlIGlzIHRvIGFkZCBpdCBhcyBhIHByaXZhdGUgcHJvcGVydHkgb2YgdGhpcyBjbGFzcyBidXQgdGhhdFxuICAgICAgICAvLyB3aWxsIGJyZWFrIFR5cGVTY3JpcHQgc3ViY2xhc3NpbmcuXG4gICAgICAgIGlmICghdGhpcy5zb2NrZXRzW25hbWVdKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBzb2NrZXRzYCBpcyByZWFkb25seSBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgICAgICB0aGlzLnNvY2tldHNbbmFtZV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmYWtlU29ja2V0ID0gbmV3IG5ldC5Tb2NrZXQoeyB3cml0YWJsZTogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuc29ja2V0c1tuYW1lXS5wdXNoKGZha2VTb2NrZXQpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGB0b3RhbFNvY2tldENvdW50YCBpc24ndCBkZWZpbmVkIGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgdGhpcy50b3RhbFNvY2tldENvdW50Kys7XG4gICAgICAgIHJldHVybiBmYWtlU29ja2V0O1xuICAgIH1cbiAgICBkZWNyZW1lbnRTb2NrZXRzKG5hbWUsIHNvY2tldCkge1xuICAgICAgICBpZiAoIXRoaXMuc29ja2V0c1tuYW1lXSB8fCBzb2NrZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb2NrZXRzID0gdGhpcy5zb2NrZXRzW25hbWVdO1xuICAgICAgICBjb25zdCBpbmRleCA9IHNvY2tldHMuaW5kZXhPZihzb2NrZXQpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBzb2NrZXRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yICBgdG90YWxTb2NrZXRDb3VudGAgaXNuJ3QgZGVmaW5lZCBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgICAgICB0aGlzLnRvdGFsU29ja2V0Q291bnQtLTtcbiAgICAgICAgICAgIGlmIChzb2NrZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYHNvY2tldHNgIGlzIHJlYWRvbmx5IGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zb2NrZXRzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEluIG9yZGVyIHRvIHByb3Blcmx5IHVwZGF0ZSB0aGUgc29ja2V0IHBvb2wsIHdlIG5lZWQgdG8gY2FsbCBgZ2V0TmFtZSgpYCBvblxuICAgIC8vIHRoZSBjb3JlIGBodHRwcy5BZ2VudGAgaWYgaXQgaXMgYSBzZWN1cmVFbmRwb2ludC5cbiAgICBnZXROYW1lKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgc2VjdXJlRW5kcG9pbnQgPSB0eXBlb2Ygb3B0aW9ucy5zZWN1cmVFbmRwb2ludCA9PT0gJ2Jvb2xlYW4nXG4gICAgICAgICAgICA/IG9wdGlvbnMuc2VjdXJlRW5kcG9pbnRcbiAgICAgICAgICAgIDogdGhpcy5pc1NlY3VyZUVuZHBvaW50KG9wdGlvbnMpO1xuICAgICAgICBpZiAoc2VjdXJlRW5kcG9pbnQpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYGdldE5hbWUoKWAgaXNuJ3QgZGVmaW5lZCBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgICAgICByZXR1cm4gaHR0cHNfMS5BZ2VudC5wcm90b3R5cGUuZ2V0TmFtZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYGdldE5hbWUoKWAgaXNuJ3QgZGVmaW5lZCBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgIHJldHVybiBzdXBlci5nZXROYW1lKG9wdGlvbnMpO1xuICAgIH1cbiAgICBjcmVhdGVTb2NrZXQocmVxLCBvcHRpb25zLCBjYikge1xuICAgICAgICBjb25zdCBjb25uZWN0T3B0cyA9IHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBzZWN1cmVFbmRwb2ludDogdGhpcy5pc1NlY3VyZUVuZHBvaW50KG9wdGlvbnMpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5nZXROYW1lKGNvbm5lY3RPcHRzKTtcbiAgICAgICAgY29uc3QgZmFrZVNvY2tldCA9IHRoaXMuaW5jcmVtZW50U29ja2V0cyhuYW1lKTtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuY29ubmVjdChyZXEsIGNvbm5lY3RPcHRzKSlcbiAgICAgICAgICAgIC50aGVuKChzb2NrZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50U29ja2V0cyhuYW1lLCBmYWtlU29ja2V0KTtcbiAgICAgICAgICAgIGlmIChzb2NrZXQgaW5zdGFuY2VvZiBodHRwLkFnZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgYWRkUmVxdWVzdCgpYCBpc24ndCBkZWZpbmVkIGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgICAgICAgICByZXR1cm4gc29ja2V0LmFkZFJlcXVlc3QocmVxLCBjb25uZWN0T3B0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzW0lOVEVSTkFMXS5jdXJyZW50U29ja2V0ID0gc29ja2V0O1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgY3JlYXRlU29ja2V0KClgIGlzbid0IGRlZmluZWQgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICAgICAgc3VwZXIuY3JlYXRlU29ja2V0KHJlcSwgb3B0aW9ucywgY2IpO1xuICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudFNvY2tldHMobmFtZSwgZmFrZVNvY2tldCk7XG4gICAgICAgICAgICBjYihlcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY3JlYXRlQ29ubmVjdGlvbigpIHtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdGhpc1tJTlRFUk5BTF0uY3VycmVudFNvY2tldDtcbiAgICAgICAgdGhpc1tJTlRFUk5BTF0uY3VycmVudFNvY2tldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFzb2NrZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gc29ja2V0IHdhcyByZXR1cm5lZCBpbiB0aGUgYGNvbm5lY3QoKWAgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc29ja2V0O1xuICAgIH1cbiAgICBnZXQgZGVmYXVsdFBvcnQoKSB7XG4gICAgICAgIHJldHVybiAodGhpc1tJTlRFUk5BTF0uZGVmYXVsdFBvcnQgPz9cbiAgICAgICAgICAgICh0aGlzLnByb3RvY29sID09PSAnaHR0cHM6JyA/IDQ0MyA6IDgwKSk7XG4gICAgfVxuICAgIHNldCBkZWZhdWx0UG9ydCh2KSB7XG4gICAgICAgIGlmICh0aGlzW0lOVEVSTkFMXSkge1xuICAgICAgICAgICAgdGhpc1tJTlRFUk5BTF0uZGVmYXVsdFBvcnQgPSB2O1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBwcm90b2NvbCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzW0lOVEVSTkFMXS5wcm90b2NvbCA/P1xuICAgICAgICAgICAgKHRoaXMuaXNTZWN1cmVFbmRwb2ludCgpID8gJ2h0dHBzOicgOiAnaHR0cDonKSk7XG4gICAgfVxuICAgIHNldCBwcm90b2NvbCh2KSB7XG4gICAgICAgIGlmICh0aGlzW0lOVEVSTkFMXSkge1xuICAgICAgICAgICAgdGhpc1tJTlRFUk5BTF0ucHJvdG9jb2wgPSB2O1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BZ2VudCA9IEFnZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICh7b25seUZpcnN0ID0gZmFsc2V9ID0ge30pID0+IHtcblx0Y29uc3QgcGF0dGVybiA9IFtcblx0XHQnW1xcXFx1MDAxQlxcXFx1MDA5Ql1bW1xcXFxdKCkjOz9dKig/Oig/Oig/Oig/OjtbLWEtekEtWlxcXFxkXFxcXC8jJi46PT8lQH5fXSspKnxbYS16QS1aXFxcXGRdKyg/OjtbLWEtekEtWlxcXFxkXFxcXC8jJi46PT8lQH5fXSopKik/XFxcXHUwMDA3KScsXG5cdFx0Jyg/Oig/OlxcXFxkezEsNH0oPzo7XFxcXGR7MCw0fSkqKT9bXFxcXGRBLVBSLVRaY2YtbnRxcnk9Pjx+XSkpJ1xuXHRdLmpvaW4oJ3wnKTtcblxuXHRyZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuLCBvbmx5Rmlyc3QgPyB1bmRlZmluZWQgOiAnZycpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3Qgd3JhcEFuc2kxNiA9IChmbiwgb2Zmc2V0KSA9PiAoLi4uYXJncykgPT4ge1xuXHRjb25zdCBjb2RlID0gZm4oLi4uYXJncyk7XG5cdHJldHVybiBgXFx1MDAxQlske2NvZGUgKyBvZmZzZXR9bWA7XG59O1xuXG5jb25zdCB3cmFwQW5zaTI1NiA9IChmbiwgb2Zmc2V0KSA9PiAoLi4uYXJncykgPT4ge1xuXHRjb25zdCBjb2RlID0gZm4oLi4uYXJncyk7XG5cdHJldHVybiBgXFx1MDAxQlskezM4ICsgb2Zmc2V0fTs1OyR7Y29kZX1tYDtcbn07XG5cbmNvbnN0IHdyYXBBbnNpMTZtID0gKGZuLCBvZmZzZXQpID0+ICguLi5hcmdzKSA9PiB7XG5cdGNvbnN0IHJnYiA9IGZuKC4uLmFyZ3MpO1xuXHRyZXR1cm4gYFxcdTAwMUJbJHszOCArIG9mZnNldH07Mjske3JnYlswXX07JHtyZ2JbMV19OyR7cmdiWzJdfW1gO1xufTtcblxuY29uc3QgYW5zaTJhbnNpID0gbiA9PiBuO1xuY29uc3QgcmdiMnJnYiA9IChyLCBnLCBiKSA9PiBbciwgZywgYl07XG5cbmNvbnN0IHNldExhenlQcm9wZXJ0eSA9IChvYmplY3QsIHByb3BlcnR5LCBnZXQpID0+IHtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIHtcblx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdGNvbnN0IHZhbHVlID0gZ2V0KCk7XG5cblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCB7XG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSxcblx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHR9KTtcbn07XG5cbi8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydCgnY29sb3ItY29udmVydCcpfSAqL1xubGV0IGNvbG9yQ29udmVydDtcbmNvbnN0IG1ha2VEeW5hbWljU3R5bGVzID0gKHdyYXAsIHRhcmdldFNwYWNlLCBpZGVudGl0eSwgaXNCYWNrZ3JvdW5kKSA9PiB7XG5cdGlmIChjb2xvckNvbnZlcnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdGNvbG9yQ29udmVydCA9IHJlcXVpcmUoJ2NvbG9yLWNvbnZlcnQnKTtcblx0fVxuXG5cdGNvbnN0IG9mZnNldCA9IGlzQmFja2dyb3VuZCA/IDEwIDogMDtcblx0Y29uc3Qgc3R5bGVzID0ge307XG5cblx0Zm9yIChjb25zdCBbc291cmNlU3BhY2UsIHN1aXRlXSBvZiBPYmplY3QuZW50cmllcyhjb2xvckNvbnZlcnQpKSB7XG5cdFx0Y29uc3QgbmFtZSA9IHNvdXJjZVNwYWNlID09PSAnYW5zaTE2JyA/ICdhbnNpJyA6IHNvdXJjZVNwYWNlO1xuXHRcdGlmIChzb3VyY2VTcGFjZSA9PT0gdGFyZ2V0U3BhY2UpIHtcblx0XHRcdHN0eWxlc1tuYW1lXSA9IHdyYXAoaWRlbnRpdHksIG9mZnNldCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2Ygc3VpdGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRzdHlsZXNbbmFtZV0gPSB3cmFwKHN1aXRlW3RhcmdldFNwYWNlXSwgb2Zmc2V0KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gc3R5bGVzO1xufTtcblxuZnVuY3Rpb24gYXNzZW1ibGVTdHlsZXMoKSB7XG5cdGNvbnN0IGNvZGVzID0gbmV3IE1hcCgpO1xuXHRjb25zdCBzdHlsZXMgPSB7XG5cdFx0bW9kaWZpZXI6IHtcblx0XHRcdHJlc2V0OiBbMCwgMF0sXG5cdFx0XHQvLyAyMSBpc24ndCB3aWRlbHkgc3VwcG9ydGVkIGFuZCAyMiBkb2VzIHRoZSBzYW1lIHRoaW5nXG5cdFx0XHRib2xkOiBbMSwgMjJdLFxuXHRcdFx0ZGltOiBbMiwgMjJdLFxuXHRcdFx0aXRhbGljOiBbMywgMjNdLFxuXHRcdFx0dW5kZXJsaW5lOiBbNCwgMjRdLFxuXHRcdFx0aW52ZXJzZTogWzcsIDI3XSxcblx0XHRcdGhpZGRlbjogWzgsIDI4XSxcblx0XHRcdHN0cmlrZXRocm91Z2g6IFs5LCAyOV1cblx0XHR9LFxuXHRcdGNvbG9yOiB7XG5cdFx0XHRibGFjazogWzMwLCAzOV0sXG5cdFx0XHRyZWQ6IFszMSwgMzldLFxuXHRcdFx0Z3JlZW46IFszMiwgMzldLFxuXHRcdFx0eWVsbG93OiBbMzMsIDM5XSxcblx0XHRcdGJsdWU6IFszNCwgMzldLFxuXHRcdFx0bWFnZW50YTogWzM1LCAzOV0sXG5cdFx0XHRjeWFuOiBbMzYsIDM5XSxcblx0XHRcdHdoaXRlOiBbMzcsIDM5XSxcblxuXHRcdFx0Ly8gQnJpZ2h0IGNvbG9yXG5cdFx0XHRibGFja0JyaWdodDogWzkwLCAzOV0sXG5cdFx0XHRyZWRCcmlnaHQ6IFs5MSwgMzldLFxuXHRcdFx0Z3JlZW5CcmlnaHQ6IFs5MiwgMzldLFxuXHRcdFx0eWVsbG93QnJpZ2h0OiBbOTMsIDM5XSxcblx0XHRcdGJsdWVCcmlnaHQ6IFs5NCwgMzldLFxuXHRcdFx0bWFnZW50YUJyaWdodDogWzk1LCAzOV0sXG5cdFx0XHRjeWFuQnJpZ2h0OiBbOTYsIDM5XSxcblx0XHRcdHdoaXRlQnJpZ2h0OiBbOTcsIDM5XVxuXHRcdH0sXG5cdFx0YmdDb2xvcjoge1xuXHRcdFx0YmdCbGFjazogWzQwLCA0OV0sXG5cdFx0XHRiZ1JlZDogWzQxLCA0OV0sXG5cdFx0XHRiZ0dyZWVuOiBbNDIsIDQ5XSxcblx0XHRcdGJnWWVsbG93OiBbNDMsIDQ5XSxcblx0XHRcdGJnQmx1ZTogWzQ0LCA0OV0sXG5cdFx0XHRiZ01hZ2VudGE6IFs0NSwgNDldLFxuXHRcdFx0YmdDeWFuOiBbNDYsIDQ5XSxcblx0XHRcdGJnV2hpdGU6IFs0NywgNDldLFxuXG5cdFx0XHQvLyBCcmlnaHQgY29sb3Jcblx0XHRcdGJnQmxhY2tCcmlnaHQ6IFsxMDAsIDQ5XSxcblx0XHRcdGJnUmVkQnJpZ2h0OiBbMTAxLCA0OV0sXG5cdFx0XHRiZ0dyZWVuQnJpZ2h0OiBbMTAyLCA0OV0sXG5cdFx0XHRiZ1llbGxvd0JyaWdodDogWzEwMywgNDldLFxuXHRcdFx0YmdCbHVlQnJpZ2h0OiBbMTA0LCA0OV0sXG5cdFx0XHRiZ01hZ2VudGFCcmlnaHQ6IFsxMDUsIDQ5XSxcblx0XHRcdGJnQ3lhbkJyaWdodDogWzEwNiwgNDldLFxuXHRcdFx0YmdXaGl0ZUJyaWdodDogWzEwNywgNDldXG5cdFx0fVxuXHR9O1xuXG5cdC8vIEFsaWFzIGJyaWdodCBibGFjayBhcyBncmF5IChhbmQgZ3JleSlcblx0c3R5bGVzLmNvbG9yLmdyYXkgPSBzdHlsZXMuY29sb3IuYmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5iZ0NvbG9yLmJnR3JheSA9IHN0eWxlcy5iZ0NvbG9yLmJnQmxhY2tCcmlnaHQ7XG5cdHN0eWxlcy5jb2xvci5ncmV5ID0gc3R5bGVzLmNvbG9yLmJsYWNrQnJpZ2h0O1xuXHRzdHlsZXMuYmdDb2xvci5iZ0dyZXkgPSBzdHlsZXMuYmdDb2xvci5iZ0JsYWNrQnJpZ2h0O1xuXG5cdGZvciAoY29uc3QgW2dyb3VwTmFtZSwgZ3JvdXBdIG9mIE9iamVjdC5lbnRyaWVzKHN0eWxlcykpIHtcblx0XHRmb3IgKGNvbnN0IFtzdHlsZU5hbWUsIHN0eWxlXSBvZiBPYmplY3QuZW50cmllcyhncm91cCkpIHtcblx0XHRcdHN0eWxlc1tzdHlsZU5hbWVdID0ge1xuXHRcdFx0XHRvcGVuOiBgXFx1MDAxQlske3N0eWxlWzBdfW1gLFxuXHRcdFx0XHRjbG9zZTogYFxcdTAwMUJbJHtzdHlsZVsxXX1tYFxuXHRcdFx0fTtcblxuXHRcdFx0Z3JvdXBbc3R5bGVOYW1lXSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG5cdFx0XHRjb2Rlcy5zZXQoc3R5bGVbMF0sIHN0eWxlWzFdKTtcblx0XHR9XG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCBncm91cE5hbWUsIHtcblx0XHRcdHZhbHVlOiBncm91cCxcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdFx0fSk7XG5cdH1cblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoc3R5bGVzLCAnY29kZXMnLCB7XG5cdFx0dmFsdWU6IGNvZGVzLFxuXHRcdGVudW1lcmFibGU6IGZhbHNlXG5cdH0pO1xuXG5cdHN0eWxlcy5jb2xvci5jbG9zZSA9ICdcXHUwMDFCWzM5bSc7XG5cdHN0eWxlcy5iZ0NvbG9yLmNsb3NlID0gJ1xcdTAwMUJbNDltJztcblxuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmNvbG9yLCAnYW5zaScsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMTYsICdhbnNpMTYnLCBhbnNpMmFuc2ksIGZhbHNlKSk7XG5cdHNldExhenlQcm9wZXJ0eShzdHlsZXMuY29sb3IsICdhbnNpMjU2JywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kyNTYsICdhbnNpMjU2JywgYW5zaTJhbnNpLCBmYWxzZSkpO1xuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmNvbG9yLCAnYW5zaTE2bScsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMTZtLCAncmdiJywgcmdiMnJnYiwgZmFsc2UpKTtcblx0c2V0TGF6eVByb3BlcnR5KHN0eWxlcy5iZ0NvbG9yLCAnYW5zaScsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMTYsICdhbnNpMTYnLCBhbnNpMmFuc2ksIHRydWUpKTtcblx0c2V0TGF6eVByb3BlcnR5KHN0eWxlcy5iZ0NvbG9yLCAnYW5zaTI1NicsICgpID0+IG1ha2VEeW5hbWljU3R5bGVzKHdyYXBBbnNpMjU2LCAnYW5zaTI1NicsIGFuc2kyYW5zaSwgdHJ1ZSkpO1xuXHRzZXRMYXp5UHJvcGVydHkoc3R5bGVzLmJnQ29sb3IsICdhbnNpMTZtJywgKCkgPT4gbWFrZUR5bmFtaWNTdHlsZXMod3JhcEFuc2kxNm0sICdyZ2InLCByZ2IycmdiLCB0cnVlKSk7XG5cblx0cmV0dXJuIHN0eWxlcztcbn1cblxuLy8gTWFrZSB0aGUgZXhwb3J0IGltbXV0YWJsZVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgJ2V4cG9ydHMnLCB7XG5cdGVudW1lcmFibGU6IHRydWUsXG5cdGdldDogYXNzZW1ibGVTdHlsZXNcbn0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xudmFyIHNoYXJlZF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi9zaGFyZWRcIikpO1xudmFyIGVzN18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZXM3XCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoZXM3XzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICBkZWYoXCJOb29wXCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJEb0V4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgW2RlZihcIlN0YXRlbWVudFwiKV0pO1xuICAgIGRlZihcIlN1cGVyXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiQmluZEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvYmplY3RcIiwgXCJjYWxsZWVcIilcbiAgICAgICAgLmZpZWxkKFwib2JqZWN0XCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJjYWxsZWVcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiRGVjb3JhdG9yXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIlByb3BlcnR5XCIpXG4gICAgICAgIC5maWVsZChcImRlY29yYXRvcnNcIiwgb3IoW2RlZihcIkRlY29yYXRvclwiKV0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIk1ldGhvZERlZmluaXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwiZGVjb3JhdG9yc1wiLCBvcihbZGVmKFwiRGVjb3JhdG9yXCIpXSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiTWV0YVByb3BlcnR5XCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwibWV0YVwiLCBcInByb3BlcnR5XCIpXG4gICAgICAgIC5maWVsZChcIm1ldGFcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydHlcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiUGFyZW50aGVzaXplZEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25cIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiSW1wb3J0U3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJpbXBvcnRlZFwiLCBcImxvY2FsXCIpXG4gICAgICAgIC5maWVsZChcImltcG9ydGVkXCIsIGRlZihcIklkZW50aWZpZXJcIikpO1xuICAgIGRlZihcIkltcG9ydERlZmF1bHRTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiTW9kdWxlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5idWlsZChcImxvY2FsXCIpO1xuICAgIGRlZihcIkltcG9ydE5hbWVzcGFjZVNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJNb2R1bGVTcGVjaWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwibG9jYWxcIik7XG4gICAgZGVmKFwiRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcImRlY2xhcmF0aW9uXCIsIG9yKGRlZihcIkRlY2xhcmF0aW9uXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSk7XG4gICAgZGVmKFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJkZWNsYXJhdGlvblwiLCBcInNwZWNpZmllcnNcIiwgXCJzb3VyY2VcIilcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyYXRpb25cIiwgb3IoZGVmKFwiRGVjbGFyYXRpb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJzcGVjaWZpZXJzXCIsIFtkZWYoXCJFeHBvcnRTcGVjaWZpZXJcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiRXhwb3J0U3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJsb2NhbFwiLCBcImV4cG9ydGVkXCIpXG4gICAgICAgIC5maWVsZChcImV4cG9ydGVkXCIsIGRlZihcIklkZW50aWZpZXJcIikpO1xuICAgIGRlZihcIkV4cG9ydE5hbWVzcGFjZVNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJTcGVjaWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwb3J0ZWRcIilcbiAgICAgICAgLmZpZWxkKFwiZXhwb3J0ZWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiRXhwb3J0RGVmYXVsdFNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJTcGVjaWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwb3J0ZWRcIilcbiAgICAgICAgLmZpZWxkKFwiZXhwb3J0ZWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiRXhwb3J0QWxsRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwb3J0ZWRcIiwgXCJzb3VyY2VcIilcbiAgICAgICAgLmZpZWxkKFwiZXhwb3J0ZWRcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInNvdXJjZVwiLCBkZWYoXCJMaXRlcmFsXCIpKTtcbiAgICBkZWYoXCJDb21tZW50QmxvY2tcIilcbiAgICAgICAgLmJhc2VzKFwiQ29tbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCAvKm9wdGlvbmFsOiovIFwibGVhZGluZ1wiLCBcInRyYWlsaW5nXCIpO1xuICAgIGRlZihcIkNvbW1lbnRMaW5lXCIpXG4gICAgICAgIC5iYXNlcyhcIkNvbW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIiwgLypvcHRpb25hbDoqLyBcImxlYWRpbmdcIiwgXCJ0cmFpbGluZ1wiKTtcbiAgICBkZWYoXCJEaXJlY3RpdmVcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJEaXJlY3RpdmVMaXRlcmFsXCIpKTtcbiAgICBkZWYoXCJEaXJlY3RpdmVMaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIiwgXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIFN0cmluZywgZGVmYXVsdHNbXCJ1c2Ugc3RyaWN0XCJdKTtcbiAgICBkZWYoXCJJbnRlcnByZXRlckRpcmVjdGl2ZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIFN0cmluZyk7XG4gICAgZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbZGVmKFwiU3RhdGVtZW50XCIpXSlcbiAgICAgICAgLmZpZWxkKFwiZGlyZWN0aXZlc1wiLCBbZGVmKFwiRGlyZWN0aXZlXCIpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSk7XG4gICAgZGVmKFwiUHJvZ3JhbVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbZGVmKFwiU3RhdGVtZW50XCIpXSlcbiAgICAgICAgLmZpZWxkKFwiZGlyZWN0aXZlc1wiLCBbZGVmKFwiRGlyZWN0aXZlXCIpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwiaW50ZXJwcmV0ZXJcIiwgb3IoZGVmKFwiSW50ZXJwcmV0ZXJEaXJlY3RpdmVcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIC8vIFNwbGl0IExpdGVyYWxcbiAgICBkZWYoXCJTdHJpbmdMaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIkxpdGVyYWxcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJOdW1lcmljTGl0ZXJhbFwiKVxuICAgICAgICAuYmFzZXMoXCJMaXRlcmFsXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIE51bWJlcilcbiAgICAgICAgLmZpZWxkKFwicmF3XCIsIG9yKFN0cmluZywgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiZXh0cmFcIiwge1xuICAgICAgICByYXdWYWx1ZTogTnVtYmVyLFxuICAgICAgICByYXc6IFN0cmluZ1xuICAgIH0sIGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYXdWYWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgICAgICAgIHJhdzogdGhpcy52YWx1ZSArIFwiXCJcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBkZWYoXCJCaWdJbnRMaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIkxpdGVyYWxcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLy8gT25seSBTdHJpbmcgcmVhbGx5IHNlZW1zIGFwcHJvcHJpYXRlIGhlcmUsIHNpbmNlIEJpZ0ludCB2YWx1ZXNcbiAgICAgICAgLy8gb2Z0ZW4gZXhjZWVkIHRoZSBsaW1pdHMgb2YgSlMgbnVtYmVycy5cbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgb3IoU3RyaW5nLCBOdW1iZXIpKVxuICAgICAgICAuZmllbGQoXCJleHRyYVwiLCB7XG4gICAgICAgIHJhd1ZhbHVlOiBTdHJpbmcsXG4gICAgICAgIHJhdzogU3RyaW5nXG4gICAgfSwgZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhd1ZhbHVlOiBTdHJpbmcodGhpcy52YWx1ZSksXG4gICAgICAgICAgICByYXc6IHRoaXMudmFsdWUgKyBcIm5cIlxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGRlZihcIk51bGxMaXRlcmFsXCIpXG4gICAgICAgIC5iYXNlcyhcIkxpdGVyYWxcIilcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgbnVsbCwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJCb29sZWFuTGl0ZXJhbFwiKVxuICAgICAgICAuYmFzZXMoXCJMaXRlcmFsXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIEJvb2xlYW4pO1xuICAgIGRlZihcIlJlZ0V4cExpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiTGl0ZXJhbFwiKVxuICAgICAgICAuYnVpbGQoXCJwYXR0ZXJuXCIsIFwiZmxhZ3NcIilcbiAgICAgICAgLmZpZWxkKFwicGF0dGVyblwiLCBTdHJpbmcpXG4gICAgICAgIC5maWVsZChcImZsYWdzXCIsIFN0cmluZylcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgUmVnRXhwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHRoaXMucGF0dGVybiwgdGhpcy5mbGFncyk7XG4gICAgfSk7XG4gICAgdmFyIE9iamVjdEV4cHJlc3Npb25Qcm9wZXJ0eSA9IG9yKGRlZihcIlByb3BlcnR5XCIpLCBkZWYoXCJPYmplY3RNZXRob2RcIiksIGRlZihcIk9iamVjdFByb3BlcnR5XCIpLCBkZWYoXCJTcHJlYWRQcm9wZXJ0eVwiKSwgZGVmKFwiU3ByZWFkRWxlbWVudFwiKSk7XG4gICAgLy8gU3BsaXQgUHJvcGVydHkgLT4gT2JqZWN0UHJvcGVydHkgYW5kIE9iamVjdE1ldGhvZFxuICAgIGRlZihcIk9iamVjdEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJwcm9wZXJ0aWVzXCIpXG4gICAgICAgIC5maWVsZChcInByb3BlcnRpZXNcIiwgW09iamVjdEV4cHJlc3Npb25Qcm9wZXJ0eV0pO1xuICAgIC8vIE9iamVjdE1ldGhvZCBob2lzdCAudmFsdWUgcHJvcGVydGllcyB0byBvd24gcHJvcGVydGllc1xuICAgIGRlZihcIk9iamVjdE1ldGhvZFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIsIFwiRnVuY3Rpb25cIilcbiAgICAgICAgLmJ1aWxkKFwia2luZFwiLCBcImtleVwiLCBcInBhcmFtc1wiLCBcImJvZHlcIiwgXCJjb21wdXRlZFwiKVxuICAgICAgICAuZmllbGQoXCJraW5kXCIsIG9yKFwibWV0aG9kXCIsIFwiZ2V0XCIsIFwic2V0XCIpKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInBhcmFtc1wiLCBbZGVmKFwiUGF0dGVyblwiKV0pXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIikpXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImdlbmVyYXRvclwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJhc3luY1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJhY2Nlc3NpYmlsaXR5XCIsIC8vIFR5cGVTY3JpcHRcbiAgICBvcihkZWYoXCJMaXRlcmFsXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJkZWNvcmF0b3JzXCIsIG9yKFtkZWYoXCJEZWNvcmF0b3JcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJPYmplY3RQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImtleVwiLCBcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSlcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgZGVmKFwiUGF0dGVyblwiKSkpXG4gICAgICAgIC5maWVsZChcImFjY2Vzc2liaWxpdHlcIiwgLy8gVHlwZVNjcmlwdFxuICAgIG9yKGRlZihcIkxpdGVyYWxcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIHZhciBDbGFzc0JvZHlFbGVtZW50ID0gb3IoZGVmKFwiTWV0aG9kRGVmaW5pdGlvblwiKSwgZGVmKFwiVmFyaWFibGVEZWNsYXJhdG9yXCIpLCBkZWYoXCJDbGFzc1Byb3BlcnR5RGVmaW5pdGlvblwiKSwgZGVmKFwiQ2xhc3NQcm9wZXJ0eVwiKSwgZGVmKFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIiksIGRlZihcIkNsYXNzTWV0aG9kXCIpLCBkZWYoXCJDbGFzc1ByaXZhdGVNZXRob2RcIikpO1xuICAgIC8vIE1ldGhvZERlZmluaXRpb24gLT4gQ2xhc3NNZXRob2RcbiAgICBkZWYoXCJDbGFzc0JvZHlcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIFtDbGFzc0JvZHlFbGVtZW50XSk7XG4gICAgZGVmKFwiQ2xhc3NNZXRob2RcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJGdW5jdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJraW5kXCIsIFwia2V5XCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcImNvbXB1dGVkXCIsIFwic3RhdGljXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpKSk7XG4gICAgZGVmKFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiRnVuY3Rpb25cIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcImtpbmRcIiwgXCJjb21wdXRlZFwiLCBcInN0YXRpY1wiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgZGVmKFwiUHJpdmF0ZU5hbWVcIikpO1xuICAgIFtcIkNsYXNzTWV0aG9kXCIsXG4gICAgICAgIFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIsXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlTmFtZSkge1xuICAgICAgICBkZWYodHlwZU5hbWUpXG4gICAgICAgICAgICAuZmllbGQoXCJraW5kXCIsIG9yKFwiZ2V0XCIsIFwic2V0XCIsIFwibWV0aG9kXCIsIFwiY29uc3RydWN0b3JcIiksIGZ1bmN0aW9uICgpIHsgcmV0dXJuIFwibWV0aG9kXCI7IH0pXG4gICAgICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkJsb2NrU3RhdGVtZW50XCIpKVxuICAgICAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgICAgIC5maWVsZChcInN0YXRpY1wiLCBvcihCb29sZWFuLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwiYWJzdHJhY3RcIiwgb3IoQm9vbGVhbiwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgICAgIC5maWVsZChcImFjY2Vzc1wiLCBvcihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgICAgIC5maWVsZChcImFjY2Vzc2liaWxpdHlcIiwgb3IoXCJwdWJsaWNcIiwgXCJwcml2YXRlXCIsIFwicHJvdGVjdGVkXCIsIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgICAgICAuZmllbGQoXCJkZWNvcmF0b3JzXCIsIG9yKFtkZWYoXCJEZWNvcmF0b3JcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgb3IoQm9vbGVhbiwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgfSk7XG4gICAgZGVmKFwiQ2xhc3NQcml2YXRlUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiQ2xhc3NQcm9wZXJ0eVwiKVxuICAgICAgICAuYnVpbGQoXCJrZXlcIiwgXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgZGVmKFwiUHJpdmF0ZU5hbWVcIikpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlByaXZhdGVOYW1lXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIiwgXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpO1xuICAgIHZhciBPYmplY3RQYXR0ZXJuUHJvcGVydHkgPSBvcihkZWYoXCJQcm9wZXJ0eVwiKSwgZGVmKFwiUHJvcGVydHlQYXR0ZXJuXCIpLCBkZWYoXCJTcHJlYWRQcm9wZXJ0eVBhdHRlcm5cIiksIGRlZihcIlNwcmVhZFByb3BlcnR5XCIpLCAvLyBVc2VkIGJ5IEVzcHJpbWFcbiAgICBkZWYoXCJPYmplY3RQcm9wZXJ0eVwiKSwgLy8gQmFiZWwgNlxuICAgIGRlZihcIlJlc3RQcm9wZXJ0eVwiKSAvLyBCYWJlbCA2XG4gICAgKTtcbiAgICAvLyBTcGxpdCBpbnRvIFJlc3RQcm9wZXJ0eSBhbmQgU3ByZWFkUHJvcGVydHlcbiAgICBkZWYoXCJPYmplY3RQYXR0ZXJuXCIpXG4gICAgICAgIC5iYXNlcyhcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwicHJvcGVydGllc1wiKVxuICAgICAgICAuZmllbGQoXCJwcm9wZXJ0aWVzXCIsIFtPYmplY3RQYXR0ZXJuUHJvcGVydHldKVxuICAgICAgICAuZmllbGQoXCJkZWNvcmF0b3JzXCIsIG9yKFtkZWYoXCJEZWNvcmF0b3JcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJTcHJlYWRQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIlJlc3RQcm9wZXJ0eVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIkZvckF3YWl0U3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgb3IoZGVmKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInJpZ2h0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiU3RhdGVtZW50XCIpKTtcbiAgICAvLyBUaGUgY2FsbGVlIG5vZGUgb2YgYSBkeW5hbWljIGltcG9ydCguLi4pIGV4cHJlc3Npb24uXG4gICAgZGVmKFwiSW1wb3J0XCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKCk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgYmFiZWxfY29yZV8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vYmFiZWwtY29yZVwiKSk7XG52YXIgZmxvd18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZmxvd1wiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIGZvcmsudXNlKGJhYmVsX2NvcmVfMS5kZWZhdWx0KTtcbiAgICBmb3JrLnVzZShmbG93XzEuZGVmYXVsdCk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xudmFyIHNoYXJlZF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi9zaGFyZWRcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBUeXBlID0gdHlwZXMuVHlwZTtcbiAgICB2YXIgZGVmID0gVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gVHlwZS5vcjtcbiAgICB2YXIgc2hhcmVkID0gZm9yay51c2Uoc2hhcmVkXzEuZGVmYXVsdCk7XG4gICAgdmFyIGRlZmF1bHRzID0gc2hhcmVkLmRlZmF1bHRzO1xuICAgIHZhciBnZXEgPSBzaGFyZWQuZ2VxO1xuICAgIC8vIEFic3RyYWN0IHN1cGVydHlwZSBvZiBhbGwgc3ludGFjdGljIGVudGl0aWVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gaGF2ZSBhXG4gICAgLy8gLmxvYyBmaWVsZC5cbiAgICBkZWYoXCJQcmludGFibGVcIilcbiAgICAgICAgLmZpZWxkKFwibG9jXCIsIG9yKGRlZihcIlNvdXJjZUxvY2F0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdLCB0cnVlKTtcbiAgICBkZWYoXCJOb2RlXCIpXG4gICAgICAgIC5iYXNlcyhcIlByaW50YWJsZVwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlXCIsIFN0cmluZylcbiAgICAgICAgLmZpZWxkKFwiY29tbWVudHNcIiwgb3IoW2RlZihcIkNvbW1lbnRcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdLCB0cnVlKTtcbiAgICBkZWYoXCJTb3VyY2VMb2NhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJzdGFydFwiLCBkZWYoXCJQb3NpdGlvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiZW5kXCIsIGRlZihcIlBvc2l0aW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgb3IoU3RyaW5nLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJQb3NpdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJsaW5lXCIsIGdlcSgxKSlcbiAgICAgICAgLmZpZWxkKFwiY29sdW1uXCIsIGdlcSgwKSk7XG4gICAgZGVmKFwiRmlsZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInByb2dyYW1cIiwgXCJuYW1lXCIpXG4gICAgICAgIC5maWVsZChcInByb2dyYW1cIiwgZGVmKFwiUHJvZ3JhbVwiKSlcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBvcihTdHJpbmcsIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlByb2dyYW1cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgW2RlZihcIlN0YXRlbWVudFwiKV0pO1xuICAgIGRlZihcIkZ1bmN0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJQYXR0ZXJuXCIpXSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJCbG9ja1N0YXRlbWVudFwiKSlcbiAgICAgICAgLmZpZWxkKFwiZ2VuZXJhdG9yXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImFzeW5jXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIlN0YXRlbWVudFwiKS5iYXNlcyhcIk5vZGVcIik7XG4gICAgLy8gVGhlIGVtcHR5IC5idWlsZCgpIGhlcmUgbWVhbnMgdGhhdCBhbiBFbXB0eVN0YXRlbWVudCBjYW4gYmUgY29uc3RydWN0ZWRcbiAgICAvLyAoaS5lLiBpdCdzIG5vdCBhYnN0cmFjdCkgYnV0IHRoYXQgaXQgbmVlZHMgbm8gYXJndW1lbnRzLlxuICAgIGRlZihcIkVtcHR5U3RhdGVtZW50XCIpLmJhc2VzKFwiU3RhdGVtZW50XCIpLmJ1aWxkKCk7XG4gICAgZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbZGVmKFwiU3RhdGVtZW50XCIpXSk7XG4gICAgLy8gVE9ETyBGaWd1cmUgb3V0IGhvdyB0byBzaWxlbnRseSBjb2VyY2UgRXhwcmVzc2lvbnMgdG9cbiAgICAvLyBFeHByZXNzaW9uU3RhdGVtZW50cyB3aGVyZSBhIFN0YXRlbWVudCB3YXMgZXhwZWN0ZWQuXG4gICAgZGVmKFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIklmU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJ0ZXN0XCIsIFwiY29uc2VxdWVudFwiLCBcImFsdGVybmF0ZVwiKVxuICAgICAgICAuZmllbGQoXCJ0ZXN0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImNvbnNlcXVlbnRcIiwgZGVmKFwiU3RhdGVtZW50XCIpKVxuICAgICAgICAuZmllbGQoXCJhbHRlcm5hdGVcIiwgb3IoZGVmKFwiU3RhdGVtZW50XCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJMYWJlbGVkU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJsYWJlbFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwibGFiZWxcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIGRlZihcIkJyZWFrU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJsYWJlbFwiKVxuICAgICAgICAuZmllbGQoXCJsYWJlbFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJDb250aW51ZVN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwibGFiZWxcIilcbiAgICAgICAgLmZpZWxkKFwibGFiZWxcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiV2l0aFN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwib2JqZWN0XCIsIFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJvYmplY3RcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIGRlZihcIlN3aXRjaFN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiZGlzY3JpbWluYW50XCIsIFwiY2FzZXNcIiwgXCJsZXhpY2FsXCIpXG4gICAgICAgIC5maWVsZChcImRpc2NyaW1pbmFudFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJjYXNlc1wiLCBbZGVmKFwiU3dpdGNoQ2FzZVwiKV0pXG4gICAgICAgIC5maWVsZChcImxleGljYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiUmV0dXJuU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSk7XG4gICAgZGVmKFwiVGhyb3dTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIlRyeVN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiYmxvY2tcIiwgXCJoYW5kbGVyXCIsIFwiZmluYWxpemVyXCIpXG4gICAgICAgIC5maWVsZChcImJsb2NrXCIsIGRlZihcIkJsb2NrU3RhdGVtZW50XCIpKVxuICAgICAgICAuZmllbGQoXCJoYW5kbGVyXCIsIG9yKGRlZihcIkNhdGNoQ2xhdXNlXCIpLCBudWxsKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycyAmJiB0aGlzLmhhbmRsZXJzWzBdIHx8IG51bGw7XG4gICAgfSlcbiAgICAgICAgLmZpZWxkKFwiaGFuZGxlcnNcIiwgW2RlZihcIkNhdGNoQ2xhdXNlXCIpXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyID8gW3RoaXMuaGFuZGxlcl0gOiBbXTtcbiAgICB9LCB0cnVlKSAvLyBJbmRpY2F0ZXMgdGhpcyBmaWVsZCBpcyBoaWRkZW4gZnJvbSBlYWNoRmllbGQgaXRlcmF0aW9uLlxuICAgICAgICAuZmllbGQoXCJndWFyZGVkSGFuZGxlcnNcIiwgW2RlZihcIkNhdGNoQ2xhdXNlXCIpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwiZmluYWxpemVyXCIsIG9yKGRlZihcIkJsb2NrU3RhdGVtZW50XCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJDYXRjaENsYXVzZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtXCIsIFwiZ3VhcmRcIiwgXCJib2R5XCIpXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9wdGlvbmFsLWNhdGNoLWJpbmRpbmdcbiAgICAgICAgLmZpZWxkKFwicGFyYW1cIiwgb3IoZGVmKFwiUGF0dGVyblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiZ3VhcmRcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJCbG9ja1N0YXRlbWVudFwiKSk7XG4gICAgZGVmKFwiV2hpbGVTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcInRlc3RcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcInRlc3RcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIGRlZihcIkRvV2hpbGVTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIiwgXCJ0ZXN0XCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiU3RhdGVtZW50XCIpKVxuICAgICAgICAuZmllbGQoXCJ0ZXN0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIkZvclN0YXRlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiaW5pdFwiLCBcInRlc3RcIiwgXCJ1cGRhdGVcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImluaXRcIiwgb3IoZGVmKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInRlc3RcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInVwZGF0ZVwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJTdGF0ZW1lbnRcIikpO1xuICAgIGRlZihcIkZvckluU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgb3IoZGVmKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInJpZ2h0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiU3RhdGVtZW50XCIpKTtcbiAgICBkZWYoXCJEZWJ1Z2dlclN0YXRlbWVudFwiKS5iYXNlcyhcIlN0YXRlbWVudFwiKS5idWlsZCgpO1xuICAgIGRlZihcIkRlY2xhcmF0aW9uXCIpLmJhc2VzKFwiU3RhdGVtZW50XCIpO1xuICAgIGRlZihcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRnVuY3Rpb25cIiwgXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInBhcmFtc1wiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiRnVuY3Rpb25FeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZ1bmN0aW9uXCIsIFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInBhcmFtc1wiLCBcImJvZHlcIik7XG4gICAgZGVmKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJraW5kXCIsIFwiZGVjbGFyYXRpb25zXCIpXG4gICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJ2YXJcIiwgXCJsZXRcIiwgXCJjb25zdFwiKSlcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyYXRpb25zXCIsIFtkZWYoXCJWYXJpYWJsZURlY2xhcmF0b3JcIildKTtcbiAgICBkZWYoXCJWYXJpYWJsZURlY2xhcmF0b3JcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImluaXRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiUGF0dGVyblwiKSlcbiAgICAgICAgLmZpZWxkKFwiaW5pdFwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJFeHByZXNzaW9uXCIpLmJhc2VzKFwiTm9kZVwiKTtcbiAgICBkZWYoXCJUaGlzRXhwcmVzc2lvblwiKS5iYXNlcyhcIkV4cHJlc3Npb25cIikuYnVpbGQoKTtcbiAgICBkZWYoXCJBcnJheUV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJlbGVtZW50c1wiKVxuICAgICAgICAuZmllbGQoXCJlbGVtZW50c1wiLCBbb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCldKTtcbiAgICBkZWYoXCJPYmplY3RFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwicHJvcGVydGllc1wiKVxuICAgICAgICAuZmllbGQoXCJwcm9wZXJ0aWVzXCIsIFtkZWYoXCJQcm9wZXJ0eVwiKV0pO1xuICAgIC8vIFRPRE8gTm90IGluIHRoZSBNb3ppbGxhIFBhcnNlciBBUEksIGJ1dCB1c2VkIGJ5IEVzcHJpbWEuXG4gICAgZGVmKFwiUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKSAvLyBXYW50IHRvIGJlIGFibGUgdG8gdmlzaXQgUHJvcGVydHkgTm9kZXMuXG4gICAgICAgIC5idWlsZChcImtpbmRcIiwgXCJrZXlcIiwgXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJraW5kXCIsIG9yKFwiaW5pdFwiLCBcImdldFwiLCBcInNldFwiKSlcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIGRlZihcIklkZW50aWZpZXJcIikpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJTZXF1ZW5jZUV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uc1wiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uc1wiLCBbZGVmKFwiRXhwcmVzc2lvblwiKV0pO1xuICAgIHZhciBVbmFyeU9wZXJhdG9yID0gb3IoXCItXCIsIFwiK1wiLCBcIiFcIiwgXCJ+XCIsIFwidHlwZW9mXCIsIFwidm9pZFwiLCBcImRlbGV0ZVwiKTtcbiAgICBkZWYoXCJVbmFyeUV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvcGVyYXRvclwiLCBcImFyZ3VtZW50XCIsIFwicHJlZml4XCIpXG4gICAgICAgIC5maWVsZChcIm9wZXJhdG9yXCIsIFVuYXJ5T3BlcmF0b3IpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC8vIEVzcHJpbWEgZG9lc24ndCBib3RoZXIgd2l0aCB0aGlzIGZpZWxkLCBwcmVzdW1hYmx5IGJlY2F1c2UgaXQnc1xuICAgICAgICAvLyBhbHdheXMgdHJ1ZSBmb3IgdW5hcnkgb3BlcmF0b3JzLlxuICAgICAgICAuZmllbGQoXCJwcmVmaXhcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJ0cnVlXCJdKTtcbiAgICB2YXIgQmluYXJ5T3BlcmF0b3IgPSBvcihcIj09XCIsIFwiIT1cIiwgXCI9PT1cIiwgXCIhPT1cIiwgXCI8XCIsIFwiPD1cIiwgXCI+XCIsIFwiPj1cIiwgXCI8PFwiLCBcIj4+XCIsIFwiPj4+XCIsIFwiK1wiLCBcIi1cIiwgXCIqXCIsIFwiL1wiLCBcIiVcIiwgXCIqKlwiLCBcIiZcIiwgLy8gVE9ETyBNaXNzaW5nIGZyb20gdGhlIFBhcnNlciBBUEkuXG4gICAgXCJ8XCIsIFwiXlwiLCBcImluXCIsIFwiaW5zdGFuY2VvZlwiKTtcbiAgICBkZWYoXCJCaW5hcnlFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwib3BlcmF0b3JcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgQmluYXJ5T3BlcmF0b3IpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgdmFyIEFzc2lnbm1lbnRPcGVyYXRvciA9IG9yKFwiPVwiLCBcIis9XCIsIFwiLT1cIiwgXCIqPVwiLCBcIi89XCIsIFwiJT1cIiwgXCI8PD1cIiwgXCI+Pj1cIiwgXCI+Pj49XCIsIFwifD1cIiwgXCJePVwiLCBcIiY9XCIpO1xuICAgIGRlZihcIkFzc2lnbm1lbnRFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwib3BlcmF0b3JcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgQXNzaWdubWVudE9wZXJhdG9yKVxuICAgICAgICAuZmllbGQoXCJsZWZ0XCIsIG9yKGRlZihcIlBhdHRlcm5cIiksIGRlZihcIk1lbWJlckV4cHJlc3Npb25cIikpKVxuICAgICAgICAuZmllbGQoXCJyaWdodFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICB2YXIgVXBkYXRlT3BlcmF0b3IgPSBvcihcIisrXCIsIFwiLS1cIik7XG4gICAgZGVmKFwiVXBkYXRlRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9wZXJhdG9yXCIsIFwiYXJndW1lbnRcIiwgXCJwcmVmaXhcIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgVXBkYXRlT3BlcmF0b3IpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInByZWZpeFwiLCBCb29sZWFuKTtcbiAgICB2YXIgTG9naWNhbE9wZXJhdG9yID0gb3IoXCJ8fFwiLCBcIiYmXCIpO1xuICAgIGRlZihcIkxvZ2ljYWxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwib3BlcmF0b3JcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIilcbiAgICAgICAgLmZpZWxkKFwib3BlcmF0b3JcIiwgTG9naWNhbE9wZXJhdG9yKVxuICAgICAgICAuZmllbGQoXCJsZWZ0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInJpZ2h0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInRlc3RcIiwgXCJjb25zZXF1ZW50XCIsIFwiYWx0ZXJuYXRlXCIpXG4gICAgICAgIC5maWVsZChcInRlc3RcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29uc2VxdWVudFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJhbHRlcm5hdGVcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiTmV3RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImNhbGxlZVwiLCBcImFyZ3VtZW50c1wiKVxuICAgICAgICAuZmllbGQoXCJjYWxsZWVcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLy8gVGhlIE1vemlsbGEgUGFyc2VyIEFQSSBnaXZlcyB0aGlzIHR5cGUgYXMgW29yKGRlZihcIkV4cHJlc3Npb25cIiksXG4gICAgICAgIC8vIG51bGwpXSwgYnV0IG51bGwgdmFsdWVzIGRvbid0IHJlYWxseSBtYWtlIHNlbnNlIGF0IHRoZSBjYWxsIHNpdGUuXG4gICAgICAgIC8vIFRPRE8gUmVwb3J0IHRoaXMgbm9uc2Vuc2UuXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50c1wiLCBbZGVmKFwiRXhwcmVzc2lvblwiKV0pO1xuICAgIGRlZihcIkNhbGxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiY2FsbGVlXCIsIFwiYXJndW1lbnRzXCIpXG4gICAgICAgIC5maWVsZChcImNhbGxlZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAvLyBTZWUgY29tbWVudCBmb3IgTmV3RXhwcmVzc2lvbiBhYm92ZS5cbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRzXCIsIFtkZWYoXCJFeHByZXNzaW9uXCIpXSk7XG4gICAgZGVmKFwiTWVtYmVyRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9iamVjdFwiLCBcInByb3BlcnR5XCIsIFwiY29tcHV0ZWRcIilcbiAgICAgICAgLmZpZWxkKFwib2JqZWN0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcInByb3BlcnR5XCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIkV4cHJlc3Npb25cIikpKVxuICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0eXBlID0gdGhpcy5wcm9wZXJ0eS50eXBlO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ0xpdGVyYWwnIHx8XG4gICAgICAgICAgICB0eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicgfHxcbiAgICAgICAgICAgIHR5cGUgPT09ICdCaW5hcnlFeHByZXNzaW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIGRlZihcIlBhdHRlcm5cIikuYmFzZXMoXCJOb2RlXCIpO1xuICAgIGRlZihcIlN3aXRjaENhc2VcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJ0ZXN0XCIsIFwiY29uc2VxdWVudFwiKVxuICAgICAgICAuZmllbGQoXCJ0ZXN0XCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJjb25zZXF1ZW50XCIsIFtkZWYoXCJTdGF0ZW1lbnRcIildKTtcbiAgICBkZWYoXCJJZGVudGlmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIiwgXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcIm5hbWVcIilcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBTdHJpbmcpXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIkxpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBvcihTdHJpbmcsIEJvb2xlYW4sIG51bGwsIE51bWJlciwgUmVnRXhwKSlcbiAgICAgICAgLmZpZWxkKFwicmVnZXhcIiwgb3Ioe1xuICAgICAgICBwYXR0ZXJuOiBTdHJpbmcsXG4gICAgICAgIGZsYWdzOiBTdHJpbmdcbiAgICB9LCBudWxsKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgdmFyIGZsYWdzID0gXCJcIjtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLmlnbm9yZUNhc2UpXG4gICAgICAgICAgICAgICAgZmxhZ3MgKz0gXCJpXCI7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZS5tdWx0aWxpbmUpXG4gICAgICAgICAgICAgICAgZmxhZ3MgKz0gXCJtXCI7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZS5nbG9iYWwpXG4gICAgICAgICAgICAgICAgZmxhZ3MgKz0gXCJnXCI7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHBhdHRlcm46IHRoaXMudmFsdWUuc291cmNlLFxuICAgICAgICAgICAgICAgIGZsYWdzOiBmbGFnc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICAvLyBBYnN0cmFjdCAobm9uLWJ1aWxkYWJsZSkgY29tbWVudCBzdXBlcnR5cGUuIE5vdCBhIE5vZGUuXG4gICAgZGVmKFwiQ29tbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJQcmludGFibGVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgU3RyaW5nKVxuICAgICAgICAvLyBBIC5sZWFkaW5nIGNvbW1lbnQgY29tZXMgYmVmb3JlIHRoZSBub2RlLCB3aGVyZWFzIGEgLnRyYWlsaW5nXG4gICAgICAgIC8vIGNvbW1lbnQgY29tZXMgYWZ0ZXIgaXQuIFRoZXNlIHR3byBmaWVsZHMgc2hvdWxkIG5vdCBib3RoIGJlIHRydWUsXG4gICAgICAgIC8vIGJ1dCB0aGV5IG1pZ2h0IGJvdGggYmUgZmFsc2Ugd2hlbiB0aGUgY29tbWVudCBmYWxscyBpbnNpZGUgYSBub2RlXG4gICAgICAgIC8vIGFuZCB0aGUgbm9kZSBoYXMgbm8gY2hpbGRyZW4gZm9yIHRoZSBjb21tZW50IHRvIGxlYWQgb3IgdHJhaWwsXG4gICAgICAgIC8vIGUuZy4geyAvKmRhbmdsaW5nKi8gfS5cbiAgICAgICAgLmZpZWxkKFwibGVhZGluZ1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcInRydWVcIl0pXG4gICAgICAgIC5maWVsZChcInRyYWlsaW5nXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3R5cGVzXCIpKTtcbnZhciBzaGFyZWRfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvc2hhcmVkXCIpKTtcbnZhciBjb3JlXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9jb3JlXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoY29yZV8xLmRlZmF1bHQpO1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIFR5cGUgPSB0eXBlcy5UeXBlO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICB2YXIgb3IgPSBUeXBlLm9yO1xuICAgIHZhciBzaGFyZWQgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmYXVsdHMgPSBzaGFyZWQuZGVmYXVsdHM7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb3B0aW9uYWwtY2hhaW5pbmdcbiAgICAvLyBgYT8uYmAgYXMgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9lc3RyZWUvZXN0cmVlL2lzc3Vlcy8xNDZcbiAgICBkZWYoXCJPcHRpb25hbE1lbWJlckV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiTWVtYmVyRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvYmplY3RcIiwgXCJwcm9wZXJ0eVwiLCBcImNvbXB1dGVkXCIsIFwib3B0aW9uYWxcIilcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJ0cnVlXCJdKTtcbiAgICAvLyBhPy5iKClcbiAgICBkZWYoXCJPcHRpb25hbENhbGxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkNhbGxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImNhbGxlZVwiLCBcImFyZ3VtZW50c1wiLCBcIm9wdGlvbmFsXCIpXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1widHJ1ZVwiXSk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgLy8gYGEgPz8gYmAgYXMgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJ5bG9uL3B1bGwvNzYxL2ZpbGVzXG4gICAgdmFyIExvZ2ljYWxPcGVyYXRvciA9IG9yKFwifHxcIiwgXCImJlwiLCBcIj8/XCIpO1xuICAgIGRlZihcIkxvZ2ljYWxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcIm9wZXJhdG9yXCIsIExvZ2ljYWxPcGVyYXRvcik7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgZXM3XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9lczdcIikpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3R5cGVzXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgZm9yay51c2UoZXM3XzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgZGVmKFwiSW1wb3J0RXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInNvdXJjZVwiKVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgY29yZV8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vY29yZVwiKSk7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xudmFyIHNoYXJlZF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi9zaGFyZWRcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICBmb3JrLnVzZShjb3JlXzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICBkZWYoXCJGdW5jdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJnZW5lcmF0b3JcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJkZWZhdWx0c1wiLCBbb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCldLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAvLyBUT0RPIFRoaXMgY291bGQgYmUgcmVwcmVzZW50ZWQgYXMgYSBSZXN0RWxlbWVudCBpbiAucGFyYW1zLlxuICAgICAgICAuZmllbGQoXCJyZXN0XCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIC8vIFRoZSBFU1RyZWUgd2F5IG9mIHJlcHJlc2VudGluZyBhIC4uLnJlc3QgcGFyYW1ldGVyLlxuICAgIGRlZihcIlJlc3RFbGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwiYXJndW1lbnRcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiUGF0dGVyblwiKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgLy8gZm9yIEJhYnlsb24uIEZsb3cgcGFyc2VyIHB1dHMgaXQgb24gdGhlIGlkZW50aWZpZXJcbiAgICBvcihkZWYoXCJUeXBlQW5ub3RhdGlvblwiKSwgZGVmKFwiVFNUeXBlQW5ub3RhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiU3ByZWFkRWxlbWVudFBhdHRlcm5cIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJQYXR0ZXJuXCIpKTtcbiAgICBkZWYoXCJGdW5jdGlvbkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcImdlbmVyYXRvclwiLCBcImV4cHJlc3Npb25cIik7XG4gICAgZGVmKFwiRnVuY3Rpb25FeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwicGFyYW1zXCIsIFwiYm9keVwiLCBcImdlbmVyYXRvclwiLCBcImV4cHJlc3Npb25cIik7XG4gICAgLy8gVGhlIFBhcnNlciBBUEkgY2FsbHMgdGhpcyBBcnJvd0V4cHJlc3Npb24sIGJ1dCBFc3ByaW1hIGFuZCBhbGwgb3RoZXJcbiAgICAvLyBhY3R1YWwgcGFyc2VycyB1c2UgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24uXG4gICAgZGVmKFwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRnVuY3Rpb25cIiwgXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtc1wiLCBcImJvZHlcIiwgXCJleHByZXNzaW9uXCIpXG4gICAgICAgIC8vIFRoZSBmb3JjZWQgbnVsbCB2YWx1ZSBoZXJlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3ZlcnJpZGRlblxuICAgICAgICAvLyBkZWZpbml0aW9uIG9mIHRoZSBcImlkXCIgZmllbGQgaW4gdGhlIEZ1bmN0aW9uIGludGVyZmFjZS5cbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgbnVsbCwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAvLyBBcnJvdyBmdW5jdGlvbiBib2RpZXMgYXJlIGFsbG93ZWQgdG8gYmUgZXhwcmVzc2lvbnMuXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgb3IoZGVmKFwiQmxvY2tTdGF0ZW1lbnRcIiksIGRlZihcIkV4cHJlc3Npb25cIikpKVxuICAgICAgICAvLyBUaGUgY3VycmVudCBzcGVjIGZvcmJpZHMgYXJyb3cgZ2VuZXJhdG9ycywgc28gSSBoYXZlIHRha2VuIHRoZVxuICAgICAgICAvLyBsaWJlcnR5IG9mIGVuZm9yY2luZyB0aGF0LiBUT0RPIFJlcG9ydCB0aGlzLlxuICAgICAgICAuZmllbGQoXCJnZW5lcmF0b3JcIiwgZmFsc2UsIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIkZvck9mU3RhdGVtZW50XCIpXG4gICAgICAgIC5iYXNlcyhcIlN0YXRlbWVudFwiKVxuICAgICAgICAuYnVpbGQoXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgb3IoZGVmKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSwgZGVmKFwiUGF0dGVyblwiKSkpXG4gICAgICAgIC5maWVsZChcInJpZ2h0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiU3RhdGVtZW50XCIpKTtcbiAgICBkZWYoXCJZaWVsZEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiLCBcImRlbGVnYXRlXCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJkZWxlZ2F0ZVwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJHZW5lcmF0b3JFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiYm9keVwiLCBcImJsb2Nrc1wiLCBcImZpbHRlclwiKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImJsb2Nrc1wiLCBbZGVmKFwiQ29tcHJlaGVuc2lvbkJsb2NrXCIpXSlcbiAgICAgICAgLmZpZWxkKFwiZmlsdGVyXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKTtcbiAgICBkZWYoXCJDb21wcmVoZW5zaW9uRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIiwgXCJibG9ja3NcIiwgXCJmaWx0ZXJcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJibG9ja3NcIiwgW2RlZihcIkNvbXByZWhlbnNpb25CbG9ja1wiKV0pXG4gICAgICAgIC5maWVsZChcImZpbHRlclwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSk7XG4gICAgZGVmKFwiQ29tcHJlaGVuc2lvbkJsb2NrXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwibGVmdFwiLCBcInJpZ2h0XCIsIFwiZWFjaFwiKVxuICAgICAgICAuZmllbGQoXCJsZWZ0XCIsIGRlZihcIlBhdHRlcm5cIikpXG4gICAgICAgIC5maWVsZChcInJpZ2h0XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImVhY2hcIiwgQm9vbGVhbik7XG4gICAgZGVmKFwiUHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIkV4cHJlc3Npb25cIikpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBkZWYoXCJQYXR0ZXJuXCIpKSlcbiAgICAgICAgLmZpZWxkKFwibWV0aG9kXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcInNob3J0aGFuZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJjb21wdXRlZFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJPYmplY3RQcm9wZXJ0eVwiKVxuICAgICAgICAuZmllbGQoXCJzaG9ydGhhbmRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiUHJvcGVydHlQYXR0ZXJuXCIpXG4gICAgICAgIC5iYXNlcyhcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIsIFwicGF0dGVyblwiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInBhdHRlcm5cIiwgZGVmKFwiUGF0dGVyblwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiT2JqZWN0UGF0dGVyblwiKVxuICAgICAgICAuYmFzZXMoXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcInByb3BlcnRpZXNcIilcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydGllc1wiLCBbb3IoZGVmKFwiUHJvcGVydHlQYXR0ZXJuXCIpLCBkZWYoXCJQcm9wZXJ0eVwiKSldKTtcbiAgICBkZWYoXCJBcnJheVBhdHRlcm5cIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJlbGVtZW50c1wiKVxuICAgICAgICAuZmllbGQoXCJlbGVtZW50c1wiLCBbb3IoZGVmKFwiUGF0dGVyblwiKSwgbnVsbCldKTtcbiAgICBkZWYoXCJNZXRob2REZWZpbml0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImtpbmRcIiwgXCJrZXlcIiwgXCJ2YWx1ZVwiLCBcInN0YXRpY1wiKVxuICAgICAgICAuZmllbGQoXCJraW5kXCIsIG9yKFwiY29uc3RydWN0b3JcIiwgXCJtZXRob2RcIiwgXCJnZXRcIiwgXCJzZXRcIikpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJGdW5jdGlvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwic3RhdGljXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIlNwcmVhZEVsZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJBcnJheUV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiZWxlbWVudHNcIiwgW29yKGRlZihcIkV4cHJlc3Npb25cIiksIGRlZihcIlNwcmVhZEVsZW1lbnRcIiksIGRlZihcIlJlc3RFbGVtZW50XCIpLCBudWxsKV0pO1xuICAgIGRlZihcIk5ld0V4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRzXCIsIFtvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBkZWYoXCJTcHJlYWRFbGVtZW50XCIpKV0pO1xuICAgIGRlZihcIkNhbGxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50c1wiLCBbb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgZGVmKFwiU3ByZWFkRWxlbWVudFwiKSldKTtcbiAgICAvLyBOb3RlOiB0aGlzIG5vZGUgdHlwZSBpcyAqbm90KiBhbiBBc3NpZ25tZW50RXhwcmVzc2lvbiB3aXRoIGEgUGF0dGVybiBvblxuICAgIC8vIHRoZSBsZWZ0LWhhbmQgc2lkZSEgVGhlIGV4aXN0aW5nIEFzc2lnbm1lbnRFeHByZXNzaW9uIHR5cGUgYWxyZWFkeVxuICAgIC8vIHN1cHBvcnRzIGRlc3RydWN0dXJpbmcgYXNzaWdubWVudHMuIEFzc2lnbm1lbnRQYXR0ZXJuIG5vZGVzIG1heSBhcHBlYXJcbiAgICAvLyB3aGVyZXZlciBhIFBhdHRlcm4gaXMgYWxsb3dlZCwgYW5kIHRoZSByaWdodC1oYW5kIHNpZGUgcmVwcmVzZW50cyBhXG4gICAgLy8gZGVmYXVsdCB2YWx1ZSB0byBiZSBkZXN0cnVjdHVyZWQgYWdhaW5zdCB0aGUgbGVmdC1oYW5kIHNpZGUsIGlmIG5vXG4gICAgLy8gdmFsdWUgaXMgb3RoZXJ3aXNlIHByb3ZpZGVkLiBGb3IgZXhhbXBsZTogZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzLlxuICAgIGRlZihcIkFzc2lnbm1lbnRQYXR0ZXJuXCIpXG4gICAgICAgIC5iYXNlcyhcIlBhdHRlcm5cIilcbiAgICAgICAgLmJ1aWxkKFwibGVmdFwiLCBcInJpZ2h0XCIpXG4gICAgICAgIC5maWVsZChcImxlZnRcIiwgZGVmKFwiUGF0dGVyblwiKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgdmFyIENsYXNzQm9keUVsZW1lbnQgPSBvcihkZWYoXCJNZXRob2REZWZpbml0aW9uXCIpLCBkZWYoXCJWYXJpYWJsZURlY2xhcmF0b3JcIiksIGRlZihcIkNsYXNzUHJvcGVydHlEZWZpbml0aW9uXCIpLCBkZWYoXCJDbGFzc1Byb3BlcnR5XCIpKTtcbiAgICBkZWYoXCJDbGFzc1Byb3BlcnR5XCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImtleVwiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgb3IoZGVmKFwiTGl0ZXJhbFwiKSwgZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIkNsYXNzUHJvcGVydHlEZWZpbml0aW9uXCIpIC8vIHN0YXRpYyBwcm9wZXJ0eVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJkZWZpbml0aW9uXCIpXG4gICAgICAgIC8vIFllcywgVmlyZ2luaWEsIGNpcmN1bGFyIGRlZmluaXRpb25zIGFyZSBwZXJtaXR0ZWQuXG4gICAgICAgIC5maWVsZChcImRlZmluaXRpb25cIiwgQ2xhc3NCb2R5RWxlbWVudCk7XG4gICAgZGVmKFwiQ2xhc3NCb2R5XCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbQ2xhc3NCb2R5RWxlbWVudF0pO1xuICAgIGRlZihcIkNsYXNzRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJib2R5XCIsIFwic3VwZXJDbGFzc1wiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJDbGFzc0JvZHlcIikpXG4gICAgICAgIC5maWVsZChcInN1cGVyQ2xhc3NcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiQ2xhc3NFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJib2R5XCIsIFwic3VwZXJDbGFzc1wiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJib2R5XCIsIGRlZihcIkNsYXNzQm9keVwiKSlcbiAgICAgICAgLmZpZWxkKFwic3VwZXJDbGFzc1wiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICAvLyBTcGVjaWZpZXIgYW5kIE1vZHVsZVNwZWNpZmllciBhcmUgYWJzdHJhY3Qgbm9uLXN0YW5kYXJkIHR5cGVzXG4gICAgLy8gaW50cm9kdWNlZCBmb3IgZGVmaW5pdGlvbmFsIGNvbnZlbmllbmNlLlxuICAgIGRlZihcIlNwZWNpZmllclwiKS5iYXNlcyhcIk5vZGVcIik7XG4gICAgLy8gVGhpcyBzdXBlcnR5cGUgaXMgc2hhcmVkL2FidXNlZCBieSBib3RoIGRlZi9iYWJlbC5qcyBhbmRcbiAgICAvLyBkZWYvZXNwcmltYS5qcy4gSW4gdGhlIGZ1dHVyZSwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBsb2FkIG9ubHkgb25lIHNldFxuICAgIC8vIG9mIGRlZmluaXRpb25zIGFwcHJvcHJpYXRlIGZvciBhIGdpdmVuIHBhcnNlciwgYnV0IHVudGlsIHRoZW4gd2UgbXVzdFxuICAgIC8vIHJlbHkgb24gZGVmYXVsdCBmdW5jdGlvbnMgdG8gcmVjb25jaWxlIHRoZSBjb25mbGljdGluZyBBU1QgZm9ybWF0cy5cbiAgICBkZWYoXCJNb2R1bGVTcGVjaWZpZXJcIilcbiAgICAgICAgLmJhc2VzKFwiU3BlY2lmaWVyXCIpXG4gICAgICAgIC8vIFRoaXMgbG9jYWwgZmllbGQgaXMgdXNlZCBieSBCYWJlbC9BY29ybi4gSXQgc2hvdWxkIG5vdCB0ZWNobmljYWxseVxuICAgICAgICAvLyBiZSBvcHRpb25hbCBpbiB0aGUgQmFiZWwvQWNvcm4gQVNUIGZvcm1hdCwgYnV0IGl0IG11c3QgYmUgb3B0aW9uYWxcbiAgICAgICAgLy8gaW4gdGhlIEVzcHJpbWEgQVNUIGZvcm1hdC5cbiAgICAgICAgLmZpZWxkKFwibG9jYWxcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLy8gVGhlIGlkIGFuZCBuYW1lIGZpZWxkcyBhcmUgdXNlZCBieSBFc3ByaW1hLiBUaGUgaWQgZmllbGQgc2hvdWxkIG5vdFxuICAgICAgICAvLyB0ZWNobmljYWxseSBiZSBvcHRpb25hbCBpbiB0aGUgRXNwcmltYSBBU1QgZm9ybWF0LCBidXQgaXQgbXVzdCBiZVxuICAgICAgICAvLyBvcHRpb25hbCBpbiB0aGUgQmFiZWwvQWNvcm4gQVNUIGZvcm1hdC5cbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICAvLyBMaWtlIE1vZHVsZVNwZWNpZmllciwgZXhjZXB0IHR5cGU6XCJJbXBvcnRTcGVjaWZpZXJcIiBhbmQgYnVpbGRhYmxlLlxuICAgIC8vIGltcG9ydCB7PGlkIFthcyBuYW1lXT59IGZyb20gLi4uO1xuICAgIGRlZihcIkltcG9ydFNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJNb2R1bGVTcGVjaWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJuYW1lXCIpO1xuICAgIC8vIGltcG9ydCA8KiBhcyBpZD4gZnJvbSAuLi47XG4gICAgZGVmKFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiKTtcbiAgICAvLyBpbXBvcnQgPGlkPiBmcm9tIC4uLjtcbiAgICBkZWYoXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiKTtcbiAgICBkZWYoXCJJbXBvcnREZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJzcGVjaWZpZXJzXCIsIFwic291cmNlXCIsIFwiaW1wb3J0S2luZFwiKVxuICAgICAgICAuZmllbGQoXCJzcGVjaWZpZXJzXCIsIFtvcihkZWYoXCJJbXBvcnRTcGVjaWZpZXJcIiksIGRlZihcIkltcG9ydE5hbWVzcGFjZVNwZWNpZmllclwiKSwgZGVmKFwiSW1wb3J0RGVmYXVsdFNwZWNpZmllclwiKSldLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJzb3VyY2VcIiwgZGVmKFwiTGl0ZXJhbFwiKSlcbiAgICAgICAgLmZpZWxkKFwiaW1wb3J0S2luZFwiLCBvcihcInZhbHVlXCIsIFwidHlwZVwiKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJ2YWx1ZVwiO1xuICAgIH0pO1xuICAgIGRlZihcIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInRhZ1wiLCBcInF1YXNpXCIpXG4gICAgICAgIC5maWVsZChcInRhZ1wiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJxdWFzaVwiLCBkZWYoXCJUZW1wbGF0ZUxpdGVyYWxcIikpO1xuICAgIGRlZihcIlRlbXBsYXRlTGl0ZXJhbFwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcInF1YXNpc1wiLCBcImV4cHJlc3Npb25zXCIpXG4gICAgICAgIC5maWVsZChcInF1YXNpc1wiLCBbZGVmKFwiVGVtcGxhdGVFbGVtZW50XCIpXSlcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvbnNcIiwgW2RlZihcIkV4cHJlc3Npb25cIildKTtcbiAgICBkZWYoXCJUZW1wbGF0ZUVsZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCBcInRhaWxcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgeyBcImNvb2tlZFwiOiBTdHJpbmcsIFwicmF3XCI6IFN0cmluZyB9KVxuICAgICAgICAuZmllbGQoXCJ0YWlsXCIsIEJvb2xlYW4pO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIGVzNl8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZXM2XCIpKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIGZvcmsudXNlKGVzNl8xLmRlZmF1bHQpO1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIGRlZiA9IHR5cGVzLlR5cGUuZGVmO1xuICAgIHZhciBvciA9IHR5cGVzLlR5cGUub3I7XG4gICAgdmFyIGRlZmF1bHRzID0gZm9yay51c2Uoc2hhcmVkXzEuZGVmYXVsdCkuZGVmYXVsdHM7XG4gICAgZGVmKFwiRnVuY3Rpb25cIilcbiAgICAgICAgLmZpZWxkKFwiYXN5bmNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiU3ByZWFkUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJPYmplY3RFeHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcInByb3BlcnRpZXNcIiwgW29yKGRlZihcIlByb3BlcnR5XCIpLCBkZWYoXCJTcHJlYWRQcm9wZXJ0eVwiKSwgZGVmKFwiU3ByZWFkRWxlbWVudFwiKSldKTtcbiAgICBkZWYoXCJTcHJlYWRQcm9wZXJ0eVBhdHRlcm5cIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJQYXR0ZXJuXCIpKTtcbiAgICBkZWYoXCJPYmplY3RQYXR0ZXJuXCIpXG4gICAgICAgIC5maWVsZChcInByb3BlcnRpZXNcIiwgW29yKGRlZihcIlByb3BlcnR5XCIpLCBkZWYoXCJQcm9wZXJ0eVBhdHRlcm5cIiksIGRlZihcIlNwcmVhZFByb3BlcnR5UGF0dGVyblwiKSldKTtcbiAgICBkZWYoXCJBd2FpdEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiLCBcImFsbFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwiYWxsXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIGVzN18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZXM3XCIpKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIGZvcmsudXNlKGVzN18xLmRlZmF1bHQpO1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIGRlZmF1bHRzID0gZm9yay51c2Uoc2hhcmVkXzEuZGVmYXVsdCkuZGVmYXVsdHM7XG4gICAgdmFyIGRlZiA9IHR5cGVzLlR5cGUuZGVmO1xuICAgIHZhciBvciA9IHR5cGVzLlR5cGUub3I7XG4gICAgZGVmKFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJhdGlvbnNcIiwgW29yKGRlZihcIlZhcmlhYmxlRGVjbGFyYXRvclwiKSwgZGVmKFwiSWRlbnRpZmllclwiKSAvLyBFc3ByaW1hIGRldmlhdGlvbi5cbiAgICAgICAgKV0pO1xuICAgIGRlZihcIlByb3BlcnR5XCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIGRlZihcIlBhdHRlcm5cIikgLy8gRXNwcmltYSBkZXZpYXRpb24uXG4gICAgKSk7XG4gICAgZGVmKFwiQXJyYXlQYXR0ZXJuXCIpXG4gICAgICAgIC5maWVsZChcImVsZW1lbnRzXCIsIFtvcihkZWYoXCJQYXR0ZXJuXCIpLCBkZWYoXCJTcHJlYWRFbGVtZW50XCIpLCBudWxsKV0pO1xuICAgIGRlZihcIk9iamVjdFBhdHRlcm5cIilcbiAgICAgICAgLmZpZWxkKFwicHJvcGVydGllc1wiLCBbb3IoZGVmKFwiUHJvcGVydHlcIiksIGRlZihcIlByb3BlcnR5UGF0dGVyblwiKSwgZGVmKFwiU3ByZWFkUHJvcGVydHlQYXR0ZXJuXCIpLCBkZWYoXCJTcHJlYWRQcm9wZXJ0eVwiKSAvLyBVc2VkIGJ5IEVzcHJpbWEuXG4gICAgICAgICldKTtcbiAgICAvLyBMaWtlIE1vZHVsZVNwZWNpZmllciwgZXhjZXB0IHR5cGU6XCJFeHBvcnRTcGVjaWZpZXJcIiBhbmQgYnVpbGRhYmxlLlxuICAgIC8vIGV4cG9ydCB7PGlkIFthcyBuYW1lXT59IFtmcm9tIC4uLl07XG4gICAgZGVmKFwiRXhwb3J0U3BlY2lmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk1vZHVsZVNwZWNpZmllclwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcIm5hbWVcIik7XG4gICAgLy8gZXhwb3J0IDwqPiBmcm9tIC4uLjtcbiAgICBkZWYoXCJFeHBvcnRCYXRjaFNwZWNpZmllclwiKVxuICAgICAgICAuYmFzZXMoXCJTcGVjaWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiRXhwb3J0RGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZGVmYXVsdFwiLCBcImRlY2xhcmF0aW9uXCIsIFwic3BlY2lmaWVyc1wiLCBcInNvdXJjZVwiKVxuICAgICAgICAuZmllbGQoXCJkZWZhdWx0XCIsIEJvb2xlYW4pXG4gICAgICAgIC5maWVsZChcImRlY2xhcmF0aW9uXCIsIG9yKGRlZihcIkRlY2xhcmF0aW9uXCIpLCBkZWYoXCJFeHByZXNzaW9uXCIpLCAvLyBJbXBsaWVzIGRlZmF1bHQuXG4gICAgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInNwZWNpZmllcnNcIiwgW29yKGRlZihcIkV4cG9ydFNwZWNpZmllclwiKSwgZGVmKFwiRXhwb3J0QmF0Y2hTcGVjaWZpZXJcIikpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwic291cmNlXCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkJsb2NrXCIpXG4gICAgICAgIC5iYXNlcyhcIkNvbW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIiwgLypvcHRpb25hbDoqLyBcImxlYWRpbmdcIiwgXCJ0cmFpbGluZ1wiKTtcbiAgICBkZWYoXCJMaW5lXCIpXG4gICAgICAgIC5iYXNlcyhcIkNvbW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIiwgLypvcHRpb25hbDoqLyBcImxlYWRpbmdcIiwgXCJ0cmFpbGluZ1wiKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciBlczdfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2VzN1wiKSk7XG52YXIgdHlwZV9hbm5vdGF0aW9uc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdHlwZS1hbm5vdGF0aW9uc1wiKSk7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xudmFyIHNoYXJlZF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi9zaGFyZWRcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICBmb3JrLnVzZShlczdfMS5kZWZhdWx0KTtcbiAgICBmb3JrLnVzZSh0eXBlX2Fubm90YXRpb25zXzEuZGVmYXVsdCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICAvLyBCYXNlIHR5cGVzXG4gICAgZGVmKFwiRmxvd1wiKS5iYXNlcyhcIk5vZGVcIik7XG4gICAgZGVmKFwiRmxvd1R5cGVcIikuYmFzZXMoXCJGbG93XCIpO1xuICAgIC8vIFR5cGUgYW5ub3RhdGlvbnNcbiAgICBkZWYoXCJBbnlUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJFbXB0eVR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIk1peGVkVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiVm9pZFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIk51bWJlclR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCBcInJhd1wiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBOdW1iZXIpXG4gICAgICAgIC5maWVsZChcInJhd1wiLCBTdHJpbmcpO1xuICAgIC8vIEJhYnlsb24gNiBkaWZmZXJzIGluIEFTVCBmcm9tIEZsb3dcbiAgICAvLyBzYW1lIGFzIE51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvblxuICAgIGRlZihcIk51bWVyaWNMaXRlcmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIiwgXCJyYXdcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgTnVtYmVyKVxuICAgICAgICAuZmllbGQoXCJyYXdcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJTdHJpbmdUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJTdHJpbmdMaXRlcmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIiwgXCJyYXdcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgU3RyaW5nKVxuICAgICAgICAuZmllbGQoXCJyYXdcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJCb29sZWFuVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiQm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiLCBcInJhd1wiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBCb29sZWFuKVxuICAgICAgICAuZmllbGQoXCJyYXdcIiwgU3RyaW5nKTtcbiAgICBkZWYoXCJUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIkZsb3dUeXBlXCIpKTtcbiAgICBkZWYoXCJOdWxsYWJsZVR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIkZsb3dUeXBlXCIpKTtcbiAgICBkZWYoXCJOdWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZCgpO1xuICAgIGRlZihcIk51bGxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJUaGlzVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiRXhpc3RzVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiRXhpc3RlbnRpYWxUeXBlUGFyYW1cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbXNcIiwgXCJyZXR1cm5UeXBlXCIsIFwicmVzdFwiLCBcInR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5maWVsZChcInBhcmFtc1wiLCBbZGVmKFwiRnVuY3Rpb25UeXBlUGFyYW1cIildKVxuICAgICAgICAuZmllbGQoXCJyZXR1cm5UeXBlXCIsIGRlZihcIkZsb3dUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJyZXN0XCIsIG9yKGRlZihcIkZ1bmN0aW9uVHlwZVBhcmFtXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLCBudWxsKSk7XG4gICAgZGVmKFwiRnVuY3Rpb25UeXBlUGFyYW1cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIsIFwidHlwZUFubm90YXRpb25cIiwgXCJvcHRpb25hbFwiKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIkZsb3dUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBCb29sZWFuKTtcbiAgICBkZWYoXCJBcnJheVR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImVsZW1lbnRUeXBlXCIpXG4gICAgICAgIC5maWVsZChcImVsZW1lbnRUeXBlXCIsIGRlZihcIkZsb3dUeXBlXCIpKTtcbiAgICBkZWYoXCJPYmplY3RUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJwcm9wZXJ0aWVzXCIsIFwiaW5kZXhlcnNcIiwgXCJjYWxsUHJvcGVydGllc1wiKVxuICAgICAgICAuZmllbGQoXCJwcm9wZXJ0aWVzXCIsIFtcbiAgICAgICAgb3IoZGVmKFwiT2JqZWN0VHlwZVByb3BlcnR5XCIpLCBkZWYoXCJPYmplY3RUeXBlU3ByZWFkUHJvcGVydHlcIikpXG4gICAgXSlcbiAgICAgICAgLmZpZWxkKFwiaW5kZXhlcnNcIiwgW2RlZihcIk9iamVjdFR5cGVJbmRleGVyXCIpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwiY2FsbFByb3BlcnRpZXNcIiwgW2RlZihcIk9iamVjdFR5cGVDYWxsUHJvcGVydHlcIildLCBkZWZhdWx0cy5lbXB0eUFycmF5KVxuICAgICAgICAuZmllbGQoXCJpbmV4YWN0XCIsIG9yKEJvb2xlYW4sIHZvaWQgMCksIGRlZmF1bHRzW1widW5kZWZpbmVkXCJdKVxuICAgICAgICAuZmllbGQoXCJleGFjdFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJpbnRlcm5hbFNsb3RzXCIsIFtkZWYoXCJPYmplY3RUeXBlSW50ZXJuYWxTbG90XCIpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSk7XG4gICAgZGVmKFwiVmFyaWFuY2VcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJraW5kXCIpXG4gICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJwbHVzXCIsIFwibWludXNcIikpO1xuICAgIHZhciBMZWdhY3lWYXJpYW5jZSA9IG9yKGRlZihcIlZhcmlhbmNlXCIpLCBcInBsdXNcIiwgXCJtaW51c1wiLCBudWxsKTtcbiAgICBkZWYoXCJPYmplY3RUeXBlUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJrZXlcIiwgXCJ2YWx1ZVwiLCBcIm9wdGlvbmFsXCIpXG4gICAgICAgIC5maWVsZChcImtleVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCBkZWYoXCJJZGVudGlmaWVyXCIpKSlcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgZGVmKFwiRmxvd1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIEJvb2xlYW4pXG4gICAgICAgIC5maWVsZChcInZhcmlhbmNlXCIsIExlZ2FjeVZhcmlhbmNlLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIk9iamVjdFR5cGVJbmRleGVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJrZXlcIiwgXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgZGVmKFwiRmxvd1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIGRlZihcIkZsb3dUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJ2YXJpYW5jZVwiLCBMZWdhY3lWYXJpYW5jZSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJPYmplY3RUeXBlQ2FsbFByb3BlcnR5XCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwidmFsdWVcIilcbiAgICAgICAgLmZpZWxkKFwidmFsdWVcIiwgZGVmKFwiRnVuY3Rpb25UeXBlQW5ub3RhdGlvblwiKSlcbiAgICAgICAgLmZpZWxkKFwic3RhdGljXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIGRlZihcIlF1YWxpZmllZFR5cGVJZGVudGlmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwicXVhbGlmaWNhdGlvblwiLCBcImlkXCIpXG4gICAgICAgIC5maWVsZChcInF1YWxpZmljYXRpb25cIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgZGVmKFwiUXVhbGlmaWVkVHlwZUlkZW50aWZpZXJcIikpKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKTtcbiAgICBkZWYoXCJHZW5lcmljVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJRdWFsaWZpZWRUeXBlSWRlbnRpZmllclwiKSkpXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJzXCIsIG9yKGRlZihcIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLCBudWxsKSk7XG4gICAgZGVmKFwiTWVtYmVyVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwib2JqZWN0XCIsIFwicHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwib2JqZWN0XCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcInByb3BlcnR5XCIsIG9yKGRlZihcIk1lbWJlclR5cGVBbm5vdGF0aW9uXCIpLCBkZWYoXCJHZW5lcmljVHlwZUFubm90YXRpb25cIikpKTtcbiAgICBkZWYoXCJVbmlvblR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVzXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVzXCIsIFtkZWYoXCJGbG93VHlwZVwiKV0pO1xuICAgIGRlZihcIkludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVzXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVzXCIsIFtkZWYoXCJGbG93VHlwZVwiKV0pO1xuICAgIGRlZihcIlR5cGVvZlR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImFyZ3VtZW50XCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIGRlZihcIkZsb3dUeXBlXCIpKTtcbiAgICBkZWYoXCJPYmplY3RUeXBlU3ByZWFkUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiKVxuICAgICAgICAuZmllbGQoXCJhcmd1bWVudFwiLCBkZWYoXCJGbG93VHlwZVwiKSk7XG4gICAgZGVmKFwiT2JqZWN0VHlwZUludGVybmFsU2xvdFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwidmFsdWVcIiwgXCJvcHRpb25hbFwiLCBcInN0YXRpY1wiLCBcIm1ldGhvZFwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJGbG93VHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbilcbiAgICAgICAgLmZpZWxkKFwic3RhdGljXCIsIEJvb2xlYW4pXG4gICAgICAgIC5maWVsZChcIm1ldGhvZFwiLCBCb29sZWFuKTtcbiAgICBkZWYoXCJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbXNcIilcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJUeXBlUGFyYW1ldGVyXCIpXSk7XG4gICAgZGVmKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbXNcIilcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJGbG93VHlwZVwiKV0pO1xuICAgIGRlZihcIlR5cGVQYXJhbWV0ZXJcIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwibmFtZVwiLCBcInZhcmlhbmNlXCIsIFwiYm91bmRcIilcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBTdHJpbmcpXG4gICAgICAgIC5maWVsZChcInZhcmlhbmNlXCIsIExlZ2FjeVZhcmlhbmNlLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcImJvdW5kXCIsIG9yKGRlZihcIlR5cGVBbm5vdGF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJDbGFzc1Byb3BlcnR5XCIpXG4gICAgICAgIC5maWVsZChcInZhcmlhbmNlXCIsIExlZ2FjeVZhcmlhbmNlLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkNsYXNzSW1wbGVtZW50c1wiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcInN1cGVyQ2xhc3NcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkludGVyZmFjZVR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIiwgXCJleHRlbmRzXCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgZGVmKFwiT2JqZWN0VHlwZUFubm90YXRpb25cIikpXG4gICAgICAgIC5maWVsZChcImV4dGVuZHNcIiwgb3IoW2RlZihcIkludGVyZmFjZUV4dGVuZHNcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJJbnRlcmZhY2VEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImJvZHlcIiwgXCJleHRlbmRzXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJzXCIsIG9yKGRlZihcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJPYmplY3RUeXBlQW5ub3RhdGlvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiZXh0ZW5kc1wiLCBbZGVmKFwiSW50ZXJmYWNlRXh0ZW5kc1wiKV0pO1xuICAgIGRlZihcIkRlY2xhcmVJbnRlcmZhY2VcIilcbiAgICAgICAgLmJhc2VzKFwiSW50ZXJmYWNlRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJib2R5XCIsIFwiZXh0ZW5kc1wiKTtcbiAgICBkZWYoXCJJbnRlcmZhY2VFeHRlbmRzXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlR5cGVBbGlhc1wiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInR5cGVQYXJhbWV0ZXJzXCIsIFwicmlnaHRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpLCBudWxsKSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgZGVmKFwiRmxvd1R5cGVcIikpO1xuICAgIGRlZihcIk9wYXF1ZVR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcImltcGx0eXBlXCIsIFwic3VwZXJ0eXBlXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJzXCIsIG9yKGRlZihcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSwgbnVsbCkpXG4gICAgICAgIC5maWVsZChcImltcGx0eXBlXCIsIGRlZihcIkZsb3dUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJzdXBlcnR5cGVcIiwgZGVmKFwiRmxvd1R5cGVcIikpO1xuICAgIGRlZihcIkRlY2xhcmVUeXBlQWxpYXNcIilcbiAgICAgICAgLmJhc2VzKFwiVHlwZUFsaWFzXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwidHlwZVBhcmFtZXRlcnNcIiwgXCJyaWdodFwiKTtcbiAgICBkZWYoXCJEZWNsYXJlT3BhcXVlVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUeXBlQWxpYXNcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiLCBcInN1cGVydHlwZVwiKTtcbiAgICBkZWYoXCJUeXBlQ2FzdEV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uXCIsIFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBkZWYoXCJUeXBlQW5ub3RhdGlvblwiKSk7XG4gICAgZGVmKFwiVHVwbGVUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJGbG93VHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ0eXBlc1wiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlc1wiLCBbZGVmKFwiRmxvd1R5cGVcIildKTtcbiAgICBkZWYoXCJEZWNsYXJlVmFyaWFibGVcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpO1xuICAgIGRlZihcIkRlY2xhcmVGdW5jdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJTdGF0ZW1lbnRcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSk7XG4gICAgZGVmKFwiRGVjbGFyZUNsYXNzXCIpXG4gICAgICAgIC5iYXNlcyhcIkludGVyZmFjZURlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpO1xuICAgIGRlZihcIkRlY2xhcmVNb2R1bGVcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwiYm9keVwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJMaXRlcmFsXCIpKSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJCbG9ja1N0YXRlbWVudFwiKSk7XG4gICAgZGVmKFwiRGVjbGFyZU1vZHVsZUV4cG9ydHNcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlR5cGVBbm5vdGF0aW9uXCIpKTtcbiAgICBkZWYoXCJEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZGVmYXVsdFwiLCBcImRlY2xhcmF0aW9uXCIsIFwic3BlY2lmaWVyc1wiLCBcInNvdXJjZVwiKVxuICAgICAgICAuZmllbGQoXCJkZWZhdWx0XCIsIEJvb2xlYW4pXG4gICAgICAgIC5maWVsZChcImRlY2xhcmF0aW9uXCIsIG9yKGRlZihcIkRlY2xhcmVWYXJpYWJsZVwiKSwgZGVmKFwiRGVjbGFyZUZ1bmN0aW9uXCIpLCBkZWYoXCJEZWNsYXJlQ2xhc3NcIiksIGRlZihcIkZsb3dUeXBlXCIpLCAvLyBJbXBsaWVzIGRlZmF1bHQuXG4gICAgbnVsbCkpXG4gICAgICAgIC5maWVsZChcInNwZWNpZmllcnNcIiwgW29yKGRlZihcIkV4cG9ydFNwZWNpZmllclwiKSwgZGVmKFwiRXhwb3J0QmF0Y2hTcGVjaWZpZXJcIikpXSwgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwic291cmNlXCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJzb3VyY2VcIilcbiAgICAgICAgLmZpZWxkKFwic291cmNlXCIsIG9yKGRlZihcIkxpdGVyYWxcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIkZsb3dQcmVkaWNhdGVcIikuYmFzZXMoXCJGbG93XCIpO1xuICAgIGRlZihcIkluZmVycmVkUHJlZGljYXRlXCIpXG4gICAgICAgIC5iYXNlcyhcIkZsb3dQcmVkaWNhdGVcIilcbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiRGVjbGFyZWRQcmVkaWNhdGVcIilcbiAgICAgICAgLmJhc2VzKFwiRmxvd1ByZWRpY2F0ZVwiKVxuICAgICAgICAuYnVpbGQoXCJ2YWx1ZVwiKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJDYWxsRXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQXJndW1lbnRzXCIsIG9yKG51bGwsIGRlZihcIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJOZXdFeHByZXNzaW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBcmd1bWVudHNcIiwgb3IobnVsbCwgZGVmKFwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIikpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIGVzN18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZXM3XCIpKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIGZvcmsudXNlKGVzN18xLmRlZmF1bHQpO1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIGRlZiA9IHR5cGVzLlR5cGUuZGVmO1xuICAgIHZhciBvciA9IHR5cGVzLlR5cGUub3I7XG4gICAgdmFyIGRlZmF1bHRzID0gZm9yay51c2Uoc2hhcmVkXzEuZGVmYXVsdCkuZGVmYXVsdHM7XG4gICAgZGVmKFwiSlNYQXR0cmlidXRlXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwibmFtZVwiLCBcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgb3IoZGVmKFwiSlNYSWRlbnRpZmllclwiKSwgZGVmKFwiSlNYTmFtZXNwYWNlZE5hbWVcIikpKVxuICAgICAgICAuZmllbGQoXCJ2YWx1ZVwiLCBvcihkZWYoXCJMaXRlcmFsXCIpLCAvLyBhdHRyPVwidmFsdWVcIlxuICAgIGRlZihcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIiksIC8vIGF0dHI9e3ZhbHVlfVxuICAgIG51bGwgLy8gYXR0cj0gb3IganVzdCBhdHRyXG4gICAgKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJKU1hJZGVudGlmaWVyXCIpXG4gICAgICAgIC5iYXNlcyhcIklkZW50aWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwibmFtZVwiKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIFN0cmluZyk7XG4gICAgZGVmKFwiSlNYTmFtZXNwYWNlZE5hbWVcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJuYW1lc3BhY2VcIiwgXCJuYW1lXCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVzcGFjZVwiLCBkZWYoXCJKU1hJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIGRlZihcIkpTWElkZW50aWZpZXJcIikpO1xuICAgIGRlZihcIkpTWE1lbWJlckV4cHJlc3Npb25cIilcbiAgICAgICAgLmJhc2VzKFwiTWVtYmVyRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvYmplY3RcIiwgXCJwcm9wZXJ0eVwiKVxuICAgICAgICAuZmllbGQoXCJvYmplY3RcIiwgb3IoZGVmKFwiSlNYSWRlbnRpZmllclwiKSwgZGVmKFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC5maWVsZChcInByb3BlcnR5XCIsIGRlZihcIkpTWElkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGRlZmF1bHRzLmZhbHNlKTtcbiAgICB2YXIgSlNYRWxlbWVudE5hbWUgPSBvcihkZWYoXCJKU1hJZGVudGlmaWVyXCIpLCBkZWYoXCJKU1hOYW1lc3BhY2VkTmFtZVwiKSwgZGVmKFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiKSk7XG4gICAgZGVmKFwiSlNYU3ByZWFkQXR0cmlidXRlXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiYXJndW1lbnRcIilcbiAgICAgICAgLmZpZWxkKFwiYXJndW1lbnRcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSk7XG4gICAgdmFyIEpTWEF0dHJpYnV0ZXMgPSBbb3IoZGVmKFwiSlNYQXR0cmlidXRlXCIpLCBkZWYoXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIikpXTtcbiAgICBkZWYoXCJKU1hFeHByZXNzaW9uQ29udGFpbmVyXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIilcbiAgICAgICAgLmJ1aWxkKFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIGRlZihcIkV4cHJlc3Npb25cIikpO1xuICAgIGRlZihcIkpTWEVsZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiRXhwcmVzc2lvblwiKVxuICAgICAgICAuYnVpbGQoXCJvcGVuaW5nRWxlbWVudFwiLCBcImNsb3NpbmdFbGVtZW50XCIsIFwiY2hpbGRyZW5cIilcbiAgICAgICAgLmZpZWxkKFwib3BlbmluZ0VsZW1lbnRcIiwgZGVmKFwiSlNYT3BlbmluZ0VsZW1lbnRcIikpXG4gICAgICAgIC5maWVsZChcImNsb3NpbmdFbGVtZW50XCIsIG9yKGRlZihcIkpTWENsb3NpbmdFbGVtZW50XCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJjaGlsZHJlblwiLCBbb3IoZGVmKFwiSlNYRWxlbWVudFwiKSwgZGVmKFwiSlNYRXhwcmVzc2lvbkNvbnRhaW5lclwiKSwgZGVmKFwiSlNYRnJhZ21lbnRcIiksIGRlZihcIkpTWFRleHRcIiksIGRlZihcIkxpdGVyYWxcIikgLy8gVE9ETyBFc3ByaW1hIHNob3VsZCByZXR1cm4gSlNYVGV4dCBpbnN0ZWFkLlxuICAgICAgICApXSwgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwibmFtZVwiLCBKU1hFbGVtZW50TmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBMaXR0bGUta25vd24gZmFjdDogdGhlIGB0aGlzYCBvYmplY3QgaW5zaWRlIGEgZGVmYXVsdCBmdW5jdGlvblxuICAgICAgICAvLyBpcyBub25lIG90aGVyIHRoYW4gdGhlIHBhcnRpYWxseS1idWlsdCBvYmplY3QgaXRzZWxmLCBhbmQgYW55XG4gICAgICAgIC8vIGZpZWxkcyBpbml0aWFsaXplZCBkaXJlY3RseSBmcm9tIGJ1aWxkZXIgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICAgIC8vIChsaWtlIG9wZW5pbmdFbGVtZW50LCBjbG9zaW5nRWxlbWVudCwgYW5kIGNoaWxkcmVuKSBhcmVcbiAgICAgICAgLy8gZ3VhcmFudGVlZCB0byBiZSBhdmFpbGFibGUuXG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5pbmdFbGVtZW50Lm5hbWU7XG4gICAgfSwgdHJ1ZSkgLy8gaGlkZGVuIGZyb20gdHJhdmVyc2FsXG4gICAgICAgIC5maWVsZChcInNlbGZDbG9zaW5nXCIsIEJvb2xlYW4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbmluZ0VsZW1lbnQuc2VsZkNsb3Npbmc7XG4gICAgfSwgdHJ1ZSkgLy8gaGlkZGVuIGZyb20gdHJhdmVyc2FsXG4gICAgICAgIC5maWVsZChcImF0dHJpYnV0ZXNcIiwgSlNYQXR0cmlidXRlcywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVuaW5nRWxlbWVudC5hdHRyaWJ1dGVzO1xuICAgIH0sIHRydWUpOyAvLyBoaWRkZW4gZnJvbSB0cmF2ZXJzYWxcbiAgICBkZWYoXCJKU1hPcGVuaW5nRWxlbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpIC8vIFRPRE8gRG9lcyB0aGlzIG1ha2Ugc2Vuc2U/IENhbid0IHJlYWxseSBiZSBhbiBKU1hFbGVtZW50LlxuICAgICAgICAuYnVpbGQoXCJuYW1lXCIsIFwiYXR0cmlidXRlc1wiLCBcInNlbGZDbG9zaW5nXCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgSlNYRWxlbWVudE5hbWUpXG4gICAgICAgIC5maWVsZChcImF0dHJpYnV0ZXNcIiwgSlNYQXR0cmlidXRlcywgZGVmYXVsdHMuZW1wdHlBcnJheSlcbiAgICAgICAgLmZpZWxkKFwic2VsZkNsb3NpbmdcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSk7XG4gICAgZGVmKFwiSlNYQ2xvc2luZ0VsZW1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKSAvLyBUT0RPIFNhbWUgY29uY2Vybi5cbiAgICAgICAgLmJ1aWxkKFwibmFtZVwiKVxuICAgICAgICAuZmllbGQoXCJuYW1lXCIsIEpTWEVsZW1lbnROYW1lKTtcbiAgICBkZWYoXCJKU1hGcmFnbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcIm9wZW5pbmdFbGVtZW50XCIsIFwiY2xvc2luZ0VsZW1lbnRcIiwgXCJjaGlsZHJlblwiKVxuICAgICAgICAuZmllbGQoXCJvcGVuaW5nRWxlbWVudFwiLCBkZWYoXCJKU1hPcGVuaW5nRnJhZ21lbnRcIikpXG4gICAgICAgIC5maWVsZChcImNsb3NpbmdFbGVtZW50XCIsIGRlZihcIkpTWENsb3NpbmdGcmFnbWVudFwiKSlcbiAgICAgICAgLmZpZWxkKFwiY2hpbGRyZW5cIiwgW29yKGRlZihcIkpTWEVsZW1lbnRcIiksIGRlZihcIkpTWEV4cHJlc3Npb25Db250YWluZXJcIiksIGRlZihcIkpTWEZyYWdtZW50XCIpLCBkZWYoXCJKU1hUZXh0XCIpLCBkZWYoXCJMaXRlcmFsXCIpIC8vIFRPRE8gRXNwcmltYSBzaG91bGQgcmV0dXJuIEpTWFRleHQgaW5zdGVhZC5cbiAgICAgICAgKV0sIGRlZmF1bHRzLmVtcHR5QXJyYXkpO1xuICAgIGRlZihcIkpTWE9wZW5pbmdGcmFnbWVudFwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpIC8vIFRPRE8gU2FtZSBjb25jZXJuLlxuICAgICAgICAuYnVpbGQoKTtcbiAgICBkZWYoXCJKU1hDbG9zaW5nRnJhZ21lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKSAvLyBUT0RPIFNhbWUgY29uY2Vybi5cbiAgICAgICAgLmJ1aWxkKCk7XG4gICAgZGVmKFwiSlNYVGV4dFwiKVxuICAgICAgICAuYmFzZXMoXCJMaXRlcmFsXCIpXG4gICAgICAgIC5idWlsZChcInZhbHVlXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIFN0cmluZyk7XG4gICAgZGVmKFwiSlNYRW1wdHlFeHByZXNzaW9uXCIpLmJhc2VzKFwiRXhwcmVzc2lvblwiKS5idWlsZCgpO1xuICAgIC8vIFRoaXMgUFIgaGFzIGNhdXNlZCBtYW55IHBlb3BsZSBpc3N1ZXMsIGJ1dCBzdXBwb3J0aW5nIGl0IHNlZW1zIGxpa2UgYVxuICAgIC8vIGdvb2QgaWRlYSBhbnl3YXk6IGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9wdWxsLzQ5ODhcbiAgICBkZWYoXCJKU1hTcHJlYWRDaGlsZFwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG4vKipcbiAqIFR5cGUgYW5ub3RhdGlvbiBkZWZzIHNoYXJlZCBiZXR3ZWVuIEZsb3cgYW5kIFR5cGVTY3JpcHQuXG4gKiBUaGVzZSBkZWZzIGNvdWxkIG5vdCBiZSBkZWZpbmVkIGluIC4vZmxvdy50cyBvciAuL3R5cGVzY3JpcHQudHMgZGlyZWN0bHlcbiAqIGJlY2F1c2UgdGhleSB1c2UgdGhlIHNhbWUgbmFtZS5cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi9saWIvdHlwZXNcIikpO1xudmFyIHNoYXJlZF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi9zaGFyZWRcIikpO1xuZnVuY3Rpb24gZGVmYXVsdF8xKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBkZWYgPSB0eXBlcy5UeXBlLmRlZjtcbiAgICB2YXIgb3IgPSB0eXBlcy5UeXBlLm9yO1xuICAgIHZhciBkZWZhdWx0cyA9IGZvcmsudXNlKHNoYXJlZF8xLmRlZmF1bHQpLmRlZmF1bHRzO1xuICAgIHZhciBUeXBlQW5ub3RhdGlvbiA9IG9yKGRlZihcIlR5cGVBbm5vdGF0aW9uXCIpLCBkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLCBudWxsKTtcbiAgICB2YXIgVHlwZVBhcmFtRGVjbCA9IG9yKGRlZihcIlR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvblwiKSwgZGVmKFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiksIG51bGwpO1xuICAgIGRlZihcIklkZW50aWZpZXJcIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgVHlwZUFubm90YXRpb24sIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiT2JqZWN0UGF0dGVyblwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBUeXBlQW5ub3RhdGlvbiwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJGdW5jdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJyZXR1cm5UeXBlXCIsIFR5cGVBbm5vdGF0aW9uLCBkZWZhdWx0c1tcIm51bGxcIl0pXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJzXCIsIFR5cGVQYXJhbURlY2wsIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiQ2xhc3NQcm9wZXJ0eVwiKVxuICAgICAgICAuYnVpbGQoXCJrZXlcIiwgXCJ2YWx1ZVwiLCBcInR5cGVBbm5vdGF0aW9uXCIsIFwic3RhdGljXCIpXG4gICAgICAgIC5maWVsZChcInZhbHVlXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpKVxuICAgICAgICAuZmllbGQoXCJzdGF0aWNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgVHlwZUFubm90YXRpb24sIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgW1wiQ2xhc3NEZWNsYXJhdGlvblwiLFxuICAgICAgICBcIkNsYXNzRXhwcmVzc2lvblwiLFxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAodHlwZU5hbWUpIHtcbiAgICAgICAgZGVmKHR5cGVOYW1lKVxuICAgICAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgVHlwZVBhcmFtRGVjbCwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAgICAgLmZpZWxkKFwic3VwZXJUeXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSwgZGVmKFwiVFNUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgICAgIC5maWVsZChcImltcGxlbWVudHNcIiwgb3IoW2RlZihcIkNsYXNzSW1wbGVtZW50c1wiKV0sIFtkZWYoXCJUU0V4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50c1wiKV0pLCBkZWZhdWx0cy5lbXB0eUFycmF5KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciBiYWJlbF9jb3JlXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9iYWJlbC1jb3JlXCIpKTtcbnZhciB0eXBlX2Fubm90YXRpb25zXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90eXBlLWFubm90YXRpb25zXCIpKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uL2xpYi90eXBlc1wiKSk7XG52YXIgc2hhcmVkXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbGliL3NoYXJlZFwiKSk7XG5mdW5jdGlvbiBkZWZhdWx0XzEoZm9yaykge1xuICAgIC8vIFNpbmNlIFR5cGVTY3JpcHQgaXMgcGFyc2VkIGJ5IEJhYnlsb24sIGluY2x1ZGUgdGhlIGNvcmUgQmFieWxvbiB0eXBlc1xuICAgIC8vIGJ1dCBvbWl0IHRoZSBGbG93LXJlbGF0ZWQgdHlwZXMuXG4gICAgZm9yay51c2UoYmFiZWxfY29yZV8xLmRlZmF1bHQpO1xuICAgIGZvcmsudXNlKHR5cGVfYW5ub3RhdGlvbnNfMS5kZWZhdWx0KTtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBuID0gdHlwZXMubmFtZWRUeXBlcztcbiAgICB2YXIgZGVmID0gdHlwZXMuVHlwZS5kZWY7XG4gICAgdmFyIG9yID0gdHlwZXMuVHlwZS5vcjtcbiAgICB2YXIgZGVmYXVsdHMgPSBmb3JrLnVzZShzaGFyZWRfMS5kZWZhdWx0KS5kZWZhdWx0cztcbiAgICB2YXIgU3RyaW5nTGl0ZXJhbCA9IHR5cGVzLlR5cGUuZnJvbShmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgaWYgKG4uU3RyaW5nTGl0ZXJhbCAmJlxuICAgICAgICAgICAgbi5TdHJpbmdMaXRlcmFsLmNoZWNrKHZhbHVlLCBkZWVwKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4uTGl0ZXJhbCAmJlxuICAgICAgICAgICAgbi5MaXRlcmFsLmNoZWNrKHZhbHVlLCBkZWVwKSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlLnZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSwgXCJTdHJpbmdMaXRlcmFsXCIpO1xuICAgIGRlZihcIlRTVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpO1xuICAgIHZhciBUU0VudGl0eU5hbWUgPSBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJUU1F1YWxpZmllZE5hbWVcIikpO1xuICAgIGRlZihcIlRTVHlwZVJlZmVyZW5jZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZU5hbWVcIiwgXCJ0eXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlTmFtZVwiLCBUU0VudGl0eU5hbWUpO1xuICAgIC8vIEFuIGFic3RyYWN0IChub24tYnVpbGRhYmxlKSBiYXNlIHR5cGUgdGhhdCBwcm92aWRlIGEgY29tbW9ubHktbmVlZGVkXG4gICAgLy8gb3B0aW9uYWwgLnR5cGVQYXJhbWV0ZXJzIGZpZWxkLlxuICAgIGRlZihcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlUGFyYW1ldGVyc1wiLCBvcihkZWYoXCJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICAvLyBBbiBhYnN0cmFjdCAobm9uLWJ1aWxkYWJsZSkgYmFzZSB0eXBlIHRoYXQgcHJvdmlkZSBhIGNvbW1vbmx5LW5lZWRlZFxuICAgIC8vIG9wdGlvbmFsIC50eXBlUGFyYW1ldGVycyBmaWVsZC5cbiAgICBkZWYoXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlcnNcIilcbiAgICAgICAgLmZpZWxkKFwidHlwZVBhcmFtZXRlcnNcIiwgb3IoZGVmKFwiVFNUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb25cIiksIG51bGwsIHZvaWQgMCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgLy8gQW4gYWJzdHJhY3QgKG5vbi1idWlsZGFibGUpIGJhc2UgdHlwZSB0aGF0IHByb3ZpZGUgYSBjb21tb25seS1uZWVkZWRcbiAgICAvLyBvcHRpb25hbCAudHlwZUFubm90YXRpb24gZmllbGQuXG4gICAgZGVmKFwiVFNIYXNPcHRpb25hbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIG9yKGRlZihcIlRTVHlwZUFubm90YXRpb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTUXVhbGlmaWVkTmFtZVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImxlZnRcIiwgXCJyaWdodFwiKVxuICAgICAgICAuZmllbGQoXCJsZWZ0XCIsIFRTRW50aXR5TmFtZSlcbiAgICAgICAgLmZpZWxkKFwicmlnaHRcIiwgVFNFbnRpdHlOYW1lKTtcbiAgICBkZWYoXCJUU0FzRXhwcmVzc2lvblwiKVxuICAgICAgICAuYmFzZXMoXCJFeHByZXNzaW9uXCIsIFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJleHByZXNzaW9uXCIsIFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBkZWYoXCJUU1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcImV4dHJhXCIsIG9yKHsgcGFyZW50aGVzaXplZDogQm9vbGVhbiB9LCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJUU05vbk51bGxFeHByZXNzaW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIiwgXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBbXG4gICAgICAgIFwiVFNBbnlLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNCaWdJbnRLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNCb29sZWFuS2V5d29yZFwiLFxuICAgICAgICBcIlRTTmV2ZXJLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNOdWxsS2V5d29yZFwiLFxuICAgICAgICBcIlRTTnVtYmVyS2V5d29yZFwiLFxuICAgICAgICBcIlRTT2JqZWN0S2V5d29yZFwiLFxuICAgICAgICBcIlRTU3RyaW5nS2V5d29yZFwiLFxuICAgICAgICBcIlRTU3ltYm9sS2V5d29yZFwiLFxuICAgICAgICBcIlRTVW5kZWZpbmVkS2V5d29yZFwiLFxuICAgICAgICBcIlRTVW5rbm93bktleXdvcmRcIixcbiAgICAgICAgXCJUU1ZvaWRLZXl3b3JkXCIsXG4gICAgICAgIFwiVFNUaGlzVHlwZVwiLFxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoa2V5d29yZFR5cGUpIHtcbiAgICAgICAgZGVmKGtleXdvcmRUeXBlKVxuICAgICAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgICAgICAuYnVpbGQoKTtcbiAgICB9KTtcbiAgICBkZWYoXCJUU0FycmF5VHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwiZWxlbWVudFR5cGVcIilcbiAgICAgICAgLmZpZWxkKFwiZWxlbWVudFR5cGVcIiwgZGVmKFwiVFNUeXBlXCIpKTtcbiAgICBkZWYoXCJUU0xpdGVyYWxUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJsaXRlcmFsXCIpXG4gICAgICAgIC5maWVsZChcImxpdGVyYWxcIiwgb3IoZGVmKFwiTnVtZXJpY0xpdGVyYWxcIiksIGRlZihcIlN0cmluZ0xpdGVyYWxcIiksIGRlZihcIkJvb2xlYW5MaXRlcmFsXCIpLCBkZWYoXCJUZW1wbGF0ZUxpdGVyYWxcIiksIGRlZihcIlVuYXJ5RXhwcmVzc2lvblwiKSkpO1xuICAgIFtcIlRTVW5pb25UeXBlXCIsXG4gICAgICAgIFwiVFNJbnRlcnNlY3Rpb25UeXBlXCIsXG4gICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlTmFtZSkge1xuICAgICAgICBkZWYodHlwZU5hbWUpXG4gICAgICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgICAgIC5idWlsZChcInR5cGVzXCIpXG4gICAgICAgICAgICAuZmllbGQoXCJ0eXBlc1wiLCBbZGVmKFwiVFNUeXBlXCIpXSk7XG4gICAgfSk7XG4gICAgZGVmKFwiVFNDb25kaXRpb25hbFR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImNoZWNrVHlwZVwiLCBcImV4dGVuZHNUeXBlXCIsIFwidHJ1ZVR5cGVcIiwgXCJmYWxzZVR5cGVcIilcbiAgICAgICAgLmZpZWxkKFwiY2hlY2tUeXBlXCIsIGRlZihcIlRTVHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwiZXh0ZW5kc1R5cGVcIiwgZGVmKFwiVFNUeXBlXCIpKVxuICAgICAgICAuZmllbGQoXCJ0cnVlVHlwZVwiLCBkZWYoXCJUU1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcImZhbHNlVHlwZVwiLCBkZWYoXCJUU1R5cGVcIikpO1xuICAgIGRlZihcIlRTSW5mZXJUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ0eXBlUGFyYW1ldGVyXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJcIiwgZGVmKFwiVFNUeXBlUGFyYW1ldGVyXCIpKTtcbiAgICBkZWYoXCJUU1BhcmVudGhlc2l6ZWRUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBkZWYoXCJUU1R5cGVcIikpO1xuICAgIHZhciBQYXJhbWV0ZXJzVHlwZSA9IFtvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJSZXN0RWxlbWVudFwiKSwgZGVmKFwiQXJyYXlQYXR0ZXJuXCIpLCBkZWYoXCJPYmplY3RQYXR0ZXJuXCIpKV07XG4gICAgW1wiVFNGdW5jdGlvblR5cGVcIixcbiAgICAgICAgXCJUU0NvbnN0cnVjdG9yVHlwZVwiLFxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAodHlwZU5hbWUpIHtcbiAgICAgICAgZGVmKHR5cGVOYW1lKVxuICAgICAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJzXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgICAgICAuYnVpbGQoXCJwYXJhbWV0ZXJzXCIpXG4gICAgICAgICAgICAuZmllbGQoXCJwYXJhbWV0ZXJzXCIsIFBhcmFtZXRlcnNUeXBlKTtcbiAgICB9KTtcbiAgICBkZWYoXCJUU0RlY2xhcmVGdW5jdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcInBhcmFtc1wiLCBcInJldHVyblR5cGVcIilcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyZVwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJhc3luY1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJnZW5lcmF0b3JcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgb3IoZGVmKFwiSWRlbnRpZmllclwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJQYXR0ZXJuXCIpXSlcbiAgICAgICAgLy8gdFNGdW5jdGlvblR5cGVBbm5vdGF0aW9uQ29tbW9uXG4gICAgICAgIC5maWVsZChcInJldHVyblR5cGVcIiwgb3IoZGVmKFwiVFNUeXBlQW5ub3RhdGlvblwiKSwgZGVmKFwiTm9vcFwiKSwgLy8gU3RpbGwgdXNlZD9cbiAgICBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJUU0RlY2xhcmVNZXRob2RcIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlcnNcIilcbiAgICAgICAgLmJ1aWxkKFwia2V5XCIsIFwicGFyYW1zXCIsIFwicmV0dXJuVHlwZVwiKVxuICAgICAgICAuZmllbGQoXCJhc3luY1wiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJnZW5lcmF0b3JcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJQYXR0ZXJuXCIpXSlcbiAgICAgICAgLy8gY2xhc3NNZXRob2RPclByb3BlcnR5Q29tbW9uXG4gICAgICAgIC5maWVsZChcImFic3RyYWN0XCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImFjY2Vzc2liaWxpdHlcIiwgb3IoXCJwdWJsaWNcIiwgXCJwcml2YXRlXCIsIFwicHJvdGVjdGVkXCIsIHZvaWQgMCksIGRlZmF1bHRzW1widW5kZWZpbmVkXCJdKVxuICAgICAgICAuZmllbGQoXCJzdGF0aWNcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIlN0cmluZ0xpdGVyYWxcIiksIGRlZihcIk51bWVyaWNMaXRlcmFsXCIpLCBcbiAgICAvLyBPbmx5IGFsbG93ZWQgaWYgLmNvbXB1dGVkIGlzIHRydWUuXG4gICAgZGVmKFwiRXhwcmVzc2lvblwiKSkpXG4gICAgICAgIC8vIGNsYXNzTWV0aG9kT3JEZWNsYXJlTWV0aG9kQ29tbW9uXG4gICAgICAgIC5maWVsZChcImtpbmRcIiwgb3IoXCJnZXRcIiwgXCJzZXRcIiwgXCJtZXRob2RcIiwgXCJjb25zdHJ1Y3RvclwiKSwgZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIFwibWV0aG9kXCI7IH0pXG4gICAgICAgIC5maWVsZChcImFjY2Vzc1wiLCAvLyBOb3QgXCJhY2Nlc3NpYmlsaXR5XCI/XG4gICAgb3IoXCJwdWJsaWNcIiwgXCJwcml2YXRlXCIsIFwicHJvdGVjdGVkXCIsIHZvaWQgMCksIGRlZmF1bHRzW1widW5kZWZpbmVkXCJdKVxuICAgICAgICAuZmllbGQoXCJkZWNvcmF0b3JzXCIsIG9yKFtkZWYoXCJEZWNvcmF0b3JcIildLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAvLyB0U0Z1bmN0aW9uVHlwZUFubm90YXRpb25Db21tb25cbiAgICAgICAgLmZpZWxkKFwicmV0dXJuVHlwZVwiLCBvcihkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLCBkZWYoXCJOb29wXCIpLCAvLyBTdGlsbCB1c2VkP1xuICAgIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTTWFwcGVkVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZVBhcmFtZXRlclwiLCBcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInJlYWRvbmx5XCIsIG9yKEJvb2xlYW4sIFwiK1wiLCBcIi1cIiksIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcInR5cGVQYXJhbWV0ZXJcIiwgZGVmKFwiVFNUeXBlUGFyYW1ldGVyXCIpKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBvcihCb29sZWFuLCBcIitcIiwgXCItXCIpLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBvcihkZWYoXCJUU1R5cGVcIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTVHVwbGVUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiKVxuICAgICAgICAuYnVpbGQoXCJlbGVtZW50VHlwZXNcIilcbiAgICAgICAgLmZpZWxkKFwiZWxlbWVudFR5cGVzXCIsIFtvcihkZWYoXCJUU1R5cGVcIiksIGRlZihcIlRTTmFtZWRUdXBsZU1lbWJlclwiKSldKTtcbiAgICBkZWYoXCJUU05hbWVkVHVwbGVNZW1iZXJcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImxhYmVsXCIsIFwiZWxlbWVudFR5cGVcIiwgXCJvcHRpb25hbFwiKVxuICAgICAgICAuZmllbGQoXCJsYWJlbFwiLCBkZWYoXCJJZGVudGlmaWVyXCIpKVxuICAgICAgICAuZmllbGQoXCJvcHRpb25hbFwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJlbGVtZW50VHlwZVwiLCBkZWYoXCJUU1R5cGVcIikpO1xuICAgIGRlZihcIlRTUmVzdFR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgZGVmKFwiVFNPcHRpb25hbFR5cGVcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5maWVsZChcInR5cGVBbm5vdGF0aW9uXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgZGVmKFwiVFNJbmRleGVkQWNjZXNzVHlwZVwiKVxuICAgICAgICAuYmFzZXMoXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwib2JqZWN0VHlwZVwiLCBcImluZGV4VHlwZVwiKVxuICAgICAgICAuZmllbGQoXCJvYmplY3RUeXBlXCIsIGRlZihcIlRTVHlwZVwiKSlcbiAgICAgICAgLmZpZWxkKFwiaW5kZXhUeXBlXCIsIGRlZihcIlRTVHlwZVwiKSk7XG4gICAgZGVmKFwiVFNUeXBlT3BlcmF0b3JcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcIm9wZXJhdG9yXCIpXG4gICAgICAgIC5maWVsZChcIm9wZXJhdG9yXCIsIFN0cmluZylcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgZGVmKFwiVFNUeXBlXCIpKTtcbiAgICBkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwidHlwZUFubm90YXRpb25cIiwgb3IoZGVmKFwiVFNUeXBlXCIpLCBkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpKSk7XG4gICAgZGVmKFwiVFNJbmRleFNpZ25hdHVyZVwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbWV0ZXJzXCIsIFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwicGFyYW1ldGVyc1wiLCBbZGVmKFwiSWRlbnRpZmllclwiKV0pIC8vIExlbmd0aCA9PT0gMVxuICAgICAgICAuZmllbGQoXCJyZWFkb25seVwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKTtcbiAgICBkZWYoXCJUU1Byb3BlcnR5U2lnbmF0dXJlXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImtleVwiLCBcInR5cGVBbm5vdGF0aW9uXCIsIFwib3B0aW9uYWxcIilcbiAgICAgICAgLmZpZWxkKFwia2V5XCIsIGRlZihcIkV4cHJlc3Npb25cIikpXG4gICAgICAgIC5maWVsZChcImNvbXB1dGVkXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcInJlYWRvbmx5XCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcIm9wdGlvbmFsXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImluaXRpYWxpemVyXCIsIG9yKGRlZihcIkV4cHJlc3Npb25cIiksIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTTWV0aG9kU2lnbmF0dXJlXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJzXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVBbm5vdGF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImtleVwiLCBcInBhcmFtZXRlcnNcIiwgXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAuZmllbGQoXCJrZXlcIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29tcHV0ZWRcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwib3B0aW9uYWxcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwicGFyYW1ldGVyc1wiLCBQYXJhbWV0ZXJzVHlwZSk7XG4gICAgZGVmKFwiVFNUeXBlUHJlZGljYXRlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZUFubm90YXRpb25cIiwgXCJUU1R5cGVcIilcbiAgICAgICAgLmJ1aWxkKFwicGFyYW1ldGVyTmFtZVwiLCBcInR5cGVBbm5vdGF0aW9uXCIsIFwiYXNzZXJ0c1wiKVxuICAgICAgICAuZmllbGQoXCJwYXJhbWV0ZXJOYW1lXCIsIG9yKGRlZihcIklkZW50aWZpZXJcIiksIGRlZihcIlRTVGhpc1R5cGVcIikpKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBvcihkZWYoXCJUU1R5cGVBbm5vdGF0aW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKVxuICAgICAgICAuZmllbGQoXCJhc3NlcnRzXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pO1xuICAgIFtcIlRTQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsXG4gICAgICAgIFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiLFxuICAgIF0uZm9yRWFjaChmdW5jdGlvbiAodHlwZU5hbWUpIHtcbiAgICAgICAgZGVmKHR5cGVOYW1lKVxuICAgICAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIiwgXCJUU0hhc09wdGlvbmFsVHlwZVBhcmFtZXRlcnNcIiwgXCJUU0hhc09wdGlvbmFsVHlwZUFubm90YXRpb25cIilcbiAgICAgICAgICAgIC5idWlsZChcInBhcmFtZXRlcnNcIiwgXCJ0eXBlQW5ub3RhdGlvblwiKVxuICAgICAgICAgICAgLmZpZWxkKFwicGFyYW1ldGVyc1wiLCBQYXJhbWV0ZXJzVHlwZSk7XG4gICAgfSk7XG4gICAgZGVmKFwiVFNFbnVtTWVtYmVyXCIpXG4gICAgICAgIC5iYXNlcyhcIk5vZGVcIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJpbml0aWFsaXplclwiKVxuICAgICAgICAuZmllbGQoXCJpZFwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBTdHJpbmdMaXRlcmFsKSlcbiAgICAgICAgLmZpZWxkKFwiaW5pdGlhbGl6ZXJcIiwgb3IoZGVmKFwiRXhwcmVzc2lvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNUeXBlUXVlcnlcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJOYW1lXCIpXG4gICAgICAgIC5maWVsZChcImV4cHJOYW1lXCIsIG9yKFRTRW50aXR5TmFtZSwgZGVmKFwiVFNJbXBvcnRUeXBlXCIpKSk7XG4gICAgLy8gSW5mZXJyZWQgZnJvbSBCYWJ5bG9uJ3MgdHNQYXJzZVR5cGVNZW1iZXIgbWV0aG9kLlxuICAgIHZhciBUU1R5cGVNZW1iZXIgPSBvcihkZWYoXCJUU0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvblwiKSwgZGVmKFwiVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvblwiKSwgZGVmKFwiVFNJbmRleFNpZ25hdHVyZVwiKSwgZGVmKFwiVFNNZXRob2RTaWduYXR1cmVcIiksIGRlZihcIlRTUHJvcGVydHlTaWduYXR1cmVcIikpO1xuICAgIGRlZihcIlRTVHlwZUxpdGVyYWxcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIpXG4gICAgICAgIC5idWlsZChcIm1lbWJlcnNcIilcbiAgICAgICAgLmZpZWxkKFwibWVtYmVyc1wiLCBbVFNUeXBlTWVtYmVyXSk7XG4gICAgZGVmKFwiVFNUeXBlUGFyYW1ldGVyXCIpXG4gICAgICAgIC5iYXNlcyhcIklkZW50aWZpZXJcIilcbiAgICAgICAgLmJ1aWxkKFwibmFtZVwiLCBcImNvbnN0cmFpbnRcIiwgXCJkZWZhdWx0XCIpXG4gICAgICAgIC5maWVsZChcIm5hbWVcIiwgU3RyaW5nKVxuICAgICAgICAuZmllbGQoXCJjb25zdHJhaW50XCIsIG9yKGRlZihcIlRTVHlwZVwiKSwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pXG4gICAgICAgIC5maWVsZChcImRlZmF1bHRcIiwgb3IoZGVmKFwiVFNUeXBlXCIpLCB2b2lkIDApLCBkZWZhdWx0c1tcInVuZGVmaW5lZFwiXSk7XG4gICAgZGVmKFwiVFNUeXBlQXNzZXJ0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkV4cHJlc3Npb25cIiwgXCJQYXR0ZXJuXCIpXG4gICAgICAgIC5idWlsZChcInR5cGVBbm5vdGF0aW9uXCIsIFwiZXhwcmVzc2lvblwiKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBkZWYoXCJUU1R5cGVcIikpXG4gICAgICAgIC5maWVsZChcImV4cHJlc3Npb25cIiwgZGVmKFwiRXhwcmVzc2lvblwiKSlcbiAgICAgICAgLmZpZWxkKFwiZXh0cmFcIiwgb3IoeyBwYXJlbnRoZXNpemVkOiBCb29sZWFuIH0sIG51bGwpLCBkZWZhdWx0c1tcIm51bGxcIl0pO1xuICAgIGRlZihcIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcInBhcmFtc1wiKVxuICAgICAgICAuZmllbGQoXCJwYXJhbXNcIiwgW2RlZihcIlRTVHlwZVBhcmFtZXRlclwiKV0pO1xuICAgIGRlZihcIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbXNcIilcbiAgICAgICAgLmZpZWxkKFwicGFyYW1zXCIsIFtkZWYoXCJUU1R5cGVcIildKTtcbiAgICBkZWYoXCJUU0VudW1EZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcIm1lbWJlcnNcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwiY29uc3RcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyZVwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJtZW1iZXJzXCIsIFtkZWYoXCJUU0VudW1NZW1iZXJcIildKVxuICAgICAgICAuZmllbGQoXCJpbml0aWFsaXplclwiLCBvcihkZWYoXCJFeHByZXNzaW9uXCIpLCBudWxsKSwgZGVmYXVsdHNbXCJudWxsXCJdKTtcbiAgICBkZWYoXCJUU1R5cGVBbGlhc0RlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwidHlwZUFubm90YXRpb25cIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgZGVmKFwiSWRlbnRpZmllclwiKSlcbiAgICAgICAgLmZpZWxkKFwiZGVjbGFyZVwiLCBCb29sZWFuLCBkZWZhdWx0c1tcImZhbHNlXCJdKVxuICAgICAgICAuZmllbGQoXCJ0eXBlQW5ub3RhdGlvblwiLCBkZWYoXCJUU1R5cGVcIikpO1xuICAgIGRlZihcIlRTTW9kdWxlQmxvY2tcIilcbiAgICAgICAgLmJhc2VzKFwiTm9kZVwiKVxuICAgICAgICAuYnVpbGQoXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgW2RlZihcIlN0YXRlbWVudFwiKV0pO1xuICAgIGRlZihcIlRTTW9kdWxlRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJhc2VzKFwiRGVjbGFyYXRpb25cIilcbiAgICAgICAgLmJ1aWxkKFwiaWRcIiwgXCJib2R5XCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIG9yKFN0cmluZ0xpdGVyYWwsIFRTRW50aXR5TmFtZSkpXG4gICAgICAgIC5maWVsZChcImRlY2xhcmVcIiwgQm9vbGVhbiwgZGVmYXVsdHNbXCJmYWxzZVwiXSlcbiAgICAgICAgLmZpZWxkKFwiZ2xvYmFsXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgb3IoZGVmKFwiVFNNb2R1bGVCbG9ja1wiKSwgZGVmKFwiVFNNb2R1bGVEZWNsYXJhdGlvblwiKSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSk7XG4gICAgZGVmKFwiVFNJbXBvcnRUeXBlXCIpXG4gICAgICAgIC5iYXNlcyhcIlRTVHlwZVwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVySW5zdGFudGlhdGlvblwiKVxuICAgICAgICAuYnVpbGQoXCJhcmd1bWVudFwiLCBcInF1YWxpZmllclwiLCBcInR5cGVQYXJhbWV0ZXJzXCIpXG4gICAgICAgIC5maWVsZChcImFyZ3VtZW50XCIsIFN0cmluZ0xpdGVyYWwpXG4gICAgICAgIC5maWVsZChcInF1YWxpZmllclwiLCBvcihUU0VudGl0eU5hbWUsIHZvaWQgMCksIGRlZmF1bHRzW1widW5kZWZpbmVkXCJdKTtcbiAgICBkZWYoXCJUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIsIFwibW9kdWxlUmVmZXJlbmNlXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpXG4gICAgICAgIC5maWVsZChcImlzRXhwb3J0XCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcIm1vZHVsZVJlZmVyZW5jZVwiLCBvcihUU0VudGl0eU5hbWUsIGRlZihcIlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2VcIikpKTtcbiAgICBkZWYoXCJUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBTdHJpbmdMaXRlcmFsKTtcbiAgICBkZWYoXCJUU0V4cG9ydEFzc2lnbm1lbnRcIilcbiAgICAgICAgLmJhc2VzKFwiU3RhdGVtZW50XCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIilcbiAgICAgICAgLmZpZWxkKFwiZXhwcmVzc2lvblwiLCBkZWYoXCJFeHByZXNzaW9uXCIpKTtcbiAgICBkZWYoXCJUU05hbWVzcGFjZUV4cG9ydERlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5iYXNlcyhcIkRlY2xhcmF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImlkXCIpXG4gICAgICAgIC5maWVsZChcImlkXCIsIGRlZihcIklkZW50aWZpZXJcIikpO1xuICAgIGRlZihcIlRTSW50ZXJmYWNlQm9keVwiKVxuICAgICAgICAuYmFzZXMoXCJOb2RlXCIpXG4gICAgICAgIC5idWlsZChcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBbVFNUeXBlTWVtYmVyXSk7XG4gICAgZGVmKFwiVFNFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHNcIilcbiAgICAgICAgLmJhc2VzKFwiVFNUeXBlXCIsIFwiVFNIYXNPcHRpb25hbFR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uXCIpXG4gICAgICAgIC5idWlsZChcImV4cHJlc3Npb25cIiwgXCJ0eXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuZmllbGQoXCJleHByZXNzaW9uXCIsIFRTRW50aXR5TmFtZSk7XG4gICAgZGVmKFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiKVxuICAgICAgICAuYmFzZXMoXCJEZWNsYXJhdGlvblwiLCBcIlRTSGFzT3B0aW9uYWxUeXBlUGFyYW1ldGVyc1wiKVxuICAgICAgICAuYnVpbGQoXCJpZFwiLCBcImJvZHlcIilcbiAgICAgICAgLmZpZWxkKFwiaWRcIiwgVFNFbnRpdHlOYW1lKVxuICAgICAgICAuZmllbGQoXCJkZWNsYXJlXCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcImV4dGVuZHNcIiwgb3IoW2RlZihcIlRTRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzXCIpXSwgbnVsbCksIGRlZmF1bHRzW1wibnVsbFwiXSlcbiAgICAgICAgLmZpZWxkKFwiYm9keVwiLCBkZWYoXCJUU0ludGVyZmFjZUJvZHlcIikpO1xuICAgIGRlZihcIlRTUGFyYW1ldGVyUHJvcGVydHlcIilcbiAgICAgICAgLmJhc2VzKFwiUGF0dGVyblwiKVxuICAgICAgICAuYnVpbGQoXCJwYXJhbWV0ZXJcIilcbiAgICAgICAgLmZpZWxkKFwiYWNjZXNzaWJpbGl0eVwiLCBvcihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pXG4gICAgICAgIC5maWVsZChcInJlYWRvbmx5XCIsIEJvb2xlYW4sIGRlZmF1bHRzW1wiZmFsc2VcIl0pXG4gICAgICAgIC5maWVsZChcInBhcmFtZXRlclwiLCBvcihkZWYoXCJJZGVudGlmaWVyXCIpLCBkZWYoXCJBc3NpZ25tZW50UGF0dGVyblwiKSkpO1xuICAgIGRlZihcIkNsYXNzUHJvcGVydHlcIilcbiAgICAgICAgLmZpZWxkKFwiYWNjZXNzXCIsIC8vIE5vdCBcImFjY2Vzc2liaWxpdHlcIj9cbiAgICBvcihcInB1YmxpY1wiLCBcInByaXZhdGVcIiwgXCJwcm90ZWN0ZWRcIiwgdm9pZCAwKSwgZGVmYXVsdHNbXCJ1bmRlZmluZWRcIl0pO1xuICAgIC8vIERlZmluZWQgYWxyZWFkeSBpbiBlczYgYW5kIGJhYmVsLWNvcmUuXG4gICAgZGVmKFwiQ2xhc3NCb2R5XCIpXG4gICAgICAgIC5maWVsZChcImJvZHlcIiwgW29yKGRlZihcIk1ldGhvZERlZmluaXRpb25cIiksIGRlZihcIlZhcmlhYmxlRGVjbGFyYXRvclwiKSwgZGVmKFwiQ2xhc3NQcm9wZXJ0eURlZmluaXRpb25cIiksIGRlZihcIkNsYXNzUHJvcGVydHlcIiksIGRlZihcIkNsYXNzUHJpdmF0ZVByb3BlcnR5XCIpLCBkZWYoXCJDbGFzc01ldGhvZFwiKSwgZGVmKFwiQ2xhc3NQcml2YXRlTWV0aG9kXCIpLCBcbiAgICAgICAgLy8gSnVzdCBuZWVkIHRvIGFkZCB0aGVzZSB0eXBlczpcbiAgICAgICAgZGVmKFwiVFNEZWNsYXJlTWV0aG9kXCIpLCBUU1R5cGVNZW1iZXIpXSk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2xpYi90eXBlc1wiKSk7XG52YXIgcGF0aF92aXNpdG9yXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9saWIvcGF0aC12aXNpdG9yXCIpKTtcbnZhciBlcXVpdl8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbGliL2VxdWl2XCIpKTtcbnZhciBwYXRoXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9saWIvcGF0aFwiKSk7XG52YXIgbm9kZV9wYXRoXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9saWIvbm9kZS1wYXRoXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShkZWZzKSB7XG4gICAgdmFyIGZvcmsgPSBjcmVhdGVGb3JrKCk7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICBkZWZzLmZvckVhY2goZm9yay51c2UpO1xuICAgIHR5cGVzLmZpbmFsaXplKCk7XG4gICAgdmFyIFBhdGhWaXNpdG9yID0gZm9yay51c2UocGF0aF92aXNpdG9yXzEuZGVmYXVsdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgVHlwZTogdHlwZXMuVHlwZSxcbiAgICAgICAgYnVpbHRJblR5cGVzOiB0eXBlcy5idWlsdEluVHlwZXMsXG4gICAgICAgIG5hbWVkVHlwZXM6IHR5cGVzLm5hbWVkVHlwZXMsXG4gICAgICAgIGJ1aWxkZXJzOiB0eXBlcy5idWlsZGVycyxcbiAgICAgICAgZGVmaW5lTWV0aG9kOiB0eXBlcy5kZWZpbmVNZXRob2QsXG4gICAgICAgIGdldEZpZWxkTmFtZXM6IHR5cGVzLmdldEZpZWxkTmFtZXMsXG4gICAgICAgIGdldEZpZWxkVmFsdWU6IHR5cGVzLmdldEZpZWxkVmFsdWUsXG4gICAgICAgIGVhY2hGaWVsZDogdHlwZXMuZWFjaEZpZWxkLFxuICAgICAgICBzb21lRmllbGQ6IHR5cGVzLnNvbWVGaWVsZCxcbiAgICAgICAgZ2V0U3VwZXJ0eXBlTmFtZXM6IHR5cGVzLmdldFN1cGVydHlwZU5hbWVzLFxuICAgICAgICBnZXRCdWlsZGVyTmFtZTogdHlwZXMuZ2V0QnVpbGRlck5hbWUsXG4gICAgICAgIGFzdE5vZGVzQXJlRXF1aXZhbGVudDogZm9yay51c2UoZXF1aXZfMS5kZWZhdWx0KSxcbiAgICAgICAgZmluYWxpemU6IHR5cGVzLmZpbmFsaXplLFxuICAgICAgICBQYXRoOiBmb3JrLnVzZShwYXRoXzEuZGVmYXVsdCksXG4gICAgICAgIE5vZGVQYXRoOiBmb3JrLnVzZShub2RlX3BhdGhfMS5kZWZhdWx0KSxcbiAgICAgICAgUGF0aFZpc2l0b3I6IFBhdGhWaXNpdG9yLFxuICAgICAgICB1c2U6IGZvcmsudXNlLFxuICAgICAgICB2aXNpdDogUGF0aFZpc2l0b3IudmlzaXQsXG4gICAgfTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRlZmF1bHRfMTtcbmZ1bmN0aW9uIGNyZWF0ZUZvcmsoKSB7XG4gICAgdmFyIHVzZWQgPSBbXTtcbiAgICB2YXIgdXNlZFJlc3VsdCA9IFtdO1xuICAgIGZ1bmN0aW9uIHVzZShwbHVnaW4pIHtcbiAgICAgICAgdmFyIGlkeCA9IHVzZWQuaW5kZXhPZihwbHVnaW4pO1xuICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgaWR4ID0gdXNlZC5sZW5ndGg7XG4gICAgICAgICAgICB1c2VkLnB1c2gocGx1Z2luKTtcbiAgICAgICAgICAgIHVzZWRSZXN1bHRbaWR4XSA9IHBsdWdpbihmb3JrKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXNlZFJlc3VsdFtpZHhdO1xuICAgIH1cbiAgICB2YXIgZm9yayA9IHsgdXNlOiB1c2UgfTtcbiAgICByZXR1cm4gZm9yaztcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubmFtZWRUeXBlcyA9IHZvaWQgMDtcbnZhciBuYW1lZFR5cGVzO1xuKGZ1bmN0aW9uIChuYW1lZFR5cGVzKSB7XG59KShuYW1lZFR5cGVzID0gZXhwb3J0cy5uYW1lZFR5cGVzIHx8IChleHBvcnRzLm5hbWVkVHlwZXMgPSB7fSkpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3R5cGVzXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgZ2V0RmllbGROYW1lcyA9IHR5cGVzLmdldEZpZWxkTmFtZXM7XG4gICAgdmFyIGdldEZpZWxkVmFsdWUgPSB0eXBlcy5nZXRGaWVsZFZhbHVlO1xuICAgIHZhciBpc0FycmF5ID0gdHlwZXMuYnVpbHRJblR5cGVzLmFycmF5O1xuICAgIHZhciBpc09iamVjdCA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5vYmplY3Q7XG4gICAgdmFyIGlzRGF0ZSA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5EYXRlO1xuICAgIHZhciBpc1JlZ0V4cCA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5SZWdFeHA7XG4gICAgdmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4gICAgZnVuY3Rpb24gYXN0Tm9kZXNBcmVFcXVpdmFsZW50KGEsIGIsIHByb2JsZW1QYXRoKSB7XG4gICAgICAgIGlmIChpc0FycmF5LmNoZWNrKHByb2JsZW1QYXRoKSkge1xuICAgICAgICAgICAgcHJvYmxlbVBhdGgubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByb2JsZW1QYXRoID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJlRXF1aXZhbGVudChhLCBiLCBwcm9ibGVtUGF0aCk7XG4gICAgfVxuICAgIGFzdE5vZGVzQXJlRXF1aXZhbGVudC5hc3NlcnQgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICB2YXIgcHJvYmxlbVBhdGggPSBbXTtcbiAgICAgICAgaWYgKCFhc3ROb2Rlc0FyZUVxdWl2YWxlbnQoYSwgYiwgcHJvYmxlbVBhdGgpKSB7XG4gICAgICAgICAgICBpZiAocHJvYmxlbVBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZXMgbXVzdCBiZSBlcXVhbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBkaWZmZXIgaW4gdGhlIGZvbGxvd2luZyBwYXRoOiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHByb2JsZW1QYXRoLm1hcChzdWJzY3JpcHRGb3JQcm9wZXJ0eSkuam9pbihcIlwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIHN1YnNjcmlwdEZvclByb3BlcnR5KHByb3BlcnR5KSB7XG4gICAgICAgIGlmICgvW18kYS16XVtfJGEtejAtOV0qL2kudGVzdChwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgIHJldHVybiBcIi5cIiArIHByb3BlcnR5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIltcIiArIEpTT04uc3RyaW5naWZ5KHByb3BlcnR5KSArIFwiXVwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhcmVFcXVpdmFsZW50KGEsIGIsIHByb2JsZW1QYXRoKSB7XG4gICAgICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBcnJheS5jaGVjayhhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5c0FyZUVxdWl2YWxlbnQoYSwgYiwgcHJvYmxlbVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc09iamVjdC5jaGVjayhhKSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iamVjdHNBcmVFcXVpdmFsZW50KGEsIGIsIHByb2JsZW1QYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNEYXRlLmNoZWNrKGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNEYXRlLmNoZWNrKGIpICYmICgrYSA9PT0gK2IpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JlZ0V4cC5jaGVjayhhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzUmVnRXhwLmNoZWNrKGIpICYmIChhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiZcbiAgICAgICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiZcbiAgICAgICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgICAgICBhLmlnbm9yZUNhc2UgPT09IGIuaWdub3JlQ2FzZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGEgPT0gYjtcbiAgICB9XG4gICAgZnVuY3Rpb24gYXJyYXlzQXJlRXF1aXZhbGVudChhLCBiLCBwcm9ibGVtUGF0aCkge1xuICAgICAgICBpc0FycmF5LmFzc2VydChhKTtcbiAgICAgICAgdmFyIGFMZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgICAgaWYgKCFpc0FycmF5LmNoZWNrKGIpIHx8IGIubGVuZ3RoICE9PSBhTGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAocHJvYmxlbVBhdGgpIHtcbiAgICAgICAgICAgICAgICBwcm9ibGVtUGF0aC5wdXNoKFwibGVuZ3RoXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYUxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAocHJvYmxlbVBhdGgpIHtcbiAgICAgICAgICAgICAgICBwcm9ibGVtUGF0aC5wdXNoKGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgaW4gYSAhPT0gaSBpbiBiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFhcmVFcXVpdmFsZW50KGFbaV0sIGJbaV0sIHByb2JsZW1QYXRoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9ibGVtUGF0aFRhaWwgPSBwcm9ibGVtUGF0aC5wb3AoKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvYmxlbVBhdGhUYWlsICE9PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiICsgcHJvYmxlbVBhdGhUYWlsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9iamVjdHNBcmVFcXVpdmFsZW50KGEsIGIsIHByb2JsZW1QYXRoKSB7XG4gICAgICAgIGlzT2JqZWN0LmFzc2VydChhKTtcbiAgICAgICAgaWYgKCFpc09iamVjdC5jaGVjayhiKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZhc3QgcGF0aCBmb3IgYSBjb21tb24gcHJvcGVydHkgb2YgQVNUIG5vZGVzLlxuICAgICAgICBpZiAoYS50eXBlICE9PSBiLnR5cGUpIHtcbiAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgICAgIHByb2JsZW1QYXRoLnB1c2goXCJ0eXBlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhTmFtZXMgPSBnZXRGaWVsZE5hbWVzKGEpO1xuICAgICAgICB2YXIgYU5hbWVDb3VudCA9IGFOYW1lcy5sZW5ndGg7XG4gICAgICAgIHZhciBiTmFtZXMgPSBnZXRGaWVsZE5hbWVzKGIpO1xuICAgICAgICB2YXIgYk5hbWVDb3VudCA9IGJOYW1lcy5sZW5ndGg7XG4gICAgICAgIGlmIChhTmFtZUNvdW50ID09PSBiTmFtZUNvdW50KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFOYW1lQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgICAgIHZhciBuYW1lID0gYU5hbWVzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBhQ2hpbGQgPSBnZXRGaWVsZFZhbHVlKGEsIG5hbWUpO1xuICAgICAgICAgICAgICAgIHZhciBiQ2hpbGQgPSBnZXRGaWVsZFZhbHVlKGIsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9ibGVtUGF0aC5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWFyZUVxdWl2YWxlbnQoYUNoaWxkLCBiQ2hpbGQsIHByb2JsZW1QYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvYmxlbVBhdGhUYWlsID0gcHJvYmxlbVBhdGgucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9ibGVtUGF0aFRhaWwgIT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiICsgcHJvYmxlbVBhdGhUYWlsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcHJvYmxlbVBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5jZSBhTmFtZUNvdW50ICE9PSBiTmFtZUNvdW50LCB3ZSBuZWVkIHRvIGZpbmQgc29tZSBuYW1lIHRoYXQnc1xuICAgICAgICAvLyBtaXNzaW5nIGluIGFOYW1lcyBidXQgcHJlc2VudCBpbiBiTmFtZXMsIG9yIHZpY2UtdmVyc2EuXG4gICAgICAgIHZhciBzZWVuTmFtZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYU5hbWVDb3VudDsgKytpKSB7XG4gICAgICAgICAgICBzZWVuTmFtZXNbYU5hbWVzW2ldXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGJOYW1lQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgbmFtZSA9IGJOYW1lc1tpXTtcbiAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwoc2Vlbk5hbWVzLCBuYW1lKSkge1xuICAgICAgICAgICAgICAgIHByb2JsZW1QYXRoLnB1c2gobmFtZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIHNlZW5OYW1lc1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKG5hbWUgaW4gc2Vlbk5hbWVzKSB7XG4gICAgICAgICAgICBwcm9ibGVtUGF0aC5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gYXN0Tm9kZXNBcmVFcXVpdmFsZW50O1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGVmYXVsdF8xO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcbiIsIlwidXNlIHN0cmljdFwiOztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIHR5cGVzXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90eXBlc1wiKSk7XG52YXIgcGF0aF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGF0aFwiKSk7XG52YXIgc2NvcGVfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3Njb3BlXCIpKTtcbmZ1bmN0aW9uIG5vZGVQYXRoUGx1Z2luKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBuID0gdHlwZXMubmFtZWRUeXBlcztcbiAgICB2YXIgYiA9IHR5cGVzLmJ1aWxkZXJzO1xuICAgIHZhciBpc051bWJlciA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5udW1iZXI7XG4gICAgdmFyIGlzQXJyYXkgPSB0eXBlcy5idWlsdEluVHlwZXMuYXJyYXk7XG4gICAgdmFyIFBhdGggPSBmb3JrLnVzZShwYXRoXzEuZGVmYXVsdCk7XG4gICAgdmFyIFNjb3BlID0gZm9yay51c2Uoc2NvcGVfMS5kZWZhdWx0KTtcbiAgICB2YXIgTm9kZVBhdGggPSBmdW5jdGlvbiBOb2RlUGF0aCh2YWx1ZSwgcGFyZW50UGF0aCwgbmFtZSkge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlUGF0aCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgaW52b2tlZCB3aXRob3V0ICduZXcnXCIpO1xuICAgICAgICB9XG4gICAgICAgIFBhdGguY2FsbCh0aGlzLCB2YWx1ZSwgcGFyZW50UGF0aCwgbmFtZSk7XG4gICAgfTtcbiAgICB2YXIgTlBwID0gTm9kZVBhdGgucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShQYXRoLnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgICAgdmFsdWU6IE5vZGVQYXRoLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTlBwLCB7XG4gICAgICAgIG5vZGU6IHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5vZGVcIiwge1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9jb21wdXRlTm9kZSgpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcGFyZW50OiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJwYXJlbnRcIiwge1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9jb21wdXRlUGFyZW50KClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJzY29wZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX2NvbXB1dGVTY29wZSgpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBOUHAucmVwbGFjZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMubm9kZTtcbiAgICAgICAgZGVsZXRlIHRoaXMucGFyZW50O1xuICAgICAgICBkZWxldGUgdGhpcy5zY29wZTtcbiAgICAgICAgcmV0dXJuIFBhdGgucHJvdG90eXBlLnJlcGxhY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIE5QcC5wcnVuZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlbWFpbmluZ05vZGVQYXRoID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgIHRoaXMucmVwbGFjZSgpO1xuICAgICAgICByZXR1cm4gY2xlYW5VcE5vZGVzQWZ0ZXJQcnVuZShyZW1haW5pbmdOb2RlUGF0aCk7XG4gICAgfTtcbiAgICAvLyBUaGUgdmFsdWUgb2YgdGhlIGZpcnN0IGFuY2VzdG9yIFBhdGggd2hvc2UgdmFsdWUgaXMgYSBOb2RlLlxuICAgIE5QcC5fY29tcHV0ZU5vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGlmIChuLk5vZGUuY2hlY2sodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBwID0gdGhpcy5wYXJlbnRQYXRoO1xuICAgICAgICByZXR1cm4gcHAgJiYgcHAubm9kZSB8fCBudWxsO1xuICAgIH07XG4gICAgLy8gVGhlIGZpcnN0IGFuY2VzdG9yIFBhdGggd2hvc2UgdmFsdWUgaXMgYSBOb2RlIGRpc3RpbmN0IGZyb20gdGhpcy5ub2RlLlxuICAgIE5QcC5fY29tcHV0ZVBhcmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgdmFyIHBwID0gdGhpcy5wYXJlbnRQYXRoO1xuICAgICAgICBpZiAoIW4uTm9kZS5jaGVjayh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHdoaWxlIChwcCAmJiAhbi5Ob2RlLmNoZWNrKHBwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHBwID0gcHAucGFyZW50UGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcCkge1xuICAgICAgICAgICAgICAgIHBwID0gcHAucGFyZW50UGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAocHAgJiYgIW4uTm9kZS5jaGVjayhwcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHBwID0gcHAucGFyZW50UGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHAgfHwgbnVsbDtcbiAgICB9O1xuICAgIC8vIFRoZSBjbG9zZXN0IGVuY2xvc2luZyBzY29wZSB0aGF0IGdvdmVybnMgdGhpcyBub2RlLlxuICAgIE5QcC5fY29tcHV0ZVNjb3BlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICB2YXIgcHAgPSB0aGlzLnBhcmVudFBhdGg7XG4gICAgICAgIHZhciBzY29wZSA9IHBwICYmIHBwLnNjb3BlO1xuICAgICAgICBpZiAobi5Ob2RlLmNoZWNrKHZhbHVlKSAmJlxuICAgICAgICAgICAgU2NvcGUuaXNFc3RhYmxpc2hlZEJ5KHZhbHVlKSkge1xuICAgICAgICAgICAgc2NvcGUgPSBuZXcgU2NvcGUodGhpcywgc2NvcGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY29wZSB8fCBudWxsO1xuICAgIH07XG4gICAgTlBwLmdldFZhbHVlUHJvcGVydHkgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdHlwZXMuZ2V0RmllbGRWYWx1ZSh0aGlzLnZhbHVlLCBuYW1lKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoaXMubm9kZSBuZWVkcyB0byBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIGluIG9yZGVyXG4gICAgICogZm9yIGEgcGFyc2VyIHRvIHJlcHJvZHVjZSB0aGUgc2FtZSBsb2NhbCBBU1Qgc3RydWN0dXJlLlxuICAgICAqXG4gICAgICogRm9yIGluc3RhbmNlLCBpbiB0aGUgZXhwcmVzc2lvbiBgKDEgKyAyKSAqIDNgLCB0aGUgQmluYXJ5RXhwcmVzc2lvblxuICAgICAqIHdob3NlIG9wZXJhdG9yIGlzIFwiK1wiIG5lZWRzIHBhcmVudGhlc2VzLCBiZWNhdXNlIGAxICsgMiAqIDNgIHdvdWxkXG4gICAgICogcGFyc2UgZGlmZmVyZW50bHkuXG4gICAgICpcbiAgICAgKiBJZiBhc3N1bWVFeHByZXNzaW9uQ29udGV4dCA9PT0gdHJ1ZSwgd2UgZG9uJ3Qgd29ycnkgYWJvdXQgZWRnZSBjYXNlc1xuICAgICAqIGxpa2UgYW4gYW5vbnltb3VzIEZ1bmN0aW9uRXhwcmVzc2lvbiBhcHBlYXJpbmcgbGV4aWNhbGx5IGZpcnN0IGluIGl0c1xuICAgICAqIGVuY2xvc2luZyBzdGF0ZW1lbnQgYW5kIHRodXMgbmVlZGluZyBwYXJlbnRoZXNlcyB0byBhdm9pZCBiZWluZyBwYXJzZWRcbiAgICAgKiBhcyBhIEZ1bmN0aW9uRGVjbGFyYXRpb24gd2l0aCBhIG1pc3NpbmcgbmFtZS5cbiAgICAgKi9cbiAgICBOUHAubmVlZHNQYXJlbnMgPSBmdW5jdGlvbiAoYXNzdW1lRXhwcmVzc2lvbkNvbnRleHQpIHtcbiAgICAgICAgdmFyIHBwID0gdGhpcy5wYXJlbnRQYXRoO1xuICAgICAgICBpZiAoIXBwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAvLyBPbmx5IGV4cHJlc3Npb25zIG5lZWQgcGFyZW50aGVzZXMuXG4gICAgICAgIGlmICghbi5FeHByZXNzaW9uLmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWRlbnRpZmllcnMgbmV2ZXIgbmVlZCBwYXJlbnRoZXNlcy5cbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoIW4uTm9kZS5jaGVjayhwcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHBwID0gcHAucGFyZW50UGF0aDtcbiAgICAgICAgICAgIGlmICghcHApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudCA9IHBwLnZhbHVlO1xuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcIlVuYXJ5RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJTcHJlYWRQcm9wZXJ0eVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5uYW1lID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICYmIHBhcmVudC5vYmplY3QgPT09IG5vZGU7XG4gICAgICAgICAgICBjYXNlIFwiQmluYXJ5RXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQ2FsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWUgPT09IFwiY2FsbGVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXJlbnQuY2FsbGVlID09PSBub2RlO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJTcHJlYWRFbGVtZW50XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJTcHJlYWRQcm9wZXJ0eVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGFyZW50Lm9iamVjdCA9PT0gbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkJpbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkxvZ2ljYWxFeHByZXNzaW9uXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuXzEgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvID0gcGFyZW50Lm9wZXJhdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBwXzEgPSBQUkVDRURFTkNFW3BvXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBubyA9IG5fMS5vcGVyYXRvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBucCA9IFBSRUNFREVOQ0Vbbm9dO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBwXzEgPiBucCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBwXzEgPT09IG5wICYmIHRoaXMubmFtZSA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5yaWdodCAhPT0gbl8xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vZGVzIG11c3QgYmUgZXF1YWxcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcIlNlcXVlbmNlRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkZvclN0YXRlbWVudFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWx0aG91Z2ggcGFyZW50aGVzZXMgd291bGRuJ3QgaHVydCBhcm91bmQgc2VxdWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3Npb25zIGluIHRoZSBoZWFkIG9mIGZvciBsb29wcywgdHJhZGl0aW9uYWwgc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpY3RhdGVzIHRoYXQgZS5nLiBpKyssIGorKyBzaG91bGQgbm90IGJlIHdyYXBwZWQgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50aGVzZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJFeHByZXNzaW9uU3RhdGVtZW50XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lICE9PSBcImV4cHJlc3Npb25cIjtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBlcnIgb24gdGhlIHNpZGUgb2Ygb3ZlcnBhcmVudGhlc2l6YXRpb24sIGFkZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgZXhjZXB0aW9ucyBhYm92ZSBpZiB0aGlzIHByb3ZlcyBvdmVyemVhbG91cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJZaWVsZEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJCaW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJMb2dpY2FsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiVW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJTcHJlYWRFbGVtZW50XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJTcHJlYWRQcm9wZXJ0eVwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiQ2FsbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1lbWJlckV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk5ld0V4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIkNvbmRpdGlvbmFsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiWWllbGRFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiTGl0ZXJhbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQudHlwZSA9PT0gXCJNZW1iZXJFeHByZXNzaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgaXNOdW1iZXIuY2hlY2sobm9kZS52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5uYW1lID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICYmIHBhcmVudC5vYmplY3QgPT09IG5vZGU7XG4gICAgICAgICAgICBjYXNlIFwiQXNzaWdubWVudEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJVbmFyeUV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNwcmVhZEVsZW1lbnRcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIlNwcmVhZFByb3BlcnR5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJCaW5hcnlFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJMb2dpY2FsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJDYWxsRXhwcmVzc2lvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA9PT0gXCJjYWxsZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBhcmVudC5jYWxsZWUgPT09IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWUgPT09IFwidGVzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGFyZW50LnRlc3QgPT09IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJNZW1iZXJFeHByZXNzaW9uXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGFyZW50Lm9iamVjdCA9PT0gbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQudHlwZSA9PT0gXCJOZXdFeHByZXNzaW9uXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lID09PSBcImNhbGxlZVwiICYmXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5jYWxsZWUgPT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zQ2FsbEV4cHJlc3Npb24obm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhc3N1bWVFeHByZXNzaW9uQ29udGV4dCAhPT0gdHJ1ZSAmJlxuICAgICAgICAgICAgIXRoaXMuY2FuQmVGaXJzdEluU3RhdGVtZW50KCkgJiZcbiAgICAgICAgICAgIHRoaXMuZmlyc3RJblN0YXRlbWVudCgpKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGlzQmluYXJ5KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG4uQmluYXJ5RXhwcmVzc2lvbi5jaGVjayhub2RlKVxuICAgICAgICAgICAgfHwgbi5Mb2dpY2FsRXhwcmVzc2lvbi5jaGVjayhub2RlKTtcbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZSAnaXNVbmFyeUxpa2UnIGlzIGRlY2xhcmVkIGJ1dCBpdHMgdmFsdWUgaXMgbmV2ZXIgcmVhZC4gWzYxMzNdXG4gICAgZnVuY3Rpb24gaXNVbmFyeUxpa2Uobm9kZSkge1xuICAgICAgICByZXR1cm4gbi5VbmFyeUV4cHJlc3Npb24uY2hlY2sobm9kZSlcbiAgICAgICAgICAgIC8vIEkgY29uc2lkZXJlZCBtYWtpbmcgU3ByZWFkRWxlbWVudCBhbmQgU3ByZWFkUHJvcGVydHkgc3VidHlwZXNcbiAgICAgICAgICAgIC8vIG9mIFVuYXJ5RXhwcmVzc2lvbiwgYnV0IHRoZXkncmUgbm90IHJlYWxseSBFeHByZXNzaW9uIG5vZGVzLlxuICAgICAgICAgICAgfHwgKG4uU3ByZWFkRWxlbWVudCAmJiBuLlNwcmVhZEVsZW1lbnQuY2hlY2sobm9kZSkpXG4gICAgICAgICAgICB8fCAobi5TcHJlYWRQcm9wZXJ0eSAmJiBuLlNwcmVhZFByb3BlcnR5LmNoZWNrKG5vZGUpKTtcbiAgICB9XG4gICAgdmFyIFBSRUNFREVOQ0UgPSB7fTtcbiAgICBbW1wifHxcIl0sXG4gICAgICAgIFtcIiYmXCJdLFxuICAgICAgICBbXCJ8XCJdLFxuICAgICAgICBbXCJeXCJdLFxuICAgICAgICBbXCImXCJdLFxuICAgICAgICBbXCI9PVwiLCBcIj09PVwiLCBcIiE9XCIsIFwiIT09XCJdLFxuICAgICAgICBbXCI8XCIsIFwiPlwiLCBcIjw9XCIsIFwiPj1cIiwgXCJpblwiLCBcImluc3RhbmNlb2ZcIl0sXG4gICAgICAgIFtcIj4+XCIsIFwiPDxcIiwgXCI+Pj5cIl0sXG4gICAgICAgIFtcIitcIiwgXCItXCJdLFxuICAgICAgICBbXCIqXCIsIFwiL1wiLCBcIiVcIl1cbiAgICBdLmZvckVhY2goZnVuY3Rpb24gKHRpZXIsIGkpIHtcbiAgICAgICAgdGllci5mb3JFYWNoKGZ1bmN0aW9uIChvcCkge1xuICAgICAgICAgICAgUFJFQ0VERU5DRVtvcF0gPSBpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBjb250YWluc0NhbGxFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKG4uQ2FsbEV4cHJlc3Npb24uY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0FycmF5LmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5zb21lKGNvbnRhaW5zQ2FsbEV4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuLk5vZGUuY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlcy5zb21lRmllbGQobm9kZSwgZnVuY3Rpb24gKF9uYW1lLCBjaGlsZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc0NhbGxFeHByZXNzaW9uKGNoaWxkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgTlBwLmNhbkJlRmlyc3RJblN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGU7XG4gICAgICAgIHJldHVybiAhbi5GdW5jdGlvbkV4cHJlc3Npb24uY2hlY2sobm9kZSlcbiAgICAgICAgICAgICYmICFuLk9iamVjdEV4cHJlc3Npb24uY2hlY2sobm9kZSk7XG4gICAgfTtcbiAgICBOUHAuZmlyc3RJblN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0SW5TdGF0ZW1lbnQodGhpcyk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBmaXJzdEluU3RhdGVtZW50KHBhdGgpIHtcbiAgICAgICAgZm9yICh2YXIgbm9kZSwgcGFyZW50OyBwYXRoLnBhcmVudDsgcGF0aCA9IHBhdGgucGFyZW50KSB7XG4gICAgICAgICAgICBub2RlID0gcGF0aC5ub2RlO1xuICAgICAgICAgICAgcGFyZW50ID0gcGF0aC5wYXJlbnQubm9kZTtcbiAgICAgICAgICAgIGlmIChuLkJsb2NrU3RhdGVtZW50LmNoZWNrKHBhcmVudCkgJiZcbiAgICAgICAgICAgICAgICBwYXRoLnBhcmVudC5uYW1lID09PSBcImJvZHlcIiAmJlxuICAgICAgICAgICAgICAgIHBhdGgubmFtZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuYm9keVswXSAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLkV4cHJlc3Npb25TdGF0ZW1lbnQuY2hlY2socGFyZW50KSAmJlxuICAgICAgICAgICAgICAgIHBhdGgubmFtZSA9PT0gXCJleHByZXNzaW9uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50LmV4cHJlc3Npb24gIT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZXMgbXVzdCBiZSBlcXVhbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobi5TZXF1ZW5jZUV4cHJlc3Npb24uY2hlY2socGFyZW50KSAmJlxuICAgICAgICAgICAgICAgIHBhdGgucGFyZW50Lm5hbWUgPT09IFwiZXhwcmVzc2lvbnNcIiAmJlxuICAgICAgICAgICAgICAgIHBhdGgubmFtZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuZXhwcmVzc2lvbnNbMF0gIT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZXMgbXVzdCBiZSBlcXVhbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobi5DYWxsRXhwcmVzc2lvbi5jaGVjayhwYXJlbnQpICYmXG4gICAgICAgICAgICAgICAgcGF0aC5uYW1lID09PSBcImNhbGxlZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5jYWxsZWUgIT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZXMgbXVzdCBiZSBlcXVhbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobi5NZW1iZXJFeHByZXNzaW9uLmNoZWNrKHBhcmVudCkgJiZcbiAgICAgICAgICAgICAgICBwYXRoLm5hbWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Lm9iamVjdCAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLkNvbmRpdGlvbmFsRXhwcmVzc2lvbi5jaGVjayhwYXJlbnQpICYmXG4gICAgICAgICAgICAgICAgcGF0aC5uYW1lID09PSBcInRlc3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQudGVzdCAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0JpbmFyeShwYXJlbnQpICYmXG4gICAgICAgICAgICAgICAgcGF0aC5uYW1lID09PSBcImxlZnRcIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQubGVmdCAhPT0gbm9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlcyBtdXN0IGJlIGVxdWFsXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuLlVuYXJ5RXhwcmVzc2lvbi5jaGVjayhwYXJlbnQpICYmXG4gICAgICAgICAgICAgICAgIXBhcmVudC5wcmVmaXggJiZcbiAgICAgICAgICAgICAgICBwYXRoLm5hbWUgPT09IFwiYXJndW1lbnRcIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuYXJndW1lbnQgIT09IG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZXMgbXVzdCBiZSBlcXVhbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBydW5pbmcgY2VydGFpbiBub2RlcyB3aWxsIHJlc3VsdCBpbiBlbXB0eSBvciBpbmNvbXBsZXRlIG5vZGVzLCBoZXJlIHdlIGNsZWFuIHRob3NlIG5vZGVzIHVwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsZWFuVXBOb2Rlc0FmdGVyUHJ1bmUocmVtYWluaW5nTm9kZVBhdGgpIHtcbiAgICAgICAgaWYgKG4uVmFyaWFibGVEZWNsYXJhdGlvbi5jaGVjayhyZW1haW5pbmdOb2RlUGF0aC5ub2RlKSkge1xuICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHJlbWFpbmluZ05vZGVQYXRoLmdldCgnZGVjbGFyYXRpb25zJykudmFsdWU7XG4gICAgICAgICAgICBpZiAoIWRlY2xhcmF0aW9ucyB8fCBkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZ05vZGVQYXRoLnBydW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobi5FeHByZXNzaW9uU3RhdGVtZW50LmNoZWNrKHJlbWFpbmluZ05vZGVQYXRoLm5vZGUpKSB7XG4gICAgICAgICAgICBpZiAoIXJlbWFpbmluZ05vZGVQYXRoLmdldCgnZXhwcmVzc2lvbicpLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZ05vZGVQYXRoLnBydW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobi5JZlN0YXRlbWVudC5jaGVjayhyZW1haW5pbmdOb2RlUGF0aC5ub2RlKSkge1xuICAgICAgICAgICAgY2xlYW5VcElmU3RhdGVtZW50QWZ0ZXJQcnVuZShyZW1haW5pbmdOb2RlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbWFpbmluZ05vZGVQYXRoO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjbGVhblVwSWZTdGF0ZW1lbnRBZnRlclBydW5lKGlmU3RhdGVtZW50KSB7XG4gICAgICAgIHZhciB0ZXN0RXhwcmVzc2lvbiA9IGlmU3RhdGVtZW50LmdldCgndGVzdCcpLnZhbHVlO1xuICAgICAgICB2YXIgYWx0ZXJuYXRlID0gaWZTdGF0ZW1lbnQuZ2V0KCdhbHRlcm5hdGUnKS52YWx1ZTtcbiAgICAgICAgdmFyIGNvbnNlcXVlbnQgPSBpZlN0YXRlbWVudC5nZXQoJ2NvbnNlcXVlbnQnKS52YWx1ZTtcbiAgICAgICAgaWYgKCFjb25zZXF1ZW50ICYmICFhbHRlcm5hdGUpIHtcbiAgICAgICAgICAgIHZhciB0ZXN0RXhwcmVzc2lvblN0YXRlbWVudCA9IGIuZXhwcmVzc2lvblN0YXRlbWVudCh0ZXN0RXhwcmVzc2lvbik7XG4gICAgICAgICAgICBpZlN0YXRlbWVudC5yZXBsYWNlKHRlc3RFeHByZXNzaW9uU3RhdGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghY29uc2VxdWVudCAmJiBhbHRlcm5hdGUpIHtcbiAgICAgICAgICAgIHZhciBuZWdhdGVkVGVzdEV4cHJlc3Npb24gPSBiLnVuYXJ5RXhwcmVzc2lvbignIScsIHRlc3RFeHByZXNzaW9uLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChuLlVuYXJ5RXhwcmVzc2lvbi5jaGVjayh0ZXN0RXhwcmVzc2lvbikgJiYgdGVzdEV4cHJlc3Npb24ub3BlcmF0b3IgPT09ICchJykge1xuICAgICAgICAgICAgICAgIG5lZ2F0ZWRUZXN0RXhwcmVzc2lvbiA9IHRlc3RFeHByZXNzaW9uLmFyZ3VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWZTdGF0ZW1lbnQuZ2V0KFwidGVzdFwiKS5yZXBsYWNlKG5lZ2F0ZWRUZXN0RXhwcmVzc2lvbik7XG4gICAgICAgICAgICBpZlN0YXRlbWVudC5nZXQoXCJjb25zZXF1ZW50XCIpLnJlcGxhY2UoYWx0ZXJuYXRlKTtcbiAgICAgICAgICAgIGlmU3RhdGVtZW50LmdldChcImFsdGVybmF0ZVwiKS5yZXBsYWNlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE5vZGVQYXRoO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gbm9kZVBhdGhQbHVnaW47XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3R5cGVzXCIpKTtcbnZhciBub2RlX3BhdGhfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL25vZGUtcGF0aFwiKSk7XG52YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIHBhdGhWaXNpdG9yUGx1Z2luKGZvcmspIHtcbiAgICB2YXIgdHlwZXMgPSBmb3JrLnVzZSh0eXBlc18xLmRlZmF1bHQpO1xuICAgIHZhciBOb2RlUGF0aCA9IGZvcmsudXNlKG5vZGVfcGF0aF8xLmRlZmF1bHQpO1xuICAgIHZhciBpc0FycmF5ID0gdHlwZXMuYnVpbHRJblR5cGVzLmFycmF5O1xuICAgIHZhciBpc09iamVjdCA9IHR5cGVzLmJ1aWx0SW5UeXBlcy5vYmplY3Q7XG4gICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlcy5idWlsdEluVHlwZXMuZnVuY3Rpb247XG4gICAgdmFyIHVuZGVmaW5lZDtcbiAgICB2YXIgUGF0aFZpc2l0b3IgPSBmdW5jdGlvbiBQYXRoVmlzaXRvcigpIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhdGhWaXNpdG9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aFZpc2l0b3IgY29uc3RydWN0b3IgY2Fubm90IGJlIGludm9rZWQgd2l0aG91dCAnbmV3J1wiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQZXJtYW5lbnQgc3RhdGUuXG4gICAgICAgIHRoaXMuX3JldXNhYmxlQ29udGV4dFN0YWNrID0gW107XG4gICAgICAgIHRoaXMuX21ldGhvZE5hbWVUYWJsZSA9IGNvbXB1dGVNZXRob2ROYW1lVGFibGUodGhpcyk7XG4gICAgICAgIHRoaXMuX3Nob3VsZFZpc2l0Q29tbWVudHMgPVxuICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcy5fbWV0aG9kTmFtZVRhYmxlLCBcIkJsb2NrXCIpIHx8XG4gICAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcy5fbWV0aG9kTmFtZVRhYmxlLCBcIkxpbmVcIik7XG4gICAgICAgIHRoaXMuQ29udGV4dCA9IG1ha2VDb250ZXh0Q29uc3RydWN0b3IodGhpcyk7XG4gICAgICAgIC8vIFN0YXRlIHJlc2V0IGV2ZXJ5IHRpbWUgUGF0aFZpc2l0b3IucHJvdG90eXBlLnZpc2l0IGlzIGNhbGxlZC5cbiAgICAgICAgdGhpcy5fdmlzaXRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY2hhbmdlUmVwb3J0ZWQgPSBmYWxzZTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXRob2ROYW1lVGFibGUodmlzaXRvcikge1xuICAgICAgICB2YXIgdHlwZU5hbWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yICh2YXIgbWV0aG9kTmFtZSBpbiB2aXNpdG9yKSB7XG4gICAgICAgICAgICBpZiAoL152aXNpdFtBLVpdLy50ZXN0KG1ldGhvZE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdHlwZU5hbWVzW21ldGhvZE5hbWUuc2xpY2UoXCJ2aXNpdFwiLmxlbmd0aCldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgc3VwZXJ0eXBlVGFibGUgPSB0eXBlcy5jb21wdXRlU3VwZXJ0eXBlTG9va3VwVGFibGUodHlwZU5hbWVzKTtcbiAgICAgICAgdmFyIG1ldGhvZE5hbWVUYWJsZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHZhciB0eXBlTmFtZUtleXMgPSBPYmplY3Qua2V5cyhzdXBlcnR5cGVUYWJsZSk7XG4gICAgICAgIHZhciB0eXBlTmFtZUNvdW50ID0gdHlwZU5hbWVLZXlzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlTmFtZUNvdW50OyArK2kpIHtcbiAgICAgICAgICAgIHZhciB0eXBlTmFtZSA9IHR5cGVOYW1lS2V5c1tpXTtcbiAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBcInZpc2l0XCIgKyBzdXBlcnR5cGVUYWJsZVt0eXBlTmFtZV07XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbi5jaGVjayh2aXNpdG9yW21ldGhvZE5hbWVdKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZE5hbWVUYWJsZVt0eXBlTmFtZV0gPSBtZXRob2ROYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRob2ROYW1lVGFibGU7XG4gICAgfVxuICAgIFBhdGhWaXNpdG9yLmZyb21NZXRob2RzT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU1ldGhvZHNPYmplY3QobWV0aG9kcykge1xuICAgICAgICBpZiAobWV0aG9kcyBpbnN0YW5jZW9mIFBhdGhWaXNpdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzT2JqZWN0LmNoZWNrKG1ldGhvZHMpKSB7XG4gICAgICAgICAgICAvLyBBbiBlbXB0eSB2aXNpdG9yP1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXRoVmlzaXRvcjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgVmlzaXRvciA9IGZ1bmN0aW9uIFZpc2l0b3IoKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVmlzaXRvcikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWaXNpdG9yIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBpbnZva2VkIHdpdGhvdXQgJ25ldydcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBQYXRoVmlzaXRvci5jYWxsKHRoaXMpO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgVnAgPSBWaXNpdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoUFZwKTtcbiAgICAgICAgVnAuY29uc3RydWN0b3IgPSBWaXNpdG9yO1xuICAgICAgICBleHRlbmQoVnAsIG1ldGhvZHMpO1xuICAgICAgICBleHRlbmQoVmlzaXRvciwgUGF0aFZpc2l0b3IpO1xuICAgICAgICBpc0Z1bmN0aW9uLmFzc2VydChWaXNpdG9yLmZyb21NZXRob2RzT2JqZWN0KTtcbiAgICAgICAgaXNGdW5jdGlvbi5hc3NlcnQoVmlzaXRvci52aXNpdCk7XG4gICAgICAgIHJldHVybiBuZXcgVmlzaXRvcjtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGV4dGVuZCh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChzb3VyY2UsIHByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wZXJ0eV0gPSBzb3VyY2VbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIFBhdGhWaXNpdG9yLnZpc2l0ID0gZnVuY3Rpb24gdmlzaXQobm9kZSwgbWV0aG9kcykge1xuICAgICAgICByZXR1cm4gUGF0aFZpc2l0b3IuZnJvbU1ldGhvZHNPYmplY3QobWV0aG9kcykudmlzaXQobm9kZSk7XG4gICAgfTtcbiAgICB2YXIgUFZwID0gUGF0aFZpc2l0b3IucHJvdG90eXBlO1xuICAgIFBWcC52aXNpdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Zpc2l0aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWN1cnNpdmVseSBjYWxsaW5nIHZpc2l0b3IudmlzaXQocGF0aCkgcmVzZXRzIHZpc2l0b3Igc3RhdGUuIFwiICtcbiAgICAgICAgICAgICAgICBcIlRyeSB0aGlzLnZpc2l0KHBhdGgpIG9yIHRoaXMudHJhdmVyc2UocGF0aCkgaW5zdGVhZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJpdmF0ZSBzdGF0ZSB0aGF0IG5lZWRzIHRvIGJlIHJlc2V0IGJlZm9yZSBldmVyeSB0cmF2ZXJzYWwuXG4gICAgICAgIHRoaXMuX3Zpc2l0aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY2hhbmdlUmVwb3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYWJvcnRSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGFyZ2MgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmdjKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdjOyArK2kpIHtcbiAgICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoYXJnc1swXSBpbnN0YW5jZW9mIE5vZGVQYXRoKSkge1xuICAgICAgICAgICAgYXJnc1swXSA9IG5ldyBOb2RlUGF0aCh7IHJvb3Q6IGFyZ3NbMF0gfSkuZ2V0KFwicm9vdFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYWxsZWQgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgYXMgLnZpc2l0LlxuICAgICAgICB0aGlzLnJlc2V0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB2YXIgZGlkTm90VGhyb3c7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgcm9vdCA9IHRoaXMudmlzaXRXaXRob3V0UmVzZXQoYXJnc1swXSk7XG4gICAgICAgICAgICBkaWROb3RUaHJvdyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl92aXNpdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFkaWROb3RUaHJvdyAmJiB0aGlzLl9hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMudmlzaXRXaXRob3V0UmVzZXQgdGhyZXcgYW4gZXhjZXB0aW9uIGFuZFxuICAgICAgICAgICAgICAgIC8vIHRoaXMuX2Fib3J0UmVxdWVzdGVkIHdhcyBzZXQgdG8gdHJ1ZSwgcmV0dXJuIHRoZSByb290IG9mXG4gICAgICAgICAgICAgICAgLy8gdGhlIEFTVCBpbnN0ZWFkIG9mIGxldHRpbmcgdGhlIGV4Y2VwdGlvbiBwcm9wYWdhdGUsIHNvIHRoYXRcbiAgICAgICAgICAgICAgICAvLyBjbGllbnQgY29kZSBkb2VzIG5vdCBoYXZlIHRvIHByb3ZpZGUgYSB0cnktY2F0Y2ggYmxvY2sgdG9cbiAgICAgICAgICAgICAgICAvLyBpbnRlcmNlcHQgdGhlIEFib3J0UmVxdWVzdCBleGNlcHRpb24uICBPdGhlciBraW5kcyBvZlxuICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbnMgd2lsbCBwcm9wYWdhdGUgd2l0aG91dCBiZWluZyBpbnRlcmNlcHRlZCBhbmRcbiAgICAgICAgICAgICAgICAvLyByZXRocm93biBieSBhIGNhdGNoIGJsb2NrLCBzbyB0aGVpciBzdGFja3Mgd2lsbCBhY2N1cmF0ZWx5XG4gICAgICAgICAgICAgICAgLy8gcmVmbGVjdCB0aGUgb3JpZ2luYWwgdGhyb3dpbmcgY29udGV4dC5cbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnc1swXS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9vdDtcbiAgICB9O1xuICAgIFBWcC5BYm9ydFJlcXVlc3QgPSBmdW5jdGlvbiBBYm9ydFJlcXVlc3QoKSB7IH07XG4gICAgUFZwLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmlzaXRvciA9IHRoaXM7XG4gICAgICAgIHZpc2l0b3IuX2Fib3J0UmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgdmlzaXRvci5BYm9ydFJlcXVlc3QoKTtcbiAgICAgICAgLy8gSWYgeW91IGRlY2lkZSB0byBjYXRjaCB0aGlzIGV4Y2VwdGlvbiBhbmQgc3RvcCBpdCBmcm9tIHByb3BhZ2F0aW5nLFxuICAgICAgICAvLyBtYWtlIHN1cmUgdG8gY2FsbCBpdHMgY2FuY2VsIG1ldGhvZCB0byBhdm9pZCBzaWxlbmNpbmcgb3RoZXJcbiAgICAgICAgLy8gZXhjZXB0aW9ucyB0aGF0IG1pZ2h0IGJlIHRocm93biBsYXRlciBpbiB0aGUgdHJhdmVyc2FsLlxuICAgICAgICByZXF1ZXN0LmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZpc2l0b3IuX2Fib3J0UmVxdWVzdGVkID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIHRocm93IHJlcXVlc3Q7XG4gICAgfTtcbiAgICBQVnAucmVzZXQgPSBmdW5jdGlvbiAoX3BhdGggLyosIGFkZGl0aW9uYWwgYXJndW1lbnRzICovKSB7XG4gICAgICAgIC8vIEVtcHR5IHN0dWI7IG1heSBiZSByZWFzc2lnbmVkIG9yIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy5cbiAgICB9O1xuICAgIFBWcC52aXNpdFdpdGhvdXRSZXNldCA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSB7XG4gICAgICAgICAgICAvLyBTaW5jZSB0aGlzLkNvbnRleHQucHJvdG90eXBlID09PSB0aGlzLCB0aGVyZSdzIGEgY2hhbmNlIHdlXG4gICAgICAgICAgICAvLyBtaWdodCBhY2NpZGVudGFsbHkgY2FsbCBjb250ZXh0LnZpc2l0V2l0aG91dFJlc2V0LiBJZiB0aGF0XG4gICAgICAgICAgICAvLyBoYXBwZW5zLCByZS1pbnZva2UgdGhlIG1ldGhvZCBhZ2FpbnN0IGNvbnRleHQudmlzaXRvci5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZpc2l0b3IudmlzaXRXaXRob3V0UmVzZXQocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEocGF0aCBpbnN0YW5jZW9mIE5vZGVQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhdGgudmFsdWU7XG4gICAgICAgIHZhciBtZXRob2ROYW1lID0gdmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlLnR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIHRoaXMuX21ldGhvZE5hbWVUYWJsZVt2YWx1ZS50eXBlXTtcbiAgICAgICAgaWYgKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5hY3F1aXJlQ29udGV4dChwYXRoKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuaW52b2tlVmlzaXRvck1ldGhvZChtZXRob2ROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVsZWFzZUNvbnRleHQoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXMgbm8gdmlzaXRvciBtZXRob2QgdG8gY2FsbCwgdmlzaXQgdGhlIGNoaWxkcmVuIG9mXG4gICAgICAgICAgICAvLyB0aGlzIG5vZGUgZ2VuZXJpY2FsbHkuXG4gICAgICAgICAgICByZXR1cm4gdmlzaXRDaGlsZHJlbihwYXRoLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgZnVuY3Rpb24gdmlzaXRDaGlsZHJlbihwYXRoLCB2aXNpdG9yKSB7XG4gICAgICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh2aXNpdG9yIGluc3RhbmNlb2YgUGF0aFZpc2l0b3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHZhbHVlID0gcGF0aC52YWx1ZTtcbiAgICAgICAgaWYgKGlzQXJyYXkuY2hlY2sodmFsdWUpKSB7XG4gICAgICAgICAgICBwYXRoLmVhY2godmlzaXRvci52aXNpdFdpdGhvdXRSZXNldCwgdmlzaXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0LmNoZWNrKHZhbHVlKSkge1xuICAgICAgICAgICAgLy8gTm8gY2hpbGRyZW4gdG8gdmlzaXQuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgY2hpbGROYW1lcyA9IHR5cGVzLmdldEZpZWxkTmFtZXModmFsdWUpO1xuICAgICAgICAgICAgLy8gVGhlIC5jb21tZW50cyBmaWVsZCBvZiB0aGUgTm9kZSB0eXBlIGlzIGhpZGRlbiwgc28gd2Ugb25seVxuICAgICAgICAgICAgLy8gdmlzaXQgaXQgaWYgdGhlIHZpc2l0b3IgZGVmaW5lcyB2aXNpdEJsb2NrIG9yIHZpc2l0TGluZSwgYW5kXG4gICAgICAgICAgICAvLyB2YWx1ZS5jb21tZW50cyBpcyBkZWZpbmVkLlxuICAgICAgICAgICAgaWYgKHZpc2l0b3IuX3Nob3VsZFZpc2l0Q29tbWVudHMgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZS5jb21tZW50cyAmJlxuICAgICAgICAgICAgICAgIGNoaWxkTmFtZXMuaW5kZXhPZihcImNvbW1lbnRzXCIpIDwgMCkge1xuICAgICAgICAgICAgICAgIGNoaWxkTmFtZXMucHVzaChcImNvbW1lbnRzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGNoaWxkQ291bnQgPSBjaGlsZE5hbWVzLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBjaGlsZFBhdGhzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7ICsraSkge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZE5hbWUgPSBjaGlsZE5hbWVzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwodmFsdWUsIGNoaWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbY2hpbGROYW1lXSA9IHR5cGVzLmdldEZpZWxkVmFsdWUodmFsdWUsIGNoaWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoaWxkUGF0aHMucHVzaChwYXRoLmdldChjaGlsZE5hbWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgKytpKSB7XG4gICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdFdpdGhvdXRSZXNldChjaGlsZFBhdGhzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aC52YWx1ZTtcbiAgICB9XG4gICAgUFZwLmFjcXVpcmVDb250ZXh0ID0gZnVuY3Rpb24gKHBhdGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JldXNhYmxlQ29udGV4dFN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLkNvbnRleHQocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JldXNhYmxlQ29udGV4dFN0YWNrLnBvcCgpLnJlc2V0KHBhdGgpO1xuICAgIH07XG4gICAgUFZwLnJlbGVhc2VDb250ZXh0ID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCEoY29udGV4dCBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZXVzYWJsZUNvbnRleHRTdGFjay5wdXNoKGNvbnRleHQpO1xuICAgICAgICBjb250ZXh0LmN1cnJlbnRQYXRoID0gbnVsbDtcbiAgICB9O1xuICAgIFBWcC5yZXBvcnRDaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9jaGFuZ2VSZXBvcnRlZCA9IHRydWU7XG4gICAgfTtcbiAgICBQVnAud2FzQ2hhbmdlUmVwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFuZ2VSZXBvcnRlZDtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIG1ha2VDb250ZXh0Q29uc3RydWN0b3IodmlzaXRvcikge1xuICAgICAgICBmdW5jdGlvbiBDb250ZXh0KHBhdGgpIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXRoVmlzaXRvcikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShwYXRoIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwidmlzaXRvclwiLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZpc2l0b3IsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYXRoID0gcGF0aDtcbiAgICAgICAgICAgIHRoaXMubmVlZFRvQ2FsbFRyYXZlcnNlID0gdHJ1ZTtcbiAgICAgICAgICAgIE9iamVjdC5zZWFsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHZpc2l0b3IgaW5zdGFuY2VvZiBQYXRoVmlzaXRvcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIHZpc2l0b3Igb2JqZWN0IGlzIHRoZSBwcm90b3R5cGUgb2YgQ29udGV4dC5wcm90b3R5cGUsXG4gICAgICAgIC8vIHNvIGFsbCB2aXNpdG9yIG1ldGhvZHMgYXJlIGluaGVyaXRlZCBieSBjb250ZXh0IG9iamVjdHMuXG4gICAgICAgIHZhciBDcCA9IENvbnRleHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh2aXNpdG9yKTtcbiAgICAgICAgQ3AuY29uc3RydWN0b3IgPSBDb250ZXh0O1xuICAgICAgICBleHRlbmQoQ3AsIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMpO1xuICAgICAgICByZXR1cm4gQ29udGV4dDtcbiAgICB9XG4gICAgLy8gRXZlcnkgUGF0aFZpc2l0b3IgaGFzIGEgZGlmZmVyZW50IHRoaXMuQ29udGV4dCBjb25zdHJ1Y3RvciBhbmRcbiAgICAvLyB0aGlzLkNvbnRleHQucHJvdG90eXBlIG9iamVjdCwgYnV0IHRob3NlIHByb3RvdHlwZXMgY2FuIGFsbCB1c2UgdGhlXG4gICAgLy8gc2FtZSByZXNldCwgaW52b2tlVmlzaXRvck1ldGhvZCwgYW5kIHRyYXZlcnNlIGZ1bmN0aW9uIG9iamVjdHMuXG4gICAgdmFyIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMucmVzZXQgPVxuICAgICAgICBmdW5jdGlvbiByZXNldChwYXRoKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYXRoID0gcGF0aDtcbiAgICAgICAgICAgIHRoaXMubmVlZFRvQ2FsbFRyYXZlcnNlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMuaW52b2tlVmlzaXRvck1ldGhvZCA9XG4gICAgICAgIGZ1bmN0aW9uIGludm9rZVZpc2l0b3JNZXRob2QobWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISh0aGlzLmN1cnJlbnRQYXRoIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMudmlzaXRvclttZXRob2ROYW1lXS5jYWxsKHRoaXMsIHRoaXMuY3VycmVudFBhdGgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAvLyBWaXNpdG9yIG1ldGhvZHMgcmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhleSBoYXZlIGhhbmRsZWRcbiAgICAgICAgICAgICAgICAvLyB0aGVpciBvd24gdHJhdmVyc2FsIG5lZWRzLCBhbmQgd2Ugc2hvdWxkIG5vdCBjb21wbGFpbiBpZlxuICAgICAgICAgICAgICAgIC8vIHRoaXMubmVlZFRvQ2FsbFRyYXZlcnNlIGlzIHN0aWxsIHRydWUuXG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gQW55IG90aGVyIG5vbi11bmRlZmluZWQgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgdmlzaXRvciBtZXRob2RcbiAgICAgICAgICAgICAgICAvLyBpcyBpbnRlcnByZXRlZCBhcyBhIHJlcGxhY2VtZW50IHZhbHVlLlxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhdGggPSB0aGlzLmN1cnJlbnRQYXRoLnJlcGxhY2UocmVzdWx0KVswXTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcy50cmF2ZXJzZSBzdGlsbCBoYXNuJ3QgYmVlbiBjYWxsZWQsIHZpc2l0IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBjaGlsZHJlbiBvZiB0aGUgcmVwbGFjZW1lbnQgbm9kZS5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmF2ZXJzZSh0aGlzLmN1cnJlbnRQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBlaXRoZXIgY2FsbCB0aGlzLnRyYXZlcnNlIG9yIHJldHVybiBmYWxzZSBpbiBcIiArIG1ldGhvZE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLmN1cnJlbnRQYXRoO1xuICAgICAgICAgICAgcmV0dXJuIHBhdGggJiYgcGF0aC52YWx1ZTtcbiAgICAgICAgfTtcbiAgICBzaGFyZWRDb250ZXh0UHJvdG9NZXRob2RzLnRyYXZlcnNlID1cbiAgICAgICAgZnVuY3Rpb24gdHJhdmVyc2UocGF0aCwgbmV3VmlzaXRvcikge1xuICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHRoaXMuQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShwYXRoIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEodGhpcy5jdXJyZW50UGF0aCBpbnN0YW5jZW9mIE5vZGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmVlZFRvQ2FsbFRyYXZlcnNlID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdmlzaXRDaGlsZHJlbihwYXRoLCBQYXRoVmlzaXRvci5mcm9tTWV0aG9kc09iamVjdChuZXdWaXNpdG9yIHx8IHRoaXMudmlzaXRvcikpO1xuICAgICAgICB9O1xuICAgIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMudmlzaXQgPVxuICAgICAgICBmdW5jdGlvbiB2aXNpdChwYXRoLCBuZXdWaXNpdG9yKSB7XG4gICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgdGhpcy5Db250ZXh0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghKHBhdGggaW5zdGFuY2VvZiBOb2RlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISh0aGlzLmN1cnJlbnRQYXRoIGluc3RhbmNlb2YgTm9kZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBQYXRoVmlzaXRvci5mcm9tTWV0aG9kc09iamVjdChuZXdWaXNpdG9yIHx8IHRoaXMudmlzaXRvcikudmlzaXRXaXRob3V0UmVzZXQocGF0aCk7XG4gICAgICAgIH07XG4gICAgc2hhcmVkQ29udGV4dFByb3RvTWV0aG9kcy5yZXBvcnRDaGFuZ2VkID0gZnVuY3Rpb24gcmVwb3J0Q2hhbmdlZCgpIHtcbiAgICAgICAgdGhpcy52aXNpdG9yLnJlcG9ydENoYW5nZWQoKTtcbiAgICB9O1xuICAgIHNoYXJlZENvbnRleHRQcm90b01ldGhvZHMuYWJvcnQgPSBmdW5jdGlvbiBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5uZWVkVG9DYWxsVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52aXNpdG9yLmFib3J0KCk7XG4gICAgfTtcbiAgICByZXR1cm4gUGF0aFZpc2l0b3I7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBwYXRoVmlzaXRvclBsdWdpbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdHlwZXNcIikpO1xudmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIHBhdGhQbHVnaW4oZm9yaykge1xuICAgIHZhciB0eXBlcyA9IGZvcmsudXNlKHR5cGVzXzEuZGVmYXVsdCk7XG4gICAgdmFyIGlzQXJyYXkgPSB0eXBlcy5idWlsdEluVHlwZXMuYXJyYXk7XG4gICAgdmFyIGlzTnVtYmVyID0gdHlwZXMuYnVpbHRJblR5cGVzLm51bWJlcjtcbiAgICB2YXIgUGF0aCA9IGZ1bmN0aW9uIFBhdGgodmFsdWUsIHBhcmVudFBhdGgsIG5hbWUpIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhdGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBpbnZva2VkIHdpdGhvdXQgJ25ldydcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudFBhdGgpIHtcbiAgICAgICAgICAgIGlmICghKHBhcmVudFBhdGggaW5zdGFuY2VvZiBQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudFBhdGggPSBudWxsO1xuICAgICAgICAgICAgbmFtZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHZhbHVlIGVuY2Fwc3VsYXRlZCBieSB0aGlzIFBhdGgsIGdlbmVyYWxseSBlcXVhbCB0b1xuICAgICAgICAvLyBwYXJlbnRQYXRoLnZhbHVlW25hbWVdIGlmIHdlIGhhdmUgYSBwYXJlbnRQYXRoLlxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIC8vIFRoZSBpbW1lZGlhdGUgcGFyZW50IFBhdGggb2YgdGhpcyBQYXRoLlxuICAgICAgICB0aGlzLnBhcmVudFBhdGggPSBwYXJlbnRQYXRoO1xuICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb2YgcGFyZW50UGF0aC52YWx1ZSB0aHJvdWdoIHdoaWNoIHRoaXNcbiAgICAgICAgLy8gUGF0aCdzIHZhbHVlIHdhcyByZWFjaGVkLlxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICAvLyBDYWxsaW5nIHBhdGguZ2V0KFwiY2hpbGRcIikgbXVsdGlwbGUgdGltZXMgYWx3YXlzIHJldHVybnMgdGhlIHNhbWVcbiAgICAgICAgLy8gY2hpbGQgUGF0aCBvYmplY3QsIGZvciBib3RoIHBlcmZvcm1hbmNlIGFuZCBjb25zaXN0ZW5jeSByZWFzb25zLlxuICAgICAgICB0aGlzLl9fY2hpbGRDYWNoZSA9IG51bGw7XG4gICAgfTtcbiAgICB2YXIgUHAgPSBQYXRoLnByb3RvdHlwZTtcbiAgICBmdW5jdGlvbiBnZXRDaGlsZENhY2hlKHBhdGgpIHtcbiAgICAgICAgLy8gTGF6aWx5IGNyZWF0ZSB0aGUgY2hpbGQgY2FjaGUuIFRoaXMgYWxzbyBjaGVhcGVucyBjYWNoZVxuICAgICAgICAvLyBpbnZhbGlkYXRpb24sIHNpbmNlIHlvdSBjYW4ganVzdCByZXNldCBwYXRoLl9fY2hpbGRDYWNoZSB0byBudWxsLlxuICAgICAgICByZXR1cm4gcGF0aC5fX2NoaWxkQ2FjaGUgfHwgKHBhdGguX19jaGlsZENhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldENoaWxkUGF0aChwYXRoLCBuYW1lKSB7XG4gICAgICAgIHZhciBjYWNoZSA9IGdldENoaWxkQ2FjaGUocGF0aCk7XG4gICAgICAgIHZhciBhY3R1YWxDaGlsZFZhbHVlID0gcGF0aC5nZXRWYWx1ZVByb3BlcnR5KG5hbWUpO1xuICAgICAgICB2YXIgY2hpbGRQYXRoID0gY2FjaGVbbmFtZV07XG4gICAgICAgIGlmICghaGFzT3duLmNhbGwoY2FjaGUsIG5hbWUpIHx8XG4gICAgICAgICAgICAvLyBFbnN1cmUgY29uc2lzdGVuY3kgYmV0d2VlbiBjYWNoZSBhbmQgcmVhbGl0eS5cbiAgICAgICAgICAgIGNoaWxkUGF0aC52YWx1ZSAhPT0gYWN0dWFsQ2hpbGRWYWx1ZSkge1xuICAgICAgICAgICAgY2hpbGRQYXRoID0gY2FjaGVbbmFtZV0gPSBuZXcgcGF0aC5jb25zdHJ1Y3RvcihhY3R1YWxDaGlsZFZhbHVlLCBwYXRoLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGRQYXRoO1xuICAgIH1cbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvXG4gICAgLy8gaGFuZGxlIG1pc3NpbmcgcHJvcGVydGllcywgZXRjLlxuICAgIFBwLmdldFZhbHVlUHJvcGVydHkgPSBmdW5jdGlvbiBnZXRWYWx1ZVByb3BlcnR5KG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVbbmFtZV07XG4gICAgfTtcbiAgICBQcC5nZXQgPSBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHZhciBuYW1lcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgbmFtZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGF0aCA9IHRoaXM7XG4gICAgICAgIHZhciBjb3VudCA9IG5hbWVzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICAgICAgICBwYXRoID0gZ2V0Q2hpbGRQYXRoKHBhdGgsIG5hbWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9O1xuICAgIFBwLmVhY2ggPSBmdW5jdGlvbiBlYWNoKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBjaGlsZFBhdGhzID0gW107XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAvLyBDb2xsZWN0IGFsbCB0aGUgb3JpZ2luYWwgY2hpbGQgcGF0aHMgYmVmb3JlIGludm9raW5nIHRoZSBjYWxsYmFjay5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKHRoaXMudmFsdWUsIGkpKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRQYXRoc1tpXSA9IHRoaXMuZ2V0KGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEludm9rZSB0aGUgY2FsbGJhY2sgb24ganVzdCB0aGUgb3JpZ2luYWwgY2hpbGQgcGF0aHMsIHJlZ2FyZGxlc3Mgb2ZcbiAgICAgICAgLy8gYW55IG1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGUgYXJyYXkgYnkgdGhlIGNhbGxiYWNrLiBJIGNob3NlIHRoZXNlXG4gICAgICAgIC8vIHNlbWFudGljcyBvdmVyIGNsZXZlcmx5IGludm9raW5nIHRoZSBjYWxsYmFjayBvbiBuZXcgZWxlbWVudHMgYmVjYXVzZVxuICAgICAgICAvLyB0aGlzIHdheSBpcyBtdWNoIGVhc2llciB0byByZWFzb24gYWJvdXQuXG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXM7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGNoaWxkUGF0aHMsIGkpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCBjaGlsZFBhdGhzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUHAubWFwID0gZnVuY3Rpb24gbWFwKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChjaGlsZFBhdGgpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNhbGxiYWNrLmNhbGwodGhpcywgY2hpbGRQYXRoKSk7XG4gICAgICAgIH0sIGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgUHAuZmlsdGVyID0gZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChjaGlsZFBhdGgpIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjay5jYWxsKHRoaXMsIGNoaWxkUGF0aCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGVtcHR5TW92ZXMoKSB7IH1cbiAgICBmdW5jdGlvbiBnZXRNb3ZlcyhwYXRoLCBvZmZzZXQsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaXNBcnJheS5hc3NlcnQocGF0aC52YWx1ZSk7XG4gICAgICAgIGlmIChvZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBlbXB0eU1vdmVzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsZW5ndGggPSBwYXRoLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBlbXB0eU1vdmVzO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhcmdjID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgaWYgKGFyZ2MgPT09IDIpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmdjID09PSAzKSB7XG4gICAgICAgICAgICBzdGFydCA9IE1hdGgubWF4KHN0YXJ0LCAwKTtcbiAgICAgICAgICAgIGVuZCA9IGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoc3RhcnQsIDApO1xuICAgICAgICAgICAgZW5kID0gTWF0aC5taW4oZW5kLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlzTnVtYmVyLmFzc2VydChzdGFydCk7XG4gICAgICAgIGlzTnVtYmVyLmFzc2VydChlbmQpO1xuICAgICAgICB2YXIgbW92ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB2YXIgY2FjaGUgPSBnZXRDaGlsZENhY2hlKHBhdGgpO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKHBhdGgudmFsdWUsIGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkUGF0aCA9IHBhdGguZ2V0KGkpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZFBhdGgubmFtZSAhPT0gaSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBuZXdJbmRleCA9IGkgKyBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgY2hpbGRQYXRoLm5hbWUgPSBuZXdJbmRleDtcbiAgICAgICAgICAgICAgICBtb3Zlc1tuZXdJbmRleF0gPSBjaGlsZFBhdGg7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBjYWNoZS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBuZXdJbmRleCBpbiBtb3Zlcykge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZFBhdGggPSBtb3Zlc1tuZXdJbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkUGF0aC5uYW1lICE9PSArbmV3SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWNoZVtuZXdJbmRleF0gPSBjaGlsZFBhdGg7XG4gICAgICAgICAgICAgICAgcGF0aC52YWx1ZVtuZXdJbmRleF0gPSBjaGlsZFBhdGgudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIFBwLnNoaWZ0ID0gZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgICAgIHZhciBtb3ZlID0gZ2V0TW92ZXModGhpcywgLTEpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy52YWx1ZS5zaGlmdCgpO1xuICAgICAgICBtb3ZlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBQcC51bnNoaWZ0ID0gZnVuY3Rpb24gdW5zaGlmdCgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbW92ZSA9IGdldE1vdmVzKHRoaXMsIGFyZ3MubGVuZ3RoKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMudmFsdWUudW5zaGlmdC5hcHBseSh0aGlzLnZhbHVlLCBhcmdzKTtcbiAgICAgICAgbW92ZSgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgUHAucHVzaCA9IGZ1bmN0aW9uIHB1c2goKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaXNBcnJheS5hc3NlcnQodGhpcy52YWx1ZSk7XG4gICAgICAgIGRlbGV0ZSBnZXRDaGlsZENhY2hlKHRoaXMpLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUucHVzaC5hcHBseSh0aGlzLnZhbHVlLCBhcmdzKTtcbiAgICB9O1xuICAgIFBwLnBvcCA9IGZ1bmN0aW9uIHBvcCgpIHtcbiAgICAgICAgaXNBcnJheS5hc3NlcnQodGhpcy52YWx1ZSk7XG4gICAgICAgIHZhciBjYWNoZSA9IGdldENoaWxkQ2FjaGUodGhpcyk7XG4gICAgICAgIGRlbGV0ZSBjYWNoZVt0aGlzLnZhbHVlLmxlbmd0aCAtIDFdO1xuICAgICAgICBkZWxldGUgY2FjaGUubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5wb3AoKTtcbiAgICB9O1xuICAgIFBwLmluc2VydEF0ID0gZnVuY3Rpb24gaW5zZXJ0QXQoaW5kZXgpIHtcbiAgICAgICAgdmFyIGFyZ2MgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICB2YXIgbW92ZSA9IGdldE1vdmVzKHRoaXMsIGFyZ2MgLSAxLCBpbmRleCk7XG4gICAgICAgIGlmIChtb3ZlID09PSBlbXB0eU1vdmVzICYmIGFyZ2MgPD0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSBNYXRoLm1heChpbmRleCwgMCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlW2luZGV4ICsgaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgICAgIG1vdmUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBQcC5pbnNlcnRCZWZvcmUgPSBmdW5jdGlvbiBpbnNlcnRCZWZvcmUoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBwID0gdGhpcy5wYXJlbnRQYXRoO1xuICAgICAgICB2YXIgYXJnYyA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICB2YXIgaW5zZXJ0QXRBcmdzID0gW3RoaXMubmFtZV07XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJnYzsgKytpKSB7XG4gICAgICAgICAgICBpbnNlcnRBdEFyZ3MucHVzaChhcmdzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHAuaW5zZXJ0QXQuYXBwbHkocHAsIGluc2VydEF0QXJncyk7XG4gICAgfTtcbiAgICBQcC5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uIGluc2VydEFmdGVyKCkge1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcCA9IHRoaXMucGFyZW50UGF0aDtcbiAgICAgICAgdmFyIGFyZ2MgPSBhcmdzLmxlbmd0aDtcbiAgICAgICAgdmFyIGluc2VydEF0QXJncyA9IFt0aGlzLm5hbWUgKyAxXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdjOyArK2kpIHtcbiAgICAgICAgICAgIGluc2VydEF0QXJncy5wdXNoKGFyZ3NbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcC5pbnNlcnRBdC5hcHBseShwcCwgaW5zZXJ0QXRBcmdzKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHJlcGFpclJlbGF0aW9uc2hpcFdpdGhQYXJlbnQocGF0aCkge1xuICAgICAgICBpZiAoIShwYXRoIGluc3RhbmNlb2YgUGF0aCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHAgPSBwYXRoLnBhcmVudFBhdGg7XG4gICAgICAgIGlmICghcHApIHtcbiAgICAgICAgICAgIC8vIE9ycGhhbiBwYXRocyBoYXZlIG5vIHJlbGF0aW9uc2hpcCB0byByZXBhaXIuXG4gICAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50VmFsdWUgPSBwcC52YWx1ZTtcbiAgICAgICAgdmFyIHBhcmVudENhY2hlID0gZ2V0Q2hpbGRDYWNoZShwcCk7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSBwYXJlbnRDYWNoZVtwYXRoLm5hbWVdIGlzIHBvcHVsYXRlZC5cbiAgICAgICAgaWYgKHBhcmVudFZhbHVlW3BhdGgubmFtZV0gPT09IHBhdGgudmFsdWUpIHtcbiAgICAgICAgICAgIHBhcmVudENhY2hlW3BhdGgubmFtZV0gPSBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkuY2hlY2socGFyZW50VmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBTb21ldGhpbmcgY2F1c2VkIHBhdGgubmFtZSB0byBiZWNvbWUgb3V0IG9mIGRhdGUsIHNvIGF0dGVtcHQgdG9cbiAgICAgICAgICAgIC8vIHJlY292ZXIgYnkgc2VhcmNoaW5nIGZvciBwYXRoLnZhbHVlIGluIHBhcmVudFZhbHVlLlxuICAgICAgICAgICAgdmFyIGkgPSBwYXJlbnRWYWx1ZS5pbmRleE9mKHBhdGgudmFsdWUpO1xuICAgICAgICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICAgICAgICAgIHBhcmVudENhY2hlW3BhdGgubmFtZSA9IGldID0gcGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHBhdGgudmFsdWUgZGlzYWdyZWVzIHdpdGggcGFyZW50VmFsdWVbcGF0aC5uYW1lXSwgYW5kXG4gICAgICAgICAgICAvLyBwYXRoLm5hbWUgaXMgbm90IGFuIGFycmF5IGluZGV4LCBsZXQgcGF0aC52YWx1ZSBiZWNvbWUgdGhlIG5ld1xuICAgICAgICAgICAgLy8gcGFyZW50VmFsdWVbcGF0aC5uYW1lXSBhbmQgdXBkYXRlIHBhcmVudENhY2hlIGFjY29yZGluZ2x5LlxuICAgICAgICAgICAgcGFyZW50VmFsdWVbcGF0aC5uYW1lXSA9IHBhdGgudmFsdWU7XG4gICAgICAgICAgICBwYXJlbnRDYWNoZVtwYXRoLm5hbWVdID0gcGF0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50VmFsdWVbcGF0aC5uYW1lXSAhPT0gcGF0aC52YWx1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoLnBhcmVudFBhdGguZ2V0KHBhdGgubmFtZSkgIT09IHBhdGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgUHAucmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2UocmVwbGFjZW1lbnQpIHtcbiAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICAgICAgdmFyIHBhcmVudFZhbHVlID0gdGhpcy5wYXJlbnRQYXRoLnZhbHVlO1xuICAgICAgICB2YXIgcGFyZW50Q2FjaGUgPSBnZXRDaGlsZENhY2hlKHRoaXMucGFyZW50UGF0aCk7XG4gICAgICAgIHZhciBjb3VudCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIHJlcGFpclJlbGF0aW9uc2hpcFdpdGhQYXJlbnQodGhpcyk7XG4gICAgICAgIGlmIChpc0FycmF5LmNoZWNrKHBhcmVudFZhbHVlKSkge1xuICAgICAgICAgICAgdmFyIG9yaWdpbmFsTGVuZ3RoID0gcGFyZW50VmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIG1vdmUgPSBnZXRNb3Zlcyh0aGlzLnBhcmVudFBhdGgsIGNvdW50IC0gMSwgdGhpcy5uYW1lICsgMSk7XG4gICAgICAgICAgICB2YXIgc3BsaWNlQXJncyA9IFt0aGlzLm5hbWUsIDFdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICAgICAgICAgICAgc3BsaWNlQXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3BsaWNlZE91dCA9IHBhcmVudFZhbHVlLnNwbGljZS5hcHBseShwYXJlbnRWYWx1ZSwgc3BsaWNlQXJncyk7XG4gICAgICAgICAgICBpZiAoc3BsaWNlZE91dFswXSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJlbnRWYWx1ZS5sZW5ndGggIT09IChvcmlnaW5hbExlbmd0aCAtIDEgKyBjb3VudCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtb3ZlKCk7XG4gICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcGFyZW50Q2FjaGVbdGhpcy5uYW1lXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9fY2hpbGRDYWNoZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50VmFsdWVbdGhpcy5uYW1lXSAhPT0gcmVwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAhPT0gcmVwbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHJlcGxhY2VtZW50O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9fY2hpbGRDYWNoZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzLnBhcmVudFBhdGguZ2V0KHRoaXMubmFtZSArIGkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdHNbMF0gIT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgIT09IHJlcGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fX2NoaWxkQ2FjaGUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHBhcmVudFZhbHVlW3RoaXMubmFtZV0gPSByZXBsYWNlbWVudDtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgZGVsZXRlIHBhcmVudFZhbHVlW3RoaXMubmFtZV07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX19jaGlsZENhY2hlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIExlYXZlIHRoaXMgcGF0aCBjYWNoZWQgYXMgcGFyZW50Q2FjaGVbdGhpcy5uYW1lXSwgZXZlbiB0aG91Z2hcbiAgICAgICAgICAgIC8vIGl0IG5vIGxvbmdlciBoYXMgYSB2YWx1ZSBkZWZpbmVkLlxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IHJlcGxhY2UgcGF0aFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9O1xuICAgIHJldHVybiBQYXRoO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gcGF0aFBsdWdpbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG4iLCJcInVzZSBzdHJpY3RcIjs7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciB0eXBlc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdHlwZXNcIikpO1xudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5mdW5jdGlvbiBzY29wZVBsdWdpbihmb3JrKSB7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgVHlwZSA9IHR5cGVzLlR5cGU7XG4gICAgdmFyIG5hbWVkVHlwZXMgPSB0eXBlcy5uYW1lZFR5cGVzO1xuICAgIHZhciBOb2RlID0gbmFtZWRUeXBlcy5Ob2RlO1xuICAgIHZhciBFeHByZXNzaW9uID0gbmFtZWRUeXBlcy5FeHByZXNzaW9uO1xuICAgIHZhciBpc0FycmF5ID0gdHlwZXMuYnVpbHRJblR5cGVzLmFycmF5O1xuICAgIHZhciBiID0gdHlwZXMuYnVpbGRlcnM7XG4gICAgdmFyIFNjb3BlID0gZnVuY3Rpb24gU2NvcGUocGF0aCwgcGFyZW50U2NvcGUpIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNjb3BlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2NvcGUgY29uc3RydWN0b3IgY2Fubm90IGJlIGludm9rZWQgd2l0aG91dCAnbmV3J1wiKTtcbiAgICAgICAgfVxuICAgICAgICBTY29wZVR5cGUuYXNzZXJ0KHBhdGgudmFsdWUpO1xuICAgICAgICB2YXIgZGVwdGg7XG4gICAgICAgIGlmIChwYXJlbnRTY29wZSkge1xuICAgICAgICAgICAgaWYgKCEocGFyZW50U2NvcGUgaW5zdGFuY2VvZiBTY29wZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZXB0aCA9IHBhcmVudFNjb3BlLmRlcHRoICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhcmVudFNjb3BlID0gbnVsbDtcbiAgICAgICAgICAgIGRlcHRoID0gMDtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBwYXRoOiB7IHZhbHVlOiBwYXRoIH0sXG4gICAgICAgICAgICBub2RlOiB7IHZhbHVlOiBwYXRoLnZhbHVlIH0sXG4gICAgICAgICAgICBpc0dsb2JhbDogeyB2YWx1ZTogIXBhcmVudFNjb3BlLCBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgICAgICAgICBkZXB0aDogeyB2YWx1ZTogZGVwdGggfSxcbiAgICAgICAgICAgIHBhcmVudDogeyB2YWx1ZTogcGFyZW50U2NvcGUgfSxcbiAgICAgICAgICAgIGJpbmRpbmdzOiB7IHZhbHVlOiB7fSB9LFxuICAgICAgICAgICAgdHlwZXM6IHsgdmFsdWU6IHt9IH0sXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgdmFyIHNjb3BlVHlwZXMgPSBbXG4gICAgICAgIC8vIFByb2dyYW0gbm9kZXMgaW50cm9kdWNlIGdsb2JhbCBzY29wZXMuXG4gICAgICAgIG5hbWVkVHlwZXMuUHJvZ3JhbSxcbiAgICAgICAgLy8gRnVuY3Rpb24gaXMgdGhlIHN1cGVydHlwZSBvZiBGdW5jdGlvbkV4cHJlc3Npb24sXG4gICAgICAgIC8vIEZ1bmN0aW9uRGVjbGFyYXRpb24sIEFycm93RXhwcmVzc2lvbiwgZXRjLlxuICAgICAgICBuYW1lZFR5cGVzLkZ1bmN0aW9uLFxuICAgICAgICAvLyBJbiBjYXNlIHlvdSBkaWRuJ3Qga25vdywgdGhlIGNhdWdodCBwYXJhbWV0ZXIgc2hhZG93cyBhbnkgdmFyaWFibGVcbiAgICAgICAgLy8gb2YgdGhlIHNhbWUgbmFtZSBpbiBhbiBvdXRlciBzY29wZS5cbiAgICAgICAgbmFtZWRUeXBlcy5DYXRjaENsYXVzZVxuICAgIF07XG4gICAgdmFyIFNjb3BlVHlwZSA9IFR5cGUub3IuYXBwbHkoVHlwZSwgc2NvcGVUeXBlcyk7XG4gICAgU2NvcGUuaXNFc3RhYmxpc2hlZEJ5ID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFNjb3BlVHlwZS5jaGVjayhub2RlKTtcbiAgICB9O1xuICAgIHZhciBTcCA9IFNjb3BlLnByb3RvdHlwZTtcbiAgICAvLyBXaWxsIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgYW4gaW5zdGFuY2UgbGF6aWx5IGNhbGxzIHNjYW5TY29wZS5cbiAgICBTcC5kaWRTY2FuID0gZmFsc2U7XG4gICAgU3AuZGVjbGFyZXMgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB0aGlzLnNjYW4oKTtcbiAgICAgICAgcmV0dXJuIGhhc093bi5jYWxsKHRoaXMuYmluZGluZ3MsIG5hbWUpO1xuICAgIH07XG4gICAgU3AuZGVjbGFyZXNUeXBlID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdGhpcy5zY2FuKCk7XG4gICAgICAgIHJldHVybiBoYXNPd24uY2FsbCh0aGlzLnR5cGVzLCBuYW1lKTtcbiAgICB9O1xuICAgIFNwLmRlY2xhcmVUZW1wb3JhcnkgPSBmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgICAgIGlmIChwcmVmaXgpIHtcbiAgICAgICAgICAgIGlmICghL15bYS16JF9dL2kudGVzdChwcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJlZml4ID0gXCJ0JFwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIEluY2x1ZGUgdGhpcy5kZXB0aCBpbiB0aGUgbmFtZSB0byBtYWtlIHN1cmUgdGhlIG5hbWUgZG9lcyBub3RcbiAgICAgICAgLy8gY29sbGlkZSB3aXRoIGFueSB2YXJpYWJsZXMgaW4gbmVzdGVkL2VuY2xvc2luZyBzY29wZXMuXG4gICAgICAgIHByZWZpeCArPSB0aGlzLmRlcHRoLnRvU3RyaW5nKDM2KSArIFwiJFwiO1xuICAgICAgICB0aGlzLnNjYW4oKTtcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgICAgd2hpbGUgKHRoaXMuZGVjbGFyZXMocHJlZml4ICsgaW5kZXgpKSB7XG4gICAgICAgICAgICArK2luZGV4O1xuICAgICAgICB9XG4gICAgICAgIHZhciBuYW1lID0gcHJlZml4ICsgaW5kZXg7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzW25hbWVdID0gdHlwZXMuYnVpbGRlcnMuaWRlbnRpZmllcihuYW1lKTtcbiAgICB9O1xuICAgIFNwLmluamVjdFRlbXBvcmFyeSA9IGZ1bmN0aW9uIChpZGVudGlmaWVyLCBpbml0KSB7XG4gICAgICAgIGlkZW50aWZpZXIgfHwgKGlkZW50aWZpZXIgPSB0aGlzLmRlY2xhcmVUZW1wb3JhcnkoKSk7XG4gICAgICAgIHZhciBib2R5UGF0aCA9IHRoaXMucGF0aC5nZXQoXCJib2R5XCIpO1xuICAgICAgICBpZiAobmFtZWRUeXBlcy5CbG9ja1N0YXRlbWVudC5jaGVjayhib2R5UGF0aC52YWx1ZSkpIHtcbiAgICAgICAgICAgIGJvZHlQYXRoID0gYm9keVBhdGguZ2V0KFwiYm9keVwiKTtcbiAgICAgICAgfVxuICAgICAgICBib2R5UGF0aC51bnNoaWZ0KGIudmFyaWFibGVEZWNsYXJhdGlvbihcInZhclwiLCBbYi52YXJpYWJsZURlY2xhcmF0b3IoaWRlbnRpZmllciwgaW5pdCB8fCBudWxsKV0pKTtcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gICAgfTtcbiAgICBTcC5zY2FuID0gZnVuY3Rpb24gKGZvcmNlKSB7XG4gICAgICAgIGlmIChmb3JjZSB8fCAhdGhpcy5kaWRTY2FuKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuYmluZGluZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBFbXB0eSBvdXQgdGhpcy5iaW5kaW5ncywganVzdCBpbiBjYXNlcy5cbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5iaW5kaW5nc1tuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjYW5TY29wZSh0aGlzLnBhdGgsIHRoaXMuYmluZGluZ3MsIHRoaXMudHlwZXMpO1xuICAgICAgICAgICAgdGhpcy5kaWRTY2FuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgU3AuZ2V0QmluZGluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc2NhbigpO1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kaW5ncztcbiAgICB9O1xuICAgIFNwLmdldFR5cGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnNjYW4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZXM7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBzY2FuU2NvcGUocGF0aCwgYmluZGluZ3MsIHNjb3BlVHlwZXMpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBwYXRoLnZhbHVlO1xuICAgICAgICBTY29wZVR5cGUuYXNzZXJ0KG5vZGUpO1xuICAgICAgICBpZiAobmFtZWRUeXBlcy5DYXRjaENsYXVzZS5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgLy8gQSBjYXRjaCBjbGF1c2UgZXN0YWJsaXNoZXMgYSBuZXcgc2NvcGUgYnV0IHRoZSBvbmx5IHZhcmlhYmxlXG4gICAgICAgICAgICAvLyBib3VuZCBpbiB0aGF0IHNjb3BlIGlzIHRoZSBjYXRjaCBwYXJhbWV0ZXIuIEFueSBvdGhlclxuICAgICAgICAgICAgLy8gZGVjbGFyYXRpb25zIGNyZWF0ZSBiaW5kaW5ncyBpbiB0aGUgb3V0ZXIgc2NvcGUuXG4gICAgICAgICAgICB2YXIgcGFyYW0gPSBwYXRoLmdldChcInBhcmFtXCIpO1xuICAgICAgICAgICAgaWYgKHBhcmFtLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkUGF0dGVybihwYXJhbSwgYmluZGluZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdXJzaXZlU2NhblNjb3BlKHBhdGgsIGJpbmRpbmdzLCBzY29wZVR5cGVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVTY2FuU2NvcGUocGF0aCwgYmluZGluZ3MsIHNjb3BlVHlwZXMpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBwYXRoLnZhbHVlO1xuICAgICAgICBpZiAocGF0aC5wYXJlbnQgJiZcbiAgICAgICAgICAgIG5hbWVkVHlwZXMuRnVuY3Rpb25FeHByZXNzaW9uLmNoZWNrKHBhdGgucGFyZW50Lm5vZGUpICYmXG4gICAgICAgICAgICBwYXRoLnBhcmVudC5ub2RlLmlkKSB7XG4gICAgICAgICAgICBhZGRQYXR0ZXJuKHBhdGgucGFyZW50LmdldChcImlkXCIpLCBiaW5kaW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICAvLyBOb25lIG9mIHRoZSByZW1haW5pbmcgY2FzZXMgbWF0dGVyIGlmIG5vZGUgaXMgZmFsc3kuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNBcnJheS5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgcGF0aC5lYWNoKGZ1bmN0aW9uIChjaGlsZFBhdGgpIHtcbiAgICAgICAgICAgICAgICByZWN1cnNpdmVTY2FuQ2hpbGQoY2hpbGRQYXRoLCBiaW5kaW5ncywgc2NvcGVUeXBlcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLkZ1bmN0aW9uLmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoLmdldChcInBhcmFtc1wiKS5lYWNoKGZ1bmN0aW9uIChwYXJhbVBhdGgpIHtcbiAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuKHBhcmFtUGF0aCwgYmluZGluZ3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZWN1cnNpdmVTY2FuQ2hpbGQocGF0aC5nZXQoXCJib2R5XCIpLCBiaW5kaW5ncywgc2NvcGVUeXBlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKG5hbWVkVHlwZXMuVHlwZUFsaWFzICYmIG5hbWVkVHlwZXMuVHlwZUFsaWFzLmNoZWNrKG5vZGUpKSB8fFxuICAgICAgICAgICAgKG5hbWVkVHlwZXMuSW50ZXJmYWNlRGVjbGFyYXRpb24gJiYgbmFtZWRUeXBlcy5JbnRlcmZhY2VEZWNsYXJhdGlvbi5jaGVjayhub2RlKSkgfHxcbiAgICAgICAgICAgIChuYW1lZFR5cGVzLlRTVHlwZUFsaWFzRGVjbGFyYXRpb24gJiYgbmFtZWRUeXBlcy5UU1R5cGVBbGlhc0RlY2xhcmF0aW9uLmNoZWNrKG5vZGUpKSB8fFxuICAgICAgICAgICAgKG5hbWVkVHlwZXMuVFNJbnRlcmZhY2VEZWNsYXJhdGlvbiAmJiBuYW1lZFR5cGVzLlRTSW50ZXJmYWNlRGVjbGFyYXRpb24uY2hlY2sobm9kZSkpKSB7XG4gICAgICAgICAgICBhZGRUeXBlUGF0dGVybihwYXRoLmdldChcImlkXCIpLCBzY29wZVR5cGVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLlZhcmlhYmxlRGVjbGFyYXRvci5jaGVjayhub2RlKSkge1xuICAgICAgICAgICAgYWRkUGF0dGVybihwYXRoLmdldChcImlkXCIpLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICByZWN1cnNpdmVTY2FuQ2hpbGQocGF0aC5nZXQoXCJpbml0XCIpLCBiaW5kaW5ncywgc2NvcGVUeXBlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSBcIkltcG9ydFNwZWNpZmllclwiIHx8XG4gICAgICAgICAgICBub2RlLnR5cGUgPT09IFwiSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyXCIgfHxcbiAgICAgICAgICAgIG5vZGUudHlwZSA9PT0gXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4oXG4gICAgICAgICAgICAvLyBFc3ByaW1hIHVzZWQgdG8gdXNlIHRoZSAubmFtZSBmaWVsZCB0byByZWZlciB0byB0aGUgbG9jYWxcbiAgICAgICAgICAgIC8vIGJpbmRpbmcgaWRlbnRpZmllciBmb3IgSW1wb3J0U3BlY2lmaWVyIG5vZGVzLCBidXQgLmlkIGZvclxuICAgICAgICAgICAgLy8gSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyIGFuZCBJbXBvcnREZWZhdWx0U3BlY2lmaWVyIG5vZGVzLlxuICAgICAgICAgICAgLy8gRVNUcmVlL0Fjb3JuL0VTcHJlZSB1c2UgLmxvY2FsIGZvciBhbGwgdGhyZWUgbm9kZSB0eXBlcy5cbiAgICAgICAgICAgIHBhdGguZ2V0KG5vZGUubG9jYWwgPyBcImxvY2FsXCIgOlxuICAgICAgICAgICAgICAgIG5vZGUubmFtZSA/IFwibmFtZVwiIDogXCJpZFwiKSwgYmluZGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKE5vZGUuY2hlY2sobm9kZSkgJiYgIUV4cHJlc3Npb24uY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIHR5cGVzLmVhY2hGaWVsZChub2RlLCBmdW5jdGlvbiAobmFtZSwgY2hpbGQpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRQYXRoID0gcGF0aC5nZXQobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXRoSGFzVmFsdWUoY2hpbGRQYXRoLCBjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZWN1cnNpdmVTY2FuQ2hpbGQoY2hpbGRQYXRoLCBiaW5kaW5ncywgc2NvcGVUeXBlcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwYXRoSGFzVmFsdWUocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHBhdGgudmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbXB0eSBhcnJheXMgYXJlIHByb2JhYmx5IHByb2R1Y2VkIGJ5IGRlZmF1bHRzLmVtcHR5QXJyYXksIGluIHdoaWNoXG4gICAgICAgIC8vIGNhc2UgaXMgbWFrZXMgc2Vuc2UgdG8gcmVnYXJkIHRoZW0gYXMgZXF1aXZhbGVudCwgaWYgbm90ID09PS5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aC52YWx1ZSkgJiZcbiAgICAgICAgICAgIHBhdGgudmFsdWUubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgICAgICAgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZVNjYW5DaGlsZChwYXRoLCBiaW5kaW5ncywgc2NvcGVUeXBlcykge1xuICAgICAgICB2YXIgbm9kZSA9IHBhdGgudmFsdWU7XG4gICAgICAgIGlmICghbm9kZSB8fCBFeHByZXNzaW9uLmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZmFsc3kgdmFsdWVzIGFuZCBFeHByZXNzaW9ucy5cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLkZ1bmN0aW9uRGVjbGFyYXRpb24uY2hlY2sobm9kZSkgJiZcbiAgICAgICAgICAgIG5vZGUuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocGF0aC5nZXQoXCJpZFwiKSwgYmluZGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuQ2xhc3NEZWNsYXJhdGlvbiAmJlxuICAgICAgICAgICAgbmFtZWRUeXBlcy5DbGFzc0RlY2xhcmF0aW9uLmNoZWNrKG5vZGUpKSB7XG4gICAgICAgICAgICBhZGRQYXR0ZXJuKHBhdGguZ2V0KFwiaWRcIiksIGJpbmRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChTY29wZVR5cGUuY2hlY2sobm9kZSkpIHtcbiAgICAgICAgICAgIGlmIChuYW1lZFR5cGVzLkNhdGNoQ2xhdXNlLmNoZWNrKG5vZGUpICYmXG4gICAgICAgICAgICAgICAgLy8gVE9ETyBCcm9hZGVuIHRoaXMgdG8gYWNjZXB0IGFueSBwYXR0ZXJuLlxuICAgICAgICAgICAgICAgIG5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhub2RlLnBhcmFtKSkge1xuICAgICAgICAgICAgICAgIHZhciBjYXRjaFBhcmFtTmFtZSA9IG5vZGUucGFyYW0ubmFtZTtcbiAgICAgICAgICAgICAgICB2YXIgaGFkQmluZGluZyA9IGhhc093bi5jYWxsKGJpbmRpbmdzLCBjYXRjaFBhcmFtTmFtZSk7XG4gICAgICAgICAgICAgICAgLy8gQW55IGRlY2xhcmF0aW9ucyB0aGF0IG9jY3VyIGluc2lkZSB0aGUgY2F0Y2ggYm9keSB0aGF0IGRvXG4gICAgICAgICAgICAgICAgLy8gbm90IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUgY2F0Y2ggcGFyYW1ldGVyIHNob3VsZCBjb3VudFxuICAgICAgICAgICAgICAgIC8vIGFzIGJpbmRpbmdzIGluIHRoZSBvdXRlciBzY29wZS5cbiAgICAgICAgICAgICAgICByZWN1cnNpdmVTY2FuU2NvcGUocGF0aC5nZXQoXCJib2R5XCIpLCBiaW5kaW5ncywgc2NvcGVUeXBlcyk7XG4gICAgICAgICAgICAgICAgLy8gSWYgYSBuZXcgYmluZGluZyBtYXRjaGluZyB0aGUgY2F0Y2ggcGFyYW1ldGVyIG5hbWUgd2FzXG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlZCB3aGlsZSBzY2FubmluZyB0aGUgY2F0Y2ggYm9keSwgaWdub3JlIGl0IGJlY2F1c2UgaXRcbiAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSByZWZlcnMgdG8gdGhlIGNhdGNoIHBhcmFtZXRlciBhbmQgbm90IHRoZSBvdXRlclxuICAgICAgICAgICAgICAgIC8vIHNjb3BlIHRoYXQgd2UncmUgY3VycmVudGx5IHNjYW5uaW5nLlxuICAgICAgICAgICAgICAgIGlmICghaGFkQmluZGluZykge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgYmluZGluZ3NbY2F0Y2hQYXJhbU5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5TY29wZShwYXRoLCBiaW5kaW5ncywgc2NvcGVUeXBlcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkUGF0dGVybihwYXR0ZXJuUGF0aCwgYmluZGluZ3MpIHtcbiAgICAgICAgdmFyIHBhdHRlcm4gPSBwYXR0ZXJuUGF0aC52YWx1ZTtcbiAgICAgICAgbmFtZWRUeXBlcy5QYXR0ZXJuLmFzc2VydChwYXR0ZXJuKTtcbiAgICAgICAgaWYgKG5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhwYXR0ZXJuKSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGJpbmRpbmdzLCBwYXR0ZXJuLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgYmluZGluZ3NbcGF0dGVybi5uYW1lXS5wdXNoKHBhdHRlcm5QYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJpbmRpbmdzW3BhdHRlcm4ubmFtZV0gPSBbcGF0dGVyblBhdGhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuQXNzaWdubWVudFBhdHRlcm4gJiZcbiAgICAgICAgICAgIG5hbWVkVHlwZXMuQXNzaWdubWVudFBhdHRlcm4uY2hlY2socGF0dGVybikpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocGF0dGVyblBhdGguZ2V0KCdsZWZ0JyksIGJpbmRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLk9iamVjdFBhdHRlcm4gJiZcbiAgICAgICAgICAgIG5hbWVkVHlwZXMuT2JqZWN0UGF0dGVybi5jaGVjayhwYXR0ZXJuKSkge1xuICAgICAgICAgICAgcGF0dGVyblBhdGguZ2V0KCdwcm9wZXJ0aWVzJykuZWFjaChmdW5jdGlvbiAocHJvcGVydHlQYXRoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gcHJvcGVydHlQYXRoLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lZFR5cGVzLlBhdHRlcm4uY2hlY2socHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocHJvcGVydHlQYXRoLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuUHJvcGVydHkuY2hlY2socHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocHJvcGVydHlQYXRoLmdldCgndmFsdWUnKSwgYmluZGluZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lZFR5cGVzLlNwcmVhZFByb3BlcnR5ICYmXG4gICAgICAgICAgICAgICAgICAgIG5hbWVkVHlwZXMuU3ByZWFkUHJvcGVydHkuY2hlY2socHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4ocHJvcGVydHlQYXRoLmdldCgnYXJndW1lbnQnKSwgYmluZGluZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWVkVHlwZXMuQXJyYXlQYXR0ZXJuICYmXG4gICAgICAgICAgICBuYW1lZFR5cGVzLkFycmF5UGF0dGVybi5jaGVjayhwYXR0ZXJuKSkge1xuICAgICAgICAgICAgcGF0dGVyblBhdGguZ2V0KCdlbGVtZW50cycpLmVhY2goZnVuY3Rpb24gKGVsZW1lbnRQYXRoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50UGF0aC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZWRUeXBlcy5QYXR0ZXJuLmNoZWNrKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm4oZWxlbWVudFBhdGgsIGJpbmRpbmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZWRUeXBlcy5TcHJlYWRFbGVtZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIG5hbWVkVHlwZXMuU3ByZWFkRWxlbWVudC5jaGVjayhlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuKGVsZW1lbnRQYXRoLmdldChcImFyZ3VtZW50XCIpLCBiaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZWRUeXBlcy5Qcm9wZXJ0eVBhdHRlcm4gJiZcbiAgICAgICAgICAgIG5hbWVkVHlwZXMuUHJvcGVydHlQYXR0ZXJuLmNoZWNrKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICBhZGRQYXR0ZXJuKHBhdHRlcm5QYXRoLmdldCgncGF0dGVybicpLCBiaW5kaW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKG5hbWVkVHlwZXMuU3ByZWFkRWxlbWVudFBhdHRlcm4gJiZcbiAgICAgICAgICAgIG5hbWVkVHlwZXMuU3ByZWFkRWxlbWVudFBhdHRlcm4uY2hlY2socGF0dGVybikpIHx8XG4gICAgICAgICAgICAobmFtZWRUeXBlcy5TcHJlYWRQcm9wZXJ0eVBhdHRlcm4gJiZcbiAgICAgICAgICAgICAgICBuYW1lZFR5cGVzLlNwcmVhZFByb3BlcnR5UGF0dGVybi5jaGVjayhwYXR0ZXJuKSkpIHtcbiAgICAgICAgICAgIGFkZFBhdHRlcm4ocGF0dGVyblBhdGguZ2V0KCdhcmd1bWVudCcpLCBiaW5kaW5ncyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkVHlwZVBhdHRlcm4ocGF0dGVyblBhdGgsIHR5cGVzKSB7XG4gICAgICAgIHZhciBwYXR0ZXJuID0gcGF0dGVyblBhdGgudmFsdWU7XG4gICAgICAgIG5hbWVkVHlwZXMuUGF0dGVybi5hc3NlcnQocGF0dGVybik7XG4gICAgICAgIGlmIChuYW1lZFR5cGVzLklkZW50aWZpZXIuY2hlY2socGF0dGVybikpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbCh0eXBlcywgcGF0dGVybi5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHR5cGVzW3BhdHRlcm4ubmFtZV0ucHVzaChwYXR0ZXJuUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0eXBlc1twYXR0ZXJuLm5hbWVdID0gW3BhdHRlcm5QYXRoXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBTcC5sb29rdXAgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBmb3IgKHZhciBzY29wZSA9IHRoaXM7IHNjb3BlOyBzY29wZSA9IHNjb3BlLnBhcmVudClcbiAgICAgICAgICAgIGlmIChzY29wZS5kZWNsYXJlcyhuYW1lKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH07XG4gICAgU3AubG9va3VwVHlwZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGZvciAodmFyIHNjb3BlID0gdGhpczsgc2NvcGU7IHNjb3BlID0gc2NvcGUucGFyZW50KVxuICAgICAgICAgICAgaWYgKHNjb3BlLmRlY2xhcmVzVHlwZShuYW1lKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH07XG4gICAgU3AuZ2V0R2xvYmFsU2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzY29wZSA9IHRoaXM7XG4gICAgICAgIHdoaWxlICghc2NvcGUuaXNHbG9iYWwpXG4gICAgICAgICAgICBzY29wZSA9IHNjb3BlLnBhcmVudDtcbiAgICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH07XG4gICAgcmV0dXJuIFNjb3BlO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gc2NvcGVQbHVnaW47XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG52YXIgdHlwZXNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3R5cGVzXCIpKTtcbmZ1bmN0aW9uIGRlZmF1bHRfMShmb3JrKSB7XG4gICAgdmFyIHR5cGVzID0gZm9yay51c2UodHlwZXNfMS5kZWZhdWx0KTtcbiAgICB2YXIgVHlwZSA9IHR5cGVzLlR5cGU7XG4gICAgdmFyIGJ1aWx0aW4gPSB0eXBlcy5idWlsdEluVHlwZXM7XG4gICAgdmFyIGlzTnVtYmVyID0gYnVpbHRpbi5udW1iZXI7XG4gICAgLy8gQW4gZXhhbXBsZSBvZiBjb25zdHJ1Y3RpbmcgYSBuZXcgdHlwZSB3aXRoIGFyYml0cmFyeSBjb25zdHJhaW50cyBmcm9tXG4gICAgLy8gYW4gZXhpc3RpbmcgdHlwZS5cbiAgICBmdW5jdGlvbiBnZXEodGhhbikge1xuICAgICAgICByZXR1cm4gVHlwZS5mcm9tKGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gaXNOdW1iZXIuY2hlY2sodmFsdWUpICYmIHZhbHVlID49IHRoYW47IH0sIGlzTnVtYmVyICsgXCIgPj0gXCIgKyB0aGFuKTtcbiAgICB9XG4gICAgO1xuICAgIC8vIERlZmF1bHQgdmFsdWUtcmV0dXJuaW5nIGZ1bmN0aW9ucyB0aGF0IG1heSBvcHRpb25hbGx5IGJlIHBhc3NlZCBhcyBhXG4gICAgLy8gdGhpcmQgYXJndW1lbnQgdG8gRGVmLnByb3RvdHlwZS5maWVsZC5cbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICAgIC8vIEZ1bmN0aW9ucyB3ZXJlIHVzZWQgYmVjYXVzZSAoYW1vbmcgb3RoZXIgcmVhc29ucykgdGhhdCdzIHRoZSBtb3N0XG4gICAgICAgIC8vIGVsZWdhbnQgd2F5IHRvIGFsbG93IGZvciB0aGUgZW1wdHlBcnJheSBvbmUgYWx3YXlzIHRvIGdpdmUgYSBuZXdcbiAgICAgICAgLy8gYXJyYXkgaW5zdGFuY2UuXG4gICAgICAgIFwibnVsbFwiOiBmdW5jdGlvbiAoKSB7IHJldHVybiBudWxsOyB9LFxuICAgICAgICBcImVtcHR5QXJyYXlcIjogZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH0sXG4gICAgICAgIFwiZmFsc2VcIjogZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH0sXG4gICAgICAgIFwidHJ1ZVwiOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9LFxuICAgICAgICBcInVuZGVmaW5lZFwiOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIFwidXNlIHN0cmljdFwiOiBmdW5jdGlvbiAoKSB7IHJldHVybiBcInVzZSBzdHJpY3RcIjsgfVxuICAgIH07XG4gICAgdmFyIG5haXZlSXNQcmltaXRpdmUgPSBUeXBlLm9yKGJ1aWx0aW4uc3RyaW5nLCBidWlsdGluLm51bWJlciwgYnVpbHRpbi5ib29sZWFuLCBidWlsdGluLm51bGwsIGJ1aWx0aW4udW5kZWZpbmVkKTtcbiAgICB2YXIgaXNQcmltaXRpdmUgPSBUeXBlLmZyb20oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgICAgIHR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sIG5haXZlSXNQcmltaXRpdmUudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2VxOiBnZXEsXG4gICAgICAgIGRlZmF1bHRzOiBkZWZhdWx0cyxcbiAgICAgICAgaXNQcmltaXRpdmU6IGlzUHJpbWl0aXZlLFxuICAgIH07XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWZhdWx0XzE7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkRlZiA9IHZvaWQgMDtcbnZhciB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBvYmpUb1N0ciA9IE9wLnRvU3RyaW5nO1xudmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xudmFyIEJhc2VUeXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2VUeXBlKCkge1xuICAgIH1cbiAgICBCYXNlVHlwZS5wcm90b3R5cGUuYXNzZXJ0ID0gZnVuY3Rpb24gKHZhbHVlLCBkZWVwKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGVjayh2YWx1ZSwgZGVlcCkpIHtcbiAgICAgICAgICAgIHZhciBzdHIgPSBzaGFsbG93U3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzdHIgKyBcIiBkb2VzIG5vdCBtYXRjaCB0eXBlIFwiICsgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBCYXNlVHlwZS5wcm90b3R5cGUuYXJyYXlPZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVsZW1UeXBlID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBBcnJheVR5cGUoZWxlbVR5cGUpO1xuICAgIH07XG4gICAgcmV0dXJuIEJhc2VUeXBlO1xufSgpKTtcbnZhciBBcnJheVR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoQXJyYXlUeXBlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIEFycmF5VHlwZShlbGVtVHlwZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5lbGVtVHlwZSA9IGVsZW1UeXBlO1xuICAgICAgICBfdGhpcy5raW5kID0gXCJBcnJheVR5cGVcIjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBBcnJheVR5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJbXCIgKyB0aGlzLmVsZW1UeXBlICsgXCJdXCI7XG4gICAgfTtcbiAgICBBcnJheVR5cGUucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24gKHZhbHVlLCBkZWVwKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShmdW5jdGlvbiAoZWxlbSkgeyByZXR1cm4gX3RoaXMuZWxlbVR5cGUuY2hlY2soZWxlbSwgZGVlcCk7IH0pO1xuICAgIH07XG4gICAgcmV0dXJuIEFycmF5VHlwZTtcbn0oQmFzZVR5cGUpKTtcbnZhciBJZGVudGl0eVR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoSWRlbnRpdHlUeXBlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIElkZW50aXR5VHlwZSh2YWx1ZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBfdGhpcy5raW5kID0gXCJJZGVudGl0eVR5cGVcIjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBJZGVudGl0eVR5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgSWRlbnRpdHlUeXBlLnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWUgPT09IHRoaXMudmFsdWU7XG4gICAgICAgIGlmICghcmVzdWx0ICYmIHR5cGVvZiBkZWVwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGRlZXAodGhpcywgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICByZXR1cm4gSWRlbnRpdHlUeXBlO1xufShCYXNlVHlwZSkpO1xudmFyIE9iamVjdFR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoT2JqZWN0VHlwZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBPYmplY3RUeXBlKGZpZWxkcykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgICAgIF90aGlzLmtpbmQgPSBcIk9iamVjdFR5cGVcIjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBPYmplY3RUeXBlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwieyBcIiArIHRoaXMuZmllbGRzLmpvaW4oXCIsIFwiKSArIFwiIH1cIjtcbiAgICB9O1xuICAgIE9iamVjdFR5cGUucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24gKHZhbHVlLCBkZWVwKSB7XG4gICAgICAgIHJldHVybiAob2JqVG9TdHIuY2FsbCh2YWx1ZSkgPT09IG9ialRvU3RyLmNhbGwoe30pICYmXG4gICAgICAgICAgICB0aGlzLmZpZWxkcy5ldmVyeShmdW5jdGlvbiAoZmllbGQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQudHlwZS5jaGVjayh2YWx1ZVtmaWVsZC5uYW1lXSwgZGVlcCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0VHlwZTtcbn0oQmFzZVR5cGUpKTtcbnZhciBPclR5cGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgdHNsaWJfMS5fX2V4dGVuZHMoT3JUeXBlLCBfc3VwZXIpO1xuICAgIGZ1bmN0aW9uIE9yVHlwZSh0eXBlcykge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy50eXBlcyA9IHR5cGVzO1xuICAgICAgICBfdGhpcy5raW5kID0gXCJPclR5cGVcIjtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBPclR5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlcy5qb2luKFwiIHwgXCIpO1xuICAgIH07XG4gICAgT3JUeXBlLnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlcy5zb21lKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS5jaGVjayh2YWx1ZSwgZGVlcCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIE9yVHlwZTtcbn0oQmFzZVR5cGUpKTtcbnZhciBQcmVkaWNhdGVUeXBlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIHRzbGliXzEuX19leHRlbmRzKFByZWRpY2F0ZVR5cGUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gUHJlZGljYXRlVHlwZShuYW1lLCBwcmVkaWNhdGUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIF90aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICAgICAgX3RoaXMua2luZCA9IFwiUHJlZGljYXRlVHlwZVwiO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIFByZWRpY2F0ZVR5cGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH07XG4gICAgUHJlZGljYXRlVHlwZS5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMucHJlZGljYXRlKHZhbHVlLCBkZWVwKTtcbiAgICAgICAgaWYgKCFyZXN1bHQgJiYgdHlwZW9mIGRlZXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZGVlcCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIHJldHVybiBQcmVkaWNhdGVUeXBlO1xufShCYXNlVHlwZSkpO1xudmFyIERlZiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZWYodHlwZSwgdHlwZU5hbWUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lO1xuICAgICAgICB0aGlzLmJhc2VOYW1lcyA9IFtdO1xuICAgICAgICB0aGlzLm93bkZpZWxkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIEluY2x1ZGVzIG93biB0eXBlTmFtZS4gUG9wdWxhdGVkIGR1cmluZyBmaW5hbGl6YXRpb24uXG4gICAgICAgIHRoaXMuYWxsU3VwZXJ0eXBlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIExpbmVhciBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFBvcHVsYXRlZCBkdXJpbmcgZmluYWxpemF0aW9uLlxuICAgICAgICB0aGlzLnN1cGVydHlwZUxpc3QgPSBbXTtcbiAgICAgICAgLy8gSW5jbHVkZXMgaW5oZXJpdGVkIGZpZWxkcy5cbiAgICAgICAgdGhpcy5hbGxGaWVsZHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyBOb24taGlkZGVuIGtleXMgb2YgYWxsRmllbGRzLlxuICAgICAgICB0aGlzLmZpZWxkTmFtZXMgPSBbXTtcbiAgICAgICAgLy8gVGhpcyBwcm9wZXJ0eSB3aWxsIGJlIG92ZXJyaWRkZW4gYXMgdHJ1ZSBieSBpbmRpdmlkdWFsIERlZiBpbnN0YW5jZXNcbiAgICAgICAgLy8gd2hlbiB0aGV5IGFyZSBmaW5hbGl6ZWQuXG4gICAgICAgIHRoaXMuZmluYWxpemVkID0gZmFsc2U7XG4gICAgICAgIC8vIEZhbHNlIGJ5IGRlZmF1bHQgdW50aWwgLmJ1aWxkKC4uLikgaXMgY2FsbGVkIG9uIGFuIGluc3RhbmNlLlxuICAgICAgICB0aGlzLmJ1aWxkYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJ1aWxkUGFyYW1zID0gW107XG4gICAgfVxuICAgIERlZi5wcm90b3R5cGUuaXNTdXBlcnR5cGVPZiA9IGZ1bmN0aW9uICh0aGF0KSB7XG4gICAgICAgIGlmICh0aGF0IGluc3RhbmNlb2YgRGVmKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5maW5hbGl6ZWQgIT09IHRydWUgfHxcbiAgICAgICAgICAgICAgICB0aGF0LmZpbmFsaXplZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYXNPd24uY2FsbCh0aGF0LmFsbFN1cGVydHlwZXMsIHRoaXMudHlwZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoYXQgKyBcIiBpcyBub3QgYSBEZWZcIik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIERlZi5wcm90b3R5cGUuY2hlY2tBbGxGaWVsZHMgPSBmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgdmFyIGFsbEZpZWxkcyA9IHRoaXMuYWxsRmllbGRzO1xuICAgICAgICBpZiAodGhpcy5maW5hbGl6ZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiICsgdGhpcy50eXBlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tGaWVsZEJ5TmFtZShuYW1lKSB7XG4gICAgICAgICAgICB2YXIgZmllbGQgPSBhbGxGaWVsZHNbbmFtZV07XG4gICAgICAgICAgICB2YXIgdHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBmaWVsZC5nZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS5jaGVjayhjaGlsZCwgZGVlcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFsbEZpZWxkcykuZXZlcnkoY2hlY2tGaWVsZEJ5TmFtZSk7XG4gICAgfTtcbiAgICBEZWYucHJvdG90eXBlLmJhc2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3VwZXJ0eXBlTmFtZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHN1cGVydHlwZU5hbWVzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJhc2VzID0gdGhpcy5iYXNlTmFtZXM7XG4gICAgICAgIGlmICh0aGlzLmZpbmFsaXplZCkge1xuICAgICAgICAgICAgaWYgKHN1cGVydHlwZU5hbWVzLmxlbmd0aCAhPT0gYmFzZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdXBlcnR5cGVOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChzdXBlcnR5cGVOYW1lc1tpXSAhPT0gYmFzZXNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVydHlwZU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKGJhc2VOYW1lKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGluZGV4T2YgbG9va3VwIG1heSBiZSBPKG4pLCBidXQgdGhlIHR5cGljYWwgbnVtYmVyIG9mIGJhc2VcbiAgICAgICAgICAgIC8vIG5hbWVzIGlzIHZlcnkgc21hbGwsIGFuZCBpbmRleE9mIGlzIGEgbmF0aXZlIEFycmF5IG1ldGhvZC5cbiAgICAgICAgICAgIGlmIChiYXNlcy5pbmRleE9mKGJhc2VOYW1lKSA8IDApIHtcbiAgICAgICAgICAgICAgICBiYXNlcy5wdXNoKGJhc2VOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzOyAvLyBGb3IgY2hhaW5pbmcuXG4gICAgfTtcbiAgICByZXR1cm4gRGVmO1xufSgpKTtcbmV4cG9ydHMuRGVmID0gRGVmO1xudmFyIEZpZWxkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEZpZWxkKG5hbWUsIHR5cGUsIGRlZmF1bHRGbiwgaGlkZGVuKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuZGVmYXVsdEZuID0gZGVmYXVsdEZuO1xuICAgICAgICB0aGlzLmhpZGRlbiA9ICEhaGlkZGVuO1xuICAgIH1cbiAgICBGaWVsZC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLm5hbWUpICsgXCI6IFwiICsgdGhpcy50eXBlO1xuICAgIH07XG4gICAgRmllbGQucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICB2YXIgdmFsdWUgPSBvYmpbdGhpcy5uYW1lXTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZWZhdWx0Rm4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmRlZmF1bHRGbi5jYWxsKG9iaik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgcmV0dXJuIEZpZWxkO1xufSgpKTtcbmZ1bmN0aW9uIHNoYWxsb3dTdHJpbmdpZnkodmFsdWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFwiW1wiICsgdmFsdWUubWFwKHNoYWxsb3dTdHJpbmdpZnkpLmpvaW4oXCIsIFwiKSArIFwiXVwiO1xuICAgIH1cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBcInsgXCIgKyBPYmplY3Qua2V5cyh2YWx1ZSkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXkgKyBcIjogXCIgKyB2YWx1ZVtrZXldO1xuICAgICAgICB9KS5qb2luKFwiLCBcIikgKyBcIiB9XCI7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG59XG5mdW5jdGlvbiB0eXBlc1BsdWdpbihfZm9yaykge1xuICAgIHZhciBUeXBlID0ge1xuICAgICAgICBvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHR5cGVzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIHR5cGVzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IE9yVHlwZSh0eXBlcy5tYXAoZnVuY3Rpb24gKHR5cGUpIHsgcmV0dXJuIFR5cGUuZnJvbSh0eXBlKTsgfSkpO1xuICAgICAgICB9LFxuICAgICAgICBmcm9tOiBmdW5jdGlvbiAodmFsdWUsIG5hbWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5VHlwZSB8fFxuICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgSWRlbnRpdHlUeXBlIHx8XG4gICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBPYmplY3RUeXBlIHx8XG4gICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBPclR5cGUgfHxcbiAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIFByZWRpY2F0ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgRGVmIHR5cGUgaXMgdXNlZCBhcyBhIGhlbHBlciBmb3IgY29uc3RydWN0aW5nIGNvbXBvdW5kXG4gICAgICAgICAgICAvLyBpbnRlcmZhY2UgdHlwZXMgZm9yIEFTVCBub2Rlcy5cbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERlZikge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3VwcG9ydCBbRWxlbVR5cGVdIHN5bnRheC5cbiAgICAgICAgICAgIGlmIChpc0FycmF5LmNoZWNrKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwib25seSBvbmUgZWxlbWVudCB0eXBlIGlzIHBlcm1pdHRlZCBmb3IgdHlwZWQgYXJyYXlzXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5VHlwZShUeXBlLmZyb20odmFsdWVbMF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFN1cHBvcnQgeyBzb21lRmllbGQ6IEZpZWxkVHlwZSwgLi4uIH0gc3ludGF4LlxuICAgICAgICAgICAgaWYgKGlzT2JqZWN0LmNoZWNrKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0VHlwZShPYmplY3Qua2V5cyh2YWx1ZSkubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGQobmFtZSwgVHlwZS5mcm9tKHZhbHVlW25hbWVdLCBuYW1lKSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJpY2ZJbmRleCA9IGJ1aWx0SW5DdG9yRm5zLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChiaWNmSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbHRJbkN0b3JUeXBlc1tiaWNmSW5kZXhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibWlzc2luZyBuYW1lXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByZWRpY2F0ZVR5cGUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXMgYSBsYXN0IHJlc29ydCwgdG9UeXBlIHJldHVybnMgYSB0eXBlIHRoYXQgbWF0Y2hlcyBhbnkgdmFsdWUgdGhhdFxuICAgICAgICAgICAgLy8gaXMgPT09IGZyb20uIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgbGl0ZXJhbCB2YWx1ZXMgbGlrZVxuICAgICAgICAgICAgLy8gdG9UeXBlKG51bGwpLCBidXQgaXQgaGFzIHRoZSBhZGRpdGlvbmFsIGFkdmFudGFnZSBvZiBhbGxvd2luZ1xuICAgICAgICAgICAgLy8gdG9UeXBlIHRvIGJlIGEgdG90YWwgZnVuY3Rpb24uXG4gICAgICAgICAgICByZXR1cm4gbmV3IElkZW50aXR5VHlwZSh2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIERlZmluZSBhIHR5cGUgd2hvc2UgbmFtZSBpcyByZWdpc3RlcmVkIGluIGEgbmFtZXNwYWNlICh0aGUgZGVmQ2FjaGUpIHNvXG4gICAgICAgIC8vIHRoYXQgZnV0dXJlIGRlZmluaXRpb25zIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHR5cGUgZ2l2ZW4gdGhlIHNhbWUgbmFtZS5cbiAgICAgICAgLy8gSW4gcGFydGljdWxhciwgdGhpcyBzeXN0ZW0gYWxsb3dzIGZvciBjaXJjdWxhciBhbmQgZm9yd2FyZCBkZWZpbml0aW9ucy5cbiAgICAgICAgLy8gVGhlIERlZiBvYmplY3QgZCByZXR1cm5lZCBmcm9tIFR5cGUuZGVmIG1heSBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGVcbiAgICAgICAgLy8gdHlwZSBkLnR5cGUgYnkgY2FsbGluZyBtZXRob2RzIHN1Y2ggYXMgZC5iYXNlcywgZC5idWlsZCwgYW5kIGQuZmllbGQuXG4gICAgICAgIGRlZjogZnVuY3Rpb24gKHR5cGVOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFzT3duLmNhbGwoZGVmQ2FjaGUsIHR5cGVOYW1lKVxuICAgICAgICAgICAgICAgID8gZGVmQ2FjaGVbdHlwZU5hbWVdXG4gICAgICAgICAgICAgICAgOiBkZWZDYWNoZVt0eXBlTmFtZV0gPSBuZXcgRGVmSW1wbCh0eXBlTmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhc0RlZjogZnVuY3Rpb24gKHR5cGVOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFzT3duLmNhbGwoZGVmQ2FjaGUsIHR5cGVOYW1lKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIGJ1aWx0SW5DdG9yRm5zID0gW107XG4gICAgdmFyIGJ1aWx0SW5DdG9yVHlwZXMgPSBbXTtcbiAgICBmdW5jdGlvbiBkZWZCdWlsdEluVHlwZShuYW1lLCBleGFtcGxlKSB7XG4gICAgICAgIHZhciBvYmpTdHIgPSBvYmpUb1N0ci5jYWxsKGV4YW1wbGUpO1xuICAgICAgICB2YXIgdHlwZSA9IG5ldyBQcmVkaWNhdGVUeXBlKG5hbWUsIGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gb2JqVG9TdHIuY2FsbCh2YWx1ZSkgPT09IG9ialN0cjsgfSk7XG4gICAgICAgIGlmIChleGFtcGxlICYmIHR5cGVvZiBleGFtcGxlLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGJ1aWx0SW5DdG9yRm5zLnB1c2goZXhhbXBsZS5jb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICBidWlsdEluQ3RvclR5cGVzLnB1c2godHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICAgIC8vIFRoZXNlIHR5cGVzIGNoZWNrIHRoZSB1bmRlcmx5aW5nIFtbQ2xhc3NdXSBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuXG4gICAgLy8gdmFsdWUsIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBwcm9ibGVtYXRpYyB0eXBlb2Ygb3BlcmF0b3IuIE5vdGUgaG93ZXZlclxuICAgIC8vIHRoYXQgbm8gc3VidHlwaW5nIGlzIGNvbnNpZGVyZWQ7IHNvLCBmb3IgaW5zdGFuY2UsIGlzT2JqZWN0LmNoZWNrXG4gICAgLy8gcmV0dXJucyBmYWxzZSBmb3IgW10sIC8uLywgbmV3IERhdGUsIGFuZCBudWxsLlxuICAgIHZhciBpc1N0cmluZyA9IGRlZkJ1aWx0SW5UeXBlKFwic3RyaW5nXCIsIFwidHJ1dGh5XCIpO1xuICAgIHZhciBpc0Z1bmN0aW9uID0gZGVmQnVpbHRJblR5cGUoXCJmdW5jdGlvblwiLCBmdW5jdGlvbiAoKSB7IH0pO1xuICAgIHZhciBpc0FycmF5ID0gZGVmQnVpbHRJblR5cGUoXCJhcnJheVwiLCBbXSk7XG4gICAgdmFyIGlzT2JqZWN0ID0gZGVmQnVpbHRJblR5cGUoXCJvYmplY3RcIiwge30pO1xuICAgIHZhciBpc1JlZ0V4cCA9IGRlZkJ1aWx0SW5UeXBlKFwiUmVnRXhwXCIsIC8uLyk7XG4gICAgdmFyIGlzRGF0ZSA9IGRlZkJ1aWx0SW5UeXBlKFwiRGF0ZVwiLCBuZXcgRGF0ZSgpKTtcbiAgICB2YXIgaXNOdW1iZXIgPSBkZWZCdWlsdEluVHlwZShcIm51bWJlclwiLCAzKTtcbiAgICB2YXIgaXNCb29sZWFuID0gZGVmQnVpbHRJblR5cGUoXCJib29sZWFuXCIsIHRydWUpO1xuICAgIHZhciBpc051bGwgPSBkZWZCdWlsdEluVHlwZShcIm51bGxcIiwgbnVsbCk7XG4gICAgdmFyIGlzVW5kZWZpbmVkID0gZGVmQnVpbHRJblR5cGUoXCJ1bmRlZmluZWRcIiwgdW5kZWZpbmVkKTtcbiAgICB2YXIgYnVpbHRJblR5cGVzID0ge1xuICAgICAgICBzdHJpbmc6IGlzU3RyaW5nLFxuICAgICAgICBmdW5jdGlvbjogaXNGdW5jdGlvbixcbiAgICAgICAgYXJyYXk6IGlzQXJyYXksXG4gICAgICAgIG9iamVjdDogaXNPYmplY3QsXG4gICAgICAgIFJlZ0V4cDogaXNSZWdFeHAsXG4gICAgICAgIERhdGU6IGlzRGF0ZSxcbiAgICAgICAgbnVtYmVyOiBpc051bWJlcixcbiAgICAgICAgYm9vbGVhbjogaXNCb29sZWFuLFxuICAgICAgICBudWxsOiBpc051bGwsXG4gICAgICAgIHVuZGVmaW5lZDogaXNVbmRlZmluZWQsXG4gICAgfTtcbiAgICAvLyBJbiBvcmRlciB0byByZXR1cm4gdGhlIHNhbWUgRGVmIGluc3RhbmNlIGV2ZXJ5IHRpbWUgVHlwZS5kZWYgaXMgY2FsbGVkXG4gICAgLy8gd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSwgdGhvc2UgaW5zdGFuY2VzIG5lZWQgdG8gYmUgc3RvcmVkIGluIGEgY2FjaGUuXG4gICAgdmFyIGRlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmdW5jdGlvbiBkZWZGcm9tVmFsdWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSB2YWx1ZS50eXBlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgaGFzT3duLmNhbGwoZGVmQ2FjaGUsIHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGQgPSBkZWZDYWNoZVt0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAoZC5maW5hbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgRGVmSW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICAgICAgdHNsaWJfMS5fX2V4dGVuZHMoRGVmSW1wbCwgX3N1cGVyKTtcbiAgICAgICAgZnVuY3Rpb24gRGVmSW1wbCh0eXBlTmFtZSkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbmV3IFByZWRpY2F0ZVR5cGUodHlwZU5hbWUsIGZ1bmN0aW9uICh2YWx1ZSwgZGVlcCkgeyByZXR1cm4gX3RoaXMuY2hlY2sodmFsdWUsIGRlZXApOyB9KSwgdHlwZU5hbWUpIHx8IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgICAgIH1cbiAgICAgICAgRGVmSW1wbC5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbiAodmFsdWUsIGRlZXApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmFsaXplZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInByZW1hdHVyZWx5IGNoZWNraW5nIHVuZmluYWxpemVkIHR5cGUgXCIgKyB0aGlzLnR5cGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEEgRGVmIHR5cGUgY2FuIG9ubHkgbWF0Y2ggYW4gb2JqZWN0IHZhbHVlLlxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2RGVmID0gZGVmRnJvbVZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIGlmICghdkRlZikge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IGluZmVyIHRoZSBEZWYgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAvLyBhbmQgd2UgZXhwZWN0ZWQgaXQgdG8gYmUgYSBTb3VyY2VMb2NhdGlvbiBvciBhIFBvc2l0aW9uLCBpdCB3YXNcbiAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSBqdXN0IG1pc3NpbmcgYSBcInR5cGVcIiBmaWVsZCAoYmVjYXVzZSBFc3ByaW1hIGRvZXMgbm90XG4gICAgICAgICAgICAgICAgLy8gYXNzaWduIGEgdHlwZSBwcm9wZXJ0eSB0byBzdWNoIG5vZGVzKS4gQmUgb3B0aW1pc3RpYyBhbmQgbGV0XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5jaGVja0FsbEZpZWxkcyBtYWtlIHRoZSBmaW5hbCBkZWNpc2lvbi5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy50eXBlTmFtZSA9PT0gXCJTb3VyY2VMb2NhdGlvblwiIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZU5hbWUgPT09IFwiUG9zaXRpb25cIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGVja0FsbEZpZWxkcyh2YWx1ZSwgZGVlcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENhbGxpbmcgdGhpcy5jaGVja0FsbEZpZWxkcyBmb3IgYW55IG90aGVyIHR5cGUgb2Ygbm9kZSBpcyBib3RoXG4gICAgICAgICAgICAgICAgLy8gYmFkIGZvciBwZXJmb3JtYW5jZSBhbmQgd2F5IHRvbyBmb3JnaXZpbmcuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgY2hlY2tpbmcgZGVlcGx5IGFuZCB2RGVmID09PSB0aGlzLCB0aGVuIHdlIG9ubHkgbmVlZCB0byBjYWxsXG4gICAgICAgICAgICAvLyBjaGVja0FsbEZpZWxkcyBvbmNlLiBDYWxsaW5nIGNoZWNrQWxsRmllbGRzIGlzIHRvbyBzdHJpY3Qgd2hlbiBkZWVwXG4gICAgICAgICAgICAvLyBpcyBmYWxzZSwgYmVjYXVzZSB0aGVuIHdlIG9ubHkgY2FyZSBhYm91dCB0aGlzLmlzU3VwZXJ0eXBlT2YodkRlZikuXG4gICAgICAgICAgICBpZiAoZGVlcCAmJiB2RGVmID09PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tBbGxGaWVsZHModmFsdWUsIGRlZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW4gbW9zdCBjYXNlcyB3ZSByZWx5IGV4Y2x1c2l2ZWx5IG9uIGlzU3VwZXJ0eXBlT2YgdG8gbWFrZSBPKDEpXG4gICAgICAgICAgICAvLyBzdWJ0eXBpbmcgZGV0ZXJtaW5hdGlvbnMuIFRoaXMgc3VmZmljZXMgaW4gbW9zdCBzaXR1YXRpb25zIG91dHNpZGVcbiAgICAgICAgICAgIC8vIG9mIHVuaXQgdGVzdHMsIHNpbmNlIGludGVyZmFjZSBjb25mb3JtYW5jZSBpcyBjaGVja2VkIHdoZW5ldmVyIG5ld1xuICAgICAgICAgICAgLy8gaW5zdGFuY2VzIGFyZSBjcmVhdGVkIHVzaW5nIGJ1aWxkZXIgZnVuY3Rpb25zLlxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzU3VwZXJ0eXBlT2YodkRlZikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgZXhjZXB0aW9uIGlzIHdoZW4gZGVlcCBpcyB0cnVlOyB0aGVuLCB3ZSByZWN1cnNpdmVseSBjaGVjayBhbGxcbiAgICAgICAgICAgIC8vIGZpZWxkcy5cbiAgICAgICAgICAgIGlmICghZGVlcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVXNlIHRoZSBtb3JlIHNwZWNpZmljIERlZiAodkRlZikgdG8gcGVyZm9ybSB0aGUgZGVlcCBjaGVjaywgYnV0XG4gICAgICAgICAgICAvLyBzaGFsbG93LWNoZWNrIGZpZWxkcyBkZWZpbmVkIGJ5IHRoZSBsZXNzIHNwZWNpZmljIERlZiAodGhpcykuXG4gICAgICAgICAgICByZXR1cm4gdkRlZi5jaGVja0FsbEZpZWxkcyh2YWx1ZSwgZGVlcClcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmNoZWNrQWxsRmllbGRzKHZhbHVlLCBmYWxzZSk7XG4gICAgICAgIH07XG4gICAgICAgIERlZkltcGwucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciBidWlsZFBhcmFtcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBidWlsZFBhcmFtc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2FsbGluZyBEZWYucHJvdG90eXBlLmJ1aWxkIG11bHRpcGxlIHRpbWVzIGhhcyB0aGUgZWZmZWN0IG9mIG1lcmVseVxuICAgICAgICAgICAgLy8gcmVkZWZpbmluZyB0aGlzIHByb3BlcnR5LlxuICAgICAgICAgICAgdGhpcy5idWlsZFBhcmFtcyA9IGJ1aWxkUGFyYW1zO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRhYmxlKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBEZWYgaXMgYWxyZWFkeSBidWlsZGFibGUsIHVwZGF0ZSBzZWxmLmJ1aWxkUGFyYW1zIGFuZFxuICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHVzaW5nIHRoZSBvbGQgYnVpbGRlciBmdW5jdGlvbi5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEV2ZXJ5IGJ1aWxkYWJsZSB0eXBlIHdpbGwgaGF2ZSBpdHMgXCJ0eXBlXCIgZmllbGQgZmlsbGVkIGluXG4gICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5LiBUaGlzIGluY2x1ZGVzIHR5cGVzIHRoYXQgYXJlIG5vdCBzdWJ0eXBlcyBvZiBOb2RlLFxuICAgICAgICAgICAgLy8gbGlrZSBTb3VyY2VMb2NhdGlvbiwgYnV0IHRoYXQgc2VlbXMgaGFybWxlc3MgKFRPRE8/KS5cbiAgICAgICAgICAgIHRoaXMuZmllbGQoXCJ0eXBlXCIsIFN0cmluZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMudHlwZU5hbWU7IH0pO1xuICAgICAgICAgICAgLy8gT3ZlcnJpZGUgRHAuYnVpbGRhYmxlIGZvciB0aGlzIERlZiBpbnN0YW5jZS5cbiAgICAgICAgICAgIHRoaXMuYnVpbGRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBhZGRQYXJhbSA9IGZ1bmN0aW9uIChidWlsdCwgcGFyYW0sIGFyZywgaXNBcmdBdmFpbGFibGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoYnVpbHQsIHBhcmFtKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHZhciBhbGwgPSBfdGhpcy5hbGxGaWVsZHM7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPd24uY2FsbChhbGwsIHBhcmFtKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIiArIHBhcmFtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gYWxsW3BhcmFtXTtcbiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChpc0FyZ0F2YWlsYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGFyZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQuZGVmYXVsdEZuKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4cG9zZSB0aGUgcGFydGlhbGx5LWJ1aWx0IG9iamVjdCB0byB0aGUgZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBhcyBpdHMgYHRoaXNgIG9iamVjdC5cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmaWVsZC5kZWZhdWx0Rm4uY2FsbChidWlsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IFwibm8gdmFsdWUgb3IgZGVmYXVsdCBmdW5jdGlvbiBnaXZlbiBmb3IgZmllbGQgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocGFyYW0pICsgXCIgb2YgXCIgKyBfdGhpcy50eXBlTmFtZSArIFwiKFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmJ1aWxkUGFyYW1zLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiLCBcIikgKyBcIilcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuY2hlY2sodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzaGFsbG93U3RyaW5naWZ5KHZhbHVlKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiBkb2VzIG5vdCBtYXRjaCBmaWVsZCBcIiArIGZpZWxkICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIG9mIHR5cGUgXCIgKyBfdGhpcy50eXBlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1aWx0W3BhcmFtXSA9IHZhbHVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIENhbGxpbmcgdGhlIGJ1aWxkZXIgZnVuY3Rpb24gd2lsbCBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhlIERlZixcbiAgICAgICAgICAgIC8vIHdpdGggcG9zaXRpb25hbCBhcmd1bWVudHMgbWFwcGVkIHRvIHRoZSBmaWVsZHMgb3JpZ2luYWwgcGFzc2VkIHRvIC5idWlsZC5cbiAgICAgICAgICAgIC8vIElmIG5vdCBlbm91Z2ggYXJndW1lbnRzIGFyZSBwcm92aWRlZCwgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSByZW1haW5pbmcgZmllbGRzXG4gICAgICAgICAgICAvLyB3aWxsIGJlIHVzZWQuXG4gICAgICAgICAgICB2YXIgYnVpbGRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGFyZ2MgPSBhcmdzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoIV90aGlzLmZpbmFsaXplZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdHRlbXB0aW5nIHRvIGluc3RhbnRpYXRlIHVuZmluYWxpemVkIHR5cGUgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYnVpbHQgPSBPYmplY3QuY3JlYXRlKG5vZGVQcm90b3R5cGUpO1xuICAgICAgICAgICAgICAgIF90aGlzLmJ1aWxkUGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpIDwgYXJnYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW0oYnVpbHQsIHBhcmFtLCBhcmdzW2ldLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtKGJ1aWx0LCBwYXJhbSwgbnVsbCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoX3RoaXMuYWxsRmllbGRzKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtKGJ1aWx0LCBwYXJhbSwgbnVsbCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBcInR5cGVcIiBmaWVsZCB3YXMgZmlsbGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICAgICAgICAgICAgaWYgKGJ1aWx0LnR5cGUgIT09IF90aGlzLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWx0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIENhbGxpbmcgLmZyb20gb24gdGhlIGJ1aWxkZXIgZnVuY3Rpb24gd2lsbCBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhlIERlZixcbiAgICAgICAgICAgIC8vIHVzaW5nIGZpZWxkIHZhbHVlcyBmcm9tIHRoZSBwYXNzZWQgb2JqZWN0LiBGb3IgZmllbGRzIG1pc3NpbmcgZnJvbSB0aGUgcGFzc2VkIG9iamVjdCxcbiAgICAgICAgICAgIC8vIHRoZWlyIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLlxuICAgICAgICAgICAgYnVpbGRlci5mcm9tID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIGlmICghX3RoaXMuZmluYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImF0dGVtcHRpbmcgdG8gaW5zdGFudGlhdGUgdW5maW5hbGl6ZWQgdHlwZSBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy50eXBlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBidWlsdCA9IE9iamVjdC5jcmVhdGUobm9kZVByb3RvdHlwZSk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoX3RoaXMuYWxsRmllbGRzKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwob2JqLCBwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtKGJ1aWx0LCBwYXJhbSwgb2JqW3BhcmFtXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbShidWlsdCwgcGFyYW0sIG51bGwsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBcInR5cGVcIiBmaWVsZCB3YXMgZmlsbGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICAgICAgICAgICAgaWYgKGJ1aWx0LnR5cGUgIT09IF90aGlzLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWx0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShidWlsZGVycywgZ2V0QnVpbGRlck5hbWUodGhpcy50eXBlTmFtZSksIHtcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBidWlsZGVyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgICAgICAvLyBUaGUgcmVhc29uIGZpZWxkcyBhcmUgc3BlY2lmaWVkIHVzaW5nIC5maWVsZCguLi4pIGluc3RlYWQgb2YgYW4gb2JqZWN0XG4gICAgICAgIC8vIGxpdGVyYWwgc3ludGF4IGlzIHNvbWV3aGF0IHN1YnRsZTogdGhlIG9iamVjdCBsaXRlcmFsIHN5bnRheCB3b3VsZFxuICAgICAgICAvLyBzdXBwb3J0IG9ubHkgb25lIGtleSBhbmQgb25lIHZhbHVlLCBidXQgd2l0aCAuZmllbGQoLi4uKSB3ZSBjYW4gcGFzc1xuICAgICAgICAvLyBhbnkgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBmaWVsZC5cbiAgICAgICAgRGVmSW1wbC5wcm90b3R5cGUuZmllbGQgPSBmdW5jdGlvbiAobmFtZSwgdHlwZSwgZGVmYXVsdEZuLCBoaWRkZW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmFsaXplZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlZGVmaW5lIGZpZWxkIFwiICtcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZSkgKyBcIiBvZiBmaW5hbGl6ZWQgdHlwZSBcIiArXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMudHlwZU5hbWUpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3duRmllbGRzW25hbWVdID0gbmV3IEZpZWxkKG5hbWUsIFR5cGUuZnJvbSh0eXBlKSwgZGVmYXVsdEZuLCBoaWRkZW4pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7IC8vIEZvciBjaGFpbmluZy5cbiAgICAgICAgfTtcbiAgICAgICAgRGVmSW1wbC5wcm90b3R5cGUuZmluYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgLy8gSXQncyBub3QgYW4gZXJyb3IgdG8gZmluYWxpemUgYSB0eXBlIG1vcmUgdGhhbiBvbmNlLCBidXQgb25seSB0aGVcbiAgICAgICAgICAgIC8vIGZpcnN0IGNhbGwgdG8gLmZpbmFsaXplIGRvZXMgYW55dGhpbmcuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZmluYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFsbEZpZWxkcyA9IHRoaXMuYWxsRmllbGRzO1xuICAgICAgICAgICAgICAgIHZhciBhbGxTdXBlcnR5cGVzID0gdGhpcy5hbGxTdXBlcnR5cGVzO1xuICAgICAgICAgICAgICAgIHRoaXMuYmFzZU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlZiA9IGRlZkNhY2hlW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmIGluc3RhbmNlb2YgRGVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWYuZmluYWxpemUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZChhbGxGaWVsZHMsIGRlZi5hbGxGaWVsZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKGFsbFN1cGVydHlwZXMsIGRlZi5hbGxTdXBlcnR5cGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gXCJ1bmtub3duIHN1cGVydHlwZSBuYW1lIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuYW1lKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgZm9yIHN1YnR5cGUgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KF90aGlzLnR5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gV2FybiBpZiBmaWVsZHMgYXJlIG92ZXJyaWRkZW4gd2l0aCBpbmNvbXBhdGlibGUgdHlwZXMuXG4gICAgICAgICAgICAgICAgZXh0ZW5kKGFsbEZpZWxkcywgdGhpcy5vd25GaWVsZHMpO1xuICAgICAgICAgICAgICAgIGFsbFN1cGVydHlwZXNbdGhpcy50eXBlTmFtZV0gPSB0aGlzO1xuICAgICAgICAgICAgICAgIHRoaXMuZmllbGROYW1lcy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGZpZWxkTmFtZSBpbiBhbGxGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGFsbEZpZWxkcywgZmllbGROYW1lKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWFsbEZpZWxkc1tmaWVsZE5hbWVdLmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWVsZE5hbWVzLnB1c2goZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUeXBlcyBhcmUgZXhwb3J0ZWQgb25seSBvbmNlIHRoZXkgaGF2ZSBiZWVuIGZpbmFsaXplZC5cbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmFtZWRUeXBlcywgdGhpcy50eXBlTmFtZSwge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy50eXBlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maW5hbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEEgbGluZWFyaXphdGlvbiBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LlxuICAgICAgICAgICAgICAgIHBvcHVsYXRlU3VwZXJ0eXBlTGlzdCh0aGlzLnR5cGVOYW1lLCB0aGlzLnN1cGVydHlwZUxpc3QpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkYWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVydHlwZUxpc3QubGFzdEluZGV4T2YoXCJFeHByZXNzaW9uXCIpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgd3JhcEV4cHJlc3Npb25CdWlsZGVyV2l0aFN0YXRlbWVudCh0aGlzLnR5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBEZWZJbXBsO1xuICAgIH0oRGVmKSk7XG4gICAgLy8gTm90ZSB0aGF0IHRoZSBsaXN0IHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gaXMgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbFxuICAgIC8vIHN1cGVydHlwZUxpc3QsICp3aXRob3V0KiB0aGUgdHlwZU5hbWUgaXRzZWxmIGFzIHRoZSBmaXJzdCBlbGVtZW50LlxuICAgIGZ1bmN0aW9uIGdldFN1cGVydHlwZU5hbWVzKHR5cGVOYW1lKSB7XG4gICAgICAgIGlmICghaGFzT3duLmNhbGwoZGVmQ2FjaGUsIHR5cGVOYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkID0gZGVmQ2FjaGVbdHlwZU5hbWVdO1xuICAgICAgICBpZiAoZC5maW5hbGl6ZWQgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZC5zdXBlcnR5cGVMaXN0LnNsaWNlKDEpO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCBtYXBwaW5nIGZyb20gZXZlcnkga25vd24gdHlwZSBpbiB0aGUgZGVmQ2FjaGUgdG8gdGhlXG4gICAgLy8gbW9zdCBzcGVjaWZpYyBzdXBlcnR5cGUgd2hvc2UgbmFtZSBpcyBhbiBvd24gcHJvcGVydHkgb2YgdGhlIGNhbmRpZGF0ZXNcbiAgICAvLyBvYmplY3QuXG4gICAgZnVuY3Rpb24gY29tcHV0ZVN1cGVydHlwZUxvb2t1cFRhYmxlKGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgdmFyIHRhYmxlID0ge307XG4gICAgICAgIHZhciB0eXBlTmFtZXMgPSBPYmplY3Qua2V5cyhkZWZDYWNoZSk7XG4gICAgICAgIHZhciB0eXBlTmFtZUNvdW50ID0gdHlwZU5hbWVzLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlTmFtZUNvdW50OyArK2kpIHtcbiAgICAgICAgICAgIHZhciB0eXBlTmFtZSA9IHR5cGVOYW1lc1tpXTtcbiAgICAgICAgICAgIHZhciBkID0gZGVmQ2FjaGVbdHlwZU5hbWVdO1xuICAgICAgICAgICAgaWYgKGQuZmluYWxpemVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIgKyB0eXBlTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGQuc3VwZXJ0eXBlTGlzdC5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIHZhciBzdXBlclR5cGVOYW1lID0gZC5zdXBlcnR5cGVMaXN0W2pdO1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChjYW5kaWRhdGVzLCBzdXBlclR5cGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB0YWJsZVt0eXBlTmFtZV0gPSBzdXBlclR5cGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH1cbiAgICB2YXIgYnVpbGRlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIC8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgYXMgcHJvdG90eXBlIGZvciBhbnkgbm9kZSBjcmVhdGVkIGJ5IGEgYnVpbGRlci5cbiAgICB2YXIgbm9kZVByb3RvdHlwZSA9IHt9O1xuICAgIC8vIENhbGwgdGhpcyBmdW5jdGlvbiB0byBkZWZpbmUgYSBuZXcgbWV0aG9kIHRvIGJlIHNoYXJlZCBieSBhbGwgQVNUXG4gICAgLy8gbm9kZXMuIFRoZSByZXBsYWNlZCBtZXRob2QgKGlmIGFueSkgaXMgcmV0dXJuZWQgZm9yIGVhc3kgd3JhcHBpbmcuXG4gICAgZnVuY3Rpb24gZGVmaW5lTWV0aG9kKG5hbWUsIGZ1bmMpIHtcbiAgICAgICAgdmFyIG9sZCA9IG5vZGVQcm90b3R5cGVbbmFtZV07XG4gICAgICAgIC8vIFBhc3MgdW5kZWZpbmVkIGFzIGZ1bmMgdG8gZGVsZXRlIG5vZGVQcm90b3R5cGVbbmFtZV0uXG4gICAgICAgIGlmIChpc1VuZGVmaW5lZC5jaGVjayhmdW5jKSkge1xuICAgICAgICAgICAgZGVsZXRlIG5vZGVQcm90b3R5cGVbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpc0Z1bmN0aW9uLmFzc2VydChmdW5jKTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlUHJvdG90eXBlLCBuYW1lLCB7XG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvbGQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEJ1aWxkZXJOYW1lKHR5cGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB0eXBlTmFtZS5yZXBsYWNlKC9eW0EtWl0rLywgZnVuY3Rpb24gKHVwcGVyQ2FzZVByZWZpeCkge1xuICAgICAgICAgICAgdmFyIGxlbiA9IHVwcGVyQ2FzZVByZWZpeC5sZW5ndGg7XG4gICAgICAgICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBpbml0aWFsIGNhcGl0YWwgbGV0dGVyLCBqdXN0IGxvd2VyLWNhc2UgaXQuXG4gICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gdXBwZXJDYXNlUHJlZml4LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIGluaXRpYWwgY2FwaXRhbCBsZXR0ZXIsIGxvd2VyLWNhc2VcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGJ1dCB0aGUgbGFzdCBvbmUsIHNvIHRoYXQgWE1MRGVmYXVsdERlY2xhcmF0aW9uIChmb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZSkgYmVjb21lcyB4bWxEZWZhdWx0RGVjbGFyYXRpb24uXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1cHBlckNhc2VQcmVmaXguc2xpY2UoMCwgbGVuIC0gMSkudG9Mb3dlckNhc2UoKSArXG4gICAgICAgICAgICAgICAgICAgICAgICB1cHBlckNhc2VQcmVmaXguY2hhckF0KGxlbiAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U3RhdGVtZW50QnVpbGRlck5hbWUodHlwZU5hbWUpIHtcbiAgICAgICAgdHlwZU5hbWUgPSBnZXRCdWlsZGVyTmFtZSh0eXBlTmFtZSk7XG4gICAgICAgIHJldHVybiB0eXBlTmFtZS5yZXBsYWNlKC8oRXhwcmVzc2lvbik/JC8sIFwiU3RhdGVtZW50XCIpO1xuICAgIH1cbiAgICB2YXIgbmFtZWRUeXBlcyA9IHt9O1xuICAgIC8vIExpa2UgT2JqZWN0LmtleXMsIGJ1dCBhd2FyZSBvZiB3aGF0IGZpZWxkcyBlYWNoIEFTVCB0eXBlIHNob3VsZCBoYXZlLlxuICAgIGZ1bmN0aW9uIGdldEZpZWxkTmFtZXMob2JqZWN0KSB7XG4gICAgICAgIHZhciBkID0gZGVmRnJvbVZhbHVlKG9iamVjdCk7XG4gICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICByZXR1cm4gZC5maWVsZE5hbWVzLnNsaWNlKDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcInR5cGVcIiBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImRpZCBub3QgcmVjb2duaXplIG9iamVjdCBvZiB0eXBlIFwiICtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShvYmplY3QudHlwZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBwcm9wZXJ0eSwgdGFraW5nIG9iamVjdC50eXBlIGFuZCBkZWZhdWx0XG4gICAgLy8gZnVuY3Rpb25zIGludG8gYWNjb3VudC5cbiAgICBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlKG9iamVjdCwgZmllbGROYW1lKSB7XG4gICAgICAgIHZhciBkID0gZGVmRnJvbVZhbHVlKG9iamVjdCk7XG4gICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICB2YXIgZmllbGQgPSBkLmFsbEZpZWxkc1tmaWVsZE5hbWVdO1xuICAgICAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldFZhbHVlKG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdCAmJiBvYmplY3RbZmllbGROYW1lXTtcbiAgICB9XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBkZWZpbmVkIGZpZWxkcyBvZiBhbiBvYmplY3QsIGluY2x1ZGluZyB0aG9zZSBtaXNzaW5nXG4gICAgLy8gb3IgdW5kZWZpbmVkLCBwYXNzaW5nIGVhY2ggZmllbGQgbmFtZSBhbmQgZWZmZWN0aXZlIHZhbHVlIChhcyByZXR1cm5lZFxuICAgIC8vIGJ5IGdldEZpZWxkVmFsdWUpIHRvIHRoZSBjYWxsYmFjay4gSWYgdGhlIG9iamVjdCBoYXMgbm8gY29ycmVzcG9uZGluZ1xuICAgIC8vIERlZiwgdGhlIGNhbGxiYWNrIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLlxuICAgIGZ1bmN0aW9uIGVhY2hGaWVsZChvYmplY3QsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICAgIGdldEZpZWxkTmFtZXMob2JqZWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIG5hbWUsIGdldEZpZWxkVmFsdWUob2JqZWN0LCBuYW1lKSk7XG4gICAgICAgIH0sIGNvbnRleHQpO1xuICAgIH1cbiAgICAvLyBTaW1pbGFyIHRvIGVhY2hGaWVsZCwgZXhjZXB0IHRoYXQgaXRlcmF0aW9uIHN0b3BzIGFzIHNvb24gYXMgdGhlXG4gICAgLy8gY2FsbGJhY2sgcmV0dXJucyBhIHRydXRoeSB2YWx1ZS4gTGlrZSBBcnJheS5wcm90b3R5cGUuc29tZSwgdGhlIGZpbmFsXG4gICAgLy8gcmVzdWx0IGlzIGVpdGhlciB0cnVlIG9yIGZhbHNlIHRvIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjYWxsYmFja1xuICAgIC8vIHJldHVybmVkIHRydWUgZm9yIGFueSBlbGVtZW50IG9yIG5vdC5cbiAgICBmdW5jdGlvbiBzb21lRmllbGQob2JqZWN0LCBjYWxsYmFjaywgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gZ2V0RmllbGROYW1lcyhvYmplY3QpLnNvbWUoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXMsIG5hbWUsIGdldEZpZWxkVmFsdWUob2JqZWN0LCBuYW1lKSk7XG4gICAgICAgIH0sIGNvbnRleHQpO1xuICAgIH1cbiAgICAvLyBBZGRzIGFuIGFkZGl0aW9uYWwgYnVpbGRlciBmb3IgRXhwcmVzc2lvbiBzdWJ0eXBlc1xuICAgIC8vIHRoYXQgd3JhcHMgdGhlIGJ1aWx0IEV4cHJlc3Npb24gaW4gYW4gRXhwcmVzc2lvblN0YXRlbWVudHMuXG4gICAgZnVuY3Rpb24gd3JhcEV4cHJlc3Npb25CdWlsZGVyV2l0aFN0YXRlbWVudCh0eXBlTmFtZSkge1xuICAgICAgICB2YXIgd3JhcHBlck5hbWUgPSBnZXRTdGF0ZW1lbnRCdWlsZGVyTmFtZSh0eXBlTmFtZSk7XG4gICAgICAgIC8vIHNraXAgaWYgdGhlIGJ1aWxkZXIgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgaWYgKGJ1aWxkZXJzW3dyYXBwZXJOYW1lXSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gdGhlIGJ1aWxkZXIgZnVuY3Rpb24gdG8gd3JhcCB3aXRoIGJ1aWxkZXJzLkV4cHJlc3Npb25TdGF0ZW1lbnRcbiAgICAgICAgdmFyIHdyYXBwZWQgPSBidWlsZGVyc1tnZXRCdWlsZGVyTmFtZSh0eXBlTmFtZSldO1xuICAgICAgICAvLyBza2lwIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gd3JhcFxuICAgICAgICBpZiAoIXdyYXBwZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBidWlsZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXJzLmV4cHJlc3Npb25TdGF0ZW1lbnQod3JhcHBlZC5hcHBseShidWlsZGVycywgYXJncykpO1xuICAgICAgICB9O1xuICAgICAgICBidWlsZGVyLmZyb20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYnVpbGRlcnMuZXhwcmVzc2lvblN0YXRlbWVudCh3cmFwcGVkLmZyb20uYXBwbHkoYnVpbGRlcnMsIGFyZ3MpKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnVpbGRlcnNbd3JhcHBlck5hbWVdID0gYnVpbGRlcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wdWxhdGVTdXBlcnR5cGVMaXN0KHR5cGVOYW1lLCBsaXN0KSB7XG4gICAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgICAgbGlzdC5wdXNoKHR5cGVOYW1lKTtcbiAgICAgICAgdmFyIGxhc3RTZWVuID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZm9yICh2YXIgcG9zID0gMDsgcG9zIDwgbGlzdC5sZW5ndGg7ICsrcG9zKSB7XG4gICAgICAgICAgICB0eXBlTmFtZSA9IGxpc3RbcG9zXTtcbiAgICAgICAgICAgIHZhciBkID0gZGVmQ2FjaGVbdHlwZU5hbWVdO1xuICAgICAgICAgICAgaWYgKGQuZmluYWxpemVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgd2Ugc2F3IHR5cGVOYW1lIGVhcmxpZXIgaW4gdGhlIGJyZWFkdGgtZmlyc3QgdHJhdmVyc2FsLFxuICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSBsYXN0LXNlZW4gb2NjdXJyZW5jZS5cbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChsYXN0U2VlbiwgdHlwZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGxpc3RbbGFzdFNlZW5bdHlwZU5hbWVdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlY29yZCB0aGUgbmV3IGluZGV4IG9mIHRoZSBsYXN0LXNlZW4gb2NjdXJyZW5jZSBvZiB0eXBlTmFtZS5cbiAgICAgICAgICAgIGxhc3RTZWVuW3R5cGVOYW1lXSA9IHBvcztcbiAgICAgICAgICAgIC8vIEVucXVldWUgdGhlIGJhc2UgbmFtZXMgb2YgdGhpcyB0eXBlLlxuICAgICAgICAgICAgbGlzdC5wdXNoLmFwcGx5KGxpc3QsIGQuYmFzZU5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb21wYWN0aW9uIGxvb3AgdG8gcmVtb3ZlIGFycmF5IGhvbGVzLlxuICAgICAgICBmb3IgKHZhciB0byA9IDAsIGZyb20gPSB0bywgbGVuID0gbGlzdC5sZW5ndGg7IGZyb20gPCBsZW47ICsrZnJvbSkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGxpc3QsIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgbGlzdFt0bysrXSA9IGxpc3RbZnJvbV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGlzdC5sZW5ndGggPSB0bztcbiAgICB9XG4gICAgZnVuY3Rpb24gZXh0ZW5kKGludG8sIGZyb20pIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZnJvbSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgaW50b1tuYW1lXSA9IGZyb21bbmFtZV07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW50bztcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluYWxpemUoKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGRlZkNhY2hlKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICBkZWZDYWNoZVtuYW1lXS5maW5hbGl6ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgVHlwZTogVHlwZSxcbiAgICAgICAgYnVpbHRJblR5cGVzOiBidWlsdEluVHlwZXMsXG4gICAgICAgIGdldFN1cGVydHlwZU5hbWVzOiBnZXRTdXBlcnR5cGVOYW1lcyxcbiAgICAgICAgY29tcHV0ZVN1cGVydHlwZUxvb2t1cFRhYmxlOiBjb21wdXRlU3VwZXJ0eXBlTG9va3VwVGFibGUsXG4gICAgICAgIGJ1aWxkZXJzOiBidWlsZGVycyxcbiAgICAgICAgZGVmaW5lTWV0aG9kOiBkZWZpbmVNZXRob2QsXG4gICAgICAgIGdldEJ1aWxkZXJOYW1lOiBnZXRCdWlsZGVyTmFtZSxcbiAgICAgICAgZ2V0U3RhdGVtZW50QnVpbGRlck5hbWU6IGdldFN0YXRlbWVudEJ1aWxkZXJOYW1lLFxuICAgICAgICBuYW1lZFR5cGVzOiBuYW1lZFR5cGVzLFxuICAgICAgICBnZXRGaWVsZE5hbWVzOiBnZXRGaWVsZE5hbWVzLFxuICAgICAgICBnZXRGaWVsZFZhbHVlOiBnZXRGaWVsZFZhbHVlLFxuICAgICAgICBlYWNoRmllbGQ6IGVhY2hGaWVsZCxcbiAgICAgICAgc29tZUZpZWxkOiBzb21lRmllbGQsXG4gICAgICAgIGZpbmFsaXplOiBmaW5hbGl6ZSxcbiAgICB9O1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gdHlwZXNQbHVnaW47XG47XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudmlzaXQgPSBleHBvcnRzLnVzZSA9IGV4cG9ydHMuVHlwZSA9IGV4cG9ydHMuc29tZUZpZWxkID0gZXhwb3J0cy5QYXRoVmlzaXRvciA9IGV4cG9ydHMuUGF0aCA9IGV4cG9ydHMuTm9kZVBhdGggPSBleHBvcnRzLm5hbWVkVHlwZXMgPSBleHBvcnRzLmdldFN1cGVydHlwZU5hbWVzID0gZXhwb3J0cy5nZXRGaWVsZFZhbHVlID0gZXhwb3J0cy5nZXRGaWVsZE5hbWVzID0gZXhwb3J0cy5nZXRCdWlsZGVyTmFtZSA9IGV4cG9ydHMuZmluYWxpemUgPSBleHBvcnRzLmVhY2hGaWVsZCA9IGV4cG9ydHMuZGVmaW5lTWV0aG9kID0gZXhwb3J0cy5idWlsdEluVHlwZXMgPSBleHBvcnRzLmJ1aWxkZXJzID0gZXhwb3J0cy5hc3ROb2Rlc0FyZUVxdWl2YWxlbnQgPSB2b2lkIDA7XG52YXIgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbnZhciBmb3JrXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9mb3JrXCIpKTtcbnZhciBjb3JlXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvY29yZVwiKSk7XG52YXIgZXM2XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvZXM2XCIpKTtcbnZhciBlczdfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9lczdcIikpO1xudmFyIGVzMjAyMF8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZGVmL2VzMjAyMFwiKSk7XG52YXIganN4XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvanN4XCIpKTtcbnZhciBmbG93XzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvZmxvd1wiKSk7XG52YXIgZXNwcmltYV8xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZGVmL2VzcHJpbWFcIikpO1xudmFyIGJhYmVsXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kZWYvYmFiZWxcIikpO1xudmFyIHR5cGVzY3JpcHRfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi90eXBlc2NyaXB0XCIpKTtcbnZhciBlc19wcm9wb3NhbHNfMSA9IHRzbGliXzEuX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2RlZi9lcy1wcm9wb3NhbHNcIikpO1xudmFyIG5hbWVkVHlwZXNfMSA9IHJlcXVpcmUoXCIuL2dlbi9uYW1lZFR5cGVzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibmFtZWRUeXBlc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmFtZWRUeXBlc18xLm5hbWVkVHlwZXM7IH0gfSk7XG52YXIgX2EgPSBmb3JrXzEuZGVmYXVsdChbXG4gICAgLy8gVGhpcyBjb3JlIG1vZHVsZSBvZiBBU1QgdHlwZXMgY2FwdHVyZXMgRVM1IGFzIGl0IGlzIHBhcnNlZCB0b2RheSBieVxuICAgIC8vIGdpdDovL2dpdGh1Yi5jb20vYXJpeWEvZXNwcmltYS5naXQjbWFzdGVyLlxuICAgIGNvcmVfMS5kZWZhdWx0LFxuICAgIC8vIEZlZWwgZnJlZSB0byBhZGQgdG8gb3IgcmVtb3ZlIGZyb20gdGhpcyBsaXN0IG9mIGV4dGVuc2lvbiBtb2R1bGVzIHRvXG4gICAgLy8gY29uZmlndXJlIHRoZSBwcmVjaXNlIHR5cGUgaGllcmFyY2h5IHRoYXQgeW91IG5lZWQuXG4gICAgZXM2XzEuZGVmYXVsdCxcbiAgICBlczdfMS5kZWZhdWx0LFxuICAgIGVzMjAyMF8xLmRlZmF1bHQsXG4gICAganN4XzEuZGVmYXVsdCxcbiAgICBmbG93XzEuZGVmYXVsdCxcbiAgICBlc3ByaW1hXzEuZGVmYXVsdCxcbiAgICBiYWJlbF8xLmRlZmF1bHQsXG4gICAgdHlwZXNjcmlwdF8xLmRlZmF1bHQsXG4gICAgZXNfcHJvcG9zYWxzXzEuZGVmYXVsdCxcbl0pLCBhc3ROb2Rlc0FyZUVxdWl2YWxlbnQgPSBfYS5hc3ROb2Rlc0FyZUVxdWl2YWxlbnQsIGJ1aWxkZXJzID0gX2EuYnVpbGRlcnMsIGJ1aWx0SW5UeXBlcyA9IF9hLmJ1aWx0SW5UeXBlcywgZGVmaW5lTWV0aG9kID0gX2EuZGVmaW5lTWV0aG9kLCBlYWNoRmllbGQgPSBfYS5lYWNoRmllbGQsIGZpbmFsaXplID0gX2EuZmluYWxpemUsIGdldEJ1aWxkZXJOYW1lID0gX2EuZ2V0QnVpbGRlck5hbWUsIGdldEZpZWxkTmFtZXMgPSBfYS5nZXRGaWVsZE5hbWVzLCBnZXRGaWVsZFZhbHVlID0gX2EuZ2V0RmllbGRWYWx1ZSwgZ2V0U3VwZXJ0eXBlTmFtZXMgPSBfYS5nZXRTdXBlcnR5cGVOYW1lcywgbiA9IF9hLm5hbWVkVHlwZXMsIE5vZGVQYXRoID0gX2EuTm9kZVBhdGgsIFBhdGggPSBfYS5QYXRoLCBQYXRoVmlzaXRvciA9IF9hLlBhdGhWaXNpdG9yLCBzb21lRmllbGQgPSBfYS5zb21lRmllbGQsIFR5cGUgPSBfYS5UeXBlLCB1c2UgPSBfYS51c2UsIHZpc2l0ID0gX2EudmlzaXQ7XG5leHBvcnRzLmFzdE5vZGVzQXJlRXF1aXZhbGVudCA9IGFzdE5vZGVzQXJlRXF1aXZhbGVudDtcbmV4cG9ydHMuYnVpbGRlcnMgPSBidWlsZGVycztcbmV4cG9ydHMuYnVpbHRJblR5cGVzID0gYnVpbHRJblR5cGVzO1xuZXhwb3J0cy5kZWZpbmVNZXRob2QgPSBkZWZpbmVNZXRob2Q7XG5leHBvcnRzLmVhY2hGaWVsZCA9IGVhY2hGaWVsZDtcbmV4cG9ydHMuZmluYWxpemUgPSBmaW5hbGl6ZTtcbmV4cG9ydHMuZ2V0QnVpbGRlck5hbWUgPSBnZXRCdWlsZGVyTmFtZTtcbmV4cG9ydHMuZ2V0RmllbGROYW1lcyA9IGdldEZpZWxkTmFtZXM7XG5leHBvcnRzLmdldEZpZWxkVmFsdWUgPSBnZXRGaWVsZFZhbHVlO1xuZXhwb3J0cy5nZXRTdXBlcnR5cGVOYW1lcyA9IGdldFN1cGVydHlwZU5hbWVzO1xuZXhwb3J0cy5Ob2RlUGF0aCA9IE5vZGVQYXRoO1xuZXhwb3J0cy5QYXRoID0gUGF0aDtcbmV4cG9ydHMuUGF0aFZpc2l0b3IgPSBQYXRoVmlzaXRvcjtcbmV4cG9ydHMuc29tZUZpZWxkID0gc29tZUZpZWxkO1xuZXhwb3J0cy5UeXBlID0gVHlwZTtcbmV4cG9ydHMudXNlID0gdXNlO1xuZXhwb3J0cy52aXNpdCA9IHZpc2l0O1xuLy8gUG9wdWxhdGUgdGhlIGV4cG9ydGVkIGZpZWxkcyBvZiB0aGUgbmFtZWRUeXBlcyBuYW1lc3BhY2UsIHdoaWxlIHN0aWxsXG4vLyByZXRhaW5pbmcgaXRzIG1lbWJlciB0eXBlcy5cbk9iamVjdC5hc3NpZ24obmFtZWRUeXBlc18xLm5hbWVkVHlwZXMsIG4pO1xuIiwiZnVuY3Rpb24gaXNCdWZmZXIgKHZhbHVlKSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheVxufVxuXG5mdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICByZXR1cm4gQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gQnVmZmVyLmFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAoc2l6ZSkge1xuICByZXR1cm4gQnVmZmVyLmFsbG9jVW5zYWZlKHNpemUpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlU2xvdyAoc2l6ZSkge1xuICByZXR1cm4gQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyhzaXplKVxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIHJldHVybiBCdWZmZXIuY29tcGFyZShhLCBiKVxufVxuXG5mdW5jdGlvbiBjb25jYXQgKGJ1ZmZlcnMsIHRvdGFsTGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMsIHRvdGFsTGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBjb3B5IChzb3VyY2UsIHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKHNvdXJjZSkuY29weSh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKVxufVxuXG5mdW5jdGlvbiBlcXVhbHMgKGEsIGIpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGEpLmVxdWFscyhiKVxufVxuXG5mdW5jdGlvbiBmaWxsIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuZmlsbCh2YWx1ZSwgb2Zmc2V0LCBlbmQsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBpbmNsdWRlcyAoYnVmZmVyLCB2YWx1ZSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuaW5jbHVkZXModmFsdWUsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBpbmRleE9mIChidWZmZXIsIHZhbHVlLCBieWZlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5pbmRleE9mKHZhbHVlLCBieWZlT2Zmc2V0LCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gbGFzdEluZGV4T2YgKGJ1ZmZlciwgdmFsdWUsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLmxhc3RJbmRleE9mKHZhbHVlLCBieXRlT2Zmc2V0LCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gc3dhcDE2IChidWZmZXIpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuc3dhcDE2KClcbn1cblxuZnVuY3Rpb24gc3dhcDMyIChidWZmZXIpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuc3dhcDMyKClcbn1cblxuZnVuY3Rpb24gc3dhcDY0IChidWZmZXIpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikuc3dhcDY0KClcbn1cblxuZnVuY3Rpb24gdG9CdWZmZXIgKGJ1ZmZlcikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGJ1ZmZlcikpIHJldHVybiBidWZmZXJcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ1ZmZlci5idWZmZXIsIGJ1ZmZlci5ieXRlT2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbn1cblxuZnVuY3Rpb24gdG9TdHJpbmcgKGJ1ZmZlciwgZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikudG9TdHJpbmcoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlIChidWZmZXIsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZUxFIChidWZmZXIsIHZhbHVlLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGVEb3VibGVMRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0TEUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZUZsb2F0TEUodmFsdWUsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlVUludDMyTEUodmFsdWUsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gd3JpdGVJbnQzMkxFIChidWZmZXIsIHZhbHVlLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGVJbnQzMkxFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWREb3VibGVMRSAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikucmVhZERvdWJsZUxFKG9mZnNldClcbn1cblxuZnVuY3Rpb24gcmVhZEZsb2F0TEUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWRGbG9hdExFKG9mZnNldClcbn1cblxuZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkVUludDMyTEUob2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkSW50MzJMRSAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikucmVhZEludDMyTEUob2Zmc2V0KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNCdWZmZXIsXG4gIGlzRW5jb2RpbmcsXG4gIGFsbG9jLFxuICBhbGxvY1Vuc2FmZSxcbiAgYWxsb2NVbnNhZmVTbG93LFxuICBieXRlTGVuZ3RoLFxuICBjb21wYXJlLFxuICBjb25jYXQsXG4gIGNvcHksXG4gIGVxdWFscyxcbiAgZmlsbCxcbiAgZnJvbSxcbiAgaW5jbHVkZXMsXG4gIGluZGV4T2YsXG4gIGxhc3RJbmRleE9mLFxuICBzd2FwMTYsXG4gIHN3YXAzMixcbiAgc3dhcDY0LFxuICB0b0J1ZmZlcixcbiAgdG9TdHJpbmcsXG4gIHdyaXRlLFxuICB3cml0ZURvdWJsZUxFLFxuICB3cml0ZUZsb2F0TEUsXG4gIHdyaXRlVUludDMyTEUsXG4gIHdyaXRlSW50MzJMRSxcbiAgcmVhZERvdWJsZUxFLFxuICByZWFkRmxvYXRMRSxcbiAgcmVhZFVJbnQzMkxFLFxuICByZWFkSW50MzJMRVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNsaWVudCA9IHZvaWQgMDtcbmNvbnN0IGZzXzEgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCBwYXRoXzEgPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IHRsc18xID0gcmVxdWlyZShcInRsc1wiKTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCJ1dGlsXCIpO1xuY29uc3QgRnRwQ29udGV4dF8xID0gcmVxdWlyZShcIi4vRnRwQ29udGV4dFwiKTtcbmNvbnN0IHBhcnNlTGlzdF8xID0gcmVxdWlyZShcIi4vcGFyc2VMaXN0XCIpO1xuY29uc3QgUHJvZ3Jlc3NUcmFja2VyXzEgPSByZXF1aXJlKFwiLi9Qcm9ncmVzc1RyYWNrZXJcIik7XG5jb25zdCBTdHJpbmdXcml0ZXJfMSA9IHJlcXVpcmUoXCIuL1N0cmluZ1dyaXRlclwiKTtcbmNvbnN0IHBhcnNlTGlzdE1MU0RfMSA9IHJlcXVpcmUoXCIuL3BhcnNlTGlzdE1MU0RcIik7XG5jb25zdCBuZXRVdGlsc18xID0gcmVxdWlyZShcIi4vbmV0VXRpbHNcIik7XG5jb25zdCB0cmFuc2Zlcl8xID0gcmVxdWlyZShcIi4vdHJhbnNmZXJcIik7XG5jb25zdCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xID0gcmVxdWlyZShcIi4vcGFyc2VDb250cm9sUmVzcG9uc2VcIik7XG4vLyBVc2UgcHJvbWlzaWZ5IHRvIGtlZXAgdGhlIGxpYnJhcnkgY29tcGF0aWJsZSB3aXRoIE5vZGUgOC5cbmNvbnN0IGZzUmVhZERpciA9ICgwLCB1dGlsXzEucHJvbWlzaWZ5KShmc18xLnJlYWRkaXIpO1xuY29uc3QgZnNNa0RpciA9ICgwLCB1dGlsXzEucHJvbWlzaWZ5KShmc18xLm1rZGlyKTtcbmNvbnN0IGZzU3RhdCA9ICgwLCB1dGlsXzEucHJvbWlzaWZ5KShmc18xLnN0YXQpO1xuY29uc3QgZnNPcGVuID0gKDAsIHV0aWxfMS5wcm9taXNpZnkpKGZzXzEub3Blbik7XG5jb25zdCBmc0Nsb3NlID0gKDAsIHV0aWxfMS5wcm9taXNpZnkpKGZzXzEuY2xvc2UpO1xuY29uc3QgZnNVbmxpbmsgPSAoMCwgdXRpbF8xLnByb21pc2lmeSkoZnNfMS51bmxpbmspO1xuY29uc3QgTElTVF9DT01NQU5EU19ERUZBVUxUID0gKCkgPT4gW1wiTElTVCAtYVwiLCBcIkxJU1RcIl07XG5jb25zdCBMSVNUX0NPTU1BTkRTX01MU0QgPSAoKSA9PiBbXCJNTFNEXCIsIFwiTElTVCAtYVwiLCBcIkxJU1RcIl07XG4vKipcbiAqIEhpZ2gtbGV2ZWwgQVBJIHRvIGludGVyYWN0IHdpdGggYW4gRlRQIHNlcnZlci5cbiAqL1xuY2xhc3MgQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKiBJbnN0YW50aWF0ZSBhbiBGVFAgY2xpZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHRpbWVvdXQgIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLCB1c2UgMCBmb3Igbm8gdGltZW91dC4gT3B0aW9uYWwsIGRlZmF1bHQgaXMgMzAgc2Vjb25kcy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0aW1lb3V0ID0gMzAwMDApIHtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVMaXN0Q29tbWFuZHMgPSBMSVNUX0NPTU1BTkRTX0RFRkFVTFQoKTtcbiAgICAgICAgdGhpcy5mdHAgPSBuZXcgRnRwQ29udGV4dF8xLkZUUENvbnRleHQodGltZW91dCk7XG4gICAgICAgIHRoaXMucHJlcGFyZVRyYW5zZmVyID0gdGhpcy5fZW50ZXJGaXJzdENvbXBhdGlibGVNb2RlKFt0cmFuc2Zlcl8xLmVudGVyUGFzc2l2ZU1vZGVJUHY2LCB0cmFuc2Zlcl8xLmVudGVyUGFzc2l2ZU1vZGVJUHY0XSk7XG4gICAgICAgIHRoaXMucGFyc2VMaXN0ID0gcGFyc2VMaXN0XzEucGFyc2VMaXN0O1xuICAgICAgICB0aGlzLl9wcm9ncmVzc1RyYWNrZXIgPSBuZXcgUHJvZ3Jlc3NUcmFja2VyXzEuUHJvZ3Jlc3NUcmFja2VyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjbGllbnQgYW5kIGFsbCBvcGVuIHNvY2tldCBjb25uZWN0aW9ucy5cbiAgICAgKlxuICAgICAqIENsb3NlIHRoZSBjbGllbnQgYW5kIGFsbCBvcGVuIHNvY2tldCBjb25uZWN0aW9ucy4gVGhlIGNsaWVudCBjYW7igJl0IGJlIHVzZWQgYW55bW9yZSBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLFxuICAgICAqIHlvdSBoYXZlIHRvIGVpdGhlciByZWNvbm5lY3Qgd2l0aCBgYWNjZXNzYCBvciBgY29ubmVjdGAgb3IgaW5zdGFudGlhdGUgYSBuZXcgaW5zdGFuY2UgdG8gY29udGludWUgYW55IHdvcmsuXG4gICAgICogQSBjbGllbnQgaXMgYWxzbyBjbG9zZWQgYXV0b21hdGljYWxseSBpZiBhbnkgdGltZW91dCBvciBjb25uZWN0aW9uIGVycm9yIG9jY3Vycy5cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5mdHAuY2xvc2UoKTtcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3NUcmFja2VyLnN0b3AoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjbGllbnQgaXMgY2xvc2VkIGFuZCBjYW4ndCBiZSB1c2VkIGFueW1vcmUuXG4gICAgICovXG4gICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnRwLmNsb3NlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29ubmVjdCAob3IgcmVjb25uZWN0KSB0byBhbiBGVFAgc2VydmVyLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhbiBpbnN0YW5jZSBtZXRob2QgYW5kIHRodXMgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgdGhlIGxpZmVjeWNsZSBvZiBhIGBDbGllbnRgXG4gICAgICogaW5zdGFuY2UuIFdoZW5ldmVyIHlvdSBkbywgdGhlIGNsaWVudCBpcyByZXNldCB3aXRoIGEgbmV3IGNvbnRyb2wgY29ubmVjdGlvbi4gVGhpcyBhbHNvIGltcGxpZXMgdGhhdFxuICAgICAqIHlvdSBjYW4gcmVvcGVuIGEgYENsaWVudGAgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIHdoZW4gcmVjb25uZWN0aW5nIHdpdGggdGhpc1xuICAgICAqIG1ldGhvZC4gSW4gZmFjdCwgcmVjb25uZWN0aW5nIGlzIHRoZSBvbmx5IHdheSB0byBjb250aW51ZSB1c2luZyBhIGNsb3NlZCBgQ2xpZW50YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBob3N0ICBIb3N0IHRoZSBjbGllbnQgc2hvdWxkIGNvbm5lY3QgdG8uIE9wdGlvbmFsLCBkZWZhdWx0IGlzIFwibG9jYWxob3N0XCIuXG4gICAgICogQHBhcmFtIHBvcnQgIFBvcnQgdGhlIGNsaWVudCBzaG91bGQgY29ubmVjdCB0by4gT3B0aW9uYWwsIGRlZmF1bHQgaXMgMjEuXG4gICAgICovXG4gICAgY29ubmVjdChob3N0ID0gXCJsb2NhbGhvc3RcIiwgcG9ydCA9IDIxKSB7XG4gICAgICAgIHRoaXMuZnRwLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZnRwLnNvY2tldC5jb25uZWN0KHtcbiAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICBwb3J0LFxuICAgICAgICAgICAgZmFtaWx5OiB0aGlzLmZ0cC5pcEZhbWlseVxuICAgICAgICB9LCAoKSA9PiB0aGlzLmZ0cC5sb2coYENvbm5lY3RlZCB0byAkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlQWRkcmVzcykodGhpcy5mdHAuc29ja2V0KX0gKCR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVUTFMpKHRoaXMuZnRwLnNvY2tldCl9KWApKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUNvbm5lY3RSZXNwb25zZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcyBgY29ubmVjdGAgYnV0IHVzaW5nIGltcGxpY2l0IFRMUy4gSW1wbGljaXQgVExTIGlzIG5vdCBhbiBGVFAgc3RhbmRhcmQgYW5kIGhhcyBiZWVuIHJlcGxhY2VkIGJ5XG4gICAgICogZXhwbGljaXQgVExTLiBUaGVyZSBhcmUgc3RpbGwgRlRQIHNlcnZlcnMgdGhhdCBzdXBwb3J0IG9ubHkgaW1wbGljaXQgVExTLCB0aG91Z2guXG4gICAgICovXG4gICAgY29ubmVjdEltcGxpY2l0VExTKGhvc3QgPSBcImxvY2FsaG9zdFwiLCBwb3J0ID0gMjEsIHRsc09wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmZ0cC5yZXNldCgpO1xuICAgICAgICB0aGlzLmZ0cC5zb2NrZXQgPSAoMCwgdGxzXzEuY29ubmVjdCkocG9ydCwgaG9zdCwgdGxzT3B0aW9ucywgKCkgPT4gdGhpcy5mdHAubG9nKGBDb25uZWN0ZWQgdG8gJHsoMCwgbmV0VXRpbHNfMS5kZXNjcmliZUFkZHJlc3MpKHRoaXMuZnRwLnNvY2tldCl9ICgkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlVExTKSh0aGlzLmZ0cC5zb2NrZXQpfSlgKSk7XG4gICAgICAgIHRoaXMuZnRwLnRsc09wdGlvbnMgPSB0bHNPcHRpb25zO1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlQ29ubmVjdFJlc3BvbnNlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGZpcnN0IHJlcG9uc2UgYnkgYW4gRlRQIHNlcnZlciBhZnRlciB0aGUgc29ja2V0IGNvbm5lY3Rpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQuXG4gICAgICovXG4gICAgX2hhbmRsZUNvbm5lY3RSZXNwb25zZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnRwLmhhbmRsZSh1bmRlZmluZWQsIChyZXMsIHRhc2spID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZCBieSB0aGUgRlRQQ29udGV4dCBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgICAgIHRhc2sucmVqZWN0KHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgoMCwgcGFyc2VDb250cm9sUmVzcG9uc2VfMS5wb3NpdGl2ZUNvbXBsZXRpb24pKHJlcy5jb2RlKSkge1xuICAgICAgICAgICAgICAgIHRhc2sucmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVqZWN0IGFsbCBvdGhlciBjb2RlcywgaW5jbHVkaW5nIDEyMCBcIlNlcnZpY2UgcmVhZHkgaW4gbm5uIG1pbnV0ZXNcIi5cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IHN0YXkgY29ubmVjdGVkIGJ1dCBkb24ndCByZXBsYWNlIHRoZSBzb2NrZXQgeWV0IGJ5IHVzaW5nIHJlc2V0KClcbiAgICAgICAgICAgICAgICAvLyBzbyB0aGUgdXNlciBjYW4gaW5zcGVjdCBwcm9wZXJ0aWVzIG9mIHRoaXMgaW5zdGFuY2UuXG4gICAgICAgICAgICAgICAgdGFzay5yZWplY3QobmV3IEZ0cENvbnRleHRfMS5GVFBFcnJvcihyZXMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYW4gRlRQIGNvbW1hbmQgYW5kIGhhbmRsZSB0aGUgZmlyc3QgcmVzcG9uc2UuXG4gICAgICovXG4gICAgc2VuZChjb21tYW5kLCBpZ25vcmVFcnJvckNvZGVzREVQUkVDQVRFRCA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChpZ25vcmVFcnJvckNvZGVzREVQUkVDQVRFRCkgeyAvLyBEZXByZWNhdGVkIHN0YXJ0aW5nIGZyb20gMy45LjBcbiAgICAgICAgICAgIHRoaXMuZnRwLmxvZyhcIkRlcHJlY2F0ZWQgY2FsbCB1c2luZyBzZW5kKGNvbW1hbmQsIGZsYWcpIHdpdGggYm9vbGVhbiBmbGFnIHRvIGlnbm9yZSBlcnJvcnMuIFVzZSBzZW5kSWdub3JpbmdFcnJvcihjb21tYW5kKS5cIik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kSWdub3JpbmdFcnJvcihjb21tYW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5mdHAucmVxdWVzdChjb21tYW5kKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhbiBGVFAgY29tbWFuZCBhbmQgaWdub3JlIGFuIEZUUCBlcnJvciByZXNwb25zZS4gQW55IG90aGVyIGtpbmQgb2YgZXJyb3Igb3IgdGltZW91dCB3aWxsIHN0aWxsIHJlamVjdCB0aGUgUHJvbWlzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb21tYW5kXG4gICAgICovXG4gICAgc2VuZElnbm9yaW5nRXJyb3IoY29tbWFuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mdHAuaGFuZGxlKGNvbW1hbmQsIChyZXMsIHRhc2spID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBGdHBDb250ZXh0XzEuRlRQRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0YXNrLnJlc29sdmUoeyBjb2RlOiByZXMuY29kZSwgbWVzc2FnZTogcmVzLm1lc3NhZ2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXMgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRhc2sucmVqZWN0KHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXNrLnJlc29sdmUocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZ3JhZGUgdGhlIGN1cnJlbnQgc29ja2V0IGNvbm5lY3Rpb24gdG8gVExTLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgIFRMUyBvcHRpb25zIGFzIGluIGB0bHMuY29ubmVjdChvcHRpb25zKWAsIG9wdGlvbmFsLlxuICAgICAqIEBwYXJhbSBjb21tYW5kICBTZXQgdGhlIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmQuIE9wdGlvbmFsLCBkZWZhdWx0IGlzIFwiQVVUSCBUTFNcIi5cbiAgICAgKi9cbiAgICBhc3luYyB1c2VUTFMob3B0aW9ucyA9IHt9LCBjb21tYW5kID0gXCJBVVRIIFRMU1wiKSB7XG4gICAgICAgIGNvbnN0IHJldCA9IGF3YWl0IHRoaXMuc2VuZChjb21tYW5kKTtcbiAgICAgICAgdGhpcy5mdHAuc29ja2V0ID0gYXdhaXQgKDAsIG5ldFV0aWxzXzEudXBncmFkZVNvY2tldCkodGhpcy5mdHAuc29ja2V0LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5mdHAudGxzT3B0aW9ucyA9IG9wdGlvbnM7IC8vIEtlZXAgdGhlIFRMUyBvcHRpb25zIGZvciBsYXRlciBkYXRhIGNvbm5lY3Rpb25zIHRoYXQgc2hvdWxkIHVzZSB0aGUgc2FtZSBvcHRpb25zLlxuICAgICAgICB0aGlzLmZ0cC5sb2coYENvbnRyb2wgc29ja2V0IGlzIHVzaW5nOiAkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlVExTKSh0aGlzLmZ0cC5zb2NrZXQpfWApO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2dpbiBhIHVzZXIgd2l0aCBhIHBhc3N3b3JkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXIgIFVzZXJuYW1lIHRvIHVzZSBmb3IgbG9naW4uIE9wdGlvbmFsLCBkZWZhdWx0IGlzIFwiYW5vbnltb3VzXCIuXG4gICAgICogQHBhcmFtIHBhc3N3b3JkICBQYXNzd29yZCB0byB1c2UgZm9yIGxvZ2luLiBPcHRpb25hbCwgZGVmYXVsdCBpcyBcImd1ZXN0XCIuXG4gICAgICovXG4gICAgbG9naW4odXNlciA9IFwiYW5vbnltb3VzXCIsIHBhc3N3b3JkID0gXCJndWVzdFwiKSB7XG4gICAgICAgIHRoaXMuZnRwLmxvZyhgTG9naW4gc2VjdXJpdHk6ICR7KDAsIG5ldFV0aWxzXzEuZGVzY3JpYmVUTFMpKHRoaXMuZnRwLnNvY2tldCl9YCk7XG4gICAgICAgIHJldHVybiB0aGlzLmZ0cC5oYW5kbGUoXCJVU0VSIFwiICsgdXNlciwgKHJlcywgdGFzaykgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGFzay5yZWplY3QocmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCgwLCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xLnBvc2l0aXZlQ29tcGxldGlvbikocmVzLmNvZGUpKSB7IC8vIFVzZXIgbG9nZ2VkIGluIHByb2NlZWQgT1IgQ29tbWFuZCBzdXBlcmZsdW91c1xuICAgICAgICAgICAgICAgIHRhc2sucmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzLmNvZGUgPT09IDMzMSkgeyAvLyBVc2VyIG5hbWUgb2theSwgbmVlZCBwYXNzd29yZFxuICAgICAgICAgICAgICAgIHRoaXMuZnRwLnNlbmQoXCJQQVNTIFwiICsgcGFzc3dvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIEFsc28gcmVwb3J0IGVycm9yIG9uIDMzMiAoTmVlZCBhY2NvdW50KVxuICAgICAgICAgICAgICAgIHRhc2sucmVqZWN0KG5ldyBGdHBDb250ZXh0XzEuRlRQRXJyb3IocmVzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHVzdWFsIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgICpcbiAgICAgKiBTZXR0aW5ncyB1c2VkOlxuICAgICAqICogQmluYXJ5IG1vZGUgKFRZUEUgSSlcbiAgICAgKiAqIEZpbGUgc3RydWN0dXJlIChTVFJVIEYpXG4gICAgICogKiBBZGRpdGlvbmFsIHNldHRpbmdzIGZvciBGVFBTIChQQlNaIDAsIFBST1QgUClcbiAgICAgKi9cbiAgICBhc3luYyB1c2VEZWZhdWx0U2V0dGluZ3MoKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gYXdhaXQgdGhpcy5mZWF0dXJlcygpO1xuICAgICAgICAvLyBVc2UgTUxTRCBkaXJlY3RvcnkgbGlzdGluZyBpZiBwb3NzaWJsZS4gU2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNjU5I3NlY3Rpb24tNy44OlxuICAgICAgICAvLyBcIlRoZSBwcmVzZW5jZSBvZiB0aGUgTUxTVCBmZWF0dXJlIGluZGljYXRlcyB0aGF0IGJvdGggTUxTVCBhbmQgTUxTRCBhcmUgc3VwcG9ydGVkLlwiXG4gICAgICAgIGNvbnN0IHN1cHBvcnRzTUxTRCA9IGZlYXR1cmVzLmhhcyhcIk1MU1RcIik7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGlzdENvbW1hbmRzID0gc3VwcG9ydHNNTFNEID8gTElTVF9DT01NQU5EU19NTFNEKCkgOiBMSVNUX0NPTU1BTkRTX0RFRkFVTFQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kKFwiVFlQRSBJXCIpOyAvLyBCaW5hcnkgbW9kZVxuICAgICAgICBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiU1RSVSBGXCIpOyAvLyBVc2UgZmlsZSBzdHJ1Y3R1cmVcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kSWdub3JpbmdFcnJvcihcIk9QVFMgVVRGOCBPTlwiKTsgLy8gU29tZSBzZXJ2ZXJzIGV4cGVjdCBVVEYtOCB0byBiZSBlbmFibGVkIGV4cGxpY2l0bHkgYW5kIHNldHRpbmcgYmVmb3JlIGxvZ2luIG1pZ2h0IG5vdCBoYXZlIHdvcmtlZC5cbiAgICAgICAgaWYgKHN1cHBvcnRzTUxTRCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kSWdub3JpbmdFcnJvcihcIk9QVFMgTUxTVCB0eXBlO3NpemU7bW9kaWZ5O3VuaXF1ZTt1bml4Lm1vZGU7dW5peC5vd25lcjt1bml4Lmdyb3VwO3VuaXgub3duZXJuYW1lO3VuaXguZ3JvdXBuYW1lO1wiKTsgLy8gTWFrZSBzdXJlIE1MU0QgbGlzdGluZ3MgaW5jbHVkZSBhbGwgd2UgY2FuIHBhcnNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZnRwLmhhc1RMUykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kSWdub3JpbmdFcnJvcihcIlBCU1ogMFwiKTsgLy8gU2V0IHRvIDAgZm9yIFRMU1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZW5kSWdub3JpbmdFcnJvcihcIlBST1QgUFwiKTsgLy8gUHJvdGVjdCBjaGFubmVsIChhbHNvIGZvciBkYXRhIGNvbm5lY3Rpb25zKVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNhbGxzIGBjb25uZWN0YCwgYHVzZVRMU2AsIGBsb2dpbmAgYW5kIGB1c2VEZWZhdWx0U2V0dGluZ3NgLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBhbiBpbnN0YW5jZSBtZXRob2QgYW5kIHRodXMgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgdGhlIGxpZmVjeWNsZSBvZiBhIGBDbGllbnRgXG4gICAgICogaW5zdGFuY2UuIFdoZW5ldmVyIHlvdSBkbywgdGhlIGNsaWVudCBpcyByZXNldCB3aXRoIGEgbmV3IGNvbnRyb2wgY29ubmVjdGlvbi4gVGhpcyBhbHNvIGltcGxpZXMgdGhhdFxuICAgICAqIHlvdSBjYW4gcmVvcGVuIGEgYENsaWVudGAgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIHdoZW4gcmVjb25uZWN0aW5nIHdpdGggdGhpc1xuICAgICAqIG1ldGhvZC4gSW4gZmFjdCwgcmVjb25uZWN0aW5nIGlzIHRoZSBvbmx5IHdheSB0byBjb250aW51ZSB1c2luZyBhIGNsb3NlZCBgQ2xpZW50YC5cbiAgICAgKi9cbiAgICBhc3luYyBhY2Nlc3Mob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IHVzZUV4cGxpY2l0VExTID0gb3B0aW9ucy5zZWN1cmUgPT09IHRydWU7XG4gICAgICAgIGNvbnN0IHVzZUltcGxpY2l0VExTID0gb3B0aW9ucy5zZWN1cmUgPT09IFwiaW1wbGljaXRcIjtcbiAgICAgICAgbGV0IHdlbGNvbWU7XG4gICAgICAgIGlmICh1c2VJbXBsaWNpdFRMUykge1xuICAgICAgICAgICAgd2VsY29tZSA9IGF3YWl0IHRoaXMuY29ubmVjdEltcGxpY2l0VExTKG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0LCBvcHRpb25zLnNlY3VyZU9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2VsY29tZSA9IGF3YWl0IHRoaXMuY29ubmVjdChvcHRpb25zLmhvc3QsIG9wdGlvbnMucG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVzZUV4cGxpY2l0VExTKSB7XG4gICAgICAgICAgICAvLyBGaXhlcyBodHRwczovL2dpdGh1Yi5jb20vcGF0cmlja2p1Y2hsaS9iYXNpYy1mdHAvaXNzdWVzLzE2NiBieSBtYWtpbmcgc3VyZVxuICAgICAgICAgICAgLy8gaG9zdCBpcyBzZXQgZm9yIGFueSBmdXR1cmUgZGF0YSBjb25uZWN0aW9uIGFzIHdlbGwuXG4gICAgICAgICAgICBjb25zdCBzZWN1cmVPcHRpb25zID0gKF9hID0gb3B0aW9ucy5zZWN1cmVPcHRpb25zKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fTtcbiAgICAgICAgICAgIHNlY3VyZU9wdGlvbnMuaG9zdCA9IChfYiA9IHNlY3VyZU9wdGlvbnMuaG9zdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogb3B0aW9ucy5ob3N0O1xuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VUTFMoc2VjdXJlT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IFVURi04IG9uIGJlZm9yZSBsb2dpbiBpbiBjYXNlIHRoZXJlIGFyZSBub24tYXNjaWkgY2hhcmFjdGVycyBpbiB1c2VyIG9yIHBhc3N3b3JkLlxuICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtaWdodCBub3Qgd29yayBiZWZvcmUgbG9naW4gZGVwZW5kaW5nIG9uIHNlcnZlci5cbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kSWdub3JpbmdFcnJvcihcIk9QVFMgVVRGOCBPTlwiKTtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dpbihvcHRpb25zLnVzZXIsIG9wdGlvbnMucGFzc3dvcmQpO1xuICAgICAgICBhd2FpdCB0aGlzLnVzZURlZmF1bHRTZXR0aW5ncygpO1xuICAgICAgICByZXR1cm4gd2VsY29tZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgICAqL1xuICAgIGFzeW5jIHB3ZCgpIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zZW5kKFwiUFdEXCIpO1xuICAgICAgICAvLyBUaGUgZGlyZWN0b3J5IGlzIHBhcnQgb2YgdGhlIHJldHVybiBtZXNzYWdlLCBmb3IgZXhhbXBsZTpcbiAgICAgICAgLy8gMjU3IFwiL3RoaXMvdGhhdFwiIGlzIGN1cnJlbnQgZGlyZWN0b3J5LlxuICAgICAgICBjb25zdCBwYXJzZWQgPSByZXMubWVzc2FnZS5tYXRjaCgvXCIoLispXCIvKTtcbiAgICAgICAgaWYgKHBhcnNlZCA9PT0gbnVsbCB8fCBwYXJzZWRbMV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBwYXJzZSByZXNwb25zZSB0byBjb21tYW5kICdQV0QnOiAke3Jlcy5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWRbMV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhIGRlc2NyaXB0aW9uIG9mIHN1cHBvcnRlZCBmZWF0dXJlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgc2VuZHMgdGhlIEZFQVQgY29tbWFuZCBhbmQgcGFyc2VzIHRoZSByZXN1bHQgaW50byBhIE1hcCB3aGVyZSBrZXlzIGNvcnJlc3BvbmQgdG8gYXZhaWxhYmxlIGNvbW1hbmRzXG4gICAgICogYW5kIHZhbHVlcyBob2xkIGZ1cnRoZXIgaW5mb3JtYXRpb24uIEJlIGF3YXJlIHRoYXQgeW91ciBGVFAgc2VydmVycyBtaWdodCBub3Qgc3VwcG9ydCB0aGlzXG4gICAgICogY29tbWFuZCBpbiB3aGljaCBjYXNlIHRoaXMgbWV0aG9kIHdpbGwgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBidXQganVzdCByZXR1cm4gYW4gZW1wdHkgTWFwLlxuICAgICAqL1xuICAgIGFzeW5jIGZlYXR1cmVzKCkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKFwiRkVBVFwiKTtcbiAgICAgICAgY29uc3QgZmVhdHVyZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIE5vdCBzdXBwb3J0aW5nIGFueSBzcGVjaWFsIGZlYXR1cmVzIHdpbGwgYmUgcmVwb3J0ZWQgd2l0aCBhIHNpbmdsZSBsaW5lLlxuICAgICAgICBpZiAocmVzLmNvZGUgPCA0MDAgJiYgKDAsIHBhcnNlQ29udHJvbFJlc3BvbnNlXzEuaXNNdWx0aWxpbmUpKHJlcy5tZXNzYWdlKSkge1xuICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGFuZCBsYXN0IGxpbmUgd3JhcCB0aGUgbXVsdGlsaW5lIHJlc3BvbnNlLCBpZ25vcmUgdGhlbS5cbiAgICAgICAgICAgIHJlcy5tZXNzYWdlLnNwbGl0KFwiXFxuXCIpLnNsaWNlKDEsIC0xKS5mb3JFYWNoKGxpbmUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEEgdHlwaWNhbCBsaW5lcyBsb29rcyBsaWtlOiBcIiBSRVNUIFNUUkVBTVwiIG9yIFwiIE1EVE1cIi5cbiAgICAgICAgICAgICAgICAvLyBTZXJ2ZXJzIG1pZ2h0IG5vdCB1c2UgYW4gaW5kZW50YXRpb24gdGhvdWdoLlxuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gbGluZS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzLnNldChlbnRyeVswXSwgZW50cnlbMV0gfHwgXCJcIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgYXN5bmMgY2QocGF0aCkge1xuICAgICAgICBjb25zdCB2YWxpZFBhdGggPSBhd2FpdCB0aGlzLnByb3RlY3RXaGl0ZXNwYWNlKHBhdGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKFwiQ1dEIFwiICsgdmFsaWRQYXRoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3dpdGNoIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICBhc3luYyBjZHVwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKFwiQ0RVUFwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgYSBmaWxlLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZXZlcnkgRlRQIHNlcnZlciwgaW4gd2hpY2ggY2FzZVxuICAgICAqIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gICAgICovXG4gICAgYXN5bmMgbGFzdE1vZChwYXRoKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkUGF0aCA9IGF3YWl0IHRoaXMucHJvdGVjdFdoaXRlc3BhY2UocGF0aCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VuZChgTURUTSAke3ZhbGlkUGF0aH1gKTtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHJlcy5tZXNzYWdlLnNsaWNlKDQpO1xuICAgICAgICByZXR1cm4gKDAsIHBhcnNlTGlzdE1MU0RfMS5wYXJzZU1MU3hEYXRlKShkYXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzaXplIG9mIGEgZmlsZS5cbiAgICAgKi9cbiAgICBhc3luYyBzaXplKHBhdGgpIHtcbiAgICAgICAgY29uc3QgdmFsaWRQYXRoID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShwYXRoKTtcbiAgICAgICAgY29uc3QgY29tbWFuZCA9IGBTSVpFICR7dmFsaWRQYXRofWA7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2VuZChjb21tYW5kKTtcbiAgICAgICAgLy8gVGhlIHNpemUgaXMgcGFydCBvZiB0aGUgcmVzcG9uc2UgbWVzc2FnZSwgZm9yIGV4YW1wbGU6IFwiMjEzIDU1NTU1NVwiLiBJdCdzXG4gICAgICAgIC8vIHBvc3NpYmxlIHRoYXQgdGhlcmUgaXMgYSBjb21tbWVudGFyeSBhcHBlbmRlZCBsaWtlIFwiMjEzIDU1NTUsIHNvbWUgY29tbWVudGFyeVwiLlxuICAgICAgICBjb25zdCBzaXplID0gcGFyc2VJbnQocmVzLm1lc3NhZ2Uuc2xpY2UoNCksIDEwKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihzaXplKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBwYXJzZSByZXNwb25zZSB0byBjb21tYW5kICcke2NvbW1hbmR9JyBhcyBhIG51bWVyaWNhbCB2YWx1ZTogJHtyZXMubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVuYW1lIGEgZmlsZS5cbiAgICAgKlxuICAgICAqIERlcGVuZGluZyBvbiB0aGUgRlRQIHNlcnZlciB0aGlzIG1pZ2h0IGFsc28gYmUgdXNlZCB0byBtb3ZlIGEgZmlsZSBmcm9tIG9uZVxuICAgICAqIGRpcmVjdG9yeSB0byBhbm90aGVyIGJ5IHByb3ZpZGluZyBmdWxsIHBhdGhzLlxuICAgICAqL1xuICAgIGFzeW5jIHJlbmFtZShzcmNQYXRoLCBkZXN0UGF0aCkge1xuICAgICAgICBjb25zdCB2YWxpZFNyYyA9IGF3YWl0IHRoaXMucHJvdGVjdFdoaXRlc3BhY2Uoc3JjUGF0aCk7XG4gICAgICAgIGNvbnN0IHZhbGlkRGVzdCA9IGF3YWl0IHRoaXMucHJvdGVjdFdoaXRlc3BhY2UoZGVzdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmQoXCJSTkZSIFwiICsgdmFsaWRTcmMpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKFwiUk5UTyBcIiArIHZhbGlkRGVzdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGZpbGUgZnJvbSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gaWdub3JlIEZUUCBlcnJvciByZXR1cm4gY29kZXMgd2hpY2ggd29uJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGUuZy5cbiAgICAgKiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuICAgIGFzeW5jIHJlbW92ZShwYXRoLCBpZ25vcmVFcnJvckNvZGVzID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgdmFsaWRQYXRoID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShwYXRoKTtcbiAgICAgICAgaWYgKGlnbm9yZUVycm9yQ29kZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmRJZ25vcmluZ0Vycm9yKGBERUxFICR7dmFsaWRQYXRofWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQoYERFTEUgJHt2YWxpZFBhdGh9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlcG9ydCB0cmFuc2ZlciBwcm9ncmVzcyBmb3IgYW55IHVwbG9hZCBvciBkb3dubG9hZCB0byBhIGdpdmVuIGhhbmRsZXIuXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWxzbyByZXNldCB0aGUgb3ZlcmFsbCB0cmFuc2ZlciBjb3VudGVyIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG11bHRpcGxlIHRyYW5zZmVycy4gWW91IGNhblxuICAgICAqIGFsc28gY2FsbCB0aGUgZnVuY3Rpb24gd2l0aG91dCBhIGhhbmRsZXIgdG8gc3RvcCByZXBvcnRpbmcgdG8gYW4gZWFybGllciBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaGFuZGxlciAgSGFuZGxlciBmdW5jdGlvbiB0byBjYWxsIG9uIHRyYW5zZmVyIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHRyYWNrUHJvZ3Jlc3MoaGFuZGxlcikge1xuICAgICAgICB0aGlzLl9wcm9ncmVzc1RyYWNrZXIuYnl0ZXNPdmVyYWxsID0gMDtcbiAgICAgICAgdGhpcy5fcHJvZ3Jlc3NUcmFja2VyLnJlcG9ydFRvKGhhbmRsZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGxvYWQgZGF0YSBmcm9tIGEgcmVhZGFibGUgc3RyZWFtIG9yIGEgbG9jYWwgZmlsZSB0byBhIHJlbW90ZSBmaWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZSAgUmVhZGFibGUgc3RyZWFtIG9yIHBhdGggdG8gYSBsb2NhbCBmaWxlLlxuICAgICAqIEBwYXJhbSB0b1JlbW90ZVBhdGggIFBhdGggdG8gYSByZW1vdGUgZmlsZSB0byB3cml0ZSB0by5cbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWRGcm9tKHNvdXJjZSwgdG9SZW1vdGVQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwbG9hZFdpdGhDb21tYW5kKHNvdXJjZSwgdG9SZW1vdGVQYXRoLCBcIlNUT1JcIiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwbG9hZCBkYXRhIGZyb20gYSByZWFkYWJsZSBzdHJlYW0gb3IgYSBsb2NhbCBmaWxlIGJ5IGFwcGVuZGluZyBpdCB0byBhbiBleGlzdGluZyBmaWxlLiBJZiB0aGUgZmlsZSBkb2Vzbid0XG4gICAgICogZXhpc3QgdGhlIEZUUCBzZXJ2ZXIgc2hvdWxkIGNyZWF0ZSBpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzb3VyY2UgIFJlYWRhYmxlIHN0cmVhbSBvciBwYXRoIHRvIGEgbG9jYWwgZmlsZS5cbiAgICAgKiBAcGFyYW0gdG9SZW1vdGVQYXRoICBQYXRoIHRvIGEgcmVtb3RlIGZpbGUgdG8gd3JpdGUgdG8uXG4gICAgICovXG4gICAgYXN5bmMgYXBwZW5kRnJvbShzb3VyY2UsIHRvUmVtb3RlUGF0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGxvYWRXaXRoQ29tbWFuZChzb3VyY2UsIHRvUmVtb3RlUGF0aCwgXCJBUFBFXCIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX3VwbG9hZFdpdGhDb21tYW5kKHNvdXJjZSwgcmVtb3RlUGF0aCwgY29tbWFuZCwgb3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VwbG9hZExvY2FsRmlsZShzb3VyY2UsIHJlbW90ZVBhdGgsIGNvbW1hbmQsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl91cGxvYWRGcm9tU3RyZWFtKHNvdXJjZSwgcmVtb3RlUGF0aCwgY29tbWFuZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBfdXBsb2FkTG9jYWxGaWxlKGxvY2FsUGF0aCwgcmVtb3RlUGF0aCwgY29tbWFuZCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBmZCA9IGF3YWl0IGZzT3Blbihsb2NhbFBhdGgsIFwiclwiKTtcbiAgICAgICAgY29uc3Qgc291cmNlID0gKDAsIGZzXzEuY3JlYXRlUmVhZFN0cmVhbSkoXCJcIiwge1xuICAgICAgICAgICAgZmQsXG4gICAgICAgICAgICBzdGFydDogb3B0aW9ucy5sb2NhbFN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBvcHRpb25zLmxvY2FsRW5kSW5jbHVzaXZlLFxuICAgICAgICAgICAgYXV0b0Nsb3NlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl91cGxvYWRGcm9tU3RyZWFtKHNvdXJjZSwgcmVtb3RlUGF0aCwgY29tbWFuZCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBpZ25vcmVFcnJvcigoKSA9PiBmc0Nsb3NlKGZkKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGFzeW5jIF91cGxvYWRGcm9tU3RyZWFtKHNvdXJjZSwgcmVtb3RlUGF0aCwgY29tbWFuZCkge1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKGVycikgPT4gdGhpcy5mdHAuY2xvc2VXaXRoRXJyb3IoZXJyKTtcbiAgICAgICAgc291cmNlLm9uY2UoXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkUGF0aCA9IGF3YWl0IHRoaXMucHJvdGVjdFdoaXRlc3BhY2UocmVtb3RlUGF0aCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByZXBhcmVUcmFuc2Zlcih0aGlzLmZ0cCk7XG4gICAgICAgICAgICAvLyBLZWVwIHRoZSBrZXl3b3JkIGBhd2FpdGAgb3IgdGhlIGBmaW5hbGx5YCBjbGF1c2UgYmVsb3cgcnVucyB0b28gZWFybHlcbiAgICAgICAgICAgIC8vIGFuZCByZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5lciBmb3IgdGhlIHNvdXJjZSBzdHJlYW0gdG9vIGVhcmx5LlxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0ICgwLCB0cmFuc2Zlcl8xLnVwbG9hZEZyb20pKHNvdXJjZSwge1xuICAgICAgICAgICAgICAgIGZ0cDogdGhpcy5mdHAsXG4gICAgICAgICAgICAgICAgdHJhY2tlcjogdGhpcy5fcHJvZ3Jlc3NUcmFja2VyLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgcmVtb3RlUGF0aDogdmFsaWRQYXRoLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwidXBsb2FkXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRG93bmxvYWQgYSByZW1vdGUgZmlsZSBhbmQgcGlwZSBpdHMgZGF0YSB0byBhIHdyaXRhYmxlIHN0cmVhbSBvciB0byBhIGxvY2FsIGZpbGUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIG9wdGlvbmFsbHkgZGVmaW5lIGF0IHdoaWNoIHBvc2l0aW9uIG9mIHRoZSByZW1vdGUgZmlsZSB5b3UnZCBsaWtlIHRvIHN0YXJ0XG4gICAgICogZG93bmxvYWRpbmcuIElmIHRoZSBkZXN0aW5hdGlvbiB5b3UgcHJvdmlkZSBpcyBhIGZpbGUsIHRoZSBvZmZzZXQgd2lsbCBiZSBhcHBsaWVkXG4gICAgICogdG8gaXQgYXMgd2VsbC4gRm9yIGV4YW1wbGU6IFRvIHJlc3VtZSBhIGZhaWxlZCBkb3dubG9hZCwgeW91J2QgcmVxdWVzdCB0aGUgc2l6ZSBvZlxuICAgICAqIHRoZSBsb2NhbCwgcGFydGlhbGx5IGRvd25sb2FkZWQgZmlsZSBhbmQgdXNlIHRoYXQgYXMgdGhlIG9mZnNldC4gQXNzdW1pbmcgdGhlIHNpemVcbiAgICAgKiBpcyAyMywgeW91J2QgZG93bmxvYWQgdGhlIHJlc3QgdXNpbmcgYGRvd25sb2FkVG8oXCJsb2NhbC50eHRcIiwgXCJyZW1vdGUudHh0XCIsIDIzKWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gIFN0cmVhbSBvciBwYXRoIGZvciBhIGxvY2FsIGZpbGUgdG8gd3JpdGUgdG8uXG4gICAgICogQHBhcmFtIGZyb21SZW1vdGVQYXRoICBQYXRoIG9mIHRoZSByZW1vdGUgZmlsZSB0byByZWFkIGZyb20uXG4gICAgICogQHBhcmFtIHN0YXJ0QXQgIFBvc2l0aW9uIHdpdGhpbiB0aGUgcmVtb3RlIGZpbGUgdG8gc3RhcnQgZG93bmxvYWRpbmcgYXQuIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBhIGZpbGUsIHRoaXMgb2Zmc2V0IGlzIGFsc28gYXBwbGllZCB0byBpdC5cbiAgICAgKi9cbiAgICBhc3luYyBkb3dubG9hZFRvKGRlc3RpbmF0aW9uLCBmcm9tUmVtb3RlUGF0aCwgc3RhcnRBdCA9IDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkZXN0aW5hdGlvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rvd25sb2FkVG9GaWxlKGRlc3RpbmF0aW9uLCBmcm9tUmVtb3RlUGF0aCwgc3RhcnRBdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rvd25sb2FkVG9TdHJlYW0oZGVzdGluYXRpb24sIGZyb21SZW1vdGVQYXRoLCBzdGFydEF0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGFzeW5jIF9kb3dubG9hZFRvRmlsZShsb2NhbFBhdGgsIHJlbW90ZVBhdGgsIHN0YXJ0QXQpIHtcbiAgICAgICAgY29uc3QgYXBwZW5kaW5nVG9Mb2NhbEZpbGUgPSBzdGFydEF0ID4gMDtcbiAgICAgICAgY29uc3QgZmlsZVN5c3RlbUZsYWdzID0gYXBwZW5kaW5nVG9Mb2NhbEZpbGUgPyBcInIrXCIgOiBcIndcIjtcbiAgICAgICAgY29uc3QgZmQgPSBhd2FpdCBmc09wZW4obG9jYWxQYXRoLCBmaWxlU3lzdGVtRmxhZ3MpO1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9ICgwLCBmc18xLmNyZWF0ZVdyaXRlU3RyZWFtKShcIlwiLCB7XG4gICAgICAgICAgICBmZCxcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydEF0LFxuICAgICAgICAgICAgYXV0b0Nsb3NlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9kb3dubG9hZFRvU3RyZWFtKGRlc3RpbmF0aW9uLCByZW1vdGVQYXRoLCBzdGFydEF0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbEZpbGVTdGF0cyA9IGF3YWl0IGlnbm9yZUVycm9yKCgpID0+IGZzU3RhdChsb2NhbFBhdGgpKTtcbiAgICAgICAgICAgIGNvbnN0IGhhc0Rvd25sb2FkZWREYXRhID0gbG9jYWxGaWxlU3RhdHMgJiYgbG9jYWxGaWxlU3RhdHMuc2l6ZSA+IDA7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRSZW1vdmVMb2NhbEZpbGUgPSAhYXBwZW5kaW5nVG9Mb2NhbEZpbGUgJiYgIWhhc0Rvd25sb2FkZWREYXRhO1xuICAgICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUxvY2FsRmlsZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGlnbm9yZUVycm9yKCgpID0+IGZzVW5saW5rKGxvY2FsUGF0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgYXdhaXQgaWdub3JlRXJyb3IoKCkgPT4gZnNDbG9zZShmZCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBfZG93bmxvYWRUb1N0cmVhbShkZXN0aW5hdGlvbiwgcmVtb3RlUGF0aCwgc3RhcnRBdCkge1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKGVycikgPT4gdGhpcy5mdHAuY2xvc2VXaXRoRXJyb3IoZXJyKTtcbiAgICAgICAgZGVzdGluYXRpb24ub25jZShcImVycm9yXCIsIG9uRXJyb3IpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRQYXRoID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShyZW1vdGVQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVRyYW5zZmVyKHRoaXMuZnRwKTtcbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIGtleXdvcmQgYGF3YWl0YCBvciB0aGUgYGZpbmFsbHlgIGNsYXVzZSBiZWxvdyBydW5zIHRvbyBlYXJseVxuICAgICAgICAgICAgLy8gYW5kIHJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgc291cmNlIHN0cmVhbSB0b28gZWFybHkuXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgKDAsIHRyYW5zZmVyXzEuZG93bmxvYWRUbykoZGVzdGluYXRpb24sIHtcbiAgICAgICAgICAgICAgICBmdHA6IHRoaXMuZnRwLFxuICAgICAgICAgICAgICAgIHRyYWNrZXI6IHRoaXMuX3Byb2dyZXNzVHJhY2tlcixcbiAgICAgICAgICAgICAgICBjb21tYW5kOiBzdGFydEF0ID4gMCA/IGBSRVNUICR7c3RhcnRBdH1gIDogYFJFVFIgJHt2YWxpZFBhdGh9YCxcbiAgICAgICAgICAgICAgICByZW1vdGVQYXRoOiB2YWxpZFBhdGgsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJkb3dubG9hZFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcik7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IGZpbGVzIGFuZCBkaXJlY3RvcmllcyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgb3IgZnJvbSBgcGF0aGAgaWYgc3BlY2lmaWVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIFtwYXRoXSAgUGF0aCB0byByZW1vdGUgZmlsZSBvciBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgYXN5bmMgbGlzdChwYXRoID0gXCJcIikge1xuICAgICAgICBjb25zdCB2YWxpZFBhdGggPSBhd2FpdCB0aGlzLnByb3RlY3RXaGl0ZXNwYWNlKHBhdGgpO1xuICAgICAgICBsZXQgbGFzdEVycm9yO1xuICAgICAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiB0aGlzLmF2YWlsYWJsZUxpc3RDb21tYW5kcykge1xuICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9IHZhbGlkUGF0aCA9PT0gXCJcIiA/IGNhbmRpZGF0ZSA6IGAke2NhbmRpZGF0ZX0gJHt2YWxpZFBhdGh9YDtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlcGFyZVRyYW5zZmVyKHRoaXMuZnRwKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkTGlzdCA9IGF3YWl0IHRoaXMuX3JlcXVlc3RMaXN0V2l0aENvbW1hbmQoY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgLy8gVXNlIHN1Y2Nlc3NmdWwgY2FuZGlkYXRlIGZvciBhbGwgc3Vic2VxdWVudCByZXF1ZXN0cy5cbiAgICAgICAgICAgICAgICB0aGlzLmF2YWlsYWJsZUxpc3RDb21tYW5kcyA9IFtjYW5kaWRhdGVdO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRMaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZFRyeU5leHQgPSBlcnIgaW5zdGFuY2VvZiBGdHBDb250ZXh0XzEuRlRQRXJyb3I7XG4gICAgICAgICAgICAgICAgaWYgKCFzaG91bGRUcnlOZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFzdEVycm9yID0gZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IGxhc3RFcnJvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGFzeW5jIF9yZXF1ZXN0TGlzdFdpdGhDb21tYW5kKGNvbW1hbmQpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFN0cmluZ1dyaXRlcl8xLlN0cmluZ1dyaXRlcigpO1xuICAgICAgICBhd2FpdCAoMCwgdHJhbnNmZXJfMS5kb3dubG9hZFRvKShidWZmZXIsIHtcbiAgICAgICAgICAgIGZ0cDogdGhpcy5mdHAsXG4gICAgICAgICAgICB0cmFja2VyOiB0aGlzLl9wcm9ncmVzc1RyYWNrZXIsXG4gICAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgICAgcmVtb3RlUGF0aDogXCJcIixcbiAgICAgICAgICAgIHR5cGU6IFwibGlzdFwiXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0ZXh0ID0gYnVmZmVyLmdldFRleHQodGhpcy5mdHAuZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmZ0cC5sb2codGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlTGlzdCh0ZXh0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgZGlyZWN0b3J5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVtb3RlRGlyUGF0aCAgVGhlIHBhdGggb2YgdGhlIHJlbW90ZSBkaXJlY3RvcnkgdG8gZGVsZXRlLlxuICAgICAqIEBleGFtcGxlIGNsaWVudC5yZW1vdmVEaXIoXCJmb29cIikgLy8gUmVtb3ZlIGRpcmVjdG9yeSAnZm9vJyB1c2luZyBhIHJlbGF0aXZlIHBhdGguXG4gICAgICogQGV4YW1wbGUgY2xpZW50LnJlbW92ZURpcihcImZvby9iYXJcIikgLy8gUmVtb3ZlIGRpcmVjdG9yeSAnYmFyJyB1c2luZyBhIHJlbGF0aXZlIHBhdGguXG4gICAgICogQGV4YW1wbGUgY2xpZW50LnJlbW92ZURpcihcIi9mb28vYmFyXCIpIC8vIFJlbW92ZSBkaXJlY3RvcnkgJ2JhcicgdXNpbmcgYW4gYWJzb2x1dGUgcGF0aC5cbiAgICAgKiBAZXhhbXBsZSBjbGllbnQucmVtb3ZlRGlyKFwiL1wiKSAvLyBSZW1vdmUgZXZlcnl0aGluZy5cbiAgICAgKi9cbiAgICBhc3luYyByZW1vdmVEaXIocmVtb3RlRGlyUGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhpdEF0Q3VycmVudERpcmVjdG9yeShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNkKHJlbW90ZURpclBhdGgpO1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSB0YXJnZXQgYmVjYXVzZSByZW1vdGVEaXJQYXRoIG1pZ2h0IGJlIGEgcmVsYXRpdmUgcGF0aCwgZXZlbiBgLi4vYCBpcyBwb3NzaWJsZS5cbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlRGlyUGF0aCA9IGF3YWl0IHRoaXMucHdkKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFyV29ya2luZ0RpcigpO1xuICAgICAgICAgICAgY29uc3QgZGlySXNSb290ID0gYWJzb2x1dGVEaXJQYXRoID09PSBcIi9cIjtcbiAgICAgICAgICAgIGlmICghZGlySXNSb290KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZHVwKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVFbXB0eURpcihhYnNvbHV0ZURpclBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdpdGhvdXQgcmVtb3ZpbmdcbiAgICAgKiB0aGUgd29ya2luZyBkaXJlY3RvcnkgaXRzZWxmLlxuICAgICAqL1xuICAgIGFzeW5jIGNsZWFyV29ya2luZ0RpcigpIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHRoaXMubGlzdCgpKSB7XG4gICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2QoZmlsZS5uYW1lKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsZWFyV29ya2luZ0RpcigpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2R1cCgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlRW1wdHlEaXIoZmlsZS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlKGZpbGUubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBsb2FkIHRoZSBjb250ZW50cyBvZiBhIGxvY2FsIGRpcmVjdG9yeSB0byB0aGUgcmVtb3RlIHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWVzIGFuZCByZXVzZSBleGlzdGluZyBkaXJlY3Rvcmllcy5cbiAgICAgKiBVbnJlbGF0ZWQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHdpbGwgcmVtYWluIHVudG91Y2hlZC4gWW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYSBgcmVtb3RlRGlyUGF0aGBcbiAgICAgKiB0byBwdXQgdGhlIGNvbnRlbnRzIGluc2lkZSBhIGRpcmVjdG9yeSB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5IGluY2x1ZGluZyBhbGxcbiAgICAgKiBpbnRlcm1lZGlhdGUgZGlyZWN0b3JpZXMuIElmIHlvdSBkaWQgcHJvdmlkZSBhIHJlbW90ZURpclBhdGggdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdpbGwgc3RheVxuICAgICAqIHRoZSBzYW1lIGFzIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvY2FsRGlyUGF0aCAgTG9jYWwgcGF0aCwgZS5nLiBcImZvby9iYXJcIiBvciBcIi4uL3Rlc3RcIlxuICAgICAqIEBwYXJhbSBbcmVtb3RlRGlyUGF0aF0gIFJlbW90ZSBwYXRoIG9mIGEgZGlyZWN0b3J5IHRvIHVwbG9hZCB0by4gV29ya2luZyBkaXJlY3RvcnkgaWYgdW5kZWZpbmVkLlxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZEZyb21EaXIobG9jYWxEaXJQYXRoLCByZW1vdGVEaXJQYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGl0QXRDdXJyZW50RGlyZWN0b3J5KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZW1vdGVEaXJQYXRoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVEaXIocmVtb3RlRGlyUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fdXBsb2FkVG9Xb3JraW5nRGlyKGxvY2FsRGlyUGF0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX3VwbG9hZFRvV29ya2luZ0Rpcihsb2NhbERpclBhdGgpIHtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmc1JlYWREaXIobG9jYWxEaXJQYXRoKTtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9ICgwLCBwYXRoXzEuam9pbikobG9jYWxEaXJQYXRoLCBmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnNTdGF0KGZ1bGxQYXRoKTtcbiAgICAgICAgICAgIGlmIChzdGF0cy5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBsb2FkRnJvbShmdWxsUGF0aCwgZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3BlbkRpcihmaWxlKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl91cGxvYWRUb1dvcmtpbmdEaXIoZnVsbFBhdGgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2R1cCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERvd25sb2FkIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgb2YgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIGEgbG9jYWwgZGlyZWN0b3J5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGxvY2FsRGlyUGF0aCAgVGhlIGxvY2FsIGRpcmVjdG9yeSB0byBkb3dubG9hZCB0by5cbiAgICAgKiBAcGFyYW0gcmVtb3RlRGlyUGF0aCAgUmVtb3RlIGRpcmVjdG9yeSB0byBkb3dubG9hZC4gQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpZiBub3Qgc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIGFzeW5jIGRvd25sb2FkVG9EaXIobG9jYWxEaXJQYXRoLCByZW1vdGVEaXJQYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGl0QXRDdXJyZW50RGlyZWN0b3J5KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZW1vdGVEaXJQYXRoKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZChyZW1vdGVEaXJQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9kb3dubG9hZEZyb21Xb3JraW5nRGlyKGxvY2FsRGlyUGF0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgYXN5bmMgX2Rvd25sb2FkRnJvbVdvcmtpbmdEaXIobG9jYWxEaXJQYXRoKSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZUxvY2FsRGlyZWN0b3J5KGxvY2FsRGlyUGF0aCk7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCB0aGlzLmxpc3QoKSkge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxQYXRoID0gKDAsIHBhdGhfMS5qb2luKShsb2NhbERpclBhdGgsIGZpbGUubmFtZSk7XG4gICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2QoZmlsZS5uYW1lKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kb3dubG9hZEZyb21Xb3JraW5nRGlyKGxvY2FsUGF0aCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jZHVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChmaWxlLmlzRmlsZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZG93bmxvYWRUbyhsb2NhbFBhdGgsIGZpbGUubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZSBzdXJlIGEgZ2l2ZW4gcmVtb3RlIHBhdGggZXhpc3RzLCBjcmVhdGluZyBhbGwgZGlyZWN0b3JpZXMgYXMgbmVjZXNzYXJ5LlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjaGFuZ2VzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBnaXZlbiBwYXRoLlxuICAgICAqL1xuICAgIGFzeW5jIGVuc3VyZURpcihyZW1vdGVEaXJQYXRoKSB7XG4gICAgICAgIC8vIElmIHRoZSByZW1vdGVEaXJQYXRoIHdhcyBhYnNvbHV0ZSBnbyB0byByb290IGRpcmVjdG9yeS5cbiAgICAgICAgaWYgKHJlbW90ZURpclBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2QoXCIvXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hbWVzID0gcmVtb3RlRGlyUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKG5hbWUgPT4gbmFtZSAhPT0gXCJcIik7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fb3BlbkRpcihuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcnkgdG8gY3JlYXRlIGEgZGlyZWN0b3J5IGFuZCBlbnRlciBpdC4gVGhpcyB3aWxsIG5vdCByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGRpcmVjdG9yeVxuICAgICAqIGNvdWxkbid0IGJlIGNyZWF0ZWQgaWYgZm9yIGV4YW1wbGUgaXQgYWxyZWFkeSBleGlzdHMuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGFzeW5jIF9vcGVuRGlyKGRpck5hbWUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kSWdub3JpbmdFcnJvcihcIk1LRCBcIiArIGRpck5hbWUpO1xuICAgICAgICBhd2FpdCB0aGlzLmNkKGRpck5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYW4gZW1wdHkgZGlyZWN0b3J5LCB3aWxsIGZhaWwgaWYgbm90IGVtcHR5LlxuICAgICAqL1xuICAgIGFzeW5jIHJlbW92ZUVtcHR5RGlyKHBhdGgpIHtcbiAgICAgICAgY29uc3QgdmFsaWRQYXRoID0gYXdhaXQgdGhpcy5wcm90ZWN0V2hpdGVzcGFjZShwYXRoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZChgUk1EICR7dmFsaWRQYXRofWApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGVFAgc2VydmVycyBjYW4ndCBoYW5kbGUgZmlsZW5hbWVzIHRoYXQgaGF2ZSBsZWFkaW5nIHdoaXRlc3BhY2UuIFRoaXMgbWV0aG9kIHRyYW5zZm9ybXNcbiAgICAgKiBhIGdpdmVuIHBhdGggdG8gZml4IHRoYXQgaXNzdWUgZm9yIG1vc3QgY2FzZXMuXG4gICAgICovXG4gICAgYXN5bmMgcHJvdGVjdFdoaXRlc3BhY2UocGF0aCkge1xuICAgICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChcIiBcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbmRsZSBsZWFkaW5nIHdoaXRlc3BhY2UgYnkgcHJlcGVuZGluZyB0aGUgYWJzb2x1dGUgcGF0aDpcbiAgICAgICAgLy8gXCIgdGVzdC50eHRcIiB3aGlsZSBiZWluZyBpbiB0aGUgcm9vdCBkaXJlY3RvcnkgYmVjb21lcyBcIi8gdGVzdC50eHRcIi5cbiAgICAgICAgY29uc3QgcHdkID0gYXdhaXQgdGhpcy5wd2QoKTtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoUHJlZml4ID0gcHdkLmVuZHNXaXRoKFwiL1wiKSA/IHB3ZCA6IHB3ZCArIFwiL1wiO1xuICAgICAgICByZXR1cm4gYWJzb2x1dGVQYXRoUHJlZml4ICsgcGF0aDtcbiAgICB9XG4gICAgYXN5bmMgX2V4aXRBdEN1cnJlbnREaXJlY3RvcnkoZnVuYykge1xuICAgICAgICBjb25zdCB1c2VyRGlyID0gYXdhaXQgdGhpcy5wd2QoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmdW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaWdub3JlRXJyb3IoKCkgPT4gdGhpcy5jZCh1c2VyRGlyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJ5IGFsbCBhdmFpbGFibGUgdHJhbnNmZXIgc3RyYXRlZ2llcyBhbmQgcGljayB0aGUgZmlyc3Qgb25lIHRoYXQgd29ya3MuIFVwZGF0ZSBgY2xpZW50YCB0b1xuICAgICAqIHVzZSB0aGUgd29ya2luZyBzdHJhdGVneSBmb3IgYWxsIHN1Y2Nlc3NpdmUgdHJhbnNmZXIgcmVxdWVzdHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCB0cnkgdGhlIHByb3ZpZGVkIHN0cmF0ZWdpZXMuXG4gICAgICovXG4gICAgX2VudGVyRmlyc3RDb21wYXRpYmxlTW9kZShzdHJhdGVnaWVzKSB7XG4gICAgICAgIHJldHVybiBhc3luYyAoZnRwKSA9PiB7XG4gICAgICAgICAgICBmdHAubG9nKFwiVHJ5aW5nIHRvIGZpbmQgb3B0aW1hbCB0cmFuc2ZlciBzdHJhdGVneS4uLlwiKTtcbiAgICAgICAgICAgIGxldCBsYXN0RXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0cmF0ZWd5IG9mIHN0cmF0ZWdpZXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBzdHJhdGVneShmdHApO1xuICAgICAgICAgICAgICAgICAgICBmdHAubG9nKFwiT3B0aW1hbCB0cmFuc2ZlciBzdHJhdGVneSBmb3VuZC5cIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJlcGFyZVRyYW5zZmVyID0gc3RyYXRlZ3k7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0aGUgbmV4dCBjYW5kaWRhdGUgbm8gbWF0dGVyIHRoZSBleGFjdCBlcnJvci4gSXQncyBwb3NzaWJsZSB0aGF0IGEgc2VydmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFuc3dlcmVkIGluY29ycmVjdGx5IHRvIGEgc3RyYXRlZ3ksIGZvciBleGFtcGxlIGEgUEFTViBhbnN3ZXIgdG8gYW4gRVBTVi5cbiAgICAgICAgICAgICAgICAgICAgbGFzdEVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9uZSBvZiB0aGUgYXZhaWxhYmxlIHRyYW5zZmVyIHN0cmF0ZWdpZXMgd29yay4gTGFzdCBlcnJvciByZXNwb25zZSB3YXMgJyR7bGFzdEVycm9yfScuYCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERFUFJFQ0FURUQsIHVzZSBgdXBsb2FkRnJvbWAuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWQoc291cmNlLCB0b1JlbW90ZVBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmZ0cC5sb2coXCJXYXJuaW5nOiB1cGxvYWQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCB1c2UgdXBsb2FkRnJvbSgpLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkRnJvbShzb3VyY2UsIHRvUmVtb3RlUGF0aCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERFUFJFQ0FURUQsIHVzZSBgYXBwZW5kRnJvbWAuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBhcHBlbmQoc291cmNlLCB0b1JlbW90ZVBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmZ0cC5sb2coXCJXYXJuaW5nOiBhcHBlbmQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCB1c2UgYXBwZW5kRnJvbSgpLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwZW5kRnJvbShzb3VyY2UsIHRvUmVtb3RlUGF0aCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERFUFJFQ0FURUQsIHVzZSBgZG93bmxvYWRUb2AuXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBkb3dubG9hZChkZXN0aW5hdGlvbiwgZnJvbVJlbW90ZVBhdGgsIHN0YXJ0QXQgPSAwKSB7XG4gICAgICAgIHRoaXMuZnRwLmxvZyhcIldhcm5pbmc6IGRvd25sb2FkKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgdXNlIGRvd25sb2FkVG8oKS5cIik7XG4gICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkVG8oZGVzdGluYXRpb24sIGZyb21SZW1vdGVQYXRoLCBzdGFydEF0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRCwgdXNlIGB1cGxvYWRGcm9tRGlyYC5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZERpcihsb2NhbERpclBhdGgsIHJlbW90ZURpclBhdGgpIHtcbiAgICAgICAgdGhpcy5mdHAubG9nKFwiV2FybmluZzogdXBsb2FkRGlyKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgdXNlIHVwbG9hZEZyb21EaXIoKS5cIik7XG4gICAgICAgIHJldHVybiB0aGlzLnVwbG9hZEZyb21EaXIobG9jYWxEaXJQYXRoLCByZW1vdGVEaXJQYXRoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRCwgdXNlIGBkb3dubG9hZFRvRGlyYC5cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFzeW5jIGRvd25sb2FkRGlyKGxvY2FsRGlyUGF0aCkge1xuICAgICAgICB0aGlzLmZ0cC5sb2coXCJXYXJuaW5nOiBkb3dubG9hZERpcigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHVzZSBkb3dubG9hZFRvRGlyKCkuXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZFRvRGlyKGxvY2FsRGlyUGF0aCk7XG4gICAgfVxufVxuZXhwb3J0cy5DbGllbnQgPSBDbGllbnQ7XG5hc3luYyBmdW5jdGlvbiBlbnN1cmVMb2NhbERpcmVjdG9yeShwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnNTdGF0KHBhdGgpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGF3YWl0IGZzTWtEaXIocGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxufVxuYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3IoZnVuYykge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmdW5jKCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gSWdub3JlXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkZpbGVJbmZvID0gZXhwb3J0cy5GaWxlVHlwZSA9IHZvaWQgMDtcbnZhciBGaWxlVHlwZTtcbihmdW5jdGlvbiAoRmlsZVR5cGUpIHtcbiAgICBGaWxlVHlwZVtGaWxlVHlwZVtcIlVua25vd25cIl0gPSAwXSA9IFwiVW5rbm93blwiO1xuICAgIEZpbGVUeXBlW0ZpbGVUeXBlW1wiRmlsZVwiXSA9IDFdID0gXCJGaWxlXCI7XG4gICAgRmlsZVR5cGVbRmlsZVR5cGVbXCJEaXJlY3RvcnlcIl0gPSAyXSA9IFwiRGlyZWN0b3J5XCI7XG4gICAgRmlsZVR5cGVbRmlsZVR5cGVbXCJTeW1ib2xpY0xpbmtcIl0gPSAzXSA9IFwiU3ltYm9saWNMaW5rXCI7XG59KShGaWxlVHlwZSB8fCAoZXhwb3J0cy5GaWxlVHlwZSA9IEZpbGVUeXBlID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIGEgZmlsZSwgZGlyZWN0b3J5IG9yIHN5bWJvbGljIGxpbmsuXG4gKi9cbmNsYXNzIEZpbGVJbmZvIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudHlwZSA9IEZpbGVUeXBlLlVua25vd247XG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbnBhcnNlZCwgcmF3IG1vZGlmaWNhdGlvbiBkYXRlIGFzIGEgc3RyaW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiBJZiBgbW9kaWZpZWRBdGAgaXMgdW5kZWZpbmVkLCB0aGUgRlRQIHNlcnZlciB5b3UncmUgY29ubmVjdGVkIHRvIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbW9yZSBtb2Rlcm5cbiAgICAgICAgICogTUxTRCBjb21tYW5kIGZvciBtYWNoaW5lLXJlYWRhYmxlIGRpcmVjdG9yeSBsaXN0aW5ncy4gVGhlIG9sZGVyIGNvbW1hbmQgTElTVCBpcyB0aGVuIHVzZWQgcmV0dXJuaW5nXG4gICAgICAgICAqIHJlc3VsdHMgdGhhdCB2YXJ5IGEgbG90IGJldHdlZW4gc2VydmVycyBhcyB0aGUgZm9ybWF0IGhhc24ndCBiZWVuIHN0YW5kYXJkaXplZC4gSGVyZSwgZGlyZWN0b3J5IGxpc3RpbmdzXG4gICAgICAgICAqIGFuZCBlc3BlY2lhbGx5IG1vZGlmaWNhdGlvbiBkYXRlcyB3ZXJlIG1lYW50IHRvIGJlIGh1bWFuLXJlYWRhYmxlIGZpcnN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBCZSBjYXJlZnVsIHdoZW4gc3RpbGwgdHJ5aW5nIHRvIHBhcnNlIHRoaXMgYnkgeW91cnNlbGYuIFBhcnNpbmcgZGF0ZXMgZnJvbSBsaXN0aW5ncyB1c2luZyBMSVNUIGlzXG4gICAgICAgICAqIHVucmVsaWFibGUuIFRoaXMgbGlicmFyeSBkZWNpZGVzIHRvIG9mZmVyIHBhcnNlZCBkYXRlcyBvbmx5IHdoZW4gdGhleSdyZSBhYnNvbHV0ZWx5IHJlbGlhYmxlIGFuZCBzYWZlIHRvXG4gICAgICAgICAqIHVzZSBlLmcuIGZvciBjb21wYXJpc29ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmF3TW9kaWZpZWRBdCA9IFwiXCI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYXJzZWQgbW9kaWZpY2F0aW9uIGRhdGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEF2YWlsYWJsZSBpZiB0aGUgRlRQIHNlcnZlciBzdXBwb3J0cyB0aGUgTUxTRCBjb21tYW5kLiBPbmx5IE1MU0QgZ3VhcmFudGVlcyBkYXRlcyB0aGFuIGNhbiBiZSByZWxpYWJseVxuICAgICAgICAgKiBwYXJzZWQgd2l0aCB0aGUgY29ycmVjdCB0aW1lem9uZSBhbmQgYSByZXNvbHV0aW9uIGRvd24gdG8gc2Vjb25kcy4gU2VlIGByYXdNb2RpZmllZEF0YCBwcm9wZXJ0eSBmb3IgdGhlIHVucGFyc2VkXG4gICAgICAgICAqIGRhdGUgdGhhdCBpcyBhbHdheXMgYXZhaWxhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tb2RpZmllZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogVW5peCBwZXJtaXNzaW9ucyBpZiBwcmVzZW50LiBJZiB0aGUgdW5kZXJseWluZyBGVFAgc2VydmVyIGlzIG5vdCBydW5uaW5nIG9uIFVuaXggdGhpcyB3aWxsIGJlIHVuZGVmaW5lZC5cbiAgICAgICAgICogSWYgc2V0LCB5b3UgbWlnaHQgYmUgYWJsZSB0byBlZGl0IHBlcm1pc3Npb25zIHdpdGggdGhlIEZUUCBjb21tYW5kIGBTSVRFIENITU9EYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYXJkIGxpbmsgY291bnQgaWYgYXZhaWxhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5oYXJkTGlua0NvdW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogTGluayBuYW1lIGZvciBzeW1ib2xpYyBsaW5rcyBpZiBhdmFpbGFibGUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmxpbmsgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbml4IGdyb3VwIGlmIGF2YWlsYWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ3JvdXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbml4IHVzZXIgaWYgYXZhaWxhYmxlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51c2VyID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogVW5pcXVlIElEIGlmIGF2YWlsYWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudW5pcXVlSUQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIGdldCBpc0RpcmVjdG9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gRmlsZVR5cGUuRGlyZWN0b3J5O1xuICAgIH1cbiAgICBnZXQgaXNTeW1ib2xpY0xpbmsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09IEZpbGVUeXBlLlN5bWJvbGljTGluaztcbiAgICB9XG4gICAgZ2V0IGlzRmlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gRmlsZVR5cGUuRmlsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCwgbGVnYWN5IEFQSS4gVXNlIGByYXdNb2RpZmllZEF0YCBpbnN0ZWFkLlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZ2V0IGRhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJhd01vZGlmaWVkQXQ7XG4gICAgfVxuICAgIHNldCBkYXRlKHJhd01vZGlmaWVkQXQpIHtcbiAgICAgICAgdGhpcy5yYXdNb2RpZmllZEF0ID0gcmF3TW9kaWZpZWRBdDtcbiAgICB9XG59XG5leHBvcnRzLkZpbGVJbmZvID0gRmlsZUluZm87XG5GaWxlSW5mby5Vbml4UGVybWlzc2lvbiA9IHtcbiAgICBSZWFkOiA0LFxuICAgIFdyaXRlOiAyLFxuICAgIEV4ZWN1dGU6IDFcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRlRQQ29udGV4dCA9IGV4cG9ydHMuRlRQRXJyb3IgPSB2b2lkIDA7XG5jb25zdCBuZXRfMSA9IHJlcXVpcmUoXCJuZXRcIik7XG5jb25zdCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xID0gcmVxdWlyZShcIi4vcGFyc2VDb250cm9sUmVzcG9uc2VcIik7XG4vKipcbiAqIERlc2NyaWJlcyBhbiBGVFAgc2VydmVyIGVycm9yIHJlc3BvbnNlIGluY2x1ZGluZyB0aGUgRlRQIHJlc3BvbnNlIGNvZGUuXG4gKi9cbmNsYXNzIEZUUEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHJlcykge1xuICAgICAgICBzdXBlcihyZXMubWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgdGhpcy5jb2RlID0gcmVzLmNvZGU7XG4gICAgfVxufVxuZXhwb3J0cy5GVFBFcnJvciA9IEZUUEVycm9yO1xuZnVuY3Rpb24gZG9Ob3RoaW5nKCkge1xuICAgIC8qKiBEbyBub3RoaW5nICovXG59XG4vKipcbiAqIEZUUENvbnRleHQgaG9sZHMgdGhlIGNvbnRyb2wgYW5kIGRhdGEgc29ja2V0cyBvZiBhbiBGVFAgY29ubmVjdGlvbiBhbmQgcHJvdmlkZXMgYVxuICogc2ltcGxpZmllZCB3YXkgdG8gaW50ZXJhY3Qgd2l0aCBhbiBGVFAgc2VydmVyLCBoYW5kbGUgcmVzcG9uc2VzLCBlcnJvcnMgYW5kIHRpbWVvdXRzLlxuICpcbiAqIEl0IGRvZXNuJ3QgaW1wbGVtZW50IG9yIHVzZSBhbnkgRlRQIGNvbW1hbmRzLiBJdCdzIG9ubHkgYSBmb3VuZGF0aW9uIHRvIG1ha2Ugd3JpdGluZyBhbiBGVFBcbiAqIGNsaWVudCBhcyBlYXN5IGFzIHBvc3NpYmxlLiBZb3Ugd29uJ3QgdXN1YWxseSBpbnN0YW50aWF0ZSB0aGlzLCBidXQgdXNlIGBDbGllbnRgLlxuICovXG5jbGFzcyBGVFBDb250ZXh0IHtcbiAgICAvKipcbiAgICAgKiBJbnN0YW50aWF0ZSBhbiBGVFAgY29udGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aW1lb3V0IC0gVGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gYXBwbHkgdG8gY29udHJvbCBhbmQgZGF0YSBjb25uZWN0aW9ucy4gVXNlIDAgZm9yIG5vIHRpbWVvdXQuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIC0gRW5jb2RpbmcgdG8gdXNlIGZvciBjb250cm9sIGNvbm5lY3Rpb24uIFVURi04IGJ5IGRlZmF1bHQuIFVzZSBcImxhdGluMVwiIGZvciBvbGRlciBzZXJ2ZXJzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHRpbWVvdXQgPSAwLCBlbmNvZGluZyA9IFwidXRmOFwiKSB7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgIC8qKiBEZWJ1Zy1sZXZlbCBsb2dnaW5nIG9mIGFsbCBzb2NrZXQgY29tbXVuaWNhdGlvbi4gKi9cbiAgICAgICAgdGhpcy52ZXJib3NlID0gZmFsc2U7XG4gICAgICAgIC8qKiBJUCB2ZXJzaW9uIHRvIHByZWZlciAoNDogSVB2NCwgNjogSVB2NiwgdW5kZWZpbmVkOiBhdXRvbWF0aWMpLiAqL1xuICAgICAgICB0aGlzLmlwRmFtaWx5ID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiogT3B0aW9ucyBmb3IgVExTIGNvbm5lY3Rpb25zLiAqL1xuICAgICAgICB0aGlzLnRsc09wdGlvbnMgPSB7fTtcbiAgICAgICAgLyoqIEEgbXVsdGlsaW5lIHJlc3BvbnNlIG1pZ2h0IGJlIHJlY2VpdmVkIGFzIG11bHRpcGxlIGNodW5rcy4gKi9cbiAgICAgICAgdGhpcy5fcGFydGlhbFJlc3BvbnNlID0gXCJcIjtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgLy8gSGVscCBUeXBlc2NyaXB0IHVuZGVyc3RhbmQgdGhhdCB3ZSBkbyBpbmRlZWQgc2V0IF9zb2NrZXQgaW4gdGhlIGNvbnN0cnVjdG9yIGJ1dCB1c2UgdGhlIHNldHRlciBtZXRob2QgdG8gZG8gc28uXG4gICAgICAgIHRoaXMuX3NvY2tldCA9IHRoaXMuc29ja2V0ID0gdGhpcy5fbmV3U29ja2V0KCk7XG4gICAgICAgIHRoaXMuX2RhdGFTb2NrZXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjb250ZXh0LlxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICAvLyBJbnRlcm5hbGx5LCBjbG9zaW5nIGEgY29udGV4dCBpcyBhbHdheXMgZGVzY3JpYmVkIHdpdGggYW4gZXJyb3IuIElmIHRoZXJlIGlzIHN0aWxsIGEgdGFzayBydW5uaW5nLCBpdCB3aWxsXG4gICAgICAgIC8vIGFib3J0IHdpdGggYW4gZXhjZXB0aW9uIHRoYXQgdGhlIHVzZXIgY2xvc2VkIHRoZSBjbGllbnQgZHVyaW5nIGEgdGFzay4gSWYgbm8gdGFzayBpcyBydW5uaW5nLCBubyBleGNlcHRpb24gaXNcbiAgICAgICAgLy8gdGhyb3duIGJ1dCBhbGwgbmV3bHkgc3VibWl0dGVkIHRhc2tzIGFmdGVyIHRoYXQgd2lsbCBhYm9ydCB0aGUgZXhjZXB0aW9uIHRoYXQgdGhlIGNsaWVudCBoYXMgYmVlbiBjbG9zZWQuXG4gICAgICAgIC8vIEluIGFkZGl0aW9uIHRoZSB1c2VyIHdpbGwgZ2V0IGEgc3RhY2sgdHJhY2UgcG9pbnRpbmcgdG8gd2hlcmUgZXhhY3RseSB0aGUgY2xpZW50IGhhcyBiZWVuIGNsb3NlZC4gU28gaW4gYW55XG4gICAgICAgIC8vIGNhc2UgdXNlIF9jbG9zaW5nRXJyb3IgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBjb250ZXh0IGlzIGNsb3NlZC4gVGhpcyBhbHNvIGFsbG93cyB1cyB0byBoYXZlIGEgc2luZ2xlIGNvZGUtcGF0aFxuICAgICAgICAvLyBmb3IgY2xvc2luZyBhIGNvbnRleHQgbWFraW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBlYXNpZXIuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl90YXNrID8gXCJVc2VyIGNsb3NlZCBjbGllbnQgZHVyaW5nIHRhc2tcIiA6IFwiVXNlciBjbG9zZWQgY2xpZW50XCI7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihlcnIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgY29udGV4dCB3aXRoIGFuIGVycm9yLlxuICAgICAqL1xuICAgIGNsb3NlV2l0aEVycm9yKGVycikge1xuICAgICAgICAvLyBJZiB0aGlzIGNvbnRleHQgYWxyZWFkeSBoYXMgYmVlbiBjbG9zZWQsIGRvbid0IG92ZXJ3cml0ZSB0aGUgcmVhc29uLlxuICAgICAgICBpZiAodGhpcy5fY2xvc2luZ0Vycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2xvc2luZ0Vycm9yID0gZXJyO1xuICAgICAgICAvLyBDbG9zZSB0aGUgc29ja2V0cyBidXQgZG9uJ3QgZnVsbHkgcmVzZXQgdGhpcyBjb250ZXh0IHRvIHByZXNlcnZlIGB0aGlzLl9jbG9zaW5nRXJyb3JgLlxuICAgICAgICB0aGlzLl9jbG9zZUNvbnRyb2xTb2NrZXQoKTtcbiAgICAgICAgdGhpcy5fY2xvc2VTb2NrZXQodGhpcy5fZGF0YVNvY2tldCk7XG4gICAgICAgIC8vIEdpdmUgdGhlIHVzZXIncyB0YXNrIGEgY2hhbmNlIHRvIHJlYWN0LCBtYXliZSBjbGVhbnVwIHJlc291cmNlcy5cbiAgICAgICAgdGhpcy5fcGFzc1RvSGFuZGxlcihlcnIpO1xuICAgICAgICAvLyBUaGUgdGFzayBtaWdodCBub3QgaGF2ZSBiZWVuIHJlamVjdGVkIGJ5IHRoZSB1c2VyIGFmdGVyIHJlY2VpdmluZyB0aGUgZXJyb3IuXG4gICAgICAgIHRoaXMuX3N0b3BUcmFja2luZ1Rhc2soKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29udGV4dCBoYXMgYmVlbiBjbG9zZWQgb3IgaGFzbid0IGJlZW4gY29ubmVjdGVkIHlldC4gWW91IGNhbiByZW9wZW4gaXQgd2l0aCBgYWNjZXNzYC5cbiAgICAgKi9cbiAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXQucmVtb3RlQWRkcmVzcyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX2Nsb3NpbmdFcnJvciAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldCB0aGlzIGNvbnRleCBhbmQgYWxsIG9mIGl0cyBzdGF0ZS5cbiAgICAgKi9cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSB0aGlzLl9uZXdTb2NrZXQoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBGVFAgY29udHJvbCBzb2NrZXQuXG4gICAgICovXG4gICAgZ2V0IHNvY2tldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvY2tldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzb2NrZXQgZm9yIHRoZSBjb250cm9sIGNvbm5lY3Rpb24uIFRoaXMgd2lsbCBvbmx5IGNsb3NlIHRoZSBjdXJyZW50IGNvbnRyb2wgc29ja2V0XG4gICAgICogaWYgdGhlIG5ldyBvbmUgaXMgbm90IGFuIHVwZ3JhZGUgdG8gdGhlIGN1cnJlbnQgb25lLlxuICAgICAqL1xuICAgIHNldCBzb2NrZXQoc29ja2V0KSB7XG4gICAgICAgIC8vIE5vIGRhdGEgc29ja2V0IHNob3VsZCBiZSBvcGVuIGluIGFueSBjYXNlIHdoZXJlIHRoZSBjb250cm9sIHNvY2tldCBpcyBzZXQgb3IgdXBncmFkZWQuXG4gICAgICAgIHRoaXMuZGF0YVNvY2tldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gVGhpcyBiZWluZyBhIHJlc2V0LCByZXNldCBhbnkgb3RoZXIgc3RhdGUgYXBhcnQgZnJvbSB0aGUgc29ja2V0LlxuICAgICAgICB0aGlzLnRsc09wdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5fcGFydGlhbFJlc3BvbnNlID0gXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2tldCkge1xuICAgICAgICAgICAgY29uc3QgbmV3U29ja2V0VXBncmFkZXNFeGlzdGluZyA9IHNvY2tldC5sb2NhbFBvcnQgPT09IHRoaXMuX3NvY2tldC5sb2NhbFBvcnQ7XG4gICAgICAgICAgICBpZiAobmV3U29ja2V0VXBncmFkZXNFeGlzdGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVNvY2tldExpc3RlbmVycyh0aGlzLnNvY2tldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZUNvbnRyb2xTb2NrZXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc29ja2V0KSB7XG4gICAgICAgICAgICAvLyBTZXR0aW5nIGEgY29tcGxldGVseSBuZXcgY29udHJvbCBzb2NrZXQgaXMgaW4gZXNzZW5jZSBzb21ldGhpbmcgbGlrZSBhIHJlc2V0LiBUaGF0J3NcbiAgICAgICAgICAgIC8vIHdoeSB3ZSBhbHNvIGNsb3NlIGFueSBvcGVuIGRhdGEgY29ubmVjdGlvbiBhYm92ZS4gV2UgY2FuIGdvIG9uZSBzdGVwIGZ1cnRoZXIgYW5kIHJlc2V0XG4gICAgICAgICAgICAvLyBhIHBvc3NpYmxlIGNsb3NpbmcgZXJyb3IuIFRoYXQgbWVhbnMgdGhhdCBhIGNsb3NlZCBGVFBDb250ZXh0IGNhbiBiZSBcInJlb3BlbmVkXCIgYnlcbiAgICAgICAgICAgIC8vIHNldHRpbmcgYSBuZXcgY29udHJvbCBzb2NrZXQuXG4gICAgICAgICAgICB0aGlzLl9jbG9zaW5nRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAvLyBEb24ndCBzZXQgYSB0aW1lb3V0IHlldC4gVGltZW91dCBmb3IgY29udHJvbCBzb2NrZXRzIGlzIG9ubHkgYWN0aXZlIGR1cmluZyBhIHRhc2ssIHNlZSBoYW5kbGUoKSBiZWxvdy5cbiAgICAgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgICAgICAgICAgc29ja2V0LnNldEVuY29kaW5nKHRoaXMuX2VuY29kaW5nKTtcbiAgICAgICAgICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSk7XG4gICAgICAgICAgICBzb2NrZXQub24oXCJkYXRhXCIsIGRhdGEgPT4gdGhpcy5fb25Db250cm9sU29ja2V0RGF0YShkYXRhKSk7XG4gICAgICAgICAgICAvLyBTZXJ2ZXIgc2VuZGluZyBhIEZJTiBwYWNrZXQgaXMgdHJlYXRlZCBhcyBhbiBlcnJvci5cbiAgICAgICAgICAgIHNvY2tldC5vbihcImVuZFwiLCAoKSA9PiB0aGlzLmNsb3NlV2l0aEVycm9yKG5ldyBFcnJvcihcIlNlcnZlciBzZW50IEZJTiBwYWNrZXQgdW5leHBlY3RlZGx5LCBjbG9zaW5nIGNvbm5lY3Rpb24uXCIpKSk7XG4gICAgICAgICAgICAvLyBDb250cm9sIGJlaW5nIGNsb3NlZCB3aXRob3V0IGVycm9yIGJ5IHNlcnZlciBpcyB0cmVhdGVkIGFzIGFuIGVycm9yLlxuICAgICAgICAgICAgc29ja2V0Lm9uKFwiY2xvc2VcIiwgaGFkRXJyb3IgPT4geyBpZiAoIWhhZEVycm9yKVxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IEVycm9yKFwiU2VydmVyIGNsb3NlZCBjb25uZWN0aW9uIHVuZXhwZWN0ZWRseS5cIikpOyB9KTtcbiAgICAgICAgICAgIHRoaXMuX3NldHVwRGVmYXVsdEVycm9ySGFuZGxlcnMoc29ja2V0LCBcImNvbnRyb2wgc29ja2V0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IEZUUCBkYXRhIGNvbm5lY3Rpb24gaWYgcHJlc2VudC5cbiAgICAgKi9cbiAgICBnZXQgZGF0YVNvY2tldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFTb2NrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgc29ja2V0IGZvciB0aGUgZGF0YSBjb25uZWN0aW9uLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBjbG9zZSB0aGUgZm9ybWVyIGRhdGEgc29ja2V0LlxuICAgICAqL1xuICAgIHNldCBkYXRhU29ja2V0KHNvY2tldCkge1xuICAgICAgICB0aGlzLl9jbG9zZVNvY2tldCh0aGlzLl9kYXRhU29ja2V0KTtcbiAgICAgICAgaWYgKHNvY2tldCkge1xuICAgICAgICAgICAgLy8gRG9uJ3Qgc2V0IGEgdGltZW91dCB5ZXQuIFRpbWVvdXQgZGF0YSBzb2NrZXQgc2hvdWxkIGJlIGFjdGl2YXRlZCB3aGVuIGRhdGEgdHJhbnNtaXNzaW9uIHN0YXJ0c1xuICAgICAgICAgICAgLy8gYW5kIHRpbWVvdXQgb24gY29udHJvbCBzb2NrZXQgaXMgZGVhY3RpdmF0ZWQuXG4gICAgICAgICAgICBzb2NrZXQuc2V0VGltZW91dCgwKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHVwRGVmYXVsdEVycm9ySGFuZGxlcnMoc29ja2V0LCBcImRhdGEgc29ja2V0XCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RhdGFTb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudGx5IHVzZWQgZW5jb2RpbmcuXG4gICAgICovXG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgdGhlIGNvbnRyb2wgc29ja2V0LlxuICAgICAqXG4gICAgICogU2VlIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvYnVmZmVyLmh0bWwjYnVmZmVyX2J1ZmZlcnNfYW5kX2NoYXJhY3Rlcl9lbmNvZGluZ3MgZm9yIHdoYXQgZW5jb2RpbmdzXG4gICAgICogYXJlIHN1cHBvcnRlZCBieSBOb2RlLlxuICAgICAqL1xuICAgIHNldCBlbmNvZGluZyhlbmNvZGluZykge1xuICAgICAgICB0aGlzLl9lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgICAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNldEVuY29kaW5nKGVuY29kaW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGFuIEZUUCBjb21tYW5kIHdpdGhvdXQgd2FpdGluZyBmb3Igb3IgaGFuZGxpbmcgdGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBzZW5kKGNvbW1hbmQpIHtcbiAgICAgICAgY29uc3QgY29udGFpbnNQYXNzd29yZCA9IGNvbW1hbmQuc3RhcnRzV2l0aChcIlBBU1NcIik7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBjb250YWluc1Bhc3N3b3JkID8gXCI+IFBBU1MgIyMjXCIgOiBgPiAke2NvbW1hbmR9YDtcbiAgICAgICAgdGhpcy5sb2cobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuX3NvY2tldC53cml0ZShjb21tYW5kICsgXCJcXHJcXG5cIiwgdGhpcy5lbmNvZGluZyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYW4gRlRQIGNvbW1hbmQgYW5kIGhhbmRsZSB0aGUgZmlyc3QgcmVzcG9uc2UuIFVzZSB0aGlzIGlmIHlvdSBoYXZlIGEgc2ltcGxlXG4gICAgICogcmVxdWVzdC1yZXNwb25zZSBzaXR1YXRpb24uXG4gICAgICovXG4gICAgcmVxdWVzdChjb21tYW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZShjb21tYW5kLCAocmVzLCB0YXNrKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0YXNrLnJlamVjdChyZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFzay5yZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGFuIEZUUCBjb21tYW5kIGFuZCBoYW5kbGUgYW55IHJlc3BvbnNlIHVudGlsIHlvdSByZXNvbHZlL3JlamVjdC4gVXNlIHRoaXMgaWYgeW91IGV4cGVjdCBtdWx0aXBsZSByZXNwb25zZXNcbiAgICAgKiB0byBhIHJlcXVlc3QuIFRoaXMgcmV0dXJucyBhIFByb21pc2UgdGhhdCB3aWxsIGhvbGQgd2hhdGV2ZXIgdGhlIHJlc3BvbnNlIGhhbmRsZXIgcGFzc2VkIG9uIHdoZW4gcmVzb2x2aW5nL3JlamVjdGluZyBpdHMgdGFzay5cbiAgICAgKi9cbiAgICBoYW5kbGUoY29tbWFuZCwgcmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgIGlmICh0aGlzLl90YXNrKSB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXCJVc2VyIGxhdW5jaGVkIGEgdGFzayB3aGlsZSBhbm90aGVyIG9uZSBpcyBzdGlsbCBydW5uaW5nLiBGb3Jnb3QgdG8gdXNlICdhd2FpdCcgb3IgJy50aGVuKCknP1wiKTtcbiAgICAgICAgICAgIGVyci5zdGFjayArPSBgXFxuUnVubmluZyB0YXNrIGxhdW5jaGVkIGF0OiAke3RoaXMuX3Rhc2suc3RhY2t9YDtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIC8vIERvbid0IHJldHVybiBoZXJlLCBjb250aW51ZSB3aXRoIHJldHVybmluZyB0aGUgUHJvbWlzZSB0aGF0IHdpbGwgdGhlbiBiZSByZWplY3RlZFxuICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29udGV4dCBjbG9zZWQgYWxyZWFkeS4gVGhhdCB3YXksIHVzZXJzIHdpbGwgcmVjZWl2ZSBhbiBleGNlcHRpb24gd2hlcmVcbiAgICAgICAgICAgIC8vIHRoZXkgY2FsbGVkIHRoaXMgbWV0aG9kIGJ5IG1pc3Rha2UuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlVGFzaywgcmVqZWN0VGFzaykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdGFzayA9IHtcbiAgICAgICAgICAgICAgICBzdGFjazogbmV3IEVycm9yKCkuc3RhY2sgfHwgXCJVbmtub3duIGNhbGwgc3RhY2tcIixcbiAgICAgICAgICAgICAgICByZXNwb25zZUhhbmRsZXIsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogYXJnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0b3BUcmFja2luZ1Rhc2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVUYXNrKGFyZyk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdDogZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0b3BUcmFja2luZ1Rhc2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdFRhc2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodGhpcy5fY2xvc2luZ0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBjbGllbnQgaGFzIGJlZW4gY2xvc2VkLiBQcm92aWRlIGFuIGVycm9yIHRoYXQgZGVzY3JpYmVzIHRoaXMgb25lIGFzIGJlaW5nIGNhdXNlZFxuICAgICAgICAgICAgICAgIC8vIGJ5IGBfY2xvc2luZ0Vycm9yYCwgaW5jbHVkZSBzdGFjayB0cmFjZXMgZm9yIGJvdGguXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBDbGllbnQgaXMgY2xvc2VkIGJlY2F1c2UgJHt0aGlzLl9jbG9zaW5nRXJyb3IubWVzc2FnZX1gKTsgLy8gVHlwZSAnRXJyb3InIGlzIG5vdCBjb3JyZWN0bHkgZGVmaW5lZCwgZG9lc24ndCBoYXZlICdjb2RlJy5cbiAgICAgICAgICAgICAgICBlcnIuc3RhY2sgKz0gYFxcbkNsb3NpbmcgcmVhc29uOiAke3RoaXMuX2Nsb3NpbmdFcnJvci5zdGFja31gO1xuICAgICAgICAgICAgICAgIGVyci5jb2RlID0gdGhpcy5fY2xvc2luZ0Vycm9yLmNvZGUgIT09IHVuZGVmaW5lZCA/IHRoaXMuX2Nsb3NpbmdFcnJvci5jb2RlIDogXCIwXCI7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFzc1RvSGFuZGxlcihlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE9ubHkgdHJhY2sgY29udHJvbCBzb2NrZXQgdGltZW91dCBkdXJpbmcgdGhlIGxpZmVjeWNsZSBvZiBhIHRhc2suIFRoaXMgYXZvaWRzIHRpbWVvdXRzIG9uIGlkbGUgc29ja2V0cyxcbiAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IHNvY2tldCBiZWhhdmlvdXIgd2hpY2ggaXMgbm90IGV4cGVjdGVkIGJ5IG1vc3QgdXNlcnMuXG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZXRUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICAgICAgICBpZiAoY29tbWFuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZChjb21tYW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZyBtZXNzYWdlIGlmIHNldCB0byBiZSB2ZXJib3NlLlxuICAgICAqL1xuICAgIGxvZyhtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29udHJvbCBzb2NrZXQgaXMgdXNpbmcgVExTLiBUaGlzIGRvZXMgbm90IG1lYW4gdGhhdCBhIHNlc3Npb25cbiAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIG5lZ290aWF0ZWQuXG4gICAgICovXG4gICAgZ2V0IGhhc1RMUygpIHtcbiAgICAgICAgcmV0dXJuIFwiZW5jcnlwdGVkXCIgaW4gdGhpcy5fc29ja2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHJlZmVyZW5jZSB0byBjdXJyZW50IHRhc2sgYW5kIGhhbmRsZXIuIFRoaXMgd29uJ3QgcmVzb2x2ZSBvciByZWplY3QgdGhlIHRhc2suXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIF9zdG9wVHJhY2tpbmdUYXNrKCkge1xuICAgICAgICAvLyBEaXNhYmxlIHRpbWVvdXQgb24gY29udHJvbCBzb2NrZXQgaWYgdGhlcmUgaXMgbm8gdGFzayBhY3RpdmUuXG4gICAgICAgIHRoaXMuc29ja2V0LnNldFRpbWVvdXQoMCk7XG4gICAgICAgIHRoaXMuX3Rhc2sgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBpbmNvbWluZyBkYXRhIG9uIHRoZSBjb250cm9sIHNvY2tldC4gVGhlIGNodW5rIGlzIGdvaW5nIHRvIGJlIG9mIHR5cGUgYHN0cmluZ2BcbiAgICAgKiBiZWNhdXNlIHdlIGxldCBgc29ja2V0YCBoYW5kbGUgZW5jb2Rpbmcgd2l0aCBgc2V0RW5jb2RpbmdgLlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBfb25Db250cm9sU29ja2V0RGF0YShjaHVuaykge1xuICAgICAgICB0aGlzLmxvZyhgPCAke2NodW5rfWApO1xuICAgICAgICAvLyBUaGlzIGNodW5rIG1pZ2h0IGNvbXBsZXRlIGFuIGVhcmxpZXIgcGFydGlhbCByZXNwb25zZS5cbiAgICAgICAgY29uc3QgY29tcGxldGVSZXNwb25zZSA9IHRoaXMuX3BhcnRpYWxSZXNwb25zZSArIGNodW5rO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSAoMCwgcGFyc2VDb250cm9sUmVzcG9uc2VfMS5wYXJzZUNvbnRyb2xSZXNwb25zZSkoY29tcGxldGVSZXNwb25zZSk7XG4gICAgICAgIC8vIFJlbWVtYmVyIGFueSBpbmNvbXBsZXRlIHJlbWFpbmRlci5cbiAgICAgICAgdGhpcy5fcGFydGlhbFJlc3BvbnNlID0gcGFyc2VkLnJlc3Q7XG4gICAgICAgIC8vIEVhY2ggcmVzcG9uc2UgZ3JvdXAgaXMgcGFzc2VkIGFsb25nIGluZGl2aWR1YWxseS5cbiAgICAgICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHBhcnNlZC5tZXNzYWdlcykge1xuICAgICAgICAgICAgY29uc3QgY29kZSA9IHBhcnNlSW50KG1lc3NhZ2Uuc3Vic3RyKDAsIDMpLCAxMCk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHsgY29kZSwgbWVzc2FnZSB9O1xuICAgICAgICAgICAgY29uc3QgZXJyID0gY29kZSA+PSA0MDAgPyBuZXcgRlRQRXJyb3IocmVzcG9uc2UpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fcGFzc1RvSGFuZGxlcihlcnIgPyBlcnIgOiByZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGUgY3VycmVudCBoYW5kbGVyIGEgcmVzcG9uc2UuIFRoaXMgaXMgdXN1YWxseSBhIGNvbnRyb2wgc29ja2V0IHJlc3BvbnNlXG4gICAgICogb3IgYSBzb2NrZXQgZXZlbnQsIGxpa2UgYW4gZXJyb3Igb3IgdGltZW91dC5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgX3Bhc3NUb0hhbmRsZXIocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Rhc2spIHtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2sucmVzcG9uc2VIYW5kbGVyKHJlc3BvbnNlLCB0aGlzLl90YXNrLnJlc29sdmVyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFcnJvcnMgb3RoZXIgdGhhbiBGVFBFcnJvciBhbHdheXMgY2xvc2UgdGhlIGNsaWVudC4gSWYgdGhlcmUgaXNuJ3QgYW4gYWN0aXZlIHRhc2sgdG8gaGFuZGxlIHRoZSBlcnJvcixcbiAgICAgICAgLy8gdGhlIG5leHQgb25lIHN1Ym1pdHRlZCB3aWxsIHJlY2VpdmUgaXQgdXNpbmcgYF9jbG9zaW5nRXJyb3JgLlxuICAgICAgICAvLyBUaGVyZSBpcyBvbmx5IG9uZSBlZGdlLWNhc2U6IElmIHRoZXJlIGlzIGFuIEZUUEVycm9yIHdoaWxlIG5vIHRhc2sgaXMgYWN0aXZlLCB0aGUgZXJyb3Igd2lsbCBiZSBkcm9wcGVkLlxuICAgICAgICAvLyBCdXQgdGhhdCBtZWFucyB0aGF0IHRoZSB1c2VyIHNlbnQgYW4gRlRQIGNvbW1hbmQgd2l0aCBubyBpbnRlbnRpb24gb2YgaGFuZGxpbmcgdGhlIHJlc3VsdC4gU28gd2h5IHNob3VsZCB0aGVcbiAgICAgICAgLy8gZXJyb3IgYmUgaGFuZGxlZD8gTWF5YmUgbG9nIGl0IGF0IGxlYXN0PyBEZWJ1ZyBsb2dnaW5nIHdpbGwgYWxyZWFkeSBkbyB0aGF0IGFuZCB0aGUgY2xpZW50IHN0YXlzIHVzZWFibGUgYWZ0ZXJcbiAgICAgICAgLy8gRlRQRXJyb3IuIFNvIG1heWJlIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZS5cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0dXAgYWxsIGVycm9yIGhhbmRsZXJzIGZvciBhIHNvY2tldC5cbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgX3NldHVwRGVmYXVsdEVycm9ySGFuZGxlcnMoc29ja2V0LCBpZGVudGlmaWVyKSB7XG4gICAgICAgIHNvY2tldC5vbmNlKFwiZXJyb3JcIiwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgZXJyb3IubWVzc2FnZSArPSBgICgke2lkZW50aWZpZXJ9KWA7XG4gICAgICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNvY2tldC5vbmNlKFwiY2xvc2VcIiwgaGFkRXJyb3IgPT4ge1xuICAgICAgICAgICAgaWYgKGhhZEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihuZXcgRXJyb3IoYFNvY2tldCBjbG9zZWQgZHVlIHRvIHRyYW5zbWlzc2lvbiBlcnJvciAoJHtpZGVudGlmaWVyfSlgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzb2NrZXQub25jZShcInRpbWVvdXRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IEVycm9yKGBUaW1lb3V0ICgke2lkZW50aWZpZXJ9KWApKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBjb250cm9sIHNvY2tldC4gU2VuZHMgUVVJVCwgdGhlbiBGSU4sIGFuZCBpZ25vcmVzIGFueSByZXNwb25zZSBvciBlcnJvci5cbiAgICAgKi9cbiAgICBfY2xvc2VDb250cm9sU29ja2V0KCkge1xuICAgICAgICB0aGlzLl9yZW1vdmVTb2NrZXRMaXN0ZW5lcnModGhpcy5fc29ja2V0KTtcbiAgICAgICAgdGhpcy5fc29ja2V0Lm9uKFwiZXJyb3JcIiwgZG9Ob3RoaW5nKTtcbiAgICAgICAgdGhpcy5zZW5kKFwiUVVJVFwiKTtcbiAgICAgICAgdGhpcy5fY2xvc2VTb2NrZXQodGhpcy5fc29ja2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgYSBzb2NrZXQsIGlnbm9yZXMgYW55IGVycm9yLlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBfY2xvc2VTb2NrZXQoc29ja2V0KSB7XG4gICAgICAgIGlmIChzb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZVNvY2tldExpc3RlbmVycyhzb2NrZXQpO1xuICAgICAgICAgICAgc29ja2V0Lm9uKFwiZXJyb3JcIiwgZG9Ob3RoaW5nKTtcbiAgICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCBkZWZhdWx0IGxpc3RlbmVycyBmb3Igc29ja2V0LlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBfcmVtb3ZlU29ja2V0TGlzdGVuZXJzKHNvY2tldCkge1xuICAgICAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIC8vIEJlZm9yZSBOb2RlLmpzIDEwLjMuMCwgdXNpbmcgYHNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoKWAgd2l0aG91dCBhbnkgbmFtZSBkaWQgbm90IHdvcms6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMjA5MjMuXG4gICAgICAgIHNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJ0aW1lb3V0XCIpO1xuICAgICAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKFwiZGF0YVwiKTtcbiAgICAgICAgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycyhcImVuZFwiKTtcbiAgICAgICAgc29ja2V0LnJlbW92ZUFsbExpc3RlbmVycyhcImVycm9yXCIpO1xuICAgICAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKFwiY2xvc2VcIik7XG4gICAgICAgIHNvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJjb25uZWN0XCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm92aWRlIGEgbmV3IHNvY2tldCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEludGVybmFsIHVzZSBvbmx5LCByZXBsYWNlZCBmb3IgdW5pdCB0ZXN0cy5cbiAgICAgKi9cbiAgICBfbmV3U29ja2V0KCkge1xuICAgICAgICByZXR1cm4gbmV3IG5ldF8xLlNvY2tldCgpO1xuICAgIH1cbn1cbmV4cG9ydHMuRlRQQ29udGV4dCA9IEZUUENvbnRleHQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUcmFja2VyID0gdm9pZCAwO1xuLyoqXG4gKiBUcmFja3MgcHJvZ3Jlc3Mgb2Ygb25lIHNvY2tldCBkYXRhIHRyYW5zZmVyIGF0IGEgdGltZS5cbiAqL1xuY2xhc3MgUHJvZ3Jlc3NUcmFja2VyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ieXRlc092ZXJhbGwgPSAwO1xuICAgICAgICB0aGlzLmludGVydmFsTXMgPSA1MDA7XG4gICAgICAgIHRoaXMub25TdG9wID0gbm9vcDtcbiAgICAgICAgdGhpcy5vbkhhbmRsZSA9IG5vb3A7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgbmV3IGhhbmRsZXIgZm9yIHByb2dyZXNzIGluZm8uIFVzZSBgdW5kZWZpbmVkYCB0byBkaXNhYmxlIHJlcG9ydGluZy5cbiAgICAgKi9cbiAgICByZXBvcnRUbyhvbkhhbmRsZSA9IG5vb3ApIHtcbiAgICAgICAgdGhpcy5vbkhhbmRsZSA9IG9uSGFuZGxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydCB0cmFja2luZyB0cmFuc2ZlciBwcm9ncmVzcyBvZiBhIHNvY2tldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzb2NrZXQgIFRoZSBzb2NrZXQgdG8gb2JzZXJ2ZS5cbiAgICAgKiBAcGFyYW0gbmFtZSAgQSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2dyZXNzIHRyYWNraW5nLCBlLmcuIGEgZmlsZW5hbWUuXG4gICAgICogQHBhcmFtIHR5cGUgIFRoZSB0eXBlIG9mIHRoZSB0cmFuc2ZlciwgdHlwaWNhbGx5IFwidXBsb2FkXCIgb3IgXCJkb3dubG9hZFwiLlxuICAgICAqL1xuICAgIHN0YXJ0KHNvY2tldCwgbmFtZSwgdHlwZSkge1xuICAgICAgICBsZXQgbGFzdEJ5dGVzID0gMDtcbiAgICAgICAgdGhpcy5vblN0b3AgPSBwb2xsKHRoaXMuaW50ZXJ2YWxNcywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBzb2NrZXQuYnl0ZXNSZWFkICsgc29ja2V0LmJ5dGVzV3JpdHRlbjtcbiAgICAgICAgICAgIHRoaXMuYnl0ZXNPdmVyYWxsICs9IGJ5dGVzIC0gbGFzdEJ5dGVzO1xuICAgICAgICAgICAgbGFzdEJ5dGVzID0gYnl0ZXM7XG4gICAgICAgICAgICB0aGlzLm9uSGFuZGxlKHtcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgYnl0ZXMsXG4gICAgICAgICAgICAgICAgYnl0ZXNPdmVyYWxsOiB0aGlzLmJ5dGVzT3ZlcmFsbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9wIHRyYWNraW5nIHRyYW5zZmVyIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHN0b3AoKSB7XG4gICAgICAgIHRoaXMub25TdG9wKGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCB0aGUgcHJvZ3Jlc3MgaGFuZGxlciBvbmUgbW9yZSB0aW1lLCB0aGVuIHN0b3AgdHJhY2tpbmcuXG4gICAgICovXG4gICAgdXBkYXRlQW5kU3RvcCgpIHtcbiAgICAgICAgdGhpcy5vblN0b3AodHJ1ZSk7XG4gICAgfVxufVxuZXhwb3J0cy5Qcm9ncmVzc1RyYWNrZXIgPSBQcm9ncmVzc1RyYWNrZXI7XG4vKipcbiAqIFN0YXJ0cyBjYWxsaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24gYXQgYSByZWd1bGFyIGludGVydmFsLiBUaGUgZmlyc3QgY2FsbCB3aWxsIGdvIG91dFxuICogaW1tZWRpYXRlbHkuIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgZnVuY3Rpb24gdG8gc3RvcCB0aGUgcG9sbGluZy5cbiAqL1xuZnVuY3Rpb24gcG9sbChpbnRlcnZhbE1zLCB1cGRhdGVGdW5jKSB7XG4gICAgY29uc3QgaWQgPSBzZXRJbnRlcnZhbCh1cGRhdGVGdW5jLCBpbnRlcnZhbE1zKTtcbiAgICBjb25zdCBzdG9wRnVuYyA9IChzdG9wV2l0aFVwZGF0ZSkgPT4ge1xuICAgICAgICBjbGVhckludGVydmFsKGlkKTtcbiAgICAgICAgaWYgKHN0b3BXaXRoVXBkYXRlKSB7XG4gICAgICAgICAgICB1cGRhdGVGdW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJldmVudCByZXBlYXRlZCBjYWxscyB0byBzdG9wIGNhbGxpbmcgaGFuZGxlci5cbiAgICAgICAgdXBkYXRlRnVuYyA9IG5vb3A7XG4gICAgfTtcbiAgICB1cGRhdGVGdW5jKCk7XG4gICAgcmV0dXJuIHN0b3BGdW5jO1xufVxuZnVuY3Rpb24gbm9vcCgpIHsgfVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU3RyaW5nV3JpdGVyID0gdm9pZCAwO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY2xhc3MgU3RyaW5nV3JpdGVyIGV4dGVuZHMgc3RyZWFtXzEuV3JpdGFibGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmJ1ZiA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICB9XG4gICAgX3dyaXRlKGNodW5rLCBfLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoY2h1bmsgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmID0gQnVmZmVyLmNvbmNhdChbdGhpcy5idWYsIGNodW5rXSk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihcIlN0cmluZ1dyaXRlciBleHBlY3RzIGNodW5rcyBvZiB0eXBlICdCdWZmZXInLlwiKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0VGV4dChlbmNvZGluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5idWYudG9TdHJpbmcoZW5jb2RpbmcpO1xuICAgIH1cbn1cbmV4cG9ydHMuU3RyaW5nV3JpdGVyID0gU3RyaW5nV3JpdGVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZW50ZXJQYXNzaXZlTW9kZUlQdjYgPSBleHBvcnRzLmVudGVyUGFzc2l2ZU1vZGVJUHY0ID0gdm9pZCAwO1xuLyoqXG4gKiBQdWJsaWMgQVBJXG4gKi9cbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9DbGllbnRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0Z0cENvbnRleHRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0ZpbGVJbmZvXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9wYXJzZUxpc3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL1N0cmluZ0VuY29kaW5nXCIpLCBleHBvcnRzKTtcbnZhciB0cmFuc2Zlcl8xID0gcmVxdWlyZShcIi4vdHJhbnNmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJlbnRlclBhc3NpdmVNb2RlSVB2NFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJhbnNmZXJfMS5lbnRlclBhc3NpdmVNb2RlSVB2NDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImVudGVyUGFzc2l2ZU1vZGVJUHY2XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cmFuc2Zlcl8xLmVudGVyUGFzc2l2ZU1vZGVJUHY2OyB9IH0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlwSXNQcml2YXRlVjRBZGRyZXNzID0gZXhwb3J0cy51cGdyYWRlU29ja2V0ID0gZXhwb3J0cy5kZXNjcmliZUFkZHJlc3MgPSBleHBvcnRzLmRlc2NyaWJlVExTID0gdm9pZCAwO1xuY29uc3QgdGxzXzEgPSByZXF1aXJlKFwidGxzXCIpO1xuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVuY3J5cHRpb24gb24gYSBnaXZlbiBzb2NrZXQgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlVExTKHNvY2tldCkge1xuICAgIGlmIChzb2NrZXQgaW5zdGFuY2VvZiB0bHNfMS5UTFNTb2NrZXQpIHtcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBzb2NrZXQuZ2V0UHJvdG9jb2woKTtcbiAgICAgICAgcmV0dXJuIHByb3RvY29sID8gcHJvdG9jb2wgOiBcIlNlcnZlciBzb2NrZXQgb3IgZGlzY29ubmVjdGVkIGNsaWVudCBzb2NrZXRcIjtcbiAgICB9XG4gICAgcmV0dXJuIFwiTm8gZW5jcnlwdGlvblwiO1xufVxuZXhwb3J0cy5kZXNjcmliZVRMUyA9IGRlc2NyaWJlVExTO1xuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHJlbW90ZSBhZGRyZXNzIG9mIGEgc29ja2V0LlxuICovXG5mdW5jdGlvbiBkZXNjcmliZUFkZHJlc3Moc29ja2V0KSB7XG4gICAgaWYgKHNvY2tldC5yZW1vdGVGYW1pbHkgPT09IFwiSVB2NlwiKSB7XG4gICAgICAgIHJldHVybiBgWyR7c29ja2V0LnJlbW90ZUFkZHJlc3N9XToke3NvY2tldC5yZW1vdGVQb3J0fWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtzb2NrZXQucmVtb3RlQWRkcmVzc306JHtzb2NrZXQucmVtb3RlUG9ydH1gO1xufVxuZXhwb3J0cy5kZXNjcmliZUFkZHJlc3MgPSBkZXNjcmliZUFkZHJlc3M7XG4vKipcbiAqIFVwZ3JhZGUgYSBzb2NrZXQgY29ubmVjdGlvbiB3aXRoIFRMUy5cbiAqL1xuZnVuY3Rpb24gdXBncmFkZVNvY2tldChzb2NrZXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB0bHNPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xuICAgICAgICAgICAgc29ja2V0XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0bHNTb2NrZXQgPSAoMCwgdGxzXzEuY29ubmVjdCkodGxzT3B0aW9ucywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0Q2VydGlmaWNhdGUgPSB0bHNPcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZCAhPT0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZXhwZWN0Q2VydGlmaWNhdGUgJiYgIXRsc1NvY2tldC5hdXRob3JpemVkKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHRsc1NvY2tldC5hdXRob3JpemF0aW9uRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGVycm9yIGxpc3RlbmVyIGFkZGVkIGJlbG93LlxuICAgICAgICAgICAgICAgIHRsc1NvY2tldC5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJlcnJvclwiKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRsc1NvY2tldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLm9uY2UoXCJlcnJvclwiLCBlcnJvciA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBncmFkZVNvY2tldCA9IHVwZ3JhZGVTb2NrZXQ7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbiBJUCBpcyBhIHByaXZhdGUgYWRkcmVzcyBhY2NvcmRpbmcgdG8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5MTgjc2VjdGlvbi0zLlxuICogVGhpcyB3aWxsIGhhbmRsZSBJUHY0LW1hcHBlZCBJUHY2IGFkZHJlc3NlcyBjb3JyZWN0bHkgYnV0IHJldHVybiBmYWxzZSBmb3IgYWxsIG90aGVyIElQdjYgYWRkcmVzc2VzLlxuICpcbiAqIEBwYXJhbSBpcCAgVGhlIElQIGFzIGEgc3RyaW5nLCBlLmcuIFwiMTkyLjE2OC4wLjFcIlxuICovXG5mdW5jdGlvbiBpcElzUHJpdmF0ZVY0QWRkcmVzcyhpcCA9IFwiXCIpIHtcbiAgICAvLyBIYW5kbGUgSVB2NC1tYXBwZWQgSVB2NiBhZGRyZXNzZXMgbGlrZSA6OmZmZmY6MTkyLjE2OC4wLjFcbiAgICBpZiAoaXAuc3RhcnRzV2l0aChcIjo6ZmZmZjpcIikpIHtcbiAgICAgICAgaXAgPSBpcC5zdWJzdHIoNyk7IC8vIFN0cmlwIDo6ZmZmZjogcHJlZml4XG4gICAgfVxuICAgIGNvbnN0IG9jdGV0cyA9IGlwLnNwbGl0KFwiLlwiKS5tYXAobyA9PiBwYXJzZUludChvLCAxMCkpO1xuICAgIHJldHVybiBvY3RldHNbMF0gPT09IDEwIC8vIDEwLjAuMC4wIC0gMTAuMjU1LjI1NS4yNTVcbiAgICAgICAgfHwgKG9jdGV0c1swXSA9PT0gMTcyICYmIG9jdGV0c1sxXSA+PSAxNiAmJiBvY3RldHNbMV0gPD0gMzEpIC8vIDE3Mi4xNi4wLjAgLSAxNzIuMzEuMjU1LjI1NVxuICAgICAgICB8fCAob2N0ZXRzWzBdID09PSAxOTIgJiYgb2N0ZXRzWzFdID09PSAxNjgpIC8vIDE5Mi4xNjguMC4wIC0gMTkyLjE2OC4yNTUuMjU1XG4gICAgICAgIHx8IGlwID09PSBcIjEyNy4wLjAuMVwiO1xufVxuZXhwb3J0cy5pcElzUHJpdmF0ZVY0QWRkcmVzcyA9IGlwSXNQcml2YXRlVjRBZGRyZXNzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBvc2l0aXZlSW50ZXJtZWRpYXRlID0gZXhwb3J0cy5wb3NpdGl2ZUNvbXBsZXRpb24gPSBleHBvcnRzLmlzTXVsdGlsaW5lID0gZXhwb3J0cy5pc1NpbmdsZUxpbmUgPSBleHBvcnRzLnBhcnNlQ29udHJvbFJlc3BvbnNlID0gdm9pZCAwO1xuY29uc3QgTEYgPSBcIlxcblwiO1xuLyoqXG4gKiBQYXJzZSBhbiBGVFAgY29udHJvbCByZXNwb25zZSBhcyBhIGNvbGxlY3Rpb24gb2YgbWVzc2FnZXMuIEEgbWVzc2FnZSBpcyBhIGNvbXBsZXRlXG4gKiBzaW5nbGUtIG9yIG11bHRpbGluZSByZXNwb25zZS4gQSByZXNwb25zZSBjYW4gYWxzbyBjb250YWluIG11bHRpcGxlIG11bHRpbGluZSByZXNwb25zZXNcbiAqIHRoYXQgd2lsbCBlYWNoIGJlIHJlcHJlc2VudGVkIGJ5IGEgbWVzc2FnZS4gQSByZXNwb25zZSBjYW4gYWxzbyBiZSBpbmNvbXBsZXRlXG4gKiBhbmQgYmUgY29tcGxldGVkIG9uIHRoZSBuZXh0IGluY29taW5nIGRhdGEgY2h1bmsgZm9yIHdoaWNoIGNhc2UgdGhpcyBmdW5jdGlvbiBhbHNvXG4gKiBkZXNjcmliZXMgYSBgcmVzdGAuIFRoaXMgZnVuY3Rpb24gY29udmVydHMgYWxsIENSTEYgdG8gTEYuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ29udHJvbFJlc3BvbnNlKHRleHQpIHtcbiAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoaXNOb3RCbGFuayk7XG4gICAgY29uc3QgbWVzc2FnZXMgPSBbXTtcbiAgICBsZXQgc3RhcnRBdCA9IDA7XG4gICAgbGV0IHRva2VuUmVnZXg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaV07XG4gICAgICAgIC8vIE5vIGdyb3VwIGhhcyBiZWVuIG9wZW5lZC5cbiAgICAgICAgaWYgKCF0b2tlblJlZ2V4KSB7XG4gICAgICAgICAgICBpZiAoaXNNdWx0aWxpbmUobGluZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBPcGVuIGEgZ3JvdXAgYnkgc2V0dGluZyBhbiBleHBlY3RlZCB0b2tlbi5cbiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbiA9IGxpbmUuc3Vic3RyKDAsIDMpO1xuICAgICAgICAgICAgICAgIHRva2VuUmVnZXggPSBuZXcgUmVnRXhwKGBeJHt0b2tlbn0oPzokfCApYCk7XG4gICAgICAgICAgICAgICAgc3RhcnRBdCA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc1NpbmdsZUxpbmUobGluZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5nbGUgbGluZXMgY2FuIGJlIGdyb3VwZWQgaW1tZWRpYXRlbHkuXG4gICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBHcm91cCBoYXMgYmVlbiBvcGVuZWQsIGV4cGVjdCBjbG9zaW5nIHRva2VuLlxuICAgICAgICBlbHNlIGlmICh0b2tlblJlZ2V4LnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgIHRva2VuUmVnZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBtZXNzYWdlcy5wdXNoKGxpbmVzLnNsaWNlKHN0YXJ0QXQsIGkgKyAxKS5qb2luKExGKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVGhlIGxhc3QgZ3JvdXAgbWlnaHQgbm90IGhhdmUgYmVlbiBjbG9zZWQsIHJlcG9ydCBpdCBhcyBhIHJlc3QuXG4gICAgY29uc3QgcmVzdCA9IHRva2VuUmVnZXggPyBsaW5lcy5zbGljZShzdGFydEF0KS5qb2luKExGKSArIExGIDogXCJcIjtcbiAgICByZXR1cm4geyBtZXNzYWdlcywgcmVzdCB9O1xufVxuZXhwb3J0cy5wYXJzZUNvbnRyb2xSZXNwb25zZSA9IHBhcnNlQ29udHJvbFJlc3BvbnNlO1xuZnVuY3Rpb24gaXNTaW5nbGVMaW5lKGxpbmUpIHtcbiAgICByZXR1cm4gL15cXGRcXGRcXGQoPzokfCApLy50ZXN0KGxpbmUpO1xufVxuZXhwb3J0cy5pc1NpbmdsZUxpbmUgPSBpc1NpbmdsZUxpbmU7XG5mdW5jdGlvbiBpc011bHRpbGluZShsaW5lKSB7XG4gICAgcmV0dXJuIC9eXFxkXFxkXFxkLS8udGVzdChsaW5lKTtcbn1cbmV4cG9ydHMuaXNNdWx0aWxpbmUgPSBpc011bHRpbGluZTtcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgYW4gRlRQIHJldHVybiBjb2RlIGRlc2NyaWJlcyBhIHBvc2l0aXZlIGNvbXBsZXRpb24uXG4gKi9cbmZ1bmN0aW9uIHBvc2l0aXZlQ29tcGxldGlvbihjb2RlKSB7XG4gICAgcmV0dXJuIGNvZGUgPj0gMjAwICYmIGNvZGUgPCAzMDA7XG59XG5leHBvcnRzLnBvc2l0aXZlQ29tcGxldGlvbiA9IHBvc2l0aXZlQ29tcGxldGlvbjtcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgYW4gRlRQIHJldHVybiBjb2RlIGRlc2NyaWJlcyBhIHBvc2l0aXZlIGludGVybWVkaWF0ZSByZXNwb25zZS5cbiAqL1xuZnVuY3Rpb24gcG9zaXRpdmVJbnRlcm1lZGlhdGUoY29kZSkge1xuICAgIHJldHVybiBjb2RlID49IDMwMCAmJiBjb2RlIDwgNDAwO1xufVxuZXhwb3J0cy5wb3NpdGl2ZUludGVybWVkaWF0ZSA9IHBvc2l0aXZlSW50ZXJtZWRpYXRlO1xuZnVuY3Rpb24gaXNOb3RCbGFuayhzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRyaW0oKSAhPT0gXCJcIjtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlTGlzdCA9IHZvaWQgMDtcbmNvbnN0IGRvc1BhcnNlciA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wYXJzZUxpc3RET1NcIikpO1xuY29uc3QgdW5peFBhcnNlciA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wYXJzZUxpc3RVbml4XCIpKTtcbmNvbnN0IG1sc2RQYXJzZXIgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vcGFyc2VMaXN0TUxTRFwiKSk7XG4vKipcbiAqIEF2YWlsYWJsZSBkaXJlY3RvcnkgbGlzdGluZyBwYXJzZXJzLiBUaGVzZSBhcmUgY2FuZGlkYXRlcyB0aGF0IHdpbGwgYmUgdGVzdGVkXG4gKiBpbiB0aGUgb3JkZXIgcHJlc2VudGVkLiBUaGUgZmlyc3QgY2FuZGlkYXRlIHdpbGwgYmUgdXNlZCB0byBwYXJzZSB0aGUgd2hvbGUgbGlzdC5cbiAqL1xuY29uc3QgYXZhaWxhYmxlUGFyc2VycyA9IFtcbiAgICBkb3NQYXJzZXIsXG4gICAgdW5peFBhcnNlcixcbiAgICBtbHNkUGFyc2VyIC8vIEtlZXAgTUxTRCBsYXN0LCBtYXkgYWNjZXB0IGZpbGVuYW1lIG9ubHlcbl07XG5mdW5jdGlvbiBmaXJzdENvbXBhdGlibGVQYXJzZXIobGluZSwgcGFyc2Vycykge1xuICAgIHJldHVybiBwYXJzZXJzLmZpbmQocGFyc2VyID0+IHBhcnNlci50ZXN0TGluZShsaW5lKSA9PT0gdHJ1ZSk7XG59XG5mdW5jdGlvbiBpc05vdEJsYW5rKHN0cikge1xuICAgIHJldHVybiBzdHIudHJpbSgpICE9PSBcIlwiO1xufVxuZnVuY3Rpb24gaXNOb3RNZXRhKHN0cikge1xuICAgIHJldHVybiAhc3RyLnN0YXJ0c1dpdGgoXCJ0b3RhbFwiKTtcbn1cbmNvbnN0IFJFR0VYX05FV0xJTkUgPSAvXFxyP1xcbi87XG4vKipcbiAqIFBhcnNlIHJhdyBkaXJlY3RvcnkgbGlzdGluZy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VMaXN0KHJhd0xpc3QpIHtcbiAgICBjb25zdCBsaW5lcyA9IHJhd0xpc3RcbiAgICAgICAgLnNwbGl0KFJFR0VYX05FV0xJTkUpXG4gICAgICAgIC5maWx0ZXIoaXNOb3RCbGFuaylcbiAgICAgICAgLmZpbHRlcihpc05vdE1ldGEpO1xuICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCB0ZXN0TGluZSA9IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHBhcnNlciA9IGZpcnN0Q29tcGF0aWJsZVBhcnNlcih0ZXN0TGluZSwgYXZhaWxhYmxlUGFyc2Vycyk7XG4gICAgaWYgKCFwYXJzZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBsaWJyYXJ5IG9ubHkgc3VwcG9ydHMgTUxTRCwgVW5peC0gb3IgRE9TLXN0eWxlIGRpcmVjdG9yeSBsaXN0aW5nLiBZb3VyIEZUUCBzZXJ2ZXIgc2VlbXMgdG8gYmUgdXNpbmcgYW5vdGhlciBmb3JtYXQuIFlvdSBjYW4gc2VlIHRoZSB0cmFuc21pdHRlZCBsaXN0aW5nIHdoZW4gc2V0dGluZyBgY2xpZW50LmZ0cC52ZXJib3NlID0gdHJ1ZWAuIFlvdSBjYW4gdGhlbiBwcm92aWRlIGEgY3VzdG9tIHBhcnNlciB0byBgY2xpZW50LnBhcnNlTGlzdGAsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy5cIik7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVzID0gbGluZXNcbiAgICAgICAgLm1hcChwYXJzZXIucGFyc2VMaW5lKVxuICAgICAgICAuZmlsdGVyKChpbmZvKSA9PiBpbmZvICE9PSB1bmRlZmluZWQpO1xuICAgIHJldHVybiBwYXJzZXIudHJhbnNmb3JtTGlzdChmaWxlcyk7XG59XG5leHBvcnRzLnBhcnNlTGlzdCA9IHBhcnNlTGlzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50cmFuc2Zvcm1MaXN0ID0gZXhwb3J0cy5wYXJzZUxpbmUgPSBleHBvcnRzLnRlc3RMaW5lID0gdm9pZCAwO1xuY29uc3QgRmlsZUluZm9fMSA9IHJlcXVpcmUoXCIuL0ZpbGVJbmZvXCIpO1xuLyoqXG4gKiBUaGlzIHBhcnNlciBpcyBiYXNlZCBvbiB0aGUgRlRQIGNsaWVudCBsaWJyYXJ5IHNvdXJjZSBjb2RlIGluIEFwYWNoZSBDb21tb25zIE5ldCBwcm92aWRlZFxuICogdW5kZXIgdGhlIEFwYWNoZSAyLjAgbGljZW5zZS4gSXQgaGFzIGJlZW4gc2ltcGxpZmllZCBhbmQgcmV3cml0dGVuIHRvIGJldHRlciBmaXQgdGhlIEphdmFzY3JpcHQgbGFuZ3VhZ2UuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jb21tb25zLW5ldC9ibG9iL21hc3Rlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY29tbW9ucy9uZXQvZnRwL3BhcnNlci9OVEZUUEVudHJ5UGFyc2VyLmphdmFcbiAqL1xuY29uc3QgUkVfTElORSA9IG5ldyBSZWdFeHAoXCIoXFxcXFMrKVxcXFxzKyhcXFxcUyspXFxcXHMrXCIgLy8gTU0tZGQteXkgd2hpdGVzcGFjZSBoaDptbWF8a2s6bW0gc3dhbGxvdyB0cmFpbGluZyBzcGFjZXNcbiAgICArIFwiKD86KDxESVI+KXwoWzAtOV0rKSlcXFxccytcIiAvLyA8RElSPiBvciBkZGRkZCBzd2FsbG93IHRyYWlsaW5nIHNwYWNlc1xuICAgICsgXCIoXFxcXFMuKilcIiAvLyBGaXJzdCBub24tc3BhY2UgZm9sbG93ZWQgYnkgcmVzdCBvZiBsaW5lIChuYW1lKVxuKTtcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgZ2l2ZW4gbGluZSBtaWdodCBiZSBhIERPUy1zdHlsZSBsaXN0aW5nLlxuICpcbiAqIC0gRXhhbXBsZTogYDEyLTA1LTk2ICAwNTowM1BNICAgICAgIDxESVI+ICAgICAgICAgIG15RGlyYFxuICovXG5mdW5jdGlvbiB0ZXN0TGluZShsaW5lKSB7XG4gICAgcmV0dXJuIC9eXFxkezJ9Ly50ZXN0KGxpbmUpICYmIFJFX0xJTkUudGVzdChsaW5lKTtcbn1cbmV4cG9ydHMudGVzdExpbmUgPSB0ZXN0TGluZTtcbi8qKlxuICogUGFyc2UgYSBzaW5nbGUgbGluZSBvZiBhIERPUy1zdHlsZSBkaXJlY3RvcnkgbGlzdGluZy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VMaW5lKGxpbmUpIHtcbiAgICBjb25zdCBncm91cHMgPSBsaW5lLm1hdGNoKFJFX0xJTkUpO1xuICAgIGlmIChncm91cHMgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IGdyb3Vwc1s1XTtcbiAgICBpZiAobmFtZSA9PT0gXCIuXCIgfHwgbmFtZSA9PT0gXCIuLlwiKSB7IC8vIElnbm9yZSBwYXJlbnQgZGlyZWN0b3J5IGxpbmtzXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZUluZm9fMS5GaWxlSW5mbyhuYW1lKTtcbiAgICBjb25zdCBmaWxlVHlwZSA9IGdyb3Vwc1szXTtcbiAgICBpZiAoZmlsZVR5cGUgPT09IFwiPERJUj5cIikge1xuICAgICAgICBmaWxlLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLkRpcmVjdG9yeTtcbiAgICAgICAgZmlsZS5zaXplID0gMDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZpbGUudHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuRmlsZTtcbiAgICAgICAgZmlsZS5zaXplID0gcGFyc2VJbnQoZ3JvdXBzWzRdLCAxMCk7XG4gICAgfVxuICAgIGZpbGUucmF3TW9kaWZpZWRBdCA9IGdyb3Vwc1sxXSArIFwiIFwiICsgZ3JvdXBzWzJdO1xuICAgIHJldHVybiBmaWxlO1xufVxuZXhwb3J0cy5wYXJzZUxpbmUgPSBwYXJzZUxpbmU7XG5mdW5jdGlvbiB0cmFuc2Zvcm1MaXN0KGZpbGVzKSB7XG4gICAgcmV0dXJuIGZpbGVzO1xufVxuZXhwb3J0cy50cmFuc2Zvcm1MaXN0ID0gdHJhbnNmb3JtTGlzdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZU1MU3hEYXRlID0gZXhwb3J0cy50cmFuc2Zvcm1MaXN0ID0gZXhwb3J0cy5wYXJzZUxpbmUgPSBleHBvcnRzLnRlc3RMaW5lID0gdm9pZCAwO1xuY29uc3QgRmlsZUluZm9fMSA9IHJlcXVpcmUoXCIuL0ZpbGVJbmZvXCIpO1xuZnVuY3Rpb24gcGFyc2VTaXplKHZhbHVlLCBpbmZvKSB7XG4gICAgaW5mby5zaXplID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbn1cbi8qKlxuICogUGFyc2VycyBmb3IgTUxTRCBmYWN0cy5cbiAqL1xuY29uc3QgZmFjdEhhbmRsZXJzQnlOYW1lID0ge1xuICAgIFwic2l6ZVwiOiBwYXJzZVNpemUsIC8vIEZpbGUgc2l6ZVxuICAgIFwic2l6ZFwiOiBwYXJzZVNpemUsIC8vIERpcmVjdG9yeSBzaXplXG4gICAgXCJ1bmlxdWVcIjogKHZhbHVlLCBpbmZvKSA9PiB7XG4gICAgICAgIGluZm8udW5pcXVlSUQgPSB2YWx1ZTtcbiAgICB9LFxuICAgIFwibW9kaWZ5XCI6ICh2YWx1ZSwgaW5mbykgPT4ge1xuICAgICAgICBpbmZvLm1vZGlmaWVkQXQgPSBwYXJzZU1MU3hEYXRlKHZhbHVlKTtcbiAgICAgICAgaW5mby5yYXdNb2RpZmllZEF0ID0gaW5mby5tb2RpZmllZEF0LnRvSVNPU3RyaW5nKCk7XG4gICAgfSxcbiAgICBcInR5cGVcIjogKHZhbHVlLCBpbmZvKSA9PiB7XG4gICAgICAgIC8vIFRoZXJlIHNlZW1zIHRvIGJlIGNvbmZ1c2lvbiBvbiBob3cgdG8gaGFuZGxlIHN5bWJvbGljIGxpbmtzIGZvciBVbml4LiBSRkMgMzY1OSBkb2Vzbid0IGRlc2NyaWJlXG4gICAgICAgIC8vIHRoaXMgYnV0IG1lbnRpb25zIHNvbWUgZXhhbXBsZXMgdXNpbmcgdGhlIHN5bnRheCBgdHlwZT1PUy51bml4PXNsaW5rOjx0YXJnZXQ+YC4gQnV0IGFjY29yZGluZyB0b1xuICAgICAgICAvLyBhbiBlbnRyeSBpbiB0aGUgRXJyYXRhIChodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9lcnJhdGEvZWlkMTUwMCkgdGhpcyBzeW50YXggY2FuJ3QgYmUgdmFsaWQuXG4gICAgICAgIC8vIEluc3RlYWQgaXQgcHJvcG9zZXMgdG8gdXNlIGB0eXBlPU9TLnVuaXg9c3ltbGlua2AgYW5kIHRvIHRoZW4gbGlzdCB0aGUgYWN0dWFsIHRhcmdldCBvZiB0aGVcbiAgICAgICAgLy8gc3ltYm9saWMgbGluayBhcyBhbm90aGVyIGVudHJ5IGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZy4gVGhlIHVuaXF1ZSBpZGVudGlmaWVycyBjYW4gdGhlbiBiZSB1c2VkXG4gICAgICAgIC8vIHRvIGRlcml2ZSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIGxpbmsocykgYW5kIHRhcmdldC4gV2UnbGwgaGF2ZSB0byBoYW5kbGUgYm90aCBjYXNlcyBhcyB0aGVyZVxuICAgICAgICAvLyBhcmUgZGlmZmVyaW5nIG9waW5pb25zIG9uIGhvdyB0byBkZWFsIHdpdGggdGhpcy4gSGVyZSBhcmUgc29tZSBsaW5rcyBvbiB0aGlzIHRvcGljOlxuICAgICAgICAvLyAtIFByb0ZUUEQgc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vcHJvZnRwZC9wcm9mdHBkL2Jsb2IvNTZlNmRmYTU5OGNiZDRlZjVjNmNiYTQzOWJjYmNkNTNhNjNlM2IyMS9tb2R1bGVzL21vZF9mYWN0cy5jI0w1MzFcbiAgICAgICAgLy8gLSBQcm9GVFBEIGJ1ZzogaHR0cDovL2J1Z3MucHJvZnRwZC5vcmcvc2hvd19idWcuY2dpP2lkPTMzMThcbiAgICAgICAgLy8gLSBQcm9GVFBEIHN0YXRlbWVudDogaHR0cDovL3d3dy5wcm9mdHBkLm9yZy9kb2NzL21vZHVsZXMvbW9kX2ZhY3RzLmh0bWxcbiAgICAgICAgLy8g4oCTIEZpbGVaaWxsYSBidWc6IGh0dHBzOi8vdHJhYy5maWxlemlsbGEtcHJvamVjdC5vcmcvdGlja2V0LzkzMTBcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCJPUy51bml4PXNsaW5rXCIpKSB7XG4gICAgICAgICAgICBpbmZvLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLlN5bWJvbGljTGluaztcbiAgICAgICAgICAgIGluZm8ubGluayA9IHZhbHVlLnN1YnN0cih2YWx1ZS5pbmRleE9mKFwiOlwiKSArIDEpO1xuICAgICAgICAgICAgcmV0dXJuIDEgLyogRmFjdEhhbmRsZXJSZXN1bHQuQ29udGludWUgKi87XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgICAgICAgICBpbmZvLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLkZpbGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZGlyXCI6XG4gICAgICAgICAgICAgICAgaW5mby50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5EaXJlY3Rvcnk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiT1MudW5peD1zeW1saW5rXCI6XG4gICAgICAgICAgICAgICAgaW5mby50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5TeW1ib2xpY0xpbms7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBvZiB0aGUgc3ltYm9saWMgbGluayBtaWdodCBiZSBkZWZpbmVkIGluIGFub3RoZXIgbGluZSBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcuXG4gICAgICAgICAgICAgICAgLy8gV2UnbGwgaGFuZGxlIHRoaXMgaW4gYHRyYW5zZm9ybUxpc3QoKWAgYmVsb3cuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiY2RpclwiOiAvLyBDdXJyZW50IGRpcmVjdG9yeSBiZWluZyBsaXN0ZWRcbiAgICAgICAgICAgIGNhc2UgXCJwZGlyXCI6IC8vIFBhcmVudCBkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICByZXR1cm4gMiAvKiBGYWN0SGFuZGxlclJlc3VsdC5JZ25vcmVGaWxlICovOyAvLyBEb24ndCBpbmNsdWRlIHRoZXNlIGVudHJpZXMgaW4gdGhlIGxpc3RpbmdcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaW5mby50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5Vbmtub3duO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAxIC8qIEZhY3RIYW5kbGVyUmVzdWx0LkNvbnRpbnVlICovO1xuICAgIH0sXG4gICAgXCJ1bml4Lm1vZGVcIjogKHZhbHVlLCBpbmZvKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpZ2l0cyA9IHZhbHVlLnN1YnN0cigtMyk7XG4gICAgICAgIGluZm8ucGVybWlzc2lvbnMgPSB7XG4gICAgICAgICAgICB1c2VyOiBwYXJzZUludChkaWdpdHNbMF0sIDEwKSxcbiAgICAgICAgICAgIGdyb3VwOiBwYXJzZUludChkaWdpdHNbMV0sIDEwKSxcbiAgICAgICAgICAgIHdvcmxkOiBwYXJzZUludChkaWdpdHNbMl0sIDEwKVxuICAgICAgICB9O1xuICAgIH0sXG4gICAgXCJ1bml4Lm93bmVybmFtZVwiOiAodmFsdWUsIGluZm8pID0+IHtcbiAgICAgICAgaW5mby51c2VyID0gdmFsdWU7XG4gICAgfSxcbiAgICBcInVuaXgub3duZXJcIjogKHZhbHVlLCBpbmZvKSA9PiB7XG4gICAgICAgIGlmIChpbmZvLnVzZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGluZm8udXNlciA9IHZhbHVlO1xuICAgIH0sXG4gICAgZ2V0IFwidW5peC51aWRcIigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbXCJ1bml4Lm93bmVyXCJdO1xuICAgIH0sXG4gICAgXCJ1bml4Lmdyb3VwbmFtZVwiOiAodmFsdWUsIGluZm8pID0+IHtcbiAgICAgICAgaW5mby5ncm91cCA9IHZhbHVlO1xuICAgIH0sXG4gICAgXCJ1bml4Lmdyb3VwXCI6ICh2YWx1ZSwgaW5mbykgPT4ge1xuICAgICAgICBpZiAoaW5mby5ncm91cCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgaW5mby5ncm91cCA9IHZhbHVlO1xuICAgIH0sXG4gICAgZ2V0IFwidW5peC5naWRcIigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbXCJ1bml4Lmdyb3VwXCJdO1xuICAgIH1cbiAgICAvLyBSZWdhcmRpbmcgdGhlIGZhY3QgXCJwZXJtXCI6XG4gICAgLy8gV2UgZG9uJ3QgaGFuZGxlIHBlcm1pc3Npb24gaW5mb3JtYXRpb24gc3RvcmVkIGluIFwicGVybVwiIGJlY2F1c2UgaXRzIGluZm9ybWF0aW9uIGlzIGNvbmNlcHR1YWxseVxuICAgIC8vIGRpZmZlcmVudCBmcm9tIHdoYXQgdXNlcnMgb2YgRlRQIGNsaWVudHMgdXN1YWxseSBhc3NvY2lhdGUgd2l0aCBcInBlcm1pc3Npb25zXCIuIFRob3NlIHRoYXQgaGF2ZVxuICAgIC8vIHNvbWUgZXhwZWN0YXRpb25zIChhbmQgcHJvYmFibHkgd2FudCB0byBlZGl0IHRoZW0gd2l0aCBhIFNJVEUgY29tbWFuZCkgb2Z0ZW4gdW5rbm93aW5nbHkgZXhwZWN0XG4gICAgLy8gdGhlIFVuaXggcGVybWlzc2lvbiBzeXN0ZW0uIFRoZSBpbmZvcm1hdGlvbiBwYXNzZWQgYnkgXCJwZXJtXCIgZGVzY3JpYmVzIHdoYXQgRlRQIGNvbW1hbmRzIGNhbiBiZVxuICAgIC8vIGV4ZWN1dGVkIHdpdGggYSBmaWxlL2RpcmVjdG9yeS4gQnV0IGV2ZW4gdGhpcyBjYW4gYmUgZWl0aGVyIGluY29tcGxldGUgb3IganVzdCBtZWFudCBhcyBhIFwiZ3VpZGVcIlxuICAgIC8vIGFzIHRoZSBzcGVjIG1lbnRpb25zLiBGcm9tIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNjU5I3NlY3Rpb24tNy41LjU6IFwiVGhlIHBlcm1pc3Npb25zIGFyZVxuICAgIC8vIGRlc2NyaWJlZCBoZXJlIGFzIHRoZXkgYXBwbHkgdG8gRlRQIGNvbW1hbmRzLiBUaGV5IG1heSBub3QgbWFwIGVhc2lseSBpbnRvIHBhcnRpY3VsYXIgcGVybWlzc2lvbnNcbiAgICAvLyBhdmFpbGFibGUgb24gdGhlIHNlcnZlcidzIG9wZXJhdGluZyBzeXN0ZW0uXCIgVGhlIHBhcnNlciBieSBBcGFjaGUgQ29tbW9ucyB0cmllcyB0byB0cmFuc2xhdGUgdGhlc2VcbiAgICAvLyB0byBVbml4IHBlcm1pc3Npb25zIOKAkyB0aGlzIGlzIG1pc2xlYWRpbmcgdXNlcnMgYW5kIG1pZ2h0IG5vdCBldmVuIGJlIGNvcnJlY3QuXG59O1xuLyoqXG4gKiBTcGxpdCBhIHN0cmluZyBvbmNlIGF0IHRoZSBmaXJzdCBwb3NpdGlvbiBvZiBhIGRlbGltaXRlci4gRm9yIGV4YW1wbGVcbiAqIGBzcGxpdFN0cmluZ09uY2UoXCJhIGIgYyBkXCIsIFwiIFwiKWAgcmV0dXJucyBgW1wiYVwiLCBcImIgYyBkXCJdYC5cbiAqL1xuZnVuY3Rpb24gc3BsaXRTdHJpbmdPbmNlKHN0ciwgZGVsaW1pdGVyKSB7XG4gICAgY29uc3QgcG9zID0gc3RyLmluZGV4T2YoZGVsaW1pdGVyKTtcbiAgICBjb25zdCBhID0gc3RyLnN1YnN0cigwLCBwb3MpO1xuICAgIGNvbnN0IGIgPSBzdHIuc3Vic3RyKHBvcyArIGRlbGltaXRlci5sZW5ndGgpO1xuICAgIHJldHVybiBbYSwgYl07XG59XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhIGdpdmVuIGxpbmUgbWlnaHQgYmUgcGFydCBvZiBhbiBNTFNEIGxpc3RpbmcuXG4gKlxuICogLSBFeGFtcGxlIDE6IGBzaXplPTE1MjI3O3R5cGU9ZGlyO3Blcm09ZWw7bW9kaWZ5PTIwMTkwNDE5MDY1NzMwOyB0ZXN0IG9uZWBcbiAqIC0gRXhhbXBsZSAyOiBgIGZpbGUgbmFtZWAgKGxlYWRpbmcgc3BhY2UpXG4gKi9cbmZ1bmN0aW9uIHRlc3RMaW5lKGxpbmUpIHtcbiAgICByZXR1cm4gL15cXFMrPVxcUys7Ly50ZXN0KGxpbmUpIHx8IGxpbmUuc3RhcnRzV2l0aChcIiBcIik7XG59XG5leHBvcnRzLnRlc3RMaW5lID0gdGVzdExpbmU7XG4vKipcbiAqIFBhcnNlIHNpbmdsZSBsaW5lIGFzIE1MU0QgbGlzdGluZywgc2VlIHNwZWNpZmljYXRpb24gYXQgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM2NTkjc2VjdGlvbi03LlxuICovXG5mdW5jdGlvbiBwYXJzZUxpbmUobGluZSkge1xuICAgIGNvbnN0IFtwYWNrZWRGYWN0cywgbmFtZV0gPSBzcGxpdFN0cmluZ09uY2UobGluZSwgXCIgXCIpO1xuICAgIGlmIChuYW1lID09PSBcIlwiIHx8IG5hbWUgPT09IFwiLlwiIHx8IG5hbWUgPT09IFwiLi5cIikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBpbmZvID0gbmV3IEZpbGVJbmZvXzEuRmlsZUluZm8obmFtZSk7XG4gICAgY29uc3QgZmFjdHMgPSBwYWNrZWRGYWN0cy5zcGxpdChcIjtcIik7XG4gICAgZm9yIChjb25zdCBmYWN0IG9mIGZhY3RzKSB7XG4gICAgICAgIGNvbnN0IFtmYWN0TmFtZSwgZmFjdFZhbHVlXSA9IHNwbGl0U3RyaW5nT25jZShmYWN0LCBcIj1cIik7XG4gICAgICAgIGlmICghZmFjdFZhbHVlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmYWN0SGFuZGxlciA9IGZhY3RIYW5kbGVyc0J5TmFtZVtmYWN0TmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgaWYgKCFmYWN0SGFuZGxlcikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZmFjdEhhbmRsZXIoZmFjdFZhbHVlLCBpbmZvKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gMiAvKiBGYWN0SGFuZGxlclJlc3VsdC5JZ25vcmVGaWxlICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xufVxuZXhwb3J0cy5wYXJzZUxpbmUgPSBwYXJzZUxpbmU7XG5mdW5jdGlvbiB0cmFuc2Zvcm1MaXN0KGZpbGVzKSB7XG4gICAgLy8gQ3JlYXRlIGEgbWFwIG9mIGFsbCBmaWxlcyB0aGF0IGFyZSBub3Qgc3ltYm9saWMgbGlua3MgYnkgdGhlaXIgdW5pcXVlIElEXG4gICAgY29uc3Qgbm9uTGlua3NCeUlEID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBpZiAoIWZpbGUuaXNTeW1ib2xpY0xpbmsgJiYgZmlsZS51bmlxdWVJRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBub25MaW5rc0J5SUQuc2V0KGZpbGUudW5pcXVlSUQsIGZpbGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkRmlsZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGFzc29jaWF0ZSB1bnJlc29sdmVkIHN5bWJvbGljIGxpbmtzIHdpdGggYSB0YXJnZXQgZmlsZS9kaXJlY3RvcnkuXG4gICAgICAgIGlmIChmaWxlLmlzU3ltYm9saWNMaW5rICYmIGZpbGUudW5pcXVlSUQgIT09IHVuZGVmaW5lZCAmJiBmaWxlLmxpbmsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gbm9uTGlua3NCeUlELmdldChmaWxlLnVuaXF1ZUlEKTtcbiAgICAgICAgICAgIGlmICh0YXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZpbGUubGluayA9IHRhcmdldC5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSB0YXJnZXQgb2YgYSBzeW1ib2xpYyBsaW5rIGlzIGxpc3RlZCBhcyBhbiBlbnRyeSBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcgYnV0IG1pZ2h0XG4gICAgICAgIC8vIGhhdmUgYSBwYXRoIHBvaW50aW5nIG91dHNpZGUgb2YgdGhpcyBkaXJlY3RvcnkuIEluIHRoYXQgY2FzZSB3ZSBkb24ndCB3YW50IHRoaXMgZW50cnlcbiAgICAgICAgLy8gdG8gYmUgcGFydCBvZiB0aGUgbGlzdGluZy4gV2UgZ2VuZXJhbGx5IGRvbid0IHdhbnQgdGhlc2Uga2luZCBvZiBlbnRyaWVzIGF0IGFsbC5cbiAgICAgICAgY29uc3QgaXNQYXJ0T2ZEaXJlY3RvcnkgPSAhZmlsZS5uYW1lLmluY2x1ZGVzKFwiL1wiKTtcbiAgICAgICAgaWYgKGlzUGFydE9mRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICByZXNvbHZlZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkRmlsZXM7XG59XG5leHBvcnRzLnRyYW5zZm9ybUxpc3QgPSB0cmFuc2Zvcm1MaXN0O1xuLyoqXG4gKiBQYXJzZSBkYXRlIGFzIHNwZWNpZmllZCBpbiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzY1OSNzZWN0aW9uLTIuMy5cbiAqXG4gKiBNZXNzYWdlIGNvbnRhaW5zIHJlc3BvbnNlIGNvZGUgYW5kIG1vZGlmaWVkIHRpbWUgaW4gdGhlIGZvcm1hdDogWVlZWU1NRERISE1NU1NbLnNzc11cbiAqIEZvciBleGFtcGxlIGAxOTk5MTAwNTIxMzEwMmAgb3IgYDE5OTgwNjE1MTAwMDQ1LjAxNGAuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTUxTeERhdGUoZmFjdCkge1xuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQygrZmFjdC5zbGljZSgwLCA0KSwgLy8gWWVhclxuICAgICtmYWN0LnNsaWNlKDQsIDYpIC0gMSwgLy8gTW9udGhcbiAgICArZmFjdC5zbGljZSg2LCA4KSwgLy8gRGF0ZVxuICAgICtmYWN0LnNsaWNlKDgsIDEwKSwgLy8gSG91cnNcbiAgICArZmFjdC5zbGljZSgxMCwgMTIpLCAvLyBNaW51dGVzXG4gICAgK2ZhY3Quc2xpY2UoMTIsIDE0KSwgLy8gU2Vjb25kc1xuICAgICtmYWN0LnNsaWNlKDE1LCAxOCkgLy8gTWlsbGlzZWNvbmRzXG4gICAgKSk7XG59XG5leHBvcnRzLnBhcnNlTUxTeERhdGUgPSBwYXJzZU1MU3hEYXRlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnRyYW5zZm9ybUxpc3QgPSBleHBvcnRzLnBhcnNlTGluZSA9IGV4cG9ydHMudGVzdExpbmUgPSB2b2lkIDA7XG5jb25zdCBGaWxlSW5mb18xID0gcmVxdWlyZShcIi4vRmlsZUluZm9cIik7XG5jb25zdCBKQV9NT05USCA9IFwiXFx1NjcwOFwiO1xuY29uc3QgSkFfREFZID0gXCJcXHU2NWU1XCI7XG5jb25zdCBKQV9ZRUFSID0gXCJcXHU1ZTc0XCI7XG4vKipcbiAqIFRoaXMgcGFyc2VyIGlzIGJhc2VkIG9uIHRoZSBGVFAgY2xpZW50IGxpYnJhcnkgc291cmNlIGNvZGUgaW4gQXBhY2hlIENvbW1vbnMgTmV0IHByb3ZpZGVkXG4gKiB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlLiBJdCBoYXMgYmVlbiBzaW1wbGlmaWVkIGFuZCByZXdyaXR0ZW4gdG8gYmV0dGVyIGZpdCB0aGUgSmF2YXNjcmlwdCBsYW5ndWFnZS5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvbW1vbnMtbmV0L2Jsb2IvbWFzdGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jb21tb25zL25ldC9mdHAvcGFyc2VyL1VuaXhGVFBFbnRyeVBhcnNlci5qYXZhXG4gKlxuICogQmVsb3cgaXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGJ5IHRoaXMgcGFyc2VyLlxuICpcbiAqIFBlcm1pc3Npb25zOlxuICogICAgciAgIHRoZSBmaWxlIGlzIHJlYWRhYmxlXG4gKiAgICB3ICAgdGhlIGZpbGUgaXMgd3JpdGFibGVcbiAqICAgIHggICB0aGUgZmlsZSBpcyBleGVjdXRhYmxlXG4gKiAgICAtICAgdGhlIGluZGljYXRlZCBwZXJtaXNzaW9uIGlzIG5vdCBncmFudGVkXG4gKiAgICBMICAgbWFuZGF0b3J5IGxvY2tpbmcgb2NjdXJzIGR1cmluZyBhY2Nlc3MgKHRoZSBzZXQtZ3JvdXAtSUQgYml0IGlzXG4gKiAgICAgICAgb24gYW5kIHRoZSBncm91cCBleGVjdXRpb24gYml0IGlzIG9mZilcbiAqICAgIHMgICB0aGUgc2V0LXVzZXItSUQgb3Igc2V0LWdyb3VwLUlEIGJpdCBpcyBvbiwgYW5kIHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICAgICAgdXNlciBvciBncm91cCBleGVjdXRpb24gYml0IGlzIGFsc28gb25cbiAqICAgIFMgICB1bmRlZmluZWQgYml0LXN0YXRlICh0aGUgc2V0LXVzZXItSUQgYml0IGlzIG9uIGFuZCB0aGUgdXNlclxuICogICAgICAgIGV4ZWN1dGlvbiBiaXQgaXMgb2ZmKVxuICogICAgdCAgIHRoZSAxMDAwIChvY3RhbCkgYml0LCBvciBzdGlja3kgYml0LCBpcyBvbiBbc2VlIGNobW9kKDEpXSwgYW5kXG4gKiAgICAgICAgZXhlY3V0aW9uIGlzIG9uXG4gKiAgICBUICAgdGhlIDEwMDAgYml0IGlzIHR1cm5lZCBvbiwgYW5kIGV4ZWN1dGlvbiBpcyBvZmYgKHVuZGVmaW5lZCBiaXQtXG4gKiAgICAgICAgc3RhdGUpXG4gKiAgICBlICAgei9PUyBleHRlcm5hbCBsaW5rIGJpdFxuICogICAgRmluYWwgbGV0dGVyIG1heSBiZSBhcHBlbmRlZDpcbiAqICAgICsgICBmaWxlIGhhcyBleHRlbmRlZCBzZWN1cml0eSBhdHRyaWJ1dGVzIChlLmcuIEFDTClcbiAqICAgIE5vdGU6IGxvY2FsIGxpc3RpbmdzIG9uIE1hY09TWCBhbHNvIHVzZSAnQCdcbiAqICAgIHRoaXMgaXMgbm90IGFsbG93ZWQgZm9yIGhlcmUgYXMgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHNob3duIGJ5IEZUUCBzZXJ2ZXJzXG4gKiAgICB7QGNvZGUgQH0gICBmaWxlIGhhcyBleHRlbmRlZCBhdHRyaWJ1dGVzXG4gKi9cbmNvbnN0IFJFX0xJTkUgPSBuZXcgUmVnRXhwKFwiKFtiY2RlbGZtcFNzLV0pXCIgLy8gZmlsZSB0eXBlXG4gICAgKyBcIigoKHJ8LSkod3wtKShbeHNTdFRMLV0pKSgocnwtKSh3fC0pKFt4c1N0VEwtXSkpKChyfC0pKHd8LSkoW3hzU3RUTC1dPykpKVxcXFwrP1wiIC8vIHBlcm1pc3Npb25zXG4gICAgKyBcIlxcXFxzKlwiIC8vIHNlcGFyYXRvciBUT0RPIHdoeSBhbGxvdyBpdCB0byBiZSBvbWl0dGVkPz9cbiAgICArIFwiKFxcXFxkKylcIiAvLyBsaW5rIGNvdW50XG4gICAgKyBcIlxcXFxzK1wiIC8vIHNlcGFyYXRvclxuICAgICsgXCIoPzooXFxcXFMrKD86XFxcXHNcXFxcUyspKj8pXFxcXHMrKT9cIiAvLyBvd25lciBuYW1lIChvcHRpb25hbCBzcGFjZXMpXG4gICAgKyBcIig/OihcXFxcUysoPzpcXFxcc1xcXFxTKykqKVxcXFxzKyk/XCIgLy8gZ3JvdXAgbmFtZSAob3B0aW9uYWwgc3BhY2VzKVxuICAgICsgXCIoXFxcXGQrKD86LFxcXFxzKlxcXFxkKyk/KVwiIC8vIHNpemUgb3IgbixtXG4gICAgKyBcIlxcXFxzK1wiIC8vIHNlcGFyYXRvclxuICAgIC8qKlxuICAgICAqIG51bWVyaWMgb3Igc3RhbmRhcmQgZm9ybWF0IGRhdGU6XG4gICAgICogICB5eXl5LW1tLWRkIChleHBlY3RpbmcgaGg6bW0gdG8gZm9sbG93KVxuICAgICAqICAgTU1NIFtkXWRcbiAgICAgKiAgIFtkXWQgTU1NXG4gICAgICogICBOLkIuIHVzZSBub24tc3BhY2UgZm9yIE1NTSB0byBhbGxvdyBmb3IgbGFuZ3VhZ2VzIHN1Y2ggYXMgR2VybWFuIHdoaWNoIHVzZVxuICAgICAqICAgZGlhY3JpdGljcyAoZS5nLiB1bWxhdXQpIGluIHNvbWUgYWJicmV2aWF0aW9ucy5cbiAgICAgKiAgIEphcGFuZXNlIHVzZXMgbnVtZXJpYyBkYXkgYW5kIG1vbnRoIHdpdGggc3VmZml4ZXMgdG8gZGlzdGluZ3Vpc2ggdGhlbVxuICAgICAqICAgW2RdZFhYIFtkXWRaWlxuICAgICAqL1xuICAgICsgXCIoXCIgK1xuICAgIFwiKD86XFxcXGQrWy0vXVxcXFxkK1stL11cXFxcZCspXCIgKyAvLyB5eXl5LW1tLWRkXG4gICAgXCJ8KD86XFxcXFN7M31cXFxccytcXFxcZHsxLDJ9KVwiICsgLy8gTU1NIFtkXWRcbiAgICBcInwoPzpcXFxcZHsxLDJ9XFxcXHMrXFxcXFN7M30pXCIgKyAvLyBbZF1kIE1NTVxuICAgIFwifCg/OlxcXFxkezEsMn1cIiArIEpBX01PTlRIICsgXCJcXFxccytcXFxcZHsxLDJ9XCIgKyBKQV9EQVkgKyBcIilcIiArXG4gICAgXCIpXCJcbiAgICArIFwiXFxcXHMrXCIgLy8gc2VwYXJhdG9yXG4gICAgLyoqXG4gICAgICogeWVhciAoZm9yIG5vbi1yZWNlbnQgc3RhbmRhcmQgZm9ybWF0KSAtIHl5eXlcbiAgICAgKiBvciB0aW1lIChmb3IgbnVtZXJpYyBvciByZWNlbnQgc3RhbmRhcmQgZm9ybWF0KSBbaF1oOm1tXG4gICAgICogb3IgSmFwYW5lc2UgeWVhciAtIHl5eXlYWFxuICAgICAqL1xuICAgICsgXCIoKD86XFxcXGQrKD86OlxcXFxkKyk/KXwoPzpcXFxcZHs0fVwiICsgSkFfWUVBUiArIFwiKSlcIiAvLyAoMjApXG4gICAgKyBcIlxcXFxzXCIgLy8gc2VwYXJhdG9yXG4gICAgKyBcIiguKilcIik7IC8vIHRoZSByZXN0ICgyMSlcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGEgZ2l2ZW4gbGluZSBtaWdodCBiZSBhIFVuaXgtc3R5bGUgbGlzdGluZy5cbiAqXG4gKiAtIEV4YW1wbGU6IGAtcnctci0tci0tKyAgIDEgcGF0cmljayAgc3RhZmYgICAxMDU3IERlYyAxMSAxNDozNSB0ZXN0LnR4dGBcbiAqL1xuZnVuY3Rpb24gdGVzdExpbmUobGluZSkge1xuICAgIHJldHVybiBSRV9MSU5FLnRlc3QobGluZSk7XG59XG5leHBvcnRzLnRlc3RMaW5lID0gdGVzdExpbmU7XG4vKipcbiAqIFBhcnNlIGEgc2luZ2xlIGxpbmUgb2YgYSBVbml4LXN0eWxlIGRpcmVjdG9yeSBsaXN0aW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZUxpbmUobGluZSkge1xuICAgIGNvbnN0IGdyb3VwcyA9IGxpbmUubWF0Y2goUkVfTElORSk7XG4gICAgaWYgKGdyb3VwcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gZ3JvdXBzWzIxXTtcbiAgICBpZiAobmFtZSA9PT0gXCIuXCIgfHwgbmFtZSA9PT0gXCIuLlwiKSB7IC8vIElnbm9yZSBwYXJlbnQgZGlyZWN0b3J5IGxpbmtzXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZUluZm9fMS5GaWxlSW5mbyhuYW1lKTtcbiAgICBmaWxlLnNpemUgPSBwYXJzZUludChncm91cHNbMThdLCAxMCk7XG4gICAgZmlsZS51c2VyID0gZ3JvdXBzWzE2XTtcbiAgICBmaWxlLmdyb3VwID0gZ3JvdXBzWzE3XTtcbiAgICBmaWxlLmhhcmRMaW5rQ291bnQgPSBwYXJzZUludChncm91cHNbMTVdLCAxMCk7XG4gICAgZmlsZS5yYXdNb2RpZmllZEF0ID0gZ3JvdXBzWzE5XSArIFwiIFwiICsgZ3JvdXBzWzIwXTtcbiAgICBmaWxlLnBlcm1pc3Npb25zID0ge1xuICAgICAgICB1c2VyOiBwYXJzZU1vZGUoZ3JvdXBzWzRdLCBncm91cHNbNV0sIGdyb3Vwc1s2XSksXG4gICAgICAgIGdyb3VwOiBwYXJzZU1vZGUoZ3JvdXBzWzhdLCBncm91cHNbOV0sIGdyb3Vwc1sxMF0pLFxuICAgICAgICB3b3JsZDogcGFyc2VNb2RlKGdyb3Vwc1sxMl0sIGdyb3Vwc1sxM10sIGdyb3Vwc1sxNF0pLFxuICAgIH07XG4gICAgLy8gU2V0IGZpbGUgdHlwZVxuICAgIHN3aXRjaCAoZ3JvdXBzWzFdLmNoYXJBdCgwKSkge1xuICAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICAgICAgZmlsZS50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5EaXJlY3Rvcnk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImVcIjogLy8gTkVULTM5ID0+IHovT1MgZXh0ZXJuYWwgbGlua1xuICAgICAgICAgICAgZmlsZS50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5TeW1ib2xpY0xpbms7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImxcIjpcbiAgICAgICAgICAgIGZpbGUudHlwZSA9IEZpbGVJbmZvXzEuRmlsZVR5cGUuU3ltYm9saWNMaW5rO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJiXCI6XG4gICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgICBmaWxlLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLkZpbGU7IC8vIFRPRE8gY2hhbmdlIHRoaXMgaWYgREVWSUNFX1RZUEUgaW1wbGVtZW50ZWRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZlwiOlxuICAgICAgICBjYXNlIFwiLVwiOlxuICAgICAgICAgICAgZmlsZS50eXBlID0gRmlsZUluZm9fMS5GaWxlVHlwZS5GaWxlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBBICd3aGl0ZW91dCcgZmlsZSBpcyBhbiBBUlRJRklDSUFMIGVudHJ5IGluIGFueSBvZiBzZXZlcmFsIHR5cGVzIG9mXG4gICAgICAgICAgICAvLyAndHJhbnNsdWNlbnQnIGZpbGVzeXN0ZW1zLCBvZiB3aGljaCBhICd1bmlvbicgZmlsZXN5c3RlbSBpcyBvbmUuXG4gICAgICAgICAgICBmaWxlLnR5cGUgPSBGaWxlSW5mb18xLkZpbGVUeXBlLlVua25vd247XG4gICAgfVxuICAgIC8vIFNlcGFyYXRlIG91dCB0aGUgbGluayBuYW1lIGZvciBzeW1ib2xpYyBsaW5rc1xuICAgIGlmIChmaWxlLmlzU3ltYm9saWNMaW5rKSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IG5hbWUuaW5kZXhPZihcIiAtPiBcIik7XG4gICAgICAgIGlmIChlbmQgIT09IC0xKSB7XG4gICAgICAgICAgICBmaWxlLm5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBlbmQpO1xuICAgICAgICAgICAgZmlsZS5saW5rID0gbmFtZS5zdWJzdHJpbmcoZW5kICsgNCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbGU7XG59XG5leHBvcnRzLnBhcnNlTGluZSA9IHBhcnNlTGluZTtcbmZ1bmN0aW9uIHRyYW5zZm9ybUxpc3QoZmlsZXMpIHtcbiAgICByZXR1cm4gZmlsZXM7XG59XG5leHBvcnRzLnRyYW5zZm9ybUxpc3QgPSB0cmFuc2Zvcm1MaXN0O1xuZnVuY3Rpb24gcGFyc2VNb2RlKHIsIHcsIHgpIHtcbiAgICBsZXQgdmFsdWUgPSAwO1xuICAgIGlmIChyICE9PSBcIi1cIikge1xuICAgICAgICB2YWx1ZSArPSBGaWxlSW5mb18xLkZpbGVJbmZvLlVuaXhQZXJtaXNzaW9uLlJlYWQ7XG4gICAgfVxuICAgIGlmICh3ICE9PSBcIi1cIikge1xuICAgICAgICB2YWx1ZSArPSBGaWxlSW5mb18xLkZpbGVJbmZvLlVuaXhQZXJtaXNzaW9uLldyaXRlO1xuICAgIH1cbiAgICBjb25zdCBleGVjVG9rZW4gPSB4LmNoYXJBdCgwKTtcbiAgICBpZiAoZXhlY1Rva2VuICE9PSBcIi1cIiAmJiBleGVjVG9rZW4udG9VcHBlckNhc2UoKSAhPT0gZXhlY1Rva2VuKSB7XG4gICAgICAgIHZhbHVlICs9IEZpbGVJbmZvXzEuRmlsZUluZm8uVW5peFBlcm1pc3Npb24uRXhlY3V0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRvd25sb2FkVG8gPSBleHBvcnRzLnVwbG9hZEZyb20gPSBleHBvcnRzLmNvbm5lY3RGb3JQYXNzaXZlVHJhbnNmZXIgPSBleHBvcnRzLnBhcnNlUGFzdlJlc3BvbnNlID0gZXhwb3J0cy5lbnRlclBhc3NpdmVNb2RlSVB2NCA9IGV4cG9ydHMucGFyc2VFcHN2UmVzcG9uc2UgPSBleHBvcnRzLmVudGVyUGFzc2l2ZU1vZGVJUHY2ID0gdm9pZCAwO1xuY29uc3QgbmV0VXRpbHNfMSA9IHJlcXVpcmUoXCIuL25ldFV0aWxzXCIpO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY29uc3QgdGxzXzEgPSByZXF1aXJlKFwidGxzXCIpO1xuY29uc3QgcGFyc2VDb250cm9sUmVzcG9uc2VfMSA9IHJlcXVpcmUoXCIuL3BhcnNlQ29udHJvbFJlc3BvbnNlXCIpO1xuLyoqXG4gKiBQcmVwYXJlIGEgZGF0YSBzb2NrZXQgdXNpbmcgcGFzc2l2ZSBtb2RlIG92ZXIgSVB2Ni5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW50ZXJQYXNzaXZlTW9kZUlQdjYoZnRwKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZnRwLnJlcXVlc3QoXCJFUFNWXCIpO1xuICAgIGNvbnN0IHBvcnQgPSBwYXJzZUVwc3ZSZXNwb25zZShyZXMubWVzc2FnZSk7XG4gICAgaWYgKCFwb3J0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHBhcnNlIEVQU1YgcmVzcG9uc2U6IFwiICsgcmVzLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBjb25zdCBjb250cm9sSG9zdCA9IGZ0cC5zb2NrZXQucmVtb3RlQWRkcmVzcztcbiAgICBpZiAoY29udHJvbEhvc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250cm9sIHNvY2tldCBpcyBkaXNjb25uZWN0ZWQsIGNhbid0IGdldCByZW1vdGUgYWRkcmVzcy5cIik7XG4gICAgfVxuICAgIGF3YWl0IGNvbm5lY3RGb3JQYXNzaXZlVHJhbnNmZXIoY29udHJvbEhvc3QsIHBvcnQsIGZ0cCk7XG4gICAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuZW50ZXJQYXNzaXZlTW9kZUlQdjYgPSBlbnRlclBhc3NpdmVNb2RlSVB2Njtcbi8qKlxuICogUGFyc2UgYW4gRVBTViByZXNwb25zZS4gUmV0dXJucyBvbmx5IHRoZSBwb3J0IGFzIGluIEVQU1YgdGhlIGhvc3Qgb2YgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBpcyB1c2VkLlxuICovXG5mdW5jdGlvbiBwYXJzZUVwc3ZSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgLy8gR2V0IHBvcnQgZnJvbSBFUFNWIHJlc3BvbnNlLCBlLmcuIFwiMjI5IEVudGVyaW5nIEV4dGVuZGVkIFBhc3NpdmUgTW9kZSAofHx8NjQ0NnwpXCJcbiAgICAvLyBTb21lIEZUUCBTZXJ2ZXJzIHN1Y2ggYXMgdGhlIG9uZSBvbiBJQk0gaSAoT1MvNDAwKSB1c2UgISBpbnN0ZWFkIG9mIHwgaW4gdGhlaXIgRVBTViByZXNwb25zZS5cbiAgICBjb25zdCBncm91cHMgPSBtZXNzYWdlLm1hdGNoKC9bfCFdezN9KC4rKVt8IV0vKTtcbiAgICBpZiAoZ3JvdXBzID09PSBudWxsIHx8IGdyb3Vwc1sxXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgcGFyc2UgcmVzcG9uc2UgdG8gJ0VQU1YnOiAke21lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludChncm91cHNbMV0sIDEwKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHBvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgcGFyc2UgcmVzcG9uc2UgdG8gJ0VQU1YnLCBwb3J0IGlzIG5vdCBhIG51bWJlcjogJHttZXNzYWdlfWApO1xuICAgIH1cbiAgICByZXR1cm4gcG9ydDtcbn1cbmV4cG9ydHMucGFyc2VFcHN2UmVzcG9uc2UgPSBwYXJzZUVwc3ZSZXNwb25zZTtcbi8qKlxuICogUHJlcGFyZSBhIGRhdGEgc29ja2V0IHVzaW5nIHBhc3NpdmUgbW9kZSBvdmVyIElQdjQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVudGVyUGFzc2l2ZU1vZGVJUHY0KGZ0cCkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZ0cC5yZXF1ZXN0KFwiUEFTVlwiKTtcbiAgICBjb25zdCB0YXJnZXQgPSBwYXJzZVBhc3ZSZXNwb25zZShyZXMubWVzc2FnZSk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgcGFyc2UgUEFTViByZXNwb25zZTogXCIgKyByZXMubWVzc2FnZSk7XG4gICAgfVxuICAgIC8vIElmIHRoZSBob3N0IGluIHRoZSBQQVNWIHJlc3BvbnNlIGhhcyBhIGxvY2FsIGFkZHJlc3Mgd2hpbGUgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBoYXNuJ3QsXG4gICAgLy8gd2UgYXNzdW1lIGEgTkFUIGlzc3VlIGFuZCB1c2UgdGhlIElQIG9mIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gYXMgdGhlIHRhcmdldCBmb3IgdGhlIGRhdGEgY29ubmVjdGlvbi5cbiAgICAvLyBXZSBjYW4ndCBhbHdheXMgcGVyZm9ybSB0aGlzIHJlcGxhY2VtZW50IGJlY2F1c2UgaXQncyBwb3NzaWJsZSAoYWx0aG91Z2ggdW5saWtlbHkpIHRoYXQgdGhlIEZUUCBzZXJ2ZXJcbiAgICAvLyBpbmRlZWQgdXNlcyBhIGRpZmZlcmVudCBob3N0IGZvciBkYXRhIGNvbm5lY3Rpb25zLlxuICAgIGNvbnN0IGNvbnRyb2xIb3N0ID0gZnRwLnNvY2tldC5yZW1vdGVBZGRyZXNzO1xuICAgIGlmICgoMCwgbmV0VXRpbHNfMS5pcElzUHJpdmF0ZVY0QWRkcmVzcykodGFyZ2V0Lmhvc3QpICYmIGNvbnRyb2xIb3N0ICYmICEoMCwgbmV0VXRpbHNfMS5pcElzUHJpdmF0ZVY0QWRkcmVzcykoY29udHJvbEhvc3QpKSB7XG4gICAgICAgIHRhcmdldC5ob3N0ID0gY29udHJvbEhvc3Q7XG4gICAgfVxuICAgIGF3YWl0IGNvbm5lY3RGb3JQYXNzaXZlVHJhbnNmZXIodGFyZ2V0Lmhvc3QsIHRhcmdldC5wb3J0LCBmdHApO1xuICAgIHJldHVybiByZXM7XG59XG5leHBvcnRzLmVudGVyUGFzc2l2ZU1vZGVJUHY0ID0gZW50ZXJQYXNzaXZlTW9kZUlQdjQ7XG4vKipcbiAqIFBhcnNlIGEgUEFTViByZXNwb25zZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VQYXN2UmVzcG9uc2UobWVzc2FnZSkge1xuICAgIC8vIEdldCBob3N0IGFuZCBwb3J0IGZyb20gUEFTViByZXNwb25zZSwgZS5nLiBcIjIyNyBFbnRlcmluZyBQYXNzaXZlIE1vZGUgKDE5MiwxNjgsMSwxMDAsMTAsMjI5KVwiXG4gICAgY29uc3QgZ3JvdXBzID0gbWVzc2FnZS5tYXRjaCgvKFstXFxkXSssWy1cXGRdKyxbLVxcZF0rLFstXFxkXSspLChbLVxcZF0rKSwoWy1cXGRdKykvKTtcbiAgICBpZiAoZ3JvdXBzID09PSBudWxsIHx8IGdyb3Vwcy5sZW5ndGggIT09IDQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBwYXJzZSByZXNwb25zZSB0byAnUEFTVic6ICR7bWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaG9zdDogZ3JvdXBzWzFdLnJlcGxhY2UoLywvZywgXCIuXCIpLFxuICAgICAgICBwb3J0OiAocGFyc2VJbnQoZ3JvdXBzWzJdLCAxMCkgJiAyNTUpICogMjU2ICsgKHBhcnNlSW50KGdyb3Vwc1szXSwgMTApICYgMjU1KVxuICAgIH07XG59XG5leHBvcnRzLnBhcnNlUGFzdlJlc3BvbnNlID0gcGFyc2VQYXN2UmVzcG9uc2U7XG5mdW5jdGlvbiBjb25uZWN0Rm9yUGFzc2l2ZVRyYW5zZmVyKGhvc3QsIHBvcnQsIGZ0cCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBzb2NrZXQgPSBmdHAuX25ld1NvY2tldCgpO1xuICAgICAgICBjb25zdCBoYW5kbGVDb25uRXJyID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSBcIkNhbid0IG9wZW4gZGF0YSBjb25uZWN0aW9uIGluIHBhc3NpdmUgbW9kZTogXCIgKyBlcnIubWVzc2FnZTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBoYW5kbGVUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRpbWVvdXQgd2hlbiB0cnlpbmcgdG8gb3BlbiBkYXRhIGNvbm5lY3Rpb24gdG8gJHtob3N0fToke3BvcnR9YCkpO1xuICAgICAgICB9O1xuICAgICAgICBzb2NrZXQuc2V0VGltZW91dChmdHAudGltZW91dCk7XG4gICAgICAgIHNvY2tldC5vbihcImVycm9yXCIsIGhhbmRsZUNvbm5FcnIpO1xuICAgICAgICBzb2NrZXQub24oXCJ0aW1lb3V0XCIsIGhhbmRsZVRpbWVvdXQpO1xuICAgICAgICBzb2NrZXQuY29ubmVjdCh7IHBvcnQsIGhvc3QsIGZhbWlseTogZnRwLmlwRmFtaWx5IH0sICgpID0+IHtcbiAgICAgICAgICAgIGlmIChmdHAuc29ja2V0IGluc3RhbmNlb2YgdGxzXzEuVExTU29ja2V0KSB7XG4gICAgICAgICAgICAgICAgc29ja2V0ID0gKDAsIHRsc18xLmNvbm5lY3QpKE9iamVjdC5hc3NpZ24oe30sIGZ0cC50bHNPcHRpb25zLCB7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldCxcbiAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2UgdGhlIFRMUyBzZXNzaW9uIG5lZ290aWF0ZWQgZWFybGllciB3aGVuIHRoZSBjb250cm9sIGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gd2FzIHVwZ3JhZGVkLiBTZXJ2ZXJzIGV4cGVjdCB0aGlzIGJlY2F1c2UgaXQgcHJvdmlkZXMgYWRkaXRpb25hbFxuICAgICAgICAgICAgICAgICAgICAvLyBzZWN1cml0eTogSWYgYSBjb21wbGV0ZWx5IG5ldyBzZXNzaW9uIHdvdWxkIGJlIG5lZ290aWF0ZWQsIGEgaGFja2VyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvdWxkIGd1ZXNzIHRoZSBwb3J0IGFuZCBjb25uZWN0IHRvIHRoZSBuZXcgZGF0YSBjb25uZWN0aW9uIGJlZm9yZSB3ZSBkb1xuICAgICAgICAgICAgICAgICAgICAvLyBieSBqdXN0IHN0YXJ0aW5nIGhpcy9oZXIgb3duIFRMUyBzZXNzaW9uLlxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uOiBmdHAuc29ja2V0LmdldFNlc3Npb24oKVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAvLyBJdCdzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdHJhbnNmZXIgdGFzayB0byB3YWl0IHVudGlsIHRoZVxuICAgICAgICAgICAgICAgIC8vIFRMUyBzb2NrZXQgaXNzdWVkIHRoZSBldmVudCAnc2VjdXJlQ29ubmVjdCcuIFdlIGNhbid0IGRvIHRoaXNcbiAgICAgICAgICAgICAgICAvLyBoZXJlIGJlY2F1c2Ugc29tZSBzZXJ2ZXJzIHdpbGwgc3RhcnQgdXBncmFkaW5nIGFmdGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vIHNwZWNpZmljIHRyYW5zZmVyIHJlcXVlc3QgaGFzIGJlZW4gbWFkZS4gTGlzdCBhbmQgZG93bmxvYWQgZG9uJ3RcbiAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIHdhaXQgZm9yIHRoaXMgZXZlbnQgYmVjYXVzZSB0aGUgc2VydmVyIHNlbmRzIHdoZW5ldmVyIGl0XG4gICAgICAgICAgICAgICAgLy8gaXMgcmVhZHkuIEJ1dCBmb3IgdXBsb2FkIHRoaXMgaGFzIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCxcbiAgICAgICAgICAgICAgICAvLyBzZWUgdGhlIGRldGFpbHMgaW4gdGhlIHVwbG9hZCgpIGZ1bmN0aW9uIGJlbG93LlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTGV0IHRoZSBGVFBDb250ZXh0IGxpc3RlbiB0byBlcnJvcnMgZnJvbSBub3cgb24sIHJlbW92ZSBsb2NhbCBoYW5kbGVyLlxuICAgICAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgaGFuZGxlQ29ubkVycik7XG4gICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoXCJ0aW1lb3V0XCIsIGhhbmRsZVRpbWVvdXQpO1xuICAgICAgICAgICAgZnRwLmRhdGFTb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jb25uZWN0Rm9yUGFzc2l2ZVRyYW5zZmVyID0gY29ubmVjdEZvclBhc3NpdmVUcmFuc2Zlcjtcbi8qKlxuICogSGVscHMgcmVzb2x2aW5nL3JlamVjdGluZyB0cmFuc2ZlcnMuXG4gKlxuICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkgZm9yIGFsbCBGVFAgdHJhbnNmZXJzLiBGb3IgZXhhbXBsZSB3aGVuIGRvd25sb2FkaW5nLCB0aGUgc2VydmVyIG1pZ2h0IGNvbmZpcm1cbiAqIHdpdGggXCIyMjYgVHJhbnNmZXIgY29tcGxldGVcIiB3aGVuIGluIGZhY3QgdGhlIGRvd25sb2FkIG9uIHRoZSBkYXRhIGNvbm5lY3Rpb24gaGFzIG5vdCBmaW5pc2hlZFxuICogeWV0LiBXaXRoIGFsbCB0cmFuc2ZlcnMgd2UgbWFrZSBzdXJlIHRoYXQgYSkgdGhlIHJlc3VsdCBhcnJpdmVkIGFuZCBiKSBoYXMgYmVlbiBjb25maXJtZWQgYnlcbiAqIGUuZy4gdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4gV2UganVzdCBkb24ndCBrbm93IGluIHdoaWNoIG9yZGVyIHRoaXMgd2lsbCBoYXBwZW4uXG4gKi9cbmNsYXNzIFRyYW5zZmVyUmVzb2x2ZXIge1xuICAgIC8qKlxuICAgICAqIEluc3RhbnRpYXRlIGEgVHJhbnNmZXJSZXNvbHZlclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGZ0cCwgcHJvZ3Jlc3MpIHtcbiAgICAgICAgdGhpcy5mdHAgPSBmdHA7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBwcm9ncmVzcztcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5kYXRhVHJhbnNmZXJEb25lID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1hcmsgdGhlIGJlZ2lubmluZyBvZiBhIHRyYW5zZmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgLSBOYW1lIG9mIHRoZSB0cmFuc2ZlciwgdXN1YWxseSB0aGUgZmlsZW5hbWUuXG4gICAgICogQHBhcmFtIHR5cGUgLSBUeXBlIG9mIHRyYW5zZmVyLCB1c3VhbGx5IFwidXBsb2FkXCIgb3IgXCJkb3dubG9hZFwiLlxuICAgICAqL1xuICAgIG9uRGF0YVN0YXJ0KG5hbWUsIHR5cGUpIHtcbiAgICAgICAgLy8gTGV0IHRoZSBkYXRhIHNvY2tldCBiZSBpbiBjaGFyZ2Ugb2YgdHJhY2tpbmcgdGltZW91dHMgZHVyaW5nIHRyYW5zZmVyLlxuICAgICAgICAvLyBUaGUgY29udHJvbCBzb2NrZXQgc2l0cyBpZGxlIGR1cmluZyB0aGlzIHRpbWUgYW55d2F5IGFuZCBtaWdodCBwcm92b2tlXG4gICAgICAgIC8vIGEgdGltZW91dCB1bm5lY2Vzc2FyaWx5LiBUaGUgY29udHJvbCBjb25uZWN0aW9uIHdpbGwgdGFrZSBjYXJlXG4gICAgICAgIC8vIG9mIHRpbWVvdXRzIGFnYWluIG9uY2UgZGF0YSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBvciBmYWlsZWQuXG4gICAgICAgIGlmICh0aGlzLmZ0cC5kYXRhU29ja2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRhdGEgdHJhbnNmZXIgc2hvdWxkIHN0YXJ0IGJ1dCB0aGVyZSBpcyBubyBkYXRhIGNvbm5lY3Rpb24uXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZnRwLnNvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgICAgICB0aGlzLmZ0cC5kYXRhU29ja2V0LnNldFRpbWVvdXQodGhpcy5mdHAudGltZW91dCk7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3Muc3RhcnQodGhpcy5mdHAuZGF0YVNvY2tldCwgbmFtZSwgdHlwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkYXRhIGNvbm5lY3Rpb24gaGFzIGZpbmlzaGVkIHRoZSB0cmFuc2Zlci5cbiAgICAgKi9cbiAgICBvbkRhdGFEb25lKHRhc2spIHtcbiAgICAgICAgdGhpcy5wcm9ncmVzcy51cGRhdGVBbmRTdG9wKCk7XG4gICAgICAgIC8vIEhhbmQtb3ZlciB0aW1lb3V0IHRyYWNraW5nIGJhY2sgdG8gdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4gSXQncyBwb3NzaWJsZSB0aGF0XG4gICAgICAgIC8vIHdlIGRvbid0IHJlY2VpdmUgdGhlIHJlc3BvbnNlIG92ZXIgdGhlIGNvbnRyb2wgY29ubmVjdGlvbiB0aGF0IHRoZSB0cmFuc2ZlciBpc1xuICAgICAgICAvLyBkb25lLiBJbiB0aGlzIGNhc2UsIHdlIHdhbnQgdG8gY29ycmVjdGx5IGFzc29jaWF0ZSB0aGUgcmVzdWx0aW5nIHRpbWVvdXQgd2l0aFxuICAgICAgICAvLyB0aGUgY29udHJvbCBjb25uZWN0aW9uLlxuICAgICAgICB0aGlzLmZ0cC5zb2NrZXQuc2V0VGltZW91dCh0aGlzLmZ0cC50aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuZnRwLmRhdGFTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuZnRwLmRhdGFTb2NrZXQuc2V0VGltZW91dCgwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFUcmFuc2ZlckRvbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyeVJlc29sdmUodGFzayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb250cm9sIGNvbm5lY3Rpb24gcmVwb3J0cyB0aGUgdHJhbnNmZXIgYXMgZmluaXNoZWQuXG4gICAgICovXG4gICAgb25Db250cm9sRG9uZSh0YXNrLCByZXNwb25zZSkge1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMudHJ5UmVzb2x2ZSh0YXNrKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgYW5kIHRoZSB0YXNrIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKi9cbiAgICBvbkVycm9yKHRhc2ssIGVycikge1xuICAgICAgICB0aGlzLnByb2dyZXNzLnVwZGF0ZUFuZFN0b3AoKTtcbiAgICAgICAgdGhpcy5mdHAuc29ja2V0LnNldFRpbWVvdXQodGhpcy5mdHAudGltZW91dCk7XG4gICAgICAgIHRoaXMuZnRwLmRhdGFTb2NrZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRhc2sucmVqZWN0KGVycik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnRyb2wgY29ubmVjdGlvbiBzZW50IGFuIHVuZXhwZWN0ZWQgcmVxdWVzdCByZXF1aXJpbmcgYSByZXNwb25zZSBmcm9tIG91ciBwYXJ0LiBXZVxuICAgICAqIGNhbid0IHByb3ZpZGUgdGhhdCAoYmVjYXVzZSB1bmtub3duKSBhbmQgaGF2ZSB0byBjbG9zZSB0aGUgY29udHJleHQgd2l0aCBhbiBlcnJvciBiZWNhdXNlXG4gICAgICogdGhlIEZUUCBzZXJ2ZXIgaXMgbm93IGNhdWdodCB1cCBpbiBhIHN0YXRlIHdlIGNhbid0IHJlc29sdmUuXG4gICAgICovXG4gICAgb25VbmV4cGVjdGVkUmVxdWVzdChyZXNwb25zZSkge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgRlRQIHJlc3BvbnNlIGlzIHJlcXVlc3RpbmcgYW4gYW5zd2VyOiAke3Jlc3BvbnNlLm1lc3NhZ2V9YCk7XG4gICAgICAgIHRoaXMuZnRwLmNsb3NlV2l0aEVycm9yKGVycik7XG4gICAgfVxuICAgIHRyeVJlc29sdmUodGFzaykge1xuICAgICAgICAvLyBUbyByZXNvbHZlLCB3ZSBuZWVkIGJvdGggY29udHJvbCBhbmQgZGF0YSBjb25uZWN0aW9uIHRvIHJlcG9ydCB0aGF0IHRoZSB0cmFuc2ZlciBpcyBkb25lLlxuICAgICAgICBjb25zdCBjYW5SZXNvbHZlID0gdGhpcy5kYXRhVHJhbnNmZXJEb25lICYmIHRoaXMucmVzcG9uc2UgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGNhblJlc29sdmUpIHtcbiAgICAgICAgICAgIHRoaXMuZnRwLmRhdGFTb2NrZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0YXNrLnJlc29sdmUodGhpcy5yZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiB1cGxvYWRGcm9tKHNvdXJjZSwgY29uZmlnKSB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSBuZXcgVHJhbnNmZXJSZXNvbHZlcihjb25maWcuZnRwLCBjb25maWcudHJhY2tlcik7XG4gICAgY29uc3QgZnVsbENvbW1hbmQgPSBgJHtjb25maWcuY29tbWFuZH0gJHtjb25maWcucmVtb3RlUGF0aH1gO1xuICAgIHJldHVybiBjb25maWcuZnRwLmhhbmRsZShmdWxsQ29tbWFuZCwgKHJlcywgdGFzaykgPT4ge1xuICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJlc29sdmVyLm9uRXJyb3IodGFzaywgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZXMuY29kZSA9PT0gMTUwIHx8IHJlcy5jb2RlID09PSAxMjUpIHsgLy8gUmVhZHkgdG8gdXBsb2FkXG4gICAgICAgICAgICBjb25zdCBkYXRhU29ja2V0ID0gY29uZmlnLmZ0cC5kYXRhU29ja2V0O1xuICAgICAgICAgICAgaWYgKCFkYXRhU29ja2V0KSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZXIub25FcnJvcih0YXNrLCBuZXcgRXJyb3IoXCJVcGxvYWQgc2hvdWxkIGJlZ2luIGJ1dCBubyBkYXRhIGNvbm5lY3Rpb24gaXMgYXZhaWxhYmxlLlwiKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIFRMUywgd2UgaGF2ZSB0byB3YWl0IHVudGlsIHRoZSBkYXRhU29ja2V0IGlzc3VlZFxuICAgICAgICAgICAgLy8gJ3NlY3VyZUNvbm5lY3QnLiBJZiB0aGlzIGhhc24ndCBoYXBwZW5lZCB5ZXQsIGdldENpcGhlcigpIHJldHVybnMgdW5kZWZpbmVkLlxuICAgICAgICAgICAgY29uc3QgY2FuVXBsb2FkID0gXCJnZXRDaXBoZXJcIiBpbiBkYXRhU29ja2V0ID8gZGF0YVNvY2tldC5nZXRDaXBoZXIoKSAhPT0gdW5kZWZpbmVkIDogdHJ1ZTtcbiAgICAgICAgICAgIG9uQ29uZGl0aW9uT3JFdmVudChjYW5VcGxvYWQsIGRhdGFTb2NrZXQsIFwic2VjdXJlQ29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmZ0cC5sb2coYFVwbG9hZGluZyB0byAkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlQWRkcmVzcykoZGF0YVNvY2tldCl9ICgkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlVExTKShkYXRhU29ja2V0KX0pYCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZXIub25EYXRhU3RhcnQoY29uZmlnLnJlbW90ZVBhdGgsIGNvbmZpZy50eXBlKTtcbiAgICAgICAgICAgICAgICAoMCwgc3RyZWFtXzEucGlwZWxpbmUpKHNvdXJjZSwgZGF0YVNvY2tldCwgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIub25FcnJvcih0YXNrLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIub25EYXRhRG9uZSh0YXNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKDAsIHBhcnNlQ29udHJvbFJlc3BvbnNlXzEucG9zaXRpdmVDb21wbGV0aW9uKShyZXMuY29kZSkpIHsgLy8gVHJhbnNmZXIgY29tcGxldGVcbiAgICAgICAgICAgIHJlc29sdmVyLm9uQ29udHJvbERvbmUodGFzaywgcmVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoMCwgcGFyc2VDb250cm9sUmVzcG9uc2VfMS5wb3NpdGl2ZUludGVybWVkaWF0ZSkocmVzLmNvZGUpKSB7XG4gICAgICAgICAgICByZXNvbHZlci5vblVuZXhwZWN0ZWRSZXF1ZXN0KHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWdub3JlIGFsbCBvdGhlciBwb3NpdGl2ZSBwcmVsaW1pbmFyeSByZXNwb25zZSBjb2RlcyAoPCAyMDApXG4gICAgfSk7XG59XG5leHBvcnRzLnVwbG9hZEZyb20gPSB1cGxvYWRGcm9tO1xuZnVuY3Rpb24gZG93bmxvYWRUbyhkZXN0aW5hdGlvbiwgY29uZmlnKSB7XG4gICAgaWYgKCFjb25maWcuZnRwLmRhdGFTb2NrZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRG93bmxvYWQgd2lsbCBiZSBpbml0aWF0ZWQgYnV0IG5vIGRhdGEgY29ubmVjdGlvbiBpcyBhdmFpbGFibGUuXCIpO1xuICAgIH1cbiAgICBjb25zdCByZXNvbHZlciA9IG5ldyBUcmFuc2ZlclJlc29sdmVyKGNvbmZpZy5mdHAsIGNvbmZpZy50cmFja2VyKTtcbiAgICByZXR1cm4gY29uZmlnLmZ0cC5oYW5kbGUoY29uZmlnLmNvbW1hbmQsIChyZXMsIHRhc2spID0+IHtcbiAgICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXNvbHZlci5vbkVycm9yKHRhc2ssIHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVzLmNvZGUgPT09IDE1MCB8fCByZXMuY29kZSA9PT0gMTI1KSB7IC8vIFJlYWR5IHRvIGRvd25sb2FkXG4gICAgICAgICAgICBjb25zdCBkYXRhU29ja2V0ID0gY29uZmlnLmZ0cC5kYXRhU29ja2V0O1xuICAgICAgICAgICAgaWYgKCFkYXRhU29ja2V0KSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZXIub25FcnJvcih0YXNrLCBuZXcgRXJyb3IoXCJEb3dubG9hZCBzaG91bGQgYmVnaW4gYnV0IG5vIGRhdGEgY29ubmVjdGlvbiBpcyBhdmFpbGFibGUuXCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25maWcuZnRwLmxvZyhgRG93bmxvYWRpbmcgZnJvbSAkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlQWRkcmVzcykoZGF0YVNvY2tldCl9ICgkeygwLCBuZXRVdGlsc18xLmRlc2NyaWJlVExTKShkYXRhU29ja2V0KX0pYCk7XG4gICAgICAgICAgICByZXNvbHZlci5vbkRhdGFTdGFydChjb25maWcucmVtb3RlUGF0aCwgY29uZmlnLnR5cGUpO1xuICAgICAgICAgICAgKDAsIHN0cmVhbV8xLnBpcGVsaW5lKShkYXRhU29ja2V0LCBkZXN0aW5hdGlvbiwgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLm9uRXJyb3IodGFzaywgZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLm9uRGF0YURvbmUodGFzayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocmVzLmNvZGUgPT09IDM1MCkgeyAvLyBSZXN0YXJ0aW5nIGF0IHN0YXJ0QXQuXG4gICAgICAgICAgICBjb25maWcuZnRwLnNlbmQoXCJSRVRSIFwiICsgY29uZmlnLnJlbW90ZVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCgwLCBwYXJzZUNvbnRyb2xSZXNwb25zZV8xLnBvc2l0aXZlQ29tcGxldGlvbikocmVzLmNvZGUpKSB7IC8vIFRyYW5zZmVyIGNvbXBsZXRlXG4gICAgICAgICAgICByZXNvbHZlci5vbkNvbnRyb2xEb25lKHRhc2ssIHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKDAsIHBhcnNlQ29udHJvbFJlc3BvbnNlXzEucG9zaXRpdmVJbnRlcm1lZGlhdGUpKHJlcy5jb2RlKSkge1xuICAgICAgICAgICAgcmVzb2x2ZXIub25VbmV4cGVjdGVkUmVxdWVzdChyZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElnbm9yZSBhbGwgb3RoZXIgcG9zaXRpdmUgcHJlbGltaW5hcnkgcmVzcG9uc2UgY29kZXMgKDwgMjAwKVxuICAgIH0pO1xufVxuZXhwb3J0cy5kb3dubG9hZFRvID0gZG93bmxvYWRUbztcbi8qKlxuICogQ2FsbHMgYSBmdW5jdGlvbiBpbW1lZGlhdGVseSBpZiBhIGNvbmRpdGlvbiBpcyBtZXQgb3Igc3Vic2NyaWJlcyB0byBhbiBldmVudCBhbmQgY2FsbHNcbiAqIGl0IG9uY2UgdGhlIGV2ZW50IGlzIGVtaXR0ZWQuXG4gKlxuICogQHBhcmFtIGNvbmRpdGlvbiAgVGhlIGNvbmRpdGlvbiB0byB0ZXN0LlxuICogQHBhcmFtIGVtaXR0ZXIgIFRoZSBlbWl0dGVyIHRvIHVzZSBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBAcGFyYW0gZXZlbnROYW1lICBUaGUgZXZlbnQgdG8gc3Vic2NyaWJlIHRvIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIEBwYXJhbSBhY3Rpb24gIFRoZSBmdW5jdGlvbiB0byBjYWxsLlxuICovXG5mdW5jdGlvbiBvbkNvbmRpdGlvbk9yRXZlbnQoY29uZGl0aW9uLCBlbWl0dGVyLCBldmVudE5hbWUsIGFjdGlvbikge1xuICAgIGlmIChjb25kaXRpb24gPT09IHRydWUpIHtcbiAgICAgICAgYWN0aW9uKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBlbWl0dGVyLm9uY2UoZXZlbnROYW1lLCAoKSA9PiBhY3Rpb24oKSk7XG4gICAgfVxufVxuIiwidmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxudmFyIENSQ19UQUJMRSA9IFtcbiAgMHgwMDAwMDAwMCwgMHg3NzA3MzA5NiwgMHhlZTBlNjEyYywgMHg5OTA5NTFiYSwgMHgwNzZkYzQxOSxcbiAgMHg3MDZhZjQ4ZiwgMHhlOTYzYTUzNSwgMHg5ZTY0OTVhMywgMHgwZWRiODgzMiwgMHg3OWRjYjhhNCxcbiAgMHhlMGQ1ZTkxZSwgMHg5N2QyZDk4OCwgMHgwOWI2NGMyYiwgMHg3ZWIxN2NiZCwgMHhlN2I4MmQwNyxcbiAgMHg5MGJmMWQ5MSwgMHgxZGI3MTA2NCwgMHg2YWIwMjBmMiwgMHhmM2I5NzE0OCwgMHg4NGJlNDFkZSxcbiAgMHgxYWRhZDQ3ZCwgMHg2ZGRkZTRlYiwgMHhmNGQ0YjU1MSwgMHg4M2QzODVjNywgMHgxMzZjOTg1NixcbiAgMHg2NDZiYThjMCwgMHhmZDYyZjk3YSwgMHg4YTY1YzllYywgMHgxNDAxNWM0ZiwgMHg2MzA2NmNkOSxcbiAgMHhmYTBmM2Q2MywgMHg4ZDA4MGRmNSwgMHgzYjZlMjBjOCwgMHg0YzY5MTA1ZSwgMHhkNTYwNDFlNCxcbiAgMHhhMjY3NzE3MiwgMHgzYzAzZTRkMSwgMHg0YjA0ZDQ0NywgMHhkMjBkODVmZCwgMHhhNTBhYjU2YixcbiAgMHgzNWI1YThmYSwgMHg0MmIyOTg2YywgMHhkYmJiYzlkNiwgMHhhY2JjZjk0MCwgMHgzMmQ4NmNlMyxcbiAgMHg0NWRmNWM3NSwgMHhkY2Q2MGRjZiwgMHhhYmQxM2Q1OSwgMHgyNmQ5MzBhYywgMHg1MWRlMDAzYSxcbiAgMHhjOGQ3NTE4MCwgMHhiZmQwNjExNiwgMHgyMWI0ZjRiNSwgMHg1NmIzYzQyMywgMHhjZmJhOTU5OSxcbiAgMHhiOGJkYTUwZiwgMHgyODAyYjg5ZSwgMHg1ZjA1ODgwOCwgMHhjNjBjZDliMiwgMHhiMTBiZTkyNCxcbiAgMHgyZjZmN2M4NywgMHg1ODY4NGMxMSwgMHhjMTYxMWRhYiwgMHhiNjY2MmQzZCwgMHg3NmRjNDE5MCxcbiAgMHgwMWRiNzEwNiwgMHg5OGQyMjBiYywgMHhlZmQ1MTAyYSwgMHg3MWIxODU4OSwgMHgwNmI2YjUxZixcbiAgMHg5ZmJmZTRhNSwgMHhlOGI4ZDQzMywgMHg3ODA3YzlhMiwgMHgwZjAwZjkzNCwgMHg5NjA5YTg4ZSxcbiAgMHhlMTBlOTgxOCwgMHg3ZjZhMGRiYiwgMHgwODZkM2QyZCwgMHg5MTY0NmM5NywgMHhlNjYzNWMwMSxcbiAgMHg2YjZiNTFmNCwgMHgxYzZjNjE2MiwgMHg4NTY1MzBkOCwgMHhmMjYyMDA0ZSwgMHg2YzA2OTVlZCxcbiAgMHgxYjAxYTU3YiwgMHg4MjA4ZjRjMSwgMHhmNTBmYzQ1NywgMHg2NWIwZDljNiwgMHgxMmI3ZTk1MCxcbiAgMHg4YmJlYjhlYSwgMHhmY2I5ODg3YywgMHg2MmRkMWRkZiwgMHgxNWRhMmQ0OSwgMHg4Y2QzN2NmMyxcbiAgMHhmYmQ0NGM2NSwgMHg0ZGIyNjE1OCwgMHgzYWI1NTFjZSwgMHhhM2JjMDA3NCwgMHhkNGJiMzBlMixcbiAgMHg0YWRmYTU0MSwgMHgzZGQ4OTVkNywgMHhhNGQxYzQ2ZCwgMHhkM2Q2ZjRmYiwgMHg0MzY5ZTk2YSxcbiAgMHgzNDZlZDlmYywgMHhhZDY3ODg0NiwgMHhkYTYwYjhkMCwgMHg0NDA0MmQ3MywgMHgzMzAzMWRlNSxcbiAgMHhhYTBhNGM1ZiwgMHhkZDBkN2NjOSwgMHg1MDA1NzEzYywgMHgyNzAyNDFhYSwgMHhiZTBiMTAxMCxcbiAgMHhjOTBjMjA4NiwgMHg1NzY4YjUyNSwgMHgyMDZmODViMywgMHhiOTY2ZDQwOSwgMHhjZTYxZTQ5ZixcbiAgMHg1ZWRlZjkwZSwgMHgyOWQ5Yzk5OCwgMHhiMGQwOTgyMiwgMHhjN2Q3YThiNCwgMHg1OWIzM2QxNyxcbiAgMHgyZWI0MGQ4MSwgMHhiN2JkNWMzYiwgMHhjMGJhNmNhZCwgMHhlZGI4ODMyMCwgMHg5YWJmYjNiNixcbiAgMHgwM2I2ZTIwYywgMHg3NGIxZDI5YSwgMHhlYWQ1NDczOSwgMHg5ZGQyNzdhZiwgMHgwNGRiMjYxNSxcbiAgMHg3M2RjMTY4MywgMHhlMzYzMGIxMiwgMHg5NDY0M2I4NCwgMHgwZDZkNmEzZSwgMHg3YTZhNWFhOCxcbiAgMHhlNDBlY2YwYiwgMHg5MzA5ZmY5ZCwgMHgwYTAwYWUyNywgMHg3ZDA3OWViMSwgMHhmMDBmOTM0NCxcbiAgMHg4NzA4YTNkMiwgMHgxZTAxZjI2OCwgMHg2OTA2YzJmZSwgMHhmNzYyNTc1ZCwgMHg4MDY1NjdjYixcbiAgMHgxOTZjMzY3MSwgMHg2ZTZiMDZlNywgMHhmZWQ0MWI3NiwgMHg4OWQzMmJlMCwgMHgxMGRhN2E1YSxcbiAgMHg2N2RkNGFjYywgMHhmOWI5ZGY2ZiwgMHg4ZWJlZWZmOSwgMHgxN2I3YmU0MywgMHg2MGIwOGVkNSxcbiAgMHhkNmQ2YTNlOCwgMHhhMWQxOTM3ZSwgMHgzOGQ4YzJjNCwgMHg0ZmRmZjI1MiwgMHhkMWJiNjdmMSxcbiAgMHhhNmJjNTc2NywgMHgzZmI1MDZkZCwgMHg0OGIyMzY0YiwgMHhkODBkMmJkYSwgMHhhZjBhMWI0YyxcbiAgMHgzNjAzNGFmNiwgMHg0MTA0N2E2MCwgMHhkZjYwZWZjMywgMHhhODY3ZGY1NSwgMHgzMTZlOGVlZixcbiAgMHg0NjY5YmU3OSwgMHhjYjYxYjM4YywgMHhiYzY2ODMxYSwgMHgyNTZmZDJhMCwgMHg1MjY4ZTIzNixcbiAgMHhjYzBjNzc5NSwgMHhiYjBiNDcwMywgMHgyMjAyMTZiOSwgMHg1NTA1MjYyZiwgMHhjNWJhM2JiZSxcbiAgMHhiMmJkMGIyOCwgMHgyYmI0NWE5MiwgMHg1Y2IzNmEwNCwgMHhjMmQ3ZmZhNywgMHhiNWQwY2YzMSxcbiAgMHgyY2Q5OWU4YiwgMHg1YmRlYWUxZCwgMHg5YjY0YzJiMCwgMHhlYzYzZjIyNiwgMHg3NTZhYTM5YyxcbiAgMHgwMjZkOTMwYSwgMHg5YzA5MDZhOSwgMHhlYjBlMzYzZiwgMHg3MjA3Njc4NSwgMHgwNTAwNTcxMyxcbiAgMHg5NWJmNGE4MiwgMHhlMmI4N2ExNCwgMHg3YmIxMmJhZSwgMHgwY2I2MWIzOCwgMHg5MmQyOGU5YixcbiAgMHhlNWQ1YmUwZCwgMHg3Y2RjZWZiNywgMHgwYmRiZGYyMSwgMHg4NmQzZDJkNCwgMHhmMWQ0ZTI0MixcbiAgMHg2OGRkYjNmOCwgMHgxZmRhODM2ZSwgMHg4MWJlMTZjZCwgMHhmNmI5MjY1YiwgMHg2ZmIwNzdlMSxcbiAgMHgxOGI3NDc3NywgMHg4ODA4NWFlNiwgMHhmZjBmNmE3MCwgMHg2NjA2M2JjYSwgMHgxMTAxMGI1YyxcbiAgMHg4ZjY1OWVmZiwgMHhmODYyYWU2OSwgMHg2MTZiZmZkMywgMHgxNjZjY2Y0NSwgMHhhMDBhZTI3OCxcbiAgMHhkNzBkZDJlZSwgMHg0ZTA0ODM1NCwgMHgzOTAzYjNjMiwgMHhhNzY3MjY2MSwgMHhkMDYwMTZmNyxcbiAgMHg0OTY5NDc0ZCwgMHgzZTZlNzdkYiwgMHhhZWQxNmE0YSwgMHhkOWQ2NWFkYywgMHg0MGRmMGI2NixcbiAgMHgzN2Q4M2JmMCwgMHhhOWJjYWU1MywgMHhkZWJiOWVjNSwgMHg0N2IyY2Y3ZiwgMHgzMGI1ZmZlOSxcbiAgMHhiZGJkZjIxYywgMHhjYWJhYzI4YSwgMHg1M2IzOTMzMCwgMHgyNGI0YTNhNiwgMHhiYWQwMzYwNSxcbiAgMHhjZGQ3MDY5MywgMHg1NGRlNTcyOSwgMHgyM2Q5NjdiZiwgMHhiMzY2N2EyZSwgMHhjNDYxNGFiOCxcbiAgMHg1ZDY4MWIwMiwgMHgyYTZmMmI5NCwgMHhiNDBiYmUzNywgMHhjMzBjOGVhMSwgMHg1YTA1ZGYxYixcbiAgMHgyZDAyZWY4ZFxuXTtcblxuaWYgKHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICBDUkNfVEFCTEUgPSBuZXcgSW50MzJBcnJheShDUkNfVEFCTEUpO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVCdWZmZXIoaW5wdXQpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dCkpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICB2YXIgaGFzTmV3QnVmZmVyQVBJID1cbiAgICAgIHR5cGVvZiBCdWZmZXIuYWxsb2MgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgdHlwZW9mIEJ1ZmZlci5mcm9tID09PSBcImZ1bmN0aW9uXCI7XG5cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBoYXNOZXdCdWZmZXJBUEkgPyBCdWZmZXIuYWxsb2MoaW5wdXQpIDogbmV3IEJ1ZmZlcihpbnB1dCk7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGhhc05ld0J1ZmZlckFQSSA/IEJ1ZmZlci5mcm9tKGlucHV0KSA6IG5ldyBCdWZmZXIoaW5wdXQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcImlucHV0IG11c3QgYmUgYnVmZmVyLCBudW1iZXIsIG9yIHN0cmluZywgcmVjZWl2ZWQgXCIgK1xuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgaW5wdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1ZmZlcml6ZUludChudW0pIHtcbiAgdmFyIHRtcCA9IGVuc3VyZUJ1ZmZlcig0KTtcbiAgdG1wLndyaXRlSW50MzJCRShudW0sIDApO1xuICByZXR1cm4gdG1wO1xufVxuXG5mdW5jdGlvbiBfY3JjMzIoYnVmLCBwcmV2aW91cykge1xuICBidWYgPSBlbnN1cmVCdWZmZXIoYnVmKTtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihwcmV2aW91cykpIHtcbiAgICBwcmV2aW91cyA9IHByZXZpb3VzLnJlYWRVSW50MzJCRSgwKTtcbiAgfVxuICB2YXIgY3JjID0gfn5wcmV2aW91cyBeIC0xO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IGJ1Zi5sZW5ndGg7IG4rKykge1xuICAgIGNyYyA9IENSQ19UQUJMRVsoY3JjIF4gYnVmW25dKSAmIDB4ZmZdIF4gKGNyYyA+Pj4gOCk7XG4gIH1cbiAgcmV0dXJuIChjcmMgXiAtMSk7XG59XG5cbmZ1bmN0aW9uIGNyYzMyKCkge1xuICByZXR1cm4gYnVmZmVyaXplSW50KF9jcmMzMi5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcbn1cbmNyYzMyLnNpZ25lZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIF9jcmMzMi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xufTtcbmNyYzMyLnVuc2lnbmVkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2NyYzMyLmFwcGx5KG51bGwsIGFyZ3VtZW50cykgPj4+IDA7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyYzMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1hc2tzIGEgYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBtYXNrLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBzb3VyY2UgVGhlIGJ1ZmZlciB0byBtYXNrXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayBUaGUgbWFzayB0byB1c2VcbiAqIEBwYXJhbSB7QnVmZmVyfSBvdXRwdXQgVGhlIGJ1ZmZlciB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdG8gc3RhcnQgd3JpdGluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIG1hc2suXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IG1hc2sgPSAoc291cmNlLCBtYXNrLCBvdXRwdXQsIG9mZnNldCwgbGVuZ3RoKSA9PiB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBvdXRwdXRbb2Zmc2V0ICsgaV0gPSBzb3VyY2VbaV0gXiBtYXNrW2kgJiAzXTtcbiAgfVxufTtcblxuLyoqXG4gKiBVbm1hc2tzIGEgYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBtYXNrLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byB1bm1hc2tcbiAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIFRoZSBtYXNrIHRvIHVzZVxuICogQHB1YmxpY1xuICovXG5jb25zdCB1bm1hc2sgPSAoYnVmZmVyLCBtYXNrKSA9PiB7XG4gIC8vIFJlcXVpcmVkIHVudGlsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvOTAwNiBpcyByZXNvbHZlZC5cbiAgY29uc3QgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGJ1ZmZlcltpXSBePSBtYXNrW2kgJiAzXTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7IG1hc2ssIHVubWFzayB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG50cnkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ25vZGUtZ3lwLWJ1aWxkJykoX19kaXJuYW1lKTtcbn0gY2F0Y2ggKGUpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhbGxiYWNrJyk7XG59XG4iLCIvKiBNSVQgbGljZW5zZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbWl4ZWQtb3BlcmF0b3JzICovXG5jb25zdCBjc3NLZXl3b3JkcyA9IHJlcXVpcmUoJ2NvbG9yLW5hbWUnKTtcblxuLy8gTk9URTogY29udmVyc2lvbnMgc2hvdWxkIG9ubHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXMgKGkuZS4gYXJyYXlzLCBvclxuLy8gICAgICAgdmFsdWVzIHRoYXQgZ2l2ZSBjb3JyZWN0IGB0eXBlb2ZgIHJlc3VsdHMpLlxuLy8gICAgICAgZG8gbm90IHVzZSBib3ggdmFsdWVzIHR5cGVzIChpLmUuIE51bWJlcigpLCBTdHJpbmcoKSwgZXRjLilcblxuY29uc3QgcmV2ZXJzZUtleXdvcmRzID0ge307XG5mb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjc3NLZXl3b3JkcykpIHtcblx0cmV2ZXJzZUtleXdvcmRzW2Nzc0tleXdvcmRzW2tleV1dID0ga2V5O1xufVxuXG5jb25zdCBjb252ZXJ0ID0ge1xuXHRyZ2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAncmdiJ30sXG5cdGhzbDoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdoc2wnfSxcblx0aHN2OiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzdid9LFxuXHRod2I6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHdiJ30sXG5cdGNteWs6IHtjaGFubmVsczogNCwgbGFiZWxzOiAnY215ayd9LFxuXHR4eXo6IHtjaGFubmVsczogMywgbGFiZWxzOiAneHl6J30sXG5cdGxhYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdsYWInfSxcblx0bGNoOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xjaCd9LFxuXHRoZXg6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2hleCddfSxcblx0a2V5d29yZDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsna2V5d29yZCddfSxcblx0YW5zaTE2OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydhbnNpMTYnXX0sXG5cdGFuc2kyNTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kyNTYnXX0sXG5cdGhjZzoge2NoYW5uZWxzOiAzLCBsYWJlbHM6IFsnaCcsICdjJywgJ2cnXX0sXG5cdGFwcGxlOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydyMTYnLCAnZzE2JywgJ2IxNiddfSxcblx0Z3JheToge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnZ3JheSddfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0O1xuXG4vLyBIaWRlIC5jaGFubmVscyBhbmQgLmxhYmVscyBwcm9wZXJ0aWVzXG5mb3IgKGNvbnN0IG1vZGVsIG9mIE9iamVjdC5rZXlzKGNvbnZlcnQpKSB7XG5cdGlmICghKCdjaGFubmVscycgaW4gY29udmVydFttb2RlbF0pKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHR9XG5cblx0aWYgKCEoJ2xhYmVscycgaW4gY29udmVydFttb2RlbF0pKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGNoYW5uZWwgbGFiZWxzIHByb3BlcnR5OiAnICsgbW9kZWwpO1xuXHR9XG5cblx0aWYgKGNvbnZlcnRbbW9kZWxdLmxhYmVscy5sZW5ndGggIT09IGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdjaGFubmVsIGFuZCBsYWJlbCBjb3VudHMgbWlzbWF0Y2g6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHRjb25zdCB7Y2hhbm5lbHMsIGxhYmVsc30gPSBjb252ZXJ0W21vZGVsXTtcblx0ZGVsZXRlIGNvbnZlcnRbbW9kZWxdLmNoYW5uZWxzO1xuXHRkZWxldGUgY29udmVydFttb2RlbF0ubGFiZWxzO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdjaGFubmVscycsIHt2YWx1ZTogY2hhbm5lbHN9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbbW9kZWxdLCAnbGFiZWxzJywge3ZhbHVlOiBsYWJlbHN9KTtcbn1cblxuY29udmVydC5yZ2IuaHNsID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCByID0gcmdiWzBdIC8gMjU1O1xuXHRjb25zdCBnID0gcmdiWzFdIC8gMjU1O1xuXHRjb25zdCBiID0gcmdiWzJdIC8gMjU1O1xuXHRjb25zdCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcblx0Y29uc3QgbWF4ID0gTWF0aC5tYXgociwgZywgYik7XG5cdGNvbnN0IGRlbHRhID0gbWF4IC0gbWluO1xuXHRsZXQgaDtcblx0bGV0IHM7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0aCA9IDA7XG5cdH0gZWxzZSBpZiAociA9PT0gbWF4KSB7XG5cdFx0aCA9IChnIC0gYikgLyBkZWx0YTtcblx0fSBlbHNlIGlmIChnID09PSBtYXgpIHtcblx0XHRoID0gMiArIChiIC0gcikgLyBkZWx0YTtcblx0fSBlbHNlIGlmIChiID09PSBtYXgpIHtcblx0XHRoID0gNCArIChyIC0gZykgLyBkZWx0YTtcblx0fVxuXG5cdGggPSBNYXRoLm1pbihoICogNjAsIDM2MCk7XG5cblx0aWYgKGggPCAwKSB7XG5cdFx0aCArPSAzNjA7XG5cdH1cblxuXHRjb25zdCBsID0gKG1pbiArIG1heCkgLyAyO1xuXG5cdGlmIChtYXggPT09IG1pbikge1xuXHRcdHMgPSAwO1xuXHR9IGVsc2UgaWYgKGwgPD0gMC41KSB7XG5cdFx0cyA9IGRlbHRhIC8gKG1heCArIG1pbik7XG5cdH0gZWxzZSB7XG5cdFx0cyA9IGRlbHRhIC8gKDIgLSBtYXggLSBtaW4pO1xuXHR9XG5cblx0cmV0dXJuIFtoLCBzICogMTAwLCBsICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmhzdiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0bGV0IHJkaWY7XG5cdGxldCBnZGlmO1xuXHRsZXQgYmRpZjtcblx0bGV0IGg7XG5cdGxldCBzO1xuXG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cdGNvbnN0IHYgPSBNYXRoLm1heChyLCBnLCBiKTtcblx0Y29uc3QgZGlmZiA9IHYgLSBNYXRoLm1pbihyLCBnLCBiKTtcblx0Y29uc3QgZGlmZmMgPSBmdW5jdGlvbiAoYykge1xuXHRcdHJldHVybiAodiAtIGMpIC8gNiAvIGRpZmYgKyAxIC8gMjtcblx0fTtcblxuXHRpZiAoZGlmZiA9PT0gMCkge1xuXHRcdGggPSAwO1xuXHRcdHMgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSBkaWZmIC8gdjtcblx0XHRyZGlmID0gZGlmZmMocik7XG5cdFx0Z2RpZiA9IGRpZmZjKGcpO1xuXHRcdGJkaWYgPSBkaWZmYyhiKTtcblxuXHRcdGlmIChyID09PSB2KSB7XG5cdFx0XHRoID0gYmRpZiAtIGdkaWY7XG5cdFx0fSBlbHNlIGlmIChnID09PSB2KSB7XG5cdFx0XHRoID0gKDEgLyAzKSArIHJkaWYgLSBiZGlmO1xuXHRcdH0gZWxzZSBpZiAoYiA9PT0gdikge1xuXHRcdFx0aCA9ICgyIC8gMykgKyBnZGlmIC0gcmRpZjtcblx0XHR9XG5cblx0XHRpZiAoaCA8IDApIHtcblx0XHRcdGggKz0gMTtcblx0XHR9IGVsc2UgaWYgKGggPiAxKSB7XG5cdFx0XHRoIC09IDE7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFtcblx0XHRoICogMzYwLFxuXHRcdHMgKiAxMDAsXG5cdFx0diAqIDEwMFxuXHRdO1xufTtcblxuY29udmVydC5yZ2IuaHdiID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCByID0gcmdiWzBdO1xuXHRjb25zdCBnID0gcmdiWzFdO1xuXHRsZXQgYiA9IHJnYlsyXTtcblx0Y29uc3QgaCA9IGNvbnZlcnQucmdiLmhzbChyZ2IpWzBdO1xuXHRjb25zdCB3ID0gMSAvIDI1NSAqIE1hdGgubWluKHIsIE1hdGgubWluKGcsIGIpKTtcblxuXHRiID0gMSAtIDEgLyAyNTUgKiBNYXRoLm1heChyLCBNYXRoLm1heChnLCBiKSk7XG5cblx0cmV0dXJuIFtoLCB3ICogMTAwLCBiICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmNteWsgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cblx0Y29uc3QgayA9IE1hdGgubWluKDEgLSByLCAxIC0gZywgMSAtIGIpO1xuXHRjb25zdCBjID0gKDEgLSByIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cdGNvbnN0IG0gPSAoMSAtIGcgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0Y29uc3QgeSA9ICgxIC0gYiAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXG5cdHJldHVybiBbYyAqIDEwMCwgbSAqIDEwMCwgeSAqIDEwMCwgayAqIDEwMF07XG59O1xuXG5mdW5jdGlvbiBjb21wYXJhdGl2ZURpc3RhbmNlKHgsIHkpIHtcblx0Lypcblx0XHRTZWUgaHR0cHM6Ly9lbi5tLndpa2lwZWRpYS5vcmcvd2lraS9FdWNsaWRlYW5fZGlzdGFuY2UjU3F1YXJlZF9FdWNsaWRlYW5fZGlzdGFuY2Vcblx0Ki9cblx0cmV0dXJuIChcblx0XHQoKHhbMF0gLSB5WzBdKSAqKiAyKSArXG5cdFx0KCh4WzFdIC0geVsxXSkgKiogMikgK1xuXHRcdCgoeFsyXSAtIHlbMl0pICoqIDIpXG5cdCk7XG59XG5cbmNvbnZlcnQucmdiLmtleXdvcmQgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHJldmVyc2VkID0gcmV2ZXJzZUtleXdvcmRzW3JnYl07XG5cdGlmIChyZXZlcnNlZCkge1xuXHRcdHJldHVybiByZXZlcnNlZDtcblx0fVxuXG5cdGxldCBjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cdGxldCBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG5cblx0Zm9yIChjb25zdCBrZXl3b3JkIG9mIE9iamVjdC5rZXlzKGNzc0tleXdvcmRzKSkge1xuXHRcdGNvbnN0IHZhbHVlID0gY3NzS2V5d29yZHNba2V5d29yZF07XG5cblx0XHQvLyBDb21wdXRlIGNvbXBhcmF0aXZlIGRpc3RhbmNlXG5cdFx0Y29uc3QgZGlzdGFuY2UgPSBjb21wYXJhdGl2ZURpc3RhbmNlKHJnYiwgdmFsdWUpO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgaXRzIGxlc3MsIGlmIHNvIHNldCBhcyBjbG9zZXN0XG5cdFx0aWYgKGRpc3RhbmNlIDwgY3VycmVudENsb3Nlc3REaXN0YW5jZSkge1xuXHRcdFx0Y3VycmVudENsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuXHRcdFx0Y3VycmVudENsb3Nlc3RLZXl3b3JkID0ga2V5d29yZDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY3VycmVudENsb3Nlc3RLZXl3b3JkO1xufTtcblxuY29udmVydC5rZXl3b3JkLnJnYiA9IGZ1bmN0aW9uIChrZXl3b3JkKSB7XG5cdHJldHVybiBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcbn07XG5cbmNvbnZlcnQucmdiLnh5eiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0bGV0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGxldCBnID0gcmdiWzFdIC8gMjU1O1xuXHRsZXQgYiA9IHJnYlsyXSAvIDI1NTtcblxuXHQvLyBBc3N1bWUgc1JHQlxuXHRyID0gciA+IDAuMDQwNDUgPyAoKChyICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNCkgOiAociAvIDEyLjkyKTtcblx0ZyA9IGcgPiAwLjA0MDQ1ID8gKCgoZyArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQpIDogKGcgLyAxMi45Mik7XG5cdGIgPSBiID4gMC4wNDA0NSA/ICgoKGIgKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40KSA6IChiIC8gMTIuOTIpO1xuXG5cdGNvbnN0IHggPSAociAqIDAuNDEyNCkgKyAoZyAqIDAuMzU3NikgKyAoYiAqIDAuMTgwNSk7XG5cdGNvbnN0IHkgPSAociAqIDAuMjEyNikgKyAoZyAqIDAuNzE1MikgKyAoYiAqIDAuMDcyMik7XG5cdGNvbnN0IHogPSAociAqIDAuMDE5MykgKyAoZyAqIDAuMTE5MikgKyAoYiAqIDAuOTUwNSk7XG5cblx0cmV0dXJuIFt4ICogMTAwLCB5ICogMTAwLCB6ICogMTAwXTtcbn07XG5cbmNvbnZlcnQucmdiLmxhYiA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgeHl6ID0gY29udmVydC5yZ2IueHl6KHJnYik7XG5cdGxldCB4ID0geHl6WzBdO1xuXHRsZXQgeSA9IHh5elsxXTtcblx0bGV0IHogPSB4eXpbMl07XG5cblx0eCAvPSA5NS4wNDc7XG5cdHkgLz0gMTAwO1xuXHR6IC89IDEwOC44ODM7XG5cblx0eCA9IHggPiAwLjAwODg1NiA/ICh4ICoqICgxIC8gMykpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuXHR5ID0geSA+IDAuMDA4ODU2ID8gKHkgKiogKDEgLyAzKSkgOiAoNy43ODcgKiB5KSArICgxNiAvIDExNik7XG5cdHogPSB6ID4gMC4wMDg4NTYgPyAoeiAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuXHRjb25zdCBsID0gKDExNiAqIHkpIC0gMTY7XG5cdGNvbnN0IGEgPSA1MDAgKiAoeCAtIHkpO1xuXHRjb25zdCBiID0gMjAwICogKHkgLSB6KTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5oc2wucmdiID0gZnVuY3Rpb24gKGhzbCkge1xuXHRjb25zdCBoID0gaHNsWzBdIC8gMzYwO1xuXHRjb25zdCBzID0gaHNsWzFdIC8gMTAwO1xuXHRjb25zdCBsID0gaHNsWzJdIC8gMTAwO1xuXHRsZXQgdDI7XG5cdGxldCB0Mztcblx0bGV0IHZhbDtcblxuXHRpZiAocyA9PT0gMCkge1xuXHRcdHZhbCA9IGwgKiAyNTU7XG5cdFx0cmV0dXJuIFt2YWwsIHZhbCwgdmFsXTtcblx0fVxuXG5cdGlmIChsIDwgMC41KSB7XG5cdFx0dDIgPSBsICogKDEgKyBzKTtcblx0fSBlbHNlIHtcblx0XHR0MiA9IGwgKyBzIC0gbCAqIHM7XG5cdH1cblxuXHRjb25zdCB0MSA9IDIgKiBsIC0gdDI7XG5cblx0Y29uc3QgcmdiID0gWzAsIDAsIDBdO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdHQzID0gaCArIDEgLyAzICogLShpIC0gMSk7XG5cdFx0aWYgKHQzIDwgMCkge1xuXHRcdFx0dDMrKztcblx0XHR9XG5cblx0XHRpZiAodDMgPiAxKSB7XG5cdFx0XHR0My0tO1xuXHRcdH1cblxuXHRcdGlmICg2ICogdDMgPCAxKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqIDYgKiB0Mztcblx0XHR9IGVsc2UgaWYgKDIgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQyO1xuXHRcdH0gZWxzZSBpZiAoMyAqIHQzIDwgMikge1xuXHRcdFx0dmFsID0gdDEgKyAodDIgLSB0MSkgKiAoMiAvIDMgLSB0MykgKiA2O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YWwgPSB0MTtcblx0XHR9XG5cblx0XHRyZ2JbaV0gPSB2YWwgKiAyNTU7XG5cdH1cblxuXHRyZXR1cm4gcmdiO1xufTtcblxuY29udmVydC5oc2wuaHN2ID0gZnVuY3Rpb24gKGhzbCkge1xuXHRjb25zdCBoID0gaHNsWzBdO1xuXHRsZXQgcyA9IGhzbFsxXSAvIDEwMDtcblx0bGV0IGwgPSBoc2xbMl0gLyAxMDA7XG5cdGxldCBzbWluID0gcztcblx0Y29uc3QgbG1pbiA9IE1hdGgubWF4KGwsIDAuMDEpO1xuXG5cdGwgKj0gMjtcblx0cyAqPSAobCA8PSAxKSA/IGwgOiAyIC0gbDtcblx0c21pbiAqPSBsbWluIDw9IDEgPyBsbWluIDogMiAtIGxtaW47XG5cdGNvbnN0IHYgPSAobCArIHMpIC8gMjtcblx0Y29uc3Qgc3YgPSBsID09PSAwID8gKDIgKiBzbWluKSAvIChsbWluICsgc21pbikgOiAoMiAqIHMpIC8gKGwgKyBzKTtcblxuXHRyZXR1cm4gW2gsIHN2ICogMTAwLCB2ICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHN2LnJnYiA9IGZ1bmN0aW9uIChoc3YpIHtcblx0Y29uc3QgaCA9IGhzdlswXSAvIDYwO1xuXHRjb25zdCBzID0gaHN2WzFdIC8gMTAwO1xuXHRsZXQgdiA9IGhzdlsyXSAvIDEwMDtcblx0Y29uc3QgaGkgPSBNYXRoLmZsb29yKGgpICUgNjtcblxuXHRjb25zdCBmID0gaCAtIE1hdGguZmxvb3IoaCk7XG5cdGNvbnN0IHAgPSAyNTUgKiB2ICogKDEgLSBzKTtcblx0Y29uc3QgcSA9IDI1NSAqIHYgKiAoMSAtIChzICogZikpO1xuXHRjb25zdCB0ID0gMjU1ICogdiAqICgxIC0gKHMgKiAoMSAtIGYpKSk7XG5cdHYgKj0gMjU1O1xuXG5cdHN3aXRjaCAoaGkpIHtcblx0XHRjYXNlIDA6XG5cdFx0XHRyZXR1cm4gW3YsIHQsIHBdO1xuXHRcdGNhc2UgMTpcblx0XHRcdHJldHVybiBbcSwgdiwgcF07XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cmV0dXJuIFtwLCB2LCB0XTtcblx0XHRjYXNlIDM6XG5cdFx0XHRyZXR1cm4gW3AsIHEsIHZdO1xuXHRcdGNhc2UgNDpcblx0XHRcdHJldHVybiBbdCwgcCwgdl07XG5cdFx0Y2FzZSA1OlxuXHRcdFx0cmV0dXJuIFt2LCBwLCBxXTtcblx0fVxufTtcblxuY29udmVydC5oc3YuaHNsID0gZnVuY3Rpb24gKGhzdikge1xuXHRjb25zdCBoID0gaHN2WzBdO1xuXHRjb25zdCBzID0gaHN2WzFdIC8gMTAwO1xuXHRjb25zdCB2ID0gaHN2WzJdIC8gMTAwO1xuXHRjb25zdCB2bWluID0gTWF0aC5tYXgodiwgMC4wMSk7XG5cdGxldCBzbDtcblx0bGV0IGw7XG5cblx0bCA9ICgyIC0gcykgKiB2O1xuXHRjb25zdCBsbWluID0gKDIgLSBzKSAqIHZtaW47XG5cdHNsID0gcyAqIHZtaW47XG5cdHNsIC89IChsbWluIDw9IDEpID8gbG1pbiA6IDIgLSBsbWluO1xuXHRzbCA9IHNsIHx8IDA7XG5cdGwgLz0gMjtcblxuXHRyZXR1cm4gW2gsIHNsICogMTAwLCBsICogMTAwXTtcbn07XG5cbi8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzcy1jb2xvci8jaHdiLXRvLXJnYlxuY29udmVydC5od2IucmdiID0gZnVuY3Rpb24gKGh3Yikge1xuXHRjb25zdCBoID0gaHdiWzBdIC8gMzYwO1xuXHRsZXQgd2ggPSBod2JbMV0gLyAxMDA7XG5cdGxldCBibCA9IGh3YlsyXSAvIDEwMDtcblx0Y29uc3QgcmF0aW8gPSB3aCArIGJsO1xuXHRsZXQgZjtcblxuXHQvLyBXaCArIGJsIGNhbnQgYmUgPiAxXG5cdGlmIChyYXRpbyA+IDEpIHtcblx0XHR3aCAvPSByYXRpbztcblx0XHRibCAvPSByYXRpbztcblx0fVxuXG5cdGNvbnN0IGkgPSBNYXRoLmZsb29yKDYgKiBoKTtcblx0Y29uc3QgdiA9IDEgLSBibDtcblx0ZiA9IDYgKiBoIC0gaTtcblxuXHRpZiAoKGkgJiAweDAxKSAhPT0gMCkge1xuXHRcdGYgPSAxIC0gZjtcblx0fVxuXG5cdGNvbnN0IG4gPSB3aCArIGYgKiAodiAtIHdoKTsgLy8gTGluZWFyIGludGVycG9sYXRpb25cblxuXHRsZXQgcjtcblx0bGV0IGc7XG5cdGxldCBiO1xuXHQvKiBlc2xpbnQtZGlzYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSxuby1tdWx0aS1zcGFjZXMgKi9cblx0c3dpdGNoIChpKSB7XG5cdFx0ZGVmYXVsdDpcblx0XHRjYXNlIDY6XG5cdFx0Y2FzZSAwOiByID0gdjsgIGcgPSBuOyAgYiA9IHdoOyBicmVhaztcblx0XHRjYXNlIDE6IHIgPSBuOyAgZyA9IHY7ICBiID0gd2g7IGJyZWFrO1xuXHRcdGNhc2UgMjogciA9IHdoOyBnID0gdjsgIGIgPSBuOyBicmVhaztcblx0XHRjYXNlIDM6IHIgPSB3aDsgZyA9IG47ICBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA0OiByID0gbjsgIGcgPSB3aDsgYiA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgNTogciA9IHY7ICBnID0gd2g7IGIgPSBuOyBicmVhaztcblx0fVxuXHQvKiBlc2xpbnQtZW5hYmxlIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lLG5vLW11bHRpLXNwYWNlcyAqL1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0LmNteWsucmdiID0gZnVuY3Rpb24gKGNteWspIHtcblx0Y29uc3QgYyA9IGNteWtbMF0gLyAxMDA7XG5cdGNvbnN0IG0gPSBjbXlrWzFdIC8gMTAwO1xuXHRjb25zdCB5ID0gY215a1syXSAvIDEwMDtcblx0Y29uc3QgayA9IGNteWtbM10gLyAxMDA7XG5cblx0Y29uc3QgciA9IDEgLSBNYXRoLm1pbigxLCBjICogKDEgLSBrKSArIGspO1xuXHRjb25zdCBnID0gMSAtIE1hdGgubWluKDEsIG0gKiAoMSAtIGspICsgayk7XG5cdGNvbnN0IGIgPSAxIC0gTWF0aC5taW4oMSwgeSAqICgxIC0gaykgKyBrKTtcblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC54eXoucmdiID0gZnVuY3Rpb24gKHh5eikge1xuXHRjb25zdCB4ID0geHl6WzBdIC8gMTAwO1xuXHRjb25zdCB5ID0geHl6WzFdIC8gMTAwO1xuXHRjb25zdCB6ID0geHl6WzJdIC8gMTAwO1xuXHRsZXQgcjtcblx0bGV0IGc7XG5cdGxldCBiO1xuXG5cdHIgPSAoeCAqIDMuMjQwNikgKyAoeSAqIC0xLjUzNzIpICsgKHogKiAtMC40OTg2KTtcblx0ZyA9ICh4ICogLTAuOTY4OSkgKyAoeSAqIDEuODc1OCkgKyAoeiAqIDAuMDQxNSk7XG5cdGIgPSAoeCAqIDAuMDU1NykgKyAoeSAqIC0wLjIwNDApICsgKHogKiAxLjA1NzApO1xuXG5cdC8vIEFzc3VtZSBzUkdCXG5cdHIgPSByID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogKHIgKiogKDEuMCAvIDIuNCkpKSAtIDAuMDU1KVxuXHRcdDogciAqIDEyLjkyO1xuXG5cdGcgPSBnID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogKGcgKiogKDEuMCAvIDIuNCkpKSAtIDAuMDU1KVxuXHRcdDogZyAqIDEyLjkyO1xuXG5cdGIgPSBiID4gMC4wMDMxMzA4XG5cdFx0PyAoKDEuMDU1ICogKGIgKiogKDEuMCAvIDIuNCkpKSAtIDAuMDU1KVxuXHRcdDogYiAqIDEyLjkyO1xuXG5cdHIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCByKSwgMSk7XG5cdGcgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBnKSwgMSk7XG5cdGIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBiKSwgMSk7XG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQueHl6LmxhYiA9IGZ1bmN0aW9uICh4eXopIHtcblx0bGV0IHggPSB4eXpbMF07XG5cdGxldCB5ID0geHl6WzFdO1xuXHRsZXQgeiA9IHh5elsyXTtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gKHggKiogKDEgLyAzKSkgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG5cdHkgPSB5ID4gMC4wMDg4NTYgPyAoeSAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/ICh6ICoqICgxIC8gMykpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGNvbnN0IGwgPSAoMTE2ICogeSkgLSAxNjtcblx0Y29uc3QgYSA9IDUwMCAqICh4IC0geSk7XG5cdGNvbnN0IGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmxhYi54eXogPSBmdW5jdGlvbiAobGFiKSB7XG5cdGNvbnN0IGwgPSBsYWJbMF07XG5cdGNvbnN0IGEgPSBsYWJbMV07XG5cdGNvbnN0IGIgPSBsYWJbMl07XG5cdGxldCB4O1xuXHRsZXQgeTtcblx0bGV0IHo7XG5cblx0eSA9IChsICsgMTYpIC8gMTE2O1xuXHR4ID0gYSAvIDUwMCArIHk7XG5cdHogPSB5IC0gYiAvIDIwMDtcblxuXHRjb25zdCB5MiA9IHkgKiogMztcblx0Y29uc3QgeDIgPSB4ICoqIDM7XG5cdGNvbnN0IHoyID0geiAqKiAzO1xuXHR5ID0geTIgPiAwLjAwODg1NiA/IHkyIDogKHkgLSAxNiAvIDExNikgLyA3Ljc4Nztcblx0eCA9IHgyID4gMC4wMDg4NTYgPyB4MiA6ICh4IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cdHogPSB6MiA+IDAuMDA4ODU2ID8gejIgOiAoeiAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXG5cdHggKj0gOTUuMDQ3O1xuXHR5ICo9IDEwMDtcblx0eiAqPSAxMDguODgzO1xuXG5cdHJldHVybiBbeCwgeSwgel07XG59O1xuXG5jb252ZXJ0LmxhYi5sY2ggPSBmdW5jdGlvbiAobGFiKSB7XG5cdGNvbnN0IGwgPSBsYWJbMF07XG5cdGNvbnN0IGEgPSBsYWJbMV07XG5cdGNvbnN0IGIgPSBsYWJbMl07XG5cdGxldCBoO1xuXG5cdGNvbnN0IGhyID0gTWF0aC5hdGFuMihiLCBhKTtcblx0aCA9IGhyICogMzYwIC8gMiAvIE1hdGguUEk7XG5cblx0aWYgKGggPCAwKSB7XG5cdFx0aCArPSAzNjA7XG5cdH1cblxuXHRjb25zdCBjID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpO1xuXG5cdHJldHVybiBbbCwgYywgaF07XG59O1xuXG5jb252ZXJ0LmxjaC5sYWIgPSBmdW5jdGlvbiAobGNoKSB7XG5cdGNvbnN0IGwgPSBsY2hbMF07XG5cdGNvbnN0IGMgPSBsY2hbMV07XG5cdGNvbnN0IGggPSBsY2hbMl07XG5cblx0Y29uc3QgaHIgPSBoIC8gMzYwICogMiAqIE1hdGguUEk7XG5cdGNvbnN0IGEgPSBjICogTWF0aC5jb3MoaHIpO1xuXHRjb25zdCBiID0gYyAqIE1hdGguc2luKGhyKTtcblxuXHRyZXR1cm4gW2wsIGEsIGJdO1xufTtcblxuY29udmVydC5yZ2IuYW5zaTE2ID0gZnVuY3Rpb24gKGFyZ3MsIHNhdHVyYXRpb24gPSBudWxsKSB7XG5cdGNvbnN0IFtyLCBnLCBiXSA9IGFyZ3M7XG5cdGxldCB2YWx1ZSA9IHNhdHVyYXRpb24gPT09IG51bGwgPyBjb252ZXJ0LnJnYi5oc3YoYXJncylbMl0gOiBzYXR1cmF0aW9uOyAvLyBIc3YgLT4gYW5zaTE2IG9wdGltaXphdGlvblxuXG5cdHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAvIDUwKTtcblxuXHRpZiAodmFsdWUgPT09IDApIHtcblx0XHRyZXR1cm4gMzA7XG5cdH1cblxuXHRsZXQgYW5zaSA9IDMwXG5cdFx0KyAoKE1hdGgucm91bmQoYiAvIDI1NSkgPDwgMilcblx0XHR8IChNYXRoLnJvdW5kKGcgLyAyNTUpIDw8IDEpXG5cdFx0fCBNYXRoLnJvdW5kKHIgLyAyNTUpKTtcblxuXHRpZiAodmFsdWUgPT09IDIpIHtcblx0XHRhbnNpICs9IDYwO1xuXHR9XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0Lmhzdi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncykge1xuXHQvLyBPcHRpbWl6YXRpb24gaGVyZTsgd2UgYWxyZWFkeSBrbm93IHRoZSB2YWx1ZSBhbmQgZG9uJ3QgbmVlZCB0byBnZXRcblx0Ly8gaXQgY29udmVydGVkIGZvciB1cy5cblx0cmV0dXJuIGNvbnZlcnQucmdiLmFuc2kxNihjb252ZXJ0Lmhzdi5yZ2IoYXJncyksIGFyZ3NbMl0pO1xufTtcblxuY29udmVydC5yZ2IuYW5zaTI1NiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdGNvbnN0IHIgPSBhcmdzWzBdO1xuXHRjb25zdCBnID0gYXJnc1sxXTtcblx0Y29uc3QgYiA9IGFyZ3NbMl07XG5cblx0Ly8gV2UgdXNlIHRoZSBleHRlbmRlZCBncmV5c2NhbGUgcGFsZXR0ZSBoZXJlLCB3aXRoIHRoZSBleGNlcHRpb24gb2Zcblx0Ly8gYmxhY2sgYW5kIHdoaXRlLiBub3JtYWwgcGFsZXR0ZSBvbmx5IGhhcyA0IGdyZXlzY2FsZSBzaGFkZXMuXG5cdGlmIChyID09PSBnICYmIGcgPT09IGIpIHtcblx0XHRpZiAociA8IDgpIHtcblx0XHRcdHJldHVybiAxNjtcblx0XHR9XG5cblx0XHRpZiAociA+IDI0OCkge1xuXHRcdFx0cmV0dXJuIDIzMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gTWF0aC5yb3VuZCgoKHIgLSA4KSAvIDI0NykgKiAyNCkgKyAyMzI7XG5cdH1cblxuXHRjb25zdCBhbnNpID0gMTZcblx0XHQrICgzNiAqIE1hdGgucm91bmQociAvIDI1NSAqIDUpKVxuXHRcdCsgKDYgKiBNYXRoLnJvdW5kKGcgLyAyNTUgKiA1KSlcblx0XHQrIE1hdGgucm91bmQoYiAvIDI1NSAqIDUpO1xuXG5cdHJldHVybiBhbnNpO1xufTtcblxuY29udmVydC5hbnNpMTYucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0bGV0IGNvbG9yID0gYXJncyAlIDEwO1xuXG5cdC8vIEhhbmRsZSBncmV5c2NhbGVcblx0aWYgKGNvbG9yID09PSAwIHx8IGNvbG9yID09PSA3KSB7XG5cdFx0aWYgKGFyZ3MgPiA1MCkge1xuXHRcdFx0Y29sb3IgKz0gMy41O1xuXHRcdH1cblxuXHRcdGNvbG9yID0gY29sb3IgLyAxMC41ICogMjU1O1xuXG5cdFx0cmV0dXJuIFtjb2xvciwgY29sb3IsIGNvbG9yXTtcblx0fVxuXG5cdGNvbnN0IG11bHQgPSAofn4oYXJncyA+IDUwKSArIDEpICogMC41O1xuXHRjb25zdCByID0gKChjb2xvciAmIDEpICogbXVsdCkgKiAyNTU7XG5cdGNvbnN0IGcgPSAoKChjb2xvciA+PiAxKSAmIDEpICogbXVsdCkgKiAyNTU7XG5cdGNvbnN0IGIgPSAoKChjb2xvciA+PiAyKSAmIDEpICogbXVsdCkgKiAyNTU7XG5cblx0cmV0dXJuIFtyLCBnLCBiXTtcbn07XG5cbmNvbnZlcnQuYW5zaTI1Ni5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHQvLyBIYW5kbGUgZ3JleXNjYWxlXG5cdGlmIChhcmdzID49IDIzMikge1xuXHRcdGNvbnN0IGMgPSAoYXJncyAtIDIzMikgKiAxMCArIDg7XG5cdFx0cmV0dXJuIFtjLCBjLCBjXTtcblx0fVxuXG5cdGFyZ3MgLT0gMTY7XG5cblx0bGV0IHJlbTtcblx0Y29uc3QgciA9IE1hdGguZmxvb3IoYXJncyAvIDM2KSAvIDUgKiAyNTU7XG5cdGNvbnN0IGcgPSBNYXRoLmZsb29yKChyZW0gPSBhcmdzICUgMzYpIC8gNikgLyA1ICogMjU1O1xuXHRjb25zdCBiID0gKHJlbSAlIDYpIC8gNSAqIDI1NTtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5yZ2IuaGV4ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Y29uc3QgaW50ZWdlciA9ICgoTWF0aC5yb3VuZChhcmdzWzBdKSAmIDB4RkYpIDw8IDE2KVxuXHRcdCsgKChNYXRoLnJvdW5kKGFyZ3NbMV0pICYgMHhGRikgPDwgOClcblx0XHQrIChNYXRoLnJvdW5kKGFyZ3NbMl0pICYgMHhGRik7XG5cblx0Y29uc3Qgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbn07XG5cbmNvbnZlcnQuaGV4LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdGNvbnN0IG1hdGNoID0gYXJncy50b1N0cmluZygxNikubWF0Y2goL1thLWYwLTldezZ9fFthLWYwLTldezN9L2kpO1xuXHRpZiAoIW1hdGNoKSB7XG5cdFx0cmV0dXJuIFswLCAwLCAwXTtcblx0fVxuXG5cdGxldCBjb2xvclN0cmluZyA9IG1hdGNoWzBdO1xuXG5cdGlmIChtYXRjaFswXS5sZW5ndGggPT09IDMpIHtcblx0XHRjb2xvclN0cmluZyA9IGNvbG9yU3RyaW5nLnNwbGl0KCcnKS5tYXAoY2hhciA9PiB7XG5cdFx0XHRyZXR1cm4gY2hhciArIGNoYXI7XG5cdFx0fSkuam9pbignJyk7XG5cdH1cblxuXHRjb25zdCBpbnRlZ2VyID0gcGFyc2VJbnQoY29sb3JTdHJpbmcsIDE2KTtcblx0Y29uc3QgciA9IChpbnRlZ2VyID4+IDE2KSAmIDB4RkY7XG5cdGNvbnN0IGcgPSAoaW50ZWdlciA+PiA4KSAmIDB4RkY7XG5cdGNvbnN0IGIgPSBpbnRlZ2VyICYgMHhGRjtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5yZ2IuaGNnID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCByID0gcmdiWzBdIC8gMjU1O1xuXHRjb25zdCBnID0gcmdiWzFdIC8gMjU1O1xuXHRjb25zdCBiID0gcmdiWzJdIC8gMjU1O1xuXHRjb25zdCBtYXggPSBNYXRoLm1heChNYXRoLm1heChyLCBnKSwgYik7XG5cdGNvbnN0IG1pbiA9IE1hdGgubWluKE1hdGgubWluKHIsIGcpLCBiKTtcblx0Y29uc3QgY2hyb21hID0gKG1heCAtIG1pbik7XG5cdGxldCBncmF5c2NhbGU7XG5cdGxldCBodWU7XG5cblx0aWYgKGNocm9tYSA8IDEpIHtcblx0XHRncmF5c2NhbGUgPSBtaW4gLyAoMSAtIGNocm9tYSk7XG5cdH0gZWxzZSB7XG5cdFx0Z3JheXNjYWxlID0gMDtcblx0fVxuXG5cdGlmIChjaHJvbWEgPD0gMCkge1xuXHRcdGh1ZSA9IDA7XG5cdH0gZWxzZVxuXHRpZiAobWF4ID09PSByKSB7XG5cdFx0aHVlID0gKChnIC0gYikgLyBjaHJvbWEpICUgNjtcblx0fSBlbHNlXG5cdGlmIChtYXggPT09IGcpIHtcblx0XHRodWUgPSAyICsgKGIgLSByKSAvIGNocm9tYTtcblx0fSBlbHNlIHtcblx0XHRodWUgPSA0ICsgKHIgLSBnKSAvIGNocm9tYTtcblx0fVxuXG5cdGh1ZSAvPSA2O1xuXHRodWUgJT0gMTtcblxuXHRyZXR1cm4gW2h1ZSAqIDM2MCwgY2hyb21hICogMTAwLCBncmF5c2NhbGUgKiAxMDBdO1xufTtcblxuY29udmVydC5oc2wuaGNnID0gZnVuY3Rpb24gKGhzbCkge1xuXHRjb25zdCBzID0gaHNsWzFdIC8gMTAwO1xuXHRjb25zdCBsID0gaHNsWzJdIC8gMTAwO1xuXG5cdGNvbnN0IGMgPSBsIDwgMC41ID8gKDIuMCAqIHMgKiBsKSA6ICgyLjAgKiBzICogKDEuMCAtIGwpKTtcblxuXHRsZXQgZiA9IDA7XG5cdGlmIChjIDwgMS4wKSB7XG5cdFx0ZiA9IChsIC0gMC41ICogYykgLyAoMS4wIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2hzbFswXSwgYyAqIDEwMCwgZiAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmhzdi5oY2cgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG5cdGNvbnN0IHYgPSBoc3ZbMl0gLyAxMDA7XG5cblx0Y29uc3QgYyA9IHMgKiB2O1xuXHRsZXQgZiA9IDA7XG5cblx0aWYgKGMgPCAxLjApIHtcblx0XHRmID0gKHYgLSBjKSAvICgxIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2hzdlswXSwgYyAqIDEwMCwgZiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5yZ2IgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGggPSBoY2dbMF0gLyAzNjA7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0aWYgKGMgPT09IDAuMCkge1xuXHRcdHJldHVybiBbZyAqIDI1NSwgZyAqIDI1NSwgZyAqIDI1NV07XG5cdH1cblxuXHRjb25zdCBwdXJlID0gWzAsIDAsIDBdO1xuXHRjb25zdCBoaSA9IChoICUgMSkgKiA2O1xuXHRjb25zdCB2ID0gaGkgJSAxO1xuXHRjb25zdCB3ID0gMSAtIHY7XG5cdGxldCBtZyA9IDA7XG5cblx0LyogZXNsaW50LWRpc2FibGUgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUgKi9cblx0c3dpdGNoIChNYXRoLmZsb29yKGhpKSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gdjsgcHVyZVsyXSA9IDA7IGJyZWFrO1xuXHRcdGNhc2UgMTpcblx0XHRcdHB1cmVbMF0gPSB3OyBwdXJlWzFdID0gMTsgcHVyZVsyXSA9IDA7IGJyZWFrO1xuXHRcdGNhc2UgMjpcblx0XHRcdHB1cmVbMF0gPSAwOyBwdXJlWzFdID0gMTsgcHVyZVsyXSA9IHY7IGJyZWFrO1xuXHRcdGNhc2UgMzpcblx0XHRcdHB1cmVbMF0gPSAwOyBwdXJlWzFdID0gdzsgcHVyZVsyXSA9IDE7IGJyZWFrO1xuXHRcdGNhc2UgNDpcblx0XHRcdHB1cmVbMF0gPSB2OyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IDE7IGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRwdXJlWzBdID0gMTsgcHVyZVsxXSA9IDA7IHB1cmVbMl0gPSB3O1xuXHR9XG5cdC8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUgKi9cblxuXHRtZyA9ICgxLjAgLSBjKSAqIGc7XG5cblx0cmV0dXJuIFtcblx0XHQoYyAqIHB1cmVbMF0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzFdICsgbWcpICogMjU1LFxuXHRcdChjICogcHVyZVsyXSArIG1nKSAqIDI1NVxuXHRdO1xufTtcblxuY29udmVydC5oY2cuaHN2ID0gZnVuY3Rpb24gKGhjZykge1xuXHRjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuXHRjb25zdCBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdGNvbnN0IHYgPSBjICsgZyAqICgxLjAgLSBjKTtcblx0bGV0IGYgPSAwO1xuXG5cdGlmICh2ID4gMC4wKSB7XG5cdFx0ZiA9IGMgLyB2O1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIGYgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHNsID0gZnVuY3Rpb24gKGhjZykge1xuXHRjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuXHRjb25zdCBnID0gaGNnWzJdIC8gMTAwO1xuXG5cdGNvbnN0IGwgPSBnICogKDEuMCAtIGMpICsgMC41ICogYztcblx0bGV0IHMgPSAwO1xuXG5cdGlmIChsID4gMC4wICYmIGwgPCAwLjUpIHtcblx0XHRzID0gYyAvICgyICogbCk7XG5cdH0gZWxzZVxuXHRpZiAobCA+PSAwLjUgJiYgbCA8IDEuMCkge1xuXHRcdHMgPSBjIC8gKDIgKiAoMSAtIGwpKTtcblx0fVxuXG5cdHJldHVybiBbaGNnWzBdLCBzICogMTAwLCBsICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLmh3YiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0Y29uc3QgYyA9IGhjZ1sxXSAvIDEwMDtcblx0Y29uc3QgZyA9IGhjZ1syXSAvIDEwMDtcblx0Y29uc3QgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHRyZXR1cm4gW2hjZ1swXSwgKHYgLSBjKSAqIDEwMCwgKDEgLSB2KSAqIDEwMF07XG59O1xuXG5jb252ZXJ0Lmh3Yi5oY2cgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdGNvbnN0IHcgPSBod2JbMV0gLyAxMDA7XG5cdGNvbnN0IGIgPSBod2JbMl0gLyAxMDA7XG5cdGNvbnN0IHYgPSAxIC0gYjtcblx0Y29uc3QgYyA9IHYgLSB3O1xuXHRsZXQgZyA9IDA7XG5cblx0aWYgKGMgPCAxKSB7XG5cdFx0ZyA9ICh2IC0gYykgLyAoMSAtIGMpO1xuXHR9XG5cblx0cmV0dXJuIFtod2JbMF0sIGMgKiAxMDAsIGcgKiAxMDBdO1xufTtcblxuY29udmVydC5hcHBsZS5yZ2IgPSBmdW5jdGlvbiAoYXBwbGUpIHtcblx0cmV0dXJuIFsoYXBwbGVbMF0gLyA2NTUzNSkgKiAyNTUsIChhcHBsZVsxXSAvIDY1NTM1KSAqIDI1NSwgKGFwcGxlWzJdIC8gNjU1MzUpICogMjU1XTtcbn07XG5cbmNvbnZlcnQucmdiLmFwcGxlID0gZnVuY3Rpb24gKHJnYikge1xuXHRyZXR1cm4gWyhyZ2JbMF0gLyAyNTUpICogNjU1MzUsIChyZ2JbMV0gLyAyNTUpICogNjU1MzUsIChyZ2JbMl0gLyAyNTUpICogNjU1MzVdO1xufTtcblxuY29udmVydC5ncmF5LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdHJldHVybiBbYXJnc1swXSAvIDEwMCAqIDI1NSwgYXJnc1swXSAvIDEwMCAqIDI1NSwgYXJnc1swXSAvIDEwMCAqIDI1NV07XG59O1xuXG5jb252ZXJ0LmdyYXkuaHNsID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFswLCAwLCBhcmdzWzBdXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oc3YgPSBjb252ZXJ0LmdyYXkuaHNsO1xuXG5jb252ZXJ0LmdyYXkuaHdiID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFswLCAxMDAsIGdyYXlbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmNteWsgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gWzAsIDAsIDAsIGdyYXlbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmxhYiA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbZ3JheVswXSwgMCwgMF07XG59O1xuXG5jb252ZXJ0LmdyYXkuaGV4ID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0Y29uc3QgdmFsID0gTWF0aC5yb3VuZChncmF5WzBdIC8gMTAwICogMjU1KSAmIDB4RkY7XG5cdGNvbnN0IGludGVnZXIgPSAodmFsIDw8IDE2KSArICh2YWwgPDwgOCkgKyB2YWw7XG5cblx0Y29uc3Qgc3RyaW5nID0gaW50ZWdlci50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuICcwMDAwMDAnLnN1YnN0cmluZyhzdHJpbmcubGVuZ3RoKSArIHN0cmluZztcbn07XG5cbmNvbnZlcnQucmdiLmdyYXkgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHZhbCA9IChyZ2JbMF0gKyByZ2JbMV0gKyByZ2JbMl0pIC8gMztcblx0cmV0dXJuIFt2YWwgLyAyNTUgKiAxMDBdO1xufTtcbiIsImNvbnN0IGNvbnZlcnNpb25zID0gcmVxdWlyZSgnLi9jb252ZXJzaW9ucycpO1xuY29uc3Qgcm91dGUgPSByZXF1aXJlKCcuL3JvdXRlJyk7XG5cbmNvbnN0IGNvbnZlcnQgPSB7fTtcblxuY29uc3QgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5mdW5jdGlvbiB3cmFwUmF3KGZuKSB7XG5cdGNvbnN0IHdyYXBwZWRGbiA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG5cdFx0Y29uc3QgYXJnMCA9IGFyZ3NbMF07XG5cdFx0aWYgKGFyZzAgPT09IHVuZGVmaW5lZCB8fCBhcmcwID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gYXJnMDtcblx0XHR9XG5cblx0XHRpZiAoYXJnMC5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gYXJnMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm4oYXJncyk7XG5cdH07XG5cblx0Ly8gUHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5mdW5jdGlvbiB3cmFwUm91bmRlZChmbikge1xuXHRjb25zdCB3cmFwcGVkRm4gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuXHRcdGNvbnN0IGFyZzAgPSBhcmdzWzBdO1xuXG5cdFx0aWYgKGFyZzAgPT09IHVuZGVmaW5lZCB8fCBhcmcwID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gYXJnMDtcblx0XHR9XG5cblx0XHRpZiAoYXJnMC5sZW5ndGggPiAxKSB7XG5cdFx0XHRhcmdzID0gYXJnMDtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHQgPSBmbihhcmdzKTtcblxuXHRcdC8vIFdlJ3JlIGFzc3VtaW5nIHRoZSByZXN1bHQgaXMgYW4gYXJyYXkgaGVyZS5cblx0XHQvLyBzZWUgbm90aWNlIGluIGNvbnZlcnNpb25zLmpzOyBkb24ndCB1c2UgYm94IHR5cGVzXG5cdFx0Ly8gaW4gY29udmVyc2lvbiBmdW5jdGlvbnMuXG5cdFx0aWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRmb3IgKGxldCBsZW4gPSByZXN1bHQubGVuZ3RoLCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdHJlc3VsdFtpXSA9IE1hdGgucm91bmQocmVzdWx0W2ldKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdC8vIFByZXNlcnZlIC5jb252ZXJzaW9uIHByb3BlcnR5IGlmIHRoZXJlIGlzIG9uZVxuXHRpZiAoJ2NvbnZlcnNpb24nIGluIGZuKSB7XG5cdFx0d3JhcHBlZEZuLmNvbnZlcnNpb24gPSBmbi5jb252ZXJzaW9uO1xuXHR9XG5cblx0cmV0dXJuIHdyYXBwZWRGbjtcbn1cblxubW9kZWxzLmZvckVhY2goZnJvbU1vZGVsID0+IHtcblx0Y29udmVydFtmcm9tTW9kZWxdID0ge307XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbZnJvbU1vZGVsXSwgJ2NoYW5uZWxzJywge3ZhbHVlOiBjb252ZXJzaW9uc1tmcm9tTW9kZWxdLmNoYW5uZWxzfSk7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W2Zyb21Nb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0ubGFiZWxzfSk7XG5cblx0Y29uc3Qgcm91dGVzID0gcm91dGUoZnJvbU1vZGVsKTtcblx0Y29uc3Qgcm91dGVNb2RlbHMgPSBPYmplY3Qua2V5cyhyb3V0ZXMpO1xuXG5cdHJvdXRlTW9kZWxzLmZvckVhY2godG9Nb2RlbCA9PiB7XG5cdFx0Y29uc3QgZm4gPSByb3V0ZXNbdG9Nb2RlbF07XG5cblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0gPSB3cmFwUm91bmRlZChmbik7XG5cdFx0Y29udmVydFtmcm9tTW9kZWxdW3RvTW9kZWxdLnJhdyA9IHdyYXBSYXcoZm4pO1xuXHR9KTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG4iLCJjb25zdCBjb252ZXJzaW9ucyA9IHJlcXVpcmUoJy4vY29udmVyc2lvbnMnKTtcblxuLypcblx0VGhpcyBmdW5jdGlvbiByb3V0ZXMgYSBtb2RlbCB0byBhbGwgb3RoZXIgbW9kZWxzLlxuXG5cdGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgcm91dGVkIGhhdmUgYSBwcm9wZXJ0eSBgLmNvbnZlcnNpb25gIGF0dGFjaGVkXG5cdHRvIHRoZSByZXR1cm5lZCBzeW50aGV0aWMgZnVuY3Rpb24uIFRoaXMgcHJvcGVydHkgaXMgYW4gYXJyYXlcblx0b2Ygc3RyaW5ncywgZWFjaCB3aXRoIHRoZSBzdGVwcyBpbiBiZXR3ZWVuIHRoZSAnZnJvbScgYW5kICd0bydcblx0Y29sb3IgbW9kZWxzIChpbmNsdXNpdmUpLlxuXG5cdGNvbnZlcnNpb25zIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSBzaW1wbHkgYXJlIG5vdCBpbmNsdWRlZC5cbiovXG5cbmZ1bmN0aW9uIGJ1aWxkR3JhcGgoKSB7XG5cdGNvbnN0IGdyYXBoID0ge307XG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS9vYmplY3Qta2V5cy12cy1mb3ItaW4td2l0aC1jbG9zdXJlLzNcblx0Y29uc3QgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5cdGZvciAobGV0IGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRncmFwaFttb2RlbHNbaV1dID0ge1xuXHRcdFx0Ly8gaHR0cDovL2pzcGVyZi5jb20vMS12cy1pbmZpbml0eVxuXHRcdFx0Ly8gbWljcm8tb3B0LCBidXQgdGhpcyBpcyBzaW1wbGUuXG5cdFx0XHRkaXN0YW5jZTogLTEsXG5cdFx0XHRwYXJlbnQ6IG51bGxcblx0XHR9O1xuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CcmVhZHRoLWZpcnN0X3NlYXJjaFxuZnVuY3Rpb24gZGVyaXZlQkZTKGZyb21Nb2RlbCkge1xuXHRjb25zdCBncmFwaCA9IGJ1aWxkR3JhcGgoKTtcblx0Y29uc3QgcXVldWUgPSBbZnJvbU1vZGVsXTsgLy8gVW5zaGlmdCAtPiBxdWV1ZSAtPiBwb3BcblxuXHRncmFwaFtmcm9tTW9kZWxdLmRpc3RhbmNlID0gMDtcblxuXHR3aGlsZSAocXVldWUubGVuZ3RoKSB7XG5cdFx0Y29uc3QgY3VycmVudCA9IHF1ZXVlLnBvcCgpO1xuXHRcdGNvbnN0IGFkamFjZW50cyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zW2N1cnJlbnRdKTtcblxuXHRcdGZvciAobGV0IGxlbiA9IGFkamFjZW50cy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGNvbnN0IGFkamFjZW50ID0gYWRqYWNlbnRzW2ldO1xuXHRcdFx0Y29uc3Qgbm9kZSA9IGdyYXBoW2FkamFjZW50XTtcblxuXHRcdFx0aWYgKG5vZGUuZGlzdGFuY2UgPT09IC0xKSB7XG5cdFx0XHRcdG5vZGUuZGlzdGFuY2UgPSBncmFwaFtjdXJyZW50XS5kaXN0YW5jZSArIDE7XG5cdFx0XHRcdG5vZGUucGFyZW50ID0gY3VycmVudDtcblx0XHRcdFx0cXVldWUudW5zaGlmdChhZGphY2VudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG5mdW5jdGlvbiBsaW5rKGZyb20sIHRvKSB7XG5cdHJldHVybiBmdW5jdGlvbiAoYXJncykge1xuXHRcdHJldHVybiB0byhmcm9tKGFyZ3MpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gd3JhcENvbnZlcnNpb24odG9Nb2RlbCwgZ3JhcGgpIHtcblx0Y29uc3QgcGF0aCA9IFtncmFwaFt0b01vZGVsXS5wYXJlbnQsIHRvTW9kZWxdO1xuXHRsZXQgZm4gPSBjb252ZXJzaW9uc1tncmFwaFt0b01vZGVsXS5wYXJlbnRdW3RvTW9kZWxdO1xuXG5cdGxldCBjdXIgPSBncmFwaFt0b01vZGVsXS5wYXJlbnQ7XG5cdHdoaWxlIChncmFwaFtjdXJdLnBhcmVudCkge1xuXHRcdHBhdGgudW5zaGlmdChncmFwaFtjdXJdLnBhcmVudCk7XG5cdFx0Zm4gPSBsaW5rKGNvbnZlcnNpb25zW2dyYXBoW2N1cl0ucGFyZW50XVtjdXJdLCBmbik7XG5cdFx0Y3VyID0gZ3JhcGhbY3VyXS5wYXJlbnQ7XG5cdH1cblxuXHRmbi5jb252ZXJzaW9uID0gcGF0aDtcblx0cmV0dXJuIGZuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmcm9tTW9kZWwpIHtcblx0Y29uc3QgZ3JhcGggPSBkZXJpdmVCRlMoZnJvbU1vZGVsKTtcblx0Y29uc3QgY29udmVyc2lvbiA9IHt9O1xuXG5cdGNvbnN0IG1vZGVscyA9IE9iamVjdC5rZXlzKGdyYXBoKTtcblx0Zm9yIChsZXQgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdGNvbnN0IHRvTW9kZWwgPSBtb2RlbHNbaV07XG5cdFx0Y29uc3Qgbm9kZSA9IGdyYXBoW3RvTW9kZWxdO1xuXG5cdFx0aWYgKG5vZGUucGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHQvLyBObyBwb3NzaWJsZSBjb252ZXJzaW9uLCBvciB0aGlzIG5vZGUgaXMgdGhlIHNvdXJjZSBtb2RlbC5cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnZlcnNpb25bdG9Nb2RlbF0gPSB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCk7XG5cdH1cblxuXHRyZXR1cm4gY29udmVyc2lvbjtcbn07XG5cbiIsIid1c2Ugc3RyaWN0J1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0XCJhbGljZWJsdWVcIjogWzI0MCwgMjQ4LCAyNTVdLFxyXG5cdFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsIDIzNSwgMjE1XSxcclxuXHRcImFxdWFcIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImFxdWFtYXJpbmVcIjogWzEyNywgMjU1LCAyMTJdLFxyXG5cdFwiYXp1cmVcIjogWzI0MCwgMjU1LCAyNTVdLFxyXG5cdFwiYmVpZ2VcIjogWzI0NSwgMjQ1LCAyMjBdLFxyXG5cdFwiYmlzcXVlXCI6IFsyNTUsIDIyOCwgMTk2XSxcclxuXHRcImJsYWNrXCI6IFswLCAwLCAwXSxcclxuXHRcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsIDIzNSwgMjA1XSxcclxuXHRcImJsdWVcIjogWzAsIDAsIDI1NV0sXHJcblx0XCJibHVldmlvbGV0XCI6IFsxMzgsIDQzLCAyMjZdLFxyXG5cdFwiYnJvd25cIjogWzE2NSwgNDIsIDQyXSxcclxuXHRcImJ1cmx5d29vZFwiOiBbMjIyLCAxODQsIDEzNV0sXHJcblx0XCJjYWRldGJsdWVcIjogWzk1LCAxNTgsIDE2MF0sXHJcblx0XCJjaGFydHJldXNlXCI6IFsxMjcsIDI1NSwgMF0sXHJcblx0XCJjaG9jb2xhdGVcIjogWzIxMCwgMTA1LCAzMF0sXHJcblx0XCJjb3JhbFwiOiBbMjU1LCAxMjcsIDgwXSxcclxuXHRcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsIDE0OSwgMjM3XSxcclxuXHRcImNvcm5zaWxrXCI6IFsyNTUsIDI0OCwgMjIwXSxcclxuXHRcImNyaW1zb25cIjogWzIyMCwgMjAsIDYwXSxcclxuXHRcImN5YW5cIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImRhcmtibHVlXCI6IFswLCAwLCAxMzldLFxyXG5cdFwiZGFya2N5YW5cIjogWzAsIDEzOSwgMTM5XSxcclxuXHRcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwgMTM0LCAxMV0sXHJcblx0XCJkYXJrZ3JheVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJrZ3JlZW5cIjogWzAsIDEwMCwgMF0sXHJcblx0XCJkYXJrZ3JleVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJra2hha2lcIjogWzE4OSwgMTgzLCAxMDddLFxyXG5cdFwiZGFya21hZ2VudGFcIjogWzEzOSwgMCwgMTM5XSxcclxuXHRcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwgMTA3LCA0N10sXHJcblx0XCJkYXJrb3JhbmdlXCI6IFsyNTUsIDE0MCwgMF0sXHJcblx0XCJkYXJrb3JjaGlkXCI6IFsxNTMsIDUwLCAyMDRdLFxyXG5cdFwiZGFya3JlZFwiOiBbMTM5LCAwLCAwXSxcclxuXHRcImRhcmtzYWxtb25cIjogWzIzMywgMTUwLCAxMjJdLFxyXG5cdFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsIDE4OCwgMTQzXSxcclxuXHRcImRhcmtzbGF0ZWJsdWVcIjogWzcyLCA2MSwgMTM5XSxcclxuXHRcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrdHVycXVvaXNlXCI6IFswLCAyMDYsIDIwOV0sXHJcblx0XCJkYXJrdmlvbGV0XCI6IFsxNDgsIDAsIDIxMV0sXHJcblx0XCJkZWVwcGlua1wiOiBbMjU1LCAyMCwgMTQ3XSxcclxuXHRcImRlZXBza3libHVlXCI6IFswLCAxOTEsIDI1NV0sXHJcblx0XCJkaW1ncmF5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRpbWdyZXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZG9kZ2VyYmx1ZVwiOiBbMzAsIDE0NCwgMjU1XSxcclxuXHRcImZpcmVicmlja1wiOiBbMTc4LCAzNCwgMzRdLFxyXG5cdFwiZmxvcmFsd2hpdGVcIjogWzI1NSwgMjUwLCAyNDBdLFxyXG5cdFwiZm9yZXN0Z3JlZW5cIjogWzM0LCAxMzksIDM0XSxcclxuXHRcImZ1Y2hzaWFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcImdhaW5zYm9yb1wiOiBbMjIwLCAyMjAsIDIyMF0sXHJcblx0XCJnaG9zdHdoaXRlXCI6IFsyNDgsIDI0OCwgMjU1XSxcclxuXHRcImdvbGRcIjogWzI1NSwgMjE1LCAwXSxcclxuXHRcImdvbGRlbnJvZFwiOiBbMjE4LCAxNjUsIDMyXSxcclxuXHRcImdyYXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiZ3JlZW5cIjogWzAsIDEyOCwgMF0sXHJcblx0XCJncmVlbnllbGxvd1wiOiBbMTczLCAyNTUsIDQ3XSxcclxuXHRcImdyZXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiaG9uZXlkZXdcIjogWzI0MCwgMjU1LCAyNDBdLFxyXG5cdFwiaG90cGlua1wiOiBbMjU1LCAxMDUsIDE4MF0sXHJcblx0XCJpbmRpYW5yZWRcIjogWzIwNSwgOTIsIDkyXSxcclxuXHRcImluZGlnb1wiOiBbNzUsIDAsIDEzMF0sXHJcblx0XCJpdm9yeVwiOiBbMjU1LCAyNTUsIDI0MF0sXHJcblx0XCJraGFraVwiOiBbMjQwLCAyMzAsIDE0MF0sXHJcblx0XCJsYXZlbmRlclwiOiBbMjMwLCAyMzAsIDI1MF0sXHJcblx0XCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsIDI0MCwgMjQ1XSxcclxuXHRcImxhd25ncmVlblwiOiBbMTI0LCAyNTIsIDBdLFxyXG5cdFwibGVtb25jaGlmZm9uXCI6IFsyNTUsIDI1MCwgMjA1XSxcclxuXHRcImxpZ2h0Ymx1ZVwiOiBbMTczLCAyMTYsIDIzMF0sXHJcblx0XCJsaWdodGNvcmFsXCI6IFsyNDAsIDEyOCwgMTI4XSxcclxuXHRcImxpZ2h0Y3lhblwiOiBbMjI0LCAyNTUsIDI1NV0sXHJcblx0XCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLCAyNTAsIDIxMF0sXHJcblx0XCJsaWdodGdyYXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRncmVlblwiOiBbMTQ0LCAyMzgsIDE0NF0sXHJcblx0XCJsaWdodGdyZXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRwaW5rXCI6IFsyNTUsIDE4MiwgMTkzXSxcclxuXHRcImxpZ2h0c2FsbW9uXCI6IFsyNTUsIDE2MCwgMTIyXSxcclxuXHRcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLCAxNzgsIDE3MF0sXHJcblx0XCJsaWdodHNreWJsdWVcIjogWzEzNSwgMjA2LCAyNTBdLFxyXG5cdFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwgMTk2LCAyMjJdLFxyXG5cdFwibGlnaHR5ZWxsb3dcIjogWzI1NSwgMjU1LCAyMjRdLFxyXG5cdFwibGltZVwiOiBbMCwgMjU1LCAwXSxcclxuXHRcImxpbWVncmVlblwiOiBbNTAsIDIwNSwgNTBdLFxyXG5cdFwibGluZW5cIjogWzI1MCwgMjQwLCAyMzBdLFxyXG5cdFwibWFnZW50YVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwibWFyb29uXCI6IFsxMjgsIDAsIDBdLFxyXG5cdFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLCAyMDUsIDE3MF0sXHJcblx0XCJtZWRpdW1ibHVlXCI6IFswLCAwLCAyMDVdLFxyXG5cdFwibWVkaXVtb3JjaGlkXCI6IFsxODYsIDg1LCAyMTFdLFxyXG5cdFwibWVkaXVtcHVycGxlXCI6IFsxNDcsIDExMiwgMjE5XSxcclxuXHRcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwgMTc5LCAxMTNdLFxyXG5cdFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsIDEwNCwgMjM4XSxcclxuXHRcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLCAyNTAsIDE1NF0sXHJcblx0XCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLCAyMDksIDIwNF0sXHJcblx0XCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwgMjEsIDEzM10sXHJcblx0XCJtaWRuaWdodGJsdWVcIjogWzI1LCAyNSwgMTEyXSxcclxuXHRcIm1pbnRjcmVhbVwiOiBbMjQ1LCAyNTUsIDI1MF0sXHJcblx0XCJtaXN0eXJvc2VcIjogWzI1NSwgMjI4LCAyMjVdLFxyXG5cdFwibW9jY2FzaW5cIjogWzI1NSwgMjI4LCAxODFdLFxyXG5cdFwibmF2YWpvd2hpdGVcIjogWzI1NSwgMjIyLCAxNzNdLFxyXG5cdFwibmF2eVwiOiBbMCwgMCwgMTI4XSxcclxuXHRcIm9sZGxhY2VcIjogWzI1MywgMjQ1LCAyMzBdLFxyXG5cdFwib2xpdmVcIjogWzEyOCwgMTI4LCAwXSxcclxuXHRcIm9saXZlZHJhYlwiOiBbMTA3LCAxNDIsIDM1XSxcclxuXHRcIm9yYW5nZVwiOiBbMjU1LCAxNjUsIDBdLFxyXG5cdFwib3JhbmdlcmVkXCI6IFsyNTUsIDY5LCAwXSxcclxuXHRcIm9yY2hpZFwiOiBbMjE4LCAxMTIsIDIxNF0sXHJcblx0XCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsIDIzMiwgMTcwXSxcclxuXHRcInBhbGVncmVlblwiOiBbMTUyLCAyNTEsIDE1Ml0sXHJcblx0XCJwYWxldHVycXVvaXNlXCI6IFsxNzUsIDIzOCwgMjM4XSxcclxuXHRcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwgMTEyLCAxNDddLFxyXG5cdFwicGFwYXlhd2hpcFwiOiBbMjU1LCAyMzksIDIxM10sXHJcblx0XCJwZWFjaHB1ZmZcIjogWzI1NSwgMjE4LCAxODVdLFxyXG5cdFwicGVydVwiOiBbMjA1LCAxMzMsIDYzXSxcclxuXHRcInBpbmtcIjogWzI1NSwgMTkyLCAyMDNdLFxyXG5cdFwicGx1bVwiOiBbMjIxLCAxNjAsIDIyMV0sXHJcblx0XCJwb3dkZXJibHVlXCI6IFsxNzYsIDIyNCwgMjMwXSxcclxuXHRcInB1cnBsZVwiOiBbMTI4LCAwLCAxMjhdLFxyXG5cdFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLCA1MSwgMTUzXSxcclxuXHRcInJlZFwiOiBbMjU1LCAwLCAwXSxcclxuXHRcInJvc3licm93blwiOiBbMTg4LCAxNDMsIDE0M10sXHJcblx0XCJyb3lhbGJsdWVcIjogWzY1LCAxMDUsIDIyNV0sXHJcblx0XCJzYWRkbGVicm93blwiOiBbMTM5LCA2OSwgMTldLFxyXG5cdFwic2FsbW9uXCI6IFsyNTAsIDEyOCwgMTE0XSxcclxuXHRcInNhbmR5YnJvd25cIjogWzI0NCwgMTY0LCA5Nl0sXHJcblx0XCJzZWFncmVlblwiOiBbNDYsIDEzOSwgODddLFxyXG5cdFwic2Vhc2hlbGxcIjogWzI1NSwgMjQ1LCAyMzhdLFxyXG5cdFwic2llbm5hXCI6IFsxNjAsIDgyLCA0NV0sXHJcblx0XCJzaWx2ZXJcIjogWzE5MiwgMTkyLCAxOTJdLFxyXG5cdFwic2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDIzNV0sXHJcblx0XCJzbGF0ZWJsdWVcIjogWzEwNiwgOTAsIDIwNV0sXHJcblx0XCJzbGF0ZWdyYXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic2xhdGVncmV5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNub3dcIjogWzI1NSwgMjUwLCAyNTBdLFxyXG5cdFwic3ByaW5nZ3JlZW5cIjogWzAsIDI1NSwgMTI3XSxcclxuXHRcInN0ZWVsYmx1ZVwiOiBbNzAsIDEzMCwgMTgwXSxcclxuXHRcInRhblwiOiBbMjEwLCAxODAsIDE0MF0sXHJcblx0XCJ0ZWFsXCI6IFswLCAxMjgsIDEyOF0sXHJcblx0XCJ0aGlzdGxlXCI6IFsyMTYsIDE5MSwgMjE2XSxcclxuXHRcInRvbWF0b1wiOiBbMjU1LCA5OSwgNzFdLFxyXG5cdFwidHVycXVvaXNlXCI6IFs2NCwgMjI0LCAyMDhdLFxyXG5cdFwidmlvbGV0XCI6IFsyMzgsIDEzMCwgMjM4XSxcclxuXHRcIndoZWF0XCI6IFsyNDUsIDIyMiwgMTc5XSxcclxuXHRcIndoaXRlXCI6IFsyNTUsIDI1NSwgMjU1XSxcclxuXHRcIndoaXRlc21va2VcIjogWzI0NSwgMjQ1LCAyNDVdLFxyXG5cdFwieWVsbG93XCI6IFsyNTUsIDI1NSwgMF0sXHJcblx0XCJ5ZWxsb3dncmVlblwiOiBbMTU0LCAyMDUsIDUwXVxyXG59O1xyXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubWFrZURhdGFVcmlUb0J1ZmZlciA9IHZvaWQgMDtcbi8qKlxuICogUmV0dXJucyBhIGBCdWZmZXJgIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIGRhdGEgVVJJIGB1cmlgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgRGF0YSBVUkkgdG8gdHVybiBpbnRvIGEgQnVmZmVyIGluc3RhbmNlXG4gKi9cbmNvbnN0IG1ha2VEYXRhVXJpVG9CdWZmZXIgPSAoY29udmVydCkgPT4gKHVyaSkgPT4ge1xuICAgIHVyaSA9IFN0cmluZyh1cmkpO1xuICAgIGlmICghL15kYXRhOi9pLnRlc3QodXJpKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdgdXJpYCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSBEYXRhIFVSSSAobXVzdCBiZWdpbiB3aXRoIFwiZGF0YTpcIiknKTtcbiAgICB9XG4gICAgLy8gc3RyaXAgbmV3bGluZXNcbiAgICB1cmkgPSB1cmkucmVwbGFjZSgvXFxyP1xcbi9nLCAnJyk7XG4gICAgLy8gc3BsaXQgdGhlIFVSSSB1cCBpbnRvIHRoZSBcIm1ldGFkYXRhXCIgYW5kIHRoZSBcImRhdGFcIiBwb3J0aW9uc1xuICAgIGNvbnN0IGZpcnN0Q29tbWEgPSB1cmkuaW5kZXhPZignLCcpO1xuICAgIGlmIChmaXJzdENvbW1hID09PSAtMSB8fCBmaXJzdENvbW1hIDw9IDQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWFsZm9ybWVkIGRhdGE6IFVSSScpO1xuICAgIH1cbiAgICAvLyByZW1vdmUgdGhlIFwiZGF0YTpcIiBzY2hlbWUgYW5kIHBhcnNlIHRoZSBtZXRhZGF0YVxuICAgIGNvbnN0IG1ldGEgPSB1cmkuc3Vic3RyaW5nKDUsIGZpcnN0Q29tbWEpLnNwbGl0KCc7Jyk7XG4gICAgbGV0IGNoYXJzZXQgPSAnJztcbiAgICBsZXQgYmFzZTY0ID0gZmFsc2U7XG4gICAgY29uc3QgdHlwZSA9IG1ldGFbMF0gfHwgJ3RleHQvcGxhaW4nO1xuICAgIGxldCB0eXBlRnVsbCA9IHR5cGU7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBtZXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChtZXRhW2ldID09PSAnYmFzZTY0Jykge1xuICAgICAgICAgICAgYmFzZTY0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXRhW2ldKSB7XG4gICAgICAgICAgICB0eXBlRnVsbCArPSBgOyR7bWV0YVtpXX1gO1xuICAgICAgICAgICAgaWYgKG1ldGFbaV0uaW5kZXhPZignY2hhcnNldD0nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBtZXRhW2ldLnN1YnN0cmluZyg4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBkZWZhdWx0cyB0byBVUy1BU0NJSSBvbmx5IGlmIHR5cGUgaXMgbm90IHByb3ZpZGVkXG4gICAgaWYgKCFtZXRhWzBdICYmICFjaGFyc2V0Lmxlbmd0aCkge1xuICAgICAgICB0eXBlRnVsbCArPSAnO2NoYXJzZXQ9VVMtQVNDSUknO1xuICAgICAgICBjaGFyc2V0ID0gJ1VTLUFTQ0lJJztcbiAgICB9XG4gICAgLy8gZ2V0IHRoZSBlbmNvZGVkIGRhdGEgcG9ydGlvbiBhbmQgZGVjb2RlIFVSSS1lbmNvZGVkIGNoYXJzXG4gICAgY29uc3QgZGF0YSA9IHVuZXNjYXBlKHVyaS5zdWJzdHJpbmcoZmlyc3RDb21tYSArIDEpKTtcbiAgICBjb25zdCBidWZmZXIgPSBiYXNlNjQgPyBjb252ZXJ0LmJhc2U2NFRvQXJyYXlCdWZmZXIoZGF0YSkgOiBjb252ZXJ0LnN0cmluZ1RvQnVmZmVyKGRhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHR5cGVGdWxsLFxuICAgICAgICBjaGFyc2V0LFxuICAgICAgICBidWZmZXIsXG4gICAgfTtcbn07XG5leHBvcnRzLm1ha2VEYXRhVXJpVG9CdWZmZXIgPSBtYWtlRGF0YVVyaVRvQnVmZmVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbW9uLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kYXRhVXJpVG9CdWZmZXIgPSB2b2lkIDA7XG5jb25zdCBjb21tb25fMSA9IHJlcXVpcmUoXCIuL2NvbW1vblwiKTtcbmZ1bmN0aW9uIG5vZGVCdWZmZXJ0b0FycmF5QnVmZmVyKG5vZGVCdWYpIHtcbiAgICBpZiAobm9kZUJ1Zi5ieXRlTGVuZ3RoID09PSBub2RlQnVmLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBub2RlQnVmLmJ1ZmZlcjsgLy8gbGFyZ2Ugc3RyaW5ncyBtYXkgZ2V0IHRoZWlyIG93biBtZW1vcnkgYWxsb2NhdGlvblxuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIobm9kZUJ1Zi5ieXRlTGVuZ3RoKTtcbiAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICB2aWV3LnNldChub2RlQnVmKTtcbiAgICByZXR1cm4gYnVmZmVyO1xufVxuZnVuY3Rpb24gYmFzZTY0VG9BcnJheUJ1ZmZlcihiYXNlNjQpIHtcbiAgICByZXR1cm4gbm9kZUJ1ZmZlcnRvQXJyYXlCdWZmZXIoQnVmZmVyLmZyb20oYmFzZTY0LCAnYmFzZTY0JykpO1xufVxuZnVuY3Rpb24gc3RyaW5nVG9CdWZmZXIoc3RyKSB7XG4gICAgcmV0dXJuIG5vZGVCdWZmZXJ0b0FycmF5QnVmZmVyKEJ1ZmZlci5mcm9tKHN0ciwgJ2FzY2lpJykpO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgYEJ1ZmZlcmAgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gZGF0YSBVUkkgYHVyaWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVyaSBEYXRhIFVSSSB0byB0dXJuIGludG8gYSBCdWZmZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0cy5kYXRhVXJpVG9CdWZmZXIgPSAoMCwgY29tbW9uXzEubWFrZURhdGFVcmlUb0J1ZmZlcikoeyBzdHJpbmdUb0J1ZmZlciwgYmFzZTY0VG9BcnJheUJ1ZmZlciB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vZGUuanMubWFwIiwiLyogZXNsaW50LWVudiBicm93c2VyICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gbG9jYWxzdG9yYWdlKCk7XG5leHBvcnRzLmRlc3Ryb3kgPSAoKCkgPT4ge1xuXHRsZXQgd2FybmVkID0gZmFsc2U7XG5cblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoIXdhcm5lZCkge1xuXHRcdFx0d2FybmVkID0gdHJ1ZTtcblx0XHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHRcdH1cblx0fTtcbn0pKCk7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuXHQnIzAwMDBDQycsXG5cdCcjMDAwMEZGJyxcblx0JyMwMDMzQ0MnLFxuXHQnIzAwMzNGRicsXG5cdCcjMDA2NkNDJyxcblx0JyMwMDY2RkYnLFxuXHQnIzAwOTlDQycsXG5cdCcjMDA5OUZGJyxcblx0JyMwMENDMDAnLFxuXHQnIzAwQ0MzMycsXG5cdCcjMDBDQzY2Jyxcblx0JyMwMENDOTknLFxuXHQnIzAwQ0NDQycsXG5cdCcjMDBDQ0ZGJyxcblx0JyMzMzAwQ0MnLFxuXHQnIzMzMDBGRicsXG5cdCcjMzMzM0NDJyxcblx0JyMzMzMzRkYnLFxuXHQnIzMzNjZDQycsXG5cdCcjMzM2NkZGJyxcblx0JyMzMzk5Q0MnLFxuXHQnIzMzOTlGRicsXG5cdCcjMzNDQzAwJyxcblx0JyMzM0NDMzMnLFxuXHQnIzMzQ0M2NicsXG5cdCcjMzNDQzk5Jyxcblx0JyMzM0NDQ0MnLFxuXHQnIzMzQ0NGRicsXG5cdCcjNjYwMENDJyxcblx0JyM2NjAwRkYnLFxuXHQnIzY2MzNDQycsXG5cdCcjNjYzM0ZGJyxcblx0JyM2NkNDMDAnLFxuXHQnIzY2Q0MzMycsXG5cdCcjOTkwMENDJyxcblx0JyM5OTAwRkYnLFxuXHQnIzk5MzNDQycsXG5cdCcjOTkzM0ZGJyxcblx0JyM5OUNDMDAnLFxuXHQnIzk5Q0MzMycsXG5cdCcjQ0MwMDAwJyxcblx0JyNDQzAwMzMnLFxuXHQnI0NDMDA2NicsXG5cdCcjQ0MwMDk5Jyxcblx0JyNDQzAwQ0MnLFxuXHQnI0NDMDBGRicsXG5cdCcjQ0MzMzAwJyxcblx0JyNDQzMzMzMnLFxuXHQnI0NDMzM2NicsXG5cdCcjQ0MzMzk5Jyxcblx0JyNDQzMzQ0MnLFxuXHQnI0NDMzNGRicsXG5cdCcjQ0M2NjAwJyxcblx0JyNDQzY2MzMnLFxuXHQnI0NDOTkwMCcsXG5cdCcjQ0M5OTMzJyxcblx0JyNDQ0NDMDAnLFxuXHQnI0NDQ0MzMycsXG5cdCcjRkYwMDAwJyxcblx0JyNGRjAwMzMnLFxuXHQnI0ZGMDA2NicsXG5cdCcjRkYwMDk5Jyxcblx0JyNGRjAwQ0MnLFxuXHQnI0ZGMDBGRicsXG5cdCcjRkYzMzAwJyxcblx0JyNGRjMzMzMnLFxuXHQnI0ZGMzM2NicsXG5cdCcjRkYzMzk5Jyxcblx0JyNGRjMzQ0MnLFxuXHQnI0ZGMzNGRicsXG5cdCcjRkY2NjAwJyxcblx0JyNGRjY2MzMnLFxuXHQnI0ZGOTkwMCcsXG5cdCcjRkY5OTMzJyxcblx0JyNGRkNDMDAnLFxuXHQnI0ZGQ0MzMydcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0Ly8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuXHQvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuXHQvLyBleHBsaWNpdGx5XG5cdGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiAod2luZG93LnByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCB3aW5kb3cucHJvY2Vzcy5fX253anMpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBJbnRlcm5ldCBFeHBsb3JlciBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydCBjb2xvcnMuXG5cdGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcXC8oXFxkKykvKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGxldCBtO1xuXG5cdC8vIElzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG5cdC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG5cdHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuXHRcdC8vIElzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcblx0XHQodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuXHRcdC8vIElzIGZpcmVmb3ggPj0gdjMxP1xuXHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIChtID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykpICYmIHBhcnNlSW50KG1bMV0sIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGRlYnVnIGluc3RhbmNlIHRvIGJlIGNvbG9yZWRcblx0KiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBBbiBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG5cdFx0bGV0IGhhc2ggPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcblx0XHR9XG5cblx0XHRyZXR1cm4gY3JlYXRlRGVidWcuY29sb3JzW01hdGguYWJzKGhhc2gpICUgY3JlYXRlRGVidWcuY29sb3JzLmxlbmd0aF07XG5cdH1cblx0Y3JlYXRlRGVidWcuc2VsZWN0Q29sb3IgPSBzZWxlY3RDb2xvcjtcblxuXHQvKipcblx0KiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblx0XHRsZXQgcHJldlRpbWU7XG5cdFx0bGV0IGVuYWJsZU92ZXJyaWRlID0gbnVsbDtcblx0XHRsZXQgbmFtZXNwYWNlc0NhY2hlO1xuXHRcdGxldCBlbmFibGVkQ2FjaGU7XG5cblx0XHRmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG5cdFx0XHQvLyBEaXNhYmxlZD9cblx0XHRcdGlmICghZGVidWcuZW5hYmxlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNlbGYgPSBkZWJ1ZztcblxuXHRcdFx0Ly8gU2V0IGBkaWZmYCB0aW1lc3RhbXBcblx0XHRcdGNvbnN0IGN1cnIgPSBOdW1iZXIobmV3IERhdGUoKSk7XG5cdFx0XHRjb25zdCBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG5cdFx0XHRzZWxmLmRpZmYgPSBtcztcblx0XHRcdHNlbGYucHJldiA9IHByZXZUaW1lO1xuXHRcdFx0c2VsZi5jdXJyID0gY3Vycjtcblx0XHRcdHByZXZUaW1lID0gY3VycjtcblxuXHRcdFx0YXJnc1swXSA9IGNyZWF0ZURlYnVnLmNvZXJjZShhcmdzWzBdKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdFx0XHRhcmdzLnVuc2hpZnQoJyVPJyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0YXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIChtYXRjaCwgZm9ybWF0KSA9PiB7XG5cdFx0XHRcdC8vIElmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcblx0XHRcdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuICclJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZXIgPSBjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cdFx0XHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gYXJnc1tpbmRleF07XG5cdFx0XHRcdFx0bWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG5cdFx0XHRcdFx0Ly8gTm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuXHRcdFx0XHRcdGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdFx0XHRpbmRleC0tO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtYXRjaDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuXHRcdFx0Y3JlYXRlRGVidWcuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG5cdFx0XHRjb25zdCBsb2dGbiA9IHNlbGYubG9nIHx8IGNyZWF0ZURlYnVnLmxvZztcblx0XHRcdGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdH1cblxuXHRcdGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblx0XHRkZWJ1Zy51c2VDb2xvcnMgPSBjcmVhdGVEZWJ1Zy51c2VDb2xvcnMoKTtcblx0XHRkZWJ1Zy5jb2xvciA9IGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cdFx0ZGVidWcuZXh0ZW5kID0gZXh0ZW5kO1xuXHRcdGRlYnVnLmRlc3Ryb3kgPSBjcmVhdGVEZWJ1Zy5kZXN0cm95OyAvLyBYWFggVGVtcG9yYXJ5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWJ1ZywgJ2VuYWJsZWQnLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoZW5hYmxlT3ZlcnJpZGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW5hYmxlT3ZlcnJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5hbWVzcGFjZXNDYWNoZSAhPT0gY3JlYXRlRGVidWcubmFtZXNwYWNlcykge1xuXHRcdFx0XHRcdG5hbWVzcGFjZXNDYWNoZSA9IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXM7XG5cdFx0XHRcdFx0ZW5hYmxlZENhY2hlID0gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVuYWJsZWRDYWNoZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cdFx0Y3JlYXRlRGVidWcubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zbGljZSgxKSArICckJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLm1hcCh0b05hbWVzcGFjZSksXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5za2lwcy5tYXAodG9OYW1lc3BhY2UpLm1hcChuYW1lc3BhY2UgPT4gJy0nICsgbmFtZXNwYWNlKVxuXHRcdF0uam9pbignLCcpO1xuXHRcdGNyZWF0ZURlYnVnLmVuYWJsZSgnJyk7XG5cdFx0cmV0dXJuIG5hbWVzcGFjZXM7XG5cdH1cblxuXHQvKipcblx0KiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHQqIEByZXR1cm4ge0Jvb2xlYW59XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG5cdFx0aWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRsZXQgaTtcblx0XHRsZXQgbGVuO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCogQ29udmVydCByZWdleHAgdG8gbmFtZXNwYWNlXG5cdCpcblx0KiBAcGFyYW0ge1JlZ0V4cH0gcmVneGVwXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gdG9OYW1lc3BhY2UocmVnZXhwKSB7XG5cdFx0cmV0dXJuIHJlZ2V4cC50b1N0cmluZygpXG5cdFx0XHQuc3Vic3RyaW5nKDIsIHJlZ2V4cC50b1N0cmluZygpLmxlbmd0aCAtIDIpXG5cdFx0XHQucmVwbGFjZSgvXFwuXFwqXFw/JC8sICcqJyk7XG5cdH1cblxuXHQvKipcblx0KiBDb2VyY2UgYHZhbGAuXG5cdCpcblx0KiBAcGFyYW0ge01peGVkfSB2YWxcblx0KiBAcmV0dXJuIHtNaXhlZH1cblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0cmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxuXG5cdC8qKlxuXHQqIFhYWCBETyBOT1QgVVNFLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0dWIgZnVuY3Rpb24uXG5cdCogWFhYIEl0IFdJTEwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXHQqL1xuXHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHR9XG5cblx0Y3JlYXRlRGVidWcuZW5hYmxlKGNyZWF0ZURlYnVnLmxvYWQoKSk7XG5cblx0cmV0dXJuIGNyZWF0ZURlYnVnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHVwO1xuIiwiLyoqXG4gKiBEZXRlY3QgRWxlY3Ryb24gcmVuZGVyZXIgLyBud2pzIHByb2Nlc3MsIHdoaWNoIGlzIG5vZGUsIGJ1dCB3ZSBzaG91bGRcbiAqIHRyZWF0IGFzIGEgYnJvd3Nlci5cbiAqL1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8IHByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCBwcm9jZXNzLmJyb3dzZXIgPT09IHRydWUgfHwgcHJvY2Vzcy5fX253anMpIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Jyb3dzZXIuanMnKTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9ub2RlLmpzJyk7XG59XG4iLCIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxuY29uc3QgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5kZXN0cm95ID0gdXRpbC5kZXByZWNhdGUoXG5cdCgpID0+IHt9LFxuXHQnSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLidcbik7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gWzYsIDIsIDMsIDQsIDUsIDFdO1xuXG50cnkge1xuXHQvLyBPcHRpb25hbCBkZXBlbmRlbmN5IChhcyBpbiwgZG9lc24ndCBuZWVkIHRvIGJlIGluc3RhbGxlZCwgTk9UIGxpa2Ugb3B0aW9uYWxEZXBlbmRlbmNpZXMgaW4gcGFja2FnZS5qc29uKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5cdGNvbnN0IHN1cHBvcnRzQ29sb3IgPSByZXF1aXJlKCdzdXBwb3J0cy1jb2xvcicpO1xuXG5cdGlmIChzdXBwb3J0c0NvbG9yICYmIChzdXBwb3J0c0NvbG9yLnN0ZGVyciB8fCBzdXBwb3J0c0NvbG9yKS5sZXZlbCA+PSAyKSB7XG5cdFx0ZXhwb3J0cy5jb2xvcnMgPSBbXG5cdFx0XHQyMCxcblx0XHRcdDIxLFxuXHRcdFx0MjYsXG5cdFx0XHQyNyxcblx0XHRcdDMyLFxuXHRcdFx0MzMsXG5cdFx0XHQzOCxcblx0XHRcdDM5LFxuXHRcdFx0NDAsXG5cdFx0XHQ0MSxcblx0XHRcdDQyLFxuXHRcdFx0NDMsXG5cdFx0XHQ0NCxcblx0XHRcdDQ1LFxuXHRcdFx0NTYsXG5cdFx0XHQ1Nyxcblx0XHRcdDYyLFxuXHRcdFx0NjMsXG5cdFx0XHQ2OCxcblx0XHRcdDY5LFxuXHRcdFx0NzQsXG5cdFx0XHQ3NSxcblx0XHRcdDc2LFxuXHRcdFx0NzcsXG5cdFx0XHQ3OCxcblx0XHRcdDc5LFxuXHRcdFx0ODAsXG5cdFx0XHQ4MSxcblx0XHRcdDkyLFxuXHRcdFx0OTMsXG5cdFx0XHQ5OCxcblx0XHRcdDk5LFxuXHRcdFx0MTEyLFxuXHRcdFx0MTEzLFxuXHRcdFx0MTI4LFxuXHRcdFx0MTI5LFxuXHRcdFx0MTM0LFxuXHRcdFx0MTM1LFxuXHRcdFx0MTQ4LFxuXHRcdFx0MTQ5LFxuXHRcdFx0MTYwLFxuXHRcdFx0MTYxLFxuXHRcdFx0MTYyLFxuXHRcdFx0MTYzLFxuXHRcdFx0MTY0LFxuXHRcdFx0MTY1LFxuXHRcdFx0MTY2LFxuXHRcdFx0MTY3LFxuXHRcdFx0MTY4LFxuXHRcdFx0MTY5LFxuXHRcdFx0MTcwLFxuXHRcdFx0MTcxLFxuXHRcdFx0MTcyLFxuXHRcdFx0MTczLFxuXHRcdFx0MTc4LFxuXHRcdFx0MTc5LFxuXHRcdFx0MTg0LFxuXHRcdFx0MTg1LFxuXHRcdFx0MTk2LFxuXHRcdFx0MTk3LFxuXHRcdFx0MTk4LFxuXHRcdFx0MTk5LFxuXHRcdFx0MjAwLFxuXHRcdFx0MjAxLFxuXHRcdFx0MjAyLFxuXHRcdFx0MjAzLFxuXHRcdFx0MjA0LFxuXHRcdFx0MjA1LFxuXHRcdFx0MjA2LFxuXHRcdFx0MjA3LFxuXHRcdFx0MjA4LFxuXHRcdFx0MjA5LFxuXHRcdFx0MjE0LFxuXHRcdFx0MjE1LFxuXHRcdFx0MjIwLFxuXHRcdFx0MjIxXG5cdFx0XTtcblx0fVxufSBjYXRjaCAoZXJyb3IpIHtcblx0Ly8gU3dhbGxvdyAtIHdlIG9ubHkgY2FyZSBpZiBgc3VwcG9ydHMtY29sb3JgIGlzIGF2YWlsYWJsZTsgaXQgZG9lc24ndCBoYXZlIHRvIGJlLlxufVxuXG4vKipcbiAqIEJ1aWxkIHVwIHRoZSBkZWZhdWx0IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiAgICQgREVCVUdfQ09MT1JTPW5vIERFQlVHX0RFUFRIPTEwIERFQlVHX1NIT1dfSElEREVOPWVuYWJsZWQgbm9kZSBzY3JpcHQuanNcbiAqL1xuXG5leHBvcnRzLmluc3BlY3RPcHRzID0gT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmZpbHRlcihrZXkgPT4ge1xuXHRyZXR1cm4gL15kZWJ1Z18vaS50ZXN0KGtleSk7XG59KS5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XG5cdC8vIENhbWVsLWNhc2Vcblx0Y29uc3QgcHJvcCA9IGtleVxuXHRcdC5zdWJzdHJpbmcoNilcblx0XHQudG9Mb3dlckNhc2UoKVxuXHRcdC5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgaykgPT4ge1xuXHRcdFx0cmV0dXJuIGsudG9VcHBlckNhc2UoKTtcblx0XHR9KTtcblxuXHQvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlIGludG8gSlMgdmFsdWVcblx0bGV0IHZhbCA9IHByb2Nlc3MuZW52W2tleV07XG5cdGlmICgvXih5ZXN8b258dHJ1ZXxlbmFibGVkKSQvaS50ZXN0KHZhbCkpIHtcblx0XHR2YWwgPSB0cnVlO1xuXHR9IGVsc2UgaWYgKC9eKG5vfG9mZnxmYWxzZXxkaXNhYmxlZCkkL2kudGVzdCh2YWwpKSB7XG5cdFx0dmFsID0gZmFsc2U7XG5cdH0gZWxzZSBpZiAodmFsID09PSAnbnVsbCcpIHtcblx0XHR2YWwgPSBudWxsO1xuXHR9IGVsc2Uge1xuXHRcdHZhbCA9IE51bWJlcih2YWwpO1xuXHR9XG5cblx0b2JqW3Byb3BdID0gdmFsO1xuXHRyZXR1cm4gb2JqO1xufSwge30pO1xuXG4vKipcbiAqIElzIHN0ZG91dCBhIFRUWT8gQ29sb3JlZCBvdXRwdXQgaXMgZW5hYmxlZCB3aGVuIGB0cnVlYC5cbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdHJldHVybiAnY29sb3JzJyBpbiBleHBvcnRzLmluc3BlY3RPcHRzID9cblx0XHRCb29sZWFuKGV4cG9ydHMuaW5zcGVjdE9wdHMuY29sb3JzKSA6XG5cdFx0dHR5LmlzYXR0eShwcm9jZXNzLnN0ZGVyci5mZCk7XG59XG5cbi8qKlxuICogQWRkcyBBTlNJIGNvbG9yIGVzY2FwZSBjb2RlcyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdGNvbnN0IHtuYW1lc3BhY2U6IG5hbWUsIHVzZUNvbG9yc30gPSB0aGlzO1xuXG5cdGlmICh1c2VDb2xvcnMpIHtcblx0XHRjb25zdCBjID0gdGhpcy5jb2xvcjtcblx0XHRjb25zdCBjb2xvckNvZGUgPSAnXFx1MDAxQlszJyArIChjIDwgOCA/IGMgOiAnODs1OycgKyBjKTtcblx0XHRjb25zdCBwcmVmaXggPSBgICAke2NvbG9yQ29kZX07MW0ke25hbWV9IFxcdTAwMUJbMG1gO1xuXG5cdFx0YXJnc1swXSA9IHByZWZpeCArIGFyZ3NbMF0uc3BsaXQoJ1xcbicpLmpvaW4oJ1xcbicgKyBwcmVmaXgpO1xuXHRcdGFyZ3MucHVzaChjb2xvckNvZGUgKyAnbSsnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKSArICdcXHUwMDFCWzBtJyk7XG5cdH0gZWxzZSB7XG5cdFx0YXJnc1swXSA9IGdldERhdGUoKSArIG5hbWUgKyAnICcgKyBhcmdzWzBdO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldERhdGUoKSB7XG5cdGlmIChleHBvcnRzLmluc3BlY3RPcHRzLmhpZGVEYXRlKSB7XG5cdFx0cmV0dXJuICcnO1xuXHR9XG5cdHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgKyAnICc7XG59XG5cbi8qKlxuICogSW52b2tlcyBgdXRpbC5mb3JtYXRXaXRoT3B0aW9ucygpYCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIGFuZCB3cml0ZXMgdG8gc3RkZXJyLlxuICovXG5cbmZ1bmN0aW9uIGxvZyguLi5hcmdzKSB7XG5cdHJldHVybiBwcm9jZXNzLnN0ZGVyci53cml0ZSh1dGlsLmZvcm1hdFdpdGhPcHRpb25zKGV4cG9ydHMuaW5zcGVjdE9wdHMsIC4uLmFyZ3MpICsgJ1xcbicpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0cHJvY2Vzcy5lbnYuREVCVUcgPSBuYW1lc3BhY2VzO1xuXHR9IGVsc2Uge1xuXHRcdC8vIElmIHlvdSBzZXQgYSBwcm9jZXNzLmVudiBmaWVsZCB0byBudWxsIG9yIHVuZGVmaW5lZCwgaXQgZ2V0cyBjYXN0IHRvIHRoZVxuXHRcdC8vIHN0cmluZyAnbnVsbCcgb3IgJ3VuZGVmaW5lZCcuIEp1c3QgZGVsZXRlIGluc3RlYWQuXG5cdFx0ZGVsZXRlIHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcblx0cmV0dXJuIHByb2Nlc3MuZW52LkRFQlVHO1xufVxuXG4vKipcbiAqIEluaXQgbG9naWMgZm9yIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuICpcbiAqIENyZWF0ZSBhIG5ldyBgaW5zcGVjdE9wdHNgIG9iamVjdCBpbiBjYXNlIGB1c2VDb2xvcnNgIGlzIHNldFxuICogZGlmZmVyZW50bHkgZm9yIGEgcGFydGljdWxhciBgZGVidWdgIGluc3RhbmNlLlxuICovXG5cbmZ1bmN0aW9uIGluaXQoZGVidWcpIHtcblx0ZGVidWcuaW5zcGVjdE9wdHMgPSB7fTtcblxuXHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXhwb3J0cy5pbnNwZWN0T3B0cyk7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdGRlYnVnLmluc3BlY3RPcHRzW2tleXNbaV1dID0gZXhwb3J0cy5pbnNwZWN0T3B0c1trZXlzW2ldXTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlbyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGwgb24gYSBzaW5nbGUgbGluZS5cbiAqL1xuXG5mb3JtYXR0ZXJzLm8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpXG5cdFx0LnNwbGl0KCdcXG4nKVxuXHRcdC5tYXAoc3RyID0+IHN0ci50cmltKCkpXG5cdFx0LmpvaW4oJyAnKTtcbn07XG5cbi8qKlxuICogTWFwICVPIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbG93aW5nIG11bHRpcGxlIGxpbmVzIGlmIG5lZWRlZC5cbiAqL1xuXG5mb3JtYXR0ZXJzLk8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jb21waWxlID0gdm9pZCAwO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcInV0aWxcIik7XG5jb25zdCBkZWdlbmVyYXRvcl8xID0gcmVxdWlyZShcIi4vZGVnZW5lcmF0b3JcIik7XG5mdW5jdGlvbiBjb21waWxlKHFqcywgY29kZSwgcmV0dXJuTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgY29tcGlsZWQgPSAoMCwgZGVnZW5lcmF0b3JfMS5kZWdlbmVyYXRvcikoY29kZSwgb3B0aW9ucy5uYW1lcyA/PyBbXSk7XG4gICAgY29uc3Qgdm0gPSBxanMubmV3Q29udGV4dCgpO1xuICAgIC8vIEFkZCBmdW5jdGlvbnMgdG8gZ2xvYmFsXG4gICAgaWYgKG9wdGlvbnMuc2FuZGJveCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5zYW5kYm94KSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBcImZ1bmN0aW9uXCIgZm9yIHNhbmRib3ggcHJvcGVydHkgXFxgJHtuYW1lfVxcYCwgYnV0IGdvdCBcIiR7dHlwZW9mIHZhbHVlfVwiYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmbkhhbmRsZSA9IHZtLm5ld0Z1bmN0aW9uKG5hbWUsICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUoLi4uYXJncy5tYXAoKGFyZykgPT4gcXVpY2tKU0hhbmRsZVRvSG9zdCh2bSwgYXJnKSkpO1xuICAgICAgICAgICAgICAgIHZtLnJ1bnRpbWUuZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvc3RUb1F1aWNrSlNIYW5kbGUodm0sIHJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZuSGFuZGxlLmNvbnN1bWUoKGhhbmRsZSkgPT4gdm0uc2V0UHJvcCh2bS5nbG9iYWwsIG5hbWUsIGhhbmRsZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGZuUmVzdWx0ID0gdm0uZXZhbENvZGUoYCR7Y29tcGlsZWR9OyR7cmV0dXJuTmFtZX1gLCBvcHRpb25zLmZpbGVuYW1lKTtcbiAgICBjb25zdCBmbiA9IHZtLnVud3JhcFJlc3VsdChmblJlc3VsdCk7XG4gICAgY29uc3QgdCA9IHZtLnR5cGVvZihmbik7XG4gICAgaWYgKHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIFwiZnVuY3Rpb25cIiBuYW1lZCBcXGAke3JldHVybk5hbWV9XFxgIHRvIGJlIGRlZmluZWQsIGJ1dCBnb3QgXCIke3R9XCJgKTtcbiAgICB9XG4gICAgY29uc3QgciA9IGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGxldCBwcm9taXNlSGFuZGxlO1xuICAgICAgICBsZXQgcmVzb2x2ZWRIYW5kbGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB2bS5jYWxsRnVuY3Rpb24oZm4sIHZtLnVuZGVmaW5lZCwgLi4uYXJncy5tYXAoKGFyZykgPT4gaG9zdFRvUXVpY2tKU0hhbmRsZSh2bSwgYXJnKSkpO1xuICAgICAgICAgICAgcHJvbWlzZUhhbmRsZSA9IHZtLnVud3JhcFJlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRSZXN1bHRQID0gdm0ucmVzb2x2ZVByb21pc2UocHJvbWlzZUhhbmRsZSk7XG4gICAgICAgICAgICB2bS5ydW50aW1lLmV4ZWN1dGVQZW5kaW5nSm9icygpO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRSZXN1bHQgPSBhd2FpdCByZXNvbHZlZFJlc3VsdFA7XG4gICAgICAgICAgICByZXNvbHZlZEhhbmRsZSA9IHZtLnVud3JhcFJlc3VsdChyZXNvbHZlZFJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm4gcXVpY2tKU0hhbmRsZVRvSG9zdCh2bSwgcmVzb2x2ZWRIYW5kbGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIgJiYgdHlwZW9mIGVyciA9PT0gJ29iamVjdCcgJiYgJ2NhdXNlJyBpbiBlcnIgJiYgZXJyLmNhdXNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnIuY2F1c2UgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgICdzdGFjaycgaW4gZXJyLmNhdXNlICYmXG4gICAgICAgICAgICAgICAgICAgICduYW1lJyBpbiBlcnIuY2F1c2UgJiZcbiAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnIGluIGVyci5jYXVzZSAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZXJyLmNhdXNlLnN0YWNrID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZXJyLmNhdXNlLm5hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBlcnIuY2F1c2UubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUXVpY2tKUyBFcnJvciBgc3RhY2tgIGRvZXMgbm90IGluY2x1ZGUgdGhlIG5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlLCBzbyBwYXRjaCB0aG9zZSBpbiB0byBiZWhhdmUgbW9yZSBsaWtlIFY4XG4gICAgICAgICAgICAgICAgICAgIGVyci5jYXVzZS5zdGFjayA9IGAke2Vyci5jYXVzZS5uYW1lfTogJHtlcnIuY2F1c2UubWVzc2FnZX1cXG4ke2Vyci5jYXVzZS5zdGFja31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnIuY2F1c2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBwcm9taXNlSGFuZGxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXNvbHZlZEhhbmRsZT8uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgJ3RvU3RyaW5nJywge1xuICAgICAgICB2YWx1ZTogKCkgPT4gY29tcGlsZWQsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByO1xufVxuZXhwb3J0cy5jb21waWxlID0gY29tcGlsZTtcbmZ1bmN0aW9uIHF1aWNrSlNIYW5kbGVUb0hvc3Qodm0sIHZhbCkge1xuICAgIHJldHVybiB2bS5kdW1wKHZhbCk7XG59XG5mdW5jdGlvbiBob3N0VG9RdWlja0pTSGFuZGxlKHZtLCB2YWwpIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHZtLnVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2bS5udWxsO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdm0ubmV3U3RyaW5nKHZhbCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB2bS5uZXdOdW1iZXIodmFsKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgcmV0dXJuIHZtLm5ld0JpZ0ludCh2YWwpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbCA/IHZtLnRydWUgOiB2bS5mYWxzZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodXRpbF8xLnR5cGVzLmlzUHJvbWlzZSh2YWwpKSB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB2bS5uZXdQcm9taXNlKCk7XG4gICAgICAgIHByb21pc2Uuc2V0dGxlZC50aGVuKHZtLnJ1bnRpbWUuZXhlY3V0ZVBlbmRpbmdKb2JzKTtcbiAgICAgICAgdmFsLnRoZW4oKHIpID0+IHtcbiAgICAgICAgICAgIHByb21pc2UucmVzb2x2ZShob3N0VG9RdWlja0pTSGFuZGxlKHZtLCByKSk7XG4gICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgIHByb21pc2UucmVqZWN0KGhvc3RUb1F1aWNrSlNIYW5kbGUodm0sIGVycikpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2UuaGFuZGxlO1xuICAgIH1cbiAgICBlbHNlIGlmICh1dGlsXzEudHlwZXMuaXNOYXRpdmVFcnJvcih2YWwpKSB7XG4gICAgICAgIHJldHVybiB2bS5uZXdFcnJvcih2YWwpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHZhbHVlOiAke3ZhbH1gKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbXBpbGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlZ2VuZXJhdG9yID0gdm9pZCAwO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcInV0aWxcIik7XG5jb25zdCBlc2NvZGVnZW5fMSA9IHJlcXVpcmUoXCJlc2NvZGVnZW5cIik7XG5jb25zdCBlc3ByaW1hXzEgPSByZXF1aXJlKFwiZXNwcmltYVwiKTtcbmNvbnN0IGFzdF90eXBlc18xID0gcmVxdWlyZShcImFzdC10eXBlc1wiKTtcbi8qKlxuICogQ29tcGlsZXMgc3luYyBKYXZhU2NyaXB0IGNvZGUgaW50byBKYXZhU2NyaXB0IHdpdGggYXN5bmMgRnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBjb2RlIEphdmFTY3JpcHQgc3RyaW5nIHRvIGNvbnZlcnRcbiAqIEBwYXJhbSB7QXJyYXl9IG5hbWVzIEFycmF5IG9mIGZ1bmN0aW9uIG5hbWVzIHRvIGFkZCBgYXdhaXRgIG9wZXJhdG9ycyB0b1xuICogQHJldHVybiB7U3RyaW5nfSBDb252ZXJ0ZWQgSmF2YVNjcmlwdCBzdHJpbmcgd2l0aCBhc3luYy9hd2FpdCBpbmplY3RlZFxuICogQGFwaSBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gZGVnZW5lcmF0b3IoY29kZSwgX25hbWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KF9uYW1lcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYW4gYXJyYXkgb2YgYXN5bmMgZnVuY3Rpb24gXCJuYW1lc1wiIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIC8vIER1cGxpY2F0ZSB0aGUgYG5hbWVzYCBhcnJheSBzaW5jZSBpdCdzIHJ1ZGUgdG8gYXVnbWVudCB0aGUgdXNlciBhcmdzXG4gICAgY29uc3QgbmFtZXMgPSBfbmFtZXMuc2xpY2UoMCk7XG4gICAgY29uc3QgYXN0ID0gKDAsIGVzcHJpbWFfMS5wYXJzZVNjcmlwdCkoY29kZSk7XG4gICAgLy8gRmlyc3QgcGFzcyBpcyB0byBmaW5kIHRoZSBgZnVuY3Rpb25gIG5vZGVzIGFuZCB0dXJuIHRoZW0gaW50byBhc3luYyBvclxuICAgIC8vIGdlbmVyYXRvciBmdW5jdGlvbnMgb25seSBpZiB0aGVpciBib2R5IGluY2x1ZGVzIGBDYWxsRXhwcmVzc2lvbnNgIHRvXG4gICAgLy8gZnVuY3Rpb24gaW4gYG5hbWVzYC4gV2UgYWxzbyBhZGQgdGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbnMgdG8gdGhlIGBuYW1lc2BcbiAgICAvLyBhcnJheS4gV2UnbGwgaXRlcmF0ZSBzZXZlcmFsIHRpbWUsIGFzIGV2ZXJ5IGl0ZXJhdGlvbiBtaWdodCBhZGQgbmV3IGl0ZW1zXG4gICAgLy8gdG8gdGhlIGBuYW1lc2AgYXJyYXksIHVudGlsIG5vIG5ldyBuYW1lcyB3ZXJlIGFkZGVkIGluIHRoZSBpdGVyYXRpb24uXG4gICAgbGV0IGxhc3ROYW1lc0xlbmd0aCA9IDA7XG4gICAgZG8ge1xuICAgICAgICBsYXN0TmFtZXNMZW5ndGggPSBuYW1lcy5sZW5ndGg7XG4gICAgICAgICgwLCBhc3RfdHlwZXNfMS52aXNpdCkoYXN0LCB7XG4gICAgICAgICAgICB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24ocGF0aCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoLm5vZGUuZGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5ub2RlLmRlY2xhcmF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjbGFyYXRpb24gPSBwYXRoLm5vZGUuZGVjbGFyYXRpb25zW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFzdF90eXBlc18xLm5hbWVkVHlwZXMuVmFyaWFibGVEZWNsYXJhdG9yLmNoZWNrKGRlY2xhcmF0aW9uKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdF90eXBlc18xLm5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhkZWNsYXJhdGlvbi5pbml0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdF90eXBlc18xLm5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhkZWNsYXJhdGlvbi5pZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja05hbWUoZGVjbGFyYXRpb24uaW5pdC5uYW1lLCBuYW1lcykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tOYW1lKGRlY2xhcmF0aW9uLmlkLm5hbWUsIG5hbWVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLnB1c2goZGVjbGFyYXRpb24uaWQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpc2l0QXNzaWdubWVudEV4cHJlc3Npb24ocGF0aCkge1xuICAgICAgICAgICAgICAgIGlmIChhc3RfdHlwZXNfMS5uYW1lZFR5cGVzLklkZW50aWZpZXIuY2hlY2socGF0aC5ub2RlLmxlZnQpICYmXG4gICAgICAgICAgICAgICAgICAgIGFzdF90eXBlc18xLm5hbWVkVHlwZXMuSWRlbnRpZmllci5jaGVjayhwYXRoLm5vZGUucmlnaHQpICYmXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrTmFtZShwYXRoLm5vZGUucmlnaHQubmFtZSwgbmFtZXMpICYmXG4gICAgICAgICAgICAgICAgICAgICFjaGVja05hbWUocGF0aC5ub2RlLmxlZnQubmFtZSwgbmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWVzLnB1c2gocGF0aC5ub2RlLmxlZnQubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2aXNpdEZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgICAgICAgICBpZiAocGF0aC5ub2RlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzaG91bGREZWdlbmVyYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICgwLCBhc3RfdHlwZXNfMS52aXNpdCkocGF0aC5ub2RlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpdENhbGxFeHByZXNzaW9uKHBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tOYW1lcyhwYXRoLm5vZGUsIG5hbWVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGREZWdlbmVyYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkRGVnZW5lcmF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEdvdCBhIFwiZnVuY3Rpb25cIiBleHByZXNzaW9uL3N0YXRlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCBpdCBpbnRvIGFuIGFzeW5jIGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgIHBhdGgubm9kZS5hc3luYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBmdW5jdGlvbiBuYW1lIHRvIGBuYW1lc2AgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja05hbWUocGF0aC5ub2RlLmlkLm5hbWUsIG5hbWVzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMucHVzaChwYXRoLm5vZGUuaWQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50cmF2ZXJzZShwYXRoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH0gd2hpbGUgKGxhc3ROYW1lc0xlbmd0aCAhPT0gbmFtZXMubGVuZ3RoKTtcbiAgICAvLyBTZWNvbmQgcGFzcyBpcyBmb3IgYWRkaW5nIGBhd2FpdGAgc3RhdGVtZW50cyB0byBhbnkgZnVuY3Rpb25cbiAgICAvLyBpbnZvY2F0aW9ucyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBgbmFtZXNgIGFycmF5LlxuICAgICgwLCBhc3RfdHlwZXNfMS52aXNpdCkoYXN0LCB7XG4gICAgICAgIHZpc2l0Q2FsbEV4cHJlc3Npb24ocGF0aCkge1xuICAgICAgICAgICAgaWYgKGNoZWNrTmFtZXMocGF0aC5ub2RlLCBuYW1lcykpIHtcbiAgICAgICAgICAgICAgICAvLyBBIFwiZnVuY3Rpb24gaW52b2NhdGlvblwiIGV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBpbmplY3QgYW4gYEF3YWl0RXhwcmVzc2lvbmBcbiAgICAgICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgcGFyZW50OiB7IG5vZGU6IHBOb2RlIH0sIH0gPSBwYXRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cHIgPSBhc3RfdHlwZXNfMS5idWlsZGVycy5hd2FpdEV4cHJlc3Npb24ocGF0aC5ub2RlLCBkZWxlZ2F0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFzdF90eXBlc18xLm5hbWVkVHlwZXMuQ2FsbEV4cHJlc3Npb24uY2hlY2socE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBOb2RlLmFyZ3VtZW50c1tuYW1lXSA9IGV4cHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwTm9kZVtuYW1lXSA9IGV4cHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cmF2ZXJzZShwYXRoKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gKDAsIGVzY29kZWdlbl8xLmdlbmVyYXRlKShhc3QpO1xufVxuZXhwb3J0cy5kZWdlbmVyYXRvciA9IGRlZ2VuZXJhdG9yO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiBgbm9kZWAgaGFzIGEgbWF0Y2hpbmcgbmFtZSB0byBvbmUgb2YgdGhlIGVudHJpZXMgaW4gdGhlXG4gKiBgbmFtZXNgIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7dHlwZXMuTm9kZX0gbm9kZVxuICogQHBhcmFtIHtBcnJheX0gbmFtZXMgQXJyYXkgb2YgZnVuY3Rpb24gbmFtZXMgdG8gcmV0dXJuIHRydWUgZm9yXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTmFtZXMoeyBjYWxsZWUgfSwgbmFtZXMpIHtcbiAgICBsZXQgbmFtZTtcbiAgICBpZiAoYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKGNhbGxlZSkpIHtcbiAgICAgICAgbmFtZSA9IGNhbGxlZS5uYW1lO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3RfdHlwZXNfMS5uYW1lZFR5cGVzLk1lbWJlckV4cHJlc3Npb24uY2hlY2soY2FsbGVlKSkge1xuICAgICAgICBpZiAoYXN0X3R5cGVzXzEubmFtZWRUeXBlcy5JZGVudGlmaWVyLmNoZWNrKGNhbGxlZS5vYmplY3QpICYmXG4gICAgICAgICAgICBhc3RfdHlwZXNfMS5uYW1lZFR5cGVzLklkZW50aWZpZXIuY2hlY2soY2FsbGVlLnByb3BlcnR5KSkge1xuICAgICAgICAgICAgbmFtZSA9IGAke2NhbGxlZS5vYmplY3QubmFtZX0uJHtjYWxsZWUucHJvcGVydHkubmFtZX1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzdF90eXBlc18xLm5hbWVkVHlwZXMuRnVuY3Rpb25FeHByZXNzaW9uLmNoZWNrKGNhbGxlZSkpIHtcbiAgICAgICAgaWYgKGNhbGxlZS5pZCkge1xuICAgICAgICAgICAgbmFtZSA9IGNhbGxlZS5pZC5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERvbid0IGtub3cgaG93IHRvIGdldCBuYW1lIGZvcjogJHtjYWxsZWUudHlwZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoZWNrTmFtZShuYW1lLCBuYW1lcyk7XG59XG5mdW5jdGlvbiBjaGVja05hbWUobmFtZSwgbmFtZXMpIHtcbiAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSBgbmFtZWAsIGNoZWNrIGlmIGFueSBlbnRyaWVzIG1hdGNoIGluIHRoZSBgbmFtZXNgIGFycmF5XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBuID0gbmFtZXNbaV07XG4gICAgICAgIGlmICh1dGlsXzEudHlwZXMuaXNSZWdFeHAobikpIHtcbiAgICAgICAgICAgIGlmIChuLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lID09PSBuKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWdlbmVyYXRvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2RlZ2VuZXJhdG9yXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9jb21waWxlXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gaHR0cHM6Ly9tdGhzLmJlL2Vtb2ppXG4gIHJldHVybiAvXFx1RDgzQ1xcdURGRjRcXHVEQjQwXFx1REM2N1xcdURCNDBcXHVEQzYyKD86XFx1REI0MFxcdURDNjVcXHVEQjQwXFx1REM2RVxcdURCNDBcXHVEQzY3fFxcdURCNDBcXHVEQzczXFx1REI0MFxcdURDNjNcXHVEQjQwXFx1REM3NHxcXHVEQjQwXFx1REM3N1xcdURCNDBcXHVEQzZDXFx1REI0MFxcdURDNzMpXFx1REI0MFxcdURDN0Z8XFx1RDgzRFxcdURDNjgoPzpcXHVEODNDXFx1REZGQ1xcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OFxcdUQ4M0NcXHVERkZCfFxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKXxcXHVEODNDXFx1REZGRlxcdTIwMEQoPzpcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNEXFx1REM2OCg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZFXSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZFXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkRdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkRcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkJcXHVERkZDXSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdTIwMEQoPzpcXHUyNzY0XFx1RkUwRlxcdTIwMEQoPzpcXHVEODNEXFx1REM4QlxcdTIwMEQpP1xcdUQ4M0RcXHVEQzY4fCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKVxcdTIwMEQoPzpcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2N1xcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSkpfFxcdUQ4M0RcXHVEQzY2XFx1MjAwRFxcdUQ4M0RcXHVEQzY2fFxcdUQ4M0RcXHVEQzY3XFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2NlxcdURDNjddKXwoPzpcXHVEODNEW1xcdURDNjhcXHVEQzY5XSlcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pfFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdXFx1RkUwRnxcXHVEODNEW1xcdURDNjZcXHVEQzY3XXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8KD86XFx1RDgzQ1xcdURGRkJcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkZcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkVcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkRcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkNcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF0pXFx1RkUwRnxcXHVEODNDXFx1REZGQlxcdTIwMEQoPzpcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXwoPzpcXHVEODNFXFx1REREMVxcdUQ4M0NcXHVERkZCXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkNcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjkpXFx1RDgzQ1xcdURGRkJ8XFx1RDgzRVxcdURERDEoPzpcXHVEODNDXFx1REZGRlxcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNFXFx1REREMSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZGXSl8XFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxKXwoPzpcXHVEODNFXFx1REREMVxcdUQ4M0NcXHVERkZFXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkZcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY4XFx1REM2OV0pKSg/OlxcdUQ4M0NbXFx1REZGQi1cXHVERkZFXSl8KD86XFx1RDgzRVxcdURERDFcXHVEODNDXFx1REZGQ1xcdTIwMERcXHVEODNFXFx1REQxRFxcdTIwMERcXHVEODNFXFx1REREMXxcXHVEODNEXFx1REM2OVxcdUQ4M0NcXHVERkZEXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY5KSg/OlxcdUQ4M0NbXFx1REZGQlxcdURGRkNdKXxcXHVEODNEXFx1REM2OSg/OlxcdUQ4M0NcXHVERkZFXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkRcXHVERkZGXSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZDXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZCXFx1REZGRC1cXHVERkZGXSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZCXFx1MjAwRCg/OlxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0RcXHVEQzY4KD86XFx1RDgzQ1tcXHVERkZDLVxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1RDgzQ1xcdURGRkRcXHUyMDBEKD86XFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjgoPzpcXHVEODNDW1xcdURGRkJcXHVERkZDXFx1REZGRVxcdURGRkZdKXxcXHVEODNDW1xcdURGM0VcXHVERjczXFx1REY5M1xcdURGQTRcXHVERkE4XFx1REZFQlxcdURGRURdfFxcdUQ4M0RbXFx1RENCQlxcdURDQkNcXHVERDI3XFx1REQyQ1xcdURFODBcXHVERTkyXXxcXHVEODNFW1xcdUREQUYtXFx1RERCM1xcdUREQkNcXHVEREJEXSl8XFx1MjAwRCg/OlxcdTI3NjRcXHVGRTBGXFx1MjAwRCg/OlxcdUQ4M0RcXHVEQzhCXFx1MjAwRCg/OlxcdUQ4M0RbXFx1REM2OFxcdURDNjldKXxcXHVEODNEW1xcdURDNjhcXHVEQzY5XSl8XFx1RDgzQ1tcXHVERjNFXFx1REY3M1xcdURGOTNcXHVERkE0XFx1REZBOFxcdURGRUJcXHVERkVEXXxcXHVEODNEW1xcdURDQkJcXHVEQ0JDXFx1REQyN1xcdUREMkNcXHVERTgwXFx1REU5Ml18XFx1RDgzRVtcXHVEREFGLVxcdUREQjNcXHVEREJDXFx1RERCRF0pfFxcdUQ4M0NcXHVERkZGXFx1MjAwRCg/OlxcdUQ4M0NbXFx1REYzRVxcdURGNzNcXHVERjkzXFx1REZBNFxcdURGQThcXHVERkVCXFx1REZFRF18XFx1RDgzRFtcXHVEQ0JCXFx1RENCQ1xcdUREMjdcXHVERDJDXFx1REU4MFxcdURFOTJdfFxcdUQ4M0VbXFx1RERBRi1cXHVEREIzXFx1RERCQ1xcdUREQkRdKSl8XFx1RDgzRFxcdURDNjlcXHUyMDBEXFx1RDgzRFxcdURDNjlcXHUyMDBEKD86XFx1RDgzRFxcdURDNjZcXHUyMDBEXFx1RDgzRFxcdURDNjZ8XFx1RDgzRFxcdURDNjdcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pKXwoPzpcXHVEODNFXFx1REREMVxcdUQ4M0NcXHVERkZEXFx1MjAwRFxcdUQ4M0VcXHVERDFEXFx1MjAwRFxcdUQ4M0VcXHVEREQxfFxcdUQ4M0RcXHVEQzY5XFx1RDgzQ1xcdURGRkVcXHUyMDBEXFx1RDgzRVxcdUREMURcXHUyMDBEXFx1RDgzRFxcdURDNjkpKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkRdKXxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2NlxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2OVxcdTIwMEQoPzpcXHVEODNEW1xcdURDNjZcXHVEQzY3XSl8KD86XFx1RDgzRFxcdURDNDFcXHVGRTBGXFx1MjAwRFxcdUQ4M0RcXHVEREU4fFxcdUQ4M0RcXHVEQzY5KD86XFx1RDgzQ1xcdURGRkZcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkVcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkNcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkJcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1RDgzQ1xcdURGRkRcXHUyMDBEW1xcdTI2OTVcXHUyNjk2XFx1MjcwOF18XFx1MjAwRFtcXHUyNjk1XFx1MjY5NlxcdTI3MDhdKXwoPzooPzpcXHUyNkY5fFxcdUQ4M0NbXFx1REZDQlxcdURGQ0NdfFxcdUQ4M0RcXHVERDc1KVxcdUZFMEZ8XFx1RDgzRFxcdURDNkZ8XFx1RDgzRVtcXHVERDNDXFx1RERERVxcdUREREZdKVxcdTIwMERbXFx1MjY0MFxcdTI2NDJdfCg/OlxcdTI2Rjl8XFx1RDgzQ1tcXHVERkNCXFx1REZDQ118XFx1RDgzRFxcdURENzUpKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKVxcdTIwMERbXFx1MjY0MFxcdTI2NDJdfCg/OlxcdUQ4M0NbXFx1REZDM1xcdURGQzRcXHVERkNBXXxcXHVEODNEW1xcdURDNkVcXHVEQzcxXFx1REM3M1xcdURDNzdcXHVEQzgxXFx1REM4MlxcdURDODZcXHVEQzg3XFx1REU0NS1cXHVERTQ3XFx1REU0QlxcdURFNERcXHVERTRFXFx1REVBM1xcdURFQjQtXFx1REVCNl18XFx1RDgzRVtcXHVERDI2XFx1REQzNy1cXHVERDM5XFx1REQzRFxcdUREM0VcXHVEREI4XFx1RERCOVxcdUREQ0QtXFx1RERDRlxcdURERDYtXFx1RERERF0pKD86KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKVxcdTIwMERbXFx1MjY0MFxcdTI2NDJdfFxcdTIwMERbXFx1MjY0MFxcdTI2NDJdKXxcXHVEODNDXFx1REZGNFxcdTIwMERcXHUyNjIwKVxcdUZFMEZ8XFx1RDgzRFxcdURDNjlcXHUyMDBEXFx1RDgzRFxcdURDNjdcXHUyMDBEKD86XFx1RDgzRFtcXHVEQzY2XFx1REM2N10pfFxcdUQ4M0NcXHVERkYzXFx1RkUwRlxcdTIwMERcXHVEODNDXFx1REYwOHxcXHVEODNEXFx1REMxNVxcdTIwMERcXHVEODNFXFx1RERCQXxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2NnxcXHVEODNEXFx1REM2OVxcdTIwMERcXHVEODNEXFx1REM2N3xcXHVEODNDXFx1RERGRFxcdUQ4M0NcXHVEREYwfFxcdUQ4M0NcXHVEREY0XFx1RDgzQ1xcdURERjJ8XFx1RDgzQ1xcdURERjZcXHVEODNDXFx1RERFNnxbI1xcKjAtOV1cXHVGRTBGXFx1MjBFM3xcXHVEODNDXFx1RERFNyg/OlxcdUQ4M0NbXFx1RERFNlxcdURERTdcXHVEREU5LVxcdURERUZcXHVEREYxLVxcdURERjRcXHVEREY2LVxcdURERjlcXHVEREZCXFx1RERGQ1xcdURERkVcXHVEREZGXSl8XFx1RDgzQ1xcdURERjkoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFOVxcdURERUItXFx1RERFRFxcdURERUYtXFx1RERGNFxcdURERjdcXHVEREY5XFx1RERGQlxcdURERkNcXHVEREZGXSl8XFx1RDgzQ1xcdURERUEoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFQVxcdURERUNcXHVEREVEXFx1RERGNy1cXHVEREZBXSl8XFx1RDgzRVxcdURERDEoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfFxcdUQ4M0NcXHVEREY3KD86XFx1RDgzQ1tcXHVEREVBXFx1RERGNFxcdURERjhcXHVEREZBXFx1RERGQ10pfFxcdUQ4M0RcXHVEQzY5KD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXxcXHVEODNDXFx1RERGMig/OlxcdUQ4M0NbXFx1RERFNlxcdURERTgtXFx1RERFRFxcdURERjAtXFx1RERGRl0pfFxcdUQ4M0NcXHVEREU2KD86XFx1RDgzQ1tcXHVEREU4LVxcdURERUNcXHVEREVFXFx1RERGMVxcdURERjJcXHVEREY0XFx1RERGNi1cXHVEREZBXFx1RERGQ1xcdURERkRcXHVEREZGXSl8XFx1RDgzQ1xcdURERjAoPzpcXHVEODNDW1xcdURERUFcXHVEREVDLVxcdURERUVcXHVEREYyXFx1RERGM1xcdURERjVcXHVEREY3XFx1RERGQ1xcdURERkVcXHVEREZGXSl8XFx1RDgzQ1xcdURERUQoPzpcXHVEODNDW1xcdURERjBcXHVEREYyXFx1RERGM1xcdURERjdcXHVEREY5XFx1RERGQV0pfFxcdUQ4M0NcXHVEREU5KD86XFx1RDgzQ1tcXHVEREVBXFx1RERFQ1xcdURERUZcXHVEREYwXFx1RERGMlxcdURERjRcXHVEREZGXSl8XFx1RDgzQ1xcdURERkUoPzpcXHVEODNDW1xcdURERUFcXHVEREY5XSl8XFx1RDgzQ1xcdURERUMoPzpcXHVEODNDW1xcdURERTZcXHVEREU3XFx1RERFOS1cXHVEREVFXFx1RERGMS1cXHVEREYzXFx1RERGNS1cXHVEREZBXFx1RERGQ1xcdURERkVdKXxcXHVEODNDXFx1RERGOCg/OlxcdUQ4M0NbXFx1RERFNi1cXHVEREVBXFx1RERFQy1cXHVEREY0XFx1RERGNy1cXHVEREY5XFx1RERGQlxcdURERkQtXFx1RERGRl0pfFxcdUQ4M0NcXHVEREVCKD86XFx1RDgzQ1tcXHVEREVFLVxcdURERjBcXHVEREYyXFx1RERGNFxcdURERjddKXxcXHVEODNDXFx1RERGNSg/OlxcdUQ4M0NbXFx1RERFNlxcdURERUEtXFx1RERFRFxcdURERjAtXFx1RERGM1xcdURERjctXFx1RERGOVxcdURERkNcXHVEREZFXSl8XFx1RDgzQ1xcdURERkIoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFQVxcdURERUNcXHVEREVFXFx1RERGM1xcdURERkFdKXxcXHVEODNDXFx1RERGMyg/OlxcdUQ4M0NbXFx1RERFNlxcdURERThcXHVEREVBLVxcdURERUNcXHVEREVFXFx1RERGMVxcdURERjRcXHVEREY1XFx1RERGN1xcdURERkFcXHVEREZGXSl8XFx1RDgzQ1xcdURERTgoPzpcXHVEODNDW1xcdURERTZcXHVEREU4XFx1RERFOVxcdURERUItXFx1RERFRVxcdURERjAtXFx1RERGNVxcdURERjdcXHVEREZBLVxcdURERkZdKXxcXHVEODNDXFx1RERGMSg/OlxcdUQ4M0NbXFx1RERFNi1cXHVEREU4XFx1RERFRVxcdURERjBcXHVEREY3LVxcdURERkJcXHVEREZFXSl8XFx1RDgzQ1xcdURERkYoPzpcXHVEODNDW1xcdURERTZcXHVEREYyXFx1RERGQ10pfFxcdUQ4M0NcXHVEREZDKD86XFx1RDgzQ1tcXHVEREVCXFx1RERGOF0pfFxcdUQ4M0NcXHVEREZBKD86XFx1RDgzQ1tcXHVEREU2XFx1RERFQ1xcdURERjJcXHVEREYzXFx1RERGOFxcdURERkVcXHVEREZGXSl8XFx1RDgzQ1xcdURERUUoPzpcXHVEODNDW1xcdURERTgtXFx1RERFQVxcdURERjEtXFx1RERGNFxcdURERjYtXFx1RERGOV0pfFxcdUQ4M0NcXHVEREVGKD86XFx1RDgzQ1tcXHVEREVBXFx1RERGMlxcdURERjRcXHVEREY1XSl8KD86XFx1RDgzQ1tcXHVERkMzXFx1REZDNFxcdURGQ0FdfFxcdUQ4M0RbXFx1REM2RVxcdURDNzFcXHVEQzczXFx1REM3N1xcdURDODFcXHVEQzgyXFx1REM4NlxcdURDODdcXHVERTQ1LVxcdURFNDdcXHVERTRCXFx1REU0RFxcdURFNEVcXHVERUEzXFx1REVCNC1cXHVERUI2XXxcXHVEODNFW1xcdUREMjZcXHVERDM3LVxcdUREMzlcXHVERDNEXFx1REQzRVxcdUREQjhcXHVEREI5XFx1RERDRC1cXHVERENGXFx1RERENi1cXHVEREREXSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OlxcdTI2Rjl8XFx1RDgzQ1tcXHVERkNCXFx1REZDQ118XFx1RDgzRFxcdURENzUpKD86XFx1RDgzQ1tcXHVERkZCLVxcdURGRkZdKXwoPzpbXFx1MjYxRFxcdTI3MEEtXFx1MjcwRF18XFx1RDgzQ1tcXHVERjg1XFx1REZDMlxcdURGQzddfFxcdUQ4M0RbXFx1REM0MlxcdURDNDNcXHVEQzQ2LVxcdURDNTBcXHVEQzY2XFx1REM2N1xcdURDNkItXFx1REM2RFxcdURDNzBcXHVEQzcyXFx1REM3NC1cXHVEQzc2XFx1REM3OFxcdURDN0NcXHVEQzgzXFx1REM4NVxcdURDQUFcXHVERDc0XFx1REQ3QVxcdUREOTBcXHVERDk1XFx1REQ5NlxcdURFNENcXHVERTRGXFx1REVDMFxcdURFQ0NdfFxcdUQ4M0VbXFx1REQwRlxcdUREMTgtXFx1REQxQ1xcdUREMUVcXHVERDFGXFx1REQzMC1cXHVERDM2XFx1RERCNVxcdUREQjZcXHVEREJCXFx1REREMi1cXHVEREQ1XSkoPzpcXHVEODNDW1xcdURGRkItXFx1REZGRl0pfCg/OltcXHUyMzFBXFx1MjMxQlxcdTIzRTktXFx1MjNFQ1xcdTIzRjBcXHUyM0YzXFx1MjVGRFxcdTI1RkVcXHUyNjE0XFx1MjYxNVxcdTI2NDgtXFx1MjY1M1xcdTI2N0ZcXHUyNjkzXFx1MjZBMVxcdTI2QUFcXHUyNkFCXFx1MjZCRFxcdTI2QkVcXHUyNkM0XFx1MjZDNVxcdTI2Q0VcXHUyNkQ0XFx1MjZFQVxcdTI2RjJcXHUyNkYzXFx1MjZGNVxcdTI2RkFcXHUyNkZEXFx1MjcwNVxcdTI3MEFcXHUyNzBCXFx1MjcyOFxcdTI3NENcXHUyNzRFXFx1Mjc1My1cXHUyNzU1XFx1Mjc1N1xcdTI3OTUtXFx1Mjc5N1xcdTI3QjBcXHUyN0JGXFx1MkIxQlxcdTJCMUNcXHUyQjUwXFx1MkI1NV18XFx1RDgzQ1tcXHVEQzA0XFx1RENDRlxcdUREOEVcXHVERDkxLVxcdUREOUFcXHVEREU2LVxcdURERkZcXHVERTAxXFx1REUxQVxcdURFMkZcXHVERTMyLVxcdURFMzZcXHVERTM4LVxcdURFM0FcXHVERTUwXFx1REU1MVxcdURGMDAtXFx1REYyMFxcdURGMkQtXFx1REYzNVxcdURGMzctXFx1REY3Q1xcdURGN0UtXFx1REY5M1xcdURGQTAtXFx1REZDQVxcdURGQ0YtXFx1REZEM1xcdURGRTAtXFx1REZGMFxcdURGRjRcXHVERkY4LVxcdURGRkZdfFxcdUQ4M0RbXFx1REMwMC1cXHVEQzNFXFx1REM0MFxcdURDNDItXFx1RENGQ1xcdURDRkYtXFx1REQzRFxcdURENEItXFx1REQ0RVxcdURENTAtXFx1REQ2N1xcdUREN0FcXHVERDk1XFx1REQ5NlxcdUREQTRcXHVEREZCLVxcdURFNEZcXHVERTgwLVxcdURFQzVcXHVERUNDXFx1REVEMC1cXHVERUQyXFx1REVENVxcdURFRUJcXHVERUVDXFx1REVGNC1cXHVERUZBXFx1REZFMC1cXHVERkVCXXxcXHVEODNFW1xcdUREMEQtXFx1REQzQVxcdUREM0MtXFx1REQ0NVxcdURENDctXFx1REQ3MVxcdURENzMtXFx1REQ3NlxcdUREN0EtXFx1RERBMlxcdUREQTUtXFx1RERBQVxcdUREQUUtXFx1RERDQVxcdUREQ0QtXFx1RERGRlxcdURFNzAtXFx1REU3M1xcdURFNzgtXFx1REU3QVxcdURFODAtXFx1REU4MlxcdURFOTAtXFx1REU5NV0pfCg/OlsjXFwqMC05XFx4QTlcXHhBRVxcdTIwM0NcXHUyMDQ5XFx1MjEyMlxcdTIxMzlcXHUyMTk0LVxcdTIxOTlcXHUyMUE5XFx1MjFBQVxcdTIzMUFcXHUyMzFCXFx1MjMyOFxcdTIzQ0ZcXHUyM0U5LVxcdTIzRjNcXHUyM0Y4LVxcdTIzRkFcXHUyNEMyXFx1MjVBQVxcdTI1QUJcXHUyNUI2XFx1MjVDMFxcdTI1RkItXFx1MjVGRVxcdTI2MDAtXFx1MjYwNFxcdTI2MEVcXHUyNjExXFx1MjYxNFxcdTI2MTVcXHUyNjE4XFx1MjYxRFxcdTI2MjBcXHUyNjIyXFx1MjYyM1xcdTI2MjZcXHUyNjJBXFx1MjYyRVxcdTI2MkZcXHUyNjM4LVxcdTI2M0FcXHUyNjQwXFx1MjY0MlxcdTI2NDgtXFx1MjY1M1xcdTI2NUZcXHUyNjYwXFx1MjY2M1xcdTI2NjVcXHUyNjY2XFx1MjY2OFxcdTI2N0JcXHUyNjdFXFx1MjY3RlxcdTI2OTItXFx1MjY5N1xcdTI2OTlcXHUyNjlCXFx1MjY5Q1xcdTI2QTBcXHUyNkExXFx1MjZBQVxcdTI2QUJcXHUyNkIwXFx1MjZCMVxcdTI2QkRcXHUyNkJFXFx1MjZDNFxcdTI2QzVcXHUyNkM4XFx1MjZDRVxcdTI2Q0ZcXHUyNkQxXFx1MjZEM1xcdTI2RDRcXHUyNkU5XFx1MjZFQVxcdTI2RjAtXFx1MjZGNVxcdTI2RjctXFx1MjZGQVxcdTI2RkRcXHUyNzAyXFx1MjcwNVxcdTI3MDgtXFx1MjcwRFxcdTI3MEZcXHUyNzEyXFx1MjcxNFxcdTI3MTZcXHUyNzFEXFx1MjcyMVxcdTI3MjhcXHUyNzMzXFx1MjczNFxcdTI3NDRcXHUyNzQ3XFx1Mjc0Q1xcdTI3NEVcXHUyNzUzLVxcdTI3NTVcXHUyNzU3XFx1Mjc2M1xcdTI3NjRcXHUyNzk1LVxcdTI3OTdcXHUyN0ExXFx1MjdCMFxcdTI3QkZcXHUyOTM0XFx1MjkzNVxcdTJCMDUtXFx1MkIwN1xcdTJCMUJcXHUyQjFDXFx1MkI1MFxcdTJCNTVcXHUzMDMwXFx1MzAzRFxcdTMyOTdcXHUzMjk5XXxcXHVEODNDW1xcdURDMDRcXHVEQ0NGXFx1REQ3MFxcdURENzFcXHVERDdFXFx1REQ3RlxcdUREOEVcXHVERDkxLVxcdUREOUFcXHVEREU2LVxcdURERkZcXHVERTAxXFx1REUwMlxcdURFMUFcXHVERTJGXFx1REUzMi1cXHVERTNBXFx1REU1MFxcdURFNTFcXHVERjAwLVxcdURGMjFcXHVERjI0LVxcdURGOTNcXHVERjk2XFx1REY5N1xcdURGOTktXFx1REY5QlxcdURGOUUtXFx1REZGMFxcdURGRjMtXFx1REZGNVxcdURGRjctXFx1REZGRl18XFx1RDgzRFtcXHVEQzAwLVxcdURDRkRcXHVEQ0ZGLVxcdUREM0RcXHVERDQ5LVxcdURENEVcXHVERDUwLVxcdURENjdcXHVERDZGXFx1REQ3MFxcdURENzMtXFx1REQ3QVxcdUREODdcXHVERDhBLVxcdUREOERcXHVERDkwXFx1REQ5NVxcdUREOTZcXHVEREE0XFx1RERBNVxcdUREQThcXHVEREIxXFx1RERCMlxcdUREQkNcXHVEREMyLVxcdUREQzRcXHVEREQxLVxcdURERDNcXHVERERDLVxcdUREREVcXHVEREUxXFx1RERFM1xcdURERThcXHVEREVGXFx1RERGM1xcdURERkEtXFx1REU0RlxcdURFODAtXFx1REVDNVxcdURFQ0ItXFx1REVEMlxcdURFRDVcXHVERUUwLVxcdURFRTVcXHVERUU5XFx1REVFQlxcdURFRUNcXHVERUYwXFx1REVGMy1cXHVERUZBXFx1REZFMC1cXHVERkVCXXxcXHVEODNFW1xcdUREMEQtXFx1REQzQVxcdUREM0MtXFx1REQ0NVxcdURENDctXFx1REQ3MVxcdURENzMtXFx1REQ3NlxcdUREN0EtXFx1RERBMlxcdUREQTUtXFx1RERBQVxcdUREQUUtXFx1RERDQVxcdUREQ0QtXFx1RERGRlxcdURFNzAtXFx1REU3M1xcdURFNzgtXFx1REU3QVxcdURFODAtXFx1REU4MlxcdURFOTAtXFx1REU5NV0pXFx1RkUwRnwoPzpbXFx1MjYxRFxcdTI2RjlcXHUyNzBBLVxcdTI3MERdfFxcdUQ4M0NbXFx1REY4NVxcdURGQzItXFx1REZDNFxcdURGQzdcXHVERkNBLVxcdURGQ0NdfFxcdUQ4M0RbXFx1REM0MlxcdURDNDNcXHVEQzQ2LVxcdURDNTBcXHVEQzY2LVxcdURDNzhcXHVEQzdDXFx1REM4MS1cXHVEQzgzXFx1REM4NS1cXHVEQzg3XFx1REM4RlxcdURDOTFcXHVEQ0FBXFx1REQ3NFxcdURENzVcXHVERDdBXFx1REQ5MFxcdUREOTVcXHVERDk2XFx1REU0NS1cXHVERTQ3XFx1REU0Qi1cXHVERTRGXFx1REVBM1xcdURFQjQtXFx1REVCNlxcdURFQzBcXHVERUNDXXxcXHVEODNFW1xcdUREMEZcXHVERDE4LVxcdUREMUZcXHVERDI2XFx1REQzMC1cXHVERDM5XFx1REQzQy1cXHVERDNFXFx1RERCNVxcdUREQjZcXHVEREI4XFx1RERCOVxcdUREQkJcXHVERENELVxcdUREQ0ZcXHVEREQxLVxcdURERERdKS9nO1xufTtcbiIsInZhciBvbmNlID0gcmVxdWlyZSgnb25jZScpO1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uKCkge307XG5cbnZhciBpc1JlcXVlc3QgPSBmdW5jdGlvbihzdHJlYW0pIHtcblx0cmV0dXJuIHN0cmVhbS5zZXRIZWFkZXIgJiYgdHlwZW9mIHN0cmVhbS5hYm9ydCA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbnZhciBpc0NoaWxkUHJvY2VzcyA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuXHRyZXR1cm4gc3RyZWFtLnN0ZGlvICYmIEFycmF5LmlzQXJyYXkoc3RyZWFtLnN0ZGlvKSAmJiBzdHJlYW0uc3RkaW8ubGVuZ3RoID09PSAzXG59O1xuXG52YXIgZW9zID0gZnVuY3Rpb24oc3RyZWFtLCBvcHRzLCBjYWxsYmFjaykge1xuXHRpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHJldHVybiBlb3Moc3RyZWFtLCBudWxsLCBvcHRzKTtcblx0aWYgKCFvcHRzKSBvcHRzID0ge307XG5cblx0Y2FsbGJhY2sgPSBvbmNlKGNhbGxiYWNrIHx8IG5vb3ApO1xuXG5cdHZhciB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcblx0dmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXHR2YXIgcmVhZGFibGUgPSBvcHRzLnJlYWRhYmxlIHx8IChvcHRzLnJlYWRhYmxlICE9PSBmYWxzZSAmJiBzdHJlYW0ucmVhZGFibGUpO1xuXHR2YXIgd3JpdGFibGUgPSBvcHRzLndyaXRhYmxlIHx8IChvcHRzLndyaXRhYmxlICE9PSBmYWxzZSAmJiBzdHJlYW0ud3JpdGFibGUpO1xuXHR2YXIgY2FuY2VsbGVkID0gZmFsc2U7XG5cblx0dmFyIG9ubGVnYWN5ZmluaXNoID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCFzdHJlYW0ud3JpdGFibGUpIG9uZmluaXNoKCk7XG5cdH07XG5cblx0dmFyIG9uZmluaXNoID0gZnVuY3Rpb24oKSB7XG5cdFx0d3JpdGFibGUgPSBmYWxzZTtcblx0XHRpZiAoIXJlYWRhYmxlKSBjYWxsYmFjay5jYWxsKHN0cmVhbSk7XG5cdH07XG5cblx0dmFyIG9uZW5kID0gZnVuY3Rpb24oKSB7XG5cdFx0cmVhZGFibGUgPSBmYWxzZTtcblx0XHRpZiAoIXdyaXRhYmxlKSBjYWxsYmFjay5jYWxsKHN0cmVhbSk7XG5cdH07XG5cblx0dmFyIG9uZXhpdCA9IGZ1bmN0aW9uKGV4aXRDb2RlKSB7XG5cdFx0Y2FsbGJhY2suY2FsbChzdHJlYW0sIGV4aXRDb2RlID8gbmV3IEVycm9yKCdleGl0ZWQgd2l0aCBlcnJvciBjb2RlOiAnICsgZXhpdENvZGUpIDogbnVsbCk7XG5cdH07XG5cblx0dmFyIG9uZXJyb3IgPSBmdW5jdGlvbihlcnIpIHtcblx0XHRjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyKTtcblx0fTtcblxuXHR2YXIgb25jbG9zZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHByb2Nlc3MubmV4dFRpY2sob25jbG9zZW5leHR0aWNrKTtcblx0fTtcblxuXHR2YXIgb25jbG9zZW5leHR0aWNrID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuXHRcdGlmIChyZWFkYWJsZSAmJiAhKHJzICYmIChycy5lbmRlZCAmJiAhcnMuZGVzdHJveWVkKSkpIHJldHVybiBjYWxsYmFjay5jYWxsKHN0cmVhbSwgbmV3IEVycm9yKCdwcmVtYXR1cmUgY2xvc2UnKSk7XG5cdFx0aWYgKHdyaXRhYmxlICYmICEod3MgJiYgKHdzLmVuZGVkICYmICF3cy5kZXN0cm95ZWQpKSkgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBuZXcgRXJyb3IoJ3ByZW1hdHVyZSBjbG9zZScpKTtcblx0fTtcblxuXHR2YXIgb25yZXF1ZXN0ID0gZnVuY3Rpb24oKSB7XG5cdFx0c3RyZWFtLnJlcS5vbignZmluaXNoJywgb25maW5pc2gpO1xuXHR9O1xuXG5cdGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkge1xuXHRcdHN0cmVhbS5vbignY29tcGxldGUnLCBvbmZpbmlzaCk7XG5cdFx0c3RyZWFtLm9uKCdhYm9ydCcsIG9uY2xvc2UpO1xuXHRcdGlmIChzdHJlYW0ucmVxKSBvbnJlcXVlc3QoKTtcblx0XHRlbHNlIHN0cmVhbS5vbigncmVxdWVzdCcsIG9ucmVxdWVzdCk7XG5cdH0gZWxzZSBpZiAod3JpdGFibGUgJiYgIXdzKSB7IC8vIGxlZ2FjeSBzdHJlYW1zXG5cdFx0c3RyZWFtLm9uKCdlbmQnLCBvbmxlZ2FjeWZpbmlzaCk7XG5cdFx0c3RyZWFtLm9uKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKTtcblx0fVxuXG5cdGlmIChpc0NoaWxkUHJvY2VzcyhzdHJlYW0pKSBzdHJlYW0ub24oJ2V4aXQnLCBvbmV4aXQpO1xuXG5cdHN0cmVhbS5vbignZW5kJywgb25lbmQpO1xuXHRzdHJlYW0ub24oJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblx0aWYgKG9wdHMuZXJyb3IgIT09IGZhbHNlKSBzdHJlYW0ub24oJ2Vycm9yJywgb25lcnJvcik7XG5cdHN0cmVhbS5vbignY2xvc2UnLCBvbmNsb3NlKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0Y2FuY2VsbGVkID0gdHJ1ZTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2NvbXBsZXRlJywgb25maW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignYWJvcnQnLCBvbmNsb3NlKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ3JlcXVlc3QnLCBvbnJlcXVlc3QpO1xuXHRcdGlmIChzdHJlYW0ucmVxKSBzdHJlYW0ucmVxLnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmxlZ2FjeWZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2V4aXQnLCBvbmV4aXQpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG5cdH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVvcztcbiIsImNvbnN0IHsgZGlybmFtZSwgcmVzb2x2ZSB9ID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgeyByZWFkZGlyU3luYywgc3RhdFN5bmMgfSA9IHJlcXVpcmUoJ2ZzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0YXJ0LCBjYWxsYmFjaykge1xuXHRsZXQgZGlyID0gcmVzb2x2ZSgnLicsIHN0YXJ0KTtcblx0bGV0IHRtcCwgc3RhdHMgPSBzdGF0U3luYyhkaXIpO1xuXG5cdGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuXHRcdGRpciA9IGRpcm5hbWUoZGlyKTtcblx0fVxuXG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0dG1wID0gY2FsbGJhY2soZGlyLCByZWFkZGlyU3luYyhkaXIpKTtcblx0XHRpZiAodG1wKSByZXR1cm4gcmVzb2x2ZShkaXIsIHRtcCk7XG5cdFx0ZGlyID0gZGlybmFtZSh0bXAgPSBkaXIpO1xuXHRcdGlmICh0bXAgPT09IGRpcikgYnJlYWs7XG5cdH1cbn1cbiIsIi8qXG4gIENvcHlyaWdodCAoQykgMjAxMi0yMDE0IFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDE1IEluZ3ZhciBTdGVwYW55YW4gPG1lQHJyZXZlcnNlci5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxNCBJdmFuIE5pa3VsaW4gPGlmYWFhbkBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIE1pY2hhZWwgRmljYXJyYSA8ZXNjb2RlZ2VuLmNvcHlyaWdodEBtaWNoYWVsLmZpY2FycmEubWU+XG4gIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIE1hdGhpYXMgQnluZW5zIDxtYXRoaWFzQHFpd2kuYmU+XG4gIENvcHlyaWdodCAoQykgMjAxMyBJcmFrbGkgR296YWxpc2h2aWxpIDxyZm9iaWNAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTIgUm9iZXJ0IEd1c3QtQmFyZG9uIDxkb25hdGVAcm9iZXJ0Lmd1c3QtYmFyZG9uLm9yZz5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIEpvaG4gRnJlZW1hbiA8amZyZWVtYW4wOEBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIEFyaXlhIEhpZGF5YXQgPGFyaXlhLmhpZGF5YXRAZ21haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMTIgSm9vc3QtV2ltIEJvZWtlc3RlaWpuIDxqb29zdC13aW1AYm9la2VzdGVpam4ubmw+XG4gIENvcHlyaWdodCAoQykgMjAxMiBLcmlzIEtvd2FsIDxrcmlzLmtvd2FsQGNpeGFyLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDEyIEFycGFkIEJvcnNvcyA8YXJwYWQuYm9yc29zQGdvb2dsZW1haWwuY29tPlxuICBDb3B5cmlnaHQgKEMpIDIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbi8qZ2xvYmFsIGV4cG9ydHM6dHJ1ZSwgcmVxdWlyZTp0cnVlLCBnbG9iYWw6dHJ1ZSovXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBTeW50YXgsXG4gICAgICAgIFByZWNlZGVuY2UsXG4gICAgICAgIEJpbmFyeVByZWNlZGVuY2UsXG4gICAgICAgIFNvdXJjZU5vZGUsXG4gICAgICAgIGVzdHJhdmVyc2UsXG4gICAgICAgIGVzdXRpbHMsXG4gICAgICAgIGJhc2UsXG4gICAgICAgIGluZGVudCxcbiAgICAgICAganNvbixcbiAgICAgICAgcmVudW1iZXIsXG4gICAgICAgIGhleGFkZWNpbWFsLFxuICAgICAgICBxdW90ZXMsXG4gICAgICAgIGVzY2FwZWxlc3MsXG4gICAgICAgIG5ld2xpbmUsXG4gICAgICAgIHNwYWNlLFxuICAgICAgICBwYXJlbnRoZXNlcyxcbiAgICAgICAgc2VtaWNvbG9ucyxcbiAgICAgICAgc2FmZUNvbmNhdGVuYXRpb24sXG4gICAgICAgIGRpcmVjdGl2ZSxcbiAgICAgICAgZXh0cmEsXG4gICAgICAgIHBhcnNlLFxuICAgICAgICBzb3VyY2VNYXAsXG4gICAgICAgIHNvdXJjZUNvZGUsXG4gICAgICAgIHByZXNlcnZlQmxhbmtMaW5lcyxcbiAgICAgICAgRk9STUFUX01JTklGWSxcbiAgICAgICAgRk9STUFUX0RFRkFVTFRTO1xuXG4gICAgZXN0cmF2ZXJzZSA9IHJlcXVpcmUoJ2VzdHJhdmVyc2UnKTtcbiAgICBlc3V0aWxzID0gcmVxdWlyZSgnZXN1dGlscycpO1xuXG4gICAgU3ludGF4ID0gZXN0cmF2ZXJzZS5TeW50YXg7XG5cbiAgICAvLyBHZW5lcmF0aW9uIGlzIGRvbmUgYnkgZ2VuZXJhdGVFeHByZXNzaW9uLlxuICAgIGZ1bmN0aW9uIGlzRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICAgIHJldHVybiBDb2RlR2VuZXJhdG9yLkV4cHJlc3Npb24uaGFzT3duUHJvcGVydHkobm9kZS50eXBlKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0aW9uIGlzIGRvbmUgYnkgZ2VuZXJhdGVTdGF0ZW1lbnQuXG4gICAgZnVuY3Rpb24gaXNTdGF0ZW1lbnQobm9kZSkge1xuICAgICAgICByZXR1cm4gQ29kZUdlbmVyYXRvci5TdGF0ZW1lbnQuaGFzT3duUHJvcGVydHkobm9kZS50eXBlKTtcbiAgICB9XG5cbiAgICBQcmVjZWRlbmNlID0ge1xuICAgICAgICBTZXF1ZW5jZTogMCxcbiAgICAgICAgWWllbGQ6IDEsXG4gICAgICAgIEFzc2lnbm1lbnQ6IDEsXG4gICAgICAgIENvbmRpdGlvbmFsOiAyLFxuICAgICAgICBBcnJvd0Z1bmN0aW9uOiAyLFxuICAgICAgICBDb2FsZXNjZTogMyxcbiAgICAgICAgTG9naWNhbE9SOiA0LFxuICAgICAgICBMb2dpY2FsQU5EOiA1LFxuICAgICAgICBCaXR3aXNlT1I6IDYsXG4gICAgICAgIEJpdHdpc2VYT1I6IDcsXG4gICAgICAgIEJpdHdpc2VBTkQ6IDgsXG4gICAgICAgIEVxdWFsaXR5OiA5LFxuICAgICAgICBSZWxhdGlvbmFsOiAxMCxcbiAgICAgICAgQml0d2lzZVNISUZUOiAxMSxcbiAgICAgICAgQWRkaXRpdmU6IDEyLFxuICAgICAgICBNdWx0aXBsaWNhdGl2ZTogMTMsXG4gICAgICAgIEV4cG9uZW50aWF0aW9uOiAxNCxcbiAgICAgICAgQXdhaXQ6IDE1LFxuICAgICAgICBVbmFyeTogMTUsXG4gICAgICAgIFBvc3RmaXg6IDE2LFxuICAgICAgICBPcHRpb25hbENoYWluaW5nOiAxNyxcbiAgICAgICAgQ2FsbDogMTgsXG4gICAgICAgIE5ldzogMTksXG4gICAgICAgIFRhZ2dlZFRlbXBsYXRlOiAyMCxcbiAgICAgICAgTWVtYmVyOiAyMSxcbiAgICAgICAgUHJpbWFyeTogMjJcbiAgICB9O1xuXG4gICAgQmluYXJ5UHJlY2VkZW5jZSA9IHtcbiAgICAgICAgJz8/JzogUHJlY2VkZW5jZS5Db2FsZXNjZSxcbiAgICAgICAgJ3x8JzogUHJlY2VkZW5jZS5Mb2dpY2FsT1IsXG4gICAgICAgICcmJic6IFByZWNlZGVuY2UuTG9naWNhbEFORCxcbiAgICAgICAgJ3wnOiBQcmVjZWRlbmNlLkJpdHdpc2VPUixcbiAgICAgICAgJ14nOiBQcmVjZWRlbmNlLkJpdHdpc2VYT1IsXG4gICAgICAgICcmJzogUHJlY2VkZW5jZS5CaXR3aXNlQU5ELFxuICAgICAgICAnPT0nOiBQcmVjZWRlbmNlLkVxdWFsaXR5LFxuICAgICAgICAnIT0nOiBQcmVjZWRlbmNlLkVxdWFsaXR5LFxuICAgICAgICAnPT09JzogUHJlY2VkZW5jZS5FcXVhbGl0eSxcbiAgICAgICAgJyE9PSc6IFByZWNlZGVuY2UuRXF1YWxpdHksXG4gICAgICAgICdpcyc6IFByZWNlZGVuY2UuRXF1YWxpdHksXG4gICAgICAgICdpc250JzogUHJlY2VkZW5jZS5FcXVhbGl0eSxcbiAgICAgICAgJzwnOiBQcmVjZWRlbmNlLlJlbGF0aW9uYWwsXG4gICAgICAgICc+JzogUHJlY2VkZW5jZS5SZWxhdGlvbmFsLFxuICAgICAgICAnPD0nOiBQcmVjZWRlbmNlLlJlbGF0aW9uYWwsXG4gICAgICAgICc+PSc6IFByZWNlZGVuY2UuUmVsYXRpb25hbCxcbiAgICAgICAgJ2luJzogUHJlY2VkZW5jZS5SZWxhdGlvbmFsLFxuICAgICAgICAnaW5zdGFuY2VvZic6IFByZWNlZGVuY2UuUmVsYXRpb25hbCxcbiAgICAgICAgJzw8JzogUHJlY2VkZW5jZS5CaXR3aXNlU0hJRlQsXG4gICAgICAgICc+Pic6IFByZWNlZGVuY2UuQml0d2lzZVNISUZULFxuICAgICAgICAnPj4+JzogUHJlY2VkZW5jZS5CaXR3aXNlU0hJRlQsXG4gICAgICAgICcrJzogUHJlY2VkZW5jZS5BZGRpdGl2ZSxcbiAgICAgICAgJy0nOiBQcmVjZWRlbmNlLkFkZGl0aXZlLFxuICAgICAgICAnKic6IFByZWNlZGVuY2UuTXVsdGlwbGljYXRpdmUsXG4gICAgICAgICclJzogUHJlY2VkZW5jZS5NdWx0aXBsaWNhdGl2ZSxcbiAgICAgICAgJy8nOiBQcmVjZWRlbmNlLk11bHRpcGxpY2F0aXZlLFxuICAgICAgICAnKionOiBQcmVjZWRlbmNlLkV4cG9uZW50aWF0aW9uXG4gICAgfTtcblxuICAgIC8vRmxhZ3NcbiAgICB2YXIgRl9BTExPV19JTiA9IDEsXG4gICAgICAgIEZfQUxMT1dfQ0FMTCA9IDEgPDwgMSxcbiAgICAgICAgRl9BTExPV19VTlBBUkFUSF9ORVcgPSAxIDw8IDIsXG4gICAgICAgIEZfRlVOQ19CT0RZID0gMSA8PCAzLFxuICAgICAgICBGX0RJUkVDVElWRV9DVFggPSAxIDw8IDQsXG4gICAgICAgIEZfU0VNSUNPTE9OX09QVCA9IDEgPDwgNSxcbiAgICAgICAgRl9GT1VORF9DT0FMRVNDRSA9IDEgPDwgNjtcblxuICAgIC8vRXhwcmVzc2lvbiBmbGFnIHNldHNcbiAgICAvL05PVEU6IEZsYWcgb3JkZXI6XG4gICAgLy8gRl9BTExPV19JTlxuICAgIC8vIEZfQUxMT1dfQ0FMTFxuICAgIC8vIEZfQUxMT1dfVU5QQVJBVEhfTkVXXG4gICAgdmFyIEVfRlRUID0gRl9BTExPV19DQUxMIHwgRl9BTExPV19VTlBBUkFUSF9ORVcsXG4gICAgICAgIEVfVFRGID0gRl9BTExPV19JTiB8IEZfQUxMT1dfQ0FMTCxcbiAgICAgICAgRV9UVFQgPSBGX0FMTE9XX0lOIHwgRl9BTExPV19DQUxMIHwgRl9BTExPV19VTlBBUkFUSF9ORVcsXG4gICAgICAgIEVfVEZGID0gRl9BTExPV19JTixcbiAgICAgICAgRV9GRlQgPSBGX0FMTE9XX1VOUEFSQVRIX05FVyxcbiAgICAgICAgRV9URlQgPSBGX0FMTE9XX0lOIHwgRl9BTExPV19VTlBBUkFUSF9ORVc7XG5cbiAgICAvL1N0YXRlbWVudCBmbGFnIHNldHNcbiAgICAvL05PVEU6IEZsYWcgb3JkZXI6XG4gICAgLy8gRl9BTExPV19JTlxuICAgIC8vIEZfRlVOQ19CT0RZXG4gICAgLy8gRl9ESVJFQ1RJVkVfQ1RYXG4gICAgLy8gRl9TRU1JQ09MT05fT1BUXG4gICAgdmFyIFNfVEZGRiA9IEZfQUxMT1dfSU4sXG4gICAgICAgIFNfVEZGVCA9IEZfQUxMT1dfSU4gfCBGX1NFTUlDT0xPTl9PUFQsXG4gICAgICAgIFNfRkZGRiA9IDB4MDAsXG4gICAgICAgIFNfVEZURiA9IEZfQUxMT1dfSU4gfCBGX0RJUkVDVElWRV9DVFgsXG4gICAgICAgIFNfVFRGRiA9IEZfQUxMT1dfSU4gfCBGX0ZVTkNfQk9EWTtcblxuICAgIGZ1bmN0aW9uIGdldERlZmF1bHRPcHRpb25zKCkge1xuICAgICAgICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZGVudDogbnVsbCxcbiAgICAgICAgICAgIGJhc2U6IG51bGwsXG4gICAgICAgICAgICBwYXJzZTogbnVsbCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGZhbHNlLFxuICAgICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICAgICAgaW5kZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiAnICAgICcsXG4gICAgICAgICAgICAgICAgICAgIGJhc2U6IDAsXG4gICAgICAgICAgICAgICAgICAgIGFkanVzdE11bHRpbGluZUNvbW1lbnQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXdsaW5lOiAnXFxuJyxcbiAgICAgICAgICAgICAgICBzcGFjZTogJyAnLFxuICAgICAgICAgICAgICAgIGpzb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlbnVtYmVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBoZXhhZGVjaW1hbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgcXVvdGVzOiAnc2luZ2xlJyxcbiAgICAgICAgICAgICAgICBlc2NhcGVsZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb21wYWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwYXJlbnRoZXNlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzZW1pY29sb25zOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNhZmVDb25jYXRlbmF0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwcmVzZXJ2ZUJsYW5rTGluZXM6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW96OiB7XG4gICAgICAgICAgICAgICAgY29tcHJlaGVuc2lvbkV4cHJlc3Npb25TdGFydHNXaXRoQXNzaWdubWVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc3Rhcmxlc3NHZW5lcmF0b3I6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc291cmNlTWFwOiBudWxsLFxuICAgICAgICAgICAgc291cmNlTWFwUm9vdDogbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZU1hcFdpdGhDb2RlOiBmYWxzZSxcbiAgICAgICAgICAgIGRpcmVjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICByYXc6IHRydWUsXG4gICAgICAgICAgICB2ZXJiYXRpbTogbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZUNvZGU6IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdHJpbmdSZXBlYXQoc3RyLCBudW0pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuXG4gICAgICAgIGZvciAobnVtIHw9IDA7IG51bSA+IDA7IG51bSA+Pj49IDEsIHN0ciArPSBzdHIpIHtcbiAgICAgICAgICAgIGlmIChudW0gJiAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHN0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFzTGluZVRlcm1pbmF0b3Ioc3RyKSB7XG4gICAgICAgIHJldHVybiAoL1tcXHJcXG5dL2cpLnRlc3Qoc3RyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHN0cikge1xuICAgICAgICB2YXIgbGVuID0gc3RyLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGxlbiAmJiBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihzdHIuY2hhckNvZGVBdChsZW4gLSAxKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2UodGFyZ2V0LCBvdmVycmlkZSkge1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGtleSBpbiBvdmVycmlkZSkge1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IG92ZXJyaWRlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVEZWVwbHkodGFyZ2V0LCBvdmVycmlkZSkge1xuICAgICAgICB2YXIga2V5LCB2YWw7XG5cbiAgICAgICAgZnVuY3Rpb24gaXNIYXNoT2JqZWN0KHRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnICYmIHRhcmdldCBpbnN0YW5jZW9mIE9iamVjdCAmJiAhKHRhcmdldCBpbnN0YW5jZW9mIFJlZ0V4cCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGtleSBpbiBvdmVycmlkZSkge1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBvdmVycmlkZVtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChpc0hhc2hPYmplY3QodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNIYXNoT2JqZWN0KHRhcmdldFtrZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRGVlcGx5KHRhcmdldFtrZXldLCB2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB1cGRhdGVEZWVwbHkoe30sIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZU51bWJlcih2YWx1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0LCBwb2ludCwgdGVtcCwgZXhwb25lbnQsIHBvcztcblxuICAgICAgICBpZiAodmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ051bWVyaWMgbGl0ZXJhbCB3aG9zZSB2YWx1ZSBpcyBOYU4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOdW1lcmljIGxpdGVyYWwgd2hvc2UgdmFsdWUgaXMgbmVnYXRpdmUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gMSAvIDApIHtcbiAgICAgICAgICAgIHJldHVybiBqc29uID8gJ251bGwnIDogcmVudW1iZXIgPyAnMWU0MDAnIDogJzFlKzQwMCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSAnJyArIHZhbHVlO1xuICAgICAgICBpZiAoIXJlbnVtYmVyIHx8IHJlc3VsdC5sZW5ndGggPCAzKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgcG9pbnQgPSByZXN1bHQuaW5kZXhPZignLicpO1xuICAgICAgICBpZiAoIWpzb24gJiYgcmVzdWx0LmNoYXJDb2RlQXQoMCkgPT09IDB4MzAgIC8qIDAgKi8gJiYgcG9pbnQgPT09IDEpIHtcbiAgICAgICAgICAgIHBvaW50ID0gMDtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICB0ZW1wID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgnZSsnLCAnZScpO1xuICAgICAgICBleHBvbmVudCA9IDA7XG4gICAgICAgIGlmICgocG9zID0gdGVtcC5pbmRleE9mKCdlJykpID4gMCkge1xuICAgICAgICAgICAgZXhwb25lbnQgPSArdGVtcC5zbGljZShwb3MgKyAxKTtcbiAgICAgICAgICAgIHRlbXAgPSB0ZW1wLnNsaWNlKDAsIHBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvaW50ID49IDApIHtcbiAgICAgICAgICAgIGV4cG9uZW50IC09IHRlbXAubGVuZ3RoIC0gcG9pbnQgLSAxO1xuICAgICAgICAgICAgdGVtcCA9ICsodGVtcC5zbGljZSgwLCBwb2ludCkgKyB0ZW1wLnNsaWNlKHBvaW50ICsgMSkpICsgJyc7XG4gICAgICAgIH1cbiAgICAgICAgcG9zID0gMDtcbiAgICAgICAgd2hpbGUgKHRlbXAuY2hhckNvZGVBdCh0ZW1wLmxlbmd0aCArIHBvcyAtIDEpID09PSAweDMwICAvKiAwICovKSB7XG4gICAgICAgICAgICAtLXBvcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zICE9PSAwKSB7XG4gICAgICAgICAgICBleHBvbmVudCAtPSBwb3M7XG4gICAgICAgICAgICB0ZW1wID0gdGVtcC5zbGljZSgwLCBwb3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChleHBvbmVudCAhPT0gMCkge1xuICAgICAgICAgICAgdGVtcCArPSAnZScgKyBleHBvbmVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRlbXAubGVuZ3RoIDwgcmVzdWx0Lmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgICAgICAoaGV4YWRlY2ltYWwgJiYgdmFsdWUgPiAxZTEyICYmIE1hdGguZmxvb3IodmFsdWUpID09PSB2YWx1ZSAmJiAodGVtcCA9ICcweCcgKyB2YWx1ZS50b1N0cmluZygxNikpLmxlbmd0aCA8IHJlc3VsdC5sZW5ndGgpKSAmJlxuICAgICAgICAgICAgICAgICt0ZW1wID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gdGVtcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgdmFsaWQgUmVnRXhwIGV4cHJlc3Npb24uXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vQ29uc3RlbGxhdGlvbi9pdiBFbmdpbmVcblxuICAgIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cENoYXJhY3RlcihjaCwgcHJldmlvdXNJc0JhY2tzbGFzaCkge1xuICAgICAgICAvLyBub3QgaGFuZGxpbmcgJ1xcJyBhbmQgaGFuZGxpbmcgXFx1MjAyOCBvciBcXHUyMDI5IHRvIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlXG4gICAgICAgIGlmICgoY2ggJiB+MSkgPT09IDB4MjAyOCkge1xuICAgICAgICAgICAgcmV0dXJuIChwcmV2aW91c0lzQmFja3NsYXNoID8gJ3UnIDogJ1xcXFx1JykgKyAoKGNoID09PSAweDIwMjgpID8gJzIwMjgnIDogJzIwMjknKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gMTAgfHwgY2ggPT09IDEzKSB7ICAvLyBcXG4sIFxcclxuICAgICAgICAgICAgcmV0dXJuIChwcmV2aW91c0lzQmFja3NsYXNoID8gJycgOiAnXFxcXCcpICsgKChjaCA9PT0gMTApID8gJ24nIDogJ3InKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVSZWdFeHAocmVnKSB7XG4gICAgICAgIHZhciBtYXRjaCwgcmVzdWx0LCBmbGFncywgaSwgaXosIGNoLCBjaGFyYWN0ZXJJbkJyYWNrLCBwcmV2aW91c0lzQmFja3NsYXNoO1xuXG4gICAgICAgIHJlc3VsdCA9IHJlZy50b1N0cmluZygpO1xuXG4gICAgICAgIGlmIChyZWcuc291cmNlKSB7XG4gICAgICAgICAgICAvLyBleHRyYWN0IGZsYWcgZnJvbSB0b1N0cmluZyByZXN1bHRcbiAgICAgICAgICAgIG1hdGNoID0gcmVzdWx0Lm1hdGNoKC9cXC8oW14vXSopJC8pO1xuICAgICAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsYWdzID0gbWF0Y2hbMV07XG4gICAgICAgICAgICByZXN1bHQgPSAnJztcblxuICAgICAgICAgICAgY2hhcmFjdGVySW5CcmFjayA9IGZhbHNlO1xuICAgICAgICAgICAgcHJldmlvdXNJc0JhY2tzbGFzaCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSByZWcuc291cmNlLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICBjaCA9IHJlZy5zb3VyY2UuY2hhckNvZGVBdChpKTtcblxuICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNJc0JhY2tzbGFzaCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVySW5CcmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSA5MykgeyAgLy8gXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckluQnJhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gNDcpIHsgIC8vIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gOTEpIHsgIC8vIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJJbkJyYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gZXNjYXBlUmVnRXhwQ2hhcmFjdGVyKGNoLCBwcmV2aW91c0lzQmFja3NsYXNoKTtcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNJc0JhY2tzbGFzaCA9IGNoID09PSA5MjsgIC8vIFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbmV3IFJlZ0V4cChcIlxcXFxcXG4nKSBpcyBwcm92aWRlZCwgY3JlYXRlIC9cXG4vXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBlc2NhcGVSZWdFeHBDaGFyYWN0ZXIoY2gsIHByZXZpb3VzSXNCYWNrc2xhc2gpO1xuICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGxpa2UgL1xcXFxbL10vXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzSXNCYWNrc2xhc2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAnLycgKyByZXN1bHQgKyAnLycgKyBmbGFncztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXNjYXBlQWxsb3dlZENoYXJhY3Rlcihjb2RlLCBuZXh0KSB7XG4gICAgICAgIHZhciBoZXg7XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MDggIC8qIFxcYiAqLykge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcYic7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gMHgwQyAgLyogXFxmICovKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxmJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDA5ICAvKiBcXHQgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHQnO1xuICAgICAgICB9XG5cbiAgICAgICAgaGV4ID0gY29kZS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKGpzb24gfHwgY29kZSA+IDB4RkYpIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHUnICsgJzAwMDAnLnNsaWNlKGhleC5sZW5ndGgpICsgaGV4O1xuICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MDAwMCAmJiAhZXN1dGlscy5jb2RlLmlzRGVjaW1hbERpZ2l0KG5leHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFwwJztcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDAwMEIgIC8qIFxcdiAqLykgeyAvLyAnXFx2J1xuICAgICAgICAgICAgcmV0dXJuICdcXFxceDBCJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHgnICsgJzAwJy5zbGljZShoZXgubGVuZ3RoKSArIGhleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVzY2FwZURpc2FsbG93ZWRDaGFyYWN0ZXIoY29kZSkge1xuICAgICAgICBpZiAoY29kZSA9PT0gMHg1QyAgLyogXFwgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXFxcXFwnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MEEgIC8qIFxcbiAqLykge1xuICAgICAgICAgICAgcmV0dXJuICdcXFxcbic7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gMHgwRCAgLyogXFxyICovKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1xcXFxyJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDIwMjgpIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHUyMDI4JztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSAweDIwMjkpIHtcbiAgICAgICAgICAgIHJldHVybiAnXFxcXHUyMDI5JztcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb3JyZWN0bHkgY2xhc3NpZmllZCBjaGFyYWN0ZXInKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlc2NhcGVEaXJlY3RpdmUoc3RyKSB7XG4gICAgICAgIHZhciBpLCBpeiwgY29kZSwgcXVvdGU7XG5cbiAgICAgICAgcXVvdGUgPSBxdW90ZXMgPT09ICdkb3VibGUnID8gJ1wiJyA6ICdcXCcnO1xuICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0ci5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gMHgyNyAgLyogJyAqLykge1xuICAgICAgICAgICAgICAgIHF1b3RlID0gJ1wiJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyMiAgLyogXCIgKi8pIHtcbiAgICAgICAgICAgICAgICBxdW90ZSA9ICdcXCcnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDVDICAvKiBcXCAqLykge1xuICAgICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdW90ZSArIHN0ciArIHF1b3RlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHIpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICcnLCBpLCBsZW4sIGNvZGUsIHNpbmdsZVF1b3RlcyA9IDAsIGRvdWJsZVF1b3RlcyA9IDAsIHNpbmdsZSwgcXVvdGU7XG5cbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gMHgyNyAgLyogJyAqLykge1xuICAgICAgICAgICAgICAgICsrc2luZ2xlUXVvdGVzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDIyICAvKiBcIiAqLykge1xuICAgICAgICAgICAgICAgICsrZG91YmxlUXVvdGVzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDJGICAvKiAvICovICYmIGpzb24pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihjb2RlKSB8fCBjb2RlID09PSAweDVDICAvKiBcXCAqLykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBlc2NhcGVEaXNhbGxvd2VkQ2hhcmFjdGVyKGNvZGUpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUoY29kZSkgJiYgKGpzb24gJiYgY29kZSA8IDB4MjAgIC8qIFNQICovIHx8ICFqc29uICYmICFlc2NhcGVsZXNzICYmIChjb2RlIDwgMHgyMCAgLyogU1AgKi8gfHwgY29kZSA+IDB4N0UgIC8qIH4gKi8pKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBlc2NhcGVBbGxvd2VkQ2hhcmFjdGVyKGNvZGUsIHN0ci5jaGFyQ29kZUF0KGkgKyAxKSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNpbmdsZSA9ICEocXVvdGVzID09PSAnZG91YmxlJyB8fCAocXVvdGVzID09PSAnYXV0bycgJiYgZG91YmxlUXVvdGVzIDwgc2luZ2xlUXVvdGVzKSk7XG4gICAgICAgIHF1b3RlID0gc2luZ2xlID8gJ1xcJycgOiAnXCInO1xuXG4gICAgICAgIGlmICghKHNpbmdsZSA/IHNpbmdsZVF1b3RlcyA6IGRvdWJsZVF1b3RlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBxdW90ZSArIHJlc3VsdCArIHF1b3RlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyID0gcmVzdWx0O1xuICAgICAgICByZXN1bHQgPSBxdW90ZTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGlmICgoY29kZSA9PT0gMHgyNyAgLyogJyAqLyAmJiBzaW5nbGUpIHx8IChjb2RlID09PSAweDIyICAvKiBcIiAqLyAmJiAhc2luZ2xlKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXFxcXCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQgKyBxdW90ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBmbGF0dGVuIGFuIGFycmF5IHRvIGEgc3RyaW5nLCB3aGVyZSB0aGUgYXJyYXkgY2FuIGNvbnRhaW5cbiAgICAgKiBlaXRoZXIgc3RyaW5ncyBvciBuZXN0ZWQgYXJyYXlzXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlblRvU3RyaW5nKGFycikge1xuICAgICAgICB2YXIgaSwgaXosIGVsZW0sIHJlc3VsdCA9ICcnO1xuICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGFyci5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICBlbGVtID0gYXJyW2ldO1xuICAgICAgICAgICAgcmVzdWx0ICs9IEFycmF5LmlzQXJyYXkoZWxlbSkgPyBmbGF0dGVuVG9TdHJpbmcoZWxlbSkgOiBlbGVtO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29udmVydCBnZW5lcmF0ZWQgdG8gYSBTb3VyY2VOb2RlIHdoZW4gc291cmNlIG1hcHMgYXJlIGVuYWJsZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChnZW5lcmF0ZWQsIG5vZGUpIHtcbiAgICAgICAgaWYgKCFzb3VyY2VNYXApIHtcbiAgICAgICAgICAgIC8vIHdpdGggbm8gc291cmNlIG1hcHMsIGdlbmVyYXRlZCBpcyBlaXRoZXIgYW5cbiAgICAgICAgICAgIC8vIGFycmF5IG9yIGEgc3RyaW5nLiAgaWYgYW4gYXJyYXksIGZsYXR0ZW4gaXQuXG4gICAgICAgICAgICAvLyBpZiBhIHN0cmluZywganVzdCByZXR1cm4gaXRcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGdlbmVyYXRlZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmxhdHRlblRvU3RyaW5nKGdlbmVyYXRlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGdlbmVyYXRlZCBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubG9jID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU291cmNlTm9kZShudWxsLCBudWxsLCBzb3VyY2VNYXAsIGdlbmVyYXRlZCwgbm9kZS5uYW1lIHx8IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU291cmNlTm9kZShub2RlLmxvYy5zdGFydC5saW5lLCBub2RlLmxvYy5zdGFydC5jb2x1bW4sIChzb3VyY2VNYXAgPT09IHRydWUgPyBub2RlLmxvYy5zb3VyY2UgfHwgbnVsbCA6IHNvdXJjZU1hcCksIGdlbmVyYXRlZCwgbm9kZS5uYW1lIHx8IG51bGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vRW1wdHlTcGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIChzcGFjZSkgPyBzcGFjZSA6ICcgJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBqb2luKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIHZhciBsZWZ0U291cmNlLFxuICAgICAgICAgICAgcmlnaHRTb3VyY2UsXG4gICAgICAgICAgICBsZWZ0Q2hhckNvZGUsXG4gICAgICAgICAgICByaWdodENoYXJDb2RlO1xuXG4gICAgICAgIGxlZnRTb3VyY2UgPSB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGxlZnQpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChsZWZ0U291cmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtyaWdodF07XG4gICAgICAgIH1cblxuICAgICAgICByaWdodFNvdXJjZSA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmlnaHQpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChyaWdodFNvdXJjZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbbGVmdF07XG4gICAgICAgIH1cblxuICAgICAgICBsZWZ0Q2hhckNvZGUgPSBsZWZ0U291cmNlLmNoYXJDb2RlQXQobGVmdFNvdXJjZS5sZW5ndGggLSAxKTtcbiAgICAgICAgcmlnaHRDaGFyQ29kZSA9IHJpZ2h0U291cmNlLmNoYXJDb2RlQXQoMCk7XG5cbiAgICAgICAgaWYgKChsZWZ0Q2hhckNvZGUgPT09IDB4MkIgIC8qICsgKi8gfHwgbGVmdENoYXJDb2RlID09PSAweDJEICAvKiAtICovKSAmJiBsZWZ0Q2hhckNvZGUgPT09IHJpZ2h0Q2hhckNvZGUgfHxcbiAgICAgICAgICAgIGVzdXRpbHMuY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1KGxlZnRDaGFyQ29kZSkgJiYgZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUocmlnaHRDaGFyQ29kZSkgfHxcbiAgICAgICAgICAgIGxlZnRDaGFyQ29kZSA9PT0gMHgyRiAgLyogLyAqLyAmJiByaWdodENoYXJDb2RlID09PSAweDY5ICAvKiBpICovKSB7IC8vIGluZml4IHdvcmQgb3BlcmF0b3JzIGFsbCBzdGFydCB3aXRoIGBpYFxuICAgICAgICAgICAgcmV0dXJuIFtsZWZ0LCBub0VtcHR5U3BhY2UoKSwgcmlnaHRdO1xuICAgICAgICB9IGVsc2UgaWYgKGVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UobGVmdENoYXJDb2RlKSB8fCBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihsZWZ0Q2hhckNvZGUpIHx8XG4gICAgICAgICAgICAgICAgZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShyaWdodENoYXJDb2RlKSB8fCBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihyaWdodENoYXJDb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtsZWZ0LCByaWdodF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtsZWZ0LCBzcGFjZSwgcmlnaHRdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZEluZGVudChzdG10KSB7XG4gICAgICAgIHJldHVybiBbYmFzZSwgc3RtdF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2l0aEluZGVudChmbikge1xuICAgICAgICB2YXIgcHJldmlvdXNCYXNlO1xuICAgICAgICBwcmV2aW91c0Jhc2UgPSBiYXNlO1xuICAgICAgICBiYXNlICs9IGluZGVudDtcbiAgICAgICAgZm4oYmFzZSk7XG4gICAgICAgIGJhc2UgPSBwcmV2aW91c0Jhc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlU3BhY2VzKHN0cikge1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgZm9yIChpID0gc3RyLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICBpZiAoZXN1dGlscy5jb2RlLmlzTGluZVRlcm1pbmF0b3Ioc3RyLmNoYXJDb2RlQXQoaSkpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzdHIubGVuZ3RoIC0gMSkgLSBpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkanVzdE11bHRpbGluZUNvbW1lbnQodmFsdWUsIHNwZWNpYWxCYXNlKSB7XG4gICAgICAgIHZhciBhcnJheSwgaSwgbGVuLCBsaW5lLCBqLCBzcGFjZXMsIHByZXZpb3VzQmFzZSwgc247XG5cbiAgICAgICAgYXJyYXkgPSB2YWx1ZS5zcGxpdCgvXFxyXFxufFtcXHJcXG5dLyk7XG4gICAgICAgIHNwYWNlcyA9IE51bWJlci5NQVhfVkFMVUU7XG5cbiAgICAgICAgLy8gZmlyc3QgbGluZSBkb2Vzbid0IGhhdmUgaW5kZW50YXRpb25cbiAgICAgICAgZm9yIChpID0gMSwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGxpbmUgPSBhcnJheVtpXTtcbiAgICAgICAgICAgIGogPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGogPCBsaW5lLmxlbmd0aCAmJiBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGxpbmUuY2hhckNvZGVBdChqKSkpIHtcbiAgICAgICAgICAgICAgICArK2o7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3BhY2VzID4gaikge1xuICAgICAgICAgICAgICAgIHNwYWNlcyA9IGo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHNwZWNpYWxCYXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gcGF0dGVybiBsaWtlXG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyAgIHZhciB0ID0gMjA7ICAvKlxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICogdGhpcyBpcyBjb21tZW50XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHByZXZpb3VzQmFzZSA9IGJhc2U7XG4gICAgICAgICAgICBpZiAoYXJyYXlbMV1bc3BhY2VzXSA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgc3BlY2lhbEJhc2UgKz0gJyAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmFzZSA9IHNwZWNpYWxCYXNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNwYWNlcyAmIDEpIHtcbiAgICAgICAgICAgICAgICAvLyAvKlxuICAgICAgICAgICAgICAgIC8vICAqXG4gICAgICAgICAgICAgICAgLy8gICovXG4gICAgICAgICAgICAgICAgLy8gSWYgc3BhY2VzIGFyZSBvZGQgbnVtYmVyLCBhYm92ZSBwYXR0ZXJuIGlzIGNvbnNpZGVyZWQuXG4gICAgICAgICAgICAgICAgLy8gV2Ugd2FzdGUgMSBzcGFjZS5cbiAgICAgICAgICAgICAgICAtLXNwYWNlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZXZpb3VzQmFzZSA9IGJhc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAxLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgc24gPSB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGFkZEluZGVudChhcnJheVtpXS5zbGljZShzcGFjZXMpKSk7XG4gICAgICAgICAgICBhcnJheVtpXSA9IHNvdXJjZU1hcCA/IHNuLmpvaW4oJycpIDogc247XG4gICAgICAgIH1cblxuICAgICAgICBiYXNlID0gcHJldmlvdXNCYXNlO1xuXG4gICAgICAgIHJldHVybiBhcnJheS5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCwgc3BlY2lhbEJhc2UpIHtcbiAgICAgICAgaWYgKGNvbW1lbnQudHlwZSA9PT0gJ0xpbmUnKSB7XG4gICAgICAgICAgICBpZiAoZW5kc1dpdGhMaW5lVGVybWluYXRvcihjb21tZW50LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnLy8nICsgY29tbWVudC52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQWx3YXlzIHVzZSBMaW5lVGVybWluYXRvclxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAnLy8nICsgY29tbWVudC52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIXByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1xcbic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dHJhLmZvcm1hdC5pbmRlbnQuYWRqdXN0TXVsdGlsaW5lQ29tbWVudCAmJiAvW1xcblxccl0vLnRlc3QoY29tbWVudC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBhZGp1c3RNdWx0aWxpbmVDb21tZW50KCcvKicgKyBjb21tZW50LnZhbHVlICsgJyovJywgc3BlY2lhbEJhc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnLyonICsgY29tbWVudC52YWx1ZSArICcqLyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkQ29tbWVudHMoc3RtdCwgcmVzdWx0KSB7XG4gICAgICAgIHZhciBpLCBsZW4sIGNvbW1lbnQsIHNhdmUsIHRhaWxpbmdUb1N0YXRlbWVudCwgc3BlY2lhbEJhc2UsIGZyYWdtZW50LFxuICAgICAgICAgICAgZXh0UmFuZ2UsIHJhbmdlLCBwcmV2UmFuZ2UsIHByZWZpeCwgaW5maXgsIHN1ZmZpeCwgY291bnQ7XG5cbiAgICAgICAgaWYgKHN0bXQubGVhZGluZ0NvbW1lbnRzICYmIHN0bXQubGVhZGluZ0NvbW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNhdmUgPSByZXN1bHQ7XG5cbiAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJsYW5rTGluZXMpIHtcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC5sZWFkaW5nQ29tbWVudHNbMF07XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgICAgICAgICAgICBleHRSYW5nZSA9IGNvbW1lbnQuZXh0ZW5kZWRSYW5nZTtcbiAgICAgICAgICAgICAgICByYW5nZSA9IGNvbW1lbnQucmFuZ2U7XG5cbiAgICAgICAgICAgICAgICBwcmVmaXggPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhleHRSYW5nZVswXSwgcmFuZ2VbMF0pO1xuICAgICAgICAgICAgICAgIGNvdW50ID0gKHByZWZpeC5tYXRjaCgvXFxuL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdHJpbmdSZXBlYXQoJ1xcbicsIGNvdW50KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcmVmaXgpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHByZXZSYW5nZSA9IHJhbmdlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMSwgbGVuID0gc3RtdC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IHN0bXQubGVhZGluZ0NvbW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGNvbW1lbnQucmFuZ2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaW5maXggPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhwcmV2UmFuZ2VbMV0sIHJhbmdlWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgY291bnQgPSAoaW5maXgubWF0Y2goL1xcbi9nKSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdHJpbmdSZXBlYXQoJ1xcbicsIGNvdW50KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpKTtcblxuICAgICAgICAgICAgICAgICAgICBwcmV2UmFuZ2UgPSByYW5nZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdWZmaXggPSBzb3VyY2VDb2RlLnN1YnN0cmluZyhyYW5nZVsxXSwgZXh0UmFuZ2VbMV0pO1xuICAgICAgICAgICAgICAgIGNvdW50ID0gKHN1ZmZpeC5tYXRjaCgvXFxuL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3RyaW5nUmVwZWF0KCdcXG4nLCBjb3VudCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC5sZWFkaW5nQ29tbWVudHNbMF07XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgaWYgKHNhZmVDb25jYXRlbmF0aW9uICYmIHN0bXQudHlwZSA9PT0gU3ludGF4LlByb2dyYW0gJiYgc3RtdC5ib2R5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlQ29tbWVudChjb21tZW50KSk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMSwgbGVuID0gc3RtdC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IHN0bXQubGVhZGluZ0NvbW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IFtnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50LnB1c2goJ1xcbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudChmcmFnbWVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KHNhdmUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdG10LnRyYWlsaW5nQ29tbWVudHMpIHtcblxuICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdG10LnRyYWlsaW5nQ29tbWVudHNbMF07XG4gICAgICAgICAgICAgICAgZXh0UmFuZ2UgPSBjb21tZW50LmV4dGVuZGVkUmFuZ2U7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBjb21tZW50LnJhbmdlO1xuXG4gICAgICAgICAgICAgICAgcHJlZml4ID0gc291cmNlQ29kZS5zdWJzdHJpbmcoZXh0UmFuZ2VbMF0sIHJhbmdlWzBdKTtcbiAgICAgICAgICAgICAgICBjb3VudCA9IChwcmVmaXgubWF0Y2goL1xcbi9nKSB8fCBbXSkubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzdHJpbmdSZXBlYXQoJ1xcbicsIGNvdW50KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwcmVmaXgpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUNvbW1lbnQoY29tbWVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFpbGluZ1RvU3RhdGVtZW50ID0gIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIHNwZWNpYWxCYXNlID0gc3RyaW5nUmVwZWF0KCcgJywgY2FsY3VsYXRlU3BhY2VzKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoW2Jhc2UsIHJlc3VsdCwgaW5kZW50XSkudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHN0bXQudHJhaWxpbmdDb21tZW50cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gc3RtdC50cmFpbGluZ0NvbW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFpbGluZ1RvU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhc3N1bWUgdGFyZ2V0IGxpa2UgZm9sbG93aW5nIHNjcmlwdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhciB0ID0gMjA7ICAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgKiBUaGlzIGlzIGNvbW1lbnQgb2YgdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW3Jlc3VsdCwgaW5kZW50XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW3Jlc3VsdCwgc3BlY2lhbEJhc2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVDb21tZW50KGNvbW1lbnQsIHNwZWNpYWxCYXNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbcmVzdWx0LCBhZGRJbmRlbnQoZ2VuZXJhdGVDb21tZW50KGNvbW1lbnQpKV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT09IGxlbiAtIDEgJiYgIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbcmVzdWx0LCAnXFxuJ107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlQmxhbmtMaW5lcyhzdGFydCwgZW5kLCByZXN1bHQpIHtcbiAgICAgICAgdmFyIGosIG5ld2xpbmVDb3VudCA9IDA7XG5cbiAgICAgICAgZm9yIChqID0gc3RhcnQ7IGogPCBlbmQ7IGorKykge1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNvZGVbal0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgbmV3bGluZUNvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGogPSAxOyBqIDwgbmV3bGluZUNvdW50OyBqKyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyZW50aGVzaXplKHRleHQsIGN1cnJlbnQsIHNob3VsZCkge1xuICAgICAgICBpZiAoY3VycmVudCA8IHNob3VsZCkge1xuICAgICAgICAgICAgcmV0dXJuIFsnKCcsIHRleHQsICcpJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVWZXJiYXRpbVN0cmluZyhzdHJpbmcpIHtcbiAgICAgICAgdmFyIGksIGl6LCByZXN1bHQ7XG4gICAgICAgIHJlc3VsdCA9IHN0cmluZy5zcGxpdCgvXFxyXFxufFxcbi8pO1xuICAgICAgICBmb3IgKGkgPSAxLCBpeiA9IHJlc3VsdC5sZW5ndGg7IGkgPCBpejsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHRbaV0gPSBuZXdsaW5lICsgYmFzZSArIHJlc3VsdFtpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlVmVyYmF0aW0oZXhwciwgcHJlY2VkZW5jZSkge1xuICAgICAgICB2YXIgdmVyYmF0aW0sIHJlc3VsdCwgcHJlYztcbiAgICAgICAgdmVyYmF0aW0gPSBleHByW2V4dHJhLnZlcmJhdGltXTtcblxuICAgICAgICBpZiAodHlwZW9mIHZlcmJhdGltID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50aGVzaXplKGdlbmVyYXRlVmVyYmF0aW1TdHJpbmcodmVyYmF0aW0pLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHZlcmJhdGltIGlzIG9iamVjdFxuICAgICAgICAgICAgcmVzdWx0ID0gZ2VuZXJhdGVWZXJiYXRpbVN0cmluZyh2ZXJiYXRpbS5jb250ZW50KTtcbiAgICAgICAgICAgIHByZWMgPSAodmVyYmF0aW0ucHJlY2VkZW5jZSAhPSBudWxsKSA/IHZlcmJhdGltLnByZWNlZGVuY2UgOiBQcmVjZWRlbmNlLlNlcXVlbmNlO1xuICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50aGVzaXplKHJlc3VsdCwgcHJlYywgcHJlY2VkZW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQsIGV4cHIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIENvZGVHZW5lcmF0b3IoKSB7XG4gICAgfVxuXG4gICAgLy8gSGVscGVycy5cblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLm1heWJlQmxvY2sgPSBmdW5jdGlvbihzdG10LCBmbGFncykge1xuICAgICAgICB2YXIgcmVzdWx0LCBub0xlYWRpbmdDb21tZW50LCB0aGF0ID0gdGhpcztcblxuICAgICAgICBub0xlYWRpbmdDb21tZW50ID0gIWV4dHJhLmNvbW1lbnQgfHwgIXN0bXQubGVhZGluZ0NvbW1lbnRzO1xuXG4gICAgICAgIGlmIChzdG10LnR5cGUgPT09IFN5bnRheC5CbG9ja1N0YXRlbWVudCAmJiBub0xlYWRpbmdDb21tZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gW3NwYWNlLCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQsIGZsYWdzKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RtdC50eXBlID09PSBTeW50YXguRW1wdHlTdGF0ZW1lbnQgJiYgbm9MZWFkaW5nQ29tbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuICc7JztcbiAgICAgICAgfVxuXG4gICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgIG5ld2xpbmUsXG4gICAgICAgICAgICAgICAgYWRkSW5kZW50KHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdCwgZmxhZ3MpKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUubWF5YmVCbG9ja1N1ZmZpeCA9IGZ1bmN0aW9uIChzdG10LCByZXN1bHQpIHtcbiAgICAgICAgdmFyIGVuZHMgPSBlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKHN0bXQudHlwZSA9PT0gU3ludGF4LkJsb2NrU3RhdGVtZW50ICYmICghZXh0cmEuY29tbWVudCB8fCAhc3RtdC5sZWFkaW5nQ29tbWVudHMpICYmICFlbmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW3Jlc3VsdCwgc3BhY2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW3Jlc3VsdCwgYmFzZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtyZXN1bHQsIG5ld2xpbmUsIGJhc2VdO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZUlkZW50aWZpZXIobm9kZSkge1xuICAgICAgICByZXR1cm4gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChub2RlLm5hbWUsIG5vZGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlQXN5bmNQcmVmaXgobm9kZSwgc3BhY2VSZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4gbm9kZS5hc3luYyA/ICdhc3luYycgKyAoc3BhY2VSZXF1aXJlZCA/IG5vRW1wdHlTcGFjZSgpIDogc3BhY2UpIDogJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVTdGFyU3VmZml4KG5vZGUpIHtcbiAgICAgICAgdmFyIGlzR2VuZXJhdG9yID0gbm9kZS5nZW5lcmF0b3IgJiYgIWV4dHJhLm1vei5zdGFybGVzc0dlbmVyYXRvcjtcbiAgICAgICAgcmV0dXJuIGlzR2VuZXJhdG9yID8gJyonICsgc3BhY2UgOiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZU1ldGhvZFByZWZpeChwcm9wKSB7XG4gICAgICAgIHZhciBmdW5jID0gcHJvcC52YWx1ZSwgcHJlZml4ID0gJyc7XG4gICAgICAgIGlmIChmdW5jLmFzeW5jKSB7XG4gICAgICAgICAgICBwcmVmaXggKz0gZ2VuZXJhdGVBc3luY1ByZWZpeChmdW5jLCAhcHJvcC5jb21wdXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZ1bmMuZ2VuZXJhdG9yKSB7XG4gICAgICAgICAgICAvLyBhdm9pZCBzcGFjZSBiZWZvcmUgbWV0aG9kIG5hbWVcbiAgICAgICAgICAgIHByZWZpeCArPSBnZW5lcmF0ZVN0YXJTdWZmaXgoZnVuYykgPyAnKicgOiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJlZml4O1xuICAgIH1cblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlUGF0dGVybiA9IGZ1bmN0aW9uIChub2RlLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSBTeW50YXguSWRlbnRpZmllcikge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlSWRlbnRpZmllcihub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24obm9kZSwgcHJlY2VkZW5jZSwgZmxhZ3MpO1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZUZ1bmN0aW9uUGFyYW1zID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdmFyIGksIGl6LCByZXN1bHQsIGhhc0RlZmF1bHQ7XG5cbiAgICAgICAgaGFzRGVmYXVsdCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IFN5bnRheC5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICFub2RlLnJlc3QgJiYgKCFub2RlLmRlZmF1bHRzIHx8IG5vZGUuZGVmYXVsdHMubGVuZ3RoID09PSAwKSAmJlxuICAgICAgICAgICAgICAgIG5vZGUucGFyYW1zLmxlbmd0aCA9PT0gMSAmJiBub2RlLnBhcmFtc1swXS50eXBlID09PSBTeW50YXguSWRlbnRpZmllcikge1xuICAgICAgICAgICAgLy8gYXJnID0+IHsgfSBjYXNlXG4gICAgICAgICAgICByZXN1bHQgPSBbZ2VuZXJhdGVBc3luY1ByZWZpeChub2RlLCB0cnVlKSwgZ2VuZXJhdGVJZGVudGlmaWVyKG5vZGUucGFyYW1zWzBdKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBub2RlLnR5cGUgPT09IFN5bnRheC5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiA/IFtnZW5lcmF0ZUFzeW5jUHJlZml4KG5vZGUsIGZhbHNlKV0gOiBbXTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcoJyk7XG4gICAgICAgICAgICBpZiAobm9kZS5kZWZhdWx0cykge1xuICAgICAgICAgICAgICAgIGhhc0RlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBub2RlLnBhcmFtcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlZmF1bHQgJiYgbm9kZS5kZWZhdWx0c1tpXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVBc3NpZ25tZW50KG5vZGUucGFyYW1zW2ldLCBub2RlLmRlZmF1bHRzW2ldLCAnPScsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlUGF0dGVybihub2RlLnBhcmFtc1tpXSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9kZS5yZXN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyYW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcuLi4nKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUlkZW50aWZpZXIobm9kZS5yZXN0KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcpJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZUZ1bmN0aW9uQm9keSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHZhciByZXN1bHQsIGV4cHI7XG5cbiAgICAgICAgcmVzdWx0ID0gdGhpcy5nZW5lcmF0ZUZ1bmN0aW9uUGFyYW1zKG5vZGUpO1xuXG4gICAgICAgIGlmIChub2RlLnR5cGUgPT09IFN5bnRheC5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJz0+Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICBleHByID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24obm9kZS5ib2R5LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKTtcbiAgICAgICAgICAgIGlmIChleHByLnRvU3RyaW5nKCkuY2hhckF0KDApID09PSAneycpIHtcbiAgICAgICAgICAgICAgICBleHByID0gWycoJywgZXhwciwgJyknXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGV4cHIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKG5vZGUuYm9keSwgU19UVEZGKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZUl0ZXJhdGlvbkZvclN0YXRlbWVudCA9IGZ1bmN0aW9uIChvcGVyYXRvciwgc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFsnZm9yJyArIChzdG10LmF3YWl0ID8gbm9FbXB0eVNwYWNlKCkgKyAnYXdhaXQnIDogJycpICsgc3BhY2UgKyAnKCddLCB0aGF0ID0gdGhpcztcbiAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoc3RtdC5sZWZ0LnR5cGUgPT09IFN5bnRheC5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN0bXQubGVmdC5raW5kICsgbm9FbXB0eVNwYWNlKCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KHN0bXQubGVmdC5kZWNsYXJhdGlvbnNbMF0sIFNfRkZGRikpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmxlZnQsIFByZWNlZGVuY2UuQ2FsbCwgRV9UVFQpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIG9wZXJhdG9yKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IFtqb2luKFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnJpZ2h0LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKVxuICAgICAgICAgICAgKSwgJyknXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmJvZHksIGZsYWdzKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIENvZGVHZW5lcmF0b3IucHJvdG90eXBlLmdlbmVyYXRlUHJvcGVydHlLZXkgPSBmdW5jdGlvbiAoZXhwciwgY29tcHV0ZWQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICAgIGlmIChjb21wdXRlZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ1snKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpKTtcblxuICAgICAgICBpZiAoY29tcHV0ZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCddJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBDb2RlR2VuZXJhdG9yLnByb3RvdHlwZS5nZW5lcmF0ZUFzc2lnbm1lbnQgPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQsIG9wZXJhdG9yLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICBpZiAoUHJlY2VkZW5jZS5Bc3NpZ25tZW50IDwgcHJlY2VkZW5jZSkge1xuICAgICAgICAgICAgZmxhZ3MgfD0gRl9BTExPV19JTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24obGVmdCwgUHJlY2VkZW5jZS5DYWxsLCBmbGFncyksXG4gICAgICAgICAgICAgICAgc3BhY2UgKyBvcGVyYXRvciArIHNwYWNlLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHJpZ2h0LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGZsYWdzKVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFByZWNlZGVuY2UuQXNzaWdubWVudCxcbiAgICAgICAgICAgIHByZWNlZGVuY2VcbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuc2VtaWNvbG9uID0gZnVuY3Rpb24gKGZsYWdzKSB7XG4gICAgICAgIGlmICghc2VtaWNvbG9ucyAmJiBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnOyc7XG4gICAgfTtcblxuICAgIC8vIFN0YXRlbWVudHMuXG5cbiAgICBDb2RlR2VuZXJhdG9yLlN0YXRlbWVudCA9IHtcblxuICAgICAgICBCbG9ja1N0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmFuZ2UsIGNvbnRlbnQsIHJlc3VsdCA9IFsneycsIG5ld2xpbmVdLCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGZ1bmN0aW9ucyB3aXRob3V0IGFueSBjb2RlXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuYm9keS5sZW5ndGggPT09IDAgJiYgcHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlID0gc3RtdC5yYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlWzFdIC0gcmFuZ2VbMF0gPiAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gc291cmNlQ29kZS5zdWJzdHJpbmcocmFuZ2VbMF0gKyAxLCByYW5nZVsxXSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRbMF0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gWyd7J107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBpLCBpeiwgZnJhZ21lbnQsIGJvZHlGbGFncztcbiAgICAgICAgICAgICAgICBib2R5RmxhZ3MgPSBTX1RGRkY7XG4gICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRl9GVU5DX0JPRFkpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keUZsYWdzIHw9IEZfRElSRUNUSVZFX0NUWDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0bXQuYm9keS5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZUJsYW5rTGluZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYmVmb3JlIHRoZSBmaXJzdCBsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmJvZHlbMF0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gc3RtdC5ib2R5WzBdLmxlYWRpbmdDb21tZW50c1swXS5leHRlbmRlZFJhbmdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gc291cmNlQ29kZS5zdWJzdHJpbmcocmFuZ2VbMF0sIHJhbmdlWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRbMF0gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ3snXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVswXS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQucmFuZ2VbMF0sIHN0bXQuYm9keVswXS5yYW5nZVswXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYmV0d2VlbiBsaW5lc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaSAtIDFdLnRyYWlsaW5nQ29tbWVudHMgICYmICFzdG10LmJvZHlbaV0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlQmxhbmtMaW5lcyhzdG10LmJvZHlbaSAtIDFdLnJhbmdlWzFdLCBzdG10LmJvZHlbaV0ucmFuZ2VbMF0sIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGl6IC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keUZsYWdzIHw9IEZfU0VNSUNPTE9OX09QVDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmJvZHlbaV0ubGVhZGluZ0NvbW1lbnRzICYmIHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGF0LmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuYm9keVtpXSwgYm9keUZsYWdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gYWRkSW5kZW50KHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5ib2R5W2ldLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoZnJhZ21lbnQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzICYmIGkgPCBpeiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhZGQgYSBuZXcgbGluZSBpZiB0aGVyZSBhcmUgbGVhZGluZyBjb21lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG5leHQgc3RhdGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaSArIDFdLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHNwYWNlcyBhZnRlciB0aGUgbGFzdCBsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaV0udHJhaWxpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUJsYW5rTGluZXMoc3RtdC5ib2R5W2ldLnJhbmdlWzFdLCBzdG10LnJhbmdlWzFdLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXN1bHQucHVzaChhZGRJbmRlbnQoJ30nKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEJyZWFrU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChzdG10LmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdicmVhayAnICsgc3RtdC5sYWJlbC5uYW1lICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICdicmVhaycgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ29udGludWVTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgaWYgKHN0bXQubGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbnRpbnVlICcgKyBzdG10LmxhYmVsLm5hbWUgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ2NvbnRpbnVlJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDbGFzc0JvZHk6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsgJ3snLCBuZXdsaW5lXSwgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKGluZGVudCkge1xuICAgICAgICAgICAgICAgIHZhciBpLCBpejtcblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5ib2R5Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5ib2R5W2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYmFzZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnfScpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBDbGFzc0RlY2xhcmF0aW9uOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50O1xuICAgICAgICAgICAgcmVzdWx0ICA9IFsnY2xhc3MnXTtcbiAgICAgICAgICAgIGlmIChzdG10LmlkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuaWQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RtdC5zdXBlckNsYXNzKSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBqb2luKCdleHRlbmRzJywgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zdXBlckNsYXNzLCBQcmVjZWRlbmNlLlVuYXJ5LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuYm9keSwgU19URkZUKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIERpcmVjdGl2ZVN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoZXh0cmEucmF3ICYmIHN0bXQucmF3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0bXQucmF3ICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVzY2FwZURpcmVjdGl2ZShzdG10LmRpcmVjdGl2ZSkgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRG9XaGlsZVN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICAvLyBCZWNhdXNlIGBkbyA0MiB3aGlsZSAoY29uZClgIGlzIFN5bnRheCBFcnJvci4gV2UgbmVlZCBzZW1pY29sb24uXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gam9pbignZG8nLCB0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBTX1RGRkYpKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChzdG10LmJvZHksIHJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm4gam9pbihyZXN1bHQsIFtcbiAgICAgICAgICAgICAgICAnd2hpbGUnICsgc3BhY2UgKyAnKCcsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC50ZXN0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgJyknICsgdGhpcy5zZW1pY29sb24oZmxhZ3MpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDYXRjaENsYXVzZTogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBndWFyZDtcblxuICAgICAgICAgICAgICAgIGlmIChzdG10LnBhcmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjYXRjaCcgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQucGFyYW0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICcpJ1xuICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdG10Lmd1YXJkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBndWFyZCA9IHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuZ3VhcmQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zcGxpY2UoMiwgMCwgJyBpZiAnLCBndWFyZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ2NhdGNoJ107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBTX1RGRkYpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRGVidWdnZXJTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuICdkZWJ1Z2dlcicgKyB0aGlzLnNlbWljb2xvbihmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRW1wdHlTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuICc7JztcbiAgICAgICAgfSxcblxuICAgICAgICBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsgJ2V4cG9ydCcgXSwgYm9keUZsYWdzO1xuXG4gICAgICAgICAgICBib2R5RmxhZ3MgPSAoZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQpID8gU19URkZUIDogU19URkZGO1xuXG4gICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBIb2lzdGFibGVEZWNsYXJhdGlvbltEZWZhdWx0XVxuICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgQXNzaWdubWVudEV4cHJlc3Npb25bSW5dIDtcbiAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCAnZGVmYXVsdCcpO1xuICAgICAgICAgICAgaWYgKGlzU3RhdGVtZW50KHN0bXQuZGVjbGFyYXRpb24pKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5kZWNsYXJhdGlvbiwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmRlY2xhcmF0aW9uLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsgJ2V4cG9ydCcgXSwgYm9keUZsYWdzLCB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgYm9keUZsYWdzID0gKGZsYWdzICYgRl9TRU1JQ09MT05fT1BUKSA/IFNfVEZGVCA6IFNfVEZGRjtcblxuICAgICAgICAgICAgLy8gZXhwb3J0IFZhcmlhYmxlU3RhdGVtZW50XG4gICAgICAgICAgICAvLyBleHBvcnQgRGVjbGFyYXRpb25bRGVmYXVsdF1cbiAgICAgICAgICAgIGlmIChzdG10LmRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuZGVjbGFyYXRpb24sIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBleHBvcnQgRXhwb3J0Q2xhdXNlW05vUmVmZXJlbmNlXSBGcm9tQ2xhdXNlIDtcbiAgICAgICAgICAgIC8vIGV4cG9ydCBFeHBvcnRDbGF1c2UgO1xuICAgICAgICAgICAgaWYgKHN0bXQuc3BlY2lmaWVycykge1xuICAgICAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCAneycgKyBzcGFjZSArICd9Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdG10LnNwZWNpZmllcnNbMF0udHlwZSA9PT0gU3ludGF4LkV4cG9ydEJhdGNoU3BlY2lmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbMF0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsICd7Jyk7XG4gICAgICAgICAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKGluZGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0bXQuc3BlY2lmaWVycy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgbmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYmFzZSArICd9Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICAnZnJvbScgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vZHVsZVNwZWNpZmllclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zb3VyY2UsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VtaWNvbG9uKGZsYWdzKVxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbWljb2xvbihmbGFncykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRXhwb3J0QWxsRGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgLy8gZXhwb3J0ICogRnJvbUNsYXVzZSA7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICdleHBvcnQnICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgJyonICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgJ2Zyb20nICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zb3VyY2UsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbWljb2xvbihmbGFncylcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBmcmFnbWVudDtcblxuICAgICAgICAgICAgZnVuY3Rpb24gaXNDbGFzc1ByZWZpeGVkKGZyYWdtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZGU7XG4gICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50LnNsaWNlKDAsIDUpICE9PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29kZSA9IGZyYWdtZW50LmNoYXJDb2RlQXQoNSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUgPT09IDB4N0IgIC8qICd7JyAqLyB8fCBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGNvZGUpIHx8IGVzdXRpbHMuY29kZS5pc0xpbmVUZXJtaW5hdG9yKGNvZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uUHJlZml4ZWQoZnJhZ21lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZTtcbiAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuc2xpY2UoMCwgOCkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2RlID0gZnJhZ21lbnQuY2hhckNvZGVBdCg4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZSA9PT0gMHgyOCAvKiAnKCcgKi8gfHwgZXN1dGlscy5jb2RlLmlzV2hpdGVTcGFjZShjb2RlKSB8fCBjb2RlID09PSAweDJBICAvKiAnKicgKi8gfHwgZXN1dGlscy5jb2RlLmlzTGluZVRlcm1pbmF0b3IoY29kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGlzQXN5bmNQcmVmaXhlZChmcmFnbWVudCkge1xuICAgICAgICAgICAgICAgIHZhciBjb2RlLCBpLCBpejtcbiAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuc2xpY2UoMCwgNSkgIT09ICdhc3luYycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVzdXRpbHMuY29kZS5pc1doaXRlU3BhY2UoZnJhZ21lbnQuY2hhckNvZGVBdCg1KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSA2LCBpeiA9IGZyYWdtZW50Lmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGZyYWdtZW50LmNoYXJDb2RlQXQoaSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuc2xpY2UoaSwgaSArIDgpICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29kZSA9IGZyYWdtZW50LmNoYXJDb2RlQXQoaSArIDgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlID09PSAweDI4IC8qICcoJyAqLyB8fCBlc3V0aWxzLmNvZGUuaXNXaGl0ZVNwYWNlKGNvZGUpIHx8IGNvZGUgPT09IDB4MkEgIC8qICcqJyAqLyB8fCBlc3V0aWxzLmNvZGUuaXNMaW5lVGVybWluYXRvcihjb2RlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuZXhwcmVzc2lvbiwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXTtcbiAgICAgICAgICAgIC8vIDEyLjQgJ3snLCAnZnVuY3Rpb24nLCAnY2xhc3MnIGlzIG5vdCBhbGxvd2VkIGluIHRoaXMgcG9zaXRpb24uXG4gICAgICAgICAgICAvLyB3cmFwIGV4cHJlc3Npb24gd2l0aCBwYXJlbnRoZXNlc1xuICAgICAgICAgICAgZnJhZ21lbnQgPSB0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGlmIChmcmFnbWVudC5jaGFyQ29kZUF0KDApID09PSAweDdCICAvKiAneycgKi8gfHwgIC8vIE9iamVjdEV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgaXNDbGFzc1ByZWZpeGVkKGZyYWdtZW50KSB8fFxuICAgICAgICAgICAgICAgICAgICBpc0Z1bmN0aW9uUHJlZml4ZWQoZnJhZ21lbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgIGlzQXN5bmNQcmVmaXhlZChmcmFnbWVudCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSAmJiAoZmxhZ3MgJiBGX0RJUkVDVElWRV9DVFgpICYmIHN0bXQuZXhwcmVzc2lvbi50eXBlID09PSBTeW50YXguTGl0ZXJhbCAmJiB0eXBlb2Ygc3RtdC5leHByZXNzaW9uLnZhbHVlID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbJygnLCByZXN1bHQsICcpJyArIHRoaXMuc2VtaWNvbG9uKGZsYWdzKV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuc2VtaWNvbG9uKGZsYWdzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEltcG9ydERlY2xhcmF0aW9uOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIC8vIEVTNjogMTUuMi4xIHZhbGlkIGltcG9ydCBkZWNsYXJhdGlvbnM6XG4gICAgICAgICAgICAvLyAgICAgLSBpbXBvcnQgSW1wb3J0Q2xhdXNlIEZyb21DbGF1c2UgO1xuICAgICAgICAgICAgLy8gICAgIC0gaW1wb3J0IE1vZHVsZVNwZWNpZmllciA7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBjdXJzb3IsIHRoYXQgPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyBJZiBubyBJbXBvcnRDbGF1c2UgaXMgcHJlc2VudCxcbiAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIGJlIGBpbXBvcnQgTW9kdWxlU3BlY2lmaWVyYCBzbyBza2lwIGBmcm9tYFxuICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyIGlzIFN0cmluZ0xpdGVyYWwuXG4gICAgICAgICAgICBpZiAoc3RtdC5zcGVjaWZpZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIGltcG9ydCBNb2R1bGVTcGVjaWZpZXIgO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICdpbXBvcnQnLFxuICAgICAgICAgICAgICAgICAgICBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuc291cmNlLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VtaWNvbG9uKGZsYWdzKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGltcG9ydCBJbXBvcnRDbGF1c2UgRnJvbUNsYXVzZSA7XG4gICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgJ2ltcG9ydCdcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBjdXJzb3IgPSAwO1xuXG4gICAgICAgICAgICAvLyBJbXBvcnRlZEJpbmRpbmdcbiAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnNbY3Vyc29yXS50eXBlID09PSBTeW50YXguSW1wb3J0RGVmYXVsdFNwZWNpZmllcikge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbY3Vyc29yXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgKytjdXJzb3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdG10LnNwZWNpZmllcnNbY3Vyc29yXSkge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5zcGVjaWZpZXJzW2N1cnNvcl0udHlwZSA9PT0gU3ludGF4LkltcG9ydE5hbWVzcGFjZVNwZWNpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBOYW1lU3BhY2VJbXBvcnRcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnNwZWNpZmllcnNbY3Vyc29yXSwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5hbWVkSW1wb3J0c1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSArICd7Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChzdG10LnNwZWNpZmllcnMubGVuZ3RoIC0gY3Vyc29yKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0IHsgLi4uIH0gZnJvbSBcIi4uLlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zcGVjaWZpZXJzW2N1cnNvcl0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSArICd9JyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcG9ydCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAuLi4sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAuLi4sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGZyb20gXCIuLi5cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKGluZGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBpejtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBjdXJzb3IsIGl6ID0gc3RtdC5zcGVjaWZpZXJzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zcGVjaWZpZXJzW2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgbmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJhc2UgKyAnfScgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbXG4gICAgICAgICAgICAgICAgJ2Zyb20nICsgc3BhY2UsXG4gICAgICAgICAgICAgICAgLy8gTW9kdWxlU3BlY2lmaWVyXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5zb3VyY2UsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNlbWljb2xvbihmbGFncylcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBWYXJpYWJsZURlY2xhcmF0b3I6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIGl0ZW1GbGFncyA9IChmbGFncyAmIEZfQUxMT1dfSU4pID8gRV9UVFQgOiBFX0ZUVDtcbiAgICAgICAgICAgIGlmIChzdG10LmluaXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmlkLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGl0ZW1GbGFncyksXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICAnPScsXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmluaXQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgaXRlbUZsYWdzKVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVBhdHRlcm4oc3RtdC5pZCwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBpdGVtRmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb246IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgLy8gVmFyaWFibGVEZWNsYXJhdG9yIGlzIHR5cGVkIGFzIFN0YXRlbWVudCxcbiAgICAgICAgICAgIC8vIGJ1dCBqb2luZWQgd2l0aCBjb21tYSAobm90IExpbmVUZXJtaW5hdG9yKS5cbiAgICAgICAgICAgIC8vIFNvIGlmIGNvbW1lbnQgaXMgYXR0YWNoZWQgdG8gdGFyZ2V0IG5vZGUsIHdlIHNob3VsZCBzcGVjaWFsaXplLlxuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXosIG5vZGUsIGJvZHlGbGFncywgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgICAgIHJlc3VsdCA9IFsgc3RtdC5raW5kIF07XG5cbiAgICAgICAgICAgIGJvZHlGbGFncyA9IChmbGFncyAmIEZfQUxMT1dfSU4pID8gU19URkZGIDogU19GRkZGO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBibG9jaygpIHtcbiAgICAgICAgICAgICAgICBub2RlID0gc3RtdC5kZWNsYXJhdGlvbnNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnQgJiYgbm9kZS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJ1xcbicpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChhZGRJbmRlbnQodGhhdC5nZW5lcmF0ZVN0YXRlbWVudChub2RlLCBib2R5RmxhZ3MpKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9FbXB0eVNwYWNlKCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KG5vZGUsIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDEsIGl6ID0gc3RtdC5kZWNsYXJhdGlvbnMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gc3RtdC5kZWNsYXJhdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChleHRyYS5jb21tZW50ICYmIG5vZGUubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFkZEluZGVudCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KG5vZGUsIGJvZHlGbGFncykpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQobm9kZSwgYm9keUZsYWdzKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdG10LmRlY2xhcmF0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgd2l0aEluZGVudChibG9jayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJsb2NrKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuc2VtaWNvbG9uKGZsYWdzKSk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVGhyb3dTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIFtqb2luKFxuICAgICAgICAgICAgICAgICd0aHJvdycsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5hcmd1bWVudCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXG4gICAgICAgICAgICApLCB0aGlzLnNlbWljb2xvbihmbGFncyldO1xuICAgICAgICB9LFxuXG4gICAgICAgIFRyeVN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpeiwgZ3VhcmRlZEhhbmRsZXJzO1xuXG4gICAgICAgICAgICByZXN1bHQgPSBbJ3RyeScsIHRoaXMubWF5YmVCbG9jayhzdG10LmJsb2NrLCBTX1RGRkYpXTtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChzdG10LmJsb2NrLCByZXN1bHQpO1xuXG4gICAgICAgICAgICBpZiAoc3RtdC5oYW5kbGVycykge1xuICAgICAgICAgICAgICAgIC8vIG9sZCBpbnRlcmZhY2VcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IHN0bXQuaGFuZGxlcnMubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmhhbmRsZXJzW2ldLCBTX1RGRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0bXQuZmluYWxpemVyIHx8IGkgKyAxICE9PSBpeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KHN0bXQuaGFuZGxlcnNbaV0uYm9keSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ3VhcmRlZEhhbmRsZXJzID0gc3RtdC5ndWFyZGVkSGFuZGxlcnMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGd1YXJkZWRIYW5kbGVycy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KGd1YXJkZWRIYW5kbGVyc1tpXSwgU19URkZGKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmZpbmFsaXplciB8fCBpICsgMSAhPT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMubWF5YmVCbG9ja1N1ZmZpeChndWFyZGVkSGFuZGxlcnNbaV0uYm9keSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIG5ldyBpbnRlcmZhY2VcbiAgICAgICAgICAgICAgICBpZiAoc3RtdC5oYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0bXQuaGFuZGxlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5oYW5kbGVyLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmhhbmRsZXJbaV0sIFNfVEZGRikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdG10LmZpbmFsaXplciB8fCBpICsgMSAhPT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5tYXliZUJsb2NrU3VmZml4KHN0bXQuaGFuZGxlcltpXS5ib2R5LCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuaGFuZGxlciwgU19URkZGKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RtdC5maW5hbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1heWJlQmxvY2tTdWZmaXgoc3RtdC5oYW5kbGVyLmJvZHksIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RtdC5maW5hbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgWydmaW5hbGx5JywgdGhpcy5tYXliZUJsb2NrKHN0bXQuZmluYWxpemVyLCBTX1RGRkYpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIFN3aXRjaFN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBmcmFnbWVudCwgaSwgaXosIGJvZHlGbGFncywgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICdzd2l0Y2gnICsgc3BhY2UgKyAnKCcsXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQuZGlzY3JpbWluYW50LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgICcpJyArIHNwYWNlICsgJ3snICsgbmV3bGluZVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChzdG10LmNhc2VzKSB7XG4gICAgICAgICAgICAgICAgYm9keUZsYWdzID0gU19URkZGO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gc3RtdC5jYXNlcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBpeiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlGbGFncyB8PSBGX1NFTUlDT0xPTl9PUFQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBhZGRJbmRlbnQodGhpcy5nZW5lcmF0ZVN0YXRlbWVudChzdG10LmNhc2VzW2ldLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goYWRkSW5kZW50KCd9JykpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBTd2l0Y2hDYXNlOiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50LCBpLCBpeiwgYm9keUZsYWdzLCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChzdG10LnRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgam9pbignY2FzZScsIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQudGVzdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICc6J1xuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsnZGVmYXVsdDonXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgICAgICBpeiA9IHN0bXQuY29uc2VxdWVudC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGl6ICYmIHN0bXQuY29uc2VxdWVudFswXS50eXBlID09PSBTeW50YXguQmxvY2tTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGF0Lm1heWJlQmxvY2soc3RtdC5jb25zZXF1ZW50WzBdLCBTX1RGRkYpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGkgPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpICE9PSBpeiAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYm9keUZsYWdzID0gU19URkZGO1xuICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXogLSAxICYmIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5RmxhZ3MgfD0gRl9TRU1JQ09MT05fT1BUO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gYWRkSW5kZW50KHRoYXQuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5jb25zZXF1ZW50W2ldLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgIT09IGl6ICYmICFlbmRzV2l0aExpbmVUZXJtaW5hdG9yKHRvU291cmNlTm9kZVdoZW5OZWVkZWQoZnJhZ21lbnQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBJZlN0YXRlbWVudDogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBib2R5RmxhZ3MsIHNlbWljb2xvbk9wdGlvbmFsLCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ2lmJyArIHNwYWNlICsgJygnLFxuICAgICAgICAgICAgICAgICAgICB0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LnRlc3QsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VtaWNvbG9uT3B0aW9uYWwgPSBmbGFncyAmIEZfU0VNSUNPTE9OX09QVDtcbiAgICAgICAgICAgIGJvZHlGbGFncyA9IFNfVEZGRjtcbiAgICAgICAgICAgIGlmIChzZW1pY29sb25PcHRpb25hbCkge1xuICAgICAgICAgICAgICAgIGJvZHlGbGFncyB8PSBGX1NFTUlDT0xPTl9PUFQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RtdC5hbHRlcm5hdGUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5jb25zZXF1ZW50LCBTX1RGRkYpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLm1heWJlQmxvY2tTdWZmaXgoc3RtdC5jb25zZXF1ZW50LCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmIChzdG10LmFsdGVybmF0ZS50eXBlID09PSBTeW50YXguSWZTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIFsnZWxzZSAnLCB0aGlzLmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuYWx0ZXJuYXRlLCBib2R5RmxhZ3MpXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGpvaW4oJ2Vsc2UnLCB0aGlzLm1heWJlQmxvY2soc3RtdC5hbHRlcm5hdGUsIGJvZHlGbGFncykpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubWF5YmVCbG9jayhzdG10LmNvbnNlcXVlbnQsIGJvZHlGbGFncykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBGb3JTdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbJ2ZvcicgKyBzcGFjZSArICcoJ107XG4gICAgICAgICAgICAgICAgaWYgKHN0bXQuaW5pdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RtdC5pbml0LnR5cGUgPT09IFN5bnRheC5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlU3RhdGVtZW50KHN0bXQuaW5pdCwgU19GRkZGKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGX0FMTE9XX0lOIGJlY29tZXMgZmFsc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihzdG10LmluaXQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfRlRUKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnOycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzsnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RtdC50ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC50ZXN0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnOycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc7Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHN0bXQudXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNwYWNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC51cGRhdGUsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcpJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJyknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKHN0bXQuYm9keSwgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQgPyBTX1RGRlQgOiBTX1RGRkYpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRm9ySW5TdGF0ZW1lbnQ6IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVJdGVyYXRpb25Gb3JTdGF0ZW1lbnQoJ2luJywgc3RtdCwgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQgPyBTX1RGRlQgOiBTX1RGRkYpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEZvck9mU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlSXRlcmF0aW9uRm9yU3RhdGVtZW50KCdvZicsIHN0bXQsIGZsYWdzICYgRl9TRU1JQ09MT05fT1BUID8gU19URkZUIDogU19URkZGKTtcbiAgICAgICAgfSxcblxuICAgICAgICBMYWJlbGVkU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBbc3RtdC5sYWJlbC5uYW1lICsgJzonLCB0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCA/IFNfVEZGVCA6IFNfVEZGRildO1xuICAgICAgICB9LFxuXG4gICAgICAgIFByb2dyYW06IGZ1bmN0aW9uIChzdG10LCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQsIGksIGl6LCBib2R5RmxhZ3M7XG4gICAgICAgICAgICBpeiA9IHN0bXQuYm9keS5sZW5ndGg7XG4gICAgICAgICAgICByZXN1bHQgPSBbc2FmZUNvbmNhdGVuYXRpb24gJiYgaXogPiAwID8gJ1xcbicgOiAnJ107XG4gICAgICAgICAgICBib2R5RmxhZ3MgPSBTX1RGVEY7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmICghc2FmZUNvbmNhdGVuYXRpb24gJiYgaSA9PT0gaXogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHlGbGFncyB8PSBGX1NFTUlDT0xPTl9PUFQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgc3BhY2VzIGJlZm9yZSB0aGUgZmlyc3QgbGluZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbMF0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQucmFuZ2VbMF0sIHN0bXQuYm9keVtpXS5yYW5nZVswXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYmV0d2VlbiBsaW5lc1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RtdC5ib2R5W2kgLSAxXS50cmFpbGluZ0NvbW1lbnRzICYmICFzdG10LmJvZHlbaV0ubGVhZGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQuYm9keVtpIC0gMV0ucmFuZ2VbMV0sIHN0bXQuYm9keVtpXS5yYW5nZVswXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gYWRkSW5kZW50KHRoaXMuZ2VuZXJhdGVTdGF0ZW1lbnQoc3RtdC5ib2R5W2ldLCBib2R5RmxhZ3MpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXogJiYgIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChmcmFnbWVudCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlQmxhbmtMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG10LmJvZHlbaSArIDFdLmxlYWRpbmdDb21tZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocHJlc2VydmVCbGFua0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzcGFjZXMgYWZ0ZXIgdGhlIGxhc3QgbGluZVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaXogLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0bXQuYm9keVtpXS50cmFpbGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVCbGFua0xpbmVzKHN0bXQuYm9keVtpXS5yYW5nZVsxXSwgc3RtdC5yYW5nZVsxXSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgRnVuY3Rpb25EZWNsYXJhdGlvbjogZnVuY3Rpb24gKHN0bXQsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXN5bmNQcmVmaXgoc3RtdCwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZVN0YXJTdWZmaXgoc3RtdCkgfHwgbm9FbXB0eVNwYWNlKCksXG4gICAgICAgICAgICAgICAgc3RtdC5pZCA/IGdlbmVyYXRlSWRlbnRpZmllcihzdG10LmlkKSA6ICcnLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVGdW5jdGlvbkJvZHkoc3RtdClcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgUmV0dXJuU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChzdG10LmFyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtqb2luKFxuICAgICAgICAgICAgICAgICAgICAncmV0dXJuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5hcmd1bWVudCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpXG4gICAgICAgICAgICAgICAgKSwgdGhpcy5zZW1pY29sb24oZmxhZ3MpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbJ3JldHVybicgKyB0aGlzLnNlbWljb2xvbihmbGFncyldO1xuICAgICAgICB9LFxuXG4gICAgICAgIFdoaWxlU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAnd2hpbGUnICsgc3BhY2UgKyAnKCcsXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKHN0bXQudGVzdCwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpLFxuICAgICAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLm1heWJlQmxvY2soc3RtdC5ib2R5LCBmbGFncyAmIEZfU0VNSUNPTE9OX09QVCA/IFNfVEZGVCA6IFNfVEZGRikpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBXaXRoU3RhdGVtZW50OiBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgICAgICAnd2l0aCcgKyBzcGFjZSArICcoJyxcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oc3RtdC5vYmplY3QsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSxcbiAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5tYXliZUJsb2NrKHN0bXQuYm9keSwgZmxhZ3MgJiBGX1NFTUlDT0xPTl9PUFQgPyBTX1RGRlQgOiBTX1RGRkYpKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICBtZXJnZShDb2RlR2VuZXJhdG9yLnByb3RvdHlwZSwgQ29kZUdlbmVyYXRvci5TdGF0ZW1lbnQpO1xuXG4gICAgLy8gRXhwcmVzc2lvbnMuXG5cbiAgICBDb2RlR2VuZXJhdG9yLkV4cHJlc3Npb24gPSB7XG5cbiAgICAgICAgU2VxdWVuY2VFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGksIGl6O1xuICAgICAgICAgICAgaWYgKFByZWNlZGVuY2UuU2VxdWVuY2UgPCBwcmVjZWRlbmNlKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRl9BTExPV19JTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLmV4cHJlc3Npb25zLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmV4cHJlc3Npb25zW2ldLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIGZsYWdzKSk7XG4gICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJywnICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUFzc2lnbm1lbnQoZXhwci5sZWZ0LCBleHByLnJpZ2h0LCBleHByLm9wZXJhdG9yLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZSh0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIpLCBQcmVjZWRlbmNlLkFycm93RnVuY3Rpb24sIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoUHJlY2VkZW5jZS5Db25kaXRpb25hbCA8IHByZWNlZGVuY2UpIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSBGX0FMTE9XX0lOO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIudGVzdCwgUHJlY2VkZW5jZS5Db2FsZXNjZSwgZmxhZ3MpLFxuICAgICAgICAgICAgICAgICAgICBzcGFjZSArICc/JyArIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmNvbnNlcXVlbnQsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgZmxhZ3MpLFxuICAgICAgICAgICAgICAgICAgICBzcGFjZSArICc6JyArIHNwYWNlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmFsdGVybmF0ZSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBmbGFncylcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIFByZWNlZGVuY2UuQ29uZGl0aW9uYWwsXG4gICAgICAgICAgICAgICAgcHJlY2VkZW5jZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSxcblxuICAgICAgICBMb2dpY2FsRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICBpZiAoZXhwci5vcGVyYXRvciA9PT0gJz8/Jykge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZfRk9VTkRfQ09BTEVTQ0U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5CaW5hcnlFeHByZXNzaW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBCaW5hcnlFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGxlZnRQcmVjZWRlbmNlLCByaWdodFByZWNlZGVuY2UsIGN1cnJlbnRQcmVjZWRlbmNlLCBmcmFnbWVudCwgbGVmdFNvdXJjZTtcbiAgICAgICAgICAgIGN1cnJlbnRQcmVjZWRlbmNlID0gQmluYXJ5UHJlY2VkZW5jZVtleHByLm9wZXJhdG9yXTtcbiAgICAgICAgICAgIGxlZnRQcmVjZWRlbmNlID0gZXhwci5vcGVyYXRvciA9PT0gJyoqJyA/IFByZWNlZGVuY2UuUG9zdGZpeCA6IGN1cnJlbnRQcmVjZWRlbmNlO1xuICAgICAgICAgICAgcmlnaHRQcmVjZWRlbmNlID0gZXhwci5vcGVyYXRvciA9PT0gJyoqJyA/IGN1cnJlbnRQcmVjZWRlbmNlIDogY3VycmVudFByZWNlZGVuY2UgKyAxO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFByZWNlZGVuY2UgPCBwcmVjZWRlbmNlKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRl9BTExPV19JTjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmxlZnQsIGxlZnRQcmVjZWRlbmNlLCBmbGFncyk7XG5cbiAgICAgICAgICAgIGxlZnRTb3VyY2UgPSBmcmFnbWVudC50b1N0cmluZygpO1xuXG4gICAgICAgICAgICBpZiAobGVmdFNvdXJjZS5jaGFyQ29kZUF0KGxlZnRTb3VyY2UubGVuZ3RoIC0gMSkgPT09IDB4MkYgLyogLyAqLyAmJiBlc3V0aWxzLmNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShleHByLm9wZXJhdG9yLmNoYXJDb2RlQXQoMCkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW2ZyYWdtZW50LCBub0VtcHR5U3BhY2UoKSwgZXhwci5vcGVyYXRvcl07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4oZnJhZ21lbnQsIGV4cHIub3BlcmF0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucmlnaHQsIHJpZ2h0UHJlY2VkZW5jZSwgZmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoZXhwci5vcGVyYXRvciA9PT0gJy8nICYmIGZyYWdtZW50LnRvU3RyaW5nKCkuY2hhckF0KDApID09PSAnLycgfHxcbiAgICAgICAgICAgIGV4cHIub3BlcmF0b3Iuc2xpY2UoLTEpID09PSAnPCcgJiYgZnJhZ21lbnQudG9TdHJpbmcoKS5zbGljZSgwLCAzKSA9PT0gJyEtLScpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiAnLycgY29uY2F0cyB3aXRoICcvJyBvciBgPGAgY29uY2F0cyB3aXRoIGAhLS1gLCBpdCBpcyBpbnRlcnByZXRlZCBhcyBjb21tZW50IHN0YXJ0XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9FbXB0eVNwYWNlKCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZyYWdtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsIGZyYWdtZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIub3BlcmF0b3IgPT09ICdpbicgJiYgIShmbGFncyAmIEZfQUxMT1dfSU4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsnKCcsIHJlc3VsdCwgJyknXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZXhwci5vcGVyYXRvciA9PT0gJ3x8JyB8fCBleHByLm9wZXJhdG9yID09PSAnJiYnKSAmJiAoZmxhZ3MgJiBGX0ZPVU5EX0NPQUxFU0NFKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbJygnLCByZXN1bHQsICcpJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgY3VycmVudFByZWNlZGVuY2UsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIENhbGxFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGksIGl6O1xuXG4gICAgICAgICAgICAvLyBGX0FMTE9XX1VOUEFSQVRIX05FVyBiZWNvbWVzIGZhbHNlLlxuICAgICAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuY2FsbGVlLCBQcmVjZWRlbmNlLkNhbGwsIEVfVFRGKV07XG5cbiAgICAgICAgICAgIGlmIChleHByLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJz8uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcoJyk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHJbJ2FyZ3VtZW50cyddLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByWydhcmd1bWVudHMnXVtpXSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIHNwYWNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnKScpO1xuXG4gICAgICAgICAgICBpZiAoIShmbGFncyAmIEZfQUxMT1dfQ0FMTCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWycoJywgcmVzdWx0LCAnKSddO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5DYWxsLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBDaGFpbkV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgaWYgKFByZWNlZGVuY2UuT3B0aW9uYWxDaGFpbmluZyA8IHByZWNlZGVuY2UpIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSBGX0FMTE9XX0NBTEw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmV4cHJlc3Npb24sIFByZWNlZGVuY2UuT3B0aW9uYWxDaGFpbmluZywgZmxhZ3MpO1xuXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5PcHRpb25hbENoYWluaW5nLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBOZXdFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGxlbmd0aCwgaSwgaXosIGl0ZW1GbGFncztcbiAgICAgICAgICAgIGxlbmd0aCA9IGV4cHJbJ2FyZ3VtZW50cyddLmxlbmd0aDtcblxuICAgICAgICAgICAgLy8gRl9BTExPV19DQUxMIGJlY29tZXMgZmFsc2UuXG4gICAgICAgICAgICAvLyBGX0FMTE9XX1VOUEFSQVRIX05FVyBtYXkgYmVjb21lIGZhbHNlLlxuICAgICAgICAgICAgaXRlbUZsYWdzID0gKGZsYWdzICYgRl9BTExPV19VTlBBUkFUSF9ORVcgJiYgIXBhcmVudGhlc2VzICYmIGxlbmd0aCA9PT0gMCkgPyBFX1RGVCA6IEVfVEZGO1xuXG4gICAgICAgICAgICByZXN1bHQgPSBqb2luKFxuICAgICAgICAgICAgICAgICduZXcnLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuY2FsbGVlLCBQcmVjZWRlbmNlLk5ldywgaXRlbUZsYWdzKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBGX0FMTE9XX1VOUEFSQVRIX05FVykgfHwgcGFyZW50aGVzZXMgfHwgbGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcoJyk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBsZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHJbJ2FyZ3VtZW50cyddW2ldLCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJyknKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuTmV3LCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBNZW1iZXJFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50O1xuXG4gICAgICAgICAgICAvLyBGX0FMTE9XX1VOUEFSQVRIX05FVyBiZWNvbWVzIGZhbHNlLlxuICAgICAgICAgICAgcmVzdWx0ID0gW3RoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIub2JqZWN0LCBQcmVjZWRlbmNlLkNhbGwsIChmbGFncyAmIEZfQUxMT1dfQ0FMTCkgPyBFX1RURiA6IEVfVEZGKV07XG5cbiAgICAgICAgICAgIGlmIChleHByLmNvbXB1dGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cHIub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJz8uJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJ1snKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnByb3BlcnR5LCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBmbGFncyAmIEZfQUxMT1dfQ0FMTCA/IEVfVFRUIDogRV9URlQpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnXScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4cHIub3B0aW9uYWwgJiYgZXhwci5vYmplY3QudHlwZSA9PT0gU3ludGF4LkxpdGVyYWwgJiYgdHlwZW9mIGV4cHIub2JqZWN0LnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWxsIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgMS4gTm8gZmxvYXRpbmcgcG9pbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gICAyLiBEb24ndCBoYXZlIGV4cG9uZW50c1xuICAgICAgICAgICAgICAgICAgICAvLyAgIDMuIFRoZSBsYXN0IGNoYXJhY3RlciBpcyBhIGRlY2ltYWwgZGlnaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gICA0LiBOb3QgaGV4YWRlY2ltYWwgT1Igb2N0YWwgbnVtYmVyIGxpdGVyYWxcbiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGFkZCBhIGZsb2F0aW5nIHBvaW50LlxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQuaW5kZXhPZignLicpIDwgMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEvW2VFeFhdLy50ZXN0KGZyYWdtZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdXRpbHMuY29kZS5pc0RlY2ltYWxEaWdpdChmcmFnbWVudC5jaGFyQ29kZUF0KGZyYWdtZW50Lmxlbmd0aCAtIDEpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoZnJhZ21lbnQubGVuZ3RoID49IDIgJiYgZnJhZ21lbnQuY2hhckNvZGVBdCgwKSA9PT0gNDgpICAvLyAnMCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcgJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZXhwci5vcHRpb25hbCA/ICc/LicgOiAnLicpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlbmVyYXRlSWRlbnRpZmllcihleHByLnByb3BlcnR5KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLk1lbWJlciwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgTWV0YVByb3BlcnR5OiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHR5cGVvZiBleHByLm1ldGEgPT09IFwic3RyaW5nXCIgPyBleHByLm1ldGEgOiBnZW5lcmF0ZUlkZW50aWZpZXIoZXhwci5tZXRhKSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnLicpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godHlwZW9mIGV4cHIucHJvcGVydHkgPT09IFwic3RyaW5nXCIgPyBleHByLnByb3BlcnR5IDogZ2VuZXJhdGVJZGVudGlmaWVyKGV4cHIucHJvcGVydHkpKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLk1lbWJlciwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVW5hcnlFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50LCByaWdodENoYXJDb2RlLCBsZWZ0U291cmNlLCBsZWZ0Q2hhckNvZGU7XG4gICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYXJndW1lbnQsIFByZWNlZGVuY2UuVW5hcnksIEVfVFRUKTtcblxuICAgICAgICAgICAgaWYgKHNwYWNlID09PSAnJykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4oZXhwci5vcGVyYXRvciwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbZXhwci5vcGVyYXRvcl07XG4gICAgICAgICAgICAgICAgaWYgKGV4cHIub3BlcmF0b3IubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUsIHZvaWQsIHR5cGVvZlxuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYHR5cGVvZiBbXWAsIG5vdCBgdHlwZW9mW11gXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCBpbnNlcnRpbmcgc3BhY2VzIGJldHdlZW4gb3BlcmF0b3IgYW5kIGFyZ3VtZW50IGlmIGl0IGlzIHVubmVjZXNzYXJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGxpa2UsIGAhY29uZGBcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNvdXJjZSA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBsZWZ0Q2hhckNvZGUgPSBsZWZ0U291cmNlLmNoYXJDb2RlQXQobGVmdFNvdXJjZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRDaGFyQ29kZSA9IGZyYWdtZW50LnRvU3RyaW5nKCkuY2hhckNvZGVBdCgwKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKChsZWZ0Q2hhckNvZGUgPT09IDB4MkIgIC8qICsgKi8gfHwgbGVmdENoYXJDb2RlID09PSAweDJEICAvKiAtICovKSAmJiBsZWZ0Q2hhckNvZGUgPT09IHJpZ2h0Q2hhckNvZGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVzdXRpbHMuY29kZS5pc0lkZW50aWZpZXJQYXJ0RVM1KGxlZnRDaGFyQ29kZSkgJiYgZXN1dGlscy5jb2RlLmlzSWRlbnRpZmllclBhcnRFUzUocmlnaHRDaGFyQ29kZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub0VtcHR5U3BhY2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5VbmFyeSwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgWWllbGRFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZXhwci5kZWxlZ2F0ZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9ICd5aWVsZConO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSAneWllbGQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHIuYXJndW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYXJndW1lbnQsIFByZWNlZGVuY2UuWWllbGQsIEVfVFRUKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKHJlc3VsdCwgUHJlY2VkZW5jZS5ZaWVsZCwgcHJlY2VkZW5jZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQXdhaXRFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBqb2luKFxuICAgICAgICAgICAgICAgIGV4cHIuYWxsID8gJ2F3YWl0KicgOiAnYXdhaXQnLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYXJndW1lbnQsIFByZWNlZGVuY2UuQXdhaXQsIEVfVFRUKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUocmVzdWx0LCBQcmVjZWRlbmNlLkF3YWl0LCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBVcGRhdGVFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChleHByLnByZWZpeCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUoXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIub3BlcmF0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmFyZ3VtZW50LCBQcmVjZWRlbmNlLlVuYXJ5LCBFX1RUVClcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgUHJlY2VkZW5jZS5VbmFyeSxcbiAgICAgICAgICAgICAgICAgICAgcHJlY2VkZW5jZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50aGVzaXplKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5hcmd1bWVudCwgUHJlY2VkZW5jZS5Qb3N0Zml4LCBFX1RUVCksXG4gICAgICAgICAgICAgICAgICAgIGV4cHIub3BlcmF0b3JcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIFByZWNlZGVuY2UuUG9zdGZpeCxcbiAgICAgICAgICAgICAgICBwcmVjZWRlbmNlXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXN5bmNQcmVmaXgoZXhwciwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChleHByLmlkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VuZXJhdGVTdGFyU3VmZml4KGV4cHIpIHx8IG5vRW1wdHlTcGFjZSgpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZUlkZW50aWZpZXIoZXhwci5pZCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChnZW5lcmF0ZVN0YXJTdWZmaXgoZXhwcikgfHwgc3BhY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUZ1bmN0aW9uQm9keShleHByKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEFycmF5UGF0dGVybjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5BcnJheUV4cHJlc3Npb24oZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MsIHRydWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEFycmF5RXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzLCBpc1BhdHRlcm4pIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIG11bHRpbGluZSwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICBpZiAoIWV4cHIuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdbXSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtdWx0aWxpbmUgPSBpc1BhdHRlcm4gPyBmYWxzZSA6IGV4cHIuZWxlbWVudHMubGVuZ3RoID4gMTtcbiAgICAgICAgICAgIHJlc3VsdCA9IFsnWycsIG11bHRpbGluZSA/IG5ld2xpbmUgOiAnJ107XG4gICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uIChpbmRlbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgaSwgaXo7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLmVsZW1lbnRzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleHByLmVsZW1lbnRzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA9PT0gaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobXVsdGlsaW5lID8gaW5kZW50IDogJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5lbGVtZW50c1tpXSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyAobXVsdGlsaW5lID8gbmV3bGluZSA6IHNwYWNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChtdWx0aWxpbmUgJiYgIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChtdWx0aWxpbmUgPyBiYXNlIDogJycpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ10nKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgUmVzdEVsZW1lbnQ6IGZ1bmN0aW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gJy4uLicgKyB0aGlzLmdlbmVyYXRlUGF0dGVybihleHByLmFyZ3VtZW50KTtcbiAgICAgICAgfSxcblxuICAgICAgICBDbGFzc0V4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgZnJhZ21lbnQ7XG4gICAgICAgICAgICByZXN1bHQgPSBbJ2NsYXNzJ107XG4gICAgICAgICAgICBpZiAoZXhwci5pZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmlkLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4cHIuc3VwZXJDbGFzcykge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gam9pbignZXh0ZW5kcycsIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuc3VwZXJDbGFzcywgUHJlY2VkZW5jZS5VbmFyeSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZVN0YXRlbWVudChleHByLmJvZHksIFNfVEZGVCkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBNZXRob2REZWZpbml0aW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQsIGZyYWdtZW50O1xuICAgICAgICAgICAgaWYgKGV4cHJbJ3N0YXRpYyddKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gWydzdGF0aWMnICsgc3BhY2VdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleHByLmtpbmQgPT09ICdnZXQnIHx8IGV4cHIua2luZCA9PT0gJ3NldCcpIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IFtcbiAgICAgICAgICAgICAgICAgICAgam9pbihleHByLmtpbmQsIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCkpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIudmFsdWUpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBbXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlTWV0aG9kUHJlZml4KGV4cHIpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvcGVydHlLZXkoZXhwci5rZXksIGV4cHIuY29tcHV0ZWQpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIudmFsdWUpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFByb3BlcnR5OiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIGlmIChleHByLmtpbmQgPT09ICdnZXQnIHx8IGV4cHIua2luZCA9PT0gJ3NldCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICBleHByLmtpbmQsIG5vRW1wdHlTcGFjZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvcGVydHlLZXkoZXhwci5rZXksIGV4cHIuY29tcHV0ZWQpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIudmFsdWUpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIuc2hvcnRoYW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cHIudmFsdWUudHlwZSA9PT0gXCJBc3NpZ25tZW50UGF0dGVyblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkFzc2lnbm1lbnRQYXR0ZXJuKGV4cHIudmFsdWUsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVQcm9wZXJ0eUtleShleHByLmtleSwgZXhwci5jb21wdXRlZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleHByLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlTWV0aG9kUHJlZml4KGV4cHIpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvcGVydHlLZXkoZXhwci5rZXksIGV4cHIuY29tcHV0ZWQpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRnVuY3Rpb25Cb2R5KGV4cHIudmFsdWUpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUHJvcGVydHlLZXkoZXhwci5rZXksIGV4cHIuY29tcHV0ZWQpLFxuICAgICAgICAgICAgICAgICc6JyArIHNwYWNlLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIudmFsdWUsIFByZWNlZGVuY2UuQXNzaWdubWVudCwgRV9UVFQpXG4gICAgICAgICAgICBdO1xuICAgICAgICB9LFxuXG4gICAgICAgIE9iamVjdEV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIG11bHRpbGluZSwgcmVzdWx0LCBmcmFnbWVudCwgdGhhdCA9IHRoaXM7XG5cbiAgICAgICAgICAgIGlmICghZXhwci5wcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAne30nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbXVsdGlsaW5lID0gZXhwci5wcm9wZXJ0aWVzLmxlbmd0aCA+IDE7XG5cbiAgICAgICAgICAgIHdpdGhJbmRlbnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5wcm9wZXJ0aWVzWzBdLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFtdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBpc3N1ZXMgNFxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCB0cmFuc2Zvcm0gZnJvbVxuICAgICAgICAgICAgICAgIC8vICAgZGVqYXZ1LkNsYXNzLmRlY2xhcmUoe1xuICAgICAgICAgICAgICAgIC8vICAgICAgIG1ldGhvZDI6IGZ1bmN0aW9uICgpIHt9XG4gICAgICAgICAgICAgICAgLy8gICB9KTtcbiAgICAgICAgICAgICAgICAvLyB0b1xuICAgICAgICAgICAgICAgIC8vICAgZGVqYXZ1LkNsYXNzLmRlY2xhcmUoe21ldGhvZDI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICB9fSk7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKGZyYWdtZW50KS50b1N0cmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyAneycsIHNwYWNlLCBmcmFnbWVudCwgc3BhY2UsICd9JyBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFsgJ3snLCBuZXdsaW5lLCBpbmRlbnQsIGZyYWdtZW50IF07XG5cbiAgICAgICAgICAgICAgICBpZiAobXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcsJyArIG5ld2xpbmUpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAxLCBpeiA9IGV4cHIucHJvcGVydGllcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhhdC5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5wcm9wZXJ0aWVzW2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaXopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyBuZXdsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIWVuZHNXaXRoTGluZVRlcm1pbmF0b3IodG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQpLnRvU3RyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3bGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucHVzaChiYXNlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCd9Jyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIEFzc2lnbm1lbnRQYXR0ZXJuOiBmdW5jdGlvbihleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVBc3NpZ25tZW50KGV4cHIubGVmdCwgZXhwci5yaWdodCwgJz0nLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgT2JqZWN0UGF0dGVybjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBpLCBpeiwgbXVsdGlsaW5lLCBwcm9wZXJ0eSwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICBpZiAoIWV4cHIucHJvcGVydGllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3t9JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbXVsdGlsaW5lID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZXhwci5wcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gZXhwci5wcm9wZXJ0aWVzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkudHlwZSA9PT0gU3ludGF4LlByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICYmIHByb3BlcnR5LnZhbHVlLnR5cGUgIT09IFN5bnRheC5JZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpbGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBpeiA9IGV4cHIucHJvcGVydGllcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gZXhwci5wcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS50eXBlID09PSBTeW50YXguUHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICYmICFwcm9wZXJ0eS5zaG9ydGhhbmRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgPSBbJ3snLCBtdWx0aWxpbmUgPyBuZXdsaW5lIDogJycgXTtcblxuICAgICAgICAgICAgd2l0aEluZGVudChmdW5jdGlvbiAoaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGksIGl6O1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGl6ID0gZXhwci5wcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGl6OyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobXVsdGlsaW5lID8gaW5kZW50IDogJycpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGF0LmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnByb3BlcnRpZXNbaV0sIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGl6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLCcgKyAobXVsdGlsaW5lID8gbmV3bGluZSA6IHNwYWNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG11bHRpbGluZSAmJiAhZW5kc1dpdGhMaW5lVGVybWluYXRvcih0b1NvdXJjZU5vZGVXaGVuTmVlZGVkKHJlc3VsdCkudG9TdHJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdsaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG11bHRpbGluZSA/IGJhc2UgOiAnJyk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgnfScpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBUaGlzRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3RoaXMnO1xuICAgICAgICB9LFxuXG4gICAgICAgIFN1cGVyOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiAnc3VwZXInO1xuICAgICAgICB9LFxuXG4gICAgICAgIElkZW50aWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlSWRlbnRpZmllcihleHByKTtcbiAgICAgICAgfSxcblxuICAgICAgICBJbXBvcnREZWZhdWx0U3BlY2lmaWVyOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUlkZW50aWZpZXIoZXhwci5pZCB8fCBleHByLmxvY2FsKTtcbiAgICAgICAgfSxcblxuICAgICAgICBJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFsnKiddO1xuICAgICAgICAgICAgdmFyIGlkID0gZXhwci5pZCB8fCBleHByLmxvY2FsO1xuICAgICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3BhY2UgKyAnYXMnICsgbm9FbXB0eVNwYWNlKCkgKyBnZW5lcmF0ZUlkZW50aWZpZXIoaWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgSW1wb3J0U3BlY2lmaWVyOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciBpbXBvcnRlZCA9IGV4cHIuaW1wb3J0ZWQ7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gWyBpbXBvcnRlZC5uYW1lIF07XG4gICAgICAgICAgICB2YXIgbG9jYWwgPSBleHByLmxvY2FsO1xuICAgICAgICAgICAgaWYgKGxvY2FsICYmIGxvY2FsLm5hbWUgIT09IGltcG9ydGVkLm5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChub0VtcHR5U3BhY2UoKSArICdhcycgKyBub0VtcHR5U3BhY2UoKSArIGdlbmVyYXRlSWRlbnRpZmllcihsb2NhbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcblxuICAgICAgICBFeHBvcnRTcGVjaWZpZXI6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIGxvY2FsID0gZXhwci5sb2NhbDtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbIGxvY2FsLm5hbWUgXTtcbiAgICAgICAgICAgIHZhciBleHBvcnRlZCA9IGV4cHIuZXhwb3J0ZWQ7XG4gICAgICAgICAgICBpZiAoZXhwb3J0ZWQgJiYgZXhwb3J0ZWQubmFtZSAhPT0gbG9jYWwubmFtZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vRW1wdHlTcGFjZSgpICsgJ2FzJyArIG5vRW1wdHlTcGFjZSgpICsgZ2VuZXJhdGVJZGVudGlmaWVyKGV4cG9ydGVkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIExpdGVyYWw6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJhdztcbiAgICAgICAgICAgIGlmIChleHByLmhhc093blByb3BlcnR5KCdyYXcnKSAmJiBwYXJzZSAmJiBleHRyYS5yYXcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByYXcgPSBwYXJzZShleHByLnJhdykuYm9keVswXS5leHByZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmF3LnR5cGUgPT09IFN5bnRheC5MaXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3LnZhbHVlID09PSBleHByLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cHIucmF3O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBub3QgdXNlIHJhdyBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIucmVnZXgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICcvJyArIGV4cHIucmVnZXgucGF0dGVybiArICcvJyArIGV4cHIucmVnZXguZmxhZ3M7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwci52YWx1ZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwci52YWx1ZS50b1N0cmluZygpICsgJ24nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBgZXhwci52YWx1ZWAgY2FuIGJlIG51bGwgaWYgYGV4cHIuYmlnaW50YCBleGlzdHMuIFdlIG5lZWQgdG8gY2hlY2tcbiAgICAgICAgICAgIC8vIGBleHByLmJpZ2ludGAgZmlyc3QuXG4gICAgICAgICAgICBpZiAoZXhwci5iaWdpbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwci5iaWdpbnQgKyAnbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChleHByLnZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleHByLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlc2NhcGVTdHJpbmcoZXhwci52YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwci52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVOdW1iZXIoZXhwci52YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhwci52YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cHIudmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVSZWdFeHAoZXhwci52YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgR2VuZXJhdG9yRXhwcmVzc2lvbjogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5Db21wcmVoZW5zaW9uRXhwcmVzc2lvbihleHByLCBwcmVjZWRlbmNlLCBmbGFncyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ29tcHJlaGVuc2lvbkV4cHJlc3Npb246IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgLy8gR2VuZXJhdG9yRXhwcmVzc2lvbiBzaG91bGQgYmUgcGFyZW50aGVzaXplZCB3aXRoICguLi4pLCBDb21wcmVoZW5zaW9uRXhwcmVzc2lvbiB3aXRoIFsuLi5dXG4gICAgICAgICAgICAvLyBEdWUgdG8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODgzNDY4IHBvc2l0aW9uIG9mIGV4cHIuYm9keSBjYW4gZGlmZmVyIGluIFNwaWRlcm1vbmtleSBhbmQgRVM2XG5cbiAgICAgICAgICAgIHZhciByZXN1bHQsIGksIGl6LCBmcmFnbWVudCwgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICByZXN1bHQgPSAoZXhwci50eXBlID09PSBTeW50YXguR2VuZXJhdG9yRXhwcmVzc2lvbikgPyBbJygnXSA6IFsnWyddO1xuXG4gICAgICAgICAgICBpZiAoZXh0cmEubW96LmNvbXByZWhlbnNpb25FeHByZXNzaW9uU3RhcnRzV2l0aEFzc2lnbm1lbnQpIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYm9keSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZnJhZ21lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXhwci5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICB3aXRoSW5kZW50KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLmJsb2Nrcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHRoYXQuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIuYmxvY2tzW2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDAgfHwgZXh0cmEubW96LmNvbXByZWhlbnNpb25FeHByZXNzaW9uU3RhcnRzV2l0aEFzc2lnbm1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqb2luKHJlc3VsdCwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4cHIuZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gam9pbihyZXN1bHQsICdpZicgKyBzcGFjZSk7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmZpbHRlciwgUHJlY2VkZW5jZS5TZXF1ZW5jZSwgRV9UVFQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBbICcoJywgZnJhZ21lbnQsICcpJyBdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFleHRyYS5tb3ouY29tcHJlaGVuc2lvbkV4cHJlc3Npb25TdGFydHNXaXRoQXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5ib2R5LCBQcmVjZWRlbmNlLkFzc2lnbm1lbnQsIEVfVFRUKTtcblxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpvaW4ocmVzdWx0LCBmcmFnbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChleHByLnR5cGUgPT09IFN5bnRheC5HZW5lcmF0b3JFeHByZXNzaW9uKSA/ICcpJyA6ICddJyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIENvbXByZWhlbnNpb25CbG9jazogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICB2YXIgZnJhZ21lbnQ7XG4gICAgICAgICAgICBpZiAoZXhwci5sZWZ0LnR5cGUgPT09IFN5bnRheC5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBbXG4gICAgICAgICAgICAgICAgICAgIGV4cHIubGVmdC5raW5kLCBub0VtcHR5U3BhY2UoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVN0YXRlbWVudChleHByLmxlZnQuZGVjbGFyYXRpb25zWzBdLCBTX0ZGRkYpXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmxlZnQsIFByZWNlZGVuY2UuQ2FsbCwgRV9UVFQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmcmFnbWVudCA9IGpvaW4oZnJhZ21lbnQsIGV4cHIub2YgPyAnb2YnIDogJ2luJyk7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGpvaW4oZnJhZ21lbnQsIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucmlnaHQsIFByZWNlZGVuY2UuU2VxdWVuY2UsIEVfVFRUKSk7XG5cbiAgICAgICAgICAgIHJldHVybiBbICdmb3InICsgc3BhY2UgKyAnKCcsIGZyYWdtZW50LCAnKScgXTtcbiAgICAgICAgfSxcblxuICAgICAgICBTcHJlYWRFbGVtZW50OiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgJy4uLicsXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5hcmd1bWVudCwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVClcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciBpdGVtRmxhZ3MgPSBFX1RURjtcbiAgICAgICAgICAgIGlmICghKGZsYWdzICYgRl9BTExPV19DQUxMKSkge1xuICAgICAgICAgICAgICAgIGl0ZW1GbGFncyA9IEVfVEZGO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnRhZywgUHJlY2VkZW5jZS5DYWxsLCBpdGVtRmxhZ3MpLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVFeHByZXNzaW9uKGV4cHIucXVhc2ksIFByZWNlZGVuY2UuUHJpbWFyeSwgRV9GRlQpXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudGhlc2l6ZShyZXN1bHQsIFByZWNlZGVuY2UuVGFnZ2VkVGVtcGxhdGUsIHByZWNlZGVuY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIFRlbXBsYXRlRWxlbWVudDogZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB1c2UgXCJjb29rZWRcIi4gU2luY2UgdGFnZ2VkIHRlbXBsYXRlIGNhbiB1c2UgcmF3IHRlbXBsYXRlXG4gICAgICAgICAgICAvLyByZXByZXNlbnRhdGlvbi4gU28gaWYgd2UgZG8gc28sIGl0IGJyZWFrcyB0aGUgc2NyaXB0IHNlbWFudGljcy5cbiAgICAgICAgICAgIHJldHVybiBleHByLnZhbHVlLnJhdztcbiAgICAgICAgfSxcblxuICAgICAgICBUZW1wbGF0ZUxpdGVyYWw6IGZ1bmN0aW9uIChleHByLCBwcmVjZWRlbmNlLCBmbGFncykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCwgaSwgaXo7XG4gICAgICAgICAgICByZXN1bHQgPSBbICdgJyBdO1xuICAgICAgICAgICAgZm9yIChpID0gMCwgaXogPSBleHByLnF1YXNpcy5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5nZW5lcmF0ZUV4cHJlc3Npb24oZXhwci5xdWFzaXNbaV0sIFByZWNlZGVuY2UuUHJpbWFyeSwgRV9UVFQpKTtcbiAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpeikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnJHsnICsgc3BhY2UpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLmV4cHJlc3Npb25zW2ldLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzcGFjZSArICd9Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goJ2AnKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgTW9kdWxlU3BlY2lmaWVyOiBmdW5jdGlvbiAoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLkxpdGVyYWwoZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpO1xuICAgICAgICB9LFxuXG4gICAgICAgIEltcG9ydEV4cHJlc3Npb246IGZ1bmN0aW9uKGV4cHIsIHByZWNlZGVuY2UsIGZsYWcpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRoZXNpemUoW1xuICAgICAgICAgICAgICAgICdpbXBvcnQoJyxcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhwcmVzc2lvbihleHByLnNvdXJjZSwgUHJlY2VkZW5jZS5Bc3NpZ25tZW50LCBFX1RUVCksXG4gICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICBdLCBQcmVjZWRlbmNlLkNhbGwsIHByZWNlZGVuY2UpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG1lcmdlKENvZGVHZW5lcmF0b3IucHJvdG90eXBlLCBDb2RlR2VuZXJhdG9yLkV4cHJlc3Npb24pO1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVFeHByZXNzaW9uID0gZnVuY3Rpb24gKGV4cHIsIHByZWNlZGVuY2UsIGZsYWdzKSB7XG4gICAgICAgIHZhciByZXN1bHQsIHR5cGU7XG5cbiAgICAgICAgdHlwZSA9IGV4cHIudHlwZSB8fCBTeW50YXguUHJvcGVydHk7XG5cbiAgICAgICAgaWYgKGV4dHJhLnZlcmJhdGltICYmIGV4cHIuaGFzT3duUHJvcGVydHkoZXh0cmEudmVyYmF0aW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVWZXJiYXRpbShleHByLCBwcmVjZWRlbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCA9IHRoaXNbdHlwZV0oZXhwciwgcHJlY2VkZW5jZSwgZmxhZ3MpO1xuXG5cbiAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGFkZENvbW1lbnRzKGV4cHIsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0LCBleHByKTtcbiAgICB9O1xuXG4gICAgQ29kZUdlbmVyYXRvci5wcm90b3R5cGUuZ2VuZXJhdGVTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoc3RtdCwgZmxhZ3MpIHtcbiAgICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICAgIGZyYWdtZW50O1xuXG4gICAgICAgIHJlc3VsdCA9IHRoaXNbc3RtdC50eXBlXShzdG10LCBmbGFncyk7XG5cbiAgICAgICAgLy8gQXR0YWNoIGNvbW1lbnRzXG5cbiAgICAgICAgaWYgKGV4dHJhLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGFkZENvbW1lbnRzKHN0bXQsIHJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICBmcmFnbWVudCA9IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS50b1N0cmluZygpO1xuICAgICAgICBpZiAoc3RtdC50eXBlID09PSBTeW50YXguUHJvZ3JhbSAmJiAhc2FmZUNvbmNhdGVuYXRpb24gJiYgbmV3bGluZSA9PT0gJycgJiYgIGZyYWdtZW50LmNoYXJBdChmcmFnbWVudC5sZW5ndGggLSAxKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZU1hcCA/IHRvU291cmNlTm9kZVdoZW5OZWVkZWQocmVzdWx0KS5yZXBsYWNlUmlnaHQoL1xccyskLywgJycpIDogZnJhZ21lbnQucmVwbGFjZSgvXFxzKyQvLCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG9Tb3VyY2VOb2RlV2hlbk5lZWRlZChyZXN1bHQsIHN0bXQpO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZUludGVybmFsKG5vZGUpIHtcbiAgICAgICAgdmFyIGNvZGVnZW47XG5cbiAgICAgICAgY29kZWdlbiA9IG5ldyBDb2RlR2VuZXJhdG9yKCk7XG4gICAgICAgIGlmIChpc1N0YXRlbWVudChub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVnZW4uZ2VuZXJhdGVTdGF0ZW1lbnQobm9kZSwgU19URkZGKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0V4cHJlc3Npb24obm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2RlZ2VuLmdlbmVyYXRlRXhwcmVzc2lvbihub2RlLCBQcmVjZWRlbmNlLlNlcXVlbmNlLCBFX1RUVCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlOiAnICsgbm9kZS50eXBlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZShub2RlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCksIHJlc3VsdCwgcGFpcjtcblxuICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBPYnNvbGV0ZSBvcHRpb25zXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gICBgb3B0aW9ucy5pbmRlbnRgXG4gICAgICAgICAgICAvLyAgIGBvcHRpb25zLmJhc2VgXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiB0aGVtLCB3ZSBjYW4gdXNlIGBvcHRpb24uZm9ybWF0LmluZGVudGAuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuaW5kZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRPcHRpb25zLmZvcm1hdC5pbmRlbnQuc3R5bGUgPSBvcHRpb25zLmluZGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5iYXNlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRPcHRpb25zLmZvcm1hdC5pbmRlbnQuYmFzZSA9IG9wdGlvbnMuYmFzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnMgPSB1cGRhdGVEZWVwbHkoZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaW5kZW50ID0gb3B0aW9ucy5mb3JtYXQuaW5kZW50LnN0eWxlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmJhc2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgYmFzZSA9IG9wdGlvbnMuYmFzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYmFzZSA9IHN0cmluZ1JlcGVhdChpbmRlbnQsIG9wdGlvbnMuZm9ybWF0LmluZGVudC5iYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICAgICAgICAgIGluZGVudCA9IG9wdGlvbnMuZm9ybWF0LmluZGVudC5zdHlsZTtcbiAgICAgICAgICAgIGJhc2UgPSBzdHJpbmdSZXBlYXQoaW5kZW50LCBvcHRpb25zLmZvcm1hdC5pbmRlbnQuYmFzZSk7XG4gICAgICAgIH1cbiAgICAgICAganNvbiA9IG9wdGlvbnMuZm9ybWF0Lmpzb247XG4gICAgICAgIHJlbnVtYmVyID0gb3B0aW9ucy5mb3JtYXQucmVudW1iZXI7XG4gICAgICAgIGhleGFkZWNpbWFsID0ganNvbiA/IGZhbHNlIDogb3B0aW9ucy5mb3JtYXQuaGV4YWRlY2ltYWw7XG4gICAgICAgIHF1b3RlcyA9IGpzb24gPyAnZG91YmxlJyA6IG9wdGlvbnMuZm9ybWF0LnF1b3RlcztcbiAgICAgICAgZXNjYXBlbGVzcyA9IG9wdGlvbnMuZm9ybWF0LmVzY2FwZWxlc3M7XG4gICAgICAgIG5ld2xpbmUgPSBvcHRpb25zLmZvcm1hdC5uZXdsaW5lO1xuICAgICAgICBzcGFjZSA9IG9wdGlvbnMuZm9ybWF0LnNwYWNlO1xuICAgICAgICBpZiAob3B0aW9ucy5mb3JtYXQuY29tcGFjdCkge1xuICAgICAgICAgICAgbmV3bGluZSA9IHNwYWNlID0gaW5kZW50ID0gYmFzZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudGhlc2VzID0gb3B0aW9ucy5mb3JtYXQucGFyZW50aGVzZXM7XG4gICAgICAgIHNlbWljb2xvbnMgPSBvcHRpb25zLmZvcm1hdC5zZW1pY29sb25zO1xuICAgICAgICBzYWZlQ29uY2F0ZW5hdGlvbiA9IG9wdGlvbnMuZm9ybWF0LnNhZmVDb25jYXRlbmF0aW9uO1xuICAgICAgICBkaXJlY3RpdmUgPSBvcHRpb25zLmRpcmVjdGl2ZTtcbiAgICAgICAgcGFyc2UgPSBqc29uID8gbnVsbCA6IG9wdGlvbnMucGFyc2U7XG4gICAgICAgIHNvdXJjZU1hcCA9IG9wdGlvbnMuc291cmNlTWFwO1xuICAgICAgICBzb3VyY2VDb2RlID0gb3B0aW9ucy5zb3VyY2VDb2RlO1xuICAgICAgICBwcmVzZXJ2ZUJsYW5rTGluZXMgPSBvcHRpb25zLmZvcm1hdC5wcmVzZXJ2ZUJsYW5rTGluZXMgJiYgc291cmNlQ29kZSAhPT0gbnVsbDtcbiAgICAgICAgZXh0cmEgPSBvcHRpb25zO1xuXG4gICAgICAgIGlmIChzb3VyY2VNYXApIHtcbiAgICAgICAgICAgIGlmICghZXhwb3J0cy5icm93c2VyKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgYXNzdW1lIGVudmlyb25tZW50IGlzIG5vZGUuanNcbiAgICAgICAgICAgICAgICAvLyBBbmQgcHJldmVudCBmcm9tIGluY2x1ZGluZyBzb3VyY2UtbWFwIGJ5IGJyb3dzZXJpZnlcbiAgICAgICAgICAgICAgICBTb3VyY2VOb2RlID0gcmVxdWlyZSgnc291cmNlLW1hcCcpLlNvdXJjZU5vZGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIFNvdXJjZU5vZGUgPSBnbG9iYWwuc291cmNlTWFwLlNvdXJjZU5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSBnZW5lcmF0ZUludGVybmFsKG5vZGUpO1xuXG4gICAgICAgIGlmICghc291cmNlTWFwKSB7XG4gICAgICAgICAgICBwYWlyID0ge2NvZGU6IHJlc3VsdC50b1N0cmluZygpLCBtYXA6IG51bGx9O1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc291cmNlTWFwV2l0aENvZGUgPyBwYWlyIDogcGFpci5jb2RlO1xuICAgICAgICB9XG5cblxuICAgICAgICBwYWlyID0gcmVzdWx0LnRvU3RyaW5nV2l0aFNvdXJjZU1hcCh7XG4gICAgICAgICAgICBmaWxlOiBvcHRpb25zLmZpbGUsXG4gICAgICAgICAgICBzb3VyY2VSb290OiBvcHRpb25zLnNvdXJjZU1hcFJvb3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc291cmNlQ29udGVudCkge1xuICAgICAgICAgICAgcGFpci5tYXAuc2V0U291cmNlQ29udGVudChvcHRpb25zLnNvdXJjZU1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zb3VyY2VDb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnNvdXJjZU1hcFdpdGhDb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFpcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYWlyLm1hcC50b1N0cmluZygpO1xuICAgIH1cblxuICAgIEZPUk1BVF9NSU5JRlkgPSB7XG4gICAgICAgIGluZGVudDoge1xuICAgICAgICAgICAgc3R5bGU6ICcnLFxuICAgICAgICAgICAgYmFzZTogMFxuICAgICAgICB9LFxuICAgICAgICByZW51bWJlcjogdHJ1ZSxcbiAgICAgICAgaGV4YWRlY2ltYWw6IHRydWUsXG4gICAgICAgIHF1b3RlczogJ2F1dG8nLFxuICAgICAgICBlc2NhcGVsZXNzOiB0cnVlLFxuICAgICAgICBjb21wYWN0OiB0cnVlLFxuICAgICAgICBwYXJlbnRoZXNlczogZmFsc2UsXG4gICAgICAgIHNlbWljb2xvbnM6IGZhbHNlXG4gICAgfTtcblxuICAgIEZPUk1BVF9ERUZBVUxUUyA9IGdldERlZmF1bHRPcHRpb25zKCkuZm9ybWF0O1xuXG4gICAgZXhwb3J0cy52ZXJzaW9uID0gcmVxdWlyZSgnLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO1xuICAgIGV4cG9ydHMuZ2VuZXJhdGUgPSBnZW5lcmF0ZTtcbiAgICBleHBvcnRzLmF0dGFjaENvbW1lbnRzID0gZXN0cmF2ZXJzZS5hdHRhY2hDb21tZW50cztcbiAgICBleHBvcnRzLlByZWNlZGVuY2UgPSB1cGRhdGVEZWVwbHkoe30sIFByZWNlZGVuY2UpO1xuICAgIGV4cG9ydHMuYnJvd3NlciA9IGZhbHNlO1xuICAgIGV4cG9ydHMuRk9STUFUX01JTklGWSA9IEZPUk1BVF9NSU5JRlk7XG4gICAgZXhwb3J0cy5GT1JNQVRfREVGQVVMVFMgPSBGT1JNQVRfREVGQVVMVFM7XG59KCkpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZXNwcmltYVwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJlc3ByaW1hXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuXG5cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdC8qXG5cdCAgQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycywgaHR0cHM6Ly9qcy5mb3VuZGF0aW9uL1xuXG5cdCAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG5cdCAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cblx0ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcblx0ICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuXHQgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuXHQgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG5cdCAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cblx0ICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuXHQgIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcblx0ICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuXHQgIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcblx0ICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuXHQgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcblx0ICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcblx0ICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuXHQgIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuXHQgIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG5cdCovXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIGNvbW1lbnRfaGFuZGxlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblx0dmFyIGpzeF9wYXJzZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG5cdHZhciBwYXJzZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oOCk7XG5cdHZhciB0b2tlbml6ZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpO1xuXHRmdW5jdGlvbiBwYXJzZShjb2RlLCBvcHRpb25zLCBkZWxlZ2F0ZSkge1xuXHQgICAgdmFyIGNvbW1lbnRIYW5kbGVyID0gbnVsbDtcblx0ICAgIHZhciBwcm94eURlbGVnYXRlID0gZnVuY3Rpb24gKG5vZGUsIG1ldGFkYXRhKSB7XG5cdCAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG5cdCAgICAgICAgICAgIGRlbGVnYXRlKG5vZGUsIG1ldGFkYXRhKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGNvbW1lbnRIYW5kbGVyKSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnRIYW5kbGVyLnZpc2l0KG5vZGUsIG1ldGFkYXRhKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgdmFyIHBhcnNlckRlbGVnYXRlID0gKHR5cGVvZiBkZWxlZ2F0ZSA9PT0gJ2Z1bmN0aW9uJykgPyBwcm94eURlbGVnYXRlIDogbnVsbDtcblx0ICAgIHZhciBjb2xsZWN0Q29tbWVudCA9IGZhbHNlO1xuXHQgICAgaWYgKG9wdGlvbnMpIHtcblx0ICAgICAgICBjb2xsZWN0Q29tbWVudCA9ICh0eXBlb2Ygb3B0aW9ucy5jb21tZW50ID09PSAnYm9vbGVhbicgJiYgb3B0aW9ucy5jb21tZW50KTtcblx0ICAgICAgICB2YXIgYXR0YWNoQ29tbWVudCA9ICh0eXBlb2Ygb3B0aW9ucy5hdHRhY2hDb21tZW50ID09PSAnYm9vbGVhbicgJiYgb3B0aW9ucy5hdHRhY2hDb21tZW50KTtcblx0ICAgICAgICBpZiAoY29sbGVjdENvbW1lbnQgfHwgYXR0YWNoQ29tbWVudCkge1xuXHQgICAgICAgICAgICBjb21tZW50SGFuZGxlciA9IG5ldyBjb21tZW50X2hhbmRsZXJfMS5Db21tZW50SGFuZGxlcigpO1xuXHQgICAgICAgICAgICBjb21tZW50SGFuZGxlci5hdHRhY2ggPSBhdHRhY2hDb21tZW50O1xuXHQgICAgICAgICAgICBvcHRpb25zLmNvbW1lbnQgPSB0cnVlO1xuXHQgICAgICAgICAgICBwYXJzZXJEZWxlZ2F0ZSA9IHByb3h5RGVsZWdhdGU7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgdmFyIGlzTW9kdWxlID0gZmFsc2U7XG5cdCAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5zb3VyY2VUeXBlID09PSAnc3RyaW5nJykge1xuXHQgICAgICAgIGlzTW9kdWxlID0gKG9wdGlvbnMuc291cmNlVHlwZSA9PT0gJ21vZHVsZScpO1xuXHQgICAgfVxuXHQgICAgdmFyIHBhcnNlcjtcblx0ICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLmpzeCA9PT0gJ2Jvb2xlYW4nICYmIG9wdGlvbnMuanN4KSB7XG5cdCAgICAgICAgcGFyc2VyID0gbmV3IGpzeF9wYXJzZXJfMS5KU1hQYXJzZXIoY29kZSwgb3B0aW9ucywgcGFyc2VyRGVsZWdhdGUpO1xuXHQgICAgfVxuXHQgICAgZWxzZSB7XG5cdCAgICAgICAgcGFyc2VyID0gbmV3IHBhcnNlcl8xLlBhcnNlcihjb2RlLCBvcHRpb25zLCBwYXJzZXJEZWxlZ2F0ZSk7XG5cdCAgICB9XG5cdCAgICB2YXIgcHJvZ3JhbSA9IGlzTW9kdWxlID8gcGFyc2VyLnBhcnNlTW9kdWxlKCkgOiBwYXJzZXIucGFyc2VTY3JpcHQoKTtcblx0ICAgIHZhciBhc3QgPSBwcm9ncmFtO1xuXHQgICAgaWYgKGNvbGxlY3RDb21tZW50ICYmIGNvbW1lbnRIYW5kbGVyKSB7XG5cdCAgICAgICAgYXN0LmNvbW1lbnRzID0gY29tbWVudEhhbmRsZXIuY29tbWVudHM7XG5cdCAgICB9XG5cdCAgICBpZiAocGFyc2VyLmNvbmZpZy50b2tlbnMpIHtcblx0ICAgICAgICBhc3QudG9rZW5zID0gcGFyc2VyLnRva2Vucztcblx0ICAgIH1cblx0ICAgIGlmIChwYXJzZXIuY29uZmlnLnRvbGVyYW50KSB7XG5cdCAgICAgICAgYXN0LmVycm9ycyA9IHBhcnNlci5lcnJvckhhbmRsZXIuZXJyb3JzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIGFzdDtcblx0fVxuXHRleHBvcnRzLnBhcnNlID0gcGFyc2U7XG5cdGZ1bmN0aW9uIHBhcnNlTW9kdWxlKGNvZGUsIG9wdGlvbnMsIGRlbGVnYXRlKSB7XG5cdCAgICB2YXIgcGFyc2luZ09wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHQgICAgcGFyc2luZ09wdGlvbnMuc291cmNlVHlwZSA9ICdtb2R1bGUnO1xuXHQgICAgcmV0dXJuIHBhcnNlKGNvZGUsIHBhcnNpbmdPcHRpb25zLCBkZWxlZ2F0ZSk7XG5cdH1cblx0ZXhwb3J0cy5wYXJzZU1vZHVsZSA9IHBhcnNlTW9kdWxlO1xuXHRmdW5jdGlvbiBwYXJzZVNjcmlwdChjb2RlLCBvcHRpb25zLCBkZWxlZ2F0ZSkge1xuXHQgICAgdmFyIHBhcnNpbmdPcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0ICAgIHBhcnNpbmdPcHRpb25zLnNvdXJjZVR5cGUgPSAnc2NyaXB0Jztcblx0ICAgIHJldHVybiBwYXJzZShjb2RlLCBwYXJzaW5nT3B0aW9ucywgZGVsZWdhdGUpO1xuXHR9XG5cdGV4cG9ydHMucGFyc2VTY3JpcHQgPSBwYXJzZVNjcmlwdDtcblx0ZnVuY3Rpb24gdG9rZW5pemUoY29kZSwgb3B0aW9ucywgZGVsZWdhdGUpIHtcblx0ICAgIHZhciB0b2tlbml6ZXIgPSBuZXcgdG9rZW5pemVyXzEuVG9rZW5pemVyKGNvZGUsIG9wdGlvbnMpO1xuXHQgICAgdmFyIHRva2Vucztcblx0ICAgIHRva2VucyA9IFtdO1xuXHQgICAgdHJ5IHtcblx0ICAgICAgICB3aGlsZSAodHJ1ZSkge1xuXHQgICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGlmICghdG9rZW4pIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICAgICAgdG9rZW4gPSBkZWxlZ2F0ZSh0b2tlbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIGNhdGNoIChlKSB7XG5cdCAgICAgICAgdG9rZW5pemVyLmVycm9ySGFuZGxlci50b2xlcmF0ZShlKTtcblx0ICAgIH1cblx0ICAgIGlmICh0b2tlbml6ZXIuZXJyb3JIYW5kbGVyLnRvbGVyYW50KSB7XG5cdCAgICAgICAgdG9rZW5zLmVycm9ycyA9IHRva2VuaXplci5lcnJvcnMoKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0b2tlbnM7XG5cdH1cblx0ZXhwb3J0cy50b2tlbml6ZSA9IHRva2VuaXplO1xuXHR2YXIgc3ludGF4XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXHRleHBvcnRzLlN5bnRheCA9IHN5bnRheF8xLlN5bnRheDtcblx0Ly8gU3luYyB3aXRoICouanNvbiBtYW5pZmVzdHMuXG5cdGV4cG9ydHMudmVyc2lvbiA9ICc0LjAuMSc7XG5cblxuLyoqKi8gfSxcbi8qIDEgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdHZhciBzeW50YXhfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdHZhciBDb21tZW50SGFuZGxlciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDb21tZW50SGFuZGxlcigpIHtcblx0ICAgICAgICB0aGlzLmF0dGFjaCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuY29tbWVudHMgPSBbXTtcblx0ICAgICAgICB0aGlzLnN0YWNrID0gW107XG5cdCAgICAgICAgdGhpcy5sZWFkaW5nID0gW107XG5cdCAgICAgICAgdGhpcy50cmFpbGluZyA9IFtdO1xuXHQgICAgfVxuXHQgICAgQ29tbWVudEhhbmRsZXIucHJvdG90eXBlLmluc2VydElubmVyQ29tbWVudHMgPSBmdW5jdGlvbiAobm9kZSwgbWV0YWRhdGEpIHtcblx0ICAgICAgICAvLyAgaW5ubmVyQ29tbWVudHMgZm9yIHByb3BlcnRpZXMgZW1wdHkgYmxvY2tcblx0ICAgICAgICAvLyAgYGZ1bmN0aW9uIGEoKSB7LyoqIGNvbW1lbnRzICoqXFwvfWBcblx0ICAgICAgICBpZiAobm9kZS50eXBlID09PSBzeW50YXhfMS5TeW50YXguQmxvY2tTdGF0ZW1lbnQgJiYgbm9kZS5ib2R5Lmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgICAgICB2YXIgaW5uZXJDb21tZW50cyA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5sZWFkaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLmxlYWRpbmdbaV07XG5cdCAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEuZW5kLm9mZnNldCA+PSBlbnRyeS5zdGFydCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlubmVyQ29tbWVudHMudW5zaGlmdChlbnRyeS5jb21tZW50KTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmxlYWRpbmcuc3BsaWNlKGksIDEpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhaWxpbmcuc3BsaWNlKGksIDEpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChpbm5lckNvbW1lbnRzLmxlbmd0aCkge1xuXHQgICAgICAgICAgICAgICAgbm9kZS5pbm5lckNvbW1lbnRzID0gaW5uZXJDb21tZW50cztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBDb21tZW50SGFuZGxlci5wcm90b3R5cGUuZmluZFRyYWlsaW5nQ29tbWVudHMgPSBmdW5jdGlvbiAobWV0YWRhdGEpIHtcblx0ICAgICAgICB2YXIgdHJhaWxpbmdDb21tZW50cyA9IFtdO1xuXHQgICAgICAgIGlmICh0aGlzLnRyYWlsaW5nLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJhaWxpbmcubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBlbnRyeV8xID0gdGhpcy50cmFpbGluZ1tpXTtcblx0ICAgICAgICAgICAgICAgIGlmIChlbnRyeV8xLnN0YXJ0ID49IG1ldGFkYXRhLmVuZC5vZmZzZXQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ0NvbW1lbnRzLnVuc2hpZnQoZW50cnlfMS5jb21tZW50KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLnRyYWlsaW5nLmxlbmd0aCA9IDA7XG5cdCAgICAgICAgICAgIHJldHVybiB0cmFpbGluZ0NvbW1lbnRzO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gMV07XG5cdCAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5Lm5vZGUudHJhaWxpbmdDb21tZW50cykge1xuXHQgICAgICAgICAgICB2YXIgZmlyc3RDb21tZW50ID0gZW50cnkubm9kZS50cmFpbGluZ0NvbW1lbnRzWzBdO1xuXHQgICAgICAgICAgICBpZiAoZmlyc3RDb21tZW50ICYmIGZpcnN0Q29tbWVudC5yYW5nZVswXSA+PSBtZXRhZGF0YS5lbmQub2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICB0cmFpbGluZ0NvbW1lbnRzID0gZW50cnkubm9kZS50cmFpbGluZ0NvbW1lbnRzO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIGVudHJ5Lm5vZGUudHJhaWxpbmdDb21tZW50cztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdHJhaWxpbmdDb21tZW50cztcblx0ICAgIH07XG5cdCAgICBDb21tZW50SGFuZGxlci5wcm90b3R5cGUuZmluZExlYWRpbmdDb21tZW50cyA9IGZ1bmN0aW9uIChtZXRhZGF0YSkge1xuXHQgICAgICAgIHZhciBsZWFkaW5nQ29tbWVudHMgPSBbXTtcblx0ICAgICAgICB2YXIgdGFyZ2V0O1xuXHQgICAgICAgIHdoaWxlICh0aGlzLnN0YWNrLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdO1xuXHQgICAgICAgICAgICBpZiAoZW50cnkgJiYgZW50cnkuc3RhcnQgPj0gbWV0YWRhdGEuc3RhcnQub2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICB0YXJnZXQgPSBlbnRyeS5ub2RlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0YXJnZXQpIHtcblx0ICAgICAgICAgICAgdmFyIGNvdW50ID0gdGFyZ2V0LmxlYWRpbmdDb21tZW50cyA/IHRhcmdldC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoIDogMDtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IGNvdW50IC0gMTsgaSA+PSAwOyAtLWkpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0gdGFyZ2V0LmxlYWRpbmdDb21tZW50c1tpXTtcblx0ICAgICAgICAgICAgICAgIGlmIChjb21tZW50LnJhbmdlWzFdIDw9IG1ldGFkYXRhLnN0YXJ0Lm9mZnNldCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGxlYWRpbmdDb21tZW50cy51bnNoaWZ0KGNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRhcmdldC5sZWFkaW5nQ29tbWVudHMuc3BsaWNlKGksIDEpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICh0YXJnZXQubGVhZGluZ0NvbW1lbnRzICYmIHRhcmdldC5sZWFkaW5nQ29tbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICBkZWxldGUgdGFyZ2V0LmxlYWRpbmdDb21tZW50cztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gbGVhZGluZ0NvbW1lbnRzO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5sZWFkaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG5cdCAgICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMubGVhZGluZ1tpXTtcblx0ICAgICAgICAgICAgaWYgKGVudHJ5LnN0YXJ0IDw9IG1ldGFkYXRhLnN0YXJ0Lm9mZnNldCkge1xuXHQgICAgICAgICAgICAgICAgbGVhZGluZ0NvbW1lbnRzLnVuc2hpZnQoZW50cnkuY29tbWVudCk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmxlYWRpbmcuc3BsaWNlKGksIDEpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBsZWFkaW5nQ29tbWVudHM7XG5cdCAgICB9O1xuXHQgICAgQ29tbWVudEhhbmRsZXIucHJvdG90eXBlLnZpc2l0Tm9kZSA9IGZ1bmN0aW9uIChub2RlLCBtZXRhZGF0YSkge1xuXHQgICAgICAgIGlmIChub2RlLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5Qcm9ncmFtICYmIG5vZGUuYm9keS5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5pbnNlcnRJbm5lckNvbW1lbnRzKG5vZGUsIG1ldGFkYXRhKTtcblx0ICAgICAgICB2YXIgdHJhaWxpbmdDb21tZW50cyA9IHRoaXMuZmluZFRyYWlsaW5nQ29tbWVudHMobWV0YWRhdGEpO1xuXHQgICAgICAgIHZhciBsZWFkaW5nQ29tbWVudHMgPSB0aGlzLmZpbmRMZWFkaW5nQ29tbWVudHMobWV0YWRhdGEpO1xuXHQgICAgICAgIGlmIChsZWFkaW5nQ29tbWVudHMubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICBub2RlLmxlYWRpbmdDb21tZW50cyA9IGxlYWRpbmdDb21tZW50cztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRyYWlsaW5nQ29tbWVudHMubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICBub2RlLnRyYWlsaW5nQ29tbWVudHMgPSB0cmFpbGluZ0NvbW1lbnRzO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnN0YWNrLnB1c2goe1xuXHQgICAgICAgICAgICBub2RlOiBub2RlLFxuXHQgICAgICAgICAgICBzdGFydDogbWV0YWRhdGEuc3RhcnQub2Zmc2V0XG5cdCAgICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgQ29tbWVudEhhbmRsZXIucHJvdG90eXBlLnZpc2l0Q29tbWVudCA9IGZ1bmN0aW9uIChub2RlLCBtZXRhZGF0YSkge1xuXHQgICAgICAgIHZhciB0eXBlID0gKG5vZGUudHlwZVswXSA9PT0gJ0wnKSA/ICdMaW5lJyA6ICdCbG9jayc7XG5cdCAgICAgICAgdmFyIGNvbW1lbnQgPSB7XG5cdCAgICAgICAgICAgIHR5cGU6IHR5cGUsXG5cdCAgICAgICAgICAgIHZhbHVlOiBub2RlLnZhbHVlXG5cdCAgICAgICAgfTtcblx0ICAgICAgICBpZiAobm9kZS5yYW5nZSkge1xuXHQgICAgICAgICAgICBjb21tZW50LnJhbmdlID0gbm9kZS5yYW5nZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKG5vZGUubG9jKSB7XG5cdCAgICAgICAgICAgIGNvbW1lbnQubG9jID0gbm9kZS5sb2M7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY29tbWVudHMucHVzaChjb21tZW50KTtcblx0ICAgICAgICBpZiAodGhpcy5hdHRhY2gpIHtcblx0ICAgICAgICAgICAgdmFyIGVudHJ5ID0ge1xuXHQgICAgICAgICAgICAgICAgY29tbWVudDoge1xuXHQgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG5cdCAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5vZGUudmFsdWUsXG5cdCAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IFttZXRhZGF0YS5zdGFydC5vZmZzZXQsIG1ldGFkYXRhLmVuZC5vZmZzZXRdXG5cdCAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IG1ldGFkYXRhLnN0YXJ0Lm9mZnNldFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBpZiAobm9kZS5sb2MpIHtcblx0ICAgICAgICAgICAgICAgIGVudHJ5LmNvbW1lbnQubG9jID0gbm9kZS5sb2M7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgbm9kZS50eXBlID0gdHlwZTtcblx0ICAgICAgICAgICAgdGhpcy5sZWFkaW5nLnB1c2goZW50cnkpO1xuXHQgICAgICAgICAgICB0aGlzLnRyYWlsaW5nLnB1c2goZW50cnkpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBDb21tZW50SGFuZGxlci5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbiAobm9kZSwgbWV0YWRhdGEpIHtcblx0ICAgICAgICBpZiAobm9kZS50eXBlID09PSAnTGluZUNvbW1lbnQnKSB7XG5cdCAgICAgICAgICAgIHRoaXMudmlzaXRDb21tZW50KG5vZGUsIG1ldGFkYXRhKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAobm9kZS50eXBlID09PSAnQmxvY2tDb21tZW50Jykge1xuXHQgICAgICAgICAgICB0aGlzLnZpc2l0Q29tbWVudChub2RlLCBtZXRhZGF0YSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMuYXR0YWNoKSB7XG5cdCAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUsIG1ldGFkYXRhKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIENvbW1lbnRIYW5kbGVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLkNvbW1lbnRIYW5kbGVyID0gQ29tbWVudEhhbmRsZXI7XG5cblxuLyoqKi8gfSxcbi8qIDIgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdGV4cG9ydHMuU3ludGF4ID0ge1xuXHQgICAgQXNzaWdubWVudEV4cHJlc3Npb246ICdBc3NpZ25tZW50RXhwcmVzc2lvbicsXG5cdCAgICBBc3NpZ25tZW50UGF0dGVybjogJ0Fzc2lnbm1lbnRQYXR0ZXJuJyxcblx0ICAgIEFycmF5RXhwcmVzc2lvbjogJ0FycmF5RXhwcmVzc2lvbicsXG5cdCAgICBBcnJheVBhdHRlcm46ICdBcnJheVBhdHRlcm4nLFxuXHQgICAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246ICdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbicsXG5cdCAgICBBd2FpdEV4cHJlc3Npb246ICdBd2FpdEV4cHJlc3Npb24nLFxuXHQgICAgQmxvY2tTdGF0ZW1lbnQ6ICdCbG9ja1N0YXRlbWVudCcsXG5cdCAgICBCaW5hcnlFeHByZXNzaW9uOiAnQmluYXJ5RXhwcmVzc2lvbicsXG5cdCAgICBCcmVha1N0YXRlbWVudDogJ0JyZWFrU3RhdGVtZW50Jyxcblx0ICAgIENhbGxFeHByZXNzaW9uOiAnQ2FsbEV4cHJlc3Npb24nLFxuXHQgICAgQ2F0Y2hDbGF1c2U6ICdDYXRjaENsYXVzZScsXG5cdCAgICBDbGFzc0JvZHk6ICdDbGFzc0JvZHknLFxuXHQgICAgQ2xhc3NEZWNsYXJhdGlvbjogJ0NsYXNzRGVjbGFyYXRpb24nLFxuXHQgICAgQ2xhc3NFeHByZXNzaW9uOiAnQ2xhc3NFeHByZXNzaW9uJyxcblx0ICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbjogJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbicsXG5cdCAgICBDb250aW51ZVN0YXRlbWVudDogJ0NvbnRpbnVlU3RhdGVtZW50Jyxcblx0ICAgIERvV2hpbGVTdGF0ZW1lbnQ6ICdEb1doaWxlU3RhdGVtZW50Jyxcblx0ICAgIERlYnVnZ2VyU3RhdGVtZW50OiAnRGVidWdnZXJTdGF0ZW1lbnQnLFxuXHQgICAgRW1wdHlTdGF0ZW1lbnQ6ICdFbXB0eVN0YXRlbWVudCcsXG5cdCAgICBFeHBvcnRBbGxEZWNsYXJhdGlvbjogJ0V4cG9ydEFsbERlY2xhcmF0aW9uJyxcblx0ICAgIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjogJ0V4cG9ydERlZmF1bHREZWNsYXJhdGlvbicsXG5cdCAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uOiAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbicsXG5cdCAgICBFeHBvcnRTcGVjaWZpZXI6ICdFeHBvcnRTcGVjaWZpZXInLFxuXHQgICAgRXhwcmVzc2lvblN0YXRlbWVudDogJ0V4cHJlc3Npb25TdGF0ZW1lbnQnLFxuXHQgICAgRm9yU3RhdGVtZW50OiAnRm9yU3RhdGVtZW50Jyxcblx0ICAgIEZvck9mU3RhdGVtZW50OiAnRm9yT2ZTdGF0ZW1lbnQnLFxuXHQgICAgRm9ySW5TdGF0ZW1lbnQ6ICdGb3JJblN0YXRlbWVudCcsXG5cdCAgICBGdW5jdGlvbkRlY2xhcmF0aW9uOiAnRnVuY3Rpb25EZWNsYXJhdGlvbicsXG5cdCAgICBGdW5jdGlvbkV4cHJlc3Npb246ICdGdW5jdGlvbkV4cHJlc3Npb24nLFxuXHQgICAgSWRlbnRpZmllcjogJ0lkZW50aWZpZXInLFxuXHQgICAgSWZTdGF0ZW1lbnQ6ICdJZlN0YXRlbWVudCcsXG5cdCAgICBJbXBvcnREZWNsYXJhdGlvbjogJ0ltcG9ydERlY2xhcmF0aW9uJyxcblx0ICAgIEltcG9ydERlZmF1bHRTcGVjaWZpZXI6ICdJbXBvcnREZWZhdWx0U3BlY2lmaWVyJyxcblx0ICAgIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogJ0ltcG9ydE5hbWVzcGFjZVNwZWNpZmllcicsXG5cdCAgICBJbXBvcnRTcGVjaWZpZXI6ICdJbXBvcnRTcGVjaWZpZXInLFxuXHQgICAgTGl0ZXJhbDogJ0xpdGVyYWwnLFxuXHQgICAgTGFiZWxlZFN0YXRlbWVudDogJ0xhYmVsZWRTdGF0ZW1lbnQnLFxuXHQgICAgTG9naWNhbEV4cHJlc3Npb246ICdMb2dpY2FsRXhwcmVzc2lvbicsXG5cdCAgICBNZW1iZXJFeHByZXNzaW9uOiAnTWVtYmVyRXhwcmVzc2lvbicsXG5cdCAgICBNZXRhUHJvcGVydHk6ICdNZXRhUHJvcGVydHknLFxuXHQgICAgTWV0aG9kRGVmaW5pdGlvbjogJ01ldGhvZERlZmluaXRpb24nLFxuXHQgICAgTmV3RXhwcmVzc2lvbjogJ05ld0V4cHJlc3Npb24nLFxuXHQgICAgT2JqZWN0RXhwcmVzc2lvbjogJ09iamVjdEV4cHJlc3Npb24nLFxuXHQgICAgT2JqZWN0UGF0dGVybjogJ09iamVjdFBhdHRlcm4nLFxuXHQgICAgUHJvZ3JhbTogJ1Byb2dyYW0nLFxuXHQgICAgUHJvcGVydHk6ICdQcm9wZXJ0eScsXG5cdCAgICBSZXN0RWxlbWVudDogJ1Jlc3RFbGVtZW50Jyxcblx0ICAgIFJldHVyblN0YXRlbWVudDogJ1JldHVyblN0YXRlbWVudCcsXG5cdCAgICBTZXF1ZW5jZUV4cHJlc3Npb246ICdTZXF1ZW5jZUV4cHJlc3Npb24nLFxuXHQgICAgU3ByZWFkRWxlbWVudDogJ1NwcmVhZEVsZW1lbnQnLFxuXHQgICAgU3VwZXI6ICdTdXBlcicsXG5cdCAgICBTd2l0Y2hDYXNlOiAnU3dpdGNoQ2FzZScsXG5cdCAgICBTd2l0Y2hTdGF0ZW1lbnQ6ICdTd2l0Y2hTdGF0ZW1lbnQnLFxuXHQgICAgVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uOiAnVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uJyxcblx0ICAgIFRlbXBsYXRlRWxlbWVudDogJ1RlbXBsYXRlRWxlbWVudCcsXG5cdCAgICBUZW1wbGF0ZUxpdGVyYWw6ICdUZW1wbGF0ZUxpdGVyYWwnLFxuXHQgICAgVGhpc0V4cHJlc3Npb246ICdUaGlzRXhwcmVzc2lvbicsXG5cdCAgICBUaHJvd1N0YXRlbWVudDogJ1Rocm93U3RhdGVtZW50Jyxcblx0ICAgIFRyeVN0YXRlbWVudDogJ1RyeVN0YXRlbWVudCcsXG5cdCAgICBVbmFyeUV4cHJlc3Npb246ICdVbmFyeUV4cHJlc3Npb24nLFxuXHQgICAgVXBkYXRlRXhwcmVzc2lvbjogJ1VwZGF0ZUV4cHJlc3Npb24nLFxuXHQgICAgVmFyaWFibGVEZWNsYXJhdGlvbjogJ1ZhcmlhYmxlRGVjbGFyYXRpb24nLFxuXHQgICAgVmFyaWFibGVEZWNsYXJhdG9yOiAnVmFyaWFibGVEZWNsYXJhdG9yJyxcblx0ICAgIFdoaWxlU3RhdGVtZW50OiAnV2hpbGVTdGF0ZW1lbnQnLFxuXHQgICAgV2l0aFN0YXRlbWVudDogJ1dpdGhTdGF0ZW1lbnQnLFxuXHQgICAgWWllbGRFeHByZXNzaW9uOiAnWWllbGRFeHByZXNzaW9uJ1xuXHR9O1xuXG5cbi8qKiovIH0sXG4vKiAzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdHZhciBfX2V4dGVuZHMgPSAodGhpcyAmJiB0aGlzLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcblx0ICAgIHZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG5cdCAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuXHQgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xuXHQgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG5cdCAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcblx0ICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cblx0ICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG5cdCAgICB9O1xuXHR9KSgpO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdHZhciBjaGFyYWN0ZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cdHZhciBKU1hOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0dmFyIGpzeF9zeW50YXhfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cdHZhciBOb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcblx0dmFyIHBhcnNlcl8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblx0dmFyIHRva2VuXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblx0dmFyIHhodG1sX2VudGl0aWVzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcblx0dG9rZW5fMS5Ub2tlbk5hbWVbMTAwIC8qIElkZW50aWZpZXIgKi9dID0gJ0pTWElkZW50aWZpZXInO1xuXHR0b2tlbl8xLlRva2VuTmFtZVsxMDEgLyogVGV4dCAqL10gPSAnSlNYVGV4dCc7XG5cdC8vIEZ1bGx5IHF1YWxpZmllZCBlbGVtZW50IG5hbWUsIGUuZy4gPHN2ZzpwYXRoPiByZXR1cm5zIFwic3ZnOnBhdGhcIlxuXHRmdW5jdGlvbiBnZXRRdWFsaWZpZWRFbGVtZW50TmFtZShlbGVtZW50TmFtZSkge1xuXHQgICAgdmFyIHF1YWxpZmllZE5hbWU7XG5cdCAgICBzd2l0Y2ggKGVsZW1lbnROYW1lLnR5cGUpIHtcblx0ICAgICAgICBjYXNlIGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYSWRlbnRpZmllcjpcblx0ICAgICAgICAgICAgdmFyIGlkID0gZWxlbWVudE5hbWU7XG5cdCAgICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSBpZC5uYW1lO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICBjYXNlIGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYTmFtZXNwYWNlZE5hbWU6XG5cdCAgICAgICAgICAgIHZhciBucyA9IGVsZW1lbnROYW1lO1xuXHQgICAgICAgICAgICBxdWFsaWZpZWROYW1lID0gZ2V0UXVhbGlmaWVkRWxlbWVudE5hbWUobnMubmFtZXNwYWNlKSArICc6JyArXG5cdCAgICAgICAgICAgICAgICBnZXRRdWFsaWZpZWRFbGVtZW50TmFtZShucy5uYW1lKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgY2FzZSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWE1lbWJlckV4cHJlc3Npb246XG5cdCAgICAgICAgICAgIHZhciBleHByID0gZWxlbWVudE5hbWU7XG5cdCAgICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSBnZXRRdWFsaWZpZWRFbGVtZW50TmFtZShleHByLm9iamVjdCkgKyAnLicgK1xuXHQgICAgICAgICAgICAgICAgZ2V0UXVhbGlmaWVkRWxlbWVudE5hbWUoZXhwci5wcm9wZXJ0eSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdCAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcXVhbGlmaWVkTmFtZTtcblx0fVxuXHR2YXIgSlNYUGFyc2VyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcblx0ICAgIF9fZXh0ZW5kcyhKU1hQYXJzZXIsIF9zdXBlcik7XG5cdCAgICBmdW5jdGlvbiBKU1hQYXJzZXIoY29kZSwgb3B0aW9ucywgZGVsZWdhdGUpIHtcblx0ICAgICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgY29kZSwgb3B0aW9ucywgZGVsZWdhdGUpIHx8IHRoaXM7XG5cdCAgICB9XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlUHJpbWFyeUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2goJzwnKSA/IHRoaXMucGFyc2VKU1hSb290KCkgOiBfc3VwZXIucHJvdG90eXBlLnBhcnNlUHJpbWFyeUV4cHJlc3Npb24uY2FsbCh0aGlzKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnN0YXJ0SlNYID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIC8vIFVud2luZCB0aGUgc2Nhbm5lciBiZWZvcmUgdGhlIGxvb2thaGVhZCB0b2tlbi5cblx0ICAgICAgICB0aGlzLnNjYW5uZXIuaW5kZXggPSB0aGlzLnN0YXJ0TWFya2VyLmluZGV4O1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyID0gdGhpcy5zdGFydE1hcmtlci5saW5lO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5saW5lU3RhcnQgPSB0aGlzLnN0YXJ0TWFya2VyLmluZGV4IC0gdGhpcy5zdGFydE1hcmtlci5jb2x1bW47XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5maW5pc2hKU1ggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy8gUHJpbWUgdGhlIG5leHQgbG9va2FoZWFkLlxuXHQgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5yZWVudGVySlNYID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuc3RhcnRKU1goKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgnfScpO1xuXHQgICAgICAgIC8vIFBvcCB0aGUgY2xvc2luZyAnfScgYWRkZWQgZnJvbSB0aGUgbG9va2FoZWFkLlxuXHQgICAgICAgIGlmICh0aGlzLmNvbmZpZy50b2tlbnMpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2tlbnMucG9wKCk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUuY3JlYXRlSlNYTm9kZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmNvbGxlY3RDb21tZW50cygpO1xuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIGluZGV4OiB0aGlzLnNjYW5uZXIuaW5kZXgsXG5cdCAgICAgICAgICAgIGxpbmU6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBjb2x1bW46IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnRcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUuY3JlYXRlSlNYQ2hpbGROb2RlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIGluZGV4OiB0aGlzLnNjYW5uZXIuaW5kZXgsXG5cdCAgICAgICAgICAgIGxpbmU6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBjb2x1bW46IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnRcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUuc2NhblhIVE1MRW50aXR5ID0gZnVuY3Rpb24gKHF1b3RlKSB7XG5cdCAgICAgICAgdmFyIHJlc3VsdCA9ICcmJztcblx0ICAgICAgICB2YXIgdmFsaWQgPSB0cnVlO1xuXHQgICAgICAgIHZhciB0ZXJtaW5hdGVkID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIG51bWVyaWMgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgaGV4ID0gZmFsc2U7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKCkgJiYgdmFsaWQgJiYgIXRlcm1pbmF0ZWQpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zY2FubmVyLnNvdXJjZVt0aGlzLnNjYW5uZXIuaW5kZXhdO1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09IHF1b3RlKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0ZXJtaW5hdGVkID0gKGNoID09PSAnOycpO1xuXHQgICAgICAgICAgICByZXN1bHQgKz0gY2g7XG5cdCAgICAgICAgICAgICsrdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICBpZiAoIXRlcm1pbmF0ZWQpIHtcblx0ICAgICAgICAgICAgICAgIHN3aXRjaCAocmVzdWx0Lmxlbmd0aCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiAnJiMxMjM7J1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljID0gKGNoID09PSAnIycpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1lcmljKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuICcmI3g0MTsnXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXggPSAoY2ggPT09ICd4Jyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IGhleCB8fCBjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQoY2guY2hhckNvZGVBdCgwKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljID0gbnVtZXJpYyAmJiAhaGV4O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdmFsaWQgJiYgIShudW1lcmljICYmICFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQoY2guY2hhckNvZGVBdCgwKSkpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHZhbGlkICYmICEoaGV4ICYmICFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNIZXhEaWdpdChjaC5jaGFyQ29kZUF0KDApKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh2YWxpZCAmJiB0ZXJtaW5hdGVkICYmIHJlc3VsdC5sZW5ndGggPiAyKSB7XG5cdCAgICAgICAgICAgIC8vIGUuZy4gJyYjeDQxOycgYmVjb21lcyBqdXN0ICcjeDQxJ1xuXHQgICAgICAgICAgICB2YXIgc3RyID0gcmVzdWx0LnN1YnN0cigxLCByZXN1bHQubGVuZ3RoIC0gMik7XG5cdCAgICAgICAgICAgIGlmIChudW1lcmljICYmIHN0ci5sZW5ndGggPiAxKSB7XG5cdCAgICAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDEwKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoaGV4ICYmIHN0ci5sZW5ndGggPiAyKSB7XG5cdCAgICAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KCcwJyArIHN0ci5zdWJzdHIoMSksIDE2KSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoIW51bWVyaWMgJiYgIWhleCAmJiB4aHRtbF9lbnRpdGllc18xLlhIVE1MRW50aXRpZXNbc3RyXSkge1xuXHQgICAgICAgICAgICAgICAgcmVzdWx0ID0geGh0bWxfZW50aXRpZXNfMS5YSFRNTEVudGl0aWVzW3N0cl07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlc3VsdDtcblx0ICAgIH07XG5cdCAgICAvLyBTY2FuIHRoZSBuZXh0IEpTWCB0b2tlbi4gVGhpcyByZXBsYWNlcyBTY2FubmVyI2xleCB3aGVuIGluIEpTWCBtb2RlLlxuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5sZXhKU1ggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNwID0gdGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuc2Nhbm5lci5pbmRleCk7XG5cdCAgICAgICAgLy8gPCA+IC8gOiA9IHsgfVxuXHQgICAgICAgIGlmIChjcCA9PT0gNjAgfHwgY3AgPT09IDYyIHx8IGNwID09PSA0NyB8fCBjcCA9PT0gNTggfHwgY3AgPT09IDYxIHx8IGNwID09PSAxMjMgfHwgY3AgPT09IDEyNSkge1xuXHQgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleCsrXTtcblx0ICAgICAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgICAgIHR5cGU6IDcgLyogUHVuY3R1YXRvciAqLyxcblx0ICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcblx0ICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLnNjYW5uZXIubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuc2Nhbm5lci5pbmRleCAtIDEsXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuc2Nhbm5lci5pbmRleFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBcIiAnXG5cdCAgICAgICAgaWYgKGNwID09PSAzNCB8fCBjcCA9PT0gMzkpIHtcblx0ICAgICAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICB2YXIgcXVvdGUgPSB0aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleCsrXTtcblx0ICAgICAgICAgICAgdmFyIHN0ciA9ICcnO1xuXHQgICAgICAgICAgICB3aGlsZSAoIXRoaXMuc2Nhbm5lci5lb2YoKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zY2FubmVyLnNvdXJjZVt0aGlzLnNjYW5uZXIuaW5kZXgrK107XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09IHF1b3RlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gJyYnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RyICs9IHRoaXMuc2NhblhIVE1MRW50aXR5KHF1b3RlKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0ciArPSBjaDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogOCAvKiBTdHJpbmdMaXRlcmFsICovLFxuXHQgICAgICAgICAgICAgICAgdmFsdWU6IHN0cixcblx0ICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLnNjYW5uZXIubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnNjYW5uZXIuaW5kZXhcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gLi4uIG9yIC5cblx0ICAgICAgICBpZiAoY3AgPT09IDQ2KSB7XG5cdCAgICAgICAgICAgIHZhciBuMSA9IHRoaXMuc2Nhbm5lci5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLnNjYW5uZXIuaW5kZXggKyAxKTtcblx0ICAgICAgICAgICAgdmFyIG4yID0gdGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuc2Nhbm5lci5pbmRleCArIDIpO1xuXHQgICAgICAgICAgICB2YXIgdmFsdWUgPSAobjEgPT09IDQ2ICYmIG4yID09PSA0NikgPyAnLi4uJyA6ICcuJztcblx0ICAgICAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICB0aGlzLnNjYW5uZXIuaW5kZXggKz0gdmFsdWUubGVuZ3RoO1xuXHQgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogNyAvKiBQdW5jdHVhdG9yICovLFxuXHQgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuXHQgICAgICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMuc2Nhbm5lci5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuc2Nhbm5lci5pbmRleFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBgXG5cdCAgICAgICAgaWYgKGNwID09PSA5Nikge1xuXHQgICAgICAgICAgICAvLyBPbmx5IHBsYWNlaG9sZGVyLCBzaW5jZSBpdCB3aWxsIGJlIHJlc2Nhbm5lZCBhcyBhIHJlYWwgYXNzaWdubWVudCBleHByZXNzaW9uLlxuXHQgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogMTAgLyogVGVtcGxhdGUgKi8sXG5cdCAgICAgICAgICAgICAgICB2YWx1ZTogJycsXG5cdCAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5zY2FubmVyLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnNjYW5uZXIuaW5kZXgsXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuc2Nhbm5lci5pbmRleFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBJZGVudGlmZXIgY2FuIG5vdCBjb250YWluIGJhY2tzbGFzaCAoY2hhciBjb2RlIDkyKS5cblx0ICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KGNwKSAmJiAoY3AgIT09IDkyKSkge1xuXHQgICAgICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgICsrdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICB3aGlsZSAoIXRoaXMuc2Nhbm5lci5lb2YoKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zY2FubmVyLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuc2Nhbm5lci5pbmRleCk7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclBhcnQoY2gpICYmIChjaCAhPT0gOTIpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gNDUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBIeXBoZW4gKGNoYXIgY29kZSA0NSkgY2FuIGJlIHBhcnQgb2YgYW4gaWRlbnRpZmllci5cblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBpZCA9IHRoaXMuc2Nhbm5lci5zb3VyY2Uuc2xpY2Uoc3RhcnQsIHRoaXMuc2Nhbm5lci5pbmRleCk7XG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiAxMDAgLyogSWRlbnRpZmllciAqLyxcblx0ICAgICAgICAgICAgICAgIHZhbHVlOiBpZCxcblx0ICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLnNjYW5uZXIubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnNjYW5uZXIuaW5kZXhcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuc2Nhbm5lci5sZXgoKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLm5leHRKU1hUb2tlbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmNvbGxlY3RDb21tZW50cygpO1xuXHQgICAgICAgIHRoaXMuc3RhcnRNYXJrZXIuaW5kZXggPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlci5saW5lID0gdGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlci5jb2x1bW4gPSB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0O1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubGV4SlNYKCk7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmluZGV4ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlci5saW5lID0gdGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmNvbHVtbiA9IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnQ7XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLnRva2Vucykge1xuXHQgICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMuY29udmVydFRva2VuKHRva2VuKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLm5leHRKU1hUZXh0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuc3RhcnRNYXJrZXIuaW5kZXggPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlci5saW5lID0gdGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgdGhpcy5zdGFydE1hcmtlci5jb2x1bW4gPSB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0O1xuXHQgICAgICAgIHZhciBzdGFydCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICB2YXIgdGV4dCA9ICcnO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5zY2FubmVyLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4XTtcblx0ICAgICAgICAgICAgaWYgKGNoID09PSAneycgfHwgY2ggPT09ICc8Jykge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgKyt0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIHRleHQgKz0gY2g7XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgKyt0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgdGhpcy5zY2FubmVyLnNvdXJjZVt0aGlzLnNjYW5uZXIuaW5kZXhdID09PSAnXFxuJykge1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmxpbmVTdGFydCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuaW5kZXggPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuY29sdW1uID0gdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydDtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB7XG5cdCAgICAgICAgICAgIHR5cGU6IDEwMSAvKiBUZXh0ICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogdGV4dCxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5zY2FubmVyLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuc2Nhbm5lci5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICAgICAgaWYgKCh0ZXh0Lmxlbmd0aCA+IDApICYmIHRoaXMuY29uZmlnLnRva2Vucykge1xuXHQgICAgICAgICAgICB0aGlzLnRva2Vucy5wdXNoKHRoaXMuY29udmVydFRva2VuKHRva2VuKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0b2tlbjtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBlZWtKU1hUb2tlbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnNjYW5uZXIuc2F2ZVN0YXRlKCk7XG5cdCAgICAgICAgdGhpcy5zY2FubmVyLnNjYW5Db21tZW50cygpO1xuXHQgICAgICAgIHZhciBuZXh0ID0gdGhpcy5sZXhKU1goKTtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIucmVzdG9yZVN0YXRlKHN0YXRlKTtcblx0ICAgICAgICByZXR1cm4gbmV4dDtcblx0ICAgIH07XG5cdCAgICAvLyBFeHBlY3QgdGhlIG5leHQgSlNYIHRva2VuIHRvIG1hdGNoIHRoZSBzcGVjaWZpZWQgcHVuY3R1YXRvci5cblx0ICAgIC8vIElmIG5vdCwgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLlxuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5leHBlY3RKU1ggPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRKU1hUb2tlbigpO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlICE9PSA3IC8qIFB1bmN0dWF0b3IgKi8gfHwgdG9rZW4udmFsdWUgIT09IHZhbHVlKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmV4dCBKU1ggdG9rZW4gbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHB1bmN0dWF0b3IuXG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLm1hdGNoSlNYID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgdmFyIG5leHQgPSB0aGlzLnBlZWtKU1hUb2tlbigpO1xuXHQgICAgICAgIHJldHVybiBuZXh0LnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiBuZXh0LnZhbHVlID09PSB2YWx1ZTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYSWRlbnRpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYTm9kZSgpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dEpTWFRva2VuKCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09IDEwMCAvKiBJZGVudGlmaWVyICovKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hJZGVudGlmaWVyKHRva2VuLnZhbHVlKSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEVsZW1lbnROYW1lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdmFyIGVsZW1lbnROYW1lID0gdGhpcy5wYXJzZUpTWElkZW50aWZpZXIoKTtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaEpTWCgnOicpKSB7XG5cdCAgICAgICAgICAgIHZhciBuYW1lc3BhY2UgPSBlbGVtZW50TmFtZTtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJzonKTtcblx0ICAgICAgICAgICAgdmFyIG5hbWVfMSA9IHRoaXMucGFyc2VKU1hJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIGVsZW1lbnROYW1lID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hOYW1lc3BhY2VkTmFtZShuYW1lc3BhY2UsIG5hbWVfMSkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoSlNYKCcuJykpIHtcblx0ICAgICAgICAgICAgd2hpbGUgKHRoaXMubWF0Y2hKU1goJy4nKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIG9iamVjdCA9IGVsZW1lbnROYW1lO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJy4nKTtcblx0ICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IHRoaXMucGFyc2VKU1hJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYTWVtYmVyRXhwcmVzc2lvbihvYmplY3QsIHByb3BlcnR5KSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGVsZW1lbnROYW1lO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hBdHRyaWJ1dGVOYW1lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWU7XG5cdCAgICAgICAgdmFyIGlkZW50aWZpZXIgPSB0aGlzLnBhcnNlSlNYSWRlbnRpZmllcigpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoSlNYKCc6JykpIHtcblx0ICAgICAgICAgICAgdmFyIG5hbWVzcGFjZSA9IGlkZW50aWZpZXI7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0SlNYKCc6Jyk7XG5cdCAgICAgICAgICAgIHZhciBuYW1lXzIgPSB0aGlzLnBhcnNlSlNYSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hOYW1lc3BhY2VkTmFtZShuYW1lc3BhY2UsIG5hbWVfMikpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgYXR0cmlidXRlTmFtZSA9IGlkZW50aWZpZXI7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hTdHJpbmdMaXRlcmFsQXR0cmlidXRlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0SlNYVG9rZW4oKTtcblx0ICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gOCAvKiBTdHJpbmdMaXRlcmFsICovKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcmF3ID0gdGhpcy5nZXRUb2tlblJhdyh0b2tlbik7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuTGl0ZXJhbCh0b2tlbi52YWx1ZSwgcmF3KSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEV4cHJlc3Npb25BdHRyaWJ1dGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWE5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEpTWCgneycpO1xuXHQgICAgICAgIHRoaXMuZmluaXNoSlNYKCk7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IoJ0pTWCBhdHRyaWJ1dGVzIG11c3Qgb25seSBiZSBhc3NpZ25lZCBhIG5vbi1lbXB0eSBleHByZXNzaW9uJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBleHByZXNzaW9uID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdGhpcy5yZWVudGVySlNYKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYRXhwcmVzc2lvbkNvbnRhaW5lcihleHByZXNzaW9uKSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEF0dHJpYnV0ZVZhbHVlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLm1hdGNoSlNYKCd7JykgPyB0aGlzLnBhcnNlSlNYRXhwcmVzc2lvbkF0dHJpYnV0ZSgpIDpcblx0ICAgICAgICAgICAgdGhpcy5tYXRjaEpTWCgnPCcpID8gdGhpcy5wYXJzZUpTWEVsZW1lbnQoKSA6IHRoaXMucGFyc2VKU1hTdHJpbmdMaXRlcmFsQXR0cmlidXRlKCk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWE5hbWVWYWx1ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYTm9kZSgpO1xuXHQgICAgICAgIHZhciBuYW1lID0gdGhpcy5wYXJzZUpTWEF0dHJpYnV0ZU5hbWUoKTtcblx0ICAgICAgICB2YXIgdmFsdWUgPSBudWxsO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoSlNYKCc9JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJz0nKTtcblx0ICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlSlNYQXR0cmlidXRlVmFsdWUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYQXR0cmlidXRlKG5hbWUsIHZhbHVlKSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWFNwcmVhZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0SlNYKCd7Jyk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJy4uLicpO1xuXHQgICAgICAgIHRoaXMuZmluaXNoSlNYKCk7XG5cdCAgICAgICAgdmFyIGFyZ3VtZW50ID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdGhpcy5yZWVudGVySlNYKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYU3ByZWFkQXR0cmlidXRlKGFyZ3VtZW50KSk7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBbXTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2hKU1goJy8nKSAmJiAhdGhpcy5tYXRjaEpTWCgnPicpKSB7XG5cdCAgICAgICAgICAgIHZhciBhdHRyaWJ1dGUgPSB0aGlzLm1hdGNoSlNYKCd7JykgPyB0aGlzLnBhcnNlSlNYU3ByZWFkQXR0cmlidXRlKCkgOlxuXHQgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUpTWE5hbWVWYWx1ZUF0dHJpYnV0ZSgpO1xuXHQgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUpTWE9wZW5pbmdFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJzwnKTtcblx0ICAgICAgICB2YXIgbmFtZSA9IHRoaXMucGFyc2VKU1hFbGVtZW50TmFtZSgpO1xuXHQgICAgICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5wYXJzZUpTWEF0dHJpYnV0ZXMoKTtcblx0ICAgICAgICB2YXIgc2VsZkNsb3NpbmcgPSB0aGlzLm1hdGNoSlNYKCcvJyk7XG5cdCAgICAgICAgaWYgKHNlbGZDbG9zaW5nKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0SlNYKCcvJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0SlNYKCc+Jyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYT3BlbmluZ0VsZW1lbnQobmFtZSwgc2VsZkNsb3NpbmcsIGF0dHJpYnV0ZXMpKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYQm91bmRhcnlFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJzwnKTtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaEpTWCgnLycpKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0SlNYKCcvJyk7XG5cdCAgICAgICAgICAgIHZhciBuYW1lXzMgPSB0aGlzLnBhcnNlSlNYRWxlbWVudE5hbWUoKTtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJz4nKTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYQ2xvc2luZ0VsZW1lbnQobmFtZV8zKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBuYW1lID0gdGhpcy5wYXJzZUpTWEVsZW1lbnROYW1lKCk7XG5cdCAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLnBhcnNlSlNYQXR0cmlidXRlcygpO1xuXHQgICAgICAgIHZhciBzZWxmQ2xvc2luZyA9IHRoaXMubWF0Y2hKU1goJy8nKTtcblx0ICAgICAgICBpZiAoc2VsZkNsb3NpbmcpIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RKU1goJy8nKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJz4nKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hPcGVuaW5nRWxlbWVudChuYW1lLCBzZWxmQ2xvc2luZywgYXR0cmlidXRlcykpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hFbXB0eUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWENoaWxkTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuY29sbGVjdENvbW1lbnRzKCk7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmluZGV4ID0gdGhpcy5zY2FubmVyLmluZGV4O1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlci5saW5lID0gdGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmNvbHVtbiA9IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYRW1wdHlFeHByZXNzaW9uKCkpO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hFeHByZXNzaW9uQ29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RKU1goJ3snKTtcblx0ICAgICAgICB2YXIgZXhwcmVzc2lvbjtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaEpTWCgnfScpKSB7XG5cdCAgICAgICAgICAgIGV4cHJlc3Npb24gPSB0aGlzLnBhcnNlSlNYRW1wdHlFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0SlNYKCd9Jyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmZpbmlzaEpTWCgpO1xuXHQgICAgICAgICAgICBleHByZXNzaW9uID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgIHRoaXMucmVlbnRlckpTWCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hFeHByZXNzaW9uQ29udGFpbmVyKGV4cHJlc3Npb24pKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYQ2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNoaWxkcmVuID0gW107XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKCkpIHtcblx0ICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZUpTWENoaWxkTm9kZSgpO1xuXHQgICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRKU1hUZXh0KCk7XG5cdCAgICAgICAgICAgIGlmICh0b2tlbi5zdGFydCA8IHRva2VuLmVuZCkge1xuXHQgICAgICAgICAgICAgICAgdmFyIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgSlNYTm9kZS5KU1hUZXh0KHRva2VuLnZhbHVlLCByYXcpKTtcblx0ICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuc291cmNlW3RoaXMuc2Nhbm5lci5pbmRleF0gPT09ICd7Jykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMucGFyc2VKU1hFeHByZXNzaW9uQ29udGFpbmVyKCk7XG5cdCAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGNvbnRhaW5lcik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gY2hpbGRyZW47XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNvbXBsZXhKU1hFbGVtZW50ID0gZnVuY3Rpb24gKGVsKSB7XG5cdCAgICAgICAgdmFyIHN0YWNrID0gW107XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLnNjYW5uZXIuZW9mKCkpIHtcblx0ICAgICAgICAgICAgZWwuY2hpbGRyZW4gPSBlbC5jaGlsZHJlbi5jb25jYXQodGhpcy5wYXJzZUpTWENoaWxkcmVuKCkpO1xuXHQgICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlSlNYQ2hpbGROb2RlKCk7XG5cdCAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5wYXJzZUpTWEJvdW5kYXJ5RWxlbWVudCgpO1xuXHQgICAgICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWE9wZW5pbmdFbGVtZW50KSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgb3BlbmluZyA9IGVsZW1lbnQ7XG5cdCAgICAgICAgICAgICAgICBpZiAob3BlbmluZy5zZWxmQ2xvc2luZykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IEpTWE5vZGUuSlNYRWxlbWVudChvcGVuaW5nLCBbXSwgbnVsbCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIGVsLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChlbCk7XG5cdCAgICAgICAgICAgICAgICAgICAgZWwgPSB7IG5vZGU6IG5vZGUsIG9wZW5pbmc6IG9wZW5pbmcsIGNsb3Npbmc6IG51bGwsIGNoaWxkcmVuOiBbXSB9O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYQ2xvc2luZ0VsZW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgIGVsLmNsb3NpbmcgPSBlbGVtZW50O1xuXHQgICAgICAgICAgICAgICAgdmFyIG9wZW5fMSA9IGdldFF1YWxpZmllZEVsZW1lbnROYW1lKGVsLm9wZW5pbmcubmFtZSk7XG5cdCAgICAgICAgICAgICAgICB2YXIgY2xvc2VfMSA9IGdldFF1YWxpZmllZEVsZW1lbnROYW1lKGVsLmNsb3NpbmcubmFtZSk7XG5cdCAgICAgICAgICAgICAgICBpZiAob3Blbl8xICE9PSBjbG9zZV8xKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKCdFeHBlY3RlZCBjb3JyZXNwb25kaW5nIEpTWCBjbG9zaW5nIHRhZyBmb3IgJTAnLCBvcGVuXzEpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmZpbmFsaXplKGVsLm5vZGUsIG5ldyBKU1hOb2RlLkpTWEVsZW1lbnQoZWwub3BlbmluZywgZWwuY2hpbGRyZW4sIGVsLmNsb3NpbmcpKTtcblx0ICAgICAgICAgICAgICAgICAgICBlbCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xuXHQgICAgICAgICAgICAgICAgICAgIGVsLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGVsO1xuXHQgICAgfTtcblx0ICAgIEpTWFBhcnNlci5wcm90b3R5cGUucGFyc2VKU1hFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVKU1hOb2RlKCk7XG5cdCAgICAgICAgdmFyIG9wZW5pbmcgPSB0aGlzLnBhcnNlSlNYT3BlbmluZ0VsZW1lbnQoKTtcblx0ICAgICAgICB2YXIgY2hpbGRyZW4gPSBbXTtcblx0ICAgICAgICB2YXIgY2xvc2luZyA9IG51bGw7XG5cdCAgICAgICAgaWYgKCFvcGVuaW5nLnNlbGZDbG9zaW5nKSB7XG5cdCAgICAgICAgICAgIHZhciBlbCA9IHRoaXMucGFyc2VDb21wbGV4SlNYRWxlbWVudCh7IG5vZGU6IG5vZGUsIG9wZW5pbmc6IG9wZW5pbmcsIGNsb3Npbmc6IGNsb3NpbmcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9KTtcblx0ICAgICAgICAgICAgY2hpbGRyZW4gPSBlbC5jaGlsZHJlbjtcblx0ICAgICAgICAgICAgY2xvc2luZyA9IGVsLmNsb3Npbmc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBKU1hOb2RlLkpTWEVsZW1lbnQob3BlbmluZywgY2hpbGRyZW4sIGNsb3NpbmcpKTtcblx0ICAgIH07XG5cdCAgICBKU1hQYXJzZXIucHJvdG90eXBlLnBhcnNlSlNYUm9vdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAvLyBQb3AgdGhlIG9wZW5pbmcgJzwnIGFkZGVkIGZyb20gdGhlIGxvb2thaGVhZC5cblx0ICAgICAgICBpZiAodGhpcy5jb25maWcudG9rZW5zKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9rZW5zLnBvcCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnN0YXJ0SlNYKCk7XG5cdCAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLnBhcnNlSlNYRWxlbWVudCgpO1xuXHQgICAgICAgIHRoaXMuZmluaXNoSlNYKCk7XG5cdCAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG5cdCAgICB9O1xuXHQgICAgSlNYUGFyc2VyLnByb3RvdHlwZS5pc1N0YXJ0T2ZFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmlzU3RhcnRPZkV4cHJlc3Npb24uY2FsbCh0aGlzKSB8fCB0aGlzLm1hdGNoKCc8Jyk7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIEpTWFBhcnNlcjtcblx0fShwYXJzZXJfMS5QYXJzZXIpKTtcblx0ZXhwb3J0cy5KU1hQYXJzZXIgPSBKU1hQYXJzZXI7XG5cblxuLyoqKi8gfSxcbi8qIDQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdC8vIFNlZSBhbHNvIHRvb2xzL2dlbmVyYXRlLXVuaWNvZGUtcmVnZXguanMuXG5cdHZhciBSZWdleCA9IHtcblx0ICAgIC8vIFVuaWNvZGUgdjguMC4wIE5vbkFzY2lpSWRlbnRpZmllclN0YXJ0OlxuXHQgICAgTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQ6IC9bXFx4QUFcXHhCNVxceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzNzAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM3RlxcdTAzODZcXHUwMzg4LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4QS1cXHUwNTJGXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MjAtXFx1MDY0QVxcdTA2NkVcXHUwNjZGXFx1MDY3MS1cXHUwNkQzXFx1MDZENVxcdTA2RTVcXHUwNkU2XFx1MDZFRVxcdTA2RUZcXHUwNkZBLVxcdTA2RkNcXHUwNkZGXFx1MDcxMFxcdTA3MTItXFx1MDcyRlxcdTA3NEQtXFx1MDdBNVxcdTA3QjFcXHUwN0NBLVxcdTA3RUFcXHUwN0Y0XFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MTVcXHUwODFBXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwOEEwLVxcdTA4QjRcXHUwOTA0LVxcdTA5MzlcXHUwOTNEXFx1MDk1MFxcdTA5NTgtXFx1MDk2MVxcdTA5NzEtXFx1MDk4MFxcdTA5ODUtXFx1MDk4Q1xcdTA5OEZcXHUwOTkwXFx1MDk5My1cXHUwOUE4XFx1MDlBQS1cXHUwOUIwXFx1MDlCMlxcdTA5QjYtXFx1MDlCOVxcdTA5QkRcXHUwOUNFXFx1MDlEQ1xcdTA5RERcXHUwOURGLVxcdTA5RTFcXHUwOUYwXFx1MDlGMVxcdTBBMDUtXFx1MEEwQVxcdTBBMEZcXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMlxcdTBBMzNcXHUwQTM1XFx1MEEzNlxcdTBBMzhcXHUwQTM5XFx1MEE1OS1cXHUwQTVDXFx1MEE1RVxcdTBBNzItXFx1MEE3NFxcdTBBODUtXFx1MEE4RFxcdTBBOEYtXFx1MEE5MVxcdTBBOTMtXFx1MEFBOFxcdTBBQUEtXFx1MEFCMFxcdTBBQjJcXHUwQUIzXFx1MEFCNS1cXHUwQUI5XFx1MEFCRFxcdTBBRDBcXHUwQUUwXFx1MEFFMVxcdTBBRjlcXHUwQjA1LVxcdTBCMENcXHUwQjBGXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzJcXHUwQjMzXFx1MEIzNS1cXHUwQjM5XFx1MEIzRFxcdTBCNUNcXHUwQjVEXFx1MEI1Ri1cXHUwQjYxXFx1MEI3MVxcdTBCODNcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5XFx1MEI5QVxcdTBCOUNcXHUwQjlFXFx1MEI5RlxcdTBCQTNcXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI5XFx1MEJEMFxcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzOVxcdTBDM0RcXHUwQzU4LVxcdTBDNUFcXHUwQzYwXFx1MEM2MVxcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkRcXHUwQ0RFXFx1MENFMFxcdTBDRTFcXHUwQ0YxXFx1MENGMlxcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0RcXHUwRDRFXFx1MEQ1Ri1cXHUwRDYxXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4NS1cXHUwRDk2XFx1MEQ5QS1cXHUwREIxXFx1MERCMy1cXHUwREJCXFx1MERCRFxcdTBEQzAtXFx1MERDNlxcdTBFMDEtXFx1MEUzMFxcdTBFMzJcXHUwRTMzXFx1MEU0MC1cXHUwRTQ2XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjBcXHUwRUIyXFx1MEVCM1xcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGNDAtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGODgtXFx1MEY4Q1xcdTEwMDAtXFx1MTAyQVxcdTEwM0ZcXHUxMDUwLVxcdTEwNTVcXHUxMDVBLVxcdTEwNURcXHUxMDYxXFx1MTA2NVxcdTEwNjZcXHUxMDZFLVxcdTEwNzBcXHUxMDc1LVxcdTEwODFcXHUxMDhFXFx1MTBBMC1cXHUxMEM1XFx1MTBDN1xcdTEwQ0RcXHUxMEQwLVxcdTEwRkFcXHUxMEZDLVxcdTEyNDhcXHUxMjRBLVxcdTEyNERcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1QS1cXHUxMjVEXFx1MTI2MC1cXHUxMjg4XFx1MTI4QS1cXHUxMjhEXFx1MTI5MC1cXHUxMkIwXFx1MTJCMi1cXHUxMkI1XFx1MTJCOC1cXHUxMkJFXFx1MTJDMFxcdTEyQzItXFx1MTJDNVxcdTEyQzgtXFx1MTJENlxcdTEyRDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1QVxcdTEzODAtXFx1MTM4RlxcdTEzQTAtXFx1MTNGNVxcdTEzRjgtXFx1MTNGRFxcdTE0MDEtXFx1MTY2Q1xcdTE2NkYtXFx1MTY3RlxcdTE2ODEtXFx1MTY5QVxcdTE2QTAtXFx1MTZFQVxcdTE2RUUtXFx1MTZGOFxcdTE3MDAtXFx1MTcwQ1xcdTE3MEUtXFx1MTcxMVxcdTE3MjAtXFx1MTczMVxcdTE3NDAtXFx1MTc1MVxcdTE3NjAtXFx1MTc2Q1xcdTE3NkUtXFx1MTc3MFxcdTE3ODAtXFx1MTdCM1xcdTE3RDdcXHUxN0RDXFx1MTgyMC1cXHUxODc3XFx1MTg4MC1cXHUxOEE4XFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5NTAtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QjAtXFx1MTlDOVxcdTFBMDAtXFx1MUExNlxcdTFBMjAtXFx1MUE1NFxcdTFBQTdcXHUxQjA1LVxcdTFCMzNcXHUxQjQ1LVxcdTFCNEJcXHUxQjgzLVxcdTFCQTBcXHUxQkFFXFx1MUJBRlxcdTFCQkEtXFx1MUJFNVxcdTFDMDAtXFx1MUMyM1xcdTFDNEQtXFx1MUM0RlxcdTFDNUEtXFx1MUM3RFxcdTFDRTktXFx1MUNFQ1xcdTFDRUUtXFx1MUNGMVxcdTFDRjVcXHUxQ0Y2XFx1MUQwMC1cXHUxREJGXFx1MUUwMC1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjEwMlxcdTIxMDdcXHUyMTBBLVxcdTIxMTNcXHUyMTE1XFx1MjExOC1cXHUyMTFEXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyQS1cXHUyMTM5XFx1MjEzQy1cXHUyMTNGXFx1MjE0NS1cXHUyMTQ5XFx1MjE0RVxcdTIxNjAtXFx1MjE4OFxcdTJDMDAtXFx1MkMyRVxcdTJDMzAtXFx1MkM1RVxcdTJDNjAtXFx1MkNFNFxcdTJDRUItXFx1MkNFRVxcdTJDRjJcXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ4MC1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDI5XFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5Qi1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjFGXFx1QTYyQVxcdUE2MkJcXHVBNjQwLVxcdUE2NkVcXHVBNjdGLVxcdUE2OURcXHVBNkEwLVxcdUE2RUZcXHVBNzE3LVxcdUE3MUZcXHVBNzIyLVxcdUE3ODhcXHVBNzhCLVxcdUE3QURcXHVBN0IwLVxcdUE3QjdcXHVBN0Y3LVxcdUE4MDFcXHVBODAzLVxcdUE4MDVcXHVBODA3LVxcdUE4MEFcXHVBODBDLVxcdUE4MjJcXHVBODQwLVxcdUE4NzNcXHVBODgyLVxcdUE4QjNcXHVBOEYyLVxcdUE4RjdcXHVBOEZCXFx1QThGRFxcdUE5MEEtXFx1QTkyNVxcdUE5MzAtXFx1QTk0NlxcdUE5NjAtXFx1QTk3Q1xcdUE5ODQtXFx1QTlCMlxcdUE5Q0ZcXHVBOUUwLVxcdUE5RTRcXHVBOUU2LVxcdUE5RUZcXHVBOUZBLVxcdUE5RkVcXHVBQTAwLVxcdUFBMjhcXHVBQTQwLVxcdUFBNDJcXHVBQTQ0LVxcdUFBNEJcXHVBQTYwLVxcdUFBNzZcXHVBQTdBXFx1QUE3RS1cXHVBQUFGXFx1QUFCMVxcdUFBQjVcXHVBQUI2XFx1QUFCOS1cXHVBQUJEXFx1QUFDMFxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUFcXHVBQUYyLVxcdUFBRjRcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRTJcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFEXFx1RkIxRi1cXHVGQjI4XFx1RkIyQS1cXHVGQjM2XFx1RkIzOC1cXHVGQjNDXFx1RkIzRVxcdUZCNDBcXHVGQjQxXFx1RkI0M1xcdUZCNDRcXHVGQjQ2LVxcdUZCQjFcXHVGQkQzLVxcdUZEM0RcXHVGRDUwLVxcdUZEOEZcXHVGRDkyLVxcdUZEQzdcXHVGREYwLVxcdUZERkJcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjIxLVxcdUZGM0FcXHVGRjQxLVxcdUZGNUFcXHVGRjY2LVxcdUZGQkVcXHVGRkMyLVxcdUZGQzdcXHVGRkNBLVxcdUZGQ0ZcXHVGRkQyLVxcdUZGRDdcXHVGRkRBLVxcdUZGRENdfFxcdUQ4MDBbXFx1REMwMC1cXHVEQzBCXFx1REMwRC1cXHVEQzI2XFx1REMyOC1cXHVEQzNBXFx1REMzQ1xcdURDM0RcXHVEQzNGLVxcdURDNERcXHVEQzUwLVxcdURDNURcXHVEQzgwLVxcdURDRkFcXHVERDQwLVxcdURENzRcXHVERTgwLVxcdURFOUNcXHVERUEwLVxcdURFRDBcXHVERjAwLVxcdURGMUZcXHVERjMwLVxcdURGNEFcXHVERjUwLVxcdURGNzVcXHVERjgwLVxcdURGOURcXHVERkEwLVxcdURGQzNcXHVERkM4LVxcdURGQ0ZcXHVERkQxLVxcdURGRDVdfFxcdUQ4MDFbXFx1REMwMC1cXHVEQzlEXFx1REQwMC1cXHVERDI3XFx1REQzMC1cXHVERDYzXFx1REUwMC1cXHVERjM2XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjY3XXxcXHVEODAyW1xcdURDMDAtXFx1REMwNVxcdURDMDhcXHVEQzBBLVxcdURDMzVcXHVEQzM3XFx1REMzOFxcdURDM0NcXHVEQzNGLVxcdURDNTVcXHVEQzYwLVxcdURDNzZcXHVEQzgwLVxcdURDOUVcXHVEQ0UwLVxcdURDRjJcXHVEQ0Y0XFx1RENGNVxcdUREMDAtXFx1REQxNVxcdUREMjAtXFx1REQzOVxcdUREODAtXFx1RERCN1xcdUREQkVcXHVEREJGXFx1REUwMFxcdURFMTAtXFx1REUxM1xcdURFMTUtXFx1REUxN1xcdURFMTktXFx1REUzM1xcdURFNjAtXFx1REU3Q1xcdURFODAtXFx1REU5Q1xcdURFQzAtXFx1REVDN1xcdURFQzktXFx1REVFNFxcdURGMDAtXFx1REYzNVxcdURGNDAtXFx1REY1NVxcdURGNjAtXFx1REY3MlxcdURGODAtXFx1REY5MV18XFx1RDgwM1tcXHVEQzAwLVxcdURDNDhcXHVEQzgwLVxcdURDQjJcXHVEQ0MwLVxcdURDRjJdfFxcdUQ4MDRbXFx1REMwMy1cXHVEQzM3XFx1REM4My1cXHVEQ0FGXFx1RENEMC1cXHVEQ0U4XFx1REQwMy1cXHVERDI2XFx1REQ1MC1cXHVERDcyXFx1REQ3NlxcdUREODMtXFx1RERCMlxcdUREQzEtXFx1RERDNFxcdUREREFcXHVERERDXFx1REUwMC1cXHVERTExXFx1REUxMy1cXHVERTJCXFx1REU4MC1cXHVERTg2XFx1REU4OFxcdURFOEEtXFx1REU4RFxcdURFOEYtXFx1REU5RFxcdURFOUYtXFx1REVBOFxcdURFQjAtXFx1REVERVxcdURGMDUtXFx1REYwQ1xcdURGMEZcXHVERjEwXFx1REYxMy1cXHVERjI4XFx1REYyQS1cXHVERjMwXFx1REYzMlxcdURGMzNcXHVERjM1LVxcdURGMzlcXHVERjNEXFx1REY1MFxcdURGNUQtXFx1REY2MV18XFx1RDgwNVtcXHVEQzgwLVxcdURDQUZcXHVEQ0M0XFx1RENDNVxcdURDQzdcXHVERDgwLVxcdUREQUVcXHVEREQ4LVxcdUREREJcXHVERTAwLVxcdURFMkZcXHVERTQ0XFx1REU4MC1cXHVERUFBXFx1REYwMC1cXHVERjE5XXxcXHVEODA2W1xcdURDQTAtXFx1RENERlxcdURDRkZcXHVERUMwLVxcdURFRjhdfFxcdUQ4MDhbXFx1REMwMC1cXHVERjk5XXxcXHVEODA5W1xcdURDMDAtXFx1REM2RVxcdURDODAtXFx1REQ0M118W1xcdUQ4MENcXHVEODQwLVxcdUQ4NjhcXHVEODZBLVxcdUQ4NkNcXHVEODZGLVxcdUQ4NzJdW1xcdURDMDAtXFx1REZGRl18XFx1RDgwRFtcXHVEQzAwLVxcdURDMkVdfFxcdUQ4MTFbXFx1REMwMC1cXHVERTQ2XXxcXHVEODFBW1xcdURDMDAtXFx1REUzOFxcdURFNDAtXFx1REU1RVxcdURFRDAtXFx1REVFRFxcdURGMDAtXFx1REYyRlxcdURGNDAtXFx1REY0M1xcdURGNjMtXFx1REY3N1xcdURGN0QtXFx1REY4Rl18XFx1RDgxQltcXHVERjAwLVxcdURGNDRcXHVERjUwXFx1REY5My1cXHVERjlGXXxcXHVEODJDW1xcdURDMDBcXHVEQzAxXXxcXHVEODJGW1xcdURDMDAtXFx1REM2QVxcdURDNzAtXFx1REM3Q1xcdURDODAtXFx1REM4OFxcdURDOTAtXFx1REM5OV18XFx1RDgzNVtcXHVEQzAwLVxcdURDNTRcXHVEQzU2LVxcdURDOUNcXHVEQzlFXFx1REM5RlxcdURDQTJcXHVEQ0E1XFx1RENBNlxcdURDQTktXFx1RENBQ1xcdURDQUUtXFx1RENCOVxcdURDQkJcXHVEQ0JELVxcdURDQzNcXHVEQ0M1LVxcdUREMDVcXHVERDA3LVxcdUREMEFcXHVERDBELVxcdUREMTRcXHVERDE2LVxcdUREMUNcXHVERDFFLVxcdUREMzlcXHVERDNCLVxcdUREM0VcXHVERDQwLVxcdURENDRcXHVERDQ2XFx1REQ0QS1cXHVERDUwXFx1REQ1Mi1cXHVERUE1XFx1REVBOC1cXHVERUMwXFx1REVDMi1cXHVERURBXFx1REVEQy1cXHVERUZBXFx1REVGQy1cXHVERjE0XFx1REYxNi1cXHVERjM0XFx1REYzNi1cXHVERjRFXFx1REY1MC1cXHVERjZFXFx1REY3MC1cXHVERjg4XFx1REY4QS1cXHVERkE4XFx1REZBQS1cXHVERkMyXFx1REZDNC1cXHVERkNCXXxcXHVEODNBW1xcdURDMDAtXFx1RENDNF18XFx1RDgzQltcXHVERTAwLVxcdURFMDNcXHVERTA1LVxcdURFMUZcXHVERTIxXFx1REUyMlxcdURFMjRcXHVERTI3XFx1REUyOS1cXHVERTMyXFx1REUzNC1cXHVERTM3XFx1REUzOVxcdURFM0JcXHVERTQyXFx1REU0N1xcdURFNDlcXHVERTRCXFx1REU0RC1cXHVERTRGXFx1REU1MVxcdURFNTJcXHVERTU0XFx1REU1N1xcdURFNTlcXHVERTVCXFx1REU1RFxcdURFNUZcXHVERTYxXFx1REU2MlxcdURFNjRcXHVERTY3LVxcdURFNkFcXHVERTZDLVxcdURFNzJcXHVERTc0LVxcdURFNzdcXHVERTc5LVxcdURFN0NcXHVERTdFXFx1REU4MC1cXHVERTg5XFx1REU4Qi1cXHVERTlCXFx1REVBMS1cXHVERUEzXFx1REVBNS1cXHVERUE5XFx1REVBQi1cXHVERUJCXXxcXHVEODY5W1xcdURDMDAtXFx1REVENlxcdURGMDAtXFx1REZGRl18XFx1RDg2RFtcXHVEQzAwLVxcdURGMzRcXHVERjQwLVxcdURGRkZdfFxcdUQ4NkVbXFx1REMwMC1cXHVEQzFEXFx1REMyMC1cXHVERkZGXXxcXHVEODczW1xcdURDMDAtXFx1REVBMV18XFx1RDg3RVtcXHVEQzAwLVxcdURFMURdLyxcblx0ICAgIC8vIFVuaWNvZGUgdjguMC4wIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6XG5cdCAgICBOb25Bc2NpaUlkZW50aWZpZXJQYXJ0OiAvW1xceEFBXFx4QjVcXHhCN1xceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzMDAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM3RlxcdTAzODYtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDgzLVxcdTA0ODdcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDU5MS1cXHUwNUJEXFx1MDVCRlxcdTA1QzFcXHUwNUMyXFx1MDVDNFxcdTA1QzVcXHUwNUM3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYxMC1cXHUwNjFBXFx1MDYyMC1cXHUwNjY5XFx1MDY2RS1cXHUwNkQzXFx1MDZENS1cXHUwNkRDXFx1MDZERi1cXHUwNkU4XFx1MDZFQS1cXHUwNkZDXFx1MDZGRlxcdTA3MTAtXFx1MDc0QVxcdTA3NEQtXFx1MDdCMVxcdTA3QzAtXFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MkRcXHUwODQwLVxcdTA4NUJcXHUwOEEwLVxcdTA4QjRcXHUwOEUzLVxcdTA5NjNcXHUwOTY2LVxcdTA5NkZcXHUwOTcxLVxcdTA5ODNcXHUwOTg1LVxcdTA5OENcXHUwOThGXFx1MDk5MFxcdTA5OTMtXFx1MDlBOFxcdTA5QUEtXFx1MDlCMFxcdTA5QjJcXHUwOUI2LVxcdTA5QjlcXHUwOUJDLVxcdTA5QzRcXHUwOUM3XFx1MDlDOFxcdTA5Q0ItXFx1MDlDRVxcdTA5RDdcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFM1xcdTA5RTYtXFx1MDlGMVxcdTBBMDEtXFx1MEEwM1xcdTBBMDUtXFx1MEEwQVxcdTBBMEZcXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMlxcdTBBMzNcXHUwQTM1XFx1MEEzNlxcdTBBMzhcXHUwQTM5XFx1MEEzQ1xcdTBBM0UtXFx1MEE0MlxcdTBBNDdcXHUwQTQ4XFx1MEE0Qi1cXHUwQTREXFx1MEE1MVxcdTBBNTktXFx1MEE1Q1xcdTBBNUVcXHUwQTY2LVxcdTBBNzVcXHUwQTgxLVxcdTBBODNcXHUwQTg1LVxcdTBBOERcXHUwQThGLVxcdTBBOTFcXHUwQTkzLVxcdTBBQThcXHUwQUFBLVxcdTBBQjBcXHUwQUIyXFx1MEFCM1xcdTBBQjUtXFx1MEFCOVxcdTBBQkMtXFx1MEFDNVxcdTBBQzctXFx1MEFDOVxcdTBBQ0ItXFx1MEFDRFxcdTBBRDBcXHUwQUUwLVxcdTBBRTNcXHUwQUU2LVxcdTBBRUZcXHUwQUY5XFx1MEIwMS1cXHUwQjAzXFx1MEIwNS1cXHUwQjBDXFx1MEIwRlxcdTBCMTBcXHUwQjEzLVxcdTBCMjhcXHUwQjJBLVxcdTBCMzBcXHUwQjMyXFx1MEIzM1xcdTBCMzUtXFx1MEIzOVxcdTBCM0MtXFx1MEI0NFxcdTBCNDdcXHUwQjQ4XFx1MEI0Qi1cXHUwQjREXFx1MEI1NlxcdTBCNTdcXHUwQjVDXFx1MEI1RFxcdTBCNUYtXFx1MEI2M1xcdTBCNjYtXFx1MEI2RlxcdTBCNzFcXHUwQjgyXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkJFLVxcdTBCQzJcXHUwQkM2LVxcdTBCQzhcXHUwQkNBLVxcdTBCQ0RcXHUwQkQwXFx1MEJEN1xcdTBCRTYtXFx1MEJFRlxcdTBDMDAtXFx1MEMwM1xcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzOVxcdTBDM0QtXFx1MEM0NFxcdTBDNDYtXFx1MEM0OFxcdTBDNEEtXFx1MEM0RFxcdTBDNTVcXHUwQzU2XFx1MEM1OC1cXHUwQzVBXFx1MEM2MC1cXHUwQzYzXFx1MEM2Ni1cXHUwQzZGXFx1MEM4MS1cXHUwQzgzXFx1MEM4NS1cXHUwQzhDXFx1MEM4RS1cXHUwQzkwXFx1MEM5Mi1cXHUwQ0E4XFx1MENBQS1cXHUwQ0IzXFx1MENCNS1cXHUwQ0I5XFx1MENCQy1cXHUwQ0M0XFx1MENDNi1cXHUwQ0M4XFx1MENDQS1cXHUwQ0NEXFx1MENENVxcdTBDRDZcXHUwQ0RFXFx1MENFMC1cXHUwQ0UzXFx1MENFNi1cXHUwQ0VGXFx1MENGMVxcdTBDRjJcXHUwRDAxLVxcdTBEMDNcXHUwRDA1LVxcdTBEMENcXHUwRDBFLVxcdTBEMTBcXHUwRDEyLVxcdTBEM0FcXHUwRDNELVxcdTBENDRcXHUwRDQ2LVxcdTBENDhcXHUwRDRBLVxcdTBENEVcXHUwRDU3XFx1MEQ1Ri1cXHUwRDYzXFx1MEQ2Ni1cXHUwRDZGXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4MlxcdTBEODNcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MERDQVxcdTBEQ0YtXFx1MERENFxcdTBERDZcXHUwREQ4LVxcdTBEREZcXHUwREU2LVxcdTBERUZcXHUwREYyXFx1MERGM1xcdTBFMDEtXFx1MEUzQVxcdTBFNDAtXFx1MEU0RVxcdTBFNTAtXFx1MEU1OVxcdTBFODFcXHUwRTgyXFx1MEU4NFxcdTBFODdcXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUFcXHUwRUFCXFx1MEVBRC1cXHUwRUI5XFx1MEVCQi1cXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEVDNlxcdTBFQzgtXFx1MEVDRFxcdTBFRDAtXFx1MEVEOVxcdTBFREMtXFx1MEVERlxcdTBGMDBcXHUwRjE4XFx1MEYxOVxcdTBGMjAtXFx1MEYyOVxcdTBGMzVcXHUwRjM3XFx1MEYzOVxcdTBGM0UtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGNzEtXFx1MEY4NFxcdTBGODYtXFx1MEY5N1xcdTBGOTktXFx1MEZCQ1xcdTBGQzZcXHUxMDAwLVxcdTEwNDlcXHUxMDUwLVxcdTEwOURcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM1RC1cXHUxMzVGXFx1MTM2OS1cXHUxMzcxXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzE0XFx1MTcyMC1cXHUxNzM0XFx1MTc0MC1cXHUxNzUzXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc3MlxcdTE3NzNcXHUxNzgwLVxcdTE3RDNcXHUxN0Q3XFx1MTdEQ1xcdTE3RERcXHUxN0UwLVxcdTE3RTlcXHUxODBCLVxcdTE4MERcXHUxODEwLVxcdTE4MTlcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QUFcXHUxOEIwLVxcdTE4RjVcXHUxOTAwLVxcdTE5MUVcXHUxOTIwLVxcdTE5MkJcXHUxOTMwLVxcdTE5M0JcXHUxOTQ2LVxcdTE5NkRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5QUJcXHUxOUIwLVxcdTE5QzlcXHUxOUQwLVxcdTE5REFcXHUxQTAwLVxcdTFBMUJcXHUxQTIwLVxcdTFBNUVcXHUxQTYwLVxcdTFBN0NcXHUxQTdGLVxcdTFBODlcXHUxQTkwLVxcdTFBOTlcXHUxQUE3XFx1MUFCMC1cXHUxQUJEXFx1MUIwMC1cXHUxQjRCXFx1MUI1MC1cXHUxQjU5XFx1MUI2Qi1cXHUxQjczXFx1MUI4MC1cXHUxQkYzXFx1MUMwMC1cXHUxQzM3XFx1MUM0MC1cXHUxQzQ5XFx1MUM0RC1cXHUxQzdEXFx1MUNEMC1cXHUxQ0QyXFx1MUNENC1cXHUxQ0Y2XFx1MUNGOFxcdTFDRjlcXHUxRDAwLVxcdTFERjVcXHUxREZDLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjAwQ1xcdTIwMERcXHUyMDNGXFx1MjA0MFxcdTIwNTRcXHUyMDcxXFx1MjA3RlxcdTIwOTAtXFx1MjA5Q1xcdTIwRDAtXFx1MjBEQ1xcdTIwRTFcXHUyMEU1LVxcdTIwRjBcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE4LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ3Ri1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MkRFMC1cXHUyREZGXFx1MzAwNS1cXHUzMDA3XFx1MzAyMS1cXHUzMDJGXFx1MzAzMS1cXHUzMDM1XFx1MzAzOC1cXHUzMDNDXFx1MzA0MS1cXHUzMDk2XFx1MzA5OS1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjJCXFx1QTY0MC1cXHVBNjZGXFx1QTY3NC1cXHVBNjdEXFx1QTY3Ri1cXHVBNkYxXFx1QTcxNy1cXHVBNzFGXFx1QTcyMi1cXHVBNzg4XFx1QTc4Qi1cXHVBN0FEXFx1QTdCMC1cXHVBN0I3XFx1QTdGNy1cXHVBODI3XFx1QTg0MC1cXHVBODczXFx1QTg4MC1cXHVBOEM0XFx1QThEMC1cXHVBOEQ5XFx1QThFMC1cXHVBOEY3XFx1QThGQlxcdUE4RkRcXHVBOTAwLVxcdUE5MkRcXHVBOTMwLVxcdUE5NTNcXHVBOTYwLVxcdUE5N0NcXHVBOTgwLVxcdUE5QzBcXHVBOUNGLVxcdUE5RDlcXHVBOUUwLVxcdUE5RkVcXHVBQTAwLVxcdUFBMzZcXHVBQTQwLVxcdUFBNERcXHVBQTUwLVxcdUFBNTlcXHVBQTYwLVxcdUFBNzZcXHVBQTdBLVxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUZcXHVBQUYyLVxcdUFBRjZcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRUFcXHVBQkVDXFx1QUJFRFxcdUFCRjAtXFx1QUJGOVxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMUQtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkUwMC1cXHVGRTBGXFx1RkUyMC1cXHVGRTJGXFx1RkUzM1xcdUZFMzRcXHVGRTRELVxcdUZFNEZcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjEwLVxcdUZGMTlcXHVGRjIxLVxcdUZGM0FcXHVGRjNGXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXXxcXHVEODAwW1xcdURDMDAtXFx1REMwQlxcdURDMEQtXFx1REMyNlxcdURDMjgtXFx1REMzQVxcdURDM0NcXHVEQzNEXFx1REMzRi1cXHVEQzREXFx1REM1MC1cXHVEQzVEXFx1REM4MC1cXHVEQ0ZBXFx1REQ0MC1cXHVERDc0XFx1RERGRFxcdURFODAtXFx1REU5Q1xcdURFQTAtXFx1REVEMFxcdURFRTBcXHVERjAwLVxcdURGMUZcXHVERjMwLVxcdURGNEFcXHVERjUwLVxcdURGN0FcXHVERjgwLVxcdURGOURcXHVERkEwLVxcdURGQzNcXHVERkM4LVxcdURGQ0ZcXHVERkQxLVxcdURGRDVdfFxcdUQ4MDFbXFx1REMwMC1cXHVEQzlEXFx1RENBMC1cXHVEQ0E5XFx1REQwMC1cXHVERDI3XFx1REQzMC1cXHVERDYzXFx1REUwMC1cXHVERjM2XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjY3XXxcXHVEODAyW1xcdURDMDAtXFx1REMwNVxcdURDMDhcXHVEQzBBLVxcdURDMzVcXHVEQzM3XFx1REMzOFxcdURDM0NcXHVEQzNGLVxcdURDNTVcXHVEQzYwLVxcdURDNzZcXHVEQzgwLVxcdURDOUVcXHVEQ0UwLVxcdURDRjJcXHVEQ0Y0XFx1RENGNVxcdUREMDAtXFx1REQxNVxcdUREMjAtXFx1REQzOVxcdUREODAtXFx1RERCN1xcdUREQkVcXHVEREJGXFx1REUwMC1cXHVERTAzXFx1REUwNVxcdURFMDZcXHVERTBDLVxcdURFMTNcXHVERTE1LVxcdURFMTdcXHVERTE5LVxcdURFMzNcXHVERTM4LVxcdURFM0FcXHVERTNGXFx1REU2MC1cXHVERTdDXFx1REU4MC1cXHVERTlDXFx1REVDMC1cXHVERUM3XFx1REVDOS1cXHVERUU2XFx1REYwMC1cXHVERjM1XFx1REY0MC1cXHVERjU1XFx1REY2MC1cXHVERjcyXFx1REY4MC1cXHVERjkxXXxcXHVEODAzW1xcdURDMDAtXFx1REM0OFxcdURDODAtXFx1RENCMlxcdURDQzAtXFx1RENGMl18XFx1RDgwNFtcXHVEQzAwLVxcdURDNDZcXHVEQzY2LVxcdURDNkZcXHVEQzdGLVxcdURDQkFcXHVEQ0QwLVxcdURDRThcXHVEQ0YwLVxcdURDRjlcXHVERDAwLVxcdUREMzRcXHVERDM2LVxcdUREM0ZcXHVERDUwLVxcdURENzNcXHVERDc2XFx1REQ4MC1cXHVEREM0XFx1RERDQS1cXHVERENDXFx1REREMC1cXHVERERBXFx1REREQ1xcdURFMDAtXFx1REUxMVxcdURFMTMtXFx1REUzN1xcdURFODAtXFx1REU4NlxcdURFODhcXHVERThBLVxcdURFOERcXHVERThGLVxcdURFOURcXHVERTlGLVxcdURFQThcXHVERUIwLVxcdURFRUFcXHVERUYwLVxcdURFRjlcXHVERjAwLVxcdURGMDNcXHVERjA1LVxcdURGMENcXHVERjBGXFx1REYxMFxcdURGMTMtXFx1REYyOFxcdURGMkEtXFx1REYzMFxcdURGMzJcXHVERjMzXFx1REYzNS1cXHVERjM5XFx1REYzQy1cXHVERjQ0XFx1REY0N1xcdURGNDhcXHVERjRCLVxcdURGNERcXHVERjUwXFx1REY1N1xcdURGNUQtXFx1REY2M1xcdURGNjYtXFx1REY2Q1xcdURGNzAtXFx1REY3NF18XFx1RDgwNVtcXHVEQzgwLVxcdURDQzVcXHVEQ0M3XFx1RENEMC1cXHVEQ0Q5XFx1REQ4MC1cXHVEREI1XFx1RERCOC1cXHVEREMwXFx1REREOC1cXHVEREREXFx1REUwMC1cXHVERTQwXFx1REU0NFxcdURFNTAtXFx1REU1OVxcdURFODAtXFx1REVCN1xcdURFQzAtXFx1REVDOVxcdURGMDAtXFx1REYxOVxcdURGMUQtXFx1REYyQlxcdURGMzAtXFx1REYzOV18XFx1RDgwNltcXHVEQ0EwLVxcdURDRTlcXHVEQ0ZGXFx1REVDMC1cXHVERUY4XXxcXHVEODA4W1xcdURDMDAtXFx1REY5OV18XFx1RDgwOVtcXHVEQzAwLVxcdURDNkVcXHVEQzgwLVxcdURENDNdfFtcXHVEODBDXFx1RDg0MC1cXHVEODY4XFx1RDg2QS1cXHVEODZDXFx1RDg2Ri1cXHVEODcyXVtcXHVEQzAwLVxcdURGRkZdfFxcdUQ4MERbXFx1REMwMC1cXHVEQzJFXXxcXHVEODExW1xcdURDMDAtXFx1REU0Nl18XFx1RDgxQVtcXHVEQzAwLVxcdURFMzhcXHVERTQwLVxcdURFNUVcXHVERTYwLVxcdURFNjlcXHVERUQwLVxcdURFRURcXHVERUYwLVxcdURFRjRcXHVERjAwLVxcdURGMzZcXHVERjQwLVxcdURGNDNcXHVERjUwLVxcdURGNTlcXHVERjYzLVxcdURGNzdcXHVERjdELVxcdURGOEZdfFxcdUQ4MUJbXFx1REYwMC1cXHVERjQ0XFx1REY1MC1cXHVERjdFXFx1REY4Ri1cXHVERjlGXXxcXHVEODJDW1xcdURDMDBcXHVEQzAxXXxcXHVEODJGW1xcdURDMDAtXFx1REM2QVxcdURDNzAtXFx1REM3Q1xcdURDODAtXFx1REM4OFxcdURDOTAtXFx1REM5OVxcdURDOURcXHVEQzlFXXxcXHVEODM0W1xcdURENjUtXFx1REQ2OVxcdURENkQtXFx1REQ3MlxcdUREN0ItXFx1REQ4MlxcdUREODUtXFx1REQ4QlxcdUREQUEtXFx1RERBRFxcdURFNDItXFx1REU0NF18XFx1RDgzNVtcXHVEQzAwLVxcdURDNTRcXHVEQzU2LVxcdURDOUNcXHVEQzlFXFx1REM5RlxcdURDQTJcXHVEQ0E1XFx1RENBNlxcdURDQTktXFx1RENBQ1xcdURDQUUtXFx1RENCOVxcdURDQkJcXHVEQ0JELVxcdURDQzNcXHVEQ0M1LVxcdUREMDVcXHVERDA3LVxcdUREMEFcXHVERDBELVxcdUREMTRcXHVERDE2LVxcdUREMUNcXHVERDFFLVxcdUREMzlcXHVERDNCLVxcdUREM0VcXHVERDQwLVxcdURENDRcXHVERDQ2XFx1REQ0QS1cXHVERDUwXFx1REQ1Mi1cXHVERUE1XFx1REVBOC1cXHVERUMwXFx1REVDMi1cXHVERURBXFx1REVEQy1cXHVERUZBXFx1REVGQy1cXHVERjE0XFx1REYxNi1cXHVERjM0XFx1REYzNi1cXHVERjRFXFx1REY1MC1cXHVERjZFXFx1REY3MC1cXHVERjg4XFx1REY4QS1cXHVERkE4XFx1REZBQS1cXHVERkMyXFx1REZDNC1cXHVERkNCXFx1REZDRS1cXHVERkZGXXxcXHVEODM2W1xcdURFMDAtXFx1REUzNlxcdURFM0ItXFx1REU2Q1xcdURFNzVcXHVERTg0XFx1REU5Qi1cXHVERTlGXFx1REVBMS1cXHVERUFGXXxcXHVEODNBW1xcdURDMDAtXFx1RENDNFxcdURDRDAtXFx1RENENl18XFx1RDgzQltcXHVERTAwLVxcdURFMDNcXHVERTA1LVxcdURFMUZcXHVERTIxXFx1REUyMlxcdURFMjRcXHVERTI3XFx1REUyOS1cXHVERTMyXFx1REUzNC1cXHVERTM3XFx1REUzOVxcdURFM0JcXHVERTQyXFx1REU0N1xcdURFNDlcXHVERTRCXFx1REU0RC1cXHVERTRGXFx1REU1MVxcdURFNTJcXHVERTU0XFx1REU1N1xcdURFNTlcXHVERTVCXFx1REU1RFxcdURFNUZcXHVERTYxXFx1REU2MlxcdURFNjRcXHVERTY3LVxcdURFNkFcXHVERTZDLVxcdURFNzJcXHVERTc0LVxcdURFNzdcXHVERTc5LVxcdURFN0NcXHVERTdFXFx1REU4MC1cXHVERTg5XFx1REU4Qi1cXHVERTlCXFx1REVBMS1cXHVERUEzXFx1REVBNS1cXHVERUE5XFx1REVBQi1cXHVERUJCXXxcXHVEODY5W1xcdURDMDAtXFx1REVENlxcdURGMDAtXFx1REZGRl18XFx1RDg2RFtcXHVEQzAwLVxcdURGMzRcXHVERjQwLVxcdURGRkZdfFxcdUQ4NkVbXFx1REMwMC1cXHVEQzFEXFx1REMyMC1cXHVERkZGXXxcXHVEODczW1xcdURDMDAtXFx1REVBMV18XFx1RDg3RVtcXHVEQzAwLVxcdURFMURdfFxcdURCNDBbXFx1REQwMC1cXHVEREVGXS9cblx0fTtcblx0ZXhwb3J0cy5DaGFyYWN0ZXIgPSB7XG5cdCAgICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1iaXR3aXNlICovXG5cdCAgICBmcm9tQ29kZVBvaW50OiBmdW5jdGlvbiAoY3ApIHtcblx0ICAgICAgICByZXR1cm4gKGNwIDwgMHgxMDAwMCkgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKSA6XG5cdCAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoMHhEODAwICsgKChjcCAtIDB4MTAwMDApID4+IDEwKSkgK1xuXHQgICAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSgweERDMDAgKyAoKGNwIC0gMHgxMDAwMCkgJiAxMDIzKSk7XG5cdCAgICB9LFxuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtd2hpdGUtc3BhY2Vcblx0ICAgIGlzV2hpdGVTcGFjZTogZnVuY3Rpb24gKGNwKSB7XG5cdCAgICAgICAgcmV0dXJuIChjcCA9PT0gMHgyMCkgfHwgKGNwID09PSAweDA5KSB8fCAoY3AgPT09IDB4MEIpIHx8IChjcCA9PT0gMHgwQykgfHwgKGNwID09PSAweEEwKSB8fFxuXHQgICAgICAgICAgICAoY3AgPj0gMHgxNjgwICYmIFsweDE2ODAsIDB4MjAwMCwgMHgyMDAxLCAweDIwMDIsIDB4MjAwMywgMHgyMDA0LCAweDIwMDUsIDB4MjAwNiwgMHgyMDA3LCAweDIwMDgsIDB4MjAwOSwgMHgyMDBBLCAweDIwMkYsIDB4MjA1RiwgMHgzMDAwLCAweEZFRkZdLmluZGV4T2YoY3ApID49IDApO1xuXHQgICAgfSxcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxpbmUtdGVybWluYXRvcnNcblx0ICAgIGlzTGluZVRlcm1pbmF0b3I6IGZ1bmN0aW9uIChjcCkge1xuXHQgICAgICAgIHJldHVybiAoY3AgPT09IDB4MEEpIHx8IChjcCA9PT0gMHgwRCkgfHwgKGNwID09PSAweDIwMjgpIHx8IChjcCA9PT0gMHgyMDI5KTtcblx0ICAgIH0sXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1uYW1lcy1hbmQta2V5d29yZHNcblx0ICAgIGlzSWRlbnRpZmllclN0YXJ0OiBmdW5jdGlvbiAoY3ApIHtcblx0ICAgICAgICByZXR1cm4gKGNwID09PSAweDI0KSB8fCAoY3AgPT09IDB4NUYpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDQxICYmIGNwIDw9IDB4NUEpIHx8XG5cdCAgICAgICAgICAgIChjcCA+PSAweDYxICYmIGNwIDw9IDB4N0EpIHx8XG5cdCAgICAgICAgICAgIChjcCA9PT0gMHg1QykgfHxcblx0ICAgICAgICAgICAgKChjcCA+PSAweDgwKSAmJiBSZWdleC5Ob25Bc2NpaUlkZW50aWZpZXJTdGFydC50ZXN0KGV4cG9ydHMuQ2hhcmFjdGVyLmZyb21Db2RlUG9pbnQoY3ApKSk7XG5cdCAgICB9LFxuXHQgICAgaXNJZGVudGlmaWVyUGFydDogZnVuY3Rpb24gKGNwKSB7XG5cdCAgICAgICAgcmV0dXJuIChjcCA9PT0gMHgyNCkgfHwgKGNwID09PSAweDVGKSB8fFxuXHQgICAgICAgICAgICAoY3AgPj0gMHg0MSAmJiBjcCA8PSAweDVBKSB8fFxuXHQgICAgICAgICAgICAoY3AgPj0gMHg2MSAmJiBjcCA8PSAweDdBKSB8fFxuXHQgICAgICAgICAgICAoY3AgPj0gMHgzMCAmJiBjcCA8PSAweDM5KSB8fFxuXHQgICAgICAgICAgICAoY3AgPT09IDB4NUMpIHx8XG5cdCAgICAgICAgICAgICgoY3AgPj0gMHg4MCkgJiYgUmVnZXguTm9uQXNjaWlJZGVudGlmaWVyUGFydC50ZXN0KGV4cG9ydHMuQ2hhcmFjdGVyLmZyb21Db2RlUG9pbnQoY3ApKSk7XG5cdCAgICB9LFxuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbGl0ZXJhbHMtbnVtZXJpYy1saXRlcmFsc1xuXHQgICAgaXNEZWNpbWFsRGlnaXQ6IGZ1bmN0aW9uIChjcCkge1xuXHQgICAgICAgIHJldHVybiAoY3AgPj0gMHgzMCAmJiBjcCA8PSAweDM5KTsgLy8gMC4uOVxuXHQgICAgfSxcblx0ICAgIGlzSGV4RGlnaXQ6IGZ1bmN0aW9uIChjcCkge1xuXHQgICAgICAgIHJldHVybiAoY3AgPj0gMHgzMCAmJiBjcCA8PSAweDM5KSB8fFxuXHQgICAgICAgICAgICAoY3AgPj0gMHg0MSAmJiBjcCA8PSAweDQ2KSB8fFxuXHQgICAgICAgICAgICAoY3AgPj0gMHg2MSAmJiBjcCA8PSAweDY2KTsgLy8gYS4uZlxuXHQgICAgfSxcblx0ICAgIGlzT2N0YWxEaWdpdDogZnVuY3Rpb24gKGNwKSB7XG5cdCAgICAgICAgcmV0dXJuIChjcCA+PSAweDMwICYmIGNwIDw9IDB4MzcpOyAvLyAwLi43XG5cdCAgICB9XG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdHZhciBqc3hfc3ludGF4XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuXHQvKiB0c2xpbnQ6ZGlzYWJsZTptYXgtY2xhc3Nlcy1wZXItZmlsZSAqL1xuXHR2YXIgSlNYQ2xvc2luZ0VsZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYQ2xvc2luZ0VsZW1lbnQobmFtZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYQ2xvc2luZ0VsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hDbG9zaW5nRWxlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hDbG9zaW5nRWxlbWVudCA9IEpTWENsb3NpbmdFbGVtZW50O1xuXHR2YXIgSlNYRWxlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hFbGVtZW50KG9wZW5pbmdFbGVtZW50LCBjaGlsZHJlbiwgY2xvc2luZ0VsZW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWEVsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5vcGVuaW5nRWxlbWVudCA9IG9wZW5pbmdFbGVtZW50O1xuXHQgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcblx0ICAgICAgICB0aGlzLmNsb3NpbmdFbGVtZW50ID0gY2xvc2luZ0VsZW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYRWxlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hFbGVtZW50ID0gSlNYRWxlbWVudDtcblx0dmFyIEpTWEVtcHR5RXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hFbXB0eUV4cHJlc3Npb24oKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hFbXB0eUV4cHJlc3Npb247XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYRW1wdHlFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWEVtcHR5RXhwcmVzc2lvbiA9IEpTWEVtcHR5RXhwcmVzc2lvbjtcblx0dmFyIEpTWEV4cHJlc3Npb25Db250YWluZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYRXhwcmVzc2lvbkNvbnRhaW5lcihleHByZXNzaW9uKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hFeHByZXNzaW9uQ29udGFpbmVyO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYRXhwcmVzc2lvbkNvbnRhaW5lcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hFeHByZXNzaW9uQ29udGFpbmVyID0gSlNYRXhwcmVzc2lvbkNvbnRhaW5lcjtcblx0dmFyIEpTWElkZW50aWZpZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYSWRlbnRpZmllcihuYW1lKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hJZGVudGlmaWVyO1xuXHQgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYSWRlbnRpZmllcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hJZGVudGlmaWVyID0gSlNYSWRlbnRpZmllcjtcblx0dmFyIEpTWE1lbWJlckV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYTWVtYmVyRXhwcmVzc2lvbihvYmplY3QsIHByb3BlcnR5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hNZW1iZXJFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXHQgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBKU1hNZW1iZXJFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWE1lbWJlckV4cHJlc3Npb24gPSBKU1hNZW1iZXJFeHByZXNzaW9uO1xuXHR2YXIgSlNYQXR0cmlidXRlID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEpTWEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYQXR0cmlidXRlO1xuXHQgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEpTWEF0dHJpYnV0ZTtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hBdHRyaWJ1dGUgPSBKU1hBdHRyaWJ1dGU7XG5cdHZhciBKU1hOYW1lc3BhY2VkTmFtZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBKU1hOYW1lc3BhY2VkTmFtZShuYW1lc3BhY2UsIG5hbWUpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBqc3hfc3ludGF4XzEuSlNYU3ludGF4LkpTWE5hbWVzcGFjZWROYW1lO1xuXHQgICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXHQgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYTmFtZXNwYWNlZE5hbWU7XG5cdH0oKSk7XG5cdGV4cG9ydHMuSlNYTmFtZXNwYWNlZE5hbWUgPSBKU1hOYW1lc3BhY2VkTmFtZTtcblx0dmFyIEpTWE9wZW5pbmdFbGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEpTWE9wZW5pbmdFbGVtZW50KG5hbWUsIHNlbGZDbG9zaW5nLCBhdHRyaWJ1dGVzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hPcGVuaW5nRWxlbWVudDtcblx0ICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHQgICAgICAgIHRoaXMuc2VsZkNsb3NpbmcgPSBzZWxmQ2xvc2luZztcblx0ICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEpTWE9wZW5pbmdFbGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkpTWE9wZW5pbmdFbGVtZW50ID0gSlNYT3BlbmluZ0VsZW1lbnQ7XG5cdHZhciBKU1hTcHJlYWRBdHRyaWJ1dGUgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSlNYU3ByZWFkQXR0cmlidXRlKGFyZ3VtZW50KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0ganN4X3N5bnRheF8xLkpTWFN5bnRheC5KU1hTcHJlYWRBdHRyaWJ1dGU7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEpTWFNwcmVhZEF0dHJpYnV0ZTtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hTcHJlYWRBdHRyaWJ1dGUgPSBKU1hTcHJlYWRBdHRyaWJ1dGU7XG5cdHZhciBKU1hUZXh0ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEpTWFRleHQodmFsdWUsIHJhdykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IGpzeF9zeW50YXhfMS5KU1hTeW50YXguSlNYVGV4dDtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgICAgdGhpcy5yYXcgPSByYXc7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSlNYVGV4dDtcblx0fSgpKTtcblx0ZXhwb3J0cy5KU1hUZXh0ID0gSlNYVGV4dDtcblxuXG4vKioqLyB9LFxuLyogNiAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0ZXhwb3J0cy5KU1hTeW50YXggPSB7XG5cdCAgICBKU1hBdHRyaWJ1dGU6ICdKU1hBdHRyaWJ1dGUnLFxuXHQgICAgSlNYQ2xvc2luZ0VsZW1lbnQ6ICdKU1hDbG9zaW5nRWxlbWVudCcsXG5cdCAgICBKU1hFbGVtZW50OiAnSlNYRWxlbWVudCcsXG5cdCAgICBKU1hFbXB0eUV4cHJlc3Npb246ICdKU1hFbXB0eUV4cHJlc3Npb24nLFxuXHQgICAgSlNYRXhwcmVzc2lvbkNvbnRhaW5lcjogJ0pTWEV4cHJlc3Npb25Db250YWluZXInLFxuXHQgICAgSlNYSWRlbnRpZmllcjogJ0pTWElkZW50aWZpZXInLFxuXHQgICAgSlNYTWVtYmVyRXhwcmVzc2lvbjogJ0pTWE1lbWJlckV4cHJlc3Npb24nLFxuXHQgICAgSlNYTmFtZXNwYWNlZE5hbWU6ICdKU1hOYW1lc3BhY2VkTmFtZScsXG5cdCAgICBKU1hPcGVuaW5nRWxlbWVudDogJ0pTWE9wZW5pbmdFbGVtZW50Jyxcblx0ICAgIEpTWFNwcmVhZEF0dHJpYnV0ZTogJ0pTWFNwcmVhZEF0dHJpYnV0ZScsXG5cdCAgICBKU1hUZXh0OiAnSlNYVGV4dCdcblx0fTtcblxuXG4vKioqLyB9LFxuLyogNyAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIHN5bnRheF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0LyogdHNsaW50OmRpc2FibGU6bWF4LWNsYXNzZXMtcGVyLWZpbGUgKi9cblx0dmFyIEFycmF5RXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBBcnJheUV4cHJlc3Npb24oZWxlbWVudHMpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQXJyYXlFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50cztcblx0ICAgIH1cblx0ICAgIHJldHVybiBBcnJheUV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQXJyYXlFeHByZXNzaW9uID0gQXJyYXlFeHByZXNzaW9uO1xuXHR2YXIgQXJyYXlQYXR0ZXJuID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFycmF5UGF0dGVybihlbGVtZW50cykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5BcnJheVBhdHRlcm47XG5cdCAgICAgICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFycmF5UGF0dGVybjtcblx0fSgpKTtcblx0ZXhwb3J0cy5BcnJheVBhdHRlcm4gPSBBcnJheVBhdHRlcm47XG5cdHZhciBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbihwYXJhbXMsIGJvZHksIGV4cHJlc3Npb24pIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQXJyb3dGdW5jdGlvbkV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5pZCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5hc3luYyA9IGZhbHNlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFycm93RnVuY3Rpb25FeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkFycm93RnVuY3Rpb25FeHByZXNzaW9uID0gQXJyb3dGdW5jdGlvbkV4cHJlc3Npb247XG5cdHZhciBBc3NpZ25tZW50RXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBBc3NpZ25tZW50RXhwcmVzc2lvbihvcGVyYXRvciwgbGVmdCwgcmlnaHQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudEV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuXHQgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7XG5cdCAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEFzc2lnbm1lbnRFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkFzc2lnbm1lbnRFeHByZXNzaW9uID0gQXNzaWdubWVudEV4cHJlc3Npb247XG5cdHZhciBBc3NpZ25tZW50UGF0dGVybiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBBc3NpZ25tZW50UGF0dGVybihsZWZ0LCByaWdodCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Bc3NpZ25tZW50UGF0dGVybjtcblx0ICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuXHQgICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBBc3NpZ25tZW50UGF0dGVybjtcblx0fSgpKTtcblx0ZXhwb3J0cy5Bc3NpZ25tZW50UGF0dGVybiA9IEFzc2lnbm1lbnRQYXR0ZXJuO1xuXHR2YXIgQXN5bmNBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBBc3luY0Fycm93RnVuY3Rpb25FeHByZXNzaW9uKHBhcmFtcywgYm9keSwgZXhwcmVzc2lvbikge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5BcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmlkID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMuZ2VuZXJhdG9yID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmFzeW5jID0gdHJ1ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBBc3luY0Fycm93RnVuY3Rpb25FeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkFzeW5jQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gPSBBc3luY0Fycm93RnVuY3Rpb25FeHByZXNzaW9uO1xuXHR2YXIgQXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEFzeW5jRnVuY3Rpb25EZWNsYXJhdGlvbihpZCwgcGFyYW1zLCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkZ1bmN0aW9uRGVjbGFyYXRpb247XG5cdCAgICAgICAgdGhpcy5pZCA9IGlkO1xuXHQgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmFzeW5jID0gdHJ1ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBBc3luY0Z1bmN0aW9uRGVjbGFyYXRpb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uID0gQXN5bmNGdW5jdGlvbkRlY2xhcmF0aW9uO1xuXHR2YXIgQXN5bmNGdW5jdGlvbkV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQXN5bmNGdW5jdGlvbkV4cHJlc3Npb24oaWQsIHBhcmFtcywgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5GdW5jdGlvbkV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5pZCA9IGlkO1xuXHQgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICAgICAgdGhpcy5nZW5lcmF0b3IgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmFzeW5jID0gdHJ1ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBBc3luY0Z1bmN0aW9uRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5Bc3luY0Z1bmN0aW9uRXhwcmVzc2lvbiA9IEFzeW5jRnVuY3Rpb25FeHByZXNzaW9uO1xuXHR2YXIgQXdhaXRFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEF3YWl0RXhwcmVzc2lvbihhcmd1bWVudCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Bd2FpdEV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEF3YWl0RXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5Bd2FpdEV4cHJlc3Npb24gPSBBd2FpdEV4cHJlc3Npb247XG5cdHZhciBCaW5hcnlFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEJpbmFyeUV4cHJlc3Npb24ob3BlcmF0b3IsIGxlZnQsIHJpZ2h0KSB7XG5cdCAgICAgICAgdmFyIGxvZ2ljYWwgPSAob3BlcmF0b3IgPT09ICd8fCcgfHwgb3BlcmF0b3IgPT09ICcmJicpO1xuXHQgICAgICAgIHRoaXMudHlwZSA9IGxvZ2ljYWwgPyBzeW50YXhfMS5TeW50YXguTG9naWNhbEV4cHJlc3Npb24gOiBzeW50YXhfMS5TeW50YXguQmluYXJ5RXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG5cdCAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdDtcblx0ICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQmluYXJ5RXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5CaW5hcnlFeHByZXNzaW9uID0gQmluYXJ5RXhwcmVzc2lvbjtcblx0dmFyIEJsb2NrU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEJsb2NrU3RhdGVtZW50KGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQmxvY2tTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBCbG9ja1N0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5CbG9ja1N0YXRlbWVudCA9IEJsb2NrU3RhdGVtZW50O1xuXHR2YXIgQnJlYWtTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQnJlYWtTdGF0ZW1lbnQobGFiZWwpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQnJlYWtTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEJyZWFrU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkJyZWFrU3RhdGVtZW50ID0gQnJlYWtTdGF0ZW1lbnQ7XG5cdHZhciBDYWxsRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDYWxsRXhwcmVzc2lvbihjYWxsZWUsIGFyZ3MpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQ2FsbEV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5jYWxsZWUgPSBjYWxsZWU7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmdzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIENhbGxFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkNhbGxFeHByZXNzaW9uID0gQ2FsbEV4cHJlc3Npb247XG5cdHZhciBDYXRjaENsYXVzZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDYXRjaENsYXVzZShwYXJhbSwgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5DYXRjaENsYXVzZTtcblx0ICAgICAgICB0aGlzLnBhcmFtID0gcGFyYW07XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBDYXRjaENsYXVzZTtcblx0fSgpKTtcblx0ZXhwb3J0cy5DYXRjaENsYXVzZSA9IENhdGNoQ2xhdXNlO1xuXHR2YXIgQ2xhc3NCb2R5ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENsYXNzQm9keShib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkNsYXNzQm9keTtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIENsYXNzQm9keTtcblx0fSgpKTtcblx0ZXhwb3J0cy5DbGFzc0JvZHkgPSBDbGFzc0JvZHk7XG5cdHZhciBDbGFzc0RlY2xhcmF0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENsYXNzRGVjbGFyYXRpb24oaWQsIHN1cGVyQ2xhc3MsIGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguQ2xhc3NEZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5zdXBlckNsYXNzID0gc3VwZXJDbGFzcztcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIENsYXNzRGVjbGFyYXRpb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuQ2xhc3NEZWNsYXJhdGlvbiA9IENsYXNzRGVjbGFyYXRpb247XG5cdHZhciBDbGFzc0V4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQ2xhc3NFeHByZXNzaW9uKGlkLCBzdXBlckNsYXNzLCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkNsYXNzRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5zdXBlckNsYXNzID0gc3VwZXJDbGFzcztcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIENsYXNzRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5DbGFzc0V4cHJlc3Npb24gPSBDbGFzc0V4cHJlc3Npb247XG5cdHZhciBDb21wdXRlZE1lbWJlckV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uKG9iamVjdCwgcHJvcGVydHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguTWVtYmVyRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmNvbXB1dGVkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0ICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQ29tcHV0ZWRNZW1iZXJFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkNvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbiA9IENvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbjtcblx0dmFyIENvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDb25kaXRpb25hbEV4cHJlc3Npb24odGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkNvbmRpdGlvbmFsRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0O1xuXHQgICAgICAgIHRoaXMuY29uc2VxdWVudCA9IGNvbnNlcXVlbnQ7XG5cdCAgICAgICAgdGhpcy5hbHRlcm5hdGUgPSBhbHRlcm5hdGU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gQ29uZGl0aW9uYWxFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkNvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IENvbmRpdGlvbmFsRXhwcmVzc2lvbjtcblx0dmFyIENvbnRpbnVlU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIENvbnRpbnVlU3RhdGVtZW50KGxhYmVsKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkNvbnRpbnVlU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBDb250aW51ZVN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5Db250aW51ZVN0YXRlbWVudCA9IENvbnRpbnVlU3RhdGVtZW50O1xuXHR2YXIgRGVidWdnZXJTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRGVidWdnZXJTdGF0ZW1lbnQoKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkRlYnVnZ2VyU3RhdGVtZW50O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIERlYnVnZ2VyU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkRlYnVnZ2VyU3RhdGVtZW50ID0gRGVidWdnZXJTdGF0ZW1lbnQ7XG5cdHZhciBEaXJlY3RpdmUgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRGlyZWN0aXZlKGV4cHJlc3Npb24sIGRpcmVjdGl2ZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FeHByZXNzaW9uU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5kaXJlY3RpdmUgPSBkaXJlY3RpdmU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRGlyZWN0aXZlO1xuXHR9KCkpO1xuXHRleHBvcnRzLkRpcmVjdGl2ZSA9IERpcmVjdGl2ZTtcblx0dmFyIERvV2hpbGVTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRG9XaGlsZVN0YXRlbWVudChib2R5LCB0ZXN0KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkRvV2hpbGVTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIERvV2hpbGVTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRG9XaGlsZVN0YXRlbWVudCA9IERvV2hpbGVTdGF0ZW1lbnQ7XG5cdHZhciBFbXB0eVN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBFbXB0eVN0YXRlbWVudCgpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRW1wdHlTdGF0ZW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRW1wdHlTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRW1wdHlTdGF0ZW1lbnQgPSBFbXB0eVN0YXRlbWVudDtcblx0dmFyIEV4cG9ydEFsbERlY2xhcmF0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEV4cG9ydEFsbERlY2xhcmF0aW9uKHNvdXJjZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FeHBvcnRBbGxEZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBFeHBvcnRBbGxEZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5FeHBvcnRBbGxEZWNsYXJhdGlvbiA9IEV4cG9ydEFsbERlY2xhcmF0aW9uO1xuXHR2YXIgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihkZWNsYXJhdGlvbikge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb247XG5cdCAgICAgICAgdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5FeHBvcnREZWZhdWx0RGVjbGFyYXRpb24gPSBFeHBvcnREZWZhdWx0RGVjbGFyYXRpb247XG5cdHZhciBFeHBvcnROYW1lZERlY2xhcmF0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEV4cG9ydE5hbWVkRGVjbGFyYXRpb24oZGVjbGFyYXRpb24sIHNwZWNpZmllcnMsIHNvdXJjZSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FeHBvcnROYW1lZERlY2xhcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLnNwZWNpZmllcnMgPSBzcGVjaWZpZXJzO1xuXHQgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEV4cG9ydE5hbWVkRGVjbGFyYXRpb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuRXhwb3J0TmFtZWREZWNsYXJhdGlvbiA9IEV4cG9ydE5hbWVkRGVjbGFyYXRpb247XG5cdHZhciBFeHBvcnRTcGVjaWZpZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRXhwb3J0U3BlY2lmaWVyKGxvY2FsLCBleHBvcnRlZCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5FeHBvcnRTcGVjaWZpZXI7XG5cdCAgICAgICAgdGhpcy5leHBvcnRlZCA9IGV4cG9ydGVkO1xuXHQgICAgICAgIHRoaXMubG9jYWwgPSBsb2NhbDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBFeHBvcnRTcGVjaWZpZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRXhwb3J0U3BlY2lmaWVyID0gRXhwb3J0U3BlY2lmaWVyO1xuXHR2YXIgRXhwcmVzc2lvblN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBFeHByZXNzaW9uU3RhdGVtZW50KGV4cHJlc3Npb24pIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRXhwcmVzc2lvblN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEV4cHJlc3Npb25TdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuRXhwcmVzc2lvblN0YXRlbWVudCA9IEV4cHJlc3Npb25TdGF0ZW1lbnQ7XG5cdHZhciBGb3JJblN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBGb3JJblN0YXRlbWVudChsZWZ0LCByaWdodCwgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Gb3JJblN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuXHQgICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMuZWFjaCA9IGZhbHNlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEZvckluU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkZvckluU3RhdGVtZW50ID0gRm9ySW5TdGF0ZW1lbnQ7XG5cdHZhciBGb3JPZlN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBGb3JPZlN0YXRlbWVudChsZWZ0LCByaWdodCwgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Gb3JPZlN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuXHQgICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEZvck9mU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkZvck9mU3RhdGVtZW50ID0gRm9yT2ZTdGF0ZW1lbnQ7XG5cdHZhciBGb3JTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRm9yU3RhdGVtZW50KGluaXQsIHRlc3QsIHVwZGF0ZSwgYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Gb3JTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5pbml0ID0gaW5pdDtcblx0ICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0O1xuXHQgICAgICAgIHRoaXMudXBkYXRlID0gdXBkYXRlO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRm9yU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLkZvclN0YXRlbWVudCA9IEZvclN0YXRlbWVudDtcblx0dmFyIEZ1bmN0aW9uRGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRnVuY3Rpb25EZWNsYXJhdGlvbihpZCwgcGFyYW1zLCBib2R5LCBnZW5lcmF0b3IpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguRnVuY3Rpb25EZWNsYXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvcjtcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmFzeW5jID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRnVuY3Rpb25EZWNsYXJhdGlvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5GdW5jdGlvbkRlY2xhcmF0aW9uID0gRnVuY3Rpb25EZWNsYXJhdGlvbjtcblx0dmFyIEZ1bmN0aW9uRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBGdW5jdGlvbkV4cHJlc3Npb24oaWQsIHBhcmFtcywgYm9keSwgZ2VuZXJhdG9yKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkZ1bmN0aW9uRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLmlkID0gaWQ7XG5cdCAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvcjtcblx0ICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmFzeW5jID0gZmFsc2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gRnVuY3Rpb25FeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLkZ1bmN0aW9uRXhwcmVzc2lvbiA9IEZ1bmN0aW9uRXhwcmVzc2lvbjtcblx0dmFyIElkZW50aWZpZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSWRlbnRpZmllcihuYW1lKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXI7XG5cdCAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBJZGVudGlmaWVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLklkZW50aWZpZXIgPSBJZGVudGlmaWVyO1xuXHR2YXIgSWZTdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSWZTdGF0ZW1lbnQodGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LklmU3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7XG5cdCAgICAgICAgdGhpcy5jb25zZXF1ZW50ID0gY29uc2VxdWVudDtcblx0ICAgICAgICB0aGlzLmFsdGVybmF0ZSA9IGFsdGVybmF0ZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBJZlN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5JZlN0YXRlbWVudCA9IElmU3RhdGVtZW50O1xuXHR2YXIgSW1wb3J0RGVjbGFyYXRpb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSW1wb3J0RGVjbGFyYXRpb24oc3BlY2lmaWVycywgc291cmNlKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkltcG9ydERlY2xhcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuc3BlY2lmaWVycyA9IHNwZWNpZmllcnM7XG5cdCAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gSW1wb3J0RGVjbGFyYXRpb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuSW1wb3J0RGVjbGFyYXRpb24gPSBJbXBvcnREZWNsYXJhdGlvbjtcblx0dmFyIEltcG9ydERlZmF1bHRTcGVjaWZpZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSW1wb3J0RGVmYXVsdFNwZWNpZmllcihsb2NhbCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5JbXBvcnREZWZhdWx0U3BlY2lmaWVyO1xuXHQgICAgICAgIHRoaXMubG9jYWwgPSBsb2NhbDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBJbXBvcnREZWZhdWx0U3BlY2lmaWVyO1xuXHR9KCkpO1xuXHRleHBvcnRzLkltcG9ydERlZmF1bHRTcGVjaWZpZXIgPSBJbXBvcnREZWZhdWx0U3BlY2lmaWVyO1xuXHR2YXIgSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcihsb2NhbCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXI7XG5cdCAgICAgICAgdGhpcy5sb2NhbCA9IGxvY2FsO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5JbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIgPSBJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXI7XG5cdHZhciBJbXBvcnRTcGVjaWZpZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gSW1wb3J0U3BlY2lmaWVyKGxvY2FsLCBpbXBvcnRlZCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5JbXBvcnRTcGVjaWZpZXI7XG5cdCAgICAgICAgdGhpcy5sb2NhbCA9IGxvY2FsO1xuXHQgICAgICAgIHRoaXMuaW1wb3J0ZWQgPSBpbXBvcnRlZDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBJbXBvcnRTcGVjaWZpZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuSW1wb3J0U3BlY2lmaWVyID0gSW1wb3J0U3BlY2lmaWVyO1xuXHR2YXIgTGFiZWxlZFN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBMYWJlbGVkU3RhdGVtZW50KGxhYmVsLCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkxhYmVsZWRTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gTGFiZWxlZFN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5MYWJlbGVkU3RhdGVtZW50ID0gTGFiZWxlZFN0YXRlbWVudDtcblx0dmFyIExpdGVyYWwgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gTGl0ZXJhbCh2YWx1ZSwgcmF3KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LkxpdGVyYWw7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgICAgICAgIHRoaXMucmF3ID0gcmF3O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIExpdGVyYWw7XG5cdH0oKSk7XG5cdGV4cG9ydHMuTGl0ZXJhbCA9IExpdGVyYWw7XG5cdHZhciBNZXRhUHJvcGVydHkgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gTWV0YVByb3BlcnR5KG1ldGEsIHByb3BlcnR5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4Lk1ldGFQcm9wZXJ0eTtcblx0ICAgICAgICB0aGlzLm1ldGEgPSBtZXRhO1xuXHQgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBNZXRhUHJvcGVydHk7XG5cdH0oKSk7XG5cdGV4cG9ydHMuTWV0YVByb3BlcnR5ID0gTWV0YVByb3BlcnR5O1xuXHR2YXIgTWV0aG9kRGVmaW5pdGlvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBNZXRob2REZWZpbml0aW9uKGtleSwgY29tcHV0ZWQsIHZhbHVlLCBraW5kLCBpc1N0YXRpYykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5NZXRob2REZWZpbml0aW9uO1xuXHQgICAgICAgIHRoaXMua2V5ID0ga2V5O1xuXHQgICAgICAgIHRoaXMuY29tcHV0ZWQgPSBjb21wdXRlZDtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgICAgdGhpcy5raW5kID0ga2luZDtcblx0ICAgICAgICB0aGlzLnN0YXRpYyA9IGlzU3RhdGljO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIE1ldGhvZERlZmluaXRpb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuTWV0aG9kRGVmaW5pdGlvbiA9IE1ldGhvZERlZmluaXRpb247XG5cdHZhciBNb2R1bGUgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gTW9kdWxlKGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguUHJvZ3JhbTtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgICAgIHRoaXMuc291cmNlVHlwZSA9ICdtb2R1bGUnO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIE1vZHVsZTtcblx0fSgpKTtcblx0ZXhwb3J0cy5Nb2R1bGUgPSBNb2R1bGU7XG5cdHZhciBOZXdFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIE5ld0V4cHJlc3Npb24oY2FsbGVlLCBhcmdzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4Lk5ld0V4cHJlc3Npb247XG5cdCAgICAgICAgdGhpcy5jYWxsZWUgPSBjYWxsZWU7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudHMgPSBhcmdzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIE5ld0V4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuTmV3RXhwcmVzc2lvbiA9IE5ld0V4cHJlc3Npb247XG5cdHZhciBPYmplY3RFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIE9iamVjdEV4cHJlc3Npb24ocHJvcGVydGllcykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5PYmplY3RFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gT2JqZWN0RXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5PYmplY3RFeHByZXNzaW9uID0gT2JqZWN0RXhwcmVzc2lvbjtcblx0dmFyIE9iamVjdFBhdHRlcm4gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gT2JqZWN0UGF0dGVybihwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4Lk9iamVjdFBhdHRlcm47XG5cdCAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcblx0ICAgIH1cblx0ICAgIHJldHVybiBPYmplY3RQYXR0ZXJuO1xuXHR9KCkpO1xuXHRleHBvcnRzLk9iamVjdFBhdHRlcm4gPSBPYmplY3RQYXR0ZXJuO1xuXHR2YXIgUHJvcGVydHkgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gUHJvcGVydHkoa2luZCwga2V5LCBjb21wdXRlZCwgdmFsdWUsIG1ldGhvZCwgc2hvcnRoYW5kKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlByb3BlcnR5O1xuXHQgICAgICAgIHRoaXMua2V5ID0ga2V5O1xuXHQgICAgICAgIHRoaXMuY29tcHV0ZWQgPSBjb21wdXRlZDtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgICAgdGhpcy5raW5kID0ga2luZDtcblx0ICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcblx0ICAgICAgICB0aGlzLnNob3J0aGFuZCA9IHNob3J0aGFuZDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBQcm9wZXJ0eTtcblx0fSgpKTtcblx0ZXhwb3J0cy5Qcm9wZXJ0eSA9IFByb3BlcnR5O1xuXHR2YXIgUmVnZXhMaXRlcmFsID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFJlZ2V4TGl0ZXJhbCh2YWx1ZSwgcmF3LCBwYXR0ZXJuLCBmbGFncykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5MaXRlcmFsO1xuXHQgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICB0aGlzLnJhdyA9IHJhdztcblx0ICAgICAgICB0aGlzLnJlZ2V4ID0geyBwYXR0ZXJuOiBwYXR0ZXJuLCBmbGFnczogZmxhZ3MgfTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBSZWdleExpdGVyYWw7XG5cdH0oKSk7XG5cdGV4cG9ydHMuUmVnZXhMaXRlcmFsID0gUmVnZXhMaXRlcmFsO1xuXHR2YXIgUmVzdEVsZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gUmVzdEVsZW1lbnQoYXJndW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguUmVzdEVsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFJlc3RFbGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLlJlc3RFbGVtZW50ID0gUmVzdEVsZW1lbnQ7XG5cdHZhciBSZXR1cm5TdGF0ZW1lbnQgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gUmV0dXJuU3RhdGVtZW50KGFyZ3VtZW50KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlJldHVyblN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gUmV0dXJuU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLlJldHVyblN0YXRlbWVudCA9IFJldHVyblN0YXRlbWVudDtcblx0dmFyIFNjcmlwdCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBTY3JpcHQoYm9keSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Qcm9ncmFtO1xuXHQgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cdCAgICAgICAgdGhpcy5zb3VyY2VUeXBlID0gJ3NjcmlwdCc7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gU2NyaXB0O1xuXHR9KCkpO1xuXHRleHBvcnRzLlNjcmlwdCA9IFNjcmlwdDtcblx0dmFyIFNlcXVlbmNlRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBTZXF1ZW5jZUV4cHJlc3Npb24oZXhwcmVzc2lvbnMpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguU2VxdWVuY2VFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuZXhwcmVzc2lvbnMgPSBleHByZXNzaW9ucztcblx0ICAgIH1cblx0ICAgIHJldHVybiBTZXF1ZW5jZUV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuU2VxdWVuY2VFeHByZXNzaW9uID0gU2VxdWVuY2VFeHByZXNzaW9uO1xuXHR2YXIgU3ByZWFkRWxlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBTcHJlYWRFbGVtZW50KGFyZ3VtZW50KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlNwcmVhZEVsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFNwcmVhZEVsZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuU3ByZWFkRWxlbWVudCA9IFNwcmVhZEVsZW1lbnQ7XG5cdHZhciBTdGF0aWNNZW1iZXJFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFN0YXRpY01lbWJlckV4cHJlc3Npb24ob2JqZWN0LCBwcm9wZXJ0eSkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5NZW1iZXJFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuY29tcHV0ZWQgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0ICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gU3RhdGljTWVtYmVyRXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5TdGF0aWNNZW1iZXJFeHByZXNzaW9uID0gU3RhdGljTWVtYmVyRXhwcmVzc2lvbjtcblx0dmFyIFN1cGVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFN1cGVyKCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5TdXBlcjtcblx0ICAgIH1cblx0ICAgIHJldHVybiBTdXBlcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5TdXBlciA9IFN1cGVyO1xuXHR2YXIgU3dpdGNoQ2FzZSA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBTd2l0Y2hDYXNlKHRlc3QsIGNvbnNlcXVlbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguU3dpdGNoQ2FzZTtcblx0ICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0O1xuXHQgICAgICAgIHRoaXMuY29uc2VxdWVudCA9IGNvbnNlcXVlbnQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gU3dpdGNoQ2FzZTtcblx0fSgpKTtcblx0ZXhwb3J0cy5Td2l0Y2hDYXNlID0gU3dpdGNoQ2FzZTtcblx0dmFyIFN3aXRjaFN0YXRlbWVudCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBTd2l0Y2hTdGF0ZW1lbnQoZGlzY3JpbWluYW50LCBjYXNlcykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5Td2l0Y2hTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5kaXNjcmltaW5hbnQgPSBkaXNjcmltaW5hbnQ7XG5cdCAgICAgICAgdGhpcy5jYXNlcyA9IGNhc2VzO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFN3aXRjaFN0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5Td2l0Y2hTdGF0ZW1lbnQgPSBTd2l0Y2hTdGF0ZW1lbnQ7XG5cdHZhciBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24gPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uKHRhZywgcXVhc2kpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMudGFnID0gdGFnO1xuXHQgICAgICAgIHRoaXMucXVhc2kgPSBxdWFzaTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uID0gVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uO1xuXHR2YXIgVGVtcGxhdGVFbGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRlbXBsYXRlRWxlbWVudCh2YWx1ZSwgdGFpbCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5UZW1wbGF0ZUVsZW1lbnQ7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgICAgICAgIHRoaXMudGFpbCA9IHRhaWw7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gVGVtcGxhdGVFbGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLlRlbXBsYXRlRWxlbWVudCA9IFRlbXBsYXRlRWxlbWVudDtcblx0dmFyIFRlbXBsYXRlTGl0ZXJhbCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBUZW1wbGF0ZUxpdGVyYWwocXVhc2lzLCBleHByZXNzaW9ucykge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5UZW1wbGF0ZUxpdGVyYWw7XG5cdCAgICAgICAgdGhpcy5xdWFzaXMgPSBxdWFzaXM7XG5cdCAgICAgICAgdGhpcy5leHByZXNzaW9ucyA9IGV4cHJlc3Npb25zO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFRlbXBsYXRlTGl0ZXJhbDtcblx0fSgpKTtcblx0ZXhwb3J0cy5UZW1wbGF0ZUxpdGVyYWwgPSBUZW1wbGF0ZUxpdGVyYWw7XG5cdHZhciBUaGlzRXhwcmVzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBUaGlzRXhwcmVzc2lvbigpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVGhpc0V4cHJlc3Npb247XG5cdCAgICB9XG5cdCAgICByZXR1cm4gVGhpc0V4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuVGhpc0V4cHJlc3Npb24gPSBUaGlzRXhwcmVzc2lvbjtcblx0dmFyIFRocm93U3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRocm93U3RhdGVtZW50KGFyZ3VtZW50KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlRocm93U3RhdGVtZW50O1xuXHQgICAgICAgIHRoaXMuYXJndW1lbnQgPSBhcmd1bWVudDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBUaHJvd1N0YXRlbWVudDtcblx0fSgpKTtcblx0ZXhwb3J0cy5UaHJvd1N0YXRlbWVudCA9IFRocm93U3RhdGVtZW50O1xuXHR2YXIgVHJ5U3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRyeVN0YXRlbWVudChibG9jaywgaGFuZGxlciwgZmluYWxpemVyKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlRyeVN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmJsb2NrID0gYmxvY2s7XG5cdCAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcblx0ICAgICAgICB0aGlzLmZpbmFsaXplciA9IGZpbmFsaXplcjtcblx0ICAgIH1cblx0ICAgIHJldHVybiBUcnlTdGF0ZW1lbnQ7XG5cdH0oKSk7XG5cdGV4cG9ydHMuVHJ5U3RhdGVtZW50ID0gVHJ5U3RhdGVtZW50O1xuXHR2YXIgVW5hcnlFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFVuYXJ5RXhwcmVzc2lvbihvcGVyYXRvciwgYXJndW1lbnQpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVW5hcnlFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcblx0ICAgICAgICB0aGlzLmFyZ3VtZW50ID0gYXJndW1lbnQ7XG5cdCAgICAgICAgdGhpcy5wcmVmaXggPSB0cnVlO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFVuYXJ5RXhwcmVzc2lvbjtcblx0fSgpKTtcblx0ZXhwb3J0cy5VbmFyeUV4cHJlc3Npb24gPSBVbmFyeUV4cHJlc3Npb247XG5cdHZhciBVcGRhdGVFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFVwZGF0ZUV4cHJlc3Npb24ob3BlcmF0b3IsIGFyZ3VtZW50LCBwcmVmaXgpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguVXBkYXRlRXhwcmVzc2lvbjtcblx0ICAgICAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG5cdCAgICAgICAgdGhpcy5hcmd1bWVudCA9IGFyZ3VtZW50O1xuXHQgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFVwZGF0ZUV4cHJlc3Npb247XG5cdH0oKSk7XG5cdGV4cG9ydHMuVXBkYXRlRXhwcmVzc2lvbiA9IFVwZGF0ZUV4cHJlc3Npb247XG5cdHZhciBWYXJpYWJsZURlY2xhcmF0aW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCBraW5kKSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LlZhcmlhYmxlRGVjbGFyYXRpb247XG5cdCAgICAgICAgdGhpcy5kZWNsYXJhdGlvbnMgPSBkZWNsYXJhdGlvbnM7XG5cdCAgICAgICAgdGhpcy5raW5kID0ga2luZDtcblx0ICAgIH1cblx0ICAgIHJldHVybiBWYXJpYWJsZURlY2xhcmF0aW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLlZhcmlhYmxlRGVjbGFyYXRpb24gPSBWYXJpYWJsZURlY2xhcmF0aW9uO1xuXHR2YXIgVmFyaWFibGVEZWNsYXJhdG9yID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFZhcmlhYmxlRGVjbGFyYXRvcihpZCwgaW5pdCkge1xuXHQgICAgICAgIHRoaXMudHlwZSA9IHN5bnRheF8xLlN5bnRheC5WYXJpYWJsZURlY2xhcmF0b3I7XG5cdCAgICAgICAgdGhpcy5pZCA9IGlkO1xuXHQgICAgICAgIHRoaXMuaW5pdCA9IGluaXQ7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gVmFyaWFibGVEZWNsYXJhdG9yO1xuXHR9KCkpO1xuXHRleHBvcnRzLlZhcmlhYmxlRGVjbGFyYXRvciA9IFZhcmlhYmxlRGVjbGFyYXRvcjtcblx0dmFyIFdoaWxlU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFdoaWxlU3RhdGVtZW50KHRlc3QsIGJvZHkpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguV2hpbGVTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy50ZXN0ID0gdGVzdDtcblx0ICAgICAgICB0aGlzLmJvZHkgPSBib2R5O1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIFdoaWxlU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLldoaWxlU3RhdGVtZW50ID0gV2hpbGVTdGF0ZW1lbnQ7XG5cdHZhciBXaXRoU3RhdGVtZW50ID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFdpdGhTdGF0ZW1lbnQob2JqZWN0LCBib2R5KSB7XG5cdCAgICAgICAgdGhpcy50eXBlID0gc3ludGF4XzEuU3ludGF4LldpdGhTdGF0ZW1lbnQ7XG5cdCAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cdCAgICAgICAgdGhpcy5ib2R5ID0gYm9keTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBXaXRoU3RhdGVtZW50O1xuXHR9KCkpO1xuXHRleHBvcnRzLldpdGhTdGF0ZW1lbnQgPSBXaXRoU3RhdGVtZW50O1xuXHR2YXIgWWllbGRFeHByZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFlpZWxkRXhwcmVzc2lvbihhcmd1bWVudCwgZGVsZWdhdGUpIHtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBzeW50YXhfMS5TeW50YXguWWllbGRFeHByZXNzaW9uO1xuXHQgICAgICAgIHRoaXMuYXJndW1lbnQgPSBhcmd1bWVudDtcblx0ICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gWWllbGRFeHByZXNzaW9uO1xuXHR9KCkpO1xuXHRleHBvcnRzLllpZWxkRXhwcmVzc2lvbiA9IFlpZWxkRXhwcmVzc2lvbjtcblxuXG4vKioqLyB9LFxuLyogOCAqL1xuLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0dmFyIGFzc2VydF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0dmFyIGVycm9yX2hhbmRsZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXHR2YXIgbWVzc2FnZXNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXHR2YXIgTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oNyk7XG5cdHZhciBzY2FubmVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcblx0dmFyIHN5bnRheF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0dmFyIHRva2VuXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblx0dmFyIEFycm93UGFyYW1ldGVyUGxhY2VIb2xkZXIgPSAnQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcic7XG5cdHZhciBQYXJzZXIgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gUGFyc2VyKGNvZGUsIG9wdGlvbnMsIGRlbGVnYXRlKSB7XG5cdCAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cblx0ICAgICAgICB0aGlzLmNvbmZpZyA9IHtcblx0ICAgICAgICAgICAgcmFuZ2U6ICh0eXBlb2Ygb3B0aW9ucy5yYW5nZSA9PT0gJ2Jvb2xlYW4nKSAmJiBvcHRpb25zLnJhbmdlLFxuXHQgICAgICAgICAgICBsb2M6ICh0eXBlb2Ygb3B0aW9ucy5sb2MgPT09ICdib29sZWFuJykgJiYgb3B0aW9ucy5sb2MsXG5cdCAgICAgICAgICAgIHNvdXJjZTogbnVsbCxcblx0ICAgICAgICAgICAgdG9rZW5zOiAodHlwZW9mIG9wdGlvbnMudG9rZW5zID09PSAnYm9vbGVhbicpICYmIG9wdGlvbnMudG9rZW5zLFxuXHQgICAgICAgICAgICBjb21tZW50OiAodHlwZW9mIG9wdGlvbnMuY29tbWVudCA9PT0gJ2Jvb2xlYW4nKSAmJiBvcHRpb25zLmNvbW1lbnQsXG5cdCAgICAgICAgICAgIHRvbGVyYW50OiAodHlwZW9mIG9wdGlvbnMudG9sZXJhbnQgPT09ICdib29sZWFuJykgJiYgb3B0aW9ucy50b2xlcmFudFxuXHQgICAgICAgIH07XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLmxvYyAmJiBvcHRpb25zLnNvdXJjZSAmJiBvcHRpb25zLnNvdXJjZSAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICB0aGlzLmNvbmZpZy5zb3VyY2UgPSBTdHJpbmcob3B0aW9ucy5zb3VyY2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7XG5cdCAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBuZXcgZXJyb3JfaGFuZGxlcl8xLkVycm9ySGFuZGxlcigpO1xuXHQgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLnRvbGVyYW50ID0gdGhpcy5jb25maWcudG9sZXJhbnQ7XG5cdCAgICAgICAgdGhpcy5zY2FubmVyID0gbmV3IHNjYW5uZXJfMS5TY2FubmVyKGNvZGUsIHRoaXMuZXJyb3JIYW5kbGVyKTtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIudHJhY2tDb21tZW50ID0gdGhpcy5jb25maWcuY29tbWVudDtcblx0ICAgICAgICB0aGlzLm9wZXJhdG9yUHJlY2VkZW5jZSA9IHtcblx0ICAgICAgICAgICAgJyknOiAwLFxuXHQgICAgICAgICAgICAnOyc6IDAsXG5cdCAgICAgICAgICAgICcsJzogMCxcblx0ICAgICAgICAgICAgJz0nOiAwLFxuXHQgICAgICAgICAgICAnXSc6IDAsXG5cdCAgICAgICAgICAgICd8fCc6IDEsXG5cdCAgICAgICAgICAgICcmJic6IDIsXG5cdCAgICAgICAgICAgICd8JzogMyxcblx0ICAgICAgICAgICAgJ14nOiA0LFxuXHQgICAgICAgICAgICAnJic6IDUsXG5cdCAgICAgICAgICAgICc9PSc6IDYsXG5cdCAgICAgICAgICAgICchPSc6IDYsXG5cdCAgICAgICAgICAgICc9PT0nOiA2LFxuXHQgICAgICAgICAgICAnIT09JzogNixcblx0ICAgICAgICAgICAgJzwnOiA3LFxuXHQgICAgICAgICAgICAnPic6IDcsXG5cdCAgICAgICAgICAgICc8PSc6IDcsXG5cdCAgICAgICAgICAgICc+PSc6IDcsXG5cdCAgICAgICAgICAgICc8PCc6IDgsXG5cdCAgICAgICAgICAgICc+Pic6IDgsXG5cdCAgICAgICAgICAgICc+Pj4nOiA4LFxuXHQgICAgICAgICAgICAnKyc6IDksXG5cdCAgICAgICAgICAgICctJzogOSxcblx0ICAgICAgICAgICAgJyonOiAxMSxcblx0ICAgICAgICAgICAgJy8nOiAxMSxcblx0ICAgICAgICAgICAgJyUnOiAxMVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgdGhpcy5sb29rYWhlYWQgPSB7XG5cdCAgICAgICAgICAgIHR5cGU6IDIgLyogRU9GICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogJycsXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IDAsXG5cdCAgICAgICAgICAgIHN0YXJ0OiAwLFxuXHQgICAgICAgICAgICBlbmQ6IDBcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMuaGFzTGluZVRlcm1pbmF0b3IgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQgPSB7XG5cdCAgICAgICAgICAgIGlzTW9kdWxlOiBmYWxzZSxcblx0ICAgICAgICAgICAgYXdhaXQ6IGZhbHNlLFxuXHQgICAgICAgICAgICBhbGxvd0luOiB0cnVlLFxuXHQgICAgICAgICAgICBhbGxvd1N0cmljdERpcmVjdGl2ZTogdHJ1ZSxcblx0ICAgICAgICAgICAgYWxsb3dZaWVsZDogdHJ1ZSxcblx0ICAgICAgICAgICAgZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yOiBudWxsLFxuXHQgICAgICAgICAgICBpc0Fzc2lnbm1lbnRUYXJnZXQ6IGZhbHNlLFxuXHQgICAgICAgICAgICBpc0JpbmRpbmdFbGVtZW50OiBmYWxzZSxcblx0ICAgICAgICAgICAgaW5GdW5jdGlvbkJvZHk6IGZhbHNlLFxuXHQgICAgICAgICAgICBpbkl0ZXJhdGlvbjogZmFsc2UsXG5cdCAgICAgICAgICAgIGluU3dpdGNoOiBmYWxzZSxcblx0ICAgICAgICAgICAgbGFiZWxTZXQ6IHt9LFxuXHQgICAgICAgICAgICBzdHJpY3Q6IGZhbHNlXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLnRva2VucyA9IFtdO1xuXHQgICAgICAgIHRoaXMuc3RhcnRNYXJrZXIgPSB7XG5cdCAgICAgICAgICAgIGluZGV4OiAwLFxuXHQgICAgICAgICAgICBsaW5lOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgY29sdW1uOiAwXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIgPSB7XG5cdCAgICAgICAgICAgIGluZGV4OiAwLFxuXHQgICAgICAgICAgICBsaW5lOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgY29sdW1uOiAwXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIHRoaXMubGFzdE1hcmtlciA9IHtcblx0ICAgICAgICAgICAgaW5kZXg6IHRoaXMuc2Nhbm5lci5pbmRleCxcblx0ICAgICAgICAgICAgbGluZTogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydFxuXHQgICAgICAgIH07XG5cdCAgICB9XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnRocm93RXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZUZvcm1hdCkge1xuXHQgICAgICAgIHZhciB2YWx1ZXMgPSBbXTtcblx0ICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuXHQgICAgICAgICAgICB2YWx1ZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblx0ICAgICAgICB2YXIgbXNnID0gbWVzc2FnZUZvcm1hdC5yZXBsYWNlKC8lKFxcZCkvZywgZnVuY3Rpb24gKHdob2xlLCBpZHgpIHtcblx0ICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KGlkeCA8IGFyZ3MubGVuZ3RoLCAnTWVzc2FnZSByZWZlcmVuY2UgbXVzdCBiZSBpbiByYW5nZScpO1xuXHQgICAgICAgICAgICByZXR1cm4gYXJnc1tpZHhdO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHZhciBpbmRleCA9IHRoaXMubGFzdE1hcmtlci5pbmRleDtcblx0ICAgICAgICB2YXIgbGluZSA9IHRoaXMubGFzdE1hcmtlci5saW5lO1xuXHQgICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmxhc3RNYXJrZXIuY29sdW1uICsgMTtcblx0ICAgICAgICB0aHJvdyB0aGlzLmVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihpbmRleCwgbGluZSwgY29sdW1uLCBtc2cpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUudG9sZXJhdGVFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlRm9ybWF0KSB7XG5cdCAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuXHQgICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG5cdCAgICAgICAgICAgIHZhbHVlc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXHQgICAgICAgIHZhciBtc2cgPSBtZXNzYWdlRm9ybWF0LnJlcGxhY2UoLyUoXFxkKS9nLCBmdW5jdGlvbiAod2hvbGUsIGlkeCkge1xuXHQgICAgICAgICAgICBhc3NlcnRfMS5hc3NlcnQoaWR4IDwgYXJncy5sZW5ndGgsICdNZXNzYWdlIHJlZmVyZW5jZSBtdXN0IGJlIGluIHJhbmdlJyk7XG5cdCAgICAgICAgICAgIHJldHVybiBhcmdzW2lkeF07XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5sYXN0TWFya2VyLmluZGV4O1xuXHQgICAgICAgIHZhciBsaW5lID0gdGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMubGFzdE1hcmtlci5jb2x1bW4gKyAxO1xuXHQgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLnRvbGVyYXRlRXJyb3IoaW5kZXgsIGxpbmUsIGNvbHVtbiwgbXNnKTtcblx0ICAgIH07XG5cdCAgICAvLyBUaHJvdyBhbiBleGNlcHRpb24gYmVjYXVzZSBvZiB0aGUgdG9rZW4uXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnVuZXhwZWN0ZWRUb2tlbkVycm9yID0gZnVuY3Rpb24gKHRva2VuLCBtZXNzYWdlKSB7XG5cdCAgICAgICAgdmFyIG1zZyA9IG1lc3NhZ2UgfHwgbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW47XG5cdCAgICAgICAgdmFyIHZhbHVlO1xuXHQgICAgICAgIGlmICh0b2tlbikge1xuXHQgICAgICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcblx0ICAgICAgICAgICAgICAgIG1zZyA9ICh0b2tlbi50eXBlID09PSAyIC8qIEVPRiAqLykgPyBtZXNzYWdlc18xLk1lc3NhZ2VzLlVuZXhwZWN0ZWRFT1MgOlxuXHQgICAgICAgICAgICAgICAgICAgICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkSWRlbnRpZmllciA6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICh0b2tlbi50eXBlID09PSA2IC8qIE51bWVyaWNMaXRlcmFsICovKSA/IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZE51bWJlciA6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9rZW4udHlwZSA9PT0gOCAvKiBTdHJpbmdMaXRlcmFsICovKSA/IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFN0cmluZyA6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRva2VuLnR5cGUgPT09IDEwIC8qIFRlbXBsYXRlICovKSA/IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFRlbXBsYXRlIDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW47XG5cdCAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gNCAvKiBLZXl3b3JkICovKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc0Z1dHVyZVJlc2VydmVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkUmVzZXJ2ZWQ7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgdGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQ7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhbHVlID0gdG9rZW4udmFsdWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB2YWx1ZSA9ICdJTExFR0FMJztcblx0ICAgICAgICB9XG5cdCAgICAgICAgbXNnID0gbXNnLnJlcGxhY2UoJyUwJywgdmFsdWUpO1xuXHQgICAgICAgIGlmICh0b2tlbiAmJiB0eXBlb2YgdG9rZW4ubGluZU51bWJlciA9PT0gJ251bWJlcicpIHtcblx0ICAgICAgICAgICAgdmFyIGluZGV4ID0gdG9rZW4uc3RhcnQ7XG5cdCAgICAgICAgICAgIHZhciBsaW5lID0gdG9rZW4ubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgdmFyIGxhc3RNYXJrZXJMaW5lU3RhcnQgPSB0aGlzLmxhc3RNYXJrZXIuaW5kZXggLSB0aGlzLmxhc3RNYXJrZXIuY29sdW1uO1xuXHQgICAgICAgICAgICB2YXIgY29sdW1uID0gdG9rZW4uc3RhcnQgLSBsYXN0TWFya2VyTGluZVN0YXJ0ICsgMTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGluZGV4LCBsaW5lLCBjb2x1bW4sIG1zZyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmxhc3RNYXJrZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIHZhciBsaW5lID0gdGhpcy5sYXN0TWFya2VyLmxpbmU7XG5cdCAgICAgICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmxhc3RNYXJrZXIuY29sdW1uICsgMTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGluZGV4LCBsaW5lLCBjb2x1bW4sIG1zZyk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUudGhyb3dVbmV4cGVjdGVkVG9rZW4gPSBmdW5jdGlvbiAodG9rZW4sIG1lc3NhZ2UpIHtcblx0ICAgICAgICB0aHJvdyB0aGlzLnVuZXhwZWN0ZWRUb2tlbkVycm9yKHRva2VuLCBtZXNzYWdlKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuID0gZnVuY3Rpb24gKHRva2VuLCBtZXNzYWdlKSB7XG5cdCAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIudG9sZXJhdGUodGhpcy51bmV4cGVjdGVkVG9rZW5FcnJvcih0b2tlbiwgbWVzc2FnZSkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuY29sbGVjdENvbW1lbnRzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICghdGhpcy5jb25maWcuY29tbWVudCkge1xuXHQgICAgICAgICAgICB0aGlzLnNjYW5uZXIuc2NhbkNvbW1lbnRzKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB2YXIgY29tbWVudHMgPSB0aGlzLnNjYW5uZXIuc2NhbkNvbW1lbnRzKCk7XG5cdCAgICAgICAgICAgIGlmIChjb21tZW50cy5sZW5ndGggPiAwICYmIHRoaXMuZGVsZWdhdGUpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudHMubGVuZ3RoOyArK2kpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGNvbW1lbnRzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gdm9pZCAwO1xuXHQgICAgICAgICAgICAgICAgICAgIG5vZGUgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGUubXVsdGlMaW5lID8gJ0Jsb2NrQ29tbWVudCcgOiAnTGluZUNvbW1lbnQnLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5zY2FubmVyLnNvdXJjZS5zbGljZShlLnNsaWNlWzBdLCBlLnNsaWNlWzFdKVxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLnJhbmdlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmFuZ2UgPSBlLnJhbmdlO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWcubG9jKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubG9jID0gZS5sb2M7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IGUubG9jLnN0YXJ0LmxpbmUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGUubG9jLnN0YXJ0LmNvbHVtbixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogZS5yYW5nZVswXVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IGUubG9jLmVuZC5saW5lLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBlLmxvYy5lbmQuY29sdW1uLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBlLnJhbmdlWzFdXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8vIEZyb20gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gYW4gZXh0ZXJuYWwgc3RydWN0dXJlXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmdldFRva2VuUmF3ID0gZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuc2Nhbm5lci5zb3VyY2Uuc2xpY2UodG9rZW4uc3RhcnQsIHRva2VuLmVuZCk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5jb252ZXJ0VG9rZW4gPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICB2YXIgdCA9IHtcblx0ICAgICAgICAgICAgdHlwZTogdG9rZW5fMS5Ub2tlbk5hbWVbdG9rZW4udHlwZV0sXG5cdCAgICAgICAgICAgIHZhbHVlOiB0aGlzLmdldFRva2VuUmF3KHRva2VuKVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLnJhbmdlKSB7XG5cdCAgICAgICAgICAgIHQucmFuZ2UgPSBbdG9rZW4uc3RhcnQsIHRva2VuLmVuZF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb2MpIHtcblx0ICAgICAgICAgICAgdC5sb2MgPSB7XG5cdCAgICAgICAgICAgICAgICBzdGFydDoge1xuXHQgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMuc3RhcnRNYXJrZXIubGluZSxcblx0ICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuc3RhcnRNYXJrZXIuY29sdW1uXG5cdCAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgZW5kOiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5zY2FubmVyLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLnNjYW5uZXIuaW5kZXggLSB0aGlzLnNjYW5uZXIubGluZVN0YXJ0XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA5IC8qIFJlZ3VsYXJFeHByZXNzaW9uICovKSB7XG5cdCAgICAgICAgICAgIHZhciBwYXR0ZXJuID0gdG9rZW4ucGF0dGVybjtcblx0ICAgICAgICAgICAgdmFyIGZsYWdzID0gdG9rZW4uZmxhZ3M7XG5cdCAgICAgICAgICAgIHQucmVnZXggPSB7IHBhdHRlcm46IHBhdHRlcm4sIGZsYWdzOiBmbGFncyB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdDtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLm5leHRUb2tlbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuaW5kZXggPSB0aGlzLnNjYW5uZXIuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5sYXN0TWFya2VyLmxpbmUgPSB0aGlzLnNjYW5uZXIubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLmxhc3RNYXJrZXIuY29sdW1uID0gdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydDtcblx0ICAgICAgICB0aGlzLmNvbGxlY3RDb21tZW50cygpO1xuXHQgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaW5kZXggIT09IHRoaXMuc3RhcnRNYXJrZXIuaW5kZXgpIHtcblx0ICAgICAgICAgICAgdGhpcy5zdGFydE1hcmtlci5pbmRleCA9IHRoaXMuc2Nhbm5lci5pbmRleDtcblx0ICAgICAgICAgICAgdGhpcy5zdGFydE1hcmtlci5saW5lID0gdGhpcy5zY2FubmVyLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgICAgIHRoaXMuc3RhcnRNYXJrZXIuY29sdW1uID0gdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG5leHQgPSB0aGlzLnNjYW5uZXIubGV4KCk7XG5cdCAgICAgICAgdGhpcy5oYXNMaW5lVGVybWluYXRvciA9ICh0b2tlbi5saW5lTnVtYmVyICE9PSBuZXh0LmxpbmVOdW1iZXIpO1xuXHQgICAgICAgIGlmIChuZXh0ICYmIHRoaXMuY29udGV4dC5zdHJpY3QgJiYgbmV4dC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQobmV4dC52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIG5leHQudHlwZSA9IDQgLyogS2V5d29yZCAqLztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmxvb2thaGVhZCA9IG5leHQ7XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLnRva2VucyAmJiBuZXh0LnR5cGUgIT09IDIgLyogRU9GICovKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy5jb252ZXJ0VG9rZW4obmV4dCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5uZXh0UmVnZXhUb2tlbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmNvbGxlY3RDb21tZW50cygpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMuc2Nhbm5lci5zY2FuUmVnRXhwKCk7XG5cdCAgICAgICAgaWYgKHRoaXMuY29uZmlnLnRva2Vucykge1xuXHQgICAgICAgICAgICAvLyBQb3AgdGhlIHByZXZpb3VzIHRva2VuLCAnLycgb3IgJy89J1xuXHQgICAgICAgICAgICAvLyBUaGlzIGlzIGFkZGVkIGZyb20gdGhlIGxvb2thaGVhZCB0b2tlbi5cblx0ICAgICAgICAgICAgdGhpcy50b2tlbnMucG9wKCk7XG5cdCAgICAgICAgICAgIHRoaXMudG9rZW5zLnB1c2godGhpcy5jb252ZXJ0VG9rZW4odG9rZW4pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gUHJpbWUgdGhlIG5leHQgbG9va2FoZWFkLlxuXHQgICAgICAgIHRoaXMubG9va2FoZWFkID0gdG9rZW47XG5cdCAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICByZXR1cm4gdG9rZW47XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5jcmVhdGVOb2RlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIGluZGV4OiB0aGlzLnN0YXJ0TWFya2VyLmluZGV4LFxuXHQgICAgICAgICAgICBsaW5lOiB0aGlzLnN0YXJ0TWFya2VyLmxpbmUsXG5cdCAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zdGFydE1hcmtlci5jb2x1bW5cblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuc3RhcnROb2RlID0gZnVuY3Rpb24gKHRva2VuLCBsYXN0TGluZVN0YXJ0KSB7XG5cdCAgICAgICAgaWYgKGxhc3RMaW5lU3RhcnQgPT09IHZvaWQgMCkgeyBsYXN0TGluZVN0YXJ0ID0gMDsgfVxuXHQgICAgICAgIHZhciBjb2x1bW4gPSB0b2tlbi5zdGFydCAtIHRva2VuLmxpbmVTdGFydDtcblx0ICAgICAgICB2YXIgbGluZSA9IHRva2VuLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgaWYgKGNvbHVtbiA8IDApIHtcblx0ICAgICAgICAgICAgY29sdW1uICs9IGxhc3RMaW5lU3RhcnQ7XG5cdCAgICAgICAgICAgIGxpbmUtLTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgaW5kZXg6IHRva2VuLnN0YXJ0LFxuXHQgICAgICAgICAgICBsaW5lOiBsaW5lLFxuXHQgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uIChtYXJrZXIsIG5vZGUpIHtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcucmFuZ2UpIHtcblx0ICAgICAgICAgICAgbm9kZS5yYW5nZSA9IFttYXJrZXIuaW5kZXgsIHRoaXMubGFzdE1hcmtlci5pbmRleF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmNvbmZpZy5sb2MpIHtcblx0ICAgICAgICAgICAgbm9kZS5sb2MgPSB7XG5cdCAgICAgICAgICAgICAgICBzdGFydDoge1xuXHQgICAgICAgICAgICAgICAgICAgIGxpbmU6IG1hcmtlci5saW5lLFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogbWFya2VyLmNvbHVtbixcblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHtcblx0ICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxhc3RNYXJrZXIubGluZSxcblx0ICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMubGFzdE1hcmtlci5jb2x1bW5cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLnNvdXJjZSkge1xuXHQgICAgICAgICAgICAgICAgbm9kZS5sb2Muc291cmNlID0gdGhpcy5jb25maWcuc291cmNlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmRlbGVnYXRlKSB7XG5cdCAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IHtcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogbWFya2VyLmxpbmUsXG5cdCAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBtYXJrZXIuY29sdW1uLFxuXHQgICAgICAgICAgICAgICAgICAgIG9mZnNldDogbWFya2VyLmluZGV4XG5cdCAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgZW5kOiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5sYXN0TWFya2VyLmxpbmUsXG5cdCAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmxhc3RNYXJrZXIuY29sdW1uLFxuXHQgICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5sYXN0TWFya2VyLmluZGV4XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUobm9kZSwgbWV0YWRhdGEpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gbm9kZTtcblx0ICAgIH07XG5cdCAgICAvLyBFeHBlY3QgdGhlIG5leHQgdG9rZW4gdG8gbWF0Y2ggdGhlIHNwZWNpZmllZCBwdW5jdHVhdG9yLlxuXHQgICAgLy8gSWYgbm90LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmV4cGVjdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09IDcgLyogUHVuY3R1YXRvciAqLyB8fCB0b2tlbi52YWx1ZSAhPT0gdmFsdWUpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8vIFF1aWV0bHkgZXhwZWN0IGEgY29tbWEgd2hlbiBpbiB0b2xlcmFudCBtb2RlLCBvdGhlcndpc2UgZGVsZWdhdGVzIHRvIGV4cGVjdCgpLlxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5leHBlY3RDb21tYVNlcGFyYXRvciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5jb25maWcudG9sZXJhbnQpIHtcblx0ICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8gJiYgdG9rZW4udmFsdWUgPT09ICcsJykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8gJiYgdG9rZW4udmFsdWUgPT09ICc7Jykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW4pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvLyBFeHBlY3QgdGhlIG5leHQgdG9rZW4gdG8gbWF0Y2ggdGhlIHNwZWNpZmllZCBrZXl3b3JkLlxuXHQgICAgLy8gSWYgbm90LCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmV4cGVjdEtleXdvcmQgPSBmdW5jdGlvbiAoa2V5d29yZCkge1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgaWYgKHRva2VuLnR5cGUgIT09IDQgLyogS2V5d29yZCAqLyB8fCB0b2tlbi52YWx1ZSAhPT0ga2V5d29yZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHB1bmN0dWF0b3IuXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiB0aGlzLmxvb2thaGVhZC52YWx1ZSA9PT0gdmFsdWU7XG5cdCAgICB9O1xuXHQgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGtleXdvcmRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUubWF0Y2hLZXl3b3JkID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5sb29rYWhlYWQudHlwZSA9PT0gNCAvKiBLZXl3b3JkICovICYmIHRoaXMubG9va2FoZWFkLnZhbHVlID09PSBrZXl3b3JkO1xuXHQgICAgfTtcblx0ICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBjb250ZXh0dWFsIGtleXdvcmRcblx0ICAgIC8vICh3aGVyZSBhbiBpZGVudGlmaWVyIGlzIHNvbWV0aW1lcyBhIGtleXdvcmQgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0KVxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5tYXRjaENvbnRleHR1YWxLZXl3b3JkID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovICYmIHRoaXMubG9va2FoZWFkLnZhbHVlID09PSBrZXl3b3JkO1xuXHQgICAgfTtcblx0ICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBuZXh0IHRva2VuIGlzIGFuIGFzc2lnbm1lbnQgb3BlcmF0b3Jcblx0ICAgIFBhcnNlci5wcm90b3R5cGUubWF0Y2hBc3NpZ24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDcgLyogUHVuY3R1YXRvciAqLykge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBvcCA9IHRoaXMubG9va2FoZWFkLnZhbHVlO1xuXHQgICAgICAgIHJldHVybiBvcCA9PT0gJz0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnKj0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnKio9JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJy89JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJyU9JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJys9JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJy09JyB8fFxuXHQgICAgICAgICAgICBvcCA9PT0gJzw8PScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICc+Pj0nIHx8XG5cdCAgICAgICAgICAgIG9wID09PSAnPj4+PScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICcmPScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICdePScgfHxcblx0ICAgICAgICAgICAgb3AgPT09ICd8PSc7XG5cdCAgICB9O1xuXHQgICAgLy8gQ292ZXIgZ3JhbW1hciBzdXBwb3J0LlxuXHQgICAgLy9cblx0ICAgIC8vIFdoZW4gYW4gYXNzaWdubWVudCBleHByZXNzaW9uIHBvc2l0aW9uIHN0YXJ0cyB3aXRoIGFuIGxlZnQgcGFyZW50aGVzaXMsIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHRoZSB0eXBlXG5cdCAgICAvLyBvZiB0aGUgc3ludGF4IGlzIHRvIGJlIGRlZmVycmVkIGFyYml0cmFyaWx5IGxvbmcgdW50aWwgdGhlIGVuZCBvZiB0aGUgcGFyZW50aGVzZXMgcGFpciAocGx1cyBhIGxvb2thaGVhZClcblx0ICAgIC8vIG9yIHRoZSBmaXJzdCBjb21tYS4gVGhpcyBzaXR1YXRpb24gYWxzbyBkZWZlcnMgdGhlIGRldGVybWluYXRpb24gb2YgYWxsIHRoZSBleHByZXNzaW9ucyBuZXN0ZWQgaW4gdGhlIHBhaXIuXG5cdCAgICAvL1xuXHQgICAgLy8gVGhlcmUgYXJlIHRocmVlIHByb2R1Y3Rpb25zIHRoYXQgY2FuIGJlIHBhcnNlZCBpbiBhIHBhcmVudGhlc2VzIHBhaXIgdGhhdCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkXG5cdCAgICAvLyBhZnRlciB0aGUgb3V0ZXJtb3N0IHBhaXIgaXMgY2xvc2VkLiBUaGV5IGFyZTpcblx0ICAgIC8vXG5cdCAgICAvLyAgIDEuIEFzc2lnbm1lbnRFeHByZXNzaW9uXG5cdCAgICAvLyAgIDIuIEJpbmRpbmdFbGVtZW50c1xuXHQgICAgLy8gICAzLiBBc3NpZ25tZW50VGFyZ2V0c1xuXHQgICAgLy9cblx0ICAgIC8vIEluIG9yZGVyIHRvIGF2b2lkIGV4cG9uZW50aWFsIGJhY2t0cmFja2luZywgd2UgdXNlIHR3byBmbGFncyB0byBkZW5vdGUgaWYgdGhlIHByb2R1Y3Rpb24gY2FuIGJlXG5cdCAgICAvLyBiaW5kaW5nIGVsZW1lbnQgb3IgYXNzaWdubWVudCB0YXJnZXQuXG5cdCAgICAvL1xuXHQgICAgLy8gVGhlIHRocmVlIHByb2R1Y3Rpb25zIGhhdmUgdGhlIHJlbGF0aW9uc2hpcDpcblx0ICAgIC8vXG5cdCAgICAvLyAgIEJpbmRpbmdFbGVtZW50cyDiioYgQXNzaWdubWVudFRhcmdldHMg4oqGIEFzc2lnbm1lbnRFeHByZXNzaW9uXG5cdCAgICAvL1xuXHQgICAgLy8gd2l0aCBhIHNpbmdsZSBleGNlcHRpb24gdGhhdCBDb3ZlckluaXRpYWxpemVkTmFtZSB3aGVuIHVzZWQgZGlyZWN0bHkgaW4gYW4gRXhwcmVzc2lvbiwgZ2VuZXJhdGVzXG5cdCAgICAvLyBhbiBlYXJseSBlcnJvci4gVGhlcmVmb3JlLCB3ZSBuZWVkIHRoZSB0aGlyZCBzdGF0ZSwgZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yLCB0byB0cmFjayB0aGVcblx0ICAgIC8vIGZpcnN0IHVzYWdlIG9mIENvdmVySW5pdGlhbGl6ZWROYW1lIGFuZCByZXBvcnQgaXQgd2hlbiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHBhcmVudGhlc2VzIHBhaXIuXG5cdCAgICAvL1xuXHQgICAgLy8gaXNvbGF0ZUNvdmVyR3JhbW1hciBmdW5jdGlvbiBydW5zIHRoZSBnaXZlbiBwYXJzZXIgZnVuY3Rpb24gd2l0aCBhIG5ldyBjb3ZlciBncmFtbWFyIGNvbnRleHQsIGFuZCBpdCBkb2VzIG5vdFxuXHQgICAgLy8gZWZmZWN0IHRoZSBjdXJyZW50IGZsYWdzLiBUaGlzIG1lYW5zIHRoZSBwcm9kdWN0aW9uIHRoZSBwYXJzZXIgcGFyc2VzIGlzIG9ubHkgdXNlZCBhcyBhbiBleHByZXNzaW9uLiBUaGVyZWZvcmVcblx0ICAgIC8vIHRoZSBDb3ZlckluaXRpYWxpemVkTmFtZSBjaGVjayBpcyBjb25kdWN0ZWQuXG5cdCAgICAvL1xuXHQgICAgLy8gaW5oZXJpdENvdmVyR3JhbW1hciBmdW5jdGlvbiBydW5zIHRoZSBnaXZlbiBwYXJzZSBmdW5jdGlvbiB3aXRoIGEgbmV3IGNvdmVyIGdyYW1tYXIgY29udGV4dCwgYW5kIGl0IHByb3BhZ2F0ZXNcblx0ICAgIC8vIHRoZSBmbGFncyBvdXRzaWRlIG9mIHRoZSBwYXJzZXIuIFRoaXMgbWVhbnMgdGhlIHByb2R1Y3Rpb24gdGhlIHBhcnNlciBwYXJzZXMgaXMgdXNlZCBhcyBhIHBhcnQgb2YgYSBwb3RlbnRpYWxcblx0ICAgIC8vIHBhdHRlcm4uIFRoZSBDb3ZlckluaXRpYWxpemVkTmFtZSBjaGVjayBpcyBkZWZlcnJlZC5cblx0ICAgIFBhcnNlci5wcm90b3R5cGUuaXNvbGF0ZUNvdmVyR3JhbW1hciA9IGZ1bmN0aW9uIChwYXJzZUZ1bmN0aW9uKSB7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzSXNCaW5kaW5nRWxlbWVudCA9IHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0lzQXNzaWdubWVudFRhcmdldCA9IHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQ7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzRmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gdGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvcjtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciA9IG51bGw7XG5cdCAgICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlRnVuY3Rpb24uY2FsbCh0aGlzKTtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IHByZXZpb3VzSXNCaW5kaW5nRWxlbWVudDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gcHJldmlvdXNJc0Fzc2lnbm1lbnRUYXJnZXQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciA9IHByZXZpb3VzRmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yO1xuXHQgICAgICAgIHJldHVybiByZXN1bHQ7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5pbmhlcml0Q292ZXJHcmFtbWFyID0gZnVuY3Rpb24gKHBhcnNlRnVuY3Rpb24pIHtcblx0ICAgICAgICB2YXIgcHJldmlvdXNJc0JpbmRpbmdFbGVtZW50ID0gdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQ7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzSXNBc3NpZ25tZW50VGFyZ2V0ID0gdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNGaXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gbnVsbDtcblx0ICAgICAgICB2YXIgcmVzdWx0ID0gcGFyc2VGdW5jdGlvbi5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgJiYgcHJldmlvdXNJc0JpbmRpbmdFbGVtZW50O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ICYmIHByZXZpb3VzSXNBc3NpZ25tZW50VGFyZ2V0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5maXJzdENvdmVySW5pdGlhbGl6ZWROYW1lRXJyb3IgPSBwcmV2aW91c0ZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciB8fCB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yO1xuXHQgICAgICAgIHJldHVybiByZXN1bHQ7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5jb25zdW1lU2VtaWNvbG9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCc7JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAoIXRoaXMuaGFzTGluZVRlcm1pbmF0b3IpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovICYmICF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMubGFzdE1hcmtlci5pbmRleCA9IHRoaXMuc3RhcnRNYXJrZXIuaW5kZXg7XG5cdCAgICAgICAgICAgIHRoaXMubGFzdE1hcmtlci5saW5lID0gdGhpcy5zdGFydE1hcmtlci5saW5lO1xuXHQgICAgICAgICAgICB0aGlzLmxhc3RNYXJrZXIuY29sdW1uID0gdGhpcy5zdGFydE1hcmtlci5jb2x1bW47XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByaW1hcnktZXhwcmVzc2lvblxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVByaW1hcnlFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGV4cHI7XG5cdCAgICAgICAgdmFyIHRva2VuLCByYXc7XG5cdCAgICAgICAgc3dpdGNoICh0aGlzLmxvb2thaGVhZC50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2UgMyAvKiBJZGVudGlmaWVyICovOlxuXHQgICAgICAgICAgICAgICAgaWYgKCh0aGlzLmNvbnRleHQuaXNNb2R1bGUgfHwgdGhpcy5jb250ZXh0LmF3YWl0KSAmJiB0aGlzLmxvb2thaGVhZC52YWx1ZSA9PT0gJ2F3YWl0Jykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMubWF0Y2hBc3luY0Z1bmN0aW9uKCkgPyB0aGlzLnBhcnNlRnVuY3Rpb25FeHByZXNzaW9uKCkgOiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIodGhpcy5uZXh0VG9rZW4oKS52YWx1ZSkpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgNiAvKiBOdW1lcmljTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA4IC8qIFN0cmluZ0xpdGVyYWwgKi86XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiB0aGlzLmxvb2thaGVhZC5vY3RhbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQsIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0T2N0YWxMaXRlcmFsKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICByYXcgPSB0aGlzLmdldFRva2VuUmF3KHRva2VuKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkxpdGVyYWwodG9rZW4udmFsdWUsIHJhdykpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgMSAvKiBCb29sZWFuTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICByYXcgPSB0aGlzLmdldFRva2VuUmF3KHRva2VuKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkxpdGVyYWwodG9rZW4udmFsdWUgPT09ICd0cnVlJywgcmF3KSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSA1IC8qIE51bGxMaXRlcmFsICovOlxuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuTGl0ZXJhbChudWxsLCByYXcpKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDEwIC8qIFRlbXBsYXRlICovOlxuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMucGFyc2VUZW1wbGF0ZUxpdGVyYWwoKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDcgLyogUHVuY3R1YXRvciAqLzpcblx0ICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5sb29rYWhlYWQudmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICcoJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlR3JvdXBFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnWyc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFycmF5SW5pdGlhbGl6ZXIpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICd7Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlT2JqZWN0SW5pdGlhbGl6ZXIpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzpcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICcvPSc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FubmVyLmluZGV4ID0gdGhpcy5zdGFydE1hcmtlci5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLm5leHRSZWdleFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5SZWdleExpdGVyYWwodG9rZW4ucmVnZXgsIHJhdywgdG9rZW4ucGF0dGVybiwgdG9rZW4uZmxhZ3MpKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSA0IC8qIEtleXdvcmQgKi86XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5zdHJpY3QgJiYgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgJiYgdGhpcy5tYXRjaEtleXdvcmQoJ3lpZWxkJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5jb250ZXh0LnN0cmljdCAmJiB0aGlzLm1hdGNoS2V5d29yZCgnbGV0JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5JZGVudGlmaWVyKHRoaXMubmV4dFRva2VuKCkudmFsdWUpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnZnVuY3Rpb24nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoS2V5d29yZCgndGhpcycpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlRoaXNFeHByZXNzaW9uKCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnY2xhc3MnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZUNsYXNzRXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXktaW5pdGlhbGl6ZXJcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTcHJlYWRFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJy4uLicpO1xuXHQgICAgICAgIHZhciBhcmcgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5TcHJlYWRFbGVtZW50KGFyZykpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VBcnJheUluaXRpYWxpemVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGVsZW1lbnRzID0gW107XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ1snKTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2goJ10nKSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnLCcpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaChudWxsKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCcuLi4nKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLnBhcnNlU3ByZWFkRWxlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCddJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaChlbGVtZW50KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2godGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbikpO1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCddJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCddJyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXJyYXlFeHByZXNzaW9uKGVsZW1lbnRzKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb2JqZWN0LWluaXRpYWxpemVyXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlUHJvcGVydHlNZXRob2QgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzU3RyaWN0ID0gdGhpcy5jb250ZXh0LnN0cmljdDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZSA9IHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmUgPSBwYXJhbXMuc2ltcGxlO1xuXHQgICAgICAgIHZhciBib2R5ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VGdW5jdGlvblNvdXJjZUVsZW1lbnRzKTtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBwYXJhbXMuZmlyc3RSZXN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4ocGFyYW1zLmZpcnN0UmVzdHJpY3RlZCwgcGFyYW1zLm1lc3NhZ2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBwYXJhbXMuc3RyaWN0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbihwYXJhbXMuc3RyaWN0ZWQsIHBhcmFtcy5tZXNzYWdlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHByZXZpb3VzU3RyaWN0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZSA9IHByZXZpb3VzQWxsb3dTdHJpY3REaXJlY3RpdmU7XG5cdCAgICAgICAgcmV0dXJuIGJvZHk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVByb3BlcnR5TWV0aG9kRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGlzR2VuZXJhdG9yID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1lpZWxkID0gdGhpcy5jb250ZXh0LmFsbG93WWllbGQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSB0cnVlO1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSB0aGlzLnBhcnNlRm9ybWFsUGFyYW1ldGVycygpO1xuXHQgICAgICAgIHZhciBtZXRob2QgPSB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2QocGFyYW1zKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5GdW5jdGlvbkV4cHJlc3Npb24obnVsbCwgcGFyYW1zLnBhcmFtcywgbWV0aG9kLCBpc0dlbmVyYXRvcikpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VQcm9wZXJ0eU1ldGhvZEFzeW5jRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1lpZWxkID0gdGhpcy5jb250ZXh0LmFsbG93WWllbGQ7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQXdhaXQgPSB0aGlzLmNvbnRleHQuYXdhaXQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSB0cnVlO1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSB0aGlzLnBhcnNlRm9ybWFsUGFyYW1ldGVycygpO1xuXHQgICAgICAgIHZhciBtZXRob2QgPSB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2QocGFyYW1zKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBwcmV2aW91c0F3YWl0O1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkFzeW5jRnVuY3Rpb25FeHByZXNzaW9uKG51bGwsIHBhcmFtcy5wYXJhbXMsIG1ldGhvZCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VPYmplY3RQcm9wZXJ0eUtleSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdmFyIGtleTtcblx0ICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSA4IC8qIFN0cmluZ0xpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgNiAvKiBOdW1lcmljTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHRva2VuLm9jdGFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RPY3RhbExpdGVyYWwpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdmFyIHJhdyA9IHRoaXMuZ2V0VG9rZW5SYXcodG9rZW4pO1xuXHQgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5MaXRlcmFsKHRva2VuLnZhbHVlLCByYXcpKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDMgLyogSWRlbnRpZmllciAqLzpcblx0ICAgICAgICAgICAgY2FzZSAxIC8qIEJvb2xlYW5MaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDUgLyogTnVsbExpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgNCAvKiBLZXl3b3JkICovOlxuXHQgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5JZGVudGlmaWVyKHRva2VuLnZhbHVlKSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSA3IC8qIFB1bmN0dWF0b3IgKi86XG5cdCAgICAgICAgICAgICAgICBpZiAodG9rZW4udmFsdWUgPT09ICdbJykge1xuXHQgICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCddJyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAga2V5ID0gdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBrZXk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5pc1Byb3BlcnR5S2V5ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0ICAgICAgICByZXR1cm4gKGtleS50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllciAmJiBrZXkubmFtZSA9PT0gdmFsdWUpIHx8XG5cdCAgICAgICAgICAgIChrZXkudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LkxpdGVyYWwgJiYga2V5LnZhbHVlID09PSB2YWx1ZSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU9iamVjdFByb3BlcnR5ID0gZnVuY3Rpb24gKGhhc1Byb3RvKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIga2luZDtcblx0ICAgICAgICB2YXIga2V5ID0gbnVsbDtcblx0ICAgICAgICB2YXIgdmFsdWUgPSBudWxsO1xuXHQgICAgICAgIHZhciBjb21wdXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBtZXRob2QgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgc2hvcnRoYW5kID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIGlzQXN5bmMgPSBmYWxzZTtcblx0ICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovKSB7XG5cdCAgICAgICAgICAgIHZhciBpZCA9IHRva2VuLnZhbHVlO1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBjb21wdXRlZCA9IHRoaXMubWF0Y2goJ1snKTtcblx0ICAgICAgICAgICAgaXNBc3luYyA9ICF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yICYmIChpZCA9PT0gJ2FzeW5jJykgJiZcblx0ICAgICAgICAgICAgICAgICF0aGlzLm1hdGNoKCc6JykgJiYgIXRoaXMubWF0Y2goJygnKSAmJiAhdGhpcy5tYXRjaCgnKicpICYmICF0aGlzLm1hdGNoKCcsJyk7XG5cdCAgICAgICAgICAgIGtleSA9IGlzQXN5bmMgPyB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKSA6IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWRlbnRpZmllcihpZCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCcqJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGxvb2thaGVhZFByb3BlcnR5S2V5ID0gdGhpcy5xdWFsaWZpZWRQcm9wZXJ0eU5hbWUodGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgIWlzQXN5bmMgJiYgdG9rZW4udmFsdWUgPT09ICdnZXQnICYmIGxvb2thaGVhZFByb3BlcnR5S2V5KSB7XG5cdCAgICAgICAgICAgIGtpbmQgPSAnZ2V0Jztcblx0ICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IGZhbHNlO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VHZXR0ZXJNZXRob2QoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovICYmICFpc0FzeW5jICYmIHRva2VuLnZhbHVlID09PSAnc2V0JyAmJiBsb29rYWhlYWRQcm9wZXJ0eUtleSkge1xuXHQgICAgICAgICAgICBraW5kID0gJ3NldCc7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlU2V0dGVyTWV0aG9kKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IDcgLyogUHVuY3R1YXRvciAqLyAmJiB0b2tlbi52YWx1ZSA9PT0gJyonICYmIGxvb2thaGVhZFByb3BlcnR5S2V5KSB7XG5cdCAgICAgICAgICAgIGtpbmQgPSAnaW5pdCc7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlR2VuZXJhdG9yTWV0aG9kKCk7XG5cdCAgICAgICAgICAgIG1ldGhvZCA9IHRydWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBpZiAoIWtleSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAga2luZCA9ICdpbml0Jztcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJzonKSAmJiAhaXNBc3luYykge1xuXHQgICAgICAgICAgICAgICAgaWYgKCFjb21wdXRlZCAmJiB0aGlzLmlzUHJvcGVydHlLZXkoa2V5LCAnX19wcm90b19fJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUHJvdG8udmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuRHVwbGljYXRlUHJvdG9Qcm9wZXJ0eSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGhhc1Byb3RvLnZhbHVlID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJygnKSkge1xuXHQgICAgICAgICAgICAgICAgdmFsdWUgPSBpc0FzeW5jID8gdGhpcy5wYXJzZVByb3BlcnR5TWV0aG9kQXN5bmNGdW5jdGlvbigpIDogdGhpcy5wYXJzZVByb3BlcnR5TWV0aG9kRnVuY3Rpb24oKTtcblx0ICAgICAgICAgICAgICAgIG1ldGhvZCA9IHRydWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIodG9rZW4udmFsdWUpKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCc9JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICBzaG9ydGhhbmQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBpbml0ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkFzc2lnbm1lbnRQYXR0ZXJuKGlkLCBpbml0KSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBzaG9ydGhhbmQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaWQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlByb3BlcnR5KGtpbmQsIGtleSwgY29tcHV0ZWQsIHZhbHVlLCBtZXRob2QsIHNob3J0aGFuZCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VPYmplY3RJbml0aWFsaXplciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG5cdCAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBbXTtcblx0ICAgICAgICB2YXIgaGFzUHJvdG8gPSB7IHZhbHVlOiBmYWxzZSB9O1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaCh0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHkoaGFzUHJvdG8pKTtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0Q29tbWFTZXBhcmF0b3IoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnfScpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLk9iamVjdEV4cHJlc3Npb24ocHJvcGVydGllcykpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRlbXBsYXRlLWxpdGVyYWxzXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVGVtcGxhdGVIZWFkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGFzc2VydF8xLmFzc2VydCh0aGlzLmxvb2thaGVhZC5oZWFkLCAnVGVtcGxhdGUgbGl0ZXJhbCBtdXN0IHN0YXJ0IHdpdGggYSB0ZW1wbGF0ZSBoZWFkJyk7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIHZhciByYXcgPSB0b2tlbi52YWx1ZTtcblx0ICAgICAgICB2YXIgY29va2VkID0gdG9rZW4uY29va2VkO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlRlbXBsYXRlRWxlbWVudCh7IHJhdzogcmF3LCBjb29rZWQ6IGNvb2tlZCB9LCB0b2tlbi50YWlsKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVRlbXBsYXRlRWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMTAgLyogVGVtcGxhdGUgKi8pIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdmFyIHJhdyA9IHRva2VuLnZhbHVlO1xuXHQgICAgICAgIHZhciBjb29rZWQgPSB0b2tlbi5jb29rZWQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVGVtcGxhdGVFbGVtZW50KHsgcmF3OiByYXcsIGNvb2tlZDogY29va2VkIH0sIHRva2VuLnRhaWwpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVGVtcGxhdGVMaXRlcmFsID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGV4cHJlc3Npb25zID0gW107XG5cdCAgICAgICAgdmFyIHF1YXNpcyA9IFtdO1xuXHQgICAgICAgIHZhciBxdWFzaSA9IHRoaXMucGFyc2VUZW1wbGF0ZUhlYWQoKTtcblx0ICAgICAgICBxdWFzaXMucHVzaChxdWFzaSk7XG5cdCAgICAgICAgd2hpbGUgKCFxdWFzaS50YWlsKSB7XG5cdCAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2godGhpcy5wYXJzZUV4cHJlc3Npb24oKSk7XG5cdCAgICAgICAgICAgIHF1YXNpID0gdGhpcy5wYXJzZVRlbXBsYXRlRWxlbWVudCgpO1xuXHQgICAgICAgICAgICBxdWFzaXMucHVzaChxdWFzaSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlRlbXBsYXRlTGl0ZXJhbChxdWFzaXMsIGV4cHJlc3Npb25zKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ3JvdXBpbmctb3BlcmF0b3Jcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuID0gZnVuY3Rpb24gKGV4cHIpIHtcblx0ICAgICAgICBzd2l0Y2ggKGV4cHIudHlwZSkge1xuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyOlxuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5NZW1iZXJFeHByZXNzaW9uOlxuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5SZXN0RWxlbWVudDpcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudFBhdHRlcm46XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguU3ByZWFkRWxlbWVudDpcblx0ICAgICAgICAgICAgICAgIGV4cHIudHlwZSA9IHN5bnRheF8xLlN5bnRheC5SZXN0RWxlbWVudDtcblx0ICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHIuYXJndW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LkFycmF5RXhwcmVzc2lvbjpcblx0ICAgICAgICAgICAgICAgIGV4cHIudHlwZSA9IHN5bnRheF8xLlN5bnRheC5BcnJheVBhdHRlcm47XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHIuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZXhwci5lbGVtZW50c1tpXSAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByLmVsZW1lbnRzW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguT2JqZWN0RXhwcmVzc2lvbjpcblx0ICAgICAgICAgICAgICAgIGV4cHIudHlwZSA9IHN5bnRheF8xLlN5bnRheC5PYmplY3RQYXR0ZXJuO1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByLnByb3BlcnRpZXNbaV0udmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRFeHByZXNzaW9uOlxuXHQgICAgICAgICAgICAgICAgZXhwci50eXBlID0gc3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRQYXR0ZXJuO1xuXHQgICAgICAgICAgICAgICAgZGVsZXRlIGV4cHIub3BlcmF0b3I7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByLmxlZnQpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAvLyBBbGxvdyBvdGhlciBub2RlIHR5cGUgZm9yIHRvbGVyYW50IHBhcnNpbmcuXG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUdyb3VwRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgZXhwcjtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKCcpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCc9PicpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnPT4nKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBleHByID0ge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgIHBhcmFtczogW10sXG5cdCAgICAgICAgICAgICAgICBhc3luYzogZmFsc2Vcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBzdGFydFRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIHZhciBwYXJhbXMgPSBbXTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJy4uLicpKSB7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZVJlc3RFbGVtZW50KHBhcmFtcyk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCc9PicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJz0+Jyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBleHByID0ge1xuXHQgICAgICAgICAgICAgICAgICAgIHR5cGU6IEFycm93UGFyYW1ldGVyUGxhY2VIb2xkZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBbZXhwcl0sXG5cdCAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG5cdCAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdmFyIGFycm93ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnLCcpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGV4cHJlc3Npb25zID0gW107XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2goZXhwcik7XG5cdCAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnLCcpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHJlc3Npb25zW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IGV4cHJlc3Npb25zLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCcuLi4nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaCh0aGlzLnBhcnNlUmVzdEVsZW1lbnQocGFyYW1zKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCc9PicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJz0+Jyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHByZXNzaW9ucy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGV4cHJlc3Npb25zW2ldKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IGV4cHJlc3Npb25zLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2godGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbikpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcnJvdykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJvdykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuU2VxdWVuY2VFeHByZXNzaW9uKGV4cHJlc3Npb25zKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKCFhcnJvdykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJz0+JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cHIudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIgJiYgZXhwci5uYW1lID09PSAneWllbGQnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJvdyA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEFycm93UGFyYW1ldGVyUGxhY2VIb2xkZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBbZXhwcl0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJyb3cpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHByLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5TZXF1ZW5jZUV4cHJlc3Npb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cHIuZXhwcmVzc2lvbnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwci5leHByZXNzaW9uc1tpXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oZXhwcik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFyYW1ldGVycyA9IChleHByLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5TZXF1ZW5jZUV4cHJlc3Npb24gPyBleHByLmV4cHJlc3Npb25zIDogW2V4cHJdKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtZXRlcnMsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6IGZhbHNlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtbGVmdC1oYW5kLXNpZGUtZXhwcmVzc2lvbnNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VBcmd1bWVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICB2YXIgYXJncyA9IFtdO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgZXhwciA9IHRoaXMubWF0Y2goJy4uLicpID8gdGhpcy5wYXJzZVNwcmVhZEVsZW1lbnQoKSA6XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICBhcmdzLnB1c2goZXhwcik7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdENvbW1hU2VwYXJhdG9yKCk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJyknKTtcblx0ICAgICAgICByZXR1cm4gYXJncztcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmlzSWRlbnRpZmllck5hbWUgPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICByZXR1cm4gdG9rZW4udHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovIHx8XG5cdCAgICAgICAgICAgIHRva2VuLnR5cGUgPT09IDQgLyogS2V5d29yZCAqLyB8fFxuXHQgICAgICAgICAgICB0b2tlbi50eXBlID09PSAxIC8qIEJvb2xlYW5MaXRlcmFsICovIHx8XG5cdCAgICAgICAgICAgIHRva2VuLnR5cGUgPT09IDUgLyogTnVsbExpdGVyYWwgKi87XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUlkZW50aWZpZXJOYW1lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICBpZiAoIXRoaXMuaXNJZGVudGlmaWVyTmFtZSh0b2tlbikpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIodG9rZW4udmFsdWUpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlTmV3RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyTmFtZSgpO1xuXHQgICAgICAgIGFzc2VydF8xLmFzc2VydChpZC5uYW1lID09PSAnbmV3JywgJ05ldyBleHByZXNzaW9uIG11c3Qgc3RhcnQgd2l0aCBgbmV3YCcpO1xuXHQgICAgICAgIHZhciBleHByO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCcuJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLyAmJiB0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkgJiYgdGhpcy5sb29rYWhlYWQudmFsdWUgPT09ICd0YXJnZXQnKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSBuZXcgTm9kZS5NZXRhUHJvcGVydHkoaWQsIHByb3BlcnR5KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB2YXIgY2FsbGVlID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VMZWZ0SGFuZFNpZGVFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgdmFyIGFyZ3MgPSB0aGlzLm1hdGNoKCcoJykgPyB0aGlzLnBhcnNlQXJndW1lbnRzKCkgOiBbXTtcblx0ICAgICAgICAgICAgZXhwciA9IG5ldyBOb2RlLk5ld0V4cHJlc3Npb24oY2FsbGVlLCBhcmdzKTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBleHByKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQXN5bmNBcmd1bWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgYXJnID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmZpcnN0Q292ZXJJbml0aWFsaXplZE5hbWVFcnJvciA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIGFyZztcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQXN5bmNBcmd1bWVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJygnKTtcblx0ICAgICAgICB2YXIgYXJncyA9IFtdO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgZXhwciA9IHRoaXMubWF0Y2goJy4uLicpID8gdGhpcy5wYXJzZVNwcmVhZEVsZW1lbnQoKSA6XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3luY0FyZ3VtZW50KTtcblx0ICAgICAgICAgICAgICAgIGFyZ3MucHVzaChleHByKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0Q29tbWFTZXBhcmF0b3IoKTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgIHJldHVybiBhcmdzO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VMZWZ0SGFuZFNpZGVFeHByZXNzaW9uQWxsb3dDYWxsID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGFydFRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIG1heWJlQXN5bmMgPSB0aGlzLm1hdGNoQ29udGV4dHVhbEtleXdvcmQoJ2FzeW5jJyk7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dJbiA9IHRoaXMuY29udGV4dC5hbGxvd0luO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgZXhwcjtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ3N1cGVyJykgJiYgdGhpcy5jb250ZXh0LmluRnVuY3Rpb25Cb2R5KSB7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUoZXhwciwgbmV3IE5vZGUuU3VwZXIoKSk7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKCcpICYmICF0aGlzLm1hdGNoKCcuJykgJiYgIXRoaXMubWF0Y2goJ1snKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5tYXRjaEtleXdvcmQoJ25ldycpID8gdGhpcy5wYXJzZU5ld0V4cHJlc3Npb24gOiB0aGlzLnBhcnNlUHJpbWFyeUV4cHJlc3Npb24pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB3aGlsZSAodHJ1ZSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnLicpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLicpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuU3RhdGljTWVtYmVyRXhwcmVzc2lvbihleHByLCBwcm9wZXJ0eSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJygnKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGFzeW5jQXJyb3cgPSBtYXliZUFzeW5jICYmIChzdGFydFRva2VuLmxpbmVOdW1iZXIgPT09IHRoaXMubG9va2FoZWFkLmxpbmVOdW1iZXIpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHZhciBhcmdzID0gYXN5bmNBcnJvdyA/IHRoaXMucGFyc2VBc3luY0FyZ3VtZW50cygpIDogdGhpcy5wYXJzZUFyZ3VtZW50cygpO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLkNhbGxFeHByZXNzaW9uKGV4cHIsIGFyZ3MpKTtcblx0ICAgICAgICAgICAgICAgIGlmIChhc3luY0Fycm93ICYmIHRoaXMubWF0Y2goJz0+JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oYXJnc1tpXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEFycm93UGFyYW1ldGVyUGxhY2VIb2xkZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogYXJncyxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6IHRydWVcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJ1snKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJ1snKTtcblx0ICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlRXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnXScpO1xuXHQgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLkNvbXB1dGVkTWVtYmVyRXhwcmVzc2lvbihleHByLCBwcm9wZXJ0eSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDEwIC8qIFRlbXBsYXRlICovICYmIHRoaXMubG9va2FoZWFkLmhlYWQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBxdWFzaSA9IHRoaXMucGFyc2VUZW1wbGF0ZUxpdGVyYWwoKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5UYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24oZXhwciwgcXVhc2kpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gcHJldmlvdXNBbGxvd0luO1xuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTdXBlciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnc3VwZXInKTtcblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2goJ1snKSAmJiAhdGhpcy5tYXRjaCgnLicpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5TdXBlcigpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlTGVmdEhhbmRTaWRlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBhc3NlcnRfMS5hc3NlcnQodGhpcy5jb250ZXh0LmFsbG93SW4sICdjYWxsZWUgb2YgbmV3IGV4cHJlc3Npb24gYWx3YXlzIGFsbG93IGluIGtleXdvcmQuJyk7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSh0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgdmFyIGV4cHIgPSAodGhpcy5tYXRjaEtleXdvcmQoJ3N1cGVyJykgJiYgdGhpcy5jb250ZXh0LmluRnVuY3Rpb25Cb2R5KSA/IHRoaXMucGFyc2VTdXBlcigpIDpcblx0ICAgICAgICAgICAgdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMubWF0Y2hLZXl3b3JkKCduZXcnKSA/IHRoaXMucGFyc2VOZXdFeHByZXNzaW9uIDogdGhpcy5wYXJzZVByaW1hcnlFeHByZXNzaW9uKTtcblx0ICAgICAgICB3aGlsZSAodHJ1ZSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnWycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnWycpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCddJyk7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5Db21wdXRlZE1lbWJlckV4cHJlc3Npb24oZXhwciwgcHJvcGVydHkpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCcuJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcuJyk7XG5cdCAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlN0YXRpY01lbWJlckV4cHJlc3Npb24oZXhwciwgcHJvcGVydHkpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmxvb2thaGVhZC50eXBlID09PSAxMCAvKiBUZW1wbGF0ZSAqLyAmJiB0aGlzLmxvb2thaGVhZC5oZWFkKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcXVhc2kgPSB0aGlzLnBhcnNlVGVtcGxhdGVMaXRlcmFsKCk7XG5cdCAgICAgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5UYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24oZXhwciwgcXVhc2kpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXVwZGF0ZS1leHByZXNzaW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVVwZGF0ZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGV4cHI7XG5cdCAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnKysnKSB8fCB0aGlzLm1hdGNoKCctLScpKSB7XG5cdCAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbik7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZVVuYXJ5RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGV4cHIudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIgJiYgdGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQoZXhwci5uYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0TEhTUHJlZml4KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoIXRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRMSFNJbkFzc2lnbm1lbnQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBwcmVmaXggPSB0cnVlO1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5VcGRhdGVFeHByZXNzaW9uKHRva2VuLnZhbHVlLCBleHByLCBwcmVmaXgpKTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlTGVmdEhhbmRTaWRlRXhwcmVzc2lvbkFsbG93Q2FsbCk7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5oYXNMaW5lVGVybWluYXRvciAmJiB0aGlzLmxvb2thaGVhZC50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8pIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcrKycpIHx8IHRoaXMubWF0Y2goJy0tJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBleHByLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyICYmIHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKGV4cHIubmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0TEhTUG9zdGZpeCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkTEhTSW5Bc3NpZ25tZW50KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG9wZXJhdG9yID0gdGhpcy5uZXh0VG9rZW4oKS52YWx1ZTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZml4ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLlVwZGF0ZUV4cHJlc3Npb24ob3BlcmF0b3IsIGV4cHIsIHByZWZpeCkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXVuYXJ5LW9wZXJhdG9yc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUF3YWl0RXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdmFyIGFyZ3VtZW50ID0gdGhpcy5wYXJzZVVuYXJ5RXhwcmVzc2lvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkF3YWl0RXhwcmVzc2lvbihhcmd1bWVudCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VVbmFyeUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGV4cHI7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJysnKSB8fCB0aGlzLm1hdGNoKCctJykgfHwgdGhpcy5tYXRjaCgnficpIHx8IHRoaXMubWF0Y2goJyEnKSB8fFxuXHQgICAgICAgICAgICB0aGlzLm1hdGNoS2V5d29yZCgnZGVsZXRlJykgfHwgdGhpcy5tYXRjaEtleXdvcmQoJ3ZvaWQnKSB8fCB0aGlzLm1hdGNoS2V5d29yZCgndHlwZW9mJykpIHtcblx0ICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnN0YXJ0Tm9kZSh0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZVVuYXJ5RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlVuYXJ5RXhwcmVzc2lvbih0b2tlbi52YWx1ZSwgZXhwcikpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBleHByLm9wZXJhdG9yID09PSAnZGVsZXRlJyAmJiBleHByLmFyZ3VtZW50LnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3REZWxldGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQmluZGluZ0VsZW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodGhpcy5jb250ZXh0LmF3YWl0ICYmIHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnYXdhaXQnKSkge1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5wYXJzZUF3YWl0RXhwcmVzc2lvbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMucGFyc2VVcGRhdGVFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIgZXhwciA9IHRoaXMuaW5oZXJpdENvdmVyR3JhbW1hcih0aGlzLnBhcnNlVW5hcnlFeHByZXNzaW9uKTtcblx0ICAgICAgICBpZiAoZXhwci50eXBlICE9PSBzeW50YXhfMS5TeW50YXguVW5hcnlFeHByZXNzaW9uICYmIHRoaXMubWF0Y2goJyoqJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCA9IGZhbHNlO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgICB2YXIgbGVmdCA9IGV4cHI7XG5cdCAgICAgICAgICAgIHZhciByaWdodCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlRXhwb25lbnRpYXRpb25FeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLkJpbmFyeUV4cHJlc3Npb24oJyoqJywgbGVmdCwgcmlnaHQpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cHI7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZXhwLW9wZXJhdG9yXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tdWx0aXBsaWNhdGl2ZS1vcGVyYXRvcnNcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFkZGl0aXZlLW9wZXJhdG9yc1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYml0d2lzZS1zaGlmdC1vcGVyYXRvcnNcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlbGF0aW9uYWwtb3BlcmF0b3JzXG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lcXVhbGl0eS1vcGVyYXRvcnNcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWJpbmFyeS1iaXR3aXNlLW9wZXJhdG9yc1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYmluYXJ5LWxvZ2ljYWwtb3BlcmF0b3JzXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmJpbmFyeVByZWNlZGVuY2UgPSBmdW5jdGlvbiAodG9rZW4pIHtcblx0ICAgICAgICB2YXIgb3AgPSB0b2tlbi52YWx1ZTtcblx0ICAgICAgICB2YXIgcHJlY2VkZW5jZTtcblx0ICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gNyAvKiBQdW5jdHVhdG9yICovKSB7XG5cdCAgICAgICAgICAgIHByZWNlZGVuY2UgPSB0aGlzLm9wZXJhdG9yUHJlY2VkZW5jZVtvcF0gfHwgMDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSBpZiAodG9rZW4udHlwZSA9PT0gNCAvKiBLZXl3b3JkICovKSB7XG5cdCAgICAgICAgICAgIHByZWNlZGVuY2UgPSAob3AgPT09ICdpbnN0YW5jZW9mJyB8fCAodGhpcy5jb250ZXh0LmFsbG93SW4gJiYgb3AgPT09ICdpbicpKSA/IDcgOiAwO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgcHJlY2VkZW5jZSA9IDA7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBwcmVjZWRlbmNlO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VCaW5hcnlFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGFydFRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIGV4cHIgPSB0aGlzLmluaGVyaXRDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbik7XG5cdCAgICAgICAgdmFyIHRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIHByZWMgPSB0aGlzLmJpbmFyeVByZWNlZGVuY2UodG9rZW4pO1xuXHQgICAgICAgIGlmIChwcmVjID4gMCkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHZhciBtYXJrZXJzID0gW3N0YXJ0VG9rZW4sIHRoaXMubG9va2FoZWFkXTtcblx0ICAgICAgICAgICAgdmFyIGxlZnQgPSBleHByO1xuXHQgICAgICAgICAgICB2YXIgcmlnaHQgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgIHZhciBzdGFjayA9IFtsZWZ0LCB0b2tlbi52YWx1ZSwgcmlnaHRdO1xuXHQgICAgICAgICAgICB2YXIgcHJlY2VkZW5jZXMgPSBbcHJlY107XG5cdCAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICBwcmVjID0gdGhpcy5iaW5hcnlQcmVjZWRlbmNlKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgIGlmIChwcmVjIDw9IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIFJlZHVjZTogbWFrZSBhIGJpbmFyeSBleHByZXNzaW9uIGZyb20gdGhlIHRocmVlIHRvcG1vc3QgZW50cmllcy5cblx0ICAgICAgICAgICAgICAgIHdoaWxlICgoc3RhY2subGVuZ3RoID4gMikgJiYgKHByZWMgPD0gcHJlY2VkZW5jZXNbcHJlY2VkZW5jZXMubGVuZ3RoIC0gMV0pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgb3BlcmF0b3IgPSBzdGFjay5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICBwcmVjZWRlbmNlcy5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gc3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgbWFya2Vycy5wb3AoKTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKG1hcmtlcnNbbWFya2Vycy5sZW5ndGggLSAxXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkJpbmFyeUV4cHJlc3Npb24ob3BlcmF0b3IsIGxlZnQsIHJpZ2h0KSkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy8gU2hpZnQuXG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMubmV4dFRva2VuKCkudmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgcHJlY2VkZW5jZXMucHVzaChwcmVjKTtcblx0ICAgICAgICAgICAgICAgIG1hcmtlcnMucHVzaCh0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlRXhwb25lbnRpYXRpb25FeHByZXNzaW9uKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gRmluYWwgcmVkdWNlIHRvIGNsZWFuLXVwIHRoZSBzdGFjay5cblx0ICAgICAgICAgICAgdmFyIGkgPSBzdGFjay5sZW5ndGggLSAxO1xuXHQgICAgICAgICAgICBleHByID0gc3RhY2tbaV07XG5cdCAgICAgICAgICAgIHZhciBsYXN0TWFya2VyID0gbWFya2Vycy5wb3AoKTtcblx0ICAgICAgICAgICAgd2hpbGUgKGkgPiAxKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWFya2VyID0gbWFya2Vycy5wb3AoKTtcblx0ICAgICAgICAgICAgICAgIHZhciBsYXN0TGluZVN0YXJ0ID0gbGFzdE1hcmtlciAmJiBsYXN0TWFya2VyLmxpbmVTdGFydDtcblx0ICAgICAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5zdGFydE5vZGUobWFya2VyLCBsYXN0TGluZVN0YXJ0KTtcblx0ICAgICAgICAgICAgICAgIHZhciBvcGVyYXRvciA9IHN0YWNrW2kgLSAxXTtcblx0ICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkJpbmFyeUV4cHJlc3Npb24ob3BlcmF0b3IsIHN0YWNrW2kgLSAyXSwgZXhwcikpO1xuXHQgICAgICAgICAgICAgICAgaSAtPSAyO1xuXHQgICAgICAgICAgICAgICAgbGFzdE1hcmtlciA9IG1hcmtlcjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZXhwcjtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jb25kaXRpb25hbC1vcGVyYXRvclxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNvbmRpdGlvbmFsRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnRUb2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHZhciBleHByID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VCaW5hcnlFeHByZXNzaW9uKTtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnPycpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHZhciBwcmV2aW91c0FsbG93SW4gPSB0aGlzLmNvbnRleHQuYWxsb3dJbjtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSB0cnVlO1xuXHQgICAgICAgICAgICB2YXIgY29uc2VxdWVudCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IHByZXZpb3VzQWxsb3dJbjtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJzonKTtcblx0ICAgICAgICAgICAgdmFyIGFsdGVybmF0ZSA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuQ29uZGl0aW9uYWxFeHByZXNzaW9uKGV4cHIsIGNvbnNlcXVlbnQsIGFsdGVybmF0ZSkpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFzc2lnbm1lbnQtb3BlcmF0b3JzXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLmNoZWNrUGF0dGVyblBhcmFtID0gZnVuY3Rpb24gKG9wdGlvbnMsIHBhcmFtKSB7XG5cdCAgICAgICAgc3dpdGNoIChwYXJhbS50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXI6XG5cdCAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGFyYW0ob3B0aW9ucywgcGFyYW0sIHBhcmFtLm5hbWUpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LlJlc3RFbGVtZW50OlxuXHQgICAgICAgICAgICAgICAgdGhpcy5jaGVja1BhdHRlcm5QYXJhbShvcHRpb25zLCBwYXJhbS5hcmd1bWVudCk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBzeW50YXhfMS5TeW50YXguQXNzaWdubWVudFBhdHRlcm46XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUGF0dGVyblBhcmFtKG9wdGlvbnMsIHBhcmFtLmxlZnQpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4LkFycmF5UGF0dGVybjpcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW0uZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0uZWxlbWVudHNbaV0gIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1BhdHRlcm5QYXJhbShvcHRpb25zLCBwYXJhbS5lbGVtZW50c1tpXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2Ugc3ludGF4XzEuU3ludGF4Lk9iamVjdFBhdHRlcm46XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUGF0dGVyblBhcmFtKG9wdGlvbnMsIHBhcmFtLnByb3BlcnRpZXNbaV0udmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICAgICAgb3B0aW9ucy5zaW1wbGUgPSBvcHRpb25zLnNpbXBsZSAmJiAocGFyYW0gaW5zdGFuY2VvZiBOb2RlLklkZW50aWZpZXIpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucmVpbnRlcnByZXRBc0NvdmVyRm9ybWFsc0xpc3QgPSBmdW5jdGlvbiAoZXhwcikge1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSBbZXhwcl07XG5cdCAgICAgICAgdmFyIG9wdGlvbnM7XG5cdCAgICAgICAgdmFyIGFzeW5jQXJyb3cgPSBmYWxzZTtcblx0ICAgICAgICBzd2l0Y2ggKGV4cHIudHlwZSkge1xuXHQgICAgICAgICAgICBjYXNlIHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyOlxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcjpcblx0ICAgICAgICAgICAgICAgIHBhcmFtcyA9IGV4cHIucGFyYW1zO1xuXHQgICAgICAgICAgICAgICAgYXN5bmNBcnJvdyA9IGV4cHIuYXN5bmM7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBvcHRpb25zID0ge1xuXHQgICAgICAgICAgICBzaW1wbGU6IHRydWUsXG5cdCAgICAgICAgICAgIHBhcmFtU2V0OiB7fVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyArK2kpIHtcblx0ICAgICAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW2ldO1xuXHQgICAgICAgICAgICBpZiAocGFyYW0udHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRQYXR0ZXJuKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAocGFyYW0ucmlnaHQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LllpZWxkRXhwcmVzc2lvbikge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5yaWdodC5hcmd1bWVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgcGFyYW0ucmlnaHQudHlwZSA9IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyO1xuXHQgICAgICAgICAgICAgICAgICAgIHBhcmFtLnJpZ2h0Lm5hbWUgPSAneWllbGQnO1xuXHQgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJhbS5yaWdodC5hcmd1bWVudDtcblx0ICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFyYW0ucmlnaHQuZGVsZWdhdGU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoYXN5bmNBcnJvdyAmJiBwYXJhbS50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllciAmJiBwYXJhbS5uYW1lID09PSAnYXdhaXQnKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLmNoZWNrUGF0dGVyblBhcmFtKG9wdGlvbnMsIHBhcmFtKTtcblx0ICAgICAgICAgICAgcGFyYW1zW2ldID0gcGFyYW07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0IHx8ICF0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7ICsraSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW2ldO1xuXHQgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5ZaWVsZEV4cHJlc3Npb24pIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAob3B0aW9ucy5tZXNzYWdlID09PSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFBhcmFtRHVwZSkge1xuXHQgICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmNvbnRleHQuc3RyaWN0ID8gb3B0aW9ucy5zdHJpY3RlZCA6IG9wdGlvbnMuZmlyc3RSZXN0cmljdGVkO1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRva2VuLCBvcHRpb25zLm1lc3NhZ2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICBzaW1wbGU6IG9wdGlvbnMuc2ltcGxlLFxuXHQgICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcblx0ICAgICAgICAgICAgc3RyaWN0ZWQ6IG9wdGlvbnMuc3RyaWN0ZWQsXG5cdCAgICAgICAgICAgIGZpcnN0UmVzdHJpY3RlZDogb3B0aW9ucy5maXJzdFJlc3RyaWN0ZWQsXG5cdCAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMubWVzc2FnZVxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBleHByO1xuXHQgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmFsbG93WWllbGQgJiYgdGhpcy5tYXRjaEtleXdvcmQoJ3lpZWxkJykpIHtcblx0ICAgICAgICAgICAgZXhwciA9IHRoaXMucGFyc2VZaWVsZEV4cHJlc3Npb24oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBzdGFydFRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHN0YXJ0VG9rZW47XG5cdCAgICAgICAgICAgIGV4cHIgPSB0aGlzLnBhcnNlQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgKHRva2VuLmxpbmVOdW1iZXIgPT09IHRoaXMubG9va2FoZWFkLmxpbmVOdW1iZXIpICYmIHRva2VuLnZhbHVlID09PSAnYXN5bmMnKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovIHx8IHRoaXMubWF0Y2hLZXl3b3JkKCd5aWVsZCcpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGFyZyA9IHRoaXMucGFyc2VQcmltYXJ5RXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGFyZyk7XG5cdCAgICAgICAgICAgICAgICAgICAgZXhwciA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXJyb3dQYXJhbWV0ZXJQbGFjZUhvbGRlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBbYXJnXSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6IHRydWVcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChleHByLnR5cGUgPT09IEFycm93UGFyYW1ldGVyUGxhY2VIb2xkZXIgfHwgdGhpcy5tYXRjaCgnPT4nKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyb3ctZnVuY3Rpb24tZGVmaW5pdGlvbnNcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0Fzc2lnbm1lbnRUYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB2YXIgaXNBc3luYyA9IGV4cHIuYXN5bmM7XG5cdCAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IHRoaXMucmVpbnRlcnByZXRBc0NvdmVyRm9ybWFsc0xpc3QoZXhwcik7XG5cdCAgICAgICAgICAgICAgICBpZiAobGlzdCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0xpbmVUZXJtaW5hdG9yKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNTdHJpY3QgPSB0aGlzLmNvbnRleHQuc3RyaWN0O1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlID0gdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZSA9IGxpc3Quc2ltcGxlO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNBd2FpdCA9IHRoaXMuY29udGV4dC5hd2FpdDtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmF3YWl0ID0gaXNBc3luYztcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0KCc9PicpO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBib2R5ID0gdm9pZCAwO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCd7JykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dJbiA9IHRoaXMuY29udGV4dC5hbGxvd0luO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLnBhcnNlRnVuY3Rpb25Tb3VyY2VFbGVtZW50cygpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IHByZXZpb3VzQWxsb3dJbjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSBib2R5LnR5cGUgIT09IHN5bnRheF8xLlN5bnRheC5CbG9ja1N0YXRlbWVudDtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBsaXN0LmZpcnN0UmVzdHJpY3RlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKGxpc3QuZmlyc3RSZXN0cmljdGVkLCBsaXN0Lm1lc3NhZ2UpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBsaXN0LnN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4obGlzdC5zdHJpY3RlZCwgbGlzdC5tZXNzYWdlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZXhwciA9IGlzQXN5bmMgPyB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkFzeW5jQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24obGlzdC5wYXJhbXMsIGJvZHksIGV4cHJlc3Npb24pKSA6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24obGlzdC5wYXJhbXMsIGJvZHksIGV4cHJlc3Npb24pKTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gcHJldmlvdXNTdHJpY3Q7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBwcmV2aW91c0F3YWl0O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hBc3NpZ24oKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkTEhTSW5Bc3NpZ25tZW50KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgZXhwci50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBleHByO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQoaWQubmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0TEhTQXNzaWdubWVudCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQoaWQubmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UmVzZXJ2ZWRXb3JkKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJz0nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5pc0JpbmRpbmdFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlaW50ZXJwcmV0RXhwcmVzc2lvbkFzUGF0dGVybihleHByKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBvcGVyYXRvciA9IHRva2VuLnZhbHVlO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciByaWdodCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgICAgIGV4cHIgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKHN0YXJ0VG9rZW4pLCBuZXcgTm9kZS5Bc3NpZ25tZW50RXhwcmVzc2lvbihvcGVyYXRvciwgZXhwciwgcmlnaHQpKTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZmlyc3RDb3ZlckluaXRpYWxpemVkTmFtZUVycm9yID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZXhwcjtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jb21tYS1vcGVyYXRvclxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUV4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICB2YXIgZXhwciA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgdmFyIGV4cHJlc3Npb25zID0gW107XG5cdCAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2goZXhwcik7XG5cdCAgICAgICAgICAgIHdoaWxlICh0aGlzLmxvb2thaGVhZC50eXBlICE9PSAyIC8qIEVPRiAqLykge1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBleHByID0gdGhpcy5maW5hbGl6ZSh0aGlzLnN0YXJ0Tm9kZShzdGFydFRva2VuKSwgbmV3IE5vZGUuU2VxdWVuY2VFeHByZXNzaW9uKGV4cHJlc3Npb25zKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBleHByO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWJsb2NrXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXRlbWVudDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaXNCaW5kaW5nRWxlbWVudCA9IHRydWU7XG5cdCAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDQgLyogS2V5d29yZCAqLykge1xuXHQgICAgICAgICAgICBzd2l0Y2ggKHRoaXMubG9va2FoZWFkLnZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdleHBvcnQnOlxuXHQgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzTW9kdWxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQsIG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbEV4cG9ydERlY2xhcmF0aW9uKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUV4cG9ydERlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdpbXBvcnQnOlxuXHQgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzTW9kdWxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5sb29rYWhlYWQsIG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbEltcG9ydERlY2xhcmF0aW9uKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUltcG9ydERlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdjb25zdCc6XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUxleGljYWxEZWNsYXJhdGlvbih7IGluRm9yOiBmYWxzZSB9KTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcblx0ICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgY2FzZSAnY2xhc3MnOlxuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VDbGFzc0RlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdsZXQnOlxuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMuaXNMZXhpY2FsRGVjbGFyYXRpb24oKSA/IHRoaXMucGFyc2VMZXhpY2FsRGVjbGFyYXRpb24oeyBpbkZvcjogZmFsc2UgfSkgOiB0aGlzLnBhcnNlU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gc3RhdGVtZW50O1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VCbG9jayA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG5cdCAgICAgICAgdmFyIGJsb2NrID0gW107XG5cdCAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgYmxvY2sucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQmxvY2tTdGF0ZW1lbnQoYmxvY2spKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1sZXQtYW5kLWNvbnN0LWRlY2xhcmF0aW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUxleGljYWxCaW5kaW5nID0gZnVuY3Rpb24gKGtpbmQsIG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBwYXJhbXMgPSBbXTtcblx0ICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcnNlUGF0dGVybihwYXJhbXMsIGtpbmQpO1xuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGlkLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZChpZC5uYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0VmFyTmFtZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGluaXQgPSBudWxsO1xuXHQgICAgICAgIGlmIChraW5kID09PSAnY29uc3QnKSB7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaEtleXdvcmQoJ2luJykgJiYgIXRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnb2YnKSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJz0nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuRGVjbGFyYXRpb25NaXNzaW5nSW5pdGlhbGl6ZXIsICdjb25zdCcpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKCghb3B0aW9ucy5pbkZvciAmJiBpZC50eXBlICE9PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcikgfHwgdGhpcy5tYXRjaCgnPScpKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCc9Jyk7XG5cdCAgICAgICAgICAgIGluaXQgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdG9yKGlkLCBpbml0KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUJpbmRpbmdMaXN0ID0gZnVuY3Rpb24gKGtpbmQsIG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgbGlzdCA9IFt0aGlzLnBhcnNlTGV4aWNhbEJpbmRpbmcoa2luZCwgb3B0aW9ucyldO1xuXHQgICAgICAgIHdoaWxlICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgbGlzdC5wdXNoKHRoaXMucGFyc2VMZXhpY2FsQmluZGluZyhraW5kLCBvcHRpb25zKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBsaXN0O1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUuaXNMZXhpY2FsRGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5zY2FubmVyLnNhdmVTdGF0ZSgpO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTtcblx0ICAgICAgICB2YXIgbmV4dCA9IHRoaXMuc2Nhbm5lci5sZXgoKTtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIucmVzdG9yZVN0YXRlKHN0YXRlKTtcblx0ICAgICAgICByZXR1cm4gKG5leHQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovKSB8fFxuXHQgICAgICAgICAgICAobmV4dC50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8gJiYgbmV4dC52YWx1ZSA9PT0gJ1snKSB8fFxuXHQgICAgICAgICAgICAobmV4dC50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8gJiYgbmV4dC52YWx1ZSA9PT0gJ3snKSB8fFxuXHQgICAgICAgICAgICAobmV4dC50eXBlID09PSA0IC8qIEtleXdvcmQgKi8gJiYgbmV4dC52YWx1ZSA9PT0gJ2xldCcpIHx8XG5cdCAgICAgICAgICAgIChuZXh0LnR5cGUgPT09IDQgLyogS2V5d29yZCAqLyAmJiBuZXh0LnZhbHVlID09PSAneWllbGQnKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlTGV4aWNhbERlY2xhcmF0aW9uID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBraW5kID0gdGhpcy5uZXh0VG9rZW4oKS52YWx1ZTtcblx0ICAgICAgICBhc3NlcnRfMS5hc3NlcnQoa2luZCA9PT0gJ2xldCcgfHwga2luZCA9PT0gJ2NvbnN0JywgJ0xleGljYWwgZGVjbGFyYXRpb24gbXVzdCBiZSBlaXRoZXIgbGV0IG9yIGNvbnN0Jyk7XG5cdCAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHRoaXMucGFyc2VCaW5kaW5nTGlzdChraW5kLCBvcHRpb25zKTtcblx0ICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5WYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9ucywga2luZCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWRlc3RydWN0dXJpbmctYmluZGluZy1wYXR0ZXJuc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUJpbmRpbmdSZXN0RWxlbWVudCA9IGZ1bmN0aW9uIChwYXJhbXMsIGtpbmQpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcuLi4nKTtcblx0ICAgICAgICB2YXIgYXJnID0gdGhpcy5wYXJzZVBhdHRlcm4ocGFyYW1zLCBraW5kKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5SZXN0RWxlbWVudChhcmcpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQXJyYXlQYXR0ZXJuID0gZnVuY3Rpb24gKHBhcmFtcywga2luZCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ1snKTtcblx0ICAgICAgICB2YXIgZWxlbWVudHMgPSBbXTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2goJ10nKSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnLCcpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaChudWxsKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcuLi4nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2godGhpcy5wYXJzZUJpbmRpbmdSZXN0RWxlbWVudChwYXJhbXMsIGtpbmQpKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2godGhpcy5wYXJzZVBhdHRlcm5XaXRoRGVmYXVsdChwYXJhbXMsIGtpbmQpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnXScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJywnKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnXScpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkFycmF5UGF0dGVybihlbGVtZW50cykpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VQcm9wZXJ0eVBhdHRlcm4gPSBmdW5jdGlvbiAocGFyYW1zLCBraW5kKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgY29tcHV0ZWQgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgc2hvcnRoYW5kID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIG1ldGhvZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBrZXk7XG5cdCAgICAgICAgdmFyIHZhbHVlO1xuXHQgICAgICAgIGlmICh0aGlzLmxvb2thaGVhZC50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pIHtcblx0ICAgICAgICAgICAgdmFyIGtleVRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgdmFyIGluaXQgPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIoa2V5VG9rZW4udmFsdWUpKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJz0nKSkge1xuXHQgICAgICAgICAgICAgICAgcGFyYW1zLnB1c2goa2V5VG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgc2hvcnRoYW5kID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICB2YXIgZXhwciA9IHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKGtleVRva2VuKSwgbmV3IE5vZGUuQXNzaWdubWVudFBhdHRlcm4oaW5pdCwgZXhwcikpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLm1hdGNoKCc6JykpIHtcblx0ICAgICAgICAgICAgICAgIHBhcmFtcy5wdXNoKGtleVRva2VuKTtcblx0ICAgICAgICAgICAgICAgIHNob3J0aGFuZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IGluaXQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnOicpO1xuXHQgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlUGF0dGVybldpdGhEZWZhdWx0KHBhcmFtcywga2luZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJzonKTtcblx0ICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlUGF0dGVybldpdGhEZWZhdWx0KHBhcmFtcywga2luZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlByb3BlcnR5KCdpbml0Jywga2V5LCBjb21wdXRlZCwgdmFsdWUsIG1ldGhvZCwgc2hvcnRoYW5kKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU9iamVjdFBhdHRlcm4gPSBmdW5jdGlvbiAocGFyYW1zLCBraW5kKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgcHJvcGVydGllcyA9IFtdO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd7Jyk7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKHRoaXMucGFyc2VQcm9wZXJ0eVBhdHRlcm4ocGFyYW1zLCBraW5kKSk7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuT2JqZWN0UGF0dGVybihwcm9wZXJ0aWVzKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVBhdHRlcm4gPSBmdW5jdGlvbiAocGFyYW1zLCBraW5kKSB7XG5cdCAgICAgICAgdmFyIHBhdHRlcm47XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJ1snKSkge1xuXHQgICAgICAgICAgICBwYXR0ZXJuID0gdGhpcy5wYXJzZUFycmF5UGF0dGVybihwYXJhbXMsIGtpbmQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCd7JykpIHtcblx0ICAgICAgICAgICAgcGF0dGVybiA9IHRoaXMucGFyc2VPYmplY3RQYXR0ZXJuKHBhcmFtcywga2luZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ2xldCcpICYmIChraW5kID09PSAnY29uc3QnIHx8IGtpbmQgPT09ICdsZXQnKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCwgbWVzc2FnZXNfMS5NZXNzYWdlcy5MZXRJbkxleGljYWxCaW5kaW5nKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBwYXJhbXMucHVzaCh0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIHBhdHRlcm4gPSB0aGlzLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyKGtpbmQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcGF0dGVybjtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlUGF0dGVybldpdGhEZWZhdWx0ID0gZnVuY3Rpb24gKHBhcmFtcywga2luZCkge1xuXHQgICAgICAgIHZhciBzdGFydFRva2VuID0gdGhpcy5sb29rYWhlYWQ7XG5cdCAgICAgICAgdmFyIHBhdHRlcm4gPSB0aGlzLnBhcnNlUGF0dGVybihwYXJhbXMsIGtpbmQpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCc9JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dZaWVsZCA9IHRoaXMuY29udGV4dC5hbGxvd1lpZWxkO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHRydWU7XG5cdCAgICAgICAgICAgIHZhciByaWdodCA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24pO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICAgICAgcGF0dGVybiA9IHRoaXMuZmluYWxpemUodGhpcy5zdGFydE5vZGUoc3RhcnRUb2tlbiksIG5ldyBOb2RlLkFzc2lnbm1lbnRQYXR0ZXJuKHBhdHRlcm4sIHJpZ2h0KSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBwYXR0ZXJuO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXZhcmlhYmxlLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVZhcmlhYmxlSWRlbnRpZmllciA9IGZ1bmN0aW9uIChraW5kKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA0IC8qIEtleXdvcmQgKi8gJiYgdG9rZW4udmFsdWUgPT09ICd5aWVsZCcpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UmVzZXJ2ZWRXb3JkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5jb250ZXh0LmFsbG93WWllbGQpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgIT09IDMgLyogSWRlbnRpZmllciAqLykge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiB0b2tlbi50eXBlID09PSA0IC8qIEtleXdvcmQgKi8gJiYgdGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UmVzZXJ2ZWRXb3JkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0IHx8IHRva2VuLnZhbHVlICE9PSAnbGV0JyB8fCBraW5kICE9PSAndmFyJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKCh0aGlzLmNvbnRleHQuaXNNb2R1bGUgfHwgdGhpcy5jb250ZXh0LmF3YWl0KSAmJiB0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8gJiYgdG9rZW4udmFsdWUgPT09ICdhd2FpdCcpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLklkZW50aWZpZXIodG9rZW4udmFsdWUpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgcGFyYW1zID0gW107XG5cdCAgICAgICAgdmFyIGlkID0gdGhpcy5wYXJzZVBhdHRlcm4ocGFyYW1zLCAndmFyJyk7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgaWQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKGlkLm5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RWYXJOYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJz0nKSkge1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBpbml0ID0gdGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKGlkLnR5cGUgIT09IHN5bnRheF8xLlN5bnRheC5JZGVudGlmaWVyICYmICFvcHRpb25zLmluRm9yKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCc9Jyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRvcihpZCwgaW5pdCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIG9wdCA9IHsgaW5Gb3I6IG9wdGlvbnMuaW5Gb3IgfTtcblx0ICAgICAgICB2YXIgbGlzdCA9IFtdO1xuXHQgICAgICAgIGxpc3QucHVzaCh0aGlzLnBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbihvcHQpKTtcblx0ICAgICAgICB3aGlsZSAodGhpcy5tYXRjaCgnLCcpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGxpc3QucHVzaCh0aGlzLnBhcnNlVmFyaWFibGVEZWNsYXJhdGlvbihvcHQpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGxpc3Q7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVZhcmlhYmxlU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCd2YXInKTtcblx0ICAgICAgICB2YXIgZGVjbGFyYXRpb25zID0gdGhpcy5wYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KHsgaW5Gb3I6IGZhbHNlIH0pO1xuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCAndmFyJykpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVtcHR5LXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUVtcHR5U3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJzsnKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5FbXB0eVN0YXRlbWVudCgpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1leHByZXNzaW9uLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUV4cHJlc3Npb25TdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwcmVzc2lvblN0YXRlbWVudChleHByKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaWYtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlSWZDbGF1c2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgdGhpcy5tYXRjaEtleXdvcmQoJ2Z1bmN0aW9uJykpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0RnVuY3Rpb24pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VJZlN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBjb25zZXF1ZW50O1xuXHQgICAgICAgIHZhciBhbHRlcm5hdGUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnaWYnKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKCcpO1xuXHQgICAgICAgIHZhciB0ZXN0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2goJyknKSAmJiB0aGlzLmNvbmZpZy50b2xlcmFudCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgICAgICBjb25zZXF1ZW50ID0gdGhpcy5maW5hbGl6ZSh0aGlzLmNyZWF0ZU5vZGUoKSwgbmV3IE5vZGUuRW1wdHlTdGF0ZW1lbnQoKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgICAgICBjb25zZXF1ZW50ID0gdGhpcy5wYXJzZUlmQ2xhdXNlKCk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnZWxzZScpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgYWx0ZXJuYXRlID0gdGhpcy5wYXJzZUlmQ2xhdXNlKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSWZTdGF0ZW1lbnQodGVzdCwgY29uc2VxdWVudCwgYWx0ZXJuYXRlKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZG8td2hpbGUtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRG9XaGlsZVN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnZG8nKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNJbkl0ZXJhdGlvbiA9IHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbjtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gPSB0cnVlO1xuXHQgICAgICAgIHZhciBib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiA9IHByZXZpb3VzSW5JdGVyYXRpb247XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCd3aGlsZScpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgdmFyIHRlc3QgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpICYmIHRoaXMuY29uZmlnLnRvbGVyYW50KSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnOycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkRvV2hpbGVTdGF0ZW1lbnQoYm9keSwgdGVzdCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXdoaWxlLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVdoaWxlU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGJvZHk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCd3aGlsZScpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgdmFyIHRlc3QgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKScpICYmIHRoaXMuY29uZmlnLnRvbGVyYW50KSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odGhpcy5uZXh0VG9rZW4oKSk7XG5cdCAgICAgICAgICAgIGJvZHkgPSB0aGlzLmZpbmFsaXplKHRoaXMuY3JlYXRlTm9kZSgpLCBuZXcgTm9kZS5FbXB0eVN0YXRlbWVudCgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgICAgIHZhciBwcmV2aW91c0luSXRlcmF0aW9uID0gdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gPSB0cnVlO1xuXHQgICAgICAgICAgICBib2R5ID0gdGhpcy5wYXJzZVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gPSBwcmV2aW91c0luSXRlcmF0aW9uO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5XaGlsZVN0YXRlbWVudCh0ZXN0LCBib2R5KSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZm9yLXN0YXRlbWVudFxuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZm9yLWluLWFuZC1mb3Itb2Ytc3RhdGVtZW50c1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZvclN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgdmFyIHRlc3QgPSBudWxsO1xuXHQgICAgICAgIHZhciB1cGRhdGUgPSBudWxsO1xuXHQgICAgICAgIHZhciBmb3JJbiA9IHRydWU7XG5cdCAgICAgICAgdmFyIGxlZnQsIHJpZ2h0O1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdmb3InKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKCcpO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCc7JykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgndmFyJykpIHtcblx0ICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNBbGxvd0luID0gdGhpcy5jb250ZXh0LmFsbG93SW47XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHRoaXMucGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uTGlzdCh7IGluRm9yOiB0cnVlIH0pO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93SW4gPSBwcmV2aW91c0FsbG93SW47XG5cdCAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMSAmJiB0aGlzLm1hdGNoS2V5d29yZCgnaW4nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBkZWNsID0gZGVjbGFyYXRpb25zWzBdO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChkZWNsLmluaXQgJiYgKGRlY2wuaWQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LkFycmF5UGF0dGVybiB8fCBkZWNsLmlkLnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5PYmplY3RQYXR0ZXJuIHx8IHRoaXMuY29udGV4dC5zdHJpY3QpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkZvckluT2ZMb29wSW5pdGlhbGl6ZXIsICdmb3ItaW4nKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUoaW5pdCwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsICd2YXInKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gaW5pdDtcblx0ICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxICYmIGRlY2xhcmF0aW9uc1swXS5pbml0ID09PSBudWxsICYmIHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnb2YnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmZpbmFsaXplKGluaXQsIG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCAndmFyJykpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGluaXQ7XG5cdCAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICBpbml0ID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgICAgICBmb3JJbiA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUoaW5pdCwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsICd2YXInKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJzsnKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnY29uc3QnKSB8fCB0aGlzLm1hdGNoS2V5d29yZCgnbGV0JykpIHtcblx0ICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICAgICAgICAgIHZhciBraW5kID0gdGhpcy5uZXh0VG9rZW4oKS52YWx1ZTtcblx0ICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LnN0cmljdCAmJiB0aGlzLmxvb2thaGVhZC52YWx1ZSA9PT0gJ2luJykge1xuXHQgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmZpbmFsaXplKGluaXQsIG5ldyBOb2RlLklkZW50aWZpZXIoa2luZCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGluaXQ7XG5cdCAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIGluaXQgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dJbiA9IHRoaXMuY29udGV4dC5hbGxvd0luO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9ucyA9IHRoaXMucGFyc2VCaW5kaW5nTGlzdChraW5kLCB7IGluRm9yOiB0cnVlIH0pO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gcHJldmlvdXNBbGxvd0luO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxICYmIGRlY2xhcmF0aW9uc1swXS5pbml0ID09PSBudWxsICYmIHRoaXMubWF0Y2hLZXl3b3JkKCdpbicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmZpbmFsaXplKGluaXQsIG5ldyBOb2RlLlZhcmlhYmxlRGVjbGFyYXRpb24oZGVjbGFyYXRpb25zLCBraW5kKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBpbml0O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWNsYXJhdGlvbnMubGVuZ3RoID09PSAxICYmIGRlY2xhcmF0aW9uc1swXS5pbml0ID09PSBudWxsICYmIHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnb2YnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gdGhpcy5maW5hbGl6ZShpbml0LCBuZXcgTm9kZS5WYXJpYWJsZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9ucywga2luZCkpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gaW5pdDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGZvckluID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRoaXMuZmluYWxpemUoaW5pdCwgbmV3IE5vZGUuVmFyaWFibGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbnMsIGtpbmQpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgaW5pdFN0YXJ0VG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c0FsbG93SW4gPSB0aGlzLmNvbnRleHQuYWxsb3dJbjtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd0luID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBpbml0ID0gdGhpcy5pbmhlcml0Q292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbik7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dJbiA9IHByZXZpb3VzQWxsb3dJbjtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnaW4nKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0LmlzQXNzaWdubWVudFRhcmdldCB8fCBpbml0LnR5cGUgPT09IHN5bnRheF8xLlN5bnRheC5Bc3NpZ25tZW50RXhwcmVzc2lvbikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkTEhTSW5Gb3JJbik7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWludGVycHJldEV4cHJlc3Npb25Bc1BhdHRlcm4oaW5pdCk7XG5cdCAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGluaXQ7XG5cdCAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIGluaXQgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdvZicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaXNBc3NpZ25tZW50VGFyZ2V0IHx8IGluaXQudHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LkFzc2lnbm1lbnRFeHByZXNzaW9uKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRMSFNJbkZvckxvb3ApO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMucmVpbnRlcnByZXRFeHByZXNzaW9uQXNQYXR0ZXJuKGluaXQpO1xuXHQgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBpbml0O1xuXHQgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaW5pdCA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICAgICAgZm9ySW4gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluaXRTZXEgPSBbaW5pdF07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLm1hdGNoKCcsJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VxLnB1c2godGhpcy5pc29sYXRlQ292ZXJHcmFtbWFyKHRoaXMucGFyc2VBc3NpZ25tZW50RXhwcmVzc2lvbikpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSB0aGlzLmZpbmFsaXplKHRoaXMuc3RhcnROb2RlKGluaXRTdGFydFRva2VuKSwgbmV3IE5vZGUuU2VxdWVuY2VFeHByZXNzaW9uKGluaXRTZXEpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJzsnKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodHlwZW9mIGxlZnQgPT09ICd1bmRlZmluZWQnKSB7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnOycpKSB7XG5cdCAgICAgICAgICAgICAgICB0ZXN0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnOycpO1xuXHQgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICAgICAgdXBkYXRlID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgYm9keTtcblx0ICAgICAgICBpZiAoIXRoaXMubWF0Y2goJyknKSAmJiB0aGlzLmNvbmZpZy50b2xlcmFudCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgICAgICBib2R5ID0gdGhpcy5maW5hbGl6ZSh0aGlzLmNyZWF0ZU5vZGUoKSwgbmV3IE5vZGUuRW1wdHlTdGF0ZW1lbnQoKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgICAgICB2YXIgcHJldmlvdXNJbkl0ZXJhdGlvbiA9IHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbjtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uID0gdHJ1ZTtcblx0ICAgICAgICAgICAgYm9keSA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlU3RhdGVtZW50KTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uID0gcHJldmlvdXNJbkl0ZXJhdGlvbjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuICh0eXBlb2YgbGVmdCA9PT0gJ3VuZGVmaW5lZCcpID9cblx0ICAgICAgICAgICAgdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5Gb3JTdGF0ZW1lbnQoaW5pdCwgdGVzdCwgdXBkYXRlLCBib2R5KSkgOlxuXHQgICAgICAgICAgICBmb3JJbiA/IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRm9ySW5TdGF0ZW1lbnQobGVmdCwgcmlnaHQsIGJvZHkpKSA6XG5cdCAgICAgICAgICAgICAgICB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkZvck9mU3RhdGVtZW50KGxlZnQsIHJpZ2h0LCBib2R5KSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtY29udGludWUtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQ29udGludWVTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2NvbnRpbnVlJyk7XG5cdCAgICAgICAgdmFyIGxhYmVsID0gbnVsbDtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovICYmICF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yKSB7XG5cdCAgICAgICAgICAgIHZhciBpZCA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgbGFiZWwgPSBpZDtcblx0ICAgICAgICAgICAgdmFyIGtleSA9ICckJyArIGlkLm5hbWU7XG5cdCAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29udGV4dC5sYWJlbFNldCwga2V5KSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5rbm93bkxhYmVsLCBpZC5uYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICBpZiAobGFiZWwgPT09IG51bGwgJiYgIXRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbikge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsQ29udGludWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5Db250aW51ZVN0YXRlbWVudChsYWJlbCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWJyZWFrLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUJyZWFrU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdicmVhaycpO1xuXHQgICAgICAgIHZhciBsYWJlbCA9IG51bGw7XG5cdCAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLyAmJiAhdGhpcy5oYXNMaW5lVGVybWluYXRvcikge1xuXHQgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIHZhciBrZXkgPSAnJCcgKyBpZC5uYW1lO1xuXHQgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmNvbnRleHQubGFiZWxTZXQsIGtleSkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLlVua25vd25MYWJlbCwgaWQubmFtZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgbGFiZWwgPSBpZDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgaWYgKGxhYmVsID09PSBudWxsICYmICF0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gJiYgIXRoaXMuY29udGV4dC5pblN3aXRjaCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsQnJlYWspO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5CcmVha1N0YXRlbWVudChsYWJlbCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJldHVybi1zdGF0ZW1lbnRcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VSZXR1cm5TdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbFJldHVybik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdyZXR1cm4nKTtcblx0ICAgICAgICB2YXIgaGFzQXJndW1lbnQgPSAoIXRoaXMubWF0Y2goJzsnKSAmJiAhdGhpcy5tYXRjaCgnfScpICYmXG5cdCAgICAgICAgICAgICF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yICYmIHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovKSB8fFxuXHQgICAgICAgICAgICB0aGlzLmxvb2thaGVhZC50eXBlID09PSA4IC8qIFN0cmluZ0xpdGVyYWwgKi8gfHxcblx0ICAgICAgICAgICAgdGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMTAgLyogVGVtcGxhdGUgKi87XG5cdCAgICAgICAgdmFyIGFyZ3VtZW50ID0gaGFzQXJndW1lbnQgPyB0aGlzLnBhcnNlRXhwcmVzc2lvbigpIDogbnVsbDtcblx0ICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5SZXR1cm5TdGF0ZW1lbnQoYXJndW1lbnQpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy13aXRoLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVdpdGhTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0TW9kZVdpdGgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBib2R5O1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnd2l0aCcpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgdmFyIG9iamVjdCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykgJiYgdGhpcy5jb25maWcudG9sZXJhbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICAgICAgYm9keSA9IHRoaXMuZmluYWxpemUodGhpcy5jcmVhdGVOb2RlKCksIG5ldyBOb2RlLkVtcHR5U3RhdGVtZW50KCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJyknKTtcblx0ICAgICAgICAgICAgYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuV2l0aFN0YXRlbWVudChvYmplY3QsIGJvZHkpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zd2l0Y2gtc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlU3dpdGNoQ2FzZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciB0ZXN0O1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnZGVmYXVsdCcpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHRlc3QgPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdjYXNlJyk7XG5cdCAgICAgICAgICAgIHRlc3QgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnOicpO1xuXHQgICAgICAgIHZhciBjb25zZXF1ZW50ID0gW107XG5cdCAgICAgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJ30nKSB8fCB0aGlzLm1hdGNoS2V5d29yZCgnZGVmYXVsdCcpIHx8IHRoaXMubWF0Y2hLZXl3b3JkKCdjYXNlJykpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNvbnNlcXVlbnQucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlN3aXRjaENhc2UodGVzdCwgY29uc2VxdWVudCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTd2l0Y2hTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3N3aXRjaCcpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgdmFyIGRpc2NyaW1pbmFudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJyknKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNJblN3aXRjaCA9IHRoaXMuY29udGV4dC5pblN3aXRjaDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaW5Td2l0Y2ggPSB0cnVlO1xuXHQgICAgICAgIHZhciBjYXNlcyA9IFtdO1xuXHQgICAgICAgIHZhciBkZWZhdWx0Rm91bmQgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgneycpO1xuXHQgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBjbGF1c2UgPSB0aGlzLnBhcnNlU3dpdGNoQ2FzZSgpO1xuXHQgICAgICAgICAgICBpZiAoY2xhdXNlLnRlc3QgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0Rm91bmQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5NdWx0aXBsZURlZmF1bHRzSW5Td2l0Y2gpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZGVmYXVsdEZvdW5kID0gdHJ1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjYXNlcy5wdXNoKGNsYXVzZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluU3dpdGNoID0gcHJldmlvdXNJblN3aXRjaDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5Td2l0Y2hTdGF0ZW1lbnQoZGlzY3JpbWluYW50LCBjYXNlcykpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxhYmVsbGVkLXN0YXRlbWVudHNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VMYWJlbGxlZFN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBleHByID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcblx0ICAgICAgICB2YXIgc3RhdGVtZW50O1xuXHQgICAgICAgIGlmICgoZXhwci50eXBlID09PSBzeW50YXhfMS5TeW50YXguSWRlbnRpZmllcikgJiYgdGhpcy5tYXRjaCgnOicpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHZhciBpZCA9IGV4cHI7XG5cdCAgICAgICAgICAgIHZhciBrZXkgPSAnJCcgKyBpZC5uYW1lO1xuXHQgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29udGV4dC5sYWJlbFNldCwga2V5KSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuUmVkZWNsYXJhdGlvbiwgJ0xhYmVsJywgaWQubmFtZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmxhYmVsU2V0W2tleV0gPSB0cnVlO1xuXHQgICAgICAgICAgICB2YXIgYm9keSA9IHZvaWQgMDtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdjbGFzcycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLnBhcnNlQ2xhc3NEZWNsYXJhdGlvbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdmdW5jdGlvbicpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgICAgIHZhciBkZWNsYXJhdGlvbiA9IHRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0RnVuY3Rpb24pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVjbGFyYXRpb24uZ2VuZXJhdG9yKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5HZW5lcmF0b3JJbkxlZ2FjeUNvbnRleHQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYm9keSA9IGRlY2xhcmF0aW9uO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYm9keSA9IHRoaXMucGFyc2VTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBkZWxldGUgdGhpcy5jb250ZXh0LmxhYmVsU2V0W2tleV07XG5cdCAgICAgICAgICAgIHN0YXRlbWVudCA9IG5ldyBOb2RlLkxhYmVsZWRTdGF0ZW1lbnQoaWQsIGJvZHkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5jb25zdW1lU2VtaWNvbG9uKCk7XG5cdCAgICAgICAgICAgIHN0YXRlbWVudCA9IG5ldyBOb2RlLkV4cHJlc3Npb25TdGF0ZW1lbnQoZXhwcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIHN0YXRlbWVudCk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdGhyb3ctc3RhdGVtZW50XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlVGhyb3dTdGF0ZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ3Rocm93Jyk7XG5cdCAgICAgICAgaWYgKHRoaXMuaGFzTGluZVRlcm1pbmF0b3IpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuTmV3bGluZUFmdGVyVGhyb3cpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgYXJndW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLlRocm93U3RhdGVtZW50KGFyZ3VtZW50KSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHJ5LXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNhdGNoQ2xhdXNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdjYXRjaCcpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IFtdO1xuXHQgICAgICAgIHZhciBwYXJhbSA9IHRoaXMucGFyc2VQYXR0ZXJuKHBhcmFtcyk7XG5cdCAgICAgICAgdmFyIHBhcmFtTWFwID0ge307XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgdmFyIGtleSA9ICckJyArIHBhcmFtc1tpXS52YWx1ZTtcblx0ICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXJhbU1hcCwga2V5KSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuRHVwbGljYXRlQmluZGluZywgcGFyYW1zW2ldLnZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBwYXJhbU1hcFtrZXldID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QgJiYgcGFyYW0udHlwZSA9PT0gc3ludGF4XzEuU3ludGF4LklkZW50aWZpZXIpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKHBhcmFtLm5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlRXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RDYXRjaFZhcmlhYmxlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKScpO1xuXHQgICAgICAgIHZhciBib2R5ID0gdGhpcy5wYXJzZUJsb2NrKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuQ2F0Y2hDbGF1c2UocGFyYW0sIGJvZHkpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRmluYWxseUNsYXVzZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2ZpbmFsbHknKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJsb2NrKCk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVRyeVN0YXRlbWVudCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgndHJ5Jyk7XG5cdCAgICAgICAgdmFyIGJsb2NrID0gdGhpcy5wYXJzZUJsb2NrKCk7XG5cdCAgICAgICAgdmFyIGhhbmRsZXIgPSB0aGlzLm1hdGNoS2V5d29yZCgnY2F0Y2gnKSA/IHRoaXMucGFyc2VDYXRjaENsYXVzZSgpIDogbnVsbDtcblx0ICAgICAgICB2YXIgZmluYWxpemVyID0gdGhpcy5tYXRjaEtleXdvcmQoJ2ZpbmFsbHknKSA/IHRoaXMucGFyc2VGaW5hbGx5Q2xhdXNlKCkgOiBudWxsO1xuXHQgICAgICAgIGlmICghaGFuZGxlciAmJiAhZmluYWxpemVyKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLk5vQ2F0Y2hPckZpbmFsbHkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5UcnlTdGF0ZW1lbnQoYmxvY2ssIGhhbmRsZXIsIGZpbmFsaXplcikpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWRlYnVnZ2VyLXN0YXRlbWVudFxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZURlYnVnZ2VyU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCdkZWJ1Z2dlcicpO1xuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkRlYnVnZ2VyU3RhdGVtZW50KCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2Utc3RhdGVtZW50cy1hbmQtZGVjbGFyYXRpb25zXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlU3RhdGVtZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGF0ZW1lbnQ7XG5cdCAgICAgICAgc3dpdGNoICh0aGlzLmxvb2thaGVhZC50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2UgMSAvKiBCb29sZWFuTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA1IC8qIE51bGxMaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDYgLyogTnVtZXJpY0xpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgOCAvKiBTdHJpbmdMaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDEwIC8qIFRlbXBsYXRlICovOlxuXHQgICAgICAgICAgICBjYXNlIDkgLyogUmVndWxhckV4cHJlc3Npb24gKi86XG5cdCAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgNyAvKiBQdW5jdHVhdG9yICovOlxuXHQgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5sb29rYWhlYWQudmFsdWU7XG5cdCAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICd7Jykge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VCbG9jaygpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09ICcoJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gJzsnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZUVtcHR5U3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRXhwcmVzc2lvblN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgMyAvKiBJZGVudGlmaWVyICovOlxuXHQgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5tYXRjaEFzeW5jRnVuY3Rpb24oKSA/IHRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKCkgOiB0aGlzLnBhcnNlTGFiZWxsZWRTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDQgLyogS2V5d29yZCAqLzpcblx0ICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5sb29rYWhlYWQudmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdicmVhayc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VCcmVha1N0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdjb250aW51ZSc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VDb250aW51ZVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdkZWJ1Z2dlcic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VEZWJ1Z2dlclN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdkbyc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VEb1doaWxlU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Zvcic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VGb3JTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlRnVuY3Rpb25EZWNsYXJhdGlvbigpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdpZic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VJZlN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICdyZXR1cm4nOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlUmV0dXJuU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N3aXRjaCc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VTd2l0Y2hTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAndGhyb3cnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlVGhyb3dTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAndHJ5Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gdGhpcy5wYXJzZVRyeVN0YXRlbWVudCgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICBjYXNlICd2YXInOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlVmFyaWFibGVTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnd2hpbGUnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnBhcnNlV2hpbGVTdGF0ZW1lbnQoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FzZSAnd2l0aCc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VXaXRoU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHRoaXMucGFyc2VFeHByZXNzaW9uU3RhdGVtZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBzdGF0ZW1lbnQgPSB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubG9va2FoZWFkKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHN0YXRlbWVudDtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1mdW5jdGlvbi1kZWZpbml0aW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZ1bmN0aW9uU291cmNlRWxlbWVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgneycpO1xuXHQgICAgICAgIHZhciBib2R5ID0gdGhpcy5wYXJzZURpcmVjdGl2ZVByb2xvZ3VlcygpO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0xhYmVsU2V0ID0gdGhpcy5jb250ZXh0LmxhYmVsU2V0O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0luSXRlcmF0aW9uID0gdGhpcy5jb250ZXh0LmluSXRlcmF0aW9uO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0luU3dpdGNoID0gdGhpcy5jb250ZXh0LmluU3dpdGNoO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0luRnVuY3Rpb25Cb2R5ID0gdGhpcy5jb250ZXh0LmluRnVuY3Rpb25Cb2R5O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5sYWJlbFNldCA9IHt9O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pbkl0ZXJhdGlvbiA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pblN3aXRjaCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keSA9IHRydWU7XG5cdCAgICAgICAgd2hpbGUgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGJvZHkucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmxhYmVsU2V0ID0gcHJldmlvdXNMYWJlbFNldDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuaW5JdGVyYXRpb24gPSBwcmV2aW91c0luSXRlcmF0aW9uO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5pblN3aXRjaCA9IHByZXZpb3VzSW5Td2l0Y2g7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmluRnVuY3Rpb25Cb2R5ID0gcHJldmlvdXNJbkZ1bmN0aW9uQm9keTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5CbG9ja1N0YXRlbWVudChib2R5KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS52YWxpZGF0ZVBhcmFtID0gZnVuY3Rpb24gKG9wdGlvbnMsIHBhcmFtLCBuYW1lKSB7XG5cdCAgICAgICAgdmFyIGtleSA9ICckJyArIG5hbWU7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKG5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLnN0cmljdGVkID0gcGFyYW07XG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLm1lc3NhZ2UgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFBhcmFtTmFtZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMucGFyYW1TZXQsIGtleSkpIHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RyaWN0ZWQgPSBwYXJhbTtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMubWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UGFyYW1EdXBlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKCFvcHRpb25zLmZpcnN0UmVzdHJpY3RlZCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQobmFtZSkpIHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlyc3RSZXN0cmljdGVkID0gcGFyYW07XG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLm1lc3NhZ2UgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdFBhcmFtTmFtZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNjYW5uZXIuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkKG5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICBvcHRpb25zLmZpcnN0UmVzdHJpY3RlZCA9IHBhcmFtO1xuXHQgICAgICAgICAgICAgICAgb3B0aW9ucy5tZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMucGFyYW1TZXQsIGtleSkpIHtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RyaWN0ZWQgPSBwYXJhbTtcblx0ICAgICAgICAgICAgICAgIG9wdGlvbnMubWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UGFyYW1EdXBlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdCAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdGlvbnMucGFyYW1TZXQsIGtleSwgeyB2YWx1ZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIG9wdGlvbnMucGFyYW1TZXRba2V5XSA9IHRydWU7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VSZXN0RWxlbWVudCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcuLi4nKTtcblx0ICAgICAgICB2YXIgYXJnID0gdGhpcy5wYXJzZVBhdHRlcm4ocGFyYW1zKTtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaCgnPScpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkRlZmF1bHRSZXN0UGFyYW1ldGVyKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuUGFyYW1ldGVyQWZ0ZXJSZXN0UGFyYW1ldGVyKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuUmVzdEVsZW1lbnQoYXJnKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZvcm1hbFBhcmFtZXRlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IFtdO1xuXHQgICAgICAgIHZhciBwYXJhbSA9IHRoaXMubWF0Y2goJy4uLicpID8gdGhpcy5wYXJzZVJlc3RFbGVtZW50KHBhcmFtcykgOiB0aGlzLnBhcnNlUGF0dGVybldpdGhEZWZhdWx0KHBhcmFtcyk7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtKG9wdGlvbnMsIHBhcmFtc1tpXSwgcGFyYW1zW2ldLnZhbHVlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgb3B0aW9ucy5zaW1wbGUgPSBvcHRpb25zLnNpbXBsZSAmJiAocGFyYW0gaW5zdGFuY2VvZiBOb2RlLklkZW50aWZpZXIpO1xuXHQgICAgICAgIG9wdGlvbnMucGFyYW1zLnB1c2gocGFyYW0pO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VGb3JtYWxQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKGZpcnN0UmVzdHJpY3RlZCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zO1xuXHQgICAgICAgIG9wdGlvbnMgPSB7XG5cdCAgICAgICAgICAgIHNpbXBsZTogdHJ1ZSxcblx0ICAgICAgICAgICAgcGFyYW1zOiBbXSxcblx0ICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkOiBmaXJzdFJlc3RyaWN0ZWRcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcoJyk7XG5cdCAgICAgICAgaWYgKCF0aGlzLm1hdGNoKCcpJykpIHtcblx0ICAgICAgICAgICAgb3B0aW9ucy5wYXJhbVNldCA9IHt9O1xuXHQgICAgICAgICAgICB3aGlsZSAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gMiAvKiBFT0YgKi8pIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXIob3B0aW9ucyk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJyknKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCcpJyk7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgc2ltcGxlOiBvcHRpb25zLnNpbXBsZSxcblx0ICAgICAgICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcblx0ICAgICAgICAgICAgc3RyaWN0ZWQ6IG9wdGlvbnMuc3RyaWN0ZWQsXG5cdCAgICAgICAgICAgIGZpcnN0UmVzdHJpY3RlZDogb3B0aW9ucy5maXJzdFJlc3RyaWN0ZWQsXG5cdCAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMubWVzc2FnZVxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5tYXRjaEFzeW5jRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG1hdGNoID0gdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhc3luYycpO1xuXHQgICAgICAgIGlmIChtYXRjaCkge1xuXHQgICAgICAgICAgICB2YXIgc3RhdGUgPSB0aGlzLnNjYW5uZXIuc2F2ZVN0YXRlKCk7XG5cdCAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5zY2FuQ29tbWVudHMoKTtcblx0ICAgICAgICAgICAgdmFyIG5leHQgPSB0aGlzLnNjYW5uZXIubGV4KCk7XG5cdCAgICAgICAgICAgIHRoaXMuc2Nhbm5lci5yZXN0b3JlU3RhdGUoc3RhdGUpO1xuXHQgICAgICAgICAgICBtYXRjaCA9IChzdGF0ZS5saW5lTnVtYmVyID09PSBuZXh0LmxpbmVOdW1iZXIpICYmIChuZXh0LnR5cGUgPT09IDQgLyogS2V5d29yZCAqLykgJiYgKG5leHQudmFsdWUgPT09ICdmdW5jdGlvbicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gbWF0Y2g7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoaWRlbnRpZmllcklzT3B0aW9uYWwpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpc0FzeW5jID0gdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhc3luYycpO1xuXHQgICAgICAgIGlmIChpc0FzeW5jKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnZnVuY3Rpb24nKTtcblx0ICAgICAgICB2YXIgaXNHZW5lcmF0b3IgPSBpc0FzeW5jID8gZmFsc2UgOiB0aGlzLm1hdGNoKCcqJyk7XG5cdCAgICAgICAgaWYgKGlzR2VuZXJhdG9yKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBtZXNzYWdlO1xuXHQgICAgICAgIHZhciBpZCA9IG51bGw7XG5cdCAgICAgICAgdmFyIGZpcnN0UmVzdHJpY3RlZCA9IG51bGw7XG5cdCAgICAgICAgaWYgKCFpZGVudGlmaWVySXNPcHRpb25hbCB8fCAhdGhpcy5tYXRjaCgnKCcpKSB7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICBpZCA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dC5zdHJpY3QpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIuaXNSZXN0cmljdGVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLCBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdEZ1bmN0aW9uTmFtZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQodG9rZW4udmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkID0gdG9rZW47XG5cdCAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0RnVuY3Rpb25OYW1lO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zY2FubmVyLmlzU3RyaWN0TW9kZVJlc2VydmVkV29yZCh0b2tlbi52YWx1ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSB0b2tlbjtcblx0ICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RSZXNlcnZlZFdvcmQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dBd2FpdCA9IHRoaXMuY29udGV4dC5hd2FpdDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1lpZWxkID0gdGhpcy5jb250ZXh0LmFsbG93WWllbGQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmF3YWl0ID0gaXNBc3luYztcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9ICFpc0dlbmVyYXRvcjtcblx0ICAgICAgICB2YXIgZm9ybWFsUGFyYW1ldGVycyA9IHRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKGZpcnN0UmVzdHJpY3RlZCk7XG5cdCAgICAgICAgdmFyIHBhcmFtcyA9IGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zO1xuXHQgICAgICAgIHZhciBzdHJpY3RlZCA9IGZvcm1hbFBhcmFtZXRlcnMuc3RyaWN0ZWQ7XG5cdCAgICAgICAgZmlyc3RSZXN0cmljdGVkID0gZm9ybWFsUGFyYW1ldGVycy5maXJzdFJlc3RyaWN0ZWQ7XG5cdCAgICAgICAgaWYgKGZvcm1hbFBhcmFtZXRlcnMubWVzc2FnZSkge1xuXHQgICAgICAgICAgICBtZXNzYWdlID0gZm9ybWFsUGFyYW1ldGVycy5tZXNzYWdlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcHJldmlvdXNTdHJpY3QgPSB0aGlzLmNvbnRleHQuc3RyaWN0O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93U3RyaWN0RGlyZWN0aXZlID0gdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZSA9IGZvcm1hbFBhcmFtZXRlcnMuc2ltcGxlO1xuXHQgICAgICAgIHZhciBib2R5ID0gdGhpcy5wYXJzZUZ1bmN0aW9uU291cmNlRWxlbWVudHMoKTtcblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBmaXJzdFJlc3RyaWN0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihmaXJzdFJlc3RyaWN0ZWQsIG1lc3NhZ2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5jb250ZXh0LnN0cmljdCAmJiBzdHJpY3RlZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHN0cmljdGVkLCBtZXNzYWdlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHByZXZpb3VzU3RyaWN0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1N0cmljdERpcmVjdGl2ZSA9IHByZXZpb3VzQWxsb3dTdHJpY3REaXJlY3RpdmU7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmF3YWl0ID0gcHJldmlvdXNBbGxvd0F3YWl0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgIHJldHVybiBpc0FzeW5jID8gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5Bc3luY0Z1bmN0aW9uRGVjbGFyYXRpb24oaWQsIHBhcmFtcywgYm9keSkpIDpcblx0ICAgICAgICAgICAgdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5GdW5jdGlvbkRlY2xhcmF0aW9uKGlkLCBwYXJhbXMsIGJvZHksIGlzR2VuZXJhdG9yKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZ1bmN0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpc0FzeW5jID0gdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhc3luYycpO1xuXHQgICAgICAgIGlmIChpc0FzeW5jKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnZnVuY3Rpb24nKTtcblx0ICAgICAgICB2YXIgaXNHZW5lcmF0b3IgPSBpc0FzeW5jID8gZmFsc2UgOiB0aGlzLm1hdGNoKCcqJyk7XG5cdCAgICAgICAgaWYgKGlzR2VuZXJhdG9yKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBtZXNzYWdlO1xuXHQgICAgICAgIHZhciBpZCA9IG51bGw7XG5cdCAgICAgICAgdmFyIGZpcnN0UmVzdHJpY3RlZDtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd0F3YWl0ID0gdGhpcy5jb250ZXh0LmF3YWl0O1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBpc0FzeW5jO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gIWlzR2VuZXJhdG9yO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaCgnKCcpKSB7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICBpZCA9ICghdGhpcy5jb250ZXh0LnN0cmljdCAmJiAhaXNHZW5lcmF0b3IgJiYgdGhpcy5tYXRjaEtleXdvcmQoJ3lpZWxkJykpID8gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCkgOiB0aGlzLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0KSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2FubmVyLmlzUmVzdHJpY3RlZFdvcmQodG9rZW4udmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbih0b2tlbiwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RGdW5jdGlvbk5hbWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nhbm5lci5pc1Jlc3RyaWN0ZWRXb3JkKHRva2VuLnZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGZpcnN0UmVzdHJpY3RlZCA9IHRva2VuO1xuXHQgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlc18xLk1lc3NhZ2VzLlN0cmljdEZ1bmN0aW9uTmFtZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc2Nhbm5lci5pc1N0cmljdE1vZGVSZXNlcnZlZFdvcmQodG9rZW4udmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZmlyc3RSZXN0cmljdGVkID0gdG9rZW47XG5cdCAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RyaWN0UmVzZXJ2ZWRXb3JkO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBmb3JtYWxQYXJhbWV0ZXJzID0gdGhpcy5wYXJzZUZvcm1hbFBhcmFtZXRlcnMoZmlyc3RSZXN0cmljdGVkKTtcblx0ICAgICAgICB2YXIgcGFyYW1zID0gZm9ybWFsUGFyYW1ldGVycy5wYXJhbXM7XG5cdCAgICAgICAgdmFyIHN0cmljdGVkID0gZm9ybWFsUGFyYW1ldGVycy5zdHJpY3RlZDtcblx0ICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSBmb3JtYWxQYXJhbWV0ZXJzLmZpcnN0UmVzdHJpY3RlZDtcblx0ICAgICAgICBpZiAoZm9ybWFsUGFyYW1ldGVycy5tZXNzYWdlKSB7XG5cdCAgICAgICAgICAgIG1lc3NhZ2UgPSBmb3JtYWxQYXJhbWV0ZXJzLm1lc3NhZ2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBwcmV2aW91c1N0cmljdCA9IHRoaXMuY29udGV4dC5zdHJpY3Q7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dTdHJpY3REaXJlY3RpdmUgPSB0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmU7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gZm9ybWFsUGFyYW1ldGVycy5zaW1wbGU7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlRnVuY3Rpb25Tb3VyY2VFbGVtZW50cygpO1xuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIGZpcnN0UmVzdHJpY3RlZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKGZpcnN0UmVzdHJpY3RlZCwgbWVzc2FnZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuc3RyaWN0ICYmIHN0cmljdGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4oc3RyaWN0ZWQsIG1lc3NhZ2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gcHJldmlvdXNTdHJpY3Q7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93U3RyaWN0RGlyZWN0aXZlID0gcHJldmlvdXNBbGxvd1N0cmljdERpcmVjdGl2ZTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYXdhaXQgPSBwcmV2aW91c0FsbG93QXdhaXQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBwcmV2aW91c0FsbG93WWllbGQ7XG5cdCAgICAgICAgcmV0dXJuIGlzQXN5bmMgPyB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkFzeW5jRnVuY3Rpb25FeHByZXNzaW9uKGlkLCBwYXJhbXMsIGJvZHkpKSA6XG5cdCAgICAgICAgICAgIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRnVuY3Rpb25FeHByZXNzaW9uKGlkLCBwYXJhbXMsIGJvZHksIGlzR2VuZXJhdG9yKSk7XG5cdCAgICB9O1xuXHQgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZGlyZWN0aXZlLXByb2xvZ3Vlcy1hbmQtdGhlLXVzZS1zdHJpY3QtZGlyZWN0aXZlXG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRGlyZWN0aXZlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGV4cHIgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbigpO1xuXHQgICAgICAgIHZhciBkaXJlY3RpdmUgPSAoZXhwci50eXBlID09PSBzeW50YXhfMS5TeW50YXguTGl0ZXJhbCkgPyB0aGlzLmdldFRva2VuUmF3KHRva2VuKS5zbGljZSgxLCAtMSkgOiBudWxsO1xuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIGRpcmVjdGl2ZSA/IG5ldyBOb2RlLkRpcmVjdGl2ZShleHByLCBkaXJlY3RpdmUpIDogbmV3IE5vZGUuRXhwcmVzc2lvblN0YXRlbWVudChleHByKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZURpcmVjdGl2ZVByb2xvZ3VlcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgZmlyc3RSZXN0cmljdGVkID0gbnVsbDtcblx0ICAgICAgICB2YXIgYm9keSA9IFtdO1xuXHQgICAgICAgIHdoaWxlICh0cnVlKSB7XG5cdCAgICAgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICBpZiAodG9rZW4udHlwZSAhPT0gOCAvKiBTdHJpbmdMaXRlcmFsICovKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB2YXIgc3RhdGVtZW50ID0gdGhpcy5wYXJzZURpcmVjdGl2ZSgpO1xuXHQgICAgICAgICAgICBib2R5LnB1c2goc3RhdGVtZW50KTtcblx0ICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IHN0YXRlbWVudC5kaXJlY3RpdmU7XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgZGlyZWN0aXZlICE9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGRpcmVjdGl2ZSA9PT0gJ3VzZSBzdHJpY3QnKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuc3RyaWN0ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIGlmIChmaXJzdFJlc3RyaWN0ZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKGZpcnN0UmVzdHJpY3RlZCwgbWVzc2FnZXNfMS5NZXNzYWdlcy5TdHJpY3RPY3RhbExpdGVyYWwpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuYWxsb3dTdHJpY3REaXJlY3RpdmUpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKHRva2VuLCBtZXNzYWdlc18xLk1lc3NhZ2VzLklsbGVnYWxMYW5ndWFnZU1vZGVEaXJlY3RpdmUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKCFmaXJzdFJlc3RyaWN0ZWQgJiYgdG9rZW4ub2N0YWwpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmaXJzdFJlc3RyaWN0ZWQgPSB0b2tlbjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gYm9keTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1tZXRob2QtZGVmaW5pdGlvbnNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucXVhbGlmaWVkUHJvcGVydHlOYW1lID0gZnVuY3Rpb24gKHRva2VuKSB7XG5cdCAgICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2UgMyAvKiBJZGVudGlmaWVyICovOlxuXHQgICAgICAgICAgICBjYXNlIDggLyogU3RyaW5nTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSAxIC8qIEJvb2xlYW5MaXRlcmFsICovOlxuXHQgICAgICAgICAgICBjYXNlIDUgLyogTnVsbExpdGVyYWwgKi86XG5cdCAgICAgICAgICAgIGNhc2UgNiAvKiBOdW1lcmljTGl0ZXJhbCAqLzpcblx0ICAgICAgICAgICAgY2FzZSA0IC8qIEtleXdvcmQgKi86XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgICAgY2FzZSA3IC8qIFB1bmN0dWF0b3IgKi86XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4udmFsdWUgPT09ICdbJztcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUdldHRlck1ldGhvZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpc0dlbmVyYXRvciA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9ICFpc0dlbmVyYXRvcjtcblx0ICAgICAgICB2YXIgZm9ybWFsUGFyYW1ldGVycyA9IHRoaXMucGFyc2VGb3JtYWxQYXJhbWV0ZXJzKCk7XG5cdCAgICAgICAgaWYgKGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuQmFkR2V0dGVyQXJpdHkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbWV0aG9kID0gdGhpcy5wYXJzZVByb3BlcnR5TWV0aG9kKGZvcm1hbFBhcmFtZXRlcnMpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gcHJldmlvdXNBbGxvd1lpZWxkO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkZ1bmN0aW9uRXhwcmVzc2lvbihudWxsLCBmb3JtYWxQYXJhbWV0ZXJzLnBhcmFtcywgbWV0aG9kLCBpc0dlbmVyYXRvcikpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VTZXR0ZXJNZXRob2QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgaXNHZW5lcmF0b3IgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNBbGxvd1lpZWxkID0gdGhpcy5jb250ZXh0LmFsbG93WWllbGQ7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSAhaXNHZW5lcmF0b3I7XG5cdCAgICAgICAgdmFyIGZvcm1hbFBhcmFtZXRlcnMgPSB0aGlzLnBhcnNlRm9ybWFsUGFyYW1ldGVycygpO1xuXHQgICAgICAgIGlmIChmb3JtYWxQYXJhbWV0ZXJzLnBhcmFtcy5sZW5ndGggIT09IDEpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuQmFkU2V0dGVyQXJpdHkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmIChmb3JtYWxQYXJhbWV0ZXJzLnBhcmFtc1swXSBpbnN0YW5jZW9mIE5vZGUuUmVzdEVsZW1lbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy50b2xlcmF0ZUVycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuQmFkU2V0dGVyUmVzdFBhcmFtZXRlcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBtZXRob2QgPSB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2QoZm9ybWFsUGFyYW1ldGVycyk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBwcmV2aW91c0FsbG93WWllbGQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRnVuY3Rpb25FeHByZXNzaW9uKG51bGwsIGZvcm1hbFBhcmFtZXRlcnMucGFyYW1zLCBtZXRob2QsIGlzR2VuZXJhdG9yKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUdlbmVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpc0dlbmVyYXRvciA9IHRydWU7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzQWxsb3dZaWVsZCA9IHRoaXMuY29udGV4dC5hbGxvd1lpZWxkO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gdHJ1ZTtcblx0ICAgICAgICB2YXIgcGFyYW1zID0gdGhpcy5wYXJzZUZvcm1hbFBhcmFtZXRlcnMoKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBtZXRob2QgPSB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2QocGFyYW1zKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZCA9IHByZXZpb3VzQWxsb3dZaWVsZDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5GdW5jdGlvbkV4cHJlc3Npb24obnVsbCwgcGFyYW1zLnBhcmFtcywgbWV0aG9kLCBpc0dlbmVyYXRvcikpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdlbmVyYXRvci1mdW5jdGlvbi1kZWZpbml0aW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5pc1N0YXJ0T2ZFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBzdGFydCA9IHRydWU7XG5cdCAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5sb29rYWhlYWQudmFsdWU7XG5cdCAgICAgICAgc3dpdGNoICh0aGlzLmxvb2thaGVhZC50eXBlKSB7XG5cdCAgICAgICAgICAgIGNhc2UgNyAvKiBQdW5jdHVhdG9yICovOlxuXHQgICAgICAgICAgICAgICAgc3RhcnQgPSAodmFsdWUgPT09ICdbJykgfHwgKHZhbHVlID09PSAnKCcpIHx8ICh2YWx1ZSA9PT0gJ3snKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PT0gJysnKSB8fCAodmFsdWUgPT09ICctJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT09ICchJykgfHwgKHZhbHVlID09PSAnficpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKHZhbHVlID09PSAnKysnKSB8fCAodmFsdWUgPT09ICctLScpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKHZhbHVlID09PSAnLycpIHx8ICh2YWx1ZSA9PT0gJy89Jyk7IC8vIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsXG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSA0IC8qIEtleXdvcmQgKi86XG5cdCAgICAgICAgICAgICAgICBzdGFydCA9ICh2YWx1ZSA9PT0gJ2NsYXNzJykgfHwgKHZhbHVlID09PSAnZGVsZXRlJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT09ICdmdW5jdGlvbicpIHx8ICh2YWx1ZSA9PT0gJ2xldCcpIHx8ICh2YWx1ZSA9PT0gJ25ldycpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKHZhbHVlID09PSAnc3VwZXInKSB8fCAodmFsdWUgPT09ICd0aGlzJykgfHwgKHZhbHVlID09PSAndHlwZW9mJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT09ICd2b2lkJykgfHwgKHZhbHVlID09PSAneWllbGQnKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBzdGFydDtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlWWllbGRFeHByZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdGhpcy5leHBlY3RLZXl3b3JkKCd5aWVsZCcpO1xuXHQgICAgICAgIHZhciBhcmd1bWVudCA9IG51bGw7XG5cdCAgICAgICAgdmFyIGRlbGVnYXRlID0gZmFsc2U7XG5cdCAgICAgICAgaWYgKCF0aGlzLmhhc0xpbmVUZXJtaW5hdG9yKSB7XG5cdCAgICAgICAgICAgIHZhciBwcmV2aW91c0FsbG93WWllbGQgPSB0aGlzLmNvbnRleHQuYWxsb3dZaWVsZDtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBmYWxzZTtcblx0ICAgICAgICAgICAgZGVsZWdhdGUgPSB0aGlzLm1hdGNoKCcqJyk7XG5cdCAgICAgICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIGFyZ3VtZW50ID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1N0YXJ0T2ZFeHByZXNzaW9uKCkpIHtcblx0ICAgICAgICAgICAgICAgIGFyZ3VtZW50ID0gdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0LmFsbG93WWllbGQgPSBwcmV2aW91c0FsbG93WWllbGQ7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLllpZWxkRXhwcmVzc2lvbihhcmd1bWVudCwgZGVsZWdhdGUpKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jbGFzcy1kZWZpbml0aW9uc1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUNsYXNzRWxlbWVudCA9IGZ1bmN0aW9uIChoYXNDb25zdHJ1Y3Rvcikge1xuXHQgICAgICAgIHZhciB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGtpbmQgPSAnJztcblx0ICAgICAgICB2YXIga2V5ID0gbnVsbDtcblx0ICAgICAgICB2YXIgdmFsdWUgPSBudWxsO1xuXHQgICAgICAgIHZhciBjb21wdXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBtZXRob2QgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgaXNTdGF0aWMgPSBmYWxzZTtcblx0ICAgICAgICB2YXIgaXNBc3luYyA9IGZhbHNlO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoKCcqJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgdmFyIGlkID0ga2V5O1xuXHQgICAgICAgICAgICBpZiAoaWQubmFtZSA9PT0gJ3N0YXRpYycgJiYgKHRoaXMucXVhbGlmaWVkUHJvcGVydHlOYW1lKHRoaXMubG9va2FoZWFkKSB8fCB0aGlzLm1hdGNoKCcqJykpKSB7XG5cdCAgICAgICAgICAgICAgICB0b2tlbiA9IHRoaXMubG9va2FoZWFkO1xuXHQgICAgICAgICAgICAgICAgaXNTdGF0aWMgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnKicpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMucGFyc2VPYmplY3RQcm9wZXJ0eUtleSgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICgodG9rZW4udHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovKSAmJiAhdGhpcy5oYXNMaW5lVGVybWluYXRvciAmJiAodG9rZW4udmFsdWUgPT09ICdhc3luYycpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgcHVuY3R1YXRvciA9IHRoaXMubG9va2FoZWFkLnZhbHVlO1xuXHQgICAgICAgICAgICAgICAgaWYgKHB1bmN0dWF0b3IgIT09ICc6JyAmJiBwdW5jdHVhdG9yICE9PSAnKCcgJiYgcHVuY3R1YXRvciAhPT0gJyonKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaXNBc3luYyA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmxvb2thaGVhZDtcblx0ICAgICAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovICYmIHRva2VuLnZhbHVlID09PSAnY29uc3RydWN0b3InKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuQ29uc3RydWN0b3JJc0FzeW5jKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIGxvb2thaGVhZFByb3BlcnR5S2V5ID0gdGhpcy5xdWFsaWZpZWRQcm9wZXJ0eU5hbWUodGhpcy5sb29rYWhlYWQpO1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAzIC8qIElkZW50aWZpZXIgKi8pIHtcblx0ICAgICAgICAgICAgaWYgKHRva2VuLnZhbHVlID09PSAnZ2V0JyAmJiBsb29rYWhlYWRQcm9wZXJ0eUtleSkge1xuXHQgICAgICAgICAgICAgICAga2luZCA9ICdnZXQnO1xuXHQgICAgICAgICAgICAgICAgY29tcHV0ZWQgPSB0aGlzLm1hdGNoKCdbJyk7XG5cdCAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnBhcnNlT2JqZWN0UHJvcGVydHlLZXkoKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hbGxvd1lpZWxkID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VHZXR0ZXJNZXRob2QoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi52YWx1ZSA9PT0gJ3NldCcgJiYgbG9va2FoZWFkUHJvcGVydHlLZXkpIHtcblx0ICAgICAgICAgICAgICAgIGtpbmQgPSAnc2V0Jztcblx0ICAgICAgICAgICAgICAgIGNvbXB1dGVkID0gdGhpcy5tYXRjaCgnWycpO1xuXHQgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VTZXR0ZXJNZXRob2QoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8gJiYgdG9rZW4udmFsdWUgPT09ICcqJyAmJiBsb29rYWhlYWRQcm9wZXJ0eUtleSkge1xuXHQgICAgICAgICAgICBraW5kID0gJ2luaXQnO1xuXHQgICAgICAgICAgICBjb21wdXRlZCA9IHRoaXMubWF0Y2goJ1snKTtcblx0ICAgICAgICAgICAga2V5ID0gdGhpcy5wYXJzZU9iamVjdFByb3BlcnR5S2V5KCk7XG5cdCAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wYXJzZUdlbmVyYXRvck1ldGhvZCgpO1xuXHQgICAgICAgICAgICBtZXRob2QgPSB0cnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIWtpbmQgJiYga2V5ICYmIHRoaXMubWF0Y2goJygnKSkge1xuXHQgICAgICAgICAgICBraW5kID0gJ2luaXQnO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IGlzQXN5bmMgPyB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2RBc3luY0Z1bmN0aW9uKCkgOiB0aGlzLnBhcnNlUHJvcGVydHlNZXRob2RGdW5jdGlvbigpO1xuXHQgICAgICAgICAgICBtZXRob2QgPSB0cnVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIWtpbmQpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChraW5kID09PSAnaW5pdCcpIHtcblx0ICAgICAgICAgICAga2luZCA9ICdtZXRob2QnO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIWNvbXB1dGVkKSB7XG5cdCAgICAgICAgICAgIGlmIChpc1N0YXRpYyAmJiB0aGlzLmlzUHJvcGVydHlLZXkoa2V5LCAncHJvdG90eXBlJykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuU3RhdGljUHJvdG90eXBlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoIWlzU3RhdGljICYmIHRoaXMuaXNQcm9wZXJ0eUtleShrZXksICdjb25zdHJ1Y3RvcicpKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoa2luZCAhPT0gJ21ldGhvZCcgfHwgIW1ldGhvZCB8fCAodmFsdWUgJiYgdmFsdWUuZ2VuZXJhdG9yKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuQ29uc3RydWN0b3JTcGVjaWFsTWV0aG9kKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChoYXNDb25zdHJ1Y3Rvci52YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4odG9rZW4sIG1lc3NhZ2VzXzEuTWVzc2FnZXMuRHVwbGljYXRlQ29uc3RydWN0b3IpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaGFzQ29uc3RydWN0b3IudmFsdWUgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAga2luZCA9ICdjb25zdHJ1Y3Rvcic7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuTWV0aG9kRGVmaW5pdGlvbihrZXksIGNvbXB1dGVkLCB2YWx1ZSwga2luZCwgaXNTdGF0aWMpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlQ2xhc3NFbGVtZW50TGlzdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgYm9keSA9IFtdO1xuXHQgICAgICAgIHZhciBoYXNDb25zdHJ1Y3RvciA9IHsgdmFsdWU6IGZhbHNlIH07XG5cdCAgICAgICAgdGhpcy5leHBlY3QoJ3snKTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMubWF0Y2goJ30nKSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaCgnOycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYm9keS5wdXNoKHRoaXMucGFyc2VDbGFzc0VsZW1lbnQoaGFzQ29uc3RydWN0b3IpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmV4cGVjdCgnfScpO1xuXHQgICAgICAgIHJldHVybiBib2R5O1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VDbGFzc0JvZHkgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgZWxlbWVudExpc3QgPSB0aGlzLnBhcnNlQ2xhc3NFbGVtZW50TGlzdCgpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkNsYXNzQm9keShlbGVtZW50TGlzdCkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VDbGFzc0RlY2xhcmF0aW9uID0gZnVuY3Rpb24gKGlkZW50aWZpZXJJc09wdGlvbmFsKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNTdHJpY3QgPSB0aGlzLmNvbnRleHQuc3RyaWN0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5zdHJpY3QgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnY2xhc3MnKTtcblx0ICAgICAgICB2YXIgaWQgPSAoaWRlbnRpZmllcklzT3B0aW9uYWwgJiYgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDMgLyogSWRlbnRpZmllciAqLykpID8gbnVsbCA6IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICB2YXIgc3VwZXJDbGFzcyA9IG51bGw7XG5cdCAgICAgICAgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdleHRlbmRzJykpIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgc3VwZXJDbGFzcyA9IHRoaXMuaXNvbGF0ZUNvdmVyR3JhbW1hcih0aGlzLnBhcnNlTGVmdEhhbmRTaWRlRXhwcmVzc2lvbkFsbG93Q2FsbCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBjbGFzc0JvZHkgPSB0aGlzLnBhcnNlQ2xhc3NCb2R5KCk7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHByZXZpb3VzU3RyaWN0O1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkNsYXNzRGVjbGFyYXRpb24oaWQsIHN1cGVyQ2xhc3MsIGNsYXNzQm9keSkpO1xuXHQgICAgfTtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VDbGFzc0V4cHJlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgcHJldmlvdXNTdHJpY3QgPSB0aGlzLmNvbnRleHQuc3RyaWN0O1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5zdHJpY3QgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnY2xhc3MnKTtcblx0ICAgICAgICB2YXIgaWQgPSAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gMyAvKiBJZGVudGlmaWVyICovKSA/IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKSA6IG51bGw7XG5cdCAgICAgICAgdmFyIHN1cGVyQ2xhc3MgPSBudWxsO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnZXh0ZW5kcycpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIHN1cGVyQ2xhc3MgPSB0aGlzLmlzb2xhdGVDb3ZlckdyYW1tYXIodGhpcy5wYXJzZUxlZnRIYW5kU2lkZUV4cHJlc3Npb25BbGxvd0NhbGwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgY2xhc3NCb2R5ID0gdGhpcy5wYXJzZUNsYXNzQm9keSgpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5zdHJpY3QgPSBwcmV2aW91c1N0cmljdDtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5DbGFzc0V4cHJlc3Npb24oaWQsIHN1cGVyQ2xhc3MsIGNsYXNzQm9keSkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXNjcmlwdHNcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW1vZHVsZXNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VNb2R1bGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LnN0cmljdCA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5jb250ZXh0LmlzTW9kdWxlID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIuaXNNb2R1bGUgPSB0cnVlO1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGJvZHkgPSB0aGlzLnBhcnNlRGlyZWN0aXZlUHJvbG9ndWVzKCk7XG5cdCAgICAgICAgd2hpbGUgKHRoaXMubG9va2FoZWFkLnR5cGUgIT09IDIgLyogRU9GICovKSB7XG5cdCAgICAgICAgICAgIGJvZHkucHVzaCh0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLk1vZHVsZShib2R5KSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZVNjcmlwdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBib2R5ID0gdGhpcy5wYXJzZURpcmVjdGl2ZVByb2xvZ3VlcygpO1xuXHQgICAgICAgIHdoaWxlICh0aGlzLmxvb2thaGVhZC50eXBlICE9PSAyIC8qIEVPRiAqLykge1xuXHQgICAgICAgICAgICBib2R5LnB1c2godGhpcy5wYXJzZVN0YXRlbWVudExpc3RJdGVtKCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5TY3JpcHQoYm9keSkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWltcG9ydHNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VNb2R1bGVTcGVjaWZpZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSAhPT0gOCAvKiBTdHJpbmdMaXRlcmFsICovKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLkludmFsaWRNb2R1bGVTcGVjaWZpZXIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgdG9rZW4gPSB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgIHZhciByYXcgPSB0aGlzLmdldFRva2VuUmF3KHRva2VuKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5maW5hbGl6ZShub2RlLCBuZXcgTm9kZS5MaXRlcmFsKHRva2VuLnZhbHVlLCByYXcpKTtcblx0ICAgIH07XG5cdCAgICAvLyBpbXBvcnQgezxmb28gYXMgYmFyPn0gLi4uO1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUltcG9ydFNwZWNpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHZhciBpbXBvcnRlZDtcblx0ICAgICAgICB2YXIgbG9jYWw7XG5cdCAgICAgICAgaWYgKHRoaXMubG9va2FoZWFkLnR5cGUgPT09IDMgLyogSWRlbnRpZmllciAqLykge1xuXHQgICAgICAgICAgICBpbXBvcnRlZCA9IHRoaXMucGFyc2VWYXJpYWJsZUlkZW50aWZpZXIoKTtcblx0ICAgICAgICAgICAgbG9jYWwgPSBpbXBvcnRlZDtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnYXMnKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIGxvY2FsID0gdGhpcy5wYXJzZVZhcmlhYmxlSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICBpbXBvcnRlZCA9IHRoaXMucGFyc2VJZGVudGlmaWVyTmFtZSgpO1xuXHQgICAgICAgICAgICBsb2NhbCA9IGltcG9ydGVkO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhcycpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgbG9jYWwgPSB0aGlzLnBhcnNlVmFyaWFibGVJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKHRoaXMubmV4dFRva2VuKCkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkltcG9ydFNwZWNpZmllcihsb2NhbCwgaW1wb3J0ZWQpKTtcblx0ICAgIH07XG5cdCAgICAvLyB7Zm9vLCBiYXIgYXMgYmFzfVxuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZU5hbWVkSW1wb3J0cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgneycpO1xuXHQgICAgICAgIHZhciBzcGVjaWZpZXJzID0gW107XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgc3BlY2lmaWVycy5wdXNoKHRoaXMucGFyc2VJbXBvcnRTcGVjaWZpZXIoKSk7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdCgnLCcpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZXhwZWN0KCd9Jyk7XG5cdCAgICAgICAgcmV0dXJuIHNwZWNpZmllcnM7XG5cdCAgICB9O1xuXHQgICAgLy8gaW1wb3J0IDxmb28+IC4uLjtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VJbXBvcnREZWZhdWx0U3BlY2lmaWVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG5cdCAgICAgICAgdmFyIGxvY2FsID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSW1wb3J0RGVmYXVsdFNwZWNpZmllcihsb2NhbCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIGltcG9ydCA8KiBhcyBmb28+IC4uLjtcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdCgnKicpO1xuXHQgICAgICAgIGlmICghdGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhcycpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlc18xLk1lc3NhZ2VzLk5vQXNBZnRlckltcG9ydE5hbWVzcGFjZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgdmFyIGxvY2FsID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyKGxvY2FsKSk7XG5cdCAgICB9O1xuXHQgICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZUltcG9ydERlY2xhcmF0aW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmNvbnRleHQuaW5GdW5jdGlvbkJvZHkpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSWxsZWdhbEltcG9ydERlY2xhcmF0aW9uKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB0aGlzLmV4cGVjdEtleXdvcmQoJ2ltcG9ydCcpO1xuXHQgICAgICAgIHZhciBzcmM7XG5cdCAgICAgICAgdmFyIHNwZWNpZmllcnMgPSBbXTtcblx0ICAgICAgICBpZiAodGhpcy5sb29rYWhlYWQudHlwZSA9PT0gOCAvKiBTdHJpbmdMaXRlcmFsICovKSB7XG5cdCAgICAgICAgICAgIC8vIGltcG9ydCAnZm9vJztcblx0ICAgICAgICAgICAgc3JjID0gdGhpcy5wYXJzZU1vZHVsZVNwZWNpZmllcigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJ3snKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gaW1wb3J0IHtiYXJ9XG5cdCAgICAgICAgICAgICAgICBzcGVjaWZpZXJzID0gc3BlY2lmaWVycy5jb25jYXQodGhpcy5wYXJzZU5hbWVkSW1wb3J0cygpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm1hdGNoKCcqJykpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGltcG9ydCAqIGFzIGZvb1xuXHQgICAgICAgICAgICAgICAgc3BlY2lmaWVycy5wdXNoKHRoaXMucGFyc2VJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIoKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc0lkZW50aWZpZXJOYW1lKHRoaXMubG9va2FoZWFkKSAmJiAhdGhpcy5tYXRjaEtleXdvcmQoJ2RlZmF1bHQnKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gaW1wb3J0IGZvb1xuXHQgICAgICAgICAgICAgICAgc3BlY2lmaWVycy5wdXNoKHRoaXMucGFyc2VJbXBvcnREZWZhdWx0U3BlY2lmaWVyKCkpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJywnKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF0Y2goJyonKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBvcnQgZm9vLCAqIGFzIGZvb1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXJzLnB1c2godGhpcy5wYXJzZUltcG9ydE5hbWVzcGFjZVNwZWNpZmllcigpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5tYXRjaCgneycpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcG9ydCBmb28sIHtiYXJ9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcnMgPSBzcGVjaWZpZXJzLmNvbmNhdCh0aGlzLnBhcnNlTmFtZWRJbXBvcnRzKCkpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLm5leHRUb2tlbigpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnZnJvbScpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IHRoaXMubG9va2FoZWFkLnZhbHVlID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW4gOiBtZXNzYWdlc18xLk1lc3NhZ2VzLk1pc3NpbmdGcm9tQ2xhdXNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2UsIHRoaXMubG9va2FoZWFkLnZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBzcmMgPSB0aGlzLnBhcnNlTW9kdWxlU3BlY2lmaWVyKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkltcG9ydERlY2xhcmF0aW9uKHNwZWNpZmllcnMsIHNyYykpO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWV4cG9ydHNcblx0ICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2VFeHBvcnRTcGVjaWZpZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoKTtcblx0ICAgICAgICB2YXIgbG9jYWwgPSB0aGlzLnBhcnNlSWRlbnRpZmllck5hbWUoKTtcblx0ICAgICAgICB2YXIgZXhwb3J0ZWQgPSBsb2NhbDtcblx0ICAgICAgICBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdhcycpKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dFRva2VuKCk7XG5cdCAgICAgICAgICAgIGV4cG9ydGVkID0gdGhpcy5wYXJzZUlkZW50aWZpZXJOYW1lKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydFNwZWNpZmllcihsb2NhbCwgZXhwb3J0ZWQpKTtcblx0ICAgIH07XG5cdCAgICBQYXJzZXIucHJvdG90eXBlLnBhcnNlRXhwb3J0RGVjbGFyYXRpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5pbkZ1bmN0aW9uQm9keSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5JbGxlZ2FsRXhwb3J0RGVjbGFyYXRpb24pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuXHQgICAgICAgIHRoaXMuZXhwZWN0S2V5d29yZCgnZXhwb3J0Jyk7XG5cdCAgICAgICAgdmFyIGV4cG9ydERlY2xhcmF0aW9uO1xuXHQgICAgICAgIGlmICh0aGlzLm1hdGNoS2V5d29yZCgnZGVmYXVsdCcpKSB7XG5cdCAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IC4uLlxuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaEtleXdvcmQoJ2Z1bmN0aW9uJykpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZvbyAoKSB7fVxuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKCkge31cblx0ICAgICAgICAgICAgICAgIHZhciBkZWNsYXJhdGlvbiA9IHRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKHRydWUpO1xuXHQgICAgICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb24gPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hLZXl3b3JkKCdjbGFzcycpKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCBjbGFzcyBmb28ge31cblx0ICAgICAgICAgICAgICAgIHZhciBkZWNsYXJhdGlvbiA9IHRoaXMucGFyc2VDbGFzc0RlY2xhcmF0aW9uKHRydWUpO1xuXHQgICAgICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb24gPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnYXN5bmMnKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZiAoKSB7fVxuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gKCkge31cblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IGFzeW5jIHggPT4geFxuXHQgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdGhpcy5tYXRjaEFzeW5jRnVuY3Rpb24oKSA/IHRoaXMucGFyc2VGdW5jdGlvbkRlY2xhcmF0aW9uKHRydWUpIDogdGhpcy5wYXJzZUFzc2lnbm1lbnRFeHByZXNzaW9uKCk7XG5cdCAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdmcm9tJykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93RXJyb3IobWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW4sIHRoaXMubG9va2FoZWFkLnZhbHVlKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCBkZWZhdWx0IHt9O1xuXHQgICAgICAgICAgICAgICAgLy8gZXhwb3J0IGRlZmF1bHQgW107XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQgZGVmYXVsdCAoMSArIDIpO1xuXHQgICAgICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdGhpcy5tYXRjaCgneycpID8gdGhpcy5wYXJzZU9iamVjdEluaXRpYWxpemVyKCkgOlxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2goJ1snKSA/IHRoaXMucGFyc2VBcnJheUluaXRpYWxpemVyKCkgOiB0aGlzLnBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb24gPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2goJyonKSkge1xuXHQgICAgICAgICAgICAvLyBleHBvcnQgKiBmcm9tICdmb28nO1xuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2hDb250ZXh0dWFsS2V5d29yZCgnZnJvbScpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IHRoaXMubG9va2FoZWFkLnZhbHVlID8gbWVzc2FnZXNfMS5NZXNzYWdlcy5VbmV4cGVjdGVkVG9rZW4gOiBtZXNzYWdlc18xLk1lc3NhZ2VzLk1pc3NpbmdGcm9tQ2xhdXNlO1xuXHQgICAgICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2UsIHRoaXMubG9va2FoZWFkLnZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLm5leHRUb2tlbigpO1xuXHQgICAgICAgICAgICB2YXIgc3JjID0gdGhpcy5wYXJzZU1vZHVsZVNwZWNpZmllcigpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb24gPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydEFsbERlY2xhcmF0aW9uKHNyYykpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmICh0aGlzLmxvb2thaGVhZC50eXBlID09PSA0IC8qIEtleXdvcmQgKi8pIHtcblx0ICAgICAgICAgICAgLy8gZXhwb3J0IHZhciBmID0gMTtcblx0ICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdm9pZCAwO1xuXHQgICAgICAgICAgICBzd2l0Y2ggKHRoaXMubG9va2FoZWFkLnZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdsZXQnOlxuXHQgICAgICAgICAgICAgICAgY2FzZSAnY29uc3QnOlxuXHQgICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUxleGljYWxEZWNsYXJhdGlvbih7IGluRm9yOiBmYWxzZSB9KTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ3Zhcic6XG5cdCAgICAgICAgICAgICAgICBjYXNlICdjbGFzcyc6XG5cdCAgICAgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG5cdCAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24gPSB0aGlzLnBhcnNlU3RhdGVtZW50TGlzdEl0ZW0oKTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbih0aGlzLmxvb2thaGVhZCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb24gPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24oZGVjbGFyYXRpb24sIFtdLCBudWxsKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMubWF0Y2hBc3luY0Z1bmN0aW9uKCkpIHtcblx0ICAgICAgICAgICAgdmFyIGRlY2xhcmF0aW9uID0gdGhpcy5wYXJzZUZ1bmN0aW9uRGVjbGFyYXRpb24oKTtcblx0ICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb24gPSB0aGlzLmZpbmFsaXplKG5vZGUsIG5ldyBOb2RlLkV4cG9ydE5hbWVkRGVjbGFyYXRpb24oZGVjbGFyYXRpb24sIFtdLCBudWxsKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB2YXIgc3BlY2lmaWVycyA9IFtdO1xuXHQgICAgICAgICAgICB2YXIgc291cmNlID0gbnVsbDtcblx0ICAgICAgICAgICAgdmFyIGlzRXhwb3J0RnJvbUlkZW50aWZpZXIgPSBmYWxzZTtcblx0ICAgICAgICAgICAgdGhpcy5leHBlY3QoJ3snKTtcblx0ICAgICAgICAgICAgd2hpbGUgKCF0aGlzLm1hdGNoKCd9JykpIHtcblx0ICAgICAgICAgICAgICAgIGlzRXhwb3J0RnJvbUlkZW50aWZpZXIgPSBpc0V4cG9ydEZyb21JZGVudGlmaWVyIHx8IHRoaXMubWF0Y2hLZXl3b3JkKCdkZWZhdWx0Jyk7XG5cdCAgICAgICAgICAgICAgICBzcGVjaWZpZXJzLnB1c2godGhpcy5wYXJzZUV4cG9ydFNwZWNpZmllcigpKTtcblx0ICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXRjaCgnfScpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3QoJywnKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLmV4cGVjdCgnfScpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5tYXRjaENvbnRleHR1YWxLZXl3b3JkKCdmcm9tJykpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCB7ZGVmYXVsdH0gZnJvbSAnZm9vJztcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCB7Zm9vfSBmcm9tICdmb28nO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIHNvdXJjZSA9IHRoaXMucGFyc2VNb2R1bGVTcGVjaWZpZXIoKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtZVNlbWljb2xvbigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGlzRXhwb3J0RnJvbUlkZW50aWZpZXIpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGV4cG9ydCB7ZGVmYXVsdH07IC8vIG1pc3NpbmcgZnJvbUNsYXVzZVxuXHQgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSB0aGlzLmxvb2thaGVhZC52YWx1ZSA/IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuIDogbWVzc2FnZXNfMS5NZXNzYWdlcy5NaXNzaW5nRnJvbUNsYXVzZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlLCB0aGlzLmxvb2thaGVhZC52YWx1ZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvLyBleHBvcnQge2Zvb307XG5cdCAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bWVTZW1pY29sb24oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZmluYWxpemUobm9kZSwgbmV3IE5vZGUuRXhwb3J0TmFtZWREZWNsYXJhdGlvbihudWxsLCBzcGVjaWZpZXJzLCBzb3VyY2UpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGV4cG9ydERlY2xhcmF0aW9uO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBQYXJzZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuUGFyc2VyID0gUGFyc2VyO1xuXG5cbi8qKiovIH0sXG4vKiA5ICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0Ly8gRW5zdXJlIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSwgb3RoZXJ3aXNlIHRocm93IGFuIGVycm9yLlxuXHQvLyBUaGlzIGlzIG9ubHkgdG8gaGF2ZSBhIGJldHRlciBjb250cmFjdCBzZW1hbnRpYywgaS5lLiBhbm90aGVyIHNhZmV0eSBuZXRcblx0Ly8gdG8gY2F0Y2ggYSBsb2dpYyBlcnJvci4gVGhlIGNvbmRpdGlvbiBzaGFsbCBiZSBmdWxmaWxsZWQgaW4gbm9ybWFsIGNhc2UuXG5cdC8vIERvIE5PVCB1c2UgdGhpcyB0byBlbmZvcmNlIGEgY2VydGFpbiBjb25kaXRpb24gb24gYW55IHVzZXIgaW5wdXQuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0ZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuXHQgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5cdCAgICBpZiAoIWNvbmRpdGlvbikge1xuXHQgICAgICAgIHRocm93IG5ldyBFcnJvcignQVNTRVJUOiAnICsgbWVzc2FnZSk7XG5cdCAgICB9XG5cdH1cblx0ZXhwb3J0cy5hc3NlcnQgPSBhc3NlcnQ7XG5cblxuLyoqKi8gfSxcbi8qIDEwICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0LyogdHNsaW50OmRpc2FibGU6bWF4LWNsYXNzZXMtcGVyLWZpbGUgKi9cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHR2YXIgRXJyb3JIYW5kbGVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIEVycm9ySGFuZGxlcigpIHtcblx0ICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuXHQgICAgICAgIHRoaXMudG9sZXJhbnQgPSBmYWxzZTtcblx0ICAgIH1cblx0ICAgIEVycm9ySGFuZGxlci5wcm90b3R5cGUucmVjb3JkRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcblx0ICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKTtcblx0ICAgIH07XG5cdCAgICBFcnJvckhhbmRsZXIucHJvdG90eXBlLnRvbGVyYXRlID0gZnVuY3Rpb24gKGVycm9yKSB7XG5cdCAgICAgICAgaWYgKHRoaXMudG9sZXJhbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy5yZWNvcmRFcnJvcihlcnJvcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aHJvdyBlcnJvcjtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgRXJyb3JIYW5kbGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RFcnJvciA9IGZ1bmN0aW9uIChtc2csIGNvbHVtbikge1xuXHQgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihtc2cpO1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIHRocm93IGVycm9yO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjYXRjaCAoYmFzZSkge1xuXHQgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHQgICAgICAgICAgICBpZiAoT2JqZWN0LmNyZWF0ZSAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcblx0ICAgICAgICAgICAgICAgIGVycm9yID0gT2JqZWN0LmNyZWF0ZShiYXNlKTtcblx0ICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ2NvbHVtbicsIHsgdmFsdWU6IGNvbHVtbiB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXHQgICAgICAgIHJldHVybiBlcnJvcjtcblx0ICAgIH07XG5cdCAgICBFcnJvckhhbmRsZXIucHJvdG90eXBlLmNyZWF0ZUVycm9yID0gZnVuY3Rpb24gKGluZGV4LCBsaW5lLCBjb2wsIGRlc2NyaXB0aW9uKSB7XG5cdCAgICAgICAgdmFyIG1zZyA9ICdMaW5lICcgKyBsaW5lICsgJzogJyArIGRlc2NyaXB0aW9uO1xuXHQgICAgICAgIHZhciBlcnJvciA9IHRoaXMuY29uc3RydWN0RXJyb3IobXNnLCBjb2wpO1xuXHQgICAgICAgIGVycm9yLmluZGV4ID0gaW5kZXg7XG5cdCAgICAgICAgZXJyb3IubGluZU51bWJlciA9IGxpbmU7XG5cdCAgICAgICAgZXJyb3IuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcblx0ICAgICAgICByZXR1cm4gZXJyb3I7XG5cdCAgICB9O1xuXHQgICAgRXJyb3JIYW5kbGVyLnByb3RvdHlwZS50aHJvd0Vycm9yID0gZnVuY3Rpb24gKGluZGV4LCBsaW5lLCBjb2wsIGRlc2NyaXB0aW9uKSB7XG5cdCAgICAgICAgdGhyb3cgdGhpcy5jcmVhdGVFcnJvcihpbmRleCwgbGluZSwgY29sLCBkZXNjcmlwdGlvbik7XG5cdCAgICB9O1xuXHQgICAgRXJyb3JIYW5kbGVyLnByb3RvdHlwZS50b2xlcmF0ZUVycm9yID0gZnVuY3Rpb24gKGluZGV4LCBsaW5lLCBjb2wsIGRlc2NyaXB0aW9uKSB7XG5cdCAgICAgICAgdmFyIGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihpbmRleCwgbGluZSwgY29sLCBkZXNjcmlwdGlvbik7XG5cdCAgICAgICAgaWYgKHRoaXMudG9sZXJhbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy5yZWNvcmRFcnJvcihlcnJvcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aHJvdyBlcnJvcjtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIEVycm9ySGFuZGxlcjtcblx0fSgpKTtcblx0ZXhwb3J0cy5FcnJvckhhbmRsZXIgPSBFcnJvckhhbmRsZXI7XG5cblxuLyoqKi8gfSxcbi8qIDExICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHQvLyBFcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIFY4LlxuXHRleHBvcnRzLk1lc3NhZ2VzID0ge1xuXHQgICAgQmFkR2V0dGVyQXJpdHk6ICdHZXR0ZXIgbXVzdCBub3QgaGF2ZSBhbnkgZm9ybWFsIHBhcmFtZXRlcnMnLFxuXHQgICAgQmFkU2V0dGVyQXJpdHk6ICdTZXR0ZXIgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGZvcm1hbCBwYXJhbWV0ZXInLFxuXHQgICAgQmFkU2V0dGVyUmVzdFBhcmFtZXRlcjogJ1NldHRlciBmdW5jdGlvbiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIHJlc3QgcGFyYW1ldGVyJyxcblx0ICAgIENvbnN0cnVjdG9ySXNBc3luYzogJ0NsYXNzIGNvbnN0cnVjdG9yIG1heSBub3QgYmUgYW4gYXN5bmMgbWV0aG9kJyxcblx0ICAgIENvbnN0cnVjdG9yU3BlY2lhbE1ldGhvZDogJ0NsYXNzIGNvbnN0cnVjdG9yIG1heSBub3QgYmUgYW4gYWNjZXNzb3InLFxuXHQgICAgRGVjbGFyYXRpb25NaXNzaW5nSW5pdGlhbGl6ZXI6ICdNaXNzaW5nIGluaXRpYWxpemVyIGluICUwIGRlY2xhcmF0aW9uJyxcblx0ICAgIERlZmF1bHRSZXN0UGFyYW1ldGVyOiAnVW5leHBlY3RlZCB0b2tlbiA9Jyxcblx0ICAgIER1cGxpY2F0ZUJpbmRpbmc6ICdEdXBsaWNhdGUgYmluZGluZyAlMCcsXG5cdCAgICBEdXBsaWNhdGVDb25zdHJ1Y3RvcjogJ0EgY2xhc3MgbWF5IG9ubHkgaGF2ZSBvbmUgY29uc3RydWN0b3InLFxuXHQgICAgRHVwbGljYXRlUHJvdG9Qcm9wZXJ0eTogJ0R1cGxpY2F0ZSBfX3Byb3RvX18gZmllbGRzIGFyZSBub3QgYWxsb3dlZCBpbiBvYmplY3QgbGl0ZXJhbHMnLFxuXHQgICAgRm9ySW5PZkxvb3BJbml0aWFsaXplcjogJyUwIGxvb3AgdmFyaWFibGUgZGVjbGFyYXRpb24gbWF5IG5vdCBoYXZlIGFuIGluaXRpYWxpemVyJyxcblx0ICAgIEdlbmVyYXRvckluTGVnYWN5Q29udGV4dDogJ0dlbmVyYXRvciBkZWNsYXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIGluIGxlZ2FjeSBjb250ZXh0cycsXG5cdCAgICBJbGxlZ2FsQnJlYWs6ICdJbGxlZ2FsIGJyZWFrIHN0YXRlbWVudCcsXG5cdCAgICBJbGxlZ2FsQ29udGludWU6ICdJbGxlZ2FsIGNvbnRpbnVlIHN0YXRlbWVudCcsXG5cdCAgICBJbGxlZ2FsRXhwb3J0RGVjbGFyYXRpb246ICdVbmV4cGVjdGVkIHRva2VuJyxcblx0ICAgIElsbGVnYWxJbXBvcnREZWNsYXJhdGlvbjogJ1VuZXhwZWN0ZWQgdG9rZW4nLFxuXHQgICAgSWxsZWdhbExhbmd1YWdlTW9kZURpcmVjdGl2ZTogJ0lsbGVnYWwgXFwndXNlIHN0cmljdFxcJyBkaXJlY3RpdmUgaW4gZnVuY3Rpb24gd2l0aCBub24tc2ltcGxlIHBhcmFtZXRlciBsaXN0Jyxcblx0ICAgIElsbGVnYWxSZXR1cm46ICdJbGxlZ2FsIHJldHVybiBzdGF0ZW1lbnQnLFxuXHQgICAgSW52YWxpZEVzY2FwZWRSZXNlcnZlZFdvcmQ6ICdLZXl3b3JkIG11c3Qgbm90IGNvbnRhaW4gZXNjYXBlZCBjaGFyYWN0ZXJzJyxcblx0ICAgIEludmFsaWRIZXhFc2NhcGVTZXF1ZW5jZTogJ0ludmFsaWQgaGV4YWRlY2ltYWwgZXNjYXBlIHNlcXVlbmNlJyxcblx0ICAgIEludmFsaWRMSFNJbkFzc2lnbm1lbnQ6ICdJbnZhbGlkIGxlZnQtaGFuZCBzaWRlIGluIGFzc2lnbm1lbnQnLFxuXHQgICAgSW52YWxpZExIU0luRm9ySW46ICdJbnZhbGlkIGxlZnQtaGFuZCBzaWRlIGluIGZvci1pbicsXG5cdCAgICBJbnZhbGlkTEhTSW5Gb3JMb29wOiAnSW52YWxpZCBsZWZ0LWhhbmQgc2lkZSBpbiBmb3ItbG9vcCcsXG5cdCAgICBJbnZhbGlkTW9kdWxlU3BlY2lmaWVyOiAnVW5leHBlY3RlZCB0b2tlbicsXG5cdCAgICBJbnZhbGlkUmVnRXhwOiAnSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24nLFxuXHQgICAgTGV0SW5MZXhpY2FsQmluZGluZzogJ2xldCBpcyBkaXNhbGxvd2VkIGFzIGEgbGV4aWNhbGx5IGJvdW5kIG5hbWUnLFxuXHQgICAgTWlzc2luZ0Zyb21DbGF1c2U6ICdVbmV4cGVjdGVkIHRva2VuJyxcblx0ICAgIE11bHRpcGxlRGVmYXVsdHNJblN3aXRjaDogJ01vcmUgdGhhbiBvbmUgZGVmYXVsdCBjbGF1c2UgaW4gc3dpdGNoIHN0YXRlbWVudCcsXG5cdCAgICBOZXdsaW5lQWZ0ZXJUaHJvdzogJ0lsbGVnYWwgbmV3bGluZSBhZnRlciB0aHJvdycsXG5cdCAgICBOb0FzQWZ0ZXJJbXBvcnROYW1lc3BhY2U6ICdVbmV4cGVjdGVkIHRva2VuJyxcblx0ICAgIE5vQ2F0Y2hPckZpbmFsbHk6ICdNaXNzaW5nIGNhdGNoIG9yIGZpbmFsbHkgYWZ0ZXIgdHJ5Jyxcblx0ICAgIFBhcmFtZXRlckFmdGVyUmVzdFBhcmFtZXRlcjogJ1Jlc3QgcGFyYW1ldGVyIG11c3QgYmUgbGFzdCBmb3JtYWwgcGFyYW1ldGVyJyxcblx0ICAgIFJlZGVjbGFyYXRpb246ICclMCBcXCclMVxcJyBoYXMgYWxyZWFkeSBiZWVuIGRlY2xhcmVkJyxcblx0ICAgIFN0YXRpY1Byb3RvdHlwZTogJ0NsYXNzZXMgbWF5IG5vdCBoYXZlIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBwcm90b3R5cGUnLFxuXHQgICAgU3RyaWN0Q2F0Y2hWYXJpYWJsZTogJ0NhdGNoIHZhcmlhYmxlIG1heSBub3QgYmUgZXZhbCBvciBhcmd1bWVudHMgaW4gc3RyaWN0IG1vZGUnLFxuXHQgICAgU3RyaWN0RGVsZXRlOiAnRGVsZXRlIG9mIGFuIHVucXVhbGlmaWVkIGlkZW50aWZpZXIgaW4gc3RyaWN0IG1vZGUuJyxcblx0ICAgIFN0cmljdEZ1bmN0aW9uOiAnSW4gc3RyaWN0IG1vZGUgY29kZSwgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGF0IHRvcCBsZXZlbCBvciBpbnNpZGUgYSBibG9jaycsXG5cdCAgICBTdHJpY3RGdW5jdGlvbk5hbWU6ICdGdW5jdGlvbiBuYW1lIG1heSBub3QgYmUgZXZhbCBvciBhcmd1bWVudHMgaW4gc3RyaWN0IG1vZGUnLFxuXHQgICAgU3RyaWN0TEhTQXNzaWdubWVudDogJ0Fzc2lnbm1lbnQgdG8gZXZhbCBvciBhcmd1bWVudHMgaXMgbm90IGFsbG93ZWQgaW4gc3RyaWN0IG1vZGUnLFxuXHQgICAgU3RyaWN0TEhTUG9zdGZpeDogJ1Bvc3RmaXggaW5jcmVtZW50L2RlY3JlbWVudCBtYXkgbm90IGhhdmUgZXZhbCBvciBhcmd1bWVudHMgb3BlcmFuZCBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3RMSFNQcmVmaXg6ICdQcmVmaXggaW5jcmVtZW50L2RlY3JlbWVudCBtYXkgbm90IGhhdmUgZXZhbCBvciBhcmd1bWVudHMgb3BlcmFuZCBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3RNb2RlV2l0aDogJ1N0cmljdCBtb2RlIGNvZGUgbWF5IG5vdCBpbmNsdWRlIGEgd2l0aCBzdGF0ZW1lbnQnLFxuXHQgICAgU3RyaWN0T2N0YWxMaXRlcmFsOiAnT2N0YWwgbGl0ZXJhbHMgYXJlIG5vdCBhbGxvd2VkIGluIHN0cmljdCBtb2RlLicsXG5cdCAgICBTdHJpY3RQYXJhbUR1cGU6ICdTdHJpY3QgbW9kZSBmdW5jdGlvbiBtYXkgbm90IGhhdmUgZHVwbGljYXRlIHBhcmFtZXRlciBuYW1lcycsXG5cdCAgICBTdHJpY3RQYXJhbU5hbWU6ICdQYXJhbWV0ZXIgbmFtZSBldmFsIG9yIGFyZ3VtZW50cyBpcyBub3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBTdHJpY3RSZXNlcnZlZFdvcmQ6ICdVc2Ugb2YgZnV0dXJlIHJlc2VydmVkIHdvcmQgaW4gc3RyaWN0IG1vZGUnLFxuXHQgICAgU3RyaWN0VmFyTmFtZTogJ1ZhcmlhYmxlIG5hbWUgbWF5IG5vdCBiZSBldmFsIG9yIGFyZ3VtZW50cyBpbiBzdHJpY3QgbW9kZScsXG5cdCAgICBUZW1wbGF0ZU9jdGFsTGl0ZXJhbDogJ09jdGFsIGxpdGVyYWxzIGFyZSBub3QgYWxsb3dlZCBpbiB0ZW1wbGF0ZSBzdHJpbmdzLicsXG5cdCAgICBVbmV4cGVjdGVkRU9TOiAnVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQnLFxuXHQgICAgVW5leHBlY3RlZElkZW50aWZpZXI6ICdVbmV4cGVjdGVkIGlkZW50aWZpZXInLFxuXHQgICAgVW5leHBlY3RlZE51bWJlcjogJ1VuZXhwZWN0ZWQgbnVtYmVyJyxcblx0ICAgIFVuZXhwZWN0ZWRSZXNlcnZlZDogJ1VuZXhwZWN0ZWQgcmVzZXJ2ZWQgd29yZCcsXG5cdCAgICBVbmV4cGVjdGVkU3RyaW5nOiAnVW5leHBlY3RlZCBzdHJpbmcnLFxuXHQgICAgVW5leHBlY3RlZFRlbXBsYXRlOiAnVW5leHBlY3RlZCBxdWFzaSAlMCcsXG5cdCAgICBVbmV4cGVjdGVkVG9rZW46ICdVbmV4cGVjdGVkIHRva2VuICUwJyxcblx0ICAgIFVuZXhwZWN0ZWRUb2tlbklsbGVnYWw6ICdVbmV4cGVjdGVkIHRva2VuIElMTEVHQUwnLFxuXHQgICAgVW5rbm93bkxhYmVsOiAnVW5kZWZpbmVkIGxhYmVsIFxcJyUwXFwnJyxcblx0ICAgIFVudGVybWluYXRlZFJlZ0V4cDogJ0ludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiBtaXNzaW5nIC8nXG5cdH07XG5cblxuLyoqKi8gfSxcbi8qIDEyICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHR2YXIgYXNzZXJ0XzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHR2YXIgY2hhcmFjdGVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIgbWVzc2FnZXNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXHRmdW5jdGlvbiBoZXhWYWx1ZShjaCkge1xuXHQgICAgcmV0dXJuICcwMTIzNDU2Nzg5YWJjZGVmJy5pbmRleE9mKGNoLnRvTG93ZXJDYXNlKCkpO1xuXHR9XG5cdGZ1bmN0aW9uIG9jdGFsVmFsdWUoY2gpIHtcblx0ICAgIHJldHVybiAnMDEyMzQ1NjcnLmluZGV4T2YoY2gpO1xuXHR9XG5cdHZhciBTY2FubmVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFNjYW5uZXIoY29kZSwgaGFuZGxlcikge1xuXHQgICAgICAgIHRoaXMuc291cmNlID0gY29kZTtcblx0ICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IGhhbmRsZXI7XG5cdCAgICAgICAgdGhpcy50cmFja0NvbW1lbnQgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmlzTW9kdWxlID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5sZW5ndGggPSBjb2RlLmxlbmd0aDtcblx0ICAgICAgICB0aGlzLmluZGV4ID0gMDtcblx0ICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSAoY29kZS5sZW5ndGggPiAwKSA/IDEgOiAwO1xuXHQgICAgICAgIHRoaXMubGluZVN0YXJ0ID0gMDtcblx0ICAgICAgICB0aGlzLmN1cmx5U3RhY2sgPSBbXTtcblx0ICAgIH1cblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNhdmVTdGF0ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICBpbmRleDogdGhpcy5pbmRleCxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0XG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5yZXN0b3JlU3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcblx0ICAgICAgICB0aGlzLmluZGV4ID0gc3RhdGUuaW5kZXg7XG5cdCAgICAgICAgdGhpcy5saW5lTnVtYmVyID0gc3RhdGUubGluZU51bWJlcjtcblx0ICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHN0YXRlLmxpbmVTdGFydDtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5lb2YgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPj0gdGhpcy5sZW5ndGg7XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUudGhyb3dVbmV4cGVjdGVkVG9rZW4gPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuXHQgICAgICAgIGlmIChtZXNzYWdlID09PSB2b2lkIDApIHsgbWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuSWxsZWdhbDsgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlci50aHJvd0Vycm9yKHRoaXMuaW5kZXgsIHRoaXMubGluZU51bWJlciwgdGhpcy5pbmRleCAtIHRoaXMubGluZVN0YXJ0ICsgMSwgbWVzc2FnZSk7XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4gPSBmdW5jdGlvbiAobWVzc2FnZSkge1xuXHQgICAgICAgIGlmIChtZXNzYWdlID09PSB2b2lkIDApIHsgbWVzc2FnZSA9IG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW5leHBlY3RlZFRva2VuSWxsZWdhbDsgfVxuXHQgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLnRvbGVyYXRlRXJyb3IodGhpcy5pbmRleCwgdGhpcy5saW5lTnVtYmVyLCB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnQgKyAxLCBtZXNzYWdlKTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jb21tZW50c1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2tpcFNpbmdsZUxpbmVDb21tZW50ID0gZnVuY3Rpb24gKG9mZnNldCkge1xuXHQgICAgICAgIHZhciBjb21tZW50cyA9IFtdO1xuXHQgICAgICAgIHZhciBzdGFydCwgbG9jO1xuXHQgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICBjb21tZW50cyA9IFtdO1xuXHQgICAgICAgICAgICBzdGFydCA9IHRoaXMuaW5kZXggLSBvZmZzZXQ7XG5cdCAgICAgICAgICAgIGxvYyA9IHtcblx0ICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5pbmRleCAtIHRoaXMubGluZVN0YXJ0IC0gb2Zmc2V0XG5cdCAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgZW5kOiB7fVxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KTtcblx0ICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2gpKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0NvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBsb2MuZW5kID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5pbmRleCAtIHRoaXMubGluZVN0YXJ0IC0gMVxuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aUxpbmU6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzbGljZTogW3N0YXJ0ICsgb2Zmc2V0LCB0aGlzLmluZGV4IC0gMV0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlOiBbc3RhcnQsIHRoaXMuaW5kZXggLSAxXSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbG9jOiBsb2Ncblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goZW50cnkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAxMyAmJiB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpID09PSAxMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICsrdGhpcy5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1lbnRzO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICBsb2MuZW5kID0ge1xuXHQgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnRcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgdmFyIGVudHJ5ID0ge1xuXHQgICAgICAgICAgICAgICAgbXVsdGlMaW5lOiBmYWxzZSxcblx0ICAgICAgICAgICAgICAgIHNsaWNlOiBbc3RhcnQgKyBvZmZzZXQsIHRoaXMuaW5kZXhdLFxuXHQgICAgICAgICAgICAgICAgcmFuZ2U6IFtzdGFydCwgdGhpcy5pbmRleF0sXG5cdCAgICAgICAgICAgICAgICBsb2M6IGxvY1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBjb21tZW50cy5wdXNoKGVudHJ5KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGNvbW1lbnRzO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNraXBNdWx0aUxpbmVDb21tZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBjb21tZW50cyA9IFtdO1xuXHQgICAgICAgIHZhciBzdGFydCwgbG9jO1xuXHQgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICBjb21tZW50cyA9IFtdO1xuXHQgICAgICAgICAgICBzdGFydCA9IHRoaXMuaW5kZXggLSAyO1xuXHQgICAgICAgICAgICBsb2MgPSB7XG5cdCAgICAgICAgICAgICAgICBzdGFydDoge1xuXHQgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuaW5kZXggLSB0aGlzLmxpbmVTdGFydCAtIDJcblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBlbmQ6IHt9XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuXHQgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2gpKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09IDB4MEQgJiYgdGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4ICsgMSkgPT09IDB4MEEpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICArK3RoaXMubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIHRoaXMubGluZVN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gMHgyQSkge1xuXHQgICAgICAgICAgICAgICAgLy8gQmxvY2sgY29tbWVudCBlbmRzIHdpdGggJyovJy5cblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXggKyAxKSA9PT0gMHgyRikge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gMjtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0NvbW1lbnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbG9jLmVuZCA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5pbmRleCAtIHRoaXMubGluZVN0YXJ0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpTGluZTogdHJ1ZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlOiBbc3RhcnQgKyAyLCB0aGlzLmluZGV4IC0gMl0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTogW3N0YXJ0LCB0aGlzLmluZGV4XSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYzogbG9jXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnB1c2goZW50cnkpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tbWVudHM7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gUmFuIG9mZiB0aGUgZW5kIG9mIHRoZSBmaWxlIC0gdGhlIHdob2xlIHRoaW5nIGlzIGEgY29tbWVudFxuXHQgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICBsb2MuZW5kID0ge1xuXHQgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmluZGV4IC0gdGhpcy5saW5lU3RhcnRcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgdmFyIGVudHJ5ID0ge1xuXHQgICAgICAgICAgICAgICAgbXVsdGlMaW5lOiB0cnVlLFxuXHQgICAgICAgICAgICAgICAgc2xpY2U6IFtzdGFydCArIDIsIHRoaXMuaW5kZXhdLFxuXHQgICAgICAgICAgICAgICAgcmFuZ2U6IFtzdGFydCwgdGhpcy5pbmRleF0sXG5cdCAgICAgICAgICAgICAgICBsb2M6IGxvY1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBjb21tZW50cy5wdXNoKGVudHJ5KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIHJldHVybiBjb21tZW50cztcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuQ29tbWVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNvbW1lbnRzO1xuXHQgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICBjb21tZW50cyA9IFtdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgc3RhcnQgPSAodGhpcy5pbmRleCA9PT0gMCk7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNXaGl0ZVNwYWNlKGNoKSkge1xuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoKSkge1xuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAweDBEICYmIHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkgPT09IDB4MEEpIHtcblx0ICAgICAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICArK3RoaXMubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgICAgIHRoaXMubGluZVN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIHN0YXJ0ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gMHgyRikge1xuXHQgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXggKyAxKTtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gMHgyRikge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gMjtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY29tbWVudCA9IHRoaXMuc2tpcFNpbmdsZUxpbmVDb21tZW50KDIpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrQ29tbWVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50cyA9IGNvbW1lbnRzLmNvbmNhdChjb21tZW50KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT09IDB4MkEpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDI7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSB0aGlzLnNraXBNdWx0aUxpbmVDb21tZW50KCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzID0gY29tbWVudHMuY29uY2F0KGNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0ICYmIGNoID09PSAweDJEKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBVKzAwM0UgaXMgJz4nXG5cdCAgICAgICAgICAgICAgICBpZiAoKHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCArIDEpID09PSAweDJEKSAmJiAodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4ICsgMikgPT09IDB4M0UpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gJy0tPicgaXMgYSBzaW5nbGUtbGluZSBjb21tZW50XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCArPSAzO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0gdGhpcy5za2lwU2luZ2xlTGluZUNvbW1lbnQoMyk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzID0gY29tbWVudHMuY29uY2F0KGNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAweDNDICYmICF0aGlzLmlzTW9kdWxlKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2Uuc2xpY2UodGhpcy5pbmRleCArIDEsIHRoaXMuaW5kZXggKyA0KSA9PT0gJyEtLScpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDQ7IC8vIGA8IS0tYFxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0gdGhpcy5za2lwU2luZ2xlTGluZUNvbW1lbnQoNCk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzID0gY29tbWVudHMuY29uY2F0KGNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGNvbW1lbnRzO1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWZ1dHVyZS1yZXNlcnZlZC13b3Jkc1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuaXNGdXR1cmVSZXNlcnZlZFdvcmQgPSBmdW5jdGlvbiAoaWQpIHtcblx0ICAgICAgICBzd2l0Y2ggKGlkKSB7XG5cdCAgICAgICAgICAgIGNhc2UgJ2VudW0nOlxuXHQgICAgICAgICAgICBjYXNlICdleHBvcnQnOlxuXHQgICAgICAgICAgICBjYXNlICdpbXBvcnQnOlxuXHQgICAgICAgICAgICBjYXNlICdzdXBlcic6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkID0gZnVuY3Rpb24gKGlkKSB7XG5cdCAgICAgICAgc3dpdGNoIChpZCkge1xuXHQgICAgICAgICAgICBjYXNlICdpbXBsZW1lbnRzJzpcblx0ICAgICAgICAgICAgY2FzZSAnaW50ZXJmYWNlJzpcblx0ICAgICAgICAgICAgY2FzZSAncGFja2FnZSc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3ByaXZhdGUnOlxuXHQgICAgICAgICAgICBjYXNlICdwcm90ZWN0ZWQnOlxuXHQgICAgICAgICAgICBjYXNlICdwdWJsaWMnOlxuXHQgICAgICAgICAgICBjYXNlICdzdGF0aWMnOlxuXHQgICAgICAgICAgICBjYXNlICd5aWVsZCc6XG5cdCAgICAgICAgICAgIGNhc2UgJ2xldCc6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuaXNSZXN0cmljdGVkV29yZCA9IGZ1bmN0aW9uIChpZCkge1xuXHQgICAgICAgIHJldHVybiBpZCA9PT0gJ2V2YWwnIHx8IGlkID09PSAnYXJndW1lbnRzJztcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1rZXl3b3Jkc1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuaXNLZXl3b3JkID0gZnVuY3Rpb24gKGlkKSB7XG5cdCAgICAgICAgc3dpdGNoIChpZC5sZW5ndGgpIHtcblx0ICAgICAgICAgICAgY2FzZSAyOlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ2lmJykgfHwgKGlkID09PSAnaW4nKSB8fCAoaWQgPT09ICdkbycpO1xuXHQgICAgICAgICAgICBjYXNlIDM6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAndmFyJykgfHwgKGlkID09PSAnZm9yJykgfHwgKGlkID09PSAnbmV3JykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAoaWQgPT09ICd0cnknKSB8fCAoaWQgPT09ICdsZXQnKTtcblx0ICAgICAgICAgICAgY2FzZSA0OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3RoaXMnKSB8fCAoaWQgPT09ICdlbHNlJykgfHwgKGlkID09PSAnY2FzZScpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKGlkID09PSAndm9pZCcpIHx8IChpZCA9PT0gJ3dpdGgnKSB8fCAoaWQgPT09ICdlbnVtJyk7XG5cdCAgICAgICAgICAgIGNhc2UgNTpcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICd3aGlsZScpIHx8IChpZCA9PT0gJ2JyZWFrJykgfHwgKGlkID09PSAnY2F0Y2gnKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgIChpZCA9PT0gJ3Rocm93JykgfHwgKGlkID09PSAnY29uc3QnKSB8fCAoaWQgPT09ICd5aWVsZCcpIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgKGlkID09PSAnY2xhc3MnKSB8fCAoaWQgPT09ICdzdXBlcicpO1xuXHQgICAgICAgICAgICBjYXNlIDY6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAncmV0dXJuJykgfHwgKGlkID09PSAndHlwZW9mJykgfHwgKGlkID09PSAnZGVsZXRlJykgfHxcblx0ICAgICAgICAgICAgICAgICAgICAoaWQgPT09ICdzd2l0Y2gnKSB8fCAoaWQgPT09ICdleHBvcnQnKSB8fCAoaWQgPT09ICdpbXBvcnQnKTtcblx0ICAgICAgICAgICAgY2FzZSA3OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ2RlZmF1bHQnKSB8fCAoaWQgPT09ICdmaW5hbGx5JykgfHwgKGlkID09PSAnZXh0ZW5kcycpO1xuXHQgICAgICAgICAgICBjYXNlIDg6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAnZnVuY3Rpb24nKSB8fCAoaWQgPT09ICdjb250aW51ZScpIHx8IChpZCA9PT0gJ2RlYnVnZ2VyJyk7XG5cdCAgICAgICAgICAgIGNhc2UgMTA6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gKGlkID09PSAnaW5zdGFuY2VvZicpO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5jb2RlUG9pbnRBdCA9IGZ1bmN0aW9uIChpKSB7XG5cdCAgICAgICAgdmFyIGNwID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdChpKTtcblx0ICAgICAgICBpZiAoY3AgPj0gMHhEODAwICYmIGNwIDw9IDB4REJGRikge1xuXHQgICAgICAgICAgICB2YXIgc2Vjb25kID0gdGhpcy5zb3VyY2UuY2hhckNvZGVBdChpICsgMSk7XG5cdCAgICAgICAgICAgIGlmIChzZWNvbmQgPj0gMHhEQzAwICYmIHNlY29uZCA8PSAweERGRkYpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IGNwO1xuXHQgICAgICAgICAgICAgICAgY3AgPSAoZmlyc3QgLSAweEQ4MDApICogMHg0MDAgKyBzZWNvbmQgLSAweERDMDAgKyAweDEwMDAwO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBjcDtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuSGV4RXNjYXBlID0gZnVuY3Rpb24gKHByZWZpeCkge1xuXHQgICAgICAgIHZhciBsZW4gPSAocHJlZml4ID09PSAndScpID8gNCA6IDI7XG5cdCAgICAgICAgdmFyIGNvZGUgPSAwO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLmVvZigpICYmIGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0hleERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICBjb2RlID0gY29kZSAqIDE2ICsgaGV4VmFsdWUodGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuVW5pY29kZUNvZGVQb2ludEVzY2FwZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICB2YXIgY29kZSA9IDA7XG5cdCAgICAgICAgLy8gQXQgbGVhc3QsIG9uZSBoZXggZGlnaXQgaXMgcmVxdWlyZWQuXG5cdCAgICAgICAgaWYgKGNoID09PSAnfScpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICBpZiAoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0hleERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb2RlID0gY29kZSAqIDE2ICsgaGV4VmFsdWUoY2gpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoY29kZSA+IDB4MTBGRkZGIHx8IGNoICE9PSAnfScpIHtcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmZyb21Db2RlUG9pbnQoY29kZSk7XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuZ2V0SWRlbnRpZmllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmluZGV4Kys7XG5cdCAgICAgICAgd2hpbGUgKCF0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCk7XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gMHg1Qykge1xuXHQgICAgICAgICAgICAgICAgLy8gQmxhY2tzbGFzaCAoVSswMDVDKSBtYXJrcyBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZS5cblx0ICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSBzdGFydDtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbXBsZXhJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2ggPj0gMHhEODAwICYmIGNoIDwgMHhERkZGKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGhhbmRsZSBzdXJyb2dhdGUgcGFpcnMuXG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gc3RhcnQ7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb21wbGV4SWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyUGFydChjaCkpIHtcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zbGljZShzdGFydCwgdGhpcy5pbmRleCk7XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuZ2V0Q29tcGxleElkZW50aWZpZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNwID0gdGhpcy5jb2RlUG9pbnRBdCh0aGlzLmluZGV4KTtcblx0ICAgICAgICB2YXIgaWQgPSBjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuZnJvbUNvZGVQb2ludChjcCk7XG5cdCAgICAgICAgdGhpcy5pbmRleCArPSBpZC5sZW5ndGg7XG5cdCAgICAgICAgLy8gJ1xcdScgKFUrMDA1QywgVSswMDc1KSBkZW5vdGVzIGFuIGVzY2FwZWQgY2hhcmFjdGVyLlxuXHQgICAgICAgIHZhciBjaDtcblx0ICAgICAgICBpZiAoY3AgPT09IDB4NUMpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkgIT09IDB4NzUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICBjaCA9IHRoaXMuc2NhblVuaWNvZGVDb2RlUG9pbnRFc2NhcGUoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGNoID0gdGhpcy5zY2FuSGV4RXNjYXBlKCd1Jyk7XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09IG51bGwgfHwgY2ggPT09ICdcXFxcJyB8fCAhY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlkID0gY2g7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICBjcCA9IHRoaXMuY29kZVBvaW50QXQodGhpcy5pbmRleCk7XG5cdCAgICAgICAgICAgIGlmICghY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclBhcnQoY3ApKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjaCA9IGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5mcm9tQ29kZVBvaW50KGNwKTtcblx0ICAgICAgICAgICAgaWQgKz0gY2g7XG5cdCAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gY2gubGVuZ3RoO1xuXHQgICAgICAgICAgICAvLyAnXFx1JyAoVSswMDVDLCBVKzAwNzUpIGRlbm90ZXMgYW4gZXNjYXBlZCBjaGFyYWN0ZXIuXG5cdCAgICAgICAgICAgIGlmIChjcCA9PT0gMHg1Qykge1xuXHQgICAgICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHIoMCwgaWQubGVuZ3RoIC0gMSk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSAhPT0gMHg3NSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5zY2FuVW5pY29kZUNvZGVQb2ludEVzY2FwZSgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnNjYW5IZXhFc2NhcGUoJ3UnKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09IG51bGwgfHwgY2ggPT09ICdcXFxcJyB8fCAhY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclBhcnQoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlkICs9IGNoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBpZDtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5vY3RhbFRvRGVjaW1hbCA9IGZ1bmN0aW9uIChjaCkge1xuXHQgICAgICAgIC8vIFxcMCBpcyBub3Qgb2N0YWwgZXNjYXBlIHNlcXVlbmNlXG5cdCAgICAgICAgdmFyIG9jdGFsID0gKGNoICE9PSAnMCcpO1xuXHQgICAgICAgIHZhciBjb2RlID0gb2N0YWxWYWx1ZShjaCk7XG5cdCAgICAgICAgaWYgKCF0aGlzLmVvZigpICYmIGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgb2N0YWwgPSB0cnVlO1xuXHQgICAgICAgICAgICBjb2RlID0gY29kZSAqIDggKyBvY3RhbFZhbHVlKHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK10pO1xuXHQgICAgICAgICAgICAvLyAzIGRpZ2l0cyBhcmUgb25seSBhbGxvd2VkIHdoZW4gc3RyaW5nIHN0YXJ0c1xuXHQgICAgICAgICAgICAvLyB3aXRoIDAsIDEsIDIsIDNcblx0ICAgICAgICAgICAgaWYgKCcwMTIzJy5pbmRleE9mKGNoKSA+PSAwICYmICF0aGlzLmVvZigpICYmIGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlICogOCArIG9jdGFsVmFsdWUodGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgY29kZTogY29kZSxcblx0ICAgICAgICAgICAgb2N0YWw6IG9jdGFsXG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1uYW1lcy1hbmQta2V5d29yZHNcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5JZGVudGlmaWVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0eXBlO1xuXHQgICAgICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgLy8gQmFja3NsYXNoIChVKzAwNUMpIHN0YXJ0cyBhbiBlc2NhcGVkIGNoYXJhY3Rlci5cblx0ICAgICAgICB2YXIgaWQgPSAodGhpcy5zb3VyY2UuY2hhckNvZGVBdChzdGFydCkgPT09IDB4NUMpID8gdGhpcy5nZXRDb21wbGV4SWRlbnRpZmllcigpIDogdGhpcy5nZXRJZGVudGlmaWVyKCk7XG5cdCAgICAgICAgLy8gVGhlcmUgaXMgbm8ga2V5d29yZCBvciBsaXRlcmFsIHdpdGggb25seSBvbmUgY2hhcmFjdGVyLlxuXHQgICAgICAgIC8vIFRodXMsIGl0IG11c3QgYmUgYW4gaWRlbnRpZmllci5cblx0ICAgICAgICBpZiAoaWQubGVuZ3RoID09PSAxKSB7XG5cdCAgICAgICAgICAgIHR5cGUgPSAzIC8qIElkZW50aWZpZXIgKi87XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNLZXl3b3JkKGlkKSkge1xuXHQgICAgICAgICAgICB0eXBlID0gNCAvKiBLZXl3b3JkICovO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmIChpZCA9PT0gJ251bGwnKSB7XG5cdCAgICAgICAgICAgIHR5cGUgPSA1IC8qIE51bGxMaXRlcmFsICovO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmIChpZCA9PT0gJ3RydWUnIHx8IGlkID09PSAnZmFsc2UnKSB7XG5cdCAgICAgICAgICAgIHR5cGUgPSAxIC8qIEJvb2xlYW5MaXRlcmFsICovO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgdHlwZSA9IDMgLyogSWRlbnRpZmllciAqLztcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHR5cGUgIT09IDMgLyogSWRlbnRpZmllciAqLyAmJiAoc3RhcnQgKyBpZC5sZW5ndGggIT09IHRoaXMuaW5kZXgpKSB7XG5cdCAgICAgICAgICAgIHZhciByZXN0b3JlID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuXHQgICAgICAgICAgICB0aGlzLnRvbGVyYXRlVW5leHBlY3RlZFRva2VuKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZEVzY2FwZWRSZXNlcnZlZFdvcmQpO1xuXHQgICAgICAgICAgICB0aGlzLmluZGV4ID0gcmVzdG9yZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogdHlwZSxcblx0ICAgICAgICAgICAgdmFsdWU6IGlkLFxuXHQgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcblx0ICAgICAgICAgICAgZW5kOiB0aGlzLmluZGV4XG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wdW5jdHVhdG9yc1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2NhblB1bmN0dWF0b3IgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAvLyBDaGVjayBmb3IgbW9zdCBjb21tb24gc2luZ2xlLWNoYXJhY3RlciBwdW5jdHVhdG9ycy5cblx0ICAgICAgICB2YXIgc3RyID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleF07XG5cdCAgICAgICAgc3dpdGNoIChzdHIpIHtcblx0ICAgICAgICAgICAgY2FzZSAnKCc6XG5cdCAgICAgICAgICAgIGNhc2UgJ3snOlxuXHQgICAgICAgICAgICAgICAgaWYgKHN0ciA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJseVN0YWNrLnB1c2goJ3snKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlICcuJzpcblx0ICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJy4nICYmIHRoaXMuc291cmNlW3RoaXMuaW5kZXggKyAxXSA9PT0gJy4nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gU3ByZWFkIG9wZXJhdG9yOiAuLi5cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDI7XG5cdCAgICAgICAgICAgICAgICAgICAgc3RyID0gJy4uLic7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAnfSc6XG5cdCAgICAgICAgICAgICAgICArK3RoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmN1cmx5U3RhY2sucG9wKCk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAnKSc6XG5cdCAgICAgICAgICAgIGNhc2UgJzsnOlxuXHQgICAgICAgICAgICBjYXNlICcsJzpcblx0ICAgICAgICAgICAgY2FzZSAnWyc6XG5cdCAgICAgICAgICAgIGNhc2UgJ10nOlxuXHQgICAgICAgICAgICBjYXNlICc6Jzpcblx0ICAgICAgICAgICAgY2FzZSAnPyc6XG5cdCAgICAgICAgICAgIGNhc2UgJ34nOlxuXHQgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICAvLyA0LWNoYXJhY3RlciBwdW5jdHVhdG9yLlxuXHQgICAgICAgICAgICAgICAgc3RyID0gdGhpcy5zb3VyY2Uuc3Vic3RyKHRoaXMuaW5kZXgsIDQpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHN0ciA9PT0gJz4+Pj0nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCArPSA0O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gMy1jaGFyYWN0ZXIgcHVuY3R1YXRvcnMuXG5cdCAgICAgICAgICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0cigwLCAzKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc3RyID09PSAnPT09JyB8fCBzdHIgPT09ICchPT0nIHx8IHN0ciA9PT0gJz4+PicgfHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSAnPDw9JyB8fCBzdHIgPT09ICc+Pj0nIHx8IHN0ciA9PT0gJyoqPScpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCArPSAzO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi1jaGFyYWN0ZXIgcHVuY3R1YXRvcnMuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMCwgMik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHIgPT09ICcmJicgfHwgc3RyID09PSAnfHwnIHx8IHN0ciA9PT0gJz09JyB8fCBzdHIgPT09ICchPScgfHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9PT0gJys9JyB8fCBzdHIgPT09ICctPScgfHwgc3RyID09PSAnKj0nIHx8IHN0ciA9PT0gJy89JyB8fFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyID09PSAnKysnIHx8IHN0ciA9PT0gJy0tJyB8fCBzdHIgPT09ICc8PCcgfHwgc3RyID09PSAnPj4nIHx8XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPT09ICcmPScgfHwgc3RyID09PSAnfD0nIHx8IHN0ciA9PT0gJ149JyB8fCBzdHIgPT09ICclPScgfHxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9PT0gJzw9JyB8fCBzdHIgPT09ICc+PScgfHwgc3RyID09PSAnPT4nIHx8IHN0ciA9PT0gJyoqJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCArPSAyO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS1jaGFyYWN0ZXIgcHVuY3R1YXRvcnMuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnPD49ISstKiUmfF4vJy5pbmRleE9mKHN0cikgPj0gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuaW5kZXggPT09IHN0YXJ0KSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogNyAvKiBQdW5jdHVhdG9yICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogc3RyLFxuXHQgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcblx0ICAgICAgICAgICAgZW5kOiB0aGlzLmluZGV4XG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1saXRlcmFscy1udW1lcmljLWxpdGVyYWxzXG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuSGV4TGl0ZXJhbCA9IGZ1bmN0aW9uIChzdGFydCkge1xuXHQgICAgICAgIHZhciBudW0gPSAnJztcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgaWYgKCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNIZXhEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgbnVtICs9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChudW0ubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJTdGFydCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHR5cGU6IDYgLyogTnVtZXJpY0xpdGVyYWwgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiBwYXJzZUludCgnMHgnICsgbnVtLCAxNiksXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5CaW5hcnlMaXRlcmFsID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG5cdCAgICAgICAgdmFyIG51bSA9ICcnO1xuXHQgICAgICAgIHZhciBjaDtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICAgICAgaWYgKGNoICE9PSAnMCcgJiYgY2ggIT09ICcxJykge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgbnVtICs9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChudW0ubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgIC8vIG9ubHkgMGIgb3IgMEJcblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuXHQgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXHQgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KGNoKSB8fCBjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQoY2gpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogNiAvKiBOdW1lcmljTGl0ZXJhbCAqLyxcblx0ICAgICAgICAgICAgdmFsdWU6IHBhcnNlSW50KG51bSwgMiksXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5PY3RhbExpdGVyYWwgPSBmdW5jdGlvbiAocHJlZml4LCBzdGFydCkge1xuXHQgICAgICAgIHZhciBudW0gPSAnJztcblx0ICAgICAgICB2YXIgb2N0YWwgPSBmYWxzZTtcblx0ICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzT2N0YWxEaWdpdChwcmVmaXguY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgb2N0YWwgPSB0cnVlO1xuXHQgICAgICAgICAgICBudW0gPSAnMCcgKyB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgIH1cblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgaWYgKCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNPY3RhbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBudW0gKz0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCFvY3RhbCAmJiBudW0ubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgIC8vIG9ubHkgMG8gb3IgME9cblx0ICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpIHx8IGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHR5cGU6IDYgLyogTnVtZXJpY0xpdGVyYWwgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiBwYXJzZUludChudW0sIDgpLFxuXHQgICAgICAgICAgICBvY3RhbDogb2N0YWwsXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLmlzSW1wbGljaXRPY3RhbExpdGVyYWwgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy8gSW1wbGljaXQgb2N0YWwsIHVubGVzcyB0aGVyZSBpcyBhIG5vbi1vY3RhbCBkaWdpdC5cblx0ICAgICAgICAvLyAoQW5uZXggQi4xLjEgb24gTnVtZXJpYyBMaXRlcmFscylcblx0ICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5pbmRleCArIDE7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG5cdCAgICAgICAgICAgIHZhciBjaCA9IHRoaXMuc291cmNlW2ldO1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09ICc4JyB8fCBjaCA9PT0gJzknKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNPY3RhbERpZ2l0KGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuTnVtZXJpY0xpdGVyYWwgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZVtzdGFydF07XG5cdCAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKSB8fCAoY2ggPT09ICcuJyksICdOdW1lcmljIGxpdGVyYWwgbXVzdCBzdGFydCB3aXRoIGEgZGVjaW1hbCBkaWdpdCBvciBhIGRlY2ltYWwgcG9pbnQnKTtcblx0ICAgICAgICB2YXIgbnVtID0gJyc7XG5cdCAgICAgICAgaWYgKGNoICE9PSAnLicpIHtcblx0ICAgICAgICAgICAgbnVtID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICAgICAgLy8gSGV4IG51bWJlciBzdGFydHMgd2l0aCAnMHgnLlxuXHQgICAgICAgICAgICAvLyBPY3RhbCBudW1iZXIgc3RhcnRzIHdpdGggJzAnLlxuXHQgICAgICAgICAgICAvLyBPY3RhbCBudW1iZXIgaW4gRVM2IHN0YXJ0cyB3aXRoICcwbycuXG5cdCAgICAgICAgICAgIC8vIEJpbmFyeSBudW1iZXIgaW4gRVM2IHN0YXJ0cyB3aXRoICcwYicuXG5cdCAgICAgICAgICAgIGlmIChudW0gPT09ICcwJykge1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAneCcgfHwgY2ggPT09ICdYJykge1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuSGV4TGl0ZXJhbChzdGFydCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdiJyB8fCBjaCA9PT0gJ0InKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5CaW5hcnlMaXRlcmFsKHN0YXJ0KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ28nIHx8IGNoID09PSAnTycpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuT2N0YWxMaXRlcmFsKGNoLCBzdGFydCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoY2ggJiYgY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzT2N0YWxEaWdpdChjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW1wbGljaXRPY3RhbExpdGVyYWwoKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuT2N0YWxMaXRlcmFsKGNoLCBzdGFydCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHdoaWxlIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQodGhpcy5zb3VyY2UuY2hhckNvZGVBdCh0aGlzLmluZGV4KSkpIHtcblx0ICAgICAgICAgICAgICAgIG51bSArPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChjaCA9PT0gJy4nKSB7XG5cdCAgICAgICAgICAgIG51bSArPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICB3aGlsZSAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICBudW0gKz0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoY2ggPT09ICdlJyB8fCBjaCA9PT0gJ0UnKSB7XG5cdCAgICAgICAgICAgIG51bSArPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09ICcrJyB8fCBjaCA9PT0gJy0nKSB7XG5cdCAgICAgICAgICAgICAgICBudW0gKz0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICB3aGlsZSAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzRGVjaW1hbERpZ2l0KHRoaXMuc291cmNlLmNoYXJDb2RlQXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbnVtICs9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0lkZW50aWZpZXJTdGFydCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHR5cGU6IDYgLyogTnVtZXJpY0xpdGVyYWwgKi8sXG5cdCAgICAgICAgICAgIHZhbHVlOiBwYXJzZUZsb2F0KG51bSksXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxpdGVyYWxzLXN0cmluZy1saXRlcmFsc1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2NhblN0cmluZ0xpdGVyYWwgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICB2YXIgcXVvdGUgPSB0aGlzLnNvdXJjZVtzdGFydF07XG5cdCAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KChxdW90ZSA9PT0gJ1xcJycgfHwgcXVvdGUgPT09ICdcIicpLCAnU3RyaW5nIGxpdGVyYWwgbXVzdCBzdGFydHMgd2l0aCBhIHF1b3RlJyk7XG5cdCAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgIHZhciBvY3RhbCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBzdHIgPSAnJztcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgdmFyIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgaWYgKGNoID09PSBxdW90ZSkge1xuXHQgICAgICAgICAgICAgICAgcXVvdGUgPSAnJztcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAnXFxcXCcpIHtcblx0ICAgICAgICAgICAgICAgIGNoID0gdGhpcy5zb3VyY2VbdGhpcy5pbmRleCsrXTtcblx0ICAgICAgICAgICAgICAgIGlmICghY2ggfHwgIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSB0aGlzLnNjYW5Vbmljb2RlQ29kZVBvaW50RXNjYXBlKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5lc2NhcGVkXzEgPSB0aGlzLnNjYW5IZXhFc2NhcGUoY2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmVzY2FwZWRfMSA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSB1bmVzY2FwZWRfMTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmVzY2FwZWQgPSB0aGlzLnNjYW5IZXhFc2NhcGUoY2gpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuZXNjYXBlZCA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkSGV4RXNjYXBlU2VxdWVuY2UpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IHVuZXNjYXBlZDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxuJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxyJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFx0Jztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxiJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxmJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFx4MEInO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzgnOlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc5Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBjaDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoICYmIGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2N0VG9EZWMgPSB0aGlzLm9jdGFsVG9EZWNpbWFsKGNoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY3RhbCA9IG9jdFRvRGVjLm9jdGFsIHx8IG9jdGFsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG9jdFRvRGVjLmNvZGUpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGNoO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmxpbmVOdW1iZXI7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ1xcbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzTGluZVRlcm1pbmF0b3IoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgc3RyICs9IGNoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChxdW90ZSAhPT0gJycpIHtcblx0ICAgICAgICAgICAgdGhpcy5pbmRleCA9IHN0YXJ0O1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHR5cGU6IDggLyogU3RyaW5nTGl0ZXJhbCAqLyxcblx0ICAgICAgICAgICAgdmFsdWU6IHN0cixcblx0ICAgICAgICAgICAgb2N0YWw6IG9jdGFsLFxuXHQgICAgICAgICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG5cdCAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcblx0ICAgICAgICAgICAgZW5kOiB0aGlzLmluZGV4XG5cdCAgICAgICAgfTtcblx0ICAgIH07XG5cdCAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10ZW1wbGF0ZS1saXRlcmFsLWxleGljYWwtY29tcG9uZW50c1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUuc2NhblRlbXBsYXRlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBjb29rZWQgPSAnJztcblx0ICAgICAgICB2YXIgdGVybWluYXRlZCA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBzdGFydCA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgdmFyIGhlYWQgPSAodGhpcy5zb3VyY2Vbc3RhcnRdID09PSAnYCcpO1xuXHQgICAgICAgIHZhciB0YWlsID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIHJhd09mZnNldCA9IDI7XG5cdCAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09ICdgJykge1xuXHQgICAgICAgICAgICAgICAgcmF3T2Zmc2V0ID0gMTtcblx0ICAgICAgICAgICAgICAgIHRhaWwgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgdGVybWluYXRlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gJyQnKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VbdGhpcy5pbmRleF0gPT09ICd7Jykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VybHlTdGFjay5wdXNoKCckeycpO1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNvb2tlZCArPSBjaDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gJ1xcXFwnKSB7XG5cdCAgICAgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgICAgICBpZiAoIWNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFxuJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyJzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFxyJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFx0Jztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1Jzpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZVt0aGlzLmluZGV4XSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSB0aGlzLnNjYW5Vbmljb2RlQ29kZVBvaW50RXNjYXBlKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdG9yZSA9IHRoaXMuaW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVuZXNjYXBlZF8yID0gdGhpcy5zY2FuSGV4RXNjYXBlKGNoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5lc2NhcGVkXzIgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2VkICs9IHVuZXNjYXBlZF8yO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IHJlc3RvcmU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSBjaDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5lc2NhcGVkID0gdGhpcy5zY2FuSGV4RXNjYXBlKGNoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmVzY2FwZWQgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZEhleEVzY2FwZVNlcXVlbmNlKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSB1bmVzY2FwZWQ7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29rZWQgKz0gJ1xcYic7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29rZWQgKz0gJ1xcZic7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndic6XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29rZWQgKz0gJ1xcdic7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJzAnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbGxlZ2FsOiBcXDAxIFxcMDIgYW5kIHNvIG9uXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5UZW1wbGF0ZU9jdGFsTGl0ZXJhbCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSAnXFwwJztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc09jdGFsRGlnaXQoY2guY2hhckNvZGVBdCgwKSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbGxlZ2FsOiBcXDEgXFwyXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aHJvd1VuZXhwZWN0ZWRUb2tlbihtZXNzYWdlc18xLk1lc3NhZ2VzLlRlbXBsYXRlT2N0YWxMaXRlcmFsKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tlZCArPSBjaDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICsrdGhpcy5saW5lTnVtYmVyO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgdGhpcy5zb3VyY2VbdGhpcy5pbmRleF0gPT09ICdcXG4nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICsrdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICArK3RoaXMubGluZU51bWJlcjtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgdGhpcy5zb3VyY2VbdGhpcy5pbmRleF0gPT09ICdcXG4nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSB0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgY29va2VkICs9ICdcXG4nO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgY29va2VkICs9IGNoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICghdGVybWluYXRlZCkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICghaGVhZCkge1xuXHQgICAgICAgICAgICB0aGlzLmN1cmx5U3RhY2sucG9wKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgIHR5cGU6IDEwIC8qIFRlbXBsYXRlICovLFxuXHQgICAgICAgICAgICB2YWx1ZTogdGhpcy5zb3VyY2Uuc2xpY2Uoc3RhcnQgKyAxLCB0aGlzLmluZGV4IC0gcmF3T2Zmc2V0KSxcblx0ICAgICAgICAgICAgY29va2VkOiBjb29rZWQsXG5cdCAgICAgICAgICAgIGhlYWQ6IGhlYWQsXG5cdCAgICAgICAgICAgIHRhaWw6IHRhaWwsXG5cdCAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgbGluZVN0YXJ0OiB0aGlzLmxpbmVTdGFydCxcblx0ICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LFxuXHQgICAgICAgICAgICBlbmQ6IHRoaXMuaW5kZXhcblx0ICAgICAgICB9O1xuXHQgICAgfTtcblx0ICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWxpdGVyYWxzLXJlZ3VsYXItZXhwcmVzc2lvbi1saXRlcmFsc1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUudGVzdFJlZ0V4cCA9IGZ1bmN0aW9uIChwYXR0ZXJuLCBmbGFncykge1xuXHQgICAgICAgIC8vIFRoZSBCTVAgY2hhcmFjdGVyIHRvIHVzZSBhcyBhIHJlcGxhY2VtZW50IGZvciBhc3RyYWwgc3ltYm9scyB3aGVuXG5cdCAgICAgICAgLy8gdHJhbnNsYXRpbmcgYW4gRVM2IFwidVwiLWZsYWdnZWQgcGF0dGVybiB0byBhbiBFUzUtY29tcGF0aWJsZVxuXHQgICAgICAgIC8vIGFwcHJveGltYXRpb24uXG5cdCAgICAgICAgLy8gTm90ZTogcmVwbGFjaW5nIHdpdGggJ1xcdUZGRkYnIGVuYWJsZXMgZmFsc2UgcG9zaXRpdmVzIGluIHVubGlrZWx5XG5cdCAgICAgICAgLy8gc2NlbmFyaW9zLiBGb3IgZXhhbXBsZSwgYFtcXHV7MTA0NGZ9LVxcdXsxMDQ0MH1dYCBpcyBhbiBpbnZhbGlkXG5cdCAgICAgICAgLy8gcGF0dGVybiB0aGF0IHdvdWxkIG5vdCBiZSBkZXRlY3RlZCBieSB0aGlzIHN1YnN0aXR1dGlvbi5cblx0ICAgICAgICB2YXIgYXN0cmFsU3Vic3RpdHV0ZSA9ICdcXHVGRkZGJztcblx0ICAgICAgICB2YXIgdG1wID0gcGF0dGVybjtcblx0ICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cdCAgICAgICAgaWYgKGZsYWdzLmluZGV4T2YoJ3UnKSA+PSAwKSB7XG5cdCAgICAgICAgICAgIHRtcCA9IHRtcFxuXHQgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFx1XFx7KFswLTlhLWZBLUZdKylcXH18XFxcXHUoW2EtZkEtRjAtOV17NH0pL2csIGZ1bmN0aW9uICgkMCwgJDEsICQyKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgY29kZVBvaW50ID0gcGFyc2VJbnQoJDEgfHwgJDIsIDE2KTtcblx0ICAgICAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPiAweDEwRkZGRikge1xuXHQgICAgICAgICAgICAgICAgICAgIHNlbGYudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5JbnZhbGlkUmVnRXhwKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPD0gMHhGRkZGKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiBhc3RyYWxTdWJzdGl0dXRlO1xuXHQgICAgICAgICAgICB9KVxuXHQgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZywgYXN0cmFsU3Vic3RpdHV0ZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIEZpcnN0LCBkZXRlY3QgaW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25zLlxuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIFJlZ0V4cCh0bXApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjYXRjaCAoZSkge1xuXHQgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKG1lc3NhZ2VzXzEuTWVzc2FnZXMuSW52YWxpZFJlZ0V4cCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFJldHVybiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3QgZm9yIHRoaXMgcGF0dGVybi1mbGFnIHBhaXIsIG9yXG5cdCAgICAgICAgLy8gYG51bGxgIGluIGNhc2UgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgZG9lc24ndCBzdXBwb3J0IHRoZSBmbGFncyBpdFxuXHQgICAgICAgIC8vIHVzZXMuXG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocGF0dGVybiwgZmxhZ3MpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XG5cdCAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cdCAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuUmVnRXhwQm9keSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICBhc3NlcnRfMS5hc3NlcnQoY2ggPT09ICcvJywgJ1JlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsIG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoJyk7XG5cdCAgICAgICAgdmFyIHN0ciA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgdmFyIGNsYXNzTWFya2VyID0gZmFsc2U7XG5cdCAgICAgICAgdmFyIHRlcm1pbmF0ZWQgPSBmYWxzZTtcblx0ICAgICAgICB3aGlsZSAoIXRoaXMuZW9mKCkpIHtcblx0ICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4KytdO1xuXHQgICAgICAgICAgICBzdHIgKz0gY2g7XG5cdCAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xcXFwnKSB7XG5cdCAgICAgICAgICAgICAgICBjaCA9IHRoaXMuc291cmNlW3RoaXMuaW5kZXgrK107XG5cdCAgICAgICAgICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1saXRlcmFscy1yZWd1bGFyLWV4cHJlc3Npb24tbGl0ZXJhbHNcblx0ICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNMaW5lVGVybWluYXRvcihjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5VbnRlcm1pbmF0ZWRSZWdFeHApO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgc3RyICs9IGNoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0xpbmVUZXJtaW5hdG9yKGNoLmNoYXJDb2RlQXQoMCkpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnRocm93VW5leHBlY3RlZFRva2VuKG1lc3NhZ2VzXzEuTWVzc2FnZXMuVW50ZXJtaW5hdGVkUmVnRXhwKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIGlmIChjbGFzc01hcmtlcikge1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXScpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjbGFzc01hcmtlciA9IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnLycpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAnWycpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjbGFzc01hcmtlciA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCF0ZXJtaW5hdGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMudGhyb3dVbmV4cGVjdGVkVG9rZW4obWVzc2FnZXNfMS5NZXNzYWdlcy5VbnRlcm1pbmF0ZWRSZWdFeHApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBFeGNsdWRlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoLlxuXHQgICAgICAgIHJldHVybiBzdHIuc3Vic3RyKDEsIHN0ci5sZW5ndGggLSAyKTtcblx0ICAgIH07XG5cdCAgICBTY2FubmVyLnByb3RvdHlwZS5zY2FuUmVnRXhwRmxhZ3MgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0ciA9ICcnO1xuXHQgICAgICAgIHZhciBmbGFncyA9ICcnO1xuXHQgICAgICAgIHdoaWxlICghdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICB2YXIgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICAgICAgaWYgKCFjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyUGFydChjaC5jaGFyQ29kZUF0KDApKSkge1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICBpZiAoY2ggPT09ICdcXFxcJyAmJiAhdGhpcy5lb2YoKSkge1xuXHQgICAgICAgICAgICAgICAgY2ggPSB0aGlzLnNvdXJjZVt0aGlzLmluZGV4XTtcblx0ICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ3UnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgKyt0aGlzLmluZGV4O1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciByZXN0b3JlID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY2hhciA9IHRoaXMuc2NhbkhleEVzY2FwZSgndScpO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICs9IGNoYXI7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc3RyICs9ICdcXFxcdSc7IHJlc3RvcmUgPCB0aGlzLmluZGV4OyArK3Jlc3RvcmUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSB0aGlzLnNvdXJjZVtyZXN0b3JlXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IHJlc3RvcmU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICs9ICd1Jztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcdSc7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMudG9sZXJhdGVVbmV4cGVjdGVkVG9rZW4oKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXCc7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy50b2xlcmF0ZVVuZXhwZWN0ZWRUb2tlbigpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgZmxhZ3MgKz0gY2g7XG5cdCAgICAgICAgICAgICAgICBzdHIgKz0gY2g7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGZsYWdzO1xuXHQgICAgfTtcblx0ICAgIFNjYW5uZXIucHJvdG90eXBlLnNjYW5SZWdFeHAgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICB2YXIgcGF0dGVybiA9IHRoaXMuc2NhblJlZ0V4cEJvZHkoKTtcblx0ICAgICAgICB2YXIgZmxhZ3MgPSB0aGlzLnNjYW5SZWdFeHBGbGFncygpO1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudGVzdFJlZ0V4cChwYXR0ZXJuLCBmbGFncyk7XG5cdCAgICAgICAgcmV0dXJuIHtcblx0ICAgICAgICAgICAgdHlwZTogOSAvKiBSZWd1bGFyRXhwcmVzc2lvbiAqLyxcblx0ICAgICAgICAgICAgdmFsdWU6ICcnLFxuXHQgICAgICAgICAgICBwYXR0ZXJuOiBwYXR0ZXJuLFxuXHQgICAgICAgICAgICBmbGFnczogZmxhZ3MsXG5cdCAgICAgICAgICAgIHJlZ2V4OiB2YWx1ZSxcblx0ICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICBsaW5lU3RhcnQ6IHRoaXMubGluZVN0YXJ0LFxuXHQgICAgICAgICAgICBzdGFydDogc3RhcnQsXG5cdCAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgU2Nhbm5lci5wcm90b3R5cGUubGV4ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmVvZigpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICAgICAgICB0eXBlOiAyIC8qIEVPRiAqLyxcblx0ICAgICAgICAgICAgICAgIHZhbHVlOiAnJyxcblx0ICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgIGxpbmVTdGFydDogdGhpcy5saW5lU3RhcnQsXG5cdCAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5pbmRleCxcblx0ICAgICAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgY3AgPSB0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXgpO1xuXHQgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNJZGVudGlmaWVyU3RhcnQoY3ApKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5JZGVudGlmaWVyKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFZlcnkgY29tbW9uOiAoIGFuZCApIGFuZCA7XG5cdCAgICAgICAgaWYgKGNwID09PSAweDI4IHx8IGNwID09PSAweDI5IHx8IGNwID09PSAweDNCKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5QdW5jdHVhdG9yKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFN0cmluZyBsaXRlcmFsIHN0YXJ0cyB3aXRoIHNpbmdsZSBxdW90ZSAoVSswMDI3KSBvciBkb3VibGUgcXVvdGUgKFUrMDAyMikuXG5cdCAgICAgICAgaWYgKGNwID09PSAweDI3IHx8IGNwID09PSAweDIyKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5TdHJpbmdMaXRlcmFsKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIERvdCAoLikgVSswMDJFIGNhbiBhbHNvIHN0YXJ0IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLCBoZW5jZSB0aGUgbmVlZFxuXHQgICAgICAgIC8vIHRvIGNoZWNrIHRoZSBuZXh0IGNoYXJhY3Rlci5cblx0ICAgICAgICBpZiAoY3AgPT09IDB4MkUpIHtcblx0ICAgICAgICAgICAgaWYgKGNoYXJhY3Rlcl8xLkNoYXJhY3Rlci5pc0RlY2ltYWxEaWdpdCh0aGlzLnNvdXJjZS5jaGFyQ29kZUF0KHRoaXMuaW5kZXggKyAxKSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5OdW1lcmljTGl0ZXJhbCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5QdW5jdHVhdG9yKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChjaGFyYWN0ZXJfMS5DaGFyYWN0ZXIuaXNEZWNpbWFsRGlnaXQoY3ApKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5OdW1lcmljTGl0ZXJhbCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBUZW1wbGF0ZSBsaXRlcmFscyBzdGFydCB3aXRoIGAgKFUrMDA2MCkgZm9yIHRlbXBsYXRlIGhlYWRcblx0ICAgICAgICAvLyBvciB9IChVKzAwN0QpIGZvciB0ZW1wbGF0ZSBtaWRkbGUgb3IgdGVtcGxhdGUgdGFpbC5cblx0ICAgICAgICBpZiAoY3AgPT09IDB4NjAgfHwgKGNwID09PSAweDdEICYmIHRoaXMuY3VybHlTdGFja1t0aGlzLmN1cmx5U3RhY2subGVuZ3RoIC0gMV0gPT09ICckeycpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYW5UZW1wbGF0ZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBQb3NzaWJsZSBpZGVudGlmaWVyIHN0YXJ0IGluIGEgc3Vycm9nYXRlIHBhaXIuXG5cdCAgICAgICAgaWYgKGNwID49IDB4RDgwMCAmJiBjcCA8IDB4REZGRikge1xuXHQgICAgICAgICAgICBpZiAoY2hhcmFjdGVyXzEuQ2hhcmFjdGVyLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMuY29kZVBvaW50QXQodGhpcy5pbmRleCkpKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FuSWRlbnRpZmllcigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLnNjYW5QdW5jdHVhdG9yKCk7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFNjYW5uZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuU2Nhbm5lciA9IFNjYW5uZXI7XG5cblxuLyoqKi8gfSxcbi8qIDEzICovXG4vKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuXHRleHBvcnRzLlRva2VuTmFtZSA9IHt9O1xuXHRleHBvcnRzLlRva2VuTmFtZVsxIC8qIEJvb2xlYW5MaXRlcmFsICovXSA9ICdCb29sZWFuJztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbMiAvKiBFT0YgKi9dID0gJzxlbmQ+Jztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbMyAvKiBJZGVudGlmaWVyICovXSA9ICdJZGVudGlmaWVyJztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbNCAvKiBLZXl3b3JkICovXSA9ICdLZXl3b3JkJztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbNSAvKiBOdWxsTGl0ZXJhbCAqL10gPSAnTnVsbCc7XG5cdGV4cG9ydHMuVG9rZW5OYW1lWzYgLyogTnVtZXJpY0xpdGVyYWwgKi9dID0gJ051bWVyaWMnO1xuXHRleHBvcnRzLlRva2VuTmFtZVs3IC8qIFB1bmN0dWF0b3IgKi9dID0gJ1B1bmN0dWF0b3InO1xuXHRleHBvcnRzLlRva2VuTmFtZVs4IC8qIFN0cmluZ0xpdGVyYWwgKi9dID0gJ1N0cmluZyc7XG5cdGV4cG9ydHMuVG9rZW5OYW1lWzkgLyogUmVndWxhckV4cHJlc3Npb24gKi9dID0gJ1JlZ3VsYXJFeHByZXNzaW9uJztcblx0ZXhwb3J0cy5Ub2tlbk5hbWVbMTAgLyogVGVtcGxhdGUgKi9dID0gJ1RlbXBsYXRlJztcblxuXG4vKioqLyB9LFxuLyogMTQgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHQvLyBHZW5lcmF0ZWQgYnkgZ2VuZXJhdGUteGh0bWwtZW50aXRpZXMuanMuIERPIE5PVCBNT0RJRlkhXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcblx0ZXhwb3J0cy5YSFRNTEVudGl0aWVzID0ge1xuXHQgICAgcXVvdDogJ1xcdTAwMjInLFxuXHQgICAgYW1wOiAnXFx1MDAyNicsXG5cdCAgICBhcG9zOiAnXFx1MDAyNycsXG5cdCAgICBndDogJ1xcdTAwM0UnLFxuXHQgICAgbmJzcDogJ1xcdTAwQTAnLFxuXHQgICAgaWV4Y2w6ICdcXHUwMEExJyxcblx0ICAgIGNlbnQ6ICdcXHUwMEEyJyxcblx0ICAgIHBvdW5kOiAnXFx1MDBBMycsXG5cdCAgICBjdXJyZW46ICdcXHUwMEE0Jyxcblx0ICAgIHllbjogJ1xcdTAwQTUnLFxuXHQgICAgYnJ2YmFyOiAnXFx1MDBBNicsXG5cdCAgICBzZWN0OiAnXFx1MDBBNycsXG5cdCAgICB1bWw6ICdcXHUwMEE4Jyxcblx0ICAgIGNvcHk6ICdcXHUwMEE5Jyxcblx0ICAgIG9yZGY6ICdcXHUwMEFBJyxcblx0ICAgIGxhcXVvOiAnXFx1MDBBQicsXG5cdCAgICBub3Q6ICdcXHUwMEFDJyxcblx0ICAgIHNoeTogJ1xcdTAwQUQnLFxuXHQgICAgcmVnOiAnXFx1MDBBRScsXG5cdCAgICBtYWNyOiAnXFx1MDBBRicsXG5cdCAgICBkZWc6ICdcXHUwMEIwJyxcblx0ICAgIHBsdXNtbjogJ1xcdTAwQjEnLFxuXHQgICAgc3VwMjogJ1xcdTAwQjInLFxuXHQgICAgc3VwMzogJ1xcdTAwQjMnLFxuXHQgICAgYWN1dGU6ICdcXHUwMEI0Jyxcblx0ICAgIG1pY3JvOiAnXFx1MDBCNScsXG5cdCAgICBwYXJhOiAnXFx1MDBCNicsXG5cdCAgICBtaWRkb3Q6ICdcXHUwMEI3Jyxcblx0ICAgIGNlZGlsOiAnXFx1MDBCOCcsXG5cdCAgICBzdXAxOiAnXFx1MDBCOScsXG5cdCAgICBvcmRtOiAnXFx1MDBCQScsXG5cdCAgICByYXF1bzogJ1xcdTAwQkInLFxuXHQgICAgZnJhYzE0OiAnXFx1MDBCQycsXG5cdCAgICBmcmFjMTI6ICdcXHUwMEJEJyxcblx0ICAgIGZyYWMzNDogJ1xcdTAwQkUnLFxuXHQgICAgaXF1ZXN0OiAnXFx1MDBCRicsXG5cdCAgICBBZ3JhdmU6ICdcXHUwMEMwJyxcblx0ICAgIEFhY3V0ZTogJ1xcdTAwQzEnLFxuXHQgICAgQWNpcmM6ICdcXHUwMEMyJyxcblx0ICAgIEF0aWxkZTogJ1xcdTAwQzMnLFxuXHQgICAgQXVtbDogJ1xcdTAwQzQnLFxuXHQgICAgQXJpbmc6ICdcXHUwMEM1Jyxcblx0ICAgIEFFbGlnOiAnXFx1MDBDNicsXG5cdCAgICBDY2VkaWw6ICdcXHUwMEM3Jyxcblx0ICAgIEVncmF2ZTogJ1xcdTAwQzgnLFxuXHQgICAgRWFjdXRlOiAnXFx1MDBDOScsXG5cdCAgICBFY2lyYzogJ1xcdTAwQ0EnLFxuXHQgICAgRXVtbDogJ1xcdTAwQ0InLFxuXHQgICAgSWdyYXZlOiAnXFx1MDBDQycsXG5cdCAgICBJYWN1dGU6ICdcXHUwMENEJyxcblx0ICAgIEljaXJjOiAnXFx1MDBDRScsXG5cdCAgICBJdW1sOiAnXFx1MDBDRicsXG5cdCAgICBFVEg6ICdcXHUwMEQwJyxcblx0ICAgIE50aWxkZTogJ1xcdTAwRDEnLFxuXHQgICAgT2dyYXZlOiAnXFx1MDBEMicsXG5cdCAgICBPYWN1dGU6ICdcXHUwMEQzJyxcblx0ICAgIE9jaXJjOiAnXFx1MDBENCcsXG5cdCAgICBPdGlsZGU6ICdcXHUwMEQ1Jyxcblx0ICAgIE91bWw6ICdcXHUwMEQ2Jyxcblx0ICAgIHRpbWVzOiAnXFx1MDBENycsXG5cdCAgICBPc2xhc2g6ICdcXHUwMEQ4Jyxcblx0ICAgIFVncmF2ZTogJ1xcdTAwRDknLFxuXHQgICAgVWFjdXRlOiAnXFx1MDBEQScsXG5cdCAgICBVY2lyYzogJ1xcdTAwREInLFxuXHQgICAgVXVtbDogJ1xcdTAwREMnLFxuXHQgICAgWWFjdXRlOiAnXFx1MDBERCcsXG5cdCAgICBUSE9STjogJ1xcdTAwREUnLFxuXHQgICAgc3psaWc6ICdcXHUwMERGJyxcblx0ICAgIGFncmF2ZTogJ1xcdTAwRTAnLFxuXHQgICAgYWFjdXRlOiAnXFx1MDBFMScsXG5cdCAgICBhY2lyYzogJ1xcdTAwRTInLFxuXHQgICAgYXRpbGRlOiAnXFx1MDBFMycsXG5cdCAgICBhdW1sOiAnXFx1MDBFNCcsXG5cdCAgICBhcmluZzogJ1xcdTAwRTUnLFxuXHQgICAgYWVsaWc6ICdcXHUwMEU2Jyxcblx0ICAgIGNjZWRpbDogJ1xcdTAwRTcnLFxuXHQgICAgZWdyYXZlOiAnXFx1MDBFOCcsXG5cdCAgICBlYWN1dGU6ICdcXHUwMEU5Jyxcblx0ICAgIGVjaXJjOiAnXFx1MDBFQScsXG5cdCAgICBldW1sOiAnXFx1MDBFQicsXG5cdCAgICBpZ3JhdmU6ICdcXHUwMEVDJyxcblx0ICAgIGlhY3V0ZTogJ1xcdTAwRUQnLFxuXHQgICAgaWNpcmM6ICdcXHUwMEVFJyxcblx0ICAgIGl1bWw6ICdcXHUwMEVGJyxcblx0ICAgIGV0aDogJ1xcdTAwRjAnLFxuXHQgICAgbnRpbGRlOiAnXFx1MDBGMScsXG5cdCAgICBvZ3JhdmU6ICdcXHUwMEYyJyxcblx0ICAgIG9hY3V0ZTogJ1xcdTAwRjMnLFxuXHQgICAgb2NpcmM6ICdcXHUwMEY0Jyxcblx0ICAgIG90aWxkZTogJ1xcdTAwRjUnLFxuXHQgICAgb3VtbDogJ1xcdTAwRjYnLFxuXHQgICAgZGl2aWRlOiAnXFx1MDBGNycsXG5cdCAgICBvc2xhc2g6ICdcXHUwMEY4Jyxcblx0ICAgIHVncmF2ZTogJ1xcdTAwRjknLFxuXHQgICAgdWFjdXRlOiAnXFx1MDBGQScsXG5cdCAgICB1Y2lyYzogJ1xcdTAwRkInLFxuXHQgICAgdXVtbDogJ1xcdTAwRkMnLFxuXHQgICAgeWFjdXRlOiAnXFx1MDBGRCcsXG5cdCAgICB0aG9ybjogJ1xcdTAwRkUnLFxuXHQgICAgeXVtbDogJ1xcdTAwRkYnLFxuXHQgICAgT0VsaWc6ICdcXHUwMTUyJyxcblx0ICAgIG9lbGlnOiAnXFx1MDE1MycsXG5cdCAgICBTY2Fyb246ICdcXHUwMTYwJyxcblx0ICAgIHNjYXJvbjogJ1xcdTAxNjEnLFxuXHQgICAgWXVtbDogJ1xcdTAxNzgnLFxuXHQgICAgZm5vZjogJ1xcdTAxOTInLFxuXHQgICAgY2lyYzogJ1xcdTAyQzYnLFxuXHQgICAgdGlsZGU6ICdcXHUwMkRDJyxcblx0ICAgIEFscGhhOiAnXFx1MDM5MScsXG5cdCAgICBCZXRhOiAnXFx1MDM5MicsXG5cdCAgICBHYW1tYTogJ1xcdTAzOTMnLFxuXHQgICAgRGVsdGE6ICdcXHUwMzk0Jyxcblx0ICAgIEVwc2lsb246ICdcXHUwMzk1Jyxcblx0ICAgIFpldGE6ICdcXHUwMzk2Jyxcblx0ICAgIEV0YTogJ1xcdTAzOTcnLFxuXHQgICAgVGhldGE6ICdcXHUwMzk4Jyxcblx0ICAgIElvdGE6ICdcXHUwMzk5Jyxcblx0ICAgIEthcHBhOiAnXFx1MDM5QScsXG5cdCAgICBMYW1iZGE6ICdcXHUwMzlCJyxcblx0ICAgIE11OiAnXFx1MDM5QycsXG5cdCAgICBOdTogJ1xcdTAzOUQnLFxuXHQgICAgWGk6ICdcXHUwMzlFJyxcblx0ICAgIE9taWNyb246ICdcXHUwMzlGJyxcblx0ICAgIFBpOiAnXFx1MDNBMCcsXG5cdCAgICBSaG86ICdcXHUwM0ExJyxcblx0ICAgIFNpZ21hOiAnXFx1MDNBMycsXG5cdCAgICBUYXU6ICdcXHUwM0E0Jyxcblx0ICAgIFVwc2lsb246ICdcXHUwM0E1Jyxcblx0ICAgIFBoaTogJ1xcdTAzQTYnLFxuXHQgICAgQ2hpOiAnXFx1MDNBNycsXG5cdCAgICBQc2k6ICdcXHUwM0E4Jyxcblx0ICAgIE9tZWdhOiAnXFx1MDNBOScsXG5cdCAgICBhbHBoYTogJ1xcdTAzQjEnLFxuXHQgICAgYmV0YTogJ1xcdTAzQjInLFxuXHQgICAgZ2FtbWE6ICdcXHUwM0IzJyxcblx0ICAgIGRlbHRhOiAnXFx1MDNCNCcsXG5cdCAgICBlcHNpbG9uOiAnXFx1MDNCNScsXG5cdCAgICB6ZXRhOiAnXFx1MDNCNicsXG5cdCAgICBldGE6ICdcXHUwM0I3Jyxcblx0ICAgIHRoZXRhOiAnXFx1MDNCOCcsXG5cdCAgICBpb3RhOiAnXFx1MDNCOScsXG5cdCAgICBrYXBwYTogJ1xcdTAzQkEnLFxuXHQgICAgbGFtYmRhOiAnXFx1MDNCQicsXG5cdCAgICBtdTogJ1xcdTAzQkMnLFxuXHQgICAgbnU6ICdcXHUwM0JEJyxcblx0ICAgIHhpOiAnXFx1MDNCRScsXG5cdCAgICBvbWljcm9uOiAnXFx1MDNCRicsXG5cdCAgICBwaTogJ1xcdTAzQzAnLFxuXHQgICAgcmhvOiAnXFx1MDNDMScsXG5cdCAgICBzaWdtYWY6ICdcXHUwM0MyJyxcblx0ICAgIHNpZ21hOiAnXFx1MDNDMycsXG5cdCAgICB0YXU6ICdcXHUwM0M0Jyxcblx0ICAgIHVwc2lsb246ICdcXHUwM0M1Jyxcblx0ICAgIHBoaTogJ1xcdTAzQzYnLFxuXHQgICAgY2hpOiAnXFx1MDNDNycsXG5cdCAgICBwc2k6ICdcXHUwM0M4Jyxcblx0ICAgIG9tZWdhOiAnXFx1MDNDOScsXG5cdCAgICB0aGV0YXN5bTogJ1xcdTAzRDEnLFxuXHQgICAgdXBzaWg6ICdcXHUwM0QyJyxcblx0ICAgIHBpdjogJ1xcdTAzRDYnLFxuXHQgICAgZW5zcDogJ1xcdTIwMDInLFxuXHQgICAgZW1zcDogJ1xcdTIwMDMnLFxuXHQgICAgdGhpbnNwOiAnXFx1MjAwOScsXG5cdCAgICB6d25qOiAnXFx1MjAwQycsXG5cdCAgICB6d2o6ICdcXHUyMDBEJyxcblx0ICAgIGxybTogJ1xcdTIwMEUnLFxuXHQgICAgcmxtOiAnXFx1MjAwRicsXG5cdCAgICBuZGFzaDogJ1xcdTIwMTMnLFxuXHQgICAgbWRhc2g6ICdcXHUyMDE0Jyxcblx0ICAgIGxzcXVvOiAnXFx1MjAxOCcsXG5cdCAgICByc3F1bzogJ1xcdTIwMTknLFxuXHQgICAgc2JxdW86ICdcXHUyMDFBJyxcblx0ICAgIGxkcXVvOiAnXFx1MjAxQycsXG5cdCAgICByZHF1bzogJ1xcdTIwMUQnLFxuXHQgICAgYmRxdW86ICdcXHUyMDFFJyxcblx0ICAgIGRhZ2dlcjogJ1xcdTIwMjAnLFxuXHQgICAgRGFnZ2VyOiAnXFx1MjAyMScsXG5cdCAgICBidWxsOiAnXFx1MjAyMicsXG5cdCAgICBoZWxsaXA6ICdcXHUyMDI2Jyxcblx0ICAgIHBlcm1pbDogJ1xcdTIwMzAnLFxuXHQgICAgcHJpbWU6ICdcXHUyMDMyJyxcblx0ICAgIFByaW1lOiAnXFx1MjAzMycsXG5cdCAgICBsc2FxdW86ICdcXHUyMDM5Jyxcblx0ICAgIHJzYXF1bzogJ1xcdTIwM0EnLFxuXHQgICAgb2xpbmU6ICdcXHUyMDNFJyxcblx0ICAgIGZyYXNsOiAnXFx1MjA0NCcsXG5cdCAgICBldXJvOiAnXFx1MjBBQycsXG5cdCAgICBpbWFnZTogJ1xcdTIxMTEnLFxuXHQgICAgd2VpZXJwOiAnXFx1MjExOCcsXG5cdCAgICByZWFsOiAnXFx1MjExQycsXG5cdCAgICB0cmFkZTogJ1xcdTIxMjInLFxuXHQgICAgYWxlZnN5bTogJ1xcdTIxMzUnLFxuXHQgICAgbGFycjogJ1xcdTIxOTAnLFxuXHQgICAgdWFycjogJ1xcdTIxOTEnLFxuXHQgICAgcmFycjogJ1xcdTIxOTInLFxuXHQgICAgZGFycjogJ1xcdTIxOTMnLFxuXHQgICAgaGFycjogJ1xcdTIxOTQnLFxuXHQgICAgY3JhcnI6ICdcXHUyMUI1Jyxcblx0ICAgIGxBcnI6ICdcXHUyMUQwJyxcblx0ICAgIHVBcnI6ICdcXHUyMUQxJyxcblx0ICAgIHJBcnI6ICdcXHUyMUQyJyxcblx0ICAgIGRBcnI6ICdcXHUyMUQzJyxcblx0ICAgIGhBcnI6ICdcXHUyMUQ0Jyxcblx0ICAgIGZvcmFsbDogJ1xcdTIyMDAnLFxuXHQgICAgcGFydDogJ1xcdTIyMDInLFxuXHQgICAgZXhpc3Q6ICdcXHUyMjAzJyxcblx0ICAgIGVtcHR5OiAnXFx1MjIwNScsXG5cdCAgICBuYWJsYTogJ1xcdTIyMDcnLFxuXHQgICAgaXNpbjogJ1xcdTIyMDgnLFxuXHQgICAgbm90aW46ICdcXHUyMjA5Jyxcblx0ICAgIG5pOiAnXFx1MjIwQicsXG5cdCAgICBwcm9kOiAnXFx1MjIwRicsXG5cdCAgICBzdW06ICdcXHUyMjExJyxcblx0ICAgIG1pbnVzOiAnXFx1MjIxMicsXG5cdCAgICBsb3dhc3Q6ICdcXHUyMjE3Jyxcblx0ICAgIHJhZGljOiAnXFx1MjIxQScsXG5cdCAgICBwcm9wOiAnXFx1MjIxRCcsXG5cdCAgICBpbmZpbjogJ1xcdTIyMUUnLFxuXHQgICAgYW5nOiAnXFx1MjIyMCcsXG5cdCAgICBhbmQ6ICdcXHUyMjI3Jyxcblx0ICAgIG9yOiAnXFx1MjIyOCcsXG5cdCAgICBjYXA6ICdcXHUyMjI5Jyxcblx0ICAgIGN1cDogJ1xcdTIyMkEnLFxuXHQgICAgaW50OiAnXFx1MjIyQicsXG5cdCAgICB0aGVyZTQ6ICdcXHUyMjM0Jyxcblx0ICAgIHNpbTogJ1xcdTIyM0MnLFxuXHQgICAgY29uZzogJ1xcdTIyNDUnLFxuXHQgICAgYXN5bXA6ICdcXHUyMjQ4Jyxcblx0ICAgIG5lOiAnXFx1MjI2MCcsXG5cdCAgICBlcXVpdjogJ1xcdTIyNjEnLFxuXHQgICAgbGU6ICdcXHUyMjY0Jyxcblx0ICAgIGdlOiAnXFx1MjI2NScsXG5cdCAgICBzdWI6ICdcXHUyMjgyJyxcblx0ICAgIHN1cDogJ1xcdTIyODMnLFxuXHQgICAgbnN1YjogJ1xcdTIyODQnLFxuXHQgICAgc3ViZTogJ1xcdTIyODYnLFxuXHQgICAgc3VwZTogJ1xcdTIyODcnLFxuXHQgICAgb3BsdXM6ICdcXHUyMjk1Jyxcblx0ICAgIG90aW1lczogJ1xcdTIyOTcnLFxuXHQgICAgcGVycDogJ1xcdTIyQTUnLFxuXHQgICAgc2RvdDogJ1xcdTIyQzUnLFxuXHQgICAgbGNlaWw6ICdcXHUyMzA4Jyxcblx0ICAgIHJjZWlsOiAnXFx1MjMwOScsXG5cdCAgICBsZmxvb3I6ICdcXHUyMzBBJyxcblx0ICAgIHJmbG9vcjogJ1xcdTIzMEInLFxuXHQgICAgbG96OiAnXFx1MjVDQScsXG5cdCAgICBzcGFkZXM6ICdcXHUyNjYwJyxcblx0ICAgIGNsdWJzOiAnXFx1MjY2MycsXG5cdCAgICBoZWFydHM6ICdcXHUyNjY1Jyxcblx0ICAgIGRpYW1zOiAnXFx1MjY2NicsXG5cdCAgICBsYW5nOiAnXFx1MjdFOCcsXG5cdCAgICByYW5nOiAnXFx1MjdFOSdcblx0fTtcblxuXG4vKioqLyB9LFxuLyogMTUgKi9cbi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5cdHZhciBlcnJvcl9oYW5kbGVyXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEwKTtcblx0dmFyIHNjYW5uZXJfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpO1xuXHR2YXIgdG9rZW5fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpO1xuXHR2YXIgUmVhZGVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFJlYWRlcigpIHtcblx0ICAgICAgICB0aGlzLnZhbHVlcyA9IFtdO1xuXHQgICAgICAgIHRoaXMuY3VybHkgPSB0aGlzLnBhcmVuID0gLTE7XG5cdCAgICB9XG5cdCAgICAvLyBBIGZ1bmN0aW9uIGZvbGxvd2luZyBvbmUgb2YgdGhvc2UgdG9rZW5zIGlzIGFuIGV4cHJlc3Npb24uXG5cdCAgICBSZWFkZXIucHJvdG90eXBlLmJlZm9yZUZ1bmN0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uICh0KSB7XG5cdCAgICAgICAgcmV0dXJuIFsnKCcsICd7JywgJ1snLCAnaW4nLCAndHlwZW9mJywgJ2luc3RhbmNlb2YnLCAnbmV3Jyxcblx0ICAgICAgICAgICAgJ3JldHVybicsICdjYXNlJywgJ2RlbGV0ZScsICd0aHJvdycsICd2b2lkJyxcblx0ICAgICAgICAgICAgLy8gYXNzaWdubWVudCBvcGVyYXRvcnNcblx0ICAgICAgICAgICAgJz0nLCAnKz0nLCAnLT0nLCAnKj0nLCAnKio9JywgJy89JywgJyU9JywgJzw8PScsICc+Pj0nLCAnPj4+PScsXG5cdCAgICAgICAgICAgICcmPScsICd8PScsICdePScsICcsJyxcblx0ICAgICAgICAgICAgLy8gYmluYXJ5L3VuYXJ5IG9wZXJhdG9yc1xuXHQgICAgICAgICAgICAnKycsICctJywgJyonLCAnKionLCAnLycsICclJywgJysrJywgJy0tJywgJzw8JywgJz4+JywgJz4+PicsICcmJyxcblx0ICAgICAgICAgICAgJ3wnLCAnXicsICchJywgJ34nLCAnJiYnLCAnfHwnLCAnPycsICc6JywgJz09PScsICc9PScsICc+PScsXG5cdCAgICAgICAgICAgICc8PScsICc8JywgJz4nLCAnIT0nLCAnIT09J10uaW5kZXhPZih0KSA+PSAwO1xuXHQgICAgfTtcblx0ICAgIC8vIERldGVybWluZSBpZiBmb3J3YXJkIHNsYXNoICgvKSBpcyBhbiBvcGVyYXRvciBvciBwYXJ0IG9mIGEgcmVndWxhciBleHByZXNzaW9uXG5cdCAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9zd2VldC5qcy93aWtpL2Rlc2lnblxuXHQgICAgUmVhZGVyLnByb3RvdHlwZS5pc1JlZ2V4U3RhcnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHByZXZpb3VzID0gdGhpcy52YWx1ZXNbdGhpcy52YWx1ZXMubGVuZ3RoIC0gMV07XG5cdCAgICAgICAgdmFyIHJlZ2V4ID0gKHByZXZpb3VzICE9PSBudWxsKTtcblx0ICAgICAgICBzd2l0Y2ggKHByZXZpb3VzKSB7XG5cdCAgICAgICAgICAgIGNhc2UgJ3RoaXMnOlxuXHQgICAgICAgICAgICBjYXNlICddJzpcblx0ICAgICAgICAgICAgICAgIHJlZ2V4ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAnKSc6XG5cdCAgICAgICAgICAgICAgICB2YXIga2V5d29yZCA9IHRoaXMudmFsdWVzW3RoaXMucGFyZW4gLSAxXTtcblx0ICAgICAgICAgICAgICAgIHJlZ2V4ID0gKGtleXdvcmQgPT09ICdpZicgfHwga2V5d29yZCA9PT0gJ3doaWxlJyB8fCBrZXl3b3JkID09PSAnZm9yJyB8fCBrZXl3b3JkID09PSAnd2l0aCcpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgJ30nOlxuXHQgICAgICAgICAgICAgICAgLy8gRGl2aWRpbmcgYSBmdW5jdGlvbiBieSBhbnl0aGluZyBtYWtlcyBsaXR0bGUgc2Vuc2UsXG5cdCAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSB0byBjaGVjayBmb3IgdGhhdC5cblx0ICAgICAgICAgICAgICAgIHJlZ2V4ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZXNbdGhpcy5jdXJseSAtIDNdID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gQW5vbnltb3VzIGZ1bmN0aW9uLCBlLmcuIGZ1bmN0aW9uKCl7fSAvNDJcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2sgPSB0aGlzLnZhbHVlc1t0aGlzLmN1cmx5IC0gNF07XG5cdCAgICAgICAgICAgICAgICAgICAgcmVnZXggPSBjaGVjayA/ICF0aGlzLmJlZm9yZUZ1bmN0aW9uRXhwcmVzc2lvbihjaGVjaykgOiBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFsdWVzW3RoaXMuY3VybHkgLSA0XSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIE5hbWVkIGZ1bmN0aW9uLCBlLmcuIGZ1bmN0aW9uIGYoKXt9IC80Mi9cblx0ICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2sgPSB0aGlzLnZhbHVlc1t0aGlzLmN1cmx5IC0gNV07XG5cdCAgICAgICAgICAgICAgICAgICAgcmVnZXggPSBjaGVjayA/ICF0aGlzLmJlZm9yZUZ1bmN0aW9uRXhwcmVzc2lvbihjaGVjaykgOiB0cnVlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJlZ2V4O1xuXHQgICAgfTtcblx0ICAgIFJlYWRlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICh0b2tlbikge1xuXHQgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA3IC8qIFB1bmN0dWF0b3IgKi8gfHwgdG9rZW4udHlwZSA9PT0gNCAvKiBLZXl3b3JkICovKSB7XG5cdCAgICAgICAgICAgIGlmICh0b2tlbi52YWx1ZSA9PT0gJ3snKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmN1cmx5ID0gdGhpcy52YWx1ZXMubGVuZ3RoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnKCcpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMucGFyZW4gPSB0aGlzLnZhbHVlcy5sZW5ndGg7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy52YWx1ZXMucHVzaCh0b2tlbi52YWx1ZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLnZhbHVlcy5wdXNoKG51bGwpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICByZXR1cm4gUmVhZGVyO1xuXHR9KCkpO1xuXHR2YXIgVG9rZW5pemVyID0gKGZ1bmN0aW9uICgpIHtcblx0ICAgIGZ1bmN0aW9uIFRva2VuaXplcihjb2RlLCBjb25maWcpIHtcblx0ICAgICAgICB0aGlzLmVycm9ySGFuZGxlciA9IG5ldyBlcnJvcl9oYW5kbGVyXzEuRXJyb3JIYW5kbGVyKCk7XG5cdCAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIudG9sZXJhbnQgPSBjb25maWcgPyAodHlwZW9mIGNvbmZpZy50b2xlcmFudCA9PT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy50b2xlcmFudCkgOiBmYWxzZTtcblx0ICAgICAgICB0aGlzLnNjYW5uZXIgPSBuZXcgc2Nhbm5lcl8xLlNjYW5uZXIoY29kZSwgdGhpcy5lcnJvckhhbmRsZXIpO1xuXHQgICAgICAgIHRoaXMuc2Nhbm5lci50cmFja0NvbW1lbnQgPSBjb25maWcgPyAodHlwZW9mIGNvbmZpZy5jb21tZW50ID09PSAnYm9vbGVhbicgJiYgY29uZmlnLmNvbW1lbnQpIDogZmFsc2U7XG5cdCAgICAgICAgdGhpcy50cmFja1JhbmdlID0gY29uZmlnID8gKHR5cGVvZiBjb25maWcucmFuZ2UgPT09ICdib29sZWFuJyAmJiBjb25maWcucmFuZ2UpIDogZmFsc2U7XG5cdCAgICAgICAgdGhpcy50cmFja0xvYyA9IGNvbmZpZyA/ICh0eXBlb2YgY29uZmlnLmxvYyA9PT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5sb2MpIDogZmFsc2U7XG5cdCAgICAgICAgdGhpcy5idWZmZXIgPSBbXTtcblx0ICAgICAgICB0aGlzLnJlYWRlciA9IG5ldyBSZWFkZXIoKTtcblx0ICAgIH1cblx0ICAgIFRva2VuaXplci5wcm90b3R5cGUuZXJyb3JzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5lcnJvcnM7XG5cdCAgICB9O1xuXHQgICAgVG9rZW5pemVyLnByb3RvdHlwZS5nZXROZXh0VG9rZW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgICAgICB2YXIgY29tbWVudHMgPSB0aGlzLnNjYW5uZXIuc2NhbkNvbW1lbnRzKCk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnNjYW5uZXIudHJhY2tDb21tZW50KSB7XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBjb21tZW50c1tpXTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnNjYW5uZXIuc291cmNlLnNsaWNlKGUuc2xpY2VbMF0sIGUuc2xpY2VbMV0pO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBjb21tZW50ID0ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBlLm11bHRpTGluZSA/ICdCbG9ja0NvbW1lbnQnIDogJ0xpbmVDb21tZW50Jyxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja1JhbmdlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQucmFuZ2UgPSBlLnJhbmdlO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0xvYykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LmxvYyA9IGUubG9jO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKGNvbW1lbnQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5zY2FubmVyLmVvZigpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbG9jID0gdm9pZCAwO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tMb2MpIHtcblx0ICAgICAgICAgICAgICAgICAgICBsb2MgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLnNjYW5uZXIubGluZU51bWJlcixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogdGhpcy5zY2FubmVyLmluZGV4IC0gdGhpcy5zY2FubmVyLmxpbmVTdGFydFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHt9XG5cdCAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHZhciBzdGFydFJlZ2V4ID0gKHRoaXMuc2Nhbm5lci5zb3VyY2VbdGhpcy5zY2FubmVyLmluZGV4XSA9PT0gJy8nKSAmJiB0aGlzLnJlYWRlci5pc1JlZ2V4U3RhcnQoKTtcblx0ICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHN0YXJ0UmVnZXggPyB0aGlzLnNjYW5uZXIuc2NhblJlZ0V4cCgpIDogdGhpcy5zY2FubmVyLmxleCgpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5yZWFkZXIucHVzaCh0b2tlbik7XG5cdCAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdHlwZTogdG9rZW5fMS5Ub2tlbk5hbWVbdG9rZW4udHlwZV0sXG5cdCAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2Nhbm5lci5zb3VyY2Uuc2xpY2UodG9rZW4uc3RhcnQsIHRva2VuLmVuZClcblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja1JhbmdlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZW50cnkucmFuZ2UgPSBbdG9rZW4uc3RhcnQsIHRva2VuLmVuZF07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFja0xvYykge1xuXHQgICAgICAgICAgICAgICAgICAgIGxvYy5lbmQgPSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IHRoaXMuc2Nhbm5lci5saW5lTnVtYmVyLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuc2Nhbm5lci5pbmRleCAtIHRoaXMuc2Nhbm5lci5saW5lU3RhcnRcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIGVudHJ5LmxvYyA9IGxvYztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSA5IC8qIFJlZ3VsYXJFeHByZXNzaW9uICovKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSB0b2tlbi5wYXR0ZXJuO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBmbGFncyA9IHRva2VuLmZsYWdzO1xuXHQgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlZ2V4ID0geyBwYXR0ZXJuOiBwYXR0ZXJuLCBmbGFnczogZmxhZ3MgfTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2goZW50cnkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zaGlmdCgpO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb2tlbml6ZXI7XG5cdH0oKSk7XG5cdGV4cG9ydHMuVG9rZW5pemVyID0gVG9rZW5pemVyO1xuXG5cbi8qKiovIH1cbi8qKioqKiovIF0pXG59KTtcbjsiLCIvKlxuICBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG4gIENvcHlyaWdodCAoQykgMjAxMiBBcml5YSBIaWRheWF0IDxhcml5YS5oaWRheWF0QGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuLypqc2xpbnQgdmFyczpmYWxzZSwgYml0d2lzZTp0cnVlKi9cbi8qanNoaW50IGluZGVudDo0Ki9cbi8qZ2xvYmFsIGV4cG9ydHM6dHJ1ZSovXG4oZnVuY3Rpb24gY2xvbmUoZXhwb3J0cykge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBTeW50YXgsXG4gICAgICAgIFZpc2l0b3JPcHRpb24sXG4gICAgICAgIFZpc2l0b3JLZXlzLFxuICAgICAgICBCUkVBSyxcbiAgICAgICAgU0tJUCxcbiAgICAgICAgUkVNT1ZFO1xuXG4gICAgZnVuY3Rpb24gZGVlcENvcHkob2JqKSB7XG4gICAgICAgIHZhciByZXQgPSB7fSwga2V5LCB2YWw7XG4gICAgICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgdmFsID0gb2JqW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXRba2V5XSA9IGRlZXBDb3B5KHZhbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLy8gYmFzZWQgb24gTExWTSBsaWJjKysgdXBwZXJfYm91bmQgLyBsb3dlcl9ib3VuZFxuICAgIC8vIE1JVCBMaWNlbnNlXG5cbiAgICBmdW5jdGlvbiB1cHBlckJvdW5kKGFycmF5LCBmdW5jKSB7XG4gICAgICAgIHZhciBkaWZmLCBsZW4sIGksIGN1cnJlbnQ7XG5cbiAgICAgICAgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgICAgICBpID0gMDtcblxuICAgICAgICB3aGlsZSAobGVuKSB7XG4gICAgICAgICAgICBkaWZmID0gbGVuID4+PiAxO1xuICAgICAgICAgICAgY3VycmVudCA9IGkgKyBkaWZmO1xuICAgICAgICAgICAgaWYgKGZ1bmMoYXJyYXlbY3VycmVudF0pKSB7XG4gICAgICAgICAgICAgICAgbGVuID0gZGlmZjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSA9IGN1cnJlbnQgKyAxO1xuICAgICAgICAgICAgICAgIGxlbiAtPSBkaWZmICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBTeW50YXggPSB7XG4gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uOiAnQXNzaWdubWVudEV4cHJlc3Npb24nLFxuICAgICAgICBBc3NpZ25tZW50UGF0dGVybjogJ0Fzc2lnbm1lbnRQYXR0ZXJuJyxcbiAgICAgICAgQXJyYXlFeHByZXNzaW9uOiAnQXJyYXlFeHByZXNzaW9uJyxcbiAgICAgICAgQXJyYXlQYXR0ZXJuOiAnQXJyYXlQYXR0ZXJuJyxcbiAgICAgICAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246ICdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbicsXG4gICAgICAgIEF3YWl0RXhwcmVzc2lvbjogJ0F3YWl0RXhwcmVzc2lvbicsIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBCbG9ja1N0YXRlbWVudDogJ0Jsb2NrU3RhdGVtZW50JyxcbiAgICAgICAgQmluYXJ5RXhwcmVzc2lvbjogJ0JpbmFyeUV4cHJlc3Npb24nLFxuICAgICAgICBCcmVha1N0YXRlbWVudDogJ0JyZWFrU3RhdGVtZW50JyxcbiAgICAgICAgQ2FsbEV4cHJlc3Npb246ICdDYWxsRXhwcmVzc2lvbicsXG4gICAgICAgIENhdGNoQ2xhdXNlOiAnQ2F0Y2hDbGF1c2UnLFxuICAgICAgICBDaGFpbkV4cHJlc3Npb246ICdDaGFpbkV4cHJlc3Npb24nLFxuICAgICAgICBDbGFzc0JvZHk6ICdDbGFzc0JvZHknLFxuICAgICAgICBDbGFzc0RlY2xhcmF0aW9uOiAnQ2xhc3NEZWNsYXJhdGlvbicsXG4gICAgICAgIENsYXNzRXhwcmVzc2lvbjogJ0NsYXNzRXhwcmVzc2lvbicsXG4gICAgICAgIENvbXByZWhlbnNpb25CbG9jazogJ0NvbXByZWhlbnNpb25CbG9jaycsICAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgQ29tcHJlaGVuc2lvbkV4cHJlc3Npb246ICdDb21wcmVoZW5zaW9uRXhwcmVzc2lvbicsICAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uOiAnQ29uZGl0aW9uYWxFeHByZXNzaW9uJyxcbiAgICAgICAgQ29udGludWVTdGF0ZW1lbnQ6ICdDb250aW51ZVN0YXRlbWVudCcsXG4gICAgICAgIERlYnVnZ2VyU3RhdGVtZW50OiAnRGVidWdnZXJTdGF0ZW1lbnQnLFxuICAgICAgICBEaXJlY3RpdmVTdGF0ZW1lbnQ6ICdEaXJlY3RpdmVTdGF0ZW1lbnQnLFxuICAgICAgICBEb1doaWxlU3RhdGVtZW50OiAnRG9XaGlsZVN0YXRlbWVudCcsXG4gICAgICAgIEVtcHR5U3RhdGVtZW50OiAnRW1wdHlTdGF0ZW1lbnQnLFxuICAgICAgICBFeHBvcnRBbGxEZWNsYXJhdGlvbjogJ0V4cG9ydEFsbERlY2xhcmF0aW9uJyxcbiAgICAgICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uOiAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJyxcbiAgICAgICAgRXhwb3J0TmFtZWREZWNsYXJhdGlvbjogJ0V4cG9ydE5hbWVkRGVjbGFyYXRpb24nLFxuICAgICAgICBFeHBvcnRTcGVjaWZpZXI6ICdFeHBvcnRTcGVjaWZpZXInLFxuICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50OiAnRXhwcmVzc2lvblN0YXRlbWVudCcsXG4gICAgICAgIEZvclN0YXRlbWVudDogJ0ZvclN0YXRlbWVudCcsXG4gICAgICAgIEZvckluU3RhdGVtZW50OiAnRm9ySW5TdGF0ZW1lbnQnLFxuICAgICAgICBGb3JPZlN0YXRlbWVudDogJ0Zvck9mU3RhdGVtZW50JyxcbiAgICAgICAgRnVuY3Rpb25EZWNsYXJhdGlvbjogJ0Z1bmN0aW9uRGVjbGFyYXRpb24nLFxuICAgICAgICBGdW5jdGlvbkV4cHJlc3Npb246ICdGdW5jdGlvbkV4cHJlc3Npb24nLFxuICAgICAgICBHZW5lcmF0b3JFeHByZXNzaW9uOiAnR2VuZXJhdG9yRXhwcmVzc2lvbicsICAvLyBDQVVUSU9OOiBJdCdzIGRlZmVycmVkIHRvIEVTNy5cbiAgICAgICAgSWRlbnRpZmllcjogJ0lkZW50aWZpZXInLFxuICAgICAgICBJZlN0YXRlbWVudDogJ0lmU3RhdGVtZW50JyxcbiAgICAgICAgSW1wb3J0RXhwcmVzc2lvbjogJ0ltcG9ydEV4cHJlc3Npb24nLFxuICAgICAgICBJbXBvcnREZWNsYXJhdGlvbjogJ0ltcG9ydERlY2xhcmF0aW9uJyxcbiAgICAgICAgSW1wb3J0RGVmYXVsdFNwZWNpZmllcjogJ0ltcG9ydERlZmF1bHRTcGVjaWZpZXInLFxuICAgICAgICBJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXI6ICdJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXInLFxuICAgICAgICBJbXBvcnRTcGVjaWZpZXI6ICdJbXBvcnRTcGVjaWZpZXInLFxuICAgICAgICBMaXRlcmFsOiAnTGl0ZXJhbCcsXG4gICAgICAgIExhYmVsZWRTdGF0ZW1lbnQ6ICdMYWJlbGVkU3RhdGVtZW50JyxcbiAgICAgICAgTG9naWNhbEV4cHJlc3Npb246ICdMb2dpY2FsRXhwcmVzc2lvbicsXG4gICAgICAgIE1lbWJlckV4cHJlc3Npb246ICdNZW1iZXJFeHByZXNzaW9uJyxcbiAgICAgICAgTWV0YVByb3BlcnR5OiAnTWV0YVByb3BlcnR5JyxcbiAgICAgICAgTWV0aG9kRGVmaW5pdGlvbjogJ01ldGhvZERlZmluaXRpb24nLFxuICAgICAgICBNb2R1bGVTcGVjaWZpZXI6ICdNb2R1bGVTcGVjaWZpZXInLFxuICAgICAgICBOZXdFeHByZXNzaW9uOiAnTmV3RXhwcmVzc2lvbicsXG4gICAgICAgIE9iamVjdEV4cHJlc3Npb246ICdPYmplY3RFeHByZXNzaW9uJyxcbiAgICAgICAgT2JqZWN0UGF0dGVybjogJ09iamVjdFBhdHRlcm4nLFxuICAgICAgICBQcml2YXRlSWRlbnRpZmllcjogJ1ByaXZhdGVJZGVudGlmaWVyJyxcbiAgICAgICAgUHJvZ3JhbTogJ1Byb2dyYW0nLFxuICAgICAgICBQcm9wZXJ0eTogJ1Byb3BlcnR5JyxcbiAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uOiAnUHJvcGVydHlEZWZpbml0aW9uJyxcbiAgICAgICAgUmVzdEVsZW1lbnQ6ICdSZXN0RWxlbWVudCcsXG4gICAgICAgIFJldHVyblN0YXRlbWVudDogJ1JldHVyblN0YXRlbWVudCcsXG4gICAgICAgIFNlcXVlbmNlRXhwcmVzc2lvbjogJ1NlcXVlbmNlRXhwcmVzc2lvbicsXG4gICAgICAgIFNwcmVhZEVsZW1lbnQ6ICdTcHJlYWRFbGVtZW50JyxcbiAgICAgICAgU3VwZXI6ICdTdXBlcicsXG4gICAgICAgIFN3aXRjaFN0YXRlbWVudDogJ1N3aXRjaFN0YXRlbWVudCcsXG4gICAgICAgIFN3aXRjaENhc2U6ICdTd2l0Y2hDYXNlJyxcbiAgICAgICAgVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uOiAnVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uJyxcbiAgICAgICAgVGVtcGxhdGVFbGVtZW50OiAnVGVtcGxhdGVFbGVtZW50JyxcbiAgICAgICAgVGVtcGxhdGVMaXRlcmFsOiAnVGVtcGxhdGVMaXRlcmFsJyxcbiAgICAgICAgVGhpc0V4cHJlc3Npb246ICdUaGlzRXhwcmVzc2lvbicsXG4gICAgICAgIFRocm93U3RhdGVtZW50OiAnVGhyb3dTdGF0ZW1lbnQnLFxuICAgICAgICBUcnlTdGF0ZW1lbnQ6ICdUcnlTdGF0ZW1lbnQnLFxuICAgICAgICBVbmFyeUV4cHJlc3Npb246ICdVbmFyeUV4cHJlc3Npb24nLFxuICAgICAgICBVcGRhdGVFeHByZXNzaW9uOiAnVXBkYXRlRXhwcmVzc2lvbicsXG4gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb246ICdWYXJpYWJsZURlY2xhcmF0aW9uJyxcbiAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yOiAnVmFyaWFibGVEZWNsYXJhdG9yJyxcbiAgICAgICAgV2hpbGVTdGF0ZW1lbnQ6ICdXaGlsZVN0YXRlbWVudCcsXG4gICAgICAgIFdpdGhTdGF0ZW1lbnQ6ICdXaXRoU3RhdGVtZW50JyxcbiAgICAgICAgWWllbGRFeHByZXNzaW9uOiAnWWllbGRFeHByZXNzaW9uJ1xuICAgIH07XG5cbiAgICBWaXNpdG9yS2V5cyA9IHtcbiAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb246IFsnbGVmdCcsICdyaWdodCddLFxuICAgICAgICBBc3NpZ25tZW50UGF0dGVybjogWydsZWZ0JywgJ3JpZ2h0J10sXG4gICAgICAgIEFycmF5RXhwcmVzc2lvbjogWydlbGVtZW50cyddLFxuICAgICAgICBBcnJheVBhdHRlcm46IFsnZWxlbWVudHMnXSxcbiAgICAgICAgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb246IFsncGFyYW1zJywgJ2JvZHknXSxcbiAgICAgICAgQXdhaXRFeHByZXNzaW9uOiBbJ2FyZ3VtZW50J10sIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBCbG9ja1N0YXRlbWVudDogWydib2R5J10sXG4gICAgICAgIEJpbmFyeUV4cHJlc3Npb246IFsnbGVmdCcsICdyaWdodCddLFxuICAgICAgICBCcmVha1N0YXRlbWVudDogWydsYWJlbCddLFxuICAgICAgICBDYWxsRXhwcmVzc2lvbjogWydjYWxsZWUnLCAnYXJndW1lbnRzJ10sXG4gICAgICAgIENhdGNoQ2xhdXNlOiBbJ3BhcmFtJywgJ2JvZHknXSxcbiAgICAgICAgQ2hhaW5FeHByZXNzaW9uOiBbJ2V4cHJlc3Npb24nXSxcbiAgICAgICAgQ2xhc3NCb2R5OiBbJ2JvZHknXSxcbiAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbjogWydpZCcsICdzdXBlckNsYXNzJywgJ2JvZHknXSxcbiAgICAgICAgQ2xhc3NFeHByZXNzaW9uOiBbJ2lkJywgJ3N1cGVyQ2xhc3MnLCAnYm9keSddLFxuICAgICAgICBDb21wcmVoZW5zaW9uQmxvY2s6IFsnbGVmdCcsICdyaWdodCddLCAgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIENvbXByZWhlbnNpb25FeHByZXNzaW9uOiBbJ2Jsb2NrcycsICdmaWx0ZXInLCAnYm9keSddLCAgLy8gQ0FVVElPTjogSXQncyBkZWZlcnJlZCB0byBFUzcuXG4gICAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbjogWyd0ZXN0JywgJ2NvbnNlcXVlbnQnLCAnYWx0ZXJuYXRlJ10sXG4gICAgICAgIENvbnRpbnVlU3RhdGVtZW50OiBbJ2xhYmVsJ10sXG4gICAgICAgIERlYnVnZ2VyU3RhdGVtZW50OiBbXSxcbiAgICAgICAgRGlyZWN0aXZlU3RhdGVtZW50OiBbXSxcbiAgICAgICAgRG9XaGlsZVN0YXRlbWVudDogWydib2R5JywgJ3Rlc3QnXSxcbiAgICAgICAgRW1wdHlTdGF0ZW1lbnQ6IFtdLFxuICAgICAgICBFeHBvcnRBbGxEZWNsYXJhdGlvbjogWydzb3VyY2UnXSxcbiAgICAgICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uOiBbJ2RlY2xhcmF0aW9uJ10sXG4gICAgICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb246IFsnZGVjbGFyYXRpb24nLCAnc3BlY2lmaWVycycsICdzb3VyY2UnXSxcbiAgICAgICAgRXhwb3J0U3BlY2lmaWVyOiBbJ2V4cG9ydGVkJywgJ2xvY2FsJ10sXG4gICAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQ6IFsnZXhwcmVzc2lvbiddLFxuICAgICAgICBGb3JTdGF0ZW1lbnQ6IFsnaW5pdCcsICd0ZXN0JywgJ3VwZGF0ZScsICdib2R5J10sXG4gICAgICAgIEZvckluU3RhdGVtZW50OiBbJ2xlZnQnLCAncmlnaHQnLCAnYm9keSddLFxuICAgICAgICBGb3JPZlN0YXRlbWVudDogWydsZWZ0JywgJ3JpZ2h0JywgJ2JvZHknXSxcbiAgICAgICAgRnVuY3Rpb25EZWNsYXJhdGlvbjogWydpZCcsICdwYXJhbXMnLCAnYm9keSddLFxuICAgICAgICBGdW5jdGlvbkV4cHJlc3Npb246IFsnaWQnLCAncGFyYW1zJywgJ2JvZHknXSxcbiAgICAgICAgR2VuZXJhdG9yRXhwcmVzc2lvbjogWydibG9ja3MnLCAnZmlsdGVyJywgJ2JvZHknXSwgIC8vIENBVVRJT046IEl0J3MgZGVmZXJyZWQgdG8gRVM3LlxuICAgICAgICBJZGVudGlmaWVyOiBbXSxcbiAgICAgICAgSWZTdGF0ZW1lbnQ6IFsndGVzdCcsICdjb25zZXF1ZW50JywgJ2FsdGVybmF0ZSddLFxuICAgICAgICBJbXBvcnRFeHByZXNzaW9uOiBbJ3NvdXJjZSddLFxuICAgICAgICBJbXBvcnREZWNsYXJhdGlvbjogWydzcGVjaWZpZXJzJywgJ3NvdXJjZSddLFxuICAgICAgICBJbXBvcnREZWZhdWx0U3BlY2lmaWVyOiBbJ2xvY2FsJ10sXG4gICAgICAgIEltcG9ydE5hbWVzcGFjZVNwZWNpZmllcjogWydsb2NhbCddLFxuICAgICAgICBJbXBvcnRTcGVjaWZpZXI6IFsnaW1wb3J0ZWQnLCAnbG9jYWwnXSxcbiAgICAgICAgTGl0ZXJhbDogW10sXG4gICAgICAgIExhYmVsZWRTdGF0ZW1lbnQ6IFsnbGFiZWwnLCAnYm9keSddLFxuICAgICAgICBMb2dpY2FsRXhwcmVzc2lvbjogWydsZWZ0JywgJ3JpZ2h0J10sXG4gICAgICAgIE1lbWJlckV4cHJlc3Npb246IFsnb2JqZWN0JywgJ3Byb3BlcnR5J10sXG4gICAgICAgIE1ldGFQcm9wZXJ0eTogWydtZXRhJywgJ3Byb3BlcnR5J10sXG4gICAgICAgIE1ldGhvZERlZmluaXRpb246IFsna2V5JywgJ3ZhbHVlJ10sXG4gICAgICAgIE1vZHVsZVNwZWNpZmllcjogW10sXG4gICAgICAgIE5ld0V4cHJlc3Npb246IFsnY2FsbGVlJywgJ2FyZ3VtZW50cyddLFxuICAgICAgICBPYmplY3RFeHByZXNzaW9uOiBbJ3Byb3BlcnRpZXMnXSxcbiAgICAgICAgT2JqZWN0UGF0dGVybjogWydwcm9wZXJ0aWVzJ10sXG4gICAgICAgIFByaXZhdGVJZGVudGlmaWVyOiBbXSxcbiAgICAgICAgUHJvZ3JhbTogWydib2R5J10sXG4gICAgICAgIFByb3BlcnR5OiBbJ2tleScsICd2YWx1ZSddLFxuICAgICAgICBQcm9wZXJ0eURlZmluaXRpb246IFsna2V5JywgJ3ZhbHVlJ10sXG4gICAgICAgIFJlc3RFbGVtZW50OiBbICdhcmd1bWVudCcgXSxcbiAgICAgICAgUmV0dXJuU3RhdGVtZW50OiBbJ2FyZ3VtZW50J10sXG4gICAgICAgIFNlcXVlbmNlRXhwcmVzc2lvbjogWydleHByZXNzaW9ucyddLFxuICAgICAgICBTcHJlYWRFbGVtZW50OiBbJ2FyZ3VtZW50J10sXG4gICAgICAgIFN1cGVyOiBbXSxcbiAgICAgICAgU3dpdGNoU3RhdGVtZW50OiBbJ2Rpc2NyaW1pbmFudCcsICdjYXNlcyddLFxuICAgICAgICBTd2l0Y2hDYXNlOiBbJ3Rlc3QnLCAnY29uc2VxdWVudCddLFxuICAgICAgICBUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246IFsndGFnJywgJ3F1YXNpJ10sXG4gICAgICAgIFRlbXBsYXRlRWxlbWVudDogW10sXG4gICAgICAgIFRlbXBsYXRlTGl0ZXJhbDogWydxdWFzaXMnLCAnZXhwcmVzc2lvbnMnXSxcbiAgICAgICAgVGhpc0V4cHJlc3Npb246IFtdLFxuICAgICAgICBUaHJvd1N0YXRlbWVudDogWydhcmd1bWVudCddLFxuICAgICAgICBUcnlTdGF0ZW1lbnQ6IFsnYmxvY2snLCAnaGFuZGxlcicsICdmaW5hbGl6ZXInXSxcbiAgICAgICAgVW5hcnlFeHByZXNzaW9uOiBbJ2FyZ3VtZW50J10sXG4gICAgICAgIFVwZGF0ZUV4cHJlc3Npb246IFsnYXJndW1lbnQnXSxcbiAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbjogWydkZWNsYXJhdGlvbnMnXSxcbiAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yOiBbJ2lkJywgJ2luaXQnXSxcbiAgICAgICAgV2hpbGVTdGF0ZW1lbnQ6IFsndGVzdCcsICdib2R5J10sXG4gICAgICAgIFdpdGhTdGF0ZW1lbnQ6IFsnb2JqZWN0JywgJ2JvZHknXSxcbiAgICAgICAgWWllbGRFeHByZXNzaW9uOiBbJ2FyZ3VtZW50J11cbiAgICB9O1xuXG4gICAgLy8gdW5pcXVlIGlkXG4gICAgQlJFQUsgPSB7fTtcbiAgICBTS0lQID0ge307XG4gICAgUkVNT1ZFID0ge307XG5cbiAgICBWaXNpdG9yT3B0aW9uID0ge1xuICAgICAgICBCcmVhazogQlJFQUssXG4gICAgICAgIFNraXA6IFNLSVAsXG4gICAgICAgIFJlbW92ZTogUkVNT1ZFXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFJlZmVyZW5jZShwYXJlbnQsIGtleSkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgfVxuXG4gICAgUmVmZXJlbmNlLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShub2RlKSB7XG4gICAgICAgIHRoaXMucGFyZW50W3RoaXMua2V5XSA9IG5vZGU7XG4gICAgfTtcblxuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnBhcmVudCkpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnNwbGljZSh0aGlzLmtleSwgMSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZShudWxsKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBFbGVtZW50KG5vZGUsIHBhdGgsIHdyYXAsIHJlZikge1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLndyYXAgPSB3cmFwO1xuICAgICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBDb250cm9sbGVyKCkgeyB9XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gcmV0dXJuIHByb3BlcnR5IHBhdGggYXJyYXkgZnJvbSByb290IHRvIGN1cnJlbnQgbm9kZVxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnBhdGggPSBmdW5jdGlvbiBwYXRoKCkge1xuICAgICAgICB2YXIgaSwgaXosIGosIGp6LCByZXN1bHQsIGVsZW1lbnQ7XG5cbiAgICAgICAgZnVuY3Rpb24gYWRkVG9QYXRoKHJlc3VsdCwgcGF0aCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwLCBqeiA9IHBhdGgubGVuZ3RoOyBqIDwgano7ICsraikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwYXRoW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcm9vdCBub2RlXG4gICAgICAgIGlmICghdGhpcy5fX2N1cnJlbnQucGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXJzdCBub2RlIGlzIHNlbnRpbmVsLCBzZWNvbmQgbm9kZSBpcyByb290IGVsZW1lbnRcbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDIsIGl6ID0gdGhpcy5fX2xlYXZlbGlzdC5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGhpcy5fX2xlYXZlbGlzdFtpXTtcbiAgICAgICAgICAgIGFkZFRvUGF0aChyZXN1bHQsIGVsZW1lbnQucGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkVG9QYXRoKHJlc3VsdCwgdGhpcy5fX2N1cnJlbnQucGF0aCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8vIEFQSTpcbiAgICAvLyByZXR1cm4gdHlwZSBvZiBjdXJyZW50IG5vZGVcbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS50eXBlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuY3VycmVudCgpO1xuICAgICAgICByZXR1cm4gbm9kZS50eXBlIHx8IHRoaXMuX19jdXJyZW50LndyYXA7XG4gICAgfTtcblxuICAgIC8vIEFQSTpcbiAgICAvLyByZXR1cm4gYXJyYXkgb2YgcGFyZW50IGVsZW1lbnRzXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUucGFyZW50cyA9IGZ1bmN0aW9uIHBhcmVudHMoKSB7XG4gICAgICAgIHZhciBpLCBpeiwgcmVzdWx0O1xuXG4gICAgICAgIC8vIGZpcnN0IG5vZGUgaXMgc2VudGluZWxcbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoaSA9IDEsIGl6ID0gdGhpcy5fX2xlYXZlbGlzdC5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLl9fbGVhdmVsaXN0W2ldLm5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIHJldHVybiBjdXJyZW50IG5vZGVcbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5jdXJyZW50ID0gZnVuY3Rpb24gY3VycmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX19jdXJyZW50Lm5vZGU7XG4gICAgfTtcblxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLl9fZXhlY3V0ZSA9IGZ1bmN0aW9uIF9fZXhlY3V0ZShjYWxsYmFjaywgZWxlbWVudCkge1xuICAgICAgICB2YXIgcHJldmlvdXMsIHJlc3VsdDtcblxuICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgcHJldmlvdXMgID0gdGhpcy5fX2N1cnJlbnQ7XG4gICAgICAgIHRoaXMuX19jdXJyZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5fX3N0YXRlID0gbnVsbDtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBjYWxsYmFjay5jYWxsKHRoaXMsIGVsZW1lbnQubm9kZSwgdGhpcy5fX2xlYXZlbGlzdFt0aGlzLl9fbGVhdmVsaXN0Lmxlbmd0aCAtIDFdLm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19jdXJyZW50ID0gcHJldmlvdXM7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gQVBJOlxuICAgIC8vIG5vdGlmeSBjb250cm9sIHNraXAgLyBicmVha1xuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLm5vdGlmeSA9IGZ1bmN0aW9uIG5vdGlmeShmbGFnKSB7XG4gICAgICAgIHRoaXMuX19zdGF0ZSA9IGZsYWc7XG4gICAgfTtcblxuICAgIC8vIEFQSTpcbiAgICAvLyBza2lwIGNoaWxkIG5vZGVzIG9mIGN1cnJlbnQgbm9kZVxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMubm90aWZ5KFNLSVApO1xuICAgIH07XG5cbiAgICAvLyBBUEk6XG4gICAgLy8gYnJlYWsgdHJhdmVyc2Fsc1xuICAgIENvbnRyb2xsZXIucHJvdG90eXBlWydicmVhayddID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLm5vdGlmeShCUkVBSyk7XG4gICAgfTtcblxuICAgIC8vIEFQSTpcbiAgICAvLyByZW1vdmUgbm9kZVxuICAgIENvbnRyb2xsZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ub3RpZnkoUkVNT1ZFKTtcbiAgICB9O1xuXG4gICAgQ29udHJvbGxlci5wcm90b3R5cGUuX19pbml0aWFsaXplID0gZnVuY3Rpb24ocm9vdCwgdmlzaXRvcikge1xuICAgICAgICB0aGlzLnZpc2l0b3IgPSB2aXNpdG9yO1xuICAgICAgICB0aGlzLnJvb3QgPSByb290O1xuICAgICAgICB0aGlzLl9fd29ya2xpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5fX2xlYXZlbGlzdCA9IFtdO1xuICAgICAgICB0aGlzLl9fY3VycmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuX19zdGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX19mYWxsYmFjayA9IG51bGw7XG4gICAgICAgIGlmICh2aXNpdG9yLmZhbGxiYWNrID09PSAnaXRlcmF0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5fX2ZhbGxiYWNrID0gT2JqZWN0LmtleXM7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZpc2l0b3IuZmFsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuX19mYWxsYmFjayA9IHZpc2l0b3IuZmFsbGJhY2s7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9fa2V5cyA9IFZpc2l0b3JLZXlzO1xuICAgICAgICBpZiAodmlzaXRvci5rZXlzKSB7XG4gICAgICAgICAgICB0aGlzLl9fa2V5cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh0aGlzLl9fa2V5cyksIHZpc2l0b3Iua2V5cyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaXNOb2RlKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG5vZGUudHlwZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNQcm9wZXJ0eShub2RlVHlwZSwga2V5KSB7XG4gICAgICAgIHJldHVybiAobm9kZVR5cGUgPT09IFN5bnRheC5PYmplY3RFeHByZXNzaW9uIHx8IG5vZGVUeXBlID09PSBTeW50YXguT2JqZWN0UGF0dGVybikgJiYgJ3Byb3BlcnRpZXMnID09PSBrZXk7XG4gICAgfVxuICBcbiAgICBmdW5jdGlvbiBjYW5kaWRhdGVFeGlzdHNJbkxlYXZlTGlzdChsZWF2ZWxpc3QsIGNhbmRpZGF0ZSkge1xuICAgICAgICBmb3IgKHZhciBpID0gbGVhdmVsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICBpZiAobGVhdmVsaXN0W2ldLm5vZGUgPT09IGNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS50cmF2ZXJzZSA9IGZ1bmN0aW9uIHRyYXZlcnNlKHJvb3QsIHZpc2l0b3IpIHtcbiAgICAgICAgdmFyIHdvcmtsaXN0LFxuICAgICAgICAgICAgbGVhdmVsaXN0LFxuICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBub2RlVHlwZSxcbiAgICAgICAgICAgIHJldCxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICBjdXJyZW50MixcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMsXG4gICAgICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgICAgICBzZW50aW5lbDtcblxuICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZShyb290LCB2aXNpdG9yKTtcblxuICAgICAgICBzZW50aW5lbCA9IHt9O1xuXG4gICAgICAgIC8vIHJlZmVyZW5jZVxuICAgICAgICB3b3JrbGlzdCA9IHRoaXMuX193b3JrbGlzdDtcbiAgICAgICAgbGVhdmVsaXN0ID0gdGhpcy5fX2xlYXZlbGlzdDtcblxuICAgICAgICAvLyBpbml0aWFsaXplXG4gICAgICAgIHdvcmtsaXN0LnB1c2gobmV3IEVsZW1lbnQocm9vdCwgbnVsbCwgbnVsbCwgbnVsbCkpO1xuICAgICAgICBsZWF2ZWxpc3QucHVzaChuZXcgRWxlbWVudChudWxsLCBudWxsLCBudWxsLCBudWxsKSk7XG5cbiAgICAgICAgd2hpbGUgKHdvcmtsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHdvcmtsaXN0LnBvcCgpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gc2VudGluZWwpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50ID0gbGVhdmVsaXN0LnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5fX2V4ZWN1dGUodmlzaXRvci5sZWF2ZSwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBCUkVBSyB8fCByZXQgPT09IEJSRUFLKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGUpIHtcblxuICAgICAgICAgICAgICAgIHJldCA9IHRoaXMuX19leGVjdXRlKHZpc2l0b3IuZW50ZXIsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gQlJFQUsgfHwgcmV0ID09PSBCUkVBSykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgd29ya2xpc3QucHVzaChzZW50aW5lbCk7XG4gICAgICAgICAgICAgICAgbGVhdmVsaXN0LnB1c2goZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBTS0lQIHx8IHJldCA9PT0gU0tJUCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBub2RlID0gZWxlbWVudC5ub2RlO1xuICAgICAgICAgICAgICAgIG5vZGVUeXBlID0gbm9kZS50eXBlIHx8IGVsZW1lbnQud3JhcDtcbiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gdGhpcy5fX2tleXNbbm9kZVR5cGVdO1xuICAgICAgICAgICAgICAgIGlmICghY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fX2ZhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gdGhpcy5fX2ZhbGxiYWNrKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG5vZGUgdHlwZSAnICsgbm9kZVR5cGUgKyAnLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGNhbmRpZGF0ZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHdoaWxlICgoY3VycmVudCAtPSAxKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGNhbmRpZGF0ZXNbY3VycmVudF07XG4gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IG5vZGVba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudDIgPSBjYW5kaWRhdGUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChjdXJyZW50MiAtPSAxKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYW5kaWRhdGVbY3VycmVudDJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGVFeGlzdHNJbkxlYXZlTGlzdChsZWF2ZWxpc3QsIGNhbmRpZGF0ZVtjdXJyZW50Ml0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcm9wZXJ0eShub2RlVHlwZSwgY2FuZGlkYXRlc1tjdXJyZW50XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGNhbmRpZGF0ZVtjdXJyZW50Ml0sIFtrZXksIGN1cnJlbnQyXSwgJ1Byb3BlcnR5JywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc05vZGUoY2FuZGlkYXRlW2N1cnJlbnQyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGNhbmRpZGF0ZVtjdXJyZW50Ml0sIFtrZXksIGN1cnJlbnQyXSwgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtsaXN0LnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGVFeGlzdHNJbkxlYXZlTGlzdChsZWF2ZWxpc3QsIGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtsaXN0LnB1c2gobmV3IEVsZW1lbnQoY2FuZGlkYXRlLCBrZXksIG51bGwsIG51bGwpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBDb250cm9sbGVyLnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShyb290LCB2aXNpdG9yKSB7XG4gICAgICAgIHZhciB3b3JrbGlzdCxcbiAgICAgICAgICAgIGxlYXZlbGlzdCxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBub2RlVHlwZSxcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgY3VycmVudDIsXG4gICAgICAgICAgICBjYW5kaWRhdGVzLFxuICAgICAgICAgICAgY2FuZGlkYXRlLFxuICAgICAgICAgICAgc2VudGluZWwsXG4gICAgICAgICAgICBvdXRlcixcbiAgICAgICAgICAgIGtleTtcblxuICAgICAgICBmdW5jdGlvbiByZW1vdmVFbGVtKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciBpLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBuZXh0RWxlbSxcbiAgICAgICAgICAgICAgICBwYXJlbnQ7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50LnJlZi5yZW1vdmUoKSkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHJlZmVyZW5jZSBpcyBhbiBlbGVtZW50IG9mIGFuIGFycmF5LlxuICAgICAgICAgICAgICAgIGtleSA9IGVsZW1lbnQucmVmLmtleTtcbiAgICAgICAgICAgICAgICBwYXJlbnQgPSBlbGVtZW50LnJlZi5wYXJlbnQ7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiByZW1vdmVkIGZyb20gYXJyYXksIHRoZW4gZGVjcmVhc2UgZm9sbG93aW5nIGl0ZW1zJyBrZXlzLlxuICAgICAgICAgICAgICAgIGkgPSB3b3JrbGlzdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbSA9IHdvcmtsaXN0W2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEVsZW0ucmVmICYmIG5leHRFbGVtLnJlZi5wYXJlbnQgPT09IHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgIChuZXh0RWxlbS5yZWYua2V5IDwga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAtLW5leHRFbGVtLnJlZi5rZXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZShyb290LCB2aXNpdG9yKTtcblxuICAgICAgICBzZW50aW5lbCA9IHt9O1xuXG4gICAgICAgIC8vIHJlZmVyZW5jZVxuICAgICAgICB3b3JrbGlzdCA9IHRoaXMuX193b3JrbGlzdDtcbiAgICAgICAgbGVhdmVsaXN0ID0gdGhpcy5fX2xlYXZlbGlzdDtcblxuICAgICAgICAvLyBpbml0aWFsaXplXG4gICAgICAgIG91dGVyID0ge1xuICAgICAgICAgICAgcm9vdDogcm9vdFxuICAgICAgICB9O1xuICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQocm9vdCwgbnVsbCwgbnVsbCwgbmV3IFJlZmVyZW5jZShvdXRlciwgJ3Jvb3QnKSk7XG4gICAgICAgIHdvcmtsaXN0LnB1c2goZWxlbWVudCk7XG4gICAgICAgIGxlYXZlbGlzdC5wdXNoKGVsZW1lbnQpO1xuXG4gICAgICAgIHdoaWxlICh3b3JrbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB3b3JrbGlzdC5wb3AoKTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT09IHNlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudCA9IGxlYXZlbGlzdC5wb3AoKTtcblxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuX19leGVjdXRlKHZpc2l0b3IubGVhdmUsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgLy8gbm9kZSBtYXkgYmUgcmVwbGFjZWQgd2l0aCBudWxsLFxuICAgICAgICAgICAgICAgIC8vIHNvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdW5kZWZpbmVkIGFuZCBudWxsIGluIHRoaXMgcGxhY2VcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0ICE9PSBCUkVBSyAmJiB0YXJnZXQgIT09IFNLSVAgJiYgdGFyZ2V0ICE9PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZVxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnJlZi5yZXBsYWNlKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gUkVNT1ZFIHx8IHRhcmdldCA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZUVsZW0oZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gQlJFQUsgfHwgdGFyZ2V0ID09PSBCUkVBSykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0ZXIucm9vdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuX19leGVjdXRlKHZpc2l0b3IuZW50ZXIsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAvLyBub2RlIG1heSBiZSByZXBsYWNlZCB3aXRoIG51bGwsXG4gICAgICAgICAgICAvLyBzbyBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVuZGVmaW5lZCBhbmQgbnVsbCBpbiB0aGlzIHBsYWNlXG4gICAgICAgICAgICBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0ICE9PSBCUkVBSyAmJiB0YXJnZXQgIT09IFNLSVAgJiYgdGFyZ2V0ICE9PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICAvLyByZXBsYWNlXG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZWYucmVwbGFjZSh0YXJnZXQpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQubm9kZSA9IHRhcmdldDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gUkVNT1ZFIHx8IHRhcmdldCA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlRWxlbShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50Lm5vZGUgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBCUkVBSyB8fCB0YXJnZXQgPT09IEJSRUFLKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dGVyLnJvb3Q7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vZGUgbWF5IGJlIG51bGxcbiAgICAgICAgICAgIG5vZGUgPSBlbGVtZW50Lm5vZGU7XG4gICAgICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd29ya2xpc3QucHVzaChzZW50aW5lbCk7XG4gICAgICAgICAgICBsZWF2ZWxpc3QucHVzaChlbGVtZW50KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gU0tJUCB8fCB0YXJnZXQgPT09IFNLSVApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbm9kZVR5cGUgPSBub2RlLnR5cGUgfHwgZWxlbWVudC53cmFwO1xuICAgICAgICAgICAgY2FuZGlkYXRlcyA9IHRoaXMuX19rZXlzW25vZGVUeXBlXTtcbiAgICAgICAgICAgIGlmICghY2FuZGlkYXRlcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fZmFsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IHRoaXMuX19mYWxsYmFjayhub2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbm9kZSB0eXBlICcgKyBub2RlVHlwZSArICcuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50ID0gY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnQgLT0gMSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGtleSA9IGNhbmRpZGF0ZXNbY3VycmVudF07XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gbm9kZVtrZXldO1xuICAgICAgICAgICAgICAgIGlmICghY2FuZGlkYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudDIgPSBjYW5kaWRhdGUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGN1cnJlbnQyIC09IDEpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FuZGlkYXRlW2N1cnJlbnQyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvcGVydHkobm9kZVR5cGUsIGNhbmRpZGF0ZXNbY3VycmVudF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGNhbmRpZGF0ZVtjdXJyZW50Ml0sIFtrZXksIGN1cnJlbnQyXSwgJ1Byb3BlcnR5JywgbmV3IFJlZmVyZW5jZShjYW5kaWRhdGUsIGN1cnJlbnQyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZShjYW5kaWRhdGVbY3VycmVudDJdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudChjYW5kaWRhdGVbY3VycmVudDJdLCBba2V5LCBjdXJyZW50Ml0sIG51bGwsIG5ldyBSZWZlcmVuY2UoY2FuZGlkYXRlLCBjdXJyZW50MikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtsaXN0LnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzTm9kZShjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtsaXN0LnB1c2gobmV3IEVsZW1lbnQoY2FuZGlkYXRlLCBrZXksIG51bGwsIG5ldyBSZWZlcmVuY2Uobm9kZSwga2V5KSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRlci5yb290O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiB0cmF2ZXJzZShyb290LCB2aXNpdG9yKSB7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIoKTtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIudHJhdmVyc2Uocm9vdCwgdmlzaXRvcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyb290LCB2aXNpdG9yKSB7XG4gICAgICAgIHZhciBjb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIoKTtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIucmVwbGFjZShyb290LCB2aXNpdG9yKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmRDb21tZW50UmFuZ2UoY29tbWVudCwgdG9rZW5zKSB7XG4gICAgICAgIHZhciB0YXJnZXQ7XG5cbiAgICAgICAgdGFyZ2V0ID0gdXBwZXJCb3VuZCh0b2tlbnMsIGZ1bmN0aW9uIHNlYXJjaCh0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuLnJhbmdlWzBdID4gY29tbWVudC5yYW5nZVswXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tbWVudC5leHRlbmRlZFJhbmdlID0gW2NvbW1lbnQucmFuZ2VbMF0sIGNvbW1lbnQucmFuZ2VbMV1dO1xuXG4gICAgICAgIGlmICh0YXJnZXQgIT09IHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbW1lbnQuZXh0ZW5kZWRSYW5nZVsxXSA9IHRva2Vuc1t0YXJnZXRdLnJhbmdlWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFyZ2V0IC09IDE7XG4gICAgICAgIGlmICh0YXJnZXQgPj0gMCkge1xuICAgICAgICAgICAgY29tbWVudC5leHRlbmRlZFJhbmdlWzBdID0gdG9rZW5zW3RhcmdldF0ucmFuZ2VbMV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhdHRhY2hDb21tZW50cyh0cmVlLCBwcm92aWRlZENvbW1lbnRzLCB0b2tlbnMpIHtcbiAgICAgICAgLy8gQXQgZmlyc3QsIHdlIHNob3VsZCBjYWxjdWxhdGUgZXh0ZW5kZWQgY29tbWVudCByYW5nZXMuXG4gICAgICAgIHZhciBjb21tZW50cyA9IFtdLCBjb21tZW50LCBsZW4sIGksIGN1cnNvcjtcblxuICAgICAgICBpZiAoIXRyZWUucmFuZ2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYXR0YWNoQ29tbWVudHMgbmVlZHMgcmFuZ2UgaW5mb3JtYXRpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRva2VucyBhcnJheSBpcyBlbXB0eSwgd2UgYXR0YWNoIGNvbW1lbnRzIHRvIHRyZWUgYXMgJ2xlYWRpbmdDb21tZW50cydcbiAgICAgICAgaWYgKCF0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAocHJvdmlkZWRDb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBwcm92aWRlZENvbW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBkZWVwQ29weShwcm92aWRlZENvbW1lbnRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudC5leHRlbmRlZFJhbmdlID0gWzAsIHRyZWUucmFuZ2VbMF1dO1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cmVlLmxlYWRpbmdDb21tZW50cyA9IGNvbW1lbnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRyZWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBwcm92aWRlZENvbW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb21tZW50cy5wdXNoKGV4dGVuZENvbW1lbnRSYW5nZShkZWVwQ29weShwcm92aWRlZENvbW1lbnRzW2ldKSwgdG9rZW5zKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlzIGlzIGJhc2VkIG9uIEpvaG4gRnJlZW1hbidzIGltcGxlbWVudGF0aW9uLlxuICAgICAgICBjdXJzb3IgPSAwO1xuICAgICAgICB0cmF2ZXJzZSh0cmVlLCB7XG4gICAgICAgICAgICBlbnRlcjogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tbWVudDtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IgPCBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnRzW2N1cnNvcl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50LmV4dGVuZGVkUmFuZ2VbMV0gPiBub2RlLnJhbmdlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50LmV4dGVuZGVkUmFuZ2VbMV0gPT09IG5vZGUucmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS5sZWFkaW5nQ29tbWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxlYWRpbmdDb21tZW50cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5sZWFkaW5nQ29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnNwbGljZShjdXJzb3IsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IG91dCBvZiBvd25lZCBub2RlXG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvciA9PT0gY29tbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpdG9yT3B0aW9uLkJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb21tZW50c1tjdXJzb3JdLmV4dGVuZGVkUmFuZ2VbMF0gPiBub2RlLnJhbmdlWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpdG9yT3B0aW9uLlNraXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjdXJzb3IgPSAwO1xuICAgICAgICB0cmF2ZXJzZSh0cmVlLCB7XG4gICAgICAgICAgICBsZWF2ZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29tbWVudDtcblxuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IgPCBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnRzW2N1cnNvcl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnJhbmdlWzFdIDwgY29tbWVudC5leHRlbmRlZFJhbmdlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnJhbmdlWzFdID09PSBjb21tZW50LmV4dGVuZGVkUmFuZ2VbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS50cmFpbGluZ0NvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50cmFpbGluZ0NvbW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnRyYWlsaW5nQ29tbWVudHMucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLnNwbGljZShjdXJzb3IsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IG91dCBvZiBvd25lZCBub2RlXG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvciA9PT0gY29tbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpdG9yT3B0aW9uLkJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb21tZW50c1tjdXJzb3JdLmV4dGVuZGVkUmFuZ2VbMF0gPiBub2RlLnJhbmdlWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpdG9yT3B0aW9uLlNraXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdHJlZTtcbiAgICB9XG5cbiAgICBleHBvcnRzLlN5bnRheCA9IFN5bnRheDtcbiAgICBleHBvcnRzLnRyYXZlcnNlID0gdHJhdmVyc2U7XG4gICAgZXhwb3J0cy5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICBleHBvcnRzLmF0dGFjaENvbW1lbnRzID0gYXR0YWNoQ29tbWVudHM7XG4gICAgZXhwb3J0cy5WaXNpdG9yS2V5cyA9IFZpc2l0b3JLZXlzO1xuICAgIGV4cG9ydHMuVmlzaXRvck9wdGlvbiA9IFZpc2l0b3JPcHRpb247XG4gICAgZXhwb3J0cy5Db250cm9sbGVyID0gQ29udHJvbGxlcjtcbiAgICBleHBvcnRzLmNsb25lRW52aXJvbm1lbnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjbG9uZSh7fSk7IH07XG5cbiAgICByZXR1cm4gZXhwb3J0cztcbn0oZXhwb3J0cykpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbiIsIi8qXG4gIENvcHlyaWdodCAoQykgMjAxMyBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAnQVMgSVMnXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgZnVuY3Rpb24gaXNFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0FycmF5RXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdBc3NpZ25tZW50RXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdCaW5hcnlFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ0NhbGxFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ0NvbmRpdGlvbmFsRXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdGdW5jdGlvbkV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnSWRlbnRpZmllcic6XG4gICAgICAgICAgICBjYXNlICdMaXRlcmFsJzpcbiAgICAgICAgICAgIGNhc2UgJ0xvZ2ljYWxFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ01lbWJlckV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnTmV3RXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdPYmplY3RFeHByZXNzaW9uJzpcbiAgICAgICAgICAgIGNhc2UgJ1NlcXVlbmNlRXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdUaGlzRXhwcmVzc2lvbic6XG4gICAgICAgICAgICBjYXNlICdVbmFyeUV4cHJlc3Npb24nOlxuICAgICAgICAgICAgY2FzZSAnVXBkYXRlRXhwcmVzc2lvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSXRlcmF0aW9uU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0RvV2hpbGVTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRm9ySW5TdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRm9yU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ1doaWxlU3RhdGVtZW50JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTdGF0ZW1lbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnQmxvY2tTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnQnJlYWtTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnQ29udGludWVTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRGVidWdnZXJTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnRG9XaGlsZVN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdFbXB0eVN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdFeHByZXNzaW9uU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0ZvckluU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ0ZvclN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdJZlN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdMYWJlbGVkU3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ1JldHVyblN0YXRlbWVudCc6XG4gICAgICAgICAgICBjYXNlICdTd2l0Y2hTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnVGhyb3dTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnVHJ5U3RhdGVtZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ1ZhcmlhYmxlRGVjbGFyYXRpb24nOlxuICAgICAgICAgICAgY2FzZSAnV2hpbGVTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnV2l0aFN0YXRlbWVudCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU291cmNlRWxlbWVudChub2RlKSB7XG4gICAgICByZXR1cm4gaXNTdGF0ZW1lbnQobm9kZSkgfHwgbm9kZSAhPSBudWxsICYmIG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uRGVjbGFyYXRpb24nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRyYWlsaW5nU3RhdGVtZW50KG5vZGUpIHtcbiAgICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnSWZTdGF0ZW1lbnQnOlxuICAgICAgICAgICAgaWYgKG5vZGUuYWx0ZXJuYXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5hbHRlcm5hdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5jb25zZXF1ZW50O1xuXG4gICAgICAgIGNhc2UgJ0xhYmVsZWRTdGF0ZW1lbnQnOlxuICAgICAgICBjYXNlICdGb3JTdGF0ZW1lbnQnOlxuICAgICAgICBjYXNlICdGb3JJblN0YXRlbWVudCc6XG4gICAgICAgIGNhc2UgJ1doaWxlU3RhdGVtZW50JzpcbiAgICAgICAgY2FzZSAnV2l0aFN0YXRlbWVudCc6XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5ib2R5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUHJvYmxlbWF0aWNJZlN0YXRlbWVudChub2RlKSB7XG4gICAgICAgIHZhciBjdXJyZW50O1xuXG4gICAgICAgIGlmIChub2RlLnR5cGUgIT09ICdJZlN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5hbHRlcm5hdGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBub2RlLmNvbnNlcXVlbnQ7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50LnR5cGUgPT09ICdJZlN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5hbHRlcm5hdGUgPT0gbnVsbCkgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudCA9IHRyYWlsaW5nU3RhdGVtZW50KGN1cnJlbnQpO1xuICAgICAgICB9IHdoaWxlIChjdXJyZW50KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgICAgIGlzRXhwcmVzc2lvbjogaXNFeHByZXNzaW9uLFxuICAgICAgICBpc1N0YXRlbWVudDogaXNTdGF0ZW1lbnQsXG4gICAgICAgIGlzSXRlcmF0aW9uU3RhdGVtZW50OiBpc0l0ZXJhdGlvblN0YXRlbWVudCxcbiAgICAgICAgaXNTb3VyY2VFbGVtZW50OiBpc1NvdXJjZUVsZW1lbnQsXG4gICAgICAgIGlzUHJvYmxlbWF0aWNJZlN0YXRlbWVudDogaXNQcm9ibGVtYXRpY0lmU3RhdGVtZW50LFxuXG4gICAgICAgIHRyYWlsaW5nU3RhdGVtZW50OiB0cmFpbGluZ1N0YXRlbWVudFxuICAgIH07XG59KCkpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbiIsIi8qXG4gIENvcHlyaWdodCAoQykgMjAxMy0yMDE0IFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cbiAgQ29weXJpZ2h0IChDKSAyMDE0IEl2YW4gTmlrdWxpbiA8aWZhYWFuQGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBFUzZSZWdleCwgRVM1UmVnZXgsIE5PTl9BU0NJSV9XSElURVNQQUNFUywgSURFTlRJRklFUl9TVEFSVCwgSURFTlRJRklFUl9QQVJULCBjaDtcblxuICAgIC8vIFNlZSBgdG9vbHMvZ2VuZXJhdGUtaWRlbnRpZmllci1yZWdleC5qc2AuXG4gICAgRVM1UmVnZXggPSB7XG4gICAgICAgIC8vIEVDTUFTY3JpcHQgNS4xL1VuaWNvZGUgdjkuMC4wIE5vbkFzY2lpSWRlbnRpZmllclN0YXJ0OlxuICAgICAgICBOb25Bc2NpaUlkZW50aWZpZXJTdGFydDogL1tcXHhBQVxceEI1XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDM3MC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4NlxcdTAzODgtXFx1MDM4QVxcdTAzOENcXHUwMzhFLVxcdTAzQTFcXHUwM0EzLVxcdTAzRjVcXHUwM0Y3LVxcdTA0ODFcXHUwNDhBLVxcdTA1MkZcXHUwNTMxLVxcdTA1NTZcXHUwNTU5XFx1MDU2MS1cXHUwNTg3XFx1MDVEMC1cXHUwNUVBXFx1MDVGMC1cXHUwNUYyXFx1MDYyMC1cXHUwNjRBXFx1MDY2RVxcdTA2NkZcXHUwNjcxLVxcdTA2RDNcXHUwNkQ1XFx1MDZFNVxcdTA2RTZcXHUwNkVFXFx1MDZFRlxcdTA2RkEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwXFx1MDcxMi1cXHUwNzJGXFx1MDc0RC1cXHUwN0E1XFx1MDdCMVxcdTA3Q0EtXFx1MDdFQVxcdTA3RjRcXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgxNVxcdTA4MUFcXHUwODI0XFx1MDgyOFxcdTA4NDAtXFx1MDg1OFxcdTA4QTAtXFx1MDhCNFxcdTA4QjYtXFx1MDhCRFxcdTA5MDQtXFx1MDkzOVxcdTA5M0RcXHUwOTUwXFx1MDk1OC1cXHUwOTYxXFx1MDk3MS1cXHUwOTgwXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCRFxcdTA5Q0VcXHUwOURDXFx1MDlERFxcdTA5REYtXFx1MDlFMVxcdTA5RjBcXHUwOUYxXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE3Mi1cXHUwQTc0XFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJEXFx1MEFEMFxcdTBBRTBcXHUwQUUxXFx1MEFGOVxcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNEXFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjFcXHUwQjcxXFx1MEI4M1xcdTBCODUtXFx1MEI4QVxcdTBCOEUtXFx1MEI5MFxcdTBCOTItXFx1MEI5NVxcdTBCOTlcXHUwQjlBXFx1MEI5Q1xcdTBCOUVcXHUwQjlGXFx1MEJBM1xcdTBCQTRcXHUwQkE4LVxcdTBCQUFcXHUwQkFFLVxcdTBCQjlcXHUwQkQwXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRFxcdTBDNTgtXFx1MEM1QVxcdTBDNjBcXHUwQzYxXFx1MEM4MFxcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkRcXHUwQ0RFXFx1MENFMFxcdTBDRTFcXHUwQ0YxXFx1MENGMlxcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0RcXHUwRDRFXFx1MEQ1NC1cXHUwRDU2XFx1MEQ1Ri1cXHUwRDYxXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4NS1cXHUwRDk2XFx1MEQ5QS1cXHUwREIxXFx1MERCMy1cXHUwREJCXFx1MERCRFxcdTBEQzAtXFx1MERDNlxcdTBFMDEtXFx1MEUzMFxcdTBFMzJcXHUwRTMzXFx1MEU0MC1cXHUwRTQ2XFx1MEU4MVxcdTBFODJcXHUwRTg0XFx1MEU4N1xcdTBFODhcXHUwRThBXFx1MEU4RFxcdTBFOTQtXFx1MEU5N1xcdTBFOTktXFx1MEU5RlxcdTBFQTEtXFx1MEVBM1xcdTBFQTVcXHUwRUE3XFx1MEVBQVxcdTBFQUJcXHUwRUFELVxcdTBFQjBcXHUwRUIyXFx1MEVCM1xcdTBFQkRcXHUwRUMwLVxcdTBFQzRcXHUwRUM2XFx1MEVEQy1cXHUwRURGXFx1MEYwMFxcdTBGNDAtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGODgtXFx1MEY4Q1xcdTEwMDAtXFx1MTAyQVxcdTEwM0ZcXHUxMDUwLVxcdTEwNTVcXHUxMDVBLVxcdTEwNURcXHUxMDYxXFx1MTA2NVxcdTEwNjZcXHUxMDZFLVxcdTEwNzBcXHUxMDc1LVxcdTEwODFcXHUxMDhFXFx1MTBBMC1cXHUxMEM1XFx1MTBDN1xcdTEwQ0RcXHUxMEQwLVxcdTEwRkFcXHUxMEZDLVxcdTEyNDhcXHUxMjRBLVxcdTEyNERcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1QS1cXHUxMjVEXFx1MTI2MC1cXHUxMjg4XFx1MTI4QS1cXHUxMjhEXFx1MTI5MC1cXHUxMkIwXFx1MTJCMi1cXHUxMkI1XFx1MTJCOC1cXHUxMkJFXFx1MTJDMFxcdTEyQzItXFx1MTJDNVxcdTEyQzgtXFx1MTJENlxcdTEyRDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1QVxcdTEzODAtXFx1MTM4RlxcdTEzQTAtXFx1MTNGNVxcdTEzRjgtXFx1MTNGRFxcdTE0MDEtXFx1MTY2Q1xcdTE2NkYtXFx1MTY3RlxcdTE2ODEtXFx1MTY5QVxcdTE2QTAtXFx1MTZFQVxcdTE2RUUtXFx1MTZGOFxcdTE3MDAtXFx1MTcwQ1xcdTE3MEUtXFx1MTcxMVxcdTE3MjAtXFx1MTczMVxcdTE3NDAtXFx1MTc1MVxcdTE3NjAtXFx1MTc2Q1xcdTE3NkUtXFx1MTc3MFxcdTE3ODAtXFx1MTdCM1xcdTE3RDdcXHUxN0RDXFx1MTgyMC1cXHUxODc3XFx1MTg4MC1cXHUxODg0XFx1MTg4Ny1cXHUxOEE4XFx1MThBQVxcdTE4QjAtXFx1MThGNVxcdTE5MDAtXFx1MTkxRVxcdTE5NTAtXFx1MTk2RFxcdTE5NzAtXFx1MTk3NFxcdTE5ODAtXFx1MTlBQlxcdTE5QjAtXFx1MTlDOVxcdTFBMDAtXFx1MUExNlxcdTFBMjAtXFx1MUE1NFxcdTFBQTdcXHUxQjA1LVxcdTFCMzNcXHUxQjQ1LVxcdTFCNEJcXHUxQjgzLVxcdTFCQTBcXHUxQkFFXFx1MUJBRlxcdTFCQkEtXFx1MUJFNVxcdTFDMDAtXFx1MUMyM1xcdTFDNEQtXFx1MUM0RlxcdTFDNUEtXFx1MUM3RFxcdTFDODAtXFx1MUM4OFxcdTFDRTktXFx1MUNFQ1xcdTFDRUUtXFx1MUNGMVxcdTFDRjVcXHUxQ0Y2XFx1MUQwMC1cXHUxREJGXFx1MUUwMC1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIwNzFcXHUyMDdGXFx1MjA5MC1cXHUyMDlDXFx1MjEwMlxcdTIxMDdcXHUyMTBBLVxcdTIxMTNcXHUyMTE1XFx1MjExOS1cXHUyMTFEXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyQS1cXHUyMTJEXFx1MjEyRi1cXHUyMTM5XFx1MjEzQy1cXHUyMTNGXFx1MjE0NS1cXHUyMTQ5XFx1MjE0RVxcdTIxNjAtXFx1MjE4OFxcdTJDMDAtXFx1MkMyRVxcdTJDMzAtXFx1MkM1RVxcdTJDNjAtXFx1MkNFNFxcdTJDRUItXFx1MkNFRVxcdTJDRjJcXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ4MC1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MkUyRlxcdTMwMDUtXFx1MzAwN1xcdTMwMjEtXFx1MzAyOVxcdTMwMzEtXFx1MzAzNVxcdTMwMzgtXFx1MzAzQ1xcdTMwNDEtXFx1MzA5NlxcdTMwOUQtXFx1MzA5RlxcdTMwQTEtXFx1MzBGQVxcdTMwRkMtXFx1MzBGRlxcdTMxMDUtXFx1MzEyRFxcdTMxMzEtXFx1MzE4RVxcdTMxQTAtXFx1MzFCQVxcdTMxRjAtXFx1MzFGRlxcdTM0MDAtXFx1NERCNVxcdTRFMDAtXFx1OUZENVxcdUEwMDAtXFx1QTQ4Q1xcdUE0RDAtXFx1QTRGRFxcdUE1MDAtXFx1QTYwQ1xcdUE2MTAtXFx1QTYxRlxcdUE2MkFcXHVBNjJCXFx1QTY0MC1cXHVBNjZFXFx1QTY3Ri1cXHVBNjlEXFx1QTZBMC1cXHVBNkVGXFx1QTcxNy1cXHVBNzFGXFx1QTcyMi1cXHVBNzg4XFx1QTc4Qi1cXHVBN0FFXFx1QTdCMC1cXHVBN0I3XFx1QTdGNy1cXHVBODAxXFx1QTgwMy1cXHVBODA1XFx1QTgwNy1cXHVBODBBXFx1QTgwQy1cXHVBODIyXFx1QTg0MC1cXHVBODczXFx1QTg4Mi1cXHVBOEIzXFx1QThGMi1cXHVBOEY3XFx1QThGQlxcdUE4RkRcXHVBOTBBLVxcdUE5MjVcXHVBOTMwLVxcdUE5NDZcXHVBOTYwLVxcdUE5N0NcXHVBOTg0LVxcdUE5QjJcXHVBOUNGXFx1QTlFMC1cXHVBOUU0XFx1QTlFNi1cXHVBOUVGXFx1QTlGQS1cXHVBOUZFXFx1QUEwMC1cXHVBQTI4XFx1QUE0MC1cXHVBQTQyXFx1QUE0NC1cXHVBQTRCXFx1QUE2MC1cXHVBQTc2XFx1QUE3QVxcdUFBN0UtXFx1QUFBRlxcdUFBQjFcXHVBQUI1XFx1QUFCNlxcdUFBQjktXFx1QUFCRFxcdUFBQzBcXHVBQUMyXFx1QUFEQi1cXHVBQUREXFx1QUFFMC1cXHVBQUVBXFx1QUFGMi1cXHVBQUY0XFx1QUIwMS1cXHVBQjA2XFx1QUIwOS1cXHVBQjBFXFx1QUIxMS1cXHVBQjE2XFx1QUIyMC1cXHVBQjI2XFx1QUIyOC1cXHVBQjJFXFx1QUIzMC1cXHVBQjVBXFx1QUI1Qy1cXHVBQjY1XFx1QUI3MC1cXHVBQkUyXFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRFxcdUZCMUYtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkU3MC1cXHVGRTc0XFx1RkU3Ni1cXHVGRUZDXFx1RkYyMS1cXHVGRjNBXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXS8sXG4gICAgICAgIC8vIEVDTUFTY3JpcHQgNS4xL1VuaWNvZGUgdjkuMC4wIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6XG4gICAgICAgIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6IC9bXFx4QUFcXHhCNVxceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzMDAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM3RlxcdTAzODZcXHUwMzg4LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4My1cXHUwNDg3XFx1MDQ4QS1cXHUwNTJGXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1OTEtXFx1MDVCRFxcdTA1QkZcXHUwNUMxXFx1MDVDMlxcdTA1QzRcXHUwNUM1XFx1MDVDN1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MTAtXFx1MDYxQVxcdTA2MjAtXFx1MDY2OVxcdTA2NkUtXFx1MDZEM1xcdTA2RDUtXFx1MDZEQ1xcdTA2REYtXFx1MDZFOFxcdTA2RUEtXFx1MDZGQ1xcdTA2RkZcXHUwNzEwLVxcdTA3NEFcXHUwNzRELVxcdTA3QjFcXHUwN0MwLVxcdTA3RjVcXHUwN0ZBXFx1MDgwMC1cXHUwODJEXFx1MDg0MC1cXHUwODVCXFx1MDhBMC1cXHUwOEI0XFx1MDhCNi1cXHUwOEJEXFx1MDhENC1cXHUwOEUxXFx1MDhFMy1cXHUwOTYzXFx1MDk2Ni1cXHUwOTZGXFx1MDk3MS1cXHUwOTgzXFx1MDk4NS1cXHUwOThDXFx1MDk4RlxcdTA5OTBcXHUwOTkzLVxcdTA5QThcXHUwOUFBLVxcdTA5QjBcXHUwOUIyXFx1MDlCNi1cXHUwOUI5XFx1MDlCQy1cXHUwOUM0XFx1MDlDN1xcdTA5QzhcXHUwOUNCLVxcdTA5Q0VcXHUwOUQ3XFx1MDlEQ1xcdTA5RERcXHUwOURGLVxcdTA5RTNcXHUwOUU2LVxcdTA5RjFcXHUwQTAxLVxcdTBBMDNcXHUwQTA1LVxcdTBBMEFcXHUwQTBGXFx1MEExMFxcdTBBMTMtXFx1MEEyOFxcdTBBMkEtXFx1MEEzMFxcdTBBMzJcXHUwQTMzXFx1MEEzNVxcdTBBMzZcXHUwQTM4XFx1MEEzOVxcdTBBM0NcXHUwQTNFLVxcdTBBNDJcXHUwQTQ3XFx1MEE0OFxcdTBBNEItXFx1MEE0RFxcdTBBNTFcXHUwQTU5LVxcdTBBNUNcXHUwQTVFXFx1MEE2Ni1cXHUwQTc1XFx1MEE4MS1cXHUwQTgzXFx1MEE4NS1cXHUwQThEXFx1MEE4Ri1cXHUwQTkxXFx1MEE5My1cXHUwQUE4XFx1MEFBQS1cXHUwQUIwXFx1MEFCMlxcdTBBQjNcXHUwQUI1LVxcdTBBQjlcXHUwQUJDLVxcdTBBQzVcXHUwQUM3LVxcdTBBQzlcXHUwQUNCLVxcdTBBQ0RcXHUwQUQwXFx1MEFFMC1cXHUwQUUzXFx1MEFFNi1cXHUwQUVGXFx1MEFGOVxcdTBCMDEtXFx1MEIwM1xcdTBCMDUtXFx1MEIwQ1xcdTBCMEZcXHUwQjEwXFx1MEIxMy1cXHUwQjI4XFx1MEIyQS1cXHUwQjMwXFx1MEIzMlxcdTBCMzNcXHUwQjM1LVxcdTBCMzlcXHUwQjNDLVxcdTBCNDRcXHUwQjQ3XFx1MEI0OFxcdTBCNEItXFx1MEI0RFxcdTBCNTZcXHUwQjU3XFx1MEI1Q1xcdTBCNURcXHUwQjVGLVxcdTBCNjNcXHUwQjY2LVxcdTBCNkZcXHUwQjcxXFx1MEI4MlxcdTBCODNcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5XFx1MEI5QVxcdTBCOUNcXHUwQjlFXFx1MEI5RlxcdTBCQTNcXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI5XFx1MEJCRS1cXHUwQkMyXFx1MEJDNi1cXHUwQkM4XFx1MEJDQS1cXHUwQkNEXFx1MEJEMFxcdTBCRDdcXHUwQkU2LVxcdTBCRUZcXHUwQzAwLVxcdTBDMDNcXHUwQzA1LVxcdTBDMENcXHUwQzBFLVxcdTBDMTBcXHUwQzEyLVxcdTBDMjhcXHUwQzJBLVxcdTBDMzlcXHUwQzNELVxcdTBDNDRcXHUwQzQ2LVxcdTBDNDhcXHUwQzRBLVxcdTBDNERcXHUwQzU1XFx1MEM1NlxcdTBDNTgtXFx1MEM1QVxcdTBDNjAtXFx1MEM2M1xcdTBDNjYtXFx1MEM2RlxcdTBDODAtXFx1MEM4M1xcdTBDODUtXFx1MEM4Q1xcdTBDOEUtXFx1MEM5MFxcdTBDOTItXFx1MENBOFxcdTBDQUEtXFx1MENCM1xcdTBDQjUtXFx1MENCOVxcdTBDQkMtXFx1MENDNFxcdTBDQzYtXFx1MENDOFxcdTBDQ0EtXFx1MENDRFxcdTBDRDVcXHUwQ0Q2XFx1MENERVxcdTBDRTAtXFx1MENFM1xcdTBDRTYtXFx1MENFRlxcdTBDRjFcXHUwQ0YyXFx1MEQwMS1cXHUwRDAzXFx1MEQwNS1cXHUwRDBDXFx1MEQwRS1cXHUwRDEwXFx1MEQxMi1cXHUwRDNBXFx1MEQzRC1cXHUwRDQ0XFx1MEQ0Ni1cXHUwRDQ4XFx1MEQ0QS1cXHUwRDRFXFx1MEQ1NC1cXHUwRDU3XFx1MEQ1Ri1cXHUwRDYzXFx1MEQ2Ni1cXHUwRDZGXFx1MEQ3QS1cXHUwRDdGXFx1MEQ4MlxcdTBEODNcXHUwRDg1LVxcdTBEOTZcXHUwRDlBLVxcdTBEQjFcXHUwREIzLVxcdTBEQkJcXHUwREJEXFx1MERDMC1cXHUwREM2XFx1MERDQVxcdTBEQ0YtXFx1MERENFxcdTBERDZcXHUwREQ4LVxcdTBEREZcXHUwREU2LVxcdTBERUZcXHUwREYyXFx1MERGM1xcdTBFMDEtXFx1MEUzQVxcdTBFNDAtXFx1MEU0RVxcdTBFNTAtXFx1MEU1OVxcdTBFODFcXHUwRTgyXFx1MEU4NFxcdTBFODdcXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUFcXHUwRUFCXFx1MEVBRC1cXHUwRUI5XFx1MEVCQi1cXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEVDNlxcdTBFQzgtXFx1MEVDRFxcdTBFRDAtXFx1MEVEOVxcdTBFREMtXFx1MEVERlxcdTBGMDBcXHUwRjE4XFx1MEYxOVxcdTBGMjAtXFx1MEYyOVxcdTBGMzVcXHUwRjM3XFx1MEYzOVxcdTBGM0UtXFx1MEY0N1xcdTBGNDktXFx1MEY2Q1xcdTBGNzEtXFx1MEY4NFxcdTBGODYtXFx1MEY5N1xcdTBGOTktXFx1MEZCQ1xcdTBGQzZcXHUxMDAwLVxcdTEwNDlcXHUxMDUwLVxcdTEwOURcXHUxMEEwLVxcdTEwQzVcXHUxMEM3XFx1MTBDRFxcdTEwRDAtXFx1MTBGQVxcdTEwRkMtXFx1MTI0OFxcdTEyNEEtXFx1MTI0RFxcdTEyNTAtXFx1MTI1NlxcdTEyNThcXHUxMjVBLVxcdTEyNURcXHUxMjYwLVxcdTEyODhcXHUxMjhBLVxcdTEyOERcXHUxMjkwLVxcdTEyQjBcXHUxMkIyLVxcdTEyQjVcXHUxMkI4LVxcdTEyQkVcXHUxMkMwXFx1MTJDMi1cXHUxMkM1XFx1MTJDOC1cXHUxMkQ2XFx1MTJEOC1cXHUxMzEwXFx1MTMxMi1cXHUxMzE1XFx1MTMxOC1cXHUxMzVBXFx1MTM1RC1cXHUxMzVGXFx1MTM4MC1cXHUxMzhGXFx1MTNBMC1cXHUxM0Y1XFx1MTNGOC1cXHUxM0ZEXFx1MTQwMS1cXHUxNjZDXFx1MTY2Ri1cXHUxNjdGXFx1MTY4MS1cXHUxNjlBXFx1MTZBMC1cXHUxNkVBXFx1MTZFRS1cXHUxNkY4XFx1MTcwMC1cXHUxNzBDXFx1MTcwRS1cXHUxNzE0XFx1MTcyMC1cXHUxNzM0XFx1MTc0MC1cXHUxNzUzXFx1MTc2MC1cXHUxNzZDXFx1MTc2RS1cXHUxNzcwXFx1MTc3MlxcdTE3NzNcXHUxNzgwLVxcdTE3RDNcXHUxN0Q3XFx1MTdEQ1xcdTE3RERcXHUxN0UwLVxcdTE3RTlcXHUxODBCLVxcdTE4MERcXHUxODEwLVxcdTE4MTlcXHUxODIwLVxcdTE4NzdcXHUxODgwLVxcdTE4QUFcXHUxOEIwLVxcdTE4RjVcXHUxOTAwLVxcdTE5MUVcXHUxOTIwLVxcdTE5MkJcXHUxOTMwLVxcdTE5M0JcXHUxOTQ2LVxcdTE5NkRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5QUJcXHUxOUIwLVxcdTE5QzlcXHUxOUQwLVxcdTE5RDlcXHUxQTAwLVxcdTFBMUJcXHUxQTIwLVxcdTFBNUVcXHUxQTYwLVxcdTFBN0NcXHUxQTdGLVxcdTFBODlcXHUxQTkwLVxcdTFBOTlcXHUxQUE3XFx1MUFCMC1cXHUxQUJEXFx1MUIwMC1cXHUxQjRCXFx1MUI1MC1cXHUxQjU5XFx1MUI2Qi1cXHUxQjczXFx1MUI4MC1cXHUxQkYzXFx1MUMwMC1cXHUxQzM3XFx1MUM0MC1cXHUxQzQ5XFx1MUM0RC1cXHUxQzdEXFx1MUM4MC1cXHUxQzg4XFx1MUNEMC1cXHUxQ0QyXFx1MUNENC1cXHUxQ0Y2XFx1MUNGOFxcdTFDRjlcXHUxRDAwLVxcdTFERjVcXHUxREZCLVxcdTFGMTVcXHUxRjE4LVxcdTFGMURcXHUxRjIwLVxcdTFGNDVcXHUxRjQ4LVxcdTFGNERcXHUxRjUwLVxcdTFGNTdcXHUxRjU5XFx1MUY1QlxcdTFGNURcXHUxRjVGLVxcdTFGN0RcXHUxRjgwLVxcdTFGQjRcXHUxRkI2LVxcdTFGQkNcXHUxRkJFXFx1MUZDMi1cXHUxRkM0XFx1MUZDNi1cXHUxRkNDXFx1MUZEMC1cXHUxRkQzXFx1MUZENi1cXHUxRkRCXFx1MUZFMC1cXHUxRkVDXFx1MUZGMi1cXHUxRkY0XFx1MUZGNi1cXHUxRkZDXFx1MjAwQ1xcdTIwMERcXHUyMDNGXFx1MjA0MFxcdTIwNTRcXHUyMDcxXFx1MjA3RlxcdTIwOTAtXFx1MjA5Q1xcdTIwRDAtXFx1MjBEQ1xcdTIwRTFcXHUyMEU1LVxcdTIwRjBcXHUyMTAyXFx1MjEwN1xcdTIxMEEtXFx1MjExM1xcdTIxMTVcXHUyMTE5LVxcdTIxMURcXHUyMTI0XFx1MjEyNlxcdTIxMjhcXHUyMTJBLVxcdTIxMkRcXHUyMTJGLVxcdTIxMzlcXHUyMTNDLVxcdTIxM0ZcXHUyMTQ1LVxcdTIxNDlcXHUyMTRFXFx1MjE2MC1cXHUyMTg4XFx1MkMwMC1cXHUyQzJFXFx1MkMzMC1cXHUyQzVFXFx1MkM2MC1cXHUyQ0U0XFx1MkNFQi1cXHUyQ0YzXFx1MkQwMC1cXHUyRDI1XFx1MkQyN1xcdTJEMkRcXHUyRDMwLVxcdTJENjdcXHUyRDZGXFx1MkQ3Ri1cXHUyRDk2XFx1MkRBMC1cXHUyREE2XFx1MkRBOC1cXHUyREFFXFx1MkRCMC1cXHUyREI2XFx1MkRCOC1cXHUyREJFXFx1MkRDMC1cXHUyREM2XFx1MkRDOC1cXHUyRENFXFx1MkREMC1cXHUyREQ2XFx1MkREOC1cXHUyRERFXFx1MkRFMC1cXHUyREZGXFx1MkUyRlxcdTMwMDUtXFx1MzAwN1xcdTMwMjEtXFx1MzAyRlxcdTMwMzEtXFx1MzAzNVxcdTMwMzgtXFx1MzAzQ1xcdTMwNDEtXFx1MzA5NlxcdTMwOTlcXHUzMDlBXFx1MzA5RC1cXHUzMDlGXFx1MzBBMS1cXHUzMEZBXFx1MzBGQy1cXHUzMEZGXFx1MzEwNS1cXHUzMTJEXFx1MzEzMS1cXHUzMThFXFx1MzFBMC1cXHUzMUJBXFx1MzFGMC1cXHUzMUZGXFx1MzQwMC1cXHU0REI1XFx1NEUwMC1cXHU5RkQ1XFx1QTAwMC1cXHVBNDhDXFx1QTREMC1cXHVBNEZEXFx1QTUwMC1cXHVBNjBDXFx1QTYxMC1cXHVBNjJCXFx1QTY0MC1cXHVBNjZGXFx1QTY3NC1cXHVBNjdEXFx1QTY3Ri1cXHVBNkYxXFx1QTcxNy1cXHVBNzFGXFx1QTcyMi1cXHVBNzg4XFx1QTc4Qi1cXHVBN0FFXFx1QTdCMC1cXHVBN0I3XFx1QTdGNy1cXHVBODI3XFx1QTg0MC1cXHVBODczXFx1QTg4MC1cXHVBOEM1XFx1QThEMC1cXHVBOEQ5XFx1QThFMC1cXHVBOEY3XFx1QThGQlxcdUE4RkRcXHVBOTAwLVxcdUE5MkRcXHVBOTMwLVxcdUE5NTNcXHVBOTYwLVxcdUE5N0NcXHVBOTgwLVxcdUE5QzBcXHVBOUNGLVxcdUE5RDlcXHVBOUUwLVxcdUE5RkVcXHVBQTAwLVxcdUFBMzZcXHVBQTQwLVxcdUFBNERcXHVBQTUwLVxcdUFBNTlcXHVBQTYwLVxcdUFBNzZcXHVBQTdBLVxcdUFBQzJcXHVBQURCLVxcdUFBRERcXHVBQUUwLVxcdUFBRUZcXHVBQUYyLVxcdUFBRjZcXHVBQjAxLVxcdUFCMDZcXHVBQjA5LVxcdUFCMEVcXHVBQjExLVxcdUFCMTZcXHVBQjIwLVxcdUFCMjZcXHVBQjI4LVxcdUFCMkVcXHVBQjMwLVxcdUFCNUFcXHVBQjVDLVxcdUFCNjVcXHVBQjcwLVxcdUFCRUFcXHVBQkVDXFx1QUJFRFxcdUFCRjAtXFx1QUJGOVxcdUFDMDAtXFx1RDdBM1xcdUQ3QjAtXFx1RDdDNlxcdUQ3Q0ItXFx1RDdGQlxcdUY5MDAtXFx1RkE2RFxcdUZBNzAtXFx1RkFEOVxcdUZCMDAtXFx1RkIwNlxcdUZCMTMtXFx1RkIxN1xcdUZCMUQtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkUwMC1cXHVGRTBGXFx1RkUyMC1cXHVGRTJGXFx1RkUzM1xcdUZFMzRcXHVGRTRELVxcdUZFNEZcXHVGRTcwLVxcdUZFNzRcXHVGRTc2LVxcdUZFRkNcXHVGRjEwLVxcdUZGMTlcXHVGRjIxLVxcdUZGM0FcXHVGRjNGXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXS9cbiAgICB9O1xuXG4gICAgRVM2UmVnZXggPSB7XG4gICAgICAgIC8vIEVDTUFTY3JpcHQgNi9Vbmljb2RlIHY5LjAuMCBOb25Bc2NpaUlkZW50aWZpZXJTdGFydDpcbiAgICAgICAgTm9uQXNjaWlJZGVudGlmaWVyU3RhcnQ6IC9bXFx4QUFcXHhCNVxceEJBXFx4QzAtXFx4RDZcXHhEOC1cXHhGNlxceEY4LVxcdTAyQzFcXHUwMkM2LVxcdTAyRDFcXHUwMkUwLVxcdTAyRTRcXHUwMkVDXFx1MDJFRVxcdTAzNzAtXFx1MDM3NFxcdTAzNzZcXHUwMzc3XFx1MDM3QS1cXHUwMzdEXFx1MDM3RlxcdTAzODZcXHUwMzg4LVxcdTAzOEFcXHUwMzhDXFx1MDM4RS1cXHUwM0ExXFx1MDNBMy1cXHUwM0Y1XFx1MDNGNy1cXHUwNDgxXFx1MDQ4QS1cXHUwNTJGXFx1MDUzMS1cXHUwNTU2XFx1MDU1OVxcdTA1NjEtXFx1MDU4N1xcdTA1RDAtXFx1MDVFQVxcdTA1RjAtXFx1MDVGMlxcdTA2MjAtXFx1MDY0QVxcdTA2NkVcXHUwNjZGXFx1MDY3MS1cXHUwNkQzXFx1MDZENVxcdTA2RTVcXHUwNkU2XFx1MDZFRVxcdTA2RUZcXHUwNkZBLVxcdTA2RkNcXHUwNkZGXFx1MDcxMFxcdTA3MTItXFx1MDcyRlxcdTA3NEQtXFx1MDdBNVxcdTA3QjFcXHUwN0NBLVxcdTA3RUFcXHUwN0Y0XFx1MDdGNVxcdTA3RkFcXHUwODAwLVxcdTA4MTVcXHUwODFBXFx1MDgyNFxcdTA4MjhcXHUwODQwLVxcdTA4NThcXHUwOEEwLVxcdTA4QjRcXHUwOEI2LVxcdTA4QkRcXHUwOTA0LVxcdTA5MzlcXHUwOTNEXFx1MDk1MFxcdTA5NTgtXFx1MDk2MVxcdTA5NzEtXFx1MDk4MFxcdTA5ODUtXFx1MDk4Q1xcdTA5OEZcXHUwOTkwXFx1MDk5My1cXHUwOUE4XFx1MDlBQS1cXHUwOUIwXFx1MDlCMlxcdTA5QjYtXFx1MDlCOVxcdTA5QkRcXHUwOUNFXFx1MDlEQ1xcdTA5RERcXHUwOURGLVxcdTA5RTFcXHUwOUYwXFx1MDlGMVxcdTBBMDUtXFx1MEEwQVxcdTBBMEZcXHUwQTEwXFx1MEExMy1cXHUwQTI4XFx1MEEyQS1cXHUwQTMwXFx1MEEzMlxcdTBBMzNcXHUwQTM1XFx1MEEzNlxcdTBBMzhcXHUwQTM5XFx1MEE1OS1cXHUwQTVDXFx1MEE1RVxcdTBBNzItXFx1MEE3NFxcdTBBODUtXFx1MEE4RFxcdTBBOEYtXFx1MEE5MVxcdTBBOTMtXFx1MEFBOFxcdTBBQUEtXFx1MEFCMFxcdTBBQjJcXHUwQUIzXFx1MEFCNS1cXHUwQUI5XFx1MEFCRFxcdTBBRDBcXHUwQUUwXFx1MEFFMVxcdTBBRjlcXHUwQjA1LVxcdTBCMENcXHUwQjBGXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzJcXHUwQjMzXFx1MEIzNS1cXHUwQjM5XFx1MEIzRFxcdTBCNUNcXHUwQjVEXFx1MEI1Ri1cXHUwQjYxXFx1MEI3MVxcdTBCODNcXHUwQjg1LVxcdTBCOEFcXHUwQjhFLVxcdTBCOTBcXHUwQjkyLVxcdTBCOTVcXHUwQjk5XFx1MEI5QVxcdTBCOUNcXHUwQjlFXFx1MEI5RlxcdTBCQTNcXHUwQkE0XFx1MEJBOC1cXHUwQkFBXFx1MEJBRS1cXHUwQkI5XFx1MEJEMFxcdTBDMDUtXFx1MEMwQ1xcdTBDMEUtXFx1MEMxMFxcdTBDMTItXFx1MEMyOFxcdTBDMkEtXFx1MEMzOVxcdTBDM0RcXHUwQzU4LVxcdTBDNUFcXHUwQzYwXFx1MEM2MVxcdTBDODBcXHUwQzg1LVxcdTBDOENcXHUwQzhFLVxcdTBDOTBcXHUwQzkyLVxcdTBDQThcXHUwQ0FBLVxcdTBDQjNcXHUwQ0I1LVxcdTBDQjlcXHUwQ0JEXFx1MENERVxcdTBDRTBcXHUwQ0UxXFx1MENGMVxcdTBDRjJcXHUwRDA1LVxcdTBEMENcXHUwRDBFLVxcdTBEMTBcXHUwRDEyLVxcdTBEM0FcXHUwRDNEXFx1MEQ0RVxcdTBENTQtXFx1MEQ1NlxcdTBENUYtXFx1MEQ2MVxcdTBEN0EtXFx1MEQ3RlxcdTBEODUtXFx1MEQ5NlxcdTBEOUEtXFx1MERCMVxcdTBEQjMtXFx1MERCQlxcdTBEQkRcXHUwREMwLVxcdTBEQzZcXHUwRTAxLVxcdTBFMzBcXHUwRTMyXFx1MEUzM1xcdTBFNDAtXFx1MEU0NlxcdTBFODFcXHUwRTgyXFx1MEU4NFxcdTBFODdcXHUwRTg4XFx1MEU4QVxcdTBFOERcXHUwRTk0LVxcdTBFOTdcXHUwRTk5LVxcdTBFOUZcXHUwRUExLVxcdTBFQTNcXHUwRUE1XFx1MEVBN1xcdTBFQUFcXHUwRUFCXFx1MEVBRC1cXHUwRUIwXFx1MEVCMlxcdTBFQjNcXHUwRUJEXFx1MEVDMC1cXHUwRUM0XFx1MEVDNlxcdTBFREMtXFx1MEVERlxcdTBGMDBcXHUwRjQwLVxcdTBGNDdcXHUwRjQ5LVxcdTBGNkNcXHUwRjg4LVxcdTBGOENcXHUxMDAwLVxcdTEwMkFcXHUxMDNGXFx1MTA1MC1cXHUxMDU1XFx1MTA1QS1cXHUxMDVEXFx1MTA2MVxcdTEwNjVcXHUxMDY2XFx1MTA2RS1cXHUxMDcwXFx1MTA3NS1cXHUxMDgxXFx1MTA4RVxcdTEwQTAtXFx1MTBDNVxcdTEwQzdcXHUxMENEXFx1MTBEMC1cXHUxMEZBXFx1MTBGQy1cXHUxMjQ4XFx1MTI0QS1cXHUxMjREXFx1MTI1MC1cXHUxMjU2XFx1MTI1OFxcdTEyNUEtXFx1MTI1RFxcdTEyNjAtXFx1MTI4OFxcdTEyOEEtXFx1MTI4RFxcdTEyOTAtXFx1MTJCMFxcdTEyQjItXFx1MTJCNVxcdTEyQjgtXFx1MTJCRVxcdTEyQzBcXHUxMkMyLVxcdTEyQzVcXHUxMkM4LVxcdTEyRDZcXHUxMkQ4LVxcdTEzMTBcXHUxMzEyLVxcdTEzMTVcXHUxMzE4LVxcdTEzNUFcXHUxMzgwLVxcdTEzOEZcXHUxM0EwLVxcdTEzRjVcXHUxM0Y4LVxcdTEzRkRcXHUxNDAxLVxcdTE2NkNcXHUxNjZGLVxcdTE2N0ZcXHUxNjgxLVxcdTE2OUFcXHUxNkEwLVxcdTE2RUFcXHUxNkVFLVxcdTE2RjhcXHUxNzAwLVxcdTE3MENcXHUxNzBFLVxcdTE3MTFcXHUxNzIwLVxcdTE3MzFcXHUxNzQwLVxcdTE3NTFcXHUxNzYwLVxcdTE3NkNcXHUxNzZFLVxcdTE3NzBcXHUxNzgwLVxcdTE3QjNcXHUxN0Q3XFx1MTdEQ1xcdTE4MjAtXFx1MTg3N1xcdTE4ODAtXFx1MThBOFxcdTE4QUFcXHUxOEIwLVxcdTE4RjVcXHUxOTAwLVxcdTE5MUVcXHUxOTUwLVxcdTE5NkRcXHUxOTcwLVxcdTE5NzRcXHUxOTgwLVxcdTE5QUJcXHUxOUIwLVxcdTE5QzlcXHUxQTAwLVxcdTFBMTZcXHUxQTIwLVxcdTFBNTRcXHUxQUE3XFx1MUIwNS1cXHUxQjMzXFx1MUI0NS1cXHUxQjRCXFx1MUI4My1cXHUxQkEwXFx1MUJBRVxcdTFCQUZcXHUxQkJBLVxcdTFCRTVcXHUxQzAwLVxcdTFDMjNcXHUxQzRELVxcdTFDNEZcXHUxQzVBLVxcdTFDN0RcXHUxQzgwLVxcdTFDODhcXHUxQ0U5LVxcdTFDRUNcXHUxQ0VFLVxcdTFDRjFcXHUxQ0Y1XFx1MUNGNlxcdTFEMDAtXFx1MURCRlxcdTFFMDAtXFx1MUYxNVxcdTFGMTgtXFx1MUYxRFxcdTFGMjAtXFx1MUY0NVxcdTFGNDgtXFx1MUY0RFxcdTFGNTAtXFx1MUY1N1xcdTFGNTlcXHUxRjVCXFx1MUY1RFxcdTFGNUYtXFx1MUY3RFxcdTFGODAtXFx1MUZCNFxcdTFGQjYtXFx1MUZCQ1xcdTFGQkVcXHUxRkMyLVxcdTFGQzRcXHUxRkM2LVxcdTFGQ0NcXHUxRkQwLVxcdTFGRDNcXHUxRkQ2LVxcdTFGREJcXHUxRkUwLVxcdTFGRUNcXHUxRkYyLVxcdTFGRjRcXHUxRkY2LVxcdTFGRkNcXHUyMDcxXFx1MjA3RlxcdTIwOTAtXFx1MjA5Q1xcdTIxMDJcXHUyMTA3XFx1MjEwQS1cXHUyMTEzXFx1MjExNVxcdTIxMTgtXFx1MjExRFxcdTIxMjRcXHUyMTI2XFx1MjEyOFxcdTIxMkEtXFx1MjEzOVxcdTIxM0MtXFx1MjEzRlxcdTIxNDUtXFx1MjE0OVxcdTIxNEVcXHUyMTYwLVxcdTIxODhcXHUyQzAwLVxcdTJDMkVcXHUyQzMwLVxcdTJDNUVcXHUyQzYwLVxcdTJDRTRcXHUyQ0VCLVxcdTJDRUVcXHUyQ0YyXFx1MkNGM1xcdTJEMDAtXFx1MkQyNVxcdTJEMjdcXHUyRDJEXFx1MkQzMC1cXHUyRDY3XFx1MkQ2RlxcdTJEODAtXFx1MkQ5NlxcdTJEQTAtXFx1MkRBNlxcdTJEQTgtXFx1MkRBRVxcdTJEQjAtXFx1MkRCNlxcdTJEQjgtXFx1MkRCRVxcdTJEQzAtXFx1MkRDNlxcdTJEQzgtXFx1MkRDRVxcdTJERDAtXFx1MkRENlxcdTJERDgtXFx1MkRERVxcdTMwMDUtXFx1MzAwN1xcdTMwMjEtXFx1MzAyOVxcdTMwMzEtXFx1MzAzNVxcdTMwMzgtXFx1MzAzQ1xcdTMwNDEtXFx1MzA5NlxcdTMwOUItXFx1MzA5RlxcdTMwQTEtXFx1MzBGQVxcdTMwRkMtXFx1MzBGRlxcdTMxMDUtXFx1MzEyRFxcdTMxMzEtXFx1MzE4RVxcdTMxQTAtXFx1MzFCQVxcdTMxRjAtXFx1MzFGRlxcdTM0MDAtXFx1NERCNVxcdTRFMDAtXFx1OUZENVxcdUEwMDAtXFx1QTQ4Q1xcdUE0RDAtXFx1QTRGRFxcdUE1MDAtXFx1QTYwQ1xcdUE2MTAtXFx1QTYxRlxcdUE2MkFcXHVBNjJCXFx1QTY0MC1cXHVBNjZFXFx1QTY3Ri1cXHVBNjlEXFx1QTZBMC1cXHVBNkVGXFx1QTcxNy1cXHVBNzFGXFx1QTcyMi1cXHVBNzg4XFx1QTc4Qi1cXHVBN0FFXFx1QTdCMC1cXHVBN0I3XFx1QTdGNy1cXHVBODAxXFx1QTgwMy1cXHVBODA1XFx1QTgwNy1cXHVBODBBXFx1QTgwQy1cXHVBODIyXFx1QTg0MC1cXHVBODczXFx1QTg4Mi1cXHVBOEIzXFx1QThGMi1cXHVBOEY3XFx1QThGQlxcdUE4RkRcXHVBOTBBLVxcdUE5MjVcXHVBOTMwLVxcdUE5NDZcXHVBOTYwLVxcdUE5N0NcXHVBOTg0LVxcdUE5QjJcXHVBOUNGXFx1QTlFMC1cXHVBOUU0XFx1QTlFNi1cXHVBOUVGXFx1QTlGQS1cXHVBOUZFXFx1QUEwMC1cXHVBQTI4XFx1QUE0MC1cXHVBQTQyXFx1QUE0NC1cXHVBQTRCXFx1QUE2MC1cXHVBQTc2XFx1QUE3QVxcdUFBN0UtXFx1QUFBRlxcdUFBQjFcXHVBQUI1XFx1QUFCNlxcdUFBQjktXFx1QUFCRFxcdUFBQzBcXHVBQUMyXFx1QUFEQi1cXHVBQUREXFx1QUFFMC1cXHVBQUVBXFx1QUFGMi1cXHVBQUY0XFx1QUIwMS1cXHVBQjA2XFx1QUIwOS1cXHVBQjBFXFx1QUIxMS1cXHVBQjE2XFx1QUIyMC1cXHVBQjI2XFx1QUIyOC1cXHVBQjJFXFx1QUIzMC1cXHVBQjVBXFx1QUI1Qy1cXHVBQjY1XFx1QUI3MC1cXHVBQkUyXFx1QUMwMC1cXHVEN0EzXFx1RDdCMC1cXHVEN0M2XFx1RDdDQi1cXHVEN0ZCXFx1RjkwMC1cXHVGQTZEXFx1RkE3MC1cXHVGQUQ5XFx1RkIwMC1cXHVGQjA2XFx1RkIxMy1cXHVGQjE3XFx1RkIxRFxcdUZCMUYtXFx1RkIyOFxcdUZCMkEtXFx1RkIzNlxcdUZCMzgtXFx1RkIzQ1xcdUZCM0VcXHVGQjQwXFx1RkI0MVxcdUZCNDNcXHVGQjQ0XFx1RkI0Ni1cXHVGQkIxXFx1RkJEMy1cXHVGRDNEXFx1RkQ1MC1cXHVGRDhGXFx1RkQ5Mi1cXHVGREM3XFx1RkRGMC1cXHVGREZCXFx1RkU3MC1cXHVGRTc0XFx1RkU3Ni1cXHVGRUZDXFx1RkYyMS1cXHVGRjNBXFx1RkY0MS1cXHVGRjVBXFx1RkY2Ni1cXHVGRkJFXFx1RkZDMi1cXHVGRkM3XFx1RkZDQS1cXHVGRkNGXFx1RkZEMi1cXHVGRkQ3XFx1RkZEQS1cXHVGRkRDXXxcXHVEODAwW1xcdURDMDAtXFx1REMwQlxcdURDMEQtXFx1REMyNlxcdURDMjgtXFx1REMzQVxcdURDM0NcXHVEQzNEXFx1REMzRi1cXHVEQzREXFx1REM1MC1cXHVEQzVEXFx1REM4MC1cXHVEQ0ZBXFx1REQ0MC1cXHVERDc0XFx1REU4MC1cXHVERTlDXFx1REVBMC1cXHVERUQwXFx1REYwMC1cXHVERjFGXFx1REYzMC1cXHVERjRBXFx1REY1MC1cXHVERjc1XFx1REY4MC1cXHVERjlEXFx1REZBMC1cXHVERkMzXFx1REZDOC1cXHVERkNGXFx1REZEMS1cXHVERkQ1XXxcXHVEODAxW1xcdURDMDAtXFx1REM5RFxcdURDQjAtXFx1RENEM1xcdURDRDgtXFx1RENGQlxcdUREMDAtXFx1REQyN1xcdUREMzAtXFx1REQ2M1xcdURFMDAtXFx1REYzNlxcdURGNDAtXFx1REY1NVxcdURGNjAtXFx1REY2N118XFx1RDgwMltcXHVEQzAwLVxcdURDMDVcXHVEQzA4XFx1REMwQS1cXHVEQzM1XFx1REMzN1xcdURDMzhcXHVEQzNDXFx1REMzRi1cXHVEQzU1XFx1REM2MC1cXHVEQzc2XFx1REM4MC1cXHVEQzlFXFx1RENFMC1cXHVEQ0YyXFx1RENGNFxcdURDRjVcXHVERDAwLVxcdUREMTVcXHVERDIwLVxcdUREMzlcXHVERDgwLVxcdUREQjdcXHVEREJFXFx1RERCRlxcdURFMDBcXHVERTEwLVxcdURFMTNcXHVERTE1LVxcdURFMTdcXHVERTE5LVxcdURFMzNcXHVERTYwLVxcdURFN0NcXHVERTgwLVxcdURFOUNcXHVERUMwLVxcdURFQzdcXHVERUM5LVxcdURFRTRcXHVERjAwLVxcdURGMzVcXHVERjQwLVxcdURGNTVcXHVERjYwLVxcdURGNzJcXHVERjgwLVxcdURGOTFdfFxcdUQ4MDNbXFx1REMwMC1cXHVEQzQ4XFx1REM4MC1cXHVEQ0IyXFx1RENDMC1cXHVEQ0YyXXxcXHVEODA0W1xcdURDMDMtXFx1REMzN1xcdURDODMtXFx1RENBRlxcdURDRDAtXFx1RENFOFxcdUREMDMtXFx1REQyNlxcdURENTAtXFx1REQ3MlxcdURENzZcXHVERDgzLVxcdUREQjJcXHVEREMxLVxcdUREQzRcXHVERERBXFx1REREQ1xcdURFMDAtXFx1REUxMVxcdURFMTMtXFx1REUyQlxcdURFODAtXFx1REU4NlxcdURFODhcXHVERThBLVxcdURFOERcXHVERThGLVxcdURFOURcXHVERTlGLVxcdURFQThcXHVERUIwLVxcdURFREVcXHVERjA1LVxcdURGMENcXHVERjBGXFx1REYxMFxcdURGMTMtXFx1REYyOFxcdURGMkEtXFx1REYzMFxcdURGMzJcXHVERjMzXFx1REYzNS1cXHVERjM5XFx1REYzRFxcdURGNTBcXHVERjVELVxcdURGNjFdfFxcdUQ4MDVbXFx1REMwMC1cXHVEQzM0XFx1REM0Ny1cXHVEQzRBXFx1REM4MC1cXHVEQ0FGXFx1RENDNFxcdURDQzVcXHVEQ0M3XFx1REQ4MC1cXHVEREFFXFx1REREOC1cXHVERERCXFx1REUwMC1cXHVERTJGXFx1REU0NFxcdURFODAtXFx1REVBQVxcdURGMDAtXFx1REYxOV18XFx1RDgwNltcXHVEQ0EwLVxcdURDREZcXHVEQ0ZGXFx1REVDMC1cXHVERUY4XXxcXHVEODA3W1xcdURDMDAtXFx1REMwOFxcdURDMEEtXFx1REMyRVxcdURDNDBcXHVEQzcyLVxcdURDOEZdfFxcdUQ4MDhbXFx1REMwMC1cXHVERjk5XXxcXHVEODA5W1xcdURDMDAtXFx1REM2RVxcdURDODAtXFx1REQ0M118W1xcdUQ4MENcXHVEODFDLVxcdUQ4MjBcXHVEODQwLVxcdUQ4NjhcXHVEODZBLVxcdUQ4NkNcXHVEODZGLVxcdUQ4NzJdW1xcdURDMDAtXFx1REZGRl18XFx1RDgwRFtcXHVEQzAwLVxcdURDMkVdfFxcdUQ4MTFbXFx1REMwMC1cXHVERTQ2XXxcXHVEODFBW1xcdURDMDAtXFx1REUzOFxcdURFNDAtXFx1REU1RVxcdURFRDAtXFx1REVFRFxcdURGMDAtXFx1REYyRlxcdURGNDAtXFx1REY0M1xcdURGNjMtXFx1REY3N1xcdURGN0QtXFx1REY4Rl18XFx1RDgxQltcXHVERjAwLVxcdURGNDRcXHVERjUwXFx1REY5My1cXHVERjlGXFx1REZFMF18XFx1RDgyMVtcXHVEQzAwLVxcdURGRUNdfFxcdUQ4MjJbXFx1REMwMC1cXHVERUYyXXxcXHVEODJDW1xcdURDMDBcXHVEQzAxXXxcXHVEODJGW1xcdURDMDAtXFx1REM2QVxcdURDNzAtXFx1REM3Q1xcdURDODAtXFx1REM4OFxcdURDOTAtXFx1REM5OV18XFx1RDgzNVtcXHVEQzAwLVxcdURDNTRcXHVEQzU2LVxcdURDOUNcXHVEQzlFXFx1REM5RlxcdURDQTJcXHVEQ0E1XFx1RENBNlxcdURDQTktXFx1RENBQ1xcdURDQUUtXFx1RENCOVxcdURDQkJcXHVEQ0JELVxcdURDQzNcXHVEQ0M1LVxcdUREMDVcXHVERDA3LVxcdUREMEFcXHVERDBELVxcdUREMTRcXHVERDE2LVxcdUREMUNcXHVERDFFLVxcdUREMzlcXHVERDNCLVxcdUREM0VcXHVERDQwLVxcdURENDRcXHVERDQ2XFx1REQ0QS1cXHVERDUwXFx1REQ1Mi1cXHVERUE1XFx1REVBOC1cXHVERUMwXFx1REVDMi1cXHVERURBXFx1REVEQy1cXHVERUZBXFx1REVGQy1cXHVERjE0XFx1REYxNi1cXHVERjM0XFx1REYzNi1cXHVERjRFXFx1REY1MC1cXHVERjZFXFx1REY3MC1cXHVERjg4XFx1REY4QS1cXHVERkE4XFx1REZBQS1cXHVERkMyXFx1REZDNC1cXHVERkNCXXxcXHVEODNBW1xcdURDMDAtXFx1RENDNFxcdUREMDAtXFx1REQ0M118XFx1RDgzQltcXHVERTAwLVxcdURFMDNcXHVERTA1LVxcdURFMUZcXHVERTIxXFx1REUyMlxcdURFMjRcXHVERTI3XFx1REUyOS1cXHVERTMyXFx1REUzNC1cXHVERTM3XFx1REUzOVxcdURFM0JcXHVERTQyXFx1REU0N1xcdURFNDlcXHVERTRCXFx1REU0RC1cXHVERTRGXFx1REU1MVxcdURFNTJcXHVERTU0XFx1REU1N1xcdURFNTlcXHVERTVCXFx1REU1RFxcdURFNUZcXHVERTYxXFx1REU2MlxcdURFNjRcXHVERTY3LVxcdURFNkFcXHVERTZDLVxcdURFNzJcXHVERTc0LVxcdURFNzdcXHVERTc5LVxcdURFN0NcXHVERTdFXFx1REU4MC1cXHVERTg5XFx1REU4Qi1cXHVERTlCXFx1REVBMS1cXHVERUEzXFx1REVBNS1cXHVERUE5XFx1REVBQi1cXHVERUJCXXxcXHVEODY5W1xcdURDMDAtXFx1REVENlxcdURGMDAtXFx1REZGRl18XFx1RDg2RFtcXHVEQzAwLVxcdURGMzRcXHVERjQwLVxcdURGRkZdfFxcdUQ4NkVbXFx1REMwMC1cXHVEQzFEXFx1REMyMC1cXHVERkZGXXxcXHVEODczW1xcdURDMDAtXFx1REVBMV18XFx1RDg3RVtcXHVEQzAwLVxcdURFMURdLyxcbiAgICAgICAgLy8gRUNNQVNjcmlwdCA2L1VuaWNvZGUgdjkuMC4wIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6XG4gICAgICAgIE5vbkFzY2lpSWRlbnRpZmllclBhcnQ6IC9bXFx4QUFcXHhCNVxceEI3XFx4QkFcXHhDMC1cXHhENlxceEQ4LVxceEY2XFx4RjgtXFx1MDJDMVxcdTAyQzYtXFx1MDJEMVxcdTAyRTAtXFx1MDJFNFxcdTAyRUNcXHUwMkVFXFx1MDMwMC1cXHUwMzc0XFx1MDM3NlxcdTAzNzdcXHUwMzdBLVxcdTAzN0RcXHUwMzdGXFx1MDM4Ni1cXHUwMzhBXFx1MDM4Q1xcdTAzOEUtXFx1MDNBMVxcdTAzQTMtXFx1MDNGNVxcdTAzRjctXFx1MDQ4MVxcdTA0ODMtXFx1MDQ4N1xcdTA0OEEtXFx1MDUyRlxcdTA1MzEtXFx1MDU1NlxcdTA1NTlcXHUwNTYxLVxcdTA1ODdcXHUwNTkxLVxcdTA1QkRcXHUwNUJGXFx1MDVDMVxcdTA1QzJcXHUwNUM0XFx1MDVDNVxcdTA1QzdcXHUwNUQwLVxcdTA1RUFcXHUwNUYwLVxcdTA1RjJcXHUwNjEwLVxcdTA2MUFcXHUwNjIwLVxcdTA2NjlcXHUwNjZFLVxcdTA2RDNcXHUwNkQ1LVxcdTA2RENcXHUwNkRGLVxcdTA2RThcXHUwNkVBLVxcdTA2RkNcXHUwNkZGXFx1MDcxMC1cXHUwNzRBXFx1MDc0RC1cXHUwN0IxXFx1MDdDMC1cXHUwN0Y1XFx1MDdGQVxcdTA4MDAtXFx1MDgyRFxcdTA4NDAtXFx1MDg1QlxcdTA4QTAtXFx1MDhCNFxcdTA4QjYtXFx1MDhCRFxcdTA4RDQtXFx1MDhFMVxcdTA4RTMtXFx1MDk2M1xcdTA5NjYtXFx1MDk2RlxcdTA5NzEtXFx1MDk4M1xcdTA5ODUtXFx1MDk4Q1xcdTA5OEZcXHUwOTkwXFx1MDk5My1cXHUwOUE4XFx1MDlBQS1cXHUwOUIwXFx1MDlCMlxcdTA5QjYtXFx1MDlCOVxcdTA5QkMtXFx1MDlDNFxcdTA5QzdcXHUwOUM4XFx1MDlDQi1cXHUwOUNFXFx1MDlEN1xcdTA5RENcXHUwOUREXFx1MDlERi1cXHUwOUUzXFx1MDlFNi1cXHUwOUYxXFx1MEEwMS1cXHUwQTAzXFx1MEEwNS1cXHUwQTBBXFx1MEEwRlxcdTBBMTBcXHUwQTEzLVxcdTBBMjhcXHUwQTJBLVxcdTBBMzBcXHUwQTMyXFx1MEEzM1xcdTBBMzVcXHUwQTM2XFx1MEEzOFxcdTBBMzlcXHUwQTNDXFx1MEEzRS1cXHUwQTQyXFx1MEE0N1xcdTBBNDhcXHUwQTRCLVxcdTBBNERcXHUwQTUxXFx1MEE1OS1cXHUwQTVDXFx1MEE1RVxcdTBBNjYtXFx1MEE3NVxcdTBBODEtXFx1MEE4M1xcdTBBODUtXFx1MEE4RFxcdTBBOEYtXFx1MEE5MVxcdTBBOTMtXFx1MEFBOFxcdTBBQUEtXFx1MEFCMFxcdTBBQjJcXHUwQUIzXFx1MEFCNS1cXHUwQUI5XFx1MEFCQy1cXHUwQUM1XFx1MEFDNy1cXHUwQUM5XFx1MEFDQi1cXHUwQUNEXFx1MEFEMFxcdTBBRTAtXFx1MEFFM1xcdTBBRTYtXFx1MEFFRlxcdTBBRjlcXHUwQjAxLVxcdTBCMDNcXHUwQjA1LVxcdTBCMENcXHUwQjBGXFx1MEIxMFxcdTBCMTMtXFx1MEIyOFxcdTBCMkEtXFx1MEIzMFxcdTBCMzJcXHUwQjMzXFx1MEIzNS1cXHUwQjM5XFx1MEIzQy1cXHUwQjQ0XFx1MEI0N1xcdTBCNDhcXHUwQjRCLVxcdTBCNERcXHUwQjU2XFx1MEI1N1xcdTBCNUNcXHUwQjVEXFx1MEI1Ri1cXHUwQjYzXFx1MEI2Ni1cXHUwQjZGXFx1MEI3MVxcdTBCODJcXHUwQjgzXFx1MEI4NS1cXHUwQjhBXFx1MEI4RS1cXHUwQjkwXFx1MEI5Mi1cXHUwQjk1XFx1MEI5OVxcdTBCOUFcXHUwQjlDXFx1MEI5RVxcdTBCOUZcXHUwQkEzXFx1MEJBNFxcdTBCQTgtXFx1MEJBQVxcdTBCQUUtXFx1MEJCOVxcdTBCQkUtXFx1MEJDMlxcdTBCQzYtXFx1MEJDOFxcdTBCQ0EtXFx1MEJDRFxcdTBCRDBcXHUwQkQ3XFx1MEJFNi1cXHUwQkVGXFx1MEMwMC1cXHUwQzAzXFx1MEMwNS1cXHUwQzBDXFx1MEMwRS1cXHUwQzEwXFx1MEMxMi1cXHUwQzI4XFx1MEMyQS1cXHUwQzM5XFx1MEMzRC1cXHUwQzQ0XFx1MEM0Ni1cXHUwQzQ4XFx1MEM0QS1cXHUwQzREXFx1MEM1NVxcdTBDNTZcXHUwQzU4LVxcdTBDNUFcXHUwQzYwLVxcdTBDNjNcXHUwQzY2LVxcdTBDNkZcXHUwQzgwLVxcdTBDODNcXHUwQzg1LVxcdTBDOENcXHUwQzhFLVxcdTBDOTBcXHUwQzkyLVxcdTBDQThcXHUwQ0FBLVxcdTBDQjNcXHUwQ0I1LVxcdTBDQjlcXHUwQ0JDLVxcdTBDQzRcXHUwQ0M2LVxcdTBDQzhcXHUwQ0NBLVxcdTBDQ0RcXHUwQ0Q1XFx1MENENlxcdTBDREVcXHUwQ0UwLVxcdTBDRTNcXHUwQ0U2LVxcdTBDRUZcXHUwQ0YxXFx1MENGMlxcdTBEMDEtXFx1MEQwM1xcdTBEMDUtXFx1MEQwQ1xcdTBEMEUtXFx1MEQxMFxcdTBEMTItXFx1MEQzQVxcdTBEM0QtXFx1MEQ0NFxcdTBENDYtXFx1MEQ0OFxcdTBENEEtXFx1MEQ0RVxcdTBENTQtXFx1MEQ1N1xcdTBENUYtXFx1MEQ2M1xcdTBENjYtXFx1MEQ2RlxcdTBEN0EtXFx1MEQ3RlxcdTBEODJcXHUwRDgzXFx1MEQ4NS1cXHUwRDk2XFx1MEQ5QS1cXHUwREIxXFx1MERCMy1cXHUwREJCXFx1MERCRFxcdTBEQzAtXFx1MERDNlxcdTBEQ0FcXHUwRENGLVxcdTBERDRcXHUwREQ2XFx1MEREOC1cXHUwRERGXFx1MERFNi1cXHUwREVGXFx1MERGMlxcdTBERjNcXHUwRTAxLVxcdTBFM0FcXHUwRTQwLVxcdTBFNEVcXHUwRTUwLVxcdTBFNTlcXHUwRTgxXFx1MEU4MlxcdTBFODRcXHUwRTg3XFx1MEU4OFxcdTBFOEFcXHUwRThEXFx1MEU5NC1cXHUwRTk3XFx1MEU5OS1cXHUwRTlGXFx1MEVBMS1cXHUwRUEzXFx1MEVBNVxcdTBFQTdcXHUwRUFBXFx1MEVBQlxcdTBFQUQtXFx1MEVCOVxcdTBFQkItXFx1MEVCRFxcdTBFQzAtXFx1MEVDNFxcdTBFQzZcXHUwRUM4LVxcdTBFQ0RcXHUwRUQwLVxcdTBFRDlcXHUwRURDLVxcdTBFREZcXHUwRjAwXFx1MEYxOFxcdTBGMTlcXHUwRjIwLVxcdTBGMjlcXHUwRjM1XFx1MEYzN1xcdTBGMzlcXHUwRjNFLVxcdTBGNDdcXHUwRjQ5LVxcdTBGNkNcXHUwRjcxLVxcdTBGODRcXHUwRjg2LVxcdTBGOTdcXHUwRjk5LVxcdTBGQkNcXHUwRkM2XFx1MTAwMC1cXHUxMDQ5XFx1MTA1MC1cXHUxMDlEXFx1MTBBMC1cXHUxMEM1XFx1MTBDN1xcdTEwQ0RcXHUxMEQwLVxcdTEwRkFcXHUxMEZDLVxcdTEyNDhcXHUxMjRBLVxcdTEyNERcXHUxMjUwLVxcdTEyNTZcXHUxMjU4XFx1MTI1QS1cXHUxMjVEXFx1MTI2MC1cXHUxMjg4XFx1MTI4QS1cXHUxMjhEXFx1MTI5MC1cXHUxMkIwXFx1MTJCMi1cXHUxMkI1XFx1MTJCOC1cXHUxMkJFXFx1MTJDMFxcdTEyQzItXFx1MTJDNVxcdTEyQzgtXFx1MTJENlxcdTEyRDgtXFx1MTMxMFxcdTEzMTItXFx1MTMxNVxcdTEzMTgtXFx1MTM1QVxcdTEzNUQtXFx1MTM1RlxcdTEzNjktXFx1MTM3MVxcdTEzODAtXFx1MTM4RlxcdTEzQTAtXFx1MTNGNVxcdTEzRjgtXFx1MTNGRFxcdTE0MDEtXFx1MTY2Q1xcdTE2NkYtXFx1MTY3RlxcdTE2ODEtXFx1MTY5QVxcdTE2QTAtXFx1MTZFQVxcdTE2RUUtXFx1MTZGOFxcdTE3MDAtXFx1MTcwQ1xcdTE3MEUtXFx1MTcxNFxcdTE3MjAtXFx1MTczNFxcdTE3NDAtXFx1MTc1M1xcdTE3NjAtXFx1MTc2Q1xcdTE3NkUtXFx1MTc3MFxcdTE3NzJcXHUxNzczXFx1MTc4MC1cXHUxN0QzXFx1MTdEN1xcdTE3RENcXHUxN0REXFx1MTdFMC1cXHUxN0U5XFx1MTgwQi1cXHUxODBEXFx1MTgxMC1cXHUxODE5XFx1MTgyMC1cXHUxODc3XFx1MTg4MC1cXHUxOEFBXFx1MThCMC1cXHUxOEY1XFx1MTkwMC1cXHUxOTFFXFx1MTkyMC1cXHUxOTJCXFx1MTkzMC1cXHUxOTNCXFx1MTk0Ni1cXHUxOTZEXFx1MTk3MC1cXHUxOTc0XFx1MTk4MC1cXHUxOUFCXFx1MTlCMC1cXHUxOUM5XFx1MTlEMC1cXHUxOURBXFx1MUEwMC1cXHUxQTFCXFx1MUEyMC1cXHUxQTVFXFx1MUE2MC1cXHUxQTdDXFx1MUE3Ri1cXHUxQTg5XFx1MUE5MC1cXHUxQTk5XFx1MUFBN1xcdTFBQjAtXFx1MUFCRFxcdTFCMDAtXFx1MUI0QlxcdTFCNTAtXFx1MUI1OVxcdTFCNkItXFx1MUI3M1xcdTFCODAtXFx1MUJGM1xcdTFDMDAtXFx1MUMzN1xcdTFDNDAtXFx1MUM0OVxcdTFDNEQtXFx1MUM3RFxcdTFDODAtXFx1MUM4OFxcdTFDRDAtXFx1MUNEMlxcdTFDRDQtXFx1MUNGNlxcdTFDRjhcXHUxQ0Y5XFx1MUQwMC1cXHUxREY1XFx1MURGQi1cXHUxRjE1XFx1MUYxOC1cXHUxRjFEXFx1MUYyMC1cXHUxRjQ1XFx1MUY0OC1cXHUxRjREXFx1MUY1MC1cXHUxRjU3XFx1MUY1OVxcdTFGNUJcXHUxRjVEXFx1MUY1Ri1cXHUxRjdEXFx1MUY4MC1cXHUxRkI0XFx1MUZCNi1cXHUxRkJDXFx1MUZCRVxcdTFGQzItXFx1MUZDNFxcdTFGQzYtXFx1MUZDQ1xcdTFGRDAtXFx1MUZEM1xcdTFGRDYtXFx1MUZEQlxcdTFGRTAtXFx1MUZFQ1xcdTFGRjItXFx1MUZGNFxcdTFGRjYtXFx1MUZGQ1xcdTIwMENcXHUyMDBEXFx1MjAzRlxcdTIwNDBcXHUyMDU0XFx1MjA3MVxcdTIwN0ZcXHUyMDkwLVxcdTIwOUNcXHUyMEQwLVxcdTIwRENcXHUyMEUxXFx1MjBFNS1cXHUyMEYwXFx1MjEwMlxcdTIxMDdcXHUyMTBBLVxcdTIxMTNcXHUyMTE1XFx1MjExOC1cXHUyMTFEXFx1MjEyNFxcdTIxMjZcXHUyMTI4XFx1MjEyQS1cXHUyMTM5XFx1MjEzQy1cXHUyMTNGXFx1MjE0NS1cXHUyMTQ5XFx1MjE0RVxcdTIxNjAtXFx1MjE4OFxcdTJDMDAtXFx1MkMyRVxcdTJDMzAtXFx1MkM1RVxcdTJDNjAtXFx1MkNFNFxcdTJDRUItXFx1MkNGM1xcdTJEMDAtXFx1MkQyNVxcdTJEMjdcXHUyRDJEXFx1MkQzMC1cXHUyRDY3XFx1MkQ2RlxcdTJEN0YtXFx1MkQ5NlxcdTJEQTAtXFx1MkRBNlxcdTJEQTgtXFx1MkRBRVxcdTJEQjAtXFx1MkRCNlxcdTJEQjgtXFx1MkRCRVxcdTJEQzAtXFx1MkRDNlxcdTJEQzgtXFx1MkRDRVxcdTJERDAtXFx1MkRENlxcdTJERDgtXFx1MkRERVxcdTJERTAtXFx1MkRGRlxcdTMwMDUtXFx1MzAwN1xcdTMwMjEtXFx1MzAyRlxcdTMwMzEtXFx1MzAzNVxcdTMwMzgtXFx1MzAzQ1xcdTMwNDEtXFx1MzA5NlxcdTMwOTktXFx1MzA5RlxcdTMwQTEtXFx1MzBGQVxcdTMwRkMtXFx1MzBGRlxcdTMxMDUtXFx1MzEyRFxcdTMxMzEtXFx1MzE4RVxcdTMxQTAtXFx1MzFCQVxcdTMxRjAtXFx1MzFGRlxcdTM0MDAtXFx1NERCNVxcdTRFMDAtXFx1OUZENVxcdUEwMDAtXFx1QTQ4Q1xcdUE0RDAtXFx1QTRGRFxcdUE1MDAtXFx1QTYwQ1xcdUE2MTAtXFx1QTYyQlxcdUE2NDAtXFx1QTY2RlxcdUE2NzQtXFx1QTY3RFxcdUE2N0YtXFx1QTZGMVxcdUE3MTctXFx1QTcxRlxcdUE3MjItXFx1QTc4OFxcdUE3OEItXFx1QTdBRVxcdUE3QjAtXFx1QTdCN1xcdUE3RjctXFx1QTgyN1xcdUE4NDAtXFx1QTg3M1xcdUE4ODAtXFx1QThDNVxcdUE4RDAtXFx1QThEOVxcdUE4RTAtXFx1QThGN1xcdUE4RkJcXHVBOEZEXFx1QTkwMC1cXHVBOTJEXFx1QTkzMC1cXHVBOTUzXFx1QTk2MC1cXHVBOTdDXFx1QTk4MC1cXHVBOUMwXFx1QTlDRi1cXHVBOUQ5XFx1QTlFMC1cXHVBOUZFXFx1QUEwMC1cXHVBQTM2XFx1QUE0MC1cXHVBQTREXFx1QUE1MC1cXHVBQTU5XFx1QUE2MC1cXHVBQTc2XFx1QUE3QS1cXHVBQUMyXFx1QUFEQi1cXHVBQUREXFx1QUFFMC1cXHVBQUVGXFx1QUFGMi1cXHVBQUY2XFx1QUIwMS1cXHVBQjA2XFx1QUIwOS1cXHVBQjBFXFx1QUIxMS1cXHVBQjE2XFx1QUIyMC1cXHVBQjI2XFx1QUIyOC1cXHVBQjJFXFx1QUIzMC1cXHVBQjVBXFx1QUI1Qy1cXHVBQjY1XFx1QUI3MC1cXHVBQkVBXFx1QUJFQ1xcdUFCRURcXHVBQkYwLVxcdUFCRjlcXHVBQzAwLVxcdUQ3QTNcXHVEN0IwLVxcdUQ3QzZcXHVEN0NCLVxcdUQ3RkJcXHVGOTAwLVxcdUZBNkRcXHVGQTcwLVxcdUZBRDlcXHVGQjAwLVxcdUZCMDZcXHVGQjEzLVxcdUZCMTdcXHVGQjFELVxcdUZCMjhcXHVGQjJBLVxcdUZCMzZcXHVGQjM4LVxcdUZCM0NcXHVGQjNFXFx1RkI0MFxcdUZCNDFcXHVGQjQzXFx1RkI0NFxcdUZCNDYtXFx1RkJCMVxcdUZCRDMtXFx1RkQzRFxcdUZENTAtXFx1RkQ4RlxcdUZEOTItXFx1RkRDN1xcdUZERjAtXFx1RkRGQlxcdUZFMDAtXFx1RkUwRlxcdUZFMjAtXFx1RkUyRlxcdUZFMzNcXHVGRTM0XFx1RkU0RC1cXHVGRTRGXFx1RkU3MC1cXHVGRTc0XFx1RkU3Ni1cXHVGRUZDXFx1RkYxMC1cXHVGRjE5XFx1RkYyMS1cXHVGRjNBXFx1RkYzRlxcdUZGNDEtXFx1RkY1QVxcdUZGNjYtXFx1RkZCRVxcdUZGQzItXFx1RkZDN1xcdUZGQ0EtXFx1RkZDRlxcdUZGRDItXFx1RkZEN1xcdUZGREEtXFx1RkZEQ118XFx1RDgwMFtcXHVEQzAwLVxcdURDMEJcXHVEQzBELVxcdURDMjZcXHVEQzI4LVxcdURDM0FcXHVEQzNDXFx1REMzRFxcdURDM0YtXFx1REM0RFxcdURDNTAtXFx1REM1RFxcdURDODAtXFx1RENGQVxcdURENDAtXFx1REQ3NFxcdURERkRcXHVERTgwLVxcdURFOUNcXHVERUEwLVxcdURFRDBcXHVERUUwXFx1REYwMC1cXHVERjFGXFx1REYzMC1cXHVERjRBXFx1REY1MC1cXHVERjdBXFx1REY4MC1cXHVERjlEXFx1REZBMC1cXHVERkMzXFx1REZDOC1cXHVERkNGXFx1REZEMS1cXHVERkQ1XXxcXHVEODAxW1xcdURDMDAtXFx1REM5RFxcdURDQTAtXFx1RENBOVxcdURDQjAtXFx1RENEM1xcdURDRDgtXFx1RENGQlxcdUREMDAtXFx1REQyN1xcdUREMzAtXFx1REQ2M1xcdURFMDAtXFx1REYzNlxcdURGNDAtXFx1REY1NVxcdURGNjAtXFx1REY2N118XFx1RDgwMltcXHVEQzAwLVxcdURDMDVcXHVEQzA4XFx1REMwQS1cXHVEQzM1XFx1REMzN1xcdURDMzhcXHVEQzNDXFx1REMzRi1cXHVEQzU1XFx1REM2MC1cXHVEQzc2XFx1REM4MC1cXHVEQzlFXFx1RENFMC1cXHVEQ0YyXFx1RENGNFxcdURDRjVcXHVERDAwLVxcdUREMTVcXHVERDIwLVxcdUREMzlcXHVERDgwLVxcdUREQjdcXHVEREJFXFx1RERCRlxcdURFMDAtXFx1REUwM1xcdURFMDVcXHVERTA2XFx1REUwQy1cXHVERTEzXFx1REUxNS1cXHVERTE3XFx1REUxOS1cXHVERTMzXFx1REUzOC1cXHVERTNBXFx1REUzRlxcdURFNjAtXFx1REU3Q1xcdURFODAtXFx1REU5Q1xcdURFQzAtXFx1REVDN1xcdURFQzktXFx1REVFNlxcdURGMDAtXFx1REYzNVxcdURGNDAtXFx1REY1NVxcdURGNjAtXFx1REY3MlxcdURGODAtXFx1REY5MV18XFx1RDgwM1tcXHVEQzAwLVxcdURDNDhcXHVEQzgwLVxcdURDQjJcXHVEQ0MwLVxcdURDRjJdfFxcdUQ4MDRbXFx1REMwMC1cXHVEQzQ2XFx1REM2Ni1cXHVEQzZGXFx1REM3Ri1cXHVEQ0JBXFx1RENEMC1cXHVEQ0U4XFx1RENGMC1cXHVEQ0Y5XFx1REQwMC1cXHVERDM0XFx1REQzNi1cXHVERDNGXFx1REQ1MC1cXHVERDczXFx1REQ3NlxcdUREODAtXFx1RERDNFxcdUREQ0EtXFx1RERDQ1xcdURERDAtXFx1REREQVxcdURERENcXHVERTAwLVxcdURFMTFcXHVERTEzLVxcdURFMzdcXHVERTNFXFx1REU4MC1cXHVERTg2XFx1REU4OFxcdURFOEEtXFx1REU4RFxcdURFOEYtXFx1REU5RFxcdURFOUYtXFx1REVBOFxcdURFQjAtXFx1REVFQVxcdURFRjAtXFx1REVGOVxcdURGMDAtXFx1REYwM1xcdURGMDUtXFx1REYwQ1xcdURGMEZcXHVERjEwXFx1REYxMy1cXHVERjI4XFx1REYyQS1cXHVERjMwXFx1REYzMlxcdURGMzNcXHVERjM1LVxcdURGMzlcXHVERjNDLVxcdURGNDRcXHVERjQ3XFx1REY0OFxcdURGNEItXFx1REY0RFxcdURGNTBcXHVERjU3XFx1REY1RC1cXHVERjYzXFx1REY2Ni1cXHVERjZDXFx1REY3MC1cXHVERjc0XXxcXHVEODA1W1xcdURDMDAtXFx1REM0QVxcdURDNTAtXFx1REM1OVxcdURDODAtXFx1RENDNVxcdURDQzdcXHVEQ0QwLVxcdURDRDlcXHVERDgwLVxcdUREQjVcXHVEREI4LVxcdUREQzBcXHVEREQ4LVxcdURERERcXHVERTAwLVxcdURFNDBcXHVERTQ0XFx1REU1MC1cXHVERTU5XFx1REU4MC1cXHVERUI3XFx1REVDMC1cXHVERUM5XFx1REYwMC1cXHVERjE5XFx1REYxRC1cXHVERjJCXFx1REYzMC1cXHVERjM5XXxcXHVEODA2W1xcdURDQTAtXFx1RENFOVxcdURDRkZcXHVERUMwLVxcdURFRjhdfFxcdUQ4MDdbXFx1REMwMC1cXHVEQzA4XFx1REMwQS1cXHVEQzM2XFx1REMzOC1cXHVEQzQwXFx1REM1MC1cXHVEQzU5XFx1REM3Mi1cXHVEQzhGXFx1REM5Mi1cXHVEQ0E3XFx1RENBOS1cXHVEQ0I2XXxcXHVEODA4W1xcdURDMDAtXFx1REY5OV18XFx1RDgwOVtcXHVEQzAwLVxcdURDNkVcXHVEQzgwLVxcdURENDNdfFtcXHVEODBDXFx1RDgxQy1cXHVEODIwXFx1RDg0MC1cXHVEODY4XFx1RDg2QS1cXHVEODZDXFx1RDg2Ri1cXHVEODcyXVtcXHVEQzAwLVxcdURGRkZdfFxcdUQ4MERbXFx1REMwMC1cXHVEQzJFXXxcXHVEODExW1xcdURDMDAtXFx1REU0Nl18XFx1RDgxQVtcXHVEQzAwLVxcdURFMzhcXHVERTQwLVxcdURFNUVcXHVERTYwLVxcdURFNjlcXHVERUQwLVxcdURFRURcXHVERUYwLVxcdURFRjRcXHVERjAwLVxcdURGMzZcXHVERjQwLVxcdURGNDNcXHVERjUwLVxcdURGNTlcXHVERjYzLVxcdURGNzdcXHVERjdELVxcdURGOEZdfFxcdUQ4MUJbXFx1REYwMC1cXHVERjQ0XFx1REY1MC1cXHVERjdFXFx1REY4Ri1cXHVERjlGXFx1REZFMF18XFx1RDgyMVtcXHVEQzAwLVxcdURGRUNdfFxcdUQ4MjJbXFx1REMwMC1cXHVERUYyXXxcXHVEODJDW1xcdURDMDBcXHVEQzAxXXxcXHVEODJGW1xcdURDMDAtXFx1REM2QVxcdURDNzAtXFx1REM3Q1xcdURDODAtXFx1REM4OFxcdURDOTAtXFx1REM5OVxcdURDOURcXHVEQzlFXXxcXHVEODM0W1xcdURENjUtXFx1REQ2OVxcdURENkQtXFx1REQ3MlxcdUREN0ItXFx1REQ4MlxcdUREODUtXFx1REQ4QlxcdUREQUEtXFx1RERBRFxcdURFNDItXFx1REU0NF18XFx1RDgzNVtcXHVEQzAwLVxcdURDNTRcXHVEQzU2LVxcdURDOUNcXHVEQzlFXFx1REM5RlxcdURDQTJcXHVEQ0E1XFx1RENBNlxcdURDQTktXFx1RENBQ1xcdURDQUUtXFx1RENCOVxcdURDQkJcXHVEQ0JELVxcdURDQzNcXHVEQ0M1LVxcdUREMDVcXHVERDA3LVxcdUREMEFcXHVERDBELVxcdUREMTRcXHVERDE2LVxcdUREMUNcXHVERDFFLVxcdUREMzlcXHVERDNCLVxcdUREM0VcXHVERDQwLVxcdURENDRcXHVERDQ2XFx1REQ0QS1cXHVERDUwXFx1REQ1Mi1cXHVERUE1XFx1REVBOC1cXHVERUMwXFx1REVDMi1cXHVERURBXFx1REVEQy1cXHVERUZBXFx1REVGQy1cXHVERjE0XFx1REYxNi1cXHVERjM0XFx1REYzNi1cXHVERjRFXFx1REY1MC1cXHVERjZFXFx1REY3MC1cXHVERjg4XFx1REY4QS1cXHVERkE4XFx1REZBQS1cXHVERkMyXFx1REZDNC1cXHVERkNCXFx1REZDRS1cXHVERkZGXXxcXHVEODM2W1xcdURFMDAtXFx1REUzNlxcdURFM0ItXFx1REU2Q1xcdURFNzVcXHVERTg0XFx1REU5Qi1cXHVERTlGXFx1REVBMS1cXHVERUFGXXxcXHVEODM4W1xcdURDMDAtXFx1REMwNlxcdURDMDgtXFx1REMxOFxcdURDMUItXFx1REMyMVxcdURDMjNcXHVEQzI0XFx1REMyNi1cXHVEQzJBXXxcXHVEODNBW1xcdURDMDAtXFx1RENDNFxcdURDRDAtXFx1RENENlxcdUREMDAtXFx1REQ0QVxcdURENTAtXFx1REQ1OV18XFx1RDgzQltcXHVERTAwLVxcdURFMDNcXHVERTA1LVxcdURFMUZcXHVERTIxXFx1REUyMlxcdURFMjRcXHVERTI3XFx1REUyOS1cXHVERTMyXFx1REUzNC1cXHVERTM3XFx1REUzOVxcdURFM0JcXHVERTQyXFx1REU0N1xcdURFNDlcXHVERTRCXFx1REU0RC1cXHVERTRGXFx1REU1MVxcdURFNTJcXHVERTU0XFx1REU1N1xcdURFNTlcXHVERTVCXFx1REU1RFxcdURFNUZcXHVERTYxXFx1REU2MlxcdURFNjRcXHVERTY3LVxcdURFNkFcXHVERTZDLVxcdURFNzJcXHVERTc0LVxcdURFNzdcXHVERTc5LVxcdURFN0NcXHVERTdFXFx1REU4MC1cXHVERTg5XFx1REU4Qi1cXHVERTlCXFx1REVBMS1cXHVERUEzXFx1REVBNS1cXHVERUE5XFx1REVBQi1cXHVERUJCXXxcXHVEODY5W1xcdURDMDAtXFx1REVENlxcdURGMDAtXFx1REZGRl18XFx1RDg2RFtcXHVEQzAwLVxcdURGMzRcXHVERjQwLVxcdURGRkZdfFxcdUQ4NkVbXFx1REMwMC1cXHVEQzFEXFx1REMyMC1cXHVERkZGXXxcXHVEODczW1xcdURDMDAtXFx1REVBMV18XFx1RDg3RVtcXHVEQzAwLVxcdURFMURdfFxcdURCNDBbXFx1REQwMC1cXHVEREVGXS9cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gaXNEZWNpbWFsRGlnaXQoY2gpIHtcbiAgICAgICAgcmV0dXJuIDB4MzAgPD0gY2ggJiYgY2ggPD0gMHgzOTsgIC8vIDAuLjlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0hleERpZ2l0KGNoKSB7XG4gICAgICAgIHJldHVybiAweDMwIDw9IGNoICYmIGNoIDw9IDB4MzkgfHwgIC8vIDAuLjlcbiAgICAgICAgICAgIDB4NjEgPD0gY2ggJiYgY2ggPD0gMHg2NiB8fCAgICAgLy8gYS4uZlxuICAgICAgICAgICAgMHg0MSA8PSBjaCAmJiBjaCA8PSAweDQ2OyAgICAgICAvLyBBLi5GXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPY3RhbERpZ2l0KGNoKSB7XG4gICAgICAgIHJldHVybiBjaCA+PSAweDMwICYmIGNoIDw9IDB4Mzc7ICAvLyAwLi43XG4gICAgfVxuXG4gICAgLy8gNy4yIFdoaXRlIFNwYWNlXG5cbiAgICBOT05fQVNDSUlfV0hJVEVTUEFDRVMgPSBbXG4gICAgICAgIDB4MTY4MCxcbiAgICAgICAgMHgyMDAwLCAweDIwMDEsIDB4MjAwMiwgMHgyMDAzLCAweDIwMDQsIDB4MjAwNSwgMHgyMDA2LCAweDIwMDcsIDB4MjAwOCwgMHgyMDA5LCAweDIwMEEsXG4gICAgICAgIDB4MjAyRiwgMHgyMDVGLFxuICAgICAgICAweDMwMDAsXG4gICAgICAgIDB4RkVGRlxuICAgIF07XG5cbiAgICBmdW5jdGlvbiBpc1doaXRlU3BhY2UoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoID09PSAweDIwIHx8IGNoID09PSAweDA5IHx8IGNoID09PSAweDBCIHx8IGNoID09PSAweDBDIHx8IGNoID09PSAweEEwIHx8XG4gICAgICAgICAgICBjaCA+PSAweDE2ODAgJiYgTk9OX0FTQ0lJX1dISVRFU1BBQ0VTLmluZGV4T2YoY2gpID49IDA7XG4gICAgfVxuXG4gICAgLy8gNy4zIExpbmUgVGVybWluYXRvcnNcblxuICAgIGZ1bmN0aW9uIGlzTGluZVRlcm1pbmF0b3IoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoID09PSAweDBBIHx8IGNoID09PSAweDBEIHx8IGNoID09PSAweDIwMjggfHwgY2ggPT09IDB4MjAyOTtcbiAgICB9XG5cbiAgICAvLyA3LjYgSWRlbnRpZmllciBOYW1lcyBhbmQgSWRlbnRpZmllcnNcblxuICAgIGZ1bmN0aW9uIGZyb21Db2RlUG9pbnQoY3ApIHtcbiAgICAgICAgaWYgKGNwIDw9IDB4RkZGRikgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjcCk7IH1cbiAgICAgICAgdmFyIGN1MSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoTWF0aC5mbG9vcigoY3AgLSAweDEwMDAwKSAvIDB4NDAwKSArIDB4RDgwMCk7XG4gICAgICAgIHZhciBjdTIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoY3AgLSAweDEwMDAwKSAlIDB4NDAwKSArIDB4REMwMCk7XG4gICAgICAgIHJldHVybiBjdTEgKyBjdTI7XG4gICAgfVxuXG4gICAgSURFTlRJRklFUl9TVEFSVCA9IG5ldyBBcnJheSgweDgwKTtcbiAgICBmb3IoY2ggPSAwOyBjaCA8IDB4ODA7ICsrY2gpIHtcbiAgICAgICAgSURFTlRJRklFUl9TVEFSVFtjaF0gPVxuICAgICAgICAgICAgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDdBIHx8ICAvLyBhLi56XG4gICAgICAgICAgICBjaCA+PSAweDQxICYmIGNoIDw9IDB4NUEgfHwgIC8vIEEuLlpcbiAgICAgICAgICAgIGNoID09PSAweDI0IHx8IGNoID09PSAweDVGOyAgLy8gJCAoZG9sbGFyKSBhbmQgXyAodW5kZXJzY29yZSlcbiAgICB9XG5cbiAgICBJREVOVElGSUVSX1BBUlQgPSBuZXcgQXJyYXkoMHg4MCk7XG4gICAgZm9yKGNoID0gMDsgY2ggPCAweDgwOyArK2NoKSB7XG4gICAgICAgIElERU5USUZJRVJfUEFSVFtjaF0gPVxuICAgICAgICAgICAgY2ggPj0gMHg2MSAmJiBjaCA8PSAweDdBIHx8ICAvLyBhLi56XG4gICAgICAgICAgICBjaCA+PSAweDQxICYmIGNoIDw9IDB4NUEgfHwgIC8vIEEuLlpcbiAgICAgICAgICAgIGNoID49IDB4MzAgJiYgY2ggPD0gMHgzOSB8fCAgLy8gMC4uOVxuICAgICAgICAgICAgY2ggPT09IDB4MjQgfHwgY2ggPT09IDB4NUY7ICAvLyAkIChkb2xsYXIpIGFuZCBfICh1bmRlcnNjb3JlKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllclN0YXJ0RVM1KGNoKSB7XG4gICAgICAgIHJldHVybiBjaCA8IDB4ODAgPyBJREVOVElGSUVSX1NUQVJUW2NoXSA6IEVTNVJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclN0YXJ0LnRlc3QoZnJvbUNvZGVQb2ludChjaCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllclBhcnRFUzUoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoIDwgMHg4MCA/IElERU5USUZJRVJfUEFSVFtjaF0gOiBFUzVSZWdleC5Ob25Bc2NpaUlkZW50aWZpZXJQYXJ0LnRlc3QoZnJvbUNvZGVQb2ludChjaCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllclN0YXJ0RVM2KGNoKSB7XG4gICAgICAgIHJldHVybiBjaCA8IDB4ODAgPyBJREVOVElGSUVSX1NUQVJUW2NoXSA6IEVTNlJlZ2V4Lk5vbkFzY2lpSWRlbnRpZmllclN0YXJ0LnRlc3QoZnJvbUNvZGVQb2ludChjaCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllclBhcnRFUzYoY2gpIHtcbiAgICAgICAgcmV0dXJuIGNoIDwgMHg4MCA/IElERU5USUZJRVJfUEFSVFtjaF0gOiBFUzZSZWdleC5Ob25Bc2NpaUlkZW50aWZpZXJQYXJ0LnRlc3QoZnJvbUNvZGVQb2ludChjaCkpO1xuICAgIH1cblxuICAgIG1vZHVsZS5leHBvcnRzID0ge1xuICAgICAgICBpc0RlY2ltYWxEaWdpdDogaXNEZWNpbWFsRGlnaXQsXG4gICAgICAgIGlzSGV4RGlnaXQ6IGlzSGV4RGlnaXQsXG4gICAgICAgIGlzT2N0YWxEaWdpdDogaXNPY3RhbERpZ2l0LFxuICAgICAgICBpc1doaXRlU3BhY2U6IGlzV2hpdGVTcGFjZSxcbiAgICAgICAgaXNMaW5lVGVybWluYXRvcjogaXNMaW5lVGVybWluYXRvcixcbiAgICAgICAgaXNJZGVudGlmaWVyU3RhcnRFUzU6IGlzSWRlbnRpZmllclN0YXJ0RVM1LFxuICAgICAgICBpc0lkZW50aWZpZXJQYXJ0RVM1OiBpc0lkZW50aWZpZXJQYXJ0RVM1LFxuICAgICAgICBpc0lkZW50aWZpZXJTdGFydEVTNjogaXNJZGVudGlmaWVyU3RhcnRFUzYsXG4gICAgICAgIGlzSWRlbnRpZmllclBhcnRFUzY6IGlzSWRlbnRpZmllclBhcnRFUzZcbiAgICB9O1xufSgpKTtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG4iLCIvKlxuICBDb3B5cmlnaHQgKEMpIDIwMTMgWXVzdWtlIFN1enVraSA8dXRhdGFuZS50ZWFAZ21haWwuY29tPlxuXG4gIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcblxuICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuXG4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiXG4gIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcbiAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxDT1BZUklHSFQgSE9MREVSPiBCRSBMSUFCTEUgRk9SIEFOWVxuICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XG4gIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORFxuICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiovXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGNvZGUgPSByZXF1aXJlKCcuL2NvZGUnKTtcblxuICAgIGZ1bmN0aW9uIGlzU3RyaWN0TW9kZVJlc2VydmVkV29yZEVTNihpZCkge1xuICAgICAgICBzd2l0Y2ggKGlkKSB7XG4gICAgICAgIGNhc2UgJ2ltcGxlbWVudHMnOlxuICAgICAgICBjYXNlICdpbnRlcmZhY2UnOlxuICAgICAgICBjYXNlICdwYWNrYWdlJzpcbiAgICAgICAgY2FzZSAncHJpdmF0ZSc6XG4gICAgICAgIGNhc2UgJ3Byb3RlY3RlZCc6XG4gICAgICAgIGNhc2UgJ3B1YmxpYyc6XG4gICAgICAgIGNhc2UgJ3N0YXRpYyc6XG4gICAgICAgIGNhc2UgJ2xldCc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzS2V5d29yZEVTNShpZCwgc3RyaWN0KSB7XG4gICAgICAgIC8vIHlpZWxkIHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBrZXl3b3JkIHVuZGVyIG5vbi1zdHJpY3QgbW9kZS5cbiAgICAgICAgaWYgKCFzdHJpY3QgJiYgaWQgPT09ICd5aWVsZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNLZXl3b3JkRVM2KGlkLCBzdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzS2V5d29yZEVTNihpZCwgc3RyaWN0KSB7XG4gICAgICAgIGlmIChzdHJpY3QgJiYgaXNTdHJpY3RNb2RlUmVzZXJ2ZWRXb3JkRVM2KGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGlkLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAnaWYnKSB8fCAoaWQgPT09ICdpbicpIHx8IChpZCA9PT0gJ2RvJyk7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICd2YXInKSB8fCAoaWQgPT09ICdmb3InKSB8fCAoaWQgPT09ICduZXcnKSB8fCAoaWQgPT09ICd0cnknKTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ3RoaXMnKSB8fCAoaWQgPT09ICdlbHNlJykgfHwgKGlkID09PSAnY2FzZScpIHx8XG4gICAgICAgICAgICAgICAgKGlkID09PSAndm9pZCcpIHx8IChpZCA9PT0gJ3dpdGgnKSB8fCAoaWQgPT09ICdlbnVtJyk7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHJldHVybiAoaWQgPT09ICd3aGlsZScpIHx8IChpZCA9PT0gJ2JyZWFrJykgfHwgKGlkID09PSAnY2F0Y2gnKSB8fFxuICAgICAgICAgICAgICAgIChpZCA9PT0gJ3Rocm93JykgfHwgKGlkID09PSAnY29uc3QnKSB8fCAoaWQgPT09ICd5aWVsZCcpIHx8XG4gICAgICAgICAgICAgICAgKGlkID09PSAnY2xhc3MnKSB8fCAoaWQgPT09ICdzdXBlcicpO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAncmV0dXJuJykgfHwgKGlkID09PSAndHlwZW9mJykgfHwgKGlkID09PSAnZGVsZXRlJykgfHxcbiAgICAgICAgICAgICAgICAoaWQgPT09ICdzd2l0Y2gnKSB8fCAoaWQgPT09ICdleHBvcnQnKSB8fCAoaWQgPT09ICdpbXBvcnQnKTtcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgcmV0dXJuIChpZCA9PT0gJ2RlZmF1bHQnKSB8fCAoaWQgPT09ICdmaW5hbGx5JykgfHwgKGlkID09PSAnZXh0ZW5kcycpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAnZnVuY3Rpb24nKSB8fCAoaWQgPT09ICdjb250aW51ZScpIHx8IChpZCA9PT0gJ2RlYnVnZ2VyJyk7XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICByZXR1cm4gKGlkID09PSAnaW5zdGFuY2VvZicpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNSZXNlcnZlZFdvcmRFUzUoaWQsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gaWQgPT09ICdudWxsJyB8fCBpZCA9PT0gJ3RydWUnIHx8IGlkID09PSAnZmFsc2UnIHx8IGlzS2V5d29yZEVTNShpZCwgc3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Jlc2VydmVkV29yZEVTNihpZCwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBpZCA9PT0gJ251bGwnIHx8IGlkID09PSAndHJ1ZScgfHwgaWQgPT09ICdmYWxzZScgfHwgaXNLZXl3b3JkRVM2KGlkLCBzdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUmVzdHJpY3RlZFdvcmQoaWQpIHtcbiAgICAgICAgcmV0dXJuIGlkID09PSAnZXZhbCcgfHwgaWQgPT09ICdhcmd1bWVudHMnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllck5hbWVFUzUoaWQpIHtcbiAgICAgICAgdmFyIGksIGl6LCBjaDtcblxuICAgICAgICBpZiAoaWQubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgIGNoID0gaWQuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgaWYgKCFjb2RlLmlzSWRlbnRpZmllclN0YXJ0RVM1KGNoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMSwgaXogPSBpZC5sZW5ndGg7IGkgPCBpejsgKytpKSB7XG4gICAgICAgICAgICBjaCA9IGlkLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICBpZiAoIWNvZGUuaXNJZGVudGlmaWVyUGFydEVTNShjaCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVjb2RlVXRmMTYobGVhZCwgdHJhaWwpIHtcbiAgICAgICAgcmV0dXJuIChsZWFkIC0gMHhEODAwKSAqIDB4NDAwICsgKHRyYWlsIC0gMHhEQzAwKSArIDB4MTAwMDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJZGVudGlmaWVyTmFtZUVTNihpZCkge1xuICAgICAgICB2YXIgaSwgaXosIGNoLCBsb3dDaCwgY2hlY2s7XG5cbiAgICAgICAgaWYgKGlkLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICBjaGVjayA9IGNvZGUuaXNJZGVudGlmaWVyU3RhcnRFUzY7XG4gICAgICAgIGZvciAoaSA9IDAsIGl6ID0gaWQubGVuZ3RoOyBpIDwgaXo7ICsraSkge1xuICAgICAgICAgICAgY2ggPSBpZC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKDB4RDgwMCA8PSBjaCAmJiBjaCA8PSAweERCRkYpIHtcbiAgICAgICAgICAgICAgICArK2k7XG4gICAgICAgICAgICAgICAgaWYgKGkgPj0gaXopIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgICAgICAgICAgbG93Q2ggPSBpZC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgICAgIGlmICghKDB4REMwMCA8PSBsb3dDaCAmJiBsb3dDaCA8PSAweERGRkYpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2ggPSBkZWNvZGVVdGYxNihjaCwgbG93Q2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjaGVjayhjaCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGVjayA9IGNvZGUuaXNJZGVudGlmaWVyUGFydEVTNjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0lkZW50aWZpZXJFUzUoaWQsIHN0cmljdCkge1xuICAgICAgICByZXR1cm4gaXNJZGVudGlmaWVyTmFtZUVTNShpZCkgJiYgIWlzUmVzZXJ2ZWRXb3JkRVM1KGlkLCBzdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSWRlbnRpZmllckVTNihpZCwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBpc0lkZW50aWZpZXJOYW1lRVM2KGlkKSAmJiAhaXNSZXNlcnZlZFdvcmRFUzYoaWQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgICAgIGlzS2V5d29yZEVTNTogaXNLZXl3b3JkRVM1LFxuICAgICAgICBpc0tleXdvcmRFUzY6IGlzS2V5d29yZEVTNixcbiAgICAgICAgaXNSZXNlcnZlZFdvcmRFUzU6IGlzUmVzZXJ2ZWRXb3JkRVM1LFxuICAgICAgICBpc1Jlc2VydmVkV29yZEVTNjogaXNSZXNlcnZlZFdvcmRFUzYsXG4gICAgICAgIGlzUmVzdHJpY3RlZFdvcmQ6IGlzUmVzdHJpY3RlZFdvcmQsXG4gICAgICAgIGlzSWRlbnRpZmllck5hbWVFUzU6IGlzSWRlbnRpZmllck5hbWVFUzUsXG4gICAgICAgIGlzSWRlbnRpZmllck5hbWVFUzY6IGlzSWRlbnRpZmllck5hbWVFUzYsXG4gICAgICAgIGlzSWRlbnRpZmllckVTNTogaXNJZGVudGlmaWVyRVM1LFxuICAgICAgICBpc0lkZW50aWZpZXJFUzY6IGlzSWRlbnRpZmllckVTNlxuICAgIH07XG59KCkpO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbiIsIi8qXG4gIENvcHlyaWdodCAoQykgMjAxMyBZdXN1a2UgU3V6dWtpIDx1dGF0YW5lLnRlYUBnbWFpbC5jb20+XG5cbiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG5cbiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBcIkFTIElTXCJcbiAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgPENPUFlSSUdIVCBIT0xERVI+IEJFIExJQUJMRSBGT1IgQU5ZXG4gIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztcbiAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EXG4gIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRlxuICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuKi9cblxuXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIGV4cG9ydHMuYXN0ID0gcmVxdWlyZSgnLi9hc3QnKTtcbiAgICBleHBvcnRzLmNvZGUgPSByZXF1aXJlKCcuL2NvZGUnKTtcbiAgICBleHBvcnRzLmtleXdvcmQgPSByZXF1aXJlKCcuL2tleXdvcmQnKTtcbn0oKSk7XG4vKiB2aW06IHNldCBzdz00IHRzPTQgZXQgdHc9ODAgOiAqL1xuIiwiY29uc3QgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdleHRyYWN0LXppcCcpXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm9kZS9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zXG5jb25zdCB7IGNyZWF0ZVdyaXRlU3RyZWFtLCBwcm9taXNlczogZnMgfSA9IHJlcXVpcmUoJ2ZzJylcbmNvbnN0IGdldFN0cmVhbSA9IHJlcXVpcmUoJ2dldC1zdHJlYW0nKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgeyBwcm9taXNpZnkgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuY29uc3Qgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IHlhdXpsID0gcmVxdWlyZSgneWF1emwnKVxuXG5jb25zdCBvcGVuWmlwID0gcHJvbWlzaWZ5KHlhdXpsLm9wZW4pXG5jb25zdCBwaXBlbGluZSA9IHByb21pc2lmeShzdHJlYW0ucGlwZWxpbmUpXG5cbmNsYXNzIEV4dHJhY3RvciB7XG4gIGNvbnN0cnVjdG9yICh6aXBQYXRoLCBvcHRzKSB7XG4gICAgdGhpcy56aXBQYXRoID0gemlwUGF0aFxuICAgIHRoaXMub3B0cyA9IG9wdHNcbiAgfVxuXG4gIGFzeW5jIGV4dHJhY3QgKCkge1xuICAgIGRlYnVnKCdvcGVuaW5nJywgdGhpcy56aXBQYXRoLCAnd2l0aCBvcHRzJywgdGhpcy5vcHRzKVxuXG4gICAgdGhpcy56aXBmaWxlID0gYXdhaXQgb3BlblppcCh0aGlzLnppcFBhdGgsIHsgbGF6eUVudHJpZXM6IHRydWUgfSlcbiAgICB0aGlzLmNhbmNlbGVkID0gZmFsc2VcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnppcGZpbGUub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgdGhpcy5jYW5jZWxlZCA9IHRydWVcbiAgICAgICAgcmVqZWN0KGVycilcbiAgICAgIH0pXG4gICAgICB0aGlzLnppcGZpbGUucmVhZEVudHJ5KClcblxuICAgICAgdGhpcy56aXBmaWxlLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbGVkKSB7XG4gICAgICAgICAgZGVidWcoJ3ppcCBleHRyYWN0aW9uIGNvbXBsZXRlJylcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgdGhpcy56aXBmaWxlLm9uKCdlbnRyeScsIGFzeW5jIGVudHJ5ID0+IHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmICh0aGlzLmNhbmNlbGVkKSB7XG4gICAgICAgICAgZGVidWcoJ3NraXBwaW5nIGVudHJ5JywgZW50cnkuZmlsZU5hbWUsIHsgY2FuY2VsbGVkOiB0aGlzLmNhbmNlbGVkIH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBkZWJ1ZygnemlwZmlsZSBlbnRyeScsIGVudHJ5LmZpbGVOYW1lKVxuXG4gICAgICAgIGlmIChlbnRyeS5maWxlTmFtZS5zdGFydHNXaXRoKCdfX01BQ09TWC8nKSkge1xuICAgICAgICAgIHRoaXMuemlwZmlsZS5yZWFkRW50cnkoKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVzdERpciA9IHBhdGguZGlybmFtZShwYXRoLmpvaW4odGhpcy5vcHRzLmRpciwgZW50cnkuZmlsZU5hbWUpKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoZGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcblxuICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbERlc3REaXIgPSBhd2FpdCBmcy5yZWFscGF0aChkZXN0RGlyKVxuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlRGVzdERpciA9IHBhdGgucmVsYXRpdmUodGhpcy5vcHRzLmRpciwgY2Fub25pY2FsRGVzdERpcilcblxuICAgICAgICAgIGlmIChyZWxhdGl2ZURlc3REaXIuc3BsaXQocGF0aC5zZXApLmluY2x1ZGVzKCcuLicpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dCBvZiBib3VuZCBwYXRoIFwiJHtjYW5vbmljYWxEZXN0RGlyfVwiIGZvdW5kIHdoaWxlIHByb2Nlc3NpbmcgZmlsZSAke2VudHJ5LmZpbGVOYW1lfWApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5leHRyYWN0RW50cnkoZW50cnkpXG4gICAgICAgICAgZGVidWcoJ2ZpbmlzaGVkIHByb2Nlc3NpbmcnLCBlbnRyeS5maWxlTmFtZSlcbiAgICAgICAgICB0aGlzLnppcGZpbGUucmVhZEVudHJ5KClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5jYW5jZWxlZCA9IHRydWVcbiAgICAgICAgICB0aGlzLnppcGZpbGUuY2xvc2UoKVxuICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGV4dHJhY3RFbnRyeSAoZW50cnkpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodGhpcy5jYW5jZWxlZCkge1xuICAgICAgZGVidWcoJ3NraXBwaW5nIGVudHJ5IGV4dHJhY3Rpb24nLCBlbnRyeS5maWxlTmFtZSwgeyBjYW5jZWxsZWQ6IHRoaXMuY2FuY2VsZWQgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdHMub25FbnRyeSkge1xuICAgICAgdGhpcy5vcHRzLm9uRW50cnkoZW50cnksIHRoaXMuemlwZmlsZSlcbiAgICB9XG5cbiAgICBjb25zdCBkZXN0ID0gcGF0aC5qb2luKHRoaXMub3B0cy5kaXIsIGVudHJ5LmZpbGVOYW1lKVxuXG4gICAgLy8gY29udmVydCBleHRlcm5hbCBmaWxlIGF0dHIgaW50IGludG8gYSBmcyBzdGF0IG1vZGUgaW50XG4gICAgY29uc3QgbW9kZSA9IChlbnRyeS5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4RkZGRlxuICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBzeW1saW5rIG9yIGRpciAodXNpbmcgc3RhdCBtb2RlIGNvbnN0YW50cylcbiAgICBjb25zdCBJRk1UID0gNjE0NDBcbiAgICBjb25zdCBJRkRJUiA9IDE2Mzg0XG4gICAgY29uc3QgSUZMTksgPSA0MDk2MFxuICAgIGNvbnN0IHN5bWxpbmsgPSAobW9kZSAmIElGTVQpID09PSBJRkxOS1xuICAgIGxldCBpc0RpciA9IChtb2RlICYgSUZNVCkgPT09IElGRElSXG5cbiAgICAvLyBGYWlsc2FmZSwgYm9ycm93ZWQgZnJvbSBqc1ppcFxuICAgIGlmICghaXNEaXIgJiYgZW50cnkuZmlsZU5hbWUuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgaXNEaXIgPSB0cnVlXG4gICAgfVxuXG4gICAgLy8gY2hlY2sgZm9yIHdpbmRvd3Mgd2VpcmQgd2F5IG9mIHNwZWNpZnlpbmcgYSBkaXJlY3RvcnlcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWF4b2dkZW4vZXh0cmFjdC16aXAvaXNzdWVzLzEzI2lzc3VlY29tbWVudC0xNTQ0OTQ1NjZcbiAgICBjb25zdCBtYWRlQnkgPSBlbnRyeS52ZXJzaW9uTWFkZUJ5ID4+IDhcbiAgICBpZiAoIWlzRGlyKSBpc0RpciA9IChtYWRlQnkgPT09IDAgJiYgZW50cnkuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyA9PT0gMTYpXG5cbiAgICBkZWJ1ZygnZXh0cmFjdGluZyBlbnRyeScsIHsgZmlsZW5hbWU6IGVudHJ5LmZpbGVOYW1lLCBpc0RpcjogaXNEaXIsIGlzU3ltbGluazogc3ltbGluayB9KVxuXG4gICAgY29uc3QgcHJvY01vZGUgPSB0aGlzLmdldEV4dHJhY3RlZE1vZGUobW9kZSwgaXNEaXIpICYgMG83NzdcblxuICAgIC8vIGFsd2F5cyBlbnN1cmUgZm9sZGVycyBhcmUgY3JlYXRlZFxuICAgIGNvbnN0IGRlc3REaXIgPSBpc0RpciA/IGRlc3QgOiBwYXRoLmRpcm5hbWUoZGVzdClcblxuICAgIGNvbnN0IG1rZGlyT3B0aW9ucyA9IHsgcmVjdXJzaXZlOiB0cnVlIH1cbiAgICBpZiAoaXNEaXIpIHtcbiAgICAgIG1rZGlyT3B0aW9ucy5tb2RlID0gcHJvY01vZGVcbiAgICB9XG4gICAgZGVidWcoJ21rZGlyJywgeyBkaXI6IGRlc3REaXIsIC4uLm1rZGlyT3B0aW9ucyB9KVxuICAgIGF3YWl0IGZzLm1rZGlyKGRlc3REaXIsIG1rZGlyT3B0aW9ucylcbiAgICBpZiAoaXNEaXIpIHJldHVyblxuXG4gICAgZGVidWcoJ29wZW5pbmcgcmVhZCBzdHJlYW0nLCBkZXN0KVxuICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBhd2FpdCBwcm9taXNpZnkodGhpcy56aXBmaWxlLm9wZW5SZWFkU3RyZWFtLmJpbmQodGhpcy56aXBmaWxlKSkoZW50cnkpXG5cbiAgICBpZiAoc3ltbGluaykge1xuICAgICAgY29uc3QgbGluayA9IGF3YWl0IGdldFN0cmVhbShyZWFkU3RyZWFtKVxuICAgICAgZGVidWcoJ2NyZWF0aW5nIHN5bWxpbmsnLCBsaW5rLCBkZXN0KVxuICAgICAgYXdhaXQgZnMuc3ltbGluayhsaW5rLCBkZXN0KVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBwaXBlbGluZShyZWFkU3RyZWFtLCBjcmVhdGVXcml0ZVN0cmVhbShkZXN0LCB7IG1vZGU6IHByb2NNb2RlIH0pKVxuICAgIH1cbiAgfVxuXG4gIGdldEV4dHJhY3RlZE1vZGUgKGVudHJ5TW9kZSwgaXNEaXIpIHtcbiAgICBsZXQgbW9kZSA9IGVudHJ5TW9kZVxuICAgIC8vIFNldCBkZWZhdWx0cywgaWYgbmVjZXNzYXJ5XG4gICAgaWYgKG1vZGUgPT09IDApIHtcbiAgICAgIGlmIChpc0Rpcikge1xuICAgICAgICBpZiAodGhpcy5vcHRzLmRlZmF1bHREaXJNb2RlKSB7XG4gICAgICAgICAgbW9kZSA9IHBhcnNlSW50KHRoaXMub3B0cy5kZWZhdWx0RGlyTW9kZSwgMTApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW1vZGUpIHtcbiAgICAgICAgICBtb2RlID0gMG83NTVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5kZWZhdWx0RmlsZU1vZGUpIHtcbiAgICAgICAgICBtb2RlID0gcGFyc2VJbnQodGhpcy5vcHRzLmRlZmF1bHRGaWxlTW9kZSwgMTApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW1vZGUpIHtcbiAgICAgICAgICBtb2RlID0gMG82NDRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2RlXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyBmdW5jdGlvbiAoemlwUGF0aCwgb3B0cykge1xuICBkZWJ1ZygnY3JlYXRpbmcgdGFyZ2V0IGRpcmVjdG9yeScsIG9wdHMuZGlyKVxuXG4gIGlmICghcGF0aC5pc0Fic29sdXRlKG9wdHMuZGlyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGRpcmVjdG9yeSBpcyBleHBlY3RlZCB0byBiZSBhYnNvbHV0ZScpXG4gIH1cblxuICBhd2FpdCBmcy5ta2RpcihvcHRzLmRpciwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgb3B0cy5kaXIgPSBhd2FpdCBmcy5yZWFscGF0aChvcHRzLmRpcilcbiAgcmV0dXJuIG5ldyBFeHRyYWN0b3IoemlwUGF0aCwgb3B0cykuZXh0cmFjdCgpXG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGNsYXNzIEZpeGVkRklGTyB7XG4gIGNvbnN0cnVjdG9yIChod20pIHtcbiAgICBpZiAoIShod20gPiAwKSB8fCAoKGh3bSAtIDEpICYgaHdtKSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdNYXggc2l6ZSBmb3IgYSBGaXhlZEZJRk8gc2hvdWxkIGJlIGEgcG93ZXIgb2YgdHdvJylcbiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheShod20pXG4gICAgdGhpcy5tYXNrID0gaHdtIC0gMVxuICAgIHRoaXMudG9wID0gMFxuICAgIHRoaXMuYnRtID0gMFxuICAgIHRoaXMubmV4dCA9IG51bGxcbiAgfVxuXG4gIGNsZWFyICgpIHtcbiAgICB0aGlzLnRvcCA9IHRoaXMuYnRtID0gMFxuICAgIHRoaXMubmV4dCA9IG51bGxcbiAgICB0aGlzLmJ1ZmZlci5maWxsKHVuZGVmaW5lZClcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBpZiAodGhpcy5idWZmZXJbdGhpcy50b3BdICE9PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZVxuICAgIHRoaXMuYnVmZmVyW3RoaXMudG9wXSA9IGRhdGFcbiAgICB0aGlzLnRvcCA9ICh0aGlzLnRvcCArIDEpICYgdGhpcy5tYXNrXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5idWZmZXJbdGhpcy5idG1dXG4gICAgaWYgKGxhc3QgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHRoaXMuYnVmZmVyW3RoaXMuYnRtXSA9IHVuZGVmaW5lZFxuICAgIHRoaXMuYnRtID0gKHRoaXMuYnRtICsgMSkgJiB0aGlzLm1hc2tcbiAgICByZXR1cm4gbGFzdFxuICB9XG5cbiAgcGVlayAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuYnRtXVxuICB9XG5cbiAgaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuYnRtXSA9PT0gdW5kZWZpbmVkXG4gIH1cbn1cbiIsImNvbnN0IEZpeGVkRklGTyA9IHJlcXVpcmUoJy4vZml4ZWQtc2l6ZScpXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRmFzdEZJRk8ge1xuICBjb25zdHJ1Y3RvciAoaHdtKSB7XG4gICAgdGhpcy5od20gPSBod20gfHwgMTZcbiAgICB0aGlzLmhlYWQgPSBuZXcgRml4ZWRGSUZPKHRoaXMuaHdtKVxuICAgIHRoaXMudGFpbCA9IHRoaXMuaGVhZFxuICAgIHRoaXMubGVuZ3RoID0gMFxuICB9XG5cbiAgY2xlYXIgKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbFxuICAgIHRoaXMuaGVhZC5jbGVhcigpXG4gICAgdGhpcy5sZW5ndGggPSAwXG4gIH1cblxuICBwdXNoICh2YWwpIHtcbiAgICB0aGlzLmxlbmd0aCsrXG4gICAgaWYgKCF0aGlzLmhlYWQucHVzaCh2YWwpKSB7XG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5oZWFkXG4gICAgICB0aGlzLmhlYWQgPSBwcmV2Lm5leHQgPSBuZXcgRml4ZWRGSUZPKDIgKiB0aGlzLmhlYWQuYnVmZmVyLmxlbmd0aClcbiAgICAgIHRoaXMuaGVhZC5wdXNoKHZhbClcbiAgICB9XG4gIH1cblxuICBzaGlmdCAoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoICE9PSAwKSB0aGlzLmxlbmd0aC0tXG4gICAgY29uc3QgdmFsID0gdGhpcy50YWlsLnNoaWZ0KClcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgJiYgdGhpcy50YWlsLm5leHQpIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnRhaWwubmV4dFxuICAgICAgdGhpcy50YWlsLm5leHQgPSBudWxsXG4gICAgICB0aGlzLnRhaWwgPSBuZXh0XG4gICAgICByZXR1cm4gdGhpcy50YWlsLnNoaWZ0KClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsXG4gIH1cblxuICBwZWVrICgpIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLnRhaWwucGVlaygpXG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkICYmIHRoaXMudGFpbC5uZXh0KSByZXR1cm4gdGhpcy50YWlsLm5leHQucGVlaygpXG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwXG4gIH1cbn1cbiIsInZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbnZhciBSZWFkYWJsZSA9IHN0cmVhbS5SZWFkYWJsZTtcbnZhciBXcml0YWJsZSA9IHN0cmVhbS5Xcml0YWJsZTtcbnZhciBQYXNzVGhyb3VnaCA9IHN0cmVhbS5QYXNzVGhyb3VnaDtcbnZhciBQZW5kID0gcmVxdWlyZSgncGVuZCcpO1xudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcblxuZXhwb3J0cy5jcmVhdGVGcm9tQnVmZmVyID0gY3JlYXRlRnJvbUJ1ZmZlcjtcbmV4cG9ydHMuY3JlYXRlRnJvbUZkID0gY3JlYXRlRnJvbUZkO1xuZXhwb3J0cy5CdWZmZXJTbGljZXIgPSBCdWZmZXJTbGljZXI7XG5leHBvcnRzLkZkU2xpY2VyID0gRmRTbGljZXI7XG5cbnV0aWwuaW5oZXJpdHMoRmRTbGljZXIsIEV2ZW50RW1pdHRlcik7XG5mdW5jdGlvbiBGZFNsaWNlcihmZCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XG5cbiAgdGhpcy5mZCA9IGZkO1xuICB0aGlzLnBlbmQgPSBuZXcgUGVuZCgpO1xuICB0aGlzLnBlbmQubWF4ID0gMTtcbiAgdGhpcy5yZWZDb3VudCA9IDA7XG4gIHRoaXMuYXV0b0Nsb3NlID0gISFvcHRpb25zLmF1dG9DbG9zZTtcbn1cblxuRmRTbGljZXIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLnBlbmQuZ28oZnVuY3Rpb24oY2IpIHtcbiAgICBmcy5yZWFkKHNlbGYuZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBmdW5jdGlvbihlcnIsIGJ5dGVzUmVhZCwgYnVmZmVyKSB7XG4gICAgICBjYigpO1xuICAgICAgY2FsbGJhY2soZXJyLCBieXRlc1JlYWQsIGJ1ZmZlcik7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuRmRTbGljZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5wZW5kLmdvKGZ1bmN0aW9uKGNiKSB7XG4gICAgZnMud3JpdGUoc2VsZi5mZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGZ1bmN0aW9uKGVyciwgd3JpdHRlbiwgYnVmZmVyKSB7XG4gICAgICBjYigpO1xuICAgICAgY2FsbGJhY2soZXJyLCB3cml0dGVuLCBidWZmZXIpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbkZkU2xpY2VyLnByb3RvdHlwZS5jcmVhdGVSZWFkU3RyZWFtID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICByZXR1cm4gbmV3IFJlYWRTdHJlYW0odGhpcywgb3B0aW9ucyk7XG59O1xuXG5GZFNsaWNlci5wcm90b3R5cGUuY3JlYXRlV3JpdGVTdHJlYW0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgV3JpdGVTdHJlYW0odGhpcywgb3B0aW9ucyk7XG59O1xuXG5GZFNsaWNlci5wcm90b3R5cGUucmVmID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVmQ291bnQgKz0gMTtcbn07XG5cbkZkU2xpY2VyLnByb3RvdHlwZS51bnJlZiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYucmVmQ291bnQgLT0gMTtcblxuICBpZiAoc2VsZi5yZWZDb3VudCA+IDApIHJldHVybjtcbiAgaWYgKHNlbGYucmVmQ291bnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHVucmVmXCIpO1xuXG4gIGlmIChzZWxmLmF1dG9DbG9zZSkge1xuICAgIGZzLmNsb3NlKHNlbGYuZmQsIG9uQ2xvc2VEb25lKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQ2xvc2VEb25lKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxmLmVtaXQoJ2Nsb3NlJyk7XG4gICAgfVxuICB9XG59O1xuXG51dGlsLmluaGVyaXRzKFJlYWRTdHJlYW0sIFJlYWRhYmxlKTtcbmZ1bmN0aW9uIFJlYWRTdHJlYW0oY29udGV4dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLmNvbnRleHQucmVmKCk7XG5cbiAgdGhpcy5zdGFydCA9IG9wdGlvbnMuc3RhcnQgfHwgMDtcbiAgdGhpcy5lbmRPZmZzZXQgPSBvcHRpb25zLmVuZDtcbiAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0O1xuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xufVxuXG5SZWFkU3RyZWFtLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKG4pIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoc2VsZi5kZXN0cm95ZWQpIHJldHVybjtcblxuICB2YXIgdG9SZWFkID0gTWF0aC5taW4oc2VsZi5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrLCBuKTtcbiAgaWYgKHNlbGYuZW5kT2Zmc2V0ICE9IG51bGwpIHtcbiAgICB0b1JlYWQgPSBNYXRoLm1pbih0b1JlYWQsIHNlbGYuZW5kT2Zmc2V0IC0gc2VsZi5wb3MpO1xuICB9XG4gIGlmICh0b1JlYWQgPD0gMCkge1xuICAgIHNlbGYuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gICAgc2VsZi5jb250ZXh0LnVucmVmKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYuY29udGV4dC5wZW5kLmdvKGZ1bmN0aW9uKGNiKSB7XG4gICAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm4gY2IoKTtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEJ1ZmZlcih0b1JlYWQpO1xuICAgIGZzLnJlYWQoc2VsZi5jb250ZXh0LmZkLCBidWZmZXIsIDAsIHRvUmVhZCwgc2VsZi5wb3MsIGZ1bmN0aW9uKGVyciwgYnl0ZXNSZWFkKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHNlbGYuZGVzdHJveShlcnIpO1xuICAgICAgfSBlbHNlIGlmIChieXRlc1JlYWQgPT09IDApIHtcbiAgICAgICAgc2VsZi5kZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLnB1c2gobnVsbCk7XG4gICAgICAgIHNlbGYuY29udGV4dC51bnJlZigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5wb3MgKz0gYnl0ZXNSZWFkO1xuICAgICAgICBzZWxmLnB1c2goYnVmZmVyLnNsaWNlKDAsIGJ5dGVzUmVhZCkpO1xuICAgICAgfVxuICAgICAgY2IoKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5SZWFkU3RyZWFtLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oZXJyKSB7XG4gIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICBlcnIgPSBlcnIgfHwgbmV3IEVycm9yKFwic3RyZWFtIGRlc3Ryb3llZFwiKTtcbiAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgdGhpcy5jb250ZXh0LnVucmVmKCk7XG59O1xuXG51dGlsLmluaGVyaXRzKFdyaXRlU3RyZWFtLCBXcml0YWJsZSk7XG5mdW5jdGlvbiBXcml0ZVN0cmVhbShjb250ZXh0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuY29udGV4dC5yZWYoKTtcblxuICB0aGlzLnN0YXJ0ID0gb3B0aW9ucy5zdGFydCB8fCAwO1xuICB0aGlzLmVuZE9mZnNldCA9IChvcHRpb25zLmVuZCA9PSBudWxsKSA/IEluZmluaXR5IDogK29wdGlvbnMuZW5kO1xuICB0aGlzLmJ5dGVzV3JpdHRlbiA9IDA7XG4gIHRoaXMucG9zID0gdGhpcy5zdGFydDtcbiAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICB0aGlzLm9uKCdmaW5pc2gnLCB0aGlzLmRlc3Ryb3kuYmluZCh0aGlzKSk7XG59XG5cbldyaXRlU3RyZWFtLnByb3RvdHlwZS5fd3JpdGUgPSBmdW5jdGlvbihidWZmZXIsIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChzZWxmLmRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gIGlmIChzZWxmLnBvcyArIGJ1ZmZlci5sZW5ndGggPiBzZWxmLmVuZE9mZnNldCkge1xuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXCJtYXhpbXVtIGZpbGUgbGVuZ3RoIGV4Y2VlZGVkXCIpO1xuICAgIGVyci5jb2RlID0gJ0VUT09CSUcnO1xuICAgIHNlbGYuZGVzdHJveSgpO1xuICAgIGNhbGxiYWNrKGVycik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYuY29udGV4dC5wZW5kLmdvKGZ1bmN0aW9uKGNiKSB7XG4gICAgaWYgKHNlbGYuZGVzdHJveWVkKSByZXR1cm4gY2IoKTtcbiAgICBmcy53cml0ZShzZWxmLmNvbnRleHQuZmQsIGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgc2VsZi5wb3MsIGZ1bmN0aW9uKGVyciwgYnl0ZXMpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgc2VsZi5kZXN0cm95KCk7XG4gICAgICAgIGNiKCk7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmJ5dGVzV3JpdHRlbiArPSBieXRlcztcbiAgICAgICAgc2VsZi5wb3MgKz0gYnl0ZXM7XG4gICAgICAgIHNlbGYuZW1pdCgncHJvZ3Jlc3MnKTtcbiAgICAgICAgY2IoKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59O1xuXG5Xcml0ZVN0cmVhbS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICB0aGlzLmNvbnRleHQudW5yZWYoKTtcbn07XG5cbnV0aWwuaW5oZXJpdHMoQnVmZmVyU2xpY2VyLCBFdmVudEVtaXR0ZXIpO1xuZnVuY3Rpb24gQnVmZmVyU2xpY2VyKGJ1ZmZlciwgb3B0aW9ucykge1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5yZWZDb3VudCA9IDA7XG4gIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICB0aGlzLm1heENodW5rU2l6ZSA9IG9wdGlvbnMubWF4Q2h1bmtTaXplIHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5CdWZmZXJTbGljZXIucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spIHtcbiAgdmFyIGVuZCA9IHBvc2l0aW9uICsgbGVuZ3RoO1xuICB2YXIgZGVsdGEgPSBlbmQgLSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gIHZhciB3cml0dGVuID0gKGRlbHRhID4gMCkgPyBkZWx0YSA6IGxlbmd0aDtcbiAgdGhpcy5idWZmZXIuY29weShidWZmZXIsIG9mZnNldCwgcG9zaXRpb24sIGVuZCk7XG4gIHNldEltbWVkaWF0ZShmdW5jdGlvbigpIHtcbiAgICBjYWxsYmFjayhudWxsLCB3cml0dGVuKTtcbiAgfSk7XG59O1xuXG5CdWZmZXJTbGljZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIGJ1ZmZlci5jb3B5KHRoaXMuYnVmZmVyLCBwb3NpdGlvbiwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpO1xuICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgY2FsbGJhY2sobnVsbCwgbGVuZ3RoLCBidWZmZXIpO1xuICB9KTtcbn07XG5cbkJ1ZmZlclNsaWNlci5wcm90b3R5cGUuY3JlYXRlUmVhZFN0cmVhbSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciByZWFkU3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuICByZWFkU3RyZWFtLmRlc3Ryb3llZCA9IGZhbHNlO1xuICByZWFkU3RyZWFtLnN0YXJ0ID0gb3B0aW9ucy5zdGFydCB8fCAwO1xuICByZWFkU3RyZWFtLmVuZE9mZnNldCA9IG9wdGlvbnMuZW5kO1xuICAvLyBieSB0aGUgdGltZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIHdlJ2xsIGJlIGRvbmUuXG4gIHJlYWRTdHJlYW0ucG9zID0gcmVhZFN0cmVhbS5lbmRPZmZzZXQgfHwgdGhpcy5idWZmZXIubGVuZ3RoO1xuXG4gIC8vIHJlc3BlY3QgdGhlIG1heENodW5rU2l6ZSBvcHRpb24gdG8gc2xpY2UgdXAgdGhlIGNodW5rIGludG8gc21hbGxlciBwaWVjZXMuXG4gIHZhciBlbnRpcmVTbGljZSA9IHRoaXMuYnVmZmVyLnNsaWNlKHJlYWRTdHJlYW0uc3RhcnQsIHJlYWRTdHJlYW0ucG9zKTtcbiAgdmFyIG9mZnNldCA9IDA7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG5leHRPZmZzZXQgPSBvZmZzZXQgKyB0aGlzLm1heENodW5rU2l6ZTtcbiAgICBpZiAobmV4dE9mZnNldCA+PSBlbnRpcmVTbGljZS5sZW5ndGgpIHtcbiAgICAgIC8vIGxhc3QgY2h1bmtcbiAgICAgIGlmIChvZmZzZXQgPCBlbnRpcmVTbGljZS5sZW5ndGgpIHtcbiAgICAgICAgcmVhZFN0cmVhbS53cml0ZShlbnRpcmVTbGljZS5zbGljZShvZmZzZXQsIGVudGlyZVNsaWNlLmxlbmd0aCkpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJlYWRTdHJlYW0ud3JpdGUoZW50aXJlU2xpY2Uuc2xpY2Uob2Zmc2V0LCBuZXh0T2Zmc2V0KSk7XG4gICAgb2Zmc2V0ID0gbmV4dE9mZnNldDtcbiAgfVxuXG4gIHJlYWRTdHJlYW0uZW5kKCk7XG4gIHJlYWRTdHJlYW0uZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIHJlYWRTdHJlYW0uZGVzdHJveWVkID0gdHJ1ZTtcbiAgfTtcbiAgcmV0dXJuIHJlYWRTdHJlYW07XG59O1xuXG5CdWZmZXJTbGljZXIucHJvdG90eXBlLmNyZWF0ZVdyaXRlU3RyZWFtID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICB2YXIgYnVmZmVyU2xpY2VyID0gdGhpcztcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB3cml0ZVN0cmVhbSA9IG5ldyBXcml0YWJsZShvcHRpb25zKTtcbiAgd3JpdGVTdHJlYW0uc3RhcnQgPSBvcHRpb25zLnN0YXJ0IHx8IDA7XG4gIHdyaXRlU3RyZWFtLmVuZE9mZnNldCA9IChvcHRpb25zLmVuZCA9PSBudWxsKSA/IHRoaXMuYnVmZmVyLmxlbmd0aCA6ICtvcHRpb25zLmVuZDtcbiAgd3JpdGVTdHJlYW0uYnl0ZXNXcml0dGVuID0gMDtcbiAgd3JpdGVTdHJlYW0ucG9zID0gd3JpdGVTdHJlYW0uc3RhcnQ7XG4gIHdyaXRlU3RyZWFtLmRlc3Ryb3llZCA9IGZhbHNlO1xuICB3cml0ZVN0cmVhbS5fd3JpdGUgPSBmdW5jdGlvbihidWZmZXIsIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgIGlmICh3cml0ZVN0cmVhbS5kZXN0cm95ZWQpIHJldHVybjtcblxuICAgIHZhciBlbmQgPSB3cml0ZVN0cmVhbS5wb3MgKyBidWZmZXIubGVuZ3RoO1xuICAgIGlmIChlbmQgPiB3cml0ZVN0cmVhbS5lbmRPZmZzZXQpIHtcbiAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXCJtYXhpbXVtIGZpbGUgbGVuZ3RoIGV4Y2VlZGVkXCIpO1xuICAgICAgZXJyLmNvZGUgPSAnRVRPT0JJRyc7XG4gICAgICB3cml0ZVN0cmVhbS5kZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYnVmZmVyLmNvcHkoYnVmZmVyU2xpY2VyLmJ1ZmZlciwgd3JpdGVTdHJlYW0ucG9zLCAwLCBidWZmZXIubGVuZ3RoKTtcblxuICAgIHdyaXRlU3RyZWFtLmJ5dGVzV3JpdHRlbiArPSBidWZmZXIubGVuZ3RoO1xuICAgIHdyaXRlU3RyZWFtLnBvcyA9IGVuZDtcbiAgICB3cml0ZVN0cmVhbS5lbWl0KCdwcm9ncmVzcycpO1xuICAgIGNhbGxiYWNrKCk7XG4gIH07XG4gIHdyaXRlU3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICB3cml0ZVN0cmVhbS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9O1xuICByZXR1cm4gd3JpdGVTdHJlYW07XG59O1xuXG5CdWZmZXJTbGljZXIucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJlZkNvdW50ICs9IDE7XG59O1xuXG5CdWZmZXJTbGljZXIucHJvdG90eXBlLnVucmVmID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVmQ291bnQgLT0gMTtcblxuICBpZiAodGhpcy5yZWZDb3VudCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHVucmVmXCIpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVGcm9tQnVmZmVyKGJ1ZmZlciwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IEJ1ZmZlclNsaWNlcihidWZmZXIsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGcm9tRmQoZmQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBGZFNsaWNlcihmZCwgb3B0aW9ucyk7XG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCdncmFjZWZ1bC1mcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCBta2RpcnNTeW5jID0gcmVxdWlyZSgnLi4vbWtkaXJzJykubWtkaXJzU3luY1xuY29uc3QgdXRpbWVzTWlsbGlzU3luYyA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbWVzJykudXRpbWVzTWlsbGlzU3luY1xuY29uc3Qgc3RhdCA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmZ1bmN0aW9uIGNvcHlTeW5jIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgb3B0cyA9IHsgZmlsdGVyOiBvcHRzIH1cbiAgfVxuXG4gIG9wdHMgPSBvcHRzIHx8IHt9XG4gIG9wdHMuY2xvYmJlciA9ICdjbG9iYmVyJyBpbiBvcHRzID8gISFvcHRzLmNsb2JiZXIgOiB0cnVlIC8vIGRlZmF1bHQgdG8gdHJ1ZSBmb3Igbm93XG4gIG9wdHMub3ZlcndyaXRlID0gJ292ZXJ3cml0ZScgaW4gb3B0cyA/ICEhb3B0cy5vdmVyd3JpdGUgOiBvcHRzLmNsb2JiZXIgLy8gb3ZlcndyaXRlIGZhbGxzIGJhY2sgdG8gY2xvYmJlclxuXG4gIC8vIFdhcm4gYWJvdXQgdXNpbmcgcHJlc2VydmVUaW1lc3RhbXBzIG9uIDMyLWJpdCBub2RlXG4gIGlmIChvcHRzLnByZXNlcnZlVGltZXN0YW1wcyAmJiBwcm9jZXNzLmFyY2ggPT09ICdpYTMyJykge1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoXG4gICAgICAnVXNpbmcgdGhlIHByZXNlcnZlVGltZXN0YW1wcyBvcHRpb24gaW4gMzItYml0IG5vZGUgaXMgbm90IHJlY29tbWVuZGVkO1xcblxcbicgK1xuICAgICAgJ1xcdHNlZSBodHRwczovL2dpdGh1Yi5jb20vanByaWNoYXJkc29uL25vZGUtZnMtZXh0cmEvaXNzdWVzLzI2OScsXG4gICAgICAnV2FybmluZycsICdmcy1leHRyYS1XQVJOMDAwMidcbiAgICApXG4gIH1cblxuICBjb25zdCB7IHNyY1N0YXQsIGRlc3RTdGF0IH0gPSBzdGF0LmNoZWNrUGF0aHNTeW5jKHNyYywgZGVzdCwgJ2NvcHknLCBvcHRzKVxuICBzdGF0LmNoZWNrUGFyZW50UGF0aHNTeW5jKHNyYywgc3JjU3RhdCwgZGVzdCwgJ2NvcHknKVxuICBpZiAob3B0cy5maWx0ZXIgJiYgIW9wdHMuZmlsdGVyKHNyYywgZGVzdCkpIHJldHVyblxuICBjb25zdCBkZXN0UGFyZW50ID0gcGF0aC5kaXJuYW1lKGRlc3QpXG4gIGlmICghZnMuZXhpc3RzU3luYyhkZXN0UGFyZW50KSkgbWtkaXJzU3luYyhkZXN0UGFyZW50KVxuICByZXR1cm4gZ2V0U3RhdHMoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdHMgKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgY29uc3Qgc3RhdFN5bmMgPSBvcHRzLmRlcmVmZXJlbmNlID8gZnMuc3RhdFN5bmMgOiBmcy5sc3RhdFN5bmNcbiAgY29uc3Qgc3JjU3RhdCA9IHN0YXRTeW5jKHNyYylcblxuICBpZiAoc3JjU3RhdC5pc0RpcmVjdG9yeSgpKSByZXR1cm4gb25EaXIoc3JjU3RhdCwgZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgZWxzZSBpZiAoc3JjU3RhdC5pc0ZpbGUoKSB8fFxuICAgICAgICAgICBzcmNTdGF0LmlzQ2hhcmFjdGVyRGV2aWNlKCkgfHxcbiAgICAgICAgICAgc3JjU3RhdC5pc0Jsb2NrRGV2aWNlKCkpIHJldHVybiBvbkZpbGUoc3JjU3RhdCwgZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgZWxzZSBpZiAoc3JjU3RhdC5pc1N5bWJvbGljTGluaygpKSByZXR1cm4gb25MaW5rKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG4gIGVsc2UgaWYgKHNyY1N0YXQuaXNTb2NrZXQoKSkgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29weSBhIHNvY2tldCBmaWxlOiAke3NyY31gKVxuICBlbHNlIGlmIChzcmNTdGF0LmlzRklGTygpKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb3B5IGEgRklGTyBwaXBlOiAke3NyY31gKVxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZmlsZTogJHtzcmN9YClcbn1cblxuZnVuY3Rpb24gb25GaWxlIChzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGlmICghZGVzdFN0YXQpIHJldHVybiBjb3B5RmlsZShzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG4gIHJldHVybiBtYXlDb3B5RmlsZShzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG59XG5cbmZ1bmN0aW9uIG1heUNvcHlGaWxlIChzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgaWYgKG9wdHMub3ZlcndyaXRlKSB7XG4gICAgZnMudW5saW5rU3luYyhkZXN0KVxuICAgIHJldHVybiBjb3B5RmlsZShzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG4gIH0gZWxzZSBpZiAob3B0cy5lcnJvck9uRXhpc3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2Rlc3R9JyBhbHJlYWR5IGV4aXN0c2ApXG4gIH1cbn1cblxuZnVuY3Rpb24gY29weUZpbGUgKHNyY1N0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBmcy5jb3B5RmlsZVN5bmMoc3JjLCBkZXN0KVxuICBpZiAob3B0cy5wcmVzZXJ2ZVRpbWVzdGFtcHMpIGhhbmRsZVRpbWVzdGFtcHMoc3JjU3RhdC5tb2RlLCBzcmMsIGRlc3QpXG4gIHJldHVybiBzZXREZXN0TW9kZShkZXN0LCBzcmNTdGF0Lm1vZGUpXG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRpbWVzdGFtcHMgKHNyY01vZGUsIHNyYywgZGVzdCkge1xuICAvLyBNYWtlIHN1cmUgdGhlIGZpbGUgaXMgd3JpdGFibGUgYmVmb3JlIHNldHRpbmcgdGhlIHRpbWVzdGFtcFxuICAvLyBvdGhlcndpc2Ugb3BlbiBmYWlscyB3aXRoIEVQRVJNIHdoZW4gaW52b2tlZCB3aXRoICdyKydcbiAgLy8gKHRocm91Z2ggdXRpbWVzIGNhbGwpXG4gIGlmIChmaWxlSXNOb3RXcml0YWJsZShzcmNNb2RlKSkgbWFrZUZpbGVXcml0YWJsZShkZXN0LCBzcmNNb2RlKVxuICByZXR1cm4gc2V0RGVzdFRpbWVzdGFtcHMoc3JjLCBkZXN0KVxufVxuXG5mdW5jdGlvbiBmaWxlSXNOb3RXcml0YWJsZSAoc3JjTW9kZSkge1xuICByZXR1cm4gKHNyY01vZGUgJiAwbzIwMCkgPT09IDBcbn1cblxuZnVuY3Rpb24gbWFrZUZpbGVXcml0YWJsZSAoZGVzdCwgc3JjTW9kZSkge1xuICByZXR1cm4gc2V0RGVzdE1vZGUoZGVzdCwgc3JjTW9kZSB8IDBvMjAwKVxufVxuXG5mdW5jdGlvbiBzZXREZXN0TW9kZSAoZGVzdCwgc3JjTW9kZSkge1xuICByZXR1cm4gZnMuY2htb2RTeW5jKGRlc3QsIHNyY01vZGUpXG59XG5cbmZ1bmN0aW9uIHNldERlc3RUaW1lc3RhbXBzIChzcmMsIGRlc3QpIHtcbiAgLy8gVGhlIGluaXRpYWwgc3JjU3RhdC5hdGltZSBjYW5ub3QgYmUgdHJ1c3RlZFxuICAvLyBiZWNhdXNlIGl0IGlzIG1vZGlmaWVkIGJ5IHRoZSByZWFkKDIpIHN5c3RlbSBjYWxsXG4gIC8vIChTZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX3N0YXRfdGltZV92YWx1ZXMpXG4gIGNvbnN0IHVwZGF0ZWRTcmNTdGF0ID0gZnMuc3RhdFN5bmMoc3JjKVxuICByZXR1cm4gdXRpbWVzTWlsbGlzU3luYyhkZXN0LCB1cGRhdGVkU3JjU3RhdC5hdGltZSwgdXBkYXRlZFNyY1N0YXQubXRpbWUpXG59XG5cbmZ1bmN0aW9uIG9uRGlyIChzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGlmICghZGVzdFN0YXQpIHJldHVybiBta0RpckFuZENvcHkoc3JjU3RhdC5tb2RlLCBzcmMsIGRlc3QsIG9wdHMpXG4gIHJldHVybiBjb3B5RGlyKHNyYywgZGVzdCwgb3B0cylcbn1cblxuZnVuY3Rpb24gbWtEaXJBbmRDb3B5IChzcmNNb2RlLCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgZnMubWtkaXJTeW5jKGRlc3QpXG4gIGNvcHlEaXIoc3JjLCBkZXN0LCBvcHRzKVxuICByZXR1cm4gc2V0RGVzdE1vZGUoZGVzdCwgc3JjTW9kZSlcbn1cblxuZnVuY3Rpb24gY29weURpciAoc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGZzLnJlYWRkaXJTeW5jKHNyYykuZm9yRWFjaChpdGVtID0+IGNvcHlEaXJJdGVtKGl0ZW0sIHNyYywgZGVzdCwgb3B0cykpXG59XG5cbmZ1bmN0aW9uIGNvcHlEaXJJdGVtIChpdGVtLCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgY29uc3Qgc3JjSXRlbSA9IHBhdGguam9pbihzcmMsIGl0ZW0pXG4gIGNvbnN0IGRlc3RJdGVtID0gcGF0aC5qb2luKGRlc3QsIGl0ZW0pXG4gIGlmIChvcHRzLmZpbHRlciAmJiAhb3B0cy5maWx0ZXIoc3JjSXRlbSwgZGVzdEl0ZW0pKSByZXR1cm5cbiAgY29uc3QgeyBkZXN0U3RhdCB9ID0gc3RhdC5jaGVja1BhdGhzU3luYyhzcmNJdGVtLCBkZXN0SXRlbSwgJ2NvcHknLCBvcHRzKVxuICByZXR1cm4gZ2V0U3RhdHMoZGVzdFN0YXQsIHNyY0l0ZW0sIGRlc3RJdGVtLCBvcHRzKVxufVxuXG5mdW5jdGlvbiBvbkxpbmsgKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgbGV0IHJlc29sdmVkU3JjID0gZnMucmVhZGxpbmtTeW5jKHNyYylcbiAgaWYgKG9wdHMuZGVyZWZlcmVuY2UpIHtcbiAgICByZXNvbHZlZFNyYyA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlZFNyYylcbiAgfVxuXG4gIGlmICghZGVzdFN0YXQpIHtcbiAgICByZXR1cm4gZnMuc3ltbGlua1N5bmMocmVzb2x2ZWRTcmMsIGRlc3QpXG4gIH0gZWxzZSB7XG4gICAgbGV0IHJlc29sdmVkRGVzdFxuICAgIHRyeSB7XG4gICAgICByZXNvbHZlZERlc3QgPSBmcy5yZWFkbGlua1N5bmMoZGVzdClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGRlc3QgZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZSBvciBkaXJlY3RvcnksXG4gICAgICAvLyBXaW5kb3dzIG1heSB0aHJvdyBVTktOT1dOIGVycm9yLiBJZiBkZXN0IGFscmVhZHkgZXhpc3RzLFxuICAgICAgLy8gZnMgdGhyb3dzIGVycm9yIGFueXdheSwgc28gbm8gbmVlZCB0byBndWFyZCBhZ2FpbnN0IGl0IGhlcmUuXG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFSU5WQUwnIHx8IGVyci5jb2RlID09PSAnVU5LTk9XTicpIHJldHVybiBmcy5zeW1saW5rU3luYyhyZXNvbHZlZFNyYywgZGVzdClcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBpZiAob3B0cy5kZXJlZmVyZW5jZSkge1xuICAgICAgcmVzb2x2ZWREZXN0ID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkRGVzdClcbiAgICB9XG4gICAgaWYgKHN0YXQuaXNTcmNTdWJkaXIocmVzb2x2ZWRTcmMsIHJlc29sdmVkRGVzdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgJyR7cmVzb2x2ZWRTcmN9JyB0byBhIHN1YmRpcmVjdG9yeSBvZiBpdHNlbGYsICcke3Jlc29sdmVkRGVzdH0nLmApXG4gICAgfVxuXG4gICAgLy8gcHJldmVudCBjb3B5IGlmIHNyYyBpcyBhIHN1YmRpciBvZiBkZXN0IHNpbmNlIHVubGlua2luZ1xuICAgIC8vIGRlc3QgaW4gdGhpcyBjYXNlIHdvdWxkIHJlc3VsdCBpbiByZW1vdmluZyBzcmMgY29udGVudHNcbiAgICAvLyBhbmQgdGhlcmVmb3JlIGEgYnJva2VuIHN5bWxpbmsgd291bGQgYmUgY3JlYXRlZC5cbiAgICBpZiAoc3RhdC5pc1NyY1N1YmRpcihyZXNvbHZlZERlc3QsIHJlc29sdmVkU3JjKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3ZlcndyaXRlICcke3Jlc29sdmVkRGVzdH0nIHdpdGggJyR7cmVzb2x2ZWRTcmN9Jy5gKVxuICAgIH1cbiAgICByZXR1cm4gY29weUxpbmsocmVzb2x2ZWRTcmMsIGRlc3QpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29weUxpbmsgKHJlc29sdmVkU3JjLCBkZXN0KSB7XG4gIGZzLnVubGlua1N5bmMoZGVzdClcbiAgcmV0dXJuIGZzLnN5bWxpbmtTeW5jKHJlc29sdmVkU3JjLCBkZXN0KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvcHlTeW5jXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCB7IG1rZGlycyB9ID0gcmVxdWlyZSgnLi4vbWtkaXJzJylcbmNvbnN0IHsgcGF0aEV4aXN0cyB9ID0gcmVxdWlyZSgnLi4vcGF0aC1leGlzdHMnKVxuY29uc3QgeyB1dGltZXNNaWxsaXMgfSA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbWVzJylcbmNvbnN0IHN0YXQgPSByZXF1aXJlKCcuLi91dGlsL3N0YXQnKVxuXG5hc3luYyBmdW5jdGlvbiBjb3B5IChzcmMsIGRlc3QsIG9wdHMgPSB7fSkge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvcHRzID0geyBmaWx0ZXI6IG9wdHMgfVxuICB9XG5cbiAgb3B0cy5jbG9iYmVyID0gJ2Nsb2JiZXInIGluIG9wdHMgPyAhIW9wdHMuY2xvYmJlciA6IHRydWUgLy8gZGVmYXVsdCB0byB0cnVlIGZvciBub3dcbiAgb3B0cy5vdmVyd3JpdGUgPSAnb3ZlcndyaXRlJyBpbiBvcHRzID8gISFvcHRzLm92ZXJ3cml0ZSA6IG9wdHMuY2xvYmJlciAvLyBvdmVyd3JpdGUgZmFsbHMgYmFjayB0byBjbG9iYmVyXG5cbiAgLy8gV2FybiBhYm91dCB1c2luZyBwcmVzZXJ2ZVRpbWVzdGFtcHMgb24gMzItYml0IG5vZGVcbiAgaWYgKG9wdHMucHJlc2VydmVUaW1lc3RhbXBzICYmIHByb2Nlc3MuYXJjaCA9PT0gJ2lhMzInKSB7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhcbiAgICAgICdVc2luZyB0aGUgcHJlc2VydmVUaW1lc3RhbXBzIG9wdGlvbiBpbiAzMi1iaXQgbm9kZSBpcyBub3QgcmVjb21tZW5kZWQ7XFxuXFxuJyArXG4gICAgICAnXFx0c2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcHJpY2hhcmRzb24vbm9kZS1mcy1leHRyYS9pc3N1ZXMvMjY5JyxcbiAgICAgICdXYXJuaW5nJywgJ2ZzLWV4dHJhLVdBUk4wMDAxJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IHsgc3JjU3RhdCwgZGVzdFN0YXQgfSA9IGF3YWl0IHN0YXQuY2hlY2tQYXRocyhzcmMsIGRlc3QsICdjb3B5Jywgb3B0cylcblxuICBhd2FpdCBzdGF0LmNoZWNrUGFyZW50UGF0aHMoc3JjLCBzcmNTdGF0LCBkZXN0LCAnY29weScpXG5cbiAgY29uc3QgaW5jbHVkZSA9IGF3YWl0IHJ1bkZpbHRlcihzcmMsIGRlc3QsIG9wdHMpXG5cbiAgaWYgKCFpbmNsdWRlKSByZXR1cm5cblxuICAvLyBjaGVjayBpZiB0aGUgcGFyZW50IG9mIGRlc3QgZXhpc3RzLCBhbmQgY3JlYXRlIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgY29uc3QgZGVzdFBhcmVudCA9IHBhdGguZGlybmFtZShkZXN0KVxuICBjb25zdCBkaXJFeGlzdHMgPSBhd2FpdCBwYXRoRXhpc3RzKGRlc3RQYXJlbnQpXG4gIGlmICghZGlyRXhpc3RzKSB7XG4gICAgYXdhaXQgbWtkaXJzKGRlc3RQYXJlbnQpXG4gIH1cblxuICBhd2FpdCBnZXRTdGF0c0FuZFBlcmZvcm1Db3B5KGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkZpbHRlciAoc3JjLCBkZXN0LCBvcHRzKSB7XG4gIGlmICghb3B0cy5maWx0ZXIpIHJldHVybiB0cnVlXG4gIHJldHVybiBvcHRzLmZpbHRlcihzcmMsIGRlc3QpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFN0YXRzQW5kUGVyZm9ybUNvcHkgKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgY29uc3Qgc3RhdEZuID0gb3B0cy5kZXJlZmVyZW5jZSA/IGZzLnN0YXQgOiBmcy5sc3RhdFxuICBjb25zdCBzcmNTdGF0ID0gYXdhaXQgc3RhdEZuKHNyYylcblxuICBpZiAoc3JjU3RhdC5pc0RpcmVjdG9yeSgpKSByZXR1cm4gb25EaXIoc3JjU3RhdCwgZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcblxuICBpZiAoXG4gICAgc3JjU3RhdC5pc0ZpbGUoKSB8fFxuICAgIHNyY1N0YXQuaXNDaGFyYWN0ZXJEZXZpY2UoKSB8fFxuICAgIHNyY1N0YXQuaXNCbG9ja0RldmljZSgpXG4gICkgcmV0dXJuIG9uRmlsZShzcmNTdGF0LCBkZXN0U3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuXG4gIGlmIChzcmNTdGF0LmlzU3ltYm9saWNMaW5rKCkpIHJldHVybiBvbkxpbmsoZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cylcbiAgaWYgKHNyY1N0YXQuaXNTb2NrZXQoKSkgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29weSBhIHNvY2tldCBmaWxlOiAke3NyY31gKVxuICBpZiAoc3JjU3RhdC5pc0ZJRk8oKSkgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29weSBhIEZJRk8gcGlwZTogJHtzcmN9YClcbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpbGU6ICR7c3JjfWApXG59XG5cbmFzeW5jIGZ1bmN0aW9uIG9uRmlsZSAoc3JjU3RhdCwgZGVzdFN0YXQsIHNyYywgZGVzdCwgb3B0cykge1xuICBpZiAoIWRlc3RTdGF0KSByZXR1cm4gY29weUZpbGUoc3JjU3RhdCwgc3JjLCBkZXN0LCBvcHRzKVxuXG4gIGlmIChvcHRzLm92ZXJ3cml0ZSkge1xuICAgIGF3YWl0IGZzLnVubGluayhkZXN0KVxuICAgIHJldHVybiBjb3B5RmlsZShzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpXG4gIH1cbiAgaWYgKG9wdHMuZXJyb3JPbkV4aXN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHtkZXN0fScgYWxyZWFkeSBleGlzdHNgKVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcHlGaWxlIChzcmNTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgYXdhaXQgZnMuY29weUZpbGUoc3JjLCBkZXN0KVxuICBpZiAob3B0cy5wcmVzZXJ2ZVRpbWVzdGFtcHMpIHtcbiAgICAvLyBNYWtlIHN1cmUgdGhlIGZpbGUgaXMgd3JpdGFibGUgYmVmb3JlIHNldHRpbmcgdGhlIHRpbWVzdGFtcFxuICAgIC8vIG90aGVyd2lzZSBvcGVuIGZhaWxzIHdpdGggRVBFUk0gd2hlbiBpbnZva2VkIHdpdGggJ3IrJ1xuICAgIC8vICh0aHJvdWdoIHV0aW1lcyBjYWxsKVxuICAgIGlmIChmaWxlSXNOb3RXcml0YWJsZShzcmNTdGF0Lm1vZGUpKSB7XG4gICAgICBhd2FpdCBtYWtlRmlsZVdyaXRhYmxlKGRlc3QsIHNyY1N0YXQubW9kZSlcbiAgICB9XG5cbiAgICAvLyBTZXQgdGltZXN0YW1wcyBhbmQgbW9kZSBjb3JyZXNwb25kaW5nbHlcblxuICAgIC8vIE5vdGUgdGhhdCBUaGUgaW5pdGlhbCBzcmNTdGF0LmF0aW1lIGNhbm5vdCBiZSB0cnVzdGVkXG4gICAgLy8gYmVjYXVzZSBpdCBpcyBtb2RpZmllZCBieSB0aGUgcmVhZCgyKSBzeXN0ZW0gY2FsbFxuICAgIC8vIChTZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9mcy5odG1sI2ZzX3N0YXRfdGltZV92YWx1ZXMpXG4gICAgY29uc3QgdXBkYXRlZFNyY1N0YXQgPSBhd2FpdCBmcy5zdGF0KHNyYylcbiAgICBhd2FpdCB1dGltZXNNaWxsaXMoZGVzdCwgdXBkYXRlZFNyY1N0YXQuYXRpbWUsIHVwZGF0ZWRTcmNTdGF0Lm10aW1lKVxuICB9XG5cbiAgcmV0dXJuIGZzLmNobW9kKGRlc3QsIHNyY1N0YXQubW9kZSlcbn1cblxuZnVuY3Rpb24gZmlsZUlzTm90V3JpdGFibGUgKHNyY01vZGUpIHtcbiAgcmV0dXJuIChzcmNNb2RlICYgMG8yMDApID09PSAwXG59XG5cbmZ1bmN0aW9uIG1ha2VGaWxlV3JpdGFibGUgKGRlc3QsIHNyY01vZGUpIHtcbiAgcmV0dXJuIGZzLmNobW9kKGRlc3QsIHNyY01vZGUgfCAwbzIwMClcbn1cblxuYXN5bmMgZnVuY3Rpb24gb25EaXIgKHNyY1N0YXQsIGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgLy8gdGhlIGRlc3QgZGlyZWN0b3J5IG1pZ2h0IG5vdCBleGlzdCwgY3JlYXRlIGl0XG4gIGlmICghZGVzdFN0YXQpIHtcbiAgICBhd2FpdCBmcy5ta2RpcihkZXN0KVxuICB9XG5cbiAgY29uc3QgaXRlbXMgPSBhd2FpdCBmcy5yZWFkZGlyKHNyYylcblxuICAvLyBsb29wIHRocm91Z2ggdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0byBjb3B5IGV2ZXJ5dGhpbmdcbiAgYXdhaXQgUHJvbWlzZS5hbGwoaXRlbXMubWFwKGFzeW5jIGl0ZW0gPT4ge1xuICAgIGNvbnN0IHNyY0l0ZW0gPSBwYXRoLmpvaW4oc3JjLCBpdGVtKVxuICAgIGNvbnN0IGRlc3RJdGVtID0gcGF0aC5qb2luKGRlc3QsIGl0ZW0pXG5cbiAgICAvLyBza2lwIHRoZSBpdGVtIGlmIGl0IGlzIG1hdGNoZXMgYnkgdGhlIGZpbHRlciBmdW5jdGlvblxuICAgIGNvbnN0IGluY2x1ZGUgPSBhd2FpdCBydW5GaWx0ZXIoc3JjSXRlbSwgZGVzdEl0ZW0sIG9wdHMpXG4gICAgaWYgKCFpbmNsdWRlKSByZXR1cm5cblxuICAgIGNvbnN0IHsgZGVzdFN0YXQgfSA9IGF3YWl0IHN0YXQuY2hlY2tQYXRocyhzcmNJdGVtLCBkZXN0SXRlbSwgJ2NvcHknLCBvcHRzKVxuXG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgYSBjb3B5YWJsZSBmaWxlLCBgZ2V0U3RhdHNBbmRQZXJmb3JtQ29weWAgd2lsbCBjb3B5IGl0XG4gICAgLy8gSWYgdGhlIGl0ZW0gaXMgYSBkaXJlY3RvcnksIGBnZXRTdGF0c0FuZFBlcmZvcm1Db3B5YCB3aWxsIGNhbGwgYG9uRGlyYCByZWN1cnNpdmVseVxuICAgIHJldHVybiBnZXRTdGF0c0FuZFBlcmZvcm1Db3B5KGRlc3RTdGF0LCBzcmNJdGVtLCBkZXN0SXRlbSwgb3B0cylcbiAgfSkpXG5cbiAgaWYgKCFkZXN0U3RhdCkge1xuICAgIGF3YWl0IGZzLmNobW9kKGRlc3QsIHNyY1N0YXQubW9kZSlcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBvbkxpbmsgKGRlc3RTdGF0LCBzcmMsIGRlc3QsIG9wdHMpIHtcbiAgbGV0IHJlc29sdmVkU3JjID0gYXdhaXQgZnMucmVhZGxpbmsoc3JjKVxuICBpZiAob3B0cy5kZXJlZmVyZW5jZSkge1xuICAgIHJlc29sdmVkU3JjID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkU3JjKVxuICB9XG4gIGlmICghZGVzdFN0YXQpIHtcbiAgICByZXR1cm4gZnMuc3ltbGluayhyZXNvbHZlZFNyYywgZGVzdClcbiAgfVxuXG4gIGxldCByZXNvbHZlZERlc3QgPSBudWxsXG4gIHRyeSB7XG4gICAgcmVzb2x2ZWREZXN0ID0gYXdhaXQgZnMucmVhZGxpbmsoZGVzdClcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGRlc3QgZXhpc3RzIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZSBvciBkaXJlY3RvcnksXG4gICAgLy8gV2luZG93cyBtYXkgdGhyb3cgVU5LTk9XTiBlcnJvci4gSWYgZGVzdCBhbHJlYWR5IGV4aXN0cyxcbiAgICAvLyBmcyB0aHJvd3MgZXJyb3IgYW55d2F5LCBzbyBubyBuZWVkIHRvIGd1YXJkIGFnYWluc3QgaXQgaGVyZS5cbiAgICBpZiAoZS5jb2RlID09PSAnRUlOVkFMJyB8fCBlLmNvZGUgPT09ICdVTktOT1dOJykgcmV0dXJuIGZzLnN5bWxpbmsocmVzb2x2ZWRTcmMsIGRlc3QpXG4gICAgdGhyb3cgZVxuICB9XG4gIGlmIChvcHRzLmRlcmVmZXJlbmNlKSB7XG4gICAgcmVzb2x2ZWREZXN0ID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmVkRGVzdClcbiAgfVxuICBpZiAoc3RhdC5pc1NyY1N1YmRpcihyZXNvbHZlZFNyYywgcmVzb2x2ZWREZXN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvcHkgJyR7cmVzb2x2ZWRTcmN9JyB0byBhIHN1YmRpcmVjdG9yeSBvZiBpdHNlbGYsICcke3Jlc29sdmVkRGVzdH0nLmApXG4gIH1cblxuICAvLyBkbyBub3QgY29weSBpZiBzcmMgaXMgYSBzdWJkaXIgb2YgZGVzdCBzaW5jZSB1bmxpbmtpbmdcbiAgLy8gZGVzdCBpbiB0aGlzIGNhc2Ugd291bGQgcmVzdWx0IGluIHJlbW92aW5nIHNyYyBjb250ZW50c1xuICAvLyBhbmQgdGhlcmVmb3JlIGEgYnJva2VuIHN5bWxpbmsgd291bGQgYmUgY3JlYXRlZC5cbiAgaWYgKHN0YXQuaXNTcmNTdWJkaXIocmVzb2x2ZWREZXN0LCByZXNvbHZlZFNyYykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgJyR7cmVzb2x2ZWREZXN0fScgd2l0aCAnJHtyZXNvbHZlZFNyY30nLmApXG4gIH1cblxuICAvLyBjb3B5IHRoZSBsaW5rXG4gIGF3YWl0IGZzLnVubGluayhkZXN0KVxuICByZXR1cm4gZnMuc3ltbGluayhyZXNvbHZlZFNyYywgZGVzdClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb3B5XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29weTogdShyZXF1aXJlKCcuL2NvcHknKSksXG4gIGNvcHlTeW5jOiByZXF1aXJlKCcuL2NvcHktc3luYycpXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IG1rZGlyID0gcmVxdWlyZSgnLi4vbWtkaXJzJylcbmNvbnN0IHJlbW92ZSA9IHJlcXVpcmUoJy4uL3JlbW92ZScpXG5cbmNvbnN0IGVtcHR5RGlyID0gdShhc3luYyBmdW5jdGlvbiBlbXB0eURpciAoZGlyKSB7XG4gIGxldCBpdGVtc1xuICB0cnkge1xuICAgIGl0ZW1zID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBta2Rpci5ta2RpcnMoZGlyKVxuICB9XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKGl0ZW1zLm1hcChpdGVtID0+IHJlbW92ZS5yZW1vdmUocGF0aC5qb2luKGRpciwgaXRlbSkpKSlcbn0pXG5cbmZ1bmN0aW9uIGVtcHR5RGlyU3luYyAoZGlyKSB7XG4gIGxldCBpdGVtc1xuICB0cnkge1xuICAgIGl0ZW1zID0gZnMucmVhZGRpclN5bmMoZGlyKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbWtkaXIubWtkaXJzU3luYyhkaXIpXG4gIH1cblxuICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIGl0ZW0gPSBwYXRoLmpvaW4oZGlyLCBpdGVtKVxuICAgIHJlbW92ZS5yZW1vdmVTeW5jKGl0ZW0pXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBlbXB0eURpclN5bmMsXG4gIGVtcHR5ZGlyU3luYzogZW1wdHlEaXJTeW5jLFxuICBlbXB0eURpcixcbiAgZW1wdHlkaXI6IGVtcHR5RGlyXG59XG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcbmNvbnN0IG1rZGlyID0gcmVxdWlyZSgnLi4vbWtkaXJzJylcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlRmlsZSAoZmlsZSkge1xuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZSlcbiAgfSBjYXRjaCB7IH1cbiAgaWYgKHN0YXRzICYmIHN0YXRzLmlzRmlsZSgpKSByZXR1cm5cblxuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZmlsZSlcblxuICBsZXQgZGlyU3RhdHMgPSBudWxsXG4gIHRyeSB7XG4gICAgZGlyU3RhdHMgPSBhd2FpdCBmcy5zdGF0KGRpcilcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gaWYgdGhlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBtYWtlIGl0XG4gICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgYXdhaXQgbWtkaXIubWtkaXJzKGRpcilcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlLCAnJylcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cblxuICBpZiAoZGlyU3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlLCAnJylcbiAgfSBlbHNlIHtcbiAgICAvLyBwYXJlbnQgaXMgbm90IGEgZGlyZWN0b3J5XG4gICAgLy8gVGhpcyBpcyBqdXN0IHRvIGNhdXNlIGFuIGludGVybmFsIEVOT1RESVIgZXJyb3IgdG8gYmUgdGhyb3duXG4gICAgYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRmlsZVN5bmMgKGZpbGUpIHtcbiAgbGV0IHN0YXRzXG4gIHRyeSB7XG4gICAgc3RhdHMgPSBmcy5zdGF0U3luYyhmaWxlKVxuICB9IGNhdGNoIHsgfVxuICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNGaWxlKCkpIHJldHVyblxuXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShmaWxlKVxuICB0cnkge1xuICAgIGlmICghZnMuc3RhdFN5bmMoZGlyKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAvLyBwYXJlbnQgaXMgbm90IGEgZGlyZWN0b3J5XG4gICAgICAvLyBUaGlzIGlzIGp1c3QgdG8gY2F1c2UgYW4gaW50ZXJuYWwgRU5PVERJUiBlcnJvciB0byBiZSB0aHJvd25cbiAgICAgIGZzLnJlYWRkaXJTeW5jKGRpcilcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIElmIHRoZSBzdGF0IGNhbGwgYWJvdmUgZmFpbGVkIGJlY2F1c2UgdGhlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgaXRcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRU5PRU5UJykgbWtkaXIubWtkaXJzU3luYyhkaXIpXG4gICAgZWxzZSB0aHJvdyBlcnJcbiAgfVxuXG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgJycpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGVGaWxlOiB1KGNyZWF0ZUZpbGUpLFxuICBjcmVhdGVGaWxlU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgY3JlYXRlRmlsZSwgY3JlYXRlRmlsZVN5bmMgfSA9IHJlcXVpcmUoJy4vZmlsZScpXG5jb25zdCB7IGNyZWF0ZUxpbmssIGNyZWF0ZUxpbmtTeW5jIH0gPSByZXF1aXJlKCcuL2xpbmsnKVxuY29uc3QgeyBjcmVhdGVTeW1saW5rLCBjcmVhdGVTeW1saW5rU3luYyB9ID0gcmVxdWlyZSgnLi9zeW1saW5rJylcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIGZpbGVcbiAgY3JlYXRlRmlsZSxcbiAgY3JlYXRlRmlsZVN5bmMsXG4gIGVuc3VyZUZpbGU6IGNyZWF0ZUZpbGUsXG4gIGVuc3VyZUZpbGVTeW5jOiBjcmVhdGVGaWxlU3luYyxcbiAgLy8gbGlua1xuICBjcmVhdGVMaW5rLFxuICBjcmVhdGVMaW5rU3luYyxcbiAgZW5zdXJlTGluazogY3JlYXRlTGluayxcbiAgZW5zdXJlTGlua1N5bmM6IGNyZWF0ZUxpbmtTeW5jLFxuICAvLyBzeW1saW5rXG4gIGNyZWF0ZVN5bWxpbmssXG4gIGNyZWF0ZVN5bWxpbmtTeW5jLFxuICBlbnN1cmVTeW1saW5rOiBjcmVhdGVTeW1saW5rLFxuICBlbnN1cmVTeW1saW5rU3luYzogY3JlYXRlU3ltbGlua1N5bmNcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgbWtkaXIgPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuY29uc3QgeyBwYXRoRXhpc3RzIH0gPSByZXF1aXJlKCcuLi9wYXRoLWV4aXN0cycpXG5jb25zdCB7IGFyZUlkZW50aWNhbCB9ID0gcmVxdWlyZSgnLi4vdXRpbC9zdGF0JylcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlTGluayAoc3JjcGF0aCwgZHN0cGF0aCkge1xuICBsZXQgZHN0U3RhdFxuICB0cnkge1xuICAgIGRzdFN0YXQgPSBhd2FpdCBmcy5sc3RhdChkc3RwYXRoKVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgZXJyb3JcbiAgfVxuXG4gIGxldCBzcmNTdGF0XG4gIHRyeSB7XG4gICAgc3JjU3RhdCA9IGF3YWl0IGZzLmxzdGF0KHNyY3BhdGgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVyci5tZXNzYWdlID0gZXJyLm1lc3NhZ2UucmVwbGFjZSgnbHN0YXQnLCAnZW5zdXJlTGluaycpXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICBpZiAoZHN0U3RhdCAmJiBhcmVJZGVudGljYWwoc3JjU3RhdCwgZHN0U3RhdCkpIHJldHVyblxuXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShkc3RwYXRoKVxuXG4gIGNvbnN0IGRpckV4aXN0cyA9IGF3YWl0IHBhdGhFeGlzdHMoZGlyKVxuXG4gIGlmICghZGlyRXhpc3RzKSB7XG4gICAgYXdhaXQgbWtkaXIubWtkaXJzKGRpcilcbiAgfVxuXG4gIGF3YWl0IGZzLmxpbmsoc3JjcGF0aCwgZHN0cGF0aClcbn1cblxuZnVuY3Rpb24gY3JlYXRlTGlua1N5bmMgKHNyY3BhdGgsIGRzdHBhdGgpIHtcbiAgbGV0IGRzdFN0YXRcbiAgdHJ5IHtcbiAgICBkc3RTdGF0ID0gZnMubHN0YXRTeW5jKGRzdHBhdGgpXG4gIH0gY2F0Y2gge31cblxuICB0cnkge1xuICAgIGNvbnN0IHNyY1N0YXQgPSBmcy5sc3RhdFN5bmMoc3JjcGF0aClcbiAgICBpZiAoZHN0U3RhdCAmJiBhcmVJZGVudGljYWwoc3JjU3RhdCwgZHN0U3RhdCkpIHJldHVyblxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlLnJlcGxhY2UoJ2xzdGF0JywgJ2Vuc3VyZUxpbmsnKVxuICAgIHRocm93IGVyclxuICB9XG5cbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKGRzdHBhdGgpXG4gIGNvbnN0IGRpckV4aXN0cyA9IGZzLmV4aXN0c1N5bmMoZGlyKVxuICBpZiAoZGlyRXhpc3RzKSByZXR1cm4gZnMubGlua1N5bmMoc3JjcGF0aCwgZHN0cGF0aClcbiAgbWtkaXIubWtkaXJzU3luYyhkaXIpXG5cbiAgcmV0dXJuIGZzLmxpbmtTeW5jKHNyY3BhdGgsIGRzdHBhdGgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGVMaW5rOiB1KGNyZWF0ZUxpbmspLFxuICBjcmVhdGVMaW5rU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgeyBwYXRoRXhpc3RzIH0gPSByZXF1aXJlKCcuLi9wYXRoLWV4aXN0cycpXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0d28gdHlwZXMgb2YgcGF0aHMsIG9uZSByZWxhdGl2ZSB0byBzeW1saW5rLCBhbmQgb25lXG4gKiByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gQ2hlY2tzIGlmIHBhdGggaXMgYWJzb2x1dGUgb3JcbiAqIHJlbGF0aXZlLiBJZiB0aGUgcGF0aCBpcyByZWxhdGl2ZSwgdGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIHBhdGggaXNcbiAqIHJlbGF0aXZlIHRvIHN5bWxpbmsgb3IgcmVsYXRpdmUgdG8gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gVGhpcyBpcyBhblxuICogaW5pdGlhdGl2ZSB0byBmaW5kIGEgc21hcnRlciBgc3JjcGF0aGAgdG8gc3VwcGx5IHdoZW4gYnVpbGRpbmcgc3ltbGlua3MuXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gZGV0ZXJtaW5lIHdoaWNoIHBhdGggdG8gdXNlIG91dCBvZiBvbmUgb2YgdGhyZWUgcG9zc2libGVcbiAqIHR5cGVzIG9mIHNvdXJjZSBwYXRocy4gVGhlIGZpcnN0IGlzIGFuIGFic29sdXRlIHBhdGguIFRoaXMgaXMgZGV0ZWN0ZWQgYnlcbiAqIGBwYXRoLmlzQWJzb2x1dGUoKWAuIFdoZW4gYW4gYWJzb2x1dGUgcGF0aCBpcyBwcm92aWRlZCwgaXQgaXMgY2hlY2tlZCB0b1xuICogc2VlIGlmIGl0IGV4aXN0cy4gSWYgaXQgZG9lcyBpdCdzIHVzZWQsIGlmIG5vdCBhbiBlcnJvciBpcyByZXR1cm5lZFxuICogKGNhbGxiYWNrKS8gdGhyb3duIChzeW5jKS4gVGhlIG90aGVyIHR3byBvcHRpb25zIGZvciBgc3JjcGF0aGAgYXJlIGFcbiAqIHJlbGF0aXZlIHVybC4gQnkgZGVmYXVsdCBOb2RlJ3MgYGZzLnN5bWxpbmtgIHdvcmtzIGJ5IGNyZWF0aW5nIGEgc3ltbGlua1xuICogdXNpbmcgYGRzdHBhdGhgIGFuZCBleHBlY3RzIHRoZSBgc3JjcGF0aGAgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIG5ld2x5XG4gKiBjcmVhdGVkIHN5bWxpbmsuIElmIHlvdSBwcm92aWRlIGEgYHNyY3BhdGhgIHRoYXQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGZpbGVcbiAqIHN5c3RlbSBpdCByZXN1bHRzIGluIGEgYnJva2VuIHN5bWxpbmsuIFRvIG1pbmltaXplIHRoaXMsIHRoZSBmdW5jdGlvblxuICogY2hlY2tzIHRvIHNlZSBpZiB0aGUgJ3JlbGF0aXZlIHRvIHN5bWxpbmsnIHNvdXJjZSBmaWxlIGV4aXN0cywgYW5kIGlmIGl0XG4gKiBkb2VzIGl0IHdpbGwgdXNlIGl0LiBJZiBpdCBkb2VzIG5vdCwgaXQgY2hlY2tzIGlmIHRoZXJlJ3MgYSBmaWxlIHRoYXRcbiAqIGV4aXN0cyB0aGF0IGlzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBpZiBkb2VzIGl0cyB1c2VkLlxuICogVGhpcyBwcmVzZXJ2ZXMgdGhlIGV4cGVjdGF0aW9ucyBvZiB0aGUgb3JpZ2luYWwgZnMuc3ltbGluayBzcGVjIGFuZCBhZGRzXG4gKiB0aGUgYWJpbGl0eSB0byBwYXNzIGluIGByZWxhdGl2ZSB0byBjdXJyZW50IHdvcmtpbmcgZGlyZWNvdHJ5YCBwYXRocy5cbiAqL1xuXG5hc3luYyBmdW5jdGlvbiBzeW1saW5rUGF0aHMgKHNyY3BhdGgsIGRzdHBhdGgpIHtcbiAgaWYgKHBhdGguaXNBYnNvbHV0ZShzcmNwYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5sc3RhdChzcmNwYXRoKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZXJyLm1lc3NhZ2UgPSBlcnIubWVzc2FnZS5yZXBsYWNlKCdsc3RhdCcsICdlbnN1cmVTeW1saW5rJylcbiAgICAgIHRocm93IGVyclxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0b0N3ZDogc3JjcGF0aCxcbiAgICAgIHRvRHN0OiBzcmNwYXRoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZHN0ZGlyID0gcGF0aC5kaXJuYW1lKGRzdHBhdGgpXG4gIGNvbnN0IHJlbGF0aXZlVG9Ec3QgPSBwYXRoLmpvaW4oZHN0ZGlyLCBzcmNwYXRoKVxuXG4gIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHBhdGhFeGlzdHMocmVsYXRpdmVUb0RzdClcbiAgaWYgKGV4aXN0cykge1xuICAgIHJldHVybiB7XG4gICAgICB0b0N3ZDogcmVsYXRpdmVUb0RzdCxcbiAgICAgIHRvRHN0OiBzcmNwYXRoXG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5sc3RhdChzcmNwYXRoKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnIubWVzc2FnZSA9IGVyci5tZXNzYWdlLnJlcGxhY2UoJ2xzdGF0JywgJ2Vuc3VyZVN5bWxpbmsnKVxuICAgIHRocm93IGVyclxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b0N3ZDogc3JjcGF0aCxcbiAgICB0b0RzdDogcGF0aC5yZWxhdGl2ZShkc3RkaXIsIHNyY3BhdGgpXG4gIH1cbn1cblxuZnVuY3Rpb24gc3ltbGlua1BhdGhzU3luYyAoc3JjcGF0aCwgZHN0cGF0aCkge1xuICBpZiAocGF0aC5pc0Fic29sdXRlKHNyY3BhdGgpKSB7XG4gICAgY29uc3QgZXhpc3RzID0gZnMuZXhpc3RzU3luYyhzcmNwYXRoKVxuICAgIGlmICghZXhpc3RzKSB0aHJvdyBuZXcgRXJyb3IoJ2Fic29sdXRlIHNyY3BhdGggZG9lcyBub3QgZXhpc3QnKVxuICAgIHJldHVybiB7XG4gICAgICB0b0N3ZDogc3JjcGF0aCxcbiAgICAgIHRvRHN0OiBzcmNwYXRoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZHN0ZGlyID0gcGF0aC5kaXJuYW1lKGRzdHBhdGgpXG4gIGNvbnN0IHJlbGF0aXZlVG9Ec3QgPSBwYXRoLmpvaW4oZHN0ZGlyLCBzcmNwYXRoKVxuICBjb25zdCBleGlzdHMgPSBmcy5leGlzdHNTeW5jKHJlbGF0aXZlVG9Ec3QpXG4gIGlmIChleGlzdHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9Dd2Q6IHJlbGF0aXZlVG9Ec3QsXG4gICAgICB0b0RzdDogc3JjcGF0aFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNyY0V4aXN0cyA9IGZzLmV4aXN0c1N5bmMoc3JjcGF0aClcbiAgaWYgKCFzcmNFeGlzdHMpIHRocm93IG5ldyBFcnJvcigncmVsYXRpdmUgc3JjcGF0aCBkb2VzIG5vdCBleGlzdCcpXG4gIHJldHVybiB7XG4gICAgdG9Dd2Q6IHNyY3BhdGgsXG4gICAgdG9Ec3Q6IHBhdGgucmVsYXRpdmUoZHN0ZGlyLCBzcmNwYXRoKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzeW1saW5rUGF0aHM6IHUoc3ltbGlua1BhdGhzKSxcbiAgc3ltbGlua1BhdGhzU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5cbmFzeW5jIGZ1bmN0aW9uIHN5bWxpbmtUeXBlIChzcmNwYXRoLCB0eXBlKSB7XG4gIGlmICh0eXBlKSByZXR1cm4gdHlwZVxuXG4gIGxldCBzdGF0c1xuICB0cnkge1xuICAgIHN0YXRzID0gYXdhaXQgZnMubHN0YXQoc3JjcGF0aClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICdmaWxlJ1xuICB9XG5cbiAgcmV0dXJuIChzdGF0cyAmJiBzdGF0cy5pc0RpcmVjdG9yeSgpKSA/ICdkaXInIDogJ2ZpbGUnXG59XG5cbmZ1bmN0aW9uIHN5bWxpbmtUeXBlU3luYyAoc3JjcGF0aCwgdHlwZSkge1xuICBpZiAodHlwZSkgcmV0dXJuIHR5cGVcblxuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGZzLmxzdGF0U3luYyhzcmNwYXRoKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ2ZpbGUnXG4gIH1cbiAgcmV0dXJuIChzdGF0cyAmJiBzdGF0cy5pc0RpcmVjdG9yeSgpKSA/ICdkaXInIDogJ2ZpbGUnXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzeW1saW5rVHlwZTogdShzeW1saW5rVHlwZSksXG4gIHN5bWxpbmtUeXBlU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5cbmNvbnN0IHsgbWtkaXJzLCBta2RpcnNTeW5jIH0gPSByZXF1aXJlKCcuLi9ta2RpcnMnKVxuXG5jb25zdCB7IHN5bWxpbmtQYXRocywgc3ltbGlua1BhdGhzU3luYyB9ID0gcmVxdWlyZSgnLi9zeW1saW5rLXBhdGhzJylcbmNvbnN0IHsgc3ltbGlua1R5cGUsIHN5bWxpbmtUeXBlU3luYyB9ID0gcmVxdWlyZSgnLi9zeW1saW5rLXR5cGUnKVxuXG5jb25zdCB7IHBhdGhFeGlzdHMgfSA9IHJlcXVpcmUoJy4uL3BhdGgtZXhpc3RzJylcblxuY29uc3QgeyBhcmVJZGVudGljYWwgfSA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN5bWxpbmsgKHNyY3BhdGgsIGRzdHBhdGgsIHR5cGUpIHtcbiAgbGV0IHN0YXRzXG4gIHRyeSB7XG4gICAgc3RhdHMgPSBhd2FpdCBmcy5sc3RhdChkc3RwYXRoKVxuICB9IGNhdGNoIHsgfVxuXG4gIGlmIChzdGF0cyAmJiBzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgY29uc3QgW3NyY1N0YXQsIGRzdFN0YXRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMuc3RhdChzcmNwYXRoKSxcbiAgICAgIGZzLnN0YXQoZHN0cGF0aClcbiAgICBdKVxuXG4gICAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkc3RTdGF0KSkgcmV0dXJuXG4gIH1cblxuICBjb25zdCByZWxhdGl2ZSA9IGF3YWl0IHN5bWxpbmtQYXRocyhzcmNwYXRoLCBkc3RwYXRoKVxuICBzcmNwYXRoID0gcmVsYXRpdmUudG9Ec3RcbiAgY29uc3QgdG9UeXBlID0gYXdhaXQgc3ltbGlua1R5cGUocmVsYXRpdmUudG9Dd2QsIHR5cGUpXG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShkc3RwYXRoKVxuXG4gIGlmICghKGF3YWl0IHBhdGhFeGlzdHMoZGlyKSkpIHtcbiAgICBhd2FpdCBta2RpcnMoZGlyKVxuICB9XG5cbiAgcmV0dXJuIGZzLnN5bWxpbmsoc3JjcGF0aCwgZHN0cGF0aCwgdG9UeXBlKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVTeW1saW5rU3luYyAoc3JjcGF0aCwgZHN0cGF0aCwgdHlwZSkge1xuICBsZXQgc3RhdHNcbiAgdHJ5IHtcbiAgICBzdGF0cyA9IGZzLmxzdGF0U3luYyhkc3RwYXRoKVxuICB9IGNhdGNoIHsgfVxuICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIGNvbnN0IHNyY1N0YXQgPSBmcy5zdGF0U3luYyhzcmNwYXRoKVxuICAgIGNvbnN0IGRzdFN0YXQgPSBmcy5zdGF0U3luYyhkc3RwYXRoKVxuICAgIGlmIChhcmVJZGVudGljYWwoc3JjU3RhdCwgZHN0U3RhdCkpIHJldHVyblxuICB9XG5cbiAgY29uc3QgcmVsYXRpdmUgPSBzeW1saW5rUGF0aHNTeW5jKHNyY3BhdGgsIGRzdHBhdGgpXG4gIHNyY3BhdGggPSByZWxhdGl2ZS50b0RzdFxuICB0eXBlID0gc3ltbGlua1R5cGVTeW5jKHJlbGF0aXZlLnRvQ3dkLCB0eXBlKVxuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZHN0cGF0aClcbiAgY29uc3QgZXhpc3RzID0gZnMuZXhpc3RzU3luYyhkaXIpXG4gIGlmIChleGlzdHMpIHJldHVybiBmcy5zeW1saW5rU3luYyhzcmNwYXRoLCBkc3RwYXRoLCB0eXBlKVxuICBta2RpcnNTeW5jKGRpcilcbiAgcmV0dXJuIGZzLnN5bWxpbmtTeW5jKHNyY3BhdGgsIGRzdHBhdGgsIHR5cGUpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGVTeW1saW5rOiB1KGNyZWF0ZVN5bWxpbmspLFxuICBjcmVhdGVTeW1saW5rU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG4vLyBUaGlzIGlzIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbm9ybWFsaXplL216XG4vLyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiBKb25hdGhhbiBPbmcgbWVAam9uZ2xlYmVycnkuY29tIGFuZCBDb250cmlidXRvcnNcbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tQ2FsbGJhY2tcbmNvbnN0IGZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKVxuXG5jb25zdCBhcGkgPSBbXG4gICdhY2Nlc3MnLFxuICAnYXBwZW5kRmlsZScsXG4gICdjaG1vZCcsXG4gICdjaG93bicsXG4gICdjbG9zZScsXG4gICdjb3B5RmlsZScsXG4gICdmY2htb2QnLFxuICAnZmNob3duJyxcbiAgJ2ZkYXRhc3luYycsXG4gICdmc3RhdCcsXG4gICdmc3luYycsXG4gICdmdHJ1bmNhdGUnLFxuICAnZnV0aW1lcycsXG4gICdsY2htb2QnLFxuICAnbGNob3duJyxcbiAgJ2xpbmsnLFxuICAnbHN0YXQnLFxuICAnbWtkaXInLFxuICAnbWtkdGVtcCcsXG4gICdvcGVuJyxcbiAgJ29wZW5kaXInLFxuICAncmVhZGRpcicsXG4gICdyZWFkRmlsZScsXG4gICdyZWFkbGluaycsXG4gICdyZWFscGF0aCcsXG4gICdyZW5hbWUnLFxuICAncm0nLFxuICAncm1kaXInLFxuICAnc3RhdCcsXG4gICdzeW1saW5rJyxcbiAgJ3RydW5jYXRlJyxcbiAgJ3VubGluaycsXG4gICd1dGltZXMnLFxuICAnd3JpdGVGaWxlJ1xuXS5maWx0ZXIoa2V5ID0+IHtcbiAgLy8gU29tZSBjb21tYW5kcyBhcmUgbm90IGF2YWlsYWJsZSBvbiBzb21lIHN5c3RlbXMuIEV4OlxuICAvLyBmcy5jcCB3YXMgYWRkZWQgaW4gTm9kZS5qcyB2MTYuNy4wXG4gIC8vIGZzLmxjaG93biBpcyBub3QgYXZhaWxhYmxlIG9uIGF0IGxlYXN0IHNvbWUgTGludXhcbiAgcmV0dXJuIHR5cGVvZiBmc1trZXldID09PSAnZnVuY3Rpb24nXG59KVxuXG4vLyBFeHBvcnQgY2xvbmVkIGZzOlxuT2JqZWN0LmFzc2lnbihleHBvcnRzLCBmcylcblxuLy8gVW5pdmVyc2FsaWZ5IGFzeW5jIG1ldGhvZHM6XG5hcGkuZm9yRWFjaChtZXRob2QgPT4ge1xuICBleHBvcnRzW21ldGhvZF0gPSB1KGZzW21ldGhvZF0pXG59KVxuXG4vLyBXZSBkaWZmZXIgZnJvbSBtei9mcyBpbiB0aGF0IHdlIHN0aWxsIHNoaXAgdGhlIG9sZCwgYnJva2VuLCBmcy5leGlzdHMoKVxuLy8gc2luY2Ugd2UgYXJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgdGhlIG5hdGl2ZSBtb2R1bGVcbmV4cG9ydHMuZXhpc3RzID0gZnVuY3Rpb24gKGZpbGVuYW1lLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0cyhmaWxlbmFtZSwgY2FsbGJhY2spXG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIHJldHVybiBmcy5leGlzdHMoZmlsZW5hbWUsIHJlc29sdmUpXG4gIH0pXG59XG5cbi8vIGZzLnJlYWQoKSwgZnMud3JpdGUoKSwgZnMucmVhZHYoKSwgJiBmcy53cml0ZXYoKSBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IGR1ZSB0byBtdWx0aXBsZSBjYWxsYmFjayBhcmdzXG5cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZnMucmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKVxuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZnMucmVhZChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIChlcnIsIGJ5dGVzUmVhZCwgYnVmZmVyKSA9PiB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgIHJlc29sdmUoeyBieXRlc1JlYWQsIGJ1ZmZlciB9KVxuICAgIH0pXG4gIH0pXG59XG5cbi8vIEZ1bmN0aW9uIHNpZ25hdHVyZSBjYW4gYmVcbi8vIGZzLndyaXRlKGZkLCBidWZmZXJbLCBvZmZzZXRbLCBsZW5ndGhbLCBwb3NpdGlvbl1dXSwgY2FsbGJhY2spXG4vLyBPUlxuLy8gZnMud3JpdGUoZmQsIHN0cmluZ1ssIHBvc2l0aW9uWywgZW5jb2RpbmddXSwgY2FsbGJhY2spXG4vLyBXZSBuZWVkIHRvIGhhbmRsZSBib3RoIGNhc2VzLCBzbyB3ZSB1c2UgLi4uYXJnc1xuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChmZCwgYnVmZmVyLCAuLi5hcmdzKSB7XG4gIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZzLndyaXRlKGZkLCBidWZmZXIsIC4uLmFyZ3MpXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGZzLndyaXRlKGZkLCBidWZmZXIsIC4uLmFyZ3MsIChlcnIsIGJ5dGVzV3JpdHRlbiwgYnVmZmVyKSA9PiB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgIHJlc29sdmUoeyBieXRlc1dyaXR0ZW4sIGJ1ZmZlciB9KVxuICAgIH0pXG4gIH0pXG59XG5cbi8vIEZ1bmN0aW9uIHNpZ25hdHVyZSBpc1xuLy8gcy5yZWFkdihmZCwgYnVmZmVyc1ssIHBvc2l0aW9uXSwgY2FsbGJhY2spXG4vLyBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgb3B0aW9uYWwgYXJnLCBzbyB3ZSB1c2UgLi4uYXJnc1xuZXhwb3J0cy5yZWFkdiA9IGZ1bmN0aW9uIChmZCwgYnVmZmVycywgLi4uYXJncykge1xuICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmcy5yZWFkdihmZCwgYnVmZmVycywgLi4uYXJncylcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZnMucmVhZHYoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MsIChlcnIsIGJ5dGVzUmVhZCwgYnVmZmVycykgPT4ge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpXG4gICAgICByZXNvbHZlKHsgYnl0ZXNSZWFkLCBidWZmZXJzIH0pXG4gICAgfSlcbiAgfSlcbn1cblxuLy8gRnVuY3Rpb24gc2lnbmF0dXJlIGlzXG4vLyBzLndyaXRldihmZCwgYnVmZmVyc1ssIHBvc2l0aW9uXSwgY2FsbGJhY2spXG4vLyBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgb3B0aW9uYWwgYXJnLCBzbyB3ZSB1c2UgLi4uYXJnc1xuZXhwb3J0cy53cml0ZXYgPSBmdW5jdGlvbiAoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MpIHtcbiAgaWYgKHR5cGVvZiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZnMud3JpdGV2KGZkLCBidWZmZXJzLCAuLi5hcmdzKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBmcy53cml0ZXYoZmQsIGJ1ZmZlcnMsIC4uLmFyZ3MsIChlcnIsIGJ5dGVzV3JpdHRlbiwgYnVmZmVycykgPT4ge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpXG4gICAgICByZXNvbHZlKHsgYnl0ZXNXcml0dGVuLCBidWZmZXJzIH0pXG4gICAgfSlcbiAgfSlcbn1cblxuLy8gZnMucmVhbHBhdGgubmF0aXZlIHNvbWV0aW1lcyBub3QgYXZhaWxhYmxlIGlmIGZzIGlzIG1vbmtleS1wYXRjaGVkXG5pZiAodHlwZW9mIGZzLnJlYWxwYXRoLm5hdGl2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICBleHBvcnRzLnJlYWxwYXRoLm5hdGl2ZSA9IHUoZnMucmVhbHBhdGgubmF0aXZlKVxufSBlbHNlIHtcbiAgcHJvY2Vzcy5lbWl0V2FybmluZyhcbiAgICAnZnMucmVhbHBhdGgubmF0aXZlIGlzIG5vdCBhIGZ1bmN0aW9uLiBJcyBmcyBiZWluZyBtb25rZXktcGF0Y2hlZD8nLFxuICAgICdXYXJuaW5nJywgJ2ZzLWV4dHJhLVdBUk4wMDAzJ1xuICApXG59XG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8vIEV4cG9ydCBwcm9taXNlaWZpZWQgZ3JhY2VmdWwtZnM6XG4gIC4uLnJlcXVpcmUoJy4vZnMnKSxcbiAgLy8gRXhwb3J0IGV4dHJhIG1ldGhvZHM6XG4gIC4uLnJlcXVpcmUoJy4vY29weScpLFxuICAuLi5yZXF1aXJlKCcuL2VtcHR5JyksXG4gIC4uLnJlcXVpcmUoJy4vZW5zdXJlJyksXG4gIC4uLnJlcXVpcmUoJy4vanNvbicpLFxuICAuLi5yZXF1aXJlKCcuL21rZGlycycpLFxuICAuLi5yZXF1aXJlKCcuL21vdmUnKSxcbiAgLi4ucmVxdWlyZSgnLi9vdXRwdXQtZmlsZScpLFxuICAuLi5yZXF1aXJlKCcuL3BhdGgtZXhpc3RzJyksXG4gIC4uLnJlcXVpcmUoJy4vcmVtb3ZlJylcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2VcbmNvbnN0IGpzb25GaWxlID0gcmVxdWlyZSgnLi9qc29uZmlsZScpXG5cbmpzb25GaWxlLm91dHB1dEpzb24gPSB1KHJlcXVpcmUoJy4vb3V0cHV0LWpzb24nKSlcbmpzb25GaWxlLm91dHB1dEpzb25TeW5jID0gcmVxdWlyZSgnLi9vdXRwdXQtanNvbi1zeW5jJylcbi8vIGFsaWFzZXNcbmpzb25GaWxlLm91dHB1dEpTT04gPSBqc29uRmlsZS5vdXRwdXRKc29uXG5qc29uRmlsZS5vdXRwdXRKU09OU3luYyA9IGpzb25GaWxlLm91dHB1dEpzb25TeW5jXG5qc29uRmlsZS53cml0ZUpTT04gPSBqc29uRmlsZS53cml0ZUpzb25cbmpzb25GaWxlLndyaXRlSlNPTlN5bmMgPSBqc29uRmlsZS53cml0ZUpzb25TeW5jXG5qc29uRmlsZS5yZWFkSlNPTiA9IGpzb25GaWxlLnJlYWRKc29uXG5qc29uRmlsZS5yZWFkSlNPTlN5bmMgPSBqc29uRmlsZS5yZWFkSnNvblN5bmNcblxubW9kdWxlLmV4cG9ydHMgPSBqc29uRmlsZVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGpzb25GaWxlID0gcmVxdWlyZSgnanNvbmZpbGUnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8ganNvbmZpbGUgZXhwb3J0c1xuICByZWFkSnNvbjoganNvbkZpbGUucmVhZEZpbGUsXG4gIHJlYWRKc29uU3luYzoganNvbkZpbGUucmVhZEZpbGVTeW5jLFxuICB3cml0ZUpzb246IGpzb25GaWxlLndyaXRlRmlsZSxcbiAgd3JpdGVKc29uU3luYzoganNvbkZpbGUud3JpdGVGaWxlU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgc3RyaW5naWZ5IH0gPSByZXF1aXJlKCdqc29uZmlsZS91dGlscycpXG5jb25zdCB7IG91dHB1dEZpbGVTeW5jIH0gPSByZXF1aXJlKCcuLi9vdXRwdXQtZmlsZScpXG5cbmZ1bmN0aW9uIG91dHB1dEpzb25TeW5jIChmaWxlLCBkYXRhLCBvcHRpb25zKSB7XG4gIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShkYXRhLCBvcHRpb25zKVxuXG4gIG91dHB1dEZpbGVTeW5jKGZpbGUsIHN0ciwgb3B0aW9ucylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdXRwdXRKc29uU3luY1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgc3RyaW5naWZ5IH0gPSByZXF1aXJlKCdqc29uZmlsZS91dGlscycpXG5jb25zdCB7IG91dHB1dEZpbGUgfSA9IHJlcXVpcmUoJy4uL291dHB1dC1maWxlJylcblxuYXN5bmMgZnVuY3Rpb24gb3V0cHV0SnNvbiAoZmlsZSwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShkYXRhLCBvcHRpb25zKVxuXG4gIGF3YWl0IG91dHB1dEZpbGUoZmlsZSwgc3RyLCBvcHRpb25zKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG91dHB1dEpzb25cbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCB7IG1ha2VEaXI6IF9tYWtlRGlyLCBtYWtlRGlyU3luYyB9ID0gcmVxdWlyZSgnLi9tYWtlLWRpcicpXG5jb25zdCBtYWtlRGlyID0gdShfbWFrZURpcilcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG1rZGlyczogbWFrZURpcixcbiAgbWtkaXJzU3luYzogbWFrZURpclN5bmMsXG4gIC8vIGFsaWFzXG4gIG1rZGlycDogbWFrZURpcixcbiAgbWtkaXJwU3luYzogbWFrZURpclN5bmMsXG4gIGVuc3VyZURpcjogbWFrZURpcixcbiAgZW5zdXJlRGlyU3luYzogbWFrZURpclN5bmNcbn1cbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCB7IGNoZWNrUGF0aCB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5cbmNvbnN0IGdldE1vZGUgPSBvcHRpb25zID0+IHtcbiAgY29uc3QgZGVmYXVsdHMgPSB7IG1vZGU6IDBvNzc3IH1cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJykgcmV0dXJuIG9wdGlvbnNcbiAgcmV0dXJuICh7IC4uLmRlZmF1bHRzLCAuLi5vcHRpb25zIH0pLm1vZGVcbn1cblxubW9kdWxlLmV4cG9ydHMubWFrZURpciA9IGFzeW5jIChkaXIsIG9wdGlvbnMpID0+IHtcbiAgY2hlY2tQYXRoKGRpcilcblxuICByZXR1cm4gZnMubWtkaXIoZGlyLCB7XG4gICAgbW9kZTogZ2V0TW9kZShvcHRpb25zKSxcbiAgICByZWN1cnNpdmU6IHRydWVcbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMubWFrZURpclN5bmMgPSAoZGlyLCBvcHRpb25zKSA9PiB7XG4gIGNoZWNrUGF0aChkaXIpXG5cbiAgcmV0dXJuIGZzLm1rZGlyU3luYyhkaXIsIHtcbiAgICBtb2RlOiBnZXRNb2RlKG9wdGlvbnMpLFxuICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICB9KVxufVxuIiwiLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvbWFrZS1kaXJcbi8vIENvcHlyaWdodCAoYykgU2luZHJlIFNvcmh1cyA8c2luZHJlc29yaHVzQGdtYWlsLmNvbT4gKHNpbmRyZXNvcmh1cy5jb20pXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbid1c2Ugc3RyaWN0J1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzg5ODdcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9saWJ1di9saWJ1di9wdWxsLzEwODhcbm1vZHVsZS5leHBvcnRzLmNoZWNrUGF0aCA9IGZ1bmN0aW9uIGNoZWNrUGF0aCAocHRoKSB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc3QgcGF0aEhhc0ludmFsaWRXaW5DaGFyYWN0ZXJzID0gL1s8PjpcInw/Kl0vLnRlc3QocHRoLnJlcGxhY2UocGF0aC5wYXJzZShwdGgpLnJvb3QsICcnKSlcblxuICAgIGlmIChwYXRoSGFzSW52YWxpZFdpbkNoYXJhY3RlcnMpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBQYXRoIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyczogJHtwdGh9YClcbiAgICAgIGVycm9yLmNvZGUgPSAnRUlOVkFMJ1xuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB1ID0gcmVxdWlyZSgndW5pdmVyc2FsaWZ5JykuZnJvbVByb21pc2Vcbm1vZHVsZS5leHBvcnRzID0ge1xuICBtb3ZlOiB1KHJlcXVpcmUoJy4vbW92ZScpKSxcbiAgbW92ZVN5bmM6IHJlcXVpcmUoJy4vbW92ZS1zeW5jJylcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2dyYWNlZnVsLWZzJylcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJylcbmNvbnN0IGNvcHlTeW5jID0gcmVxdWlyZSgnLi4vY29weScpLmNvcHlTeW5jXG5jb25zdCByZW1vdmVTeW5jID0gcmVxdWlyZSgnLi4vcmVtb3ZlJykucmVtb3ZlU3luY1xuY29uc3QgbWtkaXJwU3luYyA9IHJlcXVpcmUoJy4uL21rZGlycycpLm1rZGlycFN5bmNcbmNvbnN0IHN0YXQgPSByZXF1aXJlKCcuLi91dGlsL3N0YXQnKVxuXG5mdW5jdGlvbiBtb3ZlU3luYyAoc3JjLCBkZXN0LCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IG9wdHMub3ZlcndyaXRlIHx8IG9wdHMuY2xvYmJlciB8fCBmYWxzZVxuXG4gIGNvbnN0IHsgc3JjU3RhdCwgaXNDaGFuZ2luZ0Nhc2UgPSBmYWxzZSB9ID0gc3RhdC5jaGVja1BhdGhzU3luYyhzcmMsIGRlc3QsICdtb3ZlJywgb3B0cylcbiAgc3RhdC5jaGVja1BhcmVudFBhdGhzU3luYyhzcmMsIHNyY1N0YXQsIGRlc3QsICdtb3ZlJylcbiAgaWYgKCFpc1BhcmVudFJvb3QoZGVzdCkpIG1rZGlycFN5bmMocGF0aC5kaXJuYW1lKGRlc3QpKVxuICByZXR1cm4gZG9SZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUsIGlzQ2hhbmdpbmdDYXNlKVxufVxuXG5mdW5jdGlvbiBpc1BhcmVudFJvb3QgKGRlc3QpIHtcbiAgY29uc3QgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGRlc3QpXG4gIGNvbnN0IHBhcnNlZFBhdGggPSBwYXRoLnBhcnNlKHBhcmVudClcbiAgcmV0dXJuIHBhcnNlZFBhdGgucm9vdCA9PT0gcGFyZW50XG59XG5cbmZ1bmN0aW9uIGRvUmVuYW1lIChzcmMsIGRlc3QsIG92ZXJ3cml0ZSwgaXNDaGFuZ2luZ0Nhc2UpIHtcbiAgaWYgKGlzQ2hhbmdpbmdDYXNlKSByZXR1cm4gcmVuYW1lKHNyYywgZGVzdCwgb3ZlcndyaXRlKVxuICBpZiAob3ZlcndyaXRlKSB7XG4gICAgcmVtb3ZlU3luYyhkZXN0KVxuICAgIHJldHVybiByZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG4gIH1cbiAgaWYgKGZzLmV4aXN0c1N5bmMoZGVzdCkpIHRocm93IG5ldyBFcnJvcignZGVzdCBhbHJlYWR5IGV4aXN0cy4nKVxuICByZXR1cm4gcmVuYW1lKHNyYywgZGVzdCwgb3ZlcndyaXRlKVxufVxuXG5mdW5jdGlvbiByZW5hbWUgKHNyYywgZGVzdCwgb3ZlcndyaXRlKSB7XG4gIHRyeSB7XG4gICAgZnMucmVuYW1lU3luYyhzcmMsIGRlc3QpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIuY29kZSAhPT0gJ0VYREVWJykgdGhyb3cgZXJyXG4gICAgcmV0dXJuIG1vdmVBY3Jvc3NEZXZpY2Uoc3JjLCBkZXN0LCBvdmVyd3JpdGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gbW92ZUFjcm9zc0RldmljZSAoc3JjLCBkZXN0LCBvdmVyd3JpdGUpIHtcbiAgY29uc3Qgb3B0cyA9IHtcbiAgICBvdmVyd3JpdGUsXG4gICAgZXJyb3JPbkV4aXN0OiB0cnVlLFxuICAgIHByZXNlcnZlVGltZXN0YW1wczogdHJ1ZVxuICB9XG4gIGNvcHlTeW5jKHNyYywgZGVzdCwgb3B0cylcbiAgcmV0dXJuIHJlbW92ZVN5bmMoc3JjKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1vdmVTeW5jXG4iLCIndXNlIHN0cmljdCdcblxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCB7IGNvcHkgfSA9IHJlcXVpcmUoJy4uL2NvcHknKVxuY29uc3QgeyByZW1vdmUgfSA9IHJlcXVpcmUoJy4uL3JlbW92ZScpXG5jb25zdCB7IG1rZGlycCB9ID0gcmVxdWlyZSgnLi4vbWtkaXJzJylcbmNvbnN0IHsgcGF0aEV4aXN0cyB9ID0gcmVxdWlyZSgnLi4vcGF0aC1leGlzdHMnKVxuY29uc3Qgc3RhdCA9IHJlcXVpcmUoJy4uL3V0aWwvc3RhdCcpXG5cbmFzeW5jIGZ1bmN0aW9uIG1vdmUgKHNyYywgZGVzdCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG92ZXJ3cml0ZSA9IG9wdHMub3ZlcndyaXRlIHx8IG9wdHMuY2xvYmJlciB8fCBmYWxzZVxuXG4gIGNvbnN0IHsgc3JjU3RhdCwgaXNDaGFuZ2luZ0Nhc2UgPSBmYWxzZSB9ID0gYXdhaXQgc3RhdC5jaGVja1BhdGhzKHNyYywgZGVzdCwgJ21vdmUnLCBvcHRzKVxuXG4gIGF3YWl0IHN0YXQuY2hlY2tQYXJlbnRQYXRocyhzcmMsIHNyY1N0YXQsIGRlc3QsICdtb3ZlJylcblxuICAvLyBJZiB0aGUgcGFyZW50IG9mIGRlc3QgaXMgbm90IHJvb3QsIG1ha2Ugc3VyZSBpdCBleGlzdHMgYmVmb3JlIHByb2NlZWRpbmdcbiAgY29uc3QgZGVzdFBhcmVudCA9IHBhdGguZGlybmFtZShkZXN0KVxuICBjb25zdCBwYXJzZWRQYXJlbnRQYXRoID0gcGF0aC5wYXJzZShkZXN0UGFyZW50KVxuICBpZiAocGFyc2VkUGFyZW50UGF0aC5yb290ICE9PSBkZXN0UGFyZW50KSB7XG4gICAgYXdhaXQgbWtkaXJwKGRlc3RQYXJlbnQpXG4gIH1cblxuICByZXR1cm4gZG9SZW5hbWUoc3JjLCBkZXN0LCBvdmVyd3JpdGUsIGlzQ2hhbmdpbmdDYXNlKVxufVxuXG5hc3luYyBmdW5jdGlvbiBkb1JlbmFtZSAoc3JjLCBkZXN0LCBvdmVyd3JpdGUsIGlzQ2hhbmdpbmdDYXNlKSB7XG4gIGlmICghaXNDaGFuZ2luZ0Nhc2UpIHtcbiAgICBpZiAob3ZlcndyaXRlKSB7XG4gICAgICBhd2FpdCByZW1vdmUoZGVzdClcbiAgICB9IGVsc2UgaWYgKGF3YWl0IHBhdGhFeGlzdHMoZGVzdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGVzdCBhbHJlYWR5IGV4aXN0cy4nKVxuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVHJ5IHcvIHJlbmFtZSBmaXJzdCwgYW5kIHRyeSBjb3B5ICsgcmVtb3ZlIGlmIEVYREVWXG4gICAgYXdhaXQgZnMucmVuYW1lKHNyYywgZGVzdClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlICE9PSAnRVhERVYnKSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gICAgYXdhaXQgbW92ZUFjcm9zc0RldmljZShzcmMsIGRlc3QsIG92ZXJ3cml0ZSlcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBtb3ZlQWNyb3NzRGV2aWNlIChzcmMsIGRlc3QsIG92ZXJ3cml0ZSkge1xuICBjb25zdCBvcHRzID0ge1xuICAgIG92ZXJ3cml0ZSxcbiAgICBlcnJvck9uRXhpc3Q6IHRydWUsXG4gICAgcHJlc2VydmVUaW1lc3RhbXBzOiB0cnVlXG4gIH1cblxuICBhd2FpdCBjb3B5KHNyYywgZGVzdCwgb3B0cylcbiAgcmV0dXJuIHJlbW92ZShzcmMpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gbW92ZVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHUgPSByZXF1aXJlKCd1bml2ZXJzYWxpZnknKS5mcm9tUHJvbWlzZVxuY29uc3QgZnMgPSByZXF1aXJlKCcuLi9mcycpXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG5jb25zdCBta2RpciA9IHJlcXVpcmUoJy4uL21rZGlycycpXG5jb25zdCBwYXRoRXhpc3RzID0gcmVxdWlyZSgnLi4vcGF0aC1leGlzdHMnKS5wYXRoRXhpc3RzXG5cbmFzeW5jIGZ1bmN0aW9uIG91dHB1dEZpbGUgKGZpbGUsIGRhdGEsIGVuY29kaW5nID0gJ3V0Zi04Jykge1xuICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZmlsZSlcblxuICBpZiAoIShhd2FpdCBwYXRoRXhpc3RzKGRpcikpKSB7XG4gICAgYXdhaXQgbWtkaXIubWtkaXJzKGRpcilcbiAgfVxuXG4gIHJldHVybiBmcy53cml0ZUZpbGUoZmlsZSwgZGF0YSwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIG91dHB1dEZpbGVTeW5jIChmaWxlLCAuLi5hcmdzKSB7XG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShmaWxlKVxuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuICAgIG1rZGlyLm1rZGlyc1N5bmMoZGlyKVxuICB9XG5cbiAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCAuLi5hcmdzKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgb3V0cHV0RmlsZTogdShvdXRwdXRGaWxlKSxcbiAgb3V0cHV0RmlsZVN5bmNcbn1cbiIsIid1c2Ugc3RyaWN0J1xuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5jb25zdCBmcyA9IHJlcXVpcmUoJy4uL2ZzJylcblxuZnVuY3Rpb24gcGF0aEV4aXN0cyAocGF0aCkge1xuICByZXR1cm4gZnMuYWNjZXNzKHBhdGgpLnRoZW4oKCkgPT4gdHJ1ZSkuY2F0Y2goKCkgPT4gZmFsc2UpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBwYXRoRXhpc3RzOiB1KHBhdGhFeGlzdHMpLFxuICBwYXRoRXhpc3RzU3luYzogZnMuZXhpc3RzU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZ3JhY2VmdWwtZnMnKVxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21DYWxsYmFja1xuXG5mdW5jdGlvbiByZW1vdmUgKHBhdGgsIGNhbGxiYWNrKSB7XG4gIGZzLnJtKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9LCBjYWxsYmFjaylcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3luYyAocGF0aCkge1xuICBmcy5ybVN5bmMocGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICByZW1vdmU6IHUocmVtb3ZlKSxcbiAgcmVtb3ZlU3luY1xufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5cbmZ1bmN0aW9uIGdldFN0YXRzIChzcmMsIGRlc3QsIG9wdHMpIHtcbiAgY29uc3Qgc3RhdEZ1bmMgPSBvcHRzLmRlcmVmZXJlbmNlXG4gICAgPyAoZmlsZSkgPT4gZnMuc3RhdChmaWxlLCB7IGJpZ2ludDogdHJ1ZSB9KVxuICAgIDogKGZpbGUpID0+IGZzLmxzdGF0KGZpbGUsIHsgYmlnaW50OiB0cnVlIH0pXG4gIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgc3RhdEZ1bmMoc3JjKSxcbiAgICBzdGF0RnVuYyhkZXN0KS5jYXRjaChlcnIgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIG51bGxcbiAgICAgIHRocm93IGVyclxuICAgIH0pXG4gIF0pLnRoZW4oKFtzcmNTdGF0LCBkZXN0U3RhdF0pID0+ICh7IHNyY1N0YXQsIGRlc3RTdGF0IH0pKVxufVxuXG5mdW5jdGlvbiBnZXRTdGF0c1N5bmMgKHNyYywgZGVzdCwgb3B0cykge1xuICBsZXQgZGVzdFN0YXRcbiAgY29uc3Qgc3RhdEZ1bmMgPSBvcHRzLmRlcmVmZXJlbmNlXG4gICAgPyAoZmlsZSkgPT4gZnMuc3RhdFN5bmMoZmlsZSwgeyBiaWdpbnQ6IHRydWUgfSlcbiAgICA6IChmaWxlKSA9PiBmcy5sc3RhdFN5bmMoZmlsZSwgeyBiaWdpbnQ6IHRydWUgfSlcbiAgY29uc3Qgc3JjU3RhdCA9IHN0YXRGdW5jKHNyYylcbiAgdHJ5IHtcbiAgICBkZXN0U3RhdCA9IHN0YXRGdW5jKGRlc3QpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiB7IHNyY1N0YXQsIGRlc3RTdGF0OiBudWxsIH1cbiAgICB0aHJvdyBlcnJcbiAgfVxuICByZXR1cm4geyBzcmNTdGF0LCBkZXN0U3RhdCB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUGF0aHMgKHNyYywgZGVzdCwgZnVuY05hbWUsIG9wdHMpIHtcbiAgY29uc3QgeyBzcmNTdGF0LCBkZXN0U3RhdCB9ID0gYXdhaXQgZ2V0U3RhdHMoc3JjLCBkZXN0LCBvcHRzKVxuICBpZiAoZGVzdFN0YXQpIHtcbiAgICBpZiAoYXJlSWRlbnRpY2FsKHNyY1N0YXQsIGRlc3RTdGF0KSkge1xuICAgICAgY29uc3Qgc3JjQmFzZU5hbWUgPSBwYXRoLmJhc2VuYW1lKHNyYylcbiAgICAgIGNvbnN0IGRlc3RCYXNlTmFtZSA9IHBhdGguYmFzZW5hbWUoZGVzdClcbiAgICAgIGlmIChmdW5jTmFtZSA9PT0gJ21vdmUnICYmXG4gICAgICAgIHNyY0Jhc2VOYW1lICE9PSBkZXN0QmFzZU5hbWUgJiZcbiAgICAgICAgc3JjQmFzZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZGVzdEJhc2VOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIHsgc3JjU3RhdCwgZGVzdFN0YXQsIGlzQ2hhbmdpbmdDYXNlOiB0cnVlIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignU291cmNlIGFuZCBkZXN0aW5hdGlvbiBtdXN0IG5vdCBiZSB0aGUgc2FtZS4nKVxuICAgIH1cbiAgICBpZiAoc3JjU3RhdC5pc0RpcmVjdG9yeSgpICYmICFkZXN0U3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgbm9uLWRpcmVjdG9yeSAnJHtkZXN0fScgd2l0aCBkaXJlY3RvcnkgJyR7c3JjfScuYClcbiAgICB9XG4gICAgaWYgKCFzcmNTdGF0LmlzRGlyZWN0b3J5KCkgJiYgZGVzdFN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3ZlcndyaXRlIGRpcmVjdG9yeSAnJHtkZXN0fScgd2l0aCBub24tZGlyZWN0b3J5ICcke3NyY30nLmApXG4gICAgfVxuICB9XG5cbiAgaWYgKHNyY1N0YXQuaXNEaXJlY3RvcnkoKSAmJiBpc1NyY1N1YmRpcihzcmMsIGRlc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyhzcmMsIGRlc3QsIGZ1bmNOYW1lKSlcbiAgfVxuXG4gIHJldHVybiB7IHNyY1N0YXQsIGRlc3RTdGF0IH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQYXRoc1N5bmMgKHNyYywgZGVzdCwgZnVuY05hbWUsIG9wdHMpIHtcbiAgY29uc3QgeyBzcmNTdGF0LCBkZXN0U3RhdCB9ID0gZ2V0U3RhdHNTeW5jKHNyYywgZGVzdCwgb3B0cylcblxuICBpZiAoZGVzdFN0YXQpIHtcbiAgICBpZiAoYXJlSWRlbnRpY2FsKHNyY1N0YXQsIGRlc3RTdGF0KSkge1xuICAgICAgY29uc3Qgc3JjQmFzZU5hbWUgPSBwYXRoLmJhc2VuYW1lKHNyYylcbiAgICAgIGNvbnN0IGRlc3RCYXNlTmFtZSA9IHBhdGguYmFzZW5hbWUoZGVzdClcbiAgICAgIGlmIChmdW5jTmFtZSA9PT0gJ21vdmUnICYmXG4gICAgICAgIHNyY0Jhc2VOYW1lICE9PSBkZXN0QmFzZU5hbWUgJiZcbiAgICAgICAgc3JjQmFzZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZGVzdEJhc2VOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIHsgc3JjU3RhdCwgZGVzdFN0YXQsIGlzQ2hhbmdpbmdDYXNlOiB0cnVlIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignU291cmNlIGFuZCBkZXN0aW5hdGlvbiBtdXN0IG5vdCBiZSB0aGUgc2FtZS4nKVxuICAgIH1cbiAgICBpZiAoc3JjU3RhdC5pc0RpcmVjdG9yeSgpICYmICFkZXN0U3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvdmVyd3JpdGUgbm9uLWRpcmVjdG9yeSAnJHtkZXN0fScgd2l0aCBkaXJlY3RvcnkgJyR7c3JjfScuYClcbiAgICB9XG4gICAgaWYgKCFzcmNTdGF0LmlzRGlyZWN0b3J5KCkgJiYgZGVzdFN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3ZlcndyaXRlIGRpcmVjdG9yeSAnJHtkZXN0fScgd2l0aCBub24tZGlyZWN0b3J5ICcke3NyY30nLmApXG4gICAgfVxuICB9XG5cbiAgaWYgKHNyY1N0YXQuaXNEaXJlY3RvcnkoKSAmJiBpc1NyY1N1YmRpcihzcmMsIGRlc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyhzcmMsIGRlc3QsIGZ1bmNOYW1lKSlcbiAgfVxuICByZXR1cm4geyBzcmNTdGF0LCBkZXN0U3RhdCB9XG59XG5cbi8vIHJlY3Vyc2l2ZWx5IGNoZWNrIGlmIGRlc3QgcGFyZW50IGlzIGEgc3ViZGlyZWN0b3J5IG9mIHNyYy5cbi8vIEl0IHdvcmtzIGZvciBhbGwgZmlsZSB0eXBlcyBpbmNsdWRpbmcgc3ltbGlua3Mgc2luY2UgaXRcbi8vIGNoZWNrcyB0aGUgc3JjIGFuZCBkZXN0IGlub2Rlcy4gSXQgc3RhcnRzIGZyb20gdGhlIGRlZXBlc3Rcbi8vIHBhcmVudCBhbmQgc3RvcHMgb25jZSBpdCByZWFjaGVzIHRoZSBzcmMgcGFyZW50IG9yIHRoZSByb290IHBhdGguXG5hc3luYyBmdW5jdGlvbiBjaGVja1BhcmVudFBhdGhzIChzcmMsIHNyY1N0YXQsIGRlc3QsIGZ1bmNOYW1lKSB7XG4gIGNvbnN0IHNyY1BhcmVudCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUoc3JjKSlcbiAgY29uc3QgZGVzdFBhcmVudCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUoZGVzdCkpXG4gIGlmIChkZXN0UGFyZW50ID09PSBzcmNQYXJlbnQgfHwgZGVzdFBhcmVudCA9PT0gcGF0aC5wYXJzZShkZXN0UGFyZW50KS5yb290KSByZXR1cm5cblxuICBsZXQgZGVzdFN0YXRcbiAgdHJ5IHtcbiAgICBkZXN0U3RhdCA9IGF3YWl0IGZzLnN0YXQoZGVzdFBhcmVudCwgeyBiaWdpbnQ6IHRydWUgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuXG4gICAgdGhyb3cgZXJyXG4gIH1cblxuICBpZiAoYXJlSWRlbnRpY2FsKHNyY1N0YXQsIGRlc3RTdGF0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2coc3JjLCBkZXN0LCBmdW5jTmFtZSkpXG4gIH1cblxuICByZXR1cm4gY2hlY2tQYXJlbnRQYXRocyhzcmMsIHNyY1N0YXQsIGRlc3RQYXJlbnQsIGZ1bmNOYW1lKVxufVxuXG5mdW5jdGlvbiBjaGVja1BhcmVudFBhdGhzU3luYyAoc3JjLCBzcmNTdGF0LCBkZXN0LCBmdW5jTmFtZSkge1xuICBjb25zdCBzcmNQYXJlbnQgPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKHNyYykpXG4gIGNvbnN0IGRlc3RQYXJlbnQgPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKGRlc3QpKVxuICBpZiAoZGVzdFBhcmVudCA9PT0gc3JjUGFyZW50IHx8IGRlc3RQYXJlbnQgPT09IHBhdGgucGFyc2UoZGVzdFBhcmVudCkucm9vdCkgcmV0dXJuXG4gIGxldCBkZXN0U3RhdFxuICB0cnkge1xuICAgIGRlc3RTdGF0ID0gZnMuc3RhdFN5bmMoZGVzdFBhcmVudCwgeyBiaWdpbnQ6IHRydWUgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuXG4gICAgdGhyb3cgZXJyXG4gIH1cbiAgaWYgKGFyZUlkZW50aWNhbChzcmNTdGF0LCBkZXN0U3RhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKHNyYywgZGVzdCwgZnVuY05hbWUpKVxuICB9XG4gIHJldHVybiBjaGVja1BhcmVudFBhdGhzU3luYyhzcmMsIHNyY1N0YXQsIGRlc3RQYXJlbnQsIGZ1bmNOYW1lKVxufVxuXG5mdW5jdGlvbiBhcmVJZGVudGljYWwgKHNyY1N0YXQsIGRlc3RTdGF0KSB7XG4gIHJldHVybiBkZXN0U3RhdC5pbm8gJiYgZGVzdFN0YXQuZGV2ICYmIGRlc3RTdGF0LmlubyA9PT0gc3JjU3RhdC5pbm8gJiYgZGVzdFN0YXQuZGV2ID09PSBzcmNTdGF0LmRldlxufVxuXG4vLyByZXR1cm4gdHJ1ZSBpZiBkZXN0IGlzIGEgc3ViZGlyIG9mIHNyYywgb3RoZXJ3aXNlIGZhbHNlLlxuLy8gSXQgb25seSBjaGVja3MgdGhlIHBhdGggc3RyaW5ncy5cbmZ1bmN0aW9uIGlzU3JjU3ViZGlyIChzcmMsIGRlc3QpIHtcbiAgY29uc3Qgc3JjQXJyID0gcGF0aC5yZXNvbHZlKHNyYykuc3BsaXQocGF0aC5zZXApLmZpbHRlcihpID0+IGkpXG4gIGNvbnN0IGRlc3RBcnIgPSBwYXRoLnJlc29sdmUoZGVzdCkuc3BsaXQocGF0aC5zZXApLmZpbHRlcihpID0+IGkpXG4gIHJldHVybiBzcmNBcnIuZXZlcnkoKGN1ciwgaSkgPT4gZGVzdEFycltpXSA9PT0gY3VyKVxufVxuXG5mdW5jdGlvbiBlcnJNc2cgKHNyYywgZGVzdCwgZnVuY05hbWUpIHtcbiAgcmV0dXJuIGBDYW5ub3QgJHtmdW5jTmFtZX0gJyR7c3JjfScgdG8gYSBzdWJkaXJlY3Rvcnkgb2YgaXRzZWxmLCAnJHtkZXN0fScuYFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gY2hlY2tQYXRoc1xuICBjaGVja1BhdGhzOiB1KGNoZWNrUGF0aHMpLFxuICBjaGVja1BhdGhzU3luYyxcbiAgLy8gY2hlY2tQYXJlbnRcbiAgY2hlY2tQYXJlbnRQYXRoczogdShjaGVja1BhcmVudFBhdGhzKSxcbiAgY2hlY2tQYXJlbnRQYXRoc1N5bmMsXG4gIC8vIE1pc2NcbiAgaXNTcmNTdWJkaXIsXG4gIGFyZUlkZW50aWNhbFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnLi4vZnMnKVxuY29uc3QgdSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpLmZyb21Qcm9taXNlXG5cbmFzeW5jIGZ1bmN0aW9uIHV0aW1lc01pbGxpcyAocGF0aCwgYXRpbWUsIG10aW1lKSB7XG4gIC8vIGlmICghSEFTX01JTExJU19SRVMpIHJldHVybiBmcy51dGltZXMocGF0aCwgYXRpbWUsIG10aW1lLCBjYWxsYmFjaylcbiAgY29uc3QgZmQgPSBhd2FpdCBmcy5vcGVuKHBhdGgsICdyKycpXG5cbiAgbGV0IGNsb3NlRXJyID0gbnVsbFxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZnMuZnV0aW1lcyhmZCwgYXRpbWUsIG10aW1lKVxuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5jbG9zZShmZClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjbG9zZUVyciA9IGVcbiAgICB9XG4gIH1cblxuICBpZiAoY2xvc2VFcnIpIHtcbiAgICB0aHJvdyBjbG9zZUVyclxuICB9XG59XG5cbmZ1bmN0aW9uIHV0aW1lc01pbGxpc1N5bmMgKHBhdGgsIGF0aW1lLCBtdGltZSkge1xuICBjb25zdCBmZCA9IGZzLm9wZW5TeW5jKHBhdGgsICdyKycpXG4gIGZzLmZ1dGltZXNTeW5jKGZkLCBhdGltZSwgbXRpbWUpXG4gIHJldHVybiBmcy5jbG9zZVN5bmMoZmQpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB1dGltZXNNaWxsaXM6IHUodXRpbWVzTWlsbGlzKSxcbiAgdXRpbWVzTWlsbGlzU3luY1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDYWxsIHRoaXMgZnVuY3Rpb24gaW4gYSBhbm90aGVyIGZ1bmN0aW9uIHRvIGZpbmQgb3V0IHRoZSBmaWxlIGZyb21cbi8vIHdoaWNoIHRoYXQgZnVuY3Rpb24gd2FzIGNhbGxlZCBmcm9tLiAoSW5zcGVjdHMgdGhlIHY4IHN0YWNrIHRyYWNlKVxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTMyMjc0ODlcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0Q2FsbGVyRmlsZShwb3NpdGlvbikge1xuICAgIGlmIChwb3NpdGlvbiA9PT0gdm9pZCAwKSB7IHBvc2l0aW9uID0gMjsgfVxuICAgIGlmIChwb3NpdGlvbiA+PSBFcnJvci5zdGFja1RyYWNlTGltaXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZ2V0Q2FsbGVyRmlsZShwb3NpdGlvbikgcmVxdWlyZXMgcG9zaXRpb24gYmUgbGVzcyB0aGVuIEVycm9yLnN0YWNrVHJhY2VMaW1pdCBidXQgcG9zaXRpb24gd2FzOiBgJyArIHBvc2l0aW9uICsgJ2AgYW5kIEVycm9yLnN0YWNrVHJhY2VMaW1pdCB3YXM6IGAnICsgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0ICsgJ2AnKTtcbiAgICB9XG4gICAgdmFyIG9sZFByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBmdW5jdGlvbiAoXywgc3RhY2spIHsgcmV0dXJuIHN0YWNrOyB9O1xuICAgIHZhciBzdGFjayA9IG5ldyBFcnJvcigpLnN0YWNrO1xuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gb2xkUHJlcGFyZVN0YWNrVHJhY2U7XG4gICAgaWYgKHN0YWNrICE9PSBudWxsICYmIHR5cGVvZiBzdGFjayA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gc3RhY2tbMF0gaG9sZHMgdGhpcyBmaWxlXG4gICAgICAgIC8vIHN0YWNrWzFdIGhvbGRzIHdoZXJlIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZFxuICAgICAgICAvLyBzdGFja1syXSBob2xkcyB0aGUgZmlsZSB3ZSdyZSBpbnRlcmVzdGVkIGluXG4gICAgICAgIHJldHVybiBzdGFja1twb3NpdGlvbl0gPyBzdGFja1twb3NpdGlvbl0uZ2V0RmlsZU5hbWUoKSA6IHVuZGVmaW5lZDtcbiAgICB9XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3Qge1Bhc3NUaHJvdWdoOiBQYXNzVGhyb3VnaFN0cmVhbX0gPSByZXF1aXJlKCdzdHJlYW0nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBvcHRpb25zID0+IHtcblx0b3B0aW9ucyA9IHsuLi5vcHRpb25zfTtcblxuXHRjb25zdCB7YXJyYXl9ID0gb3B0aW9ucztcblx0bGV0IHtlbmNvZGluZ30gPSBvcHRpb25zO1xuXHRjb25zdCBpc0J1ZmZlciA9IGVuY29kaW5nID09PSAnYnVmZmVyJztcblx0bGV0IG9iamVjdE1vZGUgPSBmYWxzZTtcblxuXHRpZiAoYXJyYXkpIHtcblx0XHRvYmplY3RNb2RlID0gIShlbmNvZGluZyB8fCBpc0J1ZmZlcik7XG5cdH0gZWxzZSB7XG5cdFx0ZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAndXRmOCc7XG5cdH1cblxuXHRpZiAoaXNCdWZmZXIpIHtcblx0XHRlbmNvZGluZyA9IG51bGw7XG5cdH1cblxuXHRjb25zdCBzdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2hTdHJlYW0oe29iamVjdE1vZGV9KTtcblxuXHRpZiAoZW5jb2RpbmcpIHtcblx0XHRzdHJlYW0uc2V0RW5jb2RpbmcoZW5jb2RpbmcpO1xuXHR9XG5cblx0bGV0IGxlbmd0aCA9IDA7XG5cdGNvbnN0IGNodW5rcyA9IFtdO1xuXG5cdHN0cmVhbS5vbignZGF0YScsIGNodW5rID0+IHtcblx0XHRjaHVua3MucHVzaChjaHVuayk7XG5cblx0XHRpZiAob2JqZWN0TW9kZSkge1xuXHRcdFx0bGVuZ3RoID0gY2h1bmtzLmxlbmd0aDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bGVuZ3RoICs9IGNodW5rLmxlbmd0aDtcblx0XHR9XG5cdH0pO1xuXG5cdHN0cmVhbS5nZXRCdWZmZXJlZFZhbHVlID0gKCkgPT4ge1xuXHRcdGlmIChhcnJheSkge1xuXHRcdFx0cmV0dXJuIGNodW5rcztcblx0XHR9XG5cblx0XHRyZXR1cm4gaXNCdWZmZXIgPyBCdWZmZXIuY29uY2F0KGNodW5rcywgbGVuZ3RoKSA6IGNodW5rcy5qb2luKCcnKTtcblx0fTtcblxuXHRzdHJlYW0uZ2V0QnVmZmVyZWRMZW5ndGggPSAoKSA9PiBsZW5ndGg7XG5cblx0cmV0dXJuIHN0cmVhbTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCB7Y29uc3RhbnRzOiBCdWZmZXJDb25zdGFudHN9ID0gcmVxdWlyZSgnYnVmZmVyJyk7XG5jb25zdCBwdW1wID0gcmVxdWlyZSgncHVtcCcpO1xuY29uc3QgYnVmZmVyU3RyZWFtID0gcmVxdWlyZSgnLi9idWZmZXItc3RyZWFtJyk7XG5cbmNsYXNzIE1heEJ1ZmZlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcignbWF4QnVmZmVyIGV4Y2VlZGVkJyk7XG5cdFx0dGhpcy5uYW1lID0gJ01heEJ1ZmZlckVycm9yJztcblx0fVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRTdHJlYW0oaW5wdXRTdHJlYW0sIG9wdGlvbnMpIHtcblx0aWYgKCFpbnB1dFN0cmVhbSkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgc3RyZWFtJykpO1xuXHR9XG5cblx0b3B0aW9ucyA9IHtcblx0XHRtYXhCdWZmZXI6IEluZmluaXR5LFxuXHRcdC4uLm9wdGlvbnNcblx0fTtcblxuXHRjb25zdCB7bWF4QnVmZmVyfSA9IG9wdGlvbnM7XG5cblx0bGV0IHN0cmVhbTtcblx0YXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IHJlamVjdFByb21pc2UgPSBlcnJvciA9PiB7XG5cdFx0XHQvLyBEb24ndCByZXRyaWV2ZSBhbiBvdmVyc2l6ZWQgYnVmZmVyLlxuXHRcdFx0aWYgKGVycm9yICYmIHN0cmVhbS5nZXRCdWZmZXJlZExlbmd0aCgpIDw9IEJ1ZmZlckNvbnN0YW50cy5NQVhfTEVOR1RIKSB7XG5cdFx0XHRcdGVycm9yLmJ1ZmZlcmVkRGF0YSA9IHN0cmVhbS5nZXRCdWZmZXJlZFZhbHVlKCk7XG5cdFx0XHR9XG5cblx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0fTtcblxuXHRcdHN0cmVhbSA9IHB1bXAoaW5wdXRTdHJlYW0sIGJ1ZmZlclN0cmVhbShvcHRpb25zKSwgZXJyb3IgPT4ge1xuXHRcdFx0aWYgKGVycm9yKSB7XG5cdFx0XHRcdHJlamVjdFByb21pc2UoZXJyb3IpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblxuXHRcdHN0cmVhbS5vbignZGF0YScsICgpID0+IHtcblx0XHRcdGlmIChzdHJlYW0uZ2V0QnVmZmVyZWRMZW5ndGgoKSA+IG1heEJ1ZmZlcikge1xuXHRcdFx0XHRyZWplY3RQcm9taXNlKG5ldyBNYXhCdWZmZXJFcnJvcigpKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG5cblx0cmV0dXJuIHN0cmVhbS5nZXRCdWZmZXJlZFZhbHVlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0U3RyZWFtO1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgZm9yIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Vcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBnZXRTdHJlYW07XG5tb2R1bGUuZXhwb3J0cy5idWZmZXIgPSAoc3RyZWFtLCBvcHRpb25zKSA9PiBnZXRTdHJlYW0oc3RyZWFtLCB7Li4ub3B0aW9ucywgZW5jb2Rpbmc6ICdidWZmZXInfSk7XG5tb2R1bGUuZXhwb3J0cy5hcnJheSA9IChzdHJlYW0sIG9wdGlvbnMpID0+IGdldFN0cmVhbShzdHJlYW0sIHsuLi5vcHRpb25zLCBhcnJheTogdHJ1ZX0pO1xubW9kdWxlLmV4cG9ydHMuTWF4QnVmZmVyRXJyb3IgPSBNYXhCdWZmZXJFcnJvcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kYXRhID0gdm9pZCAwO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpO1xuY29uc3Qgc3RyZWFtXzEgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuY29uc3QgY3J5cHRvXzEgPSByZXF1aXJlKFwiY3J5cHRvXCIpO1xuY29uc3QgZGF0YV91cmlfdG9fYnVmZmVyXzEgPSByZXF1aXJlKFwiZGF0YS11cmktdG8tYnVmZmVyXCIpO1xuY29uc3Qgbm90bW9kaWZpZWRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9ub3Rtb2RpZmllZFwiKSk7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdnZXQtdXJpOmRhdGEnKTtcbmNsYXNzIERhdGFSZWFkYWJsZSBleHRlbmRzIHN0cmVhbV8xLlJlYWRhYmxlIHtcbiAgICBjb25zdHJ1Y3RvcihoYXNoLCBidWYpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wdXNoKGJ1Zik7XG4gICAgICAgIHRoaXMucHVzaChudWxsKTtcbiAgICAgICAgdGhpcy5oYXNoID0gaGFzaDtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgYSBSZWFkYWJsZSBzdHJlYW0gZnJvbSBhIFwiZGF0YTpcIiBVUkkuXG4gKi9cbmNvbnN0IGRhdGEgPSBhc3luYyAoeyBocmVmOiB1cmkgfSwgeyBjYWNoZSB9ID0ge30pID0+IHtcbiAgICAvLyBuZWVkIHRvIGNyZWF0ZSBhIFNIQTEgaGFzaCBvZiB0aGUgVVJJIHN0cmluZywgZm9yIGNhY2hlYWJpbGl0eSBjaGVja3NcbiAgICAvLyBpbiBmdXR1cmUgYGdldFVyaSgpYCBjYWxscyB3aXRoIHRoZSBzYW1lIGRhdGEgVVJJIHBhc3NlZCBpbi5cbiAgICBjb25zdCBzaGFzdW0gPSAoMCwgY3J5cHRvXzEuY3JlYXRlSGFzaCkoJ3NoYTEnKTtcbiAgICBzaGFzdW0udXBkYXRlKHVyaSk7XG4gICAgY29uc3QgaGFzaCA9IHNoYXN1bS5kaWdlc3QoJ2hleCcpO1xuICAgIGRlYnVnKCdnZW5lcmF0ZWQgU0hBMSBoYXNoIGZvciBcImRhdGE6XCIgVVJJOiAlbycsIGhhc2gpO1xuICAgIC8vIGNoZWNrIGlmIHRoZSBjYWNoZSBpcyB0aGUgc2FtZSBcImRhdGE6XCIgVVJJIHRoYXQgd2FzIHByZXZpb3VzbHkgcGFzc2VkIGluLlxuICAgIGlmIChjYWNoZT8uaGFzaCA9PT0gaGFzaCkge1xuICAgICAgICBkZWJ1ZygnZ290IG1hdGNoaW5nIGNhY2hlIFNIQTEgaGFzaDogJW8nLCBoYXNoKTtcbiAgICAgICAgdGhyb3cgbmV3IG5vdG1vZGlmaWVkXzEuZGVmYXVsdCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGVidWcoJ2NyZWF0aW5nIFJlYWRhYmxlIHN0cmVhbSBmcm9tIFwiZGF0YTpcIiBVUkkgYnVmZmVyJyk7XG4gICAgICAgIGNvbnN0IHsgYnVmZmVyIH0gPSAoMCwgZGF0YV91cmlfdG9fYnVmZmVyXzEuZGF0YVVyaVRvQnVmZmVyKSh1cmkpO1xuICAgICAgICByZXR1cm4gbmV3IERhdGFSZWFkYWJsZShoYXNoLCBCdWZmZXIuZnJvbShidWZmZXIpKTtcbiAgICB9XG59O1xuZXhwb3J0cy5kYXRhID0gZGF0YTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGEuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmZpbGUgPSB2b2lkIDA7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBmc18xID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3QgZnNfZXh0cmFfMSA9IHJlcXVpcmUoXCJmcy1leHRyYVwiKTtcbmNvbnN0IG5vdGZvdW5kXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbm90Zm91bmRcIikpO1xuY29uc3Qgbm90bW9kaWZpZWRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9ub3Rtb2RpZmllZFwiKSk7XG5jb25zdCB1cmxfMSA9IHJlcXVpcmUoXCJ1cmxcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdnZXQtdXJpOmZpbGUnKTtcbi8qKlxuICogUmV0dXJucyBhIGBmcy5SZWFkU3RyZWFtYCBpbnN0YW5jZSBmcm9tIGEgXCJmaWxlOlwiIFVSSS5cbiAqL1xuY29uc3QgZmlsZSA9IGFzeW5jICh7IGhyZWY6IHVyaSB9LCBvcHRzID0ge30pID0+IHtcbiAgICBjb25zdCB7IGNhY2hlLCBmbGFncyA9ICdyJywgbW9kZSA9IDQzOCwgLy8gPTA2NjZcbiAgICAgfSA9IG9wdHM7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gQ29udmVydCBVUkkg4oaSIFBhdGhcbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSAoMCwgdXJsXzEuZmlsZVVSTFRvUGF0aCkodXJpKTtcbiAgICAgICAgZGVidWcoJ05vcm1hbGl6ZWQgcGF0aG5hbWU6ICVvJywgZmlsZXBhdGgpO1xuICAgICAgICAvLyBgb3BlbigpYCBmaXJzdCB0byBnZXQgYSBmaWxlIGRlc2NyaXB0b3IgYW5kIGVuc3VyZSB0aGF0IHRoZSBmaWxlXG4gICAgICAgIC8vIGV4aXN0cy5cbiAgICAgICAgY29uc3QgZmQgPSBhd2FpdCAoMCwgZnNfZXh0cmFfMS5vcGVuKShmaWxlcGF0aCwgZmxhZ3MsIG1vZGUpO1xuICAgICAgICAvLyBOb3cgYGZzdGF0KClgIHRvIGNoZWNrIHRoZSBgbXRpbWVgIGFuZCBzdG9yZSB0aGUgc3RhdCBvYmplY3QgZm9yXG4gICAgICAgIC8vIHRoZSBjYWNoZS5cbiAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0ICgwLCBmc19leHRyYV8xLmZzdGF0KShmZCk7XG4gICAgICAgIC8vIGlmIGEgYGNhY2hlYCB3YXMgcHJvdmlkZWQsIGNoZWNrIGlmIHRoZSBmaWxlIGhhcyBub3QgYmVlbiBtb2RpZmllZFxuICAgICAgICBpZiAoY2FjaGUgJiYgY2FjaGUuc3RhdCAmJiBzdGF0ICYmIGlzTm90TW9kaWZpZWQoY2FjaGUuc3RhdCwgc3RhdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBub3Rtb2RpZmllZF8xLmRlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBgZnMuUmVhZFN0cmVhbWAgdGFrZXMgY2FyZSBvZiBjYWxsaW5nIGBmcy5jbG9zZSgpYCBvbiB0aGVcbiAgICAgICAgLy8gZmQgYWZ0ZXIgaXQncyBkb25lIHJlYWRpbmdcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgQHR5cGVzL25vZGVgIGRvZXNuJ3QgYWxsb3cgYG51bGxgIGFzIGZpbGUgcGF0aCA6L1xuICAgICAgICBjb25zdCBycyA9ICgwLCBmc18xLmNyZWF0ZVJlYWRTdHJlYW0pKG51bGwsIHtcbiAgICAgICAgICAgIGF1dG9DbG9zZTogdHJ1ZSxcbiAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgICBmZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJzLnN0YXQgPSBzdGF0O1xuICAgICAgICByZXR1cm4gcnM7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IG5vdGZvdW5kXzEuZGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG59O1xuZXhwb3J0cy5maWxlID0gZmlsZTtcbi8vIHJldHVybnMgYHRydWVgIGlmIHRoZSBgbXRpbWVgIG9mIHRoZSAyIHN0YXQgb2JqZWN0cyBhcmUgZXF1YWxcbmZ1bmN0aW9uIGlzTm90TW9kaWZpZWQocHJldiwgY3Vycikge1xuICAgIHJldHVybiArcHJldi5tdGltZSA9PT0gK2N1cnIubXRpbWU7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5mdHAgPSB2b2lkIDA7XG5jb25zdCBiYXNpY19mdHBfMSA9IHJlcXVpcmUoXCJiYXNpYy1mdHBcIik7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jb25zdCBwYXRoXzEgPSByZXF1aXJlKFwicGF0aFwiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IG5vdGZvdW5kXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbm90Zm91bmRcIikpO1xuY29uc3Qgbm90bW9kaWZpZWRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9ub3Rtb2RpZmllZFwiKSk7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdnZXQtdXJpOmZ0cCcpO1xuLyoqXG4gKiBSZXR1cm5zIGEgUmVhZGFibGUgc3RyZWFtIGZyb20gYW4gXCJmdHA6XCIgVVJJLlxuICovXG5jb25zdCBmdHAgPSBhc3luYyAodXJsLCBvcHRzID0ge30pID0+IHtcbiAgICBjb25zdCB7IGNhY2hlIH0gPSBvcHRzO1xuICAgIGNvbnN0IGZpbGVwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KHVybC5wYXRobmFtZSk7XG4gICAgbGV0IGxhc3RNb2RpZmllZDtcbiAgICBpZiAoIWZpbGVwYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ05vIFwicGF0aG5hbWVcIiEnKTtcbiAgICB9XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IGJhc2ljX2Z0cF8xLkNsaWVudCgpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhvc3QgPSB1cmwuaG9zdG5hbWUgfHwgdXJsLmhvc3QgfHwgJ2xvY2FsaG9zdCc7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludCh1cmwucG9ydCB8fCAnMCcsIDEwKSB8fCAyMTtcbiAgICAgICAgY29uc3QgdXNlciA9IHVybC51c2VybmFtZVxuICAgICAgICAgICAgPyBkZWNvZGVVUklDb21wb25lbnQodXJsLnVzZXJuYW1lKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHBhc3N3b3JkID0gdXJsLnBhc3N3b3JkXG4gICAgICAgICAgICA/IGRlY29kZVVSSUNvbXBvbmVudCh1cmwucGFzc3dvcmQpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgYXdhaXQgY2xpZW50LmFjY2Vzcyh7XG4gICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBmaXJzdCB3ZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIExhc3QgTW9kaWZpZWQgZGF0ZS5cbiAgICAgICAgLy8gdHJ5IHRoZSBNRFRNIGNvbW1hbmQgZmlyc3QsIHdoaWNoIGlzIGFuIG9wdGlvbmFsIGV4dGVuc2lvbiBjb21tYW5kLlxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGFzdE1vZGlmaWVkID0gYXdhaXQgY2xpZW50Lmxhc3RNb2QoZmlsZXBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgXCJmaWxlIG5vdCBmb3VuZFwiIGVycm9yIGNvZGVcbiAgICAgICAgICAgIGlmIChlcnIuY29kZSA9PT0gNTUwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IG5vdGZvdW5kXzEuZGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gZ2V0IHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUgdmlhIHRoZSBMSVNUIGNvbW1hbmQgKHVzZXNcbiAgICAgICAgICAgIC8vIG1vcmUgYmFuZHdpZHRoLCBidXQgaXMgbW9yZSBjb21wYXRpYmxlIHdpdGggb2xkZXIgRlRQIHNlcnZlcnNcbiAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBhd2FpdCBjbGllbnQubGlzdCgoMCwgcGF0aF8xLmRpcm5hbWUpKGZpbGVwYXRoKSk7XG4gICAgICAgICAgICAvLyBhdHRlbXB0IHRvIGZpbmQgdGhlIFwiZW50cnlcIiB3aXRoIGEgbWF0Y2hpbmcgXCJuYW1lXCJcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSAoMCwgcGF0aF8xLmJhc2VuYW1lKShmaWxlcGF0aCk7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGxpc3QuZmluZCgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZCA9IGVudHJ5Lm1vZGlmaWVkQXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgaWYgKGlzTm90TW9kaWZpZWQoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBub3Rtb2RpZmllZF8xLmRlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBub3Rmb3VuZF8xLmRlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgc3RyZWFtXzEuUGFzc1Rocm91Z2goKTtcbiAgICAgICAgY29uc3QgcnMgPSBzdHJlYW07XG4gICAgICAgIGNsaWVudC5kb3dubG9hZFRvKHN0cmVhbSwgZmlsZXBhdGgpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgZGVidWcocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xpZW50LmNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBycy5sYXN0TW9kaWZpZWQgPSBsYXN0TW9kaWZpZWQ7XG4gICAgICAgIHJldHVybiBycztcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjbGllbnQuY2xvc2UoKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICAvLyBjYWxsZWQgd2hlbiBgbGFzdE1vZGlmaWVkYCBpcyBzZXQsIGFuZCBhIFwiY2FjaGVcIiBzdHJlYW0gd2FzIHByb3ZpZGVkXG4gICAgZnVuY3Rpb24gaXNOb3RNb2RpZmllZCgpIHtcbiAgICAgICAgaWYgKGNhY2hlPy5sYXN0TW9kaWZpZWQgJiYgbGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gK2NhY2hlLmxhc3RNb2RpZmllZCA9PT0gK2xhc3RNb2RpZmllZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbmV4cG9ydHMuZnRwID0gZnRwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnRwLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgaHR0cF8xID0gcmVxdWlyZShcImh0dHBcIik7XG4vKipcbiAqIEVycm9yIHN1YmNsYXNzIHRvIHVzZSB3aGVuIGFuIEhUVFAgYXBwbGljYXRpb24gZXJyb3IgaGFzIG9jY3VycmVkLlxuICovXG5jbGFzcyBIVFRQRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3Ioc3RhdHVzQ29kZSwgbWVzc2FnZSA9IGh0dHBfMS5TVEFUVVNfQ09ERVNbc3RhdHVzQ29kZV0pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gICAgICAgIHRoaXMuY29kZSA9IGBFJHtTdHJpbmcobWVzc2FnZSkudG9VcHBlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcnKX1gO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEhUVFBFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0dHAtZXJyb3IuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmh0dHAgPSB2b2lkIDA7XG5jb25zdCBodHRwXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImh0dHBcIikpO1xuY29uc3QgaHR0cHNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiaHR0cHNcIikpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpO1xuY29uc3QgaHR0cF9lcnJvcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2h0dHAtZXJyb3JcIikpO1xuY29uc3Qgbm90Zm91bmRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9ub3Rmb3VuZFwiKSk7XG5jb25zdCBub3Rtb2RpZmllZF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL25vdG1vZGlmaWVkXCIpKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2dldC11cmk6aHR0cCcpO1xuLyoqXG4gKiBSZXR1cm5zIGEgUmVhZGFibGUgc3RyZWFtIGZyb20gYW4gXCJodHRwOlwiIFVSSS5cbiAqL1xuY29uc3QgaHR0cCA9IGFzeW5jICh1cmwsIG9wdHMgPSB7fSkgPT4ge1xuICAgIGRlYnVnKCdHRVQgJW8nLCB1cmwuaHJlZik7XG4gICAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZSh1cmwsIG9wdHMuY2FjaGUpO1xuICAgIC8vIGZpcnN0IGNoZWNrIHRoZSBwcmV2aW91cyBFeHBpcmVzIGFuZC9vciBDYWNoZS1Db250cm9sIGhlYWRlcnNcbiAgICAvLyBvZiBhIHByZXZpb3VzIHJlc3BvbnNlIGlmIGEgYGNhY2hlYCB3YXMgcHJvdmlkZWRcbiAgICBpZiAoY2FjaGUgJiYgaXNGcmVzaChjYWNoZSkgJiYgdHlwZW9mIGNhY2hlLnN0YXR1c0NvZGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIGNoZWNrIGZvciBhIDN4eCBcInJlZGlyZWN0XCIgc3RhdHVzIGNvZGUgb24gdGhlIHByZXZpb3VzIGNhY2hlXG4gICAgICAgIGNvbnN0IHR5cGUgPSAoY2FjaGUuc3RhdHVzQ29kZSAvIDEwMCkgfCAwO1xuICAgICAgICBpZiAodHlwZSA9PT0gMyAmJiBjYWNoZS5oZWFkZXJzLmxvY2F0aW9uKSB7XG4gICAgICAgICAgICBkZWJ1ZygnY2FjaGVkIHJlZGlyZWN0Jyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE86IGltcGxlbWVudCBjYWNoZWQgcmVkaXJlY3RzIScpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG90aGVyd2lzZSB3ZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBkZXN0aW5hdGlvbiBlbmRwb2ludCxcbiAgICAgICAgLy8gc2luY2UgdGhlcmUncyBub3doZXJlIGVsc2UgdG8gcmVkaXJlY3QgdG9cbiAgICAgICAgdGhyb3cgbmV3IG5vdG1vZGlmaWVkXzEuZGVmYXVsdCgpO1xuICAgIH1cbiAgICAvLyA1IHJlZGlyZWN0cyBhbGxvd2VkIGJ5IGRlZmF1bHRcbiAgICBjb25zdCBtYXhSZWRpcmVjdHMgPSB0eXBlb2Ygb3B0cy5tYXhSZWRpcmVjdHMgPT09ICdudW1iZXInID8gb3B0cy5tYXhSZWRpcmVjdHMgOiA1O1xuICAgIGRlYnVnKCdhbGxvd2luZyAlbyBtYXggcmVkaXJlY3RzJywgbWF4UmVkaXJlY3RzKTtcbiAgICBsZXQgbW9kO1xuICAgIGlmIChvcHRzLmh0dHApIHtcbiAgICAgICAgLy8gdGhlIGBodHRwc2AgbW9kdWxlIHBhc3NlZCBpbiBmcm9tIHRoZSBcImh0dHAuanNcIiBmaWxlXG4gICAgICAgIG1vZCA9IG9wdHMuaHR0cDtcbiAgICAgICAgZGVidWcoJ3VzaW5nIHNlY3VyZSBgaHR0cHNgIGNvcmUgbW9kdWxlJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBtb2QgPSBodHRwXzEuZGVmYXVsdDtcbiAgICAgICAgZGVidWcoJ3VzaW5nIGBodHRwYCBjb3JlIG1vZHVsZScpO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zID0geyAuLi5vcHRzIH07XG4gICAgLy8gYWRkIFwiY2FjaGUgdmFsaWRhdGlvblwiIGhlYWRlcnMgaWYgYSBgY2FjaGVgIHdhcyBwcm92aWRlZFxuICAgIGlmIChjYWNoZSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGFzdE1vZGlmaWVkID0gY2FjaGUuaGVhZGVyc1snbGFzdC1tb2RpZmllZCddO1xuICAgICAgICBpZiAobGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0lmLU1vZGlmaWVkLVNpbmNlJ10gPSBsYXN0TW9kaWZpZWQ7XG4gICAgICAgICAgICBkZWJ1ZygnYWRkZWQgXCJJZi1Nb2RpZmllZC1TaW5jZVwiIHJlcXVlc3QgaGVhZGVyOiAlbycsIGxhc3RNb2RpZmllZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXRhZyA9IGNhY2hlLmhlYWRlcnMuZXRhZztcbiAgICAgICAgaWYgKGV0YWcpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1snSWYtTm9uZS1NYXRjaCddID0gZXRhZztcbiAgICAgICAgICAgIGRlYnVnKCdhZGRlZCBcIklmLU5vbmUtTWF0Y2hcIiByZXF1ZXN0IGhlYWRlcjogJW8nLCBldGFnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXEgPSBtb2QuZ2V0KHVybCwgb3B0aW9ucyk7XG4gICAgY29uc3QgW3Jlc10gPSBhd2FpdCAoMCwgZXZlbnRzXzEub25jZSkocmVxLCAncmVzcG9uc2UnKTtcbiAgICBjb25zdCBjb2RlID0gcmVzLnN0YXR1c0NvZGUgfHwgMDtcbiAgICAvLyBhc3NpZ24gYSBEYXRlIHRvIHRoaXMgcmVzcG9uc2UgZm9yIHRoZSBcIkNhY2hlLUNvbnRyb2xcIiBkZWx0YSBjYWxjdWxhdGlvblxuICAgIHJlcy5kYXRlID0gRGF0ZS5ub3coKTtcbiAgICByZXMucGFyc2VkID0gdXJsO1xuICAgIGRlYnVnKCdnb3QgJW8gcmVzcG9uc2Ugc3RhdHVzIGNvZGUnLCBjb2RlKTtcbiAgICAvLyBhbnkgMnh4IHJlc3BvbnNlIGlzIGEgXCJzdWNjZXNzXCIgY29kZVxuICAgIGNvbnN0IHR5cGUgPSAoY29kZSAvIDEwMCkgfCAwO1xuICAgIC8vIGNoZWNrIGZvciBhIDN4eCBcInJlZGlyZWN0XCIgc3RhdHVzIGNvZGVcbiAgICBjb25zdCBsb2NhdGlvbiA9IHJlcy5oZWFkZXJzLmxvY2F0aW9uO1xuICAgIGlmICh0eXBlID09PSAzICYmIGxvY2F0aW9uKSB7XG4gICAgICAgIGlmICghb3B0cy5yZWRpcmVjdHMpXG4gICAgICAgICAgICBvcHRzLnJlZGlyZWN0cyA9IFtdO1xuICAgICAgICBjb25zdCByZWRpcmVjdHMgPSBvcHRzLnJlZGlyZWN0cztcbiAgICAgICAgaWYgKHJlZGlyZWN0cy5sZW5ndGggPCBtYXhSZWRpcmVjdHMpIHtcbiAgICAgICAgICAgIGRlYnVnKCdnb3QgYSBcInJlZGlyZWN0XCIgc3RhdHVzIGNvZGUgd2l0aCBMb2NhdGlvbjogJW8nLCBsb2NhdGlvbik7XG4gICAgICAgICAgICAvLyBmbHVzaCB0aGlzIHJlc3BvbnNlIC0gd2UncmUgbm90IGdvaW5nIHRvIHVzZSBpdFxuICAgICAgICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgICAgICAgLy8gaGFuZyBvbiB0byB0aGlzIFJlc3BvbnNlIG9iamVjdCBmb3IgdGhlIFwicmVkaXJlY3RzXCIgQXJyYXlcbiAgICAgICAgICAgIHJlZGlyZWN0cy5wdXNoKHJlcyk7XG4gICAgICAgICAgICBjb25zdCBuZXdVcmkgPSBuZXcgVVJMKGxvY2F0aW9uLCB1cmwuaHJlZik7XG4gICAgICAgICAgICBkZWJ1ZygncmVzb2x2ZWQgcmVkaXJlY3QgVVJMOiAlbycsIG5ld1VyaS5ocmVmKTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBtYXhSZWRpcmVjdHMgLSByZWRpcmVjdHMubGVuZ3RoO1xuICAgICAgICAgICAgZGVidWcoJyVvIG1vcmUgcmVkaXJlY3RzIGFsbG93ZWQgYWZ0ZXIgdGhpcyBvbmUnLCBsZWZ0KTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHJlZGlyZWN0aW5nIHRvIGEgZGlmZmVyZW50IHByb3RvY29sXG4gICAgICAgICAgICBpZiAobmV3VXJpLnByb3RvY29sICE9PSB1cmwucHJvdG9jb2wpIHtcbiAgICAgICAgICAgICAgICBvcHRzLmh0dHAgPSBuZXdVcmkucHJvdG9jb2wgPT09ICdodHRwczonID8gaHR0cHNfMS5kZWZhdWx0IDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICgwLCBleHBvcnRzLmh0dHApKG5ld1VyaSwgb3B0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaWYgd2UgZGlkbid0IGdldCBhIDJ4eCBcInN1Y2Nlc3NcIiBzdGF0dXMgY29kZSwgdGhlbiBjcmVhdGUgYW4gRXJyb3Igb2JqZWN0XG4gICAgaWYgKHR5cGUgIT09IDIpIHtcbiAgICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgICBpZiAoY29kZSA9PT0gMzA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgbm90bW9kaWZpZWRfMS5kZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PT0gNDA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgbm90Zm91bmRfMS5kZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXIgSFRUUC1sZXZlbCBlcnJvclxuICAgICAgICB0aHJvdyBuZXcgaHR0cF9lcnJvcl8xLmRlZmF1bHQoY29kZSk7XG4gICAgfVxuICAgIGlmIChvcHRzLnJlZGlyZWN0cykge1xuICAgICAgICAvLyBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgXCJyZWRpcmVjdHNcIiBBcnJheSBvbiB0aGUgUmVzcG9uc2Ugb2JqZWN0IHNvIHRoYXRcbiAgICAgICAgLy8gdGhleSBjYW4gYmUgaW5zcGVjdGVkIGR1cmluZyBhIHN1YnNlcXVlbnQgY2FsbCB0byBHRVQgdGhlIHNhbWUgVVJJXG4gICAgICAgIHJlcy5yZWRpcmVjdHMgPSBvcHRzLnJlZGlyZWN0cztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn07XG5leHBvcnRzLmh0dHAgPSBodHRwO1xuLyoqXG4gKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvdmlkZWQgY2FjaGUncyBcImZyZXNobmVzc1wiIGlzIHZhbGlkLiBUaGF0IGlzLCBlaXRoZXJcbiAqIHRoZSBDYWNoZS1Db250cm9sIGhlYWRlciBvciBFeHBpcmVzIGhlYWRlciB2YWx1ZXMgYXJlIHN0aWxsIHdpdGhpbiB0aGUgYWxsb3dlZFxuICogdGltZSBwZXJpb2QuXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpc0ZyZXNoKGNhY2hlKSB7XG4gICAgbGV0IGZyZXNoID0gZmFsc2U7XG4gICAgbGV0IGV4cGlyZXMgPSBwYXJzZUludChjYWNoZS5oZWFkZXJzLmV4cGlyZXMgfHwgJycsIDEwKTtcbiAgICBjb25zdCBjYWNoZUNvbnRyb2wgPSBjYWNoZS5oZWFkZXJzWydjYWNoZS1jb250cm9sJ107XG4gICAgaWYgKGNhY2hlQ29udHJvbCkge1xuICAgICAgICAvLyBmb3IgQ2FjaGUtQ29udHJvbCBydWxlcywgc2VlOiBodHRwOi8vd3d3Lm1ub3QubmV0L2NhY2hlX2RvY3MvI0NBQ0hFLUNPTlRST0xcbiAgICAgICAgZGVidWcoJ0NhY2hlLUNvbnRyb2w6ICVvJywgY2FjaGVDb250cm9sKTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBjYWNoZUNvbnRyb2wuc3BsaXQoLyxcXHMqP1xcYi8pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgICAgICBjb25zdCBzdWJwYXJ0cyA9IHBhcnQuc3BsaXQoJz0nKTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBzdWJwYXJ0c1swXTtcbiAgICAgICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ21heC1hZ2UnOlxuICAgICAgICAgICAgICAgICAgICBleHBpcmVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIChjYWNoZS5kYXRlIHx8IDApICsgcGFyc2VJbnQoc3VicGFydHNbMV0sIDEwKSAqIDEwMDA7XG4gICAgICAgICAgICAgICAgICAgIGZyZXNoID0gRGF0ZS5ub3coKSA8IGV4cGlyZXM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcmVzaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoJ2NhY2hlIGlzIFwiZnJlc2hcIiBkdWUgdG8gcHJldmlvdXMgJW8gQ2FjaGUtQ29udHJvbCBwYXJhbScsIHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmVzaDtcbiAgICAgICAgICAgICAgICBjYXNlICdtdXN0LXJldmFsaWRhdGUnOlxuICAgICAgICAgICAgICAgICAgICAvLyBYWFg6IHdoYXQgd2Ugc3VwcG9zZWQgdG8gZG8gaGVyZT9cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbm8tY2FjaGUnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ25vLXN0b3JlJzpcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoJ2NhY2hlIGlzIFwic3RhbGVcIiBkdWUgdG8gZXhwbGljaXQgJW8gQ2FjaGUtQ29udHJvbCBwYXJhbScsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHVua25vd24gY2FjaGUgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZXhwaXJlcykge1xuICAgICAgICAvLyBmb3IgRXhwaXJlcyBydWxlcywgc2VlOiBodHRwOi8vd3d3Lm1ub3QubmV0L2NhY2hlX2RvY3MvI0VYUElSRVNcbiAgICAgICAgZGVidWcoJ0V4cGlyZXM6ICVvJywgZXhwaXJlcyk7XG4gICAgICAgIGZyZXNoID0gRGF0ZS5ub3coKSA8IGV4cGlyZXM7XG4gICAgICAgIGlmIChmcmVzaCkge1xuICAgICAgICAgICAgZGVidWcoJ2NhY2hlIGlzIFwiZnJlc2hcIiBkdWUgdG8gcHJldmlvdXMgRXhwaXJlcyByZXNwb25zZSBoZWFkZXInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJlc2g7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8qKlxuICogQXR0ZW1wdHMgdG8gcmV0dXJuIGEgcHJldmlvdXMgUmVzcG9uc2Ugb2JqZWN0IGZyb20gYSBwcmV2aW91cyBHRVQgY2FsbCB0byB0aGVcbiAqIHNhbWUgVVJJLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRDYWNoZSh1cmwsIGNhY2hlKSB7XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGlmIChjYWNoZS5wYXJzZWQgJiYgY2FjaGUucGFyc2VkLmhyZWYgPT09IHVybC5ocmVmKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhY2hlLnJlZGlyZWN0cykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWNoZS5yZWRpcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gZ2V0Q2FjaGUodXJsLCBjYWNoZS5yZWRpcmVjdHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0dHAuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmh0dHBzID0gdm9pZCAwO1xuY29uc3QgaHR0cHNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiaHR0cHNcIikpO1xuY29uc3QgaHR0cF8xID0gcmVxdWlyZShcIi4vaHR0cFwiKTtcbi8qKlxuICogUmV0dXJucyBhIFJlYWRhYmxlIHN0cmVhbSBmcm9tIGFuIFwiaHR0cHM6XCIgVVJJLlxuICovXG5jb25zdCBodHRwcyA9ICh1cmwsIG9wdHMpID0+IHtcbiAgICByZXR1cm4gKDAsIGh0dHBfMS5odHRwKSh1cmwsIHsgLi4ub3B0cywgaHR0cDogaHR0cHNfMS5kZWZhdWx0IH0pO1xufTtcbmV4cG9ydHMuaHR0cHMgPSBodHRwcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0dHBzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRVcmkgPSBleHBvcnRzLmlzVmFsaWRQcm90b2NvbCA9IGV4cG9ydHMucHJvdG9jb2xzID0gdm9pZCAwO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpO1xuLy8gQnVpbHQtaW4gcHJvdG9jb2xzXG5jb25zdCBkYXRhXzEgPSByZXF1aXJlKFwiLi9kYXRhXCIpO1xuY29uc3QgZmlsZV8xID0gcmVxdWlyZShcIi4vZmlsZVwiKTtcbmNvbnN0IGZ0cF8xID0gcmVxdWlyZShcIi4vZnRwXCIpO1xuY29uc3QgaHR0cF8xID0gcmVxdWlyZShcIi4vaHR0cFwiKTtcbmNvbnN0IGh0dHBzXzEgPSByZXF1aXJlKFwiLi9odHRwc1wiKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2dldC11cmknKTtcbmV4cG9ydHMucHJvdG9jb2xzID0ge1xuICAgIGRhdGE6IGRhdGFfMS5kYXRhLFxuICAgIGZpbGU6IGZpbGVfMS5maWxlLFxuICAgIGZ0cDogZnRwXzEuZnRwLFxuICAgIGh0dHA6IGh0dHBfMS5odHRwLFxuICAgIGh0dHBzOiBodHRwc18xLmh0dHBzLFxufTtcbmNvbnN0IFZBTElEX1BST1RPQ09MUyA9IG5ldyBTZXQoT2JqZWN0LmtleXMoZXhwb3J0cy5wcm90b2NvbHMpKTtcbmZ1bmN0aW9uIGlzVmFsaWRQcm90b2NvbChwKSB7XG4gICAgcmV0dXJuIFZBTElEX1BST1RPQ09MUy5oYXMocCk7XG59XG5leHBvcnRzLmlzVmFsaWRQcm90b2NvbCA9IGlzVmFsaWRQcm90b2NvbDtcbi8qKlxuICogQXN5bmMgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgYHN0cmVhbS5SZWFkYWJsZWAgaW5zdGFuY2UgdGhhdCB3aWxsIG91dHB1dFxuICogdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBVUkkuXG4gKlxuICogRm9yIGNhY2hpbmcgcHVycG9zZXMsIHlvdSBjYW4gcGFzcyBpbiBhIGBzdHJlYW1gIGluc3RhbmNlIGZyb20gYSBwcmV2aW91c1xuICogYGdldFVyaSgpYCBjYWxsIGFzIGEgYGNhY2hlOiBzdHJlYW1gIG9wdGlvbiwgYW5kIGlmIHRoZSBkZXN0aW5hdGlvbiBoYXNcbiAqIG5vdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGVuZHBvaW50IHdhcyByZXRyZWl2ZWQgdGhlbiB0aGUgY2FsbGJhY2tcbiAqIHdpbGwgYmUgaW52b2tlZCB3aXRoIGFuIEVycm9yIG9iamVjdCB3aXRoIGBjb2RlYCBzZXQgdG8gXCJFTk9UTU9ESUZJRURcIiBhbmRcbiAqIGBudWxsYCBmb3IgdGhlIFwic3RyZWFtXCIgaW5zdGFuY2UgYXJndW1lbnQuIEluIHRoaXMgY2FzZSwgeW91IGNhbiBza2lwXG4gKiByZXRyZWl2aW5nIHRoZSBmaWxlIGFnYWluIGFuZCBjb250aW51ZSB0byB1c2UgdGhlIHByZXZpb3VzIHBheWxvYWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVyaSBVUkkgdG8gcmV0cmlldmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIG9wdGlvbmFsIFwib3B0aW9uc1wiIG9iamVjdFxuICogQGFwaSBwdWJsaWNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0VXJpKHVyaSwgb3B0cykge1xuICAgIGRlYnVnKCdnZXRVcmkoJW8pJywgdXJpKTtcbiAgICBpZiAoIXVyaSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHBhc3MgaW4gYSBVUkkgdG8gXCJnZXRVcmkoKVwiJyk7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHR5cGVvZiB1cmkgPT09ICdzdHJpbmcnID8gbmV3IFVSTCh1cmkpIDogdXJpO1xuICAgIC8vIFN0cmlwIHRyYWlsaW5nIGA6YFxuICAgIGNvbnN0IHByb3RvY29sID0gdXJsLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpO1xuICAgIGlmICghaXNWYWxpZFByb3RvY29sKHByb3RvY29sKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCBwcm90b2NvbCBcIiR7cHJvdG9jb2x9XCIgc3BlY2lmaWVkIGluIFVSSTogXCIke3VyaX1cImApO1xuICAgIH1cbiAgICBjb25zdCBnZXR0ZXIgPSBleHBvcnRzLnByb3RvY29sc1twcm90b2NvbF07XG4gICAgcmV0dXJuIGdldHRlcih1cmwsIG9wdHMpO1xufVxuZXhwb3J0cy5nZXRVcmkgPSBnZXRVcmk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogRXJyb3Igc3ViY2xhc3MgdG8gdXNlIHdoZW4gdGhlIHNvdXJjZSBkb2VzIG5vdCBleGlzdCBhdCB0aGUgc3BlY2lmaWVkIGVuZHBvaW50LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIG9wdGlvbmFsIFwibWVzc2FnZVwiIHByb3BlcnR5IHRvIHNldFxuICogQGFwaSBwcm90ZWN0ZWRcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY2xhc3MgTm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UgfHwgJ0ZpbGUgZG9lcyBub3QgZXhpc3QgYXQgdGhlIHNwZWNpZmllZCBlbmRwb2ludCcpO1xuICAgICAgICB0aGlzLmNvZGUgPSAnRU5PVEZPVU5EJztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOb3RGb3VuZEVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm90Zm91bmQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKipcbiAqIEVycm9yIHN1YmNsYXNzIHRvIHVzZSB3aGVuIHRoZSBzb3VyY2UgaGFzIG5vdCBiZWVuIG1vZGlmaWVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIG9wdGlvbmFsIFwibWVzc2FnZVwiIHByb3BlcnR5IHRvIHNldFxuICogQGFwaSBwcm90ZWN0ZWRcbiAqL1xuY2xhc3MgTm90TW9kaWZpZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UgfHxcbiAgICAgICAgICAgICdTb3VyY2UgaGFzIG5vdCBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBwcm92aWVkIFwiY2FjaGVcIiwgcmUtdXNlIHByZXZpb3VzIHJlc3VsdHMnKTtcbiAgICAgICAgdGhpcy5jb2RlID0gJ0VOT1RNT0RJRklFRCc7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gTm90TW9kaWZpZWRFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vdG1vZGlmaWVkLmpzLm1hcCIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsb25lXG5cbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmouX19wcm90b19fXG59XG5cbmZ1bmN0aW9uIGNsb25lIChvYmopIHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JylcbiAgICByZXR1cm4gb2JqXG5cbiAgaWYgKG9iaiBpbnN0YW5jZW9mIE9iamVjdClcbiAgICB2YXIgY29weSA9IHsgX19wcm90b19fOiBnZXRQcm90b3R5cGVPZihvYmopIH1cbiAgZWxzZVxuICAgIHZhciBjb3B5ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvcHksIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkpXG4gIH0pXG5cbiAgcmV0dXJuIGNvcHlcbn1cbiIsInZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcbnZhciBwb2x5ZmlsbHMgPSByZXF1aXJlKCcuL3BvbHlmaWxscy5qcycpXG52YXIgbGVnYWN5ID0gcmVxdWlyZSgnLi9sZWdhY3ktc3RyZWFtcy5qcycpXG52YXIgY2xvbmUgPSByZXF1aXJlKCcuL2Nsb25lLmpzJylcblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJylcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgLSBub2RlIDAueCBwb2x5ZmlsbCAqL1xudmFyIGdyYWNlZnVsUXVldWVcbnZhciBwcmV2aW91c1N5bWJvbFxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAtIG5vZGUgMC54IHBvbHlmaWxsICovXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLmZvciA9PT0gJ2Z1bmN0aW9uJykge1xuICBncmFjZWZ1bFF1ZXVlID0gU3ltYm9sLmZvcignZ3JhY2VmdWwtZnMucXVldWUnKVxuICAvLyBUaGlzIGlzIHVzZWQgaW4gdGVzdGluZyBieSBmdXR1cmUgdmVyc2lvbnNcbiAgcHJldmlvdXNTeW1ib2wgPSBTeW1ib2wuZm9yKCdncmFjZWZ1bC1mcy5wcmV2aW91cycpXG59IGVsc2Uge1xuICBncmFjZWZ1bFF1ZXVlID0gJ19fX2dyYWNlZnVsLWZzLnF1ZXVlJ1xuICBwcmV2aW91c1N5bWJvbCA9ICdfX19ncmFjZWZ1bC1mcy5wcmV2aW91cydcbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBwdWJsaXNoUXVldWUoY29udGV4dCwgcXVldWUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnRleHQsIGdyYWNlZnVsUXVldWUsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlXG4gICAgfVxuICB9KVxufVxuXG52YXIgZGVidWcgPSBub29wXG5pZiAodXRpbC5kZWJ1Z2xvZylcbiAgZGVidWcgPSB1dGlsLmRlYnVnbG9nKCdnZnM0JylcbmVsc2UgaWYgKC9cXGJnZnM0XFxiL2kudGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnKSlcbiAgZGVidWcgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbSA9IHV0aWwuZm9ybWF0LmFwcGx5KHV0aWwsIGFyZ3VtZW50cylcbiAgICBtID0gJ0dGUzQ6ICcgKyBtLnNwbGl0KC9cXG4vKS5qb2luKCdcXG5HRlM0OiAnKVxuICAgIGNvbnNvbGUuZXJyb3IobSlcbiAgfVxuXG4vLyBPbmNlIHRpbWUgaW5pdGlhbGl6YXRpb25cbmlmICghZnNbZ3JhY2VmdWxRdWV1ZV0pIHtcbiAgLy8gVGhpcyBxdWV1ZSBjYW4gYmUgc2hhcmVkIGJ5IG11bHRpcGxlIGxvYWRlZCBpbnN0YW5jZXNcbiAgdmFyIHF1ZXVlID0gZ2xvYmFsW2dyYWNlZnVsUXVldWVdIHx8IFtdXG4gIHB1Ymxpc2hRdWV1ZShmcywgcXVldWUpXG5cbiAgLy8gUGF0Y2ggZnMuY2xvc2UvY2xvc2VTeW5jIHRvIHNoYXJlZCBxdWV1ZSB2ZXJzaW9uLCBiZWNhdXNlIHdlIG5lZWRcbiAgLy8gdG8gcmV0cnkoKSB3aGVuZXZlciBhIGNsb3NlIGhhcHBlbnMgKmFueXdoZXJlKiBpbiB0aGUgcHJvZ3JhbS5cbiAgLy8gVGhpcyBpcyBlc3NlbnRpYWwgd2hlbiBtdWx0aXBsZSBncmFjZWZ1bC1mcyBpbnN0YW5jZXMgYXJlXG4gIC8vIGluIHBsYXkgYXQgdGhlIHNhbWUgdGltZS5cbiAgZnMuY2xvc2UgPSAoZnVuY3Rpb24gKGZzJGNsb3NlKSB7XG4gICAgZnVuY3Rpb24gY2xvc2UgKGZkLCBjYikge1xuICAgICAgcmV0dXJuIGZzJGNsb3NlLmNhbGwoZnMsIGZkLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZ3JhY2VmdWwtZnMgc2hhcmVkIHF1ZXVlXG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgcmVzZXRRdWV1ZSgpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsb3NlLCBwcmV2aW91c1N5bWJvbCwge1xuICAgICAgdmFsdWU6IGZzJGNsb3NlXG4gICAgfSlcbiAgICByZXR1cm4gY2xvc2VcbiAgfSkoZnMuY2xvc2UpXG5cbiAgZnMuY2xvc2VTeW5jID0gKGZ1bmN0aW9uIChmcyRjbG9zZVN5bmMpIHtcbiAgICBmdW5jdGlvbiBjbG9zZVN5bmMgKGZkKSB7XG4gICAgICAvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGdyYWNlZnVsLWZzIHNoYXJlZCBxdWV1ZVxuICAgICAgZnMkY2xvc2VTeW5jLmFwcGx5KGZzLCBhcmd1bWVudHMpXG4gICAgICByZXNldFF1ZXVlKClcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xvc2VTeW5jLCBwcmV2aW91c1N5bWJvbCwge1xuICAgICAgdmFsdWU6IGZzJGNsb3NlU3luY1xuICAgIH0pXG4gICAgcmV0dXJuIGNsb3NlU3luY1xuICB9KShmcy5jbG9zZVN5bmMpXG5cbiAgaWYgKC9cXGJnZnM0XFxiL2kudGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnKSkge1xuICAgIHByb2Nlc3Mub24oJ2V4aXQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGRlYnVnKGZzW2dyYWNlZnVsUXVldWVdKVxuICAgICAgcmVxdWlyZSgnYXNzZXJ0JykuZXF1YWwoZnNbZ3JhY2VmdWxRdWV1ZV0ubGVuZ3RoLCAwKVxuICAgIH0pXG4gIH1cbn1cblxuaWYgKCFnbG9iYWxbZ3JhY2VmdWxRdWV1ZV0pIHtcbiAgcHVibGlzaFF1ZXVlKGdsb2JhbCwgZnNbZ3JhY2VmdWxRdWV1ZV0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhdGNoKGNsb25lKGZzKSlcbmlmIChwcm9jZXNzLmVudi5URVNUX0dSQUNFRlVMX0ZTX0dMT0JBTF9QQVRDSCAmJiAhZnMuX19wYXRjaGVkKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBwYXRjaChmcylcbiAgICBmcy5fX3BhdGNoZWQgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBwYXRjaCAoZnMpIHtcbiAgLy8gRXZlcnl0aGluZyB0aGF0IHJlZmVyZW5jZXMgdGhlIG9wZW4oKSBmdW5jdGlvbiBuZWVkcyB0byBiZSBpbiBoZXJlXG4gIHBvbHlmaWxscyhmcylcbiAgZnMuZ3JhY2VmdWxpZnkgPSBwYXRjaFxuXG4gIGZzLmNyZWF0ZVJlYWRTdHJlYW0gPSBjcmVhdGVSZWFkU3RyZWFtXG4gIGZzLmNyZWF0ZVdyaXRlU3RyZWFtID0gY3JlYXRlV3JpdGVTdHJlYW1cbiAgdmFyIGZzJHJlYWRGaWxlID0gZnMucmVhZEZpbGVcbiAgZnMucmVhZEZpbGUgPSByZWFkRmlsZVxuICBmdW5jdGlvbiByZWFkRmlsZSAocGF0aCwgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG9wdGlvbnMsIG9wdGlvbnMgPSBudWxsXG5cbiAgICByZXR1cm4gZ28kcmVhZEZpbGUocGF0aCwgb3B0aW9ucywgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyRyZWFkRmlsZSAocGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJHJlYWRGaWxlKHBhdGgsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kcmVhZEZpbGUsIFtwYXRoLCBvcHRpb25zLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHZhciBmcyR3cml0ZUZpbGUgPSBmcy53cml0ZUZpbGVcbiAgZnMud3JpdGVGaWxlID0gd3JpdGVGaWxlXG4gIGZ1bmN0aW9uIHdyaXRlRmlsZSAocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG9wdGlvbnMsIG9wdGlvbnMgPSBudWxsXG5cbiAgICByZXR1cm4gZ28kd3JpdGVGaWxlKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kd3JpdGVGaWxlIChwYXRoLCBkYXRhLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkd3JpdGVGaWxlKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kd3JpdGVGaWxlLCBbcGF0aCwgZGF0YSwgb3B0aW9ucywgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgZnMkYXBwZW5kRmlsZSA9IGZzLmFwcGVuZEZpbGVcbiAgaWYgKGZzJGFwcGVuZEZpbGUpXG4gICAgZnMuYXBwZW5kRmlsZSA9IGFwcGVuZEZpbGVcbiAgZnVuY3Rpb24gYXBwZW5kRmlsZSAocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG9wdGlvbnMsIG9wdGlvbnMgPSBudWxsXG5cbiAgICByZXR1cm4gZ28kYXBwZW5kRmlsZShwYXRoLCBkYXRhLCBvcHRpb25zLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJGFwcGVuZEZpbGUgKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyRhcHBlbmRGaWxlKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kYXBwZW5kRmlsZSwgW3BhdGgsIGRhdGEsIG9wdGlvbnMsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmFyIGZzJGNvcHlGaWxlID0gZnMuY29weUZpbGVcbiAgaWYgKGZzJGNvcHlGaWxlKVxuICAgIGZzLmNvcHlGaWxlID0gY29weUZpbGVcbiAgZnVuY3Rpb24gY29weUZpbGUgKHNyYywgZGVzdCwgZmxhZ3MsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBmbGFncyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBmbGFnc1xuICAgICAgZmxhZ3MgPSAwXG4gICAgfVxuICAgIHJldHVybiBnbyRjb3B5RmlsZShzcmMsIGRlc3QsIGZsYWdzLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJGNvcHlGaWxlIChzcmMsIGRlc3QsIGZsYWdzLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkY29weUZpbGUoc3JjLCBkZXN0LCBmbGFncywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtnbyRjb3B5RmlsZSwgW3NyYywgZGVzdCwgZmxhZ3MsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmFyIGZzJHJlYWRkaXIgPSBmcy5yZWFkZGlyXG4gIGZzLnJlYWRkaXIgPSByZWFkZGlyXG4gIHZhciBub1JlYWRkaXJPcHRpb25WZXJzaW9ucyA9IC9edlswLTVdXFwuL1xuICBmdW5jdGlvbiByZWFkZGlyIChwYXRoLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gb3B0aW9ucywgb3B0aW9ucyA9IG51bGxcblxuICAgIHZhciBnbyRyZWFkZGlyID0gbm9SZWFkZGlyT3B0aW9uVmVyc2lvbnMudGVzdChwcm9jZXNzLnZlcnNpb24pXG4gICAgICA/IGZ1bmN0aW9uIGdvJHJlYWRkaXIgKHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGZzJHJlYWRkaXIocGF0aCwgZnMkcmVhZGRpckNhbGxiYWNrKFxuICAgICAgICAgIHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWVcbiAgICAgICAgKSlcbiAgICAgIH1cbiAgICAgIDogZnVuY3Rpb24gZ28kcmVhZGRpciAocGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgICByZXR1cm4gZnMkcmVhZGRpcihwYXRoLCBvcHRpb25zLCBmcyRyZWFkZGlyQ2FsbGJhY2soXG4gICAgICAgICAgcGF0aCwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZVxuICAgICAgICApKVxuICAgICAgfVxuXG4gICAgcmV0dXJuIGdvJHJlYWRkaXIocGF0aCwgb3B0aW9ucywgY2IpXG5cbiAgICBmdW5jdGlvbiBmcyRyZWFkZGlyQ2FsbGJhY2sgKHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyLCBmaWxlcykge1xuICAgICAgICBpZiAoZXJyICYmIChlcnIuY29kZSA9PT0gJ0VNRklMRScgfHwgZXJyLmNvZGUgPT09ICdFTkZJTEUnKSlcbiAgICAgICAgICBlbnF1ZXVlKFtcbiAgICAgICAgICAgIGdvJHJlYWRkaXIsXG4gICAgICAgICAgICBbcGF0aCwgb3B0aW9ucywgY2JdLFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgc3RhcnRUaW1lIHx8IERhdGUubm93KCksXG4gICAgICAgICAgICBEYXRlLm5vdygpXG4gICAgICAgICAgXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGZpbGVzICYmIGZpbGVzLnNvcnQpXG4gICAgICAgICAgICBmaWxlcy5zb3J0KClcblxuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5jYWxsKHRoaXMsIGVyciwgZmlsZXMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAocHJvY2Vzcy52ZXJzaW9uLnN1YnN0cigwLCA0KSA9PT0gJ3YwLjgnKSB7XG4gICAgdmFyIGxlZ1N0cmVhbXMgPSBsZWdhY3koZnMpXG4gICAgUmVhZFN0cmVhbSA9IGxlZ1N0cmVhbXMuUmVhZFN0cmVhbVxuICAgIFdyaXRlU3RyZWFtID0gbGVnU3RyZWFtcy5Xcml0ZVN0cmVhbVxuICB9XG5cbiAgdmFyIGZzJFJlYWRTdHJlYW0gPSBmcy5SZWFkU3RyZWFtXG4gIGlmIChmcyRSZWFkU3RyZWFtKSB7XG4gICAgUmVhZFN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGZzJFJlYWRTdHJlYW0ucHJvdG90eXBlKVxuICAgIFJlYWRTdHJlYW0ucHJvdG90eXBlLm9wZW4gPSBSZWFkU3RyZWFtJG9wZW5cbiAgfVxuXG4gIHZhciBmcyRXcml0ZVN0cmVhbSA9IGZzLldyaXRlU3RyZWFtXG4gIGlmIChmcyRXcml0ZVN0cmVhbSkge1xuICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZnMkV3JpdGVTdHJlYW0ucHJvdG90eXBlKVxuICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZS5vcGVuID0gV3JpdGVTdHJlYW0kb3BlblxuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCAnUmVhZFN0cmVhbScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBSZWFkU3RyZWFtXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIFJlYWRTdHJlYW0gPSB2YWxcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmcywgJ1dyaXRlU3RyZWFtJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFdyaXRlU3RyZWFtXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIFdyaXRlU3RyZWFtID0gdmFsXG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuXG4gIC8vIGxlZ2FjeSBuYW1lc1xuICB2YXIgRmlsZVJlYWRTdHJlYW0gPSBSZWFkU3RyZWFtXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmcywgJ0ZpbGVSZWFkU3RyZWFtJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIEZpbGVSZWFkU3RyZWFtXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIEZpbGVSZWFkU3RyZWFtID0gdmFsXG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuICB2YXIgRmlsZVdyaXRlU3RyZWFtID0gV3JpdGVTdHJlYW1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZzLCAnRmlsZVdyaXRlU3RyZWFtJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIEZpbGVXcml0ZVN0cmVhbVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICBGaWxlV3JpdGVTdHJlYW0gPSB2YWxcbiAgICB9LFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG5cbiAgZnVuY3Rpb24gUmVhZFN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUmVhZFN0cmVhbSlcbiAgICAgIHJldHVybiBmcyRSZWFkU3RyZWFtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXNcbiAgICBlbHNlXG4gICAgICByZXR1cm4gUmVhZFN0cmVhbS5hcHBseShPYmplY3QuY3JlYXRlKFJlYWRTdHJlYW0ucHJvdG90eXBlKSwgYXJndW1lbnRzKVxuICB9XG5cbiAgZnVuY3Rpb24gUmVhZFN0cmVhbSRvcGVuICgpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICBvcGVuKHRoYXQucGF0aCwgdGhhdC5mbGFncywgdGhhdC5tb2RlLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBpZiAodGhhdC5hdXRvQ2xvc2UpXG4gICAgICAgICAgdGhhdC5kZXN0cm95KClcblxuICAgICAgICB0aGF0LmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhhdC5mZCA9IGZkXG4gICAgICAgIHRoYXQuZW1pdCgnb3BlbicsIGZkKVxuICAgICAgICB0aGF0LnJlYWQoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBXcml0ZVN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgV3JpdGVTdHJlYW0pXG4gICAgICByZXR1cm4gZnMkV3JpdGVTdHJlYW0uYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdGhpc1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBXcml0ZVN0cmVhbS5hcHBseShPYmplY3QuY3JlYXRlKFdyaXRlU3RyZWFtLnByb3RvdHlwZSksIGFyZ3VtZW50cylcbiAgfVxuXG4gIGZ1bmN0aW9uIFdyaXRlU3RyZWFtJG9wZW4gKCkge1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgIG9wZW4odGhhdC5wYXRoLCB0aGF0LmZsYWdzLCB0aGF0Lm1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHRoYXQuZGVzdHJveSgpXG4gICAgICAgIHRoYXQuZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGF0LmZkID0gZmRcbiAgICAgICAgdGhhdC5lbWl0KCdvcGVuJywgZmQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlYWRTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IGZzLlJlYWRTdHJlYW0ocGF0aCwgb3B0aW9ucylcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVdyaXRlU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBmcy5Xcml0ZVN0cmVhbShwYXRoLCBvcHRpb25zKVxuICB9XG5cbiAgdmFyIGZzJG9wZW4gPSBmcy5vcGVuXG4gIGZzLm9wZW4gPSBvcGVuXG4gIGZ1bmN0aW9uIG9wZW4gKHBhdGgsIGZsYWdzLCBtb2RlLCBjYikge1xuICAgIGlmICh0eXBlb2YgbW9kZSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiID0gbW9kZSwgbW9kZSA9IG51bGxcblxuICAgIHJldHVybiBnbyRvcGVuKHBhdGgsIGZsYWdzLCBtb2RlLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJG9wZW4gKHBhdGgsIGZsYWdzLCBtb2RlLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkb3BlbihwYXRoLCBmbGFncywgbW9kZSwgZnVuY3Rpb24gKGVyciwgZmQpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kb3BlbiwgW3BhdGgsIGZsYWdzLCBtb2RlLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmc1xufVxuXG5mdW5jdGlvbiBlbnF1ZXVlIChlbGVtKSB7XG4gIGRlYnVnKCdFTlFVRVVFJywgZWxlbVswXS5uYW1lLCBlbGVtWzFdKVxuICBmc1tncmFjZWZ1bFF1ZXVlXS5wdXNoKGVsZW0pXG4gIHJldHJ5KClcbn1cblxuLy8ga2VlcCB0cmFjayBvZiB0aGUgdGltZW91dCBiZXR3ZWVuIHJldHJ5KCkgY2FsbHNcbnZhciByZXRyeVRpbWVyXG5cbi8vIHJlc2V0IHRoZSBzdGFydFRpbWUgYW5kIGxhc3RUaW1lIHRvIG5vd1xuLy8gdGhpcyByZXNldHMgdGhlIHN0YXJ0IG9mIHRoZSA2MCBzZWNvbmQgb3ZlcmFsbCB0aW1lb3V0IGFzIHdlbGwgYXMgdGhlXG4vLyBkZWxheSBiZXR3ZWVuIGF0dGVtcHRzIHNvIHRoYXQgd2UnbGwgcmV0cnkgdGhlc2Ugam9icyBzb29uZXJcbmZ1bmN0aW9uIHJlc2V0UXVldWUgKCkge1xuICB2YXIgbm93ID0gRGF0ZS5ub3coKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZzW2dyYWNlZnVsUXVldWVdLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gZW50cmllcyB0aGF0IGFyZSBvbmx5IGEgbGVuZ3RoIG9mIDIgYXJlIGZyb20gYW4gb2xkZXIgdmVyc2lvbiwgZG9uJ3RcbiAgICAvLyBib3RoZXIgbW9kaWZ5aW5nIHRob3NlIHNpbmNlIHRoZXknbGwgYmUgcmV0cmllZCBhbnl3YXkuXG4gICAgaWYgKGZzW2dyYWNlZnVsUXVldWVdW2ldLmxlbmd0aCA+IDIpIHtcbiAgICAgIGZzW2dyYWNlZnVsUXVldWVdW2ldWzNdID0gbm93IC8vIHN0YXJ0VGltZVxuICAgICAgZnNbZ3JhY2VmdWxRdWV1ZV1baV1bNF0gPSBub3cgLy8gbGFzdFRpbWVcbiAgICB9XG4gIH1cbiAgLy8gY2FsbCByZXRyeSB0byBtYWtlIHN1cmUgd2UncmUgYWN0aXZlbHkgcHJvY2Vzc2luZyB0aGUgcXVldWVcbiAgcmV0cnkoKVxufVxuXG5mdW5jdGlvbiByZXRyeSAoKSB7XG4gIC8vIGNsZWFyIHRoZSB0aW1lciBhbmQgcmVtb3ZlIGl0IHRvIGhlbHAgcHJldmVudCB1bmludGVuZGVkIGNvbmN1cnJlbmN5XG4gIGNsZWFyVGltZW91dChyZXRyeVRpbWVyKVxuICByZXRyeVRpbWVyID0gdW5kZWZpbmVkXG5cbiAgaWYgKGZzW2dyYWNlZnVsUXVldWVdLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm5cblxuICB2YXIgZWxlbSA9IGZzW2dyYWNlZnVsUXVldWVdLnNoaWZ0KClcbiAgdmFyIGZuID0gZWxlbVswXVxuICB2YXIgYXJncyA9IGVsZW1bMV1cbiAgLy8gdGhlc2UgaXRlbXMgbWF5IGJlIHVuc2V0IGlmIHRoZXkgd2VyZSBhZGRlZCBieSBhbiBvbGRlciBncmFjZWZ1bC1mc1xuICB2YXIgZXJyID0gZWxlbVsyXVxuICB2YXIgc3RhcnRUaW1lID0gZWxlbVszXVxuICB2YXIgbGFzdFRpbWUgPSBlbGVtWzRdXG5cbiAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhIHN0YXJ0VGltZSB3ZSBoYXZlIG5vIHdheSBvZiBrbm93aW5nIGlmIHdlJ3ZlIHdhaXRlZFxuICAvLyBsb25nIGVub3VnaCwgc28gZ28gYWhlYWQgYW5kIHJldHJ5IHRoaXMgaXRlbSBub3dcbiAgaWYgKHN0YXJ0VGltZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZGVidWcoJ1JFVFJZJywgZm4ubmFtZSwgYXJncylcbiAgICBmbi5hcHBseShudWxsLCBhcmdzKVxuICB9IGVsc2UgaWYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gNjAwMDApIHtcbiAgICAvLyBpdCdzIGJlZW4gbW9yZSB0aGFuIDYwIHNlY29uZHMgdG90YWwsIGJhaWwgbm93XG4gICAgZGVidWcoJ1RJTUVPVVQnLCBmbi5uYW1lLCBhcmdzKVxuICAgIHZhciBjYiA9IGFyZ3MucG9wKClcbiAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IuY2FsbChudWxsLCBlcnIpXG4gIH0gZWxzZSB7XG4gICAgLy8gdGhlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gdGhlIGxhc3QgYXR0ZW1wdCBhbmQgcmlnaHQgbm93XG4gICAgdmFyIHNpbmNlQXR0ZW1wdCA9IERhdGUubm93KCkgLSBsYXN0VGltZVxuICAgIC8vIHRoZSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIHdoZW4gd2UgZmlyc3QgdHJpZWQsIGFuZCB3aGVuIHdlIGxhc3QgdHJpZWRcbiAgICAvLyByb3VuZGVkIHVwIHRvIGF0IGxlYXN0IDFcbiAgICB2YXIgc2luY2VTdGFydCA9IE1hdGgubWF4KGxhc3RUaW1lIC0gc3RhcnRUaW1lLCAxKVxuICAgIC8vIGJhY2tvZmYuIHdhaXQgbG9uZ2VyIHRoYW4gdGhlIHRvdGFsIHRpbWUgd2UndmUgYmVlbiByZXRyeWluZywgYnV0IG9ubHlcbiAgICAvLyB1cCB0byBhIG1heGltdW0gb2YgMTAwbXNcbiAgICB2YXIgZGVzaXJlZERlbGF5ID0gTWF0aC5taW4oc2luY2VTdGFydCAqIDEuMiwgMTAwKVxuICAgIC8vIGl0J3MgYmVlbiBsb25nIGVub3VnaCBzaW5jZSB0aGUgbGFzdCByZXRyeSwgZG8gaXQgYWdhaW5cbiAgICBpZiAoc2luY2VBdHRlbXB0ID49IGRlc2lyZWREZWxheSkge1xuICAgICAgZGVidWcoJ1JFVFJZJywgZm4ubmFtZSwgYXJncylcbiAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MuY29uY2F0KFtzdGFydFRpbWVdKSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgd2UgY2FuJ3QgZG8gdGhpcyBqb2IgeWV0LCBwdXNoIGl0IHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlXG4gICAgICAvLyBhbmQgbGV0IHRoZSBuZXh0IGl0ZXJhdGlvbiBjaGVjayBhZ2FpblxuICAgICAgZnNbZ3JhY2VmdWxRdWV1ZV0ucHVzaChlbGVtKVxuICAgIH1cbiAgfVxuXG4gIC8vIHNjaGVkdWxlIG91ciBuZXh0IHJ1biBpZiBvbmUgaXNuJ3QgYWxyZWFkeSBzY2hlZHVsZWRcbiAgaWYgKHJldHJ5VGltZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHJ5VGltZXIgPSBzZXRUaW1lb3V0KHJldHJ5LCAwKVxuICB9XG59XG4iLCJ2YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJykuU3RyZWFtXG5cbm1vZHVsZS5leHBvcnRzID0gbGVnYWN5XG5cbmZ1bmN0aW9uIGxlZ2FjeSAoZnMpIHtcbiAgcmV0dXJuIHtcbiAgICBSZWFkU3RyZWFtOiBSZWFkU3RyZWFtLFxuICAgIFdyaXRlU3RyZWFtOiBXcml0ZVN0cmVhbVxuICB9XG5cbiAgZnVuY3Rpb24gUmVhZFN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkU3RyZWFtKSkgcmV0dXJuIG5ldyBSZWFkU3RyZWFtKHBhdGgsIG9wdGlvbnMpO1xuXG4gICAgU3RyZWFtLmNhbGwodGhpcyk7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMuZmQgPSBudWxsO1xuICAgIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XG5cbiAgICB0aGlzLmZsYWdzID0gJ3InO1xuICAgIHRoaXMubW9kZSA9IDQzODsgLyo9MDY2NiovXG4gICAgdGhpcy5idWZmZXJTaXplID0gNjQgKiAxMDI0O1xuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAvLyBNaXhpbiBvcHRpb25zIGludG8gdGhpc1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2luZGV4XTtcbiAgICAgIHRoaXNba2V5XSA9IG9wdGlvbnNba2V5XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbmNvZGluZykgdGhpcy5zZXRFbmNvZGluZyh0aGlzLmVuY29kaW5nKTtcblxuICAgIGlmICh0aGlzLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICgnbnVtYmVyJyAhPT0gdHlwZW9mIHRoaXMuc3RhcnQpIHtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdzdGFydCBtdXN0IGJlIGEgTnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5lbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmVuZCA9IEluZmluaXR5O1xuICAgICAgfSBlbHNlIGlmICgnbnVtYmVyJyAhPT0gdHlwZW9mIHRoaXMuZW5kKSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignZW5kIG11c3QgYmUgYSBOdW1iZXInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3RhcnQgPiB0aGlzLmVuZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0IG11c3QgYmUgPD0gZW5kJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucG9zID0gdGhpcy5zdGFydDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mZCAhPT0gbnVsbCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5fcmVhZCgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnMub3Blbih0aGlzLnBhdGgsIHRoaXMuZmxhZ3MsIHRoaXMubW9kZSwgZnVuY3Rpb24gKGVyciwgZmQpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIHNlbGYucmVhZGFibGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZWxmLmZkID0gZmQ7XG4gICAgICBzZWxmLmVtaXQoJ29wZW4nLCBmZCk7XG4gICAgICBzZWxmLl9yZWFkKCk7XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIFdyaXRlU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdyaXRlU3RyZWFtKSkgcmV0dXJuIG5ldyBXcml0ZVN0cmVhbShwYXRoLCBvcHRpb25zKTtcblxuICAgIFN0cmVhbS5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLmZkID0gbnVsbDtcbiAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICAgIHRoaXMuZmxhZ3MgPSAndyc7XG4gICAgdGhpcy5lbmNvZGluZyA9ICdiaW5hcnknO1xuICAgIHRoaXMubW9kZSA9IDQzODsgLyo9MDY2NiovXG4gICAgdGhpcy5ieXRlc1dyaXR0ZW4gPSAwO1xuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAvLyBNaXhpbiBvcHRpb25zIGludG8gdGhpc1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2luZGV4XTtcbiAgICAgIHRoaXNba2V5XSA9IG9wdGlvbnNba2V5XTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoJ251bWJlcicgIT09IHR5cGVvZiB0aGlzLnN0YXJ0KSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignc3RhcnQgbXVzdCBiZSBhIE51bWJlcicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RhcnQgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc3RhcnQgbXVzdCBiZSA+PSB6ZXJvJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucG9zID0gdGhpcy5zdGFydDtcbiAgICB9XG5cbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuXG4gICAgaWYgKHRoaXMuZmQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX29wZW4gPSBmcy5vcGVuO1xuICAgICAgdGhpcy5fcXVldWUucHVzaChbdGhpcy5fb3BlbiwgdGhpcy5wYXRoLCB0aGlzLmZsYWdzLCB0aGlzLm1vZGUsIHVuZGVmaW5lZF0pO1xuICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH1cbiAgfVxufVxuIiwidmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJ2NvbnN0YW50cycpXG5cbnZhciBvcmlnQ3dkID0gcHJvY2Vzcy5jd2RcbnZhciBjd2QgPSBudWxsXG5cbnZhciBwbGF0Zm9ybSA9IHByb2Nlc3MuZW52LkdSQUNFRlVMX0ZTX1BMQVRGT1JNIHx8IHByb2Nlc3MucGxhdGZvcm1cblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCFjd2QpXG4gICAgY3dkID0gb3JpZ0N3ZC5jYWxsKHByb2Nlc3MpXG4gIHJldHVybiBjd2Rcbn1cbnRyeSB7XG4gIHByb2Nlc3MuY3dkKClcbn0gY2F0Y2ggKGVyKSB7fVxuXG4vLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCB1bnRpbCBub2RlLmpzIDEyIGlzIHJlcXVpcmVkXG5pZiAodHlwZW9mIHByb2Nlc3MuY2hkaXIgPT09ICdmdW5jdGlvbicpIHtcbiAgdmFyIGNoZGlyID0gcHJvY2Vzcy5jaGRpclxuICBwcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGQpIHtcbiAgICBjd2QgPSBudWxsXG4gICAgY2hkaXIuY2FsbChwcm9jZXNzLCBkKVxuICB9XG4gIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm9jZXNzLmNoZGlyLCBjaGRpcilcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaFxuXG5mdW5jdGlvbiBwYXRjaCAoZnMpIHtcbiAgLy8gKHJlLSlpbXBsZW1lbnQgc29tZSB0aGluZ3MgdGhhdCBhcmUga25vd24gYnVzdGVkIG9yIG1pc3NpbmcuXG5cbiAgLy8gbGNobW9kLCBicm9rZW4gcHJpb3IgdG8gMC42LjJcbiAgLy8gYmFjay1wb3J0IHRoZSBmaXggaGVyZS5cbiAgaWYgKGNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eSgnT19TWU1MSU5LJykgJiZcbiAgICAgIHByb2Nlc3MudmVyc2lvbi5tYXRjaCgvXnYwXFwuNlxcLlswLTJdfF52MFxcLjVcXC4vKSkge1xuICAgIHBhdGNoTGNobW9kKGZzKVxuICB9XG5cbiAgLy8gbHV0aW1lcyBpbXBsZW1lbnRhdGlvbiwgb3Igbm8tb3BcbiAgaWYgKCFmcy5sdXRpbWVzKSB7XG4gICAgcGF0Y2hMdXRpbWVzKGZzKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2lzYWFjcy9ub2RlLWdyYWNlZnVsLWZzL2lzc3Vlcy80XG4gIC8vIENob3duIHNob3VsZCBub3QgZmFpbCBvbiBlaW52YWwgb3IgZXBlcm0gaWYgbm9uLXJvb3QuXG4gIC8vIEl0IHNob3VsZCBub3QgZmFpbCBvbiBlbm9zeXMgZXZlciwgYXMgdGhpcyBqdXN0IGluZGljYXRlc1xuICAvLyB0aGF0IGEgZnMgZG9lc24ndCBzdXBwb3J0IHRoZSBpbnRlbmRlZCBvcGVyYXRpb24uXG5cbiAgZnMuY2hvd24gPSBjaG93bkZpeChmcy5jaG93bilcbiAgZnMuZmNob3duID0gY2hvd25GaXgoZnMuZmNob3duKVxuICBmcy5sY2hvd24gPSBjaG93bkZpeChmcy5sY2hvd24pXG5cbiAgZnMuY2htb2QgPSBjaG1vZEZpeChmcy5jaG1vZClcbiAgZnMuZmNobW9kID0gY2htb2RGaXgoZnMuZmNobW9kKVxuICBmcy5sY2htb2QgPSBjaG1vZEZpeChmcy5sY2htb2QpXG5cbiAgZnMuY2hvd25TeW5jID0gY2hvd25GaXhTeW5jKGZzLmNob3duU3luYylcbiAgZnMuZmNob3duU3luYyA9IGNob3duRml4U3luYyhmcy5mY2hvd25TeW5jKVxuICBmcy5sY2hvd25TeW5jID0gY2hvd25GaXhTeW5jKGZzLmxjaG93blN5bmMpXG5cbiAgZnMuY2htb2RTeW5jID0gY2htb2RGaXhTeW5jKGZzLmNobW9kU3luYylcbiAgZnMuZmNobW9kU3luYyA9IGNobW9kRml4U3luYyhmcy5mY2htb2RTeW5jKVxuICBmcy5sY2htb2RTeW5jID0gY2htb2RGaXhTeW5jKGZzLmxjaG1vZFN5bmMpXG5cbiAgZnMuc3RhdCA9IHN0YXRGaXgoZnMuc3RhdClcbiAgZnMuZnN0YXQgPSBzdGF0Rml4KGZzLmZzdGF0KVxuICBmcy5sc3RhdCA9IHN0YXRGaXgoZnMubHN0YXQpXG5cbiAgZnMuc3RhdFN5bmMgPSBzdGF0Rml4U3luYyhmcy5zdGF0U3luYylcbiAgZnMuZnN0YXRTeW5jID0gc3RhdEZpeFN5bmMoZnMuZnN0YXRTeW5jKVxuICBmcy5sc3RhdFN5bmMgPSBzdGF0Rml4U3luYyhmcy5sc3RhdFN5bmMpXG5cbiAgLy8gaWYgbGNobW9kL2xjaG93biBkbyBub3QgZXhpc3QsIHRoZW4gbWFrZSB0aGVtIG5vLW9wc1xuICBpZiAoZnMuY2htb2QgJiYgIWZzLmxjaG1vZCkge1xuICAgIGZzLmxjaG1vZCA9IGZ1bmN0aW9uIChwYXRoLCBtb2RlLCBjYikge1xuICAgICAgaWYgKGNiKSBwcm9jZXNzLm5leHRUaWNrKGNiKVxuICAgIH1cbiAgICBmcy5sY2htb2RTeW5jID0gZnVuY3Rpb24gKCkge31cbiAgfVxuICBpZiAoZnMuY2hvd24gJiYgIWZzLmxjaG93bikge1xuICAgIGZzLmxjaG93biA9IGZ1bmN0aW9uIChwYXRoLCB1aWQsIGdpZCwgY2IpIHtcbiAgICAgIGlmIChjYikgcHJvY2Vzcy5uZXh0VGljayhjYilcbiAgICB9XG4gICAgZnMubGNob3duU3luYyA9IGZ1bmN0aW9uICgpIHt9XG4gIH1cblxuICAvLyBvbiBXaW5kb3dzLCBBL1Ygc29mdHdhcmUgY2FuIGxvY2sgdGhlIGRpcmVjdG9yeSwgY2F1c2luZyB0aGlzXG4gIC8vIHRvIGZhaWwgd2l0aCBhbiBFQUNDRVMgb3IgRVBFUk0gaWYgdGhlIGRpcmVjdG9yeSBjb250YWlucyBuZXdseVxuICAvLyBjcmVhdGVkIGZpbGVzLiAgVHJ5IGFnYWluIG9uIGZhaWx1cmUsIGZvciB1cCB0byA2MCBzZWNvbmRzLlxuXG4gIC8vIFNldCB0aGUgdGltZW91dCB0aGlzIGxvbmcgYmVjYXVzZSBzb21lIFdpbmRvd3MgQW50aS1WaXJ1cywgc3VjaCBhcyBQYXJpdHlcbiAgLy8gYml0OSwgbWF5IGxvY2sgZmlsZXMgZm9yIHVwIHRvIGEgbWludXRlLCBjYXVzaW5nIG5wbSBwYWNrYWdlIGluc3RhbGxcbiAgLy8gZmFpbHVyZXMuIEFsc28sIHRha2UgY2FyZSB0byB5aWVsZCB0aGUgc2NoZWR1bGVyLiBXaW5kb3dzIHNjaGVkdWxpbmcgZ2l2ZXNcbiAgLy8gQ1BVIHRvIGEgYnVzeSBsb29waW5nIHByb2Nlc3MsIHdoaWNoIGNhbiBjYXVzZSB0aGUgcHJvZ3JhbSBjYXVzaW5nIHRoZSBsb2NrXG4gIC8vIGNvbnRlbnRpb24gdG8gYmUgc3RhcnZlZCBvZiBDUFUgYnkgbm9kZSwgc28gdGhlIGNvbnRlbnRpb24gZG9lc24ndCByZXNvbHZlLlxuICBpZiAocGxhdGZvcm0gPT09IFwid2luMzJcIikge1xuICAgIGZzLnJlbmFtZSA9IHR5cGVvZiBmcy5yZW5hbWUgIT09ICdmdW5jdGlvbicgPyBmcy5yZW5hbWVcbiAgICA6IChmdW5jdGlvbiAoZnMkcmVuYW1lKSB7XG4gICAgICBmdW5jdGlvbiByZW5hbWUgKGZyb20sIHRvLCBjYikge1xuICAgICAgICB2YXIgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgICAgIHZhciBiYWNrb2ZmID0gMDtcbiAgICAgICAgZnMkcmVuYW1lKGZyb20sIHRvLCBmdW5jdGlvbiBDQiAoZXIpIHtcbiAgICAgICAgICBpZiAoZXJcbiAgICAgICAgICAgICAgJiYgKGVyLmNvZGUgPT09IFwiRUFDQ0VTXCIgfHwgZXIuY29kZSA9PT0gXCJFUEVSTVwiIHx8IGVyLmNvZGUgPT09IFwiRUJVU1lcIilcbiAgICAgICAgICAgICAgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0IDwgNjAwMDApIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGZzLnN0YXQodG8sIGZ1bmN0aW9uIChzdGF0ZXIsIHN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlciAmJiBzdGF0ZXIuY29kZSA9PT0gXCJFTk9FTlRcIilcbiAgICAgICAgICAgICAgICAgIGZzJHJlbmFtZShmcm9tLCB0bywgQ0IpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgIGNiKGVyKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgYmFja29mZilcbiAgICAgICAgICAgIGlmIChiYWNrb2ZmIDwgMTAwKVxuICAgICAgICAgICAgICBiYWNrb2ZmICs9IDEwO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY2IpIGNiKGVyKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikgT2JqZWN0LnNldFByb3RvdHlwZU9mKHJlbmFtZSwgZnMkcmVuYW1lKVxuICAgICAgcmV0dXJuIHJlbmFtZVxuICAgIH0pKGZzLnJlbmFtZSlcbiAgfVxuXG4gIC8vIGlmIHJlYWQoKSByZXR1cm5zIEVBR0FJTiwgdGhlbiBqdXN0IHRyeSBpdCBhZ2Fpbi5cbiAgZnMucmVhZCA9IHR5cGVvZiBmcy5yZWFkICE9PSAnZnVuY3Rpb24nID8gZnMucmVhZFxuICA6IChmdW5jdGlvbiAoZnMkcmVhZCkge1xuICAgIGZ1bmN0aW9uIHJlYWQgKGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2tfKSB7XG4gICAgICB2YXIgY2FsbGJhY2tcbiAgICAgIGlmIChjYWxsYmFja18gJiYgdHlwZW9mIGNhbGxiYWNrXyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgZWFnQ291bnRlciA9IDBcbiAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoZXIsIF8sIF9fKSB7XG4gICAgICAgICAgaWYgKGVyICYmIGVyLmNvZGUgPT09ICdFQUdBSU4nICYmIGVhZ0NvdW50ZXIgPCAxMCkge1xuICAgICAgICAgICAgZWFnQ291bnRlciArK1xuICAgICAgICAgICAgcmV0dXJuIGZzJHJlYWQuY2FsbChmcywgZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaylcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FsbGJhY2tfLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZzJHJlYWQuY2FsbChmcywgZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaylcbiAgICB9XG5cbiAgICAvLyBUaGlzIGVuc3VyZXMgYHV0aWwucHJvbWlzaWZ5YCB3b3JrcyBhcyBpdCBkb2VzIGZvciBuYXRpdmUgYGZzLnJlYWRgLlxuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIE9iamVjdC5zZXRQcm90b3R5cGVPZihyZWFkLCBmcyRyZWFkKVxuICAgIHJldHVybiByZWFkXG4gIH0pKGZzLnJlYWQpXG5cbiAgZnMucmVhZFN5bmMgPSB0eXBlb2YgZnMucmVhZFN5bmMgIT09ICdmdW5jdGlvbicgPyBmcy5yZWFkU3luY1xuICA6IChmdW5jdGlvbiAoZnMkcmVhZFN5bmMpIHsgcmV0dXJuIGZ1bmN0aW9uIChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pIHtcbiAgICB2YXIgZWFnQ291bnRlciA9IDBcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZzJHJlYWRTeW5jLmNhbGwoZnMsIGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbilcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIGlmIChlci5jb2RlID09PSAnRUFHQUlOJyAmJiBlYWdDb3VudGVyIDwgMTApIHtcbiAgICAgICAgICBlYWdDb3VudGVyICsrXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlclxuICAgICAgfVxuICAgIH1cbiAgfX0pKGZzLnJlYWRTeW5jKVxuXG4gIGZ1bmN0aW9uIHBhdGNoTGNobW9kIChmcykge1xuICAgIGZzLmxjaG1vZCA9IGZ1bmN0aW9uIChwYXRoLCBtb2RlLCBjYWxsYmFjaykge1xuICAgICAgZnMub3BlbiggcGF0aFxuICAgICAgICAgICAgICwgY29uc3RhbnRzLk9fV1JPTkxZIHwgY29uc3RhbnRzLk9fU1lNTElOS1xuICAgICAgICAgICAgICwgbW9kZVxuICAgICAgICAgICAgICwgZnVuY3Rpb24gKGVyciwgZmQpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZXJyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIHByZWZlciB0byByZXR1cm4gdGhlIGNobW9kIGVycm9yLCBpZiBvbmUgb2NjdXJzLFxuICAgICAgICAvLyBidXQgc3RpbGwgdHJ5IHRvIGNsb3NlLCBhbmQgcmVwb3J0IGNsb3NpbmcgZXJyb3JzIGlmIHRoZXkgb2NjdXIuXG4gICAgICAgIGZzLmZjaG1vZChmZCwgbW9kZSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIGZzLmNsb3NlKGZkLCBmdW5jdGlvbihlcnIyKSB7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGVyciB8fCBlcnIyKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cblxuICAgIGZzLmxjaG1vZFN5bmMgPSBmdW5jdGlvbiAocGF0aCwgbW9kZSkge1xuICAgICAgdmFyIGZkID0gZnMub3BlblN5bmMocGF0aCwgY29uc3RhbnRzLk9fV1JPTkxZIHwgY29uc3RhbnRzLk9fU1lNTElOSywgbW9kZSlcblxuICAgICAgLy8gcHJlZmVyIHRvIHJldHVybiB0aGUgY2htb2QgZXJyb3IsIGlmIG9uZSBvY2N1cnMsXG4gICAgICAvLyBidXQgc3RpbGwgdHJ5IHRvIGNsb3NlLCBhbmQgcmVwb3J0IGNsb3NpbmcgZXJyb3JzIGlmIHRoZXkgb2NjdXIuXG4gICAgICB2YXIgdGhyZXcgPSB0cnVlXG4gICAgICB2YXIgcmV0XG4gICAgICB0cnkge1xuICAgICAgICByZXQgPSBmcy5mY2htb2RTeW5jKGZkLCBtb2RlKVxuICAgICAgICB0aHJldyA9IGZhbHNlXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAodGhyZXcpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICAgIH0gY2F0Y2ggKGVyKSB7fVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJldFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhdGNoTHV0aW1lcyAoZnMpIHtcbiAgICBpZiAoY29uc3RhbnRzLmhhc093blByb3BlcnR5KFwiT19TWU1MSU5LXCIpICYmIGZzLmZ1dGltZXMpIHtcbiAgICAgIGZzLmx1dGltZXMgPSBmdW5jdGlvbiAocGF0aCwgYXQsIG10LCBjYikge1xuICAgICAgICBmcy5vcGVuKHBhdGgsIGNvbnN0YW50cy5PX1NZTUxJTkssIGZ1bmN0aW9uIChlciwgZmQpIHtcbiAgICAgICAgICBpZiAoZXIpIHtcbiAgICAgICAgICAgIGlmIChjYikgY2IoZXIpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgZnMuZnV0aW1lcyhmZCwgYXQsIG10LCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgICAgICAgIGZzLmNsb3NlKGZkLCBmdW5jdGlvbiAoZXIyKSB7XG4gICAgICAgICAgICAgIGlmIChjYikgY2IoZXIgfHwgZXIyKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBmcy5sdXRpbWVzU3luYyA9IGZ1bmN0aW9uIChwYXRoLCBhdCwgbXQpIHtcbiAgICAgICAgdmFyIGZkID0gZnMub3BlblN5bmMocGF0aCwgY29uc3RhbnRzLk9fU1lNTElOSylcbiAgICAgICAgdmFyIHJldFxuICAgICAgICB2YXIgdGhyZXcgPSB0cnVlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0ID0gZnMuZnV0aW1lc1N5bmMoZmQsIGF0LCBtdClcbiAgICAgICAgICB0aHJldyA9IGZhbHNlXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKHRocmV3KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgICAgICB9IGNhdGNoIChlcikge31cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGZzLmZ1dGltZXMpIHtcbiAgICAgIGZzLmx1dGltZXMgPSBmdW5jdGlvbiAoX2EsIF9iLCBfYywgY2IpIHsgaWYgKGNiKSBwcm9jZXNzLm5leHRUaWNrKGNiKSB9XG4gICAgICBmcy5sdXRpbWVzU3luYyA9IGZ1bmN0aW9uICgpIHt9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2htb2RGaXggKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIG1vZGUsIGNiKSB7XG4gICAgICByZXR1cm4gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIG1vZGUsIGZ1bmN0aW9uIChlcikge1xuICAgICAgICBpZiAoY2hvd25Fck9rKGVyKSkgZXIgPSBudWxsXG4gICAgICAgIGlmIChjYikgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaG1vZEZpeFN5bmMgKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIG1vZGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBvcmlnLmNhbGwoZnMsIHRhcmdldCwgbW9kZSlcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIGlmICghY2hvd25Fck9rKGVyKSkgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGNob3duRml4IChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB1aWQsIGdpZCwgY2IpIHtcbiAgICAgIHJldHVybiBvcmlnLmNhbGwoZnMsIHRhcmdldCwgdWlkLCBnaWQsIGZ1bmN0aW9uIChlcikge1xuICAgICAgICBpZiAoY2hvd25Fck9rKGVyKSkgZXIgPSBudWxsXG4gICAgICAgIGlmIChjYikgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaG93bkZpeFN5bmMgKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHVpZCwgZ2lkKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIHVpZCwgZ2lkKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgaWYgKCFjaG93bkVyT2soZXIpKSB0aHJvdyBlclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXRGaXggKG9yaWcpIHtcbiAgICBpZiAoIW9yaWcpIHJldHVybiBvcmlnXG4gICAgLy8gT2xkZXIgdmVyc2lvbnMgb2YgTm9kZSBlcnJvbmVvdXNseSByZXR1cm5lZCBzaWduZWQgaW50ZWdlcnMgZm9yXG4gICAgLy8gdWlkICsgZ2lkLlxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBvcHRpb25zLCBjYikge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNiID0gb3B0aW9uc1xuICAgICAgICBvcHRpb25zID0gbnVsbFxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gY2FsbGJhY2sgKGVyLCBzdGF0cykge1xuICAgICAgICBpZiAoc3RhdHMpIHtcbiAgICAgICAgICBpZiAoc3RhdHMudWlkIDwgMCkgc3RhdHMudWlkICs9IDB4MTAwMDAwMDAwXG4gICAgICAgICAgaWYgKHN0YXRzLmdpZCA8IDApIHN0YXRzLmdpZCArPSAweDEwMDAwMDAwMFxuICAgICAgICB9XG4gICAgICAgIGlmIChjYikgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbnMgPyBvcmlnLmNhbGwoZnMsIHRhcmdldCwgb3B0aW9ucywgY2FsbGJhY2spXG4gICAgICAgIDogb3JpZy5jYWxsKGZzLCB0YXJnZXQsIGNhbGxiYWNrKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXRGaXhTeW5jIChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIC8vIE9sZGVyIHZlcnNpb25zIG9mIE5vZGUgZXJyb25lb3VzbHkgcmV0dXJuZWQgc2lnbmVkIGludGVnZXJzIGZvclxuICAgIC8vIHVpZCArIGdpZC5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgb3B0aW9ucykge1xuICAgICAgdmFyIHN0YXRzID0gb3B0aW9ucyA/IG9yaWcuY2FsbChmcywgdGFyZ2V0LCBvcHRpb25zKVxuICAgICAgICA6IG9yaWcuY2FsbChmcywgdGFyZ2V0KVxuICAgICAgaWYgKHN0YXRzKSB7XG4gICAgICAgIGlmIChzdGF0cy51aWQgPCAwKSBzdGF0cy51aWQgKz0gMHgxMDAwMDAwMDBcbiAgICAgICAgaWYgKHN0YXRzLmdpZCA8IDApIHN0YXRzLmdpZCArPSAweDEwMDAwMDAwMFxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRzO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVOT1NZUyBtZWFucyB0aGF0IHRoZSBmcyBkb2Vzbid0IHN1cHBvcnQgdGhlIG9wLiBKdXN0IGlnbm9yZVxuICAvLyB0aGF0LCBiZWNhdXNlIGl0IGRvZXNuJ3QgbWF0dGVyLlxuICAvL1xuICAvLyBpZiB0aGVyZSdzIG5vIGdldHVpZCwgb3IgaWYgZ2V0dWlkKCkgaXMgc29tZXRoaW5nIG90aGVyXG4gIC8vIHRoYW4gMCwgYW5kIHRoZSBlcnJvciBpcyBFSU5WQUwgb3IgRVBFUk0sIHRoZW4ganVzdCBpZ25vcmVcbiAgLy8gaXQuXG4gIC8vXG4gIC8vIFRoaXMgc3BlY2lmaWMgY2FzZSBpcyBhIHNpbGVudCBmYWlsdXJlIGluIGNwLCBpbnN0YWxsLCB0YXIsXG4gIC8vIGFuZCBtb3N0IG90aGVyIHVuaXggdG9vbHMgdGhhdCBtYW5hZ2UgcGVybWlzc2lvbnMuXG4gIC8vXG4gIC8vIFdoZW4gcnVubmluZyBhcyByb290LCBvciBpZiBvdGhlciB0eXBlcyBvZiBlcnJvcnMgYXJlXG4gIC8vIGVuY291bnRlcmVkLCB0aGVuIGl0J3Mgc3RyaWN0LlxuICBmdW5jdGlvbiBjaG93bkVyT2sgKGVyKSB7XG4gICAgaWYgKCFlcilcbiAgICAgIHJldHVybiB0cnVlXG5cbiAgICBpZiAoZXIuY29kZSA9PT0gXCJFTk9TWVNcIilcbiAgICAgIHJldHVybiB0cnVlXG5cbiAgICB2YXIgbm9ucm9vdCA9ICFwcm9jZXNzLmdldHVpZCB8fCBwcm9jZXNzLmdldHVpZCgpICE9PSAwXG4gICAgaWYgKG5vbnJvb3QpIHtcbiAgICAgIGlmIChlci5jb2RlID09PSBcIkVJTlZBTFwiIHx8IGVyLmNvZGUgPT09IFwiRVBFUk1cIilcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmbGFnLCBhcmd2ID0gcHJvY2Vzcy5hcmd2KSA9PiB7XG5cdGNvbnN0IHByZWZpeCA9IGZsYWcuc3RhcnRzV2l0aCgnLScpID8gJycgOiAoZmxhZy5sZW5ndGggPT09IDEgPyAnLScgOiAnLS0nKTtcblx0Y29uc3QgcG9zaXRpb24gPSBhcmd2LmluZGV4T2YocHJlZml4ICsgZmxhZyk7XG5cdGNvbnN0IHRlcm1pbmF0b3JQb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZignLS0nKTtcblx0cmV0dXJuIHBvc2l0aW9uICE9PSAtMSAmJiAodGVybWluYXRvclBvc2l0aW9uID09PSAtMSB8fCBwb3NpdGlvbiA8IHRlcm1pbmF0b3JQb3NpdGlvbik7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSHR0cFByb3h5QWdlbnQgPSB2b2lkIDA7XG5jb25zdCBuZXQgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm5ldFwiKSk7XG5jb25zdCB0bHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInRsc1wiKSk7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5jb25zdCBhZ2VudF9iYXNlXzEgPSByZXF1aXJlKFwiYWdlbnQtYmFzZVwiKTtcbmNvbnN0IHVybF8xID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2h0dHAtcHJveHktYWdlbnQnKTtcbi8qKlxuICogVGhlIGBIdHRwUHJveHlBZ2VudGAgaW1wbGVtZW50cyBhbiBIVFRQIEFnZW50IHN1YmNsYXNzIHRoYXQgY29ubmVjdHNcbiAqIHRvIHRoZSBzcGVjaWZpZWQgXCJIVFRQIHByb3h5IHNlcnZlclwiIGluIG9yZGVyIHRvIHByb3h5IEhUVFAgcmVxdWVzdHMuXG4gKi9cbmNsYXNzIEh0dHBQcm94eUFnZW50IGV4dGVuZHMgYWdlbnRfYmFzZV8xLkFnZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm94eSwgb3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy5wcm94eSA9IHR5cGVvZiBwcm94eSA9PT0gJ3N0cmluZycgPyBuZXcgdXJsXzEuVVJMKHByb3h5KSA6IHByb3h5O1xuICAgICAgICB0aGlzLnByb3h5SGVhZGVycyA9IG9wdHM/LmhlYWRlcnMgPz8ge307XG4gICAgICAgIGRlYnVnKCdDcmVhdGluZyBuZXcgSHR0cFByb3h5QWdlbnQgaW5zdGFuY2U6ICVvJywgdGhpcy5wcm94eS5ocmVmKTtcbiAgICAgICAgLy8gVHJpbSBvZmYgdGhlIGJyYWNrZXRzIGZyb20gSVB2NiBhZGRyZXNzZXNcbiAgICAgICAgY29uc3QgaG9zdCA9ICh0aGlzLnByb3h5Lmhvc3RuYW1lIHx8IHRoaXMucHJveHkuaG9zdCkucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMucHJveHkucG9ydFxuICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLnByb3h5LnBvcnQsIDEwKVxuICAgICAgICAgICAgOiB0aGlzLnByb3h5LnByb3RvY29sID09PSAnaHR0cHM6J1xuICAgICAgICAgICAgICAgID8gNDQzXG4gICAgICAgICAgICAgICAgOiA4MDtcbiAgICAgICAgdGhpcy5jb25uZWN0T3B0cyA9IHtcbiAgICAgICAgICAgIC4uLihvcHRzID8gb21pdChvcHRzLCAnaGVhZGVycycpIDogbnVsbCksXG4gICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYWRkUmVxdWVzdChyZXEsIG9wdHMpIHtcbiAgICAgICAgcmVxLl9oZWFkZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnNldFJlcXVlc3RQcm9wcyhyZXEsIG9wdHMpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBhZGRSZXF1ZXN0KClgIGlzbid0IGRlZmluZWQgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICBzdXBlci5hZGRSZXF1ZXN0KHJlcSwgb3B0cyk7XG4gICAgfVxuICAgIHNldFJlcXVlc3RQcm9wcyhyZXEsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBvcHRzLnNlY3VyZUVuZHBvaW50ID8gJ2h0dHBzOicgOiAnaHR0cDonO1xuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHJlcS5nZXRIZWFkZXIoJ2hvc3QnKSB8fCAnbG9jYWxob3N0JztcbiAgICAgICAgY29uc3QgYmFzZSA9IGAke3Byb3RvY29sfS8vJHtob3N0bmFtZX1gO1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgdXJsXzEuVVJMKHJlcS5wYXRoLCBiYXNlKTtcbiAgICAgICAgaWYgKG9wdHMucG9ydCAhPT0gODApIHtcbiAgICAgICAgICAgIHVybC5wb3J0ID0gU3RyaW5nKG9wdHMucG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hhbmdlIHRoZSBgaHR0cC5DbGllbnRSZXF1ZXN0YCBpbnN0YW5jZSdzIFwicGF0aFwiIGZpZWxkXG4gICAgICAgIC8vIHRvIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZC5cbiAgICAgICAgcmVxLnBhdGggPSBTdHJpbmcodXJsKTtcbiAgICAgICAgLy8gSW5qZWN0IHRoZSBgUHJveHktQXV0aG9yaXphdGlvbmAgaGVhZGVyIGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHR5cGVvZiB0aGlzLnByb3h5SGVhZGVycyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyB0aGlzLnByb3h5SGVhZGVycygpXG4gICAgICAgICAgICA6IHsgLi4udGhpcy5wcm94eUhlYWRlcnMgfTtcbiAgICAgICAgaWYgKHByb3h5LnVzZXJuYW1lIHx8IHByb3h5LnBhc3N3b3JkKSB7XG4gICAgICAgICAgICBjb25zdCBhdXRoID0gYCR7ZGVjb2RlVVJJQ29tcG9uZW50KHByb3h5LnVzZXJuYW1lKX06JHtkZWNvZGVVUklDb21wb25lbnQocHJveHkucGFzc3dvcmQpfWA7XG4gICAgICAgICAgICBoZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtCdWZmZXIuZnJvbShhdXRoKS50b1N0cmluZygnYmFzZTY0Jyl9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhlYWRlcnNbJ1Byb3h5LUNvbm5lY3Rpb24nXSkge1xuICAgICAgICAgICAgaGVhZGVyc1snUHJveHktQ29ubmVjdGlvbiddID0gdGhpcy5rZWVwQWxpdmVcbiAgICAgICAgICAgICAgICA/ICdLZWVwLUFsaXZlJ1xuICAgICAgICAgICAgICAgIDogJ2Nsb3NlJztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoaGVhZGVycykpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZGVyc1tuYW1lXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJlcS5zZXRIZWFkZXIobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGNvbm5lY3QocmVxLCBvcHRzKSB7XG4gICAgICAgIHJlcS5faGVhZGVyID0gbnVsbDtcbiAgICAgICAgaWYgKCFyZXEucGF0aC5pbmNsdWRlcygnOi8vJykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UmVxdWVzdFByb3BzKHJlcSwgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIGh0dHAgQ2xpZW50UmVxdWVzdCdzIGludGVybmFsIGBfaGVhZGVyYCBmaWVsZFxuICAgICAgICAvLyBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBzZXQuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB3ZSdsbCBuZWVkXG4gICAgICAgIC8vIHRvIHJlLWdlbmVyYXRlIHRoZSBzdHJpbmcgc2luY2Ugd2UganVzdCBjaGFuZ2VkIHRoZSBgcmVxLnBhdGhgLlxuICAgICAgICBsZXQgZmlyc3Q7XG4gICAgICAgIGxldCBlbmRPZkhlYWRlcnM7XG4gICAgICAgIGRlYnVnKCdSZWdlbmVyYXRpbmcgc3RvcmVkIEhUVFAgaGVhZGVyIHN0cmluZyBmb3IgcmVxdWVzdCcpO1xuICAgICAgICByZXEuX2ltcGxpY2l0SGVhZGVyKCk7XG4gICAgICAgIGlmIChyZXEub3V0cHV0RGF0YSAmJiByZXEub3V0cHV0RGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZWJ1ZygnUGF0Y2hpbmcgY29ubmVjdGlvbiB3cml0ZSgpIG91dHB1dCBidWZmZXIgd2l0aCB1cGRhdGVkIGhlYWRlcicpO1xuICAgICAgICAgICAgZmlyc3QgPSByZXEub3V0cHV0RGF0YVswXS5kYXRhO1xuICAgICAgICAgICAgZW5kT2ZIZWFkZXJzID0gZmlyc3QuaW5kZXhPZignXFxyXFxuXFxyXFxuJykgKyA0O1xuICAgICAgICAgICAgcmVxLm91dHB1dERhdGFbMF0uZGF0YSA9XG4gICAgICAgICAgICAgICAgcmVxLl9oZWFkZXIgKyBmaXJzdC5zdWJzdHJpbmcoZW5kT2ZIZWFkZXJzKTtcbiAgICAgICAgICAgIGRlYnVnKCdPdXRwdXQgYnVmZmVyOiAlbycsIHJlcS5vdXRwdXREYXRhWzBdLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBhIHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBwcm94eSBzZXJ2ZXIuXG4gICAgICAgIGxldCBzb2NrZXQ7XG4gICAgICAgIGlmICh0aGlzLnByb3h5LnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgICAgICAgZGVidWcoJ0NyZWF0aW5nIGB0bHMuU29ja2V0YDogJW8nLCB0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIHNvY2tldCA9IHRscy5jb25uZWN0KHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVidWcoJ0NyZWF0aW5nIGBuZXQuU29ja2V0YDogJW8nLCB0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIHNvY2tldCA9IG5ldC5jb25uZWN0KHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBzb2NrZXQncyBgY29ubmVjdGAgZXZlbnQsIHNvIHRoYXQgdGhpcyBgY2FsbGJhY2soKWBcbiAgICAgICAgLy8gZnVuY3Rpb24gdGhyb3dzIGluc3RlYWQgb2YgdGhlIGBodHRwYCByZXF1ZXN0IG1hY2hpbmVyeS4gVGhpcyBpc1xuICAgICAgICAvLyBpbXBvcnRhbnQgZm9yIGkuZS4gYFBhY1Byb3h5QWdlbnRgIHdoaWNoIGRldGVybWluZXMgYSBmYWlsZWQgcHJveHlcbiAgICAgICAgLy8gY29ubmVjdGlvbiB2aWEgdGhlIGBjYWxsYmFjaygpYCBmdW5jdGlvbiB0aHJvd2luZy5cbiAgICAgICAgYXdhaXQgKDAsIGV2ZW50c18xLm9uY2UpKHNvY2tldCwgJ2Nvbm5lY3QnKTtcbiAgICAgICAgcmV0dXJuIHNvY2tldDtcbiAgICB9XG59XG5IdHRwUHJveHlBZ2VudC5wcm90b2NvbHMgPSBbJ2h0dHAnLCAnaHR0cHMnXTtcbmV4cG9ydHMuSHR0cFByb3h5QWdlbnQgPSBIdHRwUHJveHlBZ2VudDtcbmZ1bmN0aW9uIG9taXQob2JqLCAuLi5rZXlzKSB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGtleTtcbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkh0dHBzUHJveHlBZ2VudCA9IHZvaWQgMDtcbmNvbnN0IG5ldCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwibmV0XCIpKTtcbmNvbnN0IHRscyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidGxzXCIpKTtcbmNvbnN0IGFzc2VydF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJhc3NlcnRcIikpO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpO1xuY29uc3QgYWdlbnRfYmFzZV8xID0gcmVxdWlyZShcImFnZW50LWJhc2VcIik7XG5jb25zdCB1cmxfMSA9IHJlcXVpcmUoXCJ1cmxcIik7XG5jb25zdCBwYXJzZV9wcm94eV9yZXNwb25zZV8xID0gcmVxdWlyZShcIi4vcGFyc2UtcHJveHktcmVzcG9uc2VcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdodHRwcy1wcm94eS1hZ2VudCcpO1xuLyoqXG4gKiBUaGUgYEh0dHBzUHJveHlBZ2VudGAgaW1wbGVtZW50cyBhbiBIVFRQIEFnZW50IHN1YmNsYXNzIHRoYXQgY29ubmVjdHMgdG9cbiAqIHRoZSBzcGVjaWZpZWQgXCJIVFRQKHMpIHByb3h5IHNlcnZlclwiIGluIG9yZGVyIHRvIHByb3h5IEhUVFBTIHJlcXVlc3RzLlxuICpcbiAqIE91dGdvaW5nIEhUVFAgcmVxdWVzdHMgYXJlIGZpcnN0IHR1bm5lbGVkIHRocm91Z2ggdGhlIHByb3h5IHNlcnZlciB1c2luZyB0aGVcbiAqIGBDT05ORUNUYCBIVFRQIHJlcXVlc3QgbWV0aG9kIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gdGhlIHByb3h5IHNlcnZlcixcbiAqIGFuZCB0aGVuIHRoZSBwcm94eSBzZXJ2ZXIgY29ubmVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIHRhcmdldCBhbmQgaXNzdWVzIHRoZVxuICogSFRUUCByZXF1ZXN0IGZyb20gdGhlIHByb3h5IHNlcnZlci5cbiAqXG4gKiBgaHR0cHM6YCByZXF1ZXN0cyBoYXZlIHRoZWlyIHNvY2tldCBjb25uZWN0aW9uIHVwZ3JhZGVkIHRvIFRMUyBvbmNlXG4gKiB0aGUgY29ubmVjdGlvbiB0byB0aGUgcHJveHkgc2VydmVyIGhhcyBiZWVuIGVzdGFibGlzaGVkLlxuICovXG5jbGFzcyBIdHRwc1Byb3h5QWdlbnQgZXh0ZW5kcyBhZ2VudF9iYXNlXzEuQWdlbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3h5LCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7IHBhdGg6IHVuZGVmaW5lZCB9O1xuICAgICAgICB0aGlzLnByb3h5ID0gdHlwZW9mIHByb3h5ID09PSAnc3RyaW5nJyA/IG5ldyB1cmxfMS5VUkwocHJveHkpIDogcHJveHk7XG4gICAgICAgIHRoaXMucHJveHlIZWFkZXJzID0gb3B0cz8uaGVhZGVycyA/PyB7fTtcbiAgICAgICAgZGVidWcoJ0NyZWF0aW5nIG5ldyBIdHRwc1Byb3h5QWdlbnQgaW5zdGFuY2U6ICVvJywgdGhpcy5wcm94eS5ocmVmKTtcbiAgICAgICAgLy8gVHJpbSBvZmYgdGhlIGJyYWNrZXRzIGZyb20gSVB2NiBhZGRyZXNzZXNcbiAgICAgICAgY29uc3QgaG9zdCA9ICh0aGlzLnByb3h5Lmhvc3RuYW1lIHx8IHRoaXMucHJveHkuaG9zdCkucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMucHJveHkucG9ydFxuICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLnByb3h5LnBvcnQsIDEwKVxuICAgICAgICAgICAgOiB0aGlzLnByb3h5LnByb3RvY29sID09PSAnaHR0cHM6J1xuICAgICAgICAgICAgICAgID8gNDQzXG4gICAgICAgICAgICAgICAgOiA4MDtcbiAgICAgICAgdGhpcy5jb25uZWN0T3B0cyA9IHtcbiAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gbmVnb3RpYXRlIGh0dHAvMS4xIGZvciBwcm94eSBzZXJ2ZXJzIHRoYXQgc3VwcG9ydCBodHRwLzJcbiAgICAgICAgICAgIEFMUE5Qcm90b2NvbHM6IFsnaHR0cC8xLjEnXSxcbiAgICAgICAgICAgIC4uLihvcHRzID8gb21pdChvcHRzLCAnaGVhZGVycycpIDogbnVsbCksXG4gICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIG5vZGUtY29yZSBIVFRQIGNsaWVudCBsaWJyYXJ5IGlzIGNyZWF0aW5nIGFcbiAgICAgKiBuZXcgSFRUUCByZXF1ZXN0LlxuICAgICAqL1xuICAgIGFzeW5jIGNvbm5lY3QocmVxLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IHRoaXM7XG4gICAgICAgIGlmICghb3B0cy5ob3N0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBcImhvc3RcIiBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBhIHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBwcm94eSBzZXJ2ZXIuXG4gICAgICAgIGxldCBzb2NrZXQ7XG4gICAgICAgIGlmIChwcm94eS5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgICAgICAgIGRlYnVnKCdDcmVhdGluZyBgdGxzLlNvY2tldGA6ICVvJywgdGhpcy5jb25uZWN0T3B0cyk7XG4gICAgICAgICAgICBjb25zdCBzZXJ2ZXJuYW1lID0gdGhpcy5jb25uZWN0T3B0cy5zZXJ2ZXJuYW1lIHx8IHRoaXMuY29ubmVjdE9wdHMuaG9zdDtcbiAgICAgICAgICAgIHNvY2tldCA9IHRscy5jb25uZWN0KHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmNvbm5lY3RPcHRzLFxuICAgICAgICAgICAgICAgIHNlcnZlcm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnKCdDcmVhdGluZyBgbmV0LlNvY2tldGA6ICVvJywgdGhpcy5jb25uZWN0T3B0cyk7XG4gICAgICAgICAgICBzb2NrZXQgPSBuZXQuY29ubmVjdCh0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJzID0gdHlwZW9mIHRoaXMucHJveHlIZWFkZXJzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHRoaXMucHJveHlIZWFkZXJzKClcbiAgICAgICAgICAgIDogeyAuLi50aGlzLnByb3h5SGVhZGVycyB9O1xuICAgICAgICBjb25zdCBob3N0ID0gbmV0LmlzSVB2NihvcHRzLmhvc3QpID8gYFske29wdHMuaG9zdH1dYCA6IG9wdHMuaG9zdDtcbiAgICAgICAgbGV0IHBheWxvYWQgPSBgQ09OTkVDVCAke2hvc3R9OiR7b3B0cy5wb3J0fSBIVFRQLzEuMVxcclxcbmA7XG4gICAgICAgIC8vIEluamVjdCB0aGUgYFByb3h5LUF1dGhvcml6YXRpb25gIGhlYWRlciBpZiBuZWNlc3NhcnkuXG4gICAgICAgIGlmIChwcm94eS51c2VybmFtZSB8fCBwcm94eS5wYXNzd29yZCkge1xuICAgICAgICAgICAgY29uc3QgYXV0aCA9IGAke2RlY29kZVVSSUNvbXBvbmVudChwcm94eS51c2VybmFtZSl9OiR7ZGVjb2RlVVJJQ29tcG9uZW50KHByb3h5LnBhc3N3b3JkKX1gO1xuICAgICAgICAgICAgaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gYEJhc2ljICR7QnVmZmVyLmZyb20oYXV0aCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWA7XG4gICAgICAgIH1cbiAgICAgICAgaGVhZGVycy5Ib3N0ID0gYCR7aG9zdH06JHtvcHRzLnBvcnR9YDtcbiAgICAgICAgaWYgKCFoZWFkZXJzWydQcm94eS1Db25uZWN0aW9uJ10pIHtcbiAgICAgICAgICAgIGhlYWRlcnNbJ1Byb3h5LUNvbm5lY3Rpb24nXSA9IHRoaXMua2VlcEFsaXZlXG4gICAgICAgICAgICAgICAgPyAnS2VlcC1BbGl2ZSdcbiAgICAgICAgICAgICAgICA6ICdjbG9zZSc7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgICBwYXlsb2FkICs9IGAke25hbWV9OiAke2hlYWRlcnNbbmFtZV19XFxyXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm94eVJlc3BvbnNlUHJvbWlzZSA9ICgwLCBwYXJzZV9wcm94eV9yZXNwb25zZV8xLnBhcnNlUHJveHlSZXNwb25zZSkoc29ja2V0KTtcbiAgICAgICAgc29ja2V0LndyaXRlKGAke3BheWxvYWR9XFxyXFxuYCk7XG4gICAgICAgIGNvbnN0IHsgY29ubmVjdCwgYnVmZmVyZWQgfSA9IGF3YWl0IHByb3h5UmVzcG9uc2VQcm9taXNlO1xuICAgICAgICByZXEuZW1pdCgncHJveHlDb25uZWN0JywgY29ubmVjdCk7XG4gICAgICAgIHRoaXMuZW1pdCgncHJveHlDb25uZWN0JywgY29ubmVjdCwgcmVxKTtcbiAgICAgICAgaWYgKGNvbm5lY3Quc3RhdHVzQ29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXEub25jZSgnc29ja2V0JywgcmVzdW1lKTtcbiAgICAgICAgICAgIGlmIChvcHRzLnNlY3VyZUVuZHBvaW50KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHByb3h5IGlzIGNvbm5lY3RpbmcgdG8gYSBUTFMgc2VydmVyLCBzbyB1cGdyYWRlXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBzb2NrZXQgY29ubmVjdGlvbiB0byBhIFRMUyBjb25uZWN0aW9uLlxuICAgICAgICAgICAgICAgIGRlYnVnKCdVcGdyYWRpbmcgc29ja2V0IGNvbm5lY3Rpb24gdG8gVExTJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VydmVybmFtZSA9IG9wdHMuc2VydmVybmFtZSB8fCBvcHRzLmhvc3Q7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRscy5jb25uZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgLi4ub21pdChvcHRzLCAnaG9zdCcsICdwYXRoJywgJ3BvcnQnKSxcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0LFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJuYW1lLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNvY2tldDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb21lIG90aGVyIHN0YXR1cyBjb2RlIHRoYXQncyBub3QgMjAwLi4uIG5lZWQgdG8gcmUtcGxheSB0aGUgSFRUUFxuICAgICAgICAvLyBoZWFkZXIgXCJkYXRhXCIgZXZlbnRzIG9udG8gdGhlIHNvY2tldCBvbmNlIHRoZSBIVFRQIG1hY2hpbmVyeSBpc1xuICAgICAgICAvLyBhdHRhY2hlZCBzbyB0aGF0IHRoZSBub2RlIGNvcmUgYGh0dHBgIGNhbiBwYXJzZSBhbmQgaGFuZGxlIHRoZVxuICAgICAgICAvLyBlcnJvciBzdGF0dXMgY29kZS5cbiAgICAgICAgLy8gQ2xvc2UgdGhlIG9yaWdpbmFsIHNvY2tldCwgYW5kIGEgbmV3IFwiZmFrZVwiIHNvY2tldCBpcyByZXR1cm5lZFxuICAgICAgICAvLyBpbnN0ZWFkLCBzbyB0aGF0IHRoZSBwcm94eSBkb2Vzbid0IGdldCB0aGUgSFRUUCByZXF1ZXN0XG4gICAgICAgIC8vIHdyaXR0ZW4gdG8gaXQgKHdoaWNoIG1heSBjb250YWluIGBBdXRob3JpemF0aW9uYCBoZWFkZXJzIG9yIG90aGVyXG4gICAgICAgIC8vIHNlbnNpdGl2ZSBkYXRhKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2VlOiBodHRwczovL2hhY2tlcm9uZS5jb20vcmVwb3J0cy81NDE1MDJcbiAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgY29uc3QgZmFrZVNvY2tldCA9IG5ldyBuZXQuU29ja2V0KHsgd3JpdGFibGU6IGZhbHNlIH0pO1xuICAgICAgICBmYWtlU29ja2V0LnJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgICAgLy8gTmVlZCB0byB3YWl0IGZvciB0aGUgXCJzb2NrZXRcIiBldmVudCB0byByZS1wbGF5IHRoZSBcImRhdGFcIiBldmVudHMuXG4gICAgICAgIHJlcS5vbmNlKCdzb2NrZXQnLCAocykgPT4ge1xuICAgICAgICAgICAgZGVidWcoJ1JlcGxheWluZyBwcm94eSBidWZmZXIgZm9yIGZhaWxlZCByZXF1ZXN0Jyk7XG4gICAgICAgICAgICAoMCwgYXNzZXJ0XzEuZGVmYXVsdCkocy5saXN0ZW5lckNvdW50KCdkYXRhJykgPiAwKTtcbiAgICAgICAgICAgIC8vIFJlcGxheSB0aGUgXCJidWZmZXJlZFwiIEJ1ZmZlciBvbnRvIHRoZSBmYWtlIGBzb2NrZXRgLCBzaW5jZSBhdFxuICAgICAgICAgICAgLy8gdGhpcyBwb2ludCB0aGUgSFRUUCBtb2R1bGUgbWFjaGluZXJ5IGhhcyBiZWVuIGhvb2tlZCB1cCBmb3JcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyLlxuICAgICAgICAgICAgcy5wdXNoKGJ1ZmZlcmVkKTtcbiAgICAgICAgICAgIHMucHVzaChudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWtlU29ja2V0O1xuICAgIH1cbn1cbkh0dHBzUHJveHlBZ2VudC5wcm90b2NvbHMgPSBbJ2h0dHAnLCAnaHR0cHMnXTtcbmV4cG9ydHMuSHR0cHNQcm94eUFnZW50ID0gSHR0cHNQcm94eUFnZW50O1xuZnVuY3Rpb24gcmVzdW1lKHNvY2tldCkge1xuICAgIHNvY2tldC5yZXN1bWUoKTtcbn1cbmZ1bmN0aW9uIG9taXQob2JqLCAuLi5rZXlzKSB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGtleTtcbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZVByb3h5UmVzcG9uc2UgPSB2b2lkIDA7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdodHRwcy1wcm94eS1hZ2VudDpwYXJzZS1wcm94eS1yZXNwb25zZScpO1xuZnVuY3Rpb24gcGFyc2VQcm94eVJlc3BvbnNlKHNvY2tldCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gYnVmZmVyIGFueSBIVFRQIHRyYWZmaWMgdGhhdCBoYXBwZW5zIHdpdGggdGhlIHByb3h5IGJlZm9yZSB3ZSBnZXRcbiAgICAgICAgLy8gdGhlIENPTk5FQ1QgcmVzcG9uc2UsIHNvIHRoYXQgaWYgdGhlIHJlc3BvbnNlIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gYW4gXCIyMDBcIlxuICAgICAgICAvLyByZXNwb25zZSBjb2RlLCB0aGVuIHdlIGNhbiByZS1wbGF5IHRoZSBcImRhdGFcIiBldmVudHMgb24gdGhlIHNvY2tldCBvbmNlIHRoZVxuICAgICAgICAvLyBIVFRQIHBhcnNlciBpcyBob29rZWQgdXAuLi5cbiAgICAgICAgbGV0IGJ1ZmZlcnNMZW5ndGggPSAwO1xuICAgICAgICBjb25zdCBidWZmZXJzID0gW107XG4gICAgICAgIGZ1bmN0aW9uIHJlYWQoKSB7XG4gICAgICAgICAgICBjb25zdCBiID0gc29ja2V0LnJlYWQoKTtcbiAgICAgICAgICAgIGlmIChiKVxuICAgICAgICAgICAgICAgIG9uZGF0YShiKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzb2NrZXQub25jZSgncmVhZGFibGUnLCByZWFkKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgICAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ3JlYWRhYmxlJywgcmVhZCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb3h5IGNvbm5lY3Rpb24gZW5kZWQgYmVmb3JlIHJlY2VpdmluZyBDT05ORUNUIHJlc3BvbnNlJykpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG9uZXJyb3IoZXJyKSB7XG4gICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICBkZWJ1Zygnb25lcnJvciAlbycsIGVycik7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvbmRhdGEoYikge1xuICAgICAgICAgICAgYnVmZmVycy5wdXNoKGIpO1xuICAgICAgICAgICAgYnVmZmVyc0xlbmd0aCArPSBiLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcmVkID0gQnVmZmVyLmNvbmNhdChidWZmZXJzLCBidWZmZXJzTGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZE9mSGVhZGVycyA9IGJ1ZmZlcmVkLmluZGV4T2YoJ1xcclxcblxcclxcbicpO1xuICAgICAgICAgICAgaWYgKGVuZE9mSGVhZGVycyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBrZWVwIGJ1ZmZlcmluZ1xuICAgICAgICAgICAgICAgIGRlYnVnKCdoYXZlIG5vdCByZWNlaXZlZCBlbmQgb2YgSFRUUCBoZWFkZXJzIHlldC4uLicpO1xuICAgICAgICAgICAgICAgIHJlYWQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJQYXJ0cyA9IGJ1ZmZlcmVkXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIGVuZE9mSGVhZGVycylcbiAgICAgICAgICAgICAgICAudG9TdHJpbmcoJ2FzY2lpJylcbiAgICAgICAgICAgICAgICAuc3BsaXQoJ1xcclxcbicpO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RMaW5lID0gaGVhZGVyUGFydHMuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmICghZmlyc3RMaW5lKSB7XG4gICAgICAgICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignTm8gaGVhZGVyIHJlY2VpdmVkIGZyb20gcHJveHkgQ09OTkVDVCByZXNwb25zZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZpcnN0TGluZVBhcnRzID0gZmlyc3RMaW5lLnNwbGl0KCcgJyk7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gK2ZpcnN0TGluZVBhcnRzWzFdO1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzVGV4dCA9IGZpcnN0TGluZVBhcnRzLnNsaWNlKDIpLmpvaW4oJyAnKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyIG9mIGhlYWRlclBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoZWFkZXIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q29sb24gPSBoZWFkZXIuaW5kZXhPZignOicpO1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbG9uID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgSW52YWxpZCBoZWFkZXIgZnJvbSBwcm94eSBDT05ORUNUIHJlc3BvbnNlOiBcIiR7aGVhZGVyfVwiYCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBoZWFkZXIuc2xpY2UoMCwgZmlyc3RDb2xvbikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGhlYWRlci5zbGljZShmaXJzdENvbG9uICsgMSkudHJpbVN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IGhlYWRlcnNba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IFtjdXJyZW50LCB2YWx1ZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlYnVnKCdnb3QgcHJveHkgc2VydmVyIHJlc3BvbnNlOiAlbyAlbycsIGZpcnN0TGluZSwgaGVhZGVycyk7XG4gICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICBjb25uZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQsXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBidWZmZXJlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNvY2tldC5vbignZXJyb3InLCBvbmVycm9yKTtcbiAgICAgICAgc29ja2V0Lm9uKCdlbmQnLCBvbmVuZCk7XG4gICAgICAgIHJlYWQoKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucGFyc2VQcm94eVJlc3BvbnNlID0gcGFyc2VQcm94eVJlc3BvbnNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2UtcHJveHktcmVzcG9uc2UuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFkZHJlc3NFcnJvciA9IHZvaWQgMDtcbmNsYXNzIEFkZHJlc3NFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBwYXJzZU1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdBZGRyZXNzRXJyb3InO1xuICAgICAgICBpZiAocGFyc2VNZXNzYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlTWVzc2FnZSA9IHBhcnNlTWVzc2FnZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuQWRkcmVzc0Vycm9yID0gQWRkcmVzc0Vycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWRkcmVzcy1lcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNDb3JyZWN0ID0gZXhwb3J0cy5pc0luU3VibmV0ID0gdm9pZCAwO1xuZnVuY3Rpb24gaXNJblN1Ym5ldChhZGRyZXNzKSB7XG4gICAgaWYgKHRoaXMuc3VibmV0TWFzayA8IGFkZHJlc3Muc3VibmV0TWFzaykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hc2soYWRkcmVzcy5zdWJuZXRNYXNrKSA9PT0gYWRkcmVzcy5tYXNrKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydHMuaXNJblN1Ym5ldCA9IGlzSW5TdWJuZXQ7XG5mdW5jdGlvbiBpc0NvcnJlY3QoZGVmYXVsdEJpdHMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5hZGRyZXNzTWludXNTdWZmaXggIT09IHRoaXMuY29ycmVjdEZvcm0oKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN1Ym5ldE1hc2sgPT09IGRlZmF1bHRCaXRzICYmICF0aGlzLnBhcnNlZFN1Ym5ldCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkU3VibmV0ID09PSBTdHJpbmcodGhpcy5zdWJuZXRNYXNrKTtcbiAgICB9O1xufVxuZXhwb3J0cy5pc0NvcnJlY3QgPSBpc0NvcnJlY3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21tb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudjYgPSBleHBvcnRzLkFkZHJlc3NFcnJvciA9IGV4cG9ydHMuQWRkcmVzczYgPSBleHBvcnRzLkFkZHJlc3M0ID0gdm9pZCAwO1xuY29uc3QgaXB2NF8xID0gcmVxdWlyZShcIi4vaXB2NFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkFkZHJlc3M0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBpcHY0XzEuQWRkcmVzczQ7IH0gfSk7XG5jb25zdCBpcHY2XzEgPSByZXF1aXJlKFwiLi9pcHY2XCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQWRkcmVzczZcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGlwdjZfMS5BZGRyZXNzNjsgfSB9KTtcbmNvbnN0IGFkZHJlc3NfZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2FkZHJlc3MtZXJyb3JcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBZGRyZXNzRXJyb3JcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3I7IH0gfSk7XG5jb25zdCBoZWxwZXJzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3Y2L2hlbHBlcnNcIikpO1xuZXhwb3J0cy52NiA9IHsgaGVscGVycyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXAtYWRkcmVzcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQWRkcmVzczQgPSB2b2lkIDA7XG5jb25zdCBjb21tb24gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vY29tbW9uXCIpKTtcbmNvbnN0IGNvbnN0YW50cyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi92NC9jb25zdGFudHNcIikpO1xuY29uc3QgYWRkcmVzc19lcnJvcl8xID0gcmVxdWlyZShcIi4vYWRkcmVzcy1lcnJvclwiKTtcbmNvbnN0IGpzYm5fMSA9IHJlcXVpcmUoXCJqc2JuXCIpO1xuY29uc3Qgc3ByaW50Zl9qc18xID0gcmVxdWlyZShcInNwcmludGYtanNcIik7XG4vKipcbiAqIFJlcHJlc2VudHMgYW4gSVB2NCBhZGRyZXNzXG4gKiBAY2xhc3MgQWRkcmVzczRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIC0gQW4gSVB2NCBhZGRyZXNzIHN0cmluZ1xuICovXG5jbGFzcyBBZGRyZXNzNCB7XG4gICAgY29uc3RydWN0b3IoYWRkcmVzcykge1xuICAgICAgICB0aGlzLmdyb3VwcyA9IGNvbnN0YW50cy5HUk9VUFM7XG4gICAgICAgIHRoaXMucGFyc2VkQWRkcmVzcyA9IFtdO1xuICAgICAgICB0aGlzLnBhcnNlZFN1Ym5ldCA9ICcnO1xuICAgICAgICB0aGlzLnN1Ym5ldCA9ICcvMzInO1xuICAgICAgICB0aGlzLnN1Ym5ldE1hc2sgPSAzMjtcbiAgICAgICAgdGhpcy52NCA9IHRydWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgY29ycmVjdCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQ29ycmVjdCA9IGNvbW1vbi5pc0NvcnJlY3QoY29uc3RhbnRzLkJJVFMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBhZGRyZXNzIGlzIGluIHRoZSBzdWJuZXQgb2YgdGhlIGN1cnJlbnQgYWRkcmVzc1xuICAgICAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0luU3VibmV0ID0gY29tbW9uLmlzSW5TdWJuZXQ7XG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgICAgIGNvbnN0IHN1Ym5ldCA9IGNvbnN0YW50cy5SRV9TVUJORVRfU1RSSU5HLmV4ZWMoYWRkcmVzcyk7XG4gICAgICAgIGlmIChzdWJuZXQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkU3VibmV0ID0gc3VibmV0WzBdLnJlcGxhY2UoJy8nLCAnJyk7XG4gICAgICAgICAgICB0aGlzLnN1Ym5ldE1hc2sgPSBwYXJzZUludCh0aGlzLnBhcnNlZFN1Ym5ldCwgMTApO1xuICAgICAgICAgICAgdGhpcy5zdWJuZXQgPSBgLyR7dGhpcy5zdWJuZXRNYXNrfWA7XG4gICAgICAgICAgICBpZiAodGhpcy5zdWJuZXRNYXNrIDwgMCB8fCB0aGlzLnN1Ym5ldE1hc2sgPiBjb25zdGFudHMuQklUUykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKCdJbnZhbGlkIHN1Ym5ldCBtYXNrLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MucmVwbGFjZShjb25zdGFudHMuUkVfU1VCTkVUX1NUUklORywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkcmVzc01pbnVzU3VmZml4ID0gYWRkcmVzcztcbiAgICAgICAgdGhpcy5wYXJzZWRBZGRyZXNzID0gdGhpcy5wYXJzZShhZGRyZXNzKTtcbiAgICB9XG4gICAgc3RhdGljIGlzVmFsaWQoYWRkcmVzcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgICAgICAgICAgbmV3IEFkZHJlc3M0KGFkZHJlc3MpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKlxuICAgICAqIFBhcnNlcyBhIHY0IGFkZHJlc3NcbiAgICAgKi9cbiAgICBwYXJzZShhZGRyZXNzKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IGFkZHJlc3Muc3BsaXQoJy4nKTtcbiAgICAgICAgaWYgKCFhZGRyZXNzLm1hdGNoKGNvbnN0YW50cy5SRV9BRERSRVNTKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoJ0ludmFsaWQgSVB2NCBhZGRyZXNzLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBncm91cHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvcnJlY3QgZm9ybSBvZiBhbiBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBjb3JyZWN0Rm9ybSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkQWRkcmVzcy5tYXAoKHBhcnQpID0+IHBhcnNlSW50KHBhcnQsIDEwKSkuam9pbignLicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIGhleCBzdHJpbmcgdG8gYW4gSVB2NCBhZGRyZXNzIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaGV4IC0gYSBoZXggc3RyaW5nIHRvIGNvbnZlcnRcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczR9XG4gICAgICovXG4gICAgc3RhdGljIGZyb21IZXgoaGV4KSB7XG4gICAgICAgIGNvbnN0IHBhZGRlZCA9IGhleC5yZXBsYWNlKC86L2csICcnKS5wYWRTdGFydCg4LCAnMCcpO1xuICAgICAgICBjb25zdCBncm91cHMgPSBbXTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGggPSBwYWRkZWQuc2xpY2UoaSwgaSArIDIpO1xuICAgICAgICAgICAgZ3JvdXBzLnB1c2gocGFyc2VJbnQoaCwgMTYpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEFkZHJlc3M0KGdyb3Vwcy5qb2luKCcuJykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbiBpbnRlZ2VyIGludG8gYSBJUHY0IGFkZHJlc3Mgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gaW50ZWdlciAtIGEgbnVtYmVyIHRvIGNvbnZlcnRcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczR9XG4gICAgICovXG4gICAgc3RhdGljIGZyb21JbnRlZ2VyKGludGVnZXIpIHtcbiAgICAgICAgcmV0dXJuIEFkZHJlc3M0LmZyb21IZXgoaW50ZWdlci50b1N0cmluZygxNikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gYWRkcmVzcyBmcm9tIGluLWFkZHIuYXJwYSBmb3JtXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhcnBhRm9ybUFkZHJlc3MgLSBhbiAnaW4tYWRkci5hcnBhJyBmb3JtIGlwdjQgYWRkcmVzc1xuICAgICAqIEByZXR1cm5zIHtBZHJlc3M0fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFkZHJlc3MgPSBBZGRyZXNzNC5mcm9tQXJwYSg0Mi4yLjAuMTkyLmluLWFkZHIuYXJwYS4pXG4gICAgICogYWRkcmVzcy5jb3JyZWN0Rm9ybSgpOyAvLyAnMTkyLjAuMi40MidcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUFycGEoYXJwYUZvcm1BZGRyZXNzKSB7XG4gICAgICAgIC8vIHJlbW92ZSBlbmRpbmcgXCIuaW4tYWRkci5hcnBhLlwiIG9yIGp1c3QgXCIuXCJcbiAgICAgICAgY29uc3QgbGVhZGVyID0gYXJwYUZvcm1BZGRyZXNzLnJlcGxhY2UoLyhcXC5pbi1hZGRyXFwuYXJwYSk/XFwuJC8sICcnKTtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IGxlYWRlci5zcGxpdCgnLicpLnJldmVyc2UoKS5qb2luKCcuJyk7XG4gICAgICAgIHJldHVybiBuZXcgQWRkcmVzczQoYWRkcmVzcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIElQdjQgYWRkcmVzcyBvYmplY3QgdG8gYSBoZXggc3RyaW5nXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICB0b0hleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkQWRkcmVzcy5tYXAoKHBhcnQpID0+ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyUwMngnLCBwYXJzZUludChwYXJ0LCAxMCkpKS5qb2luKCc6Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIElQdjQgYWRkcmVzcyBvYmplY3QgdG8gYW4gYXJyYXkgb2YgYnl0ZXNcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgdG9BcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkQWRkcmVzcy5tYXAoKHBhcnQpID0+IHBhcnNlSW50KHBhcnQsIDEwKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIElQdjQgYWRkcmVzcyBvYmplY3QgdG8gYW4gSVB2NiBhZGRyZXNzIGdyb3VwXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICB0b0dyb3VwNigpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gW107XG4gICAgICAgIGxldCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RhbnRzLkdST1VQUzsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCBoZXggPSAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclMDJ4JTAyeCcsIHBhcnNlSW50KHRoaXMucGFyc2VkQWRkcmVzc1tpXSwgMTApLCBwYXJzZUludCh0aGlzLnBhcnNlZEFkZHJlc3NbaSArIDFdLCAxMCkpO1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXgnLCBwYXJzZUludChoZXgsIDE2KSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQuam9pbignOicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhZGRyZXNzIGFzIGEgQmlnSW50ZWdlclxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtCaWdJbnRlZ2VyfVxuICAgICAqL1xuICAgIGJpZ0ludGVnZXIoKSB7XG4gICAgICAgIHJldHVybiBuZXcganNibl8xLkJpZ0ludGVnZXIodGhpcy5wYXJzZWRBZGRyZXNzLm1hcCgobikgPT4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJTAyeCcsIHBhcnNlSW50KG4sIDEwKSkpLmpvaW4oJycpLCAxNik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiBnZXR0aW5nIHN0YXJ0IGFkZHJlc3MuXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0JpZ0ludGVnZXJ9XG4gICAgICovXG4gICAgX3N0YXJ0QWRkcmVzcygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBqc2JuXzEuQmlnSW50ZWdlcih0aGlzLm1hc2soKSArICcwJy5yZXBlYXQoY29uc3RhbnRzLkJJVFMgLSB0aGlzLnN1Ym5ldE1hc2spLCAyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IGFkZHJlc3MgaW4gdGhlIHJhbmdlIGdpdmVuIGJ5IHRoaXMgYWRkcmVzcycgc3VibmV0LlxuICAgICAqIE9mdGVuIHJlZmVycmVkIHRvIGFzIHRoZSBOZXR3b3JrIEFkZHJlc3MuXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M0fVxuICAgICAqL1xuICAgIHN0YXJ0QWRkcmVzcygpIHtcbiAgICAgICAgcmV0dXJuIEFkZHJlc3M0LmZyb21CaWdJbnRlZ2VyKHRoaXMuX3N0YXJ0QWRkcmVzcygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IGhvc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJ3Mgc3VibmV0IGllXG4gICAgICogdGhlIGZpcnN0IGFkZHJlc3MgYWZ0ZXIgdGhlIE5ldHdvcmsgQWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNH1cbiAgICAgKi9cbiAgICBzdGFydEFkZHJlc3NFeGNsdXNpdmUoKSB7XG4gICAgICAgIGNvbnN0IGFkanVzdCA9IG5ldyBqc2JuXzEuQmlnSW50ZWdlcignMScpO1xuICAgICAgICByZXR1cm4gQWRkcmVzczQuZnJvbUJpZ0ludGVnZXIodGhpcy5fc3RhcnRBZGRyZXNzKCkuYWRkKGFkanVzdCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZ2V0dGluZyBlbmQgYWRkcmVzcy5cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QmlnSW50ZWdlcn1cbiAgICAgKi9cbiAgICBfZW5kQWRkcmVzcygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBqc2JuXzEuQmlnSW50ZWdlcih0aGlzLm1hc2soKSArICcxJy5yZXBlYXQoY29uc3RhbnRzLkJJVFMgLSB0aGlzLnN1Ym5ldE1hc2spLCAyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJyBzdWJuZXRcbiAgICAgKiBPZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgQnJvYWRjYXN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M0fVxuICAgICAqL1xuICAgIGVuZEFkZHJlc3MoKSB7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNC5mcm9tQmlnSW50ZWdlcih0aGlzLl9lbmRBZGRyZXNzKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBob3N0IGFkZHJlc3MgaW4gdGhlIHJhbmdlIGdpdmVuIGJ5IHRoaXMgYWRkcmVzcydzIHN1Ym5ldCBpZVxuICAgICAqIHRoZSBsYXN0IGFkZHJlc3MgcHJpb3IgdG8gdGhlIEJyb2FkY2FzdCBBZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M0fVxuICAgICAqL1xuICAgIGVuZEFkZHJlc3NFeGNsdXNpdmUoKSB7XG4gICAgICAgIGNvbnN0IGFkanVzdCA9IG5ldyBqc2JuXzEuQmlnSW50ZWdlcignMScpO1xuICAgICAgICByZXR1cm4gQWRkcmVzczQuZnJvbUJpZ0ludGVnZXIodGhpcy5fZW5kQWRkcmVzcygpLnN1YnRyYWN0KGFkanVzdCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIEJpZ0ludGVnZXIgdG8gYSB2NCBhZGRyZXNzIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge0JpZ0ludGVnZXJ9IGJpZ0ludGVnZXIgLSBhIEJpZ0ludGVnZXIgdG8gY29udmVydFxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUJpZ0ludGVnZXIoYmlnSW50ZWdlcikge1xuICAgICAgICByZXR1cm4gQWRkcmVzczQuZnJvbUludGVnZXIocGFyc2VJbnQoYmlnSW50ZWdlci50b1N0cmluZygpLCAxMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBuIGJpdHMgb2YgdGhlIGFkZHJlc3MsIGRlZmF1bHRpbmcgdG8gdGhlXG4gICAgICogc3VibmV0IG1hc2tcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIG1hc2sobWFzaykge1xuICAgICAgICBpZiAobWFzayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtYXNrID0gdGhpcy5zdWJuZXRNYXNrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJpdHNCYXNlMigwLCBtYXNrKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYml0cyBpbiB0aGUgZ2l2ZW4gcmFuZ2UgYXMgYSBiYXNlLTIgc3RyaW5nXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRCaXRzQmFzZTIoc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5hcnlaZXJvUGFkKCkuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgcmV2ZXJzZWQgaXA2LmFycGEgZm9ybSBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLm9taXRTdWZmaXggLSBvbWl0IHRoZSBcImluLWFkZHIuYXJwYVwiIHN1ZmZpeFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgcmV2ZXJzZUZvcm0ob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXZlcnNlZCA9IHRoaXMuY29ycmVjdEZvcm0oKS5zcGxpdCgnLicpLnJldmVyc2UoKS5qb2luKCcuJyk7XG4gICAgICAgIGlmIChvcHRpb25zLm9taXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXZlcnNlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXMuaW4tYWRkci5hcnBhLicsIHJldmVyc2VkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBhZGRyZXNzIGlzIGEgbXVsdGljYXN0IGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc011bHRpY2FzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJblN1Ym5ldChuZXcgQWRkcmVzczQoJzIyNC4wLjAuMC80JykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgemVyby1wYWRkZWQgYmFzZS0yIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgYmluYXJ5WmVyb1BhZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlnSW50ZWdlcigpLnRvU3RyaW5nKDIpLnBhZFN0YXJ0KGNvbnN0YW50cy5CSVRTLCAnMCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHcm91cHMgYW4gSVB2NCBhZGRyZXNzIGZvciBpbmNsdXNpb24gYXQgdGhlIGVuZCBvZiBhbiBJUHY2IGFkZHJlc3NcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGdyb3VwRm9yVjYoKSB7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGhpcy5wYXJzZWRBZGRyZXNzO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzLnJlcGxhY2UoY29uc3RhbnRzLlJFX0FERFJFU1MsICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJzxzcGFuIGNsYXNzPVwiaG92ZXItZ3JvdXAgZ3JvdXAtdjQgZ3JvdXAtNlwiPiVzPC9zcGFuPi48c3BhbiBjbGFzcz1cImhvdmVyLWdyb3VwIGdyb3VwLXY0IGdyb3VwLTdcIj4lczwvc3Bhbj4nLCBzZWdtZW50cy5zbGljZSgwLCAyKS5qb2luKCcuJyksIHNlZ21lbnRzLnNsaWNlKDIsIDQpLmpvaW4oJy4nKSkpO1xuICAgIH1cbn1cbmV4cG9ydHMuQWRkcmVzczQgPSBBZGRyZXNzNDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlwdjQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItZGVzdHJ1Y3R1cmluZyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BZGRyZXNzNiA9IHZvaWQgMDtcbmNvbnN0IGNvbW1vbiA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb21tb25cIikpO1xuY29uc3QgY29uc3RhbnRzNCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi92NC9jb25zdGFudHNcIikpO1xuY29uc3QgY29uc3RhbnRzNiA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi92Ni9jb25zdGFudHNcIikpO1xuY29uc3QgaGVscGVycyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi92Ni9oZWxwZXJzXCIpKTtcbmNvbnN0IGlwdjRfMSA9IHJlcXVpcmUoXCIuL2lwdjRcIik7XG5jb25zdCByZWd1bGFyX2V4cHJlc3Npb25zXzEgPSByZXF1aXJlKFwiLi92Ni9yZWd1bGFyLWV4cHJlc3Npb25zXCIpO1xuY29uc3QgYWRkcmVzc19lcnJvcl8xID0gcmVxdWlyZShcIi4vYWRkcmVzcy1lcnJvclwiKTtcbmNvbnN0IGpzYm5fMSA9IHJlcXVpcmUoXCJqc2JuXCIpO1xuY29uc3Qgc3ByaW50Zl9qc18xID0gcmVxdWlyZShcInNwcmludGYtanNcIik7XG5mdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uKSB7XG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3NlcnRpb24gZmFpbGVkLicpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFkZENvbW1hcyhudW1iZXIpIHtcbiAgICBjb25zdCByID0gLyhcXGQrKShcXGR7M30pLztcbiAgICB3aGlsZSAoci50ZXN0KG51bWJlcikpIHtcbiAgICAgICAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UociwgJyQxLCQyJyk7XG4gICAgfVxuICAgIHJldHVybiBudW1iZXI7XG59XG5mdW5jdGlvbiBzcGFuTGVhZGluZ1plcm9lczQobikge1xuICAgIG4gPSBuLnJlcGxhY2UoL14oMHsxLH0pKFsxLTldKykkLywgJzxzcGFuIGNsYXNzPVwicGFyc2UtZXJyb3JcIj4kMTwvc3Bhbj4kMicpO1xuICAgIG4gPSBuLnJlcGxhY2UoL14oMHsxLH0pKDApJC8sICc8c3BhbiBjbGFzcz1cInBhcnNlLWVycm9yXCI+JDE8L3NwYW4+JDInKTtcbiAgICByZXR1cm4gbjtcbn1cbi8qXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjb21wYWN0IGFuIGFycmF5XG4gKi9cbmZ1bmN0aW9uIGNvbXBhY3QoYWRkcmVzcywgc2xpY2UpIHtcbiAgICBjb25zdCBzMSA9IFtdO1xuICAgIGNvbnN0IHMyID0gW107XG4gICAgbGV0IGk7XG4gICAgZm9yIChpID0gMDsgaSA8IGFkZHJlc3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPCBzbGljZVswXSkge1xuICAgICAgICAgICAgczEucHVzaChhZGRyZXNzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpID4gc2xpY2VbMV0pIHtcbiAgICAgICAgICAgIHMyLnB1c2goYWRkcmVzc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHMxLmNvbmNhdChbJ2NvbXBhY3QnXSkuY29uY2F0KHMyKTtcbn1cbmZ1bmN0aW9uIHBhZGRlZEhleChvY3RldCkge1xuICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclMDR4JywgcGFyc2VJbnQob2N0ZXQsIDE2KSk7XG59XG5mdW5jdGlvbiB1bnNpZ25CeXRlKGIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIHJldHVybiBiICYgMHhmZjtcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhbiBJUHY2IGFkZHJlc3NcbiAqIEBjbGFzcyBBZGRyZXNzNlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSBBbiBJUHY2IGFkZHJlc3Mgc3RyaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gW2dyb3Vwcz04XSAtIEhvdyBtYW55IG9jdGV0cyB0byBwYXJzZVxuICogQGV4YW1wbGVcbiAqIHZhciBhZGRyZXNzID0gbmV3IEFkZHJlc3M2KCcyMDAxOjovMzInKTtcbiAqL1xuY2xhc3MgQWRkcmVzczYge1xuICAgIGNvbnN0cnVjdG9yKGFkZHJlc3MsIG9wdGlvbmFsR3JvdXBzKSB7XG4gICAgICAgIHRoaXMuYWRkcmVzc01pbnVzU3VmZml4ID0gJyc7XG4gICAgICAgIHRoaXMucGFyc2VkU3VibmV0ID0gJyc7XG4gICAgICAgIHRoaXMuc3VibmV0ID0gJy8xMjgnO1xuICAgICAgICB0aGlzLnN1Ym5ldE1hc2sgPSAxMjg7XG4gICAgICAgIHRoaXMudjQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy56b25lID0gJyc7XG4gICAgICAgIC8vICNyZWdpb24gQXR0cmlidXRlc1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBhZGRyZXNzIGlzIGluIHRoZSBzdWJuZXQgb2YgdGhlIGN1cnJlbnQgYWRkcmVzc1xuICAgICAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pc0luU3VibmV0ID0gY29tbW9uLmlzSW5TdWJuZXQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgY29ycmVjdCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlzQ29ycmVjdCA9IGNvbW1vbi5pc0NvcnJlY3QoY29uc3RhbnRzNi5CSVRTKTtcbiAgICAgICAgaWYgKG9wdGlvbmFsR3JvdXBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzID0gY29uc3RhbnRzNi5HUk9VUFM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwcyA9IG9wdGlvbmFsR3JvdXBzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgICAgIGNvbnN0IHN1Ym5ldCA9IGNvbnN0YW50czYuUkVfU1VCTkVUX1NUUklORy5leGVjKGFkZHJlc3MpO1xuICAgICAgICBpZiAoc3VibmV0KSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZFN1Ym5ldCA9IHN1Ym5ldFswXS5yZXBsYWNlKCcvJywgJycpO1xuICAgICAgICAgICAgdGhpcy5zdWJuZXRNYXNrID0gcGFyc2VJbnQodGhpcy5wYXJzZWRTdWJuZXQsIDEwKTtcbiAgICAgICAgICAgIHRoaXMuc3VibmV0ID0gYC8ke3RoaXMuc3VibmV0TWFza31gO1xuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTih0aGlzLnN1Ym5ldE1hc2spIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJuZXRNYXNrIDwgMCB8fFxuICAgICAgICAgICAgICAgIHRoaXMuc3VibmV0TWFzayA+IGNvbnN0YW50czYuQklUUykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKCdJbnZhbGlkIHN1Ym5ldCBtYXNrLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MucmVwbGFjZShjb25zdGFudHM2LlJFX1NVQk5FVF9TVFJJTkcsICcnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgvXFwvLy50ZXN0KGFkZHJlc3MpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcignSW52YWxpZCBzdWJuZXQgbWFzay4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB6b25lID0gY29uc3RhbnRzNi5SRV9aT05FX1NUUklORy5leGVjKGFkZHJlc3MpO1xuICAgICAgICBpZiAoem9uZSkge1xuICAgICAgICAgICAgdGhpcy56b25lID0gem9uZVswXTtcbiAgICAgICAgICAgIGFkZHJlc3MgPSBhZGRyZXNzLnJlcGxhY2UoY29uc3RhbnRzNi5SRV9aT05FX1NUUklORywgJycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkcmVzc01pbnVzU3VmZml4ID0gYWRkcmVzcztcbiAgICAgICAgdGhpcy5wYXJzZWRBZGRyZXNzID0gdGhpcy5wYXJzZSh0aGlzLmFkZHJlc3NNaW51c1N1ZmZpeCk7XG4gICAgfVxuICAgIHN0YXRpYyBpc1ZhbGlkKGFkZHJlc3MpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXdcbiAgICAgICAgICAgIG5ldyBBZGRyZXNzNihhZGRyZXNzKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIEJpZ0ludGVnZXIgdG8gYSB2NiBhZGRyZXNzIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge0JpZ0ludGVnZXJ9IGJpZ0ludGVnZXIgLSBhIEJpZ0ludGVnZXIgdG8gY29udmVydFxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNn1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBiaWdJbnRlZ2VyID0gbmV3IEJpZ0ludGVnZXIoJzEwMDAwMDAwMDAwMDAnKTtcbiAgICAgKiB2YXIgYWRkcmVzcyA9IEFkZHJlc3M2LmZyb21CaWdJbnRlZ2VyKGJpZ0ludGVnZXIpO1xuICAgICAqIGFkZHJlc3MuY29ycmVjdEZvcm0oKTsgLy8gJzo6ZTg6ZDRhNToxMDAwJ1xuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tQmlnSW50ZWdlcihiaWdJbnRlZ2VyKSB7XG4gICAgICAgIGNvbnN0IGhleCA9IGJpZ0ludGVnZXIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDMyLCAnMCcpO1xuICAgICAgICBjb25zdCBncm91cHMgPSBbXTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25zdGFudHM2LkdST1VQUzsgaSsrKSB7XG4gICAgICAgICAgICBncm91cHMucHVzaChoZXguc2xpY2UoaSAqIDQsIChpICsgMSkgKiA0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBBZGRyZXNzNihncm91cHMuam9pbignOicpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIFVSTCAod2l0aCBvcHRpb25hbCBwb3J0IG51bWJlcikgdG8gYW4gYWRkcmVzcyBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIGEgVVJMIHdpdGggb3B0aW9uYWwgcG9ydCBudW1iZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBhZGRyZXNzQW5kUG9ydCA9IEFkZHJlc3M2LmZyb21VUkwoJ2h0dHA6Ly9bZmZmZjo6XTo4MDgwL2Zvby8nKTtcbiAgICAgKiBhZGRyZXNzQW5kUG9ydC5hZGRyZXNzLmNvcnJlY3RGb3JtKCk7IC8vICdmZmZmOjonXG4gICAgICogYWRkcmVzc0FuZFBvcnQucG9ydDsgLy8gODA4MFxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tVVJMKHVybCkge1xuICAgICAgICBsZXQgaG9zdDtcbiAgICAgICAgbGV0IHBvcnQgPSBudWxsO1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGJyYWNrZXRzIHBhcnNlIHRoZW0gYW5kIGZpbmQgYSBwb3J0XG4gICAgICAgIGlmICh1cmwuaW5kZXhPZignWycpICE9PSAtMSAmJiB1cmwuaW5kZXhPZignXTonKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbnN0YW50czYuUkVfVVJMX1dJVEhfUE9SVC5leGVjKHVybCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6ICdmYWlsZWQgdG8gcGFyc2UgYWRkcmVzcyB3aXRoIHBvcnQnLFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBob3N0ID0gcmVzdWx0WzFdO1xuICAgICAgICAgICAgcG9ydCA9IHJlc3VsdFsyXTtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSBVUkwgZXh0cmFjdCB0aGUgYWRkcmVzc1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVybC5pbmRleE9mKCcvJykgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHByb3RvY29sIHByZWZpeFxuICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoL15bYS16MC05XSs6XFwvXFwvLywgJycpO1xuICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGFkZHJlc3NcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbnN0YW50czYuUkVfVVJMLmV4ZWModXJsKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcjogJ2ZhaWxlZCB0byBwYXJzZSBhZGRyZXNzIGZyb20gVVJMJyxcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcG9ydDogbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaG9zdCA9IHJlc3VsdFsxXTtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBqdXN0IGFzc2lnbiB0aGUgVVJMIHRvIHRoZSBob3N0IGFuZCBsZXQgdGhlIGxpYnJhcnkgcGFyc2UgaXRcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhvc3QgPSB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUncyBhIHBvcnQgY29udmVydCBpdCB0byBhbiBpbnRlZ2VyXG4gICAgICAgIGlmIChwb3J0KSB7XG4gICAgICAgICAgICBwb3J0ID0gcGFyc2VJbnQocG9ydCwgMTApO1xuICAgICAgICAgICAgLy8gc3F1ZWxjaCBvdXQgb2YgcmFuZ2UgcG9ydHNcbiAgICAgICAgICAgIGlmIChwb3J0IDwgMCB8fCBwb3J0ID4gNjU1MzYpIHtcbiAgICAgICAgICAgICAgICBwb3J0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFN0YW5kYXJkaXplIGB1bmRlZmluZWRgIHRvIGBudWxsYFxuICAgICAgICAgICAgcG9ydCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IG5ldyBBZGRyZXNzNihob3N0KSxcbiAgICAgICAgICAgIHBvcnQsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBJUHY2LW1hcHBlZCBhZGRyZXNzIGdpdmVuIGFuIElQdjQgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIEFuIElQdjQgYWRkcmVzcyBzdHJpbmdcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgYWRkcmVzcyA9IEFkZHJlc3M2LmZyb21BZGRyZXNzNCgnMTkyLjE2OC4wLjEnKTtcbiAgICAgKiBhZGRyZXNzLmNvcnJlY3RGb3JtKCk7IC8vICc6OmZmZmY6YzBhODoxJ1xuICAgICAqIGFkZHJlc3MudG80aW42KCk7IC8vICc6OmZmZmY6MTkyLjE2OC4wLjEnXG4gICAgICovXG4gICAgc3RhdGljIGZyb21BZGRyZXNzNChhZGRyZXNzKSB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3M0ID0gbmV3IGlwdjRfMS5BZGRyZXNzNChhZGRyZXNzKTtcbiAgICAgICAgY29uc3QgbWFzazYgPSBjb25zdGFudHM2LkJJVFMgLSAoY29uc3RhbnRzNC5CSVRTIC0gYWRkcmVzczQuc3VibmV0TWFzayk7XG4gICAgICAgIHJldHVybiBuZXcgQWRkcmVzczYoYDo6ZmZmZjoke2FkZHJlc3M0LmNvcnJlY3RGb3JtKCl9LyR7bWFzazZ9YCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBhZGRyZXNzIGZyb20gaXA2LmFycGEgZm9ybVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXJwYUZvcm1BZGRyZXNzIC0gYW4gJ2lwNi5hcnBhJyBmb3JtIGFkZHJlc3NcbiAgICAgKiBAcmV0dXJucyB7QWRyZXNzNn1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBhZGRyZXNzID0gQWRkcmVzczYuZnJvbUFycGEoZS5mLmYuZi4zLmMuMi42LmYuZi5mLmUuNi42LjguZS4xLjAuNi43LjkuNC5lLmMuMC4wLjAuMC4xLjAuMC4yLmlwNi5hcnBhLilcbiAgICAgKiBhZGRyZXNzLmNvcnJlY3RGb3JtKCk7IC8vICcyMDAxOjA6Y2U0OTo3NjAxOmU4NjY6ZWZmZjo2MmMzOmZmZmUnXG4gICAgICovXG4gICAgc3RhdGljIGZyb21BcnBhKGFycGFGb3JtQWRkcmVzcykge1xuICAgICAgICAvLyByZW1vdmUgZW5kaW5nIFwiLmlwNi5hcnBhLlwiIG9yIGp1c3QgXCIuXCJcbiAgICAgICAgbGV0IGFkZHJlc3MgPSBhcnBhRm9ybUFkZHJlc3MucmVwbGFjZSgvKFxcLmlwNlxcLmFycGEpP1xcLiQvLCAnJyk7XG4gICAgICAgIGNvbnN0IHNlbWljb2xvbkFtb3VudCA9IDc7XG4gICAgICAgIC8vIGNvcnJlY3QgaXA2LmFycGEgZm9ybSB3aXRoIGVuZGluZyByZW1vdmVkIHdpbGwgYmUgNjMgY2hhcmFjdGVyc1xuICAgICAgICBpZiAoYWRkcmVzcy5sZW5ndGggIT09IDYzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcihcIkludmFsaWQgJ2lwNi5hcnBhJyBmb3JtLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGFkZHJlc3Muc3BsaXQoJy4nKS5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzZW1pY29sb25BbW91bnQ7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gaSAqIDQ7XG4gICAgICAgICAgICBwYXJ0cy5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsICc6Jyk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkcmVzcyA9IHBhcnRzLmpvaW4oJycpO1xuICAgICAgICByZXR1cm4gbmV3IEFkZHJlc3M2KGFkZHJlc3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIE1pY3Jvc29mdCBVTkMgdHJhbnNjcmlwdGlvbiBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBNaWNyb3NvZnQgVU5DIHRyYW5zY3JpcHRpb24gb2YgdGhlIGFkZHJlc3NcbiAgICAgKi9cbiAgICBtaWNyb3NvZnRUcmFuc2NyaXB0aW9uKCkge1xuICAgICAgICByZXR1cm4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXMuaXB2Ni1saXRlcmFsLm5ldCcsIHRoaXMuY29ycmVjdEZvcm0oKS5yZXBsYWNlKC86L2csICctJykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGZpcnN0IG4gYml0cyBvZiB0aGUgYWRkcmVzcywgZGVmYXVsdGluZyB0byB0aGUgc3VibmV0IG1hc2tcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW21hc2s9c3VibmV0XSAtIHRoZSBudW1iZXIgb2YgYml0cyB0byBtYXNrXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIGZpcnN0IG4gYml0cyBvZiB0aGUgYWRkcmVzcyBhcyBhIHN0cmluZ1xuICAgICAqL1xuICAgIG1hc2sobWFzayA9IHRoaXMuc3VibmV0TWFzaykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCaXRzQmFzZTIoMCwgbWFzayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHN1Ym5ldHMgb2YgYSBnaXZlbiBzaXplIGluIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPTEyOF0gLSB0aGUgc3VibmV0IHNpemVcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIC8vIFRPRE86IHByb2JhYmx5IHVzZWZ1bCB0byBoYXZlIGEgbnVtZXJpYyB2ZXJzaW9uIG9mIHRoaXMgdG9vXG4gICAgcG9zc2libGVTdWJuZXRzKHN1Ym5ldFNpemUgPSAxMjgpIHtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlQml0cyA9IGNvbnN0YW50czYuQklUUyAtIHRoaXMuc3VibmV0TWFzaztcbiAgICAgICAgY29uc3Qgc3VibmV0Qml0cyA9IE1hdGguYWJzKHN1Ym5ldFNpemUgLSBjb25zdGFudHM2LkJJVFMpO1xuICAgICAgICBjb25zdCBzdWJuZXRQb3dlcnMgPSBhdmFpbGFibGVCaXRzIC0gc3VibmV0Qml0cztcbiAgICAgICAgaWYgKHN1Ym5ldFBvd2VycyA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnMCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZENvbW1hcyhuZXcganNibl8xLkJpZ0ludGVnZXIoJzInLCAxMCkucG93KHN1Ym5ldFBvd2VycykudG9TdHJpbmcoMTApKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIGdldHRpbmcgc3RhcnQgYWRkcmVzcy5cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QmlnSW50ZWdlcn1cbiAgICAgKi9cbiAgICBfc3RhcnRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKHRoaXMubWFzaygpICsgJzAnLnJlcGVhdChjb25zdGFudHM2LkJJVFMgLSB0aGlzLnN1Ym5ldE1hc2spLCAyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGZpcnN0IGFkZHJlc3MgaW4gdGhlIHJhbmdlIGdpdmVuIGJ5IHRoaXMgYWRkcmVzcycgc3VibmV0XG4gICAgICogT2Z0ZW4gcmVmZXJyZWQgdG8gYXMgdGhlIE5ldHdvcmsgQWRkcmVzcy5cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICovXG4gICAgc3RhcnRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gQWRkcmVzczYuZnJvbUJpZ0ludGVnZXIodGhpcy5fc3RhcnRBZGRyZXNzKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZmlyc3QgaG9zdCBhZGRyZXNzIGluIHRoZSByYW5nZSBnaXZlbiBieSB0aGlzIGFkZHJlc3MncyBzdWJuZXQgaWVcbiAgICAgKiB0aGUgZmlyc3QgYWRkcmVzcyBhZnRlciB0aGUgTmV0d29yayBBZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M2fVxuICAgICAqL1xuICAgIHN0YXJ0QWRkcmVzc0V4Y2x1c2l2ZSgpIHtcbiAgICAgICAgY29uc3QgYWRqdXN0ID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcxJyk7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNi5mcm9tQmlnSW50ZWdlcih0aGlzLl9zdGFydEFkZHJlc3MoKS5hZGQoYWRqdXN0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiBnZXR0aW5nIGVuZCBhZGRyZXNzLlxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtCaWdJbnRlZ2VyfVxuICAgICAqL1xuICAgIF9lbmRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKHRoaXMubWFzaygpICsgJzEnLnJlcGVhdChjb25zdGFudHM2LkJJVFMgLSB0aGlzLnN1Ym5ldE1hc2spLCAyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhpcyBhZGRyZXNzJyBzdWJuZXRcbiAgICAgKiBPZnRlbiByZWZlcnJlZCB0byBhcyB0aGUgQnJvYWRjYXN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M2fVxuICAgICAqL1xuICAgIGVuZEFkZHJlc3MoKSB7XG4gICAgICAgIHJldHVybiBBZGRyZXNzNi5mcm9tQmlnSW50ZWdlcih0aGlzLl9lbmRBZGRyZXNzKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBob3N0IGFkZHJlc3MgaW4gdGhlIHJhbmdlIGdpdmVuIGJ5IHRoaXMgYWRkcmVzcydzIHN1Ym5ldCBpZVxuICAgICAqIHRoZSBsYXN0IGFkZHJlc3MgcHJpb3IgdG8gdGhlIEJyb2FkY2FzdCBBZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge0FkZHJlc3M2fVxuICAgICAqL1xuICAgIGVuZEFkZHJlc3NFeGNsdXNpdmUoKSB7XG4gICAgICAgIGNvbnN0IGFkanVzdCA9IG5ldyBqc2JuXzEuQmlnSW50ZWdlcignMScpO1xuICAgICAgICByZXR1cm4gQWRkcmVzczYuZnJvbUJpZ0ludGVnZXIodGhpcy5fZW5kQWRkcmVzcygpLnN1YnRyYWN0KGFkanVzdCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHNjb3BlIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRTY29wZSgpIHtcbiAgICAgICAgbGV0IHNjb3BlID0gY29uc3RhbnRzNi5TQ09QRVNbdGhpcy5nZXRCaXRzKDEyLCAxNikuaW50VmFsdWUoKV07XG4gICAgICAgIGlmICh0aGlzLmdldFR5cGUoKSA9PT0gJ0dsb2JhbCB1bmljYXN0JyAmJiBzY29wZSAhPT0gJ0xpbmsgbG9jYWwnKSB7XG4gICAgICAgICAgICBzY29wZSA9ICdHbG9iYWwnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY29wZSB8fCAnVW5rbm93bic7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0VHlwZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzdWJuZXQgb2YgT2JqZWN0LmtleXMoY29uc3RhbnRzNi5UWVBFUykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5TdWJuZXQobmV3IEFkZHJlc3M2KHN1Ym5ldCkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0YW50czYuVFlQRVNbc3VibmV0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ0dsb2JhbCB1bmljYXN0JztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBiaXRzIGluIHRoZSBnaXZlbiByYW5nZSBhcyBhIEJpZ0ludGVnZXJcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QmlnSW50ZWdlcn1cbiAgICAgKi9cbiAgICBnZXRCaXRzKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBqc2JuXzEuQmlnSW50ZWdlcih0aGlzLmdldEJpdHNCYXNlMihzdGFydCwgZW5kKSwgMik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYml0cyBpbiB0aGUgZ2l2ZW4gcmFuZ2UgYXMgYSBiYXNlLTIgc3RyaW5nXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRCaXRzQmFzZTIoc3RhcnQsIGVuZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5hcnlaZXJvUGFkKCkuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYml0cyBpbiB0aGUgZ2l2ZW4gcmFuZ2UgYXMgYSBiYXNlLTE2IHN0cmluZ1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgZ2V0Qml0c0Jhc2UxNihzdGFydCwgZW5kKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGVuZCAtIHN0YXJ0O1xuICAgICAgICBpZiAobGVuZ3RoICUgNCAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMZW5ndGggb2YgYml0cyB0byByZXRyaWV2ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSBmb3VyJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qml0cyhzdGFydCwgZW5kKVxuICAgICAgICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgLnBhZFN0YXJ0KGxlbmd0aCAvIDQsICcwJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYml0cyB0aGF0IGFyZSBzZXQgcGFzdCB0aGUgc3VibmV0IG1hc2sgbGVuZ3RoXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBnZXRCaXRzUGFzdFN1Ym5ldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Qml0c0Jhc2UyKHRoaXMuc3VibmV0TWFzaywgY29uc3RhbnRzNi5CSVRTKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSByZXZlcnNlZCBpcDYuYXJwYSBmb3JtIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMub21pdFN1ZmZpeCAtIG9taXQgdGhlIFwiaXA2LmFycGFcIiBzdWZmaXhcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIHJldmVyc2VGb3JtKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hhcmFjdGVycyA9IE1hdGguZmxvb3IodGhpcy5zdWJuZXRNYXNrIC8gNCk7XG4gICAgICAgIGNvbnN0IHJldmVyc2VkID0gdGhpcy5jYW5vbmljYWxGb3JtKClcbiAgICAgICAgICAgIC5yZXBsYWNlKC86L2csICcnKVxuICAgICAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAgICAgLnNsaWNlKDAsIGNoYXJhY3RlcnMpXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAuam9pbignLicpO1xuICAgICAgICBpZiAoY2hhcmFjdGVycyA+IDApIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm9taXRTdWZmaXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV2ZXJzZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnJXMuaXA2LmFycGEuJywgcmV2ZXJzZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLm9taXRTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2lwNi5hcnBhLic7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY29ycmVjdCBmb3JtIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBjb3JyZWN0Rm9ybSgpIHtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGxldCBncm91cHMgPSBbXTtcbiAgICAgICAgbGV0IHplcm9Db3VudGVyID0gMDtcbiAgICAgICAgY29uc3QgemVyb2VzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLnBhcnNlZEFkZHJlc3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQodGhpcy5wYXJzZWRBZGRyZXNzW2ldLCAxNik7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB6ZXJvQ291bnRlcisrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSAwICYmIHplcm9Db3VudGVyID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICh6ZXJvQ291bnRlciA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgemVyb2VzLnB1c2goW2kgLSB6ZXJvQ291bnRlciwgaSAtIDFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgemVyb0NvdW50ZXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIERvIHdlIGVuZCB3aXRoIGEgc3RyaW5nIG9mIHplcm9lcz9cbiAgICAgICAgaWYgKHplcm9Db3VudGVyID4gMSkge1xuICAgICAgICAgICAgemVyb2VzLnB1c2goW3RoaXMucGFyc2VkQWRkcmVzcy5sZW5ndGggLSB6ZXJvQ291bnRlciwgdGhpcy5wYXJzZWRBZGRyZXNzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB6ZXJvTGVuZ3RocyA9IHplcm9lcy5tYXAoKG4pID0+IG5bMV0gLSBuWzBdICsgMSk7XG4gICAgICAgIGlmICh6ZXJvZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB6ZXJvTGVuZ3Rocy5pbmRleE9mKE1hdGgubWF4KC4uLnplcm9MZW5ndGhzKSk7XG4gICAgICAgICAgICBncm91cHMgPSBjb21wYWN0KHRoaXMucGFyc2VkQWRkcmVzcywgemVyb2VzW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBncm91cHMgPSB0aGlzLnBhcnNlZEFkZHJlc3M7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGdyb3Vwc1tpXSAhPT0gJ2NvbXBhY3QnKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzW2ldID0gcGFyc2VJbnQoZ3JvdXBzW2ldLCAxNikudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBjb3JyZWN0ID0gZ3JvdXBzLmpvaW4oJzonKTtcbiAgICAgICAgY29ycmVjdCA9IGNvcnJlY3QucmVwbGFjZSgvXmNvbXBhY3QkLywgJzo6Jyk7XG4gICAgICAgIGNvcnJlY3QgPSBjb3JyZWN0LnJlcGxhY2UoL15jb21wYWN0fGNvbXBhY3QkLywgJzonKTtcbiAgICAgICAgY29ycmVjdCA9IGNvcnJlY3QucmVwbGFjZSgvY29tcGFjdC8sICcnKTtcbiAgICAgICAgcmV0dXJuIGNvcnJlY3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHplcm8tcGFkZGVkIGJhc2UtMiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGFkZHJlc3MgPSBuZXcgQWRkcmVzczYoJzIwMDE6NDg2MDo0MDAxOjgwMzo6MTAxMScpO1xuICAgICAqIGFkZHJlc3MuYmluYXJ5WmVyb1BhZCgpO1xuICAgICAqIC8vICcwMDEwMDAwMDAwMDAwMDAxMDEwMDEwMDAwMTEwMDAwMDAxMDAwMDAwMDAwMDAwMDEwMDAwMTAwMDAwMDAwMDExXG4gICAgICogLy8gIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMTAwMDEnXG4gICAgICovXG4gICAgYmluYXJ5WmVyb1BhZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmlnSW50ZWdlcigpLnRvU3RyaW5nKDIpLnBhZFN0YXJ0KGNvbnN0YW50czYuQklUUywgJzAnKTtcbiAgICB9XG4gICAgLy8gVE9ETzogSW1wcm92ZSB0aGUgc2VtYW50aWNzIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uXG4gICAgcGFyc2U0aW42KGFkZHJlc3MpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gYWRkcmVzcy5zcGxpdCgnOicpO1xuICAgICAgICBjb25zdCBsYXN0R3JvdXAgPSBncm91cHMuc2xpY2UoLTEpWzBdO1xuICAgICAgICBjb25zdCBhZGRyZXNzNCA9IGxhc3RHcm91cC5tYXRjaChjb25zdGFudHM0LlJFX0FERFJFU1MpO1xuICAgICAgICBpZiAoYWRkcmVzczQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkQWRkcmVzczQgPSBhZGRyZXNzNFswXTtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzczQgPSBuZXcgaXB2NF8xLkFkZHJlc3M0KHRoaXMucGFyc2VkQWRkcmVzczQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFkZHJlc3M0Lmdyb3VwczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKC9eMFswLTldKy8udGVzdCh0aGlzLmFkZHJlc3M0LnBhcnNlZEFkZHJlc3NbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKFwiSVB2NCBhZGRyZXNzZXMgY2FuJ3QgaGF2ZSBsZWFkaW5nIHplcm9lcy5cIiwgYWRkcmVzcy5yZXBsYWNlKGNvbnN0YW50czQuUkVfQUREUkVTUywgdGhpcy5hZGRyZXNzNC5wYXJzZWRBZGRyZXNzLm1hcChzcGFuTGVhZGluZ1plcm9lczQpLmpvaW4oJy4nKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudjQgPSB0cnVlO1xuICAgICAgICAgICAgZ3JvdXBzW2dyb3Vwcy5sZW5ndGggLSAxXSA9IHRoaXMuYWRkcmVzczQudG9Hcm91cDYoKTtcbiAgICAgICAgICAgIGFkZHJlc3MgPSBncm91cHMuam9pbignOicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgIH1cbiAgICAvLyBUT0RPOiBNYWtlIHByaXZhdGU/XG4gICAgcGFyc2UoYWRkcmVzcykge1xuICAgICAgICBhZGRyZXNzID0gdGhpcy5wYXJzZTRpbjYoYWRkcmVzcyk7XG4gICAgICAgIGNvbnN0IGJhZENoYXJhY3RlcnMgPSBhZGRyZXNzLm1hdGNoKGNvbnN0YW50czYuUkVfQkFEX0NIQVJBQ1RFUlMpO1xuICAgICAgICBpZiAoYmFkQ2hhcmFjdGVycykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnQmFkIGNoYXJhY3RlciVzIGRldGVjdGVkIGluIGFkZHJlc3M6ICVzJywgYmFkQ2hhcmFjdGVycy5sZW5ndGggPiAxID8gJ3MnIDogJycsIGJhZENoYXJhY3RlcnMuam9pbignJykpLCBhZGRyZXNzLnJlcGxhY2UoY29uc3RhbnRzNi5SRV9CQURfQ0hBUkFDVEVSUywgJzxzcGFuIGNsYXNzPVwicGFyc2UtZXJyb3JcIj4kMTwvc3Bhbj4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFkQWRkcmVzcyA9IGFkZHJlc3MubWF0Y2goY29uc3RhbnRzNi5SRV9CQURfQUREUkVTUyk7XG4gICAgICAgIGlmIChiYWRBZGRyZXNzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcigoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCdBZGRyZXNzIGZhaWxlZCByZWdleDogJXMnLCBiYWRBZGRyZXNzLmpvaW4oJycpKSwgYWRkcmVzcy5yZXBsYWNlKGNvbnN0YW50czYuUkVfQkFEX0FERFJFU1MsICc8c3BhbiBjbGFzcz1cInBhcnNlLWVycm9yXCI+JDE8L3NwYW4+JykpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBncm91cHMgPSBbXTtcbiAgICAgICAgY29uc3QgaGFsdmVzID0gYWRkcmVzcy5zcGxpdCgnOjonKTtcbiAgICAgICAgaWYgKGhhbHZlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IGhhbHZlc1swXS5zcGxpdCgnOicpO1xuICAgICAgICAgICAgbGV0IGxhc3QgPSBoYWx2ZXNbMV0uc3BsaXQoJzonKTtcbiAgICAgICAgICAgIGlmIChmaXJzdC5sZW5ndGggPT09IDEgJiYgZmlyc3RbMF0gPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgZmlyc3QgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsYXN0Lmxlbmd0aCA9PT0gMSAmJiBsYXN0WzBdID09PSAnJykge1xuICAgICAgICAgICAgICAgIGxhc3QgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMuZ3JvdXBzIC0gKGZpcnN0Lmxlbmd0aCArIGxhc3QubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmICghcmVtYWluaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGFkZHJlc3NfZXJyb3JfMS5BZGRyZXNzRXJyb3IoJ0Vycm9yIHBhcnNpbmcgZ3JvdXBzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVsaWRlZEdyb3VwcyA9IHJlbWFpbmluZztcbiAgICAgICAgICAgIHRoaXMuZWxpc2lvbkJlZ2luID0gZmlyc3QubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5lbGlzaW9uRW5kID0gZmlyc3QubGVuZ3RoICsgdGhpcy5lbGlkZWRHcm91cHM7XG4gICAgICAgICAgICBncm91cHMgPSBncm91cHMuY29uY2F0KGZpcnN0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtYWluaW5nOyBpKyspIHtcbiAgICAgICAgICAgICAgICBncm91cHMucHVzaCgnMCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JvdXBzID0gZ3JvdXBzLmNvbmNhdChsYXN0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChoYWx2ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBncm91cHMgPSBhZGRyZXNzLnNwbGl0KCc6Jyk7XG4gICAgICAgICAgICB0aGlzLmVsaWRlZEdyb3VwcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgYWRkcmVzc19lcnJvcl8xLkFkZHJlc3NFcnJvcignVG9vIG1hbnkgOjogZ3JvdXBzIGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXBzID0gZ3JvdXBzLm1hcCgoZ3JvdXApID0+ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyV4JywgcGFyc2VJbnQoZ3JvdXAsIDE2KSkpO1xuICAgICAgICBpZiAoZ3JvdXBzLmxlbmd0aCAhPT0gdGhpcy5ncm91cHMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBhZGRyZXNzX2Vycm9yXzEuQWRkcmVzc0Vycm9yKCdJbmNvcnJlY3QgbnVtYmVyIG9mIGdyb3VwcyBmb3VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBncm91cHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgY2Fub25pY2FsIGZvcm0gb2YgdGhlIGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGNhbm9uaWNhbEZvcm0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlZEFkZHJlc3MubWFwKHBhZGRlZEhleCkuam9pbignOicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGRlY2ltYWwgZm9ybSBvZiB0aGUgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgZGVjaW1hbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VkQWRkcmVzcy5tYXAoKG4pID0+ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyUwNWQnLCBwYXJzZUludChuLCAxNikpKS5qb2luKCc6Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYWRkcmVzcyBhcyBhIEJpZ0ludGVnZXJcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QmlnSW50ZWdlcn1cbiAgICAgKi9cbiAgICBiaWdJbnRlZ2VyKCkge1xuICAgICAgICByZXR1cm4gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKHRoaXMucGFyc2VkQWRkcmVzcy5tYXAocGFkZGVkSGV4KS5qb2luKCcnKSwgMTYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGxhc3QgdHdvIGdyb3VwcyBvZiB0aGlzIGFkZHJlc3MgYXMgYW4gSVB2NCBhZGRyZXNzIHN0cmluZ1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBhZGRyZXNzID0gbmV3IEFkZHJlc3M2KCcyMDAxOjQ4NjA6NDAwMTo6MTgyNTpiZjExJyk7XG4gICAgICogYWRkcmVzcy50bzQoKS5jb3JyZWN0Rm9ybSgpOyAvLyAnMjQuMzcuMTkxLjE3J1xuICAgICAqL1xuICAgIHRvNCgpIHtcbiAgICAgICAgY29uc3QgYmluYXJ5ID0gdGhpcy5iaW5hcnlaZXJvUGFkKCkuc3BsaXQoJycpO1xuICAgICAgICByZXR1cm4gaXB2NF8xLkFkZHJlc3M0LmZyb21IZXgobmV3IGpzYm5fMS5CaWdJbnRlZ2VyKGJpbmFyeS5zbGljZSg5NiwgMTI4KS5qb2luKCcnKSwgMikudG9TdHJpbmcoMTYpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSB2NC1pbi12NiBmb3JtIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICB0bzRpbjYoKSB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3M0ID0gdGhpcy50bzQoKTtcbiAgICAgICAgY29uc3QgYWRkcmVzczYgPSBuZXcgQWRkcmVzczYodGhpcy5wYXJzZWRBZGRyZXNzLnNsaWNlKDAsIDYpLmpvaW4oJzonKSwgNik7XG4gICAgICAgIGNvbnN0IGNvcnJlY3QgPSBhZGRyZXNzNi5jb3JyZWN0Rm9ybSgpO1xuICAgICAgICBsZXQgaW5maXggPSAnJztcbiAgICAgICAgaWYgKCEvOiQvLnRlc3QoY29ycmVjdCkpIHtcbiAgICAgICAgICAgIGluZml4ID0gJzonO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3JyZWN0ICsgaW5maXggKyBhZGRyZXNzNC5hZGRyZXNzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIFRlcmVkbyBwcm9wZXJ0aWVzIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBpbnNwZWN0VGVyZWRvKCkge1xuICAgICAgICAvKlxuICAgICAgICAtIEJpdHMgMCB0byAzMSBhcmUgc2V0IHRvIHRoZSBUZXJlZG8gcHJlZml4IChub3JtYWxseSAyMDAxOjAwMDA6Oi8zMikuXG4gICAgICAgIC0gQml0cyAzMiB0byA2MyBlbWJlZCB0aGUgcHJpbWFyeSBJUHY0IGFkZHJlc3Mgb2YgdGhlIFRlcmVkbyBzZXJ2ZXIgdGhhdFxuICAgICAgICAgIGlzIHVzZWQuXG4gICAgICAgIC0gQml0cyA2NCB0byA3OSBjYW4gYmUgdXNlZCB0byBkZWZpbmUgc29tZSBmbGFncy4gQ3VycmVudGx5IG9ubHkgdGhlXG4gICAgICAgICAgaGlnaGVyIG9yZGVyIGJpdCBpcyB1c2VkOyBpdCBpcyBzZXQgdG8gMSBpZiB0aGUgVGVyZWRvIGNsaWVudCBpc1xuICAgICAgICAgIGxvY2F0ZWQgYmVoaW5kIGEgY29uZSBOQVQsIDAgb3RoZXJ3aXNlLiBGb3IgTWljcm9zb2Z0J3MgV2luZG93cyBWaXN0YVxuICAgICAgICAgIGFuZCBXaW5kb3dzIFNlcnZlciAyMDA4IGltcGxlbWVudGF0aW9ucywgbW9yZSBiaXRzIGFyZSB1c2VkLiBJbiB0aG9zZVxuICAgICAgICAgIGltcGxlbWVudGF0aW9ucywgdGhlIGZvcm1hdCBmb3IgdGhlc2UgMTYgYml0cyBpcyBcIkNSQUFBQVVHIEFBQUFBQUFBXCIsXG4gICAgICAgICAgd2hlcmUgXCJDXCIgcmVtYWlucyB0aGUgXCJDb25lXCIgZmxhZy4gVGhlIFwiUlwiIGJpdCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlXG4gICAgICAgICAgdXNlLiBUaGUgXCJVXCIgYml0IGlzIGZvciB0aGUgVW5pdmVyc2FsL0xvY2FsIGZsYWcgKHNldCB0byAwKS4gVGhlIFwiR1wiIGJpdFxuICAgICAgICAgIGlzIEluZGl2aWR1YWwvR3JvdXAgZmxhZyAoc2V0IHRvIDApLiBUaGUgQSBiaXRzIGFyZSBzZXQgdG8gYSAxMi1iaXRcbiAgICAgICAgICByYW5kb21seSBnZW5lcmF0ZWQgbnVtYmVyIGNob3NlbiBieSB0aGUgVGVyZWRvIGNsaWVudCB0byBpbnRyb2R1Y2VcbiAgICAgICAgICBhZGRpdGlvbmFsIHByb3RlY3Rpb24gZm9yIHRoZSBUZXJlZG8gbm9kZSBhZ2FpbnN0IElQdjYtYmFzZWQgc2Nhbm5pbmdcbiAgICAgICAgICBhdHRhY2tzLlxuICAgICAgICAtIEJpdHMgODAgdG8gOTUgY29udGFpbnMgdGhlIG9iZnVzY2F0ZWQgVURQIHBvcnQgbnVtYmVyLiBUaGlzIGlzIHRoZVxuICAgICAgICAgIHBvcnQgbnVtYmVyIHRoYXQgaXMgbWFwcGVkIGJ5IHRoZSBOQVQgdG8gdGhlIFRlcmVkbyBjbGllbnQgd2l0aCBhbGxcbiAgICAgICAgICBiaXRzIGludmVydGVkLlxuICAgICAgICAtIEJpdHMgOTYgdG8gMTI3IGNvbnRhaW5zIHRoZSBvYmZ1c2NhdGVkIElQdjQgYWRkcmVzcy4gVGhpcyBpcyB0aGVcbiAgICAgICAgICBwdWJsaWMgSVB2NCBhZGRyZXNzIG9mIHRoZSBOQVQgd2l0aCBhbGwgYml0cyBpbnZlcnRlZC5cbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy5nZXRCaXRzQmFzZTE2KDAsIDMyKTtcbiAgICAgICAgY29uc3QgdWRwUG9ydCA9IHRoaXMuZ2V0Qml0cyg4MCwgOTYpLnhvcihuZXcganNibl8xLkJpZ0ludGVnZXIoJ2ZmZmYnLCAxNikpLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHNlcnZlcjQgPSBpcHY0XzEuQWRkcmVzczQuZnJvbUhleCh0aGlzLmdldEJpdHNCYXNlMTYoMzIsIDY0KSk7XG4gICAgICAgIGNvbnN0IGNsaWVudDQgPSBpcHY0XzEuQWRkcmVzczQuZnJvbUhleCh0aGlzLmdldEJpdHMoOTYsIDEyOCkueG9yKG5ldyBqc2JuXzEuQmlnSW50ZWdlcignZmZmZmZmZmYnLCAxNikpLnRvU3RyaW5nKDE2KSk7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gdGhpcy5nZXRCaXRzKDY0LCA4MCk7XG4gICAgICAgIGNvbnN0IGZsYWdzQmFzZTIgPSB0aGlzLmdldEJpdHNCYXNlMig2NCwgODApO1xuICAgICAgICBjb25zdCBjb25lTmF0ID0gZmxhZ3MudGVzdEJpdCgxNSk7XG4gICAgICAgIGNvbnN0IHJlc2VydmVkID0gZmxhZ3MudGVzdEJpdCgxNCk7XG4gICAgICAgIGNvbnN0IGdyb3VwSW5kaXZpZHVhbCA9IGZsYWdzLnRlc3RCaXQoOCk7XG4gICAgICAgIGNvbnN0IHVuaXZlcnNhbExvY2FsID0gZmxhZ3MudGVzdEJpdCg5KTtcbiAgICAgICAgY29uc3Qgbm9uY2UgPSBuZXcganNibl8xLkJpZ0ludGVnZXIoZmxhZ3NCYXNlMi5zbGljZSgyLCA2KSArIGZsYWdzQmFzZTIuc2xpY2UoOCwgMTYpLCAyKS50b1N0cmluZygxMCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcmVmaXg6ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyVzOiVzJywgcHJlZml4LnNsaWNlKDAsIDQpLCBwcmVmaXguc2xpY2UoNCwgOCkpLFxuICAgICAgICAgICAgc2VydmVyNDogc2VydmVyNC5hZGRyZXNzLFxuICAgICAgICAgICAgY2xpZW50NDogY2xpZW50NC5hZGRyZXNzLFxuICAgICAgICAgICAgZmxhZ3M6IGZsYWdzQmFzZTIsXG4gICAgICAgICAgICBjb25lTmF0LFxuICAgICAgICAgICAgbWljcm9zb2Z0OiB7XG4gICAgICAgICAgICAgICAgcmVzZXJ2ZWQsXG4gICAgICAgICAgICAgICAgdW5pdmVyc2FsTG9jYWwsXG4gICAgICAgICAgICAgICAgZ3JvdXBJbmRpdmlkdWFsLFxuICAgICAgICAgICAgICAgIG5vbmNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVkcFBvcnQsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgNnRvNCBwcm9wZXJ0aWVzIG9mIHRoZSBhZGRyZXNzXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICBpbnNwZWN0NnRvNCgpIHtcbiAgICAgICAgLypcbiAgICAgICAgLSBCaXRzIDAgdG8gMTUgYXJlIHNldCB0byB0aGUgNnRvNCBwcmVmaXggKDIwMDI6Oi8xNikuXG4gICAgICAgIC0gQml0cyAxNiB0byA0OCBlbWJlZCB0aGUgSVB2NCBhZGRyZXNzIG9mIHRoZSA2dG80IGdhdGV3YXkgdGhhdCBpcyB1c2VkLlxuICAgICAgICAqL1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLmdldEJpdHNCYXNlMTYoMCwgMTYpO1xuICAgICAgICBjb25zdCBnYXRld2F5ID0gaXB2NF8xLkFkZHJlc3M0LmZyb21IZXgodGhpcy5nZXRCaXRzQmFzZTE2KDE2LCA0OCkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHJlZml4OiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCclcycsIHByZWZpeC5zbGljZSgwLCA0KSksXG4gICAgICAgICAgICBnYXRld2F5OiBnYXRld2F5LmFkZHJlc3MsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHY2IDZ0bzQgYWRkcmVzcyBmcm9tIGEgdjYgdjRpbnY2IGFkZHJlc3NcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICovXG4gICAgdG82dG80KCkge1xuICAgICAgICBpZiAoIXRoaXMuaXM0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFkZHI2dG80ID0gW1xuICAgICAgICAgICAgJzIwMDInLFxuICAgICAgICAgICAgdGhpcy5nZXRCaXRzQmFzZTE2KDk2LCAxMTIpLFxuICAgICAgICAgICAgdGhpcy5nZXRCaXRzQmFzZTE2KDExMiwgMTI4KSxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgJy8xNicsXG4gICAgICAgIF0uam9pbignOicpO1xuICAgICAgICByZXR1cm4gbmV3IEFkZHJlc3M2KGFkZHI2dG80KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgYnl0ZSBhcnJheVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICB0b0J5dGVBcnJheSgpIHtcbiAgICAgICAgY29uc3QgYnl0ZUFycmF5ID0gdGhpcy5iaWdJbnRlZ2VyKCkudG9CeXRlQXJyYXkoKTtcbiAgICAgICAgLy8gd29yayBhcm91bmQgaXNzdWUgd2hlcmUgYHRvQnl0ZUFycmF5YCByZXR1cm5zIGEgbGVhZGluZyAwIGVsZW1lbnRcbiAgICAgICAgaWYgKGJ5dGVBcnJheS5sZW5ndGggPT09IDE3ICYmIGJ5dGVBcnJheVswXSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ5dGVBcnJheS5zbGljZSgxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnl0ZUFycmF5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYW4gdW5zaWduZWQgYnl0ZSBhcnJheVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICAgKi9cbiAgICB0b1Vuc2lnbmVkQnl0ZUFycmF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b0J5dGVBcnJheSgpLm1hcCh1bnNpZ25CeXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIGJ5dGUgYXJyYXkgdG8gYW4gQWRkcmVzczYgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQHN0YXRpY1xuICAgICAqIEByZXR1cm5zIHtBZGRyZXNzNn1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUJ5dGVBcnJheShieXRlcykge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tVW5zaWduZWRCeXRlQXJyYXkoYnl0ZXMubWFwKHVuc2lnbkJ5dGUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhbiB1bnNpZ25lZCBieXRlIGFycmF5IHRvIGFuIEFkZHJlc3M2IG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcmV0dXJucyB7QWRkcmVzczZ9XG4gICAgICovXG4gICAgc3RhdGljIGZyb21VbnNpZ25lZEJ5dGVBcnJheShieXRlcykge1xuICAgICAgICBjb25zdCBCWVRFX01BWCA9IG5ldyBqc2JuXzEuQmlnSW50ZWdlcignMjU2JywgMTApO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IGpzYm5fMS5CaWdJbnRlZ2VyKCcwJywgMTApO1xuICAgICAgICBsZXQgbXVsdGlwbGllciA9IG5ldyBqc2JuXzEuQmlnSW50ZWdlcignMScsIDEwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGJ5dGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuYWRkKG11bHRpcGxpZXIubXVsdGlwbHkobmV3IGpzYm5fMS5CaWdJbnRlZ2VyKGJ5dGVzW2ldLnRvU3RyaW5nKDEwKSwgMTApKSk7XG4gICAgICAgICAgICBtdWx0aXBsaWVyID0gbXVsdGlwbGllci5tdWx0aXBseShCWVRFX01BWCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFkZHJlc3M2LmZyb21CaWdJbnRlZ2VyKHJlc3VsdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBpbiB0aGUgY2Fub25pY2FsIGZvcm0sIGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzQ2Fub25pY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzTWludXNTdWZmaXggPT09IHRoaXMuY2Fub25pY2FsRm9ybSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBsaW5rIGxvY2FsIGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzTGlua0xvY2FsKCkge1xuICAgICAgICAvLyBaZXJvZXMgYXJlIHJlcXVpcmVkLCBpLmUuIHdlIGNhbid0IGNoZWNrIGlzSW5TdWJuZXQgd2l0aCAnZmU4MDo6LzEwJ1xuICAgICAgICBpZiAodGhpcy5nZXRCaXRzQmFzZTIoMCwgNjQpID09PVxuICAgICAgICAgICAgJzExMTExMTEwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIG11bHRpY2FzdCBhZGRyZXNzLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc011bHRpY2FzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZSgpID09PSAnTXVsdGljYXN0JztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgdjQtaW4tdjYgYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXM0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52NDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgVGVyZWRvIGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzVGVyZWRvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0luU3VibmV0KG5ldyBBZGRyZXNzNignMjAwMTo6LzMyJykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSA2dG80IGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGlzNnRvNCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJblN1Ym5ldChuZXcgQWRkcmVzczYoJzIwMDI6Oi8xNicpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgaXNMb29wYmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHlwZSgpID09PSAnTG9vcGJhY2snO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uXG4gICAgLy8gI3JlZ2lvbiBIVE1MXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIGFkZHJlc3MgaW4gbGluayBmb3JtIHdpdGggYSBkZWZhdWx0IHBvcnQgb2YgODBcbiAgICAgKi9cbiAgICBocmVmKG9wdGlvbmFsUG9ydCkge1xuICAgICAgICBpZiAob3B0aW9uYWxQb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbmFsUG9ydCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9uYWxQb3J0ID0gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnOiVzJywgb3B0aW9uYWxQb3J0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnaHR0cDovL1slc10lcy8nLCB0aGlzLmNvcnJlY3RGb3JtKCksIG9wdGlvbmFsUG9ydCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IGEgbGluayBzdWl0YWJsZSBmb3IgY29udmV5aW5nIHRoZSBhZGRyZXNzIHZpYSBhIFVSTCBoYXNoXG4gICAgICovXG4gICAgbGluayhvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmNsYXNzTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNsYXNzTmFtZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLnByZWZpeCA9ICcvI2FkZHJlc3M9JztcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy52NCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLnY0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvcm1GdW5jdGlvbiA9IHRoaXMuY29ycmVjdEZvcm07XG4gICAgICAgIGlmIChvcHRpb25zLnY0KSB7XG4gICAgICAgICAgICBmb3JtRnVuY3Rpb24gPSB0aGlzLnRvNGluNjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCc8YSBocmVmPVwiJTEkcyUyJHNcIiBjbGFzcz1cIiUzJHNcIj4lMiRzPC9hPicsIG9wdGlvbnMucHJlZml4LCBmb3JtRnVuY3Rpb24uY2FsbCh0aGlzKSwgb3B0aW9ucy5jbGFzc05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCc8YSBocmVmPVwiJTEkcyUyJHNcIj4lMiRzPC9hPicsIG9wdGlvbnMucHJlZml4LCBmb3JtRnVuY3Rpb24uY2FsbCh0aGlzKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdyb3VwcyBhbiBhZGRyZXNzXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBncm91cCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxpZGVkR3JvdXBzID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGUgc2ltcGxlIGNhc2VcbiAgICAgICAgICAgIHJldHVybiBoZWxwZXJzLnNpbXBsZUdyb3VwKHRoaXMuYWRkcmVzcykuam9pbignOicpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydCh0eXBlb2YgdGhpcy5lbGlkZWRHcm91cHMgPT09ICdudW1iZXInKTtcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiB0aGlzLmVsaXNpb25CZWdpbiA9PT0gJ251bWJlcicpO1xuICAgICAgICAvLyBUaGUgZWxpZGVkIGNhc2VcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gW107XG4gICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodF0gPSB0aGlzLmFkZHJlc3Muc3BsaXQoJzo6Jyk7XG4gICAgICAgIGlmIChsZWZ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goLi4uaGVscGVycy5zaW1wbGVHcm91cChsZWZ0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFsnaG92ZXItZ3JvdXAnXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuZWxpc2lvbkJlZ2luOyBpIDwgdGhpcy5lbGlzaW9uQmVnaW4gKyB0aGlzLmVsaWRlZEdyb3VwczsgaSsrKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnZ3JvdXAtJWQnLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0LnB1c2goKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnPHNwYW4gY2xhc3M9XCIlc1wiPjwvc3Bhbj4nLCBjbGFzc2VzLmpvaW4oJyAnKSkpO1xuICAgICAgICBpZiAocmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCguLi5oZWxwZXJzLnNpbXBsZUdyb3VwKHJpZ2h0LCB0aGlzLmVsaXNpb25FbmQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pczQoKSkge1xuICAgICAgICAgICAgYXNzZXJ0KHRoaXMuYWRkcmVzczQgaW5zdGFuY2VvZiBpcHY0XzEuQWRkcmVzczQpO1xuICAgICAgICAgICAgb3V0cHV0LnBvcCgpO1xuICAgICAgICAgICAgb3V0cHV0LnB1c2godGhpcy5hZGRyZXNzNC5ncm91cEZvclY2KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXQuam9pbignOicpO1xuICAgIH1cbiAgICAvLyAjZW5kcmVnaW9uXG4gICAgLy8gI3JlZ2lvbiBSZWd1bGFyIGV4cHJlc3Npb25zXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gZmluZCBvciB2YWxpZGF0ZVxuICAgICAqIGFsbCB2YXJpYXRpb25zIG9mIHRoaXMgYWRkcmVzc1xuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3Vic3RyaW5nU2VhcmNoXG4gICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAgKi9cbiAgICByZWd1bGFyRXhwcmVzc2lvblN0cmluZyhzdWJzdHJpbmdTZWFyY2ggPSBmYWxzZSkge1xuICAgICAgICBsZXQgb3V0cHV0ID0gW107XG4gICAgICAgIC8vIFRPRE86IHJldmlzaXQgd2h5IHRoaXMgaXMgbmVjZXNzYXJ5XG4gICAgICAgIGNvbnN0IGFkZHJlc3M2ID0gbmV3IEFkZHJlc3M2KHRoaXMuY29ycmVjdEZvcm0oKSk7XG4gICAgICAgIGlmIChhZGRyZXNzNi5lbGlkZWRHcm91cHMgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoZSBzaW1wbGUgY2FzZVxuICAgICAgICAgICAgb3V0cHV0LnB1c2goKDAsIHJlZ3VsYXJfZXhwcmVzc2lvbnNfMS5zaW1wbGVSZWd1bGFyRXhwcmVzc2lvbikoYWRkcmVzczYucGFyc2VkQWRkcmVzcykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFkZHJlc3M2LmVsaWRlZEdyb3VwcyA9PT0gY29uc3RhbnRzNi5HUk9VUFMpIHtcbiAgICAgICAgICAgIC8vIEEgY29tcGxldGVseSBlbGlkZWQgYWRkcmVzc1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goKDAsIHJlZ3VsYXJfZXhwcmVzc2lvbnNfMS5wb3NzaWJsZUVsaXNpb25zKShjb25zdGFudHM2LkdST1VQUykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQSBwYXJ0aWFsbHkgZWxpZGVkIGFkZHJlc3NcbiAgICAgICAgICAgIGNvbnN0IGhhbHZlcyA9IGFkZHJlc3M2LmFkZHJlc3Muc3BsaXQoJzo6Jyk7XG4gICAgICAgICAgICBpZiAoaGFsdmVzWzBdLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCgwLCByZWd1bGFyX2V4cHJlc3Npb25zXzEuc2ltcGxlUmVndWxhckV4cHJlc3Npb24pKGhhbHZlc1swXS5zcGxpdCgnOicpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIGFkZHJlc3M2LmVsaWRlZEdyb3VwcyA9PT0gJ251bWJlcicpO1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goKDAsIHJlZ3VsYXJfZXhwcmVzc2lvbnNfMS5wb3NzaWJsZUVsaXNpb25zKShhZGRyZXNzNi5lbGlkZWRHcm91cHMsIGhhbHZlc1swXS5sZW5ndGggIT09IDAsIGhhbHZlc1sxXS5sZW5ndGggIT09IDApKTtcbiAgICAgICAgICAgIGlmIChoYWx2ZXNbMV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goKDAsIHJlZ3VsYXJfZXhwcmVzc2lvbnNfMS5zaW1wbGVSZWd1bGFyRXhwcmVzc2lvbikoaGFsdmVzWzFdLnNwbGl0KCc6JykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dCA9IFtvdXRwdXQuam9pbignOicpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN1YnN0cmluZ1NlYXJjaCkge1xuICAgICAgICAgICAgb3V0cHV0ID0gW1xuICAgICAgICAgICAgICAgICcoPz1efCcsXG4gICAgICAgICAgICAgICAgcmVndWxhcl9leHByZXNzaW9uc18xLkFERFJFU1NfQk9VTkRBUlksXG4gICAgICAgICAgICAgICAgJ3xbXlxcXFx3XFxcXDpdKSgnLFxuICAgICAgICAgICAgICAgIC4uLm91dHB1dCxcbiAgICAgICAgICAgICAgICAnKSg/PVteXFxcXHdcXFxcOl18JyxcbiAgICAgICAgICAgICAgICByZWd1bGFyX2V4cHJlc3Npb25zXzEuQUREUkVTU19CT1VOREFSWSxcbiAgICAgICAgICAgICAgICAnfCQpJyxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBjYW4gYmUgdXNlZCB0byBmaW5kIG9yIHZhbGlkYXRlIGFsbFxuICAgICAqIHZhcmlhdGlvbnMgb2YgdGhpcyBhZGRyZXNzLlxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc3Vic3RyaW5nU2VhcmNoXG4gICAgICogQHJldHVybnMge1JlZ0V4cH1cbiAgICAgKi9cbiAgICByZWd1bGFyRXhwcmVzc2lvbihzdWJzdHJpbmdTZWFyY2ggPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCh0aGlzLnJlZ3VsYXJFeHByZXNzaW9uU3RyaW5nKHN1YnN0cmluZ1NlYXJjaCksICdpJyk7XG4gICAgfVxufVxuZXhwb3J0cy5BZGRyZXNzNiA9IEFkZHJlc3M2O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXB2Ni5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUkVfU1VCTkVUX1NUUklORyA9IGV4cG9ydHMuUkVfQUREUkVTUyA9IGV4cG9ydHMuR1JPVVBTID0gZXhwb3J0cy5CSVRTID0gdm9pZCAwO1xuZXhwb3J0cy5CSVRTID0gMzI7XG5leHBvcnRzLkdST1VQUyA9IDQ7XG5leHBvcnRzLlJFX0FERFJFU1MgPSAvXigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pJC9nO1xuZXhwb3J0cy5SRV9TVUJORVRfU1RSSU5HID0gL1xcL1xcZHsxLDJ9JC87XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdGFudHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlJFX1VSTF9XSVRIX1BPUlQgPSBleHBvcnRzLlJFX1VSTCA9IGV4cG9ydHMuUkVfWk9ORV9TVFJJTkcgPSBleHBvcnRzLlJFX1NVQk5FVF9TVFJJTkcgPSBleHBvcnRzLlJFX0JBRF9BRERSRVNTID0gZXhwb3J0cy5SRV9CQURfQ0hBUkFDVEVSUyA9IGV4cG9ydHMuVFlQRVMgPSBleHBvcnRzLlNDT1BFUyA9IGV4cG9ydHMuR1JPVVBTID0gZXhwb3J0cy5CSVRTID0gdm9pZCAwO1xuZXhwb3J0cy5CSVRTID0gMTI4O1xuZXhwb3J0cy5HUk9VUFMgPSA4O1xuLyoqXG4gKiBSZXByZXNlbnRzIElQdjYgYWRkcmVzcyBzY29wZXNcbiAqIEBtZW1iZXJvZiBBZGRyZXNzNlxuICogQHN0YXRpY1xuICovXG5leHBvcnRzLlNDT1BFUyA9IHtcbiAgICAwOiAnUmVzZXJ2ZWQnLFxuICAgIDE6ICdJbnRlcmZhY2UgbG9jYWwnLFxuICAgIDI6ICdMaW5rIGxvY2FsJyxcbiAgICA0OiAnQWRtaW4gbG9jYWwnLFxuICAgIDU6ICdTaXRlIGxvY2FsJyxcbiAgICA4OiAnT3JnYW5pemF0aW9uIGxvY2FsJyxcbiAgICAxNDogJ0dsb2JhbCcsXG4gICAgMTU6ICdSZXNlcnZlZCcsXG59O1xuLyoqXG4gKiBSZXByZXNlbnRzIElQdjYgYWRkcmVzcyB0eXBlc1xuICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gKiBAc3RhdGljXG4gKi9cbmV4cG9ydHMuVFlQRVMgPSB7XG4gICAgJ2ZmMDE6OjEvMTI4JzogJ011bHRpY2FzdCAoQWxsIG5vZGVzIG9uIHRoaXMgaW50ZXJmYWNlKScsXG4gICAgJ2ZmMDE6OjIvMTI4JzogJ011bHRpY2FzdCAoQWxsIHJvdXRlcnMgb24gdGhpcyBpbnRlcmZhY2UpJyxcbiAgICAnZmYwMjo6MS8xMjgnOiAnTXVsdGljYXN0IChBbGwgbm9kZXMgb24gdGhpcyBsaW5rKScsXG4gICAgJ2ZmMDI6OjIvMTI4JzogJ011bHRpY2FzdCAoQWxsIHJvdXRlcnMgb24gdGhpcyBsaW5rKScsXG4gICAgJ2ZmMDU6OjIvMTI4JzogJ011bHRpY2FzdCAoQWxsIHJvdXRlcnMgaW4gdGhpcyBzaXRlKScsXG4gICAgJ2ZmMDI6OjUvMTI4JzogJ011bHRpY2FzdCAoT1NQRnYzIEFsbFNQRiByb3V0ZXJzKScsXG4gICAgJ2ZmMDI6OjYvMTI4JzogJ011bHRpY2FzdCAoT1NQRnYzIEFsbERSIHJvdXRlcnMpJyxcbiAgICAnZmYwMjo6OS8xMjgnOiAnTXVsdGljYXN0IChSSVAgcm91dGVycyknLFxuICAgICdmZjAyOjphLzEyOCc6ICdNdWx0aWNhc3QgKEVJR1JQIHJvdXRlcnMpJyxcbiAgICAnZmYwMjo6ZC8xMjgnOiAnTXVsdGljYXN0IChQSU0gcm91dGVycyknLFxuICAgICdmZjAyOjoxNi8xMjgnOiAnTXVsdGljYXN0IChNTER2MiByZXBvcnRzKScsXG4gICAgJ2ZmMDE6OmZiLzEyOCc6ICdNdWx0aWNhc3QgKG1ETlN2NiknLFxuICAgICdmZjAyOjpmYi8xMjgnOiAnTXVsdGljYXN0IChtRE5TdjYpJyxcbiAgICAnZmYwNTo6ZmIvMTI4JzogJ011bHRpY2FzdCAobUROU3Y2KScsXG4gICAgJ2ZmMDI6OjE6Mi8xMjgnOiAnTXVsdGljYXN0IChBbGwgREhDUCBzZXJ2ZXJzIGFuZCByZWxheSBhZ2VudHMgb24gdGhpcyBsaW5rKScsXG4gICAgJ2ZmMDU6OjE6Mi8xMjgnOiAnTXVsdGljYXN0IChBbGwgREhDUCBzZXJ2ZXJzIGFuZCByZWxheSBhZ2VudHMgaW4gdGhpcyBzaXRlKScsXG4gICAgJ2ZmMDI6OjE6My8xMjgnOiAnTXVsdGljYXN0IChBbGwgREhDUCBzZXJ2ZXJzIG9uIHRoaXMgbGluayknLFxuICAgICdmZjA1OjoxOjMvMTI4JzogJ011bHRpY2FzdCAoQWxsIERIQ1Agc2VydmVycyBpbiB0aGlzIHNpdGUpJyxcbiAgICAnOjovMTI4JzogJ1Vuc3BlY2lmaWVkJyxcbiAgICAnOjoxLzEyOCc6ICdMb29wYmFjaycsXG4gICAgJ2ZmMDA6Oi84JzogJ011bHRpY2FzdCcsXG4gICAgJ2ZlODA6Oi8xMCc6ICdMaW5rLWxvY2FsIHVuaWNhc3QnLFxufTtcbi8qKlxuICogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIGJhZCBjaGFyYWN0ZXJzIGluIGFuIElQdjYgYWRkcmVzc1xuICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gKiBAc3RhdGljXG4gKi9cbmV4cG9ydHMuUkVfQkFEX0NIQVJBQ1RFUlMgPSAvKFteMC05YS1mOi8lXSkvZ2k7XG4vKipcbiAqIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBhbiBpbmNvcnJlY3QgSVB2NiBhZGRyZXNzXG4gKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0cy5SRV9CQURfQUREUkVTUyA9IC8oWzAtOWEtZl17NSx9fDp7Myx9fFteOl06JHxeOlteOl18XFwvJCkvZ2k7XG4vKipcbiAqIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBhbiBJUHY2IHN1Ym5ldFxuICogQG1lbWJlcm9mIEFkZHJlc3M2XG4gKiBAc3RhdGljXG4gKi9cbmV4cG9ydHMuUkVfU1VCTkVUX1NUUklORyA9IC9cXC9cXGR7MSwzfSg/PSV8JCkvO1xuLyoqXG4gKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgYW4gSVB2NiB6b25lXG4gKiBAbWVtYmVyb2YgQWRkcmVzczZcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0cy5SRV9aT05FX1NUUklORyA9IC8lLiokLztcbmV4cG9ydHMuUkVfVVJMID0gbmV3IFJlZ0V4cCgvXlxcW3swLDF9KFswLTlhLWY6XSspXFxdezAsMX0vKTtcbmV4cG9ydHMuUkVfVVJMX1dJVEhfUE9SVCA9IG5ldyBSZWdFeHAoL1xcWyhbMC05YS1mOl0rKVxcXTooWzAtOV17MSw1fSkvKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0YW50cy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc2ltcGxlR3JvdXAgPSBleHBvcnRzLnNwYW5MZWFkaW5nWmVyb2VzID0gZXhwb3J0cy5zcGFuQWxsID0gZXhwb3J0cy5zcGFuQWxsWmVyb2VzID0gdm9pZCAwO1xuY29uc3Qgc3ByaW50Zl9qc18xID0gcmVxdWlyZShcInNwcmludGYtanNcIik7XG4vKipcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBzdHJpbmcgd2l0aCBhbGwgemVyb2VzIGNvbnRhaW5lZCBpbiBhIDxzcGFuPlxuICovXG5mdW5jdGlvbiBzcGFuQWxsWmVyb2VzKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKC8oMCspL2csICc8c3BhbiBjbGFzcz1cInplcm9cIj4kMTwvc3Bhbj4nKTtcbn1cbmV4cG9ydHMuc3BhbkFsbFplcm9lcyA9IHNwYW5BbGxaZXJvZXM7XG4vKipcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBzdHJpbmcgd2l0aCBlYWNoIGNoYXJhY3RlciBjb250YWluZWQgaW4gYSA8c3Bhbj5cbiAqL1xuZnVuY3Rpb24gc3BhbkFsbChzLCBvZmZzZXQgPSAwKSB7XG4gICAgY29uc3QgbGV0dGVycyA9IHMuc3BsaXQoJycpO1xuICAgIHJldHVybiBsZXR0ZXJzXG4gICAgICAgIC5tYXAoKG4sIGkpID0+ICgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJzxzcGFuIGNsYXNzPVwiZGlnaXQgdmFsdWUtJXMgcG9zaXRpb24tJWRcIj4lczwvc3Bhbj4nLCBuLCBpICsgb2Zmc2V0LCBzcGFuQWxsWmVyb2VzKG4pKSAvLyBYWFggVXNlICNiYXNlLTIgLnZhbHVlLTAgaW5zdGVhZD9cbiAgICApXG4gICAgICAgIC5qb2luKCcnKTtcbn1cbmV4cG9ydHMuc3BhbkFsbCA9IHNwYW5BbGw7XG5mdW5jdGlvbiBzcGFuTGVhZGluZ1plcm9lc1NpbXBsZShncm91cCkge1xuICAgIHJldHVybiBncm91cC5yZXBsYWNlKC9eKDArKS8sICc8c3BhbiBjbGFzcz1cInplcm9cIj4kMTwvc3Bhbj4nKTtcbn1cbi8qKlxuICogQHJldHVybnMge1N0cmluZ30gdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgemVyb2VzIGNvbnRhaW5lZCBpbiBhIDxzcGFuPlxuICovXG5mdW5jdGlvbiBzcGFuTGVhZGluZ1plcm9lcyhhZGRyZXNzKSB7XG4gICAgY29uc3QgZ3JvdXBzID0gYWRkcmVzcy5zcGxpdCgnOicpO1xuICAgIHJldHVybiBncm91cHMubWFwKChnKSA9PiBzcGFuTGVhZGluZ1plcm9lc1NpbXBsZShnKSkuam9pbignOicpO1xufVxuZXhwb3J0cy5zcGFuTGVhZGluZ1plcm9lcyA9IHNwYW5MZWFkaW5nWmVyb2VzO1xuLyoqXG4gKiBHcm91cHMgYW4gYWRkcmVzc1xuICogQHJldHVybnMge1N0cmluZ30gYSBncm91cGVkIGFkZHJlc3NcbiAqL1xuZnVuY3Rpb24gc2ltcGxlR3JvdXAoYWRkcmVzc1N0cmluZywgb2Zmc2V0ID0gMCkge1xuICAgIGNvbnN0IGdyb3VwcyA9IGFkZHJlc3NTdHJpbmcuc3BsaXQoJzonKTtcbiAgICByZXR1cm4gZ3JvdXBzLm1hcCgoZywgaSkgPT4ge1xuICAgICAgICBpZiAoL2dyb3VwLXY0Ly50ZXN0KGcpKSB7XG4gICAgICAgICAgICByZXR1cm4gZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDAsIHNwcmludGZfanNfMS5zcHJpbnRmKSgnPHNwYW4gY2xhc3M9XCJob3Zlci1ncm91cCBncm91cC0lZFwiPiVzPC9zcGFuPicsIGkgKyBvZmZzZXQsIHNwYW5MZWFkaW5nWmVyb2VzU2ltcGxlKGcpKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuc2ltcGxlR3JvdXAgPSBzaW1wbGVHcm91cDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhlbHBlcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucG9zc2libGVFbGlzaW9ucyA9IGV4cG9ydHMuc2ltcGxlUmVndWxhckV4cHJlc3Npb24gPSBleHBvcnRzLkFERFJFU1NfQk9VTkRBUlkgPSBleHBvcnRzLnBhZEdyb3VwID0gZXhwb3J0cy5ncm91cFBvc3NpYmlsaXRpZXMgPSB2b2lkIDA7XG5jb25zdCB2NiA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb25zdGFudHNcIikpO1xuY29uc3Qgc3ByaW50Zl9qc18xID0gcmVxdWlyZShcInNwcmludGYtanNcIik7XG5mdW5jdGlvbiBncm91cFBvc3NpYmlsaXRpZXMocG9zc2liaWxpdGllcykge1xuICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCcoJXMpJywgcG9zc2liaWxpdGllcy5qb2luKCd8JykpO1xufVxuZXhwb3J0cy5ncm91cFBvc3NpYmlsaXRpZXMgPSBncm91cFBvc3NpYmlsaXRpZXM7XG5mdW5jdGlvbiBwYWRHcm91cChncm91cCkge1xuICAgIGlmIChncm91cC5sZW5ndGggPCA0KSB7XG4gICAgICAgIHJldHVybiAoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCcwezAsJWR9JXMnLCA0IC0gZ3JvdXAubGVuZ3RoLCBncm91cCk7XG4gICAgfVxuICAgIHJldHVybiBncm91cDtcbn1cbmV4cG9ydHMucGFkR3JvdXAgPSBwYWRHcm91cDtcbmV4cG9ydHMuQUREUkVTU19CT1VOREFSWSA9ICdbXkEtRmEtZjAtOTpdJztcbmZ1bmN0aW9uIHNpbXBsZVJlZ3VsYXJFeHByZXNzaW9uKGdyb3Vwcykge1xuICAgIGNvbnN0IHplcm9JbmRleGVzID0gW107XG4gICAgZ3JvdXBzLmZvckVhY2goKGdyb3VwLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwSW50ZWdlciA9IHBhcnNlSW50KGdyb3VwLCAxNik7XG4gICAgICAgIGlmIChncm91cEludGVnZXIgPT09IDApIHtcbiAgICAgICAgICAgIHplcm9JbmRleGVzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBZb3UgY2FuIHRlY2huaWNhbGx5IGVsaWRlIGEgc2luZ2xlIDAsIHRoaXMgY3JlYXRlcyB0aGUgcmVndWxhciBleHByZXNzaW9uc1xuICAgIC8vIHRvIG1hdGNoIHRoYXQgZXZlbnR1YWxpdHlcbiAgICBjb25zdCBwb3NzaWJpbGl0aWVzID0gemVyb0luZGV4ZXMubWFwKCh6ZXJvSW5kZXgpID0+IGdyb3Vwc1xuICAgICAgICAubWFwKChncm91cCwgaSkgPT4ge1xuICAgICAgICBpZiAoaSA9PT0gemVyb0luZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGlzaW9uID0gaSA9PT0gMCB8fCBpID09PSB2Ni5HUk9VUFMgLSAxID8gJzonIDogJyc7XG4gICAgICAgICAgICByZXR1cm4gZ3JvdXBQb3NzaWJpbGl0aWVzKFtwYWRHcm91cChncm91cCksIGVsaXNpb25dKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFkR3JvdXAoZ3JvdXApO1xuICAgIH0pXG4gICAgICAgIC5qb2luKCc6JykpO1xuICAgIC8vIFRoZSBzaW1wbGVzdCBjYXNlXG4gICAgcG9zc2liaWxpdGllcy5wdXNoKGdyb3Vwcy5tYXAocGFkR3JvdXApLmpvaW4oJzonKSk7XG4gICAgcmV0dXJuIGdyb3VwUG9zc2liaWxpdGllcyhwb3NzaWJpbGl0aWVzKTtcbn1cbmV4cG9ydHMuc2ltcGxlUmVndWxhckV4cHJlc3Npb24gPSBzaW1wbGVSZWd1bGFyRXhwcmVzc2lvbjtcbmZ1bmN0aW9uIHBvc3NpYmxlRWxpc2lvbnMoZWxpZGVkR3JvdXBzLCBtb3JlTGVmdCwgbW9yZVJpZ2h0KSB7XG4gICAgY29uc3QgbGVmdCA9IG1vcmVMZWZ0ID8gJycgOiAnOic7XG4gICAgY29uc3QgcmlnaHQgPSBtb3JlUmlnaHQgPyAnJyA6ICc6JztcbiAgICBjb25zdCBwb3NzaWJpbGl0aWVzID0gW107XG4gICAgLy8gMS4gZWxpc2lvbiBvZiBldmVyeXRoaW5nICg6OilcbiAgICBpZiAoIW1vcmVMZWZ0ICYmICFtb3JlUmlnaHQpIHtcbiAgICAgICAgcG9zc2liaWxpdGllcy5wdXNoKCc6OicpO1xuICAgIH1cbiAgICAvLyAyLiBjb21wbGV0ZSBlbGlzaW9uIG9mIHRoZSBtaWRkbGVcbiAgICBpZiAobW9yZUxlZnQgJiYgbW9yZVJpZ2h0KSB7XG4gICAgICAgIHBvc3NpYmlsaXRpZXMucHVzaCgnJyk7XG4gICAgfVxuICAgIGlmICgobW9yZVJpZ2h0ICYmICFtb3JlTGVmdCkgfHwgKCFtb3JlUmlnaHQgJiYgbW9yZUxlZnQpKSB7XG4gICAgICAgIC8vIDMuIGNvbXBsZXRlIGVsaXNpb24gb2Ygb25lIHNpZGVcbiAgICAgICAgcG9zc2liaWxpdGllcy5wdXNoKCc6Jyk7XG4gICAgfVxuICAgIC8vIDQuIGVsaXNpb24gZnJvbSB0aGUgbGVmdCBzaWRlXG4gICAgcG9zc2liaWxpdGllcy5wdXNoKCgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJyVzKDowezEsNH0pezEsJWR9JywgbGVmdCwgZWxpZGVkR3JvdXBzIC0gMSkpO1xuICAgIC8vIDUuIGVsaXNpb24gZnJvbSB0aGUgcmlnaHQgc2lkZVxuICAgIHBvc3NpYmlsaXRpZXMucHVzaCgoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCcoMHsxLDR9Oil7MSwlZH0lcycsIGVsaWRlZEdyb3VwcyAtIDEsIHJpZ2h0KSk7XG4gICAgLy8gNi4gbm8gZWxpc2lvblxuICAgIHBvc3NpYmlsaXRpZXMucHVzaCgoMCwgc3ByaW50Zl9qc18xLnNwcmludGYpKCcoMHsxLDR9Oil7JWR9MHsxLDR9JywgZWxpZGVkR3JvdXBzIC0gMSkpO1xuICAgIC8vIDcuIGVsaXNpb24gKGluY2x1ZGluZyBzbG9wcHkgZWxpc2lvbikgZnJvbSB0aGUgbWlkZGxlXG4gICAgZm9yIChsZXQgZ3JvdXBzID0gMTsgZ3JvdXBzIDwgZWxpZGVkR3JvdXBzIC0gMTsgZ3JvdXBzKyspIHtcbiAgICAgICAgZm9yIChsZXQgcG9zaXRpb24gPSAxOyBwb3NpdGlvbiA8IGVsaWRlZEdyb3VwcyAtIGdyb3VwczsgcG9zaXRpb24rKykge1xuICAgICAgICAgICAgcG9zc2liaWxpdGllcy5wdXNoKCgwLCBzcHJpbnRmX2pzXzEuc3ByaW50ZikoJygwezEsNH06KXslZH06KDB7MSw0fTopeyVkfTB7MSw0fScsIHBvc2l0aW9uLCBlbGlkZWRHcm91cHMgLSBwb3NpdGlvbiAtIGdyb3VwcyAtIDEpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ3JvdXBQb3NzaWJpbGl0aWVzKHBvc3NpYmlsaXRpZXMpO1xufVxuZXhwb3J0cy5wb3NzaWJsZUVsaXNpb25zID0gcG9zc2libGVFbGlzaW9ucztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlZ3VsYXItZXhwcmVzc2lvbnMuanMubWFwIiwiLyogZXNsaW50LWRpc2FibGUgeW9kYSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpc0Z1bGx3aWR0aENvZGVQb2ludCA9IGNvZGVQb2ludCA9PiB7XG5cdGlmIChOdW1iZXIuaXNOYU4oY29kZVBvaW50KSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIENvZGUgcG9pbnRzIGFyZSBkZXJpdmVkIGZyb206XG5cdC8vIGh0dHA6Ly93d3cudW5peC5vcmcvUHVibGljL1VOSURBVEEvRWFzdEFzaWFuV2lkdGgudHh0XG5cdGlmIChcblx0XHRjb2RlUG9pbnQgPj0gMHgxMTAwICYmIChcblx0XHRcdGNvZGVQb2ludCA8PSAweDExNUYgfHwgLy8gSGFuZ3VsIEphbW9cblx0XHRcdGNvZGVQb2ludCA9PT0gMHgyMzI5IHx8IC8vIExFRlQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVFxuXHRcdFx0Y29kZVBvaW50ID09PSAweDIzMkEgfHwgLy8gUklHSFQtUE9JTlRJTkcgQU5HTEUgQlJBQ0tFVFxuXHRcdFx0Ly8gQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQgLi4gRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRoc1xuXHRcdFx0KDB4MkU4MCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4MzI0NyAmJiBjb2RlUG9pbnQgIT09IDB4MzAzRikgfHxcblx0XHRcdC8vIEVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMgLi4gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQVxuXHRcdFx0KDB4MzI1MCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4NERCRikgfHxcblx0XHRcdC8vIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgLi4gWWkgUmFkaWNhbHNcblx0XHRcdCgweDRFMDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEE0QzYpIHx8XG5cdFx0XHQvLyBIYW5ndWwgSmFtbyBFeHRlbmRlZC1BXG5cdFx0XHQoMHhBOTYwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHhBOTdDKSB8fFxuXHRcdFx0Ly8gSGFuZ3VsIFN5bGxhYmxlc1xuXHRcdFx0KDB4QUMwMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RDdBMykgfHxcblx0XHRcdC8vIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHNcblx0XHRcdCgweEY5MDAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEZBRkYpIHx8XG5cdFx0XHQvLyBWZXJ0aWNhbCBGb3Jtc1xuXHRcdFx0KDB4RkUxMCA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkUxOSkgfHxcblx0XHRcdC8vIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zIC4uIFNtYWxsIEZvcm0gVmFyaWFudHNcblx0XHRcdCgweEZFMzAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEZFNkIpIHx8XG5cdFx0XHQvLyBIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3Jtc1xuXHRcdFx0KDB4RkYwMSA8PSBjb2RlUG9pbnQgJiYgY29kZVBvaW50IDw9IDB4RkY2MCkgfHxcblx0XHRcdCgweEZGRTAgPD0gY29kZVBvaW50ICYmIGNvZGVQb2ludCA8PSAweEZGRTYpIHx8XG5cdFx0XHQvLyBLYW5hIFN1cHBsZW1lbnRcblx0XHRcdCgweDFCMDAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgxQjAwMSkgfHxcblx0XHRcdC8vIEVuY2xvc2VkIElkZW9ncmFwaGljIFN1cHBsZW1lbnRcblx0XHRcdCgweDFGMjAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgxRjI1MSkgfHxcblx0XHRcdC8vIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEIgLi4gVGVydGlhcnkgSWRlb2dyYXBoaWMgUGxhbmVcblx0XHRcdCgweDIwMDAwIDw9IGNvZGVQb2ludCAmJiBjb2RlUG9pbnQgPD0gMHgzRkZGRClcblx0XHQpXG5cdCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0Z1bGx3aWR0aENvZGVQb2ludDtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBpc0Z1bGx3aWR0aENvZGVQb2ludDtcbiIsIihmdW5jdGlvbigpe1xuXG4gICAgLy8gQ29weXJpZ2h0IChjKSAyMDA1ICBUb20gV3VcbiAgICAvLyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgIC8vIFNlZSBcIkxJQ0VOU0VcIiBmb3IgZGV0YWlscy5cblxuICAgIC8vIEJhc2ljIEphdmFTY3JpcHQgQk4gbGlicmFyeSAtIHN1YnNldCB1c2VmdWwgZm9yIFJTQSBlbmNyeXB0aW9uLlxuXG4gICAgLy8gQml0cyBwZXIgZGlnaXRcbiAgICB2YXIgZGJpdHM7XG5cbiAgICAvLyBKYXZhU2NyaXB0IGVuZ2luZSBhbmFseXNpc1xuICAgIHZhciBjYW5hcnkgPSAweGRlYWRiZWVmY2FmZTtcbiAgICB2YXIgal9sbSA9ICgoY2FuYXJ5JjB4ZmZmZmZmKT09MHhlZmNhZmUpO1xuXG4gICAgLy8gKHB1YmxpYykgQ29uc3RydWN0b3JcbiAgICBmdW5jdGlvbiBCaWdJbnRlZ2VyKGEsYixjKSB7XG4gICAgICBpZihhICE9IG51bGwpXG4gICAgICAgIGlmKFwibnVtYmVyXCIgPT0gdHlwZW9mIGEpIHRoaXMuZnJvbU51bWJlcihhLGIsYyk7XG4gICAgICAgIGVsc2UgaWYoYiA9PSBudWxsICYmIFwic3RyaW5nXCIgIT0gdHlwZW9mIGEpIHRoaXMuZnJvbVN0cmluZyhhLDI1Nik7XG4gICAgICAgIGVsc2UgdGhpcy5mcm9tU3RyaW5nKGEsYik7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJuIG5ldywgdW5zZXQgQmlnSW50ZWdlclxuICAgIGZ1bmN0aW9uIG5iaSgpIHsgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKG51bGwpOyB9XG5cbiAgICAvLyBhbTogQ29tcHV0ZSB3X2ogKz0gKHgqdGhpc19pKSwgcHJvcGFnYXRlIGNhcnJpZXMsXG4gICAgLy8gYyBpcyBpbml0aWFsIGNhcnJ5LCByZXR1cm5zIGZpbmFsIGNhcnJ5LlxuICAgIC8vIGMgPCAzKmR2YWx1ZSwgeCA8IDIqZHZhbHVlLCB0aGlzX2kgPCBkdmFsdWVcbiAgICAvLyBXZSBuZWVkIHRvIHNlbGVjdCB0aGUgZmFzdGVzdCBvbmUgdGhhdCB3b3JrcyBpbiB0aGlzIGVudmlyb25tZW50LlxuXG4gICAgLy8gYW0xOiB1c2UgYSBzaW5nbGUgbXVsdCBhbmQgZGl2aWRlIHRvIGdldCB0aGUgaGlnaCBiaXRzLFxuICAgIC8vIG1heCBkaWdpdCBiaXRzIHNob3VsZCBiZSAyNiBiZWNhdXNlXG4gICAgLy8gbWF4IGludGVybmFsIHZhbHVlID0gMipkdmFsdWVeMi0yKmR2YWx1ZSAoPCAyXjUzKVxuICAgIGZ1bmN0aW9uIGFtMShpLHgsdyxqLGMsbikge1xuICAgICAgd2hpbGUoLS1uID49IDApIHtcbiAgICAgICAgdmFyIHYgPSB4KnRoaXNbaSsrXSt3W2pdK2M7XG4gICAgICAgIGMgPSBNYXRoLmZsb29yKHYvMHg0MDAwMDAwKTtcbiAgICAgICAgd1tqKytdID0gdiYweDNmZmZmZmY7XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9XG4gICAgLy8gYW0yIGF2b2lkcyBhIGJpZyBtdWx0LWFuZC1leHRyYWN0IGNvbXBsZXRlbHkuXG4gICAgLy8gTWF4IGRpZ2l0IGJpdHMgc2hvdWxkIGJlIDw9IDMwIGJlY2F1c2Ugd2UgZG8gYml0d2lzZSBvcHNcbiAgICAvLyBvbiB2YWx1ZXMgdXAgdG8gMipoZHZhbHVlXjItaGR2YWx1ZS0xICg8IDJeMzEpXG4gICAgZnVuY3Rpb24gYW0yKGkseCx3LGosYyxuKSB7XG4gICAgICB2YXIgeGwgPSB4JjB4N2ZmZiwgeGggPSB4Pj4xNTtcbiAgICAgIHdoaWxlKC0tbiA+PSAwKSB7XG4gICAgICAgIHZhciBsID0gdGhpc1tpXSYweDdmZmY7XG4gICAgICAgIHZhciBoID0gdGhpc1tpKytdPj4xNTtcbiAgICAgICAgdmFyIG0gPSB4aCpsK2gqeGw7XG4gICAgICAgIGwgPSB4bCpsKygobSYweDdmZmYpPDwxNSkrd1tqXSsoYyYweDNmZmZmZmZmKTtcbiAgICAgICAgYyA9IChsPj4+MzApKyhtPj4+MTUpK3hoKmgrKGM+Pj4zMCk7XG4gICAgICAgIHdbaisrXSA9IGwmMHgzZmZmZmZmZjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjO1xuICAgIH1cbiAgICAvLyBBbHRlcm5hdGVseSwgc2V0IG1heCBkaWdpdCBiaXRzIHRvIDI4IHNpbmNlIHNvbWVcbiAgICAvLyBicm93c2VycyBzbG93IGRvd24gd2hlbiBkZWFsaW5nIHdpdGggMzItYml0IG51bWJlcnMuXG4gICAgZnVuY3Rpb24gYW0zKGkseCx3LGosYyxuKSB7XG4gICAgICB2YXIgeGwgPSB4JjB4M2ZmZiwgeGggPSB4Pj4xNDtcbiAgICAgIHdoaWxlKC0tbiA+PSAwKSB7XG4gICAgICAgIHZhciBsID0gdGhpc1tpXSYweDNmZmY7XG4gICAgICAgIHZhciBoID0gdGhpc1tpKytdPj4xNDtcbiAgICAgICAgdmFyIG0gPSB4aCpsK2gqeGw7XG4gICAgICAgIGwgPSB4bCpsKygobSYweDNmZmYpPDwxNCkrd1tqXStjO1xuICAgICAgICBjID0gKGw+PjI4KSsobT4+MTQpK3hoKmg7XG4gICAgICAgIHdbaisrXSA9IGwmMHhmZmZmZmZmO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGM7XG4gICAgfVxuICAgIHZhciBpbkJyb3dzZXIgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiO1xuICAgIGlmKGluQnJvd3NlciAmJiBqX2xtICYmIChuYXZpZ2F0b3IuYXBwTmFtZSA9PSBcIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlclwiKSkge1xuICAgICAgQmlnSW50ZWdlci5wcm90b3R5cGUuYW0gPSBhbTI7XG4gICAgICBkYml0cyA9IDMwO1xuICAgIH1cbiAgICBlbHNlIGlmKGluQnJvd3NlciAmJiBqX2xtICYmIChuYXZpZ2F0b3IuYXBwTmFtZSAhPSBcIk5ldHNjYXBlXCIpKSB7XG4gICAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbSA9IGFtMTtcbiAgICAgIGRiaXRzID0gMjY7XG4gICAgfVxuICAgIGVsc2UgeyAvLyBNb3ppbGxhL05ldHNjYXBlIHNlZW1zIHRvIHByZWZlciBhbTNcbiAgICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFtID0gYW0zO1xuICAgICAgZGJpdHMgPSAyODtcbiAgICB9XG5cbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5EQiA9IGRiaXRzO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkRNID0gKCgxPDxkYml0cyktMSk7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuRFYgPSAoMTw8ZGJpdHMpO1xuXG4gICAgdmFyIEJJX0ZQID0gNTI7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuRlYgPSBNYXRoLnBvdygyLEJJX0ZQKTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5GMSA9IEJJX0ZQLWRiaXRzO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLkYyID0gMipkYml0cy1CSV9GUDtcblxuICAgIC8vIERpZ2l0IGNvbnZlcnNpb25zXG4gICAgdmFyIEJJX1JNID0gXCIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIjtcbiAgICB2YXIgQklfUkMgPSBuZXcgQXJyYXkoKTtcbiAgICB2YXIgcnIsdnY7XG4gICAgcnIgPSBcIjBcIi5jaGFyQ29kZUF0KDApO1xuICAgIGZvcih2diA9IDA7IHZ2IDw9IDk7ICsrdnYpIEJJX1JDW3JyKytdID0gdnY7XG4gICAgcnIgPSBcImFcIi5jaGFyQ29kZUF0KDApO1xuICAgIGZvcih2diA9IDEwOyB2diA8IDM2OyArK3Z2KSBCSV9SQ1tycisrXSA9IHZ2O1xuICAgIHJyID0gXCJBXCIuY2hhckNvZGVBdCgwKTtcbiAgICBmb3IodnYgPSAxMDsgdnYgPCAzNjsgKyt2dikgQklfUkNbcnIrK10gPSB2djtcblxuICAgIGZ1bmN0aW9uIGludDJjaGFyKG4pIHsgcmV0dXJuIEJJX1JNLmNoYXJBdChuKTsgfVxuICAgIGZ1bmN0aW9uIGludEF0KHMsaSkge1xuICAgICAgdmFyIGMgPSBCSV9SQ1tzLmNoYXJDb2RlQXQoaSldO1xuICAgICAgcmV0dXJuIChjPT1udWxsKT8tMTpjO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIGNvcHkgdGhpcyB0byByXG4gICAgZnVuY3Rpb24gYm5wQ29weVRvKHIpIHtcbiAgICAgIGZvcih2YXIgaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkgcltpXSA9IHRoaXNbaV07XG4gICAgICByLnQgPSB0aGlzLnQ7XG4gICAgICByLnMgPSB0aGlzLnM7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgc2V0IGZyb20gaW50ZWdlciB2YWx1ZSB4LCAtRFYgPD0geCA8IERWXG4gICAgZnVuY3Rpb24gYm5wRnJvbUludCh4KSB7XG4gICAgICB0aGlzLnQgPSAxO1xuICAgICAgdGhpcy5zID0gKHg8MCk/LTE6MDtcbiAgICAgIGlmKHggPiAwKSB0aGlzWzBdID0geDtcbiAgICAgIGVsc2UgaWYoeCA8IC0xKSB0aGlzWzBdID0geCt0aGlzLkRWO1xuICAgICAgZWxzZSB0aGlzLnQgPSAwO1xuICAgIH1cblxuICAgIC8vIHJldHVybiBiaWdpbnQgaW5pdGlhbGl6ZWQgdG8gdmFsdWVcbiAgICBmdW5jdGlvbiBuYnYoaSkgeyB2YXIgciA9IG5iaSgpOyByLmZyb21JbnQoaSk7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBzZXQgZnJvbSBzdHJpbmcgYW5kIHJhZGl4XG4gICAgZnVuY3Rpb24gYm5wRnJvbVN0cmluZyhzLGIpIHtcbiAgICAgIHZhciBrO1xuICAgICAgaWYoYiA9PSAxNikgayA9IDQ7XG4gICAgICBlbHNlIGlmKGIgPT0gOCkgayA9IDM7XG4gICAgICBlbHNlIGlmKGIgPT0gMjU2KSBrID0gODsgLy8gYnl0ZSBhcnJheVxuICAgICAgZWxzZSBpZihiID09IDIpIGsgPSAxO1xuICAgICAgZWxzZSBpZihiID09IDMyKSBrID0gNTtcbiAgICAgIGVsc2UgaWYoYiA9PSA0KSBrID0gMjtcbiAgICAgIGVsc2UgeyB0aGlzLmZyb21SYWRpeChzLGIpOyByZXR1cm47IH1cbiAgICAgIHRoaXMudCA9IDA7XG4gICAgICB0aGlzLnMgPSAwO1xuICAgICAgdmFyIGkgPSBzLmxlbmd0aCwgbWkgPSBmYWxzZSwgc2ggPSAwO1xuICAgICAgd2hpbGUoLS1pID49IDApIHtcbiAgICAgICAgdmFyIHggPSAoaz09OCk/c1tpXSYweGZmOmludEF0KHMsaSk7XG4gICAgICAgIGlmKHggPCAwKSB7XG4gICAgICAgICAgaWYocy5jaGFyQXQoaSkgPT0gXCItXCIpIG1pID0gdHJ1ZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBtaSA9IGZhbHNlO1xuICAgICAgICBpZihzaCA9PSAwKVxuICAgICAgICAgIHRoaXNbdGhpcy50KytdID0geDtcbiAgICAgICAgZWxzZSBpZihzaCtrID4gdGhpcy5EQikge1xuICAgICAgICAgIHRoaXNbdGhpcy50LTFdIHw9ICh4JigoMTw8KHRoaXMuREItc2gpKS0xKSk8PHNoO1xuICAgICAgICAgIHRoaXNbdGhpcy50KytdID0gKHg+Pih0aGlzLkRCLXNoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRoaXNbdGhpcy50LTFdIHw9IHg8PHNoO1xuICAgICAgICBzaCArPSBrO1xuICAgICAgICBpZihzaCA+PSB0aGlzLkRCKSBzaCAtPSB0aGlzLkRCO1xuICAgICAgfVxuICAgICAgaWYoayA9PSA4ICYmIChzWzBdJjB4ODApICE9IDApIHtcbiAgICAgICAgdGhpcy5zID0gLTE7XG4gICAgICAgIGlmKHNoID4gMCkgdGhpc1t0aGlzLnQtMV0gfD0gKCgxPDwodGhpcy5EQi1zaCkpLTEpPDxzaDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xhbXAoKTtcbiAgICAgIGlmKG1pKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBjbGFtcCBvZmYgZXhjZXNzIGhpZ2ggd29yZHNcbiAgICBmdW5jdGlvbiBibnBDbGFtcCgpIHtcbiAgICAgIHZhciBjID0gdGhpcy5zJnRoaXMuRE07XG4gICAgICB3aGlsZSh0aGlzLnQgPiAwICYmIHRoaXNbdGhpcy50LTFdID09IGMpIC0tdGhpcy50O1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW4gZ2l2ZW4gcmFkaXhcbiAgICBmdW5jdGlvbiBiblRvU3RyaW5nKGIpIHtcbiAgICAgIGlmKHRoaXMucyA8IDApIHJldHVybiBcIi1cIit0aGlzLm5lZ2F0ZSgpLnRvU3RyaW5nKGIpO1xuICAgICAgdmFyIGs7XG4gICAgICBpZihiID09IDE2KSBrID0gNDtcbiAgICAgIGVsc2UgaWYoYiA9PSA4KSBrID0gMztcbiAgICAgIGVsc2UgaWYoYiA9PSAyKSBrID0gMTtcbiAgICAgIGVsc2UgaWYoYiA9PSAzMikgayA9IDU7XG4gICAgICBlbHNlIGlmKGIgPT0gNCkgayA9IDI7XG4gICAgICBlbHNlIHJldHVybiB0aGlzLnRvUmFkaXgoYik7XG4gICAgICB2YXIga20gPSAoMTw8ayktMSwgZCwgbSA9IGZhbHNlLCByID0gXCJcIiwgaSA9IHRoaXMudDtcbiAgICAgIHZhciBwID0gdGhpcy5EQi0oaSp0aGlzLkRCKSVrO1xuICAgICAgaWYoaS0tID4gMCkge1xuICAgICAgICBpZihwIDwgdGhpcy5EQiAmJiAoZCA9IHRoaXNbaV0+PnApID4gMCkgeyBtID0gdHJ1ZTsgciA9IGludDJjaGFyKGQpOyB9XG4gICAgICAgIHdoaWxlKGkgPj0gMCkge1xuICAgICAgICAgIGlmKHAgPCBrKSB7XG4gICAgICAgICAgICBkID0gKHRoaXNbaV0mKCgxPDxwKS0xKSk8PChrLXApO1xuICAgICAgICAgICAgZCB8PSB0aGlzWy0taV0+PihwKz10aGlzLkRCLWspO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGQgPSAodGhpc1tpXT4+KHAtPWspKSZrbTtcbiAgICAgICAgICAgIGlmKHAgPD0gMCkgeyBwICs9IHRoaXMuREI7IC0taTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZihkID4gMCkgbSA9IHRydWU7XG4gICAgICAgICAgaWYobSkgciArPSBpbnQyY2hhcihkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG0/cjpcIjBcIjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSAtdGhpc1xuICAgIGZ1bmN0aW9uIGJuTmVnYXRlKCkgeyB2YXIgciA9IG5iaSgpOyBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyxyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHx0aGlzfFxuICAgIGZ1bmN0aW9uIGJuQWJzKCkgeyByZXR1cm4gKHRoaXMuczwwKT90aGlzLm5lZ2F0ZSgpOnRoaXM7IH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybiArIGlmIHRoaXMgPiBhLCAtIGlmIHRoaXMgPCBhLCAwIGlmIGVxdWFsXG4gICAgZnVuY3Rpb24gYm5Db21wYXJlVG8oYSkge1xuICAgICAgdmFyIHIgPSB0aGlzLnMtYS5zO1xuICAgICAgaWYociAhPSAwKSByZXR1cm4gcjtcbiAgICAgIHZhciBpID0gdGhpcy50O1xuICAgICAgciA9IGktYS50O1xuICAgICAgaWYociAhPSAwKSByZXR1cm4gKHRoaXMuczwwKT8tcjpyO1xuICAgICAgd2hpbGUoLS1pID49IDApIGlmKChyPXRoaXNbaV0tYVtpXSkgIT0gMCkgcmV0dXJuIHI7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIGJpdCBsZW5ndGggb2YgdGhlIGludGVnZXIgeFxuICAgIGZ1bmN0aW9uIG5iaXRzKHgpIHtcbiAgICAgIHZhciByID0gMSwgdDtcbiAgICAgIGlmKCh0PXg+Pj4xNikgIT0gMCkgeyB4ID0gdDsgciArPSAxNjsgfVxuICAgICAgaWYoKHQ9eD4+OCkgIT0gMCkgeyB4ID0gdDsgciArPSA4OyB9XG4gICAgICBpZigodD14Pj40KSAhPSAwKSB7IHggPSB0OyByICs9IDQ7IH1cbiAgICAgIGlmKCh0PXg+PjIpICE9IDApIHsgeCA9IHQ7IHIgKz0gMjsgfVxuICAgICAgaWYoKHQ9eD4+MSkgIT0gMCkgeyB4ID0gdDsgciArPSAxOyB9XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSByZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIGluIFwidGhpc1wiXG4gICAgZnVuY3Rpb24gYm5CaXRMZW5ndGgoKSB7XG4gICAgICBpZih0aGlzLnQgPD0gMCkgcmV0dXJuIDA7XG4gICAgICByZXR1cm4gdGhpcy5EQioodGhpcy50LTEpK25iaXRzKHRoaXNbdGhpcy50LTFdXih0aGlzLnMmdGhpcy5ETSkpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIDw8IG4qREJcbiAgICBmdW5jdGlvbiBibnBETFNoaWZ0VG8obixyKSB7XG4gICAgICB2YXIgaTtcbiAgICAgIGZvcihpID0gdGhpcy50LTE7IGkgPj0gMDsgLS1pKSByW2krbl0gPSB0aGlzW2ldO1xuICAgICAgZm9yKGkgPSBuLTE7IGkgPj0gMDsgLS1pKSByW2ldID0gMDtcbiAgICAgIHIudCA9IHRoaXMudCtuO1xuICAgICAgci5zID0gdGhpcy5zO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzID4+IG4qREJcbiAgICBmdW5jdGlvbiBibnBEUlNoaWZ0VG8obixyKSB7XG4gICAgICBmb3IodmFyIGkgPSBuOyBpIDwgdGhpcy50OyArK2kpIHJbaS1uXSA9IHRoaXNbaV07XG4gICAgICByLnQgPSBNYXRoLm1heCh0aGlzLnQtbiwwKTtcbiAgICAgIHIucyA9IHRoaXMucztcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyA8PCBuXG4gICAgZnVuY3Rpb24gYm5wTFNoaWZ0VG8obixyKSB7XG4gICAgICB2YXIgYnMgPSBuJXRoaXMuREI7XG4gICAgICB2YXIgY2JzID0gdGhpcy5EQi1icztcbiAgICAgIHZhciBibSA9ICgxPDxjYnMpLTE7XG4gICAgICB2YXIgZHMgPSBNYXRoLmZsb29yKG4vdGhpcy5EQiksIGMgPSAodGhpcy5zPDxicykmdGhpcy5ETSwgaTtcbiAgICAgIGZvcihpID0gdGhpcy50LTE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHJbaStkcysxXSA9ICh0aGlzW2ldPj5jYnMpfGM7XG4gICAgICAgIGMgPSAodGhpc1tpXSZibSk8PGJzO1xuICAgICAgfVxuICAgICAgZm9yKGkgPSBkcy0xOyBpID49IDA7IC0taSkgcltpXSA9IDA7XG4gICAgICByW2RzXSA9IGM7XG4gICAgICByLnQgPSB0aGlzLnQrZHMrMTtcbiAgICAgIHIucyA9IHRoaXMucztcbiAgICAgIHIuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyA+PiBuXG4gICAgZnVuY3Rpb24gYm5wUlNoaWZ0VG8obixyKSB7XG4gICAgICByLnMgPSB0aGlzLnM7XG4gICAgICB2YXIgZHMgPSBNYXRoLmZsb29yKG4vdGhpcy5EQik7XG4gICAgICBpZihkcyA+PSB0aGlzLnQpIHsgci50ID0gMDsgcmV0dXJuOyB9XG4gICAgICB2YXIgYnMgPSBuJXRoaXMuREI7XG4gICAgICB2YXIgY2JzID0gdGhpcy5EQi1icztcbiAgICAgIHZhciBibSA9ICgxPDxicyktMTtcbiAgICAgIHJbMF0gPSB0aGlzW2RzXT4+YnM7XG4gICAgICBmb3IodmFyIGkgPSBkcysxOyBpIDwgdGhpcy50OyArK2kpIHtcbiAgICAgICAgcltpLWRzLTFdIHw9ICh0aGlzW2ldJmJtKTw8Y2JzO1xuICAgICAgICByW2ktZHNdID0gdGhpc1tpXT4+YnM7XG4gICAgICB9XG4gICAgICBpZihicyA+IDApIHJbdGhpcy50LWRzLTFdIHw9ICh0aGlzLnMmYm0pPDxjYnM7XG4gICAgICByLnQgPSB0aGlzLnQtZHM7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgLSBhXG4gICAgZnVuY3Rpb24gYm5wU3ViVG8oYSxyKSB7XG4gICAgICB2YXIgaSA9IDAsIGMgPSAwLCBtID0gTWF0aC5taW4oYS50LHRoaXMudCk7XG4gICAgICB3aGlsZShpIDwgbSkge1xuICAgICAgICBjICs9IHRoaXNbaV0tYVtpXTtcbiAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgfVxuICAgICAgaWYoYS50IDwgdGhpcy50KSB7XG4gICAgICAgIGMgLT0gYS5zO1xuICAgICAgICB3aGlsZShpIDwgdGhpcy50KSB7XG4gICAgICAgICAgYyArPSB0aGlzW2ldO1xuICAgICAgICAgIHJbaSsrXSA9IGMmdGhpcy5ETTtcbiAgICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgICB9XG4gICAgICAgIGMgKz0gdGhpcy5zO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGMgKz0gdGhpcy5zO1xuICAgICAgICB3aGlsZShpIDwgYS50KSB7XG4gICAgICAgICAgYyAtPSBhW2ldO1xuICAgICAgICAgIHJbaSsrXSA9IGMmdGhpcy5ETTtcbiAgICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgICB9XG4gICAgICAgIGMgLT0gYS5zO1xuICAgICAgfVxuICAgICAgci5zID0gKGM8MCk/LTE6MDtcbiAgICAgIGlmKGMgPCAtMSkgcltpKytdID0gdGhpcy5EVitjO1xuICAgICAgZWxzZSBpZihjID4gMCkgcltpKytdID0gYztcbiAgICAgIHIudCA9IGk7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgKiBhLCByICE9IHRoaXMsYSAoSEFDIDE0LjEyKVxuICAgIC8vIFwidGhpc1wiIHNob3VsZCBiZSB0aGUgbGFyZ2VyIG9uZSBpZiBhcHByb3ByaWF0ZS5cbiAgICBmdW5jdGlvbiBibnBNdWx0aXBseVRvKGEscikge1xuICAgICAgdmFyIHggPSB0aGlzLmFicygpLCB5ID0gYS5hYnMoKTtcbiAgICAgIHZhciBpID0geC50O1xuICAgICAgci50ID0gaSt5LnQ7XG4gICAgICB3aGlsZSgtLWkgPj0gMCkgcltpXSA9IDA7XG4gICAgICBmb3IoaSA9IDA7IGkgPCB5LnQ7ICsraSkgcltpK3gudF0gPSB4LmFtKDAseVtpXSxyLGksMCx4LnQpO1xuICAgICAgci5zID0gMDtcbiAgICAgIHIuY2xhbXAoKTtcbiAgICAgIGlmKHRoaXMucyAhPSBhLnMpIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyhyLHIpO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzXjIsIHIgIT0gdGhpcyAoSEFDIDE0LjE2KVxuICAgIGZ1bmN0aW9uIGJucFNxdWFyZVRvKHIpIHtcbiAgICAgIHZhciB4ID0gdGhpcy5hYnMoKTtcbiAgICAgIHZhciBpID0gci50ID0gMip4LnQ7XG4gICAgICB3aGlsZSgtLWkgPj0gMCkgcltpXSA9IDA7XG4gICAgICBmb3IoaSA9IDA7IGkgPCB4LnQtMTsgKytpKSB7XG4gICAgICAgIHZhciBjID0geC5hbShpLHhbaV0sciwyKmksMCwxKTtcbiAgICAgICAgaWYoKHJbaSt4LnRdKz14LmFtKGkrMSwyKnhbaV0sciwyKmkrMSxjLHgudC1pLTEpKSA+PSB4LkRWKSB7XG4gICAgICAgICAgcltpK3gudF0gLT0geC5EVjtcbiAgICAgICAgICByW2kreC50KzFdID0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYoci50ID4gMCkgcltyLnQtMV0gKz0geC5hbShpLHhbaV0sciwyKmksMCwxKTtcbiAgICAgIHIucyA9IDA7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgZGl2aWRlIHRoaXMgYnkgbSwgcXVvdGllbnQgYW5kIHJlbWFpbmRlciB0byBxLCByIChIQUMgMTQuMjApXG4gICAgLy8gciAhPSBxLCB0aGlzICE9IG0uICBxIG9yIHIgbWF5IGJlIG51bGwuXG4gICAgZnVuY3Rpb24gYm5wRGl2UmVtVG8obSxxLHIpIHtcbiAgICAgIHZhciBwbSA9IG0uYWJzKCk7XG4gICAgICBpZihwbS50IDw9IDApIHJldHVybjtcbiAgICAgIHZhciBwdCA9IHRoaXMuYWJzKCk7XG4gICAgICBpZihwdC50IDwgcG0udCkge1xuICAgICAgICBpZihxICE9IG51bGwpIHEuZnJvbUludCgwKTtcbiAgICAgICAgaWYociAhPSBudWxsKSB0aGlzLmNvcHlUbyhyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYociA9PSBudWxsKSByID0gbmJpKCk7XG4gICAgICB2YXIgeSA9IG5iaSgpLCB0cyA9IHRoaXMucywgbXMgPSBtLnM7XG4gICAgICB2YXIgbnNoID0gdGhpcy5EQi1uYml0cyhwbVtwbS50LTFdKTsgICAvLyBub3JtYWxpemUgbW9kdWx1c1xuICAgICAgaWYobnNoID4gMCkgeyBwbS5sU2hpZnRUbyhuc2gseSk7IHB0LmxTaGlmdFRvKG5zaCxyKTsgfVxuICAgICAgZWxzZSB7IHBtLmNvcHlUbyh5KTsgcHQuY29weVRvKHIpOyB9XG4gICAgICB2YXIgeXMgPSB5LnQ7XG4gICAgICB2YXIgeTAgPSB5W3lzLTFdO1xuICAgICAgaWYoeTAgPT0gMCkgcmV0dXJuO1xuICAgICAgdmFyIHl0ID0geTAqKDE8PHRoaXMuRjEpKygoeXM+MSk/eVt5cy0yXT4+dGhpcy5GMjowKTtcbiAgICAgIHZhciBkMSA9IHRoaXMuRlYveXQsIGQyID0gKDE8PHRoaXMuRjEpL3l0LCBlID0gMTw8dGhpcy5GMjtcbiAgICAgIHZhciBpID0gci50LCBqID0gaS15cywgdCA9IChxPT1udWxsKT9uYmkoKTpxO1xuICAgICAgeS5kbFNoaWZ0VG8oaix0KTtcbiAgICAgIGlmKHIuY29tcGFyZVRvKHQpID49IDApIHtcbiAgICAgICAgcltyLnQrK10gPSAxO1xuICAgICAgICByLnN1YlRvKHQscik7XG4gICAgICB9XG4gICAgICBCaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8oeXMsdCk7XG4gICAgICB0LnN1YlRvKHkseSk7ICAvLyBcIm5lZ2F0aXZlXCIgeSBzbyB3ZSBjYW4gcmVwbGFjZSBzdWIgd2l0aCBhbSBsYXRlclxuICAgICAgd2hpbGUoeS50IDwgeXMpIHlbeS50KytdID0gMDtcbiAgICAgIHdoaWxlKC0taiA+PSAwKSB7XG4gICAgICAgIC8vIEVzdGltYXRlIHF1b3RpZW50IGRpZ2l0XG4gICAgICAgIHZhciBxZCA9IChyWy0taV09PXkwKT90aGlzLkRNOk1hdGguZmxvb3IocltpXSpkMSsocltpLTFdK2UpKmQyKTtcbiAgICAgICAgaWYoKHJbaV0rPXkuYW0oMCxxZCxyLGosMCx5cykpIDwgcWQpIHsgICAvLyBUcnkgaXQgb3V0XG4gICAgICAgICAgeS5kbFNoaWZ0VG8oaix0KTtcbiAgICAgICAgICByLnN1YlRvKHQscik7XG4gICAgICAgICAgd2hpbGUocltpXSA8IC0tcWQpIHIuc3ViVG8odCxyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYocSAhPSBudWxsKSB7XG4gICAgICAgIHIuZHJTaGlmdFRvKHlzLHEpO1xuICAgICAgICBpZih0cyAhPSBtcykgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHEscSk7XG4gICAgICB9XG4gICAgICByLnQgPSB5cztcbiAgICAgIHIuY2xhbXAoKTtcbiAgICAgIGlmKG5zaCA+IDApIHIuclNoaWZ0VG8obnNoLHIpOyAvLyBEZW5vcm1hbGl6ZSByZW1haW5kZXJcbiAgICAgIGlmKHRzIDwgMCkgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHIscik7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyBtb2QgYVxuICAgIGZ1bmN0aW9uIGJuTW9kKGEpIHtcbiAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICB0aGlzLmFicygpLmRpdlJlbVRvKGEsbnVsbCxyKTtcbiAgICAgIGlmKHRoaXMucyA8IDAgJiYgci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA+IDApIGEuc3ViVG8ocixyKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIE1vZHVsYXIgcmVkdWN0aW9uIHVzaW5nIFwiY2xhc3NpY1wiIGFsZ29yaXRobVxuICAgIGZ1bmN0aW9uIENsYXNzaWMobSkgeyB0aGlzLm0gPSBtOyB9XG4gICAgZnVuY3Rpb24gY0NvbnZlcnQoeCkge1xuICAgICAgaWYoeC5zIDwgMCB8fCB4LmNvbXBhcmVUbyh0aGlzLm0pID49IDApIHJldHVybiB4Lm1vZCh0aGlzLm0pO1xuICAgICAgZWxzZSByZXR1cm4geDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY1JldmVydCh4KSB7IHJldHVybiB4OyB9XG4gICAgZnVuY3Rpb24gY1JlZHVjZSh4KSB7IHguZGl2UmVtVG8odGhpcy5tLG51bGwseCk7IH1cbiAgICBmdW5jdGlvbiBjTXVsVG8oeCx5LHIpIHsgeC5tdWx0aXBseVRvKHkscik7IHRoaXMucmVkdWNlKHIpOyB9XG4gICAgZnVuY3Rpb24gY1NxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG4gICAgQ2xhc3NpYy5wcm90b3R5cGUuY29udmVydCA9IGNDb252ZXJ0O1xuICAgIENsYXNzaWMucHJvdG90eXBlLnJldmVydCA9IGNSZXZlcnQ7XG4gICAgQ2xhc3NpYy5wcm90b3R5cGUucmVkdWNlID0gY1JlZHVjZTtcbiAgICBDbGFzc2ljLnByb3RvdHlwZS5tdWxUbyA9IGNNdWxUbztcbiAgICBDbGFzc2ljLnByb3RvdHlwZS5zcXJUbyA9IGNTcXJUbztcblxuICAgIC8vIChwcm90ZWN0ZWQpIHJldHVybiBcIi0xL3RoaXMgJSAyXkRCXCI7IHVzZWZ1bCBmb3IgTW9udC4gcmVkdWN0aW9uXG4gICAgLy8ganVzdGlmaWNhdGlvbjpcbiAgICAvLyAgICAgICAgIHh5ID09IDEgKG1vZCBtKVxuICAgIC8vICAgICAgICAgeHkgPSAgMStrbVxuICAgIC8vICAgeHkoMi14eSkgPSAoMStrbSkoMS1rbSlcbiAgICAvLyB4W3koMi14eSldID0gMS1rXjJtXjJcbiAgICAvLyB4W3koMi14eSldID09IDEgKG1vZCBtXjIpXG4gICAgLy8gaWYgeSBpcyAxL3ggbW9kIG0sIHRoZW4geSgyLXh5KSBpcyAxL3ggbW9kIG1eMlxuICAgIC8vIHNob3VsZCByZWR1Y2UgeCBhbmQgeSgyLXh5KSBieSBtXjIgYXQgZWFjaCBzdGVwIHRvIGtlZXAgc2l6ZSBib3VuZGVkLlxuICAgIC8vIEpTIG11bHRpcGx5IFwib3ZlcmZsb3dzXCIgZGlmZmVyZW50bHkgZnJvbSBDL0MrKywgc28gY2FyZSBpcyBuZWVkZWQgaGVyZS5cbiAgICBmdW5jdGlvbiBibnBJbnZEaWdpdCgpIHtcbiAgICAgIGlmKHRoaXMudCA8IDEpIHJldHVybiAwO1xuICAgICAgdmFyIHggPSB0aGlzWzBdO1xuICAgICAgaWYoKHgmMSkgPT0gMCkgcmV0dXJuIDA7XG4gICAgICB2YXIgeSA9IHgmMzsgICAgICAgLy8geSA9PSAxL3ggbW9kIDJeMlxuICAgICAgeSA9ICh5KigyLSh4JjB4ZikqeSkpJjB4ZjsgLy8geSA9PSAxL3ggbW9kIDJeNFxuICAgICAgeSA9ICh5KigyLSh4JjB4ZmYpKnkpKSYweGZmOyAgIC8vIHkgPT0gMS94IG1vZCAyXjhcbiAgICAgIHkgPSAoeSooMi0oKCh4JjB4ZmZmZikqeSkmMHhmZmZmKSkpJjB4ZmZmZjsgICAgLy8geSA9PSAxL3ggbW9kIDJeMTZcbiAgICAgIC8vIGxhc3Qgc3RlcCAtIGNhbGN1bGF0ZSBpbnZlcnNlIG1vZCBEViBkaXJlY3RseTtcbiAgICAgIC8vIGFzc3VtZXMgMTYgPCBEQiA8PSAzMiBhbmQgYXNzdW1lcyBhYmlsaXR5IHRvIGhhbmRsZSA0OC1iaXQgaW50c1xuICAgICAgeSA9ICh5KigyLXgqeSV0aGlzLkRWKSkldGhpcy5EVjsgICAgICAgLy8geSA9PSAxL3ggbW9kIDJeZGJpdHNcbiAgICAgIC8vIHdlIHJlYWxseSB3YW50IHRoZSBuZWdhdGl2ZSBpbnZlcnNlLCBhbmQgLURWIDwgeSA8IERWXG4gICAgICByZXR1cm4gKHk+MCk/dGhpcy5EVi15Oi15O1xuICAgIH1cblxuICAgIC8vIE1vbnRnb21lcnkgcmVkdWN0aW9uXG4gICAgZnVuY3Rpb24gTW9udGdvbWVyeShtKSB7XG4gICAgICB0aGlzLm0gPSBtO1xuICAgICAgdGhpcy5tcCA9IG0uaW52RGlnaXQoKTtcbiAgICAgIHRoaXMubXBsID0gdGhpcy5tcCYweDdmZmY7XG4gICAgICB0aGlzLm1waCA9IHRoaXMubXA+PjE1O1xuICAgICAgdGhpcy51bSA9ICgxPDwobS5EQi0xNSkpLTE7XG4gICAgICB0aGlzLm10MiA9IDIqbS50O1xuICAgIH1cblxuICAgIC8vIHhSIG1vZCBtXG4gICAgZnVuY3Rpb24gbW9udENvbnZlcnQoeCkge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIHguYWJzKCkuZGxTaGlmdFRvKHRoaXMubS50LHIpO1xuICAgICAgci5kaXZSZW1Ubyh0aGlzLm0sbnVsbCxyKTtcbiAgICAgIGlmKHgucyA8IDAgJiYgci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA+IDApIHRoaXMubS5zdWJUbyhyLHIpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8geC9SIG1vZCBtXG4gICAgZnVuY3Rpb24gbW9udFJldmVydCh4KSB7XG4gICAgICB2YXIgciA9IG5iaSgpO1xuICAgICAgeC5jb3B5VG8ocik7XG4gICAgICB0aGlzLnJlZHVjZShyKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIHggPSB4L1IgbW9kIG0gKEhBQyAxNC4zMilcbiAgICBmdW5jdGlvbiBtb250UmVkdWNlKHgpIHtcbiAgICAgIHdoaWxlKHgudCA8PSB0aGlzLm10MikgLy8gcGFkIHggc28gYW0gaGFzIGVub3VnaCByb29tIGxhdGVyXG4gICAgICAgIHhbeC50KytdID0gMDtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLm0udDsgKytpKSB7XG4gICAgICAgIC8vIGZhc3RlciB3YXkgb2YgY2FsY3VsYXRpbmcgdTAgPSB4W2ldKm1wIG1vZCBEVlxuICAgICAgICB2YXIgaiA9IHhbaV0mMHg3ZmZmO1xuICAgICAgICB2YXIgdTAgPSAoaip0aGlzLm1wbCsoKChqKnRoaXMubXBoKyh4W2ldPj4xNSkqdGhpcy5tcGwpJnRoaXMudW0pPDwxNSkpJnguRE07XG4gICAgICAgIC8vIHVzZSBhbSB0byBjb21iaW5lIHRoZSBtdWx0aXBseS1zaGlmdC1hZGQgaW50byBvbmUgY2FsbFxuICAgICAgICBqID0gaSt0aGlzLm0udDtcbiAgICAgICAgeFtqXSArPSB0aGlzLm0uYW0oMCx1MCx4LGksMCx0aGlzLm0udCk7XG4gICAgICAgIC8vIHByb3BhZ2F0ZSBjYXJyeVxuICAgICAgICB3aGlsZSh4W2pdID49IHguRFYpIHsgeFtqXSAtPSB4LkRWOyB4Wysral0rKzsgfVxuICAgICAgfVxuICAgICAgeC5jbGFtcCgpO1xuICAgICAgeC5kclNoaWZ0VG8odGhpcy5tLnQseCk7XG4gICAgICBpZih4LmNvbXBhcmVUbyh0aGlzLm0pID49IDApIHguc3ViVG8odGhpcy5tLHgpO1xuICAgIH1cblxuICAgIC8vIHIgPSBcInheMi9SIG1vZCBtXCI7IHggIT0gclxuICAgIGZ1bmN0aW9uIG1vbnRTcXJUbyh4LHIpIHsgeC5zcXVhcmVUbyhyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuICAgIC8vIHIgPSBcInh5L1IgbW9kIG1cIjsgeCx5ICE9IHJcbiAgICBmdW5jdGlvbiBtb250TXVsVG8oeCx5LHIpIHsgeC5tdWx0aXBseVRvKHkscik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbiAgICBNb250Z29tZXJ5LnByb3RvdHlwZS5jb252ZXJ0ID0gbW9udENvbnZlcnQ7XG4gICAgTW9udGdvbWVyeS5wcm90b3R5cGUucmV2ZXJ0ID0gbW9udFJldmVydDtcbiAgICBNb250Z29tZXJ5LnByb3RvdHlwZS5yZWR1Y2UgPSBtb250UmVkdWNlO1xuICAgIE1vbnRnb21lcnkucHJvdG90eXBlLm11bFRvID0gbW9udE11bFRvO1xuICAgIE1vbnRnb21lcnkucHJvdG90eXBlLnNxclRvID0gbW9udFNxclRvO1xuXG4gICAgLy8gKHByb3RlY3RlZCkgdHJ1ZSBpZmYgdGhpcyBpcyBldmVuXG4gICAgZnVuY3Rpb24gYm5wSXNFdmVuKCkgeyByZXR1cm4gKCh0aGlzLnQ+MCk/KHRoaXNbMF0mMSk6dGhpcy5zKSA9PSAwOyB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0aGlzXmUsIGUgPCAyXjMyLCBkb2luZyBzcXIgYW5kIG11bCB3aXRoIFwiclwiIChIQUMgMTQuNzkpXG4gICAgZnVuY3Rpb24gYm5wRXhwKGUseikge1xuICAgICAgaWYoZSA+IDB4ZmZmZmZmZmYgfHwgZSA8IDEpIHJldHVybiBCaWdJbnRlZ2VyLk9ORTtcbiAgICAgIHZhciByID0gbmJpKCksIHIyID0gbmJpKCksIGcgPSB6LmNvbnZlcnQodGhpcyksIGkgPSBuYml0cyhlKS0xO1xuICAgICAgZy5jb3B5VG8ocik7XG4gICAgICB3aGlsZSgtLWkgPj0gMCkge1xuICAgICAgICB6LnNxclRvKHIscjIpO1xuICAgICAgICBpZigoZSYoMTw8aSkpID4gMCkgei5tdWxUbyhyMixnLHIpO1xuICAgICAgICBlbHNlIHsgdmFyIHQgPSByOyByID0gcjI7IHIyID0gdDsgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHoucmV2ZXJ0KHIpO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXNeZSAlIG0sIDAgPD0gZSA8IDJeMzJcbiAgICBmdW5jdGlvbiBibk1vZFBvd0ludChlLG0pIHtcbiAgICAgIHZhciB6O1xuICAgICAgaWYoZSA8IDI1NiB8fCBtLmlzRXZlbigpKSB6ID0gbmV3IENsYXNzaWMobSk7IGVsc2UgeiA9IG5ldyBNb250Z29tZXJ5KG0pO1xuICAgICAgcmV0dXJuIHRoaXMuZXhwKGUseik7XG4gICAgfVxuXG4gICAgLy8gcHJvdGVjdGVkXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY29weVRvID0gYm5wQ29weVRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21JbnQgPSBibnBGcm9tSW50O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21TdHJpbmcgPSBibnBGcm9tU3RyaW5nO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNsYW1wID0gYm5wQ2xhbXA7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZGxTaGlmdFRvID0gYm5wRExTaGlmdFRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmRyU2hpZnRUbyA9IGJucERSU2hpZnRUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5sU2hpZnRUbyA9IGJucExTaGlmdFRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnJTaGlmdFRvID0gYm5wUlNoaWZ0VG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc3ViVG8gPSBibnBTdWJUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVRvID0gYm5wTXVsdGlwbHlUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmVUbyA9IGJucFNxdWFyZVRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmRpdlJlbVRvID0gYm5wRGl2UmVtVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaW52RGlnaXQgPSBibnBJbnZEaWdpdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc0V2ZW4gPSBibnBJc0V2ZW47XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZXhwID0gYm5wRXhwO1xuXG4gICAgLy8gcHVibGljXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUudG9TdHJpbmcgPSBiblRvU3RyaW5nO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm5lZ2F0ZSA9IGJuTmVnYXRlO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFicyA9IGJuQWJzO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNvbXBhcmVUbyA9IGJuQ29tcGFyZVRvO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJpdExlbmd0aCA9IGJuQml0TGVuZ3RoO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1vZCA9IGJuTW9kO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBvd0ludCA9IGJuTW9kUG93SW50O1xuXG4gICAgLy8gXCJjb25zdGFudHNcIlxuICAgIEJpZ0ludGVnZXIuWkVSTyA9IG5idigwKTtcbiAgICBCaWdJbnRlZ2VyLk9ORSA9IG5idigxKTtcblxuICAgIC8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA5ICBUb20gV3VcbiAgICAvLyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICAgIC8vIFNlZSBcIkxJQ0VOU0VcIiBmb3IgZGV0YWlscy5cblxuICAgIC8vIEV4dGVuZGVkIEphdmFTY3JpcHQgQk4gZnVuY3Rpb25zLCByZXF1aXJlZCBmb3IgUlNBIHByaXZhdGUgb3BzLlxuXG4gICAgLy8gVmVyc2lvbiAxLjE6IG5ldyBCaWdJbnRlZ2VyKFwiMFwiLCAxMCkgcmV0dXJucyBcInByb3BlclwiIHplcm9cbiAgICAvLyBWZXJzaW9uIDEuMjogc3F1YXJlKCkgQVBJLCBpc1Byb2JhYmxlUHJpbWUgZml4XG5cbiAgICAvLyAocHVibGljKVxuICAgIGZ1bmN0aW9uIGJuQ2xvbmUoKSB7IHZhciByID0gbmJpKCk7IHRoaXMuY29weVRvKHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIHZhbHVlIGFzIGludGVnZXJcbiAgICBmdW5jdGlvbiBibkludFZhbHVlKCkge1xuICAgICAgaWYodGhpcy5zIDwgMCkge1xuICAgICAgICBpZih0aGlzLnQgPT0gMSkgcmV0dXJuIHRoaXNbMF0tdGhpcy5EVjtcbiAgICAgICAgZWxzZSBpZih0aGlzLnQgPT0gMCkgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgZWxzZSBpZih0aGlzLnQgPT0gMSkgcmV0dXJuIHRoaXNbMF07XG4gICAgICBlbHNlIGlmKHRoaXMudCA9PSAwKSByZXR1cm4gMDtcbiAgICAgIC8vIGFzc3VtZXMgMTYgPCBEQiA8IDMyXG4gICAgICByZXR1cm4gKCh0aGlzWzFdJigoMTw8KDMyLXRoaXMuREIpKS0xKSk8PHRoaXMuREIpfHRoaXNbMF07XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIHZhbHVlIGFzIGJ5dGVcbiAgICBmdW5jdGlvbiBibkJ5dGVWYWx1ZSgpIHsgcmV0dXJuICh0aGlzLnQ9PTApP3RoaXMuczoodGhpc1swXTw8MjQpPj4yNDsgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIHZhbHVlIGFzIHNob3J0IChhc3N1bWVzIERCPj0xNilcbiAgICBmdW5jdGlvbiBiblNob3J0VmFsdWUoKSB7IHJldHVybiAodGhpcy50PT0wKT90aGlzLnM6KHRoaXNbMF08PDE2KT4+MTY7IH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHJldHVybiB4IHMudC4gcl54IDwgRFZcbiAgICBmdW5jdGlvbiBibnBDaHVua1NpemUocikgeyByZXR1cm4gTWF0aC5mbG9vcihNYXRoLkxOMip0aGlzLkRCL01hdGgubG9nKHIpKTsgfVxuXG4gICAgLy8gKHB1YmxpYykgMCBpZiB0aGlzID09IDAsIDEgaWYgdGhpcyA+IDBcbiAgICBmdW5jdGlvbiBiblNpZ051bSgpIHtcbiAgICAgIGlmKHRoaXMucyA8IDApIHJldHVybiAtMTtcbiAgICAgIGVsc2UgaWYodGhpcy50IDw9IDAgfHwgKHRoaXMudCA9PSAxICYmIHRoaXNbMF0gPD0gMCkpIHJldHVybiAwO1xuICAgICAgZWxzZSByZXR1cm4gMTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBjb252ZXJ0IHRvIHJhZGl4IHN0cmluZ1xuICAgIGZ1bmN0aW9uIGJucFRvUmFkaXgoYikge1xuICAgICAgaWYoYiA9PSBudWxsKSBiID0gMTA7XG4gICAgICBpZih0aGlzLnNpZ251bSgpID09IDAgfHwgYiA8IDIgfHwgYiA+IDM2KSByZXR1cm4gXCIwXCI7XG4gICAgICB2YXIgY3MgPSB0aGlzLmNodW5rU2l6ZShiKTtcbiAgICAgIHZhciBhID0gTWF0aC5wb3coYixjcyk7XG4gICAgICB2YXIgZCA9IG5idihhKSwgeSA9IG5iaSgpLCB6ID0gbmJpKCksIHIgPSBcIlwiO1xuICAgICAgdGhpcy5kaXZSZW1UbyhkLHkseik7XG4gICAgICB3aGlsZSh5LnNpZ251bSgpID4gMCkge1xuICAgICAgICByID0gKGErei5pbnRWYWx1ZSgpKS50b1N0cmluZyhiKS5zdWJzdHIoMSkgKyByO1xuICAgICAgICB5LmRpdlJlbVRvKGQseSx6KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB6LmludFZhbHVlKCkudG9TdHJpbmcoYikgKyByO1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIGNvbnZlcnQgZnJvbSByYWRpeCBzdHJpbmdcbiAgICBmdW5jdGlvbiBibnBGcm9tUmFkaXgocyxiKSB7XG4gICAgICB0aGlzLmZyb21JbnQoMCk7XG4gICAgICBpZihiID09IG51bGwpIGIgPSAxMDtcbiAgICAgIHZhciBjcyA9IHRoaXMuY2h1bmtTaXplKGIpO1xuICAgICAgdmFyIGQgPSBNYXRoLnBvdyhiLGNzKSwgbWkgPSBmYWxzZSwgaiA9IDAsIHcgPSAwO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHggPSBpbnRBdChzLGkpO1xuICAgICAgICBpZih4IDwgMCkge1xuICAgICAgICAgIGlmKHMuY2hhckF0KGkpID09IFwiLVwiICYmIHRoaXMuc2lnbnVtKCkgPT0gMCkgbWkgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHcgPSBiKncreDtcbiAgICAgICAgaWYoKytqID49IGNzKSB7XG4gICAgICAgICAgdGhpcy5kTXVsdGlwbHkoZCk7XG4gICAgICAgICAgdGhpcy5kQWRkT2Zmc2V0KHcsMCk7XG4gICAgICAgICAgaiA9IDA7XG4gICAgICAgICAgdyA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKGogPiAwKSB7XG4gICAgICAgIHRoaXMuZE11bHRpcGx5KE1hdGgucG93KGIsaikpO1xuICAgICAgICB0aGlzLmRBZGRPZmZzZXQodywwKTtcbiAgICAgIH1cbiAgICAgIGlmKG1pKSBCaWdJbnRlZ2VyLlpFUk8uc3ViVG8odGhpcyx0aGlzKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSBhbHRlcm5hdGUgY29uc3RydWN0b3JcbiAgICBmdW5jdGlvbiBibnBGcm9tTnVtYmVyKGEsYixjKSB7XG4gICAgICBpZihcIm51bWJlclwiID09IHR5cGVvZiBiKSB7XG4gICAgICAgIC8vIG5ldyBCaWdJbnRlZ2VyKGludCxpbnQsUk5HKVxuICAgICAgICBpZihhIDwgMikgdGhpcy5mcm9tSW50KDEpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZyb21OdW1iZXIoYSxjKTtcbiAgICAgICAgICBpZighdGhpcy50ZXN0Qml0KGEtMSkpICAgIC8vIGZvcmNlIE1TQiBzZXRcbiAgICAgICAgICAgIHRoaXMuYml0d2lzZVRvKEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChhLTEpLG9wX29yLHRoaXMpO1xuICAgICAgICAgIGlmKHRoaXMuaXNFdmVuKCkpIHRoaXMuZEFkZE9mZnNldCgxLDApOyAvLyBmb3JjZSBvZGRcbiAgICAgICAgICB3aGlsZSghdGhpcy5pc1Byb2JhYmxlUHJpbWUoYikpIHtcbiAgICAgICAgICAgIHRoaXMuZEFkZE9mZnNldCgyLDApO1xuICAgICAgICAgICAgaWYodGhpcy5iaXRMZW5ndGgoKSA+IGEpIHRoaXMuc3ViVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGEtMSksdGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy8gbmV3IEJpZ0ludGVnZXIoaW50LFJORylcbiAgICAgICAgdmFyIHggPSBuZXcgQXJyYXkoKSwgdCA9IGEmNztcbiAgICAgICAgeC5sZW5ndGggPSAoYT4+MykrMTtcbiAgICAgICAgYi5uZXh0Qnl0ZXMoeCk7XG4gICAgICAgIGlmKHQgPiAwKSB4WzBdICY9ICgoMTw8dCktMSk7IGVsc2UgeFswXSA9IDA7XG4gICAgICAgIHRoaXMuZnJvbVN0cmluZyh4LDI1Nik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgY29udmVydCB0byBiaWdlbmRpYW4gYnl0ZSBhcnJheVxuICAgIGZ1bmN0aW9uIGJuVG9CeXRlQXJyYXkoKSB7XG4gICAgICB2YXIgaSA9IHRoaXMudCwgciA9IG5ldyBBcnJheSgpO1xuICAgICAgclswXSA9IHRoaXMucztcbiAgICAgIHZhciBwID0gdGhpcy5EQi0oaSp0aGlzLkRCKSU4LCBkLCBrID0gMDtcbiAgICAgIGlmKGktLSA+IDApIHtcbiAgICAgICAgaWYocCA8IHRoaXMuREIgJiYgKGQgPSB0aGlzW2ldPj5wKSAhPSAodGhpcy5zJnRoaXMuRE0pPj5wKVxuICAgICAgICAgIHJbaysrXSA9IGR8KHRoaXMuczw8KHRoaXMuREItcCkpO1xuICAgICAgICB3aGlsZShpID49IDApIHtcbiAgICAgICAgICBpZihwIDwgOCkge1xuICAgICAgICAgICAgZCA9ICh0aGlzW2ldJigoMTw8cCktMSkpPDwoOC1wKTtcbiAgICAgICAgICAgIGQgfD0gdGhpc1stLWldPj4ocCs9dGhpcy5EQi04KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkID0gKHRoaXNbaV0+PihwLT04KSkmMHhmZjtcbiAgICAgICAgICAgIGlmKHAgPD0gMCkgeyBwICs9IHRoaXMuREI7IC0taTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZigoZCYweDgwKSAhPSAwKSBkIHw9IC0yNTY7XG4gICAgICAgICAgaWYoayA9PSAwICYmICh0aGlzLnMmMHg4MCkgIT0gKGQmMHg4MCkpICsraztcbiAgICAgICAgICBpZihrID4gMCB8fCBkICE9IHRoaXMucykgcltrKytdID0gZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYm5FcXVhbHMoYSkgeyByZXR1cm4odGhpcy5jb21wYXJlVG8oYSk9PTApOyB9XG4gICAgZnVuY3Rpb24gYm5NaW4oYSkgeyByZXR1cm4odGhpcy5jb21wYXJlVG8oYSk8MCk/dGhpczphOyB9XG4gICAgZnVuY3Rpb24gYm5NYXgoYSkgeyByZXR1cm4odGhpcy5jb21wYXJlVG8oYSk+MCk/dGhpczphOyB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSByID0gdGhpcyBvcCBhIChiaXR3aXNlKVxuICAgIGZ1bmN0aW9uIGJucEJpdHdpc2VUbyhhLG9wLHIpIHtcbiAgICAgIHZhciBpLCBmLCBtID0gTWF0aC5taW4oYS50LHRoaXMudCk7XG4gICAgICBmb3IoaSA9IDA7IGkgPCBtOyArK2kpIHJbaV0gPSBvcCh0aGlzW2ldLGFbaV0pO1xuICAgICAgaWYoYS50IDwgdGhpcy50KSB7XG4gICAgICAgIGYgPSBhLnMmdGhpcy5ETTtcbiAgICAgICAgZm9yKGkgPSBtOyBpIDwgdGhpcy50OyArK2kpIHJbaV0gPSBvcCh0aGlzW2ldLGYpO1xuICAgICAgICByLnQgPSB0aGlzLnQ7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgZiA9IHRoaXMucyZ0aGlzLkRNO1xuICAgICAgICBmb3IoaSA9IG07IGkgPCBhLnQ7ICsraSkgcltpXSA9IG9wKGYsYVtpXSk7XG4gICAgICAgIHIudCA9IGEudDtcbiAgICAgIH1cbiAgICAgIHIucyA9IG9wKHRoaXMucyxhLnMpO1xuICAgICAgci5jbGFtcCgpO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgJiBhXG4gICAgZnVuY3Rpb24gb3BfYW5kKHgseSkgeyByZXR1cm4geCZ5OyB9XG4gICAgZnVuY3Rpb24gYm5BbmQoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmJpdHdpc2VUbyhhLG9wX2FuZCxyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgfCBhXG4gICAgZnVuY3Rpb24gb3Bfb3IoeCx5KSB7IHJldHVybiB4fHk7IH1cbiAgICBmdW5jdGlvbiBibk9yKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5iaXR3aXNlVG8oYSxvcF9vcixyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgXiBhXG4gICAgZnVuY3Rpb24gb3BfeG9yKHgseSkgeyByZXR1cm4geF55OyB9XG4gICAgZnVuY3Rpb24gYm5Yb3IoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmJpdHdpc2VUbyhhLG9wX3hvcixyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgJiB+YVxuICAgIGZ1bmN0aW9uIG9wX2FuZG5vdCh4LHkpIHsgcmV0dXJuIHgmfnk7IH1cbiAgICBmdW5jdGlvbiBibkFuZE5vdChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfYW5kbm90LHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgfnRoaXNcbiAgICBmdW5jdGlvbiBibk5vdCgpIHtcbiAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy50OyArK2kpIHJbaV0gPSB0aGlzLkRNJn50aGlzW2ldO1xuICAgICAgci50ID0gdGhpcy50O1xuICAgICAgci5zID0gfnRoaXMucztcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgPDwgblxuICAgIGZ1bmN0aW9uIGJuU2hpZnRMZWZ0KG4pIHtcbiAgICAgIHZhciByID0gbmJpKCk7XG4gICAgICBpZihuIDwgMCkgdGhpcy5yU2hpZnRUbygtbixyKTsgZWxzZSB0aGlzLmxTaGlmdFRvKG4scik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzID4+IG5cbiAgICBmdW5jdGlvbiBiblNoaWZ0UmlnaHQobikge1xuICAgICAgdmFyIHIgPSBuYmkoKTtcbiAgICAgIGlmKG4gPCAwKSB0aGlzLmxTaGlmdFRvKC1uLHIpOyBlbHNlIHRoaXMuclNoaWZ0VG8obixyKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIHJldHVybiBpbmRleCBvZiBsb3dlc3QgMS1iaXQgaW4geCwgeCA8IDJeMzFcbiAgICBmdW5jdGlvbiBsYml0KHgpIHtcbiAgICAgIGlmKHggPT0gMCkgcmV0dXJuIC0xO1xuICAgICAgdmFyIHIgPSAwO1xuICAgICAgaWYoKHgmMHhmZmZmKSA9PSAwKSB7IHggPj49IDE2OyByICs9IDE2OyB9XG4gICAgICBpZigoeCYweGZmKSA9PSAwKSB7IHggPj49IDg7IHIgKz0gODsgfVxuICAgICAgaWYoKHgmMHhmKSA9PSAwKSB7IHggPj49IDQ7IHIgKz0gNDsgfVxuICAgICAgaWYoKHgmMykgPT0gMCkgeyB4ID4+PSAyOyByICs9IDI7IH1cbiAgICAgIGlmKCh4JjEpID09IDApICsrcjtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIHJldHVybnMgaW5kZXggb2YgbG93ZXN0IDEtYml0IChvciAtMSBpZiBub25lKVxuICAgIGZ1bmN0aW9uIGJuR2V0TG93ZXN0U2V0Qml0KCkge1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMudDsgKytpKVxuICAgICAgICBpZih0aGlzW2ldICE9IDApIHJldHVybiBpKnRoaXMuREIrbGJpdCh0aGlzW2ldKTtcbiAgICAgIGlmKHRoaXMucyA8IDApIHJldHVybiB0aGlzLnQqdGhpcy5EQjtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm4gbnVtYmVyIG9mIDEgYml0cyBpbiB4XG4gICAgZnVuY3Rpb24gY2JpdCh4KSB7XG4gICAgICB2YXIgciA9IDA7XG4gICAgICB3aGlsZSh4ICE9IDApIHsgeCAmPSB4LTE7ICsrcjsgfVxuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgcmV0dXJuIG51bWJlciBvZiBzZXQgYml0c1xuICAgIGZ1bmN0aW9uIGJuQml0Q291bnQoKSB7XG4gICAgICB2YXIgciA9IDAsIHggPSB0aGlzLnMmdGhpcy5ETTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnQ7ICsraSkgciArPSBjYml0KHRoaXNbaV1eeCk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSB0cnVlIGlmZiBudGggYml0IGlzIHNldFxuICAgIGZ1bmN0aW9uIGJuVGVzdEJpdChuKSB7XG4gICAgICB2YXIgaiA9IE1hdGguZmxvb3Iobi90aGlzLkRCKTtcbiAgICAgIGlmKGogPj0gdGhpcy50KSByZXR1cm4odGhpcy5zIT0wKTtcbiAgICAgIHJldHVybigodGhpc1tqXSYoMTw8KG4ldGhpcy5EQikpKSE9MCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgdGhpcyBvcCAoMTw8bilcbiAgICBmdW5jdGlvbiBibnBDaGFuZ2VCaXQobixvcCkge1xuICAgICAgdmFyIHIgPSBCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQobik7XG4gICAgICB0aGlzLmJpdHdpc2VUbyhyLG9wLHIpO1xuICAgICAgcmV0dXJuIHI7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyB8ICgxPDxuKVxuICAgIGZ1bmN0aW9uIGJuU2V0Qml0KG4pIHsgcmV0dXJuIHRoaXMuY2hhbmdlQml0KG4sb3Bfb3IpOyB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzICYgfigxPDxuKVxuICAgIGZ1bmN0aW9uIGJuQ2xlYXJCaXQobikgeyByZXR1cm4gdGhpcy5jaGFuZ2VCaXQobixvcF9hbmRub3QpOyB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzIF4gKDE8PG4pXG4gICAgZnVuY3Rpb24gYm5GbGlwQml0KG4pIHsgcmV0dXJuIHRoaXMuY2hhbmdlQml0KG4sb3BfeG9yKTsgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgKyBhXG4gICAgZnVuY3Rpb24gYm5wQWRkVG8oYSxyKSB7XG4gICAgICB2YXIgaSA9IDAsIGMgPSAwLCBtID0gTWF0aC5taW4oYS50LHRoaXMudCk7XG4gICAgICB3aGlsZShpIDwgbSkge1xuICAgICAgICBjICs9IHRoaXNbaV0rYVtpXTtcbiAgICAgICAgcltpKytdID0gYyZ0aGlzLkRNO1xuICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgfVxuICAgICAgaWYoYS50IDwgdGhpcy50KSB7XG4gICAgICAgIGMgKz0gYS5zO1xuICAgICAgICB3aGlsZShpIDwgdGhpcy50KSB7XG4gICAgICAgICAgYyArPSB0aGlzW2ldO1xuICAgICAgICAgIHJbaSsrXSA9IGMmdGhpcy5ETTtcbiAgICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgICB9XG4gICAgICAgIGMgKz0gdGhpcy5zO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGMgKz0gdGhpcy5zO1xuICAgICAgICB3aGlsZShpIDwgYS50KSB7XG4gICAgICAgICAgYyArPSBhW2ldO1xuICAgICAgICAgIHJbaSsrXSA9IGMmdGhpcy5ETTtcbiAgICAgICAgICBjID4+PSB0aGlzLkRCO1xuICAgICAgICB9XG4gICAgICAgIGMgKz0gYS5zO1xuICAgICAgfVxuICAgICAgci5zID0gKGM8MCk/LTE6MDtcbiAgICAgIGlmKGMgPiAwKSByW2krK10gPSBjO1xuICAgICAgZWxzZSBpZihjIDwgLTEpIHJbaSsrXSA9IHRoaXMuRFYrYztcbiAgICAgIHIudCA9IGk7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpcyArIGFcbiAgICBmdW5jdGlvbiBibkFkZChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYWRkVG8oYSxyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgLSBhXG4gICAgZnVuY3Rpb24gYm5TdWJ0cmFjdChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuc3ViVG8oYSxyKTsgcmV0dXJuIHI7IH1cblxuICAgIC8vIChwdWJsaWMpIHRoaXMgKiBhXG4gICAgZnVuY3Rpb24gYm5NdWx0aXBseShhKSB7IHZhciByID0gbmJpKCk7IHRoaXMubXVsdGlwbHlUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4gICAgLy8gKHB1YmxpYykgdGhpc14yXG4gICAgZnVuY3Rpb24gYm5TcXVhcmUoKSB7IHZhciByID0gbmJpKCk7IHRoaXMuc3F1YXJlVG8ocik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzIC8gYVxuICAgIGZ1bmN0aW9uIGJuRGl2aWRlKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5kaXZSZW1UbyhhLHIsbnVsbCk7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSB0aGlzICUgYVxuICAgIGZ1bmN0aW9uIGJuUmVtYWluZGVyKGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5kaXZSZW1UbyhhLG51bGwscik7IHJldHVybiByOyB9XG5cbiAgICAvLyAocHVibGljKSBbdGhpcy9hLHRoaXMlYV1cbiAgICBmdW5jdGlvbiBibkRpdmlkZUFuZFJlbWFpbmRlcihhKSB7XG4gICAgICB2YXIgcSA9IG5iaSgpLCByID0gbmJpKCk7XG4gICAgICB0aGlzLmRpdlJlbVRvKGEscSxyKTtcbiAgICAgIHJldHVybiBuZXcgQXJyYXkocSxyKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0aGlzICo9IG4sIHRoaXMgPj0gMCwgMSA8IG4gPCBEVlxuICAgIGZ1bmN0aW9uIGJucERNdWx0aXBseShuKSB7XG4gICAgICB0aGlzW3RoaXMudF0gPSB0aGlzLmFtKDAsbi0xLHRoaXMsMCwwLHRoaXMudCk7XG4gICAgICArK3RoaXMudDtcbiAgICAgIHRoaXMuY2xhbXAoKTtcbiAgICB9XG5cbiAgICAvLyAocHJvdGVjdGVkKSB0aGlzICs9IG4gPDwgdyB3b3JkcywgdGhpcyA+PSAwXG4gICAgZnVuY3Rpb24gYm5wREFkZE9mZnNldChuLHcpIHtcbiAgICAgIGlmKG4gPT0gMCkgcmV0dXJuO1xuICAgICAgd2hpbGUodGhpcy50IDw9IHcpIHRoaXNbdGhpcy50KytdID0gMDtcbiAgICAgIHRoaXNbd10gKz0gbjtcbiAgICAgIHdoaWxlKHRoaXNbd10gPj0gdGhpcy5EVikge1xuICAgICAgICB0aGlzW3ddIC09IHRoaXMuRFY7XG4gICAgICAgIGlmKCsrdyA+PSB0aGlzLnQpIHRoaXNbdGhpcy50KytdID0gMDtcbiAgICAgICAgKyt0aGlzW3ddO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEEgXCJudWxsXCIgcmVkdWNlclxuICAgIGZ1bmN0aW9uIE51bGxFeHAoKSB7fVxuICAgIGZ1bmN0aW9uIG5Ob3AoeCkgeyByZXR1cm4geDsgfVxuICAgIGZ1bmN0aW9uIG5NdWxUbyh4LHkscikgeyB4Lm11bHRpcGx5VG8oeSxyKTsgfVxuICAgIGZ1bmN0aW9uIG5TcXJUbyh4LHIpIHsgeC5zcXVhcmVUbyhyKTsgfVxuXG4gICAgTnVsbEV4cC5wcm90b3R5cGUuY29udmVydCA9IG5Ob3A7XG4gICAgTnVsbEV4cC5wcm90b3R5cGUucmV2ZXJ0ID0gbk5vcDtcbiAgICBOdWxsRXhwLnByb3RvdHlwZS5tdWxUbyA9IG5NdWxUbztcbiAgICBOdWxsRXhwLnByb3RvdHlwZS5zcXJUbyA9IG5TcXJUbztcblxuICAgIC8vIChwdWJsaWMpIHRoaXNeZVxuICAgIGZ1bmN0aW9uIGJuUG93KGUpIHsgcmV0dXJuIHRoaXMuZXhwKGUsbmV3IE51bGxFeHAoKSk7IH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHIgPSBsb3dlciBuIHdvcmRzIG9mIFwidGhpcyAqIGFcIiwgYS50IDw9IG5cbiAgICAvLyBcInRoaXNcIiBzaG91bGQgYmUgdGhlIGxhcmdlciBvbmUgaWYgYXBwcm9wcmlhdGUuXG4gICAgZnVuY3Rpb24gYm5wTXVsdGlwbHlMb3dlclRvKGEsbixyKSB7XG4gICAgICB2YXIgaSA9IE1hdGgubWluKHRoaXMudCthLnQsbik7XG4gICAgICByLnMgPSAwOyAvLyBhc3N1bWVzIGEsdGhpcyA+PSAwXG4gICAgICByLnQgPSBpO1xuICAgICAgd2hpbGUoaSA+IDApIHJbLS1pXSA9IDA7XG4gICAgICB2YXIgajtcbiAgICAgIGZvcihqID0gci50LXRoaXMudDsgaSA8IGo7ICsraSkgcltpK3RoaXMudF0gPSB0aGlzLmFtKDAsYVtpXSxyLGksMCx0aGlzLnQpO1xuICAgICAgZm9yKGogPSBNYXRoLm1pbihhLnQsbik7IGkgPCBqOyArK2kpIHRoaXMuYW0oMCxhW2ldLHIsaSwwLG4taSk7XG4gICAgICByLmNsYW1wKCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgciA9IFwidGhpcyAqIGFcIiB3aXRob3V0IGxvd2VyIG4gd29yZHMsIG4gPiAwXG4gICAgLy8gXCJ0aGlzXCIgc2hvdWxkIGJlIHRoZSBsYXJnZXIgb25lIGlmIGFwcHJvcHJpYXRlLlxuICAgIGZ1bmN0aW9uIGJucE11bHRpcGx5VXBwZXJUbyhhLG4scikge1xuICAgICAgLS1uO1xuICAgICAgdmFyIGkgPSByLnQgPSB0aGlzLnQrYS50LW47XG4gICAgICByLnMgPSAwOyAvLyBhc3N1bWVzIGEsdGhpcyA+PSAwXG4gICAgICB3aGlsZSgtLWkgPj0gMCkgcltpXSA9IDA7XG4gICAgICBmb3IoaSA9IE1hdGgubWF4KG4tdGhpcy50LDApOyBpIDwgYS50OyArK2kpXG4gICAgICAgIHJbdGhpcy50K2ktbl0gPSB0aGlzLmFtKG4taSxhW2ldLHIsMCwwLHRoaXMudCtpLW4pO1xuICAgICAgci5jbGFtcCgpO1xuICAgICAgci5kclNoaWZ0VG8oMSxyKTtcbiAgICB9XG5cbiAgICAvLyBCYXJyZXR0IG1vZHVsYXIgcmVkdWN0aW9uXG4gICAgZnVuY3Rpb24gQmFycmV0dChtKSB7XG4gICAgICAvLyBzZXR1cCBCYXJyZXR0XG4gICAgICB0aGlzLnIyID0gbmJpKCk7XG4gICAgICB0aGlzLnEzID0gbmJpKCk7XG4gICAgICBCaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8oMiptLnQsdGhpcy5yMik7XG4gICAgICB0aGlzLm11ID0gdGhpcy5yMi5kaXZpZGUobSk7XG4gICAgICB0aGlzLm0gPSBtO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJhcnJldHRDb252ZXJ0KHgpIHtcbiAgICAgIGlmKHgucyA8IDAgfHwgeC50ID4gMip0aGlzLm0udCkgcmV0dXJuIHgubW9kKHRoaXMubSk7XG4gICAgICBlbHNlIGlmKHguY29tcGFyZVRvKHRoaXMubSkgPCAwKSByZXR1cm4geDtcbiAgICAgIGVsc2UgeyB2YXIgciA9IG5iaSgpOyB4LmNvcHlUbyhyKTsgdGhpcy5yZWR1Y2Uocik7IHJldHVybiByOyB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYmFycmV0dFJldmVydCh4KSB7IHJldHVybiB4OyB9XG5cbiAgICAvLyB4ID0geCBtb2QgbSAoSEFDIDE0LjQyKVxuICAgIGZ1bmN0aW9uIGJhcnJldHRSZWR1Y2UoeCkge1xuICAgICAgeC5kclNoaWZ0VG8odGhpcy5tLnQtMSx0aGlzLnIyKTtcbiAgICAgIGlmKHgudCA+IHRoaXMubS50KzEpIHsgeC50ID0gdGhpcy5tLnQrMTsgeC5jbGFtcCgpOyB9XG4gICAgICB0aGlzLm11Lm11bHRpcGx5VXBwZXJUbyh0aGlzLnIyLHRoaXMubS50KzEsdGhpcy5xMyk7XG4gICAgICB0aGlzLm0ubXVsdGlwbHlMb3dlclRvKHRoaXMucTMsdGhpcy5tLnQrMSx0aGlzLnIyKTtcbiAgICAgIHdoaWxlKHguY29tcGFyZVRvKHRoaXMucjIpIDwgMCkgeC5kQWRkT2Zmc2V0KDEsdGhpcy5tLnQrMSk7XG4gICAgICB4LnN1YlRvKHRoaXMucjIseCk7XG4gICAgICB3aGlsZSh4LmNvbXBhcmVUbyh0aGlzLm0pID49IDApIHguc3ViVG8odGhpcy5tLHgpO1xuICAgIH1cblxuICAgIC8vIHIgPSB4XjIgbW9kIG07IHggIT0gclxuICAgIGZ1bmN0aW9uIGJhcnJldHRTcXJUbyh4LHIpIHsgeC5zcXVhcmVUbyhyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuICAgIC8vIHIgPSB4KnkgbW9kIG07IHgseSAhPSByXG4gICAgZnVuY3Rpb24gYmFycmV0dE11bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG4gICAgQmFycmV0dC5wcm90b3R5cGUuY29udmVydCA9IGJhcnJldHRDb252ZXJ0O1xuICAgIEJhcnJldHQucHJvdG90eXBlLnJldmVydCA9IGJhcnJldHRSZXZlcnQ7XG4gICAgQmFycmV0dC5wcm90b3R5cGUucmVkdWNlID0gYmFycmV0dFJlZHVjZTtcbiAgICBCYXJyZXR0LnByb3RvdHlwZS5tdWxUbyA9IGJhcnJldHRNdWxUbztcbiAgICBCYXJyZXR0LnByb3RvdHlwZS5zcXJUbyA9IGJhcnJldHRTcXJUbztcblxuICAgIC8vIChwdWJsaWMpIHRoaXNeZSAlIG0gKEhBQyAxNC44NSlcbiAgICBmdW5jdGlvbiBibk1vZFBvdyhlLG0pIHtcbiAgICAgIHZhciBpID0gZS5iaXRMZW5ndGgoKSwgaywgciA9IG5idigxKSwgejtcbiAgICAgIGlmKGkgPD0gMCkgcmV0dXJuIHI7XG4gICAgICBlbHNlIGlmKGkgPCAxOCkgayA9IDE7XG4gICAgICBlbHNlIGlmKGkgPCA0OCkgayA9IDM7XG4gICAgICBlbHNlIGlmKGkgPCAxNDQpIGsgPSA0O1xuICAgICAgZWxzZSBpZihpIDwgNzY4KSBrID0gNTtcbiAgICAgIGVsc2UgayA9IDY7XG4gICAgICBpZihpIDwgOClcbiAgICAgICAgeiA9IG5ldyBDbGFzc2ljKG0pO1xuICAgICAgZWxzZSBpZihtLmlzRXZlbigpKVxuICAgICAgICB6ID0gbmV3IEJhcnJldHQobSk7XG4gICAgICBlbHNlXG4gICAgICAgIHogPSBuZXcgTW9udGdvbWVyeShtKTtcblxuICAgICAgLy8gcHJlY29tcHV0YXRpb25cbiAgICAgIHZhciBnID0gbmV3IEFycmF5KCksIG4gPSAzLCBrMSA9IGstMSwga20gPSAoMTw8ayktMTtcbiAgICAgIGdbMV0gPSB6LmNvbnZlcnQodGhpcyk7XG4gICAgICBpZihrID4gMSkge1xuICAgICAgICB2YXIgZzIgPSBuYmkoKTtcbiAgICAgICAgei5zcXJUbyhnWzFdLGcyKTtcbiAgICAgICAgd2hpbGUobiA8PSBrbSkge1xuICAgICAgICAgIGdbbl0gPSBuYmkoKTtcbiAgICAgICAgICB6Lm11bFRvKGcyLGdbbi0yXSxnW25dKTtcbiAgICAgICAgICBuICs9IDI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGogPSBlLnQtMSwgdywgaXMxID0gdHJ1ZSwgcjIgPSBuYmkoKSwgdDtcbiAgICAgIGkgPSBuYml0cyhlW2pdKS0xO1xuICAgICAgd2hpbGUoaiA+PSAwKSB7XG4gICAgICAgIGlmKGkgPj0gazEpIHcgPSAoZVtqXT4+KGktazEpKSZrbTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdyA9IChlW2pdJigoMTw8KGkrMSkpLTEpKTw8KGsxLWkpO1xuICAgICAgICAgIGlmKGogPiAwKSB3IHw9IGVbai0xXT4+KHRoaXMuREIraS1rMSk7XG4gICAgICAgIH1cblxuICAgICAgICBuID0gaztcbiAgICAgICAgd2hpbGUoKHcmMSkgPT0gMCkgeyB3ID4+PSAxOyAtLW47IH1cbiAgICAgICAgaWYoKGkgLT0gbikgPCAwKSB7IGkgKz0gdGhpcy5EQjsgLS1qOyB9XG4gICAgICAgIGlmKGlzMSkgeyAgICAvLyByZXQgPT0gMSwgZG9uJ3QgYm90aGVyIHNxdWFyaW5nIG9yIG11bHRpcGx5aW5nIGl0XG4gICAgICAgICAgZ1t3XS5jb3B5VG8ocik7XG4gICAgICAgICAgaXMxID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgd2hpbGUobiA+IDEpIHsgei5zcXJUbyhyLHIyKTsgei5zcXJUbyhyMixyKTsgbiAtPSAyOyB9XG4gICAgICAgICAgaWYobiA+IDApIHouc3FyVG8ocixyMik7IGVsc2UgeyB0ID0gcjsgciA9IHIyOyByMiA9IHQ7IH1cbiAgICAgICAgICB6Lm11bFRvKHIyLGdbd10scik7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZShqID49IDAgJiYgKGVbal0mKDE8PGkpKSA9PSAwKSB7XG4gICAgICAgICAgei5zcXJUbyhyLHIyKTsgdCA9IHI7IHIgPSByMjsgcjIgPSB0O1xuICAgICAgICAgIGlmKC0taSA8IDApIHsgaSA9IHRoaXMuREItMTsgLS1qOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB6LnJldmVydChyKTtcbiAgICB9XG5cbiAgICAvLyAocHVibGljKSBnY2QodGhpcyxhKSAoSEFDIDE0LjU0KVxuICAgIGZ1bmN0aW9uIGJuR0NEKGEpIHtcbiAgICAgIHZhciB4ID0gKHRoaXMuczwwKT90aGlzLm5lZ2F0ZSgpOnRoaXMuY2xvbmUoKTtcbiAgICAgIHZhciB5ID0gKGEuczwwKT9hLm5lZ2F0ZSgpOmEuY2xvbmUoKTtcbiAgICAgIGlmKHguY29tcGFyZVRvKHkpIDwgMCkgeyB2YXIgdCA9IHg7IHggPSB5OyB5ID0gdDsgfVxuICAgICAgdmFyIGkgPSB4LmdldExvd2VzdFNldEJpdCgpLCBnID0geS5nZXRMb3dlc3RTZXRCaXQoKTtcbiAgICAgIGlmKGcgPCAwKSByZXR1cm4geDtcbiAgICAgIGlmKGkgPCBnKSBnID0gaTtcbiAgICAgIGlmKGcgPiAwKSB7XG4gICAgICAgIHguclNoaWZ0VG8oZyx4KTtcbiAgICAgICAgeS5yU2hpZnRUbyhnLHkpO1xuICAgICAgfVxuICAgICAgd2hpbGUoeC5zaWdudW0oKSA+IDApIHtcbiAgICAgICAgaWYoKGkgPSB4LmdldExvd2VzdFNldEJpdCgpKSA+IDApIHguclNoaWZ0VG8oaSx4KTtcbiAgICAgICAgaWYoKGkgPSB5LmdldExvd2VzdFNldEJpdCgpKSA+IDApIHkuclNoaWZ0VG8oaSx5KTtcbiAgICAgICAgaWYoeC5jb21wYXJlVG8oeSkgPj0gMCkge1xuICAgICAgICAgIHguc3ViVG8oeSx4KTtcbiAgICAgICAgICB4LnJTaGlmdFRvKDEseCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgeS5zdWJUbyh4LHkpO1xuICAgICAgICAgIHkuclNoaWZ0VG8oMSx5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYoZyA+IDApIHkubFNoaWZ0VG8oZyx5KTtcbiAgICAgIHJldHVybiB5O1xuICAgIH1cblxuICAgIC8vIChwcm90ZWN0ZWQpIHRoaXMgJSBuLCBuIDwgMl4yNlxuICAgIGZ1bmN0aW9uIGJucE1vZEludChuKSB7XG4gICAgICBpZihuIDw9IDApIHJldHVybiAwO1xuICAgICAgdmFyIGQgPSB0aGlzLkRWJW4sIHIgPSAodGhpcy5zPDApP24tMTowO1xuICAgICAgaWYodGhpcy50ID4gMClcbiAgICAgICAgaWYoZCA9PSAwKSByID0gdGhpc1swXSVuO1xuICAgICAgICBlbHNlIGZvcih2YXIgaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkgciA9IChkKnIrdGhpc1tpXSklbjtcbiAgICAgIHJldHVybiByO1xuICAgIH1cblxuICAgIC8vIChwdWJsaWMpIDEvdGhpcyAlIG0gKEhBQyAxNC42MSlcbiAgICBmdW5jdGlvbiBibk1vZEludmVyc2UobSkge1xuICAgICAgdmFyIGFjID0gbS5pc0V2ZW4oKTtcbiAgICAgIGlmKCh0aGlzLmlzRXZlbigpICYmIGFjKSB8fCBtLnNpZ251bSgpID09IDApIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87XG4gICAgICB2YXIgdSA9IG0uY2xvbmUoKSwgdiA9IHRoaXMuY2xvbmUoKTtcbiAgICAgIHZhciBhID0gbmJ2KDEpLCBiID0gbmJ2KDApLCBjID0gbmJ2KDApLCBkID0gbmJ2KDEpO1xuICAgICAgd2hpbGUodS5zaWdudW0oKSAhPSAwKSB7XG4gICAgICAgIHdoaWxlKHUuaXNFdmVuKCkpIHtcbiAgICAgICAgICB1LnJTaGlmdFRvKDEsdSk7XG4gICAgICAgICAgaWYoYWMpIHtcbiAgICAgICAgICAgIGlmKCFhLmlzRXZlbigpIHx8ICFiLmlzRXZlbigpKSB7IGEuYWRkVG8odGhpcyxhKTsgYi5zdWJUbyhtLGIpOyB9XG4gICAgICAgICAgICBhLnJTaGlmdFRvKDEsYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYoIWIuaXNFdmVuKCkpIGIuc3ViVG8obSxiKTtcbiAgICAgICAgICBiLnJTaGlmdFRvKDEsYik7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUodi5pc0V2ZW4oKSkge1xuICAgICAgICAgIHYuclNoaWZ0VG8oMSx2KTtcbiAgICAgICAgICBpZihhYykge1xuICAgICAgICAgICAgaWYoIWMuaXNFdmVuKCkgfHwgIWQuaXNFdmVuKCkpIHsgYy5hZGRUbyh0aGlzLGMpOyBkLnN1YlRvKG0sZCk7IH1cbiAgICAgICAgICAgIGMuclNoaWZ0VG8oMSxjKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZighZC5pc0V2ZW4oKSkgZC5zdWJUbyhtLGQpO1xuICAgICAgICAgIGQuclNoaWZ0VG8oMSxkKTtcbiAgICAgICAgfVxuICAgICAgICBpZih1LmNvbXBhcmVUbyh2KSA+PSAwKSB7XG4gICAgICAgICAgdS5zdWJUbyh2LHUpO1xuICAgICAgICAgIGlmKGFjKSBhLnN1YlRvKGMsYSk7XG4gICAgICAgICAgYi5zdWJUbyhkLGIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHYuc3ViVG8odSx2KTtcbiAgICAgICAgICBpZihhYykgYy5zdWJUbyhhLGMpO1xuICAgICAgICAgIGQuc3ViVG8oYixkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYodi5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpICE9IDApIHJldHVybiBCaWdJbnRlZ2VyLlpFUk87XG4gICAgICBpZihkLmNvbXBhcmVUbyhtKSA+PSAwKSByZXR1cm4gZC5zdWJ0cmFjdChtKTtcbiAgICAgIGlmKGQuc2lnbnVtKCkgPCAwKSBkLmFkZFRvKG0sZCk7IGVsc2UgcmV0dXJuIGQ7XG4gICAgICBpZihkLnNpZ251bSgpIDwgMCkgcmV0dXJuIGQuYWRkKG0pOyBlbHNlIHJldHVybiBkO1xuICAgIH1cblxuICAgIHZhciBsb3dwcmltZXMgPSBbMiwzLDUsNywxMSwxMywxNywxOSwyMywyOSwzMSwzNyw0MSw0Myw0Nyw1Myw1OSw2MSw2Nyw3MSw3Myw3OSw4Myw4OSw5NywxMDEsMTAzLDEwNywxMDksMTEzLDEyNywxMzEsMTM3LDEzOSwxNDksMTUxLDE1NywxNjMsMTY3LDE3MywxNzksMTgxLDE5MSwxOTMsMTk3LDE5OSwyMTEsMjIzLDIyNywyMjksMjMzLDIzOSwyNDEsMjUxLDI1NywyNjMsMjY5LDI3MSwyNzcsMjgxLDI4MywyOTMsMzA3LDMxMSwzMTMsMzE3LDMzMSwzMzcsMzQ3LDM0OSwzNTMsMzU5LDM2NywzNzMsMzc5LDM4MywzODksMzk3LDQwMSw0MDksNDE5LDQyMSw0MzEsNDMzLDQzOSw0NDMsNDQ5LDQ1Nyw0NjEsNDYzLDQ2Nyw0NzksNDg3LDQ5MSw0OTksNTAzLDUwOSw1MjEsNTIzLDU0MSw1NDcsNTU3LDU2Myw1NjksNTcxLDU3Nyw1ODcsNTkzLDU5OSw2MDEsNjA3LDYxMyw2MTcsNjE5LDYzMSw2NDEsNjQzLDY0Nyw2NTMsNjU5LDY2MSw2NzMsNjc3LDY4Myw2OTEsNzAxLDcwOSw3MTksNzI3LDczMyw3MzksNzQzLDc1MSw3NTcsNzYxLDc2OSw3NzMsNzg3LDc5Nyw4MDksODExLDgyMSw4MjMsODI3LDgyOSw4MzksODUzLDg1Nyw4NTksODYzLDg3Nyw4ODEsODgzLDg4Nyw5MDcsOTExLDkxOSw5MjksOTM3LDk0MSw5NDcsOTUzLDk2Nyw5NzEsOTc3LDk4Myw5OTEsOTk3XTtcbiAgICB2YXIgbHBsaW0gPSAoMTw8MjYpL2xvd3ByaW1lc1tsb3dwcmltZXMubGVuZ3RoLTFdO1xuXG4gICAgLy8gKHB1YmxpYykgdGVzdCBwcmltYWxpdHkgd2l0aCBjZXJ0YWludHkgPj0gMS0uNV50XG4gICAgZnVuY3Rpb24gYm5Jc1Byb2JhYmxlUHJpbWUodCkge1xuICAgICAgdmFyIGksIHggPSB0aGlzLmFicygpO1xuICAgICAgaWYoeC50ID09IDEgJiYgeFswXSA8PSBsb3dwcmltZXNbbG93cHJpbWVzLmxlbmd0aC0xXSkge1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBsb3dwcmltZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgaWYoeFswXSA9PSBsb3dwcmltZXNbaV0pIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZih4LmlzRXZlbigpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpID0gMTtcbiAgICAgIHdoaWxlKGkgPCBsb3dwcmltZXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBtID0gbG93cHJpbWVzW2ldLCBqID0gaSsxO1xuICAgICAgICB3aGlsZShqIDwgbG93cHJpbWVzLmxlbmd0aCAmJiBtIDwgbHBsaW0pIG0gKj0gbG93cHJpbWVzW2orK107XG4gICAgICAgIG0gPSB4Lm1vZEludChtKTtcbiAgICAgICAgd2hpbGUoaSA8IGopIGlmKG0lbG93cHJpbWVzW2krK10gPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHgubWlsbGVyUmFiaW4odCk7XG4gICAgfVxuXG4gICAgLy8gKHByb3RlY3RlZCkgdHJ1ZSBpZiBwcm9iYWJseSBwcmltZSAoSEFDIDQuMjQsIE1pbGxlci1SYWJpbilcbiAgICBmdW5jdGlvbiBibnBNaWxsZXJSYWJpbih0KSB7XG4gICAgICB2YXIgbjEgPSB0aGlzLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTtcbiAgICAgIHZhciBrID0gbjEuZ2V0TG93ZXN0U2V0Qml0KCk7XG4gICAgICBpZihrIDw9IDApIHJldHVybiBmYWxzZTtcbiAgICAgIHZhciByID0gbjEuc2hpZnRSaWdodChrKTtcbiAgICAgIHQgPSAodCsxKT4+MTtcbiAgICAgIGlmKHQgPiBsb3dwcmltZXMubGVuZ3RoKSB0ID0gbG93cHJpbWVzLmxlbmd0aDtcbiAgICAgIHZhciBhID0gbmJpKCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdDsgKytpKSB7XG4gICAgICAgIC8vUGljayBiYXNlcyBhdCByYW5kb20sIGluc3RlYWQgb2Ygc3RhcnRpbmcgYXQgMlxuICAgICAgICBhLmZyb21JbnQobG93cHJpbWVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpsb3dwcmltZXMubGVuZ3RoKV0pO1xuICAgICAgICB2YXIgeSA9IGEubW9kUG93KHIsdGhpcyk7XG4gICAgICAgIGlmKHkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSAhPSAwICYmIHkuY29tcGFyZVRvKG4xKSAhPSAwKSB7XG4gICAgICAgICAgdmFyIGogPSAxO1xuICAgICAgICAgIHdoaWxlKGorKyA8IGsgJiYgeS5jb21wYXJlVG8objEpICE9IDApIHtcbiAgICAgICAgICAgIHkgPSB5Lm1vZFBvd0ludCgyLHRoaXMpO1xuICAgICAgICAgICAgaWYoeS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoeS5jb21wYXJlVG8objEpICE9IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gcHJvdGVjdGVkXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2h1bmtTaXplID0gYm5wQ2h1bmtTaXplO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnRvUmFkaXggPSBibnBUb1JhZGl4O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21SYWRpeCA9IGJucEZyb21SYWRpeDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mcm9tTnVtYmVyID0gYm5wRnJvbU51bWJlcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXR3aXNlVG8gPSBibnBCaXR3aXNlVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuY2hhbmdlQml0ID0gYm5wQ2hhbmdlQml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFkZFRvID0gYm5wQWRkVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZE11bHRpcGx5ID0gYm5wRE11bHRpcGx5O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmRBZGRPZmZzZXQgPSBibnBEQWRkT2Zmc2V0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm11bHRpcGx5TG93ZXJUbyA9IGJucE11bHRpcGx5TG93ZXJUbztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVVwcGVyVG8gPSBibnBNdWx0aXBseVVwcGVyVG87XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW50ID0gYm5wTW9kSW50O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1pbGxlclJhYmluID0gYm5wTWlsbGVyUmFiaW47XG5cbiAgICAvLyBwdWJsaWNcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5jbG9uZSA9IGJuQ2xvbmU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuaW50VmFsdWUgPSBibkludFZhbHVlO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJ5dGVWYWx1ZSA9IGJuQnl0ZVZhbHVlO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNob3J0VmFsdWUgPSBiblNob3J0VmFsdWU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc2lnbnVtID0gYm5TaWdOdW07XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUudG9CeXRlQXJyYXkgPSBiblRvQnl0ZUFycmF5O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmVxdWFscyA9IGJuRXF1YWxzO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1pbiA9IGJuTWluO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm1heCA9IGJuTWF4O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFuZCA9IGJuQW5kO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLm9yID0gYm5PcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS54b3IgPSBiblhvcjtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmROb3QgPSBibkFuZE5vdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5ub3QgPSBibk5vdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdExlZnQgPSBiblNoaWZ0TGVmdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5zaGlmdFJpZ2h0ID0gYm5TaGlmdFJpZ2h0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmdldExvd2VzdFNldEJpdCA9IGJuR2V0TG93ZXN0U2V0Qml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmJpdENvdW50ID0gYm5CaXRDb3VudDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS50ZXN0Qml0ID0gYm5UZXN0Qml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnNldEJpdCA9IGJuU2V0Qml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmNsZWFyQml0ID0gYm5DbGVhckJpdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5mbGlwQml0ID0gYm5GbGlwQml0O1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFkZCA9IGJuQWRkO1xuICAgIEJpZ0ludGVnZXIucHJvdG90eXBlLnN1YnRyYWN0ID0gYm5TdWJ0cmFjdDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseSA9IGJuTXVsdGlwbHk7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlID0gYm5EaXZpZGU7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUucmVtYWluZGVyID0gYm5SZW1haW5kZXI7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlQW5kUmVtYWluZGVyID0gYm5EaXZpZGVBbmRSZW1haW5kZXI7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93ID0gYm5Nb2RQb3c7XG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUubW9kSW52ZXJzZSA9IGJuTW9kSW52ZXJzZTtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5wb3cgPSBiblBvdztcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5nY2QgPSBibkdDRDtcbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5pc1Byb2JhYmxlUHJpbWUgPSBibklzUHJvYmFibGVQcmltZTtcblxuICAgIC8vIEpTQk4tc3BlY2lmaWMgZXh0ZW5zaW9uXG4gICAgQmlnSW50ZWdlci5wcm90b3R5cGUuc3F1YXJlID0gYm5TcXVhcmU7XG5cbiAgICAvLyBFeHBvc2UgdGhlIEJhcnJldHQgZnVuY3Rpb25cbiAgICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5CYXJyZXR0ID0gQmFycmV0dFxuXG4gICAgLy8gQmlnSW50ZWdlciBpbnRlcmZhY2VzIG5vdCBpbXBsZW1lbnRlZCBpbiBqc2JuOlxuXG4gICAgLy8gQmlnSW50ZWdlcihpbnQgc2lnbnVtLCBieXRlW10gbWFnbml0dWRlKVxuICAgIC8vIGRvdWJsZSBkb3VibGVWYWx1ZSgpXG4gICAgLy8gZmxvYXQgZmxvYXRWYWx1ZSgpXG4gICAgLy8gaW50IGhhc2hDb2RlKClcbiAgICAvLyBsb25nIGxvbmdWYWx1ZSgpXG4gICAgLy8gc3RhdGljIEJpZ0ludGVnZXIgdmFsdWVPZihsb25nIHZhbClcblxuICAgIC8vIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIC0gcmVxdWlyZXMgYSBQUk5HIGJhY2tlbmQsIGUuZy4gcHJuZzQuanNcblxuICAgIC8vIEZvciBiZXN0IHJlc3VsdHMsIHB1dCBjb2RlIGxpa2VcbiAgICAvLyA8Ym9keSBvbkNsaWNrPSdybmdfc2VlZF90aW1lKCk7JyBvbktleVByZXNzPSdybmdfc2VlZF90aW1lKCk7Jz5cbiAgICAvLyBpbiB5b3VyIG1haW4gSFRNTCBkb2N1bWVudC5cblxuICAgIHZhciBybmdfc3RhdGU7XG4gICAgdmFyIHJuZ19wb29sO1xuICAgIHZhciBybmdfcHB0cjtcblxuICAgIC8vIE1peCBpbiBhIDMyLWJpdCBpbnRlZ2VyIGludG8gdGhlIHBvb2xcbiAgICBmdW5jdGlvbiBybmdfc2VlZF9pbnQoeCkge1xuICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gXj0geCAmIDI1NTtcbiAgICAgIHJuZ19wb29sW3JuZ19wcHRyKytdIF49ICh4ID4+IDgpICYgMjU1O1xuICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gXj0gKHggPj4gMTYpICYgMjU1O1xuICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gXj0gKHggPj4gMjQpICYgMjU1O1xuICAgICAgaWYocm5nX3BwdHIgPj0gcm5nX3BzaXplKSBybmdfcHB0ciAtPSBybmdfcHNpemU7XG4gICAgfVxuXG4gICAgLy8gTWl4IGluIHRoZSBjdXJyZW50IHRpbWUgKHcvbWlsbGlzZWNvbmRzKSBpbnRvIHRoZSBwb29sXG4gICAgZnVuY3Rpb24gcm5nX3NlZWRfdGltZSgpIHtcbiAgICAgIHJuZ19zZWVkX2ludChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgcG9vbCB3aXRoIGp1bmsgaWYgbmVlZGVkLlxuICAgIGlmKHJuZ19wb29sID09IG51bGwpIHtcbiAgICAgIHJuZ19wb29sID0gbmV3IEFycmF5KCk7XG4gICAgICBybmdfcHB0ciA9IDA7XG4gICAgICB2YXIgdDtcbiAgICAgIGlmKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmNyeXB0bykge1xuICAgICAgICBpZiAod2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgICAgICAvLyBVc2Ugd2ViY3J5cHRvIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHZhciB1YSA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICAgICAgICB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyh1YSk7XG4gICAgICAgICAgZm9yKHQgPSAwOyB0IDwgMzI7ICsrdClcbiAgICAgICAgICAgIHJuZ19wb29sW3JuZ19wcHRyKytdID0gdWFbdF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihuYXZpZ2F0b3IuYXBwTmFtZSA9PSBcIk5ldHNjYXBlXCIgJiYgbmF2aWdhdG9yLmFwcFZlcnNpb24gPCBcIjVcIikge1xuICAgICAgICAgIC8vIEV4dHJhY3QgZW50cm9weSAoMjU2IGJpdHMpIGZyb20gTlM0IFJORyBpZiBhdmFpbGFibGVcbiAgICAgICAgICB2YXIgeiA9IHdpbmRvdy5jcnlwdG8ucmFuZG9tKDMyKTtcbiAgICAgICAgICBmb3IodCA9IDA7IHQgPCB6Lmxlbmd0aDsgKyt0KVxuICAgICAgICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gPSB6LmNoYXJDb2RlQXQodCkgJiAyNTU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlKHJuZ19wcHRyIDwgcm5nX3BzaXplKSB7ICAvLyBleHRyYWN0IHNvbWUgcmFuZG9tbmVzcyBmcm9tIE1hdGgucmFuZG9tKClcbiAgICAgICAgdCA9IE1hdGguZmxvb3IoNjU1MzYgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgcm5nX3Bvb2xbcm5nX3BwdHIrK10gPSB0ID4+PiA4O1xuICAgICAgICBybmdfcG9vbFtybmdfcHB0cisrXSA9IHQgJiAyNTU7XG4gICAgICB9XG4gICAgICBybmdfcHB0ciA9IDA7XG4gICAgICBybmdfc2VlZF90aW1lKCk7XG4gICAgICAvL3JuZ19zZWVkX2ludCh3aW5kb3cuc2NyZWVuWCk7XG4gICAgICAvL3JuZ19zZWVkX2ludCh3aW5kb3cuc2NyZWVuWSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcm5nX2dldF9ieXRlKCkge1xuICAgICAgaWYocm5nX3N0YXRlID09IG51bGwpIHtcbiAgICAgICAgcm5nX3NlZWRfdGltZSgpO1xuICAgICAgICBybmdfc3RhdGUgPSBwcm5nX25ld3N0YXRlKCk7XG4gICAgICAgIHJuZ19zdGF0ZS5pbml0KHJuZ19wb29sKTtcbiAgICAgICAgZm9yKHJuZ19wcHRyID0gMDsgcm5nX3BwdHIgPCBybmdfcG9vbC5sZW5ndGg7ICsrcm5nX3BwdHIpXG4gICAgICAgICAgcm5nX3Bvb2xbcm5nX3BwdHJdID0gMDtcbiAgICAgICAgcm5nX3BwdHIgPSAwO1xuICAgICAgICAvL3JuZ19wb29sID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IGFsbG93IHJlc2VlZGluZyBhZnRlciBmaXJzdCByZXF1ZXN0XG4gICAgICByZXR1cm4gcm5nX3N0YXRlLm5leHQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBybmdfZ2V0X2J5dGVzKGJhKSB7XG4gICAgICB2YXIgaTtcbiAgICAgIGZvcihpID0gMDsgaSA8IGJhLmxlbmd0aDsgKytpKSBiYVtpXSA9IHJuZ19nZXRfYnl0ZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFNlY3VyZVJhbmRvbSgpIHt9XG5cbiAgICBTZWN1cmVSYW5kb20ucHJvdG90eXBlLm5leHRCeXRlcyA9IHJuZ19nZXRfYnl0ZXM7XG5cbiAgICAvLyBwcm5nNC5qcyAtIHVzZXMgQXJjZm91ciBhcyBhIFBSTkdcblxuICAgIGZ1bmN0aW9uIEFyY2ZvdXIoKSB7XG4gICAgICB0aGlzLmkgPSAwO1xuICAgICAgdGhpcy5qID0gMDtcbiAgICAgIHRoaXMuUyA9IG5ldyBBcnJheSgpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgYXJjZm91ciBjb250ZXh0IGZyb20ga2V5LCBhbiBhcnJheSBvZiBpbnRzLCBlYWNoIGZyb20gWzAuLjI1NV1cbiAgICBmdW5jdGlvbiBBUkM0aW5pdChrZXkpIHtcbiAgICAgIHZhciBpLCBqLCB0O1xuICAgICAgZm9yKGkgPSAwOyBpIDwgMjU2OyArK2kpXG4gICAgICAgIHRoaXMuU1tpXSA9IGk7XG4gICAgICBqID0gMDtcbiAgICAgIGZvcihpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gICAgICAgIGogPSAoaiArIHRoaXMuU1tpXSArIGtleVtpICUga2V5Lmxlbmd0aF0pICYgMjU1O1xuICAgICAgICB0ID0gdGhpcy5TW2ldO1xuICAgICAgICB0aGlzLlNbaV0gPSB0aGlzLlNbal07XG4gICAgICAgIHRoaXMuU1tqXSA9IHQ7XG4gICAgICB9XG4gICAgICB0aGlzLmkgPSAwO1xuICAgICAgdGhpcy5qID0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBBUkM0bmV4dCgpIHtcbiAgICAgIHZhciB0O1xuICAgICAgdGhpcy5pID0gKHRoaXMuaSArIDEpICYgMjU1O1xuICAgICAgdGhpcy5qID0gKHRoaXMuaiArIHRoaXMuU1t0aGlzLmldKSAmIDI1NTtcbiAgICAgIHQgPSB0aGlzLlNbdGhpcy5pXTtcbiAgICAgIHRoaXMuU1t0aGlzLmldID0gdGhpcy5TW3RoaXMual07XG4gICAgICB0aGlzLlNbdGhpcy5qXSA9IHQ7XG4gICAgICByZXR1cm4gdGhpcy5TWyh0ICsgdGhpcy5TW3RoaXMuaV0pICYgMjU1XTtcbiAgICB9XG5cbiAgICBBcmNmb3VyLnByb3RvdHlwZS5pbml0ID0gQVJDNGluaXQ7XG4gICAgQXJjZm91ci5wcm90b3R5cGUubmV4dCA9IEFSQzRuZXh0O1xuXG4gICAgLy8gUGx1ZyBpbiB5b3VyIFJORyBjb25zdHJ1Y3RvciBoZXJlXG4gICAgZnVuY3Rpb24gcHJuZ19uZXdzdGF0ZSgpIHtcbiAgICAgIHJldHVybiBuZXcgQXJjZm91cigpO1xuICAgIH1cblxuICAgIC8vIFBvb2wgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBhbmQgZ3JlYXRlciB0aGFuIDMyLlxuICAgIC8vIEFuIGFycmF5IG9mIGJ5dGVzIHRoZSBzaXplIG9mIHRoZSBwb29sIHdpbGwgYmUgcGFzc2VkIHRvIGluaXQoKVxuICAgIHZhciBybmdfcHNpemUgPSAyNTY7XG5cbiAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IEJpZ0ludGVnZXIsXG4gICAgICAgICAgICBCaWdJbnRlZ2VyOiBCaWdJbnRlZ2VyLFxuICAgICAgICAgICAgU2VjdXJlUmFuZG9tOiBTZWN1cmVSYW5kb20sXG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5qc2JuID0ge1xuICAgICAgICAgIEJpZ0ludGVnZXI6IEJpZ0ludGVnZXIsXG4gICAgICAgICAgU2VjdXJlUmFuZG9tOiBTZWN1cmVSYW5kb21cbiAgICAgICAgfTtcbiAgICB9XG5cbn0pLmNhbGwodGhpcyk7XG4iLCJsZXQgX2ZzXG50cnkge1xuICBfZnMgPSByZXF1aXJlKCdncmFjZWZ1bC1mcycpXG59IGNhdGNoIChfKSB7XG4gIF9mcyA9IHJlcXVpcmUoJ2ZzJylcbn1cbmNvbnN0IHVuaXZlcnNhbGlmeSA9IHJlcXVpcmUoJ3VuaXZlcnNhbGlmeScpXG5jb25zdCB7IHN0cmluZ2lmeSwgc3RyaXBCb20gfSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxuXG5hc3luYyBmdW5jdGlvbiBfcmVhZEZpbGUgKGZpbGUsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucyA9IHsgZW5jb2Rpbmc6IG9wdGlvbnMgfVxuICB9XG5cbiAgY29uc3QgZnMgPSBvcHRpb25zLmZzIHx8IF9mc1xuXG4gIGNvbnN0IHNob3VsZFRocm93ID0gJ3Rocm93cycgaW4gb3B0aW9ucyA/IG9wdGlvbnMudGhyb3dzIDogdHJ1ZVxuXG4gIGxldCBkYXRhID0gYXdhaXQgdW5pdmVyc2FsaWZ5LmZyb21DYWxsYmFjayhmcy5yZWFkRmlsZSkoZmlsZSwgb3B0aW9ucylcblxuICBkYXRhID0gc3RyaXBCb20oZGF0YSlcblxuICBsZXQgb2JqXG4gIHRyeSB7XG4gICAgb2JqID0gSlNPTi5wYXJzZShkYXRhLCBvcHRpb25zID8gb3B0aW9ucy5yZXZpdmVyIDogbnVsbClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGAke2ZpbGV9OiAke2Vyci5tZXNzYWdlfWBcbiAgICAgIHRocm93IGVyclxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuY29uc3QgcmVhZEZpbGUgPSB1bml2ZXJzYWxpZnkuZnJvbVByb21pc2UoX3JlYWRGaWxlKVxuXG5mdW5jdGlvbiByZWFkRmlsZVN5bmMgKGZpbGUsIG9wdGlvbnMgPSB7fSkge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucyA9IHsgZW5jb2Rpbmc6IG9wdGlvbnMgfVxuICB9XG5cbiAgY29uc3QgZnMgPSBvcHRpb25zLmZzIHx8IF9mc1xuXG4gIGNvbnN0IHNob3VsZFRocm93ID0gJ3Rocm93cycgaW4gb3B0aW9ucyA/IG9wdGlvbnMudGhyb3dzIDogdHJ1ZVxuXG4gIHRyeSB7XG4gICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZSwgb3B0aW9ucylcbiAgICBjb250ZW50ID0gc3RyaXBCb20oY29udGVudClcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50LCBvcHRpb25zLnJldml2ZXIpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChzaG91bGRUaHJvdykge1xuICAgICAgZXJyLm1lc3NhZ2UgPSBgJHtmaWxlfTogJHtlcnIubWVzc2FnZX1gXG4gICAgICB0aHJvdyBlcnJcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gX3dyaXRlRmlsZSAoZmlsZSwgb2JqLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgZnMgPSBvcHRpb25zLmZzIHx8IF9mc1xuXG4gIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShvYmosIG9wdGlvbnMpXG5cbiAgYXdhaXQgdW5pdmVyc2FsaWZ5LmZyb21DYWxsYmFjayhmcy53cml0ZUZpbGUpKGZpbGUsIHN0ciwgb3B0aW9ucylcbn1cblxuY29uc3Qgd3JpdGVGaWxlID0gdW5pdmVyc2FsaWZ5LmZyb21Qcm9taXNlKF93cml0ZUZpbGUpXG5cbmZ1bmN0aW9uIHdyaXRlRmlsZVN5bmMgKGZpbGUsIG9iaiwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGZzID0gb3B0aW9ucy5mcyB8fCBfZnNcblxuICBjb25zdCBzdHIgPSBzdHJpbmdpZnkob2JqLCBvcHRpb25zKVxuICAvLyBub3Qgc3VyZSBpZiBmcy53cml0ZUZpbGVTeW5jIHJldHVybnMgYW55dGhpbmcsIGJ1dCBqdXN0IGluIGNhc2VcbiAgcmV0dXJuIGZzLndyaXRlRmlsZVN5bmMoZmlsZSwgc3RyLCBvcHRpb25zKVxufVxuXG5jb25zdCBqc29uZmlsZSA9IHtcbiAgcmVhZEZpbGUsXG4gIHJlYWRGaWxlU3luYyxcbiAgd3JpdGVGaWxlLFxuICB3cml0ZUZpbGVTeW5jXG59XG5cbm1vZHVsZS5leHBvcnRzID0ganNvbmZpbGVcbiIsImZ1bmN0aW9uIHN0cmluZ2lmeSAob2JqLCB7IEVPTCA9ICdcXG4nLCBmaW5hbEVPTCA9IHRydWUsIHJlcGxhY2VyID0gbnVsbCwgc3BhY2VzIH0gPSB7fSkge1xuICBjb25zdCBFT0YgPSBmaW5hbEVPTCA/IEVPTCA6ICcnXG4gIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KG9iaiwgcmVwbGFjZXIsIHNwYWNlcylcblxuICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcbi9nLCBFT0wpICsgRU9GXG59XG5cbmZ1bmN0aW9uIHN0cmlwQm9tIChjb250ZW50KSB7XG4gIC8vIHdlIGRvIHRoaXMgYmVjYXVzZSBKU09OLnBhcnNlIHdvdWxkIGNvbnZlcnQgaXQgdG8gYSB1dGY4IHN0cmluZyBpZiBlbmNvZGluZyB3YXNuJ3Qgc3BlY2lmaWVkXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY29udGVudCkpIGNvbnRlbnQgPSBjb250ZW50LnRvU3RyaW5nKCd1dGY4JylcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7IHN0cmluZ2lmeSwgc3RyaXBCb20gfVxuIiwiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuMTIuN1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgTmV0bWFzaywgYXRvYiwgY2hyLCBjaHIwLCBjaHJBLCBjaHJhLCBpcDJsb25nLCBsb25nMmlwO1xuXG4gIGxvbmcyaXAgPSBmdW5jdGlvbihsb25nKSB7XG4gICAgdmFyIGEsIGIsIGMsIGQ7XG4gICAgYSA9IChsb25nICYgKDB4ZmYgPDwgMjQpKSA+Pj4gMjQ7XG4gICAgYiA9IChsb25nICYgKDB4ZmYgPDwgMTYpKSA+Pj4gMTY7XG4gICAgYyA9IChsb25nICYgKDB4ZmYgPDwgOCkpID4+PiA4O1xuICAgIGQgPSBsb25nICYgMHhmZjtcbiAgICByZXR1cm4gW2EsIGIsIGMsIGRdLmpvaW4oJy4nKTtcbiAgfTtcblxuICBpcDJsb25nID0gZnVuY3Rpb24oaXApIHtcbiAgICB2YXIgYiwgYywgaSwgaiwgbiwgcmVmO1xuICAgIGIgPSBbXTtcbiAgICBmb3IgKGkgPSBqID0gMDsgaiA8PSAzOyBpID0gKytqKSB7XG4gICAgICBpZiAoaXAubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGlmIChpcFswXSAhPT0gJy4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElQJyk7XG4gICAgICAgIH1cbiAgICAgICAgaXAgPSBpcC5zdWJzdHJpbmcoMSk7XG4gICAgICB9XG4gICAgICByZWYgPSBhdG9iKGlwKSwgbiA9IHJlZlswXSwgYyA9IHJlZlsxXTtcbiAgICAgIGlwID0gaXAuc3Vic3RyaW5nKGMpO1xuICAgICAgYi5wdXNoKG4pO1xuICAgIH1cbiAgICBpZiAoaXAubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVAnKTtcbiAgICB9XG4gICAgc3dpdGNoIChiLmxlbmd0aCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBpZiAoYlswXSA+IDB4RkZGRkZGRkYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYlswXSA+Pj4gMDtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaWYgKGJbMF0gPiAweEZGIHx8IGJbMV0gPiAweEZGRkZGRikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBJUCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYlswXSA8PCAyNCB8IGJbMV0pID4+PiAwO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBpZiAoYlswXSA+IDB4RkYgfHwgYlsxXSA+IDB4RkYgfHwgYlsyXSA+IDB4RkZGRikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBJUCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYlswXSA8PCAyNCB8IGJbMV0gPDwgMTYgfCBiWzJdKSA+Pj4gMDtcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgaWYgKGJbMF0gPiAweEZGIHx8IGJbMV0gPiAweEZGIHx8IGJbMl0gPiAweEZGIHx8IGJbM10gPiAweEZGKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElQJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChiWzBdIDw8IDI0IHwgYlsxXSA8PCAxNiB8IGJbMl0gPDwgOCB8IGJbM10pID4+PiAwO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElQJyk7XG4gICAgfVxuICB9O1xuXG4gIGNociA9IGZ1bmN0aW9uKGIpIHtcbiAgICByZXR1cm4gYi5jaGFyQ29kZUF0KDApO1xuICB9O1xuXG4gIGNocjAgPSBjaHIoJzAnKTtcblxuICBjaHJhID0gY2hyKCdhJyk7XG5cbiAgY2hyQSA9IGNocignQScpO1xuXG4gIGF0b2IgPSBmdW5jdGlvbihzKSB7XG4gICAgdmFyIGJhc2UsIGRtYXgsIGksIG4sIHN0YXJ0O1xuICAgIG4gPSAwO1xuICAgIGJhc2UgPSAxMDtcbiAgICBkbWF4ID0gJzknO1xuICAgIGkgPSAwO1xuICAgIGlmIChzLmxlbmd0aCA+IDEgJiYgc1tpXSA9PT0gJzAnKSB7XG4gICAgICBpZiAoc1tpICsgMV0gPT09ICd4JyB8fCBzW2kgKyAxXSA9PT0gJ1gnKSB7XG4gICAgICAgIGkgKz0gMjtcbiAgICAgICAgYmFzZSA9IDE2O1xuICAgICAgfSBlbHNlIGlmICgnMCcgPD0gc1tpICsgMV0gJiYgc1tpICsgMV0gPD0gJzknKSB7XG4gICAgICAgIGkrKztcbiAgICAgICAgYmFzZSA9IDg7XG4gICAgICAgIGRtYXggPSAnNyc7XG4gICAgICB9XG4gICAgfVxuICAgIHN0YXJ0ID0gaTtcbiAgICB3aGlsZSAoaSA8IHMubGVuZ3RoKSB7XG4gICAgICBpZiAoJzAnIDw9IHNbaV0gJiYgc1tpXSA8PSBkbWF4KSB7XG4gICAgICAgIG4gPSAobiAqIGJhc2UgKyAoY2hyKHNbaV0pIC0gY2hyMCkpID4+PiAwO1xuICAgICAgfSBlbHNlIGlmIChiYXNlID09PSAxNikge1xuICAgICAgICBpZiAoJ2EnIDw9IHNbaV0gJiYgc1tpXSA8PSAnZicpIHtcbiAgICAgICAgICBuID0gKG4gKiBiYXNlICsgKDEwICsgY2hyKHNbaV0pIC0gY2hyYSkpID4+PiAwO1xuICAgICAgICB9IGVsc2UgaWYgKCdBJyA8PSBzW2ldICYmIHNbaV0gPD0gJ0YnKSB7XG4gICAgICAgICAgbiA9IChuICogYmFzZSArICgxMCArIGNocihzW2ldKSAtIGNockEpKSA+Pj4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAobiA+IDB4RkZGRkZGRkYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b28gbGFyZ2UnKTtcbiAgICAgIH1cbiAgICAgIGkrKztcbiAgICB9XG4gICAgaWYgKGkgPT09IHN0YXJ0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VtcHR5IG9jdGV0Jyk7XG4gICAgfVxuICAgIHJldHVybiBbbiwgaV07XG4gIH07XG5cbiAgTmV0bWFzayA9IChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBOZXRtYXNrKG5ldCwgbWFzaykge1xuICAgICAgdmFyIGVycm9yLCBpLCBqLCByZWY7XG4gICAgICBpZiAodHlwZW9mIG5ldCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBgbmV0JyBwYXJhbWV0ZXJcIik7XG4gICAgICB9XG4gICAgICBpZiAoIW1hc2spIHtcbiAgICAgICAgcmVmID0gbmV0LnNwbGl0KCcvJywgMiksIG5ldCA9IHJlZlswXSwgbWFzayA9IHJlZlsxXTtcbiAgICAgIH1cbiAgICAgIGlmICghbWFzaykge1xuICAgICAgICBtYXNrID0gMzI7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG1hc2sgPT09ICdzdHJpbmcnICYmIG1hc2suaW5kZXhPZignLicpID4gLTEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLm1hc2tMb25nID0gaXAybG9uZyhtYXNrKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBtYXNrOiBcIiArIG1hc2spO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IGogPSAzMjsgaiA+PSAwOyBpID0gLS1qKSB7XG4gICAgICAgICAgaWYgKHRoaXMubWFza0xvbmcgPT09ICgweGZmZmZmZmZmIDw8ICgzMiAtIGkpKSA+Pj4gMCkge1xuICAgICAgICAgICAgdGhpcy5iaXRtYXNrID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChtYXNrIHx8IG1hc2sgPT09IDApIHtcbiAgICAgICAgdGhpcy5iaXRtYXNrID0gcGFyc2VJbnQobWFzaywgMTApO1xuICAgICAgICB0aGlzLm1hc2tMb25nID0gMDtcbiAgICAgICAgaWYgKHRoaXMuYml0bWFzayA+IDApIHtcbiAgICAgICAgICB0aGlzLm1hc2tMb25nID0gKDB4ZmZmZmZmZmYgPDwgKDMyIC0gdGhpcy5iaXRtYXNrKSkgPj4+IDA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbWFzazogZW1wdHlcIik7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm5ldExvbmcgPSAoaXAybG9uZyhuZXQpICYgdGhpcy5tYXNrTG9uZykgPj4+IDA7XG4gICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbmV0IGFkZHJlc3M6IFwiICsgbmV0KTtcbiAgICAgIH1cbiAgICAgIGlmICghKHRoaXMuYml0bWFzayA8PSAzMikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBtYXNrIGZvciBpcDQ6IFwiICsgbWFzayk7XG4gICAgICB9XG4gICAgICB0aGlzLnNpemUgPSBNYXRoLnBvdygyLCAzMiAtIHRoaXMuYml0bWFzayk7XG4gICAgICB0aGlzLmJhc2UgPSBsb25nMmlwKHRoaXMubmV0TG9uZyk7XG4gICAgICB0aGlzLm1hc2sgPSBsb25nMmlwKHRoaXMubWFza0xvbmcpO1xuICAgICAgdGhpcy5ob3N0bWFzayA9IGxvbmcyaXAofnRoaXMubWFza0xvbmcpO1xuICAgICAgdGhpcy5maXJzdCA9IHRoaXMuYml0bWFzayA8PSAzMCA/IGxvbmcyaXAodGhpcy5uZXRMb25nICsgMSkgOiB0aGlzLmJhc2U7XG4gICAgICB0aGlzLmxhc3QgPSB0aGlzLmJpdG1hc2sgPD0gMzAgPyBsb25nMmlwKHRoaXMubmV0TG9uZyArIHRoaXMuc2l6ZSAtIDIpIDogbG9uZzJpcCh0aGlzLm5ldExvbmcgKyB0aGlzLnNpemUgLSAxKTtcbiAgICAgIHRoaXMuYnJvYWRjYXN0ID0gdGhpcy5iaXRtYXNrIDw9IDMwID8gbG9uZzJpcCh0aGlzLm5ldExvbmcgKyB0aGlzLnNpemUgLSAxKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICBOZXRtYXNrLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKGlwKSB7XG4gICAgICBpZiAodHlwZW9mIGlwID09PSAnc3RyaW5nJyAmJiAoaXAuaW5kZXhPZignLycpID4gMCB8fCBpcC5zcGxpdCgnLicpLmxlbmd0aCAhPT0gNCkpIHtcbiAgICAgICAgaXAgPSBuZXcgTmV0bWFzayhpcCk7XG4gICAgICB9XG4gICAgICBpZiAoaXAgaW5zdGFuY2VvZiBOZXRtYXNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5zKGlwLmJhc2UpICYmIHRoaXMuY29udGFpbnMoaXAuYnJvYWRjYXN0IHx8IGlwLmxhc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChpcDJsb25nKGlwKSAmIHRoaXMubWFza0xvbmcpID4+PiAwID09PSAodGhpcy5uZXRMb25nICYgdGhpcy5tYXNrTG9uZykgPj4+IDA7XG4gICAgICB9XG4gICAgfTtcblxuICAgIE5ldG1hc2sucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbihjb3VudCkge1xuICAgICAgaWYgKGNvdW50ID09IG51bGwpIHtcbiAgICAgICAgY291bnQgPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBOZXRtYXNrKGxvbmcyaXAodGhpcy5uZXRMb25nICsgKHRoaXMuc2l6ZSAqIGNvdW50KSksIHRoaXMubWFzayk7XG4gICAgfTtcblxuICAgIE5ldG1hc2sucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihmbikge1xuICAgICAgdmFyIGluZGV4LCBsYXN0TG9uZywgbG9uZztcbiAgICAgIGxvbmcgPSBpcDJsb25nKHRoaXMuZmlyc3QpO1xuICAgICAgbGFzdExvbmcgPSBpcDJsb25nKHRoaXMubGFzdCk7XG4gICAgICBpbmRleCA9IDA7XG4gICAgICB3aGlsZSAobG9uZyA8PSBsYXN0TG9uZykge1xuICAgICAgICBmbihsb25nMmlwKGxvbmcpLCBsb25nLCBpbmRleCk7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGxvbmcrKztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgTmV0bWFzay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmJhc2UgKyBcIi9cIiArIHRoaXMuYml0bWFzaztcbiAgICB9O1xuXG4gICAgcmV0dXJuIE5ldG1hc2s7XG5cbiAgfSkoKTtcblxuICBleHBvcnRzLmlwMmxvbmcgPSBpcDJsb25nO1xuXG4gIGV4cG9ydHMubG9uZzJpcCA9IGxvbmcyaXA7XG5cbiAgZXhwb3J0cy5OZXRtYXNrID0gTmV0bWFzaztcblxufSkuY2FsbCh0aGlzKTtcbiIsImNvbnN0IHJ1bnRpbWVSZXF1aXJlID0gdHlwZW9mIF9fd2VicGFja19yZXF1aXJlX18gPT09ICdmdW5jdGlvbicgPyBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA6IHJlcXVpcmUgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuaWYgKHR5cGVvZiBydW50aW1lUmVxdWlyZS5hZGRvbiA9PT0gJ2Z1bmN0aW9uJykgeyAvLyBpZiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgbmF0aXZlIHJlc29sdmluZyBwcmVmZXIgdGhhdFxuICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWVSZXF1aXJlLmFkZG9uLmJpbmQocnVudGltZVJlcXVpcmUpXG59IGVsc2UgeyAvLyBlbHNlIHVzZSB0aGUgcnVudGltZSB2ZXJzaW9uIGhlcmVcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL25vZGUtZ3lwLWJ1aWxkLmpzJylcbn1cbiIsInZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG52YXIgb3MgPSByZXF1aXJlKCdvcycpXG5cbi8vIFdvcmthcm91bmQgdG8gZml4IHdlYnBhY2sncyBidWlsZCB3YXJuaW5nczogJ3RoZSByZXF1ZXN0IG9mIGEgZGVwZW5kZW5jeSBpcyBhbiBleHByZXNzaW9uJ1xudmFyIHJ1bnRpbWVSZXF1aXJlID0gdHlwZW9mIF9fd2VicGFja19yZXF1aXJlX18gPT09ICdmdW5jdGlvbicgPyBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA6IHJlcXVpcmUgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG52YXIgdmFycyA9IChwcm9jZXNzLmNvbmZpZyAmJiBwcm9jZXNzLmNvbmZpZy52YXJpYWJsZXMpIHx8IHt9XG52YXIgcHJlYnVpbGRzT25seSA9ICEhcHJvY2Vzcy5lbnYuUFJFQlVJTERTX09OTFlcbnZhciBhYmkgPSBwcm9jZXNzLnZlcnNpb25zLm1vZHVsZXMgLy8gVE9ETzogc3VwcG9ydCBvbGQgbm9kZSB3aGVyZSB0aGlzIGlzIHVuZGVmXG52YXIgcnVudGltZSA9IGlzRWxlY3Ryb24oKSA/ICdlbGVjdHJvbicgOiAoaXNOd2pzKCkgPyAnbm9kZS13ZWJraXQnIDogJ25vZGUnKVxuXG52YXIgYXJjaCA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfYXJjaCB8fCBvcy5hcmNoKClcbnZhciBwbGF0Zm9ybSA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfcGxhdGZvcm0gfHwgb3MucGxhdGZvcm0oKVxudmFyIGxpYmMgPSBwcm9jZXNzLmVudi5MSUJDIHx8IChpc0FscGluZShwbGF0Zm9ybSkgPyAnbXVzbCcgOiAnZ2xpYmMnKVxudmFyIGFybXYgPSBwcm9jZXNzLmVudi5BUk1fVkVSU0lPTiB8fCAoYXJjaCA9PT0gJ2FybTY0JyA/ICc4JyA6IHZhcnMuYXJtX3ZlcnNpb24pIHx8ICcnXG52YXIgdXYgPSAocHJvY2Vzcy52ZXJzaW9ucy51diB8fCAnJykuc3BsaXQoJy4nKVswXVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxvYWRcblxuZnVuY3Rpb24gbG9hZCAoZGlyKSB7XG4gIHJldHVybiBydW50aW1lUmVxdWlyZShsb2FkLnJlc29sdmUoZGlyKSlcbn1cblxubG9hZC5yZXNvbHZlID0gbG9hZC5wYXRoID0gZnVuY3Rpb24gKGRpcikge1xuICBkaXIgPSBwYXRoLnJlc29sdmUoZGlyIHx8ICcuJylcblxuICB0cnkge1xuICAgIHZhciBuYW1lID0gcnVudGltZVJlcXVpcmUocGF0aC5qb2luKGRpciwgJ3BhY2thZ2UuanNvbicpKS5uYW1lLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpXG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWUgKyAnX1BSRUJVSUxEJ10pIGRpciA9IHByb2Nlc3MuZW52W25hbWUgKyAnX1BSRUJVSUxEJ11cbiAgfSBjYXRjaCAoZXJyKSB7fVxuXG4gIGlmICghcHJlYnVpbGRzT25seSkge1xuICAgIHZhciByZWxlYXNlID0gZ2V0Rmlyc3QocGF0aC5qb2luKGRpciwgJ2J1aWxkL1JlbGVhc2UnKSwgbWF0Y2hCdWlsZClcbiAgICBpZiAocmVsZWFzZSkgcmV0dXJuIHJlbGVhc2VcblxuICAgIHZhciBkZWJ1ZyA9IGdldEZpcnN0KHBhdGguam9pbihkaXIsICdidWlsZC9EZWJ1ZycpLCBtYXRjaEJ1aWxkKVxuICAgIGlmIChkZWJ1ZykgcmV0dXJuIGRlYnVnXG4gIH1cblxuICB2YXIgcHJlYnVpbGQgPSByZXNvbHZlKGRpcilcbiAgaWYgKHByZWJ1aWxkKSByZXR1cm4gcHJlYnVpbGRcblxuICB2YXIgbmVhcmJ5ID0gcmVzb2x2ZShwYXRoLmRpcm5hbWUocHJvY2Vzcy5leGVjUGF0aCkpXG4gIGlmIChuZWFyYnkpIHJldHVybiBuZWFyYnlcblxuICB2YXIgdGFyZ2V0ID0gW1xuICAgICdwbGF0Zm9ybT0nICsgcGxhdGZvcm0sXG4gICAgJ2FyY2g9JyArIGFyY2gsXG4gICAgJ3J1bnRpbWU9JyArIHJ1bnRpbWUsXG4gICAgJ2FiaT0nICsgYWJpLFxuICAgICd1dj0nICsgdXYsXG4gICAgYXJtdiA/ICdhcm12PScgKyBhcm12IDogJycsXG4gICAgJ2xpYmM9JyArIGxpYmMsXG4gICAgJ25vZGU9JyArIHByb2Nlc3MudmVyc2lvbnMubm9kZSxcbiAgICBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uID8gJ2VsZWN0cm9uPScgKyBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uIDogJycsXG4gICAgdHlwZW9mIF9fd2VicGFja19yZXF1aXJlX18gPT09ICdmdW5jdGlvbicgPyAnd2VicGFjaz10cnVlJyA6ICcnIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpXG5cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBuYXRpdmUgYnVpbGQgd2FzIGZvdW5kIGZvciAnICsgdGFyZ2V0ICsgJ1xcbiAgICBsb2FkZWQgZnJvbTogJyArIGRpciArICdcXG4nKVxuXG4gIGZ1bmN0aW9uIHJlc29sdmUgKGRpcikge1xuICAgIC8vIEZpbmQgbWF0Y2hpbmcgXCJwcmVidWlsZHMvPHBsYXRmb3JtPi08YXJjaD5cIiBkaXJlY3RvcnlcbiAgICB2YXIgdHVwbGVzID0gcmVhZGRpclN5bmMocGF0aC5qb2luKGRpciwgJ3ByZWJ1aWxkcycpKS5tYXAocGFyc2VUdXBsZSlcbiAgICB2YXIgdHVwbGUgPSB0dXBsZXMuZmlsdGVyKG1hdGNoVHVwbGUocGxhdGZvcm0sIGFyY2gpKS5zb3J0KGNvbXBhcmVUdXBsZXMpWzBdXG4gICAgaWYgKCF0dXBsZSkgcmV0dXJuXG5cbiAgICAvLyBGaW5kIG1vc3Qgc3BlY2lmaWMgZmxhdm9yIGZpcnN0XG4gICAgdmFyIHByZWJ1aWxkcyA9IHBhdGguam9pbihkaXIsICdwcmVidWlsZHMnLCB0dXBsZS5uYW1lKVxuICAgIHZhciBwYXJzZWQgPSByZWFkZGlyU3luYyhwcmVidWlsZHMpLm1hcChwYXJzZVRhZ3MpXG4gICAgdmFyIGNhbmRpZGF0ZXMgPSBwYXJzZWQuZmlsdGVyKG1hdGNoVGFncyhydW50aW1lLCBhYmkpKVxuICAgIHZhciB3aW5uZXIgPSBjYW5kaWRhdGVzLnNvcnQoY29tcGFyZVRhZ3MocnVudGltZSkpWzBdXG4gICAgaWYgKHdpbm5lcikgcmV0dXJuIHBhdGguam9pbihwcmVidWlsZHMsIHdpbm5lci5maWxlKVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRkaXJTeW5jIChkaXIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMucmVhZGRpclN5bmMoZGlyKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gW11cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRGaXJzdCAoZGlyLCBmaWx0ZXIpIHtcbiAgdmFyIGZpbGVzID0gcmVhZGRpclN5bmMoZGlyKS5maWx0ZXIoZmlsdGVyKVxuICByZXR1cm4gZmlsZXNbMF0gJiYgcGF0aC5qb2luKGRpciwgZmlsZXNbMF0pXG59XG5cbmZ1bmN0aW9uIG1hdGNoQnVpbGQgKG5hbWUpIHtcbiAgcmV0dXJuIC9cXC5ub2RlJC8udGVzdChuYW1lKVxufVxuXG5mdW5jdGlvbiBwYXJzZVR1cGxlIChuYW1lKSB7XG4gIC8vIEV4YW1wbGU6IGRhcndpbi14NjQrYXJtNjRcbiAgdmFyIGFyciA9IG5hbWUuc3BsaXQoJy0nKVxuICBpZiAoYXJyLmxlbmd0aCAhPT0gMikgcmV0dXJuXG5cbiAgdmFyIHBsYXRmb3JtID0gYXJyWzBdXG4gIHZhciBhcmNoaXRlY3R1cmVzID0gYXJyWzFdLnNwbGl0KCcrJylcblxuICBpZiAoIXBsYXRmb3JtKSByZXR1cm5cbiAgaWYgKCFhcmNoaXRlY3R1cmVzLmxlbmd0aCkgcmV0dXJuXG4gIGlmICghYXJjaGl0ZWN0dXJlcy5ldmVyeShCb29sZWFuKSkgcmV0dXJuXG5cbiAgcmV0dXJuIHsgbmFtZSwgcGxhdGZvcm0sIGFyY2hpdGVjdHVyZXMgfVxufVxuXG5mdW5jdGlvbiBtYXRjaFR1cGxlIChwbGF0Zm9ybSwgYXJjaCkge1xuICByZXR1cm4gZnVuY3Rpb24gKHR1cGxlKSB7XG4gICAgaWYgKHR1cGxlID09IG51bGwpIHJldHVybiBmYWxzZVxuICAgIGlmICh0dXBsZS5wbGF0Zm9ybSAhPT0gcGxhdGZvcm0pIHJldHVybiBmYWxzZVxuICAgIHJldHVybiB0dXBsZS5hcmNoaXRlY3R1cmVzLmluY2x1ZGVzKGFyY2gpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGFyZVR1cGxlcyAoYSwgYikge1xuICAvLyBQcmVmZXIgc2luZ2xlLWFyY2ggcHJlYnVpbGRzIG92ZXIgbXVsdGktYXJjaFxuICByZXR1cm4gYS5hcmNoaXRlY3R1cmVzLmxlbmd0aCAtIGIuYXJjaGl0ZWN0dXJlcy5sZW5ndGhcbn1cblxuZnVuY3Rpb24gcGFyc2VUYWdzIChmaWxlKSB7XG4gIHZhciBhcnIgPSBmaWxlLnNwbGl0KCcuJylcbiAgdmFyIGV4dGVuc2lvbiA9IGFyci5wb3AoKVxuICB2YXIgdGFncyA9IHsgZmlsZTogZmlsZSwgc3BlY2lmaWNpdHk6IDAgfVxuXG4gIGlmIChleHRlbnNpb24gIT09ICdub2RlJykgcmV0dXJuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdGFnID0gYXJyW2ldXG5cbiAgICBpZiAodGFnID09PSAnbm9kZScgfHwgdGFnID09PSAnZWxlY3Ryb24nIHx8IHRhZyA9PT0gJ25vZGUtd2Via2l0Jykge1xuICAgICAgdGFncy5ydW50aW1lID0gdGFnXG4gICAgfSBlbHNlIGlmICh0YWcgPT09ICduYXBpJykge1xuICAgICAgdGFncy5uYXBpID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAodGFnLnNsaWNlKDAsIDMpID09PSAnYWJpJykge1xuICAgICAgdGFncy5hYmkgPSB0YWcuc2xpY2UoMylcbiAgICB9IGVsc2UgaWYgKHRhZy5zbGljZSgwLCAyKSA9PT0gJ3V2Jykge1xuICAgICAgdGFncy51diA9IHRhZy5zbGljZSgyKVxuICAgIH0gZWxzZSBpZiAodGFnLnNsaWNlKDAsIDQpID09PSAnYXJtdicpIHtcbiAgICAgIHRhZ3MuYXJtdiA9IHRhZy5zbGljZSg0KVxuICAgIH0gZWxzZSBpZiAodGFnID09PSAnZ2xpYmMnIHx8IHRhZyA9PT0gJ211c2wnKSB7XG4gICAgICB0YWdzLmxpYmMgPSB0YWdcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB0YWdzLnNwZWNpZmljaXR5KytcbiAgfVxuXG4gIHJldHVybiB0YWdzXG59XG5cbmZ1bmN0aW9uIG1hdGNoVGFncyAocnVudGltZSwgYWJpKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFncykge1xuICAgIGlmICh0YWdzID09IG51bGwpIHJldHVybiBmYWxzZVxuICAgIGlmICh0YWdzLnJ1bnRpbWUgJiYgdGFncy5ydW50aW1lICE9PSBydW50aW1lICYmICFydW50aW1lQWdub3N0aWModGFncykpIHJldHVybiBmYWxzZVxuICAgIGlmICh0YWdzLmFiaSAmJiB0YWdzLmFiaSAhPT0gYWJpICYmICF0YWdzLm5hcGkpIHJldHVybiBmYWxzZVxuICAgIGlmICh0YWdzLnV2ICYmIHRhZ3MudXYgIT09IHV2KSByZXR1cm4gZmFsc2VcbiAgICBpZiAodGFncy5hcm12ICYmIHRhZ3MuYXJtdiAhPT0gYXJtdikgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHRhZ3MubGliYyAmJiB0YWdzLmxpYmMgIT09IGxpYmMpIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuXG5mdW5jdGlvbiBydW50aW1lQWdub3N0aWMgKHRhZ3MpIHtcbiAgcmV0dXJuIHRhZ3MucnVudGltZSA9PT0gJ25vZGUnICYmIHRhZ3MubmFwaVxufVxuXG5mdW5jdGlvbiBjb21wYXJlVGFncyAocnVudGltZSkge1xuICAvLyBQcmVjZWRlbmNlOiBub24tYWdub3N0aWMgcnVudGltZSwgYWJpIG92ZXIgbmFwaSwgdGhlbiBieSBzcGVjaWZpY2l0eS5cbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgaWYgKGEucnVudGltZSAhPT0gYi5ydW50aW1lKSB7XG4gICAgICByZXR1cm4gYS5ydW50aW1lID09PSBydW50aW1lID8gLTEgOiAxXG4gICAgfSBlbHNlIGlmIChhLmFiaSAhPT0gYi5hYmkpIHtcbiAgICAgIHJldHVybiBhLmFiaSA/IC0xIDogMVxuICAgIH0gZWxzZSBpZiAoYS5zcGVjaWZpY2l0eSAhPT0gYi5zcGVjaWZpY2l0eSkge1xuICAgICAgcmV0dXJuIGEuc3BlY2lmaWNpdHkgPiBiLnNwZWNpZmljaXR5ID8gLTEgOiAxXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzTndqcyAoKSB7XG4gIHJldHVybiAhIShwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubncpXG59XG5cbmZ1bmN0aW9uIGlzRWxlY3Ryb24gKCkge1xuICBpZiAocHJvY2Vzcy52ZXJzaW9ucyAmJiBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uKSByZXR1cm4gdHJ1ZVxuICBpZiAocHJvY2Vzcy5lbnYuRUxFQ1RST05fUlVOX0FTX05PREUpIHJldHVybiB0cnVlXG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiB3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInXG59XG5cbmZ1bmN0aW9uIGlzQWxwaW5lIChwbGF0Zm9ybSkge1xuICByZXR1cm4gcGxhdGZvcm0gPT09ICdsaW51eCcgJiYgZnMuZXhpc3RzU3luYygnL2V0Yy9hbHBpbmUtcmVsZWFzZScpXG59XG5cbi8vIEV4cG9zZWQgZm9yIHVuaXQgdGVzdHNcbi8vIFRPRE86IG1vdmUgdG8gbGliXG5sb2FkLnBhcnNlVGFncyA9IHBhcnNlVGFnc1xubG9hZC5tYXRjaFRhZ3MgPSBtYXRjaFRhZ3NcbmxvYWQuY29tcGFyZVRhZ3MgPSBjb21wYXJlVGFnc1xubG9hZC5wYXJzZVR1cGxlID0gcGFyc2VUdXBsZVxubG9hZC5tYXRjaFR1cGxlID0gbWF0Y2hUdXBsZVxubG9hZC5jb21wYXJlVHVwbGVzID0gY29tcGFyZVR1cGxlc1xuIiwidmFyIHdyYXBweSA9IHJlcXVpcmUoJ3dyYXBweScpXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXBweShvbmNlKVxubW9kdWxlLmV4cG9ydHMuc3RyaWN0ID0gd3JhcHB5KG9uY2VTdHJpY3QpXG5cbm9uY2UucHJvdG8gPSBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwgJ29uY2UnLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBvbmNlKHRoaXMpXG4gICAgfSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCAnb25jZVN0cmljdCcsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG9uY2VTdHJpY3QodGhpcylcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxufSlcblxuZnVuY3Rpb24gb25jZSAoZm4pIHtcbiAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGYuY2FsbGVkKSByZXR1cm4gZi52YWx1ZVxuICAgIGYuY2FsbGVkID0gdHJ1ZVxuICAgIHJldHVybiBmLnZhbHVlID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9XG4gIGYuY2FsbGVkID0gZmFsc2VcbiAgcmV0dXJuIGZcbn1cblxuZnVuY3Rpb24gb25jZVN0cmljdCAoZm4pIHtcbiAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGYuY2FsbGVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGYub25jZUVycm9yKVxuICAgIGYuY2FsbGVkID0gdHJ1ZVxuICAgIHJldHVybiBmLnZhbHVlID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9XG4gIHZhciBuYW1lID0gZm4ubmFtZSB8fCAnRnVuY3Rpb24gd3JhcHBlZCB3aXRoIGBvbmNlYCdcbiAgZi5vbmNlRXJyb3IgPSBuYW1lICsgXCIgc2hvdWxkbid0IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZVwiXG4gIGYuY2FsbGVkID0gZmFsc2VcbiAgcmV0dXJuIGZcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlBhY1Byb3h5QWdlbnQgPSB2b2lkIDA7XG5jb25zdCBuZXQgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm5ldFwiKSk7XG5jb25zdCB0bHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInRsc1wiKSk7XG5jb25zdCBjcnlwdG8gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImNyeXB0b1wiKSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCB1cmxfMSA9IHJlcXVpcmUoXCJ1cmxcIik7XG5jb25zdCBhZ2VudF9iYXNlXzEgPSByZXF1aXJlKFwiYWdlbnQtYmFzZVwiKTtcbmNvbnN0IGh0dHBfcHJveHlfYWdlbnRfMSA9IHJlcXVpcmUoXCJodHRwLXByb3h5LWFnZW50XCIpO1xuY29uc3QgaHR0cHNfcHJveHlfYWdlbnRfMSA9IHJlcXVpcmUoXCJodHRwcy1wcm94eS1hZ2VudFwiKTtcbmNvbnN0IHNvY2tzX3Byb3h5X2FnZW50XzEgPSByZXF1aXJlKFwic29ja3MtcHJveHktYWdlbnRcIik7XG5jb25zdCBnZXRfdXJpXzEgPSByZXF1aXJlKFwiZ2V0LXVyaVwiKTtcbmNvbnN0IHBhY19yZXNvbHZlcl8xID0gcmVxdWlyZShcInBhYy1yZXNvbHZlclwiKTtcbmNvbnN0IHF1aWNranNfZW1zY3JpcHRlbl8xID0gcmVxdWlyZShcIkB0b290YWxsbmF0ZS9xdWlja2pzLWVtc2NyaXB0ZW5cIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdwYWMtcHJveHktYWdlbnQnKTtcbi8qKlxuICogVGhlIGBQYWNQcm94eUFnZW50YCBjbGFzcy5cbiAqXG4gKiBBIGZldyBkaWZmZXJlbnQgXCJwcm90b2NvbFwiIG1vZGVzIGFyZSBzdXBwb3J0ZWQgKHN1cHBvcnRlZCBwcm90b2NvbHMgYXJlXG4gKiBiYWNrZWQgYnkgdGhlIGBnZXQtdXJpYCBtb2R1bGUpOlxuICpcbiAqICAgLSBcInBhYytkYXRhXCIsIFwiZGF0YVwiIC0gcmVmZXJzIHRvIGFuIGVtYmVkZGVkIFwiZGF0YTpcIiBVUklcbiAqICAgLSBcInBhYytmaWxlXCIsIFwiZmlsZVwiIC0gcmVmZXJzIHRvIGEgbG9jYWwgZmlsZVxuICogICAtIFwicGFjK2Z0cFwiLCBcImZ0cFwiIC0gcmVmZXJzIHRvIGEgZmlsZSBsb2NhdGVkIG9uIGFuIEZUUCBzZXJ2ZXJcbiAqICAgLSBcInBhYytodHRwXCIsIFwiaHR0cFwiIC0gcmVmZXJzIHRvIGFuIEhUVFAgZW5kcG9pbnRcbiAqICAgLSBcInBhYytodHRwc1wiLCBcImh0dHBzXCIgLSByZWZlcnMgdG8gYW4gSFRUUFMgZW5kcG9pbnRcbiAqL1xuY2xhc3MgUGFjUHJveHlBZ2VudCBleHRlbmRzIGFnZW50X2Jhc2VfMS5BZ2VudCB7XG4gICAgY29uc3RydWN0b3IodXJpLCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLmNsZWFyUmVzb2x2ZXJQcm9taXNlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlclByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFN0cmlwIHRoZSBcInBhYytcIiBwcmVmaXhcbiAgICAgICAgY29uc3QgdXJpU3RyID0gdHlwZW9mIHVyaSA9PT0gJ3N0cmluZycgPyB1cmkgOiB1cmkuaHJlZjtcbiAgICAgICAgdGhpcy51cmkgPSBuZXcgdXJsXzEuVVJMKHVyaVN0ci5yZXBsYWNlKC9ecGFjXFwrL2ksICcnKSk7XG4gICAgICAgIGRlYnVnKCdDcmVhdGluZyBQYWNQcm94eUFnZW50IHdpdGggVVJJICVvJywgdGhpcy51cmkuaHJlZik7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgTm90IHN1cmUgd2h5IFRTIGlzIGNvbXBsYWluaW5nIGhlcmXigKZcbiAgICAgICAgdGhpcy5vcHRzID0geyAuLi5vcHRzIH07XG4gICAgICAgIHRoaXMuY2FjaGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucmVzb2x2ZXJIYXNoID0gJyc7XG4gICAgICAgIHRoaXMucmVzb2x2ZXJQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAvLyBGb3IgYFBhY1Jlc29sdmVyYFxuICAgICAgICBpZiAoIXRoaXMub3B0cy5maWxlbmFtZSkge1xuICAgICAgICAgICAgdGhpcy5vcHRzLmZpbGVuYW1lID0gdGhpcy51cmkuaHJlZjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgUEFDIHByb3h5IGZpbGUgZnJvbSB0aGUgc291cmNlIGlmIG5lY2Vzc2FyeSwgYW5kIHJldHVybnNcbiAgICAgKiBhIGdlbmVyYXRlZCBgRmluZFByb3h5Rm9yVVJMKClgIHJlc29sdmVyIGZ1bmN0aW9uIHRvIHVzZS5cbiAgICAgKlxuICAgICAqIEBhcGkgcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldFJlc29sdmVyKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVzb2x2ZXJQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVyUHJvbWlzZSA9IHRoaXMubG9hZFJlc29sdmVyKCk7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVyUHJvbWlzZS50aGVuKHRoaXMuY2xlYXJSZXNvbHZlclByb21pc2UsIHRoaXMuY2xlYXJSZXNvbHZlclByb21pc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyUHJvbWlzZTtcbiAgICB9XG4gICAgYXN5bmMgbG9hZFJlc29sdmVyKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gKFJlKWxvYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBQQUMgZmlsZSBVUklcbiAgICAgICAgICAgIGNvbnN0IFtxanMsIGNvZGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICgwLCBxdWlja2pzX2Vtc2NyaXB0ZW5fMS5nZXRRdWlja0pTKSgpLFxuICAgICAgICAgICAgICAgIHRoaXMubG9hZFBhY0ZpbGUoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgc2hhMSBoYXNoIG9mIHRoZSBKUyBjb2RlXG4gICAgICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKS51cGRhdGUoY29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc29sdmVyICYmIHRoaXMucmVzb2x2ZXJIYXNoID09PSBoYXNoKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ1NhbWUgc2hhMSBoYXNoIGZvciBjb2RlIC0gY29udGVudHMgaGF2ZSBub3QgY2hhbmdlZCwgcmV1c2luZyBwcmV2aW91cyBwcm94eSByZXNvbHZlcicpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc29sdmVyXG4gICAgICAgICAgICBkZWJ1ZygnQ3JlYXRpbmcgbmV3IHByb3h5IHJlc29sdmVyIGluc3RhbmNlJyk7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVyID0gKDAsIHBhY19yZXNvbHZlcl8xLmNyZWF0ZVBhY1Jlc29sdmVyKShxanMsIGNvZGUsIHRoaXMub3B0cyk7XG4gICAgICAgICAgICAvLyBTdG9yZSB0aGF0IHNoYTEgaGFzaCBmb3IgZnV0dXJlIGNvbXBhcmlzb24gcHVycG9zZXNcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZXJIYXNoID0gaGFzaDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVyO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc29sdmVyICYmXG4gICAgICAgICAgICAgICAgZXJyLmNvZGUgPT09ICdFTk9UTU9ESUZJRUQnKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ0dvdCBFTk9UTU9ESUZJRUQgcmVzcG9uc2UsIHJldXNpbmcgcHJldmlvdXMgcHJveHkgcmVzb2x2ZXInKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgY29udGVudHMgb2YgdGhlIFBBQyBwcm94eSBmaWxlLlxuICAgICAqXG4gICAgICogQGFwaSBwcml2YXRlXG4gICAgICovXG4gICAgYXN5bmMgbG9hZFBhY0ZpbGUoKSB7XG4gICAgICAgIGRlYnVnKCdMb2FkaW5nIFBBQyBmaWxlOiAlbycsIHRoaXMudXJpKTtcbiAgICAgICAgY29uc3QgcnMgPSBhd2FpdCAoMCwgZ2V0X3VyaV8xLmdldFVyaSkodGhpcy51cmksIHsgLi4udGhpcy5vcHRzLCBjYWNoZTogdGhpcy5jYWNoZSB9KTtcbiAgICAgICAgZGVidWcoJ0dvdCBgUmVhZGFibGVgIGluc3RhbmNlIGZvciBVUkknKTtcbiAgICAgICAgdGhpcy5jYWNoZSA9IHJzO1xuICAgICAgICBjb25zdCBidWYgPSBhd2FpdCAoMCwgYWdlbnRfYmFzZV8xLnRvQnVmZmVyKShycyk7XG4gICAgICAgIGRlYnVnKCdSZWFkICVvIGJ5dGUgUEFDIGZpbGUgZnJvbSBVUkknLCBidWYubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmOCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbm9kZS1jb3JlIEhUVFAgY2xpZW50IGxpYnJhcnkgaXMgY3JlYXRpbmcgYSBuZXcgSFRUUCByZXF1ZXN0LlxuICAgICAqL1xuICAgIGFzeW5jIGNvbm5lY3QocmVxLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IHsgc2VjdXJlRW5kcG9pbnQgfSA9IG9wdHM7XG4gICAgICAgIC8vIEZpcnN0LCBnZXQgYSBnZW5lcmF0ZWQgYEZpbmRQcm94eUZvclVSTCgpYCBmdW5jdGlvbixcbiAgICAgICAgLy8gZWl0aGVyIGNhY2hlZCBvciByZXRyaWV2ZWQgZnJvbSB0aGUgc291cmNlXG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gYXdhaXQgdGhpcy5nZXRSZXNvbHZlcigpO1xuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGB1cmxgIHBhcmFtZXRlclxuICAgICAgICBjb25zdCBkZWZhdWx0UG9ydCA9IHNlY3VyZUVuZHBvaW50ID8gNDQzIDogODA7XG4gICAgICAgIGxldCBwYXRoID0gcmVxLnBhdGg7XG4gICAgICAgIGxldCBzZWFyY2ggPSBudWxsO1xuICAgICAgICBjb25zdCBmaXJzdFF1ZXN0aW9uID0gcGF0aC5pbmRleE9mKCc/Jyk7XG4gICAgICAgIGlmIChmaXJzdFF1ZXN0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgc2VhcmNoID0gcGF0aC5zdWJzdHJpbmcoZmlyc3RRdWVzdGlvbik7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgZmlyc3RRdWVzdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJsT3B0cyA9IHtcbiAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgICBwcm90b2NvbDogc2VjdXJlRW5kcG9pbnQgPyAnaHR0cHM6JyA6ICdodHRwOicsXG4gICAgICAgICAgICBwYXRobmFtZTogcGF0aCxcbiAgICAgICAgICAgIHNlYXJjaCxcbiAgICAgICAgICAgIC8vIG5lZWQgdG8gdXNlIGBob3N0bmFtZWAgaW5zdGVhZCBvZiBgaG9zdGAgb3RoZXJ3aXNlIGBwb3J0YCBpcyBpZ25vcmVkXG4gICAgICAgICAgICBob3N0bmFtZTogb3B0cy5ob3N0LFxuICAgICAgICAgICAgaG9zdDogbnVsbCxcbiAgICAgICAgICAgIGhyZWY6IG51bGwsXG4gICAgICAgICAgICAvLyBzZXQgYHBvcnRgIHRvIG51bGwgd2hlbiBpdCBpcyB0aGUgcHJvdG9jb2wgZGVmYXVsdCBwb3J0ICg4MCAvIDQ0MylcbiAgICAgICAgICAgIHBvcnQ6IGRlZmF1bHRQb3J0ID09PSBvcHRzLnBvcnQgPyBudWxsIDogb3B0cy5wb3J0LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB1cmwgPSAoMCwgdXJsXzEuZm9ybWF0KSh1cmxPcHRzKTtcbiAgICAgICAgZGVidWcoJ3VybDogJW8nLCB1cmwpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZXIodXJsKTtcbiAgICAgICAgLy8gRGVmYXVsdCB0byBcIkRJUkVDVFwiIGlmIGEgZmFsc2V5IHZhbHVlIHdhcyByZXR1cm5lZCAob3Igbm90aGluZylcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9ICdESVJFQ1QnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3hpZXMgPSBTdHJpbmcocmVzdWx0KVxuICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgLnNwbGl0KC9cXHMqO1xccyovZylcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZmFsbGJhY2tUb0RpcmVjdCAmJiAhcHJveGllcy5pbmNsdWRlcygnRElSRUNUJykpIHtcbiAgICAgICAgICAgIHByb3hpZXMucHVzaCgnRElSRUNUJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwcm94eSBvZiBwcm94aWVzKSB7XG4gICAgICAgICAgICBsZXQgYWdlbnQgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHNvY2tldCA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBbdHlwZSwgdGFyZ2V0XSA9IHByb3h5LnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBkZWJ1ZygnQXR0ZW1wdGluZyB0byB1c2UgcHJveHk6ICVvJywgcHJveHkpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdESVJFQ1QnKSB7XG4gICAgICAgICAgICAgICAgLy8gRGlyZWN0IGNvbm5lY3Rpb24gdG8gdGhlIGRlc3RpbmF0aW9uIGVuZHBvaW50XG4gICAgICAgICAgICAgICAgaWYgKHNlY3VyZUVuZHBvaW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZlcm5hbWUgPSBvcHRzLnNlcnZlcm5hbWUgfHwgb3B0cy5ob3N0O1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXQgPSB0bHMuY29ubmVjdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVybmFtZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXQgPSBuZXQuY29ubmVjdChvcHRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnU09DS1MnIHx8IHR5cGUgPT09ICdTT0NLUzUnKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIGEgU09DS1N2NWggcHJveHlcbiAgICAgICAgICAgICAgICBhZ2VudCA9IG5ldyBzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudChgc29ja3M6Ly8ke3RhcmdldH1gLCB0aGlzLm9wdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gJ1NPQ0tTNCcpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgYSBTT0NLU3Y0YSBwcm94eVxuICAgICAgICAgICAgICAgIGFnZW50ID0gbmV3IHNvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50KGBzb2NrczRhOi8vJHt0YXJnZXR9YCwgdGhpcy5vcHRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdQUk9YWScgfHxcbiAgICAgICAgICAgICAgICB0eXBlID09PSAnSFRUUCcgfHxcbiAgICAgICAgICAgICAgICB0eXBlID09PSAnSFRUUFMnKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlIGFuIEhUVFAgb3IgSFRUUFMgcHJveHlcbiAgICAgICAgICAgICAgICAvLyBodHRwOi8vZGV2LmNocm9taXVtLm9yZy9kZXZlbG9wZXJzL2Rlc2lnbi1kb2N1bWVudHMvc2VjdXJlLXdlYi1wcm94eVxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3h5VVJMID0gYCR7dHlwZSA9PT0gJ0hUVFBTJyA/ICdodHRwcycgOiAnaHR0cCd9Oi8vJHt0YXJnZXR9YDtcbiAgICAgICAgICAgICAgICBpZiAoc2VjdXJlRW5kcG9pbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgYWdlbnQgPSBuZXcgaHR0cHNfcHJveHlfYWdlbnRfMS5IdHRwc1Byb3h5QWdlbnQocHJveHlVUkwsIHRoaXMub3B0cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZ2VudCA9IG5ldyBodHRwX3Byb3h5X2FnZW50XzEuSHR0cFByb3h5QWdlbnQocHJveHlVUkwsIHRoaXMub3B0cyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoc29ja2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFwiRElSRUNUXCIgY29ubmVjdGlvbiwgd2FpdCBmb3IgY29ubmVjdGlvbiBjb25maXJtYXRpb25cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgKDAsIGV2ZW50c18xLm9uY2UpKHNvY2tldCwgJ2Nvbm5lY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxLmVtaXQoJ3Byb3h5JywgeyBwcm94eSwgc29ja2V0IH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ja2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWdlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGF3YWl0IGFnZW50LmNvbm5lY3QocmVxLCBvcHRzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEocyBpbnN0YW5jZW9mIG5ldC5Tb2NrZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgYG5ldC5Tb2NrZXRgIHRvIGJlIHJldHVybmVkIGZyb20gYWdlbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXEuZW1pdCgncHJveHknLCB7IHByb3h5LCBzb2NrZXQ6IHMgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlcm1pbmUgcHJveHkgdHlwZSBmb3I6ICR7cHJveHl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ0dvdCBlcnJvciBmb3IgcHJveHkgJW86ICVvJywgcHJveHksIGVycik7XG4gICAgICAgICAgICAgICAgcmVxLmVtaXQoJ3Byb3h5JywgeyBwcm94eSwgZXJyb3I6IGVyciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBlc3RhYmxpc2ggYSBzb2NrZXQgY29ubmVjdGlvbiB0byBwcm94aWVzOiAke0pTT04uc3RyaW5naWZ5KHByb3hpZXMpfWApO1xuICAgIH1cbn1cblBhY1Byb3h5QWdlbnQucHJvdG9jb2xzID0gW1xuICAgICdwYWMrZGF0YScsXG4gICAgJ3BhYytmaWxlJyxcbiAgICAncGFjK2Z0cCcsXG4gICAgJ3BhYytodHRwJyxcbiAgICAncGFjK2h0dHBzJyxcbl07XG5leHBvcnRzLlBhY1Byb3h5QWdlbnQgPSBQYWNQcm94eUFnZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKipcbiAqIElmIG9ubHkgYSBzaW5nbGUgdmFsdWUgaXMgc3BlY2lmaWVkIChmcm9tIGVhY2ggY2F0ZWdvcnk6IGRheSwgbW9udGgsIHllYXIpLCB0aGVcbiAqIGZ1bmN0aW9uIHJldHVybnMgYSB0cnVlIHZhbHVlIG9ubHkgb24gZGF5cyB0aGF0IG1hdGNoIHRoYXQgc3BlY2lmaWNhdGlvbi4gSWZcbiAqIGJvdGggdmFsdWVzIGFyZSBzcGVjaWZpZWQsIHRoZSByZXN1bHQgaXMgdHJ1ZSBiZXR3ZWVuIHRob3NlIHRpbWVzLCBpbmNsdWRpbmdcbiAqIGJvdW5kcy5cbiAqXG4gKiBFdmVuIHRob3VnaCB0aGUgZXhhbXBsZXMgZG9uJ3Qgc2hvdywgdGhlIFwiR01UXCIgcGFyYW1ldGVyIGNhbiBiZSBzcGVjaWZpZWRcbiAqIGluIGFueSBvZiB0aGUgOSBkaWZmZXJlbnQgY2FsbCBwcm9maWxlcywgYWx3YXlzIGFzIHRoZSBsYXN0IHBhcmFtZXRlci5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIGRhdGVSYW5nZSgxKVxuICogdHJ1ZSBvbiB0aGUgZmlyc3QgZGF5IG9mIGVhY2ggbW9udGgsIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIGRhdGVSYW5nZSgxLCBcIkdNVFwiKVxuICogdHJ1ZSBvbiB0aGUgZmlyc3QgZGF5IG9mIGVhY2ggbW9udGgsIEdNVCB0aW1lem9uZS5cbiAqXG4gKiBkYXRlUmFuZ2UoMSwgMTUpXG4gKiB0cnVlIG9uIHRoZSBmaXJzdCBoYWxmIG9mIGVhY2ggbW9udGguXG4gKlxuICogZGF0ZVJhbmdlKDI0LCBcIkRFQ1wiKVxuICogdHJ1ZSBvbiAyNHRoIG9mIERlY2VtYmVyIGVhY2ggeWVhci5cbiAqXG4gKiBkYXRlUmFuZ2UoMjQsIFwiREVDXCIsIDE5OTUpXG4gKiB0cnVlIG9uIDI0dGggb2YgRGVjZW1iZXIsIDE5OTUuXG4gKlxuICogZGF0ZVJhbmdlKFwiSkFOXCIsIFwiTUFSXCIpXG4gKiB0cnVlIG9uIHRoZSBmaXJzdCBxdWFydGVyIG9mIHRoZSB5ZWFyLlxuICpcbiAqIGRhdGVSYW5nZSgxLCBcIkpVTlwiLCAxNSwgXCJBVUdcIilcbiAqIHRydWUgZnJvbSBKdW5lIDFzdCB1bnRpbCBBdWd1c3QgMTV0aCwgZWFjaCB5ZWFyIChpbmNsdWRpbmcgSnVuZSAxc3QgYW5kIEF1Z3VzdFxuICogMTV0aCkuXG4gKlxuICogZGF0ZVJhbmdlKDEsIFwiSlVOXCIsIDE1LCAxOTk1LCBcIkFVR1wiLCAxOTk1KVxuICogdHJ1ZSBmcm9tIEp1bmUgMXN0LCAxOTk1LCB1bnRpbCBBdWd1c3QgMTV0aCwgc2FtZSB5ZWFyLlxuICpcbiAqIGRhdGVSYW5nZShcIk9DVFwiLCAxOTk1LCBcIk1BUlwiLCAxOTk2KVxuICogdHJ1ZSBmcm9tIE9jdG9iZXIgMTk5NSB1bnRpbCBNYXJjaCAxOTk2IChpbmNsdWRpbmcgdGhlIGVudGlyZSBtb250aCBvZiBPY3RvYmVyXG4gKiAxOTk1IGFuZCBNYXJjaCAxOTk2KS5cbiAqXG4gKiBkYXRlUmFuZ2UoMTk5NSlcbiAqIHRydWUgZHVyaW5nIHRoZSBlbnRpcmUgeWVhciAxOTk1LlxuICpcbiAqIGRhdGVSYW5nZSgxOTk1LCAxOTk3KVxuICogdHJ1ZSBmcm9tIGJlZ2lubmluZyBvZiB5ZWFyIDE5OTUgdW50aWwgdGhlIGVuZCBvZiB5ZWFyIDE5OTcuXG4gKiBgYGBcbiAqXG4gKiBkYXRlUmFuZ2UoZGF5KVxuICogZGF0ZVJhbmdlKGRheTEsIGRheTIpXG4gKiBkYXRlUmFuZ2UobW9uKVxuICogZGF0ZVJhbmdlKG1vbnRoMSwgbW9udGgyKVxuICogZGF0ZVJhbmdlKHllYXIpXG4gKiBkYXRlUmFuZ2UoeWVhcjEsIHllYXIyKVxuICogZGF0ZVJhbmdlKGRheTEsIG1vbnRoMSwgZGF5MiwgbW9udGgyKVxuICogZGF0ZVJhbmdlKG1vbnRoMSwgeWVhcjEsIG1vbnRoMiwgeWVhcjIpXG4gKiBkYXRlUmFuZ2UoZGF5MSwgbW9udGgxLCB5ZWFyMSwgZGF5MiwgbW9udGgyLCB5ZWFyMilcbiAqIGRhdGVSYW5nZShkYXkxLCBtb250aDEsIHllYXIxLCBkYXkyLCBtb250aDIsIHllYXIyLCBnbXQpXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGRheSBpcyB0aGUgZGF5IG9mIG1vbnRoIGJldHdlZW4gMSBhbmQgMzEgKGFzIGFuIGludGVnZXIpLlxuICogQHBhcmFtIHtTdHJpbmd9IG1vbnRoIGlzIG9uZSBvZiB0aGUgbW9udGggc3RyaW5nczogSkFOIEZFQiBNQVIgQVBSIE1BWSBKVU4gSlVMIEFVRyBTRVAgT0NUIE5PViBERUNcbiAqIEBwYXJhbSB7U3RyaW5nfSB5ZWFyIGlzIHRoZSBmdWxsIHllYXIgbnVtYmVyLCBmb3IgZXhhbXBsZSAxOTk1IChidXQgbm90IDk1KS4gSW50ZWdlci5cbiAqIEBwYXJhbSB7U3RyaW5nfSBnbXQgaXMgZWl0aGVyIHRoZSBzdHJpbmcgXCJHTVRcIiwgd2hpY2ggbWFrZXMgdGltZSBjb21wYXJpc29uIG9jY3VyIGluIEdNVCB0aW1lem9uZTsgaWYgbGVmdCB1bnNwZWNpZmllZCwgdGltZXMgYXJlIHRha2VuIHRvIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIGRhdGVSYW5nZSgpIHtcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbWUhXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZGF0ZVJhbmdlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0ZVJhbmdlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWZmIHRoZSBkb21haW4gb2YgaG9zdG5hbWUgbWF0Y2hlcy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIGRuc0RvbWFpbklzKFwid3d3Lm5ldHNjYXBlLmNvbVwiLCBcIi5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgdHJ1ZS5cbiAqXG4gKiBkbnNEb21haW5JcyhcInd3d1wiLCBcIi5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgZmFsc2UuXG4gKlxuICogZG5zRG9tYWluSXMoXCJ3d3cubWNvbS5jb21cIiwgXCIubmV0c2NhcGUuY29tXCIpXG4gKiAgIC8vIGlzIGZhbHNlLlxuICogYGBgXG4gKlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3N0IGlzIHRoZSBob3N0bmFtZSBmcm9tIHRoZSBVUkwuXG4gKiBAcGFyYW0ge1N0cmluZ30gZG9tYWluIGlzIHRoZSBkb21haW4gbmFtZSB0byB0ZXN0IHRoZSBob3N0bmFtZSBhZ2FpbnN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZmYgdGhlIGRvbWFpbiBvZiB0aGUgaG9zdG5hbWUgbWF0Y2hlcy5cbiAqL1xuZnVuY3Rpb24gZG5zRG9tYWluSXMoaG9zdCwgZG9tYWluKSB7XG4gICAgaG9zdCA9IFN0cmluZyhob3N0KTtcbiAgICBkb21haW4gPSBTdHJpbmcoZG9tYWluKTtcbiAgICByZXR1cm4gaG9zdC5zdWJzdHIoZG9tYWluLmxlbmd0aCAqIC0xKSA9PT0gZG9tYWluO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZG5zRG9tYWluSXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kbnNEb21haW5Jcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIChpbnRlZ2VyKSBvZiBETlMgZG9tYWluIGxldmVscyAobnVtYmVyIG9mIGRvdHMpIGluIHRoZVxuICogaG9zdG5hbWUuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBgIGpzXG4gKiBkbnNEb21haW5MZXZlbHMoXCJ3d3dcIilcbiAqICAgLy8gcmV0dXJucyAwLlxuICogZG5zRG9tYWluTGV2ZWxzKFwid3d3Lm5ldHNjYXBlLmNvbVwiKVxuICogICAvLyByZXR1cm5zIDIuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdCBpcyB0aGUgaG9zdG5hbWUgZnJvbSB0aGUgVVJMLlxuICogQHJldHVybiB7TnVtYmVyfSBudW1iZXIgb2YgZG9tYWluIGxldmVsc1xuICovXG5mdW5jdGlvbiBkbnNEb21haW5MZXZlbHMoaG9zdCkge1xuICAgIGNvbnN0IG1hdGNoID0gU3RyaW5nKGhvc3QpLm1hdGNoKC9cXC4vZyk7XG4gICAgbGV0IGxldmVscyA9IDA7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGxldmVscyA9IG1hdGNoLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGxldmVscztcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGRuc0RvbWFpbkxldmVscztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRuc0RvbWFpbkxldmVscy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG4vKipcbiAqIFJlc29sdmVzIHRoZSBnaXZlbiBETlMgaG9zdG5hbWUgaW50byBhbiBJUCBhZGRyZXNzLCBhbmQgcmV0dXJucyBpdCBpbiB0aGUgZG90XG4gKiBzZXBhcmF0ZWQgZm9ybWF0IGFzIGEgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgIGpzXG4gKiBkbnNSZXNvbHZlKFwiaG9tZS5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gcmV0dXJucyB0aGUgc3RyaW5nIFwiMTk4Ljk1LjI0OS43OVwiLlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhvc3QgaG9zdG5hbWUgdG8gcmVzb2x2ZVxuICogQHJldHVybiB7U3RyaW5nfSByZXNvbHZlZCBJUCBhZGRyZXNzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRuc1Jlc29sdmUoaG9zdCkge1xuICAgIGNvbnN0IGZhbWlseSA9IDQ7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0ICgwLCB1dGlsXzEuZG5zTG9va3VwKShob3N0LCB7IGZhbWlseSB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiByID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBAaWdub3JlXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gZG5zUmVzb2x2ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRuc1Jlc29sdmUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnNhbmRib3ggPSBleHBvcnRzLmNyZWF0ZVBhY1Jlc29sdmVyID0gdm9pZCAwO1xuY29uc3QgZGVnZW5lcmF0b3JfMSA9IHJlcXVpcmUoXCJkZWdlbmVyYXRvclwiKTtcbi8qKlxuICogQnVpbHQtaW4gUEFDIGZ1bmN0aW9ucy5cbiAqL1xuY29uc3QgZGF0ZVJhbmdlXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZGF0ZVJhbmdlXCIpKTtcbmNvbnN0IGRuc0RvbWFpbklzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZG5zRG9tYWluSXNcIikpO1xuY29uc3QgZG5zRG9tYWluTGV2ZWxzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZG5zRG9tYWluTGV2ZWxzXCIpKTtcbmNvbnN0IGRuc1Jlc29sdmVfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9kbnNSZXNvbHZlXCIpKTtcbmNvbnN0IGlzSW5OZXRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9pc0luTmV0XCIpKTtcbmNvbnN0IGlzUGxhaW5Ib3N0TmFtZV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2lzUGxhaW5Ib3N0TmFtZVwiKSk7XG5jb25zdCBpc1Jlc29sdmFibGVfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9pc1Jlc29sdmFibGVcIikpO1xuY29uc3QgbG9jYWxIb3N0T3JEb21haW5Jc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2xvY2FsSG9zdE9yRG9tYWluSXNcIikpO1xuY29uc3QgbXlJcEFkZHJlc3NfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9teUlwQWRkcmVzc1wiKSk7XG5jb25zdCBzaEV4cE1hdGNoXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vc2hFeHBNYXRjaFwiKSk7XG5jb25zdCB0aW1lUmFuZ2VfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90aW1lUmFuZ2VcIikpO1xuY29uc3Qgd2Vla2RheVJhbmdlXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vd2Vla2RheVJhbmdlXCIpKTtcbi8qKlxuICogUmV0dXJucyBhbiBhc3luY2hyb25vdXMgYEZpbmRQcm94eUZvclVSTCgpYCBmdW5jdGlvblxuICogZnJvbSB0aGUgZ2l2ZW4gSlMgc3RyaW5nIChmcm9tIGEgUEFDIGZpbGUpLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQYWNSZXNvbHZlcihxanMsIF9zdHIsIF9vcHRzID0ge30pIHtcbiAgICBjb25zdCBzdHIgPSBCdWZmZXIuaXNCdWZmZXIoX3N0cikgPyBfc3RyLnRvU3RyaW5nKCd1dGY4JykgOiBfc3RyO1xuICAgIC8vIFRoZSBzYW5kYm94IHRvIHVzZSBmb3IgdGhlIGB2bWAgY29udGV4dC5cbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAuLi5leHBvcnRzLnNhbmRib3gsXG4gICAgICAgIC4uLl9vcHRzLnNhbmRib3gsXG4gICAgfTtcbiAgICAvLyBDb25zdHJ1Y3QgdGhlIGFycmF5IG9mIGFzeW5jIGZ1bmN0aW9uIG5hbWVzIHRvIGFkZCBgYXdhaXRgIGNhbGxzIHRvLlxuICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoY29udGV4dCkuZmlsdGVyKChrKSA9PiBpc0FzeW5jRnVuY3Rpb24oY29udGV4dFtrXSkpO1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgIGZpbGVuYW1lOiAncHJveHkucGFjJyxcbiAgICAgICAgbmFtZXMsXG4gICAgICAgIC4uLl9vcHRzLFxuICAgICAgICBzYW5kYm94OiBjb250ZXh0LFxuICAgIH07XG4gICAgLy8gQ29tcGlsZSB0aGUgSlMgYEZpbmRQcm94eUZvclVSTCgpYCBmdW5jdGlvbiBpbnRvIGFuIGFzeW5jIGZ1bmN0aW9uLlxuICAgIGNvbnN0IHJlc29sdmVyID0gKDAsIGRlZ2VuZXJhdG9yXzEuY29tcGlsZSkocWpzLCBzdHIsICdGaW5kUHJveHlGb3JVUkwnLCBvcHRzKTtcbiAgICBmdW5jdGlvbiBGaW5kUHJveHlGb3JVUkwodXJsLCBfaG9zdCkge1xuICAgICAgICBjb25zdCB1cmxPYmogPSB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyA/IG5ldyBVUkwodXJsKSA6IHVybDtcbiAgICAgICAgY29uc3QgaG9zdCA9IF9ob3N0IHx8IHVybE9iai5ob3N0bmFtZTtcbiAgICAgICAgaWYgKCFob3N0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgZGV0ZXJtaW5lIGBob3N0YCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlcih1cmxPYmouaHJlZiwgaG9zdCk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGaW5kUHJveHlGb3JVUkwsICd0b1N0cmluZycsIHtcbiAgICAgICAgdmFsdWU6ICgpID0+IHJlc29sdmVyLnRvU3RyaW5nKCksXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiBGaW5kUHJveHlGb3JVUkw7XG59XG5leHBvcnRzLmNyZWF0ZVBhY1Jlc29sdmVyID0gY3JlYXRlUGFjUmVzb2x2ZXI7XG5leHBvcnRzLnNhbmRib3ggPSBPYmplY3QuZnJlZXplKHtcbiAgICBhbGVydDogKG1lc3NhZ2UgPSAnJykgPT4gY29uc29sZS5sb2coJyVzJywgbWVzc2FnZSksXG4gICAgZGF0ZVJhbmdlOiBkYXRlUmFuZ2VfMS5kZWZhdWx0LFxuICAgIGRuc0RvbWFpbklzOiBkbnNEb21haW5Jc18xLmRlZmF1bHQsXG4gICAgZG5zRG9tYWluTGV2ZWxzOiBkbnNEb21haW5MZXZlbHNfMS5kZWZhdWx0LFxuICAgIGRuc1Jlc29sdmU6IGRuc1Jlc29sdmVfMS5kZWZhdWx0LFxuICAgIGlzSW5OZXQ6IGlzSW5OZXRfMS5kZWZhdWx0LFxuICAgIGlzUGxhaW5Ib3N0TmFtZTogaXNQbGFpbkhvc3ROYW1lXzEuZGVmYXVsdCxcbiAgICBpc1Jlc29sdmFibGU6IGlzUmVzb2x2YWJsZV8xLmRlZmF1bHQsXG4gICAgbG9jYWxIb3N0T3JEb21haW5JczogbG9jYWxIb3N0T3JEb21haW5Jc18xLmRlZmF1bHQsXG4gICAgbXlJcEFkZHJlc3M6IG15SXBBZGRyZXNzXzEuZGVmYXVsdCxcbiAgICBzaEV4cE1hdGNoOiBzaEV4cE1hdGNoXzEuZGVmYXVsdCxcbiAgICB0aW1lUmFuZ2U6IHRpbWVSYW5nZV8xLmRlZmF1bHQsXG4gICAgd2Vla2RheVJhbmdlOiB3ZWVrZGF5UmFuZ2VfMS5kZWZhdWx0LFxufSk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gaXNBc3luY0Z1bmN0aW9uKHYpIHtcbiAgICBpZiAodHlwZW9mIHYgIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBOYXRpdmUgYEFzeW5jRnVuY3Rpb25gXG4gICAgaWYgKHYuY29uc3RydWN0b3IubmFtZSA9PT0gJ0FzeW5jRnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBUeXBlU2NyaXB0IGNvbXBpbGVkXG4gICAgaWYgKFN0cmluZyh2KS5pbmRleE9mKCdfX2F3YWl0ZXIoJykgIT09IC0xKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBMZWdhY3kgYmVoYXZpb3IgLSBzZXQgYGFzeW5jYCBwcm9wZXJ0eSBvbiB0aGUgZnVuY3Rpb25cbiAgICByZXR1cm4gQm9vbGVhbih2LmFzeW5jKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pcCA9IHZvaWQgMDtcbmNvbnN0IG9zXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIm9zXCIpKTtcbmV4cG9ydHMuaXAgPSB7XG4gICAgYWRkcmVzcygpIHtcbiAgICAgICAgY29uc3QgaW50ZXJmYWNlcyA9IG9zXzEuZGVmYXVsdC5uZXR3b3JrSW50ZXJmYWNlcygpO1xuICAgICAgICAvLyBEZWZhdWx0IHRvIGBpcHY0YFxuICAgICAgICBjb25zdCBmYW1pbHkgPSBub3JtYWxpemVGYW1pbHkoKTtcbiAgICAgICAgY29uc3QgYWxsID0gT2JqZWN0LnZhbHVlcyhpbnRlcmZhY2VzKS5tYXAoKGFkZHJzID0gW10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IGFkZHJzLmZpbHRlcigoZGV0YWlscykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHNGYW1pbHkgPSBub3JtYWxpemVGYW1pbHkoZGV0YWlscy5mYW1pbHkpO1xuICAgICAgICAgICAgICAgIGlmIChkZXRhaWxzRmFtaWx5ICE9PSBmYW1pbHkgfHwgZXhwb3J0cy5pcC5pc0xvb3BiYWNrKGRldGFpbHMuYWRkcmVzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3Nlcy5sZW5ndGggPyBhZGRyZXNzZXNbMF0uYWRkcmVzcyA6IHVuZGVmaW5lZDtcbiAgICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICByZXR1cm4gIWFsbC5sZW5ndGggPyBleHBvcnRzLmlwLmxvb3BiYWNrKGZhbWlseSkgOiBhbGxbMF07XG4gICAgfSxcbiAgICBpc0xvb3BiYWNrKGFkZHIpIHtcbiAgICAgICAgcmV0dXJuIC9eKDo6Zns0fTopPzEyN1xcLihbMC05XXsxLDN9KVxcLihbMC05XXsxLDN9KVxcLihbMC05XXsxLDN9KS9cbiAgICAgICAgICAgIC50ZXN0KGFkZHIpXG4gICAgICAgICAgICB8fCAvXmZlODA6OjEkLy50ZXN0KGFkZHIpXG4gICAgICAgICAgICB8fCAvXjo6MSQvLnRlc3QoYWRkcilcbiAgICAgICAgICAgIHx8IC9eOjokLy50ZXN0KGFkZHIpO1xuICAgIH0sXG4gICAgbG9vcGJhY2soZmFtaWx5KSB7XG4gICAgICAgIC8vIERlZmF1bHQgdG8gYGlwdjRgXG4gICAgICAgIGZhbWlseSA9IG5vcm1hbGl6ZUZhbWlseShmYW1pbHkpO1xuICAgICAgICBpZiAoZmFtaWx5ICE9PSAnaXB2NCcgJiYgZmFtaWx5ICE9PSAnaXB2NicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZmFtaWx5IG11c3QgYmUgaXB2NCBvciBpcHY2Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbWlseSA9PT0gJ2lwdjQnID8gJzEyNy4wLjAuMScgOiAnZmU4MDo6MSc7XG4gICAgfVxufTtcbmZ1bmN0aW9uIG5vcm1hbGl6ZUZhbWlseShmYW1pbHkpIHtcbiAgICBpZiAoZmFtaWx5ID09PSA0KSB7XG4gICAgICAgIHJldHVybiAnaXB2NCc7XG4gICAgfVxuICAgIGlmIChmYW1pbHkgPT09IDYpIHtcbiAgICAgICAgcmV0dXJuICdpcHY2JztcbiAgICB9XG4gICAgcmV0dXJuIGZhbWlseSA/IGZhbWlseS50b0xvd2VyQ2FzZSgpIDogJ2lwdjQnO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXAuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBuZXRtYXNrXzEgPSByZXF1aXJlKFwibmV0bWFza1wiKTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG4vKipcbiAqIFRydWUgaWZmIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBJUCBhZGRyZXNzIHBhdHRlcm4uXG4gKlxuICogUGF0dGVybiBhbmQgbWFzayBzcGVjaWZpY2F0aW9uIGlzIGRvbmUgdGhlIHNhbWUgd2F5IGFzIGZvciBTT0NLUyBjb25maWd1cmF0aW9uLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYCBqc1xuICogaXNJbk5ldChob3N0LCBcIjE5OC45NS4yNDkuNzlcIiwgXCIyNTUuMjU1LjI1NS4yNTVcIilcbiAqICAgLy8gaXMgdHJ1ZSBpZmYgdGhlIElQIGFkZHJlc3Mgb2YgaG9zdCBtYXRjaGVzIGV4YWN0bHkgMTk4Ljk1LjI0OS43OS5cbiAqXG4gKiBpc0luTmV0KGhvc3QsIFwiMTk4Ljk1LjAuMFwiLCBcIjI1NS4yNTUuMC4wXCIpXG4gKiAgIC8vIGlzIHRydWUgaWZmIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBob3N0IG1hdGNoZXMgMTk4Ljk1LiouKi5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3N0IGEgRE5TIGhvc3RuYW1lLCBvciBJUCBhZGRyZXNzLiBJZiBhIGhvc3RuYW1lIGlzIHBhc3NlZCxcbiAqICAgaXQgd2lsbCBiZSByZXNvdmVkIGludG8gYW4gSVAgYWRkcmVzcyBieSB0aGlzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gYW4gSVAgYWRkcmVzcyBwYXR0ZXJuIGluIHRoZSBkb3Qtc2VwYXJhdGVkIGZvcm1hdCBtYXNrLlxuICogQHBhcmFtIHtTdHJpbmd9IG1hc2sgZm9yIHRoZSBJUCBhZGRyZXNzIHBhdHRlcm4gaW5mb3JtaW5nIHdoaWNoIHBhcnRzIG9mIHRoZVxuICogICBJUCBhZGRyZXNzIHNob3VsZCBiZSBtYXRjaGVkIGFnYWluc3QuIDAgbWVhbnMgaWdub3JlLCAyNTUgbWVhbnMgbWF0Y2guXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiBpc0luTmV0KGhvc3QsIHBhdHRlcm4sIG1hc2spIHtcbiAgICBjb25zdCBmYW1pbHkgPSA0O1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGlwID0gYXdhaXQgKDAsIHV0aWxfMS5kbnNMb29rdXApKGhvc3QsIHsgZmFtaWx5IH0pO1xuICAgICAgICBpZiAodHlwZW9mIGlwID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgbmV0bWFzayA9IG5ldyBuZXRtYXNrXzEuTmV0bWFzayhwYXR0ZXJuLCBtYXNrKTtcbiAgICAgICAgICAgIHJldHVybiBuZXRtYXNrLmNvbnRhaW5zKGlwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBpc0luTmV0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNJbk5ldC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogVHJ1ZSBpZmYgdGhlcmUgaXMgbm8gZG9tYWluIG5hbWUgaW4gdGhlIGhvc3RuYW1lIChubyBkb3RzKS5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIGlzUGxhaW5Ib3N0TmFtZShcInd3d1wiKVxuICogICAvLyBpcyB0cnVlLlxuICpcbiAqIGlzUGxhaW5Ib3N0TmFtZShcInd3dy5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgZmFsc2UuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdCBUaGUgaG9zdG5hbWUgZnJvbSB0aGUgVVJMIChleGNsdWRpbmcgcG9ydCBudW1iZXIpLlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZnVuY3Rpb24gaXNQbGFpbkhvc3ROYW1lKGhvc3QpIHtcbiAgICByZXR1cm4gIS9cXC4vLnRlc3QoaG9zdCk7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBpc1BsYWluSG9zdE5hbWU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pc1BsYWluSG9zdE5hbWUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuLyoqXG4gKiBUcmllcyB0byByZXNvbHZlIHRoZSBob3N0bmFtZS4gUmV0dXJucyB0cnVlIGlmIHN1Y2NlZWRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBob3N0IGlzIHRoZSBob3N0bmFtZSBmcm9tIHRoZSBVUkwuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiBpc1Jlc29sdmFibGUoaG9zdCkge1xuICAgIGNvbnN0IGZhbWlseSA9IDQ7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGF3YWl0ICgwLCB1dGlsXzEuZG5zTG9va3VwKShob3N0LCB7IGZhbWlseSB9KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBpZ25vcmVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gaXNSZXNvbHZhYmxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXNSZXNvbHZhYmxlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqXG4gKiBJcyB0cnVlIGlmIHRoZSBob3N0bmFtZSBtYXRjaGVzIGV4YWN0bHkgdGhlIHNwZWNpZmllZCBob3N0bmFtZSwgb3IgaWYgdGhlcmUgaXNcbiAqIG5vIGRvbWFpbiBuYW1lIHBhcnQgaW4gdGhlIGhvc3RuYW1lLCBidXQgdGhlIHVucXVhbGlmaWVkIGhvc3RuYW1lIG1hdGNoZXMuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBgIGpzXG4gKiBsb2NhbEhvc3RPckRvbWFpbklzKFwid3d3Lm5ldHNjYXBlLmNvbVwiLCBcInd3dy5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgdHJ1ZSAoZXhhY3QgbWF0Y2gpLlxuICpcbiAqIGxvY2FsSG9zdE9yRG9tYWluSXMoXCJ3d3dcIiwgXCJ3d3cubmV0c2NhcGUuY29tXCIpXG4gKiAgIC8vIGlzIHRydWUgKGhvc3RuYW1lIG1hdGNoLCBkb21haW4gbm90IHNwZWNpZmllZCkuXG4gKlxuICogbG9jYWxIb3N0T3JEb21haW5JcyhcInd3dy5tY29tLmNvbVwiLCBcInd3dy5uZXRzY2FwZS5jb21cIilcbiAqICAgLy8gaXMgZmFsc2UgKGRvbWFpbiBuYW1lIG1pc21hdGNoKS5cbiAqXG4gKiBsb2NhbEhvc3RPckRvbWFpbklzKFwiaG9tZS5uZXRzY2FwZS5jb21cIiwgXCJ3d3cubmV0c2NhcGUuY29tXCIpXG4gKiAgIC8vIGlzIGZhbHNlIChob3N0bmFtZSBtaXNtYXRjaCkuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaG9zdCB0aGUgaG9zdG5hbWUgZnJvbSB0aGUgVVJMLlxuICogQHBhcmFtIHtTdHJpbmd9IGhvc3Rkb20gZnVsbHkgcXVhbGlmaWVkIGhvc3RuYW1lIHRvIG1hdGNoIGFnYWluc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBsb2NhbEhvc3RPckRvbWFpbklzKGhvc3QsIGhvc3Rkb20pIHtcbiAgICBjb25zdCBwYXJ0cyA9IGhvc3Quc3BsaXQoJy4nKTtcbiAgICBjb25zdCBkb21wYXJ0cyA9IGhvc3Rkb20uc3BsaXQoJy4nKTtcbiAgICBsZXQgbWF0Y2hlcyA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGFydHNbaV0gIT09IGRvbXBhcnRzW2ldKSB7XG4gICAgICAgICAgICBtYXRjaGVzID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlcztcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IGxvY2FsSG9zdE9yRG9tYWluSXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2NhbEhvc3RPckRvbWFpbklzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgaXBfMSA9IHJlcXVpcmUoXCIuL2lwXCIpO1xuY29uc3QgbmV0XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIm5ldFwiKSk7XG4vKipcbiAqIFJldHVybnMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdGhhdCB0aGUgTmF2aWdhdG9yIGlzIHJ1bm5pbmcgb24sIGFzXG4gKiBhIHN0cmluZyBpbiB0aGUgZG90LXNlcGFyYXRlZCBpbnRlZ2VyIGZvcm1hdC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYCBqc1xuICogbXlJcEFkZHJlc3MoKVxuICogICAvLyB3b3VsZCByZXR1cm4gdGhlIHN0cmluZyBcIjE5OC45NS4yNDkuNzlcIiBpZiB5b3Ugd2VyZSBydW5uaW5nIHRoZVxuICogICAvLyBOYXZpZ2F0b3Igb24gdGhhdCBob3N0LlxuICogYGBgXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSBleHRlcm5hbCBJUCBhZGRyZXNzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG15SXBBZGRyZXNzKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8vIDguOC44Ljg6NTMgaXMgXCJHb29nbGUgUHVibGljIEROU1wiOlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zcGVlZC9wdWJsaWMtZG5zL1xuICAgICAgICBjb25zdCBzb2NrZXQgPSBuZXRfMS5kZWZhdWx0LmNvbm5lY3QoeyBob3N0OiAnOC44LjguOCcsIHBvcnQ6IDUzIH0pO1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gaWYgd2UgZmFpbCB0byBhY2Nlc3MgR29vZ2xlIEROUyAoYXMgaW4gZmlyZXdhbGwgYmxvY2tzIGFjY2VzcyksXG4gICAgICAgICAgICAvLyBmYWxsYmFjayB0byBxdWVyeWluZyBJUCBsb2NhbGx5XG4gICAgICAgICAgICByZXNvbHZlKGlwXzEuaXAuYWRkcmVzcygpKTtcbiAgICAgICAgfTtcbiAgICAgICAgc29ja2V0Lm9uY2UoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIHNvY2tldC5vbmNlKCdjb25uZWN0JywgKCkgPT4ge1xuICAgICAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICAgICAgY29uc3QgYWRkciA9IHNvY2tldC5hZGRyZXNzKCk7XG4gICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhZGRyID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoYWRkcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhZGRyLmFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGFkZHIuYWRkcmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdFeHBlY3RlZCBhIGBzdHJpbmdgJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IG15SXBBZGRyZXNzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bXlJcEFkZHJlc3MuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBzaGVsbFxuICogZXhwcmVzc2lvbi5cbiAqXG4gKiBBY3R1YWxseSwgY3VycmVudGx5IHRoZSBwYXR0ZXJucyBhcmUgc2hlbGwgZXhwcmVzc2lvbnMsXG4gKiBub3QgcmVndWxhciBleHByZXNzaW9ucy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiBgYGAganNcbiAqIHNoRXhwTWF0Y2goXCJodHRwOi8vaG9tZS5uZXRzY2FwZS5jb20vcGVvcGxlL2FyaS9pbmRleC5odG1sXCIsIFwiKlxcL2FyaS8qXCIpXG4gKiAgIC8vIGlzIHRydWUuXG4gKlxuICogc2hFeHBNYXRjaChcImh0dHA6Ly9ob21lLm5ldHNjYXBlLmNvbS9wZW9wbGUvbW9udHVsbGkvaW5kZXguaHRtbFwiLCBcIipcXC9hcmkvKlwiKVxuICogICAvLyBpcyBmYWxzZS5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgaXMgYW55IHN0cmluZyB0byBjb21wYXJlIChlLmcuIHRoZSBVUkwsIG9yIHRoZSBob3N0bmFtZSkuXG4gKiBAcGFyYW0ge1N0cmluZ30gc2hleHAgaXMgYSBzaGVsbCBleHByZXNzaW9uIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIHN0cmluZyBtYXRjaGVzIHRoZSBzaGVsbCBleHByZXNzaW9uLlxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiBzaEV4cE1hdGNoKHN0ciwgc2hleHApIHtcbiAgICBjb25zdCByZSA9IHRvUmVnRXhwKHNoZXhwKTtcbiAgICByZXR1cm4gcmUudGVzdChzdHIpO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gc2hFeHBNYXRjaDtcbi8qKlxuICogQ29udmVydHMgYSBcInNoZWxsIGV4cHJlc3Npb25cIiB0byBhIEphdmFTY3JpcHQgUmVnRXhwLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0b1JlZ0V4cChzdHIpIHtcbiAgICBzdHIgPSBTdHJpbmcoc3RyKVxuICAgICAgICAucmVwbGFjZSgvXFwuL2csICdcXFxcLicpXG4gICAgICAgIC5yZXBsYWNlKC9cXD8vZywgJy4nKVxuICAgICAgICAucmVwbGFjZSgvXFwqL2csICcuKicpO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHtzdHJ9JGApO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hFeHBNYXRjaC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogVHJ1ZSBkdXJpbmcgKG9yIGJldHdlZW4pIHRoZSBzcGVjaWZpZWQgdGltZShzKS5cbiAqXG4gKiBFdmVuIHRob3VnaCB0aGUgZXhhbXBsZXMgZG9uJ3Qgc2hvdyBpdCwgdGhpcyBwYXJhbWV0ZXIgbWF5IGJlIHByZXNlbnQgaW5cbiAqIGVhY2ggb2YgdGhlIGRpZmZlcmVudCBwYXJhbWV0ZXIgcHJvZmlsZXMsIGFsd2F5cyBhcyB0aGUgbGFzdCBwYXJhbWV0ZXIuXG4gKlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqIGBgYCBqc1xuICogdGltZXJhbmdlKDEyKVxuICogdHJ1ZSBmcm9tIG5vb24gdG8gMXBtLlxuICpcbiAqIHRpbWVyYW5nZSgxMiwgMTMpXG4gKiBzYW1lIGFzIGFib3ZlLlxuICpcbiAqIHRpbWVyYW5nZSgxMiwgXCJHTVRcIilcbiAqIHRydWUgZnJvbSBub29uIHRvIDFwbSwgaW4gR01UIHRpbWV6b25lLlxuICpcbiAqIHRpbWVyYW5nZSg5LCAxNylcbiAqIHRydWUgZnJvbSA5YW0gdG8gNXBtLlxuICpcbiAqIHRpbWVyYW5nZSg4LCAzMCwgMTcsIDAwKVxuICogdHJ1ZSBmcm9tIDg6MzBhbSB0byA1OjAwcG0uXG4gKlxuICogdGltZXJhbmdlKDAsIDAsIDAsIDAsIDAsIDMwKVxuICogdHJ1ZSBiZXR3ZWVuIG1pZG5pZ2h0IGFuZCAzMCBzZWNvbmRzIHBhc3QgbWlkbmlnaHQuXG4gKiBgYGBcbiAqXG4gKiB0aW1lUmFuZ2UoaG91cilcbiAqIHRpbWVSYW5nZShob3VyMSwgaG91cjIpXG4gKiB0aW1lUmFuZ2UoaG91cjEsIG1pbjEsIGhvdXIyLCBtaW4yKVxuICogdGltZVJhbmdlKGhvdXIxLCBtaW4xLCBzZWMxLCBob3VyMiwgbWluMiwgc2VjMilcbiAqIHRpbWVSYW5nZShob3VyMSwgbWluMSwgc2VjMSwgaG91cjIsIG1pbjIsIHNlYzIsIGdtdClcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaG91ciBpcyB0aGUgaG91ciBmcm9tIDAgdG8gMjMuICgwIGlzIG1pZG5pZ2h0LCAyMyBpcyAxMSBwbS4pXG4gKiBAcGFyYW0ge1N0cmluZ30gbWluIG1pbnV0ZXMgZnJvbSAwIHRvIDU5LlxuICogQHBhcmFtIHtTdHJpbmd9IHNlYyBzZWNvbmRzIGZyb20gMCB0byA1OS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBnbXQgZWl0aGVyIHRoZSBzdHJpbmcgXCJHTVRcIiBmb3IgR01UIHRpbWV6b25lLCBvciBub3Qgc3BlY2lmaWVkLCBmb3IgbG9jYWwgdGltZXpvbmUuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiB0aW1lUmFuZ2UoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGNvbnN0IGxhc3RBcmcgPSBhcmdzLnBvcCgpO1xuICAgIGNvbnN0IHVzZUdNVHpvbmUgPSBsYXN0QXJnID09PSAnR01UJztcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgaWYgKCF1c2VHTVR6b25lKSB7XG4gICAgICAgIGFyZ3MucHVzaChsYXN0QXJnKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgIGNvbnN0IG5vT2ZBcmdzID0gYXJncy5sZW5ndGg7XG4gICAgY29uc3QgbnVtZXJpY0FyZ3MgPSBhcmdzLm1hcCgobikgPT4gcGFyc2VJbnQobiwgMTApKTtcbiAgICAvLyB0aW1lUmFuZ2UoaG91cilcbiAgICBpZiAobm9PZkFyZ3MgPT09IDEpIHtcbiAgICAgICAgcmVzdWx0ID0gZ2V0Q3VycmVudEhvdXIodXNlR01Uem9uZSwgY3VycmVudERhdGUpID09PSBudW1lcmljQXJnc1swXTtcbiAgICAgICAgLy8gdGltZVJhbmdlKGhvdXIxLCBob3VyMilcbiAgICB9XG4gICAgZWxzZSBpZiAobm9PZkFyZ3MgPT09IDIpIHtcbiAgICAgICAgY29uc3QgY3VycmVudEhvdXIgPSBnZXRDdXJyZW50SG91cih1c2VHTVR6b25lLCBjdXJyZW50RGF0ZSk7XG4gICAgICAgIHJlc3VsdCA9IG51bWVyaWNBcmdzWzBdIDw9IGN1cnJlbnRIb3VyICYmIGN1cnJlbnRIb3VyIDwgbnVtZXJpY0FyZ3NbMV07XG4gICAgICAgIC8vIHRpbWVSYW5nZShob3VyMSwgbWluMSwgaG91cjIsIG1pbjIpXG4gICAgfVxuICAgIGVsc2UgaWYgKG5vT2ZBcmdzID09PSA0KSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlSW5SYW5nZShzZWNvbmRzRWxhcHNlZFRvZGF5KG51bWVyaWNBcmdzWzBdLCBudW1lcmljQXJnc1sxXSwgMCksIHNlY29uZHNFbGFwc2VkVG9kYXkoZ2V0Q3VycmVudEhvdXIodXNlR01Uem9uZSwgY3VycmVudERhdGUpLCBnZXRDdXJyZW50TWludXRlKHVzZUdNVHpvbmUsIGN1cnJlbnREYXRlKSwgMCksIHNlY29uZHNFbGFwc2VkVG9kYXkobnVtZXJpY0FyZ3NbMl0sIG51bWVyaWNBcmdzWzNdLCA1OSkpO1xuICAgICAgICAvLyB0aW1lUmFuZ2UoaG91cjEsIG1pbjEsIHNlYzEsIGhvdXIyLCBtaW4yLCBzZWMyKVxuICAgIH1cbiAgICBlbHNlIGlmIChub09mQXJncyA9PT0gNikge1xuICAgICAgICByZXN1bHQgPSB2YWx1ZUluUmFuZ2Uoc2Vjb25kc0VsYXBzZWRUb2RheShudW1lcmljQXJnc1swXSwgbnVtZXJpY0FyZ3NbMV0sIG51bWVyaWNBcmdzWzJdKSwgc2Vjb25kc0VsYXBzZWRUb2RheShnZXRDdXJyZW50SG91cih1c2VHTVR6b25lLCBjdXJyZW50RGF0ZSksIGdldEN1cnJlbnRNaW51dGUodXNlR01Uem9uZSwgY3VycmVudERhdGUpLCBnZXRDdXJyZW50U2Vjb25kKHVzZUdNVHpvbmUsIGN1cnJlbnREYXRlKSksIHNlY29uZHNFbGFwc2VkVG9kYXkobnVtZXJpY0FyZ3NbM10sIG51bWVyaWNBcmdzWzRdLCBudW1lcmljQXJnc1s1XSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0cy5kZWZhdWx0ID0gdGltZVJhbmdlO1xuZnVuY3Rpb24gc2Vjb25kc0VsYXBzZWRUb2RheShoaCwgbW0sIHNzKSB7XG4gICAgcmV0dXJuIGhoICogMzYwMCArIG1tICogNjAgKyBzcztcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRIb3VyKGdtdCwgY3VycmVudERhdGUpIHtcbiAgICByZXR1cm4gZ210ID8gY3VycmVudERhdGUuZ2V0VVRDSG91cnMoKSA6IGN1cnJlbnREYXRlLmdldEhvdXJzKCk7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50TWludXRlKGdtdCwgY3VycmVudERhdGUpIHtcbiAgICByZXR1cm4gZ210ID8gY3VycmVudERhdGUuZ2V0VVRDTWludXRlcygpIDogY3VycmVudERhdGUuZ2V0TWludXRlcygpO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudFNlY29uZChnbXQsIGN1cnJlbnREYXRlKSB7XG4gICAgcmV0dXJuIGdtdCA/IGN1cnJlbnREYXRlLmdldFVUQ1NlY29uZHMoKSA6IGN1cnJlbnREYXRlLmdldFNlY29uZHMoKTtcbn1cbi8vIHN0YXJ0IDw9IHZhbHVlIDw9IGZpbmlzaFxuZnVuY3Rpb24gdmFsdWVJblJhbmdlKHN0YXJ0LCB2YWx1ZSwgZmluaXNoKSB7XG4gICAgcmV0dXJuIHN0YXJ0IDw9IHZhbHVlICYmIHZhbHVlIDw9IGZpbmlzaDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRpbWVSYW5nZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNHTVQgPSBleHBvcnRzLmRuc0xvb2t1cCA9IHZvaWQgMDtcbmNvbnN0IGRuc18xID0gcmVxdWlyZShcImRuc1wiKTtcbmZ1bmN0aW9uIGRuc0xvb2t1cChob3N0LCBvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgKDAsIGRuc18xLmxvb2t1cCkoaG9zdCwgb3B0cywgKGVyciwgcmVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5kbnNMb29rdXAgPSBkbnNMb29rdXA7XG5mdW5jdGlvbiBpc0dNVCh2KSB7XG4gICAgcmV0dXJuIHYgPT09ICdHTVQnO1xufVxuZXhwb3J0cy5pc0dNVCA9IGlzR01UO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuL3V0aWxcIik7XG5jb25zdCB3ZWVrZGF5cyA9IFsnU1VOJywgJ01PTicsICdUVUUnLCAnV0VEJywgJ1RIVScsICdGUkknLCAnU0FUJ107XG4vKipcbiAqIE9ubHkgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBtYW5kYXRvcnkuIEVpdGhlciB0aGUgc2Vjb25kLCB0aGUgdGhpcmQsIG9yIGJvdGhcbiAqIG1heSBiZSBsZWZ0IG91dC5cbiAqXG4gKiBJZiBvbmx5IG9uZSBwYXJhbWV0ZXIgaXMgcHJlc2VudCwgdGhlIGZ1bmN0aW9uIHllaWxkcyBhIHRydWUgdmFsdWUgb24gdGhlXG4gKiB3ZWVrZGF5IHRoYXQgdGhlIHBhcmFtZXRlciByZXByZXNlbnRzLiBJZiB0aGUgc3RyaW5nIFwiR01UXCIgaXMgc3BlY2lmaWVkIGFzXG4gKiBhIHNlY29uZCBwYXJhbWV0ZXIsIHRpbWVzIGFyZSB0YWtlbiB0byBiZSBpbiBHTVQsIG90aGVyd2lzZSBpbiBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBJZiBib3RoIHdkMSBhbmQgd2QxIGFyZSBkZWZpbmVkLCB0aGUgY29uZGl0aW9uIGlzIHRydWUgaWYgdGhlIGN1cnJlbnQgd2Vla2RheVxuICogaXMgaW4gYmV0d2VlbiB0aG9zZSB0d28gd2Vla2RheXMuIEJvdW5kcyBhcmUgaW5jbHVzaXZlLiBJZiB0aGUgXCJHTVRcIiBwYXJhbWV0ZXJcbiAqIGlzIHNwZWNpZmllZCwgdGltZXMgYXJlIHRha2VuIHRvIGJlIGluIEdNVCwgb3RoZXJ3aXNlIHRoZSBsb2NhbCB0aW1lem9uZSBpc1xuICogdXNlZC5cbiAqXG4gKiBWYWxpZCBcIndlZWtkYXkgc3RyaW5nc1wiIGFyZTpcbiAqXG4gKiAgICAgU1VOIE1PTiBUVUUgV0VEIFRIVSBGUkkgU0FUXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogYGBgIGpzXG4gKiB3ZWVrZGF5UmFuZ2UoXCJNT05cIiwgXCJGUklcIilcbiAqIHRydWUgTW9uZGF5IHRyaG91Z2ggRnJpZGF5IChsb2NhbCB0aW1lem9uZSkuXG4gKlxuICogd2Vla2RheVJhbmdlKFwiTU9OXCIsIFwiRlJJXCIsIFwiR01UXCIpXG4gKiBzYW1lIGFzIGFib3ZlLCBidXQgR01UIHRpbWV6b25lLlxuICpcbiAqIHdlZWtkYXlSYW5nZShcIlNBVFwiKVxuICogdHJ1ZSBvbiBTYXR1cmRheXMgbG9jYWwgdGltZS5cbiAqXG4gKiB3ZWVrZGF5UmFuZ2UoXCJTQVRcIiwgXCJHTVRcIilcbiAqIHRydWUgb24gU2F0dXJkYXlzIEdNVCB0aW1lLlxuICpcbiAqIHdlZWtkYXlSYW5nZShcIkZSSVwiLCBcIk1PTlwiKVxuICogdHJ1ZSBGcmlkYXkgdGhyb3VnaCBNb25kYXkgKG5vdGUsIG9yZGVyIGRvZXMgbWF0dGVyISkuXG4gKiBgYGBcbiAqXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHdkMSBvbmUgb2YgdGhlIHdlZWtkYXkgc3RyaW5ncy5cbiAqIEBwYXJhbSB7U3RyaW5nfSB3ZDIgb25lIG9mIHRoZSB3ZWVrZGF5IHN0cmluZ3MuXG4gKiBAcGFyYW0ge1N0cmluZ30gZ210IGlzIGVpdGhlciB0aGUgc3RyaW5nOiBHTVQgb3IgaXMgbGVmdCBvdXQuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiB3ZWVrZGF5UmFuZ2Uod2QxLCB3ZDIsIGdtdCkge1xuICAgIGxldCB1c2VHTVR6b25lID0gZmFsc2U7XG4gICAgbGV0IHdkMUluZGV4ID0gLTE7XG4gICAgbGV0IHdkMkluZGV4ID0gLTE7XG4gICAgbGV0IHdkMklzR210ID0gZmFsc2U7XG4gICAgaWYgKCgwLCB1dGlsXzEuaXNHTVQpKGdtdCkpIHtcbiAgICAgICAgdXNlR01Uem9uZSA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKCgwLCB1dGlsXzEuaXNHTVQpKHdkMikpIHtcbiAgICAgICAgdXNlR01Uem9uZSA9IHRydWU7XG4gICAgICAgIHdkMklzR210ID0gdHJ1ZTtcbiAgICB9XG4gICAgd2QxSW5kZXggPSB3ZWVrZGF5cy5pbmRleE9mKHdkMSk7XG4gICAgaWYgKCF3ZDJJc0dtdCAmJiBpc1dlZWtkYXkod2QyKSkge1xuICAgICAgICB3ZDJJbmRleCA9IHdlZWtkYXlzLmluZGV4T2Yod2QyKTtcbiAgICB9XG4gICAgY29uc3QgdG9kYXlzRGF5ID0gZ2V0VG9kYXlzRGF5KHVzZUdNVHpvbmUpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKHdkMkluZGV4IDwgMCkge1xuICAgICAgICByZXN1bHQgPSB0b2RheXNEYXkgPT09IHdkMUluZGV4O1xuICAgIH1cbiAgICBlbHNlIGlmICh3ZDFJbmRleCA8PSB3ZDJJbmRleCkge1xuICAgICAgICByZXN1bHQgPSB2YWx1ZUluUmFuZ2Uod2QxSW5kZXgsIHRvZGF5c0RheSwgd2QySW5kZXgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgIHZhbHVlSW5SYW5nZSh3ZDFJbmRleCwgdG9kYXlzRGF5LCA2KSB8fFxuICAgICAgICAgICAgICAgIHZhbHVlSW5SYW5nZSgwLCB0b2RheXNEYXksIHdkMkluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydHMuZGVmYXVsdCA9IHdlZWtkYXlSYW5nZTtcbmZ1bmN0aW9uIGdldFRvZGF5c0RheShnbXQpIHtcbiAgICByZXR1cm4gZ210ID8gbmV3IERhdGUoKS5nZXRVVENEYXkoKSA6IG5ldyBEYXRlKCkuZ2V0RGF5KCk7XG59XG4vLyBzdGFydCA8PSB2YWx1ZSA8PSBmaW5pc2hcbmZ1bmN0aW9uIHZhbHVlSW5SYW5nZShzdGFydCwgdmFsdWUsIGZpbmlzaCkge1xuICAgIHJldHVybiBzdGFydCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBmaW5pc2g7XG59XG5mdW5jdGlvbiBpc1dlZWtkYXkodikge1xuICAgIGlmICghdilcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB3ZWVrZGF5cy5pbmNsdWRlcyh2KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlZWtkYXlSYW5nZS5qcy5tYXAiLCJtb2R1bGUuZXhwb3J0cyA9IFBlbmQ7XG5cbmZ1bmN0aW9uIFBlbmQoKSB7XG4gIHRoaXMucGVuZGluZyA9IDA7XG4gIHRoaXMubWF4ID0gSW5maW5pdHk7XG4gIHRoaXMubGlzdGVuZXJzID0gW107XG4gIHRoaXMud2FpdGluZyA9IFtdO1xuICB0aGlzLmVycm9yID0gbnVsbDtcbn1cblxuUGVuZC5wcm90b3R5cGUuZ28gPSBmdW5jdGlvbihmbikge1xuICBpZiAodGhpcy5wZW5kaW5nIDwgdGhpcy5tYXgpIHtcbiAgICBwZW5kR28odGhpcywgZm4pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMud2FpdGluZy5wdXNoKGZuKTtcbiAgfVxufTtcblxuUGVuZC5wcm90b3R5cGUud2FpdCA9IGZ1bmN0aW9uKGNiKSB7XG4gIGlmICh0aGlzLnBlbmRpbmcgPT09IDApIHtcbiAgICBjYih0aGlzLmVycm9yKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGNiKTtcbiAgfVxufTtcblxuUGVuZC5wcm90b3R5cGUuaG9sZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcGVuZEhvbGQodGhpcyk7XG59O1xuXG5mdW5jdGlvbiBwZW5kSG9sZChzZWxmKSB7XG4gIHNlbGYucGVuZGluZyArPSAxO1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBvbkNiO1xuICBmdW5jdGlvbiBvbkNiKGVycikge1xuICAgIGlmIChjYWxsZWQpIHRocm93IG5ldyBFcnJvcihcImNhbGxiYWNrIGNhbGxlZCB0d2ljZVwiKTtcbiAgICBjYWxsZWQgPSB0cnVlO1xuICAgIHNlbGYuZXJyb3IgPSBzZWxmLmVycm9yIHx8IGVycjtcbiAgICBzZWxmLnBlbmRpbmcgLT0gMTtcbiAgICBpZiAoc2VsZi53YWl0aW5nLmxlbmd0aCA+IDAgJiYgc2VsZi5wZW5kaW5nIDwgc2VsZi5tYXgpIHtcbiAgICAgIHBlbmRHbyhzZWxmLCBzZWxmLndhaXRpbmcuc2hpZnQoKSk7XG4gICAgfSBlbHNlIGlmIChzZWxmLnBlbmRpbmcgPT09IDApIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMgPSBzZWxmLmxpc3RlbmVycztcbiAgICAgIHNlbGYubGlzdGVuZXJzID0gW107XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaChjYkxpc3RlbmVyKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gY2JMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgIGxpc3RlbmVyKHNlbGYuZXJyb3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlbmRHbyhzZWxmLCBmbikge1xuICBmbihwZW5kSG9sZChzZWxmKSk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL25vZGUtcHJvZ3Jlc3MnKTtcbiIsIi8qIVxuICogbm9kZS1wcm9ncmVzc1xuICogQ29weXJpZ2h0KGMpIDIwMTEgVEogSG9sb3dheWNodWsgPHRqQHZpc2lvbi1tZWRpYS5jYT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogRXhwb3NlIGBQcm9ncmVzc0JhcmAuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gUHJvZ3Jlc3NCYXI7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIGBQcm9ncmVzc0JhcmAgd2l0aCB0aGUgZ2l2ZW4gYGZtdGAgc3RyaW5nIGFuZCBgb3B0aW9uc2Agb3JcbiAqIGB0b3RhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgIC0gYGN1cnJgIGN1cnJlbnQgY29tcGxldGVkIGluZGV4XG4gKiAgIC0gYHRvdGFsYCB0b3RhbCBudW1iZXIgb2YgdGlja3MgdG8gY29tcGxldGVcbiAqICAgLSBgd2lkdGhgIHRoZSBkaXNwbGF5ZWQgd2lkdGggb2YgdGhlIHByb2dyZXNzIGJhciBkZWZhdWx0aW5nIHRvIHRvdGFsXG4gKiAgIC0gYHN0cmVhbWAgdGhlIG91dHB1dCBzdHJlYW0gZGVmYXVsdGluZyB0byBzdGRlcnJcbiAqICAgLSBgaGVhZGAgaGVhZCBjaGFyYWN0ZXIgZGVmYXVsdGluZyB0byBjb21wbGV0ZSBjaGFyYWN0ZXJcbiAqICAgLSBgY29tcGxldGVgIGNvbXBsZXRpb24gY2hhcmFjdGVyIGRlZmF1bHRpbmcgdG8gXCI9XCJcbiAqICAgLSBgaW5jb21wbGV0ZWAgaW5jb21wbGV0ZSBjaGFyYWN0ZXIgZGVmYXVsdGluZyB0byBcIi1cIlxuICogICAtIGByZW5kZXJUaHJvdHRsZWAgbWluaW11bSB0aW1lIGJldHdlZW4gdXBkYXRlcyBpbiBtaWxsaXNlY29uZHMgZGVmYXVsdGluZyB0byAxNlxuICogICAtIGBjYWxsYmFja2Agb3B0aW9uYWwgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBwcm9ncmVzcyBiYXIgY29tcGxldGVzXG4gKiAgIC0gYGNsZWFyYCB3aWxsIGNsZWFyIHRoZSBwcm9ncmVzcyBiYXIgdXBvbiB0ZXJtaW5hdGlvblxuICpcbiAqIFRva2VuczpcbiAqXG4gKiAgIC0gYDpiYXJgIHRoZSBwcm9ncmVzcyBiYXIgaXRzZWxmXG4gKiAgIC0gYDpjdXJyZW50YCBjdXJyZW50IHRpY2sgbnVtYmVyXG4gKiAgIC0gYDp0b3RhbGAgdG90YWwgdGlja3NcbiAqICAgLSBgOmVsYXBzZWRgIHRpbWUgZWxhcHNlZCBpbiBzZWNvbmRzXG4gKiAgIC0gYDpwZXJjZW50YCBjb21wbGV0aW9uIHBlcmNlbnRhZ2VcbiAqICAgLSBgOmV0YWAgZXRhIGluIHNlY29uZHNcbiAqICAgLSBgOnJhdGVgIHJhdGUgb2YgdGlja3MgcGVyIHNlY29uZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbXRcbiAqIEBwYXJhbSB7b2JqZWN0fG51bWJlcn0gb3B0aW9ucyBvciB0b3RhbFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBQcm9ncmVzc0JhcihmbXQsIG9wdGlvbnMpIHtcbiAgdGhpcy5zdHJlYW0gPSBvcHRpb25zLnN0cmVhbSB8fCBwcm9jZXNzLnN0ZGVycjtcblxuICBpZiAodHlwZW9mKG9wdGlvbnMpID09ICdudW1iZXInKSB7XG4gICAgdmFyIHRvdGFsID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gICAgb3B0aW9ucy50b3RhbCA9IHRvdGFsO1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgZm10KSB0aHJvdyBuZXcgRXJyb3IoJ2Zvcm1hdCByZXF1aXJlZCcpO1xuICAgIGlmICgnbnVtYmVyJyAhPSB0eXBlb2Ygb3B0aW9ucy50b3RhbCkgdGhyb3cgbmV3IEVycm9yKCd0b3RhbCByZXF1aXJlZCcpO1xuICB9XG5cbiAgdGhpcy5mbXQgPSBmbXQ7XG4gIHRoaXMuY3VyciA9IG9wdGlvbnMuY3VyciB8fCAwO1xuICB0aGlzLnRvdGFsID0gb3B0aW9ucy50b3RhbDtcbiAgdGhpcy53aWR0aCA9IG9wdGlvbnMud2lkdGggfHwgdGhpcy50b3RhbDtcbiAgdGhpcy5jbGVhciA9IG9wdGlvbnMuY2xlYXJcbiAgdGhpcy5jaGFycyA9IHtcbiAgICBjb21wbGV0ZSAgIDogb3B0aW9ucy5jb21wbGV0ZSB8fCAnPScsXG4gICAgaW5jb21wbGV0ZSA6IG9wdGlvbnMuaW5jb21wbGV0ZSB8fCAnLScsXG4gICAgaGVhZCAgICAgICA6IG9wdGlvbnMuaGVhZCB8fCAob3B0aW9ucy5jb21wbGV0ZSB8fCAnPScpXG4gIH07XG4gIHRoaXMucmVuZGVyVGhyb3R0bGUgPSBvcHRpb25zLnJlbmRlclRocm90dGxlICE9PSAwID8gKG9wdGlvbnMucmVuZGVyVGhyb3R0bGUgfHwgMTYpIDogMDtcbiAgdGhpcy5sYXN0UmVuZGVyID0gLUluZmluaXR5O1xuICB0aGlzLmNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7fTtcbiAgdGhpcy50b2tlbnMgPSB7fTtcbiAgdGhpcy5sYXN0RHJhdyA9ICcnO1xufVxuXG4vKipcbiAqIFwidGlja1wiIHRoZSBwcm9ncmVzcyBiYXIgd2l0aCBvcHRpb25hbCBgbGVuYCBhbmQgb3B0aW9uYWwgYHRva2Vuc2AuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8b2JqZWN0fSBsZW4gb3IgdG9rZW5zXG4gKiBAcGFyYW0ge29iamVjdH0gdG9rZW5zXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblByb2dyZXNzQmFyLnByb3RvdHlwZS50aWNrID0gZnVuY3Rpb24obGVuLCB0b2tlbnMpe1xuICBpZiAobGVuICE9PSAwKVxuICAgIGxlbiA9IGxlbiB8fCAxO1xuXG4gIC8vIHN3YXAgdG9rZW5zXG4gIGlmICgnb2JqZWN0JyA9PSB0eXBlb2YgbGVuKSB0b2tlbnMgPSBsZW4sIGxlbiA9IDE7XG4gIGlmICh0b2tlbnMpIHRoaXMudG9rZW5zID0gdG9rZW5zO1xuXG4gIC8vIHN0YXJ0IHRpbWUgZm9yIGV0YVxuICBpZiAoMCA9PSB0aGlzLmN1cnIpIHRoaXMuc3RhcnQgPSBuZXcgRGF0ZTtcblxuICB0aGlzLmN1cnIgKz0gbGVuXG5cbiAgLy8gdHJ5IHRvIHJlbmRlclxuICB0aGlzLnJlbmRlcigpO1xuXG4gIC8vIHByb2dyZXNzIGNvbXBsZXRlXG4gIGlmICh0aGlzLmN1cnIgPj0gdGhpcy50b3RhbCkge1xuICAgIHRoaXMucmVuZGVyKHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgdGhpcy5jb21wbGV0ZSA9IHRydWU7XG4gICAgdGhpcy50ZXJtaW5hdGUoKTtcbiAgICB0aGlzLmNhbGxiYWNrKHRoaXMpO1xuICAgIHJldHVybjtcbiAgfVxufTtcblxuLyoqXG4gKiBNZXRob2QgdG8gcmVuZGVyIHRoZSBwcm9ncmVzcyBiYXIgd2l0aCBvcHRpb25hbCBgdG9rZW5zYCB0byBwbGFjZSBpbiB0aGVcbiAqIHByb2dyZXNzIGJhcidzIGBmbXRgIGZpZWxkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0b2tlbnNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUHJvZ3Jlc3NCYXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICh0b2tlbnMsIGZvcmNlKSB7XG4gIGZvcmNlID0gZm9yY2UgIT09IHVuZGVmaW5lZCA/IGZvcmNlIDogZmFsc2U7XG4gIGlmICh0b2tlbnMpIHRoaXMudG9rZW5zID0gdG9rZW5zO1xuXG4gIGlmICghdGhpcy5zdHJlYW0uaXNUVFkpIHJldHVybjtcblxuICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgdmFyIGRlbHRhID0gbm93IC0gdGhpcy5sYXN0UmVuZGVyO1xuICBpZiAoIWZvcmNlICYmIChkZWx0YSA8IHRoaXMucmVuZGVyVGhyb3R0bGUpKSB7XG4gICAgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubGFzdFJlbmRlciA9IG5vdztcbiAgfVxuXG4gIHZhciByYXRpbyA9IHRoaXMuY3VyciAvIHRoaXMudG90YWw7XG4gIHJhdGlvID0gTWF0aC5taW4oTWF0aC5tYXgocmF0aW8sIDApLCAxKTtcblxuICB2YXIgcGVyY2VudCA9IE1hdGguZmxvb3IocmF0aW8gKiAxMDApO1xuICB2YXIgaW5jb21wbGV0ZSwgY29tcGxldGUsIGNvbXBsZXRlTGVuZ3RoO1xuICB2YXIgZWxhcHNlZCA9IG5ldyBEYXRlIC0gdGhpcy5zdGFydDtcbiAgdmFyIGV0YSA9IChwZXJjZW50ID09IDEwMCkgPyAwIDogZWxhcHNlZCAqICh0aGlzLnRvdGFsIC8gdGhpcy5jdXJyIC0gMSk7XG4gIHZhciByYXRlID0gdGhpcy5jdXJyIC8gKGVsYXBzZWQgLyAxMDAwKTtcblxuICAvKiBwb3B1bGF0ZSB0aGUgYmFyIHRlbXBsYXRlIHdpdGggcGVyY2VudGFnZXMgYW5kIHRpbWVzdGFtcHMgKi9cbiAgdmFyIHN0ciA9IHRoaXMuZm10XG4gICAgLnJlcGxhY2UoJzpjdXJyZW50JywgdGhpcy5jdXJyKVxuICAgIC5yZXBsYWNlKCc6dG90YWwnLCB0aGlzLnRvdGFsKVxuICAgIC5yZXBsYWNlKCc6ZWxhcHNlZCcsIGlzTmFOKGVsYXBzZWQpID8gJzAuMCcgOiAoZWxhcHNlZCAvIDEwMDApLnRvRml4ZWQoMSkpXG4gICAgLnJlcGxhY2UoJzpldGEnLCAoaXNOYU4oZXRhKSB8fCAhaXNGaW5pdGUoZXRhKSkgPyAnMC4wJyA6IChldGEgLyAxMDAwKVxuICAgICAgLnRvRml4ZWQoMSkpXG4gICAgLnJlcGxhY2UoJzpwZXJjZW50JywgcGVyY2VudC50b0ZpeGVkKDApICsgJyUnKVxuICAgIC5yZXBsYWNlKCc6cmF0ZScsIE1hdGgucm91bmQocmF0ZSkpO1xuXG4gIC8qIGNvbXB1dGUgdGhlIGF2YWlsYWJsZSBzcGFjZSAobm9uLXplcm8pIGZvciB0aGUgYmFyICovXG4gIHZhciBhdmFpbGFibGVTcGFjZSA9IE1hdGgubWF4KDAsIHRoaXMuc3RyZWFtLmNvbHVtbnMgLSBzdHIucmVwbGFjZSgnOmJhcicsICcnKS5sZW5ndGgpO1xuICBpZihhdmFpbGFibGVTcGFjZSAmJiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKXtcbiAgICBhdmFpbGFibGVTcGFjZSA9IGF2YWlsYWJsZVNwYWNlIC0gMTtcbiAgfVxuXG4gIHZhciB3aWR0aCA9IE1hdGgubWluKHRoaXMud2lkdGgsIGF2YWlsYWJsZVNwYWNlKTtcblxuICAvKiBUT0RPOiB0aGUgZm9sbG93aW5nIGFzc3VtZXMgdGhlIHVzZXIgaGFzIG9uZSAnOmJhcicgdG9rZW4gKi9cbiAgY29tcGxldGVMZW5ndGggPSBNYXRoLnJvdW5kKHdpZHRoICogcmF0aW8pO1xuICBjb21wbGV0ZSA9IEFycmF5KE1hdGgubWF4KDAsIGNvbXBsZXRlTGVuZ3RoICsgMSkpLmpvaW4odGhpcy5jaGFycy5jb21wbGV0ZSk7XG4gIGluY29tcGxldGUgPSBBcnJheShNYXRoLm1heCgwLCB3aWR0aCAtIGNvbXBsZXRlTGVuZ3RoICsgMSkpLmpvaW4odGhpcy5jaGFycy5pbmNvbXBsZXRlKTtcblxuICAvKiBhZGQgaGVhZCB0byB0aGUgY29tcGxldGUgc3RyaW5nICovXG4gIGlmKGNvbXBsZXRlTGVuZ3RoID4gMClcbiAgICBjb21wbGV0ZSA9IGNvbXBsZXRlLnNsaWNlKDAsIC0xKSArIHRoaXMuY2hhcnMuaGVhZDtcblxuICAvKiBmaWxsIGluIHRoZSBhY3R1YWwgcHJvZ3Jlc3MgYmFyICovXG4gIHN0ciA9IHN0ci5yZXBsYWNlKCc6YmFyJywgY29tcGxldGUgKyBpbmNvbXBsZXRlKTtcblxuICAvKiByZXBsYWNlIHRoZSBleHRyYSB0b2tlbnMgKi9cbiAgaWYgKHRoaXMudG9rZW5zKSBmb3IgKHZhciBrZXkgaW4gdGhpcy50b2tlbnMpIHN0ciA9IHN0ci5yZXBsYWNlKCc6JyArIGtleSwgdGhpcy50b2tlbnNba2V5XSk7XG5cbiAgaWYgKHRoaXMubGFzdERyYXcgIT09IHN0cikge1xuICAgIHRoaXMuc3RyZWFtLmN1cnNvclRvKDApO1xuICAgIHRoaXMuc3RyZWFtLndyaXRlKHN0cik7XG4gICAgdGhpcy5zdHJlYW0uY2xlYXJMaW5lKDEpO1xuICAgIHRoaXMubGFzdERyYXcgPSBzdHI7XG4gIH1cbn07XG5cbi8qKlxuICogXCJ1cGRhdGVcIiB0aGUgcHJvZ3Jlc3MgYmFyIHRvIHJlcHJlc2VudCBhbiBleGFjdCBwZXJjZW50YWdlLlxuICogVGhlIHJhdGlvIChiZXR3ZWVuIDAgYW5kIDEpIHNwZWNpZmllZCB3aWxsIGJlIG11bHRpcGxpZWQgYnkgYHRvdGFsYCBhbmRcbiAqIGZsb29yZWQsIHJlcHJlc2VudGluZyB0aGUgY2xvc2VzdCBhdmFpbGFibGUgXCJ0aWNrLlwiIEZvciBleGFtcGxlLCBpZiBhXG4gKiBwcm9ncmVzcyBiYXIgaGFzIGEgbGVuZ3RoIG9mIDMgYW5kIGB1cGRhdGUoMC41KWAgaXMgY2FsbGVkLCB0aGUgcHJvZ3Jlc3NcbiAqIHdpbGwgYmUgc2V0IHRvIDEuXG4gKlxuICogQSByYXRpbyBvZiAwLjUgd2lsbCBhdHRlbXB0IHRvIHNldCB0aGUgcHJvZ3Jlc3MgdG8gaGFsZndheS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gcmF0aW8gVGhlIHJhdGlvIChiZXR3ZWVuIDAgYW5kIDEgaW5jbHVzaXZlKSB0byBzZXQgdGhlXG4gKiAgIG92ZXJhbGwgY29tcGxldGlvbiB0by5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUHJvZ3Jlc3NCYXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChyYXRpbywgdG9rZW5zKSB7XG4gIHZhciBnb2FsID0gTWF0aC5mbG9vcihyYXRpbyAqIHRoaXMudG90YWwpO1xuICB2YXIgZGVsdGEgPSBnb2FsIC0gdGhpcy5jdXJyO1xuXG4gIHRoaXMudGljayhkZWx0YSwgdG9rZW5zKTtcbn07XG5cbi8qKlxuICogXCJpbnRlcnJ1cHRcIiB0aGUgcHJvZ3Jlc3MgYmFyIGFuZCB3cml0ZSBhIG1lc3NhZ2UgYWJvdmUgaXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byB3cml0ZS5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUHJvZ3Jlc3NCYXIucHJvdG90eXBlLmludGVycnVwdCA9IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gIC8vIGNsZWFyIHRoZSBjdXJyZW50IGxpbmVcbiAgdGhpcy5zdHJlYW0uY2xlYXJMaW5lKCk7XG4gIC8vIG1vdmUgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVcbiAgdGhpcy5zdHJlYW0uY3Vyc29yVG8oMCk7XG4gIC8vIHdyaXRlIHRoZSBtZXNzYWdlIHRleHRcbiAgdGhpcy5zdHJlYW0ud3JpdGUobWVzc2FnZSk7XG4gIC8vIHRlcm1pbmF0ZSB0aGUgbGluZSBhZnRlciB3cml0aW5nIHRoZSBtZXNzYWdlXG4gIHRoaXMuc3RyZWFtLndyaXRlKCdcXG4nKTtcbiAgLy8gcmUtZGlzcGxheSB0aGUgcHJvZ3Jlc3MgYmFyIHdpdGggaXRzIGxhc3REcmF3XG4gIHRoaXMuc3RyZWFtLndyaXRlKHRoaXMubGFzdERyYXcpO1xufTtcblxuLyoqXG4gKiBUZXJtaW5hdGVzIGEgcHJvZ3Jlc3MgYmFyLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUHJvZ3Jlc3NCYXIucHJvdG90eXBlLnRlcm1pbmF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2xlYXIpIHtcbiAgICBpZiAodGhpcy5zdHJlYW0uY2xlYXJMaW5lKSB7XG4gICAgICB0aGlzLnN0cmVhbS5jbGVhckxpbmUoKTtcbiAgICAgIHRoaXMuc3RyZWFtLmN1cnNvclRvKDApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLnN0cmVhbS53cml0ZSgnXFxuJyk7XG4gIH1cbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Qcm94eUFnZW50ID0gZXhwb3J0cy5wcm94aWVzID0gdm9pZCAwO1xuY29uc3QgaHR0cCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiaHR0cFwiKSk7XG5jb25zdCBodHRwcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiaHR0cHNcIikpO1xuY29uc3QgdXJsXzEgPSByZXF1aXJlKFwidXJsXCIpO1xuY29uc3QgbHJ1X2NhY2hlXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImxydS1jYWNoZVwiKSk7XG5jb25zdCBhZ2VudF9iYXNlXzEgPSByZXF1aXJlKFwiYWdlbnQtYmFzZVwiKTtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IHByb3h5X2Zyb21fZW52XzEgPSByZXF1aXJlKFwicHJveHktZnJvbS1lbnZcIik7XG5jb25zdCBwYWNfcHJveHlfYWdlbnRfMSA9IHJlcXVpcmUoXCJwYWMtcHJveHktYWdlbnRcIik7XG5jb25zdCBodHRwX3Byb3h5X2FnZW50XzEgPSByZXF1aXJlKFwiaHR0cC1wcm94eS1hZ2VudFwiKTtcbmNvbnN0IGh0dHBzX3Byb3h5X2FnZW50XzEgPSByZXF1aXJlKFwiaHR0cHMtcHJveHktYWdlbnRcIik7XG5jb25zdCBzb2Nrc19wcm94eV9hZ2VudF8xID0gcmVxdWlyZShcInNvY2tzLXByb3h5LWFnZW50XCIpO1xuY29uc3QgZGVidWcgPSAoMCwgZGVidWdfMS5kZWZhdWx0KSgncHJveHktYWdlbnQnKTtcbmNvbnN0IFBST1RPQ09MUyA9IFtcbiAgICAuLi5odHRwX3Byb3h5X2FnZW50XzEuSHR0cFByb3h5QWdlbnQucHJvdG9jb2xzLFxuICAgIC4uLnNvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50LnByb3RvY29scyxcbiAgICAuLi5wYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50LnByb3RvY29scyxcbl07XG4vKipcbiAqIFN1cHBvcnRlZCBwcm94eSB0eXBlcy5cbiAqL1xuZXhwb3J0cy5wcm94aWVzID0ge1xuICAgIGh0dHA6IFtodHRwX3Byb3h5X2FnZW50XzEuSHR0cFByb3h5QWdlbnQsIGh0dHBzX3Byb3h5X2FnZW50XzEuSHR0cHNQcm94eUFnZW50XSxcbiAgICBodHRwczogW2h0dHBfcHJveHlfYWdlbnRfMS5IdHRwUHJveHlBZ2VudCwgaHR0cHNfcHJveHlfYWdlbnRfMS5IdHRwc1Byb3h5QWdlbnRdLFxuICAgIHNvY2tzOiBbc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnQsIHNvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50XSxcbiAgICBzb2NrczQ6IFtzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudCwgc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnRdLFxuICAgIHNvY2tzNGE6IFtzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudCwgc29ja3NfcHJveHlfYWdlbnRfMS5Tb2Nrc1Byb3h5QWdlbnRdLFxuICAgIHNvY2tzNTogW3NvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50LCBzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudF0sXG4gICAgc29ja3M1aDogW3NvY2tzX3Byb3h5X2FnZW50XzEuU29ja3NQcm94eUFnZW50LCBzb2Nrc19wcm94eV9hZ2VudF8xLlNvY2tzUHJveHlBZ2VudF0sXG4gICAgJ3BhYytkYXRhJzogW3BhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnQsIHBhY19wcm94eV9hZ2VudF8xLlBhY1Byb3h5QWdlbnRdLFxuICAgICdwYWMrZmlsZSc6IFtwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50LCBwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50XSxcbiAgICAncGFjK2Z0cCc6IFtwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50LCBwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50XSxcbiAgICAncGFjK2h0dHAnOiBbcGFjX3Byb3h5X2FnZW50XzEuUGFjUHJveHlBZ2VudCwgcGFjX3Byb3h5X2FnZW50XzEuUGFjUHJveHlBZ2VudF0sXG4gICAgJ3BhYytodHRwcyc6IFtwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50LCBwYWNfcHJveHlfYWdlbnRfMS5QYWNQcm94eUFnZW50XSxcbn07XG5mdW5jdGlvbiBpc1ZhbGlkUHJvdG9jb2wodikge1xuICAgIHJldHVybiBQUk9UT0NPTFMuaW5jbHVkZXModik7XG59XG4vKipcbiAqIFVzZXMgdGhlIGFwcHJvcHJpYXRlIGBBZ2VudGAgc3ViY2xhc3MgYmFzZWQgb2ZmIG9mIHRoZSBcInByb3h5XCJcbiAqIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IGFyZSBjdXJyZW50bHkgc2V0LlxuICpcbiAqIEFuIExSVSBjYWNoZSBpcyB1c2VkLCB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IGNyZWF0aW9uIG9mIHByb3h5XG4gKiBgaHR0cC5BZ2VudGAgaW5zdGFuY2VzLlxuICovXG5jbGFzcyBQcm94eUFnZW50IGV4dGVuZHMgYWdlbnRfYmFzZV8xLkFnZW50IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2FjaGUgZm9yIGBBZ2VudGAgaW5zdGFuY2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYWNoZSA9IG5ldyBscnVfY2FjaGVfMS5kZWZhdWx0KHsgbWF4OiAyMCB9KTtcbiAgICAgICAgZGVidWcoJ0NyZWF0aW5nIG5ldyBQcm94eUFnZW50IGluc3RhbmNlOiAlbycsIG9wdHMpO1xuICAgICAgICB0aGlzLmNvbm5lY3RPcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5odHRwQWdlbnQgPSBvcHRzPy5odHRwQWdlbnQgfHwgbmV3IGh0dHAuQWdlbnQob3B0cyk7XG4gICAgICAgIHRoaXMuaHR0cHNBZ2VudCA9XG4gICAgICAgICAgICBvcHRzPy5odHRwc0FnZW50IHx8IG5ldyBodHRwcy5BZ2VudChvcHRzKTtcbiAgICAgICAgdGhpcy5nZXRQcm94eUZvclVybCA9IG9wdHM/LmdldFByb3h5Rm9yVXJsIHx8IHByb3h5X2Zyb21fZW52XzEuZ2V0UHJveHlGb3JVcmw7XG4gICAgfVxuICAgIGFzeW5jIGNvbm5lY3QocmVxLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IHsgc2VjdXJlRW5kcG9pbnQgfSA9IG9wdHM7XG4gICAgICAgIGNvbnN0IGlzV2ViU29ja2V0ID0gcmVxLmdldEhlYWRlcigndXBncmFkZScpID09PSAnd2Vic29ja2V0JztcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBzZWN1cmVFbmRwb2ludFxuICAgICAgICAgICAgPyBpc1dlYlNvY2tldFxuICAgICAgICAgICAgICAgID8gJ3dzczonXG4gICAgICAgICAgICAgICAgOiAnaHR0cHM6J1xuICAgICAgICAgICAgOiBpc1dlYlNvY2tldFxuICAgICAgICAgICAgICAgID8gJ3dzOidcbiAgICAgICAgICAgICAgICA6ICdodHRwOic7XG4gICAgICAgIGNvbnN0IGhvc3QgPSByZXEuZ2V0SGVhZGVyKCdob3N0Jyk7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyB1cmxfMS5VUkwocmVxLnBhdGgsIGAke3Byb3RvY29sfS8vJHtob3N0fWApLmhyZWY7XG4gICAgICAgIGNvbnN0IHByb3h5ID0gYXdhaXQgdGhpcy5nZXRQcm94eUZvclVybCh1cmwpO1xuICAgICAgICBpZiAoIXByb3h5KSB7XG4gICAgICAgICAgICBkZWJ1ZygnUHJveHkgbm90IGVuYWJsZWQgZm9yIFVSTDogJW8nLCB1cmwpO1xuICAgICAgICAgICAgcmV0dXJuIHNlY3VyZUVuZHBvaW50ID8gdGhpcy5odHRwc0FnZW50IDogdGhpcy5odHRwQWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWcoJ1JlcXVlc3QgVVJMOiAlbycsIHVybCk7XG4gICAgICAgIGRlYnVnKCdQcm94eSBVUkw6ICVvJywgcHJveHkpO1xuICAgICAgICAvLyBhdHRlbXB0IHRvIGdldCBhIGNhY2hlZCBgaHR0cC5BZ2VudGAgaW5zdGFuY2UgZmlyc3RcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtwcm90b2NvbH0rJHtwcm94eX1gO1xuICAgICAgICBsZXQgYWdlbnQgPSB0aGlzLmNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3h5VXJsID0gbmV3IHVybF8xLlVSTChwcm94eSk7XG4gICAgICAgICAgICBjb25zdCBwcm94eVByb3RvID0gcHJveHlVcmwucHJvdG9jb2wucmVwbGFjZSgnOicsICcnKTtcbiAgICAgICAgICAgIGlmICghaXNWYWxpZFByb3RvY29sKHByb3h5UHJvdG8pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBwcm90b2NvbCBmb3IgcHJveHkgVVJMOiAke3Byb3h5fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY3RvciA9IGV4cG9ydHMucHJveGllc1twcm94eVByb3RvXVtzZWN1cmVFbmRwb2ludCB8fCBpc1dlYlNvY2tldCA/IDEgOiAwXTtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbWVo4oCmXG4gICAgICAgICAgICBhZ2VudCA9IG5ldyBjdG9yKHByb3h5LCB0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KGNhY2hlS2V5LCBhZ2VudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWJ1ZygnQ2FjaGUgaGl0IGZvciBwcm94eSBVUkw6ICVvJywgcHJveHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBhZ2VudCBvZiB0aGlzLmNhY2hlLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBhZ2VudC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cbn1cbmV4cG9ydHMuUHJveHlBZ2VudCA9IFByb3h5QWdlbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIndXNlIHN0cmljdCc7XG5cbnZhciBwYXJzZVVybCA9IHJlcXVpcmUoJ3VybCcpLnBhcnNlO1xuXG52YXIgREVGQVVMVF9QT1JUUyA9IHtcbiAgZnRwOiAyMSxcbiAgZ29waGVyOiA3MCxcbiAgaHR0cDogODAsXG4gIGh0dHBzOiA0NDMsXG4gIHdzOiA4MCxcbiAgd3NzOiA0NDMsXG59O1xuXG52YXIgc3RyaW5nRW5kc1dpdGggPSBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoIHx8IGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHMubGVuZ3RoIDw9IHRoaXMubGVuZ3RoICYmXG4gICAgdGhpcy5pbmRleE9mKHMsIHRoaXMubGVuZ3RoIC0gcy5sZW5ndGgpICE9PSAtMTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSB1cmwgLSBUaGUgVVJMLCBvciB0aGUgcmVzdWx0IGZyb20gdXJsLnBhcnNlLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVJMIG9mIHRoZSBwcm94eSB0aGF0IHNob3VsZCBoYW5kbGUgdGhlIHJlcXVlc3QgdG8gdGhlXG4gKiAgZ2l2ZW4gVVJMLiBJZiBubyBwcm94eSBpcyBzZXQsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldFByb3h5Rm9yVXJsKHVybCkge1xuICB2YXIgcGFyc2VkVXJsID0gdHlwZW9mIHVybCA9PT0gJ3N0cmluZycgPyBwYXJzZVVybCh1cmwpIDogdXJsIHx8IHt9O1xuICB2YXIgcHJvdG8gPSBwYXJzZWRVcmwucHJvdG9jb2w7XG4gIHZhciBob3N0bmFtZSA9IHBhcnNlZFVybC5ob3N0O1xuICB2YXIgcG9ydCA9IHBhcnNlZFVybC5wb3J0O1xuICBpZiAodHlwZW9mIGhvc3RuYW1lICE9PSAnc3RyaW5nJyB8fCAhaG9zdG5hbWUgfHwgdHlwZW9mIHByb3RvICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAnJzsgIC8vIERvbid0IHByb3h5IFVSTHMgd2l0aG91dCBhIHZhbGlkIHNjaGVtZSBvciBob3N0LlxuICB9XG5cbiAgcHJvdG8gPSBwcm90by5zcGxpdCgnOicsIDEpWzBdO1xuICAvLyBTdHJpcHBpbmcgcG9ydHMgaW4gdGhpcyB3YXkgaW5zdGVhZCBvZiB1c2luZyBwYXJzZWRVcmwuaG9zdG5hbWUgdG8gbWFrZVxuICAvLyBzdXJlIHRoYXQgdGhlIGJyYWNrZXRzIGFyb3VuZCBJUHY2IGFkZHJlc3NlcyBhcmUga2VwdC5cbiAgaG9zdG5hbWUgPSBob3N0bmFtZS5yZXBsYWNlKC86XFxkKiQvLCAnJyk7XG4gIHBvcnQgPSBwYXJzZUludChwb3J0KSB8fCBERUZBVUxUX1BPUlRTW3Byb3RvXSB8fCAwO1xuICBpZiAoIXNob3VsZFByb3h5KGhvc3RuYW1lLCBwb3J0KSkge1xuICAgIHJldHVybiAnJzsgIC8vIERvbid0IHByb3h5IFVSTHMgdGhhdCBtYXRjaCBOT19QUk9YWS5cbiAgfVxuXG4gIHZhciBwcm94eSA9XG4gICAgZ2V0RW52KCducG1fY29uZmlnXycgKyBwcm90byArICdfcHJveHknKSB8fFxuICAgIGdldEVudihwcm90byArICdfcHJveHknKSB8fFxuICAgIGdldEVudignbnBtX2NvbmZpZ19wcm94eScpIHx8XG4gICAgZ2V0RW52KCdhbGxfcHJveHknKTtcbiAgaWYgKHByb3h5ICYmIHByb3h5LmluZGV4T2YoJzovLycpID09PSAtMSkge1xuICAgIC8vIE1pc3Npbmcgc2NoZW1lIGluIHByb3h5LCBkZWZhdWx0IHRvIHRoZSByZXF1ZXN0ZWQgVVJMJ3Mgc2NoZW1lLlxuICAgIHByb3h5ID0gcHJvdG8gKyAnOi8vJyArIHByb3h5O1xuICB9XG4gIHJldHVybiBwcm94eTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBnaXZlbiBVUkwgc2hvdWxkIGJlIHByb3hpZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGhvc3RuYW1lIC0gVGhlIGhvc3QgbmFtZSBvZiB0aGUgVVJMLlxuICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgZWZmZWN0aXZlIHBvcnQgb2YgdGhlIFVSTC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBnaXZlbiBVUkwgc2hvdWxkIGJlIHByb3hpZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzaG91bGRQcm94eShob3N0bmFtZSwgcG9ydCkge1xuICB2YXIgTk9fUFJPWFkgPVxuICAgIChnZXRFbnYoJ25wbV9jb25maWdfbm9fcHJveHknKSB8fCBnZXRFbnYoJ25vX3Byb3h5JykpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghTk9fUFJPWFkpIHtcbiAgICByZXR1cm4gdHJ1ZTsgIC8vIEFsd2F5cyBwcm94eSBpZiBOT19QUk9YWSBpcyBub3Qgc2V0LlxuICB9XG4gIGlmIChOT19QUk9YWSA9PT0gJyonKSB7XG4gICAgcmV0dXJuIGZhbHNlOyAgLy8gTmV2ZXIgcHJveHkgaWYgd2lsZGNhcmQgaXMgc2V0LlxuICB9XG5cbiAgcmV0dXJuIE5PX1BST1hZLnNwbGl0KC9bLFxcc10vKS5ldmVyeShmdW5jdGlvbihwcm94eSkge1xuICAgIGlmICghcHJveHkpIHtcbiAgICAgIHJldHVybiB0cnVlOyAgLy8gU2tpcCB6ZXJvLWxlbmd0aCBob3N0cy5cbiAgICB9XG4gICAgdmFyIHBhcnNlZFByb3h5ID0gcHJveHkubWF0Y2goL14oLispOihcXGQrKSQvKTtcbiAgICB2YXIgcGFyc2VkUHJveHlIb3N0bmFtZSA9IHBhcnNlZFByb3h5ID8gcGFyc2VkUHJveHlbMV0gOiBwcm94eTtcbiAgICB2YXIgcGFyc2VkUHJveHlQb3J0ID0gcGFyc2VkUHJveHkgPyBwYXJzZUludChwYXJzZWRQcm94eVsyXSkgOiAwO1xuICAgIGlmIChwYXJzZWRQcm94eVBvcnQgJiYgcGFyc2VkUHJveHlQb3J0ICE9PSBwb3J0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTsgIC8vIFNraXAgaWYgcG9ydHMgZG9uJ3QgbWF0Y2guXG4gICAgfVxuXG4gICAgaWYgKCEvXlsuKl0vLnRlc3QocGFyc2VkUHJveHlIb3N0bmFtZSkpIHtcbiAgICAgIC8vIE5vIHdpbGRjYXJkcywgc28gc3RvcCBwcm94eWluZyBpZiB0aGVyZSBpcyBhbiBleGFjdCBtYXRjaC5cbiAgICAgIHJldHVybiBob3N0bmFtZSAhPT0gcGFyc2VkUHJveHlIb3N0bmFtZTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkUHJveHlIb3N0bmFtZS5jaGFyQXQoMCkgPT09ICcqJykge1xuICAgICAgLy8gUmVtb3ZlIGxlYWRpbmcgd2lsZGNhcmQuXG4gICAgICBwYXJzZWRQcm94eUhvc3RuYW1lID0gcGFyc2VkUHJveHlIb3N0bmFtZS5zbGljZSgxKTtcbiAgICB9XG4gICAgLy8gU3RvcCBwcm94eWluZyBpZiB0aGUgaG9zdG5hbWUgZW5kcyB3aXRoIHRoZSBub19wcm94eSBob3N0LlxuICAgIHJldHVybiAhc3RyaW5nRW5kc1dpdGguY2FsbChob3N0bmFtZSwgcGFyc2VkUHJveHlIb3N0bmFtZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRFbnYoa2V5KSB7XG4gIHJldHVybiBwcm9jZXNzLmVudltrZXkudG9Mb3dlckNhc2UoKV0gfHwgcHJvY2Vzcy5lbnZba2V5LnRvVXBwZXJDYXNlKCldIHx8ICcnO1xufVxuXG5leHBvcnRzLmdldFByb3h5Rm9yVXJsID0gZ2V0UHJveHlGb3JVcmw7XG4iLCJ2YXIgb25jZSA9IHJlcXVpcmUoJ29uY2UnKVxudmFyIGVvcyA9IHJlcXVpcmUoJ2VuZC1vZi1zdHJlYW0nKVxudmFyIGZzID0gcmVxdWlyZSgnZnMnKSAvLyB3ZSBvbmx5IG5lZWQgZnMgdG8gZ2V0IHRoZSBSZWFkU3RyZWFtIGFuZCBXcml0ZVN0cmVhbSBwcm90b3R5cGVzXG5cbnZhciBub29wID0gZnVuY3Rpb24gKCkge31cbnZhciBhbmNpZW50ID0gL152P1xcLjAvLnRlc3QocHJvY2Vzcy52ZXJzaW9uKVxuXG52YXIgaXNGbiA9IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nXG59XG5cbnZhciBpc0ZTID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICBpZiAoIWFuY2llbnQpIHJldHVybiBmYWxzZSAvLyBuZXdlciBub2RlIHZlcnNpb24gZG8gbm90IG5lZWQgdG8gY2FyZSBhYm91dCBmcyBpcyBhIHNwZWNpYWwgd2F5XG4gIGlmICghZnMpIHJldHVybiBmYWxzZSAvLyBicm93c2VyXG4gIHJldHVybiAoc3RyZWFtIGluc3RhbmNlb2YgKGZzLlJlYWRTdHJlYW0gfHwgbm9vcCkgfHwgc3RyZWFtIGluc3RhbmNlb2YgKGZzLldyaXRlU3RyZWFtIHx8IG5vb3ApKSAmJiBpc0ZuKHN0cmVhbS5jbG9zZSlcbn1cblxudmFyIGlzUmVxdWVzdCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgcmV0dXJuIHN0cmVhbS5zZXRIZWFkZXIgJiYgaXNGbihzdHJlYW0uYWJvcnQpXG59XG5cbnZhciBkZXN0cm95ZXIgPSBmdW5jdGlvbiAoc3RyZWFtLCByZWFkaW5nLCB3cml0aW5nLCBjYWxsYmFjaykge1xuICBjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2spXG5cbiAgdmFyIGNsb3NlZCA9IGZhbHNlXG4gIHN0cmVhbS5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY2xvc2VkID0gdHJ1ZVxuICB9KVxuXG4gIGVvcyhzdHJlYW0sIHtyZWFkYWJsZTogcmVhZGluZywgd3JpdGFibGU6IHdyaXRpbmd9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgICBjbG9zZWQgPSB0cnVlXG4gICAgY2FsbGJhY2soKVxuICB9KVxuXG4gIHZhciBkZXN0cm95ZWQgPSBmYWxzZVxuICByZXR1cm4gZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChjbG9zZWQpIHJldHVyblxuICAgIGlmIChkZXN0cm95ZWQpIHJldHVyblxuICAgIGRlc3Ryb3llZCA9IHRydWVcblxuICAgIGlmIChpc0ZTKHN0cmVhbSkpIHJldHVybiBzdHJlYW0uY2xvc2Uobm9vcCkgLy8gdXNlIGNsb3NlIGZvciBmcyBzdHJlYW1zIHRvIGF2b2lkIGZkIGxlYWtzXG4gICAgaWYgKGlzUmVxdWVzdChzdHJlYW0pKSByZXR1cm4gc3RyZWFtLmFib3J0KCkgLy8gcmVxdWVzdC5kZXN0cm95IGp1c3QgZG8gLmVuZCAtIC5hYm9ydCBpcyB3aGF0IHdlIHdhbnRcblxuICAgIGlmIChpc0ZuKHN0cmVhbS5kZXN0cm95KSkgcmV0dXJuIHN0cmVhbS5kZXN0cm95KClcblxuICAgIGNhbGxiYWNrKGVyciB8fCBuZXcgRXJyb3IoJ3N0cmVhbSB3YXMgZGVzdHJveWVkJykpXG4gIH1cbn1cblxudmFyIGNhbGwgPSBmdW5jdGlvbiAoZm4pIHtcbiAgZm4oKVxufVxuXG52YXIgcGlwZSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICByZXR1cm4gZnJvbS5waXBlKHRvKVxufVxuXG52YXIgcHVtcCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0cmVhbXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gIHZhciBjYWxsYmFjayA9IGlzRm4oc3RyZWFtc1tzdHJlYW1zLmxlbmd0aCAtIDFdIHx8IG5vb3ApICYmIHN0cmVhbXMucG9wKCkgfHwgbm9vcFxuXG4gIGlmIChBcnJheS5pc0FycmF5KHN0cmVhbXNbMF0pKSBzdHJlYW1zID0gc3RyZWFtc1swXVxuICBpZiAoc3RyZWFtcy5sZW5ndGggPCAyKSB0aHJvdyBuZXcgRXJyb3IoJ3B1bXAgcmVxdWlyZXMgdHdvIHN0cmVhbXMgcGVyIG1pbmltdW0nKVxuXG4gIHZhciBlcnJvclxuICB2YXIgZGVzdHJveXMgPSBzdHJlYW1zLm1hcChmdW5jdGlvbiAoc3RyZWFtLCBpKSB7XG4gICAgdmFyIHJlYWRpbmcgPSBpIDwgc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgdmFyIHdyaXRpbmcgPSBpID4gMFxuICAgIHJldHVybiBkZXN0cm95ZXIoc3RyZWFtLCByZWFkaW5nLCB3cml0aW5nLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoIWVycm9yKSBlcnJvciA9IGVyclxuICAgICAgaWYgKGVycikgZGVzdHJveXMuZm9yRWFjaChjYWxsKVxuICAgICAgaWYgKHJlYWRpbmcpIHJldHVyblxuICAgICAgZGVzdHJveXMuZm9yRWFjaChjYWxsKVxuICAgICAgY2FsbGJhY2soZXJyb3IpXG4gICAgfSlcbiAgfSlcblxuICByZXR1cm4gc3RyZWFtcy5yZWR1Y2UocGlwZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwdW1wXG4iLCJtb2R1bGUuZXhwb3J0cyA9ICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHByb2Nlc3MubmV4dFRpY2sgPT09ICdmdW5jdGlvbicpXG4gID8gcHJvY2Vzcy5uZXh0VGljay5iaW5kKHByb2Nlc3MpXG4gIDogcmVxdWlyZSgnLi9xdWV1ZS1taWNyb3Rhc2snKVxuIiwibW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbicgPyBxdWV1ZU1pY3JvdGFzayA6IChmbikgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbilcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKSxcbiAgam9pbiA9IHJlcXVpcmUoJ3BhdGgnKS5qb2luLFxuICByZXNvbHZlID0gcmVxdWlyZSgncGF0aCcpLnJlc29sdmUsXG4gIGRpcm5hbWUgPSByZXF1aXJlKCdwYXRoJykuZGlybmFtZSxcbiAgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgZXh0ZW5zaW9uczogWydqcycsICdqc29uJywgJ2NvZmZlZSddLFxuICAgIHJlY3Vyc2U6IHRydWUsXG4gICAgcmVuYW1lOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfSxcbiAgICB2aXNpdDogZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gIH07XG5cbmZ1bmN0aW9uIGNoZWNrRmlsZUluY2x1c2lvbihwYXRoLCBmaWxlbmFtZSwgb3B0aW9ucykge1xuICByZXR1cm4gKFxuICAgIC8vIHZlcmlmeSBmaWxlIGhhcyB2YWxpZCBleHRlbnNpb25cbiAgICAobmV3IFJlZ0V4cCgnXFxcXC4oJyArIG9wdGlvbnMuZXh0ZW5zaW9ucy5qb2luKCd8JykgKyAnKSQnLCAnaScpLnRlc3QoZmlsZW5hbWUpKSAmJlxuXG4gICAgLy8gaWYgb3B0aW9ucy5pbmNsdWRlIGlzIGEgUmVnRXhwLCBldmFsdWF0ZSBpdCBhbmQgbWFrZSBzdXJlIHRoZSBwYXRoIHBhc3Nlc1xuICAgICEob3B0aW9ucy5pbmNsdWRlICYmIG9wdGlvbnMuaW5jbHVkZSBpbnN0YW5jZW9mIFJlZ0V4cCAmJiAhb3B0aW9ucy5pbmNsdWRlLnRlc3QocGF0aCkpICYmXG5cbiAgICAvLyBpZiBvcHRpb25zLmluY2x1ZGUgaXMgYSBmdW5jdGlvbiwgZXZhbHVhdGUgaXQgYW5kIG1ha2Ugc3VyZSB0aGUgcGF0aCBwYXNzZXNcbiAgICAhKG9wdGlvbnMuaW5jbHVkZSAmJiB0eXBlb2Ygb3B0aW9ucy5pbmNsdWRlID09PSAnZnVuY3Rpb24nICYmICFvcHRpb25zLmluY2x1ZGUocGF0aCwgZmlsZW5hbWUpKSAmJlxuXG4gICAgLy8gaWYgb3B0aW9ucy5leGNsdWRlIGlzIGEgUmVnRXhwLCBldmFsdWF0ZSBpdCBhbmQgbWFrZSBzdXJlIHRoZSBwYXRoIGRvZXNuJ3QgcGFzc1xuICAgICEob3B0aW9ucy5leGNsdWRlICYmIG9wdGlvbnMuZXhjbHVkZSBpbnN0YW5jZW9mIFJlZ0V4cCAmJiBvcHRpb25zLmV4Y2x1ZGUudGVzdChwYXRoKSkgJiZcblxuICAgIC8vIGlmIG9wdGlvbnMuZXhjbHVkZSBpcyBhIGZ1bmN0aW9uLCBldmFsdWF0ZSBpdCBhbmQgbWFrZSBzdXJlIHRoZSBwYXRoIGRvZXNuJ3QgcGFzc1xuICAgICEob3B0aW9ucy5leGNsdWRlICYmIHR5cGVvZiBvcHRpb25zLmV4Y2x1ZGUgPT09ICdmdW5jdGlvbicgJiYgb3B0aW9ucy5leGNsdWRlKHBhdGgsIGZpbGVuYW1lKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZURpcmVjdG9yeShtLCBwYXRoLCBvcHRpb25zKSB7XG4gIHZhciByZXR2YWwgPSB7fTtcblxuICAvLyBwYXRoIGlzIG9wdGlvbmFsXG4gIGlmIChwYXRoICYmICFvcHRpb25zICYmIHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMgPSBwYXRoO1xuICAgIHBhdGggPSBudWxsO1xuICB9XG5cbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBmb3IgKHZhciBwcm9wIGluIGRlZmF1bHRPcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zW3Byb3BdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgb3B0aW9uc1twcm9wXSA9IGRlZmF1bHRPcHRpb25zW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIG5vIHBhdGggd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoZSBlcXVpdmVsYW50IG9mIF9fZGlybmFtZSBmcm9tIGNhbGxlclxuICAvLyBvdGhlcndpc2UsIHJlc29sdmUgcGF0aCByZWxhdGl2ZSB0byB0aGUgZXF1aXZhbGVudCBvZiBfX2Rpcm5hbWVcbiAgcGF0aCA9ICFwYXRoID8gZGlybmFtZShtLmZpbGVuYW1lKSA6IHJlc29sdmUoZGlybmFtZShtLmZpbGVuYW1lKSwgcGF0aCk7XG5cbiAgLy8gZ2V0IHRoZSBwYXRoIG9mIGVhY2ggZmlsZSBpbiBzcGVjaWZpZWQgZGlyZWN0b3J5LCBhcHBlbmQgdG8gY3VycmVudCB0cmVlIG5vZGUsIHJlY3Vyc2VcbiAgZnMucmVhZGRpclN5bmMocGF0aCkuZm9yRWFjaChmdW5jdGlvbiAoZmlsZW5hbWUpIHtcbiAgICB2YXIgam9pbmVkID0gam9pbihwYXRoLCBmaWxlbmFtZSksXG4gICAgICBmaWxlcyxcbiAgICAgIGtleSxcbiAgICAgIG9iajtcblxuICAgIGlmIChmcy5zdGF0U3luYyhqb2luZWQpLmlzRGlyZWN0b3J5KCkgJiYgb3B0aW9ucy5yZWN1cnNlKSB7XG4gICAgICAvLyB0aGlzIG5vZGUgaXMgYSBkaXJlY3Rvcnk7IHJlY3Vyc2VcbiAgICAgIGZpbGVzID0gcmVxdWlyZURpcmVjdG9yeShtLCBqb2luZWQsIG9wdGlvbnMpO1xuICAgICAgLy8gZXhjbHVkZSBlbXB0eSBkaXJlY3Rvcmllc1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGZpbGVzKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dmFsW29wdGlvbnMucmVuYW1lKGZpbGVuYW1lLCBqb2luZWQsIGZpbGVuYW1lKV0gPSBmaWxlcztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGpvaW5lZCAhPT0gbS5maWxlbmFtZSAmJiBjaGVja0ZpbGVJbmNsdXNpb24oam9pbmVkLCBmaWxlbmFtZSwgb3B0aW9ucykpIHtcbiAgICAgICAgLy8gaGFzaCBub2RlIGtleSBzaG91bGRuJ3QgaW5jbHVkZSBmaWxlIGV4dGVuc2lvblxuICAgICAgICBrZXkgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgICAgIG9iaiA9IG0ucmVxdWlyZShqb2luZWQpO1xuICAgICAgICByZXR2YWxbb3B0aW9ucy5yZW5hbWUoa2V5LCBqb2luZWQsIGZpbGVuYW1lKV0gPSBvcHRpb25zLnZpc2l0KG9iaiwgam9pbmVkLCBmaWxlbmFtZSkgfHwgb2JqO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJldHZhbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlRGlyZWN0b3J5O1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdHMgPSBkZWZhdWx0T3B0aW9ucztcbiIsImNvbnN0IEFOWSA9IFN5bWJvbCgnU2VtVmVyIEFOWScpXG4vLyBob2lzdGVkIGNsYXNzIGZvciBjeWNsaWMgZGVwZW5kZW5jeVxuY2xhc3MgQ29tcGFyYXRvciB7XG4gIHN0YXRpYyBnZXQgQU5ZICgpIHtcbiAgICByZXR1cm4gQU5ZXG4gIH1cblxuICBjb25zdHJ1Y3RvciAoY29tcCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmIChjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikge1xuICAgICAgaWYgKGNvbXAubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSkge1xuICAgICAgICByZXR1cm4gY29tcFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcCA9IGNvbXAudmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wID0gY29tcC50cmltKCkuc3BsaXQoL1xccysvKS5qb2luKCcgJylcbiAgICBkZWJ1ZygnY29tcGFyYXRvcicsIGNvbXAsIG9wdGlvbnMpXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2VcbiAgICB0aGlzLnBhcnNlKGNvbXApXG5cbiAgICBpZiAodGhpcy5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgdGhpcy52YWx1ZSA9ICcnXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm9wZXJhdG9yICsgdGhpcy5zZW12ZXIudmVyc2lvblxuICAgIH1cblxuICAgIGRlYnVnKCdjb21wJywgdGhpcylcbiAgfVxuXG4gIHBhcnNlIChjb21wKSB7XG4gICAgY29uc3QgciA9IHRoaXMub3B0aW9ucy5sb29zZSA/IHJlW3QuQ09NUEFSQVRPUkxPT1NFXSA6IHJlW3QuQ09NUEFSQVRPUl1cbiAgICBjb25zdCBtID0gY29tcC5tYXRjaChyKVxuXG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGNvbXBhcmF0b3I6ICR7Y29tcH1gKVxuICAgIH1cblxuICAgIHRoaXMub3BlcmF0b3IgPSBtWzFdICE9PSB1bmRlZmluZWQgPyBtWzFdIDogJydcbiAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJz0nKSB7XG4gICAgICB0aGlzLm9wZXJhdG9yID0gJydcbiAgICB9XG5cbiAgICAvLyBpZiBpdCBsaXRlcmFsbHkgaXMganVzdCAnPicgb3IgJycgdGhlbiBhbGxvdyBhbnl0aGluZy5cbiAgICBpZiAoIW1bMl0pIHtcbiAgICAgIHRoaXMuc2VtdmVyID0gQU5ZXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VtdmVyID0gbmV3IFNlbVZlcihtWzJdLCB0aGlzLm9wdGlvbnMubG9vc2UpXG4gICAgfVxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlXG4gIH1cblxuICB0ZXN0ICh2ZXJzaW9uKSB7XG4gICAgZGVidWcoJ0NvbXBhcmF0b3IudGVzdCcsIHZlcnNpb24sIHRoaXMub3B0aW9ucy5sb29zZSlcblxuICAgIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZIHx8IHZlcnNpb24gPT09IEFOWSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY21wKHZlcnNpb24sIHRoaXMub3BlcmF0b3IsIHRoaXMuc2VtdmVyLCB0aGlzLm9wdGlvbnMpXG4gIH1cblxuICBpbnRlcnNlY3RzIChjb21wLCBvcHRpb25zKSB7XG4gICAgaWYgKCEoY29tcCBpbnN0YW5jZW9mIENvbXBhcmF0b3IpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhIENvbXBhcmF0b3IgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wZXJhdG9yID09PSAnJykge1xuICAgICAgaWYgKHRoaXMudmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKGNvbXAudmFsdWUsIG9wdGlvbnMpLnRlc3QodGhpcy52YWx1ZSlcbiAgICB9IGVsc2UgaWYgKGNvbXAub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgICBpZiAoY29tcC52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy52YWx1ZSwgb3B0aW9ucykudGVzdChjb21wLnNlbXZlcilcbiAgICB9XG5cbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICAvLyBTcGVjaWFsIGNhc2VzIHdoZXJlIG5vdGhpbmcgY2FuIHBvc3NpYmx5IGJlIGxvd2VyXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICAgICh0aGlzLnZhbHVlID09PSAnPDAuMC4wLTAnIHx8IGNvbXAudmFsdWUgPT09ICc8MC4wLjAtMCcpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgICAodGhpcy52YWx1ZS5zdGFydHNXaXRoKCc8MC4wLjAnKSB8fCBjb21wLnZhbHVlLnN0YXJ0c1dpdGgoJzwwLjAuMCcpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gU2FtZSBkaXJlY3Rpb24gaW5jcmVhc2luZyAoPiBvciA+PSlcbiAgICBpZiAodGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIFNhbWUgZGlyZWN0aW9uIGRlY3JlYXNpbmcgKDwgb3IgPD0pXG4gICAgaWYgKHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBzYW1lIFNlbVZlciBhbmQgYm90aCBzaWRlcyBhcmUgaW5jbHVzaXZlICg8PSBvciA+PSlcbiAgICBpZiAoXG4gICAgICAodGhpcy5zZW12ZXIudmVyc2lvbiA9PT0gY29tcC5zZW12ZXIudmVyc2lvbikgJiZcbiAgICAgIHRoaXMub3BlcmF0b3IuaW5jbHVkZXMoJz0nKSAmJiBjb21wLm9wZXJhdG9yLmluY2x1ZGVzKCc9JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIG9wcG9zaXRlIGRpcmVjdGlvbnMgbGVzcyB0aGFuXG4gICAgaWYgKGNtcCh0aGlzLnNlbXZlciwgJzwnLCBjb21wLnNlbXZlciwgb3B0aW9ucykgJiZcbiAgICAgIHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICAvLyBvcHBvc2l0ZSBkaXJlY3Rpb25zIGdyZWF0ZXIgdGhhblxuICAgIGlmIChjbXAodGhpcy5zZW12ZXIsICc+JywgY29tcC5zZW12ZXIsIG9wdGlvbnMpICYmXG4gICAgICB0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJzwnKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb21wYXJhdG9yXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgeyBzYWZlUmU6IHJlLCB0IH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5jb25zdCBjbXAgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvY21wJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZGVidWcnKVxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuL3JhbmdlJylcbiIsIi8vIGhvaXN0ZWQgY2xhc3MgZm9yIGN5Y2xpYyBkZXBlbmRlbmN5XG5jbGFzcyBSYW5nZSB7XG4gIGNvbnN0cnVjdG9yIChyYW5nZSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmIChyYW5nZSBpbnN0YW5jZW9mIFJhbmdlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHJhbmdlLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UgJiZcbiAgICAgICAgcmFuZ2UuaW5jbHVkZVByZXJlbGVhc2UgPT09ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiByYW5nZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZS5yYXcsIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJhbmdlIGluc3RhbmNlb2YgQ29tcGFyYXRvcikge1xuICAgICAgLy8ganVzdCBwdXQgaXQgaW4gdGhlIHNldCBhbmQgcmV0dXJuXG4gICAgICB0aGlzLnJhdyA9IHJhbmdlLnZhbHVlXG4gICAgICB0aGlzLnNldCA9IFtbcmFuZ2VdXVxuICAgICAgdGhpcy5mb3JtYXQoKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIHRoaXMuaW5jbHVkZVByZXJlbGVhc2UgPSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcblxuICAgIC8vIEZpcnN0IHJlZHVjZSBhbGwgd2hpdGVzcGFjZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHNvIHdlIGRvIG5vdCBoYXZlIHRvIHJlbHlcbiAgICAvLyBvbiBwb3RlbnRpYWxseSBzbG93IHJlZ2V4ZXMgbGlrZSBcXHMqLiBUaGlzIGlzIHRoZW4gc3RvcmVkIGFuZCB1c2VkIGZvclxuICAgIC8vIGZ1dHVyZSBlcnJvciBtZXNzYWdlcyBhcyB3ZWxsLlxuICAgIHRoaXMucmF3ID0gcmFuZ2VcbiAgICAgIC50cmltKClcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAuam9pbignICcpXG5cbiAgICAvLyBGaXJzdCwgc3BsaXQgb24gfHxcbiAgICB0aGlzLnNldCA9IHRoaXMucmF3XG4gICAgICAuc3BsaXQoJ3x8JylcbiAgICAgIC8vIG1hcCB0aGUgcmFuZ2UgdG8gYSAyZCBhcnJheSBvZiBjb21wYXJhdG9yc1xuICAgICAgLm1hcChyID0+IHRoaXMucGFyc2VSYW5nZShyLnRyaW0oKSkpXG4gICAgICAvLyB0aHJvdyBvdXQgYW55IGNvbXBhcmF0b3IgbGlzdHMgdGhhdCBhcmUgZW1wdHlcbiAgICAgIC8vIHRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgaXQgd2FzIG5vdCBhIHZhbGlkIHJhbmdlLCB3aGljaCBpcyBhbGxvd2VkXG4gICAgICAvLyBpbiBsb29zZSBtb2RlLCBidXQgd2lsbCBzdGlsbCB0aHJvdyBpZiB0aGUgV0hPTEUgcmFuZ2UgaXMgaW52YWxpZC5cbiAgICAgIC5maWx0ZXIoYyA9PiBjLmxlbmd0aClcblxuICAgIGlmICghdGhpcy5zZXQubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFNlbVZlciBSYW5nZTogJHt0aGlzLnJhd31gKVxuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgYW55IHRoYXQgYXJlIG5vdCB0aGUgbnVsbCBzZXQsIHRocm93IG91dCBudWxsIHNldHMuXG4gICAgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIGtlZXAgdGhlIGZpcnN0IG9uZSwgaW4gY2FzZSB0aGV5J3JlIGFsbCBudWxsIHNldHNcbiAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5zZXRbMF1cbiAgICAgIHRoaXMuc2V0ID0gdGhpcy5zZXQuZmlsdGVyKGMgPT4gIWlzTnVsbFNldChjWzBdKSlcbiAgICAgIGlmICh0aGlzLnNldC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zZXQgPSBbZmlyc3RdXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbnkgdGhhdCBhcmUgKiwgdGhlbiB0aGUgcmFuZ2UgaXMganVzdCAqXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLnNldCkge1xuICAgICAgICAgIGlmIChjLmxlbmd0aCA9PT0gMSAmJiBpc0FueShjWzBdKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQgPSBbY11cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtYXQoKVxuICB9XG5cbiAgZm9ybWF0ICgpIHtcbiAgICB0aGlzLnJhbmdlID0gdGhpcy5zZXRcbiAgICAgIC5tYXAoKGNvbXBzKSA9PiBjb21wcy5qb2luKCcgJykudHJpbSgpKVxuICAgICAgLmpvaW4oJ3x8JylcbiAgICAgIC50cmltKClcbiAgICByZXR1cm4gdGhpcy5yYW5nZVxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlXG4gIH1cblxuICBwYXJzZVJhbmdlIChyYW5nZSkge1xuICAgIC8vIG1lbW9pemUgcmFuZ2UgcGFyc2luZyBmb3IgcGVyZm9ybWFuY2UuXG4gICAgLy8gdGhpcyBpcyBhIHZlcnkgaG90IHBhdGgsIGFuZCBmdWxseSBkZXRlcm1pbmlzdGljLlxuICAgIGNvbnN0IG1lbW9PcHRzID1cbiAgICAgICh0aGlzLm9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgRkxBR19JTkNMVURFX1BSRVJFTEVBU0UpIHxcbiAgICAgICh0aGlzLm9wdGlvbnMubG9vc2UgJiYgRkxBR19MT09TRSlcbiAgICBjb25zdCBtZW1vS2V5ID0gbWVtb09wdHMgKyAnOicgKyByYW5nZVxuICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChtZW1vS2V5KVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRcbiAgICB9XG5cbiAgICBjb25zdCBsb29zZSA9IHRoaXMub3B0aW9ucy5sb29zZVxuICAgIC8vIGAxLjIuMyAtIDEuMi40YCA9PiBgPj0xLjIuMyA8PTEuMi40YFxuICAgIGNvbnN0IGhyID0gbG9vc2UgPyByZVt0LkhZUEhFTlJBTkdFTE9PU0VdIDogcmVbdC5IWVBIRU5SQU5HRV1cbiAgICByYW5nZSA9IHJhbmdlLnJlcGxhY2UoaHIsIGh5cGhlblJlcGxhY2UodGhpcy5vcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSlcbiAgICBkZWJ1ZygnaHlwaGVuIHJlcGxhY2UnLCByYW5nZSlcblxuICAgIC8vIGA+IDEuMi4zIDwgMS4yLjVgID0+IGA+MS4yLjMgPDEuMi41YFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LkNPTVBBUkFUT1JUUklNXSwgY29tcGFyYXRvclRyaW1SZXBsYWNlKVxuICAgIGRlYnVnKCdjb21wYXJhdG9yIHRyaW0nLCByYW5nZSlcblxuICAgIC8vIGB+IDEuMi4zYCA9PiBgfjEuMi4zYFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LlRJTERFVFJJTV0sIHRpbGRlVHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ3RpbGRlIHRyaW0nLCByYW5nZSlcblxuICAgIC8vIGBeIDEuMi4zYCA9PiBgXjEuMi4zYFxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LkNBUkVUVFJJTV0sIGNhcmV0VHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ2NhcmV0IHRyaW0nLCByYW5nZSlcblxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSByYW5nZSBpcyBjb21wbGV0ZWx5IHRyaW1tZWQgYW5kXG4gICAgLy8gcmVhZHkgdG8gYmUgc3BsaXQgaW50byBjb21wYXJhdG9ycy5cblxuICAgIGxldCByYW5nZUxpc3QgPSByYW5nZVxuICAgICAgLnNwbGl0KCcgJylcbiAgICAgIC5tYXAoY29tcCA9PiBwYXJzZUNvbXBhcmF0b3IoY29tcCwgdGhpcy5vcHRpb25zKSlcbiAgICAgIC5qb2luKCcgJylcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAvLyA+PTAuMC4wIGlzIGVxdWl2YWxlbnQgdG8gKlxuICAgICAgLm1hcChjb21wID0+IHJlcGxhY2VHVEUwKGNvbXAsIHRoaXMub3B0aW9ucykpXG5cbiAgICBpZiAobG9vc2UpIHtcbiAgICAgIC8vIGluIGxvb3NlIG1vZGUsIHRocm93IG91dCBhbnkgdGhhdCBhcmUgbm90IHZhbGlkIGNvbXBhcmF0b3JzXG4gICAgICByYW5nZUxpc3QgPSByYW5nZUxpc3QuZmlsdGVyKGNvbXAgPT4ge1xuICAgICAgICBkZWJ1ZygnbG9vc2UgaW52YWxpZCBmaWx0ZXInLCBjb21wLCB0aGlzLm9wdGlvbnMpXG4gICAgICAgIHJldHVybiAhIWNvbXAubWF0Y2gocmVbdC5DT01QQVJBVE9STE9PU0VdKVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVidWcoJ3JhbmdlIGxpc3QnLCByYW5nZUxpc3QpXG5cbiAgICAvLyBpZiBhbnkgY29tcGFyYXRvcnMgYXJlIHRoZSBudWxsIHNldCwgdGhlbiByZXBsYWNlIHdpdGggSlVTVCBudWxsIHNldFxuICAgIC8vIGlmIG1vcmUgdGhhbiBvbmUgY29tcGFyYXRvciwgcmVtb3ZlIGFueSAqIGNvbXBhcmF0b3JzXG4gICAgLy8gYWxzbywgZG9uJ3QgaW5jbHVkZSB0aGUgc2FtZSBjb21wYXJhdG9yIG1vcmUgdGhhbiBvbmNlXG4gICAgY29uc3QgcmFuZ2VNYXAgPSBuZXcgTWFwKClcbiAgICBjb25zdCBjb21wYXJhdG9ycyA9IHJhbmdlTGlzdC5tYXAoY29tcCA9PiBuZXcgQ29tcGFyYXRvcihjb21wLCB0aGlzLm9wdGlvbnMpKVxuICAgIGZvciAoY29uc3QgY29tcCBvZiBjb21wYXJhdG9ycykge1xuICAgICAgaWYgKGlzTnVsbFNldChjb21wKSkge1xuICAgICAgICByZXR1cm4gW2NvbXBdXG4gICAgICB9XG4gICAgICByYW5nZU1hcC5zZXQoY29tcC52YWx1ZSwgY29tcClcbiAgICB9XG4gICAgaWYgKHJhbmdlTWFwLnNpemUgPiAxICYmIHJhbmdlTWFwLmhhcygnJykpIHtcbiAgICAgIHJhbmdlTWFwLmRlbGV0ZSgnJylcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBbLi4ucmFuZ2VNYXAudmFsdWVzKCldXG4gICAgY2FjaGUuc2V0KG1lbW9LZXksIHJlc3VsdClcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBpbnRlcnNlY3RzIChyYW5nZSwgb3B0aW9ucykge1xuICAgIGlmICghKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhIFJhbmdlIGlzIHJlcXVpcmVkJylcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXQuc29tZSgodGhpc0NvbXBhcmF0b3JzKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpc1NhdGlzZmlhYmxlKHRoaXNDb21wYXJhdG9ycywgb3B0aW9ucykgJiZcbiAgICAgICAgcmFuZ2Uuc2V0LnNvbWUoKHJhbmdlQ29tcGFyYXRvcnMpID0+IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXNTYXRpc2ZpYWJsZShyYW5nZUNvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgICAgICAgdGhpc0NvbXBhcmF0b3JzLmV2ZXJ5KCh0aGlzQ29tcGFyYXRvcikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gcmFuZ2VDb21wYXJhdG9ycy5ldmVyeSgocmFuZ2VDb21wYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNDb21wYXJhdG9yLmludGVyc2VjdHMocmFuZ2VDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSlcbiAgfVxuXG4gIC8vIGlmIEFOWSBvZiB0aGUgc2V0cyBtYXRjaCBBTEwgb2YgaXRzIGNvbXBhcmF0b3JzLCB0aGVuIHBhc3NcbiAgdGVzdCAodmVyc2lvbikge1xuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgdGhpcy5vcHRpb25zKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNldC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRlc3RTZXQodGhpcy5zZXRbaV0sIHZlcnNpb24sIHRoaXMub3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSYW5nZVxuXG5jb25zdCBMUlUgPSByZXF1aXJlKCdscnUtY2FjaGUnKVxuY29uc3QgY2FjaGUgPSBuZXcgTFJVKHsgbWF4OiAxMDAwIH0pXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY29tcGFyYXRvcicpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vc2VtdmVyJylcbmNvbnN0IHtcbiAgc2FmZVJlOiByZSxcbiAgdCxcbiAgY29tcGFyYXRvclRyaW1SZXBsYWNlLFxuICB0aWxkZVRyaW1SZXBsYWNlLFxuICBjYXJldFRyaW1SZXBsYWNlLFxufSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IHsgRkxBR19JTkNMVURFX1BSRVJFTEVBU0UsIEZMQUdfTE9PU0UgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2NvbnN0YW50cycpXG5cbmNvbnN0IGlzTnVsbFNldCA9IGMgPT4gYy52YWx1ZSA9PT0gJzwwLjAuMC0wJ1xuY29uc3QgaXNBbnkgPSBjID0+IGMudmFsdWUgPT09ICcnXG5cbi8vIHRha2UgYSBzZXQgb2YgY29tcGFyYXRvcnMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZXJlXG4vLyBleGlzdHMgYSB2ZXJzaW9uIHdoaWNoIGNhbiBzYXRpc2Z5IGl0XG5jb25zdCBpc1NhdGlzZmlhYmxlID0gKGNvbXBhcmF0b3JzLCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXN1bHQgPSB0cnVlXG4gIGNvbnN0IHJlbWFpbmluZ0NvbXBhcmF0b3JzID0gY29tcGFyYXRvcnMuc2xpY2UoKVxuICBsZXQgdGVzdENvbXBhcmF0b3IgPSByZW1haW5pbmdDb21wYXJhdG9ycy5wb3AoKVxuXG4gIHdoaWxlIChyZXN1bHQgJiYgcmVtYWluaW5nQ29tcGFyYXRvcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gcmVtYWluaW5nQ29tcGFyYXRvcnMuZXZlcnkoKG90aGVyQ29tcGFyYXRvcikgPT4ge1xuICAgICAgcmV0dXJuIHRlc3RDb21wYXJhdG9yLmludGVyc2VjdHMob3RoZXJDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgIH0pXG5cbiAgICB0ZXN0Q29tcGFyYXRvciA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLnBvcCgpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIGNvbXByaXNlZCBvZiB4cmFuZ2VzLCB0aWxkZXMsIHN0YXJzLCBhbmQgZ3RsdCdzIGF0IHRoaXMgcG9pbnQuXG4vLyBhbHJlYWR5IHJlcGxhY2VkIHRoZSBoeXBoZW4gcmFuZ2VzXG4vLyB0dXJuIGludG8gYSBzZXQgb2YgSlVTVCBjb21wYXJhdG9ycy5cbmNvbnN0IHBhcnNlQ29tcGFyYXRvciA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjb21wJywgY29tcCwgb3B0aW9ucylcbiAgY29tcCA9IHJlcGxhY2VDYXJldHMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ2NhcmV0JywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VUaWxkZXMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3RpbGRlcycsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlWFJhbmdlcyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygneHJhbmdlJywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VTdGFycyhjb21wLCBvcHRpb25zKVxuICBkZWJ1Zygnc3RhcnMnLCBjb21wKVxuICByZXR1cm4gY29tcFxufVxuXG5jb25zdCBpc1ggPSBpZCA9PiAhaWQgfHwgaWQudG9Mb3dlckNhc2UoKSA9PT0gJ3gnIHx8IGlkID09PSAnKidcblxuLy8gfiwgfj4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyB+MiwgfjIueCwgfjIueC54LCB+PjIsIH4+Mi54IH4+Mi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIH4yLjAsIH4yLjAueCwgfj4yLjAsIH4+Mi4wLnggLS0+ID49Mi4wLjAgPDIuMS4wLTBcbi8vIH4xLjIsIH4xLjIueCwgfj4xLjIsIH4+MS4yLnggLS0+ID49MS4yLjAgPDEuMy4wLTBcbi8vIH4xLjIuMywgfj4xLjIuMyAtLT4gPj0xLjIuMyA8MS4zLjAtMFxuLy8gfjEuMi4wLCB+PjEuMi4wIC0tPiA+PTEuMi4wIDwxLjMuMC0wXG4vLyB+MC4wLjEgLS0+ID49MC4wLjEgPDAuMS4wLTBcbmNvbnN0IHJlcGxhY2VUaWxkZXMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VUaWxkZShjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VUaWxkZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5USUxERUxPT1NFXSA6IHJlW3QuVElMREVdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ3RpbGRlJywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAgPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgLy8gfjEuMiA9PSA+PTEuMi4wIDwxLjMuMC0wXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uMCA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlVGlsZGUgcHInLCBwcilcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gfjEuMi4zID09ID49MS4yLjMgPDEuMy4wLTBcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9XG5cbiAgICBkZWJ1ZygndGlsZGUgcmV0dXJuJywgcmV0KVxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuLy8gXiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIF4yLCBeMi54LCBeMi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIF4yLjAsIF4yLjAueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gXjEuMiwgXjEuMi54IC0tPiA+PTEuMi4wIDwyLjAuMC0wXG4vLyBeMS4yLjMgLS0+ID49MS4yLjMgPDIuMC4wLTBcbi8vIF4xLjIuMCAtLT4gPj0xLjIuMCA8Mi4wLjAtMFxuLy8gXjAuMC4xIC0tPiA+PTAuMC4xIDwwLjAuMi0wXG4vLyBeMC4xLjAgLS0+ID49MC4xLjAgPDAuMi4wLTBcbmNvbnN0IHJlcGxhY2VDYXJldHMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VDYXJldChjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VDYXJldCA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjYXJldCcsIGNvbXAsIG9wdGlvbnMpXG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5DQVJFVExPT1NFXSA6IHJlW3QuQ0FSRVRdXG4gIGNvbnN0IHogPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gJy0wJyA6ICcnXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ2NhcmV0JywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3p9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmIChpc1gocCkpIHtcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7en0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByKSB7XG4gICAgICBkZWJ1ZygncmVwbGFjZUNhcmV0IHByJywgcHIpXG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgICAgfSA8JHtNfS4ke219LiR7K3AgKyAxfS0wYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Zygnbm8gcHInKVxuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7bX0uJHsrcCArIDF9LTBgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH1cblxuICAgIGRlYnVnKCdjYXJldCByZXR1cm4nLCByZXQpXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG5jb25zdCByZXBsYWNlWFJhbmdlcyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlWFJhbmdlcycsIGNvbXAsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlWFJhbmdlKGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZVhSYW5nZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbXAgPSBjb21wLnRyaW0oKVxuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuWFJBTkdFTE9PU0VdIDogcmVbdC5YUkFOR0VdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygneFJhbmdlJywgY29tcCwgcmV0LCBndGx0LCBNLCBtLCBwLCBwcilcbiAgICBjb25zdCB4TSA9IGlzWChNKVxuICAgIGNvbnN0IHhtID0geE0gfHwgaXNYKG0pXG4gICAgY29uc3QgeHAgPSB4bSB8fCBpc1gocClcbiAgICBjb25zdCBhbnlYID0geHBcblxuICAgIGlmIChndGx0ID09PSAnPScgJiYgYW55WCkge1xuICAgICAgZ3RsdCA9ICcnXG4gICAgfVxuXG4gICAgLy8gaWYgd2UncmUgaW5jbHVkaW5nIHByZXJlbGVhc2VzIGluIHRoZSBtYXRjaCwgdGhlbiB3ZSBuZWVkXG4gICAgLy8gdG8gZml4IHRoaXMgdG8gLTAsIHRoZSBsb3dlc3QgcG9zc2libGUgcHJlcmVsZWFzZSB2YWx1ZVxuICAgIHByID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/ICctMCcgOiAnJ1xuXG4gICAgaWYgKHhNKSB7XG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nIHx8IGd0bHQgPT09ICc8Jykge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGFsbG93ZWRcbiAgICAgICAgcmV0ID0gJzwwLjAuMC0wJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBmb3JiaWRkZW5cbiAgICAgICAgcmV0ID0gJyonXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChndGx0ICYmIGFueVgpIHtcbiAgICAgIC8vIHdlIGtub3cgcGF0Y2ggaXMgYW4geCwgYmVjYXVzZSB3ZSBoYXZlIGFueSB4IGF0IGFsbC5cbiAgICAgIC8vIHJlcGxhY2UgWCB3aXRoIDBcbiAgICAgIGlmICh4bSkge1xuICAgICAgICBtID0gMFxuICAgICAgfVxuICAgICAgcCA9IDBcblxuICAgICAgaWYgKGd0bHQgPT09ICc+Jykge1xuICAgICAgICAvLyA+MSA9PiA+PTIuMC4wXG4gICAgICAgIC8vID4xLjIgPT4gPj0xLjMuMFxuICAgICAgICBndGx0ID0gJz49J1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxXG4gICAgICAgICAgbSA9IDBcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0bHQgPT09ICc8PScpIHtcbiAgICAgICAgLy8gPD0wLjcueCBpcyBhY3R1YWxseSA8MC44LjAsIHNpbmNlIGFueSAwLjcueCBzaG91bGRcbiAgICAgICAgLy8gcGFzcy4gIFNpbWlsYXJseSwgPD03LnggaXMgYWN0dWFsbHkgPDguMC4wLCBldGMuXG4gICAgICAgIGd0bHQgPSAnPCdcbiAgICAgICAgaWYgKHhtKSB7XG4gICAgICAgICAgTSA9ICtNICsgMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIHByID0gJy0wJ1xuICAgICAgfVxuXG4gICAgICByZXQgPSBgJHtndGx0ICsgTX0uJHttfS4ke3B9JHtwcn1gXG4gICAgfSBlbHNlIGlmICh4bSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3ByfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoeHApIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHtwclxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH1cblxuICAgIGRlYnVnKCd4UmFuZ2UgcmV0dXJuJywgcmV0KVxuXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG4vLyBCZWNhdXNlICogaXMgQU5ELWVkIHdpdGggZXZlcnl0aGluZyBlbHNlIGluIHRoZSBjb21wYXJhdG9yLFxuLy8gYW5kICcnIG1lYW5zIFwiYW55IHZlcnNpb25cIiwganVzdCByZW1vdmUgdGhlICpzIGVudGlyZWx5LlxuY29uc3QgcmVwbGFjZVN0YXJzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VTdGFycycsIGNvbXAsIG9wdGlvbnMpXG4gIC8vIExvb3NlbmVzcyBpcyBpZ25vcmVkIGhlcmUuICBzdGFyIGlzIGFsd2F5cyBhcyBsb29zZSBhcyBpdCBnZXRzIVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVt0LlNUQVJdLCAnJylcbn1cblxuY29uc3QgcmVwbGFjZUdURTAgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZUdURTAnLCBjb21wLCBvcHRpb25zKVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVtvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gdC5HVEUwUFJFIDogdC5HVEUwXSwgJycpXG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHN0cmluZy5yZXBsYWNlKHJlW3QuSFlQSEVOUkFOR0VdKVxuLy8gTSwgbSwgcGF0Y2gsIHByZXJlbGVhc2UsIGJ1aWxkXG4vLyAxLjIgLSAzLjQuNSA9PiA+PTEuMi4wIDw9My40LjVcbi8vIDEuMi4zIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wLTAgQW55IDMuNC54IHdpbGwgZG9cbi8vIDEuMiAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMC0wXG5jb25zdCBoeXBoZW5SZXBsYWNlID0gaW5jUHIgPT4gKCQwLFxuICBmcm9tLCBmTSwgZm0sIGZwLCBmcHIsIGZiLFxuICB0bywgdE0sIHRtLCB0cCwgdHByLCB0YikgPT4ge1xuICBpZiAoaXNYKGZNKSkge1xuICAgIGZyb20gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWChmbSkpIHtcbiAgICBmcm9tID0gYD49JHtmTX0uMC4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoaXNYKGZwKSkge1xuICAgIGZyb20gPSBgPj0ke2ZNfS4ke2ZtfS4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoZnByKSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX1gXG4gIH0gZWxzZSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX0ke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfVxuXG4gIGlmIChpc1godE0pKSB7XG4gICAgdG8gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWCh0bSkpIHtcbiAgICB0byA9IGA8JHsrdE0gKyAxfS4wLjAtMGBcbiAgfSBlbHNlIGlmIChpc1godHApKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7K3RtICsgMX0uMC0wYFxuICB9IGVsc2UgaWYgKHRwcikge1xuICAgIHRvID0gYDw9JHt0TX0uJHt0bX0uJHt0cH0tJHt0cHJ9YFxuICB9IGVsc2UgaWYgKGluY1ByKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7dG19LiR7K3RwICsgMX0tMGBcbiAgfSBlbHNlIHtcbiAgICB0byA9IGA8PSR7dG99YFxuICB9XG5cbiAgcmV0dXJuIGAke2Zyb219ICR7dG99YC50cmltKClcbn1cblxuY29uc3QgdGVzdFNldCA9IChzZXQsIHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIXNldFtpXS50ZXN0KHZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBpZiAodmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgIC8vIEZpbmQgdGhlIHNldCBvZiB2ZXJzaW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIGhhdmUgcHJlcmVsZWFzZXNcbiAgICAvLyBGb3IgZXhhbXBsZSwgXjEuMi4zLXByLjEgZGVzdWdhcnMgdG8gPj0xLjIuMy1wci4xIDwyLjAuMFxuICAgIC8vIFRoYXQgc2hvdWxkIGFsbG93IGAxLjIuMy1wci4yYCB0byBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIGAxLjIuNC1hbHBoYS5ub3RyZWFkeWAgc2hvdWxkIE5PVCBiZSBhbGxvd2VkLFxuICAgIC8vIGV2ZW4gdGhvdWdoIGl0J3Mgd2l0aGluIHRoZSByYW5nZSBzZXQgYnkgdGhlIGNvbXBhcmF0b3JzLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWJ1ZyhzZXRbaV0uc2VtdmVyKVxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIgPT09IENvbXBhcmF0b3IuQU5ZKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gc2V0W2ldLnNlbXZlclxuICAgICAgICBpZiAoYWxsb3dlZC5tYWpvciA9PT0gdmVyc2lvbi5tYWpvciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5taW5vciA9PT0gdmVyc2lvbi5taW5vciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5wYXRjaCA9PT0gdmVyc2lvbi5wYXRjaCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWZXJzaW9uIGhhcyBhIC1wcmUsIGJ1dCBpdCdzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2UgbGlrZS5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLCJjb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IHsgTUFYX0xFTkdUSCwgTUFYX1NBRkVfSU5URUdFUiB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IHsgY29tcGFyZUlkZW50aWZpZXJzIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pZGVudGlmaWVycycpXG5jbGFzcyBTZW1WZXIge1xuICBjb25zdHJ1Y3RvciAodmVyc2lvbiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgICBpZiAodmVyc2lvbi5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlICYmXG4gICAgICAgICAgdmVyc2lvbi5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi52ZXJzaW9uXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgdmVyc2lvbi4gTXVzdCBiZSBhIHN0cmluZy4gR290IHR5cGUgXCIke3R5cGVvZiB2ZXJzaW9ufVwiLmApXG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24ubGVuZ3RoID4gTUFYX0xFTkdUSCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYHZlcnNpb24gaXMgbG9uZ2VyIHRoYW4gJHtNQVhfTEVOR1RIfSBjaGFyYWN0ZXJzYFxuICAgICAgKVxuICAgIH1cblxuICAgIGRlYnVnKCdTZW1WZXInLCB2ZXJzaW9uLCBvcHRpb25zKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgLy8gdGhpcyBpc24ndCBhY3R1YWxseSByZWxldmFudCBmb3IgdmVyc2lvbnMsIGJ1dCBrZWVwIGl0IHNvIHRoYXQgd2VcbiAgICAvLyBkb24ndCBydW4gaW50byB0cm91YmxlIHBhc3NpbmcgdGhpcy5vcHRpb25zIGFyb3VuZC5cbiAgICB0aGlzLmluY2x1ZGVQcmVyZWxlYXNlID0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG5cbiAgICBjb25zdCBtID0gdmVyc2lvbi50cmltKCkubWF0Y2gob3B0aW9ucy5sb29zZSA/IHJlW3QuTE9PU0VdIDogcmVbdC5GVUxMXSlcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBWZXJzaW9uOiAke3ZlcnNpb259YClcbiAgICB9XG5cbiAgICB0aGlzLnJhdyA9IHZlcnNpb25cblxuICAgIC8vIHRoZXNlIGFyZSBhY3R1YWxseSBudW1iZXJzXG4gICAgdGhpcy5tYWpvciA9ICttWzFdXG4gICAgdGhpcy5taW5vciA9ICttWzJdXG4gICAgdGhpcy5wYXRjaCA9ICttWzNdXG5cbiAgICBpZiAodGhpcy5tYWpvciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5tYWpvciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWFqb3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWlub3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWlub3IgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1pbm9yIHZlcnNpb24nKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBhdGNoID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLnBhdGNoIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBwYXRjaCB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICAvLyBudW1iZXJpZnkgYW55IHByZXJlbGVhc2UgbnVtZXJpYyBpZHNcbiAgICBpZiAoIW1bNF0pIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IG1bNF0uc3BsaXQoJy4nKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgIGlmICgvXlswLTldKyQvLnRlc3QoaWQpKSB7XG4gICAgICAgICAgY29uc3QgbnVtID0gK2lkXG4gICAgICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuYnVpbGQgPSBtWzVdID8gbVs1XS5zcGxpdCgnLicpIDogW11cbiAgICB0aGlzLmZvcm1hdCgpXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHRoaXMudmVyc2lvbiA9IGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLnBhdGNofWBcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgdGhpcy52ZXJzaW9uICs9IGAtJHt0aGlzLnByZXJlbGVhc2Uuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnNpb25cbiAgfVxuXG4gIGNvbXBhcmUgKG90aGVyKSB7XG4gICAgZGVidWcoJ1NlbVZlci5jb21wYXJlJywgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMsIG90aGVyKVxuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gJ3N0cmluZycgJiYgb3RoZXIgPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgaWYgKG90aGVyLnZlcnNpb24gPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21wYXJlTWFpbihvdGhlcikgfHwgdGhpcy5jb21wYXJlUHJlKG90aGVyKVxuICB9XG5cbiAgY29tcGFyZU1haW4gKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWFqb3IsIG90aGVyLm1ham9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWlub3IsIG90aGVyLm1pbm9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucGF0Y2gsIG90aGVyLnBhdGNoKVxuICAgIClcbiAgfVxuXG4gIGNvbXBhcmVQcmUgKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICAvLyBOT1QgaGF2aW5nIGEgcHJlcmVsZWFzZSBpcyA+IGhhdmluZyBvbmVcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH0gZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMucHJlcmVsZWFzZVtpXVxuICAgICAgY29uc3QgYiA9IG90aGVyLnByZXJlbGVhc2VbaV1cbiAgICAgIGRlYnVnKCdwcmVyZWxlYXNlIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIGNvbXBhcmVCdWlsZCAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIGxldCBpID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmJ1aWxkW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIuYnVpbGRbaV1cbiAgICAgIGRlYnVnKCdwcmVyZWxlYXNlIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIC8vIHByZW1pbm9yIHdpbGwgYnVtcCB0aGUgdmVyc2lvbiB1cCB0byB0aGUgbmV4dCBtaW5vciByZWxlYXNlLCBhbmQgaW1tZWRpYXRlbHlcbiAgLy8gZG93biB0byBwcmUtcmVsZWFzZS4gcHJlbWFqb3IgYW5kIHByZXBhdGNoIHdvcmsgdGhlIHNhbWUgd2F5LlxuICBpbmMgKHJlbGVhc2UsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKSB7XG4gICAgc3dpdGNoIChyZWxlYXNlKSB7XG4gICAgICBjYXNlICdwcmVtYWpvcic6XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMubWlub3IgPSAwXG4gICAgICAgIHRoaXMubWFqb3IrK1xuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwcmVtaW5vcic6XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMubWlub3IrK1xuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwcmVwYXRjaCc6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYWxyZWFkeSBhIHByZXJlbGVhc2UsIGl0IHdpbGwgYnVtcCB0byB0aGUgbmV4dCB2ZXJzaW9uXG4gICAgICAgIC8vIGRyb3AgYW55IHByZXJlbGVhc2VzIHRoYXQgbWlnaHQgYWxyZWFkeSBleGlzdCwgc2luY2UgdGhleSBhcmUgbm90XG4gICAgICAgIC8vIHJlbGV2YW50IGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBJZiB0aGUgaW5wdXQgaXMgYSBub24tcHJlcmVsZWFzZSB2ZXJzaW9uLCB0aGlzIGFjdHMgdGhlIHNhbWUgYXNcbiAgICAgIC8vIHByZXBhdGNoLlxuICAgICAgY2FzZSAncHJlcmVsZWFzZSc6XG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlICdtYWpvcic6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWFqb3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uLlxuICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1ham9yLlxuICAgICAgICAvLyAxLjAuMC01IGJ1bXBzIHRvIDEuMC4wXG4gICAgICAgIC8vIDEuMS4wIGJ1bXBzIHRvIDIuMC4wXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLm1pbm9yICE9PSAwIHx8XG4gICAgICAgICAgdGhpcy5wYXRjaCAhPT0gMCB8fFxuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5tYWpvcisrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5taW5vciA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW11cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ21pbm9yJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1taW5vciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1pbm9yIHZlcnNpb24uXG4gICAgICAgIC8vIE90aGVyd2lzZSBpbmNyZW1lbnQgbWlub3IuXG4gICAgICAgIC8vIDEuMi4wLTUgYnVtcHMgdG8gMS4yLjBcbiAgICAgICAgLy8gMS4yLjEgYnVtcHMgdG8gMS4zLjBcbiAgICAgICAgaWYgKHRoaXMucGF0Y2ggIT09IDAgfHwgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMubWlub3IrK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdwYXRjaCc6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiwgaXQgd2lsbCBpbmNyZW1lbnQgdGhlIHBhdGNoLlxuICAgICAgICAvLyBJZiBpdCBpcyBhIHByZS1yZWxlYXNlIGl0IHdpbGwgYnVtcCB1cCB0byB0aGUgc2FtZSBwYXRjaCB2ZXJzaW9uLlxuICAgICAgICAvLyAxLjIuMC01IHBhdGNoZXMgdG8gMS4yLjBcbiAgICAgICAgLy8gMS4yLjAgcGF0Y2hlcyB0byAxLjIuMVxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMucGF0Y2grK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICAvLyBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSB1c2VkIHB1YmxpY2x5LlxuICAgICAgLy8gMS4wLjAgJ3ByZScgd291bGQgYmVjb21lIDEuMC4wLTAgd2hpY2ggaXMgdGhlIHdyb25nIGRpcmVjdGlvbi5cbiAgICAgIGNhc2UgJ3ByZSc6IHtcbiAgICAgICAgY29uc3QgYmFzZSA9IE51bWJlcihpZGVudGlmaWVyQmFzZSkgPyAxIDogMFxuXG4gICAgICAgIGlmICghaWRlbnRpZmllciAmJiBpZGVudGlmaWVyQmFzZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiBpZGVudGlmaWVyIGlzIGVtcHR5JylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW2Jhc2VdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGkgPSB0aGlzLnByZXJlbGVhc2UubGVuZ3RoXG4gICAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlcmVsZWFzZVtpXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlW2ldKytcbiAgICAgICAgICAgICAgaSA9IC0yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpID09PSAtMSkge1xuICAgICAgICAgICAgLy8gZGlkbid0IGluY3JlbWVudCBhbnl0aGluZ1xuICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIgPT09IHRoaXMucHJlcmVsZWFzZS5qb2luKCcuJykgJiYgaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6IGlkZW50aWZpZXIgYWxyZWFkeSBleGlzdHMnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlLnB1c2goYmFzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAvLyAxLjIuMC1iZXRhLjEgYnVtcHMgdG8gMS4yLjAtYmV0YS4yLFxuICAgICAgICAgIC8vIDEuMi4wLWJldGEuZm9vYmx6IG9yIDEuMi4wLWJldGEgYnVtcHMgdG8gMS4yLjAtYmV0YS4wXG4gICAgICAgICAgbGV0IHByZXJlbGVhc2UgPSBbaWRlbnRpZmllciwgYmFzZV1cbiAgICAgICAgICBpZiAoaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBwcmVyZWxlYXNlID0gW2lkZW50aWZpZXJdXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb21wYXJlSWRlbnRpZmllcnModGhpcy5wcmVyZWxlYXNlWzBdLCBpZGVudGlmaWVyKSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGlzTmFOKHRoaXMucHJlcmVsZWFzZVsxXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiAke3JlbGVhc2V9YClcbiAgICB9XG4gICAgdGhpcy5yYXcgPSB0aGlzLmZvcm1hdCgpXG4gICAgaWYgKHRoaXMuYnVpbGQubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJhdyArPSBgKyR7dGhpcy5idWlsZC5qb2luKCcuJyl9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2VtVmVyXG4iLCJjb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgY2xlYW4gPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBzID0gcGFyc2UodmVyc2lvbi50cmltKCkucmVwbGFjZSgvXls9dl0rLywgJycpLCBvcHRpb25zKVxuICByZXR1cm4gcyA/IHMudmVyc2lvbiA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gY2xlYW5cbiIsImNvbnN0IGVxID0gcmVxdWlyZSgnLi9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL25lcScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZ3QnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9ndGUnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vbHRlJylcblxuY29uc3QgY21wID0gKGEsIG9wLCBiLCBsb29zZSkgPT4ge1xuICBzd2l0Y2ggKG9wKSB7XG4gICAgY2FzZSAnPT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSA9PT0gYlxuXG4gICAgY2FzZSAnIT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSAhPT0gYlxuXG4gICAgY2FzZSAnJzpcbiAgICBjYXNlICc9JzpcbiAgICBjYXNlICc9PSc6XG4gICAgICByZXR1cm4gZXEoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICchPSc6XG4gICAgICByZXR1cm4gbmVxKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPic6XG4gICAgICByZXR1cm4gZ3QoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc+PSc6XG4gICAgICByZXR1cm4gZ3RlKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPCc6XG4gICAgICByZXR1cm4gbHQoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc8PSc6XG4gICAgICByZXR1cm4gbHRlKGEsIGIsIGxvb3NlKVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgb3BlcmF0b3I6ICR7b3B9YClcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBjbXBcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcblxuY29uc3QgY29lcmNlID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvblxuICB9XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHZlcnNpb24gPSBTdHJpbmcodmVyc2lvbilcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBsZXQgbWF0Y2ggPSBudWxsXG4gIGlmICghb3B0aW9ucy5ydGwpIHtcbiAgICBtYXRjaCA9IHZlcnNpb24ubWF0Y2gob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFRlVMTF0gOiByZVt0LkNPRVJDRV0pXG4gIH0gZWxzZSB7XG4gICAgLy8gRmluZCB0aGUgcmlnaHQtbW9zdCBjb2VyY2libGUgc3RyaW5nIHRoYXQgZG9lcyBub3Qgc2hhcmVcbiAgICAvLyBhIHRlcm1pbnVzIHdpdGggYSBtb3JlIGxlZnQtd2FyZCBjb2VyY2libGUgc3RyaW5nLlxuICAgIC8vIEVnLCAnMS4yLjMuNCcgd2FudHMgdG8gY29lcmNlICcyLjMuNCcsIG5vdCAnMy40JyBvciAnNCdcbiAgICAvLyBXaXRoIGluY2x1ZGVQcmVyZWxlYXNlIG9wdGlvbiBzZXQsICcxLjIuMy40LXJjJyB3YW50cyB0byBjb2VyY2UgJzIuMy40LXJjJywgbm90ICcyLjMuNCdcbiAgICAvL1xuICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgc3RyaW5nIGNoZWNraW5nIHdpdGggYSAvZyByZWdleHBcbiAgICAvLyBNYW51YWxseSBzZXQgdGhlIGluZGV4IHNvIGFzIHRvIHBpY2sgdXAgb3ZlcmxhcHBpbmcgbWF0Y2hlcy5cbiAgICAvLyBTdG9wIHdoZW4gd2UgZ2V0IGEgbWF0Y2ggdGhhdCBlbmRzIGF0IHRoZSBzdHJpbmcgZW5kLCBzaW5jZSBub1xuICAgIC8vIGNvZXJjaWJsZSBzdHJpbmcgY2FuIGJlIG1vcmUgcmlnaHQtd2FyZCB3aXRob3V0IHRoZSBzYW1lIHRlcm1pbnVzLlxuICAgIGNvbnN0IGNvZXJjZVJ0bFJlZ2V4ID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFUlRMRlVMTF0gOiByZVt0LkNPRVJDRVJUTF1cbiAgICBsZXQgbmV4dFxuICAgIHdoaWxlICgobmV4dCA9IGNvZXJjZVJ0bFJlZ2V4LmV4ZWModmVyc2lvbikpICYmXG4gICAgICAgICghbWF0Y2ggfHwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggIT09IHZlcnNpb24ubGVuZ3RoKVxuICAgICkge1xuICAgICAgaWYgKCFtYXRjaCB8fFxuICAgICAgICAgICAgbmV4dC5pbmRleCArIG5leHRbMF0ubGVuZ3RoICE9PSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCkge1xuICAgICAgICBtYXRjaCA9IG5leHRcbiAgICAgIH1cbiAgICAgIGNvZXJjZVJ0bFJlZ2V4Lmxhc3RJbmRleCA9IG5leHQuaW5kZXggKyBuZXh0WzFdLmxlbmd0aCArIG5leHRbMl0ubGVuZ3RoXG4gICAgfVxuICAgIC8vIGxlYXZlIGl0IGluIGEgY2xlYW4gc3RhdGVcbiAgICBjb2VyY2VSdGxSZWdleC5sYXN0SW5kZXggPSAtMVxuICB9XG5cbiAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IG1ham9yID0gbWF0Y2hbMl1cbiAgY29uc3QgbWlub3IgPSBtYXRjaFszXSB8fCAnMCdcbiAgY29uc3QgcGF0Y2ggPSBtYXRjaFs0XSB8fCAnMCdcbiAgY29uc3QgcHJlcmVsZWFzZSA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgbWF0Y2hbNV0gPyBgLSR7bWF0Y2hbNV19YCA6ICcnXG4gIGNvbnN0IGJ1aWxkID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBtYXRjaFs2XSA/IGArJHttYXRjaFs2XX1gIDogJydcblxuICByZXR1cm4gcGFyc2UoYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9JHtwcmVyZWxlYXNlfSR7YnVpbGR9YCwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gY29lcmNlXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBjb21wYXJlQnVpbGQgPSAoYSwgYiwgbG9vc2UpID0+IHtcbiAgY29uc3QgdmVyc2lvbkEgPSBuZXcgU2VtVmVyKGEsIGxvb3NlKVxuICBjb25zdCB2ZXJzaW9uQiA9IG5ldyBTZW1WZXIoYiwgbG9vc2UpXG4gIHJldHVybiB2ZXJzaW9uQS5jb21wYXJlKHZlcnNpb25CKSB8fCB2ZXJzaW9uQS5jb21wYXJlQnVpbGQodmVyc2lvbkIpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVCdWlsZFxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBjb21wYXJlTG9vc2UgPSAoYSwgYikgPT4gY29tcGFyZShhLCBiLCB0cnVlKVxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlTG9vc2VcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGNvbXBhcmUgPSAoYSwgYiwgbG9vc2UpID0+XG4gIG5ldyBTZW1WZXIoYSwgbG9vc2UpLmNvbXBhcmUobmV3IFNlbVZlcihiLCBsb29zZSkpXG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZVxuIiwiY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlLmpzJylcblxuY29uc3QgZGlmZiA9ICh2ZXJzaW9uMSwgdmVyc2lvbjIpID0+IHtcbiAgY29uc3QgdjEgPSBwYXJzZSh2ZXJzaW9uMSwgbnVsbCwgdHJ1ZSlcbiAgY29uc3QgdjIgPSBwYXJzZSh2ZXJzaW9uMiwgbnVsbCwgdHJ1ZSlcbiAgY29uc3QgY29tcGFyaXNvbiA9IHYxLmNvbXBhcmUodjIpXG5cbiAgaWYgKGNvbXBhcmlzb24gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgdjFIaWdoZXIgPSBjb21wYXJpc29uID4gMFxuICBjb25zdCBoaWdoVmVyc2lvbiA9IHYxSGlnaGVyID8gdjEgOiB2MlxuICBjb25zdCBsb3dWZXJzaW9uID0gdjFIaWdoZXIgPyB2MiA6IHYxXG4gIGNvbnN0IGhpZ2hIYXNQcmUgPSAhIWhpZ2hWZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoXG4gIGNvbnN0IGxvd0hhc1ByZSA9ICEhbG93VmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aFxuXG4gIGlmIChsb3dIYXNQcmUgJiYgIWhpZ2hIYXNQcmUpIHtcbiAgICAvLyBHb2luZyBmcm9tIHByZXJlbGVhc2UgLT4gbm8gcHJlcmVsZWFzZSByZXF1aXJlcyBzb21lIHNwZWNpYWwgY2FzaW5nXG5cbiAgICAvLyBJZiB0aGUgbG93IHZlcnNpb24gaGFzIG9ubHkgYSBtYWpvciwgdGhlbiBpdCB3aWxsIGFsd2F5cyBiZSBhIG1ham9yXG4gICAgLy8gU29tZSBleGFtcGxlczpcbiAgICAvLyAxLjAuMC0xIC0+IDEuMC4wXG4gICAgLy8gMS4wLjAtMSAtPiAxLjEuMVxuICAgIC8vIDEuMC4wLTEgLT4gMi4wLjBcbiAgICBpZiAoIWxvd1ZlcnNpb24ucGF0Y2ggJiYgIWxvd1ZlcnNpb24ubWlub3IpIHtcbiAgICAgIHJldHVybiAnbWFqb3InXG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIGl0IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIHRoZSBoaWdoIHZlcnNpb25cblxuICAgIGlmIChoaWdoVmVyc2lvbi5wYXRjaCkge1xuICAgICAgLy8gYW55dGhpbmcgaGlnaGVyIHRoYW4gYSBwYXRjaCBidW1wIHdvdWxkIHJlc3VsdCBpbiB0aGUgd3JvbmcgdmVyc2lvblxuICAgICAgcmV0dXJuICdwYXRjaCdcbiAgICB9XG5cbiAgICBpZiAoaGlnaFZlcnNpb24ubWlub3IpIHtcbiAgICAgIC8vIGFueXRoaW5nIGhpZ2hlciB0aGFuIGEgbWlub3IgYnVtcCB3b3VsZCByZXN1bHQgaW4gdGhlIHdyb25nIHZlcnNpb25cbiAgICAgIHJldHVybiAnbWlub3InXG4gICAgfVxuXG4gICAgLy8gYnVtcGluZyBtYWpvci9taW5vci9wYXRjaCBhbGwgaGF2ZSBzYW1lIHJlc3VsdFxuICAgIHJldHVybiAnbWFqb3InXG4gIH1cblxuICAvLyBhZGQgdGhlIGBwcmVgIHByZWZpeCBpZiB3ZSBhcmUgZ29pbmcgdG8gYSBwcmVyZWxlYXNlIHZlcnNpb25cbiAgY29uc3QgcHJlZml4ID0gaGlnaEhhc1ByZSA/ICdwcmUnIDogJydcblxuICBpZiAodjEubWFqb3IgIT09IHYyLm1ham9yKSB7XG4gICAgcmV0dXJuIHByZWZpeCArICdtYWpvcidcbiAgfVxuXG4gIGlmICh2MS5taW5vciAhPT0gdjIubWlub3IpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJ21pbm9yJ1xuICB9XG5cbiAgaWYgKHYxLnBhdGNoICE9PSB2Mi5wYXRjaCkge1xuICAgIHJldHVybiBwcmVmaXggKyAncGF0Y2gnXG4gIH1cblxuICAvLyBoaWdoIGFuZCBsb3cgYXJlIHByZWxlYXNlc1xuICByZXR1cm4gJ3ByZXJlbGVhc2UnXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGlmZlxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBlcSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPT09IDBcbm1vZHVsZS5leHBvcnRzID0gZXFcbiIsImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgZ3QgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID4gMFxubW9kdWxlLmV4cG9ydHMgPSBndFxuIiwiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBndGUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID49IDBcbm1vZHVsZS5leHBvcnRzID0gZ3RlXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5cbmNvbnN0IGluYyA9ICh2ZXJzaW9uLCByZWxlYXNlLCBvcHRpb25zLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkgPT4ge1xuICBpZiAodHlwZW9mIChvcHRpb25zKSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZGVudGlmaWVyQmFzZSA9IGlkZW50aWZpZXJcbiAgICBpZGVudGlmaWVyID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSB1bmRlZmluZWRcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBTZW1WZXIoXG4gICAgICB2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyID8gdmVyc2lvbi52ZXJzaW9uIDogdmVyc2lvbixcbiAgICAgIG9wdGlvbnNcbiAgICApLmluYyhyZWxlYXNlLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkudmVyc2lvblxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gaW5jXG4iLCJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGx0ID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA8IDBcbm1vZHVsZS5leHBvcnRzID0gbHRcbiIsImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbHRlID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA8PSAwXG5tb2R1bGUuZXhwb3J0cyA9IGx0ZVxuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgbWFqb3IgPSAoYSwgbG9vc2UpID0+IG5ldyBTZW1WZXIoYSwgbG9vc2UpLm1ham9yXG5tb2R1bGUuZXhwb3J0cyA9IG1ham9yXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBtaW5vciA9IChhLCBsb29zZSkgPT4gbmV3IFNlbVZlcihhLCBsb29zZSkubWlub3Jcbm1vZHVsZS5leHBvcnRzID0gbWlub3JcbiIsImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbmVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSAhPT0gMFxubW9kdWxlLmV4cG9ydHMgPSBuZXFcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhcnNlID0gKHZlcnNpb24sIG9wdGlvbnMsIHRocm93RXJyb3JzID0gZmFsc2UpID0+IHtcbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvblxuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBTZW1WZXIodmVyc2lvbiwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICBpZiAoIXRocm93RXJyb3JzKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICB0aHJvdyBlclxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2VcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhdGNoID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5wYXRjaFxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaFxuIiwiY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHByZXJlbGVhc2UgPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZSh2ZXJzaW9uLCBvcHRpb25zKVxuICByZXR1cm4gKHBhcnNlZCAmJiBwYXJzZWQucHJlcmVsZWFzZS5sZW5ndGgpID8gcGFyc2VkLnByZXJlbGVhc2UgOiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IHByZXJlbGVhc2VcbiIsImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgcmNvbXBhcmUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYiwgYSwgbG9vc2UpXG5tb2R1bGUuZXhwb3J0cyA9IHJjb21wYXJlXG4iLCJjb25zdCBjb21wYXJlQnVpbGQgPSByZXF1aXJlKCcuL2NvbXBhcmUtYnVpbGQnKVxuY29uc3QgcnNvcnQgPSAobGlzdCwgbG9vc2UpID0+IGxpc3Quc29ydCgoYSwgYikgPT4gY29tcGFyZUJ1aWxkKGIsIGEsIGxvb3NlKSlcbm1vZHVsZS5leHBvcnRzID0gcnNvcnRcbiIsImNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICByYW5nZSA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gcmFuZ2UudGVzdCh2ZXJzaW9uKVxufVxubW9kdWxlLmV4cG9ydHMgPSBzYXRpc2ZpZXNcbiIsImNvbnN0IGNvbXBhcmVCdWlsZCA9IHJlcXVpcmUoJy4vY29tcGFyZS1idWlsZCcpXG5jb25zdCBzb3J0ID0gKGxpc3QsIGxvb3NlKSA9PiBsaXN0LnNvcnQoKGEsIGIpID0+IGNvbXBhcmVCdWlsZChhLCBiLCBsb29zZSkpXG5tb2R1bGUuZXhwb3J0cyA9IHNvcnRcbiIsImNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCB2YWxpZCA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHYgPSBwYXJzZSh2ZXJzaW9uLCBvcHRpb25zKVxuICByZXR1cm4gdiA/IHYudmVyc2lvbiA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gdmFsaWRcbiIsIi8vIGp1c3QgcHJlLWxvYWQgYWxsIHRoZSBzdHVmZiB0aGF0IGluZGV4LmpzIGxhemlseSBleHBvcnRzXG5jb25zdCBpbnRlcm5hbFJlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9yZScpXG5jb25zdCBjb25zdGFudHMgPSByZXF1aXJlKCcuL2ludGVybmFsL2NvbnN0YW50cycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGlkZW50aWZpZXJzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9pZGVudGlmaWVycycpXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3BhcnNlJylcbmNvbnN0IHZhbGlkID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvdmFsaWQnKVxuY29uc3QgY2xlYW4gPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jbGVhbicpXG5jb25zdCBpbmMgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9pbmMnKVxuY29uc3QgZGlmZiA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2RpZmYnKVxuY29uc3QgbWFqb3IgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9tYWpvcicpXG5jb25zdCBtaW5vciA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL21pbm9yJylcbmNvbnN0IHBhdGNoID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcGF0Y2gnKVxuY29uc3QgcHJlcmVsZWFzZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3ByZXJlbGVhc2UnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUnKVxuY29uc3QgcmNvbXBhcmUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9yY29tcGFyZScpXG5jb25zdCBjb21wYXJlTG9vc2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb21wYXJlLWxvb3NlJylcbmNvbnN0IGNvbXBhcmVCdWlsZCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUtYnVpbGQnKVxuY29uc3Qgc29ydCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3NvcnQnKVxuY29uc3QgcnNvcnQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9yc29ydCcpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2d0JylcbmNvbnN0IGx0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbHQnKVxuY29uc3QgZXEgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9uZXEnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZ3RlJylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2x0ZScpXG5jb25zdCBjbXAgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jbXAnKVxuY29uc3QgY29lcmNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29lcmNlJylcbmNvbnN0IENvbXBhcmF0b3IgPSByZXF1aXJlKCcuL2NsYXNzZXMvY29tcGFyYXRvcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9zYXRpc2ZpZXMnKVxuY29uc3QgdG9Db21wYXJhdG9ycyA9IHJlcXVpcmUoJy4vcmFuZ2VzL3RvLWNvbXBhcmF0b3JzJylcbmNvbnN0IG1heFNhdGlzZnlpbmcgPSByZXF1aXJlKCcuL3Jhbmdlcy9tYXgtc2F0aXNmeWluZycpXG5jb25zdCBtaW5TYXRpc2Z5aW5nID0gcmVxdWlyZSgnLi9yYW5nZXMvbWluLXNhdGlzZnlpbmcnKVxuY29uc3QgbWluVmVyc2lvbiA9IHJlcXVpcmUoJy4vcmFuZ2VzL21pbi12ZXJzaW9uJylcbmNvbnN0IHZhbGlkUmFuZ2UgPSByZXF1aXJlKCcuL3Jhbmdlcy92YWxpZCcpXG5jb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9yYW5nZXMvb3V0c2lkZScpXG5jb25zdCBndHIgPSByZXF1aXJlKCcuL3Jhbmdlcy9ndHInKVxuY29uc3QgbHRyID0gcmVxdWlyZSgnLi9yYW5nZXMvbHRyJylcbmNvbnN0IGludGVyc2VjdHMgPSByZXF1aXJlKCcuL3Jhbmdlcy9pbnRlcnNlY3RzJylcbmNvbnN0IHNpbXBsaWZ5UmFuZ2UgPSByZXF1aXJlKCcuL3Jhbmdlcy9zaW1wbGlmeScpXG5jb25zdCBzdWJzZXQgPSByZXF1aXJlKCcuL3Jhbmdlcy9zdWJzZXQnKVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHBhcnNlLFxuICB2YWxpZCxcbiAgY2xlYW4sXG4gIGluYyxcbiAgZGlmZixcbiAgbWFqb3IsXG4gIG1pbm9yLFxuICBwYXRjaCxcbiAgcHJlcmVsZWFzZSxcbiAgY29tcGFyZSxcbiAgcmNvbXBhcmUsXG4gIGNvbXBhcmVMb29zZSxcbiAgY29tcGFyZUJ1aWxkLFxuICBzb3J0LFxuICByc29ydCxcbiAgZ3QsXG4gIGx0LFxuICBlcSxcbiAgbmVxLFxuICBndGUsXG4gIGx0ZSxcbiAgY21wLFxuICBjb2VyY2UsXG4gIENvbXBhcmF0b3IsXG4gIFJhbmdlLFxuICBzYXRpc2ZpZXMsXG4gIHRvQ29tcGFyYXRvcnMsXG4gIG1heFNhdGlzZnlpbmcsXG4gIG1pblNhdGlzZnlpbmcsXG4gIG1pblZlcnNpb24sXG4gIHZhbGlkUmFuZ2UsXG4gIG91dHNpZGUsXG4gIGd0cixcbiAgbHRyLFxuICBpbnRlcnNlY3RzLFxuICBzaW1wbGlmeVJhbmdlLFxuICBzdWJzZXQsXG4gIFNlbVZlcixcbiAgcmU6IGludGVybmFsUmUucmUsXG4gIHNyYzogaW50ZXJuYWxSZS5zcmMsXG4gIHRva2VuczogaW50ZXJuYWxSZS50LFxuICBTRU1WRVJfU1BFQ19WRVJTSU9OOiBjb25zdGFudHMuU0VNVkVSX1NQRUNfVkVSU0lPTixcbiAgUkVMRUFTRV9UWVBFUzogY29uc3RhbnRzLlJFTEVBU0VfVFlQRVMsXG4gIGNvbXBhcmVJZGVudGlmaWVyczogaWRlbnRpZmllcnMuY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzOiBpZGVudGlmaWVycy5yY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIiwiLy8gTm90ZTogdGhpcyBpcyB0aGUgc2VtdmVyLm9yZyB2ZXJzaW9uIG9mIHRoZSBzcGVjIHRoYXQgaXQgaW1wbGVtZW50c1xuLy8gTm90IG5lY2Vzc2FyaWx5IHRoZSBwYWNrYWdlIHZlcnNpb24gb2YgdGhpcyBjb2RlLlxuY29uc3QgU0VNVkVSX1NQRUNfVkVSU0lPTiA9ICcyLjAuMCdcblxuY29uc3QgTUFYX0xFTkdUSCA9IDI1NlxuY29uc3QgTUFYX1NBRkVfSU5URUdFUiA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyA5MDA3MTk5MjU0NzQwOTkxXG5cbi8vIE1heCBzYWZlIHNlZ21lbnQgbGVuZ3RoIGZvciBjb2VyY2lvbi5cbmNvbnN0IE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEggPSAxNlxuXG4vLyBNYXggc2FmZSBsZW5ndGggZm9yIGEgYnVpbGQgaWRlbnRpZmllci4gVGhlIG1heCBsZW5ndGggbWludXMgNiBjaGFyYWN0ZXJzIGZvclxuLy8gdGhlIHNob3J0ZXN0IHZlcnNpb24gd2l0aCBhIGJ1aWxkIDAuMC4wK0JVSUxELlxuY29uc3QgTUFYX1NBRkVfQlVJTERfTEVOR1RIID0gTUFYX0xFTkdUSCAtIDZcblxuY29uc3QgUkVMRUFTRV9UWVBFUyA9IFtcbiAgJ21ham9yJyxcbiAgJ3ByZW1ham9yJyxcbiAgJ21pbm9yJyxcbiAgJ3ByZW1pbm9yJyxcbiAgJ3BhdGNoJyxcbiAgJ3ByZXBhdGNoJyxcbiAgJ3ByZXJlbGVhc2UnLFxuXVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTUFYX0xFTkdUSCxcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfU0FGRV9JTlRFR0VSLFxuICBSRUxFQVNFX1RZUEVTLFxuICBTRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRTogMGIwMDEsXG4gIEZMQUdfTE9PU0U6IDBiMDEwLFxufVxuIiwiY29uc3QgZGVidWcgPSAoXG4gIHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICBwcm9jZXNzLmVudiAmJlxuICBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmXG4gIC9cXGJzZW12ZXJcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcpXG4pID8gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoJ1NFTVZFUicsIC4uLmFyZ3MpXG4gIDogKCkgPT4ge31cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJ1Z1xuIiwiY29uc3QgbnVtZXJpYyA9IC9eWzAtOV0rJC9cbmNvbnN0IGNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IGFudW0gPSBudW1lcmljLnRlc3QoYSlcbiAgY29uc3QgYm51bSA9IG51bWVyaWMudGVzdChiKVxuXG4gIGlmIChhbnVtICYmIGJudW0pIHtcbiAgICBhID0gK2FcbiAgICBiID0gK2JcbiAgfVxuXG4gIHJldHVybiBhID09PSBiID8gMFxuICAgIDogKGFudW0gJiYgIWJudW0pID8gLTFcbiAgICA6IChibnVtICYmICFhbnVtKSA/IDFcbiAgICA6IGEgPCBiID8gLTFcbiAgICA6IDFcbn1cblxuY29uc3QgcmNvbXBhcmVJZGVudGlmaWVycyA9IChhLCBiKSA9PiBjb21wYXJlSWRlbnRpZmllcnMoYiwgYSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbXBhcmVJZGVudGlmaWVycyxcbiAgcmNvbXBhcmVJZGVudGlmaWVycyxcbn1cbiIsIi8vIHBhcnNlIG91dCBqdXN0IHRoZSBvcHRpb25zIHdlIGNhcmUgYWJvdXRcbmNvbnN0IGxvb3NlT3B0aW9uID0gT2JqZWN0LmZyZWV6ZSh7IGxvb3NlOiB0cnVlIH0pXG5jb25zdCBlbXB0eU9wdHMgPSBPYmplY3QuZnJlZXplKHsgfSlcbmNvbnN0IHBhcnNlT3B0aW9ucyA9IG9wdGlvbnMgPT4ge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZXR1cm4gZW1wdHlPcHRzXG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGxvb3NlT3B0aW9uXG4gIH1cblxuICByZXR1cm4gb3B0aW9uc1xufVxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZU9wdGlvbnNcbiIsImNvbnN0IHtcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfTEVOR1RILFxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi9kZWJ1ZycpXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB7fVxuXG4vLyBUaGUgYWN0dWFsIHJlZ2V4cHMgZ28gb24gZXhwb3J0cy5yZVxuY29uc3QgcmUgPSBleHBvcnRzLnJlID0gW11cbmNvbnN0IHNhZmVSZSA9IGV4cG9ydHMuc2FmZVJlID0gW11cbmNvbnN0IHNyYyA9IGV4cG9ydHMuc3JjID0gW11cbmNvbnN0IHQgPSBleHBvcnRzLnQgPSB7fVxubGV0IFIgPSAwXG5cbmNvbnN0IExFVFRFUkRBU0hOVU1CRVIgPSAnW2EtekEtWjAtOS1dJ1xuXG4vLyBSZXBsYWNlIHNvbWUgZ3JlZWR5IHJlZ2V4IHRva2VucyB0byBwcmV2ZW50IHJlZ2V4IGRvcyBpc3N1ZXMuIFRoZXNlIHJlZ2V4IGFyZVxuLy8gdXNlZCBpbnRlcm5hbGx5IHZpYSB0aGUgc2FmZVJlIG9iamVjdCBzaW5jZSBhbGwgaW5wdXRzIGluIHRoaXMgbGlicmFyeSBnZXRcbi8vIG5vcm1hbGl6ZWQgZmlyc3QgdG8gdHJpbSBhbmQgY29sbGFwc2UgYWxsIGV4dHJhIHdoaXRlc3BhY2UuIFRoZSBvcmlnaW5hbFxuLy8gcmVnZXhlcyBhcmUgZXhwb3J0ZWQgZm9yIHVzZXJsYW5kIGNvbnN1bXB0aW9uIGFuZCBsb3dlciBsZXZlbCB1c2FnZS4gQVxuLy8gZnV0dXJlIGJyZWFraW5nIGNoYW5nZSBjb3VsZCBleHBvcnQgdGhlIHNhZmVyIHJlZ2V4IG9ubHkgd2l0aCBhIG5vdGUgdGhhdFxuLy8gYWxsIGlucHV0IHNob3VsZCBoYXZlIGV4dHJhIHdoaXRlc3BhY2UgcmVtb3ZlZC5cbmNvbnN0IHNhZmVSZWdleFJlcGxhY2VtZW50cyA9IFtcbiAgWydcXFxccycsIDFdLFxuICBbJ1xcXFxkJywgTUFYX0xFTkdUSF0sXG4gIFtMRVRURVJEQVNITlVNQkVSLCBNQVhfU0FGRV9CVUlMRF9MRU5HVEhdLFxuXVxuXG5jb25zdCBtYWtlU2FmZVJlZ2V4ID0gKHZhbHVlKSA9PiB7XG4gIGZvciAoY29uc3QgW3Rva2VuLCBtYXhdIG9mIHNhZmVSZWdleFJlcGxhY2VtZW50cykge1xuICAgIHZhbHVlID0gdmFsdWVcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0qYCkuam9pbihgJHt0b2tlbn17MCwke21heH19YClcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0rYCkuam9pbihgJHt0b2tlbn17MSwke21heH19YClcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuY29uc3QgY3JlYXRlVG9rZW4gPSAobmFtZSwgdmFsdWUsIGlzR2xvYmFsKSA9PiB7XG4gIGNvbnN0IHNhZmUgPSBtYWtlU2FmZVJlZ2V4KHZhbHVlKVxuICBjb25zdCBpbmRleCA9IFIrK1xuICBkZWJ1ZyhuYW1lLCBpbmRleCwgdmFsdWUpXG4gIHRbbmFtZV0gPSBpbmRleFxuICBzcmNbaW5kZXhdID0gdmFsdWVcbiAgcmVbaW5kZXhdID0gbmV3IFJlZ0V4cCh2YWx1ZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpXG4gIHNhZmVSZVtpbmRleF0gPSBuZXcgUmVnRXhwKHNhZmUsIGlzR2xvYmFsID8gJ2cnIDogdW5kZWZpbmVkKVxufVxuXG4vLyBUaGUgZm9sbG93aW5nIFJlZ3VsYXIgRXhwcmVzc2lvbnMgY2FuIGJlIHVzZWQgZm9yIHRva2VuaXppbmcsXG4vLyB2YWxpZGF0aW5nLCBhbmQgcGFyc2luZyBTZW1WZXIgdmVyc2lvbiBzdHJpbmdzLlxuXG4vLyAjIyBOdW1lcmljIElkZW50aWZpZXJcbi8vIEEgc2luZ2xlIGAwYCwgb3IgYSBub24temVybyBkaWdpdCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgZGlnaXRzLlxuXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVInLCAnMHxbMS05XVxcXFxkKicpXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVJMT09TRScsICdcXFxcZCsnKVxuXG4vLyAjIyBOb24tbnVtZXJpYyBJZGVudGlmaWVyXG4vLyBaZXJvIG9yIG1vcmUgZGlnaXRzLCBmb2xsb3dlZCBieSBhIGxldHRlciBvciBoeXBoZW4sIGFuZCB0aGVuIHplcm8gb3Jcbi8vIG1vcmUgbGV0dGVycywgZGlnaXRzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignTk9OTlVNRVJJQ0lERU5USUZJRVInLCBgXFxcXGQqW2EtekEtWi1dJHtMRVRURVJEQVNITlVNQkVSfSpgKVxuXG4vLyAjIyBNYWluIFZlcnNpb25cbi8vIFRocmVlIGRvdC1zZXBhcmF0ZWQgbnVtZXJpYyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ01BSU5WRVJTSU9OJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KWApXG5cbmNyZWF0ZVRva2VuKCdNQUlOVkVSU0lPTkxPT1NFJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlgKVxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uIElkZW50aWZpZXJcbi8vIEEgbnVtZXJpYyBpZGVudGlmaWVyLCBvciBhIG5vbi1udW1lcmljIGlkZW50aWZpZXIuXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFSURFTlRJRklFUicsIGAoPzoke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXVxufXwke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VJREVOVElGSUVSTE9PU0UnLCBgKD86JHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXVxufXwke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvblxuLy8gSHlwaGVuLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkb3Qtc2VwYXJhdGVkIHByZS1yZWxlYXNlIHZlcnNpb25cbi8vIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRScsIGAoPzotKCR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSXX0pKikpYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VMT09TRScsIGAoPzotPygke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdfSkqKSlgKVxuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YSBJZGVudGlmaWVyXG4vLyBBbnkgY29tYmluYXRpb24gb2YgZGlnaXRzLCBsZXR0ZXJzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignQlVJTERJREVOVElGSUVSJywgYCR7TEVUVEVSREFTSE5VTUJFUn0rYClcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGFcbi8vIFBsdXMgc2lnbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGVyaW9kLXNlcGFyYXRlZCBidWlsZCBtZXRhZGF0YVxuLy8gaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdCVUlMRCcsIGAoPzpcXFxcKygke3NyY1t0LkJVSUxESURFTlRJRklFUl1cbn0oPzpcXFxcLiR7c3JjW3QuQlVJTERJREVOVElGSUVSXX0pKikpYClcblxuLy8gIyMgRnVsbCBWZXJzaW9uIFN0cmluZ1xuLy8gQSBtYWluIHZlcnNpb24sIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uIGFuZFxuLy8gYnVpbGQgbWV0YWRhdGEuXG5cbi8vIE5vdGUgdGhhdCB0aGUgb25seSBtYWpvciwgbWlub3IsIHBhdGNoLCBhbmQgcHJlLXJlbGVhc2Ugc2VjdGlvbnMgb2Zcbi8vIHRoZSB2ZXJzaW9uIHN0cmluZyBhcmUgY2FwdHVyaW5nIGdyb3Vwcy4gIFRoZSBidWlsZCBtZXRhZGF0YSBpcyBub3QgYVxuLy8gY2FwdHVyaW5nIGdyb3VwLCBiZWNhdXNlIGl0IHNob3VsZCBub3QgZXZlciBiZSB1c2VkIGluIHZlcnNpb25cbi8vIGNvbXBhcmlzb24uXG5cbmNyZWF0ZVRva2VuKCdGVUxMUExBSU4nLCBgdj8ke3NyY1t0Lk1BSU5WRVJTSU9OXVxufSR7c3JjW3QuUFJFUkVMRUFTRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0ZVTEwnLCBgXiR7c3JjW3QuRlVMTFBMQUlOXX0kYClcblxuLy8gbGlrZSBmdWxsLCBidXQgYWxsb3dzIHYxLjIuMyBhbmQgPTEuMi4zLCB3aGljaCBwZW9wbGUgZG8gc29tZXRpbWVzLlxuLy8gYWxzbywgMS4wLjBhbHBoYTEgKHByZXJlbGVhc2Ugd2l0aG91dCB0aGUgaHlwaGVuKSB3aGljaCBpcyBwcmV0dHlcbi8vIGNvbW1vbiBpbiB0aGUgbnBtIHJlZ2lzdHJ5LlxuY3JlYXRlVG9rZW4oJ0xPT1NFUExBSU4nLCBgW3Y9XFxcXHNdKiR7c3JjW3QuTUFJTlZFUlNJT05MT09TRV1cbn0ke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0xPT1NFJywgYF4ke3NyY1t0LkxPT1NFUExBSU5dfSRgKVxuXG5jcmVhdGVUb2tlbignR1RMVCcsICcoKD86PHw+KT89PyknKVxuXG4vLyBTb21ldGhpbmcgbGlrZSBcIjIuKlwiIG9yIFwiMS4yLnhcIi5cbi8vIE5vdGUgdGhhdCBcIngueFwiIGlzIGEgdmFsaWQgeFJhbmdlIGlkZW50aWZlciwgbWVhbmluZyBcImFueSB2ZXJzaW9uXCJcbi8vIE9ubHkgdGhlIGZpcnN0IGl0ZW0gaXMgc3RyaWN0bHkgcmVxdWlyZWQuXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUkxPT1NFJywgYCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19fHh8WHxcXFxcKmApXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUicsIGAke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX18eHxYfFxcXFwqYClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOJywgYFt2PVxcXFxzXSooJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFXX0pPyR7XG4gICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgIGApPyk/YClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOTE9PU0UnLCBgW3Y9XFxcXHNdKigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19KT8ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCk/KT9gKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ1hSQU5HRUxPT1NFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENvZXJjaW9uLlxuLy8gRXh0cmFjdCBhbnl0aGluZyB0aGF0IGNvdWxkIGNvbmNlaXZhYmx5IGJlIGEgcGFydCBvZiBhIHZhbGlkIHNlbXZlclxuY3JlYXRlVG9rZW4oJ0NPRVJDRVBMQUlOJywgYCR7JyhefFteXFxcXGRdKScgK1xuICAgICAgICAgICAgICAnKFxcXFxkezEsJ30ke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSlgICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRScsIGAke3NyY1t0LkNPRVJDRVBMQUlOXX0oPzokfFteXFxcXGRdKWApXG5jcmVhdGVUb2tlbignQ09FUkNFRlVMTCcsIHNyY1t0LkNPRVJDRVBMQUlOXSArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VdfSk/YCArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LkJVSUxEXX0pP2AgK1xuICAgICAgICAgICAgICBgKD86JHxbXlxcXFxkXSlgKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRVJUTCcsIHNyY1t0LkNPRVJDRV0sIHRydWUpXG5jcmVhdGVUb2tlbignQ09FUkNFUlRMRlVMTCcsIHNyY1t0LkNPRVJDRUZVTExdLCB0cnVlKVxuXG4vLyBUaWxkZSByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwicmVhc29uYWJseSBhdCBvciBncmVhdGVyIHRoYW5cIlxuY3JlYXRlVG9rZW4oJ0xPTkVUSUxERScsICcoPzp+Pj8pJylcblxuY3JlYXRlVG9rZW4oJ1RJTERFVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuTE9ORVRJTERFXX1cXFxccytgLCB0cnVlKVxuZXhwb3J0cy50aWxkZVRyaW1SZXBsYWNlID0gJyQxfidcblxuY3JlYXRlVG9rZW4oJ1RJTERFJywgYF4ke3NyY1t0LkxPTkVUSUxERV19JHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignVElMREVMT09TRScsIGBeJHtzcmNbdC5MT05FVElMREVdfSR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENhcmV0IHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJhdCBsZWFzdCBhbmQgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aFwiXG5jcmVhdGVUb2tlbignTE9ORUNBUkVUJywgJyg/OlxcXFxeKScpXG5cbmNyZWF0ZVRva2VuKCdDQVJFVFRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkxPTkVDQVJFVF19XFxcXHMrYCwgdHJ1ZSlcbmV4cG9ydHMuY2FyZXRUcmltUmVwbGFjZSA9ICckMV4nXG5cbmNyZWF0ZVRva2VuKCdDQVJFVCcsIGBeJHtzcmNbdC5MT05FQ0FSRVRdfSR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ0NBUkVUTE9PU0UnLCBgXiR7c3JjW3QuTE9ORUNBUkVUXX0ke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBBIHNpbXBsZSBndC9sdC9lcSB0aGluZywgb3IganVzdCBcIlwiIHRvIGluZGljYXRlIFwiYW55IHZlcnNpb25cIlxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JMT09TRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX0pJHxeJGApXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUicsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5GVUxMUExBSU5dfSkkfF4kYClcblxuLy8gQW4gZXhwcmVzc2lvbiB0byBzdHJpcCBhbnkgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBndGx0IGFuZCB0aGUgdGhpbmdcbi8vIGl0IG1vZGlmaWVzLCBzbyB0aGF0IGA+IDEuMi4zYCA9PT4gYD4xLjIuM2BcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9SVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuR1RMVF1cbn1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX18JHtzcmNbdC5YUkFOR0VQTEFJTl19KWAsIHRydWUpXG5leHBvcnRzLmNvbXBhcmF0b3JUcmltUmVwbGFjZSA9ICckMSQyJDMnXG5cbi8vIFNvbWV0aGluZyBsaWtlIGAxLjIuMyAtIDEuMi40YFxuLy8gTm90ZSB0aGF0IHRoZXNlIGFsbCB1c2UgdGhlIGxvb3NlIGZvcm0sIGJlY2F1c2UgdGhleSdsbCBiZVxuLy8gY2hlY2tlZCBhZ2FpbnN0IGVpdGhlciB0aGUgc3RyaWN0IG9yIGxvb3NlIGNvbXBhcmF0b3IgZm9ybVxuLy8gbGF0ZXIuXG5jcmVhdGVUb2tlbignSFlQSEVOUkFOR0UnLCBgXlxcXFxzKigke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYFxcXFxzKy1cXFxccytgICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgICtcbiAgICAgICAgICAgICAgICAgICBgXFxcXHMqJGApXG5cbmNyZWF0ZVRva2VuKCdIWVBIRU5SQU5HRUxPT1NFJywgYF5cXFxccyooJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgXFxcXHMrLVxcXFxzK2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBcXFxccyokYClcblxuLy8gU3RhciByYW5nZXMgYmFzaWNhbGx5IGp1c3QgYWxsb3cgYW55dGhpbmcgYXQgYWxsLlxuY3JlYXRlVG9rZW4oJ1NUQVInLCAnKDx8Pik/PT9cXFxccypcXFxcKicpXG4vLyA+PTAuMC4wIGlzIGxpa2UgYSBzdGFyXG5jcmVhdGVUb2tlbignR1RFMCcsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wXFxcXHMqJCcpXG5jcmVhdGVUb2tlbignR1RFMFBSRScsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wLTBcXFxccyokJylcbiIsIid1c2Ugc3RyaWN0J1xuXG4vLyBBIGxpbmtlZCBsaXN0IHRvIGtlZXAgdHJhY2sgb2YgcmVjZW50bHktdXNlZC1uZXNzXG5jb25zdCBZYWxsaXN0ID0gcmVxdWlyZSgneWFsbGlzdCcpXG5cbmNvbnN0IE1BWCA9IFN5bWJvbCgnbWF4JylcbmNvbnN0IExFTkdUSCA9IFN5bWJvbCgnbGVuZ3RoJylcbmNvbnN0IExFTkdUSF9DQUxDVUxBVE9SID0gU3ltYm9sKCdsZW5ndGhDYWxjdWxhdG9yJylcbmNvbnN0IEFMTE9XX1NUQUxFID0gU3ltYm9sKCdhbGxvd1N0YWxlJylcbmNvbnN0IE1BWF9BR0UgPSBTeW1ib2woJ21heEFnZScpXG5jb25zdCBESVNQT1NFID0gU3ltYm9sKCdkaXNwb3NlJylcbmNvbnN0IE5PX0RJU1BPU0VfT05fU0VUID0gU3ltYm9sKCdub0Rpc3Bvc2VPblNldCcpXG5jb25zdCBMUlVfTElTVCA9IFN5bWJvbCgnbHJ1TGlzdCcpXG5jb25zdCBDQUNIRSA9IFN5bWJvbCgnY2FjaGUnKVxuY29uc3QgVVBEQVRFX0FHRV9PTl9HRVQgPSBTeW1ib2woJ3VwZGF0ZUFnZU9uR2V0JylcblxuY29uc3QgbmFpdmVMZW5ndGggPSAoKSA9PiAxXG5cbi8vIGxydUxpc3QgaXMgYSB5YWxsaXN0IHdoZXJlIHRoZSBoZWFkIGlzIHRoZSB5b3VuZ2VzdFxuLy8gaXRlbSwgYW5kIHRoZSB0YWlsIGlzIHRoZSBvbGRlc3QuICB0aGUgbGlzdCBjb250YWlucyB0aGUgSGl0XG4vLyBvYmplY3RzIGFzIHRoZSBlbnRyaWVzLlxuLy8gRWFjaCBIaXQgb2JqZWN0IGhhcyBhIHJlZmVyZW5jZSB0byBpdHMgWWFsbGlzdC5Ob2RlLiAgVGhpc1xuLy8gbmV2ZXIgY2hhbmdlcy5cbi8vXG4vLyBjYWNoZSBpcyBhIE1hcCAob3IgUHNldWRvTWFwKSB0aGF0IG1hdGNoZXMgdGhlIGtleXMgdG9cbi8vIHRoZSBZYWxsaXN0Lk5vZGUgb2JqZWN0LlxuY2xhc3MgTFJVQ2FjaGUge1xuICBjb25zdHJ1Y3RvciAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ251bWJlcicpXG4gICAgICBvcHRpb25zID0geyBtYXg6IG9wdGlvbnMgfVxuXG4gICAgaWYgKCFvcHRpb25zKVxuICAgICAgb3B0aW9ucyA9IHt9XG5cbiAgICBpZiAob3B0aW9ucy5tYXggJiYgKHR5cGVvZiBvcHRpb25zLm1heCAhPT0gJ251bWJlcicgfHwgb3B0aW9ucy5tYXggPCAwKSlcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpXG4gICAgLy8gS2luZCBvZiB3ZWlyZCB0byBoYXZlIGEgZGVmYXVsdCBtYXggb2YgSW5maW5pdHksIGJ1dCBvaCB3ZWxsLlxuICAgIGNvbnN0IG1heCA9IHRoaXNbTUFYXSA9IG9wdGlvbnMubWF4IHx8IEluZmluaXR5XG5cbiAgICBjb25zdCBsYyA9IG9wdGlvbnMubGVuZ3RoIHx8IG5haXZlTGVuZ3RoXG4gICAgdGhpc1tMRU5HVEhfQ0FMQ1VMQVRPUl0gPSAodHlwZW9mIGxjICE9PSAnZnVuY3Rpb24nKSA/IG5haXZlTGVuZ3RoIDogbGNcbiAgICB0aGlzW0FMTE9XX1NUQUxFXSA9IG9wdGlvbnMuc3RhbGUgfHwgZmFsc2VcbiAgICBpZiAob3B0aW9ucy5tYXhBZ2UgJiYgdHlwZW9mIG9wdGlvbnMubWF4QWdlICE9PSAnbnVtYmVyJylcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heEFnZSBtdXN0IGJlIGEgbnVtYmVyJylcbiAgICB0aGlzW01BWF9BR0VdID0gb3B0aW9ucy5tYXhBZ2UgfHwgMFxuICAgIHRoaXNbRElTUE9TRV0gPSBvcHRpb25zLmRpc3Bvc2VcbiAgICB0aGlzW05PX0RJU1BPU0VfT05fU0VUXSA9IG9wdGlvbnMubm9EaXNwb3NlT25TZXQgfHwgZmFsc2VcbiAgICB0aGlzW1VQREFURV9BR0VfT05fR0VUXSA9IG9wdGlvbnMudXBkYXRlQWdlT25HZXQgfHwgZmFsc2VcbiAgICB0aGlzLnJlc2V0KClcbiAgfVxuXG4gIC8vIHJlc2l6ZSB0aGUgY2FjaGUgd2hlbiB0aGUgbWF4IGNoYW5nZXMuXG4gIHNldCBtYXggKG1MKSB7XG4gICAgaWYgKHR5cGVvZiBtTCAhPT0gJ251bWJlcicgfHwgbUwgPCAwKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJylcblxuICAgIHRoaXNbTUFYXSA9IG1MIHx8IEluZmluaXR5XG4gICAgdHJpbSh0aGlzKVxuICB9XG4gIGdldCBtYXggKCkge1xuICAgIHJldHVybiB0aGlzW01BWF1cbiAgfVxuXG4gIHNldCBhbGxvd1N0YWxlIChhbGxvd1N0YWxlKSB7XG4gICAgdGhpc1tBTExPV19TVEFMRV0gPSAhIWFsbG93U3RhbGVcbiAgfVxuICBnZXQgYWxsb3dTdGFsZSAoKSB7XG4gICAgcmV0dXJuIHRoaXNbQUxMT1dfU1RBTEVdXG4gIH1cblxuICBzZXQgbWF4QWdlIChtQSkge1xuICAgIGlmICh0eXBlb2YgbUEgIT09ICdudW1iZXInKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4QWdlIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJylcblxuICAgIHRoaXNbTUFYX0FHRV0gPSBtQVxuICAgIHRyaW0odGhpcylcbiAgfVxuICBnZXQgbWF4QWdlICgpIHtcbiAgICByZXR1cm4gdGhpc1tNQVhfQUdFXVxuICB9XG5cbiAgLy8gcmVzaXplIHRoZSBjYWNoZSB3aGVuIHRoZSBsZW5ndGhDYWxjdWxhdG9yIGNoYW5nZXMuXG4gIHNldCBsZW5ndGhDYWxjdWxhdG9yIChsQykge1xuICAgIGlmICh0eXBlb2YgbEMgIT09ICdmdW5jdGlvbicpXG4gICAgICBsQyA9IG5haXZlTGVuZ3RoXG5cbiAgICBpZiAobEMgIT09IHRoaXNbTEVOR1RIX0NBTENVTEFUT1JdKSB7XG4gICAgICB0aGlzW0xFTkdUSF9DQUxDVUxBVE9SXSA9IGxDXG4gICAgICB0aGlzW0xFTkdUSF0gPSAwXG4gICAgICB0aGlzW0xSVV9MSVNUXS5mb3JFYWNoKGhpdCA9PiB7XG4gICAgICAgIGhpdC5sZW5ndGggPSB0aGlzW0xFTkdUSF9DQUxDVUxBVE9SXShoaXQudmFsdWUsIGhpdC5rZXkpXG4gICAgICAgIHRoaXNbTEVOR1RIXSArPSBoaXQubGVuZ3RoXG4gICAgICB9KVxuICAgIH1cbiAgICB0cmltKHRoaXMpXG4gIH1cbiAgZ2V0IGxlbmd0aENhbGN1bGF0b3IgKCkgeyByZXR1cm4gdGhpc1tMRU5HVEhfQ0FMQ1VMQVRPUl0gfVxuXG4gIGdldCBsZW5ndGggKCkgeyByZXR1cm4gdGhpc1tMRU5HVEhdIH1cbiAgZ2V0IGl0ZW1Db3VudCAoKSB7IHJldHVybiB0aGlzW0xSVV9MSVNUXS5sZW5ndGggfVxuXG4gIHJmb3JFYWNoIChmbiwgdGhpc3ApIHtcbiAgICB0aGlzcCA9IHRoaXNwIHx8IHRoaXNcbiAgICBmb3IgKGxldCB3YWxrZXIgPSB0aGlzW0xSVV9MSVNUXS50YWlsOyB3YWxrZXIgIT09IG51bGw7KSB7XG4gICAgICBjb25zdCBwcmV2ID0gd2Fsa2VyLnByZXZcbiAgICAgIGZvckVhY2hTdGVwKHRoaXMsIGZuLCB3YWxrZXIsIHRoaXNwKVxuICAgICAgd2Fsa2VyID0gcHJldlxuICAgIH1cbiAgfVxuXG4gIGZvckVhY2ggKGZuLCB0aGlzcCkge1xuICAgIHRoaXNwID0gdGhpc3AgfHwgdGhpc1xuICAgIGZvciAobGV0IHdhbGtlciA9IHRoaXNbTFJVX0xJU1RdLmhlYWQ7IHdhbGtlciAhPT0gbnVsbDspIHtcbiAgICAgIGNvbnN0IG5leHQgPSB3YWxrZXIubmV4dFxuICAgICAgZm9yRWFjaFN0ZXAodGhpcywgZm4sIHdhbGtlciwgdGhpc3ApXG4gICAgICB3YWxrZXIgPSBuZXh0XG4gICAgfVxuICB9XG5cbiAga2V5cyAoKSB7XG4gICAgcmV0dXJuIHRoaXNbTFJVX0xJU1RdLnRvQXJyYXkoKS5tYXAoayA9PiBrLmtleSlcbiAgfVxuXG4gIHZhbHVlcyAoKSB7XG4gICAgcmV0dXJuIHRoaXNbTFJVX0xJU1RdLnRvQXJyYXkoKS5tYXAoayA9PiBrLnZhbHVlKVxuICB9XG5cbiAgcmVzZXQgKCkge1xuICAgIGlmICh0aGlzW0RJU1BPU0VdICYmXG4gICAgICAgIHRoaXNbTFJVX0xJU1RdICYmXG4gICAgICAgIHRoaXNbTFJVX0xJU1RdLmxlbmd0aCkge1xuICAgICAgdGhpc1tMUlVfTElTVF0uZm9yRWFjaChoaXQgPT4gdGhpc1tESVNQT1NFXShoaXQua2V5LCBoaXQudmFsdWUpKVxuICAgIH1cblxuICAgIHRoaXNbQ0FDSEVdID0gbmV3IE1hcCgpIC8vIGhhc2ggb2YgaXRlbXMgYnkga2V5XG4gICAgdGhpc1tMUlVfTElTVF0gPSBuZXcgWWFsbGlzdCgpIC8vIGxpc3Qgb2YgaXRlbXMgaW4gb3JkZXIgb2YgdXNlIHJlY2VuY3lcbiAgICB0aGlzW0xFTkdUSF0gPSAwIC8vIGxlbmd0aCBvZiBpdGVtcyBpbiB0aGUgbGlzdFxuICB9XG5cbiAgZHVtcCAoKSB7XG4gICAgcmV0dXJuIHRoaXNbTFJVX0xJU1RdLm1hcChoaXQgPT5cbiAgICAgIGlzU3RhbGUodGhpcywgaGl0KSA/IGZhbHNlIDoge1xuICAgICAgICBrOiBoaXQua2V5LFxuICAgICAgICB2OiBoaXQudmFsdWUsXG4gICAgICAgIGU6IGhpdC5ub3cgKyAoaGl0Lm1heEFnZSB8fCAwKVxuICAgICAgfSkudG9BcnJheSgpLmZpbHRlcihoID0+IGgpXG4gIH1cblxuICBkdW1wTHJ1ICgpIHtcbiAgICByZXR1cm4gdGhpc1tMUlVfTElTVF1cbiAgfVxuXG4gIHNldCAoa2V5LCB2YWx1ZSwgbWF4QWdlKSB7XG4gICAgbWF4QWdlID0gbWF4QWdlIHx8IHRoaXNbTUFYX0FHRV1cblxuICAgIGlmIChtYXhBZ2UgJiYgdHlwZW9mIG1heEFnZSAhPT0gJ251bWJlcicpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXhBZ2UgbXVzdCBiZSBhIG51bWJlcicpXG5cbiAgICBjb25zdCBub3cgPSBtYXhBZ2UgPyBEYXRlLm5vdygpIDogMFxuICAgIGNvbnN0IGxlbiA9IHRoaXNbTEVOR1RIX0NBTENVTEFUT1JdKHZhbHVlLCBrZXkpXG5cbiAgICBpZiAodGhpc1tDQUNIRV0uaGFzKGtleSkpIHtcbiAgICAgIGlmIChsZW4gPiB0aGlzW01BWF0pIHtcbiAgICAgICAgZGVsKHRoaXMsIHRoaXNbQ0FDSEVdLmdldChrZXkpKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXNbQ0FDSEVdLmdldChrZXkpXG4gICAgICBjb25zdCBpdGVtID0gbm9kZS52YWx1ZVxuXG4gICAgICAvLyBkaXNwb3NlIG9mIHRoZSBvbGQgb25lIGJlZm9yZSBvdmVyd3JpdGluZ1xuICAgICAgLy8gc3BsaXQgb3V0IGludG8gMiBpZnMgZm9yIGJldHRlciBjb3ZlcmFnZSB0cmFja2luZ1xuICAgICAgaWYgKHRoaXNbRElTUE9TRV0pIHtcbiAgICAgICAgaWYgKCF0aGlzW05PX0RJU1BPU0VfT05fU0VUXSlcbiAgICAgICAgICB0aGlzW0RJU1BPU0VdKGtleSwgaXRlbS52YWx1ZSlcbiAgICAgIH1cblxuICAgICAgaXRlbS5ub3cgPSBub3dcbiAgICAgIGl0ZW0ubWF4QWdlID0gbWF4QWdlXG4gICAgICBpdGVtLnZhbHVlID0gdmFsdWVcbiAgICAgIHRoaXNbTEVOR1RIXSArPSBsZW4gLSBpdGVtLmxlbmd0aFxuICAgICAgaXRlbS5sZW5ndGggPSBsZW5cbiAgICAgIHRoaXMuZ2V0KGtleSlcbiAgICAgIHRyaW0odGhpcylcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgaGl0ID0gbmV3IEVudHJ5KGtleSwgdmFsdWUsIGxlbiwgbm93LCBtYXhBZ2UpXG5cbiAgICAvLyBvdmVyc2l6ZWQgb2JqZWN0cyBmYWxsIG91dCBvZiBjYWNoZSBhdXRvbWF0aWNhbGx5LlxuICAgIGlmIChoaXQubGVuZ3RoID4gdGhpc1tNQVhdKSB7XG4gICAgICBpZiAodGhpc1tESVNQT1NFXSlcbiAgICAgICAgdGhpc1tESVNQT1NFXShrZXksIHZhbHVlKVxuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICB0aGlzW0xFTkdUSF0gKz0gaGl0Lmxlbmd0aFxuICAgIHRoaXNbTFJVX0xJU1RdLnVuc2hpZnQoaGl0KVxuICAgIHRoaXNbQ0FDSEVdLnNldChrZXksIHRoaXNbTFJVX0xJU1RdLmhlYWQpXG4gICAgdHJpbSh0aGlzKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBoYXMgKGtleSkge1xuICAgIGlmICghdGhpc1tDQUNIRV0uaGFzKGtleSkpIHJldHVybiBmYWxzZVxuICAgIGNvbnN0IGhpdCA9IHRoaXNbQ0FDSEVdLmdldChrZXkpLnZhbHVlXG4gICAgcmV0dXJuICFpc1N0YWxlKHRoaXMsIGhpdClcbiAgfVxuXG4gIGdldCAoa2V5KSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIHRydWUpXG4gIH1cblxuICBwZWVrIChrZXkpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSwgZmFsc2UpXG4gIH1cblxuICBwb3AgKCkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzW0xSVV9MSVNUXS50YWlsXG4gICAgaWYgKCFub2RlKVxuICAgICAgcmV0dXJuIG51bGxcblxuICAgIGRlbCh0aGlzLCBub2RlKVxuICAgIHJldHVybiBub2RlLnZhbHVlXG4gIH1cblxuICBkZWwgKGtleSkge1xuICAgIGRlbCh0aGlzLCB0aGlzW0NBQ0hFXS5nZXQoa2V5KSlcbiAgfVxuXG4gIGxvYWQgKGFycikge1xuICAgIC8vIHJlc2V0IHRoZSBjYWNoZVxuICAgIHRoaXMucmVzZXQoKVxuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICAgIC8vIEEgcHJldmlvdXMgc2VyaWFsaXplZCBjYWNoZSBoYXMgdGhlIG1vc3QgcmVjZW50IGl0ZW1zIGZpcnN0XG4gICAgZm9yIChsZXQgbCA9IGFyci5sZW5ndGggLSAxOyBsID49IDA7IGwtLSkge1xuICAgICAgY29uc3QgaGl0ID0gYXJyW2xdXG4gICAgICBjb25zdCBleHBpcmVzQXQgPSBoaXQuZSB8fCAwXG4gICAgICBpZiAoZXhwaXJlc0F0ID09PSAwKVxuICAgICAgICAvLyB0aGUgaXRlbSB3YXMgY3JlYXRlZCB3aXRob3V0IGV4cGlyYXRpb24gaW4gYSBub24gYWdlZCBjYWNoZVxuICAgICAgICB0aGlzLnNldChoaXQuaywgaGl0LnYpXG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgbWF4QWdlID0gZXhwaXJlc0F0IC0gbm93XG4gICAgICAgIC8vIGRvbnQgYWRkIGFscmVhZHkgZXhwaXJlZCBpdGVtc1xuICAgICAgICBpZiAobWF4QWdlID4gMCkge1xuICAgICAgICAgIHRoaXMuc2V0KGhpdC5rLCBoaXQudiwgbWF4QWdlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJ1bmUgKCkge1xuICAgIHRoaXNbQ0FDSEVdLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IGdldCh0aGlzLCBrZXksIGZhbHNlKSlcbiAgfVxufVxuXG5jb25zdCBnZXQgPSAoc2VsZiwga2V5LCBkb1VzZSkgPT4ge1xuICBjb25zdCBub2RlID0gc2VsZltDQUNIRV0uZ2V0KGtleSlcbiAgaWYgKG5vZGUpIHtcbiAgICBjb25zdCBoaXQgPSBub2RlLnZhbHVlXG4gICAgaWYgKGlzU3RhbGUoc2VsZiwgaGl0KSkge1xuICAgICAgZGVsKHNlbGYsIG5vZGUpXG4gICAgICBpZiAoIXNlbGZbQUxMT1dfU1RBTEVdKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkb1VzZSkge1xuICAgICAgICBpZiAoc2VsZltVUERBVEVfQUdFX09OX0dFVF0pXG4gICAgICAgICAgbm9kZS52YWx1ZS5ub3cgPSBEYXRlLm5vdygpXG4gICAgICAgIHNlbGZbTFJVX0xJU1RdLnVuc2hpZnROb2RlKG5vZGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoaXQudmFsdWVcbiAgfVxufVxuXG5jb25zdCBpc1N0YWxlID0gKHNlbGYsIGhpdCkgPT4ge1xuICBpZiAoIWhpdCB8fCAoIWhpdC5tYXhBZ2UgJiYgIXNlbGZbTUFYX0FHRV0pKVxuICAgIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IGRpZmYgPSBEYXRlLm5vdygpIC0gaGl0Lm5vd1xuICByZXR1cm4gaGl0Lm1heEFnZSA/IGRpZmYgPiBoaXQubWF4QWdlXG4gICAgOiBzZWxmW01BWF9BR0VdICYmIChkaWZmID4gc2VsZltNQVhfQUdFXSlcbn1cblxuY29uc3QgdHJpbSA9IHNlbGYgPT4ge1xuICBpZiAoc2VsZltMRU5HVEhdID4gc2VsZltNQVhdKSB7XG4gICAgZm9yIChsZXQgd2Fsa2VyID0gc2VsZltMUlVfTElTVF0udGFpbDtcbiAgICAgIHNlbGZbTEVOR1RIXSA+IHNlbGZbTUFYXSAmJiB3YWxrZXIgIT09IG51bGw7KSB7XG4gICAgICAvLyBXZSBrbm93IHRoYXQgd2UncmUgYWJvdXQgdG8gZGVsZXRlIHRoaXMgb25lLCBhbmQgYWxzb1xuICAgICAgLy8gd2hhdCB0aGUgbmV4dCBsZWFzdCByZWNlbnRseSB1c2VkIGtleSB3aWxsIGJlLCBzbyBqdXN0XG4gICAgICAvLyBnbyBhaGVhZCBhbmQgc2V0IGl0IG5vdy5cbiAgICAgIGNvbnN0IHByZXYgPSB3YWxrZXIucHJldlxuICAgICAgZGVsKHNlbGYsIHdhbGtlcilcbiAgICAgIHdhbGtlciA9IHByZXZcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgZGVsID0gKHNlbGYsIG5vZGUpID0+IHtcbiAgaWYgKG5vZGUpIHtcbiAgICBjb25zdCBoaXQgPSBub2RlLnZhbHVlXG4gICAgaWYgKHNlbGZbRElTUE9TRV0pXG4gICAgICBzZWxmW0RJU1BPU0VdKGhpdC5rZXksIGhpdC52YWx1ZSlcblxuICAgIHNlbGZbTEVOR1RIXSAtPSBoaXQubGVuZ3RoXG4gICAgc2VsZltDQUNIRV0uZGVsZXRlKGhpdC5rZXkpXG4gICAgc2VsZltMUlVfTElTVF0ucmVtb3ZlTm9kZShub2RlKVxuICB9XG59XG5cbmNsYXNzIEVudHJ5IHtcbiAgY29uc3RydWN0b3IgKGtleSwgdmFsdWUsIGxlbmd0aCwgbm93LCBtYXhBZ2UpIHtcbiAgICB0aGlzLmtleSA9IGtleVxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZVxuICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoXG4gICAgdGhpcy5ub3cgPSBub3dcbiAgICB0aGlzLm1heEFnZSA9IG1heEFnZSB8fCAwXG4gIH1cbn1cblxuY29uc3QgZm9yRWFjaFN0ZXAgPSAoc2VsZiwgZm4sIG5vZGUsIHRoaXNwKSA9PiB7XG4gIGxldCBoaXQgPSBub2RlLnZhbHVlXG4gIGlmIChpc1N0YWxlKHNlbGYsIGhpdCkpIHtcbiAgICBkZWwoc2VsZiwgbm9kZSlcbiAgICBpZiAoIXNlbGZbQUxMT1dfU1RBTEVdKVxuICAgICAgaGl0ID0gdW5kZWZpbmVkXG4gIH1cbiAgaWYgKGhpdClcbiAgICBmbi5jYWxsKHRoaXNwLCBoaXQudmFsdWUsIGhpdC5rZXksIHNlbGYpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gTFJVQ2FjaGVcbiIsIi8vIERldGVybWluZSBpZiB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBhbGwgdGhlIHZlcnNpb25zIHBvc3NpYmxlIGluIHRoZSByYW5nZS5cbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL291dHNpZGUnKVxuY29uc3QgZ3RyID0gKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSA9PiBvdXRzaWRlKHZlcnNpb24sIHJhbmdlLCAnPicsIG9wdGlvbnMpXG5tb2R1bGUuZXhwb3J0cyA9IGd0clxuIiwiY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IGludGVyc2VjdHMgPSAocjEsIHIyLCBvcHRpb25zKSA9PiB7XG4gIHIxID0gbmV3IFJhbmdlKHIxLCBvcHRpb25zKVxuICByMiA9IG5ldyBSYW5nZShyMiwgb3B0aW9ucylcbiAgcmV0dXJuIHIxLmludGVyc2VjdHMocjIsIG9wdGlvbnMpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGludGVyc2VjdHNcbiIsImNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL291dHNpZGUnKVxuLy8gRGV0ZXJtaW5lIGlmIHZlcnNpb24gaXMgbGVzcyB0aGFuIGFsbCB0aGUgdmVyc2lvbnMgcG9zc2libGUgaW4gdGhlIHJhbmdlXG5jb25zdCBsdHIgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IG91dHNpZGUodmVyc2lvbiwgcmFuZ2UsICc8Jywgb3B0aW9ucylcbm1vZHVsZS5leHBvcnRzID0gbHRyXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuXG5jb25zdCBtYXhTYXRpc2Z5aW5nID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBsZXQgbWF4ID0gbnVsbFxuICBsZXQgbWF4U1YgPSBudWxsXG4gIGxldCByYW5nZU9iaiA9IG51bGxcbiAgdHJ5IHtcbiAgICByYW5nZU9iaiA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHZlcnNpb25zLmZvckVhY2goKHYpID0+IHtcbiAgICBpZiAocmFuZ2VPYmoudGVzdCh2KSkge1xuICAgICAgLy8gc2F0aXNmaWVzKHYsIHJhbmdlLCBvcHRpb25zKVxuICAgICAgaWYgKCFtYXggfHwgbWF4U1YuY29tcGFyZSh2KSA9PT0gLTEpIHtcbiAgICAgICAgLy8gY29tcGFyZShtYXgsIHYsIHRydWUpXG4gICAgICAgIG1heCA9IHZcbiAgICAgICAgbWF4U1YgPSBuZXcgU2VtVmVyKG1heCwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBtYXhcbn1cbm1vZHVsZS5leHBvcnRzID0gbWF4U2F0aXNmeWluZ1xuIiwiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IG1pblNhdGlzZnlpbmcgPSAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIGxldCBtaW4gPSBudWxsXG4gIGxldCBtaW5TViA9IG51bGxcbiAgbGV0IHJhbmdlT2JqID0gbnVsbFxuICB0cnkge1xuICAgIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaCgodikgPT4ge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7XG4gICAgICAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgICBpZiAoIW1pbiB8fCBtaW5TVi5jb21wYXJlKHYpID09PSAxKSB7XG4gICAgICAgIC8vIGNvbXBhcmUobWluLCB2LCB0cnVlKVxuICAgICAgICBtaW4gPSB2XG4gICAgICAgIG1pblNWID0gbmV3IFNlbVZlcihtaW4sIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWluXG59XG5tb2R1bGUuZXhwb3J0cyA9IG1pblNhdGlzZnlpbmdcbiIsImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndCcpXG5cbmNvbnN0IG1pblZlcnNpb24gPSAocmFuZ2UsIGxvb3NlKSA9PiB7XG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSlcblxuICBsZXQgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAnKVxuICBpZiAocmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAtMCcpXG4gIGlmIChyYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICBtaW52ZXIgPSBudWxsXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV1cblxuICAgIGxldCBzZXRNaW4gPSBudWxsXG4gICAgY29tcGFyYXRvcnMuZm9yRWFjaCgoY29tcGFyYXRvcikgPT4ge1xuICAgICAgLy8gQ2xvbmUgdG8gYXZvaWQgbWFuaXB1bGF0aW5nIHRoZSBjb21wYXJhdG9yJ3Mgc2VtdmVyIG9iamVjdC5cbiAgICAgIGNvbnN0IGNvbXB2ZXIgPSBuZXcgU2VtVmVyKGNvbXBhcmF0b3Iuc2VtdmVyLnZlcnNpb24pXG4gICAgICBzd2l0Y2ggKGNvbXBhcmF0b3Iub3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgaWYgKGNvbXB2ZXIucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbXB2ZXIucGF0Y2grK1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wdmVyLnByZXJlbGVhc2UucHVzaCgwKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb21wdmVyLnJhdyA9IGNvbXB2ZXIuZm9ybWF0KClcbiAgICAgICAgICAvKiBmYWxsdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICcnOlxuICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgaWYgKCFzZXRNaW4gfHwgZ3QoY29tcHZlciwgc2V0TWluKSkge1xuICAgICAgICAgICAgc2V0TWluID0gY29tcHZlclxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgIC8qIElnbm9yZSBtYXhpbXVtIHZlcnNpb25zICovXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgb3BlcmF0aW9uOiAke2NvbXBhcmF0b3Iub3BlcmF0b3J9YClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChzZXRNaW4gJiYgKCFtaW52ZXIgfHwgZ3QobWludmVyLCBzZXRNaW4pKSkge1xuICAgICAgbWludmVyID0gc2V0TWluXG4gICAgfVxuICB9XG5cbiAgaWYgKG1pbnZlciAmJiByYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSBtaW5WZXJzaW9uXG4iLCJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9jb21wYXJhdG9yJylcbmNvbnN0IHsgQU5ZIH0gPSBDb21wYXJhdG9yXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL3NhdGlzZmllcycpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndCcpXG5jb25zdCBsdCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9sdCcpXG5jb25zdCBsdGUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvbHRlJylcbmNvbnN0IGd0ZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndGUnKVxuXG5jb25zdCBvdXRzaWRlID0gKHZlcnNpb24sIHJhbmdlLCBoaWxvLCBvcHRpb25zKSA9PiB7XG4gIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuXG4gIGxldCBndGZuLCBsdGVmbiwgbHRmbiwgY29tcCwgZWNvbXBcbiAgc3dpdGNoIChoaWxvKSB7XG4gICAgY2FzZSAnPic6XG4gICAgICBndGZuID0gZ3RcbiAgICAgIGx0ZWZuID0gbHRlXG4gICAgICBsdGZuID0gbHRcbiAgICAgIGNvbXAgPSAnPidcbiAgICAgIGVjb21wID0gJz49J1xuICAgICAgYnJlYWtcbiAgICBjYXNlICc8JzpcbiAgICAgIGd0Zm4gPSBsdFxuICAgICAgbHRlZm4gPSBndGVcbiAgICAgIGx0Zm4gPSBndFxuICAgICAgY29tcCA9ICc8J1xuICAgICAgZWNvbXAgPSAnPD0nXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHByb3ZpZGUgYSBoaWxvIHZhbCBvZiBcIjxcIiBvciBcIj5cIicpXG4gIH1cblxuICAvLyBJZiBpdCBzYXRpc2ZpZXMgdGhlIHJhbmdlIGl0IGlzIG5vdCBvdXRzaWRlXG4gIGlmIChzYXRpc2ZpZXModmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBGcm9tIG5vdyBvbiwgdmFyaWFibGUgdGVybXMgYXJlIGFzIGlmIHdlJ3JlIGluIFwiZ3RyXCIgbW9kZS5cbiAgLy8gYnV0IG5vdGUgdGhhdCBldmVyeXRoaW5nIGlzIGZsaXBwZWQgZm9yIHRoZSBcImx0clwiIGZ1bmN0aW9uLlxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV1cblxuICAgIGxldCBoaWdoID0gbnVsbFxuICAgIGxldCBsb3cgPSBudWxsXG5cbiAgICBjb21wYXJhdG9ycy5mb3JFYWNoKChjb21wYXJhdG9yKSA9PiB7XG4gICAgICBpZiAoY29tcGFyYXRvci5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgICBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKVxuICAgICAgfVxuICAgICAgaGlnaCA9IGhpZ2ggfHwgY29tcGFyYXRvclxuICAgICAgbG93ID0gbG93IHx8IGNvbXBhcmF0b3JcbiAgICAgIGlmIChndGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBoaWdoLnNlbXZlciwgb3B0aW9ucykpIHtcbiAgICAgICAgaGlnaCA9IGNvbXBhcmF0b3JcbiAgICAgIH0gZWxzZSBpZiAobHRmbihjb21wYXJhdG9yLnNlbXZlciwgbG93LnNlbXZlciwgb3B0aW9ucykpIHtcbiAgICAgICAgbG93ID0gY29tcGFyYXRvclxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBJZiB0aGUgZWRnZSB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGEgb3BlcmF0b3IgdGhlbiBvdXIgdmVyc2lvblxuICAgIC8vIGlzbid0IG91dHNpZGUgaXRcbiAgICBpZiAoaGlnaC5vcGVyYXRvciA9PT0gY29tcCB8fCBoaWdoLm9wZXJhdG9yID09PSBlY29tcCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGxvd2VzdCB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGFuIG9wZXJhdG9yIGFuZCBvdXIgdmVyc2lvblxuICAgIC8vIGlzIGxlc3MgdGhhbiBpdCB0aGVuIGl0IGlzbid0IGhpZ2hlciB0aGFuIHRoZSByYW5nZVxuICAgIGlmICgoIWxvdy5vcGVyYXRvciB8fCBsb3cub3BlcmF0b3IgPT09IGNvbXApICYmXG4gICAgICAgIGx0ZWZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKGxvdy5vcGVyYXRvciA9PT0gZWNvbXAgJiYgbHRmbih2ZXJzaW9uLCBsb3cuc2VtdmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3V0c2lkZVxuIiwiLy8gZ2l2ZW4gYSBzZXQgb2YgdmVyc2lvbnMgYW5kIGEgcmFuZ2UsIGNyZWF0ZSBhIFwic2ltcGxpZmllZFwiIHJhbmdlXG4vLyB0aGF0IGluY2x1ZGVzIHRoZSBzYW1lIHZlcnNpb25zIHRoYXQgdGhlIG9yaWdpbmFsIHJhbmdlIGRvZXNcbi8vIElmIHRoZSBvcmlnaW5hbCByYW5nZSBpcyBzaG9ydGVyIHRoYW4gdGhlIHNpbXBsaWZpZWQgb25lLCByZXR1cm4gdGhhdC5cbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9zYXRpc2ZpZXMuanMnKVxuY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jb21wYXJlLmpzJylcbm1vZHVsZS5leHBvcnRzID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBzZXQgPSBbXVxuICBsZXQgZmlyc3QgPSBudWxsXG4gIGxldCBwcmV2ID0gbnVsbFxuICBjb25zdCB2ID0gdmVyc2lvbnMuc29ydCgoYSwgYikgPT4gY29tcGFyZShhLCBiLCBvcHRpb25zKSlcbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHYpIHtcbiAgICBjb25zdCBpbmNsdWRlZCA9IHNhdGlzZmllcyh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucylcbiAgICBpZiAoaW5jbHVkZWQpIHtcbiAgICAgIHByZXYgPSB2ZXJzaW9uXG4gICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgIGZpcnN0ID0gdmVyc2lvblxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBzZXQucHVzaChbZmlyc3QsIHByZXZdKVxuICAgICAgfVxuICAgICAgcHJldiA9IG51bGxcbiAgICAgIGZpcnN0ID0gbnVsbFxuICAgIH1cbiAgfVxuICBpZiAoZmlyc3QpIHtcbiAgICBzZXQucHVzaChbZmlyc3QsIG51bGxdKVxuICB9XG5cbiAgY29uc3QgcmFuZ2VzID0gW11cbiAgZm9yIChjb25zdCBbbWluLCBtYXhdIG9mIHNldCkge1xuICAgIGlmIChtaW4gPT09IG1heCkge1xuICAgICAgcmFuZ2VzLnB1c2gobWluKVxuICAgIH0gZWxzZSBpZiAoIW1heCAmJiBtaW4gPT09IHZbMF0pIHtcbiAgICAgIHJhbmdlcy5wdXNoKCcqJylcbiAgICB9IGVsc2UgaWYgKCFtYXgpIHtcbiAgICAgIHJhbmdlcy5wdXNoKGA+PSR7bWlufWApXG4gICAgfSBlbHNlIGlmIChtaW4gPT09IHZbMF0pIHtcbiAgICAgIHJhbmdlcy5wdXNoKGA8PSR7bWF4fWApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlcy5wdXNoKGAke21pbn0gLSAke21heH1gKVxuICAgIH1cbiAgfVxuICBjb25zdCBzaW1wbGlmaWVkID0gcmFuZ2VzLmpvaW4oJyB8fCAnKVxuICBjb25zdCBvcmlnaW5hbCA9IHR5cGVvZiByYW5nZS5yYXcgPT09ICdzdHJpbmcnID8gcmFuZ2UucmF3IDogU3RyaW5nKHJhbmdlKVxuICByZXR1cm4gc2ltcGxpZmllZC5sZW5ndGggPCBvcmlnaW5hbC5sZW5ndGggPyBzaW1wbGlmaWVkIDogcmFuZ2Vcbn1cbiIsImNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZS5qcycpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9jb21wYXJhdG9yLmpzJylcbmNvbnN0IHsgQU5ZIH0gPSBDb21wYXJhdG9yXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzLmpzJylcbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvY29tcGFyZS5qcycpXG5cbi8vIENvbXBsZXggcmFuZ2UgYHIxIHx8IHIyIHx8IC4uLmAgaXMgYSBzdWJzZXQgb2YgYFIxIHx8IFIyIHx8IC4uLmAgaWZmOlxuLy8gLSBFdmVyeSBzaW1wbGUgcmFuZ2UgYHIxLCByMiwgLi4uYCBpcyBhIG51bGwgc2V0LCBPUlxuLy8gLSBFdmVyeSBzaW1wbGUgcmFuZ2UgYHIxLCByMiwgLi4uYCB3aGljaCBpcyBub3QgYSBudWxsIHNldCBpcyBhIHN1YnNldCBvZlxuLy8gICBzb21lIGBSMSwgUjIsIC4uLmBcbi8vXG4vLyBTaW1wbGUgcmFuZ2UgYGMxIGMyIC4uLmAgaXMgYSBzdWJzZXQgb2Ygc2ltcGxlIHJhbmdlIGBDMSBDMiAuLi5gIGlmZjpcbi8vIC0gSWYgYyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvclxuLy8gICAtIElmIEMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3IsIHJldHVybiB0cnVlXG4vLyAgIC0gRWxzZSBpZiBpbiBwcmVyZWxlYXNlIG1vZGUsIHJldHVybiBmYWxzZVxuLy8gICAtIGVsc2UgcmVwbGFjZSBjIHdpdGggYFs+PTAuMC4wXWBcbi8vIC0gSWYgQyBpcyBvbmx5IHRoZSBBTlkgY29tcGFyYXRvclxuLy8gICAtIGlmIGluIHByZXJlbGVhc2UgbW9kZSwgcmV0dXJuIHRydWVcbi8vICAgLSBlbHNlIHJlcGxhY2UgQyB3aXRoIGBbPj0wLjAuMF1gXG4vLyAtIExldCBFUSBiZSB0aGUgc2V0IG9mID0gY29tcGFyYXRvcnMgaW4gY1xuLy8gLSBJZiBFUSBpcyBtb3JlIHRoYW4gb25lLCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAtIExldCBHVCBiZSB0aGUgaGlnaGVzdCA+IG9yID49IGNvbXBhcmF0b3IgaW4gY1xuLy8gLSBMZXQgTFQgYmUgdGhlIGxvd2VzdCA8IG9yIDw9IGNvbXBhcmF0b3IgaW4gY1xuLy8gLSBJZiBHVCBhbmQgTFQsIGFuZCBHVC5zZW12ZXIgPiBMVC5zZW12ZXIsIHJldHVybiB0cnVlIChudWxsIHNldClcbi8vIC0gSWYgYW55IEMgaXMgYSA9IHJhbmdlLCBhbmQgR1Qgb3IgTFQgYXJlIHNldCwgcmV0dXJuIGZhbHNlXG4vLyAtIElmIEVRXG4vLyAgIC0gSWYgR1QsIGFuZCBFUSBkb2VzIG5vdCBzYXRpc2Z5IEdULCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAgIC0gSWYgTFQsIGFuZCBFUSBkb2VzIG5vdCBzYXRpc2Z5IExULCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAgIC0gSWYgRVEgc2F0aXNmaWVzIGV2ZXJ5IEMsIHJldHVybiB0cnVlXG4vLyAgIC0gRWxzZSByZXR1cm4gZmFsc2Vcbi8vIC0gSWYgR1Rcbi8vICAgLSBJZiBHVC5zZW12ZXIgaXMgbG93ZXIgdGhhbiBhbnkgPiBvciA+PSBjb21wIGluIEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdUIGlzID49LCBhbmQgR1Quc2VtdmVyIGRvZXMgbm90IHNhdGlzZnkgZXZlcnkgQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgR1Quc2VtdmVyIGhhcyBhIHByZXJlbGVhc2UsIGFuZCBub3QgaW4gcHJlcmVsZWFzZSBtb2RlXG4vLyAgICAgLSBJZiBubyBDIGhhcyBhIHByZXJlbGVhc2UgYW5kIHRoZSBHVC5zZW12ZXIgdHVwbGUsIHJldHVybiBmYWxzZVxuLy8gLSBJZiBMVFxuLy8gICAtIElmIExULnNlbXZlciBpcyBncmVhdGVyIHRoYW4gYW55IDwgb3IgPD0gY29tcCBpbiBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBMVCBpcyA8PSwgYW5kIExULnNlbXZlciBkb2VzIG5vdCBzYXRpc2Z5IGV2ZXJ5IEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdULnNlbXZlciBoYXMgYSBwcmVyZWxlYXNlLCBhbmQgbm90IGluIHByZXJlbGVhc2UgbW9kZVxuLy8gICAgIC0gSWYgbm8gQyBoYXMgYSBwcmVyZWxlYXNlIGFuZCB0aGUgTFQuc2VtdmVyIHR1cGxlLCByZXR1cm4gZmFsc2Vcbi8vIC0gRWxzZSByZXR1cm4gdHJ1ZVxuXG5jb25zdCBzdWJzZXQgPSAoc3ViLCBkb20sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoc3ViID09PSBkb20pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgc3ViID0gbmV3IFJhbmdlKHN1Yiwgb3B0aW9ucylcbiAgZG9tID0gbmV3IFJhbmdlKGRvbSwgb3B0aW9ucylcbiAgbGV0IHNhd05vbk51bGwgPSBmYWxzZVxuXG4gIE9VVEVSOiBmb3IgKGNvbnN0IHNpbXBsZVN1YiBvZiBzdWIuc2V0KSB7XG4gICAgZm9yIChjb25zdCBzaW1wbGVEb20gb2YgZG9tLnNldCkge1xuICAgICAgY29uc3QgaXNTdWIgPSBzaW1wbGVTdWJzZXQoc2ltcGxlU3ViLCBzaW1wbGVEb20sIG9wdGlvbnMpXG4gICAgICBzYXdOb25OdWxsID0gc2F3Tm9uTnVsbCB8fCBpc1N1YiAhPT0gbnVsbFxuICAgICAgaWYgKGlzU3ViKSB7XG4gICAgICAgIGNvbnRpbnVlIE9VVEVSXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHRoZSBudWxsIHNldCBpcyBhIHN1YnNldCBvZiBldmVyeXRoaW5nLCBidXQgbnVsbCBzaW1wbGUgcmFuZ2VzIGluXG4gICAgLy8gYSBjb21wbGV4IHJhbmdlIHNob3VsZCBiZSBpZ25vcmVkLiAgc28gaWYgd2Ugc2F3IGEgbm9uLW51bGwgcmFuZ2UsXG4gICAgLy8gdGhlbiB3ZSBrbm93IHRoaXMgaXNuJ3QgYSBzdWJzZXQsIGJ1dCBpZiBFVkVSWSBzaW1wbGUgcmFuZ2Ugd2FzIG51bGwsXG4gICAgLy8gdGhlbiBpdCBpcyBhIHN1YnNldC5cbiAgICBpZiAoc2F3Tm9uTnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbmNvbnN0IG1pbmltdW1WZXJzaW9uV2l0aFByZVJlbGVhc2UgPSBbbmV3IENvbXBhcmF0b3IoJz49MC4wLjAtMCcpXVxuY29uc3QgbWluaW11bVZlcnNpb24gPSBbbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKV1cblxuY29uc3Qgc2ltcGxlU3Vic2V0ID0gKHN1YiwgZG9tLCBvcHRpb25zKSA9PiB7XG4gIGlmIChzdWIgPT09IGRvbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoc3ViLmxlbmd0aCA9PT0gMSAmJiBzdWJbMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICBpZiAoZG9tLmxlbmd0aCA9PT0gMSAmJiBkb21bMF0uc2VtdmVyID09PSBBTlkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICBzdWIgPSBtaW5pbXVtVmVyc2lvbldpdGhQcmVSZWxlYXNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHN1YiA9IG1pbmltdW1WZXJzaW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKGRvbS5sZW5ndGggPT09IDEgJiYgZG9tWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvbSA9IG1pbmltdW1WZXJzaW9uXG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXFTZXQgPSBuZXcgU2V0KClcbiAgbGV0IGd0LCBsdFxuICBmb3IgKGNvbnN0IGMgb2Ygc3ViKSB7XG4gICAgaWYgKGMub3BlcmF0b3IgPT09ICc+JyB8fCBjLm9wZXJhdG9yID09PSAnPj0nKSB7XG4gICAgICBndCA9IGhpZ2hlckdUKGd0LCBjLCBvcHRpb25zKVxuICAgIH0gZWxzZSBpZiAoYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PScpIHtcbiAgICAgIGx0ID0gbG93ZXJMVChsdCwgYywgb3B0aW9ucylcbiAgICB9IGVsc2Uge1xuICAgICAgZXFTZXQuYWRkKGMuc2VtdmVyKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlcVNldC5zaXplID4gMSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBsZXQgZ3RsdENvbXBcbiAgaWYgKGd0ICYmIGx0KSB7XG4gICAgZ3RsdENvbXAgPSBjb21wYXJlKGd0LnNlbXZlciwgbHQuc2VtdmVyLCBvcHRpb25zKVxuICAgIGlmIChndGx0Q29tcCA+IDApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfSBlbHNlIGlmIChndGx0Q29tcCA9PT0gMCAmJiAoZ3Qub3BlcmF0b3IgIT09ICc+PScgfHwgbHQub3BlcmF0b3IgIT09ICc8PScpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIHdpbGwgaXRlcmF0ZSBvbmUgb3IgemVybyB0aW1lc1xuICBmb3IgKGNvbnN0IGVxIG9mIGVxU2V0KSB7XG4gICAgaWYgKGd0ICYmICFzYXRpc2ZpZXMoZXEsIFN0cmluZyhndCksIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGlmIChsdCAmJiAhc2F0aXNmaWVzKGVxLCBTdHJpbmcobHQpLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGMgb2YgZG9tKSB7XG4gICAgICBpZiAoIXNhdGlzZmllcyhlcSwgU3RyaW5nKGMpLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgbGV0IGhpZ2hlciwgbG93ZXJcbiAgbGV0IGhhc0RvbUxULCBoYXNEb21HVFxuICAvLyBpZiB0aGUgc3Vic2V0IGhhcyBhIHByZXJlbGVhc2UsIHdlIG5lZWQgYSBjb21wYXJhdG9yIGluIHRoZSBzdXBlcnNldFxuICAvLyB3aXRoIHRoZSBzYW1lIHR1cGxlIGFuZCBhIHByZXJlbGVhc2UsIG9yIGl0J3Mgbm90IGEgc3Vic2V0XG4gIGxldCBuZWVkRG9tTFRQcmUgPSBsdCAmJlxuICAgICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgbHQuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID8gbHQuc2VtdmVyIDogZmFsc2VcbiAgbGV0IG5lZWREb21HVFByZSA9IGd0ICYmXG4gICAgIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICBndC5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPyBndC5zZW12ZXIgOiBmYWxzZVxuICAvLyBleGNlcHRpb246IDwxLjIuMy0wIGlzIHRoZSBzYW1lIGFzIDwxLjIuM1xuICBpZiAobmVlZERvbUxUUHJlICYmIG5lZWREb21MVFByZS5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgbHQub3BlcmF0b3IgPT09ICc8JyAmJiBuZWVkRG9tTFRQcmUucHJlcmVsZWFzZVswXSA9PT0gMCkge1xuICAgIG5lZWREb21MVFByZSA9IGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IGMgb2YgZG9tKSB7XG4gICAgaGFzRG9tR1QgPSBoYXNEb21HVCB8fCBjLm9wZXJhdG9yID09PSAnPicgfHwgYy5vcGVyYXRvciA9PT0gJz49J1xuICAgIGhhc0RvbUxUID0gaGFzRG9tTFQgfHwgYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PSdcbiAgICBpZiAoZ3QpIHtcbiAgICAgIGlmIChuZWVkRG9tR1RQcmUpIHtcbiAgICAgICAgaWYgKGMuc2VtdmVyLnByZXJlbGVhc2UgJiYgYy5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1ham9yID09PSBuZWVkRG9tR1RQcmUubWFqb3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1pbm9yID09PSBuZWVkRG9tR1RQcmUubWlub3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLnBhdGNoID09PSBuZWVkRG9tR1RQcmUucGF0Y2gpIHtcbiAgICAgICAgICBuZWVkRG9tR1RQcmUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYy5vcGVyYXRvciA9PT0gJz4nIHx8IGMub3BlcmF0b3IgPT09ICc+PScpIHtcbiAgICAgICAgaGlnaGVyID0gaGlnaGVyR1QoZ3QsIGMsIG9wdGlvbnMpXG4gICAgICAgIGlmIChoaWdoZXIgPT09IGMgJiYgaGlnaGVyICE9PSBndCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0Lm9wZXJhdG9yID09PSAnPj0nICYmICFzYXRpc2ZpZXMoZ3Quc2VtdmVyLCBTdHJpbmcoYyksIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobHQpIHtcbiAgICAgIGlmIChuZWVkRG9tTFRQcmUpIHtcbiAgICAgICAgaWYgKGMuc2VtdmVyLnByZXJlbGVhc2UgJiYgYy5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1ham9yID09PSBuZWVkRG9tTFRQcmUubWFqb3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLm1pbm9yID09PSBuZWVkRG9tTFRQcmUubWlub3IgJiZcbiAgICAgICAgICAgIGMuc2VtdmVyLnBhdGNoID09PSBuZWVkRG9tTFRQcmUucGF0Y2gpIHtcbiAgICAgICAgICBuZWVkRG9tTFRQcmUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYy5vcGVyYXRvciA9PT0gJzwnIHx8IGMub3BlcmF0b3IgPT09ICc8PScpIHtcbiAgICAgICAgbG93ZXIgPSBsb3dlckxUKGx0LCBjLCBvcHRpb25zKVxuICAgICAgICBpZiAobG93ZXIgPT09IGMgJiYgbG93ZXIgIT09IGx0KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobHQub3BlcmF0b3IgPT09ICc8PScgJiYgIXNhdGlzZmllcyhsdC5zZW12ZXIsIFN0cmluZyhjKSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYy5vcGVyYXRvciAmJiAobHQgfHwgZ3QpICYmIGd0bHRDb21wICE9PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGVyZSB3YXMgYSA8IG9yID4sIGFuZCBub3RoaW5nIGluIHRoZSBkb20sIHRoZW4gbXVzdCBiZSBmYWxzZVxuICAvLyBVTkxFU1MgaXQgd2FzIGxpbWl0ZWQgYnkgYW5vdGhlciByYW5nZSBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLlxuICAvLyBFZywgPjEuMC4wIDwxLjAuMSBpcyBzdGlsbCBhIHN1YnNldCBvZiA8Mi4wLjBcbiAgaWYgKGd0ICYmIGhhc0RvbUxUICYmICFsdCAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKGx0ICYmIGhhc0RvbUdUICYmICFndCAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gd2UgbmVlZGVkIGEgcHJlcmVsZWFzZSByYW5nZSBpbiBhIHNwZWNpZmljIHR1cGxlLCBidXQgZGlkbid0IGdldCBvbmVcbiAgLy8gdGhlbiB0aGlzIGlzbid0IGEgc3Vic2V0LiAgZWcgPj0xLjIuMy1wcmUgaXMgbm90IGEgc3Vic2V0IG9mID49MS4wLjAsXG4gIC8vIGJlY2F1c2UgaXQgaW5jbHVkZXMgcHJlcmVsZWFzZXMgaW4gdGhlIDEuMi4zIHR1cGxlXG4gIGlmIChuZWVkRG9tR1RQcmUgfHwgbmVlZERvbUxUUHJlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vLyA+PTEuMi4zIGlzIGxvd2VyIHRoYW4gPjEuMi4zXG5jb25zdCBoaWdoZXJHVCA9IChhLCBiLCBvcHRpb25zKSA9PiB7XG4gIGlmICghYSkge1xuICAgIHJldHVybiBiXG4gIH1cbiAgY29uc3QgY29tcCA9IGNvbXBhcmUoYS5zZW12ZXIsIGIuc2VtdmVyLCBvcHRpb25zKVxuICByZXR1cm4gY29tcCA+IDAgPyBhXG4gICAgOiBjb21wIDwgMCA/IGJcbiAgICA6IGIub3BlcmF0b3IgPT09ICc+JyAmJiBhLm9wZXJhdG9yID09PSAnPj0nID8gYlxuICAgIDogYVxufVxuXG4vLyA8PTEuMi4zIGlzIGhpZ2hlciB0aGFuIDwxLjIuM1xuY29uc3QgbG93ZXJMVCA9IChhLCBiLCBvcHRpb25zKSA9PiB7XG4gIGlmICghYSkge1xuICAgIHJldHVybiBiXG4gIH1cbiAgY29uc3QgY29tcCA9IGNvbXBhcmUoYS5zZW12ZXIsIGIuc2VtdmVyLCBvcHRpb25zKVxuICByZXR1cm4gY29tcCA8IDAgPyBhXG4gICAgOiBjb21wID4gMCA/IGJcbiAgICA6IGIub3BlcmF0b3IgPT09ICc8JyAmJiBhLm9wZXJhdG9yID09PSAnPD0nID8gYlxuICAgIDogYVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN1YnNldFxuIiwiY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcblxuLy8gTW9zdGx5IGp1c3QgZm9yIHRlc3RpbmcgYW5kIGxlZ2FjeSBBUEkgcmVhc29uc1xuY29uc3QgdG9Db21wYXJhdG9ycyA9IChyYW5nZSwgb3B0aW9ucykgPT5cbiAgbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKS5zZXRcbiAgICAubWFwKGNvbXAgPT4gY29tcC5tYXAoYyA9PiBjLnZhbHVlKS5qb2luKCcgJykudHJpbSgpLnNwbGl0KCcgJykpXG5cbm1vZHVsZS5leHBvcnRzID0gdG9Db21wYXJhdG9yc1xuIiwiY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHZhbGlkUmFuZ2UgPSAocmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBSZXR1cm4gJyonIGluc3RlYWQgb2YgJycgc28gdGhhdCB0cnV0aGluZXNzIHdvcmtzLlxuICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBpZiBpdCdzIGludmFsaWQgYW55d2F5XG4gICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucykucmFuZ2UgfHwgJyonXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB2YWxpZFJhbmdlXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbi8vIFRoZSBkZWZhdWx0IEJ1ZmZlciBzaXplIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQuXG5jb25zdCBERUZBVUxUX1NNQVJUQlVGRkVSX1NJWkUgPSA0MDk2O1xuLy8gVGhlIGRlZmF1bHQgc3RyaW5nIGVuY29kaW5nIHRvIHVzZSBmb3IgcmVhZGluZy93cml0aW5nIHN0cmluZ3MuXG5jb25zdCBERUZBVUxUX1NNQVJUQlVGRkVSX0VOQ09ESU5HID0gJ3V0ZjgnO1xuY2xhc3MgU21hcnRCdWZmZXIge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyB7IFNtYXJ0QnVmZmVyT3B0aW9ucyB9IFRoZSBTbWFydEJ1ZmZlck9wdGlvbnMgdG8gYXBwbHkgdG8gdGhpcyBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBERUZBVUxUX1NNQVJUQlVGRkVSX0VOQ09ESU5HO1xuICAgICAgICB0aGlzLl93cml0ZU9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMuX3JlYWRPZmZzZXQgPSAwO1xuICAgICAgICBpZiAoU21hcnRCdWZmZXIuaXNTbWFydEJ1ZmZlck9wdGlvbnMob3B0aW9ucykpIHtcbiAgICAgICAgICAgIC8vIENoZWNrcyBmb3IgZW5jb2RpbmdcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgICAgICAgICAgICAgdXRpbHNfMS5jaGVja0VuY29kaW5nKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrcyBmb3IgaW5pdGlhbCBzaXplIGxlbmd0aFxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmICh1dGlsc18xLmlzRmluaXRlSW50ZWdlcihvcHRpb25zLnNpemUpICYmIG9wdGlvbnMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnVmZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShvcHRpb25zLnNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHV0aWxzXzEuRVJST1JTLklOVkFMSURfU01BUlRCVUZGRVJfU0laRSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBpbml0aWFsIEJ1ZmZlclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5idWZmKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvcHRpb25zLmJ1ZmYpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2J1ZmYgPSBvcHRpb25zLmJ1ZmY7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gb3B0aW9ucy5idWZmLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih1dGlsc18xLkVSUk9SUy5JTlZBTElEX1NNQVJUQlVGRkVSX0JVRkZFUik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYnVmZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShERUZBVUxUX1NNQVJUQlVGRkVSX1NJWkUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgc29tZXRoaW5nIHdhcyBwYXNzZWQgYnV0IGl0J3Mgbm90IGEgU21hcnRCdWZmZXJPcHRpb25zIG9iamVjdFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih1dGlsc18xLkVSUk9SUy5JTlZBTElEX1NNQVJUQlVGRkVSX09CSkVDVCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UgZGVmYXVsdCB0byBzYW5lIG9wdGlvbnNcbiAgICAgICAgICAgIHRoaXMuX2J1ZmYgPSBCdWZmZXIuYWxsb2NVbnNhZmUoREVGQVVMVF9TTUFSVEJVRkZFUl9TSVpFKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNtYXJ0QnVmZmVyIGluc3RhbmNlIHdpdGggdGhlIHByb3ZpZGVkIGludGVybmFsIEJ1ZmZlciBzaXplIGFuZCBvcHRpb25hbCBlbmNvZGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaXplIHsgTnVtYmVyIH0gVGhlIHNpemUgb2YgdGhlIGludGVybmFsIEJ1ZmZlci5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvciBzdHJpbmdzLlxuICAgICAqXG4gICAgICogQHJldHVybiB7IFNtYXJ0QnVmZmVyIH1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbVNpemUoc2l6ZSwgZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKHtcbiAgICAgICAgICAgIHNpemU6IHNpemUsXG4gICAgICAgICAgICBlbmNvZGluZzogZW5jb2RpbmdcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU21hcnRCdWZmZXIgaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgQnVmZmVyIGFuZCBvcHRpb25hbCBlbmNvZGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBidWZmZXIgeyBCdWZmZXIgfSBUaGUgQnVmZmVyIHRvIHVzZSBhcyB0aGUgaW50ZXJuYWwgQnVmZmVyIHZhbHVlLlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHN0cmluZ3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgU21hcnRCdWZmZXIgfVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tQnVmZmVyKGJ1ZmYsIGVuY29kaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgdGhpcyh7XG4gICAgICAgICAgICBidWZmOiBidWZmLFxuICAgICAgICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNtYXJ0QnVmZmVyIGluc3RhbmNlIHdpdGggdGhlIHByb3ZpZGVkIFNtYXJ0QnVmZmVyT3B0aW9ucyBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgeyBTbWFydEJ1ZmZlck9wdGlvbnMgfSBUaGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICovXG4gICAgc3RhdGljIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUeXBlIGNoZWNraW5nIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyBpZiBhbiBvYmplY3QgaXMgYSBTbWFydEJ1ZmZlck9wdGlvbnMgb2JqZWN0LlxuICAgICAqL1xuICAgIHN0YXRpYyBpc1NtYXJ0QnVmZmVyT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhc3RPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgcmV0dXJuIChjYXN0T3B0aW9ucyAmJlxuICAgICAgICAgICAgKGNhc3RPcHRpb25zLmVuY29kaW5nICE9PSB1bmRlZmluZWQgfHwgY2FzdE9wdGlvbnMuc2l6ZSAhPT0gdW5kZWZpbmVkIHx8IGNhc3RPcHRpb25zLmJ1ZmYgIT09IHVuZGVmaW5lZCkpO1xuICAgIH1cbiAgICAvLyBTaWduZWQgaW50ZWdlcnNcbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBJbnQ4IHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkSW50OChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4LCAxLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBJbnQxNkJFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkSW50MTZCRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFLCAyLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBJbnQxNkxFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkSW50MTZMRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFLCAyLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBJbnQzMkJFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkSW50MzJCRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFLCA0LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhbiBJbnQzMkxFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkSW50MzJMRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFLCA0LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIEJpZ0ludDY0QkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBCaWdJbnQgfVxuICAgICAqL1xuICAgIHJlYWRCaWdJbnQ2NEJFKG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3JlYWRCaWdJbnQ2NEJFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnSW50NjRCRSwgOCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBCaWdJbnQ2NExFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgQmlnSW50IH1cbiAgICAgKi9cbiAgICByZWFkQmlnSW50NjRMRShvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCdyZWFkQmlnSW50NjRMRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ0ludDY0TEUsIDgsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBJbnQ4IHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlSW50OCh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDgsIDEsIHZhbHVlLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBJbnQ4IHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRJbnQ4KHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4LCAxLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIEludDE2QkUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVJbnQxNkJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUsIDIsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIEludDE2QkUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEludDE2QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUsIDIsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYW4gSW50MTZMRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUludDE2TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSwgMiwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gSW50MTZMRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0SW50MTZMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSwgMiwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBJbnQzMkJFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlSW50MzJCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBJbnQzMkJFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRJbnQzMkJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIEludDMyTEUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVJbnQzMkxFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIEludDMyTEUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEludDMyTEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUsIDQsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBCaWdJbnQ2NEJFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgQmlnSW50IH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlQmlnSW50NjRCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygnd3JpdGVCaWdJbnQ2NEJFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NEJFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIEJpZ0ludDY0QkUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IEJpZ0ludCB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEJpZ0ludDY0QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3dyaXRlQmlnSW50NjRCRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBCaWdJbnQ2NExFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgQmlnSW50IH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlQmlnSW50NjRMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygnd3JpdGVCaWdJbnQ2NExFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NExFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIEludDY0TEUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IEJpZ0ludCB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEJpZ0ludDY0TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3dyaXRlQmlnSW50NjRMRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0TEUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvLyBVbnNpZ25lZCBJbnRlZ2Vyc1xuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIFVJbnQ4IHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkVUludDgob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDgsIDEsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIFVJbnQxNkJFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkVUludDE2QkUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUsIDIsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIFVJbnQxNkxFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkVUludDE2TEUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUsIDIsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIFVJbnQzMkJFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkVUludDMyQkUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUsIDQsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIFVJbnQzMkxFIHZhbHVlIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbiBvciBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZGF0YSBmcm9tIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICByZWFkVUludDMyTEUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUsIDQsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgQmlnVUludDY0QkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBCaWdJbnQgfVxuICAgICAqL1xuICAgIHJlYWRCaWdVSW50NjRCRShvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCdyZWFkQmlnVUludDY0QkUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWRCaWdVSW50NjRCRSwgOCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBCaWdVSW50NjRMRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IEJpZ0ludCB9XG4gICAgICovXG4gICAgcmVhZEJpZ1VJbnQ2NExFKG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3JlYWRCaWdVSW50NjRMRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NExFLCA4LCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYW4gVUludDggdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVVSW50OCh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCwgMSwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gVUludDggdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydFVJbnQ4KHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCwgMSwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBVSW50MTZCRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZVVJbnQxNkJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFLCAyLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBVSW50MTZCRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0VUludDE2QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFLCAyLCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGFuIFVJbnQxNkxFIHZhbHVlIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIChvciBhdCBvcHRpb25hbCBvZmZzZXQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIHdyaXRlVUludDE2TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUsIDIsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGFuIFVJbnQxNkxFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRVSW50MTZMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUsIDIsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYW4gVUludDMyQkUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVVSW50MzJCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSwgNCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYW4gVUludDMyQkUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydFVJbnQzMkJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSwgNCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhbiBVSW50MzJMRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZVVJbnQzMkxFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhbiBVSW50MzJMRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0VUludDMyTEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgQmlnVUludDY0QkUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVCaWdVSW50NjRCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjaygnd3JpdGVCaWdVSW50NjRCRScpO1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlQmlnVUludDY0QkUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgQmlnVUludDY0QkUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBhdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gdGhpc1xuICAgICAqL1xuICAgIGluc2VydEJpZ1VJbnQ2NEJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCd3cml0ZUJpZ1VJbnQ2NEJFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlQmlnVUludDY0QkUsIDgsIHZhbHVlLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBCaWdVSW50NjRMRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUJpZ1VJbnQ2NExFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5iaWdJbnRBbmRCdWZmZXJJbnQ2NENoZWNrKCd3cml0ZUJpZ1VJbnQ2NExFJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRMRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBCaWdVSW50NjRMRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0QmlnVUludDY0TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2soJ3dyaXRlQmlnVUludDY0TEUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRMRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8vIEZsb2F0aW5nIFBvaW50XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gRmxvYXRCRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IE51bWJlciB9XG4gICAgICovXG4gICAgcmVhZEZsb2F0QkUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSwgNCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gRmxvYXRMRSB2YWx1ZSBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gb3IgYW4gb3B0aW9uYWxseSBwcm92aWRlZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byByZWFkIGRhdGEgZnJvbSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7IE51bWJlciB9XG4gICAgICovXG4gICAgcmVhZEZsb2F0TEUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkTnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSwgNCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgRmxvYXRCRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUZsb2F0QkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSwgNCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBGbG9hdEJFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRGbG9hdEJFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgRmxvYXRMRSB2YWx1ZSB0byB0aGUgY3VycmVudCB3cml0ZSBwb3NpdGlvbiAob3IgYXQgb3B0aW9uYWwgb2Zmc2V0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IE51bWJlciB9IFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUZsb2F0TEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVOdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSwgNCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBGbG9hdExFIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgdmFsdWUgYXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRGbG9hdExFKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydE51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFLCA0LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gRG91YmxlIEZsb2F0aW5nIFBvaW50XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gRG91YmxFQkUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWREb3VibGVCRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSwgOCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gRG91YmxlTEUgdmFsdWUgZnJvbSB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIG9yIGFuIG9wdGlvbmFsbHkgcHJvdmlkZWQgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gcmVhZCBkYXRhIGZyb20gKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlYWREb3VibGVMRShvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWROdW1iZXJWYWx1ZShCdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSwgOCwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgRG91YmxlQkUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVEb3VibGVCRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBEb3VibGVCRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0RG91YmxlQkUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgRG91YmxlTEUgdmFsdWUgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKG9yIGF0IG9wdGlvbmFsIG9mZnNldCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBOdW1iZXIgfSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgdG8gd3JpdGUgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVEb3VibGVMRSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU51bWJlclZhbHVlKEJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSwgOCwgdmFsdWUsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBEb3VibGVMRSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH0gVGhlIHZhbHVlIHRvIGluc2VydC5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHZhbHVlIGF0LlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0RG91YmxlTEUodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0TnVtYmVyVmFsdWUoQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFLCA4LCB2YWx1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLy8gU3RyaW5nc1xuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgU3RyaW5nIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhcmcxIHsgTnVtYmVyIHwgU3RyaW5nIH0gVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGFzIGEgU3RyaW5nLCBvciB0aGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvclxuICAgICAqICAgICAgICAgICAgIHRoZSBzdHJpbmcgKERlZmF1bHRzIHRvIGluc3RhbmNlIGxldmVsIGVuY29kaW5nKS5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvciB0aGUgc3RyaW5nIChEZWZhdWx0cyB0byBpbnN0YW5jZSBsZXZlbCBlbmNvZGluZykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgU3RyaW5nIH1cbiAgICAgKi9cbiAgICByZWFkU3RyaW5nKGFyZzEsIGVuY29kaW5nKSB7XG4gICAgICAgIGxldCBsZW5ndGhWYWw7XG4gICAgICAgIC8vIExlbmd0aCBwcm92aWRlZFxuICAgICAgICBpZiAodHlwZW9mIGFyZzEgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB1dGlsc18xLmNoZWNrTGVuZ3RoVmFsdWUoYXJnMSk7XG4gICAgICAgICAgICBsZW5ndGhWYWwgPSBNYXRoLm1pbihhcmcxLCB0aGlzLmxlbmd0aCAtIHRoaXMuX3JlYWRPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW5jb2RpbmcgPSBhcmcxO1xuICAgICAgICAgICAgbGVuZ3RoVmFsID0gdGhpcy5sZW5ndGggLSB0aGlzLl9yZWFkT2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGVuY29kaW5nXG4gICAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB1dGlsc18xLmNoZWNrRW5jb2RpbmcoZW5jb2RpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fYnVmZi5zbGljZSh0aGlzLl9yZWFkT2Zmc2V0LCB0aGlzLl9yZWFkT2Zmc2V0ICsgbGVuZ3RoVmFsKS50b1N0cmluZyhlbmNvZGluZyB8fCB0aGlzLl9lbmNvZGluZyk7XG4gICAgICAgIHRoaXMuX3JlYWRPZmZzZXQgKz0gbGVuZ3RoVmFsO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBTdHJpbmdcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IFN0cmluZyB9IFRoZSBTdHJpbmcgdmFsdWUgdG8gaW5zZXJ0LlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIGluc2VydCB0aGUgc3RyaW5nIGF0LlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHdyaXRpbmcgc3RyaW5ncyAoZGVmYXVsdHMgdG8gaW5zdGFuY2UgZW5jb2RpbmcpLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgaW5zZXJ0U3RyaW5nKHZhbHVlLCBvZmZzZXQsIGVuY29kaW5nKSB7XG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlU3RyaW5nKHZhbHVlLCB0cnVlLCBvZmZzZXQsIGVuY29kaW5nKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgU3RyaW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBTdHJpbmcgfSBUaGUgU3RyaW5nIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBhcmcyIHsgTnVtYmVyIHwgU3RyaW5nIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgc3RyaW5nIGF0LCBvciB0aGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlLlxuICAgICAqIEBwYXJhbSBlbmNvZGluZyB7IFN0cmluZyB9IFRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UgZm9yIHdyaXRpbmcgc3RyaW5ncyAoZGVmYXVsdHMgdG8gaW5zdGFuY2UgZW5jb2RpbmcpLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVTdHJpbmcodmFsdWUsIGFyZzIsIGVuY29kaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVTdHJpbmcodmFsdWUsIGZhbHNlLCBhcmcyLCBlbmNvZGluZyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgbnVsbC10ZXJtaW5hdGVkIFN0cmluZyBmcm9tIHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvciB0aGUgc3RyaW5nIChEZWZhdWx0cyB0byBpbnN0YW5jZSBsZXZlbCBlbmNvZGluZykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgU3RyaW5nIH1cbiAgICAgKi9cbiAgICByZWFkU3RyaW5nTlQoZW5jb2RpbmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tFbmNvZGluZyhlbmNvZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IG51bGwgY2hhcmFjdGVyIHBvc2l0aW9uIHRvIHRoZSBlbmQgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICAgIGxldCBudWxsUG9zID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIC8vIEZpbmQgbmV4dCBudWxsIGNoYXJhY3RlciAoaWYgb25lIGlzIG5vdCBmb3VuZCwgZGVmYXVsdCBmcm9tIGFib3ZlIGlzIHVzZWQpXG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9yZWFkT2Zmc2V0OyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2J1ZmZbaV0gPT09IDB4MDApIHtcbiAgICAgICAgICAgICAgICBudWxsUG9zID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBSZWFkIHN0cmluZyB2YWx1ZVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2J1ZmYuc2xpY2UodGhpcy5fcmVhZE9mZnNldCwgbnVsbFBvcyk7XG4gICAgICAgIC8vIEluY3JlbWVudCBpbnRlcm5hbCBCdWZmZXIgcmVhZCBvZmZzZXRcbiAgICAgICAgdGhpcy5fcmVhZE9mZnNldCA9IG51bGxQb3MgKyAxO1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoZW5jb2RpbmcgfHwgdGhpcy5fZW5jb2RpbmcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnRzIGEgbnVsbC10ZXJtaW5hdGVkIFN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IFN0cmluZyB9IFRoZSBTdHJpbmcgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIGFyZzIgeyBOdW1iZXIgfCBTdHJpbmcgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBzdHJpbmcgdG8sIG9yIHRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIHsgU3RyaW5nIH0gVGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZSBmb3Igd3JpdGluZyBzdHJpbmdzIChkZWZhdWx0cyB0byBpbnN0YW5jZSBlbmNvZGluZykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRTdHJpbmdOVCh2YWx1ZSwgb2Zmc2V0LCBlbmNvZGluZykge1xuICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgLy8gV3JpdGUgVmFsdWVzXG4gICAgICAgIHRoaXMuaW5zZXJ0U3RyaW5nKHZhbHVlLCBvZmZzZXQsIGVuY29kaW5nKTtcbiAgICAgICAgdGhpcy5pbnNlcnRVSW50OCgweDAwLCBvZmZzZXQgKyB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgbnVsbC10ZXJtaW5hdGVkIFN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IFN0cmluZyB9IFRoZSBTdHJpbmcgdmFsdWUgdG8gd3JpdGUuXG4gICAgICogQHBhcmFtIGFyZzIgeyBOdW1iZXIgfCBTdHJpbmcgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBzdHJpbmcgdG8sIG9yIHRoZSBCdWZmZXJFbmNvZGluZyB0byB1c2UuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIHsgU3RyaW5nIH0gVGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZSBmb3Igd3JpdGluZyBzdHJpbmdzIChkZWZhdWx0cyB0byBpbnN0YW5jZSBlbmNvZGluZykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZVN0cmluZ05UKHZhbHVlLCBhcmcyLCBlbmNvZGluZykge1xuICAgICAgICAvLyBXcml0ZSBWYWx1ZXNcbiAgICAgICAgdGhpcy53cml0ZVN0cmluZyh2YWx1ZSwgYXJnMiwgZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLndyaXRlVUludDgoMHgwMCwgdHlwZW9mIGFyZzIgPT09ICdudW1iZXInID8gYXJnMiArIHZhbHVlLmxlbmd0aCA6IHRoaXMud3JpdGVPZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLy8gQnVmZmVyc1xuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgQnVmZmVyIGZyb20gdGhlIGludGVybmFsIHJlYWQgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIHsgTnVtYmVyIH0gVGhlIGxlbmd0aCBvZiBkYXRhIHRvIHJlYWQgYXMgYSBCdWZmZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgQnVmZmVyIH1cbiAgICAgKi9cbiAgICByZWFkQnVmZmVyKGxlbmd0aCkge1xuICAgICAgICBpZiAodHlwZW9mIGxlbmd0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tMZW5ndGhWYWx1ZShsZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlbmd0aFZhbCA9IHR5cGVvZiBsZW5ndGggPT09ICdudW1iZXInID8gbGVuZ3RoIDogdGhpcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gTWF0aC5taW4odGhpcy5sZW5ndGgsIHRoaXMuX3JlYWRPZmZzZXQgKyBsZW5ndGhWYWwpO1xuICAgICAgICAvLyBSZWFkIGJ1ZmZlciB2YWx1ZVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2J1ZmYuc2xpY2UodGhpcy5fcmVhZE9mZnNldCwgZW5kUG9pbnQpO1xuICAgICAgICAvLyBJbmNyZW1lbnQgaW50ZXJuYWwgQnVmZmVyIHJlYWQgb2Zmc2V0XG4gICAgICAgIHRoaXMuX3JlYWRPZmZzZXQgPSBlbmRQb2ludDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBCdWZmZXIgdG8gdGhlIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCdWZmZXIgfSBUaGUgQnVmZmVyIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBCdWZmZXIgdG8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRCdWZmZXIodmFsdWUsIG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUJ1ZmZlcih2YWx1ZSwgdHJ1ZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgQnVmZmVyIHRvIHRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgQnVmZmVyIH0gVGhlIEJ1ZmZlciB0byB3cml0ZS5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCB0byB3cml0ZSB0aGUgQnVmZmVyIHRvLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGlzXG4gICAgICovXG4gICAgd3JpdGVCdWZmZXIodmFsdWUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlQnVmZmVyKHZhbHVlLCBmYWxzZSwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBudWxsLXRlcm1pbmF0ZWQgQnVmZmVyIGZyb20gdGhlIGN1cnJlbnQgcmVhZCBwb2lzaXRvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBCdWZmZXIgfVxuICAgICAqL1xuICAgIHJlYWRCdWZmZXJOVCgpIHtcbiAgICAgICAgLy8gU2V0IG51bGwgY2hhcmFjdGVyIHBvc2l0aW9uIHRvIHRoZSBlbmQgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICAgIGxldCBudWxsUG9zID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIC8vIEZpbmQgbmV4dCBudWxsIGNoYXJhY3RlciAoaWYgb25lIGlzIG5vdCBmb3VuZCwgZGVmYXVsdCBmcm9tIGFib3ZlIGlzIHVzZWQpXG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9yZWFkT2Zmc2V0OyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2J1ZmZbaV0gPT09IDB4MDApIHtcbiAgICAgICAgICAgICAgICBudWxsUG9zID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBSZWFkIHZhbHVlXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fYnVmZi5zbGljZSh0aGlzLl9yZWFkT2Zmc2V0LCBudWxsUG9zKTtcbiAgICAgICAgLy8gSW5jcmVtZW50IGludGVybmFsIEJ1ZmZlciByZWFkIG9mZnNldFxuICAgICAgICB0aGlzLl9yZWFkT2Zmc2V0ID0gbnVsbFBvcyArIDE7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyBhIG51bGwtdGVybWluYXRlZCBCdWZmZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCdWZmZXIgfSBUaGUgQnVmZmVyIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBCdWZmZXIgdG8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICBpbnNlcnRCdWZmZXJOVCh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICAvLyBXcml0ZSBWYWx1ZXNcbiAgICAgICAgdGhpcy5pbnNlcnRCdWZmZXIodmFsdWUsIG9mZnNldCk7XG4gICAgICAgIHRoaXMuaW5zZXJ0VUludDgoMHgwMCwgb2Zmc2V0ICsgdmFsdWUubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIG51bGwtdGVybWluYXRlZCBCdWZmZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCdWZmZXIgfSBUaGUgQnVmZmVyIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBCdWZmZXIgdG8uXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHRoaXNcbiAgICAgKi9cbiAgICB3cml0ZUJ1ZmZlck5UKHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgLy8gQ2hlY2tzIGZvciB2YWxpZCBudW1iZXJpYyB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXcml0ZSBWYWx1ZXNcbiAgICAgICAgdGhpcy53cml0ZUJ1ZmZlcih2YWx1ZSwgb2Zmc2V0KTtcbiAgICAgICAgdGhpcy53cml0ZVVJbnQ4KDB4MDAsIHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInID8gb2Zmc2V0ICsgdmFsdWUubGVuZ3RoIDogdGhpcy5fd3JpdGVPZmZzZXQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZSB0byBpdHMgb3JpZ2luYWwgZW1wdHkgc3RhdGUuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ID0gMDtcbiAgICAgICAgdGhpcy5fcmVhZE9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJlbWFpbmluZyBkYXRhIGxlZnQgdG8gYmUgcmVhZCBmcm9tIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBOdW1iZXIgfVxuICAgICAqL1xuICAgIHJlbWFpbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoIC0gdGhpcy5fcmVhZE9mZnNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCByZWFkIG9mZnNldCB2YWx1ZSBvZiB0aGUgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICBnZXQgcmVhZE9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRPZmZzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlYWQgb2Zmc2V0IHZhbHVlIG9mIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSAtIFRoZSBvZmZzZXQgdmFsdWUgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldCByZWFkT2Zmc2V0KG9mZnNldCkge1xuICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGJvdW5kcy5cbiAgICAgICAgdXRpbHNfMS5jaGVja1RhcmdldE9mZnNldChvZmZzZXQsIHRoaXMpO1xuICAgICAgICB0aGlzLl9yZWFkT2Zmc2V0ID0gb2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHdyaXRlIG9mZnNldCB2YWx1ZSBvZiB0aGUgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgTnVtYmVyIH1cbiAgICAgKi9cbiAgICBnZXQgd3JpdGVPZmZzZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93cml0ZU9mZnNldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgd3JpdGUgb2Zmc2V0IHZhbHVlIG9mIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSAtIFRoZSBvZmZzZXQgdmFsdWUgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldCB3cml0ZU9mZnNldChvZmZzZXQpIHtcbiAgICAgICAgdXRpbHNfMS5jaGVja09mZnNldFZhbHVlKG9mZnNldCk7XG4gICAgICAgIC8vIENoZWNrIGZvciBib3VuZHMuXG4gICAgICAgIHV0aWxzXzEuY2hlY2tUYXJnZXRPZmZzZXQob2Zmc2V0LCB0aGlzKTtcbiAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgPSBvZmZzZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnRseSBzZXQgc3RyaW5nIGVuY29kaW5nIG9mIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyBCdWZmZXJFbmNvZGluZyB9IFRoZSBzdHJpbmcgQnVmZmVyIGVuY29kaW5nIGN1cnJlbnRseSBzZXQuXG4gICAgICovXG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHN0cmluZyBlbmNvZGluZyBvZiB0aGUgU21hcnRCdWZmZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBCdWZmZXJFbmNvZGluZyB9IFRoZSBzdHJpbmcgQnVmZmVyIGVuY29kaW5nIHRvIHNldC5cbiAgICAgKi9cbiAgICBzZXQgZW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgICAgICAgdXRpbHNfMS5jaGVja0VuY29kaW5nKGVuY29kaW5nKTtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdW5kZXJseWluZyBpbnRlcm5hbCBCdWZmZXIuIChUaGlzIGluY2x1ZGVzIHVubWFuYWdlZCBkYXRhIGluIHRoZSBCdWZmZXIpXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHsgQnVmZmVyIH0gVGhlIEJ1ZmZlciB2YWx1ZS5cbiAgICAgKi9cbiAgICBnZXQgaW50ZXJuYWxCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW50ZXJuYWwgbWFuYWdlZCBCdWZmZXIgKEluY2x1ZGVzIG1hbmFnZWQgZGF0YSBvbmx5KVxuICAgICAqXG4gICAgICogQHBhcmFtIHsgQnVmZmVyIH1cbiAgICAgKi9cbiAgICB0b0J1ZmZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmYuc2xpY2UoMCwgdGhpcy5sZW5ndGgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBTdHJpbmcgdmFsdWUgb2YgdGhlIGludGVybmFsIG1hbmFnZWQgQnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gZGlzcGxheSB0aGUgQnVmZmVyIGFzIChkZWZhdWx0cyB0byBpbnN0YW5jZSBsZXZlbCBlbmNvZGluZykuXG4gICAgICovXG4gICAgdG9TdHJpbmcoZW5jb2RpbmcpIHtcbiAgICAgICAgY29uc3QgZW5jb2RpbmdWYWwgPSB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnID8gZW5jb2RpbmcgOiB0aGlzLl9lbmNvZGluZztcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGludmFsaWQgZW5jb2RpbmcuXG4gICAgICAgIHV0aWxzXzEuY2hlY2tFbmNvZGluZyhlbmNvZGluZ1ZhbCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmLnRvU3RyaW5nKGVuY29kaW5nVmFsLCAwLCB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoZSBTbWFydEJ1ZmZlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGluc2VydGluZyBhbmQgd3JpdGluZyBzdHJpbmdzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHsgU3RyaW5nIH0gVGhlIFN0cmluZyB2YWx1ZSB0byBpbnNlcnQuXG4gICAgICogQHBhcmFtIGlzSW5zZXJ0IHsgQm9vbGVhbiB9IFRydWUgaWYgaW5zZXJ0aW5nIGEgc3RyaW5nLCBmYWxzZSBpZiB3cml0aW5nLlxuICAgICAqIEBwYXJhbSBhcmcyIHsgTnVtYmVyIHwgU3RyaW5nIH0gVGhlIG9mZnNldCB0byBpbnNlcnQgdGhlIHN0cmluZyBhdCwgb3IgdGhlIEJ1ZmZlckVuY29kaW5nIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgeyBTdHJpbmcgfSBUaGUgQnVmZmVyRW5jb2RpbmcgdG8gdXNlIGZvciB3cml0aW5nIHN0cmluZ3MgKGRlZmF1bHRzIHRvIGluc3RhbmNlIGVuY29kaW5nKS5cbiAgICAgKi9cbiAgICBfaGFuZGxlU3RyaW5nKHZhbHVlLCBpc0luc2VydCwgYXJnMywgZW5jb2RpbmcpIHtcbiAgICAgICAgbGV0IG9mZnNldFZhbCA9IHRoaXMuX3dyaXRlT2Zmc2V0O1xuICAgICAgICBsZXQgZW5jb2RpbmdWYWwgPSB0aGlzLl9lbmNvZGluZztcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG9mZnNldFxuICAgICAgICBpZiAodHlwZW9mIGFyZzMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBvZmZzZXRWYWwgPSBhcmczO1xuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVuY29kaW5nXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGFyZzMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB1dGlsc18xLmNoZWNrRW5jb2RpbmcoYXJnMyk7XG4gICAgICAgICAgICBlbmNvZGluZ1ZhbCA9IGFyZzM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGVuY29kaW5nICh0aGlyZCBwYXJhbSlcbiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tFbmNvZGluZyhlbmNvZGluZyk7XG4gICAgICAgICAgICBlbmNvZGluZ1ZhbCA9IGVuY29kaW5nO1xuICAgICAgICB9XG4gICAgICAgIC8vIENhbGN1bGF0ZSBieXRlbGVuZ3RoIG9mIHN0cmluZy5cbiAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHZhbHVlLCBlbmNvZGluZ1ZhbCk7XG4gICAgICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggaW50ZXJuYWwgQnVmZmVyIGNhcGFjaXR5LlxuICAgICAgICBpZiAoaXNJbnNlcnQpIHtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlSW5zZXJ0YWJsZShieXRlTGVuZ3RoLCBvZmZzZXRWYWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW5zdXJlV3JpdGVhYmxlKGJ5dGVMZW5ndGgsIG9mZnNldFZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV3JpdGUgdmFsdWVcbiAgICAgICAgdGhpcy5fYnVmZi53cml0ZSh2YWx1ZSwgb2Zmc2V0VmFsLCBieXRlTGVuZ3RoLCBlbmNvZGluZ1ZhbCk7XG4gICAgICAgIC8vIEluY3JlbWVudCBpbnRlcm5hbCBCdWZmZXIgd3JpdGUgb2Zmc2V0O1xuICAgICAgICBpZiAoaXNJbnNlcnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ICs9IGJ5dGVMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBhbiBvZmZzZXQgd2FzIGdpdmVuLCBjaGVjayB0byBzZWUgaWYgd2Ugd3JvdGUgYmV5b25kIHRoZSBjdXJyZW50IHdyaXRlT2Zmc2V0LlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmczID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ID0gTWF0aC5tYXgodGhpcy5fd3JpdGVPZmZzZXQsIG9mZnNldFZhbCArIGJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbm8gb2Zmc2V0IHdhcyBnaXZlbiwgd2Ugd3JvdGUgdG8gdGhlIGVuZCBvZiB0aGUgU21hcnRCdWZmZXIgc28gaW5jcmVtZW50IHdyaXRlT2Zmc2V0LlxuICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlT2Zmc2V0ICs9IGJ5dGVMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd3JpdGluZyBvciBpbnNlcnQgb2YgYSBCdWZmZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgeyBCdWZmZXIgfSBUaGUgQnVmZmVyIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBCdWZmZXIgdG8uXG4gICAgICovXG4gICAgX2hhbmRsZUJ1ZmZlcih2YWx1ZSwgaXNJbnNlcnQsIG9mZnNldCkge1xuICAgICAgICBjb25zdCBvZmZzZXRWYWwgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJyA/IG9mZnNldCA6IHRoaXMuX3dyaXRlT2Zmc2V0O1xuICAgICAgICAvLyBFbnN1cmUgdGhlcmUgaXMgZW5vdWdoIGludGVybmFsIEJ1ZmZlciBjYXBhY2l0eS5cbiAgICAgICAgaWYgKGlzSW5zZXJ0KSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZUluc2VydGFibGUodmFsdWUubGVuZ3RoLCBvZmZzZXRWYWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW5zdXJlV3JpdGVhYmxlKHZhbHVlLmxlbmd0aCwgb2Zmc2V0VmFsKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXcml0ZSBidWZmZXIgdmFsdWVcbiAgICAgICAgdmFsdWUuY29weSh0aGlzLl9idWZmLCBvZmZzZXRWYWwpO1xuICAgICAgICAvLyBJbmNyZW1lbnQgaW50ZXJuYWwgQnVmZmVyIHdyaXRlIG9mZnNldDtcbiAgICAgICAgaWYgKGlzSW5zZXJ0KSB7XG4gICAgICAgICAgICB0aGlzLl93cml0ZU9mZnNldCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBhbiBvZmZzZXQgd2FzIGdpdmVuLCBjaGVjayB0byBzZWUgaWYgd2Ugd3JvdGUgYmV5b25kIHRoZSBjdXJyZW50IHdyaXRlT2Zmc2V0LlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgPSBNYXRoLm1heCh0aGlzLl93cml0ZU9mZnNldCwgb2Zmc2V0VmFsICsgdmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIElmIG5vIG9mZnNldCB3YXMgZ2l2ZW4sIHdlIHdyb3RlIHRvIHRoZSBlbmQgb2YgdGhlIFNtYXJ0QnVmZmVyIHNvIGluY3JlbWVudCB3cml0ZU9mZnNldC5cbiAgICAgICAgICAgICAgICB0aGlzLl93cml0ZU9mZnNldCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgaW50ZXJuYWwgQnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byByZWFkIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGVuZ3RoIHsgTnVtYmVyIH0gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHJlYWQuXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdGhhdCBuZWVkcyB0byBiZSByZWFkLlxuICAgICAqL1xuICAgIGVuc3VyZVJlYWRhYmxlKGxlbmd0aCwgb2Zmc2V0KSB7XG4gICAgICAgIC8vIE9mZnNldCB2YWx1ZSBkZWZhdWx0cyB0byBtYW5hZ2VkIHJlYWQgb2Zmc2V0LlxuICAgICAgICBsZXQgb2Zmc2V0VmFsID0gdGhpcy5fcmVhZE9mZnNldDtcbiAgICAgICAgLy8gSWYgYW4gb2Zmc2V0IHdhcyBwcm92aWRlZCwgdXNlIGl0LlxuICAgICAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIENoZWNrcyBmb3IgdmFsaWQgbnVtYmVyaWMgdmFsdWU7XG4gICAgICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgICAgIC8vIE92ZXJpZGUgd2l0aCBjdXN0b20gb2Zmc2V0LlxuICAgICAgICAgICAgb2Zmc2V0VmFsID0gb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrcyBpZiBvZmZzZXQgaXMgYmVsb3cgemVybywgb3IgdGhlIG9mZnNldCtsZW5ndGggb2Zmc2V0IGlzIGJleW9uZCB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBtYW5hZ2VkIGRhdGEuXG4gICAgICAgIGlmIChvZmZzZXRWYWwgPCAwIHx8IG9mZnNldFZhbCArIGxlbmd0aCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodXRpbHNfMS5FUlJPUlMuSU5WQUxJRF9SRUFEX0JFWU9ORF9CT1VORFMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgaW50ZXJuYWwgQnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBpbnNlcnQgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhTGVuZ3RoIHsgTnVtYmVyIH0gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHdyaXR0ZW4uXG4gICAgICogQHBhcmFtIG9mZnNldCB7IE51bWJlciB9IFRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi5cbiAgICAgKi9cbiAgICBlbnN1cmVJbnNlcnRhYmxlKGRhdGFMZW5ndGgsIG9mZnNldCkge1xuICAgICAgICAvLyBDaGVja3MgZm9yIHZhbGlkIG51bWJlcmljIHZhbHVlO1xuICAgICAgICB1dGlsc18xLmNoZWNrT2Zmc2V0VmFsdWUob2Zmc2V0KTtcbiAgICAgICAgLy8gRW5zdXJlIHRoZXJlIGlzIGVub3VnaCBpbnRlcm5hbCBCdWZmZXIgY2FwYWNpdHkuXG4gICAgICAgIHRoaXMuX2Vuc3VyZUNhcGFjaXR5KHRoaXMubGVuZ3RoICsgZGF0YUxlbmd0aCk7XG4gICAgICAgIC8vIElmIGFuIG9mZnNldCB3YXMgcHJvdmlkZWQgYW5kIGl0cyBub3QgdGhlIHZlcnkgZW5kIG9mIHRoZSBidWZmZXIsIGNvcHkgZGF0YSBpbnRvIGFwcHJvcHJpYXRlIGxvY2F0aW9uIGluIHJlZ2FyZHMgdG8gdGhlIG9mZnNldC5cbiAgICAgICAgaWYgKG9mZnNldCA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9idWZmLmNvcHkodGhpcy5fYnVmZiwgb2Zmc2V0ICsgZGF0YUxlbmd0aCwgb2Zmc2V0LCB0aGlzLl9idWZmLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRqdXN0IHRyYWNrZWQgc21hcnQgYnVmZmVyIGxlbmd0aFxuICAgICAgICBpZiAob2Zmc2V0ICsgZGF0YUxlbmd0aCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG9mZnNldCArIGRhdGFMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCArPSBkYXRhTGVuZ3RoO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgaW50ZXJuYWwgQnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byB3cml0ZSBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFMZW5ndGggeyBOdW1iZXIgfSBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgd3JpdHRlbi5cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IHsgTnVtYmVyIH0gVGhlIG9mZnNldCBvZiB0aGUgZGF0YSB0byBiZSB3cml0dGVuIChkZWZhdWx0cyB0byB3cml0ZU9mZnNldCkuXG4gICAgICovXG4gICAgX2Vuc3VyZVdyaXRlYWJsZShkYXRhTGVuZ3RoLCBvZmZzZXQpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0VmFsID0gdHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicgPyBvZmZzZXQgOiB0aGlzLl93cml0ZU9mZnNldDtcbiAgICAgICAgLy8gRW5zdXJlIGVub3VnaCBjYXBhY2l0eSB0byB3cml0ZSBkYXRhLlxuICAgICAgICB0aGlzLl9lbnN1cmVDYXBhY2l0eShvZmZzZXRWYWwgKyBkYXRhTGVuZ3RoKTtcbiAgICAgICAgLy8gQWRqdXN0IFNtYXJ0QnVmZmVyIGxlbmd0aCAoaWYgb2Zmc2V0ICsgbGVuZ3RoIGlzIGxhcmdlciB0aGFuIG1hbmFnZWQgbGVuZ3RoLCBhZGp1c3QgbGVuZ3RoKVxuICAgICAgICBpZiAob2Zmc2V0VmFsICsgZGF0YUxlbmd0aCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG9mZnNldFZhbCArIGRhdGFMZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5zdXJlcyB0aGF0IHRoZSBpbnRlcm5hbCBCdWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIHdyaXRlIGF0IGxlYXN0IHRoZSBnaXZlbiBhbW91bnQgb2YgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtaW5MZW5ndGggeyBOdW1iZXIgfSBUaGUgbWluaW11bSBsZW5ndGggb2YgdGhlIGRhdGEgbmVlZHMgdG8gYmUgd3JpdHRlbi5cbiAgICAgKi9cbiAgICBfZW5zdXJlQ2FwYWNpdHkobWluTGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG9sZExlbmd0aCA9IHRoaXMuX2J1ZmYubGVuZ3RoO1xuICAgICAgICBpZiAobWluTGVuZ3RoID4gb2xkTGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHRoaXMuX2J1ZmY7XG4gICAgICAgICAgICBsZXQgbmV3TGVuZ3RoID0gKG9sZExlbmd0aCAqIDMpIC8gMiArIDE7XG4gICAgICAgICAgICBpZiAobmV3TGVuZ3RoIDwgbWluTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbmV3TGVuZ3RoID0gbWluTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYnVmZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuZXdMZW5ndGgpO1xuICAgICAgICAgICAgZGF0YS5jb3B5KHRoaXMuX2J1ZmYsIDAsIDAsIG9sZExlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBudW1lcmljIG51bWJlciB2YWx1ZSB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAdHlwZXBhcmFtIFQgeyBudW1iZXIgfCBiaWdpbnQgfSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgdG8gYmUgcmVhZFxuICAgICAqXG4gICAgICogQHBhcmFtIGZ1bmMgeyBGdW5jdGlvbihvZmZzZXQ6IG51bWJlcikgPT4gbnVtYmVyIH0gVGhlIGZ1bmN0aW9uIHRvIHJlYWQgZGF0YSBvbiB0aGUgaW50ZXJuYWwgQnVmZmVyIHdpdGguXG4gICAgICogQHBhcmFtIGJ5dGVTaXplIHsgTnVtYmVyIH0gVGhlIG51bWJlciBvZiBieXRlcyByZWFkLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSBUaGUgb2Zmc2V0IHRvIHJlYWQgZnJvbSAob3B0aW9uYWwpLiBXaGVuIHRoaXMgaXMgbm90IHByb3ZpZGVkLCB0aGUgbWFuYWdlZCByZWFkT2Zmc2V0IGlzIHVzZWQgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHsgVCB9IHRoZSBudW1iZXIgdmFsdWVcbiAgICAgKi9cbiAgICBfcmVhZE51bWJlclZhbHVlKGZ1bmMsIGJ5dGVTaXplLCBvZmZzZXQpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVSZWFkYWJsZShieXRlU2l6ZSwgb2Zmc2V0KTtcbiAgICAgICAgLy8gQ2FsbCBCdWZmZXIucmVhZFhYWFgoKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmdW5jLmNhbGwodGhpcy5fYnVmZiwgdHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicgPyBvZmZzZXQgOiB0aGlzLl9yZWFkT2Zmc2V0KTtcbiAgICAgICAgLy8gQWRqdXN0IGludGVybmFsIHJlYWQgb2Zmc2V0IGlmIGFuIG9wdGlvbmFsIHJlYWQgb2Zmc2V0IHdhcyBub3QgcHJvdmlkZWQuXG4gICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fcmVhZE9mZnNldCArPSBieXRlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc2VydHMgYSBudW1lcmljIG51bWJlciB2YWx1ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gb2Zmc2V0IGFuZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEB0eXBlcGFyYW0gVCB7IG51bWJlciB8IGJpZ2ludCB9IFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZnVuYyB7IEZ1bmN0aW9uKG9mZnNldDogVCwgb2Zmc2V0PykgPT4gbnVtYmVyfSBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgZGF0YSBvbiB0aGUgaW50ZXJuYWwgQnVmZmVyIHdpdGguXG4gICAgICogQHBhcmFtIGJ5dGVTaXplIHsgTnVtYmVyIH0gVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IFQgfSBUaGUgbnVtYmVyIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSB0aGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBudW1iZXIgYXQgKFJFUVVJUkVEKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNtYXJ0QnVmZmVyIHRoaXMgYnVmZmVyXG4gICAgICovXG4gICAgX2luc2VydE51bWJlclZhbHVlKGZ1bmMsIGJ5dGVTaXplLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIG9mZnNldCB2YWx1ZXMuXG4gICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICAvLyBFbnN1cmUgdGhlcmUgaXMgZW5vdWdoIGludGVybmFsIEJ1ZmZlciBjYXBhY2l0eS4gKHJhdyBvZmZzZXQgaXMgcGFzc2VkKVxuICAgICAgICB0aGlzLmVuc3VyZUluc2VydGFibGUoYnl0ZVNpemUsIG9mZnNldCk7XG4gICAgICAgIC8vIENhbGwgYnVmZmVyLndyaXRlWFhYWCgpO1xuICAgICAgICBmdW5jLmNhbGwodGhpcy5fYnVmZiwgdmFsdWUsIG9mZnNldCk7XG4gICAgICAgIC8vIEFkanVzdHMgaW50ZXJuYWxseSBtYW5hZ2VkIHdyaXRlIG9mZnNldC5cbiAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgKz0gYnl0ZVNpemU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBudW1lcmljIG51bWJlciB2YWx1ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gb2Zmc2V0IGFuZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEB0eXBlcGFyYW0gVCB7IG51bWJlciB8IGJpZ2ludCB9IFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZnVuYyB7IEZ1bmN0aW9uKG9mZnNldDogVCwgb2Zmc2V0PykgPT4gbnVtYmVyfSBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgZGF0YSBvbiB0aGUgaW50ZXJuYWwgQnVmZmVyIHdpdGguXG4gICAgICogQHBhcmFtIGJ5dGVTaXplIHsgTnVtYmVyIH0gVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLlxuICAgICAqIEBwYXJhbSB2YWx1ZSB7IFQgfSBUaGUgbnVtYmVyIHZhbHVlIHRvIHdyaXRlLlxuICAgICAqIEBwYXJhbSBvZmZzZXQgeyBOdW1iZXIgfSB0aGUgb2Zmc2V0IHRvIHdyaXRlIHRoZSBudW1iZXIgYXQgKFJFUVVJUkVEKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNtYXJ0QnVmZmVyIHRoaXMgYnVmZmVyXG4gICAgICovXG4gICAgX3dyaXRlTnVtYmVyVmFsdWUoZnVuYywgYnl0ZVNpemUsIHZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgLy8gSWYgYW4gb2Zmc2V0IHdhcyBwcm92aWRlZCwgdmFsaWRhdGUgaXQuXG4gICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgd3JpdGluZyBiZXlvbmQgdGhlIGJvdW5kcyBvZiB0aGUgbWFuYWdlZCBkYXRhLlxuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodXRpbHNfMS5FUlJPUlMuSU5WQUxJRF9XUklURV9CRVlPTkRfQk9VTkRTKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHV0aWxzXzEuY2hlY2tPZmZzZXRWYWx1ZShvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlZmF1bHQgdG8gd3JpdGVPZmZzZXQgaWYgbm8gb2Zmc2V0IHZhbHVlIHdhcyBnaXZlbi5cbiAgICAgICAgY29uc3Qgb2Zmc2V0VmFsID0gdHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicgPyBvZmZzZXQgOiB0aGlzLl93cml0ZU9mZnNldDtcbiAgICAgICAgLy8gRW5zdXJlIHRoZXJlIGlzIGVub3VnaCBpbnRlcm5hbCBCdWZmZXIgY2FwYWNpdHkuIChyYXcgb2Zmc2V0IGlzIHBhc3NlZClcbiAgICAgICAgdGhpcy5fZW5zdXJlV3JpdGVhYmxlKGJ5dGVTaXplLCBvZmZzZXRWYWwpO1xuICAgICAgICBmdW5jLmNhbGwodGhpcy5fYnVmZiwgdmFsdWUsIG9mZnNldFZhbCk7XG4gICAgICAgIC8vIElmIGFuIG9mZnNldCB3YXMgZ2l2ZW4sIGNoZWNrIHRvIHNlZSBpZiB3ZSB3cm90ZSBiZXlvbmQgdGhlIGN1cnJlbnQgd3JpdGVPZmZzZXQuXG4gICAgICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5fd3JpdGVPZmZzZXQgPSBNYXRoLm1heCh0aGlzLl93cml0ZU9mZnNldCwgb2Zmc2V0VmFsICsgYnl0ZVNpemUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgbm8gbnVtZXJpYyBvZmZzZXQgd2FzIGdpdmVuLCB3ZSB3cm90ZSB0byB0aGUgZW5kIG9mIHRoZSBTbWFydEJ1ZmZlciBzbyBpbmNyZW1lbnQgd3JpdGVPZmZzZXQuXG4gICAgICAgICAgICB0aGlzLl93cml0ZU9mZnNldCArPSBieXRlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5leHBvcnRzLlNtYXJ0QnVmZmVyID0gU21hcnRCdWZmZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zbWFydGJ1ZmZlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGJ1ZmZlcl8xID0gcmVxdWlyZShcImJ1ZmZlclwiKTtcbi8qKlxuICogRXJyb3Igc3RyaW5nc1xuICovXG5jb25zdCBFUlJPUlMgPSB7XG4gICAgSU5WQUxJRF9FTkNPRElORzogJ0ludmFsaWQgZW5jb2RpbmcgcHJvdmlkZWQuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgZW5jb2RpbmcgdGhlIGludGVybmFsIE5vZGUuanMgQnVmZmVyIHN1cHBvcnRzLicsXG4gICAgSU5WQUxJRF9TTUFSVEJVRkZFUl9TSVpFOiAnSW52YWxpZCBzaXplIHByb3ZpZGVkLiBTaXplIG11c3QgYmUgYSB2YWxpZCBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiB6ZXJvLicsXG4gICAgSU5WQUxJRF9TTUFSVEJVRkZFUl9CVUZGRVI6ICdJbnZhbGlkIEJ1ZmZlciBwcm92aWRlZCBpbiBTbWFydEJ1ZmZlck9wdGlvbnMuJyxcbiAgICBJTlZBTElEX1NNQVJUQlVGRkVSX09CSkVDVDogJ0ludmFsaWQgU21hcnRCdWZmZXJPcHRpb25zIG9iamVjdCBzdXBwbGllZCB0byBTbWFydEJ1ZmZlciBjb25zdHJ1Y3RvciBvciBmYWN0b3J5IG1ldGhvZHMuJyxcbiAgICBJTlZBTElEX09GRlNFVDogJ0FuIGludmFsaWQgb2Zmc2V0IHZhbHVlIHdhcyBwcm92aWRlZC4nLFxuICAgIElOVkFMSURfT0ZGU0VUX05PTl9OVU1CRVI6ICdBbiBpbnZhbGlkIG9mZnNldCB2YWx1ZSB3YXMgcHJvdmlkZWQuIEEgbnVtZXJpYyB2YWx1ZSBpcyByZXF1aXJlZC4nLFxuICAgIElOVkFMSURfTEVOR1RIOiAnQW4gaW52YWxpZCBsZW5ndGggdmFsdWUgd2FzIHByb3ZpZGVkLicsXG4gICAgSU5WQUxJRF9MRU5HVEhfTk9OX05VTUJFUjogJ0FuIGludmFsaWQgbGVuZ3RoIHZhbHVlIHdhcyBwcm92aXZlZC4gQSBudW1lcmljIHZhbHVlIGlzIHJlcXVpcmVkLicsXG4gICAgSU5WQUxJRF9UQVJHRVRfT0ZGU0VUOiAnVGFyZ2V0IG9mZnNldCBpcyBiZXlvbmQgdGhlIGJvdW5kcyBvZiB0aGUgaW50ZXJuYWwgU21hcnRCdWZmZXIgZGF0YS4nLFxuICAgIElOVkFMSURfVEFSR0VUX0xFTkdUSDogJ1NwZWNpZmllZCBsZW5ndGggdmFsdWUgbW92ZXMgY3Vyc29yIGJleW9uZyB0aGUgYm91bmRzIG9mIHRoZSBpbnRlcm5hbCBTbWFydEJ1ZmZlciBkYXRhLicsXG4gICAgSU5WQUxJRF9SRUFEX0JFWU9ORF9CT1VORFM6ICdBdHRlbXB0ZWQgdG8gcmVhZCBiZXlvbmQgdGhlIGJvdW5kcyBvZiB0aGUgbWFuYWdlZCBkYXRhLicsXG4gICAgSU5WQUxJRF9XUklURV9CRVlPTkRfQk9VTkRTOiAnQXR0ZW1wdGVkIHRvIHdyaXRlIGJleW9uZCB0aGUgYm91bmRzIG9mIHRoZSBtYW5hZ2VkIGRhdGEuJ1xufTtcbmV4cG9ydHMuRVJST1JTID0gRVJST1JTO1xuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBlbmNvZGluZyBpcyBhIHZhbGlkIEJ1ZmZlciBlbmNvZGluZy4gKFRocm93cyBhbiBleGNlcHRpb24gaWYgY2hlY2sgZmFpbHMpXG4gKlxuICogQHBhcmFtIHsgU3RyaW5nIH0gZW5jb2RpbmcgVGhlIGVuY29kaW5nIHN0cmluZyB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gY2hlY2tFbmNvZGluZyhlbmNvZGluZykge1xuICAgIGlmICghYnVmZmVyXzEuQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUlMuSU5WQUxJRF9FTkNPRElORyk7XG4gICAgfVxufVxuZXhwb3J0cy5jaGVja0VuY29kaW5nID0gY2hlY2tFbmNvZGluZztcbi8qKlxuICogQ2hlY2tzIGlmIGEgZ2l2ZW4gbnVtYmVyIGlzIGEgZmluaXRlIGludGVnZXIuIChUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGNoZWNrIGZhaWxzKVxuICpcbiAqIEBwYXJhbSB7IE51bWJlciB9IHZhbHVlIFRoZSBudW1iZXIgdmFsdWUgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGlzRmluaXRlSW50ZWdlcih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbHVlKSAmJiBpc0ludGVnZXIodmFsdWUpO1xufVxuZXhwb3J0cy5pc0Zpbml0ZUludGVnZXIgPSBpc0Zpbml0ZUludGVnZXI7XG4vKipcbiAqIENoZWNrcyBpZiBhbiBvZmZzZXQvbGVuZ3RoIHZhbHVlIGlzIHZhbGlkLiAoVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBjaGVjayBmYWlscylcbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIG9mZnNldCBUcnVlIGlmIGNoZWNraW5nIGFuIG9mZnNldCwgZmFsc2UgaWYgY2hlY2tpbmcgYSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0T3JMZW5ndGhWYWx1ZSh2YWx1ZSwgb2Zmc2V0KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG5vbiBmaW5pdGUvbm9uIGludGVnZXJzXG4gICAgICAgIGlmICghaXNGaW5pdGVJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihvZmZzZXQgPyBFUlJPUlMuSU5WQUxJRF9PRkZTRVQgOiBFUlJPUlMuSU5WQUxJRF9MRU5HVEgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3Iob2Zmc2V0ID8gRVJST1JTLklOVkFMSURfT0ZGU0VUX05PTl9OVU1CRVIgOiBFUlJPUlMuSU5WQUxJRF9MRU5HVEhfTk9OX05VTUJFUik7XG4gICAgfVxufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBsZW5ndGggdmFsdWUgaXMgdmFsaWQuIChUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIGNoZWNrIGZhaWxzKVxuICpcbiAqIEBwYXJhbSB7IE51bWJlciB9IGxlbmd0aCBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTGVuZ3RoVmFsdWUobGVuZ3RoKSB7XG4gICAgY2hlY2tPZmZzZXRPckxlbmd0aFZhbHVlKGxlbmd0aCwgZmFsc2UpO1xufVxuZXhwb3J0cy5jaGVja0xlbmd0aFZhbHVlID0gY2hlY2tMZW5ndGhWYWx1ZTtcbi8qKlxuICogQ2hlY2tzIGlmIGEgb2Zmc2V0IHZhbHVlIGlzIHZhbGlkLiAoVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBjaGVjayBmYWlscylcbiAqXG4gKiBAcGFyYW0geyBOdW1iZXIgfSBvZmZzZXQgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldFZhbHVlKG9mZnNldCkge1xuICAgIGNoZWNrT2Zmc2V0T3JMZW5ndGhWYWx1ZShvZmZzZXQsIHRydWUpO1xufVxuZXhwb3J0cy5jaGVja09mZnNldFZhbHVlID0gY2hlY2tPZmZzZXRWYWx1ZTtcbi8qKlxuICogQ2hlY2tzIGlmIGEgdGFyZ2V0IG9mZnNldCB2YWx1ZSBpcyBvdXQgb2YgYm91bmRzLiAoVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBjaGVjayBmYWlscylcbiAqXG4gKiBAcGFyYW0geyBOdW1iZXIgfSBvZmZzZXQgVGhlIG9mZnNldCB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7IFNtYXJ0QnVmZmVyIH0gYnVmZiBUaGUgU21hcnRCdWZmZXIgaW5zdGFuY2UgdG8gY2hlY2sgYWdhaW5zdC5cbiAqL1xuZnVuY3Rpb24gY2hlY2tUYXJnZXRPZmZzZXQob2Zmc2V0LCBidWZmKSB7XG4gICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmZi5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SUy5JTlZBTElEX1RBUkdFVF9PRkZTRVQpO1xuICAgIH1cbn1cbmV4cG9ydHMuY2hlY2tUYXJnZXRPZmZzZXQgPSBjaGVja1RhcmdldE9mZnNldDtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZ2l2ZW4gbnVtYmVyIGlzIGEgaW50ZWdlci5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWx1ZSkgJiYgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xufVxuLyoqXG4gKiBUaHJvd3MgaWYgTm9kZS5qcyB2ZXJzaW9uIGlzIHRvbyBsb3cgdG8gc3VwcG9ydCBiaWdpbnRcbiAqL1xuZnVuY3Rpb24gYmlnSW50QW5kQnVmZmVySW50NjRDaGVjayhidWZmZXJNZXRob2QpIHtcbiAgICBpZiAodHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IEpTIEJpZ0ludCB0eXBlLicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGJ1ZmZlcl8xLkJ1ZmZlci5wcm90b3R5cGVbYnVmZmVyTWV0aG9kXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IEJ1ZmZlci5wcm90b3R5cGUuJHtidWZmZXJNZXRob2R9LmApO1xuICAgIH1cbn1cbmV4cG9ydHMuYmlnSW50QW5kQnVmZmVySW50NjRDaGVjayA9IGJpZ0ludEFuZEJ1ZmZlckludDY0Q2hlY2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Tb2Nrc1Byb3h5QWdlbnQgPSB2b2lkIDA7XG5jb25zdCBzb2Nrc18xID0gcmVxdWlyZShcInNvY2tzXCIpO1xuY29uc3QgYWdlbnRfYmFzZV8xID0gcmVxdWlyZShcImFnZW50LWJhc2VcIik7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBkbnMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImRuc1wiKSk7XG5jb25zdCB0bHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInRsc1wiKSk7XG5jb25zdCB1cmxfMSA9IHJlcXVpcmUoXCJ1cmxcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdzb2Nrcy1wcm94eS1hZ2VudCcpO1xuZnVuY3Rpb24gcGFyc2VTb2Nrc1VSTCh1cmwpIHtcbiAgICBsZXQgbG9va3VwID0gZmFsc2U7XG4gICAgbGV0IHR5cGUgPSA1O1xuICAgIGNvbnN0IGhvc3QgPSB1cmwuaG9zdG5hbWU7XG4gICAgLy8gRnJvbSBSRkMgMTkyOCwgU2VjdGlvbiAzOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTkyOCNzZWN0aW9uLTNcbiAgICAvLyBcIlRoZSBTT0NLUyBzZXJ2aWNlIGlzIGNvbnZlbnRpb25hbGx5IGxvY2F0ZWQgb24gVENQIHBvcnQgMTA4MFwiXG4gICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHVybC5wb3J0LCAxMCkgfHwgMTA4MDtcbiAgICAvLyBmaWd1cmUgb3V0IGlmIHdlIHdhbnQgc29ja3MgdjQgb3IgdjUsIGJhc2VkIG9uIHRoZSBcInByb3RvY29sXCIgdXNlZC5cbiAgICAvLyBEZWZhdWx0cyB0byA1LlxuICAgIHN3aXRjaCAodXJsLnByb3RvY29sLnJlcGxhY2UoJzonLCAnJykpIHtcbiAgICAgICAgY2FzZSAnc29ja3M0JzpcbiAgICAgICAgICAgIGxvb2t1cCA9IHRydWU7XG4gICAgICAgICAgICB0eXBlID0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBwYXNzIHRocm91Z2hcbiAgICAgICAgY2FzZSAnc29ja3M0YSc6XG4gICAgICAgICAgICB0eXBlID0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzb2NrczUnOlxuICAgICAgICAgICAgbG9va3VwID0gdHJ1ZTtcbiAgICAgICAgICAgIHR5cGUgPSA1O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIHBhc3MgdGhyb3VnaFxuICAgICAgICBjYXNlICdzb2Nrcyc6IC8vIG5vIHZlcnNpb24gc3BlY2lmaWVkLCBkZWZhdWx0IHRvIDVoXG4gICAgICAgICAgICB0eXBlID0gNTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzb2NrczVoJzpcbiAgICAgICAgICAgIHR5cGUgPSA1O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBBIFwic29ja3NcIiBwcm90b2NvbCBtdXN0IGJlIHNwZWNpZmllZCEgR290OiAke1N0cmluZyh1cmwucHJvdG9jb2wpfWApO1xuICAgIH1cbiAgICBjb25zdCBwcm94eSA9IHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgdHlwZSxcbiAgICB9O1xuICAgIGlmICh1cmwudXNlcm5hbWUpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3h5LCAndXNlcklkJywge1xuICAgICAgICAgICAgdmFsdWU6IGRlY29kZVVSSUNvbXBvbmVudCh1cmwudXNlcm5hbWUpLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodXJsLnBhc3N3b3JkICE9IG51bGwpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3h5LCAncGFzc3dvcmQnLCB7XG4gICAgICAgICAgICB2YWx1ZTogZGVjb2RlVVJJQ29tcG9uZW50KHVybC5wYXNzd29yZCksXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7IGxvb2t1cCwgcHJveHkgfTtcbn1cbmNsYXNzIFNvY2tzUHJveHlBZ2VudCBleHRlbmRzIGFnZW50X2Jhc2VfMS5BZ2VudCB7XG4gICAgY29uc3RydWN0b3IodXJpLCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICBjb25zdCB1cmwgPSB0eXBlb2YgdXJpID09PSAnc3RyaW5nJyA/IG5ldyB1cmxfMS5VUkwodXJpKSA6IHVyaTtcbiAgICAgICAgY29uc3QgeyBwcm94eSwgbG9va3VwIH0gPSBwYXJzZVNvY2tzVVJMKHVybCk7XG4gICAgICAgIHRoaXMuc2hvdWxkTG9va3VwID0gbG9va3VwO1xuICAgICAgICB0aGlzLnByb3h5ID0gcHJveHk7XG4gICAgICAgIHRoaXMudGltZW91dCA9IG9wdHM/LnRpbWVvdXQgPz8gbnVsbDtcbiAgICAgICAgdGhpcy5zb2NrZXRPcHRpb25zID0gb3B0cz8uc29ja2V0T3B0aW9ucyA/PyBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbml0aWF0ZXMgYSBTT0NLUyBjb25uZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgU09DS1MgcHJveHkgc2VydmVyLFxuICAgICAqIHdoaWNoIGluIHR1cm4gY29ubmVjdHMgdG8gdGhlIHNwZWNpZmllZCByZW1vdGUgaG9zdCBhbmQgcG9ydC5cbiAgICAgKi9cbiAgICBhc3luYyBjb25uZWN0KHJlcSwgb3B0cykge1xuICAgICAgICBjb25zdCB7IHNob3VsZExvb2t1cCwgcHJveHksIHRpbWVvdXQgfSA9IHRoaXM7XG4gICAgICAgIGlmICghb3B0cy5ob3N0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGBob3N0YCBkZWZpbmVkIScpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IGhvc3QgfSA9IG9wdHM7XG4gICAgICAgIGNvbnN0IHsgcG9ydCwgbG9va3VwOiBsb29rdXBGbiA9IGRucy5sb29rdXAgfSA9IG9wdHM7XG4gICAgICAgIGlmIChzaG91bGRMb29rdXApIHtcbiAgICAgICAgICAgIC8vIENsaWVudC1zaWRlIEROUyByZXNvbHV0aW9uIGZvciBcIjRcIiBhbmQgXCI1XCIgc29ja3MgcHJveHkgdmVyc2lvbnMuXG4gICAgICAgICAgICBob3N0ID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgcmVxdWVzdCdzIGN1c3RvbSBsb29rdXAsIGlmIG9uZSB3YXMgY29uZmlndXJlZDpcbiAgICAgICAgICAgICAgICBsb29rdXBGbihob3N0LCB7fSwgKGVyciwgcmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb2Nrc09wdHMgPSB7XG4gICAgICAgICAgICBwcm94eSxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgICAgICBwb3J0OiB0eXBlb2YgcG9ydCA9PT0gJ251bWJlcicgPyBwb3J0IDogcGFyc2VJbnQocG9ydCwgMTApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbW1hbmQ6ICdjb25uZWN0JyxcbiAgICAgICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGUgdHlwZSBzdXBwbGllZCBieSBzb2NrcyBmb3Igc29ja2V0X29wdGlvbnMgaXMgd2lkZXJcbiAgICAgICAgICAgIC8vIHRoYW4gbmVjZXNzYXJ5IHNpbmNlIHNvY2tzIHdpbGwgYWx3YXlzIG92ZXJyaWRlIHRoZSBob3N0IGFuZCBwb3J0XG4gICAgICAgICAgICBzb2NrZXRfb3B0aW9uczogdGhpcy5zb2NrZXRPcHRpb25zID8/IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY2xlYW51cCA9ICh0bHNTb2NrZXQpID0+IHtcbiAgICAgICAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgaWYgKHRsc1NvY2tldClcbiAgICAgICAgICAgICAgICB0bHNTb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICB9O1xuICAgICAgICBkZWJ1ZygnQ3JlYXRpbmcgc29ja3MgcHJveHkgY29ubmVjdGlvbjogJW8nLCBzb2Nrc09wdHMpO1xuICAgICAgICBjb25zdCB7IHNvY2tldCB9ID0gYXdhaXQgc29ja3NfMS5Tb2Nrc0NsaWVudC5jcmVhdGVDb25uZWN0aW9uKHNvY2tzT3B0cyk7XG4gICAgICAgIGRlYnVnKCdTdWNjZXNzZnVsbHkgY3JlYXRlZCBzb2NrcyBwcm94eSBjb25uZWN0aW9uJyk7XG4gICAgICAgIGlmICh0aW1lb3V0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzb2NrZXQuc2V0VGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIHNvY2tldC5vbigndGltZW91dCcsICgpID0+IGNsZWFudXAoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuc2VjdXJlRW5kcG9pbnQpIHtcbiAgICAgICAgICAgIC8vIFRoZSBwcm94eSBpcyBjb25uZWN0aW5nIHRvIGEgVExTIHNlcnZlciwgc28gdXBncmFkZVxuICAgICAgICAgICAgLy8gdGhpcyBzb2NrZXQgY29ubmVjdGlvbiB0byBhIFRMUyBjb25uZWN0aW9uLlxuICAgICAgICAgICAgZGVidWcoJ1VwZ3JhZGluZyBzb2NrZXQgY29ubmVjdGlvbiB0byBUTFMnKTtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZlcm5hbWUgPSBvcHRzLnNlcnZlcm5hbWUgfHwgb3B0cy5ob3N0O1xuICAgICAgICAgICAgY29uc3QgdGxzU29ja2V0ID0gdGxzLmNvbm5lY3Qoe1xuICAgICAgICAgICAgICAgIC4uLm9taXQob3B0cywgJ2hvc3QnLCAncGF0aCcsICdwb3J0JyksXG4gICAgICAgICAgICAgICAgc29ja2V0LFxuICAgICAgICAgICAgICAgIHNlcnZlcm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRsc1NvY2tldC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnKCdTb2NrZXQgVExTIGVycm9yJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY2xlYW51cCh0bHNTb2NrZXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGxzU29ja2V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb2NrZXQ7XG4gICAgfVxufVxuU29ja3NQcm94eUFnZW50LnByb3RvY29scyA9IFtcbiAgICAnc29ja3MnLFxuICAgICdzb2NrczQnLFxuICAgICdzb2NrczRhJyxcbiAgICAnc29ja3M1JyxcbiAgICAnc29ja3M1aCcsXG5dO1xuZXhwb3J0cy5Tb2Nrc1Byb3h5QWdlbnQgPSBTb2Nrc1Byb3h5QWdlbnQ7XG5mdW5jdGlvbiBvbWl0KG9iaiwgLi4ua2V5cykge1xuICAgIGNvbnN0IHJldCA9IHt9O1xuICAgIGxldCBrZXk7XG4gICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmICgha2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICByZXRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Tb2Nrc0NsaWVudEVycm9yID0gZXhwb3J0cy5Tb2Nrc0NsaWVudCA9IHZvaWQgMDtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcImV2ZW50c1wiKTtcbmNvbnN0IG5ldCA9IHJlcXVpcmUoXCJuZXRcIik7XG5jb25zdCBzbWFydF9idWZmZXJfMSA9IHJlcXVpcmUoXCJzbWFydC1idWZmZXJcIik7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vY29uc3RhbnRzXCIpO1xuY29uc3QgaGVscGVyc18xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9oZWxwZXJzXCIpO1xuY29uc3QgcmVjZWl2ZWJ1ZmZlcl8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9yZWNlaXZlYnVmZmVyXCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi91dGlsXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU29ja3NDbGllbnRFcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3I7IH0gfSk7XG5jb25zdCBpcF9hZGRyZXNzXzEgPSByZXF1aXJlKFwiaXAtYWRkcmVzc1wiKTtcbmNsYXNzIFNvY2tzQ2xpZW50IGV4dGVuZHMgZXZlbnRzXzEuRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgICAgICAvLyBWYWxpZGF0ZSBTb2Nrc0NsaWVudE9wdGlvbnNcbiAgICAgICAgKDAsIGhlbHBlcnNfMS52YWxpZGF0ZVNvY2tzQ2xpZW50T3B0aW9ucykob3B0aW9ucyk7XG4gICAgICAgIC8vIERlZmF1bHQgc3RhdGVcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkNyZWF0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNPQ0tTIGNvbm5lY3Rpb24uXG4gICAgICpcbiAgICAgKiBOb3RlOiBTdXBwb3J0cyBjYWxsYmFja3MgYW5kIHByb21pc2VzLiBPbmx5IHN1cHBvcnRzIHRoZSBjb25uZWN0IGNvbW1hbmQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgeyBTb2Nrc0NsaWVudE9wdGlvbnMgfSBPcHRpb25zLlxuICAgICAqIEBwYXJhbSBjYWxsYmFjayB7IEZ1bmN0aW9uIH0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMgeyBQcm9taXNlIH1cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlQ29ubmVjdGlvbihvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLy8gVmFsaWRhdGUgU29ja3NDbGllbnRPcHRpb25zXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICgwLCBoZWxwZXJzXzEudmFsaWRhdGVTb2Nrc0NsaWVudE9wdGlvbnMpKG9wdGlvbnMsIFsnY29ubmVjdCddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGVycik7IC8vIFJlc29sdmVzIHBlbmRpbmcgcHJvbWlzZSAocHJldmVudHMgbWVtb3J5IGxlYWtzKS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjbGllbnQgPSBuZXcgU29ja3NDbGllbnQob3B0aW9ucyk7XG4gICAgICAgICAgICBjbGllbnQuY29ubmVjdChvcHRpb25zLmV4aXN0aW5nX3NvY2tldCk7XG4gICAgICAgICAgICBjbGllbnQub25jZSgnZXN0YWJsaXNoZWQnLCAoaW5mbykgPT4ge1xuICAgICAgICAgICAgICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGluZm8pO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGluZm8pOyAvLyBSZXNvbHZlcyBwZW5kaW5nIHByb21pc2UgKHByZXZlbnRzIG1lbW9yeSBsZWFrcykuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGluZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gRXJyb3Igb2NjdXJyZWQsIGZhaWxlZCB0byBlc3RhYmxpc2ggY29ubmVjdGlvbi5cbiAgICAgICAgICAgIGNsaWVudC5vbmNlKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBjbGllbnQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGVycik7IC8vIFJlc29sdmVzIHBlbmRpbmcgcHJvbWlzZSAocHJldmVudHMgbWVtb3J5IGxlYWtzKS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTT0NLUyBjb25uZWN0aW9uIGNoYWluIHRvIGEgZGVzdGluYXRpb24gaG9zdCB0aHJvdWdoIDIgb3IgbW9yZSBTT0NLUyBwcm94aWVzLlxuICAgICAqXG4gICAgICogTm90ZTogU3VwcG9ydHMgY2FsbGJhY2tzIGFuZCBwcm9taXNlcy4gT25seSBzdXBwb3J0cyB0aGUgY29ubmVjdCBtZXRob2QuXG4gICAgICogTm90ZTogSW1wbGVtZW50ZWQgdmlhIGNyZWF0ZUNvbm5lY3Rpb24oKSBmYWN0b3J5IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIHsgU29ja3NDbGllbnRDaGFpbk9wdGlvbnMgfSBPcHRpb25zXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIHsgRnVuY3Rpb24gfSBBbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7IFByb21pc2UgfVxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVDb25uZWN0aW9uQ2hhaW4ob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIFZhbGlkYXRlIFNvY2tzQ2xpZW50Q2hhaW5PcHRpb25zXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICgwLCBoZWxwZXJzXzEudmFsaWRhdGVTb2Nrc0NsaWVudENoYWluT3B0aW9ucykob3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShlcnIpOyAvLyBSZXNvbHZlcyBwZW5kaW5nIHByb21pc2UgKHByZXZlbnRzIG1lbW9yeSBsZWFrcykuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2h1ZmZsZSBwcm94aWVzXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yYW5kb21pemVDaGFpbikge1xuICAgICAgICAgICAgICAgICgwLCB1dGlsXzEuc2h1ZmZsZUFycmF5KShvcHRpb25zLnByb3hpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgc29jaztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMucHJveGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0UHJveHkgPSBvcHRpb25zLnByb3hpZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3ZlIHJlYWNoZWQgdGhlIGxhc3QgcHJveHkgaW4gdGhlIGNoYWluLCB0aGUgZGVzdGluYXRpb24gaXMgdGhlIGFjdHVhbCBkZXN0aW5hdGlvbiwgb3RoZXJ3aXNlIGl0J3MgdGhlIG5leHQgcHJveHkuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHREZXN0aW5hdGlvbiA9IGkgPT09IG9wdGlvbnMucHJveGllcy5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbnMuZGVzdGluYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IG9wdGlvbnMucHJveGllc1tpICsgMV0uaG9zdCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByb3hpZXNbaSArIDFdLmlwYWRkcmVzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0OiBvcHRpb25zLnByb3hpZXNbaSArIDFdLnBvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGVzIHRoZSBuZXh0IGNvbm5lY3Rpb24gaW4gdGhlIGNoYWluLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCBTb2Nrc0NsaWVudC5jcmVhdGVDb25uZWN0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdjb25uZWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5OiBuZXh0UHJveHksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogbmV4dERlc3RpbmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmdfc29ja2V0OiBzb2NrLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgc29jayBpcyB1bmRlZmluZWQsIGFzc2lnbiBpdCBoZXJlLlxuICAgICAgICAgICAgICAgICAgICBzb2NrID0gc29jayB8fCByZXN1bHQuc29ja2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHsgc29ja2V0OiBzb2NrIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgc29ja2V0OiBzb2NrIH0pOyAvLyBSZXNvbHZlcyBwZW5kaW5nIHByb21pc2UgKHByZXZlbnRzIG1lbW9yeSBsZWFrcykuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgc29ja2V0OiBzb2NrIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXJyKTsgLy8gUmVzb2x2ZXMgcGVuZGluZyBwcm9taXNlIChwcmV2ZW50cyBtZW1vcnkgbGVha3MpLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBTT0NLUyBVRFAgRnJhbWUuXG4gICAgICogQHBhcmFtIG9wdGlvbnNcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlVURQRnJhbWUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBidWZmID0gbmV3IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyKCk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50MTZCRSgwKTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KG9wdGlvbnMuZnJhbWVOdW1iZXIgfHwgMCk7XG4gICAgICAgIC8vIElQdjQvSVB2Ni9Ib3N0bmFtZVxuICAgICAgICBpZiAobmV0LmlzSVB2NChvcHRpb25zLnJlbW90ZUhvc3QuaG9zdCkpIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY0KTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50MzJCRSgoMCwgaGVscGVyc18xLmlwdjRUb0ludDMyKShvcHRpb25zLnJlbW90ZUhvc3QuaG9zdCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5ldC5pc0lQdjYob3B0aW9ucy5yZW1vdGVIb3N0Lmhvc3QpKSB7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2Nik7XG4gICAgICAgICAgICBidWZmLndyaXRlQnVmZmVyKCgwLCBoZWxwZXJzXzEuaXBUb0J1ZmZlcikob3B0aW9ucy5yZW1vdGVIb3N0Lmhvc3QpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5Ib3N0bmFtZSk7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoQnVmZmVyLmJ5dGVMZW5ndGgob3B0aW9ucy5yZW1vdGVIb3N0Lmhvc3QpKTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVTdHJpbmcob3B0aW9ucy5yZW1vdGVIb3N0Lmhvc3QpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBvcnRcbiAgICAgICAgYnVmZi53cml0ZVVJbnQxNkJFKG9wdGlvbnMucmVtb3RlSG9zdC5wb3J0KTtcbiAgICAgICAgLy8gRGF0YVxuICAgICAgICBidWZmLndyaXRlQnVmZmVyKG9wdGlvbnMuZGF0YSk7XG4gICAgICAgIHJldHVybiBidWZmLnRvQnVmZmVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIFNPQ0tTIFVEUCBmcmFtZS5cbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZVVEUEZyYW1lKGRhdGEpIHtcbiAgICAgICAgY29uc3QgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIoZGF0YSk7XG4gICAgICAgIGJ1ZmYucmVhZE9mZnNldCA9IDI7XG4gICAgICAgIGNvbnN0IGZyYW1lTnVtYmVyID0gYnVmZi5yZWFkVUludDgoKTtcbiAgICAgICAgY29uc3QgaG9zdFR5cGUgPSBidWZmLnJlYWRVSW50OCgpO1xuICAgICAgICBsZXQgcmVtb3RlSG9zdDtcbiAgICAgICAgaWYgKGhvc3RUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY0KSB7XG4gICAgICAgICAgICByZW1vdGVIb3N0ID0gKDAsIGhlbHBlcnNfMS5pbnQzMlRvSXB2NCkoYnVmZi5yZWFkVUludDMyQkUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaG9zdFR5cGUgPT09IGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLklQdjYpIHtcbiAgICAgICAgICAgIHJlbW90ZUhvc3QgPSBpcF9hZGRyZXNzXzEuQWRkcmVzczYuZnJvbUJ5dGVBcnJheShBcnJheS5mcm9tKGJ1ZmYucmVhZEJ1ZmZlcigxNikpKS5jYW5vbmljYWxGb3JtKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW1vdGVIb3N0ID0gYnVmZi5yZWFkU3RyaW5nKGJ1ZmYucmVhZFVJbnQ4KCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbW90ZVBvcnQgPSBidWZmLnJlYWRVSW50MTZCRSgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZnJhbWVOdW1iZXIsXG4gICAgICAgICAgICByZW1vdGVIb3N0OiB7XG4gICAgICAgICAgICAgICAgaG9zdDogcmVtb3RlSG9zdCxcbiAgICAgICAgICAgICAgICBwb3J0OiByZW1vdGVQb3J0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGE6IGJ1ZmYucmVhZEJ1ZmZlcigpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBzdGF0ZSBzZXR0ZXIuIElmIHRoZSBTb2Nrc0NsaWVudCBpcyBpbiBhbiBlcnJvciBzdGF0ZSwgaXQgY2Fubm90IGJlIGNoYW5nZWQgdG8gYSBub24gZXJyb3Igc3RhdGUuXG4gICAgICovXG4gICAgc2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgdGhlIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCB0byB0aGUgcHJveHkgYW5kIGRlc3RpbmF0aW9uLlxuICAgICAqIEBwYXJhbSBleGlzdGluZ1NvY2tldCBDb25uZWN0ZWQgc29ja2V0IHRvIHVzZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZSAoaW50ZXJuYWwgdXNlKS5cbiAgICAgKi9cbiAgICBjb25uZWN0KGV4aXN0aW5nU29ja2V0KSB7XG4gICAgICAgIHRoaXMub25EYXRhUmVjZWl2ZWQgPSAoZGF0YSkgPT4gdGhpcy5vbkRhdGFSZWNlaXZlZEhhbmRsZXIoZGF0YSk7XG4gICAgICAgIHRoaXMub25DbG9zZSA9ICgpID0+IHRoaXMub25DbG9zZUhhbmRsZXIoKTtcbiAgICAgICAgdGhpcy5vbkVycm9yID0gKGVycikgPT4gdGhpcy5vbkVycm9ySGFuZGxlcihlcnIpO1xuICAgICAgICB0aGlzLm9uQ29ubmVjdCA9ICgpID0+IHRoaXMub25Db25uZWN0SGFuZGxlcigpO1xuICAgICAgICAvLyBTdGFydCB0aW1lb3V0IHRpbWVyIChkZWZhdWx0cyB0byAzMCBzZWNvbmRzKVxuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbkVzdGFibGlzaGVkVGltZW91dCgpLCB0aGlzLm9wdGlvbnMudGltZW91dCB8fCBjb25zdGFudHNfMS5ERUZBVUxUX1RJTUVPVVQpO1xuICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHVucmVmIGlzIGF2YWlsYWJsZSBhcyBpdCBkaWZmZXJzIGZyb20gYnJvd3NlciB0byBOb2RlSlMgKCMzMylcbiAgICAgICAgaWYgKHRpbWVyLnVucmVmICYmIHR5cGVvZiB0aW1lci51bnJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGltZXIudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBhbiBleGlzdGluZyBzb2NrZXQgaXMgcHJvdmlkZWQsIHVzZSBpdCB0byBuZWdvdGlhdGUgU09DS1MgaGFuZHNoYWtlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IFNvY2tldC5cbiAgICAgICAgaWYgKGV4aXN0aW5nU29ja2V0KSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldCA9IGV4aXN0aW5nU29ja2V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgbmV0LlNvY2tldCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEF0dGFjaCBTb2NrZXQgZXJyb3IgaGFuZGxlcnMuXG4gICAgICAgIHRoaXMuc29ja2V0Lm9uY2UoJ2Nsb3NlJywgdGhpcy5vbkNsb3NlKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25jZSgnZXJyb3InLCB0aGlzLm9uRXJyb3IpO1xuICAgICAgICB0aGlzLnNvY2tldC5vbmNlKCdjb25uZWN0JywgdGhpcy5vbkNvbm5lY3QpO1xuICAgICAgICB0aGlzLnNvY2tldC5vbignZGF0YScsIHRoaXMub25EYXRhUmVjZWl2ZWQpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuQ29ubmVjdGluZyk7XG4gICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlciA9IG5ldyByZWNlaXZlYnVmZmVyXzEuUmVjZWl2ZUJ1ZmZlcigpO1xuICAgICAgICBpZiAoZXhpc3RpbmdTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ2Nvbm5lY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmNvbm5lY3QodGhpcy5nZXRTb2NrZXRPcHRpb25zKCkpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZXRfdGNwX25vZGVsYXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zZXRfdGNwX25vZGVsYXkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZXROb0RlbGF5KCEhdGhpcy5vcHRpb25zLnNldF90Y3Bfbm9kZWxheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGlzdGVuIGZvciBlc3RhYmxpc2hlZCBldmVudCBzbyB3ZSBjYW4gcmUtZW1pdCBhbnkgZXhjZXNzIGRhdGEgcmVjZWl2ZWQgZHVyaW5nIGhhbmRzaGFrZXMuXG4gICAgICAgIHRoaXMucHJlcGVuZE9uY2VMaXN0ZW5lcignZXN0YWJsaXNoZWQnLCAoaW5mbykgPT4ge1xuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhjZXNzRGF0YSA9IHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQodGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIGluZm8uc29ja2V0LmVtaXQoJ2RhdGEnLCBleGNlc3NEYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5mby5zb2NrZXQucmVzdW1lKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFNvY2tldCBvcHRpb25zIChkZWZhdWx0cyBob3N0L3BvcnQgdG8gb3B0aW9ucy5wcm94eS5ob3N0L29wdGlvbnMucHJveHkucG9ydClcbiAgICBnZXRTb2NrZXRPcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMuc29ja2V0X29wdGlvbnMpLCB7IGhvc3Q6IHRoaXMub3B0aW9ucy5wcm94eS5ob3N0IHx8IHRoaXMub3B0aW9ucy5wcm94eS5pcGFkZHJlc3MsIHBvcnQ6IHRoaXMub3B0aW9ucy5wcm94eS5wb3J0IH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIGludGVybmFsIFNvY2tzIHRpbWVvdXQgY2FsbGJhY2suXG4gICAgICogTm90ZTogSWYgdGhlIFNvY2tzIGNsaWVudCBpcyBub3QgQm91bmRXYWl0aW5nRm9yQ29ubmVjdGlvbiBvciBFc3RhYmxpc2hlZCwgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQuXG4gICAgICovXG4gICAgb25Fc3RhYmxpc2hlZFRpbWVvdXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkVzdGFibGlzaGVkICYmXG4gICAgICAgICAgICB0aGlzLnN0YXRlICE9PSBjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkJvdW5kV2FpdGluZ0ZvckNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoY29uc3RhbnRzXzEuRVJST1JTLlByb3h5Q29ubmVjdGlvblRpbWVkT3V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIFNvY2tldCBjb25uZWN0IGV2ZW50LlxuICAgICAqL1xuICAgIG9uQ29ubmVjdEhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Db25uZWN0ZWQpO1xuICAgICAgICAvLyBTZW5kIGluaXRpYWwgaGFuZHNoYWtlLlxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5LnR5cGUgPT09IDQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZFNvY2tzNEluaXRpYWxIYW5kc2hha2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZFNvY2tzNUluaXRpYWxIYW5kc2hha2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEluaXRpYWxIYW5kc2hha2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIFNvY2tldCBkYXRhIGV2ZW50LlxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgb25EYXRhUmVjZWl2ZWRIYW5kbGVyKGRhdGEpIHtcbiAgICAgICAgLypcbiAgICAgICAgICBBbGwgcmVjZWl2ZWQgZGF0YSBpcyBhcHBlbmRlZCB0byBhIFJlY2VpdmVCdWZmZXIuXG4gICAgICAgICAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgYWxsIHRoZSBkYXRhIHdlIG5lZWQgaXMgcmVjZWl2ZWQgYmVmb3JlIHdlIGF0dGVtcHQgdG8gcHJvY2VzcyBpdC5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZWNlaXZlQnVmZmVyLmFwcGVuZChkYXRhKTtcbiAgICAgICAgLy8gUHJvY2VzcyBkYXRhIHRoYXQgd2UgaGF2ZS5cbiAgICAgICAgdGhpcy5wcm9jZXNzRGF0YSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHByb2Nlc3Npbmcgb2YgdGhlIGRhdGEgd2UgaGF2ZSByZWNlaXZlZC5cbiAgICAgKi9cbiAgICBwcm9jZXNzRGF0YSgpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSB0byBwcm9jZXNzIHRoZSBuZXh0IHN0ZXAgaW4gdGhlIFNPQ0tTIGhhbmRzaGFrZSwgcHJvY2VlZC5cbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhdGUgIT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXN0YWJsaXNoZWQgJiZcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgIT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXJyb3IgJiZcbiAgICAgICAgICAgIHRoaXMucmVjZWl2ZUJ1ZmZlci5sZW5ndGggPj0gdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplKSB7XG4gICAgICAgICAgICAvLyBTZW50IGluaXRpYWwgaGFuZHNoYWtlLCB3YWl0aW5nIGZvciByZXNwb25zZS5cbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLlNlbnRJbml0aWFsSGFuZHNoYWtlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wcm94eS50eXBlID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNvY2tzIHY0IG9ubHkgaGFzIG9uZSBoYW5kc2hha2UgcmVzcG9uc2UuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU29ja3M0RmluYWxIYW5kc2hha2VSZXNwb25zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU29ja3MgdjUgaGFzIHR3byBoYW5kc2hha2VzLCBoYW5kbGUgaW5pdGlhbCBvbmUgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbml0aWFsU29ja3M1SGFuZHNoYWtlUmVzcG9uc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2VudCBhdXRoIHJlcXVlc3QgZm9yIFNvY2tzIHY1LCB3YWl0aW5nIGZvciByZXNwb25zZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbml0aWFsU29ja3M1QXV0aGVudGljYXRpb25IYW5kc2hha2VSZXNwb25zZSgpO1xuICAgICAgICAgICAgICAgIC8vIFNlbnQgZmluYWwgU29ja3MgdjUgaGFuZHNoYWtlLCB3YWl0aW5nIGZvciBmaW5hbCByZXNwb25zZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEZpbmFsSGFuZHNoYWtlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTb2NrczVGaW5hbEhhbmRzaGFrZVJlc3BvbnNlKCk7XG4gICAgICAgICAgICAgICAgLy8gU29ja3MgQklORCBlc3RhYmxpc2hlZC4gV2FpdGluZyBmb3IgcmVtb3RlIGNvbm5lY3Rpb24gdmlhIHByb3h5LlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Cb3VuZFdhaXRpbmdGb3JDb25uZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wcm94eS50eXBlID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU29ja3M0SW5jb21pbmdDb25uZWN0aW9uUmVzcG9uc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU29ja3M1SW5jb21pbmdDb25uZWN0aW9uUmVzcG9uc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGNvbnN0YW50c18xLkVSUk9SUy5JbnRlcm5hbEVycm9yKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIFNvY2tldCBjbG9zZSBldmVudC5cbiAgICAgKiBAcGFyYW0gaGFkX2Vycm9yXG4gICAgICovXG4gICAgb25DbG9zZUhhbmRsZXIoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VTb2NrZXQoY29uc3RhbnRzXzEuRVJST1JTLlNvY2tldENsb3NlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja2V0IGVycm9yIGV2ZW50LlxuICAgICAqIEBwYXJhbSBlcnJcbiAgICAgKi9cbiAgICBvbkVycm9ySGFuZGxlcihlcnIpIHtcbiAgICAgICAgdGhpcy5jbG9zZVNvY2tldChlcnIubWVzc2FnZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgaW50ZXJuYWwgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSB1bmRlcmx5aW5nIFNvY2tldC5cbiAgICAgKi9cbiAgICByZW1vdmVJbnRlcm5hbFNvY2tldEhhbmRsZXJzKCkge1xuICAgICAgICAvLyBQYXVzZXMgZGF0YSBmbG93IG9mIHRoZSBzb2NrZXQgKHRoaXMgaXMgaW50ZXJuYWxseSByZXN1bWVkIGFmdGVyICdlc3RhYmxpc2hlZCcgaXMgZW1pdHRlZClcbiAgICAgICAgdGhpcy5zb2NrZXQucGF1c2UoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCB0aGlzLm9uRGF0YVJlY2VpdmVkKTtcbiAgICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy5vbkNsb3NlKTtcbiAgICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5vbkVycm9yKTtcbiAgICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Nvbm5lY3QnLCB0aGlzLm9uQ29ubmVjdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb3NlcyBhbmQgZGVzdHJveXMgdGhlIHVuZGVybHlpbmcgU29ja2V0LiBFbWl0cyBhbiBlcnJvciBldmVudC5cbiAgICAgKiBAcGFyYW0gZXJyIHsgU3RyaW5nIH0gQW4gZXJyb3Igc3RyaW5nIHRvIGluY2x1ZGUgaW4gZXJyb3IgZXZlbnQuXG4gICAgICovXG4gICAgY2xvc2VTb2NrZXQoZXJyKSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSBvbmx5IG9uZSAnZXJyb3InIGV2ZW50IGlzIGZpcmVkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhpcyBTb2Nrc0NsaWVudCBpbnN0YW5jZS5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFNldCBpbnRlcm5hbCBzdGF0ZSB0byBFcnJvci5cbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5FcnJvcik7XG4gICAgICAgICAgICAvLyBEZXN0cm95IFNvY2tldFxuICAgICAgICAgICAgdGhpcy5zb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGludGVybmFsIGxpc3RlbmVyc1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVJbnRlcm5hbFNvY2tldEhhbmRsZXJzKCk7XG4gICAgICAgICAgICAvLyBGaXJlICdlcnJvcicgZXZlbnQuXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGVyciwgdGhpcy5vcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgaW5pdGlhbCBTb2NrcyB2NCBoYW5kc2hha2UgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBzZW5kU29ja3M0SW5pdGlhbEhhbmRzaGFrZSgpIHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gdGhpcy5vcHRpb25zLnByb3h5LnVzZXJJZCB8fCAnJztcbiAgICAgICAgY29uc3QgYnVmZiA9IG5ldyBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlcigpO1xuICAgICAgICBidWZmLndyaXRlVUludDgoMHgwNCk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OChjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmRbdGhpcy5vcHRpb25zLmNvbW1hbmRdKTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQxNkJFKHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbi5wb3J0KTtcbiAgICAgICAgLy8gU29ja3MgNCAoSVB2NClcbiAgICAgICAgaWYgKG5ldC5pc0lQdjQodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpKSB7XG4gICAgICAgICAgICBidWZmLndyaXRlQnVmZmVyKCgwLCBoZWxwZXJzXzEuaXBUb0J1ZmZlcikodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpKTtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVTdHJpbmdOVCh1c2VySWQpO1xuICAgICAgICAgICAgLy8gU29ja3MgNGEgKGhvc3RuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KDB4MDApO1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KDB4MDApO1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KDB4MDApO1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KDB4MDEpO1xuICAgICAgICAgICAgYnVmZi53cml0ZVN0cmluZ05UKHVzZXJJZCk7XG4gICAgICAgICAgICBidWZmLndyaXRlU3RyaW5nTlQodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9XG4gICAgICAgICAgICBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M0UmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc29ja2V0LndyaXRlKGJ1ZmYudG9CdWZmZXIoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja3MgdjQgaGFuZHNoYWtlIHJlc3BvbnNlLlxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgaGFuZGxlU29ja3M0RmluYWxIYW5kc2hha2VSZXNwb25zZSgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoOCk7XG4gICAgICAgIGlmIChkYXRhWzFdICE9PSBjb25zdGFudHNfMS5Tb2NrczRSZXNwb25zZS5HcmFudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGAke2NvbnN0YW50c18xLkVSUk9SUy5Tb2NrczRQcm94eVJlamVjdGVkQ29ubmVjdGlvbn0gLSAoJHtjb25zdGFudHNfMS5Tb2NrczRSZXNwb25zZVtkYXRhWzFdXX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBCaW5kIHJlc3BvbnNlXG4gICAgICAgICAgICBpZiAoY29uc3RhbnRzXzEuU29ja3NDb21tYW5kW3RoaXMub3B0aW9ucy5jb21tYW5kXSA9PT0gY29uc3RhbnRzXzEuU29ja3NDb21tYW5kLmJpbmQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBidWZmID0gc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIuZnJvbUJ1ZmZlcihkYXRhKTtcbiAgICAgICAgICAgICAgICBidWZmLnJlYWRPZmZzZXQgPSAyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbW90ZUhvc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJ1ZmYucmVhZFVJbnQxNkJFKCksXG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6ICgwLCBoZWxwZXJzXzEuaW50MzJUb0lwdjQpKGJ1ZmYucmVhZFVJbnQzMkJFKCkpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gSWYgaG9zdCBpcyAwLjAuMC4wLCBzZXQgdG8gcHJveHkgaG9zdC5cbiAgICAgICAgICAgICAgICBpZiAocmVtb3RlSG9zdC5ob3N0ID09PSAnMC4wLjAuMCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlSG9zdC5ob3N0ID0gdGhpcy5vcHRpb25zLnByb3h5LmlwYWRkcmVzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkJvdW5kV2FpdGluZ0ZvckNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYm91bmQnLCB7IHJlbW90ZUhvc3QsIHNvY2tldDogdGhpcy5zb2NrZXQgfSk7XG4gICAgICAgICAgICAgICAgLy8gQ29ubmVjdCByZXNwb25zZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkVzdGFibGlzaGVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUludGVybmFsU29ja2V0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2VzdGFibGlzaGVkJywgeyBzb2NrZXQ6IHRoaXMuc29ja2V0IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja3MgdjQgaW5jb21pbmcgY29ubmVjdGlvbiByZXF1ZXN0IChCSU5EKVxuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgaGFuZGxlU29ja3M0SW5jb21pbmdDb25uZWN0aW9uUmVzcG9uc2UoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlY2VpdmVCdWZmZXIuZ2V0KDgpO1xuICAgICAgICBpZiAoZGF0YVsxXSAhPT0gY29uc3RhbnRzXzEuU29ja3M0UmVzcG9uc2UuR3JhbnRlZCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVNvY2tldChgJHtjb25zdGFudHNfMS5FUlJPUlMuU29ja3M0UHJveHlSZWplY3RlZEluY29taW5nQm91bmRDb25uZWN0aW9ufSAtICgke2NvbnN0YW50c18xLlNvY2tzNFJlc3BvbnNlW2RhdGFbMV1dfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmYgPSBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlci5mcm9tQnVmZmVyKGRhdGEpO1xuICAgICAgICAgICAgYnVmZi5yZWFkT2Zmc2V0ID0gMjtcbiAgICAgICAgICAgIGNvbnN0IHJlbW90ZUhvc3QgPSB7XG4gICAgICAgICAgICAgICAgcG9ydDogYnVmZi5yZWFkVUludDE2QkUoKSxcbiAgICAgICAgICAgICAgICBob3N0OiAoMCwgaGVscGVyc18xLmludDMyVG9JcHY0KShidWZmLnJlYWRVSW50MzJCRSgpKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXN0YWJsaXNoZWQpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVJbnRlcm5hbFNvY2tldEhhbmRsZXJzKCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2VzdGFibGlzaGVkJywgeyByZW1vdGVIb3N0LCBzb2NrZXQ6IHRoaXMuc29ja2V0IH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGluaXRpYWwgU29ja3MgdjUgaGFuZHNoYWtlIHJlcXVlc3QuXG4gICAgICovXG4gICAgc2VuZFNvY2tzNUluaXRpYWxIYW5kc2hha2UoKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmYgPSBuZXcgc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIoKTtcbiAgICAgICAgLy8gQnkgZGVmYXVsdCB3ZSBhbHdheXMgc3VwcG9ydCBubyBhdXRoLlxuICAgICAgICBjb25zdCBzdXBwb3J0ZWRBdXRoTWV0aG9kcyA9IFtjb25zdGFudHNfMS5Tb2NrczVBdXRoLk5vQXV0aF07XG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IHRlbGwgdGhlIHByb3h5IHdlIHN1cHBvcnQgdXNlci9wYXNzIGF1dGggaWYgYXV0aCBpbmZvIGlzIGFjdHVhbGx5IHByb3ZpZGVkLlxuICAgICAgICAvLyBOb3RlOiBBcyBvZiBUb3IgdjAuMy41LjcrLCBpZiB1c2VyL3Bhc3MgYXV0aCBpcyBhbiBvcHRpb24gZnJvbSB0aGUgY2xpZW50LCBieSBkZWZhdWx0IGl0IHdpbGwgYWx3YXlzIHRha2UgcHJpb3JpdHkuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkudXNlcklkIHx8IHRoaXMub3B0aW9ucy5wcm94eS5wYXNzd29yZCkge1xuICAgICAgICAgICAgc3VwcG9ydGVkQXV0aE1ldGhvZHMucHVzaChjb25zdGFudHNfMS5Tb2NrczVBdXRoLlVzZXJQYXNzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDdXN0b20gYXV0aCBtZXRob2Q/XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN1cHBvcnRlZEF1dGhNZXRob2RzLnB1c2godGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX21ldGhvZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnVpbGQgaGFuZHNoYWtlIHBhY2tldFxuICAgICAgICBidWZmLndyaXRlVUludDgoMHgwNSk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OChzdXBwb3J0ZWRBdXRoTWV0aG9kcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGNvbnN0IGF1dGhNZXRob2Qgb2Ygc3VwcG9ydGVkQXV0aE1ldGhvZHMpIHtcbiAgICAgICAgICAgIGJ1ZmYud3JpdGVVSW50OChhdXRoTWV0aG9kKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPVxuICAgICAgICAgICAgY29uc3RhbnRzXzEuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTLlNvY2tzNUluaXRpYWxIYW5kc2hha2VSZXNwb25zZTtcbiAgICAgICAgdGhpcy5zb2NrZXQud3JpdGUoYnVmZi50b0J1ZmZlcigpKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLlNlbnRJbml0aWFsSGFuZHNoYWtlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBpbml0aWFsIFNvY2tzIHY1IGhhbmRzaGFrZSByZXNwb25zZS5cbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqL1xuICAgIGhhbmRsZUluaXRpYWxTb2NrczVIYW5kc2hha2VSZXNwb25zZSgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoMik7XG4gICAgICAgIGlmIChkYXRhWzBdICE9PSAweDA1KSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3M1SW50aWFpbEhhbmRzaGFrZVNvY2tzVmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGF0YVsxXSA9PT0gY29uc3RhbnRzXzEuU09DS1M1X05PX0FDQ0VQVEFCTEVfQVVUSCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVNvY2tldChjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzNUluaXRpYWxIYW5kc2hha2VOb0FjY2VwdGVkQXV0aFR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgc2VsZWN0ZWQgU29ja3MgdjUgYXV0aCBtZXRob2QgaXMgbm8gYXV0aCwgc2VuZCBmaW5hbCBoYW5kc2hha2UgcmVxdWVzdC5cbiAgICAgICAgICAgIGlmIChkYXRhWzFdID09PSBjb25zdGFudHNfMS5Tb2NrczVBdXRoLk5vQXV0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja3M1Q2hvc2VuQXV0aFR5cGUgPSBjb25zdGFudHNfMS5Tb2NrczVBdXRoLk5vQXV0aDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRTb2NrczVDb21tYW5kUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIC8vIElmIHNlbGVjdGVkIFNvY2tzIHY1IGF1dGggbWV0aG9kIGlzIHVzZXIvcGFzc3dvcmQsIHNlbmQgYXV0aCBoYW5kc2hha2UuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkYXRhWzFdID09PSBjb25zdGFudHNfMS5Tb2NrczVBdXRoLlVzZXJQYXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrczVDaG9zZW5BdXRoVHlwZSA9IGNvbnN0YW50c18xLlNvY2tzNUF1dGguVXNlclBhc3M7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kU29ja3M1VXNlclBhc3NBdXRoZW50aWNhdGlvbigpO1xuICAgICAgICAgICAgICAgIC8vIElmIHNlbGVjdGVkIFNvY2tzIHY1IGF1dGggbWV0aG9kIGlzIHRoZSBjdXN0b21fYXV0aF9tZXRob2QsIHNlbmQgY3VzdG9tIGhhbmRzaGFrZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRhdGFbMV0gPT09IHRoaXMub3B0aW9ucy5wcm94eS5jdXN0b21fYXV0aF9tZXRob2QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tzNUNob3NlbkF1dGhUeXBlID0gdGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX21ldGhvZDtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRTb2NrczVDdXN0b21BdXRoZW50aWNhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVNvY2tldChjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzNUluaXRpYWxIYW5kc2hha2VVbmtub3duQXV0aFR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIFNvY2tzIHY1IHVzZXIgJiBwYXNzd29yZCBhdXRoIGhhbmRzaGFrZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IE5vIGF1dGggYW5kIHVzZXIvcGFzcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAgICAgKi9cbiAgICBzZW5kU29ja3M1VXNlclBhc3NBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgY29uc3QgdXNlcklkID0gdGhpcy5vcHRpb25zLnByb3h5LnVzZXJJZCB8fCAnJztcbiAgICAgICAgY29uc3QgcGFzc3dvcmQgPSB0aGlzLm9wdGlvbnMucHJveHkucGFzc3dvcmQgfHwgJyc7XG4gICAgICAgIGNvbnN0IGJ1ZmYgPSBuZXcgc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIoKTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KDB4MDEpO1xuICAgICAgICBidWZmLndyaXRlVUludDgoQnVmZmVyLmJ5dGVMZW5ndGgodXNlcklkKSk7XG4gICAgICAgIGJ1ZmYud3JpdGVTdHJpbmcodXNlcklkKTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KEJ1ZmZlci5ieXRlTGVuZ3RoKHBhc3N3b3JkKSk7XG4gICAgICAgIGJ1ZmYud3JpdGVTdHJpbmcocGFzc3dvcmQpO1xuICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPVxuICAgICAgICAgICAgY29uc3RhbnRzXzEuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTLlNvY2tzNVVzZXJQYXNzQXV0aGVudGljYXRpb25SZXNwb25zZTtcbiAgICAgICAgdGhpcy5zb2NrZXQud3JpdGUoYnVmZi50b0J1ZmZlcigpKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLlNlbnRBdXRoZW50aWNhdGlvbik7XG4gICAgfVxuICAgIHNlbmRTb2NrczVDdXN0b21BdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX3Jlc3BvbnNlX3NpemU7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC53cml0ZSh5aWVsZCB0aGlzLm9wdGlvbnMucHJveHkuY3VzdG9tX2F1dGhfcmVxdWVzdF9oYW5kbGVyKCkpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLlNlbnRBdXRoZW50aWNhdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoYW5kbGVTb2NrczVDdXN0b21BdXRoSGFuZHNoYWtlUmVzcG9uc2UoZGF0YSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMub3B0aW9ucy5wcm94eS5jdXN0b21fYXV0aF9yZXNwb25zZV9oYW5kbGVyKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGFuZGxlU29ja3M1QXV0aGVudGljYXRpb25Ob0F1dGhIYW5kc2hha2VSZXNwb25zZShkYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YVsxXSA9PT0gMHgwMDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhbmRsZVNvY2tzNUF1dGhlbnRpY2F0aW9uVXNlclBhc3NIYW5kc2hha2VSZXNwb25zZShkYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YVsxXSA9PT0gMHgwMDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgU29ja3MgdjUgYXV0aCBoYW5kc2hha2UgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVJbml0aWFsU29ja3M1QXV0aGVudGljYXRpb25IYW5kc2hha2VSZXNwb25zZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5SZWNlaXZlZEF1dGhlbnRpY2F0aW9uUmVzcG9uc2UpO1xuICAgICAgICAgICAgbGV0IGF1dGhSZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvY2tzNUNob3NlbkF1dGhUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVBdXRoLk5vQXV0aCkge1xuICAgICAgICAgICAgICAgIGF1dGhSZXN1bHQgPSB5aWVsZCB0aGlzLmhhbmRsZVNvY2tzNUF1dGhlbnRpY2F0aW9uTm9BdXRoSGFuZHNoYWtlUmVzcG9uc2UodGhpcy5yZWNlaXZlQnVmZmVyLmdldCgyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNvY2tzNUNob3NlbkF1dGhUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVBdXRoLlVzZXJQYXNzKSB7XG4gICAgICAgICAgICAgICAgYXV0aFJlc3VsdCA9XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuaGFuZGxlU29ja3M1QXV0aGVudGljYXRpb25Vc2VyUGFzc0hhbmRzaGFrZVJlc3BvbnNlKHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoMikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zb2NrczVDaG9zZW5BdXRoVHlwZSA9PT0gdGhpcy5vcHRpb25zLnByb3h5LmN1c3RvbV9hdXRoX21ldGhvZCkge1xuICAgICAgICAgICAgICAgIGF1dGhSZXN1bHQgPSB5aWVsZCB0aGlzLmhhbmRsZVNvY2tzNUN1c3RvbUF1dGhIYW5kc2hha2VSZXNwb25zZSh0aGlzLnJlY2VpdmVCdWZmZXIuZ2V0KHRoaXMub3B0aW9ucy5wcm94eS5jdXN0b21fYXV0aF9yZXNwb25zZV9zaXplKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWF1dGhSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGNvbnN0YW50c18xLkVSUk9SUy5Tb2NrczVBdXRoZW50aWNhdGlvbkZhaWxlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRTb2NrczVDb21tYW5kUmVxdWVzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgU29ja3MgdjUgZmluYWwgaGFuZHNoYWtlIHJlcXVlc3QuXG4gICAgICovXG4gICAgc2VuZFNvY2tzNUNvbW1hbmRSZXF1ZXN0KCkge1xuICAgICAgICBjb25zdCBidWZmID0gbmV3IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyKCk7XG4gICAgICAgIGJ1ZmYud3JpdGVVSW50OCgweDA1KTtcbiAgICAgICAgYnVmZi53cml0ZVVJbnQ4KGNvbnN0YW50c18xLlNvY2tzQ29tbWFuZFt0aGlzLm9wdGlvbnMuY29tbWFuZF0pO1xuICAgICAgICBidWZmLndyaXRlVUludDgoMHgwMCk7XG4gICAgICAgIC8vIGlwdjQsIGlwdjYsIGRvbWFpbj9cbiAgICAgICAgaWYgKG5ldC5pc0lQdjQodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpKSB7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2NCk7XG4gICAgICAgICAgICBidWZmLndyaXRlQnVmZmVyKCgwLCBoZWxwZXJzXzEuaXBUb0J1ZmZlcikodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLmhvc3QpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuZXQuaXNJUHY2KHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbi5ob3N0KSkge1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLklQdjYpO1xuICAgICAgICAgICAgYnVmZi53cml0ZUJ1ZmZlcigoMCwgaGVscGVyc18xLmlwVG9CdWZmZXIpKHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbi5ob3N0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWZmLndyaXRlVUludDgoY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSG9zdG5hbWUpO1xuICAgICAgICAgICAgYnVmZi53cml0ZVVJbnQ4KHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbi5ob3N0Lmxlbmd0aCk7XG4gICAgICAgICAgICBidWZmLndyaXRlU3RyaW5nKHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbi5ob3N0KTtcbiAgICAgICAgfVxuICAgICAgICBidWZmLndyaXRlVUludDE2QkUodGhpcy5vcHRpb25zLmRlc3RpbmF0aW9uLnBvcnQpO1xuICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPVxuICAgICAgICAgICAgY29uc3RhbnRzXzEuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTLlNvY2tzNVJlc3BvbnNlSGVhZGVyO1xuICAgICAgICB0aGlzLnNvY2tldC53cml0ZShidWZmLnRvQnVmZmVyKCkpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuU2VudEZpbmFsSGFuZHNoYWtlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBTb2NrcyB2NSBmaW5hbCBoYW5kc2hha2UgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBoYW5kbGVTb2NrczVGaW5hbEhhbmRzaGFrZVJlc3BvbnNlKCkge1xuICAgICAgICAvLyBQZWVrIGF0IGF2YWlsYWJsZSBkYXRhICh3ZSBuZWVkIGF0IGxlYXN0IDUgYnl0ZXMgdG8gZ2V0IHRoZSBob3N0bmFtZSBsZW5ndGgpXG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMucmVjZWl2ZUJ1ZmZlci5wZWVrKDUpO1xuICAgICAgICBpZiAoaGVhZGVyWzBdICE9PSAweDA1IHx8IGhlYWRlclsxXSAhPT0gY29uc3RhbnRzXzEuU29ja3M1UmVzcG9uc2UuR3JhbnRlZCkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVNvY2tldChgJHtjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzNUZpbmFsSGFuZHNoYWtlUmVqZWN0ZWR9IC0gJHtjb25zdGFudHNfMS5Tb2NrczVSZXNwb25zZVtoZWFkZXJbMV1dfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVhZCBhZGRyZXNzIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NUeXBlID0gaGVhZGVyWzNdO1xuICAgICAgICAgICAgbGV0IHJlbW90ZUhvc3Q7XG4gICAgICAgICAgICBsZXQgYnVmZjtcbiAgICAgICAgICAgIC8vIElQdjRcbiAgICAgICAgICAgIGlmIChhZGRyZXNzVHlwZSA9PT0gY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2NCkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFOZWVkZWQgPSBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1UmVzcG9uc2VJUHY0O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlY2VpdmVCdWZmZXIubGVuZ3RoIDwgZGF0YU5lZWRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPSBkYXRhTmVlZGVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmYgPSBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlci5mcm9tQnVmZmVyKHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoZGF0YU5lZWRlZCkuc2xpY2UoNCkpO1xuICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6ICgwLCBoZWxwZXJzXzEuaW50MzJUb0lwdjQpKGJ1ZmYucmVhZFVJbnQzMkJFKCkpLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBidWZmLnJlYWRVSW50MTZCRSgpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gSWYgZ2l2ZW4gaG9zdCBpcyAwLjAuMC4wLCBhc3N1bWUgcmVtb3RlIHByb3h5IGlwIGluc3RlYWQuXG4gICAgICAgICAgICAgICAgaWYgKHJlbW90ZUhvc3QuaG9zdCA9PT0gJzAuMC4wLjAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QuaG9zdCA9IHRoaXMub3B0aW9ucy5wcm94eS5pcGFkZHJlc3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEhvc3RuYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzVHlwZSA9PT0gY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSG9zdG5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0TGVuZ3RoID0gaGVhZGVyWzRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFOZWVkZWQgPSBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1UmVzcG9uc2VIb3N0bmFtZShob3N0TGVuZ3RoKTsgLy8gaGVhZGVyICsgaG9zdCBsZW5ndGggKyBob3N0ICsgcG9ydFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlY2VpdmVCdWZmZXIubGVuZ3RoIDwgZGF0YU5lZWRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPSBkYXRhTmVlZGVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmYgPSBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlci5mcm9tQnVmZmVyKHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoZGF0YU5lZWRlZCkuc2xpY2UoNSkpO1xuICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6IGJ1ZmYucmVhZFN0cmluZyhob3N0TGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgcG9ydDogYnVmZi5yZWFkVUludDE2QkUoKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8vIElQdjZcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJlc3NUeXBlID09PSBjb25zdGFudHNfMS5Tb2NrczVIb3N0VHlwZS5JUHY2KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YU5lZWRlZCA9IGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczVSZXNwb25zZUlQdjY7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjZWl2ZUJ1ZmZlci5sZW5ndGggPCBkYXRhTmVlZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9IGRhdGFOZWVkZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIodGhpcy5yZWNlaXZlQnVmZmVyLmdldChkYXRhTmVlZGVkKS5zbGljZSg0KSk7XG4gICAgICAgICAgICAgICAgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogaXBfYWRkcmVzc18xLkFkZHJlc3M2LmZyb21CeXRlQXJyYXkoQXJyYXkuZnJvbShidWZmLnJlYWRCdWZmZXIoMTYpKSkuY2Fub25pY2FsRm9ybSgpLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBidWZmLnJlYWRVSW50MTZCRSgpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBoYXZlIGV2ZXJ5dGhpbmcgd2UgbmVlZFxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLlJlY2VpdmVkRmluYWxSZXNwb25zZSk7XG4gICAgICAgICAgICAvLyBJZiB1c2luZyBDT05ORUNULCB0aGUgY2xpZW50IGlzIG5vdyBpbiB0aGUgZXN0YWJsaXNoZWQgc3RhdGUuXG4gICAgICAgICAgICBpZiAoY29uc3RhbnRzXzEuU29ja3NDb21tYW5kW3RoaXMub3B0aW9ucy5jb21tYW5kXSA9PT0gY29uc3RhbnRzXzEuU29ja3NDb21tYW5kLmNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKGNvbnN0YW50c18xLlNvY2tzQ2xpZW50U3RhdGUuRXN0YWJsaXNoZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSW50ZXJuYWxTb2NrZXRIYW5kbGVycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXN0YWJsaXNoZWQnLCB7IHJlbW90ZUhvc3QsIHNvY2tldDogdGhpcy5zb2NrZXQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmRbdGhpcy5vcHRpb25zLmNvbW1hbmRdID09PSBjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmQuYmluZCkge1xuICAgICAgICAgICAgICAgIC8qIElmIHVzaW5nIEJJTkQsIHRoZSBTb2NrcyBjbGllbnQgaXMgbm93IGluIEJvdW5kV2FpdGluZ0ZvckNvbm5lY3Rpb24gc3RhdGUuXG4gICAgICAgICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHRoZSByZW1vdGUgcHJveHkgc2VydmVyIGlzIHdhaXRpbmcgZm9yIGEgcmVtb3RlIGNvbm5lY3Rpb24gdG8gdGhlIGJvdW5kIHBvcnQuICovXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShjb25zdGFudHNfMS5Tb2Nrc0NsaWVudFN0YXRlLkJvdW5kV2FpdGluZ0ZvckNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0YW50c18xLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUy5Tb2NrczVSZXNwb25zZUhlYWRlcjtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2JvdW5kJywgeyByZW1vdGVIb3N0LCBzb2NrZXQ6IHRoaXMuc29ja2V0IH0pO1xuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICBJZiB1c2luZyBBc3NvY2lhdGUsIHRoZSBTb2NrcyBjbGllbnQgaXMgbm93IEVzdGFibGlzaGVkLiBBbmQgdGhlIHByb3h5IHNlcnZlciBpcyBub3cgYWNjZXB0aW5nIFVEUCBwYWNrZXRzIGF0IHRoZVxuICAgICAgICAgICAgICAgICAgZ2l2ZW4gYm91bmQgcG9ydC4gVGhpcyBpbml0aWFsIFNvY2tzIFRDUCBjb25uZWN0aW9uIG11c3QgcmVtYWluIG9wZW4gZm9yIHRoZSBVRFAgcmVsYXkgdG8gY29udGludWUgdG8gd29yay5cbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29uc3RhbnRzXzEuU29ja3NDb21tYW5kW3RoaXMub3B0aW9ucy5jb21tYW5kXSA9PT0gY29uc3RhbnRzXzEuU29ja3NDb21tYW5kLmFzc29jaWF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Fc3RhYmxpc2hlZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJbnRlcm5hbFNvY2tldEhhbmRsZXJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlc3RhYmxpc2hlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlSG9zdCxcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0OiB0aGlzLnNvY2tldCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIFNvY2tzIHY1IGluY29taW5nIGNvbm5lY3Rpb24gcmVxdWVzdCAoQklORCkuXG4gICAgICovXG4gICAgaGFuZGxlU29ja3M1SW5jb21pbmdDb25uZWN0aW9uUmVzcG9uc2UoKSB7XG4gICAgICAgIC8vIFBlZWsgYXQgYXZhaWxhYmxlIGRhdGEgKHdlIG5lZWQgYXQgbGVhc3QgNSBieXRlcyB0byBnZXQgdGhlIGhvc3RuYW1lIGxlbmd0aClcbiAgICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5yZWNlaXZlQnVmZmVyLnBlZWsoNSk7XG4gICAgICAgIGlmIChoZWFkZXJbMF0gIT09IDB4MDUgfHwgaGVhZGVyWzFdICE9PSBjb25zdGFudHNfMS5Tb2NrczVSZXNwb25zZS5HcmFudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlU29ja2V0KGAke2NvbnN0YW50c18xLkVSUk9SUy5Tb2NrczVQcm94eVJlamVjdGVkSW5jb21pbmdCb3VuZENvbm5lY3Rpb259IC0gJHtjb25zdGFudHNfMS5Tb2NrczVSZXNwb25zZVtoZWFkZXJbMV1dfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVhZCBhZGRyZXNzIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NUeXBlID0gaGVhZGVyWzNdO1xuICAgICAgICAgICAgbGV0IHJlbW90ZUhvc3Q7XG4gICAgICAgICAgICBsZXQgYnVmZjtcbiAgICAgICAgICAgIC8vIElQdjRcbiAgICAgICAgICAgIGlmIChhZGRyZXNzVHlwZSA9PT0gY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSVB2NCkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFOZWVkZWQgPSBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1UmVzcG9uc2VJUHY0O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlY2VpdmVCdWZmZXIubGVuZ3RoIDwgZGF0YU5lZWRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRSZXF1aXJlZFBhY2tldEJ1ZmZlclNpemUgPSBkYXRhTmVlZGVkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1ZmYgPSBzbWFydF9idWZmZXJfMS5TbWFydEJ1ZmZlci5mcm9tQnVmZmVyKHRoaXMucmVjZWl2ZUJ1ZmZlci5nZXQoZGF0YU5lZWRlZCkuc2xpY2UoNCkpO1xuICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6ICgwLCBoZWxwZXJzXzEuaW50MzJUb0lwdjQpKGJ1ZmYucmVhZFVJbnQzMkJFKCkpLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBidWZmLnJlYWRVSW50MTZCRSgpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gSWYgZ2l2ZW4gaG9zdCBpcyAwLjAuMC4wLCBhc3N1bWUgcmVtb3RlIHByb3h5IGlwIGluc3RlYWQuXG4gICAgICAgICAgICAgICAgaWYgKHJlbW90ZUhvc3QuaG9zdCA9PT0gJzAuMC4wLjAnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZUhvc3QuaG9zdCA9IHRoaXMub3B0aW9ucy5wcm94eS5pcGFkZHJlc3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEhvc3RuYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzVHlwZSA9PT0gY29uc3RhbnRzXzEuU29ja3M1SG9zdFR5cGUuSG9zdG5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0TGVuZ3RoID0gaGVhZGVyWzRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFOZWVkZWQgPSBjb25zdGFudHNfMS5TT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMuU29ja3M1UmVzcG9uc2VIb3N0bmFtZShob3N0TGVuZ3RoKTsgLy8gaGVhZGVyICsgaG9zdCBsZW5ndGggKyBwb3J0XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjZWl2ZUJ1ZmZlci5sZW5ndGggPCBkYXRhTmVlZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFJlcXVpcmVkUGFja2V0QnVmZmVyU2l6ZSA9IGRhdGFOZWVkZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZiA9IHNtYXJ0X2J1ZmZlcl8xLlNtYXJ0QnVmZmVyLmZyb21CdWZmZXIodGhpcy5yZWNlaXZlQnVmZmVyLmdldChkYXRhTmVlZGVkKS5zbGljZSg1KSk7XG4gICAgICAgICAgICAgICAgcmVtb3RlSG9zdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogYnVmZi5yZWFkU3RyaW5nKGhvc3RMZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBidWZmLnJlYWRVSW50MTZCRSgpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gSVB2NlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWRkcmVzc1R5cGUgPT09IGNvbnN0YW50c18xLlNvY2tzNUhvc3RUeXBlLklQdjYpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhTmVlZGVkID0gY29uc3RhbnRzXzEuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTLlNvY2tzNVJlc3BvbnNlSVB2NjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aCA8IGRhdGFOZWVkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0UmVxdWlyZWRQYWNrZXRCdWZmZXJTaXplID0gZGF0YU5lZWRlZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidWZmID0gc21hcnRfYnVmZmVyXzEuU21hcnRCdWZmZXIuZnJvbUJ1ZmZlcih0aGlzLnJlY2VpdmVCdWZmZXIuZ2V0KGRhdGFOZWVkZWQpLnNsaWNlKDQpKTtcbiAgICAgICAgICAgICAgICByZW1vdGVIb3N0ID0ge1xuICAgICAgICAgICAgICAgICAgICBob3N0OiBpcF9hZGRyZXNzXzEuQWRkcmVzczYuZnJvbUJ5dGVBcnJheShBcnJheS5mcm9tKGJ1ZmYucmVhZEJ1ZmZlcigxNikpKS5jYW5vbmljYWxGb3JtKCksXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IGJ1ZmYucmVhZFVJbnQxNkJFKCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoY29uc3RhbnRzXzEuU29ja3NDbGllbnRTdGF0ZS5Fc3RhYmxpc2hlZCk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUludGVybmFsU29ja2V0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXN0YWJsaXNoZWQnLCB7IHJlbW90ZUhvc3QsIHNvY2tldDogdGhpcy5zb2NrZXQgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHNvY2tzQ2xpZW50T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucyk7XG4gICAgfVxufVxuZXhwb3J0cy5Tb2Nrc0NsaWVudCA9IFNvY2tzQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c29ja3NjbGllbnQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNPQ0tTNV9OT19BQ0NFUFRBQkxFX0FVVEggPSBleHBvcnRzLlNPQ0tTNV9DVVNUT01fQVVUSF9FTkQgPSBleHBvcnRzLlNPQ0tTNV9DVVNUT01fQVVUSF9TVEFSVCA9IGV4cG9ydHMuU09DS1NfSU5DT01JTkdfUEFDS0VUX1NJWkVTID0gZXhwb3J0cy5Tb2Nrc0NsaWVudFN0YXRlID0gZXhwb3J0cy5Tb2NrczVSZXNwb25zZSA9IGV4cG9ydHMuU29ja3M1SG9zdFR5cGUgPSBleHBvcnRzLlNvY2tzNUF1dGggPSBleHBvcnRzLlNvY2tzNFJlc3BvbnNlID0gZXhwb3J0cy5Tb2Nrc0NvbW1hbmQgPSBleHBvcnRzLkVSUk9SUyA9IGV4cG9ydHMuREVGQVVMVF9USU1FT1VUID0gdm9pZCAwO1xuY29uc3QgREVGQVVMVF9USU1FT1VUID0gMzAwMDA7XG5leHBvcnRzLkRFRkFVTFRfVElNRU9VVCA9IERFRkFVTFRfVElNRU9VVDtcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgRVJST1JTID0ge1xuICAgIEludmFsaWRTb2Nrc0NvbW1hbmQ6ICdBbiBpbnZhbGlkIFNPQ0tTIGNvbW1hbmQgd2FzIHByb3ZpZGVkLiBWYWxpZCBvcHRpb25zIGFyZSBjb25uZWN0LCBiaW5kLCBhbmQgYXNzb2NpYXRlLicsXG4gICAgSW52YWxpZFNvY2tzQ29tbWFuZEZvck9wZXJhdGlvbjogJ0FuIGludmFsaWQgU09DS1MgY29tbWFuZCB3YXMgcHJvdmlkZWQuIE9ubHkgYSBzdWJzZXQgb2YgY29tbWFuZHMgYXJlIHN1cHBvcnRlZCBmb3IgdGhpcyBvcGVyYXRpb24uJyxcbiAgICBJbnZhbGlkU29ja3NDb21tYW5kQ2hhaW46ICdBbiBpbnZhbGlkIFNPQ0tTIGNvbW1hbmQgd2FzIHByb3ZpZGVkLiBDaGFpbmluZyBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB0aGUgY29ubmVjdCBjb21tYW5kLicsXG4gICAgSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0Rlc3RpbmF0aW9uOiAnQW4gaW52YWxpZCBkZXN0aW5hdGlvbiBob3N0IHdhcyBwcm92aWRlZC4nLFxuICAgIEludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNFeGlzdGluZ1NvY2tldDogJ0FuIGludmFsaWQgZXhpc3Rpbmcgc29ja2V0IHdhcyBwcm92aWRlZC4gVGhpcyBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2Ygc3RyZWFtLkR1cGxleC4nLFxuICAgIEludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNQcm94eTogJ0ludmFsaWQgU09DS1MgcHJveHkgZGV0YWlscyB3ZXJlIHByb3ZpZGVkLicsXG4gICAgSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc1RpbWVvdXQ6ICdBbiBpbnZhbGlkIHRpbWVvdXQgdmFsdWUgd2FzIHByb3ZpZGVkLiBQbGVhc2UgZW50ZXIgYSB2YWx1ZSBhYm92ZSAwIChpbiBtcykuJyxcbiAgICBJbnZhbGlkU29ja3NDbGllbnRPcHRpb25zUHJveGllc0xlbmd0aDogJ0F0IGxlYXN0IHR3byBzb2NrcyBwcm94aWVzIG11c3QgYmUgcHJvdmlkZWQgZm9yIGNoYWluaW5nLicsXG4gICAgSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0N1c3RvbUF1dGhSYW5nZTogJ0N1c3RvbSBhdXRoIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDB4ODAgYW5kIDB4RkUuJyxcbiAgICBJbnZhbGlkU29ja3NDbGllbnRPcHRpb25zQ3VzdG9tQXV0aE9wdGlvbnM6ICdXaGVuIGEgY3VzdG9tX2F1dGhfbWV0aG9kIGlzIHByb3ZpZGVkLCBjdXN0b21fYXV0aF9yZXF1ZXN0X2hhbmRsZXIsIGN1c3RvbV9hdXRoX3Jlc3BvbnNlX3NpemUsIGFuZCBjdXN0b21fYXV0aF9yZXNwb25zZV9oYW5kbGVyIG11c3QgYWxzbyBiZSBwcm92aWRlZCBhbmQgdmFsaWQuJyxcbiAgICBOZWdvdGlhdGlvbkVycm9yOiAnTmVnb3RpYXRpb24gZXJyb3InLFxuICAgIFNvY2tldENsb3NlZDogJ1NvY2tldCBjbG9zZWQnLFxuICAgIFByb3h5Q29ubmVjdGlvblRpbWVkT3V0OiAnUHJveHkgY29ubmVjdGlvbiB0aW1lZCBvdXQnLFxuICAgIEludGVybmFsRXJyb3I6ICdTb2Nrc0NsaWVudCBpbnRlcm5hbCBlcnJvciAodGhpcyBzaG91bGQgbm90IGhhcHBlbiknLFxuICAgIEludmFsaWRTb2NrczRIYW5kc2hha2VSZXNwb25zZTogJ1JlY2VpdmVkIGludmFsaWQgU29ja3M0IGhhbmRzaGFrZSByZXNwb25zZScsXG4gICAgU29ja3M0UHJveHlSZWplY3RlZENvbm5lY3Rpb246ICdTb2NrczQgUHJveHkgcmVqZWN0ZWQgY29ubmVjdGlvbicsXG4gICAgSW52YWxpZFNvY2tzNEluY29taW5nQ29ubmVjdGlvblJlc3BvbnNlOiAnU29ja3M0IGludmFsaWQgaW5jb21pbmcgY29ubmVjdGlvbiByZXNwb25zZScsXG4gICAgU29ja3M0UHJveHlSZWplY3RlZEluY29taW5nQm91bmRDb25uZWN0aW9uOiAnU29ja3M0IFByb3h5IHJlamVjdGVkIGluY29taW5nIGJvdW5kIGNvbm5lY3Rpb24nLFxuICAgIEludmFsaWRTb2NrczVJbml0aWFsSGFuZHNoYWtlUmVzcG9uc2U6ICdSZWNlaXZlZCBpbnZhbGlkIFNvY2tzNSBpbml0aWFsIGhhbmRzaGFrZSByZXNwb25zZScsXG4gICAgSW52YWxpZFNvY2tzNUludGlhaWxIYW5kc2hha2VTb2Nrc1ZlcnNpb246ICdSZWNlaXZlZCBpbnZhbGlkIFNvY2tzNSBpbml0aWFsIGhhbmRzaGFrZSAoaW52YWxpZCBzb2NrcyB2ZXJzaW9uKScsXG4gICAgSW52YWxpZFNvY2tzNUluaXRpYWxIYW5kc2hha2VOb0FjY2VwdGVkQXV0aFR5cGU6ICdSZWNlaXZlZCBpbnZhbGlkIFNvY2tzNSBpbml0aWFsIGhhbmRzaGFrZSAobm8gYWNjZXB0ZWQgYXV0aGVudGljYXRpb24gdHlwZSknLFxuICAgIEludmFsaWRTb2NrczVJbml0aWFsSGFuZHNoYWtlVW5rbm93bkF1dGhUeXBlOiAnUmVjZWl2ZWQgaW52YWxpZCBTb2NrczUgaW5pdGlhbCBoYW5kc2hha2UgKHVua25vd24gYXV0aGVudGljYXRpb24gdHlwZSknLFxuICAgIFNvY2tzNUF1dGhlbnRpY2F0aW9uRmFpbGVkOiAnU29ja3M1IEF1dGhlbnRpY2F0aW9uIGZhaWxlZCcsXG4gICAgSW52YWxpZFNvY2tzNUZpbmFsSGFuZHNoYWtlOiAnUmVjZWl2ZWQgaW52YWxpZCBTb2NrczUgZmluYWwgaGFuZHNoYWtlIHJlc3BvbnNlJyxcbiAgICBJbnZhbGlkU29ja3M1RmluYWxIYW5kc2hha2VSZWplY3RlZDogJ1NvY2tzNSBwcm94eSByZWplY3RlZCBjb25uZWN0aW9uJyxcbiAgICBJbnZhbGlkU29ja3M1SW5jb21pbmdDb25uZWN0aW9uUmVzcG9uc2U6ICdSZWNlaXZlZCBpbnZhbGlkIFNvY2tzNSBpbmNvbWluZyBjb25uZWN0aW9uIHJlc3BvbnNlJyxcbiAgICBTb2NrczVQcm94eVJlamVjdGVkSW5jb21pbmdCb3VuZENvbm5lY3Rpb246ICdTb2NrczUgUHJveHkgcmVqZWN0ZWQgaW5jb21pbmcgYm91bmQgY29ubmVjdGlvbicsXG59O1xuZXhwb3J0cy5FUlJPUlMgPSBFUlJPUlM7XG5jb25zdCBTT0NLU19JTkNPTUlOR19QQUNLRVRfU0laRVMgPSB7XG4gICAgU29ja3M1SW5pdGlhbEhhbmRzaGFrZVJlc3BvbnNlOiAyLFxuICAgIFNvY2tzNVVzZXJQYXNzQXV0aGVudGljYXRpb25SZXNwb25zZTogMixcbiAgICAvLyBDb21tYW5kIHJlc3BvbnNlICsgaW5jb21pbmcgY29ubmVjdGlvbiAoYmluZClcbiAgICBTb2NrczVSZXNwb25zZUhlYWRlcjogNSwgLy8gV2UgbmVlZCBhdCBsZWFzdCA1IHRvIHJlYWQgdGhlIGhvc3RuYW1lIGxlbmd0aCwgdGhlbiB3ZSB3YWl0IGZvciB0aGUgYWRkcmVzcytwb3J0IGluZm9ybWF0aW9uLlxuICAgIFNvY2tzNVJlc3BvbnNlSVB2NDogMTAsIC8vIDQgaGVhZGVyICsgNCBpcCArIDIgcG9ydFxuICAgIFNvY2tzNVJlc3BvbnNlSVB2NjogMjIsIC8vIDQgaGVhZGVyICsgMTYgaXAgKyAyIHBvcnRcbiAgICBTb2NrczVSZXNwb25zZUhvc3RuYW1lOiAoaG9zdE5hbWVMZW5ndGgpID0+IGhvc3ROYW1lTGVuZ3RoICsgNywgLy8gNCBoZWFkZXIgKyAxIGhvc3QgbGVuZ3RoICsgaG9zdCArIDIgcG9ydFxuICAgIC8vIENvbW1hbmQgcmVzcG9uc2UgKyBpbmNvbWluZyBjb25uZWN0aW9uIChiaW5kKVxuICAgIFNvY2tzNFJlc3BvbnNlOiA4LCAvLyAyIGhlYWRlciArIDIgcG9ydCArIDQgaXBcbn07XG5leHBvcnRzLlNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUyA9IFNPQ0tTX0lOQ09NSU5HX1BBQ0tFVF9TSVpFUztcbnZhciBTb2Nrc0NvbW1hbmQ7XG4oZnVuY3Rpb24gKFNvY2tzQ29tbWFuZCkge1xuICAgIFNvY2tzQ29tbWFuZFtTb2Nrc0NvbW1hbmRbXCJjb25uZWN0XCJdID0gMV0gPSBcImNvbm5lY3RcIjtcbiAgICBTb2Nrc0NvbW1hbmRbU29ja3NDb21tYW5kW1wiYmluZFwiXSA9IDJdID0gXCJiaW5kXCI7XG4gICAgU29ja3NDb21tYW5kW1NvY2tzQ29tbWFuZFtcImFzc29jaWF0ZVwiXSA9IDNdID0gXCJhc3NvY2lhdGVcIjtcbn0pKFNvY2tzQ29tbWFuZCB8fCAoZXhwb3J0cy5Tb2Nrc0NvbW1hbmQgPSBTb2Nrc0NvbW1hbmQgPSB7fSkpO1xudmFyIFNvY2tzNFJlc3BvbnNlO1xuKGZ1bmN0aW9uIChTb2NrczRSZXNwb25zZSkge1xuICAgIFNvY2tzNFJlc3BvbnNlW1NvY2tzNFJlc3BvbnNlW1wiR3JhbnRlZFwiXSA9IDkwXSA9IFwiR3JhbnRlZFwiO1xuICAgIFNvY2tzNFJlc3BvbnNlW1NvY2tzNFJlc3BvbnNlW1wiRmFpbGVkXCJdID0gOTFdID0gXCJGYWlsZWRcIjtcbiAgICBTb2NrczRSZXNwb25zZVtTb2NrczRSZXNwb25zZVtcIlJlamVjdGVkXCJdID0gOTJdID0gXCJSZWplY3RlZFwiO1xuICAgIFNvY2tzNFJlc3BvbnNlW1NvY2tzNFJlc3BvbnNlW1wiUmVqZWN0ZWRJZGVudFwiXSA9IDkzXSA9IFwiUmVqZWN0ZWRJZGVudFwiO1xufSkoU29ja3M0UmVzcG9uc2UgfHwgKGV4cG9ydHMuU29ja3M0UmVzcG9uc2UgPSBTb2NrczRSZXNwb25zZSA9IHt9KSk7XG52YXIgU29ja3M1QXV0aDtcbihmdW5jdGlvbiAoU29ja3M1QXV0aCkge1xuICAgIFNvY2tzNUF1dGhbU29ja3M1QXV0aFtcIk5vQXV0aFwiXSA9IDBdID0gXCJOb0F1dGhcIjtcbiAgICBTb2NrczVBdXRoW1NvY2tzNUF1dGhbXCJHU1NBcGlcIl0gPSAxXSA9IFwiR1NTQXBpXCI7XG4gICAgU29ja3M1QXV0aFtTb2NrczVBdXRoW1wiVXNlclBhc3NcIl0gPSAyXSA9IFwiVXNlclBhc3NcIjtcbn0pKFNvY2tzNUF1dGggfHwgKGV4cG9ydHMuU29ja3M1QXV0aCA9IFNvY2tzNUF1dGggPSB7fSkpO1xuY29uc3QgU09DS1M1X0NVU1RPTV9BVVRIX1NUQVJUID0gMHg4MDtcbmV4cG9ydHMuU09DS1M1X0NVU1RPTV9BVVRIX1NUQVJUID0gU09DS1M1X0NVU1RPTV9BVVRIX1NUQVJUO1xuY29uc3QgU09DS1M1X0NVU1RPTV9BVVRIX0VORCA9IDB4ZmU7XG5leHBvcnRzLlNPQ0tTNV9DVVNUT01fQVVUSF9FTkQgPSBTT0NLUzVfQ1VTVE9NX0FVVEhfRU5EO1xuY29uc3QgU09DS1M1X05PX0FDQ0VQVEFCTEVfQVVUSCA9IDB4ZmY7XG5leHBvcnRzLlNPQ0tTNV9OT19BQ0NFUFRBQkxFX0FVVEggPSBTT0NLUzVfTk9fQUNDRVBUQUJMRV9BVVRIO1xudmFyIFNvY2tzNVJlc3BvbnNlO1xuKGZ1bmN0aW9uIChTb2NrczVSZXNwb25zZSkge1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiR3JhbnRlZFwiXSA9IDBdID0gXCJHcmFudGVkXCI7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJGYWlsdXJlXCJdID0gMV0gPSBcIkZhaWx1cmVcIjtcbiAgICBTb2NrczVSZXNwb25zZVtTb2NrczVSZXNwb25zZVtcIk5vdEFsbG93ZWRcIl0gPSAyXSA9IFwiTm90QWxsb3dlZFwiO1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiTmV0d29ya1VucmVhY2hhYmxlXCJdID0gM10gPSBcIk5ldHdvcmtVbnJlYWNoYWJsZVwiO1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiSG9zdFVucmVhY2hhYmxlXCJdID0gNF0gPSBcIkhvc3RVbnJlYWNoYWJsZVwiO1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiQ29ubmVjdGlvblJlZnVzZWRcIl0gPSA1XSA9IFwiQ29ubmVjdGlvblJlZnVzZWRcIjtcbiAgICBTb2NrczVSZXNwb25zZVtTb2NrczVSZXNwb25zZVtcIlRUTEV4cGlyZWRcIl0gPSA2XSA9IFwiVFRMRXhwaXJlZFwiO1xuICAgIFNvY2tzNVJlc3BvbnNlW1NvY2tzNVJlc3BvbnNlW1wiQ29tbWFuZE5vdFN1cHBvcnRlZFwiXSA9IDddID0gXCJDb21tYW5kTm90U3VwcG9ydGVkXCI7XG4gICAgU29ja3M1UmVzcG9uc2VbU29ja3M1UmVzcG9uc2VbXCJBZGRyZXNzTm90U3VwcG9ydGVkXCJdID0gOF0gPSBcIkFkZHJlc3NOb3RTdXBwb3J0ZWRcIjtcbn0pKFNvY2tzNVJlc3BvbnNlIHx8IChleHBvcnRzLlNvY2tzNVJlc3BvbnNlID0gU29ja3M1UmVzcG9uc2UgPSB7fSkpO1xudmFyIFNvY2tzNUhvc3RUeXBlO1xuKGZ1bmN0aW9uIChTb2NrczVIb3N0VHlwZSkge1xuICAgIFNvY2tzNUhvc3RUeXBlW1NvY2tzNUhvc3RUeXBlW1wiSVB2NFwiXSA9IDFdID0gXCJJUHY0XCI7XG4gICAgU29ja3M1SG9zdFR5cGVbU29ja3M1SG9zdFR5cGVbXCJIb3N0bmFtZVwiXSA9IDNdID0gXCJIb3N0bmFtZVwiO1xuICAgIFNvY2tzNUhvc3RUeXBlW1NvY2tzNUhvc3RUeXBlW1wiSVB2NlwiXSA9IDRdID0gXCJJUHY2XCI7XG59KShTb2NrczVIb3N0VHlwZSB8fCAoZXhwb3J0cy5Tb2NrczVIb3N0VHlwZSA9IFNvY2tzNUhvc3RUeXBlID0ge30pKTtcbnZhciBTb2Nrc0NsaWVudFN0YXRlO1xuKGZ1bmN0aW9uIChTb2Nrc0NsaWVudFN0YXRlKSB7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiQ3JlYXRlZFwiXSA9IDBdID0gXCJDcmVhdGVkXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiQ29ubmVjdGluZ1wiXSA9IDFdID0gXCJDb25uZWN0aW5nXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiQ29ubmVjdGVkXCJdID0gMl0gPSBcIkNvbm5lY3RlZFwiO1xuICAgIFNvY2tzQ2xpZW50U3RhdGVbU29ja3NDbGllbnRTdGF0ZVtcIlNlbnRJbml0aWFsSGFuZHNoYWtlXCJdID0gM10gPSBcIlNlbnRJbml0aWFsSGFuZHNoYWtlXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiUmVjZWl2ZWRJbml0aWFsSGFuZHNoYWtlUmVzcG9uc2VcIl0gPSA0XSA9IFwiUmVjZWl2ZWRJbml0aWFsSGFuZHNoYWtlUmVzcG9uc2VcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJTZW50QXV0aGVudGljYXRpb25cIl0gPSA1XSA9IFwiU2VudEF1dGhlbnRpY2F0aW9uXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiUmVjZWl2ZWRBdXRoZW50aWNhdGlvblJlc3BvbnNlXCJdID0gNl0gPSBcIlJlY2VpdmVkQXV0aGVudGljYXRpb25SZXNwb25zZVwiO1xuICAgIFNvY2tzQ2xpZW50U3RhdGVbU29ja3NDbGllbnRTdGF0ZVtcIlNlbnRGaW5hbEhhbmRzaGFrZVwiXSA9IDddID0gXCJTZW50RmluYWxIYW5kc2hha2VcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJSZWNlaXZlZEZpbmFsUmVzcG9uc2VcIl0gPSA4XSA9IFwiUmVjZWl2ZWRGaW5hbFJlc3BvbnNlXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiQm91bmRXYWl0aW5nRm9yQ29ubmVjdGlvblwiXSA9IDldID0gXCJCb3VuZFdhaXRpbmdGb3JDb25uZWN0aW9uXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiRXN0YWJsaXNoZWRcIl0gPSAxMF0gPSBcIkVzdGFibGlzaGVkXCI7XG4gICAgU29ja3NDbGllbnRTdGF0ZVtTb2Nrc0NsaWVudFN0YXRlW1wiRGlzY29ubmVjdGVkXCJdID0gMTFdID0gXCJEaXNjb25uZWN0ZWRcIjtcbiAgICBTb2Nrc0NsaWVudFN0YXRlW1NvY2tzQ2xpZW50U3RhdGVbXCJFcnJvclwiXSA9IDk5XSA9IFwiRXJyb3JcIjtcbn0pKFNvY2tzQ2xpZW50U3RhdGUgfHwgKGV4cG9ydHMuU29ja3NDbGllbnRTdGF0ZSA9IFNvY2tzQ2xpZW50U3RhdGUgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pcFRvQnVmZmVyID0gZXhwb3J0cy5pbnQzMlRvSXB2NCA9IGV4cG9ydHMuaXB2NFRvSW50MzIgPSBleHBvcnRzLnZhbGlkYXRlU29ja3NDbGllbnRDaGFpbk9wdGlvbnMgPSBleHBvcnRzLnZhbGlkYXRlU29ja3NDbGllbnRPcHRpb25zID0gdm9pZCAwO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4vY29uc3RhbnRzXCIpO1xuY29uc3Qgc3RyZWFtID0gcmVxdWlyZShcInN0cmVhbVwiKTtcbmNvbnN0IGlwX2FkZHJlc3NfMSA9IHJlcXVpcmUoXCJpcC1hZGRyZXNzXCIpO1xuY29uc3QgbmV0ID0gcmVxdWlyZShcIm5ldFwiKTtcbi8qKlxuICogVmFsaWRhdGVzIHRoZSBwcm92aWRlZCBTb2Nrc0NsaWVudE9wdGlvbnNcbiAqIEBwYXJhbSBvcHRpb25zIHsgU29ja3NDbGllbnRPcHRpb25zIH1cbiAqIEBwYXJhbSBhY2NlcHRlZENvbW1hbmRzIHsgc3RyaW5nW10gfSBBIGxpc3Qgb2YgYWNjZXB0ZWQgU29ja3NQcm94eSBjb21tYW5kcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTb2Nrc0NsaWVudE9wdGlvbnMob3B0aW9ucywgYWNjZXB0ZWRDb21tYW5kcyA9IFsnY29ubmVjdCcsICdiaW5kJywgJ2Fzc29jaWF0ZSddKSB7XG4gICAgLy8gQ2hlY2sgU09DS3MgY29tbWFuZCBvcHRpb24uXG4gICAgaWYgKCFjb25zdGFudHNfMS5Tb2Nrc0NvbW1hbmRbb3B0aW9ucy5jb21tYW5kXSkge1xuICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NvbW1hbmQsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBDaGVjayBTb2Nrc0NvbW1hbmQgZm9yIGFjY2VwdGFibGUgY29tbWFuZC5cbiAgICBpZiAoYWNjZXB0ZWRDb21tYW5kcy5pbmRleE9mKG9wdGlvbnMuY29tbWFuZCkgPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ29tbWFuZEZvck9wZXJhdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIENoZWNrIGRlc3RpbmF0aW9uXG4gICAgaWYgKCFpc1ZhbGlkU29ja3NSZW1vdGVIb3N0KG9wdGlvbnMuZGVzdGluYXRpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0Rlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgU09DS1MgcHJveHkgdG8gdXNlXG4gICAgaWYgKCFpc1ZhbGlkU29ja3NQcm94eShvcHRpb25zLnByb3h5KSkge1xuICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNQcm94eSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIGN1c3RvbSBhdXRoIChpZiBzZXQpXG4gICAgdmFsaWRhdGVDdXN0b21Qcm94eUF1dGgob3B0aW9ucy5wcm94eSwgb3B0aW9ucyk7XG4gICAgLy8gQ2hlY2sgdGltZW91dFxuICAgIGlmIChvcHRpb25zLnRpbWVvdXQgJiYgIWlzVmFsaWRUaW1lb3V0VmFsdWUob3B0aW9ucy50aW1lb3V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNUaW1lb3V0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgZXhpc3Rpbmdfc29ja2V0IChpZiBwcm92aWRlZClcbiAgICBpZiAob3B0aW9ucy5leGlzdGluZ19zb2NrZXQgJiZcbiAgICAgICAgIShvcHRpb25zLmV4aXN0aW5nX3NvY2tldCBpbnN0YW5jZW9mIHN0cmVhbS5EdXBsZXgpKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0V4aXN0aW5nU29ja2V0LCBvcHRpb25zKTtcbiAgICB9XG59XG5leHBvcnRzLnZhbGlkYXRlU29ja3NDbGllbnRPcHRpb25zID0gdmFsaWRhdGVTb2Nrc0NsaWVudE9wdGlvbnM7XG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgU29ja3NDbGllbnRDaGFpbk9wdGlvbnNcbiAqIEBwYXJhbSBvcHRpb25zIHsgU29ja3NDbGllbnRDaGFpbk9wdGlvbnMgfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVNvY2tzQ2xpZW50Q2hhaW5PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAvLyBPbmx5IGNvbm5lY3QgaXMgc3VwcG9ydGVkIHdoZW4gY2hhaW5pbmcuXG4gICAgaWYgKG9wdGlvbnMuY29tbWFuZCAhPT0gJ2Nvbm5lY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ29tbWFuZENoYWluLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgZGVzdGluYXRpb25cbiAgICBpZiAoIWlzVmFsaWRTb2Nrc1JlbW90ZUhvc3Qob3B0aW9ucy5kZXN0aW5hdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zRGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBWYWxpZGF0ZSBwcm94aWVzIChsZW5ndGgpXG4gICAgaWYgKCEob3B0aW9ucy5wcm94aWVzICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkob3B0aW9ucy5wcm94aWVzKSAmJlxuICAgICAgICBvcHRpb25zLnByb3hpZXMubGVuZ3RoID49IDIpKSB7XG4gICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc1Byb3hpZXNMZW5ndGgsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBWYWxpZGF0ZSBwcm94aWVzXG4gICAgb3B0aW9ucy5wcm94aWVzLmZvckVhY2goKHByb3h5KSA9PiB7XG4gICAgICAgIGlmICghaXNWYWxpZFNvY2tzUHJveHkocHJveHkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNQcm94eSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmFsaWRhdGUgY3VzdG9tIGF1dGggKGlmIHNldClcbiAgICAgICAgdmFsaWRhdGVDdXN0b21Qcm94eUF1dGgocHJveHksIG9wdGlvbnMpO1xuICAgIH0pO1xuICAgIC8vIENoZWNrIHRpbWVvdXRcbiAgICBpZiAob3B0aW9ucy50aW1lb3V0ICYmICFpc1ZhbGlkVGltZW91dFZhbHVlKG9wdGlvbnMudGltZW91dCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zVGltZW91dCwgb3B0aW9ucyk7XG4gICAgfVxufVxuZXhwb3J0cy52YWxpZGF0ZVNvY2tzQ2xpZW50Q2hhaW5PcHRpb25zID0gdmFsaWRhdGVTb2Nrc0NsaWVudENoYWluT3B0aW9ucztcbmZ1bmN0aW9uIHZhbGlkYXRlQ3VzdG9tUHJveHlBdXRoKHByb3h5LCBvcHRpb25zKSB7XG4gICAgaWYgKHByb3h5LmN1c3RvbV9hdXRoX21ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEludmFsaWQgYXV0aCBtZXRob2QgcmFuZ2VcbiAgICAgICAgaWYgKHByb3h5LmN1c3RvbV9hdXRoX21ldGhvZCA8IGNvbnN0YW50c18xLlNPQ0tTNV9DVVNUT01fQVVUSF9TVEFSVCB8fFxuICAgICAgICAgICAgcHJveHkuY3VzdG9tX2F1dGhfbWV0aG9kID4gY29uc3RhbnRzXzEuU09DS1M1X0NVU1RPTV9BVVRIX0VORCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zQ3VzdG9tQXV0aFJhbmdlLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNaXNzaW5nIGN1c3RvbV9hdXRoX3JlcXVlc3RfaGFuZGxlclxuICAgICAgICBpZiAocHJveHkuY3VzdG9tX2F1dGhfcmVxdWVzdF9oYW5kbGVyID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIHR5cGVvZiBwcm94eS5jdXN0b21fYXV0aF9yZXF1ZXN0X2hhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyB1dGlsXzEuU29ja3NDbGllbnRFcnJvcihjb25zdGFudHNfMS5FUlJPUlMuSW52YWxpZFNvY2tzQ2xpZW50T3B0aW9uc0N1c3RvbUF1dGhPcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNaXNzaW5nIGN1c3RvbV9hdXRoX3Jlc3BvbnNlX3NpemVcbiAgICAgICAgaWYgKHByb3h5LmN1c3RvbV9hdXRoX3Jlc3BvbnNlX3NpemUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IHV0aWxfMS5Tb2Nrc0NsaWVudEVycm9yKGNvbnN0YW50c18xLkVSUk9SUy5JbnZhbGlkU29ja3NDbGllbnRPcHRpb25zQ3VzdG9tQXV0aE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1pc3NpbmcvaW52YWxpZCBjdXN0b21fYXV0aF9yZXNwb25zZV9oYW5kbGVyXG4gICAgICAgIGlmIChwcm94eS5jdXN0b21fYXV0aF9yZXNwb25zZV9oYW5kbGVyID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIHR5cGVvZiBwcm94eS5jdXN0b21fYXV0aF9yZXNwb25zZV9oYW5kbGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdXRpbF8xLlNvY2tzQ2xpZW50RXJyb3IoY29uc3RhbnRzXzEuRVJST1JTLkludmFsaWRTb2Nrc0NsaWVudE9wdGlvbnNDdXN0b21BdXRoT3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFZhbGlkYXRlcyBhIFNvY2tzUmVtb3RlSG9zdFxuICogQHBhcmFtIHJlbW90ZUhvc3QgeyBTb2Nrc1JlbW90ZUhvc3QgfVxuICovXG5mdW5jdGlvbiBpc1ZhbGlkU29ja3NSZW1vdGVIb3N0KHJlbW90ZUhvc3QpIHtcbiAgICByZXR1cm4gKHJlbW90ZUhvc3QgJiZcbiAgICAgICAgdHlwZW9mIHJlbW90ZUhvc3QuaG9zdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdHlwZW9mIHJlbW90ZUhvc3QucG9ydCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgcmVtb3RlSG9zdC5wb3J0ID49IDAgJiZcbiAgICAgICAgcmVtb3RlSG9zdC5wb3J0IDw9IDY1NTM1KTtcbn1cbi8qKlxuICogVmFsaWRhdGVzIGEgU29ja3NQcm94eVxuICogQHBhcmFtIHByb3h5IHsgU29ja3NQcm94eSB9XG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTb2Nrc1Byb3h5KHByb3h5KSB7XG4gICAgcmV0dXJuIChwcm94eSAmJlxuICAgICAgICAodHlwZW9mIHByb3h5Lmhvc3QgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm94eS5pcGFkZHJlc3MgPT09ICdzdHJpbmcnKSAmJlxuICAgICAgICB0eXBlb2YgcHJveHkucG9ydCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgcHJveHkucG9ydCA+PSAwICYmXG4gICAgICAgIHByb3h5LnBvcnQgPD0gNjU1MzUgJiZcbiAgICAgICAgKHByb3h5LnR5cGUgPT09IDQgfHwgcHJveHkudHlwZSA9PT0gNSkpO1xufVxuLyoqXG4gKiBWYWxpZGF0ZXMgYSB0aW1lb3V0IHZhbHVlLlxuICogQHBhcmFtIHZhbHVlIHsgTnVtYmVyIH1cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFRpbWVvdXRWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlID4gMDtcbn1cbmZ1bmN0aW9uIGlwdjRUb0ludDMyKGlwKSB7XG4gICAgY29uc3QgYWRkcmVzcyA9IG5ldyBpcF9hZGRyZXNzXzEuQWRkcmVzczQoaXApO1xuICAgIC8vIENvbnZlcnQgdGhlIElQdjQgYWRkcmVzcyBwYXJ0cyB0byBhbiBpbnRlZ2VyXG4gICAgcmV0dXJuIGFkZHJlc3MudG9BcnJheSgpLnJlZHVjZSgoYWNjLCBwYXJ0KSA9PiAoYWNjIDw8IDgpICsgcGFydCwgMCk7XG59XG5leHBvcnRzLmlwdjRUb0ludDMyID0gaXB2NFRvSW50MzI7XG5mdW5jdGlvbiBpbnQzMlRvSXB2NChpbnQzMikge1xuICAgIC8vIEV4dHJhY3QgZWFjaCBieXRlIChvY3RldCkgZnJvbSB0aGUgMzItYml0IGludGVnZXJcbiAgICBjb25zdCBvY3RldDEgPSAoaW50MzIgPj4+IDI0KSAmIDB4ZmY7XG4gICAgY29uc3Qgb2N0ZXQyID0gKGludDMyID4+PiAxNikgJiAweGZmO1xuICAgIGNvbnN0IG9jdGV0MyA9IChpbnQzMiA+Pj4gOCkgJiAweGZmO1xuICAgIGNvbnN0IG9jdGV0NCA9IGludDMyICYgMHhmZjtcbiAgICAvLyBDb21iaW5lIHRoZSBvY3RldHMgaW50byBhIHN0cmluZyBpbiBJUHY0IGZvcm1hdFxuICAgIHJldHVybiBbb2N0ZXQxLCBvY3RldDIsIG9jdGV0Mywgb2N0ZXQ0XS5qb2luKCcuJyk7XG59XG5leHBvcnRzLmludDMyVG9JcHY0ID0gaW50MzJUb0lwdjQ7XG5mdW5jdGlvbiBpcFRvQnVmZmVyKGlwKSB7XG4gICAgaWYgKG5ldC5pc0lQdjQoaXApKSB7XG4gICAgICAgIC8vIEhhbmRsZSBJUHY0IGFkZHJlc3Nlc1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gbmV3IGlwX2FkZHJlc3NfMS5BZGRyZXNzNChpcCk7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShhZGRyZXNzLnRvQXJyYXkoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG5ldC5pc0lQdjYoaXApKSB7XG4gICAgICAgIC8vIEhhbmRsZSBJUHY2IGFkZHJlc3Nlc1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gbmV3IGlwX2FkZHJlc3NfMS5BZGRyZXNzNihpcCk7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShhZGRyZXNzXG4gICAgICAgICAgICAuY2Fub25pY2FsRm9ybSgpXG4gICAgICAgICAgICAuc3BsaXQoJzonKVxuICAgICAgICAgICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC5wYWRTdGFydCg0LCAnMCcpKVxuICAgICAgICAgICAgLmpvaW4oJycpLCAnaGV4Jyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVAgYWRkcmVzcyBmb3JtYXQnKTtcbiAgICB9XG59XG5leHBvcnRzLmlwVG9CdWZmZXIgPSBpcFRvQnVmZmVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGVscGVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUmVjZWl2ZUJ1ZmZlciA9IHZvaWQgMDtcbmNsYXNzIFJlY2VpdmVCdWZmZXIge1xuICAgIGNvbnN0cnVjdG9yKHNpemUgPSA0MDk2KSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKHNpemUpO1xuICAgICAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgICAgIHRoaXMub3JpZ2luYWxTaXplID0gc2l6ZTtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0O1xuICAgIH1cbiAgICBhcHBlbmQoZGF0YSkge1xuICAgICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gYXBwZW5kIGEgbm9uLWJ1ZmZlciBpbnN0YW5jZSB0byBSZWNlaXZlQnVmZmVyLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIGRhdGEubGVuZ3RoID49IHRoaXMuYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdG1wID0gdGhpcy5idWZmZXI7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShNYXRoLm1heCh0aGlzLmJ1ZmZlci5sZW5ndGggKyB0aGlzLm9yaWdpbmFsU2l6ZSwgdGhpcy5idWZmZXIubGVuZ3RoICsgZGF0YS5sZW5ndGgpKTtcbiAgICAgICAgICAgIHRtcC5jb3B5KHRoaXMuYnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLmNvcHkodGhpcy5idWZmZXIsIHRoaXMub2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuICh0aGlzLm9mZnNldCArPSBkYXRhLmxlbmd0aCk7XG4gICAgfVxuICAgIHBlZWsobGVuZ3RoKSB7XG4gICAgICAgIGlmIChsZW5ndGggPiB0aGlzLm9mZnNldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gcmVhZCBiZXlvbmQgdGhlIGJvdW5kcyBvZiB0aGUgbWFuYWdlZCBpbnRlcm5hbCBkYXRhLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgIH1cbiAgICBnZXQobGVuZ3RoKSB7XG4gICAgICAgIGlmIChsZW5ndGggPiB0aGlzLm9mZnNldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdHRlbXB0ZWQgdG8gcmVhZCBiZXlvbmQgdGhlIGJvdW5kcyBvZiB0aGUgbWFuYWdlZCBpbnRlcm5hbCBkYXRhLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLnNsaWNlKDAsIGxlbmd0aCkuY29weSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmNvcHlXaXRoaW4oMCwgbGVuZ3RoLCBsZW5ndGggKyB0aGlzLm9mZnNldCAtIGxlbmd0aCk7XG4gICAgICAgIHRoaXMub2Zmc2V0IC09IGxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVjZWl2ZUJ1ZmZlciA9IFJlY2VpdmVCdWZmZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWNlaXZlYnVmZmVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zaHVmZmxlQXJyYXkgPSBleHBvcnRzLlNvY2tzQ2xpZW50RXJyb3IgPSB2b2lkIDA7XG4vKipcbiAqIEVycm9yIHdyYXBwZXIgZm9yIFNvY2tzQ2xpZW50XG4gKi9cbmNsYXNzIFNvY2tzQ2xpZW50RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG59XG5leHBvcnRzLlNvY2tzQ2xpZW50RXJyb3IgPSBTb2Nrc0NsaWVudEVycm9yO1xuLyoqXG4gKiBTaHVmZmxlcyBhIGdpdmVuIGFycmF5LlxuICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLlxuICovXG5mdW5jdGlvbiBzaHVmZmxlQXJyYXkoYXJyYXkpIHtcbiAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICBjb25zdCBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgIFthcnJheVtpXSwgYXJyYXlbal1dID0gW2FycmF5W2pdLCBhcnJheVtpXV07XG4gICAgfVxufVxuZXhwb3J0cy5zaHVmZmxlQXJyYXkgPSBzaHVmZmxlQXJyYXk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vY2xpZW50L3NvY2tzY2xpZW50XCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGhhc05hdGl2ZU1hcCA9IHR5cGVvZiBNYXAgIT09IFwidW5kZWZpbmVkXCI7XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB3aGljaCBpcyBhIGNvbWJpbmF0aW9uIG9mIGFuIGFycmF5IGFuZCBhIHNldC4gQWRkaW5nIGEgbmV3XG4gKiBtZW1iZXIgaXMgTygxKSwgdGVzdGluZyBmb3IgbWVtYmVyc2hpcCBpcyBPKDEpLCBhbmQgZmluZGluZyB0aGUgaW5kZXggb2YgYW5cbiAqIGVsZW1lbnQgaXMgTygxKS4gUmVtb3ZpbmcgZWxlbWVudHMgZnJvbSB0aGUgc2V0IGlzIG5vdCBzdXBwb3J0ZWQuIE9ubHlcbiAqIHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBmb3IgbWVtYmVyc2hpcC5cbiAqL1xuZnVuY3Rpb24gQXJyYXlTZXQoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NldCA9IGhhc05hdGl2ZU1hcCA/IG5ldyBNYXAoKSA6IE9iamVjdC5jcmVhdGUobnVsbCk7XG59XG5cbi8qKlxuICogU3RhdGljIG1ldGhvZCBmb3IgY3JlYXRpbmcgQXJyYXlTZXQgaW5zdGFuY2VzIGZyb20gYW4gZXhpc3RpbmcgYXJyYXkuXG4gKi9cbkFycmF5U2V0LmZyb21BcnJheSA9IGZ1bmN0aW9uIEFycmF5U2V0X2Zyb21BcnJheShhQXJyYXksIGFBbGxvd0R1cGxpY2F0ZXMpIHtcbiAgdmFyIHNldCA9IG5ldyBBcnJheVNldCgpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gYUFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgc2V0LmFkZChhQXJyYXlbaV0sIGFBbGxvd0R1cGxpY2F0ZXMpO1xuICB9XG4gIHJldHVybiBzZXQ7XG59O1xuXG4vKipcbiAqIFJldHVybiBob3cgbWFueSB1bmlxdWUgaXRlbXMgYXJlIGluIHRoaXMgQXJyYXlTZXQuIElmIGR1cGxpY2F0ZXMgaGF2ZSBiZWVuXG4gKiBhZGRlZCwgdGhhbiB0aG9zZSBkbyBub3QgY291bnQgdG93YXJkcyB0aGUgc2l6ZS5cbiAqXG4gKiBAcmV0dXJucyBOdW1iZXJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiBBcnJheVNldF9zaXplKCkge1xuICByZXR1cm4gaGFzTmF0aXZlTWFwID8gdGhpcy5fc2V0LnNpemUgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9zZXQpLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQWRkIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhpcyBzZXQuXG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBBcnJheVNldF9hZGQoYVN0ciwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc1N0ciA9IGhhc05hdGl2ZU1hcCA/IGFTdHIgOiB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICB2YXIgaXNEdXBsaWNhdGUgPSBoYXNOYXRpdmVNYXAgPyB0aGlzLmhhcyhhU3RyKSA6IGhhcy5jYWxsKHRoaXMuX3NldCwgc1N0cik7XG4gIHZhciBpZHggPSB0aGlzLl9hcnJheS5sZW5ndGg7XG4gIGlmICghaXNEdXBsaWNhdGUgfHwgYUFsbG93RHVwbGljYXRlcykge1xuICAgIHRoaXMuX2FycmF5LnB1c2goYVN0cik7XG4gIH1cbiAgaWYgKCFpc0R1cGxpY2F0ZSkge1xuICAgIGlmIChoYXNOYXRpdmVNYXApIHtcbiAgICAgIHRoaXMuX3NldC5zZXQoYVN0ciwgaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2V0W3NTdHJdID0gaWR4O1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBJcyB0aGUgZ2l2ZW4gc3RyaW5nIGEgbWVtYmVyIG9mIHRoaXMgc2V0P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gQXJyYXlTZXRfaGFzKGFTdHIpIHtcbiAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgIHJldHVybiB0aGlzLl9zZXQuaGFzKGFTdHIpO1xuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICByZXR1cm4gaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgfVxufTtcblxuLyoqXG4gKiBXaGF0IGlzIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gc3RyaW5nIGluIHRoZSBhcnJheT9cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBBcnJheVNldF9pbmRleE9mKGFTdHIpIHtcbiAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgIHZhciBpZHggPSB0aGlzLl9zZXQuZ2V0KGFTdHIpO1xuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICByZXR1cm4gaWR4O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgc1N0ciA9IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gICAgaWYgKGhhcy5jYWxsKHRoaXMuX3NldCwgc1N0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXRbc1N0cl07XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU3RyICsgJ1wiIGlzIG5vdCBpbiB0aGUgc2V0LicpO1xufTtcblxuLyoqXG4gKiBXaGF0IGlzIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleD9cbiAqXG4gKiBAcGFyYW0gTnVtYmVyIGFJZHhcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmF0ID0gZnVuY3Rpb24gQXJyYXlTZXRfYXQoYUlkeCkge1xuICBpZiAoYUlkeCA+PSAwICYmIGFJZHggPCB0aGlzLl9hcnJheS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyYXlbYUlkeF07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBlbGVtZW50IGluZGV4ZWQgYnkgJyArIGFJZHgpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNldCAod2hpY2ggaGFzIHRoZSBwcm9wZXIgaW5kaWNlc1xuICogaW5kaWNhdGVkIGJ5IGluZGV4T2YpLiBOb3RlIHRoYXQgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIGludGVybmFsIGFycmF5IHVzZWRcbiAqIGZvciBzdG9yaW5nIHRoZSBtZW1iZXJzIHNvIHRoYXQgbm8gb25lIGNhbiBtZXNzIHdpdGggaW50ZXJuYWwgc3RhdGUuXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfdG9BcnJheSgpIHtcbiAgcmV0dXJuIHRoaXMuX2FycmF5LnNsaWNlKCk7XG59O1xuXG5leHBvcnRzLkFycmF5U2V0ID0gQXJyYXlTZXQ7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICpcbiAqIEJhc2VkIG9uIHRoZSBCYXNlIDY0IFZMUSBpbXBsZW1lbnRhdGlvbiBpbiBDbG9zdXJlIENvbXBpbGVyOlxuICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jbG9zdXJlLWNvbXBpbGVyL3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL2NvbS9nb29nbGUvZGVidWdnaW5nL3NvdXJjZW1hcC9CYXNlNjRWTFEuamF2YVxuICpcbiAqIENvcHlyaWdodCAyMDExIFRoZSBDbG9zdXJlIENvbXBpbGVyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZFxuICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xuXG4vLyBBIHNpbmdsZSBiYXNlIDY0IGRpZ2l0IGNhbiBjb250YWluIDYgYml0cyBvZiBkYXRhLiBGb3IgdGhlIGJhc2UgNjQgdmFyaWFibGVcbi8vIGxlbmd0aCBxdWFudGl0aWVzIHdlIHVzZSBpbiB0aGUgc291cmNlIG1hcCBzcGVjLCB0aGUgZmlyc3QgYml0IGlzIHRoZSBzaWduLFxuLy8gdGhlIG5leHQgZm91ciBiaXRzIGFyZSB0aGUgYWN0dWFsIHZhbHVlLCBhbmQgdGhlIDZ0aCBiaXQgaXMgdGhlXG4vLyBjb250aW51YXRpb24gYml0LiBUaGUgY29udGludWF0aW9uIGJpdCB0ZWxscyB1cyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlXG4vLyBkaWdpdHMgaW4gdGhpcyB2YWx1ZSBmb2xsb3dpbmcgdGhpcyBkaWdpdC5cbi8vXG4vLyAgIENvbnRpbnVhdGlvblxuLy8gICB8ICAgIFNpZ25cbi8vICAgfCAgICB8XG4vLyAgIFYgICAgVlxuLy8gICAxMDEwMTFcblxudmFyIFZMUV9CQVNFX1NISUZUID0gNTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQkFTRSA9IDEgPDwgVkxRX0JBU0VfU0hJRlQ7XG5cbi8vIGJpbmFyeTogMDExMTExXG52YXIgVkxRX0JBU0VfTUFTSyA9IFZMUV9CQVNFIC0gMTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQ09OVElOVUFUSU9OX0JJVCA9IFZMUV9CQVNFO1xuXG4vKipcbiAqIENvbnZlcnRzIGZyb20gYSB0d28tY29tcGxlbWVudCB2YWx1ZSB0byBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDEgYmVjb21lcyAyICgxMCBiaW5hcnkpLCAtMSBiZWNvbWVzIDMgKDExIGJpbmFyeSlcbiAqICAgMiBiZWNvbWVzIDQgKDEwMCBiaW5hcnkpLCAtMiBiZWNvbWVzIDUgKDEwMSBiaW5hcnkpXG4gKi9cbmZ1bmN0aW9uIHRvVkxRU2lnbmVkKGFWYWx1ZSkge1xuICByZXR1cm4gYVZhbHVlIDwgMFxuICAgID8gKCgtYVZhbHVlKSA8PCAxKSArIDFcbiAgICA6IChhVmFsdWUgPDwgMSkgKyAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRvIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgZnJvbSBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDIgKDEwIGJpbmFyeSkgYmVjb21lcyAxLCAzICgxMSBiaW5hcnkpIGJlY29tZXMgLTFcbiAqICAgNCAoMTAwIGJpbmFyeSkgYmVjb21lcyAyLCA1ICgxMDEgYmluYXJ5KSBiZWNvbWVzIC0yXG4gKi9cbmZ1bmN0aW9uIGZyb21WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHZhciBpc05lZ2F0aXZlID0gKGFWYWx1ZSAmIDEpID09PSAxO1xuICB2YXIgc2hpZnRlZCA9IGFWYWx1ZSA+PiAxO1xuICByZXR1cm4gaXNOZWdhdGl2ZVxuICAgID8gLXNoaWZ0ZWRcbiAgICA6IHNoaWZ0ZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmFzZSA2NCBWTFEgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZW5jb2RlKGFWYWx1ZSkge1xuICB2YXIgZW5jb2RlZCA9IFwiXCI7XG4gIHZhciBkaWdpdDtcblxuICB2YXIgdmxxID0gdG9WTFFTaWduZWQoYVZhbHVlKTtcblxuICBkbyB7XG4gICAgZGlnaXQgPSB2bHEgJiBWTFFfQkFTRV9NQVNLO1xuICAgIHZscSA+Pj49IFZMUV9CQVNFX1NISUZUO1xuICAgIGlmICh2bHEgPiAwKSB7XG4gICAgICAvLyBUaGVyZSBhcmUgc3RpbGwgbW9yZSBkaWdpdHMgaW4gdGhpcyB2YWx1ZSwgc28gd2UgbXVzdCBtYWtlIHN1cmUgdGhlXG4gICAgICAvLyBjb250aW51YXRpb24gYml0IGlzIG1hcmtlZC5cbiAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUO1xuICAgIH1cbiAgICBlbmNvZGVkICs9IGJhc2U2NC5lbmNvZGUoZGlnaXQpO1xuICB9IHdoaWxlICh2bHEgPiAwKTtcblxuICByZXR1cm4gZW5jb2RlZDtcbn07XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgbmV4dCBiYXNlIDY0IFZMUSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgdGhlXG4gKiB2YWx1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB2aWEgdGhlIG91dCBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2RlY29kZShhU3RyLCBhSW5kZXgsIGFPdXRQYXJhbSkge1xuICB2YXIgc3RyTGVuID0gYVN0ci5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSAwO1xuICB2YXIgc2hpZnQgPSAwO1xuICB2YXIgY29udGludWF0aW9uLCBkaWdpdDtcblxuICBkbyB7XG4gICAgaWYgKGFJbmRleCA+PSBzdHJMZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG1vcmUgZGlnaXRzIGluIGJhc2UgNjQgVkxRIHZhbHVlLlwiKTtcbiAgICB9XG5cbiAgICBkaWdpdCA9IGJhc2U2NC5kZWNvZGUoYVN0ci5jaGFyQ29kZUF0KGFJbmRleCsrKSk7XG4gICAgaWYgKGRpZ2l0ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYXNlNjQgZGlnaXQ6IFwiICsgYVN0ci5jaGFyQXQoYUluZGV4IC0gMSkpO1xuICAgIH1cblxuICAgIGNvbnRpbnVhdGlvbiA9ICEhKGRpZ2l0ICYgVkxRX0NPTlRJTlVBVElPTl9CSVQpO1xuICAgIGRpZ2l0ICY9IFZMUV9CQVNFX01BU0s7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICsgKGRpZ2l0IDw8IHNoaWZ0KTtcbiAgICBzaGlmdCArPSBWTFFfQkFTRV9TSElGVDtcbiAgfSB3aGlsZSAoY29udGludWF0aW9uKTtcblxuICBhT3V0UGFyYW0udmFsdWUgPSBmcm9tVkxRU2lnbmVkKHJlc3VsdCk7XG4gIGFPdXRQYXJhbS5yZXN0ID0gYUluZGV4O1xufTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGludFRvQ2hhck1hcCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJy5zcGxpdCgnJyk7XG5cbi8qKlxuICogRW5jb2RlIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIG9mIDAgdG8gNjMgdG8gYSBzaW5nbGUgYmFzZSA2NCBkaWdpdC5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gIGlmICgwIDw9IG51bWJlciAmJiBudW1iZXIgPCBpbnRUb0NoYXJNYXAubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGludFRvQ2hhck1hcFtudW1iZXJdO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNdXN0IGJlIGJldHdlZW4gMCBhbmQgNjM6IFwiICsgbnVtYmVyKTtcbn07XG5cbi8qKlxuICogRGVjb2RlIGEgc2luZ2xlIGJhc2UgNjQgY2hhcmFjdGVyIGNvZGUgZGlnaXQgdG8gYW4gaW50ZWdlci4gUmV0dXJucyAtMSBvblxuICogZmFpbHVyZS5cbiAqL1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiAoY2hhckNvZGUpIHtcbiAgdmFyIGJpZ0EgPSA2NTsgICAgIC8vICdBJ1xuICB2YXIgYmlnWiA9IDkwOyAgICAgLy8gJ1onXG5cbiAgdmFyIGxpdHRsZUEgPSA5NzsgIC8vICdhJ1xuICB2YXIgbGl0dGxlWiA9IDEyMjsgLy8gJ3onXG5cbiAgdmFyIHplcm8gPSA0ODsgICAgIC8vICcwJ1xuICB2YXIgbmluZSA9IDU3OyAgICAgLy8gJzknXG5cbiAgdmFyIHBsdXMgPSA0MzsgICAgIC8vICcrJ1xuICB2YXIgc2xhc2ggPSA0NzsgICAgLy8gJy8nXG5cbiAgdmFyIGxpdHRsZU9mZnNldCA9IDI2O1xuICB2YXIgbnVtYmVyT2Zmc2V0ID0gNTI7XG5cbiAgLy8gMCAtIDI1OiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWlxuICBpZiAoYmlnQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBiaWdaKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIGJpZ0EpO1xuICB9XG5cbiAgLy8gMjYgLSA1MTogYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcbiAgaWYgKGxpdHRsZUEgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gbGl0dGxlWikge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSBsaXR0bGVBICsgbGl0dGxlT2Zmc2V0KTtcbiAgfVxuXG4gIC8vIDUyIC0gNjE6IDAxMjM0NTY3ODlcbiAgaWYgKHplcm8gPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gbmluZSkge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSB6ZXJvICsgbnVtYmVyT2Zmc2V0KTtcbiAgfVxuXG4gIC8vIDYyOiArXG4gIGlmIChjaGFyQ29kZSA9PSBwbHVzKSB7XG4gICAgcmV0dXJuIDYyO1xuICB9XG5cbiAgLy8gNjM6IC9cbiAgaWYgKGNoYXJDb2RlID09IHNsYXNoKSB7XG4gICAgcmV0dXJuIDYzO1xuICB9XG5cbiAgLy8gSW52YWxpZCBiYXNlNjQgZGlnaXQuXG4gIHJldHVybiAtMTtcbn07XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIG1hcHBpbmdCIGlzIGFmdGVyIG1hcHBpbmdBIHdpdGggcmVzcGVjdCB0byBnZW5lcmF0ZWRcbiAqIHBvc2l0aW9uLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZWRQb3NpdGlvbkFmdGVyKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICAvLyBPcHRpbWl6ZWQgZm9yIG1vc3QgY29tbW9uIGNhc2VcbiAgdmFyIGxpbmVBID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZTtcbiAgdmFyIGxpbmVCID0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgdmFyIGNvbHVtbkEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW47XG4gIHZhciBjb2x1bW5CID0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICByZXR1cm4gbGluZUIgPiBsaW5lQSB8fCBsaW5lQiA9PSBsaW5lQSAmJiBjb2x1bW5CID49IGNvbHVtbkEgfHxcbiAgICAgICAgIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCKSA8PSAwO1xufVxuXG4vKipcbiAqIEEgZGF0YSBzdHJ1Y3R1cmUgdG8gcHJvdmlkZSBhIHNvcnRlZCB2aWV3IG9mIGFjY3VtdWxhdGVkIG1hcHBpbmdzIGluIGFcbiAqIHBlcmZvcm1hbmNlIGNvbnNjaW91cyBtYW5uZXIuIEl0IHRyYWRlcyBhIG5lZ2xpYmFibGUgb3ZlcmhlYWQgaW4gZ2VuZXJhbFxuICogY2FzZSBmb3IgYSBsYXJnZSBzcGVlZHVwIGluIGNhc2Ugb2YgbWFwcGluZ3MgYmVpbmcgYWRkZWQgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmdMaXN0KCkge1xuICB0aGlzLl9hcnJheSA9IFtdO1xuICB0aGlzLl9zb3J0ZWQgPSB0cnVlO1xuICAvLyBTZXJ2ZXMgYXMgaW5maW11bVxuICB0aGlzLl9sYXN0ID0ge2dlbmVyYXRlZExpbmU6IC0xLCBnZW5lcmF0ZWRDb2x1bW46IDB9O1xufVxuXG4vKipcbiAqIEl0ZXJhdGUgdGhyb3VnaCBpbnRlcm5hbCBpdGVtcy4gVGhpcyBtZXRob2QgdGFrZXMgdGhlIHNhbWUgYXJndW1lbnRzIHRoYXRcbiAqIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgdGFrZXMuXG4gKlxuICogTk9URTogVGhlIG9yZGVyIG9mIHRoZSBtYXBwaW5ncyBpcyBOT1QgZ3VhcmFudGVlZC5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnVuc29ydGVkRm9yRWFjaCA9XG4gIGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2ZvckVhY2goYUNhbGxiYWNrLCBhVGhpc0FyZykge1xuICAgIHRoaXMuX2FycmF5LmZvckVhY2goYUNhbGxiYWNrLCBhVGhpc0FyZyk7XG4gIH07XG5cbi8qKlxuICogQWRkIHRoZSBnaXZlbiBzb3VyY2UgbWFwcGluZy5cbiAqXG4gKiBAcGFyYW0gT2JqZWN0IGFNYXBwaW5nXG4gKi9cbk1hcHBpbmdMaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF9hZGQoYU1hcHBpbmcpIHtcbiAgaWYgKGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIodGhpcy5fbGFzdCwgYU1hcHBpbmcpKSB7XG4gICAgdGhpcy5fbGFzdCA9IGFNYXBwaW5nO1xuICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX3NvcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGZsYXQsIHNvcnRlZCBhcnJheSBvZiBtYXBwaW5ncy4gVGhlIG1hcHBpbmdzIGFyZSBzb3J0ZWQgYnlcbiAqIGdlbmVyYXRlZCBwb3NpdGlvbi5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCByZXR1cm5zIGludGVybmFsIGRhdGEgd2l0aG91dCBjb3B5aW5nLCBmb3JcbiAqIHBlcmZvcm1hbmNlLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgTk9UIGJlIG11dGF0ZWQsIGFuZCBzaG91bGQgYmUgdHJlYXRlZCBhc1xuICogYW4gaW1tdXRhYmxlIGJvcnJvdy4gSWYgeW91IHdhbnQgdG8gdGFrZSBvd25lcnNoaXAsIHlvdSBtdXN0IG1ha2UgeW91ciBvd25cbiAqIGNvcHkuXG4gKi9cbk1hcHBpbmdMaXN0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gTWFwcGluZ0xpc3RfdG9BcnJheSgpIHtcbiAgaWYgKCF0aGlzLl9zb3J0ZWQpIHtcbiAgICB0aGlzLl9hcnJheS5zb3J0KHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQpO1xuICAgIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2FycmF5O1xufTtcblxuZXhwb3J0cy5NYXBwaW5nTGlzdCA9IE1hcHBpbmdMaXN0O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG4vLyBJdCB0dXJucyBvdXQgdGhhdCBzb21lIChtb3N0PykgSmF2YVNjcmlwdCBlbmdpbmVzIGRvbid0IHNlbGYtaG9zdFxuLy8gYEFycmF5LnByb3RvdHlwZS5zb3J0YC4gVGhpcyBtYWtlcyBzZW5zZSBiZWNhdXNlIEMrKyB3aWxsIGxpa2VseSByZW1haW5cbi8vIGZhc3RlciB0aGFuIEpTIHdoZW4gZG9pbmcgcmF3IENQVS1pbnRlbnNpdmUgc29ydGluZy4gSG93ZXZlciwgd2hlbiB1c2luZyBhXG4vLyBjdXN0b20gY29tcGFyYXRvciBmdW5jdGlvbiwgY2FsbGluZyBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIHRoZSBWTSdzIEMrKyBhbmRcbi8vIEpJVCdkIEpTIGlzIHJhdGhlciBzbG93ICphbmQqIGxvc2VzIEpJVCB0eXBlIGluZm9ybWF0aW9uLCByZXN1bHRpbmcgaW5cbi8vIHdvcnNlIGdlbmVyYXRlZCBjb2RlIGZvciB0aGUgY29tcGFyYXRvciBmdW5jdGlvbiB0aGFuIHdvdWxkIGJlIG9wdGltYWwuIEluXG4vLyBmYWN0LCB3aGVuIHNvcnRpbmcgd2l0aCBhIGNvbXBhcmF0b3IsIHRoZXNlIGNvc3RzIG91dHdlaWdoIHRoZSBiZW5lZml0cyBvZlxuLy8gc29ydGluZyBpbiBDKysuIEJ5IHVzaW5nIG91ciBvd24gSlMtaW1wbGVtZW50ZWQgUXVpY2sgU29ydCAoYmVsb3cpLCB3ZSBnZXRcbi8vIGEgfjM1MDBtcyBtZWFuIHNwZWVkLXVwIGluIGBiZW5jaC9iZW5jaC5odG1sYC5cblxuLyoqXG4gKiBTd2FwIHRoZSBlbGVtZW50cyBpbmRleGVkIGJ5IGB4YCBhbmQgYHlgIGluIHRoZSBhcnJheSBgYXJ5YC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBUaGUgYXJyYXkuXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogICAgICAgIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgaXRlbS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBzZWNvbmQgaXRlbS5cbiAqL1xuZnVuY3Rpb24gc3dhcChhcnksIHgsIHkpIHtcbiAgdmFyIHRlbXAgPSBhcnlbeF07XG4gIGFyeVt4XSA9IGFyeVt5XTtcbiAgYXJ5W3ldID0gdGVtcDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgd2l0aGluIHRoZSByYW5nZSBgbG93IC4uIGhpZ2hgIGluY2x1c2l2ZS5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbG93XG4gKiAgICAgICAgVGhlIGxvd2VyIGJvdW5kIG9uIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBoaWdoXG4gKiAgICAgICAgVGhlIHVwcGVyIGJvdW5kIG9uIHRoZSByYW5nZS5cbiAqL1xuZnVuY3Rpb24gcmFuZG9tSW50SW5SYW5nZShsb3csIGhpZ2gpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQobG93ICsgKE1hdGgucmFuZG9tKCkgKiAoaGlnaCAtIGxvdykpKTtcbn1cblxuLyoqXG4gKiBUaGUgUXVpY2sgU29ydCBhbGdvcml0aG0uXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJ5XG4gKiAgICAgICAgQW4gYXJyYXkgdG8gc29ydC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbXBhcmF0b3JcbiAqICAgICAgICBGdW5jdGlvbiB0byB1c2UgdG8gY29tcGFyZSB0d28gaXRlbXMuXG4gKiBAcGFyYW0ge051bWJlcn0gcFxuICogICAgICAgIFN0YXJ0IGluZGV4IG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IHJcbiAqICAgICAgICBFbmQgaW5kZXggb2YgdGhlIGFycmF5XG4gKi9cbmZ1bmN0aW9uIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgcCwgcikge1xuICAvLyBJZiBvdXIgbG93ZXIgYm91bmQgaXMgbGVzcyB0aGFuIG91ciB1cHBlciBib3VuZCwgd2UgKDEpIHBhcnRpdGlvbiB0aGVcbiAgLy8gYXJyYXkgaW50byB0d28gcGllY2VzIGFuZCAoMikgcmVjdXJzZSBvbiBlYWNoIGhhbGYuIElmIGl0IGlzIG5vdCwgdGhpcyBpc1xuICAvLyB0aGUgZW1wdHkgYXJyYXkgYW5kIG91ciBiYXNlIGNhc2UuXG5cbiAgaWYgKHAgPCByKSB7XG4gICAgLy8gKDEpIFBhcnRpdGlvbmluZy5cbiAgICAvL1xuICAgIC8vIFRoZSBwYXJ0aXRpb25pbmcgY2hvb3NlcyBhIHBpdm90IGJldHdlZW4gYHBgIGFuZCBgcmAgYW5kIG1vdmVzIGFsbFxuICAgIC8vIGVsZW1lbnRzIHRoYXQgYXJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcGl2b3QgdG8gdGhlIGJlZm9yZSBpdCwgYW5kXG4gICAgLy8gYWxsIHRoZSBlbGVtZW50cyB0aGF0IGFyZSBncmVhdGVyIHRoYW4gaXQgYWZ0ZXIgaXQuIFRoZSBlZmZlY3QgaXMgdGhhdFxuICAgIC8vIG9uY2UgcGFydGl0aW9uIGlzIGRvbmUsIHRoZSBwaXZvdCBpcyBpbiB0aGUgZXhhY3QgcGxhY2UgaXQgd2lsbCBiZSB3aGVuXG4gICAgLy8gdGhlIGFycmF5IGlzIHB1dCBpbiBzb3J0ZWQgb3JkZXIsIGFuZCBpdCB3aWxsIG5vdCBuZWVkIHRvIGJlIG1vdmVkXG4gICAgLy8gYWdhaW4uIFRoaXMgcnVucyBpbiBPKG4pIHRpbWUuXG5cbiAgICAvLyBBbHdheXMgY2hvb3NlIGEgcmFuZG9tIHBpdm90IHNvIHRoYXQgYW4gaW5wdXQgYXJyYXkgd2hpY2ggaXMgcmV2ZXJzZVxuICAgIC8vIHNvcnRlZCBkb2VzIG5vdCBjYXVzZSBPKG5eMikgcnVubmluZyB0aW1lLlxuICAgIHZhciBwaXZvdEluZGV4ID0gcmFuZG9tSW50SW5SYW5nZShwLCByKTtcbiAgICB2YXIgaSA9IHAgLSAxO1xuXG4gICAgc3dhcChhcnksIHBpdm90SW5kZXgsIHIpO1xuICAgIHZhciBwaXZvdCA9IGFyeVtyXTtcblxuICAgIC8vIEltbWVkaWF0ZWx5IGFmdGVyIGBqYCBpcyBpbmNyZW1lbnRlZCBpbiB0aGlzIGxvb3AsIHRoZSBmb2xsb3dpbmcgaG9sZFxuICAgIC8vIHRydWU6XG4gICAgLy9cbiAgICAvLyAgICogRXZlcnkgZWxlbWVudCBpbiBgYXJ5W3AgLi4gaV1gIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcGl2b3QuXG4gICAgLy9cbiAgICAvLyAgICogRXZlcnkgZWxlbWVudCBpbiBgYXJ5W2krMSAuLiBqLTFdYCBpcyBncmVhdGVyIHRoYW4gdGhlIHBpdm90LlxuICAgIGZvciAodmFyIGogPSBwOyBqIDwgcjsgaisrKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcihhcnlbal0sIHBpdm90KSA8PSAwKSB7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgc3dhcChhcnksIGksIGopO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3YXAoYXJ5LCBpICsgMSwgaik7XG4gICAgdmFyIHEgPSBpICsgMTtcblxuICAgIC8vICgyKSBSZWN1cnNlIG9uIGVhY2ggaGFsZi5cblxuICAgIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgcCwgcSAtIDEpO1xuICAgIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgcSArIDEsIHIpO1xuICB9XG59XG5cbi8qKlxuICogU29ydCB0aGUgZ2l2ZW4gYXJyYXkgaW4tcGxhY2Ugd2l0aCB0aGUgZ2l2ZW4gY29tcGFyYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqL1xuZXhwb3J0cy5xdWlja1NvcnQgPSBmdW5jdGlvbiAoYXJ5LCBjb21wYXJhdG9yKSB7XG4gIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgMCwgYXJ5Lmxlbmd0aCAtIDEpO1xufTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBiaW5hcnlTZWFyY2ggPSByZXF1aXJlKCcuL2JpbmFyeS1zZWFyY2gnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG52YXIgcXVpY2tTb3J0ID0gcmVxdWlyZSgnLi9xdWljay1zb3J0JykucXVpY2tTb3J0O1xuXG5mdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gIHZhciBzb3VyY2VNYXAgPSBhU291cmNlTWFwO1xuICBpZiAodHlwZW9mIGFTb3VyY2VNYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgc291cmNlTWFwID0gdXRpbC5wYXJzZVNvdXJjZU1hcElucHV0KGFTb3VyY2VNYXApO1xuICB9XG5cbiAgcmV0dXJuIHNvdXJjZU1hcC5zZWN0aW9ucyAhPSBudWxsXG4gICAgPyBuZXcgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTClcbiAgICA6IG5ldyBCYXNpY1NvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCk7XG59XG5cblNvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPSBmdW5jdGlvbihhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gIHJldHVybiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCk7XG59XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vLyBgX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kIGBfX29yaWdpbmFsTWFwcGluZ3NgIGFyZSBhcnJheXMgdGhhdCBob2xkIHRoZVxuLy8gcGFyc2VkIG1hcHBpbmcgY29vcmRpbmF0ZXMgZnJvbSB0aGUgc291cmNlIG1hcCdzIFwibWFwcGluZ3NcIiBhdHRyaWJ1dGUuIFRoZXlcbi8vIGFyZSBsYXppbHkgaW5zdGFudGlhdGVkLCBhY2Nlc3NlZCB2aWEgdGhlIGBfZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuLy8gYF9vcmlnaW5hbE1hcHBpbmdzYCBnZXR0ZXJzIHJlc3BlY3RpdmVseSwgYW5kIHdlIG9ubHkgcGFyc2UgdGhlIG1hcHBpbmdzXG4vLyBhbmQgY3JlYXRlIHRoZXNlIGFycmF5cyBvbmNlIHF1ZXJpZWQgZm9yIGEgc291cmNlIGxvY2F0aW9uLiBXZSBqdW1wIHRocm91Z2hcbi8vIHRoZXNlIGhvb3BzIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG1hbnkgdGhvdXNhbmRzIG9mIG1hcHBpbmdzLCBhbmQgcGFyc2luZ1xuLy8gdGhlbSBpcyBleHBlbnNpdmUsIHNvIHdlIG9ubHkgd2FudCB0byBkbyBpdCBpZiB3ZSBtdXN0LlxuLy9cbi8vIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheXMgaXMgb2YgdGhlIGZvcm06XG4vL1xuLy8gICAgIHtcbi8vICAgICAgIGdlbmVyYXRlZExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBnZW5lcmF0ZWRDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIHNvdXJjZTogVGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXNcbi8vICAgICAgICAgICAgICAgY2h1bmsgb2YgY29kZSxcbi8vICAgICAgIG9yaWdpbmFsTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sIHdoaWNoIGdlbmVyYXRlZCB0aGlzIGNodW5rIG9mXG4vLyAgICAgICAgICAgICBjb2RlLlxuLy8gICAgIH1cbi8vXG4vLyBBbGwgcHJvcGVydGllcyBleGNlcHQgZm9yIGBnZW5lcmF0ZWRMaW5lYCBhbmQgYGdlbmVyYXRlZENvbHVtbmAgY2FuIGJlXG4vLyBgbnVsbGAuXG4vL1xuLy8gYF9nZW5lcmF0ZWRNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucy5cbi8vXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucy5cblxuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBudWxsO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19nZW5lcmF0ZWRNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncykge1xuICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzO1xuICB9XG59KTtcblxuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX29yaWdpbmFsTWFwcGluZ3MnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncykge1xuICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fX29yaWdpbmFsTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGluZGV4KSB7XG4gICAgdmFyIGMgPSBhU3RyLmNoYXJBdChpbmRleCk7XG4gICAgcmV0dXJuIGMgPT09IFwiO1wiIHx8IGMgPT09IFwiLFwiO1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgX3BhcnNlTWFwcGluZ3NcIik7XG4gIH07XG5cblNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUiA9IDE7XG5Tb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUiA9IDI7XG5cblNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EID0gMjtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgZWFjaCBtYXBwaW5nIGJldHdlZW4gYW4gb3JpZ2luYWwgc291cmNlL2xpbmUvY29sdW1uIGFuZCBhXG4gKiBnZW5lcmF0ZWQgbGluZS9jb2x1bW4gaW4gdGhpcyBzb3VyY2UgbWFwLlxuICpcbiAqIEBwYXJhbSBGdW5jdGlvbiBhQ2FsbGJhY2tcbiAqICAgICAgICBUaGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2l0aCBlYWNoIG1hcHBpbmcuXG4gKiBAcGFyYW0gT2JqZWN0IGFDb250ZXh0XG4gKiAgICAgICAgT3B0aW9uYWwuIElmIHNwZWNpZmllZCwgdGhpcyBvYmplY3Qgd2lsbCBiZSB0aGUgdmFsdWUgb2YgYHRoaXNgIGV2ZXJ5XG4gKiAgICAgICAgdGltZSB0aGF0IGBhQ2FsbGJhY2tgIGlzIGNhbGxlZC5cbiAqIEBwYXJhbSBhT3JkZXJcbiAqICAgICAgICBFaXRoZXIgYFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUmAgb3JcbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVJgLiBTcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0b1xuICogICAgICAgIGl0ZXJhdGUgb3ZlciB0aGUgbWFwcGluZ3Mgc29ydGVkIGJ5IHRoZSBnZW5lcmF0ZWQgZmlsZSdzIGxpbmUvY29sdW1uXG4gKiAgICAgICAgb3JkZXIgb3IgdGhlIG9yaWdpbmFsJ3Mgc291cmNlL2xpbmUvY29sdW1uIG9yZGVyLCByZXNwZWN0aXZlbHkuIERlZmF1bHRzIHRvXG4gKiAgICAgICAgYFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUmAuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5lYWNoTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2VhY2hNYXBwaW5nKGFDYWxsYmFjaywgYUNvbnRleHQsIGFPcmRlcikge1xuICAgIHZhciBjb250ZXh0ID0gYUNvbnRleHQgfHwgbnVsbDtcbiAgICB2YXIgb3JkZXIgPSBhT3JkZXIgfHwgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSO1xuXG4gICAgdmFyIG1hcHBpbmdzO1xuICAgIHN3aXRjaCAob3JkZXIpIHtcbiAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUjpcbiAgICAgIG1hcHBpbmdzID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gb3JkZXIgb2YgaXRlcmF0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuc291cmNlUm9vdDtcbiAgICBtYXBwaW5ncy5tYXAoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBtYXBwaW5nLnNvdXJjZSA9PT0gbnVsbCA/IG51bGwgOiB0aGlzLl9zb3VyY2VzLmF0KG1hcHBpbmcuc291cmNlKTtcbiAgICAgIHNvdXJjZSA9IHV0aWwuY29tcHV0ZVNvdXJjZVVSTChzb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uLFxuICAgICAgICBvcmlnaW5hbExpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgbmFtZTogbWFwcGluZy5uYW1lID09PSBudWxsID8gbnVsbCA6IHRoaXMuX25hbWVzLmF0KG1hcHBpbmcubmFtZSlcbiAgICAgIH07XG4gICAgfSwgdGhpcykuZm9yRWFjaChhQ2FsbGJhY2ssIGNvbnRleHQpO1xuICB9O1xuXG4vKipcbiAqIFJldHVybnMgYWxsIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHByb3ZpZGVkLiBJZiBubyBjb2x1bW4gaXMgcHJvdmlkZWQsIHJldHVybnMgYWxsIG1hcHBpbmdzXG4gKiBjb3JyZXNwb25kaW5nIHRvIGEgZWl0aGVyIHRoZSBsaW5lIHdlIGFyZSBzZWFyY2hpbmcgZm9yIG9yIHRoZSBuZXh0XG4gKiBjbG9zZXN0IGxpbmUgdGhhdCBoYXMgYW55IG1hcHBpbmdzLiBPdGhlcndpc2UsIHJldHVybnMgYWxsIG1hcHBpbmdzXG4gKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaW5lIGFuZCBlaXRoZXIgdGhlIGNvbHVtbiB3ZSBhcmUgc2VhcmNoaW5nIGZvclxuICogb3IgdGhlIG5leHQgY2xvc2VzdCBjb2x1bW4gdGhhdCBoYXMgYW55IG9mZnNldHMuXG4gKlxuICogVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBmaWxlbmFtZSBvZiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBPcHRpb25hbC4gdGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgIFRoZSBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKlxuICogYW5kIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcmV0dXJuZWQsIGVhY2ggd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmFsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2FsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvcihhQXJncykge1xuICAgIHZhciBsaW5lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyk7XG5cbiAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGV4YWN0IG1hdGNoLCBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmdcbiAgICAvLyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCBtYXBwaW5nIGxlc3MgdGhhbiB0aGUgbmVlZGxlLiBCeVxuICAgIC8vIHNldHRpbmcgbmVlZGxlLm9yaWdpbmFsQ29sdW1uIHRvIDAsIHdlIHRodXMgZmluZCB0aGUgbGFzdCBtYXBwaW5nIGZvclxuICAgIC8vIHRoZSBnaXZlbiBsaW5lLCBwcm92aWRlZCBzdWNoIGEgbWFwcGluZyBleGlzdHMuXG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIHNvdXJjZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSxcbiAgICAgIG9yaWdpbmFsTGluZTogbGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicsIDApXG4gICAgfTtcblxuICAgIG5lZWRsZS5zb3VyY2UgPSB0aGlzLl9maW5kU291cmNlSW5kZXgobmVlZGxlLnNvdXJjZSk7XG4gICAgaWYgKG5lZWRsZS5zb3VyY2UgPCAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIG1hcHBpbmdzID0gW107XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhuZWVkbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsTGluZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmFyeVNlYXJjaC5MRUFTVF9VUFBFUl9CT1VORCk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChhQXJncy5jb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgb3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB1bnRpbCBlaXRoZXIgd2UgcnVuIG91dCBvZiBtYXBwaW5ncywgb3Igd2UgcnVuIGludG9cbiAgICAgICAgLy8gYSBtYXBwaW5nIGZvciBhIGRpZmZlcmVudCBsaW5lIHRoYW4gdGhlIG9uZSB3ZSBmb3VuZC4gU2luY2VcbiAgICAgICAgLy8gbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBmb3VuZC5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09IG9yaWdpbmFsTGluZSkge1xuICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZExpbmUnLCBudWxsKSxcbiAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbKytpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBvcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB1bnRpbCBlaXRoZXIgd2UgcnVuIG91dCBvZiBtYXBwaW5ncywgb3Igd2UgcnVuIGludG9cbiAgICAgICAgLy8gYSBtYXBwaW5nIGZvciBhIGRpZmZlcmVudCBsaW5lIHRoYW4gdGhlIG9uZSB3ZSB3ZXJlIHNlYXJjaGluZyBmb3IuXG4gICAgICAgIC8vIFNpbmNlIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBmaW5kIGFsbCBtYXBwaW5ncyBmb3JcbiAgICAgICAgLy8gdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IuXG4gICAgICAgIHdoaWxlIChtYXBwaW5nICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gbGluZSAmJlxuICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9PSBvcmlnaW5hbENvbHVtbikge1xuICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZExpbmUnLCBudWxsKSxcbiAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbKytpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFwcGluZ3M7XG4gIH07XG5cbmV4cG9ydHMuU291cmNlTWFwQ29uc3VtZXIgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuLyoqXG4gKiBBIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5zdGFuY2UgcmVwcmVzZW50cyBhIHBhcnNlZCBzb3VyY2UgbWFwIHdoaWNoIHdlIGNhblxuICogcXVlcnkgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBmaWxlIHBvc2l0aW9ucyBieSBnaXZpbmcgaXQgYSBmaWxlXG4gKiBwb3NpdGlvbiBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqXG4gKiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yXG4gKiBhbHJlYWR5IHBhcnNlZCB0byBhbiBvYmplY3QpLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHNvdXJjZSBtYXBzIGhhdmUgdGhlXG4gKiBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqXG4gKiAgIC0gdmVyc2lvbjogV2hpY2ggdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcCBzcGVjIHRoaXMgbWFwIGlzIGZvbGxvd2luZy5cbiAqICAgLSBzb3VyY2VzOiBBbiBhcnJheSBvZiBVUkxzIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbmFtZXM6IEFuIGFycmF5IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSByZWZlcnJlbmNlZCBieSBpbmRpdmlkdWFsIG1hcHBpbmdzLlxuICogICAtIHNvdXJjZVJvb3Q6IE9wdGlvbmFsLiBUaGUgVVJMIHJvb3QgZnJvbSB3aGljaCBhbGwgc291cmNlcyBhcmUgcmVsYXRpdmUuXG4gKiAgIC0gc291cmNlc0NvbnRlbnQ6IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLlxuICogICAtIG1hcHBpbmdzOiBBIHN0cmluZyBvZiBiYXNlNjQgVkxRcyB3aGljaCBjb250YWluIHRoZSBhY3R1YWwgbWFwcGluZ3MuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICpcbiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF06XG4gKlxuICogICAgIHtcbiAqICAgICAgIHZlcnNpb24gOiAzLFxuICogICAgICAgZmlsZTogXCJvdXQuanNcIixcbiAqICAgICAgIHNvdXJjZVJvb3QgOiBcIlwiLFxuICogICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICogICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICBtYXBwaW5nczogXCJBQSxBQjs7QUJDREU7XCJcbiAqICAgICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0P3BsaT0xI1xuICovXG5mdW5jdGlvbiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNvdXJjZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzJyk7XG4gIC8vIFNhc3MgMy4zIGxlYXZlcyBvdXQgdGhlICduYW1lcycgYXJyYXksIHNvIHdlIGRldmlhdGUgZnJvbSB0aGUgc3BlYyAod2hpY2hcbiAgLy8gcmVxdWlyZXMgdGhlIGFycmF5KSB0byBwbGF5IG5pY2UgaGVyZS5cbiAgdmFyIG5hbWVzID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnbmFtZXMnLCBbXSk7XG4gIHZhciBzb3VyY2VSb290ID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB2YXIgc291cmNlc0NvbnRlbnQgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzQ29udGVudCcsIG51bGwpO1xuICB2YXIgbWFwcGluZ3MgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdtYXBwaW5ncycpO1xuICB2YXIgZmlsZSA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ2ZpbGUnLCBudWxsKTtcblxuICAvLyBPbmNlIGFnYWluLCBTYXNzIGRldmlhdGVzIGZyb20gdGhlIHNwZWMgYW5kIHN1cHBsaWVzIHRoZSB2ZXJzaW9uIGFzIGFcbiAgLy8gc3RyaW5nIHJhdGhlciB0aGFuIGEgbnVtYmVyLCBzbyB3ZSB1c2UgbG9vc2UgZXF1YWxpdHkgY2hlY2tpbmcgaGVyZS5cbiAgaWYgKHZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICB9XG5cbiAgaWYgKHNvdXJjZVJvb3QpIHtcbiAgICBzb3VyY2VSb290ID0gdXRpbC5ub3JtYWxpemUoc291cmNlUm9vdCk7XG4gIH1cblxuICBzb3VyY2VzID0gc291cmNlc1xuICAgIC5tYXAoU3RyaW5nKVxuICAgIC8vIFNvbWUgc291cmNlIG1hcHMgcHJvZHVjZSByZWxhdGl2ZSBzb3VyY2UgcGF0aHMgbGlrZSBcIi4vZm9vLmpzXCIgaW5zdGVhZCBvZlxuICAgIC8vIFwiZm9vLmpzXCIuICBOb3JtYWxpemUgdGhlc2UgZmlyc3Qgc28gdGhhdCBmdXR1cmUgY29tcGFyaXNvbnMgd2lsbCBzdWNjZWVkLlxuICAgIC8vIFNlZSBidWd6aWwubGEvMTA5MDc2OC5cbiAgICAubWFwKHV0aWwubm9ybWFsaXplKVxuICAgIC8vIEFsd2F5cyBlbnN1cmUgdGhhdCBhYnNvbHV0ZSBzb3VyY2VzIGFyZSBpbnRlcm5hbGx5IHN0b3JlZCByZWxhdGl2ZSB0b1xuICAgIC8vIHRoZSBzb3VyY2Ugcm9vdCwgaWYgdGhlIHNvdXJjZSByb290IGlzIGFic29sdXRlLiBOb3QgZG9pbmcgdGhpcyB3b3VsZFxuICAgIC8vIGJlIHBhcnRpY3VsYXJseSBwcm9ibGVtYXRpYyB3aGVuIHRoZSBzb3VyY2Ugcm9vdCBpcyBhIHByZWZpeCBvZiB0aGVcbiAgICAvLyBzb3VyY2UgKHZhbGlkLCBidXQgd2h5Pz8pLiBTZWUgZ2l0aHViIGlzc3VlICMxOTkgYW5kIGJ1Z3ppbC5sYS8xMTg4OTgyLlxuICAgIC5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIHNvdXJjZVJvb3QgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZVJvb3QpICYmIHV0aWwuaXNBYnNvbHV0ZShzb3VyY2UpXG4gICAgICAgID8gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2UpXG4gICAgICAgIDogc291cmNlO1xuICAgIH0pO1xuXG4gIC8vIFBhc3MgYHRydWVgIGJlbG93IHRvIGFsbG93IGR1cGxpY2F0ZSBuYW1lcyBhbmQgc291cmNlcy4gV2hpbGUgc291cmNlIG1hcHNcbiAgLy8gYXJlIGludGVuZGVkIHRvIGJlIGNvbXByZXNzZWQgYW5kIGRlZHVwbGljYXRlZCwgdGhlIFR5cGVTY3JpcHQgY29tcGlsZXJcbiAgLy8gc29tZXRpbWVzIGdlbmVyYXRlcyBzb3VyY2UgbWFwcyB3aXRoIGR1cGxpY2F0ZXMgaW4gdGhlbS4gU2VlIEdpdGh1YiBpc3N1ZVxuICAvLyAjNzIgYW5kIGJ1Z3ppbC5sYS84ODk0OTIuXG4gIHRoaXMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KG5hbWVzLm1hcChTdHJpbmcpLCB0cnVlKTtcbiAgdGhpcy5fc291cmNlcyA9IEFycmF5U2V0LmZyb21BcnJheShzb3VyY2VzLCB0cnVlKTtcblxuICB0aGlzLl9hYnNvbHV0ZVNvdXJjZXMgPSB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHMsIGFTb3VyY2VNYXBVUkwpO1xuICB9KTtcblxuICB0aGlzLnNvdXJjZVJvb3QgPSBzb3VyY2VSb290O1xuICB0aGlzLnNvdXJjZXNDb250ZW50ID0gc291cmNlc0NvbnRlbnQ7XG4gIHRoaXMuX21hcHBpbmdzID0gbWFwcGluZ3M7XG4gIHRoaXMuX3NvdXJjZU1hcFVSTCA9IGFTb3VyY2VNYXBVUkw7XG4gIHRoaXMuZmlsZSA9IGZpbGU7XG59XG5cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuY29uc3VtZXIgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGluZGV4IG9mIGEgc291cmNlLiAgUmV0dXJucyAtMSBpZiBub3RcbiAqIGZvdW5kLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZFNvdXJjZUluZGV4ID0gZnVuY3Rpb24oYVNvdXJjZSkge1xuICB2YXIgcmVsYXRpdmVTb3VyY2UgPSBhU291cmNlO1xuICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gIH1cblxuICBpZiAodGhpcy5fc291cmNlcy5oYXMocmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZXMuaW5kZXhPZihyZWxhdGl2ZVNvdXJjZSk7XG4gIH1cblxuICAvLyBNYXliZSBhU291cmNlIGlzIGFuIGFic29sdXRlIFVSTCBhcyByZXR1cm5lZCBieSB8c291cmNlc3wuICBJblxuICAvLyB0aGlzIGNhc2Ugd2UgY2FuJ3Qgc2ltcGx5IHVuZG8gdGhlIHRyYW5zZm9ybS5cbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9hYnNvbHV0ZVNvdXJjZXMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAodGhpcy5fYWJzb2x1dGVTb3VyY2VzW2ldID09IGFTb3VyY2UpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBmcm9tIGEgU291cmNlTWFwR2VuZXJhdG9yLlxuICpcbiAqIEBwYXJhbSBTb3VyY2VNYXBHZW5lcmF0b3IgYVNvdXJjZU1hcFxuICogICAgICAgIFRoZSBzb3VyY2UgbWFwIHRoYXQgd2lsbCBiZSBjb25zdW1lZC5cbiAqIEBwYXJhbSBTdHJpbmcgYVNvdXJjZU1hcFVSTFxuICogICAgICAgIFRoZSBVUkwgYXQgd2hpY2ggdGhlIHNvdXJjZSBtYXAgY2FuIGJlIGZvdW5kIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEJhc2ljU291cmNlTWFwQ29uc3VtZXJcbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gICAgdmFyIHNtYyA9IE9iamVjdC5jcmVhdGUoQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuXG4gICAgdmFyIG5hbWVzID0gc21jLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShhU291cmNlTWFwLl9uYW1lcy50b0FycmF5KCksIHRydWUpO1xuICAgIHZhciBzb3VyY2VzID0gc21jLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX3NvdXJjZXMudG9BcnJheSgpLCB0cnVlKTtcbiAgICBzbWMuc291cmNlUm9vdCA9IGFTb3VyY2VNYXAuX3NvdXJjZVJvb3Q7XG4gICAgc21jLnNvdXJjZXNDb250ZW50ID0gYVNvdXJjZU1hcC5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChzbWMuX3NvdXJjZXMudG9BcnJheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jLnNvdXJjZVJvb3QpO1xuICAgIHNtYy5maWxlID0gYVNvdXJjZU1hcC5fZmlsZTtcbiAgICBzbWMuX3NvdXJjZU1hcFVSTCA9IGFTb3VyY2VNYXBVUkw7XG4gICAgc21jLl9hYnNvbHV0ZVNvdXJjZXMgPSBzbWMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHV0aWwuY29tcHV0ZVNvdXJjZVVSTChzbWMuc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gICAgfSk7XG5cbiAgICAvLyBCZWNhdXNlIHdlIGFyZSBtb2RpZnlpbmcgdGhlIGVudHJpZXMgKGJ5IGNvbnZlcnRpbmcgc3RyaW5nIHNvdXJjZXMgYW5kXG4gICAgLy8gbmFtZXMgdG8gaW5kaWNlcyBpbnRvIHRoZSBzb3VyY2VzIGFuZCBuYW1lcyBBcnJheVNldHMpLCB3ZSBoYXZlIHRvIG1ha2VcbiAgICAvLyBhIGNvcHkgb2YgdGhlIGVudHJ5IG9yIGVsc2UgYmFkIHRoaW5ncyBoYXBwZW4uIFNoYXJlZCBtdXRhYmxlIHN0YXRlXG4gICAgLy8gc3RyaWtlcyBhZ2FpbiEgU2VlIGdpdGh1YiBpc3N1ZSAjMTkxLlxuXG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gYVNvdXJjZU1hcC5fbWFwcGluZ3MudG9BcnJheSgpLnNsaWNlKCk7XG4gICAgdmFyIGRlc3RHZW5lcmF0ZWRNYXBwaW5ncyA9IHNtYy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIGRlc3RPcmlnaW5hbE1hcHBpbmdzID0gc21jLl9fb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGdlbmVyYXRlZE1hcHBpbmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3JjTWFwcGluZyA9IGdlbmVyYXRlZE1hcHBpbmdzW2ldO1xuICAgICAgdmFyIGRlc3RNYXBwaW5nID0gbmV3IE1hcHBpbmc7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gc3JjTWFwcGluZy5nZW5lcmF0ZWRMaW5lO1xuICAgICAgZGVzdE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uID0gc3JjTWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG5cbiAgICAgIGlmIChzcmNNYXBwaW5nLnNvdXJjZSkge1xuICAgICAgICBkZXN0TWFwcGluZy5zb3VyY2UgPSBzb3VyY2VzLmluZGV4T2Yoc3JjTWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbExpbmUgPSBzcmNNYXBwaW5nLm9yaWdpbmFsTGluZTtcbiAgICAgICAgZGVzdE1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBzcmNNYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIGlmIChzcmNNYXBwaW5nLm5hbWUpIHtcbiAgICAgICAgICBkZXN0TWFwcGluZy5uYW1lID0gbmFtZXMuaW5kZXhPZihzcmNNYXBwaW5nLm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzdE9yaWdpbmFsTWFwcGluZ3MucHVzaChkZXN0TWFwcGluZyk7XG4gICAgICB9XG5cbiAgICAgIGRlc3RHZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICB9XG5cbiAgICBxdWlja1NvcnQoc21jLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG5cbiAgICByZXR1cm4gc21jO1xuICB9O1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIG9yaWdpbmFsIHNvdXJjZXMuXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ3NvdXJjZXMnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9hYnNvbHV0ZVNvdXJjZXMuc2xpY2UoKTtcbiAgfVxufSk7XG5cbi8qKlxuICogUHJvdmlkZSB0aGUgSklUIHdpdGggYSBuaWNlIHNoYXBlIC8gaGlkZGVuIGNsYXNzLlxuICovXG5mdW5jdGlvbiBNYXBwaW5nKCkge1xuICB0aGlzLmdlbmVyYXRlZExpbmUgPSAwO1xuICB0aGlzLmdlbmVyYXRlZENvbHVtbiA9IDA7XG4gIHRoaXMuc291cmNlID0gbnVsbDtcbiAgdGhpcy5vcmlnaW5hbExpbmUgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsQ29sdW1uID0gbnVsbDtcbiAgdGhpcy5uYW1lID0gbnVsbDtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHZhciBnZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c09yaWdpbmFsTGluZSA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgdmFyIHByZXZpb3VzTmFtZSA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IGFTdHIubGVuZ3RoO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNhY2hlZFNlZ21lbnRzID0ge307XG4gICAgdmFyIHRlbXAgPSB7fTtcbiAgICB2YXIgb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuICAgIHZhciBnZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgIHZhciBtYXBwaW5nLCBzdHIsIHNlZ21lbnQsIGVuZCwgdmFsdWU7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChhU3RyLmNoYXJBdChpbmRleCkgPT09ICc7Jykge1xuICAgICAgICBnZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJywnKSB7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbWFwcGluZyA9IG5ldyBNYXBwaW5nKCk7XG4gICAgICAgIG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9IGdlbmVyYXRlZExpbmU7XG5cbiAgICAgICAgLy8gQmVjYXVzZSBlYWNoIG9mZnNldCBpcyBlbmNvZGVkIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBvbmUsXG4gICAgICAgIC8vIG1hbnkgc2VnbWVudHMgb2Z0ZW4gaGF2ZSB0aGUgc2FtZSBlbmNvZGluZy4gV2UgY2FuIGV4cGxvaXQgdGhpc1xuICAgICAgICAvLyBmYWN0IGJ5IGNhY2hpbmcgdGhlIHBhcnNlZCB2YXJpYWJsZSBsZW5ndGggZmllbGRzIG9mIGVhY2ggc2VnbWVudCxcbiAgICAgICAgLy8gYWxsb3dpbmcgdXMgdG8gYXZvaWQgYSBzZWNvbmQgcGFyc2UgaWYgd2UgZW5jb3VudGVyIHRoZSBzYW1lXG4gICAgICAgIC8vIHNlZ21lbnQgYWdhaW4uXG4gICAgICAgIGZvciAoZW5kID0gaW5kZXg7IGVuZCA8IGxlbmd0aDsgZW5kKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5fY2hhcklzTWFwcGluZ1NlcGFyYXRvcihhU3RyLCBlbmQpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RyID0gYVN0ci5zbGljZShpbmRleCwgZW5kKTtcblxuICAgICAgICBzZWdtZW50ID0gY2FjaGVkU2VnbWVudHNbc3RyXTtcbiAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICBpbmRleCArPSBzdHIubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlZ21lbnQgPSBbXTtcbiAgICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHtcbiAgICAgICAgICAgIGJhc2U2NFZMUS5kZWNvZGUoYVN0ciwgaW5kZXgsIHRlbXApO1xuICAgICAgICAgICAgdmFsdWUgPSB0ZW1wLnZhbHVlO1xuICAgICAgICAgICAgaW5kZXggPSB0ZW1wLnJlc3Q7XG4gICAgICAgICAgICBzZWdtZW50LnB1c2godmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBhIHNvdXJjZSwgYnV0IG5vIGxpbmUgYW5kIGNvbHVtbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBhIHNvdXJjZSBhbmQgbGluZSwgYnV0IG5vIGNvbHVtbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhY2hlZFNlZ21lbnRzW3N0cl0gPSBzZWdtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2VuZXJhdGVkIGNvbHVtbi5cbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiArIHNlZ21lbnRbMF07XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG5cbiAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID4gMSkge1xuICAgICAgICAgIC8vIE9yaWdpbmFsIHNvdXJjZS5cbiAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHByZXZpb3VzU291cmNlICsgc2VnbWVudFsxXTtcbiAgICAgICAgICBwcmV2aW91c1NvdXJjZSArPSBzZWdtZW50WzFdO1xuXG4gICAgICAgICAgLy8gT3JpZ2luYWwgbGluZS5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IHByZXZpb3VzT3JpZ2luYWxMaW5lICsgc2VnbWVudFsyXTtcbiAgICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICAgIC8vIExpbmVzIGFyZSBzdG9yZWQgMC1iYXNlZFxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lICs9IDE7XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBjb2x1bW4uXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gKyBzZWdtZW50WzNdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgLy8gT3JpZ2luYWwgbmFtZS5cbiAgICAgICAgICAgIG1hcHBpbmcubmFtZSA9IHByZXZpb3VzTmFtZSArIHNlZ21lbnRbNF07XG4gICAgICAgICAgICBwcmV2aW91c05hbWUgKz0gc2VnbWVudFs0XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBnZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICBpZiAodHlwZW9mIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIG9yaWdpbmFsTWFwcGluZ3MucHVzaChtYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydChnZW5lcmF0ZWRNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCk7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gZ2VuZXJhdGVkTWFwcGluZ3M7XG5cbiAgICBxdWlja1NvcnQob3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBvcmlnaW5hbE1hcHBpbmdzO1xuICB9O1xuXG4vKipcbiAqIEZpbmQgdGhlIG1hcHBpbmcgdGhhdCBiZXN0IG1hdGNoZXMgdGhlIGh5cG90aGV0aWNhbCBcIm5lZWRsZVwiIG1hcHBpbmcgdGhhdFxuICogd2UgYXJlIHNlYXJjaGluZyBmb3IgaW4gdGhlIGdpdmVuIFwiaGF5c3RhY2tcIiBvZiBtYXBwaW5ncy5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZmluZE1hcHBpbmcoYU5lZWRsZSwgYU1hcHBpbmdzLCBhTGluZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb2x1bW5OYW1lLCBhQ29tcGFyYXRvciwgYUJpYXMpIHtcbiAgICAvLyBUbyByZXR1cm4gdGhlIHBvc2l0aW9uIHdlIGFyZSBzZWFyY2hpbmcgZm9yLCB3ZSBtdXN0IGZpcnN0IGZpbmQgdGhlXG4gICAgLy8gbWFwcGluZyBmb3IgdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCB0aGVuIHJldHVybiB0aGUgb3Bwb3NpdGUgcG9zaXRpb24gaXRcbiAgICAvLyBwb2ludHMgdG8uIEJlY2F1c2UgdGhlIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHdlIGNhbiB1c2UgYmluYXJ5IHNlYXJjaCB0b1xuICAgIC8vIGZpbmQgdGhlIGJlc3QgbWFwcGluZy5cblxuICAgIGlmIChhTmVlZGxlW2FMaW5lTmFtZV0gPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTGluZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLCBnb3QgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICArIGFOZWVkbGVbYUxpbmVOYW1lXSk7XG4gICAgfVxuICAgIGlmIChhTmVlZGxlW2FDb2x1bW5OYW1lXSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbHVtbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLCBnb3QgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICArIGFOZWVkbGVbYUNvbHVtbk5hbWVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmluYXJ5U2VhcmNoLnNlYXJjaChhTmVlZGxlLCBhTWFwcGluZ3MsIGFDb21wYXJhdG9yLCBhQmlhcyk7XG4gIH07XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgbGFzdCBjb2x1bW4gZm9yIGVhY2ggZ2VuZXJhdGVkIG1hcHBpbmcuIFRoZSBsYXN0IGNvbHVtbiBpc1xuICogaW5jbHVzaXZlLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb21wdXRlQ29sdW1uU3BhbnMgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9jb21wdXRlQ29sdW1uU3BhbnMoKSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLmxlbmd0aDsgKytpbmRleCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIC8vIE1hcHBpbmdzIGRvIG5vdCBjb250YWluIGEgZmllbGQgZm9yIHRoZSBsYXN0IGdlbmVyYXRlZCBjb2x1bW50LiBXZVxuICAgICAgLy8gY2FuIGNvbWUgdXAgd2l0aCBhbiBvcHRpbWlzdGljIGVzdGltYXRlLCBob3dldmVyLCBieSBhc3N1bWluZyB0aGF0XG4gICAgICAvLyBtYXBwaW5ncyBhcmUgY29udGlndW91cyAoaS5lLiBnaXZlbiB0d28gY29uc2VjdXRpdmUgbWFwcGluZ3MsIHRoZVxuICAgICAgLy8gZmlyc3QgbWFwcGluZyBlbmRzIHdoZXJlIHRoZSBzZWNvbmQgb25lIHN0YXJ0cykuXG4gICAgICBpZiAoaW5kZXggKyAxIDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoKSB7XG4gICAgICAgIHZhciBuZXh0TWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4ICsgMV07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG1hcHBpbmcubGFzdEdlbmVyYXRlZENvbHVtbiA9IG5leHRNYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtIDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGxhc3QgbWFwcGluZyBmb3IgZWFjaCBsaW5lIHNwYW5zIHRoZSBlbnRpcmUgbGluZS5cbiAgICAgIG1hcHBpbmcubGFzdEdlbmVyYXRlZENvbHVtbiA9IEluZmluaXR5O1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqICAgLSBiaWFzOiBFaXRoZXIgJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdTb3VyY2VNYXBDb25zdW1lci5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlXG4gKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gKiAgICAgRGVmYXVsdHMgdG8gJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhcbiAgICAgIG5lZWRsZSxcbiAgICAgIHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLFxuICAgICAgXCJnZW5lcmF0ZWRMaW5lXCIsXG4gICAgICBcImdlbmVyYXRlZENvbHVtblwiLFxuICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCxcbiAgICAgIHV0aWwuZ2V0QXJnKGFBcmdzLCAnYmlhcycsIFNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EKVxuICAgICk7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnc291cmNlJywgbnVsbCk7XG4gICAgICAgIGlmIChzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmF0KHNvdXJjZSk7XG4gICAgICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHRoaXMuc291cmNlUm9vdCwgc291cmNlLCB0aGlzLl9zb3VyY2VNYXBVUkwpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcobWFwcGluZywgJ25hbWUnLCBudWxsKTtcbiAgICAgICAgaWYgKG5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuYXQobmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnb3JpZ2luYWxMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnb3JpZ2luYWxDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGwsXG4gICAgICBuYW1lOiBudWxsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5oYXNDb250ZW50c09mQWxsU291cmNlcyA9XG4gIGZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXJfaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKSB7XG4gICAgaWYgKCF0aGlzLnNvdXJjZXNDb250ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50Lmxlbmd0aCA+PSB0aGlzLl9zb3VyY2VzLnNpemUoKSAmJlxuICAgICAgIXRoaXMuc291cmNlc0NvbnRlbnQuc29tZShmdW5jdGlvbiAoc2MpIHsgcmV0dXJuIHNjID09IG51bGw7IH0pO1xuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50LiBUaGUgb25seSBhcmd1bWVudCBpcyB0aGUgdXJsIG9mIHRoZVxuICogb3JpZ2luYWwgc291cmNlIGZpbGUuIFJldHVybnMgbnVsbCBpZiBubyBvcmlnaW5hbCBzb3VyY2UgY29udGVudCBpc1xuICogYXZhaWxhYmxlLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfc291cmNlQ29udGVudEZvcihhU291cmNlLCBudWxsT25NaXNzaW5nKSB7XG4gICAgaWYgKCF0aGlzLnNvdXJjZXNDb250ZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kU291cmNlSW5kZXgoYVNvdXJjZSk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W2luZGV4XTtcbiAgICB9XG5cbiAgICB2YXIgcmVsYXRpdmVTb3VyY2UgPSBhU291cmNlO1xuICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgcmVsYXRpdmVTb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgcmVsYXRpdmVTb3VyY2UpO1xuICAgIH1cblxuICAgIHZhciB1cmw7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsXG4gICAgICAgICYmICh1cmwgPSB1dGlsLnVybFBhcnNlKHRoaXMuc291cmNlUm9vdCkpKSB7XG4gICAgICAvLyBYWFg6IGZpbGU6Ly8gVVJJcyBhbmQgYWJzb2x1dGUgcGF0aHMgbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yIGZvclxuICAgICAgLy8gbWFueSB1c2Vycy4gV2UgY2FuIGhlbHAgdGhlbSBvdXQgd2hlbiB0aGV5IGV4cGVjdCBmaWxlOi8vIFVSSXMgdG9cbiAgICAgIC8vIGJlaGF2ZSBsaWtlIGl0IHdvdWxkIGlmIHRoZXkgd2VyZSBydW5uaW5nIGEgbG9jYWwgSFRUUCBzZXJ2ZXIuIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODg1NTk3LlxuICAgICAgdmFyIGZpbGVVcmlBYnNQYXRoID0gcmVsYXRpdmVTb3VyY2UucmVwbGFjZSgvXmZpbGU6XFwvXFwvLywgXCJcIik7XG4gICAgICBpZiAodXJsLnNjaGVtZSA9PSBcImZpbGVcIlxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKGZpbGVVcmlBYnNQYXRoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoZmlsZVVyaUFic1BhdGgpXVxuICAgICAgfVxuXG4gICAgICBpZiAoKCF1cmwucGF0aCB8fCB1cmwucGF0aCA9PSBcIi9cIilcbiAgICAgICAgICAmJiB0aGlzLl9zb3VyY2VzLmhhcyhcIi9cIiArIHJlbGF0aXZlU291cmNlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoXCIvXCIgKyByZWxhdGl2ZVNvdXJjZSldO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCByZWN1cnNpdmVseSBmcm9tXG4gICAgLy8gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yLiBJbiB0aGF0IGNhc2UsIHdlXG4gICAgLy8gZG9uJ3Qgd2FudCB0byB0aHJvdyBpZiB3ZSBjYW4ndCBmaW5kIHRoZSBzb3VyY2UgLSB3ZSBqdXN0IHdhbnQgdG9cbiAgICAvLyByZXR1cm4gbnVsbCwgc28gd2UgcHJvdmlkZSBhIGZsYWcgdG8gZXhpdCBncmFjZWZ1bGx5LlxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIHJlbGF0aXZlU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXJcbiAqICAgICBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqICAgLSBiaWFzOiBFaXRoZXIgJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdTb3VyY2VNYXBDb25zdW1lci5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlXG4gKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gKiAgICAgRGVmYXVsdHMgdG8gJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuZ2VuZXJhdGVkUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpO1xuICAgIHNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChzb3VyY2UpO1xuICAgIGlmIChzb3VyY2UgPCAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgb3JpZ2luYWxMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IG5lZWRsZS5zb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG5leHBvcnRzLkJhc2ljU291cmNlTWFwQ29uc3VtZXIgPSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEFuIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2hcbiAqIHdlIGNhbiBxdWVyeSBmb3IgaW5mb3JtYXRpb24uIEl0IGRpZmZlcnMgZnJvbSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGluXG4gKiB0aGF0IGl0IHRha2VzIFwiaW5kZXhlZFwiIHNvdXJjZSBtYXBzIChpLmUuIG9uZXMgd2l0aCBhIFwic2VjdGlvbnNcIiBmaWVsZCkgYXNcbiAqIGlucHV0LlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yIGFscmVhZHlcbiAqIHBhcnNlZCB0byBhbiBvYmplY3QpLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMgZm9yIGluZGV4ZWQgc291cmNlIG1hcHMsIHRoZXlcbiAqIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIGZpbGU6IE9wdGlvbmFsLiBUaGUgZ2VuZXJhdGVkIGZpbGUgdGhpcyBzb3VyY2UgbWFwIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAqICAgLSBzZWN0aW9uczogQSBsaXN0IG9mIHNlY3Rpb24gZGVmaW5pdGlvbnMuXG4gKlxuICogRWFjaCB2YWx1ZSB1bmRlciB0aGUgXCJzZWN0aW9uc1wiIGZpZWxkIGhhcyB0d28gZmllbGRzOlxuICogICAtIG9mZnNldDogVGhlIG9mZnNldCBpbnRvIHRoZSBvcmlnaW5hbCBzcGVjaWZpZWQgYXQgd2hpY2ggdGhpcyBzZWN0aW9uXG4gKiAgICAgICBiZWdpbnMgdG8gYXBwbHksIGRlZmluZWQgYXMgYW4gb2JqZWN0IHdpdGggYSBcImxpbmVcIiBhbmQgXCJjb2x1bW5cIlxuICogICAgICAgZmllbGQuXG4gKiAgIC0gbWFwOiBBIHNvdXJjZSBtYXAgZGVmaW5pdGlvbi4gVGhpcyBzb3VyY2UgbWFwIGNvdWxkIGFsc28gYmUgaW5kZXhlZCxcbiAqICAgICAgIGJ1dCBkb2Vzbid0IGhhdmUgdG8gYmUuXG4gKlxuICogSW5zdGVhZCBvZiB0aGUgXCJtYXBcIiBmaWVsZCwgaXQncyBhbHNvIHBvc3NpYmxlIHRvIGhhdmUgYSBcInVybFwiIGZpZWxkXG4gKiBzcGVjaWZ5aW5nIGEgVVJMIHRvIHJldHJpZXZlIGEgc291cmNlIG1hcCBmcm9tLCBidXQgdGhhdCdzIGN1cnJlbnRseVxuICogdW5zdXBwb3J0ZWQuXG4gKlxuICogSGVyZSdzIGFuIGV4YW1wbGUgc291cmNlIG1hcCwgdGFrZW4gZnJvbSB0aGUgc291cmNlIG1hcCBzcGVjWzBdLCBidXRcbiAqIG1vZGlmaWVkIHRvIG9taXQgYSBzZWN0aW9uIHdoaWNoIHVzZXMgdGhlIFwidXJsXCIgZmllbGQuXG4gKlxuICogIHtcbiAqICAgIHZlcnNpb24gOiAzLFxuICogICAgZmlsZTogXCJhcHAuanNcIixcbiAqICAgIHNlY3Rpb25zOiBbe1xuICogICAgICBvZmZzZXQ6IHtsaW5lOjEwMCwgY29sdW1uOjEwfSxcbiAqICAgICAgbWFwOiB7XG4gKiAgICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICAgZmlsZTogXCJzZWN0aW9uLmpzXCIsXG4gKiAgICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICogICAgICAgIG5hbWVzOiBbXCJzcmNcIiwgXCJtYXBzXCIsIFwiYXJlXCIsIFwiZnVuXCJdLFxuICogICAgICAgIG1hcHBpbmdzOiBcIkFBQUEsRTs7QUJDREU7XCJcbiAqICAgICAgfVxuICogICAgfV0sXG4gKiAgfVxuICpcbiAqIFRoZSBzZWNvbmQgcGFyYW1ldGVyLCBpZiBnaXZlbiwgaXMgYSBzdHJpbmcgd2hvc2UgdmFsdWUgaXMgdGhlIFVSTFxuICogYXQgd2hpY2ggdGhlIHNvdXJjZSBtYXAgd2FzIGZvdW5kLiAgVGhpcyBVUkwgaXMgdXNlZCB0byBjb21wdXRlIHRoZVxuICogc291cmNlcyBhcnJheS5cbiAqXG4gKiBbMF06IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMVUxUkdBZWhRd1J5cFVUb3ZGMUtSbHBpT0Z6ZTBiLV8yZ2M2ZkFIMEtZMGsvZWRpdCNoZWFkaW5nPWguNTM1ZXMzeGVwcmd0XG4gKi9cbmZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gIHZhciBzb3VyY2VNYXAgPSBhU291cmNlTWFwO1xuICBpZiAodHlwZW9mIGFTb3VyY2VNYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgc291cmNlTWFwID0gdXRpbC5wYXJzZVNvdXJjZU1hcElucHV0KGFTb3VyY2VNYXApO1xuICB9XG5cbiAgdmFyIHZlcnNpb24gPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICd2ZXJzaW9uJyk7XG4gIHZhciBzZWN0aW9ucyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NlY3Rpb25zJyk7XG5cbiAgaWYgKHZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICB9XG5cbiAgdGhpcy5fc291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICB0aGlzLl9uYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gIHZhciBsYXN0T2Zmc2V0ID0ge1xuICAgIGxpbmU6IC0xLFxuICAgIGNvbHVtbjogMFxuICB9O1xuICB0aGlzLl9zZWN0aW9ucyA9IHNlY3Rpb25zLm1hcChmdW5jdGlvbiAocykge1xuICAgIGlmIChzLnVybCkge1xuICAgICAgLy8gVGhlIHVybCBmaWVsZCB3aWxsIHJlcXVpcmUgc3VwcG9ydCBmb3IgYXN5bmNocm9uaWNpdHkuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9pc3N1ZXMvMTZcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3VwcG9ydCBmb3IgdXJsIGZpZWxkIGluIHNlY3Rpb25zIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG4gICAgdmFyIG9mZnNldCA9IHV0aWwuZ2V0QXJnKHMsICdvZmZzZXQnKTtcbiAgICB2YXIgb2Zmc2V0TGluZSA9IHV0aWwuZ2V0QXJnKG9mZnNldCwgJ2xpbmUnKTtcbiAgICB2YXIgb2Zmc2V0Q29sdW1uID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnY29sdW1uJyk7XG5cbiAgICBpZiAob2Zmc2V0TGluZSA8IGxhc3RPZmZzZXQubGluZSB8fFxuICAgICAgICAob2Zmc2V0TGluZSA9PT0gbGFzdE9mZnNldC5saW5lICYmIG9mZnNldENvbHVtbiA8IGxhc3RPZmZzZXQuY29sdW1uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWN0aW9uIG9mZnNldHMgbXVzdCBiZSBvcmRlcmVkIGFuZCBub24tb3ZlcmxhcHBpbmcuJyk7XG4gICAgfVxuICAgIGxhc3RPZmZzZXQgPSBvZmZzZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2VuZXJhdGVkT2Zmc2V0OiB7XG4gICAgICAgIC8vIFRoZSBvZmZzZXQgZmllbGRzIGFyZSAwLWJhc2VkLCBidXQgd2UgdXNlIDEtYmFzZWQgaW5kaWNlcyB3aGVuXG4gICAgICAgIC8vIGVuY29kaW5nL2RlY29kaW5nIGZyb20gVkxRLlxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBvZmZzZXRMaW5lICsgMSxcbiAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBvZmZzZXRDb2x1bW4gKyAxXG4gICAgICB9LFxuICAgICAgY29uc3VtZXI6IG5ldyBTb3VyY2VNYXBDb25zdW1lcih1dGlsLmdldEFyZyhzLCAnbWFwJyksIGFTb3VyY2VNYXBVUkwpXG4gICAgfVxuICB9KTtcbn1cblxuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlKTtcbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIG9yaWdpbmFsIHNvdXJjZXMuXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNvdXJjZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuX3NlY3Rpb25zW2ldLmNvbnN1bWVyLnNvdXJjZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc291cmNlcy5wdXNoKHRoaXMuX3NlY3Rpb25zW2ldLmNvbnN1bWVyLnNvdXJjZXNbal0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc291cmNlcztcbiAgfVxufSk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlLCBsaW5lLCBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkXG4gKiBzb3VyY2UncyBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zIHByb3ZpZGVkLiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3RcbiAqIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXJcbiAqICAgICBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuICBUaGUgY29sdW1uXG4gKiAgICAgbnVtYmVyIGlzIDAtYmFzZWQuXG4gKlxuICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIG51bGwuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqICAgLSBuYW1lOiBUaGUgb3JpZ2luYWwgaWRlbnRpZmllciwgb3IgbnVsbC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX29yaWdpbmFsUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgZ2VuZXJhdGVkTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgLy8gRmluZCB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24gd2UncmUgdHJ5aW5nIHRvIG1hcFxuICAgIC8vIHRvIGFuIG9yaWdpbmFsIHBvc2l0aW9uLlxuICAgIHZhciBzZWN0aW9uSW5kZXggPSBiaW5hcnlTZWFyY2guc2VhcmNoKG5lZWRsZSwgdGhpcy5fc2VjdGlvbnMsXG4gICAgICBmdW5jdGlvbihuZWVkbGUsIHNlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNtcCA9IG5lZWRsZS5nZW5lcmF0ZWRMaW5lIC0gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZTtcbiAgICAgICAgaWYgKGNtcCkge1xuICAgICAgICAgIHJldHVybiBjbXA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgIHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbik7XG4gICAgICB9KTtcbiAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW3NlY3Rpb25JbmRleF07XG5cbiAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICBuYW1lOiBudWxsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzZWN0aW9uLmNvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgbGluZTogbmVlZGxlLmdlbmVyYXRlZExpbmUgLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgY29sdW1uOiBuZWVkbGUuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgIDogMCksXG4gICAgICBiaWFzOiBhQXJncy5iaWFzXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGV2ZXJ5IHNvdXJjZSBpbiB0aGUgc291cmNlXG4gKiBtYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5oYXNDb250ZW50c09mQWxsU291cmNlcyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdGlvbnMuZXZlcnkoZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiBzLmNvbnN1bWVyLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCk7XG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICB2YXIgY29udGVudCA9IHNlY3Rpb24uY29uc3VtZXIuc291cmNlQ29udGVudEZvcihhU291cmNlLCB0cnVlKTtcbiAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXJcbiAqICAgICBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLiBcbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICogICAgIFRoZSBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuZ2VuZXJhdGVkUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICAvLyBPbmx5IGNvbnNpZGVyIHRoaXMgc2VjdGlvbiBpZiB0aGUgcmVxdWVzdGVkIHNvdXJjZSBpcyBpbiB0aGUgbGlzdCBvZlxuICAgICAgLy8gc291cmNlcyBvZiB0aGUgY29uc3VtZXIuXG4gICAgICBpZiAoc2VjdGlvbi5jb25zdW1lci5fZmluZFNvdXJjZUluZGV4KHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJykpID09PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBnZW5lcmF0ZWRQb3NpdGlvbiA9IHNlY3Rpb24uY29uc3VtZXIuZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpO1xuICAgICAgaWYgKGdlbmVyYXRlZFBvc2l0aW9uKSB7XG4gICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgbGluZTogZ2VuZXJhdGVkUG9zaXRpb24ubGluZSArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkUG9zaXRpb24uY29sdW1uICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lID09PSBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lXG4gICAgICAgICAgICAgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxXG4gICAgICAgICAgICAgOiAwKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcbiAgICAgIHZhciBzZWN0aW9uTWFwcGluZ3MgPSBzZWN0aW9uLmNvbnN1bWVyLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VjdGlvbk1hcHBpbmdzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gc2VjdGlvbk1hcHBpbmdzW2pdO1xuXG4gICAgICAgIHZhciBzb3VyY2UgPSBzZWN0aW9uLmNvbnN1bWVyLl9zb3VyY2VzLmF0KG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNlY3Rpb24uY29uc3VtZXIuc291cmNlUm9vdCwgc291cmNlLCB0aGlzLl9zb3VyY2VNYXBVUkwpO1xuICAgICAgICB0aGlzLl9zb3VyY2VzLmFkZChzb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmluZGV4T2Yoc291cmNlKTtcblxuICAgICAgICB2YXIgbmFtZSA9IG51bGw7XG4gICAgICAgIGlmIChtYXBwaW5nLm5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gc2VjdGlvbi5jb25zdW1lci5fbmFtZXMuYXQobWFwcGluZy5uYW1lKTtcbiAgICAgICAgICB0aGlzLl9uYW1lcy5hZGQobmFtZSk7XG4gICAgICAgICAgbmFtZSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgbWFwcGluZ3MgY29taW5nIGZyb20gdGhlIGNvbnN1bWVyIGZvciB0aGUgc2VjdGlvbiBoYXZlXG4gICAgICAgIC8vIGdlbmVyYXRlZCBwb3NpdGlvbnMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLCBzbyB3ZVxuICAgICAgICAvLyBuZWVkIHRvIG9mZnNldCB0aGVtIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY29uY2F0ZW5hdGVkXG4gICAgICAgIC8vIGdlbmVyYXRlZCBmaWxlLlxuICAgICAgICB2YXIgYWRqdXN0ZWRNYXBwaW5nID0ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGdlbmVyYXRlZExpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG1hcHBpbmcuZ2VuZXJhdGVkTGluZVxuICAgICAgICAgICAgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxXG4gICAgICAgICAgICA6IDApLFxuICAgICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgb3JpZ2luYWxDb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sXG4gICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKGFkanVzdGVkTWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgYWRqdXN0ZWRNYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncy5wdXNoKGFkanVzdGVkTWFwcGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBxdWlja1NvcnQodGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICBxdWlja1NvcnQodGhpcy5fX29yaWdpbmFsTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMpO1xuICB9O1xuXG5leHBvcnRzLkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciA9IEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcjtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gc291cmNlUm9vdDogQSByb290IGZvciBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICBpZiAoIWFBcmdzKSB7XG4gICAgYUFyZ3MgPSB7fTtcbiAgfVxuICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdmaWxlJywgbnVsbCk7XG4gIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG59XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7XG4gICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICBmaWxlOiBhU291cmNlTWFwQ29uc3VtZXIuZmlsZSxcbiAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICB9KTtcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld01hcHBpbmcub3JpZ2luYWwgPSB7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBzb3VyY2VSZWxhdGl2ZSA9IHNvdXJjZUZpbGU7XG4gICAgICBpZiAoc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VSZWxhdGl2ZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdG9yLl9zb3VyY2VzLmhhcyhzb3VyY2VSZWxhdGl2ZSkpIHtcbiAgICAgICAgZ2VuZXJhdG9yLl9zb3VyY2VzLmFkZChzb3VyY2VSZWxhdGl2ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH07XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZ2VuZXJhdGVkJyk7XG4gICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICduYW1lJywgbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IFN0cmluZyhzb3VyY2UpO1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICAgIGlmICghdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9tYXBwaW5ncy5hZGQoe1xuICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAqIHJld3JpdHRlbiB1c2luZyB0aGUgc3VwcGxpZWQgc291cmNlIG1hcC4gTm90ZTogVGhlIHJlc29sdXRpb24gZm9yIHRoZVxuICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAqIEBwYXJhbSBhU291cmNlTWFwUGF0aCBPcHRpb25hbC4gVGhlIGRpcm5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBtYXBcbiAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gKiAgICAgICAgZGlyZWN0b3J5LCBhbmQgdGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZCBjb250YWlucyByZWxhdGl2ZSBzb3VyY2VcbiAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICB2YXIgc291cmNlRmlsZSA9IGFTb3VyY2VGaWxlO1xuICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgJ29yIHRoZSBzb3VyY2UgbWFwXFwncyBcImZpbGVcIiBwcm9wZXJ0eS4gQm90aCB3ZXJlIG9taXR0ZWQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc291cmNlRmlsZSA9IGFTb3VyY2VNYXBDb25zdW1lci5maWxlO1xuICAgIH1cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgLy8gTWFrZSBcInNvdXJjZUZpbGVcIiByZWxhdGl2ZSBpZiBhbiBhYnNvbHV0ZSBVcmwgaXMgcGFzc2VkLlxuICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgIH1cbiAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICB2YXIgbmV3U291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgdGhpcy5fbWFwcGluZ3MudW5zb3J0ZWRGb3JFYWNoKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgdmFyIG9yaWdpbmFsID0gYVNvdXJjZU1hcENvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFuZXdTb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH07XG5cbi8qKlxuICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gKlxuICogICAxLiBKdXN0IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gKiAgICAgIHRva2VuLlxuICpcbiAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICogaW4gdG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl92YWxpZGF0ZU1hcHBpbmcoYUdlbmVyYXRlZCwgYU9yaWdpbmFsLCBhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgLy8gV2hlbiBhT3JpZ2luYWwgaXMgdHJ1dGh5IGJ1dCBoYXMgZW1wdHkgdmFsdWVzIGZvciAubGluZSBhbmQgLmNvbHVtbixcbiAgICAvLyBpdCBpcyBtb3N0IGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IuIEluIHRoaXMgY2FzZSB3ZSB0aHJvdyBhIHZlcnlcbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIHRvIHRyeSB0byBndWlkZSB0aGVtIHRoZSByaWdodCB3YXkuXG4gICAgLy8gRm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyL3BvbHltZXItYnVuZGxlci9wdWxsLzUxOVxuICAgIGlmIChhT3JpZ2luYWwgJiYgdHlwZW9mIGFPcmlnaW5hbC5saW5lICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYU9yaWdpbmFsLmNvbHVtbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ29yaWdpbmFsLmxpbmUgYW5kIG9yaWdpbmFsLmNvbHVtbiBhcmUgbm90IG51bWJlcnMgLS0geW91IHByb2JhYmx5IG1lYW50IHRvIG9taXQgJyArXG4gICAgICAgICAgICAndGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50aXJlbHkgYW5kIG9ubHkgbWFwIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uIElmIHNvLCBwYXNzICcgK1xuICAgICAgICAgICAgJ251bGwgZm9yIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGluc3RlYWQgb2YgYW4gb2JqZWN0IHdpdGggZW1wdHkgb3IgbnVsbCB2YWx1ZXMuJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAvLyBDYXNlIDEuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbC5saW5lID4gMCAmJiBhT3JpZ2luYWwuY29sdW1uID49IDBcbiAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtYXBwaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCxcbiAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiB0byB0aGUgc3RyZWFtIG9mIGJhc2UgNjQgVkxRc1xuICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgIHZhciByZXN1bHQgPSAnJztcbiAgICB2YXIgbmV4dDtcbiAgICB2YXIgbWFwcGluZztcbiAgICB2YXIgbmFtZUlkeDtcbiAgICB2YXIgc291cmNlSWR4O1xuXG4gICAgdmFyIG1hcHBpbmdzID0gdGhpcy5fbWFwcGluZ3MudG9BcnJheSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgbWFwcGluZyA9IG1hcHBpbmdzW2ldO1xuICAgICAgbmV4dCA9ICcnXG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5leHQgKz0gJzsnO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgaWYgKCF1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmcsIG1hcHBpbmdzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0ICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlSWR4ID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKHNvdXJjZUlkeCAtIHByZXZpb3VzU291cmNlKTtcbiAgICAgICAgcHJldmlvdXNTb3VyY2UgPSBzb3VyY2VJZHg7XG5cbiAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTtcblxuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4pO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuYW1lSWR4ID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShuYW1lSWR4IC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICBwcmV2aW91c05hbWUgPSBuYW1lSWR4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCArPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFTb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cywga2V5KVxuICAgICAgICA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgIHZhciBtYXAgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICBuYW1lczogdGhpcy5fbmFtZXMudG9BcnJheSgpLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLl9maWxlICE9IG51bGwpIHtcbiAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvU3RyaW5nKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKTtcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdIHx8ICcnO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGFDaHVuaykge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgdmFyIGNodW5rO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICpcbiAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICB2YXIgbmV3Q2hpbGRyZW47XG4gIHZhciBpO1xuICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgfVxuICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gKlxuICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gIH07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gXCJcIjtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHN0ciArPSBjaHVuaztcbiAgfSk7XG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAqIG1hcC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICBjb2RlOiBcIlwiLFxuICAgIGxpbmU6IDEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG59O1xuXG5leHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGdldHRpbmcgdmFsdWVzIGZyb20gcGFyYW1ldGVyL29wdGlvbnNcbiAqIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGFyZ3MgVGhlIG9iamVjdCB3ZSBhcmUgZXh0cmFjdGluZyB2YWx1ZXMgZnJvbVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdlIGFyZSBnZXR0aW5nLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBBbiBvcHRpb25hbCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmdcbiAqIGZyb20gdGhlIG9iamVjdC4gSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkIGFuZCB0aGUgcHJvcGVydHkgaXMgbWlzc2luZywgYW5cbiAqIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICovXG5mdW5jdGlvbiBnZXRBcmcoYUFyZ3MsIGFOYW1lLCBhRGVmYXVsdFZhbHVlKSB7XG4gIGlmIChhTmFtZSBpbiBhQXJncykge1xuICAgIHJldHVybiBhQXJnc1thTmFtZV07XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIHJldHVybiBhRGVmYXVsdFZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignXCInICsgYU5hbWUgKyAnXCIgaXMgYSByZXF1aXJlZCBhcmd1bWVudC4nKTtcbiAgfVxufVxuZXhwb3J0cy5nZXRBcmcgPSBnZXRBcmc7XG5cbnZhciB1cmxSZWdleHAgPSAvXig/OihbXFx3K1xcLS5dKyk6KT9cXC9cXC8oPzooXFx3KzpcXHcrKUApPyhbXFx3Li1dKikoPzo6KFxcZCspKT8oLiopJC87XG52YXIgZGF0YVVybFJlZ2V4cCA9IC9eZGF0YTouK1xcLC4rJC87XG5cbmZ1bmN0aW9uIHVybFBhcnNlKGFVcmwpIHtcbiAgdmFyIG1hdGNoID0gYVVybC5tYXRjaCh1cmxSZWdleHApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzY2hlbWU6IG1hdGNoWzFdLFxuICAgIGF1dGg6IG1hdGNoWzJdLFxuICAgIGhvc3Q6IG1hdGNoWzNdLFxuICAgIHBvcnQ6IG1hdGNoWzRdLFxuICAgIHBhdGg6IG1hdGNoWzVdXG4gIH07XG59XG5leHBvcnRzLnVybFBhcnNlID0gdXJsUGFyc2U7XG5cbmZ1bmN0aW9uIHVybEdlbmVyYXRlKGFQYXJzZWRVcmwpIHtcbiAgdmFyIHVybCA9ICcnO1xuICBpZiAoYVBhcnNlZFVybC5zY2hlbWUpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5zY2hlbWUgKyAnOic7XG4gIH1cbiAgdXJsICs9ICcvLyc7XG4gIGlmIChhUGFyc2VkVXJsLmF1dGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5hdXRoICsgJ0AnO1xuICB9XG4gIGlmIChhUGFyc2VkVXJsLmhvc3QpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5ob3N0O1xuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBvcnQpIHtcbiAgICB1cmwgKz0gXCI6XCIgKyBhUGFyc2VkVXJsLnBvcnRcbiAgfVxuICBpZiAoYVBhcnNlZFVybC5wYXRoKSB7XG4gICAgdXJsICs9IGFQYXJzZWRVcmwucGF0aDtcbiAgfVxuICByZXR1cm4gdXJsO1xufVxuZXhwb3J0cy51cmxHZW5lcmF0ZSA9IHVybEdlbmVyYXRlO1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBwYXRoLCBvciB0aGUgcGF0aCBwb3J0aW9uIG9mIGEgVVJMOlxuICpcbiAqIC0gUmVwbGFjZXMgY29uc2VjdXRpdmUgc2xhc2hlcyB3aXRoIG9uZSBzbGFzaC5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnLicgcGFydHMuXG4gKiAtIFJlbW92ZXMgdW5uZWNlc3NhcnkgJzxkaXI+Ly4uJyBwYXJ0cy5cbiAqXG4gKiBCYXNlZCBvbiBjb2RlIGluIHRoZSBOb2RlLmpzICdwYXRoJyBjb3JlIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgdXJsIHRvIG5vcm1hbGl6ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplKGFQYXRoKSB7XG4gIHZhciBwYXRoID0gYVBhdGg7XG4gIHZhciB1cmwgPSB1cmxQYXJzZShhUGF0aCk7XG4gIGlmICh1cmwpIHtcbiAgICBpZiAoIXVybC5wYXRoKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuICAgIHBhdGggPSB1cmwucGF0aDtcbiAgfVxuICB2YXIgaXNBYnNvbHV0ZSA9IGV4cG9ydHMuaXNBYnNvbHV0ZShwYXRoKTtcblxuICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KC9cXC8rLyk7XG4gIGZvciAodmFyIHBhcnQsIHVwID0gMCwgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgcGFydCA9IHBhcnRzW2ldO1xuICAgIGlmIChwYXJ0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCA+IDApIHtcbiAgICAgIGlmIChwYXJ0ID09PSAnJykge1xuICAgICAgICAvLyBUaGUgZmlyc3QgcGFydCBpcyBibGFuayBpZiB0aGUgcGF0aCBpcyBhYnNvbHV0ZS4gVHJ5aW5nIHRvIGdvXG4gICAgICAgIC8vIGFib3ZlIHRoZSByb290IGlzIGEgbm8tb3AuIFRoZXJlZm9yZSB3ZSBjYW4gcmVtb3ZlIGFsbCAnLi4nIHBhcnRzXG4gICAgICAgIC8vIGRpcmVjdGx5IGFmdGVyIHRoZSByb290LlxuICAgICAgICBwYXJ0cy5zcGxpY2UoaSArIDEsIHVwKTtcbiAgICAgICAgdXAgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKGksIDIpO1xuICAgICAgICB1cC0tO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwYXRoID0gcGFydHMuam9pbignLycpO1xuXG4gIGlmIChwYXRoID09PSAnJykge1xuICAgIHBhdGggPSBpc0Fic29sdXRlID8gJy8nIDogJy4nO1xuICB9XG5cbiAgaWYgKHVybCkge1xuICAgIHVybC5wYXRoID0gcGF0aDtcbiAgICByZXR1cm4gdXJsR2VuZXJhdGUodXJsKTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cbmV4cG9ydHMubm9ybWFsaXplID0gbm9ybWFsaXplO1xuXG4vKipcbiAqIEpvaW5zIHR3byBwYXRocy9VUkxzLlxuICpcbiAqIEBwYXJhbSBhUm9vdCBUaGUgcm9vdCBwYXRoIG9yIFVSTC5cbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciBVUkwgdG8gYmUgam9pbmVkIHdpdGggdGhlIHJvb3QuXG4gKlxuICogLSBJZiBhUGF0aCBpcyBhIFVSTCBvciBhIGRhdGEgVVJJLCBhUGF0aCBpcyByZXR1cm5lZCwgdW5sZXNzIGFQYXRoIGlzIGFcbiAqICAgc2NoZW1lLXJlbGF0aXZlIFVSTDogVGhlbiB0aGUgc2NoZW1lIG9mIGFSb290LCBpZiBhbnksIGlzIHByZXBlbmRlZFxuICogICBmaXJzdC5cbiAqIC0gT3RoZXJ3aXNlIGFQYXRoIGlzIGEgcGF0aC4gSWYgYVJvb3QgaXMgYSBVUkwsIHRoZW4gaXRzIHBhdGggcG9ydGlvblxuICogICBpcyB1cGRhdGVkIHdpdGggdGhlIHJlc3VsdCBhbmQgYVJvb3QgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgcmVzdWx0XG4gKiAgIGlzIHJldHVybmVkLlxuICogICAtIElmIGFQYXRoIGlzIGFic29sdXRlLCB0aGUgcmVzdWx0IGlzIGFQYXRoLlxuICogICAtIE90aGVyd2lzZSB0aGUgdHdvIHBhdGhzIGFyZSBqb2luZWQgd2l0aCBhIHNsYXNoLlxuICogLSBKb2luaW5nIGZvciBleGFtcGxlICdodHRwOi8vJyBhbmQgJ3d3dy5leGFtcGxlLmNvbScgaXMgYWxzbyBzdXBwb3J0ZWQuXG4gKi9cbmZ1bmN0aW9uIGpvaW4oYVJvb3QsIGFQYXRoKSB7XG4gIGlmIChhUm9vdCA9PT0gXCJcIikge1xuICAgIGFSb290ID0gXCIuXCI7XG4gIH1cbiAgaWYgKGFQYXRoID09PSBcIlwiKSB7XG4gICAgYVBhdGggPSBcIi5cIjtcbiAgfVxuICB2YXIgYVBhdGhVcmwgPSB1cmxQYXJzZShhUGF0aCk7XG4gIHZhciBhUm9vdFVybCA9IHVybFBhcnNlKGFSb290KTtcbiAgaWYgKGFSb290VXJsKSB7XG4gICAgYVJvb3QgPSBhUm9vdFVybC5wYXRoIHx8ICcvJztcbiAgfVxuXG4gIC8vIGBqb2luKGZvbywgJy8vd3d3LmV4YW1wbGUub3JnJylgXG4gIGlmIChhUGF0aFVybCAmJiAhYVBhdGhVcmwuc2NoZW1lKSB7XG4gICAgaWYgKGFSb290VXJsKSB7XG4gICAgICBhUGF0aFVybC5zY2hlbWUgPSBhUm9vdFVybC5zY2hlbWU7XG4gICAgfVxuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUGF0aFVybCk7XG4gIH1cblxuICBpZiAoYVBhdGhVcmwgfHwgYVBhdGgubWF0Y2goZGF0YVVybFJlZ2V4cCkpIHtcbiAgICByZXR1cm4gYVBhdGg7XG4gIH1cblxuICAvLyBgam9pbignaHR0cDovLycsICd3d3cuZXhhbXBsZS5jb20nKWBcbiAgaWYgKGFSb290VXJsICYmICFhUm9vdFVybC5ob3N0ICYmICFhUm9vdFVybC5wYXRoKSB7XG4gICAgYVJvb3RVcmwuaG9zdCA9IGFQYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cblxuICB2YXIgam9pbmVkID0gYVBhdGguY2hhckF0KDApID09PSAnLydcbiAgICA/IGFQYXRoXG4gICAgOiBub3JtYWxpemUoYVJvb3QucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyBhUGF0aCk7XG5cbiAgaWYgKGFSb290VXJsKSB7XG4gICAgYVJvb3RVcmwucGF0aCA9IGpvaW5lZDtcbiAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVJvb3RVcmwpO1xuICB9XG4gIHJldHVybiBqb2luZWQ7XG59XG5leHBvcnRzLmpvaW4gPSBqb2luO1xuXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbiAoYVBhdGgpIHtcbiAgcmV0dXJuIGFQYXRoLmNoYXJBdCgwKSA9PT0gJy8nIHx8IHVybFJlZ2V4cC50ZXN0KGFQYXRoKTtcbn07XG5cbi8qKlxuICogTWFrZSBhIHBhdGggcmVsYXRpdmUgdG8gYSBVUkwgb3IgYW5vdGhlciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhUm9vdCBUaGUgcm9vdCBwYXRoIG9yIFVSTC5cbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciBVUkwgdG8gYmUgbWFkZSByZWxhdGl2ZSB0byBhUm9vdC5cbiAqL1xuZnVuY3Rpb24gcmVsYXRpdmUoYVJvb3QsIGFQYXRoKSB7XG4gIGlmIChhUm9vdCA9PT0gXCJcIikge1xuICAgIGFSb290ID0gXCIuXCI7XG4gIH1cblxuICBhUm9vdCA9IGFSb290LnJlcGxhY2UoL1xcLyQvLCAnJyk7XG5cbiAgLy8gSXQgaXMgcG9zc2libGUgZm9yIHRoZSBwYXRoIHRvIGJlIGFib3ZlIHRoZSByb290LiBJbiB0aGlzIGNhc2UsIHNpbXBseVxuICAvLyBjaGVja2luZyB3aGV0aGVyIHRoZSByb290IGlzIGEgcHJlZml4IG9mIHRoZSBwYXRoIHdvbid0IHdvcmsuIEluc3RlYWQsIHdlXG4gIC8vIG5lZWQgdG8gcmVtb3ZlIGNvbXBvbmVudHMgZnJvbSB0aGUgcm9vdCBvbmUgYnkgb25lLCB1bnRpbCBlaXRoZXIgd2UgZmluZFxuICAvLyBhIHByZWZpeCB0aGF0IGZpdHMsIG9yIHdlIHJ1biBvdXQgb2YgY29tcG9uZW50cyB0byByZW1vdmUuXG4gIHZhciBsZXZlbCA9IDA7XG4gIHdoaWxlIChhUGF0aC5pbmRleE9mKGFSb290ICsgJy8nKSAhPT0gMCkge1xuICAgIHZhciBpbmRleCA9IGFSb290Lmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG9ubHkgcGFydCBvZiB0aGUgcm9vdCB0aGF0IGlzIGxlZnQgaXMgdGhlIHNjaGVtZSAoaS5lLiBodHRwOi8vLFxuICAgIC8vIGZpbGU6Ly8vLCBldGMuKSwgb25lIG9yIG1vcmUgc2xhc2hlcyAoLyksIG9yIHNpbXBseSBub3RoaW5nIGF0IGFsbCwgd2VcbiAgICAvLyBoYXZlIGV4aGF1c3RlZCBhbGwgY29tcG9uZW50cywgc28gdGhlIHBhdGggaXMgbm90IHJlbGF0aXZlIHRvIHRoZSByb290LlxuICAgIGFSb290ID0gYVJvb3Quc2xpY2UoMCwgaW5kZXgpO1xuICAgIGlmIChhUm9vdC5tYXRjaCgvXihbXlxcL10rOlxcLyk/XFwvKiQvKSkge1xuICAgICAgcmV0dXJuIGFQYXRoO1xuICAgIH1cblxuICAgICsrbGV2ZWw7XG4gIH1cblxuICAvLyBNYWtlIHN1cmUgd2UgYWRkIGEgXCIuLi9cIiBmb3IgZWFjaCBjb21wb25lbnQgd2UgcmVtb3ZlZCBmcm9tIHRoZSByb290LlxuICByZXR1cm4gQXJyYXkobGV2ZWwgKyAxKS5qb2luKFwiLi4vXCIpICsgYVBhdGguc3Vic3RyKGFSb290Lmxlbmd0aCArIDEpO1xufVxuZXhwb3J0cy5yZWxhdGl2ZSA9IHJlbGF0aXZlO1xuXG52YXIgc3VwcG9ydHNOdWxsUHJvdG8gPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcmV0dXJuICEoJ19fcHJvdG9fXycgaW4gb2JqKTtcbn0oKSk7XG5cbmZ1bmN0aW9uIGlkZW50aXR5IChzKSB7XG4gIHJldHVybiBzO1xufVxuXG4vKipcbiAqIEJlY2F1c2UgYmVoYXZpb3IgZ29lcyB3YWNreSB3aGVuIHlvdSBzZXQgYF9fcHJvdG9fX2Agb24gb2JqZWN0cywgd2VcbiAqIGhhdmUgdG8gcHJlZml4IGFsbCB0aGUgc3RyaW5ncyBpbiBvdXIgc2V0IHdpdGggYW4gYXJiaXRyYXJ5IGNoYXJhY3Rlci5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9wdWxsLzMxIGFuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9pc3N1ZXMvMzBcbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuZnVuY3Rpb24gdG9TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiAnJCcgKyBhU3RyO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLnRvU2V0U3RyaW5nID0gc3VwcG9ydHNOdWxsUHJvdG8gPyBpZGVudGl0eSA6IHRvU2V0U3RyaW5nO1xuXG5mdW5jdGlvbiBmcm9tU2V0U3RyaW5nKGFTdHIpIHtcbiAgaWYgKGlzUHJvdG9TdHJpbmcoYVN0cikpIHtcbiAgICByZXR1cm4gYVN0ci5zbGljZSgxKTtcbiAgfVxuXG4gIHJldHVybiBhU3RyO1xufVxuZXhwb3J0cy5mcm9tU2V0U3RyaW5nID0gc3VwcG9ydHNOdWxsUHJvdG8gPyBpZGVudGl0eSA6IGZyb21TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzUHJvdG9TdHJpbmcocykge1xuICBpZiAoIXMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgbGVuZ3RoID0gcy5sZW5ndGg7XG5cbiAgaWYgKGxlbmd0aCA8IDkgLyogXCJfX3Byb3RvX19cIi5sZW5ndGggKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocy5jaGFyQ29kZUF0KGxlbmd0aCAtIDEpICE9PSA5NSAgLyogJ18nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMikgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAzKSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDQpICE9PSAxMTYgLyogJ3QnICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNSkgIT09IDExMSAvKiAnbycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA2KSAhPT0gMTE0IC8qICdyJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDcpICE9PSAxMTIgLyogJ3AnICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gOCkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA5KSAhPT0gOTUgIC8qICdfJyAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSBsZW5ndGggLSAxMDsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAocy5jaGFyQ29kZUF0KGkpICE9PSAzNiAvKiAnJCcgKi8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdoZXJlIHRoZSBvcmlnaW5hbCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICpcbiAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgb3JpZ2luYWwgc291cmNlL2xpbmUvY29sdW1uLCBidXQgZGlmZmVyZW50IGdlbmVyYXRlZFxuICogbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGEgbWFwcGluZyB3aXRoIGFcbiAqIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVPcmlnaW5hbCkge1xuICB2YXIgY21wID0gc3RyY21wKG1hcHBpbmdBLnNvdXJjZSwgbWFwcGluZ0Iuc291cmNlKTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICByZXR1cm4gc3RyY21wKG1hcHBpbmdBLm5hbWUsIG1hcHBpbmdCLm5hbWUpO1xufVxuZXhwb3J0cy5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyA9IGNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zO1xuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2l0aCBkZWZsYXRlZCBzb3VyY2UgYW5kIG5hbWUgaW5kaWNlcyB3aGVyZVxuICogdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICpcbiAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiwgYnV0IGRpZmZlcmVudFxuICogc291cmNlL25hbWUvb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGFcbiAqIG1hcHBpbmcgd2l0aCBhIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHtcbiAgdmFyIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkID0gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQ7XG5cbmZ1bmN0aW9uIHN0cmNtcChhU3RyMSwgYVN0cjIpIHtcbiAgaWYgKGFTdHIxID09PSBhU3RyMikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYgKGFTdHIxID09PSBudWxsKSB7XG4gICAgcmV0dXJuIDE7IC8vIGFTdHIyICE9PSBudWxsXG4gIH1cblxuICBpZiAoYVN0cjIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gLTE7IC8vIGFTdHIxICE9PSBudWxsXG4gIH1cblxuICBpZiAoYVN0cjEgPiBhU3RyMikge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2l0aCBpbmZsYXRlZCBzb3VyY2UgYW5kIG5hbWUgc3RyaW5ncyB3aGVyZVxuICogdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIHtcbiAgdmFyIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkID0gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQ7XG5cbi8qKlxuICogU3RyaXAgYW55IEpTT04gWFNTSSBhdm9pZGFuY2UgcHJlZml4IGZyb20gdGhlIHN0cmluZyAoYXMgZG9jdW1lbnRlZFxuICogaW4gdGhlIHNvdXJjZSBtYXBzIHNwZWNpZmljYXRpb24pLCBhbmQgdGhlbiBwYXJzZSB0aGUgc3RyaW5nIGFzXG4gKiBKU09OLlxuICovXG5mdW5jdGlvbiBwYXJzZVNvdXJjZU1hcElucHV0KHN0cikge1xuICByZXR1cm4gSlNPTi5wYXJzZShzdHIucmVwbGFjZSgvXlxcKV19J1teXFxuXSpcXG4vLCAnJykpO1xufVxuZXhwb3J0cy5wYXJzZVNvdXJjZU1hcElucHV0ID0gcGFyc2VTb3VyY2VNYXBJbnB1dDtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBVUkwgb2YgYSBzb3VyY2UgZ2l2ZW4gdGhlIHRoZSBzb3VyY2Ugcm9vdCwgdGhlIHNvdXJjZSdzXG4gKiBVUkwsIGFuZCB0aGUgc291cmNlIG1hcCdzIFVSTC5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVNvdXJjZVVSTChzb3VyY2VSb290LCBzb3VyY2VVUkwsIHNvdXJjZU1hcFVSTCkge1xuICBzb3VyY2VVUkwgPSBzb3VyY2VVUkwgfHwgJyc7XG5cbiAgaWYgKHNvdXJjZVJvb3QpIHtcbiAgICAvLyBUaGlzIGZvbGxvd3Mgd2hhdCBDaHJvbWUgZG9lcy5cbiAgICBpZiAoc291cmNlUm9vdFtzb3VyY2VSb290Lmxlbmd0aCAtIDFdICE9PSAnLycgJiYgc291cmNlVVJMWzBdICE9PSAnLycpIHtcbiAgICAgIHNvdXJjZVJvb3QgKz0gJy8nO1xuICAgIH1cbiAgICAvLyBUaGUgc3BlYyBzYXlzOlxuICAgIC8vICAgTGluZSA0OiBBbiBvcHRpb25hbCBzb3VyY2Ugcm9vdCwgdXNlZnVsIGZvciByZWxvY2F0aW5nIHNvdXJjZVxuICAgIC8vICAgZmlsZXMgb24gYSBzZXJ2ZXIgb3IgcmVtb3ZpbmcgcmVwZWF0ZWQgdmFsdWVzIGluIHRoZVxuICAgIC8vICAg4oCcc291cmNlc+KAnSBlbnRyeS4gIFRoaXMgdmFsdWUgaXMgcHJlcGVuZGVkIHRvIHRoZSBpbmRpdmlkdWFsXG4gICAgLy8gICBlbnRyaWVzIGluIHRoZSDigJxzb3VyY2XigJ0gZmllbGQuXG4gICAgc291cmNlVVJMID0gc291cmNlUm9vdCArIHNvdXJjZVVSTDtcbiAgfVxuXG4gIC8vIEhpc3RvcmljYWxseSwgU291cmNlTWFwQ29uc3VtZXIgZGlkIG5vdCB0YWtlIHRoZSBzb3VyY2VNYXBVUkwgYXNcbiAgLy8gYSBwYXJhbWV0ZXIuICBUaGlzIG1vZGUgaXMgc3RpbGwgc29tZXdoYXQgc3VwcG9ydGVkLCB3aGljaCBpcyB3aHlcbiAgLy8gdGhpcyBjb2RlIGJsb2NrIGlzIGNvbmRpdGlvbmFsLiAgSG93ZXZlciwgaXQncyBwcmVmZXJhYmxlIHRvIHBhc3NcbiAgLy8gdGhlIHNvdXJjZSBtYXAgVVJMIHRvIFNvdXJjZU1hcENvbnN1bWVyLCBzbyB0aGF0IHRoaXMgZnVuY3Rpb25cbiAgLy8gY2FuIGltcGxlbWVudCB0aGUgc291cmNlIFVSTCByZXNvbHV0aW9uIGFsZ29yaXRobSBhcyBvdXRsaW5lZCBpblxuICAvLyB0aGUgc3BlYy4gIFRoaXMgYmxvY2sgaXMgYmFzaWNhbGx5IHRoZSBlcXVpdmFsZW50IG9mOlxuICAvLyAgICBuZXcgVVJMKHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKS50b1N0cmluZygpXG4gIC8vIC4uLiBleGNlcHQgaXQgYXZvaWRzIHVzaW5nIFVSTCwgd2hpY2ggd2Fzbid0IGF2YWlsYWJsZSBpbiB0aGVcbiAgLy8gb2xkZXIgcmVsZWFzZXMgb2Ygbm9kZSBzdGlsbCBzdXBwb3J0ZWQgYnkgdGhpcyBsaWJyYXJ5LlxuICAvL1xuICAvLyBUaGUgc3BlYyBzYXlzOlxuICAvLyAgIElmIHRoZSBzb3VyY2VzIGFyZSBub3QgYWJzb2x1dGUgVVJMcyBhZnRlciBwcmVwZW5kaW5nIG9mIHRoZVxuICAvLyAgIOKAnHNvdXJjZVJvb3TigJ0sIHRoZSBzb3VyY2VzIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGVcbiAgLy8gICBTb3VyY2VNYXAgKGxpa2UgcmVzb2x2aW5nIHNjcmlwdCBzcmMgaW4gYSBodG1sIGRvY3VtZW50KS5cbiAgaWYgKHNvdXJjZU1hcFVSTCkge1xuICAgIHZhciBwYXJzZWQgPSB1cmxQYXJzZShzb3VyY2VNYXBVUkwpO1xuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzb3VyY2VNYXBVUkwgY291bGQgbm90IGJlIHBhcnNlZFwiKTtcbiAgICB9XG4gICAgaWYgKHBhcnNlZC5wYXRoKSB7XG4gICAgICAvLyBTdHJpcCB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCwgYnV0IGtlZXAgdGhlIFwiL1wiLlxuICAgICAgdmFyIGluZGV4ID0gcGFyc2VkLnBhdGgubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHBhcnNlZC5wYXRoID0gcGFyc2VkLnBhdGguc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNvdXJjZVVSTCA9IGpvaW4odXJsR2VuZXJhdGUocGFyc2VkKSwgc291cmNlVVJMKTtcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemUoc291cmNlVVJMKTtcbn1cbmV4cG9ydHMuY29tcHV0ZVNvdXJjZVVSTCA9IGNvbXB1dGVTb3VyY2VVUkw7XG4iLCIvKlxuICogQ29weXJpZ2h0IDIwMDktMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0UudHh0IG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5leHBvcnRzLlNvdXJjZU1hcEdlbmVyYXRvciA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS1tYXAtY29uc3VtZXInKS5Tb3VyY2VNYXBDb25zdW1lcjtcbmV4cG9ydHMuU291cmNlTm9kZSA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS1ub2RlJykuU291cmNlTm9kZTtcbiIsIi8qIGdsb2JhbCB3aW5kb3csIGV4cG9ydHMsIGRlZmluZSAqL1xuXG4hZnVuY3Rpb24oKSB7XG4gICAgJ3VzZSBzdHJpY3QnXG5cbiAgICB2YXIgcmUgPSB7XG4gICAgICAgIG5vdF9zdHJpbmc6IC9bXnNdLyxcbiAgICAgICAgbm90X2Jvb2w6IC9bXnRdLyxcbiAgICAgICAgbm90X3R5cGU6IC9bXlRdLyxcbiAgICAgICAgbm90X3ByaW1pdGl2ZTogL1tedl0vLFxuICAgICAgICBudW1iZXI6IC9bZGllZmddLyxcbiAgICAgICAgbnVtZXJpY19hcmc6IC9bYmNkaWVmZ3V4WF0vLFxuICAgICAgICBqc29uOiAvW2pdLyxcbiAgICAgICAgbm90X2pzb246IC9bXmpdLyxcbiAgICAgICAgdGV4dDogL15bXlxceDI1XSsvLFxuICAgICAgICBtb2R1bG86IC9eXFx4MjV7Mn0vLFxuICAgICAgICBwbGFjZWhvbGRlcjogL15cXHgyNSg/OihbMS05XVxcZCopXFwkfFxcKChbXildKylcXCkpPyhcXCspPygwfCdbXiRdKT8oLSk/KFxcZCspPyg/OlxcLihcXGQrKSk/KFtiLWdpam9zdFR1dnhYXSkvLFxuICAgICAgICBrZXk6IC9eKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGtleV9hY2Nlc3M6IC9eXFwuKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGluZGV4X2FjY2VzczogL15cXFsoXFxkKylcXF0vLFxuICAgICAgICBzaWduOiAvXlsrLV0vXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3ByaW50ZihrZXkpIHtcbiAgICAgICAgLy8gYGFyZ3VtZW50c2AgaXMgbm90IGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGZpbmUgZm9yIHRoaXMgY2FsbFxuICAgICAgICByZXR1cm4gc3ByaW50Zl9mb3JtYXQoc3ByaW50Zl9wYXJzZShrZXkpLCBhcmd1bWVudHMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdnNwcmludGYoZm10LCBhcmd2KSB7XG4gICAgICAgIHJldHVybiBzcHJpbnRmLmFwcGx5KG51bGwsIFtmbXRdLmNvbmNhdChhcmd2IHx8IFtdKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzcHJpbnRmX2Zvcm1hdChwYXJzZV90cmVlLCBhcmd2KSB7XG4gICAgICAgIHZhciBjdXJzb3IgPSAxLCB0cmVlX2xlbmd0aCA9IHBhcnNlX3RyZWUubGVuZ3RoLCBhcmcsIG91dHB1dCA9ICcnLCBpLCBrLCBwaCwgcGFkLCBwYWRfY2hhcmFjdGVyLCBwYWRfbGVuZ3RoLCBpc19wb3NpdGl2ZSwgc2lnblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHJlZV9sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZV90cmVlW2ldID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBwYXJzZV90cmVlW2ldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcGFyc2VfdHJlZVtpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBwaCA9IHBhcnNlX3RyZWVbaV0gLy8gY29udmVuaWVuY2UgcHVycG9zZXMgb25seVxuICAgICAgICAgICAgICAgIGlmIChwaC5rZXlzKSB7IC8vIGtleXdvcmQgYXJndW1lbnRcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltjdXJzb3JdXG4gICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwaC5rZXlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzcHJpbnRmKCdbc3ByaW50Zl0gQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBcIiVzXCIgb2YgdW5kZWZpbmVkIHZhbHVlIFwiJXNcIicsIHBoLmtleXNba10sIHBoLmtleXNbay0xXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmdbcGgua2V5c1trXV1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwaC5wYXJhbV9ubykgeyAvLyBwb3NpdGlvbmFsIGFyZ3VtZW50IChleHBsaWNpdClcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltwaC5wYXJhbV9ub11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIHBvc2l0aW9uYWwgYXJndW1lbnQgKGltcGxpY2l0KVxuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd2W2N1cnNvcisrXVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5ub3RfdHlwZS50ZXN0KHBoLnR5cGUpICYmIHJlLm5vdF9wcmltaXRpdmUudGVzdChwaC50eXBlKSAmJiBhcmcgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5udW1lcmljX2FyZy50ZXN0KHBoLnR5cGUpICYmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyAmJiBpc05hTihhcmcpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNwcmludGYoJ1tzcHJpbnRmXSBleHBlY3RpbmcgbnVtYmVyIGJ1dCBmb3VuZCAlVCcsIGFyZykpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlLm51bWJlci50ZXN0KHBoLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzX3Bvc2l0aXZlID0gYXJnID49IDBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBoLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKS50b1N0cmluZygyKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGFyZywgMTApKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGFyc2VJbnQoYXJnLCAxMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2onOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gSlNPTi5zdHJpbmdpZnkoYXJnLCBudWxsLCBwaC53aWR0aCA/IHBhcnNlSW50KHBoLndpZHRoKSA6IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IHBhcnNlRmxvYXQoYXJnKS50b0V4cG9uZW50aWFsKHBoLnByZWNpc2lvbikgOiBwYXJzZUZsb2F0KGFyZykudG9FeHBvbmVudGlhbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IHBhcnNlRmxvYXQoYXJnKS50b0ZpeGVkKHBoLnByZWNpc2lvbikgOiBwYXJzZUZsb2F0KGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2cnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGgucHJlY2lzaW9uID8gU3RyaW5nKE51bWJlcihhcmcudG9QcmVjaXNpb24ocGgucHJlY2lzaW9uKSkpIDogcGFyc2VGbG9hdChhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwYXJzZUludChhcmcsIDEwKSA+Pj4gMCkudG9TdHJpbmcoOClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gU3RyaW5nKGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IFN0cmluZyghIWFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKSA+Pj4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmUuanNvbi50ZXN0KHBoLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBhcmdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZS5udW1iZXIudGVzdChwaC50eXBlKSAmJiAoIWlzX3Bvc2l0aXZlIHx8IHBoLnNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gaXNfcG9zaXRpdmUgPyAnKycgOiAnLSdcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy50b1N0cmluZygpLnJlcGxhY2UocmUuc2lnbiwgJycpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYWRfY2hhcmFjdGVyID0gcGgucGFkX2NoYXIgPyBwaC5wYWRfY2hhciA9PT0gJzAnID8gJzAnIDogcGgucGFkX2NoYXIuY2hhckF0KDEpIDogJyAnXG4gICAgICAgICAgICAgICAgICAgIHBhZF9sZW5ndGggPSBwaC53aWR0aCAtIChzaWduICsgYXJnKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgcGFkID0gcGgud2lkdGggPyAocGFkX2xlbmd0aCA+IDAgPyBwYWRfY2hhcmFjdGVyLnJlcGVhdChwYWRfbGVuZ3RoKSA6ICcnKSA6ICcnXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBwaC5hbGlnbiA/IHNpZ24gKyBhcmcgKyBwYWQgOiAocGFkX2NoYXJhY3RlciA9PT0gJzAnID8gc2lnbiArIHBhZCArIGFyZyA6IHBhZCArIHNpZ24gKyBhcmcpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICB2YXIgc3ByaW50Zl9jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICAgIGZ1bmN0aW9uIHNwcmludGZfcGFyc2UoZm10KSB7XG4gICAgICAgIGlmIChzcHJpbnRmX2NhY2hlW2ZtdF0pIHtcbiAgICAgICAgICAgIHJldHVybiBzcHJpbnRmX2NhY2hlW2ZtdF1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZm10ID0gZm10LCBtYXRjaCwgcGFyc2VfdHJlZSA9IFtdLCBhcmdfbmFtZXMgPSAwXG4gICAgICAgIHdoaWxlIChfZm10KSB7XG4gICAgICAgICAgICBpZiAoKG1hdGNoID0gcmUudGV4dC5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaChtYXRjaFswXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChtYXRjaCA9IHJlLm1vZHVsby5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaCgnJScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgobWF0Y2ggPSByZS5wbGFjZWhvbGRlci5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMVxuICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGRfbGlzdCA9IFtdLCByZXBsYWNlbWVudF9maWVsZCA9IG1hdGNoWzJdLCBmaWVsZF9tYXRjaCA9IFtdXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXkuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHJlcGxhY2VtZW50X2ZpZWxkID0gcmVwbGFjZW1lbnRfZmllbGQuc3Vic3RyaW5nKGZpZWxkX21hdGNoWzBdLmxlbmd0aCkpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXlfYWNjZXNzLmV4ZWMocmVwbGFjZW1lbnRfZmllbGQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChmaWVsZF9tYXRjaCA9IHJlLmluZGV4X2FjY2Vzcy5leGVjKHJlcGxhY2VtZW50X2ZpZWxkKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGlzdC5wdXNoKGZpZWxkX21hdGNoWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gPSBmaWVsZF9saXN0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXJnX25hbWVzID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogbWF0Y2hbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9ubzogICAgbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiAgICAgICAgbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduOiAgICAgICAgbWF0Y2hbM10sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRfY2hhcjogICAgbWF0Y2hbNF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogICAgICAgbWF0Y2hbNV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogICAgICAgbWF0Y2hbNl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246ICAgbWF0Y2hbN10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAgbWF0Y2hbOF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignW3NwcmludGZdIHVuZXhwZWN0ZWQgcGxhY2Vob2xkZXInKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2ZtdCA9IF9mbXQuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3ByaW50Zl9jYWNoZVtmbXRdID0gcGFyc2VfdHJlZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGV4cG9ydCB0byBlaXRoZXIgYnJvd3NlciBvciBub2RlLmpzXG4gICAgICovXG4gICAgLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cbiAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGV4cG9ydHNbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgZXhwb3J0c1sndnNwcmludGYnXSA9IHZzcHJpbnRmXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3aW5kb3dbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgd2luZG93Wyd2c3ByaW50ZiddID0gdnNwcmludGZcblxuICAgICAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKSB7XG4gICAgICAgICAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgJ3NwcmludGYnOiBzcHJpbnRmLFxuICAgICAgICAgICAgICAgICAgICAndnNwcmludGYnOiB2c3ByaW50ZlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBxdW90ZS1wcm9wcyAqL1xufSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4iLCJjb25zdCB7IEV2ZW50RW1pdHRlciB9ID0gcmVxdWlyZSgnZXZlbnRzJylcbmNvbnN0IFNUUkVBTV9ERVNUUk9ZRUQgPSBuZXcgRXJyb3IoJ1N0cmVhbSB3YXMgZGVzdHJveWVkJylcbmNvbnN0IFBSRU1BVFVSRV9DTE9TRSA9IG5ldyBFcnJvcignUHJlbWF0dXJlIGNsb3NlJylcblxuY29uc3QgcXVldWVUaWNrID0gcmVxdWlyZSgncXVldWUtdGljaycpXG5jb25zdCBGSUZPID0gcmVxdWlyZSgnZmFzdC1maWZvJylcbmNvbnN0IFRleHREZWNvZGVyID0gcmVxdWlyZSgndGV4dC1kZWNvZGVyJylcblxuLyogZXNsaW50LWRpc2FibGUgbm8tbXVsdGktc3BhY2VzICovXG5cbi8vIDI5IGJpdHMgdXNlZCB0b3RhbCAoNCBmcm9tIHNoYXJlZCwgMTQgZnJvbSByZWFkLCBhbmQgMTEgZnJvbSB3cml0ZSlcbmNvbnN0IE1BWCA9ICgoMSA8PCAyOSkgLSAxKVxuXG4vLyBTaGFyZWQgc3RhdGVcbmNvbnN0IE9QRU5JTkcgICAgICAgPSAwYjAwMDFcbmNvbnN0IFBSRURFU1RST1lJTkcgPSAwYjAwMTBcbmNvbnN0IERFU1RST1lJTkcgICAgPSAwYjAxMDBcbmNvbnN0IERFU1RST1lFRCAgICAgPSAwYjEwMDBcblxuY29uc3QgTk9UX09QRU5JTkcgPSBNQVggXiBPUEVOSU5HXG5jb25zdCBOT1RfUFJFREVTVFJPWUlORyA9IE1BWCBeIFBSRURFU1RST1lJTkdcblxuLy8gUmVhZCBzdGF0ZSAoNCBiaXQgb2Zmc2V0IGZyb20gc2hhcmVkIHN0YXRlKVxuY29uc3QgUkVBRF9BQ1RJVkUgICAgICAgICAgID0gMGIwMDAwMDAwMDAwMDAwMSA8PCA0XG5jb25zdCBSRUFEX1VQREFUSU5HICAgICAgICAgPSAwYjAwMDAwMDAwMDAwMDEwIDw8IDRcbmNvbnN0IFJFQURfUFJJTUFSWSAgICAgICAgICA9IDBiMDAwMDAwMDAwMDAxMDAgPDwgNFxuY29uc3QgUkVBRF9RVUVVRUQgICAgICAgICAgID0gMGIwMDAwMDAwMDAwMTAwMCA8PCA0XG5jb25zdCBSRUFEX1JFU1VNRUQgICAgICAgICAgPSAwYjAwMDAwMDAwMDEwMDAwIDw8IDRcbmNvbnN0IFJFQURfUElQRV9EUkFJTkVEICAgICA9IDBiMDAwMDAwMDAxMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9FTkRJTkcgICAgICAgICAgID0gMGIwMDAwMDAwMTAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0VNSVRfREFUQSAgICAgICAgPSAwYjAwMDAwMDEwMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRU1JVF9SRUFEQUJMRSAgICA9IDBiMDAwMDAxMDAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9FTUlUVEVEX1JFQURBQkxFID0gMGIwMDAwMTAwMDAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0RPTkUgICAgICAgICAgICAgPSAwYjAwMDEwMDAwMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfTkVYVF9USUNLICAgICAgICA9IDBiMDAxMDAwMDAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9ORUVEU19QVVNIICAgICAgID0gMGIwMTAwMDAwMDAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX1JFQURfQUhFQUQgICAgICAgPSAwYjEwMDAwMDAwMDAwMDAwIDw8IDRcblxuLy8gQ29tYmluZWQgcmVhZCBzdGF0ZVxuY29uc3QgUkVBRF9GTE9XSU5HID0gUkVBRF9SRVNVTUVEIHwgUkVBRF9QSVBFX0RSQUlORURcbmNvbnN0IFJFQURfQUNUSVZFX0FORF9ORUVEU19QVVNIID0gUkVBRF9BQ1RJVkUgfCBSRUFEX05FRURTX1BVU0hcbmNvbnN0IFJFQURfUFJJTUFSWV9BTkRfQUNUSVZFID0gUkVBRF9QUklNQVJZIHwgUkVBRF9BQ1RJVkVcbmNvbnN0IFJFQURfRU1JVF9SRUFEQUJMRV9BTkRfUVVFVUVEID0gUkVBRF9FTUlUX1JFQURBQkxFIHwgUkVBRF9RVUVVRURcbmNvbnN0IFJFQURfUkVTVU1FRF9SRUFEX0FIRUFEID0gUkVBRF9SRVNVTUVEIHwgUkVBRF9SRUFEX0FIRUFEXG5cbmNvbnN0IFJFQURfTk9UX0FDVElWRSAgICAgICAgICAgICA9IE1BWCBeIFJFQURfQUNUSVZFXG5jb25zdCBSRUFEX05PTl9QUklNQVJZICAgICAgICAgICAgPSBNQVggXiBSRUFEX1BSSU1BUllcbmNvbnN0IFJFQURfTk9OX1BSSU1BUllfQU5EX1BVU0hFRCA9IE1BWCBeIChSRUFEX1BSSU1BUlkgfCBSRUFEX05FRURTX1BVU0gpXG5jb25zdCBSRUFEX1BVU0hFRCAgICAgICAgICAgICAgICAgPSBNQVggXiBSRUFEX05FRURTX1BVU0hcbmNvbnN0IFJFQURfUEFVU0VEICAgICAgICAgICAgICAgICA9IE1BWCBeIFJFQURfUkVTVU1FRFxuY29uc3QgUkVBRF9OT1RfUVVFVUVEICAgICAgICAgICAgID0gTUFYIF4gKFJFQURfUVVFVUVEIHwgUkVBRF9FTUlUVEVEX1JFQURBQkxFKVxuY29uc3QgUkVBRF9OT1RfRU5ESU5HICAgICAgICAgICAgID0gTUFYIF4gUkVBRF9FTkRJTkdcbmNvbnN0IFJFQURfUElQRV9OT1RfRFJBSU5FRCAgICAgICA9IE1BWCBeIFJFQURfRkxPV0lOR1xuY29uc3QgUkVBRF9OT1RfTkVYVF9USUNLICAgICAgICAgID0gTUFYIF4gUkVBRF9ORVhUX1RJQ0tcbmNvbnN0IFJFQURfTk9UX1VQREFUSU5HICAgICAgICAgICA9IE1BWCBeIFJFQURfVVBEQVRJTkdcbmNvbnN0IFJFQURfTk9fUkVBRF9BSEVBRCAgICAgICAgICA9IE1BWCBeIFJFQURfUkVBRF9BSEVBRFxuY29uc3QgUkVBRF9QQVVTRURfTk9fUkVBRF9BSEVBRCAgID0gTUFYIF4gUkVBRF9SRVNVTUVEX1JFQURfQUhFQURcblxuLy8gV3JpdGUgc3RhdGUgKDE4IGJpdCBvZmZzZXQsIDQgYml0IG9mZnNldCBmcm9tIHNoYXJlZCBzdGF0ZSBhbmQgMTQgZnJvbSByZWFkIHN0YXRlKVxuY29uc3QgV1JJVEVfQUNUSVZFICAgICA9IDBiMDAwMDAwMDAwMDEgPDwgMThcbmNvbnN0IFdSSVRFX1VQREFUSU5HICAgPSAwYjAwMDAwMDAwMDEwIDw8IDE4XG5jb25zdCBXUklURV9QUklNQVJZICAgID0gMGIwMDAwMDAwMDEwMCA8PCAxOFxuY29uc3QgV1JJVEVfUVVFVUVEICAgICA9IDBiMDAwMDAwMDEwMDAgPDwgMThcbmNvbnN0IFdSSVRFX1VORFJBSU5FRCAgPSAwYjAwMDAwMDEwMDAwIDw8IDE4XG5jb25zdCBXUklURV9ET05FICAgICAgID0gMGIwMDAwMDEwMDAwMCA8PCAxOFxuY29uc3QgV1JJVEVfRU1JVF9EUkFJTiA9IDBiMDAwMDEwMDAwMDAgPDwgMThcbmNvbnN0IFdSSVRFX05FWFRfVElDSyAgPSAwYjAwMDEwMDAwMDAwIDw8IDE4XG5jb25zdCBXUklURV9XUklUSU5HICAgID0gMGIwMDEwMDAwMDAwMCA8PCAxOFxuY29uc3QgV1JJVEVfRklOSVNISU5HICA9IDBiMDEwMDAwMDAwMDAgPDwgMThcbmNvbnN0IFdSSVRFX0NPUktFRCAgICAgPSAwYjEwMDAwMDAwMDAwIDw8IDE4XG5cbmNvbnN0IFdSSVRFX05PVF9BQ1RJVkUgICAgPSBNQVggXiAoV1JJVEVfQUNUSVZFIHwgV1JJVEVfV1JJVElORylcbmNvbnN0IFdSSVRFX05PTl9QUklNQVJZICAgPSBNQVggXiBXUklURV9QUklNQVJZXG5jb25zdCBXUklURV9OT1RfRklOSVNISU5HID0gTUFYIF4gV1JJVEVfRklOSVNISU5HXG5jb25zdCBXUklURV9EUkFJTkVEICAgICAgID0gTUFYIF4gV1JJVEVfVU5EUkFJTkVEXG5jb25zdCBXUklURV9OT1RfUVVFVUVEICAgID0gTUFYIF4gV1JJVEVfUVVFVUVEXG5jb25zdCBXUklURV9OT1RfTkVYVF9USUNLID0gTUFYIF4gV1JJVEVfTkVYVF9USUNLXG5jb25zdCBXUklURV9OT1RfVVBEQVRJTkcgID0gTUFYIF4gV1JJVEVfVVBEQVRJTkdcbmNvbnN0IFdSSVRFX05PVF9DT1JLRUQgICAgPSBNQVggXiBXUklURV9DT1JLRURcblxuLy8gQ29tYmluZWQgc2hhcmVkIHN0YXRlXG5jb25zdCBBQ1RJVkUgPSBSRUFEX0FDVElWRSB8IFdSSVRFX0FDVElWRVxuY29uc3QgTk9UX0FDVElWRSA9IE1BWCBeIEFDVElWRVxuY29uc3QgRE9ORSA9IFJFQURfRE9ORSB8IFdSSVRFX0RPTkVcbmNvbnN0IERFU1RST1lfU1RBVFVTID0gREVTVFJPWUlORyB8IERFU1RST1lFRCB8IFBSRURFU1RST1lJTkdcbmNvbnN0IE9QRU5fU1RBVFVTID0gREVTVFJPWV9TVEFUVVMgfCBPUEVOSU5HXG5jb25zdCBBVVRPX0RFU1RST1kgPSBERVNUUk9ZX1NUQVRVUyB8IERPTkVcbmNvbnN0IE5PTl9QUklNQVJZID0gV1JJVEVfTk9OX1BSSU1BUlkgJiBSRUFEX05PTl9QUklNQVJZXG5jb25zdCBBQ1RJVkVfT1JfVElDS0lORyA9IFdSSVRFX05FWFRfVElDSyB8IFJFQURfTkVYVF9USUNLXG5jb25zdCBUSUNLSU5HID0gQUNUSVZFX09SX1RJQ0tJTkcgJiBOT1RfQUNUSVZFXG5jb25zdCBJU19PUEVOSU5HID0gT1BFTl9TVEFUVVMgfCBUSUNLSU5HXG5cbi8vIENvbWJpbmVkIHNoYXJlZCBzdGF0ZSBhbmQgcmVhZCBzdGF0ZVxuY29uc3QgUkVBRF9QUklNQVJZX1NUQVRVUyA9IE9QRU5fU1RBVFVTIHwgUkVBRF9FTkRJTkcgfCBSRUFEX0RPTkVcbmNvbnN0IFJFQURfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0RPTkUgfCBSRUFEX1FVRVVFRFxuY29uc3QgUkVBRF9FTkRJTkdfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VORElORyB8IFJFQURfUVVFVUVEXG5jb25zdCBSRUFEX1JFQURBQkxFX1NUQVRVUyA9IE9QRU5fU1RBVFVTIHwgUkVBRF9FTUlUX1JFQURBQkxFIHwgUkVBRF9RVUVVRUQgfCBSRUFEX0VNSVRURURfUkVBREFCTEVcbmNvbnN0IFNIT1VMRF9OT1RfUkVBRCA9IE9QRU5fU1RBVFVTIHwgUkVBRF9BQ1RJVkUgfCBSRUFEX0VORElORyB8IFJFQURfRE9ORSB8IFJFQURfTkVFRFNfUFVTSCB8IFJFQURfUkVBRF9BSEVBRFxuY29uc3QgUkVBRF9CQUNLUFJFU1NVUkVfU1RBVFVTID0gREVTVFJPWV9TVEFUVVMgfCBSRUFEX0VORElORyB8IFJFQURfRE9ORVxuY29uc3QgUkVBRF9VUERBVEVfU1lOQ19TVEFUVVMgPSBSRUFEX1VQREFUSU5HIHwgT1BFTl9TVEFUVVMgfCBSRUFEX05FWFRfVElDSyB8IFJFQURfUFJJTUFSWVxuXG4vLyBDb21iaW5lZCB3cml0ZSBzdGF0ZVxuY29uc3QgV1JJVEVfUFJJTUFSWV9TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFdSSVRFX0ZJTklTSElORyB8IFdSSVRFX0RPTkVcbmNvbnN0IFdSSVRFX1FVRVVFRF9BTkRfVU5EUkFJTkVEID0gV1JJVEVfUVVFVUVEIHwgV1JJVEVfVU5EUkFJTkVEXG5jb25zdCBXUklURV9RVUVVRURfQU5EX0FDVElWRSA9IFdSSVRFX1FVRVVFRCB8IFdSSVRFX0FDVElWRVxuY29uc3QgV1JJVEVfRFJBSU5fU1RBVFVTID0gV1JJVEVfUVVFVUVEIHwgV1JJVEVfVU5EUkFJTkVEIHwgT1BFTl9TVEFUVVMgfCBXUklURV9BQ1RJVkVcbmNvbnN0IFdSSVRFX1NUQVRVUyA9IE9QRU5fU1RBVFVTIHwgV1JJVEVfQUNUSVZFIHwgV1JJVEVfUVVFVUVEIHwgV1JJVEVfQ09SS0VEXG5jb25zdCBXUklURV9QUklNQVJZX0FORF9BQ1RJVkUgPSBXUklURV9QUklNQVJZIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBXUklURV9BQ1RJVkVfQU5EX1dSSVRJTkcgPSBXUklURV9BQ1RJVkUgfCBXUklURV9XUklUSU5HXG5jb25zdCBXUklURV9GSU5JU0hJTkdfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBXUklURV9GSU5JU0hJTkcgfCBXUklURV9RVUVVRURfQU5EX0FDVElWRSB8IFdSSVRFX0RPTkVcbmNvbnN0IFdSSVRFX0JBQ0tQUkVTU1VSRV9TVEFUVVMgPSBXUklURV9VTkRSQUlORUQgfCBERVNUUk9ZX1NUQVRVUyB8IFdSSVRFX0ZJTklTSElORyB8IFdSSVRFX0RPTkVcbmNvbnN0IFdSSVRFX1VQREFURV9TWU5DX1NUQVRVUyA9IFdSSVRFX1VQREFUSU5HIHwgT1BFTl9TVEFUVVMgfCBXUklURV9ORVhUX1RJQ0sgfCBXUklURV9QUklNQVJZXG5cbmNvbnN0IGFzeW5jSXRlcmF0b3IgPSBTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBTeW1ib2woJ2FzeW5jSXRlcmF0b3InKVxuXG5jbGFzcyBXcml0YWJsZVN0YXRlIHtcbiAgY29uc3RydWN0b3IgKHN0cmVhbSwgeyBoaWdoV2F0ZXJNYXJrID0gMTYzODQsIG1hcCA9IG51bGwsIG1hcFdyaXRhYmxlLCBieXRlTGVuZ3RoLCBieXRlTGVuZ3RoV3JpdGFibGUgfSA9IHt9KSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW1cbiAgICB0aGlzLnF1ZXVlID0gbmV3IEZJRk8oKVxuICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IGhpZ2hXYXRlck1hcmtcbiAgICB0aGlzLmJ1ZmZlcmVkID0gMFxuICAgIHRoaXMuZXJyb3IgPSBudWxsXG4gICAgdGhpcy5waXBlbGluZSA9IG51bGxcbiAgICB0aGlzLmRyYWlucyA9IG51bGwgLy8gaWYgd2UgYWRkIG1vcmUgc2VsZG9tbHkgdXNlZCBoZWxwZXJzIHdlIG1pZ2h0IHRoZW0gaW50byBhIHN1Ym9iamVjdCBzbyBpdHMgYSBzaW5nbGUgcHRyXG4gICAgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFdyaXRhYmxlIHx8IGJ5dGVMZW5ndGggfHwgZGVmYXVsdEJ5dGVMZW5ndGhcbiAgICB0aGlzLm1hcCA9IG1hcFdyaXRhYmxlIHx8IG1hcFxuICAgIHRoaXMuYWZ0ZXJXcml0ZSA9IGFmdGVyV3JpdGUuYmluZCh0aGlzKVxuICAgIHRoaXMuYWZ0ZXJVcGRhdGVOZXh0VGljayA9IHVwZGF0ZVdyaXRlTlQuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0IGVuZGVkICgpIHtcbiAgICByZXR1cm4gKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0RPTkUpICE9PSAwXG4gIH1cblxuICBwdXNoIChkYXRhKSB7XG4gICAgaWYgKHRoaXMubWFwICE9PSBudWxsKSBkYXRhID0gdGhpcy5tYXAoZGF0YSlcblxuICAgIHRoaXMuYnVmZmVyZWQgKz0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgdGhpcy5xdWV1ZS5wdXNoKGRhdGEpXG5cbiAgICBpZiAodGhpcy5idWZmZXJlZCA8IHRoaXMuaGlnaFdhdGVyTWFyaykge1xuICAgICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFdSSVRFX1FVRVVFRFxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfUVVFVUVEX0FORF9VTkRSQUlORURcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5xdWV1ZS5zaGlmdCgpXG5cbiAgICB0aGlzLmJ1ZmZlcmVkIC09IHRoaXMuYnl0ZUxlbmd0aChkYXRhKVxuICAgIGlmICh0aGlzLmJ1ZmZlcmVkID09PSAwKSB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX1FVRVVFRFxuXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIGVuZCAoZGF0YSkge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5zdHJlYW0ub25jZSgnZmluaXNoJywgZGF0YSlcbiAgICBlbHNlIGlmIChkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YSAhPT0gbnVsbCkgdGhpcy5wdXNoKGRhdGEpXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlID0gKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFdSSVRFX0ZJTklTSElORykgJiBXUklURV9OT05fUFJJTUFSWVxuICB9XG5cbiAgYXV0b0JhdGNoIChkYXRhLCBjYikge1xuICAgIGNvbnN0IGJ1ZmZlciA9IFtdXG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIGJ1ZmZlci5wdXNoKGRhdGEpXG4gICAgd2hpbGUgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfU1RBVFVTKSA9PT0gV1JJVEVfUVVFVUVEX0FORF9BQ1RJVkUpIHtcbiAgICAgIGJ1ZmZlci5wdXNoKHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5zaGlmdCgpKVxuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIE9QRU5fU1RBVFVTKSAhPT0gMCkgcmV0dXJuIGNiKG51bGwpXG4gICAgc3RyZWFtLl93cml0ZXYoYnVmZmVyLCBjYilcbiAgfVxuXG4gIHVwZGF0ZSAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfVVBEQVRJTkdcblxuICAgIGRvIHtcbiAgICAgIHdoaWxlICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1NUQVRVUykgPT09IFdSSVRFX1FVRVVFRCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5zaGlmdCgpXG4gICAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfQUNUSVZFX0FORF9XUklUSU5HXG4gICAgICAgIHN0cmVhbS5fd3JpdGUoZGF0YSwgdGhpcy5hZnRlcldyaXRlKVxuICAgICAgfVxuXG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9QUklNQVJZX0FORF9BQ1RJVkUpID09PSAwKSB0aGlzLnVwZGF0ZU5vblByaW1hcnkoKVxuICAgIH0gd2hpbGUgKHRoaXMuY29udGludWVVcGRhdGUoKSA9PT0gdHJ1ZSlcblxuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX1VQREFUSU5HXG4gIH1cblxuICB1cGRhdGVOb25QcmltYXJ5ICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRklOSVNISU5HX1NUQVRVUykgPT09IFdSSVRFX0ZJTklTSElORykge1xuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgV1JJVEVfQUNUSVZFKSAmIFdSSVRFX05PVF9GSU5JU0hJTkdcbiAgICAgIHN0cmVhbS5fZmluYWwoYWZ0ZXJGaW5hbC5iaW5kKHRoaXMpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWV9TVEFUVVMpID09PSBERVNUUk9ZSU5HKSB7XG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBBQ1RJVkVfT1JfVElDS0lORykgPT09IDApIHtcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBBQ1RJVkVcbiAgICAgICAgc3RyZWFtLl9kZXN0cm95KGFmdGVyRGVzdHJveS5iaW5kKHRoaXMpKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgSVNfT1BFTklORykgPT09IE9QRU5JTkcpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IEFDVElWRSkgJiBOT1RfT1BFTklOR1xuICAgICAgc3RyZWFtLl9vcGVuKGFmdGVyT3Blbi5iaW5kKHRoaXMpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnRpbnVlVXBkYXRlICgpIHtcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX05FWFRfVElDSykgPT09IDApIHJldHVybiBmYWxzZVxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfTkVYVF9USUNLXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHVwZGF0ZUNhbGxiYWNrICgpIHtcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1VQREFURV9TWU5DX1NUQVRVUykgPT09IFdSSVRFX1BSSU1BUlkpIHRoaXMudXBkYXRlKClcbiAgICBlbHNlIHRoaXMudXBkYXRlTmV4dFRpY2soKVxuICB9XG5cbiAgdXBkYXRlTmV4dFRpY2sgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfTkVYVF9USUNLKSAhPT0gMCkgcmV0dXJuXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFdSSVRFX05FWFRfVElDS1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfVVBEQVRJTkcpID09PSAwKSBxdWV1ZVRpY2sodGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrKVxuICB9XG59XG5cbmNsYXNzIFJlYWRhYmxlU3RhdGUge1xuICBjb25zdHJ1Y3RvciAoc3RyZWFtLCB7IGhpZ2hXYXRlck1hcmsgPSAxNjM4NCwgbWFwID0gbnVsbCwgbWFwUmVhZGFibGUsIGJ5dGVMZW5ndGgsIGJ5dGVMZW5ndGhSZWFkYWJsZSB9ID0ge30pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbVxuICAgIHRoaXMucXVldWUgPSBuZXcgRklGTygpXG4gICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFyayA9PT0gMCA/IDEgOiBoaWdoV2F0ZXJNYXJrXG4gICAgdGhpcy5idWZmZXJlZCA9IDBcbiAgICB0aGlzLnJlYWRBaGVhZCA9IGhpZ2hXYXRlck1hcmsgPiAwXG4gICAgdGhpcy5lcnJvciA9IG51bGxcbiAgICB0aGlzLnBpcGVsaW5lID0gbnVsbFxuICAgIHRoaXMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhSZWFkYWJsZSB8fCBieXRlTGVuZ3RoIHx8IGRlZmF1bHRCeXRlTGVuZ3RoXG4gICAgdGhpcy5tYXAgPSBtYXBSZWFkYWJsZSB8fCBtYXBcbiAgICB0aGlzLnBpcGVUbyA9IG51bGxcbiAgICB0aGlzLmFmdGVyUmVhZCA9IGFmdGVyUmVhZC5iaW5kKHRoaXMpXG4gICAgdGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrID0gdXBkYXRlUmVhZE5ULmJpbmQodGhpcylcbiAgfVxuXG4gIGdldCBlbmRlZCAoKSB7XG4gICAgcmV0dXJuICh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpICE9PSAwXG4gIH1cblxuICBwaXBlIChwaXBlVG8sIGNiKSB7XG4gICAgaWYgKHRoaXMucGlwZVRvICE9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHBpcGUgdG8gb25lIGRlc3RpbmF0aW9uJylcbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG51bGxcblxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBSRUFEX1BJUEVfRFJBSU5FRFxuICAgIHRoaXMucGlwZVRvID0gcGlwZVRvXG4gICAgdGhpcy5waXBlbGluZSA9IG5ldyBQaXBlbGluZSh0aGlzLnN0cmVhbSwgcGlwZVRvLCBjYilcblxuICAgIGlmIChjYikgdGhpcy5zdHJlYW0ub24oJ2Vycm9yJywgbm9vcCkgLy8gV2UgYWxyZWFkeSBlcnJvciBoYW5kbGUgdGhpcyBzbyBzdXByZXNzIGNyYXNoZXNcblxuICAgIGlmIChpc1N0cmVhbXgocGlwZVRvKSkge1xuICAgICAgcGlwZVRvLl93cml0YWJsZVN0YXRlLnBpcGVsaW5lID0gdGhpcy5waXBlbGluZVxuICAgICAgaWYgKGNiKSBwaXBlVG8ub24oJ2Vycm9yJywgbm9vcCkgLy8gV2UgYWxyZWFkeSBlcnJvciBoYW5kbGUgdGhpcyBzbyBzdXByZXNzIGNyYXNoZXNcbiAgICAgIHBpcGVUby5vbignZmluaXNoJywgdGhpcy5waXBlbGluZS5maW5pc2hlZC5iaW5kKHRoaXMucGlwZWxpbmUpKSAvLyBUT0RPOiBqdXN0IGNhbGwgZmluaXNoZWQgZnJvbSBwaXBlVG8gaXRzZWxmXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9uZXJyb3IgPSB0aGlzLnBpcGVsaW5lLmRvbmUuYmluZCh0aGlzLnBpcGVsaW5lLCBwaXBlVG8pXG4gICAgICBjb25zdCBvbmNsb3NlID0gdGhpcy5waXBlbGluZS5kb25lLmJpbmQodGhpcy5waXBlbGluZSwgcGlwZVRvLCBudWxsKSAvLyBvbmNsb3NlIGhhcyBhIHdlaXJkIGJvb2wgYXJnXG4gICAgICBwaXBlVG8ub24oJ2Vycm9yJywgb25lcnJvcilcbiAgICAgIHBpcGVUby5vbignY2xvc2UnLCBvbmNsb3NlKVxuICAgICAgcGlwZVRvLm9uKCdmaW5pc2gnLCB0aGlzLnBpcGVsaW5lLmZpbmlzaGVkLmJpbmQodGhpcy5waXBlbGluZSkpXG4gICAgfVxuXG4gICAgcGlwZVRvLm9uKCdkcmFpbicsIGFmdGVyRHJhaW4uYmluZCh0aGlzKSlcbiAgICB0aGlzLnN0cmVhbS5lbWl0KCdwaXBpbmcnLCBwaXBlVG8pXG4gICAgcGlwZVRvLmVtaXQoJ3BpcGUnLCB0aGlzLnN0cmVhbSlcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IDBcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgPSAoc3RyZWFtLl9kdXBsZXhTdGF0ZSB8IFJFQURfRU5ESU5HKSAmIFJFQURfTk9OX1BSSU1BUllfQU5EX1BVU0hFRFxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWFwICE9PSBudWxsKSB7XG4gICAgICBkYXRhID0gdGhpcy5tYXAoZGF0YSlcbiAgICAgIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gdGhpcy5idWZmZXJlZCA8IHRoaXMuaGlnaFdhdGVyTWFya1xuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyZWQgKz0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgdGhpcy5xdWV1ZS5wdXNoKGRhdGEpXG5cbiAgICBzdHJlYW0uX2R1cGxleFN0YXRlID0gKHN0cmVhbS5fZHVwbGV4U3RhdGUgfCBSRUFEX1FVRVVFRCkgJiBSRUFEX1BVU0hFRFxuXG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyZWQgPCB0aGlzLmhpZ2hXYXRlck1hcmtcbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5xdWV1ZS5zaGlmdCgpXG5cbiAgICB0aGlzLmJ1ZmZlcmVkIC09IHRoaXMuYnl0ZUxlbmd0aChkYXRhKVxuICAgIGlmICh0aGlzLmJ1ZmZlcmVkID09PSAwKSB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfUVVFVUVEXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIHVuc2hpZnQgKGRhdGEpIHtcbiAgICBjb25zdCBwZW5kaW5nID0gW3RoaXMubWFwICE9PSBudWxsID8gdGhpcy5tYXAoZGF0YSkgOiBkYXRhXVxuICAgIHdoaWxlICh0aGlzLmJ1ZmZlcmVkID4gMCkgcGVuZGluZy5wdXNoKHRoaXMuc2hpZnQoKSlcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBwZW5kaW5nW2ldXG4gICAgICB0aGlzLmJ1ZmZlcmVkICs9IHRoaXMuYnl0ZUxlbmd0aChkYXRhKVxuICAgICAgdGhpcy5xdWV1ZS5wdXNoKGRhdGEpXG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKHBlbmRpbmdbcGVuZGluZy5sZW5ndGggLSAxXSlcbiAgfVxuXG4gIHJlYWQgKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1NUQVRVUykgPT09IFJFQURfUVVFVUVEKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5zaGlmdCgpXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwgJiYgdGhpcy5waXBlVG8ud3JpdGUoZGF0YSkgPT09IGZhbHNlKSBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfUElQRV9OT1RfRFJBSU5FRFxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTUlUX0RBVEEpICE9PSAwKSBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlYWRBaGVhZCA9PT0gZmFsc2UpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9SRUFEX0FIRUFEXG4gICAgICB0aGlzLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZHJhaW4gKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICB3aGlsZSAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1NUQVRVUykgPT09IFJFQURfUVVFVUVEICYmIChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9GTE9XSU5HKSAhPT0gMCkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2hpZnQoKVxuICAgICAgaWYgKHRoaXMucGlwZVRvICE9PSBudWxsICYmIHRoaXMucGlwZVRvLndyaXRlKGRhdGEpID09PSBmYWxzZSkgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX1BJUEVfTk9UX0RSQUlORURcbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfRU1JVF9EQVRBKSAhPT0gMCkgc3RyZWFtLmVtaXQoJ2RhdGEnLCBkYXRhKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9VUERBVElOR1xuXG4gICAgZG8ge1xuICAgICAgdGhpcy5kcmFpbigpXG5cbiAgICAgIHdoaWxlICh0aGlzLmJ1ZmZlcmVkIDwgdGhpcy5oaWdoV2F0ZXJNYXJrICYmIChzdHJlYW0uX2R1cGxleFN0YXRlICYgU0hPVUxEX05PVF9SRUFEKSA9PT0gUkVBRF9SRUFEX0FIRUFEKSB7XG4gICAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9BQ1RJVkVfQU5EX05FRURTX1BVU0hcbiAgICAgICAgc3RyZWFtLl9yZWFkKHRoaXMuYWZ0ZXJSZWFkKVxuICAgICAgICB0aGlzLmRyYWluKClcbiAgICAgIH1cblxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9SRUFEQUJMRV9TVEFUVVMpID09PSBSRUFEX0VNSVRfUkVBREFCTEVfQU5EX1FVRVVFRCkge1xuICAgICAgICBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfRU1JVFRFRF9SRUFEQUJMRVxuICAgICAgICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKVxuICAgICAgfVxuXG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1BSSU1BUllfQU5EX0FDVElWRSkgPT09IDApIHRoaXMudXBkYXRlTm9uUHJpbWFyeSgpXG4gICAgfSB3aGlsZSAodGhpcy5jb250aW51ZVVwZGF0ZSgpID09PSB0cnVlKVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PVF9VUERBVElOR1xuICB9XG5cbiAgdXBkYXRlTm9uUHJpbWFyeSAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfRU5ESU5HX1NUQVRVUykgPT09IFJFQURfRU5ESU5HKSB7XG4gICAgICBzdHJlYW0uX2R1cGxleFN0YXRlID0gKHN0cmVhbS5fZHVwbGV4U3RhdGUgfCBSRUFEX0RPTkUpICYgUkVBRF9OT1RfRU5ESU5HXG4gICAgICBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIEFVVE9fREVTVFJPWSkgPT09IERPTkUpIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gREVTVFJPWUlOR1xuICAgICAgaWYgKHRoaXMucGlwZVRvICE9PSBudWxsKSB0aGlzLnBpcGVUby5lbmQoKVxuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSA9PT0gREVTVFJPWUlORykge1xuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgQUNUSVZFX09SX1RJQ0tJTkcpID09PSAwKSB7XG4gICAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gQUNUSVZFXG4gICAgICAgIHN0cmVhbS5fZGVzdHJveShhZnRlckRlc3Ryb3kuYmluZCh0aGlzKSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIElTX09QRU5JTkcpID09PSBPUEVOSU5HKSB7XG4gICAgICBzdHJlYW0uX2R1cGxleFN0YXRlID0gKHN0cmVhbS5fZHVwbGV4U3RhdGUgfCBBQ1RJVkUpICYgTk9UX09QRU5JTkdcbiAgICAgIHN0cmVhbS5fb3BlbihhZnRlck9wZW4uYmluZCh0aGlzKSlcbiAgICB9XG4gIH1cblxuICBjb250aW51ZVVwZGF0ZSAoKSB7XG4gICAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX05FWFRfVElDSykgPT09IDApIHJldHVybiBmYWxzZVxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PVF9ORVhUX1RJQ0tcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdXBkYXRlQ2FsbGJhY2sgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9VUERBVEVfU1lOQ19TVEFUVVMpID09PSBSRUFEX1BSSU1BUlkpIHRoaXMudXBkYXRlKClcbiAgICBlbHNlIHRoaXMudXBkYXRlTmV4dFRpY2soKVxuICB9XG5cbiAgdXBkYXRlTmV4dFRpY2sgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9ORVhUX1RJQ0spICE9PSAwKSByZXR1cm5cbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9ORVhUX1RJQ0tcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfVVBEQVRJTkcpID09PSAwKSBxdWV1ZVRpY2sodGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrKVxuICB9XG59XG5cbmNsYXNzIFRyYW5zZm9ybVN0YXRlIHtcbiAgY29uc3RydWN0b3IgKHN0cmVhbSkge1xuICAgIHRoaXMuZGF0YSA9IG51bGxcbiAgICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gYWZ0ZXJUcmFuc2Zvcm0uYmluZChzdHJlYW0pXG4gICAgdGhpcy5hZnRlckZpbmFsID0gbnVsbFxuICB9XG59XG5cbmNsYXNzIFBpcGVsaW5lIHtcbiAgY29uc3RydWN0b3IgKHNyYywgZHN0LCBjYikge1xuICAgIHRoaXMuZnJvbSA9IHNyY1xuICAgIHRoaXMudG8gPSBkc3RcbiAgICB0aGlzLmFmdGVyUGlwZSA9IGNiXG4gICAgdGhpcy5lcnJvciA9IG51bGxcbiAgICB0aGlzLnBpcGVUb0ZpbmlzaGVkID0gZmFsc2VcbiAgfVxuXG4gIGZpbmlzaGVkICgpIHtcbiAgICB0aGlzLnBpcGVUb0ZpbmlzaGVkID0gdHJ1ZVxuICB9XG5cbiAgZG9uZSAoc3RyZWFtLCBlcnIpIHtcbiAgICBpZiAoZXJyKSB0aGlzLmVycm9yID0gZXJyXG5cbiAgICBpZiAoc3RyZWFtID09PSB0aGlzLnRvKSB7XG4gICAgICB0aGlzLnRvID0gbnVsbFxuXG4gICAgICBpZiAodGhpcy5mcm9tICE9PSBudWxsKSB7XG4gICAgICAgIGlmICgodGhpcy5mcm9tLl9kdXBsZXhTdGF0ZSAmIFJFQURfRE9ORSkgPT09IDAgfHwgIXRoaXMucGlwZVRvRmluaXNoZWQpIHtcbiAgICAgICAgICB0aGlzLmZyb20uZGVzdHJveSh0aGlzLmVycm9yIHx8IG5ldyBFcnJvcignV3JpdGFibGUgc3RyZWFtIGNsb3NlZCBwcmVtYXR1cmVseScpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHJlYW0gPT09IHRoaXMuZnJvbSkge1xuICAgICAgdGhpcy5mcm9tID0gbnVsbFxuXG4gICAgICBpZiAodGhpcy50byAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpID09PSAwKSB7XG4gICAgICAgICAgdGhpcy50by5kZXN0cm95KHRoaXMuZXJyb3IgfHwgbmV3IEVycm9yKCdSZWFkYWJsZSBzdHJlYW0gY2xvc2VkIGJlZm9yZSBlbmRpbmcnKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5hZnRlclBpcGUgIT09IG51bGwpIHRoaXMuYWZ0ZXJQaXBlKHRoaXMuZXJyb3IpXG4gICAgdGhpcy50byA9IHRoaXMuZnJvbSA9IHRoaXMuYWZ0ZXJQaXBlID0gbnVsbFxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyRHJhaW4gKCkge1xuICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9QSVBFX0RSQUlORURcbiAgdGhpcy51cGRhdGVDYWxsYmFjaygpXG59XG5cbmZ1bmN0aW9uIGFmdGVyRmluYWwgKGVycikge1xuICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuICBpZiAoZXJyKSBzdHJlYW0uZGVzdHJveShlcnIpXG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSA9PT0gMCkge1xuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfRE9ORVxuICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKVxuICB9XG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIEFVVE9fREVTVFJPWSkgPT09IERPTkUpIHtcbiAgICBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IERFU1RST1lJTkdcbiAgfVxuXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX0FDVElWRVxuXG4gIC8vIG5vIG5lZWQgdG8gd2FpdCB0aGUgZXh0cmEgdGljayBoZXJlLCBzbyB3ZSBzaG9ydCBjaXJjdWl0IHRoYXRcbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfVVBEQVRJTkcpID09PSAwKSB0aGlzLnVwZGF0ZSgpXG4gIGVsc2UgdGhpcy51cGRhdGVOZXh0VGljaygpXG59XG5cbmZ1bmN0aW9uIGFmdGVyRGVzdHJveSAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgaWYgKCFlcnIgJiYgdGhpcy5lcnJvciAhPT0gU1RSRUFNX0RFU1RST1lFRCkgZXJyID0gdGhpcy5lcnJvclxuICBpZiAoZXJyKSBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gREVTVFJPWUVEXG4gIHN0cmVhbS5lbWl0KCdjbG9zZScpXG5cbiAgY29uc3QgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgY29uc3Qgd3MgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcblxuICBpZiAocnMgIT09IG51bGwgJiYgcnMucGlwZWxpbmUgIT09IG51bGwpIHJzLnBpcGVsaW5lLmRvbmUoc3RyZWFtLCBlcnIpXG5cbiAgaWYgKHdzICE9PSBudWxsKSB7XG4gICAgd2hpbGUgKHdzLmRyYWlucyAhPT0gbnVsbCAmJiB3cy5kcmFpbnMubGVuZ3RoID4gMCkgd3MuZHJhaW5zLnNoaWZ0KCkucmVzb2x2ZShmYWxzZSlcbiAgICBpZiAod3MucGlwZWxpbmUgIT09IG51bGwpIHdzLnBpcGVsaW5lLmRvbmUoc3RyZWFtLCBlcnIpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZSAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgaWYgKGVycikgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFdSSVRFX05PVF9BQ1RJVkVcblxuICBpZiAodGhpcy5kcmFpbnMgIT09IG51bGwpIHRpY2tEcmFpbnModGhpcy5kcmFpbnMpXG5cbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRFJBSU5fU1RBVFVTKSA9PT0gV1JJVEVfVU5EUkFJTkVEKSB7XG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9EUkFJTkVEXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRU1JVF9EUkFJTikgPT09IFdSSVRFX0VNSVRfRFJBSU4pIHtcbiAgICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpXG4gICAgfVxuICB9XG5cbiAgdGhpcy51cGRhdGVDYWxsYmFjaygpXG59XG5cbmZ1bmN0aW9uIGFmdGVyUmVhZCAoZXJyKSB7XG4gIGlmIChlcnIpIHRoaXMuc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfQUNUSVZFXG4gIGlmICh0aGlzLnJlYWRBaGVhZCA9PT0gZmFsc2UgJiYgKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfUkVTVU1FRCkgPT09IDApIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PX1JFQURfQUhFQURcbiAgdGhpcy51cGRhdGVDYWxsYmFjaygpXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlYWROVCAoKSB7XG4gIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9VUERBVElORykgPT09IDApIHtcbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfTkVYVF9USUNLXG4gICAgdGhpcy51cGRhdGUoKVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdyaXRlTlQgKCkge1xuICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1VQREFUSU5HKSA9PT0gMCkge1xuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfTkVYVF9USUNLXG4gICAgdGhpcy51cGRhdGUoKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRpY2tEcmFpbnMgKGRyYWlucykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRyYWlucy5sZW5ndGg7IGkrKykge1xuICAgIC8vIGRyYWlucy53cml0ZXMgYXJlIG1vbm90b25pYywgc28gaWYgb25lIGlzIDAgaXRzIGFsd2F5cyB0aGUgZmlyc3Qgb25lXG4gICAgaWYgKC0tZHJhaW5zW2ldLndyaXRlcyA9PT0gMCkge1xuICAgICAgZHJhaW5zLnNoaWZ0KCkucmVzb2x2ZSh0cnVlKVxuICAgICAgaS0tXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyT3BlbiAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgaWYgKGVycikgc3RyZWFtLmRlc3Ryb3koZXJyKVxuXG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lJTkcpID09PSAwKSB7XG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9QUklNQVJZX1NUQVRVUykgPT09IDApIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9QUklNQVJZXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfUFJJTUFSWV9TVEFUVVMpID09PSAwKSBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IFdSSVRFX1BSSU1BUllcbiAgICBzdHJlYW0uZW1pdCgnb3BlbicpXG4gIH1cblxuICBzdHJlYW0uX2R1cGxleFN0YXRlICY9IE5PVF9BQ1RJVkVcblxuICBpZiAoc3RyZWFtLl93cml0YWJsZVN0YXRlICE9PSBudWxsKSB7XG4gICAgc3RyZWFtLl93cml0YWJsZVN0YXRlLnVwZGF0ZUNhbGxiYWNrKClcbiAgfVxuXG4gIGlmIChzdHJlYW0uX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBzdHJlYW0uX3JlYWRhYmxlU3RhdGUudXBkYXRlQ2FsbGJhY2soKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtIChlcnIsIGRhdGEpIHtcbiAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhICE9PSBudWxsKSB0aGlzLnB1c2goZGF0YSlcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5hZnRlcldyaXRlKGVycilcbn1cblxuZnVuY3Rpb24gbmV3TGlzdGVuZXIgKG5hbWUpIHtcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RhdGEnKSB7XG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSAoUkVBRF9FTUlUX0RBVEEgfCBSRUFEX1JFU1VNRURfUkVBRF9BSEVBRClcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gUkVBRF9FTUlUX1JFQURBQkxFXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuYW1lID09PSAnZHJhaW4nKSB7XG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9FTUlUX0RSQUlOXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgU3RyZWFtIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSA9IDBcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbnVsbFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBudWxsXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMub3BlbikgdGhpcy5fb3BlbiA9IG9wdHMub3BlblxuICAgICAgaWYgKG9wdHMuZGVzdHJveSkgdGhpcy5fZGVzdHJveSA9IG9wdHMuZGVzdHJveVxuICAgICAgaWYgKG9wdHMucHJlZGVzdHJveSkgdGhpcy5fcHJlZGVzdHJveSA9IG9wdHMucHJlZGVzdHJveVxuICAgICAgaWYgKG9wdHMuc2lnbmFsKSB7XG4gICAgICAgIG9wdHMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnQuYmluZCh0aGlzKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9uKCduZXdMaXN0ZW5lcicsIG5ld0xpc3RlbmVyKVxuICB9XG5cbiAgX29wZW4gKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9kZXN0cm95IChjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfcHJlZGVzdHJveSAoKSB7XG4gICAgLy8gZG9lcyBub3RoaW5nXG4gIH1cblxuICBnZXQgcmVhZGFibGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlICE9PSBudWxsID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0IHdyaXRhYmxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCA/IHRydWUgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGdldCBkZXN0cm95ZWQgKCkge1xuICAgIHJldHVybiAodGhpcy5fZHVwbGV4U3RhdGUgJiBERVNUUk9ZRUQpICE9PSAwXG4gIH1cblxuICBnZXQgZGVzdHJveWluZyAoKSB7XG4gICAgcmV0dXJuICh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSAhPT0gMFxuICB9XG5cbiAgZGVzdHJveSAoZXJyKSB7XG4gICAgaWYgKCh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSA9PT0gMCkge1xuICAgICAgaWYgKCFlcnIpIGVyciA9IFNUUkVBTV9ERVNUUk9ZRURcbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlID0gKHRoaXMuX2R1cGxleFN0YXRlIHwgREVTVFJPWUlORykgJiBOT05fUFJJTUFSWVxuXG4gICAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmsgPSAwXG4gICAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZXJyb3IgPSBlcnJcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyayA9IDBcbiAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvciA9IGVyclxuICAgICAgfVxuXG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBQUkVERVNUUk9ZSU5HXG4gICAgICB0aGlzLl9wcmVkZXN0cm95KClcbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlICY9IE5PVF9QUkVERVNUUk9ZSU5HXG5cbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlICE9PSBudWxsKSB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlICE9PSBudWxsKSB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgUmVhZGFibGUgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBPUEVOSU5HIHwgV1JJVEVfRE9ORSB8IFJFQURfUkVBRF9BSEVBRFxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZSh0aGlzLCBvcHRzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRBaGVhZCA9PT0gZmFsc2UpIHRoaXMuX2R1cGxleFN0YXRlICY9IFJFQURfTk9fUkVBRF9BSEVBRFxuICAgICAgaWYgKG9wdHMucmVhZCkgdGhpcy5fcmVhZCA9IG9wdHMucmVhZFxuICAgICAgaWYgKG9wdHMuZWFnZXJPcGVuKSB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIGlmIChvcHRzLmVuY29kaW5nKSB0aGlzLnNldEVuY29kaW5nKG9wdHMuZW5jb2RpbmcpXG4gICAgfVxuICB9XG5cbiAgc2V0RW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gICAgY29uc3QgZGVjID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nKVxuICAgIGNvbnN0IG1hcCA9IHRoaXMuX3JlYWRhYmxlU3RhdGUubWFwIHx8IGVjaG9cbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLm1hcCA9IG1hcE9yU2tpcFxuICAgIHJldHVybiB0aGlzXG5cbiAgICBmdW5jdGlvbiBtYXBPclNraXAgKGRhdGEpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBkZWMucHVzaChkYXRhKVxuICAgICAgcmV0dXJuIG5leHQgPT09ICcnID8gbnVsbCA6IG1hcChuZXh0KVxuICAgIH1cbiAgfVxuXG4gIF9yZWFkIChjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBwaXBlIChkZXN0LCBjYikge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucGlwZShkZXN0LCBjYilcbiAgICByZXR1cm4gZGVzdFxuICB9XG5cbiAgcmVhZCAoKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZCgpXG4gIH1cblxuICBwdXNoIChkYXRhKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUucHVzaChkYXRhKVxuICB9XG5cbiAgdW5zaGlmdCAoZGF0YSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLnVuc2hpZnQoZGF0YSlcbiAgfVxuXG4gIHJlc3VtZSAoKSB7XG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gUkVBRF9SRVNVTUVEX1JFQURfQUhFQURcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcGF1c2UgKCkge1xuICAgIHRoaXMuX2R1cGxleFN0YXRlICY9ICh0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRBaGVhZCA9PT0gZmFsc2UgPyBSRUFEX1BBVVNFRF9OT19SRUFEX0FIRUFEIDogUkVBRF9QQVVTRUQpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUFzeW5jSXRlcmF0b3IgKGl0ZSwgb3B0cykge1xuICAgIGxldCBkZXN0cm95XG5cbiAgICBjb25zdCBycyA9IG5ldyBSZWFkYWJsZSh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCAoY2IpIHtcbiAgICAgICAgaXRlLm5leHQoKS50aGVuKHB1c2gpLnRoZW4oY2IuYmluZChudWxsLCBudWxsKSkuY2F0Y2goY2IpXG4gICAgICB9LFxuICAgICAgcHJlZGVzdHJveSAoKSB7XG4gICAgICAgIGRlc3Ryb3kgPSBpdGUucmV0dXJuKClcbiAgICAgIH0sXG4gICAgICBkZXN0cm95IChjYikge1xuICAgICAgICBpZiAoIWRlc3Ryb3kpIHJldHVybiBjYihudWxsKVxuICAgICAgICBkZXN0cm95LnRoZW4oY2IuYmluZChudWxsLCBudWxsKSkuY2F0Y2goY2IpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiByc1xuXG4gICAgZnVuY3Rpb24gcHVzaCAoZGF0YSkge1xuICAgICAgaWYgKGRhdGEuZG9uZSkgcnMucHVzaChudWxsKVxuICAgICAgZWxzZSBycy5wdXNoKGRhdGEudmFsdWUpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZyb20gKGRhdGEsIG9wdHMpIHtcbiAgICBpZiAoaXNSZWFkU3RyZWFteChkYXRhKSkgcmV0dXJuIGRhdGFcbiAgICBpZiAoZGF0YVthc3luY0l0ZXJhdG9yXSkgcmV0dXJuIHRoaXMuX2Zyb21Bc3luY0l0ZXJhdG9yKGRhdGFbYXN5bmNJdGVyYXRvcl0oKSwgb3B0cylcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIGRhdGEgPSBkYXRhID09PSB1bmRlZmluZWQgPyBbXSA6IFtkYXRhXVxuXG4gICAgbGV0IGkgPSAwXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZSh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCAoY2IpIHtcbiAgICAgICAgdGhpcy5wdXNoKGkgPT09IGRhdGEubGVuZ3RoID8gbnVsbCA6IGRhdGFbaSsrXSlcbiAgICAgICAgY2IobnVsbClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc3RhdGljIGlzQmFja3ByZXNzdXJlZCAocnMpIHtcbiAgICByZXR1cm4gKHJzLl9kdXBsZXhTdGF0ZSAmIFJFQURfQkFDS1BSRVNTVVJFX1NUQVRVUykgIT09IDAgfHwgcnMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyZWQgPj0gcnMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya1xuICB9XG5cbiAgc3RhdGljIGlzUGF1c2VkIChycykge1xuICAgIHJldHVybiAocnMuX2R1cGxleFN0YXRlICYgUkVBRF9SRVNVTUVEKSA9PT0gMFxuICB9XG5cbiAgW2FzeW5jSXRlcmF0b3JdICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzXG5cbiAgICBsZXQgZXJyb3IgPSBudWxsXG4gICAgbGV0IHByb21pc2VSZXNvbHZlID0gbnVsbFxuICAgIGxldCBwcm9taXNlUmVqZWN0ID0gbnVsbFxuXG4gICAgdGhpcy5vbignZXJyb3InLCAoZXJyKSA9PiB7IGVycm9yID0gZXJyIH0pXG4gICAgdGhpcy5vbigncmVhZGFibGUnLCBvbnJlYWRhYmxlKVxuICAgIHRoaXMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIHJldHVybiB7XG4gICAgICBbYXN5bmNJdGVyYXRvcl0gKCkge1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfSxcbiAgICAgIG5leHQgKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHByb21pc2VSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgICAgIHByb21pc2VSZWplY3QgPSByZWplY3RcbiAgICAgICAgICBjb25zdCBkYXRhID0gc3RyZWFtLnJlYWQoKVxuICAgICAgICAgIGlmIChkYXRhICE9PSBudWxsKSBvbmRhdGEoZGF0YSlcbiAgICAgICAgICBlbHNlIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lFRCkgIT09IDApIG9uZGF0YShudWxsKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHJldHVybiAoKSB7XG4gICAgICAgIHJldHVybiBkZXN0cm95KG51bGwpXG4gICAgICB9LFxuICAgICAgdGhyb3cgKGVycikge1xuICAgICAgICByZXR1cm4gZGVzdHJveShlcnIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25yZWFkYWJsZSAoKSB7XG4gICAgICBpZiAocHJvbWlzZVJlc29sdmUgIT09IG51bGwpIG9uZGF0YShzdHJlYW0ucmVhZCgpKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgaWYgKHByb21pc2VSZXNvbHZlICE9PSBudWxsKSBvbmRhdGEobnVsbClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmRhdGEgKGRhdGEpIHtcbiAgICAgIGlmIChwcm9taXNlUmVqZWN0ID09PSBudWxsKSByZXR1cm5cbiAgICAgIGlmIChlcnJvcikgcHJvbWlzZVJlamVjdChlcnJvcilcbiAgICAgIGVsc2UgaWYgKGRhdGEgPT09IG51bGwgJiYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpID09PSAwKSBwcm9taXNlUmVqZWN0KFNUUkVBTV9ERVNUUk9ZRUQpXG4gICAgICBlbHNlIHByb21pc2VSZXNvbHZlKHsgdmFsdWU6IGRhdGEsIGRvbmU6IGRhdGEgPT09IG51bGwgfSlcbiAgICAgIHByb21pc2VSZWplY3QgPSBwcm9taXNlUmVzb2x2ZSA9IG51bGxcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95IChlcnIpIHtcbiAgICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmIChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWUVEKSByZXR1cm4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgc3RyZWFtLm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpXG4gICAgICAgICAgZWxzZSByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgV3JpdGFibGUgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBPUEVOSU5HIHwgUkVBRF9ET05FXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKHRoaXMsIG9wdHMpXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMud3JpdGV2KSB0aGlzLl93cml0ZXYgPSBvcHRzLndyaXRldlxuICAgICAgaWYgKG9wdHMud3JpdGUpIHRoaXMuX3dyaXRlID0gb3B0cy53cml0ZVxuICAgICAgaWYgKG9wdHMuZmluYWwpIHRoaXMuX2ZpbmFsID0gb3B0cy5maW5hbFxuICAgICAgaWYgKG9wdHMuZWFnZXJPcGVuKSB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG4gIH1cblxuICBjb3JrICgpIHtcbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9DT1JLRURcbiAgfVxuXG4gIHVuY29yayAoKSB7XG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX0NPUktFRFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICB9XG5cbiAgX3dyaXRldiAoYmF0Y2gsIGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmF1dG9CYXRjaChkYXRhLCBjYilcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICBjYihudWxsKVxuICB9XG5cbiAgc3RhdGljIGlzQmFja3ByZXNzdXJlZCAod3MpIHtcbiAgICByZXR1cm4gKHdzLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0JBQ0tQUkVTU1VSRV9TVEFUVVMpICE9PSAwXG4gIH1cblxuICBzdGF0aWMgZHJhaW5lZCAod3MpIHtcbiAgICBpZiAod3MuZGVzdHJveWVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKVxuICAgIGNvbnN0IHN0YXRlID0gd3MuX3dyaXRhYmxlU3RhdGVcbiAgICBjb25zdCBwZW5kaW5nID0gKGlzV3JpdGV2KHdzKSA/IE1hdGgubWluKDEsIHN0YXRlLnF1ZXVlLmxlbmd0aCkgOiBzdGF0ZS5xdWV1ZS5sZW5ndGgpXG4gICAgY29uc3Qgd3JpdGVzID0gcGVuZGluZyArICgod3MuX2R1cGxleFN0YXRlICYgV1JJVEVfV1JJVElORykgPyAxIDogMClcbiAgICBpZiAod3JpdGVzID09PSAwKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpXG4gICAgaWYgKHN0YXRlLmRyYWlucyA9PT0gbnVsbCkgc3RhdGUuZHJhaW5zID0gW11cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHN0YXRlLmRyYWlucy5wdXNoKHsgd3JpdGVzLCByZXNvbHZlIH0pXG4gICAgfSlcbiAgfVxuXG4gIHdyaXRlIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUucHVzaChkYXRhKVxuICB9XG5cbiAgZW5kIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmQoZGF0YSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbmNsYXNzIER1cGxleCBleHRlbmRzIFJlYWRhYmxlIHsgLy8gYW5kIFdyaXRhYmxlXG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcblxuICAgIHRoaXMuX2R1cGxleFN0YXRlID0gT1BFTklORyB8ICh0aGlzLl9kdXBsZXhTdGF0ZSAmIFJFQURfUkVBRF9BSEVBRClcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUodGhpcywgb3B0cylcblxuICAgIGlmIChvcHRzKSB7XG4gICAgICBpZiAob3B0cy53cml0ZXYpIHRoaXMuX3dyaXRldiA9IG9wdHMud3JpdGV2XG4gICAgICBpZiAob3B0cy53cml0ZSkgdGhpcy5fd3JpdGUgPSBvcHRzLndyaXRlXG4gICAgICBpZiAob3B0cy5maW5hbCkgdGhpcy5fZmluYWwgPSBvcHRzLmZpbmFsXG4gICAgfVxuICB9XG5cbiAgY29yayAoKSB7XG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfQ09SS0VEXG4gIH1cblxuICB1bmNvcmsgKCkge1xuICAgIHRoaXMuX2R1cGxleFN0YXRlICY9IFdSSVRFX05PVF9DT1JLRURcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgfVxuXG4gIF93cml0ZXYgKGJhdGNoLCBjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5hdXRvQmF0Y2goZGF0YSwgY2IpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHdyaXRlIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUucHVzaChkYXRhKVxuICB9XG5cbiAgZW5kIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmQoZGF0YSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbmNsYXNzIFRyYW5zZm9ybSBleHRlbmRzIER1cGxleCB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcbiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IG5ldyBUcmFuc2Zvcm1TdGF0ZSh0aGlzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLnRyYW5zZm9ybSkgdGhpcy5fdHJhbnNmb3JtID0gb3B0cy50cmFuc2Zvcm1cbiAgICAgIGlmIChvcHRzLmZsdXNoKSB0aGlzLl9mbHVzaCA9IG9wdHMuZmx1c2hcbiAgICB9XG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyZWQgPj0gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gZGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm0oZGF0YSwgdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJUcmFuc2Zvcm0pXG4gICAgfVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgaWYgKHRoaXMuX3RyYW5zZm9ybVN0YXRlLmRhdGEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhXG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gbnVsbFxuICAgICAgY2IobnVsbClcbiAgICAgIHRoaXMuX3RyYW5zZm9ybShkYXRhLCB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlclRyYW5zZm9ybSlcbiAgICB9IGVsc2Uge1xuICAgICAgY2IobnVsbClcbiAgICB9XG4gIH1cblxuICBkZXN0cm95IChlcnIpIHtcbiAgICBzdXBlci5kZXN0cm95KGVycilcbiAgICBpZiAodGhpcy5fdHJhbnNmb3JtU3RhdGUuZGF0YSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fdHJhbnNmb3JtU3RhdGUuZGF0YSA9IG51bGxcbiAgICAgIHRoaXMuX3RyYW5zZm9ybVN0YXRlLmFmdGVyVHJhbnNmb3JtKClcbiAgICB9XG4gIH1cblxuICBfdHJhbnNmb3JtIChkYXRhLCBjYikge1xuICAgIGNiKG51bGwsIGRhdGEpXG4gIH1cblxuICBfZmx1c2ggKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlckZpbmFsID0gY2JcbiAgICB0aGlzLl9mbHVzaCh0cmFuc2Zvcm1BZnRlckZsdXNoLmJpbmQodGhpcykpXG4gIH1cbn1cblxuY2xhc3MgUGFzc1Rocm91Z2ggZXh0ZW5kcyBUcmFuc2Zvcm0ge31cblxuZnVuY3Rpb24gdHJhbnNmb3JtQWZ0ZXJGbHVzaCAoZXJyLCBkYXRhKSB7XG4gIGNvbnN0IGNiID0gdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJGaW5hbFxuICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICBpZiAoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHRoaXMucHVzaChkYXRhKVxuICB0aGlzLnB1c2gobnVsbClcbiAgY2IobnVsbClcbn1cblxuZnVuY3Rpb24gcGlwZWxpbmVQcm9taXNlICguLi5zdHJlYW1zKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmV0dXJuIHBpcGVsaW5lKC4uLnN0cmVhbXMsIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgcmVzb2x2ZSgpXG4gICAgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gcGlwZWxpbmUgKHN0cmVhbSwgLi4uc3RyZWFtcykge1xuICBjb25zdCBhbGwgPSBBcnJheS5pc0FycmF5KHN0cmVhbSkgPyBbLi4uc3RyZWFtLCAuLi5zdHJlYW1zXSA6IFtzdHJlYW0sIC4uLnN0cmVhbXNdXG4gIGNvbnN0IGRvbmUgPSAoYWxsLmxlbmd0aCAmJiB0eXBlb2YgYWxsW2FsbC5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykgPyBhbGwucG9wKCkgOiBudWxsXG5cbiAgaWYgKGFsbC5sZW5ndGggPCAyKSB0aHJvdyBuZXcgRXJyb3IoJ1BpcGVsaW5lIHJlcXVpcmVzIGF0IGxlYXN0IDIgc3RyZWFtcycpXG5cbiAgbGV0IHNyYyA9IGFsbFswXVxuICBsZXQgZGVzdCA9IG51bGxcbiAgbGV0IGVycm9yID0gbnVsbFxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgZGVzdCA9IGFsbFtpXVxuXG4gICAgaWYgKGlzU3RyZWFteChzcmMpKSB7XG4gICAgICBzcmMucGlwZShkZXN0LCBvbmVycm9yKVxuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvckhhbmRsZShzcmMsIHRydWUsIGkgPiAxLCBvbmVycm9yKVxuICAgICAgc3JjLnBpcGUoZGVzdClcbiAgICB9XG5cbiAgICBzcmMgPSBkZXN0XG4gIH1cblxuICBpZiAoZG9uZSkge1xuICAgIGxldCBmaW4gPSBmYWxzZVxuXG4gICAgY29uc3QgYXV0b0Rlc3Ryb3kgPSBpc1N0cmVhbXgoZGVzdCkgfHwgISEoZGVzdC5fd3JpdGFibGVTdGF0ZSAmJiBkZXN0Ll93cml0YWJsZVN0YXRlLmF1dG9EZXN0cm95KVxuXG4gICAgZGVzdC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgPT09IG51bGwpIGVycm9yID0gZXJyXG4gICAgfSlcblxuICAgIGRlc3Qub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgIGZpbiA9IHRydWVcbiAgICAgIGlmICghYXV0b0Rlc3Ryb3kpIGRvbmUoZXJyb3IpXG4gICAgfSlcblxuICAgIGlmIChhdXRvRGVzdHJveSkge1xuICAgICAgZGVzdC5vbignY2xvc2UnLCAoKSA9PiBkb25lKGVycm9yIHx8IChmaW4gPyBudWxsIDogUFJFTUFUVVJFX0NMT1NFKSkpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlc3RcblxuICBmdW5jdGlvbiBlcnJvckhhbmRsZSAocywgcmQsIHdyLCBvbmVycm9yKSB7XG4gICAgcy5vbignZXJyb3InLCBvbmVycm9yKVxuICAgIHMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgaWYgKHJkICYmIHMuX3JlYWRhYmxlU3RhdGUgJiYgIXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQpIHJldHVybiBvbmVycm9yKFBSRU1BVFVSRV9DTE9TRSlcbiAgICAgIGlmICh3ciAmJiBzLl93cml0YWJsZVN0YXRlICYmICFzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm4gb25lcnJvcihQUkVNQVRVUkVfQ0xPU0UpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lcnJvciAoZXJyKSB7XG4gICAgaWYgKCFlcnIgfHwgZXJyb3IpIHJldHVyblxuICAgIGVycm9yID0gZXJyXG5cbiAgICBmb3IgKGNvbnN0IHMgb2YgYWxsKSB7XG4gICAgICBzLmRlc3Ryb3koZXJyKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlY2hvIChzKSB7XG4gIHJldHVybiBzXG59XG5cbmZ1bmN0aW9uIGlzU3RyZWFtIChzdHJlYW0pIHtcbiAgcmV0dXJuICEhc3RyZWFtLl9yZWFkYWJsZVN0YXRlIHx8ICEhc3RyZWFtLl93cml0YWJsZVN0YXRlXG59XG5cbmZ1bmN0aW9uIGlzU3RyZWFteCAoc3RyZWFtKSB7XG4gIHJldHVybiB0eXBlb2Ygc3RyZWFtLl9kdXBsZXhTdGF0ZSA9PT0gJ251bWJlcicgJiYgaXNTdHJlYW0oc3RyZWFtKVxufVxuXG5mdW5jdGlvbiBnZXRTdHJlYW1FcnJvciAoc3RyZWFtLCBvcHRzID0ge30pIHtcbiAgY29uc3QgZXJyID0gKHN0cmVhbS5fcmVhZGFibGVTdGF0ZSAmJiBzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZXJyb3IpIHx8IChzdHJlYW0uX3dyaXRhYmxlU3RhdGUgJiYgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yKVxuXG4gIC8vIGF2b2lkIGltcGxpY2l0IGVycm9ycyBieSBkZWZhdWx0XG4gIHJldHVybiAoIW9wdHMuYWxsICYmIGVyciA9PT0gU1RSRUFNX0RFU1RST1lFRCkgPyBudWxsIDogZXJyXG59XG5cbmZ1bmN0aW9uIGlzUmVhZFN0cmVhbXggKHN0cmVhbSkge1xuICByZXR1cm4gaXNTdHJlYW14KHN0cmVhbSkgJiYgc3RyZWFtLnJlYWRhYmxlXG59XG5cbmZ1bmN0aW9uIGlzVHlwZWRBcnJheSAoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmIGRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGRhdGEuYnl0ZUxlbmd0aCA9PT0gJ251bWJlcidcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEJ5dGVMZW5ndGggKGRhdGEpIHtcbiAgcmV0dXJuIGlzVHlwZWRBcnJheShkYXRhKSA/IGRhdGEuYnl0ZUxlbmd0aCA6IDEwMjRcbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBhYm9ydCAoKSB7XG4gIHRoaXMuZGVzdHJveShuZXcgRXJyb3IoJ1N0cmVhbSBhYm9ydGVkLicpKVxufVxuXG5mdW5jdGlvbiBpc1dyaXRldiAocykge1xuICByZXR1cm4gcy5fd3JpdGV2ICE9PSBXcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiAmJiBzLl93cml0ZXYgIT09IER1cGxleC5wcm90b3R5cGUuX3dyaXRldlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGlwZWxpbmUsXG4gIHBpcGVsaW5lUHJvbWlzZSxcbiAgaXNTdHJlYW0sXG4gIGlzU3RyZWFteCxcbiAgZ2V0U3RyZWFtRXJyb3IsXG4gIFN0cmVhbSxcbiAgV3JpdGFibGUsXG4gIFJlYWRhYmxlLFxuICBEdXBsZXgsXG4gIFRyYW5zZm9ybSxcbiAgLy8gRXhwb3J0IFBhc3NUaHJvdWdoIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTm9kZS5qcyBjb3JlJ3Mgc3RyZWFtIG1vZHVsZVxuICBQYXNzVGhyb3VnaFxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3Qgc3RyaXBBbnNpID0gcmVxdWlyZSgnc3RyaXAtYW5zaScpO1xuY29uc3QgaXNGdWxsd2lkdGhDb2RlUG9pbnQgPSByZXF1aXJlKCdpcy1mdWxsd2lkdGgtY29kZS1wb2ludCcpO1xuY29uc3QgZW1vamlSZWdleCA9IHJlcXVpcmUoJ2Vtb2ppLXJlZ2V4Jyk7XG5cbmNvbnN0IHN0cmluZ1dpZHRoID0gc3RyaW5nID0+IHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnIHx8IHN0cmluZy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdHN0cmluZyA9IHN0cmlwQW5zaShzdHJpbmcpO1xuXG5cdGlmIChzdHJpbmcubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShlbW9qaVJlZ2V4KCksICcgICcpO1xuXG5cdGxldCB3aWR0aCA9IDA7XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCBjb2RlID0gc3RyaW5nLmNvZGVQb2ludEF0KGkpO1xuXG5cdFx0Ly8gSWdub3JlIGNvbnRyb2wgY2hhcmFjdGVyc1xuXHRcdGlmIChjb2RlIDw9IDB4MUYgfHwgKGNvZGUgPj0gMHg3RiAmJiBjb2RlIDw9IDB4OUYpKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHQvLyBJZ25vcmUgY29tYmluaW5nIGNoYXJhY3RlcnNcblx0XHRpZiAoY29kZSA+PSAweDMwMCAmJiBjb2RlIDw9IDB4MzZGKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHQvLyBTdXJyb2dhdGVzXG5cdFx0aWYgKGNvZGUgPiAweEZGRkYpIHtcblx0XHRcdGkrKztcblx0XHR9XG5cblx0XHR3aWR0aCArPSBpc0Z1bGx3aWR0aENvZGVQb2ludChjb2RlKSA/IDIgOiAxO1xuXHR9XG5cblx0cmV0dXJuIHdpZHRoO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmdXaWR0aDtcbi8vIFRPRE86IHJlbW92ZSB0aGlzIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBzdHJpbmdXaWR0aDtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IGFuc2lSZWdleCA9IHJlcXVpcmUoJ2Fuc2ktcmVnZXgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmcgPT4gdHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgPyBzdHJpbmcucmVwbGFjZShhbnNpUmVnZXgoKSwgJycpIDogc3RyaW5nO1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3Qgb3MgPSByZXF1aXJlKCdvcycpO1xuY29uc3QgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG5jb25zdCBoYXNGbGFnID0gcmVxdWlyZSgnaGFzLWZsYWcnKTtcblxuY29uc3Qge2Vudn0gPSBwcm9jZXNzO1xuXG5sZXQgZmxhZ0ZvcmNlQ29sb3I7XG5pZiAoaGFzRmxhZygnbm8tY29sb3InKSB8fFxuXHRoYXNGbGFnKCduby1jb2xvcnMnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1mYWxzZScpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPW5ldmVyJykpIHtcblx0ZmxhZ0ZvcmNlQ29sb3IgPSAwO1xufSBlbHNlIGlmIChoYXNGbGFnKCdjb2xvcicpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9ycycpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPXRydWUnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1hbHdheXMnKSkge1xuXHRmbGFnRm9yY2VDb2xvciA9IDE7XG59XG5cbmZ1bmN0aW9uIGVudkZvcmNlQ29sb3IoKSB7XG5cdGlmICgnRk9SQ0VfQ09MT1InIGluIGVudikge1xuXHRcdGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICd0cnVlJykge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXG5cdFx0aWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ2ZhbHNlJykge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudi5GT1JDRV9DT0xPUi5sZW5ndGggPT09IDAgPyAxIDogTWF0aC5taW4oTnVtYmVyLnBhcnNlSW50KGVudi5GT1JDRV9DT0xPUiwgMTApLCAzKTtcblx0fVxufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVMZXZlbChsZXZlbCkge1xuXHRpZiAobGV2ZWwgPT09IDApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGxldmVsLFxuXHRcdGhhc0Jhc2ljOiB0cnVlLFxuXHRcdGhhczI1NjogbGV2ZWwgPj0gMixcblx0XHRoYXMxNm06IGxldmVsID49IDNcblx0fTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNDb2xvcihoYXZlU3RyZWFtLCB7c3RyZWFtSXNUVFksIHNuaWZmRmxhZ3MgPSB0cnVlfSA9IHt9KSB7XG5cdGNvbnN0IG5vRmxhZ0ZvcmNlQ29sb3IgPSBlbnZGb3JjZUNvbG9yKCk7XG5cdGlmIChub0ZsYWdGb3JjZUNvbG9yICE9PSB1bmRlZmluZWQpIHtcblx0XHRmbGFnRm9yY2VDb2xvciA9IG5vRmxhZ0ZvcmNlQ29sb3I7XG5cdH1cblxuXHRjb25zdCBmb3JjZUNvbG9yID0gc25pZmZGbGFncyA/IGZsYWdGb3JjZUNvbG9yIDogbm9GbGFnRm9yY2VDb2xvcjtcblxuXHRpZiAoZm9yY2VDb2xvciA9PT0gMCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0aWYgKHNuaWZmRmxhZ3MpIHtcblx0XHRpZiAoaGFzRmxhZygnY29sb3I9MTZtJykgfHxcblx0XHRcdGhhc0ZsYWcoJ2NvbG9yPWZ1bGwnKSB8fFxuXHRcdFx0aGFzRmxhZygnY29sb3I9dHJ1ZWNvbG9yJykpIHtcblx0XHRcdHJldHVybiAzO1xuXHRcdH1cblxuXHRcdGlmIChoYXNGbGFnKCdjb2xvcj0yNTYnKSkge1xuXHRcdFx0cmV0dXJuIDI7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGhhdmVTdHJlYW0gJiYgIXN0cmVhbUlzVFRZICYmIGZvcmNlQ29sb3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y29uc3QgbWluID0gZm9yY2VDb2xvciB8fCAwO1xuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ2R1bWInKSB7XG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxMDU4NiBpcyB0aGUgZmlyc3QgV2luZG93cyByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMjU2IGNvbG9ycy5cblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDE0OTMxIGlzIHRoZSBmaXJzdCByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMTZtL1RydWVDb2xvci5cblx0XHRjb25zdCBvc1JlbGVhc2UgPSBvcy5yZWxlYXNlKCkuc3BsaXQoJy4nKTtcblx0XHRpZiAoXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzBdKSA+PSAxMCAmJlxuXHRcdFx0TnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTA1ODZcblx0XHQpIHtcblx0XHRcdHJldHVybiBOdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxNDkzMSA/IDMgOiAyO1xuXHRcdH1cblxuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDSScgaW4gZW52KSB7XG5cdFx0aWYgKFsnVFJBVklTJywgJ0NJUkNMRUNJJywgJ0FQUFZFWU9SJywgJ0dJVExBQl9DSScsICdHSVRIVUJfQUNUSU9OUycsICdCVUlMREtJVEUnLCAnRFJPTkUnXS5zb21lKHNpZ24gPT4gc2lnbiBpbiBlbnYpIHx8IGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKCdURUFNQ0lUWV9WRVJTSU9OJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gL14oOVxcLigwKlsxLTldXFxkKilcXC58XFxkezIsfVxcLikvLnRlc3QoZW52LlRFQU1DSVRZX1ZFUlNJT04pID8gMSA6IDA7XG5cdH1cblxuXHRpZiAoZW52LkNPTE9SVEVSTSA9PT0gJ3RydWVjb2xvcicpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmICgnVEVSTV9QUk9HUkFNJyBpbiBlbnYpIHtcblx0XHRjb25zdCB2ZXJzaW9uID0gTnVtYmVyLnBhcnNlSW50KChlbnYuVEVSTV9QUk9HUkFNX1ZFUlNJT04gfHwgJycpLnNwbGl0KCcuJylbMF0sIDEwKTtcblxuXHRcdHN3aXRjaCAoZW52LlRFUk1fUFJPR1JBTSkge1xuXHRcdFx0Y2FzZSAnaVRlcm0uYXBwJzpcblx0XHRcdFx0cmV0dXJuIHZlcnNpb24gPj0gMyA/IDMgOiAyO1xuXHRcdFx0Y2FzZSAnQXBwbGVfVGVybWluYWwnOlxuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdC8vIE5vIGRlZmF1bHRcblx0XHR9XG5cdH1cblxuXHRpZiAoLy0yNTYoY29sb3IpPyQvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cblx0aWYgKC9ec2NyZWVufF54dGVybXxednQxMDB8XnZ0MjIwfF5yeHZ0fGNvbG9yfGFuc2l8Y3lnd2lufGxpbnV4L2kudGVzdChlbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmICgnQ09MT1JURVJNJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdHJldHVybiBtaW47XG59XG5cbmZ1bmN0aW9uIGdldFN1cHBvcnRMZXZlbChzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBsZXZlbCA9IHN1cHBvcnRzQ29sb3Ioc3RyZWFtLCB7XG5cdFx0c3RyZWFtSXNUVFk6IHN0cmVhbSAmJiBzdHJlYW0uaXNUVFksXG5cdFx0Li4ub3B0aW9uc1xuXHR9KTtcblxuXHRyZXR1cm4gdHJhbnNsYXRlTGV2ZWwobGV2ZWwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0c3VwcG9ydHNDb2xvcjogZ2V0U3VwcG9ydExldmVsLFxuXHRzdGRvdXQ6IGdldFN1cHBvcnRMZXZlbCh7aXNUVFk6IHR0eS5pc2F0dHkoMSl9KSxcblx0c3RkZXJyOiBnZXRTdXBwb3J0TGV2ZWwoe2lzVFRZOiB0dHkuaXNhdHR5KDIpfSlcbn07XG4iLCJjb25zdCB0YXIgPSByZXF1aXJlKCd0YXItc3RyZWFtJylcbmNvbnN0IHB1bXAgPSByZXF1aXJlKCdwdW1wJylcbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKVxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuXG5jb25zdCB3aW4zMiA9IChnbG9iYWwuQmFyZT8ucGxhdGZvcm0gfHwgcHJvY2Vzcy5wbGF0Zm9ybSkgPT09ICd3aW4zMidcblxuZXhwb3J0cy5wYWNrID0gZnVuY3Rpb24gcGFjayAoY3dkLCBvcHRzKSB7XG4gIGlmICghY3dkKSBjd2QgPSAnLidcbiAgaWYgKCFvcHRzKSBvcHRzID0ge31cblxuICBjb25zdCB4ZnMgPSBvcHRzLmZzIHx8IGZzXG4gIGNvbnN0IGlnbm9yZSA9IG9wdHMuaWdub3JlIHx8IG9wdHMuZmlsdGVyIHx8IG5vb3BcbiAgY29uc3QgbWFwU3RyZWFtID0gb3B0cy5tYXBTdHJlYW0gfHwgZWNob1xuICBjb25zdCBzdGF0TmV4dCA9IHN0YXRBbGwoeGZzLCBvcHRzLmRlcmVmZXJlbmNlID8geGZzLnN0YXQgOiB4ZnMubHN0YXQsIGN3ZCwgaWdub3JlLCBvcHRzLmVudHJpZXMsIG9wdHMuc29ydClcbiAgY29uc3Qgc3RyaWN0ID0gb3B0cy5zdHJpY3QgIT09IGZhbHNlXG4gIGNvbnN0IHVtYXNrID0gdHlwZW9mIG9wdHMudW1hc2sgPT09ICdudW1iZXInID8gfm9wdHMudW1hc2sgOiB+cHJvY2Vzc1VtYXNrKClcbiAgY29uc3QgcGFjayA9IG9wdHMucGFjayB8fCB0YXIucGFjaygpXG4gIGNvbnN0IGZpbmlzaCA9IG9wdHMuZmluaXNoIHx8IG5vb3BcblxuICBsZXQgbWFwID0gb3B0cy5tYXAgfHwgbm9vcFxuICBsZXQgZG1vZGUgPSB0eXBlb2Ygb3B0cy5kbW9kZSA9PT0gJ251bWJlcicgPyBvcHRzLmRtb2RlIDogMFxuICBsZXQgZm1vZGUgPSB0eXBlb2Ygb3B0cy5mbW9kZSA9PT0gJ251bWJlcicgPyBvcHRzLmZtb2RlIDogMFxuXG4gIGlmIChvcHRzLnN0cmlwKSBtYXAgPSBzdHJpcChtYXAsIG9wdHMuc3RyaXApXG5cbiAgaWYgKG9wdHMucmVhZGFibGUpIHtcbiAgICBkbW9kZSB8PSBwYXJzZUludCg1NTUsIDgpXG4gICAgZm1vZGUgfD0gcGFyc2VJbnQoNDQ0LCA4KVxuICB9XG4gIGlmIChvcHRzLndyaXRhYmxlKSB7XG4gICAgZG1vZGUgfD0gcGFyc2VJbnQoMzMzLCA4KVxuICAgIGZtb2RlIHw9IHBhcnNlSW50KDIyMiwgOClcbiAgfVxuXG4gIG9ubmV4dGVudHJ5KClcblxuICBmdW5jdGlvbiBvbnN5bWxpbmsgKGZpbGVuYW1lLCBoZWFkZXIpIHtcbiAgICB4ZnMucmVhZGxpbmsocGF0aC5qb2luKGN3ZCwgZmlsZW5hbWUpLCBmdW5jdGlvbiAoZXJyLCBsaW5rbmFtZSkge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHBhY2suZGVzdHJveShlcnIpXG4gICAgICBoZWFkZXIubGlua25hbWUgPSBub3JtYWxpemUobGlua25hbWUpXG4gICAgICBwYWNrLmVudHJ5KGhlYWRlciwgb25uZXh0ZW50cnkpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uc3RhdCAoZXJyLCBmaWxlbmFtZSwgc3RhdCkge1xuICAgIGlmIChlcnIpIHJldHVybiBwYWNrLmRlc3Ryb3koZXJyKVxuICAgIGlmICghZmlsZW5hbWUpIHtcbiAgICAgIGlmIChvcHRzLmZpbmFsaXplICE9PSBmYWxzZSkgcGFjay5maW5hbGl6ZSgpXG4gICAgICByZXR1cm4gZmluaXNoKHBhY2spXG4gICAgfVxuXG4gICAgaWYgKHN0YXQuaXNTb2NrZXQoKSkgcmV0dXJuIG9ubmV4dGVudHJ5KCkgLy8gdGFyIGRvZXMgbm90IHN1cHBvcnQgc29ja2V0cy4uLlxuXG4gICAgbGV0IGhlYWRlciA9IHtcbiAgICAgIG5hbWU6IG5vcm1hbGl6ZShmaWxlbmFtZSksXG4gICAgICBtb2RlOiAoc3RhdC5tb2RlIHwgKHN0YXQuaXNEaXJlY3RvcnkoKSA/IGRtb2RlIDogZm1vZGUpKSAmIHVtYXNrLFxuICAgICAgbXRpbWU6IHN0YXQubXRpbWUsXG4gICAgICBzaXplOiBzdGF0LnNpemUsXG4gICAgICB0eXBlOiAnZmlsZScsXG4gICAgICB1aWQ6IHN0YXQudWlkLFxuICAgICAgZ2lkOiBzdGF0LmdpZFxuICAgIH1cblxuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGhlYWRlci5zaXplID0gMFxuICAgICAgaGVhZGVyLnR5cGUgPSAnZGlyZWN0b3J5J1xuICAgICAgaGVhZGVyID0gbWFwKGhlYWRlcikgfHwgaGVhZGVyXG4gICAgICByZXR1cm4gcGFjay5lbnRyeShoZWFkZXIsIG9ubmV4dGVudHJ5KVxuICAgIH1cblxuICAgIGlmIChzdGF0LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGhlYWRlci5zaXplID0gMFxuICAgICAgaGVhZGVyLnR5cGUgPSAnc3ltbGluaydcbiAgICAgIGhlYWRlciA9IG1hcChoZWFkZXIpIHx8IGhlYWRlclxuICAgICAgcmV0dXJuIG9uc3ltbGluayhmaWxlbmFtZSwgaGVhZGVyKVxuICAgIH1cblxuICAgIC8vIFRPRE86IGFkZCBmaWZvIGV0Yy4uLlxuXG4gICAgaGVhZGVyID0gbWFwKGhlYWRlcikgfHwgaGVhZGVyXG5cbiAgICBpZiAoIXN0YXQuaXNGaWxlKCkpIHtcbiAgICAgIGlmIChzdHJpY3QpIHJldHVybiBwYWNrLmRlc3Ryb3kobmV3IEVycm9yKCd1bnN1cHBvcnRlZCB0eXBlIGZvciAnICsgZmlsZW5hbWUpKVxuICAgICAgcmV0dXJuIG9ubmV4dGVudHJ5KClcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyeSA9IHBhY2suZW50cnkoaGVhZGVyLCBvbm5leHRlbnRyeSlcbiAgICBjb25zdCBycyA9IG1hcFN0cmVhbSh4ZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoLmpvaW4oY3dkLCBmaWxlbmFtZSksIHsgc3RhcnQ6IDAsIGVuZDogaGVhZGVyLnNpemUgPiAwID8gaGVhZGVyLnNpemUgLSAxIDogaGVhZGVyLnNpemUgfSksIGhlYWRlcilcblxuICAgIHJzLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHsgLy8gYWx3YXlzIGZvcndhcmQgZXJyb3JzIG9uIGRlc3Ryb3lcbiAgICAgIGVudHJ5LmRlc3Ryb3koZXJyKVxuICAgIH0pXG5cbiAgICBwdW1wKHJzLCBlbnRyeSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9ubmV4dGVudHJ5IChlcnIpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gcGFjay5kZXN0cm95KGVycilcbiAgICBzdGF0TmV4dChvbnN0YXQpXG4gIH1cblxuICByZXR1cm4gcGFja1xufVxuXG5mdW5jdGlvbiBoZWFkIChsaXN0KSB7XG4gIHJldHVybiBsaXN0Lmxlbmd0aCA/IGxpc3RbbGlzdC5sZW5ndGggLSAxXSA6IG51bGxcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0dldHVpZCAoKSB7XG4gIHJldHVybiBwcm9jZXNzLmdldHVpZCA/IHByb2Nlc3MuZ2V0dWlkKCkgOiAtMVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzVW1hc2sgKCkge1xuICByZXR1cm4gcHJvY2Vzcy51bWFzayA/IHByb2Nlc3MudW1hc2soKSA6IDBcbn1cblxuZXhwb3J0cy5leHRyYWN0ID0gZnVuY3Rpb24gZXh0cmFjdCAoY3dkLCBvcHRzKSB7XG4gIGlmICghY3dkKSBjd2QgPSAnLidcbiAgaWYgKCFvcHRzKSBvcHRzID0ge31cblxuICBjb25zdCB4ZnMgPSBvcHRzLmZzIHx8IGZzXG4gIGNvbnN0IGlnbm9yZSA9IG9wdHMuaWdub3JlIHx8IG9wdHMuZmlsdGVyIHx8IG5vb3BcbiAgY29uc3QgbWFwU3RyZWFtID0gb3B0cy5tYXBTdHJlYW0gfHwgZWNob1xuICBjb25zdCBvd24gPSBvcHRzLmNob3duICE9PSBmYWxzZSAmJiAhd2luMzIgJiYgcHJvY2Vzc0dldHVpZCgpID09PSAwXG4gIGNvbnN0IGV4dHJhY3QgPSBvcHRzLmV4dHJhY3QgfHwgdGFyLmV4dHJhY3QoKVxuICBjb25zdCBzdGFjayA9IFtdXG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgY29uc3QgdW1hc2sgPSB0eXBlb2Ygb3B0cy51bWFzayA9PT0gJ251bWJlcicgPyB+b3B0cy51bWFzayA6IH5wcm9jZXNzVW1hc2soKVxuICBjb25zdCBzdHJpY3QgPSBvcHRzLnN0cmljdCAhPT0gZmFsc2VcblxuICBsZXQgbWFwID0gb3B0cy5tYXAgfHwgbm9vcFxuICBsZXQgZG1vZGUgPSB0eXBlb2Ygb3B0cy5kbW9kZSA9PT0gJ251bWJlcicgPyBvcHRzLmRtb2RlIDogMFxuICBsZXQgZm1vZGUgPSB0eXBlb2Ygb3B0cy5mbW9kZSA9PT0gJ251bWJlcicgPyBvcHRzLmZtb2RlIDogMFxuXG4gIGlmIChvcHRzLnN0cmlwKSBtYXAgPSBzdHJpcChtYXAsIG9wdHMuc3RyaXApXG5cbiAgaWYgKG9wdHMucmVhZGFibGUpIHtcbiAgICBkbW9kZSB8PSBwYXJzZUludCg1NTUsIDgpXG4gICAgZm1vZGUgfD0gcGFyc2VJbnQoNDQ0LCA4KVxuICB9XG4gIGlmIChvcHRzLndyaXRhYmxlKSB7XG4gICAgZG1vZGUgfD0gcGFyc2VJbnQoMzMzLCA4KVxuICAgIGZtb2RlIHw9IHBhcnNlSW50KDIyMiwgOClcbiAgfVxuXG4gIGV4dHJhY3Qub24oJ2VudHJ5Jywgb25lbnRyeSlcblxuICBpZiAob3B0cy5maW5pc2gpIGV4dHJhY3Qub24oJ2ZpbmlzaCcsIG9wdHMuZmluaXNoKVxuXG4gIHJldHVybiBleHRyYWN0XG5cbiAgZnVuY3Rpb24gb25lbnRyeSAoaGVhZGVyLCBzdHJlYW0sIG5leHQpIHtcbiAgICBoZWFkZXIgPSBtYXAoaGVhZGVyKSB8fCBoZWFkZXJcbiAgICBoZWFkZXIubmFtZSA9IG5vcm1hbGl6ZShoZWFkZXIubmFtZSlcblxuICAgIGNvbnN0IG5hbWUgPSBwYXRoLmpvaW4oY3dkLCBwYXRoLmpvaW4oJy8nLCBoZWFkZXIubmFtZSkpXG5cbiAgICBpZiAoaWdub3JlKG5hbWUsIGhlYWRlcikpIHtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKVxuICAgICAgcmV0dXJuIG5leHQoKVxuICAgIH1cblxuICAgIGlmIChoZWFkZXIudHlwZSA9PT0gJ2RpcmVjdG9yeScpIHtcbiAgICAgIHN0YWNrLnB1c2goW25hbWUsIGhlYWRlci5tdGltZV0pXG4gICAgICByZXR1cm4gbWtkaXJmaXgobmFtZSwge1xuICAgICAgICBmczogeGZzLFxuICAgICAgICBvd24sXG4gICAgICAgIHVpZDogaGVhZGVyLnVpZCxcbiAgICAgICAgZ2lkOiBoZWFkZXIuZ2lkLFxuICAgICAgICBtb2RlOiBoZWFkZXIubW9kZVxuICAgICAgfSwgc3RhdClcbiAgICB9XG5cbiAgICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUobmFtZSlcblxuICAgIHZhbGlkYXRlKHhmcywgZGlyLCBwYXRoLmpvaW4oY3dkLCAnLicpLCBmdW5jdGlvbiAoZXJyLCB2YWxpZCkge1xuICAgICAgaWYgKGVycikgcmV0dXJuIG5leHQoZXJyKVxuICAgICAgaWYgKCF2YWxpZCkgcmV0dXJuIG5leHQobmV3IEVycm9yKGRpciArICcgaXMgbm90IGEgdmFsaWQgcGF0aCcpKVxuXG4gICAgICBta2RpcmZpeChkaXIsIHtcbiAgICAgICAgZnM6IHhmcyxcbiAgICAgICAgb3duLFxuICAgICAgICB1aWQ6IGhlYWRlci51aWQsXG4gICAgICAgIGdpZDogaGVhZGVyLmdpZCxcbiAgICAgICAgLy8gbm9ybWFsbHksIHRoZSBmb2xkZXJzIHdpdGggcmlnaHRzIGFuZCBvd25lciBzaG91bGQgYmUgcGFydCBvZiB0aGUgVEFSIGZpbGVcbiAgICAgICAgLy8gaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIGNyZWF0ZSBmb2xkZXIgZm9yIHNhbWUgdXNlciBhcyBmaWxlIGFuZCB3aXRoXG4gICAgICAgIC8vIHN0YW5kYXJkIHBlcm1pc3Npb25zIG9mIDBvNzU1IChyd3hyLXhyLXgpXG4gICAgICAgIG1vZGU6IDBvNzU1XG4gICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIpIHJldHVybiBuZXh0KGVycilcblxuICAgICAgICBzd2l0Y2ggKGhlYWRlci50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnZmlsZSc6IHJldHVybiBvbmZpbGUoKVxuICAgICAgICAgIGNhc2UgJ2xpbmsnOiByZXR1cm4gb25saW5rKClcbiAgICAgICAgICBjYXNlICdzeW1saW5rJzogcmV0dXJuIG9uc3ltbGluaygpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyaWN0KSByZXR1cm4gbmV4dChuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIHR5cGUgZm9yICcgKyBuYW1lICsgJyAoJyArIGhlYWRlci50eXBlICsgJyknKSlcblxuICAgICAgICBzdHJlYW0ucmVzdW1lKClcbiAgICAgICAgbmV4dCgpXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBmdW5jdGlvbiBzdGF0IChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBuZXh0KGVycilcbiAgICAgIHV0aW1lcyhuYW1lLCBoZWFkZXIsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIG5leHQoZXJyKVxuICAgICAgICBpZiAod2luMzIpIHJldHVybiBuZXh0KClcbiAgICAgICAgY2hwZXJtKG5hbWUsIGhlYWRlciwgbmV4dClcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25zeW1saW5rICgpIHtcbiAgICAgIGlmICh3aW4zMikgcmV0dXJuIG5leHQoKSAvLyBza2lwIHN5bWxpbmtzIG9uIHdpbiBmb3Igbm93IGJlZm9yZSBpdCBjYW4gYmUgdGVzdGVkXG4gICAgICB4ZnMudW5saW5rKG5hbWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgeGZzLnN5bWxpbmsoaGVhZGVyLmxpbmtuYW1lLCBuYW1lLCBzdGF0KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmxpbmsgKCkge1xuICAgICAgaWYgKHdpbjMyKSByZXR1cm4gbmV4dCgpIC8vIHNraXAgbGlua3Mgb24gd2luIGZvciBub3cgYmVmb3JlIGl0IGNhbiBiZSB0ZXN0ZWRcbiAgICAgIHhmcy51bmxpbmsobmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzcmNwYXRoID0gcGF0aC5qb2luKGN3ZCwgcGF0aC5qb2luKCcvJywgaGVhZGVyLmxpbmtuYW1lKSlcblxuICAgICAgICB4ZnMubGluayhzcmNwYXRoLCBuYW1lLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ0VQRVJNJyAmJiBvcHRzLmhhcmRsaW5rQXNGaWxlc0ZhbGxiYWNrKSB7XG4gICAgICAgICAgICBzdHJlYW0gPSB4ZnMuY3JlYXRlUmVhZFN0cmVhbShzcmNwYXRoKVxuICAgICAgICAgICAgcmV0dXJuIG9uZmlsZSgpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3RhdChlcnIpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uZmlsZSAoKSB7XG4gICAgICBjb25zdCB3cyA9IHhmcy5jcmVhdGVXcml0ZVN0cmVhbShuYW1lKVxuICAgICAgY29uc3QgcnMgPSBtYXBTdHJlYW0oc3RyZWFtLCBoZWFkZXIpXG5cbiAgICAgIHdzLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHsgLy8gYWx3YXlzIGZvcndhcmQgZXJyb3JzIG9uIGRlc3Ryb3lcbiAgICAgICAgcnMuZGVzdHJveShlcnIpXG4gICAgICB9KVxuXG4gICAgICBwdW1wKHJzLCB3cywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG4gICAgICAgIHdzLm9uKCdjbG9zZScsIHN0YXQpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHV0aW1lc1BhcmVudCAobmFtZSwgY2IpIHsgLy8gd2UganVzdCBzZXQgdGhlIG10aW1lIG9uIHRoZSBwYXJlbnQgZGlyIGFnYWluIGV2ZXJ5dGltZSB3ZSB3cml0ZSBhbiBlbnRyeVxuICAgIGxldCB0b3BcbiAgICB3aGlsZSAoKHRvcCA9IGhlYWQoc3RhY2spKSAmJiBuYW1lLnNsaWNlKDAsIHRvcFswXS5sZW5ndGgpICE9PSB0b3BbMF0pIHN0YWNrLnBvcCgpXG4gICAgaWYgKCF0b3ApIHJldHVybiBjYigpXG4gICAgeGZzLnV0aW1lcyh0b3BbMF0sIG5vdywgdG9wWzFdLCBjYilcbiAgfVxuXG4gIGZ1bmN0aW9uIHV0aW1lcyAobmFtZSwgaGVhZGVyLCBjYikge1xuICAgIGlmIChvcHRzLnV0aW1lcyA9PT0gZmFsc2UpIHJldHVybiBjYigpXG5cbiAgICBpZiAoaGVhZGVyLnR5cGUgPT09ICdkaXJlY3RvcnknKSByZXR1cm4geGZzLnV0aW1lcyhuYW1lLCBub3csIGhlYWRlci5tdGltZSwgY2IpXG4gICAgaWYgKGhlYWRlci50eXBlID09PSAnc3ltbGluaycpIHJldHVybiB1dGltZXNQYXJlbnQobmFtZSwgY2IpIC8vIFRPRE86IGhvdyB0byBzZXQgbXRpbWUgb24gbGluaz9cblxuICAgIHhmcy51dGltZXMobmFtZSwgbm93LCBoZWFkZXIubXRpbWUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG4gICAgICB1dGltZXNQYXJlbnQobmFtZSwgY2IpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGNocGVybSAobmFtZSwgaGVhZGVyLCBjYikge1xuICAgIGNvbnN0IGxpbmsgPSBoZWFkZXIudHlwZSA9PT0gJ3N5bWxpbmsnXG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuL25vLWRlcHJlY2F0ZWQtYXBpICovXG4gICAgY29uc3QgY2htb2QgPSBsaW5rID8geGZzLmxjaG1vZCA6IHhmcy5jaG1vZFxuICAgIGNvbnN0IGNob3duID0gbGluayA/IHhmcy5sY2hvd24gOiB4ZnMuY2hvd25cbiAgICAvKiBlc2xpbnQtZW5hYmxlIG4vbm8tZGVwcmVjYXRlZC1hcGkgKi9cblxuICAgIGlmICghY2htb2QpIHJldHVybiBjYigpXG5cbiAgICBjb25zdCBtb2RlID0gKGhlYWRlci5tb2RlIHwgKGhlYWRlci50eXBlID09PSAnZGlyZWN0b3J5JyA/IGRtb2RlIDogZm1vZGUpKSAmIHVtYXNrXG5cbiAgICBpZiAoY2hvd24gJiYgb3duKSBjaG93bi5jYWxsKHhmcywgbmFtZSwgaGVhZGVyLnVpZCwgaGVhZGVyLmdpZCwgb25jaG93bilcbiAgICBlbHNlIG9uY2hvd24obnVsbClcblxuICAgIGZ1bmN0aW9uIG9uY2hvd24gKGVycikge1xuICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICAgIGlmICghY2htb2QpIHJldHVybiBjYigpXG4gICAgICBjaG1vZC5jYWxsKHhmcywgbmFtZSwgbW9kZSwgY2IpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWtkaXJmaXggKG5hbWUsIG9wdHMsIGNiKSB7XG4gICAgLy8gd2hlbiBta2RpciBpcyBjYWxsZWQgb24gYW4gZXhpc3RpbmcgZGlyZWN0b3J5LCB0aGUgcGVybWlzc2lvbnNcbiAgICAvLyB3aWxsIGJlIG92ZXJ3cml0dGVuICg/KSwgdG8gYXZvaWQgdGhpcyB3ZSBjaGVjayBmb3IgaXRzIGV4aXN0YW5jZSBmaXJzdFxuICAgIHhmcy5zdGF0KG5hbWUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmICghZXJyKSByZXR1cm4gY2IobnVsbClcbiAgICAgIGlmIChlcnIuY29kZSAhPT0gJ0VOT0VOVCcpIHJldHVybiBjYihlcnIpXG4gICAgICB4ZnMubWtkaXIobmFtZSwgeyBtb2RlOiBvcHRzLm1vZGUsIHJlY3Vyc2l2ZTogdHJ1ZSB9LCBmdW5jdGlvbiAoZXJyLCBtYWRlKSB7XG4gICAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpXG4gICAgICAgIGNocGVybShuYW1lLCBvcHRzLCBjYilcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZSAoZnMsIG5hbWUsIHJvb3QsIGNiKSB7XG4gIGlmIChuYW1lID09PSByb290KSByZXR1cm4gY2IobnVsbCwgdHJ1ZSlcbiAgZnMubHN0YXQobmFtZSwgZnVuY3Rpb24gKGVyciwgc3QpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIHZhbGlkYXRlKGZzLCBwYXRoLmpvaW4obmFtZSwgJy4uJyksIHJvb3QsIGNiKVxuICAgIGVsc2UgaWYgKGVycikgcmV0dXJuIGNiKGVycilcbiAgICBjYihudWxsLCBzdC5pc0RpcmVjdG9yeSgpKVxuICB9KVxufVxuXG5mdW5jdGlvbiBub29wICgpIHt9XG5cbmZ1bmN0aW9uIGVjaG8gKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWVcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplIChuYW1lKSB7XG4gIHJldHVybiB3aW4zMiA/IG5hbWUucmVwbGFjZSgvXFxcXC9nLCAnLycpLnJlcGxhY2UoL1s6Pzw+fF0vZywgJ18nKSA6IG5hbWVcbn1cblxuZnVuY3Rpb24gc3RhdEFsbCAoZnMsIHN0YXQsIGN3ZCwgaWdub3JlLCBlbnRyaWVzLCBzb3J0KSB7XG4gIGlmICghZW50cmllcykgZW50cmllcyA9IFsnLiddXG4gIGNvbnN0IHF1ZXVlID0gZW50cmllcy5zbGljZSgwKVxuXG4gIHJldHVybiBmdW5jdGlvbiBsb29wIChjYWxsYmFjaykge1xuICAgIGlmICghcXVldWUubGVuZ3RoKSByZXR1cm4gY2FsbGJhY2sobnVsbClcblxuICAgIGNvbnN0IG5leHQgPSBxdWV1ZS5zaGlmdCgpXG4gICAgY29uc3QgbmV4dEFicyA9IHBhdGguam9pbihjd2QsIG5leHQpXG5cbiAgICBzdGF0LmNhbGwoZnMsIG5leHRBYnMsIGZ1bmN0aW9uIChlcnIsIHN0YXQpIHtcbiAgICAgIC8vIGlnbm9yZSBlcnJvcnMgaWYgdGhlIGZpbGVzIHdlcmUgZGVsZXRlZCB3aGlsZSBidWZmZXJpbmdcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlbnRyaWVzLmluZGV4T2YobmV4dCkgPT09IC0xICYmIGVyci5jb2RlID09PSAnRU5PRU5UJyA/IG51bGwgOiBlcnIpXG5cbiAgICAgIGlmICghc3RhdC5pc0RpcmVjdG9yeSgpKSByZXR1cm4gY2FsbGJhY2sobnVsbCwgbmV4dCwgc3RhdClcblxuICAgICAgZnMucmVhZGRpcihuZXh0QWJzLCBmdW5jdGlvbiAoZXJyLCBmaWxlcykge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKVxuXG4gICAgICAgIGlmIChzb3J0KSBmaWxlcy5zb3J0KClcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFpZ25vcmUocGF0aC5qb2luKGN3ZCwgbmV4dCwgZmlsZXNbaV0pKSkgcXVldWUucHVzaChwYXRoLmpvaW4obmV4dCwgZmlsZXNbaV0pKVxuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sobnVsbCwgbmV4dCwgc3RhdClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJpcCAobWFwLCBsZXZlbCkge1xuICByZXR1cm4gZnVuY3Rpb24gKGhlYWRlcikge1xuICAgIGhlYWRlci5uYW1lID0gaGVhZGVyLm5hbWUuc3BsaXQoJy8nKS5zbGljZShsZXZlbCkuam9pbignLycpXG5cbiAgICBjb25zdCBsaW5rbmFtZSA9IGhlYWRlci5saW5rbmFtZVxuICAgIGlmIChsaW5rbmFtZSAmJiAoaGVhZGVyLnR5cGUgPT09ICdsaW5rJyB8fCBwYXRoLmlzQWJzb2x1dGUobGlua25hbWUpKSkge1xuICAgICAgaGVhZGVyLmxpbmtuYW1lID0gbGlua25hbWUuc3BsaXQoJy8nKS5zbGljZShsZXZlbCkuam9pbignLycpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcChoZWFkZXIpXG4gIH1cbn1cbiIsImNvbnN0IGNvbnN0YW50cyA9IHsgLy8ganVzdCBmb3IgZW52cyB3aXRob3V0IGZzXG4gIFNfSUZNVDogNjE0NDAsXG4gIFNfSUZESVI6IDE2Mzg0LFxuICBTX0lGQ0hSOiA4MTkyLFxuICBTX0lGQkxLOiAyNDU3NixcbiAgU19JRklGTzogNDA5NixcbiAgU19JRkxOSzogNDA5NjBcbn1cblxudHJ5IHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdmcycpLmNvbnN0YW50cyB8fCBjb25zdGFudHNcbn0gY2F0Y2gge1xuICBtb2R1bGUuZXhwb3J0cyA9IGNvbnN0YW50c1xufVxuIiwiY29uc3QgeyBXcml0YWJsZSwgUmVhZGFibGUsIGdldFN0cmVhbUVycm9yIH0gPSByZXF1aXJlKCdzdHJlYW14JylcbmNvbnN0IEZJRk8gPSByZXF1aXJlKCdmYXN0LWZpZm8nKVxuY29uc3QgYjRhID0gcmVxdWlyZSgnYjRhJylcbmNvbnN0IGhlYWRlcnMgPSByZXF1aXJlKCcuL2hlYWRlcnMnKVxuXG5jb25zdCBFTVBUWSA9IGI0YS5hbGxvYygwKVxuXG5jbGFzcyBCdWZmZXJMaXN0IHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMuYnVmZmVyZWQgPSAwXG4gICAgdGhpcy5zaGlmdGVkID0gMFxuICAgIHRoaXMucXVldWUgPSBuZXcgRklGTygpXG5cbiAgICB0aGlzLl9vZmZzZXQgPSAwXG4gIH1cblxuICBwdXNoIChidWZmZXIpIHtcbiAgICB0aGlzLmJ1ZmZlcmVkICs9IGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgdGhpcy5xdWV1ZS5wdXNoKGJ1ZmZlcilcbiAgfVxuXG4gIHNoaWZ0Rmlyc3QgKHNpemUpIHtcbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyZWQgPT09IDAgPyBudWxsIDogdGhpcy5fbmV4dChzaXplKVxuICB9XG5cbiAgc2hpZnQgKHNpemUpIHtcbiAgICBpZiAoc2l6ZSA+IHRoaXMuYnVmZmVyZWQpIHJldHVybiBudWxsXG4gICAgaWYgKHNpemUgPT09IDApIHJldHVybiBFTVBUWVxuXG4gICAgbGV0IGNodW5rID0gdGhpcy5fbmV4dChzaXplKVxuXG4gICAgaWYgKHNpemUgPT09IGNodW5rLmJ5dGVMZW5ndGgpIHJldHVybiBjaHVuayAvLyBsaWtlbHkgY2FzZVxuXG4gICAgY29uc3QgY2h1bmtzID0gW2NodW5rXVxuXG4gICAgd2hpbGUgKChzaXplIC09IGNodW5rLmJ5dGVMZW5ndGgpID4gMCkge1xuICAgICAgY2h1bmsgPSB0aGlzLl9uZXh0KHNpemUpXG4gICAgICBjaHVua3MucHVzaChjaHVuaylcbiAgICB9XG5cbiAgICByZXR1cm4gYjRhLmNvbmNhdChjaHVua3MpXG4gIH1cblxuICBfbmV4dCAoc2l6ZSkge1xuICAgIGNvbnN0IGJ1ZiA9IHRoaXMucXVldWUucGVlaygpXG4gICAgY29uc3QgcmVtID0gYnVmLmJ5dGVMZW5ndGggLSB0aGlzLl9vZmZzZXRcblxuICAgIGlmIChzaXplID49IHJlbSkge1xuICAgICAgY29uc3Qgc3ViID0gdGhpcy5fb2Zmc2V0ID8gYnVmLnN1YmFycmF5KHRoaXMuX29mZnNldCwgYnVmLmJ5dGVMZW5ndGgpIDogYnVmXG4gICAgICB0aGlzLnF1ZXVlLnNoaWZ0KClcbiAgICAgIHRoaXMuX29mZnNldCA9IDBcbiAgICAgIHRoaXMuYnVmZmVyZWQgLT0gcmVtXG4gICAgICB0aGlzLnNoaWZ0ZWQgKz0gcmVtXG4gICAgICByZXR1cm4gc3ViXG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXJlZCAtPSBzaXplXG4gICAgdGhpcy5zaGlmdGVkICs9IHNpemVcblxuICAgIHJldHVybiBidWYuc3ViYXJyYXkodGhpcy5fb2Zmc2V0LCAodGhpcy5fb2Zmc2V0ICs9IHNpemUpKVxuICB9XG59XG5cbmNsYXNzIFNvdXJjZSBleHRlbmRzIFJlYWRhYmxlIHtcbiAgY29uc3RydWN0b3IgKHNlbGYsIGhlYWRlciwgb2Zmc2V0KSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5oZWFkZXIgPSBoZWFkZXJcbiAgICB0aGlzLm9mZnNldCA9IG9mZnNldFxuXG4gICAgdGhpcy5fcGFyZW50ID0gc2VsZlxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgaWYgKHRoaXMuaGVhZGVyLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMucHVzaChudWxsKVxuICAgIH1cbiAgICBpZiAodGhpcy5fcGFyZW50Ll9zdHJlYW0gPT09IHRoaXMpIHtcbiAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlKClcbiAgICB9XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9wcmVkZXN0cm95ICgpIHtcbiAgICB0aGlzLl9wYXJlbnQuZGVzdHJveShnZXRTdHJlYW1FcnJvcih0aGlzKSlcbiAgfVxuXG4gIF9kZXRhY2ggKCkge1xuICAgIGlmICh0aGlzLl9wYXJlbnQuX3N0cmVhbSA9PT0gdGhpcykge1xuICAgICAgdGhpcy5fcGFyZW50Ll9zdHJlYW0gPSBudWxsXG4gICAgICB0aGlzLl9wYXJlbnQuX21pc3NpbmcgPSBvdmVyZmxvdyh0aGlzLmhlYWRlci5zaXplKVxuICAgICAgdGhpcy5fcGFyZW50Ll91cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95IChjYikge1xuICAgIHRoaXMuX2RldGFjaCgpXG4gICAgY2IobnVsbClcbiAgfVxufVxuXG5jbGFzcyBFeHRyYWN0IGV4dGVuZHMgV3JpdGFibGUge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuXG4gICAgdGhpcy5fYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKVxuICAgIHRoaXMuX29mZnNldCA9IDBcbiAgICB0aGlzLl9oZWFkZXIgPSBudWxsXG4gICAgdGhpcy5fc3RyZWFtID0gbnVsbFxuICAgIHRoaXMuX21pc3NpbmcgPSAwXG4gICAgdGhpcy5fbG9uZ0hlYWRlciA9IGZhbHNlXG4gICAgdGhpcy5fY2FsbGJhY2sgPSBub29wXG4gICAgdGhpcy5fbG9ja2VkID0gZmFsc2VcbiAgICB0aGlzLl9maW5pc2hlZCA9IGZhbHNlXG4gICAgdGhpcy5fcGF4ID0gbnVsbFxuICAgIHRoaXMuX3BheEdsb2JhbCA9IG51bGxcbiAgICB0aGlzLl9nbnVMb25nUGF0aCA9IG51bGxcbiAgICB0aGlzLl9nbnVMb25nTGlua1BhdGggPSBudWxsXG4gICAgdGhpcy5fZmlsZW5hbWVFbmNvZGluZyA9IG9wdHMuZmlsZW5hbWVFbmNvZGluZyB8fCAndXRmLTgnXG4gICAgdGhpcy5fYWxsb3dVbmtub3duRm9ybWF0ID0gISFvcHRzLmFsbG93VW5rbm93bkZvcm1hdFxuICAgIHRoaXMuX3VubG9ja0JvdW5kID0gdGhpcy5fdW5sb2NrLmJpbmQodGhpcylcbiAgfVxuXG4gIF91bmxvY2sgKGVycikge1xuICAgIHRoaXMuX2xvY2tlZCA9IGZhbHNlXG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aGlzLmRlc3Ryb3koZXJyKVxuICAgICAgdGhpcy5fY29udGludWVXcml0ZShlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGUoKVxuICB9XG5cbiAgX2NvbnN1bWVIZWFkZXIgKCkge1xuICAgIGlmICh0aGlzLl9sb2NrZWQpIHJldHVybiBmYWxzZVxuXG4gICAgdGhpcy5fb2Zmc2V0ID0gdGhpcy5fYnVmZmVyLnNoaWZ0ZWRcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9oZWFkZXIgPSBoZWFkZXJzLmRlY29kZSh0aGlzLl9idWZmZXIuc2hpZnQoNTEyKSwgdGhpcy5fZmlsZW5hbWVFbmNvZGluZywgdGhpcy5fYWxsb3dVbmtub3duRm9ybWF0KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fY29udGludWVXcml0ZShlcnIpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2hlYWRlcikgcmV0dXJuIHRydWVcblxuICAgIHN3aXRjaCAodGhpcy5faGVhZGVyLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2dudS1sb25nLXBhdGgnOlxuICAgICAgY2FzZSAnZ251LWxvbmctbGluay1wYXRoJzpcbiAgICAgIGNhc2UgJ3BheC1nbG9iYWwtaGVhZGVyJzpcbiAgICAgIGNhc2UgJ3BheC1oZWFkZXInOlxuICAgICAgICB0aGlzLl9sb25nSGVhZGVyID0gdHJ1ZVxuICAgICAgICB0aGlzLl9taXNzaW5nID0gdGhpcy5faGVhZGVyLnNpemVcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICB0aGlzLl9sb2NrZWQgPSB0cnVlXG4gICAgdGhpcy5fYXBwbHlMb25nSGVhZGVycygpXG5cbiAgICBpZiAodGhpcy5faGVhZGVyLnNpemUgPT09IDAgfHwgdGhpcy5faGVhZGVyLnR5cGUgPT09ICdkaXJlY3RvcnknKSB7XG4gICAgICB0aGlzLmVtaXQoJ2VudHJ5JywgdGhpcy5faGVhZGVyLCB0aGlzLl9jcmVhdGVTdHJlYW0oKSwgdGhpcy5fdW5sb2NrQm91bmQpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHRoaXMuX3N0cmVhbSA9IHRoaXMuX2NyZWF0ZVN0cmVhbSgpXG4gICAgdGhpcy5fbWlzc2luZyA9IHRoaXMuX2hlYWRlci5zaXplXG5cbiAgICB0aGlzLmVtaXQoJ2VudHJ5JywgdGhpcy5faGVhZGVyLCB0aGlzLl9zdHJlYW0sIHRoaXMuX3VubG9ja0JvdW5kKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBfYXBwbHlMb25nSGVhZGVycyAoKSB7XG4gICAgaWYgKHRoaXMuX2dudUxvbmdQYXRoKSB7XG4gICAgICB0aGlzLl9oZWFkZXIubmFtZSA9IHRoaXMuX2dudUxvbmdQYXRoXG4gICAgICB0aGlzLl9nbnVMb25nUGF0aCA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZ251TG9uZ0xpbmtQYXRoKSB7XG4gICAgICB0aGlzLl9oZWFkZXIubGlua25hbWUgPSB0aGlzLl9nbnVMb25nTGlua1BhdGhcbiAgICAgIHRoaXMuX2dudUxvbmdMaW5rUGF0aCA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGF4KSB7XG4gICAgICBpZiAodGhpcy5fcGF4LnBhdGgpIHRoaXMuX2hlYWRlci5uYW1lID0gdGhpcy5fcGF4LnBhdGhcbiAgICAgIGlmICh0aGlzLl9wYXgubGlua3BhdGgpIHRoaXMuX2hlYWRlci5saW5rbmFtZSA9IHRoaXMuX3BheC5saW5rcGF0aFxuICAgICAgaWYgKHRoaXMuX3BheC5zaXplKSB0aGlzLl9oZWFkZXIuc2l6ZSA9IHBhcnNlSW50KHRoaXMuX3BheC5zaXplLCAxMClcbiAgICAgIHRoaXMuX2hlYWRlci5wYXggPSB0aGlzLl9wYXhcbiAgICAgIHRoaXMuX3BheCA9IG51bGxcbiAgICB9XG4gIH1cblxuICBfZGVjb2RlTG9uZ0hlYWRlciAoYnVmKSB7XG4gICAgc3dpdGNoICh0aGlzLl9oZWFkZXIudHlwZSkge1xuICAgICAgY2FzZSAnZ251LWxvbmctcGF0aCc6XG4gICAgICAgIHRoaXMuX2dudUxvbmdQYXRoID0gaGVhZGVycy5kZWNvZGVMb25nUGF0aChidWYsIHRoaXMuX2ZpbGVuYW1lRW5jb2RpbmcpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdnbnUtbG9uZy1saW5rLXBhdGgnOlxuICAgICAgICB0aGlzLl9nbnVMb25nTGlua1BhdGggPSBoZWFkZXJzLmRlY29kZUxvbmdQYXRoKGJ1ZiwgdGhpcy5fZmlsZW5hbWVFbmNvZGluZylcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3BheC1nbG9iYWwtaGVhZGVyJzpcbiAgICAgICAgdGhpcy5fcGF4R2xvYmFsID0gaGVhZGVycy5kZWNvZGVQYXgoYnVmKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncGF4LWhlYWRlcic6XG4gICAgICAgIHRoaXMuX3BheCA9IHRoaXMuX3BheEdsb2JhbCA9PT0gbnVsbFxuICAgICAgICAgID8gaGVhZGVycy5kZWNvZGVQYXgoYnVmKVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcGF4R2xvYmFsLCBoZWFkZXJzLmRlY29kZVBheChidWYpKVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIF9jb25zdW1lTG9uZ0hlYWRlciAoKSB7XG4gICAgdGhpcy5fbG9uZ0hlYWRlciA9IGZhbHNlXG4gICAgdGhpcy5fbWlzc2luZyA9IG92ZXJmbG93KHRoaXMuX2hlYWRlci5zaXplKVxuXG4gICAgY29uc3QgYnVmID0gdGhpcy5fYnVmZmVyLnNoaWZ0KHRoaXMuX2hlYWRlci5zaXplKVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2RlY29kZUxvbmdIZWFkZXIoYnVmKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fY29udGludWVXcml0ZShlcnIpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX2NvbnN1bWVTdHJlYW0gKCkge1xuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuX2J1ZmZlci5zaGlmdEZpcnN0KHRoaXMuX21pc3NpbmcpXG4gICAgaWYgKGJ1ZiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlXG5cbiAgICB0aGlzLl9taXNzaW5nIC09IGJ1Zi5ieXRlTGVuZ3RoXG4gICAgY29uc3QgZHJhaW5lZCA9IHRoaXMuX3N0cmVhbS5wdXNoKGJ1ZilcblxuICAgIGlmICh0aGlzLl9taXNzaW5nID09PSAwKSB7XG4gICAgICB0aGlzLl9zdHJlYW0ucHVzaChudWxsKVxuICAgICAgaWYgKGRyYWluZWQpIHRoaXMuX3N0cmVhbS5fZGV0YWNoKClcbiAgICAgIHJldHVybiBkcmFpbmVkICYmIHRoaXMuX2xvY2tlZCA9PT0gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gZHJhaW5lZFxuICB9XG5cbiAgX2NyZWF0ZVN0cmVhbSAoKSB7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2UodGhpcywgdGhpcy5faGVhZGVyLCB0aGlzLl9vZmZzZXQpXG4gIH1cblxuICBfdXBkYXRlICgpIHtcbiAgICB3aGlsZSAodGhpcy5fYnVmZmVyLmJ1ZmZlcmVkID4gMCAmJiAhdGhpcy5kZXN0cm95aW5nKSB7XG4gICAgICBpZiAodGhpcy5fbWlzc2luZyA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0cmVhbSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0aGlzLl9jb25zdW1lU3RyZWFtKCkgPT09IGZhbHNlKSByZXR1cm5cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2xvbmdIZWFkZXIgPT09IHRydWUpIHtcbiAgICAgICAgICBpZiAodGhpcy5fbWlzc2luZyA+IHRoaXMuX2J1ZmZlci5idWZmZXJlZCkgYnJlYWtcbiAgICAgICAgICBpZiAodGhpcy5fY29uc3VtZUxvbmdIZWFkZXIoKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZ25vcmUgPSB0aGlzLl9idWZmZXIuc2hpZnRGaXJzdCh0aGlzLl9taXNzaW5nKVxuICAgICAgICBpZiAoaWdub3JlICE9PSBudWxsKSB0aGlzLl9taXNzaW5nIC09IGlnbm9yZS5ieXRlTGVuZ3RoXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9idWZmZXIuYnVmZmVyZWQgPCA1MTIpIGJyZWFrXG4gICAgICBpZiAodGhpcy5fc3RyZWFtICE9PSBudWxsIHx8IHRoaXMuX2NvbnN1bWVIZWFkZXIoKSA9PT0gZmFsc2UpIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NvbnRpbnVlV3JpdGUobnVsbClcbiAgfVxuXG4gIF9jb250aW51ZVdyaXRlIChlcnIpIHtcbiAgICBjb25zdCBjYiA9IHRoaXMuX2NhbGxiYWNrXG4gICAgdGhpcy5fY2FsbGJhY2sgPSBub29wXG4gICAgY2IoZXJyKVxuICB9XG5cbiAgX3dyaXRlIChkYXRhLCBjYikge1xuICAgIHRoaXMuX2NhbGxiYWNrID0gY2JcbiAgICB0aGlzLl9idWZmZXIucHVzaChkYXRhKVxuICAgIHRoaXMuX3VwZGF0ZSgpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgdGhpcy5fZmluaXNoZWQgPSB0aGlzLl9taXNzaW5nID09PSAwICYmIHRoaXMuX2J1ZmZlci5idWZmZXJlZCA9PT0gMFxuICAgIGNiKHRoaXMuX2ZpbmlzaGVkID8gbnVsbCA6IG5ldyBFcnJvcignVW5leHBlY3RlZCBlbmQgb2YgZGF0YScpKVxuICB9XG5cbiAgX3ByZWRlc3Ryb3kgKCkge1xuICAgIHRoaXMuX2NvbnRpbnVlV3JpdGUobnVsbClcbiAgfVxuXG4gIF9kZXN0cm95IChjYikge1xuICAgIGlmICh0aGlzLl9zdHJlYW0pIHRoaXMuX3N0cmVhbS5kZXN0cm95KGdldFN0cmVhbUVycm9yKHRoaXMpKVxuICAgIGNiKG51bGwpXG4gIH1cblxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdICgpIHtcbiAgICBsZXQgZXJyb3IgPSBudWxsXG5cbiAgICBsZXQgcHJvbWlzZVJlc29sdmUgPSBudWxsXG4gICAgbGV0IHByb21pc2VSZWplY3QgPSBudWxsXG5cbiAgICBsZXQgZW50cnlTdHJlYW0gPSBudWxsXG4gICAgbGV0IGVudHJ5Q2FsbGJhY2sgPSBudWxsXG5cbiAgICBjb25zdCBleHRyYWN0ID0gdGhpc1xuXG4gICAgdGhpcy5vbignZW50cnknLCBvbmVudHJ5KVxuICAgIHRoaXMub24oJ2Vycm9yJywgKGVycikgPT4geyBlcnJvciA9IGVyciB9KVxuICAgIHRoaXMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIHJldHVybiB7XG4gICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgIH0sXG4gICAgICBuZXh0ICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKG9ubmV4dClcbiAgICAgIH0sXG4gICAgICByZXR1cm4gKCkge1xuICAgICAgICByZXR1cm4gZGVzdHJveShudWxsKVxuICAgICAgfSxcbiAgICAgIHRocm93IChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGRlc3Ryb3koZXJyKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbnN1bWVDYWxsYmFjayAoZXJyKSB7XG4gICAgICBpZiAoIWVudHJ5Q2FsbGJhY2spIHJldHVyblxuICAgICAgY29uc3QgY2IgPSBlbnRyeUNhbGxiYWNrXG4gICAgICBlbnRyeUNhbGxiYWNrID0gbnVsbFxuICAgICAgY2IoZXJyKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9ubmV4dCAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgaWYgKGVudHJ5U3RyZWFtKSB7XG4gICAgICAgIHJlc29sdmUoeyB2YWx1ZTogZW50cnlTdHJlYW0sIGRvbmU6IGZhbHNlIH0pXG4gICAgICAgIGVudHJ5U3RyZWFtID0gbnVsbFxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcHJvbWlzZVJlc29sdmUgPSByZXNvbHZlXG4gICAgICBwcm9taXNlUmVqZWN0ID0gcmVqZWN0XG5cbiAgICAgIGNvbnN1bWVDYWxsYmFjayhudWxsKVxuXG4gICAgICBpZiAoZXh0cmFjdC5fZmluaXNoZWQgJiYgcHJvbWlzZVJlc29sdmUpIHtcbiAgICAgICAgcHJvbWlzZVJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pXG4gICAgICAgIHByb21pc2VSZXNvbHZlID0gcHJvbWlzZVJlamVjdCA9IG51bGxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmVudHJ5IChoZWFkZXIsIHN0cmVhbSwgY2FsbGJhY2spIHtcbiAgICAgIGVudHJ5Q2FsbGJhY2sgPSBjYWxsYmFja1xuICAgICAgc3RyZWFtLm9uKCdlcnJvcicsIG5vb3ApIC8vIG5vIHdheSBhcm91bmQgdGhpcyBkdWUgdG8gdGljayBzaWxseW5lc3NcblxuICAgICAgaWYgKHByb21pc2VSZXNvbHZlKSB7XG4gICAgICAgIHByb21pc2VSZXNvbHZlKHsgdmFsdWU6IHN0cmVhbSwgZG9uZTogZmFsc2UgfSlcbiAgICAgICAgcHJvbWlzZVJlc29sdmUgPSBwcm9taXNlUmVqZWN0ID0gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnlTdHJlYW0gPSBzdHJlYW1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmNsb3NlICgpIHtcbiAgICAgIGNvbnN1bWVDYWxsYmFjayhlcnJvcilcbiAgICAgIGlmICghcHJvbWlzZVJlc29sdmUpIHJldHVyblxuICAgICAgaWYgKGVycm9yKSBwcm9taXNlUmVqZWN0KGVycm9yKVxuICAgICAgZWxzZSBwcm9taXNlUmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgIHByb21pc2VSZXNvbHZlID0gcHJvbWlzZVJlamVjdCA9IG51bGxcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95IChlcnIpIHtcbiAgICAgIGV4dHJhY3QuZGVzdHJveShlcnIpXG4gICAgICBjb25zdW1lQ2FsbGJhY2soZXJyKVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKGV4dHJhY3QuZGVzdHJveWVkKSByZXR1cm4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgZXh0cmFjdC5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoZXJyKSByZWplY3QoZXJyKVxuICAgICAgICAgIGVsc2UgcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXh0cmFjdCAob3B0cykge1xuICByZXR1cm4gbmV3IEV4dHJhY3Qob3B0cylcbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBvdmVyZmxvdyAoc2l6ZSkge1xuICBzaXplICY9IDUxMVxuICByZXR1cm4gc2l6ZSAmJiA1MTIgLSBzaXplXG59XG4iLCJjb25zdCBiNGEgPSByZXF1aXJlKCdiNGEnKVxuXG5jb25zdCBaRVJPUyA9ICcwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuY29uc3QgU0VWRU5TID0gJzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcnXG5jb25zdCBaRVJPX09GRlNFVCA9ICcwJy5jaGFyQ29kZUF0KDApXG5jb25zdCBVU1RBUl9NQUdJQyA9IGI0YS5mcm9tKFsweDc1LCAweDczLCAweDc0LCAweDYxLCAweDcyLCAweDAwXSkgLy8gdXN0YXJcXHgwMFxuY29uc3QgVVNUQVJfVkVSID0gYjRhLmZyb20oW1pFUk9fT0ZGU0VULCBaRVJPX09GRlNFVF0pXG5jb25zdCBHTlVfTUFHSUMgPSBiNGEuZnJvbShbMHg3NSwgMHg3MywgMHg3NCwgMHg2MSwgMHg3MiwgMHgyMF0pIC8vIHVzdGFyXFx4MjBcbmNvbnN0IEdOVV9WRVIgPSBiNGEuZnJvbShbMHgyMCwgMHgwMF0pXG5jb25zdCBNQVNLID0gMG83Nzc3XG5jb25zdCBNQUdJQ19PRkZTRVQgPSAyNTdcbmNvbnN0IFZFUlNJT05fT0ZGU0VUID0gMjYzXG5cbmV4cG9ydHMuZGVjb2RlTG9uZ1BhdGggPSBmdW5jdGlvbiBkZWNvZGVMb25nUGF0aCAoYnVmLCBlbmNvZGluZykge1xuICByZXR1cm4gZGVjb2RlU3RyKGJ1ZiwgMCwgYnVmLmxlbmd0aCwgZW5jb2RpbmcpXG59XG5cbmV4cG9ydHMuZW5jb2RlUGF4ID0gZnVuY3Rpb24gZW5jb2RlUGF4IChvcHRzKSB7IC8vIFRPRE86IGVuY29kZSBtb3JlIHN0dWZmIGluIHBheFxuICBsZXQgcmVzdWx0ID0gJydcbiAgaWYgKG9wdHMubmFtZSkgcmVzdWx0ICs9IGFkZExlbmd0aCgnIHBhdGg9JyArIG9wdHMubmFtZSArICdcXG4nKVxuICBpZiAob3B0cy5saW5rbmFtZSkgcmVzdWx0ICs9IGFkZExlbmd0aCgnIGxpbmtwYXRoPScgKyBvcHRzLmxpbmtuYW1lICsgJ1xcbicpXG4gIGNvbnN0IHBheCA9IG9wdHMucGF4XG4gIGlmIChwYXgpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBwYXgpIHtcbiAgICAgIHJlc3VsdCArPSBhZGRMZW5ndGgoJyAnICsga2V5ICsgJz0nICsgcGF4W2tleV0gKyAnXFxuJylcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGI0YS5mcm9tKHJlc3VsdClcbn1cblxuZXhwb3J0cy5kZWNvZGVQYXggPSBmdW5jdGlvbiBkZWNvZGVQYXggKGJ1Zikge1xuICBjb25zdCByZXN1bHQgPSB7fVxuXG4gIHdoaWxlIChidWYubGVuZ3RoKSB7XG4gICAgbGV0IGkgPSAwXG4gICAgd2hpbGUgKGkgPCBidWYubGVuZ3RoICYmIGJ1ZltpXSAhPT0gMzIpIGkrK1xuICAgIGNvbnN0IGxlbiA9IHBhcnNlSW50KGI0YS50b1N0cmluZyhidWYuc3ViYXJyYXkoMCwgaSkpLCAxMClcbiAgICBpZiAoIWxlbikgcmV0dXJuIHJlc3VsdFxuXG4gICAgY29uc3QgYiA9IGI0YS50b1N0cmluZyhidWYuc3ViYXJyYXkoaSArIDEsIGxlbiAtIDEpKVxuICAgIGNvbnN0IGtleUluZGV4ID0gYi5pbmRleE9mKCc9JylcbiAgICBpZiAoa2V5SW5kZXggPT09IC0xKSByZXR1cm4gcmVzdWx0XG4gICAgcmVzdWx0W2Iuc2xpY2UoMCwga2V5SW5kZXgpXSA9IGIuc2xpY2Uoa2V5SW5kZXggKyAxKVxuXG4gICAgYnVmID0gYnVmLnN1YmFycmF5KGxlbilcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUgKG9wdHMpIHtcbiAgY29uc3QgYnVmID0gYjRhLmFsbG9jKDUxMilcbiAgbGV0IG5hbWUgPSBvcHRzLm5hbWVcbiAgbGV0IHByZWZpeCA9ICcnXG5cbiAgaWYgKG9wdHMudHlwZWZsYWcgPT09IDUgJiYgbmFtZVtuYW1lLmxlbmd0aCAtIDFdICE9PSAnLycpIG5hbWUgKz0gJy8nXG4gIGlmIChiNGEuYnl0ZUxlbmd0aChuYW1lKSAhPT0gbmFtZS5sZW5ndGgpIHJldHVybiBudWxsIC8vIHV0Zi04XG5cbiAgd2hpbGUgKGI0YS5ieXRlTGVuZ3RoKG5hbWUpID4gMTAwKSB7XG4gICAgY29uc3QgaSA9IG5hbWUuaW5kZXhPZignLycpXG4gICAgaWYgKGkgPT09IC0xKSByZXR1cm4gbnVsbFxuICAgIHByZWZpeCArPSBwcmVmaXggPyAnLycgKyBuYW1lLnNsaWNlKDAsIGkpIDogbmFtZS5zbGljZSgwLCBpKVxuICAgIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKVxuICB9XG5cbiAgaWYgKGI0YS5ieXRlTGVuZ3RoKG5hbWUpID4gMTAwIHx8IGI0YS5ieXRlTGVuZ3RoKHByZWZpeCkgPiAxNTUpIHJldHVybiBudWxsXG4gIGlmIChvcHRzLmxpbmtuYW1lICYmIGI0YS5ieXRlTGVuZ3RoKG9wdHMubGlua25hbWUpID4gMTAwKSByZXR1cm4gbnVsbFxuXG4gIGI0YS53cml0ZShidWYsIG5hbWUpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChvcHRzLm1vZGUgJiBNQVNLLCA2KSwgMTAwKVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy51aWQsIDYpLCAxMDgpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChvcHRzLmdpZCwgNiksIDExNilcbiAgZW5jb2RlU2l6ZShvcHRzLnNpemUsIGJ1ZiwgMTI0KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3QoKG9wdHMubXRpbWUuZ2V0VGltZSgpIC8gMTAwMCkgfCAwLCAxMSksIDEzNilcblxuICBidWZbMTU2XSA9IFpFUk9fT0ZGU0VUICsgdG9UeXBlZmxhZyhvcHRzLnR5cGUpXG5cbiAgaWYgKG9wdHMubGlua25hbWUpIGI0YS53cml0ZShidWYsIG9wdHMubGlua25hbWUsIDE1NylcblxuICBiNGEuY29weShVU1RBUl9NQUdJQywgYnVmLCBNQUdJQ19PRkZTRVQpXG4gIGI0YS5jb3B5KFVTVEFSX1ZFUiwgYnVmLCBWRVJTSU9OX09GRlNFVClcbiAgaWYgKG9wdHMudW5hbWUpIGI0YS53cml0ZShidWYsIG9wdHMudW5hbWUsIDI2NSlcbiAgaWYgKG9wdHMuZ25hbWUpIGI0YS53cml0ZShidWYsIG9wdHMuZ25hbWUsIDI5NylcbiAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG9wdHMuZGV2bWFqb3IgfHwgMCwgNiksIDMyOSlcbiAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG9wdHMuZGV2bWlub3IgfHwgMCwgNiksIDMzNylcblxuICBpZiAocHJlZml4KSBiNGEud3JpdGUoYnVmLCBwcmVmaXgsIDM0NSlcblxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3QoY2tzdW0oYnVmKSwgNiksIDE0OClcblxuICByZXR1cm4gYnVmXG59XG5cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlIChidWYsIGZpbGVuYW1lRW5jb2RpbmcsIGFsbG93VW5rbm93bkZvcm1hdCkge1xuICBsZXQgdHlwZWZsYWcgPSBidWZbMTU2XSA9PT0gMCA/IDAgOiBidWZbMTU2XSAtIFpFUk9fT0ZGU0VUXG5cbiAgbGV0IG5hbWUgPSBkZWNvZGVTdHIoYnVmLCAwLCAxMDAsIGZpbGVuYW1lRW5jb2RpbmcpXG4gIGNvbnN0IG1vZGUgPSBkZWNvZGVPY3QoYnVmLCAxMDAsIDgpXG4gIGNvbnN0IHVpZCA9IGRlY29kZU9jdChidWYsIDEwOCwgOClcbiAgY29uc3QgZ2lkID0gZGVjb2RlT2N0KGJ1ZiwgMTE2LCA4KVxuICBjb25zdCBzaXplID0gZGVjb2RlT2N0KGJ1ZiwgMTI0LCAxMilcbiAgY29uc3QgbXRpbWUgPSBkZWNvZGVPY3QoYnVmLCAxMzYsIDEyKVxuICBjb25zdCB0eXBlID0gdG9UeXBlKHR5cGVmbGFnKVxuICBjb25zdCBsaW5rbmFtZSA9IGJ1ZlsxNTddID09PSAwID8gbnVsbCA6IGRlY29kZVN0cihidWYsIDE1NywgMTAwLCBmaWxlbmFtZUVuY29kaW5nKVxuICBjb25zdCB1bmFtZSA9IGRlY29kZVN0cihidWYsIDI2NSwgMzIpXG4gIGNvbnN0IGduYW1lID0gZGVjb2RlU3RyKGJ1ZiwgMjk3LCAzMilcbiAgY29uc3QgZGV2bWFqb3IgPSBkZWNvZGVPY3QoYnVmLCAzMjksIDgpXG4gIGNvbnN0IGRldm1pbm9yID0gZGVjb2RlT2N0KGJ1ZiwgMzM3LCA4KVxuXG4gIGNvbnN0IGMgPSBja3N1bShidWYpXG5cbiAgLy8gY2hlY2tzdW0gaXMgc3RpbGwgaW5pdGlhbCB2YWx1ZSBpZiBoZWFkZXIgd2FzIG51bGwuXG4gIGlmIChjID09PSA4ICogMzIpIHJldHVybiBudWxsXG5cbiAgLy8gdmFsaWQgY2hlY2tzdW1cbiAgaWYgKGMgIT09IGRlY29kZU9jdChidWYsIDE0OCwgOCkpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0YXIgaGVhZGVyLiBNYXliZSB0aGUgdGFyIGlzIGNvcnJ1cHRlZCBvciBpdCBuZWVkcyB0byBiZSBndW56aXBwZWQ/JylcblxuICBpZiAoaXNVU1RBUihidWYpKSB7XG4gICAgLy8gdXN0YXIgKHBvc2l4KSBmb3JtYXQuXG4gICAgLy8gcHJlcGVuZCBwcmVmaXgsIGlmIHByZXNlbnQuXG4gICAgaWYgKGJ1ZlszNDVdKSBuYW1lID0gZGVjb2RlU3RyKGJ1ZiwgMzQ1LCAxNTUsIGZpbGVuYW1lRW5jb2RpbmcpICsgJy8nICsgbmFtZVxuICB9IGVsc2UgaWYgKGlzR05VKGJ1ZikpIHtcbiAgICAvLyAnZ251Jy8nb2xkZ251JyBmb3JtYXQuIFNpbWlsYXIgdG8gdXN0YXIsIGJ1dCBoYXMgc3VwcG9ydCBmb3IgaW5jcmVtZW50YWwgYW5kXG4gICAgLy8gbXVsdGktdm9sdW1lIHRhcmJhbGxzLlxuICB9IGVsc2Uge1xuICAgIGlmICghYWxsb3dVbmtub3duRm9ybWF0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdGFyIGhlYWRlcjogdW5rbm93biBmb3JtYXQuJylcbiAgICB9XG4gIH1cblxuICAvLyB0byBzdXBwb3J0IG9sZCB0YXIgdmVyc2lvbnMgdGhhdCB1c2UgdHJhaWxpbmcgLyB0byBpbmRpY2F0ZSBkaXJzXG4gIGlmICh0eXBlZmxhZyA9PT0gMCAmJiBuYW1lICYmIG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJy8nKSB0eXBlZmxhZyA9IDVcblxuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgbW9kZSxcbiAgICB1aWQsXG4gICAgZ2lkLFxuICAgIHNpemUsXG4gICAgbXRpbWU6IG5ldyBEYXRlKDEwMDAgKiBtdGltZSksXG4gICAgdHlwZSxcbiAgICBsaW5rbmFtZSxcbiAgICB1bmFtZSxcbiAgICBnbmFtZSxcbiAgICBkZXZtYWpvcixcbiAgICBkZXZtaW5vcixcbiAgICBwYXg6IG51bGxcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1VTVEFSIChidWYpIHtcbiAgcmV0dXJuIGI0YS5lcXVhbHMoVVNUQVJfTUFHSUMsIGJ1Zi5zdWJhcnJheShNQUdJQ19PRkZTRVQsIE1BR0lDX09GRlNFVCArIDYpKVxufVxuXG5mdW5jdGlvbiBpc0dOVSAoYnVmKSB7XG4gIHJldHVybiBiNGEuZXF1YWxzKEdOVV9NQUdJQywgYnVmLnN1YmFycmF5KE1BR0lDX09GRlNFVCwgTUFHSUNfT0ZGU0VUICsgNikpICYmXG4gICAgYjRhLmVxdWFscyhHTlVfVkVSLCBidWYuc3ViYXJyYXkoVkVSU0lPTl9PRkZTRVQsIFZFUlNJT05fT0ZGU0VUICsgMikpXG59XG5cbmZ1bmN0aW9uIGNsYW1wIChpbmRleCwgbGVuLCBkZWZhdWx0VmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicpIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgaW5kZXggPSB+fmluZGV4IC8vIENvZXJjZSB0byBpbnRlZ2VyLlxuICBpZiAoaW5kZXggPj0gbGVuKSByZXR1cm4gbGVuXG4gIGlmIChpbmRleCA+PSAwKSByZXR1cm4gaW5kZXhcbiAgaW5kZXggKz0gbGVuXG4gIGlmIChpbmRleCA+PSAwKSByZXR1cm4gaW5kZXhcbiAgcmV0dXJuIDBcbn1cblxuZnVuY3Rpb24gdG9UeXBlIChmbGFnKSB7XG4gIHN3aXRjaCAoZmxhZykge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiAnZmlsZSdcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gJ2xpbmsnXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuICdzeW1saW5rJ1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiAnY2hhcmFjdGVyLWRldmljZSdcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gJ2Jsb2NrLWRldmljZSdcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gJ2RpcmVjdG9yeSdcbiAgICBjYXNlIDY6XG4gICAgICByZXR1cm4gJ2ZpZm8nXG4gICAgY2FzZSA3OlxuICAgICAgcmV0dXJuICdjb250aWd1b3VzLWZpbGUnXG4gICAgY2FzZSA3MjpcbiAgICAgIHJldHVybiAncGF4LWhlYWRlcidcbiAgICBjYXNlIDU1OlxuICAgICAgcmV0dXJuICdwYXgtZ2xvYmFsLWhlYWRlcidcbiAgICBjYXNlIDI3OlxuICAgICAgcmV0dXJuICdnbnUtbG9uZy1saW5rLXBhdGgnXG4gICAgY2FzZSAyODpcbiAgICBjYXNlIDMwOlxuICAgICAgcmV0dXJuICdnbnUtbG9uZy1wYXRoJ1xuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gdG9UeXBlZmxhZyAoZmxhZykge1xuICBzd2l0Y2ggKGZsYWcpIHtcbiAgICBjYXNlICdmaWxlJzpcbiAgICAgIHJldHVybiAwXG4gICAgY2FzZSAnbGluayc6XG4gICAgICByZXR1cm4gMVxuICAgIGNhc2UgJ3N5bWxpbmsnOlxuICAgICAgcmV0dXJuIDJcbiAgICBjYXNlICdjaGFyYWN0ZXItZGV2aWNlJzpcbiAgICAgIHJldHVybiAzXG4gICAgY2FzZSAnYmxvY2stZGV2aWNlJzpcbiAgICAgIHJldHVybiA0XG4gICAgY2FzZSAnZGlyZWN0b3J5JzpcbiAgICAgIHJldHVybiA1XG4gICAgY2FzZSAnZmlmbyc6XG4gICAgICByZXR1cm4gNlxuICAgIGNhc2UgJ2NvbnRpZ3VvdXMtZmlsZSc6XG4gICAgICByZXR1cm4gN1xuICAgIGNhc2UgJ3BheC1oZWFkZXInOlxuICAgICAgcmV0dXJuIDcyXG4gIH1cblxuICByZXR1cm4gMFxufVxuXG5mdW5jdGlvbiBpbmRleE9mIChibG9jaywgbnVtLCBvZmZzZXQsIGVuZCkge1xuICBmb3IgKDsgb2Zmc2V0IDwgZW5kOyBvZmZzZXQrKykge1xuICAgIGlmIChibG9ja1tvZmZzZXRdID09PSBudW0pIHJldHVybiBvZmZzZXRcbiAgfVxuICByZXR1cm4gZW5kXG59XG5cbmZ1bmN0aW9uIGNrc3VtIChibG9jaykge1xuICBsZXQgc3VtID0gOCAqIDMyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTQ4OyBpKyspIHN1bSArPSBibG9ja1tpXVxuICBmb3IgKGxldCBqID0gMTU2OyBqIDwgNTEyOyBqKyspIHN1bSArPSBibG9ja1tqXVxuICByZXR1cm4gc3VtXG59XG5cbmZ1bmN0aW9uIGVuY29kZU9jdCAodmFsLCBuKSB7XG4gIHZhbCA9IHZhbC50b1N0cmluZyg4KVxuICBpZiAodmFsLmxlbmd0aCA+IG4pIHJldHVybiBTRVZFTlMuc2xpY2UoMCwgbikgKyAnICdcbiAgcmV0dXJuIFpFUk9TLnNsaWNlKDAsIG4gLSB2YWwubGVuZ3RoKSArIHZhbCArICcgJ1xufVxuXG5mdW5jdGlvbiBlbmNvZGVTaXplQmluIChudW0sIGJ1Ziwgb2ZmKSB7XG4gIGJ1ZltvZmZdID0gMHg4MFxuICBmb3IgKGxldCBpID0gMTE7IGkgPiAwOyBpLS0pIHtcbiAgICBidWZbb2ZmICsgaV0gPSBudW0gJiAweGZmXG4gICAgbnVtID0gTWF0aC5mbG9vcihudW0gLyAweDEwMClcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmNvZGVTaXplIChudW0sIGJ1Ziwgb2ZmKSB7XG4gIGlmIChudW0udG9TdHJpbmcoOCkubGVuZ3RoID4gMTEpIHtcbiAgICBlbmNvZGVTaXplQmluKG51bSwgYnVmLCBvZmYpXG4gIH0gZWxzZSB7XG4gICAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG51bSwgMTEpLCBvZmYpXG4gIH1cbn1cblxuLyogQ29waWVkIGZyb20gdGhlIG5vZGUtdGFyIHJlcG8gYW5kIG1vZGlmaWVkIHRvIG1lZXRcbiAqIHRhci1zdHJlYW0gY29kaW5nIHN0YW5kYXJkLlxuICpcbiAqIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL25wbS9ub2RlLXRhci9ibG9iLzUxYjY2MjdhMWYzNTdkMmViNDMzZTczNzhlNWYwNWU4M2I3YWE2Y2QvbGliL2hlYWRlci5qcyNMMzQ5XG4gKi9cbmZ1bmN0aW9uIHBhcnNlMjU2IChidWYpIHtcbiAgLy8gZmlyc3QgYnl0ZSBNVVNUIGJlIGVpdGhlciA4MCBvciBGRlxuICAvLyA4MCBmb3IgcG9zaXRpdmUsIEZGIGZvciAyJ3MgY29tcFxuICBsZXQgcG9zaXRpdmVcbiAgaWYgKGJ1ZlswXSA9PT0gMHg4MCkgcG9zaXRpdmUgPSB0cnVlXG4gIGVsc2UgaWYgKGJ1ZlswXSA9PT0gMHhGRikgcG9zaXRpdmUgPSBmYWxzZVxuICBlbHNlIHJldHVybiBudWxsXG5cbiAgLy8gYnVpbGQgdXAgYSBiYXNlLTI1NiB0dXBsZSBmcm9tIHRoZSBsZWFzdCBzaWcgdG8gdGhlIGhpZ2hlc3RcbiAgY29uc3QgdHVwbGUgPSBbXVxuICBsZXQgaVxuICBmb3IgKGkgPSBidWYubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgIGNvbnN0IGJ5dGUgPSBidWZbaV1cbiAgICBpZiAocG9zaXRpdmUpIHR1cGxlLnB1c2goYnl0ZSlcbiAgICBlbHNlIHR1cGxlLnB1c2goMHhGRiAtIGJ5dGUpXG4gIH1cblxuICBsZXQgc3VtID0gMFxuICBjb25zdCBsID0gdHVwbGUubGVuZ3RoXG4gIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICBzdW0gKz0gdHVwbGVbaV0gKiBNYXRoLnBvdygyNTYsIGkpXG4gIH1cblxuICByZXR1cm4gcG9zaXRpdmUgPyBzdW0gOiAtMSAqIHN1bVxufVxuXG5mdW5jdGlvbiBkZWNvZGVPY3QgKHZhbCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgdmFsID0gdmFsLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKVxuICBvZmZzZXQgPSAwXG5cbiAgLy8gSWYgcHJlZml4ZWQgd2l0aCAweDgwIHRoZW4gcGFyc2UgYXMgYSBiYXNlLTI1NiBpbnRlZ2VyXG4gIGlmICh2YWxbb2Zmc2V0XSAmIDB4ODApIHtcbiAgICByZXR1cm4gcGFyc2UyNTYodmFsKVxuICB9IGVsc2Uge1xuICAgIC8vIE9sZGVyIHZlcnNpb25zIG9mIHRhciBjYW4gcHJlZml4IHdpdGggc3BhY2VzXG4gICAgd2hpbGUgKG9mZnNldCA8IHZhbC5sZW5ndGggJiYgdmFsW29mZnNldF0gPT09IDMyKSBvZmZzZXQrK1xuICAgIGNvbnN0IGVuZCA9IGNsYW1wKGluZGV4T2YodmFsLCAzMiwgb2Zmc2V0LCB2YWwubGVuZ3RoKSwgdmFsLmxlbmd0aCwgdmFsLmxlbmd0aClcbiAgICB3aGlsZSAob2Zmc2V0IDwgZW5kICYmIHZhbFtvZmZzZXRdID09PSAwKSBvZmZzZXQrK1xuICAgIGlmIChlbmQgPT09IG9mZnNldCkgcmV0dXJuIDBcbiAgICByZXR1cm4gcGFyc2VJbnQoYjRhLnRvU3RyaW5nKHZhbC5zdWJhcnJheShvZmZzZXQsIGVuZCkpLCA4KVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlY29kZVN0ciAodmFsLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGI0YS50b1N0cmluZyh2YWwuc3ViYXJyYXkob2Zmc2V0LCBpbmRleE9mKHZhbCwgMCwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpKSwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFkZExlbmd0aCAoc3RyKSB7XG4gIGNvbnN0IGxlbiA9IGI0YS5ieXRlTGVuZ3RoKHN0cilcbiAgbGV0IGRpZ2l0cyA9IE1hdGguZmxvb3IoTWF0aC5sb2cobGVuKSAvIE1hdGgubG9nKDEwKSkgKyAxXG4gIGlmIChsZW4gKyBkaWdpdHMgPj0gTWF0aC5wb3coMTAsIGRpZ2l0cykpIGRpZ2l0cysrXG5cbiAgcmV0dXJuIChsZW4gKyBkaWdpdHMpICsgc3RyXG59XG4iLCJleHBvcnRzLmV4dHJhY3QgPSByZXF1aXJlKCcuL2V4dHJhY3QnKVxuZXhwb3J0cy5wYWNrID0gcmVxdWlyZSgnLi9wYWNrJylcbiIsImNvbnN0IHsgUmVhZGFibGUsIFdyaXRhYmxlLCBnZXRTdHJlYW1FcnJvciB9ID0gcmVxdWlyZSgnc3RyZWFteCcpXG5jb25zdCBiNGEgPSByZXF1aXJlKCdiNGEnKVxuXG5jb25zdCBjb25zdGFudHMgPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCBoZWFkZXJzID0gcmVxdWlyZSgnLi9oZWFkZXJzJylcblxuY29uc3QgRE1PREUgPSAwbzc1NVxuY29uc3QgRk1PREUgPSAwbzY0NFxuXG5jb25zdCBFTkRfT0ZfVEFSID0gYjRhLmFsbG9jKDEwMjQpXG5cbmNsYXNzIFNpbmsgZXh0ZW5kcyBXcml0YWJsZSB7XG4gIGNvbnN0cnVjdG9yIChwYWNrLCBoZWFkZXIsIGNhbGxiYWNrKSB7XG4gICAgc3VwZXIoeyBtYXBXcml0YWJsZSwgZWFnZXJPcGVuOiB0cnVlIH0pXG5cbiAgICB0aGlzLndyaXR0ZW4gPSAwXG4gICAgdGhpcy5oZWFkZXIgPSBoZWFkZXJcblxuICAgIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLl9saW5rbmFtZSA9IG51bGxcbiAgICB0aGlzLl9pc0xpbmtuYW1lID0gaGVhZGVyLnR5cGUgPT09ICdzeW1saW5rJyAmJiAhaGVhZGVyLmxpbmtuYW1lXG4gICAgdGhpcy5faXNWb2lkID0gaGVhZGVyLnR5cGUgIT09ICdmaWxlJyAmJiBoZWFkZXIudHlwZSAhPT0gJ2NvbnRpZ3VvdXMtZmlsZSdcbiAgICB0aGlzLl9maW5pc2hlZCA9IGZhbHNlXG4gICAgdGhpcy5fcGFjayA9IHBhY2tcbiAgICB0aGlzLl9vcGVuQ2FsbGJhY2sgPSBudWxsXG5cbiAgICBpZiAodGhpcy5fcGFjay5fc3RyZWFtID09PSBudWxsKSB0aGlzLl9wYWNrLl9zdHJlYW0gPSB0aGlzXG4gICAgZWxzZSB0aGlzLl9wYWNrLl9wZW5kaW5nLnB1c2godGhpcylcbiAgfVxuXG4gIF9vcGVuIChjYikge1xuICAgIHRoaXMuX29wZW5DYWxsYmFjayA9IGNiXG4gICAgaWYgKHRoaXMuX3BhY2suX3N0cmVhbSA9PT0gdGhpcykgdGhpcy5fY29udGludWVPcGVuKClcbiAgfVxuXG4gIF9jb250aW51ZVBhY2sgKGVycikge1xuICAgIGlmICh0aGlzLl9jYWxsYmFjayA9PT0gbnVsbCkgcmV0dXJuXG5cbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuX2NhbGxiYWNrXG4gICAgdGhpcy5fY2FsbGJhY2sgPSBudWxsXG5cbiAgICBjYWxsYmFjayhlcnIpXG4gIH1cblxuICBfY29udGludWVPcGVuICgpIHtcbiAgICBpZiAodGhpcy5fcGFjay5fc3RyZWFtID09PSBudWxsKSB0aGlzLl9wYWNrLl9zdHJlYW0gPSB0aGlzXG5cbiAgICBjb25zdCBjYiA9IHRoaXMuX29wZW5DYWxsYmFja1xuICAgIHRoaXMuX29wZW5DYWxsYmFjayA9IG51bGxcbiAgICBpZiAoY2IgPT09IG51bGwpIHJldHVyblxuXG4gICAgaWYgKHRoaXMuX3BhY2suZGVzdHJveWluZykgcmV0dXJuIGNiKG5ldyBFcnJvcigncGFjayBzdHJlYW0gZGVzdHJveWVkJykpXG4gICAgaWYgKHRoaXMuX3BhY2suX2ZpbmFsaXplZCkgcmV0dXJuIGNiKG5ldyBFcnJvcigncGFjayBzdHJlYW0gaXMgYWxyZWFkeSBmaW5hbGl6ZWQnKSlcblxuICAgIHRoaXMuX3BhY2suX3N0cmVhbSA9IHRoaXNcblxuICAgIGlmICghdGhpcy5faXNMaW5rbmFtZSkge1xuICAgICAgdGhpcy5fcGFjay5fZW5jb2RlKHRoaXMuaGVhZGVyKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1ZvaWQpIHtcbiAgICAgIHRoaXMuX2ZpbmlzaCgpXG4gICAgICB0aGlzLl9jb250aW51ZVBhY2sobnVsbClcbiAgICB9XG5cbiAgICBjYihudWxsKVxuICB9XG5cbiAgX3dyaXRlIChkYXRhLCBjYikge1xuICAgIGlmICh0aGlzLl9pc0xpbmtuYW1lKSB7XG4gICAgICB0aGlzLl9saW5rbmFtZSA9IHRoaXMuX2xpbmtuYW1lID8gYjRhLmNvbmNhdChbdGhpcy5fbGlua25hbWUsIGRhdGFdKSA6IGRhdGFcbiAgICAgIHJldHVybiBjYihudWxsKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1ZvaWQpIHtcbiAgICAgIGlmIChkYXRhLmJ5dGVMZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBjYihuZXcgRXJyb3IoJ05vIGJvZHkgYWxsb3dlZCBmb3IgdGhpcyBlbnRyeScpKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNiKClcbiAgICB9XG5cbiAgICB0aGlzLndyaXR0ZW4gKz0gZGF0YS5ieXRlTGVuZ3RoXG4gICAgaWYgKHRoaXMuX3BhY2sucHVzaChkYXRhKSkgcmV0dXJuIGNiKClcbiAgICB0aGlzLl9wYWNrLl9kcmFpbiA9IGNiXG4gIH1cblxuICBfZmluaXNoICgpIHtcbiAgICBpZiAodGhpcy5fZmluaXNoZWQpIHJldHVyblxuICAgIHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZVxuXG4gICAgaWYgKHRoaXMuX2lzTGlua25hbWUpIHtcbiAgICAgIHRoaXMuaGVhZGVyLmxpbmtuYW1lID0gdGhpcy5fbGlua25hbWUgPyBiNGEudG9TdHJpbmcodGhpcy5fbGlua25hbWUsICd1dGYtOCcpIDogJydcbiAgICAgIHRoaXMuX3BhY2suX2VuY29kZSh0aGlzLmhlYWRlcilcbiAgICB9XG5cbiAgICBvdmVyZmxvdyh0aGlzLl9wYWNrLCB0aGlzLmhlYWRlci5zaXplKVxuXG4gICAgdGhpcy5fcGFjay5fZG9uZSh0aGlzKVxuICB9XG5cbiAgX2ZpbmFsIChjYikge1xuICAgIGlmICh0aGlzLndyaXR0ZW4gIT09IHRoaXMuaGVhZGVyLnNpemUpIHsgLy8gY29ycnVwdGluZyB0YXJcbiAgICAgIHJldHVybiBjYihuZXcgRXJyb3IoJ1NpemUgbWlzbWF0Y2gnKSlcbiAgICB9XG5cbiAgICB0aGlzLl9maW5pc2goKVxuICAgIGNiKG51bGwpXG4gIH1cblxuICBfZ2V0RXJyb3IgKCkge1xuICAgIHJldHVybiBnZXRTdHJlYW1FcnJvcih0aGlzKSB8fCBuZXcgRXJyb3IoJ3RhciBlbnRyeSBkZXN0cm95ZWQnKVxuICB9XG5cbiAgX3ByZWRlc3Ryb3kgKCkge1xuICAgIHRoaXMuX3BhY2suZGVzdHJveSh0aGlzLl9nZXRFcnJvcigpKVxuICB9XG5cbiAgX2Rlc3Ryb3kgKGNiKSB7XG4gICAgdGhpcy5fcGFjay5fZG9uZSh0aGlzKVxuXG4gICAgdGhpcy5fY29udGludWVQYWNrKHRoaXMuX2ZpbmlzaGVkID8gbnVsbCA6IHRoaXMuX2dldEVycm9yKCkpXG5cbiAgICBjYigpXG4gIH1cbn1cblxuY2xhc3MgUGFjayBleHRlbmRzIFJlYWRhYmxlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXMuX2RyYWluID0gbm9vcFxuICAgIHRoaXMuX2ZpbmFsaXplZCA9IGZhbHNlXG4gICAgdGhpcy5fZmluYWxpemluZyA9IGZhbHNlXG4gICAgdGhpcy5fcGVuZGluZyA9IFtdXG4gICAgdGhpcy5fc3RyZWFtID0gbnVsbFxuICB9XG5cbiAgZW50cnkgKGhlYWRlciwgYnVmZmVyLCBjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9maW5hbGl6ZWQgfHwgdGhpcy5kZXN0cm95aW5nKSB0aHJvdyBuZXcgRXJyb3IoJ2FscmVhZHkgZmluYWxpemVkIG9yIGRlc3Ryb3llZCcpXG5cbiAgICBpZiAodHlwZW9mIGJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBidWZmZXJcbiAgICAgIGJ1ZmZlciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IG5vb3BcblxuICAgIGlmICghaGVhZGVyLnNpemUgfHwgaGVhZGVyLnR5cGUgPT09ICdzeW1saW5rJykgaGVhZGVyLnNpemUgPSAwXG4gICAgaWYgKCFoZWFkZXIudHlwZSkgaGVhZGVyLnR5cGUgPSBtb2RlVG9UeXBlKGhlYWRlci5tb2RlKVxuICAgIGlmICghaGVhZGVyLm1vZGUpIGhlYWRlci5tb2RlID0gaGVhZGVyLnR5cGUgPT09ICdkaXJlY3RvcnknID8gRE1PREUgOiBGTU9ERVxuICAgIGlmICghaGVhZGVyLnVpZCkgaGVhZGVyLnVpZCA9IDBcbiAgICBpZiAoIWhlYWRlci5naWQpIGhlYWRlci5naWQgPSAwXG4gICAgaWYgKCFoZWFkZXIubXRpbWUpIGhlYWRlci5tdGltZSA9IG5ldyBEYXRlKClcblxuICAgIGlmICh0eXBlb2YgYnVmZmVyID09PSAnc3RyaW5nJykgYnVmZmVyID0gYjRhLmZyb20oYnVmZmVyKVxuXG4gICAgY29uc3Qgc2luayA9IG5ldyBTaW5rKHRoaXMsIGhlYWRlciwgY2FsbGJhY2spXG5cbiAgICBpZiAoYjRhLmlzQnVmZmVyKGJ1ZmZlcikpIHtcbiAgICAgIGhlYWRlci5zaXplID0gYnVmZmVyLmJ5dGVMZW5ndGhcbiAgICAgIHNpbmsud3JpdGUoYnVmZmVyKVxuICAgICAgc2luay5lbmQoKVxuICAgICAgcmV0dXJuIHNpbmtcbiAgICB9XG5cbiAgICBpZiAoc2luay5faXNWb2lkKSB7XG4gICAgICByZXR1cm4gc2lua1xuICAgIH1cblxuICAgIHJldHVybiBzaW5rXG4gIH1cblxuICBmaW5hbGl6ZSAoKSB7XG4gICAgaWYgKHRoaXMuX3N0cmVhbSB8fCB0aGlzLl9wZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ZpbmFsaXppbmcgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZmluYWxpemVkKSByZXR1cm5cbiAgICB0aGlzLl9maW5hbGl6ZWQgPSB0cnVlXG5cbiAgICB0aGlzLnB1c2goRU5EX09GX1RBUilcbiAgICB0aGlzLnB1c2gobnVsbClcbiAgfVxuXG4gIF9kb25lIChzdHJlYW0pIHtcbiAgICBpZiAoc3RyZWFtICE9PSB0aGlzLl9zdHJlYW0pIHJldHVyblxuXG4gICAgdGhpcy5fc3RyZWFtID0gbnVsbFxuXG4gICAgaWYgKHRoaXMuX2ZpbmFsaXppbmcpIHRoaXMuZmluYWxpemUoKVxuICAgIGlmICh0aGlzLl9wZW5kaW5nLmxlbmd0aCkgdGhpcy5fcGVuZGluZy5zaGlmdCgpLl9jb250aW51ZU9wZW4oKVxuICB9XG5cbiAgX2VuY29kZSAoaGVhZGVyKSB7XG4gICAgaWYgKCFoZWFkZXIucGF4KSB7XG4gICAgICBjb25zdCBidWYgPSBoZWFkZXJzLmVuY29kZShoZWFkZXIpXG4gICAgICBpZiAoYnVmKSB7XG4gICAgICAgIHRoaXMucHVzaChidWYpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9lbmNvZGVQYXgoaGVhZGVyKVxuICB9XG5cbiAgX2VuY29kZVBheCAoaGVhZGVyKSB7XG4gICAgY29uc3QgcGF4SGVhZGVyID0gaGVhZGVycy5lbmNvZGVQYXgoe1xuICAgICAgbmFtZTogaGVhZGVyLm5hbWUsXG4gICAgICBsaW5rbmFtZTogaGVhZGVyLmxpbmtuYW1lLFxuICAgICAgcGF4OiBoZWFkZXIucGF4XG4gICAgfSlcblxuICAgIGNvbnN0IG5ld0hlYWRlciA9IHtcbiAgICAgIG5hbWU6ICdQYXhIZWFkZXInLFxuICAgICAgbW9kZTogaGVhZGVyLm1vZGUsXG4gICAgICB1aWQ6IGhlYWRlci51aWQsXG4gICAgICBnaWQ6IGhlYWRlci5naWQsXG4gICAgICBzaXplOiBwYXhIZWFkZXIuYnl0ZUxlbmd0aCxcbiAgICAgIG10aW1lOiBoZWFkZXIubXRpbWUsXG4gICAgICB0eXBlOiAncGF4LWhlYWRlcicsXG4gICAgICBsaW5rbmFtZTogaGVhZGVyLmxpbmtuYW1lICYmICdQYXhIZWFkZXInLFxuICAgICAgdW5hbWU6IGhlYWRlci51bmFtZSxcbiAgICAgIGduYW1lOiBoZWFkZXIuZ25hbWUsXG4gICAgICBkZXZtYWpvcjogaGVhZGVyLmRldm1ham9yLFxuICAgICAgZGV2bWlub3I6IGhlYWRlci5kZXZtaW5vclxuICAgIH1cblxuICAgIHRoaXMucHVzaChoZWFkZXJzLmVuY29kZShuZXdIZWFkZXIpKVxuICAgIHRoaXMucHVzaChwYXhIZWFkZXIpXG4gICAgb3ZlcmZsb3codGhpcywgcGF4SGVhZGVyLmJ5dGVMZW5ndGgpXG5cbiAgICBuZXdIZWFkZXIuc2l6ZSA9IGhlYWRlci5zaXplXG4gICAgbmV3SGVhZGVyLnR5cGUgPSBoZWFkZXIudHlwZVxuICAgIHRoaXMucHVzaChoZWFkZXJzLmVuY29kZShuZXdIZWFkZXIpKVxuICB9XG5cbiAgX2RvRHJhaW4gKCkge1xuICAgIGNvbnN0IGRyYWluID0gdGhpcy5fZHJhaW5cbiAgICB0aGlzLl9kcmFpbiA9IG5vb3BcbiAgICBkcmFpbigpXG4gIH1cblxuICBfcHJlZGVzdHJveSAoKSB7XG4gICAgY29uc3QgZXJyID0gZ2V0U3RyZWFtRXJyb3IodGhpcylcblxuICAgIGlmICh0aGlzLl9zdHJlYW0pIHRoaXMuX3N0cmVhbS5kZXN0cm95KGVycilcblxuICAgIHdoaWxlICh0aGlzLl9wZW5kaW5nLmxlbmd0aCkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fcGVuZGluZy5zaGlmdCgpXG4gICAgICBzdHJlYW0uZGVzdHJveShlcnIpXG4gICAgICBzdHJlYW0uX2NvbnRpbnVlT3BlbigpXG4gICAgfVxuXG4gICAgdGhpcy5fZG9EcmFpbigpXG4gIH1cblxuICBfcmVhZCAoY2IpIHtcbiAgICB0aGlzLl9kb0RyYWluKClcbiAgICBjYigpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYWNrIChvcHRzKSB7XG4gIHJldHVybiBuZXcgUGFjayhvcHRzKVxufVxuXG5mdW5jdGlvbiBtb2RlVG9UeXBlIChtb2RlKSB7XG4gIHN3aXRjaCAobW9kZSAmIGNvbnN0YW50cy5TX0lGTVQpIHtcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGQkxLOiByZXR1cm4gJ2Jsb2NrLWRldmljZSdcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGQ0hSOiByZXR1cm4gJ2NoYXJhY3Rlci1kZXZpY2UnXG4gICAgY2FzZSBjb25zdGFudHMuU19JRkRJUjogcmV0dXJuICdkaXJlY3RvcnknXG4gICAgY2FzZSBjb25zdGFudHMuU19JRklGTzogcmV0dXJuICdmaWZvJ1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZMTks6IHJldHVybiAnc3ltbGluaydcbiAgfVxuXG4gIHJldHVybiAnZmlsZSdcbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBvdmVyZmxvdyAoc2VsZiwgc2l6ZSkge1xuICBzaXplICY9IDUxMVxuICBpZiAoc2l6ZSkgc2VsZi5wdXNoKEVORF9PRl9UQVIuc3ViYXJyYXkoMCwgNTEyIC0gc2l6ZSkpXG59XG5cbmZ1bmN0aW9uIG1hcFdyaXRhYmxlIChidWYpIHtcbiAgcmV0dXJuIGI0YS5pc0J1ZmZlcihidWYpID8gYnVmIDogYjRhLmZyb20oYnVmKVxufVxuIiwiY29uc3QgUGFzc1Rocm91Z2hEZWNvZGVyID0gcmVxdWlyZSgnLi9saWIvcGFzcy10aHJvdWdoLWRlY29kZXInKVxuY29uc3QgVVRGOERlY29kZXIgPSByZXF1aXJlKCcuL2xpYi91dGY4LWRlY29kZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFRleHREZWNvZGVyIHtcbiAgY29uc3RydWN0b3IgKGVuY29kaW5nID0gJ3V0ZjgnKSB7XG4gICAgdGhpcy5lbmNvZGluZyA9IG5vcm1hbGl6ZUVuY29kaW5nKGVuY29kaW5nKVxuXG4gICAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgdGhpcy5kZWNvZGVyID0gbmV3IFVURjhEZWNvZGVyKClcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBlbmNvZGluZzogJyArIHRoaXMuZW5jb2RpbmcpXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmRlY29kZXIgPSBuZXcgUGFzc1Rocm91Z2hEZWNvZGVyKHRoaXMuZW5jb2RpbmcpXG4gICAgfVxuICB9XG5cbiAgcHVzaCAoZGF0YSkge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHJldHVybiBkYXRhXG4gICAgcmV0dXJuIHRoaXMuZGVjb2Rlci5kZWNvZGUoZGF0YSlcbiAgfVxuXG4gIC8vIEZvciBOb2RlLmpzIGNvbXBhdGliaWxpdHlcbiAgd3JpdGUgKGRhdGEpIHtcbiAgICByZXR1cm4gdGhpcy5wdXNoKGRhdGEpXG4gIH1cblxuICBlbmQgKGRhdGEpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICBpZiAoZGF0YSkgcmVzdWx0ID0gdGhpcy5wdXNoKGRhdGEpXG4gICAgcmVzdWx0ICs9IHRoaXMuZGVjb2Rlci5mbHVzaCgpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVuY29kaW5nIChlbmNvZGluZykge1xuICBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKClcblxuICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgICAgcmV0dXJuICd1dGY4J1xuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gJ3V0ZjE2bGUnXG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgICAgcmV0dXJuICdsYXRpbjEnXG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnaGV4JzpcbiAgICAgIHJldHVybiBlbmNvZGluZ1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgfVxufTtcbiIsImNvbnN0IGI0YSA9IHJlcXVpcmUoJ2I0YScpXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgUGFzc1Rocm91Z2hEZWNvZGVyIHtcbiAgY29uc3RydWN0b3IgKGVuY29kaW5nKSB7XG4gICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nXG4gIH1cblxuICBkZWNvZGUgKHRhaWwpIHtcbiAgICByZXR1cm4gYjRhLnRvU3RyaW5nKHRhaWwsIHRoaXMuZW5jb2RpbmcpXG4gIH1cblxuICBmbHVzaCAoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbn1cbiIsImNvbnN0IGI0YSA9IHJlcXVpcmUoJ2I0YScpXG5cbi8qKlxuICogaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI3V0Zi04LWRlY29kZXJcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBVVEY4RGVjb2RlciB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLmNvZGVQb2ludCA9IDBcbiAgICB0aGlzLmJ5dGVzU2VlbiA9IDBcbiAgICB0aGlzLmJ5dGVzTmVlZGVkID0gMFxuICAgIHRoaXMubG93ZXJCb3VuZGFyeSA9IDB4ODBcbiAgICB0aGlzLnVwcGVyQm91bmRhcnkgPSAweGJmXG4gIH1cblxuICBkZWNvZGUgKGRhdGEpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgZmFzdCBwYXRoLCBqdXN0IHNuaWZmIGlmIHRoZSBsYXN0IHBhcnQgaXMgYSBib3VuZGFyeVxuICAgIGlmICh0aGlzLmJ5dGVzTmVlZGVkID09PSAwKSB7XG4gICAgICBsZXQgaXNCb3VuZGFyeSA9IHRydWVcblxuICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWF4KDAsIGRhdGEuYnl0ZUxlbmd0aCAtIDQpLCBuID0gZGF0YS5ieXRlTGVuZ3RoOyBpIDwgbiAmJiBpc0JvdW5kYXJ5OyBpKyspIHtcbiAgICAgICAgaXNCb3VuZGFyeSA9IGRhdGFbaV0gPD0gMHg3ZlxuICAgICAgfVxuXG4gICAgICBpZiAoaXNCb3VuZGFyeSkgcmV0dXJuIGI0YS50b1N0cmluZyhkYXRhLCAndXRmOCcpXG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9ICcnXG5cbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGRhdGEuYnl0ZUxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgY29uc3QgYnl0ZSA9IGRhdGFbaV1cblxuICAgICAgaWYgKHRoaXMuYnl0ZXNOZWVkZWQgPT09IDApIHtcbiAgICAgICAgaWYgKGJ5dGUgPD0gMHg3Zikge1xuICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpXG4gICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSAweGMyICYmIGJ5dGUgPD0gMHhkZikge1xuICAgICAgICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSAxXG4gICAgICAgICAgdGhpcy5jb2RlUG9pbnQgPSBieXRlICYgMHgxZlxuICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPj0gMHhlMCAmJiBieXRlIDw9IDB4ZWYpIHtcbiAgICAgICAgICBpZiAoYnl0ZSA9PT0gMHhlMCkgdGhpcy5sb3dlckJvdW5kYXJ5ID0gMHhhMFxuICAgICAgICAgIGVsc2UgaWYgKGJ5dGUgPT09IDB4ZWQpIHRoaXMudXBwZXJCb3VuZGFyeSA9IDB4OWZcbiAgICAgICAgICB0aGlzLmJ5dGVzTmVlZGVkID0gMlxuICAgICAgICAgIHRoaXMuY29kZVBvaW50ID0gYnl0ZSAmIDB4ZlxuICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPj0gMHhmMCAmJiBieXRlIDw9IDB4ZjQpIHtcbiAgICAgICAgICBpZiAoYnl0ZSA9PT0gMHhmMCkgdGhpcy5sb3dlckJvdW5kYXJ5ID0gMHg5MFxuICAgICAgICAgIGlmIChieXRlID09PSAweGY0KSB0aGlzLnVwcGVyQm91bmRhcnkgPSAweDhmXG4gICAgICAgICAgdGhpcy5ieXRlc05lZWRlZCA9IDNcbiAgICAgICAgICB0aGlzLmNvZGVQb2ludCA9IGJ5dGUgJiAweDdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgKz0gJ1xcdWZmZmQnXG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoYnl0ZSA8IHRoaXMubG93ZXJCb3VuZGFyeSB8fCBieXRlID4gdGhpcy51cHBlckJvdW5kYXJ5KSB7XG4gICAgICAgIHRoaXMuY29kZVBvaW50ID0gMFxuICAgICAgICB0aGlzLmJ5dGVzTmVlZGVkID0gMFxuICAgICAgICB0aGlzLmJ5dGVzU2VlbiA9IDBcbiAgICAgICAgdGhpcy5sb3dlckJvdW5kYXJ5ID0gMHg4MFxuICAgICAgICB0aGlzLnVwcGVyQm91bmRhcnkgPSAweGJmXG5cbiAgICAgICAgcmVzdWx0ICs9ICdcXHVmZmZkJ1xuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHRoaXMubG93ZXJCb3VuZGFyeSA9IDB4ODBcbiAgICAgIHRoaXMudXBwZXJCb3VuZGFyeSA9IDB4YmZcblxuICAgICAgdGhpcy5jb2RlUG9pbnQgPSAodGhpcy5jb2RlUG9pbnQgPDwgNikgfCAoYnl0ZSAmIDB4M2YpXG4gICAgICB0aGlzLmJ5dGVzU2VlbisrXG5cbiAgICAgIGlmICh0aGlzLmJ5dGVzU2VlbiAhPT0gdGhpcy5ieXRlc05lZWRlZCkgY29udGludWVcblxuICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KHRoaXMuY29kZVBvaW50KVxuXG4gICAgICB0aGlzLmNvZGVQb2ludCA9IDBcbiAgICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSAwXG4gICAgICB0aGlzLmJ5dGVzU2VlbiA9IDBcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBmbHVzaCAoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5ieXRlc05lZWRlZCA+IDAgPyAnXFx1ZmZmZCcgOiAnJ1xuXG4gICAgdGhpcy5jb2RlUG9pbnQgPSAwXG4gICAgdGhpcy5ieXRlc05lZWRlZCA9IDBcbiAgICB0aGlzLmJ5dGVzU2VlbiA9IDBcbiAgICB0aGlzLmxvd2VyQm91bmRhcnkgPSAweDgwXG4gICAgdGhpcy51cHBlckJvdW5kYXJ5ID0gMHhiZlxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG4iLCJ2YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcblxuLy8gdGhyb3VnaFxuLy9cbi8vIGEgc3RyZWFtIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCByZS1lbWl0IHRoZSBpbnB1dC5cbi8vIHVzZWZ1bCBmb3IgYWdncmVnYXRpbmcgYSBzZXJpZXMgb2YgY2hhbmdpbmcgYnV0IG5vdCBlbmRpbmcgc3RyZWFtcyBpbnRvIG9uZSBzdHJlYW0pXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHRocm91Z2hcbnRocm91Z2gudGhyb3VnaCA9IHRocm91Z2hcblxuLy9jcmVhdGUgYSByZWFkYWJsZSB3cml0YWJsZSBzdHJlYW0uXG5cbmZ1bmN0aW9uIHRocm91Z2ggKHdyaXRlLCBlbmQsIG9wdHMpIHtcbiAgd3JpdGUgPSB3cml0ZSB8fCBmdW5jdGlvbiAoZGF0YSkgeyB0aGlzLnF1ZXVlKGRhdGEpIH1cbiAgZW5kID0gZW5kIHx8IGZ1bmN0aW9uICgpIHsgdGhpcy5xdWV1ZShudWxsKSB9XG5cbiAgdmFyIGVuZGVkID0gZmFsc2UsIGRlc3Ryb3llZCA9IGZhbHNlLCBidWZmZXIgPSBbXSwgX2VuZGVkID0gZmFsc2VcbiAgdmFyIHN0cmVhbSA9IG5ldyBTdHJlYW0oKVxuICBzdHJlYW0ucmVhZGFibGUgPSBzdHJlYW0ud3JpdGFibGUgPSB0cnVlXG4gIHN0cmVhbS5wYXVzZWQgPSBmYWxzZVxuXG4vLyAgc3RyZWFtLmF1dG9QYXVzZSAgID0gIShvcHRzICYmIG9wdHMuYXV0b1BhdXNlICAgPT09IGZhbHNlKVxuICBzdHJlYW0uYXV0b0Rlc3Ryb3kgPSAhKG9wdHMgJiYgb3B0cy5hdXRvRGVzdHJveSA9PT0gZmFsc2UpXG5cbiAgc3RyZWFtLndyaXRlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB3cml0ZS5jYWxsKHRoaXMsIGRhdGEpXG4gICAgcmV0dXJuICFzdHJlYW0ucGF1c2VkXG4gIH1cblxuICBmdW5jdGlvbiBkcmFpbigpIHtcbiAgICB3aGlsZShidWZmZXIubGVuZ3RoICYmICFzdHJlYW0ucGF1c2VkKSB7XG4gICAgICB2YXIgZGF0YSA9IGJ1ZmZlci5zaGlmdCgpXG4gICAgICBpZihudWxsID09PSBkYXRhKVxuICAgICAgICByZXR1cm4gc3RyZWFtLmVtaXQoJ2VuZCcpXG4gICAgICBlbHNlXG4gICAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgZGF0YSlcbiAgICB9XG4gIH1cblxuICBzdHJlYW0ucXVldWUgPSBzdHJlYW0ucHVzaCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4vLyAgICBjb25zb2xlLmVycm9yKGVuZGVkKVxuICAgIGlmKF9lbmRlZCkgcmV0dXJuIHN0cmVhbVxuICAgIGlmKGRhdGEgPT09IG51bGwpIF9lbmRlZCA9IHRydWVcbiAgICBidWZmZXIucHVzaChkYXRhKVxuICAgIGRyYWluKClcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cblxuICAvL3RoaXMgd2lsbCBiZSByZWdpc3RlcmVkIGFzIHRoZSBmaXJzdCAnZW5kJyBsaXN0ZW5lclxuICAvL211c3QgY2FsbCBkZXN0cm95IG5leHQgdGljaywgdG8gbWFrZSBzdXJlIHdlJ3JlIGFmdGVyIGFueVxuICAvL3N0cmVhbSBwaXBlZCBmcm9tIGhlcmUuXG4gIC8vdGhpcyBpcyBvbmx5IGEgcHJvYmxlbSBpZiBlbmQgaXMgbm90IGVtaXR0ZWQgc3luY2hyb25vdXNseS5cbiAgLy9hIG5pY2VyIHdheSB0byBkbyB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGlzIGlzIHRoZSBsYXN0IGxpc3RlbmVyIGZvciAnZW5kJ1xuXG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlXG4gICAgaWYoIXN0cmVhbS53cml0YWJsZSAmJiBzdHJlYW0uYXV0b0Rlc3Ryb3kpXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICAgICAgfSlcbiAgfSlcblxuICBmdW5jdGlvbiBfZW5kICgpIHtcbiAgICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZVxuICAgIGVuZC5jYWxsKHN0cmVhbSlcbiAgICBpZighc3RyZWFtLnJlYWRhYmxlICYmIHN0cmVhbS5hdXRvRGVzdHJveSlcbiAgICAgIHN0cmVhbS5kZXN0cm95KClcbiAgfVxuXG4gIHN0cmVhbS5lbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmKGVuZGVkKSByZXR1cm5cbiAgICBlbmRlZCA9IHRydWVcbiAgICBpZihhcmd1bWVudHMubGVuZ3RoKSBzdHJlYW0ud3JpdGUoZGF0YSlcbiAgICBfZW5kKCkgLy8gd2lsbCBlbWl0IG9yIHF1ZXVlXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG5cbiAgc3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoZGVzdHJveWVkKSByZXR1cm5cbiAgICBkZXN0cm95ZWQgPSB0cnVlXG4gICAgZW5kZWQgPSB0cnVlXG4gICAgYnVmZmVyLmxlbmd0aCA9IDBcbiAgICBzdHJlYW0ud3JpdGFibGUgPSBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZVxuICAgIHN0cmVhbS5lbWl0KCdjbG9zZScpXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG5cbiAgc3RyZWFtLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKHN0cmVhbS5wYXVzZWQpIHJldHVyblxuICAgIHN0cmVhbS5wYXVzZWQgPSB0cnVlXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG5cbiAgc3RyZWFtLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZihzdHJlYW0ucGF1c2VkKSB7XG4gICAgICBzdHJlYW0ucGF1c2VkID0gZmFsc2VcbiAgICAgIHN0cmVhbS5lbWl0KCdyZXN1bWUnKVxuICAgIH1cbiAgICBkcmFpbigpXG4gICAgLy9tYXkgaGF2ZSBiZWNvbWUgcGF1c2VkIGFnYWluLFxuICAgIC8vYXMgZHJhaW4gZW1pdHMgJ2RhdGEnLlxuICAgIGlmKCFzdHJlYW0ucGF1c2VkKVxuICAgICAgc3RyZWFtLmVtaXQoJ2RyYWluJylcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cbiAgcmV0dXJuIHN0cmVhbVxufVxuXG4iLCJpbXBvcnQgeyB0eXBlIFByb2R1Y3QsIHR5cGUgUHJvdG9jb2xUeXBlIH0gZnJvbSBcInB1cHBldGVlci1jb3JlXCI7XG5cbmltcG9ydCB7IHByb2dyYW0sIE9wdGlvbiB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCAqIGFzIGNvbW1hbmRlciBmcm9tIFwiY29tbWFuZGVyXCI7XG5cbi8vIGhlbHBlciBmdW5jdGlvbiBmb3IgY29udmVydGluZyBTdHJpbmcgdG8gQm9vbGVhblxuZnVuY3Rpb24gYm9vbGVhbkVudihuYW1lOiBzdHJpbmcsIGRlZmF1bHRfdmFsdWU6IGJvb2xlYW4pIHtcbiAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnZbbmFtZV07XG4gIGlmIChlbnYgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlO1xuICB9XG4gIHN3aXRjaCAoZW52LnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlIFwiMFwiOlxuICAgIGNhc2UgXCJmYWxzZVwiOlxuICAgIGNhc2UgXCJvZmZcIjpcbiAgICBjYXNlIFwiZGlzYWJsZWRcIjpcbiAgICBjYXNlIFwibm9cIjpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjYXNlIFwiMVwiOlxuICAgIGNhc2UgXCJ0cnVlXCI6XG4gICAgY2FzZSBcIm9uXCI6XG4gICAgY2FzZSBcImVuYWJsZWRcIjpcbiAgICBjYXNlIFwieWVzXCI6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7XG4gIH1cbn1cblxuaW50ZXJmYWNlIEJyb3dzZXJTZXR0aW5ncyB7XG4gIHByb2R1Y3Q6IFByb2R1Y3Q7XG4gIGV4ZWN1dGFibGVQYXRoOiBzdHJpbmc7XG59XG5cbi8vIGhlbHBlciBmdW5jdGlvbiBmb3IgY29uZmlndXJpbmcgdGhlIGJyb3dzZXJcbmZ1bmN0aW9uIGJyb3dzZXJTZXR0aW5ncyhuYW1lOiBzdHJpbmcpOiBCcm93c2VyU2V0dGluZ3Mge1xuICBzd2l0Y2ggKG5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgXCJmaXJlZm94XCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9kdWN0OiBcImZpcmVmb3hcIixcbiAgICAgICAgZXhlY3V0YWJsZVBhdGg6IFwiL3Vzci9iaW4vZmlyZWZveFwiLFxuICAgICAgfTtcbiAgICBjYXNlIFwiY2hyb21lXCI6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9kdWN0OiBcImNocm9tZVwiLFxuICAgICAgICBleGVjdXRhYmxlUGF0aDogXCIvdXNyL2Jpbi9nb29nbGUtY2hyb21lLXN0YWJsZVwiLFxuICAgICAgfTtcbiAgICBjYXNlIFwiY2hyb21pdW1cIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb2R1Y3Q6IFwiY2hyb21lXCIsXG4gICAgICAgIGV4ZWN1dGFibGVQYXRoOiBcIi91c3IvYmluL2Nocm9taXVtXCIsXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGJyb3dzZXIgdHlwZTogJHtuYW1lfWApO1xuICB9XG59XG5cbi8vIHBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBhcyBhbiBpbnRlZ2VyXG5mdW5jdGlvbiBnZXRJbnQodmFsdWU6IHN0cmluZykge1xuICAvLyBwYXJzZSB0aGUgdmFsdWUgYXMgYSBkZWNpbWFsIG51bWJlciAoYmFzZSAxMClcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgaWYgKGlzTmFOKHBhcnNlZCkpIHtcbiAgICB0aHJvdyBuZXcgY29tbWFuZGVyLkludmFsaWRBcmd1bWVudEVycm9yKFwiRW50ZXIgYSB2YWxpZCBudW1iZXIuXCIpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLy8gZGVmaW5lIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBwYXJzZSB0aGVtXG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RqL2NvbW1hbmRlci5qc1xucHJvZ3JhbVxuICAuZGVzY3JpcHRpb24oXCJSdW4gYSBzaW1wbGUgQWdhbWEgaW50ZWdyYXRpb24gdGVzdFwiKVxuICAub3B0aW9uKFwiLXUsIC0tdXJsIDx1cmw+XCIsIFwiQWdhbWEgc2VydmVyIFVSTFwiLCBcImh0dHA6Ly9sb2NhbGhvc3RcIilcbiAgLm9wdGlvbihcIi1wLCAtLXBhc3N3b3JkIDxwYXNzd29yZD5cIiwgXCJBZ2FtYSBsb2dpbiBwYXNzd29yZFwiLCBcIm5vdHMzY3IzdFwiKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oXCItYiwgLS1icm93c2VyIDxicm93c2VyPlwiLCBcIkJyb3dzZXIgdXNlZCBmb3IgcnVubmluZyB0aGUgdGVzdFwiKVxuICAgIC5jaG9pY2VzKFtcImZpcmVmb3hcIiwgXCJjaHJvbWVcIiwgXCJjaHJvbWl1bVwiXSlcbiAgICAuZGVmYXVsdChcImZpcmVmb3hcIilcbiAgKVxuICAub3B0aW9uKFwiLWgsIC0taGVhZGVkXCIsIFwiUnVuIHRoZSBicm93c2VyIGluIGhlYWRlZCBtb2RlIHdpdGggVUkgKHRoZSBkZWZhdWx0IGlzIGhlYWRsZXNzIG1vZGUpXCIpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbihcIi1kLCAtLWRlbGF5IDxtaWxpc2Vjb25kcz5cIiwgXCJEZWxheSBiZXR3ZWVuIHRoZSBicm93c2VyIGFjdGlvbnMsIHVzZWZ1bCBpbiBoZWFkZWQgbW9kZVwiKVxuICAgIC5hcmdQYXJzZXIoZ2V0SW50KVxuICAgIC5kZWZhdWx0KDApXG4gIClcbiAgLm9wdGlvbihcIi1jLCAtLWNvbnRpbnVlXCIsIFwiQ29udGludWUgdGhlIHRlc3QgYWZ0ZXIgYSBmYWlsdXJlICh0aGUgZGVmYXVsdCBpcyBhYm9ydCBvbiBlcnJvcilcIilcbiAgLnBhcnNlKHByb2Nlc3MuYXJndik7XG5cbi8vIHBhcnNlIG9wdGlvbnMgZnJvbSB0aGUgY29tbWFuZCBsaW5lXG5jb25zdCBvcHRpb25zID0gcHJvZ3JhbS5vcHRzKCk7XG5cbmNvbnN0IHB1cHBldGVlckxhdW5jaE9wdGlvbnMgPSB7XG4gIC8vIFwid2ViRHJpdmVyQmlEaVwiIGRvZXMgbm90IHdvcmsgd2l0aCBvbGQgRmlyZUZveCwgY29tbWVudCBpdCBvdXQgaWYgbmVlZGVkXG4gIHByb3RvY29sOiBcIndlYkRyaXZlckJpRGlcIiBhcyBQcm90b2NvbFR5cGUsXG4gIGhlYWRsZXNzOiAhb3B0aW9ucy5oZWFkZWQsXG4gIGlnbm9yZUhUVFBTRXJyb3JzOiB0cnVlLFxuICB0aW1lb3V0OiAzMDAwMCxcbiAgc2xvd01vOiBvcHRpb25zLmRlbGF5LFxuICBkZWZhdWx0Vmlld3BvcnQ6IHtcbiAgICB3aWR0aDogMTI4MCxcbiAgICBoZWlnaHQ6IDc2OFxuICB9LFxuICAuLi5icm93c2VyU2V0dGluZ3Mob3B0aW9ucy5icm93c2VyKVxufVxuXG5leHBvcnQgeyBib29sZWFuRW52LCBvcHRpb25zLCBwdXBwZXRlZXJMYXVuY2hPcHRpb25zIH07XG4iLCJpbXBvcnQgcHVwcGV0ZWVyLCB7IHR5cGUgUGFnZSB9IGZyb20gXCJwdXBwZXRlZXItY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgTG9naW5Bc1Jvb3RQYWdlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXNzd29yZElucHV0ID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJpbnB1dCNwYXNzd29yZFwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ0luQnV0dG9uID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJidXR0b25bdHlwZT0nc3VibWl0J11cIik7XG5cbiAgICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxuXG4gICAgYXN5bmMgbG9nSW4ocGFzc3dvcmQ6IHN0cmluZykge1xuICAgICAgICBhd2FpdCB0aGlzLnBhc3N3b3JkSW5wdXQoKS5maWxsKHBhc3N3b3JkKTtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dJbkJ1dHRvbigpLmNsaWNrKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBQYWdlIH0gZnJvbSBcInB1cHBldGVlci1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBTaWRlYmFyUGFnZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWdlOiBQYWdlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3ZlcnZpZXdMaW5rID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJhW2hyZWY9JyMvb3ZlcnZpZXcnXVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsaXphdGlvbkxpbmsgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImFbaHJlZj0nIy9sMTBuJ11cIik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBuZXR3b3JrTGluayA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYVtocmVmPScjL25ldHdvcmsnXVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VMaW5rID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJhW2hyZWY9JyMvc3RvcmFnZSddXCIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc29mdHdhcmVMaW5rID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJhW2hyZWY9JyMvc29mdHdhcmUnXVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVzZXJzTGluayA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYVtocmVmPScjL3VzZXJzJ11cIik7XG4gICAgXG4gICAgY29uc3RydWN0b3IocGFnZTogUGFnZSkge1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIH1cblxuICAgIGFzeW5jIGdvVG9PdmVydmlldygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5vdmVydmlld0xpbmsoKS5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIGdvVG9Mb2NhbGl6YXRpb24oKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9jYWxpemF0aW9uTGluaygpLmNsaWNrKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ29Ub05ldHdvcmsoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubmV0d29ya0xpbmsoKS5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIGdvVG9TdG9yYWdlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2VMaW5rKCkuY2xpY2soKTtcbiAgICB9XG5cbiAgICBhc3luYyBnb1RvU29mdHdhcmUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc29mdHdhcmVMaW5rKCkuY2xpY2soKTtcbiAgICB9XG5cbiAgICBhc3luYyBnb1RvVXNlcnMoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudXNlcnNMaW5rKCkuY2xpY2soKTtcbiAgICB9XG5cbn1cbiIsImltcG9ydCB7IHR5cGUgUGFnZSB9IGZyb20gXCJwdXBwZXRlZXItY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUVuY3J5cHRpb25QYWdlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbmNyeXB0VGhlU3lzdGVtQ2hlY2tib3ggPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImxhYmVsW2NsYXNzPSdwZi12NS1jLXN3aXRjaCddID4gaW5wdXRbdHlwZT0nY2hlY2tib3gnXVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhc3N3b3JkSW5wdXQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcIiNwYXNzd29yZFwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhc3N3b3JkQ29uZmlybWF0aW9uSW5wdXQgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcIiNwYXNzd29yZENvbmZpcm1hdGlvblwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjY2VwdEJ1dHRvbiA9ICgpID0+IHRoaXMucGFnZS5sb2NhdG9yKFwiYnV0dG9uOjotcC10ZXh0KEFjY2VwdClcIik7XG5cbiAgICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxuXG4gICAgYXN5bmMgZW5jcnlwdChwYXNzd29yZDogc3RyaW5nKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdFRoZVN5c3RlbUNoZWNrYm94KCkuY2xpY2soKTtcbiAgICAgICAgYXdhaXQgdGhpcy5wYXNzd29yZElucHV0KCkuZmlsbChwYXNzd29yZCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGFzc3dvcmRDb25maXJtYXRpb25JbnB1dCgpLmZpbGwocGFzc3dvcmQpO1xuICAgICAgICBhd2FpdCB0aGlzLmFjY2VwdEJ1dHRvbigpLmNsaWNrKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBQYWdlIH0gZnJvbSBcInB1cHBldGVlci1jb3JlXCI7XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlUGFnZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYWdlOiBQYWdlO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZW5hYmxlQnV0dG9uID0gKCkgPT4gdGhpcy5wYWdlLmxvY2F0b3IoXCJidXR0b246Oi1wLXRleHQoRW5hYmxlKVwiKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZWREaXYgPSAoKSA9PiB0aGlzLnBhZ2UubG9jYXRvcihcImRpdjo6LXAtdGV4dChlbmFibGVkKVwiKTtcbiAgICBcbiAgICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxuXG4gICAgYXN5bmMgZW5hYmxlRW5jcnlwdGlvbigpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbmFibGVCdXR0b24oKS5jbGljaygpO1xuICAgIH1cblxuICAgIGFzeW5jIHZlcmlmeUVuY3J5cHRpb25FbmFibGVkKCkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuYWJsZWREaXYoKS53YWl0KCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHB1cHBldGVlciwgeyB0eXBlIEJyb3dzZXIsIHR5cGUgUGFnZSB9IGZyb20gXCJwdXBwZXRlZXItY29yZVwiO1xuXG5pbXBvcnQgeyBpdCBhcyB0ZXN0SXQsIGRlc2NyaWJlLCBiZWZvcmUsIGFmdGVyIH0gZnJvbSBcIm5vZGU6dGVzdFwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwibm9kZTphc3NlcnQvc3RyaWN0XCI7XG5cbmltcG9ydCB7IGJvb2xlYW5FbnYsIG9wdGlvbnMsIHB1cHBldGVlckxhdW5jaE9wdGlvbnMgfSBmcm9tIFwiLi4vY29uZmlndXJhdGlvblwiO1xuXG5pbXBvcnQgeyBMb2dpbkFzUm9vdFBhZ2UgfSBmcm9tIFwiLi4vcGFnZXMvbG9naW4tYXMtcm9vdC1wYWdlXCI7XG5pbXBvcnQgeyBTdG9yYWdlUGFnZSB9IGZyb20gXCIuLi9wYWdlcy9zdG9yYWdlLXBhZ2VcIjtcbmltcG9ydCB7IFN0b3JhZ2VFbmNyeXB0aW9uUGFnZSB9IGZyb20gXCIuLi9wYWdlcy9zdG9yYWdlLWVuY3J5cHRpb24tcGFnZVwiO1xuaW1wb3J0IHsgU2lkZWJhclBhZ2UgfSBmcm9tIFwiLi4vcGFnZXMvc2lkZWJhci1wYWdlXCI7XG5cbmxldCBwYWdlOiBQYWdlO1xubGV0IGJyb3dzZXI6IEJyb3dzZXI7XG5sZXQgZmFpbGVkID0gZmFsc2U7XG5cbi8vIGRlZmluZSBpdCgpIGFzIGEgd3JhcHBlciB3aGljaCBkdW1wcyB0aGUgcGFnZSBvbiBhIGZhaWx1cmVcbmFzeW5jIGZ1bmN0aW9uIGl0KGxhYmVsOiBzdHJpbmcsIHRlc3Q6ICgpID0+IFByb21pc2U8dm9pZD4sIHRpbWVvdXQ/OiBudW1iZXIpIHtcbiAgdGVzdEl0KGxhYmVsLFxuICAgIC8vIGFib3J0IHdoZW4gdGhlIHRlc3QgdGFrZXMgbW9yZSB0aGFuIG9uZSBtaW51dGVcbiAgICB7IHRpbWVvdXQ6IHRpbWVvdXQgfHwgNjAwMDAgfSxcbiAgICBhc3luYyAodCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGZhaWxlZClcbiAgICAgICAgICB0LnNraXAoKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgYXdhaXQgdGVzdCgpO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5jb250aW51ZSkgZmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHBhZ2UpIHtcbiAgICAgICAgICAvLyBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGhlIGRhdGFcbiAgICAgICAgICBjb25zdCBkaXIgPSBcImxvZ1wiO1xuICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSBmcy5ta2RpclN5bmMoZGlyKTtcblxuICAgICAgICAgIC8vIGJhc2UgZmlsZSBuYW1lIGZvciB0aGUgZHVtcHNcbiAgICAgICAgICBjb25zdCBuYW1lID0gcGF0aC5qb2luKGRpciwgbGFiZWwucmVwbGFjZSgvW15hLXpBLVowLTldL2csIFwiX1wiKSk7XG4gICAgICAgICAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHsgcGF0aDogbmFtZSArIFwiLnBuZ1wiIH0pO1xuICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCBwYWdlLmNvbnRlbnQoKTtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG5hbWUgKyBcIi5odG1sXCIsIGh0bWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGVzdCBmYWlsZWQhXCIsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH0pO1xufTtcblxuY29uc3QgYWdhbWFJbnN0YWxsID0gYm9vbGVhbkVudihcIkFHQU1BX0lOU1RBTExcIiwgdHJ1ZSk7XG5cbmRlc2NyaWJlKFwiZnVsbCBkaXNrIGVuY3J5cHRpb25cIiwgZnVuY3Rpb24gKCkge1xuICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKHB1cHBldGVlckxhdW5jaE9wdGlvbnMpO1xuICAgIHBhZ2UgPSBhd2FpdCBicm93c2VyLm5ld1BhZ2UoKTtcbiAgICBwYWdlLnNldERlZmF1bHRUaW1lb3V0KDIwMDAwKTtcbiAgICBhd2FpdCBwYWdlLmdvdG8ob3B0aW9ucy51cmwsIHsgdGltZW91dDogNjAwMDAsIHdhaXRVbnRpbDogXCJkb21jb250ZW50bG9hZGVkXCIgfSk7XG4gIH0pO1xuXG4gIGFmdGVyKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBwYWdlLmNsb3NlKCk7XG4gICAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICB9KVxuXG4gIGl0KFwic2hvdWxkIGhhdmUgQWdhbWEgcGFnZSB0aXRsZVwiLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChhd2FpdCBwYWdlLnRpdGxlKCksIFwiQWdhbWFcIik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGFsbG93cyBsb2dnaW5nIGluXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBsb2dpbkFzUm9vdCA9IG5ldyBMb2dpbkFzUm9vdFBhZ2UocGFnZSk7XG4gICAgYXdhaXQgbG9naW5Bc1Jvb3QubG9nSW4ob3B0aW9ucy5wYXNzd29yZCk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGVuYWJsZSBlbmNyeXB0aW9uXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzdG9yYWdlID0gbmV3IFN0b3JhZ2VQYWdlKHBhZ2UpO1xuICAgIGNvbnN0IHN0b3JhZ2VFbmNyeXB0aW9uID0gbmV3IFN0b3JhZ2VFbmNyeXB0aW9uUGFnZShwYWdlKTtcbiAgICBjb25zdCBzaWRlYmFyID0gbmV3IFNpZGViYXJQYWdlKHBhZ2UpO1xuXG4gICAgYXdhaXQgc2lkZWJhci5nb1RvU3RvcmFnZSgpO1xuICAgIGF3YWl0IHN0b3JhZ2UuZW5hYmxlRW5jcnlwdGlvbigpO1xuICAgIGF3YWl0IHN0b3JhZ2VFbmNyeXB0aW9uLmVuY3J5cHQob3B0aW9ucy5wYXNzd29yZCk7XG4gICAgYXdhaXQgc3RvcmFnZS52ZXJpZnlFbmNyeXB0aW9uRW5hYmxlZCgpO1xuICB9KTtcblxuICBpdChcInNob3VsZCBiZSByZWFkeSBmb3IgaW5zdGFsbGF0aW9uXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzaWRlYmFyID0gbmV3IFNpZGViYXJQYWdlKHBhZ2UpO1xuICAgIGF3YWl0IHNpZGViYXIuZ29Ub092ZXJ2aWV3KCk7XG4gICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiYnV0dG9uOjotcC10ZXh0KEluc3RhbGwpXCIpLndhaXQoKTtcbiAgfSk7XG5cbiAgaWYgKGFnYW1hSW5zdGFsbCA9PT0gdHJ1ZSkge1xuICAgIGl0KFwic2hvdWxkIHN0YXJ0IGluc3RhbGxhdGlvblwiLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCJidXR0b246Oi1wLXRleHQoJ0luc3RhbGwnKVwiKS5jbGljaygpO1xuICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKFwiYnV0dG9uOjotcC10ZXh0KCdDb250aW51ZScpXCIpLmNsaWNrKCk7XG4gICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoXCI6Oi1wLXRleHQoSW5zdGFsbGluZyB0aGUpXCIpLndhaXQoKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGZpbmlzaCBpbnN0YWxsYXRpb25cIiwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgcGFnZVxuICAgICAgICAubG9jYXRvcihcImgyOjotcC10ZXh0KCdDb25ncmF0dWxhdGlvbnMhJylcIilcbiAgICAgICAgLnNldFRpbWVvdXQoMTUgKiA2MCAqIDEwMDApXG4gICAgICAgIC53YWl0KCk7XG4gICAgfSwgMTUgKiA2MCAqIDEwMDApO1xuICB9XG59KTtcbiIsInZhciB0aHJvdWdoID0gcmVxdWlyZSgndGhyb3VnaCcpO1xudmFyIGJ6MiA9IHJlcXVpcmUoJy4vbGliL2J6aXAyJyk7XG52YXIgYml0SXRlcmF0b3IgPSByZXF1aXJlKCcuL2xpYi9iaXRfaXRlcmF0b3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSB1bmJ6aXAyU3RyZWFtO1xuXG5mdW5jdGlvbiB1bmJ6aXAyU3RyZWFtKCkge1xuICAgIHZhciBidWZmZXJRdWV1ZSA9IFtdO1xuICAgIHZhciBoYXNCeXRlcyA9IDA7XG4gICAgdmFyIGJsb2NrU2l6ZSA9IDA7XG4gICAgdmFyIGJyb2tlbiA9IGZhbHNlO1xuICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgdmFyIGJpdFJlYWRlciA9IG51bGw7XG4gICAgdmFyIHN0cmVhbUNSQyA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBkZWNvbXByZXNzQmxvY2socHVzaCl7XG4gICAgICAgIGlmKCFibG9ja1NpemUpe1xuICAgICAgICAgICAgYmxvY2tTaXplID0gYnoyLmhlYWRlcihiaXRSZWFkZXIpO1xuICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKFwiZ290IGhlYWRlciBvZlwiLCBibG9ja1NpemUpO1xuICAgICAgICAgICAgc3RyZWFtQ1JDID0gMDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHZhciBidWZzaXplID0gMTAwMDAwICogYmxvY2tTaXplO1xuICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBJbnQzMkFycmF5KGJ1ZnNpemUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgY2h1bmsgPSBbXTtcbiAgICAgICAgICAgIHZhciBmID0gZnVuY3Rpb24oYikge1xuICAgICAgICAgICAgICAgIGNodW5rLnB1c2goYik7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzdHJlYW1DUkMgPSBiejIuZGVjb21wcmVzcyhiaXRSZWFkZXIsIGYsIGJ1ZiwgYnVmc2l6ZSwgc3RyZWFtQ1JDKTtcbiAgICAgICAgICAgIGlmIChzdHJlYW1DUkMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyByZXNldCBmb3IgbmV4dCBiemlwMiBoZWFkZXJcbiAgICAgICAgICAgICAgICBibG9ja1NpemUgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcignZGVjb21wcmVzc2VkJywgY2h1bmsubGVuZ3RoLCdieXRlcycpO1xuICAgICAgICAgICAgICAgIHB1c2goQnVmZmVyLmZyb20oY2h1bmspKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBvdXRsZW5ndGggPSAwO1xuICAgIGZ1bmN0aW9uIGRlY29tcHJlc3NBbmRRdWV1ZShzdHJlYW0pIHtcbiAgICAgICAgaWYgKGJyb2tlbikgcmV0dXJuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGRlY29tcHJlc3NCbG9jayhmdW5jdGlvbihkKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnF1ZXVlKGQpO1xuICAgICAgICAgICAgICAgIGlmIChkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcignd3JpdGUgYXQnLCBvdXRsZW5ndGgudG9TdHJpbmcoMTYpKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGVuZ3RoICs9IGQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcignd3JpdHRlbiBFT1MnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlKTtcbiAgICAgICAgICAgIGJyb2tlbiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhyb3VnaChcbiAgICAgICAgZnVuY3Rpb24gd3JpdGUoZGF0YSkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmVycm9yKCdyZWNlaXZlZCcsIGRhdGEubGVuZ3RoLCdieXRlcyBpbicsIHR5cGVvZiBkYXRhKTtcbiAgICAgICAgICAgIGJ1ZmZlclF1ZXVlLnB1c2goZGF0YSk7XG4gICAgICAgICAgICBoYXNCeXRlcyArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChiaXRSZWFkZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBiaXRSZWFkZXIgPSBiaXRJdGVyYXRvcihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZSAoIWJyb2tlbiAmJiBoYXNCeXRlcyAtIGJpdFJlYWRlci5ieXRlc1JlYWQgKyAxID49ICgoMjUwMDAgKyAxMDAwMDAgKiBibG9ja1NpemUpIHx8IDQpKXtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoJ2RlY29tcHJlc3Npbmcgd2l0aCcsIGhhc0J5dGVzIC0gYml0UmVhZGVyLmJ5dGVzUmVhZCArIDEsICdieXRlcyBpbiBidWZmZXInKTtcbiAgICAgICAgICAgICAgICBkZWNvbXByZXNzQW5kUXVldWUodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uIGVuZCh4KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoeCwnbGFzdCBjb21wcmVzc2luZyB3aXRoJywgaGFzQnl0ZXMsICdieXRlcyBpbiBidWZmZXInKTtcbiAgICAgICAgICAgIHdoaWxlICghYnJva2VuICYmIGJpdFJlYWRlciAmJiBoYXNCeXRlcyA+IGJpdFJlYWRlci5ieXRlc1JlYWQpe1xuICAgICAgICAgICAgICAgIGRlY29tcHJlc3NBbmRRdWV1ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYnJva2VuKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0cmVhbUNSQyAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihcImlucHV0IHN0cmVhbSBlbmRlZCBwcmVtYXR1cmVseVwiKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG59XG5cbiIsInZhciBCSVRNQVNLID0gWzAsIDB4MDEsIDB4MDMsIDB4MDcsIDB4MEYsIDB4MUYsIDB4M0YsIDB4N0YsIDB4RkZdO1xuXG4vLyByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZWFkcyBiaXRzLlxuLy8gdGFrZXMgYSBidWZmZXIgaXRlcmF0b3IgYXMgaW5wdXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYml0SXRlcmF0b3IobmV4dEJ1ZmZlcikge1xuICAgIHZhciBiaXQgPSAwLCBieXRlID0gMDtcbiAgICB2YXIgYnl0ZXMgPSBuZXh0QnVmZmVyKCk7XG4gICAgdmFyIGYgPSBmdW5jdGlvbihuKSB7XG4gICAgICAgIGlmIChuID09PSBudWxsICYmIGJpdCAhPSAwKSB7ICAvLyBhbGlnbiB0byBieXRlIGJvdW5kYXJ5XG4gICAgICAgICAgICBiaXQgPSAwXG4gICAgICAgICAgICBieXRlKys7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICAgIHdoaWxlKG4gPiAwKSB7XG4gICAgICAgICAgICBpZiAoYnl0ZSA+PSBieXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBieXRlID0gMDtcbiAgICAgICAgICAgICAgICBieXRlcyA9IG5leHRCdWZmZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBsZWZ0ID0gOCAtIGJpdDtcbiAgICAgICAgICAgIGlmIChiaXQgPT09IDAgJiYgbiA+IDApXG4gICAgICAgICAgICAgICAgZi5ieXRlc1JlYWQrKztcbiAgICAgICAgICAgIGlmIChuID49IGxlZnQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPDw9IGxlZnQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0IHw9IChCSVRNQVNLW2xlZnRdICYgYnl0ZXNbYnl0ZSsrXSk7XG4gICAgICAgICAgICAgICAgYml0ID0gMDtcbiAgICAgICAgICAgICAgICBuIC09IGxlZnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA8PD0gbjtcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gKChieXRlc1tieXRlXSAmIChCSVRNQVNLW25dIDw8ICg4IC0gbiAtIGJpdCkpKSA+PiAoOCAtIG4gLSBiaXQpKTtcbiAgICAgICAgICAgICAgICBiaXQgKz0gbjtcbiAgICAgICAgICAgICAgICBuID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgZi5ieXRlc1JlYWQgPSAwO1xuICAgIHJldHVybiBmO1xufTtcbiIsIi8qIFxuICBiemlwMi5qcyAtIGEgc21hbGwgYnppcDIgZGVjb21wcmVzc2lvbiBpbXBsZW1lbnRhdGlvblxuICBcbiAgQ29weXJpZ2h0IDIwMTEgYnkgYW50aW1hdHRlcjE1IChhbnRpbWF0dGVyMTVAZ21haWwuY29tKVxuICBcbiAgQmFzZWQgb24gbWljcm8tYnVuemlwIGJ5IFJvYiBMYW5kbGV5IChyb2JAbGFuZGxleS5uZXQpLlxuXG4gIENvcHlyaWdodCAoYykgMjAxMSBieSBhbnRpbWF0dGVyMTUgKGFudGltYXR0ZXIxNUBnbWFpbC5jb20pLlxuXG4gIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4gIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSxcbiAgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvblxuICB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSxcbiAgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlXG4gIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gIFxuICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgXG4gIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuICBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsXG4gIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEhcbiAgVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuKi9cbmZ1bmN0aW9uIEJ6aXAyRXJyb3IobWVzc2FnZSkge1xuICAgIHRoaXMubmFtZSA9ICdCemlwMkVycm9yJztcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc3RhY2sgPSAobmV3IEVycm9yKCkpLnN0YWNrO1xufVxuQnppcDJFcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3I7XG4gXG52YXIgbWVzc2FnZSA9IHtcbiAgICBFcnJvcjogZnVuY3Rpb24obWVzc2FnZSkge3Rocm93IG5ldyBCemlwMkVycm9yKG1lc3NhZ2UpO31cbn07XG5cbnZhciBiemlwMiA9IHt9O1xuYnppcDIuQnppcDJFcnJvciA9IEJ6aXAyRXJyb3I7XG5cbmJ6aXAyLmNyY1RhYmxlID1cbltcbiAgIDB4MDAwMDAwMDAsIDB4MDRjMTFkYjcsIDB4MDk4MjNiNmUsIDB4MGQ0MzI2ZDksXG4gICAweDEzMDQ3NmRjLCAweDE3YzU2YjZiLCAweDFhODY0ZGIyLCAweDFlNDc1MDA1LFxuICAgMHgyNjA4ZWRiOCwgMHgyMmM5ZjAwZiwgMHgyZjhhZDZkNiwgMHgyYjRiY2I2MSxcbiAgIDB4MzUwYzliNjQsIDB4MzFjZDg2ZDMsIDB4M2M4ZWEwMGEsIDB4Mzg0ZmJkYmQsXG4gICAweDRjMTFkYjcwLCAweDQ4ZDBjNmM3LCAweDQ1OTNlMDFlLCAweDQxNTJmZGE5LFxuICAgMHg1ZjE1YWRhYywgMHg1YmQ0YjAxYiwgMHg1Njk3OTZjMiwgMHg1MjU2OGI3NSxcbiAgIDB4NmExOTM2YzgsIDB4NmVkODJiN2YsIDB4NjM5YjBkYTYsIDB4Njc1YTEwMTEsXG4gICAweDc5MWQ0MDE0LCAweDdkZGM1ZGEzLCAweDcwOWY3YjdhLCAweDc0NWU2NmNkLFxuICAgMHg5ODIzYjZlMCwgMHg5Y2UyYWI1NywgMHg5MWExOGQ4ZSwgMHg5NTYwOTAzOSxcbiAgIDB4OGIyN2MwM2MsIDB4OGZlNmRkOGIsIDB4ODJhNWZiNTIsIDB4ODY2NGU2ZTUsXG4gICAweGJlMmI1YjU4LCAweGJhZWE0NmVmLCAweGI3YTk2MDM2LCAweGIzNjg3ZDgxLFxuICAgMHhhZDJmMmQ4NCwgMHhhOWVlMzAzMywgMHhhNGFkMTZlYSwgMHhhMDZjMGI1ZCxcbiAgIDB4ZDQzMjZkOTAsIDB4ZDBmMzcwMjcsIDB4ZGRiMDU2ZmUsIDB4ZDk3MTRiNDksXG4gICAweGM3MzYxYjRjLCAweGMzZjcwNmZiLCAweGNlYjQyMDIyLCAweGNhNzUzZDk1LFxuICAgMHhmMjNhODAyOCwgMHhmNmZiOWQ5ZiwgMHhmYmI4YmI0NiwgMHhmZjc5YTZmMSxcbiAgIDB4ZTEzZWY2ZjQsIDB4ZTVmZmViNDMsIDB4ZThiY2NkOWEsIDB4ZWM3ZGQwMmQsXG4gICAweDM0ODY3MDc3LCAweDMwNDc2ZGMwLCAweDNkMDQ0YjE5LCAweDM5YzU1NmFlLFxuICAgMHgyNzgyMDZhYiwgMHgyMzQzMWIxYywgMHgyZTAwM2RjNSwgMHgyYWMxMjA3MixcbiAgIDB4MTI4ZTlkY2YsIDB4MTY0ZjgwNzgsIDB4MWIwY2E2YTEsIDB4MWZjZGJiMTYsXG4gICAweDAxOGFlYjEzLCAweDA1NGJmNmE0LCAweDA4MDhkMDdkLCAweDBjYzljZGNhLFxuICAgMHg3ODk3YWIwNywgMHg3YzU2YjZiMCwgMHg3MTE1OTA2OSwgMHg3NWQ0OGRkZSxcbiAgIDB4NmI5M2RkZGIsIDB4NmY1MmMwNmMsIDB4NjIxMWU2YjUsIDB4NjZkMGZiMDIsXG4gICAweDVlOWY0NmJmLCAweDVhNWU1YjA4LCAweDU3MWQ3ZGQxLCAweDUzZGM2MDY2LFxuICAgMHg0ZDliMzA2MywgMHg0OTVhMmRkNCwgMHg0NDE5MGIwZCwgMHg0MGQ4MTZiYSxcbiAgIDB4YWNhNWM2OTcsIDB4YTg2NGRiMjAsIDB4YTUyN2ZkZjksIDB4YTFlNmUwNGUsXG4gICAweGJmYTFiMDRiLCAweGJiNjBhZGZjLCAweGI2MjM4YjI1LCAweGIyZTI5NjkyLFxuICAgMHg4YWFkMmIyZiwgMHg4ZTZjMzY5OCwgMHg4MzJmMTA0MSwgMHg4N2VlMGRmNixcbiAgIDB4OTlhOTVkZjMsIDB4OWQ2ODQwNDQsIDB4OTAyYjY2OWQsIDB4OTRlYTdiMmEsXG4gICAweGUwYjQxZGU3LCAweGU0NzUwMDUwLCAweGU5MzYyNjg5LCAweGVkZjczYjNlLFxuICAgMHhmM2IwNmIzYiwgMHhmNzcxNzY4YywgMHhmYTMyNTA1NSwgMHhmZWYzNGRlMixcbiAgIDB4YzZiY2YwNWYsIDB4YzI3ZGVkZTgsIDB4Y2YzZWNiMzEsIDB4Y2JmZmQ2ODYsXG4gICAweGQ1Yjg4NjgzLCAweGQxNzk5YjM0LCAweGRjM2FiZGVkLCAweGQ4ZmJhMDVhLFxuICAgMHg2OTBjZTBlZSwgMHg2ZGNkZmQ1OSwgMHg2MDhlZGI4MCwgMHg2NDRmYzYzNyxcbiAgIDB4N2EwODk2MzIsIDB4N2VjOThiODUsIDB4NzM4YWFkNWMsIDB4Nzc0YmIwZWIsXG4gICAweDRmMDQwZDU2LCAweDRiYzUxMGUxLCAweDQ2ODYzNjM4LCAweDQyNDcyYjhmLFxuICAgMHg1YzAwN2I4YSwgMHg1OGMxNjYzZCwgMHg1NTgyNDBlNCwgMHg1MTQzNWQ1MyxcbiAgIDB4MjUxZDNiOWUsIDB4MjFkYzI2MjksIDB4MmM5ZjAwZjAsIDB4Mjg1ZTFkNDcsXG4gICAweDM2MTk0ZDQyLCAweDMyZDg1MGY1LCAweDNmOWI3NjJjLCAweDNiNWE2YjliLFxuICAgMHgwMzE1ZDYyNiwgMHgwN2Q0Y2I5MSwgMHgwYTk3ZWQ0OCwgMHgwZTU2ZjBmZixcbiAgIDB4MTAxMWEwZmEsIDB4MTRkMGJkNGQsIDB4MTk5MzliOTQsIDB4MWQ1Mjg2MjMsXG4gICAweGYxMmY1NjBlLCAweGY1ZWU0YmI5LCAweGY4YWQ2ZDYwLCAweGZjNmM3MGQ3LFxuICAgMHhlMjJiMjBkMiwgMHhlNmVhM2Q2NSwgMHhlYmE5MWJiYywgMHhlZjY4MDYwYixcbiAgIDB4ZDcyN2JiYjYsIDB4ZDNlNmE2MDEsIDB4ZGVhNTgwZDgsIDB4ZGE2NDlkNmYsXG4gICAweGM0MjNjZDZhLCAweGMwZTJkMGRkLCAweGNkYTFmNjA0LCAweGM5NjBlYmIzLFxuICAgMHhiZDNlOGQ3ZSwgMHhiOWZmOTBjOSwgMHhiNGJjYjYxMCwgMHhiMDdkYWJhNyxcbiAgIDB4YWUzYWZiYTIsIDB4YWFmYmU2MTUsIDB4YTdiOGMwY2MsIDB4YTM3OWRkN2IsXG4gICAweDliMzY2MGM2LCAweDlmZjc3ZDcxLCAweDkyYjQ1YmE4LCAweDk2NzU0NjFmLFxuICAgMHg4ODMyMTYxYSwgMHg4Y2YzMGJhZCwgMHg4MWIwMmQ3NCwgMHg4NTcxMzBjMyxcbiAgIDB4NWQ4YTkwOTksIDB4NTk0YjhkMmUsIDB4NTQwOGFiZjcsIDB4NTBjOWI2NDAsXG4gICAweDRlOGVlNjQ1LCAweDRhNGZmYmYyLCAweDQ3MGNkZDJiLCAweDQzY2RjMDljLFxuICAgMHg3YjgyN2QyMSwgMHg3ZjQzNjA5NiwgMHg3MjAwNDY0ZiwgMHg3NmMxNWJmOCxcbiAgIDB4Njg4NjBiZmQsIDB4NmM0NzE2NGEsIDB4NjEwNDMwOTMsIDB4NjVjNTJkMjQsXG4gICAweDExOWI0YmU5LCAweDE1NWE1NjVlLCAweDE4MTk3MDg3LCAweDFjZDg2ZDMwLFxuICAgMHgwMjlmM2QzNSwgMHgwNjVlMjA4MiwgMHgwYjFkMDY1YiwgMHgwZmRjMWJlYyxcbiAgIDB4Mzc5M2E2NTEsIDB4MzM1MmJiZTYsIDB4M2UxMTlkM2YsIDB4M2FkMDgwODgsXG4gICAweDI0OTdkMDhkLCAweDIwNTZjZDNhLCAweDJkMTVlYmUzLCAweDI5ZDRmNjU0LFxuICAgMHhjNWE5MjY3OSwgMHhjMTY4M2JjZSwgMHhjYzJiMWQxNywgMHhjOGVhMDBhMCxcbiAgIDB4ZDZhZDUwYTUsIDB4ZDI2YzRkMTIsIDB4ZGYyZjZiY2IsIDB4ZGJlZTc2N2MsXG4gICAweGUzYTFjYmMxLCAweGU3NjBkNjc2LCAweGVhMjNmMGFmLCAweGVlZTJlZDE4LFxuICAgMHhmMGE1YmQxZCwgMHhmNDY0YTBhYSwgMHhmOTI3ODY3MywgMHhmZGU2OWJjNCxcbiAgIDB4ODliOGZkMDksIDB4OGQ3OWUwYmUsIDB4ODAzYWM2NjcsIDB4ODRmYmRiZDAsXG4gICAweDlhYmM4YmQ1LCAweDllN2Q5NjYyLCAweDkzM2ViMGJiLCAweDk3ZmZhZDBjLFxuICAgMHhhZmIwMTBiMSwgMHhhYjcxMGQwNiwgMHhhNjMyMmJkZiwgMHhhMmYzMzY2OCxcbiAgIDB4YmNiNDY2NmQsIDB4Yjg3NTdiZGEsIDB4YjUzNjVkMDMsIDB4YjFmNzQwYjRcbl07XG5cbmJ6aXAyLmFycmF5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICB2YXIgYml0ID0gMCwgYnl0ZSA9IDA7XG4gICAgdmFyIEJJVE1BU0sgPSBbMCwgMHgwMSwgMHgwMywgMHgwNywgMHgwRiwgMHgxRiwgMHgzRiwgMHg3RiwgMHhGRiBdO1xuICAgIHJldHVybiBmdW5jdGlvbihuKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgICB3aGlsZShuID4gMCkge1xuICAgICAgICAgICAgdmFyIGxlZnQgPSA4IC0gYml0O1xuICAgICAgICAgICAgaWYgKG4gPj0gbGVmdCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA8PD0gbGVmdDtcbiAgICAgICAgICAgICAgICByZXN1bHQgfD0gKEJJVE1BU0tbbGVmdF0gJiBieXRlc1tieXRlKytdKTtcbiAgICAgICAgICAgICAgICBiaXQgPSAwO1xuICAgICAgICAgICAgICAgIG4gLT0gbGVmdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0IDw8PSBuO1xuICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAoKGJ5dGVzW2J5dGVdICYgKEJJVE1BU0tbbl0gPDwgKDggLSBuIC0gYml0KSkpID4+ICg4IC0gbiAtIGJpdCkpO1xuICAgICAgICAgICAgICAgIGJpdCArPSBuO1xuICAgICAgICAgICAgICAgIG4gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG4gICAgXG5iemlwMi5zaW1wbGUgPSBmdW5jdGlvbihzcmNidWZmZXIsIHN0cmVhbSkge1xuICAgIHZhciBiaXRzID0gYnppcDIuYXJyYXkoc3JjYnVmZmVyKTtcbiAgICB2YXIgc2l6ZSA9IGJ6aXAyLmhlYWRlcihiaXRzKTtcbiAgICB2YXIgcmV0ID0gZmFsc2U7XG4gICAgdmFyIGJ1ZnNpemUgPSAxMDAwMDAgKiBzaXplO1xuICAgIHZhciBidWYgPSBuZXcgSW50MzJBcnJheShidWZzaXplKTtcbiAgICBcbiAgICBkbyB7XG4gICAgICAgIHJldCA9IGJ6aXAyLmRlY29tcHJlc3MoYml0cywgc3RyZWFtLCBidWYsIGJ1ZnNpemUpOyAgICAgICAgXG4gICAgfSB3aGlsZSghcmV0KTtcbn1cblxuYnppcDIuaGVhZGVyID0gZnVuY3Rpb24oYml0cykge1xuICAgIHRoaXMuYnl0ZUNvdW50ID0gbmV3IEludDMyQXJyYXkoMjU2KTtcbiAgICB0aGlzLnN5bVRvQnl0ZSA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG4gICAgdGhpcy5tdGZTeW1ib2wgPSBuZXcgSW50MzJBcnJheSgyNTYpO1xuICAgIHRoaXMuc2VsZWN0b3JzID0gbmV3IFVpbnQ4QXJyYXkoMHg4MDAwKTtcblxuICAgIGlmIChiaXRzKDgqMykgIT0gNDM0ODUyMCkgbWVzc2FnZS5FcnJvcihcIk5vIG1hZ2ljIG51bWJlciBmb3VuZFwiKTtcblxuICAgIHZhciBpID0gYml0cyg4KSAtIDQ4O1xuICAgIGlmIChpIDwgMSB8fCBpID4gOSkgbWVzc2FnZS5FcnJvcihcIk5vdCBhIEJaSVAgYXJjaGl2ZVwiKTtcbiAgICByZXR1cm4gaTtcbn07XG5cblxuLy90YWtlcyBhIGZ1bmN0aW9uIGZvciByZWFkaW5nIHRoZSBibG9jayBkYXRhIChzdGFydGluZyB3aXRoIDB4MzE0MTU5MjY1MzU5KVxuLy9hIGJsb2NrIHNpemUgKDAtOSkgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byA5KVxuLy9hIGxlbmd0aCBhdCB3aGljaCB0byBzdG9wIGRlY29tcHJlc3NpbmcgYW5kIHJldHVybiB0aGUgb3V0cHV0XG5iemlwMi5kZWNvbXByZXNzID0gZnVuY3Rpb24oYml0cywgc3RyZWFtLCBidWYsIGJ1ZnNpemUsIHN0cmVhbUNSQykge1xuICAgIHZhciBNQVhfSFVGQ09ERV9CSVRTID0gMjA7XG4gICAgdmFyIE1BWF9TWU1CT0xTID0gMjU4O1xuICAgIHZhciBTWU1CT0xfUlVOQSA9IDA7XG4gICAgdmFyIFNZTUJPTF9SVU5CID0gMTtcbiAgICB2YXIgR1JPVVBfU0laRSA9IDUwO1xuICAgIHZhciBjcmMgPSAwIF4gKC0xKTtcbiAgICBcbiAgICBmb3IodmFyIGggPSAnJywgaSA9IDA7IGkgPCA2OyBpKyspIGggKz0gYml0cyg4KS50b1N0cmluZygxNik7XG4gICAgaWYgKGggPT0gXCIxNzcyNDUzODUwOTBcIikge1xuICAgICAgdmFyIGZpbmFsQ1JDID0gYml0cygzMil8MDtcbiAgICAgIGlmIChmaW5hbENSQyAhPT0gc3RyZWFtQ1JDKSBtZXNzYWdlLkVycm9yKFwiRXJyb3IgaW4gYnppcDI6IGNyYzMyIGRvIG5vdCBtYXRjaFwiKTtcbiAgICAgIC8vIGFsaWduIHN0cmVhbSB0byBieXRlXG4gICAgICBiaXRzKG51bGwpO1xuICAgICAgcmV0dXJuIG51bGw7IC8vIHJlc2V0IHN0cmVhbUNSQyBmb3IgbmV4dCBjYWxsXG4gICAgfVxuICAgIGlmIChoICE9IFwiMzE0MTU5MjY1MzU5XCIpIG1lc3NhZ2UuRXJyb3IoXCJlZWsgbm90IHZhbGlkIGJ6aXAgZGF0YVwiKTtcbiAgICB2YXIgY3JjYmxvY2sgPSBiaXRzKDMyKXwwOyAvLyBDUkMgY29kZVxuICAgIGlmIChiaXRzKDEpKSBtZXNzYWdlLkVycm9yKFwidW5zdXBwb3J0ZWQgb2Jzb2xldGUgdmVyc2lvblwiKTtcbiAgICB2YXIgb3JpZ1B0ciA9IGJpdHMoMjQpO1xuICAgIGlmIChvcmlnUHRyID4gYnVmc2l6ZSkgbWVzc2FnZS5FcnJvcihcIkluaXRpYWwgcG9zaXRpb24gbGFyZ2VyIHRoYW4gYnVmZmVyIHNpemVcIik7XG4gICAgdmFyIHQgPSBiaXRzKDE2KTtcbiAgICB2YXIgc3ltVG90YWwgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgIGlmICh0ICYgKDEgPDwgKDE1IC0gaSkpKSB7XG4gICAgICAgICAgICB2YXIgayA9IGJpdHMoMTYpO1xuICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgMTY7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChrICYgKDEgPDwgKDE1IC0gaikpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3ltVG9CeXRlW3N5bVRvdGFsKytdID0gKDE2ICogaSkgKyBqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBncm91cENvdW50ID0gYml0cygzKTtcbiAgICBpZiAoZ3JvdXBDb3VudCA8IDIgfHwgZ3JvdXBDb3VudCA+IDYpIG1lc3NhZ2UuRXJyb3IoXCJhbm90aGVyIGVycm9yXCIpO1xuICAgIHZhciBuU2VsZWN0b3JzID0gYml0cygxNSk7XG4gICAgaWYgKG5TZWxlY3RvcnMgPT0gMCkgbWVzc2FnZS5FcnJvcihcIm1laFwiKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgZ3JvdXBDb3VudDsgaSsrKSB0aGlzLm10ZlN5bWJvbFtpXSA9IGk7XG5cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgblNlbGVjdG9yczsgaSsrKSB7XG4gICAgICAgIGZvcih2YXIgaiA9IDA7IGJpdHMoMSk7IGorKykgaWYgKGogPj0gZ3JvdXBDb3VudCkgbWVzc2FnZS5FcnJvcihcIndob29wcyBhbm90aGVyIGVycm9yXCIpO1xuICAgICAgICB2YXIgdWMgPSB0aGlzLm10ZlN5bWJvbFtqXTtcbiAgICAgICAgZm9yKHZhciBrID0gai0xOyBrPj0wOyBrLS0pIHtcbiAgICAgICAgICAgIHRoaXMubXRmU3ltYm9sW2srMV0gPSB0aGlzLm10ZlN5bWJvbFtrXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm10ZlN5bWJvbFswXSA9IHVjO1xuICAgICAgICB0aGlzLnNlbGVjdG9yc1tpXSA9IHVjO1xuICAgIH1cblxuICAgIHZhciBzeW1Db3VudCA9IHN5bVRvdGFsICsgMjtcbiAgICB2YXIgZ3JvdXBzID0gW107XG4gICAgdmFyIGxlbmd0aCA9IG5ldyBVaW50OEFycmF5KE1BWF9TWU1CT0xTKSxcbiAgICB0ZW1wID0gbmV3IFVpbnQxNkFycmF5KE1BWF9IVUZDT0RFX0JJVFMrMSk7XG5cbiAgICB2YXIgaHVmR3JvdXA7XG5cbiAgICBmb3IodmFyIGogPSAwOyBqIDwgZ3JvdXBDb3VudDsgaisrKSB7XG4gICAgICAgIHQgPSBiaXRzKDUpOyAvL2xlbmd0aHNcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHN5bUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHdoaWxlKHRydWUpe1xuICAgICAgICAgICAgICAgIGlmICh0IDwgMSB8fCB0ID4gTUFYX0hVRkNPREVfQklUUykgbWVzc2FnZS5FcnJvcihcIkkgZ2F2ZSB1cCBhIHdoaWxlIGFnbyBvbiB3cml0aW5nIGVycm9yIG1lc3NhZ2VzXCIpO1xuICAgICAgICAgICAgICAgIGlmICghYml0cygxKSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKCFiaXRzKDEpKSB0Kys7XG4gICAgICAgICAgICAgICAgZWxzZSB0LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZW5ndGhbaV0gPSB0O1xuICAgICAgICB9XG4gICAgICAgIHZhciAgbWluTGVuLCAgbWF4TGVuO1xuICAgICAgICBtaW5MZW4gPSBtYXhMZW4gPSBsZW5ndGhbMF07XG4gICAgICAgIGZvcih2YXIgaSA9IDE7IGkgPCBzeW1Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobGVuZ3RoW2ldID4gbWF4TGVuKSBtYXhMZW4gPSBsZW5ndGhbaV07XG4gICAgICAgICAgICBlbHNlIGlmIChsZW5ndGhbaV0gPCBtaW5MZW4pIG1pbkxlbiA9IGxlbmd0aFtpXTtcbiAgICAgICAgfVxuICAgICAgICBodWZHcm91cCA9IGdyb3Vwc1tqXSA9IHt9O1xuICAgICAgICBodWZHcm91cC5wZXJtdXRlID0gbmV3IEludDMyQXJyYXkoTUFYX1NZTUJPTFMpO1xuICAgICAgICBodWZHcm91cC5saW1pdCA9IG5ldyBJbnQzMkFycmF5KE1BWF9IVUZDT0RFX0JJVFMgKyAxKTtcbiAgICAgICAgaHVmR3JvdXAuYmFzZSA9IG5ldyBJbnQzMkFycmF5KE1BWF9IVUZDT0RFX0JJVFMgKyAxKTtcblxuICAgICAgICBodWZHcm91cC5taW5MZW4gPSBtaW5MZW47XG4gICAgICAgIGh1Zkdyb3VwLm1heExlbiA9IG1heExlbjtcbiAgICAgICAgdmFyIGJhc2UgPSBodWZHcm91cC5iYXNlO1xuICAgICAgICB2YXIgbGltaXQgPSBodWZHcm91cC5saW1pdDtcbiAgICAgICAgdmFyIHBwID0gMDtcbiAgICAgICAgZm9yKHZhciBpID0gbWluTGVuOyBpIDw9IG1heExlbjsgaSsrKVxuICAgICAgICBmb3IodmFyIHQgPSAwOyB0IDwgc3ltQ291bnQ7IHQrKylcbiAgICAgICAgaWYgKGxlbmd0aFt0XSA9PSBpKSBodWZHcm91cC5wZXJtdXRlW3BwKytdID0gdDtcbiAgICAgICAgZm9yKGkgPSBtaW5MZW47IGkgPD0gbWF4TGVuOyBpKyspIHRlbXBbaV0gPSBsaW1pdFtpXSA9IDA7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IHN5bUNvdW50OyBpKyspIHRlbXBbbGVuZ3RoW2ldXSsrO1xuICAgICAgICBwcCA9IHQgPSAwO1xuICAgICAgICBmb3IoaSA9IG1pbkxlbjsgaSA8IG1heExlbjsgaSsrKSB7XG4gICAgICAgICAgICBwcCArPSB0ZW1wW2ldO1xuICAgICAgICAgICAgbGltaXRbaV0gPSBwcCAtIDE7XG4gICAgICAgICAgICBwcCA8PD0gMTtcbiAgICAgICAgICAgIGJhc2VbaSsxXSA9IHBwIC0gKHQgKz0gdGVtcFtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbGltaXRbbWF4TGVuXSA9IHBwICsgdGVtcFttYXhMZW5dIC0gMTtcbiAgICAgICAgYmFzZVttaW5MZW5dID0gMDtcbiAgICB9XG5cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHsgXG4gICAgICAgIHRoaXMubXRmU3ltYm9sW2ldID0gaTtcbiAgICAgICAgdGhpcy5ieXRlQ291bnRbaV0gPSAwO1xuICAgIH1cbiAgICB2YXIgcnVuUG9zLCBjb3VudCwgc3ltQ291bnQsIHNlbGVjdG9yO1xuICAgIHJ1blBvcyA9IGNvdW50ID0gc3ltQ291bnQgPSBzZWxlY3RvciA9IDA7ICAgIFxuICAgIHdoaWxlKHRydWUpIHtcbiAgICAgICAgaWYgKCEoc3ltQ291bnQtLSkpIHtcbiAgICAgICAgICAgIHN5bUNvdW50ID0gR1JPVVBfU0laRSAtIDE7XG4gICAgICAgICAgICBpZiAoc2VsZWN0b3IgPj0gblNlbGVjdG9ycykgbWVzc2FnZS5FcnJvcihcIm1lb3cgaSdtIGEga2l0dHksIHRoYXQncyBhbiBlcnJvclwiKTtcbiAgICAgICAgICAgIGh1Zkdyb3VwID0gZ3JvdXBzW3RoaXMuc2VsZWN0b3JzW3NlbGVjdG9yKytdXTtcbiAgICAgICAgICAgIGJhc2UgPSBodWZHcm91cC5iYXNlO1xuICAgICAgICAgICAgbGltaXQgPSBodWZHcm91cC5saW1pdDtcbiAgICAgICAgfVxuICAgICAgICBpID0gaHVmR3JvdXAubWluTGVuO1xuICAgICAgICBqID0gYml0cyhpKTtcbiAgICAgICAgd2hpbGUodHJ1ZSkge1xuICAgICAgICAgICAgaWYgKGkgPiBodWZHcm91cC5tYXhMZW4pIG1lc3NhZ2UuRXJyb3IoXCJyYXdyIGknbSBhIGRpbm9zYXVyXCIpO1xuICAgICAgICAgICAgaWYgKGogPD0gbGltaXRbaV0pIGJyZWFrO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgaiA9IChqIDw8IDEpIHwgYml0cygxKTtcbiAgICAgICAgfVxuICAgICAgICBqIC09IGJhc2VbaV07XG4gICAgICAgIGlmIChqIDwgMCB8fCBqID49IE1BWF9TWU1CT0xTKSBtZXNzYWdlLkVycm9yKFwibW9vIGknbSBhIGNvd1wiKTtcbiAgICAgICAgdmFyIG5leHRTeW0gPSBodWZHcm91cC5wZXJtdXRlW2pdO1xuICAgICAgICBpZiAobmV4dFN5bSA9PSBTWU1CT0xfUlVOQSB8fCBuZXh0U3ltID09IFNZTUJPTF9SVU5CKSB7XG4gICAgICAgICAgICBpZiAoIXJ1blBvcyl7XG4gICAgICAgICAgICAgICAgcnVuUG9zID0gMTtcbiAgICAgICAgICAgICAgICB0ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuZXh0U3ltID09IFNZTUJPTF9SVU5BKSB0ICs9IHJ1blBvcztcbiAgICAgICAgICAgIGVsc2UgdCArPSAyICogcnVuUG9zO1xuICAgICAgICAgICAgcnVuUG9zIDw8PSAxO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1blBvcykge1xuICAgICAgICAgICAgcnVuUG9zID0gMDtcbiAgICAgICAgICAgIGlmIChjb3VudCArIHQgPiBidWZzaXplKSBtZXNzYWdlLkVycm9yKFwiQm9vbS5cIik7XG4gICAgICAgICAgICB1YyA9IHRoaXMuc3ltVG9CeXRlW3RoaXMubXRmU3ltYm9sWzBdXTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZUNvdW50W3VjXSArPSB0O1xuICAgICAgICAgICAgd2hpbGUodC0tKSBidWZbY291bnQrK10gPSB1YztcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dFN5bSA+IHN5bVRvdGFsKSBicmVhaztcbiAgICAgICAgaWYgKGNvdW50ID49IGJ1ZnNpemUpIG1lc3NhZ2UuRXJyb3IoXCJJIGNhbid0IHRoaW5rIG9mIGFueXRoaW5nLiBFcnJvclwiKTtcbiAgICAgICAgaSA9IG5leHRTeW0gLSAxO1xuICAgICAgICB1YyA9IHRoaXMubXRmU3ltYm9sW2ldO1xuICAgICAgICBmb3IodmFyIGsgPSBpLTE7IGs+PTA7IGstLSkge1xuICAgICAgICAgICAgdGhpcy5tdGZTeW1ib2xbaysxXSA9IHRoaXMubXRmU3ltYm9sW2tdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubXRmU3ltYm9sWzBdID0gdWNcbiAgICAgICAgdWMgPSB0aGlzLnN5bVRvQnl0ZVt1Y107XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50W3VjXSsrO1xuICAgICAgICBidWZbY291bnQrK10gPSB1YztcbiAgICB9XG4gICAgaWYgKG9yaWdQdHIgPCAwIHx8IG9yaWdQdHIgPj0gY291bnQpIG1lc3NhZ2UuRXJyb3IoXCJJJ20gYSBtb25rZXkgYW5kIEknbSB0aHJvd2luZyBzb21ldGhpbmcgYXQgc29tZW9uZSwgbmFtZWx5IHlvdVwiKTtcbiAgICB2YXIgaiA9IDA7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICAgIGsgPSBqICsgdGhpcy5ieXRlQ291bnRbaV07XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50W2ldID0gajtcbiAgICAgICAgaiA9IGs7XG4gICAgfVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgIHVjID0gYnVmW2ldICYgMHhmZjtcbiAgICAgICAgYnVmW3RoaXMuYnl0ZUNvdW50W3VjXV0gfD0gKGkgPDwgOCk7XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50W3VjXSsrO1xuICAgIH1cbiAgICB2YXIgcG9zID0gMCwgY3VycmVudCA9IDAsIHJ1biA9IDA7XG4gICAgaWYgKGNvdW50KSB7XG4gICAgICAgIHBvcyA9IGJ1ZltvcmlnUHRyXTtcbiAgICAgICAgY3VycmVudCA9IChwb3MgJiAweGZmKTtcbiAgICAgICAgcG9zID4+PSA4O1xuICAgICAgICBydW4gPSAtMTtcbiAgICB9XG4gICAgY291bnQgPSBjb3VudDtcbiAgICB2YXIgY29waWVzLCBwcmV2aW91cywgb3V0Ynl0ZTtcbiAgICB3aGlsZShjb3VudCkge1xuICAgICAgICBjb3VudC0tO1xuICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7XG4gICAgICAgIHBvcyA9IGJ1Zltwb3NdO1xuICAgICAgICBjdXJyZW50ID0gcG9zICYgMHhmZjtcbiAgICAgICAgcG9zID4+PSA4O1xuICAgICAgICBpZiAocnVuKysgPT0gMykge1xuICAgICAgICAgICAgY29waWVzID0gY3VycmVudDtcbiAgICAgICAgICAgIG91dGJ5dGUgPSBwcmV2aW91cztcbiAgICAgICAgICAgIGN1cnJlbnQgPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvcGllcyA9IDE7XG4gICAgICAgICAgICBvdXRieXRlID0gY3VycmVudDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZShjb3BpZXMtLSkge1xuICAgICAgICAgICAgY3JjID0gKChjcmMgPDwgOCkgXiB0aGlzLmNyY1RhYmxlWygoY3JjPj4yNCkgXiBvdXRieXRlKSAmIDB4RkZdKSYweEZGRkZGRkZGOyAvLyBjcmMzMlxuICAgICAgICAgICAgc3RyZWFtKG91dGJ5dGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50ICE9IHByZXZpb3VzKSBydW4gPSAwO1xuICAgIH1cblxuICAgIGNyYyA9IChjcmMgXiAoLTEpKSA+Pj4gMDtcbiAgICBpZiAoKGNyY3wwKSAhPSAoY3JjYmxvY2t8MCkpIG1lc3NhZ2UuRXJyb3IoXCJFcnJvciBpbiBiemlwMjogY3JjMzIgZG8gbm90IG1hdGNoXCIpO1xuICAgIHN0cmVhbUNSQyA9IChjcmMgXiAoKHN0cmVhbUNSQyA8PCAxKSB8IChzdHJlYW1DUkMgPj4+IDMxKSkpICYgMHhGRkZGRkZGRjtcbiAgICByZXR1cm4gc3RyZWFtQ1JDO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ6aXAyO1xuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuZnJvbUNhbGxiYWNrID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykgZm4uYXBwbHkodGhpcywgYXJncylcbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGFyZ3MucHVzaCgoZXJyLCByZXMpID0+IChlcnIgIT0gbnVsbCkgPyByZWplY3QoZXJyKSA6IHJlc29sdmUocmVzKSlcbiAgICAgICAgZm4uYXBwbHkodGhpcywgYXJncylcbiAgICAgIH0pXG4gICAgfVxuICB9LCAnbmFtZScsIHsgdmFsdWU6IGZuLm5hbWUgfSlcbn1cblxuZXhwb3J0cy5mcm9tUHJvbWlzZSA9IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgY29uc3QgY2IgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV1cbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncylcbiAgICBlbHNlIHtcbiAgICAgIGFyZ3MucG9wKClcbiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3MpLnRoZW4ociA9PiBjYihudWxsLCByKSwgY2IpXG4gICAgfVxuICB9LCAnbmFtZScsIHsgdmFsdWU6IGZuLm5hbWUgfSlcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBidWZmZXIgY29udGFpbnMgb25seSBjb3JyZWN0IFVURi04LlxuICogUG9ydGVkIGZyb20gaHR0cHM6Ly93d3cuY2wuY2FtLmFjLnVrLyU3RW1nazI1L3Vjcy91dGY4X2NoZWNrLmMgYnlcbiAqIE1hcmt1cyBLdWhuLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWYgVGhlIGJ1ZmZlciB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGBidWZgIGNvbnRhaW5zIG9ubHkgY29ycmVjdCBVVEYtOCwgZWxzZSBgZmFsc2VgXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRVVEY4KGJ1Zikge1xuICBjb25zdCBsZW4gPSBidWYubGVuZ3RoO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBpZiAoKGJ1ZltpXSAmIDB4ODApID09PSAweDAwKSB7ICAvLyAweHh4eHh4eFxuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZTApID09PSAweGMwKSB7ICAvLyAxMTB4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMSA9PT0gbGVuIHx8XG4gICAgICAgIChidWZbaSArIDFdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSAmIDB4ZmUpID09PSAweGMwICAvLyBvdmVybG9uZ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSArPSAyO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZjApID09PSAweGUwKSB7ICAvLyAxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMiA+PSBsZW4gfHxcbiAgICAgICAgKGJ1ZltpICsgMV0gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICAoYnVmW2kgKyAyXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIGJ1ZltpXSA9PT0gMHhlMCAmJiAoYnVmW2kgKyAxXSAmIDB4ZTApID09PSAweDgwIHx8ICAvLyBvdmVybG9uZ1xuICAgICAgICBidWZbaV0gPT09IDB4ZWQgJiYgKGJ1ZltpICsgMV0gJiAweGUwKSA9PT0gMHhhMCAgLy8gc3Vycm9nYXRlIChVK0Q4MDAgLSBVK0RGRkYpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpICs9IDM7XG4gICAgfSBlbHNlIGlmICgoYnVmW2ldICYgMHhmOCkgPT09IDB4ZjApIHsgIC8vIDExMTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4XG4gICAgICBpZiAoXG4gICAgICAgIGkgKyAzID49IGxlbiB8fFxuICAgICAgICAoYnVmW2kgKyAxXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaSArIDJdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpICsgM10gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICBidWZbaV0gPT09IDB4ZjAgJiYgKGJ1ZltpICsgMV0gJiAweGYwKSA9PT0gMHg4MCB8fCAgLy8gb3ZlcmxvbmdcbiAgICAgICAgYnVmW2ldID09PSAweGY0ICYmIGJ1ZltpICsgMV0gPiAweDhmIHx8IGJ1ZltpXSA+IDB4ZjQgIC8vID4gVSsxMEZGRkZcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGkgKz0gNDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzVmFsaWRVVEY4O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG50cnkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ25vZGUtZ3lwLWJ1aWxkJykoX19kaXJuYW1lKTtcbn0gY2F0Y2ggKGUpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhbGxiYWNrJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBzdHJpbmdXaWR0aCA9IHJlcXVpcmUoJ3N0cmluZy13aWR0aCcpO1xuY29uc3Qgc3RyaXBBbnNpID0gcmVxdWlyZSgnc3RyaXAtYW5zaScpO1xuY29uc3QgYW5zaVN0eWxlcyA9IHJlcXVpcmUoJ2Fuc2ktc3R5bGVzJyk7XG5cbmNvbnN0IEVTQ0FQRVMgPSBuZXcgU2V0KFtcblx0J1xcdTAwMUInLFxuXHQnXFx1MDA5Qidcbl0pO1xuXG5jb25zdCBFTkRfQ09ERSA9IDM5O1xuXG5jb25zdCBBTlNJX0VTQ0FQRV9CRUxMID0gJ1xcdTAwMDcnO1xuY29uc3QgQU5TSV9DU0kgPSAnWyc7XG5jb25zdCBBTlNJX09TQyA9ICddJztcbmNvbnN0IEFOU0lfU0dSX1RFUk1JTkFUT1IgPSAnbSc7XG5jb25zdCBBTlNJX0VTQ0FQRV9MSU5LID0gYCR7QU5TSV9PU0N9ODs7YDtcblxuY29uc3Qgd3JhcEFuc2kgPSBjb2RlID0+IGAke0VTQ0FQRVMudmFsdWVzKCkubmV4dCgpLnZhbHVlfSR7QU5TSV9DU0l9JHtjb2RlfSR7QU5TSV9TR1JfVEVSTUlOQVRPUn1gO1xuY29uc3Qgd3JhcEFuc2lIeXBlcmxpbmsgPSB1cmkgPT4gYCR7RVNDQVBFUy52YWx1ZXMoKS5uZXh0KCkudmFsdWV9JHtBTlNJX0VTQ0FQRV9MSU5LfSR7dXJpfSR7QU5TSV9FU0NBUEVfQkVMTH1gO1xuXG4vLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB3b3JkcyBzcGxpdCBvbiAnICcsIGlnbm9yaW5nXG4vLyB0aGUgZXh0cmEgY2hhcmFjdGVycyBhZGRlZCBieSBhbnNpIGVzY2FwZSBjb2Rlc1xuY29uc3Qgd29yZExlbmd0aHMgPSBzdHJpbmcgPT4gc3RyaW5nLnNwbGl0KCcgJykubWFwKGNoYXJhY3RlciA9PiBzdHJpbmdXaWR0aChjaGFyYWN0ZXIpKTtcblxuLy8gV3JhcCBhIGxvbmcgd29yZCBhY3Jvc3MgbXVsdGlwbGUgcm93c1xuLy8gQW5zaSBlc2NhcGUgY29kZXMgZG8gbm90IGNvdW50IHRvd2FyZHMgbGVuZ3RoXG5jb25zdCB3cmFwV29yZCA9IChyb3dzLCB3b3JkLCBjb2x1bW5zKSA9PiB7XG5cdGNvbnN0IGNoYXJhY3RlcnMgPSBbLi4ud29yZF07XG5cblx0bGV0IGlzSW5zaWRlRXNjYXBlID0gZmFsc2U7XG5cdGxldCBpc0luc2lkZUxpbmtFc2NhcGUgPSBmYWxzZTtcblx0bGV0IHZpc2libGUgPSBzdHJpbmdXaWR0aChzdHJpcEFuc2kocm93c1tyb3dzLmxlbmd0aCAtIDFdKSk7XG5cblx0Zm9yIChjb25zdCBbaW5kZXgsIGNoYXJhY3Rlcl0gb2YgY2hhcmFjdGVycy5lbnRyaWVzKCkpIHtcblx0XHRjb25zdCBjaGFyYWN0ZXJMZW5ndGggPSBzdHJpbmdXaWR0aChjaGFyYWN0ZXIpO1xuXG5cdFx0aWYgKHZpc2libGUgKyBjaGFyYWN0ZXJMZW5ndGggPD0gY29sdW1ucykge1xuXHRcdFx0cm93c1tyb3dzLmxlbmd0aCAtIDFdICs9IGNoYXJhY3Rlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cm93cy5wdXNoKGNoYXJhY3Rlcik7XG5cdFx0XHR2aXNpYmxlID0gMDtcblx0XHR9XG5cblx0XHRpZiAoRVNDQVBFUy5oYXMoY2hhcmFjdGVyKSkge1xuXHRcdFx0aXNJbnNpZGVFc2NhcGUgPSB0cnVlO1xuXHRcdFx0aXNJbnNpZGVMaW5rRXNjYXBlID0gY2hhcmFjdGVycy5zbGljZShpbmRleCArIDEpLmpvaW4oJycpLnN0YXJ0c1dpdGgoQU5TSV9FU0NBUEVfTElOSyk7XG5cdFx0fVxuXG5cdFx0aWYgKGlzSW5zaWRlRXNjYXBlKSB7XG5cdFx0XHRpZiAoaXNJbnNpZGVMaW5rRXNjYXBlKSB7XG5cdFx0XHRcdGlmIChjaGFyYWN0ZXIgPT09IEFOU0lfRVNDQVBFX0JFTEwpIHtcblx0XHRcdFx0XHRpc0luc2lkZUVzY2FwZSA9IGZhbHNlO1xuXHRcdFx0XHRcdGlzSW5zaWRlTGlua0VzY2FwZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gQU5TSV9TR1JfVEVSTUlOQVRPUikge1xuXHRcdFx0XHRpc0luc2lkZUVzY2FwZSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHR2aXNpYmxlICs9IGNoYXJhY3Rlckxlbmd0aDtcblxuXHRcdGlmICh2aXNpYmxlID09PSBjb2x1bW5zICYmIGluZGV4IDwgY2hhcmFjdGVycy5sZW5ndGggLSAxKSB7XG5cdFx0XHRyb3dzLnB1c2goJycpO1xuXHRcdFx0dmlzaWJsZSA9IDA7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBsYXN0IHJvdyB3ZSBjb3B5IG92ZXIgaXMgb25seVxuXHQvLyBhbnNpIGVzY2FwZSBjaGFyYWN0ZXJzLCBoYW5kbGUgdGhpcyBlZGdlLWNhc2Vcblx0aWYgKCF2aXNpYmxlICYmIHJvd3Nbcm93cy5sZW5ndGggLSAxXS5sZW5ndGggPiAwICYmIHJvd3MubGVuZ3RoID4gMSkge1xuXHRcdHJvd3Nbcm93cy5sZW5ndGggLSAyXSArPSByb3dzLnBvcCgpO1xuXHR9XG59O1xuXG4vLyBUcmltcyBzcGFjZXMgZnJvbSBhIHN0cmluZyBpZ25vcmluZyBpbnZpc2libGUgc2VxdWVuY2VzXG5jb25zdCBzdHJpbmdWaXNpYmxlVHJpbVNwYWNlc1JpZ2h0ID0gc3RyaW5nID0+IHtcblx0Y29uc3Qgd29yZHMgPSBzdHJpbmcuc3BsaXQoJyAnKTtcblx0bGV0IGxhc3QgPSB3b3Jkcy5sZW5ndGg7XG5cblx0d2hpbGUgKGxhc3QgPiAwKSB7XG5cdFx0aWYgKHN0cmluZ1dpZHRoKHdvcmRzW2xhc3QgLSAxXSkgPiAwKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRsYXN0LS07XG5cdH1cblxuXHRpZiAobGFzdCA9PT0gd29yZHMubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIHN0cmluZztcblx0fVxuXG5cdHJldHVybiB3b3Jkcy5zbGljZSgwLCBsYXN0KS5qb2luKCcgJykgKyB3b3Jkcy5zbGljZShsYXN0KS5qb2luKCcnKTtcbn07XG5cbi8vIFRoZSB3cmFwLWFuc2kgbW9kdWxlIGNhbiBiZSBpbnZva2VkIGluIGVpdGhlciAnaGFyZCcgb3IgJ3NvZnQnIHdyYXAgbW9kZVxuLy9cbi8vICdoYXJkJyB3aWxsIG5ldmVyIGFsbG93IGEgc3RyaW5nIHRvIHRha2UgdXAgbW9yZSB0aGFuIGNvbHVtbnMgY2hhcmFjdGVyc1xuLy9cbi8vICdzb2Z0JyBhbGxvd3MgbG9uZyB3b3JkcyB0byBleHBhbmQgcGFzdCB0aGUgY29sdW1uIGxlbmd0aFxuY29uc3QgZXhlYyA9IChzdHJpbmcsIGNvbHVtbnMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuXHRpZiAob3B0aW9ucy50cmltICE9PSBmYWxzZSAmJiBzdHJpbmcudHJpbSgpID09PSAnJykge1xuXHRcdHJldHVybiAnJztcblx0fVxuXG5cdGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXHRsZXQgZXNjYXBlQ29kZTtcblx0bGV0IGVzY2FwZVVybDtcblxuXHRjb25zdCBsZW5ndGhzID0gd29yZExlbmd0aHMoc3RyaW5nKTtcblx0bGV0IHJvd3MgPSBbJyddO1xuXG5cdGZvciAoY29uc3QgW2luZGV4LCB3b3JkXSBvZiBzdHJpbmcuc3BsaXQoJyAnKS5lbnRyaWVzKCkpIHtcblx0XHRpZiAob3B0aW9ucy50cmltICE9PSBmYWxzZSkge1xuXHRcdFx0cm93c1tyb3dzLmxlbmd0aCAtIDFdID0gcm93c1tyb3dzLmxlbmd0aCAtIDFdLnRyaW1TdGFydCgpO1xuXHRcdH1cblxuXHRcdGxldCByb3dMZW5ndGggPSBzdHJpbmdXaWR0aChyb3dzW3Jvd3MubGVuZ3RoIC0gMV0pO1xuXG5cdFx0aWYgKGluZGV4ICE9PSAwKSB7XG5cdFx0XHRpZiAocm93TGVuZ3RoID49IGNvbHVtbnMgJiYgKG9wdGlvbnMud29yZFdyYXAgPT09IGZhbHNlIHx8IG9wdGlvbnMudHJpbSA9PT0gZmFsc2UpKSB7XG5cdFx0XHRcdC8vIElmIHdlIHN0YXJ0IHdpdGggYSBuZXcgd29yZCBidXQgdGhlIGN1cnJlbnQgcm93IGxlbmd0aCBlcXVhbHMgdGhlIGxlbmd0aCBvZiB0aGUgY29sdW1ucywgYWRkIGEgbmV3IHJvd1xuXHRcdFx0XHRyb3dzLnB1c2goJycpO1xuXHRcdFx0XHRyb3dMZW5ndGggPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm93TGVuZ3RoID4gMCB8fCBvcHRpb25zLnRyaW0gPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJvd3Nbcm93cy5sZW5ndGggLSAxXSArPSAnICc7XG5cdFx0XHRcdHJvd0xlbmd0aCsrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEluICdoYXJkJyB3cmFwIG1vZGUsIHRoZSBsZW5ndGggb2YgYSBsaW5lIGlzIG5ldmVyIGFsbG93ZWQgdG8gZXh0ZW5kIHBhc3QgJ2NvbHVtbnMnXG5cdFx0aWYgKG9wdGlvbnMuaGFyZCAmJiBsZW5ndGhzW2luZGV4XSA+IGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IHJlbWFpbmluZ0NvbHVtbnMgPSAoY29sdW1ucyAtIHJvd0xlbmd0aCk7XG5cdFx0XHRjb25zdCBicmVha3NTdGFydGluZ1RoaXNMaW5lID0gMSArIE1hdGguZmxvb3IoKGxlbmd0aHNbaW5kZXhdIC0gcmVtYWluaW5nQ29sdW1ucyAtIDEpIC8gY29sdW1ucyk7XG5cdFx0XHRjb25zdCBicmVha3NTdGFydGluZ05leHRMaW5lID0gTWF0aC5mbG9vcigobGVuZ3Roc1tpbmRleF0gLSAxKSAvIGNvbHVtbnMpO1xuXHRcdFx0aWYgKGJyZWFrc1N0YXJ0aW5nTmV4dExpbmUgPCBicmVha3NTdGFydGluZ1RoaXNMaW5lKSB7XG5cdFx0XHRcdHJvd3MucHVzaCgnJyk7XG5cdFx0XHR9XG5cblx0XHRcdHdyYXBXb3JkKHJvd3MsIHdvcmQsIGNvbHVtbnMpO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0aWYgKHJvd0xlbmd0aCArIGxlbmd0aHNbaW5kZXhdID4gY29sdW1ucyAmJiByb3dMZW5ndGggPiAwICYmIGxlbmd0aHNbaW5kZXhdID4gMCkge1xuXHRcdFx0aWYgKG9wdGlvbnMud29yZFdyYXAgPT09IGZhbHNlICYmIHJvd0xlbmd0aCA8IGNvbHVtbnMpIHtcblx0XHRcdFx0d3JhcFdvcmQocm93cywgd29yZCwgY29sdW1ucyk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyb3dzLnB1c2goJycpO1xuXHRcdH1cblxuXHRcdGlmIChyb3dMZW5ndGggKyBsZW5ndGhzW2luZGV4XSA+IGNvbHVtbnMgJiYgb3B0aW9ucy53b3JkV3JhcCA9PT0gZmFsc2UpIHtcblx0XHRcdHdyYXBXb3JkKHJvd3MsIHdvcmQsIGNvbHVtbnMpO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0cm93c1tyb3dzLmxlbmd0aCAtIDFdICs9IHdvcmQ7XG5cdH1cblxuXHRpZiAob3B0aW9ucy50cmltICE9PSBmYWxzZSkge1xuXHRcdHJvd3MgPSByb3dzLm1hcChzdHJpbmdWaXNpYmxlVHJpbVNwYWNlc1JpZ2h0KTtcblx0fVxuXG5cdGNvbnN0IHByZSA9IFsuLi5yb3dzLmpvaW4oJ1xcbicpXTtcblxuXHRmb3IgKGNvbnN0IFtpbmRleCwgY2hhcmFjdGVyXSBvZiBwcmUuZW50cmllcygpKSB7XG5cdFx0cmV0dXJuVmFsdWUgKz0gY2hhcmFjdGVyO1xuXG5cdFx0aWYgKEVTQ0FQRVMuaGFzKGNoYXJhY3RlcikpIHtcblx0XHRcdGNvbnN0IHtncm91cHN9ID0gbmV3IFJlZ0V4cChgKD86XFxcXCR7QU5TSV9DU0l9KD88Y29kZT5cXFxcZCspbXxcXFxcJHtBTlNJX0VTQ0FQRV9MSU5LfSg/PHVyaT4uKikke0FOU0lfRVNDQVBFX0JFTEx9KWApLmV4ZWMocHJlLnNsaWNlKGluZGV4KS5qb2luKCcnKSkgfHwge2dyb3Vwczoge319O1xuXHRcdFx0aWYgKGdyb3Vwcy5jb2RlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc3QgY29kZSA9IE51bWJlci5wYXJzZUZsb2F0KGdyb3Vwcy5jb2RlKTtcblx0XHRcdFx0ZXNjYXBlQ29kZSA9IGNvZGUgPT09IEVORF9DT0RFID8gdW5kZWZpbmVkIDogY29kZTtcblx0XHRcdH0gZWxzZSBpZiAoZ3JvdXBzLnVyaSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGVzY2FwZVVybCA9IGdyb3Vwcy51cmkubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogZ3JvdXBzLnVyaTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjb2RlID0gYW5zaVN0eWxlcy5jb2Rlcy5nZXQoTnVtYmVyKGVzY2FwZUNvZGUpKTtcblxuXHRcdGlmIChwcmVbaW5kZXggKyAxXSA9PT0gJ1xcbicpIHtcblx0XHRcdGlmIChlc2NhcGVVcmwpIHtcblx0XHRcdFx0cmV0dXJuVmFsdWUgKz0gd3JhcEFuc2lIeXBlcmxpbmsoJycpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZXNjYXBlQ29kZSAmJiBjb2RlKSB7XG5cdFx0XHRcdHJldHVyblZhbHVlICs9IHdyYXBBbnNpKGNvZGUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnXFxuJykge1xuXHRcdFx0aWYgKGVzY2FwZUNvZGUgJiYgY29kZSkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSArPSB3cmFwQW5zaShlc2NhcGVDb2RlKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGVzY2FwZVVybCkge1xuXHRcdFx0XHRyZXR1cm5WYWx1ZSArPSB3cmFwQW5zaUh5cGVybGluayhlc2NhcGVVcmwpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXR1cm5WYWx1ZTtcbn07XG5cbi8vIEZvciBlYWNoIG5ld2xpbmUsIGludm9rZSB0aGUgbWV0aG9kIHNlcGFyYXRlbHlcbm1vZHVsZS5leHBvcnRzID0gKHN0cmluZywgY29sdW1ucywgb3B0aW9ucykgPT4ge1xuXHRyZXR1cm4gU3RyaW5nKHN0cmluZylcblx0XHQubm9ybWFsaXplKClcblx0XHQucmVwbGFjZSgvXFxyXFxuL2csICdcXG4nKVxuXHRcdC5zcGxpdCgnXFxuJylcblx0XHQubWFwKGxpbmUgPT4gZXhlYyhsaW5lLCBjb2x1bW5zLCBvcHRpb25zKSlcblx0XHQuam9pbignXFxuJyk7XG59O1xuIiwiLy8gUmV0dXJucyBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgd3JhcHBlZCBjYWxsYmFja1xuLy8gVGhlIHdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGRvIHNvbWUgc3R1ZmYsIGFuZCByZXR1cm4gYVxuLy8gcHJlc3VtYWJseSBkaWZmZXJlbnQgY2FsbGJhY2sgZnVuY3Rpb24uXG4vLyBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvd24gcHJvcGVydGllcyBhcmUgcmV0YWluZWQsIHNvIHRoYXRcbi8vIGRlY29yYXRpb25zIGFuZCBzdWNoIGFyZSBub3QgbG9zdCBhbG9uZyB0aGUgd2F5LlxubW9kdWxlLmV4cG9ydHMgPSB3cmFwcHlcbmZ1bmN0aW9uIHdyYXBweSAoZm4sIGNiKSB7XG4gIGlmIChmbiAmJiBjYikgcmV0dXJuIHdyYXBweShmbikoY2IpXG5cbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCduZWVkIHdyYXBwZXIgZnVuY3Rpb24nKVxuXG4gIE9iamVjdC5rZXlzKGZuKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgd3JhcHBlcltrXSA9IGZuW2tdXG4gIH0pXG5cbiAgcmV0dXJuIHdyYXBwZXJcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuICAgIHZhciByZXQgPSBmbi5hcHBseSh0aGlzLCBhcmdzKVxuICAgIHZhciBjYiA9IGFyZ3NbYXJncy5sZW5ndGgtMV1cbiAgICBpZiAodHlwZW9mIHJldCA9PT0gJ2Z1bmN0aW9uJyAmJiByZXQgIT09IGNiKSB7XG4gICAgICBPYmplY3Qua2V5cyhjYikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXRba10gPSBjYltrXVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgRU1QVFlfQlVGRkVSIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG5jb25zdCBGYXN0QnVmZmVyID0gQnVmZmVyW1N5bWJvbC5zcGVjaWVzXTtcblxuLyoqXG4gKiBNZXJnZXMgYW4gYXJyYXkgb2YgYnVmZmVycyBpbnRvIGEgbmV3IGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcltdfSBsaXN0IFRoZSBhcnJheSBvZiBidWZmZXJzIHRvIGNvbmNhdFxuICogQHBhcmFtIHtOdW1iZXJ9IHRvdGFsTGVuZ3RoIFRoZSB0b3RhbCBsZW5ndGggb2YgYnVmZmVycyBpbiB0aGUgbGlzdFxuICogQHJldHVybiB7QnVmZmVyfSBUaGUgcmVzdWx0aW5nIGJ1ZmZlclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBjb25jYXQobGlzdCwgdG90YWxMZW5ndGgpIHtcbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSByZXR1cm4gRU1QVFlfQlVGRkVSO1xuICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHJldHVybiBsaXN0WzBdO1xuXG4gIGNvbnN0IHRhcmdldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSh0b3RhbExlbmd0aCk7XG4gIGxldCBvZmZzZXQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGJ1ZiA9IGxpc3RbaV07XG4gICAgdGFyZ2V0LnNldChidWYsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGJ1Zi5sZW5ndGg7XG4gIH1cblxuICBpZiAob2Zmc2V0IDwgdG90YWxMZW5ndGgpIHtcbiAgICByZXR1cm4gbmV3IEZhc3RCdWZmZXIodGFyZ2V0LmJ1ZmZlciwgdGFyZ2V0LmJ5dGVPZmZzZXQsIG9mZnNldCk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKipcbiAqIE1hc2tzIGEgYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBtYXNrLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBzb3VyY2UgVGhlIGJ1ZmZlciB0byBtYXNrXG4gKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayBUaGUgbWFzayB0byB1c2VcbiAqIEBwYXJhbSB7QnVmZmVyfSBvdXRwdXQgVGhlIGJ1ZmZlciB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IFRoZSBvZmZzZXQgYXQgd2hpY2ggdG8gc3RhcnQgd3JpdGluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIG1hc2suXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIF9tYXNrKHNvdXJjZSwgbWFzaywgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0W29mZnNldCArIGldID0gc291cmNlW2ldIF4gbWFza1tpICYgM107XG4gIH1cbn1cblxuLyoqXG4gKiBVbm1hc2tzIGEgYnVmZmVyIHVzaW5nIHRoZSBnaXZlbiBtYXNrLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byB1bm1hc2tcbiAqIEBwYXJhbSB7QnVmZmVyfSBtYXNrIFRoZSBtYXNrIHRvIHVzZVxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBfdW5tYXNrKGJ1ZmZlciwgbWFzaykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgIGJ1ZmZlcltpXSBePSBtYXNrW2kgJiAzXTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgYnVmZmVyIHRvIGFuIGBBcnJheUJ1ZmZlcmAuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZiBUaGUgYnVmZmVyIHRvIGNvbnZlcnRcbiAqIEByZXR1cm4ge0FycmF5QnVmZmVyfSBDb252ZXJ0ZWQgYnVmZmVyXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXlCdWZmZXIoYnVmKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBidWYuYnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICByZXR1cm4gYnVmLmJ1ZmZlcjtcbiAgfVxuXG4gIHJldHVybiBidWYuYnVmZmVyLnNsaWNlKGJ1Zi5ieXRlT2Zmc2V0LCBidWYuYnl0ZU9mZnNldCArIGJ1Zi5sZW5ndGgpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGBkYXRhYCB0byBhIGBCdWZmZXJgLlxuICpcbiAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgZGF0YSB0byBjb252ZXJ0XG4gKiBAcmV0dXJuIHtCdWZmZXJ9IFRoZSBidWZmZXJcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn1cbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gdG9CdWZmZXIoZGF0YSkge1xuICB0b0J1ZmZlci5yZWFkT25seSA9IHRydWU7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkgcmV0dXJuIGRhdGE7XG5cbiAgbGV0IGJ1ZjtcblxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgYnVmID0gbmV3IEZhc3RCdWZmZXIoZGF0YSk7XG4gIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpKSB7XG4gICAgYnVmID0gbmV3IEZhc3RCdWZmZXIoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKTtcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBCdWZmZXIuZnJvbShkYXRhKTtcbiAgICB0b0J1ZmZlci5yZWFkT25seSA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbmNhdCxcbiAgbWFzazogX21hc2ssXG4gIHRvQXJyYXlCdWZmZXIsXG4gIHRvQnVmZmVyLFxuICB1bm1hc2s6IF91bm1hc2tcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICAqL1xuaWYgKCFwcm9jZXNzLmVudi5XU19OT19CVUZGRVJfVVRJTCkge1xuICB0cnkge1xuICAgIGNvbnN0IGJ1ZmZlclV0aWwgPSByZXF1aXJlKCdidWZmZXJ1dGlsJyk7XG5cbiAgICBtb2R1bGUuZXhwb3J0cy5tYXNrID0gZnVuY3Rpb24gKHNvdXJjZSwgbWFzaywgb3V0cHV0LCBvZmZzZXQsIGxlbmd0aCkge1xuICAgICAgaWYgKGxlbmd0aCA8IDQ4KSBfbWFzayhzb3VyY2UsIG1hc2ssIG91dHB1dCwgb2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgZWxzZSBidWZmZXJVdGlsLm1hc2soc291cmNlLCBtYXNrLCBvdXRwdXQsIG9mZnNldCwgbGVuZ3RoKTtcbiAgICB9O1xuXG4gICAgbW9kdWxlLmV4cG9ydHMudW5tYXNrID0gZnVuY3Rpb24gKGJ1ZmZlciwgbWFzaykge1xuICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCAzMikgX3VubWFzayhidWZmZXIsIG1hc2spO1xuICAgICAgZWxzZSBidWZmZXJVdGlsLnVubWFzayhidWZmZXIsIG1hc2spO1xuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBDb250aW51ZSByZWdhcmRsZXNzIG9mIHRoZSBlcnJvci5cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBCSU5BUllfVFlQRVMgPSBbJ25vZGVidWZmZXInLCAnYXJyYXlidWZmZXInLCAnZnJhZ21lbnRzJ107XG5jb25zdCBoYXNCbG9iID0gdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnO1xuXG5pZiAoaGFzQmxvYikgQklOQVJZX1RZUEVTLnB1c2goJ2Jsb2InKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEJJTkFSWV9UWVBFUyxcbiAgRU1QVFlfQlVGRkVSOiBCdWZmZXIuYWxsb2MoMCksXG4gIEdVSUQ6ICcyNThFQUZBNS1FOTE0LTQ3REEtOTVDQS1DNUFCMERDODVCMTEnLFxuICBoYXNCbG9iLFxuICBrRm9yT25FdmVudEF0dHJpYnV0ZTogU3ltYm9sKCdrSXNGb3JPbkV2ZW50QXR0cmlidXRlJyksXG4gIGtMaXN0ZW5lcjogU3ltYm9sKCdrTGlzdGVuZXInKSxcbiAga1N0YXR1c0NvZGU6IFN5bWJvbCgnc3RhdHVzLWNvZGUnKSxcbiAga1dlYlNvY2tldDogU3ltYm9sKCd3ZWJzb2NrZXQnKSxcbiAgTk9PUDogKCkgPT4ge31cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsga0Zvck9uRXZlbnRBdHRyaWJ1dGUsIGtMaXN0ZW5lciB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcblxuY29uc3Qga0NvZGUgPSBTeW1ib2woJ2tDb2RlJyk7XG5jb25zdCBrRGF0YSA9IFN5bWJvbCgna0RhdGEnKTtcbmNvbnN0IGtFcnJvciA9IFN5bWJvbCgna0Vycm9yJyk7XG5jb25zdCBrTWVzc2FnZSA9IFN5bWJvbCgna01lc3NhZ2UnKTtcbmNvbnN0IGtSZWFzb24gPSBTeW1ib2woJ2tSZWFzb24nKTtcbmNvbnN0IGtUYXJnZXQgPSBTeW1ib2woJ2tUYXJnZXQnKTtcbmNvbnN0IGtUeXBlID0gU3ltYm9sKCdrVHlwZScpO1xuY29uc3Qga1dhc0NsZWFuID0gU3ltYm9sKCdrV2FzQ2xlYW4nKTtcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYW4gZXZlbnQuXG4gKi9cbmNsYXNzIEV2ZW50IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBgRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiB0aGUgYHR5cGVgIGFyZ3VtZW50IGlzIG5vdCBzcGVjaWZpZWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHR5cGUpIHtcbiAgICB0aGlzW2tUYXJnZXRdID0gbnVsbDtcbiAgICB0aGlzW2tUeXBlXSA9IHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUgeyp9XG4gICAqL1xuICBnZXQgdGFyZ2V0KCkge1xuICAgIHJldHVybiB0aGlzW2tUYXJnZXRdO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpc1trVHlwZV07XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50LnByb3RvdHlwZSwgJ3RhcmdldCcsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudC5wcm90b3R5cGUsICd0eXBlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIGNsb3NlIGV2ZW50LlxuICpcbiAqIEBleHRlbmRzIEV2ZW50XG4gKi9cbmNsYXNzIENsb3NlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYENsb3NlRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXG4gICAqICAgICBhdHRyaWJ1dGVzIHZpYSBvYmplY3QgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jb2RlPTBdIFRoZSBzdGF0dXMgY29kZSBleHBsYWluaW5nIHdoeSB0aGVcbiAgICogICAgIGNvbm5lY3Rpb24gd2FzIGNsb3NlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucmVhc29uPScnXSBBIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBleHBsYWluaW5nIHdoeVxuICAgKiAgICAgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLndhc0NsZWFuPWZhbHNlXSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlXG4gICAqICAgICBjb25uZWN0aW9uIHdhcyBjbGVhbmx5IGNsb3NlZFxuICAgKi9cbiAgY29uc3RydWN0b3IodHlwZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIodHlwZSk7XG5cbiAgICB0aGlzW2tDb2RlXSA9IG9wdGlvbnMuY29kZSA9PT0gdW5kZWZpbmVkID8gMCA6IG9wdGlvbnMuY29kZTtcbiAgICB0aGlzW2tSZWFzb25dID0gb3B0aW9ucy5yZWFzb24gPT09IHVuZGVmaW5lZCA/ICcnIDogb3B0aW9ucy5yZWFzb247XG4gICAgdGhpc1trV2FzQ2xlYW5dID0gb3B0aW9ucy53YXNDbGVhbiA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBvcHRpb25zLndhc0NsZWFuO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgY29kZSgpIHtcbiAgICByZXR1cm4gdGhpc1trQ29kZV07XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICovXG4gIGdldCByZWFzb24oKSB7XG4gICAgcmV0dXJuIHRoaXNba1JlYXNvbl07XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqL1xuICBnZXQgd2FzQ2xlYW4oKSB7XG4gICAgcmV0dXJuIHRoaXNba1dhc0NsZWFuXTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ2xvc2VFdmVudC5wcm90b3R5cGUsICdjb2RlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KENsb3NlRXZlbnQucHJvdG90eXBlLCAncmVhc29uJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KENsb3NlRXZlbnQucHJvdG90eXBlLCAnd2FzQ2xlYW4nLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGFuIGVycm9yIGV2ZW50LlxuICpcbiAqIEBleHRlbmRzIEV2ZW50XG4gKi9cbmNsYXNzIEVycm9yRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgYEVycm9yRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXG4gICAqICAgICBhdHRyaWJ1dGVzIHZpYSBvYmplY3QgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gW29wdGlvbnMuZXJyb3I9bnVsbF0gVGhlIGVycm9yIHRoYXQgZ2VuZXJhdGVkIHRoaXMgZXZlbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2U9JyddIFRoZSBlcnJvciBtZXNzYWdlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcih0eXBlKTtcblxuICAgIHRoaXNba0Vycm9yXSA9IG9wdGlvbnMuZXJyb3IgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBvcHRpb25zLmVycm9yO1xuICAgIHRoaXNba01lc3NhZ2VdID0gb3B0aW9ucy5tZXNzYWdlID09PSB1bmRlZmluZWQgPyAnJyA6IG9wdGlvbnMubWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7Kn1cbiAgICovXG4gIGdldCBlcnJvcigpIHtcbiAgICByZXR1cm4gdGhpc1trRXJyb3JdO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgbWVzc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpc1trTWVzc2FnZV07XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEVycm9yRXZlbnQucHJvdG90eXBlLCAnZXJyb3InLCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXJyb3JFdmVudC5wcm90b3R5cGUsICdtZXNzYWdlJywgeyBlbnVtZXJhYmxlOiB0cnVlIH0pO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBhIG1lc3NhZ2UgZXZlbnQuXG4gKlxuICogQGV4dGVuZHMgRXZlbnRcbiAqL1xuY2xhc3MgTWVzc2FnZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBNZXNzYWdlRXZlbnRgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHRoYXQgYWxsb3dzIGZvciBzZXR0aW5nXG4gICAqICAgICBhdHRyaWJ1dGVzIHZpYSBvYmplY3QgbWVtYmVycyBvZiB0aGUgc2FtZSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gW29wdGlvbnMuZGF0YT1udWxsXSBUaGUgbWVzc2FnZSBjb250ZW50XG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0eXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcih0eXBlKTtcblxuICAgIHRoaXNba0RhdGFdID0gb3B0aW9ucy5kYXRhID09PSB1bmRlZmluZWQgPyBudWxsIDogb3B0aW9ucy5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHsqfVxuICAgKi9cbiAgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXNba0RhdGFdO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNZXNzYWdlRXZlbnQucHJvdG90eXBlLCAnZGF0YScsIHsgZW51bWVyYWJsZTogdHJ1ZSB9KTtcblxuLyoqXG4gKiBUaGlzIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGVtdWxhdGluZyB0aGUgYEV2ZW50VGFyZ2V0YCBpbnRlcmZhY2UuIEl0J3Mgbm90XG4gKiBtZWFudCB0byBiZSB1c2VkIGRpcmVjdGx5LlxuICpcbiAqIEBtaXhpblxuICovXG5jb25zdCBFdmVudFRhcmdldCA9IHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGV2ZW50IHR5cGUgdG8gbGlzdGVuIGZvclxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnxPYmplY3QpfSBoYW5kbGVyIFRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBBbiBvcHRpb25zIG9iamVjdCBzcGVjaWZpZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0XG4gICAqICAgICB0aGUgZXZlbnQgbGlzdGVuZXJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5vbmNlPWZhbHNlXSBBIGBCb29sZWFuYCBpbmRpY2F0aW5nIHRoYXQgdGhlXG4gICAqICAgICBsaXN0ZW5lciBzaG91bGQgYmUgaW52b2tlZCBhdCBtb3N0IG9uY2UgYWZ0ZXIgYmVpbmcgYWRkZWQuIElmIGB0cnVlYCxcbiAgICogICAgIHRoZSBsaXN0ZW5lciB3b3VsZCBiZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiBpbnZva2VkLlxuICAgKiBAcHVibGljXG4gICAqL1xuICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnModHlwZSkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIW9wdGlvbnNba0Zvck9uRXZlbnRBdHRyaWJ1dGVdICYmXG4gICAgICAgIGxpc3RlbmVyW2tMaXN0ZW5lcl0gPT09IGhhbmRsZXIgJiZcbiAgICAgICAgIWxpc3RlbmVyW2tGb3JPbkV2ZW50QXR0cmlidXRlXVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgd3JhcHBlcjtcblxuICAgIGlmICh0eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgIHdyYXBwZXIgPSBmdW5jdGlvbiBvbk1lc3NhZ2UoZGF0YSwgaXNCaW5hcnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50KCdtZXNzYWdlJywge1xuICAgICAgICAgIGRhdGE6IGlzQmluYXJ5ID8gZGF0YSA6IGRhdGEudG9TdHJpbmcoKVxuICAgICAgICB9KTtcblxuICAgICAgICBldmVudFtrVGFyZ2V0XSA9IHRoaXM7XG4gICAgICAgIGNhbGxMaXN0ZW5lcihoYW5kbGVyLCB0aGlzLCBldmVudCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Nsb3NlJykge1xuICAgICAgd3JhcHBlciA9IGZ1bmN0aW9uIG9uQ2xvc2UoY29kZSwgbWVzc2FnZSkge1xuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDbG9zZUV2ZW50KCdjbG9zZScsIHtcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHJlYXNvbjogbWVzc2FnZS50b1N0cmluZygpLFxuICAgICAgICAgIHdhc0NsZWFuOiB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgJiYgdGhpcy5fY2xvc2VGcmFtZVNlbnRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXZlbnRba1RhcmdldF0gPSB0aGlzO1xuICAgICAgICBjYWxsTGlzdGVuZXIoaGFuZGxlciwgdGhpcywgZXZlbnQpO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgIHdyYXBwZXIgPSBmdW5jdGlvbiBvbkVycm9yKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEVycm9yRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXZlbnRba1RhcmdldF0gPSB0aGlzO1xuICAgICAgICBjYWxsTGlzdGVuZXIoaGFuZGxlciwgdGhpcywgZXZlbnQpO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvcGVuJykge1xuICAgICAgd3JhcHBlciA9IGZ1bmN0aW9uIG9uT3BlbigpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ29wZW4nKTtcblxuICAgICAgICBldmVudFtrVGFyZ2V0XSA9IHRoaXM7XG4gICAgICAgIGNhbGxMaXN0ZW5lcihoYW5kbGVyLCB0aGlzLCBldmVudCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd3JhcHBlcltrRm9yT25FdmVudEF0dHJpYnV0ZV0gPSAhIW9wdGlvbnNba0Zvck9uRXZlbnRBdHRyaWJ1dGVdO1xuICAgIHdyYXBwZXJba0xpc3RlbmVyXSA9IGhhbmRsZXI7XG5cbiAgICBpZiAob3B0aW9ucy5vbmNlKSB7XG4gICAgICB0aGlzLm9uY2UodHlwZSwgd3JhcHBlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub24odHlwZSwgd3JhcHBlcik7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXZlbnQgdHlwZSB0byByZW1vdmVcbiAgICogQHBhcmFtIHsoRnVuY3Rpb258T2JqZWN0KX0gaGFuZGxlciBUaGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlcikge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnModHlwZSkpIHtcbiAgICAgIGlmIChsaXN0ZW5lcltrTGlzdGVuZXJdID09PSBoYW5kbGVyICYmICFsaXN0ZW5lcltrRm9yT25FdmVudEF0dHJpYnV0ZV0pIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENsb3NlRXZlbnQsXG4gIEVycm9yRXZlbnQsXG4gIEV2ZW50LFxuICBFdmVudFRhcmdldCxcbiAgTWVzc2FnZUV2ZW50XG59O1xuXG4vKipcbiAqIENhbGwgYW4gZXZlbnQgbGlzdGVuZXJcbiAqXG4gKiBAcGFyYW0geyhGdW5jdGlvbnxPYmplY3QpfSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgdG8gY2FsbFxuICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSB2YWx1ZSB0byB1c2UgYXMgYHRoaXNgYCB3aGVuIGNhbGxpbmcgdGhlIGxpc3RlbmVyXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gcGFzcyB0byB0aGUgbGlzdGVuZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGxMaXN0ZW5lcihsaXN0ZW5lciwgdGhpc0FyZywgZXZlbnQpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciA9PT0gJ29iamVjdCcgJiYgbGlzdGVuZXIuaGFuZGxlRXZlbnQpIHtcbiAgICBsaXN0ZW5lci5oYW5kbGVFdmVudC5jYWxsKGxpc3RlbmVyLCBldmVudCk7XG4gIH0gZWxzZSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzQXJnLCBldmVudCk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyB0b2tlbkNoYXJzIH0gPSByZXF1aXJlKCcuL3ZhbGlkYXRpb24nKTtcblxuLyoqXG4gKiBBZGRzIGFuIG9mZmVyIHRvIHRoZSBtYXAgb2YgZXh0ZW5zaW9uIG9mZmVycyBvciBhIHBhcmFtZXRlciB0byB0aGUgbWFwIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZXN0IFRoZSBtYXAgb2YgZXh0ZW5zaW9uIG9mZmVycyBvciBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgZXh0ZW5zaW9uIG9yIHBhcmFtZXRlciBuYW1lXG4gKiBAcGFyYW0geyhPYmplY3R8Qm9vbGVhbnxTdHJpbmcpfSBlbGVtIFRoZSBleHRlbnNpb24gcGFyYW1ldGVycyBvciB0aGVcbiAqICAgICBwYXJhbWV0ZXIgdmFsdWVcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHB1c2goZGVzdCwgbmFtZSwgZWxlbSkge1xuICBpZiAoZGVzdFtuYW1lXSA9PT0gdW5kZWZpbmVkKSBkZXN0W25hbWVdID0gW2VsZW1dO1xuICBlbHNlIGRlc3RbbmFtZV0ucHVzaChlbGVtKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnNgIGhlYWRlciBpbnRvIGFuIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyIFRoZSBmaWVsZCB2YWx1ZSBvZiB0aGUgaGVhZGVyXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBwYXJzZWQgb2JqZWN0XG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIHBhcnNlKGhlYWRlcikge1xuICBjb25zdCBvZmZlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBsZXQgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgbGV0IG11c3RVbmVzY2FwZSA9IGZhbHNlO1xuICBsZXQgaXNFc2NhcGluZyA9IGZhbHNlO1xuICBsZXQgaW5RdW90ZXMgPSBmYWxzZTtcbiAgbGV0IGV4dGVuc2lvbk5hbWU7XG4gIGxldCBwYXJhbU5hbWU7XG4gIGxldCBzdGFydCA9IC0xO1xuICBsZXQgY29kZSA9IC0xO1xuICBsZXQgZW5kID0gLTE7XG4gIGxldCBpID0gMDtcblxuICBmb3IgKDsgaSA8IGhlYWRlci5sZW5ndGg7IGkrKykge1xuICAgIGNvZGUgPSBoZWFkZXIuY2hhckNvZGVBdChpKTtcblxuICAgIGlmIChleHRlbnNpb25OYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChlbmQgPT09IC0xICYmIHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSAtMSkgc3RhcnQgPSBpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaSAhPT0gMCAmJlxuICAgICAgICAoY29kZSA9PT0gMHgyMCAvKiAnICcgKi8gfHwgY29kZSA9PT0gMHgwOSkgLyogJ1xcdCcgKi9cbiAgICAgICkge1xuICAgICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4M2IgLyogJzsnICovIHx8IGNvZGUgPT09IDB4MmMgLyogJywnICovKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICAgICAgICBjb25zdCBuYW1lID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgICBpZiAoY29kZSA9PT0gMHgyYykge1xuICAgICAgICAgIHB1c2gob2ZmZXJzLCBuYW1lLCBwYXJhbXMpO1xuICAgICAgICAgIHBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IG5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydCA9IGVuZCA9IC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwYXJhbU5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVuZCA9PT0gLTEgJiYgdG9rZW5DaGFyc1tjb2RlXSA9PT0gMSkge1xuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4MjAgfHwgY29kZSA9PT0gMHgwOSkge1xuICAgICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKGNvZGUgPT09IDB4M2IgfHwgY29kZSA9PT0gMHgyYykge1xuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhdCBpbmRleCAke2l9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kID09PSAtMSkgZW5kID0gaTtcbiAgICAgICAgcHVzaChwYXJhbXMsIGhlYWRlci5zbGljZShzdGFydCwgZW5kKSwgdHJ1ZSk7XG4gICAgICAgIGlmIChjb2RlID09PSAweDJjKSB7XG4gICAgICAgICAgcHVzaChvZmZlcnMsIGV4dGVuc2lvbk5hbWUsIHBhcmFtcyk7XG4gICAgICAgICAgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBleHRlbnNpb25OYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBlbmQgPSAtMTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgzZCAvKiAnPScgKi8gJiYgc3RhcnQgIT09IC0xICYmIGVuZCA9PT0gLTEpIHtcbiAgICAgICAgcGFyYW1OYW1lID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBpKTtcbiAgICAgICAgc3RhcnQgPSBlbmQgPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYXQgaW5kZXggJHtpfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgLy8gVGhlIHZhbHVlIG9mIGEgcXVvdGVkLXN0cmluZyBhZnRlciB1bmVzY2FwaW5nIG11c3QgY29uZm9ybSB0byB0aGVcbiAgICAgIC8vIHRva2VuIEFCTkYsIHNvIG9ubHkgdG9rZW4gY2hhcmFjdGVycyBhcmUgdmFsaWQuXG4gICAgICAvLyBSZWY6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NDU1I3NlY3Rpb24tOS4xXG4gICAgICAvL1xuICAgICAgaWYgKGlzRXNjYXBpbmcpIHtcbiAgICAgICAgaWYgKHRva2VuQ2hhcnNbY29kZV0gIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICAgIGVsc2UgaWYgKCFtdXN0VW5lc2NhcGUpIG11c3RVbmVzY2FwZSA9IHRydWU7XG4gICAgICAgIGlzRXNjYXBpbmcgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoaW5RdW90ZXMpIHtcbiAgICAgICAgaWYgKHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcbiAgICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgyMiAvKiAnXCInICovICYmIHN0YXJ0ICE9PSAtMSkge1xuICAgICAgICAgIGluUXVvdGVzID0gZmFsc2U7XG4gICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDVjIC8qICdcXCcgKi8pIHtcbiAgICAgICAgICBpc0VzY2FwaW5nID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb2RlID09PSAweDIyICYmIGhlYWRlci5jaGFyQ29kZUF0KGkgLSAxKSA9PT0gMHgzZCkge1xuICAgICAgICBpblF1b3RlcyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGVuZCA9PT0gLTEgJiYgdG9rZW5DaGFyc1tjb2RlXSA9PT0gMSkge1xuICAgICAgICBpZiAoc3RhcnQgPT09IC0xKSBzdGFydCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXJ0ICE9PSAtMSAmJiAoY29kZSA9PT0gMHgyMCB8fCBjb2RlID09PSAweDA5KSkge1xuICAgICAgICBpZiAoZW5kID09PSAtMSkgZW5kID0gaTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gMHgzYiB8fCBjb2RlID09PSAweDJjKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICAgICAgICBsZXQgdmFsdWUgPSBoZWFkZXIuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgIGlmIChtdXN0VW5lc2NhcGUpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcXFwvZywgJycpO1xuICAgICAgICAgIG11c3RVbmVzY2FwZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHB1c2gocGFyYW1zLCBwYXJhbU5hbWUsIHZhbHVlKTtcbiAgICAgICAgaWYgKGNvZGUgPT09IDB4MmMpIHtcbiAgICAgICAgICBwdXNoKG9mZmVycywgZXh0ZW5zaW9uTmFtZSwgcGFyYW1zKTtcbiAgICAgICAgICBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGV4dGVuc2lvbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJhbU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHN0YXJ0ID0gZW5kID0gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGluUXVvdGVzIHx8IGNvZGUgPT09IDB4MjAgfHwgY29kZSA9PT0gMHgwOSkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQnKTtcbiAgfVxuXG4gIGlmIChlbmQgPT09IC0xKSBlbmQgPSBpO1xuICBjb25zdCB0b2tlbiA9IGhlYWRlci5zbGljZShzdGFydCwgZW5kKTtcbiAgaWYgKGV4dGVuc2lvbk5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHB1c2gob2ZmZXJzLCB0b2tlbiwgcGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocGFyYW1OYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHB1c2gocGFyYW1zLCB0b2tlbiwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChtdXN0VW5lc2NhcGUpIHtcbiAgICAgIHB1c2gocGFyYW1zLCBwYXJhbU5hbWUsIHRva2VuLnJlcGxhY2UoL1xcXFwvZywgJycpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHVzaChwYXJhbXMsIHBhcmFtTmFtZSwgdG9rZW4pO1xuICAgIH1cbiAgICBwdXNoKG9mZmVycywgZXh0ZW5zaW9uTmFtZSwgcGFyYW1zKTtcbiAgfVxuXG4gIHJldHVybiBvZmZlcnM7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zYCBoZWFkZXIgZmllbGQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGV4dGVuc2lvbnMgVGhlIG1hcCBvZiBleHRlbnNpb25zIGFuZCBwYXJhbWV0ZXJzIHRvIGZvcm1hdFxuICogQHJldHVybiB7U3RyaW5nfSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIG9iamVjdFxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBmb3JtYXQoZXh0ZW5zaW9ucykge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZXh0ZW5zaW9ucylcbiAgICAubWFwKChleHRlbnNpb24pID0+IHtcbiAgICAgIGxldCBjb25maWd1cmF0aW9ucyA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWd1cmF0aW9ucykpIGNvbmZpZ3VyYXRpb25zID0gW2NvbmZpZ3VyYXRpb25zXTtcbiAgICAgIHJldHVybiBjb25maWd1cmF0aW9uc1xuICAgICAgICAubWFwKChwYXJhbXMpID0+IHtcbiAgICAgICAgICByZXR1cm4gW2V4dGVuc2lvbl1cbiAgICAgICAgICAgIC5jb25jYXQoXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IHBhcmFtc1trXTtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkgdmFsdWVzID0gW3ZhbHVlc107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgLm1hcCgodikgPT4gKHYgPT09IHRydWUgPyBrIDogYCR7a309JHt2fWApKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oJzsgJyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbignOyAnKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgfSlcbiAgICAuam9pbignLCAnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7IGZvcm1hdCwgcGFyc2UgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3Qga0RvbmUgPSBTeW1ib2woJ2tEb25lJyk7XG5jb25zdCBrUnVuID0gU3ltYm9sKCdrUnVuJyk7XG5cbi8qKlxuICogQSB2ZXJ5IHNpbXBsZSBqb2IgcXVldWUgd2l0aCBhZGp1c3RhYmxlIGNvbmN1cnJlbmN5LiBBZGFwdGVkIGZyb21cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9TVFJNTC9hc3luYy1saW1pdGVyXG4gKi9cbmNsYXNzIExpbWl0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBgTGltaXRlcmAuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbY29uY3VycmVuY3k9SW5maW5pdHldIFRoZSBtYXhpbXVtIG51bWJlciBvZiBqb2JzIGFsbG93ZWRcbiAgICogICAgIHRvIHJ1biBjb25jdXJyZW50bHlcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmN1cnJlbmN5KSB7XG4gICAgdGhpc1trRG9uZV0gPSAoKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmctLTtcbiAgICAgIHRoaXNba1J1bl0oKTtcbiAgICB9O1xuICAgIHRoaXMuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeSB8fCBJbmZpbml0eTtcbiAgICB0aGlzLmpvYnMgPSBbXTtcbiAgICB0aGlzLnBlbmRpbmcgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBqb2IgdG8gdGhlIHF1ZXVlLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBqb2IgVGhlIGpvYiB0byBydW5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgYWRkKGpvYikge1xuICAgIHRoaXMuam9icy5wdXNoKGpvYik7XG4gICAgdGhpc1trUnVuXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBqb2IgZnJvbSB0aGUgcXVldWUgYW5kIHJ1bnMgaXQgaWYgcG9zc2libGUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBba1J1bl0oKSB7XG4gICAgaWYgKHRoaXMucGVuZGluZyA9PT0gdGhpcy5jb25jdXJyZW5jeSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuam9icy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGpvYiA9IHRoaXMuam9icy5zaGlmdCgpO1xuXG4gICAgICB0aGlzLnBlbmRpbmcrKztcbiAgICAgIGpvYih0aGlzW2tEb25lXSk7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTGltaXRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcblxuY29uc3QgYnVmZmVyVXRpbCA9IHJlcXVpcmUoJy4vYnVmZmVyLXV0aWwnKTtcbmNvbnN0IExpbWl0ZXIgPSByZXF1aXJlKCcuL2xpbWl0ZXInKTtcbmNvbnN0IHsga1N0YXR1c0NvZGUgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbmNvbnN0IEZhc3RCdWZmZXIgPSBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdO1xuY29uc3QgVFJBSUxFUiA9IEJ1ZmZlci5mcm9tKFsweDAwLCAweDAwLCAweGZmLCAweGZmXSk7XG5jb25zdCBrUGVyTWVzc2FnZURlZmxhdGUgPSBTeW1ib2woJ3Blcm1lc3NhZ2UtZGVmbGF0ZScpO1xuY29uc3Qga1RvdGFsTGVuZ3RoID0gU3ltYm9sKCd0b3RhbC1sZW5ndGgnKTtcbmNvbnN0IGtDYWxsYmFjayA9IFN5bWJvbCgnY2FsbGJhY2snKTtcbmNvbnN0IGtCdWZmZXJzID0gU3ltYm9sKCdidWZmZXJzJyk7XG5jb25zdCBrRXJyb3IgPSBTeW1ib2woJ2Vycm9yJyk7XG5cbi8vXG4vLyBXZSBsaW1pdCB6bGliIGNvbmN1cnJlbmN5LCB3aGljaCBwcmV2ZW50cyBzZXZlcmUgbWVtb3J5IGZyYWdtZW50YXRpb25cbi8vIGFzIGRvY3VtZW50ZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy84ODcxI2lzc3VlY29tbWVudC0yNTA5MTU5MTNcbi8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vd2Vic29ja2V0cy93cy9pc3N1ZXMvMTIwMlxuLy9cbi8vIEludGVudGlvbmFsbHkgZ2xvYmFsOyBpdCdzIHRoZSBnbG9iYWwgdGhyZWFkIHBvb2wgdGhhdCdzIGFuIGlzc3VlLlxuLy9cbmxldCB6bGliTGltaXRlcjtcblxuLyoqXG4gKiBwZXJtZXNzYWdlLWRlZmxhdGUgaW1wbGVtZW50YXRpb24uXG4gKi9cbmNsYXNzIFBlck1lc3NhZ2VEZWZsYXRlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBQZXJNZXNzYWdlRGVmbGF0ZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBDb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHsoQm9vbGVhbnxOdW1iZXIpfSBbb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzXSBBZHZlcnRpc2Ugc3VwcG9ydFxuICAgKiAgICAgZm9yLCBvciByZXF1ZXN0LCBhIGN1c3RvbSBjbGllbnQgd2luZG93IHNpemVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGllbnROb0NvbnRleHRUYWtlb3Zlcj1mYWxzZV0gQWR2ZXJ0aXNlL1xuICAgKiAgICAgYWNrbm93bGVkZ2UgZGlzYWJsaW5nIG9mIGNsaWVudCBjb250ZXh0IHRha2VvdmVyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jb25jdXJyZW5jeUxpbWl0PTEwXSBUaGUgbnVtYmVyIG9mIGNvbmN1cnJlbnRcbiAgICogICAgIGNhbGxzIHRvIHpsaWJcbiAgICogQHBhcmFtIHsoQm9vbGVhbnxOdW1iZXIpfSBbb3B0aW9ucy5zZXJ2ZXJNYXhXaW5kb3dCaXRzXSBSZXF1ZXN0L2NvbmZpcm0gdGhlXG4gICAqICAgICB1c2Ugb2YgYSBjdXN0b20gc2VydmVyIHdpbmRvdyBzaXplXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2VydmVyTm9Db250ZXh0VGFrZW92ZXI9ZmFsc2VdIFJlcXVlc3QvYWNjZXB0XG4gICAqICAgICBkaXNhYmxpbmcgb2Ygc2VydmVyIGNvbnRleHQgdGFrZW92ZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnRocmVzaG9sZD0xMDI0XSBTaXplIChpbiBieXRlcykgYmVsb3cgd2hpY2hcbiAgICogICAgIG1lc3NhZ2VzIHNob3VsZCBub3QgYmUgY29tcHJlc3NlZCBpZiBjb250ZXh0IHRha2VvdmVyIGlzIGRpc2FibGVkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy56bGliRGVmbGF0ZU9wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB6bGliIG9uXG4gICAqICAgICBkZWZsYXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy56bGliSW5mbGF0ZU9wdGlvbnNdIE9wdGlvbnMgdG8gcGFzcyB0byB6bGliIG9uXG4gICAqICAgICBpbmZsYXRlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2lzU2VydmVyPWZhbHNlXSBDcmVhdGUgdGhlIGluc3RhbmNlIGluIGVpdGhlciBzZXJ2ZXIgb3JcbiAgICogICAgIGNsaWVudCBtb2RlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbbWF4UGF5bG9hZD0wXSBUaGUgbWF4aW11bSBhbGxvd2VkIG1lc3NhZ2UgbGVuZ3RoXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zLCBpc1NlcnZlciwgbWF4UGF5bG9hZCkge1xuICAgIHRoaXMuX21heFBheWxvYWQgPSBtYXhQYXlsb2FkIHwgMDtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLl90aHJlc2hvbGQgPVxuICAgICAgdGhpcy5fb3B0aW9ucy50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHRoaXMuX29wdGlvbnMudGhyZXNob2xkIDogMTAyNDtcbiAgICB0aGlzLl9pc1NlcnZlciA9ICEhaXNTZXJ2ZXI7XG4gICAgdGhpcy5fZGVmbGF0ZSA9IG51bGw7XG4gICAgdGhpcy5faW5mbGF0ZSA9IG51bGw7XG5cbiAgICB0aGlzLnBhcmFtcyA9IG51bGw7XG5cbiAgICBpZiAoIXpsaWJMaW1pdGVyKSB7XG4gICAgICBjb25zdCBjb25jdXJyZW5jeSA9XG4gICAgICAgIHRoaXMuX29wdGlvbnMuY29uY3VycmVuY3lMaW1pdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB0aGlzLl9vcHRpb25zLmNvbmN1cnJlbmN5TGltaXRcbiAgICAgICAgICA6IDEwO1xuICAgICAgemxpYkxpbWl0ZXIgPSBuZXcgTGltaXRlcihjb25jdXJyZW5jeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0IGV4dGVuc2lvbk5hbWUoKSB7XG4gICAgcmV0dXJuICdwZXJtZXNzYWdlLWRlZmxhdGUnO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBleHRlbnNpb24gbmVnb3RpYXRpb24gb2ZmZXIuXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gRXh0ZW5zaW9uIHBhcmFtZXRlcnNcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgb2ZmZXIoKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5zZXJ2ZXJOb0NvbnRleHRUYWtlb3Zlcikge1xuICAgICAgcGFyYW1zLnNlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wdGlvbnMuY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIpIHtcbiAgICAgIHBhcmFtcy5jbGllbnRfbm9fY29udGV4dF90YWtlb3ZlciA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcHRpb25zLnNlcnZlck1heFdpbmRvd0JpdHMpIHtcbiAgICAgIHBhcmFtcy5zZXJ2ZXJfbWF4X3dpbmRvd19iaXRzID0gdGhpcy5fb3B0aW9ucy5zZXJ2ZXJNYXhXaW5kb3dCaXRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzKSB7XG4gICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA9IHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cztcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cyA9PSBudWxsKSB7XG4gICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQgYW4gZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVyL3Jlc3BvbnNlLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBjb25maWd1cmF0aW9ucyBUaGUgZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVycy9yZXBvbnNlXG4gICAqIEByZXR1cm4ge09iamVjdH0gQWNjZXB0ZWQgY29uZmlndXJhdGlvblxuICAgKiBAcHVibGljXG4gICAqL1xuICBhY2NlcHQoY29uZmlndXJhdGlvbnMpIHtcbiAgICBjb25maWd1cmF0aW9ucyA9IHRoaXMubm9ybWFsaXplUGFyYW1zKGNvbmZpZ3VyYXRpb25zKTtcblxuICAgIHRoaXMucGFyYW1zID0gdGhpcy5faXNTZXJ2ZXJcbiAgICAgID8gdGhpcy5hY2NlcHRBc1NlcnZlcihjb25maWd1cmF0aW9ucylcbiAgICAgIDogdGhpcy5hY2NlcHRBc0NsaWVudChjb25maWd1cmF0aW9ucyk7XG5cbiAgICByZXR1cm4gdGhpcy5wYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBleHRlbnNpb24uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMuX2luZmxhdGUpIHtcbiAgICAgIHRoaXMuX2luZmxhdGUuY2xvc2UoKTtcbiAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kZWZsYXRlKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuX2RlZmxhdGVba0NhbGxiYWNrXTtcblxuICAgICAgdGhpcy5fZGVmbGF0ZS5jbG9zZSgpO1xuICAgICAgdGhpcy5fZGVmbGF0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayhcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVGhlIGRlZmxhdGUgc3RyZWFtIHdhcyBjbG9zZWQgd2hpbGUgZGF0YSB3YXMgYmVpbmcgcHJvY2Vzc2VkJ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogIEFjY2VwdCBhbiBleHRlbnNpb24gbmVnb3RpYXRpb24gb2ZmZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IG9mZmVycyBUaGUgZXh0ZW5zaW9uIG5lZ290aWF0aW9uIG9mZmVyc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IEFjY2VwdGVkIGNvbmZpZ3VyYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFjY2VwdEFzU2VydmVyKG9mZmVycykge1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9vcHRpb25zO1xuICAgIGNvbnN0IGFjY2VwdGVkID0gb2ZmZXJzLmZpbmQoKHBhcmFtcykgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAob3B0cy5zZXJ2ZXJOb0NvbnRleHRUYWtlb3ZlciA9PT0gZmFsc2UgJiZcbiAgICAgICAgICBwYXJhbXMuc2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXIpIHx8XG4gICAgICAgIChwYXJhbXMuc2VydmVyX21heF93aW5kb3dfYml0cyAmJlxuICAgICAgICAgIChvcHRzLnNlcnZlck1heFdpbmRvd0JpdHMgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICAodHlwZW9mIG9wdHMuc2VydmVyTWF4V2luZG93Qml0cyA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgb3B0cy5zZXJ2ZXJNYXhXaW5kb3dCaXRzID4gcGFyYW1zLnNlcnZlcl9tYXhfd2luZG93X2JpdHMpKSkgfHxcbiAgICAgICAgKHR5cGVvZiBvcHRzLmNsaWVudE1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgIXBhcmFtcy5jbGllbnRfbWF4X3dpbmRvd19iaXRzKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBpZiAoIWFjY2VwdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vbmUgb2YgdGhlIGV4dGVuc2lvbiBvZmZlcnMgY2FuIGJlIGFjY2VwdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdHMuc2VydmVyTm9Db250ZXh0VGFrZW92ZXIpIHtcbiAgICAgIGFjY2VwdGVkLnNlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9wdHMuY2xpZW50Tm9Db250ZXh0VGFrZW92ZXIpIHtcbiAgICAgIGFjY2VwdGVkLmNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRzLnNlcnZlck1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInKSB7XG4gICAgICBhY2NlcHRlZC5zZXJ2ZXJfbWF4X3dpbmRvd19iaXRzID0gb3B0cy5zZXJ2ZXJNYXhXaW5kb3dCaXRzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMuY2xpZW50TWF4V2luZG93Qml0cyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFjY2VwdGVkLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPSBvcHRzLmNsaWVudE1heFdpbmRvd0JpdHM7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGFjY2VwdGVkLmNsaWVudF9tYXhfd2luZG93X2JpdHMgPT09IHRydWUgfHxcbiAgICAgIG9wdHMuY2xpZW50TWF4V2luZG93Qml0cyA9PT0gZmFsc2VcbiAgICApIHtcbiAgICAgIGRlbGV0ZSBhY2NlcHRlZC5jbGllbnRfbWF4X3dpbmRvd19iaXRzO1xuICAgIH1cblxuICAgIHJldHVybiBhY2NlcHRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQgdGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gcmVzcG9uc2UgVGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiByZXNwb25zZVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IEFjY2VwdGVkIGNvbmZpZ3VyYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGFjY2VwdEFzQ2xpZW50KHJlc3BvbnNlKSB7XG4gICAgY29uc3QgcGFyYW1zID0gcmVzcG9uc2VbMF07XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9vcHRpb25zLmNsaWVudE5vQ29udGV4dFRha2VvdmVyID09PSBmYWxzZSAmJlxuICAgICAgcGFyYW1zLmNsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgcGFyYW1ldGVyIFwiY2xpZW50X25vX2NvbnRleHRfdGFrZW92ZXJcIicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmNsaWVudF9tYXhfd2luZG93X2JpdHMpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzID09PSAnbnVtYmVyJykge1xuICAgICAgICBwYXJhbXMuY2xpZW50X21heF93aW5kb3dfYml0cyA9IHRoaXMuX29wdGlvbnMuY2xpZW50TWF4V2luZG93Qml0cztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzID09PSBmYWxzZSB8fFxuICAgICAgKHR5cGVvZiB0aGlzLl9vcHRpb25zLmNsaWVudE1heFdpbmRvd0JpdHMgPT09ICdudW1iZXInICYmXG4gICAgICAgIHBhcmFtcy5jbGllbnRfbWF4X3dpbmRvd19iaXRzID4gdGhpcy5fb3B0aW9ucy5jbGllbnRNYXhXaW5kb3dCaXRzKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVW5leHBlY3RlZCBvciBpbnZhbGlkIHBhcmFtZXRlciBcImNsaWVudF9tYXhfd2luZG93X2JpdHNcIidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gY29uZmlndXJhdGlvbnMgVGhlIGV4dGVuc2lvbiBuZWdvdGlhdGlvbiBvZmZlcnMvcmVwb25zZVxuICAgKiBAcmV0dXJuIHtBcnJheX0gVGhlIG9mZmVycy9yZXNwb25zZSB3aXRoIG5vcm1hbGl6ZWQgcGFyYW1ldGVyc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbm9ybWFsaXplUGFyYW1zKGNvbmZpZ3VyYXRpb25zKSB7XG4gICAgY29uZmlndXJhdGlvbnMuZm9yRWFjaCgocGFyYW1zKSA9PiB7XG4gICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJhbXNba2V5XTtcblxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyIFwiJHtrZXl9XCIgbXVzdCBoYXZlIG9ubHkgYSBzaW5nbGUgdmFsdWVgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gdmFsdWVbMF07XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ2NsaWVudF9tYXhfd2luZG93X2JpdHMnKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBudW0gPSArdmFsdWU7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobnVtKSB8fCBudW0gPCA4IHx8IG51bSA+IDE1KSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYEludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciBcIiR7a2V5fVwiOiAke3ZhbHVlfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gbnVtO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzU2VydmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyIFwiJHtrZXl9XCI6ICR7dmFsdWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnc2VydmVyX21heF93aW5kb3dfYml0cycpIHtcbiAgICAgICAgICBjb25zdCBudW0gPSArdmFsdWU7XG4gICAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG51bSkgfHwgbnVtIDwgOCB8fCBudW0gPiAxNSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgYEludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciBcIiR7a2V5fVwiOiAke3ZhbHVlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhbHVlID0gbnVtO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGtleSA9PT0gJ2NsaWVudF9ub19jb250ZXh0X3Rha2VvdmVyJyB8fFxuICAgICAgICAgIGtleSA9PT0gJ3NlcnZlcl9ub19jb250ZXh0X3Rha2VvdmVyJ1xuICAgICAgICApIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXIgXCIke2tleX1cIjogJHt2YWx1ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcGFyYW1ldGVyIFwiJHtrZXl9XCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhcmFtc1trZXldID0gdmFsdWU7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjb25maWd1cmF0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvbXByZXNzIGRhdGEuIENvbmN1cnJlbmN5IGxpbWl0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIENvbXByZXNzZWQgZGF0YVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBkZWNvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICB6bGliTGltaXRlci5hZGQoKGRvbmUpID0+IHtcbiAgICAgIHRoaXMuX2RlY29tcHJlc3MoZGF0YSwgZmluLCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wcmVzcyBkYXRhLiBDb25jdXJyZW5jeSBsaW1pdGVkLlxuICAgKlxuICAgKiBAcGFyYW0geyhCdWZmZXJ8U3RyaW5nKX0gZGF0YSBEYXRhIHRvIGNvbXByZXNzXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZmluIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIHRoZSBsYXN0IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICB6bGliTGltaXRlci5hZGQoKGRvbmUpID0+IHtcbiAgICAgIHRoaXMuX2NvbXByZXNzKGRhdGEsIGZpbiwgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb21wcmVzcyBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBDb21wcmVzc2VkIGRhdGFcbiAgICogQHBhcmFtIHtCb29sZWFufSBmaW4gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgdGhlIGxhc3QgZnJhZ21lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kZWNvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuX2lzU2VydmVyID8gJ2NsaWVudCcgOiAnc2VydmVyJztcblxuICAgIGlmICghdGhpcy5faW5mbGF0ZSkge1xuICAgICAgY29uc3Qga2V5ID0gYCR7ZW5kcG9pbnR9X21heF93aW5kb3dfYml0c2A7XG4gICAgICBjb25zdCB3aW5kb3dCaXRzID1cbiAgICAgICAgdHlwZW9mIHRoaXMucGFyYW1zW2tleV0gIT09ICdudW1iZXInXG4gICAgICAgICAgPyB6bGliLlpfREVGQVVMVF9XSU5ET1dCSVRTXG4gICAgICAgICAgOiB0aGlzLnBhcmFtc1trZXldO1xuXG4gICAgICB0aGlzLl9pbmZsYXRlID0gemxpYi5jcmVhdGVJbmZsYXRlUmF3KHtcbiAgICAgICAgLi4udGhpcy5fb3B0aW9ucy56bGliSW5mbGF0ZU9wdGlvbnMsXG4gICAgICAgIHdpbmRvd0JpdHNcbiAgICAgIH0pO1xuICAgICAgdGhpcy5faW5mbGF0ZVtrUGVyTWVzc2FnZURlZmxhdGVdID0gdGhpcztcbiAgICAgIHRoaXMuX2luZmxhdGVba1RvdGFsTGVuZ3RoXSA9IDA7XG4gICAgICB0aGlzLl9pbmZsYXRlW2tCdWZmZXJzXSA9IFtdO1xuICAgICAgdGhpcy5faW5mbGF0ZS5vbignZXJyb3InLCBpbmZsYXRlT25FcnJvcik7XG4gICAgICB0aGlzLl9pbmZsYXRlLm9uKCdkYXRhJywgaW5mbGF0ZU9uRGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5faW5mbGF0ZVtrQ2FsbGJhY2tdID0gY2FsbGJhY2s7XG5cbiAgICB0aGlzLl9pbmZsYXRlLndyaXRlKGRhdGEpO1xuICAgIGlmIChmaW4pIHRoaXMuX2luZmxhdGUud3JpdGUoVFJBSUxFUik7XG5cbiAgICB0aGlzLl9pbmZsYXRlLmZsdXNoKCgpID0+IHtcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuX2luZmxhdGVba0Vycm9yXTtcblxuICAgICAgaWYgKGVycikge1xuICAgICAgICB0aGlzLl9pbmZsYXRlLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBidWZmZXJVdGlsLmNvbmNhdChcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrQnVmZmVyc10sXG4gICAgICAgIHRoaXMuX2luZmxhdGVba1RvdGFsTGVuZ3RoXVxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuX2luZmxhdGUuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCkge1xuICAgICAgICB0aGlzLl9pbmZsYXRlLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuX2luZmxhdGUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrVG90YWxMZW5ndGhdID0gMDtcbiAgICAgICAgdGhpcy5faW5mbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgICBpZiAoZmluICYmIHRoaXMucGFyYW1zW2Ake2VuZHBvaW50fV9ub19jb250ZXh0X3Rha2VvdmVyYF0pIHtcbiAgICAgICAgICB0aGlzLl9pbmZsYXRlLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHJlc3MgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHsoQnVmZmVyfFN0cmluZyl9IGRhdGEgRGF0YSB0byBjb21wcmVzc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NvbXByZXNzKGRhdGEsIGZpbiwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuX2lzU2VydmVyID8gJ3NlcnZlcicgOiAnY2xpZW50JztcblxuICAgIGlmICghdGhpcy5fZGVmbGF0ZSkge1xuICAgICAgY29uc3Qga2V5ID0gYCR7ZW5kcG9pbnR9X21heF93aW5kb3dfYml0c2A7XG4gICAgICBjb25zdCB3aW5kb3dCaXRzID1cbiAgICAgICAgdHlwZW9mIHRoaXMucGFyYW1zW2tleV0gIT09ICdudW1iZXInXG4gICAgICAgICAgPyB6bGliLlpfREVGQVVMVF9XSU5ET1dCSVRTXG4gICAgICAgICAgOiB0aGlzLnBhcmFtc1trZXldO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlID0gemxpYi5jcmVhdGVEZWZsYXRlUmF3KHtcbiAgICAgICAgLi4udGhpcy5fb3B0aW9ucy56bGliRGVmbGF0ZU9wdGlvbnMsXG4gICAgICAgIHdpbmRvd0JpdHNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF0gPSAwO1xuICAgICAgdGhpcy5fZGVmbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgdGhpcy5fZGVmbGF0ZS5vbignZGF0YScsIGRlZmxhdGVPbkRhdGEpO1xuICAgIH1cblxuICAgIHRoaXMuX2RlZmxhdGVba0NhbGxiYWNrXSA9IGNhbGxiYWNrO1xuXG4gICAgdGhpcy5fZGVmbGF0ZS53cml0ZShkYXRhKTtcbiAgICB0aGlzLl9kZWZsYXRlLmZsdXNoKHpsaWIuWl9TWU5DX0ZMVVNILCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2RlZmxhdGUpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIGRlZmxhdGUgc3RyZWFtIHdhcyBjbG9zZWQgd2hpbGUgZGF0YSB3YXMgYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAgICAvL1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhID0gYnVmZmVyVXRpbC5jb25jYXQoXG4gICAgICAgIHRoaXMuX2RlZmxhdGVba0J1ZmZlcnNdLFxuICAgICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF1cbiAgICAgICk7XG5cbiAgICAgIGlmIChmaW4pIHtcbiAgICAgICAgZGF0YSA9IG5ldyBGYXN0QnVmZmVyKGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEubGVuZ3RoIC0gNCk7XG4gICAgICB9XG5cbiAgICAgIC8vXG4gICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgY2FsbGJhY2sgd2lsbCBub3QgYmUgY2FsbGVkIGFnYWluIGluXG4gICAgICAvLyBgUGVyTWVzc2FnZURlZmxhdGUjY2xlYW51cCgpYC5cbiAgICAgIC8vXG4gICAgICB0aGlzLl9kZWZsYXRlW2tDYWxsYmFja10gPSBudWxsO1xuXG4gICAgICB0aGlzLl9kZWZsYXRlW2tUb3RhbExlbmd0aF0gPSAwO1xuICAgICAgdGhpcy5fZGVmbGF0ZVtrQnVmZmVyc10gPSBbXTtcblxuICAgICAgaWYgKGZpbiAmJiB0aGlzLnBhcmFtc1tgJHtlbmRwb2ludH1fbm9fY29udGV4dF90YWtlb3ZlcmBdKSB7XG4gICAgICAgIHRoaXMuX2RlZmxhdGUucmVzZXQoKTtcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gICAgfSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBQZXJNZXNzYWdlRGVmbGF0ZTtcblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGB6bGliLkRlZmxhdGVSYXdgIHN0cmVhbSBgJ2RhdGEnYCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgQSBjaHVuayBvZiBkYXRhXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkZWZsYXRlT25EYXRhKGNodW5rKSB7XG4gIHRoaXNba0J1ZmZlcnNdLnB1c2goY2h1bmspO1xuICB0aGlzW2tUb3RhbExlbmd0aF0gKz0gY2h1bmsubGVuZ3RoO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYHpsaWIuSW5mbGF0ZVJhd2Agc3RyZWFtIGAnZGF0YSdgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBjaHVuayBBIGNodW5rIG9mIGRhdGFcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluZmxhdGVPbkRhdGEoY2h1bmspIHtcbiAgdGhpc1trVG90YWxMZW5ndGhdICs9IGNodW5rLmxlbmd0aDtcblxuICBpZiAoXG4gICAgdGhpc1trUGVyTWVzc2FnZURlZmxhdGVdLl9tYXhQYXlsb2FkIDwgMSB8fFxuICAgIHRoaXNba1RvdGFsTGVuZ3RoXSA8PSB0aGlzW2tQZXJNZXNzYWdlRGVmbGF0ZV0uX21heFBheWxvYWRcbiAgKSB7XG4gICAgdGhpc1trQnVmZmVyc10ucHVzaChjaHVuayk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpc1trRXJyb3JdID0gbmV3IFJhbmdlRXJyb3IoJ01heCBwYXlsb2FkIHNpemUgZXhjZWVkZWQnKTtcbiAgdGhpc1trRXJyb3JdLmNvZGUgPSAnV1NfRVJSX1VOU1VQUE9SVEVEX01FU1NBR0VfTEVOR1RIJztcbiAgdGhpc1trRXJyb3JdW2tTdGF0dXNDb2RlXSA9IDEwMDk7XG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBpbmZsYXRlT25EYXRhKTtcbiAgdGhpcy5yZXNldCgpO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYHpsaWIuSW5mbGF0ZVJhd2Agc3RyZWFtIGAnZXJyb3InYCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnIgVGhlIGVtaXR0ZWQgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGluZmxhdGVPbkVycm9yKGVycikge1xuICAvL1xuICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgYFpsaWIjY2xvc2UoKWAgYXMgdGhlIGhhbmRsZSBpcyBhdXRvbWF0aWNhbGx5XG4gIC8vIGNsb3NlZCB3aGVuIGFuIGVycm9yIGlzIGVtaXR0ZWQuXG4gIC8vXG4gIHRoaXNba1Blck1lc3NhZ2VEZWZsYXRlXS5faW5mbGF0ZSA9IG51bGw7XG4gIGVycltrU3RhdHVzQ29kZV0gPSAxMDA3O1xuICB0aGlzW2tDYWxsYmFja10oZXJyKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBXcml0YWJsZSB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlID0gcmVxdWlyZSgnLi9wZXJtZXNzYWdlLWRlZmxhdGUnKTtcbmNvbnN0IHtcbiAgQklOQVJZX1RZUEVTLFxuICBFTVBUWV9CVUZGRVIsXG4gIGtTdGF0dXNDb2RlLFxuICBrV2ViU29ja2V0XG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IHsgY29uY2F0LCB0b0FycmF5QnVmZmVyLCB1bm1hc2sgfSA9IHJlcXVpcmUoJy4vYnVmZmVyLXV0aWwnKTtcbmNvbnN0IHsgaXNWYWxpZFN0YXR1c0NvZGUsIGlzVmFsaWRVVEY4IH0gPSByZXF1aXJlKCcuL3ZhbGlkYXRpb24nKTtcblxuY29uc3QgRmFzdEJ1ZmZlciA9IEJ1ZmZlcltTeW1ib2wuc3BlY2llc107XG5cbmNvbnN0IEdFVF9JTkZPID0gMDtcbmNvbnN0IEdFVF9QQVlMT0FEX0xFTkdUSF8xNiA9IDE7XG5jb25zdCBHRVRfUEFZTE9BRF9MRU5HVEhfNjQgPSAyO1xuY29uc3QgR0VUX01BU0sgPSAzO1xuY29uc3QgR0VUX0RBVEEgPSA0O1xuY29uc3QgSU5GTEFUSU5HID0gNTtcbmNvbnN0IERFRkVSX0VWRU5UID0gNjtcblxuLyoqXG4gKiBIeUJpIFJlY2VpdmVyIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBleHRlbmRzIFdyaXRhYmxlXG4gKi9cbmNsYXNzIFJlY2VpdmVyIGV4dGVuZHMgV3JpdGFibGUge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIFJlY2VpdmVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cz10cnVlXSBTcGVjaWZpZXMgd2hldGhlclxuICAgKiAgICAgYW55IG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWRcbiAgICogICAgIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHRpY2tcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmJpbmFyeVR5cGU9bm9kZWJ1ZmZlcl0gVGhlIHR5cGUgZm9yIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5leHRlbnNpb25zXSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbmVnb3RpYXRlZFxuICAgKiAgICAgZXh0ZW5zaW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmlzU2VydmVyPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciB0byBvcGVyYXRlIGluXG4gICAqICAgICBjbGllbnQgb3Igc2VydmVyIG1vZGVcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heFBheWxvYWQ9MF0gVGhlIG1heGltdW0gYWxsb3dlZCBtZXNzYWdlIGxlbmd0aFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAgICogICAgIG5vdCB0byBza2lwIFVURi04IHZhbGlkYXRpb24gZm9yIHRleHQgYW5kIGNsb3NlIG1lc3NhZ2VzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYWxsb3dTeW5jaHJvbm91c0V2ZW50cyA9XG4gICAgICBvcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG9wdGlvbnMuYWxsb3dTeW5jaHJvbm91c0V2ZW50c1xuICAgICAgICA6IHRydWU7XG4gICAgdGhpcy5fYmluYXJ5VHlwZSA9IG9wdGlvbnMuYmluYXJ5VHlwZSB8fCBCSU5BUllfVFlQRVNbMF07XG4gICAgdGhpcy5fZXh0ZW5zaW9ucyA9IG9wdGlvbnMuZXh0ZW5zaW9ucyB8fCB7fTtcbiAgICB0aGlzLl9pc1NlcnZlciA9ICEhb3B0aW9ucy5pc1NlcnZlcjtcbiAgICB0aGlzLl9tYXhQYXlsb2FkID0gb3B0aW9ucy5tYXhQYXlsb2FkIHwgMDtcbiAgICB0aGlzLl9za2lwVVRGOFZhbGlkYXRpb24gPSAhIW9wdGlvbnMuc2tpcFVURjhWYWxpZGF0aW9uO1xuICAgIHRoaXNba1dlYlNvY2tldF0gPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzID0gMDtcbiAgICB0aGlzLl9idWZmZXJzID0gW107XG5cbiAgICB0aGlzLl9jb21wcmVzc2VkID0gZmFsc2U7XG4gICAgdGhpcy5fcGF5bG9hZExlbmd0aCA9IDA7XG4gICAgdGhpcy5fbWFzayA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9mcmFnbWVudGVkID0gMDtcbiAgICB0aGlzLl9tYXNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9maW4gPSBmYWxzZTtcbiAgICB0aGlzLl9vcGNvZGUgPSAwO1xuXG4gICAgdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9mcmFnbWVudHMgPSBbXTtcblxuICAgIHRoaXMuX2Vycm9yZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGBXcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlKClgLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmsgVGhlIGNodW5rIG9mIGRhdGEgdG8gd3JpdGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGVuY29kaW5nIFRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgYGNodW5rYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICBpZiAodGhpcy5fb3Bjb2RlID09PSAweDA4ICYmIHRoaXMuX3N0YXRlID09IEdFVF9JTkZPKSByZXR1cm4gY2IoKTtcblxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuICAgIHRoaXMuX2J1ZmZlcnMucHVzaChjaHVuayk7XG4gICAgdGhpcy5zdGFydExvb3AoY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVzIGBuYCBieXRlcyBmcm9tIHRoZSBidWZmZXJlZCBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbnN1bWVcbiAgICogQHJldHVybiB7QnVmZmVyfSBUaGUgY29uc3VtZWQgYnl0ZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN1bWUobikge1xuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgLT0gbjtcblxuICAgIGlmIChuID09PSB0aGlzLl9idWZmZXJzWzBdLmxlbmd0aCkgcmV0dXJuIHRoaXMuX2J1ZmZlcnMuc2hpZnQoKTtcblxuICAgIGlmIChuIDwgdGhpcy5fYnVmZmVyc1swXS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IHRoaXMuX2J1ZmZlcnNbMF07XG4gICAgICB0aGlzLl9idWZmZXJzWzBdID0gbmV3IEZhc3RCdWZmZXIoXG4gICAgICAgIGJ1Zi5idWZmZXIsXG4gICAgICAgIGJ1Zi5ieXRlT2Zmc2V0ICsgbixcbiAgICAgICAgYnVmLmxlbmd0aCAtIG5cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBuZXcgRmFzdEJ1ZmZlcihidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgbik7XG4gICAgfVxuXG4gICAgY29uc3QgZHN0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4pO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgYnVmID0gdGhpcy5fYnVmZmVyc1swXTtcbiAgICAgIGNvbnN0IG9mZnNldCA9IGRzdC5sZW5ndGggLSBuO1xuXG4gICAgICBpZiAobiA+PSBidWYubGVuZ3RoKSB7XG4gICAgICAgIGRzdC5zZXQodGhpcy5fYnVmZmVycy5zaGlmdCgpLCBvZmZzZXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHN0LnNldChuZXcgVWludDhBcnJheShidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgbiksIG9mZnNldCk7XG4gICAgICAgIHRoaXMuX2J1ZmZlcnNbMF0gPSBuZXcgRmFzdEJ1ZmZlcihcbiAgICAgICAgICBidWYuYnVmZmVyLFxuICAgICAgICAgIGJ1Zi5ieXRlT2Zmc2V0ICsgbixcbiAgICAgICAgICBidWYubGVuZ3RoIC0gblxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBuIC09IGJ1Zi5sZW5ndGg7XG4gICAgfSB3aGlsZSAobiA+IDApO1xuXG4gICAgcmV0dXJuIGRzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHBhcnNpbmcgbG9vcC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0TG9vcChjYikge1xuICAgIHRoaXMuX2xvb3AgPSB0cnVlO1xuXG4gICAgZG8ge1xuICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xuICAgICAgICBjYXNlIEdFVF9JTkZPOlxuICAgICAgICAgIHRoaXMuZ2V0SW5mbyhjYik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgR0VUX1BBWUxPQURfTEVOR1RIXzE2OlxuICAgICAgICAgIHRoaXMuZ2V0UGF5bG9hZExlbmd0aDE2KGNiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBHRVRfUEFZTE9BRF9MRU5HVEhfNjQ6XG4gICAgICAgICAgdGhpcy5nZXRQYXlsb2FkTGVuZ3RoNjQoY2IpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEdFVF9NQVNLOlxuICAgICAgICAgIHRoaXMuZ2V0TWFzaygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEdFVF9EQVRBOlxuICAgICAgICAgIHRoaXMuZ2V0RGF0YShjYik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSU5GTEFUSU5HOlxuICAgICAgICBjYXNlIERFRkVSX0VWRU5UOlxuICAgICAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSB3aGlsZSAodGhpcy5fbG9vcCk7XG5cbiAgICBpZiAoIXRoaXMuX2Vycm9yZWQpIGNiKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGZpcnN0IHR3byBieXRlcyBvZiBhIGZyYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0SW5mbyhjYikge1xuICAgIGlmICh0aGlzLl9idWZmZXJlZEJ5dGVzIDwgMikge1xuICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuY29uc3VtZSgyKTtcblxuICAgIGlmICgoYnVmWzBdICYgMHgzMCkgIT09IDB4MDApIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgJ1JTVjIgYW5kIFJTVjMgbXVzdCBiZSBjbGVhcicsXG4gICAgICAgIHRydWUsXG4gICAgICAgIDEwMDIsXG4gICAgICAgICdXU19FUlJfVU5FWFBFQ1RFRF9SU1ZfMl8zJ1xuICAgICAgKTtcblxuICAgICAgY2IoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXByZXNzZWQgPSAoYnVmWzBdICYgMHg0MCkgPT09IDB4NDA7XG5cbiAgICBpZiAoY29tcHJlc3NlZCAmJiAhdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAnUlNWMSBtdXN0IGJlIGNsZWFyJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgMTAwMixcbiAgICAgICAgJ1dTX0VSUl9VTkVYUEVDVEVEX1JTVl8xJ1xuICAgICAgKTtcblxuICAgICAgY2IoZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpbiA9IChidWZbMF0gJiAweDgwKSA9PT0gMHg4MDtcbiAgICB0aGlzLl9vcGNvZGUgPSBidWZbMF0gJiAweDBmO1xuICAgIHRoaXMuX3BheWxvYWRMZW5ndGggPSBidWZbMV0gJiAweDdmO1xuXG4gICAgaWYgKHRoaXMuX29wY29kZSA9PT0gMHgwMCkge1xuICAgICAgaWYgKGNvbXByZXNzZWQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ1JTVjEgbXVzdCBiZSBjbGVhcicsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfVU5FWFBFQ1RFRF9SU1ZfMSdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9mcmFnbWVudGVkKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgICdpbnZhbGlkIG9wY29kZSAwJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIDEwMDIsXG4gICAgICAgICAgJ1dTX0VSUl9JTlZBTElEX09QQ09ERSdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb3Bjb2RlID0gdGhpcy5fZnJhZ21lbnRlZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wY29kZSA9PT0gMHgwMSB8fCB0aGlzLl9vcGNvZGUgPT09IDB4MDIpIHtcbiAgICAgIGlmICh0aGlzLl9mcmFnbWVudGVkKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgIGBpbnZhbGlkIG9wY29kZSAke3RoaXMuX29wY29kZX1gLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgMTAwMixcbiAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfT1BDT0RFJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wcmVzc2VkID0gY29tcHJlc3NlZDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wY29kZSA+IDB4MDcgJiYgdGhpcy5fb3Bjb2RlIDwgMHgwYikge1xuICAgICAgaWYgKCF0aGlzLl9maW4pIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ0ZJTiBtdXN0IGJlIHNldCcsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfRVhQRUNURURfRklOJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29tcHJlc3NlZCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICAnUlNWMSBtdXN0IGJlIGNsZWFyJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIDEwMDIsXG4gICAgICAgICAgJ1dTX0VSUl9VTkVYUEVDVEVEX1JTVl8xJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNiKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX3BheWxvYWRMZW5ndGggPiAweDdkIHx8XG4gICAgICAgICh0aGlzLl9vcGNvZGUgPT09IDB4MDggJiYgdGhpcy5fcGF5bG9hZExlbmd0aCA9PT0gMSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICBgaW52YWxpZCBwYXlsb2FkIGxlbmd0aCAke3RoaXMuX3BheWxvYWRMZW5ndGh9YCxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIDEwMDIsXG4gICAgICAgICAgJ1dTX0VSUl9JTlZBTElEX0NPTlRST0xfUEFZTE9BRF9MRU5HVEgnXG4gICAgICAgICk7XG5cbiAgICAgICAgY2IoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgYGludmFsaWQgb3Bjb2RlICR7dGhpcy5fb3Bjb2RlfWAsXG4gICAgICAgIHRydWUsXG4gICAgICAgIDEwMDIsXG4gICAgICAgICdXU19FUlJfSU5WQUxJRF9PUENPREUnXG4gICAgICApO1xuXG4gICAgICBjYihlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9maW4gJiYgIXRoaXMuX2ZyYWdtZW50ZWQpIHRoaXMuX2ZyYWdtZW50ZWQgPSB0aGlzLl9vcGNvZGU7XG4gICAgdGhpcy5fbWFza2VkID0gKGJ1ZlsxXSAmIDB4ODApID09PSAweDgwO1xuXG4gICAgaWYgKHRoaXMuX2lzU2VydmVyKSB7XG4gICAgICBpZiAoIXRoaXMuX21hc2tlZCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgICAnTUFTSyBtdXN0IGJlIHNldCcsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAxMDAyLFxuICAgICAgICAgICdXU19FUlJfRVhQRUNURURfTUFTSydcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX21hc2tlZCkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAnTUFTSyBtdXN0IGJlIGNsZWFyJyxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgMTAwMixcbiAgICAgICAgJ1dTX0VSUl9VTkVYUEVDVEVEX01BU0snXG4gICAgICApO1xuXG4gICAgICBjYihlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BheWxvYWRMZW5ndGggPT09IDEyNikgdGhpcy5fc3RhdGUgPSBHRVRfUEFZTE9BRF9MRU5HVEhfMTY7XG4gICAgZWxzZSBpZiAodGhpcy5fcGF5bG9hZExlbmd0aCA9PT0gMTI3KSB0aGlzLl9zdGF0ZSA9IEdFVF9QQVlMT0FEX0xFTkdUSF82NDtcbiAgICBlbHNlIHRoaXMuaGF2ZUxlbmd0aChjYik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBleHRlbmRlZCBwYXlsb2FkIGxlbmd0aCAoNysxNikuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRQYXlsb2FkTGVuZ3RoMTYoY2IpIHtcbiAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IDIpIHtcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXlsb2FkTGVuZ3RoID0gdGhpcy5jb25zdW1lKDIpLnJlYWRVSW50MTZCRSgwKTtcbiAgICB0aGlzLmhhdmVMZW5ndGgoY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgZXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGggKDcrNjQpLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0UGF5bG9hZExlbmd0aDY0KGNiKSB7XG4gICAgaWYgKHRoaXMuX2J1ZmZlcmVkQnl0ZXMgPCA4KSB7XG4gICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVmID0gdGhpcy5jb25zdW1lKDgpO1xuICAgIGNvbnN0IG51bSA9IGJ1Zi5yZWFkVUludDMyQkUoMCk7XG5cbiAgICAvL1xuICAgIC8vIFRoZSBtYXhpbXVtIHNhZmUgaW50ZWdlciBpbiBKYXZhU2NyaXB0IGlzIDJeNTMgLSAxLiBBbiBlcnJvciBpcyByZXR1cm5lZFxuICAgIC8vIGlmIHBheWxvYWQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIG51bWJlci5cbiAgICAvL1xuICAgIGlmIChudW0gPiBNYXRoLnBvdygyLCA1MyAtIDMyKSAtIDEpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgUmFuZ2VFcnJvcixcbiAgICAgICAgJ1Vuc3VwcG9ydGVkIFdlYlNvY2tldCBmcmFtZTogcGF5bG9hZCBsZW5ndGggPiAyXjUzIC0gMScsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAxMDA5LFxuICAgICAgICAnV1NfRVJSX1VOU1VQUE9SVEVEX0RBVEFfUEFZTE9BRF9MRU5HVEgnXG4gICAgICApO1xuXG4gICAgICBjYihlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcGF5bG9hZExlbmd0aCA9IG51bSAqIE1hdGgucG93KDIsIDMyKSArIGJ1Zi5yZWFkVUludDMyQkUoNCk7XG4gICAgdGhpcy5oYXZlTGVuZ3RoKGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXlsb2FkIGxlbmd0aCBoYXMgYmVlbiByZWFkLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaGF2ZUxlbmd0aChjYikge1xuICAgIGlmICh0aGlzLl9wYXlsb2FkTGVuZ3RoICYmIHRoaXMuX29wY29kZSA8IDB4MDgpIHtcbiAgICAgIHRoaXMuX3RvdGFsUGF5bG9hZExlbmd0aCArPSB0aGlzLl9wYXlsb2FkTGVuZ3RoO1xuICAgICAgaWYgKHRoaXMuX3RvdGFsUGF5bG9hZExlbmd0aCA+IHRoaXMuX21heFBheWxvYWQgJiYgdGhpcy5fbWF4UGF5bG9hZCA+IDApIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgJ01heCBwYXlsb2FkIHNpemUgZXhjZWVkZWQnLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIDEwMDksXG4gICAgICAgICAgJ1dTX0VSUl9VTlNVUFBPUlRFRF9NRVNTQUdFX0xFTkdUSCdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWFza2VkKSB0aGlzLl9zdGF0ZSA9IEdFVF9NQVNLO1xuICAgIGVsc2UgdGhpcy5fc3RhdGUgPSBHRVRfREFUQTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBtYXNrIGJ5dGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0TWFzaygpIHtcbiAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IDQpIHtcbiAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXNrID0gdGhpcy5jb25zdW1lKDQpO1xuICAgIHRoaXMuX3N0YXRlID0gR0VUX0RBVEE7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgZGF0YSBieXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldERhdGEoY2IpIHtcbiAgICBsZXQgZGF0YSA9IEVNUFRZX0JVRkZFUjtcblxuICAgIGlmICh0aGlzLl9wYXlsb2FkTGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5fYnVmZmVyZWRCeXRlcyA8IHRoaXMuX3BheWxvYWRMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fbG9vcCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRhdGEgPSB0aGlzLmNvbnN1bWUodGhpcy5fcGF5bG9hZExlbmd0aCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fbWFza2VkICYmXG4gICAgICAgICh0aGlzLl9tYXNrWzBdIHwgdGhpcy5fbWFza1sxXSB8IHRoaXMuX21hc2tbMl0gfCB0aGlzLl9tYXNrWzNdKSAhPT0gMFxuICAgICAgKSB7XG4gICAgICAgIHVubWFzayhkYXRhLCB0aGlzLl9tYXNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb3Bjb2RlID4gMHgwNykge1xuICAgICAgdGhpcy5jb250cm9sTWVzc2FnZShkYXRhLCBjYik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbXByZXNzZWQpIHtcbiAgICAgIHRoaXMuX3N0YXRlID0gSU5GTEFUSU5HO1xuICAgICAgdGhpcy5kZWNvbXByZXNzKGRhdGEsIGNiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5sZW5ndGgpIHtcbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIG1lc3NhZ2UgaXMgbm90IGNvbXByZXNzZWQgc28gaXRzIGxlbmd0aCBpcyB0aGUgc3VtIG9mIHRoZSBwYXlsb2FkXG4gICAgICAvLyBsZW5ndGggb2YgYWxsIGZyYWdtZW50cy5cbiAgICAgIC8vXG4gICAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoO1xuICAgICAgdGhpcy5fZnJhZ21lbnRzLnB1c2goZGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhTWVzc2FnZShjYik7XG4gIH1cblxuICAvKipcbiAgICogRGVjb21wcmVzc2VzIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIENvbXByZXNzZWQgZGF0YVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYiBDYWxsYmFja1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjb21wcmVzcyhkYXRhLCBjYikge1xuICAgIGNvbnN0IHBlck1lc3NhZ2VEZWZsYXRlID0gdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXTtcblxuICAgIHBlck1lc3NhZ2VEZWZsYXRlLmRlY29tcHJlc3MoZGF0YSwgdGhpcy5fZmluLCAoZXJyLCBidWYpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYihlcnIpO1xuXG4gICAgICBpZiAoYnVmLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoICs9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLl9tZXNzYWdlTGVuZ3RoID4gdGhpcy5fbWF4UGF5bG9hZCAmJiB0aGlzLl9tYXhQYXlsb2FkID4gMCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICAgIFJhbmdlRXJyb3IsXG4gICAgICAgICAgICAnTWF4IHBheWxvYWQgc2l6ZSBleGNlZWRlZCcsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIDEwMDksXG4gICAgICAgICAgICAnV1NfRVJSX1VOU1VQUE9SVEVEX01FU1NBR0VfTEVOR1RIJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjYihlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZnJhZ21lbnRzLnB1c2goYnVmKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXRhTWVzc2FnZShjYik7XG4gICAgICBpZiAodGhpcy5fc3RhdGUgPT09IEdFVF9JTkZPKSB0aGlzLnN0YXJ0TG9vcChjYik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGRhdGEgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2IgQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRhdGFNZXNzYWdlKGNiKSB7XG4gICAgaWYgKCF0aGlzLl9maW4pIHtcbiAgICAgIHRoaXMuX3N0YXRlID0gR0VUX0lORk87XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZUxlbmd0aCA9IHRoaXMuX21lc3NhZ2VMZW5ndGg7XG4gICAgY29uc3QgZnJhZ21lbnRzID0gdGhpcy5fZnJhZ21lbnRzO1xuXG4gICAgdGhpcy5fdG90YWxQYXlsb2FkTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9tZXNzYWdlTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9mcmFnbWVudGVkID0gMDtcbiAgICB0aGlzLl9mcmFnbWVudHMgPSBbXTtcblxuICAgIGlmICh0aGlzLl9vcGNvZGUgPT09IDIpIHtcbiAgICAgIGxldCBkYXRhO1xuXG4gICAgICBpZiAodGhpcy5fYmluYXJ5VHlwZSA9PT0gJ25vZGVidWZmZXInKSB7XG4gICAgICAgIGRhdGEgPSBjb25jYXQoZnJhZ21lbnRzLCBtZXNzYWdlTGVuZ3RoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYmluYXJ5VHlwZSA9PT0gJ2FycmF5YnVmZmVyJykge1xuICAgICAgICBkYXRhID0gdG9BcnJheUJ1ZmZlcihjb25jYXQoZnJhZ21lbnRzLCBtZXNzYWdlTGVuZ3RoKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JpbmFyeVR5cGUgPT09ICdibG9iJykge1xuICAgICAgICBkYXRhID0gbmV3IEJsb2IoZnJhZ21lbnRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRhdGEgPSBmcmFnbWVudHM7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9hbGxvd1N5bmNocm9ub3VzRXZlbnRzKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIGRhdGEsIHRydWUpO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBERUZFUl9FVkVOVDtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBkYXRhLCB0cnVlKTtcbiAgICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xuICAgICAgICAgIHRoaXMuc3RhcnRMb29wKGNiKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IGNvbmNhdChmcmFnbWVudHMsIG1lc3NhZ2VMZW5ndGgpO1xuXG4gICAgICBpZiAoIXRoaXMuX3NraXBVVEY4VmFsaWRhdGlvbiAmJiAhaXNWYWxpZFVURjgoYnVmKSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgRXJyb3IsXG4gICAgICAgICAgJ2ludmFsaWQgVVRGLTggc2VxdWVuY2UnLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgMTAwNyxcbiAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfVVRGOCdcbiAgICAgICAgKTtcblxuICAgICAgICBjYihlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBJTkZMQVRJTkcgfHwgdGhpcy5fYWxsb3dTeW5jaHJvbm91c0V2ZW50cykge1xuICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBidWYsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gREVGRVJfRVZFTlQ7XG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdtZXNzYWdlJywgYnVmLCBmYWxzZSk7XG4gICAgICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgICAgICAgICB0aGlzLnN0YXJ0TG9vcChjYik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgY29udHJvbCBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBEYXRhIHRvIGhhbmRsZVxuICAgKiBAcmV0dXJuIHsoRXJyb3J8UmFuZ2VFcnJvcnx1bmRlZmluZWQpfSBBIHBvc3NpYmxlIGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb250cm9sTWVzc2FnZShkYXRhLCBjYikge1xuICAgIGlmICh0aGlzLl9vcGNvZGUgPT09IDB4MDgpIHtcbiAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9sb29wID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW1pdCgnY29uY2x1ZGUnLCAxMDA1LCBFTVBUWV9CVUZGRVIpO1xuICAgICAgICB0aGlzLmVuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGRhdGEucmVhZFVJbnQxNkJFKDApO1xuXG4gICAgICAgIGlmICghaXNWYWxpZFN0YXR1c0NvZGUoY29kZSkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgICBSYW5nZUVycm9yLFxuICAgICAgICAgICAgYGludmFsaWQgc3RhdHVzIGNvZGUgJHtjb2RlfWAsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgMTAwMixcbiAgICAgICAgICAgICdXU19FUlJfSU5WQUxJRF9DTE9TRV9DT0RFJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjYihlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVmID0gbmV3IEZhc3RCdWZmZXIoXG4gICAgICAgICAgZGF0YS5idWZmZXIsXG4gICAgICAgICAgZGF0YS5ieXRlT2Zmc2V0ICsgMixcbiAgICAgICAgICBkYXRhLmxlbmd0aCAtIDJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXRoaXMuX3NraXBVVEY4VmFsaWRhdGlvbiAmJiAhaXNWYWxpZFVURjgoYnVmKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihcbiAgICAgICAgICAgIEVycm9yLFxuICAgICAgICAgICAgJ2ludmFsaWQgVVRGLTggc2VxdWVuY2UnLFxuICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgIDEwMDcsXG4gICAgICAgICAgICAnV1NfRVJSX0lOVkFMSURfVVRGOCdcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY2IoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbWl0KCdjb25jbHVkZScsIGNvZGUsIGJ1Zik7XG4gICAgICAgIHRoaXMuZW5kKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3N0YXRlID0gR0VUX0lORk87XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FsbG93U3luY2hyb25vdXNFdmVudHMpIHtcbiAgICAgIHRoaXMuZW1pdCh0aGlzLl9vcGNvZGUgPT09IDB4MDkgPyAncGluZycgOiAncG9uZycsIGRhdGEpO1xuICAgICAgdGhpcy5fc3RhdGUgPSBHRVRfSU5GTztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3RhdGUgPSBERUZFUl9FVkVOVDtcbiAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdCh0aGlzLl9vcGNvZGUgPT09IDB4MDkgPyAncGluZycgOiAncG9uZycsIGRhdGEpO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IEdFVF9JTkZPO1xuICAgICAgICB0aGlzLnN0YXJ0TG9vcChjYik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuIGVycm9yIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6RXJyb3J8UmFuZ2VFcnJvcil9IEVycm9yQ3RvciBUaGUgZXJyb3IgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtCb29sZWFufSBwcmVmaXggU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGFkZCBhIGRlZmF1bHQgcHJlZml4IHRvXG4gICAqICAgICBgbWVzc2FnZWBcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgVGhlIHN0YXR1cyBjb2RlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBlcnJvckNvZGUgVGhlIGV4cG9zZWQgZXJyb3IgY29kZVxuICAgKiBAcmV0dXJuIHsoRXJyb3J8UmFuZ2VFcnJvcil9IFRoZSBlcnJvclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlRXJyb3IoRXJyb3JDdG9yLCBtZXNzYWdlLCBwcmVmaXgsIHN0YXR1c0NvZGUsIGVycm9yQ29kZSkge1xuICAgIHRoaXMuX2xvb3AgPSBmYWxzZTtcbiAgICB0aGlzLl9lcnJvcmVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvckN0b3IoXG4gICAgICBwcmVmaXggPyBgSW52YWxpZCBXZWJTb2NrZXQgZnJhbWU6ICR7bWVzc2FnZX1gIDogbWVzc2FnZVxuICAgICk7XG5cbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIHRoaXMuY3JlYXRlRXJyb3IpO1xuICAgIGVyci5jb2RlID0gZXJyb3JDb2RlO1xuICAgIGVycltrU3RhdHVzQ29kZV0gPSBzdGF0dXNDb2RlO1xuICAgIHJldHVybiBlcnI7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWNlaXZlcjtcbiIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXkR1cGxleFwiIH1dICovXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBEdXBsZXggfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuY29uc3QgeyByYW5kb21GaWxsU3luYyB9ID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmNvbnN0IFBlck1lc3NhZ2VEZWZsYXRlID0gcmVxdWlyZSgnLi9wZXJtZXNzYWdlLWRlZmxhdGUnKTtcbmNvbnN0IHsgRU1QVFlfQlVGRkVSLCBrV2ViU29ja2V0LCBOT09QIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuY29uc3QgeyBpc0Jsb2IsIGlzVmFsaWRTdGF0dXNDb2RlIH0gPSByZXF1aXJlKCcuL3ZhbGlkYXRpb24nKTtcbmNvbnN0IHsgbWFzazogYXBwbHlNYXNrLCB0b0J1ZmZlciB9ID0gcmVxdWlyZSgnLi9idWZmZXItdXRpbCcpO1xuXG5jb25zdCBrQnl0ZUxlbmd0aCA9IFN5bWJvbCgna0J5dGVMZW5ndGgnKTtcbmNvbnN0IG1hc2tCdWZmZXIgPSBCdWZmZXIuYWxsb2MoNCk7XG5jb25zdCBSQU5ET01fUE9PTF9TSVpFID0gOCAqIDEwMjQ7XG5sZXQgcmFuZG9tUG9vbDtcbmxldCByYW5kb21Qb29sUG9pbnRlciA9IFJBTkRPTV9QT09MX1NJWkU7XG5cbmNvbnN0IERFRkFVTFQgPSAwO1xuY29uc3QgREVGTEFUSU5HID0gMTtcbmNvbnN0IEdFVF9CTE9CX0RBVEEgPSAyO1xuXG4vKipcbiAqIEh5QmkgU2VuZGVyIGltcGxlbWVudGF0aW9uLlxuICovXG5jbGFzcyBTZW5kZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIFNlbmRlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgY29ubmVjdGlvbiBzb2NrZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IFtleHRlbnNpb25zXSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbmVnb3RpYXRlZCBleHRlbnNpb25zXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtnZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBtYXNraW5nXG4gICAqICAgICBrZXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNvY2tldCwgZXh0ZW5zaW9ucywgZ2VuZXJhdGVNYXNrKSB7XG4gICAgdGhpcy5fZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgfHwge307XG5cbiAgICBpZiAoZ2VuZXJhdGVNYXNrKSB7XG4gICAgICB0aGlzLl9nZW5lcmF0ZU1hc2sgPSBnZW5lcmF0ZU1hc2s7XG4gICAgICB0aGlzLl9tYXNrQnVmZmVyID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIH1cblxuICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcblxuICAgIHRoaXMuX2ZpcnN0RnJhZ21lbnQgPSB0cnVlO1xuICAgIHRoaXMuX2NvbXByZXNzID0gZmFsc2U7XG5cbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzID0gMDtcbiAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIHRoaXMuX3N0YXRlID0gREVGQVVMVDtcbiAgICB0aGlzLm9uZXJyb3IgPSBOT09QO1xuICAgIHRoaXNba1dlYlNvY2tldF0gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRnJhbWVzIGEgcGllY2Ugb2YgZGF0YSBhY2NvcmRpbmcgdG8gdGhlIEh5QmkgV2ViU29ja2V0IHByb3RvY29sLlxuICAgKlxuICAgKiBAcGFyYW0geyhCdWZmZXJ8U3RyaW5nKX0gZGF0YSBUaGUgZGF0YSB0byBmcmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZpbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNldCB0aGVcbiAgICogICAgIEZJTiBiaXRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZ2VuZXJhdGVNYXNrXSBUaGUgZnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSB0aGVcbiAgICogICAgIG1hc2tpbmcga2V5XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMubWFzaz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2tcbiAgICogICAgIGBkYXRhYFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gW29wdGlvbnMubWFza0J1ZmZlcl0gVGhlIGJ1ZmZlciB1c2VkIHRvIHN0b3JlIHRoZSBtYXNraW5nXG4gICAqICAgICBrZXlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMub3Bjb2RlIFRoZSBvcGNvZGVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZWFkT25seT1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgYGRhdGFgIGNhbiBiZVxuICAgKiAgICAgbW9kaWZpZWRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yc3YxPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gc2V0IHRoZVxuICAgKiAgICAgUlNWMSBiaXRcbiAgICogQHJldHVybiB7KEJ1ZmZlcnxTdHJpbmcpW119IFRoZSBmcmFtZWQgZGF0YVxuICAgKiBAcHVibGljXG4gICAqL1xuICBzdGF0aWMgZnJhbWUoZGF0YSwgb3B0aW9ucykge1xuICAgIGxldCBtYXNrO1xuICAgIGxldCBtZXJnZSA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQgPSAyO1xuICAgIGxldCBza2lwTWFza2luZyA9IGZhbHNlO1xuXG4gICAgaWYgKG9wdGlvbnMubWFzaykge1xuICAgICAgbWFzayA9IG9wdGlvbnMubWFza0J1ZmZlciB8fCBtYXNrQnVmZmVyO1xuXG4gICAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZU1hc2spIHtcbiAgICAgICAgb3B0aW9ucy5nZW5lcmF0ZU1hc2sobWFzayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmFuZG9tUG9vbFBvaW50ZXIgPT09IFJBTkRPTV9QT09MX1NJWkUpIHtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAgKi9cbiAgICAgICAgICBpZiAocmFuZG9tUG9vbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgYmVjYXVzZSBzZXJ2ZXItc2VudCBmcmFtZXMgbXVzdCBub3RcbiAgICAgICAgICAgIC8vIGJlIG1hc2tlZCBzbyBpdCBtYXkgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByYW5kb21Qb29sID0gQnVmZmVyLmFsbG9jKFJBTkRPTV9QT09MX1NJWkUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJhbmRvbUZpbGxTeW5jKHJhbmRvbVBvb2wsIDAsIFJBTkRPTV9QT09MX1NJWkUpO1xuICAgICAgICAgIHJhbmRvbVBvb2xQb2ludGVyID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hc2tbMF0gPSByYW5kb21Qb29sW3JhbmRvbVBvb2xQb2ludGVyKytdO1xuICAgICAgICBtYXNrWzFdID0gcmFuZG9tUG9vbFtyYW5kb21Qb29sUG9pbnRlcisrXTtcbiAgICAgICAgbWFza1syXSA9IHJhbmRvbVBvb2xbcmFuZG9tUG9vbFBvaW50ZXIrK107XG4gICAgICAgIG1hc2tbM10gPSByYW5kb21Qb29sW3JhbmRvbVBvb2xQb2ludGVyKytdO1xuICAgICAgfVxuXG4gICAgICBza2lwTWFza2luZyA9IChtYXNrWzBdIHwgbWFza1sxXSB8IG1hc2tbMl0gfCBtYXNrWzNdKSA9PT0gMDtcbiAgICAgIG9mZnNldCA9IDY7XG4gICAgfVxuXG4gICAgbGV0IGRhdGFMZW5ndGg7XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoXG4gICAgICAgICghb3B0aW9ucy5tYXNrIHx8IHNraXBNYXNraW5nKSAmJlxuICAgICAgICBvcHRpb25zW2tCeXRlTGVuZ3RoXSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgZGF0YUxlbmd0aCA9IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEpO1xuICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgIG1lcmdlID0gb3B0aW9ucy5tYXNrICYmIG9wdGlvbnMucmVhZE9ubHkgJiYgIXNraXBNYXNraW5nO1xuICAgIH1cblxuICAgIGxldCBwYXlsb2FkTGVuZ3RoID0gZGF0YUxlbmd0aDtcblxuICAgIGlmIChkYXRhTGVuZ3RoID49IDY1NTM2KSB7XG4gICAgICBvZmZzZXQgKz0gODtcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjc7XG4gICAgfSBlbHNlIGlmIChkYXRhTGVuZ3RoID4gMTI1KSB7XG4gICAgICBvZmZzZXQgKz0gMjtcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjY7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG1lcmdlID8gZGF0YUxlbmd0aCArIG9mZnNldCA6IG9mZnNldCk7XG5cbiAgICB0YXJnZXRbMF0gPSBvcHRpb25zLmZpbiA/IG9wdGlvbnMub3Bjb2RlIHwgMHg4MCA6IG9wdGlvbnMub3Bjb2RlO1xuICAgIGlmIChvcHRpb25zLnJzdjEpIHRhcmdldFswXSB8PSAweDQwO1xuXG4gICAgdGFyZ2V0WzFdID0gcGF5bG9hZExlbmd0aDtcblxuICAgIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjYpIHtcbiAgICAgIHRhcmdldC53cml0ZVVJbnQxNkJFKGRhdGFMZW5ndGgsIDIpO1xuICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI3KSB7XG4gICAgICB0YXJnZXRbMl0gPSB0YXJnZXRbM10gPSAwO1xuICAgICAgdGFyZ2V0LndyaXRlVUludEJFKGRhdGFMZW5ndGgsIDQsIDYpO1xuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5tYXNrKSByZXR1cm4gW3RhcmdldCwgZGF0YV07XG5cbiAgICB0YXJnZXRbMV0gfD0gMHg4MDtcbiAgICB0YXJnZXRbb2Zmc2V0IC0gNF0gPSBtYXNrWzBdO1xuICAgIHRhcmdldFtvZmZzZXQgLSAzXSA9IG1hc2tbMV07XG4gICAgdGFyZ2V0W29mZnNldCAtIDJdID0gbWFza1syXTtcbiAgICB0YXJnZXRbb2Zmc2V0IC0gMV0gPSBtYXNrWzNdO1xuXG4gICAgaWYgKHNraXBNYXNraW5nKSByZXR1cm4gW3RhcmdldCwgZGF0YV07XG5cbiAgICBpZiAobWVyZ2UpIHtcbiAgICAgIGFwcGx5TWFzayhkYXRhLCBtYXNrLCB0YXJnZXQsIG9mZnNldCwgZGF0YUxlbmd0aCk7XG4gICAgICByZXR1cm4gW3RhcmdldF07XG4gICAgfVxuXG4gICAgYXBwbHlNYXNrKGRhdGEsIG1hc2ssIGRhdGEsIDAsIGRhdGFMZW5ndGgpO1xuICAgIHJldHVybiBbdGFyZ2V0LCBkYXRhXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNsb3NlIG1lc3NhZ2UgdG8gdGhlIG90aGVyIHBlZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbY29kZV0gVGhlIHN0YXR1cyBjb2RlIGNvbXBvbmVudCBvZiB0aGUgYm9keVxuICAgKiBAcGFyYW0geyhTdHJpbmd8QnVmZmVyKX0gW2RhdGFdIFRoZSBtZXNzYWdlIGNvbXBvbmVudCBvZiB0aGUgYm9keVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayB0aGUgbWVzc2FnZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNsb3NlKGNvZGUsIGRhdGEsIG1hc2ssIGNiKSB7XG4gICAgbGV0IGJ1ZjtcblxuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJ1ZiA9IEVNUFRZX0JVRkZFUjtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb2RlICE9PSAnbnVtYmVyJyB8fCAhaXNWYWxpZFN0YXR1c0NvZGUoY29kZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSB2YWxpZCBlcnJvciBjb2RlIG51bWJlcicpO1xuICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkIHx8ICFkYXRhLmxlbmd0aCkge1xuICAgICAgYnVmID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIpO1xuICAgICAgYnVmLndyaXRlVUludDE2QkUoY29kZSwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpO1xuXG4gICAgICBpZiAobGVuZ3RoID4gMTIzKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgbWVzc2FnZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gMTIzIGJ5dGVzJyk7XG4gICAgICB9XG5cbiAgICAgIGJ1ZiA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyICsgbGVuZ3RoKTtcbiAgICAgIGJ1Zi53cml0ZVVJbnQxNkJFKGNvZGUsIDApO1xuXG4gICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGJ1Zi53cml0ZShkYXRhLCAyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ1Zi5zZXQoZGF0YSwgMik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIFtrQnl0ZUxlbmd0aF06IGJ1Zi5sZW5ndGgsXG4gICAgICBmaW46IHRydWUsXG4gICAgICBnZW5lcmF0ZU1hc2s6IHRoaXMuX2dlbmVyYXRlTWFzayxcbiAgICAgIG1hc2ssXG4gICAgICBtYXNrQnVmZmVyOiB0aGlzLl9tYXNrQnVmZmVyLFxuICAgICAgb3Bjb2RlOiAweDA4LFxuICAgICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgICAgcnN2MTogZmFsc2VcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XG4gICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGJ1ZiwgZmFsc2UsIG9wdGlvbnMsIGNiXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShidWYsIG9wdGlvbnMpLCBjYik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgcGluZyBtZXNzYWdlIHRvIHRoZSBvdGhlciBwZWVyLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1lc3NhZ2UgdG8gc2VuZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBwaW5nKGRhdGEsIG1hc2ssIGNiKSB7XG4gICAgbGV0IGJ5dGVMZW5ndGg7XG4gICAgbGV0IHJlYWRPbmx5O1xuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgYnl0ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEpO1xuICAgICAgcmVhZE9ubHkgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGlzQmxvYihkYXRhKSkge1xuICAgICAgYnl0ZUxlbmd0aCA9IGRhdGEuc2l6ZTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSB0b0J1ZmZlcihkYXRhKTtcbiAgICAgIGJ5dGVMZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgIHJlYWRPbmx5ID0gdG9CdWZmZXIucmVhZE9ubHk7XG4gICAgfVxuXG4gICAgaWYgKGJ5dGVMZW5ndGggPiAxMjUpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgZGF0YSBzaXplIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiAxMjUgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgW2tCeXRlTGVuZ3RoXTogYnl0ZUxlbmd0aCxcbiAgICAgIGZpbjogdHJ1ZSxcbiAgICAgIGdlbmVyYXRlTWFzazogdGhpcy5fZ2VuZXJhdGVNYXNrLFxuICAgICAgbWFzayxcbiAgICAgIG1hc2tCdWZmZXI6IHRoaXMuX21hc2tCdWZmZXIsXG4gICAgICBvcGNvZGU6IDB4MDksXG4gICAgICByZWFkT25seSxcbiAgICAgIHJzdjE6IGZhbHNlXG4gICAgfTtcblxuICAgIGlmIChpc0Jsb2IoZGF0YSkpIHtcbiAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gREVGQVVMVCkge1xuICAgICAgICB0aGlzLmVucXVldWUoW3RoaXMuZ2V0QmxvYkRhdGEsIGRhdGEsIGZhbHNlLCBvcHRpb25zLCBjYl0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZXRCbG9iRGF0YShkYXRhLCBmYWxzZSwgb3B0aW9ucywgY2IpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5fc3RhdGUgIT09IERFRkFVTFQpIHtcbiAgICAgIHRoaXMuZW5xdWV1ZShbdGhpcy5kaXNwYXRjaCwgZGF0YSwgZmFsc2UsIG9wdGlvbnMsIGNiXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShkYXRhLCBvcHRpb25zKSwgY2IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIHBvbmcgbWVzc2FnZSB0byB0aGUgb3RoZXIgcGVlci5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXNzYWdlIHRvIHNlbmRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbbWFzaz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIG1hc2sgYGRhdGFgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcG9uZyhkYXRhLCBtYXNrLCBjYikge1xuICAgIGxldCBieXRlTGVuZ3RoO1xuICAgIGxldCByZWFkT25seTtcblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc0Jsb2IoZGF0YSkpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBkYXRhLnNpemU7XG4gICAgICByZWFkT25seSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gdG9CdWZmZXIoZGF0YSk7XG4gICAgICBieXRlTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICByZWFkT25seSA9IHRvQnVmZmVyLnJlYWRPbmx5O1xuICAgIH1cblxuICAgIGlmIChieXRlTGVuZ3RoID4gMTI1KSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIGRhdGEgc2l6ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gMTI1IGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIFtrQnl0ZUxlbmd0aF06IGJ5dGVMZW5ndGgsXG4gICAgICBmaW46IHRydWUsXG4gICAgICBnZW5lcmF0ZU1hc2s6IHRoaXMuX2dlbmVyYXRlTWFzayxcbiAgICAgIG1hc2ssXG4gICAgICBtYXNrQnVmZmVyOiB0aGlzLl9tYXNrQnVmZmVyLFxuICAgICAgb3Bjb2RlOiAweDBhLFxuICAgICAgcmVhZE9ubHksXG4gICAgICByc3YxOiBmYWxzZVxuICAgIH07XG5cbiAgICBpZiAoaXNCbG9iKGRhdGEpKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUgIT09IERFRkFVTFQpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlKFt0aGlzLmdldEJsb2JEYXRhLCBkYXRhLCBmYWxzZSwgb3B0aW9ucywgY2JdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0QmxvYkRhdGEoZGF0YSwgZmFsc2UsIG9wdGlvbnMsIGNiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XG4gICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGRhdGEsIGZhbHNlLCBvcHRpb25zLCBjYl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbmRGcmFtZShTZW5kZXIuZnJhbWUoZGF0YSwgb3B0aW9ucyksIGNiKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBkYXRhIG1lc3NhZ2UgdG8gdGhlIG90aGVyIHBlZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWVzc2FnZSB0byBzZW5kXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYmluYXJ5PWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBgZGF0YWAgaXMgYmluYXJ5XG4gICAqICAgICBvciB0ZXh0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY29tcHJlc3M9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0b1xuICAgKiAgICAgY29tcHJlc3MgYGRhdGFgXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZmluPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciB0aGUgZnJhZ21lbnQgaXMgdGhlXG4gICAqICAgICBsYXN0IG9uZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1hc2s9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFja1xuICAgKiBAcHVibGljXG4gICAqL1xuICBzZW5kKGRhdGEsIG9wdGlvbnMsIGNiKSB7XG4gICAgY29uc3QgcGVyTWVzc2FnZURlZmxhdGUgPSB0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdO1xuICAgIGxldCBvcGNvZGUgPSBvcHRpb25zLmJpbmFyeSA/IDIgOiAxO1xuICAgIGxldCByc3YxID0gb3B0aW9ucy5jb21wcmVzcztcblxuICAgIGxldCBieXRlTGVuZ3RoO1xuICAgIGxldCByZWFkT25seTtcblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTtcbiAgICAgIHJlYWRPbmx5ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpc0Jsb2IoZGF0YSkpIHtcbiAgICAgIGJ5dGVMZW5ndGggPSBkYXRhLnNpemU7XG4gICAgICByZWFkT25seSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gdG9CdWZmZXIoZGF0YSk7XG4gICAgICBieXRlTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICByZWFkT25seSA9IHRvQnVmZmVyLnJlYWRPbmx5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9maXJzdEZyYWdtZW50KSB7XG4gICAgICB0aGlzLl9maXJzdEZyYWdtZW50ID0gZmFsc2U7XG4gICAgICBpZiAoXG4gICAgICAgIHJzdjEgJiZcbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUgJiZcbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUucGFyYW1zW1xuICAgICAgICAgIHBlck1lc3NhZ2VEZWZsYXRlLl9pc1NlcnZlclxuICAgICAgICAgICAgPyAnc2VydmVyX25vX2NvbnRleHRfdGFrZW92ZXInXG4gICAgICAgICAgICA6ICdjbGllbnRfbm9fY29udGV4dF90YWtlb3ZlcidcbiAgICAgICAgXVxuICAgICAgKSB7XG4gICAgICAgIHJzdjEgPSBieXRlTGVuZ3RoID49IHBlck1lc3NhZ2VEZWZsYXRlLl90aHJlc2hvbGQ7XG4gICAgICB9XG4gICAgICB0aGlzLl9jb21wcmVzcyA9IHJzdjE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJzdjEgPSBmYWxzZTtcbiAgICAgIG9wY29kZSA9IDA7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZmluKSB0aGlzLl9maXJzdEZyYWdtZW50ID0gdHJ1ZTtcblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBba0J5dGVMZW5ndGhdOiBieXRlTGVuZ3RoLFxuICAgICAgZmluOiBvcHRpb25zLmZpbixcbiAgICAgIGdlbmVyYXRlTWFzazogdGhpcy5fZ2VuZXJhdGVNYXNrLFxuICAgICAgbWFzazogb3B0aW9ucy5tYXNrLFxuICAgICAgbWFza0J1ZmZlcjogdGhpcy5fbWFza0J1ZmZlcixcbiAgICAgIG9wY29kZSxcbiAgICAgIHJlYWRPbmx5LFxuICAgICAgcnN2MVxuICAgIH07XG5cbiAgICBpZiAoaXNCbG9iKGRhdGEpKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUgIT09IERFRkFVTFQpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlKFt0aGlzLmdldEJsb2JEYXRhLCBkYXRhLCB0aGlzLl9jb21wcmVzcywgb3B0cywgY2JdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0QmxvYkRhdGEoZGF0YSwgdGhpcy5fY29tcHJlc3MsIG9wdHMsIGNiKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlICE9PSBERUZBVUxUKSB7XG4gICAgICB0aGlzLmVucXVldWUoW3RoaXMuZGlzcGF0Y2gsIGRhdGEsIHRoaXMuX2NvbXByZXNzLCBvcHRzLCBjYl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BhdGNoKGRhdGEsIHRoaXMuX2NvbXByZXNzLCBvcHRzLCBjYik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvbnRlbnRzIG9mIGEgYmxvYiBhcyBiaW5hcnkgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtCbG9ifSBibG9iIFRoZSBibG9iXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2NvbXByZXNzPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gY29tcHJlc3NcbiAgICogICAgIHRoZSBkYXRhXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZmluPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gc2V0IHRoZVxuICAgKiAgICAgRklOIGJpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5nZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZVxuICAgKiAgICAgbWFza2luZyBrZXlcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tYXNrPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFza1xuICAgKiAgICAgYGRhdGFgXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBbb3B0aW9ucy5tYXNrQnVmZmVyXSBUaGUgYnVmZmVyIHVzZWQgdG8gc3RvcmUgdGhlIG1hc2tpbmdcbiAgICogICAgIGtleVxuICAgKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5vcGNvZGUgVGhlIG9wY29kZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJlYWRPbmx5PWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBgZGF0YWAgY2FuIGJlXG4gICAqICAgICBtb2RpZmllZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJzdjE9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBzZXQgdGhlXG4gICAqICAgICBSU1YxIGJpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRCbG9iRGF0YShibG9iLCBjb21wcmVzcywgb3B0aW9ucywgY2IpIHtcbiAgICB0aGlzLl9idWZmZXJlZEJ5dGVzICs9IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgIHRoaXMuX3N0YXRlID0gR0VUX0JMT0JfREFUQTtcblxuICAgIGJsb2JcbiAgICAgIC5hcnJheUJ1ZmZlcigpXG4gICAgICAudGhlbigoYXJyYXlCdWZmZXIpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVGhlIHNvY2tldCB3YXMgY2xvc2VkIHdoaWxlIHRoZSBibG9iIHdhcyBiZWluZyByZWFkJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIGBjYWxsQ2FsbGJhY2tzYCBpcyBjYWxsZWQgaW4gdGhlIG5leHQgdGljayB0byBlbnN1cmUgdGhhdCBlcnJvcnNcbiAgICAgICAgICAvLyB0aGF0IG1pZ2h0IGJlIHRocm93biBpbiB0aGUgY2FsbGJhY2tzIGJlaGF2ZSBsaWtlIGVycm9ycyB0aHJvd25cbiAgICAgICAgICAvLyBvdXRzaWRlIHRoZSBwcm9taXNlIGNoYWluLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsQ2FsbGJhY2tzLCB0aGlzLCBlcnIsIGNiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgICAgICBjb25zdCBkYXRhID0gdG9CdWZmZXIoYXJyYXlCdWZmZXIpO1xuXG4gICAgICAgIGlmICghY29tcHJlc3MpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0ZSA9IERFRkFVTFQ7XG4gICAgICAgICAgdGhpcy5zZW5kRnJhbWUoU2VuZGVyLmZyYW1lKGRhdGEsIG9wdGlvbnMpLCBjYik7XG4gICAgICAgICAgdGhpcy5kZXF1ZXVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaChkYXRhLCBjb21wcmVzcywgb3B0aW9ucywgY2IpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gYG9uRXJyb3JgIGlzIGNhbGxlZCBpbiB0aGUgbmV4dCB0aWNrIGZvciB0aGUgc2FtZSByZWFzb24gdGhhdFxuICAgICAgICAvLyBgY2FsbENhbGxiYWNrc2AgYWJvdmUgaXMuXG4gICAgICAgIC8vXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2sob25FcnJvciwgdGhpcywgZXJyLCBjYik7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGEgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHsoQnVmZmVyfFN0cmluZyl9IGRhdGEgVGhlIG1lc3NhZ2UgdG8gc2VuZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtjb21wcmVzcz1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGNvbXByZXNzXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5maW49ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBzZXQgdGhlXG4gICAqICAgICBGSU4gYml0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmdlbmVyYXRlTWFza10gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgdGhlXG4gICAqICAgICBtYXNraW5nIGtleVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1hc2s9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtCdWZmZXJ9IFtvcHRpb25zLm1hc2tCdWZmZXJdIFRoZSBidWZmZXIgdXNlZCB0byBzdG9yZSB0aGUgbWFza2luZ1xuICAgKiAgICAga2V5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLm9wY29kZSBUaGUgb3Bjb2RlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmVhZE9ubHk9ZmFsc2VdIFNwZWNpZmllcyB3aGV0aGVyIGBkYXRhYCBjYW4gYmVcbiAgICogICAgIG1vZGlmaWVkXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucnN2MT1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIHNldCB0aGVcbiAgICogICAgIFJTVjEgYml0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRpc3BhdGNoKGRhdGEsIGNvbXByZXNzLCBvcHRpb25zLCBjYikge1xuICAgIGlmICghY29tcHJlc3MpIHtcbiAgICAgIHRoaXMuc2VuZEZyYW1lKFNlbmRlci5mcmFtZShkYXRhLCBvcHRpb25zKSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBlck1lc3NhZ2VEZWZsYXRlID0gdGhpcy5fZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXTtcblxuICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgKz0gb3B0aW9uc1trQnl0ZUxlbmd0aF07XG4gICAgdGhpcy5fc3RhdGUgPSBERUZMQVRJTkc7XG4gICAgcGVyTWVzc2FnZURlZmxhdGUuY29tcHJlc3MoZGF0YSwgb3B0aW9ucy5maW4sIChfLCBidWYpID0+IHtcbiAgICAgIGlmICh0aGlzLl9zb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAnVGhlIHNvY2tldCB3YXMgY2xvc2VkIHdoaWxlIGRhdGEgd2FzIGJlaW5nIGNvbXByZXNzZWQnXG4gICAgICAgICk7XG5cbiAgICAgICAgY2FsbENhbGxiYWNrcyh0aGlzLCBlcnIsIGNiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9idWZmZXJlZEJ5dGVzIC09IG9wdGlvbnNba0J5dGVMZW5ndGhdO1xuICAgICAgdGhpcy5fc3RhdGUgPSBERUZBVUxUO1xuICAgICAgb3B0aW9ucy5yZWFkT25seSA9IGZhbHNlO1xuICAgICAgdGhpcy5zZW5kRnJhbWUoU2VuZGVyLmZyYW1lKGJ1Ziwgb3B0aW9ucyksIGNiKTtcbiAgICAgIHRoaXMuZGVxdWV1ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHF1ZXVlZCBzZW5kIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZXF1ZXVlKCkge1xuICAgIHdoaWxlICh0aGlzLl9zdGF0ZSA9PT0gREVGQVVMVCAmJiB0aGlzLl9xdWV1ZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3F1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgIHRoaXMuX2J1ZmZlcmVkQnl0ZXMgLT0gcGFyYW1zWzNdW2tCeXRlTGVuZ3RoXTtcbiAgICAgIFJlZmxlY3QuYXBwbHkocGFyYW1zWzBdLCB0aGlzLCBwYXJhbXMuc2xpY2UoMSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIHNlbmQgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMgU2VuZCBvcGVyYXRpb24gcGFyYW1ldGVycy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVucXVldWUocGFyYW1zKSB7XG4gICAgdGhpcy5fYnVmZmVyZWRCeXRlcyArPSBwYXJhbXNbM11ba0J5dGVMZW5ndGhdO1xuICAgIHRoaXMuX3F1ZXVlLnB1c2gocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGZyYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcltdfSBsaXN0IFRoZSBmcmFtZSB0byBzZW5kXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlbmRGcmFtZShsaXN0LCBjYikge1xuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMikge1xuICAgICAgdGhpcy5fc29ja2V0LmNvcmsoKTtcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzBdKTtcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzFdLCBjYik7XG4gICAgICB0aGlzLl9zb2NrZXQudW5jb3JrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NvY2tldC53cml0ZShsaXN0WzBdLCBjYik7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU2VuZGVyO1xuXG4vKipcbiAqIENhbGxzIHF1ZXVlZCBjYWxsYmFja3Mgd2l0aCBhbiBlcnJvci5cbiAqXG4gKiBAcGFyYW0ge1NlbmRlcn0gc2VuZGVyIFRoZSBgU2VuZGVyYCBpbnN0YW5jZVxuICogQHBhcmFtIHtFcnJvcn0gZXJyIFRoZSBlcnJvciB0byBjYWxsIHRoZSBjYWxsYmFja3Mgd2l0aFxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBUaGUgZmlyc3QgY2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGxDYWxsYmFja3Moc2VuZGVyLCBlcnIsIGNiKSB7XG4gIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIGNiKGVycik7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZW5kZXIuX3F1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcGFyYW1zID0gc2VuZGVyLl9xdWV1ZVtpXTtcbiAgICBjb25zdCBjYWxsYmFjayA9IHBhcmFtc1twYXJhbXMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjayhlcnIpO1xuICB9XG59XG5cbi8qKlxuICogSGFuZGxlcyBhIGBTZW5kZXJgIGVycm9yLlxuICpcbiAqIEBwYXJhbSB7U2VuZGVyfSBzZW5kZXIgVGhlIGBTZW5kZXJgIGluc3RhbmNlXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnIgVGhlIGVycm9yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIFRoZSBmaXJzdCBwZW5kaW5nIGNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBvbkVycm9yKHNlbmRlciwgZXJyLCBjYikge1xuICBjYWxsQ2FsbGJhY2tzKHNlbmRlciwgZXJyLCBjYik7XG4gIHNlbmRlci5vbmVycm9yKGVycik7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgRHVwbGV4IH0gPSByZXF1aXJlKCdzdHJlYW0nKTtcblxuLyoqXG4gKiBFbWl0cyB0aGUgYCdjbG9zZSdgIGV2ZW50IG9uIGEgc3RyZWFtLlxuICpcbiAqIEBwYXJhbSB7RHVwbGV4fSBzdHJlYW0gVGhlIHN0cmVhbS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGVtaXRDbG9zZShzdHJlYW0pIHtcbiAgc3RyZWFtLmVtaXQoJ2Nsb3NlJyk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgJ2VuZCdgIGV2ZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGR1cGxleE9uRW5kKCkge1xuICBpZiAoIXRoaXMuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQpIHtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyciBUaGUgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGR1cGxleE9uRXJyb3IoZXJyKSB7XG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZHVwbGV4T25FcnJvcik7XG4gIHRoaXMuZGVzdHJveSgpO1xuICBpZiAodGhpcy5saXN0ZW5lckNvdW50KCdlcnJvcicpID09PSAwKSB7XG4gICAgLy8gRG8gbm90IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvci5cbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXBzIGEgYFdlYlNvY2tldGAgaW4gYSBkdXBsZXggc3RyZWFtLlxuICpcbiAqIEBwYXJhbSB7V2ViU29ja2V0fSB3cyBUaGUgYFdlYlNvY2tldGAgdG8gd3JhcFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBmb3IgdGhlIGBEdXBsZXhgIGNvbnN0cnVjdG9yXG4gKiBAcmV0dXJuIHtEdXBsZXh9IFRoZSBkdXBsZXggc3RyZWFtXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFN0cmVhbSh3cywgb3B0aW9ucykge1xuICBsZXQgdGVybWluYXRlT25EZXN0cm95ID0gdHJ1ZTtcblxuICBjb25zdCBkdXBsZXggPSBuZXcgRHVwbGV4KHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGF1dG9EZXN0cm95OiBmYWxzZSxcbiAgICBlbWl0Q2xvc2U6IGZhbHNlLFxuICAgIG9iamVjdE1vZGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlT2JqZWN0TW9kZTogZmFsc2VcbiAgfSk7XG5cbiAgd3Mub24oJ21lc3NhZ2UnLCBmdW5jdGlvbiBtZXNzYWdlKG1zZywgaXNCaW5hcnkpIHtcbiAgICBjb25zdCBkYXRhID1cbiAgICAgICFpc0JpbmFyeSAmJiBkdXBsZXguX3JlYWRhYmxlU3RhdGUub2JqZWN0TW9kZSA/IG1zZy50b1N0cmluZygpIDogbXNnO1xuXG4gICAgaWYgKCFkdXBsZXgucHVzaChkYXRhKSkgd3MucGF1c2UoKTtcbiAgfSk7XG5cbiAgd3Mub25jZSgnZXJyb3InLCBmdW5jdGlvbiBlcnJvcihlcnIpIHtcbiAgICBpZiAoZHVwbGV4LmRlc3Ryb3llZCkgcmV0dXJuO1xuXG4gICAgLy8gUHJldmVudCBgd3MudGVybWluYXRlKClgIGZyb20gYmVpbmcgY2FsbGVkIGJ5IGBkdXBsZXguX2Rlc3Ryb3koKWAuXG4gICAgLy9cbiAgICAvLyAtIElmIHRoZSBgJ2Vycm9yJ2AgZXZlbnQgaXMgZW1pdHRlZCBiZWZvcmUgdGhlIGAnb3BlbidgIGV2ZW50LCB0aGVuXG4gICAgLy8gICBgd3MudGVybWluYXRlKClgIGlzIGEgbm9vcCBhcyBubyBzb2NrZXQgaXMgYXNzaWduZWQuXG4gICAgLy8gLSBPdGhlcndpc2UsIHRoZSBlcnJvciBpcyByZS1lbWl0dGVkIGJ5IHRoZSBsaXN0ZW5lciBvZiB0aGUgYCdlcnJvcidgXG4gICAgLy8gICBldmVudCBvZiB0aGUgYFJlY2VpdmVyYCBvYmplY3QuIFRoZSBsaXN0ZW5lciBhbHJlYWR5IGNsb3NlcyB0aGVcbiAgICAvLyAgIGNvbm5lY3Rpb24gYnkgY2FsbGluZyBgd3MuY2xvc2UoKWAuIFRoaXMgYWxsb3dzIGEgY2xvc2UgZnJhbWUgdG8gYmVcbiAgICAvLyAgIHNlbnQgdG8gdGhlIG90aGVyIHBlZXIuIElmIGB3cy50ZXJtaW5hdGUoKWAgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHRoaXMsXG4gICAgLy8gICB0aGVuIHRoZSBjbG9zZSBmcmFtZSBtaWdodCBub3QgYmUgc2VudC5cbiAgICB0ZXJtaW5hdGVPbkRlc3Ryb3kgPSBmYWxzZTtcbiAgICBkdXBsZXguZGVzdHJveShlcnIpO1xuICB9KTtcblxuICB3cy5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgIGlmIChkdXBsZXguZGVzdHJveWVkKSByZXR1cm47XG5cbiAgICBkdXBsZXgucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgZHVwbGV4Ll9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAod3MucmVhZHlTdGF0ZSA9PT0gd3MuQ0xPU0VEKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIGR1cGxleCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuXG4gICAgd3Mub25jZSgnZXJyb3InLCBmdW5jdGlvbiBlcnJvcihlcnIpIHtcbiAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH0pO1xuXG4gICAgd3Mub25jZSgnY2xvc2UnLCBmdW5jdGlvbiBjbG9zZSgpIHtcbiAgICAgIGlmICghY2FsbGVkKSBjYWxsYmFjayhlcnIpO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIGR1cGxleCk7XG4gICAgfSk7XG5cbiAgICBpZiAodGVybWluYXRlT25EZXN0cm95KSB3cy50ZXJtaW5hdGUoKTtcbiAgfTtcblxuICBkdXBsZXguX2ZpbmFsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgaWYgKHdzLnJlYWR5U3RhdGUgPT09IHdzLkNPTk5FQ1RJTkcpIHtcbiAgICAgIHdzLm9uY2UoJ29wZW4nLCBmdW5jdGlvbiBvcGVuKCkge1xuICAgICAgICBkdXBsZXguX2ZpbmFsKGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB2YWx1ZSBvZiB0aGUgYF9zb2NrZXRgIHByb3BlcnR5IGlzIGBudWxsYCBpdCBtZWFucyB0aGF0IGB3c2AgaXMgYVxuICAgIC8vIGNsaWVudCB3ZWJzb2NrZXQgYW5kIHRoZSBoYW5kc2hha2UgZmFpbGVkLiBJbiBmYWN0LCB3aGVuIHRoaXMgaGFwcGVucywgYVxuICAgIC8vIHNvY2tldCBpcyBuZXZlciBhc3NpZ25lZCB0byB0aGUgd2Vic29ja2V0LiBXYWl0IGZvciB0aGUgYCdlcnJvcidgIGV2ZW50XG4gICAgLy8gdGhhdCB3aWxsIGJlIGVtaXR0ZWQgYnkgdGhlIHdlYnNvY2tldC5cbiAgICBpZiAod3MuX3NvY2tldCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgaWYgKHdzLl9zb2NrZXQuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQpIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgICBpZiAoZHVwbGV4Ll9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIGR1cGxleC5kZXN0cm95KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdzLl9zb2NrZXQub25jZSgnZmluaXNoJywgZnVuY3Rpb24gZmluaXNoKCkge1xuICAgICAgICAvLyBgZHVwbGV4YCBpcyBub3QgZGVzdHJveWVkIGhlcmUgYmVjYXVzZSB0aGUgYCdlbmQnYCBldmVudCB3aWxsIGJlXG4gICAgICAgIC8vIGVtaXR0ZWQgb24gYGR1cGxleGAgYWZ0ZXIgdGhpcyBgJ2ZpbmlzaCdgIGV2ZW50LiBUaGUgRU9GIHNpZ25hbGluZ1xuICAgICAgICAvLyBgbnVsbGAgY2h1bmsgaXMsIGluIGZhY3QsIHB1c2hlZCB3aGVuIHRoZSB3ZWJzb2NrZXQgZW1pdHMgYCdjbG9zZSdgLlxuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSk7XG4gICAgICB3cy5jbG9zZSgpO1xuICAgIH1cbiAgfTtcblxuICBkdXBsZXguX3JlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHdzLmlzUGF1c2VkKSB3cy5yZXN1bWUoKTtcbiAgfTtcblxuICBkdXBsZXguX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAod3MucmVhZHlTdGF0ZSA9PT0gd3MuQ09OTkVDVElORykge1xuICAgICAgd3Mub25jZSgnb3BlbicsIGZ1bmN0aW9uIG9wZW4oKSB7XG4gICAgICAgIGR1cGxleC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3cy5zZW5kKGNodW5rLCBjYWxsYmFjayk7XG4gIH07XG5cbiAgZHVwbGV4Lm9uKCdlbmQnLCBkdXBsZXhPbkVuZCk7XG4gIGR1cGxleC5vbignZXJyb3InLCBkdXBsZXhPbkVycm9yKTtcbiAgcmV0dXJuIGR1cGxleDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVXZWJTb2NrZXRTdHJlYW07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgdG9rZW5DaGFycyB9ID0gcmVxdWlyZSgnLi92YWxpZGF0aW9uJyk7XG5cbi8qKlxuICogUGFyc2VzIHRoZSBgU2VjLVdlYlNvY2tldC1Qcm90b2NvbGAgaGVhZGVyIGludG8gYSBzZXQgb2Ygc3VicHJvdG9jb2wgbmFtZXMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlciBUaGUgZmllbGQgdmFsdWUgb2YgdGhlIGhlYWRlclxuICogQHJldHVybiB7U2V0fSBUaGUgc3VicHJvdG9jb2wgbmFtZXNcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gcGFyc2UoaGVhZGVyKSB7XG4gIGNvbnN0IHByb3RvY29scyA9IG5ldyBTZXQoKTtcbiAgbGV0IHN0YXJ0ID0gLTE7XG4gIGxldCBlbmQgPSAtMTtcbiAgbGV0IGkgPSAwO1xuXG4gIGZvciAoaTsgaSA8IGhlYWRlci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBoZWFkZXIuY2hhckNvZGVBdChpKTtcblxuICAgIGlmIChlbmQgPT09IC0xICYmIHRva2VuQ2hhcnNbY29kZV0gPT09IDEpIHtcbiAgICAgIGlmIChzdGFydCA9PT0gLTEpIHN0YXJ0ID0gaTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgaSAhPT0gMCAmJlxuICAgICAgKGNvZGUgPT09IDB4MjAgLyogJyAnICovIHx8IGNvZGUgPT09IDB4MDkpIC8qICdcXHQnICovXG4gICAgKSB7XG4gICAgICBpZiAoZW5kID09PSAtMSAmJiBzdGFydCAhPT0gLTEpIGVuZCA9IGk7XG4gICAgfSBlbHNlIGlmIChjb2RlID09PSAweDJjIC8qICcsJyAqLykge1xuICAgICAgaWYgKHN0YXJ0ID09PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuZCA9PT0gLTEpIGVuZCA9IGk7XG5cbiAgICAgIGNvbnN0IHByb3RvY29sID0gaGVhZGVyLnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gICAgICBpZiAocHJvdG9jb2xzLmhhcyhwcm90b2NvbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBUaGUgXCIke3Byb3RvY29sfVwiIHN1YnByb3RvY29sIGlzIGR1cGxpY2F0ZWRgKTtcbiAgICAgIH1cblxuICAgICAgcHJvdG9jb2xzLmFkZChwcm90b2NvbCk7XG4gICAgICBzdGFydCA9IGVuZCA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGF0IGluZGV4ICR7aX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnQgPT09IC0xIHx8IGVuZCAhPT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Jyk7XG4gIH1cblxuICBjb25zdCBwcm90b2NvbCA9IGhlYWRlci5zbGljZShzdGFydCwgaSk7XG5cbiAgaWYgKHByb3RvY29scy5oYXMocHJvdG9jb2wpKSB7XG4gICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBUaGUgXCIke3Byb3RvY29sfVwiIHN1YnByb3RvY29sIGlzIGR1cGxpY2F0ZWRgKTtcbiAgfVxuXG4gIHByb3RvY29scy5hZGQocHJvdG9jb2wpO1xuICByZXR1cm4gcHJvdG9jb2xzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgcGFyc2UgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBpc1V0ZjggfSA9IHJlcXVpcmUoJ2J1ZmZlcicpO1xuXG5jb25zdCB7IGhhc0Jsb2IgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbi8vXG4vLyBBbGxvd2VkIHRva2VuIGNoYXJhY3RlcnM6XG4vL1xuLy8gJyEnLCAnIycsICckJywgJyUnLCAnJicsICcnJywgJyonLCAnKycsICctJyxcbi8vICcuJywgMC05LCBBLVosICdeJywgJ18nLCAnYCcsIGEteiwgJ3wnLCAnfidcbi8vXG4vLyB0b2tlbkNoYXJzWzMyXSA9PT0gMCAvLyAnICdcbi8vIHRva2VuQ2hhcnNbMzNdID09PSAxIC8vICchJ1xuLy8gdG9rZW5DaGFyc1szNF0gPT09IDAgLy8gJ1wiJ1xuLy8gLi4uXG4vL1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCB0b2tlbkNoYXJzID0gW1xuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAwIC0gMTVcbiAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gMTYgLSAzMVxuICAwLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAvLyAzMiAtIDQ3XG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDQ4IC0gNjNcbiAgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gNjQgLSA3OVxuICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAxLCAvLyA4MCAtIDk1XG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vIDk2IC0gMTExXG4gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIDAgLy8gMTEyIC0gMTI3XG5dO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHN0YXR1cyBjb2RlIGlzIGFsbG93ZWQgaW4gYSBjbG9zZSBmcmFtZS5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gY29kZSBUaGUgc3RhdHVzIGNvZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgc3RhdHVzIGNvZGUgaXMgdmFsaWQsIGVsc2UgYGZhbHNlYFxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBpc1ZhbGlkU3RhdHVzQ29kZShjb2RlKSB7XG4gIHJldHVybiAoXG4gICAgKGNvZGUgPj0gMTAwMCAmJlxuICAgICAgY29kZSA8PSAxMDE0ICYmXG4gICAgICBjb2RlICE9PSAxMDA0ICYmXG4gICAgICBjb2RlICE9PSAxMDA1ICYmXG4gICAgICBjb2RlICE9PSAxMDA2KSB8fFxuICAgIChjb2RlID49IDMwMDAgJiYgY29kZSA8PSA0OTk5KVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIGJ1ZmZlciBjb250YWlucyBvbmx5IGNvcnJlY3QgVVRGLTguXG4gKiBQb3J0ZWQgZnJvbSBodHRwczovL3d3dy5jbC5jYW0uYWMudWsvJTdFbWdrMjUvdWNzL3V0ZjhfY2hlY2suYyBieVxuICogTWFya3VzIEt1aG4uXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGJ1ZiBUaGUgYnVmZmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYGJ1ZmAgY29udGFpbnMgb25seSBjb3JyZWN0IFVURi04LCBlbHNlIGBmYWxzZWBcbiAqIEBwdWJsaWNcbiAqL1xuZnVuY3Rpb24gX2lzVmFsaWRVVEY4KGJ1Zikge1xuICBjb25zdCBsZW4gPSBidWYubGVuZ3RoO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICBpZiAoKGJ1ZltpXSAmIDB4ODApID09PSAwKSB7XG4gICAgICAvLyAweHh4eHh4eFxuICAgICAgaSsrO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZTApID09PSAweGMwKSB7XG4gICAgICAvLyAxMTB4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMSA9PT0gbGVuIHx8XG4gICAgICAgIChidWZbaSArIDFdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSAmIDB4ZmUpID09PSAweGMwIC8vIE92ZXJsb25nXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpICs9IDI7XG4gICAgfSBlbHNlIGlmICgoYnVmW2ldICYgMHhmMCkgPT09IDB4ZTApIHtcbiAgICAgIC8vIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4XG4gICAgICBpZiAoXG4gICAgICAgIGkgKyAyID49IGxlbiB8fFxuICAgICAgICAoYnVmW2kgKyAxXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaSArIDJdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSA9PT0gMHhlMCAmJiAoYnVmW2kgKyAxXSAmIDB4ZTApID09PSAweDgwKSB8fCAvLyBPdmVybG9uZ1xuICAgICAgICAoYnVmW2ldID09PSAweGVkICYmIChidWZbaSArIDFdICYgMHhlMCkgPT09IDB4YTApIC8vIFN1cnJvZ2F0ZSAoVStEODAwIC0gVStERkZGKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaSArPSAzO1xuICAgIH0gZWxzZSBpZiAoKGJ1ZltpXSAmIDB4ZjgpID09PSAweGYwKSB7XG4gICAgICAvLyAxMTExMHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eFxuICAgICAgaWYgKFxuICAgICAgICBpICsgMyA+PSBsZW4gfHxcbiAgICAgICAgKGJ1ZltpICsgMV0gJiAweGMwKSAhPT0gMHg4MCB8fFxuICAgICAgICAoYnVmW2kgKyAyXSAmIDB4YzApICE9PSAweDgwIHx8XG4gICAgICAgIChidWZbaSArIDNdICYgMHhjMCkgIT09IDB4ODAgfHxcbiAgICAgICAgKGJ1ZltpXSA9PT0gMHhmMCAmJiAoYnVmW2kgKyAxXSAmIDB4ZjApID09PSAweDgwKSB8fCAvLyBPdmVybG9uZ1xuICAgICAgICAoYnVmW2ldID09PSAweGY0ICYmIGJ1ZltpICsgMV0gPiAweDhmKSB8fFxuICAgICAgICBidWZbaV0gPiAweGY0IC8vID4gVSsxMEZGRkZcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGkgKz0gNDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHZhbHVlIGlzIGEgYEJsb2JgLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHRlc3RlZFxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBgQmxvYmAsIGVsc2UgYGZhbHNlYFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNCbG9iKHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgaGFzQmxvYiAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgdmFsdWUuYXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsdWUudHlwZSA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2YgdmFsdWUuc3RyZWFtID09PSAnZnVuY3Rpb24nICYmXG4gICAgKHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdCbG9iJyB8fFxuICAgICAgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0ZpbGUnKVxuICApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNCbG9iLFxuICBpc1ZhbGlkU3RhdHVzQ29kZSxcbiAgaXNWYWxpZFVURjg6IF9pc1ZhbGlkVVRGOCxcbiAgdG9rZW5DaGFyc1xufTtcblxuaWYgKGlzVXRmOCkge1xuICBtb2R1bGUuZXhwb3J0cy5pc1ZhbGlkVVRGOCA9IGZ1bmN0aW9uIChidWYpIHtcbiAgICByZXR1cm4gYnVmLmxlbmd0aCA8IDI0ID8gX2lzVmFsaWRVVEY4KGJ1ZikgOiBpc1V0ZjgoYnVmKTtcbiAgfTtcbn0gLyogaXN0YW5idWwgaWdub3JlIGVsc2UgICovIGVsc2UgaWYgKCFwcm9jZXNzLmVudi5XU19OT19VVEZfOF9WQUxJREFURSkge1xuICB0cnkge1xuICAgIGNvbnN0IGlzVmFsaWRVVEY4ID0gcmVxdWlyZSgndXRmLTgtdmFsaWRhdGUnKTtcblxuICAgIG1vZHVsZS5leHBvcnRzLmlzVmFsaWRVVEY4ID0gZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgcmV0dXJuIGJ1Zi5sZW5ndGggPCAzMiA/IF9pc1ZhbGlkVVRGOChidWYpIDogaXNWYWxpZFVURjgoYnVmKTtcbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gQ29udGludWUgcmVnYXJkbGVzcyBvZiB0aGUgZXJyb3IuXG4gIH1cbn1cbiIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXkR1cGxleCRcIiwgXCJjYXVnaHRFcnJvcnNcIjogXCJub25lXCIgfV0gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCB7IER1cGxleCB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5jb25zdCB7IGNyZWF0ZUhhc2ggfSA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG5jb25zdCBleHRlbnNpb24gPSByZXF1aXJlKCcuL2V4dGVuc2lvbicpO1xuY29uc3QgUGVyTWVzc2FnZURlZmxhdGUgPSByZXF1aXJlKCcuL3Blcm1lc3NhZ2UtZGVmbGF0ZScpO1xuY29uc3Qgc3VicHJvdG9jb2wgPSByZXF1aXJlKCcuL3N1YnByb3RvY29sJyk7XG5jb25zdCBXZWJTb2NrZXQgPSByZXF1aXJlKCcuL3dlYnNvY2tldCcpO1xuY29uc3QgeyBHVUlELCBrV2ViU29ja2V0IH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG5jb25zdCBrZXlSZWdleCA9IC9eWysvMC05QS1aYS16XXsyMn09PSQvO1xuXG5jb25zdCBSVU5OSU5HID0gMDtcbmNvbnN0IENMT1NJTkcgPSAxO1xuY29uc3QgQ0xPU0VEID0gMjtcblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgYSBXZWJTb2NrZXQgc2VydmVyLlxuICpcbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICovXG5jbGFzcyBXZWJTb2NrZXRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgYFdlYlNvY2tldFNlcnZlcmAgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHM9dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXJcbiAgICogICAgIGFueSBvZiB0aGUgYCdtZXNzYWdlJ2AsIGAncGluZydgLCBhbmQgYCdwb25nJ2AgZXZlbnRzIGNhbiBiZSBlbWl0dGVkXG4gICAqICAgICBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSB0aWNrXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYXV0b1Bvbmc9dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvXG4gICAqICAgICBhdXRvbWF0aWNhbGx5IHNlbmQgYSBwb25nIGluIHJlc3BvbnNlIHRvIGEgcGluZ1xuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYmFja2xvZz01MTFdIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcXVldWUgb2ZcbiAgICogICAgIHBlbmRpbmcgY29ubmVjdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGllbnRUcmFja2luZz10cnVlXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG9cbiAgICogICAgIHRyYWNrIGNsaWVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuaGFuZGxlUHJvdG9jb2xzXSBBIGhvb2sgdG8gaGFuZGxlIHByb3RvY29sc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaG9zdF0gVGhlIGhvc3RuYW1lIHdoZXJlIHRvIGJpbmQgdGhlIHNlcnZlclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UGF5bG9hZD0xMDQ4NTc2MDBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZVxuICAgKiAgICAgc2l6ZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm5vU2VydmVyPWZhbHNlXSBFbmFibGUgbm8gc2VydmVyIG1vZGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnBhdGhdIEFjY2VwdCBvbmx5IGNvbm5lY3Rpb25zIG1hdGNoaW5nIHRoaXMgcGF0aFxuICAgKiBAcGFyYW0geyhCb29sZWFufE9iamVjdCl9IFtvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlPWZhbHNlXSBFbmFibGUvZGlzYWJsZVxuICAgKiAgICAgcGVybWVzc2FnZS1kZWZsYXRlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wb3J0XSBUaGUgcG9ydCB3aGVyZSB0byBiaW5kIHRoZSBzZXJ2ZXJcbiAgICogQHBhcmFtIHsoaHR0cC5TZXJ2ZXJ8aHR0cHMuU2VydmVyKX0gW29wdGlvbnMuc2VydmVyXSBBIHByZS1jcmVhdGVkIEhUVFAvU1xuICAgKiAgICAgc2VydmVyIHRvIHVzZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAgICogICAgIG5vdCB0byBza2lwIFVURi04IHZhbGlkYXRpb24gZm9yIHRleHQgYW5kIGNsb3NlIG1lc3NhZ2VzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnZlcmlmeUNsaWVudF0gQSBob29rIHRvIHJlamVjdCBjb25uZWN0aW9uc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5XZWJTb2NrZXQ9V2ViU29ja2V0XSBTcGVjaWZpZXMgdGhlIGBXZWJTb2NrZXRgXG4gICAqICAgICBjbGFzcyB0byB1c2UuIEl0IG11c3QgYmUgdGhlIGBXZWJTb2NrZXRgIGNsYXNzIG9yIGNsYXNzIHRoYXQgZXh0ZW5kcyBpdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIEEgbGlzdGVuZXIgZm9yIHRoZSBgbGlzdGVuaW5nYCBldmVudFxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBzdXBlcigpO1xuXG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IHRydWUsXG4gICAgICBhdXRvUG9uZzogdHJ1ZSxcbiAgICAgIG1heFBheWxvYWQ6IDEwMCAqIDEwMjQgKiAxMDI0LFxuICAgICAgc2tpcFVURjhWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICAgIHBlck1lc3NhZ2VEZWZsYXRlOiBmYWxzZSxcbiAgICAgIGhhbmRsZVByb3RvY29sczogbnVsbCxcbiAgICAgIGNsaWVudFRyYWNraW5nOiB0cnVlLFxuICAgICAgdmVyaWZ5Q2xpZW50OiBudWxsLFxuICAgICAgbm9TZXJ2ZXI6IGZhbHNlLFxuICAgICAgYmFja2xvZzogbnVsbCwgLy8gdXNlIGRlZmF1bHQgKDUxMSBhcyBpbXBsZW1lbnRlZCBpbiBuZXQuanMpXG4gICAgICBzZXJ2ZXI6IG51bGwsXG4gICAgICBob3N0OiBudWxsLFxuICAgICAgcGF0aDogbnVsbCxcbiAgICAgIHBvcnQ6IG51bGwsXG4gICAgICBXZWJTb2NrZXQsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIGlmIChcbiAgICAgIChvcHRpb25zLnBvcnQgPT0gbnVsbCAmJiAhb3B0aW9ucy5zZXJ2ZXIgJiYgIW9wdGlvbnMubm9TZXJ2ZXIpIHx8XG4gICAgICAob3B0aW9ucy5wb3J0ICE9IG51bGwgJiYgKG9wdGlvbnMuc2VydmVyIHx8IG9wdGlvbnMubm9TZXJ2ZXIpKSB8fFxuICAgICAgKG9wdGlvbnMuc2VydmVyICYmIG9wdGlvbnMubm9TZXJ2ZXIpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgXCJwb3J0XCIsIFwic2VydmVyXCIsIG9yIFwibm9TZXJ2ZXJcIiBvcHRpb25zICcgK1xuICAgICAgICAgICdtdXN0IGJlIHNwZWNpZmllZCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucG9ydCAhPSBudWxsKSB7XG4gICAgICB0aGlzLl9zZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcigocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgYm9keSA9IGh0dHAuU1RBVFVTX0NPREVTWzQyNl07XG5cbiAgICAgICAgcmVzLndyaXRlSGVhZCg0MjYsIHtcbiAgICAgICAgICAnQ29udGVudC1MZW5ndGgnOiBib2R5Lmxlbmd0aCxcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nXG4gICAgICAgIH0pO1xuICAgICAgICByZXMuZW5kKGJvZHkpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9zZXJ2ZXIubGlzdGVuKFxuICAgICAgICBvcHRpb25zLnBvcnQsXG4gICAgICAgIG9wdGlvbnMuaG9zdCxcbiAgICAgICAgb3B0aW9ucy5iYWNrbG9nLFxuICAgICAgICBjYWxsYmFja1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc2VydmVyKSB7XG4gICAgICB0aGlzLl9zZXJ2ZXIgPSBvcHRpb25zLnNlcnZlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2VydmVyKSB7XG4gICAgICBjb25zdCBlbWl0Q29ubmVjdGlvbiA9IHRoaXMuZW1pdC5iaW5kKHRoaXMsICdjb25uZWN0aW9uJyk7XG5cbiAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycyA9IGFkZExpc3RlbmVycyh0aGlzLl9zZXJ2ZXIsIHtcbiAgICAgICAgbGlzdGVuaW5nOiB0aGlzLmVtaXQuYmluZCh0aGlzLCAnbGlzdGVuaW5nJyksXG4gICAgICAgIGVycm9yOiB0aGlzLmVtaXQuYmluZCh0aGlzLCAnZXJyb3InKSxcbiAgICAgICAgdXBncmFkZTogKHJlcSwgc29ja2V0LCBoZWFkKSA9PiB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVVcGdyYWRlKHJlcSwgc29ja2V0LCBoZWFkLCBlbWl0Q29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlID09PSB0cnVlKSBvcHRpb25zLnBlck1lc3NhZ2VEZWZsYXRlID0ge307XG4gICAgaWYgKG9wdGlvbnMuY2xpZW50VHJhY2tpbmcpIHtcbiAgICAgIHRoaXMuY2xpZW50cyA9IG5ldyBTZXQoKTtcbiAgICAgIHRoaXMuX3Nob3VsZEVtaXRDbG9zZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5fc3RhdGUgPSBSVU5OSU5HO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGJvdW5kIGFkZHJlc3MsIHRoZSBhZGRyZXNzIGZhbWlseSBuYW1lLCBhbmQgcG9ydCBvZiB0aGUgc2VydmVyXG4gICAqIGFzIHJlcG9ydGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlmIGxpc3RlbmluZyBvbiBhbiBJUCBzb2NrZXQuXG4gICAqIElmIHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uIGEgcGlwZSBvciBVTklYIGRvbWFpbiBzb2NrZXQsIHRoZSBuYW1lIGlzXG4gICAqIHJldHVybmVkIGFzIGEgc3RyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJuIHsoT2JqZWN0fFN0cmluZ3xudWxsKX0gVGhlIGFkZHJlc3Mgb2YgdGhlIHNlcnZlclxuICAgKiBAcHVibGljXG4gICAqL1xuICBhZGRyZXNzKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMubm9TZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHNlcnZlciBpcyBvcGVyYXRpbmcgaW4gXCJub1NlcnZlclwiIG1vZGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3NlcnZlcikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlci5hZGRyZXNzKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB0aGUgc2VydmVyIGZyb20gYWNjZXB0aW5nIG5ldyBjb25uZWN0aW9ucyBhbmQgZW1pdCB0aGUgYCdjbG9zZSdgIGV2ZW50XG4gICAqIHdoZW4gYWxsIGV4aXN0aW5nIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgdGhlIGAnY2xvc2UnYCBldmVudFxuICAgKiBAcHVibGljXG4gICAqL1xuICBjbG9zZShjYikge1xuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gQ0xPU0VEKSB7XG4gICAgICBpZiAoY2IpIHtcbiAgICAgICAgdGhpcy5vbmNlKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICBjYihuZXcgRXJyb3IoJ1RoZSBzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZSwgdGhpcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNiKSB0aGlzLm9uY2UoJ2Nsb3NlJywgY2IpO1xuXG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBDTE9TSU5HKSByZXR1cm47XG4gICAgdGhpcy5fc3RhdGUgPSBDTE9TSU5HO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub1NlcnZlciB8fCB0aGlzLm9wdGlvbnMuc2VydmVyKSB7XG4gICAgICBpZiAodGhpcy5fc2VydmVyKSB7XG4gICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMgPSB0aGlzLl9zZXJ2ZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jbGllbnRzKSB7XG4gICAgICAgIGlmICghdGhpcy5jbGllbnRzLnNpemUpIHtcbiAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZSwgdGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fc2hvdWxkRW1pdENsb3NlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2UsIHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLl9zZXJ2ZXI7XG5cbiAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO1xuICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzID0gdGhpcy5fc2VydmVyID0gbnVsbDtcblxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBIVFRQL1Mgc2VydmVyIHdhcyBjcmVhdGVkIGludGVybmFsbHkuIENsb3NlIGl0LCBhbmQgcmVseSBvbiBpdHNcbiAgICAgIC8vIGAnY2xvc2UnYCBldmVudC5cbiAgICAgIC8vXG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICBlbWl0Q2xvc2UodGhpcyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VlIGlmIGEgZ2l2ZW4gcmVxdWVzdCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGlzIHNlcnZlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtodHRwLkluY29taW5nTWVzc2FnZX0gcmVxIFJlcXVlc3Qgb2JqZWN0IHRvIGluc3BlY3RcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSByZXF1ZXN0IGlzIHZhbGlkLCBlbHNlIGBmYWxzZWBcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2hvdWxkSGFuZGxlKHJlcSkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMucGF0aCkge1xuICAgICAgY29uc3QgaW5kZXggPSByZXEudXJsLmluZGV4T2YoJz8nKTtcbiAgICAgIGNvbnN0IHBhdGhuYW1lID0gaW5kZXggIT09IC0xID8gcmVxLnVybC5zbGljZSgwLCBpbmRleCkgOiByZXEudXJsO1xuXG4gICAgICBpZiAocGF0aG5hbWUgIT09IHRoaXMub3B0aW9ucy5wYXRoKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGEgSFRUUCBVcGdyYWRlIHJlcXVlc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7aHR0cC5JbmNvbWluZ01lc3NhZ2V9IHJlcSBUaGUgcmVxdWVzdCBvYmplY3RcbiAgICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgbmV0d29yayBzb2NrZXQgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWQgVGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgdXBncmFkZWQgc3RyZWFtXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGhhbmRsZVVwZ3JhZGUocmVxLCBzb2NrZXQsIGhlYWQsIGNiKSB7XG4gICAgc29ja2V0Lm9uKCdlcnJvcicsIHNvY2tldE9uRXJyb3IpO1xuXG4gICAgY29uc3Qga2V5ID0gcmVxLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQta2V5J107XG4gICAgY29uc3QgdXBncmFkZSA9IHJlcS5oZWFkZXJzLnVwZ3JhZGU7XG4gICAgY29uc3QgdmVyc2lvbiA9ICtyZXEuaGVhZGVyc1snc2VjLXdlYnNvY2tldC12ZXJzaW9uJ107XG5cbiAgICBpZiAocmVxLm1ldGhvZCAhPT0gJ0dFVCcpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnSW52YWxpZCBIVFRQIG1ldGhvZCc7XG4gICAgICBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3IodGhpcywgcmVxLCBzb2NrZXQsIDQwNSwgbWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHVwZ3JhZGUgPT09IHVuZGVmaW5lZCB8fCB1cGdyYWRlLnRvTG93ZXJDYXNlKCkgIT09ICd3ZWJzb2NrZXQnKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgVXBncmFkZSBoZWFkZXInO1xuICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCB8fCAha2V5UmVnZXgudGVzdChrZXkpKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ01pc3Npbmcgb3IgaW52YWxpZCBTZWMtV2ViU29ja2V0LUtleSBoZWFkZXInO1xuICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2ZXJzaW9uICE9PSA4ICYmIHZlcnNpb24gIT09IDEzKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gJ01pc3Npbmcgb3IgaW52YWxpZCBTZWMtV2ViU29ja2V0LVZlcnNpb24gaGVhZGVyJztcbiAgICAgIGFib3J0SGFuZHNoYWtlT3JFbWl0d3NDbGllbnRFcnJvcih0aGlzLCByZXEsIHNvY2tldCwgNDAwLCBtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2hvdWxkSGFuZGxlKHJlcSkpIHtcbiAgICAgIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgNDAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWNXZWJTb2NrZXRQcm90b2NvbCA9IHJlcS5oZWFkZXJzWydzZWMtd2Vic29ja2V0LXByb3RvY29sJ107XG4gICAgbGV0IHByb3RvY29scyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChzZWNXZWJTb2NrZXRQcm90b2NvbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwcm90b2NvbHMgPSBzdWJwcm90b2NvbC5wYXJzZShzZWNXZWJTb2NrZXRQcm90b2NvbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgaGVhZGVyJztcbiAgICAgICAgYWJvcnRIYW5kc2hha2VPckVtaXR3c0NsaWVudEVycm9yKHRoaXMsIHJlcSwgc29ja2V0LCA0MDAsIG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VjV2ViU29ja2V0RXh0ZW5zaW9ucyA9IHJlcS5oZWFkZXJzWydzZWMtd2Vic29ja2V0LWV4dGVuc2lvbnMnXTtcbiAgICBjb25zdCBleHRlbnNpb25zID0ge307XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLm9wdGlvbnMucGVyTWVzc2FnZURlZmxhdGUgJiZcbiAgICAgIHNlY1dlYlNvY2tldEV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc3QgcGVyTWVzc2FnZURlZmxhdGUgPSBuZXcgUGVyTWVzc2FnZURlZmxhdGUoXG4gICAgICAgIHRoaXMub3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5vcHRpb25zLm1heFBheWxvYWRcbiAgICAgICk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9mZmVycyA9IGV4dGVuc2lvbi5wYXJzZShzZWNXZWJTb2NrZXRFeHRlbnNpb25zKTtcblxuICAgICAgICBpZiAob2ZmZXJzW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdKSB7XG4gICAgICAgICAgcGVyTWVzc2FnZURlZmxhdGUuYWNjZXB0KG9mZmVyc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSk7XG4gICAgICAgICAgZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSA9IHBlck1lc3NhZ2VEZWZsYXRlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgJ0ludmFsaWQgb3IgdW5hY2NlcHRhYmxlIFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyBoZWFkZXInO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3IodGhpcywgcmVxLCBzb2NrZXQsIDQwMCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIE9wdGlvbmFsbHkgY2FsbCBleHRlcm5hbCBjbGllbnQgdmVyaWZpY2F0aW9uIGhhbmRsZXIuXG4gICAgLy9cbiAgICBpZiAodGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudCkge1xuICAgICAgY29uc3QgaW5mbyA9IHtcbiAgICAgICAgb3JpZ2luOlxuICAgICAgICAgIHJlcS5oZWFkZXJzW2Ake3ZlcnNpb24gPT09IDggPyAnc2VjLXdlYnNvY2tldC1vcmlnaW4nIDogJ29yaWdpbid9YF0sXG4gICAgICAgIHNlY3VyZTogISEocmVxLnNvY2tldC5hdXRob3JpemVkIHx8IHJlcS5zb2NrZXQuZW5jcnlwdGVkKSxcbiAgICAgICAgcmVxXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnZlcmlmeUNsaWVudChpbmZvLCAodmVyaWZpZWQsIGNvZGUsIG1lc3NhZ2UsIGhlYWRlcnMpID0+IHtcbiAgICAgICAgICBpZiAoIXZlcmlmaWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYWJvcnRIYW5kc2hha2Uoc29ja2V0LCBjb2RlIHx8IDQwMSwgbWVzc2FnZSwgaGVhZGVycyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb21wbGV0ZVVwZ3JhZGUoXG4gICAgICAgICAgICBleHRlbnNpb25zLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcHJvdG9jb2xzLFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgc29ja2V0LFxuICAgICAgICAgICAgaGVhZCxcbiAgICAgICAgICAgIGNiXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudmVyaWZ5Q2xpZW50KGluZm8pKSByZXR1cm4gYWJvcnRIYW5kc2hha2Uoc29ja2V0LCA0MDEpO1xuICAgIH1cblxuICAgIHRoaXMuY29tcGxldGVVcGdyYWRlKGV4dGVuc2lvbnMsIGtleSwgcHJvdG9jb2xzLCByZXEsIHNvY2tldCwgaGVhZCwgY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZ3JhZGUgdGhlIGNvbm5lY3Rpb24gdG8gV2ViU29ja2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXh0ZW5zaW9ucyBUaGUgYWNjZXB0ZWQgZXh0ZW5zaW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IFRoZSB2YWx1ZSBvZiB0aGUgYFNlYy1XZWJTb2NrZXQtS2V5YCBoZWFkZXJcbiAgICogQHBhcmFtIHtTZXR9IHByb3RvY29scyBUaGUgc3VicHJvdG9jb2xzXG4gICAqIEBwYXJhbSB7aHR0cC5JbmNvbWluZ01lc3NhZ2V9IHJlcSBUaGUgcmVxdWVzdCBvYmplY3RcbiAgICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgbmV0d29yayBzb2NrZXQgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCBjbGllbnRcbiAgICogQHBhcmFtIHtCdWZmZXJ9IGhlYWQgVGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgdXBncmFkZWQgc3RyZWFtXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIENhbGxiYWNrXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugd2l0aCB0aGUgc2FtZSBzb2NrZXRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbXBsZXRlVXBncmFkZShleHRlbnNpb25zLCBrZXksIHByb3RvY29scywgcmVxLCBzb2NrZXQsIGhlYWQsIGNiKSB7XG4gICAgLy9cbiAgICAvLyBEZXN0cm95IHRoZSBzb2NrZXQgaWYgdGhlIGNsaWVudCBoYXMgYWxyZWFkeSBzZW50IGEgRklOIHBhY2tldC5cbiAgICAvL1xuICAgIGlmICghc29ja2V0LnJlYWRhYmxlIHx8ICFzb2NrZXQud3JpdGFibGUpIHJldHVybiBzb2NrZXQuZGVzdHJveSgpO1xuXG4gICAgaWYgKHNvY2tldFtrV2ViU29ja2V0XSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnc2VydmVyLmhhbmRsZVVwZ3JhZGUoKSB3YXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHdpdGggdGhlIHNhbWUgJyArXG4gICAgICAgICAgJ3NvY2tldCwgcG9zc2libHkgZHVlIHRvIGEgbWlzY29uZmlndXJhdGlvbidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3N0YXRlID4gUlVOTklORykgcmV0dXJuIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgNTAzKTtcblxuICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goJ3NoYTEnKVxuICAgICAgLnVwZGF0ZShrZXkgKyBHVUlEKVxuICAgICAgLmRpZ2VzdCgnYmFzZTY0Jyk7XG5cbiAgICBjb25zdCBoZWFkZXJzID0gW1xuICAgICAgJ0hUVFAvMS4xIDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzJyxcbiAgICAgICdVcGdyYWRlOiB3ZWJzb2NrZXQnLFxuICAgICAgJ0Nvbm5lY3Rpb246IFVwZ3JhZGUnLFxuICAgICAgYFNlYy1XZWJTb2NrZXQtQWNjZXB0OiAke2RpZ2VzdH1gXG4gICAgXTtcblxuICAgIGNvbnN0IHdzID0gbmV3IHRoaXMub3B0aW9ucy5XZWJTb2NrZXQobnVsbCwgdW5kZWZpbmVkLCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgaWYgKHByb3RvY29scy5zaXplKSB7XG4gICAgICAvL1xuICAgICAgLy8gT3B0aW9uYWxseSBjYWxsIGV4dGVybmFsIHByb3RvY29sIHNlbGVjdGlvbiBoYW5kbGVyLlxuICAgICAgLy9cbiAgICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5vcHRpb25zLmhhbmRsZVByb3RvY29sc1xuICAgICAgICA/IHRoaXMub3B0aW9ucy5oYW5kbGVQcm90b2NvbHMocHJvdG9jb2xzLCByZXEpXG4gICAgICAgIDogcHJvdG9jb2xzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcblxuICAgICAgaWYgKHByb3RvY29sKSB7XG4gICAgICAgIGhlYWRlcnMucHVzaChgU2VjLVdlYlNvY2tldC1Qcm90b2NvbDogJHtwcm90b2NvbH1gKTtcbiAgICAgICAgd3MuX3Byb3RvY29sID0gcHJvdG9jb2w7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0pIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IGV4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0ucGFyYW1zO1xuICAgICAgY29uc3QgdmFsdWUgPSBleHRlbnNpb24uZm9ybWF0KHtcbiAgICAgICAgW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdOiBbcGFyYW1zXVxuICAgICAgfSk7XG4gICAgICBoZWFkZXJzLnB1c2goYFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9uczogJHt2YWx1ZX1gKTtcbiAgICAgIHdzLl9leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIEFsbG93IGV4dGVybmFsIG1vZGlmaWNhdGlvbi9pbnNwZWN0aW9uIG9mIGhhbmRzaGFrZSBoZWFkZXJzLlxuICAgIC8vXG4gICAgdGhpcy5lbWl0KCdoZWFkZXJzJywgaGVhZGVycywgcmVxKTtcblxuICAgIHNvY2tldC53cml0ZShoZWFkZXJzLmNvbmNhdCgnXFxyXFxuJykuam9pbignXFxyXFxuJykpO1xuICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBzb2NrZXRPbkVycm9yKTtcblxuICAgIHdzLnNldFNvY2tldChzb2NrZXQsIGhlYWQsIHtcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IHRoaXMub3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzLFxuICAgICAgbWF4UGF5bG9hZDogdGhpcy5vcHRpb25zLm1heFBheWxvYWQsXG4gICAgICBza2lwVVRGOFZhbGlkYXRpb246IHRoaXMub3B0aW9ucy5za2lwVVRGOFZhbGlkYXRpb25cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNsaWVudHMpIHtcbiAgICAgIHRoaXMuY2xpZW50cy5hZGQod3MpO1xuICAgICAgd3Mub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICB0aGlzLmNsaWVudHMuZGVsZXRlKHdzKTtcblxuICAgICAgICBpZiAodGhpcy5fc2hvdWxkRW1pdENsb3NlICYmICF0aGlzLmNsaWVudHMuc2l6ZSkge1xuICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlLCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2Iod3MsIHJlcSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBXZWJTb2NrZXRTZXJ2ZXI7XG5cbi8qKlxuICogQWRkIGV2ZW50IGxpc3RlbmVycyBvbiBhbiBgRXZlbnRFbWl0dGVyYCB1c2luZyBhIG1hcCBvZiA8ZXZlbnQsIGxpc3RlbmVyPlxuICogcGFpcnMuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IHNlcnZlciBUaGUgZXZlbnQgZW1pdHRlclxuICogQHBhcmFtIHtPYmplY3QuPFN0cmluZywgRnVuY3Rpb24+fSBtYXAgVGhlIGxpc3RlbmVycyB0byBhZGRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCByZW1vdmUgdGhlIGFkZGVkIGxpc3RlbmVycyB3aGVuXG4gKiAgICAgY2FsbGVkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRMaXN0ZW5lcnMoc2VydmVyLCBtYXApIHtcbiAgZm9yIChjb25zdCBldmVudCBvZiBPYmplY3Qua2V5cyhtYXApKSBzZXJ2ZXIub24oZXZlbnQsIG1hcFtldmVudF0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcnMoKSB7XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBPYmplY3Qua2V5cyhtYXApKSB7XG4gICAgICBzZXJ2ZXIucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIG1hcFtldmVudF0pO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBFbWl0IGEgYCdjbG9zZSdgIGV2ZW50IG9uIGFuIGBFdmVudEVtaXR0ZXJgLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBzZXJ2ZXIgVGhlIGV2ZW50IGVtaXR0ZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGVtaXRDbG9zZShzZXJ2ZXIpIHtcbiAgc2VydmVyLl9zdGF0ZSA9IENMT1NFRDtcbiAgc2VydmVyLmVtaXQoJ2Nsb3NlJyk7XG59XG5cbi8qKlxuICogSGFuZGxlIHNvY2tldCBlcnJvcnMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc29ja2V0T25FcnJvcigpIHtcbiAgdGhpcy5kZXN0cm95KCk7XG59XG5cbi8qKlxuICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24gd2hlbiBwcmVjb25kaXRpb25zIGFyZSBub3QgZnVsZmlsbGVkLlxuICpcbiAqIEBwYXJhbSB7RHVwbGV4fSBzb2NrZXQgVGhlIHNvY2tldCBvZiB0aGUgdXBncmFkZSByZXF1ZXN0XG4gKiBAcGFyYW0ge051bWJlcn0gY29kZSBUaGUgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZVxuICogQHBhcmFtIHtTdHJpbmd9IFttZXNzYWdlXSBUaGUgSFRUUCByZXNwb25zZSBib2R5XG4gKiBAcGFyYW0ge09iamVjdH0gW2hlYWRlcnNdIEFkZGl0aW9uYWwgSFRUUCByZXNwb25zZSBoZWFkZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZShzb2NrZXQsIGNvZGUsIG1lc3NhZ2UsIGhlYWRlcnMpIHtcbiAgLy9cbiAgLy8gVGhlIHNvY2tldCBpcyB3cml0YWJsZSB1bmxlc3MgdGhlIHVzZXIgZGVzdHJveWVkIG9yIGVuZGVkIGl0IGJlZm9yZSBjYWxsaW5nXG4gIC8vIGBzZXJ2ZXIuaGFuZGxlVXBncmFkZSgpYCBvciBpbiB0aGUgYHZlcmlmeUNsaWVudGAgZnVuY3Rpb24sIHdoaWNoIGlzIGEgdXNlclxuICAvLyBlcnJvci4gSGFuZGxpbmcgdGhpcyBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UgYXMgdGhlIHdvcnN0IHRoYXQgY2FuIGhhcHBlblxuICAvLyBpcyB0aGF0IHNvbWUgb2YgdGhlIGRhdGEgd3JpdHRlbiBieSB0aGUgdXNlciBtaWdodCBiZSBkaXNjYXJkZWQgZHVlIHRvIHRoZVxuICAvLyBjYWxsIHRvIGBzb2NrZXQuZW5kKClgIGJlbG93LCB3aGljaCB0cmlnZ2VycyBhbiBgJ2Vycm9yJ2AgZXZlbnQgdGhhdCBpblxuICAvLyB0dXJuIGNhdXNlcyB0aGUgc29ja2V0IHRvIGJlIGRlc3Ryb3llZC5cbiAgLy9cbiAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgaHR0cC5TVEFUVVNfQ09ERVNbY29kZV07XG4gIGhlYWRlcnMgPSB7XG4gICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcbiAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbCcsXG4gICAgJ0NvbnRlbnQtTGVuZ3RoJzogQnVmZmVyLmJ5dGVMZW5ndGgobWVzc2FnZSksXG4gICAgLi4uaGVhZGVyc1xuICB9O1xuXG4gIHNvY2tldC5vbmNlKCdmaW5pc2gnLCBzb2NrZXQuZGVzdHJveSk7XG5cbiAgc29ja2V0LmVuZChcbiAgICBgSFRUUC8xLjEgJHtjb2RlfSAke2h0dHAuU1RBVFVTX0NPREVTW2NvZGVdfVxcclxcbmAgK1xuICAgICAgT2JqZWN0LmtleXMoaGVhZGVycylcbiAgICAgICAgLm1hcCgoaCkgPT4gYCR7aH06ICR7aGVhZGVyc1toXX1gKVxuICAgICAgICAuam9pbignXFxyXFxuJykgK1xuICAgICAgJ1xcclxcblxcclxcbicgK1xuICAgICAgbWVzc2FnZVxuICApO1xufVxuXG4vKipcbiAqIEVtaXQgYSBgJ3dzQ2xpZW50RXJyb3InYCBldmVudCBvbiBhIGBXZWJTb2NrZXRTZXJ2ZXJgIGlmIHRoZXJlIGlzIGF0IGxlYXN0XG4gKiBvbmUgbGlzdGVuZXIgZm9yIGl0LCBvdGhlcndpc2UgY2FsbCBgYWJvcnRIYW5kc2hha2UoKWAuXG4gKlxuICogQHBhcmFtIHtXZWJTb2NrZXRTZXJ2ZXJ9IHNlcnZlciBUaGUgV2ViU29ja2V0IHNlcnZlclxuICogQHBhcmFtIHtodHRwLkluY29taW5nTWVzc2FnZX0gcmVxIFRoZSByZXF1ZXN0IG9iamVjdFxuICogQHBhcmFtIHtEdXBsZXh9IHNvY2tldCBUaGUgc29ja2V0IG9mIHRoZSB1cGdyYWRlIHJlcXVlc3RcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlIFRoZSBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgSFRUUCByZXNwb25zZSBib2R5XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZU9yRW1pdHdzQ2xpZW50RXJyb3Ioc2VydmVyLCByZXEsIHNvY2tldCwgY29kZSwgbWVzc2FnZSkge1xuICBpZiAoc2VydmVyLmxpc3RlbmVyQ291bnQoJ3dzQ2xpZW50RXJyb3InKSkge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIGFib3J0SGFuZHNoYWtlT3JFbWl0d3NDbGllbnRFcnJvcik7XG5cbiAgICBzZXJ2ZXIuZW1pdCgnd3NDbGllbnRFcnJvcicsIGVyciwgc29ja2V0LCByZXEpO1xuICB9IGVsc2Uge1xuICAgIGFib3J0SGFuZHNoYWtlKHNvY2tldCwgY29kZSwgbWVzc2FnZSk7XG4gIH1cbn1cbiIsIi8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcInZhcnNJZ25vcmVQYXR0ZXJuXCI6IFwiXkR1cGxleHxSZWFkYWJsZSRcIiwgXCJjYXVnaHRFcnJvcnNcIjogXCJub25lXCIgfV0gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCBuZXQgPSByZXF1aXJlKCduZXQnKTtcbmNvbnN0IHRscyA9IHJlcXVpcmUoJ3RscycpO1xuY29uc3QgeyByYW5kb21CeXRlcywgY3JlYXRlSGFzaCB9ID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCB7IER1cGxleCwgUmVhZGFibGUgfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuY29uc3QgeyBVUkwgfSA9IHJlcXVpcmUoJ3VybCcpO1xuXG5jb25zdCBQZXJNZXNzYWdlRGVmbGF0ZSA9IHJlcXVpcmUoJy4vcGVybWVzc2FnZS1kZWZsYXRlJyk7XG5jb25zdCBSZWNlaXZlciA9IHJlcXVpcmUoJy4vcmVjZWl2ZXInKTtcbmNvbnN0IFNlbmRlciA9IHJlcXVpcmUoJy4vc2VuZGVyJyk7XG5jb25zdCB7IGlzQmxvYiB9ID0gcmVxdWlyZSgnLi92YWxpZGF0aW9uJyk7XG5cbmNvbnN0IHtcbiAgQklOQVJZX1RZUEVTLFxuICBFTVBUWV9CVUZGRVIsXG4gIEdVSUQsXG4gIGtGb3JPbkV2ZW50QXR0cmlidXRlLFxuICBrTGlzdGVuZXIsXG4gIGtTdGF0dXNDb2RlLFxuICBrV2ViU29ja2V0LFxuICBOT09QXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbmNvbnN0IHtcbiAgRXZlbnRUYXJnZXQ6IHsgYWRkRXZlbnRMaXN0ZW5lciwgcmVtb3ZlRXZlbnRMaXN0ZW5lciB9XG59ID0gcmVxdWlyZSgnLi9ldmVudC10YXJnZXQnKTtcbmNvbnN0IHsgZm9ybWF0LCBwYXJzZSB9ID0gcmVxdWlyZSgnLi9leHRlbnNpb24nKTtcbmNvbnN0IHsgdG9CdWZmZXIgfSA9IHJlcXVpcmUoJy4vYnVmZmVyLXV0aWwnKTtcblxuY29uc3QgY2xvc2VUaW1lb3V0ID0gMzAgKiAxMDAwO1xuY29uc3Qga0Fib3J0ZWQgPSBTeW1ib2woJ2tBYm9ydGVkJyk7XG5jb25zdCBwcm90b2NvbFZlcnNpb25zID0gWzgsIDEzXTtcbmNvbnN0IHJlYWR5U3RhdGVzID0gWydDT05ORUNUSU5HJywgJ09QRU4nLCAnQ0xPU0lORycsICdDTE9TRUQnXTtcbmNvbnN0IHN1YnByb3RvY29sUmVnZXggPSAvXlshIyQlJicqK1xcLS4wLTlBLVpeX2B8YS16fl0rJC87XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgV2ViU29ja2V0LlxuICpcbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICovXG5jbGFzcyBXZWJTb2NrZXQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGBXZWJTb2NrZXRgLlxuICAgKlxuICAgKiBAcGFyYW0geyhTdHJpbmd8VVJMKX0gYWRkcmVzcyBUaGUgVVJMIHRvIHdoaWNoIHRvIGNvbm5lY3RcbiAgICogQHBhcmFtIHsoU3RyaW5nfFN0cmluZ1tdKX0gW3Byb3RvY29sc10gVGhlIHN1YnByb3RvY29sc1xuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIENvbm5lY3Rpb24gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IoYWRkcmVzcywgcHJvdG9jb2xzLCBvcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2JpbmFyeVR5cGUgPSBCSU5BUllfVFlQRVNbMF07XG4gICAgdGhpcy5fY2xvc2VDb2RlID0gMTAwNjtcbiAgICB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jbG9zZUZyYW1lU2VudCA9IGZhbHNlO1xuICAgIHRoaXMuX2Nsb3NlTWVzc2FnZSA9IEVNUFRZX0JVRkZFUjtcbiAgICB0aGlzLl9jbG9zZVRpbWVyID0gbnVsbDtcbiAgICB0aGlzLl9lcnJvckVtaXR0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9leHRlbnNpb25zID0ge307XG4gICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5fcHJvdG9jb2wgPSAnJztcbiAgICB0aGlzLl9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNPTk5FQ1RJTkc7XG4gICAgdGhpcy5fcmVjZWl2ZXIgPSBudWxsO1xuICAgIHRoaXMuX3NlbmRlciA9IG51bGw7XG4gICAgdGhpcy5fc29ja2V0ID0gbnVsbDtcblxuICAgIGlmIChhZGRyZXNzICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9idWZmZXJlZEFtb3VudCA9IDA7XG4gICAgICB0aGlzLl9pc1NlcnZlciA9IGZhbHNlO1xuICAgICAgdGhpcy5fcmVkaXJlY3RzID0gMDtcblxuICAgICAgaWYgKHByb3RvY29scyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3RvY29scyA9IFtdO1xuICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShwcm90b2NvbHMpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdG9jb2xzID09PSAnb2JqZWN0JyAmJiBwcm90b2NvbHMgIT09IG51bGwpIHtcbiAgICAgICAgICBvcHRpb25zID0gcHJvdG9jb2xzO1xuICAgICAgICAgIHByb3RvY29scyA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3RvY29scyA9IFtwcm90b2NvbHNdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGluaXRBc0NsaWVudCh0aGlzLCBhZGRyZXNzLCBwcm90b2NvbHMsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hdXRvUG9uZyA9IG9wdGlvbnMuYXV0b1Bvbmc7XG4gICAgICB0aGlzLl9pc1NlcnZlciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoZSBjdXN0b20gXCJub2RlYnVmZmVyXCIgdHlwZSBpcyB1c2VkIGJ5IHRoZSBkZWZhdWx0XG4gICAqIGluc3RlYWQgb2YgXCJibG9iXCIuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgYmluYXJ5VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYmluYXJ5VHlwZTtcbiAgfVxuXG4gIHNldCBiaW5hcnlUeXBlKHR5cGUpIHtcbiAgICBpZiAoIUJJTkFSWV9UWVBFUy5pbmNsdWRlcyh0eXBlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5fYmluYXJ5VHlwZSA9IHR5cGU7XG5cbiAgICAvL1xuICAgIC8vIEFsbG93IHRvIGNoYW5nZSBgYmluYXJ5VHlwZWAgb24gdGhlIGZseS5cbiAgICAvL1xuICAgIGlmICh0aGlzLl9yZWNlaXZlcikgdGhpcy5fcmVjZWl2ZXIuX2JpbmFyeVR5cGUgPSB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgYnVmZmVyZWRBbW91bnQoKSB7XG4gICAgaWYgKCF0aGlzLl9zb2NrZXQpIHJldHVybiB0aGlzLl9idWZmZXJlZEFtb3VudDtcblxuICAgIHJldHVybiB0aGlzLl9zb2NrZXQuX3dyaXRhYmxlU3RhdGUubGVuZ3RoICsgdGhpcy5fc2VuZGVyLl9idWZmZXJlZEJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgZXh0ZW5zaW9ucygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fZXh0ZW5zaW9ucykuam9pbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgZ2V0IGlzUGF1c2VkKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXVzZWQ7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0IG9uY2xvc2UoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0IG9uZXJyb3IoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKi9cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZ2V0IG9ub3BlbigpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBnZXQgb25tZXNzYWdlKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBnZXQgcHJvdG9jb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgcmVhZHlTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZHlTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKi9cbiAgZ2V0IHVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB1cCB0aGUgc29ja2V0IGFuZCB0aGUgaW50ZXJuYWwgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge0R1cGxleH0gc29ja2V0IFRoZSBuZXR3b3JrIHNvY2tldCBiZXR3ZWVuIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gaGVhZCBUaGUgZmlyc3QgcGFja2V0IG9mIHRoZSB1cGdyYWRlZCBzdHJlYW1cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlclxuICAgKiAgICAgYW55IG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWRcbiAgICogICAgIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHRpY2tcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZ2VuZXJhdGVNYXNrXSBUaGUgZnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSB0aGVcbiAgICogICAgIG1hc2tpbmcga2V5XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhQYXlsb2FkPTBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZSBzaXplXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2tpcFVURjhWYWxpZGF0aW9uPWZhbHNlXSBTcGVjaWZpZXMgd2hldGhlciBvclxuICAgKiAgICAgbm90IHRvIHNraXAgVVRGLTggdmFsaWRhdGlvbiBmb3IgdGV4dCBhbmQgY2xvc2UgbWVzc2FnZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldFNvY2tldChzb2NrZXQsIGhlYWQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCByZWNlaXZlciA9IG5ldyBSZWNlaXZlcih7XG4gICAgICBhbGxvd1N5bmNocm9ub3VzRXZlbnRzOiBvcHRpb25zLmFsbG93U3luY2hyb25vdXNFdmVudHMsXG4gICAgICBiaW5hcnlUeXBlOiB0aGlzLmJpbmFyeVR5cGUsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLl9leHRlbnNpb25zLFxuICAgICAgaXNTZXJ2ZXI6IHRoaXMuX2lzU2VydmVyLFxuICAgICAgbWF4UGF5bG9hZDogb3B0aW9ucy5tYXhQYXlsb2FkLFxuICAgICAgc2tpcFVURjhWYWxpZGF0aW9uOiBvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvblxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2VuZGVyID0gbmV3IFNlbmRlcihzb2NrZXQsIHRoaXMuX2V4dGVuc2lvbnMsIG9wdGlvbnMuZ2VuZXJhdGVNYXNrKTtcblxuICAgIHRoaXMuX3JlY2VpdmVyID0gcmVjZWl2ZXI7XG4gICAgdGhpcy5fc2VuZGVyID0gc2VuZGVyO1xuICAgIHRoaXMuX3NvY2tldCA9IHNvY2tldDtcblxuICAgIHJlY2VpdmVyW2tXZWJTb2NrZXRdID0gdGhpcztcbiAgICBzZW5kZXJba1dlYlNvY2tldF0gPSB0aGlzO1xuICAgIHNvY2tldFtrV2ViU29ja2V0XSA9IHRoaXM7XG5cbiAgICByZWNlaXZlci5vbignY29uY2x1ZGUnLCByZWNlaXZlck9uQ29uY2x1ZGUpO1xuICAgIHJlY2VpdmVyLm9uKCdkcmFpbicsIHJlY2VpdmVyT25EcmFpbik7XG4gICAgcmVjZWl2ZXIub24oJ2Vycm9yJywgcmVjZWl2ZXJPbkVycm9yKTtcbiAgICByZWNlaXZlci5vbignbWVzc2FnZScsIHJlY2VpdmVyT25NZXNzYWdlKTtcbiAgICByZWNlaXZlci5vbigncGluZycsIHJlY2VpdmVyT25QaW5nKTtcbiAgICByZWNlaXZlci5vbigncG9uZycsIHJlY2VpdmVyT25Qb25nKTtcblxuICAgIHNlbmRlci5vbmVycm9yID0gc2VuZGVyT25FcnJvcjtcblxuICAgIC8vXG4gICAgLy8gVGhlc2UgbWV0aG9kcyBtYXkgbm90IGJlIGF2YWlsYWJsZSBpZiBgc29ja2V0YCBpcyBqdXN0IGEgYER1cGxleGAuXG4gICAgLy9cbiAgICBpZiAoc29ja2V0LnNldFRpbWVvdXQpIHNvY2tldC5zZXRUaW1lb3V0KDApO1xuICAgIGlmIChzb2NrZXQuc2V0Tm9EZWxheSkgc29ja2V0LnNldE5vRGVsYXkoKTtcblxuICAgIGlmIChoZWFkLmxlbmd0aCA+IDApIHNvY2tldC51bnNoaWZ0KGhlYWQpO1xuXG4gICAgc29ja2V0Lm9uKCdjbG9zZScsIHNvY2tldE9uQ2xvc2UpO1xuICAgIHNvY2tldC5vbignZGF0YScsIHNvY2tldE9uRGF0YSk7XG4gICAgc29ja2V0Lm9uKCdlbmQnLCBzb2NrZXRPbkVuZCk7XG4gICAgc29ja2V0Lm9uKCdlcnJvcicsIHNvY2tldE9uRXJyb3IpO1xuXG4gICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5PUEVOO1xuICAgIHRoaXMuZW1pdCgnb3BlbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGAnY2xvc2UnYCBldmVudC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXRDbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX3NvY2tldCkge1xuICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TRUQ7XG4gICAgICB0aGlzLmVtaXQoJ2Nsb3NlJywgdGhpcy5fY2xvc2VDb2RlLCB0aGlzLl9jbG9zZU1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdKSB7XG4gICAgICB0aGlzLl9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdLmNsZWFudXAoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWNlaXZlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLl9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NFRDtcbiAgICB0aGlzLmVtaXQoJ2Nsb3NlJywgdGhpcy5fY2xvc2VDb2RlLCB0aGlzLl9jbG9zZU1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgY2xvc2luZyBoYW5kc2hha2UuXG4gICAqXG4gICAqICAgICAgICAgICstLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLStcbiAgICogICAgIC0gLSAtfHdzLmNsb3NlKCl8LS0+fGNsb3NlIGZyYW1lfC0tPnx3cy5jbG9zZSgpfC0gLSAtXG4gICAqICAgIHwgICAgICstLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLSsgICAgIHxcbiAgICogICAgICAgICAgKy0tLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0tKyAgICAgICAgIHxcbiAgICogQ0xPU0lORyAgfHdzLmNsb3NlKCl8PC0tfGNsb3NlIGZyYW1lfDwtLSstLS0tLSsgICAgICAgQ0xPU0lOR1xuICAgKiAgICAgICAgICArLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0rICAgfFxuICAgKiAgICB8ICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICstLS0rICAgICAgICB8XG4gICAqICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0+fGZpbnwgLSAtIC0gLVxuICAgKiAgICB8ICAgICAgICAgKy0tLSsgICAgICAgICAgICAgICAgICAgICAgfCAgICstLS0rXG4gICAqICAgICAtIC0gLSAtIC18ZmlufDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICAqICAgICAgICAgICAgICArLS0tK1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2NvZGVdIFN0YXR1cyBjb2RlIGV4cGxhaW5pbmcgd2h5IHRoZSBjb25uZWN0aW9uIGlzIGNsb3NpbmdcbiAgICogQHBhcmFtIHsoU3RyaW5nfEJ1ZmZlcil9IFtkYXRhXSBUaGUgcmVhc29uIHdoeSB0aGUgY29ubmVjdGlvbiBpc1xuICAgKiAgICAgY2xvc2luZ1xuICAgKiBAcHVibGljXG4gICAqL1xuICBjbG9zZShjb2RlLCBkYXRhKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NFRCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICBjb25zdCBtc2cgPSAnV2ViU29ja2V0IHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCc7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh0aGlzLCB0aGlzLl9yZXEsIG1zZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NJTkcpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fY2xvc2VGcmFtZVNlbnQgJiZcbiAgICAgICAgKHRoaXMuX2Nsb3NlRnJhbWVSZWNlaXZlZCB8fCB0aGlzLl9yZWNlaXZlci5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fc29ja2V0LmVuZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgIHRoaXMuX3NlbmRlci5jbG9zZShjb2RlLCBkYXRhLCAhdGhpcy5faXNTZXJ2ZXIsIChlcnIpID0+IHtcbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGVycm9yIGlzIGhhbmRsZWQgYnkgdGhlIGAnZXJyb3InYCBsaXN0ZW5lciBvbiB0aGUgc29ja2V0LiBXZSBvbmx5XG4gICAgICAvLyB3YW50IHRvIGtub3cgaWYgdGhlIGNsb3NlIGZyYW1lIGhhcyBiZWVuIHNlbnQgaGVyZS5cbiAgICAgIC8vXG4gICAgICBpZiAoZXJyKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX2Nsb3NlRnJhbWVTZW50ID0gdHJ1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9jbG9zZUZyYW1lUmVjZWl2ZWQgfHxcbiAgICAgICAgdGhpcy5fcmVjZWl2ZXIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fc29ja2V0LmVuZCgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0Q2xvc2VUaW1lcih0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB0aGUgc29ja2V0LlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICBwYXVzZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HIHx8XG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRURcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xuICAgIHRoaXMuX3NvY2tldC5wYXVzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBwaW5nLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IFtkYXRhXSBUaGUgZGF0YSB0byBzZW5kXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW21hc2tdIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBtYXNrIGBkYXRhYFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2JdIENhbGxiYWNrIHdoaWNoIGlzIGV4ZWN1dGVkIHdoZW4gdGhlIHBpbmcgaXMgc2VudFxuICAgKiBAcHVibGljXG4gICAqL1xuICBwaW5nKGRhdGEsIG1hc2ssIGNiKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2ViU29ja2V0IGlzIG5vdCBvcGVuOiByZWFkeVN0YXRlIDAgKENPTk5FQ1RJTkcpJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IGRhdGE7XG4gICAgICBkYXRhID0gbWFzayA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtYXNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYiA9IG1hc2s7XG4gICAgICBtYXNrID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgc2VuZEFmdGVyQ2xvc2UodGhpcywgZGF0YSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYXNrID09PSB1bmRlZmluZWQpIG1hc2sgPSAhdGhpcy5faXNTZXJ2ZXI7XG4gICAgdGhpcy5fc2VuZGVyLnBpbmcoZGF0YSB8fCBFTVBUWV9CVUZGRVIsIG1hc2ssIGNiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgcG9uZy5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBbZGF0YV0gVGhlIGRhdGEgdG8gc2VuZFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttYXNrXSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFjayB3aGljaCBpcyBleGVjdXRlZCB3aGVuIHRoZSBwb25nIGlzIHNlbnRcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcG9uZyhkYXRhLCBtYXNrLCBjYikge1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAwIChDT05ORUNUSU5HKScpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBkYXRhO1xuICAgICAgZGF0YSA9IG1hc2sgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWFzayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBtYXNrO1xuICAgICAgbWFzayA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdudW1iZXInKSBkYXRhID0gZGF0YS50b1N0cmluZygpO1xuXG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHNlbmRBZnRlckNsb3NlKHRoaXMsIGRhdGEsIGNiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobWFzayA9PT0gdW5kZWZpbmVkKSBtYXNrID0gIXRoaXMuX2lzU2VydmVyO1xuICAgIHRoaXMuX3NlbmRlci5wb25nKGRhdGEgfHwgRU1QVFlfQlVGRkVSLCBtYXNrLCBjYik7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIHRoZSBzb2NrZXQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHJlc3VtZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HIHx8XG4gICAgICB0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRURcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLm5lZWREcmFpbikgdGhpcy5fc29ja2V0LnJlc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBkYXRhIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWVzc2FnZSB0byBzZW5kXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5iaW5hcnldIFNwZWNpZmllcyB3aGV0aGVyIGBkYXRhYCBpcyBiaW5hcnkgb3JcbiAgICogICAgIHRleHRcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jb21wcmVzc10gU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGNvbXByZXNzXG4gICAqICAgICBgZGF0YWBcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5maW49dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGZyYWdtZW50IGlzIHRoZVxuICAgKiAgICAgbGFzdCBvbmVcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tYXNrXSBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gbWFzayBgZGF0YWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiXSBDYWxsYmFjayB3aGljaCBpcyBleGVjdXRlZCB3aGVuIGRhdGEgaXMgd3JpdHRlbiBvdXRcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2VuZChkYXRhLCBvcHRpb25zLCBjYikge1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAwIChDT05ORUNUSU5HKScpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ251bWJlcicpIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgc2VuZEFmdGVyQ2xvc2UodGhpcywgZGF0YSwgY2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBiaW5hcnk6IHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJyxcbiAgICAgIG1hc2s6ICF0aGlzLl9pc1NlcnZlcixcbiAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgZmluOiB0cnVlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH07XG5cbiAgICBpZiAoIXRoaXMuX2V4dGVuc2lvbnNbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV0pIHtcbiAgICAgIG9wdHMuY29tcHJlc3MgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZW5kZXIuc2VuZChkYXRhIHx8IEVNUFRZX0JVRkZFUiwgb3B0cywgY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNpYmx5IGNsb3NlIHRoZSBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICB0ZXJtaW5hdGUoKSB7XG4gICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNMT1NFRCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DT05ORUNUSU5HKSB7XG4gICAgICBjb25zdCBtc2cgPSAnV2ViU29ja2V0IHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBlc3RhYmxpc2hlZCc7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh0aGlzLCB0aGlzLl9yZXEsIG1zZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3NvY2tldCkge1xuICAgICAgdGhpcy5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgICAgdGhpcy5fc29ja2V0LmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gQ09OTkVDVElOR1xuICogQG1lbWJlcm9mIFdlYlNvY2tldFxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0LCAnQ09OTkVDVElORycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ0NPTk5FQ1RJTkcnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENPTk5FQ1RJTkdcbiAqIEBtZW1iZXJvZiBXZWJTb2NrZXQucHJvdG90eXBlXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQucHJvdG90eXBlLCAnQ09OTkVDVElORycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgdmFsdWU6IHJlYWR5U3RhdGVzLmluZGV4T2YoJ0NPTk5FQ1RJTkcnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IE9QRU5cbiAqIEBtZW1iZXJvZiBXZWJTb2NrZXRcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldCwgJ09QRU4nLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdPUEVOJylcbn0pO1xuXG4vKipcbiAqIEBjb25zdGFudCB7TnVtYmVyfSBPUEVOXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0LnByb3RvdHlwZVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViU29ja2V0LnByb3RvdHlwZSwgJ09QRU4nLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdPUEVOJylcbn0pO1xuXG4vKipcbiAqIEBjb25zdGFudCB7TnVtYmVyfSBDTE9TSU5HXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQsICdDTE9TSU5HJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB2YWx1ZTogcmVhZHlTdGF0ZXMuaW5kZXhPZignQ0xPU0lORycpXG59KTtcblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gQ0xPU0lOR1xuICogQG1lbWJlcm9mIFdlYlNvY2tldC5wcm90b3R5cGVcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsICdDTE9TSU5HJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICB2YWx1ZTogcmVhZHlTdGF0ZXMuaW5kZXhPZignQ0xPU0lORycpXG59KTtcblxuLyoqXG4gKiBAY29uc3RhbnQge051bWJlcn0gQ0xPU0VEXG4gKiBAbWVtYmVyb2YgV2ViU29ja2V0XG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJTb2NrZXQsICdDTE9TRUQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdDTE9TRUQnKVxufSk7XG5cbi8qKlxuICogQGNvbnN0YW50IHtOdW1iZXJ9IENMT1NFRFxuICogQG1lbWJlcm9mIFdlYlNvY2tldC5wcm90b3R5cGVcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsICdDTE9TRUQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHZhbHVlOiByZWFkeVN0YXRlcy5pbmRleE9mKCdDTE9TRUQnKVxufSk7XG5cbltcbiAgJ2JpbmFyeVR5cGUnLFxuICAnYnVmZmVyZWRBbW91bnQnLFxuICAnZXh0ZW5zaW9ucycsXG4gICdpc1BhdXNlZCcsXG4gICdwcm90b2NvbCcsXG4gICdyZWFkeVN0YXRlJyxcbiAgJ3VybCdcbl0uZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsIHByb3BlcnR5LCB7IGVudW1lcmFibGU6IHRydWUgfSk7XG59KTtcblxuLy9cbi8vIEFkZCB0aGUgYG9ub3BlbmAsIGBvbmVycm9yYCwgYG9uY2xvc2VgLCBhbmQgYG9ubWVzc2FnZWAgYXR0cmlidXRlcy5cbi8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jb21tcy5odG1sI3RoZS13ZWJzb2NrZXQtaW50ZXJmYWNlXG4vL1xuWydvcGVuJywgJ2Vycm9yJywgJ2Nsb3NlJywgJ21lc3NhZ2UnXS5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYlNvY2tldC5wcm90b3R5cGUsIGBvbiR7bWV0aG9kfWAsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldCgpIHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5saXN0ZW5lcnMobWV0aG9kKSkge1xuICAgICAgICBpZiAobGlzdGVuZXJba0Zvck9uRXZlbnRBdHRyaWJ1dGVdKSByZXR1cm4gbGlzdGVuZXJba0xpc3RlbmVyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBzZXQoaGFuZGxlcikge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLmxpc3RlbmVycyhtZXRob2QpKSB7XG4gICAgICAgIGlmIChsaXN0ZW5lcltrRm9yT25FdmVudEF0dHJpYnV0ZV0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKG1ldGhvZCwgbGlzdGVuZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIobWV0aG9kLCBoYW5kbGVyLCB7XG4gICAgICAgIFtrRm9yT25FdmVudEF0dHJpYnV0ZV06IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59KTtcblxuV2ViU29ja2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcjtcbldlYlNvY2tldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IHJlbW92ZUV2ZW50TGlzdGVuZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gV2ViU29ja2V0O1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBXZWJTb2NrZXQgY2xpZW50LlxuICpcbiAqIEBwYXJhbSB7V2ViU29ja2V0fSB3ZWJzb2NrZXQgVGhlIGNsaWVudCB0byBpbml0aWFsaXplXG4gKiBAcGFyYW0geyhTdHJpbmd8VVJMKX0gYWRkcmVzcyBUaGUgVVJMIHRvIHdoaWNoIHRvIGNvbm5lY3RcbiAqIEBwYXJhbSB7QXJyYXl9IHByb3RvY29scyBUaGUgc3VicHJvdG9jb2xzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIENvbm5lY3Rpb24gb3B0aW9uc1xuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbGxvd1N5bmNocm9ub3VzRXZlbnRzPXRydWVdIFNwZWNpZmllcyB3aGV0aGVyIGFueVxuICogICAgIG9mIHRoZSBgJ21lc3NhZ2UnYCwgYCdwaW5nJ2AsIGFuZCBgJ3BvbmcnYCBldmVudHMgY2FuIGJlIGVtaXR0ZWQgbXVsdGlwbGVcbiAqICAgICB0aW1lcyBpbiB0aGUgc2FtZSB0aWNrXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmF1dG9Qb25nPXRydWVdIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0b1xuICogICAgIGF1dG9tYXRpY2FsbHkgc2VuZCBhIHBvbmcgaW4gcmVzcG9uc2UgdG8gYSBwaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5maW5pc2hSZXF1ZXN0XSBBIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvXG4gKiAgICAgY3VzdG9taXplIHRoZSBoZWFkZXJzIG9mIGVhY2ggaHR0cCByZXF1ZXN0IGJlZm9yZSBpdCBpcyBzZW50XG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZvbGxvd1JlZGlyZWN0cz1mYWxzZV0gV2hldGhlciBvciBub3QgdG8gZm9sbG93XG4gKiAgICAgcmVkaXJlY3RzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5nZW5lcmF0ZU1hc2tdIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIHRoZVxuICogICAgIG1hc2tpbmcga2V5XG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaGFuZHNoYWtlVGltZW91dF0gVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZVxuICogICAgIGhhbmRzaGFrZSByZXF1ZXN0XG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4UGF5bG9hZD0xMDQ4NTc2MDBdIFRoZSBtYXhpbXVtIGFsbG93ZWQgbWVzc2FnZVxuICogICAgIHNpemVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhSZWRpcmVjdHM9MTBdIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZWRpcmVjdHNcbiAqICAgICBhbGxvd2VkXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMub3JpZ2luXSBWYWx1ZSBvZiB0aGUgYE9yaWdpbmAgb3JcbiAqICAgICBgU2VjLVdlYlNvY2tldC1PcmlnaW5gIGhlYWRlclxuICogQHBhcmFtIHsoQm9vbGVhbnxPYmplY3QpfSBbb3B0aW9ucy5wZXJNZXNzYWdlRGVmbGF0ZT10cnVlXSBFbmFibGUvZGlzYWJsZVxuICogICAgIHBlcm1lc3NhZ2UtZGVmbGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnByb3RvY29sVmVyc2lvbj0xM10gVmFsdWUgb2YgdGhlXG4gKiAgICAgYFNlYy1XZWJTb2NrZXQtVmVyc2lvbmAgaGVhZGVyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNraXBVVEY4VmFsaWRhdGlvbj1mYWxzZV0gU3BlY2lmaWVzIHdoZXRoZXIgb3JcbiAqICAgICBub3QgdG8gc2tpcCBVVEYtOCB2YWxpZGF0aW9uIGZvciB0ZXh0IGFuZCBjbG9zZSBtZXNzYWdlc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaW5pdEFzQ2xpZW50KHdlYnNvY2tldCwgYWRkcmVzcywgcHJvdG9jb2xzLCBvcHRpb25zKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgYWxsb3dTeW5jaHJvbm91c0V2ZW50czogdHJ1ZSxcbiAgICBhdXRvUG9uZzogdHJ1ZSxcbiAgICBwcm90b2NvbFZlcnNpb246IHByb3RvY29sVmVyc2lvbnNbMV0sXG4gICAgbWF4UGF5bG9hZDogMTAwICogMTAyNCAqIDEwMjQsXG4gICAgc2tpcFVURjhWYWxpZGF0aW9uOiBmYWxzZSxcbiAgICBwZXJNZXNzYWdlRGVmbGF0ZTogdHJ1ZSxcbiAgICBmb2xsb3dSZWRpcmVjdHM6IGZhbHNlLFxuICAgIG1heFJlZGlyZWN0czogMTAsXG4gICAgLi4ub3B0aW9ucyxcbiAgICBzb2NrZXRQYXRoOiB1bmRlZmluZWQsXG4gICAgaG9zdG5hbWU6IHVuZGVmaW5lZCxcbiAgICBwcm90b2NvbDogdW5kZWZpbmVkLFxuICAgIHRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICBtZXRob2Q6ICdHRVQnLFxuICAgIGhvc3Q6IHVuZGVmaW5lZCxcbiAgICBwYXRoOiB1bmRlZmluZWQsXG4gICAgcG9ydDogdW5kZWZpbmVkXG4gIH07XG5cbiAgd2Vic29ja2V0Ll9hdXRvUG9uZyA9IG9wdHMuYXV0b1Bvbmc7XG5cbiAgaWYgKCFwcm90b2NvbFZlcnNpb25zLmluY2x1ZGVzKG9wdHMucHJvdG9jb2xWZXJzaW9uKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIHByb3RvY29sIHZlcnNpb246ICR7b3B0cy5wcm90b2NvbFZlcnNpb259IGAgK1xuICAgICAgICBgKHN1cHBvcnRlZCB2ZXJzaW9uczogJHtwcm90b2NvbFZlcnNpb25zLmpvaW4oJywgJyl9KWBcbiAgICApO1xuICB9XG5cbiAgbGV0IHBhcnNlZFVybDtcblxuICBpZiAoYWRkcmVzcyBpbnN0YW5jZW9mIFVSTCkge1xuICAgIHBhcnNlZFVybCA9IGFkZHJlc3M7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZFVybCA9IG5ldyBVUkwoYWRkcmVzcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKGBJbnZhbGlkIFVSTDogJHthZGRyZXNzfWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwOicpIHtcbiAgICBwYXJzZWRVcmwucHJvdG9jb2wgPSAnd3M6JztcbiAgfSBlbHNlIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgcGFyc2VkVXJsLnByb3RvY29sID0gJ3dzczonO1xuICB9XG5cbiAgd2Vic29ja2V0Ll91cmwgPSBwYXJzZWRVcmwuaHJlZjtcblxuICBjb25zdCBpc1NlY3VyZSA9IHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ3dzczonO1xuICBjb25zdCBpc0lwY1VybCA9IHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ3dzK3VuaXg6JztcbiAgbGV0IGludmFsaWRVcmxNZXNzYWdlO1xuXG4gIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgIT09ICd3czonICYmICFpc1NlY3VyZSAmJiAhaXNJcGNVcmwpIHtcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9XG4gICAgICAnVGhlIFVSTFxcJ3MgcHJvdG9jb2wgbXVzdCBiZSBvbmUgb2YgXCJ3czpcIiwgXCJ3c3M6XCIsICcgK1xuICAgICAgJ1wiaHR0cDpcIiwgXCJodHRwc1wiLCBvciBcIndzK3VuaXg6XCInO1xuICB9IGVsc2UgaWYgKGlzSXBjVXJsICYmICFwYXJzZWRVcmwucGF0aG5hbWUpIHtcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9IFwiVGhlIFVSTCdzIHBhdGhuYW1lIGlzIGVtcHR5XCI7XG4gIH0gZWxzZSBpZiAocGFyc2VkVXJsLmhhc2gpIHtcbiAgICBpbnZhbGlkVXJsTWVzc2FnZSA9ICdUaGUgVVJMIGNvbnRhaW5zIGEgZnJhZ21lbnQgaWRlbnRpZmllcic7XG4gIH1cblxuICBpZiAoaW52YWxpZFVybE1lc3NhZ2UpIHtcbiAgICBjb25zdCBlcnIgPSBuZXcgU3ludGF4RXJyb3IoaW52YWxpZFVybE1lc3NhZ2UpO1xuXG4gICAgaWYgKHdlYnNvY2tldC5fcmVkaXJlY3RzID09PSAwKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXRFcnJvckFuZENsb3NlKHdlYnNvY2tldCwgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkZWZhdWx0UG9ydCA9IGlzU2VjdXJlID8gNDQzIDogODA7XG4gIGNvbnN0IGtleSA9IHJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIGNvbnN0IHJlcXVlc3QgPSBpc1NlY3VyZSA/IGh0dHBzLnJlcXVlc3QgOiBodHRwLnJlcXVlc3Q7XG4gIGNvbnN0IHByb3RvY29sU2V0ID0gbmV3IFNldCgpO1xuICBsZXQgcGVyTWVzc2FnZURlZmxhdGU7XG5cbiAgb3B0cy5jcmVhdGVDb25uZWN0aW9uID1cbiAgICBvcHRzLmNyZWF0ZUNvbm5lY3Rpb24gfHwgKGlzU2VjdXJlID8gdGxzQ29ubmVjdCA6IG5ldENvbm5lY3QpO1xuICBvcHRzLmRlZmF1bHRQb3J0ID0gb3B0cy5kZWZhdWx0UG9ydCB8fCBkZWZhdWx0UG9ydDtcbiAgb3B0cy5wb3J0ID0gcGFyc2VkVXJsLnBvcnQgfHwgZGVmYXVsdFBvcnQ7XG4gIG9wdHMuaG9zdCA9IHBhcnNlZFVybC5ob3N0bmFtZS5zdGFydHNXaXRoKCdbJylcbiAgICA/IHBhcnNlZFVybC5ob3N0bmFtZS5zbGljZSgxLCAtMSlcbiAgICA6IHBhcnNlZFVybC5ob3N0bmFtZTtcbiAgb3B0cy5oZWFkZXJzID0ge1xuICAgIC4uLm9wdHMuaGVhZGVycyxcbiAgICAnU2VjLVdlYlNvY2tldC1WZXJzaW9uJzogb3B0cy5wcm90b2NvbFZlcnNpb24sXG4gICAgJ1NlYy1XZWJTb2NrZXQtS2V5Jzoga2V5LFxuICAgIENvbm5lY3Rpb246ICdVcGdyYWRlJyxcbiAgICBVcGdyYWRlOiAnd2Vic29ja2V0J1xuICB9O1xuICBvcHRzLnBhdGggPSBwYXJzZWRVcmwucGF0aG5hbWUgKyBwYXJzZWRVcmwuc2VhcmNoO1xuICBvcHRzLnRpbWVvdXQgPSBvcHRzLmhhbmRzaGFrZVRpbWVvdXQ7XG5cbiAgaWYgKG9wdHMucGVyTWVzc2FnZURlZmxhdGUpIHtcbiAgICBwZXJNZXNzYWdlRGVmbGF0ZSA9IG5ldyBQZXJNZXNzYWdlRGVmbGF0ZShcbiAgICAgIG9wdHMucGVyTWVzc2FnZURlZmxhdGUgIT09IHRydWUgPyBvcHRzLnBlck1lc3NhZ2VEZWZsYXRlIDoge30sXG4gICAgICBmYWxzZSxcbiAgICAgIG9wdHMubWF4UGF5bG9hZFxuICAgICk7XG4gICAgb3B0cy5oZWFkZXJzWydTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMnXSA9IGZvcm1hdCh7XG4gICAgICBbUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZV06IHBlck1lc3NhZ2VEZWZsYXRlLm9mZmVyKClcbiAgICB9KTtcbiAgfVxuICBpZiAocHJvdG9jb2xzLmxlbmd0aCkge1xuICAgIGZvciAoY29uc3QgcHJvdG9jb2wgb2YgcHJvdG9jb2xzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBwcm90b2NvbCAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgIXN1YnByb3RvY29sUmVnZXgudGVzdChwcm90b2NvbCkgfHxcbiAgICAgICAgcHJvdG9jb2xTZXQuaGFzKHByb3RvY29sKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICAnQW4gaW52YWxpZCBvciBkdXBsaWNhdGVkIHN1YnByb3RvY29sIHdhcyBzcGVjaWZpZWQnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHByb3RvY29sU2V0LmFkZChwcm90b2NvbCk7XG4gICAgfVxuXG4gICAgb3B0cy5oZWFkZXJzWydTZWMtV2ViU29ja2V0LVByb3RvY29sJ10gPSBwcm90b2NvbHMuam9pbignLCcpO1xuICB9XG4gIGlmIChvcHRzLm9yaWdpbikge1xuICAgIGlmIChvcHRzLnByb3RvY29sVmVyc2lvbiA8IDEzKSB7XG4gICAgICBvcHRzLmhlYWRlcnNbJ1NlYy1XZWJTb2NrZXQtT3JpZ2luJ10gPSBvcHRzLm9yaWdpbjtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0cy5oZWFkZXJzLk9yaWdpbiA9IG9wdHMub3JpZ2luO1xuICAgIH1cbiAgfVxuICBpZiAocGFyc2VkVXJsLnVzZXJuYW1lIHx8IHBhcnNlZFVybC5wYXNzd29yZCkge1xuICAgIG9wdHMuYXV0aCA9IGAke3BhcnNlZFVybC51c2VybmFtZX06JHtwYXJzZWRVcmwucGFzc3dvcmR9YDtcbiAgfVxuXG4gIGlmIChpc0lwY1VybCkge1xuICAgIGNvbnN0IHBhcnRzID0gb3B0cy5wYXRoLnNwbGl0KCc6Jyk7XG5cbiAgICBvcHRzLnNvY2tldFBhdGggPSBwYXJ0c1swXTtcbiAgICBvcHRzLnBhdGggPSBwYXJ0c1sxXTtcbiAgfVxuXG4gIGxldCByZXE7XG5cbiAgaWYgKG9wdHMuZm9sbG93UmVkaXJlY3RzKSB7XG4gICAgaWYgKHdlYnNvY2tldC5fcmVkaXJlY3RzID09PSAwKSB7XG4gICAgICB3ZWJzb2NrZXQuX29yaWdpbmFsSXBjID0gaXNJcGNVcmw7XG4gICAgICB3ZWJzb2NrZXQuX29yaWdpbmFsU2VjdXJlID0gaXNTZWN1cmU7XG4gICAgICB3ZWJzb2NrZXQuX29yaWdpbmFsSG9zdE9yU29ja2V0UGF0aCA9IGlzSXBjVXJsXG4gICAgICAgID8gb3B0cy5zb2NrZXRQYXRoXG4gICAgICAgIDogcGFyc2VkVXJsLmhvc3Q7XG5cbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBvcHRpb25zICYmIG9wdGlvbnMuaGVhZGVycztcblxuICAgICAgLy9cbiAgICAgIC8vIFNoYWxsb3cgY29weSB0aGUgdXNlciBwcm92aWRlZCBvcHRpb25zIHNvIHRoYXQgaGVhZGVycyBjYW4gYmUgY2hhbmdlZFxuICAgICAgLy8gd2l0aG91dCBtdXRhdGluZyB0aGUgb3JpZ2luYWwgb2JqZWN0LlxuICAgICAgLy9cbiAgICAgIG9wdGlvbnMgPSB7IC4uLm9wdGlvbnMsIGhlYWRlcnM6IHt9IH07XG5cbiAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgb3B0aW9ucy5oZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh3ZWJzb2NrZXQubGlzdGVuZXJDb3VudCgncmVkaXJlY3QnKSA9PT0gMCkge1xuICAgICAgY29uc3QgaXNTYW1lSG9zdCA9IGlzSXBjVXJsXG4gICAgICAgID8gd2Vic29ja2V0Ll9vcmlnaW5hbElwY1xuICAgICAgICAgID8gb3B0cy5zb2NrZXRQYXRoID09PSB3ZWJzb2NrZXQuX29yaWdpbmFsSG9zdE9yU29ja2V0UGF0aFxuICAgICAgICAgIDogZmFsc2VcbiAgICAgICAgOiB3ZWJzb2NrZXQuX29yaWdpbmFsSXBjXG4gICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgIDogcGFyc2VkVXJsLmhvc3QgPT09IHdlYnNvY2tldC5fb3JpZ2luYWxIb3N0T3JTb2NrZXRQYXRoO1xuXG4gICAgICBpZiAoIWlzU2FtZUhvc3QgfHwgKHdlYnNvY2tldC5fb3JpZ2luYWxTZWN1cmUgJiYgIWlzU2VjdXJlKSkge1xuICAgICAgICAvL1xuICAgICAgICAvLyBNYXRjaCBjdXJsIDcuNzcuMCBiZWhhdmlvciBhbmQgZHJvcCB0aGUgZm9sbG93aW5nIGhlYWRlcnMuIFRoZXNlXG4gICAgICAgIC8vIGhlYWRlcnMgYXJlIGFsc28gZHJvcHBlZCB3aGVuIGZvbGxvd2luZyBhIHJlZGlyZWN0IHRvIGEgc3ViZG9tYWluLlxuICAgICAgICAvL1xuICAgICAgICBkZWxldGUgb3B0cy5oZWFkZXJzLmF1dGhvcml6YXRpb247XG4gICAgICAgIGRlbGV0ZSBvcHRzLmhlYWRlcnMuY29va2llO1xuXG4gICAgICAgIGlmICghaXNTYW1lSG9zdCkgZGVsZXRlIG9wdHMuaGVhZGVycy5ob3N0O1xuXG4gICAgICAgIG9wdHMuYXV0aCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIE1hdGNoIGN1cmwgNy43Ny4wIGJlaGF2aW9yIGFuZCBtYWtlIHRoZSBmaXJzdCBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIHdpbi5cbiAgICAvLyBJZiB0aGUgYEF1dGhvcml6YXRpb25gIGhlYWRlciBpcyBzZXQsIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkbyBhcyBpdFxuICAgIC8vIHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICAgIC8vXG4gICAgaWYgKG9wdHMuYXV0aCAmJiAhb3B0aW9ucy5oZWFkZXJzLmF1dGhvcml6YXRpb24pIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycy5hdXRob3JpemF0aW9uID1cbiAgICAgICAgJ0Jhc2ljICcgKyBCdWZmZXIuZnJvbShvcHRzLmF1dGgpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICByZXEgPSB3ZWJzb2NrZXQuX3JlcSA9IHJlcXVlc3Qob3B0cyk7XG5cbiAgICBpZiAod2Vic29ja2V0Ll9yZWRpcmVjdHMpIHtcbiAgICAgIC8vXG4gICAgICAvLyBVbmxpa2Ugd2hhdCBpcyBkb25lIGZvciB0aGUgYCd1cGdyYWRlJ2AgZXZlbnQsIG5vIGVhcmx5IGV4aXQgaXNcbiAgICAgIC8vIHRyaWdnZXJlZCBoZXJlIGlmIHRoZSB1c2VyIGNhbGxzIGB3ZWJzb2NrZXQuY2xvc2UoKWAgb3JcbiAgICAgIC8vIGB3ZWJzb2NrZXQudGVybWluYXRlKClgIGZyb20gYSBsaXN0ZW5lciBvZiB0aGUgYCdyZWRpcmVjdCdgIGV2ZW50LiBUaGlzXG4gICAgICAvLyBpcyBiZWNhdXNlIHRoZSB1c2VyIGNhbiBhbHNvIGNhbGwgYHJlcXVlc3QuZGVzdHJveSgpYCB3aXRoIGFuIGVycm9yXG4gICAgICAvLyBiZWZvcmUgY2FsbGluZyBgd2Vic29ja2V0LmNsb3NlKClgIG9yIGB3ZWJzb2NrZXQudGVybWluYXRlKClgIGFuZCB0aGlzXG4gICAgICAvLyB3b3VsZCByZXN1bHQgaW4gYW4gZXJyb3IgYmVpbmcgZW1pdHRlZCBvbiB0aGUgYHJlcXVlc3RgIG9iamVjdCB3aXRoIG5vXG4gICAgICAvLyBgJ2Vycm9yJ2AgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkLlxuICAgICAgLy9cbiAgICAgIHdlYnNvY2tldC5lbWl0KCdyZWRpcmVjdCcsIHdlYnNvY2tldC51cmwsIHJlcSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlcSA9IHdlYnNvY2tldC5fcmVxID0gcmVxdWVzdChvcHRzKTtcbiAgfVxuXG4gIGlmIChvcHRzLnRpbWVvdXQpIHtcbiAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHJlcSwgJ09wZW5pbmcgaGFuZHNoYWtlIGhhcyB0aW1lZCBvdXQnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlcS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgaWYgKHJlcSA9PT0gbnVsbCB8fCByZXFba0Fib3J0ZWRdKSByZXR1cm47XG5cbiAgICByZXEgPSB3ZWJzb2NrZXQuX3JlcSA9IG51bGw7XG4gICAgZW1pdEVycm9yQW5kQ2xvc2Uod2Vic29ja2V0LCBlcnIpO1xuICB9KTtcblxuICByZXEub24oJ3Jlc3BvbnNlJywgKHJlcykgPT4ge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gcmVzLmhlYWRlcnMubG9jYXRpb247XG4gICAgY29uc3Qgc3RhdHVzQ29kZSA9IHJlcy5zdGF0dXNDb2RlO1xuXG4gICAgaWYgKFxuICAgICAgbG9jYXRpb24gJiZcbiAgICAgIG9wdHMuZm9sbG93UmVkaXJlY3RzICYmXG4gICAgICBzdGF0dXNDb2RlID49IDMwMCAmJlxuICAgICAgc3RhdHVzQ29kZSA8IDQwMFxuICAgICkge1xuICAgICAgaWYgKCsrd2Vic29ja2V0Ll9yZWRpcmVjdHMgPiBvcHRzLm1heFJlZGlyZWN0cykge1xuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHJlcSwgJ01heGltdW0gcmVkaXJlY3RzIGV4Y2VlZGVkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVxLmFib3J0KCk7XG5cbiAgICAgIGxldCBhZGRyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhZGRyID0gbmV3IFVSTChsb2NhdGlvbiwgYWRkcmVzcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBTeW50YXhFcnJvcihgSW52YWxpZCBVUkw6ICR7bG9jYXRpb259YCk7XG4gICAgICAgIGVtaXRFcnJvckFuZENsb3NlKHdlYnNvY2tldCwgZXJyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpbml0QXNDbGllbnQod2Vic29ja2V0LCBhZGRyLCBwcm90b2NvbHMsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXdlYnNvY2tldC5lbWl0KCd1bmV4cGVjdGVkLXJlc3BvbnNlJywgcmVxLCByZXMpKSB7XG4gICAgICBhYm9ydEhhbmRzaGFrZShcbiAgICAgICAgd2Vic29ja2V0LFxuICAgICAgICByZXEsXG4gICAgICAgIGBVbmV4cGVjdGVkIHNlcnZlciByZXNwb25zZTogJHtyZXMuc3RhdHVzQ29kZX1gXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmVxLm9uKCd1cGdyYWRlJywgKHJlcywgc29ja2V0LCBoZWFkKSA9PiB7XG4gICAgd2Vic29ja2V0LmVtaXQoJ3VwZ3JhZGUnLCByZXMpO1xuXG4gICAgLy9cbiAgICAvLyBUaGUgdXNlciBtYXkgaGF2ZSBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gZnJvbSBhIGxpc3RlbmVyIG9mIHRoZVxuICAgIC8vIGAndXBncmFkZSdgIGV2ZW50LlxuICAgIC8vXG4gICAgaWYgKHdlYnNvY2tldC5yZWFkeVN0YXRlICE9PSBXZWJTb2NrZXQuQ09OTkVDVElORykgcmV0dXJuO1xuXG4gICAgcmVxID0gd2Vic29ja2V0Ll9yZXEgPSBudWxsO1xuXG4gICAgY29uc3QgdXBncmFkZSA9IHJlcy5oZWFkZXJzLnVwZ3JhZGU7XG5cbiAgICBpZiAodXBncmFkZSA9PT0gdW5kZWZpbmVkIHx8IHVwZ3JhZGUudG9Mb3dlckNhc2UoKSAhPT0gJ3dlYnNvY2tldCcpIHtcbiAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCAnSW52YWxpZCBVcGdyYWRlIGhlYWRlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goJ3NoYTEnKVxuICAgICAgLnVwZGF0ZShrZXkgKyBHVUlEKVxuICAgICAgLmRpZ2VzdCgnYmFzZTY0Jyk7XG5cbiAgICBpZiAocmVzLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQtYWNjZXB0J10gIT09IGRpZ2VzdCkge1xuICAgICAgYWJvcnRIYW5kc2hha2Uod2Vic29ja2V0LCBzb2NrZXQsICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtQWNjZXB0IGhlYWRlcicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcnZlclByb3QgPSByZXMuaGVhZGVyc1snc2VjLXdlYnNvY2tldC1wcm90b2NvbCddO1xuICAgIGxldCBwcm90RXJyb3I7XG5cbiAgICBpZiAoc2VydmVyUHJvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIXByb3RvY29sU2V0LnNpemUpIHtcbiAgICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IGEgc3VicHJvdG9jb2wgYnV0IG5vbmUgd2FzIHJlcXVlc3RlZCc7XG4gICAgICB9IGVsc2UgaWYgKCFwcm90b2NvbFNldC5oYXMoc2VydmVyUHJvdCkpIHtcbiAgICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IGFuIGludmFsaWQgc3VicHJvdG9jb2wnO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvdG9jb2xTZXQuc2l6ZSkge1xuICAgICAgcHJvdEVycm9yID0gJ1NlcnZlciBzZW50IG5vIHN1YnByb3RvY29sJztcbiAgICB9XG5cbiAgICBpZiAocHJvdEVycm9yKSB7XG4gICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgcHJvdEVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VydmVyUHJvdCkgd2Vic29ja2V0Ll9wcm90b2NvbCA9IHNlcnZlclByb3Q7XG5cbiAgICBjb25zdCBzZWNXZWJTb2NrZXRFeHRlbnNpb25zID0gcmVzLmhlYWRlcnNbJ3NlYy13ZWJzb2NrZXQtZXh0ZW5zaW9ucyddO1xuXG4gICAgaWYgKHNlY1dlYlNvY2tldEV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFwZXJNZXNzYWdlRGVmbGF0ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgICAnU2VydmVyIHNlbnQgYSBTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMgaGVhZGVyIGJ1dCBubyBleHRlbnNpb24gJyArXG4gICAgICAgICAgJ3dhcyByZXF1ZXN0ZWQnO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGV4dGVuc2lvbnM7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGV4dGVuc2lvbnMgPSBwYXJzZShzZWNXZWJTb2NrZXRFeHRlbnNpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0ludmFsaWQgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIGhlYWRlcic7XG4gICAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCBtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRlbnNpb25OYW1lcyA9IE9iamVjdC5rZXlzKGV4dGVuc2lvbnMpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGV4dGVuc2lvbk5hbWVzLmxlbmd0aCAhPT0gMSB8fFxuICAgICAgICBleHRlbnNpb25OYW1lc1swXSAhPT0gUGVyTWVzc2FnZURlZmxhdGUuZXh0ZW5zaW9uTmFtZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnU2VydmVyIGluZGljYXRlZCBhbiBleHRlbnNpb24gdGhhdCB3YXMgbm90IHJlcXVlc3RlZCc7XG4gICAgICAgIGFib3J0SGFuZHNoYWtlKHdlYnNvY2tldCwgc29ja2V0LCBtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBwZXJNZXNzYWdlRGVmbGF0ZS5hY2NlcHQoZXh0ZW5zaW9uc1tQZXJNZXNzYWdlRGVmbGF0ZS5leHRlbnNpb25OYW1lXSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyBoZWFkZXInO1xuICAgICAgICBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHNvY2tldCwgbWVzc2FnZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgd2Vic29ja2V0Ll9leHRlbnNpb25zW1Blck1lc3NhZ2VEZWZsYXRlLmV4dGVuc2lvbk5hbWVdID1cbiAgICAgICAgcGVyTWVzc2FnZURlZmxhdGU7XG4gICAgfVxuXG4gICAgd2Vic29ja2V0LnNldFNvY2tldChzb2NrZXQsIGhlYWQsIHtcbiAgICAgIGFsbG93U3luY2hyb25vdXNFdmVudHM6IG9wdHMuYWxsb3dTeW5jaHJvbm91c0V2ZW50cyxcbiAgICAgIGdlbmVyYXRlTWFzazogb3B0cy5nZW5lcmF0ZU1hc2ssXG4gICAgICBtYXhQYXlsb2FkOiBvcHRzLm1heFBheWxvYWQsXG4gICAgICBza2lwVVRGOFZhbGlkYXRpb246IG9wdHMuc2tpcFVURjhWYWxpZGF0aW9uXG4gICAgfSk7XG4gIH0pO1xuXG4gIGlmIChvcHRzLmZpbmlzaFJlcXVlc3QpIHtcbiAgICBvcHRzLmZpbmlzaFJlcXVlc3QocmVxLCB3ZWJzb2NrZXQpO1xuICB9IGVsc2Uge1xuICAgIHJlcS5lbmQoKTtcbiAgfVxufVxuXG4vKipcbiAqIEVtaXQgdGhlIGAnZXJyb3InYCBhbmQgYCdjbG9zZSdgIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7RXJyb3J9IFRoZSBlcnJvciB0byBlbWl0XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBlbWl0RXJyb3JBbmRDbG9zZSh3ZWJzb2NrZXQsIGVycikge1xuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcbiAgLy9cbiAgLy8gVGhlIGZvbGxvd2luZyBhc3NpZ25tZW50IGlzIHByYWN0aWNhbGx5IHVzZWxlc3MgYW5kIGlzIGRvbmUgb25seSBmb3JcbiAgLy8gY29uc2lzdGVuY3kuXG4gIC8vXG4gIHdlYnNvY2tldC5fZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgd2Vic29ja2V0LmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgd2Vic29ja2V0LmVtaXRDbG9zZSgpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGBuZXQuU29ja2V0YCBhbmQgaW5pdGlhdGUgYSBjb25uZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIENvbm5lY3Rpb24gb3B0aW9uc1xuICogQHJldHVybiB7bmV0LlNvY2tldH0gVGhlIG5ld2x5IGNyZWF0ZWQgc29ja2V0IHVzZWQgdG8gc3RhcnQgdGhlIGNvbm5lY3Rpb25cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG5ldENvbm5lY3Qob3B0aW9ucykge1xuICBvcHRpb25zLnBhdGggPSBvcHRpb25zLnNvY2tldFBhdGg7XG4gIHJldHVybiBuZXQuY29ubmVjdChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgdGxzLlRMU1NvY2tldGAgYW5kIGluaXRpYXRlIGEgY29ubmVjdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBDb25uZWN0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm4ge3Rscy5UTFNTb2NrZXR9IFRoZSBuZXdseSBjcmVhdGVkIHNvY2tldCB1c2VkIHRvIHN0YXJ0IHRoZSBjb25uZWN0aW9uXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0bHNDb25uZWN0KG9wdGlvbnMpIHtcbiAgb3B0aW9ucy5wYXRoID0gdW5kZWZpbmVkO1xuXG4gIGlmICghb3B0aW9ucy5zZXJ2ZXJuYW1lICYmIG9wdGlvbnMuc2VydmVybmFtZSAhPT0gJycpIHtcbiAgICBvcHRpb25zLnNlcnZlcm5hbWUgPSBuZXQuaXNJUChvcHRpb25zLmhvc3QpID8gJycgOiBvcHRpb25zLmhvc3Q7XG4gIH1cblxuICByZXR1cm4gdGxzLmNvbm5lY3Qob3B0aW9ucyk7XG59XG5cbi8qKlxuICogQWJvcnQgdGhlIGhhbmRzaGFrZSBhbmQgZW1pdCBhbiBlcnJvci5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7KGh0dHAuQ2xpZW50UmVxdWVzdHxuZXQuU29ja2V0fHRscy5Tb2NrZXQpfSBzdHJlYW0gVGhlIHJlcXVlc3QgdG9cbiAqICAgICBhYm9ydCBvciB0aGUgc29ja2V0IHRvIGRlc3Ryb3lcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhYm9ydEhhbmRzaGFrZSh3ZWJzb2NrZXQsIHN0cmVhbSwgbWVzc2FnZSkge1xuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcblxuICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgYWJvcnRIYW5kc2hha2UpO1xuXG4gIGlmIChzdHJlYW0uc2V0SGVhZGVyKSB7XG4gICAgc3RyZWFtW2tBYm9ydGVkXSA9IHRydWU7XG4gICAgc3RyZWFtLmFib3J0KCk7XG5cbiAgICBpZiAoc3RyZWFtLnNvY2tldCAmJiAhc3RyZWFtLnNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIC8vXG4gICAgICAvLyBPbiBOb2RlLmpzID49IDE0LjMuMCBgcmVxdWVzdC5hYm9ydCgpYCBkb2VzIG5vdCBkZXN0cm95IHRoZSBzb2NrZXQgaWZcbiAgICAgIC8vIGNhbGxlZCBhZnRlciB0aGUgcmVxdWVzdCBjb21wbGV0ZWQuIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvaXNzdWVzLzE4NjkuXG4gICAgICAvL1xuICAgICAgc3RyZWFtLnNvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JBbmRDbG9zZSwgd2Vic29ja2V0LCBlcnIpO1xuICB9IGVsc2Uge1xuICAgIHN0cmVhbS5kZXN0cm95KGVycik7XG4gICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgd2Vic29ja2V0LmVtaXQuYmluZCh3ZWJzb2NrZXQsICdlcnJvcicpKTtcbiAgICBzdHJlYW0ub25jZSgnY2xvc2UnLCB3ZWJzb2NrZXQuZW1pdENsb3NlLmJpbmQod2Vic29ja2V0KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBIYW5kbGUgY2FzZXMgd2hlcmUgdGhlIGBwaW5nKClgLCBgcG9uZygpYCwgb3IgYHNlbmQoKWAgbWV0aG9kcyBhcmUgY2FsbGVkXG4gKiB3aGVuIHRoZSBgcmVhZHlTdGF0ZWAgYXR0cmlidXRlIGlzIGBDTE9TSU5HYCBvciBgQ0xPU0VEYC5cbiAqXG4gKiBAcGFyYW0ge1dlYlNvY2tldH0gd2Vic29ja2V0IFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAqIEBwYXJhbSB7Kn0gW2RhdGFdIFRoZSBkYXRhIHRvIHNlbmRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYl0gQ2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNlbmRBZnRlckNsb3NlKHdlYnNvY2tldCwgZGF0YSwgY2IpIHtcbiAgaWYgKGRhdGEpIHtcbiAgICBjb25zdCBsZW5ndGggPSBpc0Jsb2IoZGF0YSkgPyBkYXRhLnNpemUgOiB0b0J1ZmZlcihkYXRhKS5sZW5ndGg7XG5cbiAgICAvL1xuICAgIC8vIFRoZSBgX2J1ZmZlcmVkQW1vdW50YCBwcm9wZXJ0eSBpcyB1c2VkIG9ubHkgd2hlbiB0aGUgcGVlciBpcyBhIGNsaWVudCBhbmRcbiAgICAvLyB0aGUgb3BlbmluZyBoYW5kc2hha2UgZmFpbHMuIFVuZGVyIHRoZXNlIGNpcmN1bXN0YW5jZXMsIGluIGZhY3QsIHRoZVxuICAgIC8vIGBzZXRTb2NrZXQoKWAgbWV0aG9kIGlzIG5vdCBjYWxsZWQsIHNvIHRoZSBgX3NvY2tldGAgYW5kIGBfc2VuZGVyYFxuICAgIC8vIHByb3BlcnRpZXMgYXJlIHNldCB0byBgbnVsbGAuXG4gICAgLy9cbiAgICBpZiAod2Vic29ja2V0Ll9zb2NrZXQpIHdlYnNvY2tldC5fc2VuZGVyLl9idWZmZXJlZEJ5dGVzICs9IGxlbmd0aDtcbiAgICBlbHNlIHdlYnNvY2tldC5fYnVmZmVyZWRBbW91bnQgKz0gbGVuZ3RoO1xuICB9XG5cbiAgaWYgKGNiKSB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgYFdlYlNvY2tldCBpcyBub3Qgb3BlbjogcmVhZHlTdGF0ZSAke3dlYnNvY2tldC5yZWFkeVN0YXRlfSBgICtcbiAgICAgICAgYCgke3JlYWR5U3RhdGVzW3dlYnNvY2tldC5yZWFkeVN0YXRlXX0pYFxuICAgICk7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXJyKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYFJlY2VpdmVyYCBgJ2NvbmNsdWRlJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGUgVGhlIHN0YXR1cyBjb2RlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gcmVhc29uIFRoZSByZWFzb24gZm9yIGNsb3NpbmdcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25Db25jbHVkZShjb2RlLCByZWFzb24pIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICB3ZWJzb2NrZXQuX2Nsb3NlRnJhbWVSZWNlaXZlZCA9IHRydWU7XG4gIHdlYnNvY2tldC5fY2xvc2VNZXNzYWdlID0gcmVhc29uO1xuICB3ZWJzb2NrZXQuX2Nsb3NlQ29kZSA9IGNvZGU7XG5cbiAgaWYgKHdlYnNvY2tldC5fc29ja2V0W2tXZWJTb2NrZXRdID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICB3ZWJzb2NrZXQuX3NvY2tldC5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHNvY2tldE9uRGF0YSk7XG4gIHByb2Nlc3MubmV4dFRpY2socmVzdW1lLCB3ZWJzb2NrZXQuX3NvY2tldCk7XG5cbiAgaWYgKGNvZGUgPT09IDEwMDUpIHdlYnNvY2tldC5jbG9zZSgpO1xuICBlbHNlIHdlYnNvY2tldC5jbG9zZShjb2RlLCByZWFzb24pO1xufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgYFJlY2VpdmVyYCBgJ2RyYWluJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZXJPbkRyYWluKCkge1xuICBjb25zdCB3ZWJzb2NrZXQgPSB0aGlzW2tXZWJTb2NrZXRdO1xuXG4gIGlmICghd2Vic29ja2V0LmlzUGF1c2VkKSB3ZWJzb2NrZXQuX3NvY2tldC5yZXN1bWUoKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFJhbmdlRXJyb3J8RXJyb3IpfSBlcnIgVGhlIGVtaXR0ZWQgZXJyb3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25FcnJvcihlcnIpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICBpZiAod2Vic29ja2V0Ll9zb2NrZXRba1dlYlNvY2tldF0gIT09IHVuZGVmaW5lZCkge1xuICAgIHdlYnNvY2tldC5fc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgc29ja2V0T25EYXRhKTtcblxuICAgIC8vXG4gICAgLy8gT24gTm9kZS5qcyA8IDE0LjAuMCB0aGUgYCdlcnJvcidgIGV2ZW50IGlzIGVtaXR0ZWQgc3luY2hyb25vdXNseS4gU2VlXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvaXNzdWVzLzE5NDAuXG4gICAgLy9cbiAgICBwcm9jZXNzLm5leHRUaWNrKHJlc3VtZSwgd2Vic29ja2V0Ll9zb2NrZXQpO1xuXG4gICAgd2Vic29ja2V0LmNsb3NlKGVycltrU3RhdHVzQ29kZV0pO1xuICB9XG5cbiAgaWYgKCF3ZWJzb2NrZXQuX2Vycm9yRW1pdHRlZCkge1xuICAgIHdlYnNvY2tldC5fZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICB3ZWJzb2NrZXQuZW1pdCgnZXJyb3InLCBlcnIpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBgUmVjZWl2ZXJgIGAnZmluaXNoJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZXJPbkZpbmlzaCgpIHtcbiAgdGhpc1trV2ViU29ja2V0XS5lbWl0Q2xvc2UoKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdtZXNzYWdlJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ8QXJyYXlCdWZmZXJ8QnVmZmVyW10pfSBkYXRhIFRoZSBtZXNzYWdlXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzQmluYXJ5IFNwZWNpZmllcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGlzIGJpbmFyeSBvciBub3RcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25NZXNzYWdlKGRhdGEsIGlzQmluYXJ5KSB7XG4gIHRoaXNba1dlYlNvY2tldF0uZW1pdCgnbWVzc2FnZScsIGRhdGEsIGlzQmluYXJ5KTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdwaW5nJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgVGhlIGRhdGEgaW5jbHVkZWQgaW4gdGhlIHBpbmcgZnJhbWVcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25QaW5nKGRhdGEpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICBpZiAod2Vic29ja2V0Ll9hdXRvUG9uZykgd2Vic29ja2V0LnBvbmcoZGF0YSwgIXRoaXMuX2lzU2VydmVyLCBOT09QKTtcbiAgd2Vic29ja2V0LmVtaXQoJ3BpbmcnLCBkYXRhKTtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2YgdGhlIGBSZWNlaXZlcmAgYCdwb25nJ2AgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgVGhlIGRhdGEgaW5jbHVkZWQgaW4gdGhlIHBvbmcgZnJhbWVcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVyT25Qb25nKGRhdGEpIHtcbiAgdGhpc1trV2ViU29ja2V0XS5lbWl0KCdwb25nJywgZGF0YSk7XG59XG5cbi8qKlxuICogUmVzdW1lIGEgcmVhZGFibGUgc3RyZWFtXG4gKlxuICogQHBhcmFtIHtSZWFkYWJsZX0gc3RyZWFtIFRoZSByZWFkYWJsZSBzdHJlYW1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0pIHtcbiAgc3RyZWFtLnJlc3VtZSgpO1xufVxuXG4vKipcbiAqIFRoZSBgU2VuZGVyYCBlcnJvciBldmVudCBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IFRoZSBlcnJvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2VuZGVyT25FcnJvcihlcnIpIHtcbiAgY29uc3Qgd2Vic29ja2V0ID0gdGhpc1trV2ViU29ja2V0XTtcblxuICBpZiAod2Vic29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5DTE9TRUQpIHJldHVybjtcbiAgaWYgKHdlYnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgIHdlYnNvY2tldC5fcmVhZHlTdGF0ZSA9IFdlYlNvY2tldC5DTE9TSU5HO1xuICAgIHNldENsb3NlVGltZXIod2Vic29ja2V0KTtcbiAgfVxuXG4gIC8vXG4gIC8vIGBzb2NrZXQuZW5kKClgIGlzIHVzZWQgaW5zdGVhZCBvZiBgc29ja2V0LmRlc3Ryb3koKWAgdG8gYWxsb3cgdGhlIG90aGVyXG4gIC8vIHBlZXIgdG8gZmluaXNoIHNlbmRpbmcgcXVldWVkIGRhdGEuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IGEgdGltZXIgaGVyZVxuICAvLyBiZWNhdXNlIGBDTE9TSU5HYCBtZWFucyB0aGF0IGl0IGlzIGFscmVhZHkgc2V0IG9yIG5vdCBuZWVkZWQuXG4gIC8vXG4gIHRoaXMuX3NvY2tldC5lbmQoKTtcblxuICBpZiAoIXdlYnNvY2tldC5fZXJyb3JFbWl0dGVkKSB7XG4gICAgd2Vic29ja2V0Ll9lcnJvckVtaXR0ZWQgPSB0cnVlO1xuICAgIHdlYnNvY2tldC5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cbn1cblxuLyoqXG4gKiBTZXQgYSB0aW1lciB0byBkZXN0cm95IHRoZSB1bmRlcmx5aW5nIHJhdyBzb2NrZXQgb2YgYSBXZWJTb2NrZXQuXG4gKlxuICogQHBhcmFtIHtXZWJTb2NrZXR9IHdlYnNvY2tldCBUaGUgV2ViU29ja2V0IGluc3RhbmNlXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXRDbG9zZVRpbWVyKHdlYnNvY2tldCkge1xuICB3ZWJzb2NrZXQuX2Nsb3NlVGltZXIgPSBzZXRUaW1lb3V0KFxuICAgIHdlYnNvY2tldC5fc29ja2V0LmRlc3Ryb3kuYmluZCh3ZWJzb2NrZXQuX3NvY2tldCksXG4gICAgY2xvc2VUaW1lb3V0XG4gICk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBzb2NrZXQgYCdjbG9zZSdgIGV2ZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNvY2tldE9uQ2xvc2UoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XG5cbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBzb2NrZXRPbkNsb3NlKTtcbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHNvY2tldE9uRGF0YSk7XG4gIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHNvY2tldE9uRW5kKTtcblxuICB3ZWJzb2NrZXQuX3JlYWR5U3RhdGUgPSBXZWJTb2NrZXQuQ0xPU0lORztcblxuICBsZXQgY2h1bms7XG5cbiAgLy9cbiAgLy8gVGhlIGNsb3NlIGZyYW1lIG1pZ2h0IG5vdCBoYXZlIGJlZW4gcmVjZWl2ZWQgb3IgdGhlIGAnZW5kJ2AgZXZlbnQgZW1pdHRlZCxcbiAgLy8gZm9yIGV4YW1wbGUsIGlmIHRoZSBzb2NrZXQgd2FzIGRlc3Ryb3llZCBkdWUgdG8gYW4gZXJyb3IuIEVuc3VyZSB0aGF0IHRoZVxuICAvLyBgcmVjZWl2ZXJgIHN0cmVhbSBpcyBjbG9zZWQgYWZ0ZXIgd3JpdGluZyBhbnkgcmVtYWluaW5nIGJ1ZmZlcmVkIGRhdGEgdG9cbiAgLy8gaXQuIElmIHRoZSByZWFkYWJsZSBzaWRlIG9mIHRoZSBzb2NrZXQgaXMgaW4gZmxvd2luZyBtb2RlIHRoZW4gdGhlcmUgaXMgbm9cbiAgLy8gYnVmZmVyZWQgZGF0YSBhcyBldmVyeXRoaW5nIGhhcyBiZWVuIGFscmVhZHkgd3JpdHRlbiBhbmQgYHJlYWRhYmxlLnJlYWQoKWBcbiAgLy8gd2lsbCByZXR1cm4gYG51bGxgLiBJZiBpbnN0ZWFkLCB0aGUgc29ja2V0IGlzIHBhdXNlZCwgYW55IHBvc3NpYmxlIGJ1ZmZlcmVkXG4gIC8vIGRhdGEgd2lsbCBiZSByZWFkIGFzIGEgc2luZ2xlIGNodW5rLlxuICAvL1xuICBpZiAoXG4gICAgIXRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCAmJlxuICAgICF3ZWJzb2NrZXQuX2Nsb3NlRnJhbWVSZWNlaXZlZCAmJlxuICAgICF3ZWJzb2NrZXQuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCAmJlxuICAgIChjaHVuayA9IHdlYnNvY2tldC5fc29ja2V0LnJlYWQoKSkgIT09IG51bGxcbiAgKSB7XG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci53cml0ZShjaHVuayk7XG4gIH1cblxuICB3ZWJzb2NrZXQuX3JlY2VpdmVyLmVuZCgpO1xuXG4gIHRoaXNba1dlYlNvY2tldF0gPSB1bmRlZmluZWQ7XG5cbiAgY2xlYXJUaW1lb3V0KHdlYnNvY2tldC5fY2xvc2VUaW1lcik7XG5cbiAgaWYgKFxuICAgIHdlYnNvY2tldC5fcmVjZWl2ZXIuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgfHxcbiAgICB3ZWJzb2NrZXQuX3JlY2VpdmVyLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZFxuICApIHtcbiAgICB3ZWJzb2NrZXQuZW1pdENsb3NlKCk7XG4gIH0gZWxzZSB7XG4gICAgd2Vic29ja2V0Ll9yZWNlaXZlci5vbignZXJyb3InLCByZWNlaXZlck9uRmluaXNoKTtcbiAgICB3ZWJzb2NrZXQuX3JlY2VpdmVyLm9uKCdmaW5pc2gnLCByZWNlaXZlck9uRmluaXNoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgc29ja2V0IGAnZGF0YSdgIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBjaHVuayBBIGNodW5rIG9mIGRhdGFcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNvY2tldE9uRGF0YShjaHVuaykge1xuICBpZiAoIXRoaXNba1dlYlNvY2tldF0uX3JlY2VpdmVyLndyaXRlKGNodW5rKSkge1xuICAgIHRoaXMucGF1c2UoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsaXN0ZW5lciBvZiB0aGUgc29ja2V0IGAnZW5kJ2AgZXZlbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc29ja2V0T25FbmQoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XG5cbiAgd2Vic29ja2V0Ll9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NJTkc7XG4gIHdlYnNvY2tldC5fcmVjZWl2ZXIuZW5kKCk7XG4gIHRoaXMuZW5kKCk7XG59XG5cbi8qKlxuICogVGhlIGxpc3RlbmVyIG9mIHRoZSBzb2NrZXQgYCdlcnJvcidgIGV2ZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNvY2tldE9uRXJyb3IoKSB7XG4gIGNvbnN0IHdlYnNvY2tldCA9IHRoaXNba1dlYlNvY2tldF07XG5cbiAgdGhpcy5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBzb2NrZXRPbkVycm9yKTtcbiAgdGhpcy5vbignZXJyb3InLCBOT09QKTtcblxuICBpZiAod2Vic29ja2V0KSB7XG4gICAgd2Vic29ja2V0Ll9yZWFkeVN0YXRlID0gV2ViU29ja2V0LkNMT1NJTkc7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0J1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoWWFsbGlzdCkge1xuICBZYWxsaXN0LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24qICgpIHtcbiAgICBmb3IgKGxldCB3YWxrZXIgPSB0aGlzLmhlYWQ7IHdhbGtlcjsgd2Fsa2VyID0gd2Fsa2VyLm5leHQpIHtcbiAgICAgIHlpZWxkIHdhbGtlci52YWx1ZVxuICAgIH1cbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5tb2R1bGUuZXhwb3J0cyA9IFlhbGxpc3RcblxuWWFsbGlzdC5Ob2RlID0gTm9kZVxuWWFsbGlzdC5jcmVhdGUgPSBZYWxsaXN0XG5cbmZ1bmN0aW9uIFlhbGxpc3QgKGxpc3QpIHtcbiAgdmFyIHNlbGYgPSB0aGlzXG4gIGlmICghKHNlbGYgaW5zdGFuY2VvZiBZYWxsaXN0KSkge1xuICAgIHNlbGYgPSBuZXcgWWFsbGlzdCgpXG4gIH1cblxuICBzZWxmLnRhaWwgPSBudWxsXG4gIHNlbGYuaGVhZCA9IG51bGxcbiAgc2VsZi5sZW5ndGggPSAwXG5cbiAgaWYgKGxpc3QgJiYgdHlwZW9mIGxpc3QuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgc2VsZi5wdXNoKGl0ZW0pXG4gICAgfSlcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgc2VsZi5wdXNoKGFyZ3VtZW50c1tpXSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VsZlxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5yZW1vdmVOb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgaWYgKG5vZGUubGlzdCAhPT0gdGhpcykge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVtb3Zpbmcgbm9kZSB3aGljaCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBsaXN0JylcbiAgfVxuXG4gIHZhciBuZXh0ID0gbm9kZS5uZXh0XG4gIHZhciBwcmV2ID0gbm9kZS5wcmV2XG5cbiAgaWYgKG5leHQpIHtcbiAgICBuZXh0LnByZXYgPSBwcmV2XG4gIH1cblxuICBpZiAocHJldikge1xuICAgIHByZXYubmV4dCA9IG5leHRcbiAgfVxuXG4gIGlmIChub2RlID09PSB0aGlzLmhlYWQpIHtcbiAgICB0aGlzLmhlYWQgPSBuZXh0XG4gIH1cbiAgaWYgKG5vZGUgPT09IHRoaXMudGFpbCkge1xuICAgIHRoaXMudGFpbCA9IHByZXZcbiAgfVxuXG4gIG5vZGUubGlzdC5sZW5ndGgtLVxuICBub2RlLm5leHQgPSBudWxsXG4gIG5vZGUucHJldiA9IG51bGxcbiAgbm9kZS5saXN0ID0gbnVsbFxuXG4gIHJldHVybiBuZXh0XG59XG5cbllhbGxpc3QucHJvdG90eXBlLnVuc2hpZnROb2RlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IHRoaXMuaGVhZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKG5vZGUubGlzdCkge1xuICAgIG5vZGUubGlzdC5yZW1vdmVOb2RlKG5vZGUpXG4gIH1cblxuICB2YXIgaGVhZCA9IHRoaXMuaGVhZFxuICBub2RlLmxpc3QgPSB0aGlzXG4gIG5vZGUubmV4dCA9IGhlYWRcbiAgaWYgKGhlYWQpIHtcbiAgICBoZWFkLnByZXYgPSBub2RlXG4gIH1cblxuICB0aGlzLmhlYWQgPSBub2RlXG4gIGlmICghdGhpcy50YWlsKSB7XG4gICAgdGhpcy50YWlsID0gbm9kZVxuICB9XG4gIHRoaXMubGVuZ3RoKytcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucHVzaE5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICBpZiAobm9kZSA9PT0gdGhpcy50YWlsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAobm9kZS5saXN0KSB7XG4gICAgbm9kZS5saXN0LnJlbW92ZU5vZGUobm9kZSlcbiAgfVxuXG4gIHZhciB0YWlsID0gdGhpcy50YWlsXG4gIG5vZGUubGlzdCA9IHRoaXNcbiAgbm9kZS5wcmV2ID0gdGFpbFxuICBpZiAodGFpbCkge1xuICAgIHRhaWwubmV4dCA9IG5vZGVcbiAgfVxuXG4gIHRoaXMudGFpbCA9IG5vZGVcbiAgaWYgKCF0aGlzLmhlYWQpIHtcbiAgICB0aGlzLmhlYWQgPSBub2RlXG4gIH1cbiAgdGhpcy5sZW5ndGgrK1xufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBwdXNoKHRoaXMsIGFyZ3VtZW50c1tpXSlcbiAgfVxuICByZXR1cm4gdGhpcy5sZW5ndGhcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgdW5zaGlmdCh0aGlzLCBhcmd1bWVudHNbaV0pXG4gIH1cbiAgcmV0dXJuIHRoaXMubGVuZ3RoXG59XG5cbllhbGxpc3QucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLnRhaWwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICB2YXIgcmVzID0gdGhpcy50YWlsLnZhbHVlXG4gIHRoaXMudGFpbCA9IHRoaXMudGFpbC5wcmV2XG4gIGlmICh0aGlzLnRhaWwpIHtcbiAgICB0aGlzLnRhaWwubmV4dCA9IG51bGxcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmhlYWQgPSBudWxsXG4gIH1cbiAgdGhpcy5sZW5ndGgtLVxuICByZXR1cm4gcmVzXG59XG5cbllhbGxpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuaGVhZCkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHZhciByZXMgPSB0aGlzLmhlYWQudmFsdWVcbiAgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHRcbiAgaWYgKHRoaXMuaGVhZCkge1xuICAgIHRoaXMuaGVhZC5wcmV2ID0gbnVsbFxuICB9IGVsc2Uge1xuICAgIHRoaXMudGFpbCA9IG51bGxcbiAgfVxuICB0aGlzLmxlbmd0aC0tXG4gIHJldHVybiByZXNcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChmbiwgdGhpc3ApIHtcbiAgdGhpc3AgPSB0aGlzcCB8fCB0aGlzXG4gIGZvciAodmFyIHdhbGtlciA9IHRoaXMuaGVhZCwgaSA9IDA7IHdhbGtlciAhPT0gbnVsbDsgaSsrKSB7XG4gICAgZm4uY2FsbCh0aGlzcCwgd2Fsa2VyLnZhbHVlLCBpLCB0aGlzKVxuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cbn1cblxuWWFsbGlzdC5wcm90b3R5cGUuZm9yRWFjaFJldmVyc2UgPSBmdW5jdGlvbiAoZm4sIHRoaXNwKSB7XG4gIHRoaXNwID0gdGhpc3AgfHwgdGhpc1xuICBmb3IgKHZhciB3YWxrZXIgPSB0aGlzLnRhaWwsIGkgPSB0aGlzLmxlbmd0aCAtIDE7IHdhbGtlciAhPT0gbnVsbDsgaS0tKSB7XG4gICAgZm4uY2FsbCh0aGlzcCwgd2Fsa2VyLnZhbHVlLCBpLCB0aGlzKVxuICAgIHdhbGtlciA9IHdhbGtlci5wcmV2XG4gIH1cbn1cblxuWWFsbGlzdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG4pIHtcbiAgZm9yICh2YXIgaSA9IDAsIHdhbGtlciA9IHRoaXMuaGVhZDsgd2Fsa2VyICE9PSBudWxsICYmIGkgPCBuOyBpKyspIHtcbiAgICAvLyBhYm9ydCBvdXQgb2YgdGhlIGxpc3QgZWFybHkgaWYgd2UgaGl0IGEgY3ljbGVcbiAgICB3YWxrZXIgPSB3YWxrZXIubmV4dFxuICB9XG4gIGlmIChpID09PSBuICYmIHdhbGtlciAhPT0gbnVsbCkge1xuICAgIHJldHVybiB3YWxrZXIudmFsdWVcbiAgfVxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5nZXRSZXZlcnNlID0gZnVuY3Rpb24gKG4pIHtcbiAgZm9yICh2YXIgaSA9IDAsIHdhbGtlciA9IHRoaXMudGFpbDsgd2Fsa2VyICE9PSBudWxsICYmIGkgPCBuOyBpKyspIHtcbiAgICAvLyBhYm9ydCBvdXQgb2YgdGhlIGxpc3QgZWFybHkgaWYgd2UgaGl0IGEgY3ljbGVcbiAgICB3YWxrZXIgPSB3YWxrZXIucHJldlxuICB9XG4gIGlmIChpID09PSBuICYmIHdhbGtlciAhPT0gbnVsbCkge1xuICAgIHJldHVybiB3YWxrZXIudmFsdWVcbiAgfVxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAoZm4sIHRoaXNwKSB7XG4gIHRoaXNwID0gdGhpc3AgfHwgdGhpc1xuICB2YXIgcmVzID0gbmV3IFlhbGxpc3QoKVxuICBmb3IgKHZhciB3YWxrZXIgPSB0aGlzLmhlYWQ7IHdhbGtlciAhPT0gbnVsbDspIHtcbiAgICByZXMucHVzaChmbi5jYWxsKHRoaXNwLCB3YWxrZXIudmFsdWUsIHRoaXMpKVxuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5tYXBSZXZlcnNlID0gZnVuY3Rpb24gKGZuLCB0aGlzcCkge1xuICB0aGlzcCA9IHRoaXNwIHx8IHRoaXNcbiAgdmFyIHJlcyA9IG5ldyBZYWxsaXN0KClcbiAgZm9yICh2YXIgd2Fsa2VyID0gdGhpcy50YWlsOyB3YWxrZXIgIT09IG51bGw7KSB7XG4gICAgcmVzLnB1c2goZm4uY2FsbCh0aGlzcCwgd2Fsa2VyLnZhbHVlLCB0aGlzKSlcbiAgICB3YWxrZXIgPSB3YWxrZXIucHJldlxuICB9XG4gIHJldHVybiByZXNcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucmVkdWNlID0gZnVuY3Rpb24gKGZuLCBpbml0aWFsKSB7XG4gIHZhciBhY2NcbiAgdmFyIHdhbGtlciA9IHRoaXMuaGVhZFxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICBhY2MgPSBpbml0aWFsXG4gIH0gZWxzZSBpZiAodGhpcy5oZWFkKSB7XG4gICAgd2Fsa2VyID0gdGhpcy5oZWFkLm5leHRcbiAgICBhY2MgPSB0aGlzLmhlYWQudmFsdWVcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgbGlzdCB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IHdhbGtlciAhPT0gbnVsbDsgaSsrKSB7XG4gICAgYWNjID0gZm4oYWNjLCB3YWxrZXIudmFsdWUsIGkpXG4gICAgd2Fsa2VyID0gd2Fsa2VyLm5leHRcbiAgfVxuXG4gIHJldHVybiBhY2Ncbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucmVkdWNlUmV2ZXJzZSA9IGZ1bmN0aW9uIChmbiwgaW5pdGlhbCkge1xuICB2YXIgYWNjXG4gIHZhciB3YWxrZXIgPSB0aGlzLnRhaWxcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgYWNjID0gaW5pdGlhbFxuICB9IGVsc2UgaWYgKHRoaXMudGFpbCkge1xuICAgIHdhbGtlciA9IHRoaXMudGFpbC5wcmV2XG4gICAgYWNjID0gdGhpcy50YWlsLnZhbHVlXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVkdWNlIG9mIGVtcHR5IGxpc3Qgd2l0aCBubyBpbml0aWFsIHZhbHVlJylcbiAgfVxuXG4gIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IHdhbGtlciAhPT0gbnVsbDsgaS0tKSB7XG4gICAgYWNjID0gZm4oYWNjLCB3YWxrZXIudmFsdWUsIGkpXG4gICAgd2Fsa2VyID0gd2Fsa2VyLnByZXZcbiAgfVxuXG4gIHJldHVybiBhY2Ncbn1cblxuWWFsbGlzdC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGFyciA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDAsIHdhbGtlciA9IHRoaXMuaGVhZDsgd2Fsa2VyICE9PSBudWxsOyBpKyspIHtcbiAgICBhcnJbaV0gPSB3YWxrZXIudmFsdWVcbiAgICB3YWxrZXIgPSB3YWxrZXIubmV4dFxuICB9XG4gIHJldHVybiBhcnJcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUudG9BcnJheVJldmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBhcnIgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwLCB3YWxrZXIgPSB0aGlzLnRhaWw7IHdhbGtlciAhPT0gbnVsbDsgaSsrKSB7XG4gICAgYXJyW2ldID0gd2Fsa2VyLnZhbHVlXG4gICAgd2Fsa2VyID0gd2Fsa2VyLnByZXZcbiAgfVxuICByZXR1cm4gYXJyXG59XG5cbllhbGxpc3QucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gIHRvID0gdG8gfHwgdGhpcy5sZW5ndGhcbiAgaWYgKHRvIDwgMCkge1xuICAgIHRvICs9IHRoaXMubGVuZ3RoXG4gIH1cbiAgZnJvbSA9IGZyb20gfHwgMFxuICBpZiAoZnJvbSA8IDApIHtcbiAgICBmcm9tICs9IHRoaXMubGVuZ3RoXG4gIH1cbiAgdmFyIHJldCA9IG5ldyBZYWxsaXN0KClcbiAgaWYgKHRvIDwgZnJvbSB8fCB0byA8IDApIHtcbiAgICByZXR1cm4gcmV0XG4gIH1cbiAgaWYgKGZyb20gPCAwKSB7XG4gICAgZnJvbSA9IDBcbiAgfVxuICBpZiAodG8gPiB0aGlzLmxlbmd0aCkge1xuICAgIHRvID0gdGhpcy5sZW5ndGhcbiAgfVxuICBmb3IgKHZhciBpID0gMCwgd2Fsa2VyID0gdGhpcy5oZWFkOyB3YWxrZXIgIT09IG51bGwgJiYgaSA8IGZyb207IGkrKykge1xuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cbiAgZm9yICg7IHdhbGtlciAhPT0gbnVsbCAmJiBpIDwgdG87IGkrKywgd2Fsa2VyID0gd2Fsa2VyLm5leHQpIHtcbiAgICByZXQucHVzaCh3YWxrZXIudmFsdWUpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5zbGljZVJldmVyc2UgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgdG8gPSB0byB8fCB0aGlzLmxlbmd0aFxuICBpZiAodG8gPCAwKSB7XG4gICAgdG8gKz0gdGhpcy5sZW5ndGhcbiAgfVxuICBmcm9tID0gZnJvbSB8fCAwXG4gIGlmIChmcm9tIDwgMCkge1xuICAgIGZyb20gKz0gdGhpcy5sZW5ndGhcbiAgfVxuICB2YXIgcmV0ID0gbmV3IFlhbGxpc3QoKVxuICBpZiAodG8gPCBmcm9tIHx8IHRvIDwgMCkge1xuICAgIHJldHVybiByZXRcbiAgfVxuICBpZiAoZnJvbSA8IDApIHtcbiAgICBmcm9tID0gMFxuICB9XG4gIGlmICh0byA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdG8gPSB0aGlzLmxlbmd0aFxuICB9XG4gIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCwgd2Fsa2VyID0gdGhpcy50YWlsOyB3YWxrZXIgIT09IG51bGwgJiYgaSA+IHRvOyBpLS0pIHtcbiAgICB3YWxrZXIgPSB3YWxrZXIucHJldlxuICB9XG4gIGZvciAoOyB3YWxrZXIgIT09IG51bGwgJiYgaSA+IGZyb207IGktLSwgd2Fsa2VyID0gd2Fsa2VyLnByZXYpIHtcbiAgICByZXQucHVzaCh3YWxrZXIudmFsdWUpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5ZYWxsaXN0LnByb3RvdHlwZS5zcGxpY2UgPSBmdW5jdGlvbiAoc3RhcnQsIGRlbGV0ZUNvdW50LCAuLi5ub2Rlcykge1xuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggLSAxXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gdGhpcy5sZW5ndGggKyBzdGFydDtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCB3YWxrZXIgPSB0aGlzLmhlYWQ7IHdhbGtlciAhPT0gbnVsbCAmJiBpIDwgc3RhcnQ7IGkrKykge1xuICAgIHdhbGtlciA9IHdhbGtlci5uZXh0XG4gIH1cblxuICB2YXIgcmV0ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IHdhbGtlciAmJiBpIDwgZGVsZXRlQ291bnQ7IGkrKykge1xuICAgIHJldC5wdXNoKHdhbGtlci52YWx1ZSlcbiAgICB3YWxrZXIgPSB0aGlzLnJlbW92ZU5vZGUod2Fsa2VyKVxuICB9XG4gIGlmICh3YWxrZXIgPT09IG51bGwpIHtcbiAgICB3YWxrZXIgPSB0aGlzLnRhaWxcbiAgfVxuXG4gIGlmICh3YWxrZXIgIT09IHRoaXMuaGVhZCAmJiB3YWxrZXIgIT09IHRoaXMudGFpbCkge1xuICAgIHdhbGtlciA9IHdhbGtlci5wcmV2XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgd2Fsa2VyID0gaW5zZXJ0KHRoaXMsIHdhbGtlciwgbm9kZXNbaV0pXG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuWWFsbGlzdC5wcm90b3R5cGUucmV2ZXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhlYWQgPSB0aGlzLmhlYWRcbiAgdmFyIHRhaWwgPSB0aGlzLnRhaWxcbiAgZm9yICh2YXIgd2Fsa2VyID0gaGVhZDsgd2Fsa2VyICE9PSBudWxsOyB3YWxrZXIgPSB3YWxrZXIucHJldikge1xuICAgIHZhciBwID0gd2Fsa2VyLnByZXZcbiAgICB3YWxrZXIucHJldiA9IHdhbGtlci5uZXh0XG4gICAgd2Fsa2VyLm5leHQgPSBwXG4gIH1cbiAgdGhpcy5oZWFkID0gdGFpbFxuICB0aGlzLnRhaWwgPSBoZWFkXG4gIHJldHVybiB0aGlzXG59XG5cbmZ1bmN0aW9uIGluc2VydCAoc2VsZiwgbm9kZSwgdmFsdWUpIHtcbiAgdmFyIGluc2VydGVkID0gbm9kZSA9PT0gc2VsZi5oZWFkID9cbiAgICBuZXcgTm9kZSh2YWx1ZSwgbnVsbCwgbm9kZSwgc2VsZikgOlxuICAgIG5ldyBOb2RlKHZhbHVlLCBub2RlLCBub2RlLm5leHQsIHNlbGYpXG5cbiAgaWYgKGluc2VydGVkLm5leHQgPT09IG51bGwpIHtcbiAgICBzZWxmLnRhaWwgPSBpbnNlcnRlZFxuICB9XG4gIGlmIChpbnNlcnRlZC5wcmV2ID09PSBudWxsKSB7XG4gICAgc2VsZi5oZWFkID0gaW5zZXJ0ZWRcbiAgfVxuXG4gIHNlbGYubGVuZ3RoKytcblxuICByZXR1cm4gaW5zZXJ0ZWRcbn1cblxuZnVuY3Rpb24gcHVzaCAoc2VsZiwgaXRlbSkge1xuICBzZWxmLnRhaWwgPSBuZXcgTm9kZShpdGVtLCBzZWxmLnRhaWwsIG51bGwsIHNlbGYpXG4gIGlmICghc2VsZi5oZWFkKSB7XG4gICAgc2VsZi5oZWFkID0gc2VsZi50YWlsXG4gIH1cbiAgc2VsZi5sZW5ndGgrK1xufVxuXG5mdW5jdGlvbiB1bnNoaWZ0IChzZWxmLCBpdGVtKSB7XG4gIHNlbGYuaGVhZCA9IG5ldyBOb2RlKGl0ZW0sIG51bGwsIHNlbGYuaGVhZCwgc2VsZilcbiAgaWYgKCFzZWxmLnRhaWwpIHtcbiAgICBzZWxmLnRhaWwgPSBzZWxmLmhlYWRcbiAgfVxuICBzZWxmLmxlbmd0aCsrXG59XG5cbmZ1bmN0aW9uIE5vZGUgKHZhbHVlLCBwcmV2LCBuZXh0LCBsaXN0KSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBOb2RlKSkge1xuICAgIHJldHVybiBuZXcgTm9kZSh2YWx1ZSwgcHJldiwgbmV4dCwgbGlzdClcbiAgfVxuXG4gIHRoaXMubGlzdCA9IGxpc3RcbiAgdGhpcy52YWx1ZSA9IHZhbHVlXG5cbiAgaWYgKHByZXYpIHtcbiAgICBwcmV2Lm5leHQgPSB0aGlzXG4gICAgdGhpcy5wcmV2ID0gcHJldlxuICB9IGVsc2Uge1xuICAgIHRoaXMucHJldiA9IG51bGxcbiAgfVxuXG4gIGlmIChuZXh0KSB7XG4gICAgbmV4dC5wcmV2ID0gdGhpc1xuICAgIHRoaXMubmV4dCA9IG5leHRcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm5leHQgPSBudWxsXG4gIH1cbn1cblxudHJ5IHtcbiAgLy8gYWRkIGlmIHN1cHBvcnQgZm9yIFN5bWJvbC5pdGVyYXRvciBpcyBwcmVzZW50XG4gIHJlcXVpcmUoJy4vaXRlcmF0b3IuanMnKShZYWxsaXN0KVxufSBjYXRjaCAoZXIpIHt9XG4iLCJmdW5jdGlvbiB3ZWJwYWNrRW1wdHlDb250ZXh0KHJlcSkge1xuXHR2YXIgZSA9IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIidcIik7XG5cdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0dGhyb3cgZTtcbn1cbndlYnBhY2tFbXB0eUNvbnRleHQua2V5cyA9ICgpID0+IChbXSk7XG53ZWJwYWNrRW1wdHlDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrRW1wdHlDb250ZXh0O1xud2VicGFja0VtcHR5Q29udGV4dC5pZCA9IFwiLi9ub2RlX21vZHVsZXMveWFyZ3MtcGFyc2VyL2J1aWxkIHN5bmMgcmVjdXJzaXZlXCI7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tFbXB0eUNvbnRleHQ7IiwiZnVuY3Rpb24gd2VicGFja0VtcHR5Q29udGV4dChyZXEpIHtcblx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRlLmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCc7XG5cdHRocm93IGU7XG59XG53ZWJwYWNrRW1wdHlDb250ZXh0LmtleXMgPSAoKSA9PiAoW10pO1xud2VicGFja0VtcHR5Q29udGV4dC5yZXNvbHZlID0gd2VicGFja0VtcHR5Q29udGV4dDtcbndlYnBhY2tFbXB0eUNvbnRleHQuaWQgPSBcIi4vbm9kZV9tb2R1bGVzL3lhcmdzL2J1aWxkIHN5bmMgcmVjdXJzaXZlXCI7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tFbXB0eUNvbnRleHQ7IiwidmFyIGZzID0gcmVxdWlyZShcImZzXCIpO1xudmFyIHpsaWIgPSByZXF1aXJlKFwiemxpYlwiKTtcbnZhciBmZF9zbGljZXIgPSByZXF1aXJlKFwiZmQtc2xpY2VyXCIpO1xudmFyIGNyYzMyID0gcmVxdWlyZShcImJ1ZmZlci1jcmMzMlwiKTtcbnZhciB1dGlsID0gcmVxdWlyZShcInV0aWxcIik7XG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZShcImV2ZW50c1wiKS5FdmVudEVtaXR0ZXI7XG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZShcInN0cmVhbVwiKS5UcmFuc2Zvcm07XG52YXIgUGFzc1Rocm91Z2ggPSByZXF1aXJlKFwic3RyZWFtXCIpLlBhc3NUaHJvdWdoO1xudmFyIFdyaXRhYmxlID0gcmVxdWlyZShcInN0cmVhbVwiKS5Xcml0YWJsZTtcblxuZXhwb3J0cy5vcGVuID0gb3BlbjtcbmV4cG9ydHMuZnJvbUZkID0gZnJvbUZkO1xuZXhwb3J0cy5mcm9tQnVmZmVyID0gZnJvbUJ1ZmZlcjtcbmV4cG9ydHMuZnJvbVJhbmRvbUFjY2Vzc1JlYWRlciA9IGZyb21SYW5kb21BY2Nlc3NSZWFkZXI7XG5leHBvcnRzLmRvc0RhdGVUaW1lVG9EYXRlID0gZG9zRGF0ZVRpbWVUb0RhdGU7XG5leHBvcnRzLnZhbGlkYXRlRmlsZU5hbWUgPSB2YWxpZGF0ZUZpbGVOYW1lO1xuZXhwb3J0cy5aaXBGaWxlID0gWmlwRmlsZTtcbmV4cG9ydHMuRW50cnkgPSBFbnRyeTtcbmV4cG9ydHMuUmFuZG9tQWNjZXNzUmVhZGVyID0gUmFuZG9tQWNjZXNzUmVhZGVyO1xuXG5mdW5jdGlvbiBvcGVuKHBhdGgsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSBudWxsO1xuICB9XG4gIGlmIChvcHRpb25zID09IG51bGwpIG9wdGlvbnMgPSB7fTtcbiAgaWYgKG9wdGlvbnMuYXV0b0Nsb3NlID09IG51bGwpIG9wdGlvbnMuYXV0b0Nsb3NlID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMubGF6eUVudHJpZXMgPT0gbnVsbCkgb3B0aW9ucy5sYXp5RW50cmllcyA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5kZWNvZGVTdHJpbmdzID09IG51bGwpIG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9IHRydWU7XG4gIGlmIChvcHRpb25zLnZhbGlkYXRlRW50cnlTaXplcyA9PSBudWxsKSBvcHRpb25zLnZhbGlkYXRlRW50cnlTaXplcyA9IHRydWU7XG4gIGlmIChvcHRpb25zLnN0cmljdEZpbGVOYW1lcyA9PSBudWxsKSBvcHRpb25zLnN0cmljdEZpbGVOYW1lcyA9IGZhbHNlO1xuICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgY2FsbGJhY2sgPSBkZWZhdWx0Q2FsbGJhY2s7XG4gIGZzLm9wZW4ocGF0aCwgXCJyXCIsIGZ1bmN0aW9uKGVyciwgZmQpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBmcm9tRmQoZmQsIG9wdGlvbnMsIGZ1bmN0aW9uKGVyciwgemlwZmlsZSkge1xuICAgICAgaWYgKGVycikgZnMuY2xvc2UoZmQsIGRlZmF1bHRDYWxsYmFjayk7XG4gICAgICBjYWxsYmFjayhlcnIsIHppcGZpbGUpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZnJvbUZkKGZkLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0gbnVsbDtcbiAgfVxuICBpZiAob3B0aW9ucyA9PSBudWxsKSBvcHRpb25zID0ge307XG4gIGlmIChvcHRpb25zLmF1dG9DbG9zZSA9PSBudWxsKSBvcHRpb25zLmF1dG9DbG9zZSA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5sYXp5RW50cmllcyA9PSBudWxsKSBvcHRpb25zLmxhenlFbnRyaWVzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmRlY29kZVN0cmluZ3MgPT0gbnVsbCkgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID09IG51bGwpIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID09IG51bGwpIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID0gZmFsc2U7XG4gIGlmIChjYWxsYmFjayA9PSBudWxsKSBjYWxsYmFjayA9IGRlZmF1bHRDYWxsYmFjaztcbiAgZnMuZnN0YXQoZmQsIGZ1bmN0aW9uKGVyciwgc3RhdHMpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB2YXIgcmVhZGVyID0gZmRfc2xpY2VyLmNyZWF0ZUZyb21GZChmZCwge2F1dG9DbG9zZTogdHJ1ZX0pO1xuICAgIGZyb21SYW5kb21BY2Nlc3NSZWFkZXIocmVhZGVyLCBzdGF0cy5zaXplLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmcm9tQnVmZmVyKGJ1ZmZlciwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgb3B0aW9ucyA9IHt9O1xuICBvcHRpb25zLmF1dG9DbG9zZSA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5sYXp5RW50cmllcyA9PSBudWxsKSBvcHRpb25zLmxhenlFbnRyaWVzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmRlY29kZVN0cmluZ3MgPT0gbnVsbCkgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID09IG51bGwpIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID09IG51bGwpIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID0gZmFsc2U7XG4gIC8vIGxpbWl0IHRoZSBtYXggY2h1bmsgc2l6ZS4gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVqb3Nod29sZmUveWF1emwvaXNzdWVzLzg3XG4gIHZhciByZWFkZXIgPSBmZF9zbGljZXIuY3JlYXRlRnJvbUJ1ZmZlcihidWZmZXIsIHttYXhDaHVua1NpemU6IDB4MTAwMDB9KTtcbiAgZnJvbVJhbmRvbUFjY2Vzc1JlYWRlcihyZWFkZXIsIGJ1ZmZlci5sZW5ndGgsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZnJvbVJhbmRvbUFjY2Vzc1JlYWRlcihyZWFkZXIsIHRvdGFsU2l6ZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgb3B0aW9ucyA9IHt9O1xuICBpZiAob3B0aW9ucy5hdXRvQ2xvc2UgPT0gbnVsbCkgb3B0aW9ucy5hdXRvQ2xvc2UgPSB0cnVlO1xuICBpZiAob3B0aW9ucy5sYXp5RW50cmllcyA9PSBudWxsKSBvcHRpb25zLmxhenlFbnRyaWVzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmRlY29kZVN0cmluZ3MgPT0gbnVsbCkgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gdHJ1ZTtcbiAgdmFyIGRlY29kZVN0cmluZ3MgPSAhIW9wdGlvbnMuZGVjb2RlU3RyaW5ncztcbiAgaWYgKG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID09IG51bGwpIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID09IG51bGwpIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzID0gZmFsc2U7XG4gIGlmIChjYWxsYmFjayA9PSBudWxsKSBjYWxsYmFjayA9IGRlZmF1bHRDYWxsYmFjaztcbiAgaWYgKHR5cGVvZiB0b3RhbFNpemUgIT09IFwibnVtYmVyXCIpIHRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIHRvdGFsU2l6ZSBwYXJhbWV0ZXIgdG8gYmUgYSBudW1iZXJcIik7XG4gIGlmICh0b3RhbFNpemUgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgIHRocm93IG5ldyBFcnJvcihcInppcCBmaWxlIHRvbyBsYXJnZS4gb25seSBmaWxlIHNpemVzIHVwIHRvIDJeNTIgYXJlIHN1cHBvcnRlZCBkdWUgdG8gSmF2YVNjcmlwdCdzIE51bWJlciB0eXBlIGJlaW5nIGFuIElFRUUgNzU0IGRvdWJsZS5cIik7XG4gIH1cblxuICAvLyB0aGUgbWF0Y2hpbmcgdW5yZWYoKSBjYWxsIGlzIGluIHppcGZpbGUuY2xvc2UoKVxuICByZWFkZXIucmVmKCk7XG5cbiAgLy8gZW9jZHIgbWVhbnMgRW5kIG9mIENlbnRyYWwgRGlyZWN0b3J5IFJlY29yZC5cbiAgLy8gc2VhcmNoIGJhY2t3YXJkcyBmb3IgdGhlIGVvY2RyIHNpZ25hdHVyZS5cbiAgLy8gdGhlIGxhc3QgZmllbGQgb2YgdGhlIGVvY2RyIGlzIGEgdmFyaWFibGUtbGVuZ3RoIGNvbW1lbnQuXG4gIC8vIHRoZSBjb21tZW50IHNpemUgaXMgZW5jb2RlZCBpbiBhIDItYnl0ZSBmaWVsZCBpbiB0aGUgZW9jZHIsIHdoaWNoIHdlIGNhbid0IGZpbmQgd2l0aG91dCB0cnVkZ2luZyBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgY29tbWVudCB0byBmaW5kIGl0LlxuICAvLyBhcyBhIGNvbnNlcXVlbmNlIG9mIHRoaXMgZGVzaWduIGRlY2lzaW9uLCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgYW1iaWd1b3VzIHppcCBmaWxlIG1ldGFkYXRhIGlmIGEgY29oZXJlbnQgZW9jZHIgd2FzIGluIHRoZSBjb21tZW50LlxuICAvLyB3ZSBzZWFyY2ggYmFja3dhcmRzIGZvciBhIGVvY2RyIHNpZ25hdHVyZSwgYW5kIGhvcGUgdGhhdCB3aG9ldmVyIG1hZGUgdGhlIHppcCBmaWxlIHdhcyBzbWFydCBlbm91Z2ggdG8gZm9yYmlkIHRoZSBlb2NkciBzaWduYXR1cmUgaW4gdGhlIGNvbW1lbnQuXG4gIHZhciBlb2NkcldpdGhvdXRDb21tZW50U2l6ZSA9IDIyO1xuICB2YXIgbWF4Q29tbWVudFNpemUgPSAweGZmZmY7IC8vIDItYnl0ZSBzaXplXG4gIHZhciBidWZmZXJTaXplID0gTWF0aC5taW4oZW9jZHJXaXRob3V0Q29tbWVudFNpemUgKyBtYXhDb21tZW50U2l6ZSwgdG90YWxTaXplKTtcbiAgdmFyIGJ1ZmZlciA9IG5ld0J1ZmZlcihidWZmZXJTaXplKTtcbiAgdmFyIGJ1ZmZlclJlYWRTdGFydCA9IHRvdGFsU2l6ZSAtIGJ1ZmZlci5sZW5ndGg7XG4gIHJlYWRBbmRBc3NlcnROb0VvZihyZWFkZXIsIGJ1ZmZlciwgMCwgYnVmZmVyU2l6ZSwgYnVmZmVyUmVhZFN0YXJ0LCBmdW5jdGlvbihlcnIpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBmb3IgKHZhciBpID0gYnVmZmVyU2l6ZSAtIGVvY2RyV2l0aG91dENvbW1lbnRTaXplOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgaWYgKGJ1ZmZlci5yZWFkVUludDMyTEUoaSkgIT09IDB4MDYwNTRiNTApIGNvbnRpbnVlO1xuICAgICAgLy8gZm91bmQgZW9jZHJcbiAgICAgIHZhciBlb2NkckJ1ZmZlciA9IGJ1ZmZlci5zbGljZShpKTtcblxuICAgICAgLy8gMCAtIEVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBzaWduYXR1cmUgPSAweDA2MDU0YjUwXG4gICAgICAvLyA0IC0gTnVtYmVyIG9mIHRoaXMgZGlza1xuICAgICAgdmFyIGRpc2tOdW1iZXIgPSBlb2NkckJ1ZmZlci5yZWFkVUludDE2TEUoNCk7XG4gICAgICBpZiAoZGlza051bWJlciAhPT0gMCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwibXVsdGktZGlzayB6aXAgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQ6IGZvdW5kIGRpc2sgbnVtYmVyOiBcIiArIGRpc2tOdW1iZXIpKTtcbiAgICAgIH1cbiAgICAgIC8vIDYgLSBEaXNrIHdoZXJlIGNlbnRyYWwgZGlyZWN0b3J5IHN0YXJ0c1xuICAgICAgLy8gOCAtIE51bWJlciBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmRzIG9uIHRoaXMgZGlza1xuICAgICAgLy8gMTAgLSBUb3RhbCBudW1iZXIgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3Jkc1xuICAgICAgdmFyIGVudHJ5Q291bnQgPSBlb2NkckJ1ZmZlci5yZWFkVUludDE2TEUoMTApO1xuICAgICAgLy8gMTIgLSBTaXplIG9mIGNlbnRyYWwgZGlyZWN0b3J5IChieXRlcylcbiAgICAgIC8vIDE2IC0gT2Zmc2V0IG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5LCByZWxhdGl2ZSB0byBzdGFydCBvZiBhcmNoaXZlXG4gICAgICB2YXIgY2VudHJhbERpcmVjdG9yeU9mZnNldCA9IGVvY2RyQnVmZmVyLnJlYWRVSW50MzJMRSgxNik7XG4gICAgICAvLyAyMCAtIENvbW1lbnQgbGVuZ3RoXG4gICAgICB2YXIgY29tbWVudExlbmd0aCA9IGVvY2RyQnVmZmVyLnJlYWRVSW50MTZMRSgyMCk7XG4gICAgICB2YXIgZXhwZWN0ZWRDb21tZW50TGVuZ3RoID0gZW9jZHJCdWZmZXIubGVuZ3RoIC0gZW9jZHJXaXRob3V0Q29tbWVudFNpemU7XG4gICAgICBpZiAoY29tbWVudExlbmd0aCAhPT0gZXhwZWN0ZWRDb21tZW50TGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJpbnZhbGlkIGNvbW1lbnQgbGVuZ3RoLiBleHBlY3RlZDogXCIgKyBleHBlY3RlZENvbW1lbnRMZW5ndGggKyBcIi4gZm91bmQ6IFwiICsgY29tbWVudExlbmd0aCkpO1xuICAgICAgfVxuICAgICAgLy8gMjIgLSBDb21tZW50XG4gICAgICAvLyB0aGUgZW5jb2RpbmcgaXMgYWx3YXlzIGNwNDM3LlxuICAgICAgdmFyIGNvbW1lbnQgPSBkZWNvZGVTdHJpbmdzID8gZGVjb2RlQnVmZmVyKGVvY2RyQnVmZmVyLCAyMiwgZW9jZHJCdWZmZXIubGVuZ3RoLCBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVvY2RyQnVmZmVyLnNsaWNlKDIyKTtcblxuICAgICAgaWYgKCEoZW50cnlDb3VudCA9PT0gMHhmZmZmIHx8IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgPT09IDB4ZmZmZmZmZmYpKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBuZXcgWmlwRmlsZShyZWFkZXIsIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsIHRvdGFsU2l6ZSwgZW50cnlDb3VudCwgY29tbWVudCwgb3B0aW9ucy5hdXRvQ2xvc2UsIG9wdGlvbnMubGF6eUVudHJpZXMsIGRlY29kZVN0cmluZ3MsIG9wdGlvbnMudmFsaWRhdGVFbnRyeVNpemVzLCBvcHRpb25zLnN0cmljdEZpbGVOYW1lcykpO1xuICAgICAgfVxuXG4gICAgICAvLyBaSVA2NCBmb3JtYXRcblxuICAgICAgLy8gWklQNjQgWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3JcbiAgICAgIHZhciB6aXA2NEVvY2RsQnVmZmVyID0gbmV3QnVmZmVyKDIwKTtcbiAgICAgIHZhciB6aXA2NEVvY2RsT2Zmc2V0ID0gYnVmZmVyUmVhZFN0YXJ0ICsgaSAtIHppcDY0RW9jZGxCdWZmZXIubGVuZ3RoO1xuICAgICAgcmVhZEFuZEFzc2VydE5vRW9mKHJlYWRlciwgemlwNjRFb2NkbEJ1ZmZlciwgMCwgemlwNjRFb2NkbEJ1ZmZlci5sZW5ndGgsIHppcDY0RW9jZGxPZmZzZXQsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgICAgICAvLyAwIC0gemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyIGxvY2F0b3Igc2lnbmF0dXJlID0gMHgwNzA2NGI1MFxuICAgICAgICBpZiAoemlwNjRFb2NkbEJ1ZmZlci5yZWFkVUludDMyTEUoMCkgIT09IDB4MDcwNjRiNTApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiaW52YWxpZCB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciBzaWduYXR1cmVcIikpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDQgLSBudW1iZXIgb2YgdGhlIGRpc2sgd2l0aCB0aGUgc3RhcnQgb2YgdGhlIHppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeVxuICAgICAgICAvLyA4IC0gcmVsYXRpdmUgb2Zmc2V0IG9mIHRoZSB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkXG4gICAgICAgIHZhciB6aXA2NEVvY2RyT2Zmc2V0ID0gcmVhZFVJbnQ2NExFKHppcDY0RW9jZGxCdWZmZXIsIDgpO1xuICAgICAgICAvLyAxNiAtIHRvdGFsIG51bWJlciBvZiBkaXNrc1xuXG4gICAgICAgIC8vIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmRcbiAgICAgICAgdmFyIHppcDY0RW9jZHJCdWZmZXIgPSBuZXdCdWZmZXIoNTYpO1xuICAgICAgICByZWFkQW5kQXNzZXJ0Tm9Fb2YocmVhZGVyLCB6aXA2NEVvY2RyQnVmZmVyLCAwLCB6aXA2NEVvY2RyQnVmZmVyLmxlbmd0aCwgemlwNjRFb2Nkck9mZnNldCwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG5cbiAgICAgICAgICAvLyAwIC0gemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyIHNpZ25hdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXMgICgweDA2MDY0YjUwKVxuICAgICAgICAgIGlmICh6aXA2NEVvY2RyQnVmZmVyLnJlYWRVSW50MzJMRSgwKSAhPT0gMHgwNjA2NGI1MCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcImludmFsaWQgemlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCBzaWduYXR1cmVcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyA0IC0gc2l6ZSBvZiB6aXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICAgICAgICAgICAgICAgIDggYnl0ZXNcbiAgICAgICAgICAvLyAxMiAtIHZlcnNpb24gbWFkZSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgYnl0ZXNcbiAgICAgICAgICAvLyAxNCAtIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgYnl0ZXNcbiAgICAgICAgICAvLyAxNiAtIG51bWJlciBvZiB0aGlzIGRpc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgYnl0ZXNcbiAgICAgICAgICAvLyAyMCAtIG51bWJlciBvZiB0aGUgZGlzayB3aXRoIHRoZSBzdGFydCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgIDQgYnl0ZXNcbiAgICAgICAgICAvLyAyNCAtIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBvbiB0aGlzIGRpc2sgICAgICAgICA4IGJ5dGVzXG4gICAgICAgICAgLy8gMzIgLSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgICAgICAgICAgICA4IGJ5dGVzXG4gICAgICAgICAgZW50cnlDb3VudCA9IHJlYWRVSW50NjRMRSh6aXA2NEVvY2RyQnVmZmVyLCAzMik7XG4gICAgICAgICAgLy8gNDAgLSBzaXplIG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IGJ5dGVzXG4gICAgICAgICAgLy8gNDggLSBvZmZzZXQgb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3Rvcnkgd2l0aCByZXNwZWN0IHRvIHRoZSBzdGFydGluZyBkaXNrIG51bWJlciAgICAgOCBieXRlc1xuICAgICAgICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgPSByZWFkVUludDY0TEUoemlwNjRFb2NkckJ1ZmZlciwgNDgpO1xuICAgICAgICAgIC8vIDU2IC0gemlwNjQgZXh0ZW5zaWJsZSBkYXRhIHNlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhcmlhYmxlIHNpemUpXG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG5ldyBaaXBGaWxlKHJlYWRlciwgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgdG90YWxTaXplLCBlbnRyeUNvdW50LCBjb21tZW50LCBvcHRpb25zLmF1dG9DbG9zZSwgb3B0aW9ucy5sYXp5RW50cmllcywgZGVjb2RlU3RyaW5ncywgb3B0aW9ucy52YWxpZGF0ZUVudHJ5U2l6ZXMsIG9wdGlvbnMuc3RyaWN0RmlsZU5hbWVzKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxiYWNrKG5ldyBFcnJvcihcImVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgc2lnbmF0dXJlIG5vdCBmb3VuZFwiKSk7XG4gIH0pO1xufVxuXG51dGlsLmluaGVyaXRzKFppcEZpbGUsIEV2ZW50RW1pdHRlcik7XG5mdW5jdGlvbiBaaXBGaWxlKHJlYWRlciwgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgZmlsZVNpemUsIGVudHJ5Q291bnQsIGNvbW1lbnQsIGF1dG9DbG9zZSwgbGF6eUVudHJpZXMsIGRlY29kZVN0cmluZ3MsIHZhbGlkYXRlRW50cnlTaXplcywgc3RyaWN0RmlsZU5hbWVzKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgRXZlbnRFbWl0dGVyLmNhbGwoc2VsZik7XG4gIHNlbGYucmVhZGVyID0gcmVhZGVyO1xuICAvLyBmb3J3YXJkIGNsb3NlIGV2ZW50c1xuICBzZWxmLnJlYWRlci5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgIC8vIGVycm9yIGNsb3NpbmcgdGhlIGZkXG4gICAgZW1pdEVycm9yKHNlbGYsIGVycik7XG4gIH0pO1xuICBzZWxmLnJlYWRlci5vbmNlKFwiY2xvc2VcIiwgZnVuY3Rpb24oKSB7XG4gICAgc2VsZi5lbWl0KFwiY2xvc2VcIik7XG4gIH0pO1xuICBzZWxmLnJlYWRFbnRyeUN1cnNvciA9IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQ7XG4gIHNlbGYuZmlsZVNpemUgPSBmaWxlU2l6ZTtcbiAgc2VsZi5lbnRyeUNvdW50ID0gZW50cnlDb3VudDtcbiAgc2VsZi5jb21tZW50ID0gY29tbWVudDtcbiAgc2VsZi5lbnRyaWVzUmVhZCA9IDA7XG4gIHNlbGYuYXV0b0Nsb3NlID0gISFhdXRvQ2xvc2U7XG4gIHNlbGYubGF6eUVudHJpZXMgPSAhIWxhenlFbnRyaWVzO1xuICBzZWxmLmRlY29kZVN0cmluZ3MgPSAhIWRlY29kZVN0cmluZ3M7XG4gIHNlbGYudmFsaWRhdGVFbnRyeVNpemVzID0gISF2YWxpZGF0ZUVudHJ5U2l6ZXM7XG4gIHNlbGYuc3RyaWN0RmlsZU5hbWVzID0gISFzdHJpY3RGaWxlTmFtZXM7XG4gIHNlbGYuaXNPcGVuID0gdHJ1ZTtcbiAgc2VsZi5lbWl0dGVkRXJyb3IgPSBmYWxzZTtcblxuICBpZiAoIXNlbGYubGF6eUVudHJpZXMpIHNlbGYuX3JlYWRFbnRyeSgpO1xufVxuWmlwRmlsZS5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLmlzT3BlbikgcmV0dXJuO1xuICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICB0aGlzLnJlYWRlci51bnJlZigpO1xufTtcblxuZnVuY3Rpb24gZW1pdEVycm9yQW5kQXV0b0Nsb3NlKHNlbGYsIGVycikge1xuICBpZiAoc2VsZi5hdXRvQ2xvc2UpIHNlbGYuY2xvc2UoKTtcbiAgZW1pdEVycm9yKHNlbGYsIGVycik7XG59XG5mdW5jdGlvbiBlbWl0RXJyb3Ioc2VsZiwgZXJyKSB7XG4gIGlmIChzZWxmLmVtaXR0ZWRFcnJvcikgcmV0dXJuO1xuICBzZWxmLmVtaXR0ZWRFcnJvciA9IHRydWU7XG4gIHNlbGYuZW1pdChcImVycm9yXCIsIGVycik7XG59XG5cblppcEZpbGUucHJvdG90eXBlLnJlYWRFbnRyeSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMubGF6eUVudHJpZXMpIHRocm93IG5ldyBFcnJvcihcInJlYWRFbnRyeSgpIGNhbGxlZCB3aXRob3V0IGxhenlFbnRyaWVzOnRydWVcIik7XG4gIHRoaXMuX3JlYWRFbnRyeSgpO1xufTtcblppcEZpbGUucHJvdG90eXBlLl9yZWFkRW50cnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoc2VsZi5lbnRyeUNvdW50ID09PSBzZWxmLmVudHJpZXNSZWFkKSB7XG4gICAgLy8gZG9uZSB3aXRoIG1ldGFkYXRhXG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuYXV0b0Nsb3NlKSBzZWxmLmNsb3NlKCk7XG4gICAgICBpZiAoc2VsZi5lbWl0dGVkRXJyb3IpIHJldHVybjtcbiAgICAgIHNlbGYuZW1pdChcImVuZFwiKTtcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHNlbGYuZW1pdHRlZEVycm9yKSByZXR1cm47XG4gIHZhciBidWZmZXIgPSBuZXdCdWZmZXIoNDYpO1xuICByZWFkQW5kQXNzZXJ0Tm9Fb2Yoc2VsZi5yZWFkZXIsIGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgc2VsZi5yZWFkRW50cnlDdXJzb3IsIGZ1bmN0aW9uKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgZXJyKTtcbiAgICBpZiAoc2VsZi5lbWl0dGVkRXJyb3IpIHJldHVybjtcbiAgICB2YXIgZW50cnkgPSBuZXcgRW50cnkoKTtcbiAgICAvLyAwIC0gQ2VudHJhbCBkaXJlY3RvcnkgZmlsZSBoZWFkZXIgc2lnbmF0dXJlXG4gICAgdmFyIHNpZ25hdHVyZSA9IGJ1ZmZlci5yZWFkVUludDMyTEUoMCk7XG4gICAgaWYgKHNpZ25hdHVyZSAhPT0gMHgwMjAxNGI1MCkgcmV0dXJuIGVtaXRFcnJvckFuZEF1dG9DbG9zZShzZWxmLCBuZXcgRXJyb3IoXCJpbnZhbGlkIGNlbnRyYWwgZGlyZWN0b3J5IGZpbGUgaGVhZGVyIHNpZ25hdHVyZTogMHhcIiArIHNpZ25hdHVyZS50b1N0cmluZygxNikpKTtcbiAgICAvLyA0IC0gVmVyc2lvbiBtYWRlIGJ5XG4gICAgZW50cnkudmVyc2lvbk1hZGVCeSA9IGJ1ZmZlci5yZWFkVUludDE2TEUoNCk7XG4gICAgLy8gNiAtIFZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgKG1pbmltdW0pXG4gICAgZW50cnkudmVyc2lvbk5lZWRlZFRvRXh0cmFjdCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoNik7XG4gICAgLy8gOCAtIEdlbmVyYWwgcHVycG9zZSBiaXQgZmxhZ1xuICAgIGVudHJ5LmdlbmVyYWxQdXJwb3NlQml0RmxhZyA9IGJ1ZmZlci5yZWFkVUludDE2TEUoOCk7XG4gICAgLy8gMTAgLSBDb21wcmVzc2lvbiBtZXRob2RcbiAgICBlbnRyeS5jb21wcmVzc2lvbk1ldGhvZCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoMTApO1xuICAgIC8vIDEyIC0gRmlsZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lXG4gICAgZW50cnkubGFzdE1vZEZpbGVUaW1lID0gYnVmZmVyLnJlYWRVSW50MTZMRSgxMik7XG4gICAgLy8gMTQgLSBGaWxlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGVcbiAgICBlbnRyeS5sYXN0TW9kRmlsZURhdGUgPSBidWZmZXIucmVhZFVJbnQxNkxFKDE0KTtcbiAgICAvLyAxNiAtIENSQy0zMlxuICAgIGVudHJ5LmNyYzMyID0gYnVmZmVyLnJlYWRVSW50MzJMRSgxNik7XG4gICAgLy8gMjAgLSBDb21wcmVzc2VkIHNpemVcbiAgICBlbnRyeS5jb21wcmVzc2VkU2l6ZSA9IGJ1ZmZlci5yZWFkVUludDMyTEUoMjApO1xuICAgIC8vIDI0IC0gVW5jb21wcmVzc2VkIHNpemVcbiAgICBlbnRyeS51bmNvbXByZXNzZWRTaXplID0gYnVmZmVyLnJlYWRVSW50MzJMRSgyNCk7XG4gICAgLy8gMjggLSBGaWxlIG5hbWUgbGVuZ3RoIChuKVxuICAgIGVudHJ5LmZpbGVOYW1lTGVuZ3RoID0gYnVmZmVyLnJlYWRVSW50MTZMRSgyOCk7XG4gICAgLy8gMzAgLSBFeHRyYSBmaWVsZCBsZW5ndGggKG0pXG4gICAgZW50cnkuZXh0cmFGaWVsZExlbmd0aCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoMzApO1xuICAgIC8vIDMyIC0gRmlsZSBjb21tZW50IGxlbmd0aCAoaylcbiAgICBlbnRyeS5maWxlQ29tbWVudExlbmd0aCA9IGJ1ZmZlci5yZWFkVUludDE2TEUoMzIpO1xuICAgIC8vIDM0IC0gRGlzayBudW1iZXIgd2hlcmUgZmlsZSBzdGFydHNcbiAgICAvLyAzNiAtIEludGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgIGVudHJ5LmludGVybmFsRmlsZUF0dHJpYnV0ZXMgPSBidWZmZXIucmVhZFVJbnQxNkxFKDM2KTtcbiAgICAvLyAzOCAtIEV4dGVybmFsIGZpbGUgYXR0cmlidXRlc1xuICAgIGVudHJ5LmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSBidWZmZXIucmVhZFVJbnQzMkxFKDM4KTtcbiAgICAvLyA0MiAtIFJlbGF0aXZlIG9mZnNldCBvZiBsb2NhbCBmaWxlIGhlYWRlclxuICAgIGVudHJ5LnJlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciA9IGJ1ZmZlci5yZWFkVUludDMyTEUoNDIpO1xuXG4gICAgaWYgKGVudHJ5LmdlbmVyYWxQdXJwb3NlQml0RmxhZyAmIDB4NDApIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwic3Ryb25nIGVuY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZFwiKSk7XG5cbiAgICBzZWxmLnJlYWRFbnRyeUN1cnNvciArPSA0NjtcblxuICAgIGJ1ZmZlciA9IG5ld0J1ZmZlcihlbnRyeS5maWxlTmFtZUxlbmd0aCArIGVudHJ5LmV4dHJhRmllbGRMZW5ndGggKyBlbnRyeS5maWxlQ29tbWVudExlbmd0aCk7XG4gICAgcmVhZEFuZEFzc2VydE5vRW9mKHNlbGYucmVhZGVyLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIHNlbGYucmVhZEVudHJ5Q3Vyc29yLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgZXJyKTtcbiAgICAgIGlmIChzZWxmLmVtaXR0ZWRFcnJvcikgcmV0dXJuO1xuICAgICAgLy8gNDYgLSBGaWxlIG5hbWVcbiAgICAgIHZhciBpc1V0ZjggPSAoZW50cnkuZ2VuZXJhbFB1cnBvc2VCaXRGbGFnICYgMHg4MDApICE9PSAwO1xuICAgICAgZW50cnkuZmlsZU5hbWUgPSBzZWxmLmRlY29kZVN0cmluZ3MgPyBkZWNvZGVCdWZmZXIoYnVmZmVyLCAwLCBlbnRyeS5maWxlTmFtZUxlbmd0aCwgaXNVdGY4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBidWZmZXIuc2xpY2UoMCwgZW50cnkuZmlsZU5hbWVMZW5ndGgpO1xuXG4gICAgICAvLyA0NituIC0gRXh0cmEgZmllbGRcbiAgICAgIHZhciBmaWxlQ29tbWVudFN0YXJ0ID0gZW50cnkuZmlsZU5hbWVMZW5ndGggKyBlbnRyeS5leHRyYUZpZWxkTGVuZ3RoO1xuICAgICAgdmFyIGV4dHJhRmllbGRCdWZmZXIgPSBidWZmZXIuc2xpY2UoZW50cnkuZmlsZU5hbWVMZW5ndGgsIGZpbGVDb21tZW50U3RhcnQpO1xuICAgICAgZW50cnkuZXh0cmFGaWVsZHMgPSBbXTtcbiAgICAgIHZhciBpID0gMDtcbiAgICAgIHdoaWxlIChpIDwgZXh0cmFGaWVsZEJ1ZmZlci5sZW5ndGggLSAzKSB7XG4gICAgICAgIHZhciBoZWFkZXJJZCA9IGV4dHJhRmllbGRCdWZmZXIucmVhZFVJbnQxNkxFKGkgKyAwKTtcbiAgICAgICAgdmFyIGRhdGFTaXplID0gZXh0cmFGaWVsZEJ1ZmZlci5yZWFkVUludDE2TEUoaSArIDIpO1xuICAgICAgICB2YXIgZGF0YVN0YXJ0ID0gaSArIDQ7XG4gICAgICAgIHZhciBkYXRhRW5kID0gZGF0YVN0YXJ0ICsgZGF0YVNpemU7XG4gICAgICAgIGlmIChkYXRhRW5kID4gZXh0cmFGaWVsZEJ1ZmZlci5sZW5ndGgpIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwiZXh0cmEgZmllbGQgbGVuZ3RoIGV4Y2VlZHMgZXh0cmEgZmllbGQgYnVmZmVyIHNpemVcIikpO1xuICAgICAgICB2YXIgZGF0YUJ1ZmZlciA9IG5ld0J1ZmZlcihkYXRhU2l6ZSk7XG4gICAgICAgIGV4dHJhRmllbGRCdWZmZXIuY29weShkYXRhQnVmZmVyLCAwLCBkYXRhU3RhcnQsIGRhdGFFbmQpO1xuICAgICAgICBlbnRyeS5leHRyYUZpZWxkcy5wdXNoKHtcbiAgICAgICAgICBpZDogaGVhZGVySWQsXG4gICAgICAgICAgZGF0YTogZGF0YUJ1ZmZlcixcbiAgICAgICAgfSk7XG4gICAgICAgIGkgPSBkYXRhRW5kO1xuICAgICAgfVxuXG4gICAgICAvLyA0NituK20gLSBGaWxlIGNvbW1lbnRcbiAgICAgIGVudHJ5LmZpbGVDb21tZW50ID0gc2VsZi5kZWNvZGVTdHJpbmdzID8gZGVjb2RlQnVmZmVyKGJ1ZmZlciwgZmlsZUNvbW1lbnRTdGFydCwgZmlsZUNvbW1lbnRTdGFydCArIGVudHJ5LmZpbGVDb21tZW50TGVuZ3RoLCBpc1V0ZjgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJ1ZmZlci5zbGljZShmaWxlQ29tbWVudFN0YXJ0LCBmaWxlQ29tbWVudFN0YXJ0ICsgZW50cnkuZmlsZUNvbW1lbnRMZW5ndGgpO1xuICAgICAgLy8gY29tcGF0aWJpbGl0eSBoYWNrIGZvciBodHRwczovL2dpdGh1Yi5jb20vdGhlam9zaHdvbGZlL3lhdXpsL2lzc3Vlcy80N1xuICAgICAgZW50cnkuY29tbWVudCA9IGVudHJ5LmZpbGVDb21tZW50O1xuXG4gICAgICBzZWxmLnJlYWRFbnRyeUN1cnNvciArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgc2VsZi5lbnRyaWVzUmVhZCArPSAxO1xuXG4gICAgICBpZiAoZW50cnkudW5jb21wcmVzc2VkU2l6ZSAgICAgICAgICAgID09PSAweGZmZmZmZmZmIHx8XG4gICAgICAgICAgZW50cnkuY29tcHJlc3NlZFNpemUgICAgICAgICAgICAgID09PSAweGZmZmZmZmZmIHx8XG4gICAgICAgICAgZW50cnkucmVsYXRpdmVPZmZzZXRPZkxvY2FsSGVhZGVyID09PSAweGZmZmZmZmZmKSB7XG4gICAgICAgIC8vIFpJUDY0IGZvcm1hdFxuICAgICAgICAvLyBmaW5kIHRoZSBaaXA2NCBFeHRlbmRlZCBJbmZvcm1hdGlvbiBFeHRyYSBGaWVsZFxuICAgICAgICB2YXIgemlwNjRFaWVmQnVmZmVyID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyeS5leHRyYUZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBleHRyYUZpZWxkID0gZW50cnkuZXh0cmFGaWVsZHNbaV07XG4gICAgICAgICAgaWYgKGV4dHJhRmllbGQuaWQgPT09IDB4MDAwMSkge1xuICAgICAgICAgICAgemlwNjRFaWVmQnVmZmVyID0gZXh0cmFGaWVsZC5kYXRhO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh6aXA2NEVpZWZCdWZmZXIgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwiZXhwZWN0ZWQgemlwNjQgZXh0ZW5kZWQgaW5mb3JtYXRpb24gZXh0cmEgZmllbGRcIikpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICAgIC8vIDAgLSBPcmlnaW5hbCBTaXplICAgICAgICAgIDggYnl0ZXNcbiAgICAgICAgaWYgKGVudHJ5LnVuY29tcHJlc3NlZFNpemUgPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgICBpZiAoaW5kZXggKyA4ID4gemlwNjRFaWVmQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRFcnJvckFuZEF1dG9DbG9zZShzZWxmLCBuZXcgRXJyb3IoXCJ6aXA2NCBleHRlbmRlZCBpbmZvcm1hdGlvbiBleHRyYSBmaWVsZCBkb2VzIG5vdCBpbmNsdWRlIHVuY29tcHJlc3NlZCBzaXplXCIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZW50cnkudW5jb21wcmVzc2VkU2l6ZSA9IHJlYWRVSW50NjRMRSh6aXA2NEVpZWZCdWZmZXIsIGluZGV4KTtcbiAgICAgICAgICBpbmRleCArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vIDggLSBDb21wcmVzc2VkIFNpemUgICAgICAgIDggYnl0ZXNcbiAgICAgICAgaWYgKGVudHJ5LmNvbXByZXNzZWRTaXplID09PSAweGZmZmZmZmZmKSB7XG4gICAgICAgICAgaWYgKGluZGV4ICsgOCA+IHppcDY0RWllZkJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbWl0RXJyb3JBbmRBdXRvQ2xvc2Uoc2VsZiwgbmV3IEVycm9yKFwiemlwNjQgZXh0ZW5kZWQgaW5mb3JtYXRpb24gZXh0cmEgZmllbGQgZG9lcyBub3QgaW5jbHVkZSBjb21wcmVzc2VkIHNpemVcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbnRyeS5jb21wcmVzc2VkU2l6ZSA9IHJlYWRVSW50NjRMRSh6aXA2NEVpZWZCdWZmZXIsIGluZGV4KTtcbiAgICAgICAgICBpbmRleCArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vIDE2IC0gUmVsYXRpdmUgSGVhZGVyIE9mZnNldCA4IGJ5dGVzXG4gICAgICAgIGlmIChlbnRyeS5yZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgPT09IDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgICBpZiAoaW5kZXggKyA4ID4gemlwNjRFaWVmQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRFcnJvckFuZEF1dG9DbG9zZShzZWxmLCBuZXcgRXJyb3IoXCJ6aXA2NCBleHRlbmRlZCBpbmZvcm1hdGlvbiBleHRyYSBmaWVsZCBkb2VzIG5vdCBpbmNsdWRlIHJlbGF0aXZlIGhlYWRlciBvZmZzZXRcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbnRyeS5yZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgPSByZWFkVUludDY0TEUoemlwNjRFaWVmQnVmZmVyLCBpbmRleCk7XG4gICAgICAgICAgaW5kZXggKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLyAyNCAtIERpc2sgU3RhcnQgTnVtYmVyICAgICAgNCBieXRlc1xuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBmb3IgSW5mby1aSVAgVW5pY29kZSBQYXRoIEV4dHJhIEZpZWxkICgweDcwNzUpXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RoZWpvc2h3b2xmZS95YXV6bC9pc3N1ZXMvMzNcbiAgICAgIGlmIChzZWxmLmRlY29kZVN0cmluZ3MpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyeS5leHRyYUZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBleHRyYUZpZWxkID0gZW50cnkuZXh0cmFGaWVsZHNbaV07XG4gICAgICAgICAgaWYgKGV4dHJhRmllbGQuaWQgPT09IDB4NzA3NSkge1xuICAgICAgICAgICAgaWYgKGV4dHJhRmllbGQuZGF0YS5sZW5ndGggPCA2KSB7XG4gICAgICAgICAgICAgIC8vIHRvbyBzaG9ydCB0byBiZSBtZWFuaW5nZnVsXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVmVyc2lvbiAgICAgICAxIGJ5dGUgICAgICB2ZXJzaW9uIG9mIHRoaXMgZXh0cmEgZmllbGQsIGN1cnJlbnRseSAxXG4gICAgICAgICAgICBpZiAoZXh0cmFGaWVsZC5kYXRhLnJlYWRVSW50OCgwKSAhPT0gMSkge1xuICAgICAgICAgICAgICAvLyA+IENoYW5nZXMgbWF5IG5vdCBiZSBiYWNrd2FyZCBjb21wYXRpYmxlIHNvIHRoaXMgZXh0cmFcbiAgICAgICAgICAgICAgLy8gPiBmaWVsZCBzaG91bGQgbm90IGJlIHVzZWQgaWYgdGhlIHZlcnNpb24gaXMgbm90IHJlY29nbml6ZWQuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTmFtZUNSQzMyICAgICA0IGJ5dGVzICAgICBGaWxlIE5hbWUgRmllbGQgQ1JDMzIgQ2hlY2tzdW1cbiAgICAgICAgICAgIHZhciBvbGROYW1lQ3JjMzIgPSBleHRyYUZpZWxkLmRhdGEucmVhZFVJbnQzMkxFKDEpO1xuICAgICAgICAgICAgaWYgKGNyYzMyLnVuc2lnbmVkKGJ1ZmZlci5zbGljZSgwLCBlbnRyeS5maWxlTmFtZUxlbmd0aCkpICE9PSBvbGROYW1lQ3JjMzIpIHtcbiAgICAgICAgICAgICAgLy8gPiBJZiB0aGUgQ1JDIGNoZWNrIGZhaWxzLCB0aGlzIFVURi04IFBhdGggRXh0cmEgRmllbGQgc2hvdWxkIGJlXG4gICAgICAgICAgICAgIC8vID4gaWdub3JlZCBhbmQgdGhlIEZpbGUgTmFtZSBmaWVsZCBpbiB0aGUgaGVhZGVyIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVW5pY29kZU5hbWUgICBWYXJpYWJsZSAgICBVVEYtOCB2ZXJzaW9uIG9mIHRoZSBlbnRyeSBGaWxlIE5hbWVcbiAgICAgICAgICAgIGVudHJ5LmZpbGVOYW1lID0gZGVjb2RlQnVmZmVyKGV4dHJhRmllbGQuZGF0YSwgNSwgZXh0cmFGaWVsZC5kYXRhLmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWRhdGUgZmlsZSBzaXplXG4gICAgICBpZiAoc2VsZi52YWxpZGF0ZUVudHJ5U2l6ZXMgJiYgZW50cnkuY29tcHJlc3Npb25NZXRob2QgPT09IDApIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ29tcHJlc3NlZFNpemUgPSBlbnRyeS51bmNvbXByZXNzZWRTaXplO1xuICAgICAgICBpZiAoZW50cnkuaXNFbmNyeXB0ZWQoKSkge1xuICAgICAgICAgIC8vIHRyYWRpdGlvbmFsIGVuY3J5cHRpb24gcHJlZml4ZXMgdGhlIGZpbGUgZGF0YSB3aXRoIGEgaGVhZGVyXG4gICAgICAgICAgZXhwZWN0ZWRDb21wcmVzc2VkU2l6ZSArPSAxMjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuY29tcHJlc3NlZFNpemUgIT09IGV4cGVjdGVkQ29tcHJlc3NlZFNpemUpIHtcbiAgICAgICAgICB2YXIgbXNnID0gXCJjb21wcmVzc2VkL3VuY29tcHJlc3NlZCBzaXplIG1pc21hdGNoIGZvciBzdG9yZWQgZmlsZTogXCIgKyBlbnRyeS5jb21wcmVzc2VkU2l6ZSArIFwiICE9IFwiICsgZW50cnkudW5jb21wcmVzc2VkU2l6ZTtcbiAgICAgICAgICByZXR1cm4gZW1pdEVycm9yQW5kQXV0b0Nsb3NlKHNlbGYsIG5ldyBFcnJvcihtc2cpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZi5kZWNvZGVTdHJpbmdzKSB7XG4gICAgICAgIGlmICghc2VsZi5zdHJpY3RGaWxlTmFtZXMpIHtcbiAgICAgICAgICAvLyBhbGxvdyBiYWNrc2xhc2hcbiAgICAgICAgICBlbnRyeS5maWxlTmFtZSA9IGVudHJ5LmZpbGVOYW1lLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSB2YWxpZGF0ZUZpbGVOYW1lKGVudHJ5LmZpbGVOYW1lLCBzZWxmLnZhbGlkYXRlRmlsZU5hbWVPcHRpb25zKTtcbiAgICAgICAgaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSByZXR1cm4gZW1pdEVycm9yQW5kQXV0b0Nsb3NlKHNlbGYsIG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICAgIH1cbiAgICAgIHNlbGYuZW1pdChcImVudHJ5XCIsIGVudHJ5KTtcblxuICAgICAgaWYgKCFzZWxmLmxhenlFbnRyaWVzKSBzZWxmLl9yZWFkRW50cnkoKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5aaXBGaWxlLnByb3RvdHlwZS5vcGVuUmVhZFN0cmVhbSA9IGZ1bmN0aW9uKGVudHJ5LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIC8vIHBhcmFtZXRlciB2YWxpZGF0aW9uXG4gIHZhciByZWxhdGl2ZVN0YXJ0ID0gMDtcbiAgdmFyIHJlbGF0aXZlRW5kID0gZW50cnkuY29tcHJlc3NlZFNpemU7XG4gIGlmIChjYWxsYmFjayA9PSBudWxsKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfSBlbHNlIHtcbiAgICAvLyB2YWxpZGF0ZSBvcHRpb25zIHRoYXQgdGhlIGNhbGxlciBoYXMgbm8gZXhjdXNlIHRvIGdldCB3cm9uZ1xuICAgIGlmIChvcHRpb25zLmRlY3J5cHQgIT0gbnVsbCkge1xuICAgICAgaWYgKCFlbnRyeS5pc0VuY3J5cHRlZCgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMuZGVjcnlwdCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGVuY3J5cHRlZCBlbnRyaWVzXCIpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZGVjcnlwdCAhPT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgb3B0aW9ucy5kZWNyeXB0IHZhbHVlOiBcIiArIG9wdGlvbnMuZGVjcnlwdCk7XG4gICAgICBpZiAoZW50cnkuaXNDb21wcmVzc2VkKCkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGVjb21wcmVzcyAhPT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcihcImVudHJ5IGlzIGVuY3J5cHRlZCBhbmQgY29tcHJlc3NlZCwgYW5kIG9wdGlvbnMuZGVjb21wcmVzcyAhPT0gZmFsc2VcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmRlY29tcHJlc3MgIT0gbnVsbCkge1xuICAgICAgaWYgKCFlbnRyeS5pc0NvbXByZXNzZWQoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLmRlY29tcHJlc3MgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBjb21wcmVzc2VkIGVudHJpZXNcIik7XG4gICAgICB9XG4gICAgICBpZiAoIShvcHRpb25zLmRlY29tcHJlc3MgPT09IGZhbHNlIHx8IG9wdGlvbnMuZGVjb21wcmVzcyA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvcHRpb25zLmRlY29tcHJlc3MgdmFsdWU6IFwiICsgb3B0aW9ucy5kZWNvbXByZXNzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc3RhcnQgIT0gbnVsbCB8fCBvcHRpb25zLmVuZCAhPSBudWxsKSB7XG4gICAgICBpZiAoZW50cnkuaXNDb21wcmVzc2VkKCkgJiYgb3B0aW9ucy5kZWNvbXByZXNzICE9PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydC9lbmQgcmFuZ2Ugbm90IGFsbG93ZWQgZm9yIGNvbXByZXNzZWQgZW50cnkgd2l0aG91dCBvcHRpb25zLmRlY29tcHJlc3MgPT09IGZhbHNlXCIpO1xuICAgICAgfVxuICAgICAgaWYgKGVudHJ5LmlzRW5jcnlwdGVkKCkgJiYgb3B0aW9ucy5kZWNyeXB0ICE9PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydC9lbmQgcmFuZ2Ugbm90IGFsbG93ZWQgZm9yIGVuY3J5cHRlZCBlbnRyeSB3aXRob3V0IG9wdGlvbnMuZGVjcnlwdCA9PT0gZmFsc2VcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnN0YXJ0ICE9IG51bGwpIHtcbiAgICAgIHJlbGF0aXZlU3RhcnQgPSBvcHRpb25zLnN0YXJ0O1xuICAgICAgaWYgKHJlbGF0aXZlU3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLnN0YXJ0IDwgMFwiKTtcbiAgICAgIGlmIChyZWxhdGl2ZVN0YXJ0ID4gZW50cnkuY29tcHJlc3NlZFNpemUpIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMuc3RhcnQgPiBlbnRyeS5jb21wcmVzc2VkU2l6ZVwiKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZW5kICE9IG51bGwpIHtcbiAgICAgIHJlbGF0aXZlRW5kID0gb3B0aW9ucy5lbmQ7XG4gICAgICBpZiAocmVsYXRpdmVFbmQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zLmVuZCA8IDBcIik7XG4gICAgICBpZiAocmVsYXRpdmVFbmQgPiBlbnRyeS5jb21wcmVzc2VkU2l6ZSkgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucy5lbmQgPiBlbnRyeS5jb21wcmVzc2VkU2l6ZVwiKTtcbiAgICAgIGlmIChyZWxhdGl2ZUVuZCA8IHJlbGF0aXZlU3RhcnQpIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMuZW5kIDwgb3B0aW9ucy5zdGFydFwiKTtcbiAgICB9XG4gIH1cbiAgLy8gYW55IGZ1cnRoZXIgZXJyb3JzIGNhbiBlaXRoZXIgYmUgY2F1c2VkIGJ5IHRoZSB6aXBmaWxlLFxuICAvLyBvciB3ZXJlIGludHJvZHVjZWQgaW4gYSBtaW5vciB2ZXJzaW9uIG9mIHlhdXpsLFxuICAvLyBzbyBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBjbGllbnQgcmF0aGVyIHRoYW4gdGhyb3duLlxuICBpZiAoIXNlbGYuaXNPcGVuKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiY2xvc2VkXCIpKTtcbiAgaWYgKGVudHJ5LmlzRW5jcnlwdGVkKCkpIHtcbiAgICBpZiAob3B0aW9ucy5kZWNyeXB0ICE9PSBmYWxzZSkgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcImVudHJ5IGlzIGVuY3J5cHRlZCwgYW5kIG9wdGlvbnMuZGVjcnlwdCAhPT0gZmFsc2VcIikpO1xuICB9XG4gIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBsb3NlIHRoZSBmZCBiZWZvcmUgd2Ugb3BlbiB0aGUgYWN0dWFsIHJlYWQgc3RyZWFtXG4gIHNlbGYucmVhZGVyLnJlZigpO1xuICB2YXIgYnVmZmVyID0gbmV3QnVmZmVyKDMwKTtcbiAgcmVhZEFuZEFzc2VydE5vRW9mKHNlbGYucmVhZGVyLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIGVudHJ5LnJlbGF0aXZlT2Zmc2V0T2ZMb2NhbEhlYWRlciwgZnVuY3Rpb24oZXJyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgLy8gMCAtIExvY2FsIGZpbGUgaGVhZGVyIHNpZ25hdHVyZSA9IDB4MDQwMzRiNTBcbiAgICAgIHZhciBzaWduYXR1cmUgPSBidWZmZXIucmVhZFVJbnQzMkxFKDApO1xuICAgICAgaWYgKHNpZ25hdHVyZSAhPT0gMHgwNDAzNGI1MCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiaW52YWxpZCBsb2NhbCBmaWxlIGhlYWRlciBzaWduYXR1cmU6IDB4XCIgKyBzaWduYXR1cmUudG9TdHJpbmcoMTYpKSk7XG4gICAgICB9XG4gICAgICAvLyBhbGwgdGhpcyBzaG91bGQgYmUgcmVkdW5kYW50XG4gICAgICAvLyA0IC0gVmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCAobWluaW11bSlcbiAgICAgIC8vIDYgLSBHZW5lcmFsIHB1cnBvc2UgYml0IGZsYWdcbiAgICAgIC8vIDggLSBDb21wcmVzc2lvbiBtZXRob2RcbiAgICAgIC8vIDEwIC0gRmlsZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lXG4gICAgICAvLyAxMiAtIEZpbGUgbGFzdCBtb2RpZmljYXRpb24gZGF0ZVxuICAgICAgLy8gMTQgLSBDUkMtMzJcbiAgICAgIC8vIDE4IC0gQ29tcHJlc3NlZCBzaXplXG4gICAgICAvLyAyMiAtIFVuY29tcHJlc3NlZCBzaXplXG4gICAgICAvLyAyNiAtIEZpbGUgbmFtZSBsZW5ndGggKG4pXG4gICAgICB2YXIgZmlsZU5hbWVMZW5ndGggPSBidWZmZXIucmVhZFVJbnQxNkxFKDI2KTtcbiAgICAgIC8vIDI4IC0gRXh0cmEgZmllbGQgbGVuZ3RoIChtKVxuICAgICAgdmFyIGV4dHJhRmllbGRMZW5ndGggPSBidWZmZXIucmVhZFVJbnQxNkxFKDI4KTtcbiAgICAgIC8vIDMwIC0gRmlsZSBuYW1lXG4gICAgICAvLyAzMCtuIC0gRXh0cmEgZmllbGRcbiAgICAgIHZhciBsb2NhbEZpbGVIZWFkZXJFbmQgPSBlbnRyeS5yZWxhdGl2ZU9mZnNldE9mTG9jYWxIZWFkZXIgKyBidWZmZXIubGVuZ3RoICsgZmlsZU5hbWVMZW5ndGggKyBleHRyYUZpZWxkTGVuZ3RoO1xuICAgICAgdmFyIGRlY29tcHJlc3M7XG4gICAgICBpZiAoZW50cnkuY29tcHJlc3Npb25NZXRob2QgPT09IDApIHtcbiAgICAgICAgLy8gMCAtIFRoZSBmaWxlIGlzIHN0b3JlZCAobm8gY29tcHJlc3Npb24pXG4gICAgICAgIGRlY29tcHJlc3MgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkuY29tcHJlc3Npb25NZXRob2QgPT09IDgpIHtcbiAgICAgICAgLy8gOCAtIFRoZSBmaWxlIGlzIERlZmxhdGVkXG4gICAgICAgIGRlY29tcHJlc3MgPSBvcHRpb25zLmRlY29tcHJlc3MgIT0gbnVsbCA/IG9wdGlvbnMuZGVjb21wcmVzcyA6IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kOiBcIiArIGVudHJ5LmNvbXByZXNzaW9uTWV0aG9kKSk7XG4gICAgICB9XG4gICAgICB2YXIgZmlsZURhdGFTdGFydCA9IGxvY2FsRmlsZUhlYWRlckVuZDtcbiAgICAgIHZhciBmaWxlRGF0YUVuZCA9IGZpbGVEYXRhU3RhcnQgKyBlbnRyeS5jb21wcmVzc2VkU2l6ZTtcbiAgICAgIGlmIChlbnRyeS5jb21wcmVzc2VkU2l6ZSAhPT0gMCkge1xuICAgICAgICAvLyBib3VuZHMgY2hlY2sgbm93LCBiZWNhdXNlIHRoZSByZWFkIHN0cmVhbXMgd2lsbCBwcm9iYWJseSBub3QgY29tcGxhaW4gbG91ZCBlbm91Z2guXG4gICAgICAgIC8vIHNpbmNlIHdlJ3JlIGRlYWxpbmcgd2l0aCBhbiB1bnNpZ25lZCBvZmZzZXQgcGx1cyBhbiB1bnNpZ25lZCBzaXplLFxuICAgICAgICAvLyB3ZSBvbmx5IGhhdmUgMSB0aGluZyB0byBjaGVjayBmb3IuXG4gICAgICAgIGlmIChmaWxlRGF0YUVuZCA+IHNlbGYuZmlsZVNpemUpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiZmlsZSBkYXRhIG92ZXJmbG93cyBmaWxlIGJvdW5kczogXCIgK1xuICAgICAgICAgICAgICBmaWxlRGF0YVN0YXJ0ICsgXCIgKyBcIiArIGVudHJ5LmNvbXByZXNzZWRTaXplICsgXCIgPiBcIiArIHNlbGYuZmlsZVNpemUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHJlYWRTdHJlYW0gPSBzZWxmLnJlYWRlci5jcmVhdGVSZWFkU3RyZWFtKHtcbiAgICAgICAgc3RhcnQ6IGZpbGVEYXRhU3RhcnQgKyByZWxhdGl2ZVN0YXJ0LFxuICAgICAgICBlbmQ6IGZpbGVEYXRhU3RhcnQgKyByZWxhdGl2ZUVuZCxcbiAgICAgIH0pO1xuICAgICAgdmFyIGVuZHBvaW50U3RyZWFtID0gcmVhZFN0cmVhbTtcbiAgICAgIGlmIChkZWNvbXByZXNzKSB7XG4gICAgICAgIHZhciBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGluZmxhdGVGaWx0ZXIgPSB6bGliLmNyZWF0ZUluZmxhdGVSYXcoKTtcbiAgICAgICAgcmVhZFN0cmVhbS5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIC8vIHNldEltbWVkaWF0ZSBoZXJlIGJlY2F1c2UgZXJyb3JzIGNhbiBiZSBlbWl0dGVkIGR1cmluZyB0aGUgZmlyc3QgY2FsbCB0byBwaXBlKClcbiAgICAgICAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoIWRlc3Ryb3llZCkgaW5mbGF0ZUZpbHRlci5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRTdHJlYW0ucGlwZShpbmZsYXRlRmlsdGVyKTtcblxuICAgICAgICBpZiAoc2VsZi52YWxpZGF0ZUVudHJ5U2l6ZXMpIHtcbiAgICAgICAgICBlbmRwb2ludFN0cmVhbSA9IG5ldyBBc3NlcnRCeXRlQ291bnRTdHJlYW0oZW50cnkudW5jb21wcmVzc2VkU2l6ZSk7XG4gICAgICAgICAgaW5mbGF0ZUZpbHRlci5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgLy8gZm9yd2FyZCB6bGliIGVycm9ycyB0byB0aGUgY2xpZW50LXZpc2libGUgc3RyZWFtXG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmICghZGVzdHJveWVkKSBlbmRwb2ludFN0cmVhbS5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGluZmxhdGVGaWx0ZXIucGlwZShlbmRwb2ludFN0cmVhbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhlIHpsaWIgZmlsdGVyIGlzIHRoZSBjbGllbnQtdmlzaWJsZSBzdHJlYW1cbiAgICAgICAgICBlbmRwb2ludFN0cmVhbSA9IGluZmxhdGVGaWx0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcyBpcyBwYXJ0IG9mIHlhdXpsJ3MgQVBJLCBzbyBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBvbiB0aGUgY2xpZW50LXZpc2libGUgc3RyZWFtXG4gICAgICAgIGVuZHBvaW50U3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBkZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChpbmZsYXRlRmlsdGVyICE9PSBlbmRwb2ludFN0cmVhbSkgaW5mbGF0ZUZpbHRlci51bnBpcGUoZW5kcG9pbnRTdHJlYW0pO1xuICAgICAgICAgIHJlYWRTdHJlYW0udW5waXBlKGluZmxhdGVGaWx0ZXIpO1xuICAgICAgICAgIC8vIFRPRE86IHRoZSBpbmZsYXRlRmlsdGVyIG1heSBjYXVzZSBhIG1lbW9yeSBsZWFrLiBzZWUgSXNzdWUgIzI3LlxuICAgICAgICAgIHJlYWRTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgZW5kcG9pbnRTdHJlYW0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZWxmLnJlYWRlci51bnJlZigpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBFbnRyeSgpIHtcbn1cbkVudHJ5LnByb3RvdHlwZS5nZXRMYXN0TW9kRGF0ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZG9zRGF0ZVRpbWVUb0RhdGUodGhpcy5sYXN0TW9kRmlsZURhdGUsIHRoaXMubGFzdE1vZEZpbGVUaW1lKTtcbn07XG5FbnRyeS5wcm90b3R5cGUuaXNFbmNyeXB0ZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICh0aGlzLmdlbmVyYWxQdXJwb3NlQml0RmxhZyAmIDB4MSkgIT09IDA7XG59O1xuRW50cnkucHJvdG90eXBlLmlzQ29tcHJlc3NlZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jb21wcmVzc2lvbk1ldGhvZCA9PT0gODtcbn07XG5cbmZ1bmN0aW9uIGRvc0RhdGVUaW1lVG9EYXRlKGRhdGUsIHRpbWUpIHtcbiAgdmFyIGRheSA9IGRhdGUgJiAweDFmOyAvLyAxLTMxXG4gIHZhciBtb250aCA9IChkYXRlID4+IDUgJiAweGYpIC0gMTsgLy8gMS0xMiwgMC0xMVxuICB2YXIgeWVhciA9IChkYXRlID4+IDkgJiAweDdmKSArIDE5ODA7IC8vIDAtMTI4LCAxOTgwLTIxMDhcblxuICB2YXIgbWlsbGlzZWNvbmQgPSAwO1xuICB2YXIgc2Vjb25kID0gKHRpbWUgJiAweDFmKSAqIDI7IC8vIDAtMjksIDAtNTggKGV2ZW4gbnVtYmVycylcbiAgdmFyIG1pbnV0ZSA9IHRpbWUgPj4gNSAmIDB4M2Y7IC8vIDAtNTlcbiAgdmFyIGhvdXIgPSB0aW1lID4+IDExICYgMHgxZjsgLy8gMC0yM1xuXG4gIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZpbGVOYW1lKGZpbGVOYW1lKSB7XG4gIGlmIChmaWxlTmFtZS5pbmRleE9mKFwiXFxcXFwiKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gXCJpbnZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZU5hbWU6IFwiICsgZmlsZU5hbWU7XG4gIH1cbiAgaWYgKC9eW2EtekEtWl06Ly50ZXN0KGZpbGVOYW1lKSB8fCAvXlxcLy8udGVzdChmaWxlTmFtZSkpIHtcbiAgICByZXR1cm4gXCJhYnNvbHV0ZSBwYXRoOiBcIiArIGZpbGVOYW1lO1xuICB9XG4gIGlmIChmaWxlTmFtZS5zcGxpdChcIi9cIikuaW5kZXhPZihcIi4uXCIpICE9PSAtMSkge1xuICAgIHJldHVybiBcImludmFsaWQgcmVsYXRpdmUgcGF0aDogXCIgKyBmaWxlTmFtZTtcbiAgfVxuICAvLyBhbGwgZ29vZFxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVhZEFuZEFzc2VydE5vRW9mKHJlYWRlciwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrKSB7XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAvLyBmcy5yZWFkIHdpbGwgdGhyb3cgYW4gb3V0LW9mLWJvdW5kcyBlcnJvciBpZiB5b3UgdHJ5IHRvIHJlYWQgMCBieXRlcyBmcm9tIGEgMCBieXRlIGZpbGVcbiAgICByZXR1cm4gc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkgeyBjYWxsYmFjayhudWxsLCBuZXdCdWZmZXIoMCkpOyB9KTtcbiAgfVxuICByZWFkZXIucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgZnVuY3Rpb24oZXJyLCBieXRlc1JlYWQpIHtcbiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICBpZiAoYnl0ZXNSZWFkIDwgbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwidW5leHBlY3RlZCBFT0ZcIikpO1xuICAgIH1cbiAgICBjYWxsYmFjaygpO1xuICB9KTtcbn1cblxudXRpbC5pbmhlcml0cyhBc3NlcnRCeXRlQ291bnRTdHJlYW0sIFRyYW5zZm9ybSk7XG5mdW5jdGlvbiBBc3NlcnRCeXRlQ291bnRTdHJlYW0oYnl0ZUNvdW50KSB7XG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMpO1xuICB0aGlzLmFjdHVhbEJ5dGVDb3VudCA9IDA7XG4gIHRoaXMuZXhwZWN0ZWRCeXRlQ291bnQgPSBieXRlQ291bnQ7XG59XG5Bc3NlcnRCeXRlQ291bnRTdHJlYW0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuYWN0dWFsQnl0ZUNvdW50ICs9IGNodW5rLmxlbmd0aDtcbiAgaWYgKHRoaXMuYWN0dWFsQnl0ZUNvdW50ID4gdGhpcy5leHBlY3RlZEJ5dGVDb3VudCkge1xuICAgIHZhciBtc2cgPSBcInRvbyBtYW55IGJ5dGVzIGluIHRoZSBzdHJlYW0uIGV4cGVjdGVkIFwiICsgdGhpcy5leHBlY3RlZEJ5dGVDb3VudCArIFwiLiBnb3QgYXQgbGVhc3QgXCIgKyB0aGlzLmFjdHVhbEJ5dGVDb3VudDtcbiAgICByZXR1cm4gY2IobmV3IEVycm9yKG1zZykpO1xuICB9XG4gIGNiKG51bGwsIGNodW5rKTtcbn07XG5Bc3NlcnRCeXRlQ291bnRTdHJlYW0ucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uKGNiKSB7XG4gIGlmICh0aGlzLmFjdHVhbEJ5dGVDb3VudCA8IHRoaXMuZXhwZWN0ZWRCeXRlQ291bnQpIHtcbiAgICB2YXIgbXNnID0gXCJub3QgZW5vdWdoIGJ5dGVzIGluIHRoZSBzdHJlYW0uIGV4cGVjdGVkIFwiICsgdGhpcy5leHBlY3RlZEJ5dGVDb3VudCArIFwiLiBnb3Qgb25seSBcIiArIHRoaXMuYWN0dWFsQnl0ZUNvdW50O1xuICAgIHJldHVybiBjYihuZXcgRXJyb3IobXNnKSk7XG4gIH1cbiAgY2IoKTtcbn07XG5cbnV0aWwuaW5oZXJpdHMoUmFuZG9tQWNjZXNzUmVhZGVyLCBFdmVudEVtaXR0ZXIpO1xuZnVuY3Rpb24gUmFuZG9tQWNjZXNzUmVhZGVyKCkge1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTtcbiAgdGhpcy5yZWZDb3VudCA9IDA7XG59XG5SYW5kb21BY2Nlc3NSZWFkZXIucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJlZkNvdW50ICs9IDE7XG59O1xuUmFuZG9tQWNjZXNzUmVhZGVyLnByb3RvdHlwZS51bnJlZiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHNlbGYucmVmQ291bnQgLT0gMTtcblxuICBpZiAoc2VsZi5yZWZDb3VudCA+IDApIHJldHVybjtcbiAgaWYgKHNlbGYucmVmQ291bnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHVucmVmXCIpO1xuXG4gIHNlbGYuY2xvc2Uob25DbG9zZURvbmUpO1xuXG4gIGZ1bmN0aW9uIG9uQ2xvc2VEb25lKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBzZWxmLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICBzZWxmLmVtaXQoJ2Nsb3NlJyk7XG4gIH1cbn07XG5SYW5kb21BY2Nlc3NSZWFkZXIucHJvdG90eXBlLmNyZWF0ZVJlYWRTdHJlYW0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHZhciBzdGFydCA9IG9wdGlvbnMuc3RhcnQ7XG4gIHZhciBlbmQgPSBvcHRpb25zLmVuZDtcbiAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICB2YXIgZW1wdHlTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICBlbXB0eVN0cmVhbS5lbmQoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZW1wdHlTdHJlYW07XG4gIH1cbiAgdmFyIHN0cmVhbSA9IHRoaXMuX3JlYWRTdHJlYW1Gb3JSYW5nZShzdGFydCwgZW5kKTtcblxuICB2YXIgZGVzdHJveWVkID0gZmFsc2U7XG4gIHZhciByZWZVbnJlZkZpbHRlciA9IG5ldyBSZWZVbnJlZkZpbHRlcih0aGlzKTtcbiAgc3RyZWFtLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24oZXJyKSB7XG4gICAgc2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFkZXN0cm95ZWQpIHJlZlVucmVmRmlsdGVyLmVtaXQoXCJlcnJvclwiLCBlcnIpO1xuICAgIH0pO1xuICB9KTtcbiAgcmVmVW5yZWZGaWx0ZXIuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIHN0cmVhbS51bnBpcGUocmVmVW5yZWZGaWx0ZXIpO1xuICAgIHJlZlVucmVmRmlsdGVyLnVucmVmKCk7XG4gICAgc3RyZWFtLmRlc3Ryb3koKTtcbiAgfTtcblxuICB2YXIgYnl0ZUNvdW50ZXIgPSBuZXcgQXNzZXJ0Qnl0ZUNvdW50U3RyZWFtKGVuZCAtIHN0YXJ0KTtcbiAgcmVmVW5yZWZGaWx0ZXIub24oXCJlcnJvclwiLCBmdW5jdGlvbihlcnIpIHtcbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIWRlc3Ryb3llZCkgYnl0ZUNvdW50ZXIuZW1pdChcImVycm9yXCIsIGVycik7XG4gICAgfSk7XG4gIH0pO1xuICBieXRlQ291bnRlci5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgZGVzdHJveWVkID0gdHJ1ZTtcbiAgICByZWZVbnJlZkZpbHRlci51bnBpcGUoYnl0ZUNvdW50ZXIpO1xuICAgIHJlZlVucmVmRmlsdGVyLmRlc3Ryb3koKTtcbiAgfTtcblxuICByZXR1cm4gc3RyZWFtLnBpcGUocmVmVW5yZWZGaWx0ZXIpLnBpcGUoYnl0ZUNvdW50ZXIpO1xufTtcblJhbmRvbUFjY2Vzc1JlYWRlci5wcm90b3R5cGUuX3JlYWRTdHJlYW1Gb3JSYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xufTtcblJhbmRvbUFjY2Vzc1JlYWRlci5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYWxsYmFjaykge1xuICB2YXIgcmVhZFN0cmVhbSA9IHRoaXMuY3JlYXRlUmVhZFN0cmVhbSh7c3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uICsgbGVuZ3RofSk7XG4gIHZhciB3cml0ZVN0cmVhbSA9IG5ldyBXcml0YWJsZSgpO1xuICB2YXIgd3JpdHRlbiA9IDA7XG4gIHdyaXRlU3RyZWFtLl93cml0ZSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICBjaHVuay5jb3B5KGJ1ZmZlciwgb2Zmc2V0ICsgd3JpdHRlbiwgMCwgY2h1bmsubGVuZ3RoKTtcbiAgICB3cml0dGVuICs9IGNodW5rLmxlbmd0aDtcbiAgICBjYigpO1xuICB9O1xuICB3cml0ZVN0cmVhbS5vbihcImZpbmlzaFwiLCBjYWxsYmFjayk7XG4gIHJlYWRTdHJlYW0ub24oXCJlcnJvclwiLCBmdW5jdGlvbihlcnJvcikge1xuICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgfSk7XG4gIHJlYWRTdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSk7XG59O1xuUmFuZG9tQWNjZXNzUmVhZGVyLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG59O1xuXG51dGlsLmluaGVyaXRzKFJlZlVucmVmRmlsdGVyLCBQYXNzVGhyb3VnaCk7XG5mdW5jdGlvbiBSZWZVbnJlZkZpbHRlcihjb250ZXh0KSB7XG4gIFBhc3NUaHJvdWdoLmNhbGwodGhpcyk7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuY29udGV4dC5yZWYoKTtcbiAgdGhpcy51bnJlZmZlZFlldCA9IGZhbHNlO1xufVxuUmVmVW5yZWZGaWx0ZXIucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uKGNiKSB7XG4gIHRoaXMudW5yZWYoKTtcbiAgY2IoKTtcbn07XG5SZWZVbnJlZkZpbHRlci5wcm90b3R5cGUudW5yZWYgPSBmdW5jdGlvbihjYikge1xuICBpZiAodGhpcy51bnJlZmZlZFlldCkgcmV0dXJuO1xuICB0aGlzLnVucmVmZmVkWWV0ID0gdHJ1ZTtcbiAgdGhpcy5jb250ZXh0LnVucmVmKCk7XG59O1xuXG52YXIgY3A0MzcgPSAnXFx1MDAwMOKYuuKYu+KZpeKZpuKZo+KZoOKAouKXmOKXi+KXmeKZguKZgOKZquKZq+KYvOKWuuKXhOKGleKAvMK2wqfilqzihqjihpHihpPihpLihpDiiJ/ihpTilrLilrwgIVwiIyQlJlxcJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fuKMgsOHw7zDqcOiw6TDoMOlw6fDqsOrw6jDr8Ouw6zDhMOFw4nDpsOGw7TDtsOyw7vDucO/w5bDnMKiwqPCpeKCp8aSw6HDrcOzw7rDscORwqrCusK/4oyQwqzCvcK8wqHCq8K74paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paAzrHDn86Tz4DOo8+DwrXPhM6mzpjOqc604oiez4bOteKIqeKJocKx4oml4omk4oyg4oyhw7fiiYjCsOKImcK34oia4oG/wrLilqDCoCc7XG5mdW5jdGlvbiBkZWNvZGVCdWZmZXIoYnVmZmVyLCBzdGFydCwgZW5kLCBpc1V0ZjgpIHtcbiAgaWYgKGlzVXRmOCkge1xuICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoXCJ1dGY4XCIsIHN0YXJ0LCBlbmQpO1xuICB9IGVsc2Uge1xuICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICByZXN1bHQgKz0gY3A0MzdbYnVmZmVyW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkVUludDY0TEUoYnVmZmVyLCBvZmZzZXQpIHtcbiAgLy8gdGhlcmUgaXMgbm8gbmF0aXZlIGZ1bmN0aW9uIGZvciB0aGlzLCBiZWNhdXNlIHdlIGNhbid0IGFjdHVhbGx5IHN0b3JlIDY0LWJpdCBpbnRlZ2VycyBwcmVjaXNlbHkuXG4gIC8vIGFmdGVyIDUzIGJpdHMsIEphdmFTY3JpcHQncyBOdW1iZXIgdHlwZSAoSUVFRSA3NTQgZG91YmxlKSBjYW4ndCBzdG9yZSBpbmRpdmlkdWFsIGludGVnZXJzIGFueW1vcmUuXG4gIC8vIGJ1dCBzaW5jZSA1MyBiaXRzIGlzIGEgd2hvbGUgbG90IG1vcmUgdGhhbiAzMiBiaXRzLCB3ZSBkbyBvdXIgYmVzdCBhbnl3YXkuXG4gIHZhciBsb3dlcjMyID0gYnVmZmVyLnJlYWRVSW50MzJMRShvZmZzZXQpO1xuICB2YXIgdXBwZXIzMiA9IGJ1ZmZlci5yZWFkVUludDMyTEUob2Zmc2V0ICsgNCk7XG4gIC8vIHdlIGNhbid0IHVzZSBiaXRzaGlmdGluZyBoZXJlLCBiZWNhdXNlIEphdmFTY3JpcHQgYml0c2hpZnRpbmcgb25seSB3b3JrcyBvbiAzMi1iaXQgaW50ZWdlcnMuXG4gIHJldHVybiB1cHBlcjMyICogMHgxMDAwMDAwMDAgKyBsb3dlcjMyO1xuICAvLyBhcyBsb25nIGFzIHdlJ3JlIGJvdW5kcyBjaGVja2luZyB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gYWdhaW5zdCB0aGUgdG90YWwgZmlsZSBzaXplLFxuICAvLyB3ZSdsbCBjYXRjaCBhbnkgb3ZlcmZsb3cgZXJyb3JzLCBiZWNhdXNlIHdlIGFscmVhZHkgbWFkZSBzdXJlIHRoZSB0b3RhbCBmaWxlIHNpemUgd2FzIHdpdGhpbiByZWFzb24uXG59XG5cbi8vIE5vZGUgMTAgZGVwcmVjYXRlZCBuZXcgQnVmZmVyKCkuXG52YXIgbmV3QnVmZmVyO1xuaWYgKHR5cGVvZiBCdWZmZXIuYWxsb2NVbnNhZmUgPT09IFwiZnVuY3Rpb25cIikge1xuICBuZXdCdWZmZXIgPSBmdW5jdGlvbihsZW4pIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbik7XG4gIH07XG59IGVsc2Uge1xuICBuZXdCdWZmZXIgPSBmdW5jdGlvbihsZW4pIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihsZW4pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q2FsbGJhY2soZXJyKSB7XG4gIGlmIChlcnIpIHRocm93IGVycjtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImFzc2VydFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJidWZmZXJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjb25zdGFudHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImRuc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJldmVudHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnMvcHJvbWlzZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiaHR0cFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJodHRwc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJuZXRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZTphc3NlcnQvc3RyaWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlOmV2ZW50c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlOmZzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGU6cGF0aFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlOnByb2Nlc3NcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibm9kZTp0ZXN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm9zXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicHJvY2Vzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFkbGluZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzdHJlYW1cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidGxzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInR0eVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1cmxcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidXRpbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ6bGliXCIpOyIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYWxpZ24gPSB7XG4gICAgcmlnaHQ6IGFsaWduUmlnaHQsXG4gICAgY2VudGVyOiBhbGlnbkNlbnRlclxufTtcbmNvbnN0IHRvcCA9IDA7XG5jb25zdCByaWdodCA9IDE7XG5jb25zdCBib3R0b20gPSAyO1xuY29uc3QgbGVmdCA9IDM7XG5jbGFzcyBVSSB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMud2lkdGggPSBvcHRzLndpZHRoO1xuICAgICAgICB0aGlzLndyYXAgPSAoX2EgPSBvcHRzLndyYXApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRydWU7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgIH1cbiAgICBzcGFuKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuZGl2KC4uLmFyZ3MpO1xuICAgICAgICBjb2xzLnNwYW4gPSB0cnVlO1xuICAgIH1cbiAgICByZXNldE91dHB1dCgpIHtcbiAgICAgICAgdGhpcy5yb3dzID0gW107XG4gICAgfVxuICAgIGRpdiguLi5hcmdzKSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXYoJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndyYXAgJiYgdGhpcy5zaG91bGRBcHBseUxheW91dERTTCguLi5hcmdzKSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5TGF5b3V0RFNMKGFyZ3NbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbHMgPSBhcmdzLm1hcChhcmcgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sRnJvbVN0cmluZyhhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucm93cy5wdXNoKGNvbHMpO1xuICAgICAgICByZXR1cm4gY29scztcbiAgICB9XG4gICAgc2hvdWxkQXBwbHlMYXlvdXREU0woLi4uYXJncykge1xuICAgICAgICByZXR1cm4gYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAvW1xcdFxcbl0vLnRlc3QoYXJnc1swXSk7XG4gICAgfVxuICAgIGFwcGx5TGF5b3V0RFNMKHN0cikge1xuICAgICAgICBjb25zdCByb3dzID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAocm93ID0+IHJvdy5zcGxpdCgnXFx0JykpO1xuICAgICAgICBsZXQgbGVmdENvbHVtbldpZHRoID0gMDtcbiAgICAgICAgLy8gc2ltcGxlIGhldXJpc3RpYyBmb3IgbGF5b3V0LCBtYWtlIHN1cmUgdGhlXG4gICAgICAgIC8vIHNlY29uZCBjb2x1bW4gbGluZXMgdXAgYWxvbmcgdGhlIGxlZnQtaGFuZC5cbiAgICAgICAgLy8gZG9uJ3QgYWxsb3cgdGhlIGZpcnN0IGNvbHVtbiB0byB0YWtlIHVwIG1vcmVcbiAgICAgICAgLy8gdGhhbiA1MCUgb2YgdGhlIHNjcmVlbi5cbiAgICAgICAgcm93cy5mb3JFYWNoKGNvbHVtbnMgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID4gMSAmJiBtaXhpbi5zdHJpbmdXaWR0aChjb2x1bW5zWzBdKSA+IGxlZnRDb2x1bW5XaWR0aCkge1xuICAgICAgICAgICAgICAgIGxlZnRDb2x1bW5XaWR0aCA9IE1hdGgubWluKE1hdGguZmxvb3IodGhpcy53aWR0aCAqIDAuNSksIG1peGluLnN0cmluZ1dpZHRoKGNvbHVtbnNbMF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGdlbmVyYXRlIGEgdGFibGU6XG4gICAgICAgIC8vICByZXBsYWNpbmcgJyAnIHdpdGggcGFkZGluZyBjYWxjdWxhdGlvbnMuXG4gICAgICAgIC8vICB1c2luZyB0aGUgYWxnb3JpdGhtaWNhbGx5IGdlbmVyYXRlZCB3aWR0aC5cbiAgICAgICAgcm93cy5mb3JFYWNoKGNvbHVtbnMgPT4ge1xuICAgICAgICAgICAgdGhpcy5kaXYoLi4uY29sdW1ucy5tYXAoKHIsIGkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiByLnRyaW0oKSxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogdGhpcy5tZWFzdXJlUGFkZGluZyhyKSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IChpID09PSAwICYmIGNvbHVtbnMubGVuZ3RoID4gMSkgPyBsZWZ0Q29sdW1uV2lkdGggOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93c1t0aGlzLnJvd3MubGVuZ3RoIC0gMV07XG4gICAgfVxuICAgIGNvbEZyb21TdHJpbmcodGV4dCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHBhZGRpbmc6IHRoaXMubWVhc3VyZVBhZGRpbmcodGV4dClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgbWVhc3VyZVBhZGRpbmcoc3RyKSB7XG4gICAgICAgIC8vIG1lYXN1cmUgcGFkZGluZyB3aXRob3V0IGFuc2kgZXNjYXBlIGNvZGVzXG4gICAgICAgIGNvbnN0IG5vQW5zaSA9IG1peGluLnN0cmlwQW5zaShzdHIpO1xuICAgICAgICByZXR1cm4gWzAsIG5vQW5zaS5tYXRjaCgvXFxzKiQvKVswXS5sZW5ndGgsIDAsIG5vQW5zaS5tYXRjaCgvXlxccyovKVswXS5sZW5ndGhdO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICAgICAgdGhpcy5yb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICAgIHRoaXMucm93VG9TdHJpbmcocm93LCBsaW5lcyk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBkb24ndCBkaXNwbGF5IGFueSBsaW5lcyB3aXRoIHRoZVxuICAgICAgICAvLyBoaWRkZW4gZmxhZyBzZXQuXG4gICAgICAgIHJldHVybiBsaW5lc1xuICAgICAgICAgICAgLmZpbHRlcihsaW5lID0+ICFsaW5lLmhpZGRlbilcbiAgICAgICAgICAgIC5tYXAobGluZSA9PiBsaW5lLnRleHQpXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuICAgIHJvd1RvU3RyaW5nKHJvdywgbGluZXMpIHtcbiAgICAgICAgdGhpcy5yYXN0ZXJpemUocm93KS5mb3JFYWNoKChycm93LCByKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RyID0gJyc7XG4gICAgICAgICAgICBycm93LmZvckVhY2goKGNvbCwgYykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGggfSA9IHJvd1tjXTsgLy8gdGhlIHdpZHRoIHdpdGggcGFkZGluZy5cbiAgICAgICAgICAgICAgICBjb25zdCB3cmFwV2lkdGggPSB0aGlzLm5lZ2F0ZVBhZGRpbmcocm93W2NdKTsgLy8gdGhlIHdpZHRoIHdpdGhvdXQgcGFkZGluZy5cbiAgICAgICAgICAgICAgICBsZXQgdHMgPSBjb2w7IC8vIHRlbXBvcmFyeSBzdHJpbmcgdXNlZCBkdXJpbmcgYWxpZ25tZW50L3BhZGRpbmcuXG4gICAgICAgICAgICAgICAgaWYgKHdyYXBXaWR0aCA+IG1peGluLnN0cmluZ1dpZHRoKGNvbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHMgKz0gJyAnLnJlcGVhdCh3cmFwV2lkdGggLSBtaXhpbi5zdHJpbmdXaWR0aChjb2wpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYWxpZ24gdGhlIHN0cmluZyB3aXRoaW4gaXRzIGNvbHVtbi5cbiAgICAgICAgICAgICAgICBpZiAocm93W2NdLmFsaWduICYmIHJvd1tjXS5hbGlnbiAhPT0gJ2xlZnQnICYmIHRoaXMud3JhcCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbiA9IGFsaWduW3Jvd1tjXS5hbGlnbl07XG4gICAgICAgICAgICAgICAgICAgIHRzID0gZm4odHMsIHdyYXBXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaXhpbi5zdHJpbmdXaWR0aCh0cykgPCB3cmFwV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRzICs9ICcgJy5yZXBlYXQoKHdpZHRoIHx8IDApIC0gbWl4aW4uc3RyaW5nV2lkdGgodHMpIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYXBwbHkgYm9yZGVyIGFuZCBwYWRkaW5nIHRvIHN0cmluZy5cbiAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gcm93W2NdLnBhZGRpbmcgfHwgWzAsIDAsIDAsIDBdO1xuICAgICAgICAgICAgICAgIGlmIChwYWRkaW5nW2xlZnRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSAnICcucmVwZWF0KHBhZGRpbmdbbGVmdF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdHIgKz0gYWRkQm9yZGVyKHJvd1tjXSwgdHMsICd8ICcpO1xuICAgICAgICAgICAgICAgIHN0ciArPSB0cztcbiAgICAgICAgICAgICAgICBzdHIgKz0gYWRkQm9yZGVyKHJvd1tjXSwgdHMsICcgfCcpO1xuICAgICAgICAgICAgICAgIGlmIChwYWRkaW5nW3JpZ2h0XSkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnLnJlcGVhdChwYWRkaW5nW3JpZ2h0XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIHByaW9yIHJvdyBpcyBzcGFuLCB0cnkgdG8gcmVuZGVyIHRoZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcm93IG9uIHRoZSBwcmlvciBsaW5lLlxuICAgICAgICAgICAgICAgIGlmIChyID09PSAwICYmIGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gdGhpcy5yZW5kZXJJbmxpbmUoc3RyLCBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiAgICAgICAgICAgIGxpbmVzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRleHQ6IHN0ci5yZXBsYWNlKC8gKyQvLCAnJyksXG4gICAgICAgICAgICAgICAgc3Bhbjogcm93LnNwYW5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH1cbiAgICAvLyBpZiB0aGUgZnVsbCAnc291cmNlJyBjYW4gcmVuZGVyIGluXG4gICAgLy8gdGhlIHRhcmdldCBsaW5lLCBkbyBzby5cbiAgICByZW5kZXJJbmxpbmUoc291cmNlLCBwcmV2aW91c0xpbmUpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBzb3VyY2UubWF0Y2goL14gKi8pO1xuICAgICAgICBjb25zdCBsZWFkaW5nV2hpdGVzcGFjZSA9IG1hdGNoID8gbWF0Y2hbMF0ubGVuZ3RoIDogMDtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcHJldmlvdXNMaW5lLnRleHQ7XG4gICAgICAgIGNvbnN0IHRhcmdldFRleHRXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHRhcmdldC50cmltUmlnaHQoKSk7XG4gICAgICAgIGlmICghcHJldmlvdXNMaW5lLnNwYW4pIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgd2UncmUgbm90IGFwcGx5aW5nIHdyYXBwaW5nIGxvZ2ljLFxuICAgICAgICAvLyBqdXN0IGFsd2F5cyBhcHBlbmQgdG8gdGhlIHNwYW4uXG4gICAgICAgIGlmICghdGhpcy53cmFwKSB7XG4gICAgICAgICAgICBwcmV2aW91c0xpbmUuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQgKyBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlYWRpbmdXaGl0ZXNwYWNlIDwgdGFyZ2V0VGV4dFdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzTGluZS5oaWRkZW4gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGFyZ2V0LnRyaW1SaWdodCgpICsgJyAnLnJlcGVhdChsZWFkaW5nV2hpdGVzcGFjZSAtIHRhcmdldFRleHRXaWR0aCkgKyBzb3VyY2UudHJpbUxlZnQoKTtcbiAgICB9XG4gICAgcmFzdGVyaXplKHJvdykge1xuICAgICAgICBjb25zdCBycm93cyA9IFtdO1xuICAgICAgICBjb25zdCB3aWR0aHMgPSB0aGlzLmNvbHVtbldpZHRocyhyb3cpO1xuICAgICAgICBsZXQgd3JhcHBlZDtcbiAgICAgICAgLy8gd29yZCB3cmFwIGFsbCBjb2x1bW5zLCBhbmQgY3JlYXRlXG4gICAgICAgIC8vIGEgZGF0YS1zdHJ1Y3R1cmUgdGhhdCBpcyBlYXN5IHRvIHJhc3Rlcml6ZS5cbiAgICAgICAgcm93LmZvckVhY2goKGNvbCwgYykgPT4ge1xuICAgICAgICAgICAgLy8gbGVhdmUgcm9vbSBmb3IgbGVmdCBhbmQgcmlnaHQgcGFkZGluZy5cbiAgICAgICAgICAgIGNvbC53aWR0aCA9IHdpZHRoc1tjXTtcbiAgICAgICAgICAgIGlmICh0aGlzLndyYXApIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkID0gbWl4aW4ud3JhcChjb2wudGV4dCwgdGhpcy5uZWdhdGVQYWRkaW5nKGNvbCksIHsgaGFyZDogdHJ1ZSB9KS5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkID0gY29sLnRleHQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnVuc2hpZnQoJy4nICsgJy0nLnJlcGVhdCh0aGlzLm5lZ2F0ZVBhZGRpbmcoY29sKSArIDIpICsgJy4nKTtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnB1c2goXCInXCIgKyAnLScucmVwZWF0KHRoaXMubmVnYXRlUGFkZGluZyhjb2wpICsgMikgKyBcIidcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdG9wIGFuZCBib3R0b20gcGFkZGluZy5cbiAgICAgICAgICAgIGlmIChjb2wucGFkZGluZykge1xuICAgICAgICAgICAgICAgIHdyYXBwZWQudW5zaGlmdCguLi5uZXcgQXJyYXkoY29sLnBhZGRpbmdbdG9wXSB8fCAwKS5maWxsKCcnKSk7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC5wdXNoKC4uLm5ldyBBcnJheShjb2wucGFkZGluZ1tib3R0b21dIHx8IDApLmZpbGwoJycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdyYXBwZWQuZm9yRWFjaCgoc3RyLCByKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFycm93c1tyXSkge1xuICAgICAgICAgICAgICAgICAgICBycm93cy5wdXNoKFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcnJvdyA9IHJyb3dzW3JdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChycm93W2ldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJyb3cucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcnJvdy5wdXNoKHN0cik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBycm93cztcbiAgICB9XG4gICAgbmVnYXRlUGFkZGluZyhjb2wpIHtcbiAgICAgICAgbGV0IHdyYXBXaWR0aCA9IGNvbC53aWR0aCB8fCAwO1xuICAgICAgICBpZiAoY29sLnBhZGRpbmcpIHtcbiAgICAgICAgICAgIHdyYXBXaWR0aCAtPSAoY29sLnBhZGRpbmdbbGVmdF0gfHwgMCkgKyAoY29sLnBhZGRpbmdbcmlnaHRdIHx8IDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgICAgICB3cmFwV2lkdGggLT0gNDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JhcFdpZHRoO1xuICAgIH1cbiAgICBjb2x1bW5XaWR0aHMocm93KSB7XG4gICAgICAgIGlmICghdGhpcy53cmFwKSB7XG4gICAgICAgICAgICByZXR1cm4gcm93Lm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2wud2lkdGggfHwgbWl4aW4uc3RyaW5nV2lkdGgoY29sLnRleHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVuc2V0ID0gcm93Lmxlbmd0aDtcbiAgICAgICAgbGV0IHJlbWFpbmluZ1dpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgLy8gY29sdW1uIHdpZHRocyBjYW4gYmUgc2V0IGluIGNvbmZpZy5cbiAgICAgICAgY29uc3Qgd2lkdGhzID0gcm93Lm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC53aWR0aCkge1xuICAgICAgICAgICAgICAgIHVuc2V0LS07XG4gICAgICAgICAgICAgICAgcmVtYWluaW5nV2lkdGggLT0gY29sLndpZHRoO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2wud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gYW55IHVuc2V0IHdpZHRocyBzaG91bGQgYmUgY2FsY3VsYXRlZC5cbiAgICAgICAgY29uc3QgdW5zZXRXaWR0aCA9IHVuc2V0ID8gTWF0aC5mbG9vcihyZW1haW5pbmdXaWR0aCAvIHVuc2V0KSA6IDA7XG4gICAgICAgIHJldHVybiB3aWR0aHMubWFwKCh3LCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAodyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHVuc2V0V2lkdGgsIF9taW5XaWR0aChyb3dbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3O1xuICAgICAgICB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRCb3JkZXIoY29sLCB0cywgc3R5bGUpIHtcbiAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICBpZiAoL1suJ10tK1suJ10vLnRlc3QodHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRzLnRyaW0oKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyAgJztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuLy8gY2FsY3VsYXRlcyB0aGUgbWluaW11bSB3aWR0aCBvZlxuLy8gYSBjb2x1bW4sIGJhc2VkIG9uIHBhZGRpbmcgcHJlZmVyZW5jZXMuXG5mdW5jdGlvbiBfbWluV2lkdGgoY29sKSB7XG4gICAgY29uc3QgcGFkZGluZyA9IGNvbC5wYWRkaW5nIHx8IFtdO1xuICAgIGNvbnN0IG1pbldpZHRoID0gMSArIChwYWRkaW5nW2xlZnRdIHx8IDApICsgKHBhZGRpbmdbcmlnaHRdIHx8IDApO1xuICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgIHJldHVybiBtaW5XaWR0aCArIDQ7XG4gICAgfVxuICAgIHJldHVybiBtaW5XaWR0aDtcbn1cbmZ1bmN0aW9uIGdldFdpbmRvd1dpZHRoKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkZXBlbmRzIG9uIHRlcm1pbmFsICovXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnN0ZG91dCAmJiBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zO1xuICAgIH1cbiAgICByZXR1cm4gODA7XG59XG5mdW5jdGlvbiBhbGlnblJpZ2h0KHN0ciwgd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgIGNvbnN0IHN0cldpZHRoID0gbWl4aW4uc3RyaW5nV2lkdGgoc3RyKTtcbiAgICBpZiAoc3RyV2lkdGggPCB3aWR0aCkge1xuICAgICAgICByZXR1cm4gJyAnLnJlcGVhdCh3aWR0aCAtIHN0cldpZHRoKSArIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cbmZ1bmN0aW9uIGFsaWduQ2VudGVyKHN0ciwgd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgIGNvbnN0IHN0cldpZHRoID0gbWl4aW4uc3RyaW5nV2lkdGgoc3RyKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChzdHJXaWR0aCA+PSB3aWR0aCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICByZXR1cm4gJyAnLnJlcGVhdCgod2lkdGggLSBzdHJXaWR0aCkgPj4gMSkgKyBzdHI7XG59XG5sZXQgbWl4aW47XG5mdW5jdGlvbiBjbGl1aShvcHRzLCBfbWl4aW4pIHtcbiAgICBtaXhpbiA9IF9taXhpbjtcbiAgICByZXR1cm4gbmV3IFVJKHtcbiAgICAgICAgd2lkdGg6IChvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMud2lkdGgpIHx8IGdldFdpbmRvd1dpZHRoKCksXG4gICAgICAgIHdyYXA6IG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy53cmFwXG4gICAgfSk7XG59XG5cbi8vIEJvb3RzdHJhcCBjbGl1aSB3aXRoIENvbW1vbkpTIGRlcGVuZGVuY2llczpcbmNvbnN0IHN0cmluZ1dpZHRoID0gcmVxdWlyZSgnc3RyaW5nLXdpZHRoJyk7XG5jb25zdCBzdHJpcEFuc2kgPSByZXF1aXJlKCdzdHJpcC1hbnNpJyk7XG5jb25zdCB3cmFwID0gcmVxdWlyZSgnd3JhcC1hbnNpJyk7XG5mdW5jdGlvbiB1aShvcHRzKSB7XG4gICAgcmV0dXJuIGNsaXVpKG9wdHMsIHtcbiAgICAgICAgc3RyaW5nV2lkdGgsXG4gICAgICAgIHN0cmlwQW5zaSxcbiAgICAgICAgd3JhcFxuICAgIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHVpO1xuIiwiY29uc3QgeyBBcmd1bWVudCB9ID0gcmVxdWlyZSgnLi9saWIvYXJndW1lbnQuanMnKTtcbmNvbnN0IHsgQ29tbWFuZCB9ID0gcmVxdWlyZSgnLi9saWIvY29tbWFuZC5qcycpO1xuY29uc3QgeyBDb21tYW5kZXJFcnJvciwgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vbGliL2Vycm9yLmpzJyk7XG5jb25zdCB7IEhlbHAgfSA9IHJlcXVpcmUoJy4vbGliL2hlbHAuanMnKTtcbmNvbnN0IHsgT3B0aW9uIH0gPSByZXF1aXJlKCcuL2xpYi9vcHRpb24uanMnKTtcblxuZXhwb3J0cy5wcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxuZXhwb3J0cy5jcmVhdGVDb21tYW5kID0gKG5hbWUpID0+IG5ldyBDb21tYW5kKG5hbWUpO1xuZXhwb3J0cy5jcmVhdGVPcHRpb24gPSAoZmxhZ3MsIGRlc2NyaXB0aW9uKSA9PiBuZXcgT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG5leHBvcnRzLmNyZWF0ZUFyZ3VtZW50ID0gKG5hbWUsIGRlc2NyaXB0aW9uKSA9PiBuZXcgQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pO1xuXG4vKipcbiAqIEV4cG9zZSBjbGFzc2VzXG4gKi9cblxuZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDtcbmV4cG9ydHMuT3B0aW9uID0gT3B0aW9uO1xuZXhwb3J0cy5Bcmd1bWVudCA9IEFyZ3VtZW50O1xuZXhwb3J0cy5IZWxwID0gSGVscDtcblxuZXhwb3J0cy5Db21tYW5kZXJFcnJvciA9IENvbW1hbmRlckVycm9yO1xuZXhwb3J0cy5JbnZhbGlkQXJndW1lbnRFcnJvciA9IEludmFsaWRBcmd1bWVudEVycm9yO1xuZXhwb3J0cy5JbnZhbGlkT3B0aW9uQXJndW1lbnRFcnJvciA9IEludmFsaWRBcmd1bWVudEVycm9yOyAvLyBEZXByZWNhdGVkXG4iLCJjb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9yLmpzJyk7XG5cbmNsYXNzIEFyZ3VtZW50IHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgY29tbWFuZCBhcmd1bWVudCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBkZXNjcmlwdGlvbi5cbiAgICogVGhlIGRlZmF1bHQgaXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgcmVxdWlyZWQsIGFuZCB5b3UgY2FuIGV4cGxpY2l0bHlcbiAgICogaW5kaWNhdGUgdGhpcyB3aXRoIDw+IGFyb3VuZCB0aGUgbmFtZS4gUHV0IFtdIGFyb3VuZCB0aGUgbmFtZSBmb3IgYW4gb3B0aW9uYWwgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uIHx8ICcnO1xuICAgIHRoaXMudmFyaWFkaWMgPSBmYWxzZTtcbiAgICB0aGlzLnBhcnNlQXJnID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdW5kZWZpbmVkO1xuXG4gICAgc3dpdGNoIChuYW1lWzBdKSB7XG4gICAgICBjYXNlICc8JzogLy8gZS5nLiA8cmVxdWlyZWQ+XG4gICAgICAgIHRoaXMucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZS5zbGljZSgxLCAtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnWyc6IC8vIGUuZy4gW29wdGlvbmFsXVxuICAgICAgICB0aGlzLnJlcXVpcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLnJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9uYW1lLmxlbmd0aCA+IDMgJiYgdGhpcy5fbmFtZS5zbGljZSgtMykgPT09ICcuLi4nKSB7XG4gICAgICB0aGlzLnZhcmlhZGljID0gdHJ1ZTtcbiAgICAgIHRoaXMuX25hbWUgPSB0aGlzLl9uYW1lLnNsaWNlKDAsIC0zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFyZ3VtZW50IG5hbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFja2FnZVxuICAgKi9cblxuICBfY29uY2F0VmFsdWUodmFsdWUsIHByZXZpb3VzKSB7XG4gICAgaWYgKHByZXZpb3VzID09PSB0aGlzLmRlZmF1bHRWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShwcmV2aW91cykpIHtcbiAgICAgIHJldHVybiBbdmFsdWVdO1xuICAgIH1cblxuICAgIHJldHVybiBwcmV2aW91cy5jb25jYXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSwgYW5kIG9wdGlvbmFsbHkgc3VwcGx5IHRoZSBkZXNjcmlwdGlvbiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGRlZmF1bHQodmFsdWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjdXN0b20gaGFuZGxlciBmb3IgcHJvY2Vzc2luZyBDTEkgY29tbWFuZCBhcmd1bWVudHMgaW50byBhcmd1bWVudCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl1cbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGFyZ1BhcnNlcihmbikge1xuICAgIHRoaXMucGFyc2VBcmcgPSBmbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IGFsbG93IGFyZ3VtZW50IHZhbHVlIHRvIGJlIG9uZSBvZiBjaG9pY2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB2YWx1ZXNcbiAgICogQHJldHVybiB7QXJndW1lbnR9XG4gICAqL1xuXG4gIGNob2ljZXModmFsdWVzKSB7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdmFsdWVzLnNsaWNlKCk7XG4gICAgdGhpcy5wYXJzZUFyZyA9IChhcmcsIHByZXZpb3VzKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYXJnQ2hvaWNlcy5pbmNsdWRlcyhhcmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgICBgQWxsb3dlZCBjaG9pY2VzIGFyZSAke3RoaXMuYXJnQ2hvaWNlcy5qb2luKCcsICcpfS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmFyaWFkaWMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmNhdFZhbHVlKGFyZywgcHJldmlvdXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYXJndW1lbnQgcmVxdWlyZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBcmd1bWVudH1cbiAgICovXG4gIGFyZ1JlcXVpcmVkKCkge1xuICAgIHRoaXMucmVxdWlyZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYXJndW1lbnQgb3B0aW9uYWwuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBcmd1bWVudH1cbiAgICovXG4gIGFyZ09wdGlvbmFsKCkge1xuICAgIHRoaXMucmVxdWlyZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG4vKipcbiAqIFRha2VzIGFuIGFyZ3VtZW50IGFuZCByZXR1cm5zIGl0cyBodW1hbiByZWFkYWJsZSBlcXVpdmFsZW50IGZvciBoZWxwIHVzYWdlLlxuICpcbiAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBodW1hblJlYWRhYmxlQXJnTmFtZShhcmcpIHtcbiAgY29uc3QgbmFtZU91dHB1dCA9IGFyZy5uYW1lKCkgKyAoYXJnLnZhcmlhZGljID09PSB0cnVlID8gJy4uLicgOiAnJyk7XG5cbiAgcmV0dXJuIGFyZy5yZXF1aXJlZCA/ICc8JyArIG5hbWVPdXRwdXQgKyAnPicgOiAnWycgKyBuYW1lT3V0cHV0ICsgJ10nO1xufVxuXG5leHBvcnRzLkFyZ3VtZW50ID0gQXJndW1lbnQ7XG5leHBvcnRzLmh1bWFuUmVhZGFibGVBcmdOYW1lID0gaHVtYW5SZWFkYWJsZUFyZ05hbWU7XG4iLCJjb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdub2RlOmV2ZW50cycpLkV2ZW50RW1pdHRlcjtcbmNvbnN0IGNoaWxkUHJvY2VzcyA9IHJlcXVpcmUoJ25vZGU6Y2hpbGRfcHJvY2VzcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ25vZGU6cGF0aCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdub2RlOmZzJyk7XG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgnbm9kZTpwcm9jZXNzJyk7XG5cbmNvbnN0IHsgQXJndW1lbnQsIGh1bWFuUmVhZGFibGVBcmdOYW1lIH0gPSByZXF1aXJlKCcuL2FyZ3VtZW50LmpzJyk7XG5jb25zdCB7IENvbW1hbmRlckVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9yLmpzJyk7XG5jb25zdCB7IEhlbHAgfSA9IHJlcXVpcmUoJy4vaGVscC5qcycpO1xuY29uc3QgeyBPcHRpb24sIER1YWxPcHRpb25zIH0gPSByZXF1aXJlKCcuL29wdGlvbi5qcycpO1xuY29uc3QgeyBzdWdnZXN0U2ltaWxhciB9ID0gcmVxdWlyZSgnLi9zdWdnZXN0U2ltaWxhcicpO1xuXG5jbGFzcyBDb21tYW5kIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgYENvbW1hbmRgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUpIHtcbiAgICBzdXBlcigpO1xuICAgIC8qKiBAdHlwZSB7Q29tbWFuZFtdfSAqL1xuICAgIHRoaXMuY29tbWFuZHMgPSBbXTtcbiAgICAvKiogQHR5cGUge09wdGlvbltdfSAqL1xuICAgIHRoaXMub3B0aW9ucyA9IFtdO1xuICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9hbGxvd1Vua25vd25PcHRpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cyA9IHRydWU7XG4gICAgLyoqIEB0eXBlIHtBcmd1bWVudFtdfSAqL1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cyA9IFtdO1xuICAgIHRoaXMuX2FyZ3MgPSB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHM7IC8vIGRlcHJlY2F0ZWQgb2xkIG5hbWVcbiAgICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIHRoaXMuYXJncyA9IFtdOyAvLyBjbGkgYXJncyB3aXRoIG9wdGlvbnMgcmVtb3ZlZFxuICAgIHRoaXMucmF3QXJncyA9IFtdO1xuICAgIHRoaXMucHJvY2Vzc2VkQXJncyA9IFtdOyAvLyBsaWtlIC5hcmdzIGJ1dCBhZnRlciBjdXN0b20gcHJvY2Vzc2luZyBhbmQgY29sbGVjdGluZyB2YXJpYWRpY1xuICAgIHRoaXMuX3NjcmlwdFBhdGggPSBudWxsO1xuICAgIHRoaXMuX25hbWUgPSBuYW1lIHx8ICcnO1xuICAgIHRoaXMuX29wdGlvblZhbHVlcyA9IHt9O1xuICAgIHRoaXMuX29wdGlvblZhbHVlU291cmNlcyA9IHt9OyAvLyBkZWZhdWx0LCBlbnYsIGNsaSBldGNcbiAgICB0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMgPSBmYWxzZTtcbiAgICB0aGlzLl9hY3Rpb25IYW5kbGVyID0gbnVsbDtcbiAgICB0aGlzLl9leGVjdXRhYmxlSGFuZGxlciA9IGZhbHNlO1xuICAgIHRoaXMuX2V4ZWN1dGFibGVGaWxlID0gbnVsbDsgLy8gY3VzdG9tIG5hbWUgZm9yIGV4ZWN1dGFibGVcbiAgICB0aGlzLl9leGVjdXRhYmxlRGlyID0gbnVsbDsgLy8gY3VzdG9tIHNlYXJjaCBkaXJlY3RvcnkgZm9yIHN1YmNvbW1hbmRzXG4gICAgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gbnVsbDtcbiAgICB0aGlzLl9leGl0Q2FsbGJhY2sgPSBudWxsO1xuICAgIHRoaXMuX2FsaWFzZXMgPSBbXTtcbiAgICB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gJyc7XG4gICAgdGhpcy5fc3VtbWFyeSA9ICcnO1xuICAgIHRoaXMuX2FyZ3NEZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDsgLy8gbGVnYWN5XG4gICAgdGhpcy5fZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgPSBmYWxzZTtcbiAgICB0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMgPSBmYWxzZTtcbiAgICB0aGlzLl9saWZlQ3ljbGVIb29rcyA9IHt9OyAvLyBhIGhhc2ggb2YgYXJyYXlzXG4gICAgLyoqIEB0eXBlIHsoYm9vbGVhbiB8IHN0cmluZyl9ICovXG4gICAgdGhpcy5fc2hvd0hlbHBBZnRlckVycm9yID0gZmFsc2U7XG4gICAgdGhpcy5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yID0gdHJ1ZTtcblxuICAgIC8vIHNlZSAuY29uZmlndXJlT3V0cHV0KCkgZm9yIGRvY3NcbiAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uID0ge1xuICAgICAgd3JpdGVPdXQ6IChzdHIpID0+IHByb2Nlc3Muc3Rkb3V0LndyaXRlKHN0ciksXG4gICAgICB3cml0ZUVycjogKHN0cikgPT4gcHJvY2Vzcy5zdGRlcnIud3JpdGUoc3RyKSxcbiAgICAgIGdldE91dEhlbHBXaWR0aDogKCkgPT5cbiAgICAgICAgcHJvY2Vzcy5zdGRvdXQuaXNUVFkgPyBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zIDogdW5kZWZpbmVkLFxuICAgICAgZ2V0RXJySGVscFdpZHRoOiAoKSA9PlxuICAgICAgICBwcm9jZXNzLnN0ZGVyci5pc1RUWSA/IHByb2Nlc3Muc3RkZXJyLmNvbHVtbnMgOiB1bmRlZmluZWQsXG4gICAgICBvdXRwdXRFcnJvcjogKHN0ciwgd3JpdGUpID0+IHdyaXRlKHN0ciksXG4gICAgfTtcblxuICAgIHRoaXMuX2hpZGRlbiA9IGZhbHNlO1xuICAgIC8qKiBAdHlwZSB7KE9wdGlvbiB8IG51bGwgfCB1bmRlZmluZWQpfSAqL1xuICAgIHRoaXMuX2hlbHBPcHRpb24gPSB1bmRlZmluZWQ7IC8vIExhenkgY3JlYXRlZCBvbiBkZW1hbmQuIE1heSBiZSBudWxsIGlmIGhlbHAgb3B0aW9uIGlzIGRpc2FibGVkLlxuICAgIHRoaXMuX2FkZEltcGxpY2l0SGVscENvbW1hbmQgPSB1bmRlZmluZWQ7IC8vIHVuZGVjaWRlZCB3aGV0aGVyIHRydWUgb3IgZmFsc2UgeWV0LCBub3QgaW5oZXJpdGVkXG4gICAgLyoqIEB0eXBlIHtDb21tYW5kfSAqL1xuICAgIHRoaXMuX2hlbHBDb21tYW5kID0gdW5kZWZpbmVkOyAvLyBsYXp5IGluaXRpYWxpc2VkLCBpbmhlcml0ZWRcbiAgICB0aGlzLl9oZWxwQ29uZmlndXJhdGlvbiA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgc2V0dGluZ3MgdGhhdCBhcmUgdXNlZnVsIHRvIGhhdmUgaW4gY29tbW9uIGFjcm9zcyByb290IGNvbW1hbmQgYW5kIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiAoVXNlZCBpbnRlcm5hbGx5IHdoZW4gYWRkaW5nIGEgY29tbWFuZCB1c2luZyBgLmNvbW1hbmQoKWAgc28gc3ViY29tbWFuZHMgaW5oZXJpdCBwYXJlbnQgc2V0dGluZ3MuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IHNvdXJjZUNvbW1hbmRcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBjb3B5SW5oZXJpdGVkU2V0dGluZ3Moc291cmNlQ29tbWFuZCkge1xuICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24gPSBzb3VyY2VDb21tYW5kLl9vdXRwdXRDb25maWd1cmF0aW9uO1xuICAgIHRoaXMuX2hlbHBPcHRpb24gPSBzb3VyY2VDb21tYW5kLl9oZWxwT3B0aW9uO1xuICAgIHRoaXMuX2hlbHBDb21tYW5kID0gc291cmNlQ29tbWFuZC5faGVscENvbW1hbmQ7XG4gICAgdGhpcy5faGVscENvbmZpZ3VyYXRpb24gPSBzb3VyY2VDb21tYW5kLl9oZWxwQ29uZmlndXJhdGlvbjtcbiAgICB0aGlzLl9leGl0Q2FsbGJhY2sgPSBzb3VyY2VDb21tYW5kLl9leGl0Q2FsbGJhY2s7XG4gICAgdGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzID0gc291cmNlQ29tbWFuZC5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzO1xuICAgIHRoaXMuX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZSA9XG4gICAgICBzb3VyY2VDb21tYW5kLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWU7XG4gICAgdGhpcy5fYWxsb3dFeGNlc3NBcmd1bWVudHMgPSBzb3VyY2VDb21tYW5kLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cztcbiAgICB0aGlzLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucyA9IHNvdXJjZUNvbW1hbmQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zO1xuICAgIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9IHNvdXJjZUNvbW1hbmQuX3Nob3dIZWxwQWZ0ZXJFcnJvcjtcbiAgICB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IgPSBzb3VyY2VDb21tYW5kLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3I7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Q29tbWFuZFtdfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBmb3IgKGxldCBjb21tYW5kID0gdGhpczsgY29tbWFuZDsgY29tbWFuZCA9IGNvbW1hbmQucGFyZW50KSB7XG4gICAgICByZXN1bHQucHVzaChjb21tYW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgYSBjb21tYW5kLlxuICAgKlxuICAgKiBUaGVyZSBhcmUgdHdvIHN0eWxlcyBvZiBjb21tYW5kOiBwYXkgYXR0ZW50aW9uIHRvIHdoZXJlIHRvIHB1dCB0aGUgZGVzY3JpcHRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIENvbW1hbmQgaW1wbGVtZW50ZWQgdXNpbmcgYWN0aW9uIGhhbmRsZXIgKGRlc2NyaXB0aW9uIGlzIHN1cHBsaWVkIHNlcGFyYXRlbHkgdG8gYC5jb21tYW5kYClcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5jb21tYW5kKCdjbG9uZSA8c291cmNlPiBbZGVzdGluYXRpb25dJylcbiAgICogICAuZGVzY3JpcHRpb24oJ2Nsb25lIGEgcmVwb3NpdG9yeSBpbnRvIGEgbmV3bHkgY3JlYXRlZCBkaXJlY3RvcnknKVxuICAgKiAgIC5hY3Rpb24oKHNvdXJjZSwgZGVzdGluYXRpb24pID0+IHtcbiAgICogICAgIGNvbnNvbGUubG9nKCdjbG9uZSBjb21tYW5kIGNhbGxlZCcpO1xuICAgKiAgIH0pO1xuICAgKlxuICAgKiAvLyBDb21tYW5kIGltcGxlbWVudGVkIHVzaW5nIHNlcGFyYXRlIGV4ZWN1dGFibGUgZmlsZSAoZGVzY3JpcHRpb24gaXMgc2Vjb25kIHBhcmFtZXRlciB0byBgLmNvbW1hbmRgKVxuICAgKiBwcm9ncmFtXG4gICAqICAgLmNvbW1hbmQoJ3N0YXJ0IDxzZXJ2aWNlPicsICdzdGFydCBuYW1lZCBzZXJ2aWNlJylcbiAgICogICAuY29tbWFuZCgnc3RvcCBbc2VydmljZV0nLCAnc3RvcCBuYW1lZCBzZXJ2aWNlLCBvciBhbGwgaWYgbm8gbmFtZSBzdXBwbGllZCcpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZUFuZEFyZ3MgLSBjb21tYW5kIG5hbWUgYW5kIGFyZ3VtZW50cywgYXJncyBhcmUgYDxyZXF1aXJlZD5gIG9yIGBbb3B0aW9uYWxdYCBhbmQgbGFzdCBtYXkgYWxzbyBiZSBgdmFyaWFkaWMuLi5gXG4gICAqIEBwYXJhbSB7KG9iamVjdCB8IHN0cmluZyl9IFthY3Rpb25PcHRzT3JFeGVjRGVzY10gLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKGZvciBhY3Rpb24pLCBvciBkZXNjcmlwdGlvbiAoZm9yIGV4ZWN1dGFibGUpXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbZXhlY09wdHNdIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIChmb3IgZXhlY3V0YWJsZSlcbiAgICogQHJldHVybiB7Q29tbWFuZH0gcmV0dXJucyBuZXcgY29tbWFuZCBmb3IgYWN0aW9uIGhhbmRsZXIsIG9yIGB0aGlzYCBmb3IgZXhlY3V0YWJsZSBjb21tYW5kXG4gICAqL1xuXG4gIGNvbW1hbmQobmFtZUFuZEFyZ3MsIGFjdGlvbk9wdHNPckV4ZWNEZXNjLCBleGVjT3B0cykge1xuICAgIGxldCBkZXNjID0gYWN0aW9uT3B0c09yRXhlY0Rlc2M7XG4gICAgbGV0IG9wdHMgPSBleGVjT3B0cztcbiAgICBpZiAodHlwZW9mIGRlc2MgPT09ICdvYmplY3QnICYmIGRlc2MgIT09IG51bGwpIHtcbiAgICAgIG9wdHMgPSBkZXNjO1xuICAgICAgZGVzYyA9IG51bGw7XG4gICAgfVxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIGNvbnN0IFssIG5hbWUsIGFyZ3NdID0gbmFtZUFuZEFyZ3MubWF0Y2goLyhbXiBdKykgKiguKikvKTtcblxuICAgIGNvbnN0IGNtZCA9IHRoaXMuY3JlYXRlQ29tbWFuZChuYW1lKTtcbiAgICBpZiAoZGVzYykge1xuICAgICAgY21kLmRlc2NyaXB0aW9uKGRlc2MpO1xuICAgICAgY21kLl9leGVjdXRhYmxlSGFuZGxlciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChvcHRzLmlzRGVmYXVsdCkgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gY21kLl9uYW1lO1xuICAgIGNtZC5faGlkZGVuID0gISEob3B0cy5ub0hlbHAgfHwgb3B0cy5oaWRkZW4pOyAvLyBub0hlbHAgaXMgZGVwcmVjYXRlZCBvbGQgbmFtZSBmb3IgaGlkZGVuXG4gICAgY21kLl9leGVjdXRhYmxlRmlsZSA9IG9wdHMuZXhlY3V0YWJsZUZpbGUgfHwgbnVsbDsgLy8gQ3VzdG9tIG5hbWUgZm9yIGV4ZWN1dGFibGUgZmlsZSwgc2V0IG1pc3NpbmcgdG8gbnVsbCB0byBtYXRjaCBjb25zdHJ1Y3RvclxuICAgIGlmIChhcmdzKSBjbWQuYXJndW1lbnRzKGFyZ3MpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29tbWFuZChjbWQpO1xuICAgIGNtZC5wYXJlbnQgPSB0aGlzO1xuICAgIGNtZC5jb3B5SW5oZXJpdGVkU2V0dGluZ3ModGhpcyk7XG5cbiAgICBpZiAoZGVzYykgcmV0dXJuIHRoaXM7XG4gICAgcmV0dXJuIGNtZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IHJvdXRpbmUgdG8gY3JlYXRlIGEgbmV3IHVuYXR0YWNoZWQgY29tbWFuZC5cbiAgICpcbiAgICogU2VlIC5jb21tYW5kKCkgZm9yIGNyZWF0aW5nIGFuIGF0dGFjaGVkIHN1YmNvbW1hbmQsIHdoaWNoIHVzZXMgdGhpcyByb3V0aW5lIHRvXG4gICAqIGNyZWF0ZSB0aGUgY29tbWFuZC4gWW91IGNhbiBvdmVycmlkZSBjcmVhdGVDb21tYW5kIHRvIGN1c3RvbWlzZSBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBuZXcgY29tbWFuZFxuICAgKi9cblxuICBjcmVhdGVDb21tYW5kKG5hbWUpIHtcbiAgICByZXR1cm4gbmV3IENvbW1hbmQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogWW91IGNhbiBjdXN0b21pc2UgdGhlIGhlbHAgd2l0aCBhIHN1YmNsYXNzIG9mIEhlbHAgYnkgb3ZlcnJpZGluZyBjcmVhdGVIZWxwLFxuICAgKiBvciBieSBvdmVycmlkaW5nIEhlbHAgcHJvcGVydGllcyB1c2luZyBjb25maWd1cmVIZWxwKCkuXG4gICAqXG4gICAqIEByZXR1cm4ge0hlbHB9XG4gICAqL1xuXG4gIGNyZWF0ZUhlbHAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEhlbHAoKSwgdGhpcy5jb25maWd1cmVIZWxwKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gY3VzdG9taXNlIHRoZSBoZWxwIGJ5IG92ZXJyaWRpbmcgSGVscCBwcm9wZXJ0aWVzIHVzaW5nIGNvbmZpZ3VyZUhlbHAoKSxcbiAgICogb3Igd2l0aCBhIHN1YmNsYXNzIG9mIEhlbHAgYnkgb3ZlcnJpZGluZyBjcmVhdGVIZWxwKCkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbY29uZmlndXJhdGlvbl0gLSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybiB7KENvbW1hbmQgfCBvYmplY3QpfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmcsIG9yIHN0b3JlZCBjb25maWd1cmF0aW9uXG4gICAqL1xuXG4gIGNvbmZpZ3VyZUhlbHAoY29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9oZWxwQ29uZmlndXJhdGlvbjtcblxuICAgIHRoaXMuX2hlbHBDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBvdXRwdXQgZ29lcyB0byBzdGRvdXQgYW5kIHN0ZGVyci4gWW91IGNhbiBjdXN0b21pc2UgdGhpcyBmb3Igc3BlY2lhbFxuICAgKiBhcHBsaWNhdGlvbnMuIFlvdSBjYW4gYWxzbyBjdXN0b21pc2UgdGhlIGRpc3BsYXkgb2YgZXJyb3JzIGJ5IG92ZXJyaWRpbmcgb3V0cHV0RXJyb3IuXG4gICAqXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgYXJlIGFsbCBmdW5jdGlvbnM6XG4gICAqXG4gICAqICAgICAvLyBmdW5jdGlvbnMgdG8gY2hhbmdlIHdoZXJlIGJlaW5nIHdyaXR0ZW4sIHN0ZG91dCBhbmQgc3RkZXJyXG4gICAqICAgICB3cml0ZU91dChzdHIpXG4gICAqICAgICB3cml0ZUVycihzdHIpXG4gICAqICAgICAvLyBtYXRjaGluZyBmdW5jdGlvbnMgdG8gc3BlY2lmeSB3aWR0aCBmb3Igd3JhcHBpbmcgaGVscFxuICAgKiAgICAgZ2V0T3V0SGVscFdpZHRoKClcbiAgICogICAgIGdldEVyckhlbHBXaWR0aCgpXG4gICAqICAgICAvLyBmdW5jdGlvbnMgYmFzZWQgb24gd2hhdCBpcyBiZWluZyB3cml0dGVuIG91dFxuICAgKiAgICAgb3V0cHV0RXJyb3Ioc3RyLCB3cml0ZSkgLy8gdXNlZCBmb3IgZGlzcGxheWluZyBlcnJvcnMsIGFuZCBub3QgdXNlZCBmb3IgZGlzcGxheWluZyBoZWxwXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbY29uZmlndXJhdGlvbl0gLSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybiB7KENvbW1hbmQgfCBvYmplY3QpfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmcsIG9yIHN0b3JlZCBjb25maWd1cmF0aW9uXG4gICAqL1xuXG4gIGNvbmZpZ3VyZU91dHB1dChjb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb247XG5cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgdGhlIGhlbHAgb3IgYSBjdXN0b20gbWVzc2FnZSBhZnRlciBhbiBlcnJvciBvY2N1cnMuXG4gICAqXG4gICAqIEBwYXJhbSB7KGJvb2xlYW58c3RyaW5nKX0gW2Rpc3BsYXlIZWxwXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHNob3dIZWxwQWZ0ZXJFcnJvcihkaXNwbGF5SGVscCA9IHRydWUpIHtcbiAgICBpZiAodHlwZW9mIGRpc3BsYXlIZWxwICE9PSAnc3RyaW5nJykgZGlzcGxheUhlbHAgPSAhIWRpc3BsYXlIZWxwO1xuICAgIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9IGRpc3BsYXlIZWxwO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgc3VnZ2VzdGlvbiBvZiBzaW1pbGFyIGNvbW1hbmRzIGZvciB1bmtub3duIGNvbW1hbmRzLCBvciBvcHRpb25zIGZvciB1bmtub3duIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Rpc3BsYXlTdWdnZXN0aW9uXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHNob3dTdWdnZXN0aW9uQWZ0ZXJFcnJvcihkaXNwbGF5U3VnZ2VzdGlvbiA9IHRydWUpIHtcbiAgICB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IgPSAhIWRpc3BsYXlTdWdnZXN0aW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHByZXBhcmVkIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIFNlZSAuY29tbWFuZCgpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBzdWJjb21tYW5kIHdoaWNoIGluaGVyaXRzIHNldHRpbmdzIGZyb20gaXRzIHBhcmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWQgLSBuZXcgc3ViY29tbWFuZFxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdHNdIC0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBhZGRDb21tYW5kKGNtZCwgb3B0cykge1xuICAgIGlmICghY21kLl9uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbW1hbmQgcGFzc2VkIHRvIC5hZGRDb21tYW5kKCkgbXVzdCBoYXZlIGEgbmFtZVxuLSBzcGVjaWZ5IHRoZSBuYW1lIGluIENvbW1hbmQgY29uc3RydWN0b3Igb3IgdXNpbmcgLm5hbWUoKWApO1xuICAgIH1cblxuICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgIGlmIChvcHRzLmlzRGVmYXVsdCkgdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lID0gY21kLl9uYW1lO1xuICAgIGlmIChvcHRzLm5vSGVscCB8fCBvcHRzLmhpZGRlbikgY21kLl9oaWRkZW4gPSB0cnVlOyAvLyBtb2RpZnlpbmcgcGFzc2VkIGNvbW1hbmQgZHVlIHRvIGV4aXN0aW5nIGltcGxlbWVudGF0aW9uXG5cbiAgICB0aGlzLl9yZWdpc3RlckNvbW1hbmQoY21kKTtcbiAgICBjbWQucGFyZW50ID0gdGhpcztcbiAgICBjbWQuX2NoZWNrRm9yQnJva2VuUGFzc1Rocm91Z2goKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3Rvcnkgcm91dGluZSB0byBjcmVhdGUgYSBuZXcgdW5hdHRhY2hlZCBhcmd1bWVudC5cbiAgICpcbiAgICogU2VlIC5hcmd1bWVudCgpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBhcmd1bWVudCwgd2hpY2ggdXNlcyB0aGlzIHJvdXRpbmUgdG9cbiAgICogY3JlYXRlIHRoZSBhcmd1bWVudC4gWW91IGNhbiBvdmVycmlkZSBjcmVhdGVBcmd1bWVudCB0byByZXR1cm4gYSBjdXN0b20gYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge0FyZ3VtZW50fSBuZXcgYXJndW1lbnRcbiAgICovXG5cbiAgY3JlYXRlQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pIHtcbiAgICByZXR1cm4gbmV3IEFyZ3VtZW50KG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgYXJndW1lbnQgc3ludGF4IGZvciBjb21tYW5kLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBpcyB0aGF0IHRoZSBhcmd1bWVudCBpcyByZXF1aXJlZCwgYW5kIHlvdSBjYW4gZXhwbGljaXRseVxuICAgKiBpbmRpY2F0ZSB0aGlzIHdpdGggPD4gYXJvdW5kIHRoZSBuYW1lLiBQdXQgW10gYXJvdW5kIHRoZSBuYW1lIGZvciBhbiBvcHRpb25hbCBhcmd1bWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5hcmd1bWVudCgnPGlucHV0LWZpbGU+Jyk7XG4gICAqIHByb2dyYW0uYXJndW1lbnQoJ1tvdXRwdXQtZmlsZV0nKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtIHsoRnVuY3Rpb258Kil9IFtmbl0gLSBjdXN0b20gYXJndW1lbnQgcHJvY2Vzc2luZyBmdW5jdGlvblxuICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24sIGZuLCBkZWZhdWx0VmFsdWUpIHtcbiAgICBjb25zdCBhcmd1bWVudCA9IHRoaXMuY3JlYXRlQXJndW1lbnQobmFtZSwgZGVzY3JpcHRpb24pO1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGFyZ3VtZW50LmRlZmF1bHQoZGVmYXVsdFZhbHVlKS5hcmdQYXJzZXIoZm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcmd1bWVudC5kZWZhdWx0KGZuKTtcbiAgICB9XG4gICAgdGhpcy5hZGRBcmd1bWVudChhcmd1bWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGFyZ3VtZW50IHN5bnRheCBmb3IgY29tbWFuZCwgYWRkaW5nIG11bHRpcGxlIGF0IG9uY2UgKHdpdGhvdXQgZGVzY3JpcHRpb25zKS5cbiAgICpcbiAgICogU2VlIGFsc28gLmFyZ3VtZW50KCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uYXJndW1lbnRzKCc8Y21kPiBbZW52XScpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGFyZ3VtZW50cyhuYW1lcykge1xuICAgIG5hbWVzXG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoLyArLylcbiAgICAgIC5mb3JFYWNoKChkZXRhaWwpID0+IHtcbiAgICAgICAgdGhpcy5hcmd1bWVudChkZXRhaWwpO1xuICAgICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGFyZ3VtZW50IHN5bnRheCBmb3IgY29tbWFuZCwgYWRkaW5nIGEgcHJlcGFyZWQgYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkQXJndW1lbnQoYXJndW1lbnQpIHtcbiAgICBjb25zdCBwcmV2aW91c0FyZ3VtZW50ID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLnNsaWNlKC0xKVswXTtcbiAgICBpZiAocHJldmlvdXNBcmd1bWVudCAmJiBwcmV2aW91c0FyZ3VtZW50LnZhcmlhZGljKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBvbmx5IHRoZSBsYXN0IGFyZ3VtZW50IGNhbiBiZSB2YXJpYWRpYyAnJHtwcmV2aW91c0FyZ3VtZW50Lm5hbWUoKX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGFyZ3VtZW50LnJlcXVpcmVkICYmXG4gICAgICBhcmd1bWVudC5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgYXJndW1lbnQucGFyc2VBcmcgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYSBkZWZhdWx0IHZhbHVlIGZvciBhIHJlcXVpcmVkIGFyZ3VtZW50IGlzIG5ldmVyIHVzZWQ6ICcke2FyZ3VtZW50Lm5hbWUoKX0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5wdXNoKGFyZ3VtZW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b21pc2Ugb3Igb3ZlcnJpZGUgZGVmYXVsdCBoZWxwIGNvbW1hbmQuIEJ5IGRlZmF1bHQgYSBoZWxwIGNvbW1hbmQgaXMgYXV0b21hdGljYWxseSBhZGRlZCBpZiB5b3VyIGNvbW1hbmQgaGFzIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKCdoZWxwIFtjbWRdJyk7XG4gICAqICAgIHByb2dyYW0uaGVscENvbW1hbmQoJ2hlbHAgW2NtZF0nLCAnc2hvdyBoZWxwJyk7XG4gICAqICAgIHByb2dyYW0uaGVscENvbW1hbmQoZmFsc2UpOyAvLyBzdXBwcmVzcyBkZWZhdWx0IGhlbHAgY29tbWFuZFxuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKHRydWUpOyAvLyBhZGQgaGVscCBjb21tYW5kIGV2ZW4gaWYgbm8gc3ViY29tbWFuZHNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8Ym9vbGVhbn0gZW5hYmxlT3JOYW1lQW5kQXJncyAtIGVuYWJsZSB3aXRoIGN1c3RvbSBuYW1lIGFuZC9vciBhcmd1bWVudHMsIG9yIGJvb2xlYW4gdG8gb3ZlcnJpZGUgd2hldGhlciBhZGRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXSAtIGN1c3RvbSBkZXNjcmlwdGlvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaGVscENvbW1hbmQoZW5hYmxlT3JOYW1lQW5kQXJncywgZGVzY3JpcHRpb24pIHtcbiAgICBpZiAodHlwZW9mIGVuYWJsZU9yTmFtZUFuZEFyZ3MgPT09ICdib29sZWFuJykge1xuICAgICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IGVuYWJsZU9yTmFtZUFuZEFyZ3M7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBlbmFibGVPck5hbWVBbmRBcmdzID0gZW5hYmxlT3JOYW1lQW5kQXJncyA/PyAnaGVscCBbY29tbWFuZF0nO1xuICAgIGNvbnN0IFssIGhlbHBOYW1lLCBoZWxwQXJnc10gPSBlbmFibGVPck5hbWVBbmRBcmdzLm1hdGNoKC8oW14gXSspICooLiopLyk7XG4gICAgY29uc3QgaGVscERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPz8gJ2Rpc3BsYXkgaGVscCBmb3IgY29tbWFuZCc7XG5cbiAgICBjb25zdCBoZWxwQ29tbWFuZCA9IHRoaXMuY3JlYXRlQ29tbWFuZChoZWxwTmFtZSk7XG4gICAgaGVscENvbW1hbmQuaGVscE9wdGlvbihmYWxzZSk7XG4gICAgaWYgKGhlbHBBcmdzKSBoZWxwQ29tbWFuZC5hcmd1bWVudHMoaGVscEFyZ3MpO1xuICAgIGlmIChoZWxwRGVzY3JpcHRpb24pIGhlbHBDb21tYW5kLmRlc2NyaXB0aW9uKGhlbHBEZXNjcmlwdGlvbik7XG5cbiAgICB0aGlzLl9hZGRJbXBsaWNpdEhlbHBDb21tYW5kID0gdHJ1ZTtcbiAgICB0aGlzLl9oZWxwQ29tbWFuZCA9IGhlbHBDb21tYW5kO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHByZXBhcmVkIGN1c3RvbSBoZWxwIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7KENvbW1hbmR8c3RyaW5nfGJvb2xlYW4pfSBoZWxwQ29tbWFuZCAtIGN1c3RvbSBoZWxwIGNvbW1hbmQsIG9yIGRlcHJlY2F0ZWQgZW5hYmxlT3JOYW1lQW5kQXJncyBhcyBmb3IgYC5oZWxwQ29tbWFuZCgpYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RlcHJlY2F0ZWREZXNjcmlwdGlvbl0gLSBkZXByZWNhdGVkIGN1c3RvbSBkZXNjcmlwdGlvbiB1c2VkIHdpdGggY3VzdG9tIG5hbWUgb25seVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEhlbHBDb21tYW5kKGhlbHBDb21tYW5kLCBkZXByZWNhdGVkRGVzY3JpcHRpb24pIHtcbiAgICAvLyBJZiBub3QgcGFzc2VkIGFuIG9iamVjdCwgY2FsbCB0aHJvdWdoIHRvIGhlbHBDb21tYW5kIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSxcbiAgICAvLyBhcyBhZGRIZWxwQ29tbWFuZCB3YXMgb3JpZ2luYWxseSB1c2VkIGxpa2UgaGVscENvbW1hbmQgaXMgbm93LlxuICAgIGlmICh0eXBlb2YgaGVscENvbW1hbmQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmhlbHBDb21tYW5kKGhlbHBDb21tYW5kLCBkZXByZWNhdGVkRGVzY3JpcHRpb24pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IHRydWU7XG4gICAgdGhpcy5faGVscENvbW1hbmQgPSBoZWxwQ29tbWFuZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXp5IGNyZWF0ZSBoZWxwIGNvbW1hbmQuXG4gICAqXG4gICAqIEByZXR1cm4geyhDb21tYW5kfG51bGwpfVxuICAgKiBAcGFja2FnZVxuICAgKi9cbiAgX2dldEhlbHBDb21tYW5kKCkge1xuICAgIGNvbnN0IGhhc0ltcGxpY2l0SGVscENvbW1hbmQgPVxuICAgICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA/P1xuICAgICAgKHRoaXMuY29tbWFuZHMubGVuZ3RoICYmXG4gICAgICAgICF0aGlzLl9hY3Rpb25IYW5kbGVyICYmXG4gICAgICAgICF0aGlzLl9maW5kQ29tbWFuZCgnaGVscCcpKTtcblxuICAgIGlmIChoYXNJbXBsaWNpdEhlbHBDb21tYW5kKSB7XG4gICAgICBpZiAodGhpcy5faGVscENvbW1hbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmhlbHBDb21tYW5kKHVuZGVmaW5lZCwgdW5kZWZpbmVkKTsgLy8gdXNlIGRlZmF1bHQgbmFtZSBhbmQgZGVzY3JpcHRpb25cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9oZWxwQ29tbWFuZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGhvb2sgZm9yIGxpZmUgY3ljbGUgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaG9vayhldmVudCwgbGlzdGVuZXIpIHtcbiAgICBjb25zdCBhbGxvd2VkVmFsdWVzID0gWydwcmVTdWJjb21tYW5kJywgJ3ByZUFjdGlvbicsICdwb3N0QWN0aW9uJ107XG4gICAgaWYgKCFhbGxvd2VkVmFsdWVzLmluY2x1ZGVzKGV2ZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciBldmVudCBwYXNzZWQgdG8gaG9vayA6ICcke2V2ZW50fScuXG5FeHBlY3Rpbmcgb25lIG9mICcke2FsbG93ZWRWYWx1ZXMuam9pbihcIicsICdcIil9J2ApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdKSB7XG4gICAgICB0aGlzLl9saWZlQ3ljbGVIb29rc1tldmVudF0ucHVzaChsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XSA9IFtsaXN0ZW5lcl07XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGNhbGxiYWNrIHRvIHVzZSBhcyByZXBsYWNlbWVudCBmb3IgY2FsbGluZyBwcm9jZXNzLmV4aXQuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtmbl0gb3B0aW9uYWwgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBwYXNzZWQgYSBDb21tYW5kZXJFcnJvciwgZGVmYXVsdHMgdG8gdGhyb3dpbmdcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGV4aXRPdmVycmlkZShmbikge1xuICAgIGlmIChmbikge1xuICAgICAgdGhpcy5fZXhpdENhbGxiYWNrID0gZm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2V4aXRDYWxsYmFjayA9IChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnKSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFzeW5jIGNhbGxiYWNrIGZyb20gc3Bhd24gZXZlbnRzLCBub3QgdXNlZnVsIHRvIHRocm93LlxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHByb2Nlc3MuZXhpdCwgYW5kIF9leGl0Q2FsbGJhY2sgaWYgZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGV4aXRDb2RlIGV4aXQgY29kZSBmb3IgdXNpbmcgd2l0aCBwcm9jZXNzLmV4aXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgYW4gaWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yXG4gICAqIEByZXR1cm4gbmV2ZXJcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2V4aXQoZXhpdENvZGUsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5fZXhpdENhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9leGl0Q2FsbGJhY2sobmV3IENvbW1hbmRlckVycm9yKGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKSk7XG4gICAgICAvLyBFeHBlY3RpbmcgdGhpcyBsaW5lIGlzIG5vdCByZWFjaGVkLlxuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGNhbGxiYWNrIGBmbmAgZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtXG4gICAqICAgLmNvbW1hbmQoJ3NlcnZlJylcbiAgICogICAuZGVzY3JpcHRpb24oJ3N0YXJ0IHNlcnZpY2UnKVxuICAgKiAgIC5hY3Rpb24oZnVuY3Rpb24oKSB7XG4gICAqICAgICAgLy8gZG8gd29yayBoZXJlXG4gICAqICAgfSk7XG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBhY3Rpb24oZm4pIHtcbiAgICBjb25zdCBsaXN0ZW5lciA9IChhcmdzKSA9PiB7XG4gICAgICAvLyBUaGUgLmFjdGlvbiBjYWxsYmFjayB0YWtlcyBhbiBleHRyYSBwYXJhbWV0ZXIgd2hpY2ggaXMgdGhlIGNvbW1hbmQgb3Igb3B0aW9ucy5cbiAgICAgIGNvbnN0IGV4cGVjdGVkQXJnc0NvdW50ID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGNvbnN0IGFjdGlvbkFyZ3MgPSBhcmdzLnNsaWNlKDAsIGV4cGVjdGVkQXJnc0NvdW50KTtcbiAgICAgIGlmICh0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgYWN0aW9uQXJnc1tleHBlY3RlZEFyZ3NDb3VudF0gPSB0aGlzOyAvLyBiYWNrd2FyZHMgY29tcGF0aWJsZSBcIm9wdGlvbnNcIlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aW9uQXJnc1tleHBlY3RlZEFyZ3NDb3VudF0gPSB0aGlzLm9wdHMoKTtcbiAgICAgIH1cbiAgICAgIGFjdGlvbkFyZ3MucHVzaCh0aGlzKTtcblxuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFjdGlvbkFyZ3MpO1xuICAgIH07XG4gICAgdGhpcy5fYWN0aW9uSGFuZGxlciA9IGxpc3RlbmVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3Rvcnkgcm91dGluZSB0byBjcmVhdGUgYSBuZXcgdW5hdHRhY2hlZCBvcHRpb24uXG4gICAqXG4gICAqIFNlZSAub3B0aW9uKCkgZm9yIGNyZWF0aW5nIGFuIGF0dGFjaGVkIG9wdGlvbiwgd2hpY2ggdXNlcyB0aGlzIHJvdXRpbmUgdG9cbiAgICogY3JlYXRlIHRoZSBvcHRpb24uIFlvdSBjYW4gb3ZlcnJpZGUgY3JlYXRlT3B0aW9uIHRvIHJldHVybiBhIGN1c3RvbSBvcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtPcHRpb259IG5ldyBvcHRpb25cbiAgICovXG5cbiAgY3JlYXRlT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiBuZXcgT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCBwYXJzZUFyZ3MgdG8gY2F0Y2ggJ2NvbW1hbmRlci5pbnZhbGlkQXJndW1lbnQnLlxuICAgKlxuICAgKiBAcGFyYW0geyhPcHRpb24gfCBBcmd1bWVudCl9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHBhcmFtIHsqfSBwcmV2aW91c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gaW52YWxpZEFyZ3VtZW50TWVzc2FnZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2FsbFBhcnNlQXJnKHRhcmdldCwgdmFsdWUsIHByZXZpb3VzLCBpbnZhbGlkQXJndW1lbnRNZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0YXJnZXQucGFyc2VBcmcodmFsdWUsIHByZXZpb3VzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ2NvbW1hbmRlci5pbnZhbGlkQXJndW1lbnQnKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgJHtpbnZhbGlkQXJndW1lbnRNZXNzYWdlfSAke2Vyci5tZXNzYWdlfWA7XG4gICAgICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBleGl0Q29kZTogZXJyLmV4aXRDb2RlLCBjb2RlOiBlcnIuY29kZSB9KTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIG9wdGlvbiBmbGFnIGNvbmZsaWN0cy5cbiAgICogUmVnaXN0ZXIgb3B0aW9uIGlmIG5vIGNvbmZsaWN0cyBmb3VuZCwgb3IgdGhyb3cgb24gY29uZmxpY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX3JlZ2lzdGVyT3B0aW9uKG9wdGlvbikge1xuICAgIGNvbnN0IG1hdGNoaW5nT3B0aW9uID1cbiAgICAgIChvcHRpb24uc2hvcnQgJiYgdGhpcy5fZmluZE9wdGlvbihvcHRpb24uc2hvcnQpKSB8fFxuICAgICAgKG9wdGlvbi5sb25nICYmIHRoaXMuX2ZpbmRPcHRpb24ob3B0aW9uLmxvbmcpKTtcbiAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRmxhZyA9XG4gICAgICAgIG9wdGlvbi5sb25nICYmIHRoaXMuX2ZpbmRPcHRpb24ob3B0aW9uLmxvbmcpXG4gICAgICAgICAgPyBvcHRpb24ubG9uZ1xuICAgICAgICAgIDogb3B0aW9uLnNob3J0O1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYWRkIG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyR7dGhpcy5fbmFtZSAmJiBgIHRvIGNvbW1hbmQgJyR7dGhpcy5fbmFtZX0nYH0gZHVlIHRvIGNvbmZsaWN0aW5nIGZsYWcgJyR7bWF0Y2hpbmdGbGFnfSdcbi0gIGFscmVhZHkgdXNlZCBieSBvcHRpb24gJyR7bWF0Y2hpbmdPcHRpb24uZmxhZ3N9J2ApO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIGNvbW1hbmQgbmFtZSBhbmQgYWxpYXMgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgY29tbWFuZHMuXG4gICAqIFJlZ2lzdGVyIGNvbW1hbmQgaWYgbm8gY29uZmxpY3RzIGZvdW5kLCBvciB0aHJvdyBvbiBjb25mbGljdC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjb21tYW5kXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9yZWdpc3RlckNvbW1hbmQoY29tbWFuZCkge1xuICAgIGNvbnN0IGtub3duQnkgPSAoY21kKSA9PiB7XG4gICAgICByZXR1cm4gW2NtZC5uYW1lKCldLmNvbmNhdChjbWQuYWxpYXNlcygpKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYWxyZWFkeVVzZWQgPSBrbm93bkJ5KGNvbW1hbmQpLmZpbmQoKG5hbWUpID0+XG4gICAgICB0aGlzLl9maW5kQ29tbWFuZChuYW1lKSxcbiAgICApO1xuICAgIGlmIChhbHJlYWR5VXNlZCkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDbWQgPSBrbm93bkJ5KHRoaXMuX2ZpbmRDb21tYW5kKGFscmVhZHlVc2VkKSkuam9pbignfCcpO1xuICAgICAgY29uc3QgbmV3Q21kID0ga25vd25CeShjb21tYW5kKS5qb2luKCd8Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYW5ub3QgYWRkIGNvbW1hbmQgJyR7bmV3Q21kfScgYXMgYWxyZWFkeSBoYXZlIGNvbW1hbmQgJyR7ZXhpc3RpbmdDbWR9J2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY29tbWFuZHMucHVzaChjb21tYW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkT3B0aW9uKG9wdGlvbikge1xuICAgIHRoaXMuX3JlZ2lzdGVyT3B0aW9uKG9wdGlvbik7XG5cbiAgICBjb25zdCBvbmFtZSA9IG9wdGlvbi5uYW1lKCk7XG4gICAgY29uc3QgbmFtZSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG5cbiAgICAvLyBzdG9yZSBkZWZhdWx0IHZhbHVlXG4gICAgaWYgKG9wdGlvbi5uZWdhdGUpIHtcbiAgICAgIC8vIC0tbm8tZm9vIGlzIHNwZWNpYWwgYW5kIGRlZmF1bHRzIGZvbyB0byB0cnVlLCB1bmxlc3MgYSAtLWZvbyBvcHRpb24gaXMgYWxyZWFkeSBkZWZpbmVkXG4gICAgICBjb25zdCBwb3NpdGl2ZUxvbmdGbGFnID0gb3B0aW9uLmxvbmcucmVwbGFjZSgvXi0tbm8tLywgJy0tJyk7XG4gICAgICBpZiAoIXRoaXMuX2ZpbmRPcHRpb24ocG9zaXRpdmVMb25nRmxhZykpIHtcbiAgICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBvcHRpb24uZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQgPyB0cnVlIDogb3B0aW9uLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAnZGVmYXVsdCcsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb24uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKG5hbWUsIG9wdGlvbi5kZWZhdWx0VmFsdWUsICdkZWZhdWx0Jyk7XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlciBmb3IgY2xpIGFuZCBlbnYgc3VwcGxpZWQgdmFsdWVzXG4gICAgY29uc3QgaGFuZGxlT3B0aW9uVmFsdWUgPSAodmFsLCBpbnZhbGlkVmFsdWVNZXNzYWdlLCB2YWx1ZVNvdXJjZSkgPT4ge1xuICAgICAgLy8gdmFsIGlzIG51bGwgZm9yIG9wdGlvbmFsIG9wdGlvbiB1c2VkIHdpdGhvdXQgYW4gb3B0aW9uYWwtYXJndW1lbnQuXG4gICAgICAvLyB2YWwgaXMgdW5kZWZpbmVkIGZvciBib29sZWFuIGFuZCBuZWdhdGVkIG9wdGlvbi5cbiAgICAgIGlmICh2YWwgPT0gbnVsbCAmJiBvcHRpb24ucHJlc2V0QXJnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsID0gb3B0aW9uLnByZXNldEFyZztcbiAgICAgIH1cblxuICAgICAgLy8gY3VzdG9tIHByb2Nlc3NpbmdcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5nZXRPcHRpb25WYWx1ZShuYW1lKTtcbiAgICAgIGlmICh2YWwgIT09IG51bGwgJiYgb3B0aW9uLnBhcnNlQXJnKSB7XG4gICAgICAgIHZhbCA9IHRoaXMuX2NhbGxQYXJzZUFyZyhvcHRpb24sIHZhbCwgb2xkVmFsdWUsIGludmFsaWRWYWx1ZU1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmICh2YWwgIT09IG51bGwgJiYgb3B0aW9uLnZhcmlhZGljKSB7XG4gICAgICAgIHZhbCA9IG9wdGlvbi5fY29uY2F0VmFsdWUodmFsLCBvbGRWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbGwtaW4gYXBwcm9wcmlhdGUgbWlzc2luZyB2YWx1ZXMuIExvbmcgd2luZGVkIGJ1dCBlYXN5IHRvIGZvbGxvdy5cbiAgICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICBpZiAob3B0aW9uLm5lZ2F0ZSkge1xuICAgICAgICAgIHZhbCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5pc0Jvb2xlYW4oKSB8fCBvcHRpb24ub3B0aW9uYWwpIHtcbiAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9ICcnOyAvLyBub3Qgbm9ybWFsLCBwYXJzZUFyZyBtaWdodCBoYXZlIGZhaWxlZCBvciBiZSBhIG1vY2sgZnVuY3Rpb24gZm9yIHRlc3RpbmdcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UobmFtZSwgdmFsLCB2YWx1ZVNvdXJjZSk7XG4gICAgfTtcblxuICAgIHRoaXMub24oJ29wdGlvbjonICsgb25hbWUsICh2YWwpID0+IHtcbiAgICAgIGNvbnN0IGludmFsaWRWYWx1ZU1lc3NhZ2UgPSBgZXJyb3I6IG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyBhcmd1bWVudCAnJHt2YWx9JyBpcyBpbnZhbGlkLmA7XG4gICAgICBoYW5kbGVPcHRpb25WYWx1ZSh2YWwsIGludmFsaWRWYWx1ZU1lc3NhZ2UsICdjbGknKTtcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb24uZW52VmFyKSB7XG4gICAgICB0aGlzLm9uKCdvcHRpb25FbnY6JyArIG9uYW1lLCAodmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGludmFsaWRWYWx1ZU1lc3NhZ2UgPSBgZXJyb3I6IG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyB2YWx1ZSAnJHt2YWx9JyBmcm9tIGVudiAnJHtvcHRpb24uZW52VmFyfScgaXMgaW52YWxpZC5gO1xuICAgICAgICBoYW5kbGVPcHRpb25WYWx1ZSh2YWwsIGludmFsaWRWYWx1ZU1lc3NhZ2UsICdlbnYnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIGltcGxlbWVudGF0aW9uIHNoYXJlZCBieSAub3B0aW9uKCkgYW5kIC5yZXF1aXJlZE9wdGlvbigpXG4gICAqXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29wdGlvbkV4KGNvbmZpZywgZmxhZ3MsIGRlc2NyaXB0aW9uLCBmbiwgZGVmYXVsdFZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBmbGFncyA9PT0gJ29iamVjdCcgJiYgZmxhZ3MgaW5zdGFuY2VvZiBPcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RvIGFkZCBhbiBPcHRpb24gb2JqZWN0IHVzZSBhZGRPcHRpb24oKSBpbnN0ZWFkIG9mIG9wdGlvbigpIG9yIHJlcXVpcmVkT3B0aW9uKCknLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcbiAgICBvcHRpb24ubWFrZU9wdGlvbk1hbmRhdG9yeSghIWNvbmZpZy5tYW5kYXRvcnkpO1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdGlvbi5kZWZhdWx0KGRlZmF1bHRWYWx1ZSkuYXJnUGFyc2VyKGZuKTtcbiAgICB9IGVsc2UgaWYgKGZuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBkZXByZWNhdGVkXG4gICAgICBjb25zdCByZWdleCA9IGZuO1xuICAgICAgZm4gPSAodmFsLCBkZWYpID0+IHtcbiAgICAgICAgY29uc3QgbSA9IHJlZ2V4LmV4ZWModmFsKTtcbiAgICAgICAgcmV0dXJuIG0gPyBtWzBdIDogZGVmO1xuICAgICAgfTtcbiAgICAgIG9wdGlvbi5kZWZhdWx0KGRlZmF1bHRWYWx1ZSkuYXJnUGFyc2VyKGZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9uLmRlZmF1bHQoZm4pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkZE9wdGlvbihvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBvcHRpb24gd2l0aCBgZmxhZ3NgLCBgZGVzY3JpcHRpb25gLCBhbmQgb3B0aW9uYWwgYXJndW1lbnQgcGFyc2luZyBmdW5jdGlvbiBvciBgZGVmYXVsdFZhbHVlYCBvciBib3RoLlxuICAgKlxuICAgKiBUaGUgYGZsYWdzYCBzdHJpbmcgY29udGFpbnMgdGhlIHNob3J0IGFuZC9vciBsb25nIGZsYWdzLCBzZXBhcmF0ZWQgYnkgY29tbWEsIGEgcGlwZSBvciBzcGFjZS4gQSByZXF1aXJlZFxuICAgKiBvcHRpb24tYXJndW1lbnQgaXMgaW5kaWNhdGVkIGJ5IGA8PmAgYW5kIGFuIG9wdGlvbmFsIG9wdGlvbi1hcmd1bWVudCBieSBgW11gLlxuICAgKlxuICAgKiBTZWUgdGhlIFJFQURNRSBmb3IgbW9yZSBkZXRhaWxzLCBhbmQgc2VlIGFsc28gYWRkT3B0aW9uKCkgYW5kIHJlcXVpcmVkT3B0aW9uKCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW1cbiAgICogICAgIC5vcHRpb24oJy1wLCAtLXBlcHBlcicsICdhZGQgcGVwcGVyJylcbiAgICogICAgIC5vcHRpb24oJy1wLCAtLXBpenphLXR5cGUgPFRZUEU+JywgJ3R5cGUgb2YgcGl6emEnKSAvLyByZXF1aXJlZCBvcHRpb24tYXJndW1lbnRcbiAgICogICAgIC5vcHRpb24oJy1jLCAtLWNoZWVzZSBbQ0hFRVNFXScsICdhZGQgZXh0cmEgY2hlZXNlJywgJ21venphcmVsbGEnKSAvLyBvcHRpb25hbCBvcHRpb24tYXJndW1lbnQgd2l0aCBkZWZhdWx0XG4gICAqICAgICAub3B0aW9uKCctdCwgLS10aXAgPFZBTFVFPicsICdhZGQgdGlwIHRvIHB1cmNoYXNlIGNvc3QnLCBwYXJzZUZsb2F0KSAvLyBjdXN0b20gcGFyc2UgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufCopfSBbcGFyc2VBcmddIC0gY3VzdG9tIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIG9yIGRlZmF1bHQgdmFsdWVcbiAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgb3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbiwgcGFyc2VBcmcsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25FeCh7fSwgZmxhZ3MsIGRlc2NyaXB0aW9uLCBwYXJzZUFyZywgZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSByZXF1aXJlZCBvcHRpb24gd2hpY2ggbXVzdCBoYXZlIGEgdmFsdWUgYWZ0ZXIgcGFyc2luZy4gVGhpcyB1c3VhbGx5IG1lYW5zXG4gICAqIHRoZSBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gKE90aGVyd2lzZSB0aGUgc2FtZSBhcyAub3B0aW9uKCkuKVxuICAgKlxuICAgKiBUaGUgYGZsYWdzYCBzdHJpbmcgY29udGFpbnMgdGhlIHNob3J0IGFuZC9vciBsb25nIGZsYWdzLCBzZXBhcmF0ZWQgYnkgY29tbWEsIGEgcGlwZSBvciBzcGFjZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufCopfSBbcGFyc2VBcmddIC0gY3VzdG9tIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIG9yIGRlZmF1bHQgdmFsdWVcbiAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgcmVxdWlyZWRPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uLCBwYXJzZUFyZywgZGVmYXVsdFZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbkV4KFxuICAgICAgeyBtYW5kYXRvcnk6IHRydWUgfSxcbiAgICAgIGZsYWdzLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBwYXJzZUFyZyxcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsdGVyIHBhcnNpbmcgb2Ygc2hvcnQgZmxhZ3Mgd2l0aCBvcHRpb25hbCB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIGZvciBgLm9wdGlvbignLWYsLS1mbGFnIFt2YWx1ZV0nKTpcbiAgICogcHJvZ3JhbS5jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUodHJ1ZSk7ICAvLyBgLWY4MGAgaXMgdHJlYXRlZCBsaWtlIGAtLWZsYWc9ODBgLCB0aGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW91clxuICAgKiBwcm9ncmFtLmNvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZShmYWxzZSkgLy8gYC1mYmAgaXMgdHJlYXRlZCBsaWtlIGAtZiAtYmBcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbY29tYmluZV0gLSBpZiBgdHJ1ZWAgb3Igb21pdHRlZCwgYW4gb3B0aW9uYWwgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBkaXJlY3RseSBhZnRlciB0aGUgZmxhZy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBjb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUoY29tYmluZSA9IHRydWUpIHtcbiAgICB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUgPSAhIWNvbWJpbmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdW5rbm93biBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93VW5rbm93bl0gLSBpZiBgdHJ1ZWAgb3Igb21pdHRlZCwgbm8gZXJyb3Igd2lsbCBiZSB0aHJvd24gZm9yIHVua25vd24gb3B0aW9ucy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhbGxvd1Vua25vd25PcHRpb24oYWxsb3dVbmtub3duID0gdHJ1ZSkge1xuICAgIHRoaXMuX2FsbG93VW5rbm93bk9wdGlvbiA9ICEhYWxsb3dVbmtub3duO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IGV4Y2VzcyBjb21tYW5kLWFyZ3VtZW50cyBvbiB0aGUgY29tbWFuZCBsaW5lLiBQYXNzIGZhbHNlIHRvIG1ha2UgZXhjZXNzIGFyZ3VtZW50cyBhbiBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dFeGNlc3NdIC0gaWYgYHRydWVgIG9yIG9taXR0ZWQsIG5vIGVycm9yIHdpbGwgYmUgdGhyb3duIGZvciBleGNlc3MgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFsbG93RXhjZXNzQXJndW1lbnRzKGFsbG93RXhjZXNzID0gdHJ1ZSkge1xuICAgIHRoaXMuX2FsbG93RXhjZXNzQXJndW1lbnRzID0gISFhbGxvd0V4Y2VzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgcG9zaXRpb25hbCBvcHRpb25zLiBQb3NpdGlvbmFsIG1lYW5zIGdsb2JhbCBvcHRpb25zIGFyZSBzcGVjaWZpZWQgYmVmb3JlIHN1YmNvbW1hbmRzIHdoaWNoIGxldHNcbiAgICogc3ViY29tbWFuZHMgcmV1c2UgdGhlIHNhbWUgb3B0aW9uIG5hbWVzLCBhbmQgYWxzbyBlbmFibGVzIHN1YmNvbW1hbmRzIHRvIHR1cm4gb24gcGFzc1Rocm91Z2hPcHRpb25zLlxuICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbm9uLXBvc2l0aW9uYWwgYW5kIGdsb2JhbCBvcHRpb25zIG1heSBhcHBlYXIgYW55d2hlcmUgb24gdGhlIGNvbW1hbmQgbGluZS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbcG9zaXRpb25hbF1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVQb3NpdGlvbmFsT3B0aW9ucyhwb3NpdGlvbmFsID0gdHJ1ZSkge1xuICAgIHRoaXMuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zID0gISFwb3NpdGlvbmFsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhc3MgdGhyb3VnaCBvcHRpb25zIHRoYXQgY29tZSBhZnRlciBjb21tYW5kLWFyZ3VtZW50cyByYXRoZXIgdGhhbiB0cmVhdCB0aGVtIGFzIGNvbW1hbmQtb3B0aW9ucyxcbiAgICogc28gYWN0dWFsIGNvbW1hbmQtb3B0aW9ucyBjb21lIGJlZm9yZSBjb21tYW5kLWFyZ3VtZW50cy4gVHVybmluZyB0aGlzIG9uIGZvciBhIHN1YmNvbW1hbmQgcmVxdWlyZXNcbiAgICogcG9zaXRpb25hbCBvcHRpb25zIHRvIGhhdmUgYmVlbiBlbmFibGVkIG9uIHRoZSBwcm9ncmFtIChwYXJlbnQgY29tbWFuZHMpLlxuICAgKiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbm9uLXBvc2l0aW9uYWwgYW5kIG9wdGlvbnMgbWF5IGFwcGVhciBiZWZvcmUgb3IgYWZ0ZXIgY29tbWFuZC1hcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Bhc3NUaHJvdWdoXSBmb3IgdW5rbm93biBvcHRpb25zLlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHBhc3NUaHJvdWdoT3B0aW9ucyhwYXNzVGhyb3VnaCA9IHRydWUpIHtcbiAgICB0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMgPSAhIXBhc3NUaHJvdWdoO1xuICAgIHRoaXMuX2NoZWNrRm9yQnJva2VuUGFzc1Rocm91Z2goKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hlY2tGb3JCcm9rZW5QYXNzVGhyb3VnaCgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnBhcmVudCAmJlxuICAgICAgdGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zICYmXG4gICAgICAhdGhpcy5wYXJlbnQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwYXNzVGhyb3VnaE9wdGlvbnMgY2Fubm90IGJlIHVzZWQgZm9yICcke3RoaXMuX25hbWV9JyB3aXRob3V0IHR1cm5pbmcgb24gZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgZm9yIHBhcmVudCBjb21tYW5kKHMpYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RvcmUgb3B0aW9uIHZhbHVlcyBhcyBwcm9wZXJ0aWVzIG9uIGNvbW1hbmQgb2JqZWN0LFxuICAgKiBvciBzdG9yZSBzZXBhcmF0ZWx5IChzcGVjaWZ5IGZhbHNlKS4gSW4gYm90aCBjYXNlcyB0aGUgb3B0aW9uIHZhbHVlcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgLm9wdHMoKS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbc3RvcmVBc1Byb3BlcnRpZXM9dHJ1ZV1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHN0b3JlT3B0aW9uc0FzUHJvcGVydGllcyhzdG9yZUFzUHJvcGVydGllcyA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsIC5zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMoKSBiZWZvcmUgYWRkaW5nIG9wdGlvbnMnKTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX29wdGlvblZhbHVlcykubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdjYWxsIC5zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMoKSBiZWZvcmUgc2V0dGluZyBvcHRpb24gdmFsdWVzJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcyA9ICEhc3RvcmVBc1Byb3BlcnRpZXM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgb3B0aW9uIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge29iamVjdH0gdmFsdWVcbiAgICovXG5cbiAgZ2V0T3B0aW9uVmFsdWUoa2V5KSB7XG4gICAgaWYgKHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcykge1xuICAgICAgcmV0dXJuIHRoaXNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvblZhbHVlc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIG9wdGlvbiB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHNldE9wdGlvblZhbHVlKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2Uoa2V5LCB2YWx1ZSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBvcHRpb24gdmFsdWUgYW5kIHdoZXJlIHRoZSB2YWx1ZSBjYW1lIGZyb20uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtvYmplY3R9IHZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBleHBlY3RlZCB2YWx1ZXMgYXJlIGRlZmF1bHQvY29uZmlnL2Vudi9jbGkvaW1wbGllZFxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKGtleSwgdmFsdWUsIHNvdXJjZSkge1xuICAgIGlmICh0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMpIHtcbiAgICAgIHRoaXNba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vcHRpb25WYWx1ZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl9vcHRpb25WYWx1ZVNvdXJjZXNba2V5XSA9IHNvdXJjZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc291cmNlIG9mIG9wdGlvbiB2YWx1ZS5cbiAgICogRXhwZWN0ZWQgdmFsdWVzIGFyZSBkZWZhdWx0IHwgY29uZmlnIHwgZW52IHwgY2xpIHwgaW1wbGllZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgZ2V0T3B0aW9uVmFsdWVTb3VyY2Uoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvblZhbHVlU291cmNlc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2Ugb2Ygb3B0aW9uIHZhbHVlLiBTZWUgYWxzbyAub3B0c1dpdGhHbG9iYWxzKCkuXG4gICAqIEV4cGVjdGVkIHZhbHVlcyBhcmUgZGVmYXVsdCB8IGNvbmZpZyB8IGVudiB8IGNsaSB8IGltcGxpZWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIGdldE9wdGlvblZhbHVlU291cmNlV2l0aEdsb2JhbHMoa2V5KSB7XG4gICAgLy8gZ2xvYmFsIG92ZXJ3cml0ZXMgbG9jYWwsIGxpa2Ugb3B0c1dpdGhHbG9iYWxzXG4gICAgbGV0IHNvdXJjZTtcbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBpZiAoY21kLmdldE9wdGlvblZhbHVlU291cmNlKGtleSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzb3VyY2UgPSBjbWQuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uoa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyIGFyZ3VtZW50cyBmcm9tIGltcGxpZWQgb3IgZXhwbGljaXQgYXJndW1lbnRzLlxuICAgKiBTaWRlLWVmZmVjdHM6IHNldCBfc2NyaXB0UGF0aCBpZiBhcmdzIGluY2x1ZGVkIHNjcmlwdC4gVXNlZCBmb3IgZGVmYXVsdCBwcm9ncmFtIG5hbWUsIGFuZCBzdWJjb21tYW5kIHNlYXJjaGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcHJlcGFyZVVzZXJBcmdzKGFyZ3YsIHBhcnNlT3B0aW9ucykge1xuICAgIGlmIChhcmd2ICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkoYXJndikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmlyc3QgcGFyYW1ldGVyIHRvIHBhcnNlIG11c3QgYmUgYXJyYXkgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHBhcnNlT3B0aW9ucyA9IHBhcnNlT3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIGF1dG8tZGV0ZWN0IGFyZ3VtZW50IGNvbnZlbnRpb25zIGlmIG5vdGhpbmcgc3VwcGxpZWRcbiAgICBpZiAoYXJndiA9PT0gdW5kZWZpbmVkICYmIHBhcnNlT3B0aW9ucy5mcm9tID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnZlcnNpb25zPy5lbGVjdHJvbikge1xuICAgICAgICBwYXJzZU9wdGlvbnMuZnJvbSA9ICdlbGVjdHJvbic7XG4gICAgICB9XG4gICAgICAvLyBjaGVjayBub2RlIHNwZWNpZmljIG9wdGlvbnMgZm9yIHNjZW5hcmlvcyB3aGVyZSB1c2VyIENMSSBhcmdzIGZvbGxvdyBleGVjdXRhYmxlIHdpdGhvdXQgc2NyaXB0bmFtZVxuICAgICAgY29uc3QgZXhlY0FyZ3YgPSBwcm9jZXNzLmV4ZWNBcmd2ID8/IFtdO1xuICAgICAgaWYgKFxuICAgICAgICBleGVjQXJndi5pbmNsdWRlcygnLWUnKSB8fFxuICAgICAgICBleGVjQXJndi5pbmNsdWRlcygnLS1ldmFsJykgfHxcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy1wJykgfHxcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy0tcHJpbnQnKVxuICAgICAgKSB7XG4gICAgICAgIHBhcnNlT3B0aW9ucy5mcm9tID0gJ2V2YWwnOyAvLyBpbnRlcm5hbCB1c2FnZSwgbm90IGRvY3VtZW50ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkZWZhdWx0IHRvIHVzaW5nIHByb2Nlc3MuYXJndlxuICAgIGlmIChhcmd2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyZ3YgPSBwcm9jZXNzLmFyZ3Y7XG4gICAgfVxuICAgIHRoaXMucmF3QXJncyA9IGFyZ3Yuc2xpY2UoKTtcblxuICAgIC8vIGV4dHJhY3QgdGhlIHVzZXIgYXJncyBhbmQgc2NyaXB0UGF0aFxuICAgIGxldCB1c2VyQXJncztcbiAgICBzd2l0Y2ggKHBhcnNlT3B0aW9ucy5mcm9tKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICB0aGlzLl9zY3JpcHRQYXRoID0gYXJndlsxXTtcbiAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VsZWN0cm9uJzpcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBkZWZhdWx0QXBwIGlzIGFuIHVua25vd24gcHJvcGVydHlcbiAgICAgICAgaWYgKHByb2Nlc3MuZGVmYXVsdEFwcCkge1xuICAgICAgICAgIHRoaXMuX3NjcmlwdFBhdGggPSBhcmd2WzFdO1xuICAgICAgICAgIHVzZXJBcmdzID0gYXJndi5zbGljZSgyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1c2VyJzpcbiAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2V2YWwnOlxuICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGB1bmV4cGVjdGVkIHBhcnNlIG9wdGlvbiB7IGZyb206ICcke3BhcnNlT3B0aW9ucy5mcm9tfScgfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmluZCBkZWZhdWx0IG5hbWUgZm9yIHByb2dyYW0gZnJvbSBhcmd1bWVudHMuXG4gICAgaWYgKCF0aGlzLl9uYW1lICYmIHRoaXMuX3NjcmlwdFBhdGgpXG4gICAgICB0aGlzLm5hbWVGcm9tRmlsZW5hbWUodGhpcy5fc2NyaXB0UGF0aCk7XG4gICAgdGhpcy5fbmFtZSA9IHRoaXMuX25hbWUgfHwgJ3Byb2dyYW0nO1xuXG4gICAgcmV0dXJuIHVzZXJBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGBhcmd2YCwgc2V0dGluZyBvcHRpb25zIGFuZCBpbnZva2luZyBjb21tYW5kcyB3aGVuIGRlZmluZWQuXG4gICAqXG4gICAqIFVzZSBwYXJzZUFzeW5jIGluc3RlYWQgb2YgcGFyc2UgaWYgYW55IG9mIHlvdXIgYWN0aW9uIGhhbmRsZXJzIGFyZSBhc3luYy5cbiAgICpcbiAgICogQ2FsbCB3aXRoIG5vIHBhcmFtZXRlcnMgdG8gcGFyc2UgYHByb2Nlc3MuYXJndmAuIERldGVjdHMgRWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBvcHRpb25zIGxpa2UgYG5vZGUgLS1ldmFsYC4gRWFzeSBtb2RlIVxuICAgKlxuICAgKiBPciBjYWxsIHdpdGggYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBwYXJzZSwgYW5kIG9wdGlvbmFsbHkgd2hlcmUgdGhlIHVzZXIgYXJndW1lbnRzIHN0YXJ0IGJ5IHNwZWNpZnlpbmcgd2hlcmUgdGhlIGFyZ3VtZW50cyBhcmUgYGZyb21gOlxuICAgKiAtIGAnbm9kZSdgOiBkZWZhdWx0LCBgYXJndlswXWAgaXMgdGhlIGFwcGxpY2F0aW9uIGFuZCBgYXJndlsxXWAgaXMgdGhlIHNjcmlwdCBiZWluZyBydW4sIHdpdGggdXNlciBhcmd1bWVudHMgYWZ0ZXIgdGhhdFxuICAgKiAtIGAnZWxlY3Ryb24nYDogYGFyZ3ZbMF1gIGlzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYGFyZ3ZbMV1gIHZhcmllcyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZWxlY3Ryb24gYXBwbGljYXRpb24gaXMgcGFja2FnZWRcbiAgICogLSBgJ3VzZXInYDoganVzdCB1c2VyIGFyZ3VtZW50c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLnBhcnNlKCk7IC8vIHBhcnNlIHByb2Nlc3MuYXJndiBhbmQgYXV0by1kZXRlY3QgZWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBmbGFnc1xuICAgKiBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7IC8vIGFzc3VtZSBhcmd2WzBdIGlzIGFwcCBhbmQgYXJndlsxXSBpcyBzY3JpcHRcbiAgICogcHJvZ3JhbS5wYXJzZShteS1hcmdzLCB7IGZyb206ICd1c2VyJyB9KTsgLy8ganVzdCB1c2VyIHN1cHBsaWVkIGFyZ3VtZW50cywgbm90aGluZyBzcGVjaWFsIGFib3V0IGFyZ3ZbMF1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3ZdIC0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHByb2Nlc3MuYXJndlxuICAgKiBAcGFyYW0ge29iamVjdH0gW3BhcnNlT3B0aW9uc10gLSBvcHRpb25hbGx5IHNwZWNpZnkgc3R5bGUgb2Ygb3B0aW9ucyB3aXRoIGZyb206IG5vZGUvdXNlci9lbGVjdHJvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcnNlT3B0aW9ucy5mcm9tXSAtIHdoZXJlIHRoZSBhcmdzIGFyZSBmcm9tOiAnbm9kZScsICd1c2VyJywgJ2VsZWN0cm9uJ1xuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgcGFyc2UoYXJndiwgcGFyc2VPcHRpb25zKSB7XG4gICAgY29uc3QgdXNlckFyZ3MgPSB0aGlzLl9wcmVwYXJlVXNlckFyZ3MoYXJndiwgcGFyc2VPcHRpb25zKTtcbiAgICB0aGlzLl9wYXJzZUNvbW1hbmQoW10sIHVzZXJBcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGBhcmd2YCwgc2V0dGluZyBvcHRpb25zIGFuZCBpbnZva2luZyBjb21tYW5kcyB3aGVuIGRlZmluZWQuXG4gICAqXG4gICAqIENhbGwgd2l0aCBubyBwYXJhbWV0ZXJzIHRvIHBhcnNlIGBwcm9jZXNzLmFyZ3ZgLiBEZXRlY3RzIEVsZWN0cm9uIGFuZCBzcGVjaWFsIG5vZGUgb3B0aW9ucyBsaWtlIGBub2RlIC0tZXZhbGAuIEVhc3kgbW9kZSFcbiAgICpcbiAgICogT3IgY2FsbCB3aXRoIGFuIGFycmF5IG9mIHN0cmluZ3MgdG8gcGFyc2UsIGFuZCBvcHRpb25hbGx5IHdoZXJlIHRoZSB1c2VyIGFyZ3VtZW50cyBzdGFydCBieSBzcGVjaWZ5aW5nIHdoZXJlIHRoZSBhcmd1bWVudHMgYXJlIGBmcm9tYDpcbiAgICogLSBgJ25vZGUnYDogZGVmYXVsdCwgYGFyZ3ZbMF1gIGlzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYGFyZ3ZbMV1gIGlzIHRoZSBzY3JpcHQgYmVpbmcgcnVuLCB3aXRoIHVzZXIgYXJndW1lbnRzIGFmdGVyIHRoYXRcbiAgICogLSBgJ2VsZWN0cm9uJ2A6IGBhcmd2WzBdYCBpcyB0aGUgYXBwbGljYXRpb24gYW5kIGBhcmd2WzFdYCB2YXJpZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGVsZWN0cm9uIGFwcGxpY2F0aW9uIGlzIHBhY2thZ2VkXG4gICAqIC0gYCd1c2VyJ2A6IGp1c3QgdXNlciBhcmd1bWVudHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYXdhaXQgcHJvZ3JhbS5wYXJzZUFzeW5jKCk7IC8vIHBhcnNlIHByb2Nlc3MuYXJndiBhbmQgYXV0by1kZXRlY3QgZWxlY3Ryb24gYW5kIHNwZWNpYWwgbm9kZSBmbGFnc1xuICAgKiBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMocHJvY2Vzcy5hcmd2KTsgLy8gYXNzdW1lIGFyZ3ZbMF0gaXMgYXBwIGFuZCBhcmd2WzFdIGlzIHNjcmlwdFxuICAgKiBhd2FpdCBwcm9ncmFtLnBhcnNlQXN5bmMobXktYXJncywgeyBmcm9tOiAndXNlcicgfSk7IC8vIGp1c3QgdXNlciBzdXBwbGllZCBhcmd1bWVudHMsIG5vdGhpbmcgc3BlY2lhbCBhYm91dCBhcmd2WzBdXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmd2XVxuICAgKiBAcGFyYW0ge29iamVjdH0gW3BhcnNlT3B0aW9uc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcnNlT3B0aW9ucy5mcm9tIC0gd2hlcmUgdGhlIGFyZ3MgYXJlIGZyb206ICdub2RlJywgJ3VzZXInLCAnZWxlY3Ryb24nXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuXG4gIGFzeW5jIHBhcnNlQXN5bmMoYXJndiwgcGFyc2VPcHRpb25zKSB7XG4gICAgY29uc3QgdXNlckFyZ3MgPSB0aGlzLl9wcmVwYXJlVXNlckFyZ3MoYXJndiwgcGFyc2VPcHRpb25zKTtcbiAgICBhd2FpdCB0aGlzLl9wYXJzZUNvbW1hbmQoW10sIHVzZXJBcmdzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWItY29tbWFuZCBleGVjdXRhYmxlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZXhlY3V0ZVN1YkNvbW1hbmQoc3ViY29tbWFuZCwgYXJncykge1xuICAgIGFyZ3MgPSBhcmdzLnNsaWNlKCk7XG4gICAgbGV0IGxhdW5jaFdpdGhOb2RlID0gZmFsc2U7IC8vIFVzZSBub2RlIGZvciBzb3VyY2UgdGFyZ2V0cyBzbyBkbyBub3QgbmVlZCB0byBnZXQgcGVybWlzc2lvbnMgY29ycmVjdCwgYW5kIG9uIFdpbmRvd3MuXG4gICAgY29uc3Qgc291cmNlRXh0ID0gWycuanMnLCAnLnRzJywgJy50c3gnLCAnLm1qcycsICcuY2pzJ107XG5cbiAgICBmdW5jdGlvbiBmaW5kRmlsZShiYXNlRGlyLCBiYXNlTmFtZSkge1xuICAgICAgLy8gTG9vayBmb3Igc3BlY2lmaWVkIGZpbGVcbiAgICAgIGNvbnN0IGxvY2FsQmluID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIGJhc2VOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsQmluKSkgcmV0dXJuIGxvY2FsQmluO1xuXG4gICAgICAvLyBTdG9wIGxvb2tpbmcgaWYgY2FuZGlkYXRlIGFscmVhZHkgaGFzIGFuIGV4cGVjdGVkIGV4dGVuc2lvbi5cbiAgICAgIGlmIChzb3VyY2VFeHQuaW5jbHVkZXMocGF0aC5leHRuYW1lKGJhc2VOYW1lKSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIFRyeSBhbGwgdGhlIGV4dGVuc2lvbnMuXG4gICAgICBjb25zdCBmb3VuZEV4dCA9IHNvdXJjZUV4dC5maW5kKChleHQpID0+XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoYCR7bG9jYWxCaW59JHtleHR9YCksXG4gICAgICApO1xuICAgICAgaWYgKGZvdW5kRXh0KSByZXR1cm4gYCR7bG9jYWxCaW59JHtmb3VuZEV4dH1gO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIE5vdCBjaGVja2luZyBmb3IgaGVscCBmaXJzdC4gVW5saWtlbHkgdG8gaGF2ZSBtYW5kYXRvcnkgYW5kIGV4ZWN1dGFibGUsIGFuZCBjYW4ndCByb2J1c3RseSB0ZXN0IGZvciBoZWxwIGZsYWdzIGluIGV4dGVybmFsIGNvbW1hbmQuXG4gICAgdGhpcy5fY2hlY2tGb3JNaXNzaW5nTWFuZGF0b3J5T3B0aW9ucygpO1xuICAgIHRoaXMuX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCk7XG5cbiAgICAvLyBleGVjdXRhYmxlRmlsZSBhbmQgZXhlY3V0YWJsZURpciBtaWdodCBiZSBmdWxsIHBhdGgsIG9yIGp1c3QgYSBuYW1lXG4gICAgbGV0IGV4ZWN1dGFibGVGaWxlID1cbiAgICAgIHN1YmNvbW1hbmQuX2V4ZWN1dGFibGVGaWxlIHx8IGAke3RoaXMuX25hbWV9LSR7c3ViY29tbWFuZC5fbmFtZX1gO1xuICAgIGxldCBleGVjdXRhYmxlRGlyID0gdGhpcy5fZXhlY3V0YWJsZURpciB8fCAnJztcbiAgICBpZiAodGhpcy5fc2NyaXB0UGF0aCkge1xuICAgICAgbGV0IHJlc29sdmVkU2NyaXB0UGF0aDsgLy8gcmVzb2x2ZSBwb3NzaWJsZSBzeW1saW5rIGZvciBpbnN0YWxsZWQgbnBtIGJpbmFyeVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZWRTY3JpcHRQYXRoID0gZnMucmVhbHBhdGhTeW5jKHRoaXMuX3NjcmlwdFBhdGgpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlc29sdmVkU2NyaXB0UGF0aCA9IHRoaXMuX3NjcmlwdFBhdGg7XG4gICAgICB9XG4gICAgICBleGVjdXRhYmxlRGlyID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICBwYXRoLmRpcm5hbWUocmVzb2x2ZWRTY3JpcHRQYXRoKSxcbiAgICAgICAgZXhlY3V0YWJsZURpcixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTG9vayBmb3IgYSBsb2NhbCBmaWxlIGluIHByZWZlcmVuY2UgdG8gYSBjb21tYW5kIGluIFBBVEguXG4gICAgaWYgKGV4ZWN1dGFibGVEaXIpIHtcbiAgICAgIGxldCBsb2NhbEZpbGUgPSBmaW5kRmlsZShleGVjdXRhYmxlRGlyLCBleGVjdXRhYmxlRmlsZSk7XG5cbiAgICAgIC8vIExlZ2FjeSBzZWFyY2ggdXNpbmcgcHJlZml4IG9mIHNjcmlwdCBuYW1lIGluc3RlYWQgb2YgY29tbWFuZCBuYW1lXG4gICAgICBpZiAoIWxvY2FsRmlsZSAmJiAhc3ViY29tbWFuZC5fZXhlY3V0YWJsZUZpbGUgJiYgdGhpcy5fc2NyaXB0UGF0aCkge1xuICAgICAgICBjb25zdCBsZWdhY3lOYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgICB0aGlzLl9zY3JpcHRQYXRoLFxuICAgICAgICAgIHBhdGguZXh0bmFtZSh0aGlzLl9zY3JpcHRQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGxlZ2FjeU5hbWUgIT09IHRoaXMuX25hbWUpIHtcbiAgICAgICAgICBsb2NhbEZpbGUgPSBmaW5kRmlsZShcbiAgICAgICAgICAgIGV4ZWN1dGFibGVEaXIsXG4gICAgICAgICAgICBgJHtsZWdhY3lOYW1lfS0ke3N1YmNvbW1hbmQuX25hbWV9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBleGVjdXRhYmxlRmlsZSA9IGxvY2FsRmlsZSB8fCBleGVjdXRhYmxlRmlsZTtcbiAgICB9XG5cbiAgICBsYXVuY2hXaXRoTm9kZSA9IHNvdXJjZUV4dC5pbmNsdWRlcyhwYXRoLmV4dG5hbWUoZXhlY3V0YWJsZUZpbGUpKTtcblxuICAgIGxldCBwcm9jO1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSAnd2luMzInKSB7XG4gICAgICBpZiAobGF1bmNoV2l0aE5vZGUpIHtcbiAgICAgICAgYXJncy51bnNoaWZ0KGV4ZWN1dGFibGVGaWxlKTtcbiAgICAgICAgLy8gYWRkIGV4ZWN1dGFibGUgYXJndW1lbnRzIHRvIHNwYXduXG4gICAgICAgIGFyZ3MgPSBpbmNyZW1lbnROb2RlSW5zcGVjdG9yUG9ydChwcm9jZXNzLmV4ZWNBcmd2KS5jb25jYXQoYXJncyk7XG5cbiAgICAgICAgcHJvYyA9IGNoaWxkUHJvY2Vzcy5zcGF3bihwcm9jZXNzLmFyZ3ZbMF0sIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2MgPSBjaGlsZFByb2Nlc3Muc3Bhd24oZXhlY3V0YWJsZUZpbGUsIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXJncy51bnNoaWZ0KGV4ZWN1dGFibGVGaWxlKTtcbiAgICAgIC8vIGFkZCBleGVjdXRhYmxlIGFyZ3VtZW50cyB0byBzcGF3blxuICAgICAgYXJncyA9IGluY3JlbWVudE5vZGVJbnNwZWN0b3JQb3J0KHByb2Nlc3MuZXhlY0FyZ3YpLmNvbmNhdChhcmdzKTtcbiAgICAgIHByb2MgPSBjaGlsZFByb2Nlc3Muc3Bhd24ocHJvY2Vzcy5leGVjUGF0aCwgYXJncywgeyBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIH1cblxuICAgIGlmICghcHJvYy5raWxsZWQpIHtcbiAgICAgIC8vIHRlc3RpbmcgbWFpbmx5IHRvIGF2b2lkIGxlYWsgd2FybmluZ3MgZHVyaW5nIHVuaXQgdGVzdHMgd2l0aCBtb2NrZWQgc3Bhd25cbiAgICAgIGNvbnN0IHNpZ25hbHMgPSBbJ1NJR1VTUjEnLCAnU0lHVVNSMicsICdTSUdURVJNJywgJ1NJR0lOVCcsICdTSUdIVVAnXTtcbiAgICAgIHNpZ25hbHMuZm9yRWFjaCgoc2lnbmFsKSA9PiB7XG4gICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHByb2Mua2lsbGVkID09PSBmYWxzZSAmJiBwcm9jLmV4aXRDb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIGJlY2F1c2Ugc2lnbmFscyBub3QgdHlwZWQgdG8ga25vd24gc3RyaW5nc1xuICAgICAgICAgICAgcHJvYy5raWxsKHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQgdGVybWluYXRlIHByb2Nlc3Mgd2hlbiBzcGF3bmVkIHByb2Nlc3MgdGVybWluYXRlcy5cbiAgICBjb25zdCBleGl0Q2FsbGJhY2sgPSB0aGlzLl9leGl0Q2FsbGJhY2s7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoY29kZSkgPT4ge1xuICAgICAgY29kZSA9IGNvZGUgPz8gMTsgLy8gY29kZSBpcyBudWxsIGlmIHNwYXduZWQgcHJvY2VzcyB0ZXJtaW5hdGVkIGR1ZSB0byBhIHNpZ25hbFxuICAgICAgaWYgKCFleGl0Q2FsbGJhY2spIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpdENhbGxiYWNrKFxuICAgICAgICAgIG5ldyBDb21tYW5kZXJFcnJvcihcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnLFxuICAgICAgICAgICAgJyhjbG9zZSknLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAvLyBAdHMtaWdub3JlOiBiZWNhdXNlIGVyci5jb2RlIGlzIGFuIHVua25vd24gcHJvcGVydHlcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgY29uc3QgZXhlY3V0YWJsZURpck1lc3NhZ2UgPSBleGVjdXRhYmxlRGlyXG4gICAgICAgICAgPyBgc2VhcmNoZWQgZm9yIGxvY2FsIHN1YmNvbW1hbmQgcmVsYXRpdmUgdG8gZGlyZWN0b3J5ICcke2V4ZWN1dGFibGVEaXJ9J2BcbiAgICAgICAgICA6ICdubyBkaXJlY3RvcnkgZm9yIHNlYXJjaCBmb3IgbG9jYWwgc3ViY29tbWFuZCwgdXNlIC5leGVjdXRhYmxlRGlyKCkgdG8gc3VwcGx5IGEgY3VzdG9tIGRpcmVjdG9yeSc7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGFibGVNaXNzaW5nID0gYCcke2V4ZWN1dGFibGVGaWxlfScgZG9lcyBub3QgZXhpc3RcbiAtIGlmICcke3N1YmNvbW1hbmQuX25hbWV9JyBpcyBub3QgbWVhbnQgdG8gYmUgYW4gZXhlY3V0YWJsZSBjb21tYW5kLCByZW1vdmUgZGVzY3JpcHRpb24gcGFyYW1ldGVyIGZyb20gJy5jb21tYW5kKCknIGFuZCB1c2UgJy5kZXNjcmlwdGlvbigpJyBpbnN0ZWFkXG4gLSBpZiB0aGUgZGVmYXVsdCBleGVjdXRhYmxlIG5hbWUgaXMgbm90IHN1aXRhYmxlLCB1c2UgdGhlIGV4ZWN1dGFibGVGaWxlIG9wdGlvbiB0byBzdXBwbHkgYSBjdXN0b20gbmFtZSBvciBwYXRoXG4gLSAke2V4ZWN1dGFibGVEaXJNZXNzYWdlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihleGVjdXRhYmxlTWlzc2luZyk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2UgZXJyLmNvZGUgaXMgYW4gdW5rbm93biBwcm9wZXJ0eVxuICAgICAgfSBlbHNlIGlmIChlcnIuY29kZSA9PT0gJ0VBQ0NFUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtleGVjdXRhYmxlRmlsZX0nIG5vdCBleGVjdXRhYmxlYCk7XG4gICAgICB9XG4gICAgICBpZiAoIWV4aXRDYWxsYmFjaykge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB3cmFwcGVkRXJyb3IgPSBuZXcgQ29tbWFuZGVyRXJyb3IoXG4gICAgICAgICAgMSxcbiAgICAgICAgICAnY29tbWFuZGVyLmV4ZWN1dGVTdWJDb21tYW5kQXN5bmMnLFxuICAgICAgICAgICcoZXJyb3IpJyxcbiAgICAgICAgKTtcbiAgICAgICAgd3JhcHBlZEVycm9yLm5lc3RlZEVycm9yID0gZXJyO1xuICAgICAgICBleGl0Q2FsbGJhY2sod3JhcHBlZEVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGNoaWxkIHByb2Nlc3NcbiAgICB0aGlzLnJ1bm5pbmdDb21tYW5kID0gcHJvYztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZGlzcGF0Y2hTdWJjb21tYW5kKGNvbW1hbmROYW1lLCBvcGVyYW5kcywgdW5rbm93bikge1xuICAgIGNvbnN0IHN1YkNvbW1hbmQgPSB0aGlzLl9maW5kQ29tbWFuZChjb21tYW5kTmFtZSk7XG4gICAgaWYgKCFzdWJDb21tYW5kKSB0aGlzLmhlbHAoeyBlcnJvcjogdHJ1ZSB9KTtcblxuICAgIGxldCBwcm9taXNlQ2hhaW47XG4gICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGxTdWJDb21tYW5kSG9vayhcbiAgICAgIHByb21pc2VDaGFpbixcbiAgICAgIHN1YkNvbW1hbmQsXG4gICAgICAncHJlU3ViY29tbWFuZCcsXG4gICAgKTtcbiAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbChwcm9taXNlQ2hhaW4sICgpID0+IHtcbiAgICAgIGlmIChzdWJDb21tYW5kLl9leGVjdXRhYmxlSGFuZGxlcikge1xuICAgICAgICB0aGlzLl9leGVjdXRlU3ViQ29tbWFuZChzdWJDb21tYW5kLCBvcGVyYW5kcy5jb25jYXQodW5rbm93bikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN1YkNvbW1hbmQuX3BhcnNlQ29tbWFuZChvcGVyYW5kcywgdW5rbm93bik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb21pc2VDaGFpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgaGVscCBkaXJlY3RseSBpZiBwb3NzaWJsZSwgb3IgZGlzcGF0Y2ggaWYgbmVjZXNzYXJ5LlxuICAgKiBlLmcuIGhlbHAgZm9vXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9kaXNwYXRjaEhlbHBDb21tYW5kKHN1YmNvbW1hbmROYW1lKSB7XG4gICAgaWYgKCFzdWJjb21tYW5kTmFtZSkge1xuICAgICAgdGhpcy5oZWxwKCk7XG4gICAgfVxuICAgIGNvbnN0IHN1YkNvbW1hbmQgPSB0aGlzLl9maW5kQ29tbWFuZChzdWJjb21tYW5kTmFtZSk7XG4gICAgaWYgKHN1YkNvbW1hbmQgJiYgIXN1YkNvbW1hbmQuX2V4ZWN1dGFibGVIYW5kbGVyKSB7XG4gICAgICBzdWJDb21tYW5kLmhlbHAoKTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBwYXJzaW5nIHRoZSBoZWxwIGZsYWcgdG8gaW52b2tlIHRoZSBoZWxwLlxuICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoXG4gICAgICBzdWJjb21tYW5kTmFtZSxcbiAgICAgIFtdLFxuICAgICAgW3RoaXMuX2dldEhlbHBPcHRpb24oKT8ubG9uZyA/PyB0aGlzLl9nZXRIZWxwT3B0aW9uKCk/LnNob3J0ID8/ICctLWhlbHAnXSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoaXMuYXJncyBhZ2FpbnN0IGV4cGVjdGVkIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoZWNrTnVtYmVyT2ZBcmd1bWVudHMoKSB7XG4gICAgLy8gdG9vIGZld1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChhcmcsIGkpID0+IHtcbiAgICAgIGlmIChhcmcucmVxdWlyZWQgJiYgdGhpcy5hcmdzW2ldID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5taXNzaW5nQXJndW1lbnQoYXJnLm5hbWUoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gdG9vIG1hbnlcbiAgICBpZiAoXG4gICAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzW3RoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGggLSAxXS52YXJpYWRpY1xuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5hcmdzLmxlbmd0aCA+IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2V4Y2Vzc0FyZ3VtZW50cyh0aGlzLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHRoaXMuYXJncyB1c2luZyB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMgYW5kIHNhdmUgYXMgdGhpcy5wcm9jZXNzZWRBcmdzIVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcHJvY2Vzc0FyZ3VtZW50cygpIHtcbiAgICBjb25zdCBteVBhcnNlQXJnID0gKGFyZ3VtZW50LCB2YWx1ZSwgcHJldmlvdXMpID0+IHtcbiAgICAgIC8vIEV4dHJhIHByb2Nlc3NpbmcgZm9yIG5pY2UgZXJyb3IgbWVzc2FnZSBvbiBwYXJzaW5nIGZhaWx1cmUuXG4gICAgICBsZXQgcGFyc2VkVmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiBhcmd1bWVudC5wYXJzZUFyZykge1xuICAgICAgICBjb25zdCBpbnZhbGlkVmFsdWVNZXNzYWdlID0gYGVycm9yOiBjb21tYW5kLWFyZ3VtZW50IHZhbHVlICcke3ZhbHVlfScgaXMgaW52YWxpZCBmb3IgYXJndW1lbnQgJyR7YXJndW1lbnQubmFtZSgpfScuYDtcbiAgICAgICAgcGFyc2VkVmFsdWUgPSB0aGlzLl9jYWxsUGFyc2VBcmcoXG4gICAgICAgICAgYXJndW1lbnQsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgcHJldmlvdXMsXG4gICAgICAgICAgaW52YWxpZFZhbHVlTWVzc2FnZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgICB9O1xuXG4gICAgdGhpcy5fY2hlY2tOdW1iZXJPZkFyZ3VtZW50cygpO1xuXG4gICAgY29uc3QgcHJvY2Vzc2VkQXJncyA9IFtdO1xuICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChkZWNsYXJlZEFyZywgaW5kZXgpID0+IHtcbiAgICAgIGxldCB2YWx1ZSA9IGRlY2xhcmVkQXJnLmRlZmF1bHRWYWx1ZTtcbiAgICAgIGlmIChkZWNsYXJlZEFyZy52YXJpYWRpYykge1xuICAgICAgICAvLyBDb2xsZWN0IHRvZ2V0aGVyIHJlbWFpbmluZyBhcmd1bWVudHMgZm9yIHBhc3NpbmcgdG9nZXRoZXIgYXMgYW4gYXJyYXkuXG4gICAgICAgIGlmIChpbmRleCA8IHRoaXMuYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuYXJncy5zbGljZShpbmRleCk7XG4gICAgICAgICAgaWYgKGRlY2xhcmVkQXJnLnBhcnNlQXJnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlZHVjZSgocHJvY2Vzc2VkLCB2KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBteVBhcnNlQXJnKGRlY2xhcmVkQXJnLCB2LCBwcm9jZXNzZWQpO1xuICAgICAgICAgICAgfSwgZGVjbGFyZWRBcmcuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhbHVlID0gW107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaW5kZXggPCB0aGlzLmFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5hcmdzW2luZGV4XTtcbiAgICAgICAgaWYgKGRlY2xhcmVkQXJnLnBhcnNlQXJnKSB7XG4gICAgICAgICAgdmFsdWUgPSBteVBhcnNlQXJnKGRlY2xhcmVkQXJnLCB2YWx1ZSwgZGVjbGFyZWRBcmcuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJvY2Vzc2VkQXJnc1tpbmRleF0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICB0aGlzLnByb2Nlc3NlZEFyZ3MgPSBwcm9jZXNzZWRBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uY2Ugd2UgaGF2ZSBhIHByb21pc2Ugd2UgY2hhaW4sIGJ1dCBjYWxsIHN5bmNocm9ub3VzbHkgdW50aWwgdGhlbi5cbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEByZXR1cm4geyhQcm9taXNlfHVuZGVmaW5lZCl9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGFpbk9yQ2FsbChwcm9taXNlLCBmbikge1xuICAgIC8vIHRoZW5hYmxlXG4gICAgaWYgKHByb21pc2UgJiYgcHJvbWlzZS50aGVuICYmIHR5cGVvZiBwcm9taXNlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIGFscmVhZHkgaGF2ZSBhIHByb21pc2UsIGNoYWluIGNhbGxiYWNrXG4gICAgICByZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IGZuKCkpO1xuICAgIH1cbiAgICAvLyBjYWxsYmFjayBtaWdodCByZXR1cm4gYSBwcm9taXNlXG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcmV0dXJuIHsoUHJvbWlzZXx1bmRlZmluZWQpfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hhaW5PckNhbGxIb29rcyhwcm9taXNlLCBldmVudCkge1xuICAgIGxldCByZXN1bHQgPSBwcm9taXNlO1xuICAgIGNvbnN0IGhvb2tzID0gW107XG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmlsdGVyKChjbWQpID0+IGNtZC5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdICE9PSB1bmRlZmluZWQpXG4gICAgICAuZm9yRWFjaCgoaG9va2VkQ29tbWFuZCkgPT4ge1xuICAgICAgICBob29rZWRDb21tYW5kLl9saWZlQ3ljbGVIb29rc1tldmVudF0uZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgICAgICBob29rcy5wdXNoKHsgaG9va2VkQ29tbWFuZCwgY2FsbGJhY2sgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgaWYgKGV2ZW50ID09PSAncG9zdEFjdGlvbicpIHtcbiAgICAgIGhvb2tzLnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICBob29rcy5mb3JFYWNoKChob29rRGV0YWlsKSA9PiB7XG4gICAgICByZXN1bHQgPSB0aGlzLl9jaGFpbk9yQ2FsbChyZXN1bHQsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGhvb2tEZXRhaWwuY2FsbGJhY2soaG9va0RldGFpbC5ob29rZWRDb21tYW5kLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHsoUHJvbWlzZXx1bmRlZmluZWQpfSBwcm9taXNlXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gc3ViQ29tbWFuZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHJldHVybiB7KFByb21pc2V8dW5kZWZpbmVkKX1cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoYWluT3JDYWxsU3ViQ29tbWFuZEhvb2socHJvbWlzZSwgc3ViQ29tbWFuZCwgZXZlbnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gcHJvbWlzZTtcbiAgICBpZiAodGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XS5mb3JFYWNoKChob29rKSA9PiB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2NoYWluT3JDYWxsKHJlc3VsdCwgKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBob29rKHRoaXMsIHN1YkNvbW1hbmQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYXJndW1lbnRzIGluIGNvbnRleHQgb2YgdGhpcyBjb21tYW5kLlxuICAgKiBSZXR1cm5zIGFjdGlvbiByZXN1bHQsIGluIGNhc2UgaXQgaXMgYSBwcm9taXNlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcGFyc2VDb21tYW5kKG9wZXJhbmRzLCB1bmtub3duKSB7XG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZU9wdGlvbnModW5rbm93bik7XG4gICAgdGhpcy5fcGFyc2VPcHRpb25zRW52KCk7IC8vIGFmdGVyIGNsaSwgc28gcGFyc2VBcmcgbm90IGNhbGxlZCBvbiBib3RoIGNsaSBhbmQgZW52XG4gICAgdGhpcy5fcGFyc2VPcHRpb25zSW1wbGllZCgpO1xuICAgIG9wZXJhbmRzID0gb3BlcmFuZHMuY29uY2F0KHBhcnNlZC5vcGVyYW5kcyk7XG4gICAgdW5rbm93biA9IHBhcnNlZC51bmtub3duO1xuICAgIHRoaXMuYXJncyA9IG9wZXJhbmRzLmNvbmNhdCh1bmtub3duKTtcblxuICAgIGlmIChvcGVyYW5kcyAmJiB0aGlzLl9maW5kQ29tbWFuZChvcGVyYW5kc1swXSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQob3BlcmFuZHNbMF0sIG9wZXJhbmRzLnNsaWNlKDEpLCB1bmtub3duKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5fZ2V0SGVscENvbW1hbmQoKSAmJlxuICAgICAgb3BlcmFuZHNbMF0gPT09IHRoaXMuX2dldEhlbHBDb21tYW5kKCkubmFtZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hIZWxwQ29tbWFuZChvcGVyYW5kc1sxXSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWUpIHtcbiAgICAgIHRoaXMuX291dHB1dEhlbHBJZlJlcXVlc3RlZCh1bmtub3duKTsgLy8gUnVuIHRoZSBoZWxwIGZvciBkZWZhdWx0IGNvbW1hbmQgZnJvbSBwYXJlbnQgcmF0aGVyIHRoYW4gcGFzc2luZyB0byBkZWZhdWx0IGNvbW1hbmRcbiAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoXG4gICAgICAgIHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSxcbiAgICAgICAgb3BlcmFuZHMsXG4gICAgICAgIHVua25vd24sXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbW1hbmRzLmxlbmd0aCAmJlxuICAgICAgdGhpcy5hcmdzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgIXRoaXMuX2FjdGlvbkhhbmRsZXIgJiZcbiAgICAgICF0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWVcbiAgICApIHtcbiAgICAgIC8vIHByb2JhYmx5IG1pc3Npbmcgc3ViY29tbWFuZCBhbmQgbm8gaGFuZGxlciwgdXNlciBuZWVkcyBoZWxwIChhbmQgZXhpdClcbiAgICAgIHRoaXMuaGVscCh7IGVycm9yOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX291dHB1dEhlbHBJZlJlcXVlc3RlZChwYXJzZWQudW5rbm93bik7XG4gICAgdGhpcy5fY2hlY2tGb3JNaXNzaW5nTWFuZGF0b3J5T3B0aW9ucygpO1xuICAgIHRoaXMuX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCk7XG5cbiAgICAvLyBXZSBkbyBub3QgYWx3YXlzIGNhbGwgdGhpcyBjaGVjayB0byBhdm9pZCBtYXNraW5nIGEgXCJiZXR0ZXJcIiBlcnJvciwgbGlrZSB1bmtub3duIGNvbW1hbmQuXG4gICAgY29uc3QgY2hlY2tGb3JVbmtub3duT3B0aW9ucyA9ICgpID0+IHtcbiAgICAgIGlmIChwYXJzZWQudW5rbm93bi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMudW5rbm93bk9wdGlvbihwYXJzZWQudW5rbm93blswXSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbW1hbmRFdmVudCA9IGBjb21tYW5kOiR7dGhpcy5uYW1lKCl9YDtcbiAgICBpZiAodGhpcy5fYWN0aW9uSGFuZGxlcikge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgdGhpcy5fcHJvY2Vzc0FyZ3VtZW50cygpO1xuXG4gICAgICBsZXQgcHJvbWlzZUNoYWluO1xuICAgICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGxIb29rcyhwcm9taXNlQ2hhaW4sICdwcmVBY3Rpb24nKTtcbiAgICAgIHByb21pc2VDaGFpbiA9IHRoaXMuX2NoYWluT3JDYWxsKHByb21pc2VDaGFpbiwgKCkgPT5cbiAgICAgICAgdGhpcy5fYWN0aW9uSGFuZGxlcih0aGlzLnByb2Nlc3NlZEFyZ3MpLFxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbChwcm9taXNlQ2hhaW4sICgpID0+IHtcbiAgICAgICAgICB0aGlzLnBhcmVudC5lbWl0KGNvbW1hbmRFdmVudCwgb3BlcmFuZHMsIHVua25vd24pOyAvLyBsZWdhY3lcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbEhvb2tzKHByb21pc2VDaGFpbiwgJ3Bvc3RBY3Rpb24nKTtcbiAgICAgIHJldHVybiBwcm9taXNlQ2hhaW47XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5saXN0ZW5lckNvdW50KGNvbW1hbmRFdmVudCkpIHtcbiAgICAgIGNoZWNrRm9yVW5rbm93bk9wdGlvbnMoKTtcbiAgICAgIHRoaXMuX3Byb2Nlc3NBcmd1bWVudHMoKTtcbiAgICAgIHRoaXMucGFyZW50LmVtaXQoY29tbWFuZEV2ZW50LCBvcGVyYW5kcywgdW5rbm93bik7IC8vIGxlZ2FjeVxuICAgIH0gZWxzZSBpZiAob3BlcmFuZHMubGVuZ3RoKSB7XG4gICAgICBpZiAodGhpcy5fZmluZENvbW1hbmQoJyonKSkge1xuICAgICAgICAvLyBsZWdhY3kgZGVmYXVsdCBjb21tYW5kXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaFN1YmNvbW1hbmQoJyonLCBvcGVyYW5kcywgdW5rbm93bik7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50KCdjb21tYW5kOionKSkge1xuICAgICAgICAvLyBza2lwIG9wdGlvbiBjaGVjaywgZW1pdCBldmVudCBmb3IgcG9zc2libGUgbWlzc3BlbGxpbmcgc3VnZ2VzdGlvblxuICAgICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6KicsIG9wZXJhbmRzLCB1bmtub3duKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51bmtub3duQ29tbWFuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgICB0aGlzLl9wcm9jZXNzQXJndW1lbnRzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbW1hbmRzLmxlbmd0aCkge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgLy8gVGhpcyBjb21tYW5kIGhhcyBzdWJjb21tYW5kcyBhbmQgbm90aGluZyBob29rZWQgdXAgYXQgdGhpcyBsZXZlbCwgc28gZGlzcGxheSBoZWxwIChhbmQgZXhpdCkuXG4gICAgICB0aGlzLmhlbHAoeyBlcnJvcjogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2tGb3JVbmtub3duT3B0aW9ucygpO1xuICAgICAgdGhpcy5fcHJvY2Vzc0FyZ3VtZW50cygpO1xuICAgICAgLy8gZmFsbCB0aHJvdWdoIGZvciBjYWxsZXIgdG8gaGFuZGxlIGFmdGVyIGNhbGxpbmcgLnBhcnNlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtYXRjaGluZyBjb21tYW5kLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJuIHtDb21tYW5kIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgX2ZpbmRDb21tYW5kKG5hbWUpIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZHMuZmluZChcbiAgICAgIChjbWQpID0+IGNtZC5fbmFtZSA9PT0gbmFtZSB8fCBjbWQuX2FsaWFzZXMuaW5jbHVkZXMobmFtZSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gb3B0aW9uIG1hdGNoaW5nIGBhcmdgIGlmIGFueS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIF9maW5kT3B0aW9uKGFyZykge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24uaXMoYXJnKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGlmIGEgbWFuZGF0b3J5IG9wdGlvbiBkb2VzIG5vdCBoYXZlIGEgdmFsdWUuXG4gICAqIENhbGxlZCBhZnRlciBjaGVja2luZyBmb3IgaGVscCBmbGFncyBpbiBsZWFmIHN1YmNvbW1hbmQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGVja0Zvck1pc3NpbmdNYW5kYXRvcnlPcHRpb25zKCkge1xuICAgIC8vIFdhbGsgdXAgaGllcmFyY2h5IHNvIGNhbiBjYWxsIGluIHN1YmNvbW1hbmQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGRpc3BsYXlpbmcgaGVscC5cbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBjbWQub3B0aW9ucy5mb3JFYWNoKChhbk9wdGlvbikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYW5PcHRpb24ubWFuZGF0b3J5ICYmXG4gICAgICAgICAgY21kLmdldE9wdGlvblZhbHVlKGFuT3B0aW9uLmF0dHJpYnV0ZU5hbWUoKSkgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICBjbWQubWlzc2luZ01hbmRhdG9yeU9wdGlvblZhbHVlKGFuT3B0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGlmIGNvbmZsaWN0aW5nIG9wdGlvbnMgYXJlIHVzZWQgdG9nZXRoZXIgaW4gdGhpcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGVja0ZvckNvbmZsaWN0aW5nTG9jYWxPcHRpb25zKCkge1xuICAgIGNvbnN0IGRlZmluZWROb25EZWZhdWx0T3B0aW9ucyA9IHRoaXMub3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5ID0gb3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIGlmICh0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbktleSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5nZXRPcHRpb25WYWx1ZVNvdXJjZShvcHRpb25LZXkpICE9PSAnZGVmYXVsdCc7XG4gICAgfSk7XG5cbiAgICBjb25zdCBvcHRpb25zV2l0aENvbmZsaWN0aW5nID0gZGVmaW5lZE5vbkRlZmF1bHRPcHRpb25zLmZpbHRlcihcbiAgICAgIChvcHRpb24pID0+IG9wdGlvbi5jb25mbGljdHNXaXRoLmxlbmd0aCA+IDAsXG4gICAgKTtcblxuICAgIG9wdGlvbnNXaXRoQ29uZmxpY3RpbmcuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBjb25zdCBjb25mbGljdGluZ0FuZERlZmluZWQgPSBkZWZpbmVkTm9uRGVmYXVsdE9wdGlvbnMuZmluZCgoZGVmaW5lZCkgPT5cbiAgICAgICAgb3B0aW9uLmNvbmZsaWN0c1dpdGguaW5jbHVkZXMoZGVmaW5lZC5hdHRyaWJ1dGVOYW1lKCkpLFxuICAgICAgKTtcbiAgICAgIGlmIChjb25mbGljdGluZ0FuZERlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fY29uZmxpY3RpbmdPcHRpb24ob3B0aW9uLCBjb25mbGljdGluZ0FuZERlZmluZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBpZiBjb25mbGljdGluZyBvcHRpb25zIGFyZSB1c2VkIHRvZ2V0aGVyLlxuICAgKiBDYWxsZWQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGhlbHAgZmxhZ3MgaW4gbGVhZiBzdWJjb21tYW5kLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NoZWNrRm9yQ29uZmxpY3RpbmdPcHRpb25zKCkge1xuICAgIC8vIFdhbGsgdXAgaGllcmFyY2h5IHNvIGNhbiBjYWxsIGluIHN1YmNvbW1hbmQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGRpc3BsYXlpbmcgaGVscC5cbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY21kKSA9PiB7XG4gICAgICBjbWQuX2NoZWNrRm9yQ29uZmxpY3RpbmdMb2NhbE9wdGlvbnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBvcHRpb25zIGZyb20gYGFyZ3ZgIHJlbW92aW5nIGtub3duIG9wdGlvbnMsXG4gICAqIGFuZCByZXR1cm4gYXJndiBzcGxpdCBpbnRvIG9wZXJhbmRzIGFuZCB1bmtub3duIGFyZ3VtZW50cy5cbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqXG4gICAqICAgICBhcmd2ID0+IG9wZXJhbmRzLCB1bmtub3duXG4gICAqICAgICAtLWtub3duIGtrayBvcCA9PiBbb3BdLCBbXVxuICAgKiAgICAgb3AgLS1rbm93biBra2sgPT4gW29wXSwgW11cbiAgICogICAgIHN1YiAtLXVua25vd24gdXV1IG9wID0+IFtzdWJdLCBbLS11bmtub3duIHV1dSBvcF1cbiAgICogICAgIHN1YiAtLSAtLXVua25vd24gdXV1IG9wID0+IFtzdWIgLS11bmtub3duIHV1dSBvcF0sIFtdXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3ZcbiAgICogQHJldHVybiB7e29wZXJhbmRzOiBzdHJpbmdbXSwgdW5rbm93bjogc3RyaW5nW119fVxuICAgKi9cblxuICBwYXJzZU9wdGlvbnMoYXJndikge1xuICAgIGNvbnN0IG9wZXJhbmRzID0gW107IC8vIG9wZXJhbmRzLCBub3Qgb3B0aW9ucyBvciB2YWx1ZXNcbiAgICBjb25zdCB1bmtub3duID0gW107IC8vIGZpcnN0IHVua25vd24gb3B0aW9uIGFuZCByZW1haW5pbmcgdW5rbm93biBhcmdzXG4gICAgbGV0IGRlc3QgPSBvcGVyYW5kcztcbiAgICBjb25zdCBhcmdzID0gYXJndi5zbGljZSgpO1xuXG4gICAgZnVuY3Rpb24gbWF5YmVPcHRpb24oYXJnKSB7XG4gICAgICByZXR1cm4gYXJnLmxlbmd0aCA+IDEgJiYgYXJnWzBdID09PSAnLSc7XG4gICAgfVxuXG4gICAgLy8gcGFyc2Ugb3B0aW9uc1xuICAgIGxldCBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG51bGw7XG4gICAgd2hpbGUgKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjb25zdCBhcmcgPSBhcmdzLnNoaWZ0KCk7XG5cbiAgICAgIC8vIGxpdGVyYWxcbiAgICAgIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgICAgaWYgKGRlc3QgPT09IHVua25vd24pIGRlc3QucHVzaChhcmcpO1xuICAgICAgICBkZXN0LnB1c2goLi4uYXJncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0aXZlVmFyaWFkaWNPcHRpb24gJiYgIW1heWJlT3B0aW9uKGFyZykpIHtcbiAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHthY3RpdmVWYXJpYWRpY09wdGlvbi5uYW1lKCl9YCwgYXJnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG51bGw7XG5cbiAgICAgIGlmIChtYXliZU9wdGlvbihhcmcpKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2ZpbmRPcHRpb24oYXJnKTtcbiAgICAgICAgLy8gcmVjb2duaXNlZCBvcHRpb24sIGNhbGwgbGlzdGVuZXIgdG8gYXNzaWduIHZhbHVlIHdpdGggcG9zc2libGUgY3VzdG9tIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgIGlmIChvcHRpb24ucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXJncy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHRoaXMub3B0aW9uTWlzc2luZ0FyZ3VtZW50KG9wdGlvbik7XG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9uLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgLy8gaGlzdG9yaWNhbCBiZWhhdmlvdXIgaXMgb3B0aW9uYWwgdmFsdWUgaXMgZm9sbG93aW5nIGFyZyB1bmxlc3MgYW4gb3B0aW9uXG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwICYmICFtYXliZU9wdGlvbihhcmdzWzBdKSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7b3B0aW9uLm5hbWUoKX1gLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJvb2xlYW4gZmxhZ1xuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmVWYXJpYWRpY09wdGlvbiA9IG9wdGlvbi52YXJpYWRpYyA/IG9wdGlvbiA6IG51bGw7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9vayBmb3IgY29tYm8gb3B0aW9ucyBmb2xsb3dpbmcgc2luZ2xlIGRhc2gsIGVhdCBmaXJzdCBvbmUgaWYga25vd24uXG4gICAgICBpZiAoYXJnLmxlbmd0aCA+IDIgJiYgYXJnWzBdID09PSAnLScgJiYgYXJnWzFdICE9PSAnLScpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZmluZE9wdGlvbihgLSR7YXJnWzFdfWApO1xuICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgb3B0aW9uLnJlcXVpcmVkIHx8XG4gICAgICAgICAgICAob3B0aW9uLm9wdGlvbmFsICYmIHRoaXMuX2NvbWJpbmVGbGFnQW5kT3B0aW9uYWxWYWx1ZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIG9wdGlvbiB3aXRoIHZhbHVlIGZvbGxvd2luZyBpbiBzYW1lIGFyZ3VtZW50XG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCwgYXJnLnNsaWNlKDIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYm9vbGVhbiBvcHRpb24sIGVtaXQgYW5kIHB1dCBiYWNrIHJlbWFpbmRlciBvZiBhcmcgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgICAgYXJncy51bnNoaWZ0KGAtJHthcmcuc2xpY2UoMil9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvb2sgZm9yIGtub3duIGxvbmcgZmxhZyB3aXRoIHZhbHVlLCBsaWtlIC0tZm9vPWJhclxuICAgICAgaWYgKC9eLS1bXj1dKz0vLnRlc3QoYXJnKSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGFyZy5pbmRleE9mKCc9Jyk7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2ZpbmRPcHRpb24oYXJnLnNsaWNlKDAsIGluZGV4KSk7XG4gICAgICAgIGlmIChvcHRpb24gJiYgKG9wdGlvbi5yZXF1aXJlZCB8fCBvcHRpb24ub3B0aW9uYWwpKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWAsIGFyZy5zbGljZShpbmRleCArIDEpKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOb3QgYSByZWNvZ25pc2VkIG9wdGlvbiBieSB0aGlzIGNvbW1hbmQuXG4gICAgICAvLyBNaWdodCBiZSBhIGNvbW1hbmQtYXJndW1lbnQsIG9yIHN1YmNvbW1hbmQgb3B0aW9uLCBvciB1bmtub3duIG9wdGlvbiwgb3IgaGVscCBjb21tYW5kIG9yIG9wdGlvbi5cblxuICAgICAgLy8gQW4gdW5rbm93biBvcHRpb24gbWVhbnMgZnVydGhlciBhcmd1bWVudHMgYWxzbyBjbGFzc2lmaWVkIGFzIHVua25vd24gc28gY2FuIGJlIHJlcHJvY2Vzc2VkIGJ5IHN1YmNvbW1hbmRzLlxuICAgICAgaWYgKG1heWJlT3B0aW9uKGFyZykpIHtcbiAgICAgICAgZGVzdCA9IHVua25vd247XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHVzaW5nIHBvc2l0aW9uYWxPcHRpb25zLCBzdG9wIHByb2Nlc3Npbmcgb3VyIG9wdGlvbnMgYXQgc3ViY29tbWFuZC5cbiAgICAgIGlmIChcbiAgICAgICAgKHRoaXMuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zIHx8IHRoaXMuX3Bhc3NUaHJvdWdoT3B0aW9ucykgJiZcbiAgICAgICAgb3BlcmFuZHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgIHVua25vd24ubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmRDb21tYW5kKGFyZykpIHtcbiAgICAgICAgICBvcGVyYW5kcy5wdXNoKGFyZyk7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgdW5rbm93bi5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMuX2dldEhlbHBDb21tYW5kKCkgJiZcbiAgICAgICAgICBhcmcgPT09IHRoaXMuX2dldEhlbHBDb21tYW5kKCkubmFtZSgpXG4gICAgICAgICkge1xuICAgICAgICAgIG9wZXJhbmRzLnB1c2goYXJnKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSBvcGVyYW5kcy5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSkge1xuICAgICAgICAgIHVua25vd24ucHVzaChhcmcpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHVua25vd24ucHVzaCguLi5hcmdzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB1c2luZyBwYXNzVGhyb3VnaE9wdGlvbnMsIHN0b3AgcHJvY2Vzc2luZyBvcHRpb25zIGF0IGZpcnN0IGNvbW1hbmQtYXJndW1lbnQuXG4gICAgICBpZiAodGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zKSB7XG4gICAgICAgIGRlc3QucHVzaChhcmcpO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSBkZXN0LnB1c2goLi4uYXJncyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBhZGQgYXJnXG4gICAgICBkZXN0LnB1c2goYXJnKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBvcGVyYW5kcywgdW5rbm93biB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBsb2NhbCBvcHRpb24gdmFsdWVzIGFzIGtleS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgb3B0cygpIHtcbiAgICBpZiAodGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKSB7XG4gICAgICAvLyBQcmVzZXJ2ZSBvcmlnaW5hbCBiZWhhdmlvdXIgc28gYmFja3dhcmRzIGNvbXBhdGlibGUgd2hlbiBzdGlsbCB1c2luZyBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgIGNvbnN0IGxlbiA9IHRoaXMub3B0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5vcHRpb25zW2ldLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPVxuICAgICAgICAgIGtleSA9PT0gdGhpcy5fdmVyc2lvbk9wdGlvbk5hbWUgPyB0aGlzLl92ZXJzaW9uIDogdGhpc1trZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uVmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBtZXJnZWQgbG9jYWwgYW5kIGdsb2JhbCBvcHRpb24gdmFsdWVzIGFzIGtleS12YWx1ZSBwYWlycy5cbiAgICpcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgb3B0c1dpdGhHbG9iYWxzKCkge1xuICAgIC8vIGdsb2JhbHMgb3ZlcndyaXRlIGxvY2Fsc1xuICAgIHJldHVybiB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkucmVkdWNlKFxuICAgICAgKGNvbWJpbmVkT3B0aW9ucywgY21kKSA9PiBPYmplY3QuYXNzaWduKGNvbWJpbmVkT3B0aW9ucywgY21kLm9wdHMoKSksXG4gICAgICB7fSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCAob3IgY2FsbCBleGl0T3ZlcnJpZGUpLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge29iamVjdH0gW2Vycm9yT3B0aW9uc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtlcnJvck9wdGlvbnMuY29kZV0gLSBhbiBpZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlcnJvclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2Vycm9yT3B0aW9ucy5leGl0Q29kZV0gLSB1c2VkIHdpdGggcHJvY2Vzcy5leGl0XG4gICAqL1xuICBlcnJvcihtZXNzYWdlLCBlcnJvck9wdGlvbnMpIHtcbiAgICAvLyBvdXRwdXQgaGFuZGxpbmdcbiAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLm91dHB1dEVycm9yKFxuICAgICAgYCR7bWVzc2FnZX1cXG5gLFxuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZUVycixcbiAgICApO1xuICAgIGlmICh0eXBlb2YgdGhpcy5fc2hvd0hlbHBBZnRlckVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZUVycihgJHt0aGlzLl9zaG93SGVscEFmdGVyRXJyb3J9XFxuYCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zaG93SGVscEFmdGVyRXJyb3IpIHtcbiAgICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIoJ1xcbicpO1xuICAgICAgdGhpcy5vdXRwdXRIZWxwKHsgZXJyb3I6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gZXhpdCBoYW5kbGluZ1xuICAgIGNvbnN0IGNvbmZpZyA9IGVycm9yT3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBleGl0Q29kZSA9IGNvbmZpZy5leGl0Q29kZSB8fCAxO1xuICAgIGNvbnN0IGNvZGUgPSBjb25maWcuY29kZSB8fCAnY29tbWFuZGVyLmVycm9yJztcbiAgICB0aGlzLl9leGl0KGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhbnkgb3B0aW9uIHJlbGF0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBpZiBvcHRpb24gZG9lc1xuICAgKiBub3QgaGF2ZSBhIHZhbHVlIGZyb20gY2xpIG9yIGNsaWVudCBjb2RlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3BhcnNlT3B0aW9uc0VudigpIHtcbiAgICB0aGlzLm9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAob3B0aW9uLmVudlZhciAmJiBvcHRpb24uZW52VmFyIGluIHByb2Nlc3MuZW52KSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICAgIC8vIFByaW9yaXR5IGNoZWNrLiBEbyBub3Qgb3ZlcndyaXRlIGNsaSBvciBvcHRpb25zIGZyb20gdW5rbm93biBzb3VyY2UgKGNsaWVudC1jb2RlKS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgWydkZWZhdWx0JywgJ2NvbmZpZycsICdlbnYnXS5pbmNsdWRlcyhcbiAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KSxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChvcHRpb24ucmVxdWlyZWQgfHwgb3B0aW9uLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAvLyBvcHRpb24gY2FuIHRha2UgYSB2YWx1ZVxuICAgICAgICAgICAgLy8ga2VlcCB2ZXJ5IHNpbXBsZSwgb3B0aW9uYWwgYWx3YXlzIHRha2VzIHZhbHVlXG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbkVudjoke29wdGlvbi5uYW1lKCl9YCwgcHJvY2Vzcy5lbnZbb3B0aW9uLmVudlZhcl0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBib29sZWFuXG4gICAgICAgICAgICAvLyBrZWVwIHZlcnkgc2ltcGxlLCBvbmx5IGNhcmUgdGhhdCBlbnZWYXIgZGVmaW5lZCBhbmQgbm90IHRoZSB2YWx1ZVxuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb25FbnY6JHtvcHRpb24ubmFtZSgpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFueSBpbXBsaWVkIG9wdGlvbiB2YWx1ZXMsIGlmIG9wdGlvbiBpcyB1bmRlZmluZWQgb3IgZGVmYXVsdCB2YWx1ZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wYXJzZU9wdGlvbnNJbXBsaWVkKCkge1xuICAgIGNvbnN0IGR1YWxIZWxwZXIgPSBuZXcgRHVhbE9wdGlvbnModGhpcy5vcHRpb25zKTtcbiAgICBjb25zdCBoYXNDdXN0b21PcHRpb25WYWx1ZSA9IChvcHRpb25LZXkpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICFbJ2RlZmF1bHQnLCAnaW1wbGllZCddLmluY2x1ZGVzKHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KSlcbiAgICAgICk7XG4gICAgfTtcbiAgICB0aGlzLm9wdGlvbnNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChvcHRpb24pID0+XG4gICAgICAgICAgb3B0aW9uLmltcGxpZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIGhhc0N1c3RvbU9wdGlvblZhbHVlKG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkpICYmXG4gICAgICAgICAgZHVhbEhlbHBlci52YWx1ZUZyb21PcHRpb24oXG4gICAgICAgICAgICB0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkpLFxuICAgICAgICAgICAgb3B0aW9uLFxuICAgICAgICAgICksXG4gICAgICApXG4gICAgICAuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbi5pbXBsaWVkKVxuICAgICAgICAgIC5maWx0ZXIoKGltcGxpZWRLZXkpID0+ICFoYXNDdXN0b21PcHRpb25WYWx1ZShpbXBsaWVkS2V5KSlcbiAgICAgICAgICAuZm9yRWFjaCgoaW1wbGllZEtleSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRPcHRpb25WYWx1ZVdpdGhTb3VyY2UoXG4gICAgICAgICAgICAgIGltcGxpZWRLZXksXG4gICAgICAgICAgICAgIG9wdGlvbi5pbXBsaWVkW2ltcGxpZWRLZXldLFxuICAgICAgICAgICAgICAnaW1wbGllZCcsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXJndW1lbnQgYG5hbWVgIGlzIG1pc3NpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIG1pc3NpbmdBcmd1bWVudChuYW1lKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCAnJHtuYW1lfSdgO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLm1pc3NpbmdBcmd1bWVudCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogYE9wdGlvbmAgaXMgbWlzc2luZyBhbiBhcmd1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBvcHRpb25NaXNzaW5nQXJndW1lbnQob3B0aW9uKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogb3B0aW9uICcke29wdGlvbi5mbGFnc30nIGFyZ3VtZW50IG1pc3NpbmdgO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLm9wdGlvbk1pc3NpbmdBcmd1bWVudCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogYE9wdGlvbmAgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgaXMgYSBtYW5kYXRvcnkgb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIG1pc3NpbmdNYW5kYXRvcnlPcHRpb25WYWx1ZShvcHRpb24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiByZXF1aXJlZCBvcHRpb24gJyR7b3B0aW9uLmZsYWdzfScgbm90IHNwZWNpZmllZGA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIubWlzc2luZ01hbmRhdG9yeU9wdGlvblZhbHVlJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgT3B0aW9uYCBjb25mbGljdHMgd2l0aCBhbm90aGVyIG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcGFyYW0ge09wdGlvbn0gY29uZmxpY3RpbmdPcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jb25mbGljdGluZ09wdGlvbihvcHRpb24sIGNvbmZsaWN0aW5nT3B0aW9uKSB7XG4gICAgLy8gVGhlIGNhbGxpbmcgY29kZSBkb2VzIG5vdCBrbm93IHdoZXRoZXIgYSBuZWdhdGVkIG9wdGlvbiBpcyB0aGUgc291cmNlIG9mIHRoZVxuICAgIC8vIHZhbHVlLCBzbyBkbyBzb21lIHdvcmsgdG8gdGFrZSBhbiBlZHVjYXRlZCBndWVzcy5cbiAgICBjb25zdCBmaW5kQmVzdE9wdGlvbkZyb21WYWx1ZSA9IChvcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWUob3B0aW9uS2V5KTtcbiAgICAgIGNvbnN0IG5lZ2F0aXZlT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoXG4gICAgICAgICh0YXJnZXQpID0+IHRhcmdldC5uZWdhdGUgJiYgb3B0aW9uS2V5ID09PSB0YXJnZXQuYXR0cmlidXRlTmFtZSgpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBvc2l0aXZlT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoXG4gICAgICAgICh0YXJnZXQpID0+ICF0YXJnZXQubmVnYXRlICYmIG9wdGlvbktleSA9PT0gdGFyZ2V0LmF0dHJpYnV0ZU5hbWUoKSxcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIG5lZ2F0aXZlT3B0aW9uICYmXG4gICAgICAgICgobmVnYXRpdmVPcHRpb24ucHJlc2V0QXJnID09PSB1bmRlZmluZWQgJiYgb3B0aW9uVmFsdWUgPT09IGZhbHNlKSB8fFxuICAgICAgICAgIChuZWdhdGl2ZU9wdGlvbi5wcmVzZXRBcmcgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgb3B0aW9uVmFsdWUgPT09IG5lZ2F0aXZlT3B0aW9uLnByZXNldEFyZykpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG5lZ2F0aXZlT3B0aW9uO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBvc2l0aXZlT3B0aW9uIHx8IG9wdGlvbjtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3QgYmVzdE9wdGlvbiA9IGZpbmRCZXN0T3B0aW9uRnJvbVZhbHVlKG9wdGlvbik7XG4gICAgICBjb25zdCBvcHRpb25LZXkgPSBiZXN0T3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KTtcbiAgICAgIGlmIChzb3VyY2UgPT09ICdlbnYnKSB7XG4gICAgICAgIHJldHVybiBgZW52aXJvbm1lbnQgdmFyaWFibGUgJyR7YmVzdE9wdGlvbi5lbnZWYXJ9J2A7XG4gICAgICB9XG4gICAgICByZXR1cm4gYG9wdGlvbiAnJHtiZXN0T3B0aW9uLmZsYWdzfSdgO1xuICAgIH07XG5cbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiAke2dldEVycm9yTWVzc2FnZShvcHRpb24pfSBjYW5ub3QgYmUgdXNlZCB3aXRoICR7Z2V0RXJyb3JNZXNzYWdlKGNvbmZsaWN0aW5nT3B0aW9uKX1gO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLmNvbmZsaWN0aW5nT3B0aW9uJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmtub3duIG9wdGlvbiBgZmxhZ2AuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIHVua25vd25PcHRpb24oZmxhZykge1xuICAgIGlmICh0aGlzLl9hbGxvd1Vua25vd25PcHRpb24pIHJldHVybjtcbiAgICBsZXQgc3VnZ2VzdGlvbiA9ICcnO1xuXG4gICAgaWYgKGZsYWcuc3RhcnRzV2l0aCgnLS0nKSAmJiB0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IpIHtcbiAgICAgIC8vIExvb3BpbmcgdG8gcGljayB1cCB0aGUgZ2xvYmFsIG9wdGlvbnMgdG9vXG4gICAgICBsZXQgY2FuZGlkYXRlRmxhZ3MgPSBbXTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgbGV0IGNvbW1hbmQgPSB0aGlzO1xuICAgICAgZG8ge1xuICAgICAgICBjb25zdCBtb3JlRmxhZ3MgPSBjb21tYW5kXG4gICAgICAgICAgLmNyZWF0ZUhlbHAoKVxuICAgICAgICAgIC52aXNpYmxlT3B0aW9ucyhjb21tYW5kKVxuICAgICAgICAgIC5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLmxvbmcpXG4gICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiBvcHRpb24ubG9uZyk7XG4gICAgICAgIGNhbmRpZGF0ZUZsYWdzID0gY2FuZGlkYXRlRmxhZ3MuY29uY2F0KG1vcmVGbGFncyk7XG4gICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnBhcmVudDtcbiAgICAgIH0gd2hpbGUgKGNvbW1hbmQgJiYgIWNvbW1hbmQuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zKTtcbiAgICAgIHN1Z2dlc3Rpb24gPSBzdWdnZXN0U2ltaWxhcihmbGFnLCBjYW5kaWRhdGVGbGFncyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogdW5rbm93biBvcHRpb24gJyR7ZmxhZ30nJHtzdWdnZXN0aW9ufWA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIudW5rbm93bk9wdGlvbicgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXhjZXNzIGFyZ3VtZW50cywgbW9yZSB0aGFuIGV4cGVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSByZWNlaXZlZEFyZ3NcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2V4Y2Vzc0FyZ3VtZW50cyhyZWNlaXZlZEFyZ3MpIHtcbiAgICBpZiAodGhpcy5fYWxsb3dFeGNlc3NBcmd1bWVudHMpIHJldHVybjtcblxuICAgIGNvbnN0IGV4cGVjdGVkID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aDtcbiAgICBjb25zdCBzID0gZXhwZWN0ZWQgPT09IDEgPyAnJyA6ICdzJztcbiAgICBjb25zdCBmb3JTdWJjb21tYW5kID0gdGhpcy5wYXJlbnQgPyBgIGZvciAnJHt0aGlzLm5hbWUoKX0nYCA6ICcnO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IHRvbyBtYW55IGFyZ3VtZW50cyR7Zm9yU3ViY29tbWFuZH0uIEV4cGVjdGVkICR7ZXhwZWN0ZWR9IGFyZ3VtZW50JHtzfSBidXQgZ290ICR7cmVjZWl2ZWRBcmdzLmxlbmd0aH0uYDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci5leGNlc3NBcmd1bWVudHMnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVua25vd24gY29tbWFuZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgdW5rbm93bkNvbW1hbmQoKSB7XG4gICAgY29uc3QgdW5rbm93bk5hbWUgPSB0aGlzLmFyZ3NbMF07XG4gICAgbGV0IHN1Z2dlc3Rpb24gPSAnJztcblxuICAgIGlmICh0aGlzLl9zaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZU5hbWVzID0gW107XG4gICAgICB0aGlzLmNyZWF0ZUhlbHAoKVxuICAgICAgICAudmlzaWJsZUNvbW1hbmRzKHRoaXMpXG4gICAgICAgIC5mb3JFYWNoKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgY2FuZGlkYXRlTmFtZXMucHVzaChjb21tYW5kLm5hbWUoKSk7XG4gICAgICAgICAgLy8ganVzdCB2aXNpYmxlIGFsaWFzXG4gICAgICAgICAgaWYgKGNvbW1hbmQuYWxpYXMoKSkgY2FuZGlkYXRlTmFtZXMucHVzaChjb21tYW5kLmFsaWFzKCkpO1xuICAgICAgICB9KTtcbiAgICAgIHN1Z2dlc3Rpb24gPSBzdWdnZXN0U2ltaWxhcih1bmtub3duTmFtZSwgY2FuZGlkYXRlTmFtZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IHVua25vd24gY29tbWFuZCAnJHt1bmtub3duTmFtZX0nJHtzdWdnZXN0aW9ufWA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIudW5rbm93bkNvbW1hbmQnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIHByb2dyYW0gdmVyc2lvbi5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgYXV0by1yZWdpc3RlcnMgdGhlIFwiLVYsIC0tdmVyc2lvblwiIG9wdGlvbiB3aGljaCB3aWxsIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICpcbiAgICogWW91IGNhbiBvcHRpb25hbGx5IHN1cHBseSB0aGUgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhZ3NdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4geyh0aGlzIHwgc3RyaW5nIHwgdW5kZWZpbmVkKX0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nLCBvciB2ZXJzaW9uIHN0cmluZyBpZiBubyBhcmd1bWVudHNcbiAgICovXG5cbiAgdmVyc2lvbihzdHIsIGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgdGhpcy5fdmVyc2lvbiA9IHN0cjtcbiAgICBmbGFncyA9IGZsYWdzIHx8ICctViwgLS12ZXJzaW9uJztcbiAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uIHx8ICdvdXRwdXQgdGhlIHZlcnNpb24gbnVtYmVyJztcbiAgICBjb25zdCB2ZXJzaW9uT3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcbiAgICB0aGlzLl92ZXJzaW9uT3B0aW9uTmFtZSA9IHZlcnNpb25PcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyT3B0aW9uKHZlcnNpb25PcHRpb24pO1xuXG4gICAgdGhpcy5vbignb3B0aW9uOicgKyB2ZXJzaW9uT3B0aW9uLm5hbWUoKSwgKCkgPT4ge1xuICAgICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZU91dChgJHtzdHJ9XFxuYCk7XG4gICAgICB0aGlzLl9leGl0KDAsICdjb21tYW5kZXIudmVyc2lvbicsIHN0cik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc0Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cbiAgZGVzY3JpcHRpb24oc3RyLCBhcmdzRGVzY3JpcHRpb24pIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQgJiYgYXJnc0Rlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSBzdHI7XG4gICAgaWYgKGFyZ3NEZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fYXJnc0Rlc2NyaXB0aW9uID0gYXJnc0Rlc2NyaXB0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHN1bW1hcnkuIFVzZWQgd2hlbiBsaXN0ZWQgYXMgc3ViY29tbWFuZCBvZiBwYXJlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cbiAgc3VtbWFyeShzdHIpIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9zdW1tYXJ5O1xuICAgIHRoaXMuX3N1bW1hcnkgPSBzdHI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFuIGFsaWFzIGZvciB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogWW91IG1heSBjYWxsIG1vcmUgdGhhbiBvbmNlIHRvIGFkZCBtdWx0aXBsZSBhbGlhc2VzLiBPbmx5IHRoZSBmaXJzdCBhbGlhcyBpcyBzaG93biBpbiB0aGUgYXV0by1nZW5lcmF0ZWQgaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlhc11cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG5cbiAgYWxpYXMoYWxpYXMpIHtcbiAgICBpZiAoYWxpYXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2FsaWFzZXNbMF07IC8vIGp1c3QgcmV0dXJuIGZpcnN0LCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuICAgIC8qKiBAdHlwZSB7Q29tbWFuZH0gKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBsZXQgY29tbWFuZCA9IHRoaXM7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb21tYW5kcy5sZW5ndGggIT09IDAgJiZcbiAgICAgIHRoaXMuY29tbWFuZHNbdGhpcy5jb21tYW5kcy5sZW5ndGggLSAxXS5fZXhlY3V0YWJsZUhhbmRsZXJcbiAgICApIHtcbiAgICAgIC8vIGFzc3VtZSBhZGRpbmcgYWxpYXMgZm9yIGxhc3QgYWRkZWQgZXhlY3V0YWJsZSBzdWJjb21tYW5kLCByYXRoZXIgdGhhbiB0aGlzXG4gICAgICBjb21tYW5kID0gdGhpcy5jb21tYW5kc1t0aGlzLmNvbW1hbmRzLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIGlmIChhbGlhcyA9PT0gY29tbWFuZC5fbmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbW1hbmQgYWxpYXMgY2FuJ3QgYmUgdGhlIHNhbWUgYXMgaXRzIG5hbWVcIik7XG4gICAgY29uc3QgbWF0Y2hpbmdDb21tYW5kID0gdGhpcy5wYXJlbnQ/Ll9maW5kQ29tbWFuZChhbGlhcyk7XG4gICAgaWYgKG1hdGNoaW5nQ29tbWFuZCkge1xuICAgICAgLy8gYy5mLiBfcmVnaXN0ZXJDb21tYW5kXG4gICAgICBjb25zdCBleGlzdGluZ0NtZCA9IFttYXRjaGluZ0NvbW1hbmQubmFtZSgpXVxuICAgICAgICAuY29uY2F0KG1hdGNoaW5nQ29tbWFuZC5hbGlhc2VzKCkpXG4gICAgICAgIC5qb2luKCd8Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBjYW5ub3QgYWRkIGFsaWFzICcke2FsaWFzfScgdG8gY29tbWFuZCAnJHt0aGlzLm5hbWUoKX0nIGFzIGFscmVhZHkgaGF2ZSBjb21tYW5kICcke2V4aXN0aW5nQ21kfSdgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb21tYW5kLl9hbGlhc2VzLnB1c2goYWxpYXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbGlhc2VzIGZvciB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogT25seSB0aGUgZmlyc3QgYWxpYXMgaXMgc2hvd24gaW4gdGhlIGF1dG8tZ2VuZXJhdGVkIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthbGlhc2VzXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nW118Q29tbWFuZCl9XG4gICAqL1xuXG4gIGFsaWFzZXMoYWxpYXNlcykge1xuICAgIC8vIEdldHRlciBmb3IgdGhlIGFycmF5IG9mIGFsaWFzZXMgaXMgdGhlIG1haW4gcmVhc29uIGZvciBoYXZpbmcgYWxpYXNlcygpIGluIGFkZGl0aW9uIHRvIGFsaWFzKCkuXG4gICAgaWYgKGFsaWFzZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2FsaWFzZXM7XG5cbiAgICBhbGlhc2VzLmZvckVhY2goKGFsaWFzKSA9PiB0aGlzLmFsaWFzKGFsaWFzKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IC8gZ2V0IHRoZSBjb21tYW5kIHVzYWdlIGBzdHJgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cl1cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG5cbiAgdXNhZ2Uoc3RyKSB7XG4gICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5fdXNhZ2UpIHJldHVybiB0aGlzLl91c2FnZTtcblxuICAgICAgY29uc3QgYXJncyA9IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5tYXAoKGFyZykgPT4ge1xuICAgICAgICByZXR1cm4gaHVtYW5SZWFkYWJsZUFyZ05hbWUoYXJnKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtdXG4gICAgICAgIC5jb25jYXQoXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmxlbmd0aCB8fCB0aGlzLl9oZWxwT3B0aW9uICE9PSBudWxsID8gJ1tvcHRpb25zXScgOiBbXSxcbiAgICAgICAgICB0aGlzLmNvbW1hbmRzLmxlbmd0aCA/ICdbY29tbWFuZF0nIDogW10sXG4gICAgICAgICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aCA/IGFyZ3MgOiBbXSxcbiAgICAgICAgKVxuICAgICAgICAuam9pbignICcpO1xuICAgIH1cblxuICAgIHRoaXMuX3VzYWdlID0gc3RyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcmV0dXJuIHsoc3RyaW5nfENvbW1hbmQpfVxuICAgKi9cblxuICBuYW1lKHN0cikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX25hbWU7XG4gICAgdGhpcy5fbmFtZSA9IHN0cjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgZnJvbSBzY3JpcHQgZmlsZW5hbWUsIHN1Y2ggYXMgcHJvY2Vzcy5hcmd2WzFdLFxuICAgKiBvciByZXF1aXJlLm1haW4uZmlsZW5hbWUsIG9yIF9fZmlsZW5hbWUuXG4gICAqXG4gICAqIChVc2VkIGludGVybmFsbHkgYW5kIHB1YmxpYyBhbHRob3VnaCBub3QgZG9jdW1lbnRlZCBpbiBSRUFETUUuKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLm5hbWVGcm9tRmlsZW5hbWUocmVxdWlyZS5tYWluLmZpbGVuYW1lKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9XG4gICAqL1xuXG4gIG5hbWVGcm9tRmlsZW5hbWUoZmlsZW5hbWUpIHtcbiAgICB0aGlzLl9uYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgcGF0aC5leHRuYW1lKGZpbGVuYW1lKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBkaXJlY3RvcnkgZm9yIHNlYXJjaGluZyBmb3IgZXhlY3V0YWJsZSBzdWJjb21tYW5kcyBvZiB0aGlzIGNvbW1hbmQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uZXhlY3V0YWJsZURpcihfX2Rpcm5hbWUpO1xuICAgKiAvLyBvclxuICAgKiBwcm9ncmFtLmV4ZWN1dGFibGVEaXIoJ3N1YmNvbW1hbmRzJyk7XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHJldHVybiB7KHN0cmluZ3xudWxsfENvbW1hbmQpfVxuICAgKi9cblxuICBleGVjdXRhYmxlRGlyKHBhdGgpIHtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fZXhlY3V0YWJsZURpcjtcbiAgICB0aGlzLl9leGVjdXRhYmxlRGlyID0gcGF0aDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gcHJvZ3JhbSBoZWxwIGRvY3VtZW50YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7eyBlcnJvcjogYm9vbGVhbiB9fSBbY29udGV4dE9wdGlvbnNdIC0gcGFzcyB7ZXJyb3I6dHJ1ZX0gdG8gd3JhcCBmb3Igc3RkZXJyIGluc3RlYWQgb2Ygc3Rkb3V0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgaGVscEluZm9ybWF0aW9uKGNvbnRleHRPcHRpb25zKSB7XG4gICAgY29uc3QgaGVscGVyID0gdGhpcy5jcmVhdGVIZWxwKCk7XG4gICAgaWYgKGhlbHBlci5oZWxwV2lkdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVscGVyLmhlbHBXaWR0aCA9XG4gICAgICAgIGNvbnRleHRPcHRpb25zICYmIGNvbnRleHRPcHRpb25zLmVycm9yXG4gICAgICAgICAgPyB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLmdldEVyckhlbHBXaWR0aCgpXG4gICAgICAgICAgOiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLmdldE91dEhlbHBXaWR0aCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGVscGVyLmZvcm1hdEhlbHAodGhpcywgaGVscGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZ2V0SGVscENvbnRleHQoY29udGV4dE9wdGlvbnMpIHtcbiAgICBjb250ZXh0T3B0aW9ucyA9IGNvbnRleHRPcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IGNvbnRleHQgPSB7IGVycm9yOiAhIWNvbnRleHRPcHRpb25zLmVycm9yIH07XG4gICAgbGV0IHdyaXRlO1xuICAgIGlmIChjb250ZXh0LmVycm9yKSB7XG4gICAgICB3cml0ZSA9IChhcmcpID0+IHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIoYXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd3JpdGUgPSAoYXJnKSA9PiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLndyaXRlT3V0KGFyZyk7XG4gICAgfVxuICAgIGNvbnRleHQud3JpdGUgPSBjb250ZXh0T3B0aW9ucy53cml0ZSB8fCB3cml0ZTtcbiAgICBjb250ZXh0LmNvbW1hbmQgPSB0aGlzO1xuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIE91dHB1dCBoZWxwIGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbW1hbmQuXG4gICAqXG4gICAqIE91dHB1dHMgYnVpbHQtaW4gaGVscCwgYW5kIGN1c3RvbSB0ZXh0IGFkZGVkIHVzaW5nIGAuYWRkSGVscFRleHQoKWAuXG4gICAqXG4gICAqIEBwYXJhbSB7eyBlcnJvcjogYm9vbGVhbiB9IHwgRnVuY3Rpb259IFtjb250ZXh0T3B0aW9uc10gLSBwYXNzIHtlcnJvcjp0cnVlfSB0byB3cml0ZSB0byBzdGRlcnIgaW5zdGVhZCBvZiBzdGRvdXRcbiAgICovXG5cbiAgb3V0cHV0SGVscChjb250ZXh0T3B0aW9ucykge1xuICAgIGxldCBkZXByZWNhdGVkQ2FsbGJhY2s7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0T3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZGVwcmVjYXRlZENhbGxiYWNrID0gY29udGV4dE9wdGlvbnM7XG4gICAgICBjb250ZXh0T3B0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2dldEhlbHBDb250ZXh0KGNvbnRleHRPcHRpb25zKTtcblxuICAgIHRoaXMuX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZvckVhY2goKGNvbW1hbmQpID0+IGNvbW1hbmQuZW1pdCgnYmVmb3JlQWxsSGVscCcsIGNvbnRleHQpKTtcbiAgICB0aGlzLmVtaXQoJ2JlZm9yZUhlbHAnLCBjb250ZXh0KTtcblxuICAgIGxldCBoZWxwSW5mb3JtYXRpb24gPSB0aGlzLmhlbHBJbmZvcm1hdGlvbihjb250ZXh0KTtcbiAgICBpZiAoZGVwcmVjYXRlZENhbGxiYWNrKSB7XG4gICAgICBoZWxwSW5mb3JtYXRpb24gPSBkZXByZWNhdGVkQ2FsbGJhY2soaGVscEluZm9ybWF0aW9uKTtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGhlbHBJbmZvcm1hdGlvbiAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgIUJ1ZmZlci5pc0J1ZmZlcihoZWxwSW5mb3JtYXRpb24pXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvdXRwdXRIZWxwIGNhbGxiYWNrIG11c3QgcmV0dXJuIGEgc3RyaW5nIG9yIGEgQnVmZmVyJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnRleHQud3JpdGUoaGVscEluZm9ybWF0aW9uKTtcblxuICAgIGlmICh0aGlzLl9nZXRIZWxwT3B0aW9uKCk/LmxvbmcpIHtcbiAgICAgIHRoaXMuZW1pdCh0aGlzLl9nZXRIZWxwT3B0aW9uKCkubG9uZyk7IC8vIGRlcHJlY2F0ZWRcbiAgICB9XG4gICAgdGhpcy5lbWl0KCdhZnRlckhlbHAnLCBjb250ZXh0KTtcbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKCkuZm9yRWFjaCgoY29tbWFuZCkgPT5cbiAgICAgIGNvbW1hbmQuZW1pdCgnYWZ0ZXJBbGxIZWxwJywgY29udGV4dCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHBhc3MgaW4gZmxhZ3MgYW5kIGEgZGVzY3JpcHRpb24gdG8gY3VzdG9taXNlIHRoZSBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICogUGFzcyBpbiBmYWxzZSB0byBkaXNhYmxlIHRoZSBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5oZWxwT3B0aW9uKCctPywgLS1oZWxwJyAnc2hvdyBoZWxwJyk7IC8vIGN1c3RvbWlzZVxuICAgKiBwcm9ncmFtLmhlbHBPcHRpb24oZmFsc2UpOyAvLyBkaXNhYmxlXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IGJvb2xlYW4pfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgaGVscE9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pIHtcbiAgICAvLyBTdXBwb3J0IGRpc2FibGluZyBidWlsdC1pbiBoZWxwIG9wdGlvbi5cbiAgICBpZiAodHlwZW9mIGZsYWdzID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGlmIChmbGFncykge1xuICAgICAgICB0aGlzLl9oZWxwT3B0aW9uID0gdGhpcy5faGVscE9wdGlvbiA/PyB1bmRlZmluZWQ7IC8vIHByZXNlcnZlIGV4aXN0aW5nIG9wdGlvblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faGVscE9wdGlvbiA9IG51bGw7IC8vIGRpc2FibGVcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEN1c3RvbWlzZSBmbGFncyBhbmQgZGVzY3JpcHRpb24uXG4gICAgZmxhZ3MgPSBmbGFncyA/PyAnLWgsIC0taGVscCc7XG4gICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiA/PyAnZGlzcGxheSBoZWxwIGZvciBjb21tYW5kJztcbiAgICB0aGlzLl9oZWxwT3B0aW9uID0gdGhpcy5jcmVhdGVPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExhenkgY3JlYXRlIGhlbHAgb3B0aW9uLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgaGFzIGJlZW4gZGlzYWJsZWQgd2l0aCAuaGVscE9wdGlvbihmYWxzZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIHsoT3B0aW9uIHwgbnVsbCl9IHRoZSBoZWxwIG9wdGlvblxuICAgKiBAcGFja2FnZVxuICAgKi9cbiAgX2dldEhlbHBPcHRpb24oKSB7XG4gICAgLy8gTGF6eSBjcmVhdGUgaGVscCBvcHRpb24gb24gZGVtYW5kLlxuICAgIGlmICh0aGlzLl9oZWxwT3B0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaGVscE9wdGlvbih1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9oZWxwT3B0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1cHBseSB5b3VyIG93biBvcHRpb24gdG8gdXNlIGZvciB0aGUgYnVpbHQtaW4gaGVscCBvcHRpb24uXG4gICAqIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgaGVscE9wdGlvbigpIHRvIGN1c3RvbWlzZSB0aGUgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEhlbHBPcHRpb24ob3B0aW9uKSB7XG4gICAgdGhpcy5faGVscE9wdGlvbiA9IG9wdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBhbmQgZXhpdC5cbiAgICpcbiAgICogT3V0cHV0cyBidWlsdC1pbiBoZWxwLCBhbmQgY3VzdG9tIHRleHQgYWRkZWQgdXNpbmcgYC5hZGRIZWxwVGV4dCgpYC5cbiAgICpcbiAgICogQHBhcmFtIHt7IGVycm9yOiBib29sZWFuIH19IFtjb250ZXh0T3B0aW9uc10gLSBwYXNzIHtlcnJvcjp0cnVlfSB0byB3cml0ZSB0byBzdGRlcnIgaW5zdGVhZCBvZiBzdGRvdXRcbiAgICovXG5cbiAgaGVscChjb250ZXh0T3B0aW9ucykge1xuICAgIHRoaXMub3V0cHV0SGVscChjb250ZXh0T3B0aW9ucyk7XG4gICAgbGV0IGV4aXRDb2RlID0gcHJvY2Vzcy5leGl0Q29kZSB8fCAwO1xuICAgIGlmIChcbiAgICAgIGV4aXRDb2RlID09PSAwICYmXG4gICAgICBjb250ZXh0T3B0aW9ucyAmJlxuICAgICAgdHlwZW9mIGNvbnRleHRPcHRpb25zICE9PSAnZnVuY3Rpb24nICYmXG4gICAgICBjb250ZXh0T3B0aW9ucy5lcnJvclxuICAgICkge1xuICAgICAgZXhpdENvZGUgPSAxO1xuICAgIH1cbiAgICAvLyBtZXNzYWdlOiBkbyBub3QgaGF2ZSBhbGwgZGlzcGxheWVkIHRleHQgYXZhaWxhYmxlIHNvIG9ubHkgcGFzc2luZyBwbGFjZWhvbGRlci5cbiAgICB0aGlzLl9leGl0KGV4aXRDb2RlLCAnY29tbWFuZGVyLmhlbHAnLCAnKG91dHB1dEhlbHApJyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFkZGl0aW9uYWwgdGV4dCB0byBiZSBkaXNwbGF5ZWQgd2l0aCB0aGUgYnVpbHQtaW4gaGVscC5cbiAgICpcbiAgICogUG9zaXRpb24gaXMgJ2JlZm9yZScgb3IgJ2FmdGVyJyB0byBhZmZlY3QganVzdCB0aGlzIGNvbW1hbmQsXG4gICAqIGFuZCAnYmVmb3JlQWxsJyBvciAnYWZ0ZXJBbGwnIHRvIGFmZmVjdCB0aGlzIGNvbW1hbmQgYW5kIGFsbCBpdHMgc3ViY29tbWFuZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwb3NpdGlvbiAtIGJlZm9yZSBvciBhZnRlciBidWlsdC1pbiBoZWxwXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IEZ1bmN0aW9uKX0gdGV4dCAtIHN0cmluZyB0byBhZGQsIG9yIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgc3RyaW5nXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkSGVscFRleHQocG9zaXRpb24sIHRleHQpIHtcbiAgICBjb25zdCBhbGxvd2VkVmFsdWVzID0gWydiZWZvcmVBbGwnLCAnYmVmb3JlJywgJ2FmdGVyJywgJ2FmdGVyQWxsJ107XG4gICAgaWYgKCFhbGxvd2VkVmFsdWVzLmluY2x1ZGVzKHBvc2l0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciBwb3NpdGlvbiB0byBhZGRIZWxwVGV4dC5cbkV4cGVjdGluZyBvbmUgb2YgJyR7YWxsb3dlZFZhbHVlcy5qb2luKFwiJywgJ1wiKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGhlbHBFdmVudCA9IGAke3Bvc2l0aW9ufUhlbHBgO1xuICAgIHRoaXMub24oaGVscEV2ZW50LCAoY29udGV4dCkgPT4ge1xuICAgICAgbGV0IGhlbHBTdHI7XG4gICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGVscFN0ciA9IHRleHQoeyBlcnJvcjogY29udGV4dC5lcnJvciwgY29tbWFuZDogY29udGV4dC5jb21tYW5kIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVscFN0ciA9IHRleHQ7XG4gICAgICB9XG4gICAgICAvLyBJZ25vcmUgZmFsc3kgdmFsdWUgd2hlbiBub3RoaW5nIHRvIG91dHB1dC5cbiAgICAgIGlmIChoZWxwU3RyKSB7XG4gICAgICAgIGNvbnRleHQud3JpdGUoYCR7aGVscFN0cn1cXG5gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBpZiBoZWxwIGZsYWdzIHNwZWNpZmllZFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIC0gYXJyYXkgb2Ygb3B0aW9ucyB0byBzZWFyY2ggZm9yIGhlbHAgZmxhZ3NcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX291dHB1dEhlbHBJZlJlcXVlc3RlZChhcmdzKSB7XG4gICAgY29uc3QgaGVscE9wdGlvbiA9IHRoaXMuX2dldEhlbHBPcHRpb24oKTtcbiAgICBjb25zdCBoZWxwUmVxdWVzdGVkID0gaGVscE9wdGlvbiAmJiBhcmdzLmZpbmQoKGFyZykgPT4gaGVscE9wdGlvbi5pcyhhcmcpKTtcbiAgICBpZiAoaGVscFJlcXVlc3RlZCkge1xuICAgICAgdGhpcy5vdXRwdXRIZWxwKCk7XG4gICAgICAvLyAoRG8gbm90IGhhdmUgYWxsIGRpc3BsYXllZCB0ZXh0IGF2YWlsYWJsZSBzbyBvbmx5IHBhc3NpbmcgcGxhY2Vob2xkZXIuKVxuICAgICAgdGhpcy5fZXhpdCgwLCAnY29tbWFuZGVyLmhlbHBEaXNwbGF5ZWQnLCAnKG91dHB1dEhlbHApJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU2NhbiBhcmd1bWVudHMgYW5kIGluY3JlbWVudCBwb3J0IG51bWJlciBmb3IgaW5zcGVjdCBjYWxscyAodG8gYXZvaWQgY29uZmxpY3RzIHdoZW4gc3Bhd25pbmcgbmV3IGNvbW1hbmQpLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MgLSBhcnJheSBvZiBhcmd1bWVudHMgZnJvbSBub2RlLmV4ZWNBcmd2XG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGluY3JlbWVudE5vZGVJbnNwZWN0b3JQb3J0KGFyZ3MpIHtcbiAgLy8gVGVzdGluZyBmb3IgdGhlc2Ugb3B0aW9uczpcbiAgLy8gIC0taW5zcGVjdFs9W2hvc3Q6XXBvcnRdXG4gIC8vICAtLWluc3BlY3QtYnJrWz1baG9zdDpdcG9ydF1cbiAgLy8gIC0taW5zcGVjdC1wb3J0PVtob3N0Ol1wb3J0XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiB7XG4gICAgaWYgKCFhcmcuc3RhcnRzV2l0aCgnLS1pbnNwZWN0JykpIHtcbiAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIGxldCBkZWJ1Z09wdGlvbjtcbiAgICBsZXQgZGVidWdIb3N0ID0gJzEyNy4wLjAuMSc7XG4gICAgbGV0IGRlYnVnUG9ydCA9ICc5MjI5JztcbiAgICBsZXQgbWF0Y2g7XG4gICAgaWYgKChtYXRjaCA9IGFyZy5tYXRjaCgvXigtLWluc3BlY3QoLWJyayk/KSQvKSkgIT09IG51bGwpIHtcbiAgICAgIC8vIGUuZy4gLS1pbnNwZWN0XG4gICAgICBkZWJ1Z09wdGlvbiA9IG1hdGNoWzFdO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAobWF0Y2ggPSBhcmcubWF0Y2goL14oLS1pbnNwZWN0KC1icmt8LXBvcnQpPyk9KFteOl0rKSQvKSkgIT09IG51bGxcbiAgICApIHtcbiAgICAgIGRlYnVnT3B0aW9uID0gbWF0Y2hbMV07XG4gICAgICBpZiAoL15cXGQrJC8udGVzdChtYXRjaFszXSkpIHtcbiAgICAgICAgLy8gZS5nLiAtLWluc3BlY3Q9MTIzNFxuICAgICAgICBkZWJ1Z1BvcnQgPSBtYXRjaFszXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGUuZy4gLS1pbnNwZWN0PWxvY2FsaG9zdFxuICAgICAgICBkZWJ1Z0hvc3QgPSBtYXRjaFszXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKG1hdGNoID0gYXJnLm1hdGNoKC9eKC0taW5zcGVjdCgtYnJrfC1wb3J0KT8pPShbXjpdKyk6KFxcZCspJC8pKSAhPT0gbnVsbFxuICAgICkge1xuICAgICAgLy8gZS5nLiAtLWluc3BlY3Q9bG9jYWxob3N0OjEyMzRcbiAgICAgIGRlYnVnT3B0aW9uID0gbWF0Y2hbMV07XG4gICAgICBkZWJ1Z0hvc3QgPSBtYXRjaFszXTtcbiAgICAgIGRlYnVnUG9ydCA9IG1hdGNoWzRdO1xuICAgIH1cblxuICAgIGlmIChkZWJ1Z09wdGlvbiAmJiBkZWJ1Z1BvcnQgIT09ICcwJykge1xuICAgICAgcmV0dXJuIGAke2RlYnVnT3B0aW9ufT0ke2RlYnVnSG9zdH06JHtwYXJzZUludChkZWJ1Z1BvcnQpICsgMX1gO1xuICAgIH1cbiAgICByZXR1cm4gYXJnO1xuICB9KTtcbn1cblxuZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDtcbiIsIi8qKlxuICogQ29tbWFuZGVyRXJyb3IgY2xhc3NcbiAqL1xuY2xhc3MgQ29tbWFuZGVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHRoZSBDb21tYW5kZXJFcnJvciBjbGFzc1xuICAgKiBAcGFyYW0ge251bWJlcn0gZXhpdENvZGUgc3VnZ2VzdGVkIGV4aXQgY29kZSB3aGljaCBjb3VsZCBiZSB1c2VkIHdpdGggcHJvY2Vzcy5leGl0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIGFuIGlkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGVycm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvclxuICAgKi9cbiAgY29uc3RydWN0b3IoZXhpdENvZGUsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAvLyBwcm9wZXJseSBjYXB0dXJlIHN0YWNrIHRyYWNlIGluIE5vZGUuanNcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLmV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgdGhpcy5uZXN0ZWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEludmFsaWRBcmd1bWVudEVycm9yIGNsYXNzXG4gKi9cbmNsYXNzIEludmFsaWRBcmd1bWVudEVycm9yIGV4dGVuZHMgQ29tbWFuZGVyRXJyb3Ige1xuICAvKipcbiAgICogQ29uc3RydWN0cyB0aGUgSW52YWxpZEFyZ3VtZW50RXJyb3IgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBleHBsYW5hdGlvbiBvZiB3aHkgYXJndW1lbnQgaXMgaW52YWxpZFxuICAgKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKDEsICdjb21tYW5kZXIuaW52YWxpZEFyZ3VtZW50JywgbWVzc2FnZSk7XG4gICAgLy8gcHJvcGVybHkgY2FwdHVyZSBzdGFjayB0cmFjZSBpbiBOb2RlLmpzXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG59XG5cbmV4cG9ydHMuQ29tbWFuZGVyRXJyb3IgPSBDb21tYW5kZXJFcnJvcjtcbmV4cG9ydHMuSW52YWxpZEFyZ3VtZW50RXJyb3IgPSBJbnZhbGlkQXJndW1lbnRFcnJvcjtcbiIsImNvbnN0IHsgaHVtYW5SZWFkYWJsZUFyZ05hbWUgfSA9IHJlcXVpcmUoJy4vYXJndW1lbnQuanMnKTtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IGltcG9ydCB0eXBlcyBmb3IgSlNEb2MsIHVzZWQgYnkgVmlzdWFsIFN0dWRpbyBDb2RlIEludGVsbGlTZW5zZSBhbmQgYG5wbSBydW4gdHlwZXNjcmlwdC1jaGVja0pTYFxuICogaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svanNkb2Mtc3VwcG9ydGVkLXR5cGVzLmh0bWwjaW1wb3J0LXR5cGVzXG4gKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vYXJndW1lbnQuanNcIikuQXJndW1lbnQgfSBBcmd1bWVudFxuICogQHR5cGVkZWYgeyBpbXBvcnQoXCIuL2NvbW1hbmQuanNcIikuQ29tbWFuZCB9IENvbW1hbmRcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KFwiLi9vcHRpb24uanNcIikuT3B0aW9uIH0gT3B0aW9uXG4gKi9cblxuLy8gQWx0aG91Z2ggdGhpcyBpcyBhIGNsYXNzLCBtZXRob2RzIGFyZSBzdGF0aWMgaW4gc3R5bGUgdG8gYWxsb3cgb3ZlcnJpZGUgdXNpbmcgc3ViY2xhc3Mgb3IganVzdCBmdW5jdGlvbnMuXG5jbGFzcyBIZWxwIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5oZWxwV2lkdGggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zb3J0U3ViY29tbWFuZHMgPSBmYWxzZTtcbiAgICB0aGlzLnNvcnRPcHRpb25zID0gZmFsc2U7XG4gICAgdGhpcy5zaG93R2xvYmFsT3B0aW9ucyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiB0aGUgdmlzaWJsZSBzdWJjb21tYW5kcy4gSW5jbHVkZXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGltcGxpY2l0IGhlbHAgY29tbWFuZCwgaWYgdGhlcmUgaXMgb25lLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7Q29tbWFuZFtdfVxuICAgKi9cblxuICB2aXNpYmxlQ29tbWFuZHMoY21kKSB7XG4gICAgY29uc3QgdmlzaWJsZUNvbW1hbmRzID0gY21kLmNvbW1hbmRzLmZpbHRlcigoY21kKSA9PiAhY21kLl9oaWRkZW4pO1xuICAgIGNvbnN0IGhlbHBDb21tYW5kID0gY21kLl9nZXRIZWxwQ29tbWFuZCgpO1xuICAgIGlmIChoZWxwQ29tbWFuZCAmJiAhaGVscENvbW1hbmQuX2hpZGRlbikge1xuICAgICAgdmlzaWJsZUNvbW1hbmRzLnB1c2goaGVscENvbW1hbmQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0U3ViY29tbWFuZHMpIHtcbiAgICAgIHZpc2libGVDb21tYW5kcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2Ugb3ZlcmxvYWRlZCByZXR1cm4gdHlwZVxuICAgICAgICByZXR1cm4gYS5uYW1lKCkubG9jYWxlQ29tcGFyZShiLm5hbWUoKSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZpc2libGVDb21tYW5kcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIG9wdGlvbnMgZm9yIHNvcnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBhXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBiXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBjb21wYXJlT3B0aW9ucyhhLCBiKSB7XG4gICAgY29uc3QgZ2V0U29ydEtleSA9IChvcHRpb24pID0+IHtcbiAgICAgIC8vIFdZU0lXWUcgZm9yIG9yZGVyIGRpc3BsYXllZCBpbiBoZWxwLiBTaG9ydCB1c2VkIGZvciBjb21wYXJpc29uIGlmIHByZXNlbnQuIE5vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG5lZ2F0ZWQuXG4gICAgICByZXR1cm4gb3B0aW9uLnNob3J0XG4gICAgICAgID8gb3B0aW9uLnNob3J0LnJlcGxhY2UoL14tLywgJycpXG4gICAgICAgIDogb3B0aW9uLmxvbmcucmVwbGFjZSgvXi0tLywgJycpO1xuICAgIH07XG4gICAgcmV0dXJuIGdldFNvcnRLZXkoYSkubG9jYWxlQ29tcGFyZShnZXRTb3J0S2V5KGIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIHZpc2libGUgb3B0aW9ucy4gSW5jbHVkZXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGltcGxpY2l0IGhlbHAgb3B0aW9uLCBpZiB0aGVyZSBpcyBvbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtPcHRpb25bXX1cbiAgICovXG5cbiAgdmlzaWJsZU9wdGlvbnMoY21kKSB7XG4gICAgY29uc3QgdmlzaWJsZU9wdGlvbnMgPSBjbWQub3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5oaWRkZW4pO1xuICAgIC8vIEJ1aWx0LWluIGhlbHAgb3B0aW9uLlxuICAgIGNvbnN0IGhlbHBPcHRpb24gPSBjbWQuX2dldEhlbHBPcHRpb24oKTtcbiAgICBpZiAoaGVscE9wdGlvbiAmJiAhaGVscE9wdGlvbi5oaWRkZW4pIHtcbiAgICAgIC8vIEF1dG9tYXRpY2FsbHkgaGlkZSBjb25mbGljdGluZyBmbGFncy4gQml0IGR1YmlvdXMgYnV0IGEgaGlzdG9yaWNhbCBiZWhhdmlvdXIgdGhhdCBpcyBjb252ZW5pZW50IGZvciBzaW5nbGUtY29tbWFuZCBwcm9ncmFtcy5cbiAgICAgIGNvbnN0IHJlbW92ZVNob3J0ID0gaGVscE9wdGlvbi5zaG9ydCAmJiBjbWQuX2ZpbmRPcHRpb24oaGVscE9wdGlvbi5zaG9ydCk7XG4gICAgICBjb25zdCByZW1vdmVMb25nID0gaGVscE9wdGlvbi5sb25nICYmIGNtZC5fZmluZE9wdGlvbihoZWxwT3B0aW9uLmxvbmcpO1xuICAgICAgaWYgKCFyZW1vdmVTaG9ydCAmJiAhcmVtb3ZlTG9uZykge1xuICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKGhlbHBPcHRpb24pOyAvLyBubyBjaGFuZ2VzIG5lZWRlZFxuICAgICAgfSBlbHNlIGlmIChoZWxwT3B0aW9uLmxvbmcgJiYgIXJlbW92ZUxvbmcpIHtcbiAgICAgICAgdmlzaWJsZU9wdGlvbnMucHVzaChcbiAgICAgICAgICBjbWQuY3JlYXRlT3B0aW9uKGhlbHBPcHRpb24ubG9uZywgaGVscE9wdGlvbi5kZXNjcmlwdGlvbiksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGhlbHBPcHRpb24uc2hvcnQgJiYgIXJlbW92ZVNob3J0KSB7XG4gICAgICAgIHZpc2libGVPcHRpb25zLnB1c2goXG4gICAgICAgICAgY21kLmNyZWF0ZU9wdGlvbihoZWxwT3B0aW9uLnNob3J0LCBoZWxwT3B0aW9uLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydE9wdGlvbnMpIHtcbiAgICAgIHZpc2libGVPcHRpb25zLnNvcnQodGhpcy5jb21wYXJlT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB2aXNpYmxlT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIHZpc2libGUgZ2xvYmFsIG9wdGlvbnMuIChOb3QgaW5jbHVkaW5nIGhlbHAuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7T3B0aW9uW119XG4gICAqL1xuXG4gIHZpc2libGVHbG9iYWxPcHRpb25zKGNtZCkge1xuICAgIGlmICghdGhpcy5zaG93R2xvYmFsT3B0aW9ucykgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgZ2xvYmFsT3B0aW9ucyA9IFtdO1xuICAgIGZvciAoXG4gICAgICBsZXQgYW5jZXN0b3JDbWQgPSBjbWQucGFyZW50O1xuICAgICAgYW5jZXN0b3JDbWQ7XG4gICAgICBhbmNlc3RvckNtZCA9IGFuY2VzdG9yQ21kLnBhcmVudFxuICAgICkge1xuICAgICAgY29uc3QgdmlzaWJsZU9wdGlvbnMgPSBhbmNlc3RvckNtZC5vcHRpb25zLmZpbHRlcihcbiAgICAgICAgKG9wdGlvbikgPT4gIW9wdGlvbi5oaWRkZW4sXG4gICAgICApO1xuICAgICAgZ2xvYmFsT3B0aW9ucy5wdXNoKC4uLnZpc2libGVPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc29ydE9wdGlvbnMpIHtcbiAgICAgIGdsb2JhbE9wdGlvbnMuc29ydCh0aGlzLmNvbXBhcmVPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbE9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IG9mIHRoZSBhcmd1bWVudHMgaWYgYW55IGhhdmUgYSBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge0FyZ3VtZW50W119XG4gICAqL1xuXG4gIHZpc2libGVBcmd1bWVudHMoY21kKSB7XG4gICAgLy8gU2lkZSBlZmZlY3QhIEFwcGx5IHRoZSBsZWdhY3kgZGVzY3JpcHRpb25zIGJlZm9yZSB0aGUgYXJndW1lbnRzIGFyZSBkaXNwbGF5ZWQuXG4gICAgaWYgKGNtZC5fYXJnc0Rlc2NyaXB0aW9uKSB7XG4gICAgICBjbWQucmVnaXN0ZXJlZEFyZ3VtZW50cy5mb3JFYWNoKChhcmd1bWVudCkgPT4ge1xuICAgICAgICBhcmd1bWVudC5kZXNjcmlwdGlvbiA9XG4gICAgICAgICAgYXJndW1lbnQuZGVzY3JpcHRpb24gfHwgY21kLl9hcmdzRGVzY3JpcHRpb25bYXJndW1lbnQubmFtZSgpXSB8fCAnJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgYXJndW1lbnRzIHdpdGggYSBkZXNjcmlwdGlvbiB0aGVuIHJldHVybiBhbGwgdGhlIGFyZ3VtZW50cy5cbiAgICBpZiAoY21kLnJlZ2lzdGVyZWRBcmd1bWVudHMuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50LmRlc2NyaXB0aW9uKSkge1xuICAgICAgcmV0dXJuIGNtZC5yZWdpc3RlcmVkQXJndW1lbnRzO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb21tYW5kIHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgc3ViY29tbWFuZFRlcm0oY21kKSB7XG4gICAgLy8gTGVnYWN5LiBJZ25vcmVzIGN1c3RvbSB1c2FnZSBzdHJpbmcsIGFuZCBuZXN0ZWQgY29tbWFuZHMuXG4gICAgY29uc3QgYXJncyA9IGNtZC5yZWdpc3RlcmVkQXJndW1lbnRzXG4gICAgICAubWFwKChhcmcpID0+IGh1bWFuUmVhZGFibGVBcmdOYW1lKGFyZykpXG4gICAgICAuam9pbignICcpO1xuICAgIHJldHVybiAoXG4gICAgICBjbWQuX25hbWUgK1xuICAgICAgKGNtZC5fYWxpYXNlc1swXSA/ICd8JyArIGNtZC5fYWxpYXNlc1swXSA6ICcnKSArXG4gICAgICAoY21kLm9wdGlvbnMubGVuZ3RoID8gJyBbb3B0aW9uc10nIDogJycpICsgLy8gc2ltcGxpc3RpYyBjaGVjayBmb3Igbm9uLWhlbHAgb3B0aW9uXG4gICAgICAoYXJncyA/ICcgJyArIGFyZ3MgOiAnJylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3B0aW9uIHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIG9wdGlvblRlcm0ob3B0aW9uKSB7XG4gICAgcmV0dXJuIG9wdGlvbi5mbGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFyZ3VtZW50IHRlcm0gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIGFyZ3VtZW50VGVybShhcmd1bWVudCkge1xuICAgIHJldHVybiBhcmd1bWVudC5uYW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb25nZXN0IGNvbW1hbmQgdGVybSBsZW5ndGguXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG4gIGxvbmdlc3RTdWJjb21tYW5kVGVybUxlbmd0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBoZWxwZXIudmlzaWJsZUNvbW1hbmRzKGNtZCkucmVkdWNlKChtYXgsIGNvbW1hbmQpID0+IHtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIGhlbHBlci5zdWJjb21tYW5kVGVybShjb21tYW5kKS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZ2VzdCBvcHRpb24gdGVybSBsZW5ndGguXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEBwYXJhbSB7SGVscH0gaGVscGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuXG4gIGxvbmdlc3RPcHRpb25UZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSB7XG4gICAgcmV0dXJuIGhlbHBlci52aXNpYmxlT3B0aW9ucyhjbWQpLnJlZHVjZSgobWF4LCBvcHRpb24pID0+IHtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIGhlbHBlci5vcHRpb25UZXJtKG9wdGlvbikubGVuZ3RoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmdlc3QgZ2xvYmFsIG9wdGlvbiB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdEdsb2JhbE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gaGVscGVyLnZpc2libGVHbG9iYWxPcHRpb25zKGNtZCkucmVkdWNlKChtYXgsIG9wdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLm9wdGlvblRlcm0ob3B0aW9uKS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZ2VzdCBhcmd1bWVudCB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdEFyZ3VtZW50VGVybUxlbmd0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBoZWxwZXIudmlzaWJsZUFyZ3VtZW50cyhjbWQpLnJlZHVjZSgobWF4LCBhcmd1bWVudCkgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLmFyZ3VtZW50VGVybShhcmd1bWVudCkubGVuZ3RoKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbW1hbmQgdXNhZ2UgdG8gYmUgZGlzcGxheWVkIGF0IHRoZSB0b3Agb2YgdGhlIGJ1aWx0LWluIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIGNvbW1hbmRVc2FnZShjbWQpIHtcbiAgICAvLyBVc2FnZVxuICAgIGxldCBjbWROYW1lID0gY21kLl9uYW1lO1xuICAgIGlmIChjbWQuX2FsaWFzZXNbMF0pIHtcbiAgICAgIGNtZE5hbWUgPSBjbWROYW1lICsgJ3wnICsgY21kLl9hbGlhc2VzWzBdO1xuICAgIH1cbiAgICBsZXQgYW5jZXN0b3JDbWROYW1lcyA9ICcnO1xuICAgIGZvciAoXG4gICAgICBsZXQgYW5jZXN0b3JDbWQgPSBjbWQucGFyZW50O1xuICAgICAgYW5jZXN0b3JDbWQ7XG4gICAgICBhbmNlc3RvckNtZCA9IGFuY2VzdG9yQ21kLnBhcmVudFxuICAgICkge1xuICAgICAgYW5jZXN0b3JDbWROYW1lcyA9IGFuY2VzdG9yQ21kLm5hbWUoKSArICcgJyArIGFuY2VzdG9yQ21kTmFtZXM7XG4gICAgfVxuICAgIHJldHVybiBhbmNlc3RvckNtZE5hbWVzICsgY21kTmFtZSArICcgJyArIGNtZC51c2FnZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBjb21tYW5kRGVzY3JpcHRpb24oY21kKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBvdmVybG9hZGVkIHJldHVybiB0eXBlXG4gICAgcmV0dXJuIGNtZC5kZXNjcmlwdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3ViY29tbWFuZCBzdW1tYXJ5IHRvIHNob3cgaW4gdGhlIGxpc3Qgb2Ygc3ViY29tbWFuZHMuXG4gICAqIChGYWxsYmFjayB0byBkZXNjcmlwdGlvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuKVxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBzdWJjb21tYW5kRGVzY3JpcHRpb24oY21kKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBvdmVybG9hZGVkIHJldHVybiB0eXBlXG4gICAgcmV0dXJuIGNtZC5zdW1tYXJ5KCkgfHwgY21kLmRlc2NyaXB0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvcHRpb24gZGVzY3JpcHRpb24gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgb3B0aW9uRGVzY3JpcHRpb24ob3B0aW9uKSB7XG4gICAgY29uc3QgZXh0cmFJbmZvID0gW107XG5cbiAgICBpZiAob3B0aW9uLmFyZ0Nob2ljZXMpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKFxuICAgICAgICAvLyB1c2Ugc3RyaW5naWZ5IHRvIG1hdGNoIHRoZSBkaXNwbGF5IG9mIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIGBjaG9pY2VzOiAke29wdGlvbi5hcmdDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiBKU09OLnN0cmluZ2lmeShjaG9pY2UpKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9uLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBkZWZhdWx0IGZvciBib29sZWFuIGFuZCBuZWdhdGVkIG1vcmUgZm9yIHByb2dyYW1tZXIgdGhhbiBlbmQgdXNlcixcbiAgICAgIC8vIGJ1dCBzaG93IHRydWUvZmFsc2UgZm9yIGJvb2xlYW4gb3B0aW9uIGFzIG1heSBiZSBmb3IgaGFuZC1yb2xsZWQgZW52IG9yIGNvbmZpZyBwcm9jZXNzaW5nLlxuICAgICAgY29uc3Qgc2hvd0RlZmF1bHQgPVxuICAgICAgICBvcHRpb24ucmVxdWlyZWQgfHxcbiAgICAgICAgb3B0aW9uLm9wdGlvbmFsIHx8XG4gICAgICAgIChvcHRpb24uaXNCb29sZWFuKCkgJiYgdHlwZW9mIG9wdGlvbi5kZWZhdWx0VmFsdWUgPT09ICdib29sZWFuJyk7XG4gICAgICBpZiAoc2hvd0RlZmF1bHQpIHtcbiAgICAgICAgZXh0cmFJbmZvLnB1c2goXG4gICAgICAgICAgYGRlZmF1bHQ6ICR7b3B0aW9uLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uIHx8IEpTT04uc3RyaW5naWZ5KG9wdGlvbi5kZWZhdWx0VmFsdWUpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHByZXNldCBmb3IgYm9vbGVhbiBhbmQgbmVnYXRlZCBhcmUgbW9yZSBmb3IgcHJvZ3JhbW1lciB0aGFuIGVuZCB1c2VyXG4gICAgaWYgKG9wdGlvbi5wcmVzZXRBcmcgIT09IHVuZGVmaW5lZCAmJiBvcHRpb24ub3B0aW9uYWwpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKGBwcmVzZXQ6ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9uLnByZXNldEFyZyl9YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb24uZW52VmFyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKGBlbnY6ICR7b3B0aW9uLmVudlZhcn1gKTtcbiAgICB9XG4gICAgaWYgKGV4dHJhSW5mby5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYCR7b3B0aW9uLmRlc2NyaXB0aW9ufSAoJHtleHRyYUluZm8uam9pbignLCAnKX0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9uLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXJndW1lbnQgZGVzY3JpcHRpb24gdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJndW1lbnR9IGFyZ3VtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgYXJndW1lbnREZXNjcmlwdGlvbihhcmd1bWVudCkge1xuICAgIGNvbnN0IGV4dHJhSW5mbyA9IFtdO1xuICAgIGlmIChhcmd1bWVudC5hcmdDaG9pY2VzKSB7XG4gICAgICBleHRyYUluZm8ucHVzaChcbiAgICAgICAgLy8gdXNlIHN0cmluZ2lmeSB0byBtYXRjaCB0aGUgZGlzcGxheSBvZiB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgICAgICBgY2hvaWNlczogJHthcmd1bWVudC5hcmdDaG9pY2VzLm1hcCgoY2hvaWNlKSA9PiBKU09OLnN0cmluZ2lmeShjaG9pY2UpKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYXJndW1lbnQuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKFxuICAgICAgICBgZGVmYXVsdDogJHthcmd1bWVudC5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiB8fCBKU09OLnN0cmluZ2lmeShhcmd1bWVudC5kZWZhdWx0VmFsdWUpfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZXh0cmFJbmZvLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4dHJhRGVzY3JpcHRvbiA9IGAoJHtleHRyYUluZm8uam9pbignLCAnKX0pYDtcbiAgICAgIGlmIChhcmd1bWVudC5kZXNjcmlwdGlvbikge1xuICAgICAgICByZXR1cm4gYCR7YXJndW1lbnQuZGVzY3JpcHRpb259ICR7ZXh0cmFEZXNjcmlwdG9ufWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXh0cmFEZXNjcmlwdG9uO1xuICAgIH1cbiAgICByZXR1cm4gYXJndW1lbnQuZGVzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdGhlIGJ1aWx0LWluIGhlbHAgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgZm9ybWF0SGVscChjbWQsIGhlbHBlcikge1xuICAgIGNvbnN0IHRlcm1XaWR0aCA9IGhlbHBlci5wYWRXaWR0aChjbWQsIGhlbHBlcik7XG4gICAgY29uc3QgaGVscFdpZHRoID0gaGVscGVyLmhlbHBXaWR0aCB8fCA4MDtcbiAgICBjb25zdCBpdGVtSW5kZW50V2lkdGggPSAyO1xuICAgIGNvbnN0IGl0ZW1TZXBhcmF0b3JXaWR0aCA9IDI7IC8vIGJldHdlZW4gdGVybSBhbmQgZGVzY3JpcHRpb25cbiAgICBmdW5jdGlvbiBmb3JtYXRJdGVtKHRlcm0sIGRlc2NyaXB0aW9uKSB7XG4gICAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgZnVsbFRleHQgPSBgJHt0ZXJtLnBhZEVuZCh0ZXJtV2lkdGggKyBpdGVtU2VwYXJhdG9yV2lkdGgpfSR7ZGVzY3JpcHRpb259YDtcbiAgICAgICAgcmV0dXJuIGhlbHBlci53cmFwKFxuICAgICAgICAgIGZ1bGxUZXh0LFxuICAgICAgICAgIGhlbHBXaWR0aCAtIGl0ZW1JbmRlbnRXaWR0aCxcbiAgICAgICAgICB0ZXJtV2lkdGggKyBpdGVtU2VwYXJhdG9yV2lkdGgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGVybTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZm9ybWF0TGlzdCh0ZXh0QXJyYXkpIHtcbiAgICAgIHJldHVybiB0ZXh0QXJyYXkuam9pbignXFxuJykucmVwbGFjZSgvXi9nbSwgJyAnLnJlcGVhdChpdGVtSW5kZW50V2lkdGgpKTtcbiAgICB9XG5cbiAgICAvLyBVc2FnZVxuICAgIGxldCBvdXRwdXQgPSBbYFVzYWdlOiAke2hlbHBlci5jb21tYW5kVXNhZ2UoY21kKX1gLCAnJ107XG5cbiAgICAvLyBEZXNjcmlwdGlvblxuICAgIGNvbnN0IGNvbW1hbmREZXNjcmlwdGlvbiA9IGhlbHBlci5jb21tYW5kRGVzY3JpcHRpb24oY21kKTtcbiAgICBpZiAoY29tbWFuZERlc2NyaXB0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoW1xuICAgICAgICBoZWxwZXIud3JhcChjb21tYW5kRGVzY3JpcHRpb24sIGhlbHBXaWR0aCwgMCksXG4gICAgICAgICcnLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gQXJndW1lbnRzXG4gICAgY29uc3QgYXJndW1lbnRMaXN0ID0gaGVscGVyLnZpc2libGVBcmd1bWVudHMoY21kKS5tYXAoKGFyZ3VtZW50KSA9PiB7XG4gICAgICByZXR1cm4gZm9ybWF0SXRlbShcbiAgICAgICAgaGVscGVyLmFyZ3VtZW50VGVybShhcmd1bWVudCksXG4gICAgICAgIGhlbHBlci5hcmd1bWVudERlc2NyaXB0aW9uKGFyZ3VtZW50KSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGFyZ3VtZW50TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBvdXRwdXQgPSBvdXRwdXQuY29uY2F0KFsnQXJndW1lbnRzOicsIGZvcm1hdExpc3QoYXJndW1lbnRMaXN0KSwgJyddKTtcbiAgICB9XG5cbiAgICAvLyBPcHRpb25zXG4gICAgY29uc3Qgb3B0aW9uTGlzdCA9IGhlbHBlci52aXNpYmxlT3B0aW9ucyhjbWQpLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gZm9ybWF0SXRlbShcbiAgICAgICAgaGVscGVyLm9wdGlvblRlcm0ob3B0aW9uKSxcbiAgICAgICAgaGVscGVyLm9wdGlvbkRlc2NyaXB0aW9uKG9wdGlvbiksXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChvcHRpb25MaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoWydPcHRpb25zOicsIGZvcm1hdExpc3Qob3B0aW9uTGlzdCksICcnXSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvd0dsb2JhbE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGdsb2JhbE9wdGlvbkxpc3QgPSBoZWxwZXJcbiAgICAgICAgLnZpc2libGVHbG9iYWxPcHRpb25zKGNtZClcbiAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1hdEl0ZW0oXG4gICAgICAgICAgICBoZWxwZXIub3B0aW9uVGVybShvcHRpb24pLFxuICAgICAgICAgICAgaGVscGVyLm9wdGlvbkRlc2NyaXB0aW9uKG9wdGlvbiksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAoZ2xvYmFsT3B0aW9uTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoW1xuICAgICAgICAgICdHbG9iYWwgT3B0aW9uczonLFxuICAgICAgICAgIGZvcm1hdExpc3QoZ2xvYmFsT3B0aW9uTGlzdCksXG4gICAgICAgICAgJycsXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbW1hbmRzXG4gICAgY29uc3QgY29tbWFuZExpc3QgPSBoZWxwZXIudmlzaWJsZUNvbW1hbmRzKGNtZCkubWFwKChjbWQpID0+IHtcbiAgICAgIHJldHVybiBmb3JtYXRJdGVtKFxuICAgICAgICBoZWxwZXIuc3ViY29tbWFuZFRlcm0oY21kKSxcbiAgICAgICAgaGVscGVyLnN1YmNvbW1hbmREZXNjcmlwdGlvbihjbWQpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAoY29tbWFuZExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChbJ0NvbW1hbmRzOicsIGZvcm1hdExpc3QoY29tbWFuZExpc3QpLCAnJ10pO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQuam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBwYWQgd2lkdGggZnJvbSB0aGUgbWF4aW11bSB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgcGFkV2lkdGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoXG4gICAgICBoZWxwZXIubG9uZ2VzdE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICAgaGVscGVyLmxvbmdlc3RHbG9iYWxPcHRpb25UZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSxcbiAgICAgIGhlbHBlci5sb25nZXN0U3ViY29tbWFuZFRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICAgaGVscGVyLmxvbmdlc3RBcmd1bWVudFRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHdpZHRoIGNoYXJhY3RlcnMgcGVyIGxpbmUsIHdpdGggbGluZXMgYWZ0ZXIgdGhlIGZpcnN0IGluZGVudGVkLlxuICAgKiBEbyBub3Qgd3JhcCBpZiBpbnN1ZmZpY2llbnQgcm9vbSBmb3Igd3JhcHBpbmcgKG1pbkNvbHVtbldpZHRoKSwgb3Igc3RyaW5nIGlzIG1hbnVhbGx5IGZvcm1hdHRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGVudFxuICAgKiBAcGFyYW0ge251bWJlcn0gW21pbkNvbHVtbldpZHRoPTQwXVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqXG4gICAqL1xuXG4gIHdyYXAoc3RyLCB3aWR0aCwgaW5kZW50LCBtaW5Db2x1bW5XaWR0aCA9IDQwKSB7XG4gICAgLy8gRnVsbCBcXHMgY2hhcmFjdGVycywgbWludXMgdGhlIGxpbmVmZWVkcy5cbiAgICBjb25zdCBpbmRlbnRzID1cbiAgICAgICcgXFxcXGZcXFxcdFxcXFx2XFx1MDBhMFxcdTE2ODBcXHUyMDAwLVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDBcXHVmZWZmJztcbiAgICAvLyBEZXRlY3QgbWFudWFsbHkgd3JhcHBlZCBhbmQgaW5kZW50ZWQgc3RyaW5ncyBieSBzZWFyY2hpbmcgZm9yIGxpbmUgYnJlYWsgZm9sbG93ZWQgYnkgc3BhY2VzLlxuICAgIGNvbnN0IG1hbnVhbEluZGVudCA9IG5ldyBSZWdFeHAoYFtcXFxcbl1bJHtpbmRlbnRzfV0rYCk7XG4gICAgaWYgKHN0ci5tYXRjaChtYW51YWxJbmRlbnQpKSByZXR1cm4gc3RyO1xuICAgIC8vIERvIG5vdCB3cmFwIGlmIG5vdCBlbm91Z2ggcm9vbSBmb3IgYSB3cmFwcGVkIGNvbHVtbiBvZiB0ZXh0IChhcyBjb3VsZCBlbmQgdXAgd2l0aCBhIHdvcmQgcGVyIGxpbmUpLlxuICAgIGNvbnN0IGNvbHVtbldpZHRoID0gd2lkdGggLSBpbmRlbnQ7XG4gICAgaWYgKGNvbHVtbldpZHRoIDwgbWluQ29sdW1uV2lkdGgpIHJldHVybiBzdHI7XG5cbiAgICBjb25zdCBsZWFkaW5nU3RyID0gc3RyLnNsaWNlKDAsIGluZGVudCk7XG4gICAgY29uc3QgY29sdW1uVGV4dCA9IHN0ci5zbGljZShpbmRlbnQpLnJlcGxhY2UoJ1xcclxcbicsICdcXG4nKTtcbiAgICBjb25zdCBpbmRlbnRTdHJpbmcgPSAnICcucmVwZWF0KGluZGVudCk7XG4gICAgY29uc3QgemVyb1dpZHRoU3BhY2UgPSAnXFx1MjAwQic7XG4gICAgY29uc3QgYnJlYWtzID0gYFxcXFxzJHt6ZXJvV2lkdGhTcGFjZX1gO1xuICAgIC8vIE1hdGNoIGxpbmUgZW5kIChzbyBlbXB0eSBsaW5lcyBkb24ndCBjb2xsYXBzZSksXG4gICAgLy8gb3IgYXMgbXVjaCB0ZXh0IGFzIHdpbGwgZml0IGluIGNvbHVtbiwgb3IgZXhjZXNzIHRleHQgdXAgdG8gZmlyc3QgYnJlYWsuXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgYFxcbnwuezEsJHtjb2x1bW5XaWR0aCAtIDF9fShbJHticmVha3N9XXwkKXxbXiR7YnJlYWtzfV0rPyhbJHticmVha3N9XXwkKWAsXG4gICAgICAnZycsXG4gICAgKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbHVtblRleHQubWF0Y2gocmVnZXgpIHx8IFtdO1xuICAgIHJldHVybiAoXG4gICAgICBsZWFkaW5nU3RyICtcbiAgICAgIGxpbmVzXG4gICAgICAgIC5tYXAoKGxpbmUsIGkpID0+IHtcbiAgICAgICAgICBpZiAobGluZSA9PT0gJ1xcbicpIHJldHVybiAnJzsgLy8gcHJlc2VydmUgZW1wdHkgbGluZXNcbiAgICAgICAgICByZXR1cm4gKGkgPiAwID8gaW5kZW50U3RyaW5nIDogJycpICsgbGluZS50cmltRW5kKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0cy5IZWxwID0gSGVscDtcbiIsImNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3IuanMnKTtcblxuY2xhc3MgT3B0aW9uIHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBuZXcgYE9wdGlvbmAgd2l0aCB0aGUgZ2l2ZW4gYGZsYWdzYCBhbmQgYGRlc2NyaXB0aW9uYC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICAgIHRoaXMuZmxhZ3MgPSBmbGFncztcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgJyc7XG5cbiAgICB0aGlzLnJlcXVpcmVkID0gZmxhZ3MuaW5jbHVkZXMoJzwnKTsgLy8gQSB2YWx1ZSBtdXN0IGJlIHN1cHBsaWVkIHdoZW4gdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQuXG4gICAgdGhpcy5vcHRpb25hbCA9IGZsYWdzLmluY2x1ZGVzKCdbJyk7IC8vIEEgdmFsdWUgaXMgb3B0aW9uYWwgd2hlbiB0aGUgb3B0aW9uIGlzIHNwZWNpZmllZC5cbiAgICAvLyB2YXJpYWRpYyB0ZXN0IGlnbm9yZXMgPHZhbHVlLC4uLj4gZXQgYWwgd2hpY2ggbWlnaHQgYmUgdXNlZCB0byBkZXNjcmliZSBjdXN0b20gc3BsaXR0aW5nIG9mIHNpbmdsZSBhcmd1bWVudFxuICAgIHRoaXMudmFyaWFkaWMgPSAvXFx3XFwuXFwuXFwuWz5cXF1dJC8udGVzdChmbGFncyk7IC8vIFRoZSBvcHRpb24gY2FuIHRha2UgbXVsdGlwbGUgdmFsdWVzLlxuICAgIHRoaXMubWFuZGF0b3J5ID0gZmFsc2U7IC8vIFRoZSBvcHRpb24gbXVzdCBoYXZlIGEgdmFsdWUgYWZ0ZXIgcGFyc2luZywgd2hpY2ggdXN1YWxseSBtZWFucyBpdCBtdXN0IGJlIHNwZWNpZmllZCBvbiBjb21tYW5kIGxpbmUuXG4gICAgY29uc3Qgb3B0aW9uRmxhZ3MgPSBzcGxpdE9wdGlvbkZsYWdzKGZsYWdzKTtcbiAgICB0aGlzLnNob3J0ID0gb3B0aW9uRmxhZ3Muc2hvcnRGbGFnO1xuICAgIHRoaXMubG9uZyA9IG9wdGlvbkZsYWdzLmxvbmdGbGFnO1xuICAgIHRoaXMubmVnYXRlID0gZmFsc2U7XG4gICAgaWYgKHRoaXMubG9uZykge1xuICAgICAgdGhpcy5uZWdhdGUgPSB0aGlzLmxvbmcuc3RhcnRzV2l0aCgnLS1uby0nKTtcbiAgICB9XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnByZXNldEFyZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVudlZhciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBhcnNlQXJnID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29uZmxpY3RzV2l0aCA9IFtdO1xuICAgIHRoaXMuaW1wbGllZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUsIGFuZCBvcHRpb25hbGx5IHN1cHBseSB0aGUgZGVzY3JpcHRpb24gdG8gYmUgZGlzcGxheWVkIGluIHRoZSBoZWxwLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgZGVmYXVsdCh2YWx1ZSwgZGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVzZXQgdG8gdXNlIHdoZW4gb3B0aW9uIHVzZWQgd2l0aG91dCBvcHRpb24tYXJndW1lbnQsIGVzcGVjaWFsbHkgb3B0aW9uYWwgYnV0IGFsc28gYm9vbGVhbiBhbmQgbmVnYXRlZC5cbiAgICogVGhlIGN1c3RvbSBwcm9jZXNzaW5nIChwYXJzZUFyZykgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBuZXcgT3B0aW9uKCctLWNvbG9yJykuZGVmYXVsdCgnR1JFWVNDQUxFJykucHJlc2V0KCdSR0InKTtcbiAgICogbmV3IE9wdGlvbignLS1kb25hdGUgW2Ftb3VudF0nKS5wcmVzZXQoJzIwJykuYXJnUGFyc2VyKHBhcnNlRmxvYXQpO1xuICAgKlxuICAgKiBAcGFyYW0geyp9IGFyZ1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIHByZXNldChhcmcpIHtcbiAgICB0aGlzLnByZXNldEFyZyA9IGFyZztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgb3B0aW9uIG5hbWUocykgdGhhdCBjb25mbGljdCB3aXRoIHRoaXMgb3B0aW9uLlxuICAgKiBBbiBlcnJvciB3aWxsIGJlIGRpc3BsYXllZCBpZiBjb25mbGljdGluZyBvcHRpb25zIGFyZSBmb3VuZCBkdXJpbmcgcGFyc2luZy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbmV3IE9wdGlvbignLS1yZ2InKS5jb25mbGljdHMoJ2NteWsnKTtcbiAgICogbmV3IE9wdGlvbignLS1qcycpLmNvbmZsaWN0cyhbJ3RzJywgJ2pzeCddKTtcbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgc3RyaW5nW10pfSBuYW1lc1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGNvbmZsaWN0cyhuYW1lcykge1xuICAgIHRoaXMuY29uZmxpY3RzV2l0aCA9IHRoaXMuY29uZmxpY3RzV2l0aC5jb25jYXQobmFtZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgaW1wbGllZCBvcHRpb24gdmFsdWVzIGZvciB3aGVuIHRoaXMgb3B0aW9uIGlzIHNldCBhbmQgdGhlIGltcGxpZWQgb3B0aW9ucyBhcmUgbm90LlxuICAgKlxuICAgKiBUaGUgY3VzdG9tIHByb2Nlc3NpbmcgKHBhcnNlQXJnKSBpcyBub3QgY2FsbGVkIG9uIHRoZSBpbXBsaWVkIHZhbHVlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1sb2cnLCAnd3JpdGUgbG9nZ2luZyBpbmZvcm1hdGlvbiB0byBmaWxlJykpXG4gICAqICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLXRyYWNlJywgJ2xvZyBleHRyYSBkZXRhaWxzJykuaW1wbGllcyh7IGxvZzogJ3RyYWNlLnR4dCcgfSkpO1xuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW1wbGllZE9wdGlvblZhbHVlc1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuICBpbXBsaWVzKGltcGxpZWRPcHRpb25WYWx1ZXMpIHtcbiAgICBsZXQgbmV3SW1wbGllZCA9IGltcGxpZWRPcHRpb25WYWx1ZXM7XG4gICAgaWYgKHR5cGVvZiBpbXBsaWVkT3B0aW9uVmFsdWVzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gc3RyaW5nIGlzIG5vdCBkb2N1bWVudGVkLCBidXQgZWFzeSBtaXN0YWtlIGFuZCB3ZSBjYW4gZG8gd2hhdCB1c2VyIHByb2JhYmx5IGludGVuZGVkLlxuICAgICAgbmV3SW1wbGllZCA9IHsgW2ltcGxpZWRPcHRpb25WYWx1ZXNdOiB0cnVlIH07XG4gICAgfVxuICAgIHRoaXMuaW1wbGllZCA9IE9iamVjdC5hc3NpZ24odGhpcy5pbXBsaWVkIHx8IHt9LCBuZXdJbXBsaWVkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gY2hlY2sgZm9yIG9wdGlvbiB2YWx1ZS5cbiAgICpcbiAgICogQW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgb25seSB1c2VkIGlmIHdoZW4gcHJvY2Vzc2VkIHRoZSBjdXJyZW50IG9wdGlvbiB2YWx1ZSBpc1xuICAgKiB1bmRlZmluZWQsIG9yIHRoZSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgdmFsdWUgaXMgJ2RlZmF1bHQnIG9yICdjb25maWcnIG9yICdlbnYnLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGVudihuYW1lKSB7XG4gICAgdGhpcy5lbnZWYXIgPSBuYW1lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VzdG9tIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgQ0xJIG9wdGlvbiBhcmd1bWVudHMgaW50byBvcHRpb24gdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgYXJnUGFyc2VyKGZuKSB7XG4gICAgdGhpcy5wYXJzZUFyZyA9IGZuO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBtYW5kYXRvcnkgYW5kIG11c3QgaGF2ZSBhIHZhbHVlIGFmdGVyIHBhcnNpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW21hbmRhdG9yeT10cnVlXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIG1ha2VPcHRpb25NYW5kYXRvcnkobWFuZGF0b3J5ID0gdHJ1ZSkge1xuICAgIHRoaXMubWFuZGF0b3J5ID0gISFtYW5kYXRvcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSBvcHRpb24gaW4gaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbaGlkZT10cnVlXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGhpZGVIZWxwKGhpZGUgPSB0cnVlKSB7XG4gICAgdGhpcy5oaWRkZW4gPSAhIWhpZGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhY2thZ2VcbiAgICovXG5cbiAgX2NvbmNhdFZhbHVlKHZhbHVlLCBwcmV2aW91cykge1xuICAgIGlmIChwcmV2aW91cyA9PT0gdGhpcy5kZWZhdWx0VmFsdWUgfHwgIUFycmF5LmlzQXJyYXkocHJldmlvdXMpKSB7XG4gICAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJldmlvdXMuY29uY2F0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmx5IGFsbG93IG9wdGlvbiB2YWx1ZSB0byBiZSBvbmUgb2YgY2hvaWNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdmFsdWVzXG4gICAqIEByZXR1cm4ge09wdGlvbn1cbiAgICovXG5cbiAgY2hvaWNlcyh2YWx1ZXMpIHtcbiAgICB0aGlzLmFyZ0Nob2ljZXMgPSB2YWx1ZXMuc2xpY2UoKTtcbiAgICB0aGlzLnBhcnNlQXJnID0gKGFyZywgcHJldmlvdXMpID0+IHtcbiAgICAgIGlmICghdGhpcy5hcmdDaG9pY2VzLmluY2x1ZGVzKGFyZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgIGBBbGxvd2VkIGNob2ljZXMgYXJlICR7dGhpcy5hcmdDaG9pY2VzLmpvaW4oJywgJyl9LmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52YXJpYWRpYykge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uY2F0VmFsdWUoYXJnLCBwcmV2aW91cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIG9wdGlvbiBuYW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIG5hbWUoKSB7XG4gICAgaWYgKHRoaXMubG9uZykge1xuICAgICAgcmV0dXJuIHRoaXMubG9uZy5yZXBsYWNlKC9eLS0vLCAnJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3J0LnJlcGxhY2UoL14tLywgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBvcHRpb24gbmFtZSwgaW4gYSBjYW1lbGNhc2UgZm9ybWF0IHRoYXQgY2FuIGJlIHVzZWRcbiAgICogYXMgYSBvYmplY3QgYXR0cmlidXRlIGtleS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBhdHRyaWJ1dGVOYW1lKCkge1xuICAgIHJldHVybiBjYW1lbGNhc2UodGhpcy5uYW1lKCkucmVwbGFjZSgvXm5vLS8sICcnKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYGFyZ2AgbWF0Y2hlcyB0aGUgc2hvcnQgb3IgbG9uZyBmbGFnLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIGlzKGFyZykge1xuICAgIHJldHVybiB0aGlzLnNob3J0ID09PSBhcmcgfHwgdGhpcy5sb25nID09PSBhcmc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgYSBib29sZWFuIG9wdGlvbi5cbiAgICpcbiAgICogT3B0aW9ucyBhcmUgb25lIG9mIGJvb2xlYW4sIG5lZ2F0ZWQsIHJlcXVpcmVkIGFyZ3VtZW50LCBvciBvcHRpb25hbCBhcmd1bWVudC5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogQHBhY2thZ2VcbiAgICovXG5cbiAgaXNCb29sZWFuKCkge1xuICAgIHJldHVybiAhdGhpcy5yZXF1aXJlZCAmJiAhdGhpcy5vcHRpb25hbCAmJiAhdGhpcy5uZWdhdGU7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdvcmsgd2l0aCBkdWFsIG9wdGlvbnMsIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGV4aXN0aW5nXG4gKiBpbXBsZW1lbnRhdGlvbi4gV2Ugc3VwcG9ydCBzZXBhcmF0ZSBkdWFsIG9wdGlvbnMgZm9yIHNlcGFyYXRlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBvcHRpb25zLFxuICogbGlrZSBgLS1idWlsZGAgYW5kIGAtLW5vLWJ1aWxkYCwgd2hpY2ggc2hhcmUgYSBzaW5nbGUgb3B0aW9uIHZhbHVlLiBUaGlzIHdvcmtzIG5pY2VseSBmb3Igc29tZVxuICogdXNlIGNhc2VzLCBidXQgaXMgdHJpY2t5IGZvciBvdGhlcnMgd2hlcmUgd2Ugd2FudCBzZXBhcmF0ZSBiZWhhdmlvdXJzIGRlc3BpdGVcbiAqIHRoZSBzaW5nbGUgc2hhcmVkIG9wdGlvbiB2YWx1ZS5cbiAqL1xuY2xhc3MgRHVhbE9wdGlvbnMge1xuICAvKipcbiAgICogQHBhcmFtIHtPcHRpb25bXX0gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHRoaXMucG9zaXRpdmVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgIHRoaXMubmVnYXRpdmVPcHRpb25zID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZHVhbE9wdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IHtcbiAgICAgIGlmIChvcHRpb24ubmVnYXRlKSB7XG4gICAgICAgIHRoaXMubmVnYXRpdmVPcHRpb25zLnNldChvcHRpb24uYXR0cmlidXRlTmFtZSgpLCBvcHRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3NpdGl2ZU9wdGlvbnMuc2V0KG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCksIG9wdGlvbik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5uZWdhdGl2ZU9wdGlvbnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgaWYgKHRoaXMucG9zaXRpdmVPcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuZHVhbE9wdGlvbnMuYWRkKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlkIHRoZSB2YWx1ZSBjb21lIGZyb20gdGhlIG9wdGlvbiwgYW5kIG5vdCBmcm9tIHBvc3NpYmxlIG1hdGNoaW5nIGR1YWwgb3B0aW9uP1xuICAgKlxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICB2YWx1ZUZyb21PcHRpb24odmFsdWUsIG9wdGlvbikge1xuICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgaWYgKCF0aGlzLmR1YWxPcHRpb25zLmhhcyhvcHRpb25LZXkpKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIFVzZSB0aGUgdmFsdWUgdG8gZGVkdWNlIGlmIChwcm9iYWJseSkgY2FtZSBmcm9tIHRoZSBvcHRpb24uXG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5uZWdhdGl2ZU9wdGlvbnMuZ2V0KG9wdGlvbktleSkucHJlc2V0QXJnO1xuICAgIGNvbnN0IG5lZ2F0aXZlVmFsdWUgPSBwcmVzZXQgIT09IHVuZGVmaW5lZCA/IHByZXNldCA6IGZhbHNlO1xuICAgIHJldHVybiBvcHRpb24ubmVnYXRlID09PSAobmVnYXRpdmVWYWx1ZSA9PT0gdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBzdHJpbmcgZnJvbSBrZWJhYi1jYXNlIHRvIGNhbWVsQ2FzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNhbWVsY2FzZShzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgnLScpLnJlZHVjZSgoc3RyLCB3b3JkKSA9PiB7XG4gICAgcmV0dXJuIHN0ciArIHdvcmRbMF0udG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFNwbGl0IHRoZSBzaG9ydCBhbmQgbG9uZyBmbGFnIG91dCBvZiBzb21ldGhpbmcgbGlrZSAnLW0sLS1taXhlZCA8dmFsdWU+J1xuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BsaXRPcHRpb25GbGFncyhmbGFncykge1xuICBsZXQgc2hvcnRGbGFnO1xuICBsZXQgbG9uZ0ZsYWc7XG4gIC8vIFVzZSBvcmlnaW5hbCB2ZXJ5IGxvb3NlIHBhcnNpbmcgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIG5vdyxcbiAgLy8gd2hpY2ggYWxsb3dlZCBmb3IgZXhhbXBsZSB1bmludGVuZGVkIGAtc3csIC0tc2hvcnQtd29yZGAgW3NpY10uXG4gIGNvbnN0IGZsYWdQYXJ0cyA9IGZsYWdzLnNwbGl0KC9bIHwsXSsvKTtcbiAgaWYgKGZsYWdQYXJ0cy5sZW5ndGggPiAxICYmICEvXltbPF0vLnRlc3QoZmxhZ1BhcnRzWzFdKSlcbiAgICBzaG9ydEZsYWcgPSBmbGFnUGFydHMuc2hpZnQoKTtcbiAgbG9uZ0ZsYWcgPSBmbGFnUGFydHMuc2hpZnQoKTtcbiAgLy8gQWRkIHN1cHBvcnQgZm9yIGxvbmUgc2hvcnQgZmxhZyB3aXRob3V0IHNpZ25pZmljYW50bHkgY2hhbmdpbmcgcGFyc2luZyFcbiAgaWYgKCFzaG9ydEZsYWcgJiYgL14tW14tXSQvLnRlc3QobG9uZ0ZsYWcpKSB7XG4gICAgc2hvcnRGbGFnID0gbG9uZ0ZsYWc7XG4gICAgbG9uZ0ZsYWcgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc2hvcnRGbGFnLCBsb25nRmxhZyB9O1xufVxuXG5leHBvcnRzLk9wdGlvbiA9IE9wdGlvbjtcbmV4cG9ydHMuRHVhbE9wdGlvbnMgPSBEdWFsT3B0aW9ucztcbiIsImNvbnN0IG1heERpc3RhbmNlID0gMztcblxuZnVuY3Rpb24gZWRpdERpc3RhbmNlKGEsIGIpIHtcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGFtZXJhdeKAk0xldmVuc2h0ZWluX2Rpc3RhbmNlXG4gIC8vIENhbGN1bGF0aW5nIG9wdGltYWwgc3RyaW5nIGFsaWdubWVudCBkaXN0YW5jZSwgbm8gc3Vic3RyaW5nIGlzIGVkaXRlZCBtb3JlIHRoYW4gb25jZS5cbiAgLy8gKFNpbXBsZSBpbXBsZW1lbnRhdGlvbi4pXG5cbiAgLy8gUXVpY2sgZWFybHkgZXhpdCwgcmV0dXJuIHdvcnN0IGNhc2UuXG4gIGlmIChNYXRoLmFicyhhLmxlbmd0aCAtIGIubGVuZ3RoKSA+IG1heERpc3RhbmNlKVxuICAgIHJldHVybiBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuXG4gIC8vIGRpc3RhbmNlIGJldHdlZW4gcHJlZml4IHN1YnN0cmluZ3Mgb2YgYSBhbmQgYlxuICBjb25zdCBkID0gW107XG5cbiAgLy8gcHVyZSBkZWxldGlvbnMgdHVybiBhIGludG8gZW1wdHkgc3RyaW5nXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IGEubGVuZ3RoOyBpKyspIHtcbiAgICBkW2ldID0gW2ldO1xuICB9XG4gIC8vIHB1cmUgaW5zZXJ0aW9ucyB0dXJuIGVtcHR5IHN0cmluZyBpbnRvIGJcbiAgZm9yIChsZXQgaiA9IDA7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIGRbMF1bal0gPSBqO1xuICB9XG5cbiAgLy8gZmlsbCBtYXRyaXhcbiAgZm9yIChsZXQgaiA9IDE7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjb3N0ID0gMTtcbiAgICAgIGlmIChhW2kgLSAxXSA9PT0gYltqIC0gMV0pIHtcbiAgICAgICAgY29zdCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3N0ID0gMTtcbiAgICAgIH1cbiAgICAgIGRbaV1bal0gPSBNYXRoLm1pbihcbiAgICAgICAgZFtpIC0gMV1bal0gKyAxLCAvLyBkZWxldGlvblxuICAgICAgICBkW2ldW2ogLSAxXSArIDEsIC8vIGluc2VydGlvblxuICAgICAgICBkW2kgLSAxXVtqIC0gMV0gKyBjb3N0LCAvLyBzdWJzdGl0dXRpb25cbiAgICAgICk7XG4gICAgICAvLyB0cmFuc3Bvc2l0aW9uXG4gICAgICBpZiAoaSA+IDEgJiYgaiA+IDEgJiYgYVtpIC0gMV0gPT09IGJbaiAtIDJdICYmIGFbaSAtIDJdID09PSBiW2ogLSAxXSkge1xuICAgICAgICBkW2ldW2pdID0gTWF0aC5taW4oZFtpXVtqXSwgZFtpIC0gMl1baiAtIDJdICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRbYS5sZW5ndGhdW2IubGVuZ3RoXTtcbn1cblxuLyoqXG4gKiBGaW5kIGNsb3NlIG1hdGNoZXMsIHJlc3RyaWN0ZWQgdG8gc2FtZSBudW1iZXIgb2YgZWRpdHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IGNhbmRpZGF0ZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gc3VnZ2VzdFNpbWlsYXIod29yZCwgY2FuZGlkYXRlcykge1xuICBpZiAoIWNhbmRpZGF0ZXMgfHwgY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgLy8gcmVtb3ZlIHBvc3NpYmxlIGR1cGxpY2F0ZXNcbiAgY2FuZGlkYXRlcyA9IEFycmF5LmZyb20obmV3IFNldChjYW5kaWRhdGVzKSk7XG5cbiAgY29uc3Qgc2VhcmNoaW5nT3B0aW9ucyA9IHdvcmQuc3RhcnRzV2l0aCgnLS0nKTtcbiAgaWYgKHNlYXJjaGluZ09wdGlvbnMpIHtcbiAgICB3b3JkID0gd29yZC5zbGljZSgyKTtcbiAgICBjYW5kaWRhdGVzID0gY2FuZGlkYXRlcy5tYXAoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnNsaWNlKDIpKTtcbiAgfVxuXG4gIGxldCBzaW1pbGFyID0gW107XG4gIGxldCBiZXN0RGlzdGFuY2UgPSBtYXhEaXN0YW5jZTtcbiAgY29uc3QgbWluU2ltaWxhcml0eSA9IDAuNDtcbiAgY2FuZGlkYXRlcy5mb3JFYWNoKChjYW5kaWRhdGUpID0+IHtcbiAgICBpZiAoY2FuZGlkYXRlLmxlbmd0aCA8PSAxKSByZXR1cm47IC8vIG5vIG9uZSBjaGFyYWN0ZXIgZ3Vlc3Nlc1xuXG4gICAgY29uc3QgZGlzdGFuY2UgPSBlZGl0RGlzdGFuY2Uod29yZCwgY2FuZGlkYXRlKTtcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCh3b3JkLmxlbmd0aCwgY2FuZGlkYXRlLmxlbmd0aCk7XG4gICAgY29uc3Qgc2ltaWxhcml0eSA9IChsZW5ndGggLSBkaXN0YW5jZSkgLyBsZW5ndGg7XG4gICAgaWYgKHNpbWlsYXJpdHkgPiBtaW5TaW1pbGFyaXR5KSB7XG4gICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgLy8gYmV0dGVyIGVkaXQgZGlzdGFuY2UsIHRocm93IGF3YXkgcHJldmlvdXMgd29yc2UgbWF0Y2hlc1xuICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgc2ltaWxhciA9IFtjYW5kaWRhdGVdO1xuICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA9PT0gYmVzdERpc3RhbmNlKSB7XG4gICAgICAgIHNpbWlsYXIucHVzaChjYW5kaWRhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgc2ltaWxhci5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBpZiAoc2VhcmNoaW5nT3B0aW9ucykge1xuICAgIHNpbWlsYXIgPSBzaW1pbGFyLm1hcCgoY2FuZGlkYXRlKSA9PiBgLS0ke2NhbmRpZGF0ZX1gKTtcbiAgfVxuXG4gIGlmIChzaW1pbGFyLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gYFxcbihEaWQgeW91IG1lYW4gb25lIG9mICR7c2ltaWxhci5qb2luKCcsICcpfT8pYDtcbiAgfVxuICBpZiAoc2ltaWxhci5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYFxcbihEaWQgeW91IG1lYW4gJHtzaW1pbGFyWzBdfT8pYDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydHMuc3VnZ2VzdFNpbWlsYXIgPSBzdWdnZXN0U2ltaWxhcjtcbiIsImNvbnN0IHBlcmYgPVxuICB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmXG4gIHBlcmZvcm1hbmNlICYmXG4gIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbidcbiAgICA/IHBlcmZvcm1hbmNlXG4gICAgOiBEYXRlXG5cbmNvbnN0IGhhc0Fib3J0Q29udHJvbGxlciA9IHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgPT09ICdmdW5jdGlvbidcblxuLy8gbWluaW1hbCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBwb2x5ZmlsbFxuLy8gdGhpcyBkb2Vzbid0IGhhdmUgbmVhcmx5IGFsbCB0aGUgY2hlY2tzIGFuZCB3aGF0bm90IHRoYXRcbi8vIGFjdHVhbCBBYm9ydENvbnRyb2xsZXIvU2lnbmFsIGhhcywgYnV0IGl0J3MgZW5vdWdoIGZvclxuLy8gb3VyIHB1cnBvc2VzLCBhbmQgaWYgdXNlZCBwcm9wZXJseSwgYmVoYXZlcyB0aGUgc2FtZS5cbmNvbnN0IEFDID0gaGFzQWJvcnRDb250cm9sbGVyXG4gID8gQWJvcnRDb250cm9sbGVyXG4gIDogY2xhc3MgQWJvcnRDb250cm9sbGVyIHtcbiAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNpZ25hbCA9IG5ldyBBUygpXG4gICAgICB9XG4gICAgICBhYm9ydChyZWFzb24gPSBuZXcgRXJyb3IoJ1RoaXMgb3BlcmF0aW9uIHdhcyBhYm9ydGVkJykpIHtcbiAgICAgICAgdGhpcy5zaWduYWwucmVhc29uID0gdGhpcy5zaWduYWwucmVhc29uIHx8IHJlYXNvblxuICAgICAgICB0aGlzLnNpZ25hbC5hYm9ydGVkID0gdHJ1ZVxuICAgICAgICB0aGlzLnNpZ25hbC5kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnYWJvcnQnLFxuICAgICAgICAgIHRhcmdldDogdGhpcy5zaWduYWwsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG5jb25zdCBoYXNBYm9ydFNpZ25hbCA9IHR5cGVvZiBBYm9ydFNpZ25hbCA9PT0gJ2Z1bmN0aW9uJ1xuLy8gU29tZSBwb2x5ZmlsbHMgcHV0IHRoaXMgb24gdGhlIEFDIGNsYXNzLCBub3QgZ2xvYmFsXG5jb25zdCBoYXNBQ0Fib3J0U2lnbmFsID0gdHlwZW9mIEFDLkFib3J0U2lnbmFsID09PSAnZnVuY3Rpb24nXG5jb25zdCBBUyA9IGhhc0Fib3J0U2lnbmFsXG4gID8gQWJvcnRTaWduYWxcbiAgOiBoYXNBQ0Fib3J0U2lnbmFsXG4gID8gQUMuQWJvcnRDb250cm9sbGVyXG4gIDogY2xhc3MgQWJvcnRTaWduYWwge1xuICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucmVhc29uID0gdW5kZWZpbmVkXG4gICAgICAgIHRoaXMuYWJvcnRlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdXG4gICAgICB9XG4gICAgICBkaXNwYXRjaEV2ZW50KGUpIHtcbiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWVcbiAgICAgICAgICB0aGlzLm9uYWJvcnQoZSlcbiAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaChmID0+IGYoZSksIHRoaXMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uYWJvcnQoKSB7fVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihldiwgZm4pIHtcbiAgICAgICAgaWYgKGV2ID09PSAnYWJvcnQnKSB7XG4gICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2goZm4pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoZXYsIGZuKSB7XG4gICAgICAgIGlmIChldiA9PT0gJ2Fib3J0Jykge1xuICAgICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycy5maWx0ZXIoZiA9PiBmICE9PSBmbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuY29uc3Qgd2FybmVkID0gbmV3IFNldCgpXG5jb25zdCBkZXByZWNhdGVkT3B0aW9uID0gKG9wdCwgaW5zdGVhZCkgPT4ge1xuICBjb25zdCBjb2RlID0gYExSVV9DQUNIRV9PUFRJT05fJHtvcHR9YFxuICBpZiAoc2hvdWxkV2Fybihjb2RlKSkge1xuICAgIHdhcm4oY29kZSwgYCR7b3B0fSBvcHRpb25gLCBgb3B0aW9ucy4ke2luc3RlYWR9YCwgTFJVQ2FjaGUpXG4gIH1cbn1cbmNvbnN0IGRlcHJlY2F0ZWRNZXRob2QgPSAobWV0aG9kLCBpbnN0ZWFkKSA9PiB7XG4gIGNvbnN0IGNvZGUgPSBgTFJVX0NBQ0hFX01FVEhPRF8ke21ldGhvZH1gXG4gIGlmIChzaG91bGRXYXJuKGNvZGUpKSB7XG4gICAgY29uc3QgeyBwcm90b3R5cGUgfSA9IExSVUNhY2hlXG4gICAgY29uc3QgeyBnZXQgfSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBtZXRob2QpXG4gICAgd2Fybihjb2RlLCBgJHttZXRob2R9IG1ldGhvZGAsIGBjYWNoZS4ke2luc3RlYWR9KClgLCBnZXQpXG4gIH1cbn1cbmNvbnN0IGRlcHJlY2F0ZWRQcm9wZXJ0eSA9IChmaWVsZCwgaW5zdGVhZCkgPT4ge1xuICBjb25zdCBjb2RlID0gYExSVV9DQUNIRV9QUk9QRVJUWV8ke2ZpZWxkfWBcbiAgaWYgKHNob3VsZFdhcm4oY29kZSkpIHtcbiAgICBjb25zdCB7IHByb3RvdHlwZSB9ID0gTFJVQ2FjaGVcbiAgICBjb25zdCB7IGdldCB9ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIGZpZWxkKVxuICAgIHdhcm4oY29kZSwgYCR7ZmllbGR9IHByb3BlcnR5YCwgYGNhY2hlLiR7aW5zdGVhZH1gLCBnZXQpXG4gIH1cbn1cblxuY29uc3QgZW1pdFdhcm5pbmcgPSAoLi4uYSkgPT4ge1xuICB0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgcHJvY2VzcyAmJlxuICB0eXBlb2YgcHJvY2Vzcy5lbWl0V2FybmluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gcHJvY2Vzcy5lbWl0V2FybmluZyguLi5hKVxuICAgIDogY29uc29sZS5lcnJvciguLi5hKVxufVxuXG5jb25zdCBzaG91bGRXYXJuID0gY29kZSA9PiAhd2FybmVkLmhhcyhjb2RlKVxuXG5jb25zdCB3YXJuID0gKGNvZGUsIHdoYXQsIGluc3RlYWQsIGZuKSA9PiB7XG4gIHdhcm5lZC5hZGQoY29kZSlcbiAgY29uc3QgbXNnID0gYFRoZSAke3doYXR9IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJHtpbnN0ZWFkfSBpbnN0ZWFkLmBcbiAgZW1pdFdhcm5pbmcobXNnLCAnRGVwcmVjYXRpb25XYXJuaW5nJywgY29kZSwgZm4pXG59XG5cbmNvbnN0IGlzUG9zSW50ID0gbiA9PiBuICYmIG4gPT09IE1hdGguZmxvb3IobikgJiYgbiA+IDAgJiYgaXNGaW5pdGUobilcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgLSBUaGlzIGlzIGEgbGl0dGxlIGJpdCByaWRpY3Vsb3VzLCB0YmguXG4gKiBUaGUgbWF4aW11bSBhcnJheSBsZW5ndGggaXMgMl4zMi0xIG9yIHRoZXJlYWJvdXRzIG9uIG1vc3QgSlMgaW1wbHMuXG4gKiBBbmQgd2VsbCBiZWZvcmUgdGhhdCBwb2ludCwgeW91J3JlIGNhY2hpbmcgdGhlIGVudGlyZSB3b3JsZCwgSSBtZWFuLFxuICogdGhhdCdzIH4zMkdCIG9mIGp1c3QgaW50ZWdlcnMgZm9yIHRoZSBuZXh0L3ByZXYgbGlua3MsIHBsdXMgd2hhdGV2ZXJcbiAqIGVsc2UgdG8gaG9sZCB0aGF0IG1hbnkga2V5cyBhbmQgdmFsdWVzLiAgSnVzdCBmaWxsaW5nIHRoZSBtZW1vcnkgd2l0aFxuICogemVyb2VzIGF0IGluaXQgdGltZSBpcyBicnV0YWwgd2hlbiB5b3UgZ2V0IHRoYXQgYmlnLlxuICogQnV0IHdoeSBub3QgYmUgY29tcGxldGU/XG4gKiBNYXliZSBpbiB0aGUgZnV0dXJlLCB0aGVzZSBsaW1pdHMgd2lsbCBoYXZlIGV4cGFuZGVkLiAqL1xuY29uc3QgZ2V0VWludEFycmF5ID0gbWF4ID0+XG4gICFpc1Bvc0ludChtYXgpXG4gICAgPyBudWxsXG4gICAgOiBtYXggPD0gTWF0aC5wb3coMiwgOClcbiAgICA/IFVpbnQ4QXJyYXlcbiAgICA6IG1heCA8PSBNYXRoLnBvdygyLCAxNilcbiAgICA/IFVpbnQxNkFycmF5XG4gICAgOiBtYXggPD0gTWF0aC5wb3coMiwgMzIpXG4gICAgPyBVaW50MzJBcnJheVxuICAgIDogbWF4IDw9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG4gICAgPyBaZXJvQXJyYXlcbiAgICA6IG51bGxcblxuY2xhc3MgWmVyb0FycmF5IGV4dGVuZHMgQXJyYXkge1xuICBjb25zdHJ1Y3RvcihzaXplKSB7XG4gICAgc3VwZXIoc2l6ZSlcbiAgICB0aGlzLmZpbGwoMClcbiAgfVxufVxuXG5jbGFzcyBTdGFjayB7XG4gIGNvbnN0cnVjdG9yKG1heCkge1xuICAgIGlmIChtYXggPT09IDApIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgICBjb25zdCBVaW50QXJyYXkgPSBnZXRVaW50QXJyYXkobWF4KVxuICAgIHRoaXMuaGVhcCA9IG5ldyBVaW50QXJyYXkobWF4KVxuICAgIHRoaXMubGVuZ3RoID0gMFxuICB9XG4gIHB1c2gobikge1xuICAgIHRoaXMuaGVhcFt0aGlzLmxlbmd0aCsrXSA9IG5cbiAgfVxuICBwb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVhcFstLXRoaXMubGVuZ3RoXVxuICB9XG59XG5cbmNsYXNzIExSVUNhY2hlIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgbWF4ID0gMCxcbiAgICAgIHR0bCxcbiAgICAgIHR0bFJlc29sdXRpb24gPSAxLFxuICAgICAgdHRsQXV0b3B1cmdlLFxuICAgICAgdXBkYXRlQWdlT25HZXQsXG4gICAgICB1cGRhdGVBZ2VPbkhhcyxcbiAgICAgIGFsbG93U3RhbGUsXG4gICAgICBkaXNwb3NlLFxuICAgICAgZGlzcG9zZUFmdGVyLFxuICAgICAgbm9EaXNwb3NlT25TZXQsXG4gICAgICBub1VwZGF0ZVRUTCxcbiAgICAgIG1heFNpemUgPSAwLFxuICAgICAgbWF4RW50cnlTaXplID0gMCxcbiAgICAgIHNpemVDYWxjdWxhdGlvbixcbiAgICAgIGZldGNoTWV0aG9kLFxuICAgICAgZmV0Y2hDb250ZXh0LFxuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgbm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0LFxuICAgICAgaWdub3JlRmV0Y2hBYm9ydCxcbiAgICB9ID0gb3B0aW9uc1xuXG4gICAgLy8gZGVwcmVjYXRlZCBvcHRpb25zLCBkb24ndCB0cmlnZ2VyIGEgd2FybmluZyBmb3IgZ2V0dGluZyB0aGVtIGlmXG4gICAgLy8gdGhlIHRoaW5nIGJlaW5nIHBhc3NlZCBpbiBpcyBhbm90aGVyIExSVUNhY2hlIHdlJ3JlIGNvcHlpbmcuXG4gICAgY29uc3QgeyBsZW5ndGgsIG1heEFnZSwgc3RhbGUgfSA9XG4gICAgICBvcHRpb25zIGluc3RhbmNlb2YgTFJVQ2FjaGUgPyB7fSA6IG9wdGlvbnNcblxuICAgIGlmIChtYXggIT09IDAgJiYgIWlzUG9zSW50KG1heCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heCBvcHRpb24gbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXInKVxuICAgIH1cblxuICAgIGNvbnN0IFVpbnRBcnJheSA9IG1heCA/IGdldFVpbnRBcnJheShtYXgpIDogQXJyYXlcbiAgICBpZiAoIVVpbnRBcnJheSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1heCB2YWx1ZTogJyArIG1heClcbiAgICB9XG5cbiAgICB0aGlzLm1heCA9IG1heFxuICAgIHRoaXMubWF4U2l6ZSA9IG1heFNpemVcbiAgICB0aGlzLm1heEVudHJ5U2l6ZSA9IG1heEVudHJ5U2l6ZSB8fCB0aGlzLm1heFNpemVcbiAgICB0aGlzLnNpemVDYWxjdWxhdGlvbiA9IHNpemVDYWxjdWxhdGlvbiB8fCBsZW5ndGhcbiAgICBpZiAodGhpcy5zaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgIGlmICghdGhpcy5tYXhTaXplICYmICF0aGlzLm1heEVudHJ5U2l6ZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdjYW5ub3Qgc2V0IHNpemVDYWxjdWxhdGlvbiB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUnXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5zaXplQ2FsY3VsYXRpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZUNhbGN1bGF0aW9uIHNldCB0byBub24tZnVuY3Rpb24nKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZmV0Y2hNZXRob2QgPSBmZXRjaE1ldGhvZCB8fCBudWxsXG4gICAgaWYgKHRoaXMuZmV0Y2hNZXRob2QgJiYgdHlwZW9mIHRoaXMuZmV0Y2hNZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdmZXRjaE1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24gaWYgc3BlY2lmaWVkJ1xuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuZmV0Y2hDb250ZXh0ID0gZmV0Y2hDb250ZXh0XG4gICAgaWYgKCF0aGlzLmZldGNoTWV0aG9kICYmIGZldGNoQ29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnY2Fubm90IHNldCBmZXRjaENvbnRleHQgd2l0aG91dCBmZXRjaE1ldGhvZCdcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLmtleU1hcCA9IG5ldyBNYXAoKVxuICAgIHRoaXMua2V5TGlzdCA9IG5ldyBBcnJheShtYXgpLmZpbGwobnVsbClcbiAgICB0aGlzLnZhbExpc3QgPSBuZXcgQXJyYXkobWF4KS5maWxsKG51bGwpXG4gICAgdGhpcy5uZXh0ID0gbmV3IFVpbnRBcnJheShtYXgpXG4gICAgdGhpcy5wcmV2ID0gbmV3IFVpbnRBcnJheShtYXgpXG4gICAgdGhpcy5oZWFkID0gMFxuICAgIHRoaXMudGFpbCA9IDBcbiAgICB0aGlzLmZyZWUgPSBuZXcgU3RhY2sobWF4KVxuICAgIHRoaXMuaW5pdGlhbEZpbGwgPSAxXG4gICAgdGhpcy5zaXplID0gMFxuXG4gICAgaWYgKHR5cGVvZiBkaXNwb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmRpc3Bvc2UgPSBkaXNwb3NlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZUFmdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmRpc3Bvc2VBZnRlciA9IGRpc3Bvc2VBZnRlclxuICAgICAgdGhpcy5kaXNwb3NlZCA9IFtdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzcG9zZUFmdGVyID0gbnVsbFxuICAgICAgdGhpcy5kaXNwb3NlZCA9IG51bGxcbiAgICB9XG4gICAgdGhpcy5ub0Rpc3Bvc2VPblNldCA9ICEhbm9EaXNwb3NlT25TZXRcbiAgICB0aGlzLm5vVXBkYXRlVFRMID0gISFub1VwZGF0ZVRUTFxuICAgIHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gISFub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb25cbiAgICB0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uID0gISFhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvblxuICAgIHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCA9ICEhYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydFxuICAgIHRoaXMuaWdub3JlRmV0Y2hBYm9ydCA9ICEhaWdub3JlRmV0Y2hBYm9ydFxuXG4gICAgLy8gTkI6IG1heEVudHJ5U2l6ZSBpcyBzZXQgdG8gbWF4U2l6ZSBpZiBpdCdzIHNldFxuICAgIGlmICh0aGlzLm1heEVudHJ5U2l6ZSAhPT0gMCkge1xuICAgICAgaWYgKHRoaXMubWF4U2l6ZSAhPT0gMCkge1xuICAgICAgICBpZiAoIWlzUG9zSW50KHRoaXMubWF4U2l6ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ21heFNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkJ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLm1heEVudHJ5U2l6ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAnbWF4RW50cnlTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCdcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgdGhpcy5pbml0aWFsaXplU2l6ZVRyYWNraW5nKClcbiAgICB9XG5cbiAgICB0aGlzLmFsbG93U3RhbGUgPSAhIWFsbG93U3RhbGUgfHwgISFzdGFsZVxuICAgIHRoaXMubm9EZWxldGVPblN0YWxlR2V0ID0gISFub0RlbGV0ZU9uU3RhbGVHZXRcbiAgICB0aGlzLnVwZGF0ZUFnZU9uR2V0ID0gISF1cGRhdGVBZ2VPbkdldFxuICAgIHRoaXMudXBkYXRlQWdlT25IYXMgPSAhIXVwZGF0ZUFnZU9uSGFzXG4gICAgdGhpcy50dGxSZXNvbHV0aW9uID1cbiAgICAgIGlzUG9zSW50KHR0bFJlc29sdXRpb24pIHx8IHR0bFJlc29sdXRpb24gPT09IDBcbiAgICAgICAgPyB0dGxSZXNvbHV0aW9uXG4gICAgICAgIDogMVxuICAgIHRoaXMudHRsQXV0b3B1cmdlID0gISF0dGxBdXRvcHVyZ2VcbiAgICB0aGlzLnR0bCA9IHR0bCB8fCBtYXhBZ2UgfHwgMFxuICAgIGlmICh0aGlzLnR0bCkge1xuICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLnR0bCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAndHRsIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHNwZWNpZmllZCdcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgdGhpcy5pbml0aWFsaXplVFRMVHJhY2tpbmcoKVxuICAgIH1cblxuICAgIC8vIGRvIG5vdCBhbGxvdyBjb21wbGV0ZWx5IHVuYm91bmRlZCBjYWNoZXNcbiAgICBpZiAodGhpcy5tYXggPT09IDAgJiYgdGhpcy50dGwgPT09IDAgJiYgdGhpcy5tYXhTaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQXQgbGVhc3Qgb25lIG9mIG1heCwgbWF4U2l6ZSwgb3IgdHRsIGlzIHJlcXVpcmVkJ1xuICAgICAgKVxuICAgIH1cbiAgICBpZiAoIXRoaXMudHRsQXV0b3B1cmdlICYmICF0aGlzLm1heCAmJiAhdGhpcy5tYXhTaXplKSB7XG4gICAgICBjb25zdCBjb2RlID0gJ0xSVV9DQUNIRV9VTkJPVU5ERUQnXG4gICAgICBpZiAoc2hvdWxkV2Fybihjb2RlKSkge1xuICAgICAgICB3YXJuZWQuYWRkKGNvZGUpXG4gICAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICAgJ1RUTCBjYWNoaW5nIHdpdGhvdXQgdHRsQXV0b3B1cmdlLCBtYXgsIG9yIG1heFNpemUgY2FuICcgK1xuICAgICAgICAgICdyZXN1bHQgaW4gdW5ib3VuZGVkIG1lbW9yeSBjb25zdW1wdGlvbi4nXG4gICAgICAgIGVtaXRXYXJuaW5nKG1zZywgJ1VuYm91bmRlZENhY2hlV2FybmluZycsIGNvZGUsIExSVUNhY2hlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGFsZSkge1xuICAgICAgZGVwcmVjYXRlZE9wdGlvbignc3RhbGUnLCAnYWxsb3dTdGFsZScpXG4gICAgfVxuICAgIGlmIChtYXhBZ2UpIHtcbiAgICAgIGRlcHJlY2F0ZWRPcHRpb24oJ21heEFnZScsICd0dGwnKVxuICAgIH1cbiAgICBpZiAobGVuZ3RoKSB7XG4gICAgICBkZXByZWNhdGVkT3B0aW9uKCdsZW5ndGgnLCAnc2l6ZUNhbGN1bGF0aW9uJylcbiAgICB9XG4gIH1cblxuICBnZXRSZW1haW5pbmdUVEwoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzKGtleSwgeyB1cGRhdGVBZ2VPbkhhczogZmFsc2UgfSkgPyBJbmZpbml0eSA6IDBcbiAgfVxuXG4gIGluaXRpYWxpemVUVExUcmFja2luZygpIHtcbiAgICB0aGlzLnR0bHMgPSBuZXcgWmVyb0FycmF5KHRoaXMubWF4KVxuICAgIHRoaXMuc3RhcnRzID0gbmV3IFplcm9BcnJheSh0aGlzLm1heClcblxuICAgIHRoaXMuc2V0SXRlbVRUTCA9IChpbmRleCwgdHRsLCBzdGFydCA9IHBlcmYubm93KCkpID0+IHtcbiAgICAgIHRoaXMuc3RhcnRzW2luZGV4XSA9IHR0bCAhPT0gMCA/IHN0YXJ0IDogMFxuICAgICAgdGhpcy50dGxzW2luZGV4XSA9IHR0bFxuICAgICAgaWYgKHR0bCAhPT0gMCAmJiB0aGlzLnR0bEF1dG9wdXJnZSkge1xuICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNTdGFsZShpbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlKHRoaXMua2V5TGlzdFtpbmRleF0pXG4gICAgICAgICAgfVxuICAgICAgICB9LCB0dGwgKyAxKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAtIHVucmVmKCkgbm90IHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zICovXG4gICAgICAgIGlmICh0LnVucmVmKSB7XG4gICAgICAgICAgdC51bnJlZigpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUl0ZW1BZ2UgPSBpbmRleCA9PiB7XG4gICAgICB0aGlzLnN0YXJ0c1tpbmRleF0gPSB0aGlzLnR0bHNbaW5kZXhdICE9PSAwID8gcGVyZi5ub3coKSA6IDBcbiAgICB9XG5cbiAgICB0aGlzLnN0YXR1c1RUTCA9IChzdGF0dXMsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy50dGwgPSB0aGlzLnR0bHNbaW5kZXhdXG4gICAgICAgIHN0YXR1cy5zdGFydCA9IHRoaXMuc3RhcnRzW2luZGV4XVxuICAgICAgICBzdGF0dXMubm93ID0gY2FjaGVkTm93IHx8IGdldE5vdygpXG4gICAgICAgIHN0YXR1cy5yZW1haW5pbmdUVEwgPSBzdGF0dXMubm93ICsgc3RhdHVzLnR0bCAtIHN0YXR1cy5zdGFydFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRlYm91bmNlIGNhbGxzIHRvIHBlcmYubm93KCkgdG8gMXMgc28gd2UncmUgbm90IGhpdHRpbmdcbiAgICAvLyB0aGF0IGNvc3RseSBjYWxsIHJlcGVhdGVkbHkuXG4gICAgbGV0IGNhY2hlZE5vdyA9IDBcbiAgICBjb25zdCBnZXROb3cgPSAoKSA9PiB7XG4gICAgICBjb25zdCBuID0gcGVyZi5ub3coKVxuICAgICAgaWYgKHRoaXMudHRsUmVzb2x1dGlvbiA+IDApIHtcbiAgICAgICAgY2FjaGVkTm93ID0gblxuICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dChcbiAgICAgICAgICAoKSA9PiAoY2FjaGVkTm93ID0gMCksXG4gICAgICAgICAgdGhpcy50dGxSZXNvbHV0aW9uXG4gICAgICAgIClcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgLSBub3QgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXMgKi9cbiAgICAgICAgaWYgKHQudW5yZWYpIHtcbiAgICAgICAgICB0LnVucmVmKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5cbiAgICB9XG5cbiAgICB0aGlzLmdldFJlbWFpbmluZ1RUTCA9IGtleSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMua2V5TWFwLmdldChrZXkpXG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudHRsc1tpbmRleF0gPT09IDAgfHwgdGhpcy5zdGFydHNbaW5kZXhdID09PSAwXG4gICAgICAgID8gSW5maW5pdHlcbiAgICAgICAgOiB0aGlzLnN0YXJ0c1tpbmRleF0gK1xuICAgICAgICAgICAgdGhpcy50dGxzW2luZGV4XSAtXG4gICAgICAgICAgICAoY2FjaGVkTm93IHx8IGdldE5vdygpKVxuICAgIH1cblxuICAgIHRoaXMuaXNTdGFsZSA9IGluZGV4ID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMudHRsc1tpbmRleF0gIT09IDAgJiZcbiAgICAgICAgdGhpcy5zdGFydHNbaW5kZXhdICE9PSAwICYmXG4gICAgICAgIChjYWNoZWROb3cgfHwgZ2V0Tm93KCkpIC0gdGhpcy5zdGFydHNbaW5kZXhdID5cbiAgICAgICAgICB0aGlzLnR0bHNbaW5kZXhdXG4gICAgICApXG4gICAgfVxuICB9XG4gIHVwZGF0ZUl0ZW1BZ2UoX2luZGV4KSB7fVxuICBzdGF0dXNUVEwoX3N0YXR1cywgX2luZGV4KSB7fVxuICBzZXRJdGVtVFRMKF9pbmRleCwgX3R0bCwgX3N0YXJ0KSB7fVxuICBpc1N0YWxlKF9pbmRleCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaW5pdGlhbGl6ZVNpemVUcmFja2luZygpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZWRTaXplID0gMFxuICAgIHRoaXMuc2l6ZXMgPSBuZXcgWmVyb0FycmF5KHRoaXMubWF4KVxuICAgIHRoaXMucmVtb3ZlSXRlbVNpemUgPSBpbmRleCA9PiB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZWRTaXplIC09IHRoaXMuc2l6ZXNbaW5kZXhdXG4gICAgICB0aGlzLnNpemVzW2luZGV4XSA9IDBcbiAgICB9XG4gICAgdGhpcy5yZXF1aXJlU2l6ZSA9IChrLCB2LCBzaXplLCBzaXplQ2FsY3VsYXRpb24pID0+IHtcbiAgICAgIC8vIHByb3Zpc2lvbmFsbHkgYWNjZXB0IGJhY2tncm91bmQgZmV0Y2hlcy5cbiAgICAgIC8vIGFjdHVhbCB2YWx1ZSBzaXplIHdpbGwgYmUgY2hlY2tlZCB3aGVuIHRoZXkgcmV0dXJuLlxuICAgICAgaWYgKHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cbiAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgaWYgKHNpemVDYWxjdWxhdGlvbikge1xuICAgICAgICAgIGlmICh0eXBlb2Ygc2l6ZUNhbGN1bGF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplQ2FsY3VsYXRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uJylcbiAgICAgICAgICB9XG4gICAgICAgICAgc2l6ZSA9IHNpemVDYWxjdWxhdGlvbih2LCBrKVxuICAgICAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICdzaXplQ2FsY3VsYXRpb24gcmV0dXJuIGludmFsaWQgKGV4cGVjdCBwb3NpdGl2ZSBpbnRlZ2VyKSdcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdpbnZhbGlkIHNpemUgdmFsdWUgKG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcikuICcgK1xuICAgICAgICAgICAgICAnV2hlbiBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZSBpcyB1c2VkLCBzaXplQ2FsY3VsYXRpb24gb3Igc2l6ZSAnICtcbiAgICAgICAgICAgICAgJ211c3QgYmUgc2V0LidcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzaXplXG4gICAgfVxuICAgIHRoaXMuYWRkSXRlbVNpemUgPSAoaW5kZXgsIHNpemUsIHN0YXR1cykgPT4ge1xuICAgICAgdGhpcy5zaXplc1tpbmRleF0gPSBzaXplXG4gICAgICBpZiAodGhpcy5tYXhTaXplKSB7XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemVzW2luZGV4XVxuICAgICAgICB3aGlsZSAodGhpcy5jYWxjdWxhdGVkU2l6ZSA+IG1heFNpemUpIHtcbiAgICAgICAgICB0aGlzLmV2aWN0KHRydWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsY3VsYXRlZFNpemUgKz0gdGhpcy5zaXplc1tpbmRleF1cbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLmVudHJ5U2l6ZSA9IHNpemVcbiAgICAgICAgc3RhdHVzLnRvdGFsQ2FsY3VsYXRlZFNpemUgPSB0aGlzLmNhbGN1bGF0ZWRTaXplXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlbW92ZUl0ZW1TaXplKF9pbmRleCkge31cbiAgYWRkSXRlbVNpemUoX2luZGV4LCBfc2l6ZSkge31cbiAgcmVxdWlyZVNpemUoX2ssIF92LCBzaXplLCBzaXplQ2FsY3VsYXRpb24pIHtcbiAgICBpZiAoc2l6ZSB8fCBzaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdjYW5ub3Qgc2V0IHNpemUgd2l0aG91dCBzZXR0aW5nIG1heFNpemUgb3IgbWF4RW50cnlTaXplIG9uIGNhY2hlJ1xuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gICppbmRleGVzKHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5zaXplKSB7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy50YWlsOyB0cnVlOyApIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRJbmRleChpKSkge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFsbG93U3RhbGUgfHwgIXRoaXMuaXNTdGFsZShpKSkge1xuICAgICAgICAgIHlpZWxkIGlcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA9PT0gdGhpcy5oZWFkKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gdGhpcy5wcmV2W2ldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAqcmluZGV4ZXMoeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLnNpemUpIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLmhlYWQ7IHRydWU7ICkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZEluZGV4KGkpKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxsb3dTdGFsZSB8fCAhdGhpcy5pc1N0YWxlKGkpKSB7XG4gICAgICAgICAgeWllbGQgaVxuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSB0aGlzLnRhaWwpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkgPSB0aGlzLm5leHRbaV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlzVmFsaWRJbmRleChpbmRleCkge1xuICAgIHJldHVybiAoXG4gICAgICBpbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLmtleU1hcC5nZXQodGhpcy5rZXlMaXN0W2luZGV4XSkgPT09IGluZGV4XG4gICAgKVxuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRoaXMua2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCBbdGhpcy5rZXlMaXN0W2ldLCB0aGlzLnZhbExpc3RbaV1dXG4gICAgICB9XG4gICAgfVxuICB9XG4gICpyZW50cmllcygpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5yaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRoaXMua2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCBbdGhpcy5rZXlMaXN0W2ldLCB0aGlzLnZhbExpc3RbaV1dXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgKmtleXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMua2V5TGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCB0aGlzLmtleUxpc3RbaV1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgKnJrZXlzKCkge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnJpbmRleGVzKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5rZXlMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIXRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy52YWxMaXN0W2ldKVxuICAgICAgKSB7XG4gICAgICAgIHlpZWxkIHRoaXMua2V5TGlzdFtpXVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICp2YWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudmFsTGlzdFtpXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF0aGlzLmlzQmFja2dyb3VuZEZldGNoKHRoaXMudmFsTGlzdFtpXSlcbiAgICAgICkge1xuICAgICAgICB5aWVsZCB0aGlzLnZhbExpc3RbaV1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgKnJ2YWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMucmluZGV4ZXMoKSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnZhbExpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAhdGhpcy5pc0JhY2tncm91bmRGZXRjaCh0aGlzLnZhbExpc3RbaV0pXG4gICAgICApIHtcbiAgICAgICAgeWllbGQgdGhpcy52YWxMaXN0W2ldXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcygpXG4gIH1cblxuICBmaW5kKGZuLCBnZXRPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcygpKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2ldXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godilcbiAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgIDogdlxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICBpZiAoZm4odmFsdWUsIHRoaXMua2V5TGlzdFtpXSwgdGhpcykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KHRoaXMua2V5TGlzdFtpXSwgZ2V0T3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3JFYWNoKGZuLCB0aGlzcCA9IHRoaXMpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5pbmRleGVzKCkpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbExpc3RbaV1cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgOiB2XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGZuLmNhbGwodGhpc3AsIHZhbHVlLCB0aGlzLmtleUxpc3RbaV0sIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgcmZvckVhY2goZm4sIHRoaXNwID0gdGhpcykge1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnJpbmRleGVzKCkpIHtcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbExpc3RbaV1cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgOiB2XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIGZuLmNhbGwodGhpc3AsIHZhbHVlLCB0aGlzLmtleUxpc3RbaV0sIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgZ2V0IHBydW5lKCkge1xuICAgIGRlcHJlY2F0ZWRNZXRob2QoJ3BydW5lJywgJ3B1cmdlU3RhbGUnKVxuICAgIHJldHVybiB0aGlzLnB1cmdlU3RhbGVcbiAgfVxuXG4gIHB1cmdlU3RhbGUoKSB7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZVxuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnJpbmRleGVzKHsgYWxsb3dTdGFsZTogdHJ1ZSB9KSkge1xuICAgICAgaWYgKHRoaXMuaXNTdGFsZShpKSkge1xuICAgICAgICB0aGlzLmRlbGV0ZSh0aGlzLmtleUxpc3RbaV0pXG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkXG4gIH1cblxuICBkdW1wKCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMua2V5TGlzdFtpXVxuICAgICAgY29uc3QgdiA9IHRoaXMudmFsTGlzdFtpXVxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICA6IHZcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgICAgY29uc3QgZW50cnkgPSB7IHZhbHVlIH1cbiAgICAgIGlmICh0aGlzLnR0bHMpIHtcbiAgICAgICAgZW50cnkudHRsID0gdGhpcy50dGxzW2ldXG4gICAgICAgIC8vIGFsd2F5cyBkdW1wIHRoZSBzdGFydCByZWxhdGl2ZSB0byBhIHBvcnRhYmxlIHRpbWVzdGFtcFxuICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgY29uc3QgYWdlID0gcGVyZi5ub3coKSAtIHRoaXMuc3RhcnRzW2ldXG4gICAgICAgIGVudHJ5LnN0YXJ0ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC0gYWdlKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2l6ZXMpIHtcbiAgICAgICAgZW50cnkuc2l6ZSA9IHRoaXMuc2l6ZXNbaV1cbiAgICAgIH1cbiAgICAgIGFyci51bnNoaWZ0KFtrZXksIGVudHJ5XSlcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgbG9hZChhcnIpIHtcbiAgICB0aGlzLmNsZWFyKClcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBhcnIpIHtcbiAgICAgIGlmIChlbnRyeS5zdGFydCkge1xuICAgICAgICAvLyBlbnRyeS5zdGFydCBpcyBhIHBvcnRhYmxlIHRpbWVzdGFtcCwgYnV0IHdlIG1heSBiZSB1c2luZ1xuICAgICAgICAvLyBub2RlJ3MgcGVyZm9ybWFuY2Uubm93KCksIHNvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0LlxuICAgICAgICAvLyBpdCdzIG9rIGZvciB0aGlzIHRvIGJlIGEgYml0IHNsb3csIGl0J3MgYSByYXJlIG9wZXJhdGlvbi5cbiAgICAgICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIGVudHJ5LnN0YXJ0XG4gICAgICAgIGVudHJ5LnN0YXJ0ID0gcGVyZi5ub3coKSAtIGFnZVxuICAgICAgfVxuICAgICAgdGhpcy5zZXQoa2V5LCBlbnRyeS52YWx1ZSwgZW50cnkpXG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZShfdiwgX2ssIF9yZWFzb24pIHt9XG5cbiAgc2V0KFxuICAgIGssXG4gICAgdixcbiAgICB7XG4gICAgICB0dGwgPSB0aGlzLnR0bCxcbiAgICAgIHN0YXJ0LFxuICAgICAgbm9EaXNwb3NlT25TZXQgPSB0aGlzLm5vRGlzcG9zZU9uU2V0LFxuICAgICAgc2l6ZSA9IDAsXG4gICAgICBzaXplQ2FsY3VsYXRpb24gPSB0aGlzLnNpemVDYWxjdWxhdGlvbixcbiAgICAgIG5vVXBkYXRlVFRMID0gdGhpcy5ub1VwZGF0ZVRUTCxcbiAgICAgIHN0YXR1cyxcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgc2l6ZSA9IHRoaXMucmVxdWlyZVNpemUoaywgdiwgc2l6ZSwgc2l6ZUNhbGN1bGF0aW9uKVxuICAgIC8vIGlmIHRoZSBpdGVtIGRvZXNuJ3QgZml0LCBkb24ndCBkbyBhbnl0aGluZ1xuICAgIC8vIE5COiBtYXhFbnRyeVNpemUgc2V0IHRvIG1heFNpemUgYnkgZGVmYXVsdFxuICAgIGlmICh0aGlzLm1heEVudHJ5U2l6ZSAmJiBzaXplID4gdGhpcy5tYXhFbnRyeVNpemUpIHtcbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLnNldCA9ICdtaXNzJ1xuICAgICAgICBzdGF0dXMubWF4RW50cnlTaXplRXhjZWVkZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICAvLyBoYXZlIHRvIGRlbGV0ZSwgaW4gY2FzZSBhIGJhY2tncm91bmQgZmV0Y2ggaXMgdGhlcmUgYWxyZWFkeS5cbiAgICAgIC8vIGluIG5vbi1hc3luYyBjYXNlcywgdGhpcyBpcyBhIG5vLW9wXG4gICAgICB0aGlzLmRlbGV0ZShrKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gICAgbGV0IGluZGV4ID0gdGhpcy5zaXplID09PSAwID8gdW5kZWZpbmVkIDogdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGFkZGl0aW9uXG4gICAgICBpbmRleCA9IHRoaXMubmV3SW5kZXgoKVxuICAgICAgdGhpcy5rZXlMaXN0W2luZGV4XSA9IGtcbiAgICAgIHRoaXMudmFsTGlzdFtpbmRleF0gPSB2XG4gICAgICB0aGlzLmtleU1hcC5zZXQoaywgaW5kZXgpXG4gICAgICB0aGlzLm5leHRbdGhpcy50YWlsXSA9IGluZGV4XG4gICAgICB0aGlzLnByZXZbaW5kZXhdID0gdGhpcy50YWlsXG4gICAgICB0aGlzLnRhaWwgPSBpbmRleFxuICAgICAgdGhpcy5zaXplKytcbiAgICAgIHRoaXMuYWRkSXRlbVNpemUoaW5kZXgsIHNpemUsIHN0YXR1cylcbiAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgc3RhdHVzLnNldCA9ICdhZGQnXG4gICAgICB9XG4gICAgICBub1VwZGF0ZVRUTCA9IGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVwZGF0ZVxuICAgICAgdGhpcy5tb3ZlVG9UYWlsKGluZGV4KVxuICAgICAgY29uc3Qgb2xkVmFsID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgaWYgKHYgIT09IG9sZFZhbCkge1xuICAgICAgICBpZiAodGhpcy5pc0JhY2tncm91bmRGZXRjaChvbGRWYWwpKSB7XG4gICAgICAgICAgb2xkVmFsLl9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcigncmVwbGFjZWQnKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW5vRGlzcG9zZU9uU2V0KSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2Uob2xkVmFsLCBrLCAnc2V0JylcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2VkLnB1c2goW29sZFZhbCwgaywgJ3NldCddKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUl0ZW1TaXplKGluZGV4KVxuICAgICAgICB0aGlzLnZhbExpc3RbaW5kZXhdID0gdlxuICAgICAgICB0aGlzLmFkZEl0ZW1TaXplKGluZGV4LCBzaXplLCBzdGF0dXMpXG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICBzdGF0dXMuc2V0ID0gJ3JlcGxhY2UnXG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPVxuICAgICAgICAgICAgb2xkVmFsICYmIHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2gob2xkVmFsKVxuICAgICAgICAgICAgICA/IG9sZFZhbC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICA6IG9sZFZhbFxuICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkKSBzdGF0dXMub2xkVmFsdWUgPSBvbGRWYWx1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMuc2V0ID0gJ3VwZGF0ZSdcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR0bCAhPT0gMCAmJiB0aGlzLnR0bCA9PT0gMCAmJiAhdGhpcy50dGxzKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVUVExUcmFja2luZygpXG4gICAgfVxuICAgIGlmICghbm9VcGRhdGVUVEwpIHtcbiAgICAgIHRoaXMuc2V0SXRlbVRUTChpbmRleCwgdHRsLCBzdGFydClcbiAgICB9XG4gICAgdGhpcy5zdGF0dXNUVEwoc3RhdHVzLCBpbmRleClcbiAgICBpZiAodGhpcy5kaXNwb3NlQWZ0ZXIpIHtcbiAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2VkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VBZnRlciguLi50aGlzLmRpc3Bvc2VkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBuZXdJbmRleCgpIHtcbiAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWlsXG4gICAgfVxuICAgIGlmICh0aGlzLnNpemUgPT09IHRoaXMubWF4ICYmIHRoaXMubWF4ICE9PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5ldmljdChmYWxzZSlcbiAgICB9XG4gICAgaWYgKHRoaXMuZnJlZS5sZW5ndGggIT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmZyZWUucG9wKClcbiAgICB9XG4gICAgLy8gaW5pdGlhbCBmaWxsLCBqdXN0IGtlZXAgd3JpdGluZyBkb3duIHRoZSBsaXN0XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbEZpbGwrK1xuICB9XG5cbiAgcG9wKCkge1xuICAgIGlmICh0aGlzLnNpemUpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMudmFsTGlzdFt0aGlzLmhlYWRdXG4gICAgICB0aGlzLmV2aWN0KHRydWUpXG4gICAgICByZXR1cm4gdmFsXG4gICAgfVxuICB9XG5cbiAgZXZpY3QoZnJlZSkge1xuICAgIGNvbnN0IGhlYWQgPSB0aGlzLmhlYWRcbiAgICBjb25zdCBrID0gdGhpcy5rZXlMaXN0W2hlYWRdXG4gICAgY29uc3QgdiA9IHRoaXMudmFsTGlzdFtoZWFkXVxuICAgIGlmICh0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZXZpY3RlZCcpKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3Bvc2UodiwgaywgJ2V2aWN0JylcbiAgICAgIGlmICh0aGlzLmRpc3Bvc2VBZnRlcikge1xuICAgICAgICB0aGlzLmRpc3Bvc2VkLnB1c2goW3YsIGssICdldmljdCddKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlbW92ZUl0ZW1TaXplKGhlYWQpXG4gICAgLy8gaWYgd2UgYXJlbid0IGFib3V0IHRvIHVzZSB0aGUgaW5kZXgsIHRoZW4gbnVsbCB0aGVzZSBvdXRcbiAgICBpZiAoZnJlZSkge1xuICAgICAgdGhpcy5rZXlMaXN0W2hlYWRdID0gbnVsbFxuICAgICAgdGhpcy52YWxMaXN0W2hlYWRdID0gbnVsbFxuICAgICAgdGhpcy5mcmVlLnB1c2goaGVhZClcbiAgICB9XG4gICAgdGhpcy5oZWFkID0gdGhpcy5uZXh0W2hlYWRdXG4gICAgdGhpcy5rZXlNYXAuZGVsZXRlKGspXG4gICAgdGhpcy5zaXplLS1cbiAgICByZXR1cm4gaGVhZFxuICB9XG5cbiAgaGFzKGssIHsgdXBkYXRlQWdlT25IYXMgPSB0aGlzLnVwZGF0ZUFnZU9uSGFzLCBzdGF0dXMgfSA9IHt9KSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmtleU1hcC5nZXQoaylcbiAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCF0aGlzLmlzU3RhbGUoaW5kZXgpKSB7XG4gICAgICAgIGlmICh1cGRhdGVBZ2VPbkhhcykge1xuICAgICAgICAgIHRoaXMudXBkYXRlSXRlbUFnZShpbmRleClcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuaGFzID0gJ2hpdCdcbiAgICAgICAgdGhpcy5zdGF0dXNUVEwoc3RhdHVzLCBpbmRleClcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgIHN0YXR1cy5oYXMgPSAnc3RhbGUnXG4gICAgICAgIHRoaXMuc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgIHN0YXR1cy5oYXMgPSAnbWlzcydcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBsaWtlIGdldCgpLCBidXQgd2l0aG91dCBhbnkgTFJVIHVwZGF0aW5nIG9yIFRUTCBleHBpcmF0aW9uXG4gIHBlZWsoaywgeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlIH0gPSB7fSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgKGFsbG93U3RhbGUgfHwgIXRoaXMuaXNTdGFsZShpbmRleCkpKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgLy8gZWl0aGVyIHN0YWxlIGFuZCBhbGxvd2VkLCBvciBmb3JjaW5nIGEgcmVmcmVzaCBvZiBub24tc3RhbGUgdmFsdWVcbiAgICAgIHJldHVybiB0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHZcbiAgICB9XG4gIH1cblxuICBiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpIHtcbiAgICBjb25zdCB2ID0gaW5kZXggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMudmFsTGlzdFtpbmRleF1cbiAgICBpZiAodGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgcmV0dXJuIHZcbiAgICB9XG4gICAgY29uc3QgYWMgPSBuZXcgQUMoKVxuICAgIGlmIChvcHRpb25zLnNpZ25hbCkge1xuICAgICAgb3B0aW9ucy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PlxuICAgICAgICBhYy5hYm9ydChvcHRpb25zLnNpZ25hbC5yZWFzb24pXG4gICAgICApXG4gICAgfVxuICAgIGNvbnN0IGZldGNoT3B0cyA9IHtcbiAgICAgIHNpZ25hbDogYWMuc2lnbmFsLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGNvbnRleHQsXG4gICAgfVxuICAgIGNvbnN0IGNiID0gKHYsIHVwZGF0ZUNhY2hlID0gZmFsc2UpID0+IHtcbiAgICAgIGNvbnN0IHsgYWJvcnRlZCB9ID0gYWMuc2lnbmFsXG4gICAgICBjb25zdCBpZ25vcmVBYm9ydCA9IG9wdGlvbnMuaWdub3JlRmV0Y2hBYm9ydCAmJiB2ICE9PSB1bmRlZmluZWRcbiAgICAgIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgICAgICBpZiAoYWJvcnRlZCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEFib3J0ZWQgPSB0cnVlXG4gICAgICAgICAgb3B0aW9ucy5zdGF0dXMuZmV0Y2hFcnJvciA9IGFjLnNpZ25hbC5yZWFzb25cbiAgICAgICAgICBpZiAoaWdub3JlQWJvcnQpIG9wdGlvbnMuc3RhdHVzLmZldGNoQWJvcnRJZ25vcmVkID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoUmVzb2x2ZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhYm9ydGVkICYmICFpZ25vcmVBYm9ydCAmJiAhdXBkYXRlQ2FjaGUpIHtcbiAgICAgICAgcmV0dXJuIGZldGNoRmFpbChhYy5zaWduYWwucmVhc29uKVxuICAgICAgfVxuICAgICAgLy8gZWl0aGVyIHdlIGRpZG4ndCBhYm9ydCwgYW5kIGFyZSBzdGlsbCBoZXJlLCBvciB3ZSBkaWQsIGFuZCBpZ25vcmVkXG4gICAgICBpZiAodGhpcy52YWxMaXN0W2luZGV4XSA9PT0gcCkge1xuICAgICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHAuX19zdGFsZVdoaWxlRmV0Y2hpbmcpIHtcbiAgICAgICAgICAgIHRoaXMudmFsTGlzdFtpbmRleF0gPSBwLl9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlKGspXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChvcHRpb25zLnN0YXR1cykgb3B0aW9ucy5zdGF0dXMuZmV0Y2hVcGRhdGVkID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuc2V0KGssIHYsIGZldGNoT3B0cy5vcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdlxuICAgIH1cbiAgICBjb25zdCBlYiA9IGVyID0+IHtcbiAgICAgIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaFJlamVjdGVkID0gdHJ1ZVxuICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEVycm9yID0gZXJcbiAgICAgIH1cbiAgICAgIHJldHVybiBmZXRjaEZhaWwoZXIpXG4gICAgfVxuICAgIGNvbnN0IGZldGNoRmFpbCA9IGVyID0+IHtcbiAgICAgIGNvbnN0IHsgYWJvcnRlZCB9ID0gYWMuc2lnbmFsXG4gICAgICBjb25zdCBhbGxvd1N0YWxlQWJvcnRlZCA9XG4gICAgICAgIGFib3J0ZWQgJiYgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0XG4gICAgICBjb25zdCBhbGxvd1N0YWxlID1cbiAgICAgICAgYWxsb3dTdGFsZUFib3J0ZWQgfHwgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvblxuICAgICAgY29uc3Qgbm9EZWxldGUgPSBhbGxvd1N0YWxlIHx8IG9wdGlvbnMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uXG4gICAgICBpZiAodGhpcy52YWxMaXN0W2luZGV4XSA9PT0gcCkge1xuICAgICAgICAvLyBpZiB3ZSBhbGxvdyBzdGFsZSBvbiBmZXRjaCByZWplY3Rpb25zLCB0aGVuIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXRcbiAgICAgICAgLy8gdGhlIHN0YWxlIHZhbHVlIGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGNhY2hlIHdoZW4gdGhlIGZldGNoIGZhaWxzLlxuICAgICAgICBjb25zdCBkZWwgPSAhbm9EZWxldGUgfHwgcC5fX3N0YWxlV2hpbGVGZXRjaGluZyA9PT0gdW5kZWZpbmVkXG4gICAgICAgIGlmIChkZWwpIHtcbiAgICAgICAgICB0aGlzLmRlbGV0ZShrKVxuICAgICAgICB9IGVsc2UgaWYgKCFhbGxvd1N0YWxlQWJvcnRlZCkge1xuICAgICAgICAgIC8vIHN0aWxsIHJlcGxhY2UgdGhlICpwcm9taXNlKiB3aXRoIHRoZSBzdGFsZSB2YWx1ZSxcbiAgICAgICAgICAvLyBzaW5jZSB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBwcm9taXNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgLy8gbGVhdmUgaXQgdW50b3VjaGVkIGlmIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIGFuXG4gICAgICAgICAgLy8gYWJvcnRlZCBiYWNrZ3JvdW5kIGZldGNoIHRoYXQgaGFzbid0IHlldCByZXR1cm5lZC5cbiAgICAgICAgICB0aGlzLnZhbExpc3RbaW5kZXhdID0gcC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYWxsb3dTdGFsZSkge1xuICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMgJiYgcC5fX3N0YWxlV2hpbGVGZXRjaGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3B0aW9ucy5zdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcC5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgfSBlbHNlIGlmIChwLl9fcmV0dXJuZWQgPT09IHApIHtcbiAgICAgICAgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGNhbGwgPSAocmVzLCByZWopID0+IHtcbiAgICAgIHRoaXMuZmV0Y2hNZXRob2QoaywgdiwgZmV0Y2hPcHRzKS50aGVuKHYgPT4gcmVzKHYpLCByZWopXG4gICAgICAvLyBpZ25vcmVkLCB3ZSBnbyB1bnRpbCB3ZSBmaW5pc2gsIHJlZ2FyZGxlc3MuXG4gICAgICAvLyBkZWZlciBjaGVjayB1bnRpbCB3ZSBhcmUgYWN0dWFsbHkgYWJvcnRpbmcsXG4gICAgICAvLyBzbyBmZXRjaE1ldGhvZCBjYW4gb3ZlcnJpZGUuXG4gICAgICBhYy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhb3B0aW9ucy5pZ25vcmVGZXRjaEFib3J0IHx8XG4gICAgICAgICAgb3B0aW9ucy5hbGxvd1N0YWxlT25GZXRjaEFib3J0XG4gICAgICAgICkge1xuICAgICAgICAgIHJlcygpXG4gICAgICAgICAgLy8gd2hlbiBpdCBldmVudHVhbGx5IHJlc29sdmVzLCB1cGRhdGUgdGhlIGNhY2hlLlxuICAgICAgICAgIGlmIChvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnQpIHtcbiAgICAgICAgICAgIHJlcyA9IHYgPT4gY2IodiwgdHJ1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnN0YXR1cykgb3B0aW9ucy5zdGF0dXMuZmV0Y2hEaXNwYXRjaGVkID0gdHJ1ZVxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZShwY2FsbCkudGhlbihjYiwgZWIpXG4gICAgcC5fX2Fib3J0Q29udHJvbGxlciA9IGFjXG4gICAgcC5fX3N0YWxlV2hpbGVGZXRjaGluZyA9IHZcbiAgICBwLl9fcmV0dXJuZWQgPSBudWxsXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGludGVybmFsLCBkb24ndCBleHBvc2Ugc3RhdHVzLlxuICAgICAgdGhpcy5zZXQoaywgcCwgeyAuLi5mZXRjaE9wdHMub3B0aW9ucywgc3RhdHVzOiB1bmRlZmluZWQgfSlcbiAgICAgIGluZGV4ID0gdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsTGlzdFtpbmRleF0gPSBwXG4gICAgfVxuICAgIHJldHVybiBwXG4gIH1cblxuICBpc0JhY2tncm91bmRGZXRjaChwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHAgJiZcbiAgICAgIHR5cGVvZiBwID09PSAnb2JqZWN0JyAmJlxuICAgICAgdHlwZW9mIHAudGhlbiA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICBwLFxuICAgICAgICAnX19zdGFsZVdoaWxlRmV0Y2hpbmcnXG4gICAgICApICYmXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocCwgJ19fcmV0dXJuZWQnKSAmJlxuICAgICAgKHAuX19yZXR1cm5lZCA9PT0gcCB8fCBwLl9fcmV0dXJuZWQgPT09IG51bGwpXG4gICAgKVxuICB9XG5cbiAgLy8gdGhpcyB0YWtlcyB0aGUgdW5pb24gb2YgZ2V0KCkgYW5kIHNldCgpIG9wdHMsIGJlY2F1c2UgaXQgZG9lcyBib3RoXG4gIGFzeW5jIGZldGNoKFxuICAgIGssXG4gICAge1xuICAgICAgLy8gZ2V0IG9wdGlvbnNcbiAgICAgIGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUsXG4gICAgICB1cGRhdGVBZ2VPbkdldCA9IHRoaXMudXBkYXRlQWdlT25HZXQsXG4gICAgICBub0RlbGV0ZU9uU3RhbGVHZXQgPSB0aGlzLm5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgIC8vIHNldCBvcHRpb25zXG4gICAgICB0dGwgPSB0aGlzLnR0bCxcbiAgICAgIG5vRGlzcG9zZU9uU2V0ID0gdGhpcy5ub0Rpc3Bvc2VPblNldCxcbiAgICAgIHNpemUgPSAwLFxuICAgICAgc2l6ZUNhbGN1bGF0aW9uID0gdGhpcy5zaXplQ2FsY3VsYXRpb24sXG4gICAgICBub1VwZGF0ZVRUTCA9IHRoaXMubm9VcGRhdGVUVEwsXG4gICAgICAvLyBmZXRjaCBleGNsdXNpdmUgb3B0aW9uc1xuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uID0gdGhpcy5ub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBpZ25vcmVGZXRjaEFib3J0ID0gdGhpcy5pZ25vcmVGZXRjaEFib3J0LFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCxcbiAgICAgIGZldGNoQ29udGV4dCA9IHRoaXMuZmV0Y2hDb250ZXh0LFxuICAgICAgZm9yY2VSZWZyZXNoID0gZmFsc2UsXG4gICAgICBzdGF0dXMsXG4gICAgICBzaWduYWwsXG4gICAgfSA9IHt9XG4gICkge1xuICAgIGlmICghdGhpcy5mZXRjaE1ldGhvZCkge1xuICAgICAgaWYgKHN0YXR1cykgc3RhdHVzLmZldGNoID0gJ2dldCdcbiAgICAgIHJldHVybiB0aGlzLmdldChrLCB7XG4gICAgICAgIGFsbG93U3RhbGUsXG4gICAgICAgIHVwZGF0ZUFnZU9uR2V0LFxuICAgICAgICBub0RlbGV0ZU9uU3RhbGVHZXQsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGFsbG93U3RhbGUsXG4gICAgICB1cGRhdGVBZ2VPbkdldCxcbiAgICAgIG5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgIHR0bCxcbiAgICAgIG5vRGlzcG9zZU9uU2V0LFxuICAgICAgc2l6ZSxcbiAgICAgIHNpemVDYWxjdWxhdGlvbixcbiAgICAgIG5vVXBkYXRlVFRMLFxuICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0LFxuICAgICAgaWdub3JlRmV0Y2hBYm9ydCxcbiAgICAgIHN0YXR1cyxcbiAgICAgIHNpZ25hbCxcbiAgICB9XG5cbiAgICBsZXQgaW5kZXggPSB0aGlzLmtleU1hcC5nZXQoaylcbiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHN0YXR1cykgc3RhdHVzLmZldGNoID0gJ21pc3MnXG4gICAgICBjb25zdCBwID0gdGhpcy5iYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGZldGNoQ29udGV4dClcbiAgICAgIHJldHVybiAocC5fX3JldHVybmVkID0gcClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW4gY2FjaGUsIG1heWJlIGFscmVhZHkgZmV0Y2hpbmdcbiAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbExpc3RbaW5kZXhdXG4gICAgICBpZiAodGhpcy5pc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICBjb25zdCBzdGFsZSA9XG4gICAgICAgICAgYWxsb3dTdGFsZSAmJiB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWRcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdpbmZsaWdodCdcbiAgICAgICAgICBpZiAoc3RhbGUpIHN0YXR1cy5yZXR1cm5lZFN0YWxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGFsZSA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiAodi5fX3JldHVybmVkID0gdilcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgZm9yY2UgYSByZWZyZXNoLCB0aGF0IG1lYW5zIGRvIE5PVCBzZXJ2ZSB0aGUgY2FjaGVkIHZhbHVlLFxuICAgICAgLy8gdW5sZXNzIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIHJlZnJlc2hpbmcgdGhlIGNhY2hlLlxuICAgICAgY29uc3QgaXNTdGFsZSA9IHRoaXMuaXNTdGFsZShpbmRleClcbiAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmICFpc1N0YWxlKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHN0YXR1cy5mZXRjaCA9ICdoaXQnXG4gICAgICAgIHRoaXMubW92ZVRvVGFpbChpbmRleClcbiAgICAgICAgaWYgKHVwZGF0ZUFnZU9uR2V0KSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVJdGVtQWdlKGluZGV4KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICAgIHJldHVybiB2XG4gICAgICB9XG5cbiAgICAgIC8vIG9rLCBpdCBpcyBzdGFsZSBvciBhIGZvcmNlZCByZWZyZXNoLCBhbmQgbm90IGFscmVhZHkgZmV0Y2hpbmcuXG4gICAgICAvLyByZWZyZXNoIHRoZSBjYWNoZS5cbiAgICAgIGNvbnN0IHAgPSB0aGlzLmJhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgZmV0Y2hDb250ZXh0KVxuICAgICAgY29uc3QgaGFzU3RhbGUgPSBwLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHN0YWxlVmFsID0gaGFzU3RhbGUgJiYgYWxsb3dTdGFsZVxuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICBzdGF0dXMuZmV0Y2ggPSBoYXNTdGFsZSAmJiBpc1N0YWxlID8gJ3N0YWxlJyA6ICdyZWZyZXNoJ1xuICAgICAgICBpZiAoc3RhbGVWYWwgJiYgaXNTdGFsZSkgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhbGVWYWwgPyBwLl9fc3RhbGVXaGlsZUZldGNoaW5nIDogKHAuX19yZXR1cm5lZCA9IHApXG4gICAgfVxuICB9XG5cbiAgZ2V0KFxuICAgIGssXG4gICAge1xuICAgICAgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSxcbiAgICAgIHVwZGF0ZUFnZU9uR2V0ID0gdGhpcy51cGRhdGVBZ2VPbkdldCxcbiAgICAgIG5vRGVsZXRlT25TdGFsZUdldCA9IHRoaXMubm9EZWxldGVPblN0YWxlR2V0LFxuICAgICAgc3RhdHVzLFxuICAgIH0gPSB7fVxuICApIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMua2V5TWFwLmdldChrKVxuICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsTGlzdFtpbmRleF1cbiAgICAgIGNvbnN0IGZldGNoaW5nID0gdGhpcy5pc0JhY2tncm91bmRGZXRjaCh2YWx1ZSlcbiAgICAgIHRoaXMuc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpXG4gICAgICBpZiAodGhpcy5pc1N0YWxlKGluZGV4KSkge1xuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuZ2V0ID0gJ3N0YWxlJ1xuICAgICAgICAvLyBkZWxldGUgb25seSBpZiBub3QgYW4gaW4tZmxpZ2h0IGJhY2tncm91bmQgZmV0Y2hcbiAgICAgICAgaWYgKCFmZXRjaGluZykge1xuICAgICAgICAgIGlmICghbm9EZWxldGVPblN0YWxlR2V0KSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZShrKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IGFsbG93U3RhbGVcbiAgICAgICAgICByZXR1cm4gYWxsb3dTdGFsZSA/IHZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgc3RhdHVzLnJldHVybmVkU3RhbGUgPVxuICAgICAgICAgICAgICBhbGxvd1N0YWxlICYmIHZhbHVlLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFsbG93U3RhbGUgPyB2YWx1ZS5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhdHVzKSBzdGF0dXMuZ2V0ID0gJ2hpdCdcbiAgICAgICAgLy8gaWYgd2UncmUgY3VycmVudGx5IGZldGNoaW5nIGl0LCB3ZSBkb24ndCBhY3R1YWxseSBoYXZlIGl0IHlldFxuICAgICAgICAvLyBpdCdzIG5vdCBzdGFsZSwgd2hpY2ggbWVhbnMgdGhpcyBpc24ndCBhIHN0YWxlV2hpbGVSZWZldGNoaW5nLlxuICAgICAgICAvLyBJZiBpdCdzIG5vdCBzdGFsZSwgYW5kIGZldGNoaW5nLCBBTkQgaGFzIGEgX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgLy8gdmFsdWUsIHRoZW4gdGhhdCBtZWFucyB0aGUgdXNlciBmZXRjaGVkIHdpdGgge2ZvcmNlUmVmcmVzaDp0cnVlfSxcbiAgICAgICAgLy8gc28gaXQncyBzYWZlIHRvIHJldHVybiB0aGF0IHZhbHVlLlxuICAgICAgICBpZiAoZmV0Y2hpbmcpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vdmVUb1RhaWwoaW5kZXgpXG4gICAgICAgIGlmICh1cGRhdGVBZ2VPbkdldCkge1xuICAgICAgICAgIHRoaXMudXBkYXRlSXRlbUFnZShpbmRleClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgc3RhdHVzLmdldCA9ICdtaXNzJ1xuICAgIH1cbiAgfVxuXG4gIGNvbm5lY3QocCwgbikge1xuICAgIHRoaXMucHJldltuXSA9IHBcbiAgICB0aGlzLm5leHRbcF0gPSBuXG4gIH1cblxuICBtb3ZlVG9UYWlsKGluZGV4KSB7XG4gICAgLy8gaWYgdGFpbCBhbHJlYWR5LCBub3RoaW5nIHRvIGRvXG4gICAgLy8gaWYgaGVhZCwgbW92ZSBoZWFkIHRvIG5leHRbaW5kZXhdXG4gICAgLy8gZWxzZVxuICAgIC8vICAgbW92ZSBuZXh0W3ByZXZbaW5kZXhdXSB0byBuZXh0W2luZGV4XSAoaGVhZCBoYXMgbm8gcHJldilcbiAgICAvLyAgIG1vdmUgcHJldltuZXh0W2luZGV4XV0gdG8gcHJldltpbmRleF1cbiAgICAvLyBwcmV2W2luZGV4XSA9IHRhaWxcbiAgICAvLyBuZXh0W3RhaWxdID0gaW5kZXhcbiAgICAvLyB0YWlsID0gaW5kZXhcbiAgICBpZiAoaW5kZXggIT09IHRoaXMudGFpbCkge1xuICAgICAgaWYgKGluZGV4ID09PSB0aGlzLmhlYWQpIHtcbiAgICAgICAgdGhpcy5oZWFkID0gdGhpcy5uZXh0W2luZGV4XVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25uZWN0KHRoaXMucHJldltpbmRleF0sIHRoaXMubmV4dFtpbmRleF0pXG4gICAgICB9XG4gICAgICB0aGlzLmNvbm5lY3QodGhpcy50YWlsLCBpbmRleClcbiAgICAgIHRoaXMudGFpbCA9IGluZGV4XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRlbCgpIHtcbiAgICBkZXByZWNhdGVkTWV0aG9kKCdkZWwnLCAnZGVsZXRlJylcbiAgICByZXR1cm4gdGhpcy5kZWxldGVcbiAgfVxuXG4gIGRlbGV0ZShrKSB7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZVxuICAgIGlmICh0aGlzLnNpemUgIT09IDApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5rZXlNYXAuZ2V0KGspXG4gICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGVkID0gdHJ1ZVxuICAgICAgICBpZiAodGhpcy5zaXplID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5jbGVhcigpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVJdGVtU2l6ZShpbmRleClcbiAgICAgICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgICAgIGlmICh0aGlzLmlzQmFja2dyb3VuZEZldGNoKHYpKSB7XG4gICAgICAgICAgICB2Ll9fYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignZGVsZXRlZCcpKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2UodiwgaywgJ2RlbGV0ZScpXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlZC5wdXNoKFt2LCBrLCAnZGVsZXRlJ10pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMua2V5TWFwLmRlbGV0ZShrKVxuICAgICAgICAgIHRoaXMua2V5TGlzdFtpbmRleF0gPSBudWxsXG4gICAgICAgICAgdGhpcy52YWxMaXN0W2luZGV4XSA9IG51bGxcbiAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMudGFpbCkge1xuICAgICAgICAgICAgdGhpcy50YWlsID0gdGhpcy5wcmV2W2luZGV4XVxuICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuaGVhZCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkID0gdGhpcy5uZXh0W2luZGV4XVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5leHRbdGhpcy5wcmV2W2luZGV4XV0gPSB0aGlzLm5leHRbaW5kZXhdXG4gICAgICAgICAgICB0aGlzLnByZXZbdGhpcy5uZXh0W2luZGV4XV0gPSB0aGlzLnByZXZbaW5kZXhdXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2l6ZS0tXG4gICAgICAgICAgdGhpcy5mcmVlLnB1c2goaW5kZXgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2VkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VBZnRlciguLi50aGlzLmRpc3Bvc2VkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkXG4gIH1cblxuICBjbGVhcigpIHtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIHRoaXMucmluZGV4ZXMoeyBhbGxvd1N0YWxlOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy52YWxMaXN0W2luZGV4XVxuICAgICAgaWYgKHRoaXMuaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgdi5fX2Fib3J0Q29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoJ2RlbGV0ZWQnKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGsgPSB0aGlzLmtleUxpc3RbaW5kZXhdXG4gICAgICAgIHRoaXMuZGlzcG9zZSh2LCBrLCAnZGVsZXRlJylcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgdGhpcy5kaXNwb3NlZC5wdXNoKFt2LCBrLCAnZGVsZXRlJ10pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmtleU1hcC5jbGVhcigpXG4gICAgdGhpcy52YWxMaXN0LmZpbGwobnVsbClcbiAgICB0aGlzLmtleUxpc3QuZmlsbChudWxsKVxuICAgIGlmICh0aGlzLnR0bHMpIHtcbiAgICAgIHRoaXMudHRscy5maWxsKDApXG4gICAgICB0aGlzLnN0YXJ0cy5maWxsKDApXG4gICAgfVxuICAgIGlmICh0aGlzLnNpemVzKSB7XG4gICAgICB0aGlzLnNpemVzLmZpbGwoMClcbiAgICB9XG4gICAgdGhpcy5oZWFkID0gMFxuICAgIHRoaXMudGFpbCA9IDBcbiAgICB0aGlzLmluaXRpYWxGaWxsID0gMVxuICAgIHRoaXMuZnJlZS5sZW5ndGggPSAwXG4gICAgdGhpcy5jYWxjdWxhdGVkU2l6ZSA9IDBcbiAgICB0aGlzLnNpemUgPSAwXG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2VkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VBZnRlciguLi50aGlzLmRpc3Bvc2VkLnNoaWZ0KCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlc2V0KCkge1xuICAgIGRlcHJlY2F0ZWRNZXRob2QoJ3Jlc2V0JywgJ2NsZWFyJylcbiAgICByZXR1cm4gdGhpcy5jbGVhclxuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICBkZXByZWNhdGVkUHJvcGVydHkoJ2xlbmd0aCcsICdzaXplJylcbiAgICByZXR1cm4gdGhpcy5zaXplXG4gIH1cblxuICBzdGF0aWMgZ2V0IEFib3J0Q29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gQUNcbiAgfVxuICBzdGF0aWMgZ2V0IEFib3J0U2lnbmFsKCkge1xuICAgIHJldHVybiBBU1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTFJVQ2FjaGVcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5cbmxldCBzaGltO1xuY2xhc3MgWTE4TiB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICAvLyBjb25maWd1cmFibGUgb3B0aW9ucy5cbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gb3B0cy5kaXJlY3RvcnkgfHwgJy4vbG9jYWxlcyc7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsZXMgPSB0eXBlb2Ygb3B0cy51cGRhdGVGaWxlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy51cGRhdGVGaWxlcyA6IHRydWU7XG4gICAgICAgIHRoaXMubG9jYWxlID0gb3B0cy5sb2NhbGUgfHwgJ2VuJztcbiAgICAgICAgdGhpcy5mYWxsYmFja1RvTGFuZ3VhZ2UgPSB0eXBlb2Ygb3B0cy5mYWxsYmFja1RvTGFuZ3VhZ2UgPT09ICdib29sZWFuJyA/IG9wdHMuZmFsbGJhY2tUb0xhbmd1YWdlIDogdHJ1ZTtcbiAgICAgICAgLy8gaW50ZXJuYWwgc3R1ZmYuXG4gICAgICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLndyaXRlUXVldWUgPSBbXTtcbiAgICB9XG4gICAgX18oLi4uYXJncykge1xuICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90YWdnZWRMaXRlcmFsKGFyZ3VtZW50c1swXSwgLi4uYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHIgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGxldCBjYiA9IGZ1bmN0aW9uICgpIHsgfTsgLy8gc3RhcnQgd2l0aCBub29wLlxuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiID0gYXJncy5wb3AoKTtcbiAgICAgICAgY2IgPSBjYiB8fCBmdW5jdGlvbiAoKSB7IH07IC8vIG5vb3AuXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICAvLyB3ZSd2ZSBvYnNlcnZlZCBhIG5ldyBzdHJpbmcsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgZmlsZS5cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzdHJdICYmIHRoaXMudXBkYXRlRmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gPSBzdHI7XG4gICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgbG9jYWxlLFxuICAgICAgICAgICAgLy8gc2luY2UgdGhlc2UgdmFsdWVzIGNvdWxkIGNoYW5nZSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyB3cml0ZSBpcyBwZXJmb3JtZWQuXG4gICAgICAgICAgICB0aGlzLl9lbnF1ZXVlV3JpdGUoe1xuICAgICAgICAgICAgICAgIGRpcmVjdG9yeTogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICAgICAgICBjYlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgW3RoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gfHwgc3RyXS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgICBfX24oKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICBjb25zdCBzaW5ndWxhciA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgY29uc3QgcGx1cmFsID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBjb25zdCBxdWFudGl0eSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgbGV0IGNiID0gZnVuY3Rpb24gKCkgeyB9OyAvLyBzdGFydCB3aXRoIG5vb3AuXG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IgPSBhcmdzLnBvcCgpO1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdKVxuICAgICAgICAgICAgdGhpcy5fcmVhZExvY2FsZUZpbGUoKTtcbiAgICAgICAgbGV0IHN0ciA9IHF1YW50aXR5ID09PSAxID8gc2luZ3VsYXIgOiBwbHVyYWw7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdO1xuICAgICAgICAgICAgc3RyID0gZW50cnlbcXVhbnRpdHkgPT09IDEgPyAnb25lJyA6ICdvdGhlciddO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdlJ3ZlIG9ic2VydmVkIGEgbmV3IHN0cmluZywgdXBkYXRlIHRoZSBsYW5ndWFnZSBmaWxlLlxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXSAmJiB0aGlzLnVwZGF0ZUZpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0gPSB7XG4gICAgICAgICAgICAgICAgb25lOiBzaW5ndWxhcixcbiAgICAgICAgICAgICAgICBvdGhlcjogcGx1cmFsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGxvY2FsZSxcbiAgICAgICAgICAgIC8vIHNpbmNlIHRoZXNlIHZhbHVlcyBjb3VsZCBjaGFuZ2UgYmVmb3JlIHRoZVxuICAgICAgICAgICAgLy8gd3JpdGUgaXMgcGVyZm9ybWVkLlxuICAgICAgICAgICAgdGhpcy5fZW5xdWV1ZVdyaXRlKHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuZGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgICAgICAgY2JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhICVkIHBsYWNlaG9sZGVyIGlzIHByb3ZpZGVkLCBhZGQgcXVhbnRpdHlcbiAgICAgICAgLy8gdG8gdGhlIGFyZ3VtZW50cyBleHBhbmRlZCBieSB1dGlsLmZvcm1hdC5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gW3N0cl07XG4gICAgICAgIGlmICh+c3RyLmluZGV4T2YoJyVkJykpXG4gICAgICAgICAgICB2YWx1ZXMucHVzaChxdWFudGl0eSk7XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgdmFsdWVzLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICAgIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgfVxuICAgIGdldExvY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlO1xuICAgIH1cbiAgICB1cGRhdGVMb2NhbGUob2JqKSB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1ba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIF90YWdnZWRMaXRlcmFsKHBhcnRzLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgcGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCwgaSkge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpICsgMV07XG4gICAgICAgICAgICBzdHIgKz0gcGFydDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHN0ciArPSAnJXMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX18uYXBwbHkodGhpcywgW3N0cl0uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJncywgMSkpKTtcbiAgICB9XG4gICAgX2VucXVldWVXcml0ZSh3b3JrKSB7XG4gICAgICAgIHRoaXMud3JpdGVRdWV1ZS5wdXNoKHdvcmspO1xuICAgICAgICBpZiAodGhpcy53cml0ZVF1ZXVlLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NXcml0ZVF1ZXVlKCk7XG4gICAgfVxuICAgIF9wcm9jZXNzV3JpdGVRdWV1ZSgpIHtcbiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xuICAgICAgICBjb25zdCB3b3JrID0gdGhpcy53cml0ZVF1ZXVlWzBdO1xuICAgICAgICAvLyBkZXN0cnVjdHVyZSB0aGUgZW5xdWV1ZWQgd29yay5cbiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gd29yay5kaXJlY3Rvcnk7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9IHdvcmsubG9jYWxlO1xuICAgICAgICBjb25zdCBjYiA9IHdvcmsuY2I7XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHRoaXMuX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZExvY2FsZSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY2FjaGVbbG9jYWxlXSwgbnVsbCwgMik7XG4gICAgICAgIHNoaW0uZnMud3JpdGVGaWxlKGxhbmd1YWdlRmlsZSwgc2VyaWFsaXplZExvY2FsZSwgJ3V0Zi04JywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgX3RoaXMud3JpdGVRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKF90aGlzLndyaXRlUXVldWUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBfdGhpcy5fcHJvY2Vzc1dyaXRlUXVldWUoKTtcbiAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcmVhZExvY2FsZUZpbGUoKSB7XG4gICAgICAgIGxldCBsb2NhbGVMb29rdXAgPSB7fTtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VGaWxlID0gdGhpcy5fcmVzb2x2ZUxvY2FsZUZpbGUodGhpcy5kaXJlY3RvcnksIHRoaXMubG9jYWxlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBidW5kbGVyIHN1Y2ggYXMgd2VicGFjaywgcmVhZEZpbGVTeW5jIG1heSBub3QgYmUgZGVmaW5lZDpcbiAgICAgICAgICAgIGlmIChzaGltLmZzLnJlYWRGaWxlU3luYykge1xuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IEpTT04ucGFyc2Uoc2hpbS5mcy5yZWFkRmlsZVN5bmMobGFuZ3VhZ2VGaWxlLCAndXRmLTgnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSAnc3ludGF4IGVycm9yIGluICcgKyBsYW5ndWFnZUZpbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKVxuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IHt9O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSA9IGxvY2FsZUxvb2t1cDtcbiAgICB9XG4gICAgX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKSB7XG4gICAgICAgIGxldCBmaWxlID0gc2hpbS5yZXNvbHZlKGRpcmVjdG9yeSwgJy4vJywgbG9jYWxlICsgJy5qc29uJyk7XG4gICAgICAgIGlmICh0aGlzLmZhbGxiYWNrVG9MYW5ndWFnZSAmJiAhdGhpcy5fZmlsZUV4aXN0c1N5bmMoZmlsZSkgJiYgfmxvY2FsZS5sYXN0SW5kZXhPZignXycpKSB7XG4gICAgICAgICAgICAvLyBhdHRlbXB0IGZhbGxiYWNrIHRvIGxhbmd1YWdlIG9ubHlcbiAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHNoaW0ucmVzb2x2ZShkaXJlY3RvcnksICcuLycsIGxvY2FsZS5zcGxpdCgnXycpWzBdICsgJy5qc29uJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZmlsZUV4aXN0c1N5bmMobGFuZ3VhZ2VGaWxlKSlcbiAgICAgICAgICAgICAgICBmaWxlID0gbGFuZ3VhZ2VGaWxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cbiAgICBfZmlsZUV4aXN0c1N5bmMoZmlsZSkge1xuICAgICAgICByZXR1cm4gc2hpbS5leGlzdHMoZmlsZSk7XG4gICAgfVxufVxuZnVuY3Rpb24geTE4biQxKG9wdHMsIF9zaGltKSB7XG4gICAgc2hpbSA9IF9zaGltO1xuICAgIGNvbnN0IHkxOG4gPSBuZXcgWTE4TihvcHRzKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBfXzogeTE4bi5fXy5iaW5kKHkxOG4pLFxuICAgICAgICBfX246IHkxOG4uX19uLmJpbmQoeTE4biksXG4gICAgICAgIHNldExvY2FsZTogeTE4bi5zZXRMb2NhbGUuYmluZCh5MThuKSxcbiAgICAgICAgZ2V0TG9jYWxlOiB5MThuLmdldExvY2FsZS5iaW5kKHkxOG4pLFxuICAgICAgICB1cGRhdGVMb2NhbGU6IHkxOG4udXBkYXRlTG9jYWxlLmJpbmQoeTE4biksXG4gICAgICAgIGxvY2FsZTogeTE4bi5sb2NhbGVcbiAgICB9O1xufVxuXG52YXIgbm9kZVBsYXRmb3JtU2hpbSA9IHtcbiAgICBmczoge1xuICAgICAgICByZWFkRmlsZVN5bmM6IGZzLnJlYWRGaWxlU3luYyxcbiAgICAgICAgd3JpdGVGaWxlOiBmcy53cml0ZUZpbGVcbiAgICB9LFxuICAgIGZvcm1hdDogdXRpbC5mb3JtYXQsXG4gICAgcmVzb2x2ZTogcGF0aC5yZXNvbHZlLFxuICAgIGV4aXN0czogKGZpbGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBmcy5zdGF0U3luYyhmaWxlKS5pc0ZpbGUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jb25zdCB5MThuID0gKG9wdHMpID0+IHtcbiAgICByZXR1cm4geTE4biQxKG9wdHMsIG5vZGVQbGF0Zm9ybVNoaW0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB5MThuO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcblxuZnVuY3Rpb24gY2FtZWxDYXNlKHN0cikge1xuICAgIGNvbnN0IGlzQ2FtZWxDYXNlID0gc3RyICE9PSBzdHIudG9Mb3dlckNhc2UoKSAmJiBzdHIgIT09IHN0ci50b1VwcGVyQ2FzZSgpO1xuICAgIGlmICghaXNDYW1lbENhc2UpIHtcbiAgICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmIChzdHIuaW5kZXhPZignLScpID09PSAtMSAmJiBzdHIuaW5kZXhPZignXycpID09PSAtMSkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNhbWVsY2FzZSA9ICcnO1xuICAgICAgICBsZXQgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdIeXBoZW5zID0gc3RyLm1hdGNoKC9eLSsvKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxlYWRpbmdIeXBoZW5zID8gbGVhZGluZ0h5cGhlbnNbMF0ubGVuZ3RoIDogMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNociA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAobmV4dENoclVwcGVyKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hyID0gY2hyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gMCAmJiAoY2hyID09PSAnLScgfHwgY2hyID09PSAnXycpKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNociAhPT0gJy0nICYmIGNociAhPT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgY2FtZWxjYXNlICs9IGNocjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FtZWxjYXNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRlY2FtZWxpemUoc3RyLCBqb2luU3RyaW5nKSB7XG4gICAgY29uc3QgbG93ZXJjYXNlID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgam9pblN0cmluZyA9IGpvaW5TdHJpbmcgfHwgJy0nO1xuICAgIGxldCBub3RDYW1lbGNhc2UgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaHJMb3dlciA9IGxvd2VyY2FzZS5jaGFyQXQoaSk7XG4gICAgICAgIGNvbnN0IGNoclN0cmluZyA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChjaHJMb3dlciAhPT0gY2hyU3RyaW5nICYmIGkgPiAwKSB7XG4gICAgICAgICAgICBub3RDYW1lbGNhc2UgKz0gYCR7am9pblN0cmluZ30ke2xvd2VyY2FzZS5jaGFyQXQoaSl9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5vdENhbWVsY2FzZSArPSBjaHJTdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vdENhbWVsY2FzZTtcbn1cbmZ1bmN0aW9uIGxvb2tzTGlrZU51bWJlcih4KSB7XG4gICAgaWYgKHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKC9eMHhbMC05YS1mXSskL2kudGVzdCh4KSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKC9eMFteLl0vLnRlc3QoeCkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gL15bLV0/KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKShlWy0rXT9cXGQrKT8kLy50ZXN0KHgpO1xufVxuXG5mdW5jdGlvbiB0b2tlbml6ZUFyZ1N0cmluZyhhcmdTdHJpbmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdTdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBhcmdTdHJpbmcubWFwKGUgPT4gdHlwZW9mIGUgIT09ICdzdHJpbmcnID8gZSArICcnIDogZSk7XG4gICAgfVxuICAgIGFyZ1N0cmluZyA9IGFyZ1N0cmluZy50cmltKCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBwcmV2QyA9IG51bGw7XG4gICAgbGV0IGMgPSBudWxsO1xuICAgIGxldCBvcGVuaW5nID0gbnVsbDtcbiAgICBjb25zdCBhcmdzID0gW107XG4gICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGFyZ1N0cmluZy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgcHJldkMgPSBjO1xuICAgICAgICBjID0gYXJnU3RyaW5nLmNoYXJBdChpaSk7XG4gICAgICAgIGlmIChjID09PSAnICcgJiYgIW9wZW5pbmcpIHtcbiAgICAgICAgICAgIGlmICghKHByZXZDID09PSAnICcpKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09IG9wZW5pbmcpIHtcbiAgICAgICAgICAgIG9wZW5pbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjID09PSBcIidcIiB8fCBjID09PSAnXCInKSAmJiAhb3BlbmluZykge1xuICAgICAgICAgICAgb3BlbmluZyA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmdzW2ldKVxuICAgICAgICAgICAgYXJnc1tpXSA9ICcnO1xuICAgICAgICBhcmdzW2ldICs9IGM7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuXG52YXIgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXk7XG4oZnVuY3Rpb24gKERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5KSB7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJCT09MRUFOXCJdID0gXCJib29sZWFuXCI7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJTVFJJTkdcIl0gPSBcInN0cmluZ1wiO1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiTlVNQkVSXCJdID0gXCJudW1iZXJcIjtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIkFSUkFZXCJdID0gXCJhcnJheVwiO1xufSkoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgfHwgKERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5ID0ge30pKTtcblxubGV0IG1peGluO1xuY2xhc3MgWWFyZ3NQYXJzZXIge1xuICAgIGNvbnN0cnVjdG9yKF9taXhpbikge1xuICAgICAgICBtaXhpbiA9IF9taXhpbjtcbiAgICB9XG4gICAgcGFyc2UoYXJnc0lucHV0LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIGFsaWFzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcnJheTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYm9vbGVhbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY29uZmlnOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWdPYmplY3RzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb2VyY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvdW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBlbnZQcmVmaXg6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5hcmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG5vcm1hbGl6ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3RyaW5nOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBudW1iZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIF9fOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBrZXk6IHVuZGVmaW5lZFxuICAgICAgICB9LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgYXJncyA9IHRva2VuaXplQXJnU3RyaW5nKGFyZ3NJbnB1dCk7XG4gICAgICAgIGNvbnN0IGlucHV0SXNTdHJpbmcgPSB0eXBlb2YgYXJnc0lucHV0ID09PSAnc3RyaW5nJztcbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IGNvbWJpbmVBbGlhc2VzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5hbGlhcykpO1xuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAnYm9vbGVhbi1uZWdhdGlvbic6IHRydWUsXG4gICAgICAgICAgICAnY2FtZWwtY2FzZS1leHBhbnNpb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2NvbWJpbmUtYXJyYXlzJzogZmFsc2UsXG4gICAgICAgICAgICAnZG90LW5vdGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgICAgICdkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5JzogdHJ1ZSxcbiAgICAgICAgICAgICdmbGF0dGVuLWR1cGxpY2F0ZS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2dyZWVkeS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2hhbHQtYXQtbm9uLW9wdGlvbic6IGZhbHNlLFxuICAgICAgICAgICAgJ25hcmdzLWVhdHMtb3B0aW9ucyc6IGZhbHNlLFxuICAgICAgICAgICAgJ25lZ2F0aW9uLXByZWZpeCc6ICduby0nLFxuICAgICAgICAgICAgJ3BhcnNlLW51bWJlcnMnOiB0cnVlLFxuICAgICAgICAgICAgJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyc6IHRydWUsXG4gICAgICAgICAgICAncG9wdWxhdGUtLSc6IGZhbHNlLFxuICAgICAgICAgICAgJ3NldC1wbGFjZWhvbGRlci1rZXknOiBmYWxzZSxcbiAgICAgICAgICAgICdzaG9ydC1vcHRpb24tZ3JvdXBzJzogdHJ1ZSxcbiAgICAgICAgICAgICdzdHJpcC1hbGlhc2VkJzogZmFsc2UsXG4gICAgICAgICAgICAnc3RyaXAtZGFzaGVkJzogZmFsc2UsXG4gICAgICAgICAgICAndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnOiBmYWxzZVxuICAgICAgICB9LCBvcHRzLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5kZWZhdWx0KTtcbiAgICAgICAgY29uc3QgY29uZmlnT2JqZWN0cyA9IG9wdHMuY29uZmlnT2JqZWN0cyB8fCBbXTtcbiAgICAgICAgY29uc3QgZW52UHJlZml4ID0gb3B0cy5lbnZQcmVmaXg7XG4gICAgICAgIGNvbnN0IG5vdEZsYWdzT3B0aW9uID0gY29uZmlndXJhdGlvblsncG9wdWxhdGUtLSddO1xuICAgICAgICBjb25zdCBub3RGbGFnc0FyZ3YgPSBub3RGbGFnc09wdGlvbiA/ICctLScgOiAnXyc7XG4gICAgICAgIGNvbnN0IG5ld0FsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBkZWZhdWx0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBfXyA9IG9wdHMuX18gfHwgbWl4aW4uZm9ybWF0O1xuICAgICAgICBjb25zdCBmbGFncyA9IHtcbiAgICAgICAgICAgIGFsaWFzZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBhcnJheXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBib29sczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIHN0cmluZ3M6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBudW1iZXJzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY291bnRzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgbm9ybWFsaXplOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29uZmlnczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG5hcmdzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29lcmNpb25zOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAga2V5czogW11cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmUgPSAvXi0oWzAtOV0rKFxcLlswLTldKyk/fFxcLlswLTldKykkLztcbiAgICAgICAgY29uc3QgbmVnYXRlZEJvb2xlYW4gPSBuZXcgUmVnRXhwKCdeLS0nICsgY29uZmlndXJhdGlvblsnbmVnYXRpb24tcHJlZml4J10gKyAnKC4rKScpO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5hcnJheSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdHlwZW9mIG9wdCA9PT0gJ29iamVjdCcgPyBvcHQua2V5IDogb3B0O1xuICAgICAgICAgICAgY29uc3QgYXNzaWdubWVudCA9IE9iamVjdC5rZXlzKG9wdCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUZsYWdLZXlzID0ge1xuICAgICAgICAgICAgICAgICAgICBib29sZWFuOiAnYm9vbHMnLFxuICAgICAgICAgICAgICAgICAgICBzdHJpbmc6ICdzdHJpbmdzJyxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiAnbnVtYmVycydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheUZsYWdLZXlzW2tleV07XG4gICAgICAgICAgICB9KS5maWx0ZXIoQm9vbGVhbikucG9wKCk7XG4gICAgICAgICAgICBpZiAoYXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZsYWdzW2Fzc2lnbm1lbnRdW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmxhZ3MuYXJyYXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5ib29sZWFuIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5ib29sc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMuc3RyaW5nIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5zdHJpbmdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5udW1iZXIgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLm51bWJlcnNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmNvdW50IHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5jb3VudHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLm5vcm1hbGl6ZSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZmxhZ3Mubm9ybWFsaXplW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubmFyZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMubmFyZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MubmFyZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY29lcmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb2VyY2UpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29lcmNpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmNvbmZpZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMuY29uZmlnKSB8fCB0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgW10uY29uY2F0KG9wdHMuY29uZmlnKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNvbmZpZ3Nba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb25maWcpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5jb25maWdzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV4dGVuZEFsaWFzZXMob3B0cy5rZXksIGFsaWFzZXMsIG9wdHMuZGVmYXVsdCwgZmxhZ3MuYXJyYXlzKTtcbiAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgKGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1thbGlhc10gPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgbGV0IG5vdEZsYWdzID0gW107XG4gICAgICAgIGNvbnN0IGFyZ3YgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHsgXzogW10gfSk7XG4gICAgICAgIGNvbnN0IGFyZ3ZSZXR1cm4gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAgICAgY29uc3QgdHJ1bmNhdGVkQXJnID0gYXJnLnJlcGxhY2UoL14tezMsfS8sICctLS0nKTtcbiAgICAgICAgICAgIGxldCBicm9rZW47XG4gICAgICAgICAgICBsZXQga2V5O1xuICAgICAgICAgICAgbGV0IGxldHRlcnM7XG4gICAgICAgICAgICBsZXQgbTtcbiAgICAgICAgICAgIGxldCBuZXh0O1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKGFyZyAhPT0gJy0tJyAmJiAvXi0vLnRlc3QoYXJnKSAmJiBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRydW5jYXRlZEFyZy5tYXRjaCgvXi0tLSsoPXwkKS8pKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLis9LykgfHwgKCFjb25maWd1cmF0aW9uWydzaG9ydC1vcHRpb24tZ3JvdXBzJ10gJiYgYXJnLm1hdGNoKC9eLS4rPS8pKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tLT8oW149XSspPShbXFxzXFxTXSopJC8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKG1bMV0sIGZsYWdzLmFycmF5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXRBcnJheShpLCBtWzFdLCBhcmdzLCBtWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMobVsxXSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIG1bMV0sIGFyZ3MsIG1bMl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKSAmJiBjb25maWd1cmF0aW9uWydib29sZWFuLW5lZ2F0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSA/IFtmYWxzZV0gOiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS0uKy8pIHx8ICghY29uZmlndXJhdGlvblsnc2hvcnQtb3B0aW9uLWdyb3VwcyddICYmIGFyZy5tYXRjaCgvXi1bXi1dKy8pKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tLT8oLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCFuZXh0Lm1hdGNoKC9eLS8pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLS5cXC4uKz0vKSkge1xuICAgICAgICAgICAgICAgIG0gPSBhcmcubWF0Y2goL14tKFtePV0rKT0oW1xcc1xcU10qKSQvKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0uXFwuLisvKSAmJiAhYXJnLm1hdGNoKG5lZ2F0aXZlKSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLSguXFwuLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgIW5leHQubWF0Y2goL14tLykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi1bXi1dKy8pICYmICFhcmcubWF0Y2gobmVnYXRpdmUpKSB7XG4gICAgICAgICAgICAgICAgbGV0dGVycyA9IGFyZy5zbGljZSgxLCAtMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgICAgIGJyb2tlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnLnNsaWNlKGogKyAyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnLnNsaWNlKGogKyAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGxldHRlcnNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlYXRBcnJheShpLCBrZXksIGFyZ3MsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgL14tP1xcZCsoXFwuXFxkKik/KGUtP1xcZCspPyQvLnRlc3QobmV4dCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhuZXh0LCBmbGFncy5ib29scykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIGRlZmF1bHRWYWx1ZShsZXR0ZXJzW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga2V5ID0gYXJnLnNsaWNlKC0xKVswXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJyb2tlbiAmJiBrZXkgIT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnc1tpICsgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAhPT0gdW5kZWZpbmVkICYmICghL14oLXwtLSlbXi1dLy50ZXN0KG5leHQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKC9eLVswLTldJC8pICYmXG4gICAgICAgICAgICAgICAgYXJnLm1hdGNoKG5lZ2F0aXZlKSAmJlxuICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhhcmcuc2xpY2UoMSksIGZsYWdzLmJvb2xzKSkge1xuICAgICAgICAgICAgICAgIGtleSA9IGFyZy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgICAgICAgICAgICBub3RGbGFncyA9IGFyZ3Muc2xpY2UoaSArIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29uZmlndXJhdGlvblsnaGFsdC1hdC1ub24tb3B0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBub3RGbGFncyA9IGFyZ3Muc2xpY2UoaSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwdXNoUG9zaXRpb25hbChhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCB0cnVlKTtcbiAgICAgICAgYXBwbHlFbnZWYXJzKGFyZ3YsIGZhbHNlKTtcbiAgICAgICAgc2V0Q29uZmlnKGFyZ3YpO1xuICAgICAgICBzZXRDb25maWdPYmplY3RzKCk7XG4gICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGFyZ3YsIGZsYWdzLmFsaWFzZXMsIGRlZmF1bHRzLCB0cnVlKTtcbiAgICAgICAgYXBwbHlDb2VyY2lvbnMoYXJndik7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydzZXQtcGxhY2Vob2xkZXIta2V5J10pXG4gICAgICAgICAgICBzZXRQbGFjZWhvbGRlcktleXMoYXJndik7XG4gICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoIWhhc0tleShhcmd2LCBrZXkuc3BsaXQoJy4nKSkpXG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobm90RmxhZ3NPcHRpb24gJiYgbm90RmxhZ3MubGVuZ3RoKVxuICAgICAgICAgICAgYXJndltub3RGbGFnc0FyZ3ZdID0gW107XG4gICAgICAgIG5vdEZsYWdzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgYXJndltub3RGbGFnc0FyZ3ZdLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddICYmIGNvbmZpZ3VyYXRpb25bJ3N0cmlwLWRhc2hlZCddKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJy0tJyAmJiBrZXkuaW5jbHVkZXMoJy0nKSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBhcmd2W2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnc3RyaXAtYWxpYXNlZCddKSB7XG4gICAgICAgICAgICBbXS5jb25jYXQoLi4uT2JqZWN0LmtleXMoYWxpYXNlcykubWFwKGsgPT4gYWxpYXNlc1trXSkpLmZvckVhY2goYWxpYXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddICYmIGFsaWFzLmluY2x1ZGVzKCctJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3ZbYWxpYXMuc3BsaXQoJy4nKS5tYXAocHJvcCA9PiBjYW1lbENhc2UocHJvcCkpLmpvaW4oJy4nKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhcmd2W2FsaWFzXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHB1c2hQb3NpdGlvbmFsKGFyZykge1xuICAgICAgICAgICAgY29uc3QgbWF5YmVDb2VyY2VkTnVtYmVyID0gbWF5YmVDb2VyY2VOdW1iZXIoJ18nLCBhcmcpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgYXJndi5fLnB1c2gobWF5YmVDb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlYXROYXJncyhpLCBrZXksIGFyZ3MsIGFyZ0FmdGVyRXF1YWxTaWduKSB7XG4gICAgICAgICAgICBsZXQgaWk7XG4gICAgICAgICAgICBsZXQgdG9FYXQgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncyk7XG4gICAgICAgICAgICB0b0VhdCA9IHR5cGVvZiB0b0VhdCAhPT0gJ251bWJlcicgfHwgaXNOYU4odG9FYXQpID8gMSA6IHRvRWF0O1xuICAgICAgICAgICAgaWYgKHRvRWF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnQXJndW1lbnQgdW5leHBlY3RlZCBmb3I6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhdmFpbGFibGUgPSBpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgPyAwIDogMTtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWyduYXJncy1lYXRzLW9wdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAtIChpICsgMSkgKyBhdmFpbGFibGUgPCB0b0VhdCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZSA9IHRvRWF0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChpaSA9IGkgKyAxOyBpaSA8IGFyZ3MubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXJnc1tpaV0ubWF0Y2goL14tW14wLTldLykgfHwgYXJnc1tpaV0ubWF0Y2gobmVnYXRpdmUpIHx8IGlzVW5rbm93bk9wdGlvbkFzQXJnKGFyZ3NbaWldKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSsrO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSA8IHRvRWF0KVxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29uc3VtZWQgPSBNYXRoLm1pbihhdmFpbGFibGUsIHRvRWF0KTtcbiAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pICYmIGNvbnN1bWVkID4gMCkge1xuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGFyZ0FmdGVyRXF1YWxTaWduKTtcbiAgICAgICAgICAgICAgICBjb25zdW1lZC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpaSA9IGkgKyAxOyBpaSA8IChjb25zdW1lZCArIGkgKyAxKTsgaWkrKykge1xuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGFyZ3NbaWldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoaSArIGNvbnN1bWVkKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlYXRBcnJheShpLCBrZXksIGFyZ3MsIGFyZ0FmdGVyRXF1YWxTaWduKSB7XG4gICAgICAgICAgICBsZXQgYXJnc1RvU2V0ID0gW107XG4gICAgICAgICAgICBsZXQgbmV4dCA9IGFyZ0FmdGVyRXF1YWxTaWduIHx8IGFyZ3NbaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgbmFyZ3NDb3VudCA9IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKTtcbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiYgISgvXih0cnVlfGZhbHNlKSQvLnRlc3QobmV4dCkpKSB7XG4gICAgICAgICAgICAgICAgYXJnc1RvU2V0LnB1c2godHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc1VuZGVmaW5lZChuZXh0KSB8fFxuICAgICAgICAgICAgICAgIChpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgJiYgL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdHNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZlZhbCA9IGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldCA9IEFycmF5LmlzQXJyYXkoZGVmVmFsKSA/IGRlZlZhbCA6IFtkZWZWYWxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIGFyZ0FmdGVyRXF1YWxTaWduLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghY29uZmlndXJhdGlvblsnZ3JlZWR5LWFycmF5cyddICYmIGFyZ3NUb1NldC5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKG5hcmdzQ291bnQgJiYgdHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmIGFyZ3NUb1NldC5sZW5ndGggPj0gbmFyZ3NDb3VudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaWldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpID0gaWk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIG5leHQsIGlucHV0SXNTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmICgobmFyZ3NDb3VudCAmJiBhcmdzVG9TZXQubGVuZ3RoIDwgbmFyZ3NDb3VudCkgfHxcbiAgICAgICAgICAgICAgICAoaXNOYU4obmFyZ3NDb3VudCkgJiYgYXJnc1RvU2V0Lmxlbmd0aCA9PT0gMCkpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnTm90IGVub3VnaCBhcmd1bWVudHMgZm9sbG93aW5nOiAlcycsIGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnc1RvU2V0KTtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNldEFyZyhrZXksIHZhbCwgc2hvdWxkU3RyaXBRdW90ZXMgPSBpbnB1dElzU3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAoLy0vLnRlc3Qoa2V5KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxpYXMgPSBrZXkuc3BsaXQoJy4nKS5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZShwcm9wKTtcbiAgICAgICAgICAgICAgICB9KS5qb2luKCcuJyk7XG4gICAgICAgICAgICAgICAgYWRkTmV3QWxpYXMoa2V5LCBhbGlhcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHByb2Nlc3NWYWx1ZShrZXksIHZhbCwgc2hvdWxkU3RyaXBRdW90ZXMpO1xuICAgICAgICAgICAgY29uc3Qgc3BsaXRLZXkgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIHNldEtleShhcmd2LCBzcGxpdEtleSwgdmFsdWUpO1xuICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3BsaXRLZXkubGVuZ3RoID4gMSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgIChmbGFncy5hbGlhc2VzW3NwbGl0S2V5WzBdXSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQga2V5UHJvcGVydGllcyA9IHguc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IFtdLmNvbmNhdChzcGxpdEtleSk7XG4gICAgICAgICAgICAgICAgICAgIGEuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAga2V5UHJvcGVydGllcyA9IGtleVByb3BlcnRpZXMuY29uY2F0KGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2tleV0gfHwgW10pLmluY2x1ZGVzKGtleVByb3BlcnRpZXMuam9pbignLicpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIGtleVByb3BlcnRpZXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmFycmF5cykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gW2tleV0uY29uY2F0KGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSk7XG4gICAgICAgICAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFyZ3ZSZXR1cm4sIGtleSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBtaXhpbi5ub3JtYWxpemUodmFsdWUpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFkZE5ld0FsaWFzKGtleSwgYWxpYXMpIHtcbiAgICAgICAgICAgIGlmICghKGZsYWdzLmFsaWFzZXNba2V5XSAmJiBmbGFncy5hbGlhc2VzW2tleV0ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XSA9IFthbGlhc107XG4gICAgICAgICAgICAgICAgbmV3QWxpYXNlc1thbGlhc10gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1thbGlhc10gJiYgZmxhZ3MuYWxpYXNlc1thbGlhc10ubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIGFkZE5ld0FsaWFzKGFsaWFzLCBrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NWYWx1ZShrZXksIHZhbCwgc2hvdWxkU3RyaXBRdW90ZXMpIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRTdHJpcFF1b3Rlcykge1xuICAgICAgICAgICAgICAgIHZhbCA9IHN0cmlwUXVvdGVzKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpIHx8IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbCA9PT0gJ3RydWUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgICAgICAgICAgICAgPyB2YWwubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiBtYXliZUNvZXJjZU51bWJlcihrZXksIHYpOyB9KVxuICAgICAgICAgICAgICAgIDogbWF5YmVDb2VyY2VOdW1iZXIoa2V5LCB2YWwpO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykgJiYgKGlzVW5kZWZpbmVkKHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGluY3JlbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsLm1hcCgodmFsKSA9PiB7IHJldHVybiBtaXhpbi5ub3JtYWxpemUodmFsKTsgfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1peGluLm5vcm1hbGl6ZSh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJ10gJiYga2V5ID09PSAnXycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5zdHJpbmdzKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZENvZXJjZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcih2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsncGFyc2UtbnVtYmVycyddICYmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dmFsdWV9YCkpKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENvZXJjZU51bWJlciB8fCAoIWlzVW5kZWZpbmVkKHZhbHVlKSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWcoYXJndikge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGNvbmZpZ0xvb2t1cCwgZmxhZ3MuYWxpYXNlcywgZGVmYXVsdHMpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmxhZ3MuY29uZmlncykuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGFyZ3ZbY29uZmlnS2V5XSB8fCBjb25maWdMb29rdXBbY29uZmlnS2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbmZpZ1BhdGggPSBtaXhpbi5yZXNvbHZlKG1peGluLmN3ZCgpLCBjb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVDb25maWcgPSBmbGFncy5jb25maWdzW2NvbmZpZ0tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSByZXNvbHZlQ29uZmlnKHJlc29sdmVkQ29uZmlnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1peGluLnJlcXVpcmUocmVzb2x2ZWRDb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4Lm5hbWUgPT09ICdQZXJtaXNzaW9uRGVuaWVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJndltjb25maWdLZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgSlNPTiBjb25maWcgZmlsZTogJXMnLCBjb25maWdQYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3QoY29uZmlnLCBwcmV2KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbEtleSA9IHByZXYgPyBwcmV2ICsgJy4nICsga2V5IDoga2V5O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDb25maWdPYmplY3QodmFsdWUsIGZ1bGxLZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwgZnVsbEtleS5zcGxpdCgnLicpKSB8fCAoY2hlY2tBbGxBbGlhc2VzKGZ1bGxLZXksIGZsYWdzLmFycmF5cykgJiYgY29uZmlndXJhdGlvblsnY29tYmluZS1hcnJheXMnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhmdWxsS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3RzKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25maWdPYmplY3RzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGNvbmZpZ09iamVjdHMuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWdPYmplY3QpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5RW52VmFycyhhcmd2LCBjb25maWdPbmx5KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVudlByZWZpeCA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gdHlwZW9mIGVudlByZWZpeCA9PT0gJ3N0cmluZycgPyBlbnZQcmVmaXggOiAnJztcbiAgICAgICAgICAgIGNvbnN0IGVudiA9IG1peGluLmVudigpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGZ1bmN0aW9uIChlbnZWYXIpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09PSAnJyB8fCBlbnZWYXIubGFzdEluZGV4T2YocHJlZml4LCAwKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gZW52VmFyLnNwbGl0KCdfXycpLm1hcChmdW5jdGlvbiAoa2V5LCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtZWxDYXNlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKChjb25maWdPbmx5ICYmIGZsYWdzLmNvbmZpZ3Nba2V5cy5qb2luKCcuJyldKSB8fCAhY29uZmlnT25seSkgJiYgIWhhc0tleShhcmd2LCBrZXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleXMuam9pbignLicpLCBlbnZbZW52VmFyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBhcHBseUNvZXJjaW9ucyhhcmd2KSB7XG4gICAgICAgICAgICBsZXQgY29lcmNlO1xuICAgICAgICAgICAgY29uc3QgYXBwbGllZCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGlmICghYXBwbGllZC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb2VyY2UgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb2VyY2lvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1heWJlQ29lcmNlTnVtYmVyKGtleSwgY29lcmNlKGFyZ3Zba2V5XSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpKS5mb3JFYWNoKGFsaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQuYWRkKGFsaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbYWxpXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpIHtcbiAgICAgICAgICAgIGZsYWdzLmtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKH5rZXkuaW5kZXhPZignLicpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd2W2tleV0gPT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgICAgICAgICBhcmd2W2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBhcmd2O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKG9iaiwgYWxpYXNlcywgZGVmYXVsdHMsIGNhbkxvZyA9IGZhbHNlKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkZWZhdWx0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkob2JqLCBrZXkuc3BsaXQoJy4nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0S2V5KG9iaiwga2V5LnNwbGl0KCcuJyksIGRlZmF1bHRzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FuTG9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdGVkW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAoYWxpYXNlc1trZXldIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzS2V5KG9iaiwgeC5zcGxpdCgnLicpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRLZXkob2JqLCB4LnNwbGl0KCcuJyksIGRlZmF1bHRzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYXNLZXkob2JqLCBrZXlzKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG9iajtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pXG4gICAgICAgICAgICAgICAga2V5cyA9IFtrZXlzLmpvaW4oJy4nKV07XG4gICAgICAgICAgICBrZXlzLnNsaWNlKDAsIC0xKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBvID0gKG9ba2V5XSB8fCB7fSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbyAhPT0gJ29iamVjdCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXkgaW4gbztcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRLZXkob2JqLCBrZXlzLCB2YWx1ZSkge1xuICAgICAgICAgICAgbGV0IG8gPSBvYmo7XG4gICAgICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb25bJ2RvdC1ub3RhdGlvbiddKVxuICAgICAgICAgICAgICAgIGtleXMgPSBba2V5cy5qb2luKCcuJyldO1xuICAgICAgICAgICAga2V5cy5zbGljZSgwLCAtMSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAga2V5ID0gc2FuaXRpemVLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG8gPT09ICdvYmplY3QnICYmIG9ba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XS5wdXNoKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHt9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvID0gb1trZXldW29ba2V5XS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG8gPSBvW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzYW5pdGl6ZUtleShrZXlzW2tleXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlQXJyYXkgPSBjaGVja0FsbEFsaWFzZXMoa2V5cy5qb2luKCcuJyksIGZsYWdzLmFycmF5cyk7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBkdXBsaWNhdGUgPSBjb25maWd1cmF0aW9uWydkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5J107XG4gICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykpIHtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgoIWlzVW5kZWZpbmVkKG9ba2V5XSkgJiYgZmxhZ3MubmFyZ3Nba2V5XSA9PT0gMSkgfHwgKEFycmF5LmlzQXJyYXkob1trZXldKSAmJiBvW2tleV0ubGVuZ3RoID09PSBmbGFncy5uYXJnc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBpbmNyZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IGluY3JlbWVudChvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSAmJiBpc1R5cGVBcnJheSAmJiBpc1ZhbHVlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gY29uZmlndXJhdGlvblsnZmxhdHRlbi1kdXBsaWNhdGUtYXJyYXlzJ10gPyBvW2tleV0uY29uY2F0KHZhbHVlKSA6IChBcnJheS5pc0FycmF5KG9ba2V5XVswXSkgPyBvW2tleV0gOiBbb1trZXldXSkuY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZHVwbGljYXRlICYmIEJvb2xlYW4oaXNUeXBlQXJyYXkpID09PSBCb29sZWFuKGlzVmFsdWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSBvW2tleV0uY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9ba2V5XSA9PT0gdW5kZWZpbmVkICYmIGlzVHlwZUFycmF5KSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gaXNWYWx1ZUFycmF5ID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHVwbGljYXRlICYmICEob1trZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpIHx8XG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGV4dGVuZEFsaWFzZXMoLi4uYXJncykge1xuICAgICAgICAgICAgYXJncy5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhvYmogfHwge30pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MuYWxpYXNlc1trZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0gPSBbXS5jb25jYXQoYWxpYXNlc1trZXldIHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmNvbmNhdChrZXkpLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvLS8udGVzdCh4KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGNhbWVsQ2FzZSh4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPT0ga2V5ICYmIGZsYWdzLmFsaWFzZXNba2V5XS5pbmRleE9mKGMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0ucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWxpYXNlc1tjXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmNvbmNhdChrZXkpLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4Lmxlbmd0aCA+IDEgJiYgL1tBLVpdLy50ZXN0KHgpICYmIGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gZGVjYW1lbGl6ZSh4LCAnLScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICE9PSBrZXkgJiYgZmxhZ3MuYWxpYXNlc1trZXldLmluZGV4T2YoYykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBbGlhc2VzW2NdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0uZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1t4XSA9IFtrZXldLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0uZmlsdGVyKGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggIT09IHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZykge1xuICAgICAgICAgICAgY29uc3QgdG9DaGVjayA9IFtdLmNvbmNhdChmbGFncy5hbGlhc2VzW2tleV0gfHwgW10sIGtleSk7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmxhZyk7XG4gICAgICAgICAgICBjb25zdCBzZXRBbGlhcyA9IHRvQ2hlY2suZmluZChrZXkgPT4ga2V5cy5pbmNsdWRlcyhrZXkpKTtcbiAgICAgICAgICAgIHJldHVybiBzZXRBbGlhcyA/IGZsYWdbc2V0QWxpYXNdIDogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzQW55RmxhZyhrZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsYWdzS2V5cyA9IE9iamVjdC5rZXlzKGZsYWdzKTtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoZmxhZ3NLZXlzLm1hcChrID0+IGZsYWdzW2tdKSk7XG4gICAgICAgICAgICByZXR1cm4gdG9DaGVjay5zb21lKGZ1bmN0aW9uIChmbGFnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZmxhZykgPyBmbGFnLmluY2x1ZGVzKGtleSkgOiBmbGFnW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBoYXNGbGFnc01hdGNoaW5nKGFyZywgLi4ucGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoLi4ucGF0dGVybnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2suc29tZShmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gYXJnLm1hdGNoKHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaCAmJiBoYXNBbnlGbGFnKG1hdGNoWzFdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0FsbFNob3J0RmxhZ3MoYXJnKSB7XG4gICAgICAgICAgICBpZiAoYXJnLm1hdGNoKG5lZ2F0aXZlKSB8fCAhYXJnLm1hdGNoKC9eLVteLV0rLykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaGFzQWxsRmxhZ3MgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IG5leHQ7XG4gICAgICAgICAgICBjb25zdCBsZXR0ZXJzID0gYXJnLnNsaWNlKDEpLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmcuc2xpY2UoaiArIDIpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzQW55RmxhZyhsZXR0ZXJzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNBbGxGbGFncyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKChsZXR0ZXJzW2ogKyAxXSAmJiBsZXR0ZXJzW2ogKyAxXSA9PT0gJz0nKSB8fFxuICAgICAgICAgICAgICAgICAgICBuZXh0ID09PSAnLScgfHxcbiAgICAgICAgICAgICAgICAgICAgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJiAvXi0/XFxkKyhcXC5cXGQqKT8oZS0/XFxkKyk/JC8udGVzdChuZXh0KSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhc0FsbEZsYWdzO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVW5rbm93bk9wdGlvbkFzQXJnKGFyZykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25bJ3Vua25vd24tb3B0aW9ucy1hcy1hcmdzJ10gJiYgaXNVbmtub3duT3B0aW9uKGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaXNVbmtub3duT3B0aW9uKGFyZykge1xuICAgICAgICAgICAgYXJnID0gYXJnLnJlcGxhY2UoL14tezMsfS8sICctLScpO1xuICAgICAgICAgICAgaWYgKGFyZy5tYXRjaChuZWdhdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzQWxsU2hvcnRGbGFncyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmxhZ1dpdGhFcXVhbHMgPSAvXi0rKFtePV0rPyk9W1xcc1xcU10qJC87XG4gICAgICAgICAgICBjb25zdCBub3JtYWxGbGFnID0gL14tKyhbXj1dKz8pJC87XG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5IeXBoZW4gPSAvXi0rKFtePV0rPyktJC87XG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5EaWdpdHMgPSAvXi0rKFtePV0rP1xcZCspJC87XG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyA9IC9eLSsoW149XSs/KVxcVysuKiQvO1xuICAgICAgICAgICAgcmV0dXJuICFoYXNGbGFnc01hdGNoaW5nKGFyZywgZmxhZ1dpdGhFcXVhbHMsIG5lZ2F0ZWRCb29sZWFuLCBub3JtYWxGbGFnLCBmbGFnRW5kaW5nSW5IeXBoZW4sIGZsYWdFbmRpbmdJbkRpZ2l0cywgZmxhZ0VuZGluZ0luTm9uV29yZENoYXJhY3RlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRWYWx1ZShrZXkpIHtcbiAgICAgICAgICAgIGlmICghY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmXG4gICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykgJiZcbiAgICAgICAgICAgICAgICBgJHtrZXl9YCBpbiBkZWZhdWx0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRGb3JUeXBlKGd1ZXNzVHlwZShrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBkZWZhdWx0Rm9yVHlwZSh0eXBlKSB7XG4gICAgICAgICAgICBjb25zdCBkZWYgPSB7XG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU5dOiB0cnVlLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5TVFJJTkddOiAnJyxcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuTlVNQkVSXTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5BUlJBWV06IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGRlZlt0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBndWVzc1R5cGUoa2V5KSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU47XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Muc3RyaW5ncykpXG4gICAgICAgICAgICAgICAgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LlNUUklORztcbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm51bWJlcnMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5OVU1CRVI7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykpXG4gICAgICAgICAgICAgICAgdHlwZSA9IERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkJPT0xFQU47XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5BUlJBWTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKG51bSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bSA9PT0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrQ29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZmluZChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgY29uZmlndXJhdGlvbjogJXMsIG9wdHMuY291bnQgZXhjbHVkZXMgb3B0cy5hcnJheS4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb246ICVzLCBvcHRzLmNvdW50IGV4Y2x1ZGVzIG9wdHMubmFyZy4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGlhc2VzOiBPYmplY3QuYXNzaWduKHt9LCBmbGFncy5hbGlhc2VzKSxcbiAgICAgICAgICAgIGFyZ3Y6IE9iamVjdC5hc3NpZ24oYXJndlJldHVybiwgYXJndiksXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdGVkOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0ZWQpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgbmV3QWxpYXNlczogT2JqZWN0LmFzc2lnbih7fSwgbmV3QWxpYXNlcylcbiAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21iaW5lQWxpYXNlcyhhbGlhc2VzKSB7XG4gICAgY29uc3QgYWxpYXNBcnJheXMgPSBbXTtcbiAgICBjb25zdCBjb21iaW5lZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgbGV0IGNoYW5nZSA9IHRydWU7XG4gICAgT2JqZWN0LmtleXMoYWxpYXNlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGFsaWFzQXJyYXlzLnB1c2goW10uY29uY2F0KGFsaWFzZXNba2V5XSwga2V5KSk7XG4gICAgfSk7XG4gICAgd2hpbGUgKGNoYW5nZSkge1xuICAgICAgICBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaWkgPSBpICsgMTsgaWkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBhbGlhc0FycmF5c1tpXS5maWx0ZXIoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzQXJyYXlzW2lpXS5pbmRleE9mKHYpICE9PSAtMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5c1tpXSA9IGFsaWFzQXJyYXlzW2ldLmNvbmNhdChhbGlhc0FycmF5c1tpaV0pO1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5cy5zcGxpY2UoaWksIDEpO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWxpYXNBcnJheXMuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXNBcnJheSkge1xuICAgICAgICBhbGlhc0FycmF5ID0gYWxpYXNBcnJheS5maWx0ZXIoZnVuY3Rpb24gKHYsIGksIHNlbGYpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmluZGV4T2YodikgPT09IGk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBsYXN0QWxpYXMgPSBhbGlhc0FycmF5LnBvcCgpO1xuICAgICAgICBpZiAobGFzdEFsaWFzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGxhc3RBbGlhcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbWJpbmVkW2xhc3RBbGlhc10gPSBhbGlhc0FycmF5O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbWJpbmVkO1xufVxuZnVuY3Rpb24gaW5jcmVtZW50KG9yaWcpIHtcbiAgICByZXR1cm4gb3JpZyAhPT0gdW5kZWZpbmVkID8gb3JpZyArIDEgOiAxO1xufVxuZnVuY3Rpb24gc2FuaXRpemVLZXkoa2V5KSB7XG4gICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycpXG4gICAgICAgIHJldHVybiAnX19fcHJvdG9fX18nO1xuICAgIHJldHVybiBrZXk7XG59XG5mdW5jdGlvbiBzdHJpcFF1b3Rlcyh2YWwpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICh2YWxbMF0gPT09IFwiJ1wiIHx8IHZhbFswXSA9PT0gJ1wiJykgJiZcbiAgICAgICAgdmFsW3ZhbC5sZW5ndGggLSAxXSA9PT0gdmFsWzBdKVxuICAgICAgICA/IHZhbC5zdWJzdHJpbmcoMSwgdmFsLmxlbmd0aCAtIDEpXG4gICAgICAgIDogdmFsO1xufVxuXG52YXIgX2EsIF9iLCBfYztcbmNvbnN0IG1pbk5vZGVWZXJzaW9uID0gKHByb2Nlc3MgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuWUFSR1NfTUlOX05PREVfVkVSU0lPTilcbiAgICA/IE51bWJlcihwcm9jZXNzLmVudi5ZQVJHU19NSU5fTk9ERV9WRVJTSU9OKVxuICAgIDogMTI7XG5jb25zdCBub2RlVmVyc2lvbiA9IChfYiA9IChfYSA9IHByb2Nlc3MgPT09IG51bGwgfHwgcHJvY2VzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvY2Vzcy52ZXJzaW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5vZGUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IChfYyA9IHByb2Nlc3MgPT09IG51bGwgfHwgcHJvY2VzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJvY2Vzcy52ZXJzaW9uKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Muc2xpY2UoMSk7XG5pZiAobm9kZVZlcnNpb24pIHtcbiAgICBjb25zdCBtYWpvciA9IE51bWJlcihub2RlVmVyc2lvbi5tYXRjaCgvXihbXi5dKykvKVsxXSk7XG4gICAgaWYgKG1ham9yIDwgbWluTm9kZVZlcnNpb24pIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYHlhcmdzIHBhcnNlciBzdXBwb3J0cyBhIG1pbmltdW0gTm9kZS5qcyB2ZXJzaW9uIG9mICR7bWluTm9kZVZlcnNpb259LiBSZWFkIG91ciB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5OiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3MtcGFyc2VyI3N1cHBvcnRlZC1ub2RlanMtdmVyc2lvbnNgKTtcbiAgICB9XG59XG5jb25zdCBlbnYgPSBwcm9jZXNzID8gcHJvY2Vzcy5lbnYgOiB7fTtcbmNvbnN0IHBhcnNlciA9IG5ldyBZYXJnc1BhcnNlcih7XG4gICAgY3dkOiBwcm9jZXNzLmN3ZCxcbiAgICBlbnY6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGVudjtcbiAgICB9LFxuICAgIGZvcm1hdDogdXRpbC5mb3JtYXQsXG4gICAgbm9ybWFsaXplOiBwYXRoLm5vcm1hbGl6ZSxcbiAgICByZXNvbHZlOiBwYXRoLnJlc29sdmUsXG4gICAgcmVxdWlyZTogKHBhdGgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF0aC5tYXRjaCgvXFwuanNvbiQvKSkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgsICd1dGY4JykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ29ubHkgLmpzb24gY29uZmlnIGZpbGVzIGFyZSBzdXBwb3J0ZWQgaW4gRVNNJyk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbmNvbnN0IHlhcmdzUGFyc2VyID0gZnVuY3Rpb24gUGFyc2VyKGFyZ3MsIG9wdHMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIucGFyc2UoYXJncy5zbGljZSgpLCBvcHRzKTtcbiAgICByZXR1cm4gcmVzdWx0LmFyZ3Y7XG59O1xueWFyZ3NQYXJzZXIuZGV0YWlsZWQgPSBmdW5jdGlvbiAoYXJncywgb3B0cykge1xuICAgIHJldHVybiBwYXJzZXIucGFyc2UoYXJncy5zbGljZSgpLCBvcHRzKTtcbn07XG55YXJnc1BhcnNlci5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG55YXJnc1BhcnNlci5kZWNhbWVsaXplID0gZGVjYW1lbGl6ZTtcbnlhcmdzUGFyc2VyLmxvb2tzTGlrZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcjtcblxubW9kdWxlLmV4cG9ydHMgPSB5YXJnc1BhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO3ZhciB0PXJlcXVpcmUoXCJhc3NlcnRcIik7Y2xhc3MgZSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHR8fFwieWFyZ3MgZXJyb3JcIiksdGhpcy5uYW1lPVwiWUVycm9yXCIsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsZSl9fWxldCBzLGk9W107ZnVuY3Rpb24gbih0LG8sYSxoKXtzPWg7bGV0IGw9e307aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsXCJleHRlbmRzXCIpKXtpZihcInN0cmluZ1wiIT10eXBlb2YgdC5leHRlbmRzKXJldHVybiBsO2NvbnN0IHI9L1xcLmpzb258XFwuLipyYyQvLnRlc3QodC5leHRlbmRzKTtsZXQgaD1udWxsO2lmKHIpaD1mdW5jdGlvbih0LGUpe3JldHVybiBzLnBhdGgucmVzb2x2ZSh0LGUpfShvLHQuZXh0ZW5kcyk7ZWxzZSB0cnl7aD1yZXF1aXJlLnJlc29sdmUodC5leHRlbmRzKX1jYXRjaChlKXtyZXR1cm4gdH0hZnVuY3Rpb24odCl7aWYoaS5pbmRleE9mKHQpPi0xKXRocm93IG5ldyBlKGBDaXJjdWxhciBleHRlbmRlZCBjb25maWd1cmF0aW9uczogJyR7dH0nLmApfShoKSxpLnB1c2goaCksbD1yP0pTT04ucGFyc2Uocy5yZWFkRmlsZVN5bmMoaCxcInV0ZjhcIikpOnJlcXVpcmUodC5leHRlbmRzKSxkZWxldGUgdC5leHRlbmRzLGw9bihsLHMucGF0aC5kaXJuYW1lKGgpLGEscyl9cmV0dXJuIGk9W10sYT9yKGwsdCk6T2JqZWN0LmFzc2lnbih7fSxsLHQpfWZ1bmN0aW9uIHIodCxlKXtjb25zdCBzPXt9O2Z1bmN0aW9uIGkodCl7cmV0dXJuIHQmJlwib2JqZWN0XCI9PXR5cGVvZiB0JiYhQXJyYXkuaXNBcnJheSh0KX1PYmplY3QuYXNzaWduKHMsdCk7Zm9yKGNvbnN0IG4gb2YgT2JqZWN0LmtleXMoZSkpaShlW25dKSYmaShzW25dKT9zW25dPXIodFtuXSxlW25dKTpzW25dPWVbbl07cmV0dXJuIHN9ZnVuY3Rpb24gbyh0KXtjb25zdCBlPXQucmVwbGFjZSgvXFxzezIsfS9nLFwiIFwiKS5zcGxpdCgvXFxzKyg/IVteW10qXXxbXjxdKj4pLykscz0vXFwuKltcXF1bPD5dL2csaT1lLnNoaWZ0KCk7aWYoIWkpdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIGZvdW5kIGluOiAke3R9YCk7Y29uc3Qgbj17Y21kOmkucmVwbGFjZShzLFwiXCIpLGRlbWFuZGVkOltdLG9wdGlvbmFsOltdfTtyZXR1cm4gZS5mb3JFYWNoKCgodCxpKT0+e2xldCByPSExO3Q9dC5yZXBsYWNlKC9cXHMvZyxcIlwiKSwvXFwuK1tcXF0+XS8udGVzdCh0KSYmaT09PWUubGVuZ3RoLTEmJihyPSEwKSwvXlxcWy8udGVzdCh0KT9uLm9wdGlvbmFsLnB1c2goe2NtZDp0LnJlcGxhY2UocyxcIlwiKS5zcGxpdChcInxcIiksdmFyaWFkaWM6cn0pOm4uZGVtYW5kZWQucHVzaCh7Y21kOnQucmVwbGFjZShzLFwiXCIpLnNwbGl0KFwifFwiKSx2YXJpYWRpYzpyfSl9KSksbn1jb25zdCBhPVtcImZpcnN0XCIsXCJzZWNvbmRcIixcInRoaXJkXCIsXCJmb3VydGhcIixcImZpZnRoXCIsXCJzaXh0aFwiXTtmdW5jdGlvbiBoKHQscyxpKXt0cnl7bGV0IG49MDtjb25zdFtyLGEsaF09XCJvYmplY3RcIj09dHlwZW9mIHQ/W3tkZW1hbmRlZDpbXSxvcHRpb25hbDpbXX0sdCxzXTpbbyhgY21kICR7dH1gKSxzLGldLGY9W10uc2xpY2UuY2FsbChhKTtmb3IoO2YubGVuZ3RoJiZ2b2lkIDA9PT1mW2YubGVuZ3RoLTFdOylmLnBvcCgpO2NvbnN0IGQ9aHx8Zi5sZW5ndGg7aWYoZDxyLmRlbWFuZGVkLmxlbmd0aCl0aHJvdyBuZXcgZShgTm90IGVub3VnaCBhcmd1bWVudHMgcHJvdmlkZWQuIEV4cGVjdGVkICR7ci5kZW1hbmRlZC5sZW5ndGh9IGJ1dCByZWNlaXZlZCAke2YubGVuZ3RofS5gKTtjb25zdCB1PXIuZGVtYW5kZWQubGVuZ3RoK3Iub3B0aW9uYWwubGVuZ3RoO2lmKGQ+dSl0aHJvdyBuZXcgZShgVG9vIG1hbnkgYXJndW1lbnRzIHByb3ZpZGVkLiBFeHBlY3RlZCBtYXggJHt1fSBidXQgcmVjZWl2ZWQgJHtkfS5gKTtyLmRlbWFuZGVkLmZvckVhY2goKHQ9Pntjb25zdCBlPWwoZi5zaGlmdCgpKTswPT09dC5jbWQuZmlsdGVyKCh0PT50PT09ZXx8XCIqXCI9PT10KSkubGVuZ3RoJiZjKGUsdC5jbWQsbiksbis9MX0pKSxyLm9wdGlvbmFsLmZvckVhY2goKHQ9PntpZigwPT09Zi5sZW5ndGgpcmV0dXJuO2NvbnN0IGU9bChmLnNoaWZ0KCkpOzA9PT10LmNtZC5maWx0ZXIoKHQ9PnQ9PT1lfHxcIipcIj09PXQpKS5sZW5ndGgmJmMoZSx0LmNtZCxuKSxuKz0xfSkpfWNhdGNoKHQpe2NvbnNvbGUud2Fybih0LnN0YWNrKX19ZnVuY3Rpb24gbCh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT9cImFycmF5XCI6bnVsbD09PXQ/XCJudWxsXCI6dHlwZW9mIHR9ZnVuY3Rpb24gYyh0LHMsaSl7dGhyb3cgbmV3IGUoYEludmFsaWQgJHthW2ldfHxcIm1hbnlpdGhcIn0gYXJndW1lbnQuIEV4cGVjdGVkICR7cy5qb2luKFwiIG9yIFwiKX0gYnV0IHJlY2VpdmVkICR7dH0uYCl9ZnVuY3Rpb24gZih0KXtyZXR1cm4hIXQmJiEhdC50aGVuJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LnRoZW59ZnVuY3Rpb24gZCh0LGUscyxpKXtzLmFzc2VydC5ub3RTdHJpY3RFcXVhbCh0LGUsaSl9ZnVuY3Rpb24gdSh0LGUpe2UuYXNzZXJ0LnN0cmljdEVxdWFsKHR5cGVvZiB0LFwic3RyaW5nXCIpfWZ1bmN0aW9uIHAodCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpfWZ1bmN0aW9uIGcodD17fSxlPSgoKT0+ITApKXtjb25zdCBzPXt9O3JldHVybiBwKHQpLmZvckVhY2goKGk9PntlKGksdFtpXSkmJihzW2ldPXRbaV0pfSkpLHN9ZnVuY3Rpb24gbSgpe3JldHVybiBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uJiYhcHJvY2Vzcy5kZWZhdWx0QXBwPzA6MX1mdW5jdGlvbiB5KCl7cmV0dXJuIHByb2Nlc3MuYXJndlttKCldfXZhciBiPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGhpZGVCaW46ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2xpY2UobSgpKzEpfSxnZXRQcm9jZXNzQXJndkJpbjp5fSk7ZnVuY3Rpb24gdih0LGUscyxpKXtpZihcImFcIj09PXMmJiFpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZT90IT09ZXx8IWk6IWUuaGFzKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7cmV0dXJuXCJtXCI9PT1zP2k6XCJhXCI9PT1zP2kuY2FsbCh0KTppP2kudmFsdWU6ZS5nZXQodCl9ZnVuY3Rpb24gTyh0LGUscyxpLG4pe2lmKFwibVwiPT09aSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO2lmKFwiYVwiPT09aSYmIW4pdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBlP3QhPT1lfHwhbjohZS5oYXModCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO3JldHVyblwiYVwiPT09aT9uLmNhbGwodCxzKTpuP24udmFsdWU9czplLnNldCh0LHMpLHN9Y2xhc3Mgd3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmdsb2JhbE1pZGRsZXdhcmU9W10sdGhpcy5mcm96ZW5zPVtdLHRoaXMueWFyZ3M9dH1hZGRNaWRkbGV3YXJlKHQsZSxzPSEwLGk9ITEpe2lmKGgoXCI8YXJyYXl8ZnVuY3Rpb24+IFtib29sZWFuXSBbYm9vbGVhbl0gW2Jvb2xlYW5dXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSxBcnJheS5pc0FycmF5KHQpKXtmb3IobGV0IGk9MDtpPHQubGVuZ3RoO2krKyl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdFtpXSl0aHJvdyBFcnJvcihcIm1pZGRsZXdhcmUgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO2NvbnN0IG49dFtpXTtuLmFwcGx5QmVmb3JlVmFsaWRhdGlvbj1lLG4uZ2xvYmFsPXN9QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5nbG9iYWxNaWRkbGV3YXJlLHQpfWVsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdCl7Y29uc3Qgbj10O24uYXBwbHlCZWZvcmVWYWxpZGF0aW9uPWUsbi5nbG9iYWw9cyxuLm11dGF0ZXM9aSx0aGlzLmdsb2JhbE1pZGRsZXdhcmUucHVzaCh0KX1yZXR1cm4gdGhpcy55YXJnc31hZGRDb2VyY2VNaWRkbGV3YXJlKHQsZSl7Y29uc3Qgcz10aGlzLnlhcmdzLmdldEFsaWFzZXMoKTtyZXR1cm4gdGhpcy5nbG9iYWxNaWRkbGV3YXJlPXRoaXMuZ2xvYmFsTWlkZGxld2FyZS5maWx0ZXIoKHQ9Pntjb25zdCBpPVsuLi5zW2VdfHxbXSxlXTtyZXR1cm4hdC5vcHRpb258fCFpLmluY2x1ZGVzKHQub3B0aW9uKX0pKSx0Lm9wdGlvbj1lLHRoaXMuYWRkTWlkZGxld2FyZSh0LCEwLCEwLCEwKX1nZXRNaWRkbGV3YXJlKCl7cmV0dXJuIHRoaXMuZ2xvYmFsTWlkZGxld2FyZX1mcmVlemUoKXt0aGlzLmZyb3plbnMucHVzaChbLi4udGhpcy5nbG9iYWxNaWRkbGV3YXJlXSl9dW5mcmVlemUoKXtjb25zdCB0PXRoaXMuZnJvemVucy5wb3AoKTt2b2lkIDAhPT10JiYodGhpcy5nbG9iYWxNaWRkbGV3YXJlPXQpfXJlc2V0KCl7dGhpcy5nbG9iYWxNaWRkbGV3YXJlPXRoaXMuZ2xvYmFsTWlkZGxld2FyZS5maWx0ZXIoKHQ9PnQuZ2xvYmFsKSl9fWZ1bmN0aW9uIEModCxlLHMsaSl7cmV0dXJuIHMucmVkdWNlKCgodCxzKT0+e2lmKHMuYXBwbHlCZWZvcmVWYWxpZGF0aW9uIT09aSlyZXR1cm4gdDtpZihzLm11dGF0ZXMpe2lmKHMuYXBwbGllZClyZXR1cm4gdDtzLmFwcGxpZWQ9ITB9aWYoZih0KSlyZXR1cm4gdC50aGVuKCh0PT5Qcm9taXNlLmFsbChbdCxzKHQsZSldKSkpLnRoZW4oKChbdCxlXSk9Pk9iamVjdC5hc3NpZ24odCxlKSkpO3tjb25zdCBpPXModCxlKTtyZXR1cm4gZihpKT9pLnRoZW4oKGU9Pk9iamVjdC5hc3NpZ24odCxlKSkpOk9iamVjdC5hc3NpZ24odCxpKX19KSx0KX1mdW5jdGlvbiBqKHQsZSxzPSh0PT57dGhyb3cgdH0pKXt0cnl7Y29uc3Qgcz1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3QoKTp0O3JldHVybiBmKHMpP3MudGhlbigodD0+ZSh0KSkpOmUocyl9Y2F0Y2godCl7cmV0dXJuIHModCl9fWNvbnN0IE09LyheXFwqKXwoXlxcJDApLztjbGFzcyBfe2NvbnN0cnVjdG9yKHQsZSxzLGkpe3RoaXMucmVxdWlyZUNhY2hlPW5ldyBTZXQsdGhpcy5oYW5kbGVycz17fSx0aGlzLmFsaWFzTWFwPXt9LHRoaXMuZnJvemVucz1bXSx0aGlzLnNoaW09aSx0aGlzLnVzYWdlPXQsdGhpcy5nbG9iYWxNaWRkbGV3YXJlPXMsdGhpcy52YWxpZGF0aW9uPWV9YWRkRGlyZWN0b3J5KHQsZSxzLGkpe1wiYm9vbGVhblwiIT10eXBlb2YoaT1pfHx7fSkucmVjdXJzZSYmKGkucmVjdXJzZT0hMSksQXJyYXkuaXNBcnJheShpLmV4dGVuc2lvbnMpfHwoaS5leHRlbnNpb25zPVtcImpzXCJdKTtjb25zdCBuPVwiZnVuY3Rpb25cIj09dHlwZW9mIGkudmlzaXQ/aS52aXNpdDp0PT50O2kudmlzaXQ9KHQsZSxzKT0+e2NvbnN0IGk9bih0LGUscyk7aWYoaSl7aWYodGhpcy5yZXF1aXJlQ2FjaGUuaGFzKGUpKXJldHVybiBpO3RoaXMucmVxdWlyZUNhY2hlLmFkZChlKSx0aGlzLmFkZEhhbmRsZXIoaSl9cmV0dXJuIGl9LHRoaXMuc2hpbS5yZXF1aXJlRGlyZWN0b3J5KHtyZXF1aXJlOmUsZmlsZW5hbWU6c30sdCxpKX1hZGRIYW5kbGVyKHQsZSxzLGksbixyKXtsZXQgYT1bXTtjb25zdCBoPWZ1bmN0aW9uKHQpe3JldHVybiB0P3QubWFwKCh0PT4odC5hcHBseUJlZm9yZVZhbGlkYXRpb249ITEsdCkpKTpbXX0obik7aWYoaT1pfHwoKCk9Pnt9KSxBcnJheS5pc0FycmF5KHQpKWlmKGZ1bmN0aW9uKHQpe3JldHVybiB0LmV2ZXJ5KCh0PT5cInN0cmluZ1wiPT10eXBlb2YgdCkpfSh0KSlbdCwuLi5hXT10O2Vsc2UgZm9yKGNvbnN0IGUgb2YgdCl0aGlzLmFkZEhhbmRsZXIoZSk7ZWxzZXtpZihmdW5jdGlvbih0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdCYmIUFycmF5LmlzQXJyYXkodCl9KHQpKXtsZXQgZT1BcnJheS5pc0FycmF5KHQuY29tbWFuZCl8fFwic3RyaW5nXCI9PXR5cGVvZiB0LmNvbW1hbmQ/dC5jb21tYW5kOnRoaXMubW9kdWxlTmFtZSh0KTtyZXR1cm4gdC5hbGlhc2VzJiYoZT1bXS5jb25jYXQoZSkuY29uY2F0KHQuYWxpYXNlcykpLHZvaWQgdGhpcy5hZGRIYW5kbGVyKGUsdGhpcy5leHRyYWN0RGVzYyh0KSx0LmJ1aWxkZXIsdC5oYW5kbGVyLHQubWlkZGxld2FyZXMsdC5kZXByZWNhdGVkKX1pZihrKHMpKXJldHVybiB2b2lkIHRoaXMuYWRkSGFuZGxlcihbdF0uY29uY2F0KGEpLGUscy5idWlsZGVyLHMuaGFuZGxlcixzLm1pZGRsZXdhcmVzLHMuZGVwcmVjYXRlZCl9aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe2NvbnN0IG49byh0KTthPWEubWFwKCh0PT5vKHQpLmNtZCkpO2xldCBsPSExO2NvbnN0IGM9W24uY21kXS5jb25jYXQoYSkuZmlsdGVyKCh0PT4hTS50ZXN0KHQpfHwobD0hMCwhMSkpKTswPT09Yy5sZW5ndGgmJmwmJmMucHVzaChcIiQwXCIpLGwmJihuLmNtZD1jWzBdLGE9Yy5zbGljZSgxKSx0PXQucmVwbGFjZShNLG4uY21kKSksYS5mb3JFYWNoKCh0PT57dGhpcy5hbGlhc01hcFt0XT1uLmNtZH0pKSwhMSE9PWUmJnRoaXMudXNhZ2UuY29tbWFuZCh0LGUsbCxhLHIpLHRoaXMuaGFuZGxlcnNbbi5jbWRdPXtvcmlnaW5hbDp0LGRlc2NyaXB0aW9uOmUsaGFuZGxlcjppLGJ1aWxkZXI6c3x8e30sbWlkZGxld2FyZXM6aCxkZXByZWNhdGVkOnIsZGVtYW5kZWQ6bi5kZW1hbmRlZCxvcHRpb25hbDpuLm9wdGlvbmFsfSxsJiYodGhpcy5kZWZhdWx0Q29tbWFuZD10aGlzLmhhbmRsZXJzW24uY21kXSl9fWdldENvbW1hbmRIYW5kbGVycygpe3JldHVybiB0aGlzLmhhbmRsZXJzfWdldENvbW1hbmRzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaGFuZGxlcnMpLmNvbmNhdChPYmplY3Qua2V5cyh0aGlzLmFsaWFzTWFwKSl9aGFzRGVmYXVsdENvbW1hbmQoKXtyZXR1cm4hIXRoaXMuZGVmYXVsdENvbW1hbmR9cnVuQ29tbWFuZCh0LGUscyxpLG4scil7Y29uc3Qgbz10aGlzLmhhbmRsZXJzW3RdfHx0aGlzLmhhbmRsZXJzW3RoaXMuYWxpYXNNYXBbdF1dfHx0aGlzLmRlZmF1bHRDb21tYW5kLGE9ZS5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCksaD1hLmNvbW1hbmRzLnNsaWNlKCksbD0hdDt0JiYoYS5jb21tYW5kcy5wdXNoKHQpLGEuZnVsbENvbW1hbmRzLnB1c2goby5vcmlnaW5hbCkpO2NvbnN0IGM9dGhpcy5hcHBseUJ1aWxkZXJVcGRhdGVVc2FnZUFuZFBhcnNlKGwsbyxlLHMuYWxpYXNlcyxoLGksbixyKTtyZXR1cm4gZihjKT9jLnRoZW4oKHQ9PnRoaXMuYXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0KGwsbyx0LmlubmVyQXJndixhLG4sdC5hbGlhc2VzLGUpKSk6dGhpcy5hcHBseU1pZGRsZXdhcmVBbmRHZXRSZXN1bHQobCxvLGMuaW5uZXJBcmd2LGEsbixjLmFsaWFzZXMsZSl9YXBwbHlCdWlsZGVyVXBkYXRlVXNhZ2VBbmRQYXJzZSh0LGUscyxpLG4scixvLGEpe2NvbnN0IGg9ZS5idWlsZGVyO2xldCBsPXM7aWYoeChoKSl7cy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkuZnJlZXplKCk7Y29uc3QgYz1oKHMuZ2V0SW50ZXJuYWxNZXRob2RzKCkucmVzZXQoaSksYSk7aWYoZihjKSlyZXR1cm4gYy50aGVuKChpPT57dmFyIGE7cmV0dXJuIGw9KGE9aSkmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGEuZ2V0SW50ZXJuYWxNZXRob2RzP2k6cyx0aGlzLnBhcnNlQW5kVXBkYXRlVXNhZ2UodCxlLGwsbixyLG8pfSkpfWVsc2UoZnVuY3Rpb24odCl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIHR9KShoKSYmKHMuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmZyZWV6ZSgpLGw9cy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5yZXNldChpKSxPYmplY3Qua2V5cyhlLmJ1aWxkZXIpLmZvckVhY2goKHQ9PntsLm9wdGlvbih0LGhbdF0pfSkpKTtyZXR1cm4gdGhpcy5wYXJzZUFuZFVwZGF0ZVVzYWdlKHQsZSxsLG4scixvKX1wYXJzZUFuZFVwZGF0ZVVzYWdlKHQsZSxzLGksbixyKXt0JiZzLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS51bmZyZWV6ZSghMCksdGhpcy5zaG91bGRVcGRhdGVVc2FnZShzKSYmcy5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkudXNhZ2UodGhpcy51c2FnZUZyb21QYXJlbnRDb21tYW5kc0NvbW1hbmRIYW5kbGVyKGksZSksZS5kZXNjcmlwdGlvbik7Y29uc3Qgbz1zLmdldEludGVybmFsTWV0aG9kcygpLnJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzKG51bGwsdm9pZCAwLCEwLG4scik7cmV0dXJuIGYobyk/by50aGVuKCh0PT4oe2FsaWFzZXM6cy5wYXJzZWQuYWxpYXNlcyxpbm5lckFyZ3Y6dH0pKSk6e2FsaWFzZXM6cy5wYXJzZWQuYWxpYXNlcyxpbm5lckFyZ3Y6b319c2hvdWxkVXBkYXRlVXNhZ2UodCl7cmV0dXJuIXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmdldFVzYWdlRGlzYWJsZWQoKSYmMD09PXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0VXNhZ2VJbnN0YW5jZSgpLmdldFVzYWdlKCkubGVuZ3RofXVzYWdlRnJvbVBhcmVudENvbW1hbmRzQ29tbWFuZEhhbmRsZXIodCxlKXtjb25zdCBzPU0udGVzdChlLm9yaWdpbmFsKT9lLm9yaWdpbmFsLnJlcGxhY2UoTSxcIlwiKS50cmltKCk6ZS5vcmlnaW5hbCxpPXQuZmlsdGVyKCh0PT4hTS50ZXN0KHQpKSk7cmV0dXJuIGkucHVzaChzKSxgJDAgJHtpLmpvaW4oXCIgXCIpfWB9aGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdCh0LGUscyxpLG4scixvLGEpe2lmKCFyLmdldEludGVybmFsTWV0aG9kcygpLmdldEhhc091dHB1dCgpKXtjb25zdCBlPXIuZ2V0SW50ZXJuYWxNZXRob2RzKCkucnVuVmFsaWRhdGlvbihuLGEsci5wYXJzZWQuZXJyb3IsdCk7cz1qKHMsKHQ9PihlKHQpLHQpKSl9aWYoZS5oYW5kbGVyJiYhci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRIYXNPdXRwdXQoKSl7ci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5zZXRIYXNPdXRwdXQoKTtjb25zdCBpPSEhci5nZXRPcHRpb25zKCkuY29uZmlndXJhdGlvbltcInBvcHVsYXRlLS1cIl07ci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5wb3N0UHJvY2VzcyhzLGksITEsITEpLHM9aihzPUMocyxyLG8sITEpLCh0PT57Y29uc3Qgcz1lLmhhbmRsZXIodCk7cmV0dXJuIGYocyk/cy50aGVuKCgoKT0+dCkpOnR9KSksdHx8ci5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRVc2FnZUluc3RhbmNlKCkuY2FjaGVIZWxwTWVzc2FnZSgpLGYocykmJiFyLmdldEludGVybmFsTWV0aG9kcygpLmhhc1BhcnNlQ2FsbGJhY2soKSYmcy5jYXRjaCgodD0+e3RyeXtyLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5mYWlsKG51bGwsdCl9Y2F0Y2godCl7fX0pKX1yZXR1cm4gdHx8KGkuY29tbWFuZHMucG9wKCksaS5mdWxsQ29tbWFuZHMucG9wKCkpLHN9YXBwbHlNaWRkbGV3YXJlQW5kR2V0UmVzdWx0KHQsZSxzLGksbixyLG8pe2xldCBhPXt9O2lmKG4pcmV0dXJuIHM7by5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRIYXNPdXRwdXQoKXx8KGE9dGhpcy5wb3B1bGF0ZVBvc2l0aW9uYWxzKGUscyxpLG8pKTtjb25zdCBoPXRoaXMuZ2xvYmFsTWlkZGxld2FyZS5nZXRNaWRkbGV3YXJlKCkuc2xpY2UoMCkuY29uY2F0KGUubWlkZGxld2FyZXMpLGw9QyhzLG8saCwhMCk7cmV0dXJuIGYobCk/bC50aGVuKChzPT50aGlzLmhhbmRsZVZhbGlkYXRpb25BbmRHZXRSZXN1bHQodCxlLHMsaSxyLG8saCxhKSkpOnRoaXMuaGFuZGxlVmFsaWRhdGlvbkFuZEdldFJlc3VsdCh0LGUsbCxpLHIsbyxoLGEpfXBvcHVsYXRlUG9zaXRpb25hbHModCxlLHMsaSl7ZS5fPWUuXy5zbGljZShzLmNvbW1hbmRzLmxlbmd0aCk7Y29uc3Qgbj10LmRlbWFuZGVkLnNsaWNlKDApLHI9dC5vcHRpb25hbC5zbGljZSgwKSxvPXt9O2Zvcih0aGlzLnZhbGlkYXRpb24ucG9zaXRpb25hbENvdW50KG4ubGVuZ3RoLGUuXy5sZW5ndGgpO24ubGVuZ3RoOyl7Y29uc3QgdD1uLnNoaWZ0KCk7dGhpcy5wb3B1bGF0ZVBvc2l0aW9uYWwodCxlLG8pfWZvcig7ci5sZW5ndGg7KXtjb25zdCB0PXIuc2hpZnQoKTt0aGlzLnBvcHVsYXRlUG9zaXRpb25hbCh0LGUsbyl9cmV0dXJuIGUuXz1zLmNvbW1hbmRzLmNvbmNhdChlLl8ubWFwKCh0PT5cIlwiK3QpKSksdGhpcy5wb3N0UHJvY2Vzc1Bvc2l0aW9uYWxzKGUsbyx0aGlzLmNtZFRvUGFyc2VPcHRpb25zKHQub3JpZ2luYWwpLGkpLG99cG9wdWxhdGVQb3NpdGlvbmFsKHQsZSxzKXtjb25zdCBpPXQuY21kWzBdO3QudmFyaWFkaWM/c1tpXT1lLl8uc3BsaWNlKDApLm1hcChTdHJpbmcpOmUuXy5sZW5ndGgmJihzW2ldPVtTdHJpbmcoZS5fLnNoaWZ0KCkpXSl9Y21kVG9QYXJzZU9wdGlvbnModCl7Y29uc3QgZT17YXJyYXk6W10sZGVmYXVsdDp7fSxhbGlhczp7fSxkZW1hbmQ6e319LHM9byh0KTtyZXR1cm4gcy5kZW1hbmRlZC5mb3JFYWNoKCh0PT57Y29uc3RbcywuLi5pXT10LmNtZDt0LnZhcmlhZGljJiYoZS5hcnJheS5wdXNoKHMpLGUuZGVmYXVsdFtzXT1bXSksZS5hbGlhc1tzXT1pLGUuZGVtYW5kW3NdPSEwfSkpLHMub3B0aW9uYWwuZm9yRWFjaCgodD0+e2NvbnN0W3MsLi4uaV09dC5jbWQ7dC52YXJpYWRpYyYmKGUuYXJyYXkucHVzaChzKSxlLmRlZmF1bHRbc109W10pLGUuYWxpYXNbc109aX0pKSxlfXBvc3RQcm9jZXNzUG9zaXRpb25hbHModCxlLHMsaSl7Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LGkuZ2V0T3B0aW9ucygpKTtuLmRlZmF1bHQ9T2JqZWN0LmFzc2lnbihzLmRlZmF1bHQsbi5kZWZhdWx0KTtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhzLmFsaWFzKSluLmFsaWFzW3RdPShuLmFsaWFzW3RdfHxbXSkuY29uY2F0KHMuYWxpYXNbdF0pO24uYXJyYXk9bi5hcnJheS5jb25jYXQocy5hcnJheSksbi5jb25maWc9e307Y29uc3Qgcj1bXTtpZihPYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0PT57ZVt0XS5tYXAoKGU9PntuLmNvbmZpZ3VyYXRpb25bXCJ1bmtub3duLW9wdGlvbnMtYXMtYXJnc1wiXSYmKG4ua2V5W3RdPSEwKSxyLnB1c2goYC0tJHt0fWApLHIucHVzaChlKX0pKX0pKSwhci5sZW5ndGgpcmV0dXJuO2NvbnN0IG89T2JqZWN0LmFzc2lnbih7fSxuLmNvbmZpZ3VyYXRpb24se1wicG9wdWxhdGUtLVwiOiExfSksYT10aGlzLnNoaW0uUGFyc2VyLmRldGFpbGVkKHIsT2JqZWN0LmFzc2lnbih7fSxuLHtjb25maWd1cmF0aW9uOm99KSk7aWYoYS5lcnJvcilpLmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS5mYWlsKGEuZXJyb3IubWVzc2FnZSxhLmVycm9yKTtlbHNle2NvbnN0IHM9T2JqZWN0LmtleXMoZSk7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e3MucHVzaCguLi5hLmFsaWFzZXNbdF0pfSkpLE9iamVjdC5rZXlzKGEuYXJndikuZm9yRWFjaCgobj0+e3MuaW5jbHVkZXMobikmJihlW25dfHwoZVtuXT1hLmFyZ3Zbbl0pLCF0aGlzLmlzSW5Db25maWdzKGksbikmJiF0aGlzLmlzRGVmYXVsdGVkKGksbikmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYS5hcmd2LG4pJiYoQXJyYXkuaXNBcnJheSh0W25dKXx8QXJyYXkuaXNBcnJheShhLmFyZ3Zbbl0pKT90W25dPVtdLmNvbmNhdCh0W25dLGEuYXJndltuXSk6dFtuXT1hLmFyZ3Zbbl0pfSkpfX1pc0RlZmF1bHRlZCh0LGUpe2NvbnN0e2RlZmF1bHQ6c309dC5nZXRPcHRpb25zKCk7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLGUpfHxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyx0aGlzLnNoaW0uUGFyc2VyLmNhbWVsQ2FzZShlKSl9aXNJbkNvbmZpZ3ModCxlKXtjb25zdHtjb25maWdPYmplY3RzOnN9PXQuZ2V0T3B0aW9ucygpO3JldHVybiBzLnNvbWUoKHQ9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpKSl8fHMuc29tZSgodD0+T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsdGhpcy5zaGltLlBhcnNlci5jYW1lbENhc2UoZSkpKSl9cnVuRGVmYXVsdEJ1aWxkZXJPbih0KXtpZighdGhpcy5kZWZhdWx0Q29tbWFuZClyZXR1cm47aWYodGhpcy5zaG91bGRVcGRhdGVVc2FnZSh0KSl7Y29uc3QgZT1NLnRlc3QodGhpcy5kZWZhdWx0Q29tbWFuZC5vcmlnaW5hbCk/dGhpcy5kZWZhdWx0Q29tbWFuZC5vcmlnaW5hbDp0aGlzLmRlZmF1bHRDb21tYW5kLm9yaWdpbmFsLnJlcGxhY2UoL15bXltcXF08Pl0qLyxcIiQwIFwiKTt0LmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlSW5zdGFuY2UoKS51c2FnZShlLHRoaXMuZGVmYXVsdENvbW1hbmQuZGVzY3JpcHRpb24pfWNvbnN0IGU9dGhpcy5kZWZhdWx0Q29tbWFuZC5idWlsZGVyO2lmKHgoZSkpcmV0dXJuIGUodCwhMCk7ayhlKXx8T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgocz0+e3Qub3B0aW9uKHMsZVtzXSl9KSl9bW9kdWxlTmFtZSh0KXtjb25zdCBlPWZ1bmN0aW9uKHQpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiByZXF1aXJlKXJldHVybiBudWxsO2ZvcihsZXQgZSxzPTAsaT1PYmplY3Qua2V5cyhyZXF1aXJlLmNhY2hlKTtzPGkubGVuZ3RoO3MrKylpZihlPXJlcXVpcmUuY2FjaGVbaVtzXV0sZS5leHBvcnRzPT09dClyZXR1cm4gZTtyZXR1cm4gbnVsbH0odCk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIG5hbWUgZ2l2ZW4gZm9yIG1vZHVsZTogJHt0aGlzLnNoaW0uaW5zcGVjdCh0KX1gKTtyZXR1cm4gdGhpcy5jb21tYW5kRnJvbUZpbGVuYW1lKGUuZmlsZW5hbWUpfWNvbW1hbmRGcm9tRmlsZW5hbWUodCl7cmV0dXJuIHRoaXMuc2hpbS5wYXRoLmJhc2VuYW1lKHQsdGhpcy5zaGltLnBhdGguZXh0bmFtZSh0KSl9ZXh0cmFjdERlc2Moe2Rlc2NyaWJlOnQsZGVzY3JpcHRpb246ZSxkZXNjOnN9KXtmb3IoY29uc3QgaSBvZlt0LGUsc10pe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBpfHwhMT09PWkpcmV0dXJuIGk7ZChpLCEwLHRoaXMuc2hpbSl9cmV0dXJuITF9ZnJlZXplKCl7dGhpcy5mcm96ZW5zLnB1c2goe2hhbmRsZXJzOnRoaXMuaGFuZGxlcnMsYWxpYXNNYXA6dGhpcy5hbGlhc01hcCxkZWZhdWx0Q29tbWFuZDp0aGlzLmRlZmF1bHRDb21tYW5kfSl9dW5mcmVlemUoKXtjb25zdCB0PXRoaXMuZnJvemVucy5wb3AoKTtkKHQsdm9pZCAwLHRoaXMuc2hpbSksKHtoYW5kbGVyczp0aGlzLmhhbmRsZXJzLGFsaWFzTWFwOnRoaXMuYWxpYXNNYXAsZGVmYXVsdENvbW1hbmQ6dGhpcy5kZWZhdWx0Q29tbWFuZH09dCl9cmVzZXQoKXtyZXR1cm4gdGhpcy5oYW5kbGVycz17fSx0aGlzLmFsaWFzTWFwPXt9LHRoaXMuZGVmYXVsdENvbW1hbmQ9dm9pZCAwLHRoaXMucmVxdWlyZUNhY2hlPW5ldyBTZXQsdGhpc319ZnVuY3Rpb24gayh0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdCYmISF0LmJ1aWxkZXImJlwiZnVuY3Rpb25cIj09dHlwZW9mIHQuaGFuZGxlcn1mdW5jdGlvbiB4KHQpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHR9ZnVuY3Rpb24gRSh0KXtcInVuZGVmaW5lZFwiIT10eXBlb2YgcHJvY2VzcyYmW3Byb2Nlc3Muc3Rkb3V0LHByb2Nlc3Muc3RkZXJyXS5mb3JFYWNoKChlPT57Y29uc3Qgcz1lO3MuX2hhbmRsZSYmcy5pc1RUWSYmXCJmdW5jdGlvblwiPT10eXBlb2Ygcy5faGFuZGxlLnNldEJsb2NraW5nJiZzLl9oYW5kbGUuc2V0QmxvY2tpbmcodCl9KSl9ZnVuY3Rpb24gQSh0KXtyZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIHR9ZnVuY3Rpb24gUCh0LHMpe2NvbnN0IGk9cy55MThuLl9fLG49e30scj1bXTtuLmZhaWxGbj1mdW5jdGlvbih0KXtyLnB1c2godCl9O2xldCBvPW51bGwsYT1udWxsLGg9ITA7bi5zaG93SGVscE9uRmFpbD1mdW5jdGlvbihlPSEwLHMpe2NvbnN0W2kscl09XCJzdHJpbmdcIj09dHlwZW9mIGU/WyEwLGVdOltlLHNdO3JldHVybiB0LmdldEludGVybmFsTWV0aG9kcygpLmlzR2xvYmFsQ29udGV4dCgpJiYoYT1yKSxvPXIsaD1pLG59O2xldCBsPSExO24uZmFpbD1mdW5jdGlvbihzLGkpe2NvbnN0IGM9dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRMb2dnZXJJbnN0YW5jZSgpO2lmKCFyLmxlbmd0aCl7aWYodC5nZXRFeGl0UHJvY2VzcygpJiZFKCEwKSwhbCl7bD0hMCxoJiYodC5zaG93SGVscChcImVycm9yXCIpLGMuZXJyb3IoKSksKHN8fGkpJiZjLmVycm9yKHN8fGkpO2NvbnN0IGU9b3x8YTtlJiYoKHN8fGkpJiZjLmVycm9yKFwiXCIpLGMuZXJyb3IoZSkpfWlmKGk9aXx8bmV3IGUocyksdC5nZXRFeGl0UHJvY2VzcygpKXJldHVybiB0LmV4aXQoMSk7aWYodC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5oYXNQYXJzZUNhbGxiYWNrKCkpcmV0dXJuIHQuZXhpdCgxLGkpO3Rocm93IGl9Zm9yKGxldCB0PXIubGVuZ3RoLTE7dD49MDstLXQpe2NvbnN0IGU9clt0XTtpZihBKGUpKXtpZihpKXRocm93IGk7aWYocyl0aHJvdyBFcnJvcihzKX1lbHNlIGUocyxpLG4pfX07bGV0IGM9W10sZj0hMTtuLnVzYWdlPSh0LGUpPT5udWxsPT09dD8oZj0hMCxjPVtdLG4pOihmPSExLGMucHVzaChbdCxlfHxcIlwiXSksbiksbi5nZXRVc2FnZT0oKT0+YyxuLmdldFVzYWdlRGlzYWJsZWQ9KCk9PmYsbi5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lPSgpPT5pKFwiUG9zaXRpb25hbHM6XCIpO2xldCBkPVtdO24uZXhhbXBsZT0odCxlKT0+e2QucHVzaChbdCxlfHxcIlwiXSl9O2xldCB1PVtdO24uY29tbWFuZD1mdW5jdGlvbih0LGUscyxpLG49ITEpe3MmJih1PXUubWFwKCh0PT4odFsyXT0hMSx0KSkpKSx1LnB1c2goW3QsZXx8XCJcIixzLGksbl0pfSxuLmdldENvbW1hbmRzPSgpPT51O2xldCBwPXt9O24uZGVzY3JpYmU9ZnVuY3Rpb24odCxlKXtBcnJheS5pc0FycmF5KHQpP3QuZm9yRWFjaCgodD0+e24uZGVzY3JpYmUodCxlKX0pKTpcIm9iamVjdFwiPT10eXBlb2YgdD9PYmplY3Qua2V5cyh0KS5mb3JFYWNoKChlPT57bi5kZXNjcmliZShlLHRbZV0pfSkpOnBbdF09ZX0sbi5nZXREZXNjcmlwdGlvbnM9KCk9PnA7bGV0IG09W107bi5lcGlsb2c9dD0+e20ucHVzaCh0KX07bGV0IHksYj0hMTtuLndyYXA9dD0+e2I9ITAseT10fSxuLmdldFdyYXA9KCk9PnMuZ2V0RW52KFwiWUFSR1NfRElTQUJMRV9XUkFQXCIpP251bGw6KGJ8fCh5PWZ1bmN0aW9uKCl7Y29uc3QgdD04MDtyZXR1cm4gcy5wcm9jZXNzLnN0ZENvbHVtbnM/TWF0aC5taW4odCxzLnByb2Nlc3Muc3RkQ29sdW1ucyk6dH0oKSxiPSEwKSx5KTtjb25zdCB2PVwiX195YXJnc1N0cmluZ19fOlwiO2Z1bmN0aW9uIE8odCxlLGkpe2xldCBuPTA7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl8fCh0PU9iamVjdC52YWx1ZXModCkubWFwKCh0PT5bdF0pKSksdC5mb3JFYWNoKCh0PT57bj1NYXRoLm1heChzLnN0cmluZ1dpZHRoKGk/YCR7aX0gJHtJKHRbMF0pfWA6SSh0WzBdKSkrJCh0WzBdKSxuKX0pKSxlJiYobj1NYXRoLm1pbihuLHBhcnNlSW50KCguNSplKS50b1N0cmluZygpLDEwKSkpLG59bGV0IHc7ZnVuY3Rpb24gQyhlKXtyZXR1cm4gdC5nZXRPcHRpb25zKCkuaGlkZGVuT3B0aW9ucy5pbmRleE9mKGUpPDB8fHQucGFyc2VkLmFyZ3ZbdC5nZXRPcHRpb25zKCkuc2hvd0hpZGRlbk9wdF19ZnVuY3Rpb24gaih0LGUpe2xldCBzPWBbJHtpKFwiZGVmYXVsdDpcIil9IGA7aWYodm9pZCAwPT09dCYmIWUpcmV0dXJuIG51bGw7aWYoZSlzKz1lO2Vsc2Ugc3dpdGNoKHR5cGVvZiB0KXtjYXNlXCJzdHJpbmdcIjpzKz1gXCIke3R9XCJgO2JyZWFrO2Nhc2VcIm9iamVjdFwiOnMrPUpTT04uc3RyaW5naWZ5KHQpO2JyZWFrO2RlZmF1bHQ6cys9dH1yZXR1cm5gJHtzfV1gfW4uZGVmZXJZMThuTG9va3VwPXQ9PnYrdCxuLmhlbHA9ZnVuY3Rpb24oKXtpZih3KXJldHVybiB3OyFmdW5jdGlvbigpe2NvbnN0IGU9dC5nZXREZW1hbmRlZE9wdGlvbnMoKSxzPXQuZ2V0T3B0aW9ucygpOyhPYmplY3Qua2V5cyhzLmFsaWFzKXx8W10pLmZvckVhY2goKGk9PntzLmFsaWFzW2ldLmZvckVhY2goKHI9PntwW3JdJiZuLmRlc2NyaWJlKGkscFtyXSksciBpbiBlJiZ0LmRlbWFuZE9wdGlvbihpLGVbcl0pLHMuYm9vbGVhbi5pbmNsdWRlcyhyKSYmdC5ib29sZWFuKGkpLHMuY291bnQuaW5jbHVkZXMocikmJnQuY291bnQoaSkscy5zdHJpbmcuaW5jbHVkZXMocikmJnQuc3RyaW5nKGkpLHMubm9ybWFsaXplLmluY2x1ZGVzKHIpJiZ0Lm5vcm1hbGl6ZShpKSxzLmFycmF5LmluY2x1ZGVzKHIpJiZ0LmFycmF5KGkpLHMubnVtYmVyLmluY2x1ZGVzKHIpJiZ0Lm51bWJlcihpKX0pKX0pKX0oKTtjb25zdCBlPXQuY3VzdG9tU2NyaXB0TmFtZT90LiQwOnMucGF0aC5iYXNlbmFtZSh0LiQwKSxyPXQuZ2V0RGVtYW5kZWRPcHRpb25zKCksbz10LmdldERlbWFuZGVkQ29tbWFuZHMoKSxhPXQuZ2V0RGVwcmVjYXRlZE9wdGlvbnMoKSxoPXQuZ2V0R3JvdXBzKCksbD10LmdldE9wdGlvbnMoKTtsZXQgZz1bXTtnPWcuY29uY2F0KE9iamVjdC5rZXlzKHApKSxnPWcuY29uY2F0KE9iamVjdC5rZXlzKHIpKSxnPWcuY29uY2F0KE9iamVjdC5rZXlzKG8pKSxnPWcuY29uY2F0KE9iamVjdC5rZXlzKGwuZGVmYXVsdCkpLGc9Zy5maWx0ZXIoQyksZz1PYmplY3Qua2V5cyhnLnJlZHVjZSgoKHQsZSk9PihcIl9cIiE9PWUmJih0W2VdPSEwKSx0KSkse30pKTtjb25zdCB5PW4uZ2V0V3JhcCgpLGI9cy5jbGl1aSh7d2lkdGg6eSx3cmFwOiEheX0pO2lmKCFmKWlmKGMubGVuZ3RoKWMuZm9yRWFjaCgodD0+e2IuZGl2KHt0ZXh0OmAke3RbMF0ucmVwbGFjZSgvXFwkMC9nLGUpfWB9KSx0WzFdJiZiLmRpdih7dGV4dDpgJHt0WzFdfWAscGFkZGluZzpbMSwwLDAsMF19KX0pKSxiLmRpdigpO2Vsc2UgaWYodS5sZW5ndGgpe2xldCB0PW51bGw7dD1vLl8/YCR7ZX0gPCR7aShcImNvbW1hbmRcIil9PlxcbmA6YCR7ZX0gWyR7aShcImNvbW1hbmRcIil9XVxcbmAsYi5kaXYoYCR7dH1gKX1pZih1Lmxlbmd0aD4xfHwxPT09dS5sZW5ndGgmJiF1WzBdWzJdKXtiLmRpdihpKFwiQ29tbWFuZHM6XCIpKTtjb25zdCBzPXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLG49cy5jb21tYW5kcy5sZW5ndGg/YCR7cy5jb21tYW5kcy5qb2luKFwiIFwiKX0gYDpcIlwiOyEwPT09dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRQYXJzZXJDb25maWd1cmF0aW9uKClbXCJzb3J0LWNvbW1hbmRzXCJdJiYodT11LnNvcnQoKCh0LGUpPT50WzBdLmxvY2FsZUNvbXBhcmUoZVswXSkpKSk7Y29uc3Qgcj1lP2Ake2V9IGA6XCJcIjt1LmZvckVhY2goKHQ9Pntjb25zdCBzPWAke3J9JHtufSR7dFswXS5yZXBsYWNlKC9eXFwkMCA/LyxcIlwiKX1gO2Iuc3Bhbih7dGV4dDpzLHBhZGRpbmc6WzAsMiwwLDJdLHdpZHRoOk8odSx5LGAke2V9JHtufWApKzR9LHt0ZXh0OnRbMV19KTtjb25zdCBvPVtdO3RbMl0mJm8ucHVzaChgWyR7aShcImRlZmF1bHRcIil9XWApLHRbM10mJnRbM10ubGVuZ3RoJiZvLnB1c2goYFske2koXCJhbGlhc2VzOlwiKX0gJHt0WzNdLmpvaW4oXCIsIFwiKX1dYCksdFs0XSYmKFwic3RyaW5nXCI9PXR5cGVvZiB0WzRdP28ucHVzaChgWyR7aShcImRlcHJlY2F0ZWQ6ICVzXCIsdFs0XSl9XWApOm8ucHVzaChgWyR7aShcImRlcHJlY2F0ZWRcIil9XWApKSxvLmxlbmd0aD9iLmRpdih7dGV4dDpvLmpvaW4oXCIgXCIpLHBhZGRpbmc6WzAsMCwwLDJdLGFsaWduOlwicmlnaHRcIn0pOmIuZGl2KCl9KSksYi5kaXYoKX1jb25zdCBNPShPYmplY3Qua2V5cyhsLmFsaWFzKXx8W10pLmNvbmNhdChPYmplY3Qua2V5cyh0LnBhcnNlZC5uZXdBbGlhc2VzKXx8W10pO2c9Zy5maWx0ZXIoKGU9PiF0LnBhcnNlZC5uZXdBbGlhc2VzW2VdJiZNLmV2ZXJ5KCh0PT4tMT09PShsLmFsaWFzW3RdfHxbXSkuaW5kZXhPZihlKSkpKSk7Y29uc3QgXz1pKFwiT3B0aW9uczpcIik7aFtfXXx8KGhbX109W10pLGZ1bmN0aW9uKHQsZSxzLGkpe2xldCBuPVtdLHI9bnVsbDtPYmplY3Qua2V5cyhzKS5mb3JFYWNoKCh0PT57bj1uLmNvbmNhdChzW3RdKX0pKSx0LmZvckVhY2goKHQ9PntyPVt0XS5jb25jYXQoZVt0XSksci5zb21lKCh0PT4tMSE9PW4uaW5kZXhPZih0KSkpfHxzW2ldLnB1c2godCl9KSl9KGcsbC5hbGlhcyxoLF8pO2NvbnN0IGs9dD0+L14tLS8udGVzdChJKHQpKSx4PU9iamVjdC5rZXlzKGgpLmZpbHRlcigodD0+aFt0XS5sZW5ndGg+MCkpLm1hcCgodD0+KHtncm91cE5hbWU6dCxub3JtYWxpemVkS2V5czpoW3RdLmZpbHRlcihDKS5tYXAoKHQ9PntpZihNLmluY2x1ZGVzKHQpKXJldHVybiB0O2ZvcihsZXQgZSxzPTA7dm9pZCAwIT09KGU9TVtzXSk7cysrKWlmKChsLmFsaWFzW2VdfHxbXSkuaW5jbHVkZXModCkpcmV0dXJuIGU7cmV0dXJuIHR9KSl9KSkpLmZpbHRlcigoKHtub3JtYWxpemVkS2V5czp0fSk9PnQubGVuZ3RoPjApKS5tYXAoKCh7Z3JvdXBOYW1lOnQsbm9ybWFsaXplZEtleXM6ZX0pPT57Y29uc3Qgcz1lLnJlZHVjZSgoKGUscyk9PihlW3NdPVtzXS5jb25jYXQobC5hbGlhc1tzXXx8W10pLm1hcCgoZT0+dD09PW4uZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpP2U6KC9eWzAtOV0kLy50ZXN0KGUpP2wuYm9vbGVhbi5pbmNsdWRlcyhzKT9cIi1cIjpcIi0tXCI6ZS5sZW5ndGg+MT9cIi0tXCI6XCItXCIpK2UpKS5zb3J0KCgodCxlKT0+ayh0KT09PWsoZSk/MDprKHQpPzE6LTEpKS5qb2luKFwiLCBcIiksZSkpLHt9KTtyZXR1cm57Z3JvdXBOYW1lOnQsbm9ybWFsaXplZEtleXM6ZSxzd2l0Y2hlczpzfX0pKTtpZih4LmZpbHRlcigoKHtncm91cE5hbWU6dH0pPT50IT09bi5nZXRQb3NpdGlvbmFsR3JvdXBOYW1lKCkpKS5zb21lKCgoe25vcm1hbGl6ZWRLZXlzOnQsc3dpdGNoZXM6ZX0pPT4hdC5ldmVyeSgodD0+ayhlW3RdKSkpKSkmJnguZmlsdGVyKCgoe2dyb3VwTmFtZTp0fSk9PnQhPT1uLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKSkpLmZvckVhY2goKCh7bm9ybWFsaXplZEtleXM6dCxzd2l0Y2hlczplfSk9Pnt0LmZvckVhY2goKHQ9Pnt2YXIgcyxpO2soZVt0XSkmJihlW3RdPShzPWVbdF0saT00LFMocyk/e3RleHQ6cy50ZXh0LGluZGVudGF0aW9uOnMuaW5kZW50YXRpb24raX06e3RleHQ6cyxpbmRlbnRhdGlvbjppfSkpfSkpfSkpLHguZm9yRWFjaCgoKHtncm91cE5hbWU6ZSxub3JtYWxpemVkS2V5czpzLHN3aXRjaGVzOm99KT0+e2IuZGl2KGUpLHMuZm9yRWFjaCgoZT0+e2NvbnN0IHM9b1tlXTtsZXQgaD1wW2VdfHxcIlwiLGM9bnVsbDtoLmluY2x1ZGVzKHYpJiYoaD1pKGguc3Vic3RyaW5nKDE2KSkpLGwuYm9vbGVhbi5pbmNsdWRlcyhlKSYmKGM9YFske2koXCJib29sZWFuXCIpfV1gKSxsLmNvdW50LmluY2x1ZGVzKGUpJiYoYz1gWyR7aShcImNvdW50XCIpfV1gKSxsLnN0cmluZy5pbmNsdWRlcyhlKSYmKGM9YFske2koXCJzdHJpbmdcIil9XWApLGwubm9ybWFsaXplLmluY2x1ZGVzKGUpJiYoYz1gWyR7aShcInN0cmluZ1wiKX1dYCksbC5hcnJheS5pbmNsdWRlcyhlKSYmKGM9YFske2koXCJhcnJheVwiKX1dYCksbC5udW1iZXIuaW5jbHVkZXMoZSkmJihjPWBbJHtpKFwibnVtYmVyXCIpfV1gKTtjb25zdCBmPVtlIGluIGE/KGQ9YVtlXSxcInN0cmluZ1wiPT10eXBlb2YgZD9gWyR7aShcImRlcHJlY2F0ZWQ6ICVzXCIsZCl9XWA6YFske2koXCJkZXByZWNhdGVkXCIpfV1gKTpudWxsLGMsZSBpbiByP2BbJHtpKFwicmVxdWlyZWRcIil9XWA6bnVsbCxsLmNob2ljZXMmJmwuY2hvaWNlc1tlXT9gWyR7aShcImNob2ljZXM6XCIpfSAke24uc3RyaW5naWZpZWRWYWx1ZXMobC5jaG9pY2VzW2VdKX1dYDpudWxsLGoobC5kZWZhdWx0W2VdLGwuZGVmYXVsdERlc2NyaXB0aW9uW2VdKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCIgXCIpO3ZhciBkO2Iuc3Bhbih7dGV4dDpJKHMpLHBhZGRpbmc6WzAsMiwwLDIrJChzKV0sd2lkdGg6TyhvLHkpKzR9LGgpO2NvbnN0IHU9ITA9PT10LmdldEludGVybmFsTWV0aG9kcygpLmdldFVzYWdlQ29uZmlndXJhdGlvbigpW1wiaGlkZS10eXBlc1wiXTtmJiYhdT9iLmRpdih7dGV4dDpmLHBhZGRpbmc6WzAsMCwwLDJdLGFsaWduOlwicmlnaHRcIn0pOmIuZGl2KCl9KSksYi5kaXYoKX0pKSxkLmxlbmd0aCYmKGIuZGl2KGkoXCJFeGFtcGxlczpcIikpLGQuZm9yRWFjaCgodD0+e3RbMF09dFswXS5yZXBsYWNlKC9cXCQwL2csZSl9KSksZC5mb3JFYWNoKCh0PT57XCJcIj09PXRbMV0/Yi5kaXYoe3RleHQ6dFswXSxwYWRkaW5nOlswLDIsMCwyXX0pOmIuZGl2KHt0ZXh0OnRbMF0scGFkZGluZzpbMCwyLDAsMl0sd2lkdGg6TyhkLHkpKzR9LHt0ZXh0OnRbMV19KX0pKSxiLmRpdigpKSxtLmxlbmd0aD4wKXtjb25zdCB0PW0ubWFwKCh0PT50LnJlcGxhY2UoL1xcJDAvZyxlKSkpLmpvaW4oXCJcXG5cIik7Yi5kaXYoYCR7dH1cXG5gKX1yZXR1cm4gYi50b1N0cmluZygpLnJlcGxhY2UoL1xccyokLyxcIlwiKX0sbi5jYWNoZUhlbHBNZXNzYWdlPWZ1bmN0aW9uKCl7dz10aGlzLmhlbHAoKX0sbi5jbGVhckNhY2hlZEhlbHBNZXNzYWdlPWZ1bmN0aW9uKCl7dz12b2lkIDB9LG4uaGFzQ2FjaGVkSGVscE1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4hIXd9LG4uc2hvd0hlbHA9ZT0+e2NvbnN0IHM9dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRMb2dnZXJJbnN0YW5jZSgpO2V8fChlPVwiZXJyb3JcIik7KFwiZnVuY3Rpb25cIj09dHlwZW9mIGU/ZTpzW2VdKShuLmhlbHAoKSl9LG4uZnVuY3Rpb25EZXNjcmlwdGlvbj10PT5bXCIoXCIsdC5uYW1lP3MuUGFyc2VyLmRlY2FtZWxpemUodC5uYW1lLFwiLVwiKTppKFwiZ2VuZXJhdGVkLXZhbHVlXCIpLFwiKVwiXS5qb2luKFwiXCIpLG4uc3RyaW5naWZpZWRWYWx1ZXM9ZnVuY3Rpb24odCxlKXtsZXQgcz1cIlwiO2NvbnN0IGk9ZXx8XCIsIFwiLG49W10uY29uY2F0KHQpO3JldHVybiB0JiZuLmxlbmd0aD8obi5mb3JFYWNoKCh0PT57cy5sZW5ndGgmJihzKz1pKSxzKz1KU09OLnN0cmluZ2lmeSh0KX0pKSxzKTpzfTtsZXQgTT1udWxsO24udmVyc2lvbj10PT57TT10fSxuLnNob3dWZXJzaW9uPWU9Pntjb25zdCBzPXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0TG9nZ2VySW5zdGFuY2UoKTtlfHwoZT1cImVycm9yXCIpOyhcImZ1bmN0aW9uXCI9PXR5cGVvZiBlP2U6c1tlXSkoTSl9LG4ucmVzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIG89bnVsbCxsPSExLGM9W10sZj0hMSxtPVtdLGQ9W10sdT1bXSxwPWcocCwoZT0+IXRbZV0pKSxufTtjb25zdCBfPVtdO3JldHVybiBuLmZyZWV6ZT1mdW5jdGlvbigpe18ucHVzaCh7ZmFpbE1lc3NhZ2U6byxmYWlsdXJlT3V0cHV0OmwsdXNhZ2VzOmMsdXNhZ2VEaXNhYmxlZDpmLGVwaWxvZ3M6bSxleGFtcGxlczpkLGNvbW1hbmRzOnUsZGVzY3JpcHRpb25zOnB9KX0sbi51bmZyZWV6ZT1mdW5jdGlvbih0PSExKXtjb25zdCBlPV8ucG9wKCk7ZSYmKHQ/KHA9ey4uLmUuZGVzY3JpcHRpb25zLC4uLnB9LHU9Wy4uLmUuY29tbWFuZHMsLi4udV0sYz1bLi4uZS51c2FnZXMsLi4uY10sZD1bLi4uZS5leGFtcGxlcywuLi5kXSxtPVsuLi5lLmVwaWxvZ3MsLi4ubV0pOih7ZmFpbE1lc3NhZ2U6byxmYWlsdXJlT3V0cHV0OmwsdXNhZ2VzOmMsdXNhZ2VEaXNhYmxlZDpmLGVwaWxvZ3M6bSxleGFtcGxlczpkLGNvbW1hbmRzOnUsZGVzY3JpcHRpb25zOnB9PWUpKX0sbn1mdW5jdGlvbiBTKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0fWZ1bmN0aW9uICQodCl7cmV0dXJuIFModCk/dC5pbmRlbnRhdGlvbjowfWZ1bmN0aW9uIEkodCl7cmV0dXJuIFModCk/dC50ZXh0OnR9Y2xhc3MgRHtjb25zdHJ1Y3Rvcih0LGUscyxpKXt2YXIgbixyLG87dGhpcy55YXJncz10LHRoaXMudXNhZ2U9ZSx0aGlzLmNvbW1hbmQ9cyx0aGlzLnNoaW09aSx0aGlzLmNvbXBsZXRpb25LZXk9XCJnZXQteWFyZ3MtY29tcGxldGlvbnNcIix0aGlzLmFsaWFzZXM9bnVsbCx0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbj1udWxsLHRoaXMuaW5kZXhBZnRlckxhc3RSZXNldD0wLHRoaXMuenNoU2hlbGw9bnVsbCE9PShvPShudWxsPT09KG49dGhpcy5zaGltLmdldEVudihcIlNIRUxMXCIpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5pbmNsdWRlcyhcInpzaFwiKSl8fChudWxsPT09KHI9dGhpcy5zaGltLmdldEVudihcIlpTSF9OQU1FXCIpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5pbmNsdWRlcyhcInpzaFwiKSkpJiZ2b2lkIDAhPT1vJiZvfWRlZmF1bHRDb21wbGV0aW9uKHQsZSxzLGkpe2NvbnN0IG49dGhpcy5jb21tYW5kLmdldENvbW1hbmRIYW5kbGVycygpO2ZvcihsZXQgZT0wLHM9dC5sZW5ndGg7ZTxzOysrZSlpZihuW3RbZV1dJiZuW3RbZV1dLmJ1aWxkZXIpe2NvbnN0IHM9blt0W2VdXS5idWlsZGVyO2lmKHgocykpe3RoaXMuaW5kZXhBZnRlckxhc3RSZXNldD1lKzE7Y29uc3QgdD10aGlzLnlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLnJlc2V0KCk7cmV0dXJuIHModCwhMCksdC5hcmd2fX1jb25zdCByPVtdO3RoaXMuY29tbWFuZENvbXBsZXRpb25zKHIsdCxzKSx0aGlzLm9wdGlvbkNvbXBsZXRpb25zKHIsdCxlLHMpLHRoaXMuY2hvaWNlc0Zyb21PcHRpb25zQ29tcGxldGlvbnMocix0LGUscyksdGhpcy5jaG9pY2VzRnJvbVBvc2l0aW9uYWxzQ29tcGxldGlvbnMocix0LGUscyksaShudWxsLHIpfWNvbW1hbmRDb21wbGV0aW9ucyh0LGUscyl7Y29uc3QgaT10aGlzLnlhcmdzLmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKS5jb21tYW5kcztzLm1hdGNoKC9eLS8pfHxpW2kubGVuZ3RoLTFdPT09c3x8dGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoZSl8fHRoaXMudXNhZ2UuZ2V0Q29tbWFuZHMoKS5mb3JFYWNoKChzPT57Y29uc3QgaT1vKHNbMF0pLmNtZDtpZigtMT09PWUuaW5kZXhPZihpKSlpZih0aGlzLnpzaFNoZWxsKXtjb25zdCBlPXNbMV18fFwiXCI7dC5wdXNoKGkucmVwbGFjZSgvOi9nLFwiXFxcXDpcIikrXCI6XCIrZSl9ZWxzZSB0LnB1c2goaSl9KSl9b3B0aW9uQ29tcGxldGlvbnModCxlLHMsaSl7aWYoKGkubWF0Y2goL14tLyl8fFwiXCI9PT1pJiYwPT09dC5sZW5ndGgpJiYhdGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoZSkpe2NvbnN0IHM9dGhpcy55YXJncy5nZXRPcHRpb25zKCksbj10aGlzLnlhcmdzLmdldEdyb3VwcygpW3RoaXMudXNhZ2UuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpXXx8W107T2JqZWN0LmtleXMocy5rZXkpLmZvckVhY2goKHI9Pntjb25zdCBvPSEhcy5jb25maWd1cmF0aW9uW1wiYm9vbGVhbi1uZWdhdGlvblwiXSYmcy5ib29sZWFuLmluY2x1ZGVzKHIpO24uaW5jbHVkZXMocil8fHMuaGlkZGVuT3B0aW9ucy5pbmNsdWRlcyhyKXx8dGhpcy5hcmdzQ29udGFpbktleShlLHIsbyl8fHRoaXMuY29tcGxldGVPcHRpb25LZXkocix0LGksbyYmISFzLmRlZmF1bHRbcl0pfSkpfX1jaG9pY2VzRnJvbU9wdGlvbnNDb21wbGV0aW9ucyh0LGUscyxpKXtpZih0aGlzLnByZXZpb3VzQXJnSGFzQ2hvaWNlcyhlKSl7Y29uc3Qgcz10aGlzLmdldFByZXZpb3VzQXJnQ2hvaWNlcyhlKTtzJiZzLmxlbmd0aD4wJiZ0LnB1c2goLi4ucy5tYXAoKHQ9PnQucmVwbGFjZSgvOi9nLFwiXFxcXDpcIikpKSl9fWNob2ljZXNGcm9tUG9zaXRpb25hbHNDb21wbGV0aW9ucyh0LGUscyxpKXtpZihcIlwiPT09aSYmdC5sZW5ndGg+MCYmdGhpcy5wcmV2aW91c0FyZ0hhc0Nob2ljZXMoZSkpcmV0dXJuO2NvbnN0IG49dGhpcy55YXJncy5nZXRHcm91cHMoKVt0aGlzLnVzYWdlLmdldFBvc2l0aW9uYWxHcm91cE5hbWUoKV18fFtdLHI9TWF0aC5tYXgodGhpcy5pbmRleEFmdGVyTGFzdFJlc2V0LHRoaXMueWFyZ3MuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLmNvbW1hbmRzLmxlbmd0aCsxKSxvPW5bcy5fLmxlbmd0aC1yLTFdO2lmKCFvKXJldHVybjtjb25zdCBhPXRoaXMueWFyZ3MuZ2V0T3B0aW9ucygpLmNob2ljZXNbb118fFtdO2Zvcihjb25zdCBlIG9mIGEpZS5zdGFydHNXaXRoKGkpJiZ0LnB1c2goZS5yZXBsYWNlKC86L2csXCJcXFxcOlwiKSl9Z2V0UHJldmlvdXNBcmdDaG9pY2VzKHQpe2lmKHQubGVuZ3RoPDEpcmV0dXJuO2xldCBlPXRbdC5sZW5ndGgtMV0scz1cIlwiO2lmKCFlLnN0YXJ0c1dpdGgoXCItXCIpJiZ0Lmxlbmd0aD4xJiYocz1lLGU9dFt0Lmxlbmd0aC0yXSksIWUuc3RhcnRzV2l0aChcIi1cIikpcmV0dXJuO2NvbnN0IGk9ZS5yZXBsYWNlKC9eLSsvLFwiXCIpLG49dGhpcy55YXJncy5nZXRPcHRpb25zKCkscj1baSwuLi50aGlzLnlhcmdzLmdldEFsaWFzZXMoKVtpXXx8W11dO2xldCBvO2Zvcihjb25zdCB0IG9mIHIpaWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4ua2V5LHQpJiZBcnJheS5pc0FycmF5KG4uY2hvaWNlc1t0XSkpe289bi5jaG9pY2VzW3RdO2JyZWFrfXJldHVybiBvP28uZmlsdGVyKCh0PT4hc3x8dC5zdGFydHNXaXRoKHMpKSk6dm9pZCAwfXByZXZpb3VzQXJnSGFzQ2hvaWNlcyh0KXtjb25zdCBlPXRoaXMuZ2V0UHJldmlvdXNBcmdDaG9pY2VzKHQpO3JldHVybiB2b2lkIDAhPT1lJiZlLmxlbmd0aD4wfWFyZ3NDb250YWluS2V5KHQsZSxzKXtjb25zdCBpPWU9Pi0xIT09dC5pbmRleE9mKCgvXlteMC05XSQvLnRlc3QoZSk/XCItXCI6XCItLVwiKStlKTtpZihpKGUpKXJldHVybiEwO2lmKHMmJmkoYG5vLSR7ZX1gKSlyZXR1cm4hMDtpZih0aGlzLmFsaWFzZXMpZm9yKGNvbnN0IHQgb2YgdGhpcy5hbGlhc2VzW2VdKWlmKGkodCkpcmV0dXJuITA7cmV0dXJuITF9Y29tcGxldGVPcHRpb25LZXkodCxlLHMsaSl7dmFyIG4scixvLGE7bGV0IGg9dDtpZih0aGlzLnpzaFNoZWxsKXtjb25zdCBlPXRoaXMudXNhZ2UuZ2V0RGVzY3JpcHRpb25zKCkscz1udWxsPT09KHI9bnVsbD09PShuPW51bGw9PXRoaXM/dm9pZCAwOnRoaXMuYWxpYXNlcyl8fHZvaWQgMD09PW4/dm9pZCAwOm5bdF0pfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmZpbmQoKHQ9Pntjb25zdCBzPWVbdF07cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHMmJnMubGVuZ3RoPjB9KSksaT1zP2Vbc106dm9pZCAwLGw9bnVsbCE9PShhPW51bGwhPT0obz1lW3RdKSYmdm9pZCAwIT09bz9vOmkpJiZ2b2lkIDAhPT1hP2E6XCJcIjtoPWAke3QucmVwbGFjZSgvOi9nLFwiXFxcXDpcIil9OiR7bC5yZXBsYWNlKFwiX195YXJnc1N0cmluZ19fOlwiLFwiXCIpLnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZ20sXCIgXCIpfWB9Y29uc3QgbD0hL14tLS8udGVzdChzKSYmKHQ9Pi9eW14wLTldJC8udGVzdCh0KSkodCk/XCItXCI6XCItLVwiO2UucHVzaChsK2gpLGkmJmUucHVzaChsK1wibm8tXCIraCl9Y3VzdG9tQ29tcGxldGlvbih0LGUscyxpKXtpZihkKHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uLG51bGwsdGhpcy5zaGltKSx0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbi5sZW5ndGg8Myl7Y29uc3QgdD10aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihzLGUpO3JldHVybiBmKHQpP3QudGhlbigodD0+e3RoaXMuc2hpbS5wcm9jZXNzLm5leHRUaWNrKCgoKT0+e2kobnVsbCx0KX0pKX0pKS5jYXRjaCgodD0+e3RoaXMuc2hpbS5wcm9jZXNzLm5leHRUaWNrKCgoKT0+e2kodCx2b2lkIDApfSkpfSkpOmkobnVsbCx0KX1yZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoPjN9KHRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uKT90aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihzLGUsKChuPWkpPT50aGlzLmRlZmF1bHRDb21wbGV0aW9uKHQsZSxzLG4pKSwodD0+e2kobnVsbCx0KX0pKTp0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbihzLGUsKHQ9PntpKG51bGwsdCl9KSl9Z2V0Q29tcGxldGlvbih0LGUpe2NvbnN0IHM9dC5sZW5ndGg/dFt0Lmxlbmd0aC0xXTpcIlwiLGk9dGhpcy55YXJncy5wYXJzZSh0LCEwKSxuPXRoaXMuY3VzdG9tQ29tcGxldGlvbkZ1bmN0aW9uP2k9PnRoaXMuY3VzdG9tQ29tcGxldGlvbih0LGkscyxlKTppPT50aGlzLmRlZmF1bHRDb21wbGV0aW9uKHQsaSxzLGUpO3JldHVybiBmKGkpP2kudGhlbihuKTpuKGkpfWdlbmVyYXRlQ29tcGxldGlvblNjcmlwdCh0LGUpe2xldCBzPXRoaXMuenNoU2hlbGw/JyNjb21wZGVmIHt7YXBwX25hbWV9fVxcbiMjIy1iZWdpbi17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXFxuI1xcbiMgeWFyZ3MgY29tbWFuZCBjb21wbGV0aW9uIHNjcmlwdFxcbiNcXG4jIEluc3RhbGxhdGlvbjoge3thcHBfcGF0aH19IHt7Y29tcGxldGlvbl9jb21tYW5kfX0gPj4gfi8uenNocmNcXG4jICAgIG9yIHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLnpwcm9maWxlIG9uIE9TWC5cXG4jXFxuX3t7YXBwX25hbWV9fV95YXJnc19jb21wbGV0aW9ucygpXFxue1xcbiAgbG9jYWwgcmVwbHlcXG4gIGxvY2FsIHNpPSRJRlNcXG4gIElGUz0kXFwnXFxuXFwnIHJlcGx5PSgkKENPTVBfQ1dPUkQ9XCIkKChDVVJSRU5ULTEpKVwiIENPTVBfTElORT1cIiRCVUZGRVJcIiBDT01QX1BPSU5UPVwiJENVUlNPUlwiIHt7YXBwX3BhdGh9fSAtLWdldC15YXJncy1jb21wbGV0aW9ucyBcIiR7d29yZHNbQF19XCIpKVxcbiAgSUZTPSRzaVxcbiAgX2Rlc2NyaWJlIFxcJ3ZhbHVlc1xcJyByZXBseVxcbn1cXG5jb21wZGVmIF97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMge3thcHBfbmFtZX19XFxuIyMjLWVuZC17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXFxuJzonIyMjLWJlZ2luLXt7YXBwX25hbWV9fS1jb21wbGV0aW9ucy0jIyNcXG4jXFxuIyB5YXJncyBjb21tYW5kIGNvbXBsZXRpb24gc2NyaXB0XFxuI1xcbiMgSW5zdGFsbGF0aW9uOiB7e2FwcF9wYXRofX0ge3tjb21wbGV0aW9uX2NvbW1hbmR9fSA+PiB+Ly5iYXNocmNcXG4jICAgIG9yIHt7YXBwX3BhdGh9fSB7e2NvbXBsZXRpb25fY29tbWFuZH19ID4+IH4vLmJhc2hfcHJvZmlsZSBvbiBPU1guXFxuI1xcbl97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMoKVxcbntcXG4gICAgbG9jYWwgY3VyX3dvcmQgYXJncyB0eXBlX2xpc3RcXG5cXG4gICAgY3VyX3dvcmQ9XCIke0NPTVBfV09SRFNbQ09NUF9DV09SRF19XCJcXG4gICAgYXJncz0oXCIke0NPTVBfV09SRFNbQF19XCIpXFxuXFxuICAgICMgYXNrIHlhcmdzIHRvIGdlbmVyYXRlIGNvbXBsZXRpb25zLlxcbiAgICB0eXBlX2xpc3Q9JCh7e2FwcF9wYXRofX0gLS1nZXQteWFyZ3MtY29tcGxldGlvbnMgXCIke2FyZ3NbQF19XCIpXFxuXFxuICAgIENPTVBSRVBMWT0oICQoY29tcGdlbiAtVyBcIiR7dHlwZV9saXN0fVwiIC0tICR7Y3VyX3dvcmR9KSApXFxuXFxuICAgICMgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLCBmYWxsIGJhY2sgdG8gZmlsZW5hbWUgY29tcGxldGlvblxcbiAgICBpZiBbICR7I0NPTVBSRVBMWVtAXX0gLWVxIDAgXTsgdGhlblxcbiAgICAgIENPTVBSRVBMWT0oKVxcbiAgICBmaVxcblxcbiAgICByZXR1cm4gMFxcbn1cXG5jb21wbGV0ZSAtbyBiYXNoZGVmYXVsdCAtbyBkZWZhdWx0IC1GIF97e2FwcF9uYW1lfX1feWFyZ3NfY29tcGxldGlvbnMge3thcHBfbmFtZX19XFxuIyMjLWVuZC17e2FwcF9uYW1lfX0tY29tcGxldGlvbnMtIyMjXFxuJztjb25zdCBpPXRoaXMuc2hpbS5wYXRoLmJhc2VuYW1lKHQpO3JldHVybiB0Lm1hdGNoKC9cXC5qcyQvKSYmKHQ9YC4vJHt0fWApLHM9cy5yZXBsYWNlKC97e2FwcF9uYW1lfX0vZyxpKSxzPXMucmVwbGFjZSgve3tjb21wbGV0aW9uX2NvbW1hbmR9fS9nLGUpLHMucmVwbGFjZSgve3thcHBfcGF0aH19L2csdCl9cmVnaXN0ZXJGdW5jdGlvbih0KXt0aGlzLmN1c3RvbUNvbXBsZXRpb25GdW5jdGlvbj10fXNldFBhcnNlZCh0KXt0aGlzLmFsaWFzZXM9dC5hbGlhc2VzfX1mdW5jdGlvbiBOKHQsZSl7aWYoMD09PXQubGVuZ3RoKXJldHVybiBlLmxlbmd0aDtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHQubGVuZ3RoO2NvbnN0IHM9W107bGV0IGksbjtmb3IoaT0wO2k8PWUubGVuZ3RoO2krKylzW2ldPVtpXTtmb3Iobj0wO248PXQubGVuZ3RoO24rKylzWzBdW25dPW47Zm9yKGk9MTtpPD1lLmxlbmd0aDtpKyspZm9yKG49MTtuPD10Lmxlbmd0aDtuKyspZS5jaGFyQXQoaS0xKT09PXQuY2hhckF0KG4tMSk/c1tpXVtuXT1zW2ktMV1bbi0xXTppPjEmJm4+MSYmZS5jaGFyQXQoaS0yKT09PXQuY2hhckF0KG4tMSkmJmUuY2hhckF0KGktMSk9PT10LmNoYXJBdChuLTIpP3NbaV1bbl09c1tpLTJdW24tMl0rMTpzW2ldW25dPU1hdGgubWluKHNbaS0xXVtuLTFdKzEsTWF0aC5taW4oc1tpXVtuLTFdKzEsc1tpLTFdW25dKzEpKTtyZXR1cm4gc1tlLmxlbmd0aF1bdC5sZW5ndGhdfWNvbnN0IEg9W1wiJDBcIixcIi0tXCIsXCJfXCJdO3ZhciB6LFcscSxVLEYsTCxWLEcsUixULEIsWSxLLEosWixYLFEsdHQsZXQsc3QsaXQsbnQscnQsb3QsYXQsaHQsbHQsY3QsZnQsZHQsdXQscHQsZ3QsbXQseXQ7Y29uc3QgYnQ9U3ltYm9sKFwiY29weURvdWJsZURhc2hcIiksdnQ9U3ltYm9sKFwiY29weURvdWJsZURhc2hcIiksT3Q9U3ltYm9sKFwiZGVsZXRlRnJvbVBhcnNlckhpbnRPYmplY3RcIiksd3Q9U3ltYm9sKFwiZW1pdFdhcm5pbmdcIiksQ3Q9U3ltYm9sKFwiZnJlZXplXCIpLGp0PVN5bWJvbChcImdldERvbGxhclplcm9cIiksTXQ9U3ltYm9sKFwiZ2V0UGFyc2VyQ29uZmlndXJhdGlvblwiKSxfdD1TeW1ib2woXCJnZXRVc2FnZUNvbmZpZ3VyYXRpb25cIiksa3Q9U3ltYm9sKFwiZ3Vlc3NMb2NhbGVcIikseHQ9U3ltYm9sKFwiZ3Vlc3NWZXJzaW9uXCIpLEV0PVN5bWJvbChcInBhcnNlUG9zaXRpb25hbE51bWJlcnNcIiksQXQ9U3ltYm9sKFwicGtnVXBcIiksUHQ9U3ltYm9sKFwicG9wdWxhdGVQYXJzZXJIaW50QXJyYXlcIiksU3Q9U3ltYm9sKFwicG9wdWxhdGVQYXJzZXJIaW50U2luZ2xlVmFsdWVEaWN0aW9uYXJ5XCIpLCR0PVN5bWJvbChcInBvcHVsYXRlUGFyc2VySGludEFycmF5RGljdGlvbmFyeVwiKSxJdD1TeW1ib2woXCJwb3B1bGF0ZVBhcnNlckhpbnREaWN0aW9uYXJ5XCIpLER0PVN5bWJvbChcInNhbml0aXplS2V5XCIpLE50PVN5bWJvbChcInNldEtleVwiKSxIdD1TeW1ib2woXCJ1bmZyZWV6ZVwiKSx6dD1TeW1ib2woXCJ2YWxpZGF0ZUFzeW5jXCIpLFd0PVN5bWJvbChcImdldENvbW1hbmRJbnN0YW5jZVwiKSxxdD1TeW1ib2woXCJnZXRDb250ZXh0XCIpLFV0PVN5bWJvbChcImdldEhhc091dHB1dFwiKSxGdD1TeW1ib2woXCJnZXRMb2dnZXJJbnN0YW5jZVwiKSxMdD1TeW1ib2woXCJnZXRQYXJzZUNvbnRleHRcIiksVnQ9U3ltYm9sKFwiZ2V0VXNhZ2VJbnN0YW5jZVwiKSxHdD1TeW1ib2woXCJnZXRWYWxpZGF0aW9uSW5zdGFuY2VcIiksUnQ9U3ltYm9sKFwiaGFzUGFyc2VDYWxsYmFja1wiKSxUdD1TeW1ib2woXCJpc0dsb2JhbENvbnRleHRcIiksQnQ9U3ltYm9sKFwicG9zdFByb2Nlc3NcIiksWXQ9U3ltYm9sKFwicmViYXNlXCIpLEt0PVN5bWJvbChcInJlc2V0XCIpLEp0PVN5bWJvbChcInJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzXCIpLFp0PVN5bWJvbChcInJ1blZhbGlkYXRpb25cIiksWHQ9U3ltYm9sKFwic2V0SGFzT3V0cHV0XCIpLFF0PVN5bWJvbChcImtUcmFja01hbnVhbGx5U2V0S2V5c1wiKTtjbGFzcyB0ZXtjb25zdHJ1Y3Rvcih0PVtdLGUscyxpKXt0aGlzLmN1c3RvbVNjcmlwdE5hbWU9ITEsdGhpcy5wYXJzZWQ9ITEsei5zZXQodGhpcyx2b2lkIDApLFcuc2V0KHRoaXMsdm9pZCAwKSxxLnNldCh0aGlzLHtjb21tYW5kczpbXSxmdWxsQ29tbWFuZHM6W119KSxVLnNldCh0aGlzLG51bGwpLEYuc2V0KHRoaXMsbnVsbCksTC5zZXQodGhpcyxcInNob3ctaGlkZGVuXCIpLFYuc2V0KHRoaXMsbnVsbCksRy5zZXQodGhpcywhMCksUi5zZXQodGhpcyx7fSksVC5zZXQodGhpcywhMCksQi5zZXQodGhpcyxbXSksWS5zZXQodGhpcyx2b2lkIDApLEsuc2V0KHRoaXMse30pLEouc2V0KHRoaXMsITEpLFouc2V0KHRoaXMsbnVsbCksWC5zZXQodGhpcywhMCksUS5zZXQodGhpcyx2b2lkIDApLHR0LnNldCh0aGlzLFwiXCIpLGV0LnNldCh0aGlzLHZvaWQgMCksc3Quc2V0KHRoaXMsdm9pZCAwKSxpdC5zZXQodGhpcyx7fSksbnQuc2V0KHRoaXMsbnVsbCkscnQuc2V0KHRoaXMsbnVsbCksb3Quc2V0KHRoaXMse30pLGF0LnNldCh0aGlzLHt9KSxodC5zZXQodGhpcyx2b2lkIDApLGx0LnNldCh0aGlzLCExKSxjdC5zZXQodGhpcyx2b2lkIDApLGZ0LnNldCh0aGlzLCExKSxkdC5zZXQodGhpcywhMSksdXQuc2V0KHRoaXMsITEpLHB0LnNldCh0aGlzLHZvaWQgMCksZ3Quc2V0KHRoaXMse30pLG10LnNldCh0aGlzLG51bGwpLHl0LnNldCh0aGlzLHZvaWQgMCksTyh0aGlzLGN0LGksXCJmXCIpLE8odGhpcyxodCx0LFwiZlwiKSxPKHRoaXMsVyxlLFwiZlwiKSxPKHRoaXMsc3QscyxcImZcIiksTyh0aGlzLFksbmV3IHcodGhpcyksXCJmXCIpLHRoaXMuJDA9dGhpc1tqdF0oKSx0aGlzW0t0XSgpLE8odGhpcyx6LHYodGhpcyx6LFwiZlwiKSxcImZcIiksTyh0aGlzLHB0LHYodGhpcyxwdCxcImZcIiksXCJmXCIpLE8odGhpcyx5dCx2KHRoaXMseXQsXCJmXCIpLFwiZlwiKSxPKHRoaXMsZXQsdih0aGlzLGV0LFwiZlwiKSxcImZcIiksdih0aGlzLGV0LFwiZlwiKS5zaG93SGlkZGVuT3B0PXYodGhpcyxMLFwiZlwiKSxPKHRoaXMsUSx0aGlzW3Z0XSgpLFwiZlwiKX1hZGRIZWxwT3B0KHQsZSl7cmV0dXJuIGgoXCJbc3RyaW5nfGJvb2xlYW5dIFtzdHJpbmddXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLFosXCJmXCIpJiYodGhpc1tPdF0odih0aGlzLFosXCJmXCIpKSxPKHRoaXMsWixudWxsLFwiZlwiKSksITE9PT10JiZ2b2lkIDA9PT1lfHwoTyh0aGlzLFosXCJzdHJpbmdcIj09dHlwZW9mIHQ/dDpcImhlbHBcIixcImZcIiksdGhpcy5ib29sZWFuKHYodGhpcyxaLFwiZlwiKSksdGhpcy5kZXNjcmliZSh2KHRoaXMsWixcImZcIiksZXx8dih0aGlzLHB0LFwiZlwiKS5kZWZlclkxOG5Mb29rdXAoXCJTaG93IGhlbHBcIikpKSx0aGlzfWhlbHAodCxlKXtyZXR1cm4gdGhpcy5hZGRIZWxwT3B0KHQsZSl9YWRkU2hvd0hpZGRlbk9wdCh0LGUpe2lmKGgoXCJbc3RyaW5nfGJvb2xlYW5dIFtzdHJpbmddXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksITE9PT10JiZ2b2lkIDA9PT1lKXJldHVybiB0aGlzO2NvbnN0IHM9XCJzdHJpbmdcIj09dHlwZW9mIHQ/dDp2KHRoaXMsTCxcImZcIik7cmV0dXJuIHRoaXMuYm9vbGVhbihzKSx0aGlzLmRlc2NyaWJlKHMsZXx8dih0aGlzLHB0LFwiZlwiKS5kZWZlclkxOG5Mb29rdXAoXCJTaG93IGhpZGRlbiBvcHRpb25zXCIpKSx2KHRoaXMsZXQsXCJmXCIpLnNob3dIaWRkZW5PcHQ9cyx0aGlzfXNob3dIaWRkZW4odCxlKXtyZXR1cm4gdGhpcy5hZGRTaG93SGlkZGVuT3B0KHQsZSl9YWxpYXModCxlKXtyZXR1cm4gaChcIjxvYmplY3R8c3RyaW5nfGFycmF5PiBbc3RyaW5nfGFycmF5XVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbJHRdKHRoaXMuYWxpYXMuYmluZCh0aGlzKSxcImFsaWFzXCIsdCxlKSx0aGlzfWFycmF5KHQpe3JldHVybiBoKFwiPGFycmF5fHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tQdF0oXCJhcnJheVwiLHQpLHRoaXNbUXRdKHQpLHRoaXN9Ym9vbGVhbih0KXtyZXR1cm4gaChcIjxhcnJheXxzdHJpbmc+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbUHRdKFwiYm9vbGVhblwiLHQpLHRoaXNbUXRdKHQpLHRoaXN9Y2hlY2sodCxlKXtyZXR1cm4gaChcIjxmdW5jdGlvbj4gW2Jvb2xlYW5dXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdGhpcy5taWRkbGV3YXJlKCgoZSxzKT0+aigoKCk9PnQoZSxzLmdldE9wdGlvbnMoKSkpLChzPT4ocz8oXCJzdHJpbmdcIj09dHlwZW9mIHN8fHMgaW5zdGFuY2VvZiBFcnJvcikmJnYodGhpcyxwdCxcImZcIikuZmFpbChzLnRvU3RyaW5nKCkscyk6dih0aGlzLHB0LFwiZlwiKS5mYWlsKHYodGhpcyxjdCxcImZcIikueTE4bi5fXyhcIkFyZ3VtZW50IGNoZWNrIGZhaWxlZDogJXNcIix0LnRvU3RyaW5nKCkpKSxlKSksKHQ9Pih2KHRoaXMscHQsXCJmXCIpLmZhaWwodC5tZXNzYWdlP3QubWVzc2FnZTp0LnRvU3RyaW5nKCksdCksZSkpKSksITEsZSksdGhpc31jaG9pY2VzKHQsZSl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ3xhcnJheV1cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzWyR0XSh0aGlzLmNob2ljZXMuYmluZCh0aGlzKSxcImNob2ljZXNcIix0LGUpLHRoaXN9Y29lcmNlKHQscyl7aWYoaChcIjxvYmplY3R8c3RyaW5nfGFycmF5PiBbZnVuY3Rpb25dXCIsW3Qsc10sYXJndW1lbnRzLmxlbmd0aCksQXJyYXkuaXNBcnJheSh0KSl7aWYoIXMpdGhyb3cgbmV3IGUoXCJjb2VyY2UgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZFwiKTtmb3IoY29uc3QgZSBvZiB0KXRoaXMuY29lcmNlKGUscyk7cmV0dXJuIHRoaXN9aWYoXCJvYmplY3RcIj09dHlwZW9mIHQpe2Zvcihjb25zdCBlIG9mIE9iamVjdC5rZXlzKHQpKXRoaXMuY29lcmNlKGUsdFtlXSk7cmV0dXJuIHRoaXN9aWYoIXMpdGhyb3cgbmV3IGUoXCJjb2VyY2UgY2FsbGJhY2sgbXVzdCBiZSBwcm92aWRlZFwiKTtyZXR1cm4gdih0aGlzLGV0LFwiZlwiKS5rZXlbdF09ITAsdih0aGlzLFksXCJmXCIpLmFkZENvZXJjZU1pZGRsZXdhcmUoKChpLG4pPT57bGV0IHI7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLHQpP2ooKCgpPT4ocj1uLmdldEFsaWFzZXMoKSxzKGlbdF0pKSksKGU9PntpW3RdPWU7Y29uc3Qgcz1uLmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKVtcInN0cmlwLWFsaWFzZWRcIl07aWYoclt0XSYmITAhPT1zKWZvcihjb25zdCBzIG9mIHJbdF0paVtzXT1lO3JldHVybiBpfSksKHQ9Pnt0aHJvdyBuZXcgZSh0Lm1lc3NhZ2UpfSkpOml9KSx0KSx0aGlzfWNvbmZsaWN0cyh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xvYmplY3Q+IFtzdHJpbmd8YXJyYXldXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLHl0LFwiZlwiKS5jb25mbGljdHModCxlKSx0aGlzfWNvbmZpZyh0PVwiY29uZmlnXCIsZSxzKXtyZXR1cm4gaChcIltvYmplY3R8c3RyaW5nXSBbc3RyaW5nfGZ1bmN0aW9uXSBbZnVuY3Rpb25dXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSxcIm9iamVjdFwiIT10eXBlb2YgdHx8QXJyYXkuaXNBcnJheSh0KT8oXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmKHM9ZSxlPXZvaWQgMCksdGhpcy5kZXNjcmliZSh0LGV8fHYodGhpcyxwdCxcImZcIikuZGVmZXJZMThuTG9va3VwKFwiUGF0aCB0byBKU09OIGNvbmZpZyBmaWxlXCIpKSwoQXJyYXkuaXNBcnJheSh0KT90Olt0XSkuZm9yRWFjaCgodD0+e3YodGhpcyxldCxcImZcIikuY29uZmlnW3RdPXN8fCEwfSkpLHRoaXMpOih0PW4odCx2KHRoaXMsVyxcImZcIiksdGhpc1tNdF0oKVtcImRlZXAtbWVyZ2UtY29uZmlnXCJdfHwhMSx2KHRoaXMsY3QsXCJmXCIpKSx2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHM9KHYodGhpcyxldCxcImZcIikuY29uZmlnT2JqZWN0c3x8W10pLmNvbmNhdCh0KSx0aGlzKX1jb21wbGV0aW9uKHQsZSxzKXtyZXR1cm4gaChcIltzdHJpbmddIFtzdHJpbmd8Ym9vbGVhbnxmdW5jdGlvbl0gW2Z1bmN0aW9uXVwiLFt0LGUsc10sYXJndW1lbnRzLmxlbmd0aCksXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmKHM9ZSxlPXZvaWQgMCksTyh0aGlzLEYsdHx8dih0aGlzLEYsXCJmXCIpfHxcImNvbXBsZXRpb25cIixcImZcIiksZXx8ITE9PT1lfHwoZT1cImdlbmVyYXRlIGNvbXBsZXRpb24gc2NyaXB0XCIpLHRoaXMuY29tbWFuZCh2KHRoaXMsRixcImZcIiksZSkscyYmdih0aGlzLFUsXCJmXCIpLnJlZ2lzdGVyRnVuY3Rpb24ocyksdGhpc31jb21tYW5kKHQsZSxzLGksbixyKXtyZXR1cm4gaChcIjxzdHJpbmd8YXJyYXl8b2JqZWN0PiBbc3RyaW5nfGJvb2xlYW5dIFtmdW5jdGlvbnxvYmplY3RdIFtmdW5jdGlvbl0gW2FycmF5XSBbYm9vbGVhbnxzdHJpbmddXCIsW3QsZSxzLGksbixyXSxhcmd1bWVudHMubGVuZ3RoKSx2KHRoaXMseixcImZcIikuYWRkSGFuZGxlcih0LGUscyxpLG4sciksdGhpc31jb21tYW5kcyh0LGUscyxpLG4scil7cmV0dXJuIHRoaXMuY29tbWFuZCh0LGUscyxpLG4scil9Y29tbWFuZERpcih0LGUpe2goXCI8c3RyaW5nPiBbb2JqZWN0XVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpO2NvbnN0IHM9dih0aGlzLHN0LFwiZlwiKXx8dih0aGlzLGN0LFwiZlwiKS5yZXF1aXJlO3JldHVybiB2KHRoaXMseixcImZcIikuYWRkRGlyZWN0b3J5KHQscyx2KHRoaXMsY3QsXCJmXCIpLmdldENhbGxlckZpbGUoKSxlKSx0aGlzfWNvdW50KHQpe3JldHVybiBoKFwiPGFycmF5fHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tQdF0oXCJjb3VudFwiLHQpLHRoaXNbUXRdKHQpLHRoaXN9ZGVmYXVsdCh0LGUscyl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gWypdIFtzdHJpbmddXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSxzJiYodSh0LHYodGhpcyxjdCxcImZcIikpLHYodGhpcyxldCxcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW3RdPXMpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJih1KHQsdih0aGlzLGN0LFwiZlwiKSksdih0aGlzLGV0LFwiZlwiKS5kZWZhdWx0RGVzY3JpcHRpb25bdF18fCh2KHRoaXMsZXQsXCJmXCIpLmRlZmF1bHREZXNjcmlwdGlvblt0XT12KHRoaXMscHQsXCJmXCIpLmZ1bmN0aW9uRGVzY3JpcHRpb24oZSkpLGU9ZS5jYWxsKCkpLHRoaXNbU3RdKHRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLFwiZGVmYXVsdFwiLHQsZSksdGhpc31kZWZhdWx0cyh0LGUscyl7cmV0dXJuIHRoaXMuZGVmYXVsdCh0LGUscyl9ZGVtYW5kQ29tbWFuZCh0PTEsZSxzLGkpe3JldHVybiBoKFwiW251bWJlcl0gW251bWJlcnxzdHJpbmddIFtzdHJpbmd8bnVsbHx1bmRlZmluZWRdIFtzdHJpbmd8bnVsbHx1bmRlZmluZWRdXCIsW3QsZSxzLGldLGFyZ3VtZW50cy5sZW5ndGgpLFwibnVtYmVyXCIhPXR5cGVvZiBlJiYocz1lLGU9MS8wKSx0aGlzLmdsb2JhbChcIl9cIiwhMSksdih0aGlzLGV0LFwiZlwiKS5kZW1hbmRlZENvbW1hbmRzLl89e21pbjp0LG1heDplLG1pbk1zZzpzLG1heE1zZzppfSx0aGlzfWRlbWFuZCh0LGUscyl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/KGUuZm9yRWFjaCgodD0+e2QocywhMCx2KHRoaXMsY3QsXCJmXCIpKSx0aGlzLmRlbWFuZE9wdGlvbih0LHMpfSkpLGU9MS8wKTpcIm51bWJlclwiIT10eXBlb2YgZSYmKHM9ZSxlPTEvMCksXCJudW1iZXJcIj09dHlwZW9mIHQ/KGQocywhMCx2KHRoaXMsY3QsXCJmXCIpKSx0aGlzLmRlbWFuZENvbW1hbmQodCxlLHMscykpOkFycmF5LmlzQXJyYXkodCk/dC5mb3JFYWNoKCh0PT57ZChzLCEwLHYodGhpcyxjdCxcImZcIikpLHRoaXMuZGVtYW5kT3B0aW9uKHQscyl9KSk6XCJzdHJpbmdcIj09dHlwZW9mIHM/dGhpcy5kZW1hbmRPcHRpb24odCxzKTohMCE9PXMmJnZvaWQgMCE9PXN8fHRoaXMuZGVtYW5kT3B0aW9uKHQpLHRoaXN9ZGVtYW5kT3B0aW9uKHQsZSl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW1N0XSh0aGlzLmRlbWFuZE9wdGlvbi5iaW5kKHRoaXMpLFwiZGVtYW5kZWRPcHRpb25zXCIsdCxlKSx0aGlzfWRlcHJlY2F0ZU9wdGlvbih0LGUpe3JldHVybiBoKFwiPHN0cmluZz4gW3N0cmluZ3xib29sZWFuXVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLHYodGhpcyxldCxcImZcIikuZGVwcmVjYXRlZE9wdGlvbnNbdF09ZSx0aGlzfWRlc2NyaWJlKHQsZSl7cmV0dXJuIGgoXCI8b2JqZWN0fHN0cmluZ3xhcnJheT4gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW050XSh0LCEwKSx2KHRoaXMscHQsXCJmXCIpLmRlc2NyaWJlKHQsZSksdGhpc31kZXRlY3RMb2NhbGUodCl7cmV0dXJuIGgoXCI8Ym9vbGVhbj5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksTyh0aGlzLEcsdCxcImZcIiksdGhpc31lbnYodCl7cmV0dXJuIGgoXCJbc3RyaW5nfGJvb2xlYW5dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLCExPT09dD9kZWxldGUgdih0aGlzLGV0LFwiZlwiKS5lbnZQcmVmaXg6dih0aGlzLGV0LFwiZlwiKS5lbnZQcmVmaXg9dHx8XCJcIix0aGlzfWVwaWxvZ3VlKHQpe3JldHVybiBoKFwiPHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLHB0LFwiZlwiKS5lcGlsb2codCksdGhpc31lcGlsb2codCl7cmV0dXJuIHRoaXMuZXBpbG9ndWUodCl9ZXhhbXBsZSh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xhcnJheT4gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSxBcnJheS5pc0FycmF5KHQpP3QuZm9yRWFjaCgodD0+dGhpcy5leGFtcGxlKC4uLnQpKSk6dih0aGlzLHB0LFwiZlwiKS5leGFtcGxlKHQsZSksdGhpc31leGl0KHQsZSl7Tyh0aGlzLEosITAsXCJmXCIpLE8odGhpcyxWLGUsXCJmXCIpLHYodGhpcyxULFwiZlwiKSYmdih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmV4aXQodCl9ZXhpdFByb2Nlc3ModD0hMCl7cmV0dXJuIGgoXCJbYm9vbGVhbl1cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksTyh0aGlzLFQsdCxcImZcIiksdGhpc31mYWlsKHQpe2lmKGgoXCI8ZnVuY3Rpb258Ym9vbGVhbj5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksXCJib29sZWFuXCI9PXR5cGVvZiB0JiYhMSE9PXQpdGhyb3cgbmV3IGUoXCJJbnZhbGlkIGZpcnN0IGFyZ3VtZW50LiBFeHBlY3RlZCBmdW5jdGlvbiBvciBib29sZWFuICdmYWxzZSdcIik7cmV0dXJuIHYodGhpcyxwdCxcImZcIikuZmFpbEZuKHQpLHRoaXN9Z2V0QWxpYXNlcygpe3JldHVybiB0aGlzLnBhcnNlZD90aGlzLnBhcnNlZC5hbGlhc2VzOnt9fWFzeW5jIGdldENvbXBsZXRpb24odCxlKXtyZXR1cm4gaChcIjxhcnJheT4gW2Z1bmN0aW9uXVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLGU/dih0aGlzLFUsXCJmXCIpLmdldENvbXBsZXRpb24odCxlKTpuZXcgUHJvbWlzZSgoKGUscyk9Pnt2KHRoaXMsVSxcImZcIikuZ2V0Q29tcGxldGlvbih0LCgodCxpKT0+e3Q/cyh0KTplKGkpfSkpfSkpfWdldERlbWFuZGVkT3B0aW9ucygpe3JldHVybiBoKFtdLDApLHYodGhpcyxldCxcImZcIikuZGVtYW5kZWRPcHRpb25zfWdldERlbWFuZGVkQ29tbWFuZHMoKXtyZXR1cm4gaChbXSwwKSx2KHRoaXMsZXQsXCJmXCIpLmRlbWFuZGVkQ29tbWFuZHN9Z2V0RGVwcmVjYXRlZE9wdGlvbnMoKXtyZXR1cm4gaChbXSwwKSx2KHRoaXMsZXQsXCJmXCIpLmRlcHJlY2F0ZWRPcHRpb25zfWdldERldGVjdExvY2FsZSgpe3JldHVybiB2KHRoaXMsRyxcImZcIil9Z2V0RXhpdFByb2Nlc3MoKXtyZXR1cm4gdih0aGlzLFQsXCJmXCIpfWdldEdyb3Vwcygpe3JldHVybiBPYmplY3QuYXNzaWduKHt9LHYodGhpcyxLLFwiZlwiKSx2KHRoaXMsYXQsXCJmXCIpKX1nZXRIZWxwKCl7aWYoTyh0aGlzLEosITAsXCJmXCIpLCF2KHRoaXMscHQsXCJmXCIpLmhhc0NhY2hlZEhlbHBNZXNzYWdlKCkpe2lmKCF0aGlzLnBhcnNlZCl7Y29uc3QgdD10aGlzW0p0XSh2KHRoaXMsaHQsXCJmXCIpLHZvaWQgMCx2b2lkIDAsMCwhMCk7aWYoZih0KSlyZXR1cm4gdC50aGVuKCgoKT0+dih0aGlzLHB0LFwiZlwiKS5oZWxwKCkpKX1jb25zdCB0PXYodGhpcyx6LFwiZlwiKS5ydW5EZWZhdWx0QnVpbGRlck9uKHRoaXMpO2lmKGYodCkpcmV0dXJuIHQudGhlbigoKCk9PnYodGhpcyxwdCxcImZcIikuaGVscCgpKSl9cmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KHRoaXMscHQsXCJmXCIpLmhlbHAoKSl9Z2V0T3B0aW9ucygpe3JldHVybiB2KHRoaXMsZXQsXCJmXCIpfWdldFN0cmljdCgpe3JldHVybiB2KHRoaXMsZnQsXCJmXCIpfWdldFN0cmljdENvbW1hbmRzKCl7cmV0dXJuIHYodGhpcyxkdCxcImZcIil9Z2V0U3RyaWN0T3B0aW9ucygpe3JldHVybiB2KHRoaXMsdXQsXCJmXCIpfWdsb2JhbCh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xhcnJheT4gW2Jvb2xlYW5dXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdD1bXS5jb25jYXQodCksITEhPT1lP3YodGhpcyxldCxcImZcIikubG9jYWw9dih0aGlzLGV0LFwiZlwiKS5sb2NhbC5maWx0ZXIoKGU9Pi0xPT09dC5pbmRleE9mKGUpKSk6dC5mb3JFYWNoKCh0PT57dih0aGlzLGV0LFwiZlwiKS5sb2NhbC5pbmNsdWRlcyh0KXx8dih0aGlzLGV0LFwiZlwiKS5sb2NhbC5wdXNoKHQpfSkpLHRoaXN9Z3JvdXAodCxlKXtoKFwiPHN0cmluZ3xhcnJheT4gPHN0cmluZz5cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKTtjb25zdCBzPXYodGhpcyxhdCxcImZcIilbZV18fHYodGhpcyxLLFwiZlwiKVtlXTt2KHRoaXMsYXQsXCJmXCIpW2VdJiZkZWxldGUgdih0aGlzLGF0LFwiZlwiKVtlXTtjb25zdCBpPXt9O3JldHVybiB2KHRoaXMsSyxcImZcIilbZV09KHN8fFtdKS5jb25jYXQodCkuZmlsdGVyKCh0PT4haVt0XSYmKGlbdF09ITApKSksdGhpc31oaWRlKHQpe3JldHVybiBoKFwiPHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLGV0LFwiZlwiKS5oaWRkZW5PcHRpb25zLnB1c2godCksdGhpc31pbXBsaWVzKHQsZSl7cmV0dXJuIGgoXCI8c3RyaW5nfG9iamVjdD4gW251bWJlcnxzdHJpbmd8YXJyYXldXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdih0aGlzLHl0LFwiZlwiKS5pbXBsaWVzKHQsZSksdGhpc31sb2NhbGUodCl7cmV0dXJuIGgoXCJbc3RyaW5nXVwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSx2b2lkIDA9PT10Pyh0aGlzW2t0XSgpLHYodGhpcyxjdCxcImZcIikueTE4bi5nZXRMb2NhbGUoKSk6KE8odGhpcyxHLCExLFwiZlwiKSx2KHRoaXMsY3QsXCJmXCIpLnkxOG4uc2V0TG9jYWxlKHQpLHRoaXMpfW1pZGRsZXdhcmUodCxlLHMpe3JldHVybiB2KHRoaXMsWSxcImZcIikuYWRkTWlkZGxld2FyZSh0LCEhZSxzKX1uYXJncyh0LGUpe3JldHVybiBoKFwiPHN0cmluZ3xvYmplY3R8YXJyYXk+IFtudW1iZXJdXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tTdF0odGhpcy5uYXJncy5iaW5kKHRoaXMpLFwibmFyZ1wiLHQsZSksdGhpc31ub3JtYWxpemUodCl7cmV0dXJuIGgoXCI8YXJyYXl8c3RyaW5nPlwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW1B0XShcIm5vcm1hbGl6ZVwiLHQpLHRoaXN9bnVtYmVyKHQpe3JldHVybiBoKFwiPGFycmF5fHN0cmluZz5cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksdGhpc1tQdF0oXCJudW1iZXJcIix0KSx0aGlzW1F0XSh0KSx0aGlzfW9wdGlvbih0LGUpe2lmKGgoXCI8c3RyaW5nfG9iamVjdD4gW29iamVjdF1cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSxcIm9iamVjdFwiPT10eXBlb2YgdClPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChlPT57dGhpcy5vcHRpb25zKGUsdFtlXSl9KSk7ZWxzZXtcIm9iamVjdFwiIT10eXBlb2YgZSYmKGU9e30pLHRoaXNbUXRdKHQpLCF2KHRoaXMsbXQsXCJmXCIpfHxcInZlcnNpb25cIiE9PXQmJlwidmVyc2lvblwiIT09KG51bGw9PWU/dm9pZCAwOmUuYWxpYXMpfHx0aGlzW3d0XShbJ1widmVyc2lvblwiIGlzIGEgcmVzZXJ2ZWQgd29yZC4nLFwiUGxlYXNlIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOlwiLCctIERpc2FibGUgdmVyc2lvbiB3aXRoIGB5YXJncy52ZXJzaW9uKGZhbHNlKWAgaWYgdXNpbmcgXCJ2ZXJzaW9uXCIgYXMgYW4gb3B0aW9uJyxcIi0gVXNlIHRoZSBidWlsdC1pbiBgeWFyZ3MudmVyc2lvbmAgbWV0aG9kIGluc3RlYWQgKGlmIGFwcGxpY2FibGUpXCIsXCItIFVzZSBhIGRpZmZlcmVudCBvcHRpb24ga2V5XCIsXCJodHRwczovL3lhcmdzLmpzLm9yZy9kb2NzLyNhcGktcmVmZXJlbmNlLXZlcnNpb25cIl0uam9pbihcIlxcblwiKSx2b2lkIDAsXCJ2ZXJzaW9uV2FybmluZ1wiKSx2KHRoaXMsZXQsXCJmXCIpLmtleVt0XT0hMCxlLmFsaWFzJiZ0aGlzLmFsaWFzKHQsZS5hbGlhcyk7Y29uc3Qgcz1lLmRlcHJlY2F0ZXx8ZS5kZXByZWNhdGVkO3MmJnRoaXMuZGVwcmVjYXRlT3B0aW9uKHQscyk7Y29uc3QgaT1lLmRlbWFuZHx8ZS5yZXF1aXJlZHx8ZS5yZXF1aXJlO2kmJnRoaXMuZGVtYW5kKHQsaSksZS5kZW1hbmRPcHRpb24mJnRoaXMuZGVtYW5kT3B0aW9uKHQsXCJzdHJpbmdcIj09dHlwZW9mIGUuZGVtYW5kT3B0aW9uP2UuZGVtYW5kT3B0aW9uOnZvaWQgMCksZS5jb25mbGljdHMmJnRoaXMuY29uZmxpY3RzKHQsZS5jb25mbGljdHMpLFwiZGVmYXVsdFwiaW4gZSYmdGhpcy5kZWZhdWx0KHQsZS5kZWZhdWx0KSx2b2lkIDAhPT1lLmltcGxpZXMmJnRoaXMuaW1wbGllcyh0LGUuaW1wbGllcyksdm9pZCAwIT09ZS5uYXJncyYmdGhpcy5uYXJncyh0LGUubmFyZ3MpLGUuY29uZmlnJiZ0aGlzLmNvbmZpZyh0LGUuY29uZmlnUGFyc2VyKSxlLm5vcm1hbGl6ZSYmdGhpcy5ub3JtYWxpemUodCksZS5jaG9pY2VzJiZ0aGlzLmNob2ljZXModCxlLmNob2ljZXMpLGUuY29lcmNlJiZ0aGlzLmNvZXJjZSh0LGUuY29lcmNlKSxlLmdyb3VwJiZ0aGlzLmdyb3VwKHQsZS5ncm91cCksKGUuYm9vbGVhbnx8XCJib29sZWFuXCI9PT1lLnR5cGUpJiYodGhpcy5ib29sZWFuKHQpLGUuYWxpYXMmJnRoaXMuYm9vbGVhbihlLmFsaWFzKSksKGUuYXJyYXl8fFwiYXJyYXlcIj09PWUudHlwZSkmJih0aGlzLmFycmF5KHQpLGUuYWxpYXMmJnRoaXMuYXJyYXkoZS5hbGlhcykpLChlLm51bWJlcnx8XCJudW1iZXJcIj09PWUudHlwZSkmJih0aGlzLm51bWJlcih0KSxlLmFsaWFzJiZ0aGlzLm51bWJlcihlLmFsaWFzKSksKGUuc3RyaW5nfHxcInN0cmluZ1wiPT09ZS50eXBlKSYmKHRoaXMuc3RyaW5nKHQpLGUuYWxpYXMmJnRoaXMuc3RyaW5nKGUuYWxpYXMpKSwoZS5jb3VudHx8XCJjb3VudFwiPT09ZS50eXBlKSYmdGhpcy5jb3VudCh0KSxcImJvb2xlYW5cIj09dHlwZW9mIGUuZ2xvYmFsJiZ0aGlzLmdsb2JhbCh0LGUuZ2xvYmFsKSxlLmRlZmF1bHREZXNjcmlwdGlvbiYmKHYodGhpcyxldCxcImZcIikuZGVmYXVsdERlc2NyaXB0aW9uW3RdPWUuZGVmYXVsdERlc2NyaXB0aW9uKSxlLnNraXBWYWxpZGF0aW9uJiZ0aGlzLnNraXBWYWxpZGF0aW9uKHQpO2NvbnN0IG49ZS5kZXNjcmliZXx8ZS5kZXNjcmlwdGlvbnx8ZS5kZXNjLHI9dih0aGlzLHB0LFwiZlwiKS5nZXREZXNjcmlwdGlvbnMoKTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocix0KSYmXCJzdHJpbmdcIiE9dHlwZW9mIG58fHRoaXMuZGVzY3JpYmUodCxuKSxlLmhpZGRlbiYmdGhpcy5oaWRlKHQpLGUucmVxdWlyZXNBcmcmJnRoaXMucmVxdWlyZXNBcmcodCl9cmV0dXJuIHRoaXN9b3B0aW9ucyh0LGUpe3JldHVybiB0aGlzLm9wdGlvbih0LGUpfXBhcnNlKHQsZSxzKXtoKFwiW3N0cmluZ3xhcnJheV0gW2Z1bmN0aW9ufGJvb2xlYW58b2JqZWN0XSBbZnVuY3Rpb25dXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSx0aGlzW0N0XSgpLHZvaWQgMD09PXQmJih0PXYodGhpcyxodCxcImZcIikpLFwib2JqZWN0XCI9PXR5cGVvZiBlJiYoTyh0aGlzLHJ0LGUsXCJmXCIpLGU9cyksXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmKE8odGhpcyxudCxlLFwiZlwiKSxlPSExKSxlfHxPKHRoaXMsaHQsdCxcImZcIiksdih0aGlzLG50LFwiZlwiKSYmTyh0aGlzLFQsITEsXCJmXCIpO2NvbnN0IGk9dGhpc1tKdF0odCwhIWUpLG49dGhpcy5wYXJzZWQ7cmV0dXJuIHYodGhpcyxVLFwiZlwiKS5zZXRQYXJzZWQodGhpcy5wYXJzZWQpLGYoaSk/aS50aGVuKCh0PT4odih0aGlzLG50LFwiZlwiKSYmdih0aGlzLG50LFwiZlwiKS5jYWxsKHRoaXMsdih0aGlzLFYsXCJmXCIpLHQsdih0aGlzLHR0LFwiZlwiKSksdCkpKS5jYXRjaCgodD0+e3Rocm93IHYodGhpcyxudCxcImZcIikmJnYodGhpcyxudCxcImZcIikodCx0aGlzLnBhcnNlZC5hcmd2LHYodGhpcyx0dCxcImZcIikpLHR9KSkuZmluYWxseSgoKCk9Pnt0aGlzW0h0XSgpLHRoaXMucGFyc2VkPW59KSk6KHYodGhpcyxudCxcImZcIikmJnYodGhpcyxudCxcImZcIikuY2FsbCh0aGlzLHYodGhpcyxWLFwiZlwiKSxpLHYodGhpcyx0dCxcImZcIikpLHRoaXNbSHRdKCksdGhpcy5wYXJzZWQ9bixpKX1wYXJzZUFzeW5jKHQsZSxzKXtjb25zdCBpPXRoaXMucGFyc2UodCxlLHMpO3JldHVybiBmKGkpP2k6UHJvbWlzZS5yZXNvbHZlKGkpfXBhcnNlU3luYyh0LHMsaSl7Y29uc3Qgbj10aGlzLnBhcnNlKHQscyxpKTtpZihmKG4pKXRocm93IG5ldyBlKFwiLnBhcnNlU3luYygpIG11c3Qgbm90IGJlIHVzZWQgd2l0aCBhc3luY2hyb25vdXMgYnVpbGRlcnMsIGhhbmRsZXJzLCBvciBtaWRkbGV3YXJlXCIpO3JldHVybiBufXBhcnNlckNvbmZpZ3VyYXRpb24odCl7cmV0dXJuIGgoXCI8b2JqZWN0PlwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsaXQsdCxcImZcIiksdGhpc31wa2dDb25mKHQsZSl7aChcIjxzdHJpbmc+IFtzdHJpbmddXCIsW3QsZV0sYXJndW1lbnRzLmxlbmd0aCk7bGV0IHM9bnVsbDtjb25zdCBpPXRoaXNbQXRdKGV8fHYodGhpcyxXLFwiZlwiKSk7cmV0dXJuIGlbdF0mJlwib2JqZWN0XCI9PXR5cGVvZiBpW3RdJiYocz1uKGlbdF0sZXx8dih0aGlzLFcsXCJmXCIpLHRoaXNbTXRdKClbXCJkZWVwLW1lcmdlLWNvbmZpZ1wiXXx8ITEsdih0aGlzLGN0LFwiZlwiKSksdih0aGlzLGV0LFwiZlwiKS5jb25maWdPYmplY3RzPSh2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHN8fFtdKS5jb25jYXQocykpLHRoaXN9cG9zaXRpb25hbCh0LGUpe2goXCI8c3RyaW5nPiA8b2JqZWN0PlwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpO2NvbnN0IHM9W1wiZGVmYXVsdFwiLFwiZGVmYXVsdERlc2NyaXB0aW9uXCIsXCJpbXBsaWVzXCIsXCJub3JtYWxpemVcIixcImNob2ljZXNcIixcImNvbmZsaWN0c1wiLFwiY29lcmNlXCIsXCJ0eXBlXCIsXCJkZXNjcmliZVwiLFwiZGVzY1wiLFwiZGVzY3JpcHRpb25cIixcImFsaWFzXCJdO2U9ZyhlLCgodCxlKT0+IShcInR5cGVcIj09PXQmJiFbXCJzdHJpbmdcIixcIm51bWJlclwiLFwiYm9vbGVhblwiXS5pbmNsdWRlcyhlKSkmJnMuaW5jbHVkZXModCkpKTtjb25zdCBpPXYodGhpcyxxLFwiZlwiKS5mdWxsQ29tbWFuZHNbdih0aGlzLHEsXCJmXCIpLmZ1bGxDb21tYW5kcy5sZW5ndGgtMV0sbj1pP3YodGhpcyx6LFwiZlwiKS5jbWRUb1BhcnNlT3B0aW9ucyhpKTp7YXJyYXk6W10sYWxpYXM6e30sZGVmYXVsdDp7fSxkZW1hbmQ6e319O3JldHVybiBwKG4pLmZvckVhY2goKHM9Pntjb25zdCBpPW5bc107QXJyYXkuaXNBcnJheShpKT8tMSE9PWkuaW5kZXhPZih0KSYmKGVbc109ITApOmlbdF0mJiEocyBpbiBlKSYmKGVbc109aVt0XSl9KSksdGhpcy5ncm91cCh0LHYodGhpcyxwdCxcImZcIikuZ2V0UG9zaXRpb25hbEdyb3VwTmFtZSgpKSx0aGlzLm9wdGlvbih0LGUpfXJlY29tbWVuZENvbW1hbmRzKHQ9ITApe3JldHVybiBoKFwiW2Jvb2xlYW5dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLE8odGhpcyxsdCx0LFwiZlwiKSx0aGlzfXJlcXVpcmVkKHQsZSxzKXtyZXR1cm4gdGhpcy5kZW1hbmQodCxlLHMpfXJlcXVpcmUodCxlLHMpe3JldHVybiB0aGlzLmRlbWFuZCh0LGUscyl9cmVxdWlyZXNBcmcodCl7cmV0dXJuIGgoXCI8YXJyYXl8c3RyaW5nfG9iamVjdD4gW251bWJlcl1cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksXCJzdHJpbmdcIj09dHlwZW9mIHQmJnYodGhpcyxldCxcImZcIikubmFyZ1t0XXx8dGhpc1tTdF0odGhpcy5yZXF1aXJlc0FyZy5iaW5kKHRoaXMpLFwibmFyZ1wiLHQsTmFOKSx0aGlzfXNob3dDb21wbGV0aW9uU2NyaXB0KHQsZSl7cmV0dXJuIGgoXCJbc3RyaW5nXSBbc3RyaW5nXVwiLFt0LGVdLGFyZ3VtZW50cy5sZW5ndGgpLHQ9dHx8dGhpcy4kMCx2KHRoaXMsUSxcImZcIikubG9nKHYodGhpcyxVLFwiZlwiKS5nZW5lcmF0ZUNvbXBsZXRpb25TY3JpcHQodCxlfHx2KHRoaXMsRixcImZcIil8fFwiY29tcGxldGlvblwiKSksdGhpc31zaG93SGVscCh0KXtpZihoKFwiW3N0cmluZ3xmdW5jdGlvbl1cIixbdF0sYXJndW1lbnRzLmxlbmd0aCksTyh0aGlzLEosITAsXCJmXCIpLCF2KHRoaXMscHQsXCJmXCIpLmhhc0NhY2hlZEhlbHBNZXNzYWdlKCkpe2lmKCF0aGlzLnBhcnNlZCl7Y29uc3QgZT10aGlzW0p0XSh2KHRoaXMsaHQsXCJmXCIpLHZvaWQgMCx2b2lkIDAsMCwhMCk7aWYoZihlKSlyZXR1cm4gZS50aGVuKCgoKT0+e3YodGhpcyxwdCxcImZcIikuc2hvd0hlbHAodCl9KSksdGhpc31jb25zdCBlPXYodGhpcyx6LFwiZlwiKS5ydW5EZWZhdWx0QnVpbGRlck9uKHRoaXMpO2lmKGYoZSkpcmV0dXJuIGUudGhlbigoKCk9Pnt2KHRoaXMscHQsXCJmXCIpLnNob3dIZWxwKHQpfSkpLHRoaXN9cmV0dXJuIHYodGhpcyxwdCxcImZcIikuc2hvd0hlbHAodCksdGhpc31zY3JpcHROYW1lKHQpe3JldHVybiB0aGlzLmN1c3RvbVNjcmlwdE5hbWU9ITAsdGhpcy4kMD10LHRoaXN9c2hvd0hlbHBPbkZhaWwodCxlKXtyZXR1cm4gaChcIltib29sZWFufHN0cmluZ10gW3N0cmluZ11cIixbdCxlXSxhcmd1bWVudHMubGVuZ3RoKSx2KHRoaXMscHQsXCJmXCIpLnNob3dIZWxwT25GYWlsKHQsZSksdGhpc31zaG93VmVyc2lvbih0KXtyZXR1cm4gaChcIltzdHJpbmd8ZnVuY3Rpb25dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHYodGhpcyxwdCxcImZcIikuc2hvd1ZlcnNpb24odCksdGhpc31za2lwVmFsaWRhdGlvbih0KXtyZXR1cm4gaChcIjxhcnJheXxzdHJpbmc+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbUHRdKFwic2tpcFZhbGlkYXRpb25cIix0KSx0aGlzfXN0cmljdCh0KXtyZXR1cm4gaChcIltib29sZWFuXVwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsZnQsITEhPT10LFwiZlwiKSx0aGlzfXN0cmljdENvbW1hbmRzKHQpe3JldHVybiBoKFwiW2Jvb2xlYW5dXCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLE8odGhpcyxkdCwhMSE9PXQsXCJmXCIpLHRoaXN9c3RyaWN0T3B0aW9ucyh0KXtyZXR1cm4gaChcIltib29sZWFuXVwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsdXQsITEhPT10LFwiZlwiKSx0aGlzfXN0cmluZyh0KXtyZXR1cm4gaChcIjxhcnJheXxzdHJpbmc+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHRoaXNbUHRdKFwic3RyaW5nXCIsdCksdGhpc1tRdF0odCksdGhpc310ZXJtaW5hbFdpZHRoKCl7cmV0dXJuIGgoW10sMCksdih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLnN0ZENvbHVtbnN9dXBkYXRlTG9jYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVN0cmluZ3ModCl9dXBkYXRlU3RyaW5ncyh0KXtyZXR1cm4gaChcIjxvYmplY3Q+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLE8odGhpcyxHLCExLFwiZlwiKSx2KHRoaXMsY3QsXCJmXCIpLnkxOG4udXBkYXRlTG9jYWxlKHQpLHRoaXN9dXNhZ2UodCxzLGksbil7aWYoaChcIjxzdHJpbmd8bnVsbHx1bmRlZmluZWQ+IFtzdHJpbmd8Ym9vbGVhbl0gW2Z1bmN0aW9ufG9iamVjdF0gW2Z1bmN0aW9uXVwiLFt0LHMsaSxuXSxhcmd1bWVudHMubGVuZ3RoKSx2b2lkIDAhPT1zKXtpZihkKHQsbnVsbCx2KHRoaXMsY3QsXCJmXCIpKSwodHx8XCJcIikubWF0Y2goL15cXCQwKCB8JCkvKSlyZXR1cm4gdGhpcy5jb21tYW5kKHQscyxpLG4pO3Rocm93IG5ldyBlKFwiLnVzYWdlKCkgZGVzY3JpcHRpb24gbXVzdCBzdGFydCB3aXRoICQwIGlmIGJlaW5nIHVzZWQgYXMgYWxpYXMgZm9yIC5jb21tYW5kKClcIil9cmV0dXJuIHYodGhpcyxwdCxcImZcIikudXNhZ2UodCksdGhpc311c2FnZUNvbmZpZ3VyYXRpb24odCl7cmV0dXJuIGgoXCI8b2JqZWN0PlwiLFt0XSxhcmd1bWVudHMubGVuZ3RoKSxPKHRoaXMsZ3QsdCxcImZcIiksdGhpc312ZXJzaW9uKHQsZSxzKXtjb25zdCBpPVwidmVyc2lvblwiO2lmKGgoXCJbYm9vbGVhbnxzdHJpbmddIFtzdHJpbmddIFtzdHJpbmddXCIsW3QsZSxzXSxhcmd1bWVudHMubGVuZ3RoKSx2KHRoaXMsbXQsXCJmXCIpJiYodGhpc1tPdF0odih0aGlzLG10LFwiZlwiKSksdih0aGlzLHB0LFwiZlwiKS52ZXJzaW9uKHZvaWQgMCksTyh0aGlzLG10LG51bGwsXCJmXCIpKSwwPT09YXJndW1lbnRzLmxlbmd0aClzPXRoaXNbeHRdKCksdD1pO2Vsc2UgaWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKCExPT09dClyZXR1cm4gdGhpcztzPXQsdD1pfWVsc2UgMj09PWFyZ3VtZW50cy5sZW5ndGgmJihzPWUsZT12b2lkIDApO3JldHVybiBPKHRoaXMsbXQsXCJzdHJpbmdcIj09dHlwZW9mIHQ/dDppLFwiZlwiKSxlPWV8fHYodGhpcyxwdCxcImZcIikuZGVmZXJZMThuTG9va3VwKFwiU2hvdyB2ZXJzaW9uIG51bWJlclwiKSx2KHRoaXMscHQsXCJmXCIpLnZlcnNpb24oc3x8dm9pZCAwKSx0aGlzLmJvb2xlYW4odih0aGlzLG10LFwiZlwiKSksdGhpcy5kZXNjcmliZSh2KHRoaXMsbXQsXCJmXCIpLGUpLHRoaXN9d3JhcCh0KXtyZXR1cm4gaChcIjxudW1iZXJ8bnVsbHx1bmRlZmluZWQ+XCIsW3RdLGFyZ3VtZW50cy5sZW5ndGgpLHYodGhpcyxwdCxcImZcIikud3JhcCh0KSx0aGlzfVsoej1uZXcgV2Vha01hcCxXPW5ldyBXZWFrTWFwLHE9bmV3IFdlYWtNYXAsVT1uZXcgV2Vha01hcCxGPW5ldyBXZWFrTWFwLEw9bmV3IFdlYWtNYXAsVj1uZXcgV2Vha01hcCxHPW5ldyBXZWFrTWFwLFI9bmV3IFdlYWtNYXAsVD1uZXcgV2Vha01hcCxCPW5ldyBXZWFrTWFwLFk9bmV3IFdlYWtNYXAsSz1uZXcgV2Vha01hcCxKPW5ldyBXZWFrTWFwLFo9bmV3IFdlYWtNYXAsWD1uZXcgV2Vha01hcCxRPW5ldyBXZWFrTWFwLHR0PW5ldyBXZWFrTWFwLGV0PW5ldyBXZWFrTWFwLHN0PW5ldyBXZWFrTWFwLGl0PW5ldyBXZWFrTWFwLG50PW5ldyBXZWFrTWFwLHJ0PW5ldyBXZWFrTWFwLG90PW5ldyBXZWFrTWFwLGF0PW5ldyBXZWFrTWFwLGh0PW5ldyBXZWFrTWFwLGx0PW5ldyBXZWFrTWFwLGN0PW5ldyBXZWFrTWFwLGZ0PW5ldyBXZWFrTWFwLGR0PW5ldyBXZWFrTWFwLHV0PW5ldyBXZWFrTWFwLHB0PW5ldyBXZWFrTWFwLGd0PW5ldyBXZWFrTWFwLG10PW5ldyBXZWFrTWFwLHl0PW5ldyBXZWFrTWFwLGJ0KV0odCl7aWYoIXQuX3x8IXRbXCItLVwiXSlyZXR1cm4gdDt0Ll8ucHVzaC5hcHBseSh0Ll8sdFtcIi0tXCJdKTt0cnl7ZGVsZXRlIHRbXCItLVwiXX1jYXRjaCh0KXt9cmV0dXJuIHR9W3Z0XSgpe3JldHVybntsb2c6KC4uLnQpPT57dGhpc1tSdF0oKXx8Y29uc29sZS5sb2coLi4udCksTyh0aGlzLEosITAsXCJmXCIpLHYodGhpcyx0dCxcImZcIikubGVuZ3RoJiZPKHRoaXMsdHQsdih0aGlzLHR0LFwiZlwiKStcIlxcblwiLFwiZlwiKSxPKHRoaXMsdHQsdih0aGlzLHR0LFwiZlwiKSt0LmpvaW4oXCIgXCIpLFwiZlwiKX0sZXJyb3I6KC4uLnQpPT57dGhpc1tSdF0oKXx8Y29uc29sZS5lcnJvciguLi50KSxPKHRoaXMsSiwhMCxcImZcIiksdih0aGlzLHR0LFwiZlwiKS5sZW5ndGgmJk8odGhpcyx0dCx2KHRoaXMsdHQsXCJmXCIpK1wiXFxuXCIsXCJmXCIpLE8odGhpcyx0dCx2KHRoaXMsdHQsXCJmXCIpK3Quam9pbihcIiBcIiksXCJmXCIpfX19W090XSh0KXtwKHYodGhpcyxldCxcImZcIikpLmZvckVhY2goKGU9PntpZihcImNvbmZpZ09iamVjdHNcIj09PWUpcmV0dXJuO2NvbnN0IHM9dih0aGlzLGV0LFwiZlwiKVtlXTtBcnJheS5pc0FycmF5KHMpP3MuaW5jbHVkZXModCkmJnMuc3BsaWNlKHMuaW5kZXhPZih0KSwxKTpcIm9iamVjdFwiPT10eXBlb2YgcyYmZGVsZXRlIHNbdF19KSksZGVsZXRlIHYodGhpcyxwdCxcImZcIikuZ2V0RGVzY3JpcHRpb25zKClbdF19W3d0XSh0LGUscyl7dih0aGlzLFIsXCJmXCIpW3NdfHwodih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmVtaXRXYXJuaW5nKHQsZSksdih0aGlzLFIsXCJmXCIpW3NdPSEwKX1bQ3RdKCl7dih0aGlzLEIsXCJmXCIpLnB1c2goe29wdGlvbnM6dih0aGlzLGV0LFwiZlwiKSxjb25maWdPYmplY3RzOnYodGhpcyxldCxcImZcIikuY29uZmlnT2JqZWN0cy5zbGljZSgwKSxleGl0UHJvY2Vzczp2KHRoaXMsVCxcImZcIiksZ3JvdXBzOnYodGhpcyxLLFwiZlwiKSxzdHJpY3Q6dih0aGlzLGZ0LFwiZlwiKSxzdHJpY3RDb21tYW5kczp2KHRoaXMsZHQsXCJmXCIpLHN0cmljdE9wdGlvbnM6dih0aGlzLHV0LFwiZlwiKSxjb21wbGV0aW9uQ29tbWFuZDp2KHRoaXMsRixcImZcIiksb3V0cHV0OnYodGhpcyx0dCxcImZcIiksZXhpdEVycm9yOnYodGhpcyxWLFwiZlwiKSxoYXNPdXRwdXQ6dih0aGlzLEosXCJmXCIpLHBhcnNlZDp0aGlzLnBhcnNlZCxwYXJzZUZuOnYodGhpcyxudCxcImZcIikscGFyc2VDb250ZXh0OnYodGhpcyxydCxcImZcIil9KSx2KHRoaXMscHQsXCJmXCIpLmZyZWV6ZSgpLHYodGhpcyx5dCxcImZcIikuZnJlZXplKCksdih0aGlzLHosXCJmXCIpLmZyZWV6ZSgpLHYodGhpcyxZLFwiZlwiKS5mcmVlemUoKX1banRdKCl7bGV0IHQsZT1cIlwiO3JldHVybiB0PS9cXGIobm9kZXxpb2pzfGVsZWN0cm9uKShcXC5leGUpPyQvLnRlc3Qodih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmFyZ3YoKVswXSk/dih0aGlzLGN0LFwiZlwiKS5wcm9jZXNzLmFyZ3YoKS5zbGljZSgxLDIpOnYodGhpcyxjdCxcImZcIikucHJvY2Vzcy5hcmd2KCkuc2xpY2UoMCwxKSxlPXQubWFwKCh0PT57Y29uc3QgZT10aGlzW1l0XSh2KHRoaXMsVyxcImZcIiksdCk7cmV0dXJuIHQubWF0Y2goL14oXFwvfChbYS16QS1aXTopP1xcXFwpLykmJmUubGVuZ3RoPHQubGVuZ3RoP2U6dH0pKS5qb2luKFwiIFwiKS50cmltKCksdih0aGlzLGN0LFwiZlwiKS5nZXRFbnYoXCJfXCIpJiZ2KHRoaXMsY3QsXCJmXCIpLmdldFByb2Nlc3NBcmd2QmluKCk9PT12KHRoaXMsY3QsXCJmXCIpLmdldEVudihcIl9cIikmJihlPXYodGhpcyxjdCxcImZcIikuZ2V0RW52KFwiX1wiKS5yZXBsYWNlKGAke3YodGhpcyxjdCxcImZcIikucGF0aC5kaXJuYW1lKHYodGhpcyxjdCxcImZcIikucHJvY2Vzcy5leGVjUGF0aCgpKX0vYCxcIlwiKSksZX1bTXRdKCl7cmV0dXJuIHYodGhpcyxpdCxcImZcIil9W190XSgpe3JldHVybiB2KHRoaXMsZ3QsXCJmXCIpfVtrdF0oKXtpZighdih0aGlzLEcsXCJmXCIpKXJldHVybjtjb25zdCB0PXYodGhpcyxjdCxcImZcIikuZ2V0RW52KFwiTENfQUxMXCIpfHx2KHRoaXMsY3QsXCJmXCIpLmdldEVudihcIkxDX01FU1NBR0VTXCIpfHx2KHRoaXMsY3QsXCJmXCIpLmdldEVudihcIkxBTkdcIil8fHYodGhpcyxjdCxcImZcIikuZ2V0RW52KFwiTEFOR1VBR0VcIil8fFwiZW5fVVNcIjt0aGlzLmxvY2FsZSh0LnJlcGxhY2UoL1suOl0uKi8sXCJcIikpfVt4dF0oKXtyZXR1cm4gdGhpc1tBdF0oKS52ZXJzaW9ufHxcInVua25vd25cIn1bRXRdKHQpe2NvbnN0IGU9dFtcIi0tXCJdP3RbXCItLVwiXTp0Ll87Zm9yKGxldCB0LHM9MDt2b2lkIDAhPT0odD1lW3NdKTtzKyspdih0aGlzLGN0LFwiZlwiKS5QYXJzZXIubG9va3NMaWtlTnVtYmVyKHQpJiZOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dH1gKSkpJiYoZVtzXT1OdW1iZXIodCkpO3JldHVybiB0fVtBdF0odCl7Y29uc3QgZT10fHxcIipcIjtpZih2KHRoaXMsb3QsXCJmXCIpW2VdKXJldHVybiB2KHRoaXMsb3QsXCJmXCIpW2VdO2xldCBzPXt9O3RyeXtsZXQgZT10fHx2KHRoaXMsY3QsXCJmXCIpLm1haW5GaWxlbmFtZTshdCYmdih0aGlzLGN0LFwiZlwiKS5wYXRoLmV4dG5hbWUoZSkmJihlPXYodGhpcyxjdCxcImZcIikucGF0aC5kaXJuYW1lKGUpKTtjb25zdCBpPXYodGhpcyxjdCxcImZcIikuZmluZFVwKGUsKCh0LGUpPT5lLmluY2x1ZGVzKFwicGFja2FnZS5qc29uXCIpP1wicGFja2FnZS5qc29uXCI6dm9pZCAwKSk7ZChpLHZvaWQgMCx2KHRoaXMsY3QsXCJmXCIpKSxzPUpTT04ucGFyc2Uodih0aGlzLGN0LFwiZlwiKS5yZWFkRmlsZVN5bmMoaSxcInV0ZjhcIikpfWNhdGNoKHQpe31yZXR1cm4gdih0aGlzLG90LFwiZlwiKVtlXT1zfHx7fSx2KHRoaXMsb3QsXCJmXCIpW2VdfVtQdF0odCxlKXsoZT1bXS5jb25jYXQoZSkpLmZvckVhY2goKGU9PntlPXRoaXNbRHRdKGUpLHYodGhpcyxldCxcImZcIilbdF0ucHVzaChlKX0pKX1bU3RdKHQsZSxzLGkpe3RoaXNbSXRdKHQsZSxzLGksKCh0LGUscyk9Pnt2KHRoaXMsZXQsXCJmXCIpW3RdW2VdPXN9KSl9WyR0XSh0LGUscyxpKXt0aGlzW0l0XSh0LGUscyxpLCgodCxlLHMpPT57dih0aGlzLGV0LFwiZlwiKVt0XVtlXT0odih0aGlzLGV0LFwiZlwiKVt0XVtlXXx8W10pLmNvbmNhdChzKX0pKX1bSXRdKHQsZSxzLGksbil7aWYoQXJyYXkuaXNBcnJheShzKSlzLmZvckVhY2goKGU9Pnt0KGUsaSl9KSk7ZWxzZSBpZigodD0+XCJvYmplY3RcIj09dHlwZW9mIHQpKHMpKWZvcihjb25zdCBlIG9mIHAocykpdChlLHNbZV0pO2Vsc2UgbihlLHRoaXNbRHRdKHMpLGkpfVtEdF0odCl7cmV0dXJuXCJfX3Byb3RvX19cIj09PXQ/XCJfX19wcm90b19fX1wiOnR9W050XSh0LGUpe3JldHVybiB0aGlzW1N0XSh0aGlzW050XS5iaW5kKHRoaXMpLFwia2V5XCIsdCxlKSx0aGlzfVtIdF0oKXt2YXIgdCxlLHMsaSxuLHIsbyxhLGgsbCxjLGY7Y29uc3QgdT12KHRoaXMsQixcImZcIikucG9wKCk7bGV0IHA7ZCh1LHZvaWQgMCx2KHRoaXMsY3QsXCJmXCIpKSx0PXRoaXMsZT10aGlzLHM9dGhpcyxpPXRoaXMsbj10aGlzLHI9dGhpcyxvPXRoaXMsYT10aGlzLGg9dGhpcyxsPXRoaXMsYz10aGlzLGY9dGhpcywoe29wdGlvbnM6e3NldCB2YWx1ZShlKXtPKHQsZXQsZSxcImZcIil9fS52YWx1ZSxjb25maWdPYmplY3RzOnAsZXhpdFByb2Nlc3M6e3NldCB2YWx1ZSh0KXtPKGUsVCx0LFwiZlwiKX19LnZhbHVlLGdyb3Vwczp7c2V0IHZhbHVlKHQpe08ocyxLLHQsXCJmXCIpfX0udmFsdWUsb3V0cHV0OntzZXQgdmFsdWUodCl7TyhpLHR0LHQsXCJmXCIpfX0udmFsdWUsZXhpdEVycm9yOntzZXQgdmFsdWUodCl7TyhuLFYsdCxcImZcIil9fS52YWx1ZSxoYXNPdXRwdXQ6e3NldCB2YWx1ZSh0KXtPKHIsSix0LFwiZlwiKX19LnZhbHVlLHBhcnNlZDp0aGlzLnBhcnNlZCxzdHJpY3Q6e3NldCB2YWx1ZSh0KXtPKG8sZnQsdCxcImZcIil9fS52YWx1ZSxzdHJpY3RDb21tYW5kczp7c2V0IHZhbHVlKHQpe08oYSxkdCx0LFwiZlwiKX19LnZhbHVlLHN0cmljdE9wdGlvbnM6e3NldCB2YWx1ZSh0KXtPKGgsdXQsdCxcImZcIil9fS52YWx1ZSxjb21wbGV0aW9uQ29tbWFuZDp7c2V0IHZhbHVlKHQpe08obCxGLHQsXCJmXCIpfX0udmFsdWUscGFyc2VGbjp7c2V0IHZhbHVlKHQpe08oYyxudCx0LFwiZlwiKX19LnZhbHVlLHBhcnNlQ29udGV4dDp7c2V0IHZhbHVlKHQpe08oZixydCx0LFwiZlwiKX19LnZhbHVlfT11KSx2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHM9cCx2KHRoaXMscHQsXCJmXCIpLnVuZnJlZXplKCksdih0aGlzLHl0LFwiZlwiKS51bmZyZWV6ZSgpLHYodGhpcyx6LFwiZlwiKS51bmZyZWV6ZSgpLHYodGhpcyxZLFwiZlwiKS51bmZyZWV6ZSgpfVt6dF0odCxlKXtyZXR1cm4gaihlLChlPT4odChlKSxlKSkpfWdldEludGVybmFsTWV0aG9kcygpe3JldHVybntnZXRDb21tYW5kSW5zdGFuY2U6dGhpc1tXdF0uYmluZCh0aGlzKSxnZXRDb250ZXh0OnRoaXNbcXRdLmJpbmQodGhpcyksZ2V0SGFzT3V0cHV0OnRoaXNbVXRdLmJpbmQodGhpcyksZ2V0TG9nZ2VySW5zdGFuY2U6dGhpc1tGdF0uYmluZCh0aGlzKSxnZXRQYXJzZUNvbnRleHQ6dGhpc1tMdF0uYmluZCh0aGlzKSxnZXRQYXJzZXJDb25maWd1cmF0aW9uOnRoaXNbTXRdLmJpbmQodGhpcyksZ2V0VXNhZ2VDb25maWd1cmF0aW9uOnRoaXNbX3RdLmJpbmQodGhpcyksZ2V0VXNhZ2VJbnN0YW5jZTp0aGlzW1Z0XS5iaW5kKHRoaXMpLGdldFZhbGlkYXRpb25JbnN0YW5jZTp0aGlzW0d0XS5iaW5kKHRoaXMpLGhhc1BhcnNlQ2FsbGJhY2s6dGhpc1tSdF0uYmluZCh0aGlzKSxpc0dsb2JhbENvbnRleHQ6dGhpc1tUdF0uYmluZCh0aGlzKSxwb3N0UHJvY2Vzczp0aGlzW0J0XS5iaW5kKHRoaXMpLHJlc2V0OnRoaXNbS3RdLmJpbmQodGhpcykscnVuVmFsaWRhdGlvbjp0aGlzW1p0XS5iaW5kKHRoaXMpLHJ1bllhcmdzUGFyc2VyQW5kRXhlY3V0ZUNvbW1hbmRzOnRoaXNbSnRdLmJpbmQodGhpcyksc2V0SGFzT3V0cHV0OnRoaXNbWHRdLmJpbmQodGhpcyl9fVtXdF0oKXtyZXR1cm4gdih0aGlzLHosXCJmXCIpfVtxdF0oKXtyZXR1cm4gdih0aGlzLHEsXCJmXCIpfVtVdF0oKXtyZXR1cm4gdih0aGlzLEosXCJmXCIpfVtGdF0oKXtyZXR1cm4gdih0aGlzLFEsXCJmXCIpfVtMdF0oKXtyZXR1cm4gdih0aGlzLHJ0LFwiZlwiKXx8e319W1Z0XSgpe3JldHVybiB2KHRoaXMscHQsXCJmXCIpfVtHdF0oKXtyZXR1cm4gdih0aGlzLHl0LFwiZlwiKX1bUnRdKCl7cmV0dXJuISF2KHRoaXMsbnQsXCJmXCIpfVtUdF0oKXtyZXR1cm4gdih0aGlzLFgsXCJmXCIpfVtCdF0odCxlLHMsaSl7aWYocylyZXR1cm4gdDtpZihmKHQpKXJldHVybiB0O2V8fCh0PXRoaXNbYnRdKHQpKTtyZXR1cm4odGhpc1tNdF0oKVtcInBhcnNlLXBvc2l0aW9uYWwtbnVtYmVyc1wiXXx8dm9pZCAwPT09dGhpc1tNdF0oKVtcInBhcnNlLXBvc2l0aW9uYWwtbnVtYmVyc1wiXSkmJih0PXRoaXNbRXRdKHQpKSxpJiYodD1DKHQsdGhpcyx2KHRoaXMsWSxcImZcIikuZ2V0TWlkZGxld2FyZSgpLCExKSksdH1bS3RdKHQ9e30pe08odGhpcyxldCx2KHRoaXMsZXQsXCJmXCIpfHx7fSxcImZcIik7Y29uc3QgZT17fTtlLmxvY2FsPXYodGhpcyxldCxcImZcIikubG9jYWx8fFtdLGUuY29uZmlnT2JqZWN0cz12KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ09iamVjdHN8fFtdO2NvbnN0IHM9e307ZS5sb2NhbC5mb3JFYWNoKChlPT57c1tlXT0hMCwodFtlXXx8W10pLmZvckVhY2goKHQ9PntzW3RdPSEwfSkpfSkpLE9iamVjdC5hc3NpZ24odih0aGlzLGF0LFwiZlwiKSxPYmplY3Qua2V5cyh2KHRoaXMsSyxcImZcIikpLnJlZHVjZSgoKHQsZSk9Pntjb25zdCBpPXYodGhpcyxLLFwiZlwiKVtlXS5maWx0ZXIoKHQ9PiEodCBpbiBzKSkpO3JldHVybiBpLmxlbmd0aD4wJiYodFtlXT1pKSx0fSkse30pKSxPKHRoaXMsSyx7fSxcImZcIik7cmV0dXJuW1wiYXJyYXlcIixcImJvb2xlYW5cIixcInN0cmluZ1wiLFwic2tpcFZhbGlkYXRpb25cIixcImNvdW50XCIsXCJub3JtYWxpemVcIixcIm51bWJlclwiLFwiaGlkZGVuT3B0aW9uc1wiXS5mb3JFYWNoKCh0PT57ZVt0XT0odih0aGlzLGV0LFwiZlwiKVt0XXx8W10pLmZpbHRlcigodD0+IXNbdF0pKX0pKSxbXCJuYXJnXCIsXCJrZXlcIixcImFsaWFzXCIsXCJkZWZhdWx0XCIsXCJkZWZhdWx0RGVzY3JpcHRpb25cIixcImNvbmZpZ1wiLFwiY2hvaWNlc1wiLFwiZGVtYW5kZWRPcHRpb25zXCIsXCJkZW1hbmRlZENvbW1hbmRzXCIsXCJkZXByZWNhdGVkT3B0aW9uc1wiXS5mb3JFYWNoKCh0PT57ZVt0XT1nKHYodGhpcyxldCxcImZcIilbdF0sKHQ9PiFzW3RdKSl9KSksZS5lbnZQcmVmaXg9dih0aGlzLGV0LFwiZlwiKS5lbnZQcmVmaXgsTyh0aGlzLGV0LGUsXCJmXCIpLE8odGhpcyxwdCx2KHRoaXMscHQsXCJmXCIpP3YodGhpcyxwdCxcImZcIikucmVzZXQocyk6UCh0aGlzLHYodGhpcyxjdCxcImZcIikpLFwiZlwiKSxPKHRoaXMseXQsdih0aGlzLHl0LFwiZlwiKT92KHRoaXMseXQsXCJmXCIpLnJlc2V0KHMpOmZ1bmN0aW9uKHQsZSxzKXtjb25zdCBpPXMueTE4bi5fXyxuPXMueTE4bi5fX24scj17bm9uT3B0aW9uQ291bnQ6ZnVuY3Rpb24ocyl7Y29uc3QgaT10LmdldERlbWFuZGVkQ29tbWFuZHMoKSxyPXMuXy5sZW5ndGgrKHNbXCItLVwiXT9zW1wiLS1cIl0ubGVuZ3RoOjApLXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29udGV4dCgpLmNvbW1hbmRzLmxlbmd0aDtpLl8mJihyPGkuXy5taW58fHI+aS5fLm1heCkmJihyPGkuXy5taW4/dm9pZCAwIT09aS5fLm1pbk1zZz9lLmZhaWwoaS5fLm1pbk1zZz9pLl8ubWluTXNnLnJlcGxhY2UoL1xcJDAvZyxyLnRvU3RyaW5nKCkpLnJlcGxhY2UoL1xcJDEvLGkuXy5taW4udG9TdHJpbmcoKSk6bnVsbCk6ZS5mYWlsKG4oXCJOb3QgZW5vdWdoIG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG5lZWQgYXQgbGVhc3QgJXNcIixcIk5vdCBlbm91Z2ggbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbmVlZCBhdCBsZWFzdCAlc1wiLHIsci50b1N0cmluZygpLGkuXy5taW4udG9TdHJpbmcoKSkpOnI+aS5fLm1heCYmKHZvaWQgMCE9PWkuXy5tYXhNc2c/ZS5mYWlsKGkuXy5tYXhNc2c/aS5fLm1heE1zZy5yZXBsYWNlKC9cXCQwL2csci50b1N0cmluZygpKS5yZXBsYWNlKC9cXCQxLyxpLl8ubWF4LnRvU3RyaW5nKCkpOm51bGwpOmUuZmFpbChuKFwiVG9vIG1hbnkgbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbWF4aW11bSBvZiAlc1wiLFwiVG9vIG1hbnkgbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbWF4aW11bSBvZiAlc1wiLHIsci50b1N0cmluZygpLGkuXy5tYXgudG9TdHJpbmcoKSkpKSl9LHBvc2l0aW9uYWxDb3VudDpmdW5jdGlvbih0LHMpe3M8dCYmZS5mYWlsKG4oXCJOb3QgZW5vdWdoIG5vbi1vcHRpb24gYXJndW1lbnRzOiBnb3QgJXMsIG5lZWQgYXQgbGVhc3QgJXNcIixcIk5vdCBlbm91Z2ggbm9uLW9wdGlvbiBhcmd1bWVudHM6IGdvdCAlcywgbmVlZCBhdCBsZWFzdCAlc1wiLHMscytcIlwiLHQrXCJcIikpfSxyZXF1aXJlZEFyZ3VtZW50czpmdW5jdGlvbih0LHMpe2xldCBpPW51bGw7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXMocykpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSkmJnZvaWQgMCE9PXRbZV18fChpPWl8fHt9LGlbZV09c1tlXSk7aWYoaSl7Y29uc3QgdD1bXTtmb3IoY29uc3QgZSBvZiBPYmplY3Qua2V5cyhpKSl7Y29uc3Qgcz1pW2VdO3MmJnQuaW5kZXhPZihzKTwwJiZ0LnB1c2gocyl9Y29uc3Qgcz10Lmxlbmd0aD9gXFxuJHt0LmpvaW4oXCJcXG5cIil9YDpcIlwiO2UuZmFpbChuKFwiTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudDogJXNcIixcIk1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnRzOiAlc1wiLE9iamVjdC5rZXlzKGkpLmxlbmd0aCxPYmplY3Qua2V5cyhpKS5qb2luKFwiLCBcIikrcykpfX0sdW5rbm93bkFyZ3VtZW50czpmdW5jdGlvbihzLGksbyxhLGg9ITApe3ZhciBsO2NvbnN0IGM9dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb21tYW5kSW5zdGFuY2UoKS5nZXRDb21tYW5kcygpLGY9W10sZD10LmdldEludGVybmFsTWV0aG9kcygpLmdldENvbnRleHQoKTtpZihPYmplY3Qua2V5cyhzKS5mb3JFYWNoKChlPT57SC5pbmNsdWRlcyhlKXx8T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sZSl8fE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlQ29udGV4dCgpLGUpfHxyLmlzVmFsaWRBbmRTb21lQWxpYXNJc05vdE5ldyhlLGkpfHxmLnB1c2goZSl9KSksaCYmKGQuY29tbWFuZHMubGVuZ3RoPjB8fGMubGVuZ3RoPjB8fGEpJiZzLl8uc2xpY2UoZC5jb21tYW5kcy5sZW5ndGgpLmZvckVhY2goKHQ9PntjLmluY2x1ZGVzKFwiXCIrdCl8fGYucHVzaChcIlwiK3QpfSkpLGgpe2NvbnN0IGU9KG51bGw9PT0obD10LmdldERlbWFuZGVkQ29tbWFuZHMoKS5fKXx8dm9pZCAwPT09bD92b2lkIDA6bC5tYXgpfHwwLGk9ZC5jb21tYW5kcy5sZW5ndGgrZTtpPHMuXy5sZW5ndGgmJnMuXy5zbGljZShpKS5mb3JFYWNoKCh0PT57dD1TdHJpbmcodCksZC5jb21tYW5kcy5pbmNsdWRlcyh0KXx8Zi5pbmNsdWRlcyh0KXx8Zi5wdXNoKHQpfSkpfWYubGVuZ3RoJiZlLmZhaWwobihcIlVua25vd24gYXJndW1lbnQ6ICVzXCIsXCJVbmtub3duIGFyZ3VtZW50czogJXNcIixmLmxlbmd0aCxmLm1hcCgodD0+dC50cmltKCk/dDpgXCIke3R9XCJgKSkuam9pbihcIiwgXCIpKSl9LHVua25vd25Db21tYW5kczpmdW5jdGlvbihzKXtjb25zdCBpPXQuZ2V0SW50ZXJuYWxNZXRob2RzKCkuZ2V0Q29tbWFuZEluc3RhbmNlKCkuZ2V0Q29tbWFuZHMoKSxyPVtdLG89dC5nZXRJbnRlcm5hbE1ldGhvZHMoKS5nZXRDb250ZXh0KCk7cmV0dXJuKG8uY29tbWFuZHMubGVuZ3RoPjB8fGkubGVuZ3RoPjApJiZzLl8uc2xpY2Uoby5jb21tYW5kcy5sZW5ndGgpLmZvckVhY2goKHQ9PntpLmluY2x1ZGVzKFwiXCIrdCl8fHIucHVzaChcIlwiK3QpfSkpLHIubGVuZ3RoPjAmJihlLmZhaWwobihcIlVua25vd24gY29tbWFuZDogJXNcIixcIlVua25vd24gY29tbWFuZHM6ICVzXCIsci5sZW5ndGgsci5qb2luKFwiLCBcIikpKSwhMCl9LGlzVmFsaWRBbmRTb21lQWxpYXNJc05vdE5ldzpmdW5jdGlvbihlLHMpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyxlKSlyZXR1cm4hMTtjb25zdCBpPXQucGFyc2VkLm5ld0FsaWFzZXM7cmV0dXJuW2UsLi4uc1tlXV0uc29tZSgodD0+IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLHQpfHwhaVtlXSkpfSxsaW1pdGVkQ2hvaWNlczpmdW5jdGlvbihzKXtjb25zdCBuPXQuZ2V0T3B0aW9ucygpLHI9e307aWYoIU9iamVjdC5rZXlzKG4uY2hvaWNlcykubGVuZ3RoKXJldHVybjtPYmplY3Qua2V5cyhzKS5mb3JFYWNoKCh0PT57LTE9PT1ILmluZGV4T2YodCkmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLmNob2ljZXMsdCkmJltdLmNvbmNhdChzW3RdKS5mb3JFYWNoKChlPT57LTE9PT1uLmNob2ljZXNbdF0uaW5kZXhPZihlKSYmdm9pZCAwIT09ZSYmKHJbdF09KHJbdF18fFtdKS5jb25jYXQoZSkpfSkpfSkpO2NvbnN0IG89T2JqZWN0LmtleXMocik7aWYoIW8ubGVuZ3RoKXJldHVybjtsZXQgYT1pKFwiSW52YWxpZCB2YWx1ZXM6XCIpO28uZm9yRWFjaCgodD0+e2ErPWBcXG4gICR7aShcIkFyZ3VtZW50OiAlcywgR2l2ZW46ICVzLCBDaG9pY2VzOiAlc1wiLHQsZS5zdHJpbmdpZmllZFZhbHVlcyhyW3RdKSxlLnN0cmluZ2lmaWVkVmFsdWVzKG4uY2hvaWNlc1t0XSkpfWB9KSksZS5mYWlsKGEpfX07bGV0IG89e307ZnVuY3Rpb24gYSh0LGUpe2NvbnN0IHM9TnVtYmVyKGUpO3JldHVyblwibnVtYmVyXCI9PXR5cGVvZihlPWlzTmFOKHMpP2U6cyk/ZT10Ll8ubGVuZ3RoPj1lOmUubWF0Y2goL14tLW5vLS4rLyk/KGU9ZS5tYXRjaCgvXi0tbm8tKC4rKS8pWzFdLGU9IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpKTplPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpLGV9ci5pbXBsaWVzPWZ1bmN0aW9uKGUsaSl7aChcIjxzdHJpbmd8b2JqZWN0PiBbYXJyYXl8bnVtYmVyfHN0cmluZ11cIixbZSxpXSxhcmd1bWVudHMubGVuZ3RoKSxcIm9iamVjdFwiPT10eXBlb2YgZT9PYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0PT57ci5pbXBsaWVzKHQsZVt0XSl9KSk6KHQuZ2xvYmFsKGUpLG9bZV18fChvW2VdPVtdKSxBcnJheS5pc0FycmF5KGkpP2kuZm9yRWFjaCgodD0+ci5pbXBsaWVzKGUsdCkpKTooZChpLHZvaWQgMCxzKSxvW2VdLnB1c2goaSkpKX0sci5nZXRJbXBsaWVkPWZ1bmN0aW9uKCl7cmV0dXJuIG99LHIuaW1wbGljYXRpb25zPWZ1bmN0aW9uKHQpe2NvbnN0IHM9W107aWYoT2JqZWN0LmtleXMobykuZm9yRWFjaCgoZT0+e2NvbnN0IGk9ZTsob1tlXXx8W10pLmZvckVhY2goKGU9PntsZXQgbj1pO2NvbnN0IHI9ZTtuPWEodCxuKSxlPWEodCxlKSxuJiYhZSYmcy5wdXNoKGAgJHtpfSAtPiAke3J9YCl9KSl9KSkscy5sZW5ndGgpe2xldCB0PWAke2koXCJJbXBsaWNhdGlvbnMgZmFpbGVkOlwiKX1cXG5gO3MuZm9yRWFjaCgoZT0+e3QrPWV9KSksZS5mYWlsKHQpfX07bGV0IGw9e307ci5jb25mbGljdHM9ZnVuY3Rpb24oZSxzKXtoKFwiPHN0cmluZ3xvYmplY3Q+IFthcnJheXxzdHJpbmddXCIsW2Usc10sYXJndW1lbnRzLmxlbmd0aCksXCJvYmplY3RcIj09dHlwZW9mIGU/T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e3IuY29uZmxpY3RzKHQsZVt0XSl9KSk6KHQuZ2xvYmFsKGUpLGxbZV18fChsW2VdPVtdKSxBcnJheS5pc0FycmF5KHMpP3MuZm9yRWFjaCgodD0+ci5jb25mbGljdHMoZSx0KSkpOmxbZV0ucHVzaChzKSl9LHIuZ2V0Q29uZmxpY3Rpbmc9KCk9Pmwsci5jb25mbGljdGluZz1mdW5jdGlvbihuKXtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKCh0PT57bFt0XSYmbFt0XS5mb3JFYWNoKChzPT57cyYmdm9pZCAwIT09blt0XSYmdm9pZCAwIT09bltzXSYmZS5mYWlsKGkoXCJBcmd1bWVudHMgJXMgYW5kICVzIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIix0LHMpKX0pKX0pKSx0LmdldEludGVybmFsTWV0aG9kcygpLmdldFBhcnNlckNvbmZpZ3VyYXRpb24oKVtcInN0cmlwLWRhc2hlZFwiXSYmT2JqZWN0LmtleXMobCkuZm9yRWFjaCgodD0+e2xbdF0uZm9yRWFjaCgocj0+e3ImJnZvaWQgMCE9PW5bcy5QYXJzZXIuY2FtZWxDYXNlKHQpXSYmdm9pZCAwIT09bltzLlBhcnNlci5jYW1lbENhc2UocildJiZlLmZhaWwoaShcIkFyZ3VtZW50cyAlcyBhbmQgJXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiLHQscikpfSkpfSkpfSxyLnJlY29tbWVuZENvbW1hbmRzPWZ1bmN0aW9uKHQscyl7cz1zLnNvcnQoKCh0LGUpPT5lLmxlbmd0aC10Lmxlbmd0aCkpO2xldCBuPW51bGwscj0xLzA7Zm9yKGxldCBlLGk9MDt2b2lkIDAhPT0oZT1zW2ldKTtpKyspe2NvbnN0IHM9Tih0LGUpO3M8PTMmJnM8ciYmKHI9cyxuPWUpfW4mJmUuZmFpbChpKFwiRGlkIHlvdSBtZWFuICVzP1wiLG4pKX0sci5yZXNldD1mdW5jdGlvbih0KXtyZXR1cm4gbz1nKG8sKGU9PiF0W2VdKSksbD1nKGwsKGU9PiF0W2VdKSkscn07Y29uc3QgYz1bXTtyZXR1cm4gci5mcmVlemU9ZnVuY3Rpb24oKXtjLnB1c2goe2ltcGxpZWQ6byxjb25mbGljdGluZzpsfSl9LHIudW5mcmVlemU9ZnVuY3Rpb24oKXtjb25zdCB0PWMucG9wKCk7ZCh0LHZvaWQgMCxzKSwoe2ltcGxpZWQ6byxjb25mbGljdGluZzpsfT10KX0scn0odGhpcyx2KHRoaXMscHQsXCJmXCIpLHYodGhpcyxjdCxcImZcIikpLFwiZlwiKSxPKHRoaXMseix2KHRoaXMseixcImZcIik/dih0aGlzLHosXCJmXCIpLnJlc2V0KCk6ZnVuY3Rpb24odCxlLHMsaSl7cmV0dXJuIG5ldyBfKHQsZSxzLGkpfSh2KHRoaXMscHQsXCJmXCIpLHYodGhpcyx5dCxcImZcIiksdih0aGlzLFksXCJmXCIpLHYodGhpcyxjdCxcImZcIikpLFwiZlwiKSx2KHRoaXMsVSxcImZcIil8fE8odGhpcyxVLGZ1bmN0aW9uKHQsZSxzLGkpe3JldHVybiBuZXcgRCh0LGUscyxpKX0odGhpcyx2KHRoaXMscHQsXCJmXCIpLHYodGhpcyx6LFwiZlwiKSx2KHRoaXMsY3QsXCJmXCIpKSxcImZcIiksdih0aGlzLFksXCJmXCIpLnJlc2V0KCksTyh0aGlzLEYsbnVsbCxcImZcIiksTyh0aGlzLHR0LFwiXCIsXCJmXCIpLE8odGhpcyxWLG51bGwsXCJmXCIpLE8odGhpcyxKLCExLFwiZlwiKSx0aGlzLnBhcnNlZD0hMSx0aGlzfVtZdF0odCxlKXtyZXR1cm4gdih0aGlzLGN0LFwiZlwiKS5wYXRoLnJlbGF0aXZlKHQsZSl9W0p0XSh0LHMsaSxuPTAscj0hMSl7bGV0IG89ISFpfHxyO3Q9dHx8dih0aGlzLGh0LFwiZlwiKSx2KHRoaXMsZXQsXCJmXCIpLl9fPXYodGhpcyxjdCxcImZcIikueTE4bi5fXyx2KHRoaXMsZXQsXCJmXCIpLmNvbmZpZ3VyYXRpb249dGhpc1tNdF0oKTtjb25zdCBhPSEhdih0aGlzLGV0LFwiZlwiKS5jb25maWd1cmF0aW9uW1wicG9wdWxhdGUtLVwiXSxoPU9iamVjdC5hc3NpZ24oe30sdih0aGlzLGV0LFwiZlwiKS5jb25maWd1cmF0aW9uLHtcInBvcHVsYXRlLS1cIjohMH0pLGw9dih0aGlzLGN0LFwiZlwiKS5QYXJzZXIuZGV0YWlsZWQodCxPYmplY3QuYXNzaWduKHt9LHYodGhpcyxldCxcImZcIikse2NvbmZpZ3VyYXRpb246e1wicGFyc2UtcG9zaXRpb25hbC1udW1iZXJzXCI6ITEsLi4uaH19KSksYz1PYmplY3QuYXNzaWduKGwuYXJndix2KHRoaXMscnQsXCJmXCIpKTtsZXQgZDtjb25zdCB1PWwuYWxpYXNlcztsZXQgcD0hMSxnPSExO09iamVjdC5rZXlzKGMpLmZvckVhY2goKHQ9Pnt0PT09dih0aGlzLFosXCJmXCIpJiZjW3RdP3A9ITA6dD09PXYodGhpcyxtdCxcImZcIikmJmNbdF0mJihnPSEwKX0pKSxjLiQwPXRoaXMuJDAsdGhpcy5wYXJzZWQ9bCwwPT09biYmdih0aGlzLHB0LFwiZlwiKS5jbGVhckNhY2hlZEhlbHBNZXNzYWdlKCk7dHJ5e2lmKHRoaXNba3RdKCkscylyZXR1cm4gdGhpc1tCdF0oYyxhLCEhaSwhMSk7aWYodih0aGlzLFosXCJmXCIpKXtbdih0aGlzLFosXCJmXCIpXS5jb25jYXQodVt2KHRoaXMsWixcImZcIildfHxbXSkuZmlsdGVyKCh0PT50Lmxlbmd0aD4xKSkuaW5jbHVkZXMoXCJcIitjLl9bYy5fLmxlbmd0aC0xXSkmJihjLl8ucG9wKCkscD0hMCl9Tyh0aGlzLFgsITEsXCJmXCIpO2NvbnN0IGg9dih0aGlzLHosXCJmXCIpLmdldENvbW1hbmRzKCksbT12KHRoaXMsVSxcImZcIikuY29tcGxldGlvbktleSBpbiBjLHk9cHx8bXx8cjtpZihjLl8ubGVuZ3RoKXtpZihoLmxlbmd0aCl7bGV0IHQ7Zm9yKGxldCBlLHM9bnx8MDt2b2lkIDAhPT1jLl9bc107cysrKXtpZihlPVN0cmluZyhjLl9bc10pLGguaW5jbHVkZXMoZSkmJmUhPT12KHRoaXMsRixcImZcIikpe2NvbnN0IHQ9dih0aGlzLHosXCJmXCIpLnJ1bkNvbW1hbmQoZSx0aGlzLGwscysxLHIscHx8Z3x8cik7cmV0dXJuIHRoaXNbQnRdKHQsYSwhIWksITEpfWlmKCF0JiZlIT09dih0aGlzLEYsXCJmXCIpKXt0PWU7YnJlYWt9fSF2KHRoaXMseixcImZcIikuaGFzRGVmYXVsdENvbW1hbmQoKSYmdih0aGlzLGx0LFwiZlwiKSYmdCYmIXkmJnYodGhpcyx5dCxcImZcIikucmVjb21tZW5kQ29tbWFuZHModCxoKX12KHRoaXMsRixcImZcIikmJmMuXy5pbmNsdWRlcyh2KHRoaXMsRixcImZcIikpJiYhbSYmKHYodGhpcyxULFwiZlwiKSYmRSghMCksdGhpcy5zaG93Q29tcGxldGlvblNjcmlwdCgpLHRoaXMuZXhpdCgwKSl9aWYodih0aGlzLHosXCJmXCIpLmhhc0RlZmF1bHRDb21tYW5kKCkmJiF5KXtjb25zdCB0PXYodGhpcyx6LFwiZlwiKS5ydW5Db21tYW5kKG51bGwsdGhpcyxsLDAscixwfHxnfHxyKTtyZXR1cm4gdGhpc1tCdF0odCxhLCEhaSwhMSl9aWYobSl7dih0aGlzLFQsXCJmXCIpJiZFKCEwKTtjb25zdCBzPSh0PVtdLmNvbmNhdCh0KSkuc2xpY2UodC5pbmRleE9mKGAtLSR7dih0aGlzLFUsXCJmXCIpLmNvbXBsZXRpb25LZXl9YCkrMSk7cmV0dXJuIHYodGhpcyxVLFwiZlwiKS5nZXRDb21wbGV0aW9uKHMsKCh0LHMpPT57aWYodCl0aHJvdyBuZXcgZSh0Lm1lc3NhZ2UpOyhzfHxbXSkuZm9yRWFjaCgodD0+e3YodGhpcyxRLFwiZlwiKS5sb2codCl9KSksdGhpcy5leGl0KDApfSkpLHRoaXNbQnRdKGMsIWEsISFpLCExKX1pZih2KHRoaXMsSixcImZcIil8fChwPyh2KHRoaXMsVCxcImZcIikmJkUoITApLG89ITAsdGhpcy5zaG93SGVscChcImxvZ1wiKSx0aGlzLmV4aXQoMCkpOmcmJih2KHRoaXMsVCxcImZcIikmJkUoITApLG89ITAsdih0aGlzLHB0LFwiZlwiKS5zaG93VmVyc2lvbihcImxvZ1wiKSx0aGlzLmV4aXQoMCkpKSwhbyYmdih0aGlzLGV0LFwiZlwiKS5za2lwVmFsaWRhdGlvbi5sZW5ndGg+MCYmKG89T2JqZWN0LmtleXMoYykuc29tZSgodD0+dih0aGlzLGV0LFwiZlwiKS5za2lwVmFsaWRhdGlvbi5pbmRleE9mKHQpPj0wJiYhMD09PWNbdF0pKSksIW8pe2lmKGwuZXJyb3IpdGhyb3cgbmV3IGUobC5lcnJvci5tZXNzYWdlKTtpZighbSl7Y29uc3QgdD10aGlzW1p0XSh1LHt9LGwuZXJyb3IpO2l8fChkPUMoYyx0aGlzLHYodGhpcyxZLFwiZlwiKS5nZXRNaWRkbGV3YXJlKCksITApKSxkPXRoaXNbenRdKHQsbnVsbCE9ZD9kOmMpLGYoZCkmJiFpJiYoZD1kLnRoZW4oKCgpPT5DKGMsdGhpcyx2KHRoaXMsWSxcImZcIikuZ2V0TWlkZGxld2FyZSgpLCExKSkpKX19fWNhdGNoKHQpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IHQ7dih0aGlzLHB0LFwiZlwiKS5mYWlsKHQubWVzc2FnZSx0KX1yZXR1cm4gdGhpc1tCdF0obnVsbCE9ZD9kOmMsYSwhIWksITApfVtadF0odCxzLGksbil7Y29uc3Qgcj17Li4udGhpcy5nZXREZW1hbmRlZE9wdGlvbnMoKX07cmV0dXJuIG89PntpZihpKXRocm93IG5ldyBlKGkubWVzc2FnZSk7dih0aGlzLHl0LFwiZlwiKS5ub25PcHRpb25Db3VudChvKSx2KHRoaXMseXQsXCJmXCIpLnJlcXVpcmVkQXJndW1lbnRzKG8scik7bGV0IGE9ITE7dih0aGlzLGR0LFwiZlwiKSYmKGE9dih0aGlzLHl0LFwiZlwiKS51bmtub3duQ29tbWFuZHMobykpLHYodGhpcyxmdCxcImZcIikmJiFhP3YodGhpcyx5dCxcImZcIikudW5rbm93bkFyZ3VtZW50cyhvLHQscywhIW4pOnYodGhpcyx1dCxcImZcIikmJnYodGhpcyx5dCxcImZcIikudW5rbm93bkFyZ3VtZW50cyhvLHQse30sITEsITEpLHYodGhpcyx5dCxcImZcIikubGltaXRlZENob2ljZXMobyksdih0aGlzLHl0LFwiZlwiKS5pbXBsaWNhdGlvbnMobyksdih0aGlzLHl0LFwiZlwiKS5jb25mbGljdGluZyhvKX19W1h0XSgpe08odGhpcyxKLCEwLFwiZlwiKX1bUXRdKHQpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXYodGhpcyxldCxcImZcIikua2V5W3RdPSEwO2Vsc2UgZm9yKGNvbnN0IGUgb2YgdCl2KHRoaXMsZXQsXCJmXCIpLmtleVtlXT0hMH19dmFyIGVlLHNlO2NvbnN0e3JlYWRGaWxlU3luYzppZX09cmVxdWlyZShcImZzXCIpLHtpbnNwZWN0Om5lfT1yZXF1aXJlKFwidXRpbFwiKSx7cmVzb2x2ZTpyZX09cmVxdWlyZShcInBhdGhcIiksb2U9cmVxdWlyZShcInkxOG5cIiksYWU9cmVxdWlyZShcInlhcmdzLXBhcnNlclwiKTt2YXIgaGUsbGU9e2Fzc2VydDp7bm90U3RyaWN0RXF1YWw6dC5ub3RTdHJpY3RFcXVhbCxzdHJpY3RFcXVhbDp0LnN0cmljdEVxdWFsfSxjbGl1aTpyZXF1aXJlKFwiY2xpdWlcIiksZmluZFVwOnJlcXVpcmUoXCJlc2NhbGFkZS9zeW5jXCIpLGdldEVudjp0PT5wcm9jZXNzLmVudlt0XSxnZXRDYWxsZXJGaWxlOnJlcXVpcmUoXCJnZXQtY2FsbGVyLWZpbGVcIiksZ2V0UHJvY2Vzc0FyZ3ZCaW46eSxpbnNwZWN0Om5lLG1haW5GaWxlbmFtZTpudWxsIT09KHNlPW51bGw9PT0oZWU9bnVsbD09PXJlcXVpcmV8fHZvaWQgMD09PXJlcXVpcmU/dm9pZCAwOnJlcXVpcmUubWFpbil8fHZvaWQgMD09PWVlP3ZvaWQgMDplZS5maWxlbmFtZSkmJnZvaWQgMCE9PXNlP3NlOnByb2Nlc3MuY3dkKCksUGFyc2VyOmFlLHBhdGg6cmVxdWlyZShcInBhdGhcIikscHJvY2Vzczp7YXJndjooKT0+cHJvY2Vzcy5hcmd2LGN3ZDpwcm9jZXNzLmN3ZCxlbWl0V2FybmluZzoodCxlKT0+cHJvY2Vzcy5lbWl0V2FybmluZyh0LGUpLGV4ZWNQYXRoOigpPT5wcm9jZXNzLmV4ZWNQYXRoLGV4aXQ6dD0+e3Byb2Nlc3MuZXhpdCh0KX0sbmV4dFRpY2s6cHJvY2Vzcy5uZXh0VGljayxzdGRDb2x1bW5zOnZvaWQgMCE9PXByb2Nlc3Muc3Rkb3V0LmNvbHVtbnM/cHJvY2Vzcy5zdGRvdXQuY29sdW1uczpudWxsfSxyZWFkRmlsZVN5bmM6aWUscmVxdWlyZTpyZXF1aXJlLHJlcXVpcmVEaXJlY3Rvcnk6cmVxdWlyZShcInJlcXVpcmUtZGlyZWN0b3J5XCIpLHN0cmluZ1dpZHRoOnJlcXVpcmUoXCJzdHJpbmctd2lkdGhcIikseTE4bjpvZSh7ZGlyZWN0b3J5OnJlKF9fZGlybmFtZSxcIi4uL2xvY2FsZXNcIiksdXBkYXRlRmlsZXM6ITF9KX07Y29uc3QgY2U9KG51bGw9PT0oaGU9bnVsbD09PXByb2Nlc3N8fHZvaWQgMD09PXByb2Nlc3M/dm9pZCAwOnByb2Nlc3MuZW52KXx8dm9pZCAwPT09aGU/dm9pZCAwOmhlLllBUkdTX01JTl9OT0RFX1ZFUlNJT04pP051bWJlcihwcm9jZXNzLmVudi5ZQVJHU19NSU5fTk9ERV9WRVJTSU9OKToxMjtpZihwcm9jZXNzJiZwcm9jZXNzLnZlcnNpb24pe2lmKE51bWJlcihwcm9jZXNzLnZlcnNpb24ubWF0Y2goL3YoW14uXSspLylbMV0pPGNlKXRocm93IEVycm9yKGB5YXJncyBzdXBwb3J0cyBhIG1pbmltdW0gTm9kZS5qcyB2ZXJzaW9uIG9mICR7Y2V9LiBSZWFkIG91ciB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5OiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3Mjc3VwcG9ydGVkLW5vZGVqcy12ZXJzaW9uc2ApfWNvbnN0IGZlPXJlcXVpcmUoXCJ5YXJncy1wYXJzZXJcIik7dmFyIGRlLHVlPXthcHBseUV4dGVuZHM6bixjanNQbGF0Zm9ybVNoaW06bGUsWWFyZ3M6KGRlPWxlLCh0PVtdLGU9ZGUucHJvY2Vzcy5jd2QoKSxzKT0+e2NvbnN0IGk9bmV3IHRlKHQsZSxzLGRlKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGksXCJhcmd2XCIse2dldDooKT0+aS5wYXJzZSgpLGVudW1lcmFibGU6ITB9KSxpLmhlbHAoKSxpLnZlcnNpb24oKSxpfSksYXJnc2VydDpoLGlzUHJvbWlzZTpmLG9iakZpbHRlcjpnLHBhcnNlQ29tbWFuZDpvLFBhcnNlcjpmZSxwcm9jZXNzQXJndjpiLFlFcnJvcjplfTttb2R1bGUuZXhwb3J0cz11ZTtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBzdGRpbiBhcyBpbnB1dCwgc3Rkb3V0IGFzIG91dHB1dCB9IGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSAncmVhZGxpbmUnO1xuaW1wb3J0IFByb2dyZXNzQmFyIGZyb20gJ3Byb2dyZXNzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncy95YXJncyc7XG5pbXBvcnQgeyByZXNvbHZlQnVpbGRJZCwgQnJvd3NlclBsYXRmb3JtLCB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG5pbXBvcnQgeyBDYWNoZSB9IGZyb20gJy4vQ2FjaGUuanMnO1xuaW1wb3J0IHsgZGV0ZWN0QnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi9kZXRlY3RQbGF0Zm9ybS5qcyc7XG5pbXBvcnQgeyBpbnN0YWxsIH0gZnJvbSAnLi9pbnN0YWxsLmpzJztcbmltcG9ydCB7IGNvbXB1dGVFeGVjdXRhYmxlUGF0aCwgY29tcHV0ZVN5c3RlbUV4ZWN1dGFibGVQYXRoLCBsYXVuY2gsIH0gZnJvbSAnLi9sYXVuY2guanMnO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBDTEkge1xuICAgICNjYWNoZVBhdGg7XG4gICAgI3JsO1xuICAgICNzY3JpcHROYW1lID0gJyc7XG4gICAgI2FsbG93Q2FjaGVQYXRoT3ZlcnJpZGUgPSB0cnVlO1xuICAgICNwaW5uZWRCcm93c2VycztcbiAgICAjcHJlZml4Q29tbWFuZDtcbiAgICBjb25zdHJ1Y3RvcihvcHRzLCBybCkge1xuICAgICAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgICAgIG9wdHMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBvcHRzID0ge1xuICAgICAgICAgICAgICAgIGNhY2hlUGF0aDogb3B0cyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2FjaGVQYXRoID0gb3B0cy5jYWNoZVBhdGggPz8gcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgdGhpcy4jcmwgPSBybDtcbiAgICAgICAgdGhpcy4jc2NyaXB0TmFtZSA9IG9wdHMuc2NyaXB0TmFtZSA/PyAnQHB1cHBldGVlci9icm93c2Vycyc7XG4gICAgICAgIHRoaXMuI2FsbG93Q2FjaGVQYXRoT3ZlcnJpZGUgPSBvcHRzLmFsbG93Q2FjaGVQYXRoT3ZlcnJpZGUgPz8gdHJ1ZTtcbiAgICAgICAgdGhpcy4jcGlubmVkQnJvd3NlcnMgPSBvcHRzLnBpbm5lZEJyb3dzZXJzO1xuICAgICAgICB0aGlzLiNwcmVmaXhDb21tYW5kID0gb3B0cy5wcmVmaXhDb21tYW5kO1xuICAgIH1cbiAgICAjZGVmaW5lQnJvd3NlclBhcmFtZXRlcih5YXJncykge1xuICAgICAgICB5YXJncy5wb3NpdGlvbmFsKCdicm93c2VyJywge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXaGljaCBicm93c2VyIHRvIGluc3RhbGwgPGJyb3dzZXI+W0A8YnVpbGRJZHxsYXRlc3Q+XS4gYGxhdGVzdGAgd2lsbCB0cnkgdG8gZmluZCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZC4gYGJ1aWxkSWRgIGlzIGEgYnJvd3Nlci1zcGVjaWZpYyBpZGVudGlmaWVyIHN1Y2ggYXMgYSB2ZXJzaW9uIG9yIGEgcmV2aXNpb24uJyxcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgY29lcmNlOiAob3B0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy4jcGFyc2VCcm93c2VyKG9wdCksXG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IHRoaXMuI3BhcnNlQnVpbGRJZChvcHQpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgI2RlZmluZVBsYXRmb3JtUGFyYW1ldGVyKHlhcmdzKSB7XG4gICAgICAgIHlhcmdzLm9wdGlvbigncGxhdGZvcm0nLCB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2M6ICdQbGF0Zm9ybSB0aGF0IHRoZSBiaW5hcnkgbmVlZHMgdG8gYmUgY29tcGF0aWJsZSB3aXRoLicsXG4gICAgICAgICAgICBjaG9pY2VzOiBPYmplY3QudmFsdWVzKEJyb3dzZXJQbGF0Zm9ybSksXG4gICAgICAgICAgICBkZWZhdWx0RGVzY3JpcHRpb246ICdBdXRvLWRldGVjdGVkJyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICNkZWZpbmVQYXRoUGFyYW1ldGVyKHlhcmdzLCByZXF1aXJlZCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghdGhpcy4jYWxsb3dDYWNoZVBhdGhPdmVycmlkZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHlhcmdzLm9wdGlvbigncGF0aCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzYzogJ1BhdGggdG8gdGhlIHJvb3QgZm9sZGVyIGZvciB0aGUgYnJvd3NlciBkb3dubG9hZHMgYW5kIGluc3RhbGxhdGlvbi4gVGhlIGluc3RhbGxhdGlvbiBmb2xkZXIgc3RydWN0dXJlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY2FjaGUgc3RydWN0dXJlIHVzZWQgYnkgUHVwcGV0ZWVyLicsXG4gICAgICAgICAgICBkZWZhdWx0RGVzY3JpcHRpb246ICdDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5JyxcbiAgICAgICAgICAgIC4uLihyZXF1aXJlZCA/IHt9IDogeyBkZWZhdWx0OiBwcm9jZXNzLmN3ZCgpIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB5YXJncy5kZW1hbmRPcHRpb24oJ3BhdGgnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBydW4oYXJndikge1xuICAgICAgICBjb25zdCB5YXJnc0luc3RhbmNlID0geWFyZ3MoaGlkZUJpbihhcmd2KSk7XG4gICAgICAgIGxldCB0YXJnZXQgPSB5YXJnc0luc3RhbmNlLnNjcmlwdE5hbWUodGhpcy4jc2NyaXB0TmFtZSk7XG4gICAgICAgIGlmICh0aGlzLiNwcmVmaXhDb21tYW5kKSB7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuY29tbWFuZCh0aGlzLiNwcmVmaXhDb21tYW5kLmNtZCwgdGhpcy4jcHJlZml4Q29tbWFuZC5kZXNjcmlwdGlvbiwgeWFyZ3MgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNidWlsZCh5YXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuI2J1aWxkKHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGFyZ2V0XG4gICAgICAgICAgICAuZGVtYW5kQ29tbWFuZCgxKVxuICAgICAgICAgICAgLmhlbHAoKVxuICAgICAgICAgICAgLndyYXAoTWF0aC5taW4oMTIwLCB5YXJnc0luc3RhbmNlLnRlcm1pbmFsV2lkdGgoKSkpXG4gICAgICAgICAgICAucGFyc2UoKTtcbiAgICB9XG4gICAgI2J1aWxkKHlhcmdzKSB7XG4gICAgICAgIGNvbnN0IGxhdGVzdE9yUGlubmVkID0gdGhpcy4jcGlubmVkQnJvd3NlcnMgPyAncGlubmVkJyA6ICdsYXRlc3QnO1xuICAgICAgICByZXR1cm4geWFyZ3NcbiAgICAgICAgICAgIC5jb21tYW5kKCdpbnN0YWxsIDxicm93c2VyPicsICdEb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgc3BlY2lmaWVkIGJyb3dzZXIuIElmIHN1Y2Nlc3NmdWwsIHRoZSBjb21tYW5kIG91dHB1dHMgdGhlIGFjdHVhbCBicm93c2VyIGJ1aWxkSWQgdGhhdCB3YXMgaW5zdGFsbGVkIGFuZCB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgYnJvd3NlciBleGVjdXRhYmxlIChmb3JtYXQ6IDxicm93c2VyPkA8YnVpbGRJRD4gPHBhdGg+KS4nLCB5YXJncyA9PiB7XG4gICAgICAgICAgICB0aGlzLiNkZWZpbmVCcm93c2VyUGFyYW1ldGVyKHlhcmdzKTtcbiAgICAgICAgICAgIHRoaXMuI2RlZmluZVBsYXRmb3JtUGFyYW1ldGVyKHlhcmdzKTtcbiAgICAgICAgICAgIHRoaXMuI2RlZmluZVBhdGhQYXJhbWV0ZXIoeWFyZ3MpO1xuICAgICAgICAgICAgeWFyZ3Mub3B0aW9uKCdiYXNlLXVybCcsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZXNjOiAnQmFzZSBVUkwgdG8gZG93bmxvYWQgZnJvbScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lJywgYEluc3RhbGwgdGhlICR7bGF0ZXN0T3JQaW5uZWR9IGF2YWlsYWJsZSBidWlsZCBvZiB0aGUgQ2hyb21lIGJyb3dzZXIuYCk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZUBsYXRlc3QnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgdGhlIENocm9tZSBicm93c2VyLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBjaHJvbWVAc3RhYmxlJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBhdmFpbGFibGUgYnVpbGQgZm9yIHRoZSBDaHJvbWUgYnJvd3NlciBmcm9tIHRoZSBzdGFibGUgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lQGJldGEnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgdGhlIENocm9tZSBicm93c2VyIGZyb20gdGhlIGJldGEgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lQGRldicsICdJbnN0YWxsIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGJ1aWxkIGZvciB0aGUgQ2hyb21lIGJyb3dzZXIgZnJvbSB0aGUgZGV2IGNoYW5uZWwuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZUBjYW5hcnknLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgdGhlIENocm9tZSBDYW5hcnkgYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lQDExNScsICdJbnN0YWxsIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGJ1aWxkIGZvciBDaHJvbWUgMTE1LicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBjaHJvbWVkcml2ZXJAY2FuYXJ5JywgJ0luc3RhbGwgdGhlIGxhdGVzdCBhdmFpbGFibGUgYnVpbGQgZm9yIENocm9tZURyaXZlciBDYW5hcnkuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZWRyaXZlckAxMTUnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBidWlsZCBmb3IgQ2hyb21lRHJpdmVyIDExNS4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lZHJpdmVyQDExNS4wLjU3OTAnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBwYXRjaCAoMTE1LjAuNTc5MC5YKSBidWlsZCBmb3IgQ2hyb21lRHJpdmVyLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBjaHJvbWUtaGVhZGxlc3Mtc2hlbGwnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGF2YWlsYWJsZSBjaHJvbWUtaGVhZGxlc3Mtc2hlbGwgYnVpbGQuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9tZS1oZWFkbGVzcy1zaGVsbEBiZXRhJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBhdmFpbGFibGUgY2hyb21lLWhlYWRsZXNzLXNoZWxsIGJ1aWxkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEJldGEgY2hhbm5lbC4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgY2hyb21lLWhlYWRsZXNzLXNoZWxsQDExOCcsICdJbnN0YWxsIHRoZSBsYXRlc3QgYXZhaWxhYmxlIGNocm9tZS1oZWFkbGVzcy1zaGVsbCAxMTggYnVpbGQuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGNocm9taXVtQDEwODMwODAnLCAnSW5zdGFsbCB0aGUgcmV2aXNpb24gMTA4MzA4MCBvZiB0aGUgQ2hyb21pdW0gYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveCcsICdJbnN0YWxsIHRoZSBsYXRlc3QgbmlnaHRseSBhdmFpbGFibGUgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveEBzdGFibGUnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IHN0YWJsZSBidWlsZCBvZiB0aGUgRmlyZWZveCBicm93c2VyLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBmaXJlZm94QGJldGEnLCAnSW5zdGFsbCB0aGUgbGF0ZXN0IGJldGEgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveEBkZXZlZGl0aW9uJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBkZXZlZGl0aW9uIGJ1aWxkIG9mIHRoZSBGaXJlZm94IGJyb3dzZXIuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGZpcmVmb3hAZXNyJywgJ0luc3RhbGwgdGhlIGxhdGVzdCBFU1IgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveEBuaWdodGx5JywgJ0luc3RhbGwgdGhlIGxhdGVzdCBuaWdodGx5IGJ1aWxkIG9mIHRoZSBGaXJlZm94IGJyb3dzZXIuJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBpbnN0YWxsIGZpcmVmb3hAc3RhYmxlXzExMS4wLjEnLCAnSW5zdGFsbCBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIHlhcmdzLmV4YW1wbGUoJyQwIGluc3RhbGwgZmlyZWZveCAtLXBsYXRmb3JtIG1hYycsICdJbnN0YWxsIHRoZSBsYXRlc3QgTWFjIChJbnRlbCkgYnVpbGQgb2YgdGhlIEZpcmVmb3ggYnJvd3Nlci4nKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNhbGxvd0NhY2hlUGF0aE92ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgaW5zdGFsbCBmaXJlZm94IC0tcGF0aCAvdG1wL215LWJyb3dzZXItY2FjaGUnLCAnSW5zdGFsbCB0byB0aGUgc3BlY2lmaWVkIGNhY2hlIGRpcmVjdG9yeS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgYXN5bmMgKGFyZ3YpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBhcmd2O1xuICAgICAgICAgICAgYXJncy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgICAgICAgICBpZiAoIWFyZ3MucGxhdGZvcm0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZXNvbHZlIHRoZSBjdXJyZW50IHBsYXRmb3JtYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYXJncy5icm93c2VyLmJ1aWxkSWQgPT09ICdwaW5uZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGlubmVkVmVyc2lvbiA9IHRoaXMuI3Bpbm5lZEJyb3dzZXJzPy5bYXJncy5icm93c2VyLm5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICghcGlubmVkVmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBpbm5lZCB2ZXJzaW9uIGZvdW5kIGZvciAke2FyZ3MuYnJvd3Nlci5uYW1lfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhcmdzLmJyb3dzZXIuYnVpbGRJZCA9IHBpbm5lZFZlcnNpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEJ1aWxkSWQgPSBhcmdzLmJyb3dzZXIuYnVpbGRJZDtcbiAgICAgICAgICAgIGFyZ3MuYnJvd3Nlci5idWlsZElkID0gYXdhaXQgcmVzb2x2ZUJ1aWxkSWQoYXJncy5icm93c2VyLm5hbWUsIGFyZ3MucGxhdGZvcm0sIGFyZ3MuYnJvd3Nlci5idWlsZElkKTtcbiAgICAgICAgICAgIGF3YWl0IGluc3RhbGwoe1xuICAgICAgICAgICAgICAgIGJyb3dzZXI6IGFyZ3MuYnJvd3Nlci5uYW1lLFxuICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBhcmdzLnBsYXRmb3JtLFxuICAgICAgICAgICAgICAgIGNhY2hlRGlyOiBhcmdzLnBhdGggPz8gdGhpcy4jY2FjaGVQYXRoLFxuICAgICAgICAgICAgICAgIGRvd25sb2FkUHJvZ3Jlc3NDYWxsYmFjazogbWFrZVByb2dyZXNzQ2FsbGJhY2soYXJncy5icm93c2VyLm5hbWUsIGFyZ3MuYnJvd3Nlci5idWlsZElkKSxcbiAgICAgICAgICAgICAgICBiYXNlVXJsOiBhcmdzLmJhc2VVcmwsXG4gICAgICAgICAgICAgICAgYnVpbGRJZEFsaWFzOiBvcmlnaW5hbEJ1aWxkSWQgIT09IGFyZ3MuYnJvd3Nlci5idWlsZElkXG4gICAgICAgICAgICAgICAgICAgID8gb3JpZ2luYWxCdWlsZElkXG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJHthcmdzLmJyb3dzZXIubmFtZX1AJHthcmdzLmJyb3dzZXIuYnVpbGRJZH0gJHtjb21wdXRlRXhlY3V0YWJsZVBhdGgoe1xuICAgICAgICAgICAgICAgIGJyb3dzZXI6IGFyZ3MuYnJvd3Nlci5uYW1lLFxuICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgIGNhY2hlRGlyOiBhcmdzLnBhdGggPz8gdGhpcy4jY2FjaGVQYXRoLFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiBhcmdzLnBsYXRmb3JtLFxuICAgICAgICAgICAgfSl9YCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY29tbWFuZCgnbGF1bmNoIDxicm93c2VyPicsICdMYXVuY2ggdGhlIHNwZWNpZmllZCBicm93c2VyJywgeWFyZ3MgPT4ge1xuICAgICAgICAgICAgdGhpcy4jZGVmaW5lQnJvd3NlclBhcmFtZXRlcih5YXJncyk7XG4gICAgICAgICAgICB0aGlzLiNkZWZpbmVQbGF0Zm9ybVBhcmFtZXRlcih5YXJncyk7XG4gICAgICAgICAgICB0aGlzLiNkZWZpbmVQYXRoUGFyYW1ldGVyKHlhcmdzKTtcbiAgICAgICAgICAgIHlhcmdzLm9wdGlvbignZGV0YWNoZWQnLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgIGRlc2M6ICdEZXRhY2ggdGhlIGNoaWxkIHByb2Nlc3MuJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgeWFyZ3Mub3B0aW9uKCdzeXN0ZW0nLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgIGRlc2M6ICdTZWFyY2ggZm9yIGEgYnJvd3NlciBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBpbnN0ZWFkIG9mIHRoZSBjYWNoZSBmb2xkZXIuJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgbGF1bmNoIGNocm9tZUAxMTUuMC41NzkwLjE3MCcsICdMYXVuY2ggQ2hyb21lIDExNS4wLjU3OTAuMTcwJyk7XG4gICAgICAgICAgICB5YXJncy5leGFtcGxlKCckMCBsYXVuY2ggZmlyZWZveEAxMTIuMGExJywgJ0xhdW5jaCB0aGUgRmlyZWZveCBicm93c2VyIGlkZW50aWZpZWQgYnkgdGhlIG1pbGVzdG9uZSAxMTIuMGExLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgbGF1bmNoIGNocm9tZUAxMTUuMC41NzkwLjE3MCAtLWRldGFjaGVkJywgJ0xhdW5jaCB0aGUgYnJvd3NlciBidXQgZGV0YWNoIHRoZSBzdWItcHJvY2Vzc2VzLicpO1xuICAgICAgICAgICAgeWFyZ3MuZXhhbXBsZSgnJDAgbGF1bmNoIGNocm9tZUBjYW5hcnkgLS1zeXN0ZW0nLCAnVHJ5IHRvIGxvY2F0ZSB0aGUgQ2FuYXJ5IGJ1aWxkIG9mIENocm9tZSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBhbmQgbGF1bmNoIGl0LicpO1xuICAgICAgICB9LCBhc3luYyAoYXJndikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGFyZ3Y7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRhYmxlUGF0aCA9IGFyZ3Muc3lzdGVtXG4gICAgICAgICAgICAgICAgPyBjb21wdXRlU3lzdGVtRXhlY3V0YWJsZVBhdGgoe1xuICAgICAgICAgICAgICAgICAgICBicm93c2VyOiBhcmdzLmJyb3dzZXIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdGhyb3cgYW4gZXJyb3IgaWYgbm90IGEgQ2hyb21lUmVsZWFzZUNoYW5uZWwgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybTogYXJncy5wbGF0Zm9ybSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogY29tcHV0ZUV4ZWN1dGFibGVQYXRoKHtcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlcjogYXJncy5icm93c2VyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkSWQ6IGFyZ3MuYnJvd3Nlci5idWlsZElkLFxuICAgICAgICAgICAgICAgICAgICBjYWNoZURpcjogYXJncy5wYXRoID8/IHRoaXMuI2NhY2hlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm06IGFyZ3MucGxhdGZvcm0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsYXVuY2goe1xuICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVQYXRoLFxuICAgICAgICAgICAgICAgIGRldGFjaGVkOiBhcmdzLmRldGFjaGVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY29tbWFuZCgnY2xlYXInLCB0aGlzLiNhbGxvd0NhY2hlUGF0aE92ZXJyaWRlXG4gICAgICAgICAgICA/ICdSZW1vdmVzIGFsbCBpbnN0YWxsZWQgYnJvd3NlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIGNhY2hlIGRpcmVjdG9yeSdcbiAgICAgICAgICAgIDogYFJlbW92ZXMgYWxsIGluc3RhbGxlZCBicm93c2VycyBmcm9tICR7dGhpcy4jY2FjaGVQYXRofWAsIHlhcmdzID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2RlZmluZVBhdGhQYXJhbWV0ZXIoeWFyZ3MsIHRydWUpO1xuICAgICAgICB9LCBhc3luYyAoYXJndikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IGFyZ3Y7XG4gICAgICAgICAgICBjb25zdCBjYWNoZURpciA9IGFyZ3MucGF0aCA/PyB0aGlzLiNjYWNoZVBhdGg7XG4gICAgICAgICAgICBjb25zdCBybCA9IHRoaXMuI3JsID8/IHJlYWRsaW5lLmNyZWF0ZUludGVyZmFjZSh7IGlucHV0LCBvdXRwdXQgfSk7XG4gICAgICAgICAgICBybC5xdWVzdGlvbihgRG8geW91IHdhbnQgdG8gcGVybWFuZW50bHkgYW5kIHJlY3Vyc2l2ZWx5IGRlbGV0ZSB0aGUgY29udGVudCBvZiAke2NhY2hlRGlyfSAoeWVzL05vKT8gYCwgYW5zd2VyID0+IHtcbiAgICAgICAgICAgICAgICBybC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGlmICghWyd5JywgJ3llcyddLmluY2x1ZGVzKGFuc3dlci50b0xvd2VyQ2FzZSgpLnRyaW0oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NhbmNlbGxlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZShjYWNoZURpcik7XG4gICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtjYWNoZURpcn0gY2xlYXJlZC5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmRlbWFuZENvbW1hbmQoMSlcbiAgICAgICAgICAgIC5oZWxwKCk7XG4gICAgfVxuICAgICNwYXJzZUJyb3dzZXIodmVyc2lvbikge1xuICAgICAgICByZXR1cm4gdmVyc2lvbi5zcGxpdCgnQCcpLnNoaWZ0KCk7XG4gICAgfVxuICAgICNwYXJzZUJ1aWxkSWQodmVyc2lvbikge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHZlcnNpb24uc3BsaXQoJ0AnKTtcbiAgICAgICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMlxuICAgICAgICAgICAgPyBwYXJ0c1sxXVxuICAgICAgICAgICAgOiB0aGlzLiNwaW5uZWRCcm93c2Vyc1xuICAgICAgICAgICAgICAgID8gJ3Bpbm5lZCdcbiAgICAgICAgICAgICAgICA6ICdsYXRlc3QnO1xuICAgIH1cbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVByb2dyZXNzQ2FsbGJhY2soYnJvd3NlciwgYnVpbGRJZCkge1xuICAgIGxldCBwcm9ncmVzc0JhcjtcbiAgICBsZXQgbGFzdERvd25sb2FkZWRCeXRlcyA9IDA7XG4gICAgcmV0dXJuIChkb3dubG9hZGVkQnl0ZXMsIHRvdGFsQnl0ZXMpID0+IHtcbiAgICAgICAgaWYgKCFwcm9ncmVzc0Jhcikge1xuICAgICAgICAgICAgcHJvZ3Jlc3NCYXIgPSBuZXcgUHJvZ3Jlc3NCYXIoYERvd25sb2FkaW5nICR7YnJvd3Nlcn0gJHtidWlsZElkfSAtICR7dG9NZWdhYnl0ZXModG90YWxCeXRlcyl9IFs6YmFyXSA6cGVyY2VudCA6ZXRhcyBgLCB7XG4gICAgICAgICAgICAgICAgY29tcGxldGU6ICc9JyxcbiAgICAgICAgICAgICAgICBpbmNvbXBsZXRlOiAnICcsXG4gICAgICAgICAgICAgICAgd2lkdGg6IDIwLFxuICAgICAgICAgICAgICAgIHRvdGFsOiB0b3RhbEJ5dGVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsdGEgPSBkb3dubG9hZGVkQnl0ZXMgLSBsYXN0RG93bmxvYWRlZEJ5dGVzO1xuICAgICAgICBsYXN0RG93bmxvYWRlZEJ5dGVzID0gZG93bmxvYWRlZEJ5dGVzO1xuICAgICAgICBwcm9ncmVzc0Jhci50aWNrKGRlbHRhKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gdG9NZWdhYnl0ZXMoYnl0ZXMpIHtcbiAgICBjb25zdCBtYiA9IGJ5dGVzIC8gMTAwMCAvIDEwMDA7XG4gICAgcmV0dXJuIGAke01hdGgucm91bmQobWIgKiAxMCkgLyAxMH0gTUJgO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q0xJLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IEJyb3dzZXIsIGV4ZWN1dGFibGVQYXRoQnlCcm93c2VyLCBnZXRWZXJzaW9uQ29tcGFyYXRvciwgfSBmcm9tICcuL2Jyb3dzZXItZGF0YS9icm93c2VyLWRhdGEuanMnO1xuaW1wb3J0IHsgZGV0ZWN0QnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi9kZXRlY3RQbGF0Zm9ybS5qcyc7XG5jb25zdCBkZWJ1Z0NhY2hlID0gZGVidWcoJ3B1cHBldGVlcjpicm93c2VyczpjYWNoZScpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnN0YWxsZWRCcm93c2VyIHtcbiAgICBicm93c2VyO1xuICAgIGJ1aWxkSWQ7XG4gICAgcGxhdGZvcm07XG4gICAgZXhlY3V0YWJsZVBhdGg7XG4gICAgI2NhY2hlO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNhY2hlLCBicm93c2VyLCBidWlsZElkLCBwbGF0Zm9ybSkge1xuICAgICAgICB0aGlzLiNjYWNoZSA9IGNhY2hlO1xuICAgICAgICB0aGlzLmJyb3dzZXIgPSBicm93c2VyO1xuICAgICAgICB0aGlzLmJ1aWxkSWQgPSBidWlsZElkO1xuICAgICAgICB0aGlzLnBsYXRmb3JtID0gcGxhdGZvcm07XG4gICAgICAgIHRoaXMuZXhlY3V0YWJsZVBhdGggPSBjYWNoZS5jb21wdXRlRXhlY3V0YWJsZVBhdGgoe1xuICAgICAgICAgICAgYnJvd3NlcixcbiAgICAgICAgICAgIGJ1aWxkSWQsXG4gICAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlIGluc3RhbGxhdGlvbiBmb2xkZXIuIFVzZVxuICAgICAqIHtAbGluayBjb21wdXRlRXhlY3V0YWJsZVBhdGh9IHRvIGdldCB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSBiaW5hcnkuXG4gICAgICovXG4gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWNoZS5pbnN0YWxsYXRpb25EaXIodGhpcy5icm93c2VyLCB0aGlzLnBsYXRmb3JtLCB0aGlzLmJ1aWxkSWQpO1xuICAgIH1cbiAgICByZWFkTWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWNoZS5yZWFkTWV0YWRhdGEodGhpcy5icm93c2VyKTtcbiAgICB9XG4gICAgd3JpdGVNZXRhZGF0YShtZXRhZGF0YSkge1xuICAgICAgICB0aGlzLiNjYWNoZS53cml0ZU1ldGFkYXRhKHRoaXMuYnJvd3NlciwgbWV0YWRhdGEpO1xuICAgIH1cbn1cbi8qKlxuICogVGhlIGNhY2hlIHVzZWQgYnkgUHVwcGV0ZWVyIHJlbGllcyBvbiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqXG4gKiAtIHJvb3REaXJcbiAqICAgLS0gPGJyb3dzZXIxPiB8IGJyb3dzZXJSb290KGJyb3dzZXIxKVxuICogICAtLS0tIDxwbGF0Zm9ybT4tPGJ1aWxkSWQ+IHwgaW5zdGFsbGF0aW9uRGlyKClcbiAqICAgLS0tLS0tIHRoZSBicm93c2VyLXBsYXRmb3JtLWJ1aWxkSWRcbiAqICAgLS0tLS0tIHNwZWNpZmljIHN0cnVjdHVyZS5cbiAqICAgLS0gPGJyb3dzZXIyPiB8IGJyb3dzZXJSb290KGJyb3dzZXIyKVxuICogICAtLS0tIDxwbGF0Zm9ybT4tPGJ1aWxkSWQ+IHwgaW5zdGFsbGF0aW9uRGlyKClcbiAqICAgLS0tLS0tIHRoZSBicm93c2VyLXBsYXRmb3JtLWJ1aWxkSWRcbiAqICAgLS0tLS0tIHNwZWNpZmljIHN0cnVjdHVyZS5cbiAqICAgQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWNoZSB7XG4gICAgI3Jvb3REaXI7XG4gICAgY29uc3RydWN0b3Iocm9vdERpcikge1xuICAgICAgICB0aGlzLiNyb290RGlyID0gcm9vdERpcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0IHJvb3REaXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyb290RGlyO1xuICAgIH1cbiAgICBicm93c2VyUm9vdChicm93c2VyKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy4jcm9vdERpciwgYnJvd3Nlcik7XG4gICAgfVxuICAgIG1ldGFkYXRhRmlsZShicm93c2VyKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5icm93c2VyUm9vdChicm93c2VyKSwgJy5tZXRhZGF0YScpO1xuICAgIH1cbiAgICByZWFkTWV0YWRhdGEoYnJvd3Nlcikge1xuICAgICAgICBjb25zdCBtZXRhdGFkYVBhdGggPSB0aGlzLm1ldGFkYXRhRmlsZShicm93c2VyKTtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG1ldGF0YWRhUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGFsaWFzZXM6IHt9IH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogYWRkIHR5cGUtc2FmZSBwYXJzaW5nLlxuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWV0YXRhZGFQYXRoLCAndXRmOCcpKTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcubWV0YWRhdGEgaXMgbm90IGFuIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICB3cml0ZU1ldGFkYXRhKGJyb3dzZXIsIG1ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IG1ldGF0YWRhUGF0aCA9IHRoaXMubWV0YWRhdGFGaWxlKGJyb3dzZXIpO1xuICAgICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG1ldGF0YWRhUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKG1ldGF0YWRhUGF0aCwgSlNPTi5zdHJpbmdpZnkobWV0YWRhdGEsIG51bGwsIDIpKTtcbiAgICB9XG4gICAgcmVzb2x2ZUFsaWFzKGJyb3dzZXIsIGFsaWFzKSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5yZWFkTWV0YWRhdGEoYnJvd3Nlcik7XG4gICAgICAgIGlmIChhbGlhcyA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKG1ldGFkYXRhLmFsaWFzZXMgfHwge30pXG4gICAgICAgICAgICAgICAgLnNvcnQoZ2V0VmVyc2lvbkNvbXBhcmF0b3IoYnJvd3NlcikpXG4gICAgICAgICAgICAgICAgLmF0KC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0YWRhdGEuYWxpYXNlc1thbGlhc107XG4gICAgfVxuICAgIGluc3RhbGxhdGlvbkRpcihicm93c2VyLCBwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgICAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuYnJvd3NlclJvb3QoYnJvd3NlciksIGAke3BsYXRmb3JtfS0ke2J1aWxkSWR9YCk7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICBmcy5ybVN5bmModGhpcy4jcm9vdERpciwge1xuICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgICBtYXhSZXRyaWVzOiAxMCxcbiAgICAgICAgICAgIHJldHJ5RGVsYXk6IDUwMCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVuaW5zdGFsbChicm93c2VyLCBwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMucmVhZE1ldGFkYXRhKGJyb3dzZXIpO1xuICAgICAgICBmb3IgKGNvbnN0IGFsaWFzIG9mIE9iamVjdC5rZXlzKG1ldGFkYXRhLmFsaWFzZXMpKSB7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEuYWxpYXNlc1thbGlhc10gPT09IGJ1aWxkSWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgbWV0YWRhdGEuYWxpYXNlc1thbGlhc107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnMucm1TeW5jKHRoaXMuaW5zdGFsbGF0aW9uRGlyKGJyb3dzZXIsIHBsYXRmb3JtLCBidWlsZElkKSwge1xuICAgICAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgICBtYXhSZXRyaWVzOiAxMCxcbiAgICAgICAgICAgIHJldHJ5RGVsYXk6IDUwMCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldEluc3RhbGxlZEJyb3dzZXJzKCkge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy4jcm9vdERpcikpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuI3Jvb3REaXIpO1xuICAgICAgICBjb25zdCBicm93c2VycyA9IHR5cGVzLmZpbHRlcigodCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoQnJvd3NlcikuaW5jbHVkZXModCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYnJvd3NlcnMuZmxhdE1hcChicm93c2VyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmModGhpcy5icm93c2VyUm9vdChicm93c2VyKSk7XG4gICAgICAgICAgICByZXR1cm4gZmlsZXNcbiAgICAgICAgICAgICAgICAubWFwKGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlRm9sZGVyUGF0aChwYXRoLmpvaW4odGhpcy5icm93c2VyUm9vdChicm93c2VyKSwgZmlsZSkpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluc3RhbGxlZEJyb3dzZXIodGhpcywgYnJvd3NlciwgcmVzdWx0LmJ1aWxkSWQsIHJlc3VsdC5wbGF0Zm9ybSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSAhPT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29tcHV0ZUV4ZWN1dGFibGVQYXRoKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgICAgIGlmICghb3B0aW9ucy5wbGF0Zm9ybSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZG93bmxvYWQgYSBiaW5hcnkgZm9yIHRoZSBwcm92aWRlZCBwbGF0Zm9ybTogJHtvcy5wbGF0Zm9ybSgpfSAoJHtvcy5hcmNoKCl9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvcHRpb25zLmJ1aWxkSWQgPVxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZUFsaWFzKG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5idWlsZElkKSA/PyBvcHRpb25zLmJ1aWxkSWQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgZGVidWdDYWNoZSgnY291bGQgbm90IHJlYWQgLm1ldGFkYXRhIGZpbGUgZm9yIHRoZSBicm93c2VyJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5zdGFsbGF0aW9uRGlyID0gdGhpcy5pbnN0YWxsYXRpb25EaXIob3B0aW9ucy5icm93c2VyLCBvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQpO1xuICAgICAgICByZXR1cm4gcGF0aC5qb2luKGluc3RhbGxhdGlvbkRpciwgZXhlY3V0YWJsZVBhdGhCeUJyb3dzZXJbb3B0aW9ucy5icm93c2VyXShvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZUZvbGRlclBhdGgoZm9sZGVyUGF0aCkge1xuICAgIGNvbnN0IG5hbWUgPSBwYXRoLmJhc2VuYW1lKGZvbGRlclBhdGgpO1xuICAgIGNvbnN0IHNwbGl0cyA9IG5hbWUuc3BsaXQoJy0nKTtcbiAgICBpZiAoc3BsaXRzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFtwbGF0Zm9ybSwgYnVpbGRJZF0gPSBzcGxpdHM7XG4gICAgaWYgKCFidWlsZElkIHx8ICFwbGF0Zm9ybSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiB7IHBsYXRmb3JtLCBidWlsZElkIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYWNoZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0ICogYXMgY2hyb21lSGVhZGxlc3NTaGVsbCBmcm9tICcuL2Nocm9tZS1oZWFkbGVzcy1zaGVsbC5qcyc7XG5pbXBvcnQgKiBhcyBjaHJvbWUgZnJvbSAnLi9jaHJvbWUuanMnO1xuaW1wb3J0ICogYXMgY2hyb21lZHJpdmVyIGZyb20gJy4vY2hyb21lZHJpdmVyLmpzJztcbmltcG9ydCAqIGFzIGNocm9taXVtIGZyb20gJy4vY2hyb21pdW0uanMnO1xuaW1wb3J0ICogYXMgZmlyZWZveCBmcm9tICcuL2ZpcmVmb3guanMnO1xuaW1wb3J0IHsgQnJvd3NlciwgQnJvd3NlclBsYXRmb3JtLCBCcm93c2VyVGFnLCBDaHJvbWVSZWxlYXNlQ2hhbm5lbCwgfSBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCBjb25zdCBkb3dubG9hZFVybHMgPSB7XG4gICAgW0Jyb3dzZXIuQ0hST01FRFJJVkVSXTogY2hyb21lZHJpdmVyLnJlc29sdmVEb3dubG9hZFVybCxcbiAgICBbQnJvd3Nlci5DSFJPTUVIRUFETEVTU1NIRUxMXTogY2hyb21lSGVhZGxlc3NTaGVsbC5yZXNvbHZlRG93bmxvYWRVcmwsXG4gICAgW0Jyb3dzZXIuQ0hST01FXTogY2hyb21lLnJlc29sdmVEb3dubG9hZFVybCxcbiAgICBbQnJvd3Nlci5DSFJPTUlVTV06IGNocm9taXVtLnJlc29sdmVEb3dubG9hZFVybCxcbiAgICBbQnJvd3Nlci5GSVJFRk9YXTogZmlyZWZveC5yZXNvbHZlRG93bmxvYWRVcmwsXG59O1xuZXhwb3J0IGNvbnN0IGRvd25sb2FkUGF0aHMgPSB7XG4gICAgW0Jyb3dzZXIuQ0hST01FRFJJVkVSXTogY2hyb21lZHJpdmVyLnJlc29sdmVEb3dubG9hZFBhdGgsXG4gICAgW0Jyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTF06IGNocm9tZUhlYWRsZXNzU2hlbGwucmVzb2x2ZURvd25sb2FkUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUVdOiBjaHJvbWUucmVzb2x2ZURvd25sb2FkUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUlVTV06IGNocm9taXVtLnJlc29sdmVEb3dubG9hZFBhdGgsXG4gICAgW0Jyb3dzZXIuRklSRUZPWF06IGZpcmVmb3gucmVzb2x2ZURvd25sb2FkUGF0aCxcbn07XG5leHBvcnQgY29uc3QgZXhlY3V0YWJsZVBhdGhCeUJyb3dzZXIgPSB7XG4gICAgW0Jyb3dzZXIuQ0hST01FRFJJVkVSXTogY2hyb21lZHJpdmVyLnJlbGF0aXZlRXhlY3V0YWJsZVBhdGgsXG4gICAgW0Jyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTF06IGNocm9tZUhlYWRsZXNzU2hlbGwucmVsYXRpdmVFeGVjdXRhYmxlUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUVdOiBjaHJvbWUucmVsYXRpdmVFeGVjdXRhYmxlUGF0aCxcbiAgICBbQnJvd3Nlci5DSFJPTUlVTV06IGNocm9taXVtLnJlbGF0aXZlRXhlY3V0YWJsZVBhdGgsXG4gICAgW0Jyb3dzZXIuRklSRUZPWF06IGZpcmVmb3gucmVsYXRpdmVFeGVjdXRhYmxlUGF0aCxcbn07XG5leHBvcnQgY29uc3QgdmVyc2lvbkNvbXBhcmF0b3JzID0ge1xuICAgIFtCcm93c2VyLkNIUk9NRURSSVZFUl06IGNocm9tZWRyaXZlci5jb21wYXJlVmVyc2lvbnMsXG4gICAgW0Jyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTF06IGNocm9tZUhlYWRsZXNzU2hlbGwuY29tcGFyZVZlcnNpb25zLFxuICAgIFtCcm93c2VyLkNIUk9NRV06IGNocm9tZS5jb21wYXJlVmVyc2lvbnMsXG4gICAgW0Jyb3dzZXIuQ0hST01JVU1dOiBjaHJvbWl1bS5jb21wYXJlVmVyc2lvbnMsXG4gICAgW0Jyb3dzZXIuRklSRUZPWF06IGZpcmVmb3guY29tcGFyZVZlcnNpb25zLFxufTtcbmV4cG9ydCB7IEJyb3dzZXIsIEJyb3dzZXJQbGF0Zm9ybSwgQ2hyb21lUmVsZWFzZUNoYW5uZWwgfTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCdWlsZElkRm9yQnJvd3NlclRhZyhicm93c2VyLCBwbGF0Zm9ybSwgdGFnKSB7XG4gICAgc3dpdGNoIChicm93c2VyKSB7XG4gICAgICAgIGNhc2UgQnJvd3Nlci5GSVJFRk9YOlxuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTEFURVNUOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLk5JR0hUTFkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLkJFVEEpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5OSUdIVExZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLk5JR0hUTFkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVZFRElUSU9OOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLkRFVkVESVRJT04pO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5TVEFCTEU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBmaXJlZm94LnJlc29sdmVCdWlsZElkKGZpcmVmb3guRmlyZWZveENoYW5uZWwuU1RBQkxFKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuRVNSOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyZWZveC5yZXNvbHZlQnVpbGRJZChmaXJlZm94LkZpcmVmb3hDaGFubmVsLkVTUik7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuREVWOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFnLnRvVXBwZXJDYXNlKCl9IGlzIG5vdCBhdmFpbGFibGUgZm9yIEZpcmVmb3hgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NRToge1xuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTEFURVNUOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkNBTkFSWSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkJFVEE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWUucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuQkVUQSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNocm9tZS5yZXNvbHZlQnVpbGRJZChDaHJvbWVSZWxlYXNlQ2hhbm5lbC5DQU5BUlkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWUucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuREVWKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLlNUQUJMRSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLk5JR0hUTFk6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkRFVkVESVRJT046XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkVTUjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhZy50b1VwcGVyQ2FzZSgpfSBpcyBub3QgYXZhaWxhYmxlIGZvciBDaHJvbWVgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FRFJJVkVSOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5MQVRFU1Q6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNocm9tZWRyaXZlci5yZXNvbHZlQnVpbGRJZChDaHJvbWVSZWxlYXNlQ2hhbm5lbC5DQU5BUlkpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lZHJpdmVyLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkJFVEEpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVkcml2ZXIucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuREVWKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY2hyb21lZHJpdmVyLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLlNUQUJMRSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLk5JR0hUTFk6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkRFVkVESVRJT046XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkVTUjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhZy50b1VwcGVyQ2FzZSgpfSBpcyBub3QgYXZhaWxhYmxlIGZvciBDaHJvbWVEcml2ZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTDoge1xuICAgICAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTEFURVNUOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5DQU5BUlk6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkNBTkFSWSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkJFVEE6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkJFVEEpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKENocm9tZVJlbGVhc2VDaGFubmVsLkRFVik7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLlNUQUJMRTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNocm9tZUhlYWRsZXNzU2hlbGwucmVzb2x2ZUJ1aWxkSWQoQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuTklHSFRMWTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuREVWRURJVElPTjpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuRVNSOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFnfSBpcyBub3QgYXZhaWxhYmxlIGZvciBjaHJvbWUtaGVhZGxlc3Mtc2hlbGxgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01JVU06XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5MQVRFU1Q6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBjaHJvbWl1bS5yZXNvbHZlQnVpbGRJZChwbGF0Zm9ybSk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLk5JR0hUTFk6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkNBTkFSWTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJUYWcuREVWOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5ERVZFRElUSU9OOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5CRVRBOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclRhZy5TVEFCTEU6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyVGFnLkVTUjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhZ30gaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2hyb21pdW0uIFVzZSAnbGF0ZXN0JyBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJ1aWxkSWQoYnJvd3NlciwgcGxhdGZvcm0sIHRhZykge1xuICAgIGNvbnN0IGJyb3dzZXJUYWcgPSB0YWc7XG4gICAgaWYgKE9iamVjdC52YWx1ZXMoQnJvd3NlclRhZykuaW5jbHVkZXMoYnJvd3NlclRhZykpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVCdWlsZElkRm9yQnJvd3NlclRhZyhicm93c2VyLCBwbGF0Zm9ybSwgYnJvd3NlclRhZyk7XG4gICAgfVxuICAgIHN3aXRjaCAoYnJvd3Nlcikge1xuICAgICAgICBjYXNlIEJyb3dzZXIuRklSRUZPWDpcbiAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUU6XG4gICAgICAgICAgICBjb25zdCBjaHJvbWVSZXN1bHQgPSBhd2FpdCBjaHJvbWUucmVzb2x2ZUJ1aWxkSWQodGFnKTtcbiAgICAgICAgICAgIGlmIChjaHJvbWVSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hyb21lUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NRURSSVZFUjpcbiAgICAgICAgICAgIGNvbnN0IGNocm9tZURyaXZlclJlc3VsdCA9IGF3YWl0IGNocm9tZWRyaXZlci5yZXNvbHZlQnVpbGRJZCh0YWcpO1xuICAgICAgICAgICAgaWYgKGNocm9tZURyaXZlclJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaHJvbWVEcml2ZXJSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGFnO1xuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTDpcbiAgICAgICAgICAgIGNvbnN0IGNocm9tZUhlYWRsZXNzU2hlbGxSZXN1bHQgPSBhd2FpdCBjaHJvbWVIZWFkbGVzc1NoZWxsLnJlc29sdmVCdWlsZElkKHRhZyk7XG4gICAgICAgICAgICBpZiAoY2hyb21lSGVhZGxlc3NTaGVsbFJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaHJvbWVIZWFkbGVzc1NoZWxsUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NSVVNOlxuICAgICAgICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVByb2ZpbGUoYnJvd3Nlciwgb3B0cykge1xuICAgIHN3aXRjaCAoYnJvd3Nlcikge1xuICAgICAgICBjYXNlIEJyb3dzZXIuRklSRUZPWDpcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBmaXJlZm94LmNyZWF0ZVByb2ZpbGUob3B0cyk7XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUU6XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUlVTTpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvZmlsZSBjcmVhdGlvbiBpcyBub3Qgc3VwcG9ydCBmb3IgJHticm93c2VyfSB5ZXRgKTtcbiAgICB9XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTeXN0ZW1FeGVjdXRhYmxlUGF0aChicm93c2VyLCBwbGF0Zm9ybSwgY2hhbm5lbCkge1xuICAgIHN3aXRjaCAoYnJvd3Nlcikge1xuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FRFJJVkVSOlxuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FSEVBRExFU1NTSEVMTDpcbiAgICAgICAgY2FzZSBCcm93c2VyLkZJUkVGT1g6XG4gICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUlVTTpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3lzdGVtIGJyb3dzZXIgZGV0ZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yICR7YnJvd3Nlcn0geWV0LmApO1xuICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FOlxuICAgICAgICAgICAgcmV0dXJuIGNocm9tZS5yZXNvbHZlU3lzdGVtRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIGNoYW5uZWwpO1xuICAgIH1cbn1cbi8qKlxuICogUmV0dXJucyBhIHZlcnNpb24gY29tcGFyYXRvciBmb3IgdGhlIGdpdmVuIGJyb3dzZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBzb3J0XG4gKiBicm93c2VyIHZlcnNpb25zLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25Db21wYXJhdG9yKGJyb3dzZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvbkNvbXBhcmF0b3JzW2Jyb3dzZXJdO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJvd3Nlci1kYXRhLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vdHlwZXMuanMnO1xuZnVuY3Rpb24gZm9sZGVyKHBsYXRmb3JtKSB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgIHJldHVybiAnbGludXg2NCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgICAgICByZXR1cm4gJ21hYy1hcm02NCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiAnbWFjLXg2NCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICAgICAgcmV0dXJuICd3aW4zMic7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICAgICAgcmV0dXJuICd3aW42NCc7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFVybChwbGF0Zm9ybSwgYnVpbGRJZCwgYmFzZVVybCA9ICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vY2hyb21lLWZvci10ZXN0aW5nLXB1YmxpYycpIHtcbiAgICByZXR1cm4gYCR7YmFzZVVybH0vJHtyZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCBidWlsZElkKS5qb2luKCcvJyl9YDtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCBidWlsZElkKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYnVpbGRJZCxcbiAgICAgICAgZm9sZGVyKHBsYXRmb3JtKSxcbiAgICAgICAgYGNocm9tZS1oZWFkbGVzcy1zaGVsbC0ke2ZvbGRlcihwbGF0Zm9ybSl9LnppcGAsXG4gICAgXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUV4ZWN1dGFibGVQYXRoKHBsYXRmb3JtLCBfYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLWhlYWRsZXNzLXNoZWxsLScgKyBmb2xkZXIocGxhdGZvcm0pLCAnY2hyb21lLWhlYWRsZXNzLXNoZWxsJyk7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLWhlYWRsZXNzLXNoZWxsLWxpbnV4NjQnLCAnY2hyb21lLWhlYWRsZXNzLXNoZWxsJyk7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2Nocm9tZS1oZWFkbGVzcy1zaGVsbC0nICsgZm9sZGVyKHBsYXRmb3JtKSwgJ2Nocm9tZS1oZWFkbGVzcy1zaGVsbC5leGUnKTtcbiAgICB9XG59XG5leHBvcnQgeyByZXNvbHZlQnVpbGRJZCwgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnLi9jaHJvbWUuanMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2hyb21lLWhlYWRsZXNzLXNoZWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IGdldEpTT04gfSBmcm9tICcuLi9odHRwVXRpbC5qcyc7XG5pbXBvcnQgeyBCcm93c2VyUGxhdGZvcm0sIENocm9tZVJlbGVhc2VDaGFubmVsIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5mdW5jdGlvbiBmb2xkZXIocGxhdGZvcm0pIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuICdsaW51eDY0JztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDX0FSTTpcbiAgICAgICAgICAgIHJldHVybiAnbWFjLWFybTY0JztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICAgICAgcmV0dXJuICdtYWMteDY0JztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lOMzI6XG4gICAgICAgICAgICByZXR1cm4gJ3dpbjMyJztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gJ3dpbjY0JztcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURvd25sb2FkVXJsKHBsYXRmb3JtLCBidWlsZElkLCBiYXNlVXJsID0gJ2h0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9jaHJvbWUtZm9yLXRlc3RpbmctcHVibGljJykge1xuICAgIHJldHVybiBgJHtiYXNlVXJsfS8ke3Jlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpLmpvaW4oJy8nKX1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICByZXR1cm4gW2J1aWxkSWQsIGZvbGRlcihwbGF0Zm9ybSksIGBjaHJvbWUtJHtmb2xkZXIocGxhdGZvcm0pfS56aXBgXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUV4ZWN1dGFibGVQYXRoKHBsYXRmb3JtLCBfYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLScgKyBmb2xkZXIocGxhdGZvcm0pLCAnR29vZ2xlIENocm9tZSBmb3IgVGVzdGluZy5hcHAnLCAnQ29udGVudHMnLCAnTWFjT1MnLCAnR29vZ2xlIENocm9tZSBmb3IgVGVzdGluZycpO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2Nocm9tZS1saW51eDY0JywgJ2Nocm9tZScpO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWUtJyArIGZvbGRlcihwbGF0Zm9ybSksICdjaHJvbWUuZXhlJyk7XG4gICAgfVxufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhc3RLbm93bkdvb2RSZWxlYXNlRm9yQ2hhbm5lbChjaGFubmVsKSB7XG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCBnZXRKU09OKG5ldyBVUkwoJ2h0dHBzOi8vZ29vZ2xlY2hyb21lbGFicy5naXRodWIuaW8vY2hyb21lLWZvci10ZXN0aW5nL2xhc3Qta25vd24tZ29vZC12ZXJzaW9ucy5qc29uJykpKTtcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgT2JqZWN0LmtleXMoZGF0YS5jaGFubmVscykpIHtcbiAgICAgICAgZGF0YS5jaGFubmVsc1tjaGFubmVsLnRvTG93ZXJDYXNlKCldID0gZGF0YS5jaGFubmVsc1tjaGFubmVsXTtcbiAgICAgICAgZGVsZXRlIGRhdGEuY2hhbm5lbHNbY2hhbm5lbF07XG4gICAgfVxuICAgIHJldHVybiBkYXRhLmNoYW5uZWxzW2NoYW5uZWxdO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhc3RLbm93bkdvb2RSZWxlYXNlRm9yTWlsZXN0b25lKG1pbGVzdG9uZSkge1xuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgZ2V0SlNPTihuZXcgVVJMKCdodHRwczovL2dvb2dsZWNocm9tZWxhYnMuZ2l0aHViLmlvL2Nocm9tZS1mb3ItdGVzdGluZy9sYXRlc3QtdmVyc2lvbnMtcGVyLW1pbGVzdG9uZS5qc29uJykpKTtcbiAgICByZXR1cm4gZGF0YS5taWxlc3RvbmVzW21pbGVzdG9uZV07XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGFzdEtub3duR29vZFJlbGVhc2VGb3JCdWlsZChcbi8qKlxuICogQGV4YW1wbGUgYDExMi4wLjIzYCxcbiAqL1xuYnVpbGRQcmVmaXgpIHtcbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IGdldEpTT04obmV3IFVSTCgnaHR0cHM6Ly9nb29nbGVjaHJvbWVsYWJzLmdpdGh1Yi5pby9jaHJvbWUtZm9yLXRlc3RpbmcvbGF0ZXN0LXBhdGNoLXZlcnNpb25zLXBlci1idWlsZC5qc29uJykpKTtcbiAgICByZXR1cm4gZGF0YS5idWlsZHNbYnVpbGRQcmVmaXhdO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCdWlsZElkKGNoYW5uZWwpIHtcbiAgICBpZiAoT2JqZWN0LnZhbHVlcyhDaHJvbWVSZWxlYXNlQ2hhbm5lbCkuaW5jbHVkZXMoY2hhbm5lbCkpIHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBnZXRMYXN0S25vd25Hb29kUmVsZWFzZUZvckNoYW5uZWwoY2hhbm5lbCkpLnZlcnNpb247XG4gICAgfVxuICAgIGlmIChjaGFubmVsLm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgICAvLyBQb3RlbnRpYWxseSBhIG1pbGVzdG9uZS5cbiAgICAgICAgcmV0dXJuIChhd2FpdCBnZXRMYXN0S25vd25Hb29kUmVsZWFzZUZvck1pbGVzdG9uZShjaGFubmVsKSk/LnZlcnNpb247XG4gICAgfVxuICAgIGlmIChjaGFubmVsLm1hdGNoKC9eXFxkK1xcLlxcZCtcXC5cXGQrJC8pKSB7XG4gICAgICAgIC8vIFBvdGVudGlhbGx5IGEgYnVpbGQgcHJlZml4IHdpdGhvdXQgdGhlIHBhdGNoIHZlcnNpb24uXG4gICAgICAgIHJldHVybiAoYXdhaXQgZ2V0TGFzdEtub3duR29vZFJlbGVhc2VGb3JCdWlsZChjaGFubmVsKSk/LnZlcnNpb247XG4gICAgfVxuICAgIHJldHVybjtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU3lzdGVtRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIGNoYW5uZWwpIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7cHJvY2Vzcy5lbnZbJ1BST0dSQU1GSUxFUyddfVxcXFxHb29nbGVcXFxcQ2hyb21lXFxcXEFwcGxpY2F0aW9uXFxcXGNocm9tZS5leGVgO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuQkVUQTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3Byb2Nlc3MuZW52WydQUk9HUkFNRklMRVMnXX1cXFxcR29vZ2xlXFxcXENocm9tZSBCZXRhXFxcXEFwcGxpY2F0aW9uXFxcXGNocm9tZS5leGVgO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuQ0FOQVJZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7cHJvY2Vzcy5lbnZbJ1BST0dSQU1GSUxFUyddfVxcXFxHb29nbGVcXFxcQ2hyb21lIFN4U1xcXFxBcHBsaWNhdGlvblxcXFxjaHJvbWUuZXhlYDtcbiAgICAgICAgICAgICAgICBjYXNlIENocm9tZVJlbGVhc2VDaGFubmVsLkRFVjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3Byb2Nlc3MuZW52WydQUk9HUkFNRklMRVMnXX1cXFxcR29vZ2xlXFxcXENocm9tZSBEZXZcXFxcQXBwbGljYXRpb25cXFxcY2hyb21lLmV4ZWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvR29vZ2xlIENocm9tZS5hcHAvQ29udGVudHMvTWFjT1MvR29vZ2xlIENocm9tZSc7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvR29vZ2xlIENocm9tZSBCZXRhLmFwcC9Db250ZW50cy9NYWNPUy9Hb29nbGUgQ2hyb21lIEJldGEnO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2hyb21lUmVsZWFzZUNoYW5uZWwuQ0FOQVJZOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvR29vZ2xlIENocm9tZSBDYW5hcnkuYXBwL0NvbnRlbnRzL01hY09TL0dvb2dsZSBDaHJvbWUgQ2FuYXJ5JztcbiAgICAgICAgICAgICAgICBjYXNlIENocm9tZVJlbGVhc2VDaGFubmVsLkRFVjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcvQXBwbGljYXRpb25zL0dvb2dsZSBDaHJvbWUgRGV2LmFwcC9Db250ZW50cy9NYWNPUy9Hb29nbGUgQ2hyb21lIERldic7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5TVEFCTEU6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnL29wdC9nb29nbGUvY2hyb21lL2Nocm9tZSc7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5CRVRBOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy9vcHQvZ29vZ2xlL2Nocm9tZS1iZXRhL2Nocm9tZSc7XG4gICAgICAgICAgICAgICAgY2FzZSBDaHJvbWVSZWxlYXNlQ2hhbm5lbC5ERVY6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnL29wdC9nb29nbGUvY2hyb21lLXVuc3RhYmxlL2Nocm9tZSc7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRldGVjdCBicm93c2VyIGV4ZWN1dGFibGUgcGF0aCBmb3IgJyR7Y2hhbm5lbH0nIG9uICR7cGxhdGZvcm19LmApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhLCBiKSB7XG4gICAgaWYgKCFzZW12ZXIudmFsaWQoYSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWZXJzaW9uICR7YX0gaXMgbm90IGEgdmFsaWQgc2VtdmVyIHZlcnNpb25gKTtcbiAgICB9XG4gICAgaWYgKCFzZW12ZXIudmFsaWQoYikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBWZXJzaW9uICR7Yn0gaXMgbm90IGEgdmFsaWQgc2VtdmVyIHZlcnNpb25gKTtcbiAgICB9XG4gICAgaWYgKHNlbXZlci5ndChhLCBiKSkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VtdmVyLmx0KGEsIGIpKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNocm9tZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBCcm93c2VyUGxhdGZvcm0gfSBmcm9tICcuL3R5cGVzLmpzJztcbmZ1bmN0aW9uIGZvbGRlcihwbGF0Zm9ybSkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gJ2xpbnV4NjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuICdtYWMtYXJtNjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgICAgICByZXR1cm4gJ21hYy14NjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgIHJldHVybiAnd2luMzInO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiAnd2luNjQnO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRVcmwocGxhdGZvcm0sIGJ1aWxkSWQsIGJhc2VVcmwgPSAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Nocm9tZS1mb3ItdGVzdGluZy1wdWJsaWMnKSB7XG4gICAgcmV0dXJuIGAke2Jhc2VVcmx9LyR7cmVzb2x2ZURvd25sb2FkUGF0aChwbGF0Zm9ybSwgYnVpbGRJZCkuam9pbignLycpfWA7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURvd25sb2FkUGF0aChwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgIHJldHVybiBbYnVpbGRJZCwgZm9sZGVyKHBsYXRmb3JtKSwgYGNocm9tZWRyaXZlci0ke2ZvbGRlcihwbGF0Zm9ybSl9LnppcGBdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIF9idWlsZElkKSB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWVkcml2ZXItJyArIGZvbGRlcihwbGF0Zm9ybSksICdjaHJvbWVkcml2ZXInKTtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWVkcml2ZXItbGludXg2NCcsICdjaHJvbWVkcml2ZXInKTtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lOMzI6XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lZHJpdmVyLScgKyBmb2xkZXIocGxhdGZvcm0pLCAnY2hyb21lZHJpdmVyLmV4ZScpO1xuICAgIH1cbn1cbmV4cG9ydCB7IHJlc29sdmVCdWlsZElkLCBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuL2Nocm9tZS5qcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaHJvbWVkcml2ZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0VGV4dCB9IGZyb20gJy4uL2h0dHBVdGlsLmpzJztcbmltcG9ydCB7IEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vdHlwZXMuanMnO1xuZnVuY3Rpb24gYXJjaGl2ZShwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gJ2Nocm9tZS1saW51eCc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiAnY2hyb21lLW1hYyc7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIC8vIFdpbmRvd3MgYXJjaGl2ZSBuYW1lIGNoYW5nZWQgYXQgcjU5MTQ3OS5cbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChidWlsZElkLCAxMCkgPiA1OTE0NzkgPyAnY2hyb21lLXdpbicgOiAnY2hyb21lLXdpbjMyJztcbiAgICB9XG59XG5mdW5jdGlvbiBmb2xkZXIocGxhdGZvcm0pIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuICdMaW51eF94NjQnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuICdNYWNfQXJtJztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICAgICAgcmV0dXJuICdNYWMnO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgIHJldHVybiAnV2luJztcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gJ1dpbl94NjQnO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRVcmwocGxhdGZvcm0sIGJ1aWxkSWQsIGJhc2VVcmwgPSAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Nocm9taXVtLWJyb3dzZXItc25hcHNob3RzJykge1xuICAgIHJldHVybiBgJHtiYXNlVXJsfS8ke3Jlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpLmpvaW4oJy8nKX1gO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICByZXR1cm4gW2ZvbGRlcihwbGF0Zm9ybSksIGJ1aWxkSWQsIGAke2FyY2hpdmUocGxhdGZvcm0sIGJ1aWxkSWQpfS56aXBgXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUV4ZWN1dGFibGVQYXRoKHBsYXRmb3JtLCBfYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignY2hyb21lLW1hYycsICdDaHJvbWl1bS5hcHAnLCAnQ29udGVudHMnLCAnTWFjT1MnLCAnQ2hyb21pdW0nKTtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdjaHJvbWUtbGludXgnLCAnY2hyb21lJyk7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2Nocm9tZS13aW4nLCAnY2hyb21lLmV4ZScpO1xuICAgIH1cbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlQnVpbGRJZChwbGF0Zm9ybSkge1xuICAgIHJldHVybiBhd2FpdCBnZXRUZXh0KG5ldyBVUkwoYGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9jaHJvbWl1bS1icm93c2VyLXNuYXBzaG90cy8ke2ZvbGRlcihwbGF0Zm9ybSl9L0xBU1RfQ0hBTkdFYCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhLCBiKSB7XG4gICAgcmV0dXJuIE51bWJlcihhKSAtIE51bWJlcihiKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNocm9taXVtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBnZXRKU09OIH0gZnJvbSAnLi4vaHR0cFV0aWwuanMnO1xuaW1wb3J0IHsgQnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5mdW5jdGlvbiBhcmNoaXZlTmlnaHRseShwbGF0Zm9ybSwgYnVpbGRJZCkge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICByZXR1cm4gYGZpcmVmb3gtJHtidWlsZElkfS5lbi1VUy4ke3BsYXRmb3JtfS14ODZfNjQudGFyLmJ6MmA7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiBgZmlyZWZveC0ke2J1aWxkSWR9LmVuLVVTLm1hYy5kbWdgO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gYGZpcmVmb3gtJHtidWlsZElkfS5lbi1VUy4ke3BsYXRmb3JtfS56aXBgO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFyY2hpdmUocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLkxJTlVYOlxuICAgICAgICAgICAgcmV0dXJuIGBmaXJlZm94LSR7YnVpbGRJZH0udGFyLmJ6MmA7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQ19BUk06XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgIHJldHVybiBgRmlyZWZveCAke2J1aWxkSWR9LmRtZ2A7XG4gICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgIHJldHVybiBgRmlyZWZveCBTZXR1cCAke2J1aWxkSWR9LmV4ZWA7XG4gICAgfVxufVxuZnVuY3Rpb24gcGxhdGZvcm1OYW1lKHBsYXRmb3JtKSB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgIHJldHVybiBgbGludXgteDg2XzY0YDtcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDX0FSTTpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDOlxuICAgICAgICAgICAgcmV0dXJuIGBtYWNgO1xuICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICByZXR1cm4gcGxhdGZvcm07XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VCdWlsZElkKGJ1aWxkSWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMoRmlyZWZveENoYW5uZWwpKSB7XG4gICAgICAgIGlmIChidWlsZElkLnN0YXJ0c1dpdGgodmFsdWUgKyAnXycpKSB7XG4gICAgICAgICAgICBidWlsZElkID0gYnVpbGRJZC5zdWJzdHJpbmcodmFsdWUubGVuZ3RoICsgMSk7XG4gICAgICAgICAgICByZXR1cm4gW3ZhbHVlLCBidWlsZElkXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBkbyBub3QgaGF2ZSBjaGFubmVsIGFzIHRoZSBwcmVmaXguwqtcbiAgICByZXR1cm4gW0ZpcmVmb3hDaGFubmVsLk5JR0hUTFksIGJ1aWxkSWRdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEb3dubG9hZFVybChwbGF0Zm9ybSwgYnVpbGRJZCwgYmFzZVVybCkge1xuICAgIGNvbnN0IFtjaGFubmVsLCByZXNvbHZlZEJ1aWxkSWRdID0gcGFyc2VCdWlsZElkKGJ1aWxkSWQpO1xuICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLk5JR0hUTFk6XG4gICAgICAgICAgICBiYXNlVXJsID8/PVxuICAgICAgICAgICAgICAgICdodHRwczovL2FyY2hpdmUubW96aWxsYS5vcmcvcHViL2ZpcmVmb3gvbmlnaHRseS9sYXRlc3QtbW96aWxsYS1jZW50cmFsJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkRFVkVESVRJT046XG4gICAgICAgICAgICBiYXNlVXJsID8/PSAnaHR0cHM6Ly9hcmNoaXZlLm1vemlsbGEub3JnL3B1Yi9kZXZlZGl0aW9uL3JlbGVhc2VzJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkJFVEE6XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuU1RBQkxFOlxuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkVTUjpcbiAgICAgICAgICAgIGJhc2VVcmwgPz89ICdodHRwczovL2FyY2hpdmUubW96aWxsYS5vcmcvcHViL2ZpcmVmb3gvcmVsZWFzZXMnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLk5JR0hUTFk6XG4gICAgICAgICAgICByZXR1cm4gYCR7YmFzZVVybH0vJHtyZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCByZXNvbHZlZEJ1aWxkSWQpLmpvaW4oJy8nKX1gO1xuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkRFVkVESVRJT046XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuQkVUQTpcbiAgICAgICAgY2FzZSBGaXJlZm94Q2hhbm5lbC5TVEFCTEU6XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuRVNSOlxuICAgICAgICAgICAgcmV0dXJuIGAke2Jhc2VVcmx9LyR7cmVzb2x2ZWRCdWlsZElkfS8ke3BsYXRmb3JtTmFtZShwbGF0Zm9ybSl9L2VuLVVTLyR7YXJjaGl2ZShwbGF0Zm9ybSwgcmVzb2x2ZWRCdWlsZElkKX1gO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRG93bmxvYWRQYXRoKHBsYXRmb3JtLCBidWlsZElkKSB7XG4gICAgcmV0dXJuIFthcmNoaXZlTmlnaHRseShwbGF0Zm9ybSwgYnVpbGRJZCldO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlRXhlY3V0YWJsZVBhdGgocGxhdGZvcm0sIGJ1aWxkSWQpIHtcbiAgICBjb25zdCBbY2hhbm5lbF0gPSBwYXJzZUJ1aWxkSWQoYnVpbGRJZCk7XG4gICAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuTklHSFRMWTpcbiAgICAgICAgICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLk1BQzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignRmlyZWZveCBOaWdodGx5LmFwcCcsICdDb250ZW50cycsICdNYWNPUycsICdmaXJlZm94Jyk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2ZpcmVmb3gnLCAnZmlyZWZveCcpO1xuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjMyOlxuICAgICAgICAgICAgICAgIGNhc2UgQnJvd3NlclBsYXRmb3JtLldJTjY0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aC5qb2luKCdmaXJlZm94JywgJ2ZpcmVmb3guZXhlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgRmlyZWZveENoYW5uZWwuQkVUQTpcbiAgICAgICAgY2FzZSBGaXJlZm94Q2hhbm5lbC5ERVZFRElUSU9OOlxuICAgICAgICBjYXNlIEZpcmVmb3hDaGFubmVsLkVTUjpcbiAgICAgICAgY2FzZSBGaXJlZm94Q2hhbm5lbC5TVEFCTEU6XG4gICAgICAgICAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTUFDX0FSTTpcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ0ZpcmVmb3guYXBwJywgJ0NvbnRlbnRzJywgJ01hY09TJywgJ2ZpcmVmb3gnKTtcbiAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5MSU5VWDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbignZmlyZWZveCcsICdmaXJlZm94Jyk7XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lOMzI6XG4gICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uV0lONjQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLmpvaW4oJ2NvcmUnLCAnZmlyZWZveC5leGUnKTtcbiAgICAgICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgdmFyIEZpcmVmb3hDaGFubmVsO1xuKGZ1bmN0aW9uIChGaXJlZm94Q2hhbm5lbCkge1xuICAgIEZpcmVmb3hDaGFubmVsW1wiU1RBQkxFXCJdID0gXCJzdGFibGVcIjtcbiAgICBGaXJlZm94Q2hhbm5lbFtcIkVTUlwiXSA9IFwiZXNyXCI7XG4gICAgRmlyZWZveENoYW5uZWxbXCJERVZFRElUSU9OXCJdID0gXCJkZXZlZGl0aW9uXCI7XG4gICAgRmlyZWZveENoYW5uZWxbXCJCRVRBXCJdID0gXCJiZXRhXCI7XG4gICAgRmlyZWZveENoYW5uZWxbXCJOSUdIVExZXCJdID0gXCJuaWdodGx5XCI7XG59KShGaXJlZm94Q2hhbm5lbCB8fCAoRmlyZWZveENoYW5uZWwgPSB7fSkpO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCdWlsZElkKGNoYW5uZWwgPSBGaXJlZm94Q2hhbm5lbC5OSUdIVExZKSB7XG4gICAgY29uc3QgY2hhbm5lbFRvVmVyc2lvbktleSA9IHtcbiAgICAgICAgW0ZpcmVmb3hDaGFubmVsLkVTUl06ICdGSVJFRk9YX0VTUicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5TVEFCTEVdOiAnTEFURVNUX0ZJUkVGT1hfVkVSU0lPTicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5ERVZFRElUSU9OXTogJ0ZJUkVGT1hfREVWRURJVElPTicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5CRVRBXTogJ0ZJUkVGT1hfREVWRURJVElPTicsXG4gICAgICAgIFtGaXJlZm94Q2hhbm5lbC5OSUdIVExZXTogJ0ZJUkVGT1hfTklHSFRMWScsXG4gICAgfTtcbiAgICBjb25zdCB2ZXJzaW9ucyA9IChhd2FpdCBnZXRKU09OKG5ldyBVUkwoJ2h0dHBzOi8vcHJvZHVjdC1kZXRhaWxzLm1vemlsbGEub3JnLzEuMC9maXJlZm94X3ZlcnNpb25zLmpzb24nKSkpO1xuICAgIGNvbnN0IHZlcnNpb24gPSB2ZXJzaW9uc1tjaGFubmVsVG9WZXJzaW9uS2V5W2NoYW5uZWxdXTtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaGFubmVsICR7Y2hhbm5lbH0gaXMgbm90IGZvdW5kLmApO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbCArICdfJyArIHZlcnNpb247XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUHJvZmlsZShvcHRpb25zKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKG9wdGlvbnMucGF0aCkpIHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIob3B0aW9ucy5wYXRoLCB7XG4gICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhd2FpdCB3cml0ZVByZWZlcmVuY2VzKHtcbiAgICAgICAgcHJlZmVyZW5jZXM6IHtcbiAgICAgICAgICAgIC4uLmRlZmF1bHRQcm9maWxlUHJlZmVyZW5jZXMob3B0aW9ucy5wcmVmZXJlbmNlcyksXG4gICAgICAgICAgICAuLi5vcHRpb25zLnByZWZlcmVuY2VzLFxuICAgICAgICB9LFxuICAgICAgICBwYXRoOiBvcHRpb25zLnBhdGgsXG4gICAgfSk7XG59XG5mdW5jdGlvbiBkZWZhdWx0UHJvZmlsZVByZWZlcmVuY2VzKGV4dHJhUHJlZnMpIHtcbiAgICBjb25zdCBzZXJ2ZXIgPSAnZHVtbXkudGVzdCc7XG4gICAgY29uc3QgZGVmYXVsdFByZWZzID0ge1xuICAgICAgICAvLyBNYWtlIHN1cmUgU2hpZWxkIGRvZXNuJ3QgaGl0IHRoZSBuZXR3b3JrLlxuICAgICAgICAnYXBwLm5vcm1hbmR5LmFwaV91cmwnOiAnJyxcbiAgICAgICAgLy8gRGlzYWJsZSBGaXJlZm94IG9sZCBidWlsZCBiYWNrZ3JvdW5kIGNoZWNrXG4gICAgICAgICdhcHAudXBkYXRlLmNoZWNrSW5zdGFsbFRpbWUnOiBmYWxzZSxcbiAgICAgICAgLy8gRGlzYWJsZSBhdXRvbWF0aWNhbGx5IHVwZ3JhZGluZyBGaXJlZm94XG4gICAgICAgICdhcHAudXBkYXRlLmRpc2FibGVkRm9yVGVzdGluZyc6IHRydWUsXG4gICAgICAgIC8vIEluY3JlYXNlIHRoZSBBUFogY29udGVudCByZXNwb25zZSB0aW1lb3V0IHRvIDEgbWludXRlXG4gICAgICAgICdhcHouY29udGVudF9yZXNwb25zZV90aW1lb3V0JzogNjAwMDAsXG4gICAgICAgIC8vIFByZXZlbnQgdmFyaW91cyBlcnJvciBtZXNzYWdlIG9uIHRoZSBjb25zb2xlXG4gICAgICAgIC8vIGplc3QtcHVwcGV0ZWVyIGFzc2VydHMgdGhhdCBubyBlcnJvciBtZXNzYWdlIGlzIGVtaXR0ZWQgYnkgdGhlIGNvbnNvbGVcbiAgICAgICAgJ2Jyb3dzZXIuY29udGVudGJsb2NraW5nLmZlYXR1cmVzLnN0YW5kYXJkJzogJy10cCx0cFByaXZhdGUsY29va2llQmVoYXZpb3IwLC1jbSwtZnAnLFxuICAgICAgICAvLyBFbmFibGUgdGhlIGR1bXAgZnVuY3Rpb246IHdoaWNoIHNlbmRzIG1lc3NhZ2VzIHRvIHRoZSBzeXN0ZW1cbiAgICAgICAgLy8gY29uc29sZVxuICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTQzMTE1XG4gICAgICAgICdicm93c2VyLmRvbS53aW5kb3cuZHVtcC5lbmFibGVkJzogdHJ1ZSxcbiAgICAgICAgLy8gRGlzYWJsZSB0b3BzdG9yaWVzXG4gICAgICAgICdicm93c2VyLm5ld3RhYnBhZ2UuYWN0aXZpdHktc3RyZWFtLmZlZWRzLnN5c3RlbS50b3BzdG9yaWVzJzogZmFsc2UsXG4gICAgICAgIC8vIEFsd2F5cyBkaXNwbGF5IGEgYmxhbmsgcGFnZVxuICAgICAgICAnYnJvd3Nlci5uZXd0YWJwYWdlLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gQmFja2dyb3VuZCB0aHVtYm5haWxzIGluIHBhcnRpY3VsYXIgY2F1c2UgZ3JpZWY6IGFuZCBkaXNhYmxpbmdcbiAgICAgICAgLy8gdGh1bWJuYWlscyBpbiBnZW5lcmFsIGNhbm5vdCBodXJ0XG4gICAgICAgICdicm93c2VyLnBhZ2V0aHVtYm5haWxzLmNhcHR1cmluZ19kaXNhYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIERpc2FibGUgc2FmZWJyb3dzaW5nIGNvbXBvbmVudHMuXG4gICAgICAgICdicm93c2VyLnNhZmVicm93c2luZy5ibG9ja2VkVVJJcy5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgICdicm93c2VyLnNhZmVicm93c2luZy5kb3dubG9hZHMuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAnYnJvd3Nlci5zYWZlYnJvd3NpbmcubWFsd2FyZS5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgICdicm93c2VyLnNhZmVicm93c2luZy5waGlzaGluZy5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgdXBkYXRlcyB0byBzZWFyY2ggZW5naW5lcy5cbiAgICAgICAgJ2Jyb3dzZXIuc2VhcmNoLnVwZGF0ZSc6IGZhbHNlLFxuICAgICAgICAvLyBEbyBub3QgcmVzdG9yZSB0aGUgbGFzdCBvcGVuIHNldCBvZiB0YWJzIGlmIHRoZSBicm93c2VyIGhhcyBjcmFzaGVkXG4gICAgICAgICdicm93c2VyLnNlc3Npb25zdG9yZS5yZXN1bWVfZnJvbV9jcmFzaCc6IGZhbHNlLFxuICAgICAgICAvLyBTa2lwIGNoZWNrIGZvciBkZWZhdWx0IGJyb3dzZXIgb24gc3RhcnR1cFxuICAgICAgICAnYnJvd3Nlci5zaGVsbC5jaGVja0RlZmF1bHRCcm93c2VyJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgbmV3dGFicGFnZVxuICAgICAgICAnYnJvd3Nlci5zdGFydHVwLmhvbWVwYWdlJzogJ2Fib3V0OmJsYW5rJyxcbiAgICAgICAgLy8gRG8gbm90IHJlZGlyZWN0IHVzZXIgd2hlbiBhIG1pbHN0b25lIHVwZ3JhZGUgb2YgRmlyZWZveCBpcyBkZXRlY3RlZFxuICAgICAgICAnYnJvd3Nlci5zdGFydHVwLmhvbWVwYWdlX292ZXJyaWRlLm1zdG9uZSc6ICdpZ25vcmUnLFxuICAgICAgICAvLyBTdGFydCB3aXRoIGEgYmxhbmsgcGFnZSBhYm91dDpibGFua1xuICAgICAgICAnYnJvd3Nlci5zdGFydHVwLnBhZ2UnOiAwLFxuICAgICAgICAvLyBEbyBub3QgYWxsb3cgYmFja2dyb3VuZCB0YWJzIHRvIGJlIHpvbWJpZmllZCBvbiBBbmRyb2lkOiBvdGhlcndpc2UgZm9yXG4gICAgICAgIC8vIHRlc3RzIHRoYXQgb3BlbiBhZGRpdGlvbmFsIHRhYnM6IHRoZSB0ZXN0IGhhcm5lc3MgdGFiIGl0c2VsZiBtaWdodCBnZXRcbiAgICAgICAgLy8gdW5sb2FkZWRcbiAgICAgICAgJ2Jyb3dzZXIudGFicy5kaXNhYmxlQmFja2dyb3VuZFpvbWJpZmljYXRpb24nOiBmYWxzZSxcbiAgICAgICAgLy8gRG8gbm90IHdhcm4gd2hlbiBjbG9zaW5nIGFsbCBvdGhlciBvcGVuIHRhYnNcbiAgICAgICAgJ2Jyb3dzZXIudGFicy53YXJuT25DbG9zZU90aGVyVGFicyc6IGZhbHNlLFxuICAgICAgICAvLyBEbyBub3Qgd2FybiB3aGVuIG11bHRpcGxlIHRhYnMgd2lsbCBiZSBvcGVuZWRcbiAgICAgICAgJ2Jyb3dzZXIudGFicy53YXJuT25PcGVuJzogZmFsc2UsXG4gICAgICAgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IG9mZmVyIHRyYW5zbGF0aW9ucywgYXMgdGVzdHMgZG8gbm90IGV4cGVjdCB0aGlzLlxuICAgICAgICAnYnJvd3Nlci50cmFuc2xhdGlvbnMuYXV0b21hdGljYWxseVBvcHVwJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgdGhlIFVJIHRvdXIuXG4gICAgICAgICdicm93c2VyLnVpdG91ci5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIFR1cm4gb2ZmIHNlYXJjaCBzdWdnZXN0aW9ucyBpbiB0aGUgbG9jYXRpb24gYmFyIHNvIGFzIG5vdCB0byB0cmlnZ2VyXG4gICAgICAgIC8vIG5ldHdvcmsgY29ubmVjdGlvbnMuXG4gICAgICAgICdicm93c2VyLnVybGJhci5zdWdnZXN0LnNlYXJjaGVzJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgZmlyc3QgcnVuIHNwbGFzaCBwYWdlIG9uIFdpbmRvd3MgMTBcbiAgICAgICAgJ2Jyb3dzZXIudXNlZE9uV2luZG93czEwLmludHJvVVJMJzogJycsXG4gICAgICAgIC8vIERvIG5vdCB3YXJuIG9uIHF1aXR0aW5nIEZpcmVmb3hcbiAgICAgICAgJ2Jyb3dzZXIud2Fybk9uUXVpdCc6IGZhbHNlLFxuICAgICAgICAvLyBEZWZlbnNpdmVseSBkaXNhYmxlIGRhdGEgcmVwb3J0aW5nIHN5c3RlbXNcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcuaGVhbHRocmVwb3J0LmRvY3VtZW50U2VydmVyVVJJJzogYGh0dHA6Ly8ke3NlcnZlcn0vZHVtbXkvaGVhbHRocmVwb3J0L2AsXG4gICAgICAgICdkYXRhcmVwb3J0aW5nLmhlYWx0aHJlcG9ydC5sb2dnaW5nLmNvbnNvbGVFbmFibGVkJzogZmFsc2UsXG4gICAgICAgICdkYXRhcmVwb3J0aW5nLmhlYWx0aHJlcG9ydC5zZXJ2aWNlLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcuaGVhbHRocmVwb3J0LnNlcnZpY2UuZmlyc3RSdW4nOiBmYWxzZSxcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcuaGVhbHRocmVwb3J0LnVwbG9hZEVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gRG8gbm90IHNob3cgZGF0YXJlcG9ydGluZyBwb2xpY3kgbm90aWZpY2F0aW9ucyB3aGljaCBjYW4gaW50ZXJmZXJlIHdpdGggdGVzdHNcbiAgICAgICAgJ2RhdGFyZXBvcnRpbmcucG9saWN5LmRhdGFTdWJtaXNzaW9uRW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAnZGF0YXJlcG9ydGluZy5wb2xpY3kuZGF0YVN1Ym1pc3Npb25Qb2xpY3lCeXBhc3NOb3RpZmljYXRpb24nOiB0cnVlLFxuICAgICAgICAvLyBEZXZUb29scyBKU09OVmlld2VyIHNvbWV0aW1lcyBmYWlscyB0byBsb2FkIGRlcGVuZGVuY2llcyB3aXRoIGl0cyByZXF1aXJlLmpzLlxuICAgICAgICAvLyBUaGlzIGRvZXNuJ3QgYWZmZWN0IFB1cHBldGVlciBidXQgc3BhbXMgY29uc29sZSAoQnVnIDE0MjQzNzIpXG4gICAgICAgICdkZXZ0b29scy5qc29udmlldy5lbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgcG9wdXAtYmxvY2tlclxuICAgICAgICAnZG9tLmRpc2FibGVfb3Blbl9kdXJpbmdfbG9hZCc6IGZhbHNlLFxuICAgICAgICAvLyBFbmFibGUgdGhlIHN1cHBvcnQgZm9yIEZpbGUgb2JqZWN0IGNyZWF0aW9uIGluIHRoZSBjb250ZW50IHByb2Nlc3NcbiAgICAgICAgLy8gUmVxdWlyZWQgZm9yIHxQYWdlLnNldEZpbGVJbnB1dEZpbGVzfCBwcm90b2NvbCBtZXRob2QuXG4gICAgICAgICdkb20uZmlsZS5jcmVhdGVJbkNoaWxkJzogdHJ1ZSxcbiAgICAgICAgLy8gRGlzYWJsZSB0aGUgUHJvY2Vzc0hhbmdNb25pdG9yXG4gICAgICAgICdkb20uaXBjLnJlcG9ydFByb2Nlc3NIYW5ncyc6IGZhbHNlLFxuICAgICAgICAvLyBEaXNhYmxlIHNsb3cgc2NyaXB0IGRpYWxvZ3Vlc1xuICAgICAgICAnZG9tLm1heF9jaHJvbWVfc2NyaXB0X3J1bl90aW1lJzogMCxcbiAgICAgICAgJ2RvbS5tYXhfc2NyaXB0X3J1bl90aW1lJzogMCxcbiAgICAgICAgLy8gT25seSBsb2FkIGV4dGVuc2lvbnMgZnJvbSB0aGUgYXBwbGljYXRpb24gYW5kIHVzZXIgcHJvZmlsZVxuICAgICAgICAvLyBBZGRvbk1hbmFnZXIuU0NPUEVfUFJPRklMRSArIEFkZG9uTWFuYWdlci5TQ09QRV9BUFBMSUNBVElPTlxuICAgICAgICAnZXh0ZW5zaW9ucy5hdXRvRGlzYWJsZVNjb3Blcyc6IDAsXG4gICAgICAgICdleHRlbnNpb25zLmVuYWJsZWRTY29wZXMnOiA1LFxuICAgICAgICAvLyBEaXNhYmxlIG1ldGFkYXRhIGNhY2hpbmcgZm9yIGluc3RhbGxlZCBhZGQtb25zIGJ5IGRlZmF1bHRcbiAgICAgICAgJ2V4dGVuc2lvbnMuZ2V0QWRkb25zLmNhY2hlLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gRGlzYWJsZSBpbnN0YWxsaW5nIGFueSBkaXN0cmlidXRpb24gZXh0ZW5zaW9ucyBvciBhZGQtb25zLlxuICAgICAgICAnZXh0ZW5zaW9ucy5pbnN0YWxsRGlzdHJvQWRkb25zJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGVkIHNjcmVlbnNob3RzIGV4dGVuc2lvblxuICAgICAgICAnZXh0ZW5zaW9ucy5zY3JlZW5zaG90cy5kaXNhYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIFR1cm4gb2ZmIGV4dGVuc2lvbiB1cGRhdGVzIHNvIHRoZXkgZG8gbm90IGJvdGhlciB0ZXN0c1xuICAgICAgICAnZXh0ZW5zaW9ucy51cGRhdGUuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBUdXJuIG9mZiBleHRlbnNpb24gdXBkYXRlcyBzbyB0aGV5IGRvIG5vdCBib3RoZXIgdGVzdHNcbiAgICAgICAgJ2V4dGVuc2lvbnMudXBkYXRlLm5vdGlmeVVzZXInOiBmYWxzZSxcbiAgICAgICAgLy8gTWFrZSBzdXJlIG9wZW5pbmcgYWJvdXQ6YWRkb25zIHdpbGwgbm90IGhpdCB0aGUgbmV0d29ya1xuICAgICAgICAnZXh0ZW5zaW9ucy53ZWJzZXJ2aWNlLmRpc2NvdmVyVVJMJzogYGh0dHA6Ly8ke3NlcnZlcn0vZHVtbXkvZGlzY292ZXJ5VVJMYCxcbiAgICAgICAgLy8gQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGhhdmUgZm9jdXMgZXZlbiBpdCBydW5zIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgICAgICdmb2N1c21hbmFnZXIudGVzdG1vZGUnOiB0cnVlLFxuICAgICAgICAvLyBEaXNhYmxlIHVzZXJhZ2VudCB1cGRhdGVzXG4gICAgICAgICdnZW5lcmFsLnVzZXJhZ2VudC51cGRhdGVzLmVuYWJsZWQnOiBmYWxzZSxcbiAgICAgICAgLy8gQWx3YXlzIHVzZSBuZXR3b3JrIHByb3ZpZGVyIGZvciBnZW9sb2NhdGlvbiB0ZXN0cyBzbyB3ZSBieXBhc3MgdGhlXG4gICAgICAgIC8vIG1hY09TIGRpYWxvZyByYWlzZWQgYnkgdGhlIGNvcmVsb2NhdGlvbiBwcm92aWRlclxuICAgICAgICAnZ2VvLnByb3ZpZGVyLnRlc3RpbmcnOiB0cnVlLFxuICAgICAgICAvLyBEbyBub3Qgc2NhbiBXaWZpXG4gICAgICAgICdnZW8ud2lmaS5zY2FuJzogZmFsc2UsXG4gICAgICAgIC8vIE5vIGhhbmcgbW9uaXRvclxuICAgICAgICAnaGFuZ21vbml0b3IudGltZW91dCc6IDAsXG4gICAgICAgIC8vIFNob3cgY2hyb21lIGVycm9ycyBhbmQgd2FybmluZ3MgaW4gdGhlIGVycm9yIGNvbnNvbGVcbiAgICAgICAgJ2phdmFzY3JpcHQub3B0aW9ucy5zaG93SW5Db25zb2xlJzogdHJ1ZSxcbiAgICAgICAgLy8gRGlzYWJsZSBkb3dubG9hZCBhbmQgdXNhZ2Ugb2YgT3BlbkgyNjQ6IGFuZCBXaWRldmluZSBwbHVnaW5zXG4gICAgICAgICdtZWRpYS5nbXAtbWFuYWdlci51cGRhdGVFbmFibGVkJzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgdGhlIEdGWCBzYW5pdHkgd2luZG93XG4gICAgICAgICdtZWRpYS5zYW5pdHktdGVzdC5kaXNhYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIERpc2FibGUgZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBOaWdodGx5XG4gICAgICAgICduZXR3b3JrLmNvb2tpZS5zYW1lU2l0ZS5sYXhCeURlZmF1bHQnOiBmYWxzZSxcbiAgICAgICAgLy8gRG8gbm90IHByb21wdCBmb3IgdGVtcG9yYXJ5IHJlZGlyZWN0c1xuICAgICAgICAnbmV0d29yay5odHRwLnByb21wdC10ZW1wLXJlZGlyZWN0JzogZmFsc2UsXG4gICAgICAgIC8vIERpc2FibGUgc3BlY3VsYXRpdmUgY29ubmVjdGlvbnMgc28gdGhleSBhcmUgbm90IHJlcG9ydGVkIGFzIGxlYWtpbmdcbiAgICAgICAgLy8gd2hlbiB0aGV5IGFyZSBoYW5naW5nIGFyb3VuZFxuICAgICAgICAnbmV0d29yay5odHRwLnNwZWN1bGF0aXZlLXBhcmFsbGVsLWxpbWl0JzogMCxcbiAgICAgICAgLy8gRG8gbm90IGF1dG9tYXRpY2FsbHkgc3dpdGNoIGJldHdlZW4gb2ZmbGluZSBhbmQgb25saW5lXG4gICAgICAgICduZXR3b3JrLm1hbmFnZS1vZmZsaW5lLXN0YXR1cyc6IGZhbHNlLFxuICAgICAgICAvLyBNYWtlIHN1cmUgU05UUCByZXF1ZXN0cyBkbyBub3QgaGl0IHRoZSBuZXR3b3JrXG4gICAgICAgICduZXR3b3JrLnNudHAucG9vbHMnOiBzZXJ2ZXIsXG4gICAgICAgIC8vIERpc2FibGUgRmxhc2guXG4gICAgICAgICdwbHVnaW4uc3RhdGUuZmxhc2gnOiAwLFxuICAgICAgICAncHJpdmFjeS50cmFja2luZ3Byb3RlY3Rpb24uZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBDYW4gYmUgcmVtb3ZlZCBvbmNlIEZpcmVmb3ggODkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzEwODM5XG4gICAgICAgICdyZW1vdGUuZW5hYmxlZCc6IHRydWUsXG4gICAgICAgIC8vIERvbid0IGRvIG5ldHdvcmsgY29ubmVjdGlvbnMgZm9yIG1pdG0gcHJpbWluZ1xuICAgICAgICAnc2VjdXJpdHkuY2VydGVycm9ycy5taXRtLnByaW1pbmcuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBMb2NhbCBkb2N1bWVudHMgaGF2ZSBhY2Nlc3MgdG8gYWxsIG90aGVyIGxvY2FsIGRvY3VtZW50cyxcbiAgICAgICAgLy8gaW5jbHVkaW5nIGRpcmVjdG9yeSBsaXN0aW5nc1xuICAgICAgICAnc2VjdXJpdHkuZmlsZXVyaS5zdHJpY3Rfb3JpZ2luX3BvbGljeSc6IGZhbHNlLFxuICAgICAgICAvLyBEbyBub3Qgd2FpdCBmb3IgdGhlIG5vdGlmaWNhdGlvbiBidXR0b24gc2VjdXJpdHkgZGVsYXlcbiAgICAgICAgJ3NlY3VyaXR5Lm5vdGlmaWNhdGlvbl9lbmFibGVfZGVsYXknOiAwLFxuICAgICAgICAvLyBFbnN1cmUgYmxvY2tsaXN0IHVwZGF0ZXMgZG8gbm90IGhpdCB0aGUgbmV0d29ya1xuICAgICAgICAnc2VydmljZXMuc2V0dGluZ3Muc2VydmVyJzogYGh0dHA6Ly8ke3NlcnZlcn0vZHVtbXkvYmxvY2tsaXN0L2AsXG4gICAgICAgIC8vIERvIG5vdCBhdXRvbWF0aWNhbGx5IGZpbGwgc2lnbi1pbiBmb3JtcyB3aXRoIGtub3duIHVzZXJuYW1lcyBhbmRcbiAgICAgICAgLy8gcGFzc3dvcmRzXG4gICAgICAgICdzaWdub24uYXV0b2ZpbGxGb3Jtcyc6IGZhbHNlLFxuICAgICAgICAvLyBEaXNhYmxlIHBhc3N3b3JkIGNhcHR1cmUsIHNvIHRoYXQgdGVzdHMgdGhhdCBpbmNsdWRlIGZvcm1zIGFyZSBub3RcbiAgICAgICAgLy8gaW5mbHVlbmNlZCBieSB0aGUgcHJlc2VuY2Ugb2YgdGhlIHBlcnNpc3RlbnQgZG9vcmhhbmdlciBub3RpZmljYXRpb25cbiAgICAgICAgJ3NpZ25vbi5yZW1lbWJlclNpZ25vbnMnOiBmYWxzZSxcbiAgICAgICAgLy8gRGlzYWJsZSBmaXJzdC1ydW4gd2VsY29tZSBwYWdlXG4gICAgICAgICdzdGFydHVwLmhvbWVwYWdlX3dlbGNvbWVfdXJsJzogJ2Fib3V0OmJsYW5rJyxcbiAgICAgICAgLy8gRGlzYWJsZSBmaXJzdC1ydW4gd2VsY29tZSBwYWdlXG4gICAgICAgICdzdGFydHVwLmhvbWVwYWdlX3dlbGNvbWVfdXJsLmFkZGl0aW9uYWwnOiAnJyxcbiAgICAgICAgLy8gRGlzYWJsZSBicm93c2VyIGFuaW1hdGlvbnMgKHRhYnMsIGZ1bGxzY3JlZW4sIHNsaWRpbmcgYWxlcnRzKVxuICAgICAgICAndG9vbGtpdC5jb3NtZXRpY0FuaW1hdGlvbnMuZW5hYmxlZCc6IGZhbHNlLFxuICAgICAgICAvLyBQcmV2ZW50IHN0YXJ0aW5nIGludG8gc2FmZSBtb2RlIGFmdGVyIGFwcGxpY2F0aW9uIGNyYXNoZXNcbiAgICAgICAgJ3Rvb2xraXQuc3RhcnR1cC5tYXhfcmVzdW1lZF9jcmFzaGVzJzogLTEsXG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihkZWZhdWx0UHJlZnMsIGV4dHJhUHJlZnMpO1xufVxuLyoqXG4gKiBQb3B1bGF0ZXMgdGhlIHVzZXIuanMgZmlsZSB3aXRoIGN1c3RvbSBwcmVmZXJlbmNlcyBhcyBuZWVkZWQgdG8gYWxsb3dcbiAqIEZpcmVmb3gncyBDRFAgc3VwcG9ydCB0byBwcm9wZXJseSBmdW5jdGlvbi4gVGhlc2UgcHJlZmVyZW5jZXMgd2lsbCBiZVxuICogYXV0b21hdGljYWxseSBjb3BpZWQgb3ZlciB0byBwcmVmcy5qcyBkdXJpbmcgc3RhcnR1cCBvZiBGaXJlZm94LiBUbyBiZVxuICogYWJsZSB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZXMgb2YgcHJlZmVyZW5jZXMgYSBiYWNrdXAgb2YgcHJlZnMuanNcbiAqIHdpbGwgYmUgY3JlYXRlZC5cbiAqXG4gKiBAcGFyYW0gcHJlZnMgLSBMaXN0IG9mIHByZWZlcmVuY2VzIHRvIGFkZC5cbiAqIEBwYXJhbSBwcm9maWxlUGF0aCAtIEZpcmVmb3ggcHJvZmlsZSB0byB3cml0ZSB0aGUgcHJlZmVyZW5jZXMgdG8uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlUHJlZmVyZW5jZXMob3B0aW9ucykge1xuICAgIGNvbnN0IHByZWZzUGF0aCA9IHBhdGguam9pbihvcHRpb25zLnBhdGgsICdwcmVmcy5qcycpO1xuICAgIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucy5wcmVmZXJlbmNlcykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgcmV0dXJuIGB1c2VyX3ByZWYoJHtKU09OLnN0cmluZ2lmeShrZXkpfSwgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9KTtgO1xuICAgIH0pO1xuICAgIC8vIFVzZSBhbGxTZXR0bGVkIHRvIHByZXZlbnQgY29ycnVwdGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ob3B0aW9ucy5wYXRoLCAndXNlci5qcycpLCBsaW5lcy5qb2luKCdcXG4nKSksXG4gICAgICAgIC8vIENyZWF0ZSBhIGJhY2t1cCBvZiB0aGUgcHJlZmVyZW5jZXMgZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXRzdHMuXG4gICAgICAgIGZzLnByb21pc2VzLmFjY2VzcyhwcmVmc1BhdGgsIGZzLmNvbnN0YW50cy5GX09LKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLmNvcHlGaWxlKHByZWZzUGF0aCwgcGF0aC5qb2luKG9wdGlvbnMucGF0aCwgJ3ByZWZzLmpzLnB1cHBldGVlcicpKTtcbiAgICAgICAgfSwgXG4gICAgICAgIC8vIFN3YWxsb3cgb25seSBpZiBmaWxlIGRvZXMgbm90IGV4aXN0XG4gICAgICAgICgpID0+IHsgfSksXG4gICAgXSk7XG4gICAgZm9yIChjb25zdCBjb21tYW5kIG9mIHJlc3VsdCkge1xuICAgICAgICBpZiAoY29tbWFuZC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAgIHRocm93IGNvbW1hbmQucmVhc29uO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyhhLCBiKSB7XG4gICAgLy8gVE9ETzogdGhpcyBpcyBhIG5vdCB2ZXJ5IHJlbGlhYmxlIGNoZWNrLlxuICAgIHJldHVybiBwYXJzZUludChhLnJlcGxhY2UoJy4nLCAnJyksIDE2KSAtIHBhcnNlSW50KGIucmVwbGFjZSgnLicsICcnKSwgMTYpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlyZWZveC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBTdXBwb3J0ZWQgYnJvd3NlcnMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIEJyb3dzZXI7XG4oZnVuY3Rpb24gKEJyb3dzZXIpIHtcbiAgICBCcm93c2VyW1wiQ0hST01FXCJdID0gXCJjaHJvbWVcIjtcbiAgICBCcm93c2VyW1wiQ0hST01FSEVBRExFU1NTSEVMTFwiXSA9IFwiY2hyb21lLWhlYWRsZXNzLXNoZWxsXCI7XG4gICAgQnJvd3NlcltcIkNIUk9NSVVNXCJdID0gXCJjaHJvbWl1bVwiO1xuICAgIEJyb3dzZXJbXCJGSVJFRk9YXCJdID0gXCJmaXJlZm94XCI7XG4gICAgQnJvd3NlcltcIkNIUk9NRURSSVZFUlwiXSA9IFwiY2hyb21lZHJpdmVyXCI7XG59KShCcm93c2VyIHx8IChCcm93c2VyID0ge30pKTtcbi8qKlxuICogUGxhdGZvcm0gbmFtZXMgdXNlZCB0byBpZGVudGlmeSBhIE9TIHBsYXRmb3JtIHggYXJjaGl0ZWN0dXJlIGNvbWJpbmF0aW9uIGluIHRoZSB3YXlcbiAqIHRoYXQgaXMgcmVsZXZhbnQgZm9yIHRoZSBicm93c2VyIGRvd25sb2FkLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBCcm93c2VyUGxhdGZvcm07XG4oZnVuY3Rpb24gKEJyb3dzZXJQbGF0Zm9ybSkge1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIkxJTlVYXCJdID0gXCJsaW51eFwiO1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIk1BQ1wiXSA9IFwibWFjXCI7XG4gICAgQnJvd3NlclBsYXRmb3JtW1wiTUFDX0FSTVwiXSA9IFwibWFjX2FybVwiO1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIldJTjMyXCJdID0gXCJ3aW4zMlwiO1xuICAgIEJyb3dzZXJQbGF0Zm9ybVtcIldJTjY0XCJdID0gXCJ3aW42NFwiO1xufSkoQnJvd3NlclBsYXRmb3JtIHx8IChCcm93c2VyUGxhdGZvcm0gPSB7fSkpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgQnJvd3NlclRhZztcbihmdW5jdGlvbiAoQnJvd3NlclRhZykge1xuICAgIEJyb3dzZXJUYWdbXCJDQU5BUllcIl0gPSBcImNhbmFyeVwiO1xuICAgIEJyb3dzZXJUYWdbXCJOSUdIVExZXCJdID0gXCJuaWdodGx5XCI7XG4gICAgQnJvd3NlclRhZ1tcIkJFVEFcIl0gPSBcImJldGFcIjtcbiAgICBCcm93c2VyVGFnW1wiREVWXCJdID0gXCJkZXZcIjtcbiAgICBCcm93c2VyVGFnW1wiREVWRURJVElPTlwiXSA9IFwiZGV2ZWRpdGlvblwiO1xuICAgIEJyb3dzZXJUYWdbXCJTVEFCTEVcIl0gPSBcInN0YWJsZVwiO1xuICAgIEJyb3dzZXJUYWdbXCJFU1JcIl0gPSBcImVzclwiO1xuICAgIEJyb3dzZXJUYWdbXCJMQVRFU1RcIl0gPSBcImxhdGVzdFwiO1xufSkoQnJvd3NlclRhZyB8fCAoQnJvd3NlclRhZyA9IHt9KSk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBDaHJvbWVSZWxlYXNlQ2hhbm5lbDtcbihmdW5jdGlvbiAoQ2hyb21lUmVsZWFzZUNoYW5uZWwpIHtcbiAgICBDaHJvbWVSZWxlYXNlQ2hhbm5lbFtcIlNUQUJMRVwiXSA9IFwic3RhYmxlXCI7XG4gICAgQ2hyb21lUmVsZWFzZUNoYW5uZWxbXCJERVZcIl0gPSBcImRldlwiO1xuICAgIENocm9tZVJlbGVhc2VDaGFubmVsW1wiQ0FOQVJZXCJdID0gXCJjYW5hcnlcIjtcbiAgICBDaHJvbWVSZWxlYXNlQ2hhbm5lbFtcIkJFVEFcIl0gPSBcImJldGFcIjtcbn0pKENocm9tZVJlbGVhc2VDaGFubmVsIHx8IChDaHJvbWVSZWxlYXNlQ2hhbm5lbCA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmV4cG9ydCB7IGRlYnVnIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWJ1Zy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCB7IEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEJyb3dzZXJQbGF0Zm9ybSgpIHtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IG9zLnBsYXRmb3JtKCk7XG4gICAgc3dpdGNoIChwbGF0Zm9ybSkge1xuICAgICAgICBjYXNlICdkYXJ3aW4nOlxuICAgICAgICAgICAgcmV0dXJuIG9zLmFyY2goKSA9PT0gJ2FybTY0J1xuICAgICAgICAgICAgICAgID8gQnJvd3NlclBsYXRmb3JtLk1BQ19BUk1cbiAgICAgICAgICAgICAgICA6IEJyb3dzZXJQbGF0Zm9ybS5NQUM7XG4gICAgICAgIGNhc2UgJ2xpbnV4JzpcbiAgICAgICAgICAgIHJldHVybiBCcm93c2VyUGxhdGZvcm0uTElOVVg7XG4gICAgICAgIGNhc2UgJ3dpbjMyJzpcbiAgICAgICAgICAgIHJldHVybiBvcy5hcmNoKCkgPT09ICd4NjQnIHx8XG4gICAgICAgICAgICAgICAgLy8gV2luZG93cyAxMSBmb3IgQVJNIHN1cHBvcnRzIHg2NCBlbXVsYXRpb25cbiAgICAgICAgICAgICAgICAob3MuYXJjaCgpID09PSAnYXJtNjQnICYmIGlzV2luZG93czExKG9zLnJlbGVhc2UoKSkpXG4gICAgICAgICAgICAgICAgPyBCcm93c2VyUGxhdGZvcm0uV0lONjRcbiAgICAgICAgICAgICAgICA6IEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLyoqXG4gKiBXaW5kb3dzIDExIGlzIGlkZW50aWZpZWQgYnkgdGhlIHZlcnNpb24gMTAuMC4yMjAwMCBvciBncmVhdGVyXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gaXNXaW5kb3dzMTEodmVyc2lvbikge1xuICAgIGNvbnN0IHBhcnRzID0gdmVyc2lvbi5zcGxpdCgnLicpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgIGNvbnN0IG1ham9yID0gcGFyc2VJbnQocGFydHNbMF0sIDEwKTtcbiAgICAgICAgY29uc3QgbWlub3IgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApO1xuICAgICAgICBjb25zdCBwYXRjaCA9IHBhcnNlSW50KHBhcnRzWzJdLCAxMCk7XG4gICAgICAgIHJldHVybiAobWFqb3IgPiAxMCB8fFxuICAgICAgICAgICAgKG1ham9yID09PSAxMCAmJiBtaW5vciA+IDApIHx8XG4gICAgICAgICAgICAobWFqb3IgPT09IDEwICYmIG1pbm9yID09PSAwICYmIHBhdGNoID49IDIyMDAwKSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRldGVjdFBsYXRmb3JtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBleGVjIGFzIGV4ZWNDaGlsZFByb2Nlc3MsIHNwYXduU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyIH0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IGV4dHJhY3RaaXAgZnJvbSAnZXh0cmFjdC16aXAnO1xuaW1wb3J0IHRhciBmcm9tICd0YXItZnMnO1xuaW1wb3J0IGJ6aXAgZnJvbSAndW5iemlwMi1zdHJlYW0nO1xuY29uc3QgZXhlYyA9IHByb21pc2lmeShleGVjQ2hpbGRQcm9jZXNzKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bnBhY2tBcmNoaXZlKGFyY2hpdmVQYXRoLCBmb2xkZXJQYXRoKSB7XG4gICAgaWYgKGFyY2hpdmVQYXRoLmVuZHNXaXRoKCcuemlwJykpIHtcbiAgICAgICAgYXdhaXQgZXh0cmFjdFppcChhcmNoaXZlUGF0aCwgeyBkaXI6IGZvbGRlclBhdGggfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyY2hpdmVQYXRoLmVuZHNXaXRoKCcudGFyLmJ6MicpKSB7XG4gICAgICAgIGF3YWl0IGV4dHJhY3RUYXIoYXJjaGl2ZVBhdGgsIGZvbGRlclBhdGgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmNoaXZlUGF0aC5lbmRzV2l0aCgnLmRtZycpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGZvbGRlclBhdGgpO1xuICAgICAgICBhd2FpdCBpbnN0YWxsRE1HKGFyY2hpdmVQYXRoLCBmb2xkZXJQYXRoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJjaGl2ZVBhdGguZW5kc1dpdGgoJy5leGUnKSkge1xuICAgICAgICAvLyBGaXJlZm94IG9uIFdpbmRvd3MuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhhcmNoaXZlUGF0aCwgW2AvRXh0cmFjdERpcj0ke2ZvbGRlclBhdGh9YF0sIHtcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgIF9fY29tcGF0X2xheWVyOiAnUnVuQXNJbnZva2VyJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZXh0cmFjdCAke2FyY2hpdmVQYXRofSB0byAke2ZvbGRlclBhdGh9OiAke3Jlc3VsdC5vdXRwdXR9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgYXJjaGl2ZSBmb3JtYXQ6ICR7YXJjaGl2ZVBhdGh9YCk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFRhcih0YXJQYXRoLCBmb2xkZXJQYXRoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChmdWxmaWxsLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdGFyU3RyZWFtID0gdGFyLmV4dHJhY3QoZm9sZGVyUGF0aCk7XG4gICAgICAgIHRhclN0cmVhbS5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgICB0YXJTdHJlYW0ub24oJ2ZpbmlzaCcsIGZ1bGZpbGwpO1xuICAgICAgICBjb25zdCByZWFkU3RyZWFtID0gY3JlYXRlUmVhZFN0cmVhbSh0YXJQYXRoKTtcbiAgICAgICAgcmVhZFN0cmVhbS5waXBlKGJ6aXAoKSkucGlwZSh0YXJTdHJlYW0pO1xuICAgIH0pO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbERNRyhkbWdQYXRoLCBmb2xkZXJQYXRoKSB7XG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWMoYGhkaXV0aWwgYXR0YWNoIC1ub2Jyb3dzZSAtbm9hdXRvb3BlbiBcIiR7ZG1nUGF0aH1cImApO1xuICAgIGNvbnN0IHZvbHVtZXMgPSBzdGRvdXQubWF0Y2goL1xcL1ZvbHVtZXNcXC8oLiopL20pO1xuICAgIGlmICghdm9sdW1lcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHZvbHVtZSBwYXRoIGluICR7c3Rkb3V0fWApO1xuICAgIH1cbiAgICBjb25zdCBtb3VudFBhdGggPSB2b2x1bWVzWzBdO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIobW91bnRQYXRoKTtcbiAgICAgICAgY29uc3QgYXBwTmFtZSA9IGZpbGVOYW1lcy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyAmJiBpdGVtLmVuZHNXaXRoKCcuYXBwJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWFwcE5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgYXBwIGluICR7bW91bnRQYXRofWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1vdW50ZWRQYXRoID0gcGF0aC5qb2luKG1vdW50UGF0aCwgYXBwTmFtZSk7XG4gICAgICAgIGF3YWl0IGV4ZWMoYGNwIC1SIFwiJHttb3VudGVkUGF0aH1cIiBcIiR7Zm9sZGVyUGF0aH1cImApO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgZXhlYyhgaGRpdXRpbCBkZXRhY2ggXCIke21vdW50UGF0aH1cIiAtcXVpZXRgKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maWxlVXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgY3JlYXRlV3JpdGVTdHJlYW0gfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IHsgVVJMLCB1cmxUb0h0dHBPcHRpb25zIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IFByb3h5QWdlbnQgfSBmcm9tICdwcm94eS1hZ2VudCc7XG5leHBvcnQgZnVuY3Rpb24gaGVhZEh0dHBSZXF1ZXN0KHVybCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGh0dHBSZXF1ZXN0KHVybCwgJ0hFQUQnLCByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAvLyBjb25zdW1lIHJlc3BvbnNlIGRhdGEgZnJlZSBub2RlIHByb2Nlc3NcbiAgICAgICAgICAgIHJlc3BvbnNlLnJlc3VtZSgpO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5zdGF0dXNDb2RlID09PSAyMDApO1xuICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgIHJlcXVlc3Qub24oJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgbWV0aG9kLCByZXNwb25zZSwga2VlcEFsaXZlID0gdHJ1ZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHByb3RvY29sOiB1cmwucHJvdG9jb2wsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIHBvcnQ6IHVybC5wb3J0LFxuICAgICAgICBwYXRoOiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGtlZXBBbGl2ZSA/IHsgQ29ubmVjdGlvbjogJ2tlZXAtYWxpdmUnIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIGF1dGg6IHVybFRvSHR0cE9wdGlvbnModXJsKS5hdXRoLFxuICAgICAgICBhZ2VudDogbmV3IFByb3h5QWdlbnQoKSxcbiAgICB9O1xuICAgIGNvbnN0IHJlcXVlc3RDYWxsYmFjayA9IChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlICYmXG4gICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA+PSAzMDAgJiZcbiAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlIDwgNDAwICYmXG4gICAgICAgICAgICByZXMuaGVhZGVycy5sb2NhdGlvbikge1xuICAgICAgICAgICAgaHR0cFJlcXVlc3QobmV3IFVSTChyZXMuaGVhZGVycy5sb2NhdGlvbiksIG1ldGhvZCwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgLy8gY29uc3VtZSByZXNwb25zZSBkYXRhIHRvIGZyZWUgdXAgbWVtb3J5XG4gICAgICAgICAgICAvLyBBbmQgcHJldmVudHMgdGhlIGNvbm5lY3Rpb24gZnJvbSBiZWluZyBrZXB0IGFsaXZlXG4gICAgICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZShyZXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCByZXF1ZXN0ID0gb3B0aW9ucy5wcm90b2NvbCA9PT0gJ2h0dHBzOidcbiAgICAgICAgPyBodHRwcy5yZXF1ZXN0KG9wdGlvbnMsIHJlcXVlc3RDYWxsYmFjaylcbiAgICAgICAgOiBodHRwLnJlcXVlc3Qob3B0aW9ucywgcmVxdWVzdENhbGxiYWNrKTtcbiAgICByZXF1ZXN0LmVuZCgpO1xuICAgIHJldHVybiByZXF1ZXN0O1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkRmlsZSh1cmwsIGRlc3RpbmF0aW9uUGF0aCwgcHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBkb3dubG9hZGVkQnl0ZXMgPSAwO1xuICAgICAgICBsZXQgdG90YWxCeXRlcyA9IDA7XG4gICAgICAgIGZ1bmN0aW9uIG9uRGF0YShjaHVuaykge1xuICAgICAgICAgICAgZG93bmxvYWRlZEJ5dGVzICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIHByb2dyZXNzQ2FsbGJhY2soZG93bmxvYWRlZEJ5dGVzLCB0b3RhbEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gaHR0cFJlcXVlc3QodXJsLCAnR0VUJywgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBEb3dubG9hZCBmYWlsZWQ6IHNlcnZlciByZXR1cm5lZCBjb2RlICR7cmVzcG9uc2Uuc3RhdHVzQ29kZX0uIFVSTDogJHt1cmx9YCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3VtZSByZXNwb25zZSBkYXRhIHRvIGZyZWUgdXAgbWVtb3J5XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gY3JlYXRlV3JpdGVTdHJlYW0oZGVzdGluYXRpb25QYXRoKTtcbiAgICAgICAgICAgIGZpbGUub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaWxlLm9uKCdlcnJvcicsIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzcG9uc2UucGlwZShmaWxlKTtcbiAgICAgICAgICAgIHRvdGFsQnl0ZXMgPSBwYXJzZUludChyZXNwb25zZS5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddLCAxMCk7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgb25EYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlcXVlc3Qub24oJ2Vycm9yJywgZXJyb3IgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IGdldFRleHQodXJsKTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBwYXJzZSBKU09OIGZyb20gJyArIHVybC50b1N0cmluZygpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGV4dCh1cmwpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gaHR0cFJlcXVlc3QodXJsLCAnR0VUJywgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSAnJztcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYEdvdCBzdGF0dXMgY29kZSAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgICAgICAgICAgICAgZGF0YSArPSBjaHVuaztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzcG9uc2Uub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShTdHJpbmcoZGF0YSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdDaHJvbWUgdmVyc2lvbiBub3QgZm91bmQnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgcmVxdWVzdC5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cFV0aWwuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBta2RpciwgdW5saW5rIH0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQnJvd3NlciwgQnJvd3NlclBsYXRmb3JtLCBkb3dubG9hZFVybHMsIH0gZnJvbSAnLi9icm93c2VyLWRhdGEvYnJvd3Nlci1kYXRhLmpzJztcbmltcG9ydCB7IENhY2hlLCBJbnN0YWxsZWRCcm93c2VyIH0gZnJvbSAnLi9DYWNoZS5qcyc7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4vZGVidWcuanMnO1xuaW1wb3J0IHsgZGV0ZWN0QnJvd3NlclBsYXRmb3JtIH0gZnJvbSAnLi9kZXRlY3RQbGF0Zm9ybS5qcyc7XG5pbXBvcnQgeyB1bnBhY2tBcmNoaXZlIH0gZnJvbSAnLi9maWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb3dubG9hZEZpbGUsIGdldEpTT04sIGhlYWRIdHRwUmVxdWVzdCB9IGZyb20gJy4vaHR0cFV0aWwuanMnO1xuY29uc3QgZGVidWdJbnN0YWxsID0gZGVidWcoJ3B1cHBldGVlcjpicm93c2VyczppbnN0YWxsJyk7XG5jb25zdCB0aW1lcyA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIGRlYnVnVGltZShsYWJlbCkge1xuICAgIHRpbWVzLnNldChsYWJlbCwgcHJvY2Vzcy5ocnRpbWUoKSk7XG59XG5mdW5jdGlvbiBkZWJ1Z1RpbWVFbmQobGFiZWwpIHtcbiAgICBjb25zdCBlbmQgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGltZXMuZ2V0KGxhYmVsKTtcbiAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb24gPSBlbmRbMF0gKiAxMDAwICsgZW5kWzFdIC8gMWU2IC0gKHN0YXJ0WzBdICogMTAwMCArIHN0YXJ0WzFdIC8gMWU2KTsgLy8gY2FsY3VsYXRlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICAgIGRlYnVnSW5zdGFsbChgRHVyYXRpb24gZm9yICR7bGFiZWx9OiAke2R1cmF0aW9ufW1zYCk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbChvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgb3B0aW9ucy51bnBhY2sgPz89IHRydWU7XG4gICAgaWYgKCFvcHRpb25zLnBsYXRmb3JtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRvd25sb2FkIGEgYmluYXJ5IGZvciB0aGUgcHJvdmlkZWQgcGxhdGZvcm06ICR7b3MucGxhdGZvcm0oKX0gKCR7b3MuYXJjaCgpfSlgKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gZ2V0RG93bmxvYWRVcmwob3B0aW9ucy5icm93c2VyLCBvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQsIG9wdGlvbnMuYmFzZVVybCk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGluc3RhbGxVcmwodXJsLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBJZiBjdXN0b20gYmFzZVVybCBpcyBwcm92aWRlZCwgZG8gbm90IGZhbGwgYmFjayB0byBDZlQgZGFzaGJvYXJkLlxuICAgICAgICBpZiAob3B0aW9ucy5iYXNlVXJsICYmICFvcHRpb25zLmZvcmNlRmFsbGJhY2tGb3JUZXN0aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbnN0YWxsKGBFcnJvciBkb3dubG9hZGluZyBmcm9tICR7dXJsfS5gKTtcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLmJyb3dzZXIpIHtcbiAgICAgICAgICAgIGNhc2UgQnJvd3Nlci5DSFJPTUU6XG4gICAgICAgICAgICBjYXNlIEJyb3dzZXIuQ0hST01FRFJJVkVSOlxuICAgICAgICAgICAgY2FzZSBCcm93c2VyLkNIUk9NRUhFQURMRVNTU0hFTEw6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0luc3RhbGwoYFRyeWluZyB0byBmaW5kIGRvd25sb2FkIFVSTCB2aWEgaHR0cHM6Ly9nb29nbGVjaHJvbWVsYWJzLmdpdGh1Yi5pby9jaHJvbWUtZm9yLXRlc3RpbmcuYCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IChhd2FpdCBnZXRKU09OKG5ldyBVUkwoYGh0dHBzOi8vZ29vZ2xlY2hyb21lbGFicy5naXRodWIuaW8vY2hyb21lLWZvci10ZXN0aW5nLyR7b3B0aW9ucy5idWlsZElkfS5qc29uYCkpKTtcbiAgICAgICAgICAgICAgICBsZXQgcGxhdGZvcm0gPSAnJztcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMucGxhdGZvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBCcm93c2VyUGxhdGZvcm0uTElOVVg6XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSA9ICdsaW51eDY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUNfQVJNOlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0gPSAnbWFjLWFybTY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5NQUM6XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSA9ICdtYWMteDY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU4zMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3dpbjMyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEJyb3dzZXJQbGF0Zm9ybS5XSU42NDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtID0gJ3dpbjY0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB2ZXJzaW9uLmRvd25sb2Fkc1tvcHRpb25zLmJyb3dzZXJdPy5maW5kKGxpbmsgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGlua1sncGxhdGZvcm0nXSA9PT0gcGxhdGZvcm07XG4gICAgICAgICAgICAgICAgfSk/LnVybDtcbiAgICAgICAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnSW5zdGFsbChgRmFsbGluZyBiYWNrIHRvIGRvd25sb2FkaW5nIGZyb20gJHt1cmx9LmApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgaW5zdGFsbFVybChuZXcgVVJMKHVybCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbGxVcmwodXJsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgaWYgKCFvcHRpb25zLnBsYXRmb3JtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRvd25sb2FkIGEgYmluYXJ5IGZvciB0aGUgcHJvdmlkZWQgcGxhdGZvcm06ICR7b3MucGxhdGZvcm0oKX0gKCR7b3MuYXJjaCgpfSlgKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWUgPSB1cmwudG9TdHJpbmcoKS5zcGxpdCgnLycpLnBvcCgpO1xuICAgIGFzc2VydChmaWxlTmFtZSwgYEEgbWFsZm9ybWVkIGRvd25sb2FkIFVSTCB3YXMgZm91bmQ6ICR7dXJsfS5gKTtcbiAgICBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZShvcHRpb25zLmNhY2hlRGlyKTtcbiAgICBjb25zdCBicm93c2VyUm9vdCA9IGNhY2hlLmJyb3dzZXJSb290KG9wdGlvbnMuYnJvd3Nlcik7XG4gICAgY29uc3QgYXJjaGl2ZVBhdGggPSBwYXRoLmpvaW4oYnJvd3NlclJvb3QsIGAke29wdGlvbnMuYnVpbGRJZH0tJHtmaWxlTmFtZX1gKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoYnJvd3NlclJvb3QpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGJyb3dzZXJSb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLnVucGFjaykge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhhcmNoaXZlUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBhcmNoaXZlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1Z0luc3RhbGwoYERvd25sb2FkaW5nIGJpbmFyeSBmcm9tICR7dXJsfWApO1xuICAgICAgICBkZWJ1Z1RpbWUoJ2Rvd25sb2FkJyk7XG4gICAgICAgIGF3YWl0IGRvd25sb2FkRmlsZSh1cmwsIGFyY2hpdmVQYXRoLCBvcHRpb25zLmRvd25sb2FkUHJvZ3Jlc3NDYWxsYmFjayk7XG4gICAgICAgIGRlYnVnVGltZUVuZCgnZG93bmxvYWQnKTtcbiAgICAgICAgcmV0dXJuIGFyY2hpdmVQYXRoO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRQYXRoID0gY2FjaGUuaW5zdGFsbGF0aW9uRGlyKG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5wbGF0Zm9ybSwgb3B0aW9ucy5idWlsZElkKTtcbiAgICB0cnkge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhvdXRwdXRQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFsbGVkQnJvd3NlciA9IG5ldyBJbnN0YWxsZWRCcm93c2VyKGNhY2hlLCBvcHRpb25zLmJyb3dzZXIsIG9wdGlvbnMuYnVpbGRJZCwgb3B0aW9ucy5wbGF0Zm9ybSk7XG4gICAgICAgICAgICBpZiAoIWV4aXN0c1N5bmMoaW5zdGFsbGVkQnJvd3Nlci5leGVjdXRhYmxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBicm93c2VyIGZvbGRlciAoJHtvdXRwdXRQYXRofSkgZXhpc3RzIGJ1dCB0aGUgZXhlY3V0YWJsZSAoJHtpbnN0YWxsZWRCcm93c2VyLmV4ZWN1dGFibGVQYXRofSkgaXMgbWlzc2luZ2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxlZEJyb3dzZXI7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbnN0YWxsKGBEb3dubG9hZGluZyBiaW5hcnkgZnJvbSAke3VybH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlYnVnVGltZSgnZG93bmxvYWQnKTtcbiAgICAgICAgICAgIGF3YWl0IGRvd25sb2FkRmlsZSh1cmwsIGFyY2hpdmVQYXRoLCBvcHRpb25zLmRvd25sb2FkUHJvZ3Jlc3NDYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBkZWJ1Z1RpbWVFbmQoJ2Rvd25sb2FkJyk7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbnN0YWxsKGBJbnN0YWxsaW5nICR7YXJjaGl2ZVBhdGh9IHRvICR7b3V0cHV0UGF0aH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlYnVnVGltZSgnZXh0cmFjdCcpO1xuICAgICAgICAgICAgYXdhaXQgdW5wYWNrQXJjaGl2ZShhcmNoaXZlUGF0aCwgb3V0cHV0UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBkZWJ1Z1RpbWVFbmQoJ2V4dHJhY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnN0YWxsZWRCcm93c2VyID0gbmV3IEluc3RhbGxlZEJyb3dzZXIoY2FjaGUsIG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5idWlsZElkLCBvcHRpb25zLnBsYXRmb3JtKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYnVpbGRJZEFsaWFzKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGluc3RhbGxlZEJyb3dzZXIucmVhZE1ldGFkYXRhKCk7XG4gICAgICAgICAgICBtZXRhZGF0YS5hbGlhc2VzW29wdGlvbnMuYnVpbGRJZEFsaWFzXSA9IG9wdGlvbnMuYnVpbGRJZDtcbiAgICAgICAgICAgIGluc3RhbGxlZEJyb3dzZXIud3JpdGVNZXRhZGF0YShtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbGxlZEJyb3dzZXI7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhhcmNoaXZlUGF0aCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHVubGluayhhcmNoaXZlUGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bmluc3RhbGwob3B0aW9ucykge1xuICAgIG9wdGlvbnMucGxhdGZvcm0gPz89IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSgpO1xuICAgIGlmICghb3B0aW9ucy5wbGF0Zm9ybSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkZXRlY3QgdGhlIGJyb3dzZXIgcGxhdGZvcm0gZm9yOiAke29zLnBsYXRmb3JtKCl9ICgke29zLmFyY2goKX0pYCk7XG4gICAgfVxuICAgIG5ldyBDYWNoZShvcHRpb25zLmNhY2hlRGlyKS51bmluc3RhbGwob3B0aW9ucy5icm93c2VyLCBvcHRpb25zLnBsYXRmb3JtLCBvcHRpb25zLmJ1aWxkSWQpO1xufVxuLyoqXG4gKiBSZXR1cm5zIG1ldGFkYXRhIGFib3V0IGJyb3dzZXJzIGluc3RhbGxlZCBpbiB0aGUgY2FjaGUgZGlyZWN0b3J5LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEluc3RhbGxlZEJyb3dzZXJzKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IENhY2hlKG9wdGlvbnMuY2FjaGVEaXIpLmdldEluc3RhbGxlZEJyb3dzZXJzKCk7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhbkRvd25sb2FkKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zLnBsYXRmb3JtID8/PSBkZXRlY3RCcm93c2VyUGxhdGZvcm0oKTtcbiAgICBpZiAoIW9wdGlvbnMucGxhdGZvcm0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZG93bmxvYWQgYSBiaW5hcnkgZm9yIHRoZSBwcm92aWRlZCBwbGF0Zm9ybTogJHtvcy5wbGF0Zm9ybSgpfSAoJHtvcy5hcmNoKCl9KWApO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgaGVhZEh0dHBSZXF1ZXN0KGdldERvd25sb2FkVXJsKG9wdGlvbnMuYnJvd3Nlciwgb3B0aW9ucy5wbGF0Zm9ybSwgb3B0aW9ucy5idWlsZElkLCBvcHRpb25zLmJhc2VVcmwpKTtcbn1cbmZ1bmN0aW9uIGdldERvd25sb2FkVXJsKGJyb3dzZXIsIHBsYXRmb3JtLCBidWlsZElkLCBiYXNlVXJsKSB7XG4gICAgcmV0dXJuIG5ldyBVUkwoZG93bmxvYWRVcmxzW2Jyb3dzZXJdKHBsYXRmb3JtLCBidWlsZElkLCBiYXNlVXJsKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnN0YWxsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgYWNjZXNzU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcmVhZGxpbmUgZnJvbSAncmVhZGxpbmUnO1xuaW1wb3J0IHsgcmVzb2x2ZVN5c3RlbUV4ZWN1dGFibGVQYXRoLCB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG5pbXBvcnQgeyBDYWNoZSB9IGZyb20gJy4vQ2FjaGUuanMnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuL2RlYnVnLmpzJztcbmltcG9ydCB7IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vZGV0ZWN0UGxhdGZvcm0uanMnO1xuY29uc3QgZGVidWdMYXVuY2ggPSBkZWJ1ZygncHVwcGV0ZWVyOmJyb3dzZXJzOmxhdW5jaGVyJyk7XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVFeGVjdXRhYmxlUGF0aChvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBDYWNoZShvcHRpb25zLmNhY2hlRGlyKS5jb21wdXRlRXhlY3V0YWJsZVBhdGgob3B0aW9ucyk7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTeXN0ZW1FeGVjdXRhYmxlUGF0aChvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5wbGF0Zm9ybSA/Pz0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgaWYgKCFvcHRpb25zLnBsYXRmb3JtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRvd25sb2FkIGEgYmluYXJ5IGZvciB0aGUgcHJvdmlkZWQgcGxhdGZvcm06ICR7b3MucGxhdGZvcm0oKX0gKCR7b3MuYXJjaCgpfSlgKTtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9IHJlc29sdmVTeXN0ZW1FeGVjdXRhYmxlUGF0aChvcHRpb25zLmJyb3dzZXIsIG9wdGlvbnMucGxhdGZvcm0sIG9wdGlvbnMuY2hhbm5lbCk7XG4gICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzU3luYyhwYXRoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgR29vZ2xlIENocm9tZSBleGVjdXRhYmxlIGZvciBjaGFubmVsICcke29wdGlvbnMuY2hhbm5lbH0nIGF0ICcke3BhdGh9Jy5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhdW5jaChvcHRzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9jZXNzKG9wdHMpO1xufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYID0gL15EZXZUb29scyBsaXN0ZW5pbmcgb24gKHdzOlxcL1xcLy4qKSQvO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBXRUJEUklWRVJfQklESV9XRUJTT0NLRVRfRU5EUE9JTlRfUkVHRVggPSAvXldlYkRyaXZlciBCaURpIGxpc3RlbmluZyBvbiAod3M6XFwvXFwvLiopJC87XG5jb25zdCBwcm9jZXNzTGlzdGVuZXJzID0gbmV3IE1hcCgpO1xuY29uc3QgZGlzcGF0Y2hlcnMgPSB7XG4gICAgZXhpdDogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgcHJvY2Vzc0xpc3RlbmVycy5nZXQoJ2V4aXQnKT8uZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKC4uLmFyZ3MpO1xuICAgICAgICB9KTtcbiAgICB9LFxuICAgIFNJR0lOVDogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgcHJvY2Vzc0xpc3RlbmVycy5nZXQoJ1NJR0lOVCcpPy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIoLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgU0lHSFVQOiAoLi4uYXJncykgPT4ge1xuICAgICAgICBwcm9jZXNzTGlzdGVuZXJzLmdldCgnU0lHSFVQJyk/LmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlciguLi5hcmdzKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBTSUdURVJNOiAoLi4uYXJncykgPT4ge1xuICAgICAgICBwcm9jZXNzTGlzdGVuZXJzLmdldCgnU0lHVEVSTScpPy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIoLi4uYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH0sXG59O1xuZnVuY3Rpb24gc3Vic2NyaWJlVG9Qcm9jZXNzRXZlbnQoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBwcm9jZXNzTGlzdGVuZXJzLmdldChldmVudCkgfHwgW107XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHJvY2Vzcy5vbihldmVudCwgZGlzcGF0Y2hlcnNbZXZlbnRdKTtcbiAgICB9XG4gICAgbGlzdGVuZXJzLnB1c2goaGFuZGxlcik7XG4gICAgcHJvY2Vzc0xpc3RlbmVycy5zZXQoZXZlbnQsIGxpc3RlbmVycyk7XG59XG5mdW5jdGlvbiB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBwcm9jZXNzTGlzdGVuZXJzLmdldChldmVudCkgfHwgW107XG4gICAgY29uc3QgZXhpc3RpbmdMaXN0ZW5lcklkeCA9IGxpc3RlbmVycy5pbmRleE9mKGhhbmRsZXIpO1xuICAgIGlmIChleGlzdGluZ0xpc3RlbmVySWR4ID09PSAtMSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxpc3RlbmVycy5zcGxpY2UoZXhpc3RpbmdMaXN0ZW5lcklkeCwgMSk7XG4gICAgcHJvY2Vzc0xpc3RlbmVycy5zZXQoZXZlbnQsIGxpc3RlbmVycyk7XG4gICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHJvY2Vzcy5vZmYoZXZlbnQsIGRpc3BhdGNoZXJzW2V2ZW50XSk7XG4gICAgfVxufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9jZXNzIHtcbiAgICAjZXhlY3V0YWJsZVBhdGg7XG4gICAgI2FyZ3M7XG4gICAgI2Jyb3dzZXJQcm9jZXNzO1xuICAgICNleGl0ZWQgPSBmYWxzZTtcbiAgICAvLyBUaGUgYnJvd3NlciBwcm9jZXNzIGNhbiBiZSBjbG9zZWQgZXh0ZXJuYWxseSBvciBmcm9tIHRoZSBkcml2ZXIgcHJvY2Vzcy4gV2VcbiAgICAvLyBuZWVkIHRvIGludm9rZSB0aGUgaG9va3Mgb25seSBvbmNlIHRob3VnaCBidXQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSB0aW1lc1xuICAgIC8vIHdlIHdpbGwgYmUgaW52b2tlZC5cbiAgICAjaG9va3NSYW4gPSBmYWxzZTtcbiAgICAjb25FeGl0SG9vayA9IGFzeW5jICgpID0+IHsgfTtcbiAgICAjYnJvd3NlclByb2Nlc3NFeGl0aW5nO1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgdGhpcy4jZXhlY3V0YWJsZVBhdGggPSBvcHRzLmV4ZWN1dGFibGVQYXRoO1xuICAgICAgICB0aGlzLiNhcmdzID0gb3B0cy5hcmdzID8/IFtdO1xuICAgICAgICBvcHRzLnBpcGUgPz89IGZhbHNlO1xuICAgICAgICBvcHRzLmR1bXBpbyA/Pz0gZmFsc2U7XG4gICAgICAgIG9wdHMuaGFuZGxlU0lHSU5UID8/PSB0cnVlO1xuICAgICAgICBvcHRzLmhhbmRsZVNJR1RFUk0gPz89IHRydWU7XG4gICAgICAgIG9wdHMuaGFuZGxlU0lHSFVQID8/PSB0cnVlO1xuICAgICAgICAvLyBPbiBub24td2luZG93cyBwbGF0Zm9ybXMsIGBkZXRhY2hlZDogdHJ1ZWAgbWFrZXMgY2hpbGQgcHJvY2VzcyBhXG4gICAgICAgIC8vIGxlYWRlciBvZiBhIG5ldyBwcm9jZXNzIGdyb3VwLCBtYWtpbmcgaXQgcG9zc2libGUgdG8ga2lsbCBjaGlsZFxuICAgICAgICAvLyBwcm9jZXNzIHRyZWUgd2l0aCBgLmtpbGwoLXBpZClgIGNvbW1hbmQuIEBzZWVcbiAgICAgICAgLy8gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9jaGlsZF9wcm9jZXNzLmh0bWwjY2hpbGRfcHJvY2Vzc19vcHRpb25zX2RldGFjaGVkXG4gICAgICAgIG9wdHMuZGV0YWNoZWQgPz89IHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMic7XG4gICAgICAgIGNvbnN0IHN0ZGlvID0gdGhpcy4jY29uZmlndXJlU3RkaW8oe1xuICAgICAgICAgICAgcGlwZTogb3B0cy5waXBlLFxuICAgICAgICAgICAgZHVtcGlvOiBvcHRzLmR1bXBpbyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVudiA9IG9wdHMuZW52IHx8IHt9O1xuICAgICAgICBkZWJ1Z0xhdW5jaChgTGF1bmNoaW5nICR7dGhpcy4jZXhlY3V0YWJsZVBhdGh9ICR7dGhpcy4jYXJncy5qb2luKCcgJyl9YCwge1xuICAgICAgICAgICAgZGV0YWNoZWQ6IG9wdHMuZGV0YWNoZWQsXG4gICAgICAgICAgICBlbnY6IE9iamVjdC5rZXlzKGVudikucmVkdWNlKChyZXMsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdwdXBwZXRlZXJfJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzW2tleV0gPSBlbnZba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH0sIHt9KSxcbiAgICAgICAgICAgIHN0ZGlvLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3MgPSBjaGlsZFByb2Nlc3Muc3Bhd24odGhpcy4jZXhlY3V0YWJsZVBhdGgsIHRoaXMuI2FyZ3MsIHtcbiAgICAgICAgICAgIGRldGFjaGVkOiBvcHRzLmRldGFjaGVkLFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgc3RkaW8sXG4gICAgICAgIH0pO1xuICAgICAgICBkZWJ1Z0xhdW5jaChgTGF1bmNoZWQgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9YCk7XG4gICAgICAgIGlmIChvcHRzLmR1bXBpbykge1xuICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Muc3RkZXJyPy5waXBlKHByb2Nlc3Muc3RkZXJyKTtcbiAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLnN0ZG91dD8ucGlwZShwcm9jZXNzLnN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICAgc3Vic2NyaWJlVG9Qcm9jZXNzRXZlbnQoJ2V4aXQnLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NFeGl0KTtcbiAgICAgICAgaWYgKG9wdHMuaGFuZGxlU0lHSU5UKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVUb1Byb2Nlc3NFdmVudCgnU0lHSU5UJywgdGhpcy4jb25Ecml2ZXJQcm9jZXNzU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5oYW5kbGVTSUdURVJNKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVUb1Byb2Nlc3NFdmVudCgnU0lHVEVSTScsIHRoaXMuI29uRHJpdmVyUHJvY2Vzc1NpZ25hbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdHMuaGFuZGxlU0lHSFVQKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVUb1Byb2Nlc3NFdmVudCgnU0lHSFVQJywgdGhpcy4jb25Ecml2ZXJQcm9jZXNzU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0cy5vbkV4aXQpIHtcbiAgICAgICAgICAgIHRoaXMuI29uRXhpdEhvb2sgPSBvcHRzLm9uRXhpdDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNicm93c2VyUHJvY2Vzc0V4aXRpbmcgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNicm93c2VyUHJvY2Vzcy5vbmNlKCdleGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnTGF1bmNoKGBCcm93c2VyIHByb2Nlc3MgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9IG9uRXhpdGApO1xuICAgICAgICAgICAgICAgIHRoaXMuI2NsZWFyTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNydW5Ib29rcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgI3J1bkhvb2tzKCkge1xuICAgICAgICBpZiAodGhpcy4jaG9va3NSYW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNob29rc1JhbiA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuI29uRXhpdEhvb2soKTtcbiAgICB9XG4gICAgZ2V0IG5vZGVQcm9jZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlclByb2Nlc3M7XG4gICAgfVxuICAgICNjb25maWd1cmVTdGRpbyhvcHRzKSB7XG4gICAgICAgIGlmIChvcHRzLnBpcGUpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLmR1bXBpbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnLCAncGlwZScsICdwaXBlJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChvcHRzLmR1bXBpbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbJ3BpcGUnLCAncGlwZScsICdwaXBlJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWydwaXBlJywgJ2lnbm9yZScsICdwaXBlJ107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2NsZWFyTGlzdGVuZXJzKCkge1xuICAgICAgICB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoJ2V4aXQnLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NFeGl0KTtcbiAgICAgICAgdW5zdWJzY3JpYmVGcm9tUHJvY2Vzc0V2ZW50KCdTSUdJTlQnLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NTaWduYWwpO1xuICAgICAgICB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoJ1NJR1RFUk0nLCB0aGlzLiNvbkRyaXZlclByb2Nlc3NTaWduYWwpO1xuICAgICAgICB1bnN1YnNjcmliZUZyb21Qcm9jZXNzRXZlbnQoJ1NJR0hVUCcsIHRoaXMuI29uRHJpdmVyUHJvY2Vzc1NpZ25hbCk7XG4gICAgfVxuICAgICNvbkRyaXZlclByb2Nlc3NFeGl0ID0gKF9jb2RlKSA9PiB7XG4gICAgICAgIHRoaXMua2lsbCgpO1xuICAgIH07XG4gICAgI29uRHJpdmVyUHJvY2Vzc1NpZ25hbCA9IChzaWduYWwpID0+IHtcbiAgICAgICAgc3dpdGNoIChzaWduYWwpIHtcbiAgICAgICAgICAgIGNhc2UgJ1NJR0lOVCc6XG4gICAgICAgICAgICAgICAgdGhpcy5raWxsKCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEzMCk7XG4gICAgICAgICAgICBjYXNlICdTSUdURVJNJzpcbiAgICAgICAgICAgIGNhc2UgJ1NJR0hVUCc6XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNydW5Ib29rcygpO1xuICAgICAgICBpZiAoIXRoaXMuI2V4aXRlZCkge1xuICAgICAgICAgICAgdGhpcy5raWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2Jyb3dzZXJQcm9jZXNzRXhpdGluZztcbiAgICB9XG4gICAgaGFzQ2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlclByb2Nlc3NFeGl0aW5nO1xuICAgIH1cbiAgICBraWxsKCkge1xuICAgICAgICBkZWJ1Z0xhdW5jaChgVHJ5aW5nIHRvIGtpbGwgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9YCk7XG4gICAgICAgIC8vIElmIHRoZSBwcm9jZXNzIGZhaWxlZCB0byBsYXVuY2ggKGZvciBleGFtcGxlIGlmIHRoZSBicm93c2VyIGV4ZWN1dGFibGUgcGF0aFxuICAgICAgICAvLyBpcyBpbnZhbGlkKSwgdGhlbiB0aGUgcHJvY2VzcyBkb2VzIG5vdCBnZXQgYSBwaWQgYXNzaWduZWQuIEEgY2FsbCB0b1xuICAgICAgICAvLyBgcHJvYy5raWxsYCB3b3VsZCBlcnJvciwgYXMgdGhlIGBwaWRgIHRvLWJlLWtpbGxlZCBjYW4gbm90IGJlIGZvdW5kLlxuICAgICAgICBpZiAodGhpcy4jYnJvd3NlclByb2Nlc3MgJiZcbiAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZCAmJlxuICAgICAgICAgICAgcGlkRXhpc3RzKHRoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGVidWdMYXVuY2goYEJyb3dzZXIgcHJvY2VzcyAke3RoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZH0gZXhpc3RzYCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkUHJvY2Vzcy5leGVjU3luYyhgdGFza2tpbGwgL3BpZCAke3RoaXMuI2Jyb3dzZXJQcm9jZXNzLnBpZH0gL1QgL0ZgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnTGF1bmNoKGBLaWxsaW5nICR7dGhpcy4jYnJvd3NlclByb2Nlc3MucGlkfSB1c2luZyB0YXNra2lsbCBmYWlsZWRgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXNra2lsbCBjYW4gZmFpbCB0byBraWxsIHRoZSBwcm9jZXNzIGUuZy4gZHVlIHRvIG1pc3NpbmcgcGVybWlzc2lvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyBraWxsIHRoZSBwcm9jZXNzIHZpYSBOb2RlIEFQSS4gVGhpcyBkZWxheXMga2lsbGluZyBvZiBhbGwgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlcyBvZiBgdGhpcy5wcm9jYCB1bnRpbCB0aGUgbWFpbiBOb2RlLmpzIHByb2Nlc3MgZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLmtpbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb24gbGludXggdGhlIHByb2Nlc3MgZ3JvdXAgY2FuIGJlIGtpbGxlZCB3aXRoIHRoZSBncm91cCBpZCBwcmVmaXhlZCB3aXRoXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgbWludXMgc2lnbi4gVGhlIHByb2Nlc3MgZ3JvdXAgaWQgaXMgdGhlIGdyb3VwIGxlYWRlcidzIHBpZC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0dyb3VwSWQgPSAtdGhpcy4jYnJvd3NlclByb2Nlc3MucGlkO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3NHcm91cElkLCAnU0lHS0lMTCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdMYXVuY2goYEtpbGxpbmcgJHt0aGlzLiNicm93c2VyUHJvY2Vzcy5waWR9IHVzaW5nIHByb2Nlc3Mua2lsbCBmYWlsZWRgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBLaWxsaW5nIHRoZSBwcm9jZXNzIGdyb3VwIGNhbiBmYWlsIGR1ZSBlLmcuIHRvIG1pc3NpbmcgcGVybWlzc2lvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyBraWxsIHRoZSBwcm9jZXNzIHZpYSBOb2RlIEFQSS4gVGhpcyBkZWxheXMga2lsbGluZyBvZiBhbGwgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlcyBvZiBgdGhpcy5wcm9jYCB1bnRpbCB0aGUgbWFpbiBOb2RlLmpzIHByb2Nlc3MgZGllcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Jyb3dzZXJQcm9jZXNzLmtpbGwoJ1NJR0tJTEwnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtQUk9DRVNTX0VSUk9SX0VYUExBTkFUSU9OfVxcbkVycm9yIGNhdXNlOiAke2lzRXJyb3JMaWtlKGVycm9yKSA/IGVycm9yLnN0YWNrIDogZXJyb3J9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2xlYXJMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgd2FpdEZvckxpbmVPdXRwdXQocmVnZXgsIHRpbWVvdXQgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy4jYnJvd3NlclByb2Nlc3Muc3RkZXJyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bicm93c2VyUHJvY2Vzc2AgZG9lcyBub3QgaGF2ZSBzdGRlcnIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UodGhpcy4jYnJvd3NlclByb2Nlc3Muc3RkZXJyKTtcbiAgICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmwub24oJ2xpbmUnLCBvbkxpbmUpO1xuICAgICAgICAgICAgcmwub24oJ2Nsb3NlJywgb25DbG9zZSk7XG4gICAgICAgICAgICB0aGlzLiNicm93c2VyUHJvY2Vzcy5vbignZXhpdCcsIG9uQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Mub24oJ2Vycm9yJywgb25DbG9zZSk7XG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0SWQgPSB0aW1lb3V0ID4gMCA/IHNldFRpbWVvdXQob25UaW1lb3V0LCB0aW1lb3V0KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmwub2ZmKCdsaW5lJywgb25MaW5lKTtcbiAgICAgICAgICAgICAgICBybC5vZmYoJ2Nsb3NlJywgb25DbG9zZSk7XG4gICAgICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Mub2ZmKCdleGl0Jywgb25DbG9zZSk7XG4gICAgICAgICAgICAgICAgdGhpcy4jYnJvd3NlclByb2Nlc3Mub2ZmKCdlcnJvcicsIG9uQ2xvc2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG9uQ2xvc2UoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihbXG4gICAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gbGF1bmNoIHRoZSBicm93c2VyIHByb2Nlc3MhJHtlcnJvciA/ICcgJyArIGVycm9yLm1lc3NhZ2UgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICBzdGRlcnIsXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAnVFJPVUJMRVNIT09USU5HOiBodHRwczovL3BwdHIuZGV2L3Ryb3VibGVzaG9vdGluZycsXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgIF0uam9pbignXFxuJykpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUaW1lb3V0RXJyb3IoYFRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9IG1zIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBXUyBlbmRwb2ludCBVUkwgdG8gYXBwZWFyIGluIHN0ZG91dCFgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBvbkxpbmUobGluZSkge1xuICAgICAgICAgICAgICAgIHN0ZGVyciArPSBsaW5lICsgJ1xcbic7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSBSZWdFeHAgbWF0Y2hlcywgc28gdGhpcyB3aWxsIG9idmlvdXNseSBleGlzdC5cbiAgICAgICAgICAgICAgICByZXNvbHZlKG1hdGNoWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuY29uc3QgUFJPQ0VTU19FUlJPUl9FWFBMQU5BVElPTiA9IGBQdXBwZXRlZXIgd2FzIHVuYWJsZSB0byBraWxsIHRoZSBwcm9jZXNzIHdoaWNoIHJhbiB0aGUgYnJvd3NlciBiaW5hcnkuXG5UaGlzIG1lYW5zIHRoYXQsIG9uIGZ1dHVyZSBQdXBwZXRlZXIgbGF1bmNoZXMsIFB1cHBldGVlciBtaWdodCBub3QgYmUgYWJsZSB0byBsYXVuY2ggdGhlIGJyb3dzZXIuXG5QbGVhc2UgY2hlY2sgeW91ciBvcGVuIHByb2Nlc3NlcyBhbmQgZW5zdXJlIHRoYXQgdGhlIGJyb3dzZXIgcHJvY2Vzc2VzIHRoYXQgUHVwcGV0ZWVyIGxhdW5jaGVkIGhhdmUgYmVlbiBraWxsZWQuXG5JZiB5b3UgdGhpbmsgdGhpcyBpcyBhIGJ1ZywgcGxlYXNlIHJlcG9ydCBpdCBvbiB0aGUgUHVwcGV0ZWVyIGlzc3VlIHRyYWNrZXIuYDtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHBpZEV4aXN0cyhwaWQpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5raWxsKHBpZCwgMCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5jb2RlICYmIGVycm9yLmNvZGUgPT09ICdFU1JDSCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3JMaWtlKG9iaikge1xuICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsICYmICduYW1lJyBpbiBvYmogJiYgJ21lc3NhZ2UnIGluIG9iaik7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihvYmopIHtcbiAgICByZXR1cm4gKGlzRXJyb3JMaWtlKG9iaikgJiZcbiAgICAgICAgKCdlcnJubycgaW4gb2JqIHx8ICdjb2RlJyBpbiBvYmogfHwgJ3BhdGgnIGluIG9iaiB8fCAnc3lzY2FsbCcgaW4gb2JqKSk7XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhdW5jaC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHsgbGF1bmNoLCBjb21wdXRlRXhlY3V0YWJsZVBhdGgsIGNvbXB1dGVTeXN0ZW1FeGVjdXRhYmxlUGF0aCwgVGltZW91dEVycm9yLCBDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBXRUJEUklWRVJfQklESV9XRUJTT0NLRVRfRU5EUE9JTlRfUkVHRVgsIFByb2Nlc3MsIH0gZnJvbSAnLi9sYXVuY2guanMnO1xuZXhwb3J0IHsgaW5zdGFsbCwgZ2V0SW5zdGFsbGVkQnJvd3NlcnMsIGNhbkRvd25sb2FkLCB1bmluc3RhbGwsIH0gZnJvbSAnLi9pbnN0YWxsLmpzJztcbmV4cG9ydCB7IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSB9IGZyb20gJy4vZGV0ZWN0UGxhdGZvcm0uanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUJ1aWxkSWQsIEJyb3dzZXIsIEJyb3dzZXJQbGF0Zm9ybSwgQ2hyb21lUmVsZWFzZUNoYW5uZWwsIGNyZWF0ZVByb2ZpbGUsIGdldFZlcnNpb25Db21wYXJhdG9yLCB9IGZyb20gJy4vYnJvd3Nlci1kYXRhL2Jyb3dzZXItZGF0YS5qcyc7XG5leHBvcnQgeyBDTEksIG1ha2VQcm9ncmVzc0NhbGxiYWNrIH0gZnJvbSAnLi9DTEkuanMnO1xuZXhwb3J0IHsgQ2FjaGUsIEluc3RhbGxlZEJyb3dzZXIgfSBmcm9tICcuL0NhY2hlLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1haW4uanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgYWxpZ24gPSB7XG4gICAgcmlnaHQ6IGFsaWduUmlnaHQsXG4gICAgY2VudGVyOiBhbGlnbkNlbnRlclxufTtcbmNvbnN0IHRvcCA9IDA7XG5jb25zdCByaWdodCA9IDE7XG5jb25zdCBib3R0b20gPSAyO1xuY29uc3QgbGVmdCA9IDM7XG5leHBvcnQgY2xhc3MgVUkge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLndpZHRoID0gb3B0cy53aWR0aDtcbiAgICAgICAgdGhpcy53cmFwID0gKF9hID0gb3B0cy53cmFwKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0cnVlO1xuICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICB9XG4gICAgc3BhbiguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLmRpdiguLi5hcmdzKTtcbiAgICAgICAgY29scy5zcGFuID0gdHJ1ZTtcbiAgICB9XG4gICAgcmVzZXRPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgIH1cbiAgICBkaXYoLi4uYXJncykge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGl2KCcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy53cmFwICYmIHRoaXMuc2hvdWxkQXBwbHlMYXlvdXREU0woLi4uYXJncykgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUxheW91dERTTChhcmdzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xzID0gYXJncy5tYXAoYXJnID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbEZyb21TdHJpbmcoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJvd3MucHVzaChjb2xzKTtcbiAgICAgICAgcmV0dXJuIGNvbHM7XG4gICAgfVxuICAgIHNob3VsZEFwcGx5TGF5b3V0RFNMKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgL1tcXHRcXG5dLy50ZXN0KGFyZ3NbMF0pO1xuICAgIH1cbiAgICBhcHBseUxheW91dERTTChzdHIpIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IHN0ci5zcGxpdCgnXFxuJykubWFwKHJvdyA9PiByb3cuc3BsaXQoJ1xcdCcpKTtcbiAgICAgICAgbGV0IGxlZnRDb2x1bW5XaWR0aCA9IDA7XG4gICAgICAgIC8vIHNpbXBsZSBoZXVyaXN0aWMgZm9yIGxheW91dCwgbWFrZSBzdXJlIHRoZVxuICAgICAgICAvLyBzZWNvbmQgY29sdW1uIGxpbmVzIHVwIGFsb25nIHRoZSBsZWZ0LWhhbmQuXG4gICAgICAgIC8vIGRvbid0IGFsbG93IHRoZSBmaXJzdCBjb2x1bW4gdG8gdGFrZSB1cCBtb3JlXG4gICAgICAgIC8vIHRoYW4gNTAlIG9mIHRoZSBzY3JlZW4uXG4gICAgICAgIHJvd3MuZm9yRWFjaChjb2x1bW5zID0+IHtcbiAgICAgICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA+IDEgJiYgbWl4aW4uc3RyaW5nV2lkdGgoY29sdW1uc1swXSkgPiBsZWZ0Q29sdW1uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBsZWZ0Q29sdW1uV2lkdGggPSBNYXRoLm1pbihNYXRoLmZsb29yKHRoaXMud2lkdGggKiAwLjUpLCBtaXhpbi5zdHJpbmdXaWR0aChjb2x1bW5zWzBdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZW5lcmF0ZSBhIHRhYmxlOlxuICAgICAgICAvLyAgcmVwbGFjaW5nICcgJyB3aXRoIHBhZGRpbmcgY2FsY3VsYXRpb25zLlxuICAgICAgICAvLyAgdXNpbmcgdGhlIGFsZ29yaXRobWljYWxseSBnZW5lcmF0ZWQgd2lkdGguXG4gICAgICAgIHJvd3MuZm9yRWFjaChjb2x1bW5zID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGl2KC4uLmNvbHVtbnMubWFwKChyLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogci50cmltKCksXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IHRoaXMubWVhc3VyZVBhZGRpbmcociksXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAoaSA9PT0gMCAmJiBjb2x1bW5zLmxlbmd0aCA+IDEpID8gbGVmdENvbHVtbldpZHRoIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd3NbdGhpcy5yb3dzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICBjb2xGcm9tU3RyaW5nKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICBwYWRkaW5nOiB0aGlzLm1lYXN1cmVQYWRkaW5nKHRleHQpXG4gICAgICAgIH07XG4gICAgfVxuICAgIG1lYXN1cmVQYWRkaW5nKHN0cikge1xuICAgICAgICAvLyBtZWFzdXJlIHBhZGRpbmcgd2l0aG91dCBhbnNpIGVzY2FwZSBjb2Rlc1xuICAgICAgICBjb25zdCBub0Fuc2kgPSBtaXhpbi5zdHJpcEFuc2koc3RyKTtcbiAgICAgICAgcmV0dXJuIFswLCBub0Fuc2kubWF0Y2goL1xccyokLylbMF0ubGVuZ3RoLCAwLCBub0Fuc2kubWF0Y2goL15cXHMqLylbMF0ubGVuZ3RoXTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgICAgIHRoaXMucm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvd1RvU3RyaW5nKHJvdywgbGluZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZG9uJ3QgZGlzcGxheSBhbnkgbGluZXMgd2l0aCB0aGVcbiAgICAgICAgLy8gaGlkZGVuIGZsYWcgc2V0LlxuICAgICAgICByZXR1cm4gbGluZXNcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiAhbGluZS5oaWRkZW4pXG4gICAgICAgICAgICAubWFwKGxpbmUgPT4gbGluZS50ZXh0KVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgICByb3dUb1N0cmluZyhyb3csIGxpbmVzKSB7XG4gICAgICAgIHRoaXMucmFzdGVyaXplKHJvdykuZm9yRWFjaCgocnJvdywgcikgPT4ge1xuICAgICAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICAgICAgcnJvdy5mb3JFYWNoKChjb2wsIGMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoIH0gPSByb3dbY107IC8vIHRoZSB3aWR0aCB3aXRoIHBhZGRpbmcuXG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcFdpZHRoID0gdGhpcy5uZWdhdGVQYWRkaW5nKHJvd1tjXSk7IC8vIHRoZSB3aWR0aCB3aXRob3V0IHBhZGRpbmcuXG4gICAgICAgICAgICAgICAgbGV0IHRzID0gY29sOyAvLyB0ZW1wb3Jhcnkgc3RyaW5nIHVzZWQgZHVyaW5nIGFsaWdubWVudC9wYWRkaW5nLlxuICAgICAgICAgICAgICAgIGlmICh3cmFwV2lkdGggPiBtaXhpbi5zdHJpbmdXaWR0aChjb2wpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRzICs9ICcgJy5yZXBlYXQod3JhcFdpZHRoIC0gbWl4aW4uc3RyaW5nV2lkdGgoY29sKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFsaWduIHRoZSBzdHJpbmcgd2l0aGluIGl0cyBjb2x1bW4uXG4gICAgICAgICAgICAgICAgaWYgKHJvd1tjXS5hbGlnbiAmJiByb3dbY10uYWxpZ24gIT09ICdsZWZ0JyAmJiB0aGlzLndyYXApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm4gPSBhbGlnbltyb3dbY10uYWxpZ25dO1xuICAgICAgICAgICAgICAgICAgICB0cyA9IGZuKHRzLCB3cmFwV2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWl4aW4uc3RyaW5nV2lkdGgodHMpIDwgd3JhcFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cyArPSAnICcucmVwZWF0KCh3aWR0aCB8fCAwKSAtIG1peGluLnN0cmluZ1dpZHRoKHRzKSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFwcGx5IGJvcmRlciBhbmQgcGFkZGluZyB0byBzdHJpbmcuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHJvd1tjXS5wYWRkaW5nIHx8IFswLCAwLCAwLCAwXTtcbiAgICAgICAgICAgICAgICBpZiAocGFkZGluZ1tsZWZ0XSkge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAnLnJlcGVhdChwYWRkaW5nW2xlZnRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyICs9IGFkZEJvcmRlcihyb3dbY10sIHRzLCAnfCAnKTtcbiAgICAgICAgICAgICAgICBzdHIgKz0gdHM7XG4gICAgICAgICAgICAgICAgc3RyICs9IGFkZEJvcmRlcihyb3dbY10sIHRzLCAnIHwnKTtcbiAgICAgICAgICAgICAgICBpZiAocGFkZGluZ1tyaWdodF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJy5yZXBlYXQocGFkZGluZ1tyaWdodF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiBwcmlvciByb3cgaXMgc3BhbiwgdHJ5IHRvIHJlbmRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHJvdyBvbiB0aGUgcHJpb3IgbGluZS5cbiAgICAgICAgICAgICAgICBpZiAociA9PT0gMCAmJiBsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMucmVuZGVySW5saW5lKHN0ciwgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UuXG4gICAgICAgICAgICBsaW5lcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBzdHIucmVwbGFjZSgvICskLywgJycpLFxuICAgICAgICAgICAgICAgIHNwYW46IHJvdy5zcGFuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBsaW5lcztcbiAgICB9XG4gICAgLy8gaWYgdGhlIGZ1bGwgJ3NvdXJjZScgY2FuIHJlbmRlciBpblxuICAgIC8vIHRoZSB0YXJnZXQgbGluZSwgZG8gc28uXG4gICAgcmVuZGVySW5saW5lKHNvdXJjZSwgcHJldmlvdXNMaW5lKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gc291cmNlLm1hdGNoKC9eICovKTtcbiAgICAgICAgY29uc3QgbGVhZGluZ1doaXRlc3BhY2UgPSBtYXRjaCA/IG1hdGNoWzBdLmxlbmd0aCA6IDA7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHByZXZpb3VzTGluZS50ZXh0O1xuICAgICAgICBjb25zdCB0YXJnZXRUZXh0V2lkdGggPSBtaXhpbi5zdHJpbmdXaWR0aCh0YXJnZXQudHJpbVJpZ2h0KCkpO1xuICAgICAgICBpZiAoIXByZXZpb3VzTGluZS5zcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHdlJ3JlIG5vdCBhcHBseWluZyB3cmFwcGluZyBsb2dpYyxcbiAgICAgICAgLy8ganVzdCBhbHdheXMgYXBwZW5kIHRvIHRoZSBzcGFuLlxuICAgICAgICBpZiAoIXRoaXMud3JhcCkge1xuICAgICAgICAgICAgcHJldmlvdXNMaW5lLmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICsgc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZWFkaW5nV2hpdGVzcGFjZSA8IHRhcmdldFRleHRXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2aW91c0xpbmUuaGlkZGVuID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRhcmdldC50cmltUmlnaHQoKSArICcgJy5yZXBlYXQobGVhZGluZ1doaXRlc3BhY2UgLSB0YXJnZXRUZXh0V2lkdGgpICsgc291cmNlLnRyaW1MZWZ0KCk7XG4gICAgfVxuICAgIHJhc3Rlcml6ZShyb3cpIHtcbiAgICAgICAgY29uc3QgcnJvd3MgPSBbXTtcbiAgICAgICAgY29uc3Qgd2lkdGhzID0gdGhpcy5jb2x1bW5XaWR0aHMocm93KTtcbiAgICAgICAgbGV0IHdyYXBwZWQ7XG4gICAgICAgIC8vIHdvcmQgd3JhcCBhbGwgY29sdW1ucywgYW5kIGNyZWF0ZVxuICAgICAgICAvLyBhIGRhdGEtc3RydWN0dXJlIHRoYXQgaXMgZWFzeSB0byByYXN0ZXJpemUuXG4gICAgICAgIHJvdy5mb3JFYWNoKChjb2wsIGMpID0+IHtcbiAgICAgICAgICAgIC8vIGxlYXZlIHJvb20gZm9yIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcuXG4gICAgICAgICAgICBjb2wud2lkdGggPSB3aWR0aHNbY107XG4gICAgICAgICAgICBpZiAodGhpcy53cmFwKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZCA9IG1peGluLndyYXAoY29sLnRleHQsIHRoaXMubmVnYXRlUGFkZGluZyhjb2wpLCB7IGhhcmQ6IHRydWUgfSkuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZCA9IGNvbC50ZXh0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2wuYm9yZGVyKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC51bnNoaWZ0KCcuJyArICctJy5yZXBlYXQodGhpcy5uZWdhdGVQYWRkaW5nKGNvbCkgKyAyKSArICcuJyk7XG4gICAgICAgICAgICAgICAgd3JhcHBlZC5wdXNoKFwiJ1wiICsgJy0nLnJlcGVhdCh0aGlzLm5lZ2F0ZVBhZGRpbmcoY29sKSArIDIpICsgXCInXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWRkIHRvcCBhbmQgYm90dG9tIHBhZGRpbmcuXG4gICAgICAgICAgICBpZiAoY29sLnBhZGRpbmcpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkLnVuc2hpZnQoLi4ubmV3IEFycmF5KGNvbC5wYWRkaW5nW3RvcF0gfHwgMCkuZmlsbCgnJykpO1xuICAgICAgICAgICAgICAgIHdyYXBwZWQucHVzaCguLi5uZXcgQXJyYXkoY29sLnBhZGRpbmdbYm90dG9tXSB8fCAwKS5maWxsKCcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cmFwcGVkLmZvckVhY2goKHN0ciwgcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcnJvd3Nbcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgcnJvd3MucHVzaChbXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJyb3cgPSBycm93c1tyXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnJvd1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBycm93LnB1c2goJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJyb3cucHVzaChzdHIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcnJvd3M7XG4gICAgfVxuICAgIG5lZ2F0ZVBhZGRpbmcoY29sKSB7XG4gICAgICAgIGxldCB3cmFwV2lkdGggPSBjb2wud2lkdGggfHwgMDtcbiAgICAgICAgaWYgKGNvbC5wYWRkaW5nKSB7XG4gICAgICAgICAgICB3cmFwV2lkdGggLT0gKGNvbC5wYWRkaW5nW2xlZnRdIHx8IDApICsgKGNvbC5wYWRkaW5nW3JpZ2h0XSB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICAgICAgd3JhcFdpZHRoIC09IDQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdyYXBXaWR0aDtcbiAgICB9XG4gICAgY29sdW1uV2lkdGhzKHJvdykge1xuICAgICAgICBpZiAoIXRoaXMud3JhcCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLndpZHRoIHx8IG1peGluLnN0cmluZ1dpZHRoKGNvbC50ZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCB1bnNldCA9IHJvdy5sZW5ndGg7XG4gICAgICAgIGxldCByZW1haW5pbmdXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIC8vIGNvbHVtbiB3aWR0aHMgY2FuIGJlIHNldCBpbiBjb25maWcuXG4gICAgICAgIGNvbnN0IHdpZHRocyA9IHJvdy5tYXAoY29sID0+IHtcbiAgICAgICAgICAgIGlmIChjb2wud2lkdGgpIHtcbiAgICAgICAgICAgICAgICB1bnNldC0tO1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZ1dpZHRoIC09IGNvbC53aWR0aDtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sLndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFueSB1bnNldCB3aWR0aHMgc2hvdWxkIGJlIGNhbGN1bGF0ZWQuXG4gICAgICAgIGNvbnN0IHVuc2V0V2lkdGggPSB1bnNldCA/IE1hdGguZmxvb3IocmVtYWluaW5nV2lkdGggLyB1bnNldCkgOiAwO1xuICAgICAgICByZXR1cm4gd2lkdGhzLm1hcCgodywgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh1bnNldFdpZHRoLCBfbWluV2lkdGgocm93W2ldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkQm9yZGVyKGNvbCwgdHMsIHN0eWxlKSB7XG4gICAgaWYgKGNvbC5ib3JkZXIpIHtcbiAgICAgICAgaWYgKC9bLiddLStbLiddLy50ZXN0KHRzKSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cy50cmltKCkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcgICc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cbi8vIGNhbGN1bGF0ZXMgdGhlIG1pbmltdW0gd2lkdGggb2Zcbi8vIGEgY29sdW1uLCBiYXNlZCBvbiBwYWRkaW5nIHByZWZlcmVuY2VzLlxuZnVuY3Rpb24gX21pbldpZHRoKGNvbCkge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBjb2wucGFkZGluZyB8fCBbXTtcbiAgICBjb25zdCBtaW5XaWR0aCA9IDEgKyAocGFkZGluZ1tsZWZ0XSB8fCAwKSArIChwYWRkaW5nW3JpZ2h0XSB8fCAwKTtcbiAgICBpZiAoY29sLmJvcmRlcikge1xuICAgICAgICByZXR1cm4gbWluV2lkdGggKyA0O1xuICAgIH1cbiAgICByZXR1cm4gbWluV2lkdGg7XG59XG5mdW5jdGlvbiBnZXRXaW5kb3dXaWR0aCgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZGVwZW5kcyBvbiB0ZXJtaW5hbCAqL1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzcy5zdGRvdXQgJiYgcHJvY2Vzcy5zdGRvdXQuY29sdW1ucykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRvdXQuY29sdW1ucztcbiAgICB9XG4gICAgcmV0dXJuIDgwO1xufVxuZnVuY3Rpb24gYWxpZ25SaWdodChzdHIsIHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBjb25zdCBzdHJXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHN0cik7XG4gICAgaWYgKHN0cldpZHRoIDwgd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuICcgJy5yZXBlYXQod2lkdGggLSBzdHJXaWR0aCkgKyBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBhbGlnbkNlbnRlcihzdHIsIHdpZHRoKSB7XG4gICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICBjb25zdCBzdHJXaWR0aCA9IG1peGluLnN0cmluZ1dpZHRoKHN0cik7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoc3RyV2lkdGggPj0gd2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuICcgJy5yZXBlYXQoKHdpZHRoIC0gc3RyV2lkdGgpID4+IDEpICsgc3RyO1xufVxubGV0IG1peGluO1xuZXhwb3J0IGZ1bmN0aW9uIGNsaXVpKG9wdHMsIF9taXhpbikge1xuICAgIG1peGluID0gX21peGluO1xuICAgIHJldHVybiBuZXcgVUkoe1xuICAgICAgICB3aWR0aDogKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy53aWR0aCkgfHwgZ2V0V2luZG93V2lkdGgoKSxcbiAgICAgICAgd3JhcDogb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLndyYXBcbiAgICB9KTtcbn1cbiIsIi8vIE1pbmltYWwgcmVwbGFjZW1lbnQgZm9yIGFuc2kgc3RyaW5nIGhlbHBlcnMgXCJ3cmFwLWFuc2lcIiBhbmQgXCJzdHJpcC1hbnNpXCIuXG4vLyB0byBmYWNpbGl0YXRlIEVTTSBhbmQgRGVubyBtb2R1bGVzLlxuLy8gVE9ETzogbG9vayBhdCBwb3J0aW5nIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3dyYXAtYW5zaSB0byBFU00uXG4vLyBUaGUgbnBtIGFwcGxpY2F0aW9uXG4vLyBDb3B5cmlnaHQgKGMpIG5wbSwgSW5jLiBhbmQgQ29udHJpYnV0b3JzXG4vLyBMaWNlbnNlZCBvbiB0aGUgdGVybXMgb2YgVGhlIEFydGlzdGljIExpY2Vuc2UgMi4wXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vY2xpL2Jsb2IvNGM2NWNkOTUyYmM4NjI3ODExNzM1YmVhNzZiOWIxMTBjYzRmYzgwZS9saWIvdXRpbHMvYW5zaS10cmltLmpzXG5jb25zdCBhbnNpID0gbmV3IFJlZ0V4cCgnXFx4MWIoPzpcXFxcWyg/OlxcXFxkK1tBQkNERUZHSktTVG1dfFxcXFxkKztcXFxcZCtbSGZtXXwnICtcbiAgICAnXFxcXGQrO1xcXFxkKztcXFxcZCttfDZufHN8dXxcXFxcPzI1W2xoXSl8XFxcXHcpJywgJ2cnKTtcbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEFuc2koc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKGFuc2ksICcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3cmFwKHN0ciwgd2lkdGgpIHtcbiAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSBzdHIubWF0Y2goYW5zaSkgfHwgWycnLCAnJ107XG4gICAgc3RyID0gc3RyaXBBbnNpKHN0cik7XG4gICAgbGV0IHdyYXBwZWQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSAhPT0gMCAmJiAoaSAlIHdpZHRoKSA9PT0gMCkge1xuICAgICAgICAgICAgd3JhcHBlZCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB3cmFwcGVkICs9IHN0ci5jaGFyQXQoaSk7XG4gICAgfVxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgICAgd3JhcHBlZCA9IGAke3N0YXJ0fSR7d3JhcHBlZH0ke2VuZH1gO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlZDtcbn1cbiIsIi8vIEJvb3RzdHJhcCBjbGl1aSB3aXRoIENvbW1vbkpTIGRlcGVuZGVuY2llczpcbmltcG9ydCB7IGNsaXVpIH0gZnJvbSAnLi9idWlsZC9saWIvaW5kZXguanMnXG5pbXBvcnQgeyB3cmFwLCBzdHJpcEFuc2kgfSBmcm9tICcuL2J1aWxkL2xpYi9zdHJpbmctdXRpbHMuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVpIChvcHRzKSB7XG4gIHJldHVybiBjbGl1aShvcHRzLCB7XG4gICAgc3RyaW5nV2lkdGg6IChzdHIpID0+IHtcbiAgICAgIHJldHVybiBbLi4uc3RyXS5sZW5ndGhcbiAgICB9LFxuICAgIHN0cmlwQW5zaSxcbiAgICB3cmFwXG4gIH0pXG59XG4iLCJpbXBvcnQgY29tbWFuZGVyIGZyb20gJy4vaW5kZXguanMnO1xuXG4vLyB3cmFwcGVyIHRvIHByb3ZpZGUgbmFtZWQgZXhwb3J0cyBmb3IgRVNNLlxuZXhwb3J0IGNvbnN0IHtcbiAgcHJvZ3JhbSxcbiAgY3JlYXRlQ29tbWFuZCxcbiAgY3JlYXRlQXJndW1lbnQsXG4gIGNyZWF0ZU9wdGlvbixcbiAgQ29tbWFuZGVyRXJyb3IsXG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkT3B0aW9uQXJndW1lbnRFcnJvciwgLy8gZGVwcmVjYXRlZCBvbGQgbmFtZVxuICBDb21tYW5kLFxuICBBcmd1bWVudCxcbiAgT3B0aW9uLFxuICBIZWxwLFxufSA9IGNvbW1hbmRlcjtcbiIsImltcG9ydCB7IGRpcm5hbWUsIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IHJlYWRkaXJTeW5jLCBzdGF0U3luYyB9IGZyb20gJ2ZzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHN0YXJ0LCBjYWxsYmFjaykge1xuXHRsZXQgZGlyID0gcmVzb2x2ZSgnLicsIHN0YXJ0KTtcblx0bGV0IHRtcCwgc3RhdHMgPSBzdGF0U3luYyhkaXIpO1xuXG5cdGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuXHRcdGRpciA9IGRpcm5hbWUoZGlyKTtcblx0fVxuXG5cdHdoaWxlICh0cnVlKSB7XG5cdFx0dG1wID0gY2FsbGJhY2soZGlyLCByZWFkZGlyU3luYyhkaXIpKTtcblx0XHRpZiAodG1wKSByZXR1cm4gcmVzb2x2ZShkaXIsIHRtcCk7XG5cdFx0ZGlyID0gZGlybmFtZSh0bXAgPSBkaXIpO1xuXHRcdGlmICh0bXAgPT09IGRpcikgYnJlYWs7XG5cdH1cbn1cbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgbWVyZ2UsIHJhY2VXaXRoLCB9IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIGZyb21FbWl0dGVyRXZlbnQsIGZpbHRlckFzeW5jLCB0aW1lb3V0LCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzeW5jRGlzcG9zZVN5bWJvbCwgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgV0VCX1BFUk1JU1NJT05fVE9fUFJPVE9DT0xfUEVSTUlTU0lPTiA9IG5ldyBNYXAoW1xuICAgIFsnZ2VvbG9jYXRpb24nLCAnZ2VvbG9jYXRpb24nXSxcbiAgICBbJ21pZGknLCAnbWlkaSddLFxuICAgIFsnbm90aWZpY2F0aW9ucycsICdub3RpZmljYXRpb25zJ10sXG4gICAgLy8gVE9ETzogcHVzaCBpc24ndCBhIHZhbGlkIHR5cGU/XG4gICAgLy8gWydwdXNoJywgJ3B1c2gnXSxcbiAgICBbJ2NhbWVyYScsICd2aWRlb0NhcHR1cmUnXSxcbiAgICBbJ21pY3JvcGhvbmUnLCAnYXVkaW9DYXB0dXJlJ10sXG4gICAgWydiYWNrZ3JvdW5kLXN5bmMnLCAnYmFja2dyb3VuZFN5bmMnXSxcbiAgICBbJ2FtYmllbnQtbGlnaHQtc2Vuc29yJywgJ3NlbnNvcnMnXSxcbiAgICBbJ2FjY2VsZXJvbWV0ZXInLCAnc2Vuc29ycyddLFxuICAgIFsnZ3lyb3Njb3BlJywgJ3NlbnNvcnMnXSxcbiAgICBbJ21hZ25ldG9tZXRlcicsICdzZW5zb3JzJ10sXG4gICAgWydhY2Nlc3NpYmlsaXR5LWV2ZW50cycsICdhY2Nlc3NpYmlsaXR5RXZlbnRzJ10sXG4gICAgWydjbGlwYm9hcmQtcmVhZCcsICdjbGlwYm9hcmRSZWFkV3JpdGUnXSxcbiAgICBbJ2NsaXBib2FyZC13cml0ZScsICdjbGlwYm9hcmRSZWFkV3JpdGUnXSxcbiAgICBbJ2NsaXBib2FyZC1zYW5pdGl6ZWQtd3JpdGUnLCAnY2xpcGJvYXJkU2FuaXRpemVkV3JpdGUnXSxcbiAgICBbJ3BheW1lbnQtaGFuZGxlcicsICdwYXltZW50SGFuZGxlciddLFxuICAgIFsncGVyc2lzdGVudC1zdG9yYWdlJywgJ2R1cmFibGVTdG9yYWdlJ10sXG4gICAgWydpZGxlLWRldGVjdGlvbicsICdpZGxlRGV0ZWN0aW9uJ10sXG4gICAgLy8gY2hyb21lLXNwZWNpZmljIHBlcm1pc3Npb25zIHdlIGhhdmUuXG4gICAgWydtaWRpLXN5c2V4JywgJ21pZGlTeXNleCddLFxuXSk7XG4vKipcbiAqIHtAbGluayBCcm93c2VyfSByZXByZXNlbnRzIGEgYnJvd3NlciBpbnN0YW5jZSB0aGF0IGlzIGVpdGhlcjpcbiAqXG4gKiAtIGNvbm5lY3RlZCB0byB2aWEge0BsaW5rIFB1cHBldGVlci5jb25uZWN0fSBvclxuICogLSBsYXVuY2hlZCBieSB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXVuY2h9LlxuICpcbiAqIHtAbGluayBCcm93c2VyfSB7QGxpbmsgRXZlbnRFbWl0dGVyLmVtaXQgfCBlbWl0c30gdmFyaW91cyBldmVudHMgd2hpY2ggYXJlXG4gKiBkb2N1bWVudGVkIGluIHRoZSB7QGxpbmsgQnJvd3NlckV2ZW50fSBlbnVtLlxuICpcbiAqIEBleGFtcGxlIFVzaW5nIGEge0BsaW5rIEJyb3dzZXJ9IHRvIGNyZWF0ZSBhIHtAbGluayBQYWdlfTpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICpcbiAqIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gKiBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vZXhhbXBsZS5jb20nKTtcbiAqIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIERpc2Nvbm5lY3RpbmcgZnJvbSBhbmQgcmVjb25uZWN0aW5nIHRvIGEge0BsaW5rIEJyb3dzZXJ9OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gKlxuICogY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqIC8vIFN0b3JlIHRoZSBlbmRwb2ludCB0byBiZSBhYmxlIHRvIHJlY29ubmVjdCB0byB0aGUgYnJvd3Nlci5cbiAqIGNvbnN0IGJyb3dzZXJXU0VuZHBvaW50ID0gYnJvd3Nlci53c0VuZHBvaW50KCk7XG4gKiAvLyBEaXNjb25uZWN0IHB1cHBldGVlciBmcm9tIHRoZSBicm93c2VyLlxuICogYXdhaXQgYnJvd3Nlci5kaXNjb25uZWN0KCk7XG4gKlxuICogLy8gVXNlIHRoZSBlbmRwb2ludCB0byByZWVzdGFibGlzaCBhIGNvbm5lY3Rpb25cbiAqIGNvbnN0IGJyb3dzZXIyID0gYXdhaXQgcHVwcGV0ZWVyLmNvbm5lY3Qoe2Jyb3dzZXJXU0VuZHBvaW50fSk7XG4gKiAvLyBDbG9zZSB0aGUgYnJvd3Nlci5cbiAqIGF3YWl0IGJyb3dzZXIyLmNsb3NlKCk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBCcm93c2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgdW50aWwgYSB7QGxpbmsgVGFyZ2V0IHwgdGFyZ2V0fSBtYXRjaGluZyB0aGUgZ2l2ZW4gYHByZWRpY2F0ZWBcbiAgICAgKiBhcHBlYXJzIGFuZCByZXR1cm5zIGl0LlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGxvb2sgYWxsIG9wZW4ge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0c30uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBGaW5kaW5nIGEgdGFyZ2V0IGZvciBhIHBhZ2Ugb3BlbmVkIHZpYSBgd2luZG93Lm9wZW5gOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHdpbmRvdy5vcGVuKCdodHRwczovL3d3dy5leGFtcGxlLmNvbS8nKSk7XG4gICAgICogY29uc3QgbmV3V2luZG93VGFyZ2V0ID0gYXdhaXQgYnJvd3Nlci53YWl0Rm9yVGFyZ2V0KFxuICAgICAqICAgdGFyZ2V0ID0+IHRhcmdldC51cmwoKSA9PT0gJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tLydcbiAgICAgKiApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JUYXJnZXQocHJlZGljYXRlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyB0aW1lb3V0OiBtcyA9IDMwMDAwIH0gPSBvcHRpb25zO1xuICAgICAgICByZXR1cm4gYXdhaXQgZmlyc3RWYWx1ZUZyb20obWVyZ2UoZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInRhcmdldGNyZWF0ZWRcIiAvKiBCcm93c2VyRXZlbnQuVGFyZ2V0Q3JlYXRlZCAqLyksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJ0YXJnZXRjaGFuZ2VkXCIgLyogQnJvd3NlckV2ZW50LlRhcmdldENoYW5nZWQgKi8pLCBmcm9tKHRoaXMudGFyZ2V0cygpKSkucGlwZShmaWx0ZXJBc3luYyhwcmVkaWNhdGUpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIGxpc3Qgb2YgYWxsIG9wZW4ge0BsaW5rIFBhZ2UgfCBwYWdlc30gaW5zaWRlIHRoaXMge0BsaW5rIEJyb3dzZXJ9LlxuICAgICAqXG4gICAgICogSWYgdGhlcmUgYXIgbXVsdGlwbGUge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0c30sIHRoaXNcbiAgICAgKiByZXR1cm5zIGFsbCB7QGxpbmsgUGFnZSB8IHBhZ2VzfSBpbiBhbGxcbiAgICAgKiB7QGxpbmsgQnJvd3NlckNvbnRleHQgfCBicm93c2VyIGNvbnRleHRzfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzIE5vbi12aXNpYmxlIHtAbGluayBQYWdlIHwgcGFnZXN9LCBzdWNoIGFzIGBcImJhY2tncm91bmRfcGFnZVwiYCxcbiAgICAgKiB3aWxsIG5vdCBiZSBsaXN0ZWQgaGVyZS4gWW91IGNhbiBmaW5kIHRoZW0gdXNpbmcge0BsaW5rIFRhcmdldC5wYWdlfS5cbiAgICAgKi9cbiAgICBhc3luYyBwYWdlcygpIHtcbiAgICAgICAgY29uc3QgY29udGV4dFBhZ2VzID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5icm93c2VyQ29udGV4dHMoKS5tYXAoY29udGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5wYWdlcygpO1xuICAgICAgICB9KSk7XG4gICAgICAgIC8vIEZsYXR0ZW4gYXJyYXkuXG4gICAgICAgIHJldHVybiBjb250ZXh0UGFnZXMucmVkdWNlKChhY2MsIHgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhY2MuY29uY2F0KHgpO1xuICAgICAgICB9LCBbXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgUHVwcGV0ZWVyIGlzIGNvbm5lY3RlZCB0byB0aGlzIHtAbGluayBCcm93c2VyIHwgYnJvd3Nlcn0uXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEJyb3dzZXIgfCBCcm93c2VyLmNvbm5lY3RlZH0uXG4gICAgICovXG4gICAgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFtkaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvY2VzcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmNsb3NlKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5kaXNjb25uZWN0KCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbYXN5bmNEaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvY2VzcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgbWVyZ2UsIHJhY2VXaXRoLCB9IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIGZyb21FbWl0dGVyRXZlbnQsIGZpbHRlckFzeW5jLCB0aW1lb3V0LCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzeW5jRGlzcG9zZVN5bWJvbCwgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG5pbXBvcnQgeyBNdXRleCB9IGZyb20gJy4uL3V0aWwvTXV0ZXguanMnO1xuLyoqXG4gKiB7QGxpbmsgQnJvd3NlckNvbnRleHR9IHJlcHJlc2VudHMgaW5kaXZpZHVhbCB1c2VyIGNvbnRleHRzIHdpdGhpbiBhXG4gKiB7QGxpbmsgQnJvd3NlciB8IGJyb3dzZXJ9LlxuICpcbiAqIFdoZW4gYSB7QGxpbmsgQnJvd3NlciB8IGJyb3dzZXJ9IGlzIGxhdW5jaGVkLCBpdCBoYXMgYSBzaW5nbGVcbiAqIHtAbGluayBCcm93c2VyQ29udGV4dCB8IGJyb3dzZXIgY29udGV4dH0gYnkgZGVmYXVsdC4gT3RoZXJzIGNhbiBiZSBjcmVhdGVkXG4gKiB1c2luZyB7QGxpbmsgQnJvd3Nlci5jcmVhdGVCcm93c2VyQ29udGV4dH0uIEVhY2ggY29udGV4dCBoYXMgaXNvbGF0ZWQgc3RvcmFnZVxuICogKGNvb2tpZXMvbG9jYWxTdG9yYWdlL2V0Yy4pXG4gKlxuICoge0BsaW5rIEJyb3dzZXJDb250ZXh0fSB7QGxpbmsgRXZlbnRFbWl0dGVyIHwgZW1pdHN9IHZhcmlvdXMgZXZlbnRzIHdoaWNoIGFyZVxuICogZG9jdW1lbnRlZCBpbiB0aGUge0BsaW5rIEJyb3dzZXJDb250ZXh0RXZlbnR9IGVudW0uXG4gKlxuICogSWYgYSB7QGxpbmsgUGFnZSB8IHBhZ2V9IG9wZW5zIGFub3RoZXIge0BsaW5rIFBhZ2UgfCBwYWdlfSwgZS5nLiB1c2luZ1xuICogYHdpbmRvdy5vcGVuYCwgdGhlIHBvcHVwIHdpbGwgYmVsb25nIHRvIHRoZSBwYXJlbnQge0BsaW5rIFBhZ2UuYnJvd3NlckNvbnRleHRcbiAqIHwgcGFnZSdzIGJyb3dzZXIgY29udGV4dH0uXG4gKlxuICogQGV4YW1wbGUgQ3JlYXRpbmcgYSBuZXcge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0fTpcbiAqXG4gKiBgYGB0c1xuICogLy8gQ3JlYXRlIGEgbmV3IGJyb3dzZXIgY29udGV4dFxuICogY29uc3QgY29udGV4dCA9IGF3YWl0IGJyb3dzZXIuY3JlYXRlQnJvd3NlckNvbnRleHQoKTtcbiAqIC8vIENyZWF0ZSBhIG5ldyBwYWdlIGluc2lkZSBjb250ZXh0LlxuICogY29uc3QgcGFnZSA9IGF3YWl0IGNvbnRleHQubmV3UGFnZSgpO1xuICogLy8gLi4uIGRvIHN0dWZmIHdpdGggcGFnZSAuLi5cbiAqIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICogLy8gRGlzcG9zZSBjb250ZXh0IG9uY2UgaXQncyBubyBsb25nZXIgbmVlZGVkLlxuICogYXdhaXQgY29udGV4dC5jbG9zZSgpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckNvbnRleHQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBkZWZpbmVkLCBpbmRpY2F0ZXMgYW4gb25nb2luZyBzY3JlZW5zaG90IG9wZXJlYXRpb24uXG4gICAgICovXG4gICAgI3BhZ2VTY3JlZW5zaG90TXV0ZXg7XG4gICAgI3NjcmVlbnNob3RPcGVyYXRpb25zQ291bnQgPSAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXJ0U2NyZWVuc2hvdCgpIHtcbiAgICAgICAgY29uc3QgbXV0ZXggPSB0aGlzLiNwYWdlU2NyZWVuc2hvdE11dGV4IHx8IG5ldyBNdXRleCgpO1xuICAgICAgICB0aGlzLiNwYWdlU2NyZWVuc2hvdE11dGV4ID0gbXV0ZXg7XG4gICAgICAgIHRoaXMuI3NjcmVlbnNob3RPcGVyYXRpb25zQ291bnQrKztcbiAgICAgICAgcmV0dXJuIG11dGV4LmFjcXVpcmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jc2NyZWVuc2hvdE9wZXJhdGlvbnNDb3VudC0tO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3NjcmVlbnNob3RPcGVyYXRpb25zQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG11dGV4IHRvIGluZGljYXRlIG5vIG9uZ29pbmcgc2NyZWVuc2hvdCBvcGVyYXRpb24uXG4gICAgICAgICAgICAgICAgdGhpcy4jcGFnZVNjcmVlbnNob3RNdXRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHdhaXRGb3JTY3JlZW5zaG90T3BlcmF0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3BhZ2VTY3JlZW5zaG90TXV0ZXg/LmFjcXVpcmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgdW50aWwgYSB7QGxpbmsgVGFyZ2V0IHwgdGFyZ2V0fSBtYXRjaGluZyB0aGUgZ2l2ZW4gYHByZWRpY2F0ZWBcbiAgICAgKiBhcHBlYXJzIGFuZCByZXR1cm5zIGl0LlxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGxvb2sgYWxsIG9wZW4ge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0c30uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBGaW5kaW5nIGEgdGFyZ2V0IGZvciBhIHBhZ2Ugb3BlbmVkIHZpYSBgd2luZG93Lm9wZW5gOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHdpbmRvdy5vcGVuKCdodHRwczovL3d3dy5leGFtcGxlLmNvbS8nKSk7XG4gICAgICogY29uc3QgbmV3V2luZG93VGFyZ2V0ID0gYXdhaXQgYnJvd3NlckNvbnRleHQud2FpdEZvclRhcmdldChcbiAgICAgKiAgIHRhcmdldCA9PiB0YXJnZXQudXJsKCkgPT09ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8nXG4gICAgICogKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyB3YWl0Rm9yVGFyZ2V0KHByZWRpY2F0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgdGltZW91dDogbXMgPSAzMDAwMCB9ID0gb3B0aW9ucztcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1lcmdlKGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJ0YXJnZXRjcmVhdGVkXCIgLyogQnJvd3NlckNvbnRleHRFdmVudC5UYXJnZXRDcmVhdGVkICovKSwgZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInRhcmdldGNoYW5nZWRcIiAvKiBCcm93c2VyQ29udGV4dEV2ZW50LlRhcmdldENoYW5nZWQgKi8pLCBmcm9tKHRoaXMudGFyZ2V0cygpKSkucGlwZShmaWx0ZXJBc3luYyhwcmVkaWNhdGUpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIHtAbGluayBCcm93c2VyQ29udGV4dCB8IGJyb3dzZXIgY29udGV4dH0gaXMgY2xvc2VkLlxuICAgICAqL1xuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5icm93c2VyKCkuYnJvd3NlckNvbnRleHRzKCkuaW5jbHVkZXModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoaXMge0BsaW5rIEJyb3dzZXJDb250ZXh0IHwgYnJvd3NlciBjb250ZXh0fS5cbiAgICAgKi9cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHJldHVybiB2b2lkIHRoaXMuY2xvc2UoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICB9XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIFthc3luY0Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJDb250ZXh0LmpzLm1hcCIsImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuLyoqXG4gKiBFdmVudHMgdGhhdCB0aGUgQ0RQU2Vzc2lvbiBjbGFzcyBlbWl0cy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIENEUFNlc3Npb25FdmVudDtcbihmdW5jdGlvbiAoQ0RQU2Vzc2lvbkV2ZW50KSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQgPSBTeW1ib2woJ0NEUFNlc3Npb24uRGlzY29ubmVjdGVkJyk7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIENEUFNlc3Npb25FdmVudC5Td2FwcGVkID0gU3ltYm9sKCdDRFBTZXNzaW9uLlN3YXBwZWQnKTtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHNlc3Npb24gaXMgcmVhZHkgdG8gYmUgY29uZmlndXJlZCBkdXJpbmcgdGhlIGF1dG8tYXR0YWNoXG4gICAgICogcHJvY2Vzcy4gUmlnaHQgYWZ0ZXIgdGhlIGV2ZW50IGlzIGhhbmRsZWQsIHRoZSBzZXNzaW9uIHdpbGwgYmUgcmVzdW1lZC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIENEUFNlc3Npb25FdmVudC5SZWFkeSA9IFN5bWJvbCgnQ0RQU2Vzc2lvbi5SZWFkeScpO1xuICAgIENEUFNlc3Npb25FdmVudC5TZXNzaW9uQXR0YWNoZWQgPSAnc2Vzc2lvbmF0dGFjaGVkJztcbiAgICBDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkID0gJ3Nlc3Npb25kZXRhY2hlZCc7XG59KShDRFBTZXNzaW9uRXZlbnQgfHwgKENEUFNlc3Npb25FdmVudCA9IHt9KSk7XG4vKipcbiAqIFRoZSBgQ0RQU2Vzc2lvbmAgaW5zdGFuY2VzIGFyZSB1c2VkIHRvIHRhbGsgcmF3IENocm9tZSBEZXZ0b29scyBQcm90b2NvbC5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIFByb3RvY29sIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCB3aXRoIHtAbGluayBDRFBTZXNzaW9uLnNlbmR9IG1ldGhvZCBhbmQgcHJvdG9jb2xcbiAqIGV2ZW50cyBjYW4gYmUgc3Vic2NyaWJlZCB0byB3aXRoIGBDRFBTZXNzaW9uLm9uYCBtZXRob2QuXG4gKlxuICogVXNlZnVsIGxpbmtzOiB7QGxpbmsgaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvIHwgRGV2VG9vbHMgUHJvdG9jb2wgVmlld2VyfVxuICogYW5kIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNsdXNobmlrb3YvZ2V0dGluZy1zdGFydGVkLXdpdGgtY2RwL2Jsb2IvSEVBRC9SRUFETUUubWQgfCBHZXR0aW5nIFN0YXJ0ZWQgd2l0aCBEZXZUb29scyBQcm90b2NvbH0uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgY2xpZW50ID0gYXdhaXQgcGFnZS5jcmVhdGVDRFBTZXNzaW9uKCk7XG4gKiBhd2FpdCBjbGllbnQuc2VuZCgnQW5pbWF0aW9uLmVuYWJsZScpO1xuICogY2xpZW50Lm9uKCdBbmltYXRpb24uYW5pbWF0aW9uQ3JlYXRlZCcsICgpID0+XG4gKiAgIGNvbnNvbGUubG9nKCdBbmltYXRpb24gY3JlYXRlZCEnKVxuICogKTtcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnNlbmQoJ0FuaW1hdGlvbi5nZXRQbGF5YmFja1JhdGUnKTtcbiAqIGNvbnNvbGUubG9nKCdwbGF5YmFjayByYXRlIGlzICcgKyByZXNwb25zZS5wbGF5YmFja1JhdGUpO1xuICogYXdhaXQgY2xpZW50LnNlbmQoJ0FuaW1hdGlvbi5zZXRQbGF5YmFja1JhdGUnLCB7XG4gKiAgIHBsYXliYWNrUmF0ZTogcmVzcG9uc2UucGxheWJhY2tSYXRlIC8gMixcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQ0RQU2Vzc2lvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcmVudCBzZXNzaW9uIGluIHRlcm1zIG9mIENEUCdzIGF1dG8tYXR0YWNoIG1lY2hhbmlzbS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHBhcmVudFNlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q0RQU2Vzc2lvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuLyoqXG4gKiBEaWFsb2cgaW5zdGFuY2VzIGFyZSBkaXNwYXRjaGVkIGJ5IHRoZSB7QGxpbmsgUGFnZX0gdmlhIHRoZSBgZGlhbG9nYCBldmVudC5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAqXG4gKiAoYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiAgIHBhZ2Uub24oJ2RpYWxvZycsIGFzeW5jIGRpYWxvZyA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coZGlhbG9nLm1lc3NhZ2UoKSk7XG4gKiAgICAgYXdhaXQgZGlhbG9nLmRpc21pc3MoKTtcbiAqICAgICBhd2FpdCBicm93c2VyLmNsb3NlKCk7XG4gKiAgIH0pO1xuICogICBwYWdlLmV2YWx1YXRlKCgpID0+IGFsZXJ0KCcxJykpO1xuICogfSkoKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERpYWxvZyB7XG4gICAgI3R5cGU7XG4gICAgI21lc3NhZ2U7XG4gICAgI2RlZmF1bHRWYWx1ZTtcbiAgICAjaGFuZGxlZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSA9ICcnKSB7XG4gICAgICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLiNtZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy4jZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0eXBlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWVzc2FnZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByb21wdCwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBkaWFsb2dcbiAgICAgKiBpcyBub3QgYSBgcHJvbXB0YC5cbiAgICAgKi9cbiAgICBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRpYWxvZyBoYXMgYmVlbiBhY2NlcHRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9tcHRUZXh0IC0gb3B0aW9uYWwgdGV4dCB0aGF0IHdpbGwgYmUgZW50ZXJlZCBpbiB0aGUgZGlhbG9nXG4gICAgICogcHJvbXB0LiBIYXMgbm8gZWZmZWN0IGlmIHRoZSBkaWFsb2cncyB0eXBlIGlzIG5vdCBgcHJvbXB0YC5cbiAgICAgKlxuICAgICAqL1xuICAgIGFzeW5jIGFjY2VwdChwcm9tcHRUZXh0KSB7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBhY2NlcHQgZGlhbG9nIHdoaWNoIGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgdGhpcy4jaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlKHtcbiAgICAgICAgICAgIGFjY2VwdDogdHJ1ZSxcbiAgICAgICAgICAgIHRleHQ6IHByb21wdFRleHQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIG9uY2UgdGhlIGRpYWxvZyBoYXMgYmVlbiBkaXNtaXNzZWRcbiAgICAgKi9cbiAgICBhc3luYyBkaXNtaXNzKCkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2hhbmRsZWQsICdDYW5ub3QgZGlzbWlzcyBkaWFsb2cgd2hpY2ggaXMgYWxyZWFkeSBoYW5kbGVkIScpO1xuICAgICAgICB0aGlzLiNoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGUoe1xuICAgICAgICAgICAgYWNjZXB0OiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGlhbG9nLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG52YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xudmFyIF9fc2V0RnVuY3Rpb25OYW1lID0gKHRoaXMgJiYgdGhpcy5fX3NldEZ1bmN0aW9uTmFtZSkgfHwgZnVuY3Rpb24gKGYsIG5hbWUsIHByZWZpeCkge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5pbXBvcnQgeyBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvciB9IGZyb20gJy4uL2NvbW1vbi9HZXRRdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4uL2NvbW1vbi9MYXp5QXJnLmpzJztcbmltcG9ydCB7IGlzU3RyaW5nLCB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgQXN5bmNJdGVyYWJsZVV0aWwgfSBmcm9tICcuLi91dGlsL0FzeW5jSXRlcmFibGVVdGlsLmpzJztcbmltcG9ydCB7IHRocm93SWZEaXNwb3NlZCB9IGZyb20gJy4uL3V0aWwvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBfaXNFbGVtZW50SGFuZGxlIH0gZnJvbSAnLi9FbGVtZW50SGFuZGxlU3ltYm9sLmpzJztcbmltcG9ydCB7IEpTSGFuZGxlIH0gZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG4vKipcbiAqIEVsZW1lbnRIYW5kbGUgcmVwcmVzZW50cyBhbiBpbi1wYWdlIERPTSBlbGVtZW50LlxuICpcbiAqIEByZW1hcmtzXG4gKiBFbGVtZW50SGFuZGxlcyBjYW4gYmUgY3JlYXRlZCB3aXRoIHRoZSB7QGxpbmsgUGFnZS4kfSBtZXRob2QuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAqXG4gKiAoYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiAgIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICogICBjb25zdCBocmVmRWxlbWVudCA9IGF3YWl0IHBhZ2UuJCgnYScpO1xuICogICBhd2FpdCBocmVmRWxlbWVudC5jbGljaygpO1xuICogICAvLyAuLi5cbiAqIH0pKCk7XG4gKiBgYGBcbiAqXG4gKiBFbGVtZW50SGFuZGxlIHByZXZlbnRzIHRoZSBET00gZWxlbWVudCBmcm9tIGJlaW5nIGdhcmJhZ2UtY29sbGVjdGVkIHVubGVzcyB0aGVcbiAqIGhhbmRsZSBpcyB7QGxpbmsgSlNIYW5kbGUuZGlzcG9zZSB8IGRpc3Bvc2VkfS4gRWxlbWVudEhhbmRsZXMgYXJlIGF1dG8tZGlzcG9zZWRcbiAqIHdoZW4gdGhlaXIgb3JpZ2luIGZyYW1lIGdldHMgbmF2aWdhdGVkLlxuICpcbiAqIEVsZW1lbnRIYW5kbGUgaW5zdGFuY2VzIGNhbiBiZSB1c2VkIGFzIGFyZ3VtZW50cyBpbiB7QGxpbmsgUGFnZS4kZXZhbH0gYW5kXG4gKiB7QGxpbmsgUGFnZS5ldmFsdWF0ZX0gbWV0aG9kcy5cbiAqXG4gKiBJZiB5b3UncmUgdXNpbmcgVHlwZVNjcmlwdCwgRWxlbWVudEhhbmRsZSB0YWtlcyBhIGdlbmVyaWMgYXJndW1lbnQgdGhhdFxuICogZGVub3RlcyB0aGUgdHlwZSBvZiBlbGVtZW50IHRoZSBoYW5kbGUgaXMgaG9sZGluZyB3aXRoaW4uIEZvciBleGFtcGxlLCBpZiB5b3VcbiAqIGhhdmUgYSBoYW5kbGUgdG8gYSBgPHNlbGVjdD5gIGVsZW1lbnQsIHlvdSBjYW4gdHlwZSBpdCBhc1xuICogYEVsZW1lbnRIYW5kbGU8SFRNTFNlbGVjdEVsZW1lbnQ+YCBhbmQgeW91IGdldCBzb21lIG5pY2VyIHR5cGUgY2hlY2tzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xubGV0IEVsZW1lbnRIYW5kbGUgPSAoKCkgPT4ge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tLCBfbywgX3AsIF9xLCBfciwgX3MsIF90LCBfdSwgX3YsIF93LCBfeCwgX3ksIF96LCBfMCwgXzEsIF8yLCBfMywgXzQsIF81O1xuICAgIGxldCBfY2xhc3NTdXBlciA9IEpTSGFuZGxlO1xuICAgIGxldCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfZ2V0UHJvcGVydHlfZGVjb3JhdG9ycztcbiAgICBsZXQgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycztcbiAgICBsZXQgX2pzb25WYWx1ZV9kZWNvcmF0b3JzO1xuICAgIGxldCBfJF9kZWNvcmF0b3JzO1xuICAgIGxldCBfJCRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfJCRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfJCRfZGVzY3JpcHRvcjtcbiAgICBsZXQgX3dhaXRGb3JTZWxlY3Rvcl9kZWNvcmF0b3JzO1xuICAgIGxldCBfaXNWaXNpYmxlX2RlY29yYXRvcnM7XG4gICAgbGV0IF9pc0hpZGRlbl9kZWNvcmF0b3JzO1xuICAgIGxldCBfdG9FbGVtZW50X2RlY29yYXRvcnM7XG4gICAgbGV0IF9jbGlja2FibGVQb2ludF9kZWNvcmF0b3JzO1xuICAgIGxldCBfaG92ZXJfZGVjb3JhdG9ycztcbiAgICBsZXQgX2NsaWNrX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcmFnX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcmFnRW50ZXJfZGVjb3JhdG9ycztcbiAgICBsZXQgX2RyYWdPdmVyX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcm9wX2RlY29yYXRvcnM7XG4gICAgbGV0IF9kcmFnQW5kRHJvcF9kZWNvcmF0b3JzO1xuICAgIGxldCBfc2VsZWN0X2RlY29yYXRvcnM7XG4gICAgbGV0IF90YXBfZGVjb3JhdG9ycztcbiAgICBsZXQgX3RvdWNoU3RhcnRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3RvdWNoTW92ZV9kZWNvcmF0b3JzO1xuICAgIGxldCBfdG91Y2hFbmRfZGVjb3JhdG9ycztcbiAgICBsZXQgX2ZvY3VzX2RlY29yYXRvcnM7XG4gICAgbGV0IF90eXBlX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcmVzc19kZWNvcmF0b3JzO1xuICAgIGxldCBfYm91bmRpbmdCb3hfZGVjb3JhdG9ycztcbiAgICBsZXQgX2JveE1vZGVsX2RlY29yYXRvcnM7XG4gICAgbGV0IF9zY3JlZW5zaG90X2RlY29yYXRvcnM7XG4gICAgbGV0IF9pc0ludGVyc2VjdGluZ1ZpZXdwb3J0X2RlY29yYXRvcnM7XG4gICAgbGV0IF9zY3JvbGxJbnRvVmlld19kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBFbGVtZW50SGFuZGxlIGV4dGVuZHMgX2NsYXNzU3VwZXIge1xuICAgICAgICBzdGF0aWMge1xuICAgICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9nZXRQcm9wZXJ0eV9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX2EgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfYSldO1xuICAgICAgICAgICAgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9iID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2IpXTtcbiAgICAgICAgICAgIF9qc29uVmFsdWVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9jID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2MpXTtcbiAgICAgICAgICAgIF8kX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfZCA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9kKV07XG4gICAgICAgICAgICBfJCRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKV07XG4gICAgICAgICAgICBfcHJpdmF0ZV8kJF9kZWNvcmF0b3JzID0gWyhfZSA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9lKV07XG4gICAgICAgICAgICBfd2FpdEZvclNlbGVjdG9yX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfZiA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9mKV07XG4gICAgICAgICAgICBfaXNWaXNpYmxlX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfZyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9nKV07XG4gICAgICAgICAgICBfaXNIaWRkZW5fZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9oID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2gpXTtcbiAgICAgICAgICAgIF90b0VsZW1lbnRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9qID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2opXTtcbiAgICAgICAgICAgIF9jbGlja2FibGVQb2ludF9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX2sgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfayldO1xuICAgICAgICAgICAgX2hvdmVyX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfbCA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9sKV07XG4gICAgICAgICAgICBfY2xpY2tfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9tID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX20pXTtcbiAgICAgICAgICAgIF9kcmFnX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfbyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9vKV07XG4gICAgICAgICAgICBfZHJhZ0VudGVyX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfcCA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9wKV07XG4gICAgICAgICAgICBfZHJhZ092ZXJfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9xID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3EpXTtcbiAgICAgICAgICAgIF9kcm9wX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfciA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF9yKV07XG4gICAgICAgICAgICBfZHJhZ0FuZERyb3BfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9zID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3MpXTtcbiAgICAgICAgICAgIF9zZWxlY3RfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF90ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3QpXTtcbiAgICAgICAgICAgIF90YXBfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF91ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3UpXTtcbiAgICAgICAgICAgIF90b3VjaFN0YXJ0X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfdiA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF92KV07XG4gICAgICAgICAgICBfdG91Y2hNb3ZlX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfdyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF93KV07XG4gICAgICAgICAgICBfdG91Y2hFbmRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF94ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3gpXTtcbiAgICAgICAgICAgIF9mb2N1c19kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX3kgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfeSldO1xuICAgICAgICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF96ID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX3opXTtcbiAgICAgICAgICAgIF9wcmVzc19kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoXzAgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfMCldO1xuICAgICAgICAgICAgX2JvdW5kaW5nQm94X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfMSA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF8xKV07XG4gICAgICAgICAgICBfYm94TW9kZWxfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF8yID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoXzIpXTtcbiAgICAgICAgICAgIF9zY3JlZW5zaG90X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfMyA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF8zKV07XG4gICAgICAgICAgICBfaXNJbnRlcnNlY3RpbmdWaWV3cG9ydF9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoXzQgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfNCldO1xuICAgICAgICAgICAgX3Njcm9sbEludG9WaWV3X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRpc3Bvc2VkKCksIChfNSA9IEVsZW1lbnRIYW5kbGUpLmJpbmRJc29sYXRlZEhhbmRsZS5iaW5kKF81KV07XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2dldFByb3BlcnR5X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJnZXRQcm9wZXJ0eVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZ2V0UHJvcGVydHlcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5nZXRQcm9wZXJ0eSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZ2V0UHJvcGVydGllc19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZ2V0UHJvcGVydGllc1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZ2V0UHJvcGVydGllc1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmdldFByb3BlcnRpZXMgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2pzb25WYWx1ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwianNvblZhbHVlXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJqc29uVmFsdWVcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5qc29uVmFsdWUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgXyRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIiRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai4kIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF8kJF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiJCRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIiQkXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouJCQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfJCRfZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jJCRpbXBsKHNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICB9LCBcIiMkJFwiKSB9LCBfcHJpdmF0ZV8kJF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiIyQkXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjJCQgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouIyQkIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF93YWl0Rm9yU2VsZWN0b3JfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIndhaXRGb3JTZWxlY3RvclwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwid2FpdEZvclNlbGVjdG9yXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoud2FpdEZvclNlbGVjdG9yIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9pc1Zpc2libGVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImlzVmlzaWJsZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiaXNWaXNpYmxlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaXNWaXNpYmxlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9pc0hpZGRlbl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiaXNIaWRkZW5cIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImlzSGlkZGVuXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaXNIaWRkZW4gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RvRWxlbWVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidG9FbGVtZW50XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ0b0VsZW1lbnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50b0VsZW1lbnQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2NsaWNrYWJsZVBvaW50X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJjbGlja2FibGVQb2ludFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiY2xpY2thYmxlUG9pbnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5jbGlja2FibGVQb2ludCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfaG92ZXJfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImhvdmVyXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJob3ZlclwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmhvdmVyIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9jbGlja19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiY2xpY2tcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImNsaWNrXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouY2xpY2sgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2RyYWdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImRyYWdcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyYWdcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5kcmFnIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9kcmFnRW50ZXJfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImRyYWdFbnRlclwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZHJhZ0VudGVyXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZHJhZ0VudGVyIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9kcmFnT3Zlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZHJhZ092ZXJcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyYWdPdmVyXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZHJhZ092ZXIgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2Ryb3BfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImRyb3BcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyb3BcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5kcm9wIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9kcmFnQW5kRHJvcF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZHJhZ0FuZERyb3BcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImRyYWdBbmREcm9wXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZHJhZ0FuZERyb3AgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3NlbGVjdF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2VsZWN0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzZWxlY3RcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5zZWxlY3QgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RhcF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidGFwXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ0YXBcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50YXAgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RvdWNoU3RhcnRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInRvdWNoU3RhcnRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInRvdWNoU3RhcnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50b3VjaFN0YXJ0IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF90b3VjaE1vdmVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInRvdWNoTW92ZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwidG91Y2hNb3ZlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudG91Y2hNb3ZlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF90b3VjaEVuZF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidG91Y2hFbmRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInRvdWNoRW5kXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudG91Y2hFbmQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2ZvY3VzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJmb2N1c1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZm9jdXNcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5mb2N1cyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfdHlwZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidHlwZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwidHlwZVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnR5cGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3ByZXNzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJwcmVzc1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwicHJlc3NcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5wcmVzcyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfYm91bmRpbmdCb3hfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImJvdW5kaW5nQm94XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJib3VuZGluZ0JveFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmJvdW5kaW5nQm94IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9ib3hNb2RlbF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiYm94TW9kZWxcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImJveE1vZGVsXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYm94TW9kZWwgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3NjcmVlbnNob3RfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInNjcmVlbnNob3RcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInNjcmVlbnNob3RcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5zY3JlZW5zaG90IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9pc0ludGVyc2VjdGluZ1ZpZXdwb3J0X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJpc0ludGVyc2VjdGluZ1ZpZXdwb3J0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJpc0ludGVyc2VjdGluZ1ZpZXdwb3J0XCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaXNJbnRlcnNlY3RpbmdWaWV3cG9ydCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2Nyb2xsSW50b1ZpZXdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInNjcm9sbEludG9WaWV3XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzY3JvbGxJbnRvVmlld1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNjcm9sbEludG9WaWV3IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICogQ2FjaGVkIGlzb2xhdGVkSGFuZGxlIHRvIHByZXZlbnRcbiAgICAgICAgICogdHJ5aW5nIHRvIGFkb3B0IGl0IG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAqL1xuICAgICAgICBpc29sYXRlZEhhbmRsZSA9IF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXMsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZ2l2ZW4gbWV0aG9kIHdpbGwgaGF2ZSBpdCdzIGB0aGlzYCByZXBsYWNlZCB3aXRoIGFuIGlzb2xhdGVkIHZlcnNpb24gb2ZcbiAgICAgICAgICogYHRoaXNgIHdoZW4gZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEFsbCBjaGFuZ2VzIG9mIGlzb2xhdGVkIGB0aGlzYCBhcmUgcmVmbGVjdGVkIG9uIHRoZSBhY3R1YWwgYHRoaXNgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHN0YXRpYyBiaW5kSXNvbGF0ZWRIYW5kbGUodGFyZ2V0LCBfKSB7XG4gICAgICAgICAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaGFuZGxlIGlzIGFscmVhZHkgaXNvbGF0ZWQsIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBhZG9wdCBpdFxuICAgICAgICAgICAgICAgIC8vIGFnYWluLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWxtID09PSB0aGlzLmZyYW1lLmlzb2xhdGVkUmVhbG0oKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGFyZ2V0LmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBhZG9wdGVkVGhpcztcbiAgICAgICAgICAgICAgICBpZiAodGhpc1snaXNvbGF0ZWRIYW5kbGUnXSkge1xuICAgICAgICAgICAgICAgICAgICBhZG9wdGVkVGhpcyA9IHRoaXNbJ2lzb2xhdGVkSGFuZGxlJ107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzWydpc29sYXRlZEhhbmRsZSddID0gYWRvcHRlZFRoaXMgPSBhd2FpdCB0aGlzLmZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRvcHRIYW5kbGUodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRhcmdldC5jYWxsKGFkb3B0ZWRUaGlzLCAuLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBgYWRvcHRlZFRoaXNgLCB0aGVuIHdlIHJldHVybiBgdGhpc2AuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gYWRvcHRlZFRoaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgaGFuZGxlLCB0cmFuc2ZlciBpdCBpbnRvIHRoZSBjdXJyZW50IHJlYWxtLlxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBKU0hhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWFsbS50cmFuc2ZlckhhbmRsZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhbiBhcnJheSBvZiBoYW5kbGVycywgdHJhbnNmZXIgdGhlbSBpbnRvIHRoZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgcmVhbG0uXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChyZXN1bHQubWFwKGFzeW5jIChpdGVtLCBpbmRleCwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEpTSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGF3YWl0IHRoaXMucmVhbG0udHJhbnNmZXJIYW5kbGUoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbLi4ucmVzdWx0LmVudHJpZXMoKV0ubWFwKGFzeW5jIChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEpTSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIGF3YWl0IHRoaXMucmVhbG0udHJhbnNmZXJIYW5kbGUodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBoYW5kbGU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0cnVjdG9yKGhhbmRsZSkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlO1xuICAgICAgICAgICAgdGhpc1tfaXNFbGVtZW50SGFuZGxlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0IGlkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLmlkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZS5kaXNwb3NlZDtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGdldFByb3BlcnRpZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGUuZ2V0UHJvcGVydGllcygpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICAgICAgcGFnZUZ1bmN0aW9uID0gd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSh0aGlzLmV2YWx1YXRlLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGUuZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBldmFsdWF0ZUhhbmRsZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy5ldmFsdWF0ZUhhbmRsZS5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlLmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMganNvblZhbHVlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlLmpzb25WYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgcmVtb3RlT2JqZWN0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLnJlbW90ZU9iamVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzRWxlbWVudCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBRdWVyaWVzIHRoZSBjdXJyZW50IGVsZW1lbnQgZm9yIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKiBAcmV0dXJucyBBIHtAbGluayBFbGVtZW50SGFuZGxlIHwgZWxlbWVudCBoYW5kbGV9IHRvIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICAgICAqIG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3Rvci4gT3RoZXJ3aXNlLCBgbnVsbGAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICBjb25zdCB7IHVwZGF0ZWRTZWxlY3RvciwgUXVlcnlIYW5kbGVyIH0gPSBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgICAgICByZXR1cm4gKGF3YWl0IFF1ZXJ5SGFuZGxlci5xdWVyeU9uZSh0aGlzLCB1cGRhdGVkU2VsZWN0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUXVlcmllcyB0aGUgY3VycmVudCBlbGVtZW50IGZvciBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB7QGxpbmsgRWxlbWVudEhhbmRsZSB8IGVsZW1lbnQgaGFuZGxlc30gdGhhdCBwb2ludCB0b1xuICAgICAgICAgKiBlbGVtZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkJChzZWxlY3Rvciwgb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmlzb2xhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuIyQkaW1wbChzZWxlY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jJCQoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJc29sYXRlcyB7QGxpbmsgRWxlbWVudEhhbmRsZS4kJH0gaWYgbmVlZGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGdldCAjJCQoKSB7IHJldHVybiBfcHJpdmF0ZV8kJF9kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIEVsZW1lbnRIYW5kbGUuJCR9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICMkJGltcGwoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlZFNlbGVjdG9yLCBRdWVyeUhhbmRsZXIgfSA9IGdldFF1ZXJ5SGFuZGxlckFuZFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBBc3luY0l0ZXJhYmxlVXRpbC5jb2xsZWN0KFF1ZXJ5SGFuZGxlci5xdWVyeUFsbCh0aGlzLCB1cGRhdGVkU2VsZWN0b3IpKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gdGhlIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGluXG4gICAgICAgICAqIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdGlsbFxuICAgICAgICAgKiB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgdHdlZXRIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJy50d2VldCcpO1xuICAgICAgICAgKiBleHBlY3QoYXdhaXQgdHdlZXRIYW5kbGUuJGV2YWwoJy5saWtlJywgbm9kZSA9PiBub2RlLmlubmVyVGV4dCkpLnRvQmUoXG4gICAgICAgICAqICAgJzEwMCdcbiAgICAgICAgICogKTtcbiAgICAgICAgICogZXhwZWN0KGF3YWl0IHR3ZWV0SGFuZGxlLiRldmFsKCcucmV0d2VldHMnLCBub2RlID0+IG5vZGUuaW5uZXJUZXh0KSkudG9CZShcbiAgICAgICAgICogICAnMTAnXG4gICAgICAgICAqICk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKiBAcGFyYW0gcGFnZUZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZCBpbiB0aGlzIGVsZW1lbnQncyBwYWdlJ3NcbiAgICAgICAgICogY29udGV4dC4gVGhlIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yIHdpbGwgYmUgcGFzc2VkIGluIGFzIHRoZVxuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZfMSA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGFnZUZ1bmN0aW9uID0gd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSh0aGlzLiRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudEhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBhd2FpdCB0aGlzLiQoc2VsZWN0b3IpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3I6IGZhaWxlZCB0byBmaW5kIGVsZW1lbnQgbWF0Y2hpbmcgc2VsZWN0b3IgXCIke3NlbGVjdG9yfVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBlbGVtZW50SGFuZGxlLmV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgZW52XzEuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yXG4gICAgICAgICAqIGluIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdGlsbFxuICAgICAgICAgKiB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogSFRNTDpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgaHRtbFxuICAgICAgICAgKiA8ZGl2IGNsYXNzPVwiZmVlZFwiPlxuICAgICAgICAgKiAgIDxkaXYgY2xhc3M9XCJ0d2VldFwiPkhlbGxvITwvZGl2PlxuICAgICAgICAgKiAgIDxkaXYgY2xhc3M9XCJ0d2VldFwiPkhpITwvZGl2PlxuICAgICAgICAgKiA8L2Rpdj5cbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEphdmFTY3JpcHQ6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGZlZWRIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJy5mZWVkJyk7XG4gICAgICAgICAqIGV4cGVjdChcbiAgICAgICAgICogICBhd2FpdCBmZWVkSGFuZGxlLiQkZXZhbCgnLnR3ZWV0Jywgbm9kZXMgPT4gbm9kZXMubWFwKG4gPT4gbi5pbm5lclRleHQpKVxuICAgICAgICAgKiApLnRvRXF1YWwoWydIZWxsbyEnLCAnSGkhJ10pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC1cbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3NlbGVjdG9ycyB8IHNlbGVjdG9yfVxuICAgICAgICAgKiB0byBxdWVyeSBwYWdlIGZvci5cbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzIHwgQ1NTIHNlbGVjdG9yc31cbiAgICAgICAgICogY2FuIGJlIHBhc3NlZCBhcy1pcyBhbmQgYVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjbm9uLWNzcy1zZWxlY3RvcnMgfCBQdXBwZXRlZXItc3BlY2lmaWMgc2VsZWN0b3Igc3ludGF4fVxuICAgICAgICAgKiBhbGxvd3MgcXVlcmluZyBieVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjdGV4dC1zZWxlY3RvcnMtLXAtdGV4dCB8IHRleHR9LFxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjYXJpYS1zZWxlY3RvcnMtLXAtYXJpYSB8IGExMXkgcm9sZSBhbmQgbmFtZX0sXG4gICAgICAgICAqIGFuZFxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjeHBhdGgtc2VsZWN0b3JzLS1wLXhwYXRoIHwgeHBhdGh9XG4gICAgICAgICAqIGFuZFxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjcXVlcnlpbmctZWxlbWVudHMtaW4tc2hhZG93LWRvbSB8IGNvbWJpbmluZyB0aGVzZSBxdWVyaWVzIGFjcm9zcyBzaGFkb3cgcm9vdHN9LlxuICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNwZWNpZnkgdGhlIHNlbGVjdG9yIHR5cGUgdXNpbmcgYVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjcHJlZml4ZWQtc2VsZWN0b3Itc3ludGF4IHwgcHJlZml4fS5cbiAgICAgICAgICogQHBhcmFtIHBhZ2VGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBiZSBldmFsdWF0ZWQgaW4gdGhlIGVsZW1lbnQncyBwYWdlJ3NcbiAgICAgICAgICogY29udGV4dC4gQW4gYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIHdpbGwgYmUgcGFzc2VkIHRvXG4gICAgICAgICAqIHRoZSBmdW5jdGlvbiBhcyBpdHMgZmlyc3QgYXJndW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBgcGFnZUZ1bmN0aW9uYC5cbiAgICAgICAgICogQHJldHVybnMgQSBwcm9taXNlIHRvIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgJCRldmFsKHNlbGVjdG9yLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuJCRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuJCQoc2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzIsIGF3YWl0IHRoaXMuZXZhbHVhdGVIYW5kbGUoKF8sIC4uLmVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICAgICAgICAgICAgICB9LCAuLi5yZXN1bHRzKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5ldmFsdWF0ZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpLFxuICAgICAgICAgICAgICAgICAgICAuLi5yZXN1bHRzLm1hcChyZXN1bHRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzIpIHtcbiAgICAgICAgICAgICAgICBlbnZfMi5lcnJvciA9IGVfMjtcbiAgICAgICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXYWl0IGZvciBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciB0byBhcHBlYXIgaW4gdGhlIGN1cnJlbnRcbiAgICAgICAgICogZWxlbWVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogVW5saWtlIHtAbGluayBGcmFtZS53YWl0Rm9yU2VsZWN0b3J9LCB0aGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGFjcm9zc1xuICAgICAgICAgKiBuYXZpZ2F0aW9ucyBvciBpZiB0aGUgZWxlbWVudCBpcyBkZXRhY2hlZCBmcm9tIERPTS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKlxuICAgICAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgKiAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gICAgICAgICAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICAgKiAgIGxldCBjdXJyZW50VVJMO1xuICAgICAgICAgKiAgIHBhZ2VcbiAgICAgICAgICogICAgIC5tYWluRnJhbWUoKVxuICAgICAgICAgKiAgICAgLndhaXRGb3JTZWxlY3RvcignaW1nJylcbiAgICAgICAgICogICAgIC50aGVuKCgpID0+IGNvbnNvbGUubG9nKCdGaXJzdCBVUkwgd2l0aCBpbWFnZTogJyArIGN1cnJlbnRVUkwpKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICBmb3IgKGN1cnJlbnRVUkwgb2YgW1xuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZ29vZ2xlLmNvbScsXG4gICAgICAgICAqICAgICAnaHR0cHM6Ly9iYmMuY29tJyxcbiAgICAgICAgICogICBdKSB7XG4gICAgICAgICAqICAgICBhd2FpdCBwYWdlLmdvdG8oY3VycmVudFVSTCk7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIFRoZSBzZWxlY3RvciB0byBxdWVyeSBhbmQgd2FpdCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgY3VzdG9taXppbmcgd2FpdGluZyBiZWhhdmlvci5cbiAgICAgICAgICogQHJldHVybnMgQW4gZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqIEB0aHJvd3MgVGhyb3dzIGlmIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGRvZXNuJ3QgYXBwZWFyLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FpdEZvclNlbGVjdG9yKHNlbGVjdG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlZFNlbGVjdG9yLCBRdWVyeUhhbmRsZXIsIHBvbGxpbmcgfSA9IGdldFF1ZXJ5SGFuZGxlckFuZFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgUXVlcnlIYW5kbGVyLndhaXRGb3IodGhpcywgdXBkYXRlZFNlbGVjdG9yLCB7XG4gICAgICAgICAgICAgICAgcG9sbGluZyxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jICNjaGVja1Zpc2liaWxpdHkodmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXZhbHVhdGUoYXN5bmMgKGVsZW1lbnQsIFB1cHBldGVlclV0aWwsIHZpc2liaWxpdHkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihQdXBwZXRlZXJVdGlsLmNoZWNrVmlzaWJpbGl0eShlbGVtZW50LCB2aXNpYmlsaXR5KSk7XG4gICAgICAgICAgICB9LCBMYXp5QXJnLmNyZWF0ZShjb250ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgfSksIHZpc2liaWxpdHkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBlbGVtZW50IGlzIGNvbnNpZGVyZWQgdG8gYmUgdmlzaWJsZSBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBpc1xuICAgICAgICAgKiB0cnVlOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhc1xuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2dldENvbXB1dGVkU3R5bGUgfCBjb21wdXRlZCBzdHlsZXN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhcyBhIG5vbi1lbXB0eVxuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRCb3VuZGluZ0NsaWVudFJlY3QgfCBib3VuZGluZyBjbGllbnQgcmVjdH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIC0gdGhlIGVsZW1lbnQncyB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3Zpc2liaWxpdHkgfCB2aXNpYmlsaXR5fVxuICAgICAgICAgKiAgIGlzIG5vdCBgaGlkZGVuYCBvciBgY29sbGFwc2VgLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXNWaXNpYmxlKCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2NoZWNrVmlzaWJpbGl0eSh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gZWxlbWVudCBpcyBjb25zaWRlcmVkIHRvIGJlIGhpZGRlbiBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhcyBub1xuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2dldENvbXB1dGVkU3R5bGUgfCBjb21wdXRlZCBzdHlsZXN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIHRoZSBlbGVtZW50IGhhcyBhbiBlbXB0eVxuICAgICAgICAgKiAgIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRCb3VuZGluZ0NsaWVudFJlY3QgfCBib3VuZGluZyBjbGllbnQgcmVjdH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIC0gdGhlIGVsZW1lbnQncyB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3Zpc2liaWxpdHkgfCB2aXNpYmlsaXR5fVxuICAgICAgICAgKiAgIGlzIGBoaWRkZW5gIG9yIGBjb2xsYXBzZWAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpc0hpZGRlbigpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjaGVja1Zpc2liaWxpdHkoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb252ZXJ0cyB0aGUgY3VycmVudCBoYW5kbGUgdG8gdGhlIGdpdmVuIGVsZW1lbnQgdHlwZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgZWxlbWVudDogRWxlbWVudEhhbmRsZTxFbGVtZW50PiA9IGF3YWl0IHBhZ2UuJChcbiAgICAgICAgICogICAnLmNsYXNzLW5hbWUtb2YtYW5jaG9yJ1xuICAgICAgICAgKiApO1xuICAgICAgICAgKiAvLyBETyBOT1QgRElTUE9TRSBgZWxlbWVudGAsIHRoaXMgd2lsbCBiZSBhbHdheXMgYmUgdGhlIHNhbWUgaGFuZGxlLlxuICAgICAgICAgKiBjb25zdCBhbmNob3I6IEVsZW1lbnRIYW5kbGU8SFRNTEFuY2hvckVsZW1lbnQ+ID1cbiAgICAgICAgICogICBhd2FpdCBlbGVtZW50LnRvRWxlbWVudCgnYScpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHRhZ05hbWUgLSBUaGUgdGFnIG5hbWUgb2YgdGhlIGRlc2lyZWQgZWxlbWVudCB0eXBlLlxuICAgICAgICAgKiBAdGhyb3dzIEFuIGVycm9yIGlmIHRoZSBoYW5kbGUgZG9lcyBub3QgbWF0Y2guICoqVGhlIGhhbmRsZSB3aWxsIG5vdCBiZVxuICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IGRpc3Bvc2VkLioqXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0b0VsZW1lbnQodGFnTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgaXNNYXRjaGluZ1RhZ05hbWUgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKChub2RlLCB0YWdOYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUubm9kZU5hbWUgPT09IHRhZ05hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH0sIHRhZ05hbWUpO1xuICAgICAgICAgICAgaWYgKCFpc01hdGNoaW5nVGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBpcyBub3QgYShuKSBcXGAke3RhZ05hbWV9XFxgIGVsZW1lbnRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBtaWRkbGUgcG9pbnQgd2l0aGluIGFuIGVsZW1lbnQgdW5sZXNzIGEgc3BlY2lmaWMgb2Zmc2V0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY2xpY2thYmxlUG9pbnQob2Zmc2V0KSB7XG4gICAgICAgICAgICBjb25zdCBib3ggPSBhd2FpdCB0aGlzLiNjbGlja2FibGVCb3goKTtcbiAgICAgICAgICAgIGlmICghYm94KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb2RlIGlzIGVpdGhlciBub3QgY2xpY2thYmxlIG9yIG5vdCBhbiBFbGVtZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB4OiBib3gueCArIG9mZnNldC54LFxuICAgICAgICAgICAgICAgICAgICB5OiBib3gueSArIG9mZnNldC55LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHg6IGJveC54ICsgYm94LndpZHRoIC8gMixcbiAgICAgICAgICAgICAgICB5OiBib3gueSArIGJveC5oZWlnaHQgLyAyLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2Qgc2Nyb2xscyBlbGVtZW50IGludG8gdmlldyBpZiBuZWVkZWQsIGFuZCB0aGVuXG4gICAgICAgICAqIHVzZXMge0BsaW5rIFBhZ2UubW91c2V9IHRvIGhvdmVyIG92ZXIgdGhlIGNlbnRlciBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICogSWYgdGhlIGVsZW1lbnQgaXMgZGV0YWNoZWQgZnJvbSBET00sIHRoZSBtZXRob2QgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaG92ZXIoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gYXdhaXQgdGhpcy5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkubW91c2UubW92ZSh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2Qgc2Nyb2xscyBlbGVtZW50IGludG8gdmlldyBpZiBuZWVkZWQsIGFuZCB0aGVuXG4gICAgICAgICAqIHVzZXMge0BsaW5rIFBhZ2UubW91c2V9IHRvIGNsaWNrIGluIHRoZSBjZW50ZXIgb2YgdGhlIGVsZW1lbnQuXG4gICAgICAgICAqIElmIHRoZSBlbGVtZW50IGlzIGRldGFjaGVkIGZyb20gRE9NLCB0aGUgbWV0aG9kIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNsaWNrKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQob3B0aW9ucy5vZmZzZXQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkubW91c2UuY2xpY2soeCwgeSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERyYWdzIGFuIGVsZW1lbnQgb3ZlciB0aGUgZ2l2ZW4gZWxlbWVudCBvciBwb2ludC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMgREVQUkVDQVRFRC4gV2hlbiBkcmFnIGludGVyY2VwdGlvbiBpcyBlbmFibGVkLCB0aGUgZHJhZyBwYXlsb2FkIGlzXG4gICAgICAgICAqIHJldHVybmVkLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZHJhZyh0YXJnZXQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZnJhbWUucGFnZSgpO1xuICAgICAgICAgICAgaWYgKHBhZ2UuaXNEcmFnSW50ZXJjZXB0aW9uRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgdGhpcy5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50SGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGF3YWl0IHRhcmdldC5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcGFnZS5tb3VzZS5kcmFnKHNvdXJjZSwgdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWdlLl9pc0RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2UuX2lzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhvdmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UuZG93bigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudEhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0YXJnZXQuaG92ZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UubW92ZSh0YXJnZXQueCwgdGFyZ2V0LnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHBhZ2UuX2lzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZS4gYGRyYWdlbnRlcmAgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHBlcmZvcm1lZCBkdXJpbmcgZHJhZ2dpbmcuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkcmFnRW50ZXIoZGF0YSA9IHsgaXRlbXM6IFtdLCBkcmFnT3BlcmF0aW9uc01hc2s6IDEgfSkge1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZnJhbWUucGFnZSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmNsaWNrYWJsZVBvaW50KCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLm1vdXNlLmRyYWdFbnRlcih0YXJnZXQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlLiBgZHJhZ292ZXJgIHdpbGwgYXV0b21hdGljYWxseSBiZSBwZXJmb3JtZWQgZHVyaW5nIGRyYWdnaW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZHJhZ092ZXIoZGF0YSA9IHsgaXRlbXM6IFtdLCBkcmFnT3BlcmF0aW9uc01hc2s6IDEgfSkge1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IHRoaXMuZnJhbWUucGFnZSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmNsaWNrYWJsZVBvaW50KCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLm1vdXNlLmRyYWdPdmVyKHRhcmdldCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZHJvcChkYXRhT3JFbGVtZW50ID0ge1xuICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgZHJhZ09wZXJhdGlvbnNNYXNrOiAxLFxuICAgICAgICB9KSB7XG4gICAgICAgICAgICBjb25zdCBwYWdlID0gdGhpcy5mcmFtZS5wYWdlKCk7XG4gICAgICAgICAgICBpZiAoJ2l0ZW1zJyBpbiBkYXRhT3JFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBhd2FpdCB0aGlzLmNsaWNrYWJsZVBvaW50KCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5tb3VzZS5kcm9wKGRlc3RpbmF0aW9uLCBkYXRhT3JFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vdGUgaWYgdGhlIHJlc3QgZXJyb3JzLCB3ZSBzdGlsbCB3YW50IGRyYWdnaW5nIG9mZiBiZWNhdXNlIHRoZSBlcnJvcnNcbiAgICAgICAgICAgICAgICAvLyBpcyBtb3N0IGxpa2VseSBzb21ldGhpbmcgaW1wbHlpbmcgdGhlIG1vdXNlIGlzIG5vIGxvbmdlciBkcmFnZ2luZy5cbiAgICAgICAgICAgICAgICBhd2FpdCBkYXRhT3JFbGVtZW50LmRyYWcodGhpcyk7XG4gICAgICAgICAgICAgICAgcGFnZS5faXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UudXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGBFbGVtZW50SGFuZGxlLmRyb3BgIGluc3RlYWQuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkcmFnQW5kRHJvcCh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmZyYW1lLnBhZ2UoKTtcbiAgICAgICAgICAgIGFzc2VydChwYWdlLmlzRHJhZ0ludGVyY2VwdGlvbkVuYWJsZWQoKSwgJ0RyYWcgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCBzdGFydFBvaW50ID0gYXdhaXQgdGhpcy5jbGlja2FibGVQb2ludCgpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0UG9pbnQgPSBhd2FpdCB0YXJnZXQuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubW91c2UuZHJhZ0FuZERyb3Aoc3RhcnRQb2ludCwgdGFyZ2V0UG9pbnQsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmlnZ2VycyBhIGBjaGFuZ2VgIGFuZCBgaW5wdXRgIGV2ZW50IG9uY2UgYWxsIHRoZSBwcm92aWRlZCBvcHRpb25zIGhhdmUgYmVlblxuICAgICAgICAgKiBzZWxlY3RlZC4gSWYgdGhlcmUncyBubyBgPHNlbGVjdD5gIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCwgdGhlIG1ldGhvZFxuICAgICAgICAgKiB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGhhbmRsZS5zZWxlY3QoJ2JsdWUnKTsgLy8gc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgKiBoYW5kbGUuc2VsZWN0KCdyZWQnLCAnZ3JlZW4nLCAnYmx1ZScpOyAvLyBtdWx0aXBsZSBzZWxlY3Rpb25zXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gdmFsdWVzIC0gVmFsdWVzIG9mIG9wdGlvbnMgdG8gc2VsZWN0LiBJZiB0aGUgYDxzZWxlY3Q+YCBoYXMgdGhlXG4gICAgICAgICAqIGBtdWx0aXBsZWAgYXR0cmlidXRlLCBhbGwgdmFsdWVzIGFyZSBjb25zaWRlcmVkLCBvdGhlcndpc2Ugb25seSB0aGUgZmlyc3RcbiAgICAgICAgICogb25lIGlzIHRha2VuIGludG8gYWNjb3VudC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNlbGVjdCguLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGlzU3RyaW5nKHZhbHVlKSwgJ1ZhbHVlcyBtdXN0IGJlIHN0cmluZ3MuIEZvdW5kIHZhbHVlIFwiJyArXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiIG9mIHR5cGUgXCInICtcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ldmFsdWF0ZSgoZWxlbWVudCwgdmFscykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBTZXQodmFscyk7XG4gICAgICAgICAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnQgaXMgbm90IGEgPHNlbGVjdD4gZWxlbWVudC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIGVsZW1lbnQub3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmhhcyhvcHRpb24udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFZhbHVlcy5hZGQob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2YgZWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB2YWx1ZXMuaGFzKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMuYWRkKG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnaW5wdXQnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5zZWxlY3RlZFZhbHVlcy52YWx1ZXMoKV07XG4gICAgICAgICAgICB9LCB2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIG1ldGhvZCBzY3JvbGxzIGVsZW1lbnQgaW50byB2aWV3IGlmIG5lZWRlZCwgYW5kIHRoZW4gdXNlc1xuICAgICAgICAgKiB7QGxpbmsgVG91Y2hzY3JlZW4udGFwfSB0byB0YXAgaW4gdGhlIGNlbnRlciBvZiB0aGUgZWxlbWVudC5cbiAgICAgICAgICogSWYgdGhlIGVsZW1lbnQgaXMgZGV0YWNoZWQgZnJvbSBET00sIHRoZSBtZXRob2QgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdGFwKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLnRvdWNoc2NyZWVuLnRhcCh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyB0b3VjaFN0YXJ0KCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLnRvdWNoc2NyZWVuLnRvdWNoU3RhcnQoeCwgeSk7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgdG91Y2hNb3ZlKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlld0lmTmVlZGVkKCk7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IHRoaXMuY2xpY2thYmxlUG9pbnQoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLnRvdWNoc2NyZWVuLnRvdWNoTW92ZSh4LCB5KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyB0b3VjaEVuZCgpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkudG91Y2hzY3JlZW4udG91Y2hFbmQoKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbHMge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MRWxlbWVudC9mb2N1cyB8IGZvY3VzfSBvbiB0aGUgZWxlbWVudC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZvY3VzKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZvY3VzIG5vbi1IVE1MRWxlbWVudCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvY3VzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGVuIHNlbmRzIGEgYGtleWRvd25gLCBga2V5cHJlc3NgL2BpbnB1dGAsIGFuZFxuICAgICAgICAgKiBga2V5dXBgIGV2ZW50IGZvciBlYWNoIGNoYXJhY3RlciBpbiB0aGUgdGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogVG8gcHJlc3MgYSBzcGVjaWFsIGtleSwgbGlrZSBgQ29udHJvbGAgb3IgYEFycm93RG93bmAsXG4gICAgICAgICAqIHVzZSB7QGxpbmsgRWxlbWVudEhhbmRsZS5wcmVzc30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGF3YWl0IGVsZW1lbnRIYW5kbGUudHlwZSgnSGVsbG8nKTsgLy8gVHlwZXMgaW5zdGFudGx5XG4gICAgICAgICAqIGF3YWl0IGVsZW1lbnRIYW5kbGUudHlwZSgnV29ybGQnLCB7ZGVsYXk6IDEwMH0pOyAvLyBUeXBlcyBzbG93ZXIsIGxpa2UgYSB1c2VyXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBBbiBleGFtcGxlIG9mIHR5cGluZyBpbnRvIGEgdGV4dCBmaWVsZCBhbmQgdGhlbiBzdWJtaXR0aW5nIHRoZSBmb3JtOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBlbGVtZW50SGFuZGxlID0gYXdhaXQgcGFnZS4kKCdpbnB1dCcpO1xuICAgICAgICAgKiBhd2FpdCBlbGVtZW50SGFuZGxlLnR5cGUoJ3NvbWUgdGV4dCcpO1xuICAgICAgICAgKiBhd2FpdCBlbGVtZW50SGFuZGxlLnByZXNzKCdFbnRlcicpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBEZWxheSBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0eXBlKHRleHQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZnJhbWUucGFnZSgpLmtleWJvYXJkLnR5cGUodGV4dCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvY3VzZXMgdGhlIGVsZW1lbnQsIGFuZCB0aGVuIHVzZXMge0BsaW5rIEtleWJvYXJkLmRvd259IGFuZCB7QGxpbmsgS2V5Ym9hcmQudXB9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiBga2V5YCBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgYW5kIG5vIG1vZGlmaWVyIGtleXMgYmVzaWRlcyBgU2hpZnRgXG4gICAgICAgICAqIGFyZSBiZWluZyBoZWxkIGRvd24sIGEgYGtleXByZXNzYC9gaW5wdXRgIGV2ZW50IHdpbGwgYWxzbyBiZSBnZW5lcmF0ZWQuXG4gICAgICAgICAqIFRoZSBgdGV4dGAgb3B0aW9uIGNhbiBiZSBzcGVjaWZpZWQgdG8gZm9yY2UgYW4gaW5wdXQgZXZlbnQgdG8gYmUgZ2VuZXJhdGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5PVEUqKiBNb2RpZmllciBrZXlzIERPIGFmZmVjdCBgZWxlbWVudEhhbmRsZS5wcmVzc2AuIEhvbGRpbmcgZG93biBgU2hpZnRgXG4gICAgICAgICAqIHdpbGwgdHlwZSB0aGUgdGV4dCBpbiB1cHBlciBjYXNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ga2V5IC0gTmFtZSBvZiBrZXkgdG8gcHJlc3MsIHN1Y2ggYXMgYEFycm93TGVmdGAuXG4gICAgICAgICAqIFNlZSB7QGxpbmsgS2V5SW5wdXR9IGZvciBhIGxpc3Qgb2YgYWxsIGtleSBuYW1lcy5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByZXNzKGtleSwgb3B0aW9ucykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mcmFtZS5wYWdlKCkua2V5Ym9hcmQucHJlc3Moa2V5LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyAjY2xpY2thYmxlQm94KCkge1xuICAgICAgICAgICAgY29uc3QgYm94ZXMgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5lbGVtZW50LmdldENsaWVudFJlY3RzKCldLm1hcChyZWN0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgeDogcmVjdC54LCB5OiByZWN0LnksIHdpZHRoOiByZWN0LndpZHRoLCBoZWlnaHQ6IHJlY3QuaGVpZ2h0IH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghYm94ZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy4jaW50ZXJzZWN0Qm91bmRpbmdCb3hlc1dpdGhGcmFtZShib3hlcyk7XG4gICAgICAgICAgICBsZXQgZnJhbWUgPSB0aGlzLmZyYW1lO1xuICAgICAgICAgICAgbGV0IHBhcmVudEZyYW1lO1xuICAgICAgICAgICAgd2hpbGUgKChwYXJlbnRGcmFtZSA9IGZyYW1lPy5wYXJlbnRGcmFtZSgpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8zLCBhd2FpdCBmcmFtZS5mcmFtZUVsZW1lbnQoKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBmcmFtZSB0eXBlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Qm94ID0gYXdhaXQgaGFuZGxlLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxlbWVudCBpcyBub3QgdmlzaWJsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0LCAxMCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChzdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHJlY3QudG9wICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUucGFkZGluZ1RvcCwgMTApICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUuYm9yZGVyVG9wV2lkdGgsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmVudEJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBib3ggb2YgYm94ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJveC54ICs9IHBhcmVudEJveC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYm94LnkgKz0gcGFyZW50Qm94LnRvcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUuI2ludGVyc2VjdEJvdW5kaW5nQm94ZXNXaXRoRnJhbWUoYm94ZXMpO1xuICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IHBhcmVudEZyYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8zKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudl8zLmVycm9yID0gZV8zO1xuICAgICAgICAgICAgICAgICAgICBlbnZfMy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGJveGVzLmZpbmQoYm94ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYm94LndpZHRoID49IDEgJiYgYm94LmhlaWdodCA+PSAxO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWJveCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB4OiBib3gueCxcbiAgICAgICAgICAgICAgICB5OiBib3gueSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGJveC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGJveC53aWR0aCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgI2ludGVyc2VjdEJvdW5kaW5nQm94ZXNXaXRoRnJhbWUoYm94ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZG9jdW1lbnRXaWR0aCwgZG9jdW1lbnRIZWlnaHQgfSA9IGF3YWl0IHRoaXMuZnJhbWVcbiAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudFdpZHRoOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50SGVpZ2h0OiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0Qm91bmRpbmdCb3goYm94LCBkb2N1bWVudFdpZHRoLCBkb2N1bWVudEhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgZWxlbWVudCAocmVsYXRpdmUgdG8gdGhlIG1haW4gZnJhbWUpLFxuICAgICAgICAgKiBvciBgbnVsbGAgaWYgdGhlIGVsZW1lbnQgaXMge0BsaW5rIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtZGlzcGxheS00LyNib3gtZ2VuZXJhdGlvbiB8IG5vdCBwYXJ0IG9mIHRoZSBsYXlvdXR9XG4gICAgICAgICAqIChleGFtcGxlOiBgZGlzcGxheTogbm9uZWApLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYm91bmRpbmdCb3goKSB7XG4gICAgICAgICAgICBjb25zdCBib3ggPSBhd2FpdCB0aGlzLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRWxlbWVudCBpcyBub3QgdmlzaWJsZS5cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgeDogcmVjdC54LCB5OiByZWN0LnksIHdpZHRoOiByZWN0LndpZHRoLCBoZWlnaHQ6IHJlY3QuaGVpZ2h0IH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghYm94KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBhd2FpdCB0aGlzLiNnZXRUb3BMZWZ0Q29ybmVyT2ZGcmFtZSgpO1xuICAgICAgICAgICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgeDogYm94LnggKyBvZmZzZXQueCxcbiAgICAgICAgICAgICAgICB5OiBib3gueSArIG9mZnNldC55LFxuICAgICAgICAgICAgICAgIGhlaWdodDogYm94LmhlaWdodCxcbiAgICAgICAgICAgICAgICB3aWR0aDogYm94LndpZHRoLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBib3hlcyBvZiB0aGUgZWxlbWVudCxcbiAgICAgICAgICogb3IgYG51bGxgIGlmIHRoZSBlbGVtZW50IGlzIHtAbGluayBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLWRpc3BsYXktNC8jYm94LWdlbmVyYXRpb24gfCBub3QgcGFydCBvZiB0aGUgbGF5b3V0fVxuICAgICAgICAgKiAoZXhhbXBsZTogYGRpc3BsYXk6IG5vbmVgKS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogQm94ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIHBvaW50cztcbiAgICAgICAgICogRWFjaCBQb2ludCBpcyBhbiBvYmplY3QgYHt4LCB5fWAuIEJveCBwb2ludHMgYXJlIHNvcnRlZCBjbG9jay13aXNlLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYm94TW9kZWwoKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGlzIG5vdCB2aXNpYmxlLlxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldHMgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0LCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdUb3AsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBwYXJzZUludChzdHlsZS5wYWRkaW5nUmlnaHQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcGFyc2VJbnQoc3R5bGUucGFkZGluZ0JvdHRvbSwgMTApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IC1wYXJzZUludChzdHlsZS5tYXJnaW5MZWZ0LCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IC1wYXJzZUludChzdHlsZS5tYXJnaW5Ub3AsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAtcGFyc2VJbnQoc3R5bGUubWFyZ2luUmlnaHQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogLXBhcnNlSW50KHN0eWxlLm1hcmdpbkJvdHRvbSwgMTApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHBhcnNlSW50KHN0eWxlLmJvcmRlckxlZnQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcGFyc2VJbnQoc3R5bGUuYm9yZGVyVG9wLCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodDogcGFyc2VJbnQoc3R5bGUuYm9yZGVyUmlnaHQsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcGFyc2VJbnQoc3R5bGUuYm9yZGVyQm90dG9tLCAxMCksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXIgPSBbXG4gICAgICAgICAgICAgICAgICAgIHsgeDogcmVjdC5sZWZ0LCB5OiByZWN0LnRvcCB9LFxuICAgICAgICAgICAgICAgICAgICB7IHg6IHJlY3QubGVmdCArIHJlY3Qud2lkdGgsIHk6IHJlY3QudG9wIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCwgeTogcmVjdC50b3AgKyByZWN0LmJvdHRvbSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHg6IHJlY3QubGVmdCwgeTogcmVjdC50b3AgKyByZWN0LmJvdHRvbSB9LFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHRyYW5zZm9ybVF1YWRXaXRoT2Zmc2V0cyhib3JkZXIsIG9mZnNldHMuYm9yZGVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gdHJhbnNmb3JtUXVhZFdpdGhPZmZzZXRzKHBhZGRpbmcsIG9mZnNldHMucGFkZGluZyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFyZ2luID0gdHJhbnNmb3JtUXVhZFdpdGhPZmZzZXRzKGJvcmRlciwgb2Zmc2V0cy5tYXJnaW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcixcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVF1YWRXaXRoT2Zmc2V0cyhxdWFkLCBvZmZzZXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogcXVhZFswXS54ICsgb2Zmc2V0cy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHF1YWRbMF0ueSArIG9mZnNldHMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBxdWFkWzFdLnggLSBvZmZzZXRzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHF1YWRbMV0ueSArIG9mZnNldHMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBxdWFkWzJdLnggLSBvZmZzZXRzLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHF1YWRbMl0ueSAtIG9mZnNldHMuYm90dG9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBxdWFkWzNdLnggKyBvZmZzZXRzLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogcXVhZFszXS55IC0gb2Zmc2V0cy5ib3R0b20sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYXdhaXQgdGhpcy4jZ2V0VG9wTGVmdENvcm5lck9mRnJhbWUoKTtcbiAgICAgICAgICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBbXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICdwYWRkaW5nJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyJyxcbiAgICAgICAgICAgICAgICAnbWFyZ2luJyxcbiAgICAgICAgICAgIF0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIG1vZGVsW2F0dHJpYnV0ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQueCArPSBvZmZzZXQueDtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQueSArPSBvZmZzZXQueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgI2dldFRvcExlZnRDb3JuZXJPZkZyYW1lKCkge1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICAgICAgICAgIGxldCBmcmFtZSA9IHRoaXMuZnJhbWU7XG4gICAgICAgICAgICBsZXQgcGFyZW50RnJhbWU7XG4gICAgICAgICAgICB3aGlsZSAoKHBhcmVudEZyYW1lID0gZnJhbWU/LnBhcmVudEZyYW1lKCkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52XzQgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzQsIGF3YWl0IGZyYW1lLmZyYW1lRWxlbWVudCgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGZyYW1lIHR5cGUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRCb3ggPSBhd2FpdCBoYW5kbGUuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGlzIG5vdCB2aXNpYmxlLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogcmVjdC5sZWZ0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQsIDEwKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHN0eWxlLmJvcmRlckxlZnRXaWR0aCwgMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogcmVjdC50b3AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChzdHlsZS5wYWRkaW5nVG9wLCAxMCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChzdHlsZS5ib3JkZXJUb3BXaWR0aCwgMTApLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50Qm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwb2ludC54ICs9IHBhcmVudEJveC5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICBwb2ludC55ICs9IHBhcmVudEJveC50b3A7XG4gICAgICAgICAgICAgICAgICAgIGZyYW1lID0gcGFyZW50RnJhbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzQpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52XzQuZXJyb3IgPSBlXzQ7XG4gICAgICAgICAgICAgICAgICAgIGVudl80Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBvaW50O1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHNjcmVlbnNob3Qob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHNjcm9sbEludG9WaWV3ID0gdHJ1ZSwgY2xpcCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLmZyYW1lLnBhZ2UoKTtcbiAgICAgICAgICAgIC8vIE9ubHkgc2Nyb2xsIHRoZSBlbGVtZW50IGludG8gdmlldyBpZiB0aGUgdXNlciB3YW50cyBpdC5cbiAgICAgICAgICAgIGlmIChzY3JvbGxJbnRvVmlldykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZWxlbWVudENsaXAgPSBhd2FpdCB0aGlzLiNub25FbXB0eVZpc2libGVCb3VuZGluZ0JveCgpO1xuICAgICAgICAgICAgY29uc3QgW3BhZ2VMZWZ0LCBwYWdlVG9wXSA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghd2luZG93LnZpc3VhbFZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2luZG93LnZpc3VhbFZpZXdwb3J0IGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy52aXN1YWxWaWV3cG9ydC5wYWdlTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnZpc3VhbFZpZXdwb3J0LnBhZ2VUb3AsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxlbWVudENsaXAueCArPSBwYWdlTGVmdDtcbiAgICAgICAgICAgIGVsZW1lbnRDbGlwLnkgKz0gcGFnZVRvcDtcbiAgICAgICAgICAgIGlmIChjbGlwKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAueCArPSBjbGlwLng7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAueSArPSBjbGlwLnk7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAuaGVpZ2h0ID0gY2xpcC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgZWxlbWVudENsaXAud2lkdGggPSBjbGlwLndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHBhZ2Uuc2NyZWVuc2hvdCh7IC4uLm9wdGlvbnMsIGNsaXA6IGVsZW1lbnRDbGlwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jICNub25FbXB0eVZpc2libGVCb3VuZGluZ0JveCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGF3YWl0IHRoaXMuYm91bmRpbmdCb3goKTtcbiAgICAgICAgICAgIGFzc2VydChib3gsICdOb2RlIGlzIGVpdGhlciBub3QgdmlzaWJsZSBvciBub3QgYW4gSFRNTEVsZW1lbnQnKTtcbiAgICAgICAgICAgIGFzc2VydChib3gud2lkdGggIT09IDAsICdOb2RlIGhhcyAwIHdpZHRoLicpO1xuICAgICAgICAgICAgYXNzZXJ0KGJveC5oZWlnaHQgIT09IDAsICdOb2RlIGhhcyAwIGhlaWdodC4nKTtcbiAgICAgICAgICAgIHJldHVybiBib3g7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXJ0Q29ubmVjdGVkRWxlbWVudCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShhc3luYyAoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05vZGUgaXMgZGV0YWNoZWQgZnJvbSBkb2N1bWVudCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05vZGUgaXMgbm90IG9mIHR5cGUgSFRNTEVsZW1lbnQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpIHtcbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmlzSW50ZXJzZWN0aW5nVmlld3BvcnQoe1xuICAgICAgICAgICAgICAgIHRocmVzaG9sZDogMSxcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gdGhlIGN1cnJlbnQgdmlld3BvcnQuIElmIGFuXG4gICAgICAgICAqIGVsZW1lbnQgaXMgYW4gU1ZHLCB3ZSBjaGVjayBpZiB0aGUgc3ZnIG93bmVyIGVsZW1lbnQgaXMgaW4gdGhlIHZpZXdwb3J0XG4gICAgICAgICAqIGluc3RlYWQuIFNlZSBodHRwczovL2NyYnVnLmNvbS85NjMyNDYuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhyZXNob2xkIGZvciB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gMCAobm8gaW50ZXJzZWN0aW9uKSBhbmQgMVxuICAgICAgICAgKiAoZnVsbCBpbnRlcnNlY3Rpb24pLiBEZWZhdWx0cyB0byAxLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXNJbnRlcnNlY3RpbmdWaWV3cG9ydChvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl81ID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFzc2VydENvbm5lY3RlZEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnVsZXNkaXIvdXNlLXVzaW5nIC0tIFJldHVybnMgYHRoaXNgLlxuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IGF3YWl0IHRoaXMuI2FzU1ZHRWxlbWVudEhhbmRsZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl81LCBoYW5kbGUgJiYgKGF3YWl0IGhhbmRsZS4jZ2V0T3duZXJTVkdFbGVtZW50KCkpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0ICh0YXJnZXQgPz8gdGhpcykuZXZhbHVhdGUoYXN5bmMgKGVsZW1lbnQsIHRocmVzaG9sZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXNpYmxlUmF0aW8gPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZW50cmllc1swXS5pbnRlcnNlY3Rpb25SYXRpbyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZCA9PT0gMSA/IHZpc2libGVSYXRpbyA9PT0gMSA6IHZpc2libGVSYXRpbyA+IHRocmVzaG9sZDtcbiAgICAgICAgICAgICAgICB9LCBvcHRpb25zLnRocmVzaG9sZCA/PyAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzUpIHtcbiAgICAgICAgICAgICAgICBlbnZfNS5lcnJvciA9IGVfNTtcbiAgICAgICAgICAgICAgICBlbnZfNS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTY3JvbGxzIHRoZSBlbGVtZW50IGludG8gdmlldyB1c2luZyBlaXRoZXIgdGhlIGF1dG9tYXRpb24gcHJvdG9jb2wgY2xpZW50XG4gICAgICAgICAqIG9yIGJ5IGNhbGxpbmcgZWxlbWVudC5zY3JvbGxJbnRvVmlldy5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNjcm9sbEludG9WaWV3KCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5hc3NlcnRDb25uZWN0ZWRFbGVtZW50KCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGFzeW5jIChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW4gZWxlbWVudCBpcyBhbiBTVkdFbGVtZW50IChpbmNsdWRlZCBzdmcsIHBhdGgsIHJlY3RcbiAgICAgICAgICogZXRjLikuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAjYXNTVkdFbGVtZW50SGFuZGxlKCkge1xuICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBTVkdFbGVtZW50O1xuICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jICNnZXRPd25lclNWR0VsZW1lbnQoKSB7XG4gICAgICAgICAgICAvLyBTVkdTVkdFbGVtZW50Lm93bmVyU1ZHRWxlbWVudCA9PT0gbnVsbC5cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV2YWx1YXRlSGFuZGxlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU1ZHU1ZHRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQub3duZXJTVkdFbGVtZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IEVsZW1lbnRIYW5kbGUgfTtcbmZ1bmN0aW9uIGludGVyc2VjdEJvdW5kaW5nQm94KGJveCwgd2lkdGgsIGhlaWdodCkge1xuICAgIGJveC53aWR0aCA9IE1hdGgubWF4KGJveC54ID49IDBcbiAgICAgICAgPyBNYXRoLm1pbih3aWR0aCAtIGJveC54LCBib3gud2lkdGgpXG4gICAgICAgIDogTWF0aC5taW4od2lkdGgsIGJveC53aWR0aCArIGJveC54KSwgMCk7XG4gICAgYm94LmhlaWdodCA9IE1hdGgubWF4KGJveC55ID49IDBcbiAgICAgICAgPyBNYXRoLm1pbihoZWlnaHQgLSBib3gueSwgYm94LmhlaWdodClcbiAgICAgICAgOiBNYXRoLm1pbihoZWlnaHQsIGJveC5oZWlnaHQgKyBib3gueSksIDApO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RWxlbWVudEhhbmRsZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IF9pc0VsZW1lbnRIYW5kbGUgPSBTeW1ib2woJ19pc0VsZW1lbnRIYW5kbGUnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVsZW1lbnRIYW5kbGVTeW1ib2wuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVudmlyb25tZW50LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG52YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvciB9IGZyb20gJy4uL2NvbW1vbi9HZXRRdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgdHJhbnNwb3NlSXRlcmFibGVIYW5kbGUgfSBmcm9tICcuLi9jb21tb24vSGFuZGxlSXRlcmF0b3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0RlNQcm9taXNlcywgd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyB0aHJvd0lmRGlzcG9zZWQgfSBmcm9tICcuLi91dGlsL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25Mb2NhdG9yLCBOb2RlTG9jYXRvciwgfSBmcm9tICcuL2xvY2F0b3JzL2xvY2F0b3JzLmpzJztcbi8qKlxuICogV2UgdXNlIHN5bWJvbHMgdG8gcHJldmVudCBleHRlcm5hbCBwYXJ0aWVzIGxpc3RlbmluZyB0byB0aGVzZSBldmVudHMuXG4gKiBUaGV5IGFyZSBpbnRlcm5hbCB0byBQdXBwZXRlZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIEZyYW1lRXZlbnQ7XG4oZnVuY3Rpb24gKEZyYW1lRXZlbnQpIHtcbiAgICBGcmFtZUV2ZW50LkZyYW1lTmF2aWdhdGVkID0gU3ltYm9sKCdGcmFtZS5GcmFtZU5hdmlnYXRlZCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkID0gU3ltYm9sKCdGcmFtZS5GcmFtZVN3YXBwZWQnKTtcbiAgICBGcmFtZUV2ZW50LkxpZmVjeWNsZUV2ZW50ID0gU3ltYm9sKCdGcmFtZS5MaWZlY3ljbGVFdmVudCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCA9IFN5bWJvbCgnRnJhbWUuRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVEZXRhY2hlZCA9IFN5bWJvbCgnRnJhbWUuRnJhbWVEZXRhY2hlZCcpO1xuICAgIEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkQnlBY3RpdmF0aW9uID0gU3ltYm9sKCdGcmFtZS5GcmFtZVN3YXBwZWRCeUFjdGl2YXRpb24nKTtcbn0pKEZyYW1lRXZlbnQgfHwgKEZyYW1lRXZlbnQgPSB7fSkpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHRocm93SWZEZXRhY2hlZCA9IHRocm93SWZEaXNwb3NlZChmcmFtZSA9PiB7XG4gICAgcmV0dXJuIGBBdHRlbXB0ZWQgdG8gdXNlIGRldGFjaGVkIEZyYW1lICcke2ZyYW1lLl9pZH0nLmA7XG59KTtcbi8qKlxuICogUmVwcmVzZW50cyBhIERPTSBmcmFtZS5cbiAqXG4gKiBUbyB1bmRlcnN0YW5kIGZyYW1lcywgeW91IGNhbiB0aGluayBvZiBmcmFtZXMgYXMgYDxpZnJhbWU+YCBlbGVtZW50cy4gSnVzdFxuICogbGlrZSBpZnJhbWVzLCBmcmFtZXMgY2FuIGJlIG5lc3RlZCwgYW5kIHdoZW4gSmF2YVNjcmlwdCBpcyBleGVjdXRlZCBpbiBhXG4gKiBmcmFtZSwgdGhlIEphdmFTY3JpcHQgZG9lcyBub3QgZWZmZWN0IGZyYW1lcyBpbnNpZGUgdGhlIGFtYmllbnQgZnJhbWUgdGhlXG4gKiBKYXZhU2NyaXB0IGV4ZWN1dGVzIGluLlxuICpcbiAqIEBleGFtcGxlXG4gKiBBdCBhbnkgcG9pbnQgaW4gdGltZSwge0BsaW5rIFBhZ2UgfCBwYWdlc30gZXhwb3NlIHRoZWlyIGN1cnJlbnQgZnJhbWVcbiAqIHRyZWUgdmlhIHRoZSB7QGxpbmsgUGFnZS5tYWluRnJhbWV9IGFuZCB7QGxpbmsgRnJhbWUuY2hpbGRGcmFtZXN9IG1ldGhvZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIEFuIGV4YW1wbGUgb2YgZHVtcGluZyBmcmFtZSB0cmVlOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gKlxuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20vY2hyb21lL2Jyb3dzZXIvY2FuYXJ5Lmh0bWwnKTtcbiAqICAgZHVtcEZyYW1lVHJlZShwYWdlLm1haW5GcmFtZSgpLCAnJyk7XG4gKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqXG4gKiAgIGZ1bmN0aW9uIGR1bXBGcmFtZVRyZWUoZnJhbWUsIGluZGVudCkge1xuICogICAgIGNvbnNvbGUubG9nKGluZGVudCArIGZyYW1lLnVybCgpKTtcbiAqICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZyYW1lLmNoaWxkRnJhbWVzKCkpIHtcbiAqICAgICAgIGR1bXBGcmFtZVRyZWUoY2hpbGQsIGluZGVudCArICcgICcpO1xuICogICAgIH1cbiAqICAgfVxuICogfSkoKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBBbiBleGFtcGxlIG9mIGdldHRpbmcgdGV4dCBmcm9tIGFuIGlmcmFtZSBlbGVtZW50OlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBmcmFtZSA9IHBhZ2UuZnJhbWVzKCkuZmluZChmcmFtZSA9PiBmcmFtZS5uYW1lKCkgPT09ICdteWZyYW1lJyk7XG4gKiBjb25zdCB0ZXh0ID0gYXdhaXQgZnJhbWUuJGV2YWwoJy5zZWxlY3RvcicsIGVsZW1lbnQgPT4gZWxlbWVudC50ZXh0Q29udGVudCk7XG4gKiBjb25zb2xlLmxvZyh0ZXh0KTtcbiAqIGBgYFxuICpcbiAqIEByZW1hcmtzXG4gKiBGcmFtZSBsaWZlY3ljbGVzIGFyZSBjb250cm9sbGVkIGJ5IHRocmVlIGV2ZW50cyB0aGF0IGFyZSBhbGwgZGlzcGF0Y2hlZCBvblxuICogdGhlIHBhcmVudCB7QGxpbmsgRnJhbWUucGFnZSB8IHBhZ2V9OlxuICpcbiAqIC0ge0BsaW5rIFBhZ2VFdmVudC5GcmFtZUF0dGFjaGVkfVxuICogLSB7QGxpbmsgUGFnZUV2ZW50LkZyYW1lTmF2aWdhdGVkfVxuICogLSB7QGxpbmsgUGFnZUV2ZW50LkZyYW1lRGV0YWNoZWR9XG4gKlxuICogQHB1YmxpY1xuICovXG5sZXQgRnJhbWUgPSAoKCkgPT4ge1xuICAgIGxldCBfY2xhc3NTdXBlciA9IEV2ZW50RW1pdHRlcjtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX2ZyYW1lRWxlbWVudF9kZWNvcmF0b3JzO1xuICAgIGxldCBfZXZhbHVhdGVIYW5kbGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX2V2YWx1YXRlX2RlY29yYXRvcnM7XG4gICAgbGV0IF9sb2NhdG9yX2RlY29yYXRvcnM7XG4gICAgbGV0IF8kX2RlY29yYXRvcnM7XG4gICAgbGV0IF8kJF9kZWNvcmF0b3JzO1xuICAgIGxldCBfJGV2YWxfZGVjb3JhdG9ycztcbiAgICBsZXQgXyQkZXZhbF9kZWNvcmF0b3JzO1xuICAgIGxldCBfd2FpdEZvclNlbGVjdG9yX2RlY29yYXRvcnM7XG4gICAgbGV0IF93YWl0Rm9yRnVuY3Rpb25fZGVjb3JhdG9ycztcbiAgICBsZXQgX2NvbnRlbnRfZGVjb3JhdG9ycztcbiAgICBsZXQgX2FkZFNjcmlwdFRhZ19kZWNvcmF0b3JzO1xuICAgIGxldCBfYWRkU3R5bGVUYWdfZGVjb3JhdG9ycztcbiAgICBsZXQgX2NsaWNrX2RlY29yYXRvcnM7XG4gICAgbGV0IF9mb2N1c19kZWNvcmF0b3JzO1xuICAgIGxldCBfaG92ZXJfZGVjb3JhdG9ycztcbiAgICBsZXQgX3NlbGVjdF9kZWNvcmF0b3JzO1xuICAgIGxldCBfdGFwX2RlY29yYXRvcnM7XG4gICAgbGV0IF90eXBlX2RlY29yYXRvcnM7XG4gICAgbGV0IF90aXRsZV9kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBGcmFtZSBleHRlbmRzIF9jbGFzc1N1cGVyIHtcbiAgICAgICAgc3RhdGljIHtcbiAgICAgICAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7XG4gICAgICAgICAgICBfZnJhbWVFbGVtZW50X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9ldmFsdWF0ZUhhbmRsZV9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfZXZhbHVhdGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX2xvY2F0b3JfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgXyRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgXyQkX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF8kZXZhbF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfJCRldmFsX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF93YWl0Rm9yU2VsZWN0b3JfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX3dhaXRGb3JGdW5jdGlvbl9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfY29udGVudF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfYWRkU2NyaXB0VGFnX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9hZGRTdHlsZVRhZ19kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfY2xpY2tfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX2ZvY3VzX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9ob3Zlcl9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF07XG4gICAgICAgICAgICBfc2VsZWN0X2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF90YXBfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX3R5cGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdO1xuICAgICAgICAgICAgX3RpdGxlX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZnJhbWVFbGVtZW50X2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJmcmFtZUVsZW1lbnRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImZyYW1lRWxlbWVudFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmZyYW1lRWxlbWVudCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZXZhbHVhdGVIYW5kbGVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImV2YWx1YXRlSGFuZGxlXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJldmFsdWF0ZUhhbmRsZVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmV2YWx1YXRlSGFuZGxlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9ldmFsdWF0ZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZXZhbHVhdGVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImV2YWx1YXRlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZXZhbHVhdGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2xvY2F0b3JfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImxvY2F0b3JcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImxvY2F0b3JcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5sb2NhdG9yIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF8kX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIkXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCIkXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouJCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfJCRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiQkXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCIkJFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiQkIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF8kZXZhbF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiJGV2YWxcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIiRldmFsXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouJGV2YWwgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgXyQkZXZhbF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiJCRldmFsXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCIkJGV2YWxcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai4kJGV2YWwgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JTZWxlY3Rvcl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwid2FpdEZvclNlbGVjdG9yXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ3YWl0Rm9yU2VsZWN0b3JcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yU2VsZWN0b3IgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JGdW5jdGlvbl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwid2FpdEZvckZ1bmN0aW9uXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ3YWl0Rm9yRnVuY3Rpb25cIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yRnVuY3Rpb24gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2NvbnRlbnRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImNvbnRlbnRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImNvbnRlbnRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5jb250ZW50IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9hZGRTY3JpcHRUYWdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImFkZFNjcmlwdFRhZ1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiYWRkU2NyaXB0VGFnXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYWRkU2NyaXB0VGFnIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9hZGRTdHlsZVRhZ19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiYWRkU3R5bGVUYWdcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImFkZFN0eWxlVGFnXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYWRkU3R5bGVUYWcgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2NsaWNrX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJjbGlja1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiY2xpY2tcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5jbGljayB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZm9jdXNfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImZvY3VzXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJmb2N1c1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmZvY3VzIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9ob3Zlcl9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiaG92ZXJcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImhvdmVyXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouaG92ZXIgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3NlbGVjdF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2VsZWN0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzZWxlY3RcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5zZWxlY3QgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3RhcF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidGFwXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ0YXBcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50YXAgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3R5cGVfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInR5cGVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInR5cGVcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai50eXBlIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF90aXRsZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwidGl0bGVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcInRpdGxlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudGl0bGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX2lkID0gX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBfcGFyZW50SWQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIF9uYW1lO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBfaGFzU3RhcnRlZExvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBzdXBlcigpO1xuICAgICAgICB9XG4gICAgICAgICNfZG9jdW1lbnQ7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgICNkb2N1bWVudCgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy4jX2RvY3VtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jX2RvY3VtZW50ID0gdGhpcy5tYWluUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNfZG9jdW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY2xlYXIgdGhlIGRvY3VtZW50IGhhbmRsZSB0aGF0IGhhcyBiZWVuIGRlc3Ryb3llZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBjbGVhckRvY3VtZW50SGFuZGxlKCkge1xuICAgICAgICAgICAgdGhpcy4jX2RvY3VtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgZnJhbWUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmcmFtZSAoaWYgYW55KS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZyYW1lRWxlbWVudCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRGcmFtZSA9IHRoaXMucGFyZW50RnJhbWUoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHBhcmVudEZyYW1lLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUsZnJhbWUnKTtcbiAgICAgICAgICAgICAgICB9KSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgaWZyYW1lXzEgb2YgdHJhbnNwb3NlSXRlcmFibGVIYW5kbGUobGlzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52XzIgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMiwgaWZyYW1lXzEsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1lID0gYXdhaXQgaWZyYW1lLmNvbnRlbnRGcmFtZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lPy5faWQgPT09IHRoaXMuX2lkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlmcmFtZS5tb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVfMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgICAgIGVudl8xLmVycm9yID0gZV8yO1xuICAgICAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJlaGF2ZXMgaWRlbnRpY2FsbHkgdG8ge0BsaW5rIFBhZ2UuZXZhbHVhdGVIYW5kbGV9IGV4Y2VwdCBpdCdzIHJ1biB3aXRoaW5cbiAgICAgICAgICogdGhlIGNvbnRleHQgb2YgdGhpcyBmcmFtZS5cbiAgICAgICAgICpcbiAgICAgICAgICogU2VlIHtAbGluayBQYWdlLmV2YWx1YXRlSGFuZGxlfSBmb3IgZGV0YWlscy5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICAgICAgcGFnZUZ1bmN0aW9uID0gd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSh0aGlzLmV2YWx1YXRlSGFuZGxlLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCZWhhdmVzIGlkZW50aWNhbGx5IHRvIHtAbGluayBQYWdlLmV2YWx1YXRlfSBleGNlcHQgaXQncyBydW4gd2l0aGluXG4gICAgICAgICAqIHRoZSBjb250ZXh0IG9mIHRoaXMgZnJhbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFNlZSB7QGxpbmsgUGFnZS5ldmFsdWF0ZX0gZm9yIGRldGFpbHMuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBldmFsdWF0ZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy5ldmFsdWF0ZS5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpblJlYWxtKCkuZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBsb2NhdG9yKHNlbGVjdG9yT3JGdW5jKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNlbGVjdG9yT3JGdW5jID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBOb2RlTG9jYXRvci5jcmVhdGUodGhpcywgc2VsZWN0b3JPckZ1bmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uTG9jYXRvci5jcmVhdGUodGhpcywgc2VsZWN0b3JPckZ1bmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBRdWVyaWVzIHRoZSBmcmFtZSBmb3IgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIEEge0BsaW5rIEVsZW1lbnRIYW5kbGUgfCBlbGVtZW50IGhhbmRsZX0gdG8gdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgICAgICogbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLiBPdGhlcndpc2UsIGBudWxsYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBydWxlc2Rpci91c2UtdXNpbmcgLS0gVGhpcyBpcyBjYWNoZWQuXG4gICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IGF3YWl0IHRoaXMuI2RvY3VtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZG9jdW1lbnQuJChzZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFF1ZXJpZXMgdGhlIGZyYW1lIGZvciBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjc2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHF1ZXJ5IHBhZ2UgZm9yLlxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBDU1Mgc2VsZWN0b3JzfVxuICAgICAgICAgKiBjYW4gYmUgcGFzc2VkIGFzLWlzIGFuZCBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNub24tY3NzLXNlbGVjdG9ycyB8IFB1cHBldGVlci1zcGVjaWZpYyBzZWxlY3RvciBzeW50YXh9XG4gICAgICAgICAqIGFsbG93cyBxdWVyaW5nIGJ5XG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN0ZXh0LXNlbGVjdG9ycy0tcC10ZXh0IHwgdGV4dH0sXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNhcmlhLXNlbGVjdG9ycy0tcC1hcmlhIHwgYTExeSByb2xlIGFuZCBuYW1lfSxcbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyN4cGF0aC1zZWxlY3RvcnMtLXAteHBhdGggfCB4cGF0aH1cbiAgICAgICAgICogYW5kXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNxdWVyeWluZy1lbGVtZW50cy1pbi1zaGFkb3ctZG9tIHwgY29tYmluaW5nIHRoZXNlIHF1ZXJpZXMgYWNyb3NzIHNoYWRvdyByb290c30uXG4gICAgICAgICAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSB0aGUgc2VsZWN0b3IgdHlwZSB1c2luZyBhXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNwcmVmaXhlZC1zZWxlY3Rvci1zeW50YXggfCBwcmVmaXh9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB7QGxpbmsgRWxlbWVudEhhbmRsZSB8IGVsZW1lbnQgaGFuZGxlc30gdGhhdCBwb2ludCB0b1xuICAgICAgICAgKiBlbGVtZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyAkJChzZWxlY3Rvciwgb3B0aW9ucykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ1bGVzZGlyL3VzZS11c2luZyAtLSBUaGlzIGlzIGNhY2hlZC5cbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gYXdhaXQgdGhpcy4jZG9jdW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkb2N1bWVudC4kJChzZWxlY3Rvciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJ1bnMgdGhlIGdpdmVuIGZ1bmN0aW9uIG9uIHRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciBpblxuICAgICAgICAgKiB0aGUgZnJhbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBnaXZlbiBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdGlsbFxuICAgICAgICAgKiB0aGUgcHJvbWlzZSByZXNvbHZlcy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VhcmNoVmFsdWUgPSBhd2FpdCBmcmFtZS4kZXZhbCgnI3NlYXJjaCcsIGVsID0+IGVsLnZhbHVlKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBmcmFtZSdzIGNvbnRleHQuXG4gICAgICAgICAqIFRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvciB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gYXNcbiAgICAgICAgICogaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICRldmFsKHNlbGVjdG9yLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy4kZXZhbC5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJ1bGVzZGlyL3VzZS11c2luZyAtLSBUaGlzIGlzIGNhY2hlZC5cbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gYXdhaXQgdGhpcy4jZG9jdW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkb2N1bWVudC4kZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yXG4gICAgICAgICAqIGluIHRoZSBmcmFtZS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGdpdmVuIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgd2FpdCB0aWxsXG4gICAgICAgICAqIHRoZSBwcm9taXNlIHJlc29sdmVzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBkaXZzQ291bnRzID0gYXdhaXQgZnJhbWUuJCRldmFsKCdkaXYnLCBkaXZzID0+IGRpdnMubGVuZ3RoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBmcmFtZSdzIGNvbnRleHQuXG4gICAgICAgICAqIEFuIGFycmF5IG9mIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciB3aWxsIGJlIHBhc3NlZCB0byB0aGVcbiAgICAgICAgICogZnVuY3Rpb24gYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuJCRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnVsZXNkaXIvdXNlLXVzaW5nIC0tIFRoaXMgaXMgY2FjaGVkLlxuICAgICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBhd2FpdCB0aGlzLiNkb2N1bWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRvY3VtZW50LiQkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdHMgZm9yIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIHRvIGFwcGVhciBpbiB0aGUgZnJhbWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHdvcmtzIGFjcm9zcyBuYXZpZ2F0aW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKlxuICAgICAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgKiAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gICAgICAgICAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICAgKiAgIGxldCBjdXJyZW50VVJMO1xuICAgICAgICAgKiAgIHBhZ2VcbiAgICAgICAgICogICAgIC5tYWluRnJhbWUoKVxuICAgICAgICAgKiAgICAgLndhaXRGb3JTZWxlY3RvcignaW1nJylcbiAgICAgICAgICogICAgIC50aGVuKCgpID0+IGNvbnNvbGUubG9nKCdGaXJzdCBVUkwgd2l0aCBpbWFnZTogJyArIGN1cnJlbnRVUkwpKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICBmb3IgKGN1cnJlbnRVUkwgb2YgW1xuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZ29vZ2xlLmNvbScsXG4gICAgICAgICAqICAgICAnaHR0cHM6Ly9iYmMuY29tJyxcbiAgICAgICAgICogICBdKSB7XG4gICAgICAgICAqICAgICBhd2FpdCBwYWdlLmdvdG8oY3VycmVudFVSTCk7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIFRoZSBzZWxlY3RvciB0byBxdWVyeSBhbmQgd2FpdCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgY3VzdG9taXppbmcgd2FpdGluZyBiZWhhdmlvci5cbiAgICAgICAgICogQHJldHVybnMgQW4gZWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gICAgICAgICAqIEB0aHJvd3MgVGhyb3dzIGlmIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGRvZXNuJ3QgYXBwZWFyLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FpdEZvclNlbGVjdG9yKHNlbGVjdG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdXBkYXRlZFNlbGVjdG9yLCBRdWVyeUhhbmRsZXIsIHBvbGxpbmcgfSA9IGdldFF1ZXJ5SGFuZGxlckFuZFNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHJldHVybiAoYXdhaXQgUXVlcnlIYW5kbGVyLndhaXRGb3IodGhpcywgdXBkYXRlZFNlbGVjdG9yLCB7XG4gICAgICAgICAgICAgICAgcG9sbGluZyxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBUaGUgYHdhaXRGb3JGdW5jdGlvbmAgY2FuIGJlIHVzZWQgdG8gb2JzZXJ2ZSB2aWV3cG9ydCBzaXplIGNoYW5nZTpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKlxuICAgICAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgKiAuICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICAgICAgICAgKiAuICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgICAgICAqIC4gIGNvbnN0IHdhdGNoRG9nID0gcGFnZS5tYWluRnJhbWUoKS53YWl0Rm9yRnVuY3Rpb24oJ3dpbmRvdy5pbm5lcldpZHRoIDwgMTAwJyk7XG4gICAgICAgICAqIC4gIHBhZ2Uuc2V0Vmlld3BvcnQoe3dpZHRoOiA1MCwgaGVpZ2h0OiA1MH0pO1xuICAgICAgICAgKiAuICBhd2FpdCB3YXRjaERvZztcbiAgICAgICAgICogLiAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICAgICAgICAgKiB9KSgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogVG8gcGFzcyBhcmd1bWVudHMgZnJvbSBOb2RlLmpzIHRvIHRoZSBwcmVkaWNhdGUgb2YgYHBhZ2Uud2FpdEZvckZ1bmN0aW9uYCBmdW5jdGlvbjpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VsZWN0b3IgPSAnLmZvbyc7XG4gICAgICAgICAqIGF3YWl0IGZyYW1lLndhaXRGb3JGdW5jdGlvbihcbiAgICAgICAgICogICBzZWxlY3RvciA9PiAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLFxuICAgICAgICAgKiAgIHt9LCAvLyBlbXB0eSBvcHRpb25zIG9iamVjdFxuICAgICAgICAgKiAgIHNlbGVjdG9yXG4gICAgICAgICAqICk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gcGFnZUZ1bmN0aW9uIC0gdGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIGluIHRoZSBmcmFtZSBjb250ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBwb2xsaW5nIG1ldGhvZCBhbmQgdGltZW91dC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEByZXR1cm5zIHRoZSBwcm9taXNlIHdoaWNoIHJlc29sdmUgd2hlbiB0aGUgYHBhZ2VGdW5jdGlvbmAgcmV0dXJucyBhIHRydXRoeSB2YWx1ZS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhaXRGb3JGdW5jdGlvbihwYWdlRnVuY3Rpb24sIG9wdGlvbnMgPSB7fSwgLi4uYXJncykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpblJlYWxtKCkud2FpdEZvckZ1bmN0aW9uKHBhZ2VGdW5jdGlvbiwgb3B0aW9ucywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBmdWxsIEhUTUwgY29udGVudHMgb2YgdGhlIGZyYW1lLCBpbmNsdWRpbmcgdGhlIERPQ1RZUEUuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjb250ZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXZhbHVhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gJyc7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIGRvY3VtZW50LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNldEZyYW1lQ29udGVudChjb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ldmFsdWF0ZShodG1sID0+IHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5vcGVuKCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoaHRtbCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuY2xvc2UoKTtcbiAgICAgICAgICAgIH0sIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZnJhbWUncyBgbmFtZWAgYXR0cmlidXRlIGFzIHNwZWNpZmllZCBpbiB0aGUgdGFnLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiB0aGUgbmFtZSBpcyBlbXB0eSwgaXQgcmV0dXJucyB0aGUgYGlkYCBhdHRyaWJ1dGUgaW5zdGVhZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBjYWxjdWxhdGVkIG9uY2Ugd2hlbiB0aGUgZnJhbWUgaXMgY3JlYXRlZCwgYW5kIHdpbGwgbm90XG4gICAgICAgICAqIHVwZGF0ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGNoYW5nZWQgbGF0ZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBkZXByZWNhdGVkIFVzZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBlbGVtZW50ID0gYXdhaXQgZnJhbWUuZnJhbWVFbGVtZW50KCk7XG4gICAgICAgICAqIGNvbnN0IG5hbWVPcklkID0gYXdhaXQgZWxlbWVudC5ldmFsdWF0ZShmcmFtZSA9PiBmcmFtZS5uYW1lID8/IGZyYW1lLmlkKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBuYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25hbWUgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzYHRydWVgIGlmIHRoZSBmcmFtZSBoYXMgYmVlbiBkZXRhY2hlZC4gT3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGBkZXRhY2hlZGAgZ2V0dGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgaXNEZXRhY2hlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGRzIGEgYDxzY3JpcHQ+YCB0YWcgaW50byB0aGUgcGFnZSB3aXRoIHRoZSBkZXNpcmVkIHVybCBvciBjb250ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBzY3JpcHQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIHtAbGluayBFbGVtZW50SGFuZGxlIHwgZWxlbWVudCBoYW5kbGV9IHRvIHRoZSBpbmplY3RlZFxuICAgICAgICAgKiBgPHNjcmlwdD5gIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhZGRTY3JpcHRUYWcob3B0aW9ucykge1xuICAgICAgICAgICAgbGV0IHsgY29udGVudCA9ICcnLCB0eXBlIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgeyBwYXRoIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgaWYgKCshIW9wdGlvbnMudXJsICsgKyEhcGF0aCArICshIWNvbnRlbnQgIT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4YWN0bHkgb25lIG9mIGB1cmxgLCBgcGF0aGAsIG9yIGBjb250ZW50YCBtdXN0IGJlIHNwZWNpZmllZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXRoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnRGU1Byb21pc2VzKCk7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgICAgICAgY29udGVudCArPSBgLy8jIHNvdXJjZVVSTD0ke3BhdGgucmVwbGFjZSgvXFxuL2csICcnKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHlwZSA9IHR5cGUgPz8gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluUmVhbG0oKS50cmFuc2ZlckhhbmRsZShhd2FpdCB0aGlzLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZShhc3luYyAoeyB1cmwsIGlkLCB0eXBlLCBjb250ZW50IH0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICBzY3JpcHQudGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXZlbnQubWVzc2FnZSA/PyAnQ291bGQgbm90IGxvYWQgc2NyaXB0JykpO1xuICAgICAgICAgICAgICAgICAgICB9LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LmlkID0gaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgeyAuLi5vcHRpb25zLCB0eXBlLCBjb250ZW50IH0pKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhZGRTdHlsZVRhZyhvcHRpb25zKSB7XG4gICAgICAgICAgICBsZXQgeyBjb250ZW50ID0gJycgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCB7IHBhdGggfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoKyEhb3B0aW9ucy51cmwgKyArISFwYXRoICsgKyEhY29udGVudCAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhhY3RseSBvbmUgb2YgYHVybGAsIGBwYXRoYCwgb3IgYGNvbnRlbnRgIG11c3QgYmUgc3BlY2lmaWVkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydEZTUHJvbWlzZXMoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgICBjb250ZW50ICs9ICcvKiMgc291cmNlVVJMPScgKyBwYXRoLnJlcGxhY2UoL1xcbi9nLCAnJykgKyAnKi8nO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluUmVhbG0oKS50cmFuc2ZlckhhbmRsZShhd2FpdCB0aGlzLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZUhhbmRsZShhc3luYyAoeyB1cmwsIGNvbnRlbnQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBsaW5rO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXZlbnQubWVzc2FnZSA/PyAnQ291bGQgbm90IGxvYWQgc3R5bGUnKSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBvcHRpb25zKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENsaWNrcyB0aGUgZmlyc3QgZWxlbWVudCBmb3VuZCB0aGF0IG1hdGNoZXMgYHNlbGVjdG9yYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogSWYgYGNsaWNrKClgIHRyaWdnZXJzIGEgbmF2aWdhdGlvbiBldmVudCBhbmQgdGhlcmUncyBhIHNlcGFyYXRlXG4gICAgICAgICAqIGBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKClgIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQsIHlvdSBtYXkgZW5kIHVwIHdpdGggYVxuICAgICAgICAgKiByYWNlIGNvbmRpdGlvbiB0aGF0IHlpZWxkcyB1bmV4cGVjdGVkIHJlc3VsdHMuIFRoZSBjb3JyZWN0IHBhdHRlcm4gZm9yXG4gICAgICAgICAqIGNsaWNrIGFuZCB3YWl0IGZvciBuYXZpZ2F0aW9uIGlzIHRoZSBmb2xsb3dpbmc6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IFtyZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAqICAgcGFnZS53YWl0Rm9yTmF2aWdhdGlvbih3YWl0T3B0aW9ucyksXG4gICAgICAgICAqICAgZnJhbWUuY2xpY2soc2VsZWN0b3IsIGNsaWNrT3B0aW9ucyksXG4gICAgICAgICAqIF0pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIHRvIHF1ZXJ5IGZvci5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNsaWNrKHNlbGVjdG9yLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMywgYXdhaXQgdGhpcy4kKHNlbGVjdG9yKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGFzc2VydChoYW5kbGUsIGBObyBlbGVtZW50IGZvdW5kIGZvciBzZWxlY3RvcjogJHtzZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUuY2xpY2sob3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzMpIHtcbiAgICAgICAgICAgICAgICBlbnZfMy5lcnJvciA9IGVfMztcbiAgICAgICAgICAgICAgICBlbnZfMy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGb2N1c2VzIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgYHNlbGVjdG9yYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIHRvIHF1ZXJ5IGZvci5cbiAgICAgICAgICogQHRocm93cyBUaHJvd3MgaWYgdGhlcmUncyBubyBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmb2N1cyhzZWxlY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgZW52XzQgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl80LCBhd2FpdCB0aGlzLiQoc2VsZWN0b3IpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGhhbmRsZSwgYE5vIGVsZW1lbnQgZm91bmQgZm9yIHNlbGVjdG9yOiAke3NlbGVjdG9yfWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZS5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfNCkge1xuICAgICAgICAgICAgICAgIGVudl80LmVycm9yID0gZV80O1xuICAgICAgICAgICAgICAgIGVudl80Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhvdmVycyB0aGUgcG9pbnRlciBvdmVyIHRoZSBjZW50ZXIgb2YgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZVxuICAgICAgICAgKiBgc2VsZWN0b3JgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgc2VsZWN0b3IgdG8gcXVlcnkgZm9yLlxuICAgICAgICAgKiBAdGhyb3dzIFRocm93cyBpZiB0aGVyZSdzIG5vIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGhvdmVyKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZfNSA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzUsIGF3YWl0IHRoaXMuJChzZWxlY3RvciksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoaGFuZGxlLCBgTm8gZWxlbWVudCBmb3VuZCBmb3Igc2VsZWN0b3I6ICR7c2VsZWN0b3J9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLmhvdmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV81KSB7XG4gICAgICAgICAgICAgICAgZW52XzUuZXJyb3IgPSBlXzU7XG4gICAgICAgICAgICAgICAgZW52XzUuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl81KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogU2VsZWN0cyBhIHNldCBvZiB2YWx1ZSBvbiB0aGUgZmlyc3QgYDxzZWxlY3Q+YCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGVcbiAgICAgICAgICogYHNlbGVjdG9yYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogZnJhbWUuc2VsZWN0KCdzZWxlY3QjY29sb3JzJywgJ2JsdWUnKTsgLy8gc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgKiBmcmFtZS5zZWxlY3QoJ3NlbGVjdCNjb2xvcnMnLCAncmVkJywgJ2dyZWVuJywgJ2JsdWUnKTsgLy8gbXVsdGlwbGUgc2VsZWN0aW9uc1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gVGhlIHNlbGVjdG9yIHRvIHF1ZXJ5IGZvci5cbiAgICAgICAgICogQHBhcmFtIHZhbHVlcyAtIFRoZSBhcnJheSBvZiB2YWx1ZXMgdG8gc2VsZWN0LiBJZiB0aGUgYDxzZWxlY3Q+YCBoYXMgdGhlXG4gICAgICAgICAqIGBtdWx0aXBsZWAgYXR0cmlidXRlLCBhbGwgdmFsdWVzIGFyZSBjb25zaWRlcmVkLCBvdGhlcndpc2Ugb25seSB0aGUgZmlyc3RcbiAgICAgICAgICogb25lIGlzIHRha2VuIGludG8gYWNjb3VudC5cbiAgICAgICAgICogQHJldHVybnMgdGhlIGxpc3Qgb2YgdmFsdWVzIHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgc2VsZWN0ZWQuXG4gICAgICAgICAqIEB0aHJvd3MgVGhyb3dzIGlmIHRoZXJlJ3Mgbm8gYDxzZWxlY3Q+YCBtYXRjaGluZyBgc2VsZWN0b3JgLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2VsZWN0KHNlbGVjdG9yLCAuLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl82ID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfNiwgYXdhaXQgdGhpcy4kKHNlbGVjdG9yKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGFzc2VydChoYW5kbGUsIGBObyBlbGVtZW50IGZvdW5kIGZvciBzZWxlY3RvcjogJHtzZWxlY3Rvcn1gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgaGFuZGxlLnNlbGVjdCguLi52YWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfNikge1xuICAgICAgICAgICAgICAgIGVudl82LmVycm9yID0gZV82O1xuICAgICAgICAgICAgICAgIGVudl82Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRhcHMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBgc2VsZWN0b3JgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBUaGUgc2VsZWN0b3IgdG8gcXVlcnkgZm9yLlxuICAgICAgICAgKiBAdGhyb3dzIFRocm93cyBpZiB0aGVyZSdzIG5vIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRhcChzZWxlY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgZW52XzcgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl83LCBhd2FpdCB0aGlzLiQoc2VsZWN0b3IpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGhhbmRsZSwgYE5vIGVsZW1lbnQgZm91bmQgZm9yIHNlbGVjdG9yOiAke3NlbGVjdG9yfWApO1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZS50YXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzcpIHtcbiAgICAgICAgICAgICAgICBlbnZfNy5lcnJvciA9IGVfNztcbiAgICAgICAgICAgICAgICBlbnZfNy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZW5kcyBhIGBrZXlkb3duYCwgYGtleXByZXNzYC9gaW5wdXRgLCBhbmQgYGtleXVwYCBldmVudCBmb3IgZWFjaCBjaGFyYWN0ZXJcbiAgICAgICAgICogaW4gdGhlIHRleHQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFRvIHByZXNzIGEgc3BlY2lhbCBrZXksIGxpa2UgYENvbnRyb2xgIG9yIGBBcnJvd0Rvd25gLCB1c2VcbiAgICAgICAgICoge0BsaW5rIEtleWJvYXJkLnByZXNzfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogYXdhaXQgZnJhbWUudHlwZSgnI215dGV4dGFyZWEnLCAnSGVsbG8nKTsgLy8gVHlwZXMgaW5zdGFudGx5XG4gICAgICAgICAqIGF3YWl0IGZyYW1lLnR5cGUoJyNteXRleHRhcmVhJywgJ1dvcmxkJywge2RlbGF5OiAxMDB9KTsgLy8gVHlwZXMgc2xvd2VyLCBsaWtlIGEgdXNlclxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gdGhlIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudCB0byB0eXBlIGludG8uIElmIHRoZXJlIGFyZVxuICAgICAgICAgKiBtdWx0aXBsZSB0aGUgZmlyc3Qgd2lsbCBiZSB1c2VkLlxuICAgICAgICAgKiBAcGFyYW0gdGV4dCAtIHRleHQgdG8gdHlwZSBpbnRvIHRoZSBlbGVtZW50XG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gdGFrZXMgb25lIG9wdGlvbiwgYGRlbGF5YCwgd2hpY2ggc2V0cyB0aGUgdGltZSB0byB3YWl0XG4gICAgICAgICAqIGJldHdlZW4ga2V5IHByZXNzZXMgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byBgMGAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0eXBlKHNlbGVjdG9yLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZfOCA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzgsIGF3YWl0IHRoaXMuJChzZWxlY3RvciksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoaGFuZGxlLCBgTm8gZWxlbWVudCBmb3VuZCBmb3Igc2VsZWN0b3I6ICR7c2VsZWN0b3J9YCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnR5cGUodGV4dCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV84KSB7XG4gICAgICAgICAgICAgICAgZW52XzguZXJyb3IgPSBlXzg7XG4gICAgICAgICAgICAgICAgZW52XzguaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl84KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGZyYW1lJ3MgdGl0bGUuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0aXRsZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmlzb2xhdGVkUmVhbG0oKS5ldmFsdWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnRpdGxlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IEZyYW1lIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GcmFtZS5qcy5tYXAiLCJpbXBvcnQgeyBkZWJ1Z0Vycm9yLCBpc1N0cmluZyB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogVGhlIGRlZmF1bHQgY29vcGVyYXRpdmUgcmVxdWVzdCBpbnRlcmNlcHRpb24gcmVzb2x1dGlvbiBwcmlvcml0eVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5URVJDRVBUX1JFU09MVVRJT05fUFJJT1JJVFkgPSAwO1xuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEhUVFAgcmVxdWVzdCBzZW50IGJ5IGEgcGFnZS5cbiAqIEByZW1hcmtzXG4gKlxuICogV2hlbmV2ZXIgdGhlIHBhZ2Ugc2VuZHMgYSByZXF1ZXN0LCBzdWNoIGFzIGZvciBhIG5ldHdvcmsgcmVzb3VyY2UsIHRoZVxuICogZm9sbG93aW5nIGV2ZW50cyBhcmUgZW1pdHRlZCBieSBQdXBwZXRlZXIncyBgcGFnZWA6XG4gKlxuICogLSBgcmVxdWVzdGA6IGVtaXR0ZWQgd2hlbiB0aGUgcmVxdWVzdCBpcyBpc3N1ZWQgYnkgdGhlIHBhZ2UuXG4gKiAtIGByZXF1ZXN0ZmluaXNoZWRgIC0gZW1pdHRlZCB3aGVuIHRoZSByZXNwb25zZSBib2R5IGlzIGRvd25sb2FkZWQgYW5kIHRoZVxuICogICByZXF1ZXN0IGlzIGNvbXBsZXRlLlxuICpcbiAqIElmIHJlcXVlc3QgZmFpbHMgYXQgc29tZSBwb2ludCwgdGhlbiBpbnN0ZWFkIG9mIGByZXF1ZXN0ZmluaXNoZWRgIGV2ZW50IHRoZVxuICogYHJlcXVlc3RmYWlsZWRgIGV2ZW50IGlzIGVtaXR0ZWQuXG4gKlxuICogQWxsIG9mIHRoZXNlIGV2ZW50cyBwcm92aWRlIGFuIGluc3RhbmNlIG9mIGBIVFRQUmVxdWVzdGAgcmVwcmVzZW50aW5nIHRoZVxuICogcmVxdWVzdCB0aGF0IG9jY3VycmVkOlxuICpcbiAqIGBgYFxuICogcGFnZS5vbigncmVxdWVzdCcsIHJlcXVlc3QgPT4gLi4uKVxuICogYGBgXG4gKlxuICogTk9URTogSFRUUCBFcnJvciByZXNwb25zZXMsIHN1Y2ggYXMgNDA0IG9yIDUwMywgYXJlIHN0aWxsIHN1Y2Nlc3NmdWxcbiAqIHJlc3BvbnNlcyBmcm9tIEhUVFAgc3RhbmRwb2ludCwgc28gcmVxdWVzdCB3aWxsIGNvbXBsZXRlIHdpdGhcbiAqIGByZXF1ZXN0ZmluaXNoZWRgIGV2ZW50LlxuICpcbiAqIElmIHJlcXVlc3QgZ2V0cyBhICdyZWRpcmVjdCcgcmVzcG9uc2UsIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZFxuICogd2l0aCB0aGUgYHJlcXVlc3RmaW5pc2hlZGAgZXZlbnQsIGFuZCBhIG5ldyByZXF1ZXN0IGlzIGlzc3VlZCB0byBhXG4gKiByZWRpcmVjdGVkIHVybC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBIVFRQUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2ludGVyY2VwdGlvbklkO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9mYWlsdXJlVGV4dCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3Jlc3BvbnNlID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfZnJvbU1lbW9yeUNhY2hlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3JlZGlyZWN0Q2hhaW4gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBpbnRlcmNlcHRpb24gPSB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBoYW5kbGVkOiBmYWxzZSxcbiAgICAgICAgaGFuZGxlcnM6IFtdLFxuICAgICAgICByZXNvbHV0aW9uU3RhdGU6IHtcbiAgICAgICAgICAgIGFjdGlvbjogSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbi5Ob25lLFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0T3ZlcnJpZGVzOiB7fSxcbiAgICAgICAgcmVzcG9uc2U6IG51bGwsXG4gICAgICAgIGFib3J0UmVhc29uOiBudWxsLFxuICAgIH07XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICAgKiBUaGUgYENvbnRpbnVlUmVxdWVzdE92ZXJyaWRlc2AgdGhhdCB3aWxsIGJlIHVzZWRcbiAgICAgKiBpZiB0aGUgaW50ZXJjZXB0aW9uIGlzIGFsbG93ZWQgdG8gY29udGludWUgKGllLCBgYWJvcnQoKWAgYW5kXG4gICAgICogYHJlc3BvbmQoKWAgYXJlbid0IGNhbGxlZCkuXG4gICAgICovXG4gICAgY29udGludWVSZXF1ZXN0T3ZlcnJpZGVzKCkge1xuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmNlcHRpb24ucmVxdWVzdE92ZXJyaWRlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGBSZXNwb25zZUZvclJlcXVlc3RgIHRoYXQgZ2V0cyB1c2VkIGlmIHRoZVxuICAgICAqIGludGVyY2VwdGlvbiBpcyBhbGxvd2VkIHRvIHJlc3BvbmQgKGllLCBgYWJvcnQoKWAgaXMgbm90IGNhbGxlZCkuXG4gICAgICovXG4gICAgcmVzcG9uc2VGb3JSZXF1ZXN0KCkge1xuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmNlcHRpb24ucmVzcG9uc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IHJlY2VudCByZWFzb24gZm9yIGFib3J0aW5nIHRoZSByZXF1ZXN0XG4gICAgICovXG4gICAgYWJvcnRFcnJvclJlYXNvbigpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuaW50ZXJjZXB0aW9uLmVuYWJsZWQsICdSZXF1ZXN0IEludGVyY2VwdGlvbiBpcyBub3QgZW5hYmxlZCEnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJjZXB0aW9uLmFib3J0UmVhc29uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBJbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGN1cnJlbnQgcmVzb2x1dGlvblxuICAgICAqIGFjdGlvbiBhbmQgcHJpb3JpdHkuXG4gICAgICpcbiAgICAgKiBJbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUgY29udGFpbnM6XG4gICAgICogYWN0aW9uOiBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uXG4gICAgICogcHJpb3JpdHk/OiBudW1iZXJcbiAgICAgKlxuICAgICAqIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24gaXMgb25lIG9mOiBgYWJvcnRgLCBgcmVzcG9uZGAsIGBjb250aW51ZWAsXG4gICAgICogYGRpc2FibGVkYCwgYG5vbmVgLCBvciBgYWxyZWFkeS1oYW5kbGVkYC5cbiAgICAgKi9cbiAgICBpbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgYWN0aW9uOiBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uLkRpc2FibGVkIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGFjdGlvbjogSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbi5BbHJlYWR5SGFuZGxlZCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLnRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZSB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyBgdHJ1ZWAgaWYgdGhlIGludGVyY2VwdCByZXNvbHV0aW9uIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCxcbiAgICAgKiBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc0ludGVyY2VwdFJlc29sdXRpb25IYW5kbGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBhc3luYyByZXF1ZXN0IGhhbmRsZXIgdG8gdGhlIHByb2Nlc3NpbmcgcXVldWUuXG4gICAgICogRGVmZXJyZWQgaGFuZGxlcnMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGV4ZWN1dGUgaW4gYW55IHBhcnRpY3VsYXIgb3JkZXIsXG4gICAgICogYnV0IHRoZXkgYXJlIGd1YXJhbnRlZWQgdG8gcmVzb2x2ZSBiZWZvcmUgdGhlIHJlcXVlc3QgaW50ZXJjZXB0aW9uXG4gICAgICogaXMgZmluYWxpemVkLlxuICAgICAqL1xuICAgIGVucXVldWVJbnRlcmNlcHRBY3Rpb24ocGVuZGluZ0hhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlcnMucHVzaChwZW5kaW5nSGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF3YWl0cyBwZW5kaW5nIGludGVyY2VwdGlvbiBoYW5kbGVycyBhbmQgdGhlbiBkZWNpZGVzIGhvdyB0byBmdWxmaWxsXG4gICAgICogdGhlIHJlcXVlc3QgaW50ZXJjZXB0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGZpbmFsaXplSW50ZXJjZXB0aW9ucygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlcnMucmVkdWNlKChwcm9taXNlQ2hhaW4sIGludGVyY2VwdEFjdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2VDaGFpbi50aGVuKGludGVyY2VwdEFjdGlvbik7XG4gICAgICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKTtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlcnMgPSBbXTsgLy8gVE9ETzogdmVyaWZ5IHRoaXMgaXMgY29ycmVjdCB0b3AgbGV0IGdjIHJ1blxuICAgICAgICBjb25zdCB7IGFjdGlvbiB9ID0gdGhpcy5pbnRlcmNlcHRSZXNvbHV0aW9uU3RhdGUoKTtcbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2Fib3J0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fYWJvcnQodGhpcy5pbnRlcmNlcHRpb24uYWJvcnRSZWFzb24pO1xuICAgICAgICAgICAgY2FzZSAncmVzcG9uZCc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJjZXB0aW9uLnJlc3BvbnNlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UgaXMgbWlzc2luZyBmb3IgdGhlIGludGVyY2VwdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVzcG9uZCh0aGlzLmludGVyY2VwdGlvbi5yZXNwb25zZSk7XG4gICAgICAgICAgICBjYXNlICdjb250aW51ZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbnRpbnVlKHRoaXMuaW50ZXJjZXB0aW9uLnJlcXVlc3RPdmVycmlkZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnRpbnVlcyByZXF1ZXN0IHdpdGggb3B0aW9uYWwgcmVxdWVzdCBvdmVycmlkZXMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb24odHJ1ZSk7XG4gICAgICogcGFnZS5vbigncmVxdWVzdCcsIHJlcXVlc3QgPT4ge1xuICAgICAqICAgLy8gT3ZlcnJpZGUgaGVhZGVyc1xuICAgICAqICAgY29uc3QgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHJlcXVlc3QuaGVhZGVycygpLCB7XG4gICAgICogICAgIGZvbzogJ2JhcicsIC8vIHNldCBcImZvb1wiIGhlYWRlclxuICAgICAqICAgICBvcmlnaW46IHVuZGVmaW5lZCwgLy8gcmVtb3ZlIFwib3JpZ2luXCIgaGVhZGVyXG4gICAgICogICB9KTtcbiAgICAgKiAgIHJlcXVlc3QuY29udGludWUoe2hlYWRlcnN9KTtcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvdmVycmlkZXMgLSBvcHRpb25hbCBvdmVycmlkZXMgdG8gYXBwbHkgdG8gdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHByaW9yaXR5IC0gSWYgcHJvdmlkZWQsIGludGVyY2VwdCBpcyByZXNvbHZlZCB1c2luZyBjb29wZXJhdGl2ZVxuICAgICAqIGhhbmRsaW5nIHJ1bGVzLiBPdGhlcndpc2UsIGludGVyY2VwdCBpcyByZXNvbHZlZCBpbW1lZGlhdGVseS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiBUbyB1c2UgdGhpcywgcmVxdWVzdCBpbnRlcmNlcHRpb24gc2hvdWxkIGJlIGVuYWJsZWQgd2l0aFxuICAgICAqIHtAbGluayBQYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb259LlxuICAgICAqXG4gICAgICogRXhjZXB0aW9uIGlzIGltbWVkaWF0ZWx5IHRocm93biBpZiB0aGUgcmVxdWVzdCBpbnRlcmNlcHRpb24gaXMgbm90IGVuYWJsZWQuXG4gICAgICovXG4gICAgYXN5bmMgY29udGludWUob3ZlcnJpZGVzID0ge30sIHByaW9yaXR5KSB7XG4gICAgICAgIC8vIFJlcXVlc3QgaW50ZXJjZXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRhdGE6IHVybHMuXG4gICAgICAgIGlmICh0aGlzLnVybCgpLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQsICdSZXF1ZXN0IGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb250aW51ZShvdmVycmlkZXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlcXVlc3RPdmVycmlkZXMgPSBvdmVycmlkZXM7XG4gICAgICAgIGlmICh0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUucHJpb3JpdHkgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgcHJpb3JpdHkgPiB0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uQ29udGludWUsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmlvcml0eSA9PT0gdGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLmFjdGlvbiA9PT0gJ2Fib3J0JyB8fFxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5hY3Rpb24gPT09ICdyZXNwb25kJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5hY3Rpb24gPVxuICAgICAgICAgICAgICAgIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uQ29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGdWxmaWxscyBhIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIEFuIGV4YW1wbGUgb2YgZnVsZmlsbGluZyBhbGwgcmVxdWVzdHMgd2l0aCA0MDQgcmVzcG9uc2VzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBwYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb24odHJ1ZSk7XG4gICAgICogcGFnZS5vbigncmVxdWVzdCcsIHJlcXVlc3QgPT4ge1xuICAgICAqICAgcmVxdWVzdC5yZXNwb25kKHtcbiAgICAgKiAgICAgc3RhdHVzOiA0MDQsXG4gICAgICogICAgIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbicsXG4gICAgICogICAgIGJvZHk6ICdOb3QgRm91bmQhJyxcbiAgICAgKiAgIH0pO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogTk9URTogTW9ja2luZyByZXNwb25zZXMgZm9yIGRhdGFVUkwgcmVxdWVzdHMgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKiBDYWxsaW5nIGByZXF1ZXN0LnJlc3BvbmRgIGZvciBhIGRhdGFVUkwgcmVxdWVzdCBpcyBhIG5vb3AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2UgLSB0aGUgcmVzcG9uc2UgdG8gZnVsZmlsbCB0aGUgcmVxdWVzdCB3aXRoLlxuICAgICAqIEBwYXJhbSBwcmlvcml0eSAtIElmIHByb3ZpZGVkLCBpbnRlcmNlcHQgaXMgcmVzb2x2ZWQgdXNpbmdcbiAgICAgKiBjb29wZXJhdGl2ZSBoYW5kbGluZyBydWxlcy4gT3RoZXJ3aXNlLCBpbnRlcmNlcHQgaXMgcmVzb2x2ZWRcbiAgICAgKiBpbW1lZGlhdGVseS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiBUbyB1c2UgdGhpcywgcmVxdWVzdFxuICAgICAqIGludGVyY2VwdGlvbiBzaG91bGQgYmUgZW5hYmxlZCB3aXRoIHtAbGluayBQYWdlLnNldFJlcXVlc3RJbnRlcmNlcHRpb259LlxuICAgICAqXG4gICAgICogRXhjZXB0aW9uIGlzIGltbWVkaWF0ZWx5IHRocm93biBpZiB0aGUgcmVxdWVzdCBpbnRlcmNlcHRpb24gaXMgbm90IGVuYWJsZWQuXG4gICAgICovXG4gICAgYXN5bmMgcmVzcG9uZChyZXNwb25zZSwgcHJpb3JpdHkpIHtcbiAgICAgICAgLy8gTW9ja2luZyByZXNwb25zZXMgZm9yIGRhdGFVUkwgcmVxdWVzdHMgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gICAgICAgIGlmICh0aGlzLnVybCgpLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQsICdSZXF1ZXN0IGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZXNwb25kKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIHByaW9yaXR5ID4gdGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5KSB7XG4gICAgICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uLlJlc3BvbmQsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmlvcml0eSA9PT0gdGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLnByaW9yaXR5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmNlcHRpb24ucmVzb2x1dGlvblN0YXRlLmFjdGlvbiA9PT0gJ2Fib3J0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5hY3Rpb24gPVxuICAgICAgICAgICAgICAgIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uUmVzcG9uZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgYSByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVycm9yQ29kZSAtIG9wdGlvbmFsIGVycm9yIGNvZGUgdG8gcHJvdmlkZS5cbiAgICAgKiBAcGFyYW0gcHJpb3JpdHkgLSBJZiBwcm92aWRlZCwgaW50ZXJjZXB0IGlzIHJlc29sdmVkIHVzaW5nXG4gICAgICogY29vcGVyYXRpdmUgaGFuZGxpbmcgcnVsZXMuIE90aGVyd2lzZSwgaW50ZXJjZXB0IGlzIHJlc29sdmVkXG4gICAgICogaW1tZWRpYXRlbHkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqXG4gICAgICogVG8gdXNlIHRoaXMsIHJlcXVlc3QgaW50ZXJjZXB0aW9uIHNob3VsZCBiZSBlbmFibGVkIHdpdGhcbiAgICAgKiB7QGxpbmsgUGFnZS5zZXRSZXF1ZXN0SW50ZXJjZXB0aW9ufS4gSWYgaXQgaXMgbm90IGVuYWJsZWQsIHRoaXMgbWV0aG9kIHdpbGxcbiAgICAgKiB0aHJvdyBhbiBleGNlcHRpb24gaW1tZWRpYXRlbHkuXG4gICAgICovXG4gICAgYXN5bmMgYWJvcnQoZXJyb3JDb2RlID0gJ2ZhaWxlZCcsIHByaW9yaXR5KSB7XG4gICAgICAgIC8vIFJlcXVlc3QgaW50ZXJjZXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRhdGE6IHVybHMuXG4gICAgICAgIGlmICh0aGlzLnVybCgpLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvclJlYXNvbiA9IGVycm9yUmVhc29uc1tlcnJvckNvZGVdO1xuICAgICAgICBhc3NlcnQoZXJyb3JSZWFzb24sICdVbmtub3duIGVycm9yIGNvZGU6ICcgKyBlcnJvckNvZGUpO1xuICAgICAgICBhc3NlcnQodGhpcy5pbnRlcmNlcHRpb24uZW5hYmxlZCwgJ1JlcXVlc3QgSW50ZXJjZXB0aW9uIGlzIG5vdCBlbmFibGVkIScpO1xuICAgICAgICBhc3NlcnQoIXRoaXMuaW50ZXJjZXB0aW9uLmhhbmRsZWQsICdSZXF1ZXN0IGlzIGFscmVhZHkgaGFuZGxlZCEnKTtcbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9hYm9ydChlcnJvclJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uYWJvcnRSZWFzb24gPSBlcnJvclJlYXNvbjtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZS5wcmlvcml0eSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBwcmlvcml0eSA+PSB0aGlzLmludGVyY2VwdGlvbi5yZXNvbHV0aW9uU3RhdGUucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0aW9uLnJlc29sdXRpb25TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24uQWJvcnQsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRSZXNwb25zZShib2R5KSB7XG4gICAgICAgIC8vIE5lZWRlZCB0byBnZXQgdGhlIGNvcnJlY3QgYnl0ZUxlbmd0aFxuICAgICAgICBjb25zdCBieXRlQm9keSA9IGlzU3RyaW5nKGJvZHkpXG4gICAgICAgICAgICA/IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShib2R5KVxuICAgICAgICAgICAgOiBib2R5O1xuICAgICAgICBjb25zdCBieXRlcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGJ5dGUgb2YgYnl0ZUJvZHkpIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IGJ5dGVCb2R5LmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICBiYXNlNjQ6IGJ0b2EoYnl0ZXMuam9pbignJykpLFxuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdmFyIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb247XG4oZnVuY3Rpb24gKEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24pIHtcbiAgICBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uW1wiQWJvcnRcIl0gPSBcImFib3J0XCI7XG4gICAgSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbltcIlJlc3BvbmRcIl0gPSBcInJlc3BvbmRcIjtcbiAgICBJbnRlcmNlcHRSZXNvbHV0aW9uQWN0aW9uW1wiQ29udGludWVcIl0gPSBcImNvbnRpbnVlXCI7XG4gICAgSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbltcIkRpc2FibGVkXCJdID0gXCJkaXNhYmxlZFwiO1xuICAgIEludGVyY2VwdFJlc29sdXRpb25BY3Rpb25bXCJOb25lXCJdID0gXCJub25lXCI7XG4gICAgSW50ZXJjZXB0UmVzb2x1dGlvbkFjdGlvbltcIkFscmVhZHlIYW5kbGVkXCJdID0gXCJhbHJlYWR5LWhhbmRsZWRcIjtcbn0pKEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24gfHwgKEludGVyY2VwdFJlc29sdXRpb25BY3Rpb24gPSB7fSkpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhlYWRlcnNBcnJheShoZWFkZXJzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCBuYW1lIGluIGhlYWRlcnMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXJzW25hbWVdO1xuICAgICAgICBpZiAoIU9iamVjdC5pcyh2YWx1ZSwgdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi52YWx1ZXMubWFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lLCB2YWx1ZTogdmFsdWUgKyAnJyB9O1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICpcbiAqIEByZW1hcmtzXG4gKiBMaXN0IHRha2VuIGZyb20ge0BsaW5rIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2h0dHAtc3RhdHVzLWNvZGVzL2h0dHAtc3RhdHVzLWNvZGVzLnhodG1sfVxuICogd2l0aCBleHRyYSAzMDYgYW5kIDQxOCBjb2Rlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUQVRVU19URVhUUyA9IHtcbiAgICAnMTAwJzogJ0NvbnRpbnVlJyxcbiAgICAnMTAxJzogJ1N3aXRjaGluZyBQcm90b2NvbHMnLFxuICAgICcxMDInOiAnUHJvY2Vzc2luZycsXG4gICAgJzEwMyc6ICdFYXJseSBIaW50cycsXG4gICAgJzIwMCc6ICdPSycsXG4gICAgJzIwMSc6ICdDcmVhdGVkJyxcbiAgICAnMjAyJzogJ0FjY2VwdGVkJyxcbiAgICAnMjAzJzogJ05vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uJyxcbiAgICAnMjA0JzogJ05vIENvbnRlbnQnLFxuICAgICcyMDUnOiAnUmVzZXQgQ29udGVudCcsXG4gICAgJzIwNic6ICdQYXJ0aWFsIENvbnRlbnQnLFxuICAgICcyMDcnOiAnTXVsdGktU3RhdHVzJyxcbiAgICAnMjA4JzogJ0FscmVhZHkgUmVwb3J0ZWQnLFxuICAgICcyMjYnOiAnSU0gVXNlZCcsXG4gICAgJzMwMCc6ICdNdWx0aXBsZSBDaG9pY2VzJyxcbiAgICAnMzAxJzogJ01vdmVkIFBlcm1hbmVudGx5JyxcbiAgICAnMzAyJzogJ0ZvdW5kJyxcbiAgICAnMzAzJzogJ1NlZSBPdGhlcicsXG4gICAgJzMwNCc6ICdOb3QgTW9kaWZpZWQnLFxuICAgICczMDUnOiAnVXNlIFByb3h5JyxcbiAgICAnMzA2JzogJ1N3aXRjaCBQcm94eScsXG4gICAgJzMwNyc6ICdUZW1wb3JhcnkgUmVkaXJlY3QnLFxuICAgICczMDgnOiAnUGVybWFuZW50IFJlZGlyZWN0JyxcbiAgICAnNDAwJzogJ0JhZCBSZXF1ZXN0JyxcbiAgICAnNDAxJzogJ1VuYXV0aG9yaXplZCcsXG4gICAgJzQwMic6ICdQYXltZW50IFJlcXVpcmVkJyxcbiAgICAnNDAzJzogJ0ZvcmJpZGRlbicsXG4gICAgJzQwNCc6ICdOb3QgRm91bmQnLFxuICAgICc0MDUnOiAnTWV0aG9kIE5vdCBBbGxvd2VkJyxcbiAgICAnNDA2JzogJ05vdCBBY2NlcHRhYmxlJyxcbiAgICAnNDA3JzogJ1Byb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyxcbiAgICAnNDA4JzogJ1JlcXVlc3QgVGltZW91dCcsXG4gICAgJzQwOSc6ICdDb25mbGljdCcsXG4gICAgJzQxMCc6ICdHb25lJyxcbiAgICAnNDExJzogJ0xlbmd0aCBSZXF1aXJlZCcsXG4gICAgJzQxMic6ICdQcmVjb25kaXRpb24gRmFpbGVkJyxcbiAgICAnNDEzJzogJ1BheWxvYWQgVG9vIExhcmdlJyxcbiAgICAnNDE0JzogJ1VSSSBUb28gTG9uZycsXG4gICAgJzQxNSc6ICdVbnN1cHBvcnRlZCBNZWRpYSBUeXBlJyxcbiAgICAnNDE2JzogJ1JhbmdlIE5vdCBTYXRpc2ZpYWJsZScsXG4gICAgJzQxNyc6ICdFeHBlY3RhdGlvbiBGYWlsZWQnLFxuICAgICc0MTgnOiBcIkknbSBhIHRlYXBvdFwiLFxuICAgICc0MjEnOiAnTWlzZGlyZWN0ZWQgUmVxdWVzdCcsXG4gICAgJzQyMic6ICdVbnByb2Nlc3NhYmxlIEVudGl0eScsXG4gICAgJzQyMyc6ICdMb2NrZWQnLFxuICAgICc0MjQnOiAnRmFpbGVkIERlcGVuZGVuY3knLFxuICAgICc0MjUnOiAnVG9vIEVhcmx5JyxcbiAgICAnNDI2JzogJ1VwZ3JhZGUgUmVxdWlyZWQnLFxuICAgICc0MjgnOiAnUHJlY29uZGl0aW9uIFJlcXVpcmVkJyxcbiAgICAnNDI5JzogJ1RvbyBNYW55IFJlcXVlc3RzJyxcbiAgICAnNDMxJzogJ1JlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2UnLFxuICAgICc0NTEnOiAnVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnMnLFxuICAgICc1MDAnOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbiAgICAnNTAxJzogJ05vdCBJbXBsZW1lbnRlZCcsXG4gICAgJzUwMic6ICdCYWQgR2F0ZXdheScsXG4gICAgJzUwMyc6ICdTZXJ2aWNlIFVuYXZhaWxhYmxlJyxcbiAgICAnNTA0JzogJ0dhdGV3YXkgVGltZW91dCcsXG4gICAgJzUwNSc6ICdIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCcsXG4gICAgJzUwNic6ICdWYXJpYW50IEFsc28gTmVnb3RpYXRlcycsXG4gICAgJzUwNyc6ICdJbnN1ZmZpY2llbnQgU3RvcmFnZScsXG4gICAgJzUwOCc6ICdMb29wIERldGVjdGVkJyxcbiAgICAnNTEwJzogJ05vdCBFeHRlbmRlZCcsXG4gICAgJzUxMSc6ICdOZXR3b3JrIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyxcbn07XG5jb25zdCBlcnJvclJlYXNvbnMgPSB7XG4gICAgYWJvcnRlZDogJ0Fib3J0ZWQnLFxuICAgIGFjY2Vzc2RlbmllZDogJ0FjY2Vzc0RlbmllZCcsXG4gICAgYWRkcmVzc3VucmVhY2hhYmxlOiAnQWRkcmVzc1VucmVhY2hhYmxlJyxcbiAgICBibG9ja2VkYnljbGllbnQ6ICdCbG9ja2VkQnlDbGllbnQnLFxuICAgIGJsb2NrZWRieXJlc3BvbnNlOiAnQmxvY2tlZEJ5UmVzcG9uc2UnLFxuICAgIGNvbm5lY3Rpb25hYm9ydGVkOiAnQ29ubmVjdGlvbkFib3J0ZWQnLFxuICAgIGNvbm5lY3Rpb25jbG9zZWQ6ICdDb25uZWN0aW9uQ2xvc2VkJyxcbiAgICBjb25uZWN0aW9uZmFpbGVkOiAnQ29ubmVjdGlvbkZhaWxlZCcsXG4gICAgY29ubmVjdGlvbnJlZnVzZWQ6ICdDb25uZWN0aW9uUmVmdXNlZCcsXG4gICAgY29ubmVjdGlvbnJlc2V0OiAnQ29ubmVjdGlvblJlc2V0JyxcbiAgICBpbnRlcm5ldGRpc2Nvbm5lY3RlZDogJ0ludGVybmV0RGlzY29ubmVjdGVkJyxcbiAgICBuYW1lbm90cmVzb2x2ZWQ6ICdOYW1lTm90UmVzb2x2ZWQnLFxuICAgIHRpbWVkb3V0OiAnVGltZWRPdXQnLFxuICAgIGZhaWxlZDogJ0ZhaWxlZCcsXG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yKSB7XG4gICAgLy8gRmlyZWZveCB0aHJvd3MgYW4gaW52YWxpZCBhcmd1bWVudCBlcnJvciB3aXRoIGEgbWVzc2FnZSBzdGFydGluZyB3aXRoXG4gICAgLy8gJ0V4cGVjdGVkIFwiaGVhZGVyXCIgWy4uLl0nLlxuICAgIGlmIChlcnJvci5vcmlnaW5hbE1lc3NhZ2UuaW5jbHVkZXMoJ0ludmFsaWQgaGVhZGVyJykgfHxcbiAgICAgICAgZXJyb3Iub3JpZ2luYWxNZXNzYWdlLmluY2x1ZGVzKCdFeHBlY3RlZCBcImhlYWRlclwiJykgfHxcbiAgICAgICAgLy8gV2ViRHJpdmVyIEJpRGkgZXJyb3IgZm9yIGludmFsaWQgdmFsdWVzLCBmb3IgZXhhbXBsZSwgaGVhZGVycy5cbiAgICAgICAgZXJyb3Iub3JpZ2luYWxNZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkIGFyZ3VtZW50JykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIC8vIEluIGNlcnRhaW4gY2FzZXMsIHByb3RvY29sIHdpbGwgcmV0dXJuIGVycm9yIGlmIHRoZSByZXF1ZXN0IHdhc1xuICAgIC8vIGFscmVhZHkgY2FuY2VsZWQgb3IgdGhlIHBhZ2Ugd2FzIGNsb3NlZC4gV2Ugc2hvdWxkIHRvbGVyYXRlIHRoZXNlXG4gICAgLy8gZXJyb3JzLlxuICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SFRUUFJlcXVlc3QuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogVGhlIEhUVFBSZXNwb25zZSBjbGFzcyByZXByZXNlbnRzIHJlc3BvbnNlcyB3aGljaCBhcmUgcmVjZWl2ZWQgYnkgdGhlXG4gKiB7QGxpbmsgUGFnZX0gY2xhc3MuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgSFRUUFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuICAgIC8qKlxuICAgICAqIFRydWUgaWYgdGhlIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsIChzdGF0dXMgaW4gdGhlIHJhbmdlIDIwMC0yOTkpLlxuICAgICAqL1xuICAgIG9rKCkge1xuICAgICAgICAvLyBUT0RPOiBkb2N1bWVudCA9PT0gMCBjYXNlP1xuICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLnN0YXR1cygpO1xuICAgICAgICByZXR1cm4gc3RhdHVzID09PSAwIHx8IChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8PSAyOTkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGEgdGV4dCAodXRmOCkgcmVwcmVzZW50YXRpb24gb2YgcmVzcG9uc2UgYm9keS5cbiAgICAgKi9cbiAgICBhc3luYyB0ZXh0KCkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5idWZmZXIoKTtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgcmVzcG9uc2UgYm9keS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHRocm93IGlmIHRoZSByZXNwb25zZSBib2R5IGlzIG5vdCBwYXJzYWJsZSB2aWFcbiAgICAgKiBgSlNPTi5wYXJzZWAuXG4gICAgICovXG4gICAgYXN5bmMganNvbigpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMudGV4dCgpO1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1IVFRQUmVzcG9uc2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogS2V5Ym9hcmQgcHJvdmlkZXMgYW4gYXBpIGZvciBtYW5hZ2luZyBhIHZpcnR1YWwga2V5Ym9hcmQuXG4gKiBUaGUgaGlnaCBsZXZlbCBhcGkgaXMge0BsaW5rIEtleWJvYXJkLlwidHlwZVwifSxcbiAqIHdoaWNoIHRha2VzIHJhdyBjaGFyYWN0ZXJzIGFuZCBnZW5lcmF0ZXMgcHJvcGVyIGtleWRvd24sIGtleXByZXNzL2lucHV0LFxuICogYW5kIGtleXVwIGV2ZW50cyBvbiB5b3VyIHBhZ2UuXG4gKlxuICogQHJlbWFya3NcbiAqIEZvciBmaW5lciBjb250cm9sLCB5b3UgY2FuIHVzZSB7QGxpbmsgS2V5Ym9hcmQuZG93bn0sXG4gKiB7QGxpbmsgS2V5Ym9hcmQudXB9LCBhbmQge0BsaW5rIEtleWJvYXJkLnNlbmRDaGFyYWN0ZXJ9XG4gKiB0byBtYW51YWxseSBmaXJlIGV2ZW50cyBhcyBpZiB0aGV5IHdlcmUgZ2VuZXJhdGVkIGZyb20gYSByZWFsIGtleWJvYXJkLlxuICpcbiAqIE9uIG1hY09TLCBrZXlib2FyZCBzaG9ydGN1dHMgbGlrZSBg4oyYIEFgIC1cXD4gU2VsZWN0IEFsbCBkbyBub3Qgd29yay5cbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3B1cHBldGVlci9wdXBwZXRlZXIvaXNzdWVzLzEzMTMgfCAjMTMxM30uXG4gKlxuICogQGV4YW1wbGVcbiAqIEFuIGV4YW1wbGUgb2YgaG9sZGluZyBkb3duIGBTaGlmdGAgaW4gb3JkZXIgdG8gc2VsZWN0IGFuZCBkZWxldGUgc29tZSB0ZXh0OlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBwYWdlLmtleWJvYXJkLnR5cGUoJ0hlbGxvIFdvcmxkIScpO1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygnQXJyb3dMZWZ0Jyk7XG4gKlxuICogYXdhaXQgcGFnZS5rZXlib2FyZC5kb3duKCdTaGlmdCcpO1xuICogZm9yIChsZXQgaSA9IDA7IGkgPCAnIFdvcmxkJy5sZW5ndGg7IGkrKylcbiAqICAgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygnQXJyb3dMZWZ0Jyk7XG4gKiBhd2FpdCBwYWdlLmtleWJvYXJkLnVwKCdTaGlmdCcpO1xuICpcbiAqIGF3YWl0IHBhZ2Uua2V5Ym9hcmQucHJlc3MoJ0JhY2tzcGFjZScpO1xuICogLy8gUmVzdWx0IHRleHQgd2lsbCBlbmQgdXAgc2F5aW5nICdIZWxsbyEnXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQW4gZXhhbXBsZSBvZiBwcmVzc2luZyBgQWBcbiAqXG4gKiBgYGB0c1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC5kb3duKCdTaGlmdCcpO1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygnS2V5QScpO1xuICogYXdhaXQgcGFnZS5rZXlib2FyZC51cCgnU2hpZnQnKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEtleWJvYXJkIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxufVxuLyoqXG4gKiBFbnVtIG9mIHZhbGlkIG1vdXNlIGJ1dHRvbnMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgTW91c2VCdXR0b24gPSBPYmplY3QuZnJlZXplKHtcbiAgICBMZWZ0OiAnbGVmdCcsXG4gICAgUmlnaHQ6ICdyaWdodCcsXG4gICAgTWlkZGxlOiAnbWlkZGxlJyxcbiAgICBCYWNrOiAnYmFjaycsXG4gICAgRm9yd2FyZDogJ2ZvcndhcmQnLFxufSk7XG4vKipcbiAqIFRoZSBNb3VzZSBjbGFzcyBvcGVyYXRlcyBpbiBtYWluLWZyYW1lIENTUyBwaXhlbHNcbiAqIHJlbGF0aXZlIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHZpZXdwb3J0LlxuICpcbiAqIEByZW1hcmtzXG4gKiBFdmVyeSBgcGFnZWAgb2JqZWN0IGhhcyBpdHMgb3duIE1vdXNlLCBhY2Nlc3NpYmxlIHdpdGgge0BsaW5rIFBhZ2UubW91c2V9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIFVzaW5nIOKAmHBhZ2UubW91c2XigJkgdG8gdHJhY2UgYSAxMDB4MTAwIHNxdWFyZS5cbiAqIGF3YWl0IHBhZ2UubW91c2UubW92ZSgwLCAwKTtcbiAqIGF3YWl0IHBhZ2UubW91c2UuZG93bigpO1xuICogYXdhaXQgcGFnZS5tb3VzZS5tb3ZlKDAsIDEwMCk7XG4gKiBhd2FpdCBwYWdlLm1vdXNlLm1vdmUoMTAwLCAxMDApO1xuICogYXdhaXQgcGFnZS5tb3VzZS5tb3ZlKDEwMCwgMCk7XG4gKiBhd2FpdCBwYWdlLm1vdXNlLm1vdmUoMCwgMCk7XG4gKiBhd2FpdCBwYWdlLm1vdXNlLnVwKCk7XG4gKiBgYGBcbiAqXG4gKiAqKk5vdGUqKjogVGhlIG1vdXNlIGV2ZW50cyB0cmlnZ2VyIHN5bnRoZXRpYyBgTW91c2VFdmVudGBzLlxuICogVGhpcyBtZWFucyB0aGF0IGl0IGRvZXMgbm90IGZ1bGx5IHJlcGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiB3aGF0IGEgbm9ybWFsIHVzZXJcbiAqIHdvdWxkIGJlIGFibGUgdG8gZG8gd2l0aCB0aGVpciBtb3VzZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgZHJhZ2dpbmcgYW5kIHNlbGVjdGluZyB0ZXh0IGlzIG5vdCBwb3NzaWJsZSB1c2luZyBgcGFnZS5tb3VzZWAuXG4gKiBJbnN0ZWFkLCB5b3UgY2FuIHVzZSB0aGUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Eb2N1bWVudE9yU2hhZG93Um9vdC9nZXRTZWxlY3Rpb24gfCBgRG9jdW1lbnRPclNoYWRvd1Jvb3QuZ2V0U2VsZWN0aW9uKClgfSBmdW5jdGlvbmFsaXR5IGltcGxlbWVudGVkIGluIHRoZSBwbGF0Zm9ybS5cbiAqXG4gKiBAZXhhbXBsZVxuICogRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHNlbGVjdCBhbGwgY29udGVudCBiZXR3ZWVuIG5vZGVzOlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBwYWdlLmV2YWx1YXRlKFxuICogICAoZnJvbSwgdG8pID0+IHtcbiAqICAgICBjb25zdCBzZWxlY3Rpb24gPSBmcm9tLmdldFJvb3ROb2RlKCkuZ2V0U2VsZWN0aW9uKCk7XG4gKiAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICogICAgIHJhbmdlLnNldFN0YXJ0QmVmb3JlKGZyb20pO1xuICogICAgIHJhbmdlLnNldEVuZEFmdGVyKHRvKTtcbiAqICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gKiAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAqICAgfSxcbiAqICAgZnJvbUpTSGFuZGxlLFxuICogICB0b0pTSGFuZGxlXG4gKiApO1xuICogYGBgXG4gKlxuICogSWYgeW91IHRoZW4gd291bGQgd2FudCB0byBjb3B5LXBhc3RlIHlvdXIgc2VsZWN0aW9uLCB5b3UgY2FuIHVzZSB0aGUgY2xpcGJvYXJkIGFwaTpcbiAqXG4gKiBgYGB0c1xuICogLy8gVGhlIGNsaXBib2FyZCBhcGkgZG9lcyBub3QgYWxsb3cgeW91IHRvIGNvcHksIHVubGVzcyB0aGUgdGFiIGlzIGZvY3VzZWQuXG4gKiBhd2FpdCBwYWdlLmJyaW5nVG9Gcm9udCgpO1xuICogYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7XG4gKiAgIC8vIENvcHkgdGhlIHNlbGVjdGVkIGNvbnRlbnQgdG8gdGhlIGNsaXBib2FyZFxuICogICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICogICAvLyBPYnRhaW4gdGhlIGNvbnRlbnQgb2YgdGhlIGNsaXBib2FyZCBhcyBhIHN0cmluZ1xuICogICByZXR1cm4gbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpO1xuICogfSk7XG4gKiBgYGBcbiAqXG4gKiAqKk5vdGUqKjogSWYgeW91IHdhbnQgYWNjZXNzIHRvIHRoZSBjbGlwYm9hcmQgQVBJLFxuICogeW91IGhhdmUgdG8gZ2l2ZSBpdCBwZXJtaXNzaW9uIHRvIGRvIHNvOlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBicm93c2VyXG4gKiAgIC5kZWZhdWx0QnJvd3NlckNvbnRleHQoKVxuICogICAub3ZlcnJpZGVQZXJtaXNzaW9ucygnPHlvdXIgb3JpZ2luPicsIFtcbiAqICAgICAnY2xpcGJvYXJkLXJlYWQnLFxuICogICAgICdjbGlwYm9hcmQtd3JpdGUnLFxuICogICBdKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIE1vdXNlIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxufVxuLyoqXG4gKiBUaGUgVG91Y2hzY3JlZW4gY2xhc3MgZXhwb3NlcyB0b3VjaHNjcmVlbiBldmVudHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUb3VjaHNjcmVlbiB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7IH1cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaGVzIGEgYHRvdWNoc3RhcnRgIGFuZCBgdG91Y2hlbmRgIGV2ZW50LlxuICAgICAqIEBwYXJhbSB4IC0gSG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgdGFwLlxuICAgICAqIEBwYXJhbSB5IC0gVmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHRhcC5cbiAgICAgKi9cbiAgICBhc3luYyB0YXAoeCwgeSkge1xuICAgICAgICBhd2FpdCB0aGlzLnRvdWNoU3RhcnQoeCwgeSk7XG4gICAgICAgIGF3YWl0IHRoaXMudG91Y2hFbmQoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbnB1dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fcnVuSW5pdGlhbGl6ZXJzID0gKHRoaXMgJiYgdGhpcy5fX3J1bkluaXRpYWxpemVycykgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcbnZhciBfX2VzRGVjb3JhdGUgPSAodGhpcyAmJiB0aGlzLl9fZXNEZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gICAgZG9uZSA9IHRydWU7XG59O1xudmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbmltcG9ydCB7IGRlYnVnRXJyb3IsIHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlYWJsZSwgdGhyb3dJZkRpc3Bvc2VkIH0gZnJvbSAnLi4vdXRpbC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VTeW1ib2wsIGFzeW5jRGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYSBKYXZhU2NyaXB0IG9iamVjdC4gSW5zdGFuY2VzIGNhbiBiZSBjcmVhdGVkIHVzaW5nXG4gKiB7QGxpbmsgUGFnZS5ldmFsdWF0ZUhhbmRsZX0uXG4gKlxuICogSGFuZGxlcyBwcmV2ZW50IHRoZSByZWZlcmVuY2VkIEphdmFTY3JpcHQgb2JqZWN0IGZyb20gYmVpbmcgZ2FyYmFnZS1jb2xsZWN0ZWRcbiAqIHVubGVzcyB0aGUgaGFuZGxlIGlzIHB1cnBvc2VseSB7QGxpbmsgSlNIYW5kbGUuZGlzcG9zZSB8IGRpc3Bvc2VkfS4gSlNIYW5kbGVzXG4gKiBhcmUgYXV0by1kaXNwb3NlZCB3aGVuIHRoZWlyIGFzc29jaWF0ZWQgZnJhbWUgaXMgbmF2aWdhdGVkIGF3YXkgb3IgdGhlIHBhcmVudFxuICogY29udGV4dCBnZXRzIGRlc3Ryb3llZC5cbiAqXG4gKiBIYW5kbGVzIGNhbiBiZSB1c2VkIGFzIGFyZ3VtZW50cyBmb3IgYW55IGV2YWx1YXRpb24gZnVuY3Rpb24gc3VjaCBhc1xuICoge0BsaW5rIFBhZ2UuJGV2YWx9LCB7QGxpbmsgUGFnZS5ldmFsdWF0ZX0sIGFuZCB7QGxpbmsgUGFnZS5ldmFsdWF0ZUhhbmRsZX0uXG4gKiBUaGV5IGFyZSByZXNvbHZlZCB0byB0aGVpciByZWZlcmVuY2VkIG9iamVjdC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCB3aW5kb3dIYW5kbGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlSGFuZGxlKCgpID0+IHdpbmRvdyk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmxldCBKU0hhbmRsZSA9ICgoKSA9PiB7XG4gICAgbGV0IF9jbGFzc0RlY29yYXRvcnMgPSBbbW92ZWFibGVdO1xuICAgIGxldCBfY2xhc3NEZXNjcmlwdG9yO1xuICAgIGxldCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfY2xhc3NUaGlzO1xuICAgIGxldCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfZ2V0UHJvcGVydHlfZGVjb3JhdG9ycztcbiAgICBsZXQgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycztcbiAgICB2YXIgSlNIYW5kbGUgPSBjbGFzcyB7XG4gICAgICAgIHN0YXRpYyB7IF9jbGFzc1RoaXMgPSB0aGlzOyB9XG4gICAgICAgIHN0YXRpYyB7XG4gICAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZ2V0UHJvcGVydHlfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImdldFByb3BlcnR5XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJnZXRQcm9wZXJ0eVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmdldFByb3BlcnR5IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9nZXRQcm9wZXJ0aWVzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJnZXRQcm9wZXJ0aWVzXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJnZXRQcm9wZXJ0aWVzXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouZ2V0UHJvcGVydGllcyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZShudWxsLCBfY2xhc3NEZXNjcmlwdG9yID0geyB2YWx1ZTogX2NsYXNzVGhpcyB9LCBfY2xhc3NEZWNvcmF0b3JzLCB7IGtpbmQ6IFwiY2xhc3NcIiwgbmFtZTogX2NsYXNzVGhpcy5uYW1lLCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9jbGFzc0V4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIEpTSGFuZGxlID0gX2NsYXNzVGhpcyA9IF9jbGFzc0Rlc2NyaXB0b3IudmFsdWU7XG4gICAgICAgICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoX2NsYXNzVGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7XG4gICAgICAgICAgICBfX3J1bkluaXRpYWxpemVycyhfY2xhc3NUaGlzLCBfY2xhc3NFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICBfX3J1bkluaXRpYWxpemVycyh0aGlzLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCBoYW5kbGUgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlYWxtLmV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgdGhpcywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCBoYW5kbGUgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZXZhbHVhdGVIYW5kbGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlYWxtLmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgdGhpcywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ldmFsdWF0ZUhhbmRsZSgob2JqZWN0LCBwcm9wZXJ0eU5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0W3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICB9LCBwcm9wZXJ0eU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgbWFwIG9mIGhhbmRsZXMgcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IGhhbmRsZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgbGlzdEhhbmRsZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGVIYW5kbGUoKCkgPT4gZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gICAgICAgICAqIGNvbnN0IHByb3BlcnRpZXMgPSBhd2FpdCBsaXN0SGFuZGxlLmdldFByb3BlcnRpZXMoKTtcbiAgICAgICAgICogY29uc3QgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICogZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzLnZhbHVlcygpKSB7XG4gICAgICAgICAqICAgY29uc3QgZWxlbWVudCA9IHByb3BlcnR5LmFzRWxlbWVudCgpO1xuICAgICAgICAgKiAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAqICAgICBjaGlsZHJlbi5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgKiAgIH1cbiAgICAgICAgICogfVxuICAgICAgICAgKiBjaGlsZHJlbjsgLy8gaG9sZHMgZWxlbWVudEhhbmRsZXMgdG8gYWxsIGNoaWxkcmVuIG9mIGRvY3VtZW50LmJvZHlcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lcyA9IGF3YWl0IHRoaXMuZXZhbHVhdGUob2JqZWN0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnVtZXJhYmxlUHJvcGVydGllcyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiBkZXNjcmlwdG9ycykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcnNbcHJvcGVydHlOYW1lXT8uZW51bWVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBlbnVtZXJhYmxlUHJvcGVydGllcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb3BlcnR5TmFtZXMubWFwKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoa2V5KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHByb3BlcnR5TmFtZXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIHJlc3VsdHNba2V5XSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KHZhbHVlLCBoYW5kbGUubW92ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICAgICAgICAgIGVudl8xLmVycm9yID0gZV8xO1xuICAgICAgICAgICAgICAgICAgICBlbnZfMS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBbKF9nZXRQcm9wZXJ0eV9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpXSwgX2dldFByb3BlcnRpZXNfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKV0sIGRpc3Bvc2VTeW1ib2wpXSgpIHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZGlzcG9zZSgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgW2FzeW5jRGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBKU0hhbmRsZSA9IF9jbGFzc1RoaXM7XG59KSgpO1xuZXhwb3J0IHsgSlNIYW5kbGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUpTSGFuZGxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG52YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xuaW1wb3J0IHsgY29uY2F0LCBFTVBUWSwgZmlsdGVyLCBmaXJzdCwgZmlyc3RWYWx1ZUZyb20sIGZyb20sIG1hcCwgbWVyZ2UsIG1lcmdlTWFwLCBtZXJnZVNjYW4sIG9mLCByYWNlV2l0aCwgUmVwbGF5U3ViamVjdCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2UsIHRha2VVbnRpbCwgdGltZXIsIH0gZnJvbSAnLi4vLi4vdGhpcmRfcGFydHkvcnhqcy9yeGpzLmpzJztcbmltcG9ydCB7IFRhcmdldENsb3NlRXJyb3IgfSBmcm9tICcuLi9jb21tb24vRXJyb3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IFRpbWVvdXRTZXR0aW5ncyB9IGZyb20gJy4uL2NvbW1vbi9UaW1lb3V0U2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgZnJvbUVtaXR0ZXJFdmVudCwgZmlsdGVyQXN5bmMsIGltcG9ydEZTUHJvbWlzZXMsIGlzU3RyaW5nLCBORVRXT1JLX0lETEVfVElNRSwgdGltZW91dCwgd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSwgZnJvbUFib3J0U2lnbmFsLCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuLi91dGlsL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQXN5bmNEaXNwb3NhYmxlU3RhY2ssIGFzeW5jRGlzcG9zZVN5bWJvbCwgRGlzcG9zYWJsZVN0YWNrLCBkaXNwb3NlU3ltYm9sLCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG5pbXBvcnQgeyBGdW5jdGlvbkxvY2F0b3IsIExvY2F0b3IsIE5vZGVMb2NhdG9yLCB9IGZyb20gJy4vbG9jYXRvcnMvbG9jYXRvcnMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRTY3JlZW5zaG90T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgb3B0aW9ucy5vcHRpbWl6ZUZvclNwZWVkID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLnR5cGUgPz89ICdwbmcnO1xuICAgIG9wdGlvbnMuZnJvbVN1cmZhY2UgPz89IHRydWU7XG4gICAgb3B0aW9ucy5mdWxsUGFnZSA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5vbWl0QmFja2dyb3VuZCA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5lbmNvZGluZyA/Pz0gJ2JpbmFyeSc7XG4gICAgb3B0aW9ucy5jYXB0dXJlQmV5b25kVmlld3BvcnQgPz89IHRydWU7XG59XG4vKipcbiAqIFBhZ2UgcHJvdmlkZXMgbWV0aG9kcyB0byBpbnRlcmFjdCB3aXRoIGEgc2luZ2xlIHRhYiBvclxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmNocm9tZS5jb20vZXh0ZW5zaW9ucy9iYWNrZ3JvdW5kX3BhZ2VzIHwgZXh0ZW5zaW9uIGJhY2tncm91bmQgcGFnZX1cbiAqIGluIHRoZSBicm93c2VyLlxuICpcbiAqIDo6Om5vdGVcbiAqXG4gKiBPbmUgQnJvd3NlciBpbnN0YW5jZSBtaWdodCBoYXZlIG11bHRpcGxlIFBhZ2UgaW5zdGFuY2VzLlxuICpcbiAqIDo6OlxuICpcbiAqIEBleGFtcGxlXG4gKiBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIHBhZ2UsIG5hdmlnYXRlcyBpdCB0byBhIFVSTCwgYW5kIHRoZW4gc2F2ZXMgYSBzY3JlZW5zaG90OlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gKlxuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vZXhhbXBsZS5jb20nKTtcbiAqICAgYXdhaXQgcGFnZS5zY3JlZW5zaG90KHtwYXRoOiAnc2NyZWVuc2hvdC5wbmcnfSk7XG4gKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqIH0pKCk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgUGFnZSBjbGFzcyBleHRlbmRzIGZyb20gUHVwcGV0ZWVyJ3Mge0BsaW5rIEV2ZW50RW1pdHRlcn0gY2xhc3MgYW5kIHdpbGxcbiAqIGVtaXQgdmFyaW91cyBldmVudHMgd2hpY2ggYXJlIGRvY3VtZW50ZWQgaW4gdGhlIHtAbGluayBQYWdlRXZlbnR9IGVudW0uXG4gKlxuICogQGV4YW1wbGVcbiAqIFRoaXMgZXhhbXBsZSBsb2dzIGEgbWVzc2FnZSBmb3IgYSBzaW5nbGUgcGFnZSBgbG9hZGAgZXZlbnQ6XG4gKlxuICogYGBgdHNcbiAqIHBhZ2Uub25jZSgnbG9hZCcsICgpID0+IGNvbnNvbGUubG9nKCdQYWdlIGxvYWRlZCEnKSk7XG4gKiBgYGBcbiAqXG4gKiBUbyB1bnN1YnNjcmliZSBmcm9tIGV2ZW50cyB1c2UgdGhlIHtAbGluayBFdmVudEVtaXR0ZXIub2ZmfSBtZXRob2Q6XG4gKlxuICogYGBgdHNcbiAqIGZ1bmN0aW9uIGxvZ1JlcXVlc3QoaW50ZXJjZXB0ZWRSZXF1ZXN0KSB7XG4gKiAgIGNvbnNvbGUubG9nKCdBIHJlcXVlc3Qgd2FzIG1hZGU6JywgaW50ZXJjZXB0ZWRSZXF1ZXN0LnVybCgpKTtcbiAqIH1cbiAqIHBhZ2Uub24oJ3JlcXVlc3QnLCBsb2dSZXF1ZXN0KTtcbiAqIC8vIFNvbWV0aW1lIGxhdGVyLi4uXG4gKiBwYWdlLm9mZigncmVxdWVzdCcsIGxvZ1JlcXVlc3QpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5sZXQgUGFnZSA9ICgoKSA9PiB7XG4gICAgbGV0IF9jbGFzc1N1cGVyID0gRXZlbnRFbWl0dGVyO1xuICAgIGxldCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyA9IFtdO1xuICAgIGxldCBfc2NyZWVuc2hvdF9kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBQYWdlIGV4dGVuZHMgX2NsYXNzU3VwZXIge1xuICAgICAgICBzdGF0aWMge1xuICAgICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2NyZWVuc2hvdF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2NyZWVuc2hvdFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwic2NyZWVuc2hvdFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNjcmVlbnNob3QgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBpZiAoX21ldGFkYXRhKSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU3ltYm9sLm1ldGFkYXRhLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBfbWV0YWRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX2lzRHJhZ2dpbmcgPSAoX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpLCBmYWxzZSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIF90aW1lb3V0U2V0dGluZ3MgPSBuZXcgVGltZW91dFNldHRpbmdzKCk7XG4gICAgICAgICNyZXF1ZXN0SGFuZGxlcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAjaW5mbGlnaHQkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgICAgIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJyZXF1ZXN0XCIgLyogUGFnZUV2ZW50LlJlcXVlc3QgKi8pXG4gICAgICAgICAgICAgICAgLnBpcGUobWVyZ2VNYXAob3JpZ2luYWxSZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uY2F0KG9mKDEpLCBtZXJnZShmcm9tRW1pdHRlckV2ZW50KHRoaXMsIFwicmVxdWVzdGZhaWxlZFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0RmFpbGVkICovKSwgZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInJlcXVlc3RmaW5pc2hlZFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0RmluaXNoZWQgKi8pLCBmcm9tRW1pdHRlckV2ZW50KHRoaXMsIFwicmVzcG9uc2VcIiAvKiBQYWdlRXZlbnQuUmVzcG9uc2UgKi8pLnBpcGUobWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICB9KSkpLnBpcGUoZmlsdGVyKHJlcXVlc3QgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5pZCA9PT0gb3JpZ2luYWxSZXF1ZXN0LmlkO1xuICAgICAgICAgICAgICAgIH0pLCB0YWtlKDEpLCBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIH0pLCBtZXJnZVNjYW4oKGFjYywgYWRkZW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKGFjYyArIGFkZGVuZCk7XG4gICAgICAgICAgICB9LCAwKSwgdGFrZVVudGlsKGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykpLCBzdGFydFdpdGgoMCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLiNpbmZsaWdodCQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0ZW4gdG8gcGFnZSBldmVudHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGV4aXN0cyB0byBkZWZpbmUgZXZlbnQgdHlwaW5ncyBhbmQgaGFuZGxlIHByb3BlciB3aXJldXAgb2ZcbiAgICAgICAgICogY29vcGVyYXRpdmUgcmVxdWVzdCBpbnRlcmNlcHRpb24uIEFjdHVhbCBldmVudCBsaXN0ZW5pbmcgYW5kIGRpc3BhdGNoaW5nIGlzXG4gICAgICAgICAqIGRlbGVnYXRlZCB0byB7QGxpbmsgRXZlbnRFbWl0dGVyfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBvbih0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgICAgICBpZiAodHlwZSAhPT0gXCJyZXF1ZXN0XCIgLyogUGFnZUV2ZW50LlJlcXVlc3QgKi8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIub24odHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgd3JhcHBlciA9IHRoaXMuI3JlcXVlc3RIYW5kbGVycy5nZXQoaGFuZGxlcik7XG4gICAgICAgICAgICBpZiAod3JhcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5lbnF1ZXVlSW50ZXJjZXB0QWN0aW9uKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZXF1ZXN0SGFuZGxlcnMuc2V0KGhhbmRsZXIsIHdyYXBwZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uKHR5cGUsIHdyYXBwZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIG9mZih0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJyZXF1ZXN0XCIgLyogUGFnZUV2ZW50LlJlcXVlc3QgKi8pIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcmVxdWVzdEhhbmRsZXJzLmdldChoYW5kbGVyKSB8fCBoYW5kbGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9mZih0eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICoge0Bpbmhlcml0RG9jIEFjY2Vzc2liaWxpdHl9XG4gICAgICAgICAqL1xuICAgICAgICBnZXQgYWNjZXNzaWJpbGl0eSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLmFjY2Vzc2liaWxpdHk7XG4gICAgICAgIH1cbiAgICAgICAgbG9jYXRvcihzZWxlY3Rvck9yRnVuYykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxlY3Rvck9yRnVuYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTm9kZUxvY2F0b3IuY3JlYXRlKHRoaXMsIHNlbGVjdG9yT3JGdW5jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbkxvY2F0b3IuY3JlYXRlKHRoaXMsIHNlbGVjdG9yT3JGdW5jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQSBzaG9ydGN1dCBmb3Ige0BsaW5rIExvY2F0b3IucmFjZX0gdGhhdCBkb2VzIG5vdCByZXF1aXJlIHN0YXRpYyBpbXBvcnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIGxvY2F0b3JSYWNlKGxvY2F0b3JzKSB7XG4gICAgICAgICAgICByZXR1cm4gTG9jYXRvci5yYWNlKGxvY2F0b3JzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4gSWYgbm8gZWxlbWVudCBtYXRjaGVzXG4gICAgICAgICAqIHRoZSBzZWxlY3RvciwgdGhlIHJldHVybiB2YWx1ZSByZXNvbHZlcyB0byBgbnVsbGAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuJCB8IFBhZ2UubWFpbkZyYW1lKCkuJChzZWxlY3RvcikgfS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLiQoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaW5kcyBlbGVtZW50cyBvbiB0aGUgcGFnZSB0aGF0IG1hdGNoIHRoZSBzZWxlY3Rvci4gSWYgbm8gZWxlbWVudHNcbiAgICAgICAgICogbWF0Y2ggdGhlIHNlbGVjdG9yLCB0aGUgcmV0dXJuIHZhbHVlIHJlc29sdmVzIHRvIGBbXWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuJCQgfCBQYWdlLm1haW5GcmFtZSgpLiQkKHNlbGVjdG9yKSB9LlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgJCQoc2VsZWN0b3IsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLiQkKHNlbGVjdG9yLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHtAbGluayBQYWdlLmV2YWx1YXRlIHwgcGFnZS5ldmFsdWF0ZX0gYW5kXG4gICAgICAgICAqIGBwYWdlLmV2YWx1YXRlSGFuZGxlYCBpcyB0aGF0IGBldmFsdWF0ZUhhbmRsZWAgd2lsbCByZXR1cm4gdGhlIHZhbHVlXG4gICAgICAgICAqIHdyYXBwZWQgaW4gYW4gaW4tcGFnZSBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIElmIHRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gYHBhZ2UuZXZhbHVhdGVIYW5kbGVgIHJldHVybnMgYSBQcm9taXNlLCB0aGVcbiAgICAgICAgICogZnVuY3Rpb24gd2lsbCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0byByZXNvbHZlIGFuZCByZXR1cm4gaXRzIHZhbHVlLlxuICAgICAgICAgKlxuICAgICAgICAgKiBZb3UgY2FuIHBhc3MgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIChhbHRob3VnaCBmdW5jdGlvbnMgYXJlXG4gICAgICAgICAqIHJlY29tbWVuZGVkIGFzIHRoZXkgYXJlIGVhc2llciB0byBkZWJ1ZyBhbmQgdXNlIHdpdGggVHlwZVNjcmlwdCk6XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGFIYW5kbGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlSGFuZGxlKCdkb2N1bWVudCcpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICoge0BsaW5rIEpTSGFuZGxlfSBpbnN0YW5jZXMgY2FuIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gdGhlIGBwYWdlRnVuY3Rpb25gOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBhSGFuZGxlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZUhhbmRsZSgoKSA9PiBkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICogY29uc3QgcmVzdWx0SGFuZGxlID0gYXdhaXQgcGFnZS5ldmFsdWF0ZUhhbmRsZShcbiAgICAgICAgICogICBib2R5ID0+IGJvZHkuaW5uZXJIVE1MLFxuICAgICAgICAgKiAgIGFIYW5kbGVcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc29sZS5sb2coYXdhaXQgcmVzdWx0SGFuZGxlLmpzb25WYWx1ZSgpKTtcbiAgICAgICAgICogYXdhaXQgcmVzdWx0SGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIE1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEge0BsaW5rIEpTSGFuZGxlfSxcbiAgICAgICAgICogYnV0IGlmIGBwYWdlRnVuY3Rpb25gIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudCxcbiAgICAgICAgICogeW91IGluc3RlYWQgZ2V0IGFuIHtAbGluayBFbGVtZW50SGFuZGxlfSBiYWNrOlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBidXR0b24gPSBhd2FpdCBwYWdlLmV2YWx1YXRlSGFuZGxlKCgpID0+XG4gICAgICAgICAqICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYnV0dG9uJylcbiAgICAgICAgICogKTtcbiAgICAgICAgICogLy8gY2FuIGNhbGwgYGNsaWNrYCBiZWNhdXNlIGBidXR0b25gIGlzIGFuIGBFbGVtZW50SGFuZGxlYFxuICAgICAgICAgKiBhd2FpdCBidXR0b24uY2xpY2soKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBUeXBlU2NyaXB0IGRlZmluaXRpb25zIGFzc3VtZSB0aGF0IGBldmFsdWF0ZUhhbmRsZWAgcmV0dXJuc1xuICAgICAgICAgKiBhIGBKU0hhbmRsZWAsIGJ1dCBpZiB5b3Uga25vdyBpdCdzIGdvaW5nIHRvIHJldHVybiBhblxuICAgICAgICAgKiBgRWxlbWVudEhhbmRsZWAsIHBhc3MgaXQgYXMgdGhlIGdlbmVyaWMgYXJndW1lbnQ6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGJ1dHRvbiA9IGF3YWl0IHBhZ2UuZXZhbHVhdGVIYW5kbGU8RWxlbWVudEhhbmRsZT4oLi4uKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBhIGZ1bmN0aW9uIHRoYXQgaXMgcnVuIHdpdGhpbiB0aGUgcGFnZVxuICAgICAgICAgKiBAcGFyYW0gYXJncyAtIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHBhZ2VGdW5jdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZXZhbHVhdGVIYW5kbGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IHdpdGhpbiB0aGUgcGFnZSB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yXG4gICAgICAgICAqIGFuZCBwYXNzZXMgdGhlIHJlc3VsdCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBJZiBubyBlbGVtZW50IGlzIGZvdW5kIG1hdGNoaW5nIGBzZWxlY3RvcmAsIHRoZSBtZXRob2Qgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgYHBhZ2VGdW5jdGlvbmAgcmV0dXJucyBhIHByb21pc2UgYCRldmFsYCB3aWxsIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvXG4gICAgICAgICAqIHJlc29sdmUgYW5kIHRoZW4gcmV0dXJuIGl0cyB2YWx1ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VhcmNoVmFsdWUgPSBhd2FpdCBwYWdlLiRldmFsKCcjc2VhcmNoJywgZWwgPT4gZWwudmFsdWUpO1xuICAgICAgICAgKiBjb25zdCBwcmVsb2FkSHJlZiA9IGF3YWl0IHBhZ2UuJGV2YWwoJ2xpbmtbcmVsPXByZWxvYWRdJywgZWwgPT4gZWwuaHJlZik7XG4gICAgICAgICAqIGNvbnN0IGh0bWwgPSBhd2FpdCBwYWdlLiRldmFsKCcubWFpbi1jb250YWluZXInLCBlbCA9PiBlbC5vdXRlckhUTUwpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogSWYgeW91IGFyZSB1c2luZyBUeXBlU2NyaXB0LCB5b3UgbWF5IGhhdmUgdG8gcHJvdmlkZSBhbiBleHBsaWNpdCB0eXBlIHRvIHRoZVxuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgdHlwZWQgYXMgYEVsZW1lbnRgLCBidXQgeW91IG1heSBuZWVkIHRvIHByb3ZpZGUgYSBtb3JlXG4gICAgICAgICAqIHNwZWNpZmljIHN1Yi10eXBlOlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiAvLyBpZiB5b3UgZG9uJ3QgcHJvdmlkZSBIVE1MSW5wdXRFbGVtZW50IGhlcmUsIFRTIHdpbGwgZXJyb3JcbiAgICAgICAgICogLy8gYXMgYHZhbHVlYCBpcyBub3Qgb24gYEVsZW1lbnRgXG4gICAgICAgICAqIGNvbnN0IHNlYXJjaFZhbHVlID0gYXdhaXQgcGFnZS4kZXZhbChcbiAgICAgICAgICogICAnI3NlYXJjaCcsXG4gICAgICAgICAqICAgKGVsOiBIVE1MSW5wdXRFbGVtZW50KSA9PiBlbC52YWx1ZVxuICAgICAgICAgKiApO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIGluZmVyIHRoZSByZXR1cm4gdHlwZVxuICAgICAgICAgKiBmcm9tIHRoZSBgcGFnZUZ1bmN0aW9uYCB5b3UgcHJvdmlkZS4gSWYgaXQgaXMgdW5hYmxlIHRvLCB5b3UgY2FuIHVzZSB0aGUgZ2VuZXJpY1xuICAgICAgICAgKiB0eXBlIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHdoYXQgcmV0dXJuIHR5cGUgeW91IGV4cGVjdCBmcm9tIGAkZXZhbGA6XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIC8vIFRoZSBjb21waWxlciBjYW4gaW5mZXIgdGhlIHJldHVybiB0eXBlIGluIHRoaXMgY2FzZSwgYnV0IGlmIGl0IGNhbid0XG4gICAgICAgICAqIC8vIG9yIGlmIHlvdSB3YW50IHRvIGJlIG1vcmUgZXhwbGljaXQsIHByb3ZpZGUgaXQgYXMgdGhlIGdlbmVyaWMgdHlwZS5cbiAgICAgICAgICogY29uc3Qgc2VhcmNoVmFsdWUgPSBhd2FpdCBwYWdlLiRldmFsPHN0cmluZz4oXG4gICAgICAgICAqICAgJyNzZWFyY2gnLFxuICAgICAgICAgKiAgIChlbDogSFRNTElucHV0RWxlbWVudCkgPT4gZWwudmFsdWVcbiAgICAgICAgICogKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSB0aGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBwYWdlIGNvbnRleHQuXG4gICAgICAgICAqIFdpbGwgYmUgcGFzc2VkIHRoZSByZXN1bHQgb2YgdGhlIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yIGFzIGl0c1xuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0aHJvdWdoIHRvIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgYHBhZ2VGdW5jdGlvbmAuIElmIGl0IHJldHVybnMgYW4gZWxlbWVudCBpdFxuICAgICAgICAgKiBpcyB3cmFwcGVkIGluIGFuIHtAbGluayBFbGVtZW50SGFuZGxlfSwgZWxzZSB0aGUgcmF3IHZhbHVlIGl0c2VsZiBpc1xuICAgICAgICAgKiByZXR1cm5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICRldmFsKHNlbGVjdG9yLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy4kZXZhbC5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuJGV2YWwoc2VsZWN0b3IsIHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvciBhbmQgcGFzc2VzIHRoZVxuICAgICAgICAgKiByZXN1bHRpbmcgYXJyYXkgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBgcGFnZUZ1bmN0aW9uYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogSWYgYHBhZ2VGdW5jdGlvbmAgcmV0dXJucyBhIHByb21pc2UgYCQkZXZhbGAgd2lsbCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0b1xuICAgICAgICAgKiByZXNvbHZlIGFuZCB0aGVuIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIC8vIGdldCB0aGUgYW1vdW50IG9mIGRpdnMgb24gdGhlIHBhZ2VcbiAgICAgICAgICogY29uc3QgZGl2Q291bnQgPSBhd2FpdCBwYWdlLiQkZXZhbCgnZGl2JywgZGl2cyA9PiBkaXZzLmxlbmd0aCk7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIGdldCB0aGUgdGV4dCBjb250ZW50IG9mIGFsbCB0aGUgYC5vcHRpb25zYCBlbGVtZW50czpcbiAgICAgICAgICogY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHBhZ2UuJCRldmFsKCdkaXYgPiBzcGFuLm9wdGlvbnMnLCBvcHRpb25zID0+IHtcbiAgICAgICAgICogICByZXR1cm4gb3B0aW9ucy5tYXAob3B0aW9uID0+IG9wdGlvbi50ZXh0Q29udGVudCk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogSWYgeW91IGFyZSB1c2luZyBUeXBlU2NyaXB0LCB5b3UgbWF5IGhhdmUgdG8gcHJvdmlkZSBhbiBleHBsaWNpdCB0eXBlIHRvIHRoZVxuICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCBvZiB0aGUgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgdHlwZWQgYXMgYEVsZW1lbnRbXWAsIGJ1dCB5b3UgbWF5IG5lZWQgdG8gcHJvdmlkZSBhIG1vcmVcbiAgICAgICAgICogc3BlY2lmaWMgc3ViLXR5cGU6XG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGF3YWl0IHBhZ2UuJCRldmFsKCdpbnB1dCcsIGVsZW1lbnRzID0+IHtcbiAgICAgICAgICogICByZXR1cm4gZWxlbWVudHMubWFwKGUgPT4gZS52YWx1ZSk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIGluZmVyIHRoZSByZXR1cm4gdHlwZVxuICAgICAgICAgKiBmcm9tIHRoZSBgcGFnZUZ1bmN0aW9uYCB5b3UgcHJvdmlkZS4gSWYgaXQgaXMgdW5hYmxlIHRvLCB5b3UgY2FuIHVzZSB0aGUgZ2VuZXJpY1xuICAgICAgICAgKiB0eXBlIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHdoYXQgcmV0dXJuIHR5cGUgeW91IGV4cGVjdCBmcm9tIGAkJGV2YWxgOlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCBhbGxJbnB1dFZhbHVlcyA9IGF3YWl0IHBhZ2UuJCRldmFsKCdpbnB1dCcsIGVsZW1lbnRzID0+XG4gICAgICAgICAqICAgZWxlbWVudHMubWFwKGUgPT4gZS50ZXh0Q29udGVudClcbiAgICAgICAgICogKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtXG4gICAgICAgICAqIHtAbGluayBodHRwczovL3BwdHIuZGV2L2d1aWRlcy9wYWdlLWludGVyYWN0aW9ucyNzZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogdG8gcXVlcnkgcGFnZSBmb3IuXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IENTUyBzZWxlY3RvcnN9XG4gICAgICAgICAqIGNhbiBiZSBwYXNzZWQgYXMtaXMgYW5kIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI25vbi1jc3Mtc2VsZWN0b3JzIHwgUHVwcGV0ZWVyLXNwZWNpZmljIHNlbGVjdG9yIHN5bnRheH1cbiAgICAgICAgICogYWxsb3dzIHF1ZXJpbmcgYnlcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3RleHQtc2VsZWN0b3JzLS1wLXRleHQgfCB0ZXh0fSxcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI2FyaWEtc2VsZWN0b3JzLS1wLWFyaWEgfCBhMTF5IHJvbGUgYW5kIG5hbWV9LFxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3hwYXRoLXNlbGVjdG9ycy0tcC14cGF0aCB8IHhwYXRofVxuICAgICAgICAgKiBhbmRcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3F1ZXJ5aW5nLWVsZW1lbnRzLWluLXNoYWRvdy1kb20gfCBjb21iaW5pbmcgdGhlc2UgcXVlcmllcyBhY3Jvc3Mgc2hhZG93IHJvb3RzfS5cbiAgICAgICAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzZWxlY3RvciB0eXBlIHVzaW5nIGFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vcHB0ci5kZXYvZ3VpZGVzL3BhZ2UtaW50ZXJhY3Rpb25zI3ByZWZpeGVkLXNlbGVjdG9yLXN5bnRheCB8IHByZWZpeH0uXG4gICAgICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSB0aGUgZnVuY3Rpb24gdG8gYmUgZXZhbHVhdGVkIGluIHRoZSBwYWdlIGNvbnRleHQuXG4gICAgICAgICAqIFdpbGwgYmUgcGFzc2VkIGFuIGFycmF5IG9mIG1hdGNoaW5nIGVsZW1lbnRzIGFzIGl0cyBmaXJzdCBhcmd1bWVudC5cbiAgICAgICAgICogQHBhcmFtIGFyZ3MgLSBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0aHJvdWdoIHRvIGBwYWdlRnVuY3Rpb25gLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgYHBhZ2VGdW5jdGlvbmAuIElmIGl0IHJldHVybnMgYW4gZWxlbWVudCBpdFxuICAgICAgICAgKiBpcyB3cmFwcGVkIGluIGFuIHtAbGluayBFbGVtZW50SGFuZGxlfSwgZWxzZSB0aGUgcmF3IHZhbHVlIGl0c2VsZiBpc1xuICAgICAgICAgKiByZXR1cm5lZC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jICQkZXZhbChzZWxlY3RvciwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuJCRldmFsLm5hbWUsIHBhZ2VGdW5jdGlvbik7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluRnJhbWUoKS4kJGV2YWwoc2VsZWN0b3IsIHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgYSBgPHNjcmlwdD5gIHRhZyBpbnRvIHRoZSBwYWdlIHdpdGggdGhlIGRlc2lyZWQgVVJMIG9yIGNvbnRlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFNob3J0Y3V0IGZvclxuICAgICAgICAgKiB7QGxpbmsgRnJhbWUuYWRkU2NyaXB0VGFnIHwgcGFnZS5tYWluRnJhbWUoKS5hZGRTY3JpcHRUYWcob3B0aW9ucyl9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBzY3JpcHQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIHtAbGluayBFbGVtZW50SGFuZGxlIHwgZWxlbWVudCBoYW5kbGV9IHRvIHRoZSBpbmplY3RlZFxuICAgICAgICAgKiBgPHNjcmlwdD5gIGVsZW1lbnQuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhZGRTY3JpcHRUYWcob3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuYWRkU2NyaXB0VGFnKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGFkZFN0eWxlVGFnKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmFkZFN0eWxlVGFnKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgcGFnZSdzIFVSTC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogU2hvcnRjdXQgZm9yIHtAbGluayBGcmFtZS51cmwgfCBwYWdlLm1haW5GcmFtZSgpLnVybCgpfS5cbiAgICAgICAgICovXG4gICAgICAgIHVybCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLnVybCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZnVsbCBIVE1MIGNvbnRlbnRzIG9mIHRoZSBwYWdlLCBpbmNsdWRpbmcgdGhlIERPQ1RZUEUuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjb250ZW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuY29udGVudCgpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBodG1sIC0gSFRNTCBtYXJrdXAgdG8gYXNzaWduIHRvIHRoZSBwYWdlLlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFBhcmFtZXRlcnMgdGhhdCBoYXMgc29tZSBwcm9wZXJ0aWVzLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2V0Q29udGVudChodG1sLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLnNldENvbnRlbnQoaHRtbCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHtAaW5oZXJpdERvYyBGcmFtZS5nb3RvfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZ290byh1cmwsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmdvdG8odXJsLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdHMgZm9yIHRoZSBwYWdlIHRvIG5hdmlnYXRlIHRvIGEgbmV3IFVSTCBvciB0byByZWxvYWQuIEl0IGlzIHVzZWZ1bCB3aGVuXG4gICAgICAgICAqIHlvdSBydW4gY29kZSB0aGF0IHdpbGwgaW5kaXJlY3RseSBjYXVzZSB0aGUgcGFnZSB0byBuYXZpZ2F0ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgW3Jlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICogICBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKCksIC8vIFRoZSBwcm9taXNlIHJlc29sdmVzIGFmdGVyIG5hdmlnYXRpb24gaGFzIGZpbmlzaGVkXG4gICAgICAgICAqICAgcGFnZS5jbGljaygnYS5teS1saW5rJyksIC8vIENsaWNraW5nIHRoZSBsaW5rIHdpbGwgaW5kaXJlY3RseSBjYXVzZSBhIG5hdmlnYXRpb25cbiAgICAgICAgICogXSk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBVc2FnZSBvZiB0aGVcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IaXN0b3J5X0FQSSB8IEhpc3RvcnkgQVBJfVxuICAgICAgICAgKiB0byBjaGFuZ2UgdGhlIFVSTCBpcyBjb25zaWRlcmVkIGEgbmF2aWdhdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBOYXZpZ2F0aW9uIHBhcmFtZXRlcnMgd2hpY2ggbWlnaHQgaGF2ZSB0aGUgZm9sbG93aW5nXG4gICAgICAgICAqIHByb3BlcnRpZXM6XG4gICAgICAgICAqIEByZXR1cm5zIEEgYFByb21pc2VgIHdoaWNoIHJlc29sdmVzIHRvIHRoZSBtYWluIHJlc291cmNlIHJlc3BvbnNlLlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIEluIGNhc2Ugb2YgbXVsdGlwbGUgcmVkaXJlY3RzLCB0aGUgbmF2aWdhdGlvbiB3aWxsIHJlc29sdmUgd2l0aCB0aGVcbiAgICAgICAgICogICByZXNwb25zZSBvZiB0aGUgbGFzdCByZWRpcmVjdC5cbiAgICAgICAgICogLSBJbiBjYXNlIG9mIG5hdmlnYXRpb24gdG8gYSBkaWZmZXJlbnQgYW5jaG9yIG9yIG5hdmlnYXRpb24gZHVlIHRvIEhpc3RvcnlcbiAgICAgICAgICogICBBUEkgdXNhZ2UsIHRoZSBuYXZpZ2F0aW9uIHdpbGwgcmVzb2x2ZSB3aXRoIGBudWxsYC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhaXRGb3JOYXZpZ2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkud2FpdEZvck5hdmlnYXRpb24ob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB1cmxPclByZWRpY2F0ZSAtIEEgVVJMIG9yIHByZWRpY2F0ZSB0byB3YWl0IGZvclxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHdhaXRpbmcgcGFyYW1ldGVyc1xuICAgICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSBtYXRjaGVkIHJlcXVlc3RcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgZmlyc3RSZXF1ZXN0ID0gYXdhaXQgcGFnZS53YWl0Rm9yUmVxdWVzdChcbiAgICAgICAgICogICAnaHR0cHM6Ly9leGFtcGxlLmNvbS9yZXNvdXJjZSdcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc3QgZmluYWxSZXF1ZXN0ID0gYXdhaXQgcGFnZS53YWl0Rm9yUmVxdWVzdChcbiAgICAgICAgICogICByZXF1ZXN0ID0+IHJlcXVlc3QudXJsKCkgPT09ICdodHRwczovL2V4YW1wbGUuY29tJ1xuICAgICAgICAgKiApO1xuICAgICAgICAgKiByZXR1cm4gZmluYWxSZXF1ZXN0LnJlc3BvbnNlKCk/Lm9rKCk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBPcHRpb25hbCBXYWl0aW5nIFBhcmFtZXRlcnMgaGF2ZTpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgdGltZW91dGA6IE1heGltdW0gd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcywgZGVmYXVsdHMgdG8gYDMwYCBzZWNvbmRzLCBwYXNzXG4gICAgICAgICAqICAgYDBgIHRvIGRpc2FibGUgdGhlIHRpbWVvdXQuIFRoZSBkZWZhdWx0IHZhbHVlIGNhbiBiZSBjaGFuZ2VkIGJ5IHVzaW5nIHRoZVxuICAgICAgICAgKiAgIHtAbGluayBQYWdlLnNldERlZmF1bHRUaW1lb3V0fSBtZXRob2QuXG4gICAgICAgICAqL1xuICAgICAgICB3YWl0Rm9yUmVxdWVzdCh1cmxPclByZWRpY2F0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSwgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxPclByZWRpY2F0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB1cmxPclByZWRpY2F0ZTtcbiAgICAgICAgICAgICAgICB1cmxPclByZWRpY2F0ZSA9IChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnVybCgpID09PSB1cmw7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmFibGUkID0gZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcInJlcXVlc3RcIiAvKiBQYWdlRXZlbnQuUmVxdWVzdCAqLykucGlwZShmaWx0ZXJBc3luYyh1cmxPclByZWRpY2F0ZSksIHJhY2VXaXRoKHRpbWVvdXQobXMpLCBmcm9tQWJvcnRTaWduYWwoc2lnbmFsKSwgZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcImNsb3NlXCIgLyogUGFnZUV2ZW50LkNsb3NlICovKS5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldENsb3NlRXJyb3IoJ1BhZ2UgY2xvc2VkIScpO1xuICAgICAgICAgICAgfSkpKSk7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20ob2JzZXJ2YWJsZSQpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gdXJsT3JQcmVkaWNhdGUgLSBBIFVSTCBvciBwcmVkaWNhdGUgdG8gd2FpdCBmb3IuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgd2FpdGluZyBwYXJhbWV0ZXJzXG4gICAgICAgICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIG1hdGNoZWQgcmVzcG9uc2UuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBhd2FpdCBwYWdlLndhaXRGb3JSZXNwb25zZShcbiAgICAgICAgICogICAnaHR0cHM6Ly9leGFtcGxlLmNvbS9yZXNvdXJjZSdcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc3QgZmluYWxSZXNwb25zZSA9IGF3YWl0IHBhZ2Uud2FpdEZvclJlc3BvbnNlKFxuICAgICAgICAgKiAgIHJlc3BvbnNlID0+XG4gICAgICAgICAqICAgICByZXNwb25zZS51cmwoKSA9PT0gJ2h0dHBzOi8vZXhhbXBsZS5jb20nICYmIHJlc3BvbnNlLnN0YXR1cygpID09PSAyMDBcbiAgICAgICAgICogKTtcbiAgICAgICAgICogY29uc3QgZmluYWxSZXNwb25zZSA9IGF3YWl0IHBhZ2Uud2FpdEZvclJlc3BvbnNlKGFzeW5jIHJlc3BvbnNlID0+IHtcbiAgICAgICAgICogICByZXR1cm4gKGF3YWl0IHJlc3BvbnNlLnRleHQoKSkuaW5jbHVkZXMoJzxodG1sPicpO1xuICAgICAgICAgKiB9KTtcbiAgICAgICAgICogcmV0dXJuIGZpbmFsUmVzcG9uc2Uub2soKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIE9wdGlvbmFsIFBhcmFtZXRlciBoYXZlOlxuICAgICAgICAgKlxuICAgICAgICAgKiAtIGB0aW1lb3V0YDogTWF4aW11bSB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLCBkZWZhdWx0cyB0byBgMzBgIHNlY29uZHMsXG4gICAgICAgICAqICAgcGFzcyBgMGAgdG8gZGlzYWJsZSB0aGUgdGltZW91dC4gVGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWQgYnkgdXNpbmdcbiAgICAgICAgICogICB0aGUge0BsaW5rIFBhZ2Uuc2V0RGVmYXVsdFRpbWVvdXR9IG1ldGhvZC5cbiAgICAgICAgICovXG4gICAgICAgIHdhaXRGb3JSZXNwb25zZSh1cmxPclByZWRpY2F0ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSwgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxPclByZWRpY2F0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB1cmxPclByZWRpY2F0ZTtcbiAgICAgICAgICAgICAgICB1cmxPclByZWRpY2F0ZSA9IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UudXJsKCkgPT09IHVybDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSQgPSBmcm9tRW1pdHRlckV2ZW50KHRoaXMsIFwicmVzcG9uc2VcIiAvKiBQYWdlRXZlbnQuUmVzcG9uc2UgKi8pLnBpcGUoZmlsdGVyQXN5bmModXJsT3JQcmVkaWNhdGUpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSwgZnJvbUFib3J0U2lnbmFsKHNpZ25hbCksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRDbG9zZUVycm9yKCdQYWdlIGNsb3NlZCEnKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKG9ic2VydmFibGUkKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdHMgZm9yIHRoZSBuZXR3b3JrIHRvIGJlIGlkbGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgd2FpdGluZyBiZWhhdmlvci5cbiAgICAgICAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIG9uY2UgdGhlIG5ldHdvcmsgaXMgaWRsZS5cbiAgICAgICAgICovXG4gICAgICAgIHdhaXRGb3JOZXR3b3JrSWRsZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLndhaXRGb3JOZXR3b3JrSWRsZSQob3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAaW50ZXJuYWxcbiAgICAgICAgICovXG4gICAgICAgIHdhaXRGb3JOZXR3b3JrSWRsZSQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSwgaWRsZVRpbWUgPSBORVRXT1JLX0lETEVfVElNRSwgY29uY3VycmVuY3kgPSAwLCBzaWduYWwsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2luZmxpZ2h0JC5waXBlKHN3aXRjaE1hcChpbmZsaWdodCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZmxpZ2h0ID4gY29uY3VycmVuY3kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGltZXIoaWRsZVRpbWUpO1xuICAgICAgICAgICAgfSksIG1hcCgoKSA9PiB7IH0pLCByYWNlV2l0aCh0aW1lb3V0KG1zKSwgZnJvbUFib3J0U2lnbmFsKHNpZ25hbCksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRDbG9zZUVycm9yKCdQYWdlIGNsb3NlZCEnKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXYWl0cyBmb3IgYSBmcmFtZSBtYXRjaGluZyB0aGUgZ2l2ZW4gY29uZGl0aW9ucyB0byBhcHBlYXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGZyYW1lID0gYXdhaXQgcGFnZS53YWl0Rm9yRnJhbWUoYXN5bmMgZnJhbWUgPT4ge1xuICAgICAgICAgKiAgIHJldHVybiBmcmFtZS5uYW1lKCkgPT09ICdUZXN0JztcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FpdEZvckZyYW1lKHVybE9yUHJlZGljYXRlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGltZW91dDogbXMgPSB0aGlzLmdldERlZmF1bHRUaW1lb3V0KCksIHNpZ25hbCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGlmIChpc1N0cmluZyh1cmxPclByZWRpY2F0ZSkpIHtcbiAgICAgICAgICAgICAgICB1cmxPclByZWRpY2F0ZSA9IChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsT3JQcmVkaWNhdGUgPT09IGZyYW1lLnVybCgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZmlyc3RWYWx1ZUZyb20obWVyZ2UoZnJvbUVtaXR0ZXJFdmVudCh0aGlzLCBcImZyYW1lYXR0YWNoZWRcIiAvKiBQYWdlRXZlbnQuRnJhbWVBdHRhY2hlZCAqLyksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJmcmFtZW5hdmlnYXRlZFwiIC8qIFBhZ2VFdmVudC5GcmFtZU5hdmlnYXRlZCAqLyksIGZyb20odGhpcy5mcmFtZXMoKSkpLnBpcGUoZmlsdGVyQXN5bmModXJsT3JQcmVkaWNhdGUpLCBmaXJzdCgpLCByYWNlV2l0aCh0aW1lb3V0KG1zKSwgZnJvbUFib3J0U2lnbmFsKHNpZ25hbCksIGZyb21FbWl0dGVyRXZlbnQodGhpcywgXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRDbG9zZUVycm9yKCdQYWdlIGNsb3NlZC4nKTtcbiAgICAgICAgICAgIH0pKSkpKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogRW11bGF0ZXMgYSBnaXZlbiBkZXZpY2UncyBtZXRyaWNzIGFuZCB1c2VyIGFnZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBhaWQgZW11bGF0aW9uLCBQdXBwZXRlZXIgcHJvdmlkZXMgYSBsaXN0IG9mIGtub3duIGRldmljZXMgdGhhdCBjYW4gYmVcbiAgICAgICAgICogdmlhIHtAbGluayBLbm93bkRldmljZXN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhIHNob3J0Y3V0IGZvciBjYWxsaW5nIHR3byBtZXRob2RzOlxuICAgICAgICAgKiB7QGxpbmsgUGFnZS5zZXRVc2VyQWdlbnR9IGFuZCB7QGxpbmsgUGFnZS5zZXRWaWV3cG9ydH0uXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmVzaXplIHRoZSBwYWdlLiBBIGxvdCBvZiB3ZWJzaXRlcyBkb24ndCBleHBlY3QgcGhvbmVzIHRvXG4gICAgICAgICAqIGNoYW5nZSBzaXplLCBzbyB5b3Ugc2hvdWxkIGVtdWxhdGUgYmVmb3JlIG5hdmlnYXRpbmcgdG8gdGhlIHBhZ2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGltcG9ydCB7S25vd25EZXZpY2VzfSBmcm9tICdwdXBwZXRlZXInO1xuICAgICAgICAgKiBjb25zdCBpUGhvbmUgPSBLbm93bkRldmljZXNbJ2lQaG9uZSA2J107XG4gICAgICAgICAqXG4gICAgICAgICAqIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgICAgICAqICAgYXdhaXQgcGFnZS5lbXVsYXRlKGlQaG9uZSk7XG4gICAgICAgICAqICAgYXdhaXQgcGFnZS5nb3RvKCdodHRwczovL3d3dy5nb29nbGUuY29tJyk7XG4gICAgICAgICAqICAgLy8gb3RoZXIgYWN0aW9ucy4uLlxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBlbXVsYXRlKGRldmljZSkge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VXNlckFnZW50KGRldmljZS51c2VyQWdlbnQpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Vmlld3BvcnQoZGV2aWNlLnZpZXdwb3J0KSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFdmFsdWF0ZXMgYSBmdW5jdGlvbiBpbiB0aGUgcGFnZSdzIGNvbnRleHQgYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgdGhlIGZ1bmN0aW9uIHBhc3NlZCB0byBgcGFnZS5ldmFsdWF0ZWAgcmV0dXJucyBhIFByb21pc2UsIHRoZVxuICAgICAgICAgKiBmdW5jdGlvbiB3aWxsIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvIHJlc29sdmUgYW5kIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZyYW1lLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICogICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKDggKiA3KTtcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdCk7IC8vIHByaW50cyBcIjU2XCJcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIFlvdSBjYW4gcGFzcyBhIHN0cmluZyBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gKGFsdGhvdWdoIGZ1bmN0aW9ucyBhcmVcbiAgICAgICAgICogcmVjb21tZW5kZWQgYXMgdGhleSBhcmUgZWFzaWVyIHRvIGRlYnVnIGFuZCB1c2Ugd2l0aCBUeXBlU2NyaXB0KTpcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgYUhhbmRsZSA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoJzEgKyAyJyk7XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBUbyBnZXQgdGhlIGJlc3QgVHlwZVNjcmlwdCBleHBlcmllbmNlLCB5b3Ugc2hvdWxkIHBhc3MgaW4gYXMgdGhlXG4gICAgICAgICAqIGdlbmVyaWMgdGhlIHR5cGUgb2YgYHBhZ2VGdW5jdGlvbmA6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGFIYW5kbGUgPSBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IDIpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICoge0BsaW5rIEVsZW1lbnRIYW5kbGV9IGluc3RhbmNlcyAoaW5jbHVkaW5nIHtAbGluayBKU0hhbmRsZX1zKSBjYW4gYmUgcGFzc2VkXG4gICAgICAgICAqIGFzIGFyZ3VtZW50cyB0byB0aGUgYHBhZ2VGdW5jdGlvbmA6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGNvbnN0IGJvZHlIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJ2JvZHknKTtcbiAgICAgICAgICogY29uc3QgaHRtbCA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoYm9keSA9PiBib2R5LmlubmVySFRNTCwgYm9keUhhbmRsZSk7XG4gICAgICAgICAqIGF3YWl0IGJvZHlIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHBhZ2VGdW5jdGlvbiAtIGEgZnVuY3Rpb24gdGhhdCBpcyBydW4gd2l0aGluIHRoZSBwYWdlXG4gICAgICAgICAqIEBwYXJhbSBhcmdzIC0gYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgcGFnZUZ1bmN0aW9uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHRoZSByZXR1cm4gdmFsdWUgb2YgYHBhZ2VGdW5jdGlvbmAuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBldmFsdWF0ZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHBhZ2VGdW5jdGlvbiA9IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUodGhpcy5ldmFsdWF0ZS5uYW1lLCBwYWdlRnVuY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuZXZhbHVhdGUocGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBfbWF5YmVXcml0ZUJ1ZmZlclRvRmlsZShwYXRoLCBidWZmZXIpIHtcbiAgICAgICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0RlNQcm9taXNlcygpO1xuICAgICAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGgsIGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhcHR1cmVzIGEgc2NyZWVuY2FzdCBvZiB0aGlzIHtAbGluayBQYWdlIHwgcGFnZX0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIFJlY29yZGluZyBhIHtAbGluayBQYWdlIHwgcGFnZX06XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIExhdW5jaCBhIGJyb3dzZXJcbiAgICAgICAgICogY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgICpcbiAgICAgICAgICogLy8gQ3JlYXRlIGEgbmV3IHBhZ2VcbiAgICAgICAgICogY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBHbyB0byB5b3VyIHNpdGUuXG4gICAgICAgICAqIGF3YWl0IHBhZ2UuZ290byhcImh0dHBzOi8vd3d3LmV4YW1wbGUuY29tXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAvLyBTdGFydCByZWNvcmRpbmcuXG4gICAgICAgICAqIGNvbnN0IHJlY29yZGVyID0gYXdhaXQgcGFnZS5zY3JlZW5jYXN0KHtwYXRoOiAncmVjb3JkaW5nLndlYm0nfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIC8vIERvIHNvbWV0aGluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogLy8gU3RvcCByZWNvcmRpbmcuXG4gICAgICAgICAqIGF3YWl0IHJlY29yZGVyLnN0b3AoKTtcbiAgICAgICAgICpcbiAgICAgICAgICogYnJvd3Nlci5jbG9zZSgpO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmVzIHNjcmVlbmNhc3QgYmVoYXZpb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogQWxsIHJlY29yZGluZ3Mgd2lsbCBiZSB7QGxpbmsgaHR0cHM6Ly93d3cud2VibXByb2plY3Qub3JnLyB8IFdlYk19IGZvcm1hdCB1c2luZ1xuICAgICAgICAgKiB0aGUge0BsaW5rIGh0dHBzOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy92cDkvIHwgVlA5fSB2aWRlbyBjb2RlYy4gVGhlIEZQUyBpcyAzMC5cbiAgICAgICAgICpcbiAgICAgICAgICogWW91IG11c3QgaGF2ZSB7QGxpbmsgaHR0cHM6Ly9mZm1wZWcub3JnLyB8IGZmbXBlZ30gaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2NyZWVuY2FzdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IFt7IFNjcmVlblJlY29yZGVyIH0sIFt3aWR0aCwgaGVpZ2h0LCBkZXZpY2VQaXhlbFJhdGlvXV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgaW1wb3J0KCcuLi9ub2RlL1NjcmVlblJlY29yZGVyLmpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy4jZ2V0TmF0aXZlUGl4ZWxEaW1lbnNpb25zKCksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIGxldCBjcm9wO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY3JvcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgeCwgeSwgd2lkdGg6IGNyb3BXaWR0aCwgaGVpZ2h0OiBjcm9wSGVpZ2h0LCB9ID0gcm91bmRSZWN0YW5nbGUobm9ybWFsaXplUmVjdGFuZ2xlKG9wdGlvbnMuY3JvcCkpO1xuICAgICAgICAgICAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYGNyb3AueFxcYCBhbmQgXFxgY3JvcC55XFxgIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjcm9wV2lkdGggPD0gMCB8fCBjcm9wSGVpZ2h0IDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGBjcm9wLmhlaWdodFxcYCBhbmQgXFxgY3JvcC53aWR0aFxcYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2lkdGggLyBkZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gaGVpZ2h0IC8gZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgICAgICAgICBpZiAoeCArIGNyb3BXaWR0aCA+IHZpZXdwb3J0V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGBjcm9wLndpZHRoXFxgIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgdmlld3BvcnQgd2lkdGggKCR7dmlld3BvcnRXaWR0aH0pLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoeSArIGNyb3BIZWlnaHQgPiB2aWV3cG9ydEhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYGNyb3AuaGVpZ2h0XFxgIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgdmlld3BvcnQgaGVpZ2h0ICgke3ZpZXdwb3J0SGVpZ2h0fSkuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNyb3AgPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6IHggKiBkZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICB5OiB5ICogZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNyb3BXaWR0aCAqIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogY3JvcEhlaWdodCAqIGRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnNwZWVkICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zcGVlZCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcXGBzcGVlZFxcYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2NhbGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnNjYWxlIDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxcYHNjYWxlXFxgIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZWNvcmRlciA9IG5ldyBTY3JlZW5SZWNvcmRlcih0aGlzLCB3aWR0aCwgaGVpZ2h0LCB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICBwYXRoOiBvcHRpb25zLmZmbXBlZ1BhdGgsXG4gICAgICAgICAgICAgICAgY3JvcCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zdGFydFNjcmVlbmNhc3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHZvaWQgcmVjb3JkZXIuc3RvcCgpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGF0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY3JlYXRlV3JpdGVTdHJlYW0gfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBjcmVhdGVXcml0ZVN0cmVhbShvcHRpb25zLnBhdGgsICdiaW5hcnknKTtcbiAgICAgICAgICAgICAgICByZWNvcmRlci5waXBlKHN0cmVhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgI3NjcmVlbmNhc3RTZXNzaW9uQ291bnQgPSAwO1xuICAgICAgICAjc3RhcnRTY3JlZW5jYXN0UHJvbWlzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgX3N0YXJ0U2NyZWVuY2FzdCgpIHtcbiAgICAgICAgICAgICsrdGhpcy4jc2NyZWVuY2FzdFNlc3Npb25Db3VudDtcbiAgICAgICAgICAgIGlmICghdGhpcy4jc3RhcnRTY3JlZW5jYXN0UHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI3N0YXJ0U2NyZWVuY2FzdFByb21pc2UgPSB0aGlzLm1haW5GcmFtZSgpXG4gICAgICAgICAgICAgICAgICAgIC5jbGllbnQuc2VuZCgnUGFnZS5zdGFydFNjcmVlbmNhc3QnLCB7IGZvcm1hdDogJ3BuZycgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgZmlyc3QgZnJhbWUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLmNsaWVudC5vbmNlKCdQYWdlLnNjcmVlbmNhc3RGcmFtZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy4jc3RhcnRTY3JlZW5jYXN0UHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBfc3RvcFNjcmVlbmNhc3QoKSB7XG4gICAgICAgICAgICAtLXRoaXMuI3NjcmVlbmNhc3RTZXNzaW9uQ291bnQ7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI3N0YXJ0U2NyZWVuY2FzdFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNzdGFydFNjcmVlbmNhc3RQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3NjcmVlbmNhc3RTZXNzaW9uQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLmNsaWVudC5zZW5kKCdQYWdlLnN0b3BTY3JlZW5jYXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG5hdGl2ZSwgbm9uLWVtdWxhdGVkIGRpbWVuc2lvbnMgb2YgdGhlIHZpZXdwb3J0LlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgI2dldE5hdGl2ZVBpeGVsRGltZW5zaW9ucygpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBuZXcgRGlzcG9zYWJsZVN0YWNrKCksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAodmlld3BvcnQgJiYgdmlld3BvcnQuZGV2aWNlU2NhbGVGYWN0b3IgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRWaWV3cG9ydCh7IC4uLnZpZXdwb3J0LCBkZXZpY2VTY2FsZUZhY3RvcjogMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2suZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCB0aGlzLnNldFZpZXdwb3J0KHZpZXdwb3J0KS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpXG4gICAgICAgICAgICAgICAgICAgIC5pc29sYXRlZFJlYWxtKClcbiAgICAgICAgICAgICAgICAgICAgLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy52aXN1YWxWaWV3cG9ydC53aWR0aCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnZpc3VhbFZpZXdwb3J0LmhlaWdodCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgZW52XzEuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhc3luYyBzY3JlZW5zaG90KHVzZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfZ3VhcmQgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMiwgYXdhaXQgdGhpcy5icm93c2VyQ29udGV4dCgpLnN0YXJ0U2NyZWVuc2hvdCgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2Ugc3RydWN0dXJlZENsb25lIGFmdGVyIE5vZGUgMTYgc3VwcG9ydCBpcyBkcm9wcGVkLlxuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnVzZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBjbGlwOiB1c2VyT3B0aW9ucy5jbGlwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi51c2VyT3B0aW9ucy5jbGlwLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5wYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBvcHRpb25zLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgd2UgY2Fubm90IHVzZSBOb2RlLmpzIGhlcmUgZHVlIHRvIGJyb3dzZXIgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZVBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZShmaWxlUGF0aC5sYXN0SW5kZXhPZignLicpICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGV4dGVuc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncG5nJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAncG5nJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2pwZWcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnanBnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnanBlZyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd3ZWJwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAnd2VicCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVhbGl0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1YWxpdHkgPCAwIHx8IG9wdGlvbnMucXVhbGl0eSA+IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAncXVhbGl0eScgKCR7b3B0aW9ucy5xdWFsaXR5fSkgdG8gYmUgYmV0d2VlbiAwIGFuZCAxMDAsIGluY2x1c2l2ZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICFbJ2pwZWcnLCAnd2VicCddLmluY2x1ZGVzKG9wdGlvbnMudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvcHRpb25zLnR5cGUgPz8gJ3BuZyd9IHNjcmVlbnNob3RzIGRvIG5vdCBzdXBwb3J0ICdxdWFsaXR5Jy5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jbGlwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNsaXAud2lkdGggPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ3dpZHRoJyBpbiAnY2xpcCcgbXVzdCBiZSBwb3NpdGl2ZS5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xpcC5oZWlnaHQgPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ2hlaWdodCcgaW4gJ2NsaXAnIG11c3QgYmUgcG9zaXRpdmUuXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldERlZmF1bHRTY3JlZW5zaG90T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8yLCBuZXcgQXN5bmNEaXNwb3NhYmxlU3RhY2soKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2xpcCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mdWxsUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ2NsaXAnIGFuZCAnZnVsbFBhZ2UnIGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jbGlwID0gcm91bmRSZWN0YW5nbGUobm9ybWFsaXplUmVjdGFuZ2xlKG9wdGlvbnMuY2xpcCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZnVsbFBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGBjYXB0dXJlQmV5b25kVmlld3BvcnRgIGlzIGBmYWxzZWAsIHRoZW4gd2Ugc2V0IHRoZSB2aWV3cG9ydCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSB0aGUgZnVsbCBwYWdlLiBOb3RlIHRoaXMgbWF5IGJlIGFmZmVjdGVkIGJ5IG9uLXBhZ2UgQ1NTIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSmF2YVNjcmlwdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5jYXB0dXJlQmV5b25kVmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxEaW1lbnNpb25zID0gYXdhaXQgdGhpcy5tYWluRnJhbWUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ldmFsdWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZWxlbWVudC5zY3JvbGxXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZWxlbWVudC5zY3JvbGxIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRWaWV3cG9ydCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnZpZXdwb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5zY3JvbGxEaW1lbnNpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLmRlZmVyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRWaWV3cG9ydCh2aWV3cG9ydCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNhcHR1cmVCZXlvbmRWaWV3cG9ydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLl9zY3JlZW5zaG90KG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVuY29kaW5nID09PSAnYmFzZTY0Jykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oZGF0YSwgJ2Jhc2U2NCcpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX21heWJlV3JpdGVCdWZmZXJUb0ZpbGUob3B0aW9ucy5wYXRoLCBidWZmZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yKSB7XG4gICAgICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzI7XG4gICAgICAgICAgICAgICAgZW52XzIuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0XzEgPSBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRfMSlcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVzdWx0XzE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBwYWdlJ3MgdGl0bGVcbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogU2hvcnRjdXQgZm9yIHtAbGluayBGcmFtZS50aXRsZSB8IHBhZ2UubWFpbkZyYW1lKCkudGl0bGUoKX0uXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0aXRsZSgpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLnRpdGxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYW4gZWxlbWVudCB3aXRoIGBzZWxlY3RvcmAsIHNjcm9sbHMgaXQgaW50byB2aWV3IGlmXG4gICAgICAgICAqIG5lZWRlZCwgYW5kIHRoZW4gdXNlcyB7QGxpbmsgUGFnZS5tb3VzZX0gdG8gY2xpY2sgaW4gdGhlIGNlbnRlciBvZiB0aGVcbiAgICAgICAgICogZWxlbWVudC4gSWYgdGhlcmUncyBubyBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAsIHRoZSBtZXRob2QgdGhyb3dzIGFuXG4gICAgICAgICAqIGVycm9yLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBCZWFyIGluIG1pbmQgdGhhdCBpZiBgY2xpY2soKWAgdHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIGV2ZW50IGFuZFxuICAgICAgICAgKiB0aGVyZSdzIGEgc2VwYXJhdGUgYHBhZ2Uud2FpdEZvck5hdmlnYXRpb24oKWAgcHJvbWlzZSB0byBiZSByZXNvbHZlZCwgeW91XG4gICAgICAgICAqIG1heSBlbmQgdXAgd2l0aCBhIHJhY2UgY29uZGl0aW9uIHRoYXQgeWllbGRzIHVuZXhwZWN0ZWQgcmVzdWx0cy4gVGhlXG4gICAgICAgICAqIGNvcnJlY3QgcGF0dGVybiBmb3IgY2xpY2sgYW5kIHdhaXQgZm9yIG5hdmlnYXRpb24gaXMgdGhlIGZvbGxvd2luZzpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3QgW3Jlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICogICBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKHdhaXRPcHRpb25zKSxcbiAgICAgICAgICogICBwYWdlLmNsaWNrKHNlbGVjdG9yLCBjbGlja09wdGlvbnMpLFxuICAgICAgICAgKiBdKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuY2xpY2sgfCBwYWdlLm1haW5GcmFtZSgpLmNsaWNrKHNlbGVjdG9yWywgb3B0aW9uc10pIH0uXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIEEgYHNlbGVjdG9yYCB0byBzZWFyY2ggZm9yIGVsZW1lbnQgdG8gY2xpY2suIElmIHRoZXJlIGFyZVxuICAgICAgICAgKiBtdWx0aXBsZSBlbGVtZW50cyBzYXRpc2Z5aW5nIHRoZSBgc2VsZWN0b3JgLCB0aGUgZmlyc3Qgd2lsbCBiZSBjbGlja2VkXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYE9iamVjdGBcbiAgICAgICAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAgaXNcbiAgICAgICAgICogc3VjY2Vzc2Z1bGx5IGNsaWNrZWQuIFRoZSBQcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgaWYgdGhlcmUgaXMgbm8gZWxlbWVudFxuICAgICAgICAgKiBtYXRjaGluZyBgc2VsZWN0b3JgLlxuICAgICAgICAgKi9cbiAgICAgICAgY2xpY2soc2VsZWN0b3IsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpLmNsaWNrKHNlbGVjdG9yLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBtZXRob2QgZmV0Y2hlcyBhbiBlbGVtZW50IHdpdGggYHNlbGVjdG9yYCBhbmQgZm9jdXNlcyBpdC4gSWYgdGhlcmUncyBub1xuICAgICAgICAgKiBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAsIHRoZSBtZXRob2QgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBBXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IHNlbGVjdG9yIH1cbiAgICAgICAgICogb2YgYW4gZWxlbWVudCB0byBmb2N1cy4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIHNhdGlzZnlpbmcgdGhlXG4gICAgICAgICAqIHNlbGVjdG9yLCB0aGUgZmlyc3Qgd2lsbCBiZSBmb2N1c2VkLlxuICAgICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgbWF0Y2hpbmcgc2VsZWN0b3IgaXNcbiAgICAgICAgICogc3VjY2Vzc2Z1bGx5IGZvY3VzZWQuIFRoZSBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQgaWYgdGhlcmUgaXMgbm8gZWxlbWVudFxuICAgICAgICAgKiBtYXRjaGluZyBzZWxlY3Rvci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICpcbiAgICAgICAgICogU2hvcnRjdXQgZm9yIHtAbGluayBGcmFtZS5mb2N1cyB8IHBhZ2UubWFpbkZyYW1lKCkuZm9jdXMoc2VsZWN0b3IpfS5cbiAgICAgICAgICovXG4gICAgICAgIGZvY3VzKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluRnJhbWUoKS5mb2N1cyhzZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYW4gZWxlbWVudCB3aXRoIGBzZWxlY3RvcmAsIHNjcm9sbHMgaXQgaW50byB2aWV3IGlmXG4gICAgICAgICAqIG5lZWRlZCwgYW5kIHRoZW4gdXNlcyB7QGxpbmsgUGFnZS5tb3VzZX1cbiAgICAgICAgICogdG8gaG92ZXIgb3ZlciB0aGUgY2VudGVyIG9mIHRoZSBlbGVtZW50LlxuICAgICAgICAgKiBJZiB0aGVyZSdzIG5vIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCwgdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIEFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIHRvIHNlYXJjaCBmb3IgZWxlbWVudCB0byBob3Zlci4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIHNhdGlzZnlpbmdcbiAgICAgICAgICogdGhlIHNlbGVjdG9yLCB0aGUgZmlyc3Qgd2lsbCBiZSBob3ZlcmVkLlxuICAgICAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCBpc1xuICAgICAgICAgKiBzdWNjZXNzZnVsbHkgaG92ZXJlZC4gUHJvbWlzZSBnZXRzIHJlamVjdGVkIGlmIHRoZXJlJ3Mgbm8gZWxlbWVudCBtYXRjaGluZ1xuICAgICAgICAgKiBgc2VsZWN0b3JgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKlxuICAgICAgICAgKiBTaG9ydGN1dCBmb3Ige0BsaW5rIFBhZ2UuaG92ZXIgfCBwYWdlLm1haW5GcmFtZSgpLmhvdmVyKHNlbGVjdG9yKX0uXG4gICAgICAgICAqL1xuICAgICAgICBob3ZlcihzZWxlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbkZyYW1lKCkuaG92ZXIoc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmlnZ2VycyBhIGBjaGFuZ2VgIGFuZCBgaW5wdXRgIGV2ZW50IG9uY2UgYWxsIHRoZSBwcm92aWRlZCBvcHRpb25zIGhhdmUgYmVlblxuICAgICAgICAgKiBzZWxlY3RlZC4gSWYgdGhlcmUncyBubyBgPHNlbGVjdD5gIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCwgdGhlIG1ldGhvZFxuICAgICAgICAgKiB0aHJvd3MgYW4gZXJyb3IuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIHBhZ2Uuc2VsZWN0KCdzZWxlY3QjY29sb3JzJywgJ2JsdWUnKTsgLy8gc2luZ2xlIHNlbGVjdGlvblxuICAgICAgICAgKiBwYWdlLnNlbGVjdCgnc2VsZWN0I2NvbG9ycycsICdyZWQnLCAnZ3JlZW4nLCAnYmx1ZScpOyAvLyBtdWx0aXBsZSBzZWxlY3Rpb25zXG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgLSBBXG4gICAgICAgICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1NlbGVjdG9ycyB8IFNlbGVjdG9yfVxuICAgICAgICAgKiB0byBxdWVyeSB0aGUgcGFnZSBmb3JcbiAgICAgICAgICogQHBhcmFtIHZhbHVlcyAtIFZhbHVlcyBvZiBvcHRpb25zIHRvIHNlbGVjdC4gSWYgdGhlIGA8c2VsZWN0PmAgaGFzIHRoZVxuICAgICAgICAgKiBgbXVsdGlwbGVgIGF0dHJpYnV0ZSwgYWxsIHZhbHVlcyBhcmUgY29uc2lkZXJlZCwgb3RoZXJ3aXNlIG9ubHkgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgKiBpcyB0YWtlbiBpbnRvIGFjY291bnQuXG4gICAgICAgICAqIEByZXR1cm5zXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUuc2VsZWN0IHwgcGFnZS5tYWluRnJhbWUoKS5zZWxlY3QoKX1cbiAgICAgICAgICovXG4gICAgICAgIHNlbGVjdChzZWxlY3RvciwgLi4udmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluRnJhbWUoKS5zZWxlY3Qoc2VsZWN0b3IsIC4uLnZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgYW4gZWxlbWVudCB3aXRoIGBzZWxlY3RvcmAsIHNjcm9sbHMgaXQgaW50byB2aWV3IGlmXG4gICAgICAgICAqIG5lZWRlZCwgYW5kIHRoZW4gdXNlcyB7QGxpbmsgUGFnZS50b3VjaHNjcmVlbn1cbiAgICAgICAgICogdG8gdGFwIGluIHRoZSBjZW50ZXIgb2YgdGhlIGVsZW1lbnQuXG4gICAgICAgICAqIElmIHRoZXJlJ3Mgbm8gZWxlbWVudCBtYXRjaGluZyBgc2VsZWN0b3JgLCB0aGUgbWV0aG9kIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gQVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBTZWxlY3Rvcn1cbiAgICAgICAgICogdG8gc2VhcmNoIGZvciBlbGVtZW50IHRvIHRhcC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIHNhdGlzZnlpbmcgdGhlXG4gICAgICAgICAqIHNlbGVjdG9yLCB0aGUgZmlyc3Qgd2lsbCBiZSB0YXBwZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqXG4gICAgICAgICAqIFNob3J0Y3V0IGZvciB7QGxpbmsgRnJhbWUudGFwIHwgcGFnZS5tYWluRnJhbWUoKS50YXAoc2VsZWN0b3IpfS5cbiAgICAgICAgICovXG4gICAgICAgIHRhcChzZWxlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbkZyYW1lKCkudGFwKHNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZHMgYSBga2V5ZG93bmAsIGBrZXlwcmVzcy9pbnB1dGAsIGFuZCBga2V5dXBgIGV2ZW50IGZvciBlYWNoIGNoYXJhY3RlclxuICAgICAgICAgKiBpbiB0aGUgdGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogVG8gcHJlc3MgYSBzcGVjaWFsIGtleSwgbGlrZSBgQ29udHJvbGAgb3IgYEFycm93RG93bmAsIHVzZSB7QGxpbmsgS2V5Ym9hcmQucHJlc3N9LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBhd2FpdCBwYWdlLnR5cGUoJyNteXRleHRhcmVhJywgJ0hlbGxvJyk7XG4gICAgICAgICAqIC8vIFR5cGVzIGluc3RhbnRseVxuICAgICAgICAgKiBhd2FpdCBwYWdlLnR5cGUoJyNteXRleHRhcmVhJywgJ1dvcmxkJywge2RlbGF5OiAxMDB9KTtcbiAgICAgICAgICogLy8gVHlwZXMgc2xvd2VyLCBsaWtlIGEgdXNlclxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIC0gQVxuICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TZWxlY3RvcnMgfCBzZWxlY3Rvcn1cbiAgICAgICAgICogb2YgYW4gZWxlbWVudCB0byB0eXBlIGludG8uIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cyBzYXRpc2Z5aW5nIHRoZVxuICAgICAgICAgKiBzZWxlY3RvciwgdGhlIGZpcnN0IHdpbGwgYmUgdXNlZC5cbiAgICAgICAgICogQHBhcmFtIHRleHQgLSBBIHRleHQgdG8gdHlwZSBpbnRvIGEgZm9jdXNlZCBlbGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGhhdmUgcHJvcGVydHkgYGRlbGF5YCB3aGljaCBpcyB0aGUgVGltZSB0byB3YWl0IGJldHdlZW5cbiAgICAgICAgICoga2V5IHByZXNzZXMgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byBgMGAuXG4gICAgICAgICAqIEByZXR1cm5zXG4gICAgICAgICAqL1xuICAgICAgICB0eXBlKHNlbGVjdG9yLCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYWluRnJhbWUoKS50eXBlKHNlbGVjdG9yLCB0ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogV2FpdCBmb3IgdGhlIGBzZWxlY3RvcmAgdG8gYXBwZWFyIGluIHBhZ2UuIElmIGF0IHRoZSBtb21lbnQgb2YgY2FsbGluZyB0aGVcbiAgICAgICAgICogbWV0aG9kIHRoZSBgc2VsZWN0b3JgIGFscmVhZHkgZXhpc3RzLCB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LiBJZlxuICAgICAgICAgKiB0aGUgYHNlbGVjdG9yYCBkb2Vzbid0IGFwcGVhciBhZnRlciB0aGUgYHRpbWVvdXRgIG1pbGxpc2Vjb25kcyBvZiB3YWl0aW5nLCB0aGVcbiAgICAgICAgICogZnVuY3Rpb24gd2lsbCB0aHJvdy5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogVGhpcyBtZXRob2Qgd29ya3MgYWNyb3NzIG5hdmlnYXRpb25zOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG4gICAgICAgICAqIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gICAgICAgICAqICAgbGV0IGN1cnJlbnRVUkw7XG4gICAgICAgICAqICAgcGFnZVxuICAgICAgICAgKiAgICAgLndhaXRGb3JTZWxlY3RvcignaW1nJylcbiAgICAgICAgICogICAgIC50aGVuKCgpID0+IGNvbnNvbGUubG9nKCdGaXJzdCBVUkwgd2l0aCBpbWFnZTogJyArIGN1cnJlbnRVUkwpKTtcbiAgICAgICAgICogICBmb3IgKGN1cnJlbnRVUkwgb2YgW1xuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLFxuICAgICAgICAgKiAgICAgJ2h0dHBzOi8vZ29vZ2xlLmNvbScsXG4gICAgICAgICAqICAgICAnaHR0cHM6Ly9iYmMuY29tJyxcbiAgICAgICAgICogICBdKSB7XG4gICAgICAgICAqICAgICBhd2FpdCBwYWdlLmdvdG8oY3VycmVudFVSTCk7XG4gICAgICAgICAqICAgfVxuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBzZWxlY3RvciAtIEFcbiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9DU1NfU2VsZWN0b3JzIHwgc2VsZWN0b3J9XG4gICAgICAgICAqIG9mIGFuIGVsZW1lbnQgdG8gd2FpdCBmb3JcbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCB3YWl0aW5nIHBhcmFtZXRlcnNcbiAgICAgICAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHNlbGVjdG9yIHN0cmluZ1xuICAgICAgICAgKiBpcyBhZGRlZCB0byBET00uIFJlc29sdmVzIHRvIGBudWxsYCBpZiB3YWl0aW5nIGZvciBoaWRkZW46IGB0cnVlYCBhbmRcbiAgICAgICAgICogc2VsZWN0b3IgaXMgbm90IGZvdW5kIGluIERPTS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogVGhlIG9wdGlvbmFsIFBhcmFtZXRlciBpbiBBcmd1bWVudHMgYG9wdGlvbnNgIGFyZTpcbiAgICAgICAgICpcbiAgICAgICAgICogLSBgdmlzaWJsZWA6IEEgYm9vbGVhbiB3YWl0IGZvciBlbGVtZW50IHRvIGJlIHByZXNlbnQgaW4gRE9NIGFuZCB0byBiZVxuICAgICAgICAgKiAgIHZpc2libGUsIGkuZS4gdG8gbm90IGhhdmUgYGRpc3BsYXk6IG5vbmVgIG9yIGB2aXNpYmlsaXR5OiBoaWRkZW5gIENTU1xuICAgICAgICAgKiAgIHByb3BlcnRpZXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICAgICAqXG4gICAgICAgICAqIC0gYGhpZGRlbmA6IFdhaXQgZm9yIGVsZW1lbnQgdG8gbm90IGJlIGZvdW5kIGluIHRoZSBET00gb3IgdG8gYmUgaGlkZGVuLFxuICAgICAgICAgKiAgIGkuZS4gaGF2ZSBgZGlzcGxheTogbm9uZWAgb3IgYHZpc2liaWxpdHk6IGhpZGRlbmAgQ1NTIHByb3BlcnRpZXMuIERlZmF1bHRzIHRvXG4gICAgICAgICAqICAgYGZhbHNlYC5cbiAgICAgICAgICpcbiAgICAgICAgICogLSBgdGltZW91dGA6IG1heGltdW0gdGltZSB0byB3YWl0IGZvciBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIGAzMDAwMGBcbiAgICAgICAgICogICAoMzAgc2Vjb25kcykuIFBhc3MgYDBgIHRvIGRpc2FibGUgdGltZW91dC4gVGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWRcbiAgICAgICAgICogICBieSB1c2luZyB0aGUge0BsaW5rIFBhZ2Uuc2V0RGVmYXVsdFRpbWVvdXR9IG1ldGhvZC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhaXRGb3JTZWxlY3RvcihzZWxlY3Rvciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWluRnJhbWUoKS53YWl0Rm9yU2VsZWN0b3Ioc2VsZWN0b3IsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXYWl0cyBmb3IgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLCBgcGFnZUZ1bmN0aW9uYCwgdG8gcmV0dXJuIGEgdHJ1dGh5IHZhbHVlIHdoZW5cbiAgICAgICAgICogZXZhbHVhdGVkIGluIHRoZSBwYWdlJ3MgY29udGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICoge0BsaW5rIFBhZ2Uud2FpdEZvckZ1bmN0aW9ufSBjYW4gYmUgdXNlZCB0byBvYnNlcnZlIGEgdmlld3BvcnQgc2l6ZSBjaGFuZ2U6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYHRzXG4gICAgICAgICAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAgICAgICAgICogKGFzeW5jICgpID0+IHtcbiAgICAgICAgICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICAgICAgICAgKiAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBicm93c2VyLm5ld1BhZ2UoKTtcbiAgICAgICAgICogICBjb25zdCB3YXRjaERvZyA9IHBhZ2Uud2FpdEZvckZ1bmN0aW9uKCd3aW5kb3cuaW5uZXJXaWR0aCA8IDEwMCcpO1xuICAgICAgICAgKiAgIGF3YWl0IHBhZ2Uuc2V0Vmlld3BvcnQoe3dpZHRoOiA1MCwgaGVpZ2h0OiA1MH0pO1xuICAgICAgICAgKiAgIGF3YWl0IHdhdGNoRG9nO1xuICAgICAgICAgKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICogfSkoKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIEFyZ3VtZW50cyBjYW4gYmUgcGFzc2VkIGZyb20gTm9kZS5qcyB0byBgcGFnZUZ1bmN0aW9uYDpcbiAgICAgICAgICpcbiAgICAgICAgICogYGBgdHNcbiAgICAgICAgICogY29uc3Qgc2VsZWN0b3IgPSAnLmZvbyc7XG4gICAgICAgICAqIGF3YWl0IHBhZ2Uud2FpdEZvckZ1bmN0aW9uKFxuICAgICAgICAgKiAgIHNlbGVjdG9yID0+ICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvciksXG4gICAgICAgICAqICAge30sXG4gICAgICAgICAqICAgc2VsZWN0b3JcbiAgICAgICAgICogKTtcbiAgICAgICAgICogYGBgXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIFRoZSBwcm92aWRlZCBgcGFnZUZ1bmN0aW9uYCBjYW4gYmUgYXN5bmNocm9ub3VzOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGB0c1xuICAgICAgICAgKiBjb25zdCB1c2VybmFtZSA9ICdnaXRodWItdXNlcm5hbWUnO1xuICAgICAgICAgKiBhd2FpdCBwYWdlLndhaXRGb3JGdW5jdGlvbihcbiAgICAgICAgICogICBhc3luYyB1c2VybmFtZSA9PiB7XG4gICAgICAgICAqICAgICBjb25zdCBnaXRodWJSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgKiAgICAgICBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy8ke3VzZXJuYW1lfWBcbiAgICAgICAgICogICAgICk7XG4gICAgICAgICAqICAgICBjb25zdCBnaXRodWJVc2VyID0gYXdhaXQgZ2l0aHViUmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgKiAgICAgLy8gc2hvdyB0aGUgYXZhdGFyXG4gICAgICAgICAqICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgICAgICogICAgIGltZy5zcmMgPSBnaXRodWJVc2VyLmF2YXRhcl91cmw7XG4gICAgICAgICAqICAgICAvLyB3YWl0IDMgc2Vjb25kc1xuICAgICAgICAgKiAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAzMDAwKSk7XG4gICAgICAgICAqICAgICBpbWcucmVtb3ZlKCk7XG4gICAgICAgICAqICAgfSxcbiAgICAgICAgICogICB7fSxcbiAgICAgICAgICogICB1c2VybmFtZVxuICAgICAgICAgKiApO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHBhZ2VGdW5jdGlvbiAtIEZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZCBpbiBicm93c2VyIGNvbnRleHQgdW50aWwgaXQgcmV0dXJucyBhXG4gICAgICAgICAqIHRydXRoeSB2YWx1ZS5cbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciBjb25maWd1cmluZyB3YWl0aW5nIGJlaGF2aW9yLlxuICAgICAgICAgKi9cbiAgICAgICAgd2FpdEZvckZ1bmN0aW9uKHBhZ2VGdW5jdGlvbiwgb3B0aW9ucywgLi4uYXJncykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFpbkZyYW1lKCkud2FpdEZvckZ1bmN0aW9uKHBhZ2VGdW5jdGlvbiwgb3B0aW9ucywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBbKF9zY3JlZW5zaG90X2RlY29yYXRvcnMgPSBbZ3VhcmRlZChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnJvd3NlcigpO1xuICAgICAgICAgICAgfSldLCBkaXNwb3NlU3ltYm9sKV0oKSB7XG4gICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmNsb3NlKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgICAgICBbYXN5bmNEaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IFBhZ2UgfTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBzdXBwb3J0ZWRNZXRyaWNzID0gbmV3IFNldChbXG4gICAgJ1RpbWVzdGFtcCcsXG4gICAgJ0RvY3VtZW50cycsXG4gICAgJ0ZyYW1lcycsXG4gICAgJ0pTRXZlbnRMaXN0ZW5lcnMnLFxuICAgICdOb2RlcycsXG4gICAgJ0xheW91dENvdW50JyxcbiAgICAnUmVjYWxjU3R5bGVDb3VudCcsXG4gICAgJ0xheW91dER1cmF0aW9uJyxcbiAgICAnUmVjYWxjU3R5bGVEdXJhdGlvbicsXG4gICAgJ1NjcmlwdER1cmF0aW9uJyxcbiAgICAnVGFza0R1cmF0aW9uJyxcbiAgICAnSlNIZWFwVXNlZFNpemUnLFxuICAgICdKU0hlYXBUb3RhbFNpemUnLFxuXSk7XG4vKiogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vd2ViZHJpdmVyLWJpZGkvI25vcm1hbGl6ZS1yZWN0ICovXG5mdW5jdGlvbiBub3JtYWxpemVSZWN0YW5nbGUoY2xpcCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNsaXAsXG4gICAgICAgIC4uLihjbGlwLndpZHRoIDwgMFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgeDogY2xpcC54ICsgY2xpcC53aWR0aCxcbiAgICAgICAgICAgICAgICB3aWR0aDogLWNsaXAud2lkdGgsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICB4OiBjbGlwLngsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGNsaXAud2lkdGgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgLi4uKGNsaXAuaGVpZ2h0IDwgMFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgeTogY2xpcC55ICsgY2xpcC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAtY2xpcC5oZWlnaHQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICB5OiBjbGlwLnksXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBjbGlwLmhlaWdodCxcbiAgICAgICAgICAgIH0pLFxuICAgIH07XG59XG5mdW5jdGlvbiByb3VuZFJlY3RhbmdsZShjbGlwKSB7XG4gICAgY29uc3QgeCA9IE1hdGgucm91bmQoY2xpcC54KTtcbiAgICBjb25zdCB5ID0gTWF0aC5yb3VuZChjbGlwLnkpO1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5yb3VuZChjbGlwLndpZHRoICsgY2xpcC54IC0geCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5yb3VuZChjbGlwLmhlaWdodCArIGNsaXAueSAtIHkpO1xuICAgIHJldHVybiB7IC4uLmNsaXAsIHgsIHksIHdpZHRoLCBoZWlnaHQgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhZ2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IFRhc2tNYW5hZ2VyLCBXYWl0VGFzayB9IGZyb20gJy4uL2NvbW1vbi9XYWl0VGFzay5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlU3ltYm9sIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWFsbSB7XG4gICAgdGltZW91dFNldHRpbmdzO1xuICAgIHRhc2tNYW5hZ2VyID0gbmV3IFRhc2tNYW5hZ2VyKCk7XG4gICAgY29uc3RydWN0b3IodGltZW91dFNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMudGltZW91dFNldHRpbmdzID0gdGltZW91dFNldHRpbmdzO1xuICAgIH1cbiAgICBhc3luYyB3YWl0Rm9yRnVuY3Rpb24ocGFnZUZ1bmN0aW9uLCBvcHRpb25zID0ge30sIC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgeyBwb2xsaW5nID0gJ3JhZicsIHRpbWVvdXQgPSB0aGlzLnRpbWVvdXRTZXR0aW5ncy50aW1lb3V0KCksIHJvb3QsIHNpZ25hbCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmICh0eXBlb2YgcG9sbGluZyA9PT0gJ251bWJlcicgJiYgcG9sbGluZyA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBvbGwgd2l0aCBub24tcG9zaXRpdmUgaW50ZXJ2YWwnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3YWl0VGFzayA9IG5ldyBXYWl0VGFzayh0aGlzLCB7XG4gICAgICAgICAgICBwb2xsaW5nLFxuICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0sIHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0VGFzay5yZXN1bHQ7XG4gICAgfVxuICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VkO1xuICAgIH1cbiAgICAjZGlzcG9zZWQgPSBmYWxzZTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy4jZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnRhc2tNYW5hZ2VyLnRlcm1pbmF0ZUFsbChuZXcgRXJyb3IoJ3dhaXRGb3JGdW5jdGlvbiBmYWlsZWQ6IGZyYW1lIGdvdCBkZXRhY2hlZC4nKSk7XG4gICAgfVxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlYWxtLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHZhciBUYXJnZXRUeXBlO1xuKGZ1bmN0aW9uIChUYXJnZXRUeXBlKSB7XG4gICAgVGFyZ2V0VHlwZVtcIlBBR0VcIl0gPSBcInBhZ2VcIjtcbiAgICBUYXJnZXRUeXBlW1wiQkFDS0dST1VORF9QQUdFXCJdID0gXCJiYWNrZ3JvdW5kX3BhZ2VcIjtcbiAgICBUYXJnZXRUeXBlW1wiU0VSVklDRV9XT1JLRVJcIl0gPSBcInNlcnZpY2Vfd29ya2VyXCI7XG4gICAgVGFyZ2V0VHlwZVtcIlNIQVJFRF9XT1JLRVJcIl0gPSBcInNoYXJlZF93b3JrZXJcIjtcbiAgICBUYXJnZXRUeXBlW1wiQlJPV1NFUlwiXSA9IFwiYnJvd3NlclwiO1xuICAgIFRhcmdldFR5cGVbXCJXRUJWSUVXXCJdID0gXCJ3ZWJ2aWV3XCI7XG4gICAgVGFyZ2V0VHlwZVtcIk9USEVSXCJdID0gXCJvdGhlclwiO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIFRhcmdldFR5cGVbXCJUQUJcIl0gPSBcInRhYlwiO1xufSkoVGFyZ2V0VHlwZSB8fCAoVGFyZ2V0VHlwZSA9IHt9KSk7XG4vKipcbiAqIFRhcmdldCByZXByZXNlbnRzIGFcbiAqIHtAbGluayBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvVGFyZ2V0LyB8IENEUCB0YXJnZXR9LlxuICogSW4gQ0RQIGEgdGFyZ2V0IGlzIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBkZWJ1Z2dlZCBzdWNoIGEgZnJhbWUsIGEgcGFnZSBvciBhXG4gKiB3b3JrZXIuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXQge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHRhcmdldCBpcyBub3Qgb2YgdHlwZSBgXCJzZXJ2aWNlX3dvcmtlclwiYCBvciBgXCJzaGFyZWRfd29ya2VyXCJgLCByZXR1cm5zIGBudWxsYC5cbiAgICAgKi9cbiAgICBhc3luYyB3b3JrZXIoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgdGFyZ2V0IGlzIG5vdCBvZiB0eXBlIGBcInBhZ2VcImAsIGBcIndlYnZpZXdcImAgb3IgYFwiYmFja2dyb3VuZF9wYWdlXCJgLFxuICAgICAqIHJldHVybnMgYG51bGxgLlxuICAgICAqL1xuICAgIGFzeW5jIHBhZ2UoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhcmdldC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRPcGVyYXRpb24gfSBmcm9tICcuLi9jb21tb24vRXJyb3JzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgVGltZW91dFNldHRpbmdzIH0gZnJvbSAnLi4vY29tbW9uL1RpbWVvdXRTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYVxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XZWJfV29ya2Vyc19BUEkgfCBXZWJXb3JrZXJ9LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgZXZlbnRzIGB3b3JrZXJjcmVhdGVkYCBhbmQgYHdvcmtlcmRlc3Ryb3llZGAgYXJlIGVtaXR0ZWQgb24gdGhlIHBhZ2VcbiAqIG9iamVjdCB0byBzaWduYWwgdGhlIHdvcmtlciBsaWZlY3ljbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogcGFnZS5vbignd29ya2VyY3JlYXRlZCcsIHdvcmtlciA9PlxuICogICBjb25zb2xlLmxvZygnV29ya2VyIGNyZWF0ZWQ6ICcgKyB3b3JrZXIudXJsKCkpXG4gKiApO1xuICogcGFnZS5vbignd29ya2VyZGVzdHJveWVkJywgd29ya2VyID0+XG4gKiAgIGNvbnNvbGUubG9nKCdXb3JrZXIgZGVzdHJveWVkOiAnICsgd29ya2VyLnVybCgpKVxuICogKTtcbiAqXG4gKiBjb25zb2xlLmxvZygnQ3VycmVudCB3b3JrZXJzOicpO1xuICogZm9yIChjb25zdCB3b3JrZXIgb2YgcGFnZS53b3JrZXJzKCkpIHtcbiAqICAgY29uc29sZS5sb2coJyAgJyArIHdvcmtlci51cmwoKSk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJXb3JrZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRpbWVvdXRTZXR0aW5ncyA9IG5ldyBUaW1lb3V0U2V0dGluZ3MoKTtcbiAgICAjdXJsO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHVybCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiN1cmwgPSB1cmw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgdGhpcyB3ZWIgd29ya2VyLlxuICAgICAqL1xuICAgIHVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3VybDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZhbHVhdGVzIGEgZ2l2ZW4gZnVuY3Rpb24gaW4gdGhlIHtAbGluayBXZWJXb3JrZXIgfCB3b3JrZXJ9LlxuICAgICAqXG4gICAgICogQHJlbWFya3MgSWYgdGhlIGdpdmVuIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlLFxuICAgICAqIHtAbGluayBXZWJXb3JrZXIuZXZhbHVhdGUgfCBldmFsdWF0ZX0gd2lsbCB3YWl0IGZvciB0aGUgcHJvbWlzZSB0byByZXNvbHZlLlxuICAgICAqXG4gICAgICogQXMgYSBydWxlIG9mIHRodW1iLCBpZiB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBtb3JlXG4gICAgICogY29tcGxpY2F0ZWQgdGhhbiBhIEpTT04gb2JqZWN0IChlLmcuIG1vc3QgY2xhc3NlcyksIHRoZW5cbiAgICAgKiB7QGxpbmsgV2ViV29ya2VyLmV2YWx1YXRlIHwgZXZhbHVhdGV9IHdpbGwgX2xpa2VseV8gcmV0dXJuIHNvbWUgdHJ1bmNhdGVkXG4gICAgICogdmFsdWUgKG9yIGB7fWApLiBUaGlzIGlzIGJlY2F1c2Ugd2UgYXJlIG5vdCByZXR1cm5pbmcgdGhlIGFjdHVhbCByZXR1cm5cbiAgICAgKiB2YWx1ZSwgYnV0IGEgZGVzZXJpYWxpemVkIHZlcnNpb24gYXMgYSByZXN1bHQgb2YgdHJhbnNmZXJyaW5nIHRoZSByZXR1cm5cbiAgICAgKiB2YWx1ZSB0aHJvdWdoIGEgcHJvdG9jb2wgdG8gUHVwcGV0ZWVyLlxuICAgICAqXG4gICAgICogSW4gZ2VuZXJhbCwgeW91IHNob3VsZCB1c2VcbiAgICAgKiB7QGxpbmsgV2ViV29ya2VyLmV2YWx1YXRlSGFuZGxlIHwgZXZhbHVhdGVIYW5kbGV9IGlmXG4gICAgICoge0BsaW5rIFdlYldvcmtlci5ldmFsdWF0ZSB8IGV2YWx1YXRlfSBjYW5ub3Qgc2VyaWFsaXplIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgKiBwcm9wZXJseSBvciB5b3UgbmVlZCBhIG11dGFibGUge0BsaW5rIEpTSGFuZGxlIHwgaGFuZGxlfSB0byB0aGUgcmV0dXJuXG4gICAgICogb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZ1bmMgLSBGdW5jdGlvbiB0byBiZSBldmFsdWF0ZWQuXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBcmd1bWVudHMgdG8gcGFzcyBpbnRvIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAgICAgKi9cbiAgICBhc3luYyBldmFsdWF0ZShmdW5jLCAuLi5hcmdzKSB7XG4gICAgICAgIGZ1bmMgPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGUubmFtZSwgZnVuYyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5SZWFsbSgpLmV2YWx1YXRlKGZ1bmMsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmFsdWF0ZXMgYSBnaXZlbiBmdW5jdGlvbiBpbiB0aGUge0BsaW5rIFdlYldvcmtlciB8IHdvcmtlcn0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBJZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UsXG4gICAgICoge0BsaW5rIFdlYldvcmtlci5ldmFsdWF0ZSB8IGV2YWx1YXRlfSB3aWxsIHdhaXQgZm9yIHRoZSBwcm9taXNlIHRvIHJlc29sdmUuXG4gICAgICpcbiAgICAgKiBJbiBnZW5lcmFsLCB5b3Ugc2hvdWxkIHVzZVxuICAgICAqIHtAbGluayBXZWJXb3JrZXIuZXZhbHVhdGVIYW5kbGUgfCBldmFsdWF0ZUhhbmRsZX0gaWZcbiAgICAgKiB7QGxpbmsgV2ViV29ya2VyLmV2YWx1YXRlIHwgZXZhbHVhdGV9IGNhbm5vdCBzZXJpYWxpemUgdGhlIHJldHVybiB2YWx1ZVxuICAgICAqIHByb3Blcmx5IG9yIHlvdSBuZWVkIGEgbXV0YWJsZSB7QGxpbmsgSlNIYW5kbGUgfCBoYW5kbGV9IHRvIHRoZSByZXR1cm5cbiAgICAgKiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZnVuYyAtIEZ1bmN0aW9uIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgKiBAcGFyYW0gYXJncyAtIEFyZ3VtZW50cyB0byBwYXNzIGludG8gYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIEEge0BsaW5rIEpTSGFuZGxlIHwgaGFuZGxlfSB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIGBmdW5jYC5cbiAgICAgKi9cbiAgICBhc3luYyBldmFsdWF0ZUhhbmRsZShmdW5jLCAuLi5hcmdzKSB7XG4gICAgICAgIGZ1bmMgPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgZnVuYyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5SZWFsbSgpLmV2YWx1YXRlSGFuZGxlKGZ1bmMsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uKCdXZWJXb3JrZXIuY2xvc2UoKSBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViV29ya2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL0Jyb3dzZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Ccm93c2VyQ29udGV4dC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0NEUFNlc3Npb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9EaWFsb2cuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9FbGVtZW50SGFuZGxlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRW52aXJvbm1lbnQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9GcmFtZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0hUVFBSZXF1ZXN0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSFRUUFJlc3BvbnNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSW5wdXQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1BhZ2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9SZWFsbS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1RhcmdldC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1dlYldvcmtlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2xvY2F0b3JzL2xvY2F0b3JzLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFwaS5qcy5tYXAiLCJ2YXIgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSAodGhpcyAmJiB0aGlzLl9fYWRkRGlzcG9zYWJsZVJlc291cmNlKSB8fCBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICAgICAgdmFyIGRpc3Bvc2U7XG4gICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhc3luYykge1xuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xudmFyIF9fZGlzcG9zZVJlc291cmNlcyA9ICh0aGlzICYmIHRoaXMuX19kaXNwb3NlUmVzb3VyY2VzKSB8fCAoZnVuY3Rpb24gKFN1cHByZXNzZWRFcnJvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZW52KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IFN1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYy5hc3luYykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9O1xufSkodHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn0pO1xuaW1wb3J0IHsgRU1QVFksIGNhdGNoRXJyb3IsIGRlZmF1bHRJZkVtcHR5LCBkZWZlciwgZmlsdGVyLCBmaXJzdCwgZmlyc3RWYWx1ZUZyb20sIGZyb20sIGlkZW50aXR5LCBpZ25vcmVFbGVtZW50cywgbWFwLCBtZXJnZSwgbWVyZ2VNYXAsIG5vb3AsIHBpcGUsIHJhY2UsIHJhY2VXaXRoLCByZXRyeSwgdGFwLCB0aHJvd0lmRW1wdHksIH0gZnJvbSAnLi4vLi4vLi4vdGhpcmRfcGFydHkvcnhqcy9yeGpzLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgZnJvbUFib3J0U2lnbmFsLCB0aW1lb3V0IH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWwuanMnO1xuLyoqXG4gKiBBbGwgdGhlIGV2ZW50cyB0aGF0IGEgbG9jYXRvciBpbnN0YW5jZSBtYXkgZW1pdC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRvckV2ZW50O1xuKGZ1bmN0aW9uIChMb2NhdG9yRXZlbnQpIHtcbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGV2ZXJ5IHRpbWUgYmVmb3JlIHRoZSBsb2NhdG9yIHBlcmZvcm1zIGFuIGFjdGlvbiBvbiB0aGUgbG9jYXRlZCBlbGVtZW50KHMpLlxuICAgICAqL1xuICAgIExvY2F0b3JFdmVudFtcIkFjdGlvblwiXSA9IFwiYWN0aW9uXCI7XG59KShMb2NhdG9yRXZlbnQgfHwgKExvY2F0b3JFdmVudCA9IHt9KSk7XG4vKipcbiAqIExvY2F0b3JzIGRlc2NyaWJlIGEgc3RyYXRlZ3kgb2YgbG9jYXRpbmcgb2JqZWN0cyBhbmQgcGVyZm9ybWluZyBhbiBhY3Rpb24gb25cbiAqIHRoZW0uIElmIHRoZSBhY3Rpb24gZmFpbHMgYmVjYXVzZSB0aGUgb2JqZWN0IGlzIG5vdCByZWFkeSBmb3IgdGhlIGFjdGlvbiwgdGhlXG4gKiB3aG9sZSBvcGVyYXRpb24gaXMgcmV0cmllZC4gVmFyaW91cyBwcmVjb25kaXRpb25zIGZvciBhIHN1Y2Nlc3NmdWwgYWN0aW9uIGFyZVxuICogY2hlY2tlZCBhdXRvbWF0aWNhbGx5LlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvcGFnZS1pbnRlcmFjdGlvbnMjbG9jYXRvcnN9IGZvciBkZXRhaWxzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIExvY2F0b3IgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByYWNlIGJldHdlZW4gbXVsdGlwbGUgbG9jYXRvcnMgdHJ5aW5nIHRvIGxvY2F0ZSBlbGVtZW50cyBpblxuICAgICAqIHBhcmFsbGVsIGJ1dCBlbnN1cmVzIHRoYXQgb25seSBhIHNpbmdsZSBlbGVtZW50IHJlY2VpdmVzIHRoZSBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgc3RhdGljIHJhY2UobG9jYXRvcnMpIHtcbiAgICAgICAgcmV0dXJuIFJhY2VMb2NhdG9yLmNyZWF0ZShsb2NhdG9ycyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHZpc2liaWxpdHkgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF90aW1lb3V0ID0gMzAwMDA7XG4gICAgI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQgPSB0cnVlO1xuICAgICN3YWl0Rm9yRW5hYmxlZCA9IHRydWU7XG4gICAgI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveCA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgb3BlcmF0b3JzID0ge1xuICAgICAgICBjb25kaXRpb25zOiAoY29uZGl0aW9ucywgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VNYXAoKGhhbmRsZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZSguLi5jb25kaXRpb25zLm1hcChjb25kaXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uKGhhbmRsZSwgc2lnbmFsKTtcbiAgICAgICAgICAgICAgICB9KSkucGlwZShkZWZhdWx0SWZFbXB0eShoYW5kbGUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZXRyeUFuZFJhY2VXaXRoU2lnbmFsQW5kVGltZXI6IChzaWduYWwsIGNhdXNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gW107XG4gICAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5wdXNoKGZyb21BYm9ydFNpZ25hbChzaWduYWwsIGNhdXNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2godGltZW91dCh0aGlzLl90aW1lb3V0LCBjYXVzZSkpO1xuICAgICAgICAgICAgcmV0dXJuIHBpcGUocmV0cnkoeyBkZWxheTogUkVUUllfREVMQVkgfSksIHJhY2VXaXRoKC4uLmNhbmRpZGF0ZXMpKTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIC8vIERldGVybWluZXMgd2hlbiB0aGUgbG9jYXRvciB3aWxsIHRpbWVvdXQgZm9yIGFjdGlvbnMuXG4gICAgZ2V0IHRpbWVvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lb3V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGxvY2F0b3IgaW5zdGFuY2UgYnkgY2xvbmluZyB0aGUgY3VycmVudCBsb2NhdG9yIGFuZCBzZXR0aW5nXG4gICAgICogdGhlIHRvdGFsIHRpbWVvdXQgZm9yIHRoZSBsb2NhdG9yIGFjdGlvbnMuXG4gICAgICpcbiAgICAgKiBQYXNzIGAwYCB0byBkaXNhYmxlIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdFZhbHVlIGBQYWdlLmdldERlZmF1bHRUaW1lb3V0KClgXG4gICAgICovXG4gICAgc2V0VGltZW91dCh0aW1lb3V0KSB7XG4gICAgICAgIGNvbnN0IGxvY2F0b3IgPSB0aGlzLl9jbG9uZSgpO1xuICAgICAgICBsb2NhdG9yLl90aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgbG9jYXRvciBpbnN0YW5jZSBieSBjbG9uaW5nIHRoZSBjdXJyZW50IGxvY2F0b3Igd2l0aCB0aGVcbiAgICAgKiB2aXNpYmlsaXR5IHByb3BlcnR5IGNoYW5nZWQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBzZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpIHtcbiAgICAgICAgY29uc3QgbG9jYXRvciA9IHRoaXMuX2Nsb25lKCk7XG4gICAgICAgIGxvY2F0b3IudmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7XG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGxvY2F0b3IgaW5zdGFuY2UgYnkgY2xvbmluZyB0aGUgY3VycmVudCBsb2NhdG9yIGFuZFxuICAgICAqIHNwZWNpZnlpbmcgd2hldGhlciB0byB3YWl0IGZvciBpbnB1dCBlbGVtZW50cyB0byBiZWNvbWUgZW5hYmxlZCBiZWZvcmUgdGhlXG4gICAgICogYWN0aW9uLiBBcHBsaWNhYmxlIHRvIGBjbGlja2AgYW5kIGBmaWxsYCBhY3Rpb25zLlxuICAgICAqXG4gICAgICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWBcbiAgICAgKi9cbiAgICBzZXRXYWl0Rm9yRW5hYmxlZCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgbG9jYXRvci4jd2FpdEZvckVuYWJsZWQgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgbG9jYXRvciBpbnN0YW5jZSBieSBjbG9uaW5nIHRoZSBjdXJyZW50IGxvY2F0b3IgYW5kXG4gICAgICogc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBsb2NhdG9yIHNob3VsZCBzY3JvbGwgdGhlIGVsZW1lbnQgaW50byB2aWV3cG9ydCBpZlxuICAgICAqIGl0IGlzIG5vdCBpbiB0aGUgdmlld3BvcnQgYWxyZWFkeS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0VmFsdWUgYHRydWVgXG4gICAgICovXG4gICAgc2V0RW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgbG9jYXRvci4jZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBsb2NhdG9yIGluc3RhbmNlIGJ5IGNsb25pbmcgdGhlIGN1cnJlbnQgbG9jYXRvciBhbmRcbiAgICAgKiBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGxvY2F0b3IgaGFzIHRvIHdhaXQgZm9yIHRoZSBlbGVtZW50J3MgYm91bmRpbmcgYm94XG4gICAgICogdG8gYmUgc2FtZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBhbmltYXRpb24gZnJhbWVzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWBcbiAgICAgKi9cbiAgICBzZXRXYWl0Rm9yU3RhYmxlQm91bmRpbmdCb3godmFsdWUpIHtcbiAgICAgICAgY29uc3QgbG9jYXRvciA9IHRoaXMuX2Nsb25lKCk7XG4gICAgICAgIGxvY2F0b3IuI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveCA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29weU9wdGlvbnMobG9jYXRvcikge1xuICAgICAgICB0aGlzLl90aW1lb3V0ID0gbG9jYXRvci5fdGltZW91dDtcbiAgICAgICAgdGhpcy52aXNpYmlsaXR5ID0gbG9jYXRvci52aXNpYmlsaXR5O1xuICAgICAgICB0aGlzLiN3YWl0Rm9yRW5hYmxlZCA9IGxvY2F0b3IuI3dhaXRGb3JFbmFibGVkO1xuICAgICAgICB0aGlzLiNlbnN1cmVFbGVtZW50SXNJblRoZVZpZXdwb3J0ID0gbG9jYXRvci4jZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydDtcbiAgICAgICAgdGhpcy4jd2FpdEZvclN0YWJsZUJvdW5kaW5nQm94ID0gbG9jYXRvci4jd2FpdEZvclN0YWJsZUJvdW5kaW5nQm94O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVsZW1lbnQgaGFzIGEgXCJkaXNhYmxlZFwiIHByb3BlcnR5LCB3YWl0IGZvciB0aGUgZWxlbWVudCB0byBiZVxuICAgICAqIGVuYWJsZWQuXG4gICAgICovXG4gICAgI3dhaXRGb3JFbmFibGVkSWZOZWVkZWQgPSAoaGFuZGxlLCBzaWduYWwpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLiN3YWl0Rm9yRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmcm9tKGhhbmRsZS5mcmFtZS53YWl0Rm9yRnVuY3Rpb24oZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc05hdGl2ZUZvcm1Db250cm9sID0gW1xuICAgICAgICAgICAgICAgICdCVVRUT04nLFxuICAgICAgICAgICAgICAgICdJTlBVVCcsXG4gICAgICAgICAgICAgICAgJ1NFTEVDVCcsXG4gICAgICAgICAgICAgICAgJ1RFWFRBUkVBJyxcbiAgICAgICAgICAgICAgICAnT1BUSU9OJyxcbiAgICAgICAgICAgICAgICAnT1BUR1JPVVAnLFxuICAgICAgICAgICAgXS5pbmNsdWRlcyhlbGVtZW50Lm5vZGVOYW1lKTtcbiAgICAgICAgICAgIHJldHVybiAhaXNOYXRpdmVGb3JtQ29udHJvbCB8fCAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHRpbWVvdXQ6IHRoaXMuX3RpbWVvdXQsXG4gICAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0sIGhhbmRsZSkpLnBpcGUoaWdub3JlRWxlbWVudHMoKSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBlbGVtZW50IGZvciB0d28gY29uc2VjdXRpdmUgYW5pbWF0aW9uXG4gICAgICogZnJhbWVzIGFuZCB3YWl0cyB0aWxsIHRoZXkgYXJlIHRoZSBzYW1lLlxuICAgICAqL1xuICAgICN3YWl0Rm9yU3RhYmxlQm91bmRpbmdCb3hJZk5lZWRlZCA9IChoYW5kbGUpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLiN3YWl0Rm9yU3RhYmxlQm91bmRpbmdCb3gpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgLy8gTm90ZSB3ZSBkb24ndCB1c2Ugd2FpdEZvckZ1bmN0aW9uIGJlY2F1c2UgdGhhdCByZWxpZXMgb24gUkFGLlxuICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0MSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0MiA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHJlY3QxLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiByZWN0MS55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHJlY3QxLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZWN0MS5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHJlY3QyLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiByZWN0Mi55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHJlY3QyLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZWN0Mi5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pLnBpcGUoZmlyc3QoKFtyZWN0MSwgcmVjdDJdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKHJlY3QxLnggPT09IHJlY3QyLnggJiZcbiAgICAgICAgICAgICAgICByZWN0MS55ID09PSByZWN0Mi55ICYmXG4gICAgICAgICAgICAgICAgcmVjdDEud2lkdGggPT09IHJlY3QyLndpZHRoICYmXG4gICAgICAgICAgICAgICAgcmVjdDEuaGVpZ2h0ID09PSByZWN0Mi5oZWlnaHQpO1xuICAgICAgICB9KSwgcmV0cnkoeyBkZWxheTogUkVUUllfREVMQVkgfSksIGlnbm9yZUVsZW1lbnRzKCkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSB2aWV3cG9ydCBhbmQgYXV0by1zY3JvbGxzIGl0IGlmIGl0IGlzIG5vdC5cbiAgICAgKi9cbiAgICAjZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydElmTmVlZGVkID0gKGhhbmRsZSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuaXNJbnRlcnNlY3RpbmdWaWV3cG9ydCh7IHRocmVzaG9sZDogMCB9KSkucGlwZShmaWx0ZXIoaXNJbnRlcnNlY3RpbmdWaWV3cG9ydCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIWlzSW50ZXJzZWN0aW5nVmlld3BvcnQ7XG4gICAgICAgIH0pLCBtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgICAgIH0pLCBtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tKGhhbmRsZS5pc0ludGVyc2VjdGluZ1ZpZXdwb3J0KHsgdGhyZXNob2xkOiAwIH0pKTtcbiAgICAgICAgICAgIH0pLnBpcGUoZmlyc3QoaWRlbnRpdHkpLCByZXRyeSh7IGRlbGF5OiBSRVRSWV9ERUxBWSB9KSwgaWdub3JlRWxlbWVudHMoKSk7XG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgICNjbGljayhvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICAgICAgY29uc3QgY2F1c2UgPSBuZXcgRXJyb3IoJ0xvY2F0b3IuY2xpY2snKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhaXQob3B0aW9ucykucGlwZSh0aGlzLm9wZXJhdG9ycy5jb25kaXRpb25zKFtcbiAgICAgICAgICAgIHRoaXMuI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnRJZk5lZWRlZCxcbiAgICAgICAgICAgIHRoaXMuI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveElmTmVlZGVkLFxuICAgICAgICAgICAgdGhpcy4jd2FpdEZvckVuYWJsZWRJZk5lZWRlZCxcbiAgICAgICAgXSwgc2lnbmFsKSwgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoTG9jYXRvckV2ZW50LkFjdGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSksIG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuY2xpY2sob3B0aW9ucykpLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgaGFuZGxlLmRpc3Bvc2UoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pLCB0aGlzLm9wZXJhdG9ycy5yZXRyeUFuZFJhY2VXaXRoU2lnbmFsQW5kVGltZXIoc2lnbmFsLCBjYXVzZSkpO1xuICAgIH1cbiAgICAjZmlsbCh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gbmV3IEVycm9yKCdMb2NhdG9yLmZpbGwnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dhaXQob3B0aW9ucykucGlwZSh0aGlzLm9wZXJhdG9ycy5jb25kaXRpb25zKFtcbiAgICAgICAgICAgIHRoaXMuI2Vuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnRJZk5lZWRlZCxcbiAgICAgICAgICAgIHRoaXMuI3dhaXRGb3JTdGFibGVCb3VuZGluZ0JveElmTmVlZGVkLFxuICAgICAgICAgICAgdGhpcy4jd2FpdEZvckVuYWJsZWRJZk5lZWRlZCxcbiAgICAgICAgXSwgc2lnbmFsKSwgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoTG9jYXRvckV2ZW50LkFjdGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSksIG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuZXZhbHVhdGUoZWwgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnc2VsZWN0JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3R5cGVhYmxlLWlucHV0JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV3IFNldChbXG4gICAgICAgICAgICAgICAgICAgICAgICAndGV4dGFyZWEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAndGVsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdzZWFyY2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdudW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2VtYWlsJyxcbiAgICAgICAgICAgICAgICAgICAgXSkuaGFzKGVsLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3R5cGVhYmxlLWlucHV0JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnb3RoZXItaW5wdXQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbnRlbnRlZGl0YWJsZSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAndW5rbm93bic7XG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAucGlwZShtZXJnZU1hcChpbnB1dFR5cGUgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoaW5wdXRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuc2VsZWN0KHZhbHVlKS50aGVuKG5vb3ApKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29udGVudGVkaXRhYmxlJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndHlwZWFibGUtaW5wdXQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKChpbnB1dCwgbmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBpbnB1dC5pc0NvbnRlbnRFZGl0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmlubmVyVGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlucHV0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBpbnB1dCBpZiB0aGUgY3VycmVudCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsbGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IHZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gY3VycmVudFZhbHVlLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmV3VmFsdWUuc3RhcnRzV2l0aChpbnB1dC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5pbm5lclRleHQgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gaW5wdXQuaXNDb250ZW50RWRpdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5pbm5lclRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgcGFydGlhbGx5IGZpbGxlZCBvdXQsIG9ubHkgdHlwZSB0aGUgcmVzdC4gTW92ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBjb21tb24gcHJlZml4LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5pbm5lclRleHQgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuaW5uZXJUZXh0ID0gb3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gb3JpZ2luYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlLnN1YnN0cmluZyhvcmlnaW5hbFZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB2YWx1ZSkpLnBpcGUobWVyZ2VNYXAodGV4dFRvVHlwZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLnR5cGUodGV4dFRvVHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdvdGhlci1pbnB1dCc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuZm9jdXMoKSkucGlwZShtZXJnZU1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKChpbnB1dCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndW5rbm93bic6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY2Fubm90IGJlIGZpbGxlZCBvdXQuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgaGFuZGxlLmRpc3Bvc2UoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pLCB0aGlzLm9wZXJhdG9ycy5yZXRyeUFuZFJhY2VXaXRoU2lnbmFsQW5kVGltZXIoc2lnbmFsLCBjYXVzZSkpO1xuICAgIH1cbiAgICAjaG92ZXIob3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gbmV3IEVycm9yKCdMb2NhdG9yLmhvdmVyJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl93YWl0KG9wdGlvbnMpLnBpcGUodGhpcy5vcGVyYXRvcnMuY29uZGl0aW9ucyhbXG4gICAgICAgICAgICB0aGlzLiNlbnN1cmVFbGVtZW50SXNJblRoZVZpZXdwb3J0SWZOZWVkZWQsXG4gICAgICAgICAgICB0aGlzLiN3YWl0Rm9yU3RhYmxlQm91bmRpbmdCb3hJZk5lZWRlZCxcbiAgICAgICAgXSwgc2lnbmFsKSwgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoTG9jYXRvckV2ZW50LkFjdGlvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgfSksIG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuaG92ZXIoKSkucGlwZShjYXRjaEVycm9yKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCBoYW5kbGUuZGlzcG9zZSgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSksIHRoaXMub3BlcmF0b3JzLnJldHJ5QW5kUmFjZVdpdGhTaWduYWxBbmRUaW1lcihzaWduYWwsIGNhdXNlKSk7XG4gICAgfVxuICAgICNzY3JvbGwob3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgICAgIGNvbnN0IGNhdXNlID0gbmV3IEVycm9yKCdMb2NhdG9yLnNjcm9sbCcpO1xuICAgICAgICByZXR1cm4gdGhpcy5fd2FpdChvcHRpb25zKS5waXBlKHRoaXMub3BlcmF0b3JzLmNvbmRpdGlvbnMoW1xuICAgICAgICAgICAgdGhpcy4jZW5zdXJlRWxlbWVudElzSW5UaGVWaWV3cG9ydElmTmVlZGVkLFxuICAgICAgICAgICAgdGhpcy4jd2FpdEZvclN0YWJsZUJvdW5kaW5nQm94SWZOZWVkZWQsXG4gICAgICAgIF0sIHNpZ25hbCksIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KExvY2F0b3JFdmVudC5BY3Rpb24sIHVuZGVmaW5lZCk7XG4gICAgICAgIH0pLCBtZXJnZU1hcChoYW5kbGUgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmV2YWx1YXRlKChlbCwgc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbFRvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbExlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBlbC5zY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBvcHRpb25zPy5zY3JvbGxUb3AsIG9wdGlvbnM/LnNjcm9sbExlZnQpKS5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgICAgICAgICB2b2lkIGhhbmRsZS5kaXNwb3NlKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KSwgdGhpcy5vcGVyYXRvcnMucmV0cnlBbmRSYWNlV2l0aFNpZ25hbEFuZFRpbWVyKHNpZ25hbCwgY2F1c2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvbmVzIHRoZSBsb2NhdG9yLlxuICAgICAqL1xuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvbmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgZm9yIHRoZSBsb2NhdG9yIHRvIGdldCBhIGhhbmRsZSBmcm9tIHRoZSBwYWdlLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGFzeW5jIHdhaXRIYW5kbGUob3B0aW9ucykge1xuICAgICAgICBjb25zdCBjYXVzZSA9IG5ldyBFcnJvcignTG9jYXRvci53YWl0SGFuZGxlJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl93YWl0KG9wdGlvbnMpLnBpcGUodGhpcy5vcGVyYXRvcnMucmV0cnlBbmRSYWNlV2l0aFNpZ25hbEFuZFRpbWVyKG9wdGlvbnM/LnNpZ25hbCwgY2F1c2UpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdhaXRzIGZvciB0aGUgbG9jYXRvciB0byBnZXQgdGhlIHNlcmlhbGl6ZWQgdmFsdWUgZnJvbSB0aGUgcGFnZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhpcyByZXF1aXJlcyB0aGUgdmFsdWUgdG8gYmUgSlNPTi1zZXJpYWxpemFibGUuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgYXN5bmMgd2FpdChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHRoaXMud2FpdEhhbmRsZShvcHRpb25zKSwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZS5qc29uVmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFwcyB0aGUgbG9jYXRvciB1c2luZyB0aGUgcHJvdmlkZWQgbWFwcGVyLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIG1hcChtYXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBwZWRMb2NhdG9yKHRoaXMuX2Nsb25lKCksIGhhbmRsZSA9PiB7XG4gICAgICAgICAgICAvLyBTQUZFVFk6IFR5cGVTY3JpcHQgY2Fubm90IGRlZHVjZSB0aGUgdHlwZS5cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGUuZXZhbHVhdGVIYW5kbGUobWFwcGVyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gZXhwZWN0YXRpb24gdGhhdCBpcyBldmFsdWF0ZWQgYWdhaW5zdCBsb2NhdGVkIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBleHBlY3RhdGlvbnMgZG8gbm90IG1hdGNoLCB0aGVuIHRoZSBsb2NhdG9yIHdpbGwgcmV0cnkuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgZmlsdGVyKHByZWRpY2F0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZpbHRlcmVkTG9jYXRvcih0aGlzLl9jbG9uZSgpLCBhc3luYyAoaGFuZGxlLCBzaWduYWwpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGhhbmRsZS5mcmFtZS53YWl0Rm9yRnVuY3Rpb24ocHJlZGljYXRlLCB7IHNpZ25hbCwgdGltZW91dDogdGhpcy5fdGltZW91dCB9LCBoYW5kbGUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGV4cGVjdGF0aW9uIHRoYXQgaXMgZXZhbHVhdGVkIGFnYWluc3QgbG9jYXRlZCBoYW5kbGVzLlxuICAgICAqXG4gICAgICogSWYgdGhlIGV4cGVjdGF0aW9ucyBkbyBub3QgbWF0Y2gsIHRoZW4gdGhlIGxvY2F0b3Igd2lsbCByZXRyeS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGZpbHRlckhhbmRsZShwcmVkaWNhdGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJlZExvY2F0b3IodGhpcy5fY2xvbmUoKSwgcHJlZGljYXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFwcyB0aGUgbG9jYXRvciB1c2luZyB0aGUgcHJvdmlkZWQgbWFwcGVyLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgbWFwSGFuZGxlKG1hcHBlcikge1xuICAgICAgICByZXR1cm4gbmV3IE1hcHBlZExvY2F0b3IodGhpcy5fY2xvbmUoKSwgbWFwcGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xpY2tzIHRoZSBsb2NhdGVkIGVsZW1lbnQuXG4gICAgICovXG4gICAgY2xpY2sob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy4jY2xpY2sob3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaWxscyBvdXQgdGhlIGlucHV0IGlkZW50aWZpZWQgYnkgdGhlIGxvY2F0b3IgdXNpbmcgdGhlIHByb3ZpZGVkIHZhbHVlLiBUaGVcbiAgICAgKiB0eXBlIG9mIHRoZSBpbnB1dCBpcyBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUgYW5kIHRoZSBhcHByb3ByaWF0ZSBmaWxsLW91dFxuICAgICAqIG1ldGhvZCBpcyBjaG9zZW4gYmFzZWQgb24gdGhlIHR5cGUuIGBjb250ZW50ZWRpdGFibGVgLCBzZWxlY3QsIHRleHRhcmVhIGFuZFxuICAgICAqIGlucHV0IGVsZW1lbnRzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICovXG4gICAgZmlsbCh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy4jZmlsbCh2YWx1ZSwgb3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIb3ZlcnMgb3ZlciB0aGUgbG9jYXRlZCBlbGVtZW50LlxuICAgICAqL1xuICAgIGhvdmVyKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuI2hvdmVyKG9wdGlvbnMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2Nyb2xscyB0aGUgbG9jYXRlZCBlbGVtZW50LlxuICAgICAqL1xuICAgIHNjcm9sbChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLiNzY3JvbGwob3B0aW9ucykpO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBGdW5jdGlvbkxvY2F0b3IgZXh0ZW5kcyBMb2NhdG9yIHtcbiAgICBzdGF0aWMgY3JlYXRlKHBhZ2VPckZyYW1lLCBmdW5jKSB7XG4gICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25Mb2NhdG9yKHBhZ2VPckZyYW1lLCBmdW5jKS5zZXRUaW1lb3V0KCdnZXREZWZhdWx0VGltZW91dCcgaW4gcGFnZU9yRnJhbWVcbiAgICAgICAgICAgID8gcGFnZU9yRnJhbWUuZ2V0RGVmYXVsdFRpbWVvdXQoKVxuICAgICAgICAgICAgOiBwYWdlT3JGcmFtZS5wYWdlKCkuZ2V0RGVmYXVsdFRpbWVvdXQoKSk7XG4gICAgfVxuICAgICNwYWdlT3JGcmFtZTtcbiAgICAjZnVuYztcbiAgICBjb25zdHJ1Y3RvcihwYWdlT3JGcmFtZSwgZnVuYykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNwYWdlT3JGcmFtZSA9IHBhZ2VPckZyYW1lO1xuICAgICAgICB0aGlzLiNmdW5jID0gZnVuYztcbiAgICB9XG4gICAgX2Nsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uTG9jYXRvcih0aGlzLiNwYWdlT3JGcmFtZSwgdGhpcy4jZnVuYyk7XG4gICAgfVxuICAgIF93YWl0KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZyb20odGhpcy4jcGFnZU9yRnJhbWUud2FpdEZvckZ1bmN0aW9uKHRoaXMuI2Z1bmMsIHtcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiB0aGlzLnRpbWVvdXQsXG4gICAgICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KS5waXBlKHRocm93SWZFbXB0eSgpKTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRGVsZWdhdGVkTG9jYXRvciBleHRlbmRzIExvY2F0b3Ige1xuICAgICNkZWxlZ2F0ZTtcbiAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNkZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgICAgICB0aGlzLmNvcHlPcHRpb25zKHRoaXMuI2RlbGVnYXRlKTtcbiAgICB9XG4gICAgZ2V0IGRlbGVnYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGVsZWdhdGU7XG4gICAgfVxuICAgIHNldFRpbWVvdXQodGltZW91dCkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gc3VwZXIuc2V0VGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgbG9jYXRvci4jZGVsZWdhdGUgPSB0aGlzLiNkZWxlZ2F0ZS5zZXRUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KSB7XG4gICAgICAgIGNvbnN0IGxvY2F0b3IgPSBzdXBlci5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IGxvY2F0b3IuI2RlbGVnYXRlLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7XG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgIH1cbiAgICBzZXRXYWl0Rm9yRW5hYmxlZCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBsb2NhdG9yID0gc3VwZXIuc2V0V2FpdEZvckVuYWJsZWQodmFsdWUpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IHRoaXMuI2RlbGVnYXRlLnNldFdhaXRGb3JFbmFibGVkKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XG4gICAgfVxuICAgIHNldEVuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbG9jYXRvciA9IHN1cGVyLnNldEVuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQodmFsdWUpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IHRoaXMuI2RlbGVnYXRlLnNldEVuc3VyZUVsZW1lbnRJc0luVGhlVmlld3BvcnQodmFsdWUpO1xuICAgICAgICByZXR1cm4gbG9jYXRvcjtcbiAgICB9XG4gICAgc2V0V2FpdEZvclN0YWJsZUJvdW5kaW5nQm94KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0b3IgPSBzdXBlci5zZXRXYWl0Rm9yU3RhYmxlQm91bmRpbmdCb3godmFsdWUpO1xuICAgICAgICBsb2NhdG9yLiNkZWxlZ2F0ZSA9IHRoaXMuI2RlbGVnYXRlLnNldFdhaXRGb3JTdGFibGVCb3VuZGluZ0JveCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBsb2NhdG9yO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWx0ZXJlZExvY2F0b3IgZXh0ZW5kcyBEZWxlZ2F0ZWRMb2NhdG9yIHtcbiAgICAjcHJlZGljYXRlO1xuICAgIGNvbnN0cnVjdG9yKGJhc2UsIHByZWRpY2F0ZSkge1xuICAgICAgICBzdXBlcihiYXNlKTtcbiAgICAgICAgdGhpcy4jcHJlZGljYXRlID0gcHJlZGljYXRlO1xuICAgIH1cbiAgICBfY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmlsdGVyZWRMb2NhdG9yKHRoaXMuZGVsZWdhdGUuY2xvbmUoKSwgdGhpcy4jcHJlZGljYXRlKS5jb3B5T3B0aW9ucyh0aGlzKTtcbiAgICB9XG4gICAgX3dhaXQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5fd2FpdChvcHRpb25zKS5waXBlKG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUodGhpcy4jcHJlZGljYXRlKGhhbmRsZSwgb3B0aW9ucz8uc2lnbmFsKSkpLnBpcGUoZmlsdGVyKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9KSwgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTQUZFVFk6IEl0IHBhc3NlZCB0aGUgcHJlZGljYXRlLCBzbyB0aGlzIGlzIGNvcnJlY3QuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSksIHRocm93SWZFbXB0eSgpKTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTWFwcGVkTG9jYXRvciBleHRlbmRzIERlbGVnYXRlZExvY2F0b3Ige1xuICAgICNtYXBwZXI7XG4gICAgY29uc3RydWN0b3IoYmFzZSwgbWFwcGVyKSB7XG4gICAgICAgIHN1cGVyKGJhc2UpO1xuICAgICAgICB0aGlzLiNtYXBwZXIgPSBtYXBwZXI7XG4gICAgfVxuICAgIF9jbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXBwZWRMb2NhdG9yKHRoaXMuZGVsZWdhdGUuY2xvbmUoKSwgdGhpcy4jbWFwcGVyKS5jb3B5T3B0aW9ucyh0aGlzKTtcbiAgICB9XG4gICAgX3dhaXQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5fd2FpdChvcHRpb25zKS5waXBlKG1lcmdlTWFwKGhhbmRsZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUodGhpcy4jbWFwcGVyKGhhbmRsZSwgb3B0aW9ucz8uc2lnbmFsKSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE5vZGVMb2NhdG9yIGV4dGVuZHMgTG9jYXRvciB7XG4gICAgc3RhdGljIGNyZWF0ZShwYWdlT3JGcmFtZSwgc2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlTG9jYXRvcihwYWdlT3JGcmFtZSwgc2VsZWN0b3IpLnNldFRpbWVvdXQoJ2dldERlZmF1bHRUaW1lb3V0JyBpbiBwYWdlT3JGcmFtZVxuICAgICAgICAgICAgPyBwYWdlT3JGcmFtZS5nZXREZWZhdWx0VGltZW91dCgpXG4gICAgICAgICAgICA6IHBhZ2VPckZyYW1lLnBhZ2UoKS5nZXREZWZhdWx0VGltZW91dCgpKTtcbiAgICB9XG4gICAgI3BhZ2VPckZyYW1lO1xuICAgICNzZWxlY3RvcjtcbiAgICBjb25zdHJ1Y3RvcihwYWdlT3JGcmFtZSwgc2VsZWN0b3IpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jcGFnZU9yRnJhbWUgPSBwYWdlT3JGcmFtZTtcbiAgICAgICAgdGhpcy4jc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgZm9yIHRoZSBlbGVtZW50IHRvIGJlY29tZSB2aXNpYmxlIG9yIGhpZGRlbi4gdmlzaWJpbGl0eSA9PT0gJ3Zpc2libGUnXG4gICAgICogbWVhbnMgdGhhdCB0aGUgZWxlbWVudCBoYXMgYSBjb21wdXRlZCBzdHlsZSwgdGhlIHZpc2liaWxpdHkgcHJvcGVydHkgb3RoZXJcbiAgICAgKiB0aGFuICdoaWRkZW4nIG9yICdjb2xsYXBzZScgYW5kIG5vbi1lbXB0eSBib3VuZGluZyBib3guIHZpc2liaWxpdHkgPT09XG4gICAgICogJ2hpZGRlbicgbWVhbnMgdGhlIG9wcG9zaXRlIG9mIHRoYXQuXG4gICAgICovXG4gICAgI3dhaXRGb3JWaXNpYmlsaXR5SWZOZWVkZWQgPSAoaGFuZGxlKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgoKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShoYW5kbGUuaXNIaWRkZW4oKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3Zpc2libGUnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20oaGFuZGxlLmlzVmlzaWJsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKCkucGlwZShmaXJzdChpZGVudGl0eSksIHJldHJ5KHsgZGVsYXk6IFJFVFJZX0RFTEFZIH0pLCBpZ25vcmVFbGVtZW50cygpKTtcbiAgICB9O1xuICAgIF9jbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlTG9jYXRvcih0aGlzLiNwYWdlT3JGcmFtZSwgdGhpcy4jc2VsZWN0b3IpLmNvcHlPcHRpb25zKHRoaXMpO1xuICAgIH1cbiAgICBfd2FpdChvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICAgICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMuI3BhZ2VPckZyYW1lLndhaXRGb3JTZWxlY3Rvcih0aGlzLiNzZWxlY3Rvciwge1xuICAgICAgICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IHRoaXMuX3RpbWVvdXQsXG4gICAgICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KS5waXBlKGZpbHRlcigodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbDtcbiAgICAgICAgfSksIHRocm93SWZFbXB0eSgpLCB0aGlzLm9wZXJhdG9ycy5jb25kaXRpb25zKFt0aGlzLiN3YWl0Rm9yVmlzaWJpbGl0eUlmTmVlZGVkXSwgc2lnbmFsKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tMb2NhdG9yQXJyYXkobG9jYXRvcnMpIHtcbiAgICBmb3IgKGNvbnN0IGxvY2F0b3Igb2YgbG9jYXRvcnMpIHtcbiAgICAgICAgaWYgKCEobG9jYXRvciBpbnN0YW5jZW9mIExvY2F0b3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbG9jYXRvciBmb3IgcmFjZSBjYW5kaWRhdGUnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbG9jYXRvcnM7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgUmFjZUxvY2F0b3IgZXh0ZW5kcyBMb2NhdG9yIHtcbiAgICBzdGF0aWMgY3JlYXRlKGxvY2F0b3JzKSB7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gY2hlY2tMb2NhdG9yQXJyYXkobG9jYXRvcnMpO1xuICAgICAgICByZXR1cm4gbmV3IFJhY2VMb2NhdG9yKGFycmF5KTtcbiAgICB9XG4gICAgI2xvY2F0b3JzO1xuICAgIGNvbnN0cnVjdG9yKGxvY2F0b3JzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2xvY2F0b3JzID0gbG9jYXRvcnM7XG4gICAgfVxuICAgIF9jbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYWNlTG9jYXRvcih0aGlzLiNsb2NhdG9ycy5tYXAobG9jYXRvciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvci5jbG9uZSgpO1xuICAgICAgICB9KSkuY29weU9wdGlvbnModGhpcyk7XG4gICAgfVxuICAgIF93YWl0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHJhY2UoLi4udGhpcy4jbG9jYXRvcnMubWFwKGxvY2F0b3IgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3IuX3dhaXQob3B0aW9ucyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG4vKipcbiAqIEZvciBvYnNlcnZhYmxlcyBjb21pbmcgZnJvbSBwcm9taXNlcywgYSBkZWxheSBpcyBuZWVkZWQsIG90aGVyd2lzZSBSeEpTIHdpbGxcbiAqIG5ldmVyIHlpZWxkIGluIGEgcGVybWFuZW50IGZhaWx1cmUgZm9yIGEgcHJvbWlzZS5cbiAqXG4gKiBXZSBhbHNvIGRvbid0IHdhbnQgUnhKUyB0byBkbyBwcm9taXNlIG9wZXJhdGlvbnMgdG8gb2Z0ZW4sIHNvIHdlIGJ1bXAgdGhlXG4gKiBkZWxheSB1cCB0byAxMDBtcy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJFVFJZX0RFTEFZID0gMTAwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9jYXRvcnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuLi9jZHAvQ29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBQcm90b2NvbEVycm9yLCBVbnN1cHBvcnRlZE9wZXJhdGlvbiB9IGZyb20gJy4uL2NvbW1vbi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgREVGQVVMVF9WSUVXUE9SVCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbi8qKlxuICogVXNlcnMgc2hvdWxkIG5ldmVyIGNhbGwgdGhpcyBkaXJlY3RseTsgaXQncyBjYWxsZWQgd2hlbiBjYWxsaW5nIGBwdXBwZXRlZXIuY29ubmVjdGBcbiAqIHdpdGggYHByb3RvY29sOiAnd2ViRHJpdmVyQmlEaSdgLiBUaGlzIG1ldGhvZCBhdHRhY2hlcyBQdXBwZXRlZXIgdG8gYW4gZXhpc3RpbmcgYnJvd3NlclxuICogaW5zdGFuY2UuIEZpcnN0IGl0IHRyaWVzIHRvIGNvbm5lY3QgdG8gdGhlIGJyb3dzZXIgdXNpbmcgcHVyZSBCaURpLiBJZiB0aGUgcHJvdG9jb2wgaXNcbiAqIG5vdCBzdXBwb3J0ZWQsIGNvbm5lY3RzIHRvIHRoZSBicm93c2VyIHVzaW5nIEJpRGkgb3ZlciBDRFAuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfY29ubmVjdFRvQmlEaUJyb3dzZXIoY29ubmVjdGlvblRyYW5zcG9ydCwgdXJsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyBpZ25vcmVIVFRQU0Vycm9ycyA9IGZhbHNlLCBkZWZhdWx0Vmlld3BvcnQgPSBERUZBVUxUX1ZJRVdQT1JUIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgYmlkaUNvbm5lY3Rpb24sIGNsb3NlQ2FsbGJhY2sgfSA9IGF3YWl0IGdldEJpRGlDb25uZWN0aW9uKGNvbm5lY3Rpb25UcmFuc3BvcnQsIHVybCwgb3B0aW9ucyk7XG4gICAgY29uc3QgQmlEaSA9IGF3YWl0IGltcG9ydCgvKiA6IHRydWUgKi8gJy4vYmlkaS5qcycpO1xuICAgIGNvbnN0IGJpZGlCcm93c2VyID0gYXdhaXQgQmlEaS5CaWRpQnJvd3Nlci5jcmVhdGUoe1xuICAgICAgICBjb25uZWN0aW9uOiBiaWRpQ29ubmVjdGlvbixcbiAgICAgICAgY2xvc2VDYWxsYmFjayxcbiAgICAgICAgcHJvY2VzczogdW5kZWZpbmVkLFxuICAgICAgICBkZWZhdWx0Vmlld3BvcnQ6IGRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IGlnbm9yZUhUVFBTRXJyb3JzLFxuICAgIH0pO1xuICAgIHJldHVybiBiaWRpQnJvd3Nlcjtcbn1cbi8qKlxuICogUmV0dXJucyBhIEJpRGlDb25uZWN0aW9uIGVzdGFibGlzaGVkIHRvIHRoZSBlbmRwb2ludCBzcGVjaWZpZWQgYnkgdGhlIG9wdGlvbnMgYW5kIGFcbiAqIGNhbGxiYWNrIGNsb3NpbmcgdGhlIGJyb3dzZXIuIENhbGxiYWNrIGRlcGVuZHMgb24gd2hldGhlciB0aGUgY29ubmVjdGlvbiBpcyBwdXJlIEJpRGlcbiAqIG9yIEJpRGkgb3ZlciBDRFAuXG4gKiBUaGUgbWV0aG9kIHRyaWVzIHRvIGNvbm5lY3QgdG8gdGhlIGJyb3dzZXIgdXNpbmcgcHVyZSBCaURpIHByb3RvY29sLCBhbmQgZmFsbHMgYmFja1xuICogdG8gQmlEaSBvdmVyIENEUC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QmlEaUNvbm5lY3Rpb24oY29ubmVjdGlvblRyYW5zcG9ydCwgdXJsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgQmlEaSA9IGF3YWl0IGltcG9ydCgvKiA6IHRydWUgKi8gJy4vYmlkaS5qcycpO1xuICAgIGNvbnN0IHsgaWdub3JlSFRUUFNFcnJvcnMgPSBmYWxzZSwgc2xvd01vID0gMCwgcHJvdG9jb2xUaW1lb3V0IH0gPSBvcHRpb25zO1xuICAgIC8vIFRyeSBwdXJlIEJpRGkgZmlyc3QuXG4gICAgY29uc3QgcHVyZUJpZGlDb25uZWN0aW9uID0gbmV3IEJpRGkuQmlkaUNvbm5lY3Rpb24odXJsLCBjb25uZWN0aW9uVHJhbnNwb3J0LCBzbG93TW8sIHByb3RvY29sVGltZW91dCk7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHVyZUJpZGlDb25uZWN0aW9uLnNlbmQoJ3Nlc3Npb24uc3RhdHVzJywge30pO1xuICAgICAgICBpZiAoJ3R5cGUnIGluIHJlc3VsdCAmJiByZXN1bHQudHlwZSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAvLyBUaGUgYGJyb3dzZXJXU0VuZHBvaW50YCBwb2ludHMgdG8gYW4gZW5kcG9pbnQgc3VwcG9ydGluZyBwdXJlIFdlYkRyaXZlciBCaURpLlxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBiaWRpQ29ubmVjdGlvbjogcHVyZUJpZGlDb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGNsb3NlQ2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHVyZUJpZGlDb25uZWN0aW9uLnNlbmQoJ2Jyb3dzZXIuY2xvc2UnLCB7fSkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIFByb3RvY29sRXJyb3IpKSB7XG4gICAgICAgICAgICAvLyBVbmV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgcmVsYXRlZCB0byBCaURpIC8gQ0RQLiBSZXRocm93LlxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBVbmJpbmQgdGhlIGNvbm5lY3Rpb24gdG8gYXZvaWQgbWVtb3J5IGxlYWtzLlxuICAgIHB1cmVCaWRpQ29ubmVjdGlvbi51bmJpbmQoKTtcbiAgICAvLyBGYWxsIGJhY2sgdG8gQ0RQIG92ZXIgQmlEaSByZXVzaW5nIHRoZSBXUyBjb25uZWN0aW9uLlxuICAgIGNvbnN0IGNkcENvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbih1cmwsIGNvbm5lY3Rpb25UcmFuc3BvcnQsIHNsb3dNbywgcHJvdG9jb2xUaW1lb3V0KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgY2RwQ29ubmVjdGlvbi5zZW5kKCdCcm93c2VyLmdldFZlcnNpb24nKTtcbiAgICBpZiAodmVyc2lvbi5wcm9kdWN0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ZpcmVmb3gnKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb24oJ0ZpcmVmb3ggaXMgbm90IHN1cHBvcnRlZCBpbiBCaURpIG92ZXIgQ0RQIG1vZGUuJyk7XG4gICAgfVxuICAgIC8vIFRPRE86IHVzZSBvdGhlciBvcHRpb25zIHRvby5cbiAgICBjb25zdCBiaWRpT3ZlckNkcENvbm5lY3Rpb24gPSBhd2FpdCBCaURpLmNvbm5lY3RCaWRpT3ZlckNkcChjZHBDb25uZWN0aW9uLCB7XG4gICAgICAgIGFjY2VwdEluc2VjdXJlQ2VydHM6IGlnbm9yZUhUVFBTRXJyb3JzLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGJpZGlDb25uZWN0aW9uOiBiaWRpT3ZlckNkcENvbm5lY3Rpb24sXG4gICAgICAgIGNsb3NlQ2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgQmlEaSBvdmVyIENEUCwgd2UgbmVlZCB0byBjbG9zZSBicm93c2VyIHZpYSBDRFAuXG4gICAgICAgICAgICBhd2FpdCBjZHBDb25uZWN0aW9uLnNlbmQoJ0Jyb3dzZXIuY2xvc2UnKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckNvbm5lY3Rvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgQWNjZXNzaWJpbGl0eSBjbGFzcyBwcm92aWRlcyBtZXRob2RzIGZvciBpbnNwZWN0aW5nIHRoZSBicm93c2VyJ3NcbiAqIGFjY2Vzc2liaWxpdHkgdHJlZS4gVGhlIGFjY2Vzc2liaWxpdHkgdHJlZSBpcyB1c2VkIGJ5IGFzc2lzdGl2ZSB0ZWNobm9sb2d5XG4gKiBzdWNoIGFzIHtAbGluayBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TY3JlZW5fcmVhZGVyIHwgc2NyZWVuIHJlYWRlcnN9IG9yXG4gKiB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3dpdGNoX2FjY2VzcyB8IHN3aXRjaGVzfS5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIEFjY2Vzc2liaWxpdHkgaXMgYSB2ZXJ5IHBsYXRmb3JtLXNwZWNpZmljIHRoaW5nLiBPbiBkaWZmZXJlbnQgcGxhdGZvcm1zLFxuICogdGhlcmUgYXJlIGRpZmZlcmVudCBzY3JlZW4gcmVhZGVycyB0aGF0IG1pZ2h0IGhhdmUgd2lsZGx5IGRpZmZlcmVudCBvdXRwdXQuXG4gKlxuICogQmxpbmsgLSBDaHJvbWUncyByZW5kZXJpbmcgZW5naW5lIC0gaGFzIGEgY29uY2VwdCBvZiBcImFjY2Vzc2liaWxpdHkgdHJlZVwiLFxuICogd2hpY2ggaXMgdGhlbiB0cmFuc2xhdGVkIGludG8gZGlmZmVyZW50IHBsYXRmb3JtLXNwZWNpZmljIEFQSXMuIEFjY2Vzc2liaWxpdHlcbiAqIG5hbWVzcGFjZSBnaXZlcyB1c2VycyBhY2Nlc3MgdG8gdGhlIEJsaW5rIEFjY2Vzc2liaWxpdHkgVHJlZS5cbiAqXG4gKiBNb3N0IG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUgZ2V0cyBmaWx0ZXJlZCBvdXQgd2hlbiBjb252ZXJ0aW5nIGZyb20gQmxpbmtcbiAqIEFYIFRyZWUgdG8gUGxhdGZvcm0tc3BlY2lmaWMgQVgtVHJlZSBvciBieSBhc3Npc3RpdmUgdGVjaG5vbG9naWVzIHRoZW1zZWx2ZXMuXG4gKiBCeSBkZWZhdWx0LCBQdXBwZXRlZXIgdHJpZXMgdG8gYXBwcm94aW1hdGUgdGhpcyBmaWx0ZXJpbmcsIGV4cG9zaW5nIG9ubHlcbiAqIHRoZSBcImludGVyZXN0aW5nXCIgbm9kZXMgb2YgdGhlIHRyZWUuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQWNjZXNzaWJpbGl0eSB7XG4gICAgI3JlYWxtO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJlYWxtKSB7XG4gICAgICAgIHRoaXMuI3JlYWxtID0gcmVhbG07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhcHR1cmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuXG4gICAgICogVGhlIHJldHVybmVkIG9iamVjdCByZXByZXNlbnRzIHRoZSByb290IGFjY2Vzc2libGUgbm9kZSBvZiB0aGUgcGFnZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBUaGUgQ2hyb21lIGFjY2Vzc2liaWxpdHkgdHJlZSBjb250YWlucyBub2RlcyB0aGF0IGdvIHVudXNlZCBvblxuICAgICAqIG1vc3QgcGxhdGZvcm1zIGFuZCBieSBtb3N0IHNjcmVlbiByZWFkZXJzLiBQdXBwZXRlZXIgd2lsbCBkaXNjYXJkIHRoZW0gYXNcbiAgICAgKiB3ZWxsIGZvciBhbiBlYXNpZXIgdG8gcHJvY2VzcyB0cmVlLCB1bmxlc3MgYGludGVyZXN0aW5nT25seWAgaXMgc2V0IHRvXG4gICAgICogYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogQW4gZXhhbXBsZSBvZiBkdW1waW5nIHRoZSBlbnRpcmUgYWNjZXNzaWJpbGl0eSB0cmVlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHBhZ2UuYWNjZXNzaWJpbGl0eS5zbmFwc2hvdCgpO1xuICAgICAqIGNvbnNvbGUubG9nKHNuYXBzaG90KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogQW4gZXhhbXBsZSBvZiBsb2dnaW5nIHRoZSBmb2N1c2VkIG5vZGUncyBuYW1lOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHBhZ2UuYWNjZXNzaWJpbGl0eS5zbmFwc2hvdCgpO1xuICAgICAqIGNvbnN0IG5vZGUgPSBmaW5kRm9jdXNlZE5vZGUoc25hcHNob3QpO1xuICAgICAqIGNvbnNvbGUubG9nKG5vZGUgJiYgbm9kZS5uYW1lKTtcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGZpbmRGb2N1c2VkTm9kZShub2RlKSB7XG4gICAgICogICBpZiAobm9kZS5mb2N1c2VkKSByZXR1cm4gbm9kZTtcbiAgICAgKiAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbiB8fCBbXSkge1xuICAgICAqICAgICBjb25zdCBmb3VuZE5vZGUgPSBmaW5kRm9jdXNlZE5vZGUoY2hpbGQpO1xuICAgICAqICAgICByZXR1cm4gZm91bmROb2RlO1xuICAgICAqICAgfVxuICAgICAqICAgcmV0dXJuIG51bGw7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gQVhOb2RlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNuYXBzaG90LlxuICAgICAqL1xuICAgIGFzeW5jIHNuYXBzaG90KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGludGVyZXN0aW5nT25seSA9IHRydWUsIHJvb3QgPSBudWxsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCB7IG5vZGVzIH0gPSBhd2FpdCB0aGlzLiNyZWFsbS5lbnZpcm9ubWVudC5jbGllbnQuc2VuZCgnQWNjZXNzaWJpbGl0eS5nZXRGdWxsQVhUcmVlJyk7XG4gICAgICAgIGxldCBiYWNrZW5kTm9kZUlkO1xuICAgICAgICBpZiAocm9vdCkge1xuICAgICAgICAgICAgY29uc3QgeyBub2RlIH0gPSBhd2FpdCB0aGlzLiNyZWFsbS5lbnZpcm9ubWVudC5jbGllbnQuc2VuZCgnRE9NLmRlc2NyaWJlTm9kZScsIHtcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogcm9vdC5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYmFja2VuZE5vZGVJZCA9IG5vZGUuYmFja2VuZE5vZGVJZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZhdWx0Um9vdCA9IEFYTm9kZS5jcmVhdGVUcmVlKHRoaXMuI3JlYWxtLCBub2Rlcyk7XG4gICAgICAgIGxldCBuZWVkbGUgPSBkZWZhdWx0Um9vdDtcbiAgICAgICAgaWYgKGJhY2tlbmROb2RlSWQpIHtcbiAgICAgICAgICAgIG5lZWRsZSA9IGRlZmF1bHRSb290LmZpbmQobm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUucGF5bG9hZC5iYWNrZW5kRE9NTm9kZUlkID09PSBiYWNrZW5kTm9kZUlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIW5lZWRsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaW50ZXJlc3RpbmdPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVUcmVlKG5lZWRsZSlbMF0gPz8gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnRlcmVzdGluZ05vZGVzID0gbmV3IFNldCgpO1xuICAgICAgICB0aGlzLmNvbGxlY3RJbnRlcmVzdGluZ05vZGVzKGludGVyZXN0aW5nTm9kZXMsIGRlZmF1bHRSb290LCBmYWxzZSk7XG4gICAgICAgIGlmICghaW50ZXJlc3RpbmdOb2Rlcy5oYXMobmVlZGxlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplVHJlZShuZWVkbGUsIGludGVyZXN0aW5nTm9kZXMpWzBdID8/IG51bGw7XG4gICAgfVxuICAgIHNlcmlhbGl6ZVRyZWUobm9kZSwgaW50ZXJlc3RpbmdOb2Rlcykge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goLi4udGhpcy5zZXJpYWxpemVUcmVlKGNoaWxkLCBpbnRlcmVzdGluZ05vZGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyZXN0aW5nTm9kZXMgJiYgIWludGVyZXN0aW5nTm9kZXMuaGFzKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZE5vZGUgPSBub2RlLnNlcmlhbGl6ZSgpO1xuICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZXJpYWxpemVkTm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbc2VyaWFsaXplZE5vZGVdO1xuICAgIH1cbiAgICBjb2xsZWN0SW50ZXJlc3RpbmdOb2Rlcyhjb2xsZWN0aW9uLCBub2RlLCBpbnNpZGVDb250cm9sKSB7XG4gICAgICAgIGlmIChub2RlLmlzSW50ZXJlc3RpbmcoaW5zaWRlQ29udHJvbCkpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmlzTGVhZk5vZGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGluc2lkZUNvbnRyb2wgPSBpbnNpZGVDb250cm9sIHx8IG5vZGUuaXNDb250cm9sKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgdGhpcy5jb2xsZWN0SW50ZXJlc3RpbmdOb2Rlcyhjb2xsZWN0aW9uLCBjaGlsZCwgaW5zaWRlQ29udHJvbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBBWE5vZGUge1xuICAgIHBheWxvYWQ7XG4gICAgY2hpbGRyZW4gPSBbXTtcbiAgICAjcmljaGx5RWRpdGFibGUgPSBmYWxzZTtcbiAgICAjZWRpdGFibGUgPSBmYWxzZTtcbiAgICAjZm9jdXNhYmxlID0gZmFsc2U7XG4gICAgI2hpZGRlbiA9IGZhbHNlO1xuICAgICNuYW1lO1xuICAgICNyb2xlO1xuICAgICNpZ25vcmVkO1xuICAgICNjYWNoZWRIYXNGb2N1c2FibGVDaGlsZDtcbiAgICAjcmVhbG07XG4gICAgY29uc3RydWN0b3IocmVhbG0sIHBheWxvYWQpIHtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgdGhpcy4jbmFtZSA9IHRoaXMucGF5bG9hZC5uYW1lID8gdGhpcy5wYXlsb2FkLm5hbWUudmFsdWUgOiAnJztcbiAgICAgICAgdGhpcy4jcm9sZSA9IHRoaXMucGF5bG9hZC5yb2xlID8gdGhpcy5wYXlsb2FkLnJvbGUudmFsdWUgOiAnVW5rbm93bic7XG4gICAgICAgIHRoaXMuI2lnbm9yZWQgPSB0aGlzLnBheWxvYWQuaWdub3JlZDtcbiAgICAgICAgdGhpcy4jcmVhbG0gPSByZWFsbTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLnBheWxvYWQucHJvcGVydGllcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm5hbWUgPT09ICdlZGl0YWJsZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyaWNobHlFZGl0YWJsZSA9IHByb3BlcnR5LnZhbHVlLnZhbHVlID09PSAncmljaHRleHQnO1xuICAgICAgICAgICAgICAgIHRoaXMuI2VkaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5uYW1lID09PSAnZm9jdXNhYmxlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2ZvY3VzYWJsZSA9IHByb3BlcnR5LnZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm5hbWUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jaGlkZGVuID0gcHJvcGVydHkudmFsdWUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2lzUGxhaW5UZXh0RmllbGQoKSB7XG4gICAgICAgIGlmICh0aGlzLiNyaWNobHlFZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNlZGl0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI3JvbGUgPT09ICd0ZXh0Ym94JyB8fCB0aGlzLiNyb2xlID09PSAnc2VhcmNoYm94JztcbiAgICB9XG4gICAgI2lzVGV4dE9ubHlPYmplY3QoKSB7XG4gICAgICAgIGNvbnN0IHJvbGUgPSB0aGlzLiNyb2xlO1xuICAgICAgICByZXR1cm4gKHJvbGUgPT09ICdMaW5lQnJlYWsnIHx8XG4gICAgICAgICAgICByb2xlID09PSAndGV4dCcgfHxcbiAgICAgICAgICAgIHJvbGUgPT09ICdJbmxpbmVUZXh0Qm94JyB8fFxuICAgICAgICAgICAgcm9sZSA9PT0gJ1N0YXRpY1RleHQnKTtcbiAgICB9XG4gICAgI2hhc0ZvY3VzYWJsZUNoaWxkKCkge1xuICAgICAgICBpZiAodGhpcy4jY2FjaGVkSGFzRm9jdXNhYmxlQ2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy4jY2FjaGVkSGFzRm9jdXNhYmxlQ2hpbGQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC4jZm9jdXNhYmxlIHx8IGNoaWxkLiNoYXNGb2N1c2FibGVDaGlsZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2NhY2hlZEhhc0ZvY3VzYWJsZUNoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWNoZWRIYXNGb2N1c2FibGVDaGlsZDtcbiAgICB9XG4gICAgZmluZChwcmVkaWNhdGUpIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh0aGlzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGlsZC5maW5kKHByZWRpY2F0ZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaXNMZWFmTm9kZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlc2UgdHlwZXMgb2Ygb2JqZWN0cyBtYXkgaGF2ZSBjaGlsZHJlbiB0aGF0IHdlIHVzZSBhcyBpbnRlcm5hbFxuICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCBidXQgd2Ugd2FudCB0byBleHBvc2UgdGhlbSBhcyBsZWF2ZXMgdG8gcGxhdGZvcm1cbiAgICAgICAgLy8gYWNjZXNzaWJpbGl0eSBBUElzIGJlY2F1c2Ugc2NyZWVuIHJlYWRlcnMgbWlnaHQgYmUgY29uZnVzZWQgaWYgdGhleSBmaW5kXG4gICAgICAgIC8vIGFueSBjaGlsZHJlbi5cbiAgICAgICAgaWYgKHRoaXMuI2lzUGxhaW5UZXh0RmllbGQoKSB8fCB0aGlzLiNpc1RleHRPbmx5T2JqZWN0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJvbGVzIHdob3NlIGNoaWxkcmVuIGFyZSBvbmx5IHByZXNlbnRhdGlvbmFsIGFjY29yZGluZyB0byB0aGUgQVJJQSBhbmRcbiAgICAgICAgLy8gSFRNTDUgU3BlY3Mgc2hvdWxkIGJlIGhpZGRlbiBmcm9tIHNjcmVlbiByZWFkZXJzLlxuICAgICAgICAvLyAoTm90ZSB0aGF0IHdoaWxzdCBBUklBIGJ1dHRvbnMgY2FuIGhhdmUgb25seSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiwgSFRNTDVcbiAgICAgICAgLy8gYnV0dG9ucyBhcmUgYWxsb3dlZCB0byBoYXZlIGNvbnRlbnQuKVxuICAgICAgICBzd2l0Y2ggKHRoaXMuI3JvbGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1jb3Zlcic6XG4gICAgICAgICAgICBjYXNlICdncmFwaGljcy1zeW1ib2wnOlxuICAgICAgICAgICAgY2FzZSAnaW1nJzpcbiAgICAgICAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgICAgIGNhc2UgJ01ldGVyJzpcbiAgICAgICAgICAgIGNhc2UgJ3Njcm9sbGJhcic6XG4gICAgICAgICAgICBjYXNlICdzbGlkZXInOlxuICAgICAgICAgICAgY2FzZSAnc2VwYXJhdG9yJzpcbiAgICAgICAgICAgIGNhc2UgJ3Byb2dyZXNzYmFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGVyZSBhbmQgYmVsb3c6IEFuZHJvaWQgaGV1cmlzdGljc1xuICAgICAgICBpZiAodGhpcy4jaGFzRm9jdXNhYmxlQ2hpbGQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNmb2N1c2FibGUgJiYgdGhpcy4jbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3JvbGUgPT09ICdoZWFkaW5nJyAmJiB0aGlzLiNuYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlzQ29udHJvbCgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLiNyb2xlKSB7XG4gICAgICAgICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgY2FzZSAnQ29sb3JXZWxsJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbWJvYm94JzpcbiAgICAgICAgICAgIGNhc2UgJ0Rpc2Nsb3N1cmVUcmlhbmdsZSc6XG4gICAgICAgICAgICBjYXNlICdsaXN0Ym94JzpcbiAgICAgICAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgICAgICAgY2FzZSAnbWVudWJhcic6XG4gICAgICAgICAgICBjYXNlICdtZW51aXRlbSc6XG4gICAgICAgICAgICBjYXNlICdtZW51aXRlbWNoZWNrYm94JzpcbiAgICAgICAgICAgIGNhc2UgJ21lbnVpdGVtcmFkaW8nOlxuICAgICAgICAgICAgY2FzZSAncmFkaW8nOlxuICAgICAgICAgICAgY2FzZSAnc2Nyb2xsYmFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NlYXJjaGJveCc6XG4gICAgICAgICAgICBjYXNlICdzbGlkZXInOlxuICAgICAgICAgICAgY2FzZSAnc3BpbmJ1dHRvbic6XG4gICAgICAgICAgICBjYXNlICdzd2l0Y2gnOlxuICAgICAgICAgICAgY2FzZSAndGFiJzpcbiAgICAgICAgICAgIGNhc2UgJ3RleHRib3gnOlxuICAgICAgICAgICAgY2FzZSAndHJlZSc6XG4gICAgICAgICAgICBjYXNlICd0cmVlaXRlbSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc0ludGVyZXN0aW5nKGluc2lkZUNvbnRyb2wpIHtcbiAgICAgICAgY29uc3Qgcm9sZSA9IHRoaXMuI3JvbGU7XG4gICAgICAgIGlmIChyb2xlID09PSAnSWdub3JlZCcgfHwgdGhpcy4jaGlkZGVuIHx8IHRoaXMuI2lnbm9yZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jZm9jdXNhYmxlIHx8IHRoaXMuI3JpY2hseUVkaXRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBpdCdzIG5vdCBmb2N1c2FibGUgYnV0IGhhcyBhIGNvbnRyb2wgcm9sZSwgdGhlbiBpdCdzIGludGVyZXN0aW5nLlxuICAgICAgICBpZiAodGhpcy5pc0NvbnRyb2woKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQSBub24gZm9jdXNhYmxlIGNoaWxkIG9mIGEgY29udHJvbCBpcyBub3QgaW50ZXJlc3RpbmdcbiAgICAgICAgaWYgKGluc2lkZUNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pc0xlYWZOb2RlKCkgJiYgISF0aGlzLiNuYW1lO1xuICAgIH1cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdGhpcy5wYXlsb2FkLnByb3BlcnRpZXMgfHwgW10pIHtcbiAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0KHByb3BlcnR5Lm5hbWUudG9Mb3dlckNhc2UoKSwgcHJvcGVydHkudmFsdWUudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBheWxvYWQubmFtZSkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoJ25hbWUnLCB0aGlzLnBheWxvYWQubmFtZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGF5bG9hZC52YWx1ZSkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoJ3ZhbHVlJywgdGhpcy5wYXlsb2FkLnZhbHVlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXlsb2FkLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnNldCgnZGVzY3JpcHRpb24nLCB0aGlzLnBheWxvYWQuZGVzY3JpcHRpb24udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgICAgICByb2xlOiB0aGlzLiNyb2xlLFxuICAgICAgICAgICAgZWxlbWVudEhhbmRsZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5wYXlsb2FkLmJhY2tlbmRET01Ob2RlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy4jcmVhbG0uYWRvcHRCYWNrZW5kTm9kZSh0aGlzLnBheWxvYWQuYmFja2VuZERPTU5vZGVJZCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdXNlclN0cmluZ1Byb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICdrZXlzaG9ydGN1dHMnLFxuICAgICAgICAgICAgJ3JvbGVkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAndmFsdWV0ZXh0JyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgZ2V0VXNlclN0cmluZ1Byb3BlcnR5VmFsdWUgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCB1c2VyU3RyaW5nUHJvcGVydHkgb2YgdXNlclN0cmluZ1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICghcHJvcGVydGllcy5oYXModXNlclN0cmluZ1Byb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZVt1c2VyU3RyaW5nUHJvcGVydHldID0gZ2V0VXNlclN0cmluZ1Byb3BlcnR5VmFsdWUodXNlclN0cmluZ1Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBib29sZWFuUHJvcGVydGllcyA9IFtcbiAgICAgICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICAgICAnZXhwYW5kZWQnLFxuICAgICAgICAgICAgJ2ZvY3VzZWQnLFxuICAgICAgICAgICAgJ21vZGFsJyxcbiAgICAgICAgICAgICdtdWx0aWxpbmUnLFxuICAgICAgICAgICAgJ211bHRpc2VsZWN0YWJsZScsXG4gICAgICAgICAgICAncmVhZG9ubHknLFxuICAgICAgICAgICAgJ3JlcXVpcmVkJyxcbiAgICAgICAgICAgICdzZWxlY3RlZCcsXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGdldEJvb2xlYW5Qcm9wZXJ0eVZhbHVlID0gKGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0KGtleSk7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgYm9vbGVhblByb3BlcnR5IG9mIGJvb2xlYW5Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAvLyBSb290V2ViQXJlYSdzIHRyZWF0IGZvY3VzIGRpZmZlcmVudGx5IHRoYW4gb3RoZXIgbm9kZXMuIFRoZXkgcmVwb3J0IHdoZXRoZXJcbiAgICAgICAgICAgIC8vIHRoZWlyIGZyYW1lICBoYXMgZm9jdXMsIG5vdCB3aGV0aGVyIGZvY3VzIGlzIHNwZWNpZmljYWxseSBvbiB0aGUgcm9vdFxuICAgICAgICAgICAgLy8gbm9kZS5cbiAgICAgICAgICAgIGlmIChib29sZWFuUHJvcGVydHkgPT09ICdmb2N1c2VkJyAmJiB0aGlzLiNyb2xlID09PSAnUm9vdFdlYkFyZWEnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEJvb2xlYW5Qcm9wZXJ0eVZhbHVlKGJvb2xlYW5Qcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlW2Jvb2xlYW5Qcm9wZXJ0eV0gPSBnZXRCb29sZWFuUHJvcGVydHlWYWx1ZShib29sZWFuUHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyaXN0YXRlUHJvcGVydGllcyA9IFsnY2hlY2tlZCcsICdwcmVzc2VkJ107XG4gICAgICAgIGZvciAoY29uc3QgdHJpc3RhdGVQcm9wZXJ0eSBvZiB0cmlzdGF0ZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGlmICghcHJvcGVydGllcy5oYXModHJpc3RhdGVQcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydGllcy5nZXQodHJpc3RhdGVQcm9wZXJ0eSk7XG4gICAgICAgICAgICBub2RlW3RyaXN0YXRlUHJvcGVydHldID1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9PT0gJ21peGVkJyA/ICdtaXhlZCcgOiB2YWx1ZSA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG51bWVyaWNhbFByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAnbGV2ZWwnLFxuICAgICAgICAgICAgJ3ZhbHVlbWF4JyxcbiAgICAgICAgICAgICd2YWx1ZW1pbicsXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGdldE51bWVyaWNhbFByb3BlcnR5VmFsdWUgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBudW1lcmljYWxQcm9wZXJ0eSBvZiBudW1lcmljYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMuaGFzKG51bWVyaWNhbFByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZVtudW1lcmljYWxQcm9wZXJ0eV0gPSBnZXROdW1lcmljYWxQcm9wZXJ0eVZhbHVlKG51bWVyaWNhbFByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlblByb3BlcnRpZXMgPSBbXG4gICAgICAgICAgICAnYXV0b2NvbXBsZXRlJyxcbiAgICAgICAgICAgICdoYXNwb3B1cCcsXG4gICAgICAgICAgICAnaW52YWxpZCcsXG4gICAgICAgICAgICAnb3JpZW50YXRpb24nLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBnZXRUb2tlblByb3BlcnR5VmFsdWUgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlblByb3BlcnR5IG9mIHRva2VuUHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRUb2tlblByb3BlcnR5VmFsdWUodG9rZW5Qcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlW3Rva2VuUHJvcGVydHldID0gZ2V0VG9rZW5Qcm9wZXJ0eVZhbHVlKHRva2VuUHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlVHJlZShyZWFsbSwgcGF5bG9hZHMpIHtcbiAgICAgICAgY29uc3Qgbm9kZUJ5SWQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgcGF5bG9hZCBvZiBwYXlsb2Fkcykge1xuICAgICAgICAgICAgbm9kZUJ5SWQuc2V0KHBheWxvYWQubm9kZUlkLCBuZXcgQVhOb2RlKHJlYWxtLCBwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVCeUlkLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkSWQgb2Ygbm9kZS5wYXlsb2FkLmNoaWxkSWRzIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlQnlJZC5nZXQoY2hpbGRJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlQnlJZC52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWNjZXNzaWJpbGl0eS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi4vY29tbW9uL1F1ZXJ5SGFuZGxlci5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBBc3luY0l0ZXJhYmxlVXRpbCB9IGZyb20gJy4uL3V0aWwvQXN5bmNJdGVyYWJsZVV0aWwuanMnO1xuY29uc3QgaXNLbm93bkF0dHJpYnV0ZSA9IChhdHRyaWJ1dGUpID0+IHtcbiAgICByZXR1cm4gWyduYW1lJywgJ3JvbGUnXS5pbmNsdWRlcyhhdHRyaWJ1dGUpO1xufTtcbmNvbnN0IG5vcm1hbGl6ZVZhbHVlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyArL2csICcgJykudHJpbSgpO1xufTtcbi8qKlxuICogVGhlIHNlbGVjdG9ycyBjb25zaXN0IG9mIGFuIGFjY2Vzc2libGUgbmFtZSB0byBxdWVyeSBmb3IgYW5kIG9wdGlvbmFsbHlcbiAqIGZ1cnRoZXIgYXJpYSBhdHRyaWJ1dGVzIG9uIHRoZSBmb3JtIGBbPGF0dHJpYnV0ZT49PHZhbHVlPl1gLlxuICogQ3VycmVudGx5LCB3ZSBvbmx5IHN1cHBvcnQgdGhlIGBuYW1lYCBhbmQgYHJvbGVgIGF0dHJpYnV0ZS5cbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvd2Nhc2UgaG93IHRoZSBzeW50YXggd29ya3Mgd3J0LiBxdWVyeWluZzpcbiAqXG4gKiAtICd0aXRsZVtyb2xlPVwiaGVhZGluZ1wiXScgcXVlcmllcyBmb3IgZWxlbWVudHMgd2l0aCBuYW1lICd0aXRsZScgYW5kIHJvbGUgJ2hlYWRpbmcnLlxuICogLSAnW3JvbGU9XCJpbWFnZVwiXScgcXVlcmllcyBmb3IgZWxlbWVudHMgd2l0aCByb2xlICdpbWFnZScgYW5kIGFueSBuYW1lLlxuICogLSAnbGFiZWwnIHF1ZXJpZXMgZm9yIGVsZW1lbnRzIHdpdGggbmFtZSAnbGFiZWwnIGFuZCBhbnkgcm9sZS5cbiAqIC0gJ1tuYW1lPVwiXCJdW3JvbGU9XCJidXR0b25cIl0nIHF1ZXJpZXMgZm9yIGVsZW1lbnRzIHdpdGggbm8gbmFtZSBhbmQgcm9sZSAnYnV0dG9uJy5cbiAqL1xuY29uc3QgQVRUUklCVVRFX1JFR0VYUCA9IC9cXFtcXHMqKD88YXR0cmlidXRlPlxcdyspXFxzKj1cXHMqKD88cXVvdGU+XCJ8JykoPzx2YWx1ZT5cXFxcLnwuKj8oPz1cXGs8cXVvdGU+KSlcXGs8cXVvdGU+XFxzKlxcXS9nO1xuY29uc3QgcGFyc2VBUklBU2VsZWN0b3IgPSAoc2VsZWN0b3IpID0+IHtcbiAgICBjb25zdCBxdWVyeU9wdGlvbnMgPSB7fTtcbiAgICBjb25zdCBkZWZhdWx0TmFtZSA9IHNlbGVjdG9yLnJlcGxhY2UoQVRUUklCVVRFX1JFR0VYUCwgKF8sIGF0dHJpYnV0ZSwgX18sIHZhbHVlKSA9PiB7XG4gICAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS50cmltKCk7XG4gICAgICAgIGFzc2VydChpc0tub3duQXR0cmlidXRlKGF0dHJpYnV0ZSksIGBVbmtub3duIGFyaWEgYXR0cmlidXRlIFwiJHthdHRyaWJ1dGV9XCIgaW4gc2VsZWN0b3JgKTtcbiAgICAgICAgcXVlcnlPcHRpb25zW2F0dHJpYnV0ZV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcbiAgICBpZiAoZGVmYXVsdE5hbWUgJiYgIXF1ZXJ5T3B0aW9ucy5uYW1lKSB7XG4gICAgICAgIHF1ZXJ5T3B0aW9ucy5uYW1lID0gbm9ybWFsaXplVmFsdWUoZGVmYXVsdE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gcXVlcnlPcHRpb25zO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBBUklBUXVlcnlIYW5kbGVyIGV4dGVuZHMgUXVlcnlIYW5kbGVyIHtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvciA9IGFzeW5jIChub2RlLCBzZWxlY3RvciwgeyBhcmlhUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBhcmlhUXVlcnlTZWxlY3Rvcihub2RlLCBzZWxlY3Rvcik7XG4gICAgfTtcbiAgICBzdGF0aWMgYXN5bmMgKnF1ZXJ5QWxsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgcm9sZSB9ID0gcGFyc2VBUklBU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICB5aWVsZCogZWxlbWVudC5xdWVyeUFYVHJlZShuYW1lLCByb2xlKTtcbiAgICB9XG4gICAgc3RhdGljIHF1ZXJ5T25lID0gYXN5bmMgKGVsZW1lbnQsIHNlbGVjdG9yKSA9PiB7XG4gICAgICAgIHJldHVybiAoKGF3YWl0IEFzeW5jSXRlcmFibGVVdGlsLmZpcnN0KHRoaXMucXVlcnlBbGwoZWxlbWVudCwgc2VsZWN0b3IpKSkgPz8gbnVsbCk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFyaWFRdWVyeUhhbmRsZXIuanMubWFwIiwidmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBKU0hhbmRsZSB9IGZyb20gJy4uL2FwaS9KU0hhbmRsZS5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IGlzRXJyb3JMaWtlIH0gZnJvbSAnLi4vdXRpbC9FcnJvckxpa2UuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEJpbmRpbmcge1xuICAgICNuYW1lO1xuICAgICNmbjtcbiAgICAjaW5pdFNvdXJjZTtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBmbiwgaW5pdFNvdXJjZSkge1xuICAgICAgICB0aGlzLiNuYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy4jZm4gPSBmbjtcbiAgICAgICAgdGhpcy4jaW5pdFNvdXJjZSA9IGluaXRTb3VyY2U7XG4gICAgfVxuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbmFtZTtcbiAgICB9XG4gICAgZ2V0IGluaXRTb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpbml0U291cmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29udGV4dCAtIENvbnRleHQgdG8gcnVuIHRoZSBiaW5kaW5nIGluOyB0aGUgY29udGV4dCBzaG91bGQgaGF2ZVxuICAgICAqIHRoZSBiaW5kaW5nIGFkZGVkIHRvIGl0IGJlZm9yZWhhbmQuXG4gICAgICogQHBhcmFtIGlkIC0gSUQgb2YgdGhlIGNhbGwuIFRoaXMgc2hvdWxkIGNvbWUgZnJvbSB0aGUgQ0RQXG4gICAgICogYG9uQmluZGluZ0NhbGxlZGAgcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIGFyZ3MgLSBQbGFpbiBhcmd1bWVudHMgZnJvbSBDRFAuXG4gICAgICovXG4gICAgYXN5bmMgcnVuKGNvbnRleHQsIGlkLCBhcmdzLCBpc1RyaXZpYWwpIHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWlzVHJpdmlhbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldHRpbmcgbm9uLXRyaXZpYWwgYXJndW1lbnRzLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVzID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IGNvbnRleHQuZXZhbHVhdGVIYW5kbGUoKG5hbWUsIHNlcSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBDb2RlIGlzIGV2YWx1YXRlZCBpbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFRoaXNbbmFtZV0uYXJncy5nZXQoc2VxKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy4jbmFtZSwgaWQpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBhd2FpdCBoYW5kbGVzLmdldFByb3BlcnRpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGhhbmRsZV0gb2YgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3Qgc3RyYWlnaHQtZm9yd2FyZCBzaW5jZSBzb21lIGFyZ3VtZW50cyBjYW4gc3RyaW5naWZ5LCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZW4ndCBwbGFpbiBvYmplY3RzIHNvIGFkZCBzdWJ0eXBlcyB3aGVuIHRoZSB1c2UtY2FzZSBhcmlzZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggaW4gYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaGFuZGxlLnJlbW90ZU9iamVjdCgpLnN1YnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbm9kZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWytpbmRleF0gPSBoYW5kbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnVzZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnVzZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzEpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5ldmFsdWF0ZSgobmFtZSwgc2VxLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIENvZGUgaXMgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gZ2xvYmFsVGhpc1tuYW1lXS5jYWxsYmFja3M7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2tzLmdldChzZXEpLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICBjYWxsYmFja3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICB9LCB0aGlzLiNuYW1lLCBpZCwgYXdhaXQgdGhpcy4jZm4oLi4uYXJncykpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBKU0hhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICBzdGFjay51c2UoYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29udGV4dFxuICAgICAgICAgICAgICAgICAgICAuZXZhbHVhdGUoKG5hbWUsIHNlcSwgbWVzc2FnZSwgc3RhY2spID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnN0YWNrID0gc3RhY2s7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgQ29kZSBpcyBldmFsdWF0ZWQgaW4gYSBkaWZmZXJlbnQgY29udGV4dC5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gZ2xvYmFsVGhpc1tuYW1lXS5jYWxsYmFja3M7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5nZXQoc2VxKS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICAgICAgfSwgdGhpcy4jbmFtZSwgaWQsIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5ldmFsdWF0ZSgobmFtZSwgc2VxLCBlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIENvZGUgaXMgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGdsb2JhbFRoaXNbbmFtZV0uY2FsbGJhY2tzO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MuZ2V0KHNlcSkucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmRlbGV0ZShzZXEpO1xuICAgICAgICAgICAgICAgIH0sIHRoaXMuI25hbWUsIGlkLCBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QmluZGluZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQnJvd3NlciBhcyBCcm93c2VyQmFzZSwgfSBmcm9tICcuLi9hcGkvQnJvd3Nlci5qcyc7XG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBDZHBCcm93c2VyQ29udGV4dCB9IGZyb20gJy4vQnJvd3NlckNvbnRleHQuanMnO1xuaW1wb3J0IHsgQ2hyb21lVGFyZ2V0TWFuYWdlciB9IGZyb20gJy4vQ2hyb21lVGFyZ2V0TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBGaXJlZm94VGFyZ2V0TWFuYWdlciB9IGZyb20gJy4vRmlyZWZveFRhcmdldE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRGV2VG9vbHNUYXJnZXQsIEluaXRpYWxpemF0aW9uU3RhdHVzLCBPdGhlclRhcmdldCwgUGFnZVRhcmdldCwgV29ya2VyVGFyZ2V0LCB9IGZyb20gJy4vVGFyZ2V0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBCcm93c2VyIGV4dGVuZHMgQnJvd3NlckJhc2Uge1xuICAgIHByb3RvY29sID0gJ2NkcCc7XG4gICAgc3RhdGljIGFzeW5jIF9jcmVhdGUocHJvZHVjdCwgY29ubmVjdGlvbiwgY29udGV4dElkcywgaWdub3JlSFRUUFNFcnJvcnMsIGRlZmF1bHRWaWV3cG9ydCwgcHJvY2VzcywgY2xvc2VDYWxsYmFjaywgdGFyZ2V0RmlsdGVyQ2FsbGJhY2ssIGlzUGFnZVRhcmdldENhbGxiYWNrLCB3YWl0Rm9ySW5pdGlhbGx5RGlzY292ZXJlZFRhcmdldHMgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXIgPSBuZXcgQ2RwQnJvd3Nlcihwcm9kdWN0LCBjb25uZWN0aW9uLCBjb250ZXh0SWRzLCBkZWZhdWx0Vmlld3BvcnQsIHByb2Nlc3MsIGNsb3NlQ2FsbGJhY2ssIHRhcmdldEZpbHRlckNhbGxiYWNrLCBpc1BhZ2VUYXJnZXRDYWxsYmFjaywgd2FpdEZvckluaXRpYWxseURpc2NvdmVyZWRUYXJnZXRzKTtcbiAgICAgICAgaWYgKGlnbm9yZUhUVFBTRXJyb3JzKSB7XG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1NlY3VyaXR5LnNldElnbm9yZUNlcnRpZmljYXRlRXJyb3JzJywge1xuICAgICAgICAgICAgICAgIGlnbm9yZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGJyb3dzZXIuX2F0dGFjaCgpO1xuICAgICAgICByZXR1cm4gYnJvd3NlcjtcbiAgICB9XG4gICAgI2RlZmF1bHRWaWV3cG9ydDtcbiAgICAjcHJvY2VzcztcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjY2xvc2VDYWxsYmFjaztcbiAgICAjdGFyZ2V0RmlsdGVyQ2FsbGJhY2s7XG4gICAgI2lzUGFnZVRhcmdldENhbGxiYWNrO1xuICAgICNkZWZhdWx0Q29udGV4dDtcbiAgICAjY29udGV4dHMgPSBuZXcgTWFwKCk7XG4gICAgI3RhcmdldE1hbmFnZXI7XG4gICAgY29uc3RydWN0b3IocHJvZHVjdCwgY29ubmVjdGlvbiwgY29udGV4dElkcywgZGVmYXVsdFZpZXdwb3J0LCBwcm9jZXNzLCBjbG9zZUNhbGxiYWNrLCB0YXJnZXRGaWx0ZXJDYWxsYmFjaywgaXNQYWdlVGFyZ2V0Q2FsbGJhY2ssIHdhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cyA9IHRydWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgfHwgJ2Nocm9tZSc7XG4gICAgICAgIHRoaXMuI2RlZmF1bHRWaWV3cG9ydCA9IGRlZmF1bHRWaWV3cG9ydDtcbiAgICAgICAgdGhpcy4jcHJvY2VzcyA9IHByb2Nlc3M7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLiNjbG9zZUNhbGxiYWNrID0gY2xvc2VDYWxsYmFjayB8fCAoKCkgPT4geyB9KTtcbiAgICAgICAgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2sgPVxuICAgICAgICAgICAgdGFyZ2V0RmlsdGVyQ2FsbGJhY2sgfHxcbiAgICAgICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jc2V0SXNQYWdlVGFyZ2V0Q2FsbGJhY2soaXNQYWdlVGFyZ2V0Q2FsbGJhY2spO1xuICAgICAgICBpZiAocHJvZHVjdCA9PT0gJ2ZpcmVmb3gnKSB7XG4gICAgICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyID0gbmV3IEZpcmVmb3hUYXJnZXRNYW5hZ2VyKGNvbm5lY3Rpb24sIHRoaXMuI2NyZWF0ZVRhcmdldCwgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jdGFyZ2V0TWFuYWdlciA9IG5ldyBDaHJvbWVUYXJnZXRNYW5hZ2VyKGNvbm5lY3Rpb24sIHRoaXMuI2NyZWF0ZVRhcmdldCwgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2ssIHdhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGVmYXVsdENvbnRleHQgPSBuZXcgQ2RwQnJvd3NlckNvbnRleHQodGhpcy4jY29ubmVjdGlvbiwgdGhpcyk7XG4gICAgICAgIGZvciAoY29uc3QgY29udGV4dElkIG9mIGNvbnRleHRJZHMpIHtcbiAgICAgICAgICAgIHRoaXMuI2NvbnRleHRzLnNldChjb250ZXh0SWQsIG5ldyBDZHBCcm93c2VyQ29udGV4dCh0aGlzLiNjb25uZWN0aW9uLCB0aGlzLCBjb250ZXh0SWQpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjZW1pdERpc2Nvbm5lY3RlZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KFwiZGlzY29ubmVjdGVkXCIgLyogQnJvd3NlckV2ZW50LkRpc2Nvbm5lY3RlZCAqLywgdW5kZWZpbmVkKTtcbiAgICB9O1xuICAgIGFzeW5jIF9hdHRhY2goKSB7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24ub24oQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgdGhpcy4jZW1pdERpc2Nvbm5lY3RlZCk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0aGlzLiNvbkF0dGFjaGVkVG9UYXJnZXQpO1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLm9uKFwidGFyZ2V0R29uZVwiIC8qIFRhcmdldE1hbmFnZXJFdmVudC5UYXJnZXRHb25lICovLCB0aGlzLiNvbkRldGFjaGVkRnJvbVRhcmdldCk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXRDaGFuZ2VkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldENoYW5nZWQgKi8sIHRoaXMuI29uVGFyZ2V0Q2hhbmdlZCk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXREaXNjb3ZlcmVkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldERpc2NvdmVyZWQgKi8sIHRoaXMuI29uVGFyZ2V0RGlzY292ZXJlZCk7XG4gICAgICAgIGF3YWl0IHRoaXMuI3RhcmdldE1hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgICBfZGV0YWNoKCkge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZihDRFBTZXNzaW9uRXZlbnQuRGlzY29ubmVjdGVkLCB0aGlzLiNlbWl0RGlzY29ubmVjdGVkKTtcbiAgICAgICAgdGhpcy4jdGFyZ2V0TWFuYWdlci5vZmYoXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0aGlzLiNvbkF0dGFjaGVkVG9UYXJnZXQpO1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLm9mZihcInRhcmdldEdvbmVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0R29uZSAqLywgdGhpcy4jb25EZXRhY2hlZEZyb21UYXJnZXQpO1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLm9mZihcInRhcmdldENoYW5nZWRcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0Q2hhbmdlZCAqLywgdGhpcy4jb25UYXJnZXRDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy4jdGFyZ2V0TWFuYWdlci5vZmYoXCJ0YXJnZXREaXNjb3ZlcmVkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldERpc2NvdmVyZWQgKi8sIHRoaXMuI29uVGFyZ2V0RGlzY292ZXJlZCk7XG4gICAgfVxuICAgIHByb2Nlc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9jZXNzID8/IG51bGw7XG4gICAgfVxuICAgIF90YXJnZXRNYW5hZ2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFyZ2V0TWFuYWdlcjtcbiAgICB9XG4gICAgI3NldElzUGFnZVRhcmdldENhbGxiYWNrKGlzUGFnZVRhcmdldENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuI2lzUGFnZVRhcmdldENhbGxiYWNrID1cbiAgICAgICAgICAgIGlzUGFnZVRhcmdldENhbGxiYWNrIHx8XG4gICAgICAgICAgICAgICAgKCh0YXJnZXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0YXJnZXQudHlwZSgpID09PSAncGFnZScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC50eXBlKCkgPT09ICdiYWNrZ3JvdW5kX3BhZ2UnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQudHlwZSgpID09PSAnd2VidmlldycpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0SXNQYWdlVGFyZ2V0Q2FsbGJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc1BhZ2VUYXJnZXRDYWxsYmFjaztcbiAgICB9XG4gICAgYXN5bmMgY3JlYXRlQnJvd3NlckNvbnRleHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgcHJveHlTZXJ2ZXIsIHByb3h5QnlwYXNzTGlzdCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgeyBicm93c2VyQ29udGV4dElkIH0gPSBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5jcmVhdGVCcm93c2VyQ29udGV4dCcsIHtcbiAgICAgICAgICAgIHByb3h5U2VydmVyLFxuICAgICAgICAgICAgcHJveHlCeXBhc3NMaXN0OiBwcm94eUJ5cGFzc0xpc3QgJiYgcHJveHlCeXBhc3NMaXN0LmpvaW4oJywnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgQ2RwQnJvd3NlckNvbnRleHQodGhpcy4jY29ubmVjdGlvbiwgdGhpcywgYnJvd3NlckNvbnRleHRJZCk7XG4gICAgICAgIHRoaXMuI2NvbnRleHRzLnNldChicm93c2VyQ29udGV4dElkLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuICAgIGJyb3dzZXJDb250ZXh0cygpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLiNkZWZhdWx0Q29udGV4dCwgLi4uQXJyYXkuZnJvbSh0aGlzLiNjb250ZXh0cy52YWx1ZXMoKSldO1xuICAgIH1cbiAgICBkZWZhdWx0QnJvd3NlckNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0Q29udGV4dDtcbiAgICB9XG4gICAgYXN5bmMgX2Rpc3Bvc2VDb250ZXh0KGNvbnRleHRJZCkge1xuICAgICAgICBpZiAoIWNvbnRleHRJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LmRpc3Bvc2VCcm93c2VyQ29udGV4dCcsIHtcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IGNvbnRleHRJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2NvbnRleHRzLmRlbGV0ZShjb250ZXh0SWQpO1xuICAgIH1cbiAgICAjY3JlYXRlVGFyZ2V0ID0gKHRhcmdldEluZm8sIHNlc3Npb24pID0+IHtcbiAgICAgICAgY29uc3QgeyBicm93c2VyQ29udGV4dElkIH0gPSB0YXJnZXRJbmZvO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gYnJvd3NlckNvbnRleHRJZCAmJiB0aGlzLiNjb250ZXh0cy5oYXMoYnJvd3NlckNvbnRleHRJZClcbiAgICAgICAgICAgID8gdGhpcy4jY29udGV4dHMuZ2V0KGJyb3dzZXJDb250ZXh0SWQpXG4gICAgICAgICAgICA6IHRoaXMuI2RlZmF1bHRDb250ZXh0O1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBicm93c2VyIGNvbnRleHQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjcmVhdGVTZXNzaW9uID0gKGlzQXV0b0F0dGFjaEVtdWxhdGVkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jY29ubmVjdGlvbi5fY3JlYXRlU2Vzc2lvbih0YXJnZXRJbmZvLCBpc0F1dG9BdHRhY2hFbXVsYXRlZCk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gbmV3IE90aGVyVGFyZ2V0KHRhcmdldEluZm8sIHNlc3Npb24sIGNvbnRleHQsIHRoaXMuI3RhcmdldE1hbmFnZXIsIGNyZWF0ZVNlc3Npb24pO1xuICAgICAgICBpZiAodGFyZ2V0SW5mby51cmw/LnN0YXJ0c1dpdGgoJ2RldnRvb2xzOi8vJykpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGV2VG9vbHNUYXJnZXQodGFyZ2V0SW5mbywgc2Vzc2lvbiwgY29udGV4dCwgdGhpcy4jdGFyZ2V0TWFuYWdlciwgY3JlYXRlU2Vzc2lvbiwgdGhpcy4jZGVmYXVsdFZpZXdwb3J0ID8/IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNpc1BhZ2VUYXJnZXRDYWxsYmFjayhvdGhlclRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFnZVRhcmdldCh0YXJnZXRJbmZvLCBzZXNzaW9uLCBjb250ZXh0LCB0aGlzLiN0YXJnZXRNYW5hZ2VyLCBjcmVhdGVTZXNzaW9uLCB0aGlzLiNkZWZhdWx0Vmlld3BvcnQgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldEluZm8udHlwZSA9PT0gJ3NlcnZpY2Vfd29ya2VyJyB8fFxuICAgICAgICAgICAgdGFyZ2V0SW5mby50eXBlID09PSAnc2hhcmVkX3dvcmtlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgV29ya2VyVGFyZ2V0KHRhcmdldEluZm8sIHNlc3Npb24sIGNvbnRleHQsIHRoaXMuI3RhcmdldE1hbmFnZXIsIGNyZWF0ZVNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdGhlclRhcmdldDtcbiAgICB9O1xuICAgICNvbkF0dGFjaGVkVG9UYXJnZXQgPSBhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgIGlmICh0YXJnZXQuX2lzVGFyZ2V0RXhwb3NlZCgpICYmXG4gICAgICAgICAgICAoYXdhaXQgdGFyZ2V0Ll9pbml0aWFsaXplZERlZmVycmVkLnZhbHVlT3JUaHJvdygpKSA9PT1cbiAgICAgICAgICAgICAgICBJbml0aWFsaXphdGlvblN0YXR1cy5TVUNDRVNTKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRjcmVhdGVkXCIgLyogQnJvd3NlckV2ZW50LlRhcmdldENyZWF0ZWQgKi8sIHRhcmdldCk7XG4gICAgICAgICAgICB0YXJnZXQuYnJvd3NlckNvbnRleHQoKS5lbWl0KFwidGFyZ2V0Y3JlYXRlZFwiIC8qIEJyb3dzZXJDb250ZXh0RXZlbnQuVGFyZ2V0Q3JlYXRlZCAqLywgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgI29uRGV0YWNoZWRGcm9tVGFyZ2V0ID0gYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgICB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQucmVzb2x2ZShJbml0aWFsaXphdGlvblN0YXR1cy5BQk9SVEVEKTtcbiAgICAgICAgdGFyZ2V0Ll9pc0Nsb3NlZERlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgICAgaWYgKHRhcmdldC5faXNUYXJnZXRFeHBvc2VkKCkgJiZcbiAgICAgICAgICAgIChhd2FpdCB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQudmFsdWVPclRocm93KCkpID09PVxuICAgICAgICAgICAgICAgIEluaXRpYWxpemF0aW9uU3RhdHVzLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldGRlc3Ryb3llZFwiIC8qIEJyb3dzZXJFdmVudC5UYXJnZXREZXN0cm95ZWQgKi8sIHRhcmdldCk7XG4gICAgICAgICAgICB0YXJnZXQuYnJvd3NlckNvbnRleHQoKS5lbWl0KFwidGFyZ2V0ZGVzdHJveWVkXCIgLyogQnJvd3NlckNvbnRleHRFdmVudC5UYXJnZXREZXN0cm95ZWQgKi8sIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgICNvblRhcmdldENoYW5nZWQgPSAoeyB0YXJnZXQgfSkgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRjaGFuZ2VkXCIgLyogQnJvd3NlckV2ZW50LlRhcmdldENoYW5nZWQgKi8sIHRhcmdldCk7XG4gICAgICAgIHRhcmdldC5icm93c2VyQ29udGV4dCgpLmVtaXQoXCJ0YXJnZXRjaGFuZ2VkXCIgLyogQnJvd3NlckNvbnRleHRFdmVudC5UYXJnZXRDaGFuZ2VkICovLCB0YXJnZXQpO1xuICAgIH07XG4gICAgI29uVGFyZ2V0RGlzY292ZXJlZCA9ICh0YXJnZXRJbmZvKSA9PiB7XG4gICAgICAgIHRoaXMuZW1pdChcInRhcmdldGRpc2NvdmVyZWRcIiAvKiBCcm93c2VyRXZlbnQuVGFyZ2V0RGlzY292ZXJlZCAqLywgdGFyZ2V0SW5mbyk7XG4gICAgfTtcbiAgICB3c0VuZHBvaW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY29ubmVjdGlvbi51cmwoKTtcbiAgICB9XG4gICAgYXN5bmMgbmV3UGFnZSgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2RlZmF1bHRDb250ZXh0Lm5ld1BhZ2UoKTtcbiAgICB9XG4gICAgYXN5bmMgX2NyZWF0ZVBhZ2VJbkNvbnRleHQoY29udGV4dElkKSB7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0SWQgfSA9IGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LmNyZWF0ZVRhcmdldCcsIHtcbiAgICAgICAgICAgIHVybDogJ2Fib3V0OmJsYW5rJyxcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IGNvbnRleHRJZCB8fCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSAoYXdhaXQgdGhpcy53YWl0Rm9yVGFyZ2V0KHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHQuX3RhcmdldElkID09PSB0YXJnZXRJZDtcbiAgICAgICAgfSkpO1xuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHRhcmdldCBmb3IgcGFnZSAoaWQgPSAke3RhcmdldElkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbml0aWFsaXplZCA9IChhd2FpdCB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQudmFsdWVPclRocm93KCkpID09PVxuICAgICAgICAgICAgSW5pdGlhbGl6YXRpb25TdGF0dXMuU1VDQ0VTUztcbiAgICAgICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHRhcmdldCBmb3IgcGFnZSAoaWQgPSAke3RhcmdldElkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWdlID0gYXdhaXQgdGFyZ2V0LnBhZ2UoKTtcbiAgICAgICAgaWYgKCFwYWdlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgYSBwYWdlIGZvciBjb250ZXh0IChpZCA9ICR7Y29udGV4dElkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICB9XG4gICAgdGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy4jdGFyZ2V0TWFuYWdlci5nZXRBdmFpbGFibGVUYXJnZXRzKCkudmFsdWVzKCkpLmZpbHRlcih0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICh0YXJnZXQuX2lzVGFyZ2V0RXhwb3NlZCgpICYmXG4gICAgICAgICAgICAgICAgdGFyZ2V0Ll9pbml0aWFsaXplZERlZmVycmVkLnZhbHVlKCkgPT09IEluaXRpYWxpemF0aW9uU3RhdHVzLlNVQ0NFU1MpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGFyZ2V0KCkge1xuICAgICAgICBjb25zdCBicm93c2VyVGFyZ2V0ID0gdGhpcy50YXJnZXRzKCkuZmluZCh0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC50eXBlKCkgPT09ICdicm93c2VyJztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghYnJvd3NlclRhcmdldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyIHRhcmdldCBpcyBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnJvd3NlclRhcmdldDtcbiAgICB9XG4gICAgYXN5bmMgdmVyc2lvbigpIHtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IHRoaXMuI2dldFZlcnNpb24oKTtcbiAgICAgICAgcmV0dXJuIHZlcnNpb24ucHJvZHVjdDtcbiAgICB9XG4gICAgYXN5bmMgdXNlckFnZW50KCkge1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgdGhpcy4jZ2V0VmVyc2lvbigpO1xuICAgICAgICByZXR1cm4gdmVyc2lvbi51c2VyQWdlbnQ7XG4gICAgfVxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjbG9zZUNhbGxiYWNrLmNhbGwobnVsbCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICBkaXNjb25uZWN0KCkge1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuX2RldGFjaCgpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGdldCBjb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy4jY29ubmVjdGlvbi5fY2xvc2VkO1xuICAgIH1cbiAgICAjZ2V0VmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnQnJvd3Nlci5nZXRWZXJzaW9uJyk7XG4gICAgfVxuICAgIGdldCBkZWJ1Z0luZm8oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwZW5kaW5nUHJvdG9jb2xFcnJvcnM6IHRoaXMuI2Nvbm5lY3Rpb24uZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCksXG4gICAgICAgIH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3Nlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgZGVidWdFcnJvciwgREVGQVVMVF9WSUVXUE9SVCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IENkcEJyb3dzZXIgfSBmcm9tICcuL0Jyb3dzZXIuanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbiB9IGZyb20gJy4vQ29ubmVjdGlvbi5qcyc7XG4vKipcbiAqIFVzZXJzIHNob3VsZCBuZXZlciBjYWxsIHRoaXMgZGlyZWN0bHk7IGl0J3MgY2FsbGVkIHdoZW4gY2FsbGluZ1xuICogYHB1cHBldGVlci5jb25uZWN0YCB3aXRoIGBwcm90b2NvbDogJ2NkcCdgLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2Nvbm5lY3RUb0NkcEJyb3dzZXIoY29ubmVjdGlvblRyYW5zcG9ydCwgdXJsLCBvcHRpb25zKSB7XG4gICAgY29uc3QgeyBpZ25vcmVIVFRQU0Vycm9ycyA9IGZhbHNlLCBkZWZhdWx0Vmlld3BvcnQgPSBERUZBVUxUX1ZJRVdQT1JULCB0YXJnZXRGaWx0ZXIsIF9pc1BhZ2VUYXJnZXQ6IGlzUGFnZVRhcmdldCwgc2xvd01vID0gMCwgcHJvdG9jb2xUaW1lb3V0LCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24odXJsLCBjb25uZWN0aW9uVHJhbnNwb3J0LCBzbG93TW8sIHByb3RvY29sVGltZW91dCk7XG4gICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnQnJvd3Nlci5nZXRWZXJzaW9uJyk7XG4gICAgY29uc3QgcHJvZHVjdCA9IHZlcnNpb24ucHJvZHVjdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdmaXJlZm94JylcbiAgICAgICAgPyAnZmlyZWZveCdcbiAgICAgICAgOiAnY2hyb21lJztcbiAgICBjb25zdCB7IGJyb3dzZXJDb250ZXh0SWRzIH0gPSBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5nZXRCcm93c2VyQ29udGV4dHMnKTtcbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgQ2RwQnJvd3Nlci5fY3JlYXRlKHByb2R1Y3QgfHwgJ2Nocm9tZScsIGNvbm5lY3Rpb24sIGJyb3dzZXJDb250ZXh0SWRzLCBpZ25vcmVIVFRQU0Vycm9ycywgZGVmYXVsdFZpZXdwb3J0LCB1bmRlZmluZWQsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uc2VuZCgnQnJvd3Nlci5jbG9zZScpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgIH0sIHRhcmdldEZpbHRlciwgaXNQYWdlVGFyZ2V0KTtcbiAgICByZXR1cm4gYnJvd3Nlcjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJyb3dzZXJDb25uZWN0b3IuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjQgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBXRUJfUEVSTUlTU0lPTl9UT19QUk9UT0NPTF9QRVJNSVNTSU9OLCB9IGZyb20gJy4uL2FwaS9Ccm93c2VyLmpzJztcbmltcG9ydCB7IEJyb3dzZXJDb250ZXh0IH0gZnJvbSAnLi4vYXBpL0Jyb3dzZXJDb250ZXh0LmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBCcm93c2VyQ29udGV4dCBleHRlbmRzIEJyb3dzZXJDb250ZXh0IHtcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjYnJvd3NlcjtcbiAgICAjaWQ7XG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbiwgYnJvd3NlciwgY29udGV4dElkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLiNicm93c2VyID0gYnJvd3NlcjtcbiAgICAgICAgdGhpcy4jaWQgPSBjb250ZXh0SWQ7XG4gICAgfVxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lkO1xuICAgIH1cbiAgICB0YXJnZXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3Nlci50YXJnZXRzKCkuZmlsdGVyKHRhcmdldCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmJyb3dzZXJDb250ZXh0KCkgPT09IHRoaXM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBwYWdlcygpIHtcbiAgICAgICAgY29uc3QgcGFnZXMgPSBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnRhcmdldHMoKVxuICAgICAgICAgICAgLmZpbHRlcih0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICh0YXJnZXQudHlwZSgpID09PSAncGFnZScgfHxcbiAgICAgICAgICAgICAgICAodGFyZ2V0LnR5cGUoKSA9PT0gJ290aGVyJyAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNicm93c2VyLl9nZXRJc1BhZ2VUYXJnZXRDYWxsYmFjaygpPy4odGFyZ2V0KSkpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLm1hcCh0YXJnZXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5wYWdlKCk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgcmV0dXJuIHBhZ2VzLmZpbHRlcigocGFnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICEhcGFnZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlzSW5jb2duaXRvKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLiNpZDtcbiAgICB9XG4gICAgYXN5bmMgb3ZlcnJpZGVQZXJtaXNzaW9ucyhvcmlnaW4sIHBlcm1pc3Npb25zKSB7XG4gICAgICAgIGNvbnN0IHByb3RvY29sUGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucy5tYXAocGVybWlzc2lvbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm90b2NvbFBlcm1pc3Npb24gPSBXRUJfUEVSTUlTU0lPTl9UT19QUk9UT0NPTF9QRVJNSVNTSU9OLmdldChwZXJtaXNzaW9uKTtcbiAgICAgICAgICAgIGlmICghcHJvdG9jb2xQZXJtaXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHBlcm1pc3Npb246ICcgKyBwZXJtaXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm90b2NvbFBlcm1pc3Npb247XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ0Jyb3dzZXIuZ3JhbnRQZXJtaXNzaW9ucycsIHtcbiAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IHRoaXMuI2lkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBwcm90b2NvbFBlcm1pc3Npb25zLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgY2xlYXJQZXJtaXNzaW9uT3ZlcnJpZGVzKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ0Jyb3dzZXIucmVzZXRQZXJtaXNzaW9ucycsIHtcbiAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0SWQ6IHRoaXMuI2lkIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIG5ld1BhZ2UoKSB7XG4gICAgICAgIGNvbnN0IGVudl8xID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgX2d1YXJkID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHRoaXMud2FpdEZvclNjcmVlbnNob3RPcGVyYXRpb25zKCksIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNicm93c2VyLl9jcmVhdGVQYWdlSW5Db250ZXh0KHRoaXMuI2lkKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnJvd3NlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Jyb3dzZXI7XG4gICAgfVxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jaWQsICdOb24taW5jb2duaXRvIHByb2ZpbGVzIGNhbm5vdCBiZSBjbG9zZWQhJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2Jyb3dzZXIuX2Rpc3Bvc2VDb250ZXh0KHRoaXMuI2lkKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyQ29udGV4dC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbiwgQ0RQU2Vzc2lvbkV2ZW50LCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IENhbGxiYWNrUmVnaXN0cnkgfSBmcm9tICcuLi9jb21tb24vQ2FsbGJhY2tSZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyBUYXJnZXRDbG9zZUVycm9yIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm90b2NvbEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBDRFBTZXNzaW9uIGV4dGVuZHMgQ0RQU2Vzc2lvbiB7XG4gICAgI3Nlc3Npb25JZDtcbiAgICAjdGFyZ2V0VHlwZTtcbiAgICAjY2FsbGJhY2tzID0gbmV3IENhbGxiYWNrUmVnaXN0cnkoKTtcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjcGFyZW50U2Vzc2lvbklkO1xuICAgICN0YXJnZXQ7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbiwgdGFyZ2V0VHlwZSwgc2Vzc2lvbklkLCBwYXJlbnRTZXNzaW9uSWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgICAgIHRoaXMuI3RhcmdldFR5cGUgPSB0YXJnZXRUeXBlO1xuICAgICAgICB0aGlzLiNzZXNzaW9uSWQgPSBzZXNzaW9uSWQ7XG4gICAgICAgIHRoaXMuI3BhcmVudFNlc3Npb25JZCA9IHBhcmVudFNlc3Npb25JZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUge0BsaW5rIENkcFRhcmdldH0gYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX3NldFRhcmdldCh0YXJnZXQpIHtcbiAgICAgICAgdGhpcy4jdGFyZ2V0ID0gdGFyZ2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB7QGxpbmsgQ2RwVGFyZ2V0fSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb24gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfdGFyZ2V0KCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jdGFyZ2V0LCAnVGFyZ2V0IG11c3QgZXhpc3QnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhcmdldDtcbiAgICB9XG4gICAgY29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Nvbm5lY3Rpb247XG4gICAgfVxuICAgIHBhcmVudFNlc3Npb24oKSB7XG4gICAgICAgIGlmICghdGhpcy4jcGFyZW50U2Vzc2lvbklkKSB7XG4gICAgICAgICAgICAvLyBUbyBtYWtlIGl0IHdvcmsgaW4gRmlyZWZveCB0aGF0IGRvZXMgbm90IGhhdmUgcGFyZW50ICh0YWIpIHNlc3Npb25zLlxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy4jY29ubmVjdGlvbj8uc2Vzc2lvbih0aGlzLiNwYXJlbnRTZXNzaW9uSWQpO1xuICAgICAgICByZXR1cm4gcGFyZW50ID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgc2VuZChtZXRob2QsIHBhcmFtcywgb3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuI2Nvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVGFyZ2V0Q2xvc2VFcnJvcihgUHJvdG9jb2wgZXJyb3IgKCR7bWV0aG9kfSk6IFNlc3Npb24gY2xvc2VkLiBNb3N0IGxpa2VseSB0aGUgJHt0aGlzLiN0YXJnZXRUeXBlfSBoYXMgYmVlbiBjbG9zZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNjb25uZWN0aW9uLl9yYXdTZW5kKHRoaXMuI2NhbGxiYWNrcywgbWV0aG9kLCBwYXJhbXMsIHRoaXMuI3Nlc3Npb25JZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbk1lc3NhZ2Uob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QuaWQpIHtcbiAgICAgICAgICAgIGlmIChvYmplY3QuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjYWxsYmFja3MucmVqZWN0KG9iamVjdC5pZCwgY3JlYXRlUHJvdG9jb2xFcnJvck1lc3NhZ2Uob2JqZWN0KSwgb2JqZWN0LmVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY2FsbGJhY2tzLnJlc29sdmUob2JqZWN0LmlkLCBvYmplY3QucmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydCghb2JqZWN0LmlkKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChvYmplY3QubWV0aG9kLCBvYmplY3QucGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXRhY2hlcyB0aGUgY2RwU2Vzc2lvbiBmcm9tIHRoZSB0YXJnZXQuIE9uY2UgZGV0YWNoZWQsIHRoZSBjZHBTZXNzaW9uIG9iamVjdFxuICAgICAqIHdvbid0IGVtaXQgYW55IGV2ZW50cyBhbmQgY2FuJ3QgYmUgdXNlZCB0byBzZW5kIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIGFzeW5jIGRldGFjaCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNjb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlc3Npb24gYWxyZWFkeSBkZXRhY2hlZC4gTW9zdCBsaWtlbHkgdGhlICR7dGhpcy4jdGFyZ2V0VHlwZX0gaGFzIGJlZW4gY2xvc2VkLmApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LmRldGFjaEZyb21UYXJnZXQnLCB7XG4gICAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuI3Nlc3Npb25JZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9vbkNsb3NlZCgpIHtcbiAgICAgICAgdGhpcy4jY2FsbGJhY2tzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZW1pdChDRFBTZXNzaW9uRXZlbnQuRGlzY29ubmVjdGVkLCB1bmRlZmluZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uJ3MgaWQuXG4gICAgICovXG4gICAgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzZXNzaW9uSWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldFBlbmRpbmdQcm90b2NvbEVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NhbGxiYWNrcy5nZXRQZW5kaW5nUHJvdG9jb2xFcnJvcnMoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DRFBTZXNzaW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwUHJlbG9hZFNjcmlwdCB7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgSUQgb2YgdGhlIHByZWxvYWQgc2NyaXB0IHJldHVybmVkIGJ5XG4gICAgICogUGFnZS5hZGRTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCBpbiB0aGUgbWFpbiBmcmFtZS5cbiAgICAgKlxuICAgICAqIFN1Yi1mcmFtZXMgd291bGQgZ2V0IGEgZGlmZmVyZW50IENEUCBJRCBiZWNhdXNlXG4gICAgICogYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQgaXMgY2FsbGVkIGZvciBlYWNoIHN1YmZyYW1lLiBCdXRcbiAgICAgKiB1c2VycyBvbmx5IHNlZSB0aGlzIElEIGFuZCBzdWJmcmFtZSBJRHMgYXJlIGludGVybmFsIHRvIFB1cHBldGVlci5cbiAgICAgKi9cbiAgICAjaWQ7XG4gICAgI3NvdXJjZTtcbiAgICAjZnJhbWVUb0lkID0gbmV3IFdlYWtNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihtYWluRnJhbWUsIGlkLCBzb3VyY2UpIHtcbiAgICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICAgICAgdGhpcy4jc291cmNlID0gc291cmNlO1xuICAgICAgICB0aGlzLiNmcmFtZVRvSWQuc2V0KG1haW5GcmFtZSwgaWQpO1xuICAgIH1cbiAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpZDtcbiAgICB9XG4gICAgZ2V0IHNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NvdXJjZTtcbiAgICB9XG4gICAgZ2V0SWRGb3JGcmFtZShmcmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVUb0lkLmdldChmcmFtZSk7XG4gICAgfVxuICAgIHNldElkRm9yRnJhbWUoZnJhbWUsIGlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy4jZnJhbWVUb0lkLnNldChmcmFtZSwgaWRlbnRpZmllcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2RwUHJlbG9hZFNjcmlwdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbiwgQ0RQU2Vzc2lvbkV2ZW50IH0gZnJvbSAnLi4vYXBpL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IENkcFRhcmdldCwgSW5pdGlhbGl6YXRpb25TdGF0dXMgfSBmcm9tICcuL1RhcmdldC5qcyc7XG5mdW5jdGlvbiBpc1BhZ2VUYXJnZXRCZWNvbWluZ1ByaW1hcnkodGFyZ2V0LCBuZXdUYXJnZXRJbmZvKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGFyZ2V0Ll9zdWJ0eXBlKCkpICYmICFuZXdUYXJnZXRJbmZvLnN1YnR5cGU7XG59XG4vKipcbiAqIENocm9tZVRhcmdldE1hbmFnZXIgdXNlcyB0aGUgQ0RQJ3MgYXV0by1hdHRhY2ggbWVjaGFuaXNtIHRvIGludGVyY2VwdFxuICogbmV3IHRhcmdldHMgYW5kIGFsbG93IHRoZSByZXN0IG9mIFB1cHBldGVlciB0byBjb25maWd1cmUgbGlzdGVuZXJzIHdoaWxlXG4gKiB0aGUgdGFyZ2V0IGlzIHBhdXNlZC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENocm9tZVRhcmdldE1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNjb25uZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzOiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnLFxuICAgICAqICdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJywgJ1RhcmdldC50YXJnZXRJbmZvQ2hhbmdlZCcuXG4gICAgICpcbiAgICAgKiBBIHRhcmdldCBiZWNvbWVzIGRpc2NvdmVyZWQgd2hlbiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnIGlzIHJlY2VpdmVkLlxuICAgICAqIEEgdGFyZ2V0IGlzIHJlbW92ZWQgZnJvbSB0aGlzIG1hcCBvbmNlICdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJyBpc1xuICAgICAqIHJlY2VpdmVkLlxuICAgICAqXG4gICAgICogYHRhcmdldEZpbHRlckNhbGxiYWNrYCBoYXMgbm8gZWZmZWN0IG9uIHRoaXMgbWFwLlxuICAgICAqL1xuICAgICNkaXNjb3ZlcmVkVGFyZ2V0c0J5VGFyZ2V0SWQgPSBuZXcgTWFwKCk7XG4gICAgLyoqXG4gICAgICogQSB0YXJnZXQgaXMgYWRkZWQgdG8gdGhpcyBtYXAgb25jZSBDaHJvbWVUYXJnZXRNYW5hZ2VyIGhhcyBjcmVhdGVkXG4gICAgICogYSBUYXJnZXQgYW5kIGF0dGFjaGVkIGF0IGxlYXN0IG9uY2UgdG8gaXQuXG4gICAgICovXG4gICAgI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQgPSBuZXcgTWFwKCk7XG4gICAgLyoqXG4gICAgICogVHJhY2tzIHdoaWNoIHNlc3Npb25zIGF0dGFjaCB0byB3aGljaCB0YXJnZXQuXG4gICAgICovXG4gICAgI2F0dGFjaGVkVGFyZ2V0c0J5U2Vzc2lvbklkID0gbmV3IE1hcCgpO1xuICAgIC8qKlxuICAgICAqIElmIGEgdGFyZ2V0IHdhcyBmaWx0ZXJlZCBvdXQgYnkgYHRhcmdldEZpbHRlckNhbGxiYWNrYCwgd2Ugc3RpbGwgcmVjZWl2ZVxuICAgICAqIGV2ZW50cyBhYm91dCBpdCBmcm9tIENEUCwgYnV0IHdlIGRvbid0IGZvcndhcmQgdGhlbSB0byB0aGUgcmVzdCBvZiBQdXBwZXRlZXIuXG4gICAgICovXG4gICAgI2lnbm9yZWRUYXJnZXRzID0gbmV3IFNldCgpO1xuICAgICN0YXJnZXRGaWx0ZXJDYWxsYmFjaztcbiAgICAjdGFyZ2V0RmFjdG9yeTtcbiAgICAjYXR0YWNoZWRUb1RhcmdldExpc3RlbmVyc0J5U2Vzc2lvbiA9IG5ldyBXZWFrTWFwKCk7XG4gICAgI2RldGFjaGVkRnJvbVRhcmdldExpc3RlbmVyc0J5U2Vzc2lvbiA9IG5ldyBXZWFrTWFwKCk7XG4gICAgI2luaXRpYWxpemVEZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICN0YXJnZXRzSWRzRm9ySW5pdCA9IG5ldyBTZXQoKTtcbiAgICAjd2FpdEZvckluaXRpYWxseURpc2NvdmVyZWRUYXJnZXRzID0gdHJ1ZTtcbiAgICAjZGlzY292ZXJ5RmlsdGVyID0gW3t9XTtcbiAgICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uLCB0YXJnZXRGYWN0b3J5LCB0YXJnZXRGaWx0ZXJDYWxsYmFjaywgd2FpdEZvckluaXRpYWxseURpc2NvdmVyZWRUYXJnZXRzID0gdHJ1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2sgPSB0YXJnZXRGaWx0ZXJDYWxsYmFjaztcbiAgICAgICAgdGhpcy4jdGFyZ2V0RmFjdG9yeSA9IHRhcmdldEZhY3Rvcnk7XG4gICAgICAgIHRoaXMuI3dhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cyA9IHdhaXRGb3JJbml0aWFsbHlEaXNjb3ZlcmVkVGFyZ2V0cztcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vbignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKCdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJywgdGhpcy4jb25UYXJnZXREZXN0cm95ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKCdUYXJnZXQudGFyZ2V0SW5mb0NoYW5nZWQnLCB0aGlzLiNvblRhcmdldEluZm9DaGFuZ2VkKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vbihDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCB0aGlzLiNvblNlc3Npb25EZXRhY2hlZCk7XG4gICAgICAgIHRoaXMuI3NldHVwQXR0YWNobWVudExpc3RlbmVycyh0aGlzLiNjb25uZWN0aW9uKTtcbiAgICB9XG4gICAgI3N0b3JlRXhpc3RpbmdUYXJnZXRzRm9ySW5pdCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLiN3YWl0Rm9ySW5pdGlhbGx5RGlzY292ZXJlZFRhcmdldHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFt0YXJnZXRJZCwgdGFyZ2V0SW5mbyxdIG9mIHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEZvckZpbHRlciA9IG5ldyBDZHBUYXJnZXQodGFyZ2V0SW5mbywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRoaXMsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAvLyBUYXJnZXRzIGZyb20gZXh0ZW5zaW9ucyBhbmQgdGhlIGJyb3dzZXIgdGhhdCB3aWxsIG5vdCBiZVxuICAgICAgICAgICAgLy8gYXV0by1hdHRhY2hlZC4gVGhlcmVmb3JlLCB3ZSBzaG91bGQgbm90IGFkZCB0aGVtIHRvXG4gICAgICAgICAgICAvLyAjdGFyZ2V0c0lkc0ZvckluaXQuXG4gICAgICAgICAgICBjb25zdCBza2lwVGFyZ2V0ID0gdGFyZ2V0SW5mby50eXBlID09PSAnYnJvd3NlcicgfHxcbiAgICAgICAgICAgICAgICB0YXJnZXRJbmZvLnVybC5zdGFydHNXaXRoKCdjaHJvbWUtZXh0ZW5zaW9uOi8vJyk7XG4gICAgICAgICAgICBpZiAoKCF0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayB8fFxuICAgICAgICAgICAgICAgIHRoaXMuI3RhcmdldEZpbHRlckNhbGxiYWNrKHRhcmdldEZvckZpbHRlcikpICYmXG4gICAgICAgICAgICAgICAgIXNraXBUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdC5hZGQodGFyZ2V0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBhc3luYyBpbml0aWFsaXplKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5zZXREaXNjb3ZlclRhcmdldHMnLCB7XG4gICAgICAgICAgICBkaXNjb3ZlcjogdHJ1ZSxcbiAgICAgICAgICAgIGZpbHRlcjogdGhpcy4jZGlzY292ZXJ5RmlsdGVyLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jc3RvcmVFeGlzdGluZ1RhcmdldHNGb3JJbml0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2Nvbm5lY3Rpb24uc2VuZCgnVGFyZ2V0LnNldEF1dG9BdHRhY2gnLCB7XG4gICAgICAgICAgICB3YWl0Rm9yRGVidWdnZXJPblN0YXJ0OiB0cnVlLFxuICAgICAgICAgICAgZmxhdHRlbjogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9BdHRhY2g6IHRydWUsXG4gICAgICAgICAgICBmaWx0ZXI6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuI2Rpc2NvdmVyeUZpbHRlcixcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkoKTtcbiAgICAgICAgYXdhaXQgdGhpcy4jaW5pdGlhbGl6ZURlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgIH1cbiAgICBnZXRDaGlsZFRhcmdldHModGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQuX2NoaWxkVGFyZ2V0cygpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldERlc3Ryb3llZCcsIHRoaXMuI29uVGFyZ2V0RGVzdHJveWVkKTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vZmYoJ1RhcmdldC50YXJnZXRJbmZvQ2hhbmdlZCcsIHRoaXMuI29uVGFyZ2V0SW5mb0NoYW5nZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZihDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCB0aGlzLiNvblNlc3Npb25EZXRhY2hlZCk7XG4gICAgICAgIHRoaXMuI3JlbW92ZUF0dGFjaG1lbnRMaXN0ZW5lcnModGhpcy4jY29ubmVjdGlvbik7XG4gICAgfVxuICAgIGdldEF2YWlsYWJsZVRhcmdldHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkO1xuICAgIH1cbiAgICAjc2V0dXBBdHRhY2htZW50TGlzdGVuZXJzKHNlc3Npb24pIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KHNlc3Npb24sIGV2ZW50KTtcbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSk7XG4gICAgICAgIHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uc2V0KHNlc3Npb24sIGxpc3RlbmVyKTtcbiAgICAgICAgc2Vzc2lvbi5vbignVGFyZ2V0LmF0dGFjaGVkVG9UYXJnZXQnLCBsaXN0ZW5lcik7XG4gICAgICAgIGNvbnN0IGRldGFjaGVkTGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNvbkRldGFjaGVkRnJvbVRhcmdldChzZXNzaW9uLCBldmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIGFzc2VydCghdGhpcy4jZGV0YWNoZWRGcm9tVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSk7XG4gICAgICAgIHRoaXMuI2RldGFjaGVkRnJvbVRhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5zZXQoc2Vzc2lvbiwgZGV0YWNoZWRMaXN0ZW5lcik7XG4gICAgICAgIHNlc3Npb24ub24oJ1RhcmdldC5kZXRhY2hlZEZyb21UYXJnZXQnLCBkZXRhY2hlZExpc3RlbmVyKTtcbiAgICB9XG4gICAgI3JlbW92ZUF0dGFjaG1lbnRMaXN0ZW5lcnMoc2Vzc2lvbikge1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uZ2V0KHNlc3Npb24pO1xuICAgICAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIHNlc3Npb24ub2ZmKCdUYXJnZXQuYXR0YWNoZWRUb1RhcmdldCcsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uZGVsZXRlKHNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNkZXRhY2hlZEZyb21UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uaGFzKHNlc3Npb24pKSB7XG4gICAgICAgICAgICBzZXNzaW9uLm9mZignVGFyZ2V0LmRldGFjaGVkRnJvbVRhcmdldCcsIHRoaXMuI2RldGFjaGVkRnJvbVRhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5nZXQoc2Vzc2lvbikpO1xuICAgICAgICAgICAgdGhpcy4jZGV0YWNoZWRGcm9tVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmRlbGV0ZShzZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjb25TZXNzaW9uRGV0YWNoZWQgPSAoc2Vzc2lvbikgPT4ge1xuICAgICAgICB0aGlzLiNyZW1vdmVBdHRhY2htZW50TGlzdGVuZXJzKHNlc3Npb24pO1xuICAgIH07XG4gICAgI29uVGFyZ2V0Q3JlYXRlZCA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLiNkaXNjb3ZlcmVkVGFyZ2V0c0J5VGFyZ2V0SWQuc2V0KGV2ZW50LnRhcmdldEluZm8udGFyZ2V0SWQsIGV2ZW50LnRhcmdldEluZm8pO1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXREaXNjb3ZlcmVkXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldERpc2NvdmVyZWQgKi8sIGV2ZW50LnRhcmdldEluZm8pO1xuICAgICAgICAvLyBUaGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZSBicm93c2VyIHRhcmdldCBpbXBsaWNpdGx5LFxuICAgICAgICAvLyB0aGVyZWZvcmUsIG5vIG5ldyBDRFBTZXNzaW9uIGlzIGNyZWF0ZWQgYW5kIHdlIGhhdmUgc3BlY2lhbCBoYW5kbGluZ1xuICAgICAgICAvLyBoZXJlLlxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0SW5mby50eXBlID09PSAnYnJvd3NlcicgJiYgZXZlbnQudGFyZ2V0SW5mby5hdHRhY2hlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuaGFzKGV2ZW50LnRhcmdldEluZm8udGFyZ2V0SWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4jdGFyZ2V0RmFjdG9yeShldmVudC50YXJnZXRJbmZvLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgdGFyZ2V0Ll9pbml0aWFsaXplKCk7XG4gICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLnNldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAjb25UYXJnZXREZXN0cm95ZWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5mbyA9IHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5nZXQoZXZlbnQudGFyZ2V0SWQpO1xuICAgICAgICB0aGlzLiNkaXNjb3ZlcmVkVGFyZ2V0c0J5VGFyZ2V0SWQuZGVsZXRlKGV2ZW50LnRhcmdldElkKTtcbiAgICAgICAgdGhpcy4jZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KGV2ZW50LnRhcmdldElkKTtcbiAgICAgICAgaWYgKHRhcmdldEluZm8/LnR5cGUgPT09ICdzZXJ2aWNlX3dvcmtlcicgJiZcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuaGFzKGV2ZW50LnRhcmdldElkKSkge1xuICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzZXJ2aWNlIHdvcmtlcnM6IHJlcG9ydCBUYXJnZXRHb25lIGV2ZW50IHdoZW5cbiAgICAgICAgICAgIC8vIHRoZSB3b3JrZXIgaXMgZGVzdHJveWVkLlxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4jYXR0YWNoZWRUYXJnZXRzQnlUYXJnZXRJZC5nZXQoZXZlbnQudGFyZ2V0SWQpO1xuICAgICAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldEdvbmVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0R29uZSAqLywgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmRlbGV0ZShldmVudC50YXJnZXRJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgICNvblRhcmdldEluZm9DaGFuZ2VkID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5zZXQoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCwgZXZlbnQudGFyZ2V0SW5mbyk7XG4gICAgICAgIGlmICh0aGlzLiNpZ25vcmVkVGFyZ2V0cy5oYXMoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCkgfHxcbiAgICAgICAgICAgICF0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmhhcyhldmVudC50YXJnZXRJbmZvLnRhcmdldElkKSB8fFxuICAgICAgICAgICAgIWV2ZW50LnRhcmdldEluZm8uYXR0YWNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmdldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2aW91c1VSTCA9IHRhcmdldC51cmwoKTtcbiAgICAgICAgY29uc3Qgd2FzSW5pdGlhbGl6ZWQgPSB0YXJnZXQuX2luaXRpYWxpemVkRGVmZXJyZWQudmFsdWUoKSA9PT0gSW5pdGlhbGl6YXRpb25TdGF0dXMuU1VDQ0VTUztcbiAgICAgICAgaWYgKGlzUGFnZVRhcmdldEJlY29taW5nUHJpbWFyeSh0YXJnZXQsIGV2ZW50LnRhcmdldEluZm8pKSB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gdGFyZ2V0Py5fc2Vzc2lvbigpO1xuICAgICAgICAgICAgYXNzZXJ0KHNlc3Npb24sICdUYXJnZXQgdGhhdCBpcyBiZWluZyBhY3RpdmF0ZWQgaXMgbWlzc2luZyBhIENEUFNlc3Npb24uJyk7XG4gICAgICAgICAgICBzZXNzaW9uLnBhcmVudFNlc3Npb24oKT8uZW1pdChDRFBTZXNzaW9uRXZlbnQuU3dhcHBlZCwgc2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0Ll90YXJnZXRJbmZvQ2hhbmdlZChldmVudC50YXJnZXRJbmZvKTtcbiAgICAgICAgaWYgKHdhc0luaXRpYWxpemVkICYmIHByZXZpb3VzVVJMICE9PSB0YXJnZXQudXJsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldENoYW5nZWRcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0Q2hhbmdlZCAqLywge1xuICAgICAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgICAgICB3YXNJbml0aWFsaXplZCxcbiAgICAgICAgICAgICAgICBwcmV2aW91c1VSTCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAjb25BdHRhY2hlZFRvVGFyZ2V0ID0gYXN5bmMgKHBhcmVudFNlc3Npb24sIGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZm8gPSBldmVudC50YXJnZXRJbmZvO1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy4jY29ubmVjdGlvbi5zZXNzaW9uKGV2ZW50LnNlc3Npb25JZCk7XG4gICAgICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXNzaW9uICR7ZXZlbnQuc2Vzc2lvbklkfSB3YXMgbm90IGNyZWF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2lsZW50RGV0YWNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5zZW5kKCdSdW50aW1lLnJ1bklmV2FpdGluZ0ZvckRlYnVnZ2VyJykuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCB1c2UgYHNlc3Npb24uZGV0YWNoKClgIGJlY2F1c2UgdGhhdCBkaXNwYXRjaGVzIGFsbCBjb21tYW5kcyBvblxuICAgICAgICAgICAgLy8gdGhlIGNvbm5lY3Rpb24gaW5zdGVhZCBvZiB0aGUgcGFyZW50IHNlc3Npb24uXG4gICAgICAgICAgICBhd2FpdCBwYXJlbnRTZXNzaW9uXG4gICAgICAgICAgICAgICAgLnNlbmQoJ1RhcmdldC5kZXRhY2hGcm9tVGFyZ2V0Jywge1xuICAgICAgICAgICAgICAgIHNlc3Npb25JZDogc2Vzc2lvbi5pZCgpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGlmICghdGhpcy4jY29ubmVjdGlvbi5pc0F1dG9BdHRhY2hlZCh0YXJnZXRJbmZvLnRhcmdldElkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3Igc2VydmljZSB3b3JrZXJzOiBiZWluZyBhdHRhY2hlZCB0byBzZXJ2aWNlIHdvcmtlcnMgd2lsbFxuICAgICAgICAvLyBwcmV2ZW50IHRoZW0gZnJvbSBldmVyIGJlaW5nIGRlc3Ryb3llZC4gVGhlcmVmb3JlLCB3ZSBzaWxlbnRseSBkZXRhY2hcbiAgICAgICAgLy8gZnJvbSBzZXJ2aWNlIHdvcmtlcnMgdW5sZXNzIHRoZSBjb25uZWN0aW9uIHdhcyBtYW51YWxseSBjcmVhdGVkIHZpYVxuICAgICAgICAvLyBgcGFnZS53b3JrZXIoKWAuIFRvIGRldGVybWluZSB0aGlzLCB3ZSB1c2VcbiAgICAgICAgLy8gYHRoaXMuI2Nvbm5lY3Rpb24uaXNBdXRvQXR0YWNoZWQodGFyZ2V0SW5mby50YXJnZXRJZClgLiBJbiB0aGUgZnV0dXJlLCB3ZVxuICAgICAgICAvLyBzaG91bGQgZGV0ZXJtaW5lIGlmIGEgdGFyZ2V0IGlzIGF1dG8tYXR0YWNoZWQgb3Igbm90IHdpdGggdGhlIGhlbHAgb2ZcbiAgICAgICAgLy8gQ0RQLlxuICAgICAgICBpZiAodGFyZ2V0SW5mby50eXBlID09PSAnc2VydmljZV93b3JrZXInKSB7XG4gICAgICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgICAgICBhd2FpdCBzaWxlbnREZXRhY2goKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmhhcyh0YXJnZXRJbmZvLnRhcmdldElkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI3RhcmdldEZhY3RvcnkodGFyZ2V0SW5mbyk7XG4gICAgICAgICAgICB0YXJnZXQuX2luaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuc2V0KHRhcmdldEluZm8udGFyZ2V0SWQsIHRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0YXJnZXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzRXhpc3RpbmdUYXJnZXQgPSB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmhhcyh0YXJnZXRJbmZvLnRhcmdldElkKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNFeGlzdGluZ1RhcmdldFxuICAgICAgICAgICAgPyB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmdldCh0YXJnZXRJbmZvLnRhcmdldElkKVxuICAgICAgICAgICAgOiB0aGlzLiN0YXJnZXRGYWN0b3J5KHRhcmdldEluZm8sIHNlc3Npb24sIHBhcmVudFNlc3Npb24gaW5zdGFuY2VvZiBDRFBTZXNzaW9uID8gcGFyZW50U2Vzc2lvbiA6IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayAmJiAhdGhpcy4jdGFyZ2V0RmlsdGVyQ2FsbGJhY2sodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhpcy4jaWdub3JlZFRhcmdldHMuYWRkKHRhcmdldEluZm8udGFyZ2V0SWQpO1xuICAgICAgICAgICAgdGhpcy4jZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KHRhcmdldEluZm8udGFyZ2V0SWQpO1xuICAgICAgICAgICAgYXdhaXQgc2lsZW50RGV0YWNoKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc2V0dXBBdHRhY2htZW50TGlzdGVuZXJzKHNlc3Npb24pO1xuICAgICAgICBpZiAoaXNFeGlzdGluZ1RhcmdldCkge1xuICAgICAgICAgICAgc2Vzc2lvbi5fc2V0VGFyZ2V0KHRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVNlc3Npb25JZC5zZXQoc2Vzc2lvbi5pZCgpLCB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVRhcmdldElkLmdldCh0YXJnZXRJbmZvLnRhcmdldElkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXQuX2luaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuc2V0KHRhcmdldEluZm8udGFyZ2V0SWQsIHRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVNlc3Npb25JZC5zZXQoc2Vzc2lvbi5pZCgpLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudFRhcmdldCA9IHBhcmVudFNlc3Npb24gaW5zdGFuY2VvZiBDRFBTZXNzaW9uXG4gICAgICAgICAgICA/IHBhcmVudFNlc3Npb24uX3RhcmdldCgpXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIHBhcmVudFRhcmdldD8uX2FkZENoaWxkVGFyZ2V0KHRhcmdldCk7XG4gICAgICAgIHBhcmVudFNlc3Npb24uZW1pdChDRFBTZXNzaW9uRXZlbnQuUmVhZHksIHNlc3Npb24pO1xuICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdC5kZWxldGUodGFyZ2V0Ll90YXJnZXRJZCk7XG4gICAgICAgIGlmICghaXNFeGlzdGluZ1RhcmdldCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwidGFyZ2V0QXZhaWxhYmxlXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldEF2YWlsYWJsZSAqLywgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkoKTtcbiAgICAgICAgLy8gVE9ETzogdGhlIGJyb3dzZXIgbWlnaHQgYmUgc2h1dHRpbmcgZG93biBoZXJlLiBXaGF0IGRvIHdlIGRvIHdpdGggdGhlXG4gICAgICAgIC8vIGVycm9yP1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICBzZXNzaW9uLnNlbmQoJ1RhcmdldC5zZXRBdXRvQXR0YWNoJywge1xuICAgICAgICAgICAgICAgIHdhaXRGb3JEZWJ1Z2dlck9uU3RhcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZmxhdHRlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhdXRvQXR0YWNoOiB0cnVlLFxuICAgICAgICAgICAgICAgIGZpbHRlcjogdGhpcy4jZGlzY292ZXJ5RmlsdGVyLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzZXNzaW9uLnNlbmQoJ1J1bnRpbWUucnVuSWZXYWl0aW5nRm9yRGVidWdnZXInKSxcbiAgICAgICAgXSkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgfTtcbiAgICAjZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KHRhcmdldElkKSB7XG4gICAgICAgIHRhcmdldElkICE9PSB1bmRlZmluZWQgJiYgdGhpcy4jdGFyZ2V0c0lkc0ZvckluaXQuZGVsZXRlKHRhcmdldElkKTtcbiAgICAgICAgaWYgKHRoaXMuI3RhcmdldHNJZHNGb3JJbml0LnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uRGV0YWNoZWRGcm9tVGFyZ2V0ID0gKHBhcmVudFNlc3Npb24sIGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5U2Vzc2lvbklkLmdldChldmVudC5zZXNzaW9uSWQpO1xuICAgICAgICB0aGlzLiNhdHRhY2hlZFRhcmdldHNCeVNlc3Npb25JZC5kZWxldGUoZXZlbnQuc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50U2Vzc2lvbiBpbnN0YW5jZW9mIENEUFNlc3Npb24pIHtcbiAgICAgICAgICAgIHBhcmVudFNlc3Npb24uX3RhcmdldCgpLl9yZW1vdmVDaGlsZFRhcmdldCh0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2F0dGFjaGVkVGFyZ2V0c0J5VGFyZ2V0SWQuZGVsZXRlKHRhcmdldC5fdGFyZ2V0SWQpO1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRHb25lXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldEdvbmUgKi8sIHRhcmdldCk7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNocm9tZVRhcmdldE1hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IENEUFNlc3Npb25FdmVudCwgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBDYWxsYmFja1JlZ2lzdHJ5IH0gZnJvbSAnLi4vY29tbW9uL0NhbGxiYWNrUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuLi9jb21tb24vRGVidWcuanMnO1xuaW1wb3J0IHsgVGFyZ2V0Q2xvc2VFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm90b2NvbEVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IENkcENEUFNlc3Npb24gfSBmcm9tICcuL0NEUFNlc3Npb24uanMnO1xuY29uc3QgZGVidWdQcm90b2NvbFNlbmQgPSBkZWJ1ZygncHVwcGV0ZWVyOnByb3RvY29sOlNFTkQg4pa6Jyk7XG5jb25zdCBkZWJ1Z1Byb3RvY29sUmVjZWl2ZSA9IGRlYnVnKCdwdXBwZXRlZXI6cHJvdG9jb2w6UkVDViDil4AnKTtcbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgI3VybDtcbiAgICAjdHJhbnNwb3J0O1xuICAgICNkZWxheTtcbiAgICAjdGltZW91dDtcbiAgICAjc2Vzc2lvbnMgPSBuZXcgTWFwKCk7XG4gICAgI2Nsb3NlZCA9IGZhbHNlO1xuICAgICNtYW51YWxseUF0dGFjaGVkID0gbmV3IFNldCgpO1xuICAgICNjYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tSZWdpc3RyeSgpO1xuICAgIGNvbnN0cnVjdG9yKHVybCwgdHJhbnNwb3J0LCBkZWxheSA9IDAsIHRpbWVvdXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jdXJsID0gdXJsO1xuICAgICAgICB0aGlzLiNkZWxheSA9IGRlbGF5O1xuICAgICAgICB0aGlzLiN0aW1lb3V0ID0gdGltZW91dCA/PyAxODBfMDAwO1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgICAgIHRoaXMuI3RyYW5zcG9ydC5vbm1lc3NhZ2UgPSB0aGlzLm9uTWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLiN0cmFuc3BvcnQub25jbG9zZSA9IHRoaXMuI29uQ2xvc2UuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21TZXNzaW9uKHNlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHNlc3Npb24uY29ubmVjdGlvbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgZGVsYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZWxheTtcbiAgICB9XG4gICAgZ2V0IHRpbWVvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0aW1lb3V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgX2Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Nsb3NlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0IF9zZXNzaW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Nlc3Npb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIC0gVGhlIHNlc3Npb24gaWRcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBDRFAgc2Vzc2lvbiBpZiBpdCBleGlzdHNcbiAgICAgKi9cbiAgICBzZXNzaW9uKHNlc3Npb25JZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCkgfHwgbnVsbDtcbiAgICB9XG4gICAgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdXJsO1xuICAgIH1cbiAgICBzZW5kKG1ldGhvZCwgcGFyYW1zLCBvcHRpb25zKSB7XG4gICAgICAgIC8vIFRoZXJlIGlzIG9ubHkgZXZlciAxIHBhcmFtIGFyZyBwYXNzZWQsIGJ1dCB0aGUgUHJvdG9jb2wgZGVmaW5lcyBpdCBhcyBhblxuICAgICAgICAvLyBhcnJheSBvZiAwIG9yIDEgaXRlbXMgU2VlIHRoaXMgY29tbWVudDpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0Nocm9tZURldlRvb2xzL2RldnRvb2xzLXByb3RvY29sL3B1bGwvMTEzI2lzc3VlY29tbWVudC00MTI2MDMyODVcbiAgICAgICAgLy8gd2hpY2ggZXhwbGFpbnMgd2h5IHRoZSBwcm90b2NvbCBkZWZpbmVzIHRoZSBwYXJhbXMgdGhpcyB3YXkgZm9yIGJldHRlclxuICAgICAgICAvLyB0eXBlLWluZmVyZW5jZS5cbiAgICAgICAgLy8gU28gbm93IHdlIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcGFyYW1zIG9yIG5vdCBhbmQgZGVhbCB3aXRoIHRoZW0gYWNjb3JkaW5nbHkuXG4gICAgICAgIHJldHVybiB0aGlzLl9yYXdTZW5kKHRoaXMuI2NhbGxiYWNrcywgbWV0aG9kLCBwYXJhbXMsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9yYXdTZW5kKGNhbGxiYWNrcywgbWV0aG9kLCBwYXJhbXMsIHNlc3Npb25JZCwgb3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy4jY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdQcm90b2NvbCBlcnJvcjogQ29ubmVjdGlvbiBjbG9zZWQuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFja3MuY3JlYXRlKG1ldGhvZCwgb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLiN0aW1lb3V0LCBpZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHJpbmdpZmllZE1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlYnVnUHJvdG9jb2xTZW5kKHN0cmluZ2lmaWVkTWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLiN0cmFuc3BvcnQuc2VuZChzdHJpbmdpZmllZE1lc3NhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmQoJ0Jyb3dzZXIuY2xvc2UnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgb25NZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RlbGF5KSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChyLCB0aGlzLiNkZWxheSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBkZWJ1Z1Byb3RvY29sUmVjZWl2ZShtZXNzYWdlKTtcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gSlNPTi5wYXJzZShtZXNzYWdlKTtcbiAgICAgICAgaWYgKG9iamVjdC5tZXRob2QgPT09ICdUYXJnZXQuYXR0YWNoZWRUb1RhcmdldCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IG9iamVjdC5wYXJhbXMuc2Vzc2lvbklkO1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBDZHBDRFBTZXNzaW9uKHRoaXMsIG9iamVjdC5wYXJhbXMudGFyZ2V0SW5mby50eXBlLCBzZXNzaW9uSWQsIG9iamVjdC5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgdGhpcy4jc2Vzc2lvbnMuc2V0KHNlc3Npb25JZCwgc2Vzc2lvbik7XG4gICAgICAgICAgICB0aGlzLmVtaXQoQ0RQU2Vzc2lvbkV2ZW50LlNlc3Npb25BdHRhY2hlZCwgc2Vzc2lvbik7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRTZXNzaW9uID0gdGhpcy4jc2Vzc2lvbnMuZ2V0KG9iamVjdC5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgaWYgKHBhcmVudFNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRTZXNzaW9uLmVtaXQoQ0RQU2Vzc2lvbkV2ZW50LlNlc3Npb25BdHRhY2hlZCwgc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob2JqZWN0Lm1ldGhvZCA9PT0gJ1RhcmdldC5kZXRhY2hlZEZyb21UYXJnZXQnKSB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy4jc2Vzc2lvbnMuZ2V0KG9iamVjdC5wYXJhbXMuc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbi5fb25DbG9zZWQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNzZXNzaW9ucy5kZWxldGUob2JqZWN0LnBhcmFtcy5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRTZXNzaW9uID0gdGhpcy4jc2Vzc2lvbnMuZ2V0KG9iamVjdC5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRTZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFNlc3Npb24uZW1pdChDRFBTZXNzaW9uRXZlbnQuU2Vzc2lvbkRldGFjaGVkLCBzZXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9iamVjdC5zZXNzaW9uSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLiNzZXNzaW9ucy5nZXQob2JqZWN0LnNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgIHNlc3Npb24uX29uTWVzc2FnZShvYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9iamVjdC5pZCkge1xuICAgICAgICAgICAgaWYgKG9iamVjdC5lcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NhbGxiYWNrcy5yZWplY3Qob2JqZWN0LmlkLCBjcmVhdGVQcm90b2NvbEVycm9yTWVzc2FnZShvYmplY3QpLCBvYmplY3QuZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjYWxsYmFja3MucmVzb2x2ZShvYmplY3QuaWQsIG9iamVjdC5yZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KG9iamVjdC5tZXRob2QsIG9iamVjdC5wYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNvbkNsb3NlKCkge1xuICAgICAgICBpZiAodGhpcy4jY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9ubWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0Lm9uY2xvc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuI2NhbGxiYWNrcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IHNlc3Npb24gb2YgdGhpcy4jc2Vzc2lvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHNlc3Npb24uX29uQ2xvc2VkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc2Vzc2lvbnMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5lbWl0KENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuI29uQ2xvc2UoKTtcbiAgICAgICAgdGhpcy4jdHJhbnNwb3J0LmNsb3NlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGlzQXV0b0F0dGFjaGVkKHRhcmdldElkKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy4jbWFudWFsbHlBdHRhY2hlZC5oYXModGFyZ2V0SWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBfY3JlYXRlU2Vzc2lvbih0YXJnZXRJbmZvLCBpc0F1dG9BdHRhY2hFbXVsYXRlZCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCFpc0F1dG9BdHRhY2hFbXVsYXRlZCkge1xuICAgICAgICAgICAgdGhpcy4jbWFudWFsbHlBdHRhY2hlZC5hZGQodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBzZXNzaW9uSWQgfSA9IGF3YWl0IHRoaXMuc2VuZCgnVGFyZ2V0LmF0dGFjaFRvVGFyZ2V0Jywge1xuICAgICAgICAgICAgdGFyZ2V0SWQ6IHRhcmdldEluZm8udGFyZ2V0SWQsXG4gICAgICAgICAgICBmbGF0dGVuOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jbWFudWFsbHlBdHRhY2hlZC5kZWxldGUodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLiNzZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NEUFNlc3Npb24gY3JlYXRpb24gZmFpbGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdGFyZ2V0SW5mbyAtIFRoZSB0YXJnZXQgaW5mb1xuICAgICAqIEByZXR1cm5zIFRoZSBDRFAgc2Vzc2lvbiB0aGF0IGlzIGNyZWF0ZWRcbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTZXNzaW9uKHRhcmdldEluZm8pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NyZWF0ZVNlc3Npb24odGFyZ2V0SW5mbywgZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRQZW5kaW5nUHJvdG9jb2xFcnJvcnMoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLiNjYWxsYmFja3MuZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCkpO1xuICAgICAgICBmb3IgKGNvbnN0IHNlc3Npb24gb2YgdGhpcy4jc2Vzc2lvbnMudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnNlc3Npb24uZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGFyZ2V0Q2xvc2VkRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRDbG9zZUVycm9yO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvbi5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yLCBQdXBwZXRlZXJVUkwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2sgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuLyoqXG4gKiBUaGUgQ292ZXJhZ2UgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyB0byBnYXRoZXIgaW5mb3JtYXRpb24gYWJvdXQgcGFydHMgb2ZcbiAqIEphdmFTY3JpcHQgYW5kIENTUyB0aGF0IHdlcmUgdXNlZCBieSB0aGUgcGFnZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogVG8gb3V0cHV0IGNvdmVyYWdlIGluIGEgZm9ybSBjb25zdW1hYmxlIGJ5IHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vaXN0YW5idWxqcyB8IElzdGFuYnVsfSxcbiAqIHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2lzdGFuYnVsanMvcHVwcGV0ZWVyLXRvLWlzdGFuYnVsIHwgcHVwcGV0ZWVyLXRvLWlzdGFuYnVsfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogQW4gZXhhbXBsZSBvZiB1c2luZyBKYXZhU2NyaXB0IGFuZCBDU1MgY292ZXJhZ2UgdG8gZ2V0IHBlcmNlbnRhZ2Ugb2YgaW5pdGlhbGx5XG4gKiBleGVjdXRlZCBjb2RlOlxuICpcbiAqIGBgYHRzXG4gKiAvLyBFbmFibGUgYm90aCBKYXZhU2NyaXB0IGFuZCBDU1MgY292ZXJhZ2VcbiAqIGF3YWl0IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS5jb3ZlcmFnZS5zdGFydEpTQ292ZXJhZ2UoKSxcbiAqICAgcGFnZS5jb3ZlcmFnZS5zdGFydENTU0NvdmVyYWdlKCksXG4gKiBdKTtcbiAqIC8vIE5hdmlnYXRlIHRvIHBhZ2VcbiAqIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICogLy8gRGlzYWJsZSBib3RoIEphdmFTY3JpcHQgYW5kIENTUyBjb3ZlcmFnZVxuICogY29uc3QgW2pzQ292ZXJhZ2UsIGNzc0NvdmVyYWdlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS5jb3ZlcmFnZS5zdG9wSlNDb3ZlcmFnZSgpLFxuICogICBwYWdlLmNvdmVyYWdlLnN0b3BDU1NDb3ZlcmFnZSgpLFxuICogXSk7XG4gKiBsZXQgdG90YWxCeXRlcyA9IDA7XG4gKiBsZXQgdXNlZEJ5dGVzID0gMDtcbiAqIGNvbnN0IGNvdmVyYWdlID0gWy4uLmpzQ292ZXJhZ2UsIC4uLmNzc0NvdmVyYWdlXTtcbiAqIGZvciAoY29uc3QgZW50cnkgb2YgY292ZXJhZ2UpIHtcbiAqICAgdG90YWxCeXRlcyArPSBlbnRyeS50ZXh0Lmxlbmd0aDtcbiAqICAgZm9yIChjb25zdCByYW5nZSBvZiBlbnRyeS5yYW5nZXMpIHVzZWRCeXRlcyArPSByYW5nZS5lbmQgLSByYW5nZS5zdGFydCAtIDE7XG4gKiB9XG4gKiBjb25zb2xlLmxvZyhgQnl0ZXMgdXNlZDogJHsodXNlZEJ5dGVzIC8gdG90YWxCeXRlcykgKiAxMDB9JWApO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQ292ZXJhZ2Uge1xuICAgICNqc0NvdmVyYWdlO1xuICAgICNjc3NDb3ZlcmFnZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy4janNDb3ZlcmFnZSA9IG5ldyBKU0NvdmVyYWdlKGNsaWVudCk7XG4gICAgICAgIHRoaXMuI2Nzc0NvdmVyYWdlID0gbmV3IENTU0NvdmVyYWdlKGNsaWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHVwZGF0ZUNsaWVudChjbGllbnQpIHtcbiAgICAgICAgdGhpcy4janNDb3ZlcmFnZS51cGRhdGVDbGllbnQoY2xpZW50KTtcbiAgICAgICAgdGhpcy4jY3NzQ292ZXJhZ2UudXBkYXRlQ2xpZW50KGNsaWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gU2V0IG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zIGZvciBjb3ZlcmFnZSBkZWZhdWx0cyB0b1xuICAgICAqIGByZXNldE9uTmF2aWdhdGlvbiA6IHRydWUsIHJlcG9ydEFub255bW91c1NjcmlwdHMgOiBmYWxzZSxgXG4gICAgICogYGluY2x1ZGVSYXdTY3JpcHRDb3ZlcmFnZSA6IGZhbHNlLCB1c2VCbG9ja0NvdmVyYWdlIDogdHJ1ZWBcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjb3ZlcmFnZSBpcyBzdGFydGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbm9ueW1vdXMgc2NyaXB0cyBhcmUgb25lcyB0aGF0IGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCB1cmwuIFRoZXNlIGFyZVxuICAgICAqIHNjcmlwdHMgdGhhdCBhcmUgZHluYW1pY2FsbHkgY3JlYXRlZCBvbiB0aGUgcGFnZSB1c2luZyBgZXZhbGAgb3JcbiAgICAgKiBgbmV3IEZ1bmN0aW9uYC4gSWYgYHJlcG9ydEFub255bW91c1NjcmlwdHNgIGlzIHNldCB0byBgdHJ1ZWAsIGFub255bW91c1xuICAgICAqIHNjcmlwdHMgVVJMIHdpbGwgc3RhcnQgd2l0aCBgZGVidWdnZXI6Ly9WTWAgKHVubGVzcyBhIG1hZ2ljIC8vIyBzb3VyY2VVUkxcbiAgICAgKiBjb21tZW50IGlzIHByZXNlbnQsIGluIHdoaWNoIGNhc2UgdGhhdCB3aWxsIHRoZSBiZSBVUkwpLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YXJ0SlNDb3ZlcmFnZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2pzQ292ZXJhZ2Uuc3RhcnQob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgY292ZXJhZ2UgcmVwb3J0cyBmb3JcbiAgICAgKiBhbGwgc2NyaXB0cy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSmF2YVNjcmlwdCBDb3ZlcmFnZSBkb2Vzbid0IGluY2x1ZGUgYW5vbnltb3VzIHNjcmlwdHMgYnkgZGVmYXVsdC5cbiAgICAgKiBIb3dldmVyLCBzY3JpcHRzIHdpdGggc291cmNlVVJMcyBhcmUgcmVwb3J0ZWQuXG4gICAgICovXG4gICAgYXN5bmMgc3RvcEpTQ292ZXJhZ2UoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNqc0NvdmVyYWdlLnN0b3AoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTZXQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMgZm9yIGNvdmVyYWdlLCBkZWZhdWx0cyB0b1xuICAgICAqIGByZXNldE9uTmF2aWdhdGlvbiA6IHRydWVgXG4gICAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gY292ZXJhZ2UgaXMgc3RhcnRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBzdGFydENTU0NvdmVyYWdlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jY3NzQ292ZXJhZ2Uuc3RhcnQob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgYXJyYXkgb2YgY292ZXJhZ2UgcmVwb3J0c1xuICAgICAqIGZvciBhbGwgc3R5bGVzaGVldHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIENTUyBDb3ZlcmFnZSBkb2Vzbid0IGluY2x1ZGUgZHluYW1pY2FsbHkgaW5qZWN0ZWQgc3R5bGUgdGFnc1xuICAgICAqIHdpdGhvdXQgc291cmNlVVJMcy5cbiAgICAgKi9cbiAgICBhc3luYyBzdG9wQ1NTQ292ZXJhZ2UoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjc3NDb3ZlcmFnZS5zdG9wKCk7XG4gICAgfVxufVxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBKU0NvdmVyYWdlIHtcbiAgICAjY2xpZW50O1xuICAgICNlbmFibGVkID0gZmFsc2U7XG4gICAgI3NjcmlwdFVSTHMgPSBuZXcgTWFwKCk7XG4gICAgI3NjcmlwdFNvdXJjZXMgPSBuZXcgTWFwKCk7XG4gICAgI3N1YnNjcmlwdGlvbnM7XG4gICAgI3Jlc2V0T25OYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgI3JlcG9ydEFub255bW91c1NjcmlwdHMgPSBmYWxzZTtcbiAgICAjaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdXBkYXRlQ2xpZW50KGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIGFzeW5jIHN0YXJ0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2VuYWJsZWQsICdKU0NvdmVyYWdlIGlzIGFscmVhZHkgZW5hYmxlZCcpO1xuICAgICAgICBjb25zdCB7IHJlc2V0T25OYXZpZ2F0aW9uID0gdHJ1ZSwgcmVwb3J0QW5vbnltb3VzU2NyaXB0cyA9IGZhbHNlLCBpbmNsdWRlUmF3U2NyaXB0Q292ZXJhZ2UgPSBmYWxzZSwgdXNlQmxvY2tDb3ZlcmFnZSA9IHRydWUsIH0gPSBvcHRpb25zO1xuICAgICAgICB0aGlzLiNyZXNldE9uTmF2aWdhdGlvbiA9IHJlc2V0T25OYXZpZ2F0aW9uO1xuICAgICAgICB0aGlzLiNyZXBvcnRBbm9ueW1vdXNTY3JpcHRzID0gcmVwb3J0QW5vbnltb3VzU2NyaXB0cztcbiAgICAgICAgdGhpcy4jaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlID0gaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlO1xuICAgICAgICB0aGlzLiNlbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jc2NyaXB0VVJMcy5jbGVhcigpO1xuICAgICAgICB0aGlzLiNzY3JpcHRTb3VyY2VzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbnMgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgICAgIGNvbnN0IGNsaWVudEVtaXR0ZXIgPSB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRFbWl0dGVyKHRoaXMuI2NsaWVudCkpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdEZWJ1Z2dlci5zY3JpcHRQYXJzZWQnLCB0aGlzLiNvblNjcmlwdFBhcnNlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgY2xpZW50RW1pdHRlci5vbignUnVudGltZS5leGVjdXRpb25Db250ZXh0c0NsZWFyZWQnLCB0aGlzLiNvbkV4ZWN1dGlvbkNvbnRleHRzQ2xlYXJlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1Byb2ZpbGVyLmVuYWJsZScpLFxuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1Byb2ZpbGVyLnN0YXJ0UHJlY2lzZUNvdmVyYWdlJywge1xuICAgICAgICAgICAgICAgIGNhbGxDb3VudDogdGhpcy4jaW5jbHVkZVJhd1NjcmlwdENvdmVyYWdlLFxuICAgICAgICAgICAgICAgIGRldGFpbGVkOiB1c2VCbG9ja0NvdmVyYWdlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnRGVidWdnZXIuZW5hYmxlJyksXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnRGVidWdnZXIuc2V0U2tpcEFsbFBhdXNlcycsIHsgc2tpcDogdHJ1ZSB9KSxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgICNvbkV4ZWN1dGlvbkNvbnRleHRzQ2xlYXJlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNyZXNldE9uTmF2aWdhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3NjcmlwdFVSTHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy4jc2NyaXB0U291cmNlcy5jbGVhcigpO1xuICAgIH1cbiAgICBhc3luYyAjb25TY3JpcHRQYXJzZWQoZXZlbnQpIHtcbiAgICAgICAgLy8gSWdub3JlIHB1cHBldGVlci1pbmplY3RlZCBzY3JpcHRzXG4gICAgICAgIGlmIChQdXBwZXRlZXJVUkwuaXNQdXBwZXRlZXJVUkwoZXZlbnQudXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElnbm9yZSBvdGhlciBhbm9ueW1vdXMgc2NyaXB0cyB1bmxlc3MgdGhlIHJlcG9ydEFub255bW91c1NjcmlwdHMgb3B0aW9uIGlzIHRydWUuXG4gICAgICAgIGlmICghZXZlbnQudXJsICYmICF0aGlzLiNyZXBvcnRBbm9ueW1vdXNTY3JpcHRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ0RlYnVnZ2VyLmdldFNjcmlwdFNvdXJjZScsIHtcbiAgICAgICAgICAgICAgICBzY3JpcHRJZDogZXZlbnQuc2NyaXB0SWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuI3NjcmlwdFVSTHMuc2V0KGV2ZW50LnNjcmlwdElkLCBldmVudC51cmwpO1xuICAgICAgICAgICAgdGhpcy4jc2NyaXB0U291cmNlcy5zZXQoZXZlbnQuc2NyaXB0SWQsIHJlc3BvbnNlLnNjcmlwdFNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IGhhcHBlbiBpZiB0aGUgcGFnZSBoYXMgYWxyZWFkeSBuYXZpZ2F0ZWQgYXdheS5cbiAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHN0b3AoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLiNlbmFibGVkLCAnSlNDb3ZlcmFnZSBpcyBub3QgZW5hYmxlZCcpO1xuICAgICAgICB0aGlzLiNlbmFibGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdQcm9maWxlci50YWtlUHJlY2lzZUNvdmVyYWdlJyksXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnUHJvZmlsZXIuc3RvcFByZWNpc2VDb3ZlcmFnZScpLFxuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1Byb2ZpbGVyLmRpc2FibGUnKSxcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdEZWJ1Z2dlci5kaXNhYmxlJyksXG4gICAgICAgIF0pO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zPy5kaXNwb3NlKCk7XG4gICAgICAgIGNvbnN0IGNvdmVyYWdlID0gW107XG4gICAgICAgIGNvbnN0IHByb2ZpbGVSZXNwb25zZSA9IHJlc3VsdFswXTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBwcm9maWxlUmVzcG9uc2UucmVzdWx0KSB7XG4gICAgICAgICAgICBsZXQgdXJsID0gdGhpcy4jc2NyaXB0VVJMcy5nZXQoZW50cnkuc2NyaXB0SWQpO1xuICAgICAgICAgICAgaWYgKCF1cmwgJiYgdGhpcy4jcmVwb3J0QW5vbnltb3VzU2NyaXB0cykge1xuICAgICAgICAgICAgICAgIHVybCA9ICdkZWJ1Z2dlcjovL1ZNJyArIGVudHJ5LnNjcmlwdElkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuI3NjcmlwdFNvdXJjZXMuZ2V0KGVudHJ5LnNjcmlwdElkKTtcbiAgICAgICAgICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQgfHwgdXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5SYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZnVuYyBvZiBlbnRyeS5mdW5jdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBmbGF0dGVuUmFuZ2VzLnB1c2goLi4uZnVuYy5yYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmFuZ2VzID0gY29udmVydFRvRGlzam9pbnRSYW5nZXMoZmxhdHRlblJhbmdlcyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI2luY2x1ZGVSYXdTY3JpcHRDb3ZlcmFnZSkge1xuICAgICAgICAgICAgICAgIGNvdmVyYWdlLnB1c2goeyB1cmwsIHJhbmdlcywgdGV4dCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvdmVyYWdlLnB1c2goeyB1cmwsIHJhbmdlcywgdGV4dCwgcmF3U2NyaXB0Q292ZXJhZ2U6IGVudHJ5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3ZlcmFnZTtcbiAgICB9XG59XG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIENTU0NvdmVyYWdlIHtcbiAgICAjY2xpZW50O1xuICAgICNlbmFibGVkID0gZmFsc2U7XG4gICAgI3N0eWxlc2hlZXRVUkxzID0gbmV3IE1hcCgpO1xuICAgICNzdHlsZXNoZWV0U291cmNlcyA9IG5ldyBNYXAoKTtcbiAgICAjZXZlbnRMaXN0ZW5lcnM7XG4gICAgI3Jlc2V0T25OYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdXBkYXRlQ2xpZW50KGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIGFzeW5jIHN0YXJ0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2VuYWJsZWQsICdDU1NDb3ZlcmFnZSBpcyBhbHJlYWR5IGVuYWJsZWQnKTtcbiAgICAgICAgY29uc3QgeyByZXNldE9uTmF2aWdhdGlvbiA9IHRydWUgfSA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuI3Jlc2V0T25OYXZpZ2F0aW9uID0gcmVzZXRPbk5hdmlnYXRpb247XG4gICAgICAgIHRoaXMuI2VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLiNzdHlsZXNoZWV0VVJMcy5jbGVhcigpO1xuICAgICAgICB0aGlzLiNzdHlsZXNoZWV0U291cmNlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLiNldmVudExpc3RlbmVycyA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTtcbiAgICAgICAgY29uc3QgY2xpZW50RW1pdHRlciA9IHRoaXMuI2V2ZW50TGlzdGVuZXJzLnVzZShuZXcgRXZlbnRFbWl0dGVyKHRoaXMuI2NsaWVudCkpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdDU1Muc3R5bGVTaGVldEFkZGVkJywgdGhpcy4jb25TdHlsZVNoZWV0LmJpbmQodGhpcykpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHRzQ2xlYXJlZCcsIHRoaXMuI29uRXhlY3V0aW9uQ29udGV4dHNDbGVhcmVkLmJpbmQodGhpcykpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnRE9NLmVuYWJsZScpLFxuICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ0NTUy5lbmFibGUnKSxcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdDU1Muc3RhcnRSdWxlVXNhZ2VUcmFja2luZycpLFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgI29uRXhlY3V0aW9uQ29udGV4dHNDbGVhcmVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuI3Jlc2V0T25OYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc3R5bGVzaGVldFVSTHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy4jc3R5bGVzaGVldFNvdXJjZXMuY2xlYXIoKTtcbiAgICB9XG4gICAgYXN5bmMgI29uU3R5bGVTaGVldChldmVudCkge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBldmVudC5oZWFkZXI7XG4gICAgICAgIC8vIElnbm9yZSBhbm9ueW1vdXMgc2NyaXB0c1xuICAgICAgICBpZiAoIWhlYWRlci5zb3VyY2VVUkwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnQ1NTLmdldFN0eWxlU2hlZXRUZXh0Jywge1xuICAgICAgICAgICAgICAgIHN0eWxlU2hlZXRJZDogaGVhZGVyLnN0eWxlU2hlZXRJZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy4jc3R5bGVzaGVldFVSTHMuc2V0KGhlYWRlci5zdHlsZVNoZWV0SWQsIGhlYWRlci5zb3VyY2VVUkwpO1xuICAgICAgICAgICAgdGhpcy4jc3R5bGVzaGVldFNvdXJjZXMuc2V0KGhlYWRlci5zdHlsZVNoZWV0SWQsIHJlc3BvbnNlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gVGhpcyBtaWdodCBoYXBwZW4gaWYgdGhlIHBhZ2UgaGFzIGFscmVhZHkgbmF2aWdhdGVkIGF3YXkuXG4gICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBzdG9wKCkge1xuICAgICAgICBhc3NlcnQodGhpcy4jZW5hYmxlZCwgJ0NTU0NvdmVyYWdlIGlzIG5vdCBlbmFibGVkJyk7XG4gICAgICAgIHRoaXMuI2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgcnVsZVRyYWNraW5nUmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnQ1NTLnN0b3BSdWxlVXNhZ2VUcmFja2luZycpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnQ1NTLmRpc2FibGUnKSxcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdET00uZGlzYWJsZScpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy4jZXZlbnRMaXN0ZW5lcnM/LmRpc3Bvc2UoKTtcbiAgICAgICAgLy8gYWdncmVnYXRlIGJ5IHN0eWxlU2hlZXRJZFxuICAgICAgICBjb25zdCBzdHlsZVNoZWV0SWRUb0NvdmVyYWdlID0gbmV3IE1hcCgpO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJ1bGVUcmFja2luZ1Jlc3BvbnNlLnJ1bGVVc2FnZSkge1xuICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHN0eWxlU2hlZXRJZFRvQ292ZXJhZ2UuZ2V0KGVudHJ5LnN0eWxlU2hlZXRJZCk7XG4gICAgICAgICAgICBpZiAoIXJhbmdlcykge1xuICAgICAgICAgICAgICAgIHJhbmdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHN0eWxlU2hlZXRJZFRvQ292ZXJhZ2Uuc2V0KGVudHJ5LnN0eWxlU2hlZXRJZCwgcmFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdGFydE9mZnNldDogZW50cnkuc3RhcnRPZmZzZXQsXG4gICAgICAgICAgICAgICAgZW5kT2Zmc2V0OiBlbnRyeS5lbmRPZmZzZXQsXG4gICAgICAgICAgICAgICAgY291bnQ6IGVudHJ5LnVzZWQgPyAxIDogMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvdmVyYWdlID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgc3R5bGVTaGVldElkIG9mIHRoaXMuI3N0eWxlc2hlZXRVUkxzLmtleXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy4jc3R5bGVzaGVldFVSTHMuZ2V0KHN0eWxlU2hlZXRJZCk7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIHVybCAhPT0gJ3VuZGVmaW5lZCcsIGBTdHlsZXNoZWV0IFVSTCBpcyB1bmRlZmluZWQgKHN0eWxlU2hlZXRJZD0ke3N0eWxlU2hlZXRJZH0pYCk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy4jc3R5bGVzaGVldFNvdXJjZXMuZ2V0KHN0eWxlU2hlZXRJZCk7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIHRleHQgIT09ICd1bmRlZmluZWQnLCBgU3R5bGVzaGVldCB0ZXh0IGlzIHVuZGVmaW5lZCAoc3R5bGVTaGVldElkPSR7c3R5bGVTaGVldElkfSlgKTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlcyA9IGNvbnZlcnRUb0Rpc2pvaW50UmFuZ2VzKHN0eWxlU2hlZXRJZFRvQ292ZXJhZ2UuZ2V0KHN0eWxlU2hlZXRJZCkgfHwgW10pO1xuICAgICAgICAgICAgY292ZXJhZ2UucHVzaCh7IHVybCwgcmFuZ2VzLCB0ZXh0IH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3ZlcmFnZTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb252ZXJ0VG9EaXNqb2ludFJhbmdlcyhuZXN0ZWRSYW5nZXMpIHtcbiAgICBjb25zdCBwb2ludHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIG5lc3RlZFJhbmdlcykge1xuICAgICAgICBwb2ludHMucHVzaCh7IG9mZnNldDogcmFuZ2Uuc3RhcnRPZmZzZXQsIHR5cGU6IDAsIHJhbmdlIH0pO1xuICAgICAgICBwb2ludHMucHVzaCh7IG9mZnNldDogcmFuZ2UuZW5kT2Zmc2V0LCB0eXBlOiAxLCByYW5nZSB9KTtcbiAgICB9XG4gICAgLy8gU29ydCBwb2ludHMgdG8gZm9ybSBhIHZhbGlkIHBhcmVudGhlc2lzIHNlcXVlbmNlLlxuICAgIHBvaW50cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIFNvcnQgd2l0aCBpbmNyZWFzaW5nIG9mZnNldHMuXG4gICAgICAgIGlmIChhLm9mZnNldCAhPT0gYi5vZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBhLm9mZnNldCAtIGIub2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsbCBcImVuZFwiIHBvaW50cyBzaG91bGQgZ28gYmVmb3JlIFwic3RhcnRcIiBwb2ludHMuXG4gICAgICAgIGlmIChhLnR5cGUgIT09IGIudHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGIudHlwZSAtIGEudHlwZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhTGVuZ3RoID0gYS5yYW5nZS5lbmRPZmZzZXQgLSBhLnJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgICAgICBjb25zdCBiTGVuZ3RoID0gYi5yYW5nZS5lbmRPZmZzZXQgLSBiLnJhbmdlLnN0YXJ0T2Zmc2V0O1xuICAgICAgICAvLyBGb3IgdHdvIFwic3RhcnRcIiBwb2ludHMsIHRoZSBvbmUgd2l0aCBsb25nZXIgcmFuZ2UgZ29lcyBmaXJzdC5cbiAgICAgICAgaWYgKGEudHlwZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJMZW5ndGggLSBhTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZvciB0d28gXCJlbmRcIiBwb2ludHMsIHRoZSBvbmUgd2l0aCBzaG9ydGVyIHJhbmdlIGdvZXMgZmlyc3QuXG4gICAgICAgIHJldHVybiBhTGVuZ3RoIC0gYkxlbmd0aDtcbiAgICB9KTtcbiAgICBjb25zdCBoaXRDb3VudFN0YWNrID0gW107XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgIGxldCBsYXN0T2Zmc2V0ID0gMDtcbiAgICAvLyBSdW4gc2Nhbm5pbmcgbGluZSB0byBpbnRlcnNlY3QgYWxsIHJhbmdlcy5cbiAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHBvaW50cykge1xuICAgICAgICBpZiAoaGl0Q291bnRTdGFjay5sZW5ndGggJiZcbiAgICAgICAgICAgIGxhc3RPZmZzZXQgPCBwb2ludC5vZmZzZXQgJiZcbiAgICAgICAgICAgIGhpdENvdW50U3RhY2tbaGl0Q291bnRTdGFjay5sZW5ndGggLSAxXSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RSZXN1bHQgPSByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAobGFzdFJlc3VsdCAmJiBsYXN0UmVzdWx0LmVuZCA9PT0gbGFzdE9mZnNldCkge1xuICAgICAgICAgICAgICAgIGxhc3RSZXN1bHQuZW5kID0gcG9pbnQub2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsgc3RhcnQ6IGxhc3RPZmZzZXQsIGVuZDogcG9pbnQub2Zmc2V0IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxhc3RPZmZzZXQgPSBwb2ludC5vZmZzZXQ7XG4gICAgICAgIGlmIChwb2ludC50eXBlID09PSAwKSB7XG4gICAgICAgICAgICBoaXRDb3VudFN0YWNrLnB1c2gocG9pbnQucmFuZ2UuY291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGl0Q291bnRTdGFjay5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBGaWx0ZXIgb3V0IGVtcHR5IHJhbmdlcy5cbiAgICByZXR1cm4gcmVzdWx0cy5maWx0ZXIocmFuZ2UgPT4ge1xuICAgICAgICByZXR1cm4gcmFuZ2UuZW5kIC0gcmFuZ2Uuc3RhcnQgPiAwO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q292ZXJhZ2UuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi4vdXRpbC9EZWZlcnJlZC5qcyc7XG4vKipcbiAqIERldmljZSBpbiBhIHJlcXVlc3QgcHJvbXB0LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIERldmljZVJlcXVlc3RQcm9tcHREZXZpY2Uge1xuICAgIC8qKlxuICAgICAqIERldmljZSBpZCBkdXJpbmcgYSBwcm9tcHQuXG4gICAgICovXG4gICAgaWQ7XG4gICAgLyoqXG4gICAgICogRGV2aWNlIG5hbWUgYXMgaXQgYXBwZWFycyBpbiBhIHByb21wdC5cbiAgICAgKi9cbiAgICBuYW1lO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlkLCBuYW1lKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB9XG59XG4vKipcbiAqIERldmljZSByZXF1ZXN0IHByb21wdHMgbGV0IHlvdSByZXNwb25kIHRvIHRoZSBwYWdlIHJlcXVlc3RpbmcgZm9yIGEgZGV2aWNlXG4gKiB0aHJvdWdoIGFuIEFQSSBsaWtlIFdlYkJsdWV0b290aC5cbiAqXG4gKiBAcmVtYXJrc1xuICogYERldmljZVJlcXVlc3RQcm9tcHRgIGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgdmlhIHRoZVxuICoge0BsaW5rIFBhZ2Uud2FpdEZvckRldmljZVByb21wdH0gbWV0aG9kLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IFtkZXZpY2VSZXF1ZXN0XSA9IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS53YWl0Rm9yRGV2aWNlUHJvbXB0KCksXG4gKiAgIHBhZ2UuY2xpY2soJyNjb25uZWN0LWJsdWV0b290aCcpLFxuICogXSk7XG4gKiBhd2FpdCBkZXZpY2VQcm9tcHQuc2VsZWN0KFxuICogICBhd2FpdCBkZXZpY2VQcm9tcHQud2FpdEZvckRldmljZSgoe25hbWV9KSA9PiBuYW1lLmluY2x1ZGVzKCdNeSBEZXZpY2UnKSlcbiAqICk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXZpY2VSZXF1ZXN0UHJvbXB0IHtcbiAgICAjY2xpZW50O1xuICAgICN0aW1lb3V0U2V0dGluZ3M7XG4gICAgI2lkO1xuICAgICNoYW5kbGVkID0gZmFsc2U7XG4gICAgI3VwZGF0ZURldmljZXNIYW5kbGUgPSB0aGlzLiN1cGRhdGVEZXZpY2VzLmJpbmQodGhpcyk7XG4gICAgI3dhaXRGb3JEZXZpY2VQcm9taXNlcyA9IG5ldyBTZXQoKTtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGxpc3Qgb2Ygc2VsZWN0YWJsZSBkZXZpY2VzLlxuICAgICAqL1xuICAgIGRldmljZXMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIHRpbWVvdXRTZXR0aW5ncywgZmlyc3RFdmVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3RpbWVvdXRTZXR0aW5ncyA9IHRpbWVvdXRTZXR0aW5ncztcbiAgICAgICAgdGhpcy4jaWQgPSBmaXJzdEV2ZW50LmlkO1xuICAgICAgICB0aGlzLiNjbGllbnQub24oJ0RldmljZUFjY2Vzcy5kZXZpY2VSZXF1ZXN0UHJvbXB0ZWQnLCB0aGlzLiN1cGRhdGVEZXZpY2VzSGFuZGxlKTtcbiAgICAgICAgdGhpcy4jY2xpZW50Lm9uKCdUYXJnZXQuZGV0YWNoZWRGcm9tVGFyZ2V0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jY2xpZW50ID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI3VwZGF0ZURldmljZXMoZmlyc3RFdmVudCk7XG4gICAgfVxuICAgICN1cGRhdGVEZXZpY2VzKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5pZCAhPT0gdGhpcy4jaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJhd0RldmljZSBvZiBldmVudC5kZXZpY2VzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZXZpY2VzLnNvbWUoZGV2aWNlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLmlkID09PSByYXdEZXZpY2UuaWQ7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3RGV2aWNlID0gbmV3IERldmljZVJlcXVlc3RQcm9tcHREZXZpY2UocmF3RGV2aWNlLmlkLCByYXdEZXZpY2UubmFtZSk7XG4gICAgICAgICAgICB0aGlzLmRldmljZXMucHVzaChuZXdEZXZpY2UpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB3YWl0Rm9yRGV2aWNlUHJvbWlzZSBvZiB0aGlzLiN3YWl0Rm9yRGV2aWNlUHJvbWlzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAod2FpdEZvckRldmljZVByb21pc2UuZmlsdGVyKG5ld0RldmljZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FpdEZvckRldmljZVByb21pc2UucHJvbWlzZS5yZXNvbHZlKG5ld0RldmljZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgdG8gdGhlIGZpcnN0IGRldmljZSBpbiB0aGUgcHJvbXB0IG1hdGNoaW5nIGEgZmlsdGVyLlxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JEZXZpY2UoZmlsdGVyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXZpY2Ugb2YgdGhpcy5kZXZpY2VzKSB7XG4gICAgICAgICAgICBpZiAoZmlsdGVyKGRldmljZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdGltZW91dCA9IHRoaXMuI3RpbWVvdXRTZXR0aW5ncy50aW1lb3V0KCkgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBXYWl0aW5nIGZvciBcXGBEZXZpY2VSZXF1ZXN0UHJvbXB0RGV2aWNlXFxgIGZhaWxlZDogJHt0aW1lb3V0fW1zIGV4Y2VlZGVkYCxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBoYW5kbGUgPSB7IGZpbHRlciwgcHJvbWlzZTogZGVmZXJyZWQgfTtcbiAgICAgICAgdGhpcy4jd2FpdEZvckRldmljZVByb21pc2VzLmFkZChoYW5kbGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGRlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy4jd2FpdEZvckRldmljZVByb21pc2VzLmRlbGV0ZShoYW5kbGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBhIGRldmljZSBpbiB0aGUgcHJvbXB0J3MgbGlzdC5cbiAgICAgKi9cbiAgICBhc3luYyBzZWxlY3QoZGV2aWNlKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLiNjbGllbnQgIT09IG51bGwsICdDYW5ub3Qgc2VsZWN0IGRldmljZSB0aHJvdWdoIGRldGFjaGVkIHNlc3Npb24hJyk7XG4gICAgICAgIGFzc2VydCh0aGlzLmRldmljZXMuaW5jbHVkZXMoZGV2aWNlKSwgJ0Nhbm5vdCBzZWxlY3QgdW5rbm93biBkZXZpY2UhJyk7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBzZWxlY3QgRGV2aWNlUmVxdWVzdFByb21wdCB3aGljaCBpcyBhbHJlYWR5IGhhbmRsZWQhJyk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vZmYoJ0RldmljZUFjY2Vzcy5kZXZpY2VSZXF1ZXN0UHJvbXB0ZWQnLCB0aGlzLiN1cGRhdGVEZXZpY2VzSGFuZGxlKTtcbiAgICAgICAgdGhpcy4jaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnRGV2aWNlQWNjZXNzLnNlbGVjdFByb21wdCcsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLiNpZCxcbiAgICAgICAgICAgIGRldmljZUlkOiBkZXZpY2UuaWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYW5jZWwgdGhlIHByb21wdC5cbiAgICAgKi9cbiAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLiNjbGllbnQgIT09IG51bGwsICdDYW5ub3QgY2FuY2VsIHByb21wdCB0aHJvdWdoIGRldGFjaGVkIHNlc3Npb24hJyk7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBjYW5jZWwgRGV2aWNlUmVxdWVzdFByb21wdCB3aGljaCBpcyBhbHJlYWR5IGhhbmRsZWQhJyk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vZmYoJ0RldmljZUFjY2Vzcy5kZXZpY2VSZXF1ZXN0UHJvbXB0ZWQnLCB0aGlzLiN1cGRhdGVEZXZpY2VzSGFuZGxlKTtcbiAgICAgICAgdGhpcy4jaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnRGV2aWNlQWNjZXNzLmNhbmNlbFByb21wdCcsIHsgaWQ6IHRoaXMuI2lkIH0pO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXZpY2VSZXF1ZXN0UHJvbXB0TWFuYWdlciB7XG4gICAgI2NsaWVudDtcbiAgICAjdGltZW91dFNldHRpbmdzO1xuICAgICNkZXZpY2VSZXF1ZXN0UHJvbXBEZWZlcnJlZHMgPSBuZXcgU2V0KCk7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2xpZW50LCB0aW1lb3V0U2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB0aGlzLiN0aW1lb3V0U2V0dGluZ3MgPSB0aW1lb3V0U2V0dGluZ3M7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbignRGV2aWNlQWNjZXNzLmRldmljZVJlcXVlc3RQcm9tcHRlZCcsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuI29uRGV2aWNlUmVxdWVzdFByb21wdGVkKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbignVGFyZ2V0LmRldGFjaGVkRnJvbVRhcmdldCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudCA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXYWl0IGZvciBkZXZpY2UgcHJvbXB0IGNyZWF0ZWQgYnkgYW4gYWN0aW9uIGxpa2UgY2FsbGluZyBXZWJCbHVldG9vdGgnc1xuICAgICAqIHJlcXVlc3REZXZpY2UuXG4gICAgICovXG4gICAgYXN5bmMgd2FpdEZvckRldmljZVByb21wdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuI2NsaWVudCAhPT0gbnVsbCwgJ0Nhbm5vdCB3YWl0IGZvciBkZXZpY2UgcHJvbXB0IHRocm91Z2ggZGV0YWNoZWQgc2Vzc2lvbiEnKTtcbiAgICAgICAgY29uc3QgbmVlZHNFbmFibGUgPSB0aGlzLiNkZXZpY2VSZXF1ZXN0UHJvbXBEZWZlcnJlZHMuc2l6ZSA9PT0gMDtcbiAgICAgICAgbGV0IGVuYWJsZVByb21pc2U7XG4gICAgICAgIGlmIChuZWVkc0VuYWJsZSkge1xuICAgICAgICAgICAgZW5hYmxlUHJvbWlzZSA9IHRoaXMuI2NsaWVudC5zZW5kKCdEZXZpY2VBY2Nlc3MuZW5hYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0aW1lb3V0ID0gdGhpcy4jdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoe1xuICAgICAgICAgICAgbWVzc2FnZTogYFdhaXRpbmcgZm9yIFxcYERldmljZVJlcXVlc3RQcm9tcHRcXGAgZmFpbGVkOiAke3RpbWVvdXR9bXMgZXhjZWVkZWRgLFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQudmFsdWVPclRocm93KCksXG4gICAgICAgICAgICAgICAgZW5hYmxlUHJvbWlzZSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgICNvbkRldmljZVJlcXVlc3RQcm9tcHRlZChldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5zaXplKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHRoaXMuI2NsaWVudCAhPT0gbnVsbCk7XG4gICAgICAgIGNvbnN0IGRldmljZVByb21wdCA9IG5ldyBEZXZpY2VSZXF1ZXN0UHJvbXB0KHRoaXMuI2NsaWVudCwgdGhpcy4jdGltZW91dFNldHRpbmdzLCBldmVudCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiB0aGlzLiNkZXZpY2VSZXF1ZXN0UHJvbXBEZWZlcnJlZHMpIHtcbiAgICAgICAgICAgIHByb21pc2UucmVzb2x2ZShkZXZpY2VQcm9tcHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcERlZmVycmVkcy5jbGVhcigpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURldmljZVJlcXVlc3RQcm9tcHQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IERpYWxvZyB9IGZyb20gJy4uL2FwaS9EaWFsb2cuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENkcERpYWxvZyBleHRlbmRzIERpYWxvZyB7XG4gICAgI2NsaWVudDtcbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIHR5cGUsIG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSA9ICcnKSB7XG4gICAgICAgIHN1cGVyKHR5cGUsIG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgYXN5bmMgaGFuZGxlKG9wdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ1BhZ2UuaGFuZGxlSmF2YVNjcmlwdERpYWxvZycsIHtcbiAgICAgICAgICAgIGFjY2VwdDogb3B0aW9ucy5hY2NlcHQsXG4gICAgICAgICAgICBwcm9tcHRUZXh0OiBvcHRpb25zLnRleHQsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpYWxvZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fcnVuSW5pdGlhbGl6ZXJzID0gKHRoaXMgJiYgdGhpcy5fX3J1bkluaXRpYWxpemVycykgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gICAgfVxuICAgIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcbnZhciBfX2VzRGVjb3JhdGUgPSAodGhpcyAmJiB0aGlzLl9fZXNEZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gICAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gICAgZG9uZSA9IHRydWU7XG59O1xuaW1wb3J0IHsgRWxlbWVudEhhbmRsZSB9IGZyb20gJy4uL2FwaS9FbGVtZW50SGFuZGxlLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBBc3luY0l0ZXJhYmxlVXRpbCB9IGZyb20gJy4uL3V0aWwvQXN5bmNJdGVyYWJsZVV0aWwuanMnO1xuaW1wb3J0IHsgdGhyb3dJZkRpc3Bvc2VkIH0gZnJvbSAnLi4vdXRpbC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENkcEpTSGFuZGxlIH0gZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG5jb25zdCBOT05fRUxFTUVOVF9OT0RFX1JPTEVTID0gbmV3IFNldChbJ1N0YXRpY1RleHQnLCAnSW5saW5lVGV4dEJveCddKTtcbi8qKlxuICogVGhlIENkcEVsZW1lbnRIYW5kbGUgZXh0ZW5kcyBFbGVtZW50SGFuZGxlIG5vdyB0byBrZWVwIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggYGluc3RhbmNlb2ZgIGJlY2F1c2Ugb2YgdGhhdCB3ZSBuZWVkIHRvIGhhdmUgbWV0aG9kcyBmb3JcbiAqIENkcEpTSGFuZGxlIHRvIGluIHRoaXMgaW1wbGVtZW50YXRpb24gYXMgd2VsbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xubGV0IENkcEVsZW1lbnRIYW5kbGUgPSAoKCkgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgbGV0IF9jbGFzc1N1cGVyID0gRWxlbWVudEhhbmRsZTtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX2NvbnRlbnRGcmFtZV9kZWNvcmF0b3JzO1xuICAgIGxldCBfc2Nyb2xsSW50b1ZpZXdfZGVjb3JhdG9ycztcbiAgICBsZXQgX3VwbG9hZEZpbGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX2F1dG9maWxsX2RlY29yYXRvcnM7XG4gICAgcmV0dXJuIGNsYXNzIENkcEVsZW1lbnRIYW5kbGUgZXh0ZW5kcyBfY2xhc3NTdXBlciB7XG4gICAgICAgIHN0YXRpYyB7XG4gICAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShfY2xhc3NTdXBlcltTeW1ib2wubWV0YWRhdGFdID8/IG51bGwpIDogdm9pZCAwO1xuICAgICAgICAgICAgX2NvbnRlbnRGcmFtZV9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpXTtcbiAgICAgICAgICAgIF9zY3JvbGxJbnRvVmlld19kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpLCAoX2EgPSBFbGVtZW50SGFuZGxlKS5iaW5kSXNvbGF0ZWRIYW5kbGUuYmluZChfYSldO1xuICAgICAgICAgICAgX3VwbG9hZEZpbGVfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGlzcG9zZWQoKSwgKF9iID0gRWxlbWVudEhhbmRsZSkuYmluZElzb2xhdGVkSGFuZGxlLmJpbmQoX2IpXTtcbiAgICAgICAgICAgIF9hdXRvZmlsbF9kZWNvcmF0b3JzID0gW3Rocm93SWZEaXNwb3NlZCgpXTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfY29udGVudEZyYW1lX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJjb250ZW50RnJhbWVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImNvbnRlbnRGcmFtZVwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmNvbnRlbnRGcmFtZSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2Nyb2xsSW50b1ZpZXdfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcInNjcm9sbEludG9WaWV3XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzY3JvbGxJbnRvVmlld1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNjcm9sbEludG9WaWV3IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF91cGxvYWRGaWxlX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJ1cGxvYWRGaWxlXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJ1cGxvYWRGaWxlXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmoudXBsb2FkRmlsZSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfYXV0b2ZpbGxfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImF1dG9maWxsXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJhdXRvZmlsbFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmF1dG9maWxsIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0cnVjdG9yKHdvcmxkLCByZW1vdGVPYmplY3QpIHtcbiAgICAgICAgICAgIHN1cGVyKG5ldyBDZHBKU0hhbmRsZSh3b3JsZCwgcmVtb3RlT2JqZWN0KSk7XG4gICAgICAgICAgICBfX3J1bkluaXRpYWxpemVycyh0aGlzLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHJlYWxtKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlLnJlYWxtO1xuICAgICAgICB9XG4gICAgICAgIGdldCBjbGllbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGUuY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIHJlbW90ZU9iamVjdCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZS5yZW1vdGVPYmplY3QoKTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI2ZyYW1lTWFuYWdlcigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZyYW1lLl9mcmFtZU1hbmFnZXI7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGZyYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhbG0uZW52aXJvbm1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgY29udGVudEZyYW1lKCkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUluZm8gPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uZGVzY3JpYmVOb2RlJywge1xuICAgICAgICAgICAgICAgIG9iamVjdElkOiB0aGlzLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGVJbmZvLm5vZGUuZnJhbWVJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNmcmFtZU1hbmFnZXIuZnJhbWUobm9kZUluZm8ubm9kZS5mcmFtZUlkKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBzY3JvbGxJbnRvVmlldygpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0Q29ubmVjdGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byBFbGVtZW50LnNjcm9sbEludG9WaWV3IGlmIERPTS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkIGlzIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgICAgICAgICBhd2FpdCBzdXBlci5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHVwbG9hZEZpbGUoLi4uZmlsZVBhdGhzKSB7XG4gICAgICAgICAgICBjb25zdCBpc011bHRpcGxlID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5tdWx0aXBsZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXNzZXJ0KGZpbGVQYXRocy5sZW5ndGggPD0gMSB8fCBpc011bHRpcGxlLCAnTXVsdGlwbGUgZmlsZSB1cGxvYWRzIG9ubHkgd29yayB3aXRoIDxpbnB1dCB0eXBlPWZpbGUgbXVsdGlwbGU+Jyk7XG4gICAgICAgICAgICAvLyBMb2NhdGUgYWxsIGZpbGVzIGFuZCBjb25maXJtIHRoYXQgdGhleSBleGlzdC5cbiAgICAgICAgICAgIGxldCBwYXRoO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXRoID0gYXdhaXQgaW1wb3J0KCdwYXRoJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBKU0hhbmRsZSN1cGxvYWRGaWxlIGNhbiBvbmx5IGJlIHVzZWQgaW4gTm9kZS1saWtlIGVudmlyb25tZW50cy5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGZpbGVQYXRocy5tYXAoZmlsZVBhdGggPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoLndpbjMyLmlzQWJzb2x1dGUoZmlsZVBhdGgpIHx8IHBhdGgucG9zaXguaXNBYnNvbHV0ZShmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVQYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSB6ZXJvLWxlbmd0aCBhcnJheSBpcyBhIHNwZWNpYWwgY2FzZSwgaXQgc2VlbXMgdGhhdFxuICAgICAgICAgICAgICogRE9NLnNldEZpbGVJbnB1dEZpbGVzIGRvZXMgbm90IGFjdHVhbGx5IHVwZGF0ZSB0aGUgZmlsZXMgaW4gdGhhdCBjYXNlLCBzb1xuICAgICAgICAgICAgICogdGhlIHNvbHV0aW9uIGlzIHRvIGV2YWwgdGhlIGVsZW1lbnQgdmFsdWUgdG8gYSBuZXcgRmlsZUxpc3QgZGlyZWN0bHkuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBYWFg6IFRoZXNlIGV2ZW50cyBzaG91bGQgY29udmVydGVkIHRvIHRydXN0ZWQgZXZlbnRzLiBQZXJoYXBzIGRvIHRoaXNcbiAgICAgICAgICAgICAgICAvLyBpbiBgRE9NLnNldEZpbGVJbnB1dEZpbGVzYD9cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZpbGVzID0gbmV3IERhdGFUcmFuc2ZlcigpLmZpbGVzO1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaCBldmVudHMgZm9yIHRoaXMgY2FzZSBiZWNhdXNlIGl0IHNob3VsZCBiZWhhdmUgYWtpbiB0byBhIHVzZXIgYWN0aW9uLlxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHsgbm9kZTogeyBiYWNrZW5kTm9kZUlkIH0sIH0gPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uZGVzY3JpYmVOb2RlJywge1xuICAgICAgICAgICAgICAgIG9iamVjdElkOiB0aGlzLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdET00uc2V0RmlsZUlucHV0RmlsZXMnLCB7XG4gICAgICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgZmlsZXMsXG4gICAgICAgICAgICAgICAgYmFja2VuZE5vZGVJZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGF1dG9maWxsKGRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVJbmZvID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnRE9NLmRlc2NyaWJlTm9kZScsIHtcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5oYW5kbGUuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkSWQgPSBub2RlSW5mby5ub2RlLmJhY2tlbmROb2RlSWQ7XG4gICAgICAgICAgICBjb25zdCBmcmFtZUlkID0gdGhpcy5mcmFtZS5faWQ7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKCdBdXRvZmlsbC50cmlnZ2VyJywge1xuICAgICAgICAgICAgICAgIGZpZWxkSWQsXG4gICAgICAgICAgICAgICAgZnJhbWVJZCxcbiAgICAgICAgICAgICAgICBjYXJkOiBkYXRhLmNyZWRpdENhcmQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyAqcXVlcnlBWFRyZWUobmFtZSwgcm9sZSkge1xuICAgICAgICAgICAgY29uc3QgeyBub2RlcyB9ID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnQWNjZXNzaWJpbGl0eS5xdWVyeUFYVHJlZScsIHtcbiAgICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBhY2Nlc3NpYmxlTmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gbm9kZXMuZmlsdGVyKG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmlnbm9yZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUucm9sZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChOT05fRUxFTUVOVF9OT0RFX1JPTEVTLmhhcyhub2RlLnJvbGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogQXN5bmNJdGVyYWJsZVV0aWwubWFwKHJlc3VsdHMsIG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWxtLmFkb3B0QmFja2VuZE5vZGUobm9kZS5iYWNrZW5kRE9NTm9kZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5leHBvcnQgeyBDZHBFbGVtZW50SGFuZGxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FbGVtZW50SGFuZGxlLmpzLm1hcCIsInZhciBfX3J1bkluaXRpYWxpemVycyA9ICh0aGlzICYmIHRoaXMuX19ydW5Jbml0aWFsaXplcnMpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG52YXIgX19lc0RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2VzRGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICAgIGRvbmUgPSB0cnVlO1xufTtcbnZhciBfX3NldEZ1bmN0aW9uTmFtZSA9ICh0aGlzICYmIHRoaXMuX19zZXRGdW5jdGlvbk5hbWUpIHx8IGZ1bmN0aW9uIChmLCBuYW1lLCBwcmVmaXgpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbkV2ZW50IH0gZnJvbSAnLi4vYXBpL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IGludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHMgfSBmcm9tICcuLi91dGlsL2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRW11bGF0ZWRTdGF0ZSB7XG4gICAgI3N0YXRlO1xuICAgICNjbGllbnRQcm92aWRlcjtcbiAgICAjdXBkYXRlcjtcbiAgICBjb25zdHJ1Y3Rvcihpbml0aWFsU3RhdGUsIGNsaWVudFByb3ZpZGVyLCB1cGRhdGVyKSB7XG4gICAgICAgIHRoaXMuI3N0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgICAgICB0aGlzLiNjbGllbnRQcm92aWRlciA9IGNsaWVudFByb3ZpZGVyO1xuICAgICAgICB0aGlzLiN1cGRhdGVyID0gdXBkYXRlcjtcbiAgICAgICAgdGhpcy4jY2xpZW50UHJvdmlkZXIucmVnaXN0ZXJTdGF0ZSh0aGlzKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0U3RhdGUoc3RhdGUpIHtcbiAgICAgICAgdGhpcy4jc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gICAgfVxuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3N0YXRlO1xuICAgIH1cbiAgICBhc3luYyBzeW5jKCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLiNjbGllbnRQcm92aWRlci5jbGllbnRzKCkubWFwKGNsaWVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jdXBkYXRlcihjbGllbnQsIHRoaXMuI3N0YXRlKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBFbXVsYXRpb25NYW5hZ2VyID0gKCgpID0+IHtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX3ByaXZhdGVfYXBwbHlWaWV3cG9ydF9kZWNvcmF0b3JzO1xuICAgIGxldCBfcHJpdmF0ZV9hcHBseVZpZXdwb3J0X2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVJZGxlU3RhdGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfZW11bGF0ZUlkbGVTdGF0ZV9kZXNjcmlwdG9yO1xuICAgIGxldCBfcHJpdmF0ZV9lbXVsYXRlVGltZXpvbmVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVWaXNpb25EZWZpY2llbmN5X2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVWaXNpb25EZWZpY2llbmN5X2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVNZWRpYUZlYXR1cmVzX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVNZWRpYUZlYXR1cmVzX2Rlc2NyaXB0b3I7XG4gICAgbGV0IF9wcml2YXRlX2VtdWxhdGVNZWRpYVR5cGVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfZW11bGF0ZU1lZGlhVHlwZV9kZXNjcmlwdG9yO1xuICAgIGxldCBfcHJpdmF0ZV9zZXRHZW9sb2NhdGlvbl9kZWNvcmF0b3JzO1xuICAgIGxldCBfcHJpdmF0ZV9zZXRHZW9sb2NhdGlvbl9kZXNjcmlwdG9yO1xuICAgIGxldCBfcHJpdmF0ZV9zZXREZWZhdWx0QmFja2dyb3VuZENvbG9yX2RlY29yYXRvcnM7XG4gICAgbGV0IF9wcml2YXRlX3NldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3JfZGVzY3JpcHRvcjtcbiAgICBsZXQgX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVzY3JpcHRvcjtcbiAgICByZXR1cm4gY2xhc3MgRW11bGF0aW9uTWFuYWdlciB7XG4gICAgICAgIHN0YXRpYyB7XG4gICAgICAgICAgICBjb25zdCBfbWV0YWRhdGEgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm1ldGFkYXRhID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9wcml2YXRlX2FwcGx5Vmlld3BvcnRfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX2VtdWxhdGVJZGxlU3RhdGVfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX2VtdWxhdGVUaW1lem9uZV9kZWNvcmF0b3JzID0gW2ludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHNdO1xuICAgICAgICAgICAgX3ByaXZhdGVfZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2RlY29yYXRvcnMgPSBbaW52b2tlQXRNb3N0T25jZUZvckFyZ3VtZW50c107XG4gICAgICAgICAgICBfcHJpdmF0ZV9lbXVsYXRlTWVkaWFGZWF0dXJlc19kZWNvcmF0b3JzID0gW2ludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHNdO1xuICAgICAgICAgICAgX3ByaXZhdGVfZW11bGF0ZU1lZGlhVHlwZV9kZWNvcmF0b3JzID0gW2ludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHNdO1xuICAgICAgICAgICAgX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX3NldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3JfZGVjb3JhdG9ycyA9IFtpbnZva2VBdE1vc3RPbmNlRm9yQXJndW1lbnRzXTtcbiAgICAgICAgICAgIF9wcml2YXRlX3NldEphdmFTY3JpcHRFbmFibGVkX2RlY29yYXRvcnMgPSBbaW52b2tlQXRNb3N0T25jZUZvckFyZ3VtZW50c107XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfYXBwbHlWaWV3cG9ydF9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXZpZXdwb3J0U3RhdGUudmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2VuZCgnRW11bGF0aW9uLmNsZWFyRGV2aWNlTWV0cmljc092ZXJyaWRlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRUb3VjaEVtdWxhdGlvbkVuYWJsZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB2aWV3cG9ydCB9ID0gdmlld3BvcnRTdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9iaWxlID0gdmlld3BvcnQuaXNNb2JpbGUgfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gdmlld3BvcnQud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHZpZXdwb3J0LmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlU2NhbGVGYWN0b3IgPSB2aWV3cG9ydC5kZXZpY2VTY2FsZUZhY3RvciA/PyAxO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JlZW5PcmllbnRhdGlvbiA9IHZpZXdwb3J0LmlzTGFuZHNjYXBlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHsgYW5nbGU6IDkwLCB0eXBlOiAnbGFuZHNjYXBlUHJpbWFyeScgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7IGFuZ2xlOiAwLCB0eXBlOiAncG9ydHJhaXRQcmltYXJ5JyB9O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNUb3VjaCA9IHZpZXdwb3J0Lmhhc1RvdWNoIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VuZCgnRW11bGF0aW9uLnNldERldmljZU1ldHJpY3NPdmVycmlkZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2JpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbk9yaWVudGF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoJ1RhcmdldCBkb2VzIG5vdCBzdXBwb3J0IG1ldHJpY3Mgb3ZlcnJpZGUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldFRvdWNoRW11bGF0aW9uRW5hYmxlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBoYXNUb3VjaCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9LCBcIiNhcHBseVZpZXdwb3J0XCIpIH0sIF9wcml2YXRlX2FwcGx5Vmlld3BvcnRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNhcHBseVZpZXdwb3J0XCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjYXBwbHlWaWV3cG9ydCBpbiBvYmosIGdldDogb2JqID0+IG9iai4jYXBwbHlWaWV3cG9ydCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9lbXVsYXRlSWRsZVN0YXRlX2Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfX3NldEZ1bmN0aW9uTmFtZShhc3luYyBmdW5jdGlvbiAoY2xpZW50LCBpZGxlU3RhdGVTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlkbGVTdGF0ZVN0YXRlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZGxlU3RhdGVTdGF0ZS5vdmVycmlkZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdFbXVsYXRpb24uc2V0SWRsZU92ZXJyaWRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVXNlckFjdGl2ZTogaWRsZVN0YXRlU3RhdGUub3ZlcnJpZGVzLmlzVXNlckFjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NjcmVlblVubG9ja2VkOiBpZGxlU3RhdGVTdGF0ZS5vdmVycmlkZXMuaXNTY3JlZW5VbmxvY2tlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5jbGVhcklkbGVPdmVycmlkZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgXCIjZW11bGF0ZUlkbGVTdGF0ZVwiKSB9LCBfcHJpdmF0ZV9lbXVsYXRlSWRsZVN0YXRlX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZUlkbGVTdGF0ZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI2VtdWxhdGVJZGxlU3RhdGUgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouI2VtdWxhdGVJZGxlU3RhdGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfX3NldEZ1bmN0aW9uTmFtZShhc3luYyBmdW5jdGlvbiAoY2xpZW50LCB0aW1lem9uZVN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGltZXpvbmVTdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRUaW1lem9uZU92ZXJyaWRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV6b25lSWQ6IHRpbWV6b25lU3RhdGUudGltZXpvbmVJZCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRXJyb3JMaWtlKGVycm9yKSAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdJbnZhbGlkIHRpbWV6b25lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGltZXpvbmUgSUQ6ICR7dGltZXpvbmVTdGF0ZS50aW1lem9uZUlkfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBcIiNlbXVsYXRlVGltZXpvbmVcIikgfSwgX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZVRpbWV6b25lXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjZW11bGF0ZVRpbWV6b25lIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNlbXVsYXRlVGltZXpvbmUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lfZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChjbGllbnQsIHZpc2lvbkRlZmljaWVuY3kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2aXNpb25EZWZpY2llbmN5LmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdFbXVsYXRpb24uc2V0RW11bGF0ZWRWaXNpb25EZWZpY2llbmN5Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdmlzaW9uRGVmaWNpZW5jeS52aXNpb25EZWZpY2llbmN5IHx8ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgXCIjZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lcIikgfSwgX3ByaXZhdGVfZW11bGF0ZVZpc2lvbkRlZmljaWVuY3lfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNlbXVsYXRlVmlzaW9uRGVmaWNpZW5jeVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI2VtdWxhdGVWaXNpb25EZWZpY2llbmN5IGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNlbXVsYXRlVmlzaW9uRGVmaWNpZW5jeSB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9lbXVsYXRlQ3B1VGhyb3R0bGluZ19kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldENQVVRocm90dGxpbmdSYXRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogc3RhdGUuZmFjdG9yID8/IDEsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIFwiI2VtdWxhdGVDcHVUaHJvdHRsaW5nXCIpIH0sIF9wcml2YXRlX2VtdWxhdGVDcHVUaHJvdHRsaW5nX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZUNwdVRocm90dGxpbmdcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogdHJ1ZSwgYWNjZXNzOiB7IGhhczogb2JqID0+ICNlbXVsYXRlQ3B1VGhyb3R0bGluZyBpbiBvYmosIGdldDogb2JqID0+IG9iai4jZW11bGF0ZUNwdVRocm90dGxpbmcgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZU1lZGlhRmVhdHVyZXNfZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChjbGllbnQsIHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRFbXVsYXRlZE1lZGlhJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IHN0YXRlLm1lZGlhRmVhdHVyZXMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIFwiI2VtdWxhdGVNZWRpYUZlYXR1cmVzXCIpIH0sIF9wcml2YXRlX2VtdWxhdGVNZWRpYUZlYXR1cmVzX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZU1lZGlhRmVhdHVyZXNcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogdHJ1ZSwgYWNjZXNzOiB7IGhhczogb2JqID0+ICNlbXVsYXRlTWVkaWFGZWF0dXJlcyBpbiBvYmosIGdldDogb2JqID0+IG9iai4jZW11bGF0ZU1lZGlhRmVhdHVyZXMgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfZW11bGF0ZU1lZGlhVHlwZV9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldEVtdWxhdGVkTWVkaWEnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTogc3RhdGUudHlwZSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgXCIjZW11bGF0ZU1lZGlhVHlwZVwiKSB9LCBfcHJpdmF0ZV9lbXVsYXRlTWVkaWFUeXBlX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCIjZW11bGF0ZU1lZGlhVHlwZVwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI2VtdWxhdGVNZWRpYVR5cGUgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouI2VtdWxhdGVNZWRpYVR5cGUgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVzY3JpcHRvciA9IHsgdmFsdWU6IF9fc2V0RnVuY3Rpb25OYW1lKGFzeW5jIGZ1bmN0aW9uIChjbGllbnQsIHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGUuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnNlbmQoJ0VtdWxhdGlvbi5zZXRHZW9sb2NhdGlvbk92ZXJyaWRlJywgc3RhdGUuZ2VvTG9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogc3RhdGUuZ2VvTG9jYXRpb24ubG9uZ2l0dWRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlOiBzdGF0ZS5nZW9Mb2NhdGlvbi5sYXRpdHVkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeTogc3RhdGUuZ2VvTG9jYXRpb24uYWNjdXJhY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfSwgXCIjc2V0R2VvbG9jYXRpb25cIikgfSwgX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNzZXRHZW9sb2NhdGlvblwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI3NldEdlb2xvY2F0aW9uIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNzZXRHZW9sb2NhdGlvbiB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9zZXREZWZhdWx0QmFja2dyb3VuZENvbG9yX2Rlc2NyaXB0b3IgPSB7IHZhbHVlOiBfX3NldEZ1bmN0aW9uTmFtZShhc3luYyBmdW5jdGlvbiAoY2xpZW50LCBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdFbXVsYXRpb24uc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvck92ZXJyaWRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHN0YXRlLmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCBcIiNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yXCIpIH0sIF9wcml2YXRlX3NldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3JfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IHRydWUsIGFjY2VzczogeyBoYXM6IG9iaiA9PiAjc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvciBpbiBvYmosIGdldDogb2JqID0+IG9iai4jc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvciB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBfcHJpdmF0ZV9zZXRKYXZhU2NyaXB0RW5hYmxlZF9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGNsaWVudCwgc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnRW11bGF0aW9uLnNldFNjcmlwdEV4ZWN1dGlvbkRpc2FibGVkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICFzdGF0ZS5qYXZhU2NyaXB0RW5hYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgXCIjc2V0SmF2YVNjcmlwdEVuYWJsZWRcIikgfSwgX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIiNzZXRKYXZhU2NyaXB0RW5hYmxlZFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiB0cnVlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gI3NldEphdmFTY3JpcHRFbmFibGVkIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiNzZXRKYXZhU2NyaXB0RW5hYmxlZCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICAjY2xpZW50ID0gX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAjZW11bGF0aW5nTW9iaWxlID0gZmFsc2U7XG4gICAgICAgICNoYXNUb3VjaCA9IGZhbHNlO1xuICAgICAgICAjc3RhdGVzID0gW107XG4gICAgICAgICN2aWV3cG9ydFN0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jYXBwbHlWaWV3cG9ydCk7XG4gICAgICAgICNpZGxlT3ZlcnJpZGVzU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNlbXVsYXRlSWRsZVN0YXRlKTtcbiAgICAgICAgI3RpbWV6b25lU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNlbXVsYXRlVGltZXpvbmUpO1xuICAgICAgICAjdmlzaW9uRGVmaWNpZW5jeVN0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jZW11bGF0ZVZpc2lvbkRlZmljaWVuY3kpO1xuICAgICAgICAjY3B1VGhyb3R0bGluZ1N0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jZW11bGF0ZUNwdVRocm90dGxpbmcpO1xuICAgICAgICAjbWVkaWFGZWF0dXJlc1N0YXRlID0gbmV3IEVtdWxhdGVkU3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSwgdGhpcywgdGhpcy4jZW11bGF0ZU1lZGlhRmVhdHVyZXMpO1xuICAgICAgICAjbWVkaWFUeXBlU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNlbXVsYXRlTWVkaWFUeXBlKTtcbiAgICAgICAgI2dlb0xvY2F0aW9uU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNzZXRHZW9sb2NhdGlvbik7XG4gICAgICAgICNkZWZhdWx0QmFja2dyb3VuZENvbG9yU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBhY3RpdmU6IGZhbHNlLFxuICAgICAgICB9LCB0aGlzLCB0aGlzLiNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgI2phdmFzY3JpcHRFbmFibGVkU3RhdGUgPSBuZXcgRW11bGF0ZWRTdGF0ZSh7XG4gICAgICAgICAgICBqYXZhU2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgIH0sIHRoaXMsIHRoaXMuI3NldEphdmFTY3JpcHRFbmFibGVkKTtcbiAgICAgICAgI3NlY29uZGFyeUNsaWVudHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGNvbnN0cnVjdG9yKGNsaWVudCkge1xuICAgICAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUNsaWVudChjbGllbnQpIHtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICAgICAgICAgIHRoaXMuI3NlY29uZGFyeUNsaWVudHMuZGVsZXRlKGNsaWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVnaXN0ZXJTdGF0ZShzdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy4jc3RhdGVzLnB1c2goc3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGNsaWVudHMoKSB7XG4gICAgICAgICAgICByZXR1cm4gW3RoaXMuI2NsaWVudCwgLi4uQXJyYXkuZnJvbSh0aGlzLiNzZWNvbmRhcnlDbGllbnRzKV07XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgcmVnaXN0ZXJTcGVjdWxhdGl2ZVNlc3Npb24oY2xpZW50KSB7XG4gICAgICAgICAgICB0aGlzLiNzZWNvbmRhcnlDbGllbnRzLmFkZChjbGllbnQpO1xuICAgICAgICAgICAgY2xpZW50Lm9uY2UoQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI3NlY29uZGFyeUNsaWVudHMuZGVsZXRlKGNsaWVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IGF3YWl0IGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvIHJlZ2lzdGVyIGFsbCBzdGF0ZSBjaGFuZ2VzIGJlZm9yZVxuICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBpcyB1bnBhdXNlZC5cbiAgICAgICAgICAgIHZvaWQgUHJvbWlzZS5hbGwodGhpcy4jc3RhdGVzLm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcy5zeW5jKCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGphdmFzY3JpcHRFbmFibGVkKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2phdmFzY3JpcHRFbmFibGVkU3RhdGUuc3RhdGUuamF2YVNjcmlwdEVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgZW11bGF0ZVZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLiN2aWV3cG9ydFN0YXRlLnN0YXRlO1xuICAgICAgICAgICAgaWYgKCF2aWV3cG9ydCAmJiAhY3VycmVudFN0YXRlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3ZpZXdwb3J0U3RhdGUuc2V0U3RhdGUodmlld3BvcnRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgdmlld3BvcnQsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBtb2JpbGUgPSB2aWV3cG9ydD8uaXNNb2JpbGUgfHwgZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBoYXNUb3VjaCA9IHZpZXdwb3J0Py5oYXNUb3VjaCB8fCBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHJlbG9hZE5lZWRlZCA9IHRoaXMuI2VtdWxhdGluZ01vYmlsZSAhPT0gbW9iaWxlIHx8IHRoaXMuI2hhc1RvdWNoICE9PSBoYXNUb3VjaDtcbiAgICAgICAgICAgIHRoaXMuI2VtdWxhdGluZ01vYmlsZSA9IG1vYmlsZTtcbiAgICAgICAgICAgIHRoaXMuI2hhc1RvdWNoID0gaGFzVG91Y2g7XG4gICAgICAgICAgICByZXR1cm4gcmVsb2FkTmVlZGVkO1xuICAgICAgICB9XG4gICAgICAgIGdldCAjYXBwbHlWaWV3cG9ydCgpIHsgcmV0dXJuIF9wcml2YXRlX2FwcGx5Vmlld3BvcnRfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBlbXVsYXRlSWRsZVN0YXRlKG92ZXJyaWRlcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jaWRsZU92ZXJyaWRlc1N0YXRlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0ICNlbXVsYXRlSWRsZVN0YXRlKCkgeyByZXR1cm4gX3ByaXZhdGVfZW11bGF0ZUlkbGVTdGF0ZV9kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIGdldCAjZW11bGF0ZVRpbWV6b25lKCkgeyByZXR1cm4gX3ByaXZhdGVfZW11bGF0ZVRpbWV6b25lX2Rlc2NyaXB0b3IudmFsdWU7IH1cbiAgICAgICAgYXN5bmMgZW11bGF0ZVRpbWV6b25lKHRpbWV6b25lSWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3RpbWV6b25lU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHRpbWV6b25lSWQsXG4gICAgICAgICAgICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0ICNlbXVsYXRlVmlzaW9uRGVmaWNpZW5jeSgpIHsgcmV0dXJuIF9wcml2YXRlX2VtdWxhdGVWaXNpb25EZWZpY2llbmN5X2Rlc2NyaXB0b3IudmFsdWU7IH1cbiAgICAgICAgYXN5bmMgZW11bGF0ZVZpc2lvbkRlZmljaWVuY3kodHlwZSkge1xuICAgICAgICAgICAgY29uc3QgdmlzaW9uRGVmaWNpZW5jaWVzID0gbmV3IFNldChbXG4gICAgICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgICAgICdhY2hyb21hdG9wc2lhJyxcbiAgICAgICAgICAgICAgICAnYmx1cnJlZFZpc2lvbicsXG4gICAgICAgICAgICAgICAgJ2RldXRlcmFub3BpYScsXG4gICAgICAgICAgICAgICAgJ3Byb3Rhbm9waWEnLFxuICAgICAgICAgICAgICAgICd0cml0YW5vcGlhJyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgYXNzZXJ0KCF0eXBlIHx8IHZpc2lvbkRlZmljaWVuY2llcy5oYXModHlwZSksIGBVbnN1cHBvcnRlZCB2aXNpb24gZGVmaWNpZW5jeTogJHt0eXBlfWApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jdmlzaW9uRGVmaWNpZW5jeVN0YXRlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgdmlzaW9uRGVmaWNpZW5jeTogdHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCAjZW11bGF0ZUNwdVRocm90dGxpbmcoKSB7IHJldHVybiBfcHJpdmF0ZV9lbXVsYXRlQ3B1VGhyb3R0bGluZ19kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIGFzeW5jIGVtdWxhdGVDUFVUaHJvdHRsaW5nKGZhY3Rvcikge1xuICAgICAgICAgICAgYXNzZXJ0KGZhY3RvciA9PT0gbnVsbCB8fCBmYWN0b3IgPj0gMSwgJ1Rocm90dGxpbmcgcmF0ZSBzaG91bGQgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxJyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNjcHVUaHJvdHRsaW5nU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBmYWN0b3I6IGZhY3RvciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI2VtdWxhdGVNZWRpYUZlYXR1cmVzKCkgeyByZXR1cm4gX3ByaXZhdGVfZW11bGF0ZU1lZGlhRmVhdHVyZXNfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBlbXVsYXRlTWVkaWFGZWF0dXJlcyhmZWF0dXJlcykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmVhdHVyZXMpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtZWRpYUZlYXR1cmUgb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IG1lZGlhRmVhdHVyZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQoL14oPzpwcmVmZXJzLSg/OmNvbG9yLXNjaGVtZXxyZWR1Y2VkLW1vdGlvbil8Y29sb3ItZ2FtdXQpJC8udGVzdChuYW1lKSwgJ1Vuc3VwcG9ydGVkIG1lZGlhIGZlYXR1cmU6ICcgKyBuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNtZWRpYUZlYXR1cmVzU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZWRpYUZlYXR1cmVzOiBmZWF0dXJlcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGdldCAjZW11bGF0ZU1lZGlhVHlwZSgpIHsgcmV0dXJuIF9wcml2YXRlX2VtdWxhdGVNZWRpYVR5cGVfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBlbXVsYXRlTWVkaWFUeXBlKHR5cGUpIHtcbiAgICAgICAgICAgIGFzc2VydCh0eXBlID09PSAnc2NyZWVuJyB8fFxuICAgICAgICAgICAgICAgIHR5cGUgPT09ICdwcmludCcgfHxcbiAgICAgICAgICAgICAgICAodHlwZSA/PyB1bmRlZmluZWQpID09PSB1bmRlZmluZWQsICdVbnN1cHBvcnRlZCBtZWRpYSB0eXBlOiAnICsgdHlwZSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNtZWRpYVR5cGVTdGF0ZS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI3NldEdlb2xvY2F0aW9uKCkgeyByZXR1cm4gX3ByaXZhdGVfc2V0R2VvbG9jYXRpb25fZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBzZXRHZW9sb2NhdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCB7IGxvbmdpdHVkZSwgbGF0aXR1ZGUsIGFjY3VyYWN5ID0gMCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGlmIChsb25naXR1ZGUgPCAtMTgwIHx8IGxvbmdpdHVkZSA+IDE4MCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb25naXR1ZGUgXCIke2xvbmdpdHVkZX1cIjogcHJlY29uZGl0aW9uIC0xODAgPD0gTE9OR0lUVURFIDw9IDE4MCBmYWlsZWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGF0aXR1ZGUgPCAtOTAgfHwgbGF0aXR1ZGUgPiA5MCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsYXRpdHVkZSBcIiR7bGF0aXR1ZGV9XCI6IHByZWNvbmRpdGlvbiAtOTAgPD0gTEFUSVRVREUgPD0gOTAgZmFpbGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFjY3VyYWN5IDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhY2N1cmFjeSBcIiR7YWNjdXJhY3l9XCI6IHByZWNvbmRpdGlvbiAwIDw9IEFDQ1VSQUNZIGZhaWxlZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2dlb0xvY2F0aW9uU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW9Mb2NhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGUsXG4gICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlLFxuICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0ICNzZXREZWZhdWx0QmFja2dyb3VuZENvbG9yKCkgeyByZXR1cm4gX3ByaXZhdGVfc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvcl9kZXNjcmlwdG9yLnZhbHVlOyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXNldHMgZGVmYXVsdCB3aGl0ZSBiYWNrZ3JvdW5kXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyByZXNldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNkZWZhdWx0QmFja2dyb3VuZENvbG9yU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhpZGVzIGRlZmF1bHQgd2hpdGUgYmFja2dyb3VuZFxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kQ29sb3IoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNkZWZhdWx0QmFja2dyb3VuZENvbG9yU3RhdGUuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogeyByOiAwLCBnOiAwLCBiOiAwLCBhOiAwIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgI3NldEphdmFTY3JpcHRFbmFibGVkKCkgeyByZXR1cm4gX3ByaXZhdGVfc2V0SmF2YVNjcmlwdEVuYWJsZWRfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICBhc3luYyBzZXRKYXZhU2NyaXB0RW5hYmxlZChlbmFibGVkKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNqYXZhc2NyaXB0RW5hYmxlZFN0YXRlLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgamF2YVNjcmlwdEVuYWJsZWQ6IGVuYWJsZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuZXhwb3J0IHsgRW11bGF0aW9uTWFuYWdlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RW11bGF0aW9uTWFuYWdlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbmltcG9ydCB7IENEUFNlc3Npb25FdmVudCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4uL2NvbW1vbi9MYXp5QXJnLmpzJztcbmltcG9ydCB7IHNjcmlwdEluamVjdG9yIH0gZnJvbSAnLi4vY29tbW9uL1NjcmlwdEluamVjdG9yLmpzJztcbmltcG9ydCB7IFB1cHBldGVlclVSTCwgU09VUkNFX1VSTF9SRUdFWCwgZGVidWdFcnJvciwgZ2V0U291cmNlUHVwcGV0ZWVyVVJMSWZBdmFpbGFibGUsIGdldFNvdXJjZVVybENvbW1lbnQsIGlzU3RyaW5nLCB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IEFzeW5jSXRlcmFibGVVdGlsIH0gZnJvbSAnLi4vdXRpbC9Bc3luY0l0ZXJhYmxlVXRpbC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2ssIGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5RnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL0Z1bmN0aW9uLmpzJztcbmltcG9ydCB7IE11dGV4IH0gZnJvbSAnLi4vdXRpbC9NdXRleC5qcyc7XG5pbXBvcnQgeyBBUklBUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9BcmlhUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IEJpbmRpbmcgfSBmcm9tICcuL0JpbmRpbmcuanMnO1xuaW1wb3J0IHsgQ2RwRWxlbWVudEhhbmRsZSB9IGZyb20gJy4vRWxlbWVudEhhbmRsZS5qcyc7XG5pbXBvcnQgeyBDZHBKU0hhbmRsZSB9IGZyb20gJy4vSlNIYW5kbGUuanMnO1xuaW1wb3J0IHsgYWRkUGFnZUJpbmRpbmcsIENEUF9CSU5ESU5HX1BSRUZJWCwgY3JlYXRlRXZhbHVhdGlvbkVycm9yLCB2YWx1ZUZyb21SZW1vdGVPYmplY3QsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5jb25zdCBhcmlhUXVlcnlTZWxlY3RvckJpbmRpbmcgPSBuZXcgQmluZGluZygnX19hcmlhUXVlcnlTZWxlY3RvcicsIEFSSUFRdWVyeUhhbmRsZXIucXVlcnlPbmUsICcnIC8vIGN1c3RvbSBpbml0XG4pO1xuY29uc3QgYXJpYVF1ZXJ5U2VsZWN0b3JBbGxCaW5kaW5nID0gbmV3IEJpbmRpbmcoJ19fYXJpYVF1ZXJ5U2VsZWN0b3JBbGwnLCAoYXN5bmMgKGVsZW1lbnQsIHNlbGVjdG9yKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IEFSSUFRdWVyeUhhbmRsZXIucXVlcnlBbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICAgIHJldHVybiBhd2FpdCBlbGVtZW50LnJlYWxtLmV2YWx1YXRlSGFuZGxlKCguLi5lbGVtZW50cykgPT4ge1xuICAgICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfSwgLi4uKGF3YWl0IEFzeW5jSXRlcmFibGVVdGlsLmNvbGxlY3QocmVzdWx0cykpKTtcbn0pLCAnJyAvLyBjdXN0b20gaW5pdFxuKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICAjY2xpZW50O1xuICAgICN3b3JsZDtcbiAgICAjaWQ7XG4gICAgI25hbWU7XG4gICAgI2Rpc3Bvc2FibGVzID0gbmV3IERpc3Bvc2FibGVTdGFjaygpO1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCwgY29udGV4dFBheWxvYWQsIHdvcmxkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICAgICAgdGhpcy4jd29ybGQgPSB3b3JsZDtcbiAgICAgICAgdGhpcy4jaWQgPSBjb250ZXh0UGF5bG9hZC5pZDtcbiAgICAgICAgaWYgKGNvbnRleHRQYXlsb2FkLm5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuI25hbWUgPSBjb250ZXh0UGF5bG9hZC5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsaWVudEVtaXR0ZXIgPSB0aGlzLiNkaXNwb3NhYmxlcy51c2UobmV3IEV2ZW50RW1pdHRlcih0aGlzLiNjbGllbnQpKTtcbiAgICAgICAgY2xpZW50RW1pdHRlci5vbignUnVudGltZS5iaW5kaW5nQ2FsbGVkJywgdGhpcy4jb25CaW5kaW5nQ2FsbGVkLmJpbmQodGhpcykpO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHREZXN0cm95ZWQnLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5leGVjdXRpb25Db250ZXh0SWQgPT09IHRoaXMuI2lkKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tkaXNwb3NlU3ltYm9sXSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY2xpZW50RW1pdHRlci5vbignUnVudGltZS5leGVjdXRpb25Db250ZXh0c0NsZWFyZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjbGllbnRFbWl0dGVyLm9uKCdSdW50aW1lLmNvbnNvbGVBUElDYWxsZWQnLCB0aGlzLiNvbkNvbnNvbGVBUEkuYmluZCh0aGlzKSk7XG4gICAgICAgIGNsaWVudEVtaXR0ZXIub24oQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpc1tkaXNwb3NlU3ltYm9sXSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ29udGFpbnMgbWFwcGluZyBmcm9tIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBib3VuZCB0byBQdXBwZXRlZXIgZnVuY3Rpb25zLlxuICAgICNiaW5kaW5ncyA9IG5ldyBNYXAoKTtcbiAgICAvLyBJZiBtdWx0aXBsZSB3YWl0Rm9yIGFyZSBzZXQgdXAgYXN5bmNocm9ub3VzbHksIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlXG4gICAgLy8gZmlyc3Qgb25lIHRvIHNldCB1cCB0aGUgYmluZGluZyBpbiB0aGUgcGFnZSBiZWZvcmUgcnVubmluZyB0aGUgb3RoZXJzLlxuICAgICNtdXRleCA9IG5ldyBNdXRleCgpO1xuICAgIGFzeW5jICNhZGRCaW5kaW5nKGJpbmRpbmcpIHtcbiAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jYmluZGluZ3MuaGFzKGJpbmRpbmcubmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBfID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzEsIGF3YWl0IHRoaXMuI211dGV4LmFjcXVpcmUoKSwgZmFsc2UpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnUnVudGltZS5hZGRCaW5kaW5nJywgdGhpcy4jbmFtZVxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IENEUF9CSU5ESU5HX1BSRUZJWCArIGJpbmRpbmcubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHROYW1lOiB0aGlzLiNuYW1lLFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogQ0RQX0JJTkRJTkdfUFJFRklYICsgYmluZGluZy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dElkOiB0aGlzLiNpZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShhZGRQYWdlQmluZGluZywgJ2ludGVybmFsJywgYmluZGluZy5uYW1lLCBDRFBfQklORElOR19QUkVGSVgpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2JpbmRpbmdzLnNldChiaW5kaW5nLm5hbWUsIGJpbmRpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgY291bGQgaGF2ZSB0cmllZCB0byBldmFsdWF0ZSBpbiBhIGNvbnRleHQgd2hpY2ggd2FzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAvLyBkZXN0cm95ZWQuIFRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsIGlmIHRoZSBwYWdlIGlzIG5hdmlnYXRlZCB3aGlsZVxuICAgICAgICAgICAgICAgIC8vIHdlIGFyZSB0cnlpbmcgdG8gYWRkIHRoZSBiaW5kaW5nXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVzdHJveWVkIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFeGVjdXRpb24gY29udGV4dCB3YXMgZGVzdHJveWVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBNaXNzaW5nIGNvbnRleHQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdDYW5ub3QgZmluZCBjb250ZXh0IHdpdGggc3BlY2lmaWVkIGlkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI29uQmluZGluZ0NhbGxlZChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQuZXhlY3V0aW9uQ29udGV4dElkICE9PSB0aGlzLiNpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXlsb2FkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoZXZlbnQucGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgLy8gVGhlIGJpbmRpbmcgd2FzIGVpdGhlciBjYWxsZWQgYnkgc29tZXRoaW5nIGluIHRoZSBwYWdlIG9yIGl0IHdhc1xuICAgICAgICAgICAgLy8gY2FsbGVkIGJlZm9yZSBvdXIgd3JhcHBlciB3YXMgaW5pdGlhbGl6ZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlLCBuYW1lLCBzZXEsIGFyZ3MsIGlzVHJpdmlhbCB9ID0gcGF5bG9hZDtcbiAgICAgICAgaWYgKHR5cGUgIT09ICdpbnRlcm5hbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYmluZGluZ2NhbGxlZCcsIGV2ZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuI2JpbmRpbmdzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdiaW5kaW5nY2FsbGVkJywgZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy4jYmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgICAgICAgICAgYXdhaXQgYmluZGluZz8ucnVuKHRoaXMsIHNlcSwgYXJncywgaXNUcml2aWFsKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaWQ7XG4gICAgfVxuICAgICNvbkNvbnNvbGVBUEkoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmV4ZWN1dGlvbkNvbnRleHRJZCAhPT0gdGhpcy4jaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoJ2NvbnNvbGVhcGljYWxsZWQnLCBldmVudCk7XG4gICAgfVxuICAgICNiaW5kaW5nc0luc3RhbGxlZCA9IGZhbHNlO1xuICAgICNwdXBwZXRlZXJVdGlsO1xuICAgIGdldCBwdXBwZXRlZXJVdGlsKCkge1xuICAgICAgICBsZXQgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICBpZiAoIXRoaXMuI2JpbmRpbmdzSW5zdGFsbGVkKSB7XG4gICAgICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2FkZEJpbmRpbmdXaXRob3V0VGhyb3dpbmcoYXJpYVF1ZXJ5U2VsZWN0b3JCaW5kaW5nKSxcbiAgICAgICAgICAgICAgICB0aGlzLiNhZGRCaW5kaW5nV2l0aG91dFRocm93aW5nKGFyaWFRdWVyeVNlbGVjdG9yQWxsQmluZGluZyksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHRoaXMuI2JpbmRpbmdzSW5zdGFsbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBzY3JpcHRJbmplY3Rvci5pbmplY3Qoc2NyaXB0ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNwdXBwZXRlZXJVdGlsKSB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLiNwdXBwZXRlZXJVdGlsLnRoZW4oaGFuZGxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdm9pZCBoYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jcHVwcGV0ZWVyVXRpbCA9IHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZhbHVhdGVIYW5kbGUoc2NyaXB0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCAhdGhpcy4jcHVwcGV0ZWVyVXRpbCk7XG4gICAgICAgIHJldHVybiB0aGlzLiNwdXBwZXRlZXJVdGlsO1xuICAgIH1cbiAgICBhc3luYyAjYWRkQmluZGluZ1dpdGhvdXRUaHJvd2luZyhiaW5kaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNhZGRCaW5kaW5nKGJpbmRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBiaW5kaW5nIGNhbm5vdCBiZSBhZGRlZCwgdGhlbiBlaXRoZXIgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0XG4gICAgICAgICAgICAvLyBiaW5kaW5ncyAoZS5nLiBGaXJlZm94KSBvciB0aGUgY29udGV4dCBpcyBicm9rZW4uIEVpdGhlciBicmVha2FnZSBpc1xuICAgICAgICAgICAgLy8gb2theSwgc28gd2UgaWdub3JlIHRoZSBlcnJvci5cbiAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IGF3YWl0IHBhZ2UubWFpbkZyYW1lKCkuZXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGUoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKDggKiA3KSkqIDtcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBwcmludHMgXCI1NlwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIEEgc3RyaW5nIGNhbiBhbHNvIGJlIHBhc3NlZCBpbiBpbnN0ZWFkIG9mIGEgZnVuY3Rpb246XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnNvbGUubG9nKGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGUoJzEgKyAyJykpOyAvLyBwcmludHMgXCIzXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogSGFuZGxlcyBjYW4gYWxzbyBiZSBwYXNzZWQgYXMgYGFyZ3NgLiBUaGV5IHJlc29sdmUgdG8gdGhlaXIgcmVmZXJlbmNlZCBvYmplY3Q6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IG9uZUhhbmRsZSA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuZXZhbHVhdGVIYW5kbGUoKCkgPT4gMSk7XG4gICAgICogY29uc3QgdHdvSGFuZGxlID0gYXdhaXQgZXhlY3V0aW9uQ29udGV4dC5ldmFsdWF0ZUhhbmRsZSgoKSA9PiAyKTtcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRpb25Db250ZXh0LmV2YWx1YXRlKFxuICAgICAqICAgKGEsIGIpID0+IGEgKyBiLFxuICAgICAqICAgb25lSGFuZGxlLFxuICAgICAqICAgdHdvSGFuZGxlXG4gICAgICogKTtcbiAgICAgKiBhd2FpdCBvbmVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAqIGF3YWl0IHR3b0hhbmRsZS5kaXNwb3NlKCk7XG4gICAgICogY29uc29sZS5sb2cocmVzdWx0KTsgLy8gcHJpbnRzICczJy5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYWdlRnVuY3Rpb24gLSBUaGUgZnVuY3Rpb24gdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIGludG8gdGhlIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZnVuY3Rpb24uIElmIHRoZSByZXN1bHQgaXMgYW4gb2JqZWN0LFxuICAgICAqIGEgdmFuaWxsYSBvYmplY3QgY29udGFpbmluZyB0aGUgc2VyaWFsaXphYmxlIHByb3BlcnRpZXMgb2YgdGhlIHJlc3VsdCBpc1xuICAgICAqIHJldHVybmVkLlxuICAgICAqL1xuICAgIGFzeW5jIGV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZXZhbHVhdGUodHJ1ZSwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZhbHVhdGVzIHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIFVubGlrZSB7QGxpbmsgRXhlY3V0aW9uQ29udGV4dC5ldmFsdWF0ZSB8IGV2YWx1YXRlfSwgdGhpcyBtZXRob2QgcmV0dXJucyBhXG4gICAgICogaGFuZGxlIHRvIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGJldHRlciBzdWl0ZWQgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgc2VyaWFsaXplZCAoZS5nLlxuICAgICAqIGBNYXBgKSBhbmQgcmVxdWlyZXMgZnVydGhlciBtYW5pcHVsYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBjb250ZXh0ID0gYXdhaXQgcGFnZS5tYWluRnJhbWUoKS5leGVjdXRpb25Db250ZXh0KCk7XG4gICAgICogY29uc3QgaGFuZGxlOiBKU0hhbmRsZTx0eXBlb2YgZ2xvYmFsVGhpcz4gPSBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKFxuICAgICAqICAgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHNlbGYpXG4gICAgICogKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogQSBzdHJpbmcgY2FuIGFsc28gYmUgcGFzc2VkIGluIGluc3RlYWQgb2YgYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgaGFuZGxlOiBKU0hhbmRsZTxudW1iZXI+ID0gYXdhaXQgY29udGV4dC5ldmFsdWF0ZUhhbmRsZSgnMSArIDInKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogSGFuZGxlcyBjYW4gYWxzbyBiZSBwYXNzZWQgYXMgYGFyZ3NgLiBUaGV5IHJlc29sdmUgdG8gdGhlaXIgcmVmZXJlbmNlZCBvYmplY3Q6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGJvZHlIYW5kbGU6IEVsZW1lbnRIYW5kbGU8SFRNTEJvZHlFbGVtZW50PiA9XG4gICAgICogICBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKCgpID0+IHtcbiAgICAgKiAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG4gICAgICogICB9KTtcbiAgICAgKiBjb25zdCBzdHJpbmdIYW5kbGU6IEpTSGFuZGxlPHN0cmluZz4gPSBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKFxuICAgICAqICAgYm9keSA9PiBib2R5LmlubmVySFRNTCxcbiAgICAgKiAgIGJvZHlcbiAgICAgKiApO1xuICAgICAqIGNvbnNvbGUubG9nKGF3YWl0IHN0cmluZ0hhbmRsZS5qc29uVmFsdWUoKSk7IC8vIHByaW50cyBib2R5J3MgaW5uZXJIVE1MXG4gICAgICogLy8gQWx3YXlzIGRpc3Bvc2UgeW91ciBnYXJiYWdlISA6KVxuICAgICAqIGF3YWl0IGJvZHlIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAqIGF3YWl0IHN0cmluZ0hhbmRsZS5kaXNwb3NlKCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFnZUZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyBpbnRvIHRoZSBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIHtAbGluayBKU0hhbmRsZSB8IGhhbmRsZX0gdG8gdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZVxuICAgICAqIGZ1bmN0aW9uLiBJZiB0aGUgcmVzdWx0IGlzIGEgYE5vZGVgLCB0aGVuIHRoaXMgd2lsbCByZXR1cm4gYW5cbiAgICAgKiB7QGxpbmsgRWxlbWVudEhhbmRsZSB8IGVsZW1lbnQgaGFuZGxlfS5cbiAgICAgKi9cbiAgICBhc3luYyBldmFsdWF0ZUhhbmRsZShwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2V2YWx1YXRlKGZhbHNlLCBwYWdlRnVuY3Rpb24sIC4uLmFyZ3MpO1xuICAgIH1cbiAgICBhc3luYyAjZXZhbHVhdGUocmV0dXJuQnlWYWx1ZSwgcGFnZUZ1bmN0aW9uLCAuLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVVybENvbW1lbnQgPSBnZXRTb3VyY2VVcmxDb21tZW50KGdldFNvdXJjZVB1cHBldGVlclVSTElmQXZhaWxhYmxlKHBhZ2VGdW5jdGlvbik/LnRvU3RyaW5nKCkgPz9cbiAgICAgICAgICAgIFB1cHBldGVlclVSTC5JTlRFUk5BTF9VUkwpO1xuICAgICAgICBpZiAoaXNTdHJpbmcocGFnZUZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dElkID0gdGhpcy4jaWQ7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uID0gcGFnZUZ1bmN0aW9uO1xuICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbldpdGhTb3VyY2VVcmwgPSBTT1VSQ0VfVVJMX1JFR0VYLnRlc3QoZXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICA/IGV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICA6IGAke2V4cHJlc3Npb259XFxuJHtzb3VyY2VVcmxDb21tZW50fVxcbmA7XG4gICAgICAgICAgICBjb25zdCB7IGV4Y2VwdGlvbkRldGFpbHMsIHJlc3VsdDogcmVtb3RlT2JqZWN0IH0gPSBhd2FpdCB0aGlzLiNjbGllbnRcbiAgICAgICAgICAgICAgICAuc2VuZCgnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uV2l0aFNvdXJjZVVybCxcbiAgICAgICAgICAgICAgICBjb250ZXh0SWQsXG4gICAgICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZSxcbiAgICAgICAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgICAgICAgdXNlckdlc3R1cmU6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZXdyaXRlRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbkRldGFpbHMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVFdmFsdWF0aW9uRXJyb3IoZXhjZXB0aW9uRGV0YWlscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuQnlWYWx1ZVxuICAgICAgICAgICAgICAgID8gdmFsdWVGcm9tUmVtb3RlT2JqZWN0KHJlbW90ZU9iamVjdClcbiAgICAgICAgICAgICAgICA6IHRoaXMuI3dvcmxkLmNyZWF0ZUNkcEhhbmRsZShyZW1vdGVPYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uRGVjbGFyYXRpb24gPSBzdHJpbmdpZnlGdW5jdGlvbihwYWdlRnVuY3Rpb24pO1xuICAgICAgICBjb25zdCBmdW5jdGlvbkRlY2xhcmF0aW9uV2l0aFNvdXJjZVVybCA9IFNPVVJDRV9VUkxfUkVHRVgudGVzdChmdW5jdGlvbkRlY2xhcmF0aW9uKVxuICAgICAgICAgICAgPyBmdW5jdGlvbkRlY2xhcmF0aW9uXG4gICAgICAgICAgICA6IGAke2Z1bmN0aW9uRGVjbGFyYXRpb259XFxuJHtzb3VyY2VVcmxDb21tZW50fVxcbmA7XG4gICAgICAgIGxldCBjYWxsRnVuY3Rpb25PblByb21pc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjYWxsRnVuY3Rpb25PblByb21pc2UgPSB0aGlzLiNjbGllbnQuc2VuZCgnUnVudGltZS5jYWxsRnVuY3Rpb25PbicsIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbkRlY2xhcmF0aW9uOiBmdW5jdGlvbkRlY2xhcmF0aW9uV2l0aFNvdXJjZVVybCxcbiAgICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0SWQ6IHRoaXMuI2lkLFxuICAgICAgICAgICAgICAgIGFyZ3VtZW50czogYXJncy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBQcm9taXNlLmFsbChhcmdzLm1hcChjb252ZXJ0QXJndW1lbnQuYmluZCh0aGlzKSkpXG4gICAgICAgICAgICAgICAgICAgIDogW10sXG4gICAgICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZSxcbiAgICAgICAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgICAgICAgdXNlckdlc3R1cmU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJlxuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTicpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSArPSAnIFJlY3Vyc2l2ZSBvYmplY3RzIGFyZSBub3QgYWxsb3dlZC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBleGNlcHRpb25EZXRhaWxzLCByZXN1bHQ6IHJlbW90ZU9iamVjdCB9ID0gYXdhaXQgY2FsbEZ1bmN0aW9uT25Qcm9taXNlLmNhdGNoKHJld3JpdGVFcnJvcik7XG4gICAgICAgIGlmIChleGNlcHRpb25EZXRhaWxzKSB7XG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVFdmFsdWF0aW9uRXJyb3IoZXhjZXB0aW9uRGV0YWlscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldHVybkJ5VmFsdWVcbiAgICAgICAgICAgID8gdmFsdWVGcm9tUmVtb3RlT2JqZWN0KHJlbW90ZU9iamVjdClcbiAgICAgICAgICAgIDogdGhpcy4jd29ybGQuY3JlYXRlQ2RwSGFuZGxlKHJlbW90ZU9iamVjdCk7XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRBcmd1bWVudChhcmcpIHtcbiAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBMYXp5QXJnKSB7XG4gICAgICAgICAgICAgICAgYXJnID0gYXdhaXQgYXJnLmdldCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdmFsaWQtdHlwZW9mXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdW5zZXJpYWxpemFibGVWYWx1ZTogYCR7YXJnLnRvU3RyaW5nKCl9bmAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChPYmplY3QuaXMoYXJnLCAtMCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB1bnNlcmlhbGl6YWJsZVZhbHVlOiAnLTAnIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmlzKGFyZywgSW5maW5pdHkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdW5zZXJpYWxpemFibGVWYWx1ZTogJ0luZmluaXR5JyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE9iamVjdC5pcyhhcmcsIC1JbmZpbml0eSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB1bnNlcmlhbGl6YWJsZVZhbHVlOiAnLUluZmluaXR5JyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE9iamVjdC5pcyhhcmcsIE5hTikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB1bnNlcmlhbGl6YWJsZVZhbHVlOiAnTmFOJyB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SGFuZGxlID0gYXJnICYmIChhcmcgaW5zdGFuY2VvZiBDZHBKU0hhbmRsZSB8fCBhcmcgaW5zdGFuY2VvZiBDZHBFbGVtZW50SGFuZGxlKVxuICAgICAgICAgICAgICAgID8gYXJnXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgaWYgKG9iamVjdEhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGlmIChvYmplY3RIYW5kbGUucmVhbG0gIT09IHRoaXMuI3dvcmxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSlNIYW5kbGVzIGNhbiBiZSBldmFsdWF0ZWQgb25seSBpbiB0aGUgY29udGV4dCB0aGV5IHdlcmUgY3JlYXRlZCEnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdEhhbmRsZS5kaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0pTSGFuZGxlIGlzIGRpc3Bvc2VkIScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0SGFuZGxlLnJlbW90ZU9iamVjdCgpLnVuc2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2VyaWFsaXphYmxlVmFsdWU6IG9iamVjdEhhbmRsZS5yZW1vdGVPYmplY3QoKS51bnNlcmlhbGl6YWJsZVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIW9iamVjdEhhbmRsZS5yZW1vdGVPYmplY3QoKS5vYmplY3RJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogb2JqZWN0SGFuZGxlLnJlbW90ZU9iamVjdCgpLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IG9iamVjdElkOiBvYmplY3RIYW5kbGUucmVtb3RlT2JqZWN0KCkub2JqZWN0SWQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBhcmcgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2FibGVzLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5lbWl0KCdkaXNwb3NlZCcsIHVuZGVmaW5lZCk7XG4gICAgfVxufVxuY29uc3QgcmV3cml0ZUVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ09iamVjdCByZWZlcmVuY2UgY2hhaW4gaXMgdG9vIGxvbmcnKSkge1xuICAgICAgICByZXR1cm4geyByZXN1bHQ6IHsgdHlwZTogJ3VuZGVmaW5lZCcgfSB9O1xuICAgIH1cbiAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIk9iamVjdCBjb3VsZG4ndCBiZSByZXR1cm5lZCBieSB2YWx1ZVwiKSkge1xuICAgICAgICByZXR1cm4geyByZXN1bHQ6IHsgdHlwZTogJ3VuZGVmaW5lZCcgfSB9O1xuICAgIH1cbiAgICBpZiAoZXJyb3IubWVzc2FnZS5lbmRzV2l0aCgnQ2Fubm90IGZpbmQgY29udGV4dCB3aXRoIHNwZWNpZmllZCBpZCcpIHx8XG4gICAgICAgIGVycm9yLm1lc3NhZ2UuZW5kc1dpdGgoJ0luc3BlY3RlZCB0YXJnZXQgbmF2aWdhdGVkIG9yIGNsb3NlZCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhlY3V0aW9uIGNvbnRleHQgd2FzIGRlc3Ryb3llZCwgbW9zdCBsaWtlbHkgYmVjYXVzZSBvZiBhIG5hdmlnYXRpb24uJyk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUV4ZWN1dGlvbkNvbnRleHQuanMubWFwIiwiY29uc3QgdGFiVGFyZ2V0SW5mbyA9IHtcbiAgICB0YXJnZXRJZDogJ3RhYlRhcmdldElkJyxcbiAgICB0eXBlOiAndGFiJyxcbiAgICB0aXRsZTogJ3RhYicsXG4gICAgdXJsOiAnYWJvdXQ6YmxhbmsnLFxuICAgIGF0dGFjaGVkOiBmYWxzZSxcbiAgICBjYW5BY2Nlc3NPcGVuZXI6IGZhbHNlLFxufTtcbmNvbnN0IHBhZ2VUYXJnZXRJbmZvID0ge1xuICAgIHRhcmdldElkOiAncGFnZVRhcmdldElkJyxcbiAgICB0eXBlOiAncGFnZScsXG4gICAgdGl0bGU6ICdwYWdlJyxcbiAgICB1cmw6ICdhYm91dDpibGFuaycsXG4gICAgYXR0YWNoZWQ6IGZhbHNlLFxuICAgIGNhbkFjY2Vzc09wZW5lcjogZmFsc2UsXG59O1xuLyoqXG4gKiBFeHBlcmltZW50YWwgRXh0ZW5zaW9uVHJhbnNwb3J0IGFsbG93cyBlc3RhYmxpc2hpbmcgYSBjb25uZWN0aW9uIHZpYVxuICogY2hyb21lLmRlYnVnZ2VyIEFQSSBpZiBQdXBwZXRlZXIgcnVucyBpbiBhbiBleHRlbnNpb24uIFNpbmNlIENocm9tZVxuICogRGV2VG9vbHMgUHJvdG9jb2wgaXMgcmVzdHJpY3RlZCBmb3IgZXh0ZW5zaW9ucywgdGhlIHRyYW5zcG9ydFxuICogaW1wbGVtZW50cyBtaXNzaW5nIGNvbW1hbmRzIGFuZCBldmVudHMuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uVHJhbnNwb3J0IHtcbiAgICBzdGF0aWMgYXN5bmMgY29ubmVjdFRhYih0YWJJZCkge1xuICAgICAgICBhd2FpdCBjaHJvbWUuZGVidWdnZXIuYXR0YWNoKHsgdGFiSWQgfSwgJzEuMycpO1xuICAgICAgICByZXR1cm4gbmV3IEV4dGVuc2lvblRyYW5zcG9ydCh0YWJJZCk7XG4gICAgfVxuICAgIG9ubWVzc2FnZTtcbiAgICBvbmNsb3NlO1xuICAgICN0YWJJZDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0YWJJZCkge1xuICAgICAgICB0aGlzLiN0YWJJZCA9IHRhYklkO1xuICAgICAgICBjaHJvbWUuZGVidWdnZXIub25FdmVudC5hZGRMaXN0ZW5lcih0aGlzLiNkZWJ1Z2dlckV2ZW50SGFuZGxlcik7XG4gICAgfVxuICAgICNkZWJ1Z2dlckV2ZW50SGFuZGxlciA9IChzb3VyY2UsIG1ldGhvZCwgcGFyYW1zKSA9PiB7XG4gICAgICAgIGlmIChzb3VyY2UudGFiSWQgIT09IHRoaXMuI3RhYklkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHNlc3Npb25JZCBpcyBub3QgaW4gc3RhYmxlIHlldC5cbiAgICAgICAgICAgIHNlc3Npb25JZDogc291cmNlLnNlc3Npb25JZCA/PyAncGFnZVRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgICNkaXNwYXRjaFJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5vbm1lc3NhZ2U/LihKU09OLnN0cmluZ2lmeShtZXNzYWdlKSk7XG4gICAgfVxuICAgIHNlbmQobWVzc2FnZSkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgICAgICBzd2l0Y2ggKHBhcnNlZC5tZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Jyb3dzZXIuZ2V0VmVyc2lvbic6IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBhcnNlZC5pZCxcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXJzZWQuc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcnNlZC5tZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xWZXJzaW9uOiAnMS4zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Q6ICdjaHJvbWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb246ICd1bmtub3duJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJBZ2VudDogJ2Nocm9tZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBqc1ZlcnNpb246ICd1bmtub3duJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdUYXJnZXQuZ2V0QnJvd3NlckNvbnRleHRzJzoge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3BhdGNoUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgICAgICBpZDogcGFyc2VkLmlkLFxuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHBhcnNlZC5zZXNzaW9uSWQsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogcGFyc2VkLm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyQ29udGV4dElkczogW10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnVGFyZ2V0LnNldERpc2NvdmVyVGFyZ2V0cyc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEluZm86IHRhYlRhcmdldEluZm8sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1RhcmdldC50YXJnZXRDcmVhdGVkJyxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbmZvOiBwYWdlVGFyZ2V0SW5mbyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHBhcnNlZC5pZCxcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXJzZWQuc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcnNlZC5tZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge30sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnVGFyZ2V0LnNldEF1dG9BdHRhY2gnOiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5zZXNzaW9uSWQgPT09ICd0YWJUYXJnZXRTZXNzaW9uSWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3BhdGNoUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnVGFyZ2V0LmF0dGFjaGVkVG9UYXJnZXQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SW5mbzogcGFnZVRhcmdldEluZm8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiAncGFnZVRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXBhcnNlZC5zZXNzaW9uSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdUYXJnZXQuYXR0YWNoZWRUb1RhcmdldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbmZvOiB0YWJUYXJnZXRJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDogJ3RhYlRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jZGlzcGF0Y2hSZXNwb25zZSh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBwYXJzZWQuaWQsXG4gICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDogcGFyc2VkLnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBwYXJzZWQubWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHt9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLnNlc3Npb25JZCA9PT0gJ3BhZ2VUYXJnZXRTZXNzaW9uSWQnKSB7XG4gICAgICAgICAgICBkZWxldGUgcGFyc2VkLnNlc3Npb25JZDtcbiAgICAgICAgfVxuICAgICAgICBjaHJvbWUuZGVidWdnZXJcbiAgICAgICAgICAgIC5zZW5kQ29tbWFuZChcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzZXNzaW9uSWQgaXMgbm90IGluIHN0YWJsZSB5ZXQuXG4gICAgICAgIHsgdGFiSWQ6IHRoaXMuI3RhYklkLCBzZXNzaW9uSWQ6IHBhcnNlZC5zZXNzaW9uSWQgfSwgcGFyc2VkLm1ldGhvZCwgcGFyc2VkLnBhcmFtcylcbiAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3BhdGNoUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICAgIGlkOiBwYXJzZWQuaWQsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwYXJzZWQuc2Vzc2lvbklkID8/ICdwYWdlVGFyZ2V0U2Vzc2lvbklkJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHBhcnNlZC5tZXRob2QsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiByZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLiNkaXNwYXRjaFJlc3BvbnNlKHtcbiAgICAgICAgICAgICAgICBpZDogcGFyc2VkLmlkLFxuICAgICAgICAgICAgICAgIHNlc3Npb25JZDogcGFyc2VkLnNlc3Npb25JZCA/PyAncGFnZVRhcmdldFNlc3Npb25JZCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBwYXJzZWQubWV0aG9kLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICBjaHJvbWUuZGVidWdnZXIub25FdmVudC5yZW1vdmVMaXN0ZW5lcih0aGlzLiNkZWJ1Z2dlckV2ZW50SGFuZGxlcik7XG4gICAgICAgIHZvaWQgY2hyb21lLmRlYnVnZ2VyLmRldGFjaCh7IHRhYklkOiB0aGlzLiN0YWJJZCB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FeHRlbnNpb25UcmFuc3BvcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IENEUFNlc3Npb25FdmVudCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbi8qKlxuICogRmlyZWZveFRhcmdldE1hbmFnZXIgaW1wbGVtZW50cyB0YXJnZXQgbWFuYWdlbWVudCB1c2luZ1xuICogYFRhcmdldC5zZXREaXNjb3ZlclRhcmdldHNgIHdpdGhvdXQgdXNpbmcgYXV0by1hdHRhY2guIEl0LCB0aGVyZWZvcmUsIGNyZWF0ZXNcbiAqIHRhcmdldHMgdGhhdCBsYXppbHkgZXN0YWJsaXNoIHRoZWlyIENEUCBzZXNzaW9ucy5cbiAqXG4gKiBBbHRob3VnaCB0aGUgYXBwcm9hY2ggaXMgcG90ZW50aWFsbHkgZmxha3ksIHRoZXJlIGlzIG5vIG90aGVyIHdheSBmb3IgRmlyZWZveFxuICogYmVjYXVzZSBGaXJlZm94J3MgQ0RQIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgYXV0by1hdHRhY2guXG4gKlxuICogRmlyZWZveCBkb2VzIG5vdCBzdXBwb3J0IHRhcmdldEluZm9DaGFuZ2VkIGFuZCBkZXRhY2hlZEZyb21UYXJnZXQgZXZlbnRzOlxuICpcbiAqIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYxMDg1NVxuICogLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjM2OTc5XG4gKiAgIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRmlyZWZveFRhcmdldE1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNjb25uZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzOiAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnLFxuICAgICAqICdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJy5cbiAgICAgKlxuICAgICAqIEEgdGFyZ2V0IGJlY29tZXMgZGlzY292ZXJlZCB3aGVuICdUYXJnZXQudGFyZ2V0Q3JlYXRlZCcgaXMgcmVjZWl2ZWQuXG4gICAgICogQSB0YXJnZXQgaXMgcmVtb3ZlZCBmcm9tIHRoaXMgbWFwIG9uY2UgJ1RhcmdldC50YXJnZXREZXN0cm95ZWQnIGlzXG4gICAgICogcmVjZWl2ZWQuXG4gICAgICpcbiAgICAgKiBgdGFyZ2V0RmlsdGVyQ2FsbGJhY2tgIGhhcyBubyBlZmZlY3Qgb24gdGhpcyBtYXAuXG4gICAgICovXG4gICAgI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZCA9IG5ldyBNYXAoKTtcbiAgICAvKipcbiAgICAgKiBLZWVwcyB0cmFjayBvZiB0YXJnZXRzIHRoYXQgd2VyZSBjcmVhdGVkIHZpYSAnVGFyZ2V0LnRhcmdldENyZWF0ZWQnXG4gICAgICogYW5kIHdoaWNoIG9uZSBhcmUgbm90IGZpbHRlcmVkIG91dCBieSBgdGFyZ2V0RmlsdGVyQ2FsbGJhY2tgLlxuICAgICAqXG4gICAgICogVGhlIHRhcmdldCBpcyByZW1vdmVkIGZyb20gaGVyZSBvbmNlIGl0J3MgYmVlbiBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkID0gbmV3IE1hcCgpO1xuICAgIC8qKlxuICAgICAqIFRyYWNrcyB3aGljaCBzZXNzaW9ucyBhdHRhY2ggdG8gd2hpY2ggdGFyZ2V0LlxuICAgICAqL1xuICAgICNhdmFpbGFibGVUYXJnZXRzQnlTZXNzaW9uSWQgPSBuZXcgTWFwKCk7XG4gICAgI3RhcmdldEZpbHRlckNhbGxiYWNrO1xuICAgICN0YXJnZXRGYWN0b3J5O1xuICAgICNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uID0gbmV3IFdlYWtNYXAoKTtcbiAgICAjaW5pdGlhbGl6ZURlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgI3RhcmdldHNJZHNGb3JJbml0ID0gbmV3IFNldCgpO1xuICAgIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb24sIHRhcmdldEZhY3RvcnksIHRhcmdldEZpbHRlckNhbGxiYWNrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuICAgICAgICB0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayA9IHRhcmdldEZpbHRlckNhbGxiYWNrO1xuICAgICAgICB0aGlzLiN0YXJnZXRGYWN0b3J5ID0gdGFyZ2V0RmFjdG9yeTtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbi5vbignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKCdUYXJnZXQudGFyZ2V0RGVzdHJveWVkJywgdGhpcy4jb25UYXJnZXREZXN0cm95ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9uKENEUFNlc3Npb25FdmVudC5TZXNzaW9uRGV0YWNoZWQsIHRoaXMuI29uU2Vzc2lvbkRldGFjaGVkKTtcbiAgICAgICAgdGhpcy5zZXR1cEF0dGFjaG1lbnRMaXN0ZW5lcnModGhpcy4jY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHNldHVwQXR0YWNobWVudExpc3RlbmVycyhzZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KHNlc3Npb24sIGV2ZW50KTtcbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSk7XG4gICAgICAgIHRoaXMuI2F0dGFjaGVkVG9UYXJnZXRMaXN0ZW5lcnNCeVNlc3Npb24uc2V0KHNlc3Npb24sIGxpc3RlbmVyKTtcbiAgICAgICAgc2Vzc2lvbi5vbignVGFyZ2V0LmF0dGFjaGVkVG9UYXJnZXQnLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgICNvblNlc3Npb25EZXRhY2hlZCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlU2Vzc2lvbkxpc3RlbmVycyhzZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jYXZhaWxhYmxlVGFyZ2V0c0J5U2Vzc2lvbklkLmRlbGV0ZShzZXNzaW9uLmlkKCkpO1xuICAgIH07XG4gICAgcmVtb3ZlU2Vzc2lvbkxpc3RlbmVycyhzZXNzaW9uKSB7XG4gICAgICAgIGlmICh0aGlzLiNhdHRhY2hlZFRvVGFyZ2V0TGlzdGVuZXJzQnlTZXNzaW9uLmhhcyhzZXNzaW9uKSkge1xuICAgICAgICAgICAgc2Vzc2lvbi5vZmYoJ1RhcmdldC5hdHRhY2hlZFRvVGFyZ2V0JywgdGhpcy4jYXR0YWNoZWRUb1RhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5nZXQoc2Vzc2lvbikpO1xuICAgICAgICAgICAgdGhpcy4jYXR0YWNoZWRUb1RhcmdldExpc3RlbmVyc0J5U2Vzc2lvbi5kZWxldGUoc2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0QXZhaWxhYmxlVGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkO1xuICAgIH1cbiAgICBnZXRDaGlsZFRhcmdldHMoX3RhcmdldCkge1xuICAgICAgICByZXR1cm4gbmV3IFNldCgpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldENyZWF0ZWQnLCB0aGlzLiNvblRhcmdldENyZWF0ZWQpO1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uLm9mZignVGFyZ2V0LnRhcmdldERlc3Ryb3llZCcsIHRoaXMuI29uVGFyZ2V0RGVzdHJveWVkKTtcbiAgICB9XG4gICAgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY29ubmVjdGlvbi5zZW5kKCdUYXJnZXQuc2V0RGlzY292ZXJUYXJnZXRzJywge1xuICAgICAgICAgICAgZGlzY292ZXI6IHRydWUsXG4gICAgICAgICAgICBmaWx0ZXI6IFt7fV0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdCA9IG5ldyBTZXQodGhpcy4jZGlzY292ZXJlZFRhcmdldHNCeVRhcmdldElkLmtleXMoKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2luaXRpYWxpemVEZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgI29uVGFyZ2V0Q3JlYXRlZCA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy4jZGlzY292ZXJlZFRhcmdldHNCeVRhcmdldElkLmhhcyhldmVudC50YXJnZXRJbmZvLnRhcmdldElkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2Rpc2NvdmVyZWRUYXJnZXRzQnlUYXJnZXRJZC5zZXQoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCwgZXZlbnQudGFyZ2V0SW5mbyk7XG4gICAgICAgIGlmIChldmVudC50YXJnZXRJbmZvLnR5cGUgPT09ICdicm93c2VyJyAmJiBldmVudC50YXJnZXRJbmZvLmF0dGFjaGVkKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiN0YXJnZXRGYWN0b3J5KGV2ZW50LnRhcmdldEluZm8sIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB0YXJnZXQuX2luaXRpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLnNldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkLCB0YXJnZXQpO1xuICAgICAgICAgICAgdGhpcy4jZmluaXNoSW5pdGlhbGl6YXRpb25JZlJlYWR5KHRhcmdldC5fdGFyZ2V0SWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI3RhcmdldEZhY3RvcnkoZXZlbnQudGFyZ2V0SW5mbywgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHRoaXMuI3RhcmdldEZpbHRlckNhbGxiYWNrICYmICF0aGlzLiN0YXJnZXRGaWx0ZXJDYWxsYmFjayh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkoZXZlbnQudGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0Ll9pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLnNldChldmVudC50YXJnZXRJbmZvLnRhcmdldElkLCB0YXJnZXQpO1xuICAgICAgICB0aGlzLmVtaXQoXCJ0YXJnZXRBdmFpbGFibGVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0QXZhaWxhYmxlICovLCB0YXJnZXQpO1xuICAgICAgICB0aGlzLiNmaW5pc2hJbml0aWFsaXphdGlvbklmUmVhZHkodGFyZ2V0Ll90YXJnZXRJZCk7XG4gICAgfTtcbiAgICAjb25UYXJnZXREZXN0cm95ZWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy4jZGlzY292ZXJlZFRhcmdldHNCeVRhcmdldElkLmRlbGV0ZShldmVudC50YXJnZXRJZCk7XG4gICAgICAgIHRoaXMuI2ZpbmlzaEluaXRpYWxpemF0aW9uSWZSZWFkeShldmVudC50YXJnZXRJZCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLmdldChldmVudC50YXJnZXRJZCk7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInRhcmdldEdvbmVcIiAvKiBUYXJnZXRNYW5hZ2VyRXZlbnQuVGFyZ2V0R29uZSAqLywgdGFyZ2V0KTtcbiAgICAgICAgICAgIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLmRlbGV0ZShldmVudC50YXJnZXRJZCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgICNvbkF0dGFjaGVkVG9UYXJnZXQgPSBhc3luYyAocGFyZW50U2Vzc2lvbiwgZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5mbyA9IGV2ZW50LnRhcmdldEluZm87XG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLiNjb25uZWN0aW9uLnNlc3Npb24oZXZlbnQuc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNlc3Npb24gJHtldmVudC5zZXNzaW9uSWR9IHdhcyBub3QgY3JlYXRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiNhdmFpbGFibGVUYXJnZXRzQnlUYXJnZXRJZC5nZXQodGFyZ2V0SW5mby50YXJnZXRJZCk7XG4gICAgICAgIGFzc2VydCh0YXJnZXQsIGBUYXJnZXQgJHt0YXJnZXRJbmZvLnRhcmdldElkfSBpcyBtaXNzaW5nYCk7XG4gICAgICAgIHNlc3Npb24uX3NldFRhcmdldCh0YXJnZXQpO1xuICAgICAgICB0aGlzLnNldHVwQXR0YWNobWVudExpc3RlbmVycyhzZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jYXZhaWxhYmxlVGFyZ2V0c0J5U2Vzc2lvbklkLnNldChzZXNzaW9uLmlkKCksIHRoaXMuI2F2YWlsYWJsZVRhcmdldHNCeVRhcmdldElkLmdldCh0YXJnZXRJbmZvLnRhcmdldElkKSk7XG4gICAgICAgIHBhcmVudFNlc3Npb24uZW1pdChDRFBTZXNzaW9uRXZlbnQuUmVhZHksIHNlc3Npb24pO1xuICAgIH07XG4gICAgI2ZpbmlzaEluaXRpYWxpemF0aW9uSWZSZWFkeSh0YXJnZXRJZCkge1xuICAgICAgICB0aGlzLiN0YXJnZXRzSWRzRm9ySW5pdC5kZWxldGUodGFyZ2V0SWQpO1xuICAgICAgICBpZiAodGhpcy4jdGFyZ2V0c0lkc0ZvckluaXQuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy4jaW5pdGlhbGl6ZURlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZpcmVmb3hUYXJnZXRNYW5hZ2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG52YXIgX19ydW5Jbml0aWFsaXplcnMgPSAodGhpcyAmJiB0aGlzLl9fcnVuSW5pdGlhbGl6ZXJzKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xudmFyIF9fZXNEZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19lc0RlY29yYXRlKSB8fCBmdW5jdGlvbiAoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICAgIHZhciBfLCBkb25lID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgICBkb25lID0gdHJ1ZTtcbn07XG5pbXBvcnQgeyBGcmFtZSwgRnJhbWVFdmVudCwgdGhyb3dJZkRldGFjaGVkIH0gZnJvbSAnLi4vYXBpL0ZyYW1lLmpzJztcbmltcG9ydCB7IFVuc3VwcG9ydGVkT3BlcmF0aW9uIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG5pbXBvcnQgeyBBY2Nlc3NpYmlsaXR5IH0gZnJvbSAnLi9BY2Nlc3NpYmlsaXR5LmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlckV2ZW50IH0gZnJvbSAnLi9GcmFtZU1hbmFnZXJFdmVudHMuanMnO1xuaW1wb3J0IHsgSXNvbGF0ZWRXb3JsZCB9IGZyb20gJy4vSXNvbGF0ZWRXb3JsZC5qcyc7XG5pbXBvcnQgeyBNQUlOX1dPUkxELCBQVVBQRVRFRVJfV09STEQgfSBmcm9tICcuL0lzb2xhdGVkV29ybGRzLmpzJztcbmltcG9ydCB7IExpZmVjeWNsZVdhdGNoZXIsIH0gZnJvbSAnLi9MaWZlY3ljbGVXYXRjaGVyLmpzJztcbmltcG9ydCB7IENEUF9CSU5ESU5HX1BSRUZJWCB9IGZyb20gJy4vdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xubGV0IENkcEZyYW1lID0gKCgpID0+IHtcbiAgICBsZXQgX2NsYXNzU3VwZXIgPSBGcmFtZTtcbiAgICBsZXQgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMgPSBbXTtcbiAgICBsZXQgX2dvdG9fZGVjb3JhdG9ycztcbiAgICBsZXQgX3dhaXRGb3JOYXZpZ2F0aW9uX2RlY29yYXRvcnM7XG4gICAgbGV0IF9zZXRDb250ZW50X2RlY29yYXRvcnM7XG4gICAgbGV0IF9hZGRQcmVsb2FkU2NyaXB0X2RlY29yYXRvcnM7XG4gICAgbGV0IF9hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnM7XG4gICAgbGV0IF9yZW1vdmVFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnM7XG4gICAgbGV0IF93YWl0Rm9yRGV2aWNlUHJvbXB0X2RlY29yYXRvcnM7XG4gICAgcmV0dXJuIGNsYXNzIENkcEZyYW1lIGV4dGVuZHMgX2NsYXNzU3VwZXIge1xuICAgICAgICBzdGF0aWMge1xuICAgICAgICAgICAgY29uc3QgX21ldGFkYXRhID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5tZXRhZGF0YSA/IE9iamVjdC5jcmVhdGUoX2NsYXNzU3VwZXJbU3ltYm9sLm1ldGFkYXRhXSA/PyBudWxsKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfZ290b19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiZ290b1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwiZ290b1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLmdvdG8gfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JOYXZpZ2F0aW9uX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJ3YWl0Rm9yTmF2aWdhdGlvblwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwid2FpdEZvck5hdmlnYXRpb25cIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yTmF2aWdhdGlvbiB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfc2V0Q29udGVudF9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwic2V0Q29udGVudFwiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwic2V0Q29udGVudFwiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnNldENvbnRlbnQgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX2FkZFByZWxvYWRTY3JpcHRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcImFkZFByZWxvYWRTY3JpcHRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcImFkZFByZWxvYWRTY3JpcHRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai5hZGRQcmVsb2FkU2NyaXB0IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJhZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJhZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouYWRkRXhwb3NlZEZ1bmN0aW9uQmluZGluZyB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIF9fZXNEZWNvcmF0ZSh0aGlzLCBudWxsLCBfcmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZ19kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwicmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZ1wiLCBzdGF0aWM6IGZhbHNlLCBwcml2YXRlOiBmYWxzZSwgYWNjZXNzOiB7IGhhczogb2JqID0+IFwicmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZ1wiIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLnJlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmcgfSwgbWV0YWRhdGE6IF9tZXRhZGF0YSB9LCBudWxsLCBfaW5zdGFuY2VFeHRyYUluaXRpYWxpemVycyk7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgbnVsbCwgX3dhaXRGb3JEZXZpY2VQcm9tcHRfZGVjb3JhdG9ycywgeyBraW5kOiBcIm1ldGhvZFwiLCBuYW1lOiBcIndhaXRGb3JEZXZpY2VQcm9tcHRcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogZmFsc2UsIGFjY2VzczogeyBoYXM6IG9iaiA9PiBcIndhaXRGb3JEZXZpY2VQcm9tcHRcIiBpbiBvYmosIGdldDogb2JqID0+IG9iai53YWl0Rm9yRGV2aWNlUHJvbXB0IH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgaWYgKF9tZXRhZGF0YSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFN5bWJvbC5tZXRhZGF0YSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogX21ldGFkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgICN1cmwgPSAoX19ydW5Jbml0aWFsaXplcnModGhpcywgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpLCAnJyk7XG4gICAgICAgICNkZXRhY2hlZCA9IGZhbHNlO1xuICAgICAgICAjY2xpZW50O1xuICAgICAgICBfZnJhbWVNYW5hZ2VyO1xuICAgICAgICBfbG9hZGVySWQgPSAnJztcbiAgICAgICAgX2xpZmVjeWNsZUV2ZW50cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgX2lkO1xuICAgICAgICBfcGFyZW50SWQ7XG4gICAgICAgIGFjY2Vzc2liaWxpdHk7XG4gICAgICAgIHdvcmxkcztcbiAgICAgICAgY29uc3RydWN0b3IoZnJhbWVNYW5hZ2VyLCBmcmFtZUlkLCBwYXJlbnRGcmFtZUlkLCBjbGllbnQpIHtcbiAgICAgICAgICAgIHN1cGVyKCk7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZU1hbmFnZXIgPSBmcmFtZU1hbmFnZXI7XG4gICAgICAgICAgICB0aGlzLiN1cmwgPSAnJztcbiAgICAgICAgICAgIHRoaXMuX2lkID0gZnJhbWVJZDtcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudElkID0gcGFyZW50RnJhbWVJZDtcbiAgICAgICAgICAgIHRoaXMuI2RldGFjaGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZXJJZCA9ICcnO1xuICAgICAgICAgICAgdGhpcy53b3JsZHMgPSB7XG4gICAgICAgICAgICAgICAgW01BSU5fV09STERdOiBuZXcgSXNvbGF0ZWRXb3JsZCh0aGlzLCB0aGlzLl9mcmFtZU1hbmFnZXIudGltZW91dFNldHRpbmdzKSxcbiAgICAgICAgICAgICAgICBbUFVQUEVURUVSX1dPUkxEXTogbmV3IElzb2xhdGVkV29ybGQodGhpcywgdGhpcy5fZnJhbWVNYW5hZ2VyLnRpbWVvdXRTZXR0aW5ncyksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5hY2Nlc3NpYmlsaXR5ID0gbmV3IEFjY2Vzc2liaWxpdHkodGhpcy53b3JsZHNbTUFJTl9XT1JMRF0pO1xuICAgICAgICAgICAgdGhpcy5vbihGcmFtZUV2ZW50LkZyYW1lU3dhcHBlZEJ5QWN0aXZhdGlvbiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEVtdWxhdGUgbG9hZGluZyBwcm9jZXNzIGZvciBzd2FwcGVkIGZyYW1lcy5cbiAgICAgICAgICAgICAgICB0aGlzLl9vbkxvYWRpbmdTdGFydGVkKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Mb2FkaW5nU3RvcHBlZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLndvcmxkc1tNQUlOX1dPUkxEXS5lbWl0dGVyLm9uKCdjb25zb2xlYXBpY2FsbGVkJywgdGhpcy4jb25NYWluV29ybGRDb25zb2xlQXBpQ2FsbGVkLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy53b3JsZHNbTUFJTl9XT1JMRF0uZW1pdHRlci5vbignYmluZGluZ2NhbGxlZCcsIHRoaXMuI29uTWFpbldvcmxkQmluZGluZ0NhbGxlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICAjb25NYWluV29ybGRDb25zb2xlQXBpQ2FsbGVkKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZU1hbmFnZXIuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5Db25zb2xlQXBpQ2FsbGVkLCBbXG4gICAgICAgICAgICAgICAgdGhpcy53b3JsZHNbTUFJTl9XT1JMRF0sXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICAjb25NYWluV29ybGRCaW5kaW5nQ2FsbGVkKGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZU1hbmFnZXIuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5CaW5kaW5nQ2FsbGVkLCBbXG4gICAgICAgICAgICAgICAgdGhpcy53b3JsZHNbTUFJTl9XT1JMRF0sXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkgaW4gRGV2VG9vbHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBpbnRlcm5hbFxuICAgICAgICAgKi9cbiAgICAgICAgX2NsaWVudCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZXMgdGhlIGZyYW1lIElEIHdpdGggdGhlIG5ldyBJRC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIG1haW4gZnJhbWUgaXNcbiAgICAgICAgICogcmVwbGFjZWQgYnkgYSBkaWZmZXJlbnQgZnJhbWUuXG4gICAgICAgICAqL1xuICAgICAgICB1cGRhdGVJZChpZCkge1xuICAgICAgICAgICAgdGhpcy5faWQgPSBpZDtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcGFnZSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcmFtZU1hbmFnZXIucGFnZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlzT09QRnJhbWUoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50ICE9PSB0aGlzLl9mcmFtZU1hbmFnZXIuY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGdvdG8odXJsLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcmVmZXJlciA9IHRoaXMuX2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5leHRyYUhUVFBIZWFkZXJzKClbJ3JlZmVyZXInXSwgcmVmZXJyZXJQb2xpY3kgPSB0aGlzLl9mcmFtZU1hbmFnZXIubmV0d29ya01hbmFnZXIuZXh0cmFIVFRQSGVhZGVycygpWydyZWZlcmVyLXBvbGljeSddLCB3YWl0VW50aWwgPSBbJ2xvYWQnXSwgdGltZW91dCA9IHRoaXMuX2ZyYW1lTWFuYWdlci50aW1lb3V0U2V0dGluZ3MubmF2aWdhdGlvblRpbWVvdXQoKSwgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBsZXQgZW5zdXJlTmV3RG9jdW1lbnROYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCB3YXRjaGVyID0gbmV3IExpZmVjeWNsZVdhdGNoZXIodGhpcy5fZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLCB0aGlzLCB3YWl0VW50aWwsIHRpbWVvdXQpO1xuICAgICAgICAgICAgbGV0IGVycm9yID0gYXdhaXQgRGVmZXJyZWQucmFjZShbXG4gICAgICAgICAgICAgICAgbmF2aWdhdGUodGhpcy4jY2xpZW50LCB1cmwsIHJlZmVyZXIsIHJlZmVycmVyUG9saWN5LCB0aGlzLl9pZCksXG4gICAgICAgICAgICAgICAgd2F0Y2hlci50ZXJtaW5hdGlvblByb21pc2UoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9yID0gYXdhaXQgRGVmZXJyZWQucmFjZShbXG4gICAgICAgICAgICAgICAgICAgIHdhdGNoZXIudGVybWluYXRpb25Qcm9taXNlKCksXG4gICAgICAgICAgICAgICAgICAgIGVuc3VyZU5ld0RvY3VtZW50TmF2aWdhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgPyB3YXRjaGVyLm5ld0RvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB3YXRjaGVyLnNhbWVEb2N1bWVudE5hdmlnYXRpb25Qcm9taXNlKCksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHdhdGNoZXIubmF2aWdhdGlvblJlc3BvbnNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB3YXRjaGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRlKGNsaWVudCwgdXJsLCByZWZlcnJlciwgcmVmZXJyZXJQb2xpY3ksIGZyYW1lSWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKCdQYWdlLm5hdmlnYXRlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3ksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbnN1cmVOZXdEb2N1bWVudE5hdmlnYXRpb24gPSAhIXJlc3BvbnNlLmxvYWRlcklkO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3JUZXh0ID09PSAnbmV0OjpFUlJfSFRUUF9SRVNQT05TRV9DT0RFX0ZBSUxVUkUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZXJyb3JUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBFcnJvcihgJHtyZXNwb25zZS5lcnJvclRleHR9IGF0ICR7dXJsfWApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHdhaXRGb3JOYXZpZ2F0aW9uKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgY29uc3QgeyB3YWl0VW50aWwgPSBbJ2xvYWQnXSwgdGltZW91dCA9IHRoaXMuX2ZyYW1lTWFuYWdlci50aW1lb3V0U2V0dGluZ3MubmF2aWdhdGlvblRpbWVvdXQoKSwgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCB3YXRjaGVyID0gbmV3IExpZmVjeWNsZVdhdGNoZXIodGhpcy5fZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLCB0aGlzLCB3YWl0VW50aWwsIHRpbWVvdXQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCBEZWZlcnJlZC5yYWNlKFtcbiAgICAgICAgICAgICAgICB3YXRjaGVyLnRlcm1pbmF0aW9uUHJvbWlzZSgpLFxuICAgICAgICAgICAgICAgIC4uLihvcHRpb25zLmlnbm9yZVNhbWVEb2N1bWVudE5hdmlnYXRpb25cbiAgICAgICAgICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgICAgICAgICA6IFt3YXRjaGVyLnNhbWVEb2N1bWVudE5hdmlnYXRpb25Qcm9taXNlKCldKSxcbiAgICAgICAgICAgICAgICB3YXRjaGVyLm5ld0RvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IERlZmVycmVkLnJhY2UoW3dhdGNoZXIudGVybWluYXRpb25Qcm9taXNlKCksIHdhdGNoZXIubmF2aWdhdGlvblJlc3BvbnNlKCldKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgfHwgbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHdhdGNoZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCBjbGllbnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50O1xuICAgICAgICB9XG4gICAgICAgIG1haW5SZWFsbSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndvcmxkc1tNQUlOX1dPUkxEXTtcbiAgICAgICAgfVxuICAgICAgICBpc29sYXRlZFJlYWxtKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud29ybGRzW1BVUFBFVEVFUl9XT1JMRF07XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgc2V0Q29udGVudChodG1sLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgd2FpdFVudGlsID0gWydsb2FkJ10sIHRpbWVvdXQgPSB0aGlzLl9mcmFtZU1hbmFnZXIudGltZW91dFNldHRpbmdzLm5hdmlnYXRpb25UaW1lb3V0KCksIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgLy8gV2UgcmVseSB1cG9uIHRoZSBmYWN0IHRoYXQgZG9jdW1lbnQub3BlbigpIHdpbGwgcmVzZXQgZnJhbWUgbGlmZWN5Y2xlIHdpdGggXCJpbml0XCJcbiAgICAgICAgICAgIC8vIGxpZmVjeWNsZSBldmVudC4gQHNlZSBodHRwczovL2NycmV2LmNvbS82MDg2NThcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0RnJhbWVDb250ZW50KGh0bWwpO1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hlciA9IG5ldyBMaWZlY3ljbGVXYXRjaGVyKHRoaXMuX2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlciwgdGhpcywgd2FpdFVudGlsLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgRGVmZXJyZWQucmFjZShbXG4gICAgICAgICAgICAgICAgd2F0Y2hlci50ZXJtaW5hdGlvblByb21pc2UoKSxcbiAgICAgICAgICAgICAgICB3YXRjaGVyLmxpZmVjeWNsZVByb21pc2UoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgd2F0Y2hlci5kaXNwb3NlKCk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1cmwoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jdXJsO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudEZyYW1lKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lTWFuYWdlci5fZnJhbWVUcmVlLnBhcmVudEZyYW1lKHRoaXMuX2lkKSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkRnJhbWVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lTWFuYWdlci5fZnJhbWVUcmVlLmNoaWxkRnJhbWVzKHRoaXMuX2lkKTtcbiAgICAgICAgfVxuICAgICAgICAjZGV2aWNlUmVxdWVzdFByb21wdE1hbmFnZXIoKSB7XG4gICAgICAgICAgICBjb25zdCByb290RnJhbWUgPSB0aGlzLnBhZ2UoKS5tYWluRnJhbWUoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT09QRnJhbWUoKSB8fCByb290RnJhbWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZnJhbWVNYW5hZ2VyLl9kZXZpY2VSZXF1ZXN0UHJvbXB0TWFuYWdlcih0aGlzLiNjbGllbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvb3RGcmFtZS5fZnJhbWVNYW5hZ2VyLl9kZXZpY2VSZXF1ZXN0UHJvbXB0TWFuYWdlcih0aGlzLiNjbGllbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGFkZFByZWxvYWRTY3JpcHQocHJlbG9hZFNjcmlwdCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzT09QRnJhbWUoKSAmJiB0aGlzICE9PSB0aGlzLl9mcmFtZU1hbmFnZXIubWFpbkZyYW1lKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJlbG9hZFNjcmlwdC5nZXRJZEZvckZyYW1lKHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnUGFnZS5hZGRTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCcsIHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHByZWxvYWRTY3JpcHQuc291cmNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcmVsb2FkU2NyaXB0LnNldElkRm9yRnJhbWUodGhpcywgaWRlbnRpZmllcik7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgYWRkRXhwb3NlZEZ1bmN0aW9uQmluZGluZyhiaW5kaW5nKSB7XG4gICAgICAgICAgICAvLyBJZiBhIGZyYW1lIGhhcyBub3Qgc3RhcnRlZCBsb2FkaW5nLCBpdCBtaWdodCBuZXZlciBzdGFydC4gUmVseSBvblxuICAgICAgICAgICAgLy8gYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQgaW4gdGhhdCBjYXNlLlxuICAgICAgICAgICAgaWYgKHRoaXMgIT09IHRoaXMuX2ZyYW1lTWFuYWdlci5tYWluRnJhbWUoKSAmJiAhdGhpcy5faGFzU3RhcnRlZExvYWRpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy4jY2xpZW50LnNlbmQoJ1J1bnRpbWUuYWRkQmluZGluZycsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogQ0RQX0JJTkRJTkdfUFJFRklYICsgYmluZGluZy5uYW1lLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGUoYmluZGluZy5pbml0U291cmNlKS5jYXRjaChkZWJ1Z0Vycm9yKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGFzeW5jIHJlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZykge1xuICAgICAgICAgICAgLy8gSWYgYSBmcmFtZSBoYXMgbm90IHN0YXJ0ZWQgbG9hZGluZywgaXQgbWlnaHQgbmV2ZXIgc3RhcnQuIFJlbHkgb25cbiAgICAgICAgICAgIC8vIGFkZFNjcmlwdFRvRXZhbHVhdGVPbk5ld0RvY3VtZW50IGluIHRoYXQgY2FzZS5cbiAgICAgICAgICAgIGlmICh0aGlzICE9PSB0aGlzLl9mcmFtZU1hbmFnZXIubWFpbkZyYW1lKCkgJiYgIXRoaXMuX2hhc1N0YXJ0ZWRMb2FkaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2NsaWVudC5zZW5kKCdSdW50aW1lLnJlbW92ZUJpbmRpbmcnLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IENEUF9CSU5ESU5HX1BSRUZJWCArIGJpbmRpbmcubmFtZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0aGlzLmV2YWx1YXRlKG5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmVzIHRoZSBkYW5nbGluZyBQdXBwZXRlZXIgYmluZGluZyB3cmFwcGVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBJbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH0sIGJpbmRpbmcubmFtZSkuY2F0Y2goZGVidWdFcnJvciksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyB3YWl0Rm9yRGV2aWNlUHJvbXB0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyKCkud2FpdEZvckRldmljZVByb21wdChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBfbmF2aWdhdGVkKGZyYW1lUGF5bG9hZCkge1xuICAgICAgICAgICAgdGhpcy5fbmFtZSA9IGZyYW1lUGF5bG9hZC5uYW1lO1xuICAgICAgICAgICAgdGhpcy4jdXJsID0gYCR7ZnJhbWVQYXlsb2FkLnVybH0ke2ZyYW1lUGF5bG9hZC51cmxGcmFnbWVudCB8fCAnJ31gO1xuICAgICAgICB9XG4gICAgICAgIF9uYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCh1cmwpIHtcbiAgICAgICAgICAgIHRoaXMuI3VybCA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBfb25MaWZlY3ljbGVFdmVudChsb2FkZXJJZCwgbmFtZSkge1xuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdpbml0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRlcklkID0gbG9hZGVySWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGlmZWN5Y2xlRXZlbnRzLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9saWZlY3ljbGVFdmVudHMuYWRkKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIF9vbkxvYWRpbmdTdG9wcGVkKCkge1xuICAgICAgICAgICAgdGhpcy5fbGlmZWN5Y2xlRXZlbnRzLmFkZCgnRE9NQ29udGVudExvYWRlZCcpO1xuICAgICAgICAgICAgdGhpcy5fbGlmZWN5Y2xlRXZlbnRzLmFkZCgnbG9hZCcpO1xuICAgICAgICB9XG4gICAgICAgIF9vbkxvYWRpbmdTdGFydGVkKCkge1xuICAgICAgICAgICAgdGhpcy5faGFzU3RhcnRlZExvYWRpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGdldCBkZXRhY2hlZCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkZXRhY2hlZDtcbiAgICAgICAgfVxuICAgICAgICBbKF9nb3RvX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXSwgX3dhaXRGb3JOYXZpZ2F0aW9uX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXSwgX3NldENvbnRlbnRfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdLCBfYWRkUHJlbG9hZFNjcmlwdF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF0sIF9hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nX2RlY29yYXRvcnMgPSBbdGhyb3dJZkRldGFjaGVkXSwgX3JlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmdfZGVjb3JhdG9ycyA9IFt0aHJvd0lmRGV0YWNoZWRdLCBfd2FpdEZvckRldmljZVByb21wdF9kZWNvcmF0b3JzID0gW3Rocm93SWZEZXRhY2hlZF0sIGRpc3Bvc2VTeW1ib2wpXSgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNkZXRhY2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2RldGFjaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMud29ybGRzW01BSU5fV09STERdW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgICAgICB0aGlzLndvcmxkc1tQVVBQRVRFRVJfV09STERdW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3NlRnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuZXhwb3J0IHsgQ2RwRnJhbWUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyYW1lLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBGcmFtZUV2ZW50IH0gZnJvbSAnLi4vYXBpL0ZyYW1lLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZGVidWdFcnJvciwgUHVwcGV0ZWVyVVJMLCBVVElMSVRZX1dPUkxEX05BTUUgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4uL3V0aWwvRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4uL3V0aWwvZGlzcG9zYWJsZS5qcyc7XG5pbXBvcnQgeyBpc0Vycm9yTGlrZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IENkcFByZWxvYWRTY3JpcHQgfSBmcm9tICcuL0NkcFByZWxvYWRTY3JpcHQuanMnO1xuaW1wb3J0IHsgQ2RwQ0RQU2Vzc2lvbiB9IGZyb20gJy4vQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBpc1RhcmdldENsb3NlZEVycm9yIH0gZnJvbSAnLi9Db25uZWN0aW9uLmpzJztcbmltcG9ydCB7IERldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyIH0gZnJvbSAnLi9EZXZpY2VSZXF1ZXN0UHJvbXB0LmpzJztcbmltcG9ydCB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4ZWN1dGlvbkNvbnRleHQuanMnO1xuaW1wb3J0IHsgQ2RwRnJhbWUgfSBmcm9tICcuL0ZyYW1lLmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlckV2ZW50IH0gZnJvbSAnLi9GcmFtZU1hbmFnZXJFdmVudHMuanMnO1xuaW1wb3J0IHsgRnJhbWVUcmVlIH0gZnJvbSAnLi9GcmFtZVRyZWUuanMnO1xuaW1wb3J0IHsgTUFJTl9XT1JMRCwgUFVQUEVURUVSX1dPUkxEIH0gZnJvbSAnLi9Jc29sYXRlZFdvcmxkcy5qcyc7XG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlciB9IGZyb20gJy4vTmV0d29ya01hbmFnZXIuanMnO1xuY29uc3QgVElNRV9GT1JfV0FJVElOR19GT1JfU1dBUCA9IDEwMDsgLy8gbXMuXG4vKipcbiAqIEEgZnJhbWUgbWFuYWdlciBtYW5hZ2VzIHRoZSBmcmFtZXMgZm9yIGEgZ2l2ZW4ge0BsaW5rIFBhZ2UgfCBwYWdlfS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEZyYW1lTWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgI3BhZ2U7XG4gICAgI25ldHdvcmtNYW5hZ2VyO1xuICAgICN0aW1lb3V0U2V0dGluZ3M7XG4gICAgI2lzb2xhdGVkV29ybGRzID0gbmV3IFNldCgpO1xuICAgICNjbGllbnQ7XG4gICAgI3NjcmlwdHNUb0V2YWx1YXRlT25OZXdEb2N1bWVudCA9IG5ldyBNYXAoKTtcbiAgICAjYmluZGluZ3MgPSBuZXcgU2V0KCk7XG4gICAgX2ZyYW1lVHJlZSA9IG5ldyBGcmFtZVRyZWUoKTtcbiAgICAvKipcbiAgICAgKiBTZXQgb2YgZnJhbWUgSURzIHN0b3JlZCB0byBpbmRpY2F0ZSBpZiBhIGZyYW1lIGhhcyByZWNlaXZlZCBhXG4gICAgICogZnJhbWVOYXZpZ2F0ZWQgZXZlbnQgc28gdGhhdCBmcmFtZSB0cmVlIHJlc3BvbnNlcyBjb3VsZCBiZSBpZ25vcmVkIGFzIHRoZVxuICAgICAqIGZyYW1lTmF2aWdhdGVkIGV2ZW50IHVzdWFsbHkgY29udGFpbnMgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICAjZnJhbWVOYXZpZ2F0ZWRSZWNlaXZlZCA9IG5ldyBTZXQoKTtcbiAgICAjZGV2aWNlUmVxdWVzdFByb21wdE1hbmFnZXJNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgICNmcmFtZVRyZWVIYW5kbGVkO1xuICAgIGdldCB0aW1lb3V0U2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0aW1lb3V0U2V0dGluZ3M7XG4gICAgfVxuICAgIGdldCBuZXR3b3JrTWFuYWdlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25ldHdvcmtNYW5hZ2VyO1xuICAgIH1cbiAgICBnZXQgY2xpZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50O1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIHBhZ2UsIHRpbWVvdXRTZXR0aW5ncykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3BhZ2UgPSBwYWdlO1xuICAgICAgICB0aGlzLiNuZXR3b3JrTWFuYWdlciA9IG5ldyBOZXR3b3JrTWFuYWdlcih0aGlzKTtcbiAgICAgICAgdGhpcy4jdGltZW91dFNldHRpbmdzID0gdGltZW91dFNldHRpbmdzO1xuICAgICAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnModGhpcy4jY2xpZW50KTtcbiAgICAgICAgY2xpZW50Lm9uY2UoQ0RQU2Vzc2lvbkV2ZW50LkRpc2Nvbm5lY3RlZCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jb25DbGllbnREaXNjb25uZWN0KCkuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhbWUncyBjbGllbnQgaXMgZGlzY29ubmVjdGVkLiBXZSBkb24ndCBrbm93IGlmIHRoZVxuICAgICAqIGRpc2Nvbm5lY3QgbWVhbnMgdGhhdCB0aGUgZnJhbWUgaXMgcmVtb3ZlZCBvciBpZiBpdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IGFcbiAgICAgKiBuZXcgZnJhbWUuIFRoZXJlZm9yZSwgd2Ugd2FpdCBmb3IgYSBzd2FwIGV2ZW50LlxuICAgICAqL1xuICAgIGFzeW5jICNvbkNsaWVudERpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGNvbnN0IG1haW5GcmFtZSA9IHRoaXMuX2ZyYW1lVHJlZS5nZXRNYWluRnJhbWUoKTtcbiAgICAgICAgaWYgKCFtYWluRnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG1haW5GcmFtZS5jaGlsZEZyYW1lcygpKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3dhcHBlZCA9IERlZmVycmVkLmNyZWF0ZSh7XG4gICAgICAgICAgICB0aW1lb3V0OiBUSU1FX0ZPUl9XQUlUSU5HX0ZPUl9TV0FQLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZyYW1lIHdhcyBub3Qgc3dhcHBlZCcsXG4gICAgICAgIH0pO1xuICAgICAgICBtYWluRnJhbWUub25jZShGcmFtZUV2ZW50LkZyYW1lU3dhcHBlZEJ5QWN0aXZhdGlvbiwgKCkgPT4ge1xuICAgICAgICAgICAgc3dhcHBlZC5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgc3dhcHBlZC52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShtYWluRnJhbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIG1haW4gZnJhbWUgaXMgcmVwbGFjZWQgYnkgYW5vdGhlciBtYWluIGZyYW1lLFxuICAgICAqIHdlIG1haW50YWluIHRoZSBtYWluIGZyYW1lIG9iamVjdCBpZGVudGl0eSB3aGlsZSB1cGRhdGluZ1xuICAgICAqIGl0cyBmcmFtZSB0cmVlIGFuZCBJRC5cbiAgICAgKi9cbiAgICBhc3luYyBzd2FwRnJhbWVUcmVlKGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIGFzc2VydCh0aGlzLiNjbGllbnQgaW5zdGFuY2VvZiBDZHBDRFBTZXNzaW9uLCAnQ0RQU2Vzc2lvbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgQ0RQU2Vzc2lvbkltcGwuJyk7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdGhpcy5fZnJhbWVUcmVlLmdldE1haW5GcmFtZSgpO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuI2ZyYW1lTmF2aWdhdGVkUmVjZWl2ZWQuYWRkKHRoaXMuI2NsaWVudC5fdGFyZ2V0KCkuX3RhcmdldElkKTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lVHJlZS5yZW1vdmVGcmFtZShmcmFtZSk7XG4gICAgICAgICAgICBmcmFtZS51cGRhdGVJZCh0aGlzLiNjbGllbnQuX3RhcmdldCgpLl90YXJnZXRJZCk7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZVRyZWUuYWRkRnJhbWUoZnJhbWUpO1xuICAgICAgICAgICAgZnJhbWUudXBkYXRlQ2xpZW50KGNsaWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKGNsaWVudCk7XG4gICAgICAgIGNsaWVudC5vbmNlKENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI29uQ2xpZW50RGlzY29ubmVjdCgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplKGNsaWVudCwgZnJhbWUpO1xuICAgICAgICBhd2FpdCB0aGlzLiNuZXR3b3JrTWFuYWdlci5hZGRDbGllbnQoY2xpZW50KTtcbiAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkQnlBY3RpdmF0aW9uLCB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlZ2lzdGVyU3BlY3VsYXRpdmVTZXNzaW9uKGNsaWVudCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNuZXR3b3JrTWFuYWdlci5hZGRDbGllbnQoY2xpZW50KTtcbiAgICB9XG4gICAgc2V0dXBFdmVudExpc3RlbmVycyhzZXNzaW9uKSB7XG4gICAgICAgIHNlc3Npb24ub24oJ1BhZ2UuZnJhbWVBdHRhY2hlZCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jZnJhbWVUcmVlSGFuZGxlZD8udmFsdWVPclRocm93KCk7XG4gICAgICAgICAgICB0aGlzLiNvbkZyYW1lQXR0YWNoZWQoc2Vzc2lvbiwgZXZlbnQuZnJhbWVJZCwgZXZlbnQucGFyZW50RnJhbWVJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdQYWdlLmZyYW1lTmF2aWdhdGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU5hdmlnYXRlZFJlY2VpdmVkLmFkZChldmVudC5mcmFtZS5pZCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25GcmFtZU5hdmlnYXRlZChldmVudC5mcmFtZSwgZXZlbnQudHlwZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdQYWdlLm5hdmlnYXRlZFdpdGhpbkRvY3VtZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudChldmVudC5mcmFtZUlkLCBldmVudC51cmwpO1xuICAgICAgICB9KTtcbiAgICAgICAgc2Vzc2lvbi5vbignUGFnZS5mcmFtZURldGFjaGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRnJhbWVEZXRhY2hlZChldmVudC5mcmFtZUlkLCBldmVudC5yZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgICAgc2Vzc2lvbi5vbignUGFnZS5mcmFtZVN0YXJ0ZWRMb2FkaW5nJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRnJhbWVTdGFydGVkTG9hZGluZyhldmVudC5mcmFtZUlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNlc3Npb24ub24oJ1BhZ2UuZnJhbWVTdG9wcGVkTG9hZGluZycsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jZnJhbWVUcmVlSGFuZGxlZD8udmFsdWVPclRocm93KCk7XG4gICAgICAgICAgICB0aGlzLiNvbkZyYW1lU3RvcHBlZExvYWRpbmcoZXZlbnQuZnJhbWVJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdSdW50aW1lLmV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uRXhlY3V0aW9uQ29udGV4dENyZWF0ZWQoZXZlbnQuY29udGV4dCwgc2Vzc2lvbik7XG4gICAgICAgIH0pO1xuICAgICAgICBzZXNzaW9uLm9uKCdQYWdlLmxpZmVjeWNsZUV2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIHRoaXMuI29uTGlmZWN5Y2xlRXZlbnQoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgaW5pdGlhbGl6ZShjbGllbnQsIGZyYW1lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy5yZXNvbHZlKCk7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNjaGVkdWxlIGFsbCB0aGVzZSBjb21tYW5kcyB3aGlsZSB0aGUgdGFyZ2V0IGlzIHBhdXNlZCxcbiAgICAgICAgICAgIC8vIHRoZXJlZm9yZSwgaXQgbmVlZHMgdG8gaGFwcGVuIHN5bmNocm9uaW91c2x5LiBBdCB0aGUgc2FtZSB0aW1lIHdlXG4gICAgICAgICAgICAvLyBzaG91bGQgbm90IHN0YXJ0IHByb2Nlc3NpbmcgZXhlY3V0aW9uIGNvbnRleHQgYW5kIGZyYW1lIGV2ZW50cyBiZWZvcmVcbiAgICAgICAgICAgIC8vIHdlIHJlY2VpdmVkIHRoZSBpbml0aWFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmcmFtZSB0cmVlLlxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI25ldHdvcmtNYW5hZ2VyLmFkZENsaWVudChjbGllbnQpLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdQYWdlLmVuYWJsZScpLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdQYWdlLmdldEZyYW1lVHJlZScpLnRoZW4oKHsgZnJhbWVUcmVlIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jaGFuZGxlRnJhbWVUcmVlKGNsaWVudCwgZnJhbWVUcmVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZnJhbWVUcmVlSGFuZGxlZD8ucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdQYWdlLnNldExpZmVjeWNsZUV2ZW50c0VuYWJsZWQnLCB7IGVuYWJsZWQ6IHRydWUgfSksXG4gICAgICAgICAgICAgICAgY2xpZW50LnNlbmQoJ1J1bnRpbWUuZW5hYmxlJykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNjcmVhdGVJc29sYXRlZFdvcmxkKGNsaWVudCwgVVRJTElUWV9XT1JMRF9OQU1FKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAuLi4oZnJhbWVcbiAgICAgICAgICAgICAgICAgICAgPyBBcnJheS5mcm9tKHRoaXMuI3NjcmlwdHNUb0V2YWx1YXRlT25OZXdEb2N1bWVudC52YWx1ZXMoKSlcbiAgICAgICAgICAgICAgICAgICAgOiBbXSkubWFwKHNjcmlwdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZT8uYWRkUHJlbG9hZFNjcmlwdChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC4uLihmcmFtZSA/IEFycmF5LmZyb20odGhpcy4jYmluZGluZ3MudmFsdWVzKCkpIDogW10pLm1hcChiaW5kaW5nID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lPy5hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nKGJpbmRpbmcpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZVRyZWVIYW5kbGVkPy5yZXNvbHZlKCk7XG4gICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IG1pZ2h0IGhhdmUgYmVlbiBjbG9zZWQgYmVmb3JlIHRoZSBpbml0aWFsaXphdGlvbiBmaW5pc2hlZC5cbiAgICAgICAgICAgIGlmIChpc0Vycm9yTGlrZShlcnJvcikgJiYgaXNUYXJnZXRDbG9zZWRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGFnZTtcbiAgICB9XG4gICAgbWFpbkZyYW1lKCkge1xuICAgICAgICBjb25zdCBtYWluRnJhbWUgPSB0aGlzLl9mcmFtZVRyZWUuZ2V0TWFpbkZyYW1lKCk7XG4gICAgICAgIGFzc2VydChtYWluRnJhbWUsICdSZXF1ZXN0aW5nIG1haW4gZnJhbWUgdG9vIGVhcmx5IScpO1xuICAgICAgICByZXR1cm4gbWFpbkZyYW1lO1xuICAgIH1cbiAgICBmcmFtZXMoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2ZyYW1lVHJlZS5mcmFtZXMoKSk7XG4gICAgfVxuICAgIGZyYW1lKGZyYW1lSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lVHJlZS5nZXRCeUlkKGZyYW1lSWQpIHx8IG51bGw7XG4gICAgfVxuICAgIGFzeW5jIGFkZEV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZykge1xuICAgICAgICB0aGlzLiNiaW5kaW5ncy5hZGQoYmluZGluZyk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuZnJhbWVzKCkubWFwKGFzeW5jIChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZyYW1lLmFkZEV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZyk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgYXN5bmMgcmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZyhiaW5kaW5nKSB7XG4gICAgICAgIHRoaXMuI2JpbmRpbmdzLmRlbGV0ZShiaW5kaW5nKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mcmFtZXMoKS5tYXAoYXN5bmMgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZnJhbWUucmVtb3ZlRXhwb3NlZEZ1bmN0aW9uQmluZGluZyhiaW5kaW5nKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBhc3luYyBldmFsdWF0ZU9uTmV3RG9jdW1lbnQoc291cmNlKSB7XG4gICAgICAgIGNvbnN0IHsgaWRlbnRpZmllciB9ID0gYXdhaXQgdGhpcy5tYWluRnJhbWUoKVxuICAgICAgICAgICAgLl9jbGllbnQoKVxuICAgICAgICAgICAgLnNlbmQoJ1BhZ2UuYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQnLCB7XG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwcmVsb2FkU2NyaXB0ID0gbmV3IENkcFByZWxvYWRTY3JpcHQodGhpcy5tYWluRnJhbWUoKSwgaWRlbnRpZmllciwgc291cmNlKTtcbiAgICAgICAgdGhpcy4jc2NyaXB0c1RvRXZhbHVhdGVPbk5ld0RvY3VtZW50LnNldChpZGVudGlmaWVyLCBwcmVsb2FkU2NyaXB0KTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mcmFtZXMoKS5tYXAoYXN5bmMgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZnJhbWUuYWRkUHJlbG9hZFNjcmlwdChwcmVsb2FkU2NyaXB0KTtcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4geyBpZGVudGlmaWVyIH07XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZVNjcmlwdFRvRXZhbHVhdGVPbk5ld0RvY3VtZW50KGlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgcHJlbG9hZFNjcmlwdCA9IHRoaXMuI3NjcmlwdHNUb0V2YWx1YXRlT25OZXdEb2N1bWVudC5nZXQoaWRlbnRpZmllcik7XG4gICAgICAgIGlmICghcHJlbG9hZFNjcmlwdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgdG8gZXZhbHVhdGUgb24gbmV3IGRvY3VtZW50IHdpdGggaWQgJHtpZGVudGlmaWVyfSBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNzY3JpcHRzVG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQuZGVsZXRlKGlkZW50aWZpZXIpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmZyYW1lcygpLm1hcChmcmFtZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gcHJlbG9hZFNjcmlwdC5nZXRJZEZvckZyYW1lKGZyYW1lKTtcbiAgICAgICAgICAgIGlmICghaWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmcmFtZVxuICAgICAgICAgICAgICAgIC5fY2xpZW50KClcbiAgICAgICAgICAgICAgICAuc2VuZCgnUGFnZS5yZW1vdmVTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudCcsIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgb25BdHRhY2hlZFRvVGFyZ2V0KHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0Ll9nZXRUYXJnZXRJbmZvKCkudHlwZSAhPT0gJ2lmcmFtZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUodGFyZ2V0Ll9nZXRUYXJnZXRJbmZvKCkudGFyZ2V0SWQpO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIGZyYW1lLnVwZGF0ZUNsaWVudCh0YXJnZXQuX3Nlc3Npb24oKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKHRhcmdldC5fc2Vzc2lvbigpKTtcbiAgICAgICAgdm9pZCB0aGlzLmluaXRpYWxpemUodGFyZ2V0Ll9zZXNzaW9uKCksIGZyYW1lKTtcbiAgICB9XG4gICAgX2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyKGNsaWVudCkge1xuICAgICAgICBsZXQgbWFuYWdlciA9IHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyTWFwLmdldChjbGllbnQpO1xuICAgICAgICBpZiAobWFuYWdlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtYW5hZ2VyID0gbmV3IERldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyKGNsaWVudCwgdGhpcy4jdGltZW91dFNldHRpbmdzKTtcbiAgICAgICAgICAgIHRoaXMuI2RldmljZVJlcXVlc3RQcm9tcHRNYW5hZ2VyTWFwLnNldChjbGllbnQsIG1hbmFnZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYW5hZ2VyO1xuICAgIH1cbiAgICAjb25MaWZlY3ljbGVFdmVudChldmVudCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUoZXZlbnQuZnJhbWVJZCk7XG4gICAgICAgIGlmICghZnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZS5fb25MaWZlY3ljbGVFdmVudChldmVudC5sb2FkZXJJZCwgZXZlbnQubmFtZSk7XG4gICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5MaWZlY3ljbGVFdmVudCwgZnJhbWUpO1xuICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuTGlmZWN5Y2xlRXZlbnQsIHVuZGVmaW5lZCk7XG4gICAgfVxuICAgICNvbkZyYW1lU3RhcnRlZExvYWRpbmcoZnJhbWVJZCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUoZnJhbWVJZCk7XG4gICAgICAgIGlmICghZnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZS5fb25Mb2FkaW5nU3RhcnRlZCgpO1xuICAgIH1cbiAgICAjb25GcmFtZVN0b3BwZWRMb2FkaW5nKGZyYW1lSWQpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmZyYW1lKGZyYW1lSWQpO1xuICAgICAgICBpZiAoIWZyYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUuX29uTG9hZGluZ1N0b3BwZWQoKTtcbiAgICAgICAgdGhpcy5lbWl0KEZyYW1lTWFuYWdlckV2ZW50LkxpZmVjeWNsZUV2ZW50LCBmcmFtZSk7XG4gICAgICAgIGZyYW1lLmVtaXQoRnJhbWVFdmVudC5MaWZlY3ljbGVFdmVudCwgdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgI2hhbmRsZUZyYW1lVHJlZShzZXNzaW9uLCBmcmFtZVRyZWUpIHtcbiAgICAgICAgaWYgKGZyYW1lVHJlZS5mcmFtZS5wYXJlbnRJZCkge1xuICAgICAgICAgICAgdGhpcy4jb25GcmFtZUF0dGFjaGVkKHNlc3Npb24sIGZyYW1lVHJlZS5mcmFtZS5pZCwgZnJhbWVUcmVlLmZyYW1lLnBhcmVudElkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuI2ZyYW1lTmF2aWdhdGVkUmVjZWl2ZWQuaGFzKGZyYW1lVHJlZS5mcmFtZS5pZCkpIHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25GcmFtZU5hdmlnYXRlZChmcmFtZVRyZWUuZnJhbWUsICdOYXZpZ2F0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU5hdmlnYXRlZFJlY2VpdmVkLmRlbGV0ZShmcmFtZVRyZWUuZnJhbWUuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZnJhbWVUcmVlLmNoaWxkRnJhbWVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmcmFtZVRyZWUuY2hpbGRGcmFtZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZUZyYW1lVHJlZShzZXNzaW9uLCBjaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uRnJhbWVBdHRhY2hlZChzZXNzaW9uLCBmcmFtZUlkLCBwYXJlbnRGcmFtZUlkKSB7XG4gICAgICAgIGxldCBmcmFtZSA9IHRoaXMuZnJhbWUoZnJhbWVJZCk7XG4gICAgICAgIGlmIChmcmFtZSkge1xuICAgICAgICAgICAgaWYgKHNlc3Npb24gJiYgZnJhbWUuaXNPT1BGcmFtZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gT09QIGlmcmFtZXMgYmVjb21lcyBhIG5vcm1hbCBpZnJhbWUgYWdhaW5cbiAgICAgICAgICAgICAgICAvLyBpdCBpcyBmaXJzdCBhdHRhY2hlZCB0byB0aGUgcGFyZW50IHBhZ2UgYmVmb3JlXG4gICAgICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBpcyByZW1vdmVkLlxuICAgICAgICAgICAgICAgIGZyYW1lLnVwZGF0ZUNsaWVudChzZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmcmFtZSA9IG5ldyBDZHBGcmFtZSh0aGlzLCBmcmFtZUlkLCBwYXJlbnRGcmFtZUlkLCBzZXNzaW9uKTtcbiAgICAgICAgdGhpcy5fZnJhbWVUcmVlLmFkZEZyYW1lKGZyYW1lKTtcbiAgICAgICAgdGhpcy5lbWl0KEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lQXR0YWNoZWQsIGZyYW1lKTtcbiAgICB9XG4gICAgYXN5bmMgI29uRnJhbWVOYXZpZ2F0ZWQoZnJhbWVQYXlsb2FkLCBuYXZpZ2F0aW9uVHlwZSkge1xuICAgICAgICBjb25zdCBmcmFtZUlkID0gZnJhbWVQYXlsb2FkLmlkO1xuICAgICAgICBjb25zdCBpc01haW5GcmFtZSA9ICFmcmFtZVBheWxvYWQucGFyZW50SWQ7XG4gICAgICAgIGxldCBmcmFtZSA9IHRoaXMuX2ZyYW1lVHJlZS5nZXRCeUlkKGZyYW1lSWQpO1xuICAgICAgICAvLyBEZXRhY2ggYWxsIGNoaWxkIGZyYW1lcyBmaXJzdC5cbiAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZyYW1lLmNoaWxkRnJhbWVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIG9yIGNyZWF0ZSBtYWluIGZyYW1lLlxuICAgICAgICBpZiAoaXNNYWluRnJhbWUpIHtcbiAgICAgICAgICAgIGlmIChmcmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmcmFtZSBpZCB0byByZXRhaW4gZnJhbWUgaWRlbnRpdHkgb24gY3Jvc3MtcHJvY2VzcyBuYXZpZ2F0aW9uLlxuICAgICAgICAgICAgICAgIHRoaXMuX2ZyYW1lVHJlZS5yZW1vdmVGcmFtZShmcmFtZSk7XG4gICAgICAgICAgICAgICAgZnJhbWUuX2lkID0gZnJhbWVJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEluaXRpYWwgbWFpbiBmcmFtZSBuYXZpZ2F0aW9uLlxuICAgICAgICAgICAgICAgIGZyYW1lID0gbmV3IENkcEZyYW1lKHRoaXMsIGZyYW1lSWQsIHVuZGVmaW5lZCwgdGhpcy4jY2xpZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lVHJlZS5hZGRGcmFtZShmcmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUgPSBhd2FpdCB0aGlzLl9mcmFtZVRyZWUud2FpdEZvckZyYW1lKGZyYW1lSWQpO1xuICAgICAgICBmcmFtZS5fbmF2aWdhdGVkKGZyYW1lUGF5bG9hZCk7XG4gICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5GcmFtZU5hdmlnYXRlZCwgZnJhbWUpO1xuICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuRnJhbWVOYXZpZ2F0ZWQsIG5hdmlnYXRpb25UeXBlKTtcbiAgICB9XG4gICAgYXN5bmMgI2NyZWF0ZUlzb2xhdGVkV29ybGQoc2Vzc2lvbiwgbmFtZSkge1xuICAgICAgICBjb25zdCBrZXkgPSBgJHtzZXNzaW9uLmlkKCl9OiR7bmFtZX1gO1xuICAgICAgICBpZiAodGhpcy4jaXNvbGF0ZWRXb3JsZHMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBzZXNzaW9uLnNlbmQoJ1BhZ2UuYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQnLCB7XG4gICAgICAgICAgICBzb3VyY2U6IGAvLyMgc291cmNlVVJMPSR7UHVwcGV0ZWVyVVJMLklOVEVSTkFMX1VSTH1gLFxuICAgICAgICAgICAgd29ybGROYW1lOiBuYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5mcmFtZXMoKVxuICAgICAgICAgICAgLmZpbHRlcihmcmFtZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZnJhbWUuY2xpZW50ID09PSBzZXNzaW9uO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLm1hcChmcmFtZSA9PiB7XG4gICAgICAgICAgICAvLyBGcmFtZXMgbWlnaHQgYmUgcmVtb3ZlZCBiZWZvcmUgd2Ugc2VuZCB0aGlzLCBzbyB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgICAgICAvLyB0aHJvdyBhbiBlcnJvci5cbiAgICAgICAgICAgIHJldHVybiBzZXNzaW9uXG4gICAgICAgICAgICAgICAgLnNlbmQoJ1BhZ2UuY3JlYXRlSXNvbGF0ZWRXb3JsZCcsIHtcbiAgICAgICAgICAgICAgICBmcmFtZUlkOiBmcmFtZS5faWQsXG4gICAgICAgICAgICAgICAgd29ybGROYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgIGdyYW50VW5pdmVyYWxBY2Nlc3M6IHRydWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLiNpc29sYXRlZFdvcmxkcy5hZGQoa2V5KTtcbiAgICB9XG4gICAgI29uRnJhbWVOYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudChmcmFtZUlkLCB1cmwpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLmZyYW1lKGZyYW1lSWQpO1xuICAgICAgICBpZiAoIWZyYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWUuX25hdmlnYXRlZFdpdGhpbkRvY3VtZW50KHVybCk7XG4gICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5GcmFtZU5hdmlnYXRlZFdpdGhpbkRvY3VtZW50LCBmcmFtZSk7XG4gICAgICAgIGZyYW1lLmVtaXQoRnJhbWVFdmVudC5GcmFtZU5hdmlnYXRlZFdpdGhpbkRvY3VtZW50LCB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmVtaXQoRnJhbWVNYW5hZ2VyRXZlbnQuRnJhbWVOYXZpZ2F0ZWQsIGZyYW1lKTtcbiAgICAgICAgZnJhbWUuZW1pdChGcmFtZUV2ZW50LkZyYW1lTmF2aWdhdGVkLCAnTmF2aWdhdGlvbicpO1xuICAgIH1cbiAgICAjb25GcmFtZURldGFjaGVkKGZyYW1lSWQsIHJlYXNvbikge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZnJhbWUoZnJhbWVJZCk7XG4gICAgICAgIGlmICghZnJhbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgY2FzZSAncmVtb3ZlJzpcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHJlbW92ZSB0aGUgZnJhbWUgaWYgdGhlIHJlYXNvbiBmb3IgdGhlIGRldGFjaGVkIGV2ZW50IGlzXG4gICAgICAgICAgICAgICAgLy8gYW4gYWN0dWFsIHJlbW92ZW1lbnQgb2YgdGhlIGZyYW1lLlxuICAgICAgICAgICAgICAgIC8vIEZvciBmcmFtZXMgdGhhdCBiZWNvbWUgT09QIGlmcmFtZXMsIHRoZSByZWFzb24gd291bGQgYmUgJ3N3YXAnLlxuICAgICAgICAgICAgICAgIHRoaXMuI3JlbW92ZUZyYW1lc1JlY3Vyc2l2ZWx5KGZyYW1lKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3N3YXAnOlxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChGcmFtZU1hbmFnZXJFdmVudC5GcmFtZVN3YXBwZWQsIGZyYW1lKTtcbiAgICAgICAgICAgICAgICBmcmFtZS5lbWl0KEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgICNvbkV4ZWN1dGlvbkNvbnRleHRDcmVhdGVkKGNvbnRleHRQYXlsb2FkLCBzZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGF1eERhdGEgPSBjb250ZXh0UGF5bG9hZC5hdXhEYXRhO1xuICAgICAgICBjb25zdCBmcmFtZUlkID0gYXV4RGF0YSAmJiBhdXhEYXRhLmZyYW1lSWQ7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gdHlwZW9mIGZyYW1lSWQgPT09ICdzdHJpbmcnID8gdGhpcy5mcmFtZShmcmFtZUlkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHdvcmxkO1xuICAgICAgICBpZiAoZnJhbWUpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgY2FyZSBhYm91dCBleGVjdXRpb24gY29udGV4dHMgY3JlYXRlZCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi5cbiAgICAgICAgICAgIGlmIChmcmFtZS5jbGllbnQgIT09IHNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29udGV4dFBheWxvYWQuYXV4RGF0YSAmJiBjb250ZXh0UGF5bG9hZC5hdXhEYXRhWydpc0RlZmF1bHQnXSkge1xuICAgICAgICAgICAgICAgIHdvcmxkID0gZnJhbWUud29ybGRzW01BSU5fV09STERdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29udGV4dFBheWxvYWQubmFtZSA9PT0gVVRJTElUWV9XT1JMRF9OQU1FKSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBtdWx0aXBsZSBzZXNzaW9ucyB0byB0aGUgc2FtZSB0YXJnZXQsIHRoZXJlJ3MgYSByYWNlIGJldHdlZW5cbiAgICAgICAgICAgICAgICAvLyBjb25uZWN0aW9ucyBzbyB3ZSBtaWdodCBlbmQgdXAgY3JlYXRpbmcgbXVsdGlwbGUgaXNvbGF0ZWQgd29ybGRzLlxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgZWl0aGVyLlxuICAgICAgICAgICAgICAgIHdvcmxkID0gZnJhbWUud29ybGRzW1BVUFBFVEVFUl9XT1JMRF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gd29ybGQsIHRoZSBjb250ZXh0IGlzIG5vdCBtZWFudCB0byBiZSBoYW5kbGVkIGJ5IHVzLlxuICAgICAgICBpZiAoIXdvcmxkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBFeGVjdXRpb25Db250ZXh0KGZyYW1lPy5jbGllbnQgfHwgdGhpcy4jY2xpZW50LCBjb250ZXh0UGF5bG9hZCwgd29ybGQpO1xuICAgICAgICB3b3JsZC5zZXRDb250ZXh0KGNvbnRleHQpO1xuICAgIH1cbiAgICAjcmVtb3ZlRnJhbWVzUmVjdXJzaXZlbHkoZnJhbWUpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBmcmFtZS5jaGlsZEZyYW1lcygpKSB7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGcmFtZXNSZWN1cnNpdmVseShjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgZnJhbWVbZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgdGhpcy5fZnJhbWVUcmVlLnJlbW92ZUZyYW1lKGZyYW1lKTtcbiAgICAgICAgdGhpcy5lbWl0KEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lRGV0YWNoZWQsIGZyYW1lKTtcbiAgICAgICAgZnJhbWUuZW1pdChGcmFtZUV2ZW50LkZyYW1lRGV0YWNoZWQsIGZyYW1lKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GcmFtZU1hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogV2UgdXNlIHN5bWJvbHMgdG8gcHJldmVudCBleHRlcm5hbCBwYXJ0aWVzIGxpc3RlbmluZyB0byB0aGVzZSBldmVudHMuXG4gKiBUaGV5IGFyZSBpbnRlcm5hbCB0byBQdXBwZXRlZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIEZyYW1lTWFuYWdlckV2ZW50O1xuKGZ1bmN0aW9uIChGcmFtZU1hbmFnZXJFdmVudCkge1xuICAgIEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lQXR0YWNoZWQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZUF0dGFjaGVkJyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuRnJhbWVOYXZpZ2F0ZWQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZU5hdmlnYXRlZCcpO1xuICAgIEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lRGV0YWNoZWQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZURldGFjaGVkJyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuRnJhbWVTd2FwcGVkID0gU3ltYm9sKCdGcmFtZU1hbmFnZXIuRnJhbWVTd2FwcGVkJyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuTGlmZWN5Y2xlRXZlbnQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5MaWZlY3ljbGVFdmVudCcpO1xuICAgIEZyYW1lTWFuYWdlckV2ZW50LkZyYW1lTmF2aWdhdGVkV2l0aGluRG9jdW1lbnQgPSBTeW1ib2woJ0ZyYW1lTWFuYWdlci5GcmFtZU5hdmlnYXRlZFdpdGhpbkRvY3VtZW50Jyk7XG4gICAgRnJhbWVNYW5hZ2VyRXZlbnQuQ29uc29sZUFwaUNhbGxlZCA9IFN5bWJvbCgnRnJhbWVNYW5hZ2VyLkNvbnNvbGVBcGlDYWxsZWQnKTtcbiAgICBGcmFtZU1hbmFnZXJFdmVudC5CaW5kaW5nQ2FsbGVkID0gU3ltYm9sKCdGcmFtZU1hbmFnZXIuQmluZGluZ0NhbGxlZCcpO1xufSkoRnJhbWVNYW5hZ2VyRXZlbnQgfHwgKEZyYW1lTWFuYWdlckV2ZW50ID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZyYW1lTWFuYWdlckV2ZW50cy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIHBhZ2UgZnJhbWUgdHJlZSBhbmQgaXQncyBpcyBtYW5hZ2VkIGJ5XG4gKiB7QGxpbmsgRnJhbWVNYW5hZ2VyfS4gRnJhbWVUcmVlIHVzZXMgZnJhbWUgSURzIHRvIHJlZmVyZW5jZSBmcmFtZSBhbmQgaXRcbiAqIG1lYW5zIHRoYXQgcmVmZXJlbmNlZCBmcmFtZXMgbWlnaHQgbm90IGJlIGluIHRoZSB0cmVlIGFueW1vcmUuIFRodXMsIHRoZSB0cmVlXG4gKiBzdHJ1Y3R1cmUgaXMgZXZlbnR1YWxseSBjb25zaXN0ZW50LlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBGcmFtZVRyZWUge1xuICAgICNmcmFtZXMgPSBuZXcgTWFwKCk7XG4gICAgLy8gZnJhbWVJRCAtPiBwYXJlbnRGcmFtZUlEXG4gICAgI3BhcmVudElkcyA9IG5ldyBNYXAoKTtcbiAgICAvLyBmcmFtZUlEIC0+IGNoaWxkRnJhbWVJRHNcbiAgICAjY2hpbGRJZHMgPSBuZXcgTWFwKCk7XG4gICAgI21haW5GcmFtZTtcbiAgICAjaXNNYWluRnJhbWVTdGFsZSA9IGZhbHNlO1xuICAgICN3YWl0UmVxdWVzdHMgPSBuZXcgTWFwKCk7XG4gICAgZ2V0TWFpbkZyYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWFpbkZyYW1lO1xuICAgIH1cbiAgICBnZXRCeUlkKGZyYW1lSWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZyYW1lcy5nZXQoZnJhbWVJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb25jZSB0aGUgZnJhbWUgd2l0aFxuICAgICAqIHRoZSBnaXZlbiBJRCBpcyBhZGRlZCB0byB0aGUgdHJlZS5cbiAgICAgKi9cbiAgICB3YWl0Rm9yRnJhbWUoZnJhbWVJZCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZ2V0QnlJZChmcmFtZUlkKTtcbiAgICAgICAgaWYgKGZyYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZyYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLiN3YWl0UmVxdWVzdHMuZ2V0KGZyYW1lSWQpIHx8IG5ldyBTZXQoKTtcbiAgICAgICAgY2FsbGJhY2tzLmFkZChkZWZlcnJlZCk7XG4gICAgICAgIHJldHVybiBkZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgZnJhbWVzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiNmcmFtZXMudmFsdWVzKCkpO1xuICAgIH1cbiAgICBhZGRGcmFtZShmcmFtZSkge1xuICAgICAgICB0aGlzLiNmcmFtZXMuc2V0KGZyYW1lLl9pZCwgZnJhbWUpO1xuICAgICAgICBpZiAoZnJhbWUuX3BhcmVudElkKSB7XG4gICAgICAgICAgICB0aGlzLiNwYXJlbnRJZHMuc2V0KGZyYW1lLl9pZCwgZnJhbWUuX3BhcmVudElkKTtcbiAgICAgICAgICAgIGlmICghdGhpcy4jY2hpbGRJZHMuaGFzKGZyYW1lLl9wYXJlbnRJZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjaGlsZElkcy5zZXQoZnJhbWUuX3BhcmVudElkLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jY2hpbGRJZHMuZ2V0KGZyYW1lLl9wYXJlbnRJZCkuYWRkKGZyYW1lLl9pZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuI21haW5GcmFtZSB8fCB0aGlzLiNpc01haW5GcmFtZVN0YWxlKSB7XG4gICAgICAgICAgICB0aGlzLiNtYWluRnJhbWUgPSBmcmFtZTtcbiAgICAgICAgICAgIHRoaXMuI2lzTWFpbkZyYW1lU3RhbGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN3YWl0UmVxdWVzdHMuZ2V0KGZyYW1lLl9pZCk/LmZvckVhY2gocmVxdWVzdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5yZXNvbHZlKGZyYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZUZyYW1lKGZyYW1lKSB7XG4gICAgICAgIHRoaXMuI2ZyYW1lcy5kZWxldGUoZnJhbWUuX2lkKTtcbiAgICAgICAgdGhpcy4jcGFyZW50SWRzLmRlbGV0ZShmcmFtZS5faWQpO1xuICAgICAgICBpZiAoZnJhbWUuX3BhcmVudElkKSB7XG4gICAgICAgICAgICB0aGlzLiNjaGlsZElkcy5nZXQoZnJhbWUuX3BhcmVudElkKT8uZGVsZXRlKGZyYW1lLl9pZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNpc01haW5GcmFtZVN0YWxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjaGlsZEZyYW1lcyhmcmFtZUlkKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkSWRzID0gdGhpcy4jY2hpbGRJZHMuZ2V0KGZyYW1lSWQpO1xuICAgICAgICBpZiAoIWNoaWxkSWRzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oY2hpbGRJZHMpXG4gICAgICAgICAgICAubWFwKGlkID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEJ5SWQoaWQpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigoZnJhbWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmcmFtZSAhPT0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGFyZW50RnJhbWUoZnJhbWVJZCkge1xuICAgICAgICBjb25zdCBwYXJlbnRJZCA9IHRoaXMuI3BhcmVudElkcy5nZXQoZnJhbWVJZCk7XG4gICAgICAgIHJldHVybiBwYXJlbnRJZCA/IHRoaXMuZ2V0QnlJZChwYXJlbnRJZCkgOiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnJhbWVUcmVlLmpzLm1hcCIsImltcG9ydCB7IGhlYWRlcnNBcnJheSwgSFRUUFJlcXVlc3QsIFNUQVRVU19URVhUUywgaGFuZGxlRXJyb3IsIH0gZnJvbSAnLi4vYXBpL0hUVFBSZXF1ZXN0LmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwSFRUUFJlcXVlc3QgZXh0ZW5kcyBIVFRQUmVxdWVzdCB7XG4gICAgaWQ7XG4gICAgI2NsaWVudDtcbiAgICAjaXNOYXZpZ2F0aW9uUmVxdWVzdDtcbiAgICAjdXJsO1xuICAgICNyZXNvdXJjZVR5cGU7XG4gICAgI21ldGhvZDtcbiAgICAjaGFzUG9zdERhdGEgPSBmYWxzZTtcbiAgICAjcG9zdERhdGE7XG4gICAgI2hlYWRlcnMgPSB7fTtcbiAgICAjZnJhbWU7XG4gICAgI2luaXRpYXRvcjtcbiAgICBnZXQgY2xpZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2xpZW50O1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIGZyYW1lLCBpbnRlcmNlcHRpb25JZCwgYWxsb3dJbnRlcmNlcHRpb24sIGRhdGEsIHJlZGlyZWN0Q2hhaW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB0aGlzLmlkID0gZGF0YS5yZXF1ZXN0SWQ7XG4gICAgICAgIHRoaXMuI2lzTmF2aWdhdGlvblJlcXVlc3QgPVxuICAgICAgICAgICAgZGF0YS5yZXF1ZXN0SWQgPT09IGRhdGEubG9hZGVySWQgJiYgZGF0YS50eXBlID09PSAnRG9jdW1lbnQnO1xuICAgICAgICB0aGlzLl9pbnRlcmNlcHRpb25JZCA9IGludGVyY2VwdGlvbklkO1xuICAgICAgICB0aGlzLiN1cmwgPSBkYXRhLnJlcXVlc3QudXJsO1xuICAgICAgICB0aGlzLiNyZXNvdXJjZVR5cGUgPSAoZGF0YS50eXBlIHx8ICdvdGhlcicpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHRoaXMuI21ldGhvZCA9IGRhdGEucmVxdWVzdC5tZXRob2Q7XG4gICAgICAgIHRoaXMuI3Bvc3REYXRhID0gZGF0YS5yZXF1ZXN0LnBvc3REYXRhO1xuICAgICAgICB0aGlzLiNoYXNQb3N0RGF0YSA9IGRhdGEucmVxdWVzdC5oYXNQb3N0RGF0YSA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy4jZnJhbWUgPSBmcmFtZTtcbiAgICAgICAgdGhpcy5fcmVkaXJlY3RDaGFpbiA9IHJlZGlyZWN0Q2hhaW47XG4gICAgICAgIHRoaXMuI2luaXRpYXRvciA9IGRhdGEuaW5pdGlhdG9yO1xuICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5lbmFibGVkID0gYWxsb3dJbnRlcmNlcHRpb247XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEucmVxdWVzdC5oZWFkZXJzKSkge1xuICAgICAgICAgICAgdGhpcy4jaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN1cmw7XG4gICAgfVxuICAgIHJlc291cmNlVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlVHlwZTtcbiAgICB9XG4gICAgbWV0aG9kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWV0aG9kO1xuICAgIH1cbiAgICBwb3N0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Bvc3REYXRhO1xuICAgIH1cbiAgICBoYXNQb3N0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hhc1Bvc3REYXRhO1xuICAgIH1cbiAgICBhc3luYyBmZXRjaFBvc3REYXRhKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ05ldHdvcmsuZ2V0UmVxdWVzdFBvc3REYXRhJywge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5wb3N0RGF0YTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hlYWRlcnM7XG4gICAgfVxuICAgIHJlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2U7XG4gICAgfVxuICAgIGZyYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWU7XG4gICAgfVxuICAgIGlzTmF2aWdhdGlvblJlcXVlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc05hdmlnYXRpb25SZXF1ZXN0O1xuICAgIH1cbiAgICBpbml0aWF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpbml0aWF0b3I7XG4gICAgfVxuICAgIHJlZGlyZWN0Q2hhaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWRpcmVjdENoYWluLnNsaWNlKCk7XG4gICAgfVxuICAgIGZhaWx1cmUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZmFpbHVyZVRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvclRleHQ6IHRoaXMuX2ZhaWx1cmVUZXh0LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBfY29udGludWUob3ZlcnJpZGVzID0ge30pIHtcbiAgICAgICAgY29uc3QgeyB1cmwsIG1ldGhvZCwgcG9zdERhdGEsIGhlYWRlcnMgfSA9IG92ZXJyaWRlcztcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHBvc3REYXRhQmluYXJ5QmFzZTY0ID0gcG9zdERhdGEgPyBidG9hKHBvc3REYXRhKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMuX2ludGVyY2VwdGlvbklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSFRUUFJlcXVlc3QgaXMgbWlzc2luZyBfaW50ZXJjZXB0aW9uSWQgbmVlZGVkIGZvciBGZXRjaC5jb250aW51ZVJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnRcbiAgICAgICAgICAgIC5zZW5kKCdGZXRjaC5jb250aW51ZVJlcXVlc3QnLCB7XG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHRoaXMuX2ludGVyY2VwdGlvbklkLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgcG9zdERhdGE6IHBvc3REYXRhQmluYXJ5QmFzZTY0LFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyA/IGhlYWRlcnNBcnJheShoZWFkZXJzKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5oYW5kbGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX3Jlc3BvbmQocmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGxldCBwYXJzZWRCb2R5O1xuICAgICAgICBpZiAocmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgcGFyc2VkQm9keSA9IEhUVFBSZXF1ZXN0LmdldFJlc3BvbnNlKHJlc3BvbnNlLmJvZHkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgb2YgT2JqZWN0LmtleXMocmVzcG9uc2UuaGVhZGVycykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3BvbnNlLmhlYWRlcnNbaGVhZGVyXTtcbiAgICAgICAgICAgICAgICByZXNwb25zZUhlYWRlcnNbaGVhZGVyLnRvTG93ZXJDYXNlKCldID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyB2YWx1ZS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLmNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICByZXNwb25zZUhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gcmVzcG9uc2UuY29udGVudFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZEJvZHk/LmNvbnRlbnRMZW5ndGggJiYgISgnY29udGVudC1sZW5ndGgnIGluIHJlc3BvbnNlSGVhZGVycykpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9IFN0cmluZyhwYXJzZWRCb2R5LmNvbnRlbnRMZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cyB8fCAyMDA7XG4gICAgICAgIGlmICh0aGlzLl9pbnRlcmNlcHRpb25JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hUVFBSZXF1ZXN0IGlzIG1pc3NpbmcgX2ludGVyY2VwdGlvbklkIG5lZWRlZCBmb3IgRmV0Y2guZnVsZmlsbFJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnRcbiAgICAgICAgICAgIC5zZW5kKCdGZXRjaC5mdWxmaWxsUmVxdWVzdCcsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZDogdGhpcy5faW50ZXJjZXB0aW9uSWQsXG4gICAgICAgICAgICByZXNwb25zZUNvZGU6IHN0YXR1cyxcbiAgICAgICAgICAgIHJlc3BvbnNlUGhyYXNlOiBTVEFUVVNfVEVYVFNbc3RhdHVzXSxcbiAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyczogaGVhZGVyc0FycmF5KHJlc3BvbnNlSGVhZGVycyksXG4gICAgICAgICAgICBib2R5OiBwYXJzZWRCb2R5Py5iYXNlNjQsXG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHRpb24uaGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUVycm9yKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIF9hYm9ydChlcnJvclJlYXNvbikge1xuICAgICAgICB0aGlzLmludGVyY2VwdGlvbi5oYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuX2ludGVyY2VwdGlvbklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSFRUUFJlcXVlc3QgaXMgbWlzc2luZyBfaW50ZXJjZXB0aW9uSWQgbmVlZGVkIGZvciBGZXRjaC5mYWlsUmVxdWVzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudFxuICAgICAgICAgICAgLnNlbmQoJ0ZldGNoLmZhaWxSZXF1ZXN0Jywge1xuICAgICAgICAgICAgcmVxdWVzdElkOiB0aGlzLl9pbnRlcmNlcHRpb25JZCxcbiAgICAgICAgICAgIGVycm9yUmVhc29uOiBlcnJvclJlYXNvbiB8fCAnRmFpbGVkJyxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChoYW5kbGVFcnJvcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SFRUUFJlcXVlc3QuanMubWFwIiwiaW1wb3J0IHsgSFRUUFJlc3BvbnNlIH0gZnJvbSAnLi4vYXBpL0hUVFBSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBQcm90b2NvbEVycm9yIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eURldGFpbHMgfSBmcm9tICcuLi9jb21tb24vU2VjdXJpdHlEZXRhaWxzLmpzJztcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi4vdXRpbC9EZWZlcnJlZC5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwSFRUUFJlc3BvbnNlIGV4dGVuZHMgSFRUUFJlc3BvbnNlIHtcbiAgICAjY2xpZW50O1xuICAgICNyZXF1ZXN0O1xuICAgICNjb250ZW50UHJvbWlzZSA9IG51bGw7XG4gICAgI2JvZHlMb2FkZWREZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICNyZW1vdGVBZGRyZXNzO1xuICAgICNzdGF0dXM7XG4gICAgI3N0YXR1c1RleHQ7XG4gICAgI3VybDtcbiAgICAjZnJvbURpc2tDYWNoZTtcbiAgICAjZnJvbVNlcnZpY2VXb3JrZXI7XG4gICAgI2hlYWRlcnMgPSB7fTtcbiAgICAjc2VjdXJpdHlEZXRhaWxzO1xuICAgICN0aW1pbmc7XG4gICAgY29uc3RydWN0b3IoY2xpZW50LCByZXF1ZXN0LCByZXNwb25zZVBheWxvYWQsIGV4dHJhSW5mbykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3JlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICB0aGlzLiNyZW1vdGVBZGRyZXNzID0ge1xuICAgICAgICAgICAgaXA6IHJlc3BvbnNlUGF5bG9hZC5yZW1vdGVJUEFkZHJlc3MsXG4gICAgICAgICAgICBwb3J0OiByZXNwb25zZVBheWxvYWQucmVtb3RlUG9ydCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3RhdHVzVGV4dCA9XG4gICAgICAgICAgICB0aGlzLiNwYXJzZVN0YXR1c1RleHRGcm9tRXh0cmFJbmZvKGV4dHJhSW5mbykgfHxcbiAgICAgICAgICAgICAgICByZXNwb25zZVBheWxvYWQuc3RhdHVzVGV4dDtcbiAgICAgICAgdGhpcy4jdXJsID0gcmVxdWVzdC51cmwoKTtcbiAgICAgICAgdGhpcy4jZnJvbURpc2tDYWNoZSA9ICEhcmVzcG9uc2VQYXlsb2FkLmZyb21EaXNrQ2FjaGU7XG4gICAgICAgIHRoaXMuI2Zyb21TZXJ2aWNlV29ya2VyID0gISFyZXNwb25zZVBheWxvYWQuZnJvbVNlcnZpY2VXb3JrZXI7XG4gICAgICAgIHRoaXMuI3N0YXR1cyA9IGV4dHJhSW5mbyA/IGV4dHJhSW5mby5zdGF0dXNDb2RlIDogcmVzcG9uc2VQYXlsb2FkLnN0YXR1cztcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGV4dHJhSW5mbyA/IGV4dHJhSW5mby5oZWFkZXJzIDogcmVzcG9uc2VQYXlsb2FkLmhlYWRlcnM7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgICB0aGlzLiNoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3NlY3VyaXR5RGV0YWlscyA9IHJlc3BvbnNlUGF5bG9hZC5zZWN1cml0eURldGFpbHNcbiAgICAgICAgICAgID8gbmV3IFNlY3VyaXR5RGV0YWlscyhyZXNwb25zZVBheWxvYWQuc2VjdXJpdHlEZXRhaWxzKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICB0aGlzLiN0aW1pbmcgPSByZXNwb25zZVBheWxvYWQudGltaW5nIHx8IG51bGw7XG4gICAgfVxuICAgICNwYXJzZVN0YXR1c1RleHRGcm9tRXh0cmFJbmZvKGV4dHJhSW5mbykge1xuICAgICAgICBpZiAoIWV4dHJhSW5mbyB8fCAhZXh0cmFJbmZvLmhlYWRlcnNUZXh0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RMaW5lID0gZXh0cmFJbmZvLmhlYWRlcnNUZXh0LnNwbGl0KCdcXHInLCAxKVswXTtcbiAgICAgICAgaWYgKCFmaXJzdExpbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXRjaCA9IGZpcnN0TGluZS5tYXRjaCgvW14gXSogW14gXSogKC4qKS8pO1xuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzVGV4dCA9IG1hdGNoWzFdO1xuICAgICAgICBpZiAoIXN0YXR1c1RleHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdHVzVGV4dDtcbiAgICB9XG4gICAgX3Jlc29sdmVCb2R5KGVycikge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jYm9keUxvYWRlZERlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNib2R5TG9hZGVkRGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZW1vdGVBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmVtb3RlQWRkcmVzcztcbiAgICB9XG4gICAgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdXJsO1xuICAgIH1cbiAgICBzdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0dXM7XG4gICAgfVxuICAgIHN0YXR1c1RleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0dXNUZXh0O1xuICAgIH1cbiAgICBoZWFkZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaGVhZGVycztcbiAgICB9XG4gICAgc2VjdXJpdHlEZXRhaWxzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc2VjdXJpdHlEZXRhaWxzO1xuICAgIH1cbiAgICB0aW1pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0aW1pbmc7XG4gICAgfVxuICAgIGJ1ZmZlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNjb250ZW50UHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy4jY29udGVudFByb21pc2UgPSB0aGlzLiNib2R5TG9hZGVkRGVmZXJyZWRcbiAgICAgICAgICAgICAgICAudmFsdWVPclRocm93KClcbiAgICAgICAgICAgICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnTmV0d29yay5nZXRSZXNwb25zZUJvZHknLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHRoaXMuI3JlcXVlc3QuaWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20ocmVzcG9uc2UuYm9keSwgcmVzcG9uc2UuYmFzZTY0RW5jb2RlZCA/ICdiYXNlNjQnIDogJ3V0ZjgnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFByb3RvY29sRXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLm9yaWdpbmFsTWVzc2FnZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTm8gcmVzb3VyY2Ugd2l0aCBnaXZlbiBpZGVudGlmaWVyIGZvdW5kJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGJvZHkgZm9yIHRoaXMgcmVxdWVzdC4gVGhpcyBtaWdodCBoYXBwZW4gaWYgdGhlIHJlcXVlc3QgaXMgYSBwcmVmbGlnaHQgcmVxdWVzdC4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jY29udGVudFByb21pc2U7XG4gICAgfVxuICAgIHJlcXVlc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0O1xuICAgIH1cbiAgICBmcm9tQ2FjaGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmcm9tRGlza0NhY2hlIHx8IHRoaXMuI3JlcXVlc3QuX2Zyb21NZW1vcnlDYWNoZTtcbiAgICB9XG4gICAgZnJvbVNlcnZpY2VXb3JrZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmcm9tU2VydmljZVdvcmtlcjtcbiAgICB9XG4gICAgZnJhbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0LmZyYW1lKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SFRUUFJlc3BvbnNlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBLZXlib2FyZCwgTW91c2UsIE1vdXNlQnV0dG9uLCBUb3VjaHNjcmVlbiwgfSBmcm9tICcuLi9hcGkvSW5wdXQuanMnO1xuaW1wb3J0IHsgX2tleURlZmluaXRpb25zLCB9IGZyb20gJy4uL2NvbW1vbi9VU0tleWJvYXJkTGF5b3V0LmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBLZXlib2FyZCBleHRlbmRzIEtleWJvYXJkIHtcbiAgICAjY2xpZW50O1xuICAgICNwcmVzc2VkS2V5cyA9IG5ldyBTZXQoKTtcbiAgICBfbW9kaWZpZXJzID0gMDtcbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICB1cGRhdGVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgYXN5bmMgZG93bihrZXksIG9wdGlvbnMgPSB7XG4gICAgICAgIHRleHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgY29tbWFuZHM6IFtdLFxuICAgIH0pIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLiNrZXlEZXNjcmlwdGlvbkZvclN0cmluZyhrZXkpO1xuICAgICAgICBjb25zdCBhdXRvUmVwZWF0ID0gdGhpcy4jcHJlc3NlZEtleXMuaGFzKGRlc2NyaXB0aW9uLmNvZGUpO1xuICAgICAgICB0aGlzLiNwcmVzc2VkS2V5cy5hZGQoZGVzY3JpcHRpb24uY29kZSk7XG4gICAgICAgIHRoaXMuX21vZGlmaWVycyB8PSB0aGlzLiNtb2RpZmllckJpdChkZXNjcmlwdGlvbi5rZXkpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gb3B0aW9ucy50ZXh0ID09PSB1bmRlZmluZWQgPyBkZXNjcmlwdGlvbi50ZXh0IDogb3B0aW9ucy50ZXh0O1xuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hLZXlFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6IHRleHQgPyAna2V5RG93bicgOiAncmF3S2V5RG93bicsXG4gICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuX21vZGlmaWVycyxcbiAgICAgICAgICAgIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogZGVzY3JpcHRpb24ua2V5Q29kZSxcbiAgICAgICAgICAgIGNvZGU6IGRlc2NyaXB0aW9uLmNvZGUsXG4gICAgICAgICAgICBrZXk6IGRlc2NyaXB0aW9uLmtleSxcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgICB1bm1vZGlmaWVkVGV4dDogdGV4dCxcbiAgICAgICAgICAgIGF1dG9SZXBlYXQsXG4gICAgICAgICAgICBsb2NhdGlvbjogZGVzY3JpcHRpb24ubG9jYXRpb24sXG4gICAgICAgICAgICBpc0tleXBhZDogZGVzY3JpcHRpb24ubG9jYXRpb24gPT09IDMsXG4gICAgICAgICAgICBjb21tYW5kczogb3B0aW9ucy5jb21tYW5kcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICNtb2RpZmllckJpdChrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ0FsdCcpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdDb250cm9sJykge1xuICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ01ldGEnKSB7XG4gICAgICAgICAgICByZXR1cm4gNDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSAnU2hpZnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gODtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgI2tleURlc2NyaXB0aW9uRm9yU3RyaW5nKGtleVN0cmluZykge1xuICAgICAgICBjb25zdCBzaGlmdCA9IHRoaXMuX21vZGlmaWVycyAmIDg7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0ge1xuICAgICAgICAgICAga2V5OiAnJyxcbiAgICAgICAgICAgIGtleUNvZGU6IDAsXG4gICAgICAgICAgICBjb2RlOiAnJyxcbiAgICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgICAgbG9jYXRpb246IDAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBfa2V5RGVmaW5pdGlvbnNba2V5U3RyaW5nXTtcbiAgICAgICAgYXNzZXJ0KGRlZmluaXRpb24sIGBVbmtub3duIGtleTogXCIke2tleVN0cmluZ31cImApO1xuICAgICAgICBpZiAoZGVmaW5pdGlvbi5rZXkpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLmtleSA9IGRlZmluaXRpb24ua2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaGlmdCAmJiBkZWZpbml0aW9uLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi5rZXkgPSBkZWZpbml0aW9uLnNoaWZ0S2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZpbml0aW9uLmtleUNvZGUpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLmtleUNvZGUgPSBkZWZpbml0aW9uLmtleUNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoaWZ0ICYmIGRlZmluaXRpb24uc2hpZnRLZXlDb2RlKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi5rZXlDb2RlID0gZGVmaW5pdGlvbi5zaGlmdEtleUNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmluaXRpb24uY29kZSkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24uY29kZSA9IGRlZmluaXRpb24uY29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmaW5pdGlvbi5sb2NhdGlvbikge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24ubG9jYXRpb24gPSBkZWZpbml0aW9uLmxvY2F0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbi5rZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi50ZXh0ID0gZGVzY3JpcHRpb24ua2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZpbml0aW9uLnRleHQpIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLnRleHQgPSBkZWZpbml0aW9uLnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoaWZ0ICYmIGRlZmluaXRpb24uc2hpZnRUZXh0KSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbi50ZXh0ID0gZGVmaW5pdGlvbi5zaGlmdFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYW55IG1vZGlmaWVycyBiZXNpZGVzIHNoaWZ0IGFyZSBwcmVzc2VkLCBubyB0ZXh0IHNob3VsZCBiZSBzZW50XG4gICAgICAgIGlmICh0aGlzLl9tb2RpZmllcnMgJiB+OCkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24udGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgYXN5bmMgdXAoa2V5KSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy4ja2V5RGVzY3JpcHRpb25Gb3JTdHJpbmcoa2V5KTtcbiAgICAgICAgdGhpcy5fbW9kaWZpZXJzICY9IH50aGlzLiNtb2RpZmllckJpdChkZXNjcmlwdGlvbi5rZXkpO1xuICAgICAgICB0aGlzLiNwcmVzc2VkS2V5cy5kZWxldGUoZGVzY3JpcHRpb24uY29kZSk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaEtleUV2ZW50Jywge1xuICAgICAgICAgICAgdHlwZTogJ2tleVVwJyxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy5fbW9kaWZpZXJzLFxuICAgICAgICAgICAga2V5OiBkZXNjcmlwdGlvbi5rZXksXG4gICAgICAgICAgICB3aW5kb3dzVmlydHVhbEtleUNvZGU6IGRlc2NyaXB0aW9uLmtleUNvZGUsXG4gICAgICAgICAgICBjb2RlOiBkZXNjcmlwdGlvbi5jb2RlLFxuICAgICAgICAgICAgbG9jYXRpb246IGRlc2NyaXB0aW9uLmxvY2F0aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2VuZENoYXJhY3RlcihjaGFyKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5pbnNlcnRUZXh0JywgeyB0ZXh0OiBjaGFyIH0pO1xuICAgIH1cbiAgICBjaGFySXNLZXkoY2hhcikge1xuICAgICAgICByZXR1cm4gISFfa2V5RGVmaW5pdGlvbnNbY2hhcl07XG4gICAgfVxuICAgIGFzeW5jIHR5cGUodGV4dCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gb3B0aW9ucy5kZWxheSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hhciBvZiB0ZXh0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGFySXNLZXkoY2hhcikpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByZXNzKGNoYXIsIHsgZGVsYXkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChmLCBkZWxheSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRDaGFyYWN0ZXIoY2hhcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcHJlc3Moa2V5LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBkZWxheSA9IG51bGwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGF3YWl0IHRoaXMuZG93bihrZXksIG9wdGlvbnMpO1xuICAgICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKGYgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGYsIG9wdGlvbnMuZGVsYXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy51cChrZXkpO1xuICAgIH1cbn1cbmNvbnN0IGdldEZsYWcgPSAoYnV0dG9uKSA9PiB7XG4gICAgc3dpdGNoIChidXR0b24pIHtcbiAgICAgICAgY2FzZSBNb3VzZUJ1dHRvbi5MZWZ0OlxuICAgICAgICAgICAgcmV0dXJuIDEgLyogTW91c2VCdXR0b25GbGFnLkxlZnQgKi87XG4gICAgICAgIGNhc2UgTW91c2VCdXR0b24uUmlnaHQ6XG4gICAgICAgICAgICByZXR1cm4gMiAvKiBNb3VzZUJ1dHRvbkZsYWcuUmlnaHQgKi87XG4gICAgICAgIGNhc2UgTW91c2VCdXR0b24uTWlkZGxlOlxuICAgICAgICAgICAgcmV0dXJuIDQgLyogTW91c2VCdXR0b25GbGFnLk1pZGRsZSAqLztcbiAgICAgICAgY2FzZSBNb3VzZUJ1dHRvbi5CYWNrOlxuICAgICAgICAgICAgcmV0dXJuIDggLyogTW91c2VCdXR0b25GbGFnLkJhY2sgKi87XG4gICAgICAgIGNhc2UgTW91c2VCdXR0b24uRm9yd2FyZDpcbiAgICAgICAgICAgIHJldHVybiAxNiAvKiBNb3VzZUJ1dHRvbkZsYWcuRm9yd2FyZCAqLztcbiAgICB9XG59O1xuLyoqXG4gKiBUaGlzIHNob3VsZCBtYXRjaFxuICogaHR0cHM6Ly9zb3VyY2UuY2hyb21pdW0ub3JnL2Nocm9taXVtL2Nocm9taXVtL3NyYy8rL3JlZnMvaGVhZHMvbWFpbjpjb250ZW50L2Jyb3dzZXIvcmVuZGVyZXJfaG9zdC9pbnB1dC93ZWJfaW5wdXRfZXZlbnRfYnVpbGRlcnNfbWFjLm1tO2RyYz1hNjFiOTVjNjNiMGI3NWMxY2ZlODcyZDljOGNkZjkyN2MyMjYwNDZlO2Jwdj0xO2JwdD0xO2w9MjIxLlxuICovXG5jb25zdCBnZXRCdXR0b25Gcm9tUHJlc3NlZEJ1dHRvbnMgPSAoYnV0dG9ucykgPT4ge1xuICAgIGlmIChidXR0b25zICYgMSAvKiBNb3VzZUJ1dHRvbkZsYWcuTGVmdCAqLykge1xuICAgICAgICByZXR1cm4gTW91c2VCdXR0b24uTGVmdDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnV0dG9ucyAmIDIgLyogTW91c2VCdXR0b25GbGFnLlJpZ2h0ICovKSB7XG4gICAgICAgIHJldHVybiBNb3VzZUJ1dHRvbi5SaWdodDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnV0dG9ucyAmIDQgLyogTW91c2VCdXR0b25GbGFnLk1pZGRsZSAqLykge1xuICAgICAgICByZXR1cm4gTW91c2VCdXR0b24uTWlkZGxlO1xuICAgIH1cbiAgICBlbHNlIGlmIChidXR0b25zICYgOCAvKiBNb3VzZUJ1dHRvbkZsYWcuQmFjayAqLykge1xuICAgICAgICByZXR1cm4gTW91c2VCdXR0b24uQmFjaztcbiAgICB9XG4gICAgZWxzZSBpZiAoYnV0dG9ucyAmIDE2IC8qIE1vdXNlQnV0dG9uRmxhZy5Gb3J3YXJkICovKSB7XG4gICAgICAgIHJldHVybiBNb3VzZUJ1dHRvbi5Gb3J3YXJkO1xuICAgIH1cbiAgICByZXR1cm4gJ25vbmUnO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBNb3VzZSBleHRlbmRzIE1vdXNlIHtcbiAgICAjY2xpZW50O1xuICAgICNrZXlib2FyZDtcbiAgICBjb25zdHJ1Y3RvcihjbGllbnQsIGtleWJvYXJkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICAgICAgdGhpcy4ja2V5Ym9hcmQgPSBrZXlib2FyZDtcbiAgICB9XG4gICAgdXBkYXRlQ2xpZW50KGNsaWVudCkge1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgICNfc3RhdGUgPSB7XG4gICAgICAgIHBvc2l0aW9uOiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgYnV0dG9uczogMCAvKiBNb3VzZUJ1dHRvbkZsYWcuTm9uZSAqLyxcbiAgICB9O1xuICAgIGdldCAjc3RhdGUoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgLi4udGhpcy4jX3N0YXRlIH0sIC4uLnRoaXMuI3RyYW5zYWN0aW9ucyk7XG4gICAgfVxuICAgIC8vIFRyYW5zYWN0aW9ucyBjYW4gcnVuIGluIHBhcmFsbGVsLCBzbyB3ZSBzdG9yZSBlYWNoIG9mIHRobWUgaW4gdGhpcyBhcnJheS5cbiAgICAjdHJhbnNhY3Rpb25zID0gW107XG4gICAgI2NyZWF0ZVRyYW5zYWN0aW9uKCkge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHt9O1xuICAgICAgICB0aGlzLiN0cmFuc2FjdGlvbnMucHVzaCh0cmFuc2FjdGlvbik7XG4gICAgICAgIGNvbnN0IHBvcFRyYW5zYWN0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jdHJhbnNhY3Rpb25zLnNwbGljZSh0aGlzLiN0cmFuc2FjdGlvbnMuaW5kZXhPZih0cmFuc2FjdGlvbiksIDEpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXBkYXRlOiAodXBkYXRlcykgPT4ge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odHJhbnNhY3Rpb24sIHVwZGF0ZXMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbW1pdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI19zdGF0ZSA9IHsgLi4udGhpcy4jX3N0YXRlLCAuLi50cmFuc2FjdGlvbiB9O1xuICAgICAgICAgICAgICAgIHBvcFRyYW5zYWN0aW9uKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm9sbGJhY2s6IHBvcFRyYW5zYWN0aW9uLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIGEgdHlwaWNhbCB1cGRhdGUsIGNvbW1pdC9yb2xsYmFjayBsaWZlY3ljbGUgYmFzZWQgb25cbiAgICAgKiB0aGUgZXJyb3Igb2YgdGhlIGFjdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyAjd2l0aFRyYW5zYWN0aW9uKGFjdGlvbikge1xuICAgICAgICBjb25zdCB7IHVwZGF0ZSwgY29tbWl0LCByb2xsYmFjayB9ID0gdGhpcy4jY3JlYXRlVHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGFjdGlvbih1cGRhdGUpO1xuICAgICAgICAgICAgY29tbWl0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByb2xsYmFjaygpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcmVzZXQoKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbZmxhZywgYnV0dG9uXSBvZiBbXG4gICAgICAgICAgICBbMSAvKiBNb3VzZUJ1dHRvbkZsYWcuTGVmdCAqLywgTW91c2VCdXR0b24uTGVmdF0sXG4gICAgICAgICAgICBbNCAvKiBNb3VzZUJ1dHRvbkZsYWcuTWlkZGxlICovLCBNb3VzZUJ1dHRvbi5NaWRkbGVdLFxuICAgICAgICAgICAgWzIgLyogTW91c2VCdXR0b25GbGFnLlJpZ2h0ICovLCBNb3VzZUJ1dHRvbi5SaWdodF0sXG4gICAgICAgICAgICBbMTYgLyogTW91c2VCdXR0b25GbGFnLkZvcndhcmQgKi8sIE1vdXNlQnV0dG9uLkZvcndhcmRdLFxuICAgICAgICAgICAgWzggLyogTW91c2VCdXR0b25GbGFnLkJhY2sgKi8sIE1vdXNlQnV0dG9uLkJhY2tdLFxuICAgICAgICBdKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jc3RhdGUuYnV0dG9ucyAmIGZsYWcpIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zLnB1c2godGhpcy51cCh7IGJ1dHRvbjogYnV0dG9uIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jc3RhdGUucG9zaXRpb24ueCAhPT0gMCB8fCB0aGlzLiNzdGF0ZS5wb3NpdGlvbi55ICE9PSAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2godGhpcy5tb3ZlKDAsIDApKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChhY3Rpb25zKTtcbiAgICB9XG4gICAgYXN5bmMgbW92ZSh4LCB5LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBzdGVwcyA9IDEgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGZyb20gPSB0aGlzLiNzdGF0ZS5wb3NpdGlvbjtcbiAgICAgICAgY29uc3QgdG8gPSB7IHgsIHkgfTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gc3RlcHM7IGkrKykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jd2l0aFRyYW5zYWN0aW9uKHVwZGF0ZVN0YXRlID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBmcm9tLnggKyAodG8ueCAtIGZyb20ueCkgKiAoaSAvIHN0ZXBzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IGZyb20ueSArICh0by55IC0gZnJvbS55KSAqIChpIC8gc3RlcHMpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYnV0dG9ucywgcG9zaXRpb24gfSA9IHRoaXMuI3N0YXRlO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50Jywge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbW91c2VNb3ZlZCcsXG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uOiBnZXRCdXR0b25Gcm9tUHJlc3NlZEJ1dHRvbnMoYnV0dG9ucyksXG4gICAgICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZG93bihvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBidXR0b24gPSBNb3VzZUJ1dHRvbi5MZWZ0LCBjbGlja0NvdW50ID0gMSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZmxhZyA9IGdldEZsYWcoYnV0dG9uKTtcbiAgICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG1vdXNlIGJ1dHRvbjogJHtidXR0b259YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3N0YXRlLmJ1dHRvbnMgJiBmbGFnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2J1dHRvbn0nIGlzIGFscmVhZHkgcHJlc3NlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiN3aXRoVHJhbnNhY3Rpb24odXBkYXRlU3RhdGUgPT4ge1xuICAgICAgICAgICAgdXBkYXRlU3RhdGUoe1xuICAgICAgICAgICAgICAgIGJ1dHRvbnM6IHRoaXMuI3N0YXRlLmJ1dHRvbnMgfCBmbGFnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB7IGJ1dHRvbnMsIHBvc2l0aW9uIH0gPSB0aGlzLiNzdGF0ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50Jywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdtb3VzZVByZXNzZWQnLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgICAgICAgICBjbGlja0NvdW50LFxuICAgICAgICAgICAgICAgIGJ1dHRvbnMsXG4gICAgICAgICAgICAgICAgYnV0dG9uLFxuICAgICAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyB1cChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBidXR0b24gPSBNb3VzZUJ1dHRvbi5MZWZ0LCBjbGlja0NvdW50ID0gMSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZmxhZyA9IGdldEZsYWcoYnV0dG9uKTtcbiAgICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG1vdXNlIGJ1dHRvbjogJHtidXR0b259YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEodGhpcy4jc3RhdGUuYnV0dG9ucyAmIGZsYWcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2J1dHRvbn0nIGlzIG5vdCBwcmVzc2VkLmApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI3dpdGhUcmFuc2FjdGlvbih1cGRhdGVTdGF0ZSA9PiB7XG4gICAgICAgICAgICB1cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgICAgICAgYnV0dG9uczogdGhpcy4jc3RhdGUuYnV0dG9ucyAmIH5mbGFnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB7IGJ1dHRvbnMsIHBvc2l0aW9uIH0gPSB0aGlzLiNzdGF0ZTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hNb3VzZUV2ZW50Jywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdtb3VzZVJlbGVhc2VkJyxcbiAgICAgICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuI2tleWJvYXJkLl9tb2RpZmllcnMsXG4gICAgICAgICAgICAgICAgY2xpY2tDb3VudCxcbiAgICAgICAgICAgICAgICBidXR0b25zLFxuICAgICAgICAgICAgICAgIGJ1dHRvbixcbiAgICAgICAgICAgICAgICAuLi5wb3NpdGlvbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgY2xpY2soeCwgeSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXksIGNvdW50ID0gMSwgY2xpY2tDb3VudCA9IGNvdW50IH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAoY291bnQgPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NsaWNrIG11c3Qgb2NjdXIgYSBwb3NpdGl2ZSBudW1iZXIgb2YgdGltZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0aW9ucyA9IFt0aGlzLm1vdmUoeCwgeSldO1xuICAgICAgICBpZiAoY2xpY2tDb3VudCA9PT0gY291bnQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY291bnQ7ICsraSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaCh0aGlzLmRvd24oeyAuLi5vcHRpb25zLCBjbGlja0NvdW50OiBpIH0pLCB0aGlzLnVwKHsgLi4ub3B0aW9ucywgY2xpY2tDb3VudDogaSB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWN0aW9ucy5wdXNoKHRoaXMuZG93bih7IC4uLm9wdGlvbnMsIGNsaWNrQ291bnQgfSkpO1xuICAgICAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYWN0aW9ucyk7XG4gICAgICAgICAgICBhY3Rpb25zLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGFjdGlvbnMucHVzaCh0aGlzLnVwKHsgLi4ub3B0aW9ucywgY2xpY2tDb3VudCB9KSk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGFjdGlvbnMpO1xuICAgIH1cbiAgICBhc3luYyB3aGVlbChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBkZWx0YVggPSAwLCBkZWx0YVkgPSAwIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCB7IHBvc2l0aW9uLCBidXR0b25zIH0gPSB0aGlzLiNzdGF0ZTtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ0lucHV0LmRpc3BhdGNoTW91c2VFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdtb3VzZVdoZWVsJyxcbiAgICAgICAgICAgIHBvaW50ZXJUeXBlOiAnbW91c2UnLFxuICAgICAgICAgICAgbW9kaWZpZXJzOiB0aGlzLiNrZXlib2FyZC5fbW9kaWZpZXJzLFxuICAgICAgICAgICAgZGVsdGFZLFxuICAgICAgICAgICAgZGVsdGFYLFxuICAgICAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgICAgIC4uLnBvc2l0aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZyhzdGFydCwgdGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2NsaWVudC5vbmNlKCdJbnB1dC5kcmFnSW50ZXJjZXB0ZWQnLCBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMubW92ZShzdGFydC54LCBzdGFydC55KTtcbiAgICAgICAgYXdhaXQgdGhpcy5kb3duKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubW92ZSh0YXJnZXQueCwgdGFyZ2V0LnkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZ0VudGVyKHRhcmdldCwgZGF0YSkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hEcmFnRXZlbnQnLCB7XG4gICAgICAgICAgICB0eXBlOiAnZHJhZ0VudGVyJyxcbiAgICAgICAgICAgIHg6IHRhcmdldC54LFxuICAgICAgICAgICAgeTogdGFyZ2V0LnksXG4gICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuI2tleWJvYXJkLl9tb2RpZmllcnMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZ092ZXIodGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaERyYWdFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdkcmFnT3ZlcicsXG4gICAgICAgICAgICB4OiB0YXJnZXQueCxcbiAgICAgICAgICAgIHk6IHRhcmdldC55LFxuICAgICAgICAgICAgbW9kaWZpZXJzOiB0aGlzLiNrZXlib2FyZC5fbW9kaWZpZXJzLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGRyb3AodGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaERyYWdFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICdkcm9wJyxcbiAgICAgICAgICAgIHg6IHRhcmdldC54LFxuICAgICAgICAgICAgeTogdGFyZ2V0LnksXG4gICAgICAgICAgICBtb2RpZmllcnM6IHRoaXMuI2tleWJvYXJkLl9tb2RpZmllcnMsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZHJhZ0FuZERyb3Aoc3RhcnQsIHRhcmdldCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgZGVsYXkgPSBudWxsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5kcmFnKHN0YXJ0LCB0YXJnZXQpO1xuICAgICAgICBhd2FpdCB0aGlzLmRyYWdFbnRlcih0YXJnZXQsIGRhdGEpO1xuICAgICAgICBhd2FpdCB0aGlzLmRyYWdPdmVyKHRhcmdldCwgZGF0YSk7XG4gICAgICAgIGlmIChkZWxheSkge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5kcm9wKHRhcmdldCwgZGF0YSk7XG4gICAgICAgIGF3YWl0IHRoaXMudXAoKTtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwVG91Y2hzY3JlZW4gZXh0ZW5kcyBUb3VjaHNjcmVlbiB7XG4gICAgI2NsaWVudDtcbiAgICAja2V5Ym9hcmQ7XG4gICAgY29uc3RydWN0b3IoY2xpZW50LCBrZXlib2FyZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNjbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI2tleWJvYXJkID0ga2V5Ym9hcmQ7XG4gICAgfVxuICAgIHVwZGF0ZUNsaWVudChjbGllbnQpIHtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICBhc3luYyB0b3VjaFN0YXJ0KHgsIHkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jY2xpZW50LnNlbmQoJ0lucHV0LmRpc3BhdGNoVG91Y2hFdmVudCcsIHtcbiAgICAgICAgICAgIHR5cGU6ICd0b3VjaFN0YXJ0JyxcbiAgICAgICAgICAgIHRvdWNoUG9pbnRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB4OiBNYXRoLnJvdW5kKHgpLFxuICAgICAgICAgICAgICAgICAgICB5OiBNYXRoLnJvdW5kKHkpLFxuICAgICAgICAgICAgICAgICAgICByYWRpdXNYOiAwLjUsXG4gICAgICAgICAgICAgICAgICAgIHJhZGl1c1k6IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2U6IDAuNSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHRvdWNoTW92ZSh4LCB5KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdJbnB1dC5kaXNwYXRjaFRvdWNoRXZlbnQnLCB7XG4gICAgICAgICAgICB0eXBlOiAndG91Y2hNb3ZlJyxcbiAgICAgICAgICAgIHRvdWNoUG9pbnRzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB4OiBNYXRoLnJvdW5kKHgpLFxuICAgICAgICAgICAgICAgICAgICB5OiBNYXRoLnJvdW5kKHkpLFxuICAgICAgICAgICAgICAgICAgICByYWRpdXNYOiAwLjUsXG4gICAgICAgICAgICAgICAgICAgIHJhZGl1c1k6IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2U6IDAuNSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHRvdWNoRW5kKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNjbGllbnQuc2VuZCgnSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50Jywge1xuICAgICAgICAgICAgdHlwZTogJ3RvdWNoRW5kJyxcbiAgICAgICAgICAgIHRvdWNoUG9pbnRzOiBbXSxcbiAgICAgICAgICAgIG1vZGlmaWVyczogdGhpcy4ja2V5Ym9hcmQuX21vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5wdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBtYXAsIHJhY2VXaXRoIH0gZnJvbSAnLi4vLi4vdGhpcmRfcGFydHkvcnhqcy9yeGpzLmpzJztcbmltcG9ydCB7IFJlYWxtIH0gZnJvbSAnLi4vYXBpL1JlYWxtLmpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL2NvbW1vbi9FdmVudEVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZnJvbUVtaXR0ZXJFdmVudCwgdGltZW91dCwgd2l0aFNvdXJjZVB1cHBldGVlclVSTElmTm9uZSwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlU3ltYm9sIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IENkcEVsZW1lbnRIYW5kbGUgfSBmcm9tICcuL0VsZW1lbnRIYW5kbGUuanMnO1xuaW1wb3J0IHsgQ2RwSlNIYW5kbGUgfSBmcm9tICcuL0pTSGFuZGxlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBJc29sYXRlZFdvcmxkIGV4dGVuZHMgUmVhbG0ge1xuICAgICNjb250ZXh0O1xuICAgICNlbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICNmcmFtZU9yV29ya2VyO1xuICAgIGNvbnN0cnVjdG9yKGZyYW1lT3JXb3JrZXIsIHRpbWVvdXRTZXR0aW5ncykge1xuICAgICAgICBzdXBlcih0aW1lb3V0U2V0dGluZ3MpO1xuICAgICAgICB0aGlzLiNmcmFtZU9yV29ya2VyID0gZnJhbWVPcldvcmtlcjtcbiAgICB9XG4gICAgZ2V0IGVudmlyb25tZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVPcldvcmtlcjtcbiAgICB9XG4gICAgZ2V0IGNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZyYW1lT3JXb3JrZXIuY2xpZW50O1xuICAgIH1cbiAgICBnZXQgZW1pdHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2VtaXR0ZXI7XG4gICAgfVxuICAgIHNldENvbnRleHQoY29udGV4dCkge1xuICAgICAgICB0aGlzLiNjb250ZXh0Py5bZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgY29udGV4dC5vbmNlKCdkaXNwb3NlZCcsIHRoaXMuI29uQ29udGV4dERpc3Bvc2VkLmJpbmQodGhpcykpO1xuICAgICAgICBjb250ZXh0Lm9uKCdjb25zb2xlYXBpY2FsbGVkJywgdGhpcy4jb25Db250ZXh0Q29uc29sZUFwaUNhbGxlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgY29udGV4dC5vbignYmluZGluZ2NhbGxlZCcsIHRoaXMuI29uQ29udGV4dEJpbmRpbmdDYWxsZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuI2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLiNlbWl0dGVyLmVtaXQoJ2NvbnRleHQnLCBjb250ZXh0KTtcbiAgICAgICAgdm9pZCB0aGlzLnRhc2tNYW5hZ2VyLnJlcnVuQWxsKCk7XG4gICAgfVxuICAgICNvbkNvbnRleHREaXNwb3NlZCgpIHtcbiAgICAgICAgdGhpcy4jY29udGV4dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCdjbGVhckRvY3VtZW50SGFuZGxlJyBpbiB0aGlzLiNmcmFtZU9yV29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU9yV29ya2VyLmNsZWFyRG9jdW1lbnRIYW5kbGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjb25Db250ZXh0Q29uc29sZUFwaUNhbGxlZChldmVudCkge1xuICAgICAgICB0aGlzLiNlbWl0dGVyLmVtaXQoJ2NvbnNvbGVhcGljYWxsZWQnLCBldmVudCk7XG4gICAgfVxuICAgICNvbkNvbnRleHRCaW5kaW5nQ2FsbGVkKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuI2VtaXR0ZXIuZW1pdCgnYmluZGluZ2NhbGxlZCcsIGV2ZW50KTtcbiAgICB9XG4gICAgaGFzQ29udGV4dCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy4jY29udGV4dDtcbiAgICB9XG4gICAgZ2V0IGNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb250ZXh0O1xuICAgIH1cbiAgICAjZXhlY3V0aW9uQ29udGV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhlY3V0aW9uIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBkZXRhY2hlZCBmcmFtZSBvciB3b3JrZXIgXCIke3RoaXMuZW52aXJvbm1lbnQudXJsKCl9XCIgKGFyZSB5b3UgdHJ5aW5nIHRvIGV2YWx1YXRlPylgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jY29udGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2FpdHMgZm9yIHRoZSBuZXh0IGNvbnRleHQgdG8gYmUgc2V0IG9uIHRoZSBpc29sYXRlZCB3b3JsZC5cbiAgICAgKi9cbiAgICBhc3luYyAjd2FpdEZvckV4ZWN1dGlvbkNvbnRleHQoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGZyb21FbWl0dGVyRXZlbnQodGhpcy4jZW1pdHRlciwgJ2NvbnRleHQnKS5waXBlKHJhY2VXaXRoKGZyb21FbWl0dGVyRXZlbnQodGhpcy4jZW1pdHRlciwgJ2Rpc3Bvc2VkJykucGlwZShtYXAoKCkgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIG1lc3NhZ2UgaGFzIHRvIG1hdGNoIHRoZSBDRFAgbWVzc2FnZSBleHBlY3RlZCBieSB0aGUgV2FpdFRhc2sgY2xhc3MuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4ZWN1dGlvbiBjb250ZXh0IHdhcyBkZXN0cm95ZWQnKTtcbiAgICAgICAgfSkpLCB0aW1lb3V0KHRoaXMudGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSkpKSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIGV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGVIYW5kbGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgLy8gVGhpcyBjb2RlIG5lZWRzIHRvIHNjaGVkdWxlIGV2YWx1YXRlSGFuZGxlIGNhbGwgc3luY2hyb25pb3VzbHkgKGF0XG4gICAgICAgIC8vIGxlYXN0IHdoZW4gdGhlIGNvbnRleHQgaXMgdGhlcmUpIHNvIHdlIGNhbm5vdCB1bmNvbmRpdGlvbmFsbHlcbiAgICAgICAgLy8gYXdhaXQuXG4gICAgICAgIGxldCBjb250ZXh0ID0gdGhpcy4jZXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSBhd2FpdCB0aGlzLiN3YWl0Rm9yRXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBjb250ZXh0LmV2YWx1YXRlSGFuZGxlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgfVxuICAgIGFzeW5jIGV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICBwYWdlRnVuY3Rpb24gPSB3aXRoU291cmNlUHVwcGV0ZWVyVVJMSWZOb25lKHRoaXMuZXZhbHVhdGUubmFtZSwgcGFnZUZ1bmN0aW9uKTtcbiAgICAgICAgLy8gVGhpcyBjb2RlIG5lZWRzIHRvIHNjaGVkdWxlIGV2YWx1YXRlIGNhbGwgc3luY2hyb25pb3VzbHkgKGF0XG4gICAgICAgIC8vIGxlYXN0IHdoZW4gdGhlIGNvbnRleHQgaXMgdGhlcmUpIHNvIHdlIGNhbm5vdCB1bmNvbmRpdGlvbmFsbHlcbiAgICAgICAgLy8gYXdhaXQuXG4gICAgICAgIGxldCBjb250ZXh0ID0gdGhpcy4jZXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSBhd2FpdCB0aGlzLiN3YWl0Rm9yRXhlY3V0aW9uQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBjb250ZXh0LmV2YWx1YXRlKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgfVxuICAgIGFzeW5jIGFkb3B0QmFja2VuZE5vZGUoYmFja2VuZE5vZGVJZCkge1xuICAgICAgICAvLyBUaGlzIGNvZGUgbmVlZHMgdG8gc2NoZWR1bGUgcmVzb2x2ZU5vZGUgY2FsbCBzeW5jaHJvbmlvdXNseSAoYXRcbiAgICAgICAgLy8gbGVhc3Qgd2hlbiB0aGUgY29udGV4dCBpcyB0aGVyZSkgc28gd2UgY2Fubm90IHVuY29uZGl0aW9uYWxseVxuICAgICAgICAvLyBhd2FpdC5cbiAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLiNleGVjdXRpb25Db250ZXh0KCk7XG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgICAgY29udGV4dCA9IGF3YWl0IHRoaXMuI3dhaXRGb3JFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBvYmplY3QgfSA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoJ0RPTS5yZXNvbHZlTm9kZScsIHtcbiAgICAgICAgICAgIGJhY2tlbmROb2RlSWQ6IGJhY2tlbmROb2RlSWQsXG4gICAgICAgICAgICBleGVjdXRpb25Db250ZXh0SWQ6IGNvbnRleHQuaWQsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDZHBIYW5kbGUob2JqZWN0KTtcbiAgICB9XG4gICAgYXN5bmMgYWRvcHRIYW5kbGUoaGFuZGxlKSB7XG4gICAgICAgIGlmIChoYW5kbGUucmVhbG0gPT09IHRoaXMpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb250ZXh0IGhhcyBhbHJlYWR5IGFkb3B0ZWQgdGhpcyBoYW5kbGUsIGNsb25lIGl0IHNvIGRvd25zdHJlYW1cbiAgICAgICAgICAgIC8vIGRpc3Bvc2FsIGRvZXNuJ3QgYmVjb21lIGFuIGlzc3VlLlxuICAgICAgICAgICAgcmV0dXJuIChhd2FpdCBoYW5kbGUuZXZhbHVhdGVIYW5kbGUodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub2RlSW5mbyA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoJ0RPTS5kZXNjcmliZU5vZGUnLCB7XG4gICAgICAgICAgICBvYmplY3RJZDogaGFuZGxlLmlkLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmFkb3B0QmFja2VuZE5vZGUobm9kZUluZm8ubm9kZS5iYWNrZW5kTm9kZUlkKSk7XG4gICAgfVxuICAgIGFzeW5jIHRyYW5zZmVySGFuZGxlKGhhbmRsZSkge1xuICAgICAgICBpZiAoaGFuZGxlLnJlYWxtID09PSB0aGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEltcGxpZXMgaXQncyBhIHByaW1pdGl2ZSB2YWx1ZSwgcHJvYmFibHkuXG4gICAgICAgIGlmIChoYW5kbGUucmVtb3RlT2JqZWN0KCkub2JqZWN0SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnRE9NLmRlc2NyaWJlTm9kZScsIHtcbiAgICAgICAgICAgIG9iamVjdElkOiBoYW5kbGUucmVtb3RlT2JqZWN0KCkub2JqZWN0SWQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBuZXdIYW5kbGUgPSAoYXdhaXQgdGhpcy5hZG9wdEJhY2tlbmROb2RlKGluZm8ubm9kZS5iYWNrZW5kTm9kZUlkKSk7XG4gICAgICAgIGF3YWl0IGhhbmRsZS5kaXNwb3NlKCk7XG4gICAgICAgIHJldHVybiBuZXdIYW5kbGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNyZWF0ZUNkcEhhbmRsZShyZW1vdGVPYmplY3QpIHtcbiAgICAgICAgaWYgKHJlbW90ZU9iamVjdC5zdWJ0eXBlID09PSAnbm9kZScpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ2RwRWxlbWVudEhhbmRsZSh0aGlzLCByZW1vdGVPYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ2RwSlNIYW5kbGUodGhpcywgcmVtb3RlT2JqZWN0KTtcbiAgICB9XG4gICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICB0aGlzLiNjb250ZXh0Py5bZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgdGhpcy4jZW1pdHRlci5lbWl0KCdkaXNwb3NlZCcsIHVuZGVmaW5lZCk7XG4gICAgICAgIHN1cGVyW2Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIHRoaXMuI2VtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SXNvbGF0ZWRXb3JsZC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBBIHVuaXF1ZSBrZXkgZm9yIHtAbGluayBJc29sYXRlZFdvcmxkQ2hhcnR9IHRvIGRlbm90ZSB0aGUgZGVmYXVsdCB3b3JsZC5cbiAqIEV4ZWN1dGlvbiBjb250ZXh0cyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGluIHRoZSBkZWZhdWx0IHdvcmxkLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTUFJTl9XT1JMRCA9IFN5bWJvbCgnbWFpbldvcmxkJyk7XG4vKipcbiAqIEEgdW5pcXVlIGtleSBmb3Ige0BsaW5rIElzb2xhdGVkV29ybGRDaGFydH0gdG8gZGVub3RlIHRoZSBwdXBwZXRlZXIgd29ybGQuXG4gKiBUaGlzIHdvcmxkIGNvbnRhaW5zIGFsbCBwdXBwZXRlZXItaW50ZXJuYWwgYmluZGluZ3MvY29kZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFBVUFBFVEVFUl9XT1JMRCA9IFN5bWJvbCgncHVwcGV0ZWVyV29ybGQnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlzb2xhdGVkV29ybGRzLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBKU0hhbmRsZSB9IGZyb20gJy4uL2FwaS9KU0hhbmRsZS5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgdmFsdWVGcm9tUmVtb3RlT2JqZWN0IH0gZnJvbSAnLi91dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwSlNIYW5kbGUgZXh0ZW5kcyBKU0hhbmRsZSB7XG4gICAgI2Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgI3JlbW90ZU9iamVjdDtcbiAgICAjd29ybGQ7XG4gICAgY29uc3RydWN0b3Iod29ybGQsIHJlbW90ZU9iamVjdCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiN3b3JsZCA9IHdvcmxkO1xuICAgICAgICB0aGlzLiNyZW1vdGVPYmplY3QgPSByZW1vdGVPYmplY3Q7XG4gICAgfVxuICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VkO1xuICAgIH1cbiAgICBnZXQgcmVhbG0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3b3JsZDtcbiAgICB9XG4gICAgZ2V0IGNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhbG0uZW52aXJvbm1lbnQuY2xpZW50O1xuICAgIH1cbiAgICBhc3luYyBqc29uVmFsdWUoKSB7XG4gICAgICAgIGlmICghdGhpcy4jcmVtb3RlT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVGcm9tUmVtb3RlT2JqZWN0KHRoaXMuI3JlbW90ZU9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKG9iamVjdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHNlcmlhbGl6ZSByZWZlcmVuY2VkIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGBudWxsYCBvciB0aGUgaGFuZGxlIGl0c2VsZiBpZiB0aGUgaGFuZGxlIGlzIGFuXG4gICAgICogaW5zdGFuY2Ugb2Yge0BsaW5rIEVsZW1lbnRIYW5kbGV9LlxuICAgICAqL1xuICAgIGFzRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGFzeW5jIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgcmVsZWFzZU9iamVjdCh0aGlzLmNsaWVudCwgdGhpcy4jcmVtb3RlT2JqZWN0KTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmICghdGhpcy4jcmVtb3RlT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICByZXR1cm4gJ0pTSGFuZGxlOicgKyB2YWx1ZUZyb21SZW1vdGVPYmplY3QodGhpcy4jcmVtb3RlT2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy4jcmVtb3RlT2JqZWN0LnN1YnR5cGUgfHwgdGhpcy4jcmVtb3RlT2JqZWN0LnR5cGU7XG4gICAgICAgIHJldHVybiAnSlNIYW5kbGVAJyArIHR5cGU7XG4gICAgfVxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3JlbW90ZU9iamVjdC5vYmplY3RJZDtcbiAgICB9XG4gICAgcmVtb3RlT2JqZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmVtb3RlT2JqZWN0O1xuICAgIH1cbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKCkge1xuICAgICAgICAvLyBXZSB1c2UgUnVudGltZS5nZXRQcm9wZXJ0aWVzIHJhdGhlciB0aGFuIGl0ZXJhdGl2ZSB2ZXJzaW9uIGZvclxuICAgICAgICAvLyBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhcyBpdCBhbGxvd3MgZ2V0dGluZyBldmVyeXRoaW5nIGF0IG9uY2UuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgnUnVudGltZS5nZXRQcm9wZXJ0aWVzJywge1xuICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuI3JlbW90ZU9iamVjdC5vYmplY3RJZCxcbiAgICAgICAgICAgIG93blByb3BlcnRpZXM6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcmVzcG9uc2UucmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5LmVudW1lcmFibGUgfHwgIXByb3BlcnR5LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQuc2V0KHByb3BlcnR5Lm5hbWUsIHRoaXMuI3dvcmxkLmNyZWF0ZUNkcEhhbmRsZShwcm9wZXJ0eS52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbGVhc2VPYmplY3QoY2xpZW50LCByZW1vdGVPYmplY3QpIHtcbiAgICBpZiAoIXJlbW90ZU9iamVjdC5vYmplY3RJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGNsaWVudFxuICAgICAgICAuc2VuZCgnUnVudGltZS5yZWxlYXNlT2JqZWN0JywgeyBvYmplY3RJZDogcmVtb3RlT2JqZWN0Lm9iamVjdElkIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIC8vIEV4Y2VwdGlvbnMgbWlnaHQgaGFwcGVuIGluIGNhc2Ugb2YgYSBwYWdlIGJlZW4gbmF2aWdhdGVkIG9yIGNsb3NlZC5cbiAgICAgICAgLy8gU3dhbGxvdyB0aGVzZSBzaW5jZSB0aGV5IGFyZSBoYXJtbGVzcyBhbmQgd2UgZG9uJ3QgbGVhayBhbnl0aGluZyBpbiB0aGlzIGNhc2UuXG4gICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SlNIYW5kbGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IEZyYW1lRXZlbnQgfSBmcm9tICcuLi9hcGkvRnJhbWUuanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vY29tbW9uL0V2ZW50RW1pdHRlci5qcyc7XG5pbXBvcnQgeyBOZXR3b3JrTWFuYWdlckV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL05ldHdvcmtNYW5hZ2VyRXZlbnRzLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi4vdXRpbC9EZWZlcnJlZC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2sgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgRnJhbWVNYW5hZ2VyRXZlbnQgfSBmcm9tICcuL0ZyYW1lTWFuYWdlckV2ZW50cy5qcyc7XG5jb25zdCBwdXBwZXRlZXJUb1Byb3RvY29sTGlmZWN5Y2xlID0gbmV3IE1hcChbXG4gICAgWydsb2FkJywgJ2xvYWQnXSxcbiAgICBbJ2RvbWNvbnRlbnRsb2FkZWQnLCAnRE9NQ29udGVudExvYWRlZCddLFxuICAgIFsnbmV0d29ya2lkbGUwJywgJ25ldHdvcmtJZGxlJ10sXG4gICAgWyduZXR3b3JraWRsZTInLCAnbmV0d29ya0FsbW9zdElkbGUnXSxcbl0pO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIExpZmVjeWNsZVdhdGNoZXIge1xuICAgICNleHBlY3RlZExpZmVjeWNsZTtcbiAgICAjZnJhbWU7XG4gICAgI3RpbWVvdXQ7XG4gICAgI25hdmlnYXRpb25SZXF1ZXN0ID0gbnVsbDtcbiAgICAjc3Vic2NyaXB0aW9ucyA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTtcbiAgICAjaW5pdGlhbExvYWRlcklkO1xuICAgICN0ZXJtaW5hdGlvbkRlZmVycmVkO1xuICAgICNzYW1lRG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAjbGlmZWN5Y2xlRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAjbmV3RG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAjaGFzU2FtZURvY3VtZW50TmF2aWdhdGlvbjtcbiAgICAjc3dhcHBlZDtcbiAgICAjbmF2aWdhdGlvblJlc3BvbnNlUmVjZWl2ZWQ7XG4gICAgY29uc3RydWN0b3IobmV0d29ya01hbmFnZXIsIGZyYW1lLCB3YWl0VW50aWwsIHRpbWVvdXQpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2FpdFVudGlsKSkge1xuICAgICAgICAgICAgd2FpdFVudGlsID0gd2FpdFVudGlsLnNsaWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHdhaXRVbnRpbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHdhaXRVbnRpbCA9IFt3YWl0VW50aWxdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2luaXRpYWxMb2FkZXJJZCA9IGZyYW1lLl9sb2FkZXJJZDtcbiAgICAgICAgdGhpcy4jZXhwZWN0ZWRMaWZlY3ljbGUgPSB3YWl0VW50aWwubWFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3RvY29sRXZlbnQgPSBwdXBwZXRlZXJUb1Byb3RvY29sTGlmZWN5Y2xlLmdldCh2YWx1ZSk7XG4gICAgICAgICAgICBhc3NlcnQocHJvdG9jb2xFdmVudCwgJ1Vua25vd24gdmFsdWUgZm9yIG9wdGlvbnMud2FpdFVudGlsOiAnICsgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sRXZlbnQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNmcmFtZSA9IGZyYW1lO1xuICAgICAgICB0aGlzLiN0aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgY29uc3QgZnJhbWVNYW5hZ2VyRW1pdHRlciA9IHRoaXMuI3N1YnNjcmlwdGlvbnMudXNlKG5ldyBFdmVudEVtaXR0ZXIoZnJhbWUuX2ZyYW1lTWFuYWdlcikpO1xuICAgICAgICBmcmFtZU1hbmFnZXJFbWl0dGVyLm9uKEZyYW1lTWFuYWdlckV2ZW50LkxpZmVjeWNsZUV2ZW50LCB0aGlzLiNjaGVja0xpZmVjeWNsZUNvbXBsZXRlLmJpbmQodGhpcykpO1xuICAgICAgICBjb25zdCBmcmFtZUVtaXR0ZXIgPSB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRFbWl0dGVyKGZyYW1lKSk7XG4gICAgICAgIGZyYW1lRW1pdHRlci5vbihGcmFtZUV2ZW50LkZyYW1lTmF2aWdhdGVkV2l0aGluRG9jdW1lbnQsIHRoaXMuI25hdmlnYXRlZFdpdGhpbkRvY3VtZW50LmJpbmQodGhpcykpO1xuICAgICAgICBmcmFtZUVtaXR0ZXIub24oRnJhbWVFdmVudC5GcmFtZU5hdmlnYXRlZCwgdGhpcy4jbmF2aWdhdGVkLmJpbmQodGhpcykpO1xuICAgICAgICBmcmFtZUVtaXR0ZXIub24oRnJhbWVFdmVudC5GcmFtZVN3YXBwZWQsIHRoaXMuI2ZyYW1lU3dhcHBlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgZnJhbWVFbWl0dGVyLm9uKEZyYW1lRXZlbnQuRnJhbWVTd2FwcGVkQnlBY3RpdmF0aW9uLCB0aGlzLiNmcmFtZVN3YXBwZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIGZyYW1lRW1pdHRlci5vbihGcmFtZUV2ZW50LkZyYW1lRGV0YWNoZWQsIHRoaXMuI29uRnJhbWVEZXRhY2hlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgY29uc3QgbmV0d29ya01hbmFnZXJFbWl0dGVyID0gdGhpcy4jc3Vic2NyaXB0aW9ucy51c2UobmV3IEV2ZW50RW1pdHRlcihuZXR3b3JrTWFuYWdlcikpO1xuICAgICAgICBuZXR3b3JrTWFuYWdlckVtaXR0ZXIub24oTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0LCB0aGlzLiNvblJlcXVlc3QuYmluZCh0aGlzKSk7XG4gICAgICAgIG5ldHdvcmtNYW5hZ2VyRW1pdHRlci5vbihOZXR3b3JrTWFuYWdlckV2ZW50LlJlc3BvbnNlLCB0aGlzLiNvblJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgICAgICBuZXR3b3JrTWFuYWdlckVtaXR0ZXIub24oTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmFpbGVkLCB0aGlzLiNvblJlcXVlc3RGYWlsZWQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuI3Rlcm1pbmF0aW9uRGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoe1xuICAgICAgICAgICAgdGltZW91dDogdGhpcy4jdGltZW91dCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBOYXZpZ2F0aW9uIHRpbWVvdXQgb2YgJHt0aGlzLiN0aW1lb3V0fSBtcyBleGNlZWRlZGAsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNjaGVja0xpZmVjeWNsZUNvbXBsZXRlKCk7XG4gICAgfVxuICAgICNvblJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5mcmFtZSgpICE9PSB0aGlzLiNmcmFtZSB8fCAhcmVxdWVzdC5pc05hdmlnYXRpb25SZXF1ZXN0KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNuYXZpZ2F0aW9uUmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICAgIC8vIFJlc29sdmUgcHJldmlvdXMgbmF2aWdhdGlvbiByZXNwb25zZSBpbiBjYXNlIHRoZXJlIGFyZSBtdWx0aXBsZVxuICAgICAgICAvLyBuYXZpZ2F0aW9uIHJlcXVlc3RzIHJlcG9ydGVkIGJ5IHRoZSBiYWNrZW5kLiBUaGlzIGdlbmVyYWxseSBzaG91bGQgbm90XG4gICAgICAgIC8vIGhhcHBlbiBieSBpdCBsb29rcyBsaWtlIGl0J3MgcG9zc2libGUuXG4gICAgICAgIHRoaXMuI25hdmlnYXRpb25SZXNwb25zZVJlY2VpdmVkPy5yZXNvbHZlKCk7XG4gICAgICAgIHRoaXMuI25hdmlnYXRpb25SZXNwb25zZVJlY2VpdmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgICAgIGlmIChyZXF1ZXN0LnJlc3BvbnNlKCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuI25hdmlnYXRpb25SZXNwb25zZVJlY2VpdmVkPy5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uUmVxdWVzdEZhaWxlZChyZXF1ZXN0KSB7XG4gICAgICAgIGlmICh0aGlzLiNuYXZpZ2F0aW9uUmVxdWVzdD8uaWQgIT09IHJlcXVlc3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNuYXZpZ2F0aW9uUmVzcG9uc2VSZWNlaXZlZD8ucmVzb2x2ZSgpO1xuICAgIH1cbiAgICAjb25SZXNwb25zZShyZXNwb25zZSkge1xuICAgICAgICBpZiAodGhpcy4jbmF2aWdhdGlvblJlcXVlc3Q/LmlkICE9PSByZXNwb25zZS5yZXF1ZXN0KCkuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNuYXZpZ2F0aW9uUmVzcG9uc2VSZWNlaXZlZD8ucmVzb2x2ZSgpO1xuICAgIH1cbiAgICAjb25GcmFtZURldGFjaGVkKGZyYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLiNmcmFtZSA9PT0gZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuI3Rlcm1pbmF0aW9uRGVmZXJyZWQucmVzb2x2ZShuZXcgRXJyb3IoJ05hdmlnYXRpbmcgZnJhbWUgd2FzIGRldGFjaGVkJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2NoZWNrTGlmZWN5Y2xlQ29tcGxldGUoKTtcbiAgICB9XG4gICAgYXN5bmMgbmF2aWdhdGlvblJlc3BvbnNlKCkge1xuICAgICAgICAvLyBDb250aW51ZSB3aXRoIGEgcG9zc2libHkgbnVsbCByZXNwb25zZS5cbiAgICAgICAgYXdhaXQgdGhpcy4jbmF2aWdhdGlvblJlc3BvbnNlUmVjZWl2ZWQ/LnZhbHVlT3JUaHJvdygpO1xuICAgICAgICByZXR1cm4gdGhpcy4jbmF2aWdhdGlvblJlcXVlc3QgPyB0aGlzLiNuYXZpZ2F0aW9uUmVxdWVzdC5yZXNwb25zZSgpIDogbnVsbDtcbiAgICB9XG4gICAgc2FtZURvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzYW1lRG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQudmFsdWVPclRocm93KCk7XG4gICAgfVxuICAgIG5ld0RvY3VtZW50TmF2aWdhdGlvblByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNuZXdEb2N1bWVudE5hdmlnYXRpb25EZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgbGlmZWN5Y2xlUHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xpZmVjeWNsZURlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgIH1cbiAgICB0ZXJtaW5hdGlvblByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0ZXJtaW5hdGlvbkRlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgIH1cbiAgICAjbmF2aWdhdGVkV2l0aGluRG9jdW1lbnQoKSB7XG4gICAgICAgIHRoaXMuI2hhc1NhbWVEb2N1bWVudE5hdmlnYXRpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLiNjaGVja0xpZmVjeWNsZUNvbXBsZXRlKCk7XG4gICAgfVxuICAgICNuYXZpZ2F0ZWQobmF2aWdhdGlvblR5cGUpIHtcbiAgICAgICAgaWYgKG5hdmlnYXRpb25UeXBlID09PSAnQmFja0ZvcndhcmRDYWNoZVJlc3RvcmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVTd2FwcGVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jY2hlY2tMaWZlY3ljbGVDb21wbGV0ZSgpO1xuICAgIH1cbiAgICAjZnJhbWVTd2FwcGVkKCkge1xuICAgICAgICB0aGlzLiNzd2FwcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jY2hlY2tMaWZlY3ljbGVDb21wbGV0ZSgpO1xuICAgIH1cbiAgICAjY2hlY2tMaWZlY3ljbGVDb21wbGV0ZSgpIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IG5hdmlnYXRpb24gdG8gY29tbWl0LlxuICAgICAgICBpZiAoIWNoZWNrTGlmZWN5Y2xlKHRoaXMuI2ZyYW1lLCB0aGlzLiNleHBlY3RlZExpZmVjeWNsZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNsaWZlY3ljbGVEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgIGlmICh0aGlzLiNoYXNTYW1lRG9jdW1lbnROYXZpZ2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLiNzYW1lRG9jdW1lbnROYXZpZ2F0aW9uRGVmZXJyZWQucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiNzd2FwcGVkIHx8IHRoaXMuI2ZyYW1lLl9sb2FkZXJJZCAhPT0gdGhpcy4jaW5pdGlhbExvYWRlcklkKSB7XG4gICAgICAgICAgICB0aGlzLiNuZXdEb2N1bWVudE5hdmlnYXRpb25EZWZlcnJlZC5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tMaWZlY3ljbGUoZnJhbWUsIGV4cGVjdGVkTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV4cGVjdGVkTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmcmFtZS5fbGlmZWN5Y2xlRXZlbnRzLmhhcyhldmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE8oIzEpOiBJdHMgcG9zc2libGUgd2UgZG9uJ3QgbmVlZCB0aGlzIGNoZWNrXG4gICAgICAgICAgICAvLyBDRFAgcHJvdmlkZWQgdGhlIGNvcnJlY3Qgb3JkZXIgZm9yIExvYWRpbmcgRXZlbnRzXG4gICAgICAgICAgICAvLyBBbmQgTmV0d29ya0lkbGUgaXMgYSBnbG9iYWwgc3RhdGVcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIHJlbW92aW5nXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGZyYW1lLmNoaWxkRnJhbWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuX2hhc1N0YXJ0ZWRMb2FkaW5nICYmXG4gICAgICAgICAgICAgICAgICAgICFjaGVja0xpZmVjeWNsZShjaGlsZCwgZXhwZWN0ZWRMaWZlY3ljbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy4jdGVybWluYXRpb25EZWZlcnJlZC5yZXNvbHZlKG5ldyBFcnJvcignTGlmZWN5Y2xlV2F0Y2hlciBkaXNwb3NlZCcpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaWZlY3ljbGVXYXRjaGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEhlbHBlciBjbGFzcyB0byB0cmFjayBuZXR3b3JrIGV2ZW50cyBieSByZXF1ZXN0IElEXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXR3b3JrRXZlbnRNYW5hZ2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBvcmRlcnMgb2YgZXZlbnRzOlxuICAgICAqIEEuIGBfb25SZXF1ZXN0V2lsbEJlU2VudGBcbiAgICAgKiBCLiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGBcbiAgICAgKiBDLiBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0V2lsbEJlU2VudGBcbiAgICAgKiBELiBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0V2lsbEJlU2VudGAsIGBfb25SZXF1ZXN0UGF1c2VkYCxcbiAgICAgKiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0UGF1c2VkYFxuICAgICAqIChzZWUgY3JidWcuY29tLzExOTYwMDQpXG4gICAgICpcbiAgICAgKiBGb3IgYF9vblJlcXVlc3RgIHdlIG5lZWQgdGhlIGV2ZW50IGZyb20gYF9vblJlcXVlc3RXaWxsQmVTZW50YCBhbmRcbiAgICAgKiBvcHRpb25hbGx5IHRoZSBgaW50ZXJjZXB0aW9uSWRgIGZyb20gYF9vblJlcXVlc3RQYXVzZWRgLlxuICAgICAqXG4gICAgICogSWYgcmVxdWVzdCBpbnRlcmNlcHRpb24gaXMgZGlzYWJsZWQsIGNhbGwgYF9vblJlcXVlc3RgIG9uY2UgcGVyIGNhbGwgdG9cbiAgICAgKiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLlxuICAgICAqIElmIHJlcXVlc3QgaW50ZXJjZXB0aW9uIGlzIGVuYWJsZWQsIGNhbGwgYF9vblJlcXVlc3RgIG9uY2UgcGVyIGNhbGwgdG9cbiAgICAgKiBgX29uUmVxdWVzdFBhdXNlZGAgKG9uY2UgcGVyIGBpbnRlcmNlcHRpb25JZGApLlxuICAgICAqXG4gICAgICogRXZlbnRzIGFyZSBzdG9yZWQgdG8gYWxsb3cgZm9yIHN1YnNlcXVlbnQgZXZlbnRzIHRvIGNhbGwgYF9vblJlcXVlc3RgLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IChjaGFpbnMgb2YpIHJlZGlyZWN0IHJlcXVlc3RzIGhhdmUgdGhlIHNhbWUgYHJlcXVlc3RJZGAgKCEpIGFzXG4gICAgICogdGhlIG9yaWdpbmFsIHJlcXVlc3QuIFdlIGhhdmUgdG8gYW50aWNpcGF0ZSBzZXJpZXMgb2YgZXZlbnRzIGxpa2UgdGhlc2U6XG4gICAgICogQS4gYF9vblJlcXVlc3RXaWxsQmVTZW50YCxcbiAgICAgKiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCAuLi5cbiAgICAgKiBCLiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsXG4gICAgICogYF9vblJlcXVlc3RXaWxsQmVTZW50YCwgYF9vblJlcXVlc3RQYXVzZWRgLCAuLi5cbiAgICAgKiBDLiBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsXG4gICAgICogYF9vblJlcXVlc3RQYXVzZWRgLCBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCAuLi5cbiAgICAgKiBELiBgX29uUmVxdWVzdFBhdXNlZGAsIGBfb25SZXF1ZXN0V2lsbEJlU2VudGAsXG4gICAgICogYF9vblJlcXVlc3RQYXVzZWRgLCBgX29uUmVxdWVzdFdpbGxCZVNlbnRgLCBgX29uUmVxdWVzdFBhdXNlZGAsXG4gICAgICogYF9vblJlcXVlc3RXaWxsQmVTZW50YCwgYF9vblJlcXVlc3RQYXVzZWRgLCBgX29uUmVxdWVzdFBhdXNlZGAsIC4uLlxuICAgICAqIChzZWUgY3JidWcuY29tLzExOTYwMDQpXG4gICAgICovXG4gICAgI3JlcXVlc3RXaWxsQmVTZW50TWFwID0gbmV3IE1hcCgpO1xuICAgICNyZXF1ZXN0UGF1c2VkTWFwID0gbmV3IE1hcCgpO1xuICAgICNodHRwUmVxdWVzdHNNYXAgPSBuZXcgTWFwKCk7XG4gICAgLypcbiAgICAgKiBUaGUgYmVsb3cgbWFwcyBhcmUgdXNlZCB0byByZWNvbmNpbGUgTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvXG4gICAgICogZXZlbnRzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyByZXF1ZXN0LiBFYWNoIHJlc3BvbnNlIGFuZCByZWRpcmVjdFxuICAgICAqIHJlc3BvbnNlIGdldHMgYW4gRXh0cmFJbmZvIGV2ZW50LCBhbmQgd2UgZG9uJ3Qga25vdyB3aGljaCB3aWxsIGNvbWUgZmlyc3QuXG4gICAgICogVGhpcyBtZWFucyB0aGF0IHdlIGhhdmUgdG8gc3RvcmUgYSBSZXNwb25zZSBvciBhbiBFeHRyYUluZm8gZm9yIGVhY2hcbiAgICAgKiByZXNwb25zZSwgYW5kIGVtaXQgdGhlIGV2ZW50IHdoZW4gd2UgZ2V0IGJvdGggb2YgdGhlbS4gSW4gYWRkaXRpb24sIHRvXG4gICAgICogaGFuZGxlIHJlZGlyZWN0cywgd2UgaGF2ZSB0byBtYWtlIHRoZW0gQXJyYXlzIHRvIHJlcHJlc2VudCB0aGUgY2hhaW4gb2ZcbiAgICAgKiBldmVudHMuXG4gICAgICovXG4gICAgI3Jlc3BvbnNlUmVjZWl2ZWRFeHRyYUluZm9NYXAgPSBuZXcgTWFwKCk7XG4gICAgI3F1ZXVlZFJlZGlyZWN0SW5mb01hcCA9IG5ldyBNYXAoKTtcbiAgICAjcXVldWVkRXZlbnRHcm91cE1hcCA9IG5ldyBNYXAoKTtcbiAgICBmb3JnZXQobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0V2lsbEJlU2VudE1hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgICAgIHRoaXMuI3JlcXVlc3RQYXVzZWRNYXAuZGVsZXRlKG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgICAgICB0aGlzLiNxdWV1ZWRFdmVudEdyb3VwTWFwLmRlbGV0ZShuZXR3b3JrUmVxdWVzdElkKTtcbiAgICAgICAgdGhpcy4jcXVldWVkUmVkaXJlY3RJbmZvTWFwLmRlbGV0ZShuZXR3b3JrUmVxdWVzdElkKTtcbiAgICAgICAgdGhpcy4jcmVzcG9uc2VSZWNlaXZlZEV4dHJhSW5mb01hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHJlc3BvbnNlRXh0cmFJbmZvKG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNyZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvTWFwLmhhcyhuZXR3b3JrUmVxdWVzdElkKSkge1xuICAgICAgICAgICAgdGhpcy4jcmVzcG9uc2VSZWNlaXZlZEV4dHJhSW5mb01hcC5zZXQobmV0d29ya1JlcXVlc3RJZCwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvTWFwLmdldChuZXR3b3JrUmVxdWVzdElkKTtcbiAgICB9XG4gICAgcXVldWVkUmVkaXJlY3RJbmZvKGZldGNoUmVxdWVzdElkKSB7XG4gICAgICAgIGlmICghdGhpcy4jcXVldWVkUmVkaXJlY3RJbmZvTWFwLmhhcyhmZXRjaFJlcXVlc3RJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuI3F1ZXVlZFJlZGlyZWN0SW5mb01hcC5zZXQoZmV0Y2hSZXF1ZXN0SWQsIFtdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jcXVldWVkUmVkaXJlY3RJbmZvTWFwLmdldChmZXRjaFJlcXVlc3RJZCk7XG4gICAgfVxuICAgIHF1ZXVlUmVkaXJlY3RJbmZvKGZldGNoUmVxdWVzdElkLCByZWRpcmVjdEluZm8pIHtcbiAgICAgICAgdGhpcy5xdWV1ZWRSZWRpcmVjdEluZm8oZmV0Y2hSZXF1ZXN0SWQpLnB1c2gocmVkaXJlY3RJbmZvKTtcbiAgICB9XG4gICAgdGFrZVF1ZXVlZFJlZGlyZWN0SW5mbyhmZXRjaFJlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWV1ZWRSZWRpcmVjdEluZm8oZmV0Y2hSZXF1ZXN0SWQpLnNoaWZ0KCk7XG4gICAgfVxuICAgIGluRmxpZ2h0UmVxdWVzdHNDb3VudCgpIHtcbiAgICAgICAgbGV0IGluRmxpZ2h0UmVxdWVzdENvdW50ZXIgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgdGhpcy4jaHR0cFJlcXVlc3RzTWFwLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoIXJlcXVlc3QucmVzcG9uc2UoKSkge1xuICAgICAgICAgICAgICAgIGluRmxpZ2h0UmVxdWVzdENvdW50ZXIrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5GbGlnaHRSZXF1ZXN0Q291bnRlcjtcbiAgICB9XG4gICAgc3RvcmVSZXF1ZXN0V2lsbEJlU2VudChuZXR3b3JrUmVxdWVzdElkLCBldmVudCkge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0V2lsbEJlU2VudE1hcC5zZXQobmV0d29ya1JlcXVlc3RJZCwgZXZlbnQpO1xuICAgIH1cbiAgICBnZXRSZXF1ZXN0V2lsbEJlU2VudChuZXR3b3JrUmVxdWVzdElkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0V2lsbEJlU2VudE1hcC5nZXQobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIGZvcmdldFJlcXVlc3RXaWxsQmVTZW50KG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhpcy4jcmVxdWVzdFdpbGxCZVNlbnRNYXAuZGVsZXRlKG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgIH1cbiAgICBnZXRSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3JlcXVlc3RQYXVzZWRNYXAuZ2V0KG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgIH1cbiAgICBmb3JnZXRSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhpcy4jcmVxdWVzdFBhdXNlZE1hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHN0b3JlUmVxdWVzdFBhdXNlZChuZXR3b3JrUmVxdWVzdElkLCBldmVudCkge1xuICAgICAgICB0aGlzLiNyZXF1ZXN0UGF1c2VkTWFwLnNldChuZXR3b3JrUmVxdWVzdElkLCBldmVudCk7XG4gICAgfVxuICAgIGdldFJlcXVlc3QobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaHR0cFJlcXVlc3RzTWFwLmdldChuZXR3b3JrUmVxdWVzdElkKTtcbiAgICB9XG4gICAgc3RvcmVSZXF1ZXN0KG5ldHdvcmtSZXF1ZXN0SWQsIHJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy4jaHR0cFJlcXVlc3RzTWFwLnNldChuZXR3b3JrUmVxdWVzdElkLCByZXF1ZXN0KTtcbiAgICB9XG4gICAgZm9yZ2V0UmVxdWVzdChuZXR3b3JrUmVxdWVzdElkKSB7XG4gICAgICAgIHRoaXMuI2h0dHBSZXF1ZXN0c01hcC5kZWxldGUobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIGdldFF1ZXVlZEV2ZW50R3JvdXAobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcXVldWVkRXZlbnRHcm91cE1hcC5nZXQobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgfVxuICAgIHF1ZXVlRXZlbnRHcm91cChuZXR3b3JrUmVxdWVzdElkLCBldmVudCkge1xuICAgICAgICB0aGlzLiNxdWV1ZWRFdmVudEdyb3VwTWFwLnNldChuZXR3b3JrUmVxdWVzdElkLCBldmVudCk7XG4gICAgfVxuICAgIGZvcmdldFF1ZXVlZEV2ZW50R3JvdXAobmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICB0aGlzLiNxdWV1ZWRFdmVudEdyb3VwTWFwLmRlbGV0ZShuZXR3b3JrUmVxdWVzdElkKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1OZXR3b3JrRXZlbnRNYW5hZ2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IE5ldHdvcmtNYW5hZ2VyRXZlbnQsIH0gZnJvbSAnLi4vY29tbW9uL05ldHdvcmtNYW5hZ2VyRXZlbnRzLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIGlzU3RyaW5nIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IENkcEhUVFBSZXF1ZXN0IH0gZnJvbSAnLi9IVFRQUmVxdWVzdC5qcyc7XG5pbXBvcnQgeyBDZHBIVFRQUmVzcG9uc2UgfSBmcm9tICcuL0hUVFBSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBOZXR3b3JrRXZlbnRNYW5hZ2VyLCB9IGZyb20gJy4vTmV0d29ya0V2ZW50TWFuYWdlci5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTmV0d29ya01hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgICNmcmFtZU1hbmFnZXI7XG4gICAgI25ldHdvcmtFdmVudE1hbmFnZXIgPSBuZXcgTmV0d29ya0V2ZW50TWFuYWdlcigpO1xuICAgICNleHRyYUhUVFBIZWFkZXJzO1xuICAgICNjcmVkZW50aWFscyA9IG51bGw7XG4gICAgI2F0dGVtcHRlZEF1dGhlbnRpY2F0aW9ucyA9IG5ldyBTZXQoKTtcbiAgICAjdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICAjdXNlckNhY2hlRGlzYWJsZWQ7XG4gICAgI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnM7XG4gICAgI3VzZXJBZ2VudDtcbiAgICAjdXNlckFnZW50TWV0YWRhdGE7XG4gICAgI2hhbmRsZXJzID0gW1xuICAgICAgICBbJ0ZldGNoLnJlcXVlc3RQYXVzZWQnLCB0aGlzLiNvblJlcXVlc3RQYXVzZWRdLFxuICAgICAgICBbJ0ZldGNoLmF1dGhSZXF1aXJlZCcsIHRoaXMuI29uQXV0aFJlcXVpcmVkXSxcbiAgICAgICAgWydOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50JywgdGhpcy4jb25SZXF1ZXN0V2lsbEJlU2VudF0sXG4gICAgICAgIFsnTmV0d29yay5yZXF1ZXN0U2VydmVkRnJvbUNhY2hlJywgdGhpcy4jb25SZXF1ZXN0U2VydmVkRnJvbUNhY2hlXSxcbiAgICAgICAgWydOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQnLCB0aGlzLiNvblJlc3BvbnNlUmVjZWl2ZWRdLFxuICAgICAgICBbJ05ldHdvcmsubG9hZGluZ0ZpbmlzaGVkJywgdGhpcy4jb25Mb2FkaW5nRmluaXNoZWRdLFxuICAgICAgICBbJ05ldHdvcmsubG9hZGluZ0ZhaWxlZCcsIHRoaXMuI29uTG9hZGluZ0ZhaWxlZF0sXG4gICAgICAgIFsnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvJywgdGhpcy4jb25SZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvXSxcbiAgICAgICAgW0NEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsIHRoaXMuI3JlbW92ZUNsaWVudF0sXG4gICAgXTtcbiAgICAjY2xpZW50cyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdHJ1Y3RvcihmcmFtZU1hbmFnZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jZnJhbWVNYW5hZ2VyID0gZnJhbWVNYW5hZ2VyO1xuICAgIH1cbiAgICBhc3luYyBhZGRDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIGlmICh0aGlzLiNjbGllbnRzLmhhcyhjbGllbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTtcbiAgICAgICAgdGhpcy4jY2xpZW50cy5zZXQoY2xpZW50LCBzdWJzY3JpcHRpb25zKTtcbiAgICAgICAgY29uc3QgY2xpZW50RW1pdHRlciA9IHN1YnNjcmlwdGlvbnMudXNlKG5ldyBFdmVudEVtaXR0ZXIoY2xpZW50KSk7XG4gICAgICAgIGZvciAoY29uc3QgW2V2ZW50LCBoYW5kbGVyXSBvZiB0aGlzLiNoYW5kbGVycykge1xuICAgICAgICAgICAgY2xpZW50RW1pdHRlci5vbihldmVudCwgKGFyZykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLmJpbmQodGhpcykoY2xpZW50LCBhcmcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgY2xpZW50LnNlbmQoJ05ldHdvcmsuZW5hYmxlJyksXG4gICAgICAgICAgICB0aGlzLiNhcHBseUV4dHJhSFRUUEhlYWRlcnMoY2xpZW50KSxcbiAgICAgICAgICAgIHRoaXMuI2FwcGx5TmV0d29ya0NvbmRpdGlvbnMoY2xpZW50KSxcbiAgICAgICAgICAgIHRoaXMuI2FwcGx5UHJvdG9jb2xDYWNoZURpc2FibGVkKGNsaWVudCksXG4gICAgICAgICAgICB0aGlzLiNhcHBseVByb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbihjbGllbnQpLFxuICAgICAgICAgICAgdGhpcy4jYXBwbHlVc2VyQWdlbnQoY2xpZW50KSxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGFzeW5jICNyZW1vdmVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudHMuZ2V0KGNsaWVudCk/LmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy4jY2xpZW50cy5kZWxldGUoY2xpZW50KTtcbiAgICB9XG4gICAgYXN5bmMgYXV0aGVudGljYXRlKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIHRoaXMuI2NyZWRlbnRpYWxzID0gY3JlZGVudGlhbHM7XG4gICAgICAgIGNvbnN0IGVuYWJsZWQgPSB0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgfHwgISF0aGlzLiNjcmVkZW50aWFscztcbiAgICAgICAgaWYgKGVuYWJsZWQgPT09IHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNwcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXBwbHlUb0FsbENsaWVudHModGhpcy4jYXBwbHlQcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb24uYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jIHNldEV4dHJhSFRUUEhlYWRlcnMoaGVhZGVycykge1xuICAgICAgICBjb25zdCBleHRyYUhUVFBIZWFkZXJzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgICBhc3NlcnQoaXNTdHJpbmcodmFsdWUpLCBgRXhwZWN0ZWQgdmFsdWUgb2YgaGVhZGVyIFwiJHtrZXl9XCIgdG8gYmUgU3RyaW5nLCBidXQgXCIke3R5cGVvZiB2YWx1ZX1cIiBpcyBmb3VuZC5gKTtcbiAgICAgICAgICAgIGV4dHJhSFRUUEhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZXh0cmFIVFRQSGVhZGVycyA9IGV4dHJhSFRUUEhlYWRlcnM7XG4gICAgICAgIGF3YWl0IHRoaXMuI2FwcGx5VG9BbGxDbGllbnRzKHRoaXMuI2FwcGx5RXh0cmFIVFRQSGVhZGVycy5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgYXN5bmMgI2FwcGx5RXh0cmFIVFRQSGVhZGVycyhjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2V4dHJhSFRUUEhlYWRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdOZXR3b3JrLnNldEV4dHJhSFRUUEhlYWRlcnMnLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLiNleHRyYUhUVFBIZWFkZXJzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZXh0cmFIVFRQSGVhZGVycygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuI2V4dHJhSFRUUEhlYWRlcnMpO1xuICAgIH1cbiAgICBpbkZsaWdodFJlcXVlc3RzQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmluRmxpZ2h0UmVxdWVzdHNDb3VudCgpO1xuICAgIH1cbiAgICBhc3luYyBzZXRPZmZsaW5lTW9kZSh2YWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgb2ZmbGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdXBsb2FkOiAtMSxcbiAgICAgICAgICAgICAgICBkb3dubG9hZDogLTEsXG4gICAgICAgICAgICAgICAgbGF0ZW5jeTogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZW11bGF0ZWROZXR3b3JrQ29uZGl0aW9ucy5vZmZsaW5lID0gdmFsdWU7XG4gICAgICAgIGF3YWl0IHRoaXMuI2FwcGx5VG9BbGxDbGllbnRzKHRoaXMuI2FwcGx5TmV0d29ya0NvbmRpdGlvbnMuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jIGVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyhuZXR3b3JrQ29uZGl0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgb2ZmbGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdXBsb2FkOiAtMSxcbiAgICAgICAgICAgICAgICBkb3dubG9hZDogLTEsXG4gICAgICAgICAgICAgICAgbGF0ZW5jeTogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZW11bGF0ZWROZXR3b3JrQ29uZGl0aW9ucy51cGxvYWQgPSBuZXR3b3JrQ29uZGl0aW9uc1xuICAgICAgICAgICAgPyBuZXR3b3JrQ29uZGl0aW9ucy51cGxvYWRcbiAgICAgICAgICAgIDogLTE7XG4gICAgICAgIHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMuZG93bmxvYWQgPSBuZXR3b3JrQ29uZGl0aW9uc1xuICAgICAgICAgICAgPyBuZXR3b3JrQ29uZGl0aW9ucy5kb3dubG9hZFxuICAgICAgICAgICAgOiAtMTtcbiAgICAgICAgdGhpcy4jZW11bGF0ZWROZXR3b3JrQ29uZGl0aW9ucy5sYXRlbmN5ID0gbmV0d29ya0NvbmRpdGlvbnNcbiAgICAgICAgICAgID8gbmV0d29ya0NvbmRpdGlvbnMubGF0ZW5jeVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBhd2FpdCB0aGlzLiNhcHBseVRvQWxsQ2xpZW50cyh0aGlzLiNhcHBseU5ldHdvcmtDb25kaXRpb25zLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBhc3luYyAjYXBwbHlUb0FsbENsaWVudHMoZm4pIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh0aGlzLiNjbGllbnRzLmtleXMoKSkubWFwKGNsaWVudCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZm4oY2xpZW50KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBhc3luYyAjYXBwbHlOZXR3b3JrQ29uZGl0aW9ucyhjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdOZXR3b3JrLmVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucycsIHtcbiAgICAgICAgICAgIG9mZmxpbmU6IHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMub2ZmbGluZSxcbiAgICAgICAgICAgIGxhdGVuY3k6IHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMubGF0ZW5jeSxcbiAgICAgICAgICAgIHVwbG9hZFRocm91Z2hwdXQ6IHRoaXMuI2VtdWxhdGVkTmV0d29ya0NvbmRpdGlvbnMudXBsb2FkLFxuICAgICAgICAgICAgZG93bmxvYWRUaHJvdWdocHV0OiB0aGlzLiNlbXVsYXRlZE5ldHdvcmtDb25kaXRpb25zLmRvd25sb2FkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2V0VXNlckFnZW50KHVzZXJBZ2VudCwgdXNlckFnZW50TWV0YWRhdGEpIHtcbiAgICAgICAgdGhpcy4jdXNlckFnZW50ID0gdXNlckFnZW50O1xuICAgICAgICB0aGlzLiN1c2VyQWdlbnRNZXRhZGF0YSA9IHVzZXJBZ2VudE1ldGFkYXRhO1xuICAgICAgICBhd2FpdCB0aGlzLiNhcHBseVRvQWxsQ2xpZW50cyh0aGlzLiNhcHBseVVzZXJBZ2VudC5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgYXN5bmMgI2FwcGx5VXNlckFnZW50KGNsaWVudCkge1xuICAgICAgICBpZiAodGhpcy4jdXNlckFnZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnTmV0d29yay5zZXRVc2VyQWdlbnRPdmVycmlkZScsIHtcbiAgICAgICAgICAgIHVzZXJBZ2VudDogdGhpcy4jdXNlckFnZW50LFxuICAgICAgICAgICAgdXNlckFnZW50TWV0YWRhdGE6IHRoaXMuI3VzZXJBZ2VudE1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2V0Q2FjaGVFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy4jdXNlckNhY2hlRGlzYWJsZWQgPSAhZW5hYmxlZDtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXBwbHlUb0FsbENsaWVudHModGhpcy4jYXBwbHlQcm90b2NvbENhY2hlRGlzYWJsZWQuYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jIHNldFJlcXVlc3RJbnRlcmNlcHRpb24odmFsdWUpIHtcbiAgICAgICAgdGhpcy4jdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IGVuYWJsZWQgPSB0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgfHwgISF0aGlzLiNjcmVkZW50aWFscztcbiAgICAgICAgaWYgKGVuYWJsZWQgPT09IHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNwcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXBwbHlUb0FsbENsaWVudHModGhpcy4jYXBwbHlQcm90b2NvbFJlcXVlc3RJbnRlcmNlcHRpb24uYmluZCh0aGlzKSk7XG4gICAgfVxuICAgIGFzeW5jICNhcHBseVByb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbihjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI3VzZXJDYWNoZURpc2FibGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuI3VzZXJDYWNoZURpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLiNhcHBseVByb3RvY29sQ2FjaGVEaXNhYmxlZChjbGllbnQpLFxuICAgICAgICAgICAgICAgIGNsaWVudC5zZW5kKCdGZXRjaC5lbmFibGUnLCB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZUF1dGhSZXF1ZXN0czogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybnM6IFt7IHVybFBhdHRlcm46ICcqJyB9XSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2FwcGx5UHJvdG9jb2xDYWNoZURpc2FibGVkKGNsaWVudCksXG4gICAgICAgICAgICAgICAgY2xpZW50LnNlbmQoJ0ZldGNoLmRpc2FibGUnKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jICNhcHBseVByb3RvY29sQ2FjaGVEaXNhYmxlZChjbGllbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI3VzZXJDYWNoZURpc2FibGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjbGllbnQuc2VuZCgnTmV0d29yay5zZXRDYWNoZURpc2FibGVkJywge1xuICAgICAgICAgICAgY2FjaGVEaXNhYmxlZDogdGhpcy4jdXNlckNhY2hlRGlzYWJsZWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAjb25SZXF1ZXN0V2lsbEJlU2VudChjbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIFJlcXVlc3QgaW50ZXJjZXB0aW9uIGRvZXNuJ3QgaGFwcGVuIGZvciBkYXRhIFVSTHMgd2l0aCBOZXR3b3JrIFNlcnZpY2UuXG4gICAgICAgIGlmICh0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgJiZcbiAgICAgICAgICAgICFldmVudC5yZXF1ZXN0LnVybC5zdGFydHNXaXRoKCdkYXRhOicpKSB7XG4gICAgICAgICAgICBjb25zdCB7IHJlcXVlc3RJZDogbmV0d29ya1JlcXVlc3RJZCB9ID0gZXZlbnQ7XG4gICAgICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLnN0b3JlUmVxdWVzdFdpbGxCZVNlbnQobmV0d29ya1JlcXVlc3RJZCwgZXZlbnQpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDRFAgbWF5IGhhdmUgc2VudCBhIEZldGNoLnJlcXVlc3RQYXVzZWQgZXZlbnQgYWxyZWFkeS4gQ2hlY2sgZm9yIGl0LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0UGF1c2VkRXZlbnQgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFJlcXVlc3RQYXVzZWQobmV0d29ya1JlcXVlc3RJZCk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdFBhdXNlZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyByZXF1ZXN0SWQ6IGZldGNoUmVxdWVzdElkIH0gPSByZXF1ZXN0UGF1c2VkRXZlbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy4jcGF0Y2hSZXF1ZXN0RXZlbnRIZWFkZXJzKGV2ZW50LCByZXF1ZXN0UGF1c2VkRXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuI29uUmVxdWVzdChjbGllbnQsIGV2ZW50LCBmZXRjaFJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5mb3JnZXRSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI29uUmVxdWVzdChjbGllbnQsIGV2ZW50LCB1bmRlZmluZWQpO1xuICAgIH1cbiAgICAjb25BdXRoUmVxdWlyZWQoY2xpZW50LCBldmVudCkge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSAnRGVmYXVsdCc7XG4gICAgICAgIGlmICh0aGlzLiNhdHRlbXB0ZWRBdXRoZW50aWNhdGlvbnMuaGFzKGV2ZW50LnJlcXVlc3RJZCkpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gJ0NhbmNlbEF1dGgnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI2NyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICByZXNwb25zZSA9ICdQcm92aWRlQ3JlZGVudGlhbHMnO1xuICAgICAgICAgICAgdGhpcy4jYXR0ZW1wdGVkQXV0aGVudGljYXRpb25zLmFkZChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0gPSB0aGlzLiNjcmVkZW50aWFscyB8fCB7XG4gICAgICAgICAgICB1c2VybmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgY2xpZW50XG4gICAgICAgICAgICAuc2VuZCgnRmV0Y2guY29udGludWVXaXRoQXV0aCcsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZDogZXZlbnQucmVxdWVzdElkLFxuICAgICAgICAgICAgYXV0aENoYWxsZW5nZVJlc3BvbnNlOiB7IHJlc3BvbnNlLCB1c2VybmFtZSwgcGFzc3dvcmQgfSxcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ0RQIG1heSBzZW5kIGEgRmV0Y2gucmVxdWVzdFBhdXNlZCB3aXRob3V0IG9yIGJlZm9yZSBhXG4gICAgICogTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudFxuICAgICAqXG4gICAgICogQ0RQIG1heSBzZW5kIG11bHRpcGxlIEZldGNoLnJlcXVlc3RQYXVzZWRcbiAgICAgKiBmb3IgdGhlIHNhbWUgTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudC5cbiAgICAgKi9cbiAgICAjb25SZXF1ZXN0UGF1c2VkKGNsaWVudCwgZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLiN1c2VyUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQgJiZcbiAgICAgICAgICAgIHRoaXMuI3Byb3RvY29sUmVxdWVzdEludGVyY2VwdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGNsaWVudFxuICAgICAgICAgICAgICAgIC5zZW5kKCdGZXRjaC5jb250aW51ZVJlcXVlc3QnLCB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdElkOiBldmVudC5yZXF1ZXN0SWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG5ldHdvcmtJZDogbmV0d29ya1JlcXVlc3RJZCwgcmVxdWVzdElkOiBmZXRjaFJlcXVlc3RJZCB9ID0gZXZlbnQ7XG4gICAgICAgIGlmICghbmV0d29ya1JlcXVlc3RJZCkge1xuICAgICAgICAgICAgdGhpcy4jb25SZXF1ZXN0V2l0aG91dE5ldHdvcmtJbnN0cnVtZW50YXRpb24oY2xpZW50LCBldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdFdpbGxCZVNlbnRFdmVudCA9ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0V2lsbEJlU2VudEV2ZW50ID0gdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5nZXRSZXF1ZXN0V2lsbEJlU2VudChuZXR3b3JrUmVxdWVzdElkKTtcbiAgICAgICAgICAgIC8vIHJlZGlyZWN0IHJlcXVlc3RzIGhhdmUgdGhlIHNhbWUgYHJlcXVlc3RJZGAsXG4gICAgICAgICAgICBpZiAocmVxdWVzdFdpbGxCZVNlbnRFdmVudCAmJlxuICAgICAgICAgICAgICAgIChyZXF1ZXN0V2lsbEJlU2VudEV2ZW50LnJlcXVlc3QudXJsICE9PSBldmVudC5yZXF1ZXN0LnVybCB8fFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0V2lsbEJlU2VudEV2ZW50LnJlcXVlc3QubWV0aG9kICE9PSBldmVudC5yZXF1ZXN0Lm1ldGhvZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmZvcmdldFJlcXVlc3RXaWxsQmVTZW50KG5ldHdvcmtSZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0V2lsbEJlU2VudEV2ZW50O1xuICAgICAgICB9KSgpO1xuICAgICAgICBpZiAocmVxdWVzdFdpbGxCZVNlbnRFdmVudCkge1xuICAgICAgICAgICAgdGhpcy4jcGF0Y2hSZXF1ZXN0RXZlbnRIZWFkZXJzKHJlcXVlc3RXaWxsQmVTZW50RXZlbnQsIGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMuI29uUmVxdWVzdChjbGllbnQsIHJlcXVlc3RXaWxsQmVTZW50RXZlbnQsIGZldGNoUmVxdWVzdElkKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuc3RvcmVSZXF1ZXN0UGF1c2VkKG5ldHdvcmtSZXF1ZXN0SWQsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjcGF0Y2hSZXF1ZXN0RXZlbnRIZWFkZXJzKHJlcXVlc3RXaWxsQmVTZW50RXZlbnQsIHJlcXVlc3RQYXVzZWRFdmVudCkge1xuICAgICAgICByZXF1ZXN0V2lsbEJlU2VudEV2ZW50LnJlcXVlc3QuaGVhZGVycyA9IHtcbiAgICAgICAgICAgIC4uLnJlcXVlc3RXaWxsQmVTZW50RXZlbnQucmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgICAgLy8gaW5jbHVkZXMgZXh0cmEgaGVhZGVycywgbGlrZTogQWNjZXB0LCBPcmlnaW5cbiAgICAgICAgICAgIC4uLnJlcXVlc3RQYXVzZWRFdmVudC5yZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgIH07XG4gICAgfVxuICAgICNvblJlcXVlc3RXaXRob3V0TmV0d29ya0luc3RydW1lbnRhdGlvbihjbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIElmIGFuIGV2ZW50IGhhcyBubyBuZXR3b3JrSWQgaXQgc2hvdWxkIG5vdCBoYXZlIGFueSBuZXR3b3JrIGV2ZW50cy4gV2VcbiAgICAgICAgLy8gc3RpbGwgd2FudCB0byBkaXNwYXRjaCBpdCBmb3IgdGhlIGludGVyY2VwdGlvbiBieSB0aGUgdXNlci5cbiAgICAgICAgY29uc3QgZnJhbWUgPSBldmVudC5mcmFtZUlkXG4gICAgICAgICAgICA/IHRoaXMuI2ZyYW1lTWFuYWdlci5mcmFtZShldmVudC5mcmFtZUlkKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gbmV3IENkcEhUVFBSZXF1ZXN0KGNsaWVudCwgZnJhbWUsIGV2ZW50LnJlcXVlc3RJZCwgdGhpcy4jdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkLCBldmVudCwgW10pO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0LCByZXF1ZXN0KTtcbiAgICAgICAgdm9pZCByZXF1ZXN0LmZpbmFsaXplSW50ZXJjZXB0aW9ucygpO1xuICAgIH1cbiAgICAjb25SZXF1ZXN0KGNsaWVudCwgZXZlbnQsIGZldGNoUmVxdWVzdElkKSB7XG4gICAgICAgIGxldCByZWRpcmVjdENoYWluID0gW107XG4gICAgICAgIGlmIChldmVudC5yZWRpcmVjdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAvLyBXZSB3YW50IHRvIGVtaXQgYSByZXNwb25zZSBhbmQgcmVxdWVzdGZpbmlzaGVkIGZvciB0aGVcbiAgICAgICAgICAgIC8vIHJlZGlyZWN0UmVzcG9uc2UsIGJ1dCB3ZSBjYW4ndCBkbyBzbyB1bmxlc3Mgd2UgaGF2ZSBhXG4gICAgICAgICAgICAvLyByZXNwb25zZUV4dHJhSW5mbyByZWFkeSB0byBwYWlyIGl0IHVwIHdpdGguIElmIHdlIGRvbid0IGhhdmUgYW55XG4gICAgICAgICAgICAvLyByZXNwb25zZUV4dHJhSW5mb3Mgc2F2ZWQgaW4gb3VyIHF1ZXVlLCB0aGV5IHdlIGhhdmUgdG8gd2FpdCB1bnRpbFxuICAgICAgICAgICAgLy8gdGhlIG5leHQgb25lIHRvIGVtaXQgcmVzcG9uc2UgYW5kIHJlcXVlc3RmaW5pc2hlZCwgKmFuZCogd2Ugc2hvdWxkXG4gICAgICAgICAgICAvLyBhbHNvIHdhaXQgdG8gZW1pdCB0aGlzIFJlcXVlc3QgdG9vIGJlY2F1c2UgaXQgc2hvdWxkIGNvbWUgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAvLyByZXNwb25zZS9yZXF1ZXN0ZmluaXNoZWQuXG4gICAgICAgICAgICBsZXQgcmVkaXJlY3RSZXNwb25zZUV4dHJhSW5mbyA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZXZlbnQucmVkaXJlY3RIYXNFeHRyYUluZm8pIHtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFJlc3BvbnNlRXh0cmFJbmZvID0gdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlclxuICAgICAgICAgICAgICAgICAgICAucmVzcG9uc2VFeHRyYUluZm8oZXZlbnQucmVxdWVzdElkKVxuICAgICAgICAgICAgICAgICAgICAuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0UmVzcG9uc2VFeHRyYUluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5xdWV1ZVJlZGlyZWN0SW5mbyhldmVudC5yZXF1ZXN0SWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hSZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICAgICAgLy8gSWYgd2UgY29ubmVjdCBsYXRlIHRvIHRoZSB0YXJnZXQsIHdlIGNvdWxkIGhhdmUgbWlzc2VkIHRoZVxuICAgICAgICAgICAgLy8gcmVxdWVzdFdpbGxCZVNlbnQgZXZlbnQuXG4gICAgICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2hhbmRsZVJlcXVlc3RSZWRpcmVjdChjbGllbnQsIHJlcXVlc3QsIGV2ZW50LnJlZGlyZWN0UmVzcG9uc2UsIHJlZGlyZWN0UmVzcG9uc2VFeHRyYUluZm8pO1xuICAgICAgICAgICAgICAgIHJlZGlyZWN0Q2hhaW4gPSByZXF1ZXN0Ll9yZWRpcmVjdENoYWluO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZyYW1lID0gZXZlbnQuZnJhbWVJZFxuICAgICAgICAgICAgPyB0aGlzLiNmcmFtZU1hbmFnZXIuZnJhbWUoZXZlbnQuZnJhbWVJZClcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBDZHBIVFRQUmVxdWVzdChjbGllbnQsIGZyYW1lLCBmZXRjaFJlcXVlc3RJZCwgdGhpcy4jdXNlclJlcXVlc3RJbnRlcmNlcHRpb25FbmFibGVkLCBldmVudCwgcmVkaXJlY3RDaGFpbik7XG4gICAgICAgIHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuc3RvcmVSZXF1ZXN0KGV2ZW50LnJlcXVlc3RJZCwgcmVxdWVzdCk7XG4gICAgICAgIHRoaXMuZW1pdChOZXR3b3JrTWFuYWdlckV2ZW50LlJlcXVlc3QsIHJlcXVlc3QpO1xuICAgICAgICB2b2lkIHJlcXVlc3QuZmluYWxpemVJbnRlcmNlcHRpb25zKCk7XG4gICAgfVxuICAgICNvblJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUoX2NsaWVudCwgZXZlbnQpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmVxdWVzdC5fZnJvbU1lbW9yeUNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0U2VydmVkRnJvbUNhY2hlLCByZXF1ZXN0KTtcbiAgICB9XG4gICAgI2hhbmRsZVJlcXVlc3RSZWRpcmVjdChjbGllbnQsIHJlcXVlc3QsIHJlc3BvbnNlUGF5bG9hZCwgZXh0cmFJbmZvKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbmV3IENkcEhUVFBSZXNwb25zZShjbGllbnQsIHJlcXVlc3QsIHJlc3BvbnNlUGF5bG9hZCwgZXh0cmFJbmZvKTtcbiAgICAgICAgcmVxdWVzdC5fcmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgcmVxdWVzdC5fcmVkaXJlY3RDaGFpbi5wdXNoKHJlcXVlc3QpO1xuICAgICAgICByZXNwb25zZS5fcmVzb2x2ZUJvZHkobmV3IEVycm9yKCdSZXNwb25zZSBib2R5IGlzIHVuYXZhaWxhYmxlIGZvciByZWRpcmVjdCByZXNwb25zZXMnKSk7XG4gICAgICAgIHRoaXMuI2ZvcmdldFJlcXVlc3QocmVxdWVzdCwgZmFsc2UpO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmluaXNoZWQsIHJlcXVlc3QpO1xuICAgIH1cbiAgICAjZW1pdFJlc3BvbnNlRXZlbnQoY2xpZW50LCByZXNwb25zZVJlY2VpdmVkLCBleHRyYUluZm8pIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChyZXNwb25zZVJlY2VpdmVkLnJlcXVlc3RJZCk7XG4gICAgICAgIC8vIEZpbGVVcGxvYWQgc2VuZHMgYSByZXNwb25zZSB3aXRob3V0IGEgbWF0Y2hpbmcgcmVxdWVzdC5cbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXh0cmFJbmZvcyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIucmVzcG9uc2VFeHRyYUluZm8ocmVzcG9uc2VSZWNlaXZlZC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAoZXh0cmFJbmZvcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRlYnVnRXJyb3IobmV3IEVycm9yKCdVbmV4cGVjdGVkIGV4dHJhSW5mbyBldmVudHMgZm9yIHJlcXVlc3QgJyArXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VSZWNlaXZlZC5yZXF1ZXN0SWQpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaHJvbWl1bSBzZW5kcyB3cm9uZyBleHRyYUluZm8gZXZlbnRzIGZvciByZXNwb25zZXMgc2VydmVkIGZyb20gY2FjaGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHVwcGV0ZWVyL3B1cHBldGVlci9pc3N1ZXMvOTk2NSBhbmRcbiAgICAgICAgLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vMTM0MDM5OC5cbiAgICAgICAgaWYgKHJlc3BvbnNlUmVjZWl2ZWQucmVzcG9uc2UuZnJvbURpc2tDYWNoZSkge1xuICAgICAgICAgICAgZXh0cmFJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IG5ldyBDZHBIVFRQUmVzcG9uc2UoY2xpZW50LCByZXF1ZXN0LCByZXNwb25zZVJlY2VpdmVkLnJlc3BvbnNlLCBleHRyYUluZm8pO1xuICAgICAgICByZXF1ZXN0Ll9yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXNwb25zZSwgcmVzcG9uc2UpO1xuICAgIH1cbiAgICAjb25SZXNwb25zZVJlY2VpdmVkKGNsaWVudCwgZXZlbnQpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UmVxdWVzdChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBsZXQgZXh0cmFJbmZvID0gbnVsbDtcbiAgICAgICAgaWYgKHJlcXVlc3QgJiYgIXJlcXVlc3QuX2Zyb21NZW1vcnlDYWNoZSAmJiBldmVudC5oYXNFeHRyYUluZm8pIHtcbiAgICAgICAgICAgIGV4dHJhSW5mbyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXJcbiAgICAgICAgICAgICAgICAucmVzcG9uc2VFeHRyYUluZm8oZXZlbnQucmVxdWVzdElkKVxuICAgICAgICAgICAgICAgIC5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKCFleHRyYUluZm8pIHtcbiAgICAgICAgICAgICAgICAvLyBXYWl0IHVudGlsIHdlIGdldCB0aGUgY29ycmVzcG9uZGluZyBFeHRyYUluZm8gZXZlbnQuXG4gICAgICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5xdWV1ZUV2ZW50R3JvdXAoZXZlbnQucmVxdWVzdElkLCB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUmVjZWl2ZWRFdmVudDogZXZlbnQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2VtaXRSZXNwb25zZUV2ZW50KGNsaWVudCwgZXZlbnQsIGV4dHJhSW5mbyk7XG4gICAgfVxuICAgICNvblJlc3BvbnNlUmVjZWl2ZWRFeHRyYUluZm8oY2xpZW50LCBldmVudCkge1xuICAgICAgICAvLyBXZSBtYXkgaGF2ZSBza2lwcGVkIGEgcmVkaXJlY3QgcmVzcG9uc2UvcmVxdWVzdCBwYWlyIGR1ZSB0byB3YWl0aW5nIGZvclxuICAgICAgICAvLyB0aGlzIEV4dHJhSW5mbyBldmVudC4gSWYgc28sIGNvbnRpbnVlIHRoYXQgd29yayBub3cgdGhhdCB3ZSBoYXZlIHRoZVxuICAgICAgICAvLyByZXF1ZXN0LlxuICAgICAgICBjb25zdCByZWRpcmVjdEluZm8gPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLnRha2VRdWV1ZWRSZWRpcmVjdEluZm8oZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgaWYgKHJlZGlyZWN0SW5mbykge1xuICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5yZXNwb25zZUV4dHJhSW5mbyhldmVudC5yZXF1ZXN0SWQpLnB1c2goZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy4jb25SZXF1ZXN0KGNsaWVudCwgcmVkaXJlY3RJbmZvLmV2ZW50LCByZWRpcmVjdEluZm8uZmV0Y2hSZXF1ZXN0SWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIG1heSBoYXZlIHNraXBwZWQgcmVzcG9uc2UgYW5kIGxvYWRpbmcgZXZlbnRzIGJlY2F1c2Ugd2UgZGlkbid0IGhhdmVcbiAgICAgICAgLy8gdGhpcyBFeHRyYUluZm8gZXZlbnQgeWV0LiBJZiBzbywgZW1pdCB0aG9zZSBldmVudHMgbm93LlxuICAgICAgICBjb25zdCBxdWV1ZWRFdmVudHMgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFF1ZXVlZEV2ZW50R3JvdXAoZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgaWYgKHF1ZXVlZEV2ZW50cykge1xuICAgICAgICAgICAgdGhpcy4jbmV0d29ya0V2ZW50TWFuYWdlci5mb3JnZXRRdWV1ZWRFdmVudEdyb3VwKGV2ZW50LnJlcXVlc3RJZCk7XG4gICAgICAgICAgICB0aGlzLiNlbWl0UmVzcG9uc2VFdmVudChjbGllbnQsIHF1ZXVlZEV2ZW50cy5yZXNwb25zZVJlY2VpdmVkRXZlbnQsIGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChxdWV1ZWRFdmVudHMubG9hZGluZ0ZpbmlzaGVkRXZlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNlbWl0TG9hZGluZ0ZpbmlzaGVkKHF1ZXVlZEV2ZW50cy5sb2FkaW5nRmluaXNoZWRFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocXVldWVkRXZlbnRzLmxvYWRpbmdGYWlsZWRFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXRMb2FkaW5nRmFpbGVkKHF1ZXVlZEV2ZW50cy5sb2FkaW5nRmFpbGVkRXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhaXQgdW50aWwgd2UgZ2V0IGFub3RoZXIgZXZlbnQgdGhhdCBjYW4gdXNlIHRoaXMgRXh0cmFJbmZvIGV2ZW50LlxuICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLnJlc3BvbnNlRXh0cmFJbmZvKGV2ZW50LnJlcXVlc3RJZCkucHVzaChldmVudCk7XG4gICAgfVxuICAgICNmb3JnZXRSZXF1ZXN0KHJlcXVlc3QsIGV2ZW50cykge1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSByZXF1ZXN0LmlkO1xuICAgICAgICBjb25zdCBpbnRlcmNlcHRpb25JZCA9IHJlcXVlc3QuX2ludGVyY2VwdGlvbklkO1xuICAgICAgICB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmZvcmdldFJlcXVlc3QocmVxdWVzdElkKTtcbiAgICAgICAgaW50ZXJjZXB0aW9uSWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdGhpcy4jYXR0ZW1wdGVkQXV0aGVudGljYXRpb25zLmRlbGV0ZShpbnRlcmNlcHRpb25JZCk7XG4gICAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZm9yZ2V0KHJlcXVlc3RJZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uTG9hZGluZ0ZpbmlzaGVkKF9jbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBldmVudCBmb3IgdGhpcyByZXF1ZXN0IGlzIHN0aWxsIHdhaXRpbmcgb24gYVxuICAgICAgICAvLyBjb3JyZXNwb25kaW5nIEV4dHJhSW5mbyBldmVudCwgdGhlbiB3YWl0IHRvIGVtaXQgdGhpcyBldmVudCB0b28uXG4gICAgICAgIGNvbnN0IHF1ZXVlZEV2ZW50cyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UXVldWVkRXZlbnRHcm91cChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAocXVldWVkRXZlbnRzKSB7XG4gICAgICAgICAgICBxdWV1ZWRFdmVudHMubG9hZGluZ0ZpbmlzaGVkRXZlbnQgPSBldmVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2VtaXRMb2FkaW5nRmluaXNoZWQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNlbWl0TG9hZGluZ0ZpbmlzaGVkKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFJlcXVlc3QoZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgLy8gRm9yIGNlcnRhaW4gcmVxdWVzdElkcyB3ZSBuZXZlciByZWNlaXZlIHJlcXVlc3RXaWxsQmVTZW50IGV2ZW50LlxuICAgICAgICAvLyBAc2VlIGh0dHBzOi8vY3JidWcuY29tLzc1MDQ2OVxuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMgd2UgbmV2ZXIgZ2V0IHRoZSBOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWRcbiAgICAgICAgLy8gZXZlbnQgZnJvbSBwcm90b2NvbC4gQHNlZSBodHRwczovL2NyYnVnLmNvbS84ODM0NzVcbiAgICAgICAgaWYgKHJlcXVlc3QucmVzcG9uc2UoKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZSgpPy5fcmVzb2x2ZUJvZHkoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmb3JnZXRSZXF1ZXN0KHJlcXVlc3QsIHRydWUpO1xuICAgICAgICB0aGlzLmVtaXQoTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmluaXNoZWQsIHJlcXVlc3QpO1xuICAgIH1cbiAgICAjb25Mb2FkaW5nRmFpbGVkKF9jbGllbnQsIGV2ZW50KSB7XG4gICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBldmVudCBmb3IgdGhpcyByZXF1ZXN0IGlzIHN0aWxsIHdhaXRpbmcgb24gYVxuICAgICAgICAvLyBjb3JyZXNwb25kaW5nIEV4dHJhSW5mbyBldmVudCwgdGhlbiB3YWl0IHRvIGVtaXQgdGhpcyBldmVudCB0b28uXG4gICAgICAgIGNvbnN0IHF1ZXVlZEV2ZW50cyA9IHRoaXMuI25ldHdvcmtFdmVudE1hbmFnZXIuZ2V0UXVldWVkRXZlbnRHcm91cChldmVudC5yZXF1ZXN0SWQpO1xuICAgICAgICBpZiAocXVldWVkRXZlbnRzKSB7XG4gICAgICAgICAgICBxdWV1ZWRFdmVudHMubG9hZGluZ0ZhaWxlZEV2ZW50ID0gZXZlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNlbWl0TG9hZGluZ0ZhaWxlZChldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2VtaXRMb2FkaW5nRmFpbGVkKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLiNuZXR3b3JrRXZlbnRNYW5hZ2VyLmdldFJlcXVlc3QoZXZlbnQucmVxdWVzdElkKTtcbiAgICAgICAgLy8gRm9yIGNlcnRhaW4gcmVxdWVzdElkcyB3ZSBuZXZlciByZWNlaXZlIHJlcXVlc3RXaWxsQmVTZW50IGV2ZW50LlxuICAgICAgICAvLyBAc2VlIGh0dHBzOi8vY3JidWcuY29tLzc1MDQ2OVxuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0Ll9mYWlsdXJlVGV4dCA9IGV2ZW50LmVycm9yVGV4dDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXF1ZXN0LnJlc3BvbnNlKCk7XG4gICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgcmVzcG9uc2UuX3Jlc29sdmVCb2R5KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZm9yZ2V0UmVxdWVzdChyZXF1ZXN0LCB0cnVlKTtcbiAgICAgICAgdGhpcy5lbWl0KE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdEZhaWxlZCwgcmVxdWVzdCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmV0d29ya01hbmFnZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgcmFjZVdpdGggfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMnO1xuaW1wb3J0IHsgQ0RQU2Vzc2lvbkV2ZW50IH0gZnJvbSAnLi4vYXBpL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgUGFnZSwgfSBmcm9tICcuLi9hcGkvUGFnZS5qcyc7XG5pbXBvcnQgeyBDb25zb2xlTWVzc2FnZSwgfSBmcm9tICcuLi9jb21tb24vQ29uc29sZU1lc3NhZ2UuanMnO1xuaW1wb3J0IHsgVGFyZ2V0Q2xvc2VFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgRmlsZUNob29zZXIgfSBmcm9tICcuLi9jb21tb24vRmlsZUNob29zZXIuanMnO1xuaW1wb3J0IHsgTmV0d29ya01hbmFnZXJFdmVudCB9IGZyb20gJy4uL2NvbW1vbi9OZXR3b3JrTWFuYWdlckV2ZW50cy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yLCBldmFsdWF0aW9uU3RyaW5nLCBnZXRSZWFkYWJsZUFzQnVmZmVyLCBnZXRSZWFkYWJsZUZyb21Qcm90b2NvbFN0cmVhbSwgcGFyc2VQREZPcHRpb25zLCB0aW1lb3V0LCB2YWxpZGF0ZURpYWxvZ1R5cGUsIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IEFzeW5jRGlzcG9zYWJsZVN0YWNrIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbmltcG9ydCB7IGlzRXJyb3JMaWtlIH0gZnJvbSAnLi4vdXRpbC9FcnJvckxpa2UuanMnO1xuaW1wb3J0IHsgQmluZGluZyB9IGZyb20gJy4vQmluZGluZy5qcyc7XG5pbXBvcnQgeyBDZHBDRFBTZXNzaW9uIH0gZnJvbSAnLi9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IGlzVGFyZ2V0Q2xvc2VkRXJyb3IgfSBmcm9tICcuL0Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHsgQ292ZXJhZ2UgfSBmcm9tICcuL0NvdmVyYWdlLmpzJztcbmltcG9ydCB7IENkcERpYWxvZyB9IGZyb20gJy4vRGlhbG9nLmpzJztcbmltcG9ydCB7IEVtdWxhdGlvbk1hbmFnZXIgfSBmcm9tICcuL0VtdWxhdGlvbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRmlyZWZveFRhcmdldE1hbmFnZXIgfSBmcm9tICcuL0ZpcmVmb3hUYXJnZXRNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlciB9IGZyb20gJy4vRnJhbWVNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEZyYW1lTWFuYWdlckV2ZW50IH0gZnJvbSAnLi9GcmFtZU1hbmFnZXJFdmVudHMuanMnO1xuaW1wb3J0IHsgQ2RwS2V5Ym9hcmQsIENkcE1vdXNlLCBDZHBUb3VjaHNjcmVlbiB9IGZyb20gJy4vSW5wdXQuanMnO1xuaW1wb3J0IHsgTUFJTl9XT1JMRCB9IGZyb20gJy4vSXNvbGF0ZWRXb3JsZHMuanMnO1xuaW1wb3J0IHsgcmVsZWFzZU9iamVjdCB9IGZyb20gJy4vSlNIYW5kbGUuanMnO1xuaW1wb3J0IHsgVHJhY2luZyB9IGZyb20gJy4vVHJhY2luZy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVDbGllbnRFcnJvciwgcGFnZUJpbmRpbmdJbml0U3RyaW5nLCB2YWx1ZUZyb21SZW1vdGVPYmplY3QsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBDZHBXZWJXb3JrZXIgfSBmcm9tICcuL1dlYldvcmtlci5qcyc7XG5mdW5jdGlvbiBjb252ZXJ0Q29uc29sZU1lc3NhZ2VMZXZlbChtZXRob2QpIHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICBjYXNlICd3YXJuaW5nJzpcbiAgICAgICAgICAgIHJldHVybiAnd2Fybic7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBQYWdlIGV4dGVuZHMgUGFnZSB7XG4gICAgc3RhdGljIGFzeW5jIF9jcmVhdGUoY2xpZW50LCB0YXJnZXQsIGRlZmF1bHRWaWV3cG9ydCkge1xuICAgICAgICBjb25zdCBwYWdlID0gbmV3IENkcFBhZ2UoY2xpZW50LCB0YXJnZXQpO1xuICAgICAgICBhd2FpdCBwYWdlLiNpbml0aWFsaXplKCk7XG4gICAgICAgIGlmIChkZWZhdWx0Vmlld3BvcnQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5zZXRWaWV3cG9ydChkZWZhdWx0Vmlld3BvcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChpc0Vycm9yTGlrZShlcnIpICYmIGlzVGFyZ2V0Q2xvc2VkRXJyb3IoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWdlO1xuICAgIH1cbiAgICAjY2xvc2VkID0gZmFsc2U7XG4gICAgI3RhcmdldE1hbmFnZXI7XG4gICAgI3ByaW1hcnlUYXJnZXRDbGllbnQ7XG4gICAgI3ByaW1hcnlUYXJnZXQ7XG4gICAgI3RhYlRhcmdldENsaWVudDtcbiAgICAjdGFiVGFyZ2V0O1xuICAgICNrZXlib2FyZDtcbiAgICAjbW91c2U7XG4gICAgI3RvdWNoc2NyZWVuO1xuICAgICNmcmFtZU1hbmFnZXI7XG4gICAgI2VtdWxhdGlvbk1hbmFnZXI7XG4gICAgI3RyYWNpbmc7XG4gICAgI2JpbmRpbmdzID0gbmV3IE1hcCgpO1xuICAgICNleHBvc2VkRnVuY3Rpb25zID0gbmV3IE1hcCgpO1xuICAgICNjb3ZlcmFnZTtcbiAgICAjdmlld3BvcnQ7XG4gICAgI3dvcmtlcnMgPSBuZXcgTWFwKCk7XG4gICAgI2ZpbGVDaG9vc2VyRGVmZXJyZWRzID0gbmV3IFNldCgpO1xuICAgICNzZXNzaW9uQ2xvc2VEZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICNzZXJ2aWNlV29ya2VyQnlwYXNzZWQgPSBmYWxzZTtcbiAgICAjdXNlckRyYWdJbnRlcmNlcHRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgI2ZyYW1lTWFuYWdlckhhbmRsZXJzID0gW1xuICAgICAgICBbXG4gICAgICAgICAgICBGcmFtZU1hbmFnZXJFdmVudC5GcmFtZUF0dGFjaGVkLFxuICAgICAgICAgICAgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZnJhbWVhdHRhY2hlZFwiIC8qIFBhZ2VFdmVudC5GcmFtZUF0dGFjaGVkICovLCBmcmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICBGcmFtZU1hbmFnZXJFdmVudC5GcmFtZURldGFjaGVkLFxuICAgICAgICAgICAgKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZnJhbWVkZXRhY2hlZFwiIC8qIFBhZ2VFdmVudC5GcmFtZURldGFjaGVkICovLCBmcmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICBGcmFtZU1hbmFnZXJFdmVudC5GcmFtZU5hdmlnYXRlZCxcbiAgICAgICAgICAgIChmcmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImZyYW1lbmF2aWdhdGVkXCIgLyogUGFnZUV2ZW50LkZyYW1lTmF2aWdhdGVkICovLCBmcmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgIF07XG4gICAgI25ldHdvcmtNYW5hZ2VySGFuZGxlcnMgPSBbXG4gICAgICAgIFtcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdCxcbiAgICAgICAgICAgIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwicmVxdWVzdFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0ICovLCByZXF1ZXN0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdFNlcnZlZEZyb21DYWNoZSxcbiAgICAgICAgICAgIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwicmVxdWVzdHNlcnZlZGZyb21jYWNoZVwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0U2VydmVkRnJvbUNhY2hlICovLCByZXF1ZXN0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVzcG9uc2UsXG4gICAgICAgICAgICAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJyZXNwb25zZVwiIC8qIFBhZ2VFdmVudC5SZXNwb25zZSAqLywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmFpbGVkLFxuICAgICAgICAgICAgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJyZXF1ZXN0ZmFpbGVkXCIgLyogUGFnZUV2ZW50LlJlcXVlc3RGYWlsZWQgKi8sIHJlcXVlc3QpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgTmV0d29ya01hbmFnZXJFdmVudC5SZXF1ZXN0RmluaXNoZWQsXG4gICAgICAgICAgICAocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcInJlcXVlc3RmaW5pc2hlZFwiIC8qIFBhZ2VFdmVudC5SZXF1ZXN0RmluaXNoZWQgKi8sIHJlcXVlc3QpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICBdO1xuICAgICNzZXNzaW9uSGFuZGxlcnMgPSBbXG4gICAgICAgIFtcbiAgICAgICAgICAgIENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4jc2Vzc2lvbkNsb3NlRGVmZXJyZWQucmVqZWN0KG5ldyBUYXJnZXRDbG9zZUVycm9yKCdUYXJnZXQgY2xvc2VkJykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgICAgJ1BhZ2UuZG9tQ29udGVudEV2ZW50RmlyZWQnLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoXCJkb21jb250ZW50bG9hZGVkXCIgLyogUGFnZUV2ZW50LkRPTUNvbnRlbnRMb2FkZWQgKi8sIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgICAnUGFnZS5sb2FkRXZlbnRGaXJlZCcsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdChcImxvYWRcIiAvKiBQYWdlRXZlbnQuTG9hZCAqLywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIFsnUGFnZS5qYXZhc2NyaXB0RGlhbG9nT3BlbmluZycsIHRoaXMuI29uRGlhbG9nLmJpbmQodGhpcyldLFxuICAgICAgICBbJ1J1bnRpbWUuZXhjZXB0aW9uVGhyb3duJywgdGhpcy4jaGFuZGxlRXhjZXB0aW9uLmJpbmQodGhpcyldLFxuICAgICAgICBbJ0luc3BlY3Rvci50YXJnZXRDcmFzaGVkJywgdGhpcy4jb25UYXJnZXRDcmFzaGVkLmJpbmQodGhpcyldLFxuICAgICAgICBbJ1BlcmZvcm1hbmNlLm1ldHJpY3MnLCB0aGlzLiNlbWl0TWV0cmljcy5iaW5kKHRoaXMpXSxcbiAgICAgICAgWydMb2cuZW50cnlBZGRlZCcsIHRoaXMuI29uTG9nRW50cnlBZGRlZC5iaW5kKHRoaXMpXSxcbiAgICAgICAgWydQYWdlLmZpbGVDaG9vc2VyT3BlbmVkJywgdGhpcy4jb25GaWxlQ2hvb3Nlci5iaW5kKHRoaXMpXSxcbiAgICBdO1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCwgdGFyZ2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuI3RhYlRhcmdldENsaWVudCA9IGNsaWVudC5wYXJlbnRTZXNzaW9uKCk7XG4gICAgICAgIGFzc2VydCh0aGlzLiN0YWJUYXJnZXRDbGllbnQsICdUYWIgdGFyZ2V0IHNlc3Npb24gaXMgbm90IGRlZmluZWQuJyk7XG4gICAgICAgIHRoaXMuI3RhYlRhcmdldCA9IHRoaXMuI3RhYlRhcmdldENsaWVudC5fdGFyZ2V0KCk7XG4gICAgICAgIGFzc2VydCh0aGlzLiN0YWJUYXJnZXQsICdUYWIgdGFyZ2V0IGlzIG5vdCBkZWZpbmVkLicpO1xuICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLiN0YXJnZXRNYW5hZ2VyID0gdGFyZ2V0Ll90YXJnZXRNYW5hZ2VyKCk7XG4gICAgICAgIHRoaXMuI2tleWJvYXJkID0gbmV3IENkcEtleWJvYXJkKGNsaWVudCk7XG4gICAgICAgIHRoaXMuI21vdXNlID0gbmV3IENkcE1vdXNlKGNsaWVudCwgdGhpcy4ja2V5Ym9hcmQpO1xuICAgICAgICB0aGlzLiN0b3VjaHNjcmVlbiA9IG5ldyBDZHBUb3VjaHNjcmVlbihjbGllbnQsIHRoaXMuI2tleWJvYXJkKTtcbiAgICAgICAgdGhpcy4jZnJhbWVNYW5hZ2VyID0gbmV3IEZyYW1lTWFuYWdlcihjbGllbnQsIHRoaXMsIHRoaXMuX3RpbWVvdXRTZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIgPSBuZXcgRW11bGF0aW9uTWFuYWdlcihjbGllbnQpO1xuICAgICAgICB0aGlzLiN0cmFjaW5nID0gbmV3IFRyYWNpbmcoY2xpZW50KTtcbiAgICAgICAgdGhpcy4jY292ZXJhZ2UgPSBuZXcgQ292ZXJhZ2UoY2xpZW50KTtcbiAgICAgICAgdGhpcy4jdmlld3BvcnQgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIHRoaXMuI2ZyYW1lTWFuYWdlckhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIub24oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIub24oRnJhbWVNYW5hZ2VyRXZlbnQuQ29uc29sZUFwaUNhbGxlZCwgKFt3b3JsZCwgZXZlbnRdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNvbkNvbnNvbGVBUEkod29ybGQsIGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5vbihGcmFtZU1hbmFnZXJFdmVudC5CaW5kaW5nQ2FsbGVkLCAoW3dvcmxkLCBldmVudF0pID0+IHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jb25CaW5kaW5nQ2FsbGVkKHdvcmxkLCBldmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIGhhbmRsZXJdIG9mIHRoaXMuI25ldHdvcmtNYW5hZ2VySGFuZGxlcnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBhbnkuXG4gICAgICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIubmV0d29ya01hbmFnZXIub24oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN0YWJUYXJnZXRDbGllbnQub24oQ0RQU2Vzc2lvbkV2ZW50LlN3YXBwZWQsIHRoaXMuI29uQWN0aXZhdGlvbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy4jdGFiVGFyZ2V0Q2xpZW50Lm9uKENEUFNlc3Npb25FdmVudC5SZWFkeSwgdGhpcy4jb25TZWNvbmRhcnlUYXJnZXQuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub24oXCJ0YXJnZXRHb25lXCIgLyogVGFyZ2V0TWFuYWdlckV2ZW50LlRhcmdldEdvbmUgKi8sIHRoaXMuI29uRGV0YWNoZWRGcm9tVGFyZ2V0KTtcbiAgICAgICAgdGhpcy4jdGFiVGFyZ2V0Ll9pc0Nsb3NlZERlZmVycmVkXG4gICAgICAgICAgICAudmFsdWVPclRocm93KClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIub2ZmKFwidGFyZ2V0R29uZVwiIC8qIFRhcmdldE1hbmFnZXJFdmVudC5UYXJnZXRHb25lICovLCB0aGlzLiNvbkRldGFjaGVkRnJvbVRhcmdldCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJjbG9zZVwiIC8qIFBhZ2VFdmVudC5DbG9zZSAqLywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHRoaXMuI2Nsb3NlZCA9IHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIHRoaXMuI3NldHVwUHJpbWFyeVRhcmdldExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLiNhdHRhY2hFeGlzdGluZ1RhcmdldHMoKTtcbiAgICB9XG4gICAgI2F0dGFjaEV4aXN0aW5nVGFyZ2V0cygpIHtcbiAgICAgICAgY29uc3QgcXVldWUgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZFRhcmdldCBvZiB0aGlzLiN0YXJnZXRNYW5hZ2VyLmdldENoaWxkVGFyZ2V0cyh0aGlzLiNwcmltYXJ5VGFyZ2V0KSkge1xuICAgICAgICAgICAgcXVldWUucHVzaChjaGlsZFRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlkeCA9IDA7XG4gICAgICAgIHdoaWxlIChpZHggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBxdWV1ZVtpZHhdO1xuICAgICAgICAgICAgaWR4Kys7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gbmV4dC5fc2Vzc2lvbigpO1xuICAgICAgICAgICAgaWYgKHNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNvbkF0dGFjaGVkVG9UYXJnZXQoc2Vzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkVGFyZ2V0IG9mIHRoaXMuI3RhcmdldE1hbmFnZXIuZ2V0Q2hpbGRUYXJnZXRzKG5leHQpKSB7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaChjaGlsZFRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI29uQWN0aXZhdGlvbihuZXdTZXNzaW9uKSB7XG4gICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQgPSBuZXdTZXNzaW9uO1xuICAgICAgICBhc3NlcnQodGhpcy4jcHJpbWFyeVRhcmdldENsaWVudCBpbnN0YW5jZW9mIENkcENEUFNlc3Npb24sICdDRFBTZXNzaW9uIGlzIG5vdCBpbnN0YW5jZSBvZiBDRFBTZXNzaW9uSW1wbCcpO1xuICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0ID0gdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5fdGFyZ2V0KCk7XG4gICAgICAgIGFzc2VydCh0aGlzLiNwcmltYXJ5VGFyZ2V0LCAnTWlzc2luZyB0YXJnZXQgb24gc3dhcCcpO1xuICAgICAgICB0aGlzLiNrZXlib2FyZC51cGRhdGVDbGllbnQobmV3U2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI21vdXNlLnVwZGF0ZUNsaWVudChuZXdTZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jdG91Y2hzY3JlZW4udXBkYXRlQ2xpZW50KG5ld1Nlc3Npb24pO1xuICAgICAgICB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLnVwZGF0ZUNsaWVudChuZXdTZXNzaW9uKTtcbiAgICAgICAgdGhpcy4jdHJhY2luZy51cGRhdGVDbGllbnQobmV3U2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI2NvdmVyYWdlLnVwZGF0ZUNsaWVudChuZXdTZXNzaW9uKTtcbiAgICAgICAgYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLnN3YXBGcmFtZVRyZWUobmV3U2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI3NldHVwUHJpbWFyeVRhcmdldExpc3RlbmVycygpO1xuICAgIH1cbiAgICBhc3luYyAjb25TZWNvbmRhcnlUYXJnZXQoc2Vzc2lvbikge1xuICAgICAgICBhc3NlcnQoc2Vzc2lvbiBpbnN0YW5jZW9mIENkcENEUFNlc3Npb24pO1xuICAgICAgICBpZiAoc2Vzc2lvbi5fdGFyZ2V0KCkuX3N1YnR5cGUoKSAhPT0gJ3ByZXJlbmRlcicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIucmVnaXN0ZXJTcGVjdWxhdGl2ZVNlc3Npb24oc2Vzc2lvbikuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIHRoaXMuI2VtdWxhdGlvbk1hbmFnZXJcbiAgICAgICAgICAgIC5yZWdpc3RlclNwZWN1bGF0aXZlU2Vzc2lvbihzZXNzaW9uKVxuICAgICAgICAgICAgLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHVwIGxpc3RlbmVycyBmb3IgdGhlIHByaW1hcnkgdGFyZ2V0LiBUaGUgcHJpbWFyeSB0YXJnZXQgY2FuIGNoYW5nZVxuICAgICAqIGR1cmluZyBhIG5hdmlnYXRpb24gdG8gYSBwcmVyZW5kZWQgcGFnZS5cbiAgICAgKi9cbiAgICAjc2V0dXBQcmltYXJ5VGFyZ2V0TGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50Lm9uKENEUFNlc3Npb25FdmVudC5SZWFkeSwgdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KTtcbiAgICAgICAgZm9yIChjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSBvZiB0aGlzLiNzZXNzaW9uSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBhbnkuXG4gICAgICAgICAgICB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50Lm9uKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uRGV0YWNoZWRGcm9tVGFyZ2V0ID0gKHRhcmdldCkgPT4ge1xuICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSB0YXJnZXQuX3Nlc3Npb24oKT8uaWQoKTtcbiAgICAgICAgY29uc3Qgd29ya2VyID0gdGhpcy4jd29ya2Vycy5nZXQoc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKCF3b3JrZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN3b3JrZXJzLmRlbGV0ZShzZXNzaW9uSWQpO1xuICAgICAgICB0aGlzLmVtaXQoXCJ3b3JrZXJkZXN0cm95ZWRcIiAvKiBQYWdlRXZlbnQuV29ya2VyRGVzdHJveWVkICovLCB3b3JrZXIpO1xuICAgIH07XG4gICAgI29uQXR0YWNoZWRUb1RhcmdldCA9IChzZXNzaW9uKSA9PiB7XG4gICAgICAgIGFzc2VydChzZXNzaW9uIGluc3RhbmNlb2YgQ2RwQ0RQU2Vzc2lvbik7XG4gICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5vbkF0dGFjaGVkVG9UYXJnZXQoc2Vzc2lvbi5fdGFyZ2V0KCkpO1xuICAgICAgICBpZiAoc2Vzc2lvbi5fdGFyZ2V0KCkuX2dldFRhcmdldEluZm8oKS50eXBlID09PSAnd29ya2VyJykge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gbmV3IENkcFdlYldvcmtlcihzZXNzaW9uLCBzZXNzaW9uLl90YXJnZXQoKS51cmwoKSwgc2Vzc2lvbi5fdGFyZ2V0KCkuX3RhcmdldElkLCBzZXNzaW9uLl90YXJnZXQoKS50eXBlKCksIHRoaXMuI2FkZENvbnNvbGVNZXNzYWdlLmJpbmQodGhpcyksIHRoaXMuI2hhbmRsZUV4Y2VwdGlvbi5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuI3dvcmtlcnMuc2V0KHNlc3Npb24uaWQoKSwgd29ya2VyKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcIndvcmtlcmNyZWF0ZWRcIiAvKiBQYWdlRXZlbnQuV29ya2VyQ3JlYXRlZCAqLywgd29ya2VyKTtcbiAgICAgICAgfVxuICAgICAgICBzZXNzaW9uLm9uKENEUFNlc3Npb25FdmVudC5SZWFkeSwgdGhpcy4jb25BdHRhY2hlZFRvVGFyZ2V0KTtcbiAgICB9O1xuICAgIGFzeW5jICNpbml0aWFsaXplKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5pbml0aWFsaXplKHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQpLFxuICAgICAgICAgICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnUGVyZm9ybWFuY2UuZW5hYmxlJyksXG4gICAgICAgICAgICAgICAgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdMb2cuZW5hYmxlJyksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyKSAmJiBpc1RhcmdldENsb3NlZEVycm9yKGVycikpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgI29uRmlsZUNob29zZXIoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzLnNpemUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuI2ZyYW1lTWFuYWdlci5mcmFtZShldmVudC5mcmFtZUlkKTtcbiAgICAgICAgICAgIGFzc2VydChmcmFtZSwgJ1RoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4nKTtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBiZSBhbiBIVE1MSW5wdXRFbGVtZW50IGhhbmRsZSBieSB0aGUgZXZlbnQuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMSwgKGF3YWl0IGZyYW1lLndvcmxkc1tNQUlOX1dPUkxEXS5hZG9wdEJhY2tlbmROb2RlKGV2ZW50LmJhY2tlbmROb2RlSWQpKSwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc3QgZmlsZUNob29zZXIgPSBuZXcgRmlsZUNob29zZXIoaGFuZGxlLm1vdmUoKSwgZXZlbnQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9taXNlIG9mIHRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKGZpbGVDaG9vc2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMSkge1xuICAgICAgICAgICAgZW52XzEuZXJyb3IgPSBlXzE7XG4gICAgICAgICAgICBlbnZfMS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9jbGllbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50O1xuICAgIH1cbiAgICBpc1NlcnZpY2VXb3JrZXJCeXBhc3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NlcnZpY2VXb3JrZXJCeXBhc3NlZDtcbiAgICB9XG4gICAgaXNEcmFnSW50ZXJjZXB0aW9uRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3VzZXJEcmFnSW50ZXJjZXB0aW9uRW5hYmxlZDtcbiAgICB9XG4gICAgaXNKYXZhU2NyaXB0RW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuamF2YXNjcmlwdEVuYWJsZWQ7XG4gICAgfVxuICAgIGFzeW5jIHdhaXRGb3JGaWxlQ2hvb3NlcihvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgbmVlZHNFbmFibGUgPSB0aGlzLiNmaWxlQ2hvb3NlckRlZmVycmVkcy5zaXplID09PSAwO1xuICAgICAgICBjb25zdCB7IHRpbWVvdXQgPSB0aGlzLl90aW1lb3V0U2V0dGluZ3MudGltZW91dCgpIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSh7XG4gICAgICAgICAgICBtZXNzYWdlOiBgV2FpdGluZyBmb3IgXFxgRmlsZUNob29zZXJcXGAgZmFpbGVkOiAke3RpbWVvdXR9bXMgZXhjZWVkZWRgLFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuI2ZpbGVDaG9vc2VyRGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gICAgICAgIGxldCBlbmFibGVQcm9taXNlO1xuICAgICAgICBpZiAobmVlZHNFbmFibGUpIHtcbiAgICAgICAgICAgIGVuYWJsZVByb21pc2UgPSB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ1BhZ2Uuc2V0SW50ZXJjZXB0RmlsZUNob29zZXJEaWFsb2cnLCB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICBkZWZlcnJlZC52YWx1ZU9yVGhyb3coKSxcbiAgICAgICAgICAgICAgICBlbmFibGVQcm9taXNlLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy4jZmlsZUNob29zZXJEZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNldEdlb2xvY2F0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuc2V0R2VvbG9jYXRpb24ob3B0aW9ucyk7XG4gICAgfVxuICAgIHRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3ByaW1hcnlUYXJnZXQ7XG4gICAgfVxuICAgIGJyb3dzZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmltYXJ5VGFyZ2V0LmJyb3dzZXIoKTtcbiAgICB9XG4gICAgYnJvd3NlckNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmltYXJ5VGFyZ2V0LmJyb3dzZXJDb250ZXh0KCk7XG4gICAgfVxuICAgICNvblRhcmdldENyYXNoZWQoKSB7XG4gICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIgLyogUGFnZUV2ZW50LkVycm9yICovLCBuZXcgRXJyb3IoJ1BhZ2UgY3Jhc2hlZCEnKSk7XG4gICAgfVxuICAgICNvbkxvZ0VudHJ5QWRkZWQoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgeyBsZXZlbCwgdGV4dCwgYXJncywgc291cmNlLCB1cmwsIGxpbmVOdW1iZXIgfSA9IGV2ZW50LmVudHJ5O1xuICAgICAgICBpZiAoYXJncykge1xuICAgICAgICAgICAgYXJncy5tYXAoYXJnID0+IHtcbiAgICAgICAgICAgICAgICB2b2lkIHJlbGVhc2VPYmplY3QodGhpcy4jcHJpbWFyeVRhcmdldENsaWVudCwgYXJnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UgIT09ICd3b3JrZXInKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJjb25zb2xlXCIgLyogUGFnZUV2ZW50LkNvbnNvbGUgKi8sIG5ldyBDb25zb2xlTWVzc2FnZShjb252ZXJ0Q29uc29sZU1lc3NhZ2VMZXZlbChsZXZlbCksIHRleHQsIFtdLCBbeyB1cmwsIGxpbmVOdW1iZXIgfV0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtYWluRnJhbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNmcmFtZU1hbmFnZXIubWFpbkZyYW1lKCk7XG4gICAgfVxuICAgIGdldCBrZXlib2FyZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2tleWJvYXJkO1xuICAgIH1cbiAgICBnZXQgdG91Y2hzY3JlZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0b3VjaHNjcmVlbjtcbiAgICB9XG4gICAgZ2V0IGNvdmVyYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY292ZXJhZ2U7XG4gICAgfVxuICAgIGdldCB0cmFjaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhY2luZztcbiAgICB9XG4gICAgZnJhbWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnJhbWVNYW5hZ2VyLmZyYW1lcygpO1xuICAgIH1cbiAgICB3b3JrZXJzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiN3b3JrZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0UmVxdWVzdEludGVyY2VwdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLnNldFJlcXVlc3RJbnRlcmNlcHRpb24odmFsdWUpO1xuICAgIH1cbiAgICBhc3luYyBzZXRCeXBhc3NTZXJ2aWNlV29ya2VyKGJ5cGFzcykge1xuICAgICAgICB0aGlzLiNzZXJ2aWNlV29ya2VyQnlwYXNzZWQgPSBieXBhc3M7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ05ldHdvcmsuc2V0QnlwYXNzU2VydmljZVdvcmtlcicsIHsgYnlwYXNzIH0pO1xuICAgIH1cbiAgICBhc3luYyBzZXREcmFnSW50ZXJjZXB0aW9uKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy4jdXNlckRyYWdJbnRlcmNlcHRpb25FbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnSW5wdXQuc2V0SW50ZXJjZXB0RHJhZ3MnLCB7XG4gICAgICAgICAgICBlbmFibGVkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2V0T2ZmbGluZU1vZGUoZW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLnNldE9mZmxpbmVNb2RlKGVuYWJsZWQpO1xuICAgIH1cbiAgICBhc3luYyBlbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMobmV0d29ya0NvbmRpdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMobmV0d29ya0NvbmRpdGlvbnMpO1xuICAgIH1cbiAgICBzZXREZWZhdWx0TmF2aWdhdGlvblRpbWVvdXQodGltZW91dCkge1xuICAgICAgICB0aGlzLl90aW1lb3V0U2V0dGluZ3Muc2V0RGVmYXVsdE5hdmlnYXRpb25UaW1lb3V0KHRpbWVvdXQpO1xuICAgIH1cbiAgICBzZXREZWZhdWx0VGltZW91dCh0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuX3RpbWVvdXRTZXR0aW5ncy5zZXREZWZhdWx0VGltZW91dCh0aW1lb3V0KTtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdFRpbWVvdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lb3V0U2V0dGluZ3MudGltZW91dCgpO1xuICAgIH1cbiAgICBhc3luYyBxdWVyeU9iamVjdHMocHJvdG90eXBlSGFuZGxlKSB7XG4gICAgICAgIGFzc2VydCghcHJvdG90eXBlSGFuZGxlLmRpc3Bvc2VkLCAnUHJvdG90eXBlIEpTSGFuZGxlIGlzIGRpc3Bvc2VkIScpO1xuICAgICAgICBhc3NlcnQocHJvdG90eXBlSGFuZGxlLmlkLCAnUHJvdG90eXBlIEpTSGFuZGxlIG11c3Qgbm90IGJlIHJlZmVyZW5jaW5nIHByaW1pdGl2ZSB2YWx1ZScpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWFpbkZyYW1lKCkuY2xpZW50LnNlbmQoJ1J1bnRpbWUucXVlcnlPYmplY3RzJywge1xuICAgICAgICAgICAgcHJvdG90eXBlT2JqZWN0SWQ6IHByb3RvdHlwZUhhbmRsZS5pZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1haW5GcmFtZSgpXG4gICAgICAgICAgICAubWFpblJlYWxtKClcbiAgICAgICAgICAgIC5jcmVhdGVDZHBIYW5kbGUocmVzcG9uc2Uub2JqZWN0cyk7XG4gICAgfVxuICAgIGFzeW5jIGNvb2tpZXMoLi4udXJscykge1xuICAgICAgICBjb25zdCBvcmlnaW5hbENvb2tpZXMgPSAoYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdOZXR3b3JrLmdldENvb2tpZXMnLCB7XG4gICAgICAgICAgICB1cmxzOiB1cmxzLmxlbmd0aCA/IHVybHMgOiBbdGhpcy51cmwoKV0sXG4gICAgICAgIH0pKS5jb29raWVzO1xuICAgICAgICBjb25zdCB1bnN1cHBvcnRlZENvb2tpZUF0dHJpYnV0ZXMgPSBbJ3NvdXJjZVBvcnQnXTtcbiAgICAgICAgY29uc3QgZmlsdGVyVW5zdXBwb3J0ZWRBdHRyaWJ1dGVzID0gKGNvb2tpZSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyIG9mIHVuc3VwcG9ydGVkQ29va2llQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb29raWVbYXR0cl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29va2llO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxDb29raWVzLm1hcChmaWx0ZXJVbnN1cHBvcnRlZEF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgICBhc3luYyBkZWxldGVDb29raWUoLi4uY29va2llcykge1xuICAgICAgICBjb25zdCBwYWdlVVJMID0gdGhpcy51cmwoKTtcbiAgICAgICAgZm9yIChjb25zdCBjb29raWUgb2YgY29va2llcykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGNvb2tpZSk7XG4gICAgICAgICAgICBpZiAoIWNvb2tpZS51cmwgJiYgcGFnZVVSTC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICAgICAgICBpdGVtLnVybCA9IHBhZ2VVUkw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ05ldHdvcmsuZGVsZXRlQ29va2llcycsIGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHNldENvb2tpZSguLi5jb29raWVzKSB7XG4gICAgICAgIGNvbnN0IHBhZ2VVUkwgPSB0aGlzLnVybCgpO1xuICAgICAgICBjb25zdCBzdGFydHNXaXRoSFRUUCA9IHBhZ2VVUkwuc3RhcnRzV2l0aCgnaHR0cCcpO1xuICAgICAgICBjb25zdCBpdGVtcyA9IGNvb2tpZXMubWFwKGNvb2tpZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgY29va2llKTtcbiAgICAgICAgICAgIGlmICghaXRlbS51cmwgJiYgc3RhcnRzV2l0aEhUVFApIHtcbiAgICAgICAgICAgICAgICBpdGVtLnVybCA9IHBhZ2VVUkw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQoaXRlbS51cmwgIT09ICdhYm91dDpibGFuaycsIGBCbGFuayBwYWdlIGNhbiBub3QgaGF2ZSBjb29raWUgXCIke2l0ZW0ubmFtZX1cImApO1xuICAgICAgICAgICAgYXNzZXJ0KCFTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGguY2FsbChpdGVtLnVybCB8fCAnJywgJ2RhdGE6JyksIGBEYXRhIFVSTCBwYWdlIGNhbiBub3QgaGF2ZSBjb29raWUgXCIke2l0ZW0ubmFtZX1cImApO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUNvb2tpZSguLi5pdGVtcyk7XG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnTmV0d29yay5zZXRDb29raWVzJywge1xuICAgICAgICAgICAgICAgIGNvb2tpZXM6IGl0ZW1zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZXhwb3NlRnVuY3Rpb24obmFtZSwgcHB0ckZ1bmN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLiNiaW5kaW5ncy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGFkZCBwYWdlIGJpbmRpbmcgd2l0aCBuYW1lICR7bmFtZX06IHdpbmRvd1snJHtuYW1lfSddIGFscmVhZHkgZXhpc3RzIWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHBhZ2VCaW5kaW5nSW5pdFN0cmluZygnZXhwb3NlZEZ1bicsIG5hbWUpO1xuICAgICAgICBsZXQgYmluZGluZztcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgcHB0ckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICAgICAgYmluZGluZyA9IG5ldyBCaW5kaW5nKG5hbWUsIHBwdHJGdW5jdGlvbiwgc291cmNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYmluZGluZyA9IG5ldyBCaW5kaW5nKG5hbWUsIHBwdHJGdW5jdGlvbi5kZWZhdWx0LCBzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2JpbmRpbmdzLnNldChuYW1lLCBiaW5kaW5nKTtcbiAgICAgICAgY29uc3QgW3sgaWRlbnRpZmllciB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5ldmFsdWF0ZU9uTmV3RG9jdW1lbnQoc291cmNlKSxcbiAgICAgICAgICAgIHRoaXMuI2ZyYW1lTWFuYWdlci5hZGRFeHBvc2VkRnVuY3Rpb25CaW5kaW5nKGJpbmRpbmcpLFxuICAgICAgICBdKTtcbiAgICAgICAgdGhpcy4jZXhwb3NlZEZ1bmN0aW9ucy5zZXQobmFtZSwgaWRlbnRpZmllcik7XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZUV4cG9zZWRGdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGV4cG9zZWRGdW5jdGlvbklkID0gdGhpcy4jZXhwb3NlZEZ1bmN0aW9ucy5nZXQobmFtZSk7XG4gICAgICAgIGlmICghZXhwb3NlZEZ1bmN0aW9uSWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb24gd2l0aCBuYW1lIFwiJHtuYW1lfVwiIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gI2JpbmRpbmdzIG11c3QgYmUgdXBkYXRlZCB0b2dldGhlciB3aXRoICNleHBvc2VkRnVuY3Rpb25zLlxuICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy4jYmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgICAgICB0aGlzLiNleHBvc2VkRnVuY3Rpb25zLmRlbGV0ZShuYW1lKTtcbiAgICAgICAgdGhpcy4jYmluZGluZ3MuZGVsZXRlKG5hbWUpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLiNmcmFtZU1hbmFnZXIucmVtb3ZlU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQoZXhwb3NlZEZ1bmN0aW9uSWQpLFxuICAgICAgICAgICAgdGhpcy4jZnJhbWVNYW5hZ2VyLnJlbW92ZUV4cG9zZWRGdW5jdGlvbkJpbmRpbmcoYmluZGluZyksXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBhc3luYyBhdXRoZW50aWNhdGUoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5hdXRoZW50aWNhdGUoY3JlZGVudGlhbHMpO1xuICAgIH1cbiAgICBhc3luYyBzZXRFeHRyYUhUVFBIZWFkZXJzKGhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5zZXRFeHRyYUhUVFBIZWFkZXJzKGhlYWRlcnMpO1xuICAgIH1cbiAgICBhc3luYyBzZXRVc2VyQWdlbnQodXNlckFnZW50LCB1c2VyQWdlbnRNZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZnJhbWVNYW5hZ2VyLm5ldHdvcmtNYW5hZ2VyLnNldFVzZXJBZ2VudCh1c2VyQWdlbnQsIHVzZXJBZ2VudE1ldGFkYXRhKTtcbiAgICB9XG4gICAgYXN5bmMgbWV0cmljcygpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ1BlcmZvcm1hbmNlLmdldE1ldHJpY3MnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2J1aWxkTWV0cmljc09iamVjdChyZXNwb25zZS5tZXRyaWNzKTtcbiAgICB9XG4gICAgI2VtaXRNZXRyaWNzKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZW1pdChcIm1ldHJpY3NcIiAvKiBQYWdlRXZlbnQuTWV0cmljcyAqLywge1xuICAgICAgICAgICAgdGl0bGU6IGV2ZW50LnRpdGxlLFxuICAgICAgICAgICAgbWV0cmljczogdGhpcy4jYnVpbGRNZXRyaWNzT2JqZWN0KGV2ZW50Lm1ldHJpY3MpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgI2J1aWxkTWV0cmljc09iamVjdChtZXRyaWNzKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IG1ldHJpYyBvZiBtZXRyaWNzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoc3VwcG9ydGVkTWV0cmljcy5oYXMobWV0cmljLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W21ldHJpYy5uYW1lXSA9IG1ldHJpYy52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAjaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgICB0aGlzLmVtaXQoXCJwYWdlZXJyb3JcIiAvKiBQYWdlRXZlbnQuUGFnZUVycm9yICovLCBjcmVhdGVDbGllbnRFcnJvcihleGNlcHRpb24uZXhjZXB0aW9uRGV0YWlscykpO1xuICAgIH1cbiAgICAjb25Db25zb2xlQVBJKHdvcmxkLCBldmVudCkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBldmVudC5hcmdzLm1hcChhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdvcmxkLmNyZWF0ZUNkcEhhbmRsZShhcmcpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jYWRkQ29uc29sZU1lc3NhZ2UoY29udmVydENvbnNvbGVNZXNzYWdlTGV2ZWwoZXZlbnQudHlwZSksIHZhbHVlcywgZXZlbnQuc3RhY2tUcmFjZSk7XG4gICAgfVxuICAgIGFzeW5jICNvbkJpbmRpbmdDYWxsZWQod29ybGQsIGV2ZW50KSB7XG4gICAgICAgIGxldCBwYXlsb2FkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2UoZXZlbnQucGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgLy8gVGhlIGJpbmRpbmcgd2FzIGVpdGhlciBjYWxsZWQgYnkgc29tZXRoaW5nIGluIHRoZSBwYWdlIG9yIGl0IHdhc1xuICAgICAgICAgICAgLy8gY2FsbGVkIGJlZm9yZSBvdXIgd3JhcHBlciB3YXMgaW5pdGlhbGl6ZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0eXBlLCBuYW1lLCBzZXEsIGFyZ3MsIGlzVHJpdmlhbCB9ID0gcGF5bG9hZDtcbiAgICAgICAgaWYgKHR5cGUgIT09ICdleHBvc2VkRnVuJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB3b3JsZC5jb250ZXh0O1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy4jYmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgICAgICBhd2FpdCBiaW5kaW5nPy5ydW4oY29udGV4dCwgc2VxLCBhcmdzLCBpc1RyaXZpYWwpO1xuICAgIH1cbiAgICAjYWRkQ29uc29sZU1lc3NhZ2UoZXZlbnRUeXBlLCBhcmdzLCBzdGFja1RyYWNlKSB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lckNvdW50KFwiY29uc29sZVwiIC8qIFBhZ2VFdmVudC5Db25zb2xlICovKSkge1xuICAgICAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0VG9rZW5zID0gW107XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuIC0tIFRoZSBjb21tZW50IGlzIGxvbmcuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBydWxlc2Rpci91c2UtdXNpbmcgLS0gVGhlc2UgYXJlIG5vdCBvd25lZCBieSB0aGlzIGZ1bmN0aW9uLlxuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdGVPYmplY3QgPSBhcmcucmVtb3RlT2JqZWN0KCk7XG4gICAgICAgICAgICBpZiAocmVtb3RlT2JqZWN0Lm9iamVjdElkKSB7XG4gICAgICAgICAgICAgICAgdGV4dFRva2Vucy5wdXNoKGFyZy50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRleHRUb2tlbnMucHVzaCh2YWx1ZUZyb21SZW1vdGVPYmplY3QocmVtb3RlT2JqZWN0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhY2tUcmFjZUxvY2F0aW9ucyA9IFtdO1xuICAgICAgICBpZiAoc3RhY2tUcmFjZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYWxsRnJhbWUgb2Ygc3RhY2tUcmFjZS5jYWxsRnJhbWVzKSB7XG4gICAgICAgICAgICAgICAgc3RhY2tUcmFjZUxvY2F0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBjYWxsRnJhbWUudXJsLFxuICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBjYWxsRnJhbWUubGluZU51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyOiBjYWxsRnJhbWUuY29sdW1uTnVtYmVyLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgQ29uc29sZU1lc3NhZ2UoY29udmVydENvbnNvbGVNZXNzYWdlTGV2ZWwoZXZlbnRUeXBlKSwgdGV4dFRva2Vucy5qb2luKCcgJyksIGFyZ3MsIHN0YWNrVHJhY2VMb2NhdGlvbnMpO1xuICAgICAgICB0aGlzLmVtaXQoXCJjb25zb2xlXCIgLyogUGFnZUV2ZW50LkNvbnNvbGUgKi8sIG1lc3NhZ2UpO1xuICAgIH1cbiAgICAjb25EaWFsb2coZXZlbnQpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHZhbGlkYXRlRGlhbG9nVHlwZShldmVudC50eXBlKTtcbiAgICAgICAgY29uc3QgZGlhbG9nID0gbmV3IENkcERpYWxvZyh0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LCB0eXBlLCBldmVudC5tZXNzYWdlLCBldmVudC5kZWZhdWx0UHJvbXB0KTtcbiAgICAgICAgdGhpcy5lbWl0KFwiZGlhbG9nXCIgLyogUGFnZUV2ZW50LkRpYWxvZyAqLywgZGlhbG9nKTtcbiAgICB9XG4gICAgYXN5bmMgcmVsb2FkKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLndhaXRGb3JOYXZpZ2F0aW9uKHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgIGlnbm9yZVNhbWVEb2N1bWVudE5hdmlnYXRpb246IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuc2VuZCgnUGFnZS5yZWxvYWQnKSxcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIGNyZWF0ZUNEUFNlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRhcmdldCgpLmNyZWF0ZUNEUFNlc3Npb24oKTtcbiAgICB9XG4gICAgYXN5bmMgZ29CYWNrKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZ28oLTEsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBhc3luYyBnb0ZvcndhcmQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNnbygrMSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGFzeW5jICNnbyhkZWx0YSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBoaXN0b3J5ID0gYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5Jyk7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gaGlzdG9yeS5lbnRyaWVzW2hpc3RvcnkuY3VycmVudEluZGV4ICsgZGVsdGFdO1xuICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICB0aGlzLndhaXRGb3JOYXZpZ2F0aW9uKG9wdGlvbnMpLFxuICAgICAgICAgICAgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLm5hdmlnYXRlVG9IaXN0b3J5RW50cnknLCB7XG4gICAgICAgICAgICAgICAgZW50cnlJZDogZW50cnkuaWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiByZXN1bHRbMF07XG4gICAgfVxuICAgIGFzeW5jIGJyaW5nVG9Gcm9udCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmJyaW5nVG9Gcm9udCcpO1xuICAgIH1cbiAgICBhc3luYyBzZXRKYXZhU2NyaXB0RW5hYmxlZChlbmFibGVkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLnNldEphdmFTY3JpcHRFbmFibGVkKGVuYWJsZWQpO1xuICAgIH1cbiAgICBhc3luYyBzZXRCeXBhc3NDU1AoZW5hYmxlZCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcmltYXJ5VGFyZ2V0Q2xpZW50LnNlbmQoJ1BhZ2Uuc2V0QnlwYXNzQ1NQJywgeyBlbmFibGVkIH0pO1xuICAgIH1cbiAgICBhc3luYyBlbXVsYXRlTWVkaWFUeXBlKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuZW11bGF0ZU1lZGlhVHlwZSh0eXBlKTtcbiAgICB9XG4gICAgYXN5bmMgZW11bGF0ZUNQVVRocm90dGxpbmcoZmFjdG9yKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLmVtdWxhdGVDUFVUaHJvdHRsaW5nKGZhY3Rvcik7XG4gICAgfVxuICAgIGFzeW5jIGVtdWxhdGVNZWRpYUZlYXR1cmVzKGZlYXR1cmVzKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLmVtdWxhdGVNZWRpYUZlYXR1cmVzKGZlYXR1cmVzKTtcbiAgICB9XG4gICAgYXN5bmMgZW11bGF0ZVRpbWV6b25lKHRpbWV6b25lSWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuZW11bGF0ZVRpbWV6b25lKHRpbWV6b25lSWQpO1xuICAgIH1cbiAgICBhc3luYyBlbXVsYXRlSWRsZVN0YXRlKG92ZXJyaWRlcykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZW11bGF0aW9uTWFuYWdlci5lbXVsYXRlSWRsZVN0YXRlKG92ZXJyaWRlcyk7XG4gICAgfVxuICAgIGFzeW5jIGVtdWxhdGVWaXNpb25EZWZpY2llbmN5KHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuZW11bGF0ZVZpc2lvbkRlZmljaWVuY3kodHlwZSk7XG4gICAgfVxuICAgIGFzeW5jIHNldFZpZXdwb3J0KHZpZXdwb3J0KSB7XG4gICAgICAgIGNvbnN0IG5lZWRzUmVsb2FkID0gYXdhaXQgdGhpcy4jZW11bGF0aW9uTWFuYWdlci5lbXVsYXRlVmlld3BvcnQodmlld3BvcnQpO1xuICAgICAgICB0aGlzLiN2aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICAgICBpZiAobmVlZHNSZWxvYWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlld3BvcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2aWV3cG9ydDtcbiAgICB9XG4gICAgYXN5bmMgZXZhbHVhdGVPbk5ld0RvY3VtZW50KHBhZ2VGdW5jdGlvbiwgLi4uYXJncykge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmFsdWF0aW9uU3RyaW5nKHBhZ2VGdW5jdGlvbiwgLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNmcmFtZU1hbmFnZXIuZXZhbHVhdGVPbk5ld0RvY3VtZW50KHNvdXJjZSk7XG4gICAgfVxuICAgIGFzeW5jIHJlbW92ZVNjcmlwdFRvRXZhbHVhdGVPbk5ld0RvY3VtZW50KGlkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5yZW1vdmVTY3JpcHRUb0V2YWx1YXRlT25OZXdEb2N1bWVudChpZGVudGlmaWVyKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0Q2FjaGVFbmFibGVkKGVuYWJsZWQgPSB0cnVlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2ZyYW1lTWFuYWdlci5uZXR3b3JrTWFuYWdlci5zZXRDYWNoZUVuYWJsZWQoZW5hYmxlZCk7XG4gICAgfVxuICAgIGFzeW5jIF9zY3JlZW5zaG90KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZW52XzIgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IGZyb21TdXJmYWNlLCBvbWl0QmFja2dyb3VuZCwgb3B0aW1pemVGb3JTcGVlZCwgcXVhbGl0eSwgY2xpcDogdXNlckNsaXAsIHR5cGUsIGNhcHR1cmVCZXlvbmRWaWV3cG9ydCwgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBpc0ZpcmVmb3ggPSB0aGlzLnRhcmdldCgpLl90YXJnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBGaXJlZm94VGFyZ2V0TWFuYWdlcjtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzIsIG5ldyBBc3luY0Rpc3Bvc2FibGVTdGFjaygpLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIEZpcmVmb3ggb21pdHMgYmFja2dyb3VuZCBieSBkZWZhdWx0OyBpdCdzIG5vdCBjb25maWd1cmFibGUuXG4gICAgICAgICAgICBpZiAoIWlzRmlyZWZveCAmJiBvbWl0QmFja2dyb3VuZCAmJiAodHlwZSA9PT0gJ3BuZycgfHwgdHlwZSA9PT0gJ3dlYnAnKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kQ29sb3IoKTtcbiAgICAgICAgICAgICAgICBzdGFjay5kZWZlcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNldERlZmF1bHRCYWNrZ3JvdW5kQ29sb3IoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNsaXAgPSB1c2VyQ2xpcDtcbiAgICAgICAgICAgIGlmIChjbGlwICYmICFjYXB0dXJlQmV5b25kVmlld3BvcnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IGF3YWl0IHRoaXMubWFpbkZyYW1lKClcbiAgICAgICAgICAgICAgICAgICAgLmlzb2xhdGVkUmVhbG0oKVxuICAgICAgICAgICAgICAgICAgICAuZXZhbHVhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGhlaWdodCwgcGFnZUxlZnQ6IHgsIHBhZ2VUb3A6IHksIHdpZHRoLCB9ID0gd2luZG93LnZpc3VhbFZpZXdwb3J0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB4LCB5LCBoZWlnaHQsIHdpZHRoIH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2xpcCA9IGdldEludGVyc2VjdGlvblJlY3QoY2xpcCwgdmlld3BvcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGVzZSBzcHJlYWRzIGJlY2F1c2UgRmlyZWZveCBkb2Vzbid0IGFsbG93IHVua25vd24gb3B0aW9ucy5cbiAgICAgICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmNhcHR1cmVTY3JlZW5zaG90Jywge1xuICAgICAgICAgICAgICAgIGZvcm1hdDogdHlwZSxcbiAgICAgICAgICAgICAgICAuLi4ob3B0aW1pemVGb3JTcGVlZCA/IHsgb3B0aW1pemVGb3JTcGVlZCB9IDoge30pLFxuICAgICAgICAgICAgICAgIC4uLihxdWFsaXR5ICE9PSB1bmRlZmluZWQgPyB7IHF1YWxpdHk6IE1hdGgucm91bmQocXVhbGl0eSkgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAuLi4oY2xpcCA/IHsgY2xpcDogeyAuLi5jbGlwLCBzY2FsZTogY2xpcC5zY2FsZSA/PyAxIH0gfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAuLi4oIWZyb21TdXJmYWNlID8geyBmcm9tU3VyZmFjZSB9IDoge30pLFxuICAgICAgICAgICAgICAgIGNhcHR1cmVCZXlvbmRWaWV3cG9ydCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzI7XG4gICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRfMSA9IF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMik7XG4gICAgICAgICAgICBpZiAocmVzdWx0XzEpXG4gICAgICAgICAgICAgICAgYXdhaXQgcmVzdWx0XzE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgY3JlYXRlUERGU3RyZWFtKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHRpbWVvdXQ6IG1zID0gdGhpcy5fdGltZW91dFNldHRpbmdzLnRpbWVvdXQoKSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgeyBsYW5kc2NhcGUsIGRpc3BsYXlIZWFkZXJGb290ZXIsIGhlYWRlclRlbXBsYXRlLCBmb290ZXJUZW1wbGF0ZSwgcHJpbnRCYWNrZ3JvdW5kLCBzY2FsZSwgd2lkdGg6IHBhcGVyV2lkdGgsIGhlaWdodDogcGFwZXJIZWlnaHQsIG1hcmdpbiwgcGFnZVJhbmdlcywgcHJlZmVyQ1NTUGFnZVNpemUsIG9taXRCYWNrZ3JvdW5kLCB0YWdnZWQ6IGdlbmVyYXRlVGFnZ2VkUERGLCBvdXRsaW5lOiBnZW5lcmF0ZURvY3VtZW50T3V0bGluZSwgd2FpdEZvckZvbnRzLCB9ID0gcGFyc2VQREZPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBpZiAob21pdEJhY2tncm91bmQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2VtdWxhdGlvbk1hbmFnZXIuc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kQ29sb3IoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2FpdEZvckZvbnRzKSB7XG4gICAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShmcm9tKHRoaXMubWFpbkZyYW1lKClcbiAgICAgICAgICAgICAgICAuaXNvbGF0ZWRSZWFsbSgpXG4gICAgICAgICAgICAgICAgLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZm9udHMucmVhZHk7XG4gICAgICAgICAgICB9KSkucGlwZShyYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmludENvbW1hbmRQcm9taXNlID0gdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLnByaW50VG9QREYnLCB7XG4gICAgICAgICAgICB0cmFuc2Zlck1vZGU6ICdSZXR1cm5Bc1N0cmVhbScsXG4gICAgICAgICAgICBsYW5kc2NhcGUsXG4gICAgICAgICAgICBkaXNwbGF5SGVhZGVyRm9vdGVyLFxuICAgICAgICAgICAgaGVhZGVyVGVtcGxhdGUsXG4gICAgICAgICAgICBmb290ZXJUZW1wbGF0ZSxcbiAgICAgICAgICAgIHByaW50QmFja2dyb3VuZCxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgcGFwZXJXaWR0aCxcbiAgICAgICAgICAgIHBhcGVySGVpZ2h0LFxuICAgICAgICAgICAgbWFyZ2luVG9wOiBtYXJnaW4udG9wLFxuICAgICAgICAgICAgbWFyZ2luQm90dG9tOiBtYXJnaW4uYm90dG9tLFxuICAgICAgICAgICAgbWFyZ2luTGVmdDogbWFyZ2luLmxlZnQsXG4gICAgICAgICAgICBtYXJnaW5SaWdodDogbWFyZ2luLnJpZ2h0LFxuICAgICAgICAgICAgcGFnZVJhbmdlcyxcbiAgICAgICAgICAgIHByZWZlckNTU1BhZ2VTaXplLFxuICAgICAgICAgICAgZ2VuZXJhdGVUYWdnZWRQREYsXG4gICAgICAgICAgICBnZW5lcmF0ZURvY3VtZW50T3V0bGluZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGZyb20ocHJpbnRDb21tYW5kUHJvbWlzZSkucGlwZShyYWNlV2l0aCh0aW1lb3V0KG1zKSkpKTtcbiAgICAgICAgaWYgKG9taXRCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNlbXVsYXRpb25NYW5hZ2VyLnJlc2V0RGVmYXVsdEJhY2tncm91bmRDb2xvcigpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChyZXN1bHQuc3RyZWFtLCAnYHN0cmVhbWAgaXMgbWlzc2luZyBmcm9tIGBQYWdlLnByaW50VG9QREYnKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldFJlYWRhYmxlRnJvbVByb3RvY29sU3RyZWFtKHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQsIHJlc3VsdC5zdHJlYW0pO1xuICAgIH1cbiAgICBhc3luYyBwZGYob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgcGF0aCA9IHVuZGVmaW5lZCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgcmVhZGFibGUgPSBhd2FpdCB0aGlzLmNyZWF0ZVBERlN0cmVhbShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZ2V0UmVhZGFibGVBc0J1ZmZlcihyZWFkYWJsZSwgcGF0aCk7XG4gICAgICAgIGFzc2VydChidWZmZXIsICdDb3VsZCBub3QgY3JlYXRlIGJ1ZmZlcicpO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBjbG9zZShvcHRpb25zID0geyBydW5CZWZvcmVVbmxvYWQ6IHVuZGVmaW5lZCB9KSB7XG4gICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgX2d1YXJkID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzMsIGF3YWl0IHRoaXMuYnJvd3NlckNvbnRleHQoKS53YWl0Rm9yU2NyZWVuc2hvdE9wZXJhdGlvbnMoKSwgZmFsc2UpO1xuICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuI3ByaW1hcnlUYXJnZXRDbGllbnQuY29ubmVjdGlvbigpO1xuICAgICAgICAgICAgYXNzZXJ0KGNvbm5lY3Rpb24sICdQcm90b2NvbCBlcnJvcjogQ29ubmVjdGlvbiBjbG9zZWQuIE1vc3QgbGlrZWx5IHRoZSBwYWdlIGhhcyBiZWVuIGNsb3NlZC4nKTtcbiAgICAgICAgICAgIGNvbnN0IHJ1bkJlZm9yZVVubG9hZCA9ICEhb3B0aW9ucy5ydW5CZWZvcmVVbmxvYWQ7XG4gICAgICAgICAgICBpZiAocnVuQmVmb3JlVW5sb2FkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJpbWFyeVRhcmdldENsaWVudC5zZW5kKCdQYWdlLmNsb3NlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1RhcmdldC5jbG9zZVRhcmdldCcsIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SWQ6IHRoaXMuI3ByaW1hcnlUYXJnZXQuX3RhcmdldElkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3RhYlRhcmdldC5faXNDbG9zZWREZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8zKSB7XG4gICAgICAgICAgICBlbnZfMy5lcnJvciA9IGVfMztcbiAgICAgICAgICAgIGVudl8zLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNDbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjbG9zZWQ7XG4gICAgfVxuICAgIGdldCBtb3VzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI21vdXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY291cGxlZCB3aXRoIGFuIGFjdGlvbiB0aGF0IHRyaWdnZXJzIGEgZGV2aWNlXG4gICAgICogcmVxdWVzdCBmcm9tIGFuIGFwaSBzdWNoIGFzIFdlYkJsdWV0b290aC5cbiAgICAgKlxuICAgICAqIDo6OmNhdXRpb25cbiAgICAgKlxuICAgICAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBkZXZpY2UgcmVxdWVzdCBpcyBtYWRlLiBJdCB3aWxsIG5vdCByZXR1cm4gYVxuICAgICAqIGN1cnJlbnRseSBhY3RpdmUgZGV2aWNlIHByb21wdC5cbiAgICAgKlxuICAgICAqIDo6OlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgW2RldmljZVByb21wdF0gPSBQcm9taXNlLmFsbChbXG4gICAgICogICBwYWdlLndhaXRGb3JEZXZpY2VQcm9tcHQoKSxcbiAgICAgKiAgIHBhZ2UuY2xpY2soJyNjb25uZWN0LWJsdWV0b290aCcpLFxuICAgICAqIF0pO1xuICAgICAqIGF3YWl0IGRldmljZVByb21wdC5zZWxlY3QoXG4gICAgICogICBhd2FpdCBkZXZpY2VQcm9tcHQud2FpdEZvckRldmljZSgoe25hbWV9KSA9PiBuYW1lLmluY2x1ZGVzKCdNeSBEZXZpY2UnKSlcbiAgICAgKiApO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JEZXZpY2VQcm9tcHQob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haW5GcmFtZSgpLndhaXRGb3JEZXZpY2VQcm9tcHQob3B0aW9ucyk7XG4gICAgfVxufVxuY29uc3Qgc3VwcG9ydGVkTWV0cmljcyA9IG5ldyBTZXQoW1xuICAgICdUaW1lc3RhbXAnLFxuICAgICdEb2N1bWVudHMnLFxuICAgICdGcmFtZXMnLFxuICAgICdKU0V2ZW50TGlzdGVuZXJzJyxcbiAgICAnTm9kZXMnLFxuICAgICdMYXlvdXRDb3VudCcsXG4gICAgJ1JlY2FsY1N0eWxlQ291bnQnLFxuICAgICdMYXlvdXREdXJhdGlvbicsXG4gICAgJ1JlY2FsY1N0eWxlRHVyYXRpb24nLFxuICAgICdTY3JpcHREdXJhdGlvbicsXG4gICAgJ1Rhc2tEdXJhdGlvbicsXG4gICAgJ0pTSGVhcFVzZWRTaXplJyxcbiAgICAnSlNIZWFwVG90YWxTaXplJyxcbl0pO1xuLyoqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmRyaXZlci1iaWRpLyNyZWN0YW5nbGUtaW50ZXJzZWN0aW9uICovXG5mdW5jdGlvbiBnZXRJbnRlcnNlY3Rpb25SZWN0KGNsaXAsIHZpZXdwb3J0KSB7XG4gICAgLy8gTm90ZSB0aGVzZSB3aWxsIGFscmVhZHkgYmUgbm9ybWFsaXplZC5cbiAgICBjb25zdCB4ID0gTWF0aC5tYXgoY2xpcC54LCB2aWV3cG9ydC54KTtcbiAgICBjb25zdCB5ID0gTWF0aC5tYXgoY2xpcC55LCB2aWV3cG9ydC55KTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3aWR0aDogTWF0aC5tYXgoTWF0aC5taW4oY2xpcC54ICsgY2xpcC53aWR0aCwgdmlld3BvcnQueCArIHZpZXdwb3J0LndpZHRoKSAtIHgsIDApLFxuICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KE1hdGgubWluKGNsaXAueSArIGNsaXAuaGVpZ2h0LCB2aWV3cG9ydC55ICsgdmlld3BvcnQuaGVpZ2h0KSAtIHksIDApLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QYWdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEEgbGlzdCBvZiBwcmUtZGVmaW5lZCBuZXR3b3JrIGNvbmRpdGlvbnMgdG8gYmUgdXNlZCB3aXRoXG4gKiB7QGxpbmsgUGFnZS5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7UHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zfSBmcm9tICdwdXBwZXRlZXInO1xuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyhcbiAqICAgICBQcmVkZWZpbmVkTmV0d29ya0NvbmRpdGlvbnNbJ1Nsb3cgM0cnXVxuICogICApO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20nKTtcbiAqICAgYXdhaXQgcGFnZS5lbXVsYXRlTmV0d29ya0NvbmRpdGlvbnMoXG4gKiAgICAgUHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zWydGYXN0IDNHJ11cbiAqICAgKTtcbiAqICAgYXdhaXQgcGFnZS5nb3RvKCdodHRwczovL3d3dy5nb29nbGUuY29tJyk7XG4gKiAgIGF3YWl0IHBhZ2UuZW11bGF0ZU5ldHdvcmtDb25kaXRpb25zKFxuICogICAgIFByZWRlZmluZWROZXR3b3JrQ29uZGl0aW9uc1snU2xvdyA0RyddXG4gKiAgICk7IC8vIGFsaWFzIHRvIEZhc3QgM0cuXG4gKiAgIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbScpO1xuICogICBhd2FpdCBwYWdlLmVtdWxhdGVOZXR3b3JrQ29uZGl0aW9ucyhcbiAqICAgICBQcmVkZWZpbmVkTmV0d29ya0NvbmRpdGlvbnNbJ0Zhc3QgNEcnXVxuICogICApO1xuICogICBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20nKTtcbiAqICAgLy8gb3RoZXIgYWN0aW9ucy4uLlxuICogICBhd2FpdCBicm93c2VyLmNsb3NlKCk7XG4gKiB9KSgpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgUHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgLy8gR2VuZXJhbGx5IGFsaWduZWQgd2l0aCBEZXZUb29sc1xuICAgIC8vIGh0dHBzOi8vc291cmNlLmNocm9taXVtLm9yZy9jaHJvbWl1bS9jaHJvbWl1bS9zcmMvKy9tYWluOnRoaXJkX3BhcnR5L2RldnRvb2xzLWZyb250ZW5kL3NyYy9mcm9udF9lbmQvY29yZS9zZGsvTmV0d29ya01hbmFnZXIudHM7bD0zOTg7ZHJjPTIyNWUxMjQwZjUyMmNhNjg0NDczZjU0MWFlNmRhZTZjZDc2NmRkMzMuXG4gICAgJ1Nsb3cgM0cnOiB7XG4gICAgICAgIC8vIH41MDBLYnBzIGRvd25cbiAgICAgICAgZG93bmxvYWQ6ICgoNTAwICogMTAwMCkgLyA4KSAqIDAuOCxcbiAgICAgICAgLy8gfjUwMEticHMgdXBcbiAgICAgICAgdXBsb2FkOiAoKDUwMCAqIDEwMDApIC8gOCkgKiAwLjgsXG4gICAgICAgIC8vIDQwMG1zIFJUVFxuICAgICAgICBsYXRlbmN5OiA0MDAgKiA1LFxuICAgIH0sXG4gICAgJ0Zhc3QgM0cnOiB7XG4gICAgICAgIC8vIH4xLjYgTWJwcyBkb3duXG4gICAgICAgIGRvd25sb2FkOiAoKDEuNiAqIDEwMDAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyB+MC43NSBNYnBzIHVwXG4gICAgICAgIHVwbG9hZDogKCg3NTAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyAxNTBtcyBSVFRcbiAgICAgICAgbGF0ZW5jeTogMTUwICogMy43NSxcbiAgICB9LFxuICAgIC8vIGFsaWFzIHRvIEZhc3QgM0cgdG8gYWxpZ24gd2l0aCBMaWdodGhvdXNlIChjcmJ1Zy5jb20vMzQyNDA2NjA4KVxuICAgIC8vIGFuZCBEZXZUb29scyAoY3JidWcuY29tLzM0MjQwNjYwOCksXG4gICAgJ1Nsb3cgNEcnOiB7XG4gICAgICAgIC8vIH4xLjYgTWJwcyBkb3duXG4gICAgICAgIGRvd25sb2FkOiAoKDEuNiAqIDEwMDAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyB+MC43NSBNYnBzIHVwXG4gICAgICAgIHVwbG9hZDogKCg3NTAgKiAxMDAwKSAvIDgpICogMC45LFxuICAgICAgICAvLyAxNTBtcyBSVFRcbiAgICAgICAgbGF0ZW5jeTogMTUwICogMy43NSxcbiAgICB9LFxuICAgICdGYXN0IDRHJzoge1xuICAgICAgICAvLyA5IE1icHMgZG93blxuICAgICAgICBkb3dubG9hZDogKCg5ICogMTAwMCAqIDEwMDApIC8gOCkgKiAwLjksXG4gICAgICAgIC8vIDEuNSBNYnBzIHVwXG4gICAgICAgIHVwbG9hZDogKCgxLjUgKiAxMDAwICogMTAwMCkgLyA4KSAqIDAuOSxcbiAgICAgICAgLy8gNjBtcyBSVFRcbiAgICAgICAgbGF0ZW5jeTogNjAgKiAyLjc1LFxuICAgIH0sXG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVByZWRlZmluZWROZXR3b3JrQ29uZGl0aW9ucy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVGFyZ2V0LCBUYXJnZXRUeXBlIH0gZnJvbSAnLi4vYXBpL1RhcmdldC5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IENkcENEUFNlc3Npb24gfSBmcm9tICcuL0NEUFNlc3Npb24uanMnO1xuaW1wb3J0IHsgQ2RwUGFnZSB9IGZyb20gJy4vUGFnZS5qcyc7XG5pbXBvcnQgeyBDZHBXZWJXb3JrZXIgfSBmcm9tICcuL1dlYldvcmtlci5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdmFyIEluaXRpYWxpemF0aW9uU3RhdHVzO1xuKGZ1bmN0aW9uIChJbml0aWFsaXphdGlvblN0YXR1cykge1xuICAgIEluaXRpYWxpemF0aW9uU3RhdHVzW1wiU1VDQ0VTU1wiXSA9IFwic3VjY2Vzc1wiO1xuICAgIEluaXRpYWxpemF0aW9uU3RhdHVzW1wiQUJPUlRFRFwiXSA9IFwiYWJvcnRlZFwiO1xufSkoSW5pdGlhbGl6YXRpb25TdGF0dXMgfHwgKEluaXRpYWxpemF0aW9uU3RhdHVzID0ge30pKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBDZHBUYXJnZXQgZXh0ZW5kcyBUYXJnZXQge1xuICAgICNicm93c2VyQ29udGV4dDtcbiAgICAjc2Vzc2lvbjtcbiAgICAjdGFyZ2V0SW5mbztcbiAgICAjdGFyZ2V0TWFuYWdlcjtcbiAgICAjc2Vzc2lvbkZhY3Rvcnk7XG4gICAgI2NoaWxkVGFyZ2V0cyA9IG5ldyBTZXQoKTtcbiAgICBfaW5pdGlhbGl6ZWREZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgIF9pc0Nsb3NlZERlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgX3RhcmdldElkO1xuICAgIC8qKlxuICAgICAqIFRvIGluaXRpYWxpemUgdGhlIHRhcmdldCBmb3IgdXNlLCBjYWxsIGluaXRpYWxpemUuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0YXJnZXRJbmZvLCBzZXNzaW9uLCBicm93c2VyQ29udGV4dCwgdGFyZ2V0TWFuYWdlciwgc2Vzc2lvbkZhY3RvcnkpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgICAgIHRoaXMuI3RhcmdldE1hbmFnZXIgPSB0YXJnZXRNYW5hZ2VyO1xuICAgICAgICB0aGlzLiN0YXJnZXRJbmZvID0gdGFyZ2V0SW5mbztcbiAgICAgICAgdGhpcy4jYnJvd3NlckNvbnRleHQgPSBicm93c2VyQ29udGV4dDtcbiAgICAgICAgdGhpcy5fdGFyZ2V0SWQgPSB0YXJnZXRJbmZvLnRhcmdldElkO1xuICAgICAgICB0aGlzLiNzZXNzaW9uRmFjdG9yeSA9IHNlc3Npb25GYWN0b3J5O1xuICAgICAgICBpZiAodGhpcy4jc2Vzc2lvbiAmJiB0aGlzLiNzZXNzaW9uIGluc3RhbmNlb2YgQ2RwQ0RQU2Vzc2lvbikge1xuICAgICAgICAgICAgdGhpcy4jc2Vzc2lvbi5fc2V0VGFyZ2V0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGFzUGFnZSgpIHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuX3Nlc3Npb24oKTtcbiAgICAgICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVDRFBTZXNzaW9uKCkudGhlbihjbGllbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBDZHBQYWdlLl9jcmVhdGUoY2xpZW50LCB0aGlzLCBudWxsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBDZHBQYWdlLl9jcmVhdGUoc2Vzc2lvbiwgdGhpcywgbnVsbCk7XG4gICAgfVxuICAgIF9zdWJ0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFyZ2V0SW5mby5zdWJ0eXBlO1xuICAgIH1cbiAgICBfc2Vzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Nlc3Npb247XG4gICAgfVxuICAgIF9hZGRDaGlsZFRhcmdldCh0YXJnZXQpIHtcbiAgICAgICAgdGhpcy4jY2hpbGRUYXJnZXRzLmFkZCh0YXJnZXQpO1xuICAgIH1cbiAgICBfcmVtb3ZlQ2hpbGRUYXJnZXQodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuI2NoaWxkVGFyZ2V0cy5kZWxldGUodGFyZ2V0KTtcbiAgICB9XG4gICAgX2NoaWxkVGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NoaWxkVGFyZ2V0cztcbiAgICB9XG4gICAgX3Nlc3Npb25GYWN0b3J5KCkge1xuICAgICAgICBpZiAoIXRoaXMuI3Nlc3Npb25GYWN0b3J5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nlc3Npb25GYWN0b3J5IGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNzZXNzaW9uRmFjdG9yeTtcbiAgICB9XG4gICAgY3JlYXRlQ0RQU2Vzc2lvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNzZXNzaW9uRmFjdG9yeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXNzaW9uRmFjdG9yeSBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jc2Vzc2lvbkZhY3RvcnkoZmFsc2UpLnRoZW4oc2Vzc2lvbiA9PiB7XG4gICAgICAgICAgICBzZXNzaW9uLl9zZXRUYXJnZXQodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhcmdldEluZm8udXJsO1xuICAgIH1cbiAgICB0eXBlKCkge1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy4jdGFyZ2V0SW5mby50eXBlO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3BhZ2UnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXRUeXBlLlBBR0U7XG4gICAgICAgICAgICBjYXNlICdiYWNrZ3JvdW5kX3BhZ2UnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXRUeXBlLkJBQ0tHUk9VTkRfUEFHRTtcbiAgICAgICAgICAgIGNhc2UgJ3NlcnZpY2Vfd29ya2VyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0VHlwZS5TRVJWSUNFX1dPUktFUjtcbiAgICAgICAgICAgIGNhc2UgJ3NoYXJlZF93b3JrZXInOlxuICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXRUeXBlLlNIQVJFRF9XT1JLRVI7XG4gICAgICAgICAgICBjYXNlICdicm93c2VyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0VHlwZS5CUk9XU0VSO1xuICAgICAgICAgICAgY2FzZSAnd2Vidmlldyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRhcmdldFR5cGUuV0VCVklFVztcbiAgICAgICAgICAgIGNhc2UgJ3RhYic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRhcmdldFR5cGUuVEFCO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gVGFyZ2V0VHlwZS5PVEhFUjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfdGFyZ2V0TWFuYWdlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiN0YXJnZXRNYW5hZ2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldE1hbmFnZXIgaXMgbm90IGluaXRpYWxpemVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI3RhcmdldE1hbmFnZXI7XG4gICAgfVxuICAgIF9nZXRUYXJnZXRJbmZvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFyZ2V0SW5mbztcbiAgICB9XG4gICAgYnJvd3NlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNicm93c2VyQ29udGV4dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdicm93c2VyQ29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlckNvbnRleHQuYnJvd3NlcigpO1xuICAgIH1cbiAgICBicm93c2VyQ29udGV4dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNicm93c2VyQ29udGV4dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdicm93c2VyQ29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy4jYnJvd3NlckNvbnRleHQ7XG4gICAgfVxuICAgIG9wZW5lcigpIHtcbiAgICAgICAgY29uc3QgeyBvcGVuZXJJZCB9ID0gdGhpcy4jdGFyZ2V0SW5mbztcbiAgICAgICAgaWYgKCFvcGVuZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmJyb3dzZXIoKVxuICAgICAgICAgICAgLnRhcmdldHMoKVxuICAgICAgICAgICAgLmZpbmQodGFyZ2V0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQuX3RhcmdldElkID09PSBvcGVuZXJJZDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF90YXJnZXRJbmZvQ2hhbmdlZCh0YXJnZXRJbmZvKSB7XG4gICAgICAgIHRoaXMuI3RhcmdldEluZm8gPSB0YXJnZXRJbmZvO1xuICAgICAgICB0aGlzLl9jaGVja0lmSW5pdGlhbGl6ZWQoKTtcbiAgICB9XG4gICAgX2luaXRpYWxpemUoKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkRGVmZXJyZWQucmVzb2x2ZShJbml0aWFsaXphdGlvblN0YXR1cy5TVUNDRVNTKTtcbiAgICB9XG4gICAgX2lzVGFyZ2V0RXhwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSgpICE9PSBUYXJnZXRUeXBlLlRBQiAmJiAhdGhpcy5fc3VidHlwZSgpO1xuICAgIH1cbiAgICBfY2hlY2tJZkluaXRpYWxpemVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkRGVmZXJyZWQucmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWREZWZlcnJlZC5yZXNvbHZlKEluaXRpYWxpemF0aW9uU3RhdHVzLlNVQ0NFU1MpO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VUYXJnZXQgZXh0ZW5kcyBDZHBUYXJnZXQge1xuICAgICNkZWZhdWx0Vmlld3BvcnQ7XG4gICAgcGFnZVByb21pc2U7XG4gICAgY29uc3RydWN0b3IodGFyZ2V0SW5mbywgc2Vzc2lvbiwgYnJvd3NlckNvbnRleHQsIHRhcmdldE1hbmFnZXIsIHNlc3Npb25GYWN0b3J5LCBkZWZhdWx0Vmlld3BvcnQpIHtcbiAgICAgICAgc3VwZXIodGFyZ2V0SW5mbywgc2Vzc2lvbiwgYnJvd3NlckNvbnRleHQsIHRhcmdldE1hbmFnZXIsIHNlc3Npb25GYWN0b3J5KTtcbiAgICAgICAgdGhpcy4jZGVmYXVsdFZpZXdwb3J0ID0gZGVmYXVsdFZpZXdwb3J0ID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgX2luaXRpYWxpemUoKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkRGVmZXJyZWRcbiAgICAgICAgICAgIC52YWx1ZU9yVGhyb3coKVxuICAgICAgICAgICAgLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gSW5pdGlhbGl6YXRpb25TdGF0dXMuQUJPUlRFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9wZW5lciA9IHRoaXMub3BlbmVyKCk7XG4gICAgICAgICAgICBpZiAoIShvcGVuZXIgaW5zdGFuY2VvZiBQYWdlVGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3BlbmVyIHx8ICFvcGVuZXIucGFnZVByb21pc2UgfHwgdGhpcy50eXBlKCkgIT09ICdwYWdlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3BlbmVyUGFnZSA9IGF3YWl0IG9wZW5lci5wYWdlUHJvbWlzZTtcbiAgICAgICAgICAgIGlmICghb3BlbmVyUGFnZS5saXN0ZW5lckNvdW50KFwicG9wdXBcIiAvKiBQYWdlRXZlbnQuUG9wdXAgKi8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwb3B1cFBhZ2UgPSBhd2FpdCB0aGlzLnBhZ2UoKTtcbiAgICAgICAgICAgIG9wZW5lclBhZ2UuZW1pdChcInBvcHVwXCIgLyogUGFnZUV2ZW50LlBvcHVwICovLCBwb3B1cFBhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZGVidWdFcnJvcik7XG4gICAgICAgIHRoaXMuX2NoZWNrSWZJbml0aWFsaXplZCgpO1xuICAgIH1cbiAgICBhc3luYyBwYWdlKCkge1xuICAgICAgICBpZiAoIXRoaXMucGFnZVByb21pc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl9zZXNzaW9uKCk7XG4gICAgICAgICAgICB0aGlzLnBhZ2VQcm9taXNlID0gKHNlc3Npb25cbiAgICAgICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZShzZXNzaW9uKVxuICAgICAgICAgICAgICAgIDogdGhpcy5fc2Vzc2lvbkZhY3RvcnkoKSgvKiBpc0F1dG9BdHRhY2hFbXVsYXRlZD0qLyBmYWxzZSkpLnRoZW4oY2xpZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2RwUGFnZS5fY3JlYXRlKGNsaWVudCwgdGhpcywgdGhpcy4jZGVmYXVsdFZpZXdwb3J0ID8/IG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnBhZ2VQcm9taXNlKSA/PyBudWxsO1xuICAgIH1cbiAgICBfY2hlY2tJZkluaXRpYWxpemVkKCkge1xuICAgICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWREZWZlcnJlZC5yZXNvbHZlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2dldFRhcmdldEluZm8oKS51cmwgIT09ICcnKSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplZERlZmVycmVkLnJlc29sdmUoSW5pdGlhbGl6YXRpb25TdGF0dXMuU1VDQ0VTUyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRGV2VG9vbHNUYXJnZXQgZXh0ZW5kcyBQYWdlVGFyZ2V0IHtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZXJUYXJnZXQgZXh0ZW5kcyBDZHBUYXJnZXQge1xuICAgICN3b3JrZXJQcm9taXNlO1xuICAgIGFzeW5jIHdvcmtlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLiN3b3JrZXJQcm9taXNlKSB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fc2Vzc2lvbigpO1xuICAgICAgICAgICAgLy8gVE9ETyhlaW5iaW5kZXIpOiBNYWtlIHdvcmtlcnMgc2VuZCB0aGVpciBjb25zb2xlIGxvZ3MuXG4gICAgICAgICAgICB0aGlzLiN3b3JrZXJQcm9taXNlID0gKHNlc3Npb25cbiAgICAgICAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZShzZXNzaW9uKVxuICAgICAgICAgICAgICAgIDogdGhpcy5fc2Vzc2lvbkZhY3RvcnkoKSgvKiBpc0F1dG9BdHRhY2hFbXVsYXRlZD0qLyBmYWxzZSkpLnRoZW4oY2xpZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENkcFdlYldvcmtlcihjbGllbnQsIHRoaXMuX2dldFRhcmdldEluZm8oKS51cmwsIHRoaXMuX3RhcmdldElkLCB0aGlzLnR5cGUoKSwgKCkgPT4geyB9IC8qIGNvbnNvbGVBUElDYWxsZWQgKi8sICgpID0+IHsgfSAvKiBleGNlcHRpb25UaHJvd24gKi8pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI3dvcmtlclByb21pc2U7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE90aGVyVGFyZ2V0IGV4dGVuZHMgQ2RwVGFyZ2V0IHtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRhcmdldC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFyZ2V0TWFuYWdlci5qcy5tYXAiLCJpbXBvcnQgeyBnZXRSZWFkYWJsZUFzQnVmZmVyLCBnZXRSZWFkYWJsZUZyb21Qcm90b2NvbFN0cmVhbSwgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4uL3V0aWwvRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG4vKipcbiAqIFRoZSBUcmFjaW5nIGNsYXNzIGV4cG9zZXMgdGhlIHRyYWNpbmcgYXVkaXQgaW50ZXJmYWNlLlxuICogQHJlbWFya3NcbiAqIFlvdSBjYW4gdXNlIGB0cmFjaW5nLnN0YXJ0YCBhbmQgYHRyYWNpbmcuc3RvcGAgdG8gY3JlYXRlIGEgdHJhY2UgZmlsZVxuICogd2hpY2ggY2FuIGJlIG9wZW5lZCBpbiBDaHJvbWUgRGV2VG9vbHMgb3Ige0BsaW5rIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL3RpbWVsaW5lLXZpZXdlci8gfCB0aW1lbGluZSB2aWV3ZXJ9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IHBhZ2UudHJhY2luZy5zdGFydCh7cGF0aDogJ3RyYWNlLmpzb24nfSk7XG4gKiBhd2FpdCBwYWdlLmdvdG8oJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20nKTtcbiAqIGF3YWl0IHBhZ2UudHJhY2luZy5zdG9wKCk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFjaW5nIHtcbiAgICAjY2xpZW50O1xuICAgICNyZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAjcGF0aDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB1cGRhdGVDbGllbnQoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuI2NsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIGEgdHJhY2UgZm9yIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBPbmx5IG9uZSB0cmFjZSBjYW4gYmUgYWN0aXZlIGF0IGEgdGltZSBwZXIgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgYFRyYWNpbmdPcHRpb25zYC5cbiAgICAgKi9cbiAgICBhc3luYyBzdGFydChvcHRpb25zID0ge30pIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNyZWNvcmRpbmcsICdDYW5ub3Qgc3RhcnQgcmVjb3JkaW5nIHRyYWNlIHdoaWxlIGFscmVhZHkgcmVjb3JkaW5nIHRyYWNlLicpO1xuICAgICAgICBjb25zdCBkZWZhdWx0Q2F0ZWdvcmllcyA9IFtcbiAgICAgICAgICAgICctKicsXG4gICAgICAgICAgICAnZGV2dG9vbHMudGltZWxpbmUnLFxuICAgICAgICAgICAgJ3Y4LmV4ZWN1dGUnLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUnLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUuZnJhbWUnLFxuICAgICAgICAgICAgJ3RvcGxldmVsJyxcbiAgICAgICAgICAgICdibGluay5jb25zb2xlJyxcbiAgICAgICAgICAgICdibGluay51c2VyX3RpbWluZycsXG4gICAgICAgICAgICAnbGF0ZW5jeUluZm8nLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtZGV2dG9vbHMudGltZWxpbmUuc3RhY2snLFxuICAgICAgICAgICAgJ2Rpc2FibGVkLWJ5LWRlZmF1bHQtdjguY3B1X3Byb2ZpbGVyJyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgeyBwYXRoLCBzY3JlZW5zaG90cyA9IGZhbHNlLCBjYXRlZ29yaWVzID0gZGVmYXVsdENhdGVnb3JpZXMgfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChzY3JlZW5zaG90cykge1xuICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKCdkaXNhYmxlZC1ieS1kZWZhdWx0LWRldnRvb2xzLnNjcmVlbnNob3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGNsdWRlZENhdGVnb3JpZXMgPSBjYXRlZ29yaWVzXG4gICAgICAgICAgICAuZmlsdGVyKGNhdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2F0LnN0YXJ0c1dpdGgoJy0nKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5tYXAoY2F0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYXQuc2xpY2UoMSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbmNsdWRlZENhdGVnb3JpZXMgPSBjYXRlZ29yaWVzLmZpbHRlcihjYXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFjYXQuc3RhcnRzV2l0aCgnLScpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jcGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuI3JlY29yZGluZyA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdUcmFjaW5nLnN0YXJ0Jywge1xuICAgICAgICAgICAgdHJhbnNmZXJNb2RlOiAnUmV0dXJuQXNTdHJlYW0nLFxuICAgICAgICAgICAgdHJhY2VDb25maWc6IHtcbiAgICAgICAgICAgICAgICBleGNsdWRlZENhdGVnb3JpZXMsXG4gICAgICAgICAgICAgICAgaW5jbHVkZWRDYXRlZ29yaWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3BzIGEgdHJhY2Ugc3RhcnRlZCB3aXRoIHRoZSBgc3RhcnRgIG1ldGhvZC5cbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGJ1ZmZlciB3aXRoIHRyYWNlIGRhdGEuXG4gICAgICovXG4gICAgYXN5bmMgc3RvcCgpIHtcbiAgICAgICAgY29uc3QgY29udGVudERlZmVycmVkID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbmNlKCdUcmFjaW5nLnRyYWNpbmdDb21wbGV0ZScsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZXZlbnQuc3RyZWFtLCAnTWlzc2luZyBcInN0cmVhbVwiJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZGFibGUgPSBhd2FpdCBnZXRSZWFkYWJsZUZyb21Qcm90b2NvbFN0cmVhbSh0aGlzLiNjbGllbnQsIGV2ZW50LnN0cmVhbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZ2V0UmVhZGFibGVBc0J1ZmZlcihyZWFkYWJsZSwgdGhpcy4jcGF0aCk7XG4gICAgICAgICAgICAgICAgY29udGVudERlZmVycmVkLnJlc29sdmUoYnVmZmVyID8/IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNFcnJvckxpa2UoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnREZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudERlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoYFVua25vd24gZXJyb3I6ICR7ZXJyb3J9YCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuI2NsaWVudC5zZW5kKCdUcmFjaW5nLmVuZCcpO1xuICAgICAgICB0aGlzLiNyZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRlbnREZWZlcnJlZC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UcmFjaW5nLmpzLm1hcCIsImltcG9ydCB7IENEUFNlc3Npb25FdmVudCB9IGZyb20gJy4uL2FwaS9DRFBTZXNzaW9uLmpzJztcbmltcG9ydCB7IFRhcmdldFR5cGUgfSBmcm9tICcuLi9hcGkvVGFyZ2V0LmpzJztcbmltcG9ydCB7IFdlYldvcmtlciB9IGZyb20gJy4uL2FwaS9XZWJXb3JrZXIuanMnO1xuaW1wb3J0IHsgVGltZW91dFNldHRpbmdzIH0gZnJvbSAnLi4vY29tbW9uL1RpbWVvdXRTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vRXhlY3V0aW9uQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBJc29sYXRlZFdvcmxkIH0gZnJvbSAnLi9Jc29sYXRlZFdvcmxkLmpzJztcbmltcG9ydCB7IENkcEpTSGFuZGxlIH0gZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2RwV2ViV29ya2VyIGV4dGVuZHMgV2ViV29ya2VyIHtcbiAgICAjd29ybGQ7XG4gICAgI2NsaWVudDtcbiAgICAjaWQ7XG4gICAgI3RhcmdldFR5cGU7XG4gICAgY29uc3RydWN0b3IoY2xpZW50LCB1cmwsIHRhcmdldElkLCB0YXJnZXRUeXBlLCBjb25zb2xlQVBJQ2FsbGVkLCBleGNlcHRpb25UaHJvd24pIHtcbiAgICAgICAgc3VwZXIodXJsKTtcbiAgICAgICAgdGhpcy4jaWQgPSB0YXJnZXRJZDtcbiAgICAgICAgdGhpcy4jY2xpZW50ID0gY2xpZW50O1xuICAgICAgICB0aGlzLiN0YXJnZXRUeXBlID0gdGFyZ2V0VHlwZTtcbiAgICAgICAgdGhpcy4jd29ybGQgPSBuZXcgSXNvbGF0ZWRXb3JsZCh0aGlzLCBuZXcgVGltZW91dFNldHRpbmdzKCkpO1xuICAgICAgICB0aGlzLiNjbGllbnQub25jZSgnUnVudGltZS5leGVjdXRpb25Db250ZXh0Q3JlYXRlZCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jd29ybGQuc2V0Q29udGV4dChuZXcgRXhlY3V0aW9uQ29udGV4dChjbGllbnQsIGV2ZW50LmNvbnRleHQsIHRoaXMuI3dvcmxkKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN3b3JsZC5lbWl0dGVyLm9uKCdjb25zb2xlYXBpY2FsbGVkJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zb2xlQVBJQ2FsbGVkKGV2ZW50LnR5cGUsIGV2ZW50LmFyZ3MubWFwKChvYmplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDZHBKU0hhbmRsZSh0aGlzLiN3b3JsZCwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9KSwgZXZlbnQuc3RhY2tUcmFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZGVidWdFcnJvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jY2xpZW50Lm9uKCdSdW50aW1lLmV4Y2VwdGlvblRocm93bicsIGV4Y2VwdGlvblRocm93bik7XG4gICAgICAgIHRoaXMuI2NsaWVudC5vbmNlKENEUFNlc3Npb25FdmVudC5EaXNjb25uZWN0ZWQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3dvcmxkLmRpc3Bvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFRoaXMgbWlnaHQgZmFpbCBpZiB0aGUgdGFyZ2V0IGlzIGNsb3NlZCBiZWZvcmUgd2UgcmVjZWl2ZSBhbGwgZXhlY3V0aW9uIGNvbnRleHRzLlxuICAgICAgICB0aGlzLiNjbGllbnQuc2VuZCgnUnVudGltZS5lbmFibGUnKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICB9XG4gICAgbWFpblJlYWxtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jd29ybGQ7XG4gICAgfVxuICAgIGdldCBjbGllbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjbGllbnQ7XG4gICAgfVxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuI3RhcmdldFR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVGFyZ2V0VHlwZS5TRVJWSUNFX1dPUktFUjpcbiAgICAgICAgICAgIGNhc2UgVGFyZ2V0VHlwZS5TSEFSRURfV09SS0VSOiB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHNlcnZpY2UgYW5kIHNoYXJlZCB3b3JrZXJzIHdlIG5lZWQgdG8gY2xvc2UgdGhlIHRhcmdldCBhbmQgZGV0YWNoIHRvIGFsbG93XG4gICAgICAgICAgICAgICAgLy8gdGhlIHdvcmtlciB0byBzdG9wLlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LmNvbm5lY3Rpb24oKT8uc2VuZCgnVGFyZ2V0LmNsb3NlVGFyZ2V0Jywge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRJZDogdGhpcy4jaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuY29ubmVjdGlvbigpPy5zZW5kKCdUYXJnZXQuZGV0YWNoRnJvbVRhcmdldCcsIHtcbiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLmNsaWVudC5pZCgpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViV29ya2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL0FjY2Vzc2liaWxpdHkuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9BcmlhUXVlcnlIYW5kbGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQmluZGluZy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0Jyb3dzZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Ccm93c2VyQ29ubmVjdG9yLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ0RQU2Vzc2lvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0Nocm9tZVRhcmdldE1hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25uZWN0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ292ZXJhZ2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXZpY2VSZXF1ZXN0UHJvbXB0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRGlhbG9nLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRWxlbWVudEhhbmRsZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0VtdWxhdGlvbk1hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeGVjdXRpb25Db250ZXh0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZW5zaW9uVHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRmlyZWZveFRhcmdldE1hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9GcmFtZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZyYW1lTWFuYWdlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZyYW1lTWFuYWdlckV2ZW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZyYW1lVHJlZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0hUVFBSZXF1ZXN0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSFRUUFJlc3BvbnNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSW5wdXQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Jc29sYXRlZFdvcmxkLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vSXNvbGF0ZWRXb3JsZHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9KU0hhbmRsZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0xpZmVjeWNsZVdhdGNoZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9OZXR3b3JrRXZlbnRNYW5hZ2VyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vTmV0d29ya01hbmFnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QYWdlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHJlZGVmaW5lZE5ldHdvcmtDb25kaXRpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGFyZ2V0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGFyZ2V0TWFuYWdlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1RyYWNpbmcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1dlYldvcmtlci5qcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jZHAuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IFB1cHBldGVlclVSTCwgZXZhbHVhdGlvblN0cmluZyB9IGZyb20gJy4uL2NvbW1vbi91dGlsLmpzJztcbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmFsdWF0aW9uRXJyb3IoZGV0YWlscykge1xuICAgIGxldCBuYW1lO1xuICAgIGxldCBtZXNzYWdlO1xuICAgIGlmICghZGV0YWlscy5leGNlcHRpb24pIHtcbiAgICAgICAgbmFtZSA9ICdFcnJvcic7XG4gICAgICAgIG1lc3NhZ2UgPSBkZXRhaWxzLnRleHQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKChkZXRhaWxzLmV4Y2VwdGlvbi50eXBlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICBkZXRhaWxzLmV4Y2VwdGlvbi5zdWJ0eXBlICE9PSAnZXJyb3InKSAmJlxuICAgICAgICAhZGV0YWlscy5leGNlcHRpb24ub2JqZWN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlRnJvbVJlbW90ZU9iamVjdChkZXRhaWxzLmV4Y2VwdGlvbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBkZXRhaWwgPSBnZXRFcnJvckRldGFpbHMoZGV0YWlscyk7XG4gICAgICAgIG5hbWUgPSBkZXRhaWwubmFtZTtcbiAgICAgICAgbWVzc2FnZSA9IGRldGFpbC5tZXNzYWdlO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlSGVpZ2h0ID0gbWVzc2FnZS5zcGxpdCgnXFxuJykubGVuZ3RoO1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIGVycm9yLm5hbWUgPSBuYW1lO1xuICAgIGNvbnN0IHN0YWNrTGluZXMgPSBlcnJvci5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgY29uc3QgbWVzc2FnZUxpbmVzID0gc3RhY2tMaW5lcy5zcGxpY2UoMCwgbWVzc2FnZUhlaWdodCk7XG4gICAgLy8gVGhlIGZpcnN0IGxpbmUgaXMgdGhpcyBmdW5jdGlvbiB3aGljaCB3ZSBpZ25vcmUuXG4gICAgc3RhY2tMaW5lcy5zaGlmdCgpO1xuICAgIGlmIChkZXRhaWxzLnN0YWNrVHJhY2UgJiYgc3RhY2tMaW5lcy5sZW5ndGggPCBFcnJvci5zdGFja1RyYWNlTGltaXQpIHtcbiAgICAgICAgZm9yIChjb25zdCBmcmFtZSBvZiBkZXRhaWxzLnN0YWNrVHJhY2UuY2FsbEZyYW1lcy5yZXZlcnNlKCkpIHtcbiAgICAgICAgICAgIGlmIChQdXBwZXRlZXJVUkwuaXNQdXBwZXRlZXJVUkwoZnJhbWUudXJsKSAmJlxuICAgICAgICAgICAgICAgIGZyYW1lLnVybCAhPT0gUHVwcGV0ZWVyVVJMLklOVEVSTkFMX1VSTCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IFB1cHBldGVlclVSTC5wYXJzZShmcmFtZS51cmwpO1xuICAgICAgICAgICAgICAgIHN0YWNrTGluZXMudW5zaGlmdChgICAgIGF0ICR7ZnJhbWUuZnVuY3Rpb25OYW1lIHx8IHVybC5mdW5jdGlvbk5hbWV9ICgke3VybC5mdW5jdGlvbk5hbWV9IGF0ICR7dXJsLnNpdGVTdHJpbmd9LCA8YW5vbnltb3VzPjoke2ZyYW1lLmxpbmVOdW1iZXJ9OiR7ZnJhbWUuY29sdW1uTnVtYmVyfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YWNrTGluZXMucHVzaChgICAgIGF0ICR7ZnJhbWUuZnVuY3Rpb25OYW1lIHx8ICc8YW5vbnltb3VzPid9ICgke2ZyYW1lLnVybH06JHtmcmFtZS5saW5lTnVtYmVyfToke2ZyYW1lLmNvbHVtbk51bWJlcn0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhY2tMaW5lcy5sZW5ndGggPj0gRXJyb3Iuc3RhY2tUcmFjZUxpbWl0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXJyb3Iuc3RhY2sgPSBbLi4ubWVzc2FnZUxpbmVzLCAuLi5zdGFja0xpbmVzXS5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gZXJyb3I7XG59XG5jb25zdCBnZXRFcnJvckRldGFpbHMgPSAoZGV0YWlscykgPT4ge1xuICAgIGxldCBuYW1lID0gJyc7XG4gICAgbGV0IG1lc3NhZ2U7XG4gICAgY29uc3QgbGluZXMgPSBkZXRhaWxzLmV4Y2VwdGlvbj8uZGVzY3JpcHRpb24/LnNwbGl0KCdcXG4gICAgYXQgJykgPz8gW107XG4gICAgY29uc3Qgc2l6ZSA9IE1hdGgubWluKGRldGFpbHMuc3RhY2tUcmFjZT8uY2FsbEZyYW1lcy5sZW5ndGggPz8gMCwgbGluZXMubGVuZ3RoIC0gMSk7XG4gICAgbGluZXMuc3BsaWNlKC1zaXplLCBzaXplKTtcbiAgICBpZiAoZGV0YWlscy5leGNlcHRpb24/LmNsYXNzTmFtZSkge1xuICAgICAgICBuYW1lID0gZGV0YWlscy5leGNlcHRpb24uY2xhc3NOYW1lO1xuICAgIH1cbiAgICBtZXNzYWdlID0gbGluZXMuam9pbignXFxuJyk7XG4gICAgaWYgKG5hbWUgJiYgbWVzc2FnZS5zdGFydHNXaXRoKGAke25hbWV9OiBgKSkge1xuICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5zbGljZShuYW1lLmxlbmd0aCArIDIpO1xuICAgIH1cbiAgICByZXR1cm4geyBtZXNzYWdlLCBuYW1lIH07XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNsaWVudEVycm9yKGRldGFpbHMpIHtcbiAgICBsZXQgbmFtZTtcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBpZiAoIWRldGFpbHMuZXhjZXB0aW9uKSB7XG4gICAgICAgIG5hbWUgPSAnRXJyb3InO1xuICAgICAgICBtZXNzYWdlID0gZGV0YWlscy50ZXh0O1xuICAgIH1cbiAgICBlbHNlIGlmICgoZGV0YWlscy5leGNlcHRpb24udHlwZSAhPT0gJ29iamVjdCcgfHxcbiAgICAgICAgZGV0YWlscy5leGNlcHRpb24uc3VidHlwZSAhPT0gJ2Vycm9yJykgJiZcbiAgICAgICAgIWRldGFpbHMuZXhjZXB0aW9uLm9iamVjdElkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZUZyb21SZW1vdGVPYmplY3QoZGV0YWlscy5leGNlcHRpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZGV0YWlsID0gZ2V0RXJyb3JEZXRhaWxzKGRldGFpbHMpO1xuICAgICAgICBuYW1lID0gZGV0YWlsLm5hbWU7XG4gICAgICAgIG1lc3NhZ2UgPSBkZXRhaWwubWVzc2FnZTtcbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgZXJyb3IubmFtZSA9IG5hbWU7XG4gICAgY29uc3QgbWVzc2FnZUhlaWdodCA9IGVycm9yLm1lc3NhZ2Uuc3BsaXQoJ1xcbicpLmxlbmd0aDtcbiAgICBjb25zdCBtZXNzYWdlTGluZXMgPSBlcnJvci5zdGFjay5zcGxpdCgnXFxuJykuc3BsaWNlKDAsIG1lc3NhZ2VIZWlnaHQpO1xuICAgIGNvbnN0IHN0YWNrTGluZXMgPSBbXTtcbiAgICBpZiAoZGV0YWlscy5zdGFja1RyYWNlKSB7XG4gICAgICAgIGZvciAoY29uc3QgZnJhbWUgb2YgZGV0YWlscy5zdGFja1RyYWNlLmNhbGxGcmFtZXMpIHtcbiAgICAgICAgICAgIC8vIE5vdGUgd2UgbmVlZCB0byBhZGQgYDFgIGJlY2F1c2UgdGhlIHZhbHVlcyBhcmUgMC1pbmRleGVkLlxuICAgICAgICAgICAgc3RhY2tMaW5lcy5wdXNoKGAgICAgYXQgJHtmcmFtZS5mdW5jdGlvbk5hbWUgfHwgJzxhbm9ueW1vdXM+J30gKCR7ZnJhbWUudXJsfToke2ZyYW1lLmxpbmVOdW1iZXIgKyAxfToke2ZyYW1lLmNvbHVtbk51bWJlciArIDF9KWApO1xuICAgICAgICAgICAgaWYgKHN0YWNrTGluZXMubGVuZ3RoID49IEVycm9yLnN0YWNrVHJhY2VMaW1pdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVycm9yLnN0YWNrID0gWy4uLm1lc3NhZ2VMaW5lcywgLi4uc3RhY2tMaW5lc10uam9pbignXFxuJyk7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlRnJvbVJlbW90ZU9iamVjdChyZW1vdGVPYmplY3QpIHtcbiAgICBhc3NlcnQoIXJlbW90ZU9iamVjdC5vYmplY3RJZCwgJ0Nhbm5vdCBleHRyYWN0IHZhbHVlIHdoZW4gb2JqZWN0SWQgaXMgZ2l2ZW4nKTtcbiAgICBpZiAocmVtb3RlT2JqZWN0LnVuc2VyaWFsaXphYmxlVmFsdWUpIHtcbiAgICAgICAgaWYgKHJlbW90ZU9iamVjdC50eXBlID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChyZW1vdGVPYmplY3QudW5zZXJpYWxpemFibGVWYWx1ZS5yZXBsYWNlKCduJywgJycpKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHJlbW90ZU9iamVjdC51bnNlcmlhbGl6YWJsZVZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlICctMCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0wO1xuICAgICAgICAgICAgY2FzZSAnTmFOJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgICAgY2FzZSAnSW5maW5pdHknOlxuICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgIGNhc2UgJy1JbmZpbml0eSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB1bnNlcmlhbGl6YWJsZSB2YWx1ZTogJyArXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZU9iamVjdC51bnNlcmlhbGl6YWJsZVZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVtb3RlT2JqZWN0LnZhbHVlO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFBhZ2VCaW5kaW5nKHR5cGUsIG5hbWUsIHByZWZpeCkge1xuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgZnJhbWUgbG9hZGluZyBzdGF0ZSBlaXRoZXIgUnVudGltZS5ldmFsdWF0ZSBvclxuICAgIC8vIFBhZ2UuYWRkU2NyaXB0VG9FdmFsdWF0ZU9uTmV3RG9jdW1lbnQgbWlnaHQgc3VjY2VlZC4gTGV0J3MgY2hlY2sgdGhhdCB3ZVxuICAgIC8vIGRvbid0IHJlLXdyYXAgUHVwcGV0ZWVyJ3MgYmluZGluZy5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBJbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgIGlmIChnbG9iYWxUaGlzW25hbWVdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gV2UgcmVwbGFjZSB0aGUgQ0RQIGJpbmRpbmcgd2l0aCBhIFB1cHBldGVlciBiaW5kaW5nLlxuICAgIE9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywge1xuICAgICAgICBbbmFtZV0oLi4uYXJncykge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgUHVwcGV0ZWVyIGJpbmRpbmcuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yOiBJbiBhIGRpZmZlcmVudCBjb250ZXh0LlxuICAgICAgICAgICAgY29uc3QgY2FsbFB1cHBldGVlciA9IGdsb2JhbFRoaXNbbmFtZV07XG4gICAgICAgICAgICBjYWxsUHVwcGV0ZWVyLmFyZ3MgPz89IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNhbGxQdXBwZXRlZXIuY2FsbGJhY2tzID8/PSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBzZXEgPSAoY2FsbFB1cHBldGVlci5sYXN0U2VxID8/IDApICsgMTtcbiAgICAgICAgICAgIGNhbGxQdXBwZXRlZXIubGFzdFNlcSA9IHNlcTtcbiAgICAgICAgICAgIGNhbGxQdXBwZXRlZXIuYXJncy5zZXQoc2VxLCBhcmdzKTtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IEluIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gICAgICAgICAgICAvLyBOZWVkcyB0byBiZSB0aGUgc2FtZSBhcyBDRFBfQklORElOR19QUkVGSVguXG4gICAgICAgICAgICBnbG9iYWxUaGlzW3ByZWZpeCArIG5hbWVdKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgaXNUcml2aWFsOiAhYXJncy5zb21lKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgTm9kZTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbFB1cHBldGVlci5jYWxsYmFja3Muc2V0KHNlcSwge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUHVwcGV0ZWVyLmFyZ3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsUHVwcGV0ZWVyLmFyZ3MuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ0RQX0JJTkRJTkdfUFJFRklYID0gJ3B1cHBldGVlcl8nO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZ2VCaW5kaW5nSW5pdFN0cmluZyh0eXBlLCBuYW1lKSB7XG4gICAgcmV0dXJuIGV2YWx1YXRpb25TdHJpbmcoYWRkUGFnZUJpbmRpbmcsIHR5cGUsIG5hbWUsIENEUF9CSU5ESU5HX1BSRUZJWCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgX2Nvbm5lY3RUb0JpRGlCcm93c2VyIH0gZnJvbSAnLi4vYmlkaS9Ccm93c2VyQ29ubmVjdG9yLmpzJztcbmltcG9ydCB7IF9jb25uZWN0VG9DZHBCcm93c2VyIH0gZnJvbSAnLi4vY2RwL0Jyb3dzZXJDb25uZWN0b3IuanMnO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi4vZW52aXJvbm1lbnQuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG5jb25zdCBnZXRXZWJTb2NrZXRUcmFuc3BvcnRDbGFzcyA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gaXNOb2RlXG4gICAgICAgID8gKGF3YWl0IGltcG9ydCgnLi4vbm9kZS9Ob2RlV2ViU29ja2V0VHJhbnNwb3J0LmpzJykpLk5vZGVXZWJTb2NrZXRUcmFuc3BvcnRcbiAgICAgICAgOiAoYXdhaXQgaW1wb3J0KCcuLi9jb21tb24vQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydC5qcycpKVxuICAgICAgICAgICAgLkJyb3dzZXJXZWJTb2NrZXRUcmFuc3BvcnQ7XG59O1xuLyoqXG4gKiBVc2VycyBzaG91bGQgbmV2ZXIgY2FsbCB0aGlzIGRpcmVjdGx5OyBpdCdzIGNhbGxlZCB3aGVuIGNhbGxpbmdcbiAqIGBwdXBwZXRlZXIuY29ubmVjdGAuIFRoaXMgbWV0aG9kIGF0dGFjaGVzIFB1cHBldGVlciB0byBhbiBleGlzdGluZyBicm93c2VyIGluc3RhbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2Nvbm5lY3RUb0Jyb3dzZXIob3B0aW9ucykge1xuICAgIGNvbnN0IHsgY29ubmVjdGlvblRyYW5zcG9ydCwgZW5kcG9pbnRVcmwgfSA9IGF3YWl0IGdldENvbm5lY3Rpb25UcmFuc3BvcnQob3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMucHJvdG9jb2wgPT09ICd3ZWJEcml2ZXJCaURpJykge1xuICAgICAgICBjb25zdCBiaWRpQnJvd3NlciA9IGF3YWl0IF9jb25uZWN0VG9CaURpQnJvd3Nlcihjb25uZWN0aW9uVHJhbnNwb3J0LCBlbmRwb2ludFVybCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBiaWRpQnJvd3NlcjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGNkcEJyb3dzZXIgPSBhd2FpdCBfY29ubmVjdFRvQ2RwQnJvd3Nlcihjb25uZWN0aW9uVHJhbnNwb3J0LCBlbmRwb2ludFVybCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBjZHBCcm93c2VyO1xuICAgIH1cbn1cbi8qKlxuICogRXN0YWJsaXNoZXMgYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiBieSBnaXZlbiBvcHRpb25zIGFuZCByZXR1cm5zIGJvdGggdHJhbnNwb3J0IGFuZFxuICogZW5kcG9pbnQgdXJsIHRoZSB0cmFuc3BvcnQgaXMgY29ubmVjdGVkIHRvLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDb25uZWN0aW9uVHJhbnNwb3J0KG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGJyb3dzZXJXU0VuZHBvaW50LCBicm93c2VyVVJMLCB0cmFuc3BvcnQsIGhlYWRlcnMgPSB7fSB9ID0gb3B0aW9ucztcbiAgICBhc3NlcnQoTnVtYmVyKCEhYnJvd3NlcldTRW5kcG9pbnQpICsgTnVtYmVyKCEhYnJvd3NlclVSTCkgKyBOdW1iZXIoISF0cmFuc3BvcnQpID09PVxuICAgICAgICAxLCAnRXhhY3RseSBvbmUgb2YgYnJvd3NlcldTRW5kcG9pbnQsIGJyb3dzZXJVUkwgb3IgdHJhbnNwb3J0IG11c3QgYmUgcGFzc2VkIHRvIHB1cHBldGVlci5jb25uZWN0Jyk7XG4gICAgaWYgKHRyYW5zcG9ydCkge1xuICAgICAgICByZXR1cm4geyBjb25uZWN0aW9uVHJhbnNwb3J0OiB0cmFuc3BvcnQsIGVuZHBvaW50VXJsOiAnJyB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChicm93c2VyV1NFbmRwb2ludCkge1xuICAgICAgICBjb25zdCBXZWJTb2NrZXRDbGFzcyA9IGF3YWl0IGdldFdlYlNvY2tldFRyYW5zcG9ydENsYXNzKCk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25UcmFuc3BvcnQgPSBhd2FpdCBXZWJTb2NrZXRDbGFzcy5jcmVhdGUoYnJvd3NlcldTRW5kcG9pbnQsIGhlYWRlcnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29ubmVjdGlvblRyYW5zcG9ydDogY29ubmVjdGlvblRyYW5zcG9ydCxcbiAgICAgICAgICAgIGVuZHBvaW50VXJsOiBicm93c2VyV1NFbmRwb2ludCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYnJvd3NlclVSTCkge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uVVJMID0gYXdhaXQgZ2V0V1NFbmRwb2ludChicm93c2VyVVJMKTtcbiAgICAgICAgY29uc3QgV2ViU29ja2V0Q2xhc3MgPSBhd2FpdCBnZXRXZWJTb2NrZXRUcmFuc3BvcnRDbGFzcygpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uVHJhbnNwb3J0ID0gYXdhaXQgV2ViU29ja2V0Q2xhc3MuY3JlYXRlKGNvbm5lY3Rpb25VUkwpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29ubmVjdGlvblRyYW5zcG9ydDogY29ubmVjdGlvblRyYW5zcG9ydCxcbiAgICAgICAgICAgIGVuZHBvaW50VXJsOiBjb25uZWN0aW9uVVJMLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29ubmVjdGlvbiBvcHRpb25zJyk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRXU0VuZHBvaW50KGJyb3dzZXJVUkwpIHtcbiAgICBjb25zdCBlbmRwb2ludFVSTCA9IG5ldyBVUkwoJy9qc29uL3ZlcnNpb24nLCBicm93c2VyVVJMKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnbG9iYWxUaGlzLmZldGNoKGVuZHBvaW50VVJMLnRvU3RyaW5nKCksIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzdWx0LnN0YXR1c1RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3VsdC5qc29uKCk7XG4gICAgICAgIHJldHVybiBkYXRhLndlYlNvY2tldERlYnVnZ2VyVXJsO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGlzRXJyb3JMaWtlKGVycm9yKSkge1xuICAgICAgICAgICAgZXJyb3IubWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCBicm93c2VyIHdlYlNvY2tldCBVUkwgZnJvbSAke2VuZHBvaW50VVJMfTogYCArXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlckNvbm5lY3Rvci5qcy5tYXAiLCIvKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydCB7XG4gICAgc3RhdGljIGNyZWF0ZSh1cmwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh1cmwpO1xuICAgICAgICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShuZXcgQnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydCh3cykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAjd3M7XG4gICAgb25tZXNzYWdlO1xuICAgIG9uY2xvc2U7XG4gICAgY29uc3RydWN0b3Iod3MpIHtcbiAgICAgICAgdGhpcy4jd3MgPSB3cztcbiAgICAgICAgdGhpcy4jd3MuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9ubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25tZXNzYWdlLmNhbGwobnVsbCwgZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiN3cy5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uY2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2xvc2UuY2FsbChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSBhbGwgZXJyb3JzIC0gd2UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggdGhlbS5cbiAgICAgICAgdGhpcy4jd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7IH0pO1xuICAgIH1cbiAgICBzZW5kKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy4jd3Muc2VuZChtZXNzYWdlKTtcbiAgICB9XG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuI3dzLmNsb3NlKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlcldlYlNvY2tldFRyYW5zcG9ydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9RdWVyeUhhbmRsZXIuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENTU1F1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3IgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgY3NzUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBjc3NRdWVyeVNlbGVjdG9yKGVsZW1lbnQsIHNlbGVjdG9yKTtcbiAgICB9O1xuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yQWxsID0gKGVsZW1lbnQsIHNlbGVjdG9yLCB7IGNzc1F1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY3NzUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNTU1F1ZXJ5SGFuZGxlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuLi91dGlsL0RlZmVycmVkLmpzJztcbmltcG9ydCB7IHJld3JpdGVFcnJvciB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IFByb3RvY29sRXJyb3IsIFRhcmdldENsb3NlRXJyb3IgfSBmcm9tICcuL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi91dGlsLmpzJztcbi8qKlxuICogTWFuYWdlcyBjYWxsYmFja3MgYW5kIHRoZWlyIElEcyBmb3IgdGhlIHByb3RvY29sIHJlcXVlc3QvcmVzcG9uc2UgY29tbXVuaWNhdGlvbi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENhbGxiYWNrUmVnaXN0cnkge1xuICAgICNjYWxsYmFja3MgPSBuZXcgTWFwKCk7XG4gICAgI2lkR2VuZXJhdG9yID0gY3JlYXRlSW5jcmVtZW50YWxJZEdlbmVyYXRvcigpO1xuICAgIGNyZWF0ZShsYWJlbCwgdGltZW91dCwgcmVxdWVzdCkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IG5ldyBDYWxsYmFjayh0aGlzLiNpZEdlbmVyYXRvcigpLCBsYWJlbCwgdGltZW91dCk7XG4gICAgICAgIHRoaXMuI2NhbGxiYWNrcy5zZXQoY2FsbGJhY2suaWQsIGNhbGxiYWNrKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QoY2FsbGJhY2suaWQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gV2Ugc3RpbGwgdGhyb3cgc3luYyBlcnJvcnMgc3luY2hyb25vdXNseSBhbmQgY2xlYW4gdXAgdGhlIHNjaGVkdWxlZFxuICAgICAgICAgICAgLy8gY2FsbGJhY2suXG4gICAgICAgICAgICBjYWxsYmFjay5wcm9taXNlLmNhdGNoKGRlYnVnRXJyb3IpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2suaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYWxsYmFjay5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTXVzdCBvbmx5IGhhdmUgc3luYyBjb2RlIHVwIHVudGlsIGhlcmUuXG4gICAgICAgIHJldHVybiBjYWxsYmFjay5wcm9taXNlLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jY2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjay5pZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWplY3QoaWQsIG1lc3NhZ2UsIG9yaWdpbmFsTWVzc2FnZSkge1xuICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuI2NhbGxiYWNrcy5nZXQoaWQpO1xuICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVqZWN0KGNhbGxiYWNrLCBtZXNzYWdlLCBvcmlnaW5hbE1lc3NhZ2UpO1xuICAgIH1cbiAgICBfcmVqZWN0KGNhbGxiYWNrLCBlcnJvck1lc3NhZ2UsIG9yaWdpbmFsTWVzc2FnZSkge1xuICAgICAgICBsZXQgZXJyb3I7XG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlIGluc3RhbmNlb2YgUHJvdG9jb2xFcnJvcikge1xuICAgICAgICAgICAgZXJyb3IgPSBlcnJvck1lc3NhZ2U7XG4gICAgICAgICAgICBlcnJvci5jYXVzZSA9IGNhbGxiYWNrLmVycm9yO1xuICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXJyb3IgPSBjYWxsYmFjay5lcnJvcjtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2sucmVqZWN0KHJld3JpdGVFcnJvcihlcnJvciwgYFByb3RvY29sIGVycm9yICgke2NhbGxiYWNrLmxhYmVsfSk6ICR7bWVzc2FnZX1gLCBvcmlnaW5hbE1lc3NhZ2UpKTtcbiAgICB9XG4gICAgcmVzb2x2ZShpZCwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLiNjYWxsYmFja3MuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrLnJlc29sdmUodmFsdWUpO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLiNjYWxsYmFja3MudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHByb2JhYmx5IHdlIGNhbiBhY2NlcHQgZXJyb3IgbWVzc2FnZXMgYXMgcGFyYW1zLlxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0KGNhbGxiYWNrLCBuZXcgVGFyZ2V0Q2xvc2VFcnJvcignVGFyZ2V0IGNsb3NlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNjYWxsYmFja3MuY2xlYXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0UGVuZGluZ1Byb3RvY29sRXJyb3JzKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLiNjYWxsYmFja3MudmFsdWVzKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBFcnJvcihgJHtjYWxsYmFjay5sYWJlbH0gdGltZWQgb3V0LiBUcmFjZTogJHtjYWxsYmFjay5lcnJvci5zdGFja31gKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ2FsbGJhY2sge1xuICAgICNpZDtcbiAgICAjZXJyb3IgPSBuZXcgUHJvdG9jb2xFcnJvcigpO1xuICAgICNkZWZlcnJlZCA9IERlZmVycmVkLmNyZWF0ZSgpO1xuICAgICN0aW1lcjtcbiAgICAjbGFiZWw7XG4gICAgY29uc3RydWN0b3IoaWQsIGxhYmVsLCB0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuI2lkID0gaWQ7XG4gICAgICAgIHRoaXMuI2xhYmVsID0gbGFiZWw7XG4gICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgICB0aGlzLiN0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2RlZmVycmVkLnJlamVjdChyZXdyaXRlRXJyb3IodGhpcy4jZXJyb3IsIGAke2xhYmVsfSB0aW1lZCBvdXQuIEluY3JlYXNlIHRoZSAncHJvdG9jb2xUaW1lb3V0JyBzZXR0aW5nIGluIGxhdW5jaC9jb25uZWN0IGNhbGxzIGZvciBhIGhpZ2hlciB0aW1lb3V0IGlmIG5lZWRlZC5gKSk7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0aW1lcik7XG4gICAgICAgIHRoaXMuI2RlZmVycmVkLnJlc29sdmUodmFsdWUpO1xuICAgIH1cbiAgICByZWplY3QoZXJyb3IpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3RpbWVyKTtcbiAgICAgICAgdGhpcy4jZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaWQ7XG4gICAgfVxuICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGVmZXJyZWQudmFsdWVPclRocm93KCk7XG4gICAgfVxuICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Vycm9yO1xuICAgIH1cbiAgICBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYWJlbDtcbiAgICB9XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5jcmVtZW50YWxJZEdlbmVyYXRvcigpIHtcbiAgICBsZXQgaWQgPSAwO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHJldHVybiArK2lkO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYWxsYmFja1JlZ2lzdHJ5LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25maWd1cmF0aW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25uZWN0T3B0aW9ucy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdGlvblRyYW5zcG9ydC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBDb25zb2xlTWVzc2FnZSBvYmplY3RzIGFyZSBkaXNwYXRjaGVkIGJ5IHBhZ2UgdmlhIHRoZSAnY29uc29sZScgZXZlbnQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25zb2xlTWVzc2FnZSB7XG4gICAgI3R5cGU7XG4gICAgI3RleHQ7XG4gICAgI2FyZ3M7XG4gICAgI3N0YWNrVHJhY2VMb2NhdGlvbnM7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZSwgdGV4dCwgYXJncywgc3RhY2tUcmFjZUxvY2F0aW9ucykge1xuICAgICAgICB0aGlzLiN0eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy4jdGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuI2FyZ3MgPSBhcmdzO1xuICAgICAgICB0aGlzLiNzdGFja1RyYWNlTG9jYXRpb25zID0gc3RhY2tUcmFjZUxvY2F0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGNvbnNvbGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHRleHQgb2YgdGhlIGNvbnNvbGUgbWVzc2FnZS5cbiAgICAgKi9cbiAgICB0ZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgY29uc29sZS5cbiAgICAgKi9cbiAgICBhcmdzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYXJncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBjb25zb2xlIG1lc3NhZ2UuXG4gICAgICovXG4gICAgbG9jYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGFja1RyYWNlTG9jYXRpb25zWzBdID8/IHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYXJyYXkgb2YgbG9jYXRpb25zIG9uIHRoZSBzdGFjayBvZiB0aGUgY29uc29sZSBtZXNzYWdlLlxuICAgICAqL1xuICAgIHN0YWNrVHJhY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGFja1RyYWNlTG9jYXRpb25zO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnNvbGVNZXNzYWdlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db29raWUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0LmpzJztcbmltcG9ydCB7IGludGVycG9sYXRlRnVuY3Rpb24sIHN0cmluZ2lmeUZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbC9GdW5jdGlvbi5qcyc7XG5pbXBvcnQgeyBRdWVyeUhhbmRsZXIsIH0gZnJvbSAnLi9RdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgc2NyaXB0SW5qZWN0b3IgfSBmcm9tICcuL1NjcmlwdEluamVjdG9yLmpzJztcbi8qKlxuICogVGhlIHJlZ2lzdHJ5IG9mIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBjdXN0b20gcXVlcnkgaGFuZGxlcnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIFB1cHBldGVlci5jdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKCdsaXQnLCB7IOKApiB9KTtcbiAqIGNvbnN0IGFIYW5kbGUgPSBhd2FpdCBwYWdlLiQoJ2xpdC/igKYnKTtcbiAqIGBgYFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgQ3VzdG9tUXVlcnlIYW5kbGVyUmVnaXN0cnkge1xuICAgICNoYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBnZXQobmFtZSkge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy4jaGFuZGxlcnMuZ2V0KG5hbWUpO1xuICAgICAgICByZXR1cm4gaGFuZGxlciA/IGhhbmRsZXJbMV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBjdXN0b20gcXVlcnkgaGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFmdGVyIHJlZ2lzdHJhdGlvbiwgdGhlIGhhbmRsZXIgY2FuIGJlIHVzZWQgZXZlcnl3aGVyZSB3aGVyZSBhIHNlbGVjdG9yIGlzXG4gICAgICogZXhwZWN0ZWQgYnkgcHJlcGVuZGluZyB0aGUgc2VsZWN0aW9uIHN0cmluZyB3aXRoIGA8bmFtZT4vYC4gVGhlIG5hbWUgaXNcbiAgICAgKiBvbmx5IGFsbG93ZWQgdG8gY29uc2lzdCBvZiBsb3dlci0gYW5kIHVwcGVyIGNhc2UgbGF0aW4gbGV0dGVycy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIFB1cHBldGVlci5jdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKCdsaXQnLCB7IOKApiB9KTtcbiAgICAgKiBjb25zdCBhSGFuZGxlID0gYXdhaXQgcGFnZS4kKCdsaXQv4oCmJyk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSAtIE5hbWUgdG8gcmVnaXN0ZXIgdW5kZXIuXG4gICAgICogQHBhcmFtIHF1ZXJ5SGFuZGxlciAtIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBDdXN0b20gcXVlcnkgaGFuZGxlcn0gdG9cbiAgICAgKiByZWdpc3Rlci5cbiAgICAgKi9cbiAgICByZWdpc3RlcihuYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlcnMuaGFzKG5hbWUpLCBgQ2Fubm90IHJlZ2lzdGVyIG92ZXIgZXhpc3RpbmcgaGFuZGxlcjogJHtuYW1lfWApO1xuICAgICAgICBhc3NlcnQoL15bYS16QS1aXSskLy50ZXN0KG5hbWUpLCBgQ3VzdG9tIHF1ZXJ5IGhhbmRsZXIgbmFtZXMgbWF5IG9ubHkgY29udGFpbiBbYS16QS1aXWApO1xuICAgICAgICBhc3NlcnQoaGFuZGxlci5xdWVyeUFsbCB8fCBoYW5kbGVyLnF1ZXJ5T25lLCBgQXQgbGVhc3Qgb25lIHF1ZXJ5IG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkLmApO1xuICAgICAgICBjb25zdCBIYW5kbGVyID0gY2xhc3MgZXh0ZW5kcyBRdWVyeUhhbmRsZXIge1xuICAgICAgICAgICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JBbGwgPSBpbnRlcnBvbGF0ZUZ1bmN0aW9uKChub2RlLCBzZWxlY3RvciwgUHVwcGV0ZWVyVXRpbCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQdXBwZXRlZXJVdGlsLmN1c3RvbVF1ZXJ5U2VsZWN0b3JzXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoUExBQ0VIT0xERVIoJ25hbWUnKSlcbiAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwobm9kZSwgc2VsZWN0b3IpO1xuICAgICAgICAgICAgfSwgeyBuYW1lOiBKU09OLnN0cmluZ2lmeShuYW1lKSB9KTtcbiAgICAgICAgICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yID0gaW50ZXJwb2xhdGVGdW5jdGlvbigobm9kZSwgc2VsZWN0b3IsIFB1cHBldGVlclV0aWwpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHVwcGV0ZWVyVXRpbC5jdXN0b21RdWVyeVNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICAuZ2V0KFBMQUNFSE9MREVSKCduYW1lJykpXG4gICAgICAgICAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKG5vZGUsIHNlbGVjdG9yKTtcbiAgICAgICAgICAgIH0sIHsgbmFtZTogSlNPTi5zdHJpbmdpZnkobmFtZSkgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyU2NyaXB0ID0gaW50ZXJwb2xhdGVGdW5jdGlvbigoUHVwcGV0ZWVyVXRpbCkgPT4ge1xuICAgICAgICAgICAgUHVwcGV0ZWVyVXRpbC5jdXN0b21RdWVyeVNlbGVjdG9ycy5yZWdpc3RlcihQTEFDRUhPTERFUignbmFtZScpLCB7XG4gICAgICAgICAgICAgICAgcXVlcnlBbGw6IFBMQUNFSE9MREVSKCdxdWVyeUFsbCcpLFxuICAgICAgICAgICAgICAgIHF1ZXJ5T25lOiBQTEFDRUhPTERFUigncXVlcnlPbmUnKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBuYW1lOiBKU09OLnN0cmluZ2lmeShuYW1lKSxcbiAgICAgICAgICAgIHF1ZXJ5QWxsOiBoYW5kbGVyLnF1ZXJ5QWxsXG4gICAgICAgICAgICAgICAgPyBzdHJpbmdpZnlGdW5jdGlvbihoYW5kbGVyLnF1ZXJ5QWxsKVxuICAgICAgICAgICAgICAgIDogU3RyaW5nKHVuZGVmaW5lZCksXG4gICAgICAgICAgICBxdWVyeU9uZTogaGFuZGxlci5xdWVyeU9uZVxuICAgICAgICAgICAgICAgID8gc3RyaW5naWZ5RnVuY3Rpb24oaGFuZGxlci5xdWVyeU9uZSlcbiAgICAgICAgICAgICAgICA6IFN0cmluZyh1bmRlZmluZWQpLFxuICAgICAgICB9KS50b1N0cmluZygpO1xuICAgICAgICB0aGlzLiNoYW5kbGVycy5zZXQobmFtZSwgW3JlZ2lzdGVyU2NyaXB0LCBIYW5kbGVyXSk7XG4gICAgICAgIHNjcmlwdEluamVjdG9yLmFwcGVuZChyZWdpc3RlclNjcmlwdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIHRoZSB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJ9IGZvciB0aGVcbiAgICAgKiBnaXZlbiBuYW1lLlxuICAgICAqXG4gICAgICogQHRocm93cyBgRXJyb3JgIGlmIHRoZXJlIGlzIG5vIGhhbmRsZXIgdW5kZXIgdGhlIGdpdmVuIG5hbWUuXG4gICAgICovXG4gICAgdW5yZWdpc3RlcihuYW1lKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLiNoYW5kbGVycy5nZXQobmFtZSk7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdW5yZWdpc3RlciB1bmtub3duIGhhbmRsZXI6ICR7bmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBzY3JpcHRJbmplY3Rvci5wb3AoaGFuZGxlclswXSk7XG4gICAgICAgIHRoaXMuI2hhbmRsZXJzLmRlbGV0ZShuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIHtAbGluayBDdXN0b21RdWVyeUhhbmRsZXIgfCBjdXN0b20gcXVlcnkgaGFuZGxlcnN9LlxuICAgICAqL1xuICAgIG5hbWVzKCkge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuI2hhbmRsZXJzLmtleXMoKV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIGFsbCBjdXN0b20gcXVlcnkgaGFuZGxlcnMuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3JlZ2lzdGVyU2NyaXB0XSBvZiB0aGlzLiNoYW5kbGVycykge1xuICAgICAgICAgICAgc2NyaXB0SW5qZWN0b3IucG9wKHJlZ2lzdGVyU2NyaXB0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNoYW5kbGVycy5jbGVhcigpO1xuICAgIH1cbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21RdWVyeUhhbmRsZXJzID0gbmV3IEN1c3RvbVF1ZXJ5SGFuZGxlclJlZ2lzdHJ5KCk7XG4vKipcbiAqIEBkZXByZWNhdGVkIEltcG9ydCB7QGxpbmsgUHVwcGV0ZWVyfSBhbmQgdXNlIHRoZSBzdGF0aWMgbWV0aG9kXG4gKiB7QGxpbmsgUHVwcGV0ZWVyLnJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyfVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyKG5hbWUsIGhhbmRsZXIpIHtcbiAgICBjdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKG5hbWUsIGhhbmRsZXIpO1xufVxuLyoqXG4gKiBAZGVwcmVjYXRlZCBJbXBvcnQge0BsaW5rIFB1cHBldGVlcn0gYW5kIHVzZSB0aGUgc3RhdGljIG1ldGhvZFxuICoge0BsaW5rIFB1cHBldGVlci51bnJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyfVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJDdXN0b21RdWVyeUhhbmRsZXIobmFtZSkge1xuICAgIGN1c3RvbVF1ZXJ5SGFuZGxlcnMudW5yZWdpc3RlcihuYW1lKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgSW1wb3J0IHtAbGluayBQdXBwZXRlZXJ9IGFuZCB1c2UgdGhlIHN0YXRpYyBtZXRob2RcbiAqIHtAbGluayBQdXBwZXRlZXIuY3VzdG9tUXVlcnlIYW5kbGVyTmFtZXN9XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3VzdG9tUXVlcnlIYW5kbGVyTmFtZXMoKSB7XG4gICAgcmV0dXJuIGN1c3RvbVF1ZXJ5SGFuZGxlcnMubmFtZXMoKTtcbn1cbi8qKlxuICogQGRlcHJlY2F0ZWQgSW1wb3J0IHtAbGluayBQdXBwZXRlZXJ9IGFuZCB1c2UgdGhlIHN0YXRpYyBtZXRob2RcbiAqIHtAbGluayBQdXBwZXRlZXIuY2xlYXJDdXN0b21RdWVyeUhhbmRsZXJzfVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQ3VzdG9tUXVlcnlIYW5kbGVycygpIHtcbiAgICBjdXN0b21RdWVyeUhhbmRsZXJzLmNsZWFyKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DdXN0b21RdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gJy4uL2Vudmlyb25tZW50LmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBkZWJ1Z01vZHVsZSA9IG51bGw7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RGVidWcoKSB7XG4gICAgaWYgKCFkZWJ1Z01vZHVsZSkge1xuICAgICAgICBkZWJ1Z01vZHVsZSA9IChhd2FpdCBpbXBvcnQoJ2RlYnVnJykpLmRlZmF1bHQ7XG4gICAgfVxuICAgIHJldHVybiBkZWJ1Z01vZHVsZTtcbn1cbi8qKlxuICogQSBkZWJ1ZyBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGFueSBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgdXNlZCBpbiBOb2RlLCBpdCBmYWxscyBiYWNrIHRvIHRoZVxuICoge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2RlYnVnIHwgZGVidWcgbW9kdWxlfS4gSW4gdGhlIGJyb3dzZXIgaXRcbiAqIHVzZXMgYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBJbiBOb2RlLCB1c2UgdGhlIGBERUJVR2AgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gY29udHJvbCBsb2dnaW5nOlxuICpcbiAqIGBgYFxuICogREVCVUc9KiAvLyBsb2dzIGFsbCBjaGFubmVsc1xuICogREVCVUc9Zm9vIC8vIGxvZ3MgdGhlIGBmb29gIGNoYW5uZWxcbiAqIERFQlVHPWZvbyogLy8gbG9ncyBhbnkgY2hhbm5lbHMgc3RhcnRpbmcgd2l0aCBgZm9vYFxuICogYGBgXG4gKlxuICogSW4gdGhlIGJyb3dzZXIsIHNldCBgd2luZG93Ll9fUFVQUEVURUVSX0RFQlVHYCB0byBhIHN0cmluZzpcbiAqXG4gKiBgYGBcbiAqIHdpbmRvdy5fX1BVUFBFVEVFUl9ERUJVRz0nKic7IC8vIGxvZ3MgYWxsIGNoYW5uZWxzXG4gKiB3aW5kb3cuX19QVVBQRVRFRVJfREVCVUc9J2Zvbyc7IC8vIGxvZ3MgdGhlIGBmb29gIGNoYW5uZWxcbiAqIHdpbmRvdy5fX1BVUFBFVEVFUl9ERUJVRz0nZm9vKic7IC8vIGxvZ3MgYW55IGNoYW5uZWxzIHN0YXJ0aW5nIHdpdGggYGZvb2BcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgXG4gKiBjb25zdCBsb2cgPSBkZWJ1ZygnUGFnZScpO1xuICpcbiAqIGxvZygnbmV3IHBhZ2UgY3JlYXRlZCcpXG4gKiAvLyBsb2dzIFwiUGFnZTogbmV3IHBhZ2UgY3JlYXRlZFwiXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHJlZml4IC0gdGhpcyB3aWxsIGJlIHByZWZpeGVkIHRvIGVhY2ggbG9nLlxuICogQHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gbG9nIHRvIHRoYXQgZGVidWcgY2hhbm5lbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGRlYnVnID0gKHByZWZpeCkgPT4ge1xuICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgcmV0dXJuIGFzeW5jICguLi5sb2dBcmdzKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2FwdHVyZUxvZ3MpIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlZExvZ3MucHVzaChwcmVmaXggKyBsb2dBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChhd2FpdCBpbXBvcnREZWJ1ZygpKShwcmVmaXgpKGxvZ0FyZ3MpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gKC4uLmxvZ0FyZ3MpID0+IHtcbiAgICAgICAgY29uc3QgZGVidWdMZXZlbCA9IGdsb2JhbFRoaXMuX19QVVBQRVRFRVJfREVCVUc7XG4gICAgICAgIGlmICghZGVidWdMZXZlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZXJ5dGhpbmdTaG91bGRCZUxvZ2dlZCA9IGRlYnVnTGV2ZWwgPT09ICcqJztcbiAgICAgICAgY29uc3QgcHJlZml4TWF0Y2hlc0RlYnVnTGV2ZWwgPSBldmVyeXRoaW5nU2hvdWxkQmVMb2dnZWQgfHxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSWYgdGhlIGRlYnVnIGxldmVsIGlzIGBmb28qYCwgdGhhdCBtZWFucyB3ZSBtYXRjaCBhbnkgcHJlZml4IHRoYXRcbiAgICAgICAgICAgICAqIHN0YXJ0cyB3aXRoIGBmb29gLiBJZiB0aGUgbGV2ZWwgaXMgYGZvb2AsIHdlIG1hdGNoIG9ubHkgdGhlIHByZWZpeFxuICAgICAgICAgICAgICogYGZvb2AuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIChkZWJ1Z0xldmVsLmVuZHNXaXRoKCcqJylcbiAgICAgICAgICAgICAgICA/IHByZWZpeC5zdGFydHNXaXRoKGRlYnVnTGV2ZWwpXG4gICAgICAgICAgICAgICAgOiBwcmVmaXggPT09IGRlYnVnTGV2ZWwpO1xuICAgICAgICBpZiAoIXByZWZpeE1hdGNoZXNEZWJ1Z0xldmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coYCR7cHJlZml4fTpgLCAuLi5sb2dBcmdzKTtcbiAgICB9O1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBjYXB0dXJlZExvZ3MgPSBbXTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmxldCBjYXB0dXJlTG9ncyA9IGZhbHNlO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExvZ0NhcHR1cmUodmFsdWUpIHtcbiAgICBjYXB0dXJlZExvZ3MgPSBbXTtcbiAgICBjYXB0dXJlTG9ncyA9IHZhbHVlO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhcHR1cmVkTG9ncygpIHtcbiAgICByZXR1cm4gY2FwdHVyZWRMb2dzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGVidWcuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmNvbnN0IGtub3duRGV2aWNlcyA9IFtcbiAgICB7XG4gICAgICAgIG5hbWU6ICdCbGFja2JlcnJ5IFBsYXlCb29rJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKFBsYXlCb29rOyBVOyBSSU0gVGFibGV0IE9TIDIuMS4wOyBlbi1VUykgQXBwbGVXZWJLaXQvNTM2LjIrIChLSFRNTCBsaWtlIEdlY2tvKSBWZXJzaW9uLzcuMi4xLjAgU2FmYXJpLzUzNi4yKycsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDI0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDEsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnQmxhY2tiZXJyeSBQbGF5Qm9vayBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoUGxheUJvb2s7IFU7IFJJTSBUYWJsZXQgT1MgMi4xLjA7IGVuLVVTKSBBcHBsZVdlYktpdC81MzYuMisgKEtIVE1MIGxpa2UgR2Vja28pIFZlcnNpb24vNy4yLjEuMCBTYWZhcmkvNTM2LjIrJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDI0LFxuICAgICAgICAgICAgaGVpZ2h0OiA2MDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0JsYWNrQmVycnkgWjMwJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKEJCMTA7IFRvdWNoKSBBcHBsZVdlYktpdC81MzcuMTArIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wLjkuMjM3MiBNb2JpbGUgU2FmYXJpLzUzNy4xMCsnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnQmxhY2tCZXJyeSBaMzAgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKEJCMTA7IFRvdWNoKSBBcHBsZVdlYktpdC81MzcuMTArIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wLjkuMjM3MiBNb2JpbGUgU2FmYXJpLzUzNy4xMCsnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgTm90ZSAzJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMzsgZW4tdXM7IFNNLU45MDBUIEJ1aWxkL0pTUzE1SikgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnR2FsYXh5IE5vdGUgMyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgNC4zOyBlbi11czsgU00tTjkwMFQgQnVpbGQvSlNTMTVKKSBBcHBsZVdlYktpdC81MzQuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBNb2JpbGUgU2FmYXJpLzUzNC4zMCcsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBOb3RlIElJJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMTsgZW4tdXM7IEdULU43MTAwIEJ1aWxkL0pSTzAzQykgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnR2FsYXh5IE5vdGUgSUkgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMTsgZW4tdXM7IEdULU43MTAwIEJ1aWxkL0pSTzAzQykgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUyBJSUknLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgNC4wOyBlbi11czsgR1QtSTkzMDAgQnVpbGQvSU1NNzZEKSBBcHBsZVdlYktpdC81MzQuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBNb2JpbGUgU2FmYXJpLzUzNC4zMCcsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzYwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUyBJSUkgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuMDsgZW4tdXM7IEdULUk5MzAwIEJ1aWxkL0lNTTc2RCkgQXBwbGVXZWJLaXQvNTM0LjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgTW9iaWxlIFNhZmFyaS81MzQuMzAnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUzUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNS4wOyBTTS1HOTAwUCBCdWlsZC9MUlgyMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzYwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUzUgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDUuMDsgU00tRzkwMFAgQnVpbGQvTFJYMjFUKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdHYWxheHkgUzgnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNy4wOyBTTS1HOTUwVSBCdWlsZC9OUkQ5ME0pIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS82Mi4wLjMyMDIuODQgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM2MCxcbiAgICAgICAgICAgIGhlaWdodDogNzQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnR2FsYXh5IFM4IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA3LjA7IFNNLUc5NTBVIEJ1aWxkL05SRDkwTSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzYyLjAuMzIwMi44NCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBTOSsnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4wLjA7IFNNLUc5NjVVIEJ1aWxkL1IxNk5XKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNjMuMC4zMjM5LjExMSBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzIwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NTgsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogNC41LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBTOSsgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBTTS1HOTY1VSBCdWlsZC9SMTZOVykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzYzLjAuMzIzOS4xMTEgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY1OCxcbiAgICAgICAgICAgIGhlaWdodDogMzIwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDQuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBUYWIgUzQnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4xLjA7IFNNLVQ4MzdBKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzAuMC4zNTM4LjgwIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDcxMixcbiAgICAgICAgICAgIGhlaWdodDogMTEzOCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLjI1LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0dhbGF4eSBUYWIgUzQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMS4wOyBTTS1UODM3QSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzcwLjAuMzUzOC44MCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMTM4LFxuICAgICAgICAgICAgaGVpZ2h0OiA3MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi4yNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzQgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTUzNDFmIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzY4LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDI0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzQgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTUzNDFmIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMTAyNCxcbiAgICAgICAgICAgIGhlaWdodDogNzY4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIChnZW4gNiknLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDEyXzIgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDc2OCxcbiAgICAgICAgICAgIGhlaWdodDogMTAyNCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQgKGdlbiA2KSBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDEyXzIgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDEwMjQsXG4gICAgICAgICAgICBoZWlnaHQ6IDc2OCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCAoZ2VuIDcpJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMl8yIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xNS40IE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4MTAsXG4gICAgICAgICAgICBoZWlnaHQ6IDEwODAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIChnZW4gNykgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMl8yIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xNS40IE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDgwLFxuICAgICAgICAgICAgaGVpZ2h0OiA4MTAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQgTWluaScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zNCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBNTM0MWYgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA3NjgsXG4gICAgICAgICAgICBoZWlnaHQ6IDEwMjQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIE1pbmkgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM0IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUE1MzQxZiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDEwMjQsXG4gICAgICAgICAgICBoZWlnaHQ6IDc2OCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBhZDsgQ1BVIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzQgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTUzNDFmIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMTAyNCxcbiAgICAgICAgICAgIGhlaWdodDogMTM2NixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQYWQgUHJvIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zNCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBNTM0MWYgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMzY2LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMDI0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGFkIFBybyAxMScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGFkOyBDUFUgT1MgMTJfMiBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODM0LFxuICAgICAgICAgICAgaGVpZ2h0OiAxMTk0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBhZCBQcm8gMTEgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQYWQ7IENQVSBPUyAxMl8yIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xNS40IE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAxMTk0LFxuICAgICAgICAgICAgaGVpZ2h0OiA4MzQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA0JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyA3XzFfMiBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC81MzcuNTEuMiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNy4wIE1vYmlsZS8xMUQyNTcgU2FmYXJpLzk1MzcuNTMnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDMyMCxcbiAgICAgICAgICAgIGhlaWdodDogNDgwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyA3XzFfMiBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC81MzcuNTEuMiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNy4wIE1vYmlsZS8xMUQyNTcgU2FmYXJpLzk1MzcuNTMnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQ4MCxcbiAgICAgICAgICAgIGhlaWdodDogMzIwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgNScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTBfM18xIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwMy4xLjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wIE1vYmlsZS8xNEUzMDQgU2FmYXJpLzYwMi4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzMjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDU2OCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA1IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTBfM18xIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwMy4xLjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wIE1vYmlsZS8xNEUzMDQgU2FmYXJpLzYwMi4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA1NjgsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDYnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM3NSxcbiAgICAgICAgICAgIGhlaWdodDogNjY3LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDYgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA2NjcsXG4gICAgICAgICAgICBoZWlnaHQ6IDM3NSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDYgUGx1cycsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDE0LFxuICAgICAgICAgICAgaGVpZ2h0OiA3MzYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgNiBQbHVzIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzM2LFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA3JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNzUsXG4gICAgICAgICAgICBoZWlnaHQ6IDY2NyxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA3IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjY3LFxuICAgICAgICAgICAgaGVpZ2h0OiAzNzUsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA3IFBsdXMnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQxNCxcbiAgICAgICAgICAgIGhlaWdodDogNzM2LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDcgUGx1cyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDczNixcbiAgICAgICAgICAgIGhlaWdodDogNDE0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgOCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTFfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDQuMS4zOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTEuMCBNb2JpbGUvMTVBMzcyIFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzc1LFxuICAgICAgICAgICAgaGVpZ2h0OiA2NjcsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgOCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY2NyxcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgOCBQbHVzJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTQsXG4gICAgICAgICAgICBoZWlnaHQ6IDczNixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSA4IFBsdXMgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA3MzYsXG4gICAgICAgICAgICBoZWlnaHQ6IDQxNCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFNFJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMF8zXzEgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjAzLjEuMzAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEwLjAgTW9iaWxlLzE0RTMwNCBTYWZhcmkvNjAyLjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDMyMCxcbiAgICAgICAgICAgIGhlaWdodDogNTY4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFNFIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTBfM18xIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwMy4xLjMwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMC4wIE1vYmlsZS8xNEUzMDQgU2FmYXJpLzYwMi4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA1NjgsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFgnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDExXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA0LjEuMzggKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzExLjAgTW9iaWxlLzE1QTM3MiBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM3NSxcbiAgICAgICAgICAgIGhlaWdodDogODEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFggbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMV8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNC4xLjM4IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMS4wIE1vYmlsZS8xNUEzNzIgU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4MTIsXG4gICAgICAgICAgICBoZWlnaHQ6IDM3NSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIFhSJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGlQaG9uZTsgQ1BVIGlQaG9uZSBPUyAxMl8wIGxpa2UgTWFjIE9TIFgpIEFwcGxlV2ViS2l0LzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8xMi4wIE1vYmlsZS8xNUUxNDggU2FmYXJpLzYwNC4xJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTQsXG4gICAgICAgICAgICBoZWlnaHQ6IDg5NixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSBYUiBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEyXzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEyLjAgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg5NixcbiAgICAgICAgICAgIGhlaWdodDogNDE0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTEnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQxNCxcbiAgICAgICAgICAgIGhlaWdodDogODI4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDExIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTNfNyBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTMuMSBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODI4LFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSAxMSBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM3NSxcbiAgICAgICAgICAgIGhlaWdodDogODEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDExIFBybyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgxMixcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTEgUHJvIE1heCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTNfNyBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTMuMSBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDE0LFxuICAgICAgICAgICAgaGVpZ2h0OiA4OTYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTEgUHJvIE1heCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDEzXzcgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzEzLjEgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg5NixcbiAgICAgICAgICAgIGhlaWdodDogNDE0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTInLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEyIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTRfNCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODQ0LFxuICAgICAgICAgICAgaGVpZ2h0OiAzOTAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSAxMiBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEyIFBybyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg0NCxcbiAgICAgICAgICAgIGhlaWdodDogMzkwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgUHJvIE1heCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTRfNCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDI4LFxuICAgICAgICAgICAgaGVpZ2h0OiA5MjYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgUHJvIE1heCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDkyNixcbiAgICAgICAgICAgIGhlaWdodDogNDI4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgTWluaScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTRfNCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzc1LFxuICAgICAgICAgICAgaGVpZ2h0OiA4MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTIgTWluaSBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE0XzQgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgxMixcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEzIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTVfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogODQ0LFxuICAgICAgICAgICAgaGVpZ2h0OiAzOTAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ2lQaG9uZSAxMyBQcm8nLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM5MCxcbiAgICAgICAgICAgIGhlaWdodDogODQ0LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnaVBob25lIDEzIFBybyBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg0NCxcbiAgICAgICAgICAgIGhlaWdodDogMzkwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgUHJvIE1heCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTVfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDI4LFxuICAgICAgICAgICAgaGVpZ2h0OiA5MjYsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgUHJvIE1heCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDkyNixcbiAgICAgICAgICAgIGhlaWdodDogNDI4LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgTWluaScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChpUGhvbmU7IENQVSBpUGhvbmUgT1MgMTVfMCBsaWtlIE1hYyBPUyBYKSBBcHBsZVdlYktpdC82MDUuMS4xNSAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMTUuNCBNb2JpbGUvMTVFMTQ4IFNhZmFyaS82MDQuMScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzc1LFxuICAgICAgICAgICAgaGVpZ2h0OiA4MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdpUGhvbmUgMTMgTWluaSBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoaVBob25lOyBDUFUgaVBob25lIE9TIDE1XzAgbGlrZSBNYWMgT1MgWCkgQXBwbGVXZWJLaXQvNjA1LjEuMTUgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzE1LjQgTW9iaWxlLzE1RTE0OCBTYWZhcmkvNjA0LjEnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgxMixcbiAgICAgICAgICAgIGhlaWdodDogMzc1LFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdKaW9QaG9uZSAyJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKE1vYmlsZTsgTFlGL0YzMDBCL0xZRi1GMzAwQi0wMDEtMDEtMTUtMTMwNzE4LWk7QW5kcm9pZDsgcnY6NDguMCkgR2Vja28vNDguMCBGaXJlZm94LzQ4LjAgS0FJT1MvMi41JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAyNDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0ppb1Bob25lIDIgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKE1vYmlsZTsgTFlGL0YzMDBCL0xZRi1GMzAwQi0wMDEtMDEtMTUtMTMwNzE4LWk7QW5kcm9pZDsgcnY6NDguMCkgR2Vja28vNDguMCBGaXJlZm94LzQ4LjAgS0FJT1MvMi41JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzMjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDI0MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnS2luZGxlIEZpcmUgSERYJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBlbi11czsgS0ZBUFdJIEJ1aWxkL0pEUTM5KSBBcHBsZVdlYktpdC81MzUuMTkgKEtIVE1MLCBsaWtlIEdlY2tvKSBTaWxrLzMuMTMgU2FmYXJpLzUzNS4xOSBTaWxrLUFjY2VsZXJhdGVkPXRydWUnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgwMCxcbiAgICAgICAgICAgIGhlaWdodDogMTI4MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ0tpbmRsZSBGaXJlIEhEWCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IFU7IGVuLXVzOyBLRkFQV0kgQnVpbGQvSkRRMzkpIEFwcGxlV2ViS2l0LzUzNS4xOSAoS0hUTUwsIGxpa2UgR2Vja28pIFNpbGsvMy4xMyBTYWZhcmkvNTM1LjE5IFNpbGstQWNjZWxlcmF0ZWQ9dHJ1ZScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMTI4MCxcbiAgICAgICAgICAgIGhlaWdodDogODAwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdMRyBPcHRpbXVzIEw3MCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgVTsgQW5kcm9pZCA0LjQuMjsgZW4tdXM7IExHTVMzMjMgQnVpbGQvS09UNDlJLk1TMzIzMTBjKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDM4NCxcbiAgICAgICAgICAgIGhlaWdodDogNjQwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDEuMjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTEcgT3B0aW11cyBMNzAgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDQuNC4yOyBlbi11czsgTEdNUzMyMyBCdWlsZC9LT1Q0OUkuTVMzMjMxMGMpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzODQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMS4yNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ01pY3Jvc29mdCBMdW1pYSA1NTAnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBQaG9uZSAxMC4wOyBBbmRyb2lkIDQuMi4xOyBNaWNyb3NvZnQ7IEx1bWlhIDU1MCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzQ2LjAuMjQ4Ni4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2IEVkZ2UvMTQuMTQyNjMnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgIGhlaWdodDogMzYwLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTWljcm9zb2Z0IEx1bWlhIDk1MCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChXaW5kb3dzIFBob25lIDEwLjA7IEFuZHJvaWQgNC4yLjE7IE1pY3Jvc29mdDsgTHVtaWEgOTUwKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDYuMC4yNDg2LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYgRWRnZS8xNC4xNDI2MycsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzYwLFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogNCxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdNaWNyb3NvZnQgTHVtaWEgOTUwIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChXaW5kb3dzIFBob25lIDEwLjA7IEFuZHJvaWQgNC4yLjE7IE1pY3Jvc29mdDsgTHVtaWEgOTUwKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNDYuMC4yNDg2LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYgRWRnZS8xNC4xNDI2MycsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogNCxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDEwJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMC4xOyBOZXh1cyAxMCBCdWlsZC9NT0IzMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4MDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDEyODAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyAxMCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wLjE7IE5leHVzIDEwIEJ1aWxkL01PQjMxVCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDEyODAsXG4gICAgICAgICAgICBoZWlnaHQ6IDgwMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTmV4dXMgNCcsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA0LjQuMjsgTmV4dXMgNCBCdWlsZC9LT1Q0OUgpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzg0LFxuICAgICAgICAgICAgaGVpZ2h0OiA2NDAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyA0IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA0LjQuMjsgTmV4dXMgNCBCdWlsZC9LT1Q0OUgpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzODQsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wOyBOZXh1cyA1IEJ1aWxkL01SQTU4TikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDY0MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDUgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDYuMDsgTmV4dXMgNSBCdWlsZC9NUkE1OE4pIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjQwLFxuICAgICAgICAgICAgaGVpZ2h0OiAzNjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDVYJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBOZXh1cyA1WCBCdWlsZC9PUFI0LjE3MDYyMy4wMDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDEyLFxuICAgICAgICAgICAgaGVpZ2h0OiA3MzIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi42MjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTmV4dXMgNVggbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBOZXh1cyA1WCBCdWlsZC9PUFI0LjE3MDYyMy4wMDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzMyLFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi42MjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyA2JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMS4xOyBOZXh1cyA2IEJ1aWxkL042RjI2VSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTIsXG4gICAgICAgICAgICBoZWlnaHQ6IDczMixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTmV4dXMgNiBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNy4xLjE7IE5leHVzIDYgQnVpbGQvTjZGMjZVKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDczMixcbiAgICAgICAgICAgIGhlaWdodDogNDEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDZQJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBOZXh1cyA2UCBCdWlsZC9PUFAzLjE3MDUxOC4wMDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNDEyLFxuICAgICAgICAgICAgaGVpZ2h0OiA3MzIsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMy41LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDZQIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA4LjAuMDsgTmV4dXMgNlAgQnVpbGQvT1BQMy4xNzA1MTguMDA2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDczMixcbiAgICAgICAgICAgIGhlaWdodDogNDEyLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05leHVzIDcnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNi4wLjE7IE5leHVzIDcgQnVpbGQvTU9CMzBYKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNjAwLFxuICAgICAgICAgICAgaGVpZ2h0OiA5NjAsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMixcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOZXh1cyA3IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA2LjAuMTsgTmV4dXMgNyBCdWlsZC9NT0IzMFgpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA5NjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDYwMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnTm9raWEgTHVtaWEgNTIwJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IE1TSUUgMTAuMDsgV2luZG93cyBQaG9uZSA4LjA7IFRyaWRlbnQvNi4wOyBJRU1vYmlsZS8xMC4wOyBBUk07IFRvdWNoOyBOT0tJQTsgTHVtaWEgNTIwKScsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzIwLFxuICAgICAgICAgICAgaGVpZ2h0OiA1MzMsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMS41LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05va2lhIEx1bWlhIDUyMCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoY29tcGF0aWJsZTsgTVNJRSAxMC4wOyBXaW5kb3dzIFBob25lIDguMDsgVHJpZGVudC82LjA7IElFTW9iaWxlLzEwLjA7IEFSTTsgVG91Y2g7IE5PS0lBOyBMdW1pYSA1MjApJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA1MzMsXG4gICAgICAgICAgICBoZWlnaHQ6IDMyMCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdOb2tpYSBOOScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChNZWVHbzsgTm9raWFOOSkgQXBwbGVXZWJLaXQvNTM0LjEzIChLSFRNTCwgbGlrZSBHZWNrbykgTm9raWFCcm93c2VyLzguNS4wIE1vYmlsZSBTYWZhcmkvNTM0LjEzJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0ODAsXG4gICAgICAgICAgICBoZWlnaHQ6IDg1NCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ05va2lhIE45IGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChNZWVHbzsgTm9raWFOOSkgQXBwbGVXZWJLaXQvNTM0LjEzIChLSFRNTCwgbGlrZSBHZWNrbykgTm9raWFCcm93c2VyLzguNS4wIE1vYmlsZSBTYWZhcmkvNTM0LjEzJyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA4NTQsXG4gICAgICAgICAgICBoZWlnaHQ6IDQ4MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAxLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnUGl4ZWwgMicsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA4LjA7IFBpeGVsIDIgQnVpbGQvT1BEMy4xNzA4MTYuMDEyKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDQxMSxcbiAgICAgICAgICAgIGhlaWdodDogNzMxLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDIuNjI1LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDIgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMDsgUGl4ZWwgMiBCdWlsZC9PUEQzLjE3MDgxNi4wMTIpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NS4wLjM3NjUuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzMxLFxuICAgICAgICAgICAgaGVpZ2h0OiA0MTEsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi42MjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdQaXhlbCAyIFhMJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDguMC4wOyBQaXhlbCAyIFhMIEJ1aWxkL09QRDEuMTcwODE2LjAwNCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzc1LjAuMzc2NS4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA0MTEsXG4gICAgICAgICAgICBoZWlnaHQ6IDgyMyxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLjUsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnUGl4ZWwgMiBYTCBsYW5kc2NhcGUnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4wLjA7IFBpeGVsIDIgWEwgQnVpbGQvT1BEMS4xNzA4MTYuMDA0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzUuMC4zNzY1LjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDgyMyxcbiAgICAgICAgICAgIGhlaWdodDogNDExLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMuNSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDMnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOTsgUGl4ZWwgMyBCdWlsZC9QUTFBLjE4MTEwNS4wMTcuQTEpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS82Ni4wLjMzNTkuMTU4IE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzOTMsXG4gICAgICAgICAgICBoZWlnaHQ6IDc4NixcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAyLjc1LFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDMgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDk7IFBpeGVsIDMgQnVpbGQvUFExQS4xODExMDUuMDE3LkExKSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNjYuMC4zMzU5LjE1OCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzg2LFxuICAgICAgICAgICAgaGVpZ2h0OiAzOTMsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMi43NSxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDQnLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IFBpeGVsIDQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84MS4wLjQwNDQuMTM4IE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNTMsXG4gICAgICAgICAgICBoZWlnaHQ6IDc0NSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDEwOyBQaXhlbCA0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODEuMC40MDQ0LjEzOCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogNzQ1LFxuICAgICAgICAgICAgaGVpZ2h0OiAzNTMsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDRhICg1RyknLFxuICAgICAgICB1c2VyQWdlbnQ6ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTE7IFBpeGVsIDRhICg1RykpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS85OS4wLjQ4MTIuMCBNb2JpbGUgU2FmYXJpLzUzNy4zNicsXG4gICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICB3aWR0aDogMzUzLFxuICAgICAgICAgICAgaGVpZ2h0OiA3NDUsXG4gICAgICAgICAgICBkZXZpY2VTY2FsZUZhY3RvcjogMyxcbiAgICAgICAgICAgIGlzTW9iaWxlOiB0cnVlLFxuICAgICAgICAgICAgaGFzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBpc0xhbmRzY2FwZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdQaXhlbCA0YSAoNUcpIGxhbmRzY2FwZScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMTsgUGl4ZWwgNGEgKDVHKSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA3NDUsXG4gICAgICAgICAgICBoZWlnaHQ6IDM1MyxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiAnUGl4ZWwgNScsXG4gICAgICAgIHVzZXJBZ2VudDogJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCAxMTsgUGl4ZWwgNSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzOTMsXG4gICAgICAgICAgICBoZWlnaHQ6IDg1MSxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ1BpeGVsIDUgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDExOyBQaXhlbCA1KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvOTkuMC40ODEyLjAgTW9iaWxlIFNhZmFyaS81MzcuMzYnLFxuICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgd2lkdGg6IDg1MSxcbiAgICAgICAgICAgIGhlaWdodDogMzkzLFxuICAgICAgICAgICAgZGV2aWNlU2NhbGVGYWN0b3I6IDMsXG4gICAgICAgICAgICBpc01vYmlsZTogdHJ1ZSxcbiAgICAgICAgICAgIGhhc1RvdWNoOiB0cnVlLFxuICAgICAgICAgICAgaXNMYW5kc2NhcGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdNb3RvIEc0JyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMDsgTW90byBHICg0KSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiAzNjAsXG4gICAgICAgICAgICBoZWlnaHQ6IDY0MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogJ01vdG8gRzQgbGFuZHNjYXBlJyxcbiAgICAgICAgdXNlckFnZW50OiAnTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDcuMDsgTW90byBHICg0KSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzk5LjAuNDgxMi4wIE1vYmlsZSBTYWZhcmkvNTM3LjM2JyxcbiAgICAgICAgdmlld3BvcnQ6IHtcbiAgICAgICAgICAgIHdpZHRoOiA2NDAsXG4gICAgICAgICAgICBoZWlnaHQ6IDM2MCxcbiAgICAgICAgICAgIGRldmljZVNjYWxlRmFjdG9yOiAzLFxuICAgICAgICAgICAgaXNNb2JpbGU6IHRydWUsXG4gICAgICAgICAgICBoYXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIGlzTGFuZHNjYXBlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH0sXG5dO1xuY29uc3Qga25vd25EZXZpY2VzQnlOYW1lID0ge307XG5mb3IgKGNvbnN0IGRldmljZSBvZiBrbm93bkRldmljZXMpIHtcbiAgICBrbm93bkRldmljZXNCeU5hbWVbZGV2aWNlLm5hbWVdID0gZGV2aWNlO1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgZGV2aWNlcyB0byBiZSB1c2VkIHdpdGgge0BsaW5rIFBhZ2UuZW11bGF0ZX0uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHtLbm93bkRldmljZXN9IGZyb20gJ3B1cHBldGVlcic7XG4gKiBjb25zdCBpUGhvbmUgPSBLbm93bkRldmljZXNbJ2lQaG9uZSA2J107XG4gKlxuICogKGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAqICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICogICBhd2FpdCBwYWdlLmVtdWxhdGUoaVBob25lKTtcbiAqICAgYXdhaXQgcGFnZS5nb3RvKCdodHRwczovL3d3dy5nb29nbGUuY29tJyk7XG4gKiAgIC8vIG90aGVyIGFjdGlvbnMuLi5cbiAqICAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICogfSkoKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IEtub3duRGV2aWNlcyA9IE9iamVjdC5mcmVlemUoa25vd25EZXZpY2VzQnlOYW1lKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURldmljZS5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIFB1cHBldGVlci1zcGVjaWZpYyBlcnJvcnNcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQdXBwZXRlZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICB9XG59XG4vKipcbiAqIFRpbWVvdXRFcnJvciBpcyBlbWl0dGVkIHdoZW5ldmVyIGNlcnRhaW4gb3BlcmF0aW9ucyBhcmUgdGVybWluYXRlZCBkdWUgdG9cbiAqIHRpbWVvdXQuXG4gKlxuICogQHJlbWFya3NcbiAqIEV4YW1wbGUgb3BlcmF0aW9ucyBhcmUge0BsaW5rIFBhZ2Uud2FpdEZvclNlbGVjdG9yIHwgcGFnZS53YWl0Rm9yU2VsZWN0b3J9IG9yXG4gKiB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXVuY2ggfCBwdXBwZXRlZXIubGF1bmNofS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lb3V0RXJyb3IgZXh0ZW5kcyBQdXBwZXRlZXJFcnJvciB7XG59XG4vKipcbiAqIFByb3RvY29sRXJyb3IgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGVyZSBpcyBhbiBlcnJvciBmcm9tIHRoZSBwcm90b2NvbC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm90b2NvbEVycm9yIGV4dGVuZHMgUHVwcGV0ZWVyRXJyb3Ige1xuICAgICNjb2RlO1xuICAgICNvcmlnaW5hbE1lc3NhZ2UgPSAnJztcbiAgICBzZXQgY29kZShjb2RlKSB7XG4gICAgICAgIHRoaXMuI2NvZGUgPSBjb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgZ2V0IGNvZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb2RlO1xuICAgIH1cbiAgICBzZXQgb3JpZ2luYWxNZXNzYWdlKG9yaWdpbmFsTWVzc2FnZSkge1xuICAgICAgICB0aGlzLiNvcmlnaW5hbE1lc3NhZ2UgPSBvcmlnaW5hbE1lc3NhZ2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBnZXQgb3JpZ2luYWxNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jb3JpZ2luYWxNZXNzYWdlO1xuICAgIH1cbn1cbi8qKlxuICogUHVwcGV0ZWVyIHdpbGwgdGhyb3cgdGhpcyBlcnJvciBpZiBhIG1ldGhvZCBpcyBub3RcbiAqIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHVzZWQgcHJvdG9jb2xcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZE9wZXJhdGlvbiBleHRlbmRzIFB1cHBldGVlckVycm9yIHtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRDbG9zZUVycm9yIGV4dGVuZHMgUHJvdG9jb2xFcnJvciB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcnJvcnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBtaXR0IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L21pdHQvbWl0dC5qcyc7XG5pbXBvcnQgeyBkaXNwb3NlU3ltYm9sIH0gZnJvbSAnLi4vdXRpbC9kaXNwb3NhYmxlLmpzJztcbi8qKlxuICogVGhlIEV2ZW50RW1pdHRlciBjbGFzcyB0aGF0IG1hbnkgUHVwcGV0ZWVyIGNsYXNzZXMgZXh0ZW5kLlxuICpcbiAqIEByZW1hcmtzXG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIGxpc3RlbiB0byBldmVudHMgdGhhdCBQdXBwZXRlZXIgY2xhc3NlcyBmaXJlIGFuZCBhY3RcbiAqIGFjY29yZGluZ2x5LiBUaGVyZWZvcmUgeW91J2xsIG1vc3RseSB1c2Uge0BsaW5rIEV2ZW50RW1pdHRlci5vbiB8IG9ufSBhbmRcbiAqIHtAbGluayBFdmVudEVtaXR0ZXIub2ZmIHwgb2ZmfSB0byBiaW5kXG4gKiBhbmQgdW5iaW5kIHRvIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXIge1xuICAgICNlbWl0dGVyO1xuICAgICNoYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICAvKipcbiAgICAgKiBJZiB5b3UgcGFzcyBhbiBlbWl0dGVyLCB0aGUgcmV0dXJuZWQgZW1pdHRlciB3aWxsIHdyYXAgdGhlIHBhc3NlZCBlbWl0dGVyLlxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZW1pdHRlciA9IG1pdHQobmV3IE1hcCgpKSkge1xuICAgICAgICB0aGlzLiNlbWl0dGVyID0gZW1pdHRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQmluZCBhbiBldmVudCBsaXN0ZW5lciB0byBmaXJlIHdoZW4gYW4gZXZlbnQgb2NjdXJzLlxuICAgICAqIEBwYXJhbSB0eXBlIC0gdGhlIGV2ZW50IHR5cGUgeW91J2QgbGlrZSB0byBsaXN0ZW4gdG8uIENhbiBiZSBhIHN0cmluZyBvciBzeW1ib2wuXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IG9jY3Vycy5cbiAgICAgKiBAcmV0dXJucyBgdGhpc2AgdG8gZW5hYmxlIHlvdSB0byBjaGFpbiBtZXRob2QgY2FsbHMuXG4gICAgICovXG4gICAgb24odHlwZSwgaGFuZGxlcikge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuI2hhbmRsZXJzLmdldCh0eXBlKTtcbiAgICAgICAgaWYgKGhhbmRsZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZXJzLnNldCh0eXBlLCBbaGFuZGxlcl0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNlbWl0dGVyLm9uKHR5cGUsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gZmlyaW5nLlxuICAgICAqIEBwYXJhbSB0eXBlIC0gdGhlIGV2ZW50IHR5cGUgeW91J2QgbGlrZSB0byBzdG9wIGxpc3RlbmluZyB0by5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciAtIHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSByZW1vdmVkLlxuICAgICAqIEByZXR1cm5zIGB0aGlzYCB0byBlbmFibGUgeW91IHRvIGNoYWluIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICBvZmYodHlwZSwgaGFuZGxlcikge1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuI2hhbmRsZXJzLmdldCh0eXBlKSA/PyBbXTtcbiAgICAgICAgaWYgKGhhbmRsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jZW1pdHRlci5vZmYodHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNoYW5kbGVycy5kZWxldGUodHlwZSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IGhhbmRsZXJzLmxhc3RJbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy4jZW1pdHRlci5vZmYodHlwZSwgLi4uaGFuZGxlcnMuc3BsaWNlKGluZGV4LCAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVtaXQgYW4gZXZlbnQgYW5kIGNhbGwgYW55IGFzc29jaWF0ZWQgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgLSB0aGUgZXZlbnQgeW91J2QgbGlrZSB0byBlbWl0XG4gICAgICogQHBhcmFtIGV2ZW50RGF0YSAtIGFueSBkYXRhIHlvdSdkIGxpa2UgdG8gZW1pdCB3aXRoIHRoZSBldmVudFxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGVyZSBhcmUgYW55IGxpc3RlbmVycywgYGZhbHNlYCBpZiB0aGVyZSBhcmUgbm90LlxuICAgICAqL1xuICAgIGVtaXQodHlwZSwgZXZlbnQpIHtcbiAgICAgICAgdGhpcy4jZW1pdHRlci5lbWl0KHR5cGUsIGV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXJDb3VudCh0eXBlKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpa2UgYG9uYCBidXQgdGhlIGxpc3RlbmVyIHdpbGwgb25seSBiZSBmaXJlZCBvbmNlIGFuZCB0aGVuIGl0IHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAgKiBAcGFyYW0gdHlwZSAtIHRoZSBldmVudCB5b3UnZCBsaWtlIHRvIGxpc3RlbiB0b1xuICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gdGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gcnVuIHdoZW4gdGhlIGV2ZW50IG9jY3Vyc1xuICAgICAqIEByZXR1cm5zIGB0aGlzYCB0byBlbmFibGUgeW91IHRvIGNoYWluIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICBvbmNlKHR5cGUsIGhhbmRsZXIpIHtcbiAgICAgICAgY29uc3Qgb25jZUhhbmRsZXIgPSBldmVudERhdGEgPT4ge1xuICAgICAgICAgICAgaGFuZGxlcihldmVudERhdGEpO1xuICAgICAgICAgICAgdGhpcy5vZmYodHlwZSwgb25jZUhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5vbih0eXBlLCBvbmNlSGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSAtIHRoZSBldmVudCB0byBnZXQgdGhlIGxpc3RlbmVyIGNvdW50IGZvclxuICAgICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGJvdW5kIHRvIHRoZSBnaXZlbiBldmVudFxuICAgICAqL1xuICAgIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jaGFuZGxlcnMuZ2V0KHR5cGUpPy5sZW5ndGggfHwgMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgbGlzdGVuZXJzLiBJZiBnaXZlbiBhbiBldmVudCBhcmd1bWVudCwgaXQgd2lsbCByZW1vdmUgb25seVxuICAgICAqIGxpc3RlbmVycyBmb3IgdGhhdCBldmVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlIC0gdGhlIGV2ZW50IHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICAgICAqIEByZXR1cm5zIGB0aGlzYCB0byBlbmFibGUgeW91IHRvIGNoYWluIG1ldGhvZCBjYWxscy5cbiAgICAgKi9cbiAgICByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vZmYodHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpc1tkaXNwb3NlU3ltYm9sXSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICBmb3IgKGNvbnN0IFt0eXBlLCBoYW5kbGVyc10gb2YgdGhpcy4jaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2VtaXR0ZXIub2ZmKHR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2hhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50U3Vic2NyaXB0aW9uIHtcbiAgICAjdGFyZ2V0O1xuICAgICN0eXBlO1xuICAgICNoYW5kbGVyO1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgdHlwZSwgaGFuZGxlcikge1xuICAgICAgICB0aGlzLiN0YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLiNoYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgdGhpcy4jdGFyZ2V0Lm9uKHRoaXMuI3R5cGUsIHRoaXMuI2hhbmRsZXIpO1xuICAgIH1cbiAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgIHRoaXMuI3RhcmdldC5vZmYodGhpcy4jdHlwZSwgdGhpcy4jaGFuZGxlcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRFbWl0dGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG4vKipcbiAqIEZpbGUgY2hvb3NlcnMgbGV0IHlvdSByZWFjdCB0byB0aGUgcGFnZSByZXF1ZXN0aW5nIGZvciBhIGZpbGUuXG4gKlxuICogQHJlbWFya3NcbiAqIGBGaWxlQ2hvb3NlcmAgaW5zdGFuY2VzIGFyZSByZXR1cm5lZCB2aWEgdGhlIHtAbGluayBQYWdlLndhaXRGb3JGaWxlQ2hvb3Nlcn0gbWV0aG9kLlxuICpcbiAqIEluIGJyb3dzZXJzLCBvbmx5IG9uZSBmaWxlIGNob29zZXIgY2FuIGJlIG9wZW5lZCBhdCBhIHRpbWUuXG4gKiBBbGwgZmlsZSBjaG9vc2VycyBtdXN0IGJlIGFjY2VwdGVkIG9yIGNhbmNlbGVkLiBOb3QgZG9pbmcgc28gd2lsbCBwcmV2ZW50XG4gKiBzdWJzZXF1ZW50IGZpbGUgY2hvb3NlcnMgZnJvbSBhcHBlYXJpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgW2ZpbGVDaG9vc2VyXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAqICAgcGFnZS53YWl0Rm9yRmlsZUNob29zZXIoKSxcbiAqICAgcGFnZS5jbGljaygnI3VwbG9hZC1maWxlLWJ1dHRvbicpLCAvLyBzb21lIGJ1dHRvbiB0aGF0IHRyaWdnZXJzIGZpbGUgc2VsZWN0aW9uXG4gKiBdKTtcbiAqIGF3YWl0IGZpbGVDaG9vc2VyLmFjY2VwdChbJy90bXAvbXlmaWxlLnBkZiddKTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVDaG9vc2VyIHtcbiAgICAjZWxlbWVudDtcbiAgICAjbXVsdGlwbGU7XG4gICAgI2hhbmRsZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBldmVudCkge1xuICAgICAgICB0aGlzLiNlbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy4jbXVsdGlwbGUgPSBldmVudC5tb2RlICE9PSAnc2VsZWN0U2luZ2xlJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV2hldGhlciBmaWxlIGNob29zZXIgYWxsb3cgZm9yXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbnB1dC9maWxlI2F0dHItbXVsdGlwbGUgfCBtdWx0aXBsZX1cbiAgICAgKiBmaWxlIHNlbGVjdGlvbi5cbiAgICAgKi9cbiAgICBpc011bHRpcGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbXVsdGlwbGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjY2VwdCB0aGUgZmlsZSBjaG9vc2VyIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gZmlsZSBwYXRocy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzIFRoaXMgd2lsbCBub3QgdmFsaWRhdGUgd2hldGhlciB0aGUgZmlsZSBwYXRocyBleGlzdHMuIEFsc28sIGlmIGFcbiAgICAgKiBwYXRoIGlzIHJlbGF0aXZlLCB0aGVuIGl0IGlzIHJlc29sdmVkIGFnYWluc3QgdGhlXG4gICAgICoge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfcHJvY2Vzc19jd2QgfCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5fS5cbiAgICAgKiBGb3IgbG9jYWxzIHNjcmlwdCBjb25uZWN0aW5nIHRvIHJlbW90ZSBjaHJvbWUgZW52aXJvbm1lbnRzLCBwYXRocyBtdXN0IGJlXG4gICAgICogYWJzb2x1dGUuXG4gICAgICovXG4gICAgYXN5bmMgYWNjZXB0KHBhdGhzKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy4jaGFuZGxlZCwgJ0Nhbm5vdCBhY2NlcHQgRmlsZUNob29zZXIgd2hpY2ggaXMgYWxyZWFkeSBoYW5kbGVkIScpO1xuICAgICAgICB0aGlzLiNoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy4jZWxlbWVudC51cGxvYWRGaWxlKC4uLnBhdGhzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBmaWxlIGNob29zZXIgd2l0aG91dCBzZWxlY3RpbmcgYW55IGZpbGVzLlxuICAgICAqL1xuICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNoYW5kbGVkLCAnQ2Fubm90IGNhbmNlbCBGaWxlQ2hvb3NlciB3aGljaCBpcyBhbHJlYWR5IGhhbmRsZWQhJyk7XG4gICAgICAgIHRoaXMuI2hhbmRsZWQgPSB0cnVlO1xuICAgICAgICAvLyBYWFg6IFRoZXNlIGV2ZW50cyBzaG91bGQgY29udmVydGVkIHRvIHRydXN0ZWQgZXZlbnRzLiBQZXJoYXBzIGRvIHRoaXNcbiAgICAgICAgLy8gaW4gYERPTS5zZXRGaWxlSW5wdXRGaWxlc2A/XG4gICAgICAgIGF3YWl0IHRoaXMuI2VsZW1lbnQuZXZhbHVhdGUoZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjYW5jZWwnLCB7IGJ1YmJsZXM6IHRydWUgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaWxlQ2hvb3Nlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgQVJJQVF1ZXJ5SGFuZGxlciB9IGZyb20gJy4uL2NkcC9BcmlhUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IENTU1F1ZXJ5SGFuZGxlciB9IGZyb20gJy4vQ1NTUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IGN1c3RvbVF1ZXJ5SGFuZGxlcnMgfSBmcm9tICcuL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG5pbXBvcnQgeyBQaWVyY2VRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1BpZXJjZVF1ZXJ5SGFuZGxlci5qcyc7XG5pbXBvcnQgeyBQUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9QUXVlcnlIYW5kbGVyLmpzJztcbmltcG9ydCB7IHBhcnNlUFNlbGVjdG9ycyB9IGZyb20gJy4vUFNlbGVjdG9yUGFyc2VyLmpzJztcbmltcG9ydCB7IFRleHRRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1RleHRRdWVyeUhhbmRsZXIuanMnO1xuaW1wb3J0IHsgWFBhdGhRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1hQYXRoUXVlcnlIYW5kbGVyLmpzJztcbmNvbnN0IEJVSUxUSU5fUVVFUllfSEFORExFUlMgPSB7XG4gICAgYXJpYTogQVJJQVF1ZXJ5SGFuZGxlcixcbiAgICBwaWVyY2U6IFBpZXJjZVF1ZXJ5SGFuZGxlcixcbiAgICB4cGF0aDogWFBhdGhRdWVyeUhhbmRsZXIsXG4gICAgdGV4dDogVGV4dFF1ZXJ5SGFuZGxlcixcbn07XG5jb25zdCBRVUVSWV9TRVBBUkFUT1JTID0gWyc9JywgJy8nXTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRRdWVyeUhhbmRsZXJBbmRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGZvciAoY29uc3QgaGFuZGxlck1hcCBvZiBbXG4gICAgICAgIGN1c3RvbVF1ZXJ5SGFuZGxlcnMubmFtZXMoKS5tYXAobmFtZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gW25hbWUsIGN1c3RvbVF1ZXJ5SGFuZGxlcnMuZ2V0KG5hbWUpXTtcbiAgICAgICAgfSksXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKEJVSUxUSU5fUVVFUllfSEFORExFUlMpLFxuICAgIF0pIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgUXVlcnlIYW5kbGVyXSBvZiBoYW5kbGVyTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlcGFyYXRvciBvZiBRVUVSWV9TRVBBUkFUT1JTKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gYCR7bmFtZX0ke3NlcGFyYXRvcn1gO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb2xsaW5nOiBuYW1lID09PSAnYXJpYScgPyBcInJhZlwiIC8qIFBvbGxpbmdPcHRpb25zLlJBRiAqLyA6IFwibXV0YXRpb25cIiAvKiBQb2xsaW5nT3B0aW9ucy5NVVRBVElPTiAqLyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5SGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgW3BTZWxlY3RvciwgaXNQdXJlQ1NTLCBoYXNQc2V1ZG9DbGFzc2VzLCBoYXNBcmlhXSA9IHBhcnNlUFNlbGVjdG9ycyhzZWxlY3Rvcik7XG4gICAgICAgIGlmIChpc1B1cmVDU1MpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBwb2xsaW5nOiBoYXNQc2V1ZG9DbGFzc2VzXG4gICAgICAgICAgICAgICAgICAgID8gXCJyYWZcIiAvKiBQb2xsaW5nT3B0aW9ucy5SQUYgKi9cbiAgICAgICAgICAgICAgICAgICAgOiBcIm11dGF0aW9uXCIgLyogUG9sbGluZ09wdGlvbnMuTVVUQVRJT04gKi8sXG4gICAgICAgICAgICAgICAgUXVlcnlIYW5kbGVyOiBDU1NRdWVyeUhhbmRsZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1cGRhdGVkU2VsZWN0b3I6IEpTT04uc3RyaW5naWZ5KHBTZWxlY3RvciksXG4gICAgICAgICAgICBwb2xsaW5nOiBoYXNBcmlhID8gXCJyYWZcIiAvKiBQb2xsaW5nT3B0aW9ucy5SQUYgKi8gOiBcIm11dGF0aW9uXCIgLyogUG9sbGluZ09wdGlvbnMuTVVUQVRJT04gKi8sXG4gICAgICAgICAgICBRdWVyeUhhbmRsZXI6IFBRdWVyeUhhbmRsZXIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVwZGF0ZWRTZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICBwb2xsaW5nOiBcIm11dGF0aW9uXCIgLyogUG9sbGluZ09wdGlvbnMuTVVUQVRJT04gKi8sXG4gICAgICAgICAgICBRdWVyeUhhbmRsZXI6IENTU1F1ZXJ5SGFuZGxlcixcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HZXRRdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2ssIGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuY29uc3QgREVGQVVMVF9CQVRDSF9TSVpFID0gMjA7XG4vKipcbiAqIFRoaXMgd2lsbCB0cmFuc3Bvc2UgYW4gaXRlcmF0b3IgSlNIYW5kbGUgaW50byBhIGZhc3QsIFB1cHBldGVlci1zaWRlIGl0ZXJhdG9yXG4gKiBvZiBKU0hhbmRsZXMuXG4gKlxuICogQHBhcmFtIHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRyYW5zcG9zZS4gVGhpcyBzaG91bGQgYmUgc29tZXRoaW5nXG4gKiByZWFzb25hYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiogZmFzdFRyYW5zcG9zZUl0ZXJhdG9ySGFuZGxlKGl0ZXJhdG9yLCBzaXplKSB7XG4gICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMSwgYXdhaXQgaXRlcmF0b3IuZXZhbHVhdGVIYW5kbGUoYXN5bmMgKGl0ZXJhdG9yLCBzaXplKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgICAgICAgICB3aGlsZSAocmVzdWx0cy5sZW5ndGggPCBzaXplKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfSwgc2l6ZSksIGZhbHNlKTtcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IChhd2FpdCBhcnJheS5nZXRQcm9wZXJ0aWVzKCkpO1xuICAgICAgICBjb25zdCBoYW5kbGVzID0gcHJvcGVydGllcy52YWx1ZXMoKTtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMSwgbmV3IERpc3Bvc2FibGVTdGFjaygpLCBmYWxzZSk7XG4gICAgICAgIHN0YWNrLmRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlXzEgb2YgaGFuZGxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8yLCBoYW5kbGVfMSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVbZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgICAgICAgICBlbnZfMi5lcnJvciA9IGVfMjtcbiAgICAgICAgICAgICAgICAgICAgZW52XzIuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB5aWVsZCogaGFuZGxlcztcbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuc2l6ZSA9PT0gMDtcbiAgICB9XG4gICAgY2F0Y2ggKGVfMSkge1xuICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgZW52XzEuaGFzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8xKTtcbiAgICB9XG59XG4vKipcbiAqIFRoaXMgd2lsbCB0cmFuc3Bvc2UgYW4gaXRlcmF0b3IgSlNIYW5kbGUgaW4gYmF0Y2hlcyBiYXNlZCBvbiB0aGUgZGVmYXVsdCBzaXplXG4gKiBvZiB7QGxpbmsgZmFzdFRyYW5zcG9zZUl0ZXJhdG9ySGFuZGxlfS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24qIHRyYW5zcG9zZUl0ZXJhdG9ySGFuZGxlKGl0ZXJhdG9yKSB7XG4gICAgbGV0IHNpemUgPSBERUZBVUxUX0JBVENIX1NJWkU7XG4gICAgd2hpbGUgKCEoeWllbGQqIGZhc3RUcmFuc3Bvc2VJdGVyYXRvckhhbmRsZShpdGVyYXRvciwgc2l6ZSkpKSB7XG4gICAgICAgIHNpemUgPDw9IDE7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uKiB0cmFuc3Bvc2VJdGVyYWJsZUhhbmRsZShoYW5kbGUpIHtcbiAgICBjb25zdCBlbnZfMyA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBnZW5lcmF0b3JIYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfMywgYXdhaXQgaGFuZGxlLmV2YWx1YXRlSGFuZGxlKGl0ZXJhYmxlID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoYXN5bmMgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogaXRlcmFibGU7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9KSwgZmFsc2UpO1xuICAgICAgICB5aWVsZCogdHJhbnNwb3NlSXRlcmF0b3JIYW5kbGUoZ2VuZXJhdG9ySGFuZGxlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVfMykge1xuICAgICAgICBlbnZfMy5lcnJvciA9IGVfMztcbiAgICAgICAgZW52XzMuaGFzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgX19kaXNwb3NlUmVzb3VyY2VzKGVudl8zKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1IYW5kbGVJdGVyYXRvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIExhenlBcmcge1xuICAgIHN0YXRpYyBjcmVhdGUgPSAoZ2V0KSA9PiB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gaW50cm9kdWNlIExhenlBcmcgdG8gdGhlIHR5cGUgc3lzdGVtLCBvdGhlcndpc2Ugd2Ugd291bGRcbiAgICAgICAgLy8gaGF2ZSB0byBtYWtlIGl0IHB1YmxpYy5cbiAgICAgICAgcmV0dXJuIG5ldyBMYXp5QXJnKGdldCk7XG4gICAgfTtcbiAgICAjZ2V0O1xuICAgIGNvbnN0cnVjdG9yKGdldCkge1xuICAgICAgICB0aGlzLiNnZXQgPSBnZXQ7XG4gICAgfVxuICAgIGFzeW5jIGdldChjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLiNnZXQoY29udGV4dCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGF6eUFyZy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBXZSB1c2Ugc3ltYm9scyB0byBwcmV2ZW50IGFueSBleHRlcm5hbCBwYXJ0aWVzIGxpc3RlbmluZyB0byB0aGVzZSBldmVudHMuXG4gKiBUaGV5IGFyZSBpbnRlcm5hbCB0byBQdXBwZXRlZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgdmFyIE5ldHdvcmtNYW5hZ2VyRXZlbnQ7XG4oZnVuY3Rpb24gKE5ldHdvcmtNYW5hZ2VyRXZlbnQpIHtcbiAgICBOZXR3b3JrTWFuYWdlckV2ZW50LlJlcXVlc3QgPSBTeW1ib2woJ05ldHdvcmtNYW5hZ2VyLlJlcXVlc3QnKTtcbiAgICBOZXR3b3JrTWFuYWdlckV2ZW50LlJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUgPSBTeW1ib2woJ05ldHdvcmtNYW5hZ2VyLlJlcXVlc3RTZXJ2ZWRGcm9tQ2FjaGUnKTtcbiAgICBOZXR3b3JrTWFuYWdlckV2ZW50LlJlc3BvbnNlID0gU3ltYm9sKCdOZXR3b3JrTWFuYWdlci5SZXNwb25zZScpO1xuICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdEZhaWxlZCA9IFN5bWJvbCgnTmV0d29ya01hbmFnZXIuUmVxdWVzdEZhaWxlZCcpO1xuICAgIE5ldHdvcmtNYW5hZ2VyRXZlbnQuUmVxdWVzdEZpbmlzaGVkID0gU3ltYm9sKCdOZXR3b3JrTWFuYWdlci5SZXF1ZXN0RmluaXNoZWQnKTtcbn0pKE5ldHdvcmtNYW5hZ2VyRXZlbnQgfHwgKE5ldHdvcmtNYW5hZ2VyRXZlbnQgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TmV0d29ya01hbmFnZXJFdmVudHMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBwYXBlckZvcm1hdHMgPSB7XG4gICAgbGV0dGVyOiB7IHdpZHRoOiA4LjUsIGhlaWdodDogMTEgfSxcbiAgICBsZWdhbDogeyB3aWR0aDogOC41LCBoZWlnaHQ6IDE0IH0sXG4gICAgdGFibG9pZDogeyB3aWR0aDogMTEsIGhlaWdodDogMTcgfSxcbiAgICBsZWRnZXI6IHsgd2lkdGg6IDE3LCBoZWlnaHQ6IDExIH0sXG4gICAgYTA6IHsgd2lkdGg6IDMzLjEsIGhlaWdodDogNDYuOCB9LFxuICAgIGExOiB7IHdpZHRoOiAyMy40LCBoZWlnaHQ6IDMzLjEgfSxcbiAgICBhMjogeyB3aWR0aDogMTYuNTQsIGhlaWdodDogMjMuNCB9LFxuICAgIGEzOiB7IHdpZHRoOiAxMS43LCBoZWlnaHQ6IDE2LjU0IH0sXG4gICAgYTQ6IHsgd2lkdGg6IDguMjcsIGhlaWdodDogMTEuNyB9LFxuICAgIGE1OiB7IHdpZHRoOiA1LjgzLCBoZWlnaHQ6IDguMjcgfSxcbiAgICBhNjogeyB3aWR0aDogNC4xMywgaGVpZ2h0OiA1LjgzIH0sXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UERGT3B0aW9ucy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyLCB9IGZyb20gJy4vUXVlcnlIYW5kbGVyLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBQUXVlcnlIYW5kbGVyIGV4dGVuZHMgUXVlcnlIYW5kbGVyIHtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvckFsbCA9IChlbGVtZW50LCBzZWxlY3RvciwgeyBwUXVlcnlTZWxlY3RvckFsbCB9KSA9PiB7XG4gICAgICAgIHJldHVybiBwUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvciA9IChlbGVtZW50LCBzZWxlY3RvciwgeyBwUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBwUXVlcnlTZWxlY3RvcihlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBRdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IHRva2VuaXplLCBUT0tFTlMsIHN0cmluZ2lmeSwgfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9wYXJzZWwtanMvcGFyc2VsLWpzLmpzJztcblRPS0VOU1snbmVzdGluZyddID0gLyYvZztcblRPS0VOU1snY29tYmluYXRvciddID0gL1xccyooPj4+Pj98W1xccz4rfl0pXFxzKi9nO1xuY29uc3QgRVNDQVBFX1JFR0VYUCA9IC9cXFxcW1xcc1xcU10vZztcbmNvbnN0IHVucXVvdGUgPSAodGV4dCkgPT4ge1xuICAgIGlmICh0ZXh0Lmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBpZiAoKHRleHRbMF0gPT09ICdcIicgfHwgdGV4dFswXSA9PT0gXCInXCIpICYmIHRleHQuZW5kc1dpdGgodGV4dFswXSkpIHtcbiAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMSwgLTEpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dC5yZXBsYWNlKEVTQ0FQRV9SRUdFWFAsIG1hdGNoID0+IHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdO1xuICAgIH0pO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBTZWxlY3RvcnMoc2VsZWN0b3IpIHtcbiAgICBsZXQgaXNQdXJlQ1NTID0gdHJ1ZTtcbiAgICBsZXQgaGFzQXJpYSA9IGZhbHNlO1xuICAgIGxldCBoYXNQc2V1ZG9DbGFzc2VzID0gZmFsc2U7XG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemUoc2VsZWN0b3IpO1xuICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbW10sIGlzUHVyZUNTUywgaGFzUHNldWRvQ2xhc3NlcywgZmFsc2VdO1xuICAgIH1cbiAgICBsZXQgY29tcG91bmRTZWxlY3RvciA9IFtdO1xuICAgIGxldCBjb21wbGV4U2VsZWN0b3IgPSBbY29tcG91bmRTZWxlY3Rvcl07XG4gICAgY29uc3Qgc2VsZWN0b3JzID0gW2NvbXBsZXhTZWxlY3Rvcl07XG4gICAgY29uc3Qgc3RvcmFnZSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY29tYmluYXRvcic6XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbi5jb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCI+Pj5cIiAvKiBQQ29tYmluYXRvci5EZXNjZW5kZW50ICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQdXJlQ1NTID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3VuZFNlbGVjdG9yLnB1c2goc3RyaW5naWZ5KHN0b3JhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNwbGljZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kU2VsZWN0b3IgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZWxlY3Rvci5wdXNoKFwiPj4+XCIgLyogUENvbWJpbmF0b3IuRGVzY2VuZGVudCAqLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4U2VsZWN0b3IucHVzaChjb21wb3VuZFNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiPj4+PlwiIC8qIFBDb21iaW5hdG9yLkNoaWxkICovOlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQdXJlQ1NTID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3VuZFNlbGVjdG9yLnB1c2goc3RyaW5naWZ5KHN0b3JhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNwbGljZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kU2VsZWN0b3IgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZWxlY3Rvci5wdXNoKFwiPj4+PlwiIC8qIFBDb21iaW5hdG9yLkNoaWxkICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZWxlY3Rvci5wdXNoKGNvbXBvdW5kU2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHNldWRvLWVsZW1lbnQnOlxuICAgICAgICAgICAgICAgIGlmICghdG9rZW4ubmFtZS5zdGFydHNXaXRoKCctcC0nKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNQdXJlQ1NTID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHN0b3JhZ2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvdW5kU2VsZWN0b3IucHVzaChzdHJpbmdpZnkoc3RvcmFnZSkpO1xuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLnNwbGljZSgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRva2VuLm5hbWUuc2xpY2UoMyk7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdhcmlhJykge1xuICAgICAgICAgICAgICAgICAgICBoYXNBcmlhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcG91bmRTZWxlY3Rvci5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVucXVvdGUodG9rZW4uYXJndW1lbnQgPz8gJycpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgY2FzZSAncHNldWRvLWNsYXNzJzpcbiAgICAgICAgICAgICAgICBoYXNQc2V1ZG9DbGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgICAgICBpZiAoc3RvcmFnZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG91bmRTZWxlY3Rvci5wdXNoKHN0cmluZ2lmeShzdG9yYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2Uuc3BsaWNlKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wb3VuZFNlbGVjdG9yID0gW107XG4gICAgICAgICAgICAgICAgY29tcGxleFNlbGVjdG9yID0gW2NvbXBvdW5kU2VsZWN0b3JdO1xuICAgICAgICAgICAgICAgIHNlbGVjdG9ycy5wdXNoKGNvbXBsZXhTZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmFnZS5wdXNoKHRva2VuKTtcbiAgICB9XG4gICAgaWYgKHN0b3JhZ2UubGVuZ3RoKSB7XG4gICAgICAgIGNvbXBvdW5kU2VsZWN0b3IucHVzaChzdHJpbmdpZnkoc3RvcmFnZSkpO1xuICAgIH1cbiAgICByZXR1cm4gW3NlbGVjdG9ycywgaXNQdXJlQ1NTLCBoYXNQc2V1ZG9DbGFzc2VzLCBoYXNBcmlhXTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBTZWxlY3RvclBhcnNlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyIH0gZnJvbSAnLi9RdWVyeUhhbmRsZXIuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBpZXJjZVF1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3IgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgcGllcmNlUXVlcnlTZWxlY3RvciB9KSA9PiB7XG4gICAgICAgIHJldHVybiBwaWVyY2VRdWVyeVNlbGVjdG9yKGVsZW1lbnQsIHNlbGVjdG9yKTtcbiAgICB9O1xuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yQWxsID0gKGVsZW1lbnQsIHNlbGVjdG9yLCB7IHBpZXJjZVF1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICByZXR1cm4gcGllcmNlUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBpZXJjZVF1ZXJ5SGFuZGxlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0IHt9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvZHVjdC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgX2Nvbm5lY3RUb0Jyb3dzZXIgfSBmcm9tICcuL0Jyb3dzZXJDb25uZWN0b3IuanMnO1xuaW1wb3J0IHsgY3VzdG9tUXVlcnlIYW5kbGVycywgfSBmcm9tICcuL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG4vKipcbiAqIFRoZSBtYWluIFB1cHBldGVlciBjbGFzcy5cbiAqXG4gKiBJTVBPUlRBTlQ6IGlmIHlvdSBhcmUgdXNpbmcgUHVwcGV0ZWVyIGluIGEgTm9kZSBlbnZpcm9ubWVudCwgeW91IHdpbGwgZ2V0IGFuXG4gKiBpbnN0YW5jZSBvZiB7QGxpbmsgUHVwcGV0ZWVyTm9kZX0gd2hlbiB5b3UgaW1wb3J0IG9yIHJlcXVpcmUgYHB1cHBldGVlcmAuXG4gKiBUaGF0IGNsYXNzIGV4dGVuZHMgYFB1cHBldGVlcmAsIHNvIGhhcyBhbGwgdGhlIG1ldGhvZHMgZG9jdW1lbnRlZCBiZWxvdyBhc1xuICogd2VsbCBhcyBhbGwgdGhhdCBhcmUgZGVmaW5lZCBvbiB7QGxpbmsgUHVwcGV0ZWVyTm9kZX0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUHVwcGV0ZWVyIHtcbiAgICAvKipcbiAgICAgKiBPcGVyYXRpb25zIGZvciB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJzfS4gU2VlXG4gICAgICoge0BsaW5rIEN1c3RvbVF1ZXJ5SGFuZGxlclJlZ2lzdHJ5fS5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHN0YXRpYyBjdXN0b21RdWVyeUhhbmRsZXJzID0gY3VzdG9tUXVlcnlIYW5kbGVycztcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBZnRlciByZWdpc3RyYXRpb24sIHRoZSBoYW5kbGVyIGNhbiBiZSB1c2VkIGV2ZXJ5d2hlcmUgd2hlcmUgYSBzZWxlY3RvciBpc1xuICAgICAqIGV4cGVjdGVkIGJ5IHByZXBlbmRpbmcgdGhlIHNlbGVjdGlvbiBzdHJpbmcgd2l0aCBgPG5hbWU+L2AuIFRoZSBuYW1lIGlzIG9ubHlcbiAgICAgKiBhbGxvd2VkIHRvIGNvbnNpc3Qgb2YgbG93ZXItIGFuZCB1cHBlciBjYXNlIGxhdGluIGxldHRlcnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogcHVwcGV0ZWVyLnJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyKCd0ZXh0JywgeyDigKYgfSk7XG4gICAgICogY29uc3QgYUhhbmRsZSA9IGF3YWl0IHBhZ2UuJCgndGV4dC/igKYnKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgdGhhdCB0aGUgY3VzdG9tIHF1ZXJ5IGhhbmRsZXIgd2lsbCBiZSByZWdpc3RlcmVkXG4gICAgICogdW5kZXIuXG4gICAgICogQHBhcmFtIHF1ZXJ5SGFuZGxlciAtIFRoZSB7QGxpbmsgQ3VzdG9tUXVlcnlIYW5kbGVyIHwgY3VzdG9tIHF1ZXJ5IGhhbmRsZXJ9XG4gICAgICogdG8gcmVnaXN0ZXIuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgc3RhdGljIHJlZ2lzdGVyQ3VzdG9tUXVlcnlIYW5kbGVyKG5hbWUsIHF1ZXJ5SGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21RdWVyeUhhbmRsZXJzLnJlZ2lzdGVyKG5hbWUsIHF1ZXJ5SGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIHF1ZXJ5IGhhbmRsZXIgZm9yIGEgZ2l2ZW4gbmFtZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdW5yZWdpc3RlckN1c3RvbVF1ZXJ5SGFuZGxlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVF1ZXJ5SGFuZGxlcnMudW5yZWdpc3RlcihuYW1lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIGN1c3RvbSBxdWVyeSBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3VzdG9tUXVlcnlIYW5kbGVyTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVF1ZXJ5SGFuZGxlcnMubmFtZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgYWxsIGN1c3RvbSBxdWVyeSBoYW5kbGVycy5cbiAgICAgKi9cbiAgICBzdGF0aWMgY2xlYXJDdXN0b21RdWVyeUhhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21RdWVyeUhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIF9pc1B1cHBldGVlckNvcmU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgX2NoYW5nZWRQcm9kdWN0ID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5faXNQdXBwZXRlZXJDb3JlID0gc2V0dGluZ3MuaXNQdXBwZXRlZXJDb3JlO1xuICAgICAgICB0aGlzLmNvbm5lY3QgPSB0aGlzLmNvbm5lY3QuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgYXR0YWNoZXMgUHVwcGV0ZWVyIHRvIGFuIGV4aXN0aW5nIGJyb3dzZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBTZXQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMgdG8gc2V0IG9uIHRoZSBicm93c2VyLlxuICAgICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gYnJvd3NlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBjb25uZWN0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9jb25uZWN0VG9Ccm93c2VyKG9wdGlvbnMpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVB1cHBldGVlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xudmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlID0gKHRoaXMgJiYgdGhpcy5fX2FkZERpc3Bvc2FibGVSZXNvdXJjZSkgfHwgZnVuY3Rpb24gKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgICAgIHZhciBkaXNwb3NlO1xuICAgICAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufTtcbnZhciBfX2Rpc3Bvc2VSZXNvdXJjZXMgPSAodGhpcyAmJiB0aGlzLl9fZGlzcG9zZVJlc291cmNlcykgfHwgKGZ1bmN0aW9uIChTdXBwcmVzc2VkRXJyb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudikge1xuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICAgICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBTdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgICAgICAgICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZhaWwoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbn0pKHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59KTtcbmltcG9ydCB7IF9pc0VsZW1lbnRIYW5kbGUgfSBmcm9tICcuLi9hcGkvRWxlbWVudEhhbmRsZVN5bWJvbC5qcyc7XG5pbXBvcnQgeyBpc0Vycm9yTGlrZSB9IGZyb20gJy4uL3V0aWwvRXJyb3JMaWtlLmpzJztcbmltcG9ydCB7IGludGVycG9sYXRlRnVuY3Rpb24sIHN0cmluZ2lmeUZ1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbC9GdW5jdGlvbi5qcyc7XG5pbXBvcnQgeyB0cmFuc3Bvc2VJdGVyYWJsZUhhbmRsZSB9IGZyb20gJy4vSGFuZGxlSXRlcmF0b3IuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4vTGF6eUFyZy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgUXVlcnlIYW5kbGVyIHtcbiAgICAvLyBFaXRoZXIgb25lIG9mIHRoZXNlIG1heSBiZSBpbXBsZW1lbnRlZCwgYnV0IGF0IGxlYXN0IG9uZSBtdXN0IGJlLlxuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yQWxsO1xuICAgIHN0YXRpYyBxdWVyeVNlbGVjdG9yO1xuICAgIHN0YXRpYyBnZXQgX3F1ZXJ5U2VsZWN0b3IoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5U2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBkZWZhdWx0IGBxdWVyeVNlbGVjdG9yYC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMucXVlcnlTZWxlY3RvciA9IGludGVycG9sYXRlRnVuY3Rpb24oYXN5bmMgKG5vZGUsIHNlbGVjdG9yLCBQdXBwZXRlZXJVdGlsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVNlbGVjdG9yQWxsID0gUExBQ0VIT0xERVIoJ3F1ZXJ5U2VsZWN0b3JBbGwnKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBxdWVyeVNlbGVjdG9yQWxsKG5vZGUsIHNlbGVjdG9yLCBQdXBwZXRlZXJVdGlsKTtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHF1ZXJ5U2VsZWN0b3JBbGw6IHN0cmluZ2lmeUZ1bmN0aW9uKHRoaXMucXVlcnlTZWxlY3RvckFsbCksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBfcXVlcnlTZWxlY3RvckFsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucXVlcnlTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGRlZmF1bHQgYHF1ZXJ5U2VsZWN0b3JBbGxgLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodGhpcy5xdWVyeVNlbGVjdG9yQWxsID0gaW50ZXJwb2xhdGVGdW5jdGlvbihhc3luYyBmdW5jdGlvbiogKG5vZGUsIHNlbGVjdG9yLCBQdXBwZXRlZXJVdGlsKSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeVNlbGVjdG9yID0gUExBQ0VIT0xERVIoJ3F1ZXJ5U2VsZWN0b3InKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5U2VsZWN0b3Iobm9kZSwgc2VsZWN0b3IsIFB1cHBldGVlclV0aWwpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAgcXVlcnlTZWxlY3Rvcjogc3RyaW5naWZ5RnVuY3Rpb24odGhpcy5xdWVyeVNlbGVjdG9yKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIGZvciBtdWx0aXBsZSBub2RlcyBnaXZlbiBhIHNlbGVjdG9yIGFuZCB7QGxpbmsgRWxlbWVudEhhbmRsZX0uXG4gICAgICpcbiAgICAgKiBBa2luIHRvIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvcXVlcnlTZWxlY3RvckFsbCB8IERvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoKX0uXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jICpxdWVyeUFsbChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgICBjb25zdCBlbnZfMSA9IHsgc3RhY2s6IFtdLCBlcnJvcjogdm9pZCAwLCBoYXNFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBhd2FpdCBlbGVtZW50LmV2YWx1YXRlSGFuZGxlKHRoaXMuX3F1ZXJ5U2VsZWN0b3JBbGwsIHNlbGVjdG9yLCBMYXp5QXJnLmNyZWF0ZShjb250ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgfSkpLCBmYWxzZSk7XG4gICAgICAgICAgICB5aWVsZCogdHJhbnNwb3NlSXRlcmFibGVIYW5kbGUoaGFuZGxlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xKSB7XG4gICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgIGVudl8xLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUXVlcmllcyBmb3IgYSBzaW5nbGUgbm9kZSBnaXZlbiBhIHNlbGVjdG9yIGFuZCB7QGxpbmsgRWxlbWVudEhhbmRsZX0uXG4gICAgICpcbiAgICAgKiBBa2luIHRvIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvcXVlcnlTZWxlY3Rvcn0uXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHF1ZXJ5T25lKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgICAgIGNvbnN0IGVudl8yID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52XzIsIGF3YWl0IGVsZW1lbnQuZXZhbHVhdGVIYW5kbGUodGhpcy5fcXVlcnlTZWxlY3Rvciwgc2VsZWN0b3IsIExhenlBcmcuY3JlYXRlKGNvbnRleHQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnB1cHBldGVlclV0aWw7XG4gICAgICAgICAgICB9KSksIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghKF9pc0VsZW1lbnRIYW5kbGUgaW4gcmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMikge1xuICAgICAgICAgICAgZW52XzIuZXJyb3IgPSBlXzI7XG4gICAgICAgICAgICBlbnZfMi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52XzIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdhaXRzIHVudGlsIGEgc2luZ2xlIG5vZGUgYXBwZWFycyBmb3IgYSBnaXZlbiBzZWxlY3RvciBhbmRcbiAgICAgKiB7QGxpbmsgRWxlbWVudEhhbmRsZX0uXG4gICAgICpcbiAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIHF1ZXJ5IHRoZSBoYW5kbGUgaW4gdGhlIFB1cHBldGVlciB3b3JsZCBhbmQgbWlncmF0ZSB0aGVcbiAgICAgKiByZXN1bHQgdG8gdGhlIG1haW4gd29ybGQuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIHdhaXRGb3IoZWxlbWVudE9yRnJhbWUsIHNlbGVjdG9yLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGVudl8zID0geyBzdGFjazogW10sIGVycm9yOiB2b2lkIDAsIGhhc0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGZyYW1lO1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8zLCBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKF9pc0VsZW1lbnRIYW5kbGUgaW4gZWxlbWVudE9yRnJhbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyYW1lID0gZWxlbWVudE9yRnJhbWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZnJhbWUgPSBlbGVtZW50T3JGcmFtZS5mcmFtZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZnJhbWUuaXNvbGF0ZWRSZWFsbSgpLmFkb3B0SGFuZGxlKGVsZW1lbnRPckZyYW1lKTtcbiAgICAgICAgICAgIH0pKCksIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmlzaWJsZSA9IGZhbHNlLCBoaWRkZW4gPSBmYWxzZSwgdGltZW91dCwgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgcG9sbGluZyA9IG9wdGlvbnMucG9sbGluZyA/P1xuICAgICAgICAgICAgICAgICh2aXNpYmxlIHx8IGhpZGRlbiA/IFwicmFmXCIgLyogUG9sbGluZ09wdGlvbnMuUkFGICovIDogXCJtdXRhdGlvblwiIC8qIFBvbGxpbmdPcHRpb25zLk1VVEFUSU9OICovKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52XzQgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnZfNCwgYXdhaXQgZnJhbWUuaXNvbGF0ZWRSZWFsbSgpLndhaXRGb3JGdW5jdGlvbihhc3luYyAoUHVwcGV0ZWVyVXRpbCwgcXVlcnksIHNlbGVjdG9yLCByb290LCB2aXNpYmxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeVNlbGVjdG9yID0gUHVwcGV0ZWVyVXRpbC5jcmVhdGVGdW5jdGlvbihxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gYXdhaXQgcXVlcnlTZWxlY3Rvcihyb290ID8/IGRvY3VtZW50LCBzZWxlY3RvciwgUHVwcGV0ZWVyVXRpbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHVwcGV0ZWVyVXRpbC5jaGVja1Zpc2liaWxpdHkobm9kZSwgdmlzaWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvbGxpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICByb290OiBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgfSwgTGF6eUFyZy5jcmVhdGUoY29udGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgICAgICAgICB9KSwgc3RyaW5naWZ5RnVuY3Rpb24odGhpcy5fcXVlcnlTZWxlY3RvciksIHNlbGVjdG9yLCBlbGVtZW50LCB2aXNpYmxlID8gdHJ1ZSA6IGhpZGRlbiA/IGZhbHNlIDogdW5kZWZpbmVkKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzaWduYWwucmVhc29uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghKF9pc0VsZW1lbnRIYW5kbGUgaW4gaGFuZGxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZyYW1lLm1haW5SZWFsbSgpLnRyYW5zZmVySGFuZGxlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzMpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52XzQuZXJyb3IgPSBlXzM7XG4gICAgICAgICAgICAgICAgICAgIGVudl80Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfNCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0Vycm9yTGlrZShlcnJvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPSBgV2FpdGluZyBmb3Igc2VsZWN0b3IgXFxgJHtzZWxlY3Rvcn1cXGAgZmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV80KSB7XG4gICAgICAgICAgICBlbnZfMy5lcnJvciA9IGVfNDtcbiAgICAgICAgICAgIGVudl8zLmhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1RdWVyeUhhbmRsZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjQgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IHNvdXJjZSBhcyBpbmplY3RlZFNvdXJjZSB9IGZyb20gJy4uL2dlbmVyYXRlZC9pbmplY3RlZC5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgU2NyaXB0SW5qZWN0b3Ige1xuICAgICN1cGRhdGVkID0gZmFsc2U7XG4gICAgI2FtZW5kbWVudHMgPSBuZXcgU2V0KCk7XG4gICAgLy8gQXBwZW5kcyBhIHN0YXRlbWVudCBvZiB0aGUgZm9ybSBgKFB1cHBldGVlclV0aWwpID0+IHsuLi59YC5cbiAgICBhcHBlbmQoc3RhdGVtZW50KSB7XG4gICAgICAgIHRoaXMuI3VwZGF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNhbWVuZG1lbnRzLmFkZChzdGF0ZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9wKHN0YXRlbWVudCkge1xuICAgICAgICB0aGlzLiN1cGRhdGUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4jYW1lbmRtZW50cy5kZWxldGUoc3RhdGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGluamVjdChpbmplY3QsIGZvcmNlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRoaXMuI3VwZGF0ZWQgfHwgZm9yY2UpIHtcbiAgICAgICAgICAgIGluamVjdCh0aGlzLiNnZXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jdXBkYXRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAjdXBkYXRlKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuI3VwZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICAjZ2V0KCkge1xuICAgICAgICByZXR1cm4gYCgoKSA9PiB7XG4gICAgICBjb25zdCBtb2R1bGUgPSB7fTtcbiAgICAgICR7aW5qZWN0ZWRTb3VyY2V9XG4gICAgICAke1suLi50aGlzLiNhbWVuZG1lbnRzXVxuICAgICAgICAgICAgLm1hcChzdGF0ZW1lbnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAoJHtzdGF0ZW1lbnR9KShtb2R1bGUuZXhwb3J0cy5kZWZhdWx0KTtgO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJycpfVxuICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzLmRlZmF1bHQ7XG4gICAgfSkoKWA7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHNjcmlwdEluamVjdG9yID0gbmV3IFNjcmlwdEluamVjdG9yKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY3JpcHRJbmplY3Rvci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBUaGUgU2VjdXJpdHlEZXRhaWxzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHNlY3VyaXR5IGRldGFpbHMgb2YgYVxuICogcmVzcG9uc2UgdGhhdCB3YXMgcmVjZWl2ZWQgb3ZlciBhIHNlY3VyZSBjb25uZWN0aW9uLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFNlY3VyaXR5RGV0YWlscyB7XG4gICAgI3N1YmplY3ROYW1lO1xuICAgICNpc3N1ZXI7XG4gICAgI3ZhbGlkRnJvbTtcbiAgICAjdmFsaWRUbztcbiAgICAjcHJvdG9jb2w7XG4gICAgI3Nhbkxpc3Q7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2VjdXJpdHlQYXlsb2FkKSB7XG4gICAgICAgIHRoaXMuI3N1YmplY3ROYW1lID0gc2VjdXJpdHlQYXlsb2FkLnN1YmplY3ROYW1lO1xuICAgICAgICB0aGlzLiNpc3N1ZXIgPSBzZWN1cml0eVBheWxvYWQuaXNzdWVyO1xuICAgICAgICB0aGlzLiN2YWxpZEZyb20gPSBzZWN1cml0eVBheWxvYWQudmFsaWRGcm9tO1xuICAgICAgICB0aGlzLiN2YWxpZFRvID0gc2VjdXJpdHlQYXlsb2FkLnZhbGlkVG87XG4gICAgICAgIHRoaXMuI3Byb3RvY29sID0gc2VjdXJpdHlQYXlsb2FkLnByb3RvY29sO1xuICAgICAgICB0aGlzLiNzYW5MaXN0ID0gc2VjdXJpdHlQYXlsb2FkLnNhbkxpc3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpc3N1ZXIgb2YgdGhlIGNlcnRpZmljYXRlLlxuICAgICAqL1xuICAgIGlzc3VlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzc3VlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfdGltZSB8IFVuaXggdGltZXN0YW1wfVxuICAgICAqIG1hcmtpbmcgdGhlIHN0YXJ0IG9mIHRoZSBjZXJ0aWZpY2F0ZSdzIHZhbGlkaXR5LlxuICAgICAqL1xuICAgIHZhbGlkRnJvbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3ZhbGlkRnJvbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfdGltZSB8IFVuaXggdGltZXN0YW1wfVxuICAgICAqIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgY2VydGlmaWNhdGUncyB2YWxpZGl0eS5cbiAgICAgKi9cbiAgICB2YWxpZFRvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdmFsaWRUbztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHByb3RvY29sIGJlaW5nIHVzZWQsIGUuZy4gXCJUTFMgMS4yXCIuXG4gICAgICovXG4gICAgcHJvdG9jb2woKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm90b2NvbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QgdG8gd2hpY2ggdGhlIGNlcnRpZmljYXRlIHdhcyBpc3N1ZWQuXG4gICAgICovXG4gICAgc3ViamVjdE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdWJqZWN0TmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2Yge0BsaW5rIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1N1YmplY3RfQWx0ZXJuYXRpdmVfTmFtZSB8IHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZXMgKFNBTnMpfSBvZiB0aGUgY2VydGlmaWNhdGUuXG4gICAgICovXG4gICAgc3ViamVjdEFsdGVybmF0aXZlTmFtZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzYW5MaXN0O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNlY3VyaXR5RGV0YWlscy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tRdWV1ZSB7XG4gICAgI2NoYWluO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLiNjaGFpbiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBwb3N0VGFzayh0YXNrKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuI2NoYWluLnRoZW4odGFzayk7XG4gICAgICAgIHRoaXMuI2NoYWluID0gcmVzdWx0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGFza1F1ZXVlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBRdWVyeUhhbmRsZXIgfSBmcm9tICcuL1F1ZXJ5SGFuZGxlci5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgVGV4dFF1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JBbGwgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgdGV4dFF1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICByZXR1cm4gdGV4dFF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UZXh0UXVlcnlIYW5kbGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSAzMDAwMDtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lb3V0U2V0dGluZ3Mge1xuICAgICNkZWZhdWx0VGltZW91dDtcbiAgICAjZGVmYXVsdE5hdmlnYXRpb25UaW1lb3V0O1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0VGltZW91dCA9IG51bGw7XG4gICAgICAgIHRoaXMuI2RlZmF1bHROYXZpZ2F0aW9uVGltZW91dCA9IG51bGw7XG4gICAgfVxuICAgIHNldERlZmF1bHRUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy4jZGVmYXVsdFRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIH1cbiAgICBzZXREZWZhdWx0TmF2aWdhdGlvblRpbWVvdXQodGltZW91dCkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0TmF2aWdhdGlvblRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIH1cbiAgICBuYXZpZ2F0aW9uVGltZW91dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RlZmF1bHROYXZpZ2F0aW9uVGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2RlZmF1bHROYXZpZ2F0aW9uVGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jZGVmYXVsdFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0VGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gREVGQVVMVF9USU1FT1VUO1xuICAgIH1cbiAgICB0aW1lb3V0KCkge1xuICAgICAgICBpZiAodGhpcy4jZGVmYXVsdFRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkZWZhdWx0VGltZW91dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gREVGQVVMVF9USU1FT1VUO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRpbWVvdXRTZXR0aW5ncy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IF9rZXlEZWZpbml0aW9ucyA9IHtcbiAgICAnMCc6IHsga2V5Q29kZTogNDgsIGtleTogJzAnLCBjb2RlOiAnRGlnaXQwJyB9LFxuICAgICcxJzogeyBrZXlDb2RlOiA0OSwga2V5OiAnMScsIGNvZGU6ICdEaWdpdDEnIH0sXG4gICAgJzInOiB7IGtleUNvZGU6IDUwLCBrZXk6ICcyJywgY29kZTogJ0RpZ2l0MicgfSxcbiAgICAnMyc6IHsga2V5Q29kZTogNTEsIGtleTogJzMnLCBjb2RlOiAnRGlnaXQzJyB9LFxuICAgICc0JzogeyBrZXlDb2RlOiA1Miwga2V5OiAnNCcsIGNvZGU6ICdEaWdpdDQnIH0sXG4gICAgJzUnOiB7IGtleUNvZGU6IDUzLCBrZXk6ICc1JywgY29kZTogJ0RpZ2l0NScgfSxcbiAgICAnNic6IHsga2V5Q29kZTogNTQsIGtleTogJzYnLCBjb2RlOiAnRGlnaXQ2JyB9LFxuICAgICc3JzogeyBrZXlDb2RlOiA1NSwga2V5OiAnNycsIGNvZGU6ICdEaWdpdDcnIH0sXG4gICAgJzgnOiB7IGtleUNvZGU6IDU2LCBrZXk6ICc4JywgY29kZTogJ0RpZ2l0OCcgfSxcbiAgICAnOSc6IHsga2V5Q29kZTogNTcsIGtleTogJzknLCBjb2RlOiAnRGlnaXQ5JyB9LFxuICAgIFBvd2VyOiB7IGtleTogJ1Bvd2VyJywgY29kZTogJ1Bvd2VyJyB9LFxuICAgIEVqZWN0OiB7IGtleTogJ0VqZWN0JywgY29kZTogJ0VqZWN0JyB9LFxuICAgIEFib3J0OiB7IGtleUNvZGU6IDMsIGNvZGU6ICdBYm9ydCcsIGtleTogJ0NhbmNlbCcgfSxcbiAgICBIZWxwOiB7IGtleUNvZGU6IDYsIGNvZGU6ICdIZWxwJywga2V5OiAnSGVscCcgfSxcbiAgICBCYWNrc3BhY2U6IHsga2V5Q29kZTogOCwgY29kZTogJ0JhY2tzcGFjZScsIGtleTogJ0JhY2tzcGFjZScgfSxcbiAgICBUYWI6IHsga2V5Q29kZTogOSwgY29kZTogJ1RhYicsIGtleTogJ1RhYicgfSxcbiAgICBOdW1wYWQ1OiB7XG4gICAgICAgIGtleUNvZGU6IDEyLFxuICAgICAgICBzaGlmdEtleUNvZGU6IDEwMSxcbiAgICAgICAga2V5OiAnQ2xlYXInLFxuICAgICAgICBjb2RlOiAnTnVtcGFkNScsXG4gICAgICAgIHNoaWZ0S2V5OiAnNScsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkRW50ZXI6IHtcbiAgICAgICAga2V5Q29kZTogMTMsXG4gICAgICAgIGNvZGU6ICdOdW1wYWRFbnRlcicsXG4gICAgICAgIGtleTogJ0VudGVyJyxcbiAgICAgICAgdGV4dDogJ1xccicsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgRW50ZXI6IHsga2V5Q29kZTogMTMsIGNvZGU6ICdFbnRlcicsIGtleTogJ0VudGVyJywgdGV4dDogJ1xccicgfSxcbiAgICAnXFxyJzogeyBrZXlDb2RlOiAxMywgY29kZTogJ0VudGVyJywga2V5OiAnRW50ZXInLCB0ZXh0OiAnXFxyJyB9LFxuICAgICdcXG4nOiB7IGtleUNvZGU6IDEzLCBjb2RlOiAnRW50ZXInLCBrZXk6ICdFbnRlcicsIHRleHQ6ICdcXHInIH0sXG4gICAgU2hpZnRMZWZ0OiB7IGtleUNvZGU6IDE2LCBjb2RlOiAnU2hpZnRMZWZ0Jywga2V5OiAnU2hpZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIFNoaWZ0UmlnaHQ6IHsga2V5Q29kZTogMTYsIGNvZGU6ICdTaGlmdFJpZ2h0Jywga2V5OiAnU2hpZnQnLCBsb2NhdGlvbjogMiB9LFxuICAgIENvbnRyb2xMZWZ0OiB7XG4gICAgICAgIGtleUNvZGU6IDE3LFxuICAgICAgICBjb2RlOiAnQ29udHJvbExlZnQnLFxuICAgICAgICBrZXk6ICdDb250cm9sJyxcbiAgICAgICAgbG9jYXRpb246IDEsXG4gICAgfSxcbiAgICBDb250cm9sUmlnaHQ6IHtcbiAgICAgICAga2V5Q29kZTogMTcsXG4gICAgICAgIGNvZGU6ICdDb250cm9sUmlnaHQnLFxuICAgICAgICBrZXk6ICdDb250cm9sJyxcbiAgICAgICAgbG9jYXRpb246IDIsXG4gICAgfSxcbiAgICBBbHRMZWZ0OiB7IGtleUNvZGU6IDE4LCBjb2RlOiAnQWx0TGVmdCcsIGtleTogJ0FsdCcsIGxvY2F0aW9uOiAxIH0sXG4gICAgQWx0UmlnaHQ6IHsga2V5Q29kZTogMTgsIGNvZGU6ICdBbHRSaWdodCcsIGtleTogJ0FsdCcsIGxvY2F0aW9uOiAyIH0sXG4gICAgUGF1c2U6IHsga2V5Q29kZTogMTksIGNvZGU6ICdQYXVzZScsIGtleTogJ1BhdXNlJyB9LFxuICAgIENhcHNMb2NrOiB7IGtleUNvZGU6IDIwLCBjb2RlOiAnQ2Fwc0xvY2snLCBrZXk6ICdDYXBzTG9jaycgfSxcbiAgICBFc2NhcGU6IHsga2V5Q29kZTogMjcsIGNvZGU6ICdFc2NhcGUnLCBrZXk6ICdFc2NhcGUnIH0sXG4gICAgQ29udmVydDogeyBrZXlDb2RlOiAyOCwgY29kZTogJ0NvbnZlcnQnLCBrZXk6ICdDb252ZXJ0JyB9LFxuICAgIE5vbkNvbnZlcnQ6IHsga2V5Q29kZTogMjksIGNvZGU6ICdOb25Db252ZXJ0Jywga2V5OiAnTm9uQ29udmVydCcgfSxcbiAgICBTcGFjZTogeyBrZXlDb2RlOiAzMiwgY29kZTogJ1NwYWNlJywga2V5OiAnICcgfSxcbiAgICBOdW1wYWQ5OiB7XG4gICAgICAgIGtleUNvZGU6IDMzLFxuICAgICAgICBzaGlmdEtleUNvZGU6IDEwNSxcbiAgICAgICAga2V5OiAnUGFnZVVwJyxcbiAgICAgICAgY29kZTogJ051bXBhZDknLFxuICAgICAgICBzaGlmdEtleTogJzknLFxuICAgICAgICBsb2NhdGlvbjogMyxcbiAgICB9LFxuICAgIFBhZ2VVcDogeyBrZXlDb2RlOiAzMywgY29kZTogJ1BhZ2VVcCcsIGtleTogJ1BhZ2VVcCcgfSxcbiAgICBOdW1wYWQzOiB7XG4gICAgICAgIGtleUNvZGU6IDM0LFxuICAgICAgICBzaGlmdEtleUNvZGU6IDk5LFxuICAgICAgICBrZXk6ICdQYWdlRG93bicsXG4gICAgICAgIGNvZGU6ICdOdW1wYWQzJyxcbiAgICAgICAgc2hpZnRLZXk6ICczJyxcbiAgICAgICAgbG9jYXRpb246IDMsXG4gICAgfSxcbiAgICBQYWdlRG93bjogeyBrZXlDb2RlOiAzNCwgY29kZTogJ1BhZ2VEb3duJywga2V5OiAnUGFnZURvd24nIH0sXG4gICAgRW5kOiB7IGtleUNvZGU6IDM1LCBjb2RlOiAnRW5kJywga2V5OiAnRW5kJyB9LFxuICAgIE51bXBhZDE6IHtcbiAgICAgICAga2V5Q29kZTogMzUsXG4gICAgICAgIHNoaWZ0S2V5Q29kZTogOTcsXG4gICAgICAgIGtleTogJ0VuZCcsXG4gICAgICAgIGNvZGU6ICdOdW1wYWQxJyxcbiAgICAgICAgc2hpZnRLZXk6ICcxJyxcbiAgICAgICAgbG9jYXRpb246IDMsXG4gICAgfSxcbiAgICBIb21lOiB7IGtleUNvZGU6IDM2LCBjb2RlOiAnSG9tZScsIGtleTogJ0hvbWUnIH0sXG4gICAgTnVtcGFkNzoge1xuICAgICAgICBrZXlDb2RlOiAzNixcbiAgICAgICAgc2hpZnRLZXlDb2RlOiAxMDMsXG4gICAgICAgIGtleTogJ0hvbWUnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkNycsXG4gICAgICAgIHNoaWZ0S2V5OiAnNycsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgQXJyb3dMZWZ0OiB7IGtleUNvZGU6IDM3LCBjb2RlOiAnQXJyb3dMZWZ0Jywga2V5OiAnQXJyb3dMZWZ0JyB9LFxuICAgIE51bXBhZDQ6IHtcbiAgICAgICAga2V5Q29kZTogMzcsXG4gICAgICAgIHNoaWZ0S2V5Q29kZTogMTAwLFxuICAgICAgICBrZXk6ICdBcnJvd0xlZnQnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkNCcsXG4gICAgICAgIHNoaWZ0S2V5OiAnNCcsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkODoge1xuICAgICAgICBrZXlDb2RlOiAzOCxcbiAgICAgICAgc2hpZnRLZXlDb2RlOiAxMDQsXG4gICAgICAgIGtleTogJ0Fycm93VXAnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkOCcsXG4gICAgICAgIHNoaWZ0S2V5OiAnOCcsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgQXJyb3dVcDogeyBrZXlDb2RlOiAzOCwgY29kZTogJ0Fycm93VXAnLCBrZXk6ICdBcnJvd1VwJyB9LFxuICAgIEFycm93UmlnaHQ6IHsga2V5Q29kZTogMzksIGNvZGU6ICdBcnJvd1JpZ2h0Jywga2V5OiAnQXJyb3dSaWdodCcgfSxcbiAgICBOdW1wYWQ2OiB7XG4gICAgICAgIGtleUNvZGU6IDM5LFxuICAgICAgICBzaGlmdEtleUNvZGU6IDEwMixcbiAgICAgICAga2V5OiAnQXJyb3dSaWdodCcsXG4gICAgICAgIGNvZGU6ICdOdW1wYWQ2JyxcbiAgICAgICAgc2hpZnRLZXk6ICc2JyxcbiAgICAgICAgbG9jYXRpb246IDMsXG4gICAgfSxcbiAgICBOdW1wYWQyOiB7XG4gICAgICAgIGtleUNvZGU6IDQwLFxuICAgICAgICBzaGlmdEtleUNvZGU6IDk4LFxuICAgICAgICBrZXk6ICdBcnJvd0Rvd24nLFxuICAgICAgICBjb2RlOiAnTnVtcGFkMicsXG4gICAgICAgIHNoaWZ0S2V5OiAnMicsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgQXJyb3dEb3duOiB7IGtleUNvZGU6IDQwLCBjb2RlOiAnQXJyb3dEb3duJywga2V5OiAnQXJyb3dEb3duJyB9LFxuICAgIFNlbGVjdDogeyBrZXlDb2RlOiA0MSwgY29kZTogJ1NlbGVjdCcsIGtleTogJ1NlbGVjdCcgfSxcbiAgICBPcGVuOiB7IGtleUNvZGU6IDQzLCBjb2RlOiAnT3BlbicsIGtleTogJ0V4ZWN1dGUnIH0sXG4gICAgUHJpbnRTY3JlZW46IHsga2V5Q29kZTogNDQsIGNvZGU6ICdQcmludFNjcmVlbicsIGtleTogJ1ByaW50U2NyZWVuJyB9LFxuICAgIEluc2VydDogeyBrZXlDb2RlOiA0NSwgY29kZTogJ0luc2VydCcsIGtleTogJ0luc2VydCcgfSxcbiAgICBOdW1wYWQwOiB7XG4gICAgICAgIGtleUNvZGU6IDQ1LFxuICAgICAgICBzaGlmdEtleUNvZGU6IDk2LFxuICAgICAgICBrZXk6ICdJbnNlcnQnLFxuICAgICAgICBjb2RlOiAnTnVtcGFkMCcsXG4gICAgICAgIHNoaWZ0S2V5OiAnMCcsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgRGVsZXRlOiB7IGtleUNvZGU6IDQ2LCBjb2RlOiAnRGVsZXRlJywga2V5OiAnRGVsZXRlJyB9LFxuICAgIE51bXBhZERlY2ltYWw6IHtcbiAgICAgICAga2V5Q29kZTogNDYsXG4gICAgICAgIHNoaWZ0S2V5Q29kZTogMTEwLFxuICAgICAgICBjb2RlOiAnTnVtcGFkRGVjaW1hbCcsXG4gICAgICAgIGtleTogJ1xcdTAwMDAnLFxuICAgICAgICBzaGlmdEtleTogJy4nLFxuICAgICAgICBsb2NhdGlvbjogMyxcbiAgICB9LFxuICAgIERpZ2l0MDogeyBrZXlDb2RlOiA0OCwgY29kZTogJ0RpZ2l0MCcsIHNoaWZ0S2V5OiAnKScsIGtleTogJzAnIH0sXG4gICAgRGlnaXQxOiB7IGtleUNvZGU6IDQ5LCBjb2RlOiAnRGlnaXQxJywgc2hpZnRLZXk6ICchJywga2V5OiAnMScgfSxcbiAgICBEaWdpdDI6IHsga2V5Q29kZTogNTAsIGNvZGU6ICdEaWdpdDInLCBzaGlmdEtleTogJ0AnLCBrZXk6ICcyJyB9LFxuICAgIERpZ2l0MzogeyBrZXlDb2RlOiA1MSwgY29kZTogJ0RpZ2l0MycsIHNoaWZ0S2V5OiAnIycsIGtleTogJzMnIH0sXG4gICAgRGlnaXQ0OiB7IGtleUNvZGU6IDUyLCBjb2RlOiAnRGlnaXQ0Jywgc2hpZnRLZXk6ICckJywga2V5OiAnNCcgfSxcbiAgICBEaWdpdDU6IHsga2V5Q29kZTogNTMsIGNvZGU6ICdEaWdpdDUnLCBzaGlmdEtleTogJyUnLCBrZXk6ICc1JyB9LFxuICAgIERpZ2l0NjogeyBrZXlDb2RlOiA1NCwgY29kZTogJ0RpZ2l0NicsIHNoaWZ0S2V5OiAnXicsIGtleTogJzYnIH0sXG4gICAgRGlnaXQ3OiB7IGtleUNvZGU6IDU1LCBjb2RlOiAnRGlnaXQ3Jywgc2hpZnRLZXk6ICcmJywga2V5OiAnNycgfSxcbiAgICBEaWdpdDg6IHsga2V5Q29kZTogNTYsIGNvZGU6ICdEaWdpdDgnLCBzaGlmdEtleTogJyonLCBrZXk6ICc4JyB9LFxuICAgIERpZ2l0OTogeyBrZXlDb2RlOiA1NywgY29kZTogJ0RpZ2l0OScsIHNoaWZ0S2V5OiAnKCcsIGtleTogJzknIH0sXG4gICAgS2V5QTogeyBrZXlDb2RlOiA2NSwgY29kZTogJ0tleUEnLCBzaGlmdEtleTogJ0EnLCBrZXk6ICdhJyB9LFxuICAgIEtleUI6IHsga2V5Q29kZTogNjYsIGNvZGU6ICdLZXlCJywgc2hpZnRLZXk6ICdCJywga2V5OiAnYicgfSxcbiAgICBLZXlDOiB7IGtleUNvZGU6IDY3LCBjb2RlOiAnS2V5QycsIHNoaWZ0S2V5OiAnQycsIGtleTogJ2MnIH0sXG4gICAgS2V5RDogeyBrZXlDb2RlOiA2OCwgY29kZTogJ0tleUQnLCBzaGlmdEtleTogJ0QnLCBrZXk6ICdkJyB9LFxuICAgIEtleUU6IHsga2V5Q29kZTogNjksIGNvZGU6ICdLZXlFJywgc2hpZnRLZXk6ICdFJywga2V5OiAnZScgfSxcbiAgICBLZXlGOiB7IGtleUNvZGU6IDcwLCBjb2RlOiAnS2V5RicsIHNoaWZ0S2V5OiAnRicsIGtleTogJ2YnIH0sXG4gICAgS2V5RzogeyBrZXlDb2RlOiA3MSwgY29kZTogJ0tleUcnLCBzaGlmdEtleTogJ0cnLCBrZXk6ICdnJyB9LFxuICAgIEtleUg6IHsga2V5Q29kZTogNzIsIGNvZGU6ICdLZXlIJywgc2hpZnRLZXk6ICdIJywga2V5OiAnaCcgfSxcbiAgICBLZXlJOiB7IGtleUNvZGU6IDczLCBjb2RlOiAnS2V5SScsIHNoaWZ0S2V5OiAnSScsIGtleTogJ2knIH0sXG4gICAgS2V5SjogeyBrZXlDb2RlOiA3NCwgY29kZTogJ0tleUonLCBzaGlmdEtleTogJ0onLCBrZXk6ICdqJyB9LFxuICAgIEtleUs6IHsga2V5Q29kZTogNzUsIGNvZGU6ICdLZXlLJywgc2hpZnRLZXk6ICdLJywga2V5OiAnaycgfSxcbiAgICBLZXlMOiB7IGtleUNvZGU6IDc2LCBjb2RlOiAnS2V5TCcsIHNoaWZ0S2V5OiAnTCcsIGtleTogJ2wnIH0sXG4gICAgS2V5TTogeyBrZXlDb2RlOiA3NywgY29kZTogJ0tleU0nLCBzaGlmdEtleTogJ00nLCBrZXk6ICdtJyB9LFxuICAgIEtleU46IHsga2V5Q29kZTogNzgsIGNvZGU6ICdLZXlOJywgc2hpZnRLZXk6ICdOJywga2V5OiAnbicgfSxcbiAgICBLZXlPOiB7IGtleUNvZGU6IDc5LCBjb2RlOiAnS2V5TycsIHNoaWZ0S2V5OiAnTycsIGtleTogJ28nIH0sXG4gICAgS2V5UDogeyBrZXlDb2RlOiA4MCwgY29kZTogJ0tleVAnLCBzaGlmdEtleTogJ1AnLCBrZXk6ICdwJyB9LFxuICAgIEtleVE6IHsga2V5Q29kZTogODEsIGNvZGU6ICdLZXlRJywgc2hpZnRLZXk6ICdRJywga2V5OiAncScgfSxcbiAgICBLZXlSOiB7IGtleUNvZGU6IDgyLCBjb2RlOiAnS2V5UicsIHNoaWZ0S2V5OiAnUicsIGtleTogJ3InIH0sXG4gICAgS2V5UzogeyBrZXlDb2RlOiA4MywgY29kZTogJ0tleVMnLCBzaGlmdEtleTogJ1MnLCBrZXk6ICdzJyB9LFxuICAgIEtleVQ6IHsga2V5Q29kZTogODQsIGNvZGU6ICdLZXlUJywgc2hpZnRLZXk6ICdUJywga2V5OiAndCcgfSxcbiAgICBLZXlVOiB7IGtleUNvZGU6IDg1LCBjb2RlOiAnS2V5VScsIHNoaWZ0S2V5OiAnVScsIGtleTogJ3UnIH0sXG4gICAgS2V5VjogeyBrZXlDb2RlOiA4NiwgY29kZTogJ0tleVYnLCBzaGlmdEtleTogJ1YnLCBrZXk6ICd2JyB9LFxuICAgIEtleVc6IHsga2V5Q29kZTogODcsIGNvZGU6ICdLZXlXJywgc2hpZnRLZXk6ICdXJywga2V5OiAndycgfSxcbiAgICBLZXlYOiB7IGtleUNvZGU6IDg4LCBjb2RlOiAnS2V5WCcsIHNoaWZ0S2V5OiAnWCcsIGtleTogJ3gnIH0sXG4gICAgS2V5WTogeyBrZXlDb2RlOiA4OSwgY29kZTogJ0tleVknLCBzaGlmdEtleTogJ1knLCBrZXk6ICd5JyB9LFxuICAgIEtleVo6IHsga2V5Q29kZTogOTAsIGNvZGU6ICdLZXlaJywgc2hpZnRLZXk6ICdaJywga2V5OiAneicgfSxcbiAgICBNZXRhTGVmdDogeyBrZXlDb2RlOiA5MSwgY29kZTogJ01ldGFMZWZ0Jywga2V5OiAnTWV0YScsIGxvY2F0aW9uOiAxIH0sXG4gICAgTWV0YVJpZ2h0OiB7IGtleUNvZGU6IDkyLCBjb2RlOiAnTWV0YVJpZ2h0Jywga2V5OiAnTWV0YScsIGxvY2F0aW9uOiAyIH0sXG4gICAgQ29udGV4dE1lbnU6IHsga2V5Q29kZTogOTMsIGNvZGU6ICdDb250ZXh0TWVudScsIGtleTogJ0NvbnRleHRNZW51JyB9LFxuICAgIE51bXBhZE11bHRpcGx5OiB7XG4gICAgICAgIGtleUNvZGU6IDEwNixcbiAgICAgICAgY29kZTogJ051bXBhZE11bHRpcGx5JyxcbiAgICAgICAga2V5OiAnKicsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkQWRkOiB7IGtleUNvZGU6IDEwNywgY29kZTogJ051bXBhZEFkZCcsIGtleTogJysnLCBsb2NhdGlvbjogMyB9LFxuICAgIE51bXBhZFN1YnRyYWN0OiB7XG4gICAgICAgIGtleUNvZGU6IDEwOSxcbiAgICAgICAgY29kZTogJ051bXBhZFN1YnRyYWN0JyxcbiAgICAgICAga2V5OiAnLScsXG4gICAgICAgIGxvY2F0aW9uOiAzLFxuICAgIH0sXG4gICAgTnVtcGFkRGl2aWRlOiB7IGtleUNvZGU6IDExMSwgY29kZTogJ051bXBhZERpdmlkZScsIGtleTogJy8nLCBsb2NhdGlvbjogMyB9LFxuICAgIEYxOiB7IGtleUNvZGU6IDExMiwgY29kZTogJ0YxJywga2V5OiAnRjEnIH0sXG4gICAgRjI6IHsga2V5Q29kZTogMTEzLCBjb2RlOiAnRjInLCBrZXk6ICdGMicgfSxcbiAgICBGMzogeyBrZXlDb2RlOiAxMTQsIGNvZGU6ICdGMycsIGtleTogJ0YzJyB9LFxuICAgIEY0OiB7IGtleUNvZGU6IDExNSwgY29kZTogJ0Y0Jywga2V5OiAnRjQnIH0sXG4gICAgRjU6IHsga2V5Q29kZTogMTE2LCBjb2RlOiAnRjUnLCBrZXk6ICdGNScgfSxcbiAgICBGNjogeyBrZXlDb2RlOiAxMTcsIGNvZGU6ICdGNicsIGtleTogJ0Y2JyB9LFxuICAgIEY3OiB7IGtleUNvZGU6IDExOCwgY29kZTogJ0Y3Jywga2V5OiAnRjcnIH0sXG4gICAgRjg6IHsga2V5Q29kZTogMTE5LCBjb2RlOiAnRjgnLCBrZXk6ICdGOCcgfSxcbiAgICBGOTogeyBrZXlDb2RlOiAxMjAsIGNvZGU6ICdGOScsIGtleTogJ0Y5JyB9LFxuICAgIEYxMDogeyBrZXlDb2RlOiAxMjEsIGNvZGU6ICdGMTAnLCBrZXk6ICdGMTAnIH0sXG4gICAgRjExOiB7IGtleUNvZGU6IDEyMiwgY29kZTogJ0YxMScsIGtleTogJ0YxMScgfSxcbiAgICBGMTI6IHsga2V5Q29kZTogMTIzLCBjb2RlOiAnRjEyJywga2V5OiAnRjEyJyB9LFxuICAgIEYxMzogeyBrZXlDb2RlOiAxMjQsIGNvZGU6ICdGMTMnLCBrZXk6ICdGMTMnIH0sXG4gICAgRjE0OiB7IGtleUNvZGU6IDEyNSwgY29kZTogJ0YxNCcsIGtleTogJ0YxNCcgfSxcbiAgICBGMTU6IHsga2V5Q29kZTogMTI2LCBjb2RlOiAnRjE1Jywga2V5OiAnRjE1JyB9LFxuICAgIEYxNjogeyBrZXlDb2RlOiAxMjcsIGNvZGU6ICdGMTYnLCBrZXk6ICdGMTYnIH0sXG4gICAgRjE3OiB7IGtleUNvZGU6IDEyOCwgY29kZTogJ0YxNycsIGtleTogJ0YxNycgfSxcbiAgICBGMTg6IHsga2V5Q29kZTogMTI5LCBjb2RlOiAnRjE4Jywga2V5OiAnRjE4JyB9LFxuICAgIEYxOTogeyBrZXlDb2RlOiAxMzAsIGNvZGU6ICdGMTknLCBrZXk6ICdGMTknIH0sXG4gICAgRjIwOiB7IGtleUNvZGU6IDEzMSwgY29kZTogJ0YyMCcsIGtleTogJ0YyMCcgfSxcbiAgICBGMjE6IHsga2V5Q29kZTogMTMyLCBjb2RlOiAnRjIxJywga2V5OiAnRjIxJyB9LFxuICAgIEYyMjogeyBrZXlDb2RlOiAxMzMsIGNvZGU6ICdGMjInLCBrZXk6ICdGMjInIH0sXG4gICAgRjIzOiB7IGtleUNvZGU6IDEzNCwgY29kZTogJ0YyMycsIGtleTogJ0YyMycgfSxcbiAgICBGMjQ6IHsga2V5Q29kZTogMTM1LCBjb2RlOiAnRjI0Jywga2V5OiAnRjI0JyB9LFxuICAgIE51bUxvY2s6IHsga2V5Q29kZTogMTQ0LCBjb2RlOiAnTnVtTG9jaycsIGtleTogJ051bUxvY2snIH0sXG4gICAgU2Nyb2xsTG9jazogeyBrZXlDb2RlOiAxNDUsIGNvZGU6ICdTY3JvbGxMb2NrJywga2V5OiAnU2Nyb2xsTG9jaycgfSxcbiAgICBBdWRpb1ZvbHVtZU11dGU6IHtcbiAgICAgICAga2V5Q29kZTogMTczLFxuICAgICAgICBjb2RlOiAnQXVkaW9Wb2x1bWVNdXRlJyxcbiAgICAgICAga2V5OiAnQXVkaW9Wb2x1bWVNdXRlJyxcbiAgICB9LFxuICAgIEF1ZGlvVm9sdW1lRG93bjoge1xuICAgICAgICBrZXlDb2RlOiAxNzQsXG4gICAgICAgIGNvZGU6ICdBdWRpb1ZvbHVtZURvd24nLFxuICAgICAgICBrZXk6ICdBdWRpb1ZvbHVtZURvd24nLFxuICAgIH0sXG4gICAgQXVkaW9Wb2x1bWVVcDogeyBrZXlDb2RlOiAxNzUsIGNvZGU6ICdBdWRpb1ZvbHVtZVVwJywga2V5OiAnQXVkaW9Wb2x1bWVVcCcgfSxcbiAgICBNZWRpYVRyYWNrTmV4dDoge1xuICAgICAgICBrZXlDb2RlOiAxNzYsXG4gICAgICAgIGNvZGU6ICdNZWRpYVRyYWNrTmV4dCcsXG4gICAgICAgIGtleTogJ01lZGlhVHJhY2tOZXh0JyxcbiAgICB9LFxuICAgIE1lZGlhVHJhY2tQcmV2aW91czoge1xuICAgICAgICBrZXlDb2RlOiAxNzcsXG4gICAgICAgIGNvZGU6ICdNZWRpYVRyYWNrUHJldmlvdXMnLFxuICAgICAgICBrZXk6ICdNZWRpYVRyYWNrUHJldmlvdXMnLFxuICAgIH0sXG4gICAgTWVkaWFTdG9wOiB7IGtleUNvZGU6IDE3OCwgY29kZTogJ01lZGlhU3RvcCcsIGtleTogJ01lZGlhU3RvcCcgfSxcbiAgICBNZWRpYVBsYXlQYXVzZToge1xuICAgICAgICBrZXlDb2RlOiAxNzksXG4gICAgICAgIGNvZGU6ICdNZWRpYVBsYXlQYXVzZScsXG4gICAgICAgIGtleTogJ01lZGlhUGxheVBhdXNlJyxcbiAgICB9LFxuICAgIFNlbWljb2xvbjogeyBrZXlDb2RlOiAxODYsIGNvZGU6ICdTZW1pY29sb24nLCBzaGlmdEtleTogJzonLCBrZXk6ICc7JyB9LFxuICAgIEVxdWFsOiB7IGtleUNvZGU6IDE4NywgY29kZTogJ0VxdWFsJywgc2hpZnRLZXk6ICcrJywga2V5OiAnPScgfSxcbiAgICBOdW1wYWRFcXVhbDogeyBrZXlDb2RlOiAxODcsIGNvZGU6ICdOdW1wYWRFcXVhbCcsIGtleTogJz0nLCBsb2NhdGlvbjogMyB9LFxuICAgIENvbW1hOiB7IGtleUNvZGU6IDE4OCwgY29kZTogJ0NvbW1hJywgc2hpZnRLZXk6ICc8Jywga2V5OiAnLCcgfSxcbiAgICBNaW51czogeyBrZXlDb2RlOiAxODksIGNvZGU6ICdNaW51cycsIHNoaWZ0S2V5OiAnXycsIGtleTogJy0nIH0sXG4gICAgUGVyaW9kOiB7IGtleUNvZGU6IDE5MCwgY29kZTogJ1BlcmlvZCcsIHNoaWZ0S2V5OiAnPicsIGtleTogJy4nIH0sXG4gICAgU2xhc2g6IHsga2V5Q29kZTogMTkxLCBjb2RlOiAnU2xhc2gnLCBzaGlmdEtleTogJz8nLCBrZXk6ICcvJyB9LFxuICAgIEJhY2txdW90ZTogeyBrZXlDb2RlOiAxOTIsIGNvZGU6ICdCYWNrcXVvdGUnLCBzaGlmdEtleTogJ34nLCBrZXk6ICdgJyB9LFxuICAgIEJyYWNrZXRMZWZ0OiB7IGtleUNvZGU6IDIxOSwgY29kZTogJ0JyYWNrZXRMZWZ0Jywgc2hpZnRLZXk6ICd7Jywga2V5OiAnWycgfSxcbiAgICBCYWNrc2xhc2g6IHsga2V5Q29kZTogMjIwLCBjb2RlOiAnQmFja3NsYXNoJywgc2hpZnRLZXk6ICd8Jywga2V5OiAnXFxcXCcgfSxcbiAgICBCcmFja2V0UmlnaHQ6IHsga2V5Q29kZTogMjIxLCBjb2RlOiAnQnJhY2tldFJpZ2h0Jywgc2hpZnRLZXk6ICd9Jywga2V5OiAnXScgfSxcbiAgICBRdW90ZTogeyBrZXlDb2RlOiAyMjIsIGNvZGU6ICdRdW90ZScsIHNoaWZ0S2V5OiAnXCInLCBrZXk6IFwiJ1wiIH0sXG4gICAgQWx0R3JhcGg6IHsga2V5Q29kZTogMjI1LCBjb2RlOiAnQWx0R3JhcGgnLCBrZXk6ICdBbHRHcmFwaCcgfSxcbiAgICBQcm9wczogeyBrZXlDb2RlOiAyNDcsIGNvZGU6ICdQcm9wcycsIGtleTogJ0NyU2VsJyB9LFxuICAgIENhbmNlbDogeyBrZXlDb2RlOiAzLCBrZXk6ICdDYW5jZWwnLCBjb2RlOiAnQWJvcnQnIH0sXG4gICAgQ2xlYXI6IHsga2V5Q29kZTogMTIsIGtleTogJ0NsZWFyJywgY29kZTogJ051bXBhZDUnLCBsb2NhdGlvbjogMyB9LFxuICAgIFNoaWZ0OiB7IGtleUNvZGU6IDE2LCBrZXk6ICdTaGlmdCcsIGNvZGU6ICdTaGlmdExlZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIENvbnRyb2w6IHsga2V5Q29kZTogMTcsIGtleTogJ0NvbnRyb2wnLCBjb2RlOiAnQ29udHJvbExlZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIEFsdDogeyBrZXlDb2RlOiAxOCwga2V5OiAnQWx0JywgY29kZTogJ0FsdExlZnQnLCBsb2NhdGlvbjogMSB9LFxuICAgIEFjY2VwdDogeyBrZXlDb2RlOiAzMCwga2V5OiAnQWNjZXB0JyB9LFxuICAgIE1vZGVDaGFuZ2U6IHsga2V5Q29kZTogMzEsIGtleTogJ01vZGVDaGFuZ2UnIH0sXG4gICAgJyAnOiB7IGtleUNvZGU6IDMyLCBrZXk6ICcgJywgY29kZTogJ1NwYWNlJyB9LFxuICAgIFByaW50OiB7IGtleUNvZGU6IDQyLCBrZXk6ICdQcmludCcgfSxcbiAgICBFeGVjdXRlOiB7IGtleUNvZGU6IDQzLCBrZXk6ICdFeGVjdXRlJywgY29kZTogJ09wZW4nIH0sXG4gICAgJ1xcdTAwMDAnOiB7IGtleUNvZGU6IDQ2LCBrZXk6ICdcXHUwMDAwJywgY29kZTogJ051bXBhZERlY2ltYWwnLCBsb2NhdGlvbjogMyB9LFxuICAgIGE6IHsga2V5Q29kZTogNjUsIGtleTogJ2EnLCBjb2RlOiAnS2V5QScgfSxcbiAgICBiOiB7IGtleUNvZGU6IDY2LCBrZXk6ICdiJywgY29kZTogJ0tleUInIH0sXG4gICAgYzogeyBrZXlDb2RlOiA2Nywga2V5OiAnYycsIGNvZGU6ICdLZXlDJyB9LFxuICAgIGQ6IHsga2V5Q29kZTogNjgsIGtleTogJ2QnLCBjb2RlOiAnS2V5RCcgfSxcbiAgICBlOiB7IGtleUNvZGU6IDY5LCBrZXk6ICdlJywgY29kZTogJ0tleUUnIH0sXG4gICAgZjogeyBrZXlDb2RlOiA3MCwga2V5OiAnZicsIGNvZGU6ICdLZXlGJyB9LFxuICAgIGc6IHsga2V5Q29kZTogNzEsIGtleTogJ2cnLCBjb2RlOiAnS2V5RycgfSxcbiAgICBoOiB7IGtleUNvZGU6IDcyLCBrZXk6ICdoJywgY29kZTogJ0tleUgnIH0sXG4gICAgaTogeyBrZXlDb2RlOiA3Mywga2V5OiAnaScsIGNvZGU6ICdLZXlJJyB9LFxuICAgIGo6IHsga2V5Q29kZTogNzQsIGtleTogJ2onLCBjb2RlOiAnS2V5SicgfSxcbiAgICBrOiB7IGtleUNvZGU6IDc1LCBrZXk6ICdrJywgY29kZTogJ0tleUsnIH0sXG4gICAgbDogeyBrZXlDb2RlOiA3Niwga2V5OiAnbCcsIGNvZGU6ICdLZXlMJyB9LFxuICAgIG06IHsga2V5Q29kZTogNzcsIGtleTogJ20nLCBjb2RlOiAnS2V5TScgfSxcbiAgICBuOiB7IGtleUNvZGU6IDc4LCBrZXk6ICduJywgY29kZTogJ0tleU4nIH0sXG4gICAgbzogeyBrZXlDb2RlOiA3OSwga2V5OiAnbycsIGNvZGU6ICdLZXlPJyB9LFxuICAgIHA6IHsga2V5Q29kZTogODAsIGtleTogJ3AnLCBjb2RlOiAnS2V5UCcgfSxcbiAgICBxOiB7IGtleUNvZGU6IDgxLCBrZXk6ICdxJywgY29kZTogJ0tleVEnIH0sXG4gICAgcjogeyBrZXlDb2RlOiA4Miwga2V5OiAncicsIGNvZGU6ICdLZXlSJyB9LFxuICAgIHM6IHsga2V5Q29kZTogODMsIGtleTogJ3MnLCBjb2RlOiAnS2V5UycgfSxcbiAgICB0OiB7IGtleUNvZGU6IDg0LCBrZXk6ICd0JywgY29kZTogJ0tleVQnIH0sXG4gICAgdTogeyBrZXlDb2RlOiA4NSwga2V5OiAndScsIGNvZGU6ICdLZXlVJyB9LFxuICAgIHY6IHsga2V5Q29kZTogODYsIGtleTogJ3YnLCBjb2RlOiAnS2V5VicgfSxcbiAgICB3OiB7IGtleUNvZGU6IDg3LCBrZXk6ICd3JywgY29kZTogJ0tleVcnIH0sXG4gICAgeDogeyBrZXlDb2RlOiA4OCwga2V5OiAneCcsIGNvZGU6ICdLZXlYJyB9LFxuICAgIHk6IHsga2V5Q29kZTogODksIGtleTogJ3knLCBjb2RlOiAnS2V5WScgfSxcbiAgICB6OiB7IGtleUNvZGU6IDkwLCBrZXk6ICd6JywgY29kZTogJ0tleVonIH0sXG4gICAgTWV0YTogeyBrZXlDb2RlOiA5MSwga2V5OiAnTWV0YScsIGNvZGU6ICdNZXRhTGVmdCcsIGxvY2F0aW9uOiAxIH0sXG4gICAgJyonOiB7IGtleUNvZGU6IDEwNiwga2V5OiAnKicsIGNvZGU6ICdOdW1wYWRNdWx0aXBseScsIGxvY2F0aW9uOiAzIH0sXG4gICAgJysnOiB7IGtleUNvZGU6IDEwNywga2V5OiAnKycsIGNvZGU6ICdOdW1wYWRBZGQnLCBsb2NhdGlvbjogMyB9LFxuICAgICctJzogeyBrZXlDb2RlOiAxMDksIGtleTogJy0nLCBjb2RlOiAnTnVtcGFkU3VidHJhY3QnLCBsb2NhdGlvbjogMyB9LFxuICAgICcvJzogeyBrZXlDb2RlOiAxMTEsIGtleTogJy8nLCBjb2RlOiAnTnVtcGFkRGl2aWRlJywgbG9jYXRpb246IDMgfSxcbiAgICAnOyc6IHsga2V5Q29kZTogMTg2LCBrZXk6ICc7JywgY29kZTogJ1NlbWljb2xvbicgfSxcbiAgICAnPSc6IHsga2V5Q29kZTogMTg3LCBrZXk6ICc9JywgY29kZTogJ0VxdWFsJyB9LFxuICAgICcsJzogeyBrZXlDb2RlOiAxODgsIGtleTogJywnLCBjb2RlOiAnQ29tbWEnIH0sXG4gICAgJy4nOiB7IGtleUNvZGU6IDE5MCwga2V5OiAnLicsIGNvZGU6ICdQZXJpb2QnIH0sXG4gICAgJ2AnOiB7IGtleUNvZGU6IDE5Miwga2V5OiAnYCcsIGNvZGU6ICdCYWNrcXVvdGUnIH0sXG4gICAgJ1snOiB7IGtleUNvZGU6IDIxOSwga2V5OiAnWycsIGNvZGU6ICdCcmFja2V0TGVmdCcgfSxcbiAgICAnXFxcXCc6IHsga2V5Q29kZTogMjIwLCBrZXk6ICdcXFxcJywgY29kZTogJ0JhY2tzbGFzaCcgfSxcbiAgICAnXSc6IHsga2V5Q29kZTogMjIxLCBrZXk6ICddJywgY29kZTogJ0JyYWNrZXRSaWdodCcgfSxcbiAgICBcIidcIjogeyBrZXlDb2RlOiAyMjIsIGtleTogXCInXCIsIGNvZGU6ICdRdW90ZScgfSxcbiAgICBBdHRuOiB7IGtleUNvZGU6IDI0Niwga2V5OiAnQXR0bicgfSxcbiAgICBDclNlbDogeyBrZXlDb2RlOiAyNDcsIGtleTogJ0NyU2VsJywgY29kZTogJ1Byb3BzJyB9LFxuICAgIEV4U2VsOiB7IGtleUNvZGU6IDI0OCwga2V5OiAnRXhTZWwnIH0sXG4gICAgRXJhc2VFb2Y6IHsga2V5Q29kZTogMjQ5LCBrZXk6ICdFcmFzZUVvZicgfSxcbiAgICBQbGF5OiB7IGtleUNvZGU6IDI1MCwga2V5OiAnUGxheScgfSxcbiAgICBab29tT3V0OiB7IGtleUNvZGU6IDI1MSwga2V5OiAnWm9vbU91dCcgfSxcbiAgICAnKSc6IHsga2V5Q29kZTogNDgsIGtleTogJyknLCBjb2RlOiAnRGlnaXQwJyB9LFxuICAgICchJzogeyBrZXlDb2RlOiA0OSwga2V5OiAnIScsIGNvZGU6ICdEaWdpdDEnIH0sXG4gICAgJ0AnOiB7IGtleUNvZGU6IDUwLCBrZXk6ICdAJywgY29kZTogJ0RpZ2l0MicgfSxcbiAgICAnIyc6IHsga2V5Q29kZTogNTEsIGtleTogJyMnLCBjb2RlOiAnRGlnaXQzJyB9LFxuICAgICQ6IHsga2V5Q29kZTogNTIsIGtleTogJyQnLCBjb2RlOiAnRGlnaXQ0JyB9LFxuICAgICclJzogeyBrZXlDb2RlOiA1Mywga2V5OiAnJScsIGNvZGU6ICdEaWdpdDUnIH0sXG4gICAgJ14nOiB7IGtleUNvZGU6IDU0LCBrZXk6ICdeJywgY29kZTogJ0RpZ2l0NicgfSxcbiAgICAnJic6IHsga2V5Q29kZTogNTUsIGtleTogJyYnLCBjb2RlOiAnRGlnaXQ3JyB9LFxuICAgICcoJzogeyBrZXlDb2RlOiA1Nywga2V5OiAnKCcsIGNvZGU6ICdEaWdpdDknIH0sXG4gICAgQTogeyBrZXlDb2RlOiA2NSwga2V5OiAnQScsIGNvZGU6ICdLZXlBJyB9LFxuICAgIEI6IHsga2V5Q29kZTogNjYsIGtleTogJ0InLCBjb2RlOiAnS2V5QicgfSxcbiAgICBDOiB7IGtleUNvZGU6IDY3LCBrZXk6ICdDJywgY29kZTogJ0tleUMnIH0sXG4gICAgRDogeyBrZXlDb2RlOiA2OCwga2V5OiAnRCcsIGNvZGU6ICdLZXlEJyB9LFxuICAgIEU6IHsga2V5Q29kZTogNjksIGtleTogJ0UnLCBjb2RlOiAnS2V5RScgfSxcbiAgICBGOiB7IGtleUNvZGU6IDcwLCBrZXk6ICdGJywgY29kZTogJ0tleUYnIH0sXG4gICAgRzogeyBrZXlDb2RlOiA3MSwga2V5OiAnRycsIGNvZGU6ICdLZXlHJyB9LFxuICAgIEg6IHsga2V5Q29kZTogNzIsIGtleTogJ0gnLCBjb2RlOiAnS2V5SCcgfSxcbiAgICBJOiB7IGtleUNvZGU6IDczLCBrZXk6ICdJJywgY29kZTogJ0tleUknIH0sXG4gICAgSjogeyBrZXlDb2RlOiA3NCwga2V5OiAnSicsIGNvZGU6ICdLZXlKJyB9LFxuICAgIEs6IHsga2V5Q29kZTogNzUsIGtleTogJ0snLCBjb2RlOiAnS2V5SycgfSxcbiAgICBMOiB7IGtleUNvZGU6IDc2LCBrZXk6ICdMJywgY29kZTogJ0tleUwnIH0sXG4gICAgTTogeyBrZXlDb2RlOiA3Nywga2V5OiAnTScsIGNvZGU6ICdLZXlNJyB9LFxuICAgIE46IHsga2V5Q29kZTogNzgsIGtleTogJ04nLCBjb2RlOiAnS2V5TicgfSxcbiAgICBPOiB7IGtleUNvZGU6IDc5LCBrZXk6ICdPJywgY29kZTogJ0tleU8nIH0sXG4gICAgUDogeyBrZXlDb2RlOiA4MCwga2V5OiAnUCcsIGNvZGU6ICdLZXlQJyB9LFxuICAgIFE6IHsga2V5Q29kZTogODEsIGtleTogJ1EnLCBjb2RlOiAnS2V5UScgfSxcbiAgICBSOiB7IGtleUNvZGU6IDgyLCBrZXk6ICdSJywgY29kZTogJ0tleVInIH0sXG4gICAgUzogeyBrZXlDb2RlOiA4Mywga2V5OiAnUycsIGNvZGU6ICdLZXlTJyB9LFxuICAgIFQ6IHsga2V5Q29kZTogODQsIGtleTogJ1QnLCBjb2RlOiAnS2V5VCcgfSxcbiAgICBVOiB7IGtleUNvZGU6IDg1LCBrZXk6ICdVJywgY29kZTogJ0tleVUnIH0sXG4gICAgVjogeyBrZXlDb2RlOiA4Niwga2V5OiAnVicsIGNvZGU6ICdLZXlWJyB9LFxuICAgIFc6IHsga2V5Q29kZTogODcsIGtleTogJ1cnLCBjb2RlOiAnS2V5VycgfSxcbiAgICBYOiB7IGtleUNvZGU6IDg4LCBrZXk6ICdYJywgY29kZTogJ0tleVgnIH0sXG4gICAgWTogeyBrZXlDb2RlOiA4OSwga2V5OiAnWScsIGNvZGU6ICdLZXlZJyB9LFxuICAgIFo6IHsga2V5Q29kZTogOTAsIGtleTogJ1onLCBjb2RlOiAnS2V5WicgfSxcbiAgICAnOic6IHsga2V5Q29kZTogMTg2LCBrZXk6ICc6JywgY29kZTogJ1NlbWljb2xvbicgfSxcbiAgICAnPCc6IHsga2V5Q29kZTogMTg4LCBrZXk6ICc8JywgY29kZTogJ0NvbW1hJyB9LFxuICAgIF86IHsga2V5Q29kZTogMTg5LCBrZXk6ICdfJywgY29kZTogJ01pbnVzJyB9LFxuICAgICc+JzogeyBrZXlDb2RlOiAxOTAsIGtleTogJz4nLCBjb2RlOiAnUGVyaW9kJyB9LFxuICAgICc/JzogeyBrZXlDb2RlOiAxOTEsIGtleTogJz8nLCBjb2RlOiAnU2xhc2gnIH0sXG4gICAgJ34nOiB7IGtleUNvZGU6IDE5Miwga2V5OiAnficsIGNvZGU6ICdCYWNrcXVvdGUnIH0sXG4gICAgJ3snOiB7IGtleUNvZGU6IDIxOSwga2V5OiAneycsIGNvZGU6ICdCcmFja2V0TGVmdCcgfSxcbiAgICAnfCc6IHsga2V5Q29kZTogMjIwLCBrZXk6ICd8JywgY29kZTogJ0JhY2tzbGFzaCcgfSxcbiAgICAnfSc6IHsga2V5Q29kZTogMjIxLCBrZXk6ICd9JywgY29kZTogJ0JyYWNrZXRSaWdodCcgfSxcbiAgICAnXCInOiB7IGtleUNvZGU6IDIyMiwga2V5OiAnXCInLCBjb2RlOiAnUXVvdGUnIH0sXG4gICAgU29mdExlZnQ6IHsga2V5OiAnU29mdExlZnQnLCBjb2RlOiAnU29mdExlZnQnLCBsb2NhdGlvbjogNCB9LFxuICAgIFNvZnRSaWdodDogeyBrZXk6ICdTb2Z0UmlnaHQnLCBjb2RlOiAnU29mdFJpZ2h0JywgbG9jYXRpb246IDQgfSxcbiAgICBDYW1lcmE6IHsga2V5Q29kZTogNDQsIGtleTogJ0NhbWVyYScsIGNvZGU6ICdDYW1lcmEnLCBsb2NhdGlvbjogNCB9LFxuICAgIENhbGw6IHsga2V5OiAnQ2FsbCcsIGNvZGU6ICdDYWxsJywgbG9jYXRpb246IDQgfSxcbiAgICBFbmRDYWxsOiB7IGtleUNvZGU6IDk1LCBrZXk6ICdFbmRDYWxsJywgY29kZTogJ0VuZENhbGwnLCBsb2NhdGlvbjogNCB9LFxuICAgIFZvbHVtZURvd246IHtcbiAgICAgICAga2V5Q29kZTogMTgyLFxuICAgICAgICBrZXk6ICdWb2x1bWVEb3duJyxcbiAgICAgICAgY29kZTogJ1ZvbHVtZURvd24nLFxuICAgICAgICBsb2NhdGlvbjogNCxcbiAgICB9LFxuICAgIFZvbHVtZVVwOiB7IGtleUNvZGU6IDE4Mywga2V5OiAnVm9sdW1lVXAnLCBjb2RlOiAnVm9sdW1lVXAnLCBsb2NhdGlvbjogNCB9LFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVTS2V5Ym9hcmRMYXlvdXQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZXdwb3J0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4uL3V0aWwvRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgaXNFcnJvckxpa2UgfSBmcm9tICcuLi91dGlsL0Vycm9yTGlrZS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlGdW5jdGlvbiB9IGZyb20gJy4uL3V0aWwvRnVuY3Rpb24uanMnO1xuaW1wb3J0IHsgVGltZW91dEVycm9yIH0gZnJvbSAnLi9FcnJvcnMuanMnO1xuaW1wb3J0IHsgTGF6eUFyZyB9IGZyb20gJy4vTGF6eUFyZy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgV2FpdFRhc2sge1xuICAgICN3b3JsZDtcbiAgICAjcG9sbGluZztcbiAgICAjcm9vdDtcbiAgICAjZm47XG4gICAgI2FyZ3M7XG4gICAgI3RpbWVvdXQ7XG4gICAgI3RpbWVvdXRFcnJvcjtcbiAgICAjcmVzdWx0ID0gRGVmZXJyZWQuY3JlYXRlKCk7XG4gICAgI3BvbGxlcjtcbiAgICAjc2lnbmFsO1xuICAgICNyZXJ1bnMgPSBbXTtcbiAgICBjb25zdHJ1Y3Rvcih3b3JsZCwgb3B0aW9ucywgZm4sIC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy4jd29ybGQgPSB3b3JsZDtcbiAgICAgICAgdGhpcy4jcG9sbGluZyA9IG9wdGlvbnMucG9sbGluZztcbiAgICAgICAgdGhpcy4jcm9vdCA9IG9wdGlvbnMucm9vdDtcbiAgICAgICAgdGhpcy4jc2lnbmFsID0gb3B0aW9ucy5zaWduYWw7XG4gICAgICAgIHRoaXMuI3NpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHRoaXMudGVybWluYXRlKHRoaXMuI3NpZ25hbD8ucmVhc29uKTtcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgb25jZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGZuKSB7XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgIHRoaXMuI2ZuID0gYCgpID0+IHtyZXR1cm4gKCR7Zm59KTt9YDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy4jZm4gPSBzdHJpbmdpZnlGdW5jdGlvbihmbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jYXJncyA9IGFyZ3M7XG4gICAgICAgIHRoaXMuI3dvcmxkLnRhc2tNYW5hZ2VyLmFkZCh0aGlzKTtcbiAgICAgICAgaWYgKG9wdGlvbnMudGltZW91dCkge1xuICAgICAgICAgICAgdGhpcy4jdGltZW91dEVycm9yID0gbmV3IFRpbWVvdXRFcnJvcihgV2FpdGluZyBmYWlsZWQ6ICR7b3B0aW9ucy50aW1lb3V0fW1zIGV4Y2VlZGVkYCk7XG4gICAgICAgICAgICB0aGlzLiN0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnRlcm1pbmF0ZSh0aGlzLiN0aW1lb3V0RXJyb3IpO1xuICAgICAgICAgICAgfSwgb3B0aW9ucy50aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICB2b2lkIHRoaXMucmVydW4oKTtcbiAgICB9XG4gICAgZ2V0IHJlc3VsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Jlc3VsdC52YWx1ZU9yVGhyb3coKTtcbiAgICB9XG4gICAgYXN5bmMgcmVydW4oKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJldiBvZiB0aGlzLiNyZXJ1bnMpIHtcbiAgICAgICAgICAgIHByZXYuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNyZXJ1bnMubGVuZ3RoID0gMDtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgdGhpcy4jcmVydW5zLnB1c2goY29udHJvbGxlcik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuI3BvbGxpbmcpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdyYWYnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNwb2xsZXIgPSBhd2FpdCB0aGlzLiN3b3JsZC5ldmFsdWF0ZUhhbmRsZSgoeyBSQUZQb2xsZXIsIGNyZWF0ZUZ1bmN0aW9uIH0sIGZuLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmdW4gPSBjcmVhdGVGdW5jdGlvbihmbik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJBRlBvbGxlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1biguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LCBMYXp5QXJnLmNyZWF0ZShjb250ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnB1cHBldGVlclV0aWw7XG4gICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLiNmbiwgLi4udGhpcy4jYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ211dGF0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcG9sbGVyID0gYXdhaXQgdGhpcy4jd29ybGQuZXZhbHVhdGVIYW5kbGUoKHsgTXV0YXRpb25Qb2xsZXIsIGNyZWF0ZUZ1bmN0aW9uIH0sIHJvb3QsIGZuLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmdW4gPSBjcmVhdGVGdW5jdGlvbihmbik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE11dGF0aW9uUG9sbGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcm9vdCB8fCBkb2N1bWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIExhenlBcmcuY3JlYXRlKGNvbnRleHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHVwcGV0ZWVyVXRpbDtcbiAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuI3Jvb3QsIHRoaXMuI2ZuLCAuLi50aGlzLiNhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcG9sbGVyID0gYXdhaXQgdGhpcy4jd29ybGQuZXZhbHVhdGVIYW5kbGUoKHsgSW50ZXJ2YWxQb2xsZXIsIGNyZWF0ZUZ1bmN0aW9uIH0sIG1zLCBmbiwgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVuID0gY3JlYXRlRnVuY3Rpb24oZm4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbFBvbGxlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1biguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG1zKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgTGF6eUFyZy5jcmVhdGUoY29udGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wdXBwZXRlZXJVdGlsO1xuICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy4jcG9sbGluZywgdGhpcy4jZm4sIC4uLnRoaXMuI2FyZ3MpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3BvbGxlci5ldmFsdWF0ZShwb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgcG9sbGVyLnN0YXJ0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI3BvbGxlci5ldmFsdWF0ZUhhbmRsZShwb2xsZXIgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb2xsZXIucmVzdWx0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuI3Jlc3VsdC5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRlcm1pbmF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBiYWRFcnJvciA9IHRoaXMuZ2V0QmFkRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgaWYgKGJhZEVycm9yKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy50ZXJtaW5hdGUoYmFkRXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHRlcm1pbmF0ZShlcnJvcikge1xuICAgICAgICB0aGlzLiN3b3JsZC50YXNrTWFuYWdlci5kZWxldGUodGhpcyk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0aW1lb3V0KTtcbiAgICAgICAgaWYgKGVycm9yICYmICF0aGlzLiNyZXN1bHQuZmluaXNoZWQoKSkge1xuICAgICAgICAgICAgdGhpcy4jcmVzdWx0LnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3BvbGxlcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNwb2xsZXIuZXZhbHVhdGVIYW5kbGUoYXN5bmMgKHBvbGxlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwb2xsZXIuc3RvcCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNwb2xsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcG9sbGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jcG9sbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIHNpbmNlIHRoZXkgbW9zdCBsaWtlbHkgY29tZSBmcm9tIGxvdy1sZXZlbCBjbGVhbnVwLlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vdCBhbGwgZXJyb3JzIGxlYWQgdG8gdGVybWluYXRpb24uIFRoZXkgdXN1YWxseSBpbXBseSB3ZSBuZWVkIHRvIHJlcnVuIHRoZSB0YXNrLlxuICAgICAqL1xuICAgIGdldEJhZEVycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChpc0Vycm9yTGlrZShlcnJvcikpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gZnJhbWUgaXMgZGV0YWNoZWQgdGhlIHRhc2sgc2hvdWxkIGhhdmUgYmVlbiB0ZXJtaW5hdGVkIGJ5IHRoZSBJc29sYXRlZFdvcmxkLlxuICAgICAgICAgICAgLy8gVGhpcyBjYW4gZmFpbCBpZiB3ZSB3ZXJlIGFkZGluZyB0aGlzIHRhc2sgd2hpbGUgdGhlIGZyYW1lIHdhcyBkZXRhY2hlZCxcbiAgICAgICAgICAgIC8vIHNvIHdlIHRlcm1pbmF0ZSBoZXJlIGluc3RlYWQuXG4gICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRXhlY3V0aW9uIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBpbiBkZXRhY2hlZCBmcmFtZScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignV2FpdGluZyBmYWlsZWQ6IEZyYW1lIGRldGFjaGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXaGVuIHRoZSBwYWdlIGlzIG5hdmlnYXRlZCwgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQuXG4gICAgICAgICAgICAvLyBXZSB3aWxsIHRyeSBhZ2FpbiBpbiB0aGUgbmV3IGV4ZWN1dGlvbiBjb250ZXh0LlxuICAgICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0V4ZWN1dGlvbiBjb250ZXh0IHdhcyBkZXN0cm95ZWQnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGNvdWxkIGhhdmUgdHJpZWQgdG8gZXZhbHVhdGUgaW4gYSBjb250ZXh0IHdoaWNoIHdhcyBhbHJlYWR5XG4gICAgICAgICAgICAvLyBkZXN0cm95ZWQuXG4gICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnQ2Fubm90IGZpbmQgY29udGV4dCB3aXRoIHNwZWNpZmllZCBpZCcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRXJyb3JzIGNvbWluZyBmcm9tIFdlYkRyaXZlciBCaURpLiBUT0RPOiBBZGp1c3QgbWVzc2FnZXMgYWZ0ZXJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93M2Mvd2ViZHJpdmVyLWJpZGkvaXNzdWVzLzU0MCBpcyByZXNvbHZlZC5cbiAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQWJvcnRFcnJvcjogQWN0b3IgJ01lc3NhZ2VIYW5kbGVyRnJhbWUnIGRlc3Ryb3llZFwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdXYWl0VGFzayBmYWlsZWQgd2l0aCBhbiBlcnJvcicsIHtcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tNYW5hZ2VyIHtcbiAgICAjdGFza3MgPSBuZXcgU2V0KCk7XG4gICAgYWRkKHRhc2spIHtcbiAgICAgICAgdGhpcy4jdGFza3MuYWRkKHRhc2spO1xuICAgIH1cbiAgICBkZWxldGUodGFzaykge1xuICAgICAgICB0aGlzLiN0YXNrcy5kZWxldGUodGFzayk7XG4gICAgfVxuICAgIHRlcm1pbmF0ZUFsbChlcnJvcikge1xuICAgICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgdGhpcy4jdGFza3MpIHtcbiAgICAgICAgICAgIHZvaWQgdGFzay50ZXJtaW5hdGUoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3Rhc2tzLmNsZWFyKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlcnVuQWxsKCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbLi4udGhpcy4jdGFza3NdLm1hcCh0YXNrID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0YXNrLnJlcnVuKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1XYWl0VGFzay5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgUXVlcnlIYW5kbGVyLCB9IGZyb20gJy4vUXVlcnlIYW5kbGVyLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBYUGF0aFF1ZXJ5SGFuZGxlciBleHRlbmRzIFF1ZXJ5SGFuZGxlciB7XG4gICAgc3RhdGljIHF1ZXJ5U2VsZWN0b3JBbGwgPSAoZWxlbWVudCwgc2VsZWN0b3IsIHsgeHBhdGhRdWVyeVNlbGVjdG9yQWxsIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHhwYXRoUXVlcnlTZWxlY3RvckFsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfTtcbiAgICBzdGF0aWMgcXVlcnlTZWxlY3RvciA9IChlbGVtZW50LCBzZWxlY3RvciwgeyB4cGF0aFF1ZXJ5U2VsZWN0b3JBbGwgfSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiB4cGF0aFF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudCwgc2VsZWN0b3IsIDEpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1YUGF0aFF1ZXJ5SGFuZGxlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9Ccm93c2VyV2ViU29ja2V0VHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FsbGJhY2tSZWdpc3RyeS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbmZpZ3VyYXRpb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25uZWN0aW9uVHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQ29ubmVjdE9wdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db25zb2xlTWVzc2FnZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0Nvb2tpZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0RlYnVnLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRGV2aWNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXJyb3JzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXZlbnRFbWl0dGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRmlsZUNob29zZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRRdWVyeUhhbmRsZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9IYW5kbGVJdGVyYXRvci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0xhenlBcmcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9OZXR3b3JrTWFuYWdlckV2ZW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1BERk9wdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QaWVyY2VRdWVyeUhhbmRsZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QUXVlcnlIYW5kbGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHJvZHVjdC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1BTZWxlY3RvclBhcnNlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1B1cHBldGVlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5SGFuZGxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1NjcmlwdEluamVjdG9yLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vU2VjdXJpdHlEZXRhaWxzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGFza1F1ZXVlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dFF1ZXJ5SGFuZGxlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1RpbWVvdXRTZXR0aW5ncy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vVVNLZXlib2FyZExheW91dC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWwuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9WaWV3cG9ydC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1dhaXRUYXNrLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vWFBhdGhRdWVyeUhhbmRsZXIuanMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQge307XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgZmlsdGVyLCBmcm9tLCBmcm9tRXZlbnQsIG1hcCwgbWVyZ2VNYXAsIE5FVkVSLCBPYnNlcnZhYmxlLCB0aW1lciwgfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgZGVidWcgfSBmcm9tICcuL0RlYnVnLmpzJztcbmltcG9ydCB7IFRpbWVvdXRFcnJvciB9IGZyb20gJy4vRXJyb3JzLmpzJztcbmltcG9ydCB7IHBhcGVyRm9ybWF0cyB9IGZyb20gJy4vUERGT3B0aW9ucy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZGVidWdFcnJvciA9IGRlYnVnKCdwdXBwZXRlZXI6ZXJyb3InKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1ZJRVdQT1JUID0gT2JqZWN0LmZyZWV6ZSh7IHdpZHRoOiA4MDAsIGhlaWdodDogNjAwIH0pO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgU09VUkNFX1VSTCA9IFN5bWJvbCgnU291cmNlIFVSTCBmb3IgUHVwcGV0ZWVyIGV2YWx1YXRpb24gc2NyaXB0cycpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFB1cHBldGVlclVSTCB7XG4gICAgc3RhdGljIElOVEVSTkFMX1VSTCA9ICdwcHRyOmludGVybmFsJztcbiAgICBzdGF0aWMgZnJvbUNhbGxTaXRlKGZ1bmN0aW9uTmFtZSwgc2l0ZSkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgUHVwcGV0ZWVyVVJMKCk7XG4gICAgICAgIHVybC4jZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lO1xuICAgICAgICB1cmwuI3NpdGVTdHJpbmcgPSBzaXRlLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuICAgIHN0YXRpYyBwYXJzZSA9ICh1cmwpID0+IHtcbiAgICAgICAgdXJsID0gdXJsLnNsaWNlKCdwcHRyOicubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgW2Z1bmN0aW9uTmFtZSA9ICcnLCBzaXRlU3RyaW5nID0gJyddID0gdXJsLnNwbGl0KCc7Jyk7XG4gICAgICAgIGNvbnN0IHB1cHBldGVlclVybCA9IG5ldyBQdXBwZXRlZXJVUkwoKTtcbiAgICAgICAgcHVwcGV0ZWVyVXJsLiNmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgIHB1cHBldGVlclVybC4jc2l0ZVN0cmluZyA9IGRlY29kZVVSSUNvbXBvbmVudChzaXRlU3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIHB1cHBldGVlclVybDtcbiAgICB9O1xuICAgIHN0YXRpYyBpc1B1cHBldGVlclVSTCA9ICh1cmwpID0+IHtcbiAgICAgICAgcmV0dXJuIHVybC5zdGFydHNXaXRoKCdwcHRyOicpO1xuICAgIH07XG4gICAgI2Z1bmN0aW9uTmFtZTtcbiAgICAjc2l0ZVN0cmluZztcbiAgICBnZXQgZnVuY3Rpb25OYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZnVuY3Rpb25OYW1lO1xuICAgIH1cbiAgICBnZXQgc2l0ZVN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NpdGVTdHJpbmc7XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYHBwdHI6JHtbXG4gICAgICAgICAgICB0aGlzLiNmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQodGhpcy4jc2l0ZVN0cmluZyksXG4gICAgICAgIF0uam9pbignOycpfWA7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTb3VyY2VQdXBwZXRlZXJVUkxJZk5vbmUgPSAoZnVuY3Rpb25OYW1lLCBvYmplY3QpID0+IHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgU09VUkNFX1VSTCkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWwgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtcbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IChfLCBzdGFjaykgPT4ge1xuICAgICAgICAvLyBGaXJzdCBlbGVtZW50IGlzIHRoZSBmdW5jdGlvbi5cbiAgICAgICAgLy8gU2Vjb25kIGVsZW1lbnQgaXMgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uLlxuICAgICAgICAvLyBUaGlyZCBlbGVtZW50IGlzIHRoZSBjYWxsZXIgb2YgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uXG4gICAgICAgIC8vIHdoaWNoIGlzIHByZWNpc2VseSB3aGF0IHdlIHdhbnQuXG4gICAgICAgIHJldHVybiBzdGFja1syXTtcbiAgICB9O1xuICAgIGNvbnN0IHNpdGUgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IG9yaWdpbmFsO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG9iamVjdCwge1xuICAgICAgICBbU09VUkNFX1VSTF06IFB1cHBldGVlclVSTC5mcm9tQ2FsbFNpdGUoZnVuY3Rpb25OYW1lLCBzaXRlKSxcbiAgICB9KTtcbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZ2V0U291cmNlUHVwcGV0ZWVyVVJMSWZBdmFpbGFibGUgPSAob2JqZWN0KSA9PiB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIFNPVVJDRV9VUkwpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3RbU09VUkNFX1VSTF07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGlzU3RyaW5nID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCBvYmogaW5zdGFuY2VvZiBTdHJpbmc7XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGlzTnVtYmVyID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCBvYmogaW5zdGFuY2VvZiBOdW1iZXI7XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGlzUGxhaW5PYmplY3QgPSAob2JqKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaj8uY29uc3RydWN0b3IgPT09IE9iamVjdDtcbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaXNSZWdFeHAgPSAob2JqKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaj8uY29uc3RydWN0b3IgPT09IFJlZ0V4cDtcbn07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaXNEYXRlID0gKG9iaikgPT4ge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmo/LmNvbnN0cnVjdG9yID09PSBEYXRlO1xufTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0aW9uU3RyaW5nKGZ1biwgLi4uYXJncykge1xuICAgIGlmIChpc1N0cmluZyhmdW4pKSB7XG4gICAgICAgIGFzc2VydChhcmdzLmxlbmd0aCA9PT0gMCwgJ0Nhbm5vdCBldmFsdWF0ZSBhIHN0cmluZyB3aXRoIGFyZ3VtZW50cycpO1xuICAgICAgICByZXR1cm4gZnVuO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXJpYWxpemVBcmd1bWVudChhcmcpIHtcbiAgICAgICAgaWYgKE9iamVjdC5pcyhhcmcsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIGAoJHtmdW59KSgke2FyZ3MubWFwKHNlcmlhbGl6ZUFyZ3VtZW50KS5qb2luKCcsJyl9KWA7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5sZXQgZnMgPSBudWxsO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEZTUHJvbWlzZXMoKSB7XG4gICAgaWYgKCFmcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZnMgPSBhd2FpdCBpbXBvcnQoJ2ZzL3Byb21pc2VzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB3cml0ZSB0byBhIHBhdGggb3V0c2lkZSBvZiBhIE5vZGUtbGlrZSBlbnZpcm9ubWVudC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWFkYWJsZUFzQnVmZmVyKHJlYWRhYmxlLCBwYXRoKSB7XG4gICAgY29uc3QgYnVmZmVycyA9IFtdO1xuICAgIGNvbnN0IHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgIGlmIChwYXRoKSB7XG4gICAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0RlNQcm9taXNlcygpO1xuICAgICAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgZnMub3BlbihwYXRoLCAndysnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmZmVycy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBmaWxlSGFuZGxlLndyaXRlRmlsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBmaWxlSGFuZGxlLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlcnMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlYWRhYmxlRnJvbVByb3RvY29sU3RyZWFtKGNsaWVudCwgaGFuZGxlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0VW5pdDhBcnJheShkYXRhLCBpc0Jhc2U2NCkge1xuICAgICAgICAgICAgICAgIGlmIChpc0Jhc2U2NCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGF0b2IoZGF0YSksIG0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uY29kZVBvaW50QXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZXIuZW5jb2RlKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBiYXNlNjRFbmNvZGVkLCBlb2YgfSA9IGF3YWl0IGNsaWVudC5zZW5kKCdJTy5yZWFkJywge1xuICAgICAgICAgICAgICAgIGhhbmRsZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGdldFVuaXQ4QXJyYXkoZGF0YSwgYmFzZTY0RW5jb2RlZCA/PyBmYWxzZSkpO1xuICAgICAgICAgICAgaWYgKGVvZikge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5zZW5kKCdJTy5jbG9zZScsIHsgaGFuZGxlIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZURpYWxvZ1R5cGUodHlwZSkge1xuICAgIGxldCBkaWFsb2dUeXBlID0gbnVsbDtcbiAgICBjb25zdCB2YWxpZERpYWxvZ1R5cGVzID0gbmV3IFNldChbXG4gICAgICAgICdhbGVydCcsXG4gICAgICAgICdjb25maXJtJyxcbiAgICAgICAgJ3Byb21wdCcsXG4gICAgICAgICdiZWZvcmV1bmxvYWQnLFxuICAgIF0pO1xuICAgIGlmICh2YWxpZERpYWxvZ1R5cGVzLmhhcyh0eXBlKSkge1xuICAgICAgICBkaWFsb2dUeXBlID0gdHlwZTtcbiAgICB9XG4gICAgYXNzZXJ0KGRpYWxvZ1R5cGUsIGBVbmtub3duIGphdmFzY3JpcHQgZGlhbG9nIHR5cGU6ICR7dHlwZX1gKTtcbiAgICByZXR1cm4gZGlhbG9nVHlwZTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lb3V0KG1zLCBjYXVzZSkge1xuICAgIHJldHVybiBtcyA9PT0gMFxuICAgICAgICA/IE5FVkVSXG4gICAgICAgIDogdGltZXIobXMpLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXJyb3IoYFRpbWVkIG91dCBhZnRlciB3YWl0aW5nICR7bXN9bXNgLCB7IGNhdXNlIH0pO1xuICAgICAgICB9KSk7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVVRJTElUWV9XT1JMRF9OQU1FID0gJ19fcHVwcGV0ZWVyX3V0aWxpdHlfd29ybGRfXyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU09VUkNFX1VSTF9SRUdFWCA9IC9eW1xcMDQwXFx0XSpcXC9cXC9bQCNdIHNvdXJjZVVSTD1cXHMqKFxcUyo/KVxccyokL207XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U291cmNlVXJsQ29tbWVudCh1cmwpIHtcbiAgICByZXR1cm4gYC8vIyBzb3VyY2VVUkw9JHt1cmx9YDtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBORVRXT1JLX0lETEVfVElNRSA9IDUwMDtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBERk9wdGlvbnMob3B0aW9ucyA9IHt9LCBsZW5ndGhVbml0ID0gJ2luJykge1xuICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgICBzY2FsZTogMSxcbiAgICAgICAgZGlzcGxheUhlYWRlckZvb3RlcjogZmFsc2UsXG4gICAgICAgIGhlYWRlclRlbXBsYXRlOiAnJyxcbiAgICAgICAgZm9vdGVyVGVtcGxhdGU6ICcnLFxuICAgICAgICBwcmludEJhY2tncm91bmQ6IGZhbHNlLFxuICAgICAgICBsYW5kc2NhcGU6IGZhbHNlLFxuICAgICAgICBwYWdlUmFuZ2VzOiAnJyxcbiAgICAgICAgcHJlZmVyQ1NTUGFnZVNpemU6IGZhbHNlLFxuICAgICAgICBvbWl0QmFja2dyb3VuZDogZmFsc2UsXG4gICAgICAgIG91dGxpbmU6IGZhbHNlLFxuICAgICAgICB0YWdnZWQ6IHRydWUsXG4gICAgICAgIHdhaXRGb3JGb250czogdHJ1ZSxcbiAgICB9O1xuICAgIGxldCB3aWR0aCA9IDguNTtcbiAgICBsZXQgaGVpZ2h0ID0gMTE7XG4gICAgaWYgKG9wdGlvbnMuZm9ybWF0KSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IHBhcGVyRm9ybWF0c1tvcHRpb25zLmZvcm1hdC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgYXNzZXJ0KGZvcm1hdCwgJ1Vua25vd24gcGFwZXIgZm9ybWF0OiAnICsgb3B0aW9ucy5mb3JtYXQpO1xuICAgICAgICB3aWR0aCA9IGZvcm1hdC53aWR0aDtcbiAgICAgICAgaGVpZ2h0ID0gZm9ybWF0LmhlaWdodDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdpZHRoID0gY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy53aWR0aCwgbGVuZ3RoVW5pdCkgPz8gd2lkdGg7XG4gICAgICAgIGhlaWdodCA9XG4gICAgICAgICAgICBjb252ZXJ0UHJpbnRQYXJhbWV0ZXJUb0luY2hlcyhvcHRpb25zLmhlaWdodCwgbGVuZ3RoVW5pdCkgPz8gaGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBtYXJnaW4gPSB7XG4gICAgICAgIHRvcDogY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy5tYXJnaW4/LnRvcCwgbGVuZ3RoVW5pdCkgfHwgMCxcbiAgICAgICAgbGVmdDogY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy5tYXJnaW4/LmxlZnQsIGxlbmd0aFVuaXQpIHx8IDAsXG4gICAgICAgIGJvdHRvbTogY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMob3B0aW9ucy5tYXJnaW4/LmJvdHRvbSwgbGVuZ3RoVW5pdCkgfHwgMCxcbiAgICAgICAgcmlnaHQ6IGNvbnZlcnRQcmludFBhcmFtZXRlclRvSW5jaGVzKG9wdGlvbnMubWFyZ2luPy5yaWdodCwgbGVuZ3RoVW5pdCkgfHwgMCxcbiAgICB9O1xuICAgIC8vIFF1aXJrIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTg0MDQ1NSNjNDRcbiAgICBpZiAob3B0aW9ucy5vdXRsaW5lKSB7XG4gICAgICAgIG9wdGlvbnMudGFnZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmYXVsdHMsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIG1hcmdpbixcbiAgICB9O1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHVuaXRUb1BpeGVscyA9IHtcbiAgICBweDogMSxcbiAgICBpbjogOTYsXG4gICAgY206IDM3LjgsXG4gICAgbW06IDMuNzgsXG59O1xuZnVuY3Rpb24gY29udmVydFByaW50UGFyYW1ldGVyVG9JbmNoZXMocGFyYW1ldGVyLCBsZW5ndGhVbml0ID0gJ2luJykge1xuICAgIGlmICh0eXBlb2YgcGFyYW1ldGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgcGl4ZWxzO1xuICAgIGlmIChpc051bWJlcihwYXJhbWV0ZXIpKSB7XG4gICAgICAgIC8vIFRyZWF0IG51bWJlcnMgYXMgcGl4ZWwgdmFsdWVzIHRvIGJlIGFsaWduZWQgd2l0aCBwaGFudG9tJ3MgcGFwZXJTaXplLlxuICAgICAgICBwaXhlbHMgPSBwYXJhbWV0ZXI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzU3RyaW5nKHBhcmFtZXRlcikpIHtcbiAgICAgICAgY29uc3QgdGV4dCA9IHBhcmFtZXRlcjtcbiAgICAgICAgbGV0IHVuaXQgPSB0ZXh0LnN1YnN0cmluZyh0ZXh0Lmxlbmd0aCAtIDIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCB2YWx1ZVRleHQgPSAnJztcbiAgICAgICAgaWYgKHVuaXQgaW4gdW5pdFRvUGl4ZWxzKSB7XG4gICAgICAgICAgICB2YWx1ZVRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCAtIDIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1bmtub3duIHVuaXQgdHJ5IHRvIHBhcnNlIHRoZSB3aG9sZSBwYXJhbWV0ZXIgYXMgbnVtYmVyIG9mIHBpeGVscy5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHBoYW50b20ncyBwYXBlclNpemUgYmVoYXZpb3IuXG4gICAgICAgICAgICB1bml0ID0gJ3B4JztcbiAgICAgICAgICAgIHZhbHVlVGV4dCA9IHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBOdW1iZXIodmFsdWVUZXh0KTtcbiAgICAgICAgYXNzZXJ0KCFpc05hTih2YWx1ZSksICdGYWlsZWQgdG8gcGFyc2UgcGFyYW1ldGVyIHZhbHVlOiAnICsgdGV4dCk7XG4gICAgICAgIHBpeGVscyA9IHZhbHVlICogdW5pdFRvUGl4ZWxzW3VuaXRdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYWdlLnBkZigpIENhbm5vdCBoYW5kbGUgcGFyYW1ldGVyIHR5cGU6ICcgKyB0eXBlb2YgcGFyYW1ldGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHBpeGVscyAvIHVuaXRUb1BpeGVsc1tsZW5ndGhVbml0XTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRW1pdHRlckV2ZW50KGVtaXR0ZXIsIGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChldmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIGVtaXR0ZXIub24oZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBlbWl0dGVyLm9mZihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQWJvcnRTaWduYWwoc2lnbmFsLCBjYXVzZSkge1xuICAgIHJldHVybiBzaWduYWxcbiAgICAgICAgPyBmcm9tRXZlbnQoc2lnbmFsLCAnYWJvcnQnKS5waXBlKG1hcCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2lnbmFsLnJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgc2lnbmFsLnJlYXNvbi5jYXVzZSA9IGNhdXNlO1xuICAgICAgICAgICAgICAgIHRocm93IHNpZ25hbC5yZWFzb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc2lnbmFsLnJlYXNvbiwgeyBjYXVzZSB9KTtcbiAgICAgICAgfSkpXG4gICAgICAgIDogTkVWRVI7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyQXN5bmMocHJlZGljYXRlKSB7XG4gICAgcmV0dXJuIG1lcmdlTWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4gZnJvbShQcm9taXNlLnJlc29sdmUocHJlZGljYXRlKHZhbHVlKSkpLnBpcGUoZmlsdGVyKGlzTWF0Y2ggPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGlzTWF0Y2g7XG4gICAgICAgIH0pLCBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaXNOb2RlID0gISEodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MudmVyc2lvbik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbnZpcm9ubWVudC5qcy5tYXAiLCIvKipcbiAqIEphdmFTY3JpcHQgY29kZSB0aGF0IHByb3ZpZGVzIHRoZSBwdXBwZXRlZXIgdXRpbGl0aWVzLiBTZWUgdGhlXG4gKiBbUkVBRE1FXShodHRwczovL2dpdGh1Yi5jb20vcHVwcGV0ZWVyL3B1cHBldGVlci9ibG9iL21haW4vc3JjL2luamVjdGVkL1JFQURNRS5tZClcbiAqIGZvciBpbmplY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBzb3VyY2UgPSBcIlxcXCJ1c2Ugc3RyaWN0XFxcIjt2YXIgZz1PYmplY3QuZGVmaW5lUHJvcGVydHk7dmFyIFg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgQj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczt2YXIgWT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBsPSh0LGUpPT57Zm9yKHZhciByIGluIGUpZyh0LHIse2dldDplW3JdLGVudW1lcmFibGU6ITB9KX0sSj0odCxlLHIsbyk9PntpZihlJiZ0eXBlb2YgZT09XFxcIm9iamVjdFxcXCJ8fHR5cGVvZiBlPT1cXFwiZnVuY3Rpb25cXFwiKWZvcihsZXQgbiBvZiBCKGUpKSFZLmNhbGwodCxuKSYmbiE9PXImJmcodCxuLHtnZXQ6KCk9PmVbbl0sZW51bWVyYWJsZTohKG89WChlLG4pKXx8by5lbnVtZXJhYmxlfSk7cmV0dXJuIHR9O3ZhciB6PXQ9PkooZyh7fSxcXFwiX19lc01vZHVsZVxcXCIse3ZhbHVlOiEwfSksdCk7dmFyIHBlPXt9O2wocGUse2RlZmF1bHQ6KCk9PmhlfSk7bW9kdWxlLmV4cG9ydHM9eihwZSk7dmFyIE49Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHIpe3N1cGVyKGUsciksdGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWV9fSxwPWNsYXNzIGV4dGVuZHMgTnt9O3ZhciBjPWNsYXNzIHR7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gbmV3IHQoZSl9c3RhdGljIGFzeW5jIHJhY2UoZSl7bGV0IHI9bmV3IFNldDt0cnl7bGV0IG89ZS5tYXAobj0+biBpbnN0YW5jZW9mIHQ/KG4uI24mJnIuYWRkKG4pLG4udmFsdWVPclRocm93KCkpOm4pO3JldHVybiBhd2FpdCBQcm9taXNlLnJhY2Uobyl9ZmluYWxseXtmb3IobGV0IG8gb2YgcilvLnJlamVjdChuZXcgRXJyb3IoXFxcIlRpbWVvdXQgY2xlYXJlZFxcXCIpKX19I2U9ITE7I3I9ITE7I287I3Q7I2E9bmV3IFByb21pc2UoZT0+e3RoaXMuI3Q9ZX0pOyNuOyNpO2NvbnN0cnVjdG9yKGUpe2UmJmUudGltZW91dD4wJiYodGhpcy4jaT1uZXcgcChlLm1lc3NhZ2UpLHRoaXMuI249c2V0VGltZW91dCgoKT0+e3RoaXMucmVqZWN0KHRoaXMuI2kpfSxlLnRpbWVvdXQpKX0jbChlKXtjbGVhclRpbWVvdXQodGhpcy4jbiksdGhpcy4jbz1lLHRoaXMuI3QoKX1yZXNvbHZlKGUpe3RoaXMuI3J8fHRoaXMuI2V8fCh0aGlzLiNlPSEwLHRoaXMuI2woZSkpfXJlamVjdChlKXt0aGlzLiNyfHx0aGlzLiNlfHwodGhpcy4jcj0hMCx0aGlzLiNsKGUpKX1yZXNvbHZlZCgpe3JldHVybiB0aGlzLiNlfWZpbmlzaGVkKCl7cmV0dXJuIHRoaXMuI2V8fHRoaXMuI3J9dmFsdWUoKXtyZXR1cm4gdGhpcy4jb30jczt2YWx1ZU9yVGhyb3coKXtyZXR1cm4gdGhpcy4jc3x8KHRoaXMuI3M9KGFzeW5jKCk9PntpZihhd2FpdCB0aGlzLiNhLHRoaXMuI3IpdGhyb3cgdGhpcy4jbztyZXR1cm4gdGhpcy4jb30pKCkpLHRoaXMuI3N9fTt2YXIgTD1uZXcgTWFwLEY9dD0+e2xldCBlPUwuZ2V0KHQpO3JldHVybiBlfHwoZT1uZXcgRnVuY3Rpb24oYHJldHVybiAke3R9YCkoKSxMLnNldCh0LGUpLGUpfTt2YXIgeD17fTtsKHgse2FyaWFRdWVyeVNlbGVjdG9yOigpPT5HLGFyaWFRdWVyeVNlbGVjdG9yQWxsOigpPT5ifSk7dmFyIEc9KHQsZSk9Pmdsb2JhbFRoaXMuX19hcmlhUXVlcnlTZWxlY3Rvcih0LGUpLGI9YXN5bmMgZnVuY3Rpb24qKHQsZSl7eWllbGQqYXdhaXQgZ2xvYmFsVGhpcy5fX2FyaWFRdWVyeVNlbGVjdG9yQWxsKHQsZSl9O3ZhciBFPXt9O2woRSx7Y3NzUXVlcnlTZWxlY3RvcjooKT0+Syxjc3NRdWVyeVNlbGVjdG9yQWxsOigpPT5afSk7dmFyIEs9KHQsZSk9PnQucXVlcnlTZWxlY3RvcihlKSxaPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChlKX07dmFyIEE9e307bChBLHtjdXN0b21RdWVyeVNlbGVjdG9yczooKT0+UH0pO3ZhciB2PWNsYXNzeyNlPW5ldyBNYXA7cmVnaXN0ZXIoZSxyKXtpZighci5xdWVyeU9uZSYmci5xdWVyeUFsbCl7bGV0IG89ci5xdWVyeUFsbDtyLnF1ZXJ5T25lPShuLGkpPT57Zm9yKGxldCBzIG9mIG8obixpKSlyZXR1cm4gcztyZXR1cm4gbnVsbH19ZWxzZSBpZihyLnF1ZXJ5T25lJiYhci5xdWVyeUFsbCl7bGV0IG89ci5xdWVyeU9uZTtyLnF1ZXJ5QWxsPShuLGkpPT57bGV0IHM9byhuLGkpO3JldHVybiBzP1tzXTpbXX19ZWxzZSBpZighci5xdWVyeU9uZXx8IXIucXVlcnlBbGwpdGhyb3cgbmV3IEVycm9yKFxcXCJBdCBsZWFzdCBvbmUgcXVlcnkgbWV0aG9kIG11c3QgYmUgZGVmaW5lZC5cXFwiKTt0aGlzLiNlLnNldChlLHtxdWVyeVNlbGVjdG9yOnIucXVlcnlPbmUscXVlcnlTZWxlY3RvckFsbDpyLnF1ZXJ5QWxsfSl9dW5yZWdpc3RlcihlKXt0aGlzLiNlLmRlbGV0ZShlKX1nZXQoZSl7cmV0dXJuIHRoaXMuI2UuZ2V0KGUpfWNsZWFyKCl7dGhpcy4jZS5jbGVhcigpfX0sUD1uZXcgdjt2YXIgUj17fTtsKFIse3BpZXJjZVF1ZXJ5U2VsZWN0b3I6KCk9PmVlLHBpZXJjZVF1ZXJ5U2VsZWN0b3JBbGw6KCk9PnRlfSk7dmFyIGVlPSh0LGUpPT57bGV0IHI9bnVsbCxvPW49PntsZXQgaT1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKG4sTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO2Rve2xldCBzPWkuY3VycmVudE5vZGU7cy5zaGFkb3dSb290JiZvKHMuc2hhZG93Um9vdCksIShzIGluc3RhbmNlb2YgU2hhZG93Um9vdCkmJnMhPT1uJiYhciYmcy5tYXRjaGVzKGUpJiYocj1zKX13aGlsZSghciYmaS5uZXh0Tm9kZSgpKX07cmV0dXJuIHQgaW5zdGFuY2VvZiBEb2N1bWVudCYmKHQ9dC5kb2N1bWVudEVsZW1lbnQpLG8odCkscn0sdGU9KHQsZSk9PntsZXQgcj1bXSxvPW49PntsZXQgaT1kb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKG4sTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO2Rve2xldCBzPWkuY3VycmVudE5vZGU7cy5zaGFkb3dSb290JiZvKHMuc2hhZG93Um9vdCksIShzIGluc3RhbmNlb2YgU2hhZG93Um9vdCkmJnMhPT1uJiZzLm1hdGNoZXMoZSkmJnIucHVzaChzKX13aGlsZShpLm5leHROb2RlKCkpfTtyZXR1cm4gdCBpbnN0YW5jZW9mIERvY3VtZW50JiYodD10LmRvY3VtZW50RWxlbWVudCksbyh0KSxyfTt2YXIgdT0odCxlKT0+e2lmKCF0KXRocm93IG5ldyBFcnJvcihlKX07dmFyIHk9Y2xhc3N7I2U7I3I7I287I3Q7Y29uc3RydWN0b3IoZSxyKXt0aGlzLiNlPWUsdGhpcy4jcj1yfWFzeW5jIHN0YXJ0KCl7bGV0IGU9dGhpcy4jdD1jLmNyZWF0ZSgpLHI9YXdhaXQgdGhpcy4jZSgpO2lmKHIpe2UucmVzb2x2ZShyKTtyZXR1cm59dGhpcy4jbz1uZXcgTXV0YXRpb25PYnNlcnZlcihhc3luYygpPT57bGV0IG89YXdhaXQgdGhpcy4jZSgpO28mJihlLnJlc29sdmUobyksYXdhaXQgdGhpcy5zdG9wKCkpfSksdGhpcy4jby5vYnNlcnZlKHRoaXMuI3Ise2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwLGF0dHJpYnV0ZXM6ITB9KX1hc3luYyBzdG9wKCl7dSh0aGlzLiN0LFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jdC5maW5pc2hlZCgpfHx0aGlzLiN0LnJlamVjdChuZXcgRXJyb3IoXFxcIlBvbGxpbmcgc3RvcHBlZFxcXCIpKSx0aGlzLiNvJiYodGhpcy4jby5kaXNjb25uZWN0KCksdGhpcy4jbz12b2lkIDApfXJlc3VsdCgpe3JldHVybiB1KHRoaXMuI3QsXFxcIlBvbGxpbmcgbmV2ZXIgc3RhcnRlZC5cXFwiKSx0aGlzLiN0LnZhbHVlT3JUaHJvdygpfX0sdz1jbGFzc3sjZTsjcjtjb25zdHJ1Y3RvcihlKXt0aGlzLiNlPWV9YXN5bmMgc3RhcnQoKXtsZXQgZT10aGlzLiNyPWMuY3JlYXRlKCkscj1hd2FpdCB0aGlzLiNlKCk7aWYocil7ZS5yZXNvbHZlKHIpO3JldHVybn1sZXQgbz1hc3luYygpPT57aWYoZS5maW5pc2hlZCgpKXJldHVybjtsZXQgbj1hd2FpdCB0aGlzLiNlKCk7aWYoIW4pe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobyk7cmV0dXJufWUucmVzb2x2ZShuKSxhd2FpdCB0aGlzLnN0b3AoKX07d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShvKX1hc3luYyBzdG9wKCl7dSh0aGlzLiNyLFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jci5maW5pc2hlZCgpfHx0aGlzLiNyLnJlamVjdChuZXcgRXJyb3IoXFxcIlBvbGxpbmcgc3RvcHBlZFxcXCIpKX1yZXN1bHQoKXtyZXR1cm4gdSh0aGlzLiNyLFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jci52YWx1ZU9yVGhyb3coKX19LFQ9Y2xhc3N7I2U7I3I7I287I3Q7Y29uc3RydWN0b3IoZSxyKXt0aGlzLiNlPWUsdGhpcy4jcj1yfWFzeW5jIHN0YXJ0KCl7bGV0IGU9dGhpcy4jdD1jLmNyZWF0ZSgpLHI9YXdhaXQgdGhpcy4jZSgpO2lmKHIpe2UucmVzb2x2ZShyKTtyZXR1cm59dGhpcy4jbz1zZXRJbnRlcnZhbChhc3luYygpPT57bGV0IG89YXdhaXQgdGhpcy4jZSgpO28mJihlLnJlc29sdmUobyksYXdhaXQgdGhpcy5zdG9wKCkpfSx0aGlzLiNyKX1hc3luYyBzdG9wKCl7dSh0aGlzLiN0LFxcXCJQb2xsaW5nIG5ldmVyIHN0YXJ0ZWQuXFxcIiksdGhpcy4jdC5maW5pc2hlZCgpfHx0aGlzLiN0LnJlamVjdChuZXcgRXJyb3IoXFxcIlBvbGxpbmcgc3RvcHBlZFxcXCIpKSx0aGlzLiNvJiYoY2xlYXJJbnRlcnZhbCh0aGlzLiNvKSx0aGlzLiNvPXZvaWQgMCl9cmVzdWx0KCl7cmV0dXJuIHUodGhpcy4jdCxcXFwiUG9sbGluZyBuZXZlciBzdGFydGVkLlxcXCIpLHRoaXMuI3QudmFsdWVPclRocm93KCl9fTt2YXIgXz17fTtsKF8se1BDb21iaW5hdG9yOigpPT5ILHBRdWVyeVNlbGVjdG9yOigpPT5mZSxwUXVlcnlTZWxlY3RvckFsbDooKT0+JH0pO3ZhciBhPWNsYXNze3N0YXRpYyBhc3luYyptYXAoZSxyKXtmb3IgYXdhaXQobGV0IG8gb2YgZSl5aWVsZCBhd2FpdCByKG8pfXN0YXRpYyBhc3luYypmbGF0TWFwKGUscil7Zm9yIGF3YWl0KGxldCBvIG9mIGUpeWllbGQqcihvKX1zdGF0aWMgYXN5bmMgY29sbGVjdChlKXtsZXQgcj1bXTtmb3IgYXdhaXQobGV0IG8gb2YgZSlyLnB1c2gobyk7cmV0dXJuIHJ9c3RhdGljIGFzeW5jIGZpcnN0KGUpe2ZvciBhd2FpdChsZXQgciBvZiBlKXJldHVybiByfX07dmFyIEM9e307bChDLHt0ZXh0UXVlcnlTZWxlY3RvckFsbDooKT0+bX0pO3ZhciByZT1uZXcgU2V0KFtcXFwiY2hlY2tib3hcXFwiLFxcXCJpbWFnZVxcXCIsXFxcInJhZGlvXFxcIl0pLG9lPXQ9PnQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudHx8dCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnR8fHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50JiYhcmUuaGFzKHQudHlwZSksbmU9bmV3IFNldChbXFxcIlNDUklQVFxcXCIsXFxcIlNUWUxFXFxcIl0pLGY9dD0+IW5lLmhhcyh0Lm5vZGVOYW1lKSYmIWRvY3VtZW50LmhlYWQ/LmNvbnRhaW5zKHQpLEk9bmV3IFdlYWtNYXAsaj10PT57Zm9yKDt0OylJLmRlbGV0ZSh0KSx0IGluc3RhbmNlb2YgU2hhZG93Um9vdD90PXQuaG9zdDp0PXQucGFyZW50Tm9kZX0sVz1uZXcgV2Vha1NldCxzZT1uZXcgTXV0YXRpb25PYnNlcnZlcih0PT57Zm9yKGxldCBlIG9mIHQpaihlLnRhcmdldCl9KSxkPXQ9PntsZXQgZT1JLmdldCh0KTtpZihlfHwoZT17ZnVsbDpcXFwiXFxcIixpbW1lZGlhdGU6W119LCFmKHQpKSlyZXR1cm4gZTtsZXQgcj1cXFwiXFxcIjtpZihvZSh0KSllLmZ1bGw9dC52YWx1ZSxlLmltbWVkaWF0ZS5wdXNoKHQudmFsdWUpLHQuYWRkRXZlbnRMaXN0ZW5lcihcXFwiaW5wdXRcXFwiLG89PntqKG8udGFyZ2V0KX0se29uY2U6ITAsY2FwdHVyZTohMH0pO2Vsc2V7Zm9yKGxldCBvPXQuZmlyc3RDaGlsZDtvO289by5uZXh0U2libGluZyl7aWYoby5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXtlLmZ1bGwrPW8ubm9kZVZhbHVlPz9cXFwiXFxcIixyKz1vLm5vZGVWYWx1ZT8/XFxcIlxcXCI7Y29udGludWV9ciYmZS5pbW1lZGlhdGUucHVzaChyKSxyPVxcXCJcXFwiLG8ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGUuZnVsbCs9ZChvKS5mdWxsKX1yJiZlLmltbWVkaWF0ZS5wdXNoKHIpLHQgaW5zdGFuY2VvZiBFbGVtZW50JiZ0LnNoYWRvd1Jvb3QmJihlLmZ1bGwrPWQodC5zaGFkb3dSb290KS5mdWxsKSxXLmhhcyh0KXx8KHNlLm9ic2VydmUodCx7Y2hpbGRMaXN0OiEwLGNoYXJhY3RlckRhdGE6ITAsc3VidHJlZTohMH0pLFcuYWRkKHQpKX1yZXR1cm4gSS5zZXQodCxlKSxlfTt2YXIgbT1mdW5jdGlvbioodCxlKXtsZXQgcj0hMTtmb3IobGV0IG8gb2YgdC5jaGlsZE5vZGVzKWlmKG8gaW5zdGFuY2VvZiBFbGVtZW50JiZmKG8pKXtsZXQgbjtvLnNoYWRvd1Jvb3Q/bj1tKG8uc2hhZG93Um9vdCxlKTpuPW0obyxlKTtmb3IobGV0IGkgb2Ygbil5aWVsZCBpLHI9ITB9cnx8dCBpbnN0YW5jZW9mIEVsZW1lbnQmJmYodCkmJmQodCkuZnVsbC5pbmNsdWRlcyhlKSYmKHlpZWxkIHQpfTt2YXIgaz17fTtsKGsse2NoZWNrVmlzaWJpbGl0eTooKT0+bGUscGllcmNlOigpPT5TLHBpZXJjZUFsbDooKT0+T30pO3ZhciBpZT1bXFxcImhpZGRlblxcXCIsXFxcImNvbGxhcHNlXFxcIl0sbGU9KHQsZSk9PntpZighdClyZXR1cm4gZT09PSExO2lmKGU9PT12b2lkIDApcmV0dXJuIHQ7bGV0IHI9dC5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFP3QucGFyZW50RWxlbWVudDp0LG89d2luZG93LmdldENvbXB1dGVkU3R5bGUociksbj1vJiYhaWUuaW5jbHVkZXMoby52aXNpYmlsaXR5KSYmIWFlKHIpO3JldHVybiBlPT09bj90OiExfTtmdW5jdGlvbiBhZSh0KXtsZXQgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBlLndpZHRoPT09MHx8ZS5oZWlnaHQ9PT0wfXZhciBjZT10PT5cXFwic2hhZG93Um9vdFxcXCJpbiB0JiZ0LnNoYWRvd1Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290O2Z1bmN0aW9uKlModCl7Y2UodCk/eWllbGQgdC5zaGFkb3dSb290OnlpZWxkIHR9ZnVuY3Rpb24qTyh0KXt0PVModCkubmV4dCgpLnZhbHVlLHlpZWxkIHQ7bGV0IGU9W2RvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIodCxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCldO2ZvcihsZXQgciBvZiBlKXtsZXQgbztmb3IoO289ci5uZXh0Tm9kZSgpOylvLnNoYWRvd1Jvb3QmJih5aWVsZCBvLnNoYWRvd1Jvb3QsZS5wdXNoKGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoby5zaGFkb3dSb290LE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKSkpfX12YXIgUT17fTtsKFEse3hwYXRoUXVlcnlTZWxlY3RvckFsbDooKT0+cX0pO3ZhciBxPWZ1bmN0aW9uKih0LGUscj0tMSl7bGV0IG49KHQub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQpLmV2YWx1YXRlKGUsdCxudWxsLFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9JVEVSQVRPUl9UWVBFKSxpPVtdLHM7Zm9yKDsocz1uLml0ZXJhdGVOZXh0KCkpJiYoaS5wdXNoKHMpLCEociYmaS5sZW5ndGg9PT1yKSk7KTtmb3IobGV0IGg9MDtoPGkubGVuZ3RoO2grKylzPWlbaF0seWllbGQgcyxkZWxldGUgaVtoXX07dmFyIHVlPS9bLVxcXFx3XFxcXFB7QVNDSUl9Kl0vLEg9KHI9PihyLkRlc2NlbmRlbnQ9XFxcIj4+PlxcXCIsci5DaGlsZD1cXFwiPj4+PlxcXCIscikpKEh8fHt9KSxWPXQ9PlxcXCJxdWVyeVNlbGVjdG9yQWxsXFxcImluIHQsTT1jbGFzc3sjZTsjcj1bXTsjbz12b2lkIDA7ZWxlbWVudHM7Y29uc3RydWN0b3IoZSxyKXt0aGlzLmVsZW1lbnRzPVtlXSx0aGlzLiNlPXIsdGhpcy4jdCgpfWFzeW5jIHJ1bigpe2lmKHR5cGVvZiB0aGlzLiNvPT1cXFwic3RyaW5nXFxcIilzd2l0Y2godGhpcy4jby50cmltU3RhcnQoKSl7Y2FzZVxcXCI6c2NvcGVcXFwiOnRoaXMuI3QoKTticmVha31mb3IoO3RoaXMuI28hPT12b2lkIDA7dGhpcy4jdCgpKXtsZXQgZT10aGlzLiNvO3R5cGVvZiBlPT1cXFwic3RyaW5nXFxcIj9lWzBdJiZ1ZS50ZXN0KGVbMF0pP3RoaXMuZWxlbWVudHM9YS5mbGF0TWFwKHRoaXMuZWxlbWVudHMsYXN5bmMgZnVuY3Rpb24qKHIpe1YocikmJih5aWVsZCpyLnF1ZXJ5U2VsZWN0b3JBbGwoZSkpfSk6dGhpcy5lbGVtZW50cz1hLmZsYXRNYXAodGhpcy5lbGVtZW50cyxhc3luYyBmdW5jdGlvbioocil7aWYoIXIucGFyZW50RWxlbWVudCl7aWYoIVYocikpcmV0dXJuO3lpZWxkKnIucXVlcnlTZWxlY3RvckFsbChlKTtyZXR1cm59bGV0IG89MDtmb3IobGV0IG4gb2Ygci5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKWlmKCsrbyxuPT09cilicmVhazt5aWVsZCpyLnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChgOnNjb3BlPjpudGgtY2hpbGQoJHtvfSkke2V9YCl9KTp0aGlzLmVsZW1lbnRzPWEuZmxhdE1hcCh0aGlzLmVsZW1lbnRzLGFzeW5jIGZ1bmN0aW9uKihyKXtzd2l0Y2goZS5uYW1lKXtjYXNlXFxcInRleHRcXFwiOnlpZWxkKm0ocixlLnZhbHVlKTticmVhaztjYXNlXFxcInhwYXRoXFxcIjp5aWVsZCpxKHIsZS52YWx1ZSk7YnJlYWs7Y2FzZVxcXCJhcmlhXFxcIjp5aWVsZCpiKHIsZS52YWx1ZSk7YnJlYWs7ZGVmYXVsdDpsZXQgbz1QLmdldChlLm5hbWUpO2lmKCFvKXRocm93IG5ldyBFcnJvcihgVW5rbm93biBzZWxlY3RvciB0eXBlOiAke2UubmFtZX1gKTt5aWVsZCpvLnF1ZXJ5U2VsZWN0b3JBbGwocixlLnZhbHVlKX19KX19I3QoKXtpZih0aGlzLiNyLmxlbmd0aCE9PTApe3RoaXMuI289dGhpcy4jci5zaGlmdCgpO3JldHVybn1pZih0aGlzLiNlLmxlbmd0aD09PTApe3RoaXMuI289dm9pZCAwO3JldHVybn1sZXQgZT10aGlzLiNlLnNoaWZ0KCk7c3dpdGNoKGUpe2Nhc2VcXFwiPj4+PlxcXCI6e3RoaXMuZWxlbWVudHM9YS5mbGF0TWFwKHRoaXMuZWxlbWVudHMsUyksdGhpcy4jdCgpO2JyZWFrfWNhc2VcXFwiPj4+XFxcIjp7dGhpcy5lbGVtZW50cz1hLmZsYXRNYXAodGhpcy5lbGVtZW50cyxPKSx0aGlzLiN0KCk7YnJlYWt9ZGVmYXVsdDp0aGlzLiNyPWUsdGhpcy4jdCgpO2JyZWFrfX19LEQ9Y2xhc3N7I2U9bmV3IFdlYWtNYXA7Y2FsY3VsYXRlKGUscj1bXSl7aWYoZT09PW51bGwpcmV0dXJuIHI7ZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QmJihlPWUuaG9zdCk7bGV0IG89dGhpcy4jZS5nZXQoZSk7aWYobylyZXR1cm5bLi4ubywuLi5yXTtsZXQgbj0wO2ZvcihsZXQgcz1lLnByZXZpb3VzU2libGluZztzO3M9cy5wcmV2aW91c1NpYmxpbmcpKytuO2xldCBpPXRoaXMuY2FsY3VsYXRlKGUucGFyZW50Tm9kZSxbbl0pO3JldHVybiB0aGlzLiNlLnNldChlLGkpLFsuLi5pLC4uLnJdfX0sVT0odCxlKT0+e2lmKHQubGVuZ3RoK2UubGVuZ3RoPT09MClyZXR1cm4gMDtsZXRbcj0tMSwuLi5vXT10LFtuPS0xLC4uLmldPWU7cmV0dXJuIHI9PT1uP1UobyxpKTpyPG4/LTE6MX0sZGU9YXN5bmMgZnVuY3Rpb24qKHQpe2xldCBlPW5ldyBTZXQ7Zm9yIGF3YWl0KGxldCBvIG9mIHQpZS5hZGQobyk7bGV0IHI9bmV3IEQ7eWllbGQqWy4uLmUudmFsdWVzKCldLm1hcChvPT5bbyxyLmNhbGN1bGF0ZShvKV0pLnNvcnQoKFssb10sWyxuXSk9PlUobyxuKSkubWFwKChbb10pPT5vKX0sJD1mdW5jdGlvbih0LGUpe2xldCByPUpTT04ucGFyc2UoZSk7aWYoci5zb21lKG89PntsZXQgbj0wO3JldHVybiBvLnNvbWUoaT0+KHR5cGVvZiBpPT1cXFwic3RyaW5nXFxcIj8rK246bj0wLG4+MSkpfSkpdGhyb3cgbmV3IEVycm9yKFxcXCJNdWx0aXBsZSBkZWVwIGNvbWJpbmF0b3JzIGZvdW5kIGluIHNlcXVlbmNlLlxcXCIpO3JldHVybiBkZShhLmZsYXRNYXAocixvPT57bGV0IG49bmV3IE0odCxvKTtyZXR1cm4gbi5ydW4oKSxuLmVsZW1lbnRzfSkpfSxmZT1hc3luYyBmdW5jdGlvbih0LGUpe2ZvciBhd2FpdChsZXQgciBvZiAkKHQsZSkpcmV0dXJuIHI7cmV0dXJuIG51bGx9O3ZhciBtZT1PYmplY3QuZnJlZXplKHsuLi54LC4uLkEsLi4uUiwuLi5fLC4uLkMsLi4uaywuLi5RLC4uLkUsRGVmZXJyZWQ6YyxjcmVhdGVGdW5jdGlvbjpGLGNyZWF0ZVRleHRDb250ZW50OmQsSW50ZXJ2YWxQb2xsZXI6VCxpc1N1aXRhYmxlTm9kZUZvclRleHRNYXRjaGluZzpmLE11dGF0aW9uUG9sbGVyOnksUkFGUG9sbGVyOnd9KSxoZT1tZTtcXG5cIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluamVjdGVkLmpzLm1hcCIsIi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBwYWNrYWdlVmVyc2lvbiA9ICcyMi4xMy4wJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vYXBpL2FwaS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NkcC9jZHAuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vY29tbW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmV2aXNpb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbC91dGlsLmpzJztcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBxdWVyeSBoYW5kbGVyIEFQSSBkZWZpbmVkIG9uIHtAbGluayBQdXBwZXRlZXJ9XG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL0N1c3RvbVF1ZXJ5SGFuZGxlci5qcyc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC1icm93c2VyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL2luZGV4LWJyb3dzZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub2RlL25vZGUuanMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCB7IG1rZHRlbXAgfSBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjb21wdXRlU3lzdGVtRXhlY3V0YWJsZVBhdGgsIEJyb3dzZXIgYXMgU3VwcG9ydGVkQnJvd3NlcnMsIENocm9tZVJlbGVhc2VDaGFubmVsIGFzIEJyb3dzZXJzQ2hyb21lUmVsZWFzZUNoYW5uZWwsIH0gZnJvbSAnQHB1cHBldGVlci9icm93c2Vycyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yIH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQuanMnO1xuaW1wb3J0IHsgUHJvZHVjdExhdW5jaGVyIH0gZnJvbSAnLi9Qcm9kdWN0TGF1bmNoZXIuanMnO1xuaW1wb3J0IHsgcm0gfSBmcm9tICcuL3V0aWwvZnMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIENocm9tZUxhdW5jaGVyIGV4dGVuZHMgUHJvZHVjdExhdW5jaGVyIHtcbiAgICBjb25zdHJ1Y3RvcihwdXBwZXRlZXIpIHtcbiAgICAgICAgc3VwZXIocHVwcGV0ZWVyLCAnY2hyb21lJyk7XG4gICAgfVxuICAgIGxhdW5jaChvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24ubG9nTGV2ZWwgPT09ICd3YXJuJyAmJlxuICAgICAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicgJiZcbiAgICAgICAgICAgIHByb2Nlc3MuYXJjaCA9PT0gJ3g2NCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNwdXMgPSBvcy5jcHVzKCk7XG4gICAgICAgICAgICBpZiAoY3B1c1swXT8ubW9kZWwuaW5jbHVkZXMoJ0FwcGxlJykpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oW1xuICAgICAgICAgICAgICAgICAgICAnXFx4MUJbMW1cXHgxQls0M21cXHgxQlszMG0nLFxuICAgICAgICAgICAgICAgICAgICAnRGVncmFkZWQgcGVyZm9ybWFuY2Ugd2FybmluZzpcXHgxQlswbVxceDFCWzMzbScsXG4gICAgICAgICAgICAgICAgICAgICdMYXVuY2hpbmcgQ2hyb21lIG9uIE1hYyBTaWxpY29uIChhcm02NCkgZnJvbSBhbiB4NjQgTm9kZSBpbnN0YWxsYXRpb24gcmVzdWx0cyBpbicsXG4gICAgICAgICAgICAgICAgICAgICdSb3NldHRhIHRyYW5zbGF0aW5nIHRoZSBDaHJvbWUgYmluYXJ5LCBldmVuIGlmIENocm9tZSBpcyBhbHJlYWR5IGFybTY0LiBUaGlzIHdvdWxkJyxcbiAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCBpbiBodWdlIHBlcmZvcm1hbmNlIGlzc3Vlcy4gVG8gcmVzb2x2ZSB0aGlzLCB5b3UgbXVzdCBydW4gUHVwcGV0ZWVyIHdpdGgnLFxuICAgICAgICAgICAgICAgICAgICAnYSB2ZXJzaW9uIG9mIE5vZGUgYnVpbHQgZm9yIGFybTY0LicsXG4gICAgICAgICAgICAgICAgXS5qb2luKCdcXG4gICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIubGF1bmNoKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBjb21wdXRlTGF1bmNoQXJndW1lbnRzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGlnbm9yZURlZmF1bHRBcmdzID0gZmFsc2UsIGFyZ3MgPSBbXSwgcGlwZSA9IGZhbHNlLCBkZWJ1Z2dpbmdQb3J0LCBjaGFubmVsLCBleGVjdXRhYmxlUGF0aCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGNocm9tZUFyZ3VtZW50cyA9IFtdO1xuICAgICAgICBpZiAoIWlnbm9yZURlZmF1bHRBcmdzKSB7XG4gICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaCguLi50aGlzLmRlZmF1bHRBcmdzKG9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlnbm9yZURlZmF1bHRBcmdzKSkge1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goLi4udGhpcy5kZWZhdWx0QXJncyhvcHRpb25zKS5maWx0ZXIoYXJnID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIWlnbm9yZURlZmF1bHRBcmdzLmluY2x1ZGVzKGFyZyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaCguLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNocm9tZUFyZ3VtZW50cy5zb21lKGFyZ3VtZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcmd1bWVudC5zdGFydHNXaXRoKCctLXJlbW90ZS1kZWJ1Z2dpbmctJyk7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBpZiAocGlwZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydCghZGVidWdnaW5nUG9ydCwgJ0Jyb3dzZXIgc2hvdWxkIGJlIGxhdW5jaGVkIHdpdGggZWl0aGVyIHBpcGUgb3IgZGVidWdnaW5nIHBvcnQgLSBub3QgYm90aC4nKTtcbiAgICAgICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaCgnLS1yZW1vdGUtZGVidWdnaW5nLXBpcGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNocm9tZUFyZ3VtZW50cy5wdXNoKGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke2RlYnVnZ2luZ1BvcnQgfHwgMH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgaXNUZW1wVXNlckRhdGFEaXIgPSBmYWxzZTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSB1c2VyIGRhdGEgZGlyIGFyZ3VtZW50LCB3aGljaCB3aWxsIGFsd2F5cyBiZSBzZXQgZXZlblxuICAgICAgICAvLyB3aXRoIGEgY3VzdG9tIGRpcmVjdG9yeSBzcGVjaWZpZWQgdmlhIHRoZSB1c2VyRGF0YURpciBvcHRpb24uXG4gICAgICAgIGxldCB1c2VyRGF0YURpckluZGV4ID0gY2hyb21lQXJndW1lbnRzLmZpbmRJbmRleChhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFyZy5zdGFydHNXaXRoKCctLXVzZXItZGF0YS1kaXInKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh1c2VyRGF0YURpckluZGV4IDwgMCkge1xuICAgICAgICAgICAgaXNUZW1wVXNlckRhdGFEaXIgPSB0cnVlO1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goYC0tdXNlci1kYXRhLWRpcj0ke2F3YWl0IG1rZHRlbXAodGhpcy5nZXRQcm9maWxlUGF0aCgpKX1gKTtcbiAgICAgICAgICAgIHVzZXJEYXRhRGlySW5kZXggPSBjaHJvbWVBcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VyRGF0YURpciA9IGNocm9tZUFyZ3VtZW50c1t1c2VyRGF0YURpckluZGV4XS5zcGxpdCgnPScsIDIpWzFdO1xuICAgICAgICBhc3NlcnQodHlwZW9mIHVzZXJEYXRhRGlyID09PSAnc3RyaW5nJywgJ2AtLXVzZXItZGF0YS1kaXJgIGlzIG1hbGZvcm1lZCcpO1xuICAgICAgICBsZXQgY2hyb21lRXhlY3V0YWJsZSA9IGV4ZWN1dGFibGVQYXRoO1xuICAgICAgICBpZiAoIWNocm9tZUV4ZWN1dGFibGUpIHtcbiAgICAgICAgICAgIGFzc2VydChjaGFubmVsIHx8ICF0aGlzLnB1cHBldGVlci5faXNQdXBwZXRlZXJDb3JlLCBgQW4gXFxgZXhlY3V0YWJsZVBhdGhcXGAgb3IgXFxgY2hhbm5lbFxcYCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgXFxgcHVwcGV0ZWVyLWNvcmVcXGBgKTtcbiAgICAgICAgICAgIGNocm9tZUV4ZWN1dGFibGUgPSB0aGlzLmV4ZWN1dGFibGVQYXRoKGNoYW5uZWwsIG9wdGlvbnMuaGVhZGxlc3MgPz8gdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4ZWN1dGFibGVQYXRoOiBjaHJvbWVFeGVjdXRhYmxlLFxuICAgICAgICAgICAgYXJnczogY2hyb21lQXJndW1lbnRzLFxuICAgICAgICAgICAgaXNUZW1wVXNlckRhdGFEaXIsXG4gICAgICAgICAgICB1c2VyRGF0YURpcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY2xlYW5Vc2VyRGF0YURpcihwYXRoLCBvcHRzKSB7XG4gICAgICAgIGlmIChvcHRzLmlzVGVtcCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBybShwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGRlZmF1bHRBcmdzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZS9jaHJvbWUtbGF1bmNoZXIvYmxvYi9tYWluL2RvY3MvY2hyb21lLWZsYWdzLWZvci10b29scy5tZFxuICAgICAgICBjb25zdCB1c2VyRGlzYWJsZWRGZWF0dXJlcyA9IGdldEZlYXR1cmVzKCctLWRpc2FibGUtZmVhdHVyZXMnLCBvcHRpb25zLmFyZ3MpO1xuICAgICAgICBpZiAob3B0aW9ucy5hcmdzICYmIHVzZXJEaXNhYmxlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlbW92ZU1hdGNoaW5nRmxhZ3Mob3B0aW9ucy5hcmdzLCAnLS1kaXNhYmxlLWZlYXR1cmVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHVybk9uRXhwZXJpbWVudGFsRmVhdHVyZXNGb3JUZXN0aW5nID0gcHJvY2Vzcy5lbnZbJ1BVUFBFVEVFUl9URVNUX0VYUEVSSU1FTlRBTF9DSFJPTUVfRkVBVFVSRVMnXSA9PT0gJ3RydWUnO1xuICAgICAgICAvLyBNZXJnZSBkZWZhdWx0IGRpc2FibGVkIGZlYXR1cmVzIHdpdGggdXNlci1wcm92aWRlZCBvbmVzLCBpZiBhbnkuXG4gICAgICAgIGNvbnN0IGRpc2FibGVkRmVhdHVyZXMgPSBbXG4gICAgICAgICAgICAnVHJhbnNsYXRlJyxcbiAgICAgICAgICAgIC8vIEFjY2VwdENIRnJhbWUgZGlzYWJsZWQgYmVjYXVzZSBvZiBjcmJ1Zy5jb20vMTM0ODEwNi5cbiAgICAgICAgICAgICdBY2NlcHRDSEZyYW1lJyxcbiAgICAgICAgICAgICdNZWRpYVJvdXRlcicsXG4gICAgICAgICAgICAnT3B0aW1pemF0aW9uSGludHMnLFxuICAgICAgICAgICAgLi4uKHR1cm5PbkV4cGVyaW1lbnRhbEZlYXR1cmVzRm9yVGVzdGluZ1xuICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vMTQ5MjA1M1xuICAgICAgICAgICAgICAgICAgICAnUHJvY2Vzc1BlclNpdGVVcFRvTWFpbkZyYW1lVGhyZXNob2xkJyxcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3B1cHBldGVlci9wdXBwZXRlZXIvaXNzdWVzLzEwNzE1XG4gICAgICAgICAgICAgICAgICAgICdJc29sYXRlU2FuZGJveGVkSWZyYW1lcycsXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAuLi51c2VyRGlzYWJsZWRGZWF0dXJlcyxcbiAgICAgICAgXS5maWx0ZXIoZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmVhdHVyZSAhPT0gJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB1c2VyRW5hYmxlZEZlYXR1cmVzID0gZ2V0RmVhdHVyZXMoJy0tZW5hYmxlLWZlYXR1cmVzJywgb3B0aW9ucy5hcmdzKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXJncyAmJiB1c2VyRW5hYmxlZEZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlbW92ZU1hdGNoaW5nRmxhZ3Mob3B0aW9ucy5hcmdzLCAnLS1lbmFibGUtZmVhdHVyZXMnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNZXJnZSBkZWZhdWx0IGVuYWJsZWQgZmVhdHVyZXMgd2l0aCB1c2VyLXByb3ZpZGVkIG9uZXMsIGlmIGFueS5cbiAgICAgICAgY29uc3QgZW5hYmxlZEZlYXR1cmVzID0gW1xuICAgICAgICAgICAgJ1BkZk9vcGlmJyxcbiAgICAgICAgICAgIC8vIEFkZCBmZWF0dXJlcyB0byBlbmFibGUgYnkgZGVmYXVsdCBoZXJlLlxuICAgICAgICAgICAgLi4udXNlckVuYWJsZWRGZWF0dXJlcyxcbiAgICAgICAgXS5maWx0ZXIoZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZmVhdHVyZSAhPT0gJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjaHJvbWVBcmd1bWVudHMgPSBbXG4gICAgICAgICAgICAnLS1hbGxvdy1wcmUtY29tbWl0LWlucHV0JyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYmFja2dyb3VuZC1uZXR3b3JraW5nJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYmFja2dyb3VuZC10aW1lci10aHJvdHRsaW5nJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYmFja2dyb3VuZGluZy1vY2NsdWRlZC13aW5kb3dzJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtYnJlYWtwYWQnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1jbGllbnQtc2lkZS1waGlzaGluZy1kZXRlY3Rpb24nLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1jb21wb25lbnQtZXh0ZW5zaW9ucy13aXRoLWJhY2tncm91bmQtcGFnZXMnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1jb21wb25lbnQtdXBkYXRlJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtZGVmYXVsdC1hcHBzJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtZGV2LXNobS11c2FnZScsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLWV4dGVuc2lvbnMnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1oYW5nLW1vbml0b3InLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1pbmZvYmFycycsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLWlwYy1mbG9vZGluZy1wcm90ZWN0aW9uJyxcbiAgICAgICAgICAgICctLWRpc2FibGUtcG9wdXAtYmxvY2tpbmcnLFxuICAgICAgICAgICAgJy0tZGlzYWJsZS1wcm9tcHQtb24tcmVwb3N0JyxcbiAgICAgICAgICAgICctLWRpc2FibGUtcmVuZGVyZXItYmFja2dyb3VuZGluZycsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLXNlYXJjaC1lbmdpbmUtY2hvaWNlLXNjcmVlbicsXG4gICAgICAgICAgICAnLS1kaXNhYmxlLXN5bmMnLFxuICAgICAgICAgICAgJy0tZW5hYmxlLWF1dG9tYXRpb24nLFxuICAgICAgICAgICAgJy0tZXhwb3J0LXRhZ2dlZC1wZGYnLFxuICAgICAgICAgICAgJy0tZ2VuZXJhdGUtcGRmLWRvY3VtZW50LW91dGxpbmUnLFxuICAgICAgICAgICAgJy0tZm9yY2UtY29sb3ItcHJvZmlsZT1zcmdiJyxcbiAgICAgICAgICAgICctLW1ldHJpY3MtcmVjb3JkaW5nLW9ubHknLFxuICAgICAgICAgICAgJy0tbm8tZmlyc3QtcnVuJyxcbiAgICAgICAgICAgICctLXBhc3N3b3JkLXN0b3JlPWJhc2ljJyxcbiAgICAgICAgICAgICctLXVzZS1tb2NrLWtleWNoYWluJyxcbiAgICAgICAgICAgIGAtLWRpc2FibGUtZmVhdHVyZXM9JHtkaXNhYmxlZEZlYXR1cmVzLmpvaW4oJywnKX1gLFxuICAgICAgICAgICAgYC0tZW5hYmxlLWZlYXR1cmVzPSR7ZW5hYmxlZEZlYXR1cmVzLmpvaW4oJywnKX1gLFxuICAgICAgICBdLmZpbHRlcihhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFyZyAhPT0gJyc7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB7IGRldnRvb2xzID0gZmFsc2UsIGhlYWRsZXNzID0gIWRldnRvb2xzLCBhcmdzID0gW10sIHVzZXJEYXRhRGlyLCB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKHVzZXJEYXRhRGlyKSB7XG4gICAgICAgICAgICBjaHJvbWVBcmd1bWVudHMucHVzaChgLS11c2VyLWRhdGEtZGlyPSR7cGF0aC5yZXNvbHZlKHVzZXJEYXRhRGlyKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGV2dG9vbHMpIHtcbiAgICAgICAgICAgIGNocm9tZUFyZ3VtZW50cy5wdXNoKCctLWF1dG8tb3Blbi1kZXZ0b29scy1mb3ItdGFicycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkbGVzcykge1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goaGVhZGxlc3MgPT09ICdzaGVsbCcgPyAnLS1oZWFkbGVzcycgOiAnLS1oZWFkbGVzcz1uZXcnLCAnLS1oaWRlLXNjcm9sbGJhcnMnLCAnLS1tdXRlLWF1ZGlvJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZ3MuZXZlcnkoYXJnID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcmcuc3RhcnRzV2l0aCgnLScpO1xuICAgICAgICB9KSkge1xuICAgICAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goJ2Fib3V0OmJsYW5rJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2hyb21lQXJndW1lbnRzLnB1c2goLi4uYXJncyk7XG4gICAgICAgIHJldHVybiBjaHJvbWVBcmd1bWVudHM7XG4gICAgfVxuICAgIGV4ZWN1dGFibGVQYXRoKGNoYW5uZWwsIGhlYWRsZXNzKSB7XG4gICAgICAgIGlmIChjaGFubmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tcHV0ZVN5c3RlbUV4ZWN1dGFibGVQYXRoKHtcbiAgICAgICAgICAgICAgICBicm93c2VyOiBTdXBwb3J0ZWRCcm93c2Vycy5DSFJPTUUsXG4gICAgICAgICAgICAgICAgY2hhbm5lbDogY29udmVydFB1cHBldGVlckNoYW5uZWxUb0Jyb3dzZXJzQ2hhbm5lbChjaGFubmVsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUV4ZWN1dGFibGVQYXRoKGhlYWRsZXNzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbnZlcnRQdXBwZXRlZXJDaGFubmVsVG9Ccm93c2Vyc0NoYW5uZWwoY2hhbm5lbCkge1xuICAgIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgICAgICBjYXNlICdjaHJvbWUnOlxuICAgICAgICAgICAgcmV0dXJuIEJyb3dzZXJzQ2hyb21lUmVsZWFzZUNoYW5uZWwuU1RBQkxFO1xuICAgICAgICBjYXNlICdjaHJvbWUtZGV2JzpcbiAgICAgICAgICAgIHJldHVybiBCcm93c2Vyc0Nocm9tZVJlbGVhc2VDaGFubmVsLkRFVjtcbiAgICAgICAgY2FzZSAnY2hyb21lLWJldGEnOlxuICAgICAgICAgICAgcmV0dXJuIEJyb3dzZXJzQ2hyb21lUmVsZWFzZUNoYW5uZWwuQkVUQTtcbiAgICAgICAgY2FzZSAnY2hyb21lLWNhbmFyeSc6XG4gICAgICAgICAgICByZXR1cm4gQnJvd3NlcnNDaHJvbWVSZWxlYXNlQ2hhbm5lbC5DQU5BUlk7XG4gICAgfVxufVxuLyoqXG4gKiBFeHRyYWN0cyBhbGwgZmVhdHVyZXMgZnJvbSB0aGUgZ2l2ZW4gY29tbWFuZC1saW5lIGZsYWdcbiAqIChlLmcuIGAtLWVuYWJsZS1mZWF0dXJlc2AsIGAtLWVuYWJsZS1mZWF0dXJlcz1gKS5cbiAqXG4gKiBFeGFtcGxlIGlucHV0OlxuICogW1wiLS1lbmFibGUtZmVhdHVyZXM9TmV0d29ya1NlcnZpY2UsTmV0d29ya1NlcnZpY2VJblByb2Nlc3NcIiwgXCItLWVuYWJsZS1mZWF0dXJlcz1Gb29cIl1cbiAqXG4gKiBFeGFtcGxlIG91dHB1dDpcbiAqIFtcIk5ldHdvcmtTZXJ2aWNlXCIsIFwiTmV0d29ya1NlcnZpY2VJblByb2Nlc3NcIiwgXCJGb29cIl1cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZlYXR1cmVzKGZsYWcsIG9wdGlvbnMgPSBbXSkge1xuICAgIHJldHVybiBvcHRpb25zXG4gICAgICAgIC5maWx0ZXIocyA9PiB7XG4gICAgICAgIHJldHVybiBzLnN0YXJ0c1dpdGgoZmxhZy5lbmRzV2l0aCgnPScpID8gZmxhZyA6IGAke2ZsYWd9PWApO1xuICAgIH0pXG4gICAgICAgIC5tYXAocyA9PiB7XG4gICAgICAgIHJldHVybiBzLnNwbGl0KG5ldyBSZWdFeHAoYCR7ZmxhZ309XFxcXHMqYCkpWzFdPy50cmltKCk7XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihzID0+IHtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfSk7XG59XG4vKipcbiAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGluLXBsYWNlIGZyb20gdGhlIGdpdmVuIHN0cmluZyBhcnJheVxuICogdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gY29tbWFuZC1saW5lIGZsYWcuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVNYXRjaGluZ0ZsYWdzKGFycmF5LCBmbGFnKSB7XG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtmbGFnfT0uKmApO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICBpZiAocmVnZXgudGVzdChhcnJheVtpXSkpIHtcbiAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaHJvbWVMYXVuY2hlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IHJlbmFtZSwgdW5saW5rLCBta2R0ZW1wIH0gZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQnJvd3NlciBhcyBTdXBwb3J0ZWRCcm93c2VycywgY3JlYXRlUHJvZmlsZSwgQ2FjaGUsIGRldGVjdEJyb3dzZXJQbGF0Zm9ybSwgQnJvd3NlciwgfSBmcm9tICdAcHVwcGV0ZWVyL2Jyb3dzZXJzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBQcm9kdWN0TGF1bmNoZXIgfSBmcm9tICcuL1Byb2R1Y3RMYXVuY2hlci5qcyc7XG5pbXBvcnQgeyBybSB9IGZyb20gJy4vdXRpbC9mcy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgRmlyZWZveExhdW5jaGVyIGV4dGVuZHMgUHJvZHVjdExhdW5jaGVyIHtcbiAgICBjb25zdHJ1Y3RvcihwdXBwZXRlZXIpIHtcbiAgICAgICAgc3VwZXIocHVwcGV0ZWVyLCAnZmlyZWZveCcpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0UHJlZmVyZW5jZXMoZXh0cmFQcmVmc0ZpcmVmb3gsIHByb3RvY29sKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5leHRyYVByZWZzRmlyZWZveCxcbiAgICAgICAgICAgIC4uLihwcm90b2NvbCA9PT0gJ3dlYkRyaXZlckJpRGknXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgZW5hYmxlIHRoZSBXZWJEcml2ZXIgQmlEaSBwcm90b2NvbFxuICAgICAgICAgICAgICAgICAgICAncmVtb3RlLmFjdGl2ZS1wcm90b2NvbHMnOiAxLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGNsb3NlIHRoZSB3aW5kb3cgd2hlbiB0aGUgbGFzdCB0YWIgZ2V0cyBjbG9zZWRcbiAgICAgICAgICAgICAgICAgICAgJ2Jyb3dzZXIudGFicy5jbG9zZVdpbmRvd1dpdGhMYXN0VGFiJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgdmFyaW91cyBlcnJvciBtZXNzYWdlIG9uIHRoZSBjb25zb2xlXG4gICAgICAgICAgICAgICAgICAgIC8vIGplc3QtcHVwcGV0ZWVyIGFzc2VydHMgdGhhdCBubyBlcnJvciBtZXNzYWdlIGlzIGVtaXR0ZWQgYnkgdGhlIGNvbnNvbGVcbiAgICAgICAgICAgICAgICAgICAgJ25ldHdvcmsuY29va2llLmNvb2tpZUJlaGF2aW9yJzogMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gVGVtcG9yYXJpbHkgZm9yY2UgZGlzYWJsZSBCRkNhY2hlIGluIHBhcmVudCAoaHR0cHM6Ly9iaXQubHkvYnVnLTE3MzIyNjMpXG4gICAgICAgICAgICAgICAgICAgICdmaXNzaW9uLmJmY2FjaGVJblBhcmVudCc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGVuYWJsZSB0aGUgQ0RQIHByb3RvY29sXG4gICAgICAgICAgICAgICAgICAgICdyZW1vdGUuYWN0aXZlLXByb3RvY29scyc6IDIsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAvLyBGb3JjZSBhbGwgd2ViIGNvbnRlbnQgdG8gdXNlIGEgc2luZ2xlIGNvbnRlbnQgcHJvY2Vzcy4gVE9ETzogcmVtb3ZlXG4gICAgICAgICAgICAvLyB0aGlzIG9uY2UgRmlyZWZveCBzdXBwb3J0cyBtb3VzZSBldmVudCBkaXNwYXRjaCBmcm9tIHRoZSBtYWluIGZyYW1lXG4gICAgICAgICAgICAvLyBjb250ZXh0LiBPbmNlIHRoaXMgaGFwcGVucywgd2ViQ29udGVudElzb2xhdGlvblN0cmF0ZWd5IHNob3VsZCBvbmx5XG4gICAgICAgICAgICAvLyBiZSBzZXQgZm9yIENEUC4gU2VlXG4gICAgICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzczMzkzXG4gICAgICAgICAgICAnZmlzc2lvbi53ZWJDb250ZW50SXNvbGF0aW9uU3RyYXRlZ3knOiAwLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBhc3luYyBjb21wdXRlTGF1bmNoQXJndW1lbnRzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGlnbm9yZURlZmF1bHRBcmdzID0gZmFsc2UsIGFyZ3MgPSBbXSwgZXhlY3V0YWJsZVBhdGgsIHBpcGUgPSBmYWxzZSwgZXh0cmFQcmVmc0ZpcmVmb3ggPSB7fSwgZGVidWdnaW5nUG9ydCA9IG51bGwsIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBmaXJlZm94QXJndW1lbnRzID0gW107XG4gICAgICAgIGlmICghaWdub3JlRGVmYXVsdEFyZ3MpIHtcbiAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCguLi50aGlzLmRlZmF1bHRBcmdzKG9wdGlvbnMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlnbm9yZURlZmF1bHRBcmdzKSkge1xuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKC4uLnRoaXMuZGVmYXVsdEFyZ3Mob3B0aW9ucykuZmlsdGVyKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFpZ25vcmVEZWZhdWx0QXJncy5pbmNsdWRlcyhhcmcpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZmlyZWZveEFyZ3VtZW50cy5zb21lKGFyZ3VtZW50ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhcmd1bWVudC5zdGFydHNXaXRoKCctLXJlbW90ZS1kZWJ1Z2dpbmctJyk7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBpZiAocGlwZSkge1xuICAgICAgICAgICAgICAgIGFzc2VydChkZWJ1Z2dpbmdQb3J0ID09PSBudWxsLCAnQnJvd3NlciBzaG91bGQgYmUgbGF1bmNoZWQgd2l0aCBlaXRoZXIgcGlwZSBvciBkZWJ1Z2dpbmcgcG9ydCAtIG5vdCBib3RoLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke2RlYnVnZ2luZ1BvcnQgfHwgMH1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdXNlckRhdGFEaXI7XG4gICAgICAgIGxldCBpc1RlbXBVc2VyRGF0YURpciA9IHRydWU7XG4gICAgICAgIC8vIENoZWNrIGZvciB0aGUgcHJvZmlsZSBhcmd1bWVudCwgd2hpY2ggd2lsbCBhbHdheXMgYmUgc2V0IGV2ZW5cbiAgICAgICAgLy8gd2l0aCBhIGN1c3RvbSBkaXJlY3Rvcnkgc3BlY2lmaWVkIHZpYSB0aGUgdXNlckRhdGFEaXIgb3B0aW9uLlxuICAgICAgICBjb25zdCBwcm9maWxlQXJnSW5kZXggPSBmaXJlZm94QXJndW1lbnRzLmZpbmRJbmRleChhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFsnLXByb2ZpbGUnLCAnLS1wcm9maWxlJ10uaW5jbHVkZXMoYXJnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwcm9maWxlQXJnSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB1c2VyRGF0YURpciA9IGZpcmVmb3hBcmd1bWVudHNbcHJvZmlsZUFyZ0luZGV4ICsgMV07XG4gICAgICAgICAgICBpZiAoIXVzZXJEYXRhRGlyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXJlZm94IHByb2ZpbGUgbm90IGZvdW5kIGF0ICcke3VzZXJEYXRhRGlyfSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBjdXN0b20gRmlyZWZveCBwcm9maWxlIGl0IG5lZWRzIHRvIGJlIHBvcHVsYXRlZFxuICAgICAgICAgICAgLy8gd2l0aCByZXF1aXJlZCBwcmVmZXJlbmNlcy5cbiAgICAgICAgICAgIGlzVGVtcFVzZXJEYXRhRGlyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1c2VyRGF0YURpciA9IGF3YWl0IG1rZHRlbXAodGhpcy5nZXRQcm9maWxlUGF0aCgpKTtcbiAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCgnLS1wcm9maWxlJyk7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2godXNlckRhdGFEaXIpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNyZWF0ZVByb2ZpbGUoU3VwcG9ydGVkQnJvd3NlcnMuRklSRUZPWCwge1xuICAgICAgICAgICAgcGF0aDogdXNlckRhdGFEaXIsXG4gICAgICAgICAgICBwcmVmZXJlbmNlczogRmlyZWZveExhdW5jaGVyLmdldFByZWZlcmVuY2VzKGV4dHJhUHJlZnNGaXJlZm94LCBvcHRpb25zLnByb3RvY29sKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBmaXJlZm94RXhlY3V0YWJsZTtcbiAgICAgICAgaWYgKHRoaXMucHVwcGV0ZWVyLl9pc1B1cHBldGVlckNvcmUgfHwgZXhlY3V0YWJsZVBhdGgpIHtcbiAgICAgICAgICAgIGFzc2VydChleGVjdXRhYmxlUGF0aCwgYEFuIFxcYGV4ZWN1dGFibGVQYXRoXFxgIG11c3QgYmUgc3BlY2lmaWVkIGZvciBcXGBwdXBwZXRlZXItY29yZVxcYGApO1xuICAgICAgICAgICAgZmlyZWZveEV4ZWN1dGFibGUgPSBleGVjdXRhYmxlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZpcmVmb3hFeGVjdXRhYmxlID0gdGhpcy5leGVjdXRhYmxlUGF0aCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1RlbXBVc2VyRGF0YURpcixcbiAgICAgICAgICAgIHVzZXJEYXRhRGlyLFxuICAgICAgICAgICAgYXJnczogZmlyZWZveEFyZ3VtZW50cyxcbiAgICAgICAgICAgIGV4ZWN1dGFibGVQYXRoOiBmaXJlZm94RXhlY3V0YWJsZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY2xlYW5Vc2VyRGF0YURpcih1c2VyRGF0YURpciwgb3B0cykge1xuICAgICAgICBpZiAob3B0cy5pc1RlbXApIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcm0odXNlckRhdGFEaXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZGVidWdFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gYW4gZXhpc3RpbmcgdXNlciBwcm9maWxlIGhhcyBiZWVuIHVzZWQgcmVtb3ZlIHRoZSB1c2VyXG4gICAgICAgICAgICAgICAgLy8gcHJlZmVyZW5jZXMgZmlsZSBhbmQgcmVzdG9yZSBwb3NzaWJseSBiYWNrdXBlZCBwcmVmZXJlbmNlcy5cbiAgICAgICAgICAgICAgICBhd2FpdCB1bmxpbmsocGF0aC5qb2luKHVzZXJEYXRhRGlyLCAndXNlci5qcycpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVmc0JhY2t1cFBhdGggPSBwYXRoLmpvaW4odXNlckRhdGFEaXIsICdwcmVmcy5qcy5wdXBwZXRlZXInKTtcbiAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwcmVmc0JhY2t1cFBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZzUGF0aCA9IHBhdGguam9pbih1c2VyRGF0YURpciwgJ3ByZWZzLmpzJyk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHVubGluayhwcmVmc1BhdGgpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZW5hbWUocHJlZnNCYWNrdXBQYXRoLCBwcmVmc1BhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGRlYnVnRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGV4ZWN1dGFibGVQYXRoKCkge1xuICAgICAgICAvLyByZXBsYWNlICdsYXRlc3QnIHBsYWNlaG9sZGVyIHdpdGggYWN0dWFsIGRvd25sb2FkZWQgcmV2aXNpb25cbiAgICAgICAgaWYgKHRoaXMucHVwcGV0ZWVyLmJyb3dzZXJSZXZpc2lvbiA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IENhY2hlKHRoaXMucHVwcGV0ZWVyLmRlZmF1bHREb3dubG9hZFBhdGgpO1xuICAgICAgICAgICAgY29uc3QgaW5zdGFsbGVkRmlyZWZveCA9IGNhY2hlLmdldEluc3RhbGxlZEJyb3dzZXJzKCkuZmluZChicm93c2VyID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGJyb3dzZXIucGxhdGZvcm0gPT09IGRldGVjdEJyb3dzZXJQbGF0Zm9ybSgpICYmXG4gICAgICAgICAgICAgICAgICAgIGJyb3dzZXIuYnJvd3NlciA9PT0gQnJvd3Nlci5GSVJFRk9YKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGluc3RhbGxlZEZpcmVmb3gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbEJyb3dzZXJSZXZpc2lvbiA9IGluc3RhbGxlZEZpcmVmb3guYnVpbGRJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlRXhlY3V0YWJsZVBhdGgoKTtcbiAgICB9XG4gICAgZGVmYXVsdEFyZ3Mob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgZGV2dG9vbHMgPSBmYWxzZSwgaGVhZGxlc3MgPSAhZGV2dG9vbHMsIGFyZ3MgPSBbXSwgdXNlckRhdGFEaXIgPSBudWxsLCB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgZmlyZWZveEFyZ3VtZW50cyA9IFsnLS1uby1yZW1vdGUnXTtcbiAgICAgICAgc3dpdGNoIChvcy5wbGF0Zm9ybSgpKSB7XG4gICAgICAgICAgICBjYXNlICdkYXJ3aW4nOlxuICAgICAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCgnLS1mb3JlZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3aW4zMic6XG4gICAgICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKCctLXdhaXQtZm9yLWJyb3dzZXInKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlckRhdGFEaXIpIHtcbiAgICAgICAgICAgIGZpcmVmb3hBcmd1bWVudHMucHVzaCgnLS1wcm9maWxlJyk7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2godXNlckRhdGFEaXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkbGVzcykge1xuICAgICAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKCctLWhlYWRsZXNzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRldnRvb2xzKSB7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2goJy0tZGV2dG9vbHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJncy5ldmVyeShhcmcgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFyZy5zdGFydHNXaXRoKCctJyk7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgICBmaXJlZm94QXJndW1lbnRzLnB1c2goJ2Fib3V0OmJsYW5rJyk7XG4gICAgICAgIH1cbiAgICAgICAgZmlyZWZveEFyZ3VtZW50cy5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICByZXR1cm4gZmlyZWZveEFyZ3VtZW50cztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaXJlZm94TGF1bmNoZXIuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmV4cG9ydCB7fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxhdW5jaE9wdGlvbnMuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBOb2RlV2ViU29ja2V0IGZyb20gJ3dzJztcbmltcG9ydCB7IHBhY2thZ2VWZXJzaW9uIH0gZnJvbSAnLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIE5vZGVXZWJTb2NrZXRUcmFuc3BvcnQge1xuICAgIHN0YXRpYyBjcmVhdGUodXJsLCBoZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3cyA9IG5ldyBOb2RlV2ViU29ja2V0KHVybCwgW10sIHtcbiAgICAgICAgICAgICAgICBmb2xsb3dSZWRpcmVjdHM6IHRydWUsXG4gICAgICAgICAgICAgICAgcGVyTWVzc2FnZURlZmxhdGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3MvYmxvYi9tYXN0ZXIvZG9jL3dzLm1kI25ldy13ZWJzb2NrZXRhZGRyZXNzLXByb3RvY29scy1vcHRpb25zXG4gICAgICAgICAgICAgICAgYWxsb3dTeW5jaHJvbm91c0V2ZW50czogZmFsc2UsXG4gICAgICAgICAgICAgICAgbWF4UGF5bG9hZDogMjU2ICogMTAyNCAqIDEwMjQsIC8vIDI1Nk1iXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IGBQdXBwZXRlZXIgJHtwYWNrYWdlVmVyc2lvbn1gLFxuICAgICAgICAgICAgICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobmV3IE5vZGVXZWJTb2NrZXRUcmFuc3BvcnQod3MpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgI3dzO1xuICAgIG9ubWVzc2FnZTtcbiAgICBvbmNsb3NlO1xuICAgIGNvbnN0cnVjdG9yKHdzKSB7XG4gICAgICAgIHRoaXMuI3dzID0gd3M7XG4gICAgICAgIHRoaXMuI3dzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vbm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9ubWVzc2FnZS5jYWxsKG51bGwsIGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jd3MuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vbmNsb3NlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNsb3NlLmNhbGwobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBTaWxlbnRseSBpZ25vcmUgYWxsIGVycm9ycyAtIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoZW0uXG4gICAgICAgIHRoaXMuI3dzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4geyB9KTtcbiAgICB9XG4gICAgc2VuZChtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuI3dzLnNlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLiN3cy5jbG9zZSgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU5vZGVXZWJTb2NrZXRUcmFuc3BvcnQuanMubWFwIiwiaW1wb3J0IHsgRXZlbnRTdWJzY3JpcHRpb24gfSBmcm9tICcuLi9jb21tb24vRXZlbnRFbWl0dGVyLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydC5qcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlU3RhY2sgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBpcGVUcmFuc3BvcnQge1xuICAgICNwaXBlV3JpdGU7XG4gICAgI3N1YnNjcmlwdGlvbnMgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgI2lzQ2xvc2VkID0gZmFsc2U7XG4gICAgI3BlbmRpbmdNZXNzYWdlID0gJyc7XG4gICAgb25jbG9zZTtcbiAgICBvbm1lc3NhZ2U7XG4gICAgY29uc3RydWN0b3IocGlwZVdyaXRlLCBwaXBlUmVhZCkge1xuICAgICAgICB0aGlzLiNwaXBlV3JpdGUgPSBwaXBlV3JpdGU7XG4gICAgICAgIHRoaXMuI3N1YnNjcmlwdGlvbnMudXNlKG5ldyBFdmVudFN1YnNjcmlwdGlvbihwaXBlUmVhZCwgJ2RhdGEnLCAoYnVmZmVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZGlzcGF0Y2goYnVmZmVyKTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRTdWJzY3JpcHRpb24ocGlwZVJlYWQsICdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9uY2xvc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2xvc2UuY2FsbChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLnVzZShuZXcgRXZlbnRTdWJzY3JpcHRpb24ocGlwZVJlYWQsICdlcnJvcicsIGRlYnVnRXJyb3IpKTtcbiAgICAgICAgdGhpcy4jc3Vic2NyaXB0aW9ucy51c2UobmV3IEV2ZW50U3Vic2NyaXB0aW9uKHBpcGVXcml0ZSwgJ2Vycm9yJywgZGVidWdFcnJvcikpO1xuICAgIH1cbiAgICBzZW5kKG1lc3NhZ2UpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLiNpc0Nsb3NlZCwgJ2BQaXBlVHJhbnNwb3J0YCBpcyBjbG9zZWQuJyk7XG4gICAgICAgIHRoaXMuI3BpcGVXcml0ZS53cml0ZShtZXNzYWdlKTtcbiAgICAgICAgdGhpcy4jcGlwZVdyaXRlLndyaXRlKCdcXDAnKTtcbiAgICB9XG4gICAgI2Rpc3BhdGNoKGJ1ZmZlcikge1xuICAgICAgICBhc3NlcnQoIXRoaXMuI2lzQ2xvc2VkLCAnYFBpcGVUcmFuc3BvcnRgIGlzIGNsb3NlZC4nKTtcbiAgICAgICAgbGV0IGVuZCA9IGJ1ZmZlci5pbmRleE9mKCdcXDAnKTtcbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuI3BlbmRpbmdNZXNzYWdlICs9IGJ1ZmZlci50b1N0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLiNwZW5kaW5nTWVzc2FnZSArIGJ1ZmZlci50b1N0cmluZyh1bmRlZmluZWQsIDAsIGVuZCk7XG4gICAgICAgIGlmICh0aGlzLm9ubWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2UuY2FsbChudWxsLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhcnQgPSBlbmQgKyAxO1xuICAgICAgICBlbmQgPSBidWZmZXIuaW5kZXhPZignXFwwJywgc3RhcnQpO1xuICAgICAgICB3aGlsZSAoZW5kICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub25tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2UuY2FsbChudWxsLCBidWZmZXIudG9TdHJpbmcodW5kZWZpbmVkLCBzdGFydCwgZW5kKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7XG4gICAgICAgICAgICBlbmQgPSBidWZmZXIuaW5kZXhPZignXFwwJywgc3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3BlbmRpbmdNZXNzYWdlID0gYnVmZmVyLnRvU3RyaW5nKHVuZGVmaW5lZCwgc3RhcnQpO1xuICAgIH1cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy4jaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLiNzdWJzY3JpcHRpb25zLmRpc3Bvc2UoKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1QaXBlVHJhbnNwb3J0LmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQnJvd3NlciBhcyBJbnN0YWxsZWRCcm93c2VyLCBDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBsYXVuY2gsIFRpbWVvdXRFcnJvciBhcyBCcm93c2Vyc1RpbWVvdXRFcnJvciwgV0VCRFJJVkVSX0JJRElfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBjb21wdXRlRXhlY3V0YWJsZVBhdGgsIH0gZnJvbSAnQHB1cHBldGVlci9icm93c2Vycyc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgbWFwLCByYWNlLCB0aW1lciwgfSBmcm9tICcuLi8uLi90aGlyZF9wYXJ0eS9yeGpzL3J4anMuanMnO1xuaW1wb3J0IHsgQ2RwQnJvd3NlciB9IGZyb20gJy4uL2NkcC9Ccm93c2VyLmpzJztcbmltcG9ydCB7IENvbm5lY3Rpb24gfSBmcm9tICcuLi9jZHAvQ29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgeyBUaW1lb3V0RXJyb3IgfSBmcm9tICcuLi9jb21tb24vRXJyb3JzLmpzJztcbmltcG9ydCB7IGRlYnVnRXJyb3IsIERFRkFVTFRfVklFV1BPUlQgfSBmcm9tICcuLi9jb21tb24vdXRpbC5qcyc7XG5pbXBvcnQgeyBOb2RlV2ViU29ja2V0VHJhbnNwb3J0IGFzIFdlYlNvY2tldFRyYW5zcG9ydCB9IGZyb20gJy4vTm9kZVdlYlNvY2tldFRyYW5zcG9ydC5qcyc7XG5pbXBvcnQgeyBQaXBlVHJhbnNwb3J0IH0gZnJvbSAnLi9QaXBlVHJhbnNwb3J0LmpzJztcbi8qKlxuICogRGVzY3JpYmVzIGEgbGF1bmNoZXIgLSBhIGNsYXNzIHRoYXQgaXMgYWJsZSB0byBjcmVhdGUgYW5kIGxhdW5jaCBhIGJyb3dzZXIgaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUHJvZHVjdExhdW5jaGVyIHtcbiAgICAjcHJvZHVjdDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdXBwZXRlZXI7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYWN0dWFsQnJvd3NlclJldmlzaW9uO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHB1cHBldGVlciwgcHJvZHVjdCkge1xuICAgICAgICB0aGlzLnB1cHBldGVlciA9IHB1cHBldGVlcjtcbiAgICAgICAgdGhpcy4jcHJvZHVjdCA9IHByb2R1Y3Q7XG4gICAgfVxuICAgIGdldCBwcm9kdWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvZHVjdDtcbiAgICB9XG4gICAgYXN5bmMgbGF1bmNoKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGR1bXBpbyA9IGZhbHNlLCBlbnYgPSBwcm9jZXNzLmVudiwgaGFuZGxlU0lHSU5UID0gdHJ1ZSwgaGFuZGxlU0lHVEVSTSA9IHRydWUsIGhhbmRsZVNJR0hVUCA9IHRydWUsIGlnbm9yZUhUVFBTRXJyb3JzID0gZmFsc2UsIGRlZmF1bHRWaWV3cG9ydCA9IERFRkFVTFRfVklFV1BPUlQsIHNsb3dNbyA9IDAsIHRpbWVvdXQgPSAzMDAwMCwgd2FpdEZvckluaXRpYWxQYWdlID0gdHJ1ZSwgcHJvdG9jb2xUaW1lb3V0LCBwcm90b2NvbCwgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGxhdW5jaEFyZ3MgPSBhd2FpdCB0aGlzLmNvbXB1dGVMYXVuY2hBcmd1bWVudHMob3B0aW9ucyk7XG4gICAgICAgIGlmICghZXhpc3RzU3luYyhsYXVuY2hBcmdzLmV4ZWN1dGFibGVQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm93c2VyIHdhcyBub3QgZm91bmQgYXQgdGhlIGNvbmZpZ3VyZWQgZXhlY3V0YWJsZVBhdGggKCR7bGF1bmNoQXJncy5leGVjdXRhYmxlUGF0aH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlUGlwZSA9IGxhdW5jaEFyZ3MuYXJncy5pbmNsdWRlcygnLS1yZW1vdGUtZGVidWdnaW5nLXBpcGUnKTtcbiAgICAgICAgY29uc3Qgb25Qcm9jZXNzRXhpdCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xlYW5Vc2VyRGF0YURpcihsYXVuY2hBcmdzLnVzZXJEYXRhRGlyLCB7XG4gICAgICAgICAgICAgICAgaXNUZW1wOiBsYXVuY2hBcmdzLmlzVGVtcFVzZXJEYXRhRGlyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLiNwcm9kdWN0ID09PSAnZmlyZWZveCcgJiZcbiAgICAgICAgICAgIHByb3RvY29sICE9PSAnd2ViRHJpdmVyQmlEaScgJiZcbiAgICAgICAgICAgIHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24ubG9nTGV2ZWwgPT09ICd3YXJuJykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2wgKENEUCkgc3VwcG9ydCBmb3IgRmlyZWZveCBpcyBkZXByZWNhdGVkIGluIFB1cHBldGVlciBgICtcbiAgICAgICAgICAgICAgICBgYW5kIGl0IHdpbGwgYmUgZXZlbnR1YWxseSByZW1vdmVkLiBgICtcbiAgICAgICAgICAgICAgICBgVXNlIFdlYkRyaXZlciBCaURpIGluc3RlYWQgKHNlZSBodHRwczovL3BwdHIuZGV2L3dlYmRyaXZlci1iaWRpI2dldC1zdGFydGVkKS5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBicm93c2VyUHJvY2VzcyA9IGxhdW5jaCh7XG4gICAgICAgICAgICBleGVjdXRhYmxlUGF0aDogbGF1bmNoQXJncy5leGVjdXRhYmxlUGF0aCxcbiAgICAgICAgICAgIGFyZ3M6IGxhdW5jaEFyZ3MuYXJncyxcbiAgICAgICAgICAgIGhhbmRsZVNJR0hVUCxcbiAgICAgICAgICAgIGhhbmRsZVNJR1RFUk0sXG4gICAgICAgICAgICBoYW5kbGVTSUdJTlQsXG4gICAgICAgICAgICBkdW1waW8sXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICBwaXBlOiB1c2VQaXBlLFxuICAgICAgICAgICAgb25FeGl0OiBvblByb2Nlc3NFeGl0LFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGJyb3dzZXI7XG4gICAgICAgIGxldCBjZHBDb25uZWN0aW9uO1xuICAgICAgICBsZXQgY2xvc2luZyA9IGZhbHNlO1xuICAgICAgICBjb25zdCBicm93c2VyQ2xvc2VDYWxsYmFjayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmIChjbG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xvc2luZyA9IHRydWU7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlQnJvd3Nlcihicm93c2VyUHJvY2VzcywgY2RwQ29ubmVjdGlvbik7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jcHJvZHVjdCA9PT0gJ2ZpcmVmb3gnICYmIHByb3RvY29sID09PSAnd2ViRHJpdmVyQmlEaScpIHtcbiAgICAgICAgICAgICAgICBicm93c2VyID0gYXdhaXQgdGhpcy5jcmVhdGVCaURpQnJvd3Nlcihicm93c2VyUHJvY2VzcywgYnJvd3NlckNsb3NlQ2FsbGJhY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xUaW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICBzbG93TW8sXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodXNlUGlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjZHBDb25uZWN0aW9uID0gYXdhaXQgdGhpcy5jcmVhdGVDZHBQaXBlQ29ubmVjdGlvbihicm93c2VyUHJvY2Vzcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sVGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3dNbyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjZHBDb25uZWN0aW9uID0gYXdhaXQgdGhpcy5jcmVhdGVDZHBTb2NrZXRDb25uZWN0aW9uKGJyb3dzZXJQcm9jZXNzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xUaW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2xvd01vLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHByb3RvY29sID09PSAnd2ViRHJpdmVyQmlEaScpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlciA9IGF3YWl0IHRoaXMuY3JlYXRlQmlEaU92ZXJDZHBCcm93c2VyKGJyb3dzZXJQcm9jZXNzLCBjZHBDb25uZWN0aW9uLCBicm93c2VyQ2xvc2VDYWxsYmFjaywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlciA9IGF3YWl0IENkcEJyb3dzZXIuX2NyZWF0ZSh0aGlzLnByb2R1Y3QsIGNkcENvbm5lY3Rpb24sIFtdLCBpZ25vcmVIVFRQU0Vycm9ycywgZGVmYXVsdFZpZXdwb3J0LCBicm93c2VyUHJvY2Vzcy5ub2RlUHJvY2VzcywgYnJvd3NlckNsb3NlQ2FsbGJhY2ssIG9wdGlvbnMudGFyZ2V0RmlsdGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB2b2lkIGJyb3dzZXJDbG9zZUNhbGxiYWNrKCk7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCcm93c2Vyc1RpbWVvdXRFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2FpdEZvckluaXRpYWxQYWdlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JQYWdlVGFyZ2V0KGJyb3dzZXIsIHRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBicm93c2VyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgb25seSBmb3IgRmlyZWZveCwgYWZ0ZXIgdGhlIGxhdW5jaGVyIHJlc29sdmVzIHRoZSBgbGF0ZXN0YCByZXZpc2lvbiB0b1xuICAgICAqIHRoZSBhY3R1YWwgcmV2aXNpb24uXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0QWN0dWFsQnJvd3NlclJldmlzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3R1YWxCcm93c2VyUmV2aXNpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIGNsb3NlQnJvd3Nlcihicm93c2VyUHJvY2VzcywgY2RwQ29ubmVjdGlvbikge1xuICAgICAgICBpZiAoY2RwQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBjbG9zZSB0aGUgYnJvd3NlciBncmFjZWZ1bGx5XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNkcENvbm5lY3Rpb24uY2xvc2VCcm93c2VyKCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYnJvd3NlclByb2Nlc3MuaGFzQ2xvc2VkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBicm93c2VyUHJvY2Vzcy5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV2FpdCBmb3IgYSBwb3NzaWJsZSBncmFjZWZ1bCBzaHV0ZG93bi5cbiAgICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHJhY2UoZnJvbShicm93c2VyUHJvY2Vzcy5oYXNDbG9zZWQoKSksIHRpbWVyKDUwMDApLnBpcGUobWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbShicm93c2VyUHJvY2Vzcy5jbG9zZSgpKTtcbiAgICAgICAgICAgIH0pKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIHdhaXRGb3JQYWdlVGFyZ2V0KGJyb3dzZXIsIHRpbWVvdXQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGJyb3dzZXIud2FpdEZvclRhcmdldCh0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC50eXBlKCkgPT09ICdwYWdlJztcbiAgICAgICAgICAgIH0sIHsgdGltZW91dCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUNkcFNvY2tldENvbm5lY3Rpb24oYnJvd3NlclByb2Nlc3MsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgYnJvd3NlcldTRW5kcG9pbnQgPSBhd2FpdCBicm93c2VyUHJvY2Vzcy53YWl0Rm9yTGluZU91dHB1dChDRFBfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBvcHRzLnRpbWVvdXQpO1xuICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSBhd2FpdCBXZWJTb2NrZXRUcmFuc3BvcnQuY3JlYXRlKGJyb3dzZXJXU0VuZHBvaW50KTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uKGJyb3dzZXJXU0VuZHBvaW50LCB0cmFuc3BvcnQsIG9wdHMuc2xvd01vLCBvcHRzLnByb3RvY29sVGltZW91dCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUNkcFBpcGVDb25uZWN0aW9uKGJyb3dzZXJQcm9jZXNzLCBvcHRzKSB7XG4gICAgICAgIC8vIHN0ZGlvIHdhcyBhc3NpZ25lZCBkdXJpbmcgc3RhcnQoKSwgYW5kIHRoZSAncGlwZScgb3B0aW9uIHRoZXJlIGFkZHMgdGhlXG4gICAgICAgIC8vIDR0aCBhbmQgNXRoIGl0ZW1zIHRvIHN0ZGlvIGFycmF5XG4gICAgICAgIGNvbnN0IHsgMzogcGlwZVdyaXRlLCA0OiBwaXBlUmVhZCB9ID0gYnJvd3NlclByb2Nlc3Mubm9kZVByb2Nlc3Muc3RkaW87XG4gICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBQaXBlVHJhbnNwb3J0KHBpcGVXcml0ZSwgcGlwZVJlYWQpO1xuICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oJycsIHRyYW5zcG9ydCwgb3B0cy5zbG93TW8sIG9wdHMucHJvdG9jb2xUaW1lb3V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQmlEaU92ZXJDZHBCcm93c2VyKGJyb3dzZXJQcm9jZXNzLCBjb25uZWN0aW9uLCBjbG9zZUNhbGxiYWNrLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IEJpRGkgPSBhd2FpdCBpbXBvcnQoLyogOiB0cnVlICovICcuLi9iaWRpL2JpZGkuanMnKTtcbiAgICAgICAgY29uc3QgYmlkaUNvbm5lY3Rpb24gPSBhd2FpdCBCaURpLmNvbm5lY3RCaWRpT3ZlckNkcChjb25uZWN0aW9uLCB7XG4gICAgICAgICAgICBhY2NlcHRJbnNlY3VyZUNlcnRzOiBvcHRzLmlnbm9yZUhUVFBTRXJyb3JzID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IEJpRGkuQmlkaUJyb3dzZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb246IGJpZGlDb25uZWN0aW9uLFxuICAgICAgICAgICAgY2xvc2VDYWxsYmFjayxcbiAgICAgICAgICAgIHByb2Nlc3M6IGJyb3dzZXJQcm9jZXNzLm5vZGVQcm9jZXNzLFxuICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0OiBvcHRzLmRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiBvcHRzLmlnbm9yZUhUVFBTRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQmlEaUJyb3dzZXIoYnJvd3NlclByb2Nlc3MsIGNsb3NlQ2FsbGJhY2ssIG9wdHMpIHtcbiAgICAgICAgY29uc3QgYnJvd3NlcldTRW5kcG9pbnQgPSAoYXdhaXQgYnJvd3NlclByb2Nlc3Mud2FpdEZvckxpbmVPdXRwdXQoV0VCRFJJVkVSX0JJRElfV0VCU09DS0VUX0VORFBPSU5UX1JFR0VYLCBvcHRzLnRpbWVvdXQpKSArICcvc2Vzc2lvbic7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IGF3YWl0IFdlYlNvY2tldFRyYW5zcG9ydC5jcmVhdGUoYnJvd3NlcldTRW5kcG9pbnQpO1xuICAgICAgICBjb25zdCBCaURpID0gYXdhaXQgaW1wb3J0KC8qIDogdHJ1ZSAqLyAnLi4vYmlkaS9iaWRpLmpzJyk7XG4gICAgICAgIGNvbnN0IGJpZGlDb25uZWN0aW9uID0gbmV3IEJpRGkuQmlkaUNvbm5lY3Rpb24oYnJvd3NlcldTRW5kcG9pbnQsIHRyYW5zcG9ydCwgb3B0cy5zbG93TW8sIG9wdHMucHJvdG9jb2xUaW1lb3V0KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IEJpRGkuQmlkaUJyb3dzZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb246IGJpZGlDb25uZWN0aW9uLFxuICAgICAgICAgICAgY2xvc2VDYWxsYmFjayxcbiAgICAgICAgICAgIHByb2Nlc3M6IGJyb3dzZXJQcm9jZXNzLm5vZGVQcm9jZXNzLFxuICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0OiBvcHRzLmRlZmF1bHRWaWV3cG9ydCxcbiAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiBvcHRzLmlnbm9yZUhUVFBTRXJyb3JzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0UHJvZmlsZVBhdGgoKSB7XG4gICAgICAgIHJldHVybiBqb2luKHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24udGVtcG9yYXJ5RGlyZWN0b3J5ID8/IHRtcGRpcigpLCBgcHVwcGV0ZWVyX2Rldl8ke3RoaXMucHJvZHVjdH1fcHJvZmlsZS1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcmVzb2x2ZUV4ZWN1dGFibGVQYXRoKGhlYWRsZXNzKSB7XG4gICAgICAgIGxldCBleGVjdXRhYmxlUGF0aCA9IHRoaXMucHVwcGV0ZWVyLmNvbmZpZ3VyYXRpb24uZXhlY3V0YWJsZVBhdGg7XG4gICAgICAgIGlmIChleGVjdXRhYmxlUGF0aCkge1xuICAgICAgICAgICAgaWYgKCFleGlzdHNTeW5jKGV4ZWN1dGFibGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gZmluZCB0aGUgYnJvd3NlciBhdCB0aGUgY29uZmlndXJlZCBwYXRoICgke2V4ZWN1dGFibGVQYXRofSksIGJ1dCBubyBleGVjdXRhYmxlIHdhcyBmb3VuZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBleGVjdXRhYmxlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBwcm9kdWN0VG9Ccm93c2VyKHByb2R1Y3QsIGhlYWRsZXNzKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHByb2R1Y3QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjaHJvbWUnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGxlc3MgPT09ICdzaGVsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnN0YWxsZWRCcm93c2VyLkNIUk9NRUhFQURMRVNTU0hFTEw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEluc3RhbGxlZEJyb3dzZXIuQ0hST01FO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2ZpcmVmb3gnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW5zdGFsbGVkQnJvd3Nlci5GSVJFRk9YO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEluc3RhbGxlZEJyb3dzZXIuQ0hST01FO1xuICAgICAgICB9XG4gICAgICAgIGV4ZWN1dGFibGVQYXRoID0gY29tcHV0ZUV4ZWN1dGFibGVQYXRoKHtcbiAgICAgICAgICAgIGNhY2hlRGlyOiB0aGlzLnB1cHBldGVlci5kZWZhdWx0RG93bmxvYWRQYXRoLFxuICAgICAgICAgICAgYnJvd3NlcjogcHJvZHVjdFRvQnJvd3Nlcih0aGlzLnByb2R1Y3QsIGhlYWRsZXNzKSxcbiAgICAgICAgICAgIGJ1aWxkSWQ6IHRoaXMucHVwcGV0ZWVyLmJyb3dzZXJSZXZpc2lvbixcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZXhpc3RzU3luYyhleGVjdXRhYmxlUGF0aCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnB1cHBldGVlci5jb25maWd1cmF0aW9uLmJyb3dzZXJSZXZpc2lvbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gZmluZCB0aGUgYnJvd3NlciBhdCB0aGUgY29uZmlndXJlZCBwYXRoICgke2V4ZWN1dGFibGVQYXRofSkgZm9yIHJldmlzaW9uICR7dGhpcy5wdXBwZXRlZXIuYnJvd3NlclJldmlzaW9ufSwgYnV0IG5vIGV4ZWN1dGFibGUgd2FzIGZvdW5kLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnByb2R1Y3QpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjaHJvbWUnOlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIENocm9tZSAodmVyLiAke3RoaXMucHVwcGV0ZWVyLmJyb3dzZXJSZXZpc2lvbn0pLiBUaGlzIGNhbiBvY2N1ciBpZiBlaXRoZXJcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgMS4geW91IGRpZCBub3QgcGVyZm9ybSBhbiBpbnN0YWxsYXRpb24gYmVmb3JlIHJ1bm5pbmcgdGhlIHNjcmlwdCAoZS5nLiBgbnB4IHB1cHBldGVlciBicm93c2VycyBpbnN0YWxsIGNocm9tZWApIG9yXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBgIDIuIHlvdXIgY2FjaGUgcGF0aCBpcyBpbmNvcnJlY3RseSBjb25maWd1cmVkICh3aGljaCBpczogJHt0aGlzLnB1cHBldGVlci5jb25maWd1cmF0aW9uLmNhY2hlRGlyZWN0b3J5fSkuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnRm9yICgyKSwgY2hlY2sgb3V0IG91ciBndWlkZSBvbiBjb25maWd1cmluZyBwdXBwZXRlZXIgYXQgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvY29uZmlndXJhdGlvbi4nKTtcbiAgICAgICAgICAgICAgICBjYXNlICdmaXJlZm94JzpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBGaXJlZm94IChyZXYuICR7dGhpcy5wdXBwZXRlZXIuYnJvd3NlclJldmlzaW9ufSkuIFRoaXMgY2FuIG9jY3VyIGlmIGVpdGhlclxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAxLiB5b3UgZGlkIG5vdCBwZXJmb3JtIGFuIGluc3RhbGxhdGlvbiBmb3IgRmlyZWZveCBiZWZvcmUgcnVubmluZyB0aGUgc2NyaXB0IChlLmcuIGBucHggcHVwcGV0ZWVyIGJyb3dzZXJzIGluc3RhbGwgZmlyZWZveGApIG9yXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBgIDIuIHlvdXIgY2FjaGUgcGF0aCBpcyBpbmNvcnJlY3RseSBjb25maWd1cmVkICh3aGljaCBpczogJHt0aGlzLnB1cHBldGVlci5jb25maWd1cmF0aW9uLmNhY2hlRGlyZWN0b3J5fSkuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnRm9yICgyKSwgY2hlY2sgb3V0IG91ciBndWlkZSBvbiBjb25maWd1cmluZyBwdXBwZXRlZXIgYXQgaHR0cHM6Ly9wcHRyLmRldi9ndWlkZXMvY29uZmlndXJhdGlvbi4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhlY3V0YWJsZVBhdGg7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvZHVjdExhdW5jaGVyLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBCcm93c2VyIGFzIFN1cHBvcnRlZEJyb3dzZXIsIHJlc29sdmVCdWlsZElkLCBkZXRlY3RCcm93c2VyUGxhdGZvcm0sIGdldEluc3RhbGxlZEJyb3dzZXJzLCB1bmluc3RhbGwsIH0gZnJvbSAnQHB1cHBldGVlci9icm93c2Vycyc7XG5pbXBvcnQgeyBQdXBwZXRlZXIgfSBmcm9tICcuLi9jb21tb24vUHVwcGV0ZWVyLmpzJztcbmltcG9ydCB7IFBVUFBFVEVFUl9SRVZJU0lPTlMgfSBmcm9tICcuLi9yZXZpc2lvbnMuanMnO1xuaW1wb3J0IHsgQ2hyb21lTGF1bmNoZXIgfSBmcm9tICcuL0Nocm9tZUxhdW5jaGVyLmpzJztcbmltcG9ydCB7IEZpcmVmb3hMYXVuY2hlciB9IGZyb20gJy4vRmlyZWZveExhdW5jaGVyLmpzJztcbi8qKlxuICogRXh0ZW5kcyB0aGUgbWFpbiB7QGxpbmsgUHVwcGV0ZWVyfSBjbGFzcyB3aXRoIE5vZGUgc3BlY2lmaWMgYmVoYXZpb3VyIGZvclxuICogZmV0Y2hpbmcgYW5kIGRvd25sb2FkaW5nIGJyb3dzZXJzLlxuICpcbiAqIElmIHlvdSdyZSB1c2luZyBQdXBwZXRlZXIgaW4gYSBOb2RlIGVudmlyb25tZW50LCB0aGlzIGlzIHRoZSBjbGFzcyB5b3UnbGwgZ2V0XG4gKiB3aGVuIHlvdSBydW4gYHJlcXVpcmUoJ3B1cHBldGVlcicpYCAob3IgdGhlIGVxdWl2YWxlbnQgRVMgYGltcG9ydGApLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgbW9zdCBjb21tb24gbWV0aG9kIHRvIHVzZSBpcyB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXVuY2ggfCBsYXVuY2h9LCB3aGljaFxuICogaXMgdXNlZCB0byBsYXVuY2ggYW5kIGNvbm5lY3QgdG8gYSBuZXcgYnJvd3NlciBpbnN0YW5jZS5cbiAqXG4gKiBTZWUge0BsaW5rIFB1cHBldGVlciB8IHRoZSBtYWluIFB1cHBldGVlciBjbGFzc30gZm9yIG1ldGhvZHMgY29tbW9uIHRvIGFsbFxuICogZW52aXJvbm1lbnRzLCBzdWNoIGFzIHtAbGluayBQdXBwZXRlZXIuY29ubmVjdH0uXG4gKlxuICogQGV4YW1wbGVcbiAqIFRoZSBmb2xsb3dpbmcgaXMgYSB0eXBpY2FsIGV4YW1wbGUgb2YgdXNpbmcgUHVwcGV0ZWVyIHRvIGRyaXZlIGF1dG9tYXRpb246XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcbiAqXG4gKiAoYXN5bmMgKCkgPT4ge1xuICogICBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCgpO1xuICogICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG4gKiAgIGF3YWl0IHBhZ2UuZ290bygnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbScpO1xuICogICAvLyBvdGhlciBhY3Rpb25zLi4uXG4gKiAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAqIH0pKCk7XG4gKiBgYGBcbiAqXG4gKiBPbmNlIHlvdSBoYXZlIGNyZWF0ZWQgYSBgcGFnZWAgeW91IGhhdmUgYWNjZXNzIHRvIGEgbGFyZ2UgQVBJIHRvIGludGVyYWN0XG4gKiB3aXRoIHRoZSBwYWdlLCBuYXZpZ2F0ZSwgb3IgZmluZCBjZXJ0YWluIGVsZW1lbnRzIGluIHRoYXQgcGFnZS5cbiAqIFRoZSB7QGxpbmsgUGFnZSB8IGBwYWdlYCBkb2N1bWVudGF0aW9ufSBsaXN0cyBhbGwgdGhlIGF2YWlsYWJsZSBtZXRob2RzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFB1cHBldGVlck5vZGUgZXh0ZW5kcyBQdXBwZXRlZXIge1xuICAgICNfbGF1bmNoZXI7XG4gICAgI2xhc3RMYXVuY2hlZFByb2R1Y3Q7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZGVmYXVsdEJyb3dzZXJSZXZpc2lvbjtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25maWd1cmF0aW9uID0ge307XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3QgeyBjb25maWd1cmF0aW9uLCAuLi5jb21tb25TZXR0aW5ncyB9ID0gc2V0dGluZ3M7XG4gICAgICAgIHN1cGVyKGNvbW1vblNldHRpbmdzKTtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFByb2R1Y3QpIHtcbiAgICAgICAgICAgIGNhc2UgJ2ZpcmVmb3gnOlxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJyb3dzZXJSZXZpc2lvbiA9IFBVUFBFVEVFUl9SRVZJU0lPTlMuZmlyZWZveDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRQcm9kdWN0ID0gJ2Nocm9tZSc7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QnJvd3NlclJldmlzaW9uID0gUFVQUEVURUVSX1JFVklTSU9OUy5jaHJvbWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb25uZWN0ID0gdGhpcy5jb25uZWN0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubGF1bmNoID0gdGhpcy5sYXVuY2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5leGVjdXRhYmxlUGF0aCA9IHRoaXMuZXhlY3V0YWJsZVBhdGguYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0QXJncyA9IHRoaXMuZGVmYXVsdEFyZ3MuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy50cmltQ2FjaGUgPSB0aGlzLnRyaW1DYWNoZS5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBhdHRhY2hlcyBQdXBwZXRlZXIgdG8gYW4gZXhpc3RpbmcgYnJvd3NlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gU2V0IG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zIHRvIHNldCBvbiB0aGUgYnJvd3Nlci5cbiAgICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGJyb3dzZXIgaW5zdGFuY2UuXG4gICAgICovXG4gICAgY29ubmVjdChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5jb25uZWN0KG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMYXVuY2hlcyBhIGJyb3dzZXIgaW5zdGFuY2Ugd2l0aCBnaXZlbiBhcmd1bWVudHMgYW5kIG9wdGlvbnMgd2hlblxuICAgICAqIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIFdoZW4gdXNpbmcgd2l0aCBgcHVwcGV0ZWVyLWNvcmVgLFxuICAgICAqIHtAbGluayBMYXVuY2hPcHRpb25zLmV4ZWN1dGFibGVQYXRoIHwgb3B0aW9ucy5leGVjdXRhYmxlUGF0aH0gb3JcbiAgICAgKiB7QGxpbmsgTGF1bmNoT3B0aW9ucy5jaGFubmVsIHwgb3B0aW9ucy5jaGFubmVsfSBtdXN0IGJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBZb3UgY2FuIHVzZSB7QGxpbmsgTGF1bmNoT3B0aW9ucy5pZ25vcmVEZWZhdWx0QXJncyB8IG9wdGlvbnMuaWdub3JlRGVmYXVsdEFyZ3N9XG4gICAgICogdG8gZmlsdGVyIG91dCBgLS1tdXRlLWF1ZGlvYCBmcm9tIGRlZmF1bHQgYXJndW1lbnRzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBicm93c2VyID0gYXdhaXQgcHVwcGV0ZWVyLmxhdW5jaCh7XG4gICAgICogICBpZ25vcmVEZWZhdWx0QXJnczogWyctLW11dGUtYXVkaW8nXSxcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUHVwcGV0ZWVyIGNhbiBhbHNvIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgQ2hyb21lIGJyb3dzZXIsIGJ1dCBpdCB3b3JrcyBiZXN0XG4gICAgICogd2l0aCB0aGUgdmVyc2lvbiBvZiBDaHJvbWUgZm9yIFRlc3RpbmcgZG93bmxvYWRlZCBieSBkZWZhdWx0LlxuICAgICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSBpdCB3aWxsIHdvcmsgd2l0aCBhbnkgb3RoZXIgdmVyc2lvbi4gSWYgR29vZ2xlIENocm9tZVxuICAgICAqIChyYXRoZXIgdGhhbiBDaHJvbWUgZm9yIFRlc3RpbmcpIGlzIHByZWZlcnJlZCwgYVxuICAgICAqIHtAbGluayBodHRwczovL3d3dy5nb29nbGUuY29tL2Nocm9tZS9icm93c2VyL2NhbmFyeS5odG1sIHwgQ2hyb21lIENhbmFyeX1cbiAgICAgKiBvclxuICAgICAqIHtAbGluayBodHRwczovL3d3dy5jaHJvbWl1bS5vcmcvZ2V0dGluZy1pbnZvbHZlZC9kZXYtY2hhbm5lbCB8IERldiBDaGFubmVsfVxuICAgICAqIGJ1aWxkIGlzIHN1Z2dlc3RlZC4gU2VlXG4gICAgICoge0BsaW5rIGh0dHBzOi8vd3d3Lmhvd3RvZ2Vlay5jb20vMjAyODI1L3doYXQlRTIlODAlOTlzLXRoZS1kaWZmZXJlbmNlLWJldHdlZW4tY2hyb21pdW0tYW5kLWNocm9tZS8gfCB0aGlzIGFydGljbGV9XG4gICAgICogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gQ2hyb21pdW0gYW5kIENocm9tZS5cbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYy8rL2xrZ3IvZG9jcy9jaHJvbWl1bV9icm93c2VyX3ZzX2dvb2dsZV9jaHJvbWUubWQgfCBUaGlzIGFydGljbGV9XG4gICAgICogZGVzY3JpYmVzIHNvbWUgZGlmZmVyZW5jZXMgZm9yIExpbnV4IHVzZXJzLiBTZWVcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9ibG9nL2Nocm9tZS1mb3ItdGVzdGluZy8gfCB0aGlzIGRvY30gZm9yIHRoZSBkZXNjcmlwdGlvblxuICAgICAqIG9mIENocm9tZSBmb3IgVGVzdGluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgbGF1bmNoaW5nIGJlaGF2aW9yLlxuICAgICAqL1xuICAgIGxhdW5jaChvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBwcm9kdWN0ID0gdGhpcy5kZWZhdWx0UHJvZHVjdCB9ID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy4jbGFzdExhdW5jaGVkUHJvZHVjdCA9IHByb2R1Y3Q7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYXVuY2hlci5sYXVuY2gob3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldCAjbGF1bmNoZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLiNfbGF1bmNoZXIgJiZcbiAgICAgICAgICAgIHRoaXMuI19sYXVuY2hlci5wcm9kdWN0ID09PSB0aGlzLmxhc3RMYXVuY2hlZFByb2R1Y3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNfbGF1bmNoZXI7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0aGlzLmxhc3RMYXVuY2hlZFByb2R1Y3QpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Nocm9tZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QnJvd3NlclJldmlzaW9uID0gUFVQUEVURUVSX1JFVklTSU9OUy5jaHJvbWU7XG4gICAgICAgICAgICAgICAgdGhpcy4jX2xhdW5jaGVyID0gbmV3IENocm9tZUxhdW5jaGVyKHRoaXMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZmlyZWZveCc6XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0QnJvd3NlclJldmlzaW9uID0gUFVQUEVURUVSX1JFVklTSU9OUy5maXJlZm94O1xuICAgICAgICAgICAgICAgIHRoaXMuI19sYXVuY2hlciA9IG5ldyBGaXJlZm94TGF1bmNoZXIodGhpcyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcm9kdWN0OiAke3RoaXMuI2xhc3RMYXVuY2hlZFByb2R1Y3R9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI19sYXVuY2hlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgZXhlY3V0YWJsZSBwYXRoLlxuICAgICAqL1xuICAgIGV4ZWN1dGFibGVQYXRoKGNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xhdW5jaGVyLmV4ZWN1dGFibGVQYXRoKGNoYW5uZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgYnJvd3NlclJldmlzaW9uKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI19sYXVuY2hlcj8uZ2V0QWN0dWFsQnJvd3NlclJldmlzaW9uKCkgPz9cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5icm93c2VyUmV2aXNpb24gPz9cbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdEJyb3dzZXJSZXZpc2lvbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGRvd25sb2FkIHBhdGggZm9yIHB1cHBldGVlci4gRm9yIHB1cHBldGVlci1jb3JlLCB0aGlzXG4gICAgICogY29kZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGFzIGl0IGlzIG5ldmVyIGRlZmluZWQuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdERvd25sb2FkUGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5jYWNoZURpcmVjdG9yeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJyb3dzZXIgdGhhdCB3YXMgbGFzdCBsYXVuY2hlZC5cbiAgICAgKi9cbiAgICBnZXQgbGFzdExhdW5jaGVkUHJvZHVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xhc3RMYXVuY2hlZFByb2R1Y3QgPz8gdGhpcy5kZWZhdWx0UHJvZHVjdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJyb3dzZXIgdGhhdCB3aWxsIGJlIGxhdW5jaGVkIGJ5IGRlZmF1bHQuIEZvclxuICAgICAqIGBwdXBwZXRlZXJgLCB0aGlzIGlzIGluZmx1ZW5jZWQgYnkgeW91ciBjb25maWd1cmF0aW9uLiBPdGhlcndpc2UsIGl0J3NcbiAgICAgKiBgY2hyb21lYC5cbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByb2R1Y3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFByb2R1Y3QgPz8gJ2Nocm9tZSc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgYXMgdGhpcyBmaWVsZCBhcyBpdCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudFxuICAgICAqIG11bHRpcGxlIGJyb3dzZXJzIG9mIGRpZmZlcmVudCB0eXBlcy4gVXNlXG4gICAgICoge0BsaW5rIFB1cHBldGVlck5vZGUuZGVmYXVsdFByb2R1Y3QgfCBkZWZhdWx0UHJvZHVjdH0gb3JcbiAgICAgKiB7QGxpbmsgUHVwcGV0ZWVyTm9kZS5sYXN0TGF1bmNoZWRQcm9kdWN0IHwgbGFzdExhdW5jaGVkUHJvZHVjdH0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgYnJvd3NlciB0aGF0IGlzIHVuZGVyIGF1dG9tYXRpb24uXG4gICAgICovXG4gICAgZ2V0IHByb2R1Y3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNsYXVuY2hlci5wcm9kdWN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFNldCBvZiBjb25maWd1cmFibGUgb3B0aW9ucyB0byBzZXQgb24gdGhlIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBmbGFncyB0aGF0IENocm9taXVtIHdpbGwgYmUgbGF1bmNoZWQgd2l0aC5cbiAgICAgKi9cbiAgICBkZWZhdWx0QXJncyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xhdW5jaGVyLmRlZmF1bHRBcmdzKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBub24tY3VycmVudCBGaXJlZm94IGFuZCBDaHJvbWUgYmluYXJpZXMgaW4gdGhlIGNhY2hlIGRpcmVjdG9yeVxuICAgICAqIGlkZW50aWZpZWQgYnkgdGhlIHByb3ZpZGVkIFB1cHBldGVlciBjb25maWd1cmF0aW9uLiBUaGUgY3VycmVudCBicm93c2VyXG4gICAgICogdmVyc2lvbiBpcyBkZXRlcm1pbmVkIGJ5IHJlc29sdmluZyBQVVBQRVRFRVJfUkVWSVNJT05TIGZyb20gUHVwcGV0ZWVyXG4gICAgICogdW5sZXNzIGBjb25maWd1cmF0aW9uLmJyb3dzZXJSZXZpc2lvbmAgaXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHRoZSBtZXRob2QgZG9lcyBub3QgY2hlY2sgaWYgYW55IG90aGVyIFB1cHBldGVlciB2ZXJzaW9uc1xuICAgICAqIGluc3RhbGxlZCBvbiB0aGUgaG9zdCB0aGF0IHVzZSB0aGUgc2FtZSBjYWNoZSBkaXJlY3RvcnkgcmVxdWlyZSB0aGVcbiAgICAgKiBub24tY3VycmVudCBiaW5hcmllcy5cbiAgICAgKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBhc3luYyB0cmltQ2FjaGUoKSB7XG4gICAgICAgIGNvbnN0IHBsYXRmb3JtID0gZGV0ZWN0QnJvd3NlclBsYXRmb3JtKCk7XG4gICAgICAgIGlmICghcGxhdGZvcm0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYWNoZURpciA9IHRoaXMuY29uZmlndXJhdGlvbi5jYWNoZURpcmVjdG9yeTtcbiAgICAgICAgY29uc3QgaW5zdGFsbGVkQnJvd3NlcnMgPSBhd2FpdCBnZXRJbnN0YWxsZWRCcm93c2Vycyh7XG4gICAgICAgICAgICBjYWNoZURpcixcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb2R1Y3QgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFByb2R1Y3Q7XG4gICAgICAgIGNvbnN0IHB1cHBldGVlckJyb3dzZXJzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByb2R1Y3Q6ICdjaHJvbWUnLFxuICAgICAgICAgICAgICAgIGJyb3dzZXI6IFN1cHBvcnRlZEJyb3dzZXIuQ0hST01FLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRCdWlsZElkOiAnJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJvZHVjdDogJ2ZpcmVmb3gnLFxuICAgICAgICAgICAgICAgIGJyb3dzZXI6IFN1cHBvcnRlZEJyb3dzZXIuRklSRUZPWCxcbiAgICAgICAgICAgICAgICBjdXJyZW50QnVpbGRJZDogJycsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICAvLyBSZXNvbHZlIGN1cnJlbnQgYnVpbGRJZHMuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwdXBwZXRlZXJCcm93c2Vycykge1xuICAgICAgICAgICAgaXRlbS5jdXJyZW50QnVpbGRJZCA9IGF3YWl0IHJlc29sdmVCdWlsZElkKGl0ZW0uYnJvd3NlciwgcGxhdGZvcm0sIChwcm9kdWN0ID09PSBpdGVtLnByb2R1Y3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuY29uZmlndXJhdGlvbi5icm93c2VyUmV2aXNpb25cbiAgICAgICAgICAgICAgICA6IG51bGwpIHx8IFBVUFBFVEVFUl9SRVZJU0lPTlNbaXRlbS5wcm9kdWN0XSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudEJyb3dzZXJCdWlsZHMgPSBuZXcgU2V0KHB1cHBldGVlckJyb3dzZXJzLm1hcChicm93c2VyID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgJHticm93c2VyLmJyb3dzZXJ9XyR7YnJvd3Nlci5jdXJyZW50QnVpbGRJZH1gO1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCcm93c2VycyA9IG5ldyBTZXQocHVwcGV0ZWVyQnJvd3NlcnMubWFwKGJyb3dzZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXIuYnJvd3NlcjtcbiAgICAgICAgfSkpO1xuICAgICAgICBmb3IgKGNvbnN0IGluc3RhbGxlZEJyb3dzZXIgb2YgaW5zdGFsbGVkQnJvd3NlcnMpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHVuaW5zdGFsbCBicm93c2VycyB0aGF0IGFyZSBub3QgbWFuYWdlZCBieSBQdXBwZXRlZXIgeWV0LlxuICAgICAgICAgICAgaWYgKCFjdXJyZW50QnJvd3NlcnMuaGFzKGluc3RhbGxlZEJyb3dzZXIuYnJvd3NlcikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEtlZXAgdGhlIGJyb3dzZXIgYnVpbGQgdXNlZCBieSB0aGUgY3VycmVudCBQdXBwZXRlZXIgaW5zdGFsbGF0aW9uLlxuICAgICAgICAgICAgaWYgKGN1cnJlbnRCcm93c2VyQnVpbGRzLmhhcyhgJHtpbnN0YWxsZWRCcm93c2VyLmJyb3dzZXJ9XyR7aW5zdGFsbGVkQnJvd3Nlci5idWlsZElkfWApKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB1bmluc3RhbGwoe1xuICAgICAgICAgICAgICAgIGJyb3dzZXI6IGluc3RhbGxlZEJyb3dzZXIuYnJvd3NlcixcbiAgICAgICAgICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICAgICAgICAgICBjYWNoZURpcixcbiAgICAgICAgICAgICAgICBidWlsZElkOiBpbnN0YWxsZWRCcm93c2VyLmJ1aWxkSWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVB1cHBldGVlck5vZGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX3J1bkluaXRpYWxpemVycyA9ICh0aGlzICYmIHRoaXMuX19ydW5Jbml0aWFsaXplcnMpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICAgIH1cbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG52YXIgX19lc0RlY29yYXRlID0gKHRoaXMgJiYgdGhpcy5fX2VzRGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICAgIGRvbmUgPSB0cnVlO1xufTtcbnZhciBfX3NldEZ1bmN0aW9uTmFtZSA9ICh0aGlzICYmIHRoaXMuX19zZXRGdW5jdGlvbk5hbWUpIHx8IGZ1bmN0aW9uIChmLCBuYW1lLCBwcmVmaXgpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuaW1wb3J0IHsgc3Bhd24sIHNwYXduU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgUGFzc1Rocm91Z2ggfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IGJ1ZmZlckNvdW50LCBjb25jYXRNYXAsIGZpbHRlciwgZnJvbSwgZnJvbUV2ZW50LCBsYXN0VmFsdWVGcm9tLCBtYXAsIHRha2VVbnRpbCwgdGFwLCB9IGZyb20gJy4uLy4uL3RoaXJkX3BhcnR5L3J4anMvcnhqcy5qcyc7XG5pbXBvcnQgeyBDRFBTZXNzaW9uRXZlbnQgfSBmcm9tICcuLi9hcGkvQ0RQU2Vzc2lvbi5qcyc7XG5pbXBvcnQgeyBkZWJ1Z0Vycm9yLCBmcm9tRW1pdHRlckV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL3V0aWwuanMnO1xuaW1wb3J0IHsgZ3VhcmRlZCB9IGZyb20gJy4uL3V0aWwvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBhc3luY0Rpc3Bvc2VTeW1ib2wgfSBmcm9tICcuLi91dGlsL2Rpc3Bvc2FibGUuanMnO1xuY29uc3QgQ1JGX1ZBTFVFID0gMzA7XG5jb25zdCBERUZBVUxUX0ZQUyA9IDMwO1xuY29uc3QgZGVidWdGZm1wZWcgPSBkZWJ1ZygncHVwcGV0ZWVyOmZmbXBlZycpO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmxldCBTY3JlZW5SZWNvcmRlciA9ICgoKSA9PiB7XG4gICAgbGV0IF9jbGFzc1N1cGVyID0gUGFzc1Rocm91Z2g7XG4gICAgbGV0IF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzID0gW107XG4gICAgbGV0IF9wcml2YXRlX3dyaXRlRnJhbWVfZGVjb3JhdG9ycztcbiAgICBsZXQgX3ByaXZhdGVfd3JpdGVGcmFtZV9kZXNjcmlwdG9yO1xuICAgIGxldCBfc3RvcF9kZWNvcmF0b3JzO1xuICAgIHJldHVybiBjbGFzcyBTY3JlZW5SZWNvcmRlciBleHRlbmRzIF9jbGFzc1N1cGVyIHtcbiAgICAgICAgc3RhdGljIHtcbiAgICAgICAgICAgIGNvbnN0IF9tZXRhZGF0YSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wubWV0YWRhdGEgPyBPYmplY3QuY3JlYXRlKF9jbGFzc1N1cGVyW1N5bWJvbC5tZXRhZGF0YV0gPz8gbnVsbCkgOiB2b2lkIDA7XG4gICAgICAgICAgICBfX2VzRGVjb3JhdGUodGhpcywgX3ByaXZhdGVfd3JpdGVGcmFtZV9kZXNjcmlwdG9yID0geyB2YWx1ZTogX19zZXRGdW5jdGlvbk5hbWUoYXN5bmMgZnVuY3Rpb24gKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jcHJvY2Vzcy5zdGRpbi53cml0ZShidWZmZXIsIHJlc29sdmUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgZmZtcGVnIGZhaWxlZCB0byB3cml0ZTogJHtlcnJvci5tZXNzYWdlfS5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIFwiI3dyaXRlRnJhbWVcIikgfSwgX3ByaXZhdGVfd3JpdGVGcmFtZV9kZWNvcmF0b3JzLCB7IGtpbmQ6IFwibWV0aG9kXCIsIG5hbWU6IFwiI3dyaXRlRnJhbWVcIiwgc3RhdGljOiBmYWxzZSwgcHJpdmF0ZTogdHJ1ZSwgYWNjZXNzOiB7IGhhczogb2JqID0+ICN3cml0ZUZyYW1lIGluIG9iaiwgZ2V0OiBvYmogPT4gb2JqLiN3cml0ZUZyYW1lIH0sIG1ldGFkYXRhOiBfbWV0YWRhdGEgfSwgbnVsbCwgX2luc3RhbmNlRXh0cmFJbml0aWFsaXplcnMpO1xuICAgICAgICAgICAgX19lc0RlY29yYXRlKHRoaXMsIG51bGwsIF9zdG9wX2RlY29yYXRvcnMsIHsga2luZDogXCJtZXRob2RcIiwgbmFtZTogXCJzdG9wXCIsIHN0YXRpYzogZmFsc2UsIHByaXZhdGU6IGZhbHNlLCBhY2Nlc3M6IHsgaGFzOiBvYmogPT4gXCJzdG9wXCIgaW4gb2JqLCBnZXQ6IG9iaiA9PiBvYmouc3RvcCB9LCBtZXRhZGF0YTogX21ldGFkYXRhIH0sIG51bGwsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgICAgIGlmIChfbWV0YWRhdGEpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTeW1ib2wubWV0YWRhdGEsIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IF9tZXRhZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICAjcGFnZSA9IF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXMsIF9pbnN0YW5jZUV4dHJhSW5pdGlhbGl6ZXJzKTtcbiAgICAgICAgI3Byb2Nlc3M7XG4gICAgICAgICNjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICAjbGFzdEZyYW1lO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdHJ1Y3RvcihwYWdlLCB3aWR0aCwgaGVpZ2h0LCB7IHNwZWVkLCBzY2FsZSwgY3JvcCwgZm9ybWF0LCBwYXRoIH0gPSB7fSkge1xuICAgICAgICAgICAgc3VwZXIoeyBhbGxvd0hhbGZPcGVuOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIHBhdGggPz89ICdmZm1wZWcnO1xuICAgICAgICAgICAgLy8gVGVzdHMgaWYgYGZmbXBlZ2AgZXhpc3RzLlxuICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gc3Bhd25TeW5jKHBhdGgpO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNwcm9jZXNzID0gc3Bhd24ocGF0aCwgXG4gICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly90cmFjLmZmbXBlZy5vcmcvd2lraS9FbmNvZGUvVlA5IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGZsYWdzLlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFsnLWxvZ2xldmVsJywgJ2Vycm9yJ10sXG4gICAgICAgICAgICAgICAgLy8gUmVkdWNlcyBnZW5lcmFsIGJ1ZmZlcmluZy5cbiAgICAgICAgICAgICAgICBbJy1hdmlvZmxhZ3MnLCAnZGlyZWN0J10sXG4gICAgICAgICAgICAgICAgLy8gUmVkdWNlcyBpbml0aWFsIGJ1ZmZlcmluZyB3aGlsZSBhbmFseXppbmcgaW5wdXQgZnBzIGFuZCBvdGhlciBzdGF0cy5cbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICctZnBzcHJvYmVzaXplJyxcbiAgICAgICAgICAgICAgICAgICAgJzAnLFxuICAgICAgICAgICAgICAgICAgICAnLXByb2Jlc2l6ZScsXG4gICAgICAgICAgICAgICAgICAgICczMicsXG4gICAgICAgICAgICAgICAgICAgICctYW5hbHl6ZWR1cmF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJzAnLFxuICAgICAgICAgICAgICAgICAgICAnLWZmbGFncycsXG4gICAgICAgICAgICAgICAgICAgICdub2J1ZmZlcicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAvLyBGb3JjZXMgaW5wdXQgdG8gYmUgcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LCBhbmQgZm9yY2VzIHBuZyBpbnB1dFxuICAgICAgICAgICAgICAgIC8vIGltYWdlIGZvcm1hdC5cbiAgICAgICAgICAgICAgICBbJy1mJywgJ2ltYWdlMnBpcGUnLCAnLWM6dicsICdwbmcnLCAnLWknLCAncGlwZTowJ10sXG4gICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIG91dHB1dCBhbmQgbm8gYXVkaW8uXG4gICAgICAgICAgICAgICAgWycteScsICctYW4nXSxcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGRyYXN0aWNhbGx5IHJlZHVjZXMgc3RhbGxpbmcgd2hlbiBjcHUgaXMgb3ZlcmJvb2tlZC4gQnkgZGVmYXVsdFxuICAgICAgICAgICAgICAgIC8vIFZQOSB0cmllcyB0byB1c2UgYWxsIGF2YWlsYWJsZSB0aHJlYWRzP1xuICAgICAgICAgICAgICAgIFsnLXRocmVhZHMnLCAnMSddLFxuICAgICAgICAgICAgICAgIC8vIFNwZWNpZmllcyB0aGUgZnJhbWUgcmF0ZSB3ZSBhcmUgZ2l2aW5nIGZmbXBlZy5cbiAgICAgICAgICAgICAgICBbJy1mcmFtZXJhdGUnLCBgJHtERUZBVUxUX0ZQU31gXSxcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWZpZXMgdGhlIGVuY29kaW5nIGFuZCBmb3JtYXQgd2UgYXJlIHVzaW5nLlxuICAgICAgICAgICAgICAgIHRoaXMuI2dldEZvcm1hdEFyZ3MoZm9ybWF0ID8/ICd3ZWJtJyksXG4gICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBiaXRyYXRlLlxuICAgICAgICAgICAgICAgIFsnLWI6dicsICcwJ10sXG4gICAgICAgICAgICAgICAgLy8gRmlsdGVycyB0byBlbnN1cmUgdGhlIGltYWdlcyBhcmUgcGlwZWQgY29ycmVjdGx5LlxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgJy12ZicsXG4gICAgICAgICAgICAgICAgICAgIGAke3NwZWVkID8gYHNldHB0cz0kezEgLyBzcGVlZH0qUFRTLGAgOiAnJ31jcm9wPSdtaW4oJHt3aWR0aH0saXcpOm1pbigke2hlaWdodH0saWgpOjA6MCcscGFkPSR7d2lkdGh9OiR7aGVpZ2h0fTowOjAke2Nyb3AgPyBgLGNyb3A9JHtjcm9wLndpZHRofToke2Nyb3AuaGVpZ2h0fToke2Nyb3AueH06JHtjcm9wLnl9YCA6ICcnfSR7c2NhbGUgPyBgLHNjYWxlPWl3KiR7c2NhbGV9Oi0xYCA6ICcnfWAsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAncGlwZToxJyxcbiAgICAgICAgICAgIF0uZmxhdCgpLCB7IHN0ZGlvOiBbJ3BpcGUnLCAncGlwZScsICdwaXBlJ10gfSk7XG4gICAgICAgICAgICB0aGlzLiNwcm9jZXNzLnN0ZG91dC5waXBlKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy4jcHJvY2Vzcy5zdGRlcnIub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnRmZtcGVnKGRhdGEudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuI3BhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHRoaXMuI3BhZ2UubWFpbkZyYW1lKCk7XG4gICAgICAgICAgICBjbGllbnQub25jZShDRFBTZXNzaW9uRXZlbnQuRGlzY29ubmVjdGVkLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnN0b3AoKS5jYXRjaChkZWJ1Z0Vycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy4jbGFzdEZyYW1lID0gbGFzdFZhbHVlRnJvbShmcm9tRW1pdHRlckV2ZW50KGNsaWVudCwgJ1BhZ2Uuc2NyZWVuY2FzdEZyYW1lJykucGlwZSh0YXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgY2xpZW50LnNlbmQoJ1BhZ2Uuc2NyZWVuY2FzdEZyYW1lQWNrJywge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IGV2ZW50LnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLCBmaWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmVudC5tZXRhZGF0YS50aW1lc3RhbXAgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pLCBtYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogQnVmZmVyLmZyb20oZXZlbnQuZGF0YSwgJ2Jhc2U2NCcpLFxuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IGV2ZW50Lm1ldGFkYXRhLnRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksIGJ1ZmZlckNvdW50KDIsIDEpLCBjb25jYXRNYXAoKFt7IHRpbWVzdGFtcDogcHJldmlvdXNUaW1lc3RhbXAsIGJ1ZmZlciB9LCB7IHRpbWVzdGFtcCB9XSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tKEFycmF5KE1hdGgucm91bmQoREVGQVVMVF9GUFMgKiBNYXRoLm1heCh0aW1lc3RhbXAgLSBwcmV2aW91c1RpbWVzdGFtcCwgMCkpKS5maWxsKGJ1ZmZlcikpO1xuICAgICAgICAgICAgfSksIG1hcChidWZmZXIgPT4ge1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy4jd3JpdGVGcmFtZShidWZmZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbYnVmZmVyLCBwZXJmb3JtYW5jZS5ub3coKV07XG4gICAgICAgICAgICB9KSwgdGFrZVVudGlsKGZyb21FdmVudCh0aGlzLiNjb250cm9sbGVyLnNpZ25hbCwgJ2Fib3J0JykpKSwgeyBkZWZhdWx0VmFsdWU6IFtCdWZmZXIuZnJvbShbXSksIHBlcmZvcm1hbmNlLm5vdygpXSB9KTtcbiAgICAgICAgfVxuICAgICAgICAjZ2V0Rm9ybWF0QXJncyhmb3JtYXQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnd2VibSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBjb2RlYyB0byB1c2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBbJy1jOnYnLCAndnA5J10sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnLWYnLCAnd2VibSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0cyB0aGUgcXVhbGl0eS4gTG93ZXIgdGhlIGJldHRlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIFsnLWNyZicsIGAke0NSRl9WQUxVRX1gXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldHMgdGhlIHF1YWxpdHkgYW5kIGhvdyBlZmZpY2llbnQgdGhlIGNvbXByZXNzaW9uIHdpbGwgYmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBbJy1kZWFkbGluZScsICdyZWFsdGltZScsICctY3B1LXVzZWQnLCAnOCddLFxuICAgICAgICAgICAgICAgICAgICBdLmZsYXQoKTtcbiAgICAgICAgICAgICAgICBjYXNlICdnaWYnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0cyB0aGUgZnJhbWUgcmF0ZSBhbmQgdXNlcyBhIGN1c3RvbSBwYWxldHRlIGdlbmVyYXRlZCBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQuXG4gICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy12ZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zwcz01LHNwbGl0W3MwXVtzMV07W3MwXXBhbGV0dGVnZW49c3RhdHNfbW9kZT1kaWZmW3BdO1tzMV1bcF1wYWxldHRldXNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnLWYnLCAnZ2lmJ10sXG4gICAgICAgICAgICAgICAgICAgIF0uZmxhdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdldCAjd3JpdGVGcmFtZSgpIHsgcmV0dXJuIF9wcml2YXRlX3dyaXRlRnJhbWVfZGVzY3JpcHRvci52YWx1ZTsgfVxuICAgICAgICAvKipcbiAgICAgICAgICogU3RvcHMgdGhlIHJlY29yZGVyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzdG9wKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2NvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTdG9wcGluZyB0aGUgc2NyZWVuY2FzdCB3aWxsIGZsdXNoIHRoZSBmcmFtZXMuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwYWdlLl9zdG9wU2NyZWVuY2FzdCgpLmNhdGNoKGRlYnVnRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy4jY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgLy8gUmVwZWF0IHRoZSBsYXN0IGZyYW1lIGZvciB0aGUgcmVtYWluaW5nIGZyYW1lcy5cbiAgICAgICAgICAgIGNvbnN0IFtidWZmZXIsIHRpbWVzdGFtcF0gPSBhd2FpdCB0aGlzLiNsYXN0RnJhbWU7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChBcnJheShNYXRoLm1heCgxLCBNYXRoLnJvdW5kKChERUZBVUxUX0ZQUyAqIChwZXJmb3JtYW5jZS5ub3coKSAtIHRpbWVzdGFtcCkpIC8gMTAwMCkpKVxuICAgICAgICAgICAgICAgIC5maWxsKGJ1ZmZlcilcbiAgICAgICAgICAgICAgICAubWFwKHRoaXMuI3dyaXRlRnJhbWUuYmluZCh0aGlzKSkpO1xuICAgICAgICAgICAgLy8gQ2xvc2Ugc3RkaW4gdG8gbm90aWZ5IEZGbXBlZyB3ZSBhcmUgZG9uZS5cbiAgICAgICAgICAgIHRoaXMuI3Byb2Nlc3Muc3RkaW4uZW5kKCk7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNwcm9jZXNzLm9uY2UoJ2Nsb3NlJywgcmVzb2x2ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGludGVybmFsXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBbKF9wcml2YXRlX3dyaXRlRnJhbWVfZGVjb3JhdG9ycyA9IFtndWFyZGVkKCldLCBfc3RvcF9kZWNvcmF0b3JzID0gW2d1YXJkZWQoKV0sIGFzeW5jRGlzcG9zZVN5bWJvbCldKCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9wKCk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmV4cG9ydCB7IFNjcmVlblJlY29yZGVyIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TY3JlZW5SZWNvcmRlci5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9DaHJvbWVMYXVuY2hlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0ZpcmVmb3hMYXVuY2hlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0xhdW5jaE9wdGlvbnMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXBlVHJhbnNwb3J0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHJvZHVjdExhdW5jaGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vUHVwcGV0ZWVyTm9kZS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1NjcmVlblJlY29yZGVyLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vZGUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmltcG9ydCBmcyBmcm9tICdmcyc7XG5jb25zdCBybU9wdGlvbnMgPSB7XG4gICAgZm9yY2U6IHRydWUsXG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgIG1heFJldHJpZXM6IDUsXG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJtKHBhdGgpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLCBybU9wdGlvbnMpO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJtU3luYyhwYXRoKSB7XG4gICAgZnMucm1TeW5jKHBhdGgsIHJtT3B0aW9ucyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mcy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9pbmRleC5qcyc7XG5pbXBvcnQgeyBQdXBwZXRlZXJOb2RlIH0gZnJvbSAnLi9ub2RlL1B1cHBldGVlck5vZGUuanMnO1xuLyoqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IHB1cHBldGVlciA9IG5ldyBQdXBwZXRlZXJOb2RlKHtcbiAgICBpc1B1cHBldGVlckNvcmU6IHRydWUsXG59KTtcbmV4cG9ydCBjb25zdCB7IFxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmNvbm5lY3QsIFxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmRlZmF1bHRBcmdzLCBcbi8qKlxuICogQHB1YmxpY1xuICovXG5leGVjdXRhYmxlUGF0aCwgXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xubGF1bmNoLCB9ID0gcHVwcGV0ZWVyO1xuZXhwb3J0IGRlZmF1bHQgcHVwcGV0ZWVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVwcGV0ZWVyLWNvcmUuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQVVBQRVRFRVJfUkVWSVNJT05TID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgY2hyb21lOiAnMTI2LjAuNjQ3OC4xMjYnLFxuICAgICdjaHJvbWUtaGVhZGxlc3Mtc2hlbGwnOiAnMTI2LjAuNjQ3OC4xMjYnLFxuICAgIGZpcmVmb3g6ICdsYXRlc3QnLFxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXZpc2lvbnMuanMubWFwIiwiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jSXRlcmFibGVVdGlsIHtcbiAgICBzdGF0aWMgYXN5bmMgKm1hcChpdGVyYWJsZSwgbWFwKSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIHlpZWxkIGF3YWl0IG1hcCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jICpmbGF0TWFwKGl0ZXJhYmxlLCBtYXApIHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgeWllbGQqIG1hcCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIGNvbGxlY3QoaXRlcmFibGUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgZmlyc3QoaXRlcmFibGUpIHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Bc3luY0l0ZXJhYmxlVXRpbC5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyNCBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuaW1wb3J0IHsgVGltZW91dEVycm9yIH0gZnJvbSAnLi4vY29tbW9uL0Vycm9ycy5qcyc7XG4vKipcbiAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBkZWZlcnJlZCBvYmplY3QgYWxvbmcgd2l0aCB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zLlxuICpcbiAqIElmIHRoZSBkZWZlcnJlZCBoYXMgbm90IGJlZW4gcmVzb2x2ZWQvcmVqZWN0ZWQgd2l0aGluIHRoZSBgdGltZW91dGAgcGVyaW9kLFxuICogdGhlIGRlZmVycmVkIGdldHMgcmVzb2x2ZXMgd2l0aCBhIHRpbWVvdXQgZXJyb3IuIGB0aW1lb3V0YCBoYXMgdG8gYmUgZ3JlYXRlciB0aGFuIDAgb3JcbiAqIGl0IGlzIGlnbm9yZWQuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgc3RhdGljIGNyZWF0ZShvcHRzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVmZXJyZWQob3B0cyk7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyByYWNlKGF3YWl0YWJsZXMpIHtcbiAgICAgICAgY29uc3QgZGVmZXJyZWRXaXRoVGltZW91dCA9IG5ldyBTZXQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2VzID0gYXdhaXRhYmxlcy5tYXAodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERlZmVycmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS4jdGltZW91dElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZFdpdGhUaW1lb3V0LmFkZCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlT3JUaHJvdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShwcm9taXNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlZmVycmVkIG9mIGRlZmVycmVkV2l0aFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHN0b3AgdGhlIHRpbWVvdXQgZWxzZVxuICAgICAgICAgICAgICAgIC8vIE5vZGUuSlMgd2lsbCBrZWVwIHJ1bm5pbmcgdGhlIGV2ZW50IGxvb3AgdGlsbCB0aGVcbiAgICAgICAgICAgICAgICAvLyB0aW1lciBleGVjdXRlc1xuICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoJ1RpbWVvdXQgY2xlYXJlZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAjaXNSZXNvbHZlZCA9IGZhbHNlO1xuICAgICNpc1JlamVjdGVkID0gZmFsc2U7XG4gICAgI3ZhbHVlO1xuICAgIC8vIFNBRkVUWTogVGhpcyBpcyBlbnN1cmVkIGJ5ICN0YXNrUHJvbWlzZS5cbiAgICAjcmVzb2x2ZTtcbiAgICAjdGFza1Byb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gICAgI3RpbWVvdXRJZDtcbiAgICAjdGltZW91dEVycm9yO1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy50aW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgdGhpcy4jdGltZW91dEVycm9yID0gbmV3IFRpbWVvdXRFcnJvcihvcHRzLm1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy4jdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3QodGhpcy4jdGltZW91dEVycm9yKTtcbiAgICAgICAgICAgIH0sIG9wdHMudGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2ZpbmlzaCh2YWx1ZSkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jdGltZW91dElkKTtcbiAgICAgICAgdGhpcy4jdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZSgpO1xuICAgIH1cbiAgICByZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLiNpc1JlamVjdGVkIHx8IHRoaXMuI2lzUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNpc1Jlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jZmluaXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmVqZWN0KGVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLiNpc1JlamVjdGVkIHx8IHRoaXMuI2lzUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNpc1JlamVjdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jZmluaXNoKGVycm9yKTtcbiAgICB9XG4gICAgcmVzb2x2ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNpc1Jlc29sdmVkO1xuICAgIH1cbiAgICBmaW5pc2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzUmVzb2x2ZWQgfHwgdGhpcy4jaXNSZWplY3RlZDtcbiAgICB9XG4gICAgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2YWx1ZTtcbiAgICB9XG4gICAgI3Byb21pc2U7XG4gICAgdmFsdWVPclRocm93KCkge1xuICAgICAgICBpZiAoIXRoaXMuI3Byb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMuI3Byb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Rhc2tQcm9taXNlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNpc1JlamVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMuI3ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4jdmFsdWU7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9taXNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURlZmVycmVkLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvckxpa2Uob2JqKSB7XG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwgJiYgJ25hbWUnIGluIG9iaiAmJiAnbWVzc2FnZScgaW4gb2JqKTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Vycm5vRXhjZXB0aW9uKG9iaikge1xuICAgIHJldHVybiAoaXNFcnJvckxpa2Uob2JqKSAmJlxuICAgICAgICAoJ2Vycm5vJyBpbiBvYmogfHwgJ2NvZGUnIGluIG9iaiB8fCAncGF0aCcgaW4gb2JqIHx8ICdzeXNjYWxsJyBpbiBvYmopKTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXdyaXRlRXJyb3IoZXJyb3IsIG1lc3NhZ2UsIG9yaWdpbmFsTWVzc2FnZSkge1xuICAgIGVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIGVycm9yLm9yaWdpbmFsTWVzc2FnZSA9IG9yaWdpbmFsTWVzc2FnZSA/PyBlcnJvci5vcmlnaW5hbE1lc3NhZ2U7XG4gICAgcmV0dXJuIGVycm9yO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3RvY29sRXJyb3JNZXNzYWdlKG9iamVjdCkge1xuICAgIGxldCBtZXNzYWdlID0gb2JqZWN0LmVycm9yLm1lc3NhZ2U7XG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoZSB0eXBlIGNoZWNrcyB3aGVuIHdlIHN0b3AgY29ubmVjdGluZyB0byBCaURpIHdpdGggYSBDRFBcbiAgICAvLyBjbGllbnQuXG4gICAgaWYgKG9iamVjdC5lcnJvciAmJlxuICAgICAgICB0eXBlb2Ygb2JqZWN0LmVycm9yID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAnZGF0YScgaW4gb2JqZWN0LmVycm9yKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYCAke29iamVjdC5lcnJvci5kYXRhfWA7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXJyb3JMaWtlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5jb25zdCBjcmVhdGVkRnVuY3Rpb25zID0gbmV3IE1hcCgpO1xuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gZnJvbSBhIHN0cmluZy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUZ1bmN0aW9uID0gKGZ1bmN0aW9uVmFsdWUpID0+IHtcbiAgICBsZXQgZm4gPSBjcmVhdGVkRnVuY3Rpb25zLmdldChmdW5jdGlvblZhbHVlKTtcbiAgICBpZiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuO1xuICAgIH1cbiAgICBmbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICR7ZnVuY3Rpb25WYWx1ZX1gKSgpO1xuICAgIGNyZWF0ZWRGdW5jdGlvbnMuc2V0KGZ1bmN0aW9uVmFsdWUsIGZuKTtcbiAgICByZXR1cm4gZm47XG59O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeUZ1bmN0aW9uKGZuKSB7XG4gICAgbGV0IHZhbHVlID0gZm4udG9TdHJpbmcoKTtcbiAgICB0cnkge1xuICAgICAgICBuZXcgRnVuY3Rpb24oYCgke3ZhbHVlfSlgKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyLm1lc3NhZ2UuaW5jbHVkZXMoYFJlZnVzZWQgdG8gZXZhbHVhdGUgYSBzdHJpbmcgYXMgSmF2YVNjcmlwdCBiZWNhdXNlICd1bnNhZmUtZXZhbCcgaXMgbm90IGFuIGFsbG93ZWQgc291cmNlIG9mIHNjcmlwdCBpbiB0aGUgZm9sbG93aW5nIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGRpcmVjdGl2ZWApKSB7XG4gICAgICAgICAgICAvLyBUaGUgY29udGVudCBzZWN1cml0eSBwb2xpY3kgZG9lcyBub3QgYWxsb3cgRnVuY3Rpb24gZXZhbC4gTGV0J3NcbiAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgdmFsdWUgbWlnaHQgYmUgdmFsaWQgYXMgaXMuXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBtaWdodCBoYXZlIGEgZnVuY3Rpb24gc2hvcnRoYW5kIChlLmcuIGB0ZXN0KCl7fWApLiBMZXQnc1xuICAgICAgICAvLyB0cnkgcHJlZml4aW5nLlxuICAgICAgICBsZXQgcHJlZml4ID0gJ2Z1bmN0aW9uICc7XG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdhc3luYyAnKSkge1xuICAgICAgICAgICAgcHJlZml4ID0gYGFzeW5jICR7cHJlZml4fWA7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygnYXN5bmMgJy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gYCR7cHJlZml4fSR7dmFsdWV9YDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5ldyBGdW5jdGlvbihgKCR7dmFsdWV9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIC8vIFdlIHRyaWVkIGhhcmQgdG8gc2VyaWFsaXplLCBidXQgdGhlcmUncyBhIHdlaXJkIGJlYXN0IGhlcmUuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Bhc3NlZCBmdW5jdGlvbiBjYW5ub3QgYmUgc2VyaWFsaXplZCEnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4vKipcbiAqIFJlcGxhY2VzIGBQTEFDRUhPTERFUmBzIHdpdGggdGhlIGdpdmVuIHJlcGxhY2VtZW50cy5cbiAqXG4gKiBBbGwgcmVwbGFjZW1lbnRzIG11c3QgYmUgdmFsaWQgSlMgY29kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHRzXG4gKiBpbnRlcnBvbGF0ZUZ1bmN0aW9uKCgpID0+IFBMQUNFSE9MREVSKCd0ZXN0JyksIHt0ZXN0OiAndm9pZCAwJ30pO1xuICogLy8gRXF1aXZhbGVudCB0byAoKSA9PiB2b2lkIDBcbiAqIGBgYFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgaW50ZXJwb2xhdGVGdW5jdGlvbiA9IChmbiwgcmVwbGFjZW1lbnRzKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gc3RyaW5naWZ5RnVuY3Rpb24oZm4pO1xuICAgIGZvciAoY29uc3QgW25hbWUsIGpzVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcGxhY2VtZW50cykpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYFBMQUNFSE9MREVSXFxcXChcXFxccyooPzonJHtuYW1lfSd8XCIke25hbWV9XCIpXFxcXHMqXFxcXClgLCAnZycpLCBcbiAgICAgICAgLy8gV3JhcHBpbmcgdGhpcyBlbnN1cmVzIHRlcnNlcnMgdGhhdCBhY2NpZGVudGFsbHkgaW5saW5lIFBMQUNFSE9MREVSIGNhbGxzXG4gICAgICAgIC8vIGFyZSBzdGlsbCB2YWxpZC4gV2l0aG91dCwgd2UgbWF5IGdldCBjYWxscyBsaWtlICgpPT57Li4ufSgpIHdoaWNoIGlzXG4gICAgICAgIC8vIG5vdCB2YWxpZC5cbiAgICAgICAgYCgke2pzVmFsdWV9KWApO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb24odmFsdWUpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUZ1bmN0aW9uLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDI0IEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vRGVmZXJyZWQuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVN5bWJvbCB9IGZyb20gJy4vZGlzcG9zYWJsZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgTXV0ZXgge1xuICAgIHN0YXRpYyBHdWFyZCA9IGNsYXNzIEd1YXJkIHtcbiAgICAgICAgI211dGV4O1xuICAgICAgICAjb25SZWxlYXNlO1xuICAgICAgICBjb25zdHJ1Y3RvcihtdXRleCwgb25SZWxlYXNlKSB7XG4gICAgICAgICAgICB0aGlzLiNtdXRleCA9IG11dGV4O1xuICAgICAgICAgICAgdGhpcy4jb25SZWxlYXNlID0gb25SZWxlYXNlO1xuICAgICAgICB9XG4gICAgICAgIFtkaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgICAgICAgIHRoaXMuI29uUmVsZWFzZT8uKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jbXV0ZXgucmVsZWFzZSgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAjbG9ja2VkID0gZmFsc2U7XG4gICAgI2FjcXVpcmVycyA9IFtdO1xuICAgIC8vIFRoaXMgaXMgRklGTy5cbiAgICBhc3luYyBhY3F1aXJlKG9uUmVsZWFzZSkge1xuICAgICAgICBpZiAoIXRoaXMuI2xvY2tlZCkge1xuICAgICAgICAgICAgdGhpcy4jbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTXV0ZXguR3VhcmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSBEZWZlcnJlZC5jcmVhdGUoKTtcbiAgICAgICAgdGhpcy4jYWNxdWlyZXJzLnB1c2goZGVmZXJyZWQucmVzb2x2ZS5iaW5kKGRlZmVycmVkKSk7XG4gICAgICAgIGF3YWl0IGRlZmVycmVkLnZhbHVlT3JUaHJvdygpO1xuICAgICAgICByZXR1cm4gbmV3IE11dGV4Lkd1YXJkKHRoaXMsIG9uUmVsZWFzZSk7XG4gICAgfVxuICAgIHJlbGVhc2UoKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmUgPSB0aGlzLiNhY3F1aXJlcnMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCFyZXNvbHZlKSB7XG4gICAgICAgICAgICB0aGlzLiNsb2NrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TXV0ZXguanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiB2YWx1ZSBpcyB0cnV0aHkuXG4gKiBAcGFyYW0gdmFsdWUgLSBzb21lIGNvbmRpdGlvbmFsIHN0YXRlbWVudFxuICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHRydXRoeS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGFzc2VydCA9ICh2YWx1ZSwgbWVzc2FnZSkgPT4ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hc3NlcnQuanMubWFwIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIEluYy5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbnZhciBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSA9ICh0aGlzICYmIHRoaXMuX19hZGREaXNwb3NhYmxlUmVzb3VyY2UpIHx8IGZ1bmN0aW9uIChlbnYsIHZhbHVlLCBhc3luYykge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgICAgICB2YXIgZGlzcG9zZTtcbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn07XG52YXIgX19kaXNwb3NlUmVzb3VyY2VzID0gKHRoaXMgJiYgdGhpcy5fX2Rpc3Bvc2VSZXNvdXJjZXMpIHx8IChmdW5jdGlvbiAoU3VwcHJlc3NlZEVycm9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgICAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgICAgICAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICAgICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbnYuc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH07XG59KSh0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufSk7XG5pbXBvcnQgeyBhc3luY0Rpc3Bvc2VTeW1ib2wsIGRpc3Bvc2VTeW1ib2wgfSBmcm9tICcuL2Rpc3Bvc2FibGUuanMnO1xuaW1wb3J0IHsgTXV0ZXggfSBmcm9tICcuL011dGV4LmpzJztcbmNvbnN0IGluc3RhbmNlcyA9IG5ldyBXZWFrU2V0KCk7XG5leHBvcnQgZnVuY3Rpb24gbW92ZWFibGUoQ2xhc3MsIF8pIHtcbiAgICBsZXQgaGFzRGlzcG9zZSA9IGZhbHNlO1xuICAgIGlmIChDbGFzcy5wcm90b3R5cGVbZGlzcG9zZVN5bWJvbF0pIHtcbiAgICAgICAgY29uc3QgZGlzcG9zZSA9IENsYXNzLnByb3RvdHlwZVtkaXNwb3NlU3ltYm9sXTtcbiAgICAgICAgQ2xhc3MucHJvdG90eXBlW2Rpc3Bvc2VTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlcy5oYXModGhpcykpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXMuZGVsZXRlKHRoaXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkaXNwb3NlLmNhbGwodGhpcyk7XG4gICAgICAgIH07XG4gICAgICAgIGhhc0Rpc3Bvc2UgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoQ2xhc3MucHJvdG90eXBlW2FzeW5jRGlzcG9zZVN5bWJvbF0pIHtcbiAgICAgICAgY29uc3QgYXN5bmNEaXNwb3NlID0gQ2xhc3MucHJvdG90eXBlW2FzeW5jRGlzcG9zZVN5bWJvbF07XG4gICAgICAgIENsYXNzLnByb3RvdHlwZVthc3luY0Rpc3Bvc2VTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlcy5oYXModGhpcykpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXMuZGVsZXRlKHRoaXMpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhc3luY0Rpc3Bvc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgaGFzRGlzcG9zZSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChoYXNEaXNwb3NlKSB7XG4gICAgICAgIENsYXNzLnByb3RvdHlwZS5tb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaW5zdGFuY2VzLmFkZCh0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gQ2xhc3M7XG59XG5leHBvcnQgZnVuY3Rpb24gdGhyb3dJZkRpc3Bvc2VkKG1lc3NhZ2UgPSB2YWx1ZSA9PiB7XG4gICAgcmV0dXJuIGBBdHRlbXB0ZWQgdG8gdXNlIGRpc3Bvc2VkICR7dmFsdWUuY29uc3RydWN0b3IubmFtZX0uYDtcbn0pIHtcbiAgICByZXR1cm4gKHRhcmdldCwgXykgPT4ge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UodGhpcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gaW5lcnRJZkRpc3Bvc2VkKHRhcmdldCwgXykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQuY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICB9O1xufVxuLyoqXG4gKiBUaGUgZGVjb3JhdG9yIG9ubHkgaW52b2tlcyB0aGUgdGFyZ2V0IGlmIHRoZSB0YXJnZXQgaGFzIG5vdCBiZWVuIGludm9rZWQgd2l0aFxuICogdGhlIHNhbWUgYXJndW1lbnRzIGJlZm9yZS4gVGhlIGRlY29yYXRlZCBtZXRob2QgdGhyb3dzIGFuIGVycm9yIGlmIGl0J3NcbiAqIGludm9rZWQgd2l0aCBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHM6IGlmIHlvdSBkZWNvcmF0ZSBhIG1ldGhvZCwgaXRcbiAqIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHNcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUF0TW9zdE9uY2VGb3JBcmd1bWVudHModGFyZ2V0LCBfKSB7XG4gICAgY29uc3QgY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuICAgIGxldCBjYWNoZURlcHRoID0gLTE7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIGlmIChjYWNoZURlcHRoID09PSAtMSkge1xuICAgICAgICAgICAgY2FjaGVEZXB0aCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYWNoZURlcHRoICE9PSBhcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vaXplZCBtZXRob2Qgd2FzIGNhbGxlZCB3aXRoIHRoZSB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZyZXNoQXJndW1lbnRzID0gZmFsc2U7XG4gICAgICAgIGxldCBjYWNoZUl0ZXJhdG9yID0gY2FjaGU7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgIGlmIChjYWNoZUl0ZXJhdG9yLmhhcyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgY2FjaGVJdGVyYXRvciA9IGNhY2hlSXRlcmF0b3IuZ2V0KGFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcmVzaEFyZ3VtZW50cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2FjaGVJdGVyYXRvci5zZXQoYXJnLCBuZXcgV2Vha01hcCgpKTtcbiAgICAgICAgICAgICAgICBjYWNoZUl0ZXJhdG9yID0gY2FjaGVJdGVyYXRvci5nZXQoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZyZXNoQXJndW1lbnRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZ3VhcmRlZChnZXRLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG59KSB7XG4gICAgcmV0dXJuICh0YXJnZXQsIF8pID0+IHtcbiAgICAgICAgY29uc3QgbXV0ZXhlcyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgZW52XzEgPSB7IHN0YWNrOiBbXSwgZXJyb3I6IHZvaWQgMCwgaGFzRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGdldEtleS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIGxldCBtdXRleCA9IG11dGV4ZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFtdXRleCkge1xuICAgICAgICAgICAgICAgICAgICBtdXRleCA9IG5ldyBNdXRleCgpO1xuICAgICAgICAgICAgICAgICAgICBtdXRleGVzLnNldChrZXksIG11dGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgXyA9IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudl8xLCBhd2FpdCBtdXRleC5hY3F1aXJlKCksIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0YXJnZXQuY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzEpIHtcbiAgICAgICAgICAgICAgICBlbnZfMS5lcnJvciA9IGVfMTtcbiAgICAgICAgICAgICAgICBlbnZfMS5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRfMSA9IF9fZGlzcG9zZVJlc291cmNlcyhlbnZfMSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdF8xKVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXN1bHRfMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9O1xufVxuY29uc3QgYnViYmxlSGFuZGxlcnMgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgYnViYmxlSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZXZlbnRzKSB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSBidWJibGVIYW5kbGVycy5nZXQodGhpcykgPz8gbmV3IE1hcCgpO1xuICAgIGlmIChoYW5kbGVycy5oYXMoZXZlbnRzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXIgPSBldmVudHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/ICh0eXBlLCBldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50cy5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCh0eXBlLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgOiAodHlwZSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCh0eXBlLCBldmVudCk7XG4gICAgICAgIH07XG4gICAgaGFuZGxlcnMuc2V0KGV2ZW50cywgaGFuZGxlcik7XG4gICAgYnViYmxlSGFuZGxlcnMuc2V0KHRoaXMsIGhhbmRsZXJzKTtcbn07XG4vKipcbiAqIEV2ZW50IGVtaXR0ZXIgZmllbGRzIG1hcmtlZCB3aXRoIGBidWJibGVgIHdpbGwgaGF2ZSB0aGVpciBldmVudHMgYnViYmxlIHVwXG4gKiB0aGUgZmllbGQgb3duZXIuXG4gKi9cbi8vIFRoZSB0eXBlIGlzIHRvbyBjb21wbGljYXRlZCB0byB0eXBlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbmV4cG9ydCBmdW5jdGlvbiBidWJibGUoZXZlbnRzKSB7XG4gICAgcmV0dXJuICh7IHNldCwgZ2V0IH0sIGNvbnRleHQpID0+IHtcbiAgICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gYnViYmxlSW5pdGlhbGl6ZXIuYXBwbHkodGhpcywgW2V2ZW50c10pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNldChlbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IGJ1YmJsZUhhbmRsZXJzLmdldCh0aGlzKS5nZXQoZXZlbnRzKTtcbiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGFyZSByZS1zZXR0aW5nLlxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZEVtaXR0ZXIgPSBnZXQuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAob2xkRW1pdHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZEVtaXR0ZXIub2ZmKCcqJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbWl0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbWl0dGVyLm9uKCcqJywgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgc2V0LmNhbGwodGhpcywgZW1pdHRlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5pdChlbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVtaXR0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1pdHRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnViYmxlSW5pdGlhbGl6ZXIuYXBwbHkodGhpcywgW2V2ZW50c10pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBidWJibGVIYW5kbGVycy5nZXQodGhpcykuZ2V0KGV2ZW50cyk7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5vbignKicsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbWl0dGVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVjb3JhdG9ycy5qcy5tYXAiLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgSW5jLlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcbiAqL1xuU3ltYm9sLmRpc3Bvc2UgPz89IFN5bWJvbCgnZGlzcG9zZScpO1xuU3ltYm9sLmFzeW5jRGlzcG9zZSA/Pz0gU3ltYm9sKCdhc3luY0Rpc3Bvc2UnKTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBkaXNwb3NlU3ltYm9sID0gU3ltYm9sLmRpc3Bvc2U7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgYXN5bmNEaXNwb3NlU3ltYm9sID0gU3ltYm9sLmFzeW5jRGlzcG9zZTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXNwb3NhYmxlU3RhY2sge1xuICAgICNkaXNwb3NlZCA9IGZhbHNlO1xuICAgICNzdGFjayA9IFtdO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBzdGFjayBoYXMgYmVlbiBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBnZXQgZGlzcG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkaXNwb3NlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzcG9zZXMgZWFjaCByZXNvdXJjZSBpbiB0aGUgc3RhY2sgaW4gdGhlIHJldmVyc2Ugb3JkZXIgdGhhdCB0aGV5IHdlcmUgYWRkZWQuXG4gICAgICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHRoaXMuI3N0YWNrLnJldmVyc2UoKSkge1xuICAgICAgICAgICAgcmVzb3VyY2VbZGlzcG9zZVN5bWJvbF0oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZGlzcG9zYWJsZSByZXNvdXJjZSB0byB0aGUgc3RhY2ssIHJldHVybmluZyB0aGUgcmVzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgcmVzb3VyY2UgdG8gYWRkLiBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIHdpbGwgbm90IGJlIGFkZGVkLFxuICAgICAqIGJ1dCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEByZXR1cm5zIFRoZSBwcm92aWRlZCBgdmFsdWVgLlxuICAgICAqL1xuICAgIHVzZSh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuI3N0YWNrLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHZhbHVlIGFuZCBhc3NvY2lhdGVkIGRpc3Bvc2FsIGNhbGxiYWNrIGFzIGEgcmVzb3VyY2UgdG8gdGhlIHN0YWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0gb25EaXNwb3NlIC0gVGhlIGNhbGxiYWNrIHRvIHVzZSBpbiBwbGFjZSBvZiBhIGBbZGlzcG9zZVN5bWJvbF0oKWBcbiAgICAgKiBtZXRob2QuIFdpbGwgYmUgaW52b2tlZCB3aXRoIGB2YWx1ZWAgYXMgdGhlIGZpcnN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvdmlkZWQgYHZhbHVlYC5cbiAgICAgKi9cbiAgICBhZG9wdCh2YWx1ZSwgb25EaXNwb3NlKSB7XG4gICAgICAgIHRoaXMuI3N0YWNrLnB1c2goe1xuICAgICAgICAgICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICAgICAgICAgIG9uRGlzcG9zZSh2YWx1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBzdGFjayBpcyBkaXNwb3NlZC5cbiAgICAgKi9cbiAgICBkZWZlcihvbkRpc3Bvc2UpIHtcbiAgICAgICAgdGhpcy4jc3RhY2sucHVzaCh7XG4gICAgICAgICAgICBbZGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgICAgICAgICAgb25EaXNwb3NlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTW92ZSBhbGwgcmVzb3VyY2VzIG91dCBvZiB0aGlzIHN0YWNrIGFuZCBpbnRvIGEgbmV3IGBEaXNwb3NhYmxlU3RhY2tgLCBhbmRcbiAgICAgKiBtYXJrcyB0aGlzIHN0YWNrIGFzIGRpc3Bvc2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY2xhc3MgQyB7XG4gICAgICogICAjcmVzMTogRGlzcG9zYWJsZTtcbiAgICAgKiAgICNyZXMyOiBEaXNwb3NhYmxlO1xuICAgICAqICAgI2Rpc3Bvc2FibGVzOiBEaXNwb3NhYmxlU3RhY2s7XG4gICAgICogICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgKiAgICAgLy8gc3RhY2sgd2lsbCBiZSBkaXNwb3NlZCB3aGVuIGV4aXRpbmcgY29uc3RydWN0b3IgZm9yIGFueSByZWFzb25cbiAgICAgKiAgICAgdXNpbmcgc3RhY2sgPSBuZXcgRGlzcG9zYWJsZVN0YWNrKCk7XG4gICAgICpcbiAgICAgKiAgICAgLy8gZ2V0IGZpcnN0IHJlc291cmNlXG4gICAgICogICAgIHRoaXMuI3JlczEgPSBzdGFjay51c2UoZ2V0UmVzb3VyY2UxKCkpO1xuICAgICAqXG4gICAgICogICAgIC8vIGdldCBzZWNvbmQgcmVzb3VyY2UuIElmIHRoaXMgZmFpbHMsIGJvdGggYHN0YWNrYCBhbmQgYCNyZXMxYCB3aWxsIGJlIGRpc3Bvc2VkLlxuICAgICAqICAgICB0aGlzLiNyZXMyID0gc3RhY2sudXNlKGdldFJlc291cmNlMigpKTtcbiAgICAgKlxuICAgICAqICAgICAvLyBhbGwgb3BlcmF0aW9ucyBzdWNjZWVkZWQsIG1vdmUgcmVzb3VyY2VzIG91dCBvZiBgc3RhY2tgIHNvIHRoYXRcbiAgICAgKiAgICAgLy8gdGhleSBhcmVuJ3QgZGlzcG9zZWQgd2hlbiBjb25zdHJ1Y3RvciBleGl0c1xuICAgICAqICAgICB0aGlzLiNkaXNwb3NhYmxlcyA9IHN0YWNrLm1vdmUoKTtcbiAgICAgKiAgIH1cbiAgICAgKlxuICAgICAqICAgW2Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAqICAgICB0aGlzLiNkaXNwb3NhYmxlcy5kaXNwb3NlKCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCdhIGRpc3Bvc2VkIHN0YWNrIGNhbiBub3QgdXNlIGFueXRoaW5nIG5ldycpOyAvLyBzdGVwIDNcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGFjayA9IG5ldyBEaXNwb3NhYmxlU3RhY2soKTsgLy8gc3RlcCA0LTVcbiAgICAgICAgc3RhY2suI3N0YWNrID0gdGhpcy4jc3RhY2s7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH1cbiAgICBbZGlzcG9zZVN5bWJvbF0gPSB0aGlzLmRpc3Bvc2U7XG4gICAgW1N5bWJvbC50b1N0cmluZ1RhZ10gPSAnRGlzcG9zYWJsZVN0YWNrJztcbn1cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0Rpc3Bvc2FibGVTdGFjayB7XG4gICAgI2Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgI3N0YWNrID0gW107XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHN0YWNrIGhhcyBiZWVuIGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIGdldCBkaXNwb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3Bvc2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwb3NlcyBlYWNoIHJlc291cmNlIGluIHRoZSBzdGFjayBpbiB0aGUgcmV2ZXJzZSBvcmRlciB0aGF0IHRoZXkgd2VyZSBhZGRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBkaXNwb3NlKCkge1xuICAgICAgICBpZiAodGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNkaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgdGhpcy4jc3RhY2sucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBhd2FpdCByZXNvdXJjZVthc3luY0Rpc3Bvc2VTeW1ib2xdKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGRpc3Bvc2FibGUgcmVzb3VyY2UgdG8gdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIHJlc291cmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHJlc291cmNlIHRvIGFkZC4gYG51bGxgIGFuZCBgdW5kZWZpbmVkYCB3aWxsIG5vdCBiZSBhZGRlZCxcbiAgICAgKiBidXQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvdmlkZWQgYHZhbHVlYC5cbiAgICAgKi9cbiAgICB1c2UodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLiNzdGFjay5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB2YWx1ZSBhbmQgYXNzb2NpYXRlZCBkaXNwb3NhbCBjYWxsYmFjayBhcyBhIHJlc291cmNlIHRvIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBhZGQuXG4gICAgICogQHBhcmFtIG9uRGlzcG9zZSAtIFRoZSBjYWxsYmFjayB0byB1c2UgaW4gcGxhY2Ugb2YgYSBgW2Rpc3Bvc2VTeW1ib2xdKClgXG4gICAgICogbWV0aG9kLiBXaWxsIGJlIGludm9rZWQgd2l0aCBgdmFsdWVgIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIuXG4gICAgICogQHJldHVybnMgVGhlIHByb3ZpZGVkIGB2YWx1ZWAuXG4gICAgICovXG4gICAgYWRvcHQodmFsdWUsIG9uRGlzcG9zZSkge1xuICAgICAgICB0aGlzLiNzdGFjay5wdXNoKHtcbiAgICAgICAgICAgIFthc3luY0Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvbkRpc3Bvc2UodmFsdWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc3RhY2sgaXMgZGlzcG9zZWQuXG4gICAgICovXG4gICAgZGVmZXIob25EaXNwb3NlKSB7XG4gICAgICAgIHRoaXMuI3N0YWNrLnB1c2goe1xuICAgICAgICAgICAgW2FzeW5jRGlzcG9zZVN5bWJvbF0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9uRGlzcG9zZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdmUgYWxsIHJlc291cmNlcyBvdXQgb2YgdGhpcyBzdGFjayBhbmQgaW50byBhIG5ldyBgRGlzcG9zYWJsZVN0YWNrYCwgYW5kXG4gICAgICogbWFya3MgdGhpcyBzdGFjayBhcyBkaXNwb3NlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNsYXNzIEMge1xuICAgICAqICAgI3JlczE6IERpc3Bvc2FibGU7XG4gICAgICogICAjcmVzMjogRGlzcG9zYWJsZTtcbiAgICAgKiAgICNkaXNwb3NhYmxlczogRGlzcG9zYWJsZVN0YWNrO1xuICAgICAqICAgY29uc3RydWN0b3IoKSB7XG4gICAgICogICAgIC8vIHN0YWNrIHdpbGwgYmUgZGlzcG9zZWQgd2hlbiBleGl0aW5nIGNvbnN0cnVjdG9yIGZvciBhbnkgcmVhc29uXG4gICAgICogICAgIHVzaW5nIHN0YWNrID0gbmV3IERpc3Bvc2FibGVTdGFjaygpO1xuICAgICAqXG4gICAgICogICAgIC8vIGdldCBmaXJzdCByZXNvdXJjZVxuICAgICAqICAgICB0aGlzLiNyZXMxID0gc3RhY2sudXNlKGdldFJlc291cmNlMSgpKTtcbiAgICAgKlxuICAgICAqICAgICAvLyBnZXQgc2Vjb25kIHJlc291cmNlLiBJZiB0aGlzIGZhaWxzLCBib3RoIGBzdGFja2AgYW5kIGAjcmVzMWAgd2lsbCBiZSBkaXNwb3NlZC5cbiAgICAgKiAgICAgdGhpcy4jcmVzMiA9IHN0YWNrLnVzZShnZXRSZXNvdXJjZTIoKSk7XG4gICAgICpcbiAgICAgKiAgICAgLy8gYWxsIG9wZXJhdGlvbnMgc3VjY2VlZGVkLCBtb3ZlIHJlc291cmNlcyBvdXQgb2YgYHN0YWNrYCBzbyB0aGF0XG4gICAgICogICAgIC8vIHRoZXkgYXJlbid0IGRpc3Bvc2VkIHdoZW4gY29uc3RydWN0b3IgZXhpdHNcbiAgICAgKiAgICAgdGhpcy4jZGlzcG9zYWJsZXMgPSBzdGFjay5tb3ZlKCk7XG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiAgIFtkaXNwb3NlU3ltYm9sXSgpIHtcbiAgICAgKiAgICAgdGhpcy4jZGlzcG9zYWJsZXMuZGlzcG9zZSgpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb3ZlKCkge1xuICAgICAgICBpZiAodGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcignYSBkaXNwb3NlZCBzdGFjayBjYW4gbm90IHVzZSBhbnl0aGluZyBuZXcnKTsgLy8gc3RlcCAzXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgQXN5bmNEaXNwb3NhYmxlU3RhY2soKTsgLy8gc3RlcCA0LTVcbiAgICAgICAgc3RhY2suI3N0YWNrID0gdGhpcy4jc3RhY2s7XG4gICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH1cbiAgICBbYXN5bmNEaXNwb3NlU3ltYm9sXSA9IHRoaXMuZGlzcG9zZTtcbiAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdBc3luY0Rpc3Bvc2FibGVTdGFjayc7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXNwb3NhYmxlLmpzLm1hcCIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuICovXG5leHBvcnQgKiBmcm9tICcuL2Fzc2VydC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL0RlZmVycmVkLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vRXJyb3JMaWtlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vQXN5bmNJdGVyYWJsZVV0aWwuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXNwb3NhYmxlLmpzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWwuanMubWFwIiwiLyoqXG5NSVQgTGljZW5zZVxuXG5Db3B5cmlnaHQgKGMpIDIwMjEgSmFzb24gTWlsbGVyXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG5jb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG5TT0ZUV0FSRS5cblxuKi9cbi8vIC4uLy4uL25vZGVfbW9kdWxlcy9taXR0L2Rpc3QvbWl0dC5tanNcbmZ1bmN0aW9uIG1pdHRfZGVmYXVsdChuKSB7XG4gIHJldHVybiB7IGFsbDogbiA9IG4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgb246IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICB2YXIgaSA9IG4uZ2V0KHQpO1xuICAgIGkgPyBpLnB1c2goZSkgOiBuLnNldCh0LCBbZV0pO1xuICB9LCBvZmY6IGZ1bmN0aW9uKHQsIGUpIHtcbiAgICB2YXIgaSA9IG4uZ2V0KHQpO1xuICAgIGkgJiYgKGUgPyBpLnNwbGljZShpLmluZGV4T2YoZSkgPj4+IDAsIDEpIDogbi5zZXQodCwgW10pKTtcbiAgfSwgZW1pdDogZnVuY3Rpb24odCwgZSkge1xuICAgIHZhciBpID0gbi5nZXQodCk7XG4gICAgaSAmJiBpLnNsaWNlKCkubWFwKGZ1bmN0aW9uKG4yKSB7XG4gICAgICBuMihlKTtcbiAgICB9KSwgKGkgPSBuLmdldChcIipcIikpICYmIGkuc2xpY2UoKS5tYXAoZnVuY3Rpb24objIpIHtcbiAgICAgIG4yKHQsIGUpO1xuICAgIH0pO1xuICB9IH07XG59XG5leHBvcnQge1xuICBtaXR0X2RlZmF1bHQgYXMgZGVmYXVsdFxufTtcbiIsIi8qKlxuTUlUIExpY2Vuc2VcblxuQ29weXJpZ2h0IChjKSAyMDIwIExlYSBWZXJvdVxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuU09GVFdBUkUuXG5cbiovXG4vLyAuLi8uLi9ub2RlX21vZHVsZXMvcGFyc2VsLWpzL2Rpc3QvcGFyc2VsLmpzXG52YXIgVE9LRU5TID0ge1xuICBhdHRyaWJ1dGU6IC9cXFtcXHMqKD86KD88bmFtZXNwYWNlPlxcKnxbLVxcd1xcUHtBU0NJSX1dKilcXHwpPyg/PG5hbWU+Wy1cXHdcXFB7QVNDSUl9XSspXFxzKig/Oig/PG9wZXJhdG9yPlxcVz89KVxccyooPzx2YWx1ZT4uKz8pXFxzKihcXHMoPzxjYXNlU2Vuc2l0aXZlPltpSXNTXSkpP1xccyopP1xcXS9ndSxcbiAgaWQ6IC8jKD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykvZ3UsXG4gIGNsYXNzOiAvXFwuKD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykvZ3UsXG4gIGNvbW1hOiAvXFxzKixcXHMqL2csXG4gIGNvbWJpbmF0b3I6IC9cXHMqW1xccz4rfl1cXHMqL2csXG4gIFwicHNldWRvLWVsZW1lbnRcIjogLzo6KD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykoPzpcXCgoPzxhcmd1bWVudD7CtiopXFwpKT8vZ3UsXG4gIFwicHNldWRvLWNsYXNzXCI6IC86KD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykoPzpcXCgoPzxhcmd1bWVudD7CtiopXFwpKT8vZ3UsXG4gIHVuaXZlcnNhbDogLyg/Oig/PG5hbWVzcGFjZT5cXCp8Wy1cXHdcXFB7QVNDSUl9XSopXFx8KT9cXCovZ3UsXG4gIHR5cGU6IC8oPzooPzxuYW1lc3BhY2U+XFwqfFstXFx3XFxQe0FTQ0lJfV0qKVxcfCk/KD88bmFtZT5bLVxcd1xcUHtBU0NJSX1dKykvZ3VcbiAgLy8gdGhpcyBtdXN0IGJlIGxhc3Rcbn07XG52YXIgVFJJTV9UT0tFTlMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXCJjb21iaW5hdG9yXCIsIFwiY29tbWFcIl0pO1xudmFyIGdldEFyZ3VtZW50UGF0dGVybkJ5VHlwZSA9ICh0eXBlKSA9PiB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJwc2V1ZG8tZWxlbWVudFwiOlxuICAgIGNhc2UgXCJwc2V1ZG8tY2xhc3NcIjpcbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKFRPS0VOU1t0eXBlXS5zb3VyY2UucmVwbGFjZShcIig/PGFyZ3VtZW50PlxceEI2KilcIiwgXCIoPzxhcmd1bWVudD4uKilcIiksIFwiZ3VcIik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBUT0tFTlNbdHlwZV07XG4gIH1cbn07XG5mdW5jdGlvbiBnb2JibGVQYXJlbnModGV4dCwgb2Zmc2V0KSB7XG4gIGxldCBuZXN0aW5nID0gMDtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGZvciAoOyBvZmZzZXQgPCB0ZXh0Lmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICBjb25zdCBjaGFyID0gdGV4dFtvZmZzZXRdO1xuICAgIHN3aXRjaCAoY2hhcikge1xuICAgICAgY2FzZSBcIihcIjpcbiAgICAgICAgKytuZXN0aW5nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCIpXCI6XG4gICAgICAgIC0tbmVzdGluZztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJlc3VsdCArPSBjaGFyO1xuICAgIGlmIChuZXN0aW5nID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdG9rZW5pemVCeSh0ZXh0LCBncmFtbWFyID0gVE9LRU5TKSB7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCB0b2tlbnMgPSBbdGV4dF07XG4gIGZvciAoY29uc3QgW3R5cGUsIHBhdHRlcm5dIG9mIE9iamVjdC5lbnRyaWVzKGdyYW1tYXIpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKHRva2VuKTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBmcm9tID0gbWF0Y2guaW5kZXggLSAxO1xuICAgICAgY29uc3QgYXJncyA9IFtdO1xuICAgICAgY29uc3QgY29udGVudCA9IG1hdGNoWzBdO1xuICAgICAgY29uc3QgYmVmb3JlID0gdG9rZW4uc2xpY2UoMCwgZnJvbSArIDEpO1xuICAgICAgaWYgKGJlZm9yZSkge1xuICAgICAgICBhcmdzLnB1c2goYmVmb3JlKTtcbiAgICAgIH1cbiAgICAgIGFyZ3MucHVzaCh7XG4gICAgICAgIC4uLm1hdGNoLmdyb3VwcyxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgY29udGVudFxuICAgICAgfSk7XG4gICAgICBjb25zdCBhZnRlciA9IHRva2VuLnNsaWNlKGZyb20gKyBjb250ZW50Lmxlbmd0aCArIDEpO1xuICAgICAgaWYgKGFmdGVyKSB7XG4gICAgICAgIGFyZ3MucHVzaChhZnRlcik7XG4gICAgICB9XG4gICAgICB0b2tlbnMuc3BsaWNlKGksIDEsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB0b2tlbikge1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2VxdWVuY2UgJHt0b2tlbn0gZm91bmQgYXQgaW5kZXggJHtvZmZzZXR9YCk7XG4gICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgIG9mZnNldCArPSB0b2tlbi5jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgdG9rZW4ucG9zID0gW29mZnNldCAtIHRva2VuLmNvbnRlbnQubGVuZ3RoLCBvZmZzZXRdO1xuICAgICAgICBpZiAoVFJJTV9UT0tFTlMuaGFzKHRva2VuLnR5cGUpKSB7XG4gICAgICAgICAgdG9rZW4uY29udGVudCA9IHRva2VuLmNvbnRlbnQudHJpbSgpIHx8IFwiIFwiO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG9rZW5zO1xufVxudmFyIFNUUklOR19QQVRURVJOID0gLyhbJ1wiXSkoW15cXFxcXFxuXSs/KVxcMS9nO1xudmFyIEVTQ0FQRV9QQVRURVJOID0gL1xcXFwuL2c7XG5mdW5jdGlvbiB0b2tlbml6ZShzZWxlY3RvciwgZ3JhbW1hciA9IFRPS0VOUykge1xuICBzZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKTtcbiAgaWYgKHNlbGVjdG9yID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHJlcGxhY2VtZW50cyA9IFtdO1xuICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoRVNDQVBFX1BBVFRFUk4sICh2YWx1ZSwgb2Zmc2V0KSA9PiB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyB2YWx1ZSwgb2Zmc2V0IH0pO1xuICAgIHJldHVybiBcIlxcdUUwMDBcIi5yZXBlYXQodmFsdWUubGVuZ3RoKTtcbiAgfSk7XG4gIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZShTVFJJTkdfUEFUVEVSTiwgKHZhbHVlLCBxdW90ZSwgY29udGVudCwgb2Zmc2V0KSA9PiB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyB2YWx1ZSwgb2Zmc2V0IH0pO1xuICAgIHJldHVybiBgJHtxdW90ZX0ke1wiXFx1RTAwMVwiLnJlcGVhdChjb250ZW50Lmxlbmd0aCl9JHtxdW90ZX1gO1xuICB9KTtcbiAge1xuICAgIGxldCBwb3MgPSAwO1xuICAgIGxldCBvZmZzZXQ7XG4gICAgd2hpbGUgKChvZmZzZXQgPSBzZWxlY3Rvci5pbmRleE9mKFwiKFwiLCBwb3MpKSA+IC0xKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGdvYmJsZVBhcmVucyhzZWxlY3Rvciwgb2Zmc2V0KTtcbiAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHsgdmFsdWUsIG9mZnNldCB9KTtcbiAgICAgIHNlbGVjdG9yID0gYCR7c2VsZWN0b3Iuc3Vic3RyaW5nKDAsIG9mZnNldCl9KCR7XCJcXHhCNlwiLnJlcGVhdCh2YWx1ZS5sZW5ndGggLSAyKX0pJHtzZWxlY3Rvci5zdWJzdHJpbmcob2Zmc2V0ICsgdmFsdWUubGVuZ3RoKX1gO1xuICAgICAgcG9zID0gb2Zmc2V0ICsgdmFsdWUubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZUJ5KHNlbGVjdG9yLCBncmFtbWFyKTtcbiAgY29uc3QgY2hhbmdlZFRva2VucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGZvciAoY29uc3QgcmVwbGFjZW1lbnQgb2YgcmVwbGFjZW1lbnRzLnJldmVyc2UoKSkge1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICBjb25zdCB7IG9mZnNldCwgdmFsdWUgfSA9IHJlcGxhY2VtZW50O1xuICAgICAgaWYgKCEodG9rZW4ucG9zWzBdIDw9IG9mZnNldCAmJiBvZmZzZXQgKyB2YWx1ZS5sZW5ndGggPD0gdG9rZW4ucG9zWzFdKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgY29udGVudCB9ID0gdG9rZW47XG4gICAgICBjb25zdCB0b2tlbk9mZnNldCA9IG9mZnNldCAtIHRva2VuLnBvc1swXTtcbiAgICAgIHRva2VuLmNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIHRva2VuT2Zmc2V0KSArIHZhbHVlICsgY29udGVudC5zbGljZSh0b2tlbk9mZnNldCArIHZhbHVlLmxlbmd0aCk7XG4gICAgICBpZiAodG9rZW4uY29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgICBjaGFuZ2VkVG9rZW5zLmFkZCh0b2tlbik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZvciAoY29uc3QgdG9rZW4gb2YgY2hhbmdlZFRva2Vucykge1xuICAgIGNvbnN0IHBhdHRlcm4gPSBnZXRBcmd1bWVudFBhdHRlcm5CeVR5cGUodG9rZW4udHlwZSk7XG4gICAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdG9rZW4gdHlwZTogJHt0b2tlbi50eXBlfWApO1xuICAgIH1cbiAgICBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWModG9rZW4uY29udGVudCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgY29udGVudCBmb3IgJHt0b2tlbi50eXBlfTogJHt0b2tlbi5jb250ZW50fWApO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHRva2VuLCBtYXRjaC5ncm91cHMpO1xuICB9XG4gIHJldHVybiB0b2tlbnM7XG59XG5mdW5jdGlvbiogZmxhdHRlbihub2RlLCBwYXJlbnQpIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlIFwibGlzdFwiOlxuICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5saXN0KSB7XG4gICAgICAgIHlpZWxkKiBmbGF0dGVuKGNoaWxkLCBub2RlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJjb21wbGV4XCI6XG4gICAgICB5aWVsZCogZmxhdHRlbihub2RlLmxlZnQsIG5vZGUpO1xuICAgICAgeWllbGQqIGZsYXR0ZW4obm9kZS5yaWdodCwgbm9kZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiY29tcG91bmRcIjpcbiAgICAgIHlpZWxkKiBub2RlLmxpc3QubWFwKCh0b2tlbikgPT4gW3Rva2VuLCBub2RlXSk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgeWllbGQgW25vZGUsIHBhcmVudF07XG4gIH1cbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeShsaXN0T3JOb2RlKSB7XG4gIGxldCB0b2tlbnM7XG4gIGlmIChBcnJheS5pc0FycmF5KGxpc3RPck5vZGUpKSB7XG4gICAgdG9rZW5zID0gbGlzdE9yTm9kZTtcbiAgfSBlbHNlIHtcbiAgICB0b2tlbnMgPSBbLi4uZmxhdHRlbihsaXN0T3JOb2RlKV0ubWFwKChbdG9rZW5dKSA9PiB0b2tlbik7XG4gIH1cbiAgcmV0dXJuIHRva2Vucy5tYXAoKHRva2VuKSA9PiB0b2tlbi5jb250ZW50KS5qb2luKFwiXCIpO1xufVxuZXhwb3J0IHtcbiAgVE9LRU5TLFxuICBzdHJpbmdpZnksXG4gIHRva2VuaXplXG59O1xuIiwiLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0XG4gICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL1xuXG4gVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OXG5cbiAxLiBEZWZpbml0aW9ucy5cblxuICAgIFwiTGljZW5zZVwiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbixcbiAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC5cblxuICAgIFwiTGljZW5zb3JcIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnlcbiAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICBcIkxlZ2FsIEVudGl0eVwiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGxcbiAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uXG4gICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbixcbiAgICBcImNvbnRyb2xcIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZVxuICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yXG4gICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlXG4gICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS5cblxuICAgIFwiWW91XCIgKG9yIFwiWW91clwiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5XG4gICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS5cblxuICAgIFwiU291cmNlXCIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsXG4gICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvblxuICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG5cbiAgICBcIk9iamVjdFwiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsXG4gICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dFxuICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbixcbiAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuXG5cbiAgICBcIldvcmtcIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yXG4gICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYVxuICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29ya1xuICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuXG5cbiAgICBcIkRlcml2YXRpdmUgV29ya3NcIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3RcbiAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlXG4gICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9uc1xuICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzXG4gICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluXG4gICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLFxuICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuXG5cbiAgICBcIkNvbnRyaWJ1dGlvblwiIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nXG4gICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9uc1xuICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseVxuICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXJcbiAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2ZcbiAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgXCJzdWJtaXR0ZWRcIlxuICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnRcbiAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0b1xuICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsXG4gICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGVcbiAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXRcbiAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZVxuICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzIFwiTm90IGEgQ29udHJpYnV0aW9uLlwiXG5cbiAgICBcIkNvbnRyaWJ1dG9yXCIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5XG4gICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kXG4gICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuXG5cbiAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsXG4gICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGVcbiAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZixcbiAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGVcbiAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLlxuXG4gMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG4gICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLFxuICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlXG4gICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsXG4gICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssXG4gICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGVcbiAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpclxuICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocylcbiAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdVxuICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhXG4gICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29ya1xuICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0XG4gICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlc1xuICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZVxuICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC5cblxuIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlXG4gICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0XG4gICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3VcbiAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yXG4gICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kXG5cbiAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzXG4gICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZFxuXG4gICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzXG4gICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmRcbiAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yayxcbiAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZlxuICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kXG5cbiAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSBcIk5PVElDRVwiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0c1xuICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0XG4gICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZFxuICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3RcbiAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lXG4gICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkXG4gICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3JcbiAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsXG4gICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmRcbiAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzXG4gICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmRcbiAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb25cbiAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGVcbiAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkXG4gICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZFxuICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuXG5cbiAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmRcbiAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zXG4gICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvclxuICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLFxuICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aFxuICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuXG5cbiA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsXG4gICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrXG4gICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcbiAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy5cbiAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5XG4gICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWRcbiAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuXG5cbiA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlXG4gICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLFxuICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZVxuICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLlxuXG4gNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yXG4gICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaFxuICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yXG4gICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnNcbiAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBXG4gICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlXG4gICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55XG4gICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLlxuXG4gOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksXG4gICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsXG4gICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHlcbiAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZVxuICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCxcbiAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGFcbiAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlXG4gICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLFxuICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsXG4gICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvclxuICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy5cblxuIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmdcbiAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLFxuICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksXG4gICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXNcbiAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seVxuICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmXG4gICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LFxuICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eVxuICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb25cbiAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS5cblxuIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OU1xuXG4gQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLlxuXG4gICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmdcbiAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyBcIltdXCJcbiAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZVxuICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlXG4gICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhXG4gICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZVxuICAgIHNhbWUgXCJwcmludGVkIHBhZ2VcIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyXG4gICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLlxuXG4gQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggR29vZ2xlLCBJbmMuLCBOZXRmbGl4LCBJbmMuLCBNaWNyb3NvZnQgQ29ycC4gYW5kIGNvbnRyaWJ1dG9yc1xuXG4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiBcblxuKi9cbi8vIG5vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikge1xuICAgIGQyLl9fcHJvdG9fXyA9IGIyO1xuICB9IHx8IGZ1bmN0aW9uKGQyLCBiMikge1xuICAgIGZvciAodmFyIHAgaW4gYjIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKSBkMltwXSA9IGIyW3BdO1xuICB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5mdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7XG4gIH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgfVxuICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdO1xuICAgIHJldHVybiB0WzFdO1xuICB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odikge1xuICAgICAgcmV0dXJuIHN0ZXAoW24sIHZdKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdCA9IG9wO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgXy5sYWJlbCsrO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIF8ubGFiZWwrKztcbiAgICAgICAgICB5ID0gb3BbMV07XG4gICAgICAgICAgb3AgPSBbMF07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBvcCA9IF8ub3BzLnBvcCgpO1xuICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkge1xuICAgICAgICAgICAgXyA9IDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCBvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkge1xuICAgICAgICAgICAgXy5sYWJlbCA9IG9wWzFdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkge1xuICAgICAgICAgICAgXy5sYWJlbCA9IHRbMV07XG4gICAgICAgICAgICB0ID0gb3A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHtcbiAgICAgICAgICAgIF8ubGFiZWwgPSB0WzJdO1xuICAgICAgICAgICAgXy5vcHMucHVzaChvcCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgIF8udHJ5cy5wb3AoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG9wID0gWzYsIGVdO1xuICAgICAgeSA9IDA7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGYgPSB0ID0gMDtcbiAgICB9XG4gICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07XG4gICAgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cbmZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZSA9IHsgZXJyb3IgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChlKSB0aHJvdyBlLmVycm9yO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5mdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tMiwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20yLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoYXIgfHwgIShpIGluIGZyb20yKSkge1xuICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tMiwgMCwgaSk7XG4gICAgICBhcltpXSA9IGZyb20yW2ldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20yKSk7XG59XG5mdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5mdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHtcbiAgICBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0ZXAoZ1tuXSh2KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2V0dGxlKHFbMF1bM10sIGUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBzdGVwKHIpIHtcbiAgICByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTtcbiAgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7XG4gICAgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7XG4gICAgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpO1xuICB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7XG4gICAgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTtcbiAgfVxufVxuZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikge1xuICAgIGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uKHYpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHtcbiAgICBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2Mikge1xuICAgICAgcmVzb2x2ZSh7IHZhbHVlOiB2MiwgZG9uZTogZCB9KTtcbiAgICB9LCByZWplY3QpO1xuICB9XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzRnVuY3Rpb24uanNcbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9jcmVhdGVFcnJvckNsYXNzLmpzXG5mdW5jdGlvbiBjcmVhdGVFcnJvckNsYXNzKGNyZWF0ZUltcGwpIHtcbiAgdmFyIF9zdXBlciA9IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gICAgRXJyb3IuY2FsbChpbnN0YW5jZSk7XG4gICAgaW5zdGFuY2Uuc3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgfTtcbiAgdmFyIGN0b3JGdW5jID0gY3JlYXRlSW1wbChfc3VwZXIpO1xuICBjdG9yRnVuYy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG4gIGN0b3JGdW5jLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JGdW5jO1xuICByZXR1cm4gY3RvckZ1bmM7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL1Vuc3Vic2NyaXB0aW9uRXJyb3IuanNcbnZhciBVbnN1YnNjcmlwdGlvbkVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVuc3Vic2NyaXB0aW9uRXJyb3JJbXBsKGVycm9ycykge1xuICAgIF9zdXBlcih0aGlzKTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBlcnJvcnMgPyBlcnJvcnMubGVuZ3RoICsgXCIgZXJyb3JzIG9jY3VycmVkIGR1cmluZyB1bnN1YnNjcmlwdGlvbjpcXG5cIiArIGVycm9ycy5tYXAoZnVuY3Rpb24oZXJyLCBpKSB7XG4gICAgICByZXR1cm4gaSArIDEgKyBcIikgXCIgKyBlcnIudG9TdHJpbmcoKTtcbiAgICB9KS5qb2luKFwiXFxuICBcIikgOiBcIlwiO1xuICAgIHRoaXMubmFtZSA9IFwiVW5zdWJzY3JpcHRpb25FcnJvclwiO1xuICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICB9O1xufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyclJlbW92ZS5qc1xuZnVuY3Rpb24gYXJyUmVtb3ZlKGFyciwgaXRlbSkge1xuICBpZiAoYXJyKSB7XG4gICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7XG4gICAgMCA8PSBpbmRleCAmJiBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvU3Vic2NyaXB0aW9uLmpzXG52YXIgU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIFN1YnNjcmlwdGlvbjIoaW5pdGlhbFRlYXJkb3duKSB7XG4gICAgdGhpcy5pbml0aWFsVGVhcmRvd24gPSBpbml0aWFsVGVhcmRvd247XG4gICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsO1xuICAgIHRoaXMuX2ZpbmFsaXplcnMgPSBudWxsO1xuICB9XG4gIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGVfMSwgX2EsIGVfMiwgX2I7XG4gICAgdmFyIGVycm9ycztcbiAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICAgIGlmIChfcGFyZW50YWdlKSB7XG4gICAgICAgIHRoaXMuX3BhcmVudGFnZSA9IG51bGw7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KF9wYXJlbnRhZ2UpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9wYXJlbnRhZ2VfMSA9IF9fdmFsdWVzKF9wYXJlbnRhZ2UpLCBfcGFyZW50YWdlXzFfMSA9IF9wYXJlbnRhZ2VfMS5uZXh0KCk7ICFfcGFyZW50YWdlXzFfMS5kb25lOyBfcGFyZW50YWdlXzFfMSA9IF9wYXJlbnRhZ2VfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgdmFyIHBhcmVudF8xID0gX3BhcmVudGFnZV8xXzEudmFsdWU7XG4gICAgICAgICAgICAgIHBhcmVudF8xLnJlbW92ZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlXzFfMSkge1xuICAgICAgICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKF9wYXJlbnRhZ2VfMV8xICYmICFfcGFyZW50YWdlXzFfMS5kb25lICYmIChfYSA9IF9wYXJlbnRhZ2VfMS5yZXR1cm4pKSBfYS5jYWxsKF9wYXJlbnRhZ2VfMSk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9wYXJlbnRhZ2UucmVtb3ZlKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgaW5pdGlhbEZpbmFsaXplciA9IHRoaXMuaW5pdGlhbFRlYXJkb3duO1xuICAgICAgaWYgKGlzRnVuY3Rpb24oaW5pdGlhbEZpbmFsaXplcikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpbml0aWFsRmluYWxpemVyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBlcnJvcnMgPSBlIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvciA/IGUuZXJyb3JzIDogW2VdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgX2ZpbmFsaXplcnMgPSB0aGlzLl9maW5hbGl6ZXJzO1xuICAgICAgaWYgKF9maW5hbGl6ZXJzKSB7XG4gICAgICAgIHRoaXMuX2ZpbmFsaXplcnMgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIF9maW5hbGl6ZXJzXzEgPSBfX3ZhbHVlcyhfZmluYWxpemVycyksIF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpOyAhX2ZpbmFsaXplcnNfMV8xLmRvbmU7IF9maW5hbGl6ZXJzXzFfMSA9IF9maW5hbGl6ZXJzXzEubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgZmluYWxpemVyID0gX2ZpbmFsaXplcnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZXhlY0ZpbmFsaXplcihmaW5hbGl6ZXIpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycyAhPT0gbnVsbCAmJiBlcnJvcnMgIT09IHZvaWQgMCA/IGVycm9ycyA6IFtdO1xuICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvcikge1xuICAgICAgICAgICAgICAgIGVycm9ycyA9IF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGVycm9ycykpLCBfX3JlYWQoZXJyLmVycm9ycykpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVfMl8xKSB7XG4gICAgICAgICAgZV8yID0geyBlcnJvcjogZV8yXzEgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9maW5hbGl6ZXJzXzFfMSAmJiAhX2ZpbmFsaXplcnNfMV8xLmRvbmUgJiYgKF9iID0gX2ZpbmFsaXplcnNfMS5yZXR1cm4pKSBfYi5jYWxsKF9maW5hbGl6ZXJzXzEpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnN1YnNjcmlwdGlvbkVycm9yKGVycm9ycyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbih0ZWFyZG93bikge1xuICAgIHZhciBfYTtcbiAgICBpZiAodGVhcmRvd24gJiYgdGVhcmRvd24gIT09IHRoaXMpIHtcbiAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICBleGVjRmluYWxpemVyKHRlYXJkb3duKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0ZWFyZG93biBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbjIpIHtcbiAgICAgICAgICBpZiAodGVhcmRvd24uY2xvc2VkIHx8IHRlYXJkb3duLl9oYXNQYXJlbnQodGhpcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGVhcmRvd24uX2FkZFBhcmVudCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICAodGhpcy5fZmluYWxpemVycyA9IChfYSA9IHRoaXMuX2ZpbmFsaXplcnMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKS5wdXNoKHRlYXJkb3duKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9oYXNQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHtcbiAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICByZXR1cm4gX3BhcmVudGFnZSA9PT0gcGFyZW50IHx8IEFycmF5LmlzQXJyYXkoX3BhcmVudGFnZSkgJiYgX3BhcmVudGFnZS5pbmNsdWRlcyhwYXJlbnQpO1xuICB9O1xuICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5fYWRkUGFyZW50ID0gZnVuY3Rpb24ocGFyZW50KSB7XG4gICAgdmFyIF9wYXJlbnRhZ2UgPSB0aGlzLl9wYXJlbnRhZ2U7XG4gICAgdGhpcy5fcGFyZW50YWdlID0gQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSA/IChfcGFyZW50YWdlLnB1c2gocGFyZW50KSwgX3BhcmVudGFnZSkgOiBfcGFyZW50YWdlID8gW19wYXJlbnRhZ2UsIHBhcmVudF0gOiBwYXJlbnQ7XG4gIH07XG4gIFN1YnNjcmlwdGlvbjIucHJvdG90eXBlLl9yZW1vdmVQYXJlbnQgPSBmdW5jdGlvbihwYXJlbnQpIHtcbiAgICB2YXIgX3BhcmVudGFnZSA9IHRoaXMuX3BhcmVudGFnZTtcbiAgICBpZiAoX3BhcmVudGFnZSA9PT0gcGFyZW50KSB7XG4gICAgICB0aGlzLl9wYXJlbnRhZ2UgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShfcGFyZW50YWdlKSkge1xuICAgICAgYXJyUmVtb3ZlKF9wYXJlbnRhZ2UsIHBhcmVudCk7XG4gICAgfVxuICB9O1xuICBTdWJzY3JpcHRpb24yLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbih0ZWFyZG93bikge1xuICAgIHZhciBfZmluYWxpemVycyA9IHRoaXMuX2ZpbmFsaXplcnM7XG4gICAgX2ZpbmFsaXplcnMgJiYgYXJyUmVtb3ZlKF9maW5hbGl6ZXJzLCB0ZWFyZG93bik7XG4gICAgaWYgKHRlYXJkb3duIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uMikge1xuICAgICAgdGVhcmRvd24uX3JlbW92ZVBhcmVudCh0aGlzKTtcbiAgICB9XG4gIH07XG4gIFN1YnNjcmlwdGlvbjIuRU1QVFkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZW1wdHkgPSBuZXcgU3Vic2NyaXB0aW9uMigpO1xuICAgIGVtcHR5LmNsb3NlZCA9IHRydWU7XG4gICAgcmV0dXJuIGVtcHR5O1xuICB9KCk7XG4gIHJldHVybiBTdWJzY3JpcHRpb24yO1xufSgpO1xudmFyIEVNUFRZX1NVQlNDUklQVElPTiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbmZ1bmN0aW9uIGlzU3Vic2NyaXB0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbiB8fCB2YWx1ZSAmJiBcImNsb3NlZFwiIGluIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUucmVtb3ZlKSAmJiBpc0Z1bmN0aW9uKHZhbHVlLmFkZCkgJiYgaXNGdW5jdGlvbih2YWx1ZS51bnN1YnNjcmliZSk7XG59XG5mdW5jdGlvbiBleGVjRmluYWxpemVyKGZpbmFsaXplcikge1xuICBpZiAoaXNGdW5jdGlvbihmaW5hbGl6ZXIpKSB7XG4gICAgZmluYWxpemVyKCk7XG4gIH0gZWxzZSB7XG4gICAgZmluYWxpemVyLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL2NvbmZpZy5qc1xudmFyIGNvbmZpZyA9IHtcbiAgb25VbmhhbmRsZWRFcnJvcjogbnVsbCxcbiAgb25TdG9wcGVkTm90aWZpY2F0aW9uOiBudWxsLFxuICBQcm9taXNlOiB2b2lkIDAsXG4gIHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmc6IGZhbHNlLFxuICB1c2VEZXByZWNhdGVkTmV4dENvbnRleHQ6IGZhbHNlXG59O1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL3RpbWVvdXRQcm92aWRlci5qc1xudmFyIHRpbWVvdXRQcm92aWRlciA9IHtcbiAgc2V0VGltZW91dDogZnVuY3Rpb24oaGFuZGxlciwgdGltZW91dCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIGFyZ3NbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBkZWxlZ2F0ZSA9IHRpbWVvdXRQcm92aWRlci5kZWxlZ2F0ZTtcbiAgICBpZiAoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLnNldFRpbWVvdXQpIHtcbiAgICAgIHJldHVybiBkZWxlZ2F0ZS5zZXRUaW1lb3V0LmFwcGx5KGRlbGVnYXRlLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyLCB0aW1lb3V0XSwgX19yZWFkKGFyZ3MpKSk7XG4gICAgfVxuICAgIHJldHVybiBzZXRUaW1lb3V0LmFwcGx5KHZvaWQgMCwgX19zcHJlYWRBcnJheShbaGFuZGxlciwgdGltZW91dF0sIF9fcmVhZChhcmdzKSkpO1xuICB9LFxuICBjbGVhclRpbWVvdXQ6IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgIHZhciBkZWxlZ2F0ZSA9IHRpbWVvdXRQcm92aWRlci5kZWxlZ2F0ZTtcbiAgICByZXR1cm4gKChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuY2xlYXJUaW1lb3V0KSB8fCBjbGVhclRpbWVvdXQpKGhhbmRsZSk7XG4gIH0sXG4gIGRlbGVnYXRlOiB2b2lkIDBcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3JlcG9ydFVuaGFuZGxlZEVycm9yLmpzXG5mdW5jdGlvbiByZXBvcnRVbmhhbmRsZWRFcnJvcihlcnIpIHtcbiAgdGltZW91dFByb3ZpZGVyLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uVW5oYW5kbGVkRXJyb3IgPSBjb25maWcub25VbmhhbmRsZWRFcnJvcjtcbiAgICBpZiAob25VbmhhbmRsZWRFcnJvcikge1xuICAgICAgb25VbmhhbmRsZWRFcnJvcihlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvbm9vcC5qc1xuZnVuY3Rpb24gbm9vcCgpIHtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL05vdGlmaWNhdGlvbkZhY3Rvcmllcy5qc1xudmFyIENPTVBMRVRFX05PVElGSUNBVElPTiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKFwiQ1wiLCB2b2lkIDAsIHZvaWQgMCk7XG59KCk7XG5mdW5jdGlvbiBlcnJvck5vdGlmaWNhdGlvbihlcnJvcikge1xuICByZXR1cm4gY3JlYXRlTm90aWZpY2F0aW9uKFwiRVwiLCB2b2lkIDAsIGVycm9yKTtcbn1cbmZ1bmN0aW9uIG5leHROb3RpZmljYXRpb24odmFsdWUpIHtcbiAgcmV0dXJuIGNyZWF0ZU5vdGlmaWNhdGlvbihcIk5cIiwgdmFsdWUsIHZvaWQgMCk7XG59XG5mdW5jdGlvbiBjcmVhdGVOb3RpZmljYXRpb24oa2luZCwgdmFsdWUsIGVycm9yKSB7XG4gIHJldHVybiB7XG4gICAga2luZCxcbiAgICB2YWx1ZSxcbiAgICBlcnJvclxuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9lcnJvckNvbnRleHQuanNcbnZhciBjb250ZXh0ID0gbnVsbDtcbmZ1bmN0aW9uIGVycm9yQ29udGV4dChjYikge1xuICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHtcbiAgICB2YXIgaXNSb290ID0gIWNvbnRleHQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgY29udGV4dCA9IHsgZXJyb3JUaHJvd246IGZhbHNlLCBlcnJvcjogbnVsbCB9O1xuICAgIH1cbiAgICBjYigpO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHZhciBfYSA9IGNvbnRleHQsIGVycm9yVGhyb3duID0gX2EuZXJyb3JUaHJvd24sIGVycm9yID0gX2EuZXJyb3I7XG4gICAgICBjb250ZXh0ID0gbnVsbDtcbiAgICAgIGlmIChlcnJvclRocm93bikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY2IoKTtcbiAgfVxufVxuZnVuY3Rpb24gY2FwdHVyZUVycm9yKGVycikge1xuICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgJiYgY29udGV4dCkge1xuICAgIGNvbnRleHQuZXJyb3JUaHJvd24gPSB0cnVlO1xuICAgIGNvbnRleHQuZXJyb3IgPSBlcnI7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1N1YnNjcmliZXIuanNcbnZhciBTdWJzY3JpYmVyID0gZnVuY3Rpb24oX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhTdWJzY3JpYmVyMiwgX3N1cGVyKTtcbiAgZnVuY3Rpb24gU3Vic2NyaWJlcjIoZGVzdGluYXRpb24pIHtcbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLmlzU3RvcHBlZCA9IGZhbHNlO1xuICAgIGlmIChkZXN0aW5hdGlvbikge1xuICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICAgIGlmIChpc1N1YnNjcmlwdGlvbihkZXN0aW5hdGlvbikpIHtcbiAgICAgICAgZGVzdGluYXRpb24uYWRkKF90aGlzKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMuZGVzdGluYXRpb24gPSBFTVBUWV9PQlNFUlZFUjtcbiAgICB9XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIFN1YnNjcmliZXIyLmNyZWF0ZSA9IGZ1bmN0aW9uKG5leHQsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgIHJldHVybiBuZXcgU2FmZVN1YnNjcmliZXIobmV4dCwgZXJyb3IsIGNvbXBsZXRlKTtcbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGlmICh0aGlzLmlzU3RvcHBlZCkge1xuICAgICAgaGFuZGxlU3RvcHBlZE5vdGlmaWNhdGlvbihuZXh0Tm90aWZpY2F0aW9uKHZhbHVlKSwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX25leHQodmFsdWUpO1xuICAgIH1cbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKGVycm9yTm90aWZpY2F0aW9uKGVyciksIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICB0aGlzLl9lcnJvcihlcnIpO1xuICAgIH1cbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7XG4gICAgICBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKENPTVBMRVRFX05PVElGSUNBVElPTiwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NvbXBsZXRlKCk7XG4gICAgfVxuICB9O1xuICBTdWJzY3JpYmVyMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICBfc3VwZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyk7XG4gICAgICB0aGlzLmRlc3RpbmF0aW9uID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIFN1YnNjcmliZXIyLnByb3RvdHlwZS5fbmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTtcbiAgfTtcbiAgU3Vic2NyaWJlcjIucHJvdG90eXBlLl9lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH07XG4gIFN1YnNjcmliZXIyLnByb3RvdHlwZS5fY29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gU3Vic2NyaWJlcjI7XG59KFN1YnNjcmlwdGlvbik7XG52YXIgX2JpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDtcbmZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIF9iaW5kLmNhbGwoZm4sIHRoaXNBcmcpO1xufVxudmFyIENvbnN1bWVyT2JzZXJ2ZXIgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gQ29uc3VtZXJPYnNlcnZlcjIocGFydGlhbE9ic2VydmVyKSB7XG4gICAgdGhpcy5wYXJ0aWFsT2JzZXJ2ZXIgPSBwYXJ0aWFsT2JzZXJ2ZXI7XG4gIH1cbiAgQ29uc3VtZXJPYnNlcnZlcjIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAocGFydGlhbE9ic2VydmVyLm5leHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnRpYWxPYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIENvbnN1bWVyT2JzZXJ2ZXIyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAocGFydGlhbE9ic2VydmVyLmVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZGxlVW5oYW5kbGVkRXJyb3IoZXJyKTtcbiAgICB9XG4gIH07XG4gIENvbnN1bWVyT2JzZXJ2ZXIyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYXJ0aWFsT2JzZXJ2ZXIgPSB0aGlzLnBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAocGFydGlhbE9ic2VydmVyLmNvbXBsZXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBDb25zdW1lck9ic2VydmVyMjtcbn0oKTtcbnZhciBTYWZlU3Vic2NyaWJlciA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoU2FmZVN1YnNjcmliZXIyLCBfc3VwZXIpO1xuICBmdW5jdGlvbiBTYWZlU3Vic2NyaWJlcjIob2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgdmFyIHBhcnRpYWxPYnNlcnZlcjtcbiAgICBpZiAoaXNGdW5jdGlvbihvYnNlcnZlck9yTmV4dCkgfHwgIW9ic2VydmVyT3JOZXh0KSB7XG4gICAgICBwYXJ0aWFsT2JzZXJ2ZXIgPSB7XG4gICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0ICE9PSBudWxsICYmIG9ic2VydmVyT3JOZXh0ICE9PSB2b2lkIDAgPyBvYnNlcnZlck9yTmV4dCA6IHZvaWQgMCxcbiAgICAgICAgZXJyb3I6IGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDAgPyBlcnJvciA6IHZvaWQgMCxcbiAgICAgICAgY29tcGxldGU6IGNvbXBsZXRlICE9PSBudWxsICYmIGNvbXBsZXRlICE9PSB2b2lkIDAgPyBjb21wbGV0ZSA6IHZvaWQgMFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbnRleHRfMTtcbiAgICAgIGlmIChfdGhpcyAmJiBjb25maWcudXNlRGVwcmVjYXRlZE5leHRDb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHRfMSA9IE9iamVjdC5jcmVhdGUob2JzZXJ2ZXJPck5leHQpO1xuICAgICAgICBjb250ZXh0XzEudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgcGFydGlhbE9ic2VydmVyID0ge1xuICAgICAgICAgIG5leHQ6IG9ic2VydmVyT3JOZXh0Lm5leHQgJiYgYmluZChvYnNlcnZlck9yTmV4dC5uZXh0LCBjb250ZXh0XzEpLFxuICAgICAgICAgIGVycm9yOiBvYnNlcnZlck9yTmV4dC5lcnJvciAmJiBiaW5kKG9ic2VydmVyT3JOZXh0LmVycm9yLCBjb250ZXh0XzEpLFxuICAgICAgICAgIGNvbXBsZXRlOiBvYnNlcnZlck9yTmV4dC5jb21wbGV0ZSAmJiBiaW5kKG9ic2VydmVyT3JOZXh0LmNvbXBsZXRlLCBjb250ZXh0XzEpXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJ0aWFsT2JzZXJ2ZXIgPSBvYnNlcnZlck9yTmV4dDtcbiAgICAgIH1cbiAgICB9XG4gICAgX3RoaXMuZGVzdGluYXRpb24gPSBuZXcgQ29uc3VtZXJPYnNlcnZlcihwYXJ0aWFsT2JzZXJ2ZXIpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICByZXR1cm4gU2FmZVN1YnNjcmliZXIyO1xufShTdWJzY3JpYmVyKTtcbmZ1bmN0aW9uIGhhbmRsZVVuaGFuZGxlZEVycm9yKGVycm9yKSB7XG4gIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykge1xuICAgIGNhcHR1cmVFcnJvcihlcnJvcik7XG4gIH0gZWxzZSB7XG4gICAgcmVwb3J0VW5oYW5kbGVkRXJyb3IoZXJyb3IpO1xuICB9XG59XG5mdW5jdGlvbiBkZWZhdWx0RXJyb3JIYW5kbGVyKGVycikge1xuICB0aHJvdyBlcnI7XG59XG5mdW5jdGlvbiBoYW5kbGVTdG9wcGVkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgc3Vic2NyaWJlcikge1xuICB2YXIgb25TdG9wcGVkTm90aWZpY2F0aW9uID0gY29uZmlnLm9uU3RvcHBlZE5vdGlmaWNhdGlvbjtcbiAgb25TdG9wcGVkTm90aWZpY2F0aW9uICYmIHRpbWVvdXRQcm92aWRlci5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBvblN0b3BwZWROb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBzdWJzY3JpYmVyKTtcbiAgfSk7XG59XG52YXIgRU1QVFlfT0JTRVJWRVIgPSB7XG4gIGNsb3NlZDogdHJ1ZSxcbiAgbmV4dDogbm9vcCxcbiAgZXJyb3I6IGRlZmF1bHRFcnJvckhhbmRsZXIsXG4gIGNvbXBsZXRlOiBub29wXG59O1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc3ltYm9sL29ic2VydmFibGUuanNcbnZhciBvYnNlcnZhYmxlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLm9ic2VydmFibGUgfHwgXCJAQG9ic2VydmFibGVcIjtcbn0oKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaWRlbnRpdHkuanNcbmZ1bmN0aW9uIGlkZW50aXR5KHgpIHtcbiAgcmV0dXJuIHg7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3BpcGUuanNcbmZ1bmN0aW9uIHBpcGUoKSB7XG4gIHZhciBmbnMgPSBbXTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBmbnNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICByZXR1cm4gcGlwZUZyb21BcnJheShmbnMpO1xufVxuZnVuY3Rpb24gcGlwZUZyb21BcnJheShmbnMpIHtcbiAgaWYgKGZucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgaWYgKGZucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZm5zWzBdO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBwaXBlZChpbnB1dCkge1xuICAgIHJldHVybiBmbnMucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGZuKSB7XG4gICAgICByZXR1cm4gZm4ocHJldik7XG4gICAgfSwgaW5wdXQpO1xuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvT2JzZXJ2YWJsZS5qc1xudmFyIE9ic2VydmFibGUgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gT2JzZXJ2YWJsZTIoc3Vic2NyaWJlKSB7XG4gICAgaWYgKHN1YnNjcmliZSkge1xuICAgICAgdGhpcy5fc3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgIH1cbiAgfVxuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUubGlmdCA9IGZ1bmN0aW9uKG9wZXJhdG9yKSB7XG4gICAgdmFyIG9ic2VydmFibGUyID0gbmV3IE9ic2VydmFibGUyKCk7XG4gICAgb2JzZXJ2YWJsZTIuc291cmNlID0gdGhpcztcbiAgICBvYnNlcnZhYmxlMi5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgIHJldHVybiBvYnNlcnZhYmxlMjtcbiAgfTtcbiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLnN1YnNjcmliZSA9IGZ1bmN0aW9uKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBzdWJzY3JpYmVyID0gaXNTdWJzY3JpYmVyKG9ic2VydmVyT3JOZXh0KSA/IG9ic2VydmVyT3JOZXh0IDogbmV3IFNhZmVTdWJzY3JpYmVyKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpO1xuICAgIGVycm9yQ29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBfYSA9IF90aGlzLCBvcGVyYXRvciA9IF9hLm9wZXJhdG9yLCBzb3VyY2UgPSBfYS5zb3VyY2U7XG4gICAgICBzdWJzY3JpYmVyLmFkZChvcGVyYXRvciA/IG9wZXJhdG9yLmNhbGwoc3Vic2NyaWJlciwgc291cmNlKSA6IHNvdXJjZSA/IF90aGlzLl9zdWJzY3JpYmUoc3Vic2NyaWJlcikgOiBfdGhpcy5fdHJ5U3Vic2NyaWJlKHN1YnNjcmliZXIpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3Vic2NyaWJlcjtcbiAgfTtcbiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLl90cnlTdWJzY3JpYmUgPSBmdW5jdGlvbihzaW5rKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpYmUoc2luayk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzaW5rLmVycm9yKGVycik7XG4gICAgfVxuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKG5leHQsIHByb21pc2VDdG9yKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBwcm9taXNlQ3RvciA9IGdldFByb21pc2VDdG9yKHByb21pc2VDdG9yKTtcbiAgICByZXR1cm4gbmV3IHByb21pc2VDdG9yKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHN1YnNjcmliZXIgPSBuZXcgU2FmZVN1YnNjcmliZXIoe1xuICAgICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXh0KHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IHJlamVjdCxcbiAgICAgICAgY29tcGxldGU6IHJlc29sdmVcbiAgICAgIH0pO1xuICAgICAgX3RoaXMuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIH0pO1xuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUuX3N1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIChfYSA9IHRoaXMuc291cmNlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGVbb2JzZXJ2YWJsZV0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgT2JzZXJ2YWJsZTIucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3BlcmF0aW9ucyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBvcGVyYXRpb25zW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHJldHVybiBwaXBlRnJvbUFycmF5KG9wZXJhdGlvbnMpKHRoaXMpO1xuICB9O1xuICBPYnNlcnZhYmxlMi5wcm90b3R5cGUudG9Qcm9taXNlID0gZnVuY3Rpb24ocHJvbWlzZUN0b3IpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHByb21pc2VDdG9yID0gZ2V0UHJvbWlzZUN0b3IocHJvbWlzZUN0b3IpO1xuICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICBfdGhpcy5zdWJzY3JpYmUoZnVuY3Rpb24oeCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPSB4O1xuICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbiAgT2JzZXJ2YWJsZTIuY3JlYXRlID0gZnVuY3Rpb24oc3Vic2NyaWJlKSB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlMihzdWJzY3JpYmUpO1xuICB9O1xuICByZXR1cm4gT2JzZXJ2YWJsZTI7XG59KCk7XG5mdW5jdGlvbiBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3Rvcikge1xuICB2YXIgX2E7XG4gIHJldHVybiAoX2EgPSBwcm9taXNlQ3RvciAhPT0gbnVsbCAmJiBwcm9taXNlQ3RvciAhPT0gdm9pZCAwID8gcHJvbWlzZUN0b3IgOiBjb25maWcuUHJvbWlzZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUHJvbWlzZTtcbn1cbmZ1bmN0aW9uIGlzT2JzZXJ2ZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUubmV4dCkgJiYgaXNGdW5jdGlvbih2YWx1ZS5lcnJvcikgJiYgaXNGdW5jdGlvbih2YWx1ZS5jb21wbGV0ZSk7XG59XG5mdW5jdGlvbiBpc1N1YnNjcmliZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgU3Vic2NyaWJlciB8fCBpc09ic2VydmVyKHZhbHVlKSAmJiBpc1N1YnNjcmlwdGlvbih2YWx1ZSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2xpZnQuanNcbmZ1bmN0aW9uIGhhc0xpZnQoc291cmNlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHNvdXJjZSA9PT0gbnVsbCB8fCBzb3VyY2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNvdXJjZS5saWZ0KTtcbn1cbmZ1bmN0aW9uIG9wZXJhdGUoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7XG4gICAgaWYgKGhhc0xpZnQoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KGZ1bmN0aW9uKGxpZnRlZFNvdXJjZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBpbml0KGxpZnRlZFNvdXJjZSwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMuZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmFibGUgdG8gbGlmdCB1bmtub3duIE9ic2VydmFibGUgdHlwZVwiKTtcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9PcGVyYXRvclN1YnNjcmliZXIuanNcbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihkZXN0aW5hdGlvbiwgb25OZXh0LCBvbkNvbXBsZXRlLCBvbkVycm9yLCBvbkZpbmFsaXplKSB7XG4gIHJldHVybiBuZXcgT3BlcmF0b3JTdWJzY3JpYmVyKGRlc3RpbmF0aW9uLCBvbk5leHQsIG9uQ29tcGxldGUsIG9uRXJyb3IsIG9uRmluYWxpemUpO1xufVxudmFyIE9wZXJhdG9yU3Vic2NyaWJlciA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoT3BlcmF0b3JTdWJzY3JpYmVyMiwgX3N1cGVyKTtcbiAgZnVuY3Rpb24gT3BlcmF0b3JTdWJzY3JpYmVyMihkZXN0aW5hdGlvbiwgb25OZXh0LCBvbkNvbXBsZXRlLCBvbkVycm9yLCBvbkZpbmFsaXplLCBzaG91bGRVbnN1YnNjcmliZSkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIGRlc3RpbmF0aW9uKSB8fCB0aGlzO1xuICAgIF90aGlzLm9uRmluYWxpemUgPSBvbkZpbmFsaXplO1xuICAgIF90aGlzLnNob3VsZFVuc3Vic2NyaWJlID0gc2hvdWxkVW5zdWJzY3JpYmU7XG4gICAgX3RoaXMuX25leHQgPSBvbk5leHQgPyBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb25OZXh0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9uZXh0O1xuICAgIF90aGlzLl9lcnJvciA9IG9uRXJyb3IgPyBmdW5jdGlvbihlcnIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgIH0gY2F0Y2ggKGVycjIpIHtcbiAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyMik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfSA6IF9zdXBlci5wcm90b3R5cGUuX2Vycm9yO1xuICAgIF90aGlzLl9jb21wbGV0ZSA9IG9uQ29tcGxldGUgPyBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9uQ29tcGxldGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBkZXN0aW5hdGlvbi5lcnJvcihlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgIH0gOiBfc3VwZXIucHJvdG90eXBlLl9jb21wbGV0ZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgT3BlcmF0b3JTdWJzY3JpYmVyMi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKCF0aGlzLnNob3VsZFVuc3Vic2NyaWJlIHx8IHRoaXMuc2hvdWxkVW5zdWJzY3JpYmUoKSkge1xuICAgICAgdmFyIGNsb3NlZF8xID0gdGhpcy5jbG9zZWQ7XG4gICAgICBfc3VwZXIucHJvdG90eXBlLnVuc3Vic2NyaWJlLmNhbGwodGhpcyk7XG4gICAgICAhY2xvc2VkXzEgJiYgKChfYSA9IHRoaXMub25GaW5hbGl6ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwodGhpcykpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIE9wZXJhdG9yU3Vic2NyaWJlcjI7XG59KFN1YnNjcmliZXIpO1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9PYmplY3RVbnN1YnNjcmliZWRFcnJvci5qc1xudmFyIE9iamVjdFVuc3Vic2NyaWJlZEVycm9yID0gY3JlYXRlRXJyb3JDbGFzcyhmdW5jdGlvbihfc3VwZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIE9iamVjdFVuc3Vic2NyaWJlZEVycm9ySW1wbCgpIHtcbiAgICBfc3VwZXIodGhpcyk7XG4gICAgdGhpcy5uYW1lID0gXCJPYmplY3RVbnN1YnNjcmliZWRFcnJvclwiO1xuICAgIHRoaXMubWVzc2FnZSA9IFwib2JqZWN0IHVuc3Vic2NyaWJlZFwiO1xuICB9O1xufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9TdWJqZWN0LmpzXG52YXIgU3ViamVjdCA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoU3ViamVjdDIsIF9zdXBlcik7XG4gIGZ1bmN0aW9uIFN1YmplY3QyKCkge1xuICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgX3RoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgX3RoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7XG4gICAgX3RoaXMub2JzZXJ2ZXJzID0gW107XG4gICAgX3RoaXMuaXNTdG9wcGVkID0gZmFsc2U7XG4gICAgX3RoaXMuaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBfdGhpcy50aHJvd25FcnJvciA9IG51bGw7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIFN1YmplY3QyLnByb3RvdHlwZS5saWZ0ID0gZnVuY3Rpb24ob3BlcmF0b3IpIHtcbiAgICB2YXIgc3ViamVjdCA9IG5ldyBBbm9ueW1vdXNTdWJqZWN0KHRoaXMsIHRoaXMpO1xuICAgIHN1YmplY3Qub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICByZXR1cm4gc3ViamVjdDtcbiAgfTtcbiAgU3ViamVjdDIucHJvdG90eXBlLl90aHJvd0lmQ2xvc2VkID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTtcbiAgICB9XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIGVycm9yQ29udGV4dChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICAgIGlmICghX3RoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIGlmICghX3RoaXMuY3VycmVudE9ic2VydmVycykge1xuICAgICAgICAgIF90aGlzLmN1cnJlbnRPYnNlcnZlcnMgPSBBcnJheS5mcm9tKF90aGlzLm9ic2VydmVycyk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKF90aGlzLmN1cnJlbnRPYnNlcnZlcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZV8xXzEpIHtcbiAgICAgICAgICBlXzEgPSB7IGVycm9yOiBlXzFfMSB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgU3ViamVjdDIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBlcnJvckNvbnRleHQoZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5fdGhyb3dJZkNsb3NlZCgpO1xuICAgICAgaWYgKCFfdGhpcy5pc1N0b3BwZWQpIHtcbiAgICAgICAgX3RoaXMuaGFzRXJyb3IgPSBfdGhpcy5pc1N0b3BwZWQgPSB0cnVlO1xuICAgICAgICBfdGhpcy50aHJvd25FcnJvciA9IGVycjtcbiAgICAgICAgdmFyIG9ic2VydmVycyA9IF90aGlzLm9ic2VydmVycztcbiAgICAgICAgd2hpbGUgKG9ic2VydmVycy5sZW5ndGgpIHtcbiAgICAgICAgICBvYnNlcnZlcnMuc2hpZnQoKS5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgZXJyb3JDb250ZXh0KGZ1bmN0aW9uKCkge1xuICAgICAgX3RoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICAgIGlmICghX3RoaXMuaXNTdG9wcGVkKSB7XG4gICAgICAgIF90aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHZhciBvYnNlcnZlcnMgPSBfdGhpcy5vYnNlcnZlcnM7XG4gICAgICAgIHdoaWxlIChvYnNlcnZlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgb2JzZXJ2ZXJzLnNoaWZ0KCkuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBTdWJqZWN0Mi5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlzU3RvcHBlZCA9IHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLm9ic2VydmVycyA9IHRoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdWJqZWN0Mi5wcm90b3R5cGUsIFwib2JzZXJ2ZWRcIiwge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgX2E7XG4gICAgICByZXR1cm4gKChfYSA9IHRoaXMub2JzZXJ2ZXJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKSA+IDA7XG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG4gIFN1YmplY3QyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlLmNhbGwodGhpcywgc3Vic2NyaWJlcik7XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICB0aGlzLl9jaGVja0ZpbmFsaXplZFN0YXR1c2VzKHN1YnNjcmliZXIpO1xuICAgIHJldHVybiB0aGlzLl9pbm5lclN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgfTtcbiAgU3ViamVjdDIucHJvdG90eXBlLl9pbm5lclN1YnNjcmliZSA9IGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBfYSA9IHRoaXMsIGhhc0Vycm9yID0gX2EuaGFzRXJyb3IsIGlzU3RvcHBlZCA9IF9hLmlzU3RvcHBlZCwgb2JzZXJ2ZXJzID0gX2Eub2JzZXJ2ZXJzO1xuICAgIGlmIChoYXNFcnJvciB8fCBpc1N0b3BwZWQpIHtcbiAgICAgIHJldHVybiBFTVBUWV9TVUJTQ1JJUFRJT047XG4gICAgfVxuICAgIHRoaXMuY3VycmVudE9ic2VydmVycyA9IG51bGw7XG4gICAgb2JzZXJ2ZXJzLnB1c2goc3Vic2NyaWJlcik7XG4gICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5jdXJyZW50T2JzZXJ2ZXJzID0gbnVsbDtcbiAgICAgIGFyclJlbW92ZShvYnNlcnZlcnMsIHN1YnNjcmliZXIpO1xuICAgIH0pO1xuICB9O1xuICBTdWJqZWN0Mi5wcm90b3R5cGUuX2NoZWNrRmluYWxpemVkU3RhdHVzZXMgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIF9hID0gdGhpcywgaGFzRXJyb3IgPSBfYS5oYXNFcnJvciwgdGhyb3duRXJyb3IgPSBfYS50aHJvd25FcnJvciwgaXNTdG9wcGVkID0gX2EuaXNTdG9wcGVkO1xuICAgIGlmIChoYXNFcnJvcikge1xuICAgICAgc3Vic2NyaWJlci5lcnJvcih0aHJvd25FcnJvcik7XG4gICAgfSBlbHNlIGlmIChpc1N0b3BwZWQpIHtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9XG4gIH07XG4gIFN1YmplY3QyLnByb3RvdHlwZS5hc09ic2VydmFibGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JzZXJ2YWJsZTIgPSBuZXcgT2JzZXJ2YWJsZSgpO1xuICAgIG9ic2VydmFibGUyLnNvdXJjZSA9IHRoaXM7XG4gICAgcmV0dXJuIG9ic2VydmFibGUyO1xuICB9O1xuICBTdWJqZWN0Mi5jcmVhdGUgPSBmdW5jdGlvbihkZXN0aW5hdGlvbiwgc291cmNlKSB7XG4gICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNTdWJqZWN0KGRlc3RpbmF0aW9uLCBzb3VyY2UpO1xuICB9O1xuICByZXR1cm4gU3ViamVjdDI7XG59KE9ic2VydmFibGUpO1xudmFyIEFub255bW91c1N1YmplY3QgPSBmdW5jdGlvbihfc3VwZXIpIHtcbiAgX19leHRlbmRzKEFub255bW91c1N1YmplY3QyLCBfc3VwZXIpO1xuICBmdW5jdGlvbiBBbm9ueW1vdXNTdWJqZWN0MihkZXN0aW5hdGlvbiwgc291cmNlKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICBfdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uO1xuICAgIF90aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgKF9iID0gKF9hID0gdGhpcy5kZXN0aW5hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5leHQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCB2YWx1ZSk7XG4gIH07XG4gIEFub255bW91c1N1YmplY3QyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKGVycikge1xuICAgIHZhciBfYSwgX2I7XG4gICAgKF9iID0gKF9hID0gdGhpcy5kZXN0aW5hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVycm9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSwgZXJyKTtcbiAgfTtcbiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICAoX2IgPSAoX2EgPSB0aGlzLmRlc3RpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29tcGxldGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hKTtcbiAgfTtcbiAgQW5vbnltb3VzU3ViamVjdDIucHJvdG90eXBlLl9zdWJzY3JpYmUgPSBmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICByZXR1cm4gKF9iID0gKF9hID0gdGhpcy5zb3VyY2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdWJzY3JpYmUoc3Vic2NyaWJlcikpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IEVNUFRZX1NVQlNDUklQVElPTjtcbiAgfTtcbiAgcmV0dXJuIEFub255bW91c1N1YmplY3QyO1xufShTdWJqZWN0KTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9kYXRlVGltZXN0YW1wUHJvdmlkZXIuanNcbnZhciBkYXRlVGltZXN0YW1wUHJvdmlkZXIgPSB7XG4gIG5vdzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIChkYXRlVGltZXN0YW1wUHJvdmlkZXIuZGVsZWdhdGUgfHwgRGF0ZSkubm93KCk7XG4gIH0sXG4gIGRlbGVnYXRlOiB2b2lkIDBcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9SZXBsYXlTdWJqZWN0LmpzXG52YXIgUmVwbGF5U3ViamVjdCA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoUmVwbGF5U3ViamVjdDIsIF9zdXBlcik7XG4gIGZ1bmN0aW9uIFJlcGxheVN1YmplY3QyKF9idWZmZXJTaXplLCBfd2luZG93VGltZSwgX3RpbWVzdGFtcFByb3ZpZGVyKSB7XG4gICAgaWYgKF9idWZmZXJTaXplID09PSB2b2lkIDApIHtcbiAgICAgIF9idWZmZXJTaXplID0gSW5maW5pdHk7XG4gICAgfVxuICAgIGlmIChfd2luZG93VGltZSA9PT0gdm9pZCAwKSB7XG4gICAgICBfd2luZG93VGltZSA9IEluZmluaXR5O1xuICAgIH1cbiAgICBpZiAoX3RpbWVzdGFtcFByb3ZpZGVyID09PSB2b2lkIDApIHtcbiAgICAgIF90aW1lc3RhbXBQcm92aWRlciA9IGRhdGVUaW1lc3RhbXBQcm92aWRlcjtcbiAgICB9XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICBfdGhpcy5fYnVmZmVyU2l6ZSA9IF9idWZmZXJTaXplO1xuICAgIF90aGlzLl93aW5kb3dUaW1lID0gX3dpbmRvd1RpbWU7XG4gICAgX3RoaXMuX3RpbWVzdGFtcFByb3ZpZGVyID0gX3RpbWVzdGFtcFByb3ZpZGVyO1xuICAgIF90aGlzLl9idWZmZXIgPSBbXTtcbiAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gdHJ1ZTtcbiAgICBfdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gX3dpbmRvd1RpbWUgPT09IEluZmluaXR5O1xuICAgIF90aGlzLl9idWZmZXJTaXplID0gTWF0aC5tYXgoMSwgX2J1ZmZlclNpemUpO1xuICAgIF90aGlzLl93aW5kb3dUaW1lID0gTWF0aC5tYXgoMSwgX3dpbmRvd1RpbWUpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICBSZXBsYXlTdWJqZWN0Mi5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIF9hID0gdGhpcywgaXNTdG9wcGVkID0gX2EuaXNTdG9wcGVkLCBfYnVmZmVyID0gX2EuX2J1ZmZlciwgX2luZmluaXRlVGltZVdpbmRvdyA9IF9hLl9pbmZpbml0ZVRpbWVXaW5kb3csIF90aW1lc3RhbXBQcm92aWRlciA9IF9hLl90aW1lc3RhbXBQcm92aWRlciwgX3dpbmRvd1RpbWUgPSBfYS5fd2luZG93VGltZTtcbiAgICBpZiAoIWlzU3RvcHBlZCkge1xuICAgICAgX2J1ZmZlci5wdXNoKHZhbHVlKTtcbiAgICAgICFfaW5maW5pdGVUaW1lV2luZG93ICYmIF9idWZmZXIucHVzaChfdGltZXN0YW1wUHJvdmlkZXIubm93KCkgKyBfd2luZG93VGltZSk7XG4gICAgfVxuICAgIHRoaXMuX3RyaW1CdWZmZXIoKTtcbiAgICBfc3VwZXIucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gIH07XG4gIFJlcGxheVN1YmplY3QyLnByb3RvdHlwZS5fc3Vic2NyaWJlID0gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHRoaXMuX3Rocm93SWZDbG9zZWQoKTtcbiAgICB0aGlzLl90cmltQnVmZmVyKCk7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuX2lubmVyU3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIHZhciBfYSA9IHRoaXMsIF9pbmZpbml0ZVRpbWVXaW5kb3cgPSBfYS5faW5maW5pdGVUaW1lV2luZG93LCBfYnVmZmVyID0gX2EuX2J1ZmZlcjtcbiAgICB2YXIgY29weSA9IF9idWZmZXIuc2xpY2UoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcHkubGVuZ3RoICYmICFzdWJzY3JpYmVyLmNsb3NlZDsgaSArPSBfaW5maW5pdGVUaW1lV2luZG93ID8gMSA6IDIpIHtcbiAgICAgIHN1YnNjcmliZXIubmV4dChjb3B5W2ldKTtcbiAgICB9XG4gICAgdGhpcy5fY2hlY2tGaW5hbGl6ZWRTdGF0dXNlcyhzdWJzY3JpYmVyKTtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICB9O1xuICBSZXBsYXlTdWJqZWN0Mi5wcm90b3R5cGUuX3RyaW1CdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgX2EgPSB0aGlzLCBfYnVmZmVyU2l6ZSA9IF9hLl9idWZmZXJTaXplLCBfdGltZXN0YW1wUHJvdmlkZXIgPSBfYS5fdGltZXN0YW1wUHJvdmlkZXIsIF9idWZmZXIgPSBfYS5fYnVmZmVyLCBfaW5maW5pdGVUaW1lV2luZG93ID0gX2EuX2luZmluaXRlVGltZVdpbmRvdztcbiAgICB2YXIgYWRqdXN0ZWRCdWZmZXJTaXplID0gKF9pbmZpbml0ZVRpbWVXaW5kb3cgPyAxIDogMikgKiBfYnVmZmVyU2l6ZTtcbiAgICBfYnVmZmVyU2l6ZSA8IEluZmluaXR5ICYmIGFkanVzdGVkQnVmZmVyU2l6ZSA8IF9idWZmZXIubGVuZ3RoICYmIF9idWZmZXIuc3BsaWNlKDAsIF9idWZmZXIubGVuZ3RoIC0gYWRqdXN0ZWRCdWZmZXJTaXplKTtcbiAgICBpZiAoIV9pbmZpbml0ZVRpbWVXaW5kb3cpIHtcbiAgICAgIHZhciBub3cgPSBfdGltZXN0YW1wUHJvdmlkZXIubm93KCk7XG4gICAgICB2YXIgbGFzdDIgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBfYnVmZmVyLmxlbmd0aCAmJiBfYnVmZmVyW2ldIDw9IG5vdzsgaSArPSAyKSB7XG4gICAgICAgIGxhc3QyID0gaTtcbiAgICAgIH1cbiAgICAgIGxhc3QyICYmIF9idWZmZXIuc3BsaWNlKDAsIGxhc3QyICsgMSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gUmVwbGF5U3ViamVjdDI7XG59KFN1YmplY3QpO1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVyL0FjdGlvbi5qc1xudmFyIEFjdGlvbiA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQWN0aW9uMiwgX3N1cGVyKTtcbiAgZnVuY3Rpb24gQWN0aW9uMihzY2hlZHVsZXIsIHdvcmspIHtcbiAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgfVxuICBBY3Rpb24yLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uKHN0YXRlLCBkZWxheTIpIHtcbiAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHtcbiAgICAgIGRlbGF5MiA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICByZXR1cm4gQWN0aW9uMjtcbn0oU3Vic2NyaXB0aW9uKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9pbnRlcnZhbFByb3ZpZGVyLmpzXG52YXIgaW50ZXJ2YWxQcm92aWRlciA9IHtcbiAgc2V0SW50ZXJ2YWw6IGZ1bmN0aW9uKGhhbmRsZXIsIHRpbWVvdXQpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xuICAgIH1cbiAgICB2YXIgZGVsZWdhdGUgPSBpbnRlcnZhbFByb3ZpZGVyLmRlbGVnYXRlO1xuICAgIGlmIChkZWxlZ2F0ZSA9PT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGVsZWdhdGUuc2V0SW50ZXJ2YWwpIHtcbiAgICAgIHJldHVybiBkZWxlZ2F0ZS5zZXRJbnRlcnZhbC5hcHBseShkZWxlZ2F0ZSwgX19zcHJlYWRBcnJheShbaGFuZGxlciwgdGltZW91dF0sIF9fcmVhZChhcmdzKSkpO1xuICAgIH1cbiAgICByZXR1cm4gc2V0SW50ZXJ2YWwuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtoYW5kbGVyLCB0aW1lb3V0XSwgX19yZWFkKGFyZ3MpKSk7XG4gIH0sXG4gIGNsZWFySW50ZXJ2YWw6IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgIHZhciBkZWxlZ2F0ZSA9IGludGVydmFsUHJvdmlkZXIuZGVsZWdhdGU7XG4gICAgcmV0dXJuICgoZGVsZWdhdGUgPT09IG51bGwgfHwgZGVsZWdhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGVnYXRlLmNsZWFySW50ZXJ2YWwpIHx8IGNsZWFySW50ZXJ2YWwpKGhhbmRsZSk7XG4gIH0sXG4gIGRlbGVnYXRlOiB2b2lkIDBcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvQXN5bmNBY3Rpb24uanNcbnZhciBBc3luY0FjdGlvbiA9IGZ1bmN0aW9uKF9zdXBlcikge1xuICBfX2V4dGVuZHMoQXN5bmNBY3Rpb24yLCBfc3VwZXIpO1xuICBmdW5jdGlvbiBBc3luY0FjdGlvbjIoc2NoZWR1bGVyLCB3b3JrKSB7XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc2NoZWR1bGVyLCB3b3JrKSB8fCB0aGlzO1xuICAgIF90aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICBfdGhpcy53b3JrID0gd29yaztcbiAgICBfdGhpcy5wZW5kaW5nID0gZmFsc2U7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIEFzeW5jQWN0aW9uMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbihzdGF0ZSwgZGVsYXkyKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkge1xuICAgICAgZGVsYXkyID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHZhciBpZCA9IHRoaXMuaWQ7XG4gICAgdmFyIHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyO1xuICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheTIpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZGVsYXkgPSBkZWxheTI7XG4gICAgdGhpcy5pZCA9IChfYSA9IHRoaXMuaWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMucmVxdWVzdEFzeW5jSWQoc2NoZWR1bGVyLCB0aGlzLmlkLCBkZWxheTIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBBc3luY0FjdGlvbjIucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24oc2NoZWR1bGVyLCBfaWQsIGRlbGF5Mikge1xuICAgIGlmIChkZWxheTIgPT09IHZvaWQgMCkge1xuICAgICAgZGVsYXkyID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGludGVydmFsUHJvdmlkZXIuc2V0SW50ZXJ2YWwoc2NoZWR1bGVyLmZsdXNoLmJpbmQoc2NoZWR1bGVyLCB0aGlzKSwgZGVsYXkyKTtcbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZCA9IGZ1bmN0aW9uKF9zY2hlZHVsZXIsIGlkLCBkZWxheTIpIHtcbiAgICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHtcbiAgICAgIGRlbGF5MiA9IDA7XG4gICAgfVxuICAgIGlmIChkZWxheTIgIT0gbnVsbCAmJiB0aGlzLmRlbGF5ID09PSBkZWxheTIgJiYgdGhpcy5wZW5kaW5nID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgaW50ZXJ2YWxQcm92aWRlci5jbGVhckludGVydmFsKGlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24oc3RhdGUsIGRlbGF5Mikge1xuICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcihcImV4ZWN1dGluZyBhIGNhbmNlbGxlZCBhY3Rpb25cIik7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZyA9IGZhbHNlO1xuICAgIHZhciBlcnJvciA9IHRoaXMuX2V4ZWN1dGUoc3RhdGUsIGRlbGF5Mik7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBlbmRpbmcgPT09IGZhbHNlICYmIHRoaXMuaWQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQodGhpcy5zY2hlZHVsZXIsIHRoaXMuaWQsIG51bGwpO1xuICAgIH1cbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS5fZXhlY3V0ZSA9IGZ1bmN0aW9uKHN0YXRlLCBfZGVsYXkpIHtcbiAgICB2YXIgZXJyb3JlZCA9IGZhbHNlO1xuICAgIHZhciBlcnJvclZhbHVlO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLndvcmsoc3RhdGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yZWQgPSB0cnVlO1xuICAgICAgZXJyb3JWYWx1ZSA9IGUgPyBlIDogbmV3IEVycm9yKFwiU2NoZWR1bGVkIGFjdGlvbiB0aHJldyBmYWxzeSBlcnJvclwiKTtcbiAgICB9XG4gICAgaWYgKGVycm9yZWQpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIHJldHVybiBlcnJvclZhbHVlO1xuICAgIH1cbiAgfTtcbiAgQXN5bmNBY3Rpb24yLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgIHZhciBfYSA9IHRoaXMsIGlkID0gX2EuaWQsIHNjaGVkdWxlciA9IF9hLnNjaGVkdWxlcjtcbiAgICAgIHZhciBhY3Rpb25zID0gc2NoZWR1bGVyLmFjdGlvbnM7XG4gICAgICB0aGlzLndvcmsgPSB0aGlzLnN0YXRlID0gdGhpcy5zY2hlZHVsZXIgPSBudWxsO1xuICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XG4gICAgICBhcnJSZW1vdmUoYWN0aW9ucywgdGhpcyk7XG4gICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVsYXkgPSBudWxsO1xuICAgICAgX3N1cGVyLnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIEFzeW5jQWN0aW9uMjtcbn0oQWN0aW9uKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL1NjaGVkdWxlci5qc1xudmFyIFNjaGVkdWxlciA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBTY2hlZHVsZXIyKHNjaGVkdWxlckFjdGlvbkN0b3IsIG5vdykge1xuICAgIGlmIChub3cgPT09IHZvaWQgMCkge1xuICAgICAgbm93ID0gU2NoZWR1bGVyMi5ub3c7XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3RvciA9IHNjaGVkdWxlckFjdGlvbkN0b3I7XG4gICAgdGhpcy5ub3cgPSBub3c7XG4gIH1cbiAgU2NoZWR1bGVyMi5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbih3b3JrLCBkZWxheTIsIHN0YXRlKSB7XG4gICAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWxheTIgPSAwO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3Rvcih0aGlzLCB3b3JrKS5zY2hlZHVsZShzdGF0ZSwgZGVsYXkyKTtcbiAgfTtcbiAgU2NoZWR1bGVyMi5ub3cgPSBkYXRlVGltZXN0YW1wUHJvdmlkZXIubm93O1xuICByZXR1cm4gU2NoZWR1bGVyMjtcbn0oKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlci9Bc3luY1NjaGVkdWxlci5qc1xudmFyIEFzeW5jU2NoZWR1bGVyID0gZnVuY3Rpb24oX3N1cGVyKSB7XG4gIF9fZXh0ZW5kcyhBc3luY1NjaGVkdWxlcjIsIF9zdXBlcik7XG4gIGZ1bmN0aW9uIEFzeW5jU2NoZWR1bGVyMihTY2hlZHVsZXJBY3Rpb24sIG5vdykge1xuICAgIGlmIChub3cgPT09IHZvaWQgMCkge1xuICAgICAgbm93ID0gU2NoZWR1bGVyLm5vdztcbiAgICB9XG4gICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgU2NoZWR1bGVyQWN0aW9uLCBub3cpIHx8IHRoaXM7XG4gICAgX3RoaXMuYWN0aW9ucyA9IFtdO1xuICAgIF90aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgQXN5bmNTY2hlZHVsZXIyLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKGFjdGlvbikge1xuICAgIHZhciBhY3Rpb25zID0gdGhpcy5hY3Rpb25zO1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZXJyb3I7XG4gICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICBkbyB7XG4gICAgICBpZiAoZXJyb3IgPSBhY3Rpb24uZXhlY3V0ZShhY3Rpb24uc3RhdGUsIGFjdGlvbi5kZWxheSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKTtcbiAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpIHtcbiAgICAgICAgYWN0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG4gIHJldHVybiBBc3luY1NjaGVkdWxlcjI7XG59KFNjaGVkdWxlcik7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZXIvYXN5bmMuanNcbnZhciBhc3luY1NjaGVkdWxlciA9IG5ldyBBc3luY1NjaGVkdWxlcihBc3luY0FjdGlvbik7XG52YXIgYXN5bmMgPSBhc3luY1NjaGVkdWxlcjtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZW1wdHkuanNcbnZhciBFTVBUWSA9IG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbn0pO1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1NjaGVkdWxlci5qc1xuZnVuY3Rpb24gaXNTY2hlZHVsZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIGlzRnVuY3Rpb24odmFsdWUuc2NoZWR1bGUpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9hcmdzLmpzXG5mdW5jdGlvbiBsYXN0KGFycikge1xuICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbn1cbmZ1bmN0aW9uIHBvcFJlc3VsdFNlbGVjdG9yKGFyZ3MpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24obGFzdChhcmdzKSkgPyBhcmdzLnBvcCgpIDogdm9pZCAwO1xufVxuZnVuY3Rpb24gcG9wU2NoZWR1bGVyKGFyZ3MpIHtcbiAgcmV0dXJuIGlzU2NoZWR1bGVyKGxhc3QoYXJncykpID8gYXJncy5wb3AoKSA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHBvcE51bWJlcihhcmdzLCBkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiBsYXN0KGFyZ3MpID09PSBcIm51bWJlclwiID8gYXJncy5wb3AoKSA6IGRlZmF1bHRWYWx1ZTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNBcnJheUxpa2UuanNcbnZhciBpc0FycmF5TGlrZSA9IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHggJiYgdHlwZW9mIHgubGVuZ3RoID09PSBcIm51bWJlclwiICYmIHR5cGVvZiB4ICE9PSBcImZ1bmN0aW9uXCI7XG59O1xuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc1Byb21pc2UuanNcbmZ1bmN0aW9uIGlzUHJvbWlzZSh2YWx1ZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbih2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmFsdWUudGhlbik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2lzSW50ZXJvcE9ic2VydmFibGUuanNcbmZ1bmN0aW9uIGlzSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24oaW5wdXRbb2JzZXJ2YWJsZV0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9pc0FzeW5jSXRlcmFibGUuanNcbmZ1bmN0aW9uIGlzQXN5bmNJdGVyYWJsZShvYmopIHtcbiAgcmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yICYmIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL3Rocm93VW5vYnNlcnZhYmxlRXJyb3IuanNcbmZ1bmN0aW9uIGNyZWF0ZUludmFsaWRPYnNlcnZhYmxlVHlwZUVycm9yKGlucHV0KSB7XG4gIHJldHVybiBuZXcgVHlwZUVycm9yKFwiWW91IHByb3ZpZGVkIFwiICsgKGlucHV0ICE9PSBudWxsICYmIHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiA/IFwiYW4gaW52YWxpZCBvYmplY3RcIiA6IFwiJ1wiICsgaW5wdXQgKyBcIidcIikgKyBcIiB3aGVyZSBhIHN0cmVhbSB3YXMgZXhwZWN0ZWQuIFlvdSBjYW4gcHJvdmlkZSBhbiBPYnNlcnZhYmxlLCBQcm9taXNlLCBSZWFkYWJsZVN0cmVhbSwgQXJyYXksIEFzeW5jSXRlcmFibGUsIG9yIEl0ZXJhYmxlLlwiKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3N5bWJvbC9pdGVyYXRvci5qc1xuZnVuY3Rpb24gZ2V0U3ltYm9sSXRlcmF0b3IoKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcImZ1bmN0aW9uXCIgfHwgIVN5bWJvbC5pdGVyYXRvcikge1xuICAgIHJldHVybiBcIkBAaXRlcmF0b3JcIjtcbiAgfVxuICByZXR1cm4gU3ltYm9sLml0ZXJhdG9yO1xufVxudmFyIGl0ZXJhdG9yID0gZ2V0U3ltYm9sSXRlcmF0b3IoKTtcblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNJdGVyYWJsZS5qc1xuZnVuY3Rpb24gaXNJdGVyYWJsZShpbnB1dCkge1xuICByZXR1cm4gaXNGdW5jdGlvbihpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5wdXRbaXRlcmF0b3JdKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNSZWFkYWJsZVN0cmVhbUxpa2UuanNcbmZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IocmVhZGFibGVTdHJlYW0pIHtcbiAgcmV0dXJuIF9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiByZWFkYWJsZVN0cmVhbUxpa2VUb0FzeW5jR2VuZXJhdG9yXzEoKSB7XG4gICAgdmFyIHJlYWRlciwgX2EsIHZhbHVlLCBkb25lO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihfYikge1xuICAgICAgc3dpdGNoIChfYi5sYWJlbCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmVhZGVyID0gcmVhZGFibGVTdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2IudHJ5cy5wdXNoKFsxLCAsIDksIDEwXSk7XG4gICAgICAgICAgX2IubGFiZWwgPSAyO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKGZhbHNlKSByZXR1cm4gWzMsIDhdO1xuICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdChyZWFkZXIucmVhZCgpKV07XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfYSA9IF9iLnNlbnQoKSwgdmFsdWUgPSBfYS52YWx1ZSwgZG9uZSA9IF9hLmRvbmU7XG4gICAgICAgICAgaWYgKCFkb25lKSByZXR1cm4gWzMsIDVdO1xuICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdCh2b2lkIDApXTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiBbMiwgX2Iuc2VudCgpXTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJldHVybiBbNCwgX19hd2FpdCh2YWx1ZSldO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgcmV0dXJuIFs0LCBfYi5zZW50KCldO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgX2Iuc2VudCgpO1xuICAgICAgICAgIHJldHVybiBbMywgMl07XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gWzMsIDEwXTtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgICAgIHJldHVybiBbN107XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgcmV0dXJuIFsyXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtTGlrZShvYmopIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24ob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JqLmdldFJlYWRlcik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2lubmVyRnJvbS5qc1xuZnVuY3Rpb24gaW5uZXJGcm9tKGlucHV0KSB7XG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICBpZiAoaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkpIHtcbiAgICAgIHJldHVybiBmcm9tSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheUxpa2UoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZShpbnB1dCk7XG4gICAgfVxuICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIGZyb21Bc3luY0l0ZXJhYmxlKGlucHV0KTtcbiAgICB9XG4gICAgaWYgKGlzSXRlcmFibGUoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gZnJvbUl0ZXJhYmxlKGlucHV0KTtcbiAgICB9XG4gICAgaWYgKGlzUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIGZyb21SZWFkYWJsZVN0cmVhbUxpa2UoaW5wdXQpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCk7XG59XG5mdW5jdGlvbiBmcm9tSW50ZXJvcE9ic2VydmFibGUob2JqKSB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIG9icyA9IG9ialtvYnNlcnZhYmxlXSgpO1xuICAgIGlmIChpc0Z1bmN0aW9uKG9icy5zdWJzY3JpYmUpKSB7XG4gICAgICByZXR1cm4gb2JzLnN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb3ZpZGVkIG9iamVjdCBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IFN5bWJvbC5vYnNlcnZhYmxlXCIpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UoYXJyYXkpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aCAmJiAhc3Vic2NyaWJlci5jbG9zZWQ7IGkrKykge1xuICAgICAgc3Vic2NyaWJlci5uZXh0KGFycmF5W2ldKTtcbiAgICB9XG4gICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21Qcm9taXNlKHByb21pc2UpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZXJyKTtcbiAgICB9KS50aGVuKG51bGwsIHJlcG9ydFVuaGFuZGxlZEVycm9yKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBmcm9tSXRlcmFibGUoaXRlcmFibGUpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgZV8xLCBfYTtcbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgaXRlcmFibGVfMSA9IF9fdmFsdWVzKGl0ZXJhYmxlKSwgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCk7ICFpdGVyYWJsZV8xXzEuZG9uZTsgaXRlcmFibGVfMV8xID0gaXRlcmFibGVfMS5uZXh0KCkpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gaXRlcmFibGVfMV8xLnZhbHVlO1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlXzFfMSkge1xuICAgICAgZV8xID0geyBlcnJvcjogZV8xXzEgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGl0ZXJhYmxlXzFfMSAmJiAhaXRlcmFibGVfMV8xLmRvbmUgJiYgKF9hID0gaXRlcmFibGVfMS5yZXR1cm4pKSBfYS5jYWxsKGl0ZXJhYmxlXzEpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZnJvbUFzeW5jSXRlcmFibGUoYXN5bmNJdGVyYWJsZSkge1xuICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHByb2Nlc3MoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgIH0pO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGZyb21SZWFkYWJsZVN0cmVhbUxpa2UocmVhZGFibGVTdHJlYW0pIHtcbiAgcmV0dXJuIGZyb21Bc3luY0l0ZXJhYmxlKHJlYWRhYmxlU3RyZWFtTGlrZVRvQXN5bmNHZW5lcmF0b3IocmVhZGFibGVTdHJlYW0pKTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3MoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikge1xuICB2YXIgYXN5bmNJdGVyYWJsZV8xLCBhc3luY0l0ZXJhYmxlXzFfMTtcbiAgdmFyIGVfMiwgX2E7XG4gIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSwgZV8yXzE7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uKF9iKSB7XG4gICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBfYi50cnlzLnB1c2goWzAsIDUsIDYsIDExXSk7XG4gICAgICAgICAgYXN5bmNJdGVyYWJsZV8xID0gX19hc3luY1ZhbHVlcyhhc3luY0l0ZXJhYmxlKTtcbiAgICAgICAgICBfYi5sYWJlbCA9IDE7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gWzQsIGFzeW5jSXRlcmFibGVfMS5uZXh0KCldO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgaWYgKCEoYXN5bmNJdGVyYWJsZV8xXzEgPSBfYi5zZW50KCksICFhc3luY0l0ZXJhYmxlXzFfMS5kb25lKSkgcmV0dXJuIFszLCA0XTtcbiAgICAgICAgICB2YWx1ZSA9IGFzeW5jSXRlcmFibGVfMV8xLnZhbHVlO1xuICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gWzJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBfYi5sYWJlbCA9IDM7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByZXR1cm4gWzMsIDFdO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIFszLCAxMV07XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBlXzJfMSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICAgIHJldHVybiBbMywgMTFdO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2IudHJ5cy5wdXNoKFs2LCAsIDksIDEwXSk7XG4gICAgICAgICAgaWYgKCEoYXN5bmNJdGVyYWJsZV8xXzEgJiYgIWFzeW5jSXRlcmFibGVfMV8xLmRvbmUgJiYgKF9hID0gYXN5bmNJdGVyYWJsZV8xLnJldHVybikpKSByZXR1cm4gWzMsIDhdO1xuICAgICAgICAgIHJldHVybiBbNCwgX2EuY2FsbChhc3luY0l0ZXJhYmxlXzEpXTtcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICBfYi5sYWJlbCA9IDg7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gWzMsIDEwXTtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjtcbiAgICAgICAgICByZXR1cm4gWzddO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIHJldHVybiBbN107XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIHJldHVybiBbMl07XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9leGVjdXRlU2NoZWR1bGUuanNcbmZ1bmN0aW9uIGV4ZWN1dGVTY2hlZHVsZShwYXJlbnRTdWJzY3JpcHRpb24sIHNjaGVkdWxlciwgd29yaywgZGVsYXkyLCByZXBlYXQpIHtcbiAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7XG4gICAgZGVsYXkyID0gMDtcbiAgfVxuICBpZiAocmVwZWF0ID09PSB2b2lkIDApIHtcbiAgICByZXBlYXQgPSBmYWxzZTtcbiAgfVxuICB2YXIgc2NoZWR1bGVTdWJzY3JpcHRpb24gPSBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7XG4gICAgd29yaygpO1xuICAgIGlmIChyZXBlYXQpIHtcbiAgICAgIHBhcmVudFN1YnNjcmlwdGlvbi5hZGQodGhpcy5zY2hlZHVsZShudWxsLCBkZWxheTIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfSwgZGVsYXkyKTtcbiAgcGFyZW50U3Vic2NyaXB0aW9uLmFkZChzY2hlZHVsZVN1YnNjcmlwdGlvbik7XG4gIGlmICghcmVwZWF0KSB7XG4gICAgcmV0dXJuIHNjaGVkdWxlU3Vic2NyaXB0aW9uO1xuICB9XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvb2JzZXJ2ZU9uLmpzXG5mdW5jdGlvbiBvYnNlcnZlT24oc2NoZWR1bGVyLCBkZWxheTIpIHtcbiAgaWYgKGRlbGF5MiA9PT0gdm9pZCAwKSB7XG4gICAgZGVsYXkyID0gMDtcbiAgfVxuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0sIGRlbGF5Mik7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICB9LCBkZWxheTIpO1xuICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgcmV0dXJuIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgICAgfSwgZGVsYXkyKTtcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N1YnNjcmliZU9uLmpzXG5mdW5jdGlvbiBzdWJzY3JpYmVPbihzY2hlZHVsZXIsIGRlbGF5Mikge1xuICBpZiAoZGVsYXkyID09PSB2b2lkIDApIHtcbiAgICBkZWxheTIgPSAwO1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHN1YnNjcmliZXIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgIH0sIGRlbGF5MikpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZU9ic2VydmFibGUuanNcbmZ1bmN0aW9uIHNjaGVkdWxlT2JzZXJ2YWJsZShpbnB1dCwgc2NoZWR1bGVyKSB7XG4gIHJldHVybiBpbm5lckZyb20oaW5wdXQpLnBpcGUoc3Vic2NyaWJlT24oc2NoZWR1bGVyKSwgb2JzZXJ2ZU9uKHNjaGVkdWxlcikpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlUHJvbWlzZS5qc1xuZnVuY3Rpb24gc2NoZWR1bGVQcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpIHtcbiAgcmV0dXJuIGlubmVyRnJvbShpbnB1dCkucGlwZShzdWJzY3JpYmVPbihzY2hlZHVsZXIpLCBvYnNlcnZlT24oc2NoZWR1bGVyKSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVBcnJheS5qc1xuZnVuY3Rpb24gc2NoZWR1bGVBcnJheShpbnB1dCwgc2NoZWR1bGVyKSB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGkgPSAwO1xuICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoaSA9PT0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnNjcmliZXIubmV4dChpbnB1dFtpKytdKTtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3NjaGVkdWxlZC9zY2hlZHVsZUl0ZXJhYmxlLmpzXG5mdW5jdGlvbiBzY2hlZHVsZUl0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgaXRlcmF0b3IyO1xuICAgIGV4ZWN1dGVTY2hlZHVsZShzdWJzY3JpYmVyLCBzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgaXRlcmF0b3IyID0gaW5wdXRbaXRlcmF0b3JdKCk7XG4gICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgIHZhciBkb25lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIF9hID0gaXRlcmF0b3IyLm5leHQoKSwgdmFsdWUgPSBfYS52YWx1ZSwgZG9uZSA9IF9hLmRvbmU7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSwgMCwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oaXRlcmF0b3IyID09PSBudWxsIHx8IGl0ZXJhdG9yMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogaXRlcmF0b3IyLnJldHVybikgJiYgaXRlcmF0b3IyLnJldHVybigpO1xuICAgIH07XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlQXN5bmNJdGVyYWJsZS5qc1xuZnVuY3Rpb24gc2NoZWR1bGVBc3luY0l0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHtcbiAgaWYgKCFpbnB1dCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkl0ZXJhYmxlIGNhbm5vdCBiZSBudWxsXCIpO1xuICB9XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZShmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmliZXIsIHNjaGVkdWxlciwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaXRlcmF0b3IyID0gaW5wdXRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgc2NoZWR1bGVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaXRlcmF0b3IyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgMCwgdHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvc2NoZWR1bGVkL3NjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlLmpzXG5mdW5jdGlvbiBzY2hlZHVsZVJlYWRhYmxlU3RyZWFtTGlrZShpbnB1dCwgc2NoZWR1bGVyKSB7XG4gIHJldHVybiBzY2hlZHVsZUFzeW5jSXRlcmFibGUocmVhZGFibGVTdHJlYW1MaWtlVG9Bc3luY0dlbmVyYXRvcihpbnB1dCksIHNjaGVkdWxlcik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9zY2hlZHVsZWQvc2NoZWR1bGVkLmpzXG5mdW5jdGlvbiBzY2hlZHVsZWQoaW5wdXQsIHNjaGVkdWxlcikge1xuICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgIGlmIChpc0ludGVyb3BPYnNlcnZhYmxlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlT2JzZXJ2YWJsZShpbnB1dCwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXlMaWtlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcik7XG4gICAgfVxuICAgIGlmIChpc1Byb21pc2UoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVQcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpO1xuICAgIH1cbiAgICBpZiAoaXNBc3luY0l0ZXJhYmxlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQXN5bmNJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGlzSXRlcmFibGUoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gc2NoZWR1bGVJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKTtcbiAgICB9XG4gICAgaWYgKGlzUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0KSkge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlUmVhZGFibGVTdHJlYW1MaWtlKGlucHV0LCBzY2hlZHVsZXIpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBjcmVhdGVJbnZhbGlkT2JzZXJ2YWJsZVR5cGVFcnJvcihpbnB1dCk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2Zyb20uanNcbmZ1bmN0aW9uIGZyb20oaW5wdXQsIHNjaGVkdWxlcikge1xuICByZXR1cm4gc2NoZWR1bGVyID8gc2NoZWR1bGVkKGlucHV0LCBzY2hlZHVsZXIpIDogaW5uZXJGcm9tKGlucHV0KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvb2YuanNcbmZ1bmN0aW9uIG9mKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKGFyZ3MpO1xuICByZXR1cm4gZnJvbShhcmdzLCBzY2hlZHVsZXIpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9FbXB0eUVycm9yLmpzXG52YXIgRW1wdHlFcnJvciA9IGNyZWF0ZUVycm9yQ2xhc3MoZnVuY3Rpb24oX3N1cGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiBFbXB0eUVycm9ySW1wbCgpIHtcbiAgICBfc3VwZXIodGhpcyk7XG4gICAgdGhpcy5uYW1lID0gXCJFbXB0eUVycm9yXCI7XG4gICAgdGhpcy5tZXNzYWdlID0gXCJubyBlbGVtZW50cyBpbiBzZXF1ZW5jZVwiO1xuICB9O1xufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9sYXN0VmFsdWVGcm9tLmpzXG5mdW5jdGlvbiBsYXN0VmFsdWVGcm9tKHNvdXJjZSwgY29uZmlnMikge1xuICB2YXIgaGFzQ29uZmlnID0gdHlwZW9mIGNvbmZpZzIgPT09IFwib2JqZWN0XCI7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgX2hhc1ZhbHVlID0gZmFsc2U7XG4gICAgdmFyIF92YWx1ZTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIF92YWx1ZSA9IHZhbHVlO1xuICAgICAgICBfaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChfaGFzVmFsdWUpIHtcbiAgICAgICAgICByZXNvbHZlKF92YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQ29uZmlnKSB7XG4gICAgICAgICAgcmVzb2x2ZShjb25maWcyLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFbXB0eUVycm9yKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvZmlyc3RWYWx1ZUZyb20uanNcbmZ1bmN0aW9uIGZpcnN0VmFsdWVGcm9tKHNvdXJjZSwgY29uZmlnMikge1xuICB2YXIgaGFzQ29uZmlnID0gdHlwZW9mIGNvbmZpZzIgPT09IFwib2JqZWN0XCI7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgc3Vic2NyaWJlciA9IG5ldyBTYWZlU3Vic2NyaWJlcih7XG4gICAgICBuZXh0OiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgc3Vic2NyaWJlci51bnN1YnNjcmliZSgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChoYXNDb25maWcpIHtcbiAgICAgICAgICByZXNvbHZlKGNvbmZpZzIuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QobmV3IEVtcHR5RXJyb3IoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvaXNEYXRlLmpzXG5mdW5jdGlvbiBpc1ZhbGlkRGF0ZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2YWx1ZSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWFwLmpzXG5mdW5jdGlvbiBtYXAocHJvamVjdCwgdGhpc0FyZykge1xuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBzdWJzY3JpYmVyLm5leHQocHJvamVjdC5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCsrKSk7XG4gICAgfSkpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvbWFwT25lT3JNYW55QXJncy5qc1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gY2FsbE9yQXBwbHkoZm4sIGFyZ3MpIHtcbiAgcmV0dXJuIGlzQXJyYXkoYXJncykgPyBmbi5hcHBseSh2b2lkIDAsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhcmdzKSkpIDogZm4oYXJncyk7XG59XG5mdW5jdGlvbiBtYXBPbmVPck1hbnlBcmdzKGZuKSB7XG4gIHJldHVybiBtYXAoZnVuY3Rpb24oYXJncykge1xuICAgIHJldHVybiBjYWxsT3JBcHBseShmbiwgYXJncyk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvdXRpbC9hcmdzQXJnQXJyYXlPck9iamVjdC5qc1xudmFyIGlzQXJyYXkyID0gQXJyYXkuaXNBcnJheTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG52YXIgZ2V0S2V5cyA9IE9iamVjdC5rZXlzO1xuZnVuY3Rpb24gYXJnc0FyZ0FycmF5T3JPYmplY3QoYXJncykge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICB2YXIgZmlyc3RfMSA9IGFyZ3NbMF07XG4gICAgaWYgKGlzQXJyYXkyKGZpcnN0XzEpKSB7XG4gICAgICByZXR1cm4geyBhcmdzOiBmaXJzdF8xLCBrZXlzOiBudWxsIH07XG4gICAgfVxuICAgIGlmIChpc1BPSk8oZmlyc3RfMSkpIHtcbiAgICAgIHZhciBrZXlzID0gZ2V0S2V5cyhmaXJzdF8xKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFyZ3M6IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIHJldHVybiBmaXJzdF8xW2tleV07XG4gICAgICAgIH0pLFxuICAgICAgICBrZXlzXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBhcmdzLCBrZXlzOiBudWxsIH07XG59XG5mdW5jdGlvbiBpc1BPSk8ob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiBnZXRQcm90b3R5cGVPZihvYmopID09PSBvYmplY3RQcm90bztcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL3V0aWwvY3JlYXRlT2JqZWN0LmpzXG5mdW5jdGlvbiBjcmVhdGVPYmplY3Qoa2V5cywgdmFsdWVzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbihyZXN1bHQsIGtleSwgaSkge1xuICAgIHJldHVybiByZXN1bHRba2V5XSA9IHZhbHVlc1tpXSwgcmVzdWx0O1xuICB9LCB7fSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL2NvbWJpbmVMYXRlc3QuanNcbmZ1bmN0aW9uIGNvbWJpbmVMYXRlc3QoKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG4gIHZhciBzY2hlZHVsZXIgPSBwb3BTY2hlZHVsZXIoYXJncyk7XG4gIHZhciByZXN1bHRTZWxlY3RvciA9IHBvcFJlc3VsdFNlbGVjdG9yKGFyZ3MpO1xuICB2YXIgX2EgPSBhcmdzQXJnQXJyYXlPck9iamVjdChhcmdzKSwgb2JzZXJ2YWJsZXMgPSBfYS5hcmdzLCBrZXlzID0gX2Eua2V5cztcbiAgaWYgKG9ic2VydmFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmcm9tKFtdLCBzY2hlZHVsZXIpO1xuICB9XG4gIHZhciByZXN1bHQgPSBuZXcgT2JzZXJ2YWJsZShjb21iaW5lTGF0ZXN0SW5pdChvYnNlcnZhYmxlcywgc2NoZWR1bGVyLCBrZXlzID8gZnVuY3Rpb24odmFsdWVzKSB7XG4gICAgcmV0dXJuIGNyZWF0ZU9iamVjdChrZXlzLCB2YWx1ZXMpO1xuICB9IDogaWRlbnRpdHkpKTtcbiAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0LnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpIDogcmVzdWx0O1xufVxuZnVuY3Rpb24gY29tYmluZUxhdGVzdEluaXQob2JzZXJ2YWJsZXMsIHNjaGVkdWxlciwgdmFsdWVUcmFuc2Zvcm0pIHtcbiAgaWYgKHZhbHVlVHJhbnNmb3JtID09PSB2b2lkIDApIHtcbiAgICB2YWx1ZVRyYW5zZm9ybSA9IGlkZW50aXR5O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgbWF5YmVTY2hlZHVsZShzY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGxlbmd0aCA9IG9ic2VydmFibGVzLmxlbmd0aDtcbiAgICAgIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICAgIHZhciBhY3RpdmUgPSBsZW5ndGg7XG4gICAgICB2YXIgcmVtYWluaW5nRmlyc3RWYWx1ZXMgPSBsZW5ndGg7XG4gICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uKGkyKSB7XG4gICAgICAgIG1heWJlU2NoZWR1bGUoc2NoZWR1bGVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgc291cmNlID0gZnJvbShvYnNlcnZhYmxlc1tpMl0sIHNjaGVkdWxlcik7XG4gICAgICAgICAgdmFyIGhhc0ZpcnN0VmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWVzW2kyXSA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFoYXNGaXJzdFZhbHVlKSB7XG4gICAgICAgICAgICAgIGhhc0ZpcnN0VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICByZW1haW5pbmdGaXJzdFZhbHVlcy0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZW1haW5pbmdGaXJzdFZhbHVlcykge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWVUcmFuc2Zvcm0odmFsdWVzLnNsaWNlKCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICghLS1hY3RpdmUpIHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSwgc3Vic2NyaWJlcik7XG4gICAgICB9O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBfbG9vcF8xKGkpO1xuICAgICAgfVxuICAgIH0sIHN1YnNjcmliZXIpO1xuICB9O1xufVxuZnVuY3Rpb24gbWF5YmVTY2hlZHVsZShzY2hlZHVsZXIsIGV4ZWN1dGUsIHN1YnNjcmlwdGlvbikge1xuICBpZiAoc2NoZWR1bGVyKSB7XG4gICAgZXhlY3V0ZVNjaGVkdWxlKHN1YnNjcmlwdGlvbiwgc2NoZWR1bGVyLCBleGVjdXRlKTtcbiAgfSBlbHNlIHtcbiAgICBleGVjdXRlKCk7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUludGVybmFscy5qc1xuZnVuY3Rpb24gbWVyZ2VJbnRlcm5hbHMoc291cmNlLCBzdWJzY3JpYmVyLCBwcm9qZWN0LCBjb25jdXJyZW50LCBvbkJlZm9yZU5leHQsIGV4cGFuZCwgaW5uZXJTdWJTY2hlZHVsZXIsIGFkZGl0aW9uYWxGaW5hbGl6ZXIpIHtcbiAgdmFyIGJ1ZmZlciA9IFtdO1xuICB2YXIgYWN0aXZlID0gMDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGlzQ29tcGxldGUgPSBmYWxzZTtcbiAgdmFyIGNoZWNrQ29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoaXNDb21wbGV0ZSAmJiAhYnVmZmVyLmxlbmd0aCAmJiAhYWN0aXZlKSB7XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfVxuICB9O1xuICB2YXIgb3V0ZXJOZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gYWN0aXZlIDwgY29uY3VycmVudCA/IGRvSW5uZXJTdWIodmFsdWUpIDogYnVmZmVyLnB1c2godmFsdWUpO1xuICB9O1xuICB2YXIgZG9Jbm5lclN1YiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgZXhwYW5kICYmIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgYWN0aXZlKys7XG4gICAgdmFyIGlubmVyQ29tcGxldGUgPSBmYWxzZTtcbiAgICBpbm5lckZyb20ocHJvamVjdCh2YWx1ZSwgaW5kZXgrKykpLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oaW5uZXJWYWx1ZSkge1xuICAgICAgb25CZWZvcmVOZXh0ID09PSBudWxsIHx8IG9uQmVmb3JlTmV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25CZWZvcmVOZXh0KGlubmVyVmFsdWUpO1xuICAgICAgaWYgKGV4cGFuZCkge1xuICAgICAgICBvdXRlck5leHQoaW5uZXJWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoaW5uZXJWYWx1ZSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICBpbm5lckNvbXBsZXRlID0gdHJ1ZTtcbiAgICB9LCB2b2lkIDAsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGlubmVyQ29tcGxldGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhY3RpdmUtLTtcbiAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGJ1ZmZlcmVkVmFsdWUgPSBidWZmZXIuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChpbm5lclN1YlNjaGVkdWxlcikge1xuICAgICAgICAgICAgICBleGVjdXRlU2NoZWR1bGUoc3Vic2NyaWJlciwgaW5uZXJTdWJTY2hlZHVsZXIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkb0lubmVyU3ViKGJ1ZmZlcmVkVmFsdWUpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRvSW5uZXJTdWIoYnVmZmVyZWRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICB3aGlsZSAoYnVmZmVyLmxlbmd0aCAmJiBhY3RpdmUgPCBjb25jdXJyZW50KSB7XG4gICAgICAgICAgICBfbG9vcF8xKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoZWNrQ29tcGxldGUoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpO1xuICB9O1xuICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBvdXRlck5leHQsIGZ1bmN0aW9uKCkge1xuICAgIGlzQ29tcGxldGUgPSB0cnVlO1xuICAgIGNoZWNrQ29tcGxldGUoKTtcbiAgfSkpO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgYWRkaXRpb25hbEZpbmFsaXplciA9PT0gbnVsbCB8fCBhZGRpdGlvbmFsRmluYWxpemVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhZGRpdGlvbmFsRmluYWxpemVyKCk7XG4gIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvbWVyZ2VNYXAuanNcbmZ1bmN0aW9uIG1lcmdlTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50KSB7XG4gIGlmIChjb25jdXJyZW50ID09PSB2b2lkIDApIHtcbiAgICBjb25jdXJyZW50ID0gSW5maW5pdHk7XG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24ocmVzdWx0U2VsZWN0b3IpKSB7XG4gICAgcmV0dXJuIG1lcmdlTWFwKGZ1bmN0aW9uKGEsIGkpIHtcbiAgICAgIHJldHVybiBtYXAoZnVuY3Rpb24oYiwgaWkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yKGEsIGIsIGksIGlpKTtcbiAgICAgIH0pKGlubmVyRnJvbShwcm9qZWN0KGEsIGkpKSk7XG4gICAgfSwgY29uY3VycmVudCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSBcIm51bWJlclwiKSB7XG4gICAgY29uY3VycmVudCA9IHJlc3VsdFNlbGVjdG9yO1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHJldHVybiBtZXJnZUludGVybmFscyhzb3VyY2UsIHN1YnNjcmliZXIsIHByb2plY3QsIGNvbmN1cnJlbnQpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZUFsbC5qc1xuZnVuY3Rpb24gbWVyZ2VBbGwoY29uY3VycmVudCkge1xuICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7XG4gICAgY29uY3VycmVudCA9IEluZmluaXR5O1xuICB9XG4gIHJldHVybiBtZXJnZU1hcChpZGVudGl0eSwgY29uY3VycmVudCk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvY29uY2F0QWxsLmpzXG5mdW5jdGlvbiBjb25jYXRBbGwoKSB7XG4gIHJldHVybiBtZXJnZUFsbCgxKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvY29uY2F0LmpzXG5mdW5jdGlvbiBjb25jYXQoKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG4gIHJldHVybiBjb25jYXRBbGwoKShmcm9tKGFyZ3MsIHBvcFNjaGVkdWxlcihhcmdzKSkpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9kZWZlci5qc1xuZnVuY3Rpb24gZGVmZXIob2JzZXJ2YWJsZUZhY3RvcnkpIHtcbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICBpbm5lckZyb20ob2JzZXJ2YWJsZUZhY3RvcnkoKSkuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvZm9ya0pvaW4uanNcbmZ1bmN0aW9uIGZvcmtKb2luKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBwb3BSZXN1bHRTZWxlY3RvcihhcmdzKTtcbiAgdmFyIF9hID0gYXJnc0FyZ0FycmF5T3JPYmplY3QoYXJncyksIHNvdXJjZXMgPSBfYS5hcmdzLCBrZXlzID0gX2Eua2V5cztcbiAgdmFyIHJlc3VsdCA9IG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHZhbHVlcyA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgIHZhciByZW1haW5pbmdDb21wbGV0aW9ucyA9IGxlbmd0aDtcbiAgICB2YXIgcmVtYWluaW5nRW1pc3Npb25zID0gbGVuZ3RoO1xuICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24oc291cmNlSW5kZXgyKSB7XG4gICAgICB2YXIgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgIGlubmVyRnJvbShzb3VyY2VzW3NvdXJjZUluZGV4Ml0pLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKCFoYXNWYWx1ZSkge1xuICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICByZW1haW5pbmdFbWlzc2lvbnMtLTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZXNbc291cmNlSW5kZXgyXSA9IHZhbHVlO1xuICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByZW1haW5pbmdDb21wbGV0aW9ucy0tO1xuICAgICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCFyZW1haW5pbmdDb21wbGV0aW9ucyB8fCAhaGFzVmFsdWUpIHtcbiAgICAgICAgICBpZiAoIXJlbWFpbmluZ0VtaXNzaW9ucykge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGtleXMgPyBjcmVhdGVPYmplY3Qoa2V5cywgdmFsdWVzKSA6IHZhbHVlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH07XG4gICAgZm9yICh2YXIgc291cmNlSW5kZXggPSAwOyBzb3VyY2VJbmRleCA8IGxlbmd0aDsgc291cmNlSW5kZXgrKykge1xuICAgICAgX2xvb3BfMShzb3VyY2VJbmRleCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0LnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpIDogcmVzdWx0O1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9mcm9tRXZlbnQuanNcbnZhciBub2RlRXZlbnRFbWl0dGVyTWV0aG9kcyA9IFtcImFkZExpc3RlbmVyXCIsIFwicmVtb3ZlTGlzdGVuZXJcIl07XG52YXIgZXZlbnRUYXJnZXRNZXRob2RzID0gW1wiYWRkRXZlbnRMaXN0ZW5lclwiLCBcInJlbW92ZUV2ZW50TGlzdGVuZXJcIl07XG52YXIganF1ZXJ5TWV0aG9kcyA9IFtcIm9uXCIsIFwib2ZmXCJdO1xuZnVuY3Rpb24gZnJvbUV2ZW50KHRhcmdldCwgZXZlbnROYW1lLCBvcHRpb25zLCByZXN1bHRTZWxlY3Rvcikge1xuICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgIHJlc3VsdFNlbGVjdG9yID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0gdm9pZCAwO1xuICB9XG4gIGlmIChyZXN1bHRTZWxlY3Rvcikge1xuICAgIHJldHVybiBmcm9tRXZlbnQodGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpLnBpcGUobWFwT25lT3JNYW55QXJncyhyZXN1bHRTZWxlY3RvcikpO1xuICB9XG4gIHZhciBfYSA9IF9fcmVhZChpc0V2ZW50VGFyZ2V0KHRhcmdldCkgPyBldmVudFRhcmdldE1ldGhvZHMubWFwKGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oaGFuZGxlcikge1xuICAgICAgcmV0dXJuIHRhcmdldFttZXRob2ROYW1lXShldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIH07XG4gIH0pIDogaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSA/IG5vZGVFdmVudEVtaXR0ZXJNZXRob2RzLm1hcCh0b0NvbW1vbkhhbmRsZXJSZWdpc3RyeSh0YXJnZXQsIGV2ZW50TmFtZSkpIDogaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpID8ganF1ZXJ5TWV0aG9kcy5tYXAodG9Db21tb25IYW5kbGVyUmVnaXN0cnkodGFyZ2V0LCBldmVudE5hbWUpKSA6IFtdLCAyKSwgYWRkID0gX2FbMF0sIHJlbW92ZSA9IF9hWzFdO1xuICBpZiAoIWFkZCkge1xuICAgIGlmIChpc0FycmF5TGlrZSh0YXJnZXQpKSB7XG4gICAgICByZXR1cm4gbWVyZ2VNYXAoZnVuY3Rpb24oc3ViVGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBmcm9tRXZlbnQoc3ViVGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpO1xuICAgICAgfSkoaW5uZXJGcm9tKHRhcmdldCkpO1xuICAgIH1cbiAgfVxuICBpZiAoIWFkZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGV2ZW50IHRhcmdldFwiKTtcbiAgfVxuICByZXR1cm4gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1YnNjcmliZXIubmV4dCgxIDwgYXJncy5sZW5ndGggPyBhcmdzIDogYXJnc1swXSk7XG4gICAgfTtcbiAgICBhZGQoaGFuZGxlcik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJlbW92ZShoYW5kbGVyKTtcbiAgICB9O1xuICB9KTtcbn1cbmZ1bmN0aW9uIHRvQ29tbW9uSGFuZGxlclJlZ2lzdHJ5KHRhcmdldCwgZXZlbnROYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbihtZXRob2ROYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIodGFyZ2V0KSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHRhcmdldC5hZGRMaXN0ZW5lcikgJiYgaXNGdW5jdGlvbih0YXJnZXQucmVtb3ZlTGlzdGVuZXIpO1xufVxuZnVuY3Rpb24gaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcih0YXJnZXQpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24odGFyZ2V0Lm9uKSAmJiBpc0Z1bmN0aW9uKHRhcmdldC5vZmYpO1xufVxuZnVuY3Rpb24gaXNFdmVudFRhcmdldCh0YXJnZXQpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24odGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpICYmIGlzRnVuY3Rpb24odGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS90aW1lci5qc1xuZnVuY3Rpb24gdGltZXIoZHVlVGltZSwgaW50ZXJ2YWxPclNjaGVkdWxlciwgc2NoZWR1bGVyKSB7XG4gIGlmIChkdWVUaW1lID09PSB2b2lkIDApIHtcbiAgICBkdWVUaW1lID0gMDtcbiAgfVxuICBpZiAoc2NoZWR1bGVyID09PSB2b2lkIDApIHtcbiAgICBzY2hlZHVsZXIgPSBhc3luYztcbiAgfVxuICB2YXIgaW50ZXJ2YWxEdXJhdGlvbiA9IC0xO1xuICBpZiAoaW50ZXJ2YWxPclNjaGVkdWxlciAhPSBudWxsKSB7XG4gICAgaWYgKGlzU2NoZWR1bGVyKGludGVydmFsT3JTY2hlZHVsZXIpKSB7XG4gICAgICBzY2hlZHVsZXIgPSBpbnRlcnZhbE9yU2NoZWR1bGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbER1cmF0aW9uID0gaW50ZXJ2YWxPclNjaGVkdWxlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKGZ1bmN0aW9uKHN1YnNjcmliZXIpIHtcbiAgICB2YXIgZHVlID0gaXNWYWxpZERhdGUoZHVlVGltZSkgPyArZHVlVGltZSAtIHNjaGVkdWxlci5ub3coKSA6IGR1ZVRpbWU7XG4gICAgaWYgKGR1ZSA8IDApIHtcbiAgICAgIGR1ZSA9IDA7XG4gICAgfVxuICAgIHZhciBuID0gMDtcbiAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkge1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQobisrKTtcbiAgICAgICAgaWYgKDAgPD0gaW50ZXJ2YWxEdXJhdGlvbikge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGUodm9pZCAwLCBpbnRlcnZhbER1cmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBkdWUpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29ic2VydmFibGUvbWVyZ2UuanNcbmZ1bmN0aW9uIG1lcmdlKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKGFyZ3MpO1xuICB2YXIgY29uY3VycmVudCA9IHBvcE51bWJlcihhcmdzLCBJbmZpbml0eSk7XG4gIHZhciBzb3VyY2VzID0gYXJncztcbiAgcmV0dXJuICFzb3VyY2VzLmxlbmd0aCA/IEVNUFRZIDogc291cmNlcy5sZW5ndGggPT09IDEgPyBpbm5lckZyb20oc291cmNlc1swXSkgOiBtZXJnZUFsbChjb25jdXJyZW50KShmcm9tKHNvdXJjZXMsIHNjaGVkdWxlcikpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb2JzZXJ2YWJsZS9uZXZlci5qc1xudmFyIE5FVkVSID0gbmV3IE9ic2VydmFibGUobm9vcCk7XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC91dGlsL2FyZ3NPckFyZ0FycmF5LmpzXG52YXIgaXNBcnJheTMgPSBBcnJheS5pc0FycmF5O1xuZnVuY3Rpb24gYXJnc09yQXJnQXJyYXkoYXJncykge1xuICByZXR1cm4gYXJncy5sZW5ndGggPT09IDEgJiYgaXNBcnJheTMoYXJnc1swXSkgPyBhcmdzWzBdIDogYXJncztcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9maWx0ZXIuanNcbmZ1bmN0aW9uIGZpbHRlcihwcmVkaWNhdGUsIHRoaXNBcmcpIHtcbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCsrKSAmJiBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgIH0pKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3JhY2UuanNcbmZ1bmN0aW9uIHJhY2UoKSB7XG4gIHZhciBzb3VyY2VzID0gW107XG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgc291cmNlc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICB9XG4gIHNvdXJjZXMgPSBhcmdzT3JBcmdBcnJheShzb3VyY2VzKTtcbiAgcmV0dXJuIHNvdXJjZXMubGVuZ3RoID09PSAxID8gaW5uZXJGcm9tKHNvdXJjZXNbMF0pIDogbmV3IE9ic2VydmFibGUocmFjZUluaXQoc291cmNlcykpO1xufVxuZnVuY3Rpb24gcmFjZUluaXQoc291cmNlcykge1xuICByZXR1cm4gZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHZhciBzdWJzY3JpcHRpb25zID0gW107XG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbihpMikge1xuICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKGlubmVyRnJvbShzb3VyY2VzW2kyXSkuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucykge1xuICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgc3Vic2NyaXB0aW9ucy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgcyAhPT0gaTIgJiYgc3Vic2NyaXB0aW9uc1tzXS51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdWJzY3JpcHRpb25zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgfSkpKTtcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBzdWJzY3JpcHRpb25zICYmICFzdWJzY3JpYmVyLmNsb3NlZCAmJiBpIDwgc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgX2xvb3BfMShpKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vYnNlcnZhYmxlL3ppcC5qc1xuZnVuY3Rpb24gemlwKCkge1xuICB2YXIgYXJncyA9IFtdO1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgcmVzdWx0U2VsZWN0b3IgPSBwb3BSZXN1bHRTZWxlY3RvcihhcmdzKTtcbiAgdmFyIHNvdXJjZXMgPSBhcmdzT3JBcmdBcnJheShhcmdzKTtcbiAgcmV0dXJuIHNvdXJjZXMubGVuZ3RoID8gbmV3IE9ic2VydmFibGUoZnVuY3Rpb24oc3Vic2NyaWJlcikge1xuICAgIHZhciBidWZmZXJzID0gc291cmNlcy5tYXAoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG4gICAgdmFyIGNvbXBsZXRlZCA9IHNvdXJjZXMubWFwKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIHN1YnNjcmliZXIuYWRkKGZ1bmN0aW9uKCkge1xuICAgICAgYnVmZmVycyA9IGNvbXBsZXRlZCA9IG51bGw7XG4gICAgfSk7XG4gICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbihzb3VyY2VJbmRleDIpIHtcbiAgICAgIGlubmVyRnJvbShzb3VyY2VzW3NvdXJjZUluZGV4Ml0pLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgYnVmZmVyc1tzb3VyY2VJbmRleDJdLnB1c2godmFsdWUpO1xuICAgICAgICBpZiAoYnVmZmVycy5ldmVyeShmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgICAgICByZXR1cm4gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gYnVmZmVycy5tYXAoZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyLnNoaWZ0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0U2VsZWN0b3IuYXBwbHkodm9pZCAwLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQocmVzdWx0KSkpIDogcmVzdWx0KTtcbiAgICAgICAgICBpZiAoYnVmZmVycy5zb21lKGZ1bmN0aW9uKGJ1ZmZlciwgaSkge1xuICAgICAgICAgICAgcmV0dXJuICFidWZmZXIubGVuZ3RoICYmIGNvbXBsZXRlZFtpXTtcbiAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbXBsZXRlZFtzb3VyY2VJbmRleDJdID0gdHJ1ZTtcbiAgICAgICAgIWJ1ZmZlcnNbc291cmNlSW5kZXgyXS5sZW5ndGggJiYgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfSkpO1xuICAgIH07XG4gICAgZm9yICh2YXIgc291cmNlSW5kZXggPSAwOyAhc3Vic2NyaWJlci5jbG9zZWQgJiYgc291cmNlSW5kZXggPCBzb3VyY2VzLmxlbmd0aDsgc291cmNlSW5kZXgrKykge1xuICAgICAgX2xvb3BfMShzb3VyY2VJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIGJ1ZmZlcnMgPSBjb21wbGV0ZWQgPSBudWxsO1xuICAgIH07XG4gIH0pIDogRU1QVFk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvYnVmZmVyQ291bnQuanNcbmZ1bmN0aW9uIGJ1ZmZlckNvdW50KGJ1ZmZlclNpemUsIHN0YXJ0QnVmZmVyRXZlcnkpIHtcbiAgaWYgKHN0YXJ0QnVmZmVyRXZlcnkgPT09IHZvaWQgMCkge1xuICAgIHN0YXJ0QnVmZmVyRXZlcnkgPSBudWxsO1xuICB9XG4gIHN0YXJ0QnVmZmVyRXZlcnkgPSBzdGFydEJ1ZmZlckV2ZXJ5ICE9PSBudWxsICYmIHN0YXJ0QnVmZmVyRXZlcnkgIT09IHZvaWQgMCA/IHN0YXJ0QnVmZmVyRXZlcnkgOiBidWZmZXJTaXplO1xuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgYnVmZmVycyA9IFtdO1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHZhciBlXzEsIF9hLCBlXzIsIF9iO1xuICAgICAgdmFyIHRvRW1pdCA9IG51bGw7XG4gICAgICBpZiAoY291bnQrKyAlIHN0YXJ0QnVmZmVyRXZlcnkgPT09IDApIHtcbiAgICAgICAgYnVmZmVycy5wdXNoKFtdKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIGJ1ZmZlcnNfMSA9IF9fdmFsdWVzKGJ1ZmZlcnMpLCBidWZmZXJzXzFfMSA9IGJ1ZmZlcnNfMS5uZXh0KCk7ICFidWZmZXJzXzFfMS5kb25lOyBidWZmZXJzXzFfMSA9IGJ1ZmZlcnNfMS5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gYnVmZmVyc18xXzEudmFsdWU7XG4gICAgICAgICAgYnVmZmVyLnB1c2godmFsdWUpO1xuICAgICAgICAgIGlmIChidWZmZXJTaXplIDw9IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRvRW1pdCA9IHRvRW1pdCAhPT0gbnVsbCAmJiB0b0VtaXQgIT09IHZvaWQgMCA/IHRvRW1pdCA6IFtdO1xuICAgICAgICAgICAgdG9FbWl0LnB1c2goYnVmZmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVfMV8xKSB7XG4gICAgICAgIGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChidWZmZXJzXzFfMSAmJiAhYnVmZmVyc18xXzEuZG9uZSAmJiAoX2EgPSBidWZmZXJzXzEucmV0dXJuKSkgX2EuY2FsbChidWZmZXJzXzEpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRvRW1pdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAodmFyIHRvRW1pdF8xID0gX192YWx1ZXModG9FbWl0KSwgdG9FbWl0XzFfMSA9IHRvRW1pdF8xLm5leHQoKTsgIXRvRW1pdF8xXzEuZG9uZTsgdG9FbWl0XzFfMSA9IHRvRW1pdF8xLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IHRvRW1pdF8xXzEudmFsdWU7XG4gICAgICAgICAgICBhcnJSZW1vdmUoYnVmZmVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChidWZmZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZV8yXzEpIHtcbiAgICAgICAgICBlXzIgPSB7IGVycm9yOiBlXzJfMSB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodG9FbWl0XzFfMSAmJiAhdG9FbWl0XzFfMS5kb25lICYmIChfYiA9IHRvRW1pdF8xLnJldHVybikpIF9iLmNhbGwodG9FbWl0XzEpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZV8zLCBfYTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAodmFyIGJ1ZmZlcnNfMiA9IF9fdmFsdWVzKGJ1ZmZlcnMpLCBidWZmZXJzXzJfMSA9IGJ1ZmZlcnNfMi5uZXh0KCk7ICFidWZmZXJzXzJfMS5kb25lOyBidWZmZXJzXzJfMSA9IGJ1ZmZlcnNfMi5uZXh0KCkpIHtcbiAgICAgICAgICB2YXIgYnVmZmVyID0gYnVmZmVyc18yXzEudmFsdWU7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVfM18xKSB7XG4gICAgICAgIGVfMyA9IHsgZXJyb3I6IGVfM18xIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChidWZmZXJzXzJfMSAmJiAhYnVmZmVyc18yXzEuZG9uZSAmJiAoX2EgPSBidWZmZXJzXzIucmV0dXJuKSkgX2EuY2FsbChidWZmZXJzXzIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgIH0sIHZvaWQgMCwgZnVuY3Rpb24oKSB7XG4gICAgICBidWZmZXJzID0gbnVsbDtcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2NhdGNoRXJyb3IuanNcbmZ1bmN0aW9uIGNhdGNoRXJyb3Ioc2VsZWN0b3IpIHtcbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGlubmVyU3ViID0gbnVsbDtcbiAgICB2YXIgc3luY1Vuc3ViID0gZmFsc2U7XG4gICAgdmFyIGhhbmRsZWRSZXN1bHQ7XG4gICAgaW5uZXJTdWIgPSBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICBoYW5kbGVkUmVzdWx0ID0gaW5uZXJGcm9tKHNlbGVjdG9yKGVyciwgY2F0Y2hFcnJvcihzZWxlY3Rvcikoc291cmNlKSkpO1xuICAgICAgaWYgKGlubmVyU3ViKSB7XG4gICAgICAgIGlubmVyU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGlubmVyU3ViID0gbnVsbDtcbiAgICAgICAgaGFuZGxlZFJlc3VsdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jVW5zdWIgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pKTtcbiAgICBpZiAoc3luY1Vuc3ViKSB7XG4gICAgICBpbm5lclN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgaW5uZXJTdWIgPSBudWxsO1xuICAgICAgaGFuZGxlZFJlc3VsdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9jb25jYXRNYXAuanNcbmZ1bmN0aW9uIGNvbmNhdE1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3Rvcikge1xuICByZXR1cm4gaXNGdW5jdGlvbihyZXN1bHRTZWxlY3RvcikgPyBtZXJnZU1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvciwgMSkgOiBtZXJnZU1hcChwcm9qZWN0LCAxKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9kZWJvdW5jZVRpbWUuanNcbmZ1bmN0aW9uIGRlYm91bmNlVGltZShkdWVUaW1lLCBzY2hlZHVsZXIpIHtcbiAgaWYgKHNjaGVkdWxlciA9PT0gdm9pZCAwKSB7XG4gICAgc2NoZWR1bGVyID0gYXN5bmNTY2hlZHVsZXI7XG4gIH1cbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIGFjdGl2ZVRhc2sgPSBudWxsO1xuICAgIHZhciBsYXN0VmFsdWUgPSBudWxsO1xuICAgIHZhciBsYXN0VGltZSA9IG51bGw7XG4gICAgdmFyIGVtaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChhY3RpdmVUYXNrKSB7XG4gICAgICAgIGFjdGl2ZVRhc2sudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgYWN0aXZlVGFzayA9IG51bGw7XG4gICAgICAgIHZhciB2YWx1ZSA9IGxhc3RWYWx1ZTtcbiAgICAgICAgbGFzdFZhbHVlID0gbnVsbDtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGVtaXRXaGVuSWRsZSgpIHtcbiAgICAgIHZhciB0YXJnZXRUaW1lID0gbGFzdFRpbWUgKyBkdWVUaW1lO1xuICAgICAgdmFyIG5vdyA9IHNjaGVkdWxlci5ub3coKTtcbiAgICAgIGlmIChub3cgPCB0YXJnZXRUaW1lKSB7XG4gICAgICAgIGFjdGl2ZVRhc2sgPSB0aGlzLnNjaGVkdWxlKHZvaWQgMCwgdGFyZ2V0VGltZSAtIG5vdyk7XG4gICAgICAgIHN1YnNjcmliZXIuYWRkKGFjdGl2ZVRhc2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbWl0KCk7XG4gICAgfVxuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBsYXN0VmFsdWUgPSB2YWx1ZTtcbiAgICAgIGxhc3RUaW1lID0gc2NoZWR1bGVyLm5vdygpO1xuICAgICAgaWYgKCFhY3RpdmVUYXNrKSB7XG4gICAgICAgIGFjdGl2ZVRhc2sgPSBzY2hlZHVsZXIuc2NoZWR1bGUoZW1pdFdoZW5JZGxlLCBkdWVUaW1lKTtcbiAgICAgICAgc3Vic2NyaWJlci5hZGQoYWN0aXZlVGFzayk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICBlbWl0KCk7XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSwgdm9pZCAwLCBmdW5jdGlvbigpIHtcbiAgICAgIGxhc3RWYWx1ZSA9IGFjdGl2ZVRhc2sgPSBudWxsO1xuICAgIH0pKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVmYXVsdElmRW1wdHkuanNcbmZ1bmN0aW9uIGRlZmF1bHRJZkVtcHR5KGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICB9LCBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghaGFzVmFsdWUpIHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSkpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YWtlLmpzXG5mdW5jdGlvbiB0YWtlKGNvdW50KSB7XG4gIHJldHVybiBjb3VudCA8PSAwID8gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIEVNUFRZO1xuICB9IDogb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgc2VlbiA9IDA7XG4gICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICgrK3NlZW4gPD0gY291bnQpIHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgaWYgKGNvdW50IDw9IHNlZW4pIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2lnbm9yZUVsZW1lbnRzLmpzXG5mdW5jdGlvbiBpZ25vcmVFbGVtZW50cygpIHtcbiAgcmV0dXJuIG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgc291cmNlLnN1YnNjcmliZShjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgbm9vcCkpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tYXBUby5qc1xuZnVuY3Rpb24gbWFwVG8odmFsdWUpIHtcbiAgcmV0dXJuIG1hcChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2RlbGF5V2hlbi5qc1xuZnVuY3Rpb24gZGVsYXlXaGVuKGRlbGF5RHVyYXRpb25TZWxlY3Rvciwgc3Vic2NyaXB0aW9uRGVsYXkpIHtcbiAgaWYgKHN1YnNjcmlwdGlvbkRlbGF5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGNvbmNhdChzdWJzY3JpcHRpb25EZWxheS5waXBlKHRha2UoMSksIGlnbm9yZUVsZW1lbnRzKCkpLCBzb3VyY2UucGlwZShkZWxheVdoZW4oZGVsYXlEdXJhdGlvblNlbGVjdG9yKSkpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIG1lcmdlTWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgIHJldHVybiBpbm5lckZyb20oZGVsYXlEdXJhdGlvblNlbGVjdG9yKHZhbHVlLCBpbmRleCkpLnBpcGUodGFrZSgxKSwgbWFwVG8odmFsdWUpKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvZGVsYXkuanNcbmZ1bmN0aW9uIGRlbGF5KGR1ZSwgc2NoZWR1bGVyKSB7XG4gIGlmIChzY2hlZHVsZXIgPT09IHZvaWQgMCkge1xuICAgIHNjaGVkdWxlciA9IGFzeW5jU2NoZWR1bGVyO1xuICB9XG4gIHZhciBkdXJhdGlvbiA9IHRpbWVyKGR1ZSwgc2NoZWR1bGVyKTtcbiAgcmV0dXJuIGRlbGF5V2hlbihmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZHVyYXRpb247XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rocm93SWZFbXB0eS5qc1xuZnVuY3Rpb24gdGhyb3dJZkVtcHR5KGVycm9yRmFjdG9yeSkge1xuICBpZiAoZXJyb3JGYWN0b3J5ID09PSB2b2lkIDApIHtcbiAgICBlcnJvckZhY3RvcnkgPSBkZWZhdWx0RXJyb3JGYWN0b3J5O1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHZhciBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBoYXNWYWx1ZSA9IHRydWU7XG4gICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGhhc1ZhbHVlID8gc3Vic2NyaWJlci5jb21wbGV0ZSgpIDogc3Vic2NyaWJlci5lcnJvcihlcnJvckZhY3RvcnkoKSk7XG4gICAgfSkpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRFcnJvckZhY3RvcnkoKSB7XG4gIHJldHVybiBuZXcgRW1wdHlFcnJvcigpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL2ZpcnN0LmpzXG5mdW5jdGlvbiBmaXJzdChwcmVkaWNhdGUsIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgaGFzRGVmYXVsdFZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+PSAyO1xuICByZXR1cm4gZnVuY3Rpb24oc291cmNlKSB7XG4gICAgcmV0dXJuIHNvdXJjZS5waXBlKHByZWRpY2F0ZSA/IGZpbHRlcihmdW5jdGlvbih2LCBpKSB7XG4gICAgICByZXR1cm4gcHJlZGljYXRlKHYsIGksIHNvdXJjZSk7XG4gICAgfSkgOiBpZGVudGl0eSwgdGFrZSgxKSwgaGFzRGVmYXVsdFZhbHVlID8gZGVmYXVsdElmRW1wdHkoZGVmYXVsdFZhbHVlKSA6IHRocm93SWZFbXB0eShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgRW1wdHlFcnJvcigpO1xuICAgIH0pKTtcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9tZXJnZVNjYW4uanNcbmZ1bmN0aW9uIG1lcmdlU2NhbihhY2N1bXVsYXRvciwgc2VlZCwgY29uY3VycmVudCkge1xuICBpZiAoY29uY3VycmVudCA9PT0gdm9pZCAwKSB7XG4gICAgY29uY3VycmVudCA9IEluZmluaXR5O1xuICB9XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHZhciBzdGF0ZSA9IHNlZWQ7XG4gICAgcmV0dXJuIG1lcmdlSW50ZXJuYWxzKHNvdXJjZSwgc3Vic2NyaWJlciwgZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3Ioc3RhdGUsIHZhbHVlLCBpbmRleCk7XG4gICAgfSwgY29uY3VycmVudCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHN0YXRlID0gdmFsdWU7XG4gICAgfSwgZmFsc2UsIHZvaWQgMCwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc3RhdGUgPSBudWxsO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy9yYWNlV2l0aC5qc1xuZnVuY3Rpb24gcmFjZVdpdGgoKSB7XG4gIHZhciBvdGhlclNvdXJjZXMgPSBbXTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICBvdGhlclNvdXJjZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICByZXR1cm4gIW90aGVyU291cmNlcy5sZW5ndGggPyBpZGVudGl0eSA6IG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgcmFjZUluaXQoX19zcHJlYWRBcnJheShbc291cmNlXSwgX19yZWFkKG90aGVyU291cmNlcykpKShzdWJzY3JpYmVyKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvcmV0cnkuanNcbmZ1bmN0aW9uIHJldHJ5KGNvbmZpZ09yQ291bnQpIHtcbiAgaWYgKGNvbmZpZ09yQ291bnQgPT09IHZvaWQgMCkge1xuICAgIGNvbmZpZ09yQ291bnQgPSBJbmZpbml0eTtcbiAgfVxuICB2YXIgY29uZmlnMjtcbiAgaWYgKGNvbmZpZ09yQ291bnQgJiYgdHlwZW9mIGNvbmZpZ09yQ291bnQgPT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25maWcyID0gY29uZmlnT3JDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcyID0ge1xuICAgICAgY291bnQ6IGNvbmZpZ09yQ291bnRcbiAgICB9O1xuICB9XG4gIHZhciBfYSA9IGNvbmZpZzIuY291bnQsIGNvdW50ID0gX2EgPT09IHZvaWQgMCA/IEluZmluaXR5IDogX2EsIGRlbGF5MiA9IGNvbmZpZzIuZGVsYXksIF9iID0gY29uZmlnMi5yZXNldE9uU3VjY2VzcywgcmVzZXRPblN1Y2Nlc3MgPSBfYiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfYjtcbiAgcmV0dXJuIGNvdW50IDw9IDAgPyBpZGVudGl0eSA6IG9wZXJhdGUoZnVuY3Rpb24oc291cmNlLCBzdWJzY3JpYmVyKSB7XG4gICAgdmFyIHNvRmFyID0gMDtcbiAgICB2YXIgaW5uZXJTdWI7XG4gICAgdmFyIHN1YnNjcmliZUZvclJldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc3luY1Vuc3ViID0gZmFsc2U7XG4gICAgICBpbm5lclN1YiA9IHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmIChyZXNldE9uU3VjY2Vzcykge1xuICAgICAgICAgIHNvRmFyID0gMDtcbiAgICAgICAgfVxuICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpO1xuICAgICAgfSwgdm9pZCAwLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKHNvRmFyKysgPCBjb3VudCkge1xuICAgICAgICAgIHZhciByZXN1Yl8xID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoaW5uZXJTdWIpIHtcbiAgICAgICAgICAgICAgaW5uZXJTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgaW5uZXJTdWIgPSBudWxsO1xuICAgICAgICAgICAgICBzdWJzY3JpYmVGb3JSZXRyeSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3luY1Vuc3ViID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChkZWxheTIgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIG5vdGlmaWVyID0gdHlwZW9mIGRlbGF5MiA9PT0gXCJudW1iZXJcIiA/IHRpbWVyKGRlbGF5MikgOiBpbm5lckZyb20oZGVsYXkyKGVyciwgc29GYXIpKTtcbiAgICAgICAgICAgIHZhciBub3RpZmllclN1YnNjcmliZXJfMSA9IGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgbm90aWZpZXJTdWJzY3JpYmVyXzEudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgcmVzdWJfMSgpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbm90aWZpZXIuc3Vic2NyaWJlKG5vdGlmaWVyU3Vic2NyaWJlcl8xKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWJfMSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICAgIGlmIChzeW5jVW5zdWIpIHtcbiAgICAgICAgaW5uZXJTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaW5uZXJTdWIgPSBudWxsO1xuICAgICAgICBzdWJzY3JpYmVGb3JSZXRyeSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgc3Vic2NyaWJlRm9yUmV0cnkoKTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy9yeGpzL2Rpc3QvZXNtNS9pbnRlcm5hbC9vcGVyYXRvcnMvc3RhcnRXaXRoLmpzXG5mdW5jdGlvbiBzdGFydFdpdGgoKSB7XG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YWx1ZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgfVxuICB2YXIgc2NoZWR1bGVyID0gcG9wU2NoZWR1bGVyKHZhbHVlcyk7XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIChzY2hlZHVsZXIgPyBjb25jYXQodmFsdWVzLCBzb3VyY2UsIHNjaGVkdWxlcikgOiBjb25jYXQodmFsdWVzLCBzb3VyY2UpKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3N3aXRjaE1hcC5qc1xuZnVuY3Rpb24gc3dpdGNoTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yKSB7XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIHZhciBpbm5lclN1YnNjcmliZXIgPSBudWxsO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGlzQ29tcGxldGUgPSBmYWxzZTtcbiAgICB2YXIgY2hlY2tDb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGlzQ29tcGxldGUgJiYgIWlubmVyU3Vic2NyaWJlciAmJiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfTtcbiAgICBzb3VyY2Uuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaW5uZXJTdWJzY3JpYmVyID09PSBudWxsIHx8IGlubmVyU3Vic2NyaWJlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5uZXJTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB2YXIgaW5uZXJJbmRleCA9IDA7XG4gICAgICB2YXIgb3V0ZXJJbmRleCA9IGluZGV4Kys7XG4gICAgICBpbm5lckZyb20ocHJvamVjdCh2YWx1ZSwgb3V0ZXJJbmRleCkpLnN1YnNjcmliZShpbm5lclN1YnNjcmliZXIgPSBjcmVhdGVPcGVyYXRvclN1YnNjcmliZXIoc3Vic2NyaWJlciwgZnVuY3Rpb24oaW5uZXJWYWx1ZSkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5uZXh0KHJlc3VsdFNlbGVjdG9yID8gcmVzdWx0U2VsZWN0b3IodmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgrKykgOiBpbm5lclZhbHVlKTtcbiAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICBpbm5lclN1YnNjcmliZXIgPSBudWxsO1xuICAgICAgICBjaGVja0NvbXBsZXRlKCk7XG4gICAgICB9KSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICBpc0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgIGNoZWNrQ29tcGxldGUoKTtcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvcnhqcy9kaXN0L2VzbTUvaW50ZXJuYWwvb3BlcmF0b3JzL3Rha2VVbnRpbC5qc1xuZnVuY3Rpb24gdGFrZVVudGlsKG5vdGlmaWVyKSB7XG4gIHJldHVybiBvcGVyYXRlKGZ1bmN0aW9uKHNvdXJjZSwgc3Vic2NyaWJlcikge1xuICAgIGlubmVyRnJvbShub3RpZmllcikuc3Vic2NyaWJlKGNyZWF0ZU9wZXJhdG9yU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgfSwgbm9vcCkpO1xuICAgICFzdWJzY3JpYmVyLmNsb3NlZCAmJiBzb3VyY2Uuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzL3J4anMvZGlzdC9lc201L2ludGVybmFsL29wZXJhdG9ycy90YXAuanNcbmZ1bmN0aW9uIHRhcChvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7XG4gIHZhciB0YXBPYnNlcnZlciA9IGlzRnVuY3Rpb24ob2JzZXJ2ZXJPck5leHQpIHx8IGVycm9yIHx8IGNvbXBsZXRlID8geyBuZXh0OiBvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlIH0gOiBvYnNlcnZlck9yTmV4dDtcbiAgcmV0dXJuIHRhcE9ic2VydmVyID8gb3BlcmF0ZShmdW5jdGlvbihzb3VyY2UsIHN1YnNjcmliZXIpIHtcbiAgICB2YXIgX2E7XG4gICAgKF9hID0gdGFwT2JzZXJ2ZXIuc3Vic2NyaWJlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0YXBPYnNlcnZlcik7XG4gICAgdmFyIGlzVW5zdWIgPSB0cnVlO1xuICAgIHNvdXJjZS5zdWJzY3JpYmUoY3JlYXRlT3BlcmF0b3JTdWJzY3JpYmVyKHN1YnNjcmliZXIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YXIgX2EyO1xuICAgICAgKF9hMiA9IHRhcE9ic2VydmVyLm5leHQpID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmNhbGwodGFwT2JzZXJ2ZXIsIHZhbHVlKTtcbiAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgX2EyO1xuICAgICAgaXNVbnN1YiA9IGZhbHNlO1xuICAgICAgKF9hMiA9IHRhcE9ic2VydmVyLmNvbXBsZXRlKSA9PT0gbnVsbCB8fCBfYTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMi5jYWxsKHRhcE9ic2VydmVyKTtcbiAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIHZhciBfYTI7XG4gICAgICBpc1Vuc3ViID0gZmFsc2U7XG4gICAgICAoX2EyID0gdGFwT2JzZXJ2ZXIuZXJyb3IpID09PSBudWxsIHx8IF9hMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EyLmNhbGwodGFwT2JzZXJ2ZXIsIGVycik7XG4gICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XG4gICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgX2EyLCBfYjtcbiAgICAgIGlmIChpc1Vuc3ViKSB7XG4gICAgICAgIChfYTIgPSB0YXBPYnNlcnZlci51bnN1YnNjcmliZSkgPT09IG51bGwgfHwgX2EyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTIuY2FsbCh0YXBPYnNlcnZlcik7XG4gICAgICB9XG4gICAgICAoX2IgPSB0YXBPYnNlcnZlci5maW5hbGl6ZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwodGFwT2JzZXJ2ZXIpO1xuICAgIH0pKTtcbiAgfSkgOiBpZGVudGl0eTtcbn1cbmV4cG9ydCB7XG4gIEVNUFRZLFxuICBORVZFUixcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgYnVmZmVyQ291bnQsXG4gIGNhdGNoRXJyb3IsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGNvbmNhdCxcbiAgY29uY2F0TWFwLFxuICBkZWJvdW5jZVRpbWUsXG4gIGRlZmF1bHRJZkVtcHR5LFxuICBkZWZlcixcbiAgZGVsYXksXG4gIGRlbGF5V2hlbixcbiAgZmlsdGVyLFxuICBmaXJzdCxcbiAgZmlyc3RWYWx1ZUZyb20sXG4gIGZvcmtKb2luLFxuICBmcm9tLFxuICBmcm9tRXZlbnQsXG4gIGlkZW50aXR5LFxuICBpZ25vcmVFbGVtZW50cyxcbiAgbGFzdFZhbHVlRnJvbSxcbiAgbWFwLFxuICBtZXJnZSxcbiAgbWVyZ2VNYXAsXG4gIG1lcmdlU2NhbixcbiAgbm9vcCxcbiAgb2YsXG4gIHBpcGUsXG4gIHJhY2UsXG4gIHJhY2VXaXRoLFxuICByZXRyeSxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxuICB0aHJvd0lmRW1wdHksXG4gIHRpbWVyLFxuICB6aXBcbn07XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG59O1xuIiwiaW1wb3J0IGNyZWF0ZVdlYlNvY2tldFN0cmVhbSBmcm9tICcuL2xpYi9zdHJlYW0uanMnO1xuaW1wb3J0IFJlY2VpdmVyIGZyb20gJy4vbGliL3JlY2VpdmVyLmpzJztcbmltcG9ydCBTZW5kZXIgZnJvbSAnLi9saWIvc2VuZGVyLmpzJztcbmltcG9ydCBXZWJTb2NrZXQgZnJvbSAnLi9saWIvd2Vic29ja2V0LmpzJztcbmltcG9ydCBXZWJTb2NrZXRTZXJ2ZXIgZnJvbSAnLi9saWIvd2Vic29ja2V0LXNlcnZlci5qcyc7XG5cbmV4cG9ydCB7IGNyZWF0ZVdlYlNvY2tldFN0cmVhbSwgUmVjZWl2ZXIsIFNlbmRlciwgV2ViU29ja2V0LCBXZWJTb2NrZXRTZXJ2ZXIgfTtcbmV4cG9ydCBkZWZhdWx0IFdlYlNvY2tldDtcbiIsImxldCBzaGltO1xuY2xhc3MgWTE4TiB7XG4gICAgY29uc3RydWN0b3Iob3B0cykge1xuICAgICAgICAvLyBjb25maWd1cmFibGUgb3B0aW9ucy5cbiAgICAgICAgb3B0cyA9IG9wdHMgfHwge307XG4gICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gb3B0cy5kaXJlY3RvcnkgfHwgJy4vbG9jYWxlcyc7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsZXMgPSB0eXBlb2Ygb3B0cy51cGRhdGVGaWxlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy51cGRhdGVGaWxlcyA6IHRydWU7XG4gICAgICAgIHRoaXMubG9jYWxlID0gb3B0cy5sb2NhbGUgfHwgJ2VuJztcbiAgICAgICAgdGhpcy5mYWxsYmFja1RvTGFuZ3VhZ2UgPSB0eXBlb2Ygb3B0cy5mYWxsYmFja1RvTGFuZ3VhZ2UgPT09ICdib29sZWFuJyA/IG9wdHMuZmFsbGJhY2tUb0xhbmd1YWdlIDogdHJ1ZTtcbiAgICAgICAgLy8gaW50ZXJuYWwgc3R1ZmYuXG4gICAgICAgIHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLndyaXRlUXVldWUgPSBbXTtcbiAgICB9XG4gICAgX18oLi4uYXJncykge1xuICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90YWdnZWRMaXRlcmFsKGFyZ3VtZW50c1swXSwgLi4uYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHIgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIGxldCBjYiA9IGZ1bmN0aW9uICgpIHsgfTsgLy8gc3RhcnQgd2l0aCBub29wLlxuICAgICAgICBpZiAodHlwZW9mIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiID0gYXJncy5wb3AoKTtcbiAgICAgICAgY2IgPSBjYiB8fCBmdW5jdGlvbiAoKSB7IH07IC8vIG5vb3AuXG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICAvLyB3ZSd2ZSBvYnNlcnZlZCBhIG5ldyBzdHJpbmcsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgZmlsZS5cbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzdHJdICYmIHRoaXMudXBkYXRlRmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gPSBzdHI7XG4gICAgICAgICAgICAvLyBpbmNsdWRlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgbG9jYWxlLFxuICAgICAgICAgICAgLy8gc2luY2UgdGhlc2UgdmFsdWVzIGNvdWxkIGNoYW5nZSBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyB3cml0ZSBpcyBwZXJmb3JtZWQuXG4gICAgICAgICAgICB0aGlzLl9lbnF1ZXVlV3JpdGUoe1xuICAgICAgICAgICAgICAgIGRpcmVjdG9yeTogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgICAgICAgICBjYlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjYigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgW3RoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3N0cl0gfHwgc3RyXS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgICBfX24oKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICBjb25zdCBzaW5ndWxhciA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgY29uc3QgcGx1cmFsID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBjb25zdCBxdWFudGl0eSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgbGV0IGNiID0gZnVuY3Rpb24gKCkgeyB9OyAvLyBzdGFydCB3aXRoIG5vb3AuXG4gICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IgPSBhcmdzLnBvcCgpO1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdKVxuICAgICAgICAgICAgdGhpcy5fcmVhZExvY2FsZUZpbGUoKTtcbiAgICAgICAgbGV0IHN0ciA9IHF1YW50aXR5ID09PSAxID8gc2luZ3VsYXIgOiBwbHVyYWw7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1bc2luZ3VsYXJdO1xuICAgICAgICAgICAgc3RyID0gZW50cnlbcXVhbnRpdHkgPT09IDEgPyAnb25lJyA6ICdvdGhlciddO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdlJ3ZlIG9ic2VydmVkIGEgbmV3IHN0cmluZywgdXBkYXRlIHRoZSBsYW5ndWFnZSBmaWxlLlxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVbdGhpcy5sb2NhbGVdW3Npbmd1bGFyXSAmJiB0aGlzLnVwZGF0ZUZpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXVtzaW5ndWxhcl0gPSB7XG4gICAgICAgICAgICAgICAgb25lOiBzaW5ndWxhcixcbiAgICAgICAgICAgICAgICBvdGhlcjogcGx1cmFsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gaW5jbHVkZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGxvY2FsZSxcbiAgICAgICAgICAgIC8vIHNpbmNlIHRoZXNlIHZhbHVlcyBjb3VsZCBjaGFuZ2UgYmVmb3JlIHRoZVxuICAgICAgICAgICAgLy8gd3JpdGUgaXMgcGVyZm9ybWVkLlxuICAgICAgICAgICAgdGhpcy5fZW5xdWV1ZVdyaXRlKHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuZGlyZWN0b3J5LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgICAgICAgY2JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhICVkIHBsYWNlaG9sZGVyIGlzIHByb3ZpZGVkLCBhZGQgcXVhbnRpdHlcbiAgICAgICAgLy8gdG8gdGhlIGFyZ3VtZW50cyBleHBhbmRlZCBieSB1dGlsLmZvcm1hdC5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gW3N0cl07XG4gICAgICAgIGlmICh+c3RyLmluZGV4T2YoJyVkJykpXG4gICAgICAgICAgICB2YWx1ZXMucHVzaChxdWFudGl0eSk7XG4gICAgICAgIHJldHVybiBzaGltLmZvcm1hdC5hcHBseShzaGltLmZvcm1hdCwgdmFsdWVzLmNvbmNhdChhcmdzKSk7XG4gICAgfVxuICAgIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgfVxuICAgIGdldExvY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlO1xuICAgIH1cbiAgICB1cGRhdGVMb2NhbGUob2JqKSB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV0pXG4gICAgICAgICAgICB0aGlzLl9yZWFkTG9jYWxlRmlsZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVt0aGlzLmxvY2FsZV1ba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIF90YWdnZWRMaXRlcmFsKHBhcnRzLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgcGFydHMuZm9yRWFjaChmdW5jdGlvbiAocGFydCwgaSkge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpICsgMV07XG4gICAgICAgICAgICBzdHIgKz0gcGFydDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHN0ciArPSAnJXMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX18uYXBwbHkodGhpcywgW3N0cl0uY29uY2F0KFtdLnNsaWNlLmNhbGwoYXJncywgMSkpKTtcbiAgICB9XG4gICAgX2VucXVldWVXcml0ZSh3b3JrKSB7XG4gICAgICAgIHRoaXMud3JpdGVRdWV1ZS5wdXNoKHdvcmspO1xuICAgICAgICBpZiAodGhpcy53cml0ZVF1ZXVlLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NXcml0ZVF1ZXVlKCk7XG4gICAgfVxuICAgIF9wcm9jZXNzV3JpdGVRdWV1ZSgpIHtcbiAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xuICAgICAgICBjb25zdCB3b3JrID0gdGhpcy53cml0ZVF1ZXVlWzBdO1xuICAgICAgICAvLyBkZXN0cnVjdHVyZSB0aGUgZW5xdWV1ZWQgd29yay5cbiAgICAgICAgY29uc3QgZGlyZWN0b3J5ID0gd29yay5kaXJlY3Rvcnk7XG4gICAgICAgIGNvbnN0IGxvY2FsZSA9IHdvcmsubG9jYWxlO1xuICAgICAgICBjb25zdCBjYiA9IHdvcmsuY2I7XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHRoaXMuX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZExvY2FsZSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY2FjaGVbbG9jYWxlXSwgbnVsbCwgMik7XG4gICAgICAgIHNoaW0uZnMud3JpdGVGaWxlKGxhbmd1YWdlRmlsZSwgc2VyaWFsaXplZExvY2FsZSwgJ3V0Zi04JywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgX3RoaXMud3JpdGVRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKF90aGlzLndyaXRlUXVldWUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBfdGhpcy5fcHJvY2Vzc1dyaXRlUXVldWUoKTtcbiAgICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcmVhZExvY2FsZUZpbGUoKSB7XG4gICAgICAgIGxldCBsb2NhbGVMb29rdXAgPSB7fTtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VGaWxlID0gdGhpcy5fcmVzb2x2ZUxvY2FsZUZpbGUodGhpcy5kaXJlY3RvcnksIHRoaXMubG9jYWxlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYSBidW5kbGVyIHN1Y2ggYXMgd2VicGFjaywgcmVhZEZpbGVTeW5jIG1heSBub3QgYmUgZGVmaW5lZDpcbiAgICAgICAgICAgIGlmIChzaGltLmZzLnJlYWRGaWxlU3luYykge1xuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IEpTT04ucGFyc2Uoc2hpbS5mcy5yZWFkRmlsZVN5bmMobGFuZ3VhZ2VGaWxlLCAndXRmLTgnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSAnc3ludGF4IGVycm9yIGluICcgKyBsYW5ndWFnZUZpbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKVxuICAgICAgICAgICAgICAgIGxvY2FsZUxvb2t1cCA9IHt9O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlW3RoaXMubG9jYWxlXSA9IGxvY2FsZUxvb2t1cDtcbiAgICB9XG4gICAgX3Jlc29sdmVMb2NhbGVGaWxlKGRpcmVjdG9yeSwgbG9jYWxlKSB7XG4gICAgICAgIGxldCBmaWxlID0gc2hpbS5yZXNvbHZlKGRpcmVjdG9yeSwgJy4vJywgbG9jYWxlICsgJy5qc29uJyk7XG4gICAgICAgIGlmICh0aGlzLmZhbGxiYWNrVG9MYW5ndWFnZSAmJiAhdGhpcy5fZmlsZUV4aXN0c1N5bmMoZmlsZSkgJiYgfmxvY2FsZS5sYXN0SW5kZXhPZignXycpKSB7XG4gICAgICAgICAgICAvLyBhdHRlbXB0IGZhbGxiYWNrIHRvIGxhbmd1YWdlIG9ubHlcbiAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlRmlsZSA9IHNoaW0ucmVzb2x2ZShkaXJlY3RvcnksICcuLycsIGxvY2FsZS5zcGxpdCgnXycpWzBdICsgJy5qc29uJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZmlsZUV4aXN0c1N5bmMobGFuZ3VhZ2VGaWxlKSlcbiAgICAgICAgICAgICAgICBmaWxlID0gbGFuZ3VhZ2VGaWxlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cbiAgICBfZmlsZUV4aXN0c1N5bmMoZmlsZSkge1xuICAgICAgICByZXR1cm4gc2hpbS5leGlzdHMoZmlsZSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHkxOG4ob3B0cywgX3NoaW0pIHtcbiAgICBzaGltID0gX3NoaW07XG4gICAgY29uc3QgeTE4biA9IG5ldyBZMThOKG9wdHMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIF9fOiB5MThuLl9fLmJpbmQoeTE4biksXG4gICAgICAgIF9fbjogeTE4bi5fX24uYmluZCh5MThuKSxcbiAgICAgICAgc2V0TG9jYWxlOiB5MThuLnNldExvY2FsZS5iaW5kKHkxOG4pLFxuICAgICAgICBnZXRMb2NhbGU6IHkxOG4uZ2V0TG9jYWxlLmJpbmQoeTE4biksXG4gICAgICAgIHVwZGF0ZUxvY2FsZTogeTE4bi51cGRhdGVMb2NhbGUuYmluZCh5MThuKSxcbiAgICAgICAgbG9jYWxlOiB5MThuLmxvY2FsZVxuICAgIH07XG59XG4iLCJpbXBvcnQgeyByZWFkRmlsZVN5bmMsIHN0YXRTeW5jLCB3cml0ZUZpbGUgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBmczoge1xuICAgICAgICByZWFkRmlsZVN5bmMsXG4gICAgICAgIHdyaXRlRmlsZVxuICAgIH0sXG4gICAgZm9ybWF0LFxuICAgIHJlc29sdmUsXG4gICAgZXhpc3RzOiAoZmlsZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRTeW5jKGZpbGUpLmlzRmlsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCJpbXBvcnQgc2hpbSBmcm9tICcuL2J1aWxkL2xpYi9wbGF0Zm9ybS1zaGltcy9ub2RlLmpzJ1xuaW1wb3J0IHsgeTE4biBhcyBfeTE4biB9IGZyb20gJy4vYnVpbGQvbGliL2luZGV4LmpzJ1xuXG5jb25zdCB5MThuID0gKG9wdHMpID0+IHtcbiAgcmV0dXJuIF95MThuKG9wdHMsIHNoaW0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IHkxOG5cbiIsIi8qKlxuICogQGZpbGVvdmVydmlldyBNYWluIGVudHJ5cG9pbnQgZm9yIGxpYnJhcmllcyB1c2luZyB5YXJncy1wYXJzZXIgaW4gTm9kZS5qc1xuICogQ0pTIGFuZCBFU00gZW52aXJvbm1lbnRzLlxuICpcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG52YXIgX2EsIF9iLCBfYztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHsgbm9ybWFsaXplLCByZXNvbHZlIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjYW1lbENhc2UsIGRlY2FtZWxpemUsIGxvb2tzTGlrZU51bWJlciB9IGZyb20gJy4vc3RyaW5nLXV0aWxzLmpzJztcbmltcG9ydCB7IFlhcmdzUGFyc2VyIH0gZnJvbSAnLi95YXJncy1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJncy95YXJncy1wYXJzZXIjc3VwcG9ydGVkLW5vZGVqcy12ZXJzaW9ucyBmb3Igb3VyXG4vLyB2ZXJzaW9uIHN1cHBvcnQgcG9saWN5LiBUaGUgWUFSR1NfTUlOX05PREVfVkVSU0lPTiBpcyB1c2VkIGZvciB0ZXN0aW5nIG9ubHkuXG5jb25zdCBtaW5Ob2RlVmVyc2lvbiA9IChwcm9jZXNzICYmIHByb2Nlc3MuZW52ICYmIHByb2Nlc3MuZW52LllBUkdTX01JTl9OT0RFX1ZFUlNJT04pXG4gICAgPyBOdW1iZXIocHJvY2Vzcy5lbnYuWUFSR1NfTUlOX05PREVfVkVSU0lPTilcbiAgICA6IDEyO1xuY29uc3Qgbm9kZVZlcnNpb24gPSAoX2IgPSAoX2EgPSBwcm9jZXNzID09PSBudWxsIHx8IHByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2Nlc3MudmVyc2lvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ub2RlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAoX2MgPSBwcm9jZXNzID09PSBudWxsIHx8IHByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb2Nlc3MudmVyc2lvbikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnNsaWNlKDEpO1xuaWYgKG5vZGVWZXJzaW9uKSB7XG4gICAgY29uc3QgbWFqb3IgPSBOdW1iZXIobm9kZVZlcnNpb24ubWF0Y2goL14oW14uXSspLylbMV0pO1xuICAgIGlmIChtYWpvciA8IG1pbk5vZGVWZXJzaW9uKSB7XG4gICAgICAgIHRocm93IEVycm9yKGB5YXJncyBwYXJzZXIgc3VwcG9ydHMgYSBtaW5pbXVtIE5vZGUuanMgdmVyc2lvbiBvZiAke21pbk5vZGVWZXJzaW9ufS4gUmVhZCBvdXIgdmVyc2lvbiBzdXBwb3J0IHBvbGljeTogaHR0cHM6Ly9naXRodWIuY29tL3lhcmdzL3lhcmdzLXBhcnNlciNzdXBwb3J0ZWQtbm9kZWpzLXZlcnNpb25zYCk7XG4gICAgfVxufVxuLy8gQ3JlYXRlcyBhIHlhcmdzLXBhcnNlciBpbnN0YW5jZSB1c2luZyBOb2RlLmpzIHN0YW5kYXJkIGxpYnJhcmllczpcbmNvbnN0IGVudiA9IHByb2Nlc3MgPyBwcm9jZXNzLmVudiA6IHt9O1xuY29uc3QgcGFyc2VyID0gbmV3IFlhcmdzUGFyc2VyKHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkLFxuICAgIGVudjogKCkgPT4ge1xuICAgICAgICByZXR1cm4gZW52O1xuICAgIH0sXG4gICAgZm9ybWF0LFxuICAgIG5vcm1hbGl6ZSxcbiAgICByZXNvbHZlLFxuICAgIC8vIFRPRE86IGZpZ3VyZSAgb3V0IGEgIHdheSB0byBjb21iaW5lIEVTTSBhbmQgQ0pTIGNvdmVyYWdlLCBzdWNoICB0aGF0XG4gICAgLy8gd2UgY2FuIGV4ZXJjaXNlIGFsbCB0aGUgbGluZXMgYmVsb3c6XG4gICAgcmVxdWlyZTogKHBhdGgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGF0aC5tYXRjaCgvXFwuanNvbiQvKSkge1xuICAgICAgICAgICAgLy8gQWRkcmVzc2VzOiBodHRwczovL2dpdGh1Yi5jb20veWFyZ3MveWFyZ3MvaXNzdWVzLzIwNDBcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwYXRoLCAndXRmOCcpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdvbmx5IC5qc29uIGNvbmZpZyBmaWxlcyBhcmUgc3VwcG9ydGVkIGluIEVTTScpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5jb25zdCB5YXJnc1BhcnNlciA9IGZ1bmN0aW9uIFBhcnNlcihhcmdzLCBvcHRzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VyLnBhcnNlKGFyZ3Muc2xpY2UoKSwgb3B0cyk7XG4gICAgcmV0dXJuIHJlc3VsdC5hcmd2O1xufTtcbnlhcmdzUGFyc2VyLmRldGFpbGVkID0gZnVuY3Rpb24gKGFyZ3MsIG9wdHMpIHtcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGFyZ3Muc2xpY2UoKSwgb3B0cyk7XG59O1xueWFyZ3NQYXJzZXIuY2FtZWxDYXNlID0gY2FtZWxDYXNlO1xueWFyZ3NQYXJzZXIuZGVjYW1lbGl6ZSA9IGRlY2FtZWxpemU7XG55YXJnc1BhcnNlci5sb29rc0xpa2VOdW1iZXIgPSBsb29rc0xpa2VOdW1iZXI7XG5leHBvcnQgZGVmYXVsdCB5YXJnc1BhcnNlcjtcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNiwgQ29udHJpYnV0b3JzXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogSVNDXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbENhc2Uoc3RyKSB7XG4gICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGFzIGNhbWVsIGNhc2UsIGUuZy4sIGZvb0Jhci5cbiAgICAvLyBieSBlbnN1cmluZyB0aGF0IHRoZSBzdHJpbmcgaXNuJ3QgYWxyZWFkeSBtaXhlZCBjYXNlOlxuICAgIGNvbnN0IGlzQ2FtZWxDYXNlID0gc3RyICE9PSBzdHIudG9Mb3dlckNhc2UoKSAmJiBzdHIgIT09IHN0ci50b1VwcGVyQ2FzZSgpO1xuICAgIGlmICghaXNDYW1lbENhc2UpIHtcbiAgICAgICAgc3RyID0gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmIChzdHIuaW5kZXhPZignLScpID09PSAtMSAmJiBzdHIuaW5kZXhPZignXycpID09PSAtMSkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGNhbWVsY2FzZSA9ICcnO1xuICAgICAgICBsZXQgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGxlYWRpbmdIeXBoZW5zID0gc3RyLm1hdGNoKC9eLSsvKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxlYWRpbmdIeXBoZW5zID8gbGVhZGluZ0h5cGhlbnNbMF0ubGVuZ3RoIDogMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGNociA9IHN0ci5jaGFyQXQoaSk7XG4gICAgICAgICAgICBpZiAobmV4dENoclVwcGVyKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hyID0gY2hyLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaSAhPT0gMCAmJiAoY2hyID09PSAnLScgfHwgY2hyID09PSAnXycpKSB7XG4gICAgICAgICAgICAgICAgbmV4dENoclVwcGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNociAhPT0gJy0nICYmIGNociAhPT0gJ18nKSB7XG4gICAgICAgICAgICAgICAgY2FtZWxjYXNlICs9IGNocjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FtZWxjYXNlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNhbWVsaXplKHN0ciwgam9pblN0cmluZykge1xuICAgIGNvbnN0IGxvd2VyY2FzZSA9IHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIGpvaW5TdHJpbmcgPSBqb2luU3RyaW5nIHx8ICctJztcbiAgICBsZXQgbm90Q2FtZWxjYXNlID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hyTG93ZXIgPSBsb3dlcmNhc2UuY2hhckF0KGkpO1xuICAgICAgICBjb25zdCBjaHJTdHJpbmcgPSBzdHIuY2hhckF0KGkpO1xuICAgICAgICBpZiAoY2hyTG93ZXIgIT09IGNoclN0cmluZyAmJiBpID4gMCkge1xuICAgICAgICAgICAgbm90Q2FtZWxjYXNlICs9IGAke2pvaW5TdHJpbmd9JHtsb3dlcmNhc2UuY2hhckF0KGkpfWA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub3RDYW1lbGNhc2UgKz0gY2hyU3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub3RDYW1lbGNhc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gbG9va3NMaWtlTnVtYmVyKHgpIHtcbiAgICBpZiAoeCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBpZiBsb2FkZWQgZnJvbSBjb25maWcsIG1heSBhbHJlYWR5IGJlIGEgbnVtYmVyLlxuICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIGhleGFkZWNpbWFsLlxuICAgIGlmICgvXjB4WzAtOWEtZl0rJC9pLnRlc3QoeCkpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIGRvbid0IHRyZWF0IDAxMjMgYXMgYSBudW1iZXI7IGFzIGl0IGRyb3BzIHRoZSBsZWFkaW5nICcwJy5cbiAgICBpZiAoL14wW14uXS8udGVzdCh4KSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAvXlstXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKGVbLStdP1xcZCspPyQvLnRlc3QoeCk7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIENvbnRyaWJ1dG9yc1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQ1xuICovXG4vLyB0YWtlIGFuIHVuLXNwbGl0IGFyZ3Ygc3RyaW5nIGFuZCB0b2tlbml6ZSBpdC5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZUFyZ1N0cmluZyhhcmdTdHJpbmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdTdHJpbmcpKSB7XG4gICAgICAgIHJldHVybiBhcmdTdHJpbmcubWFwKGUgPT4gdHlwZW9mIGUgIT09ICdzdHJpbmcnID8gZSArICcnIDogZSk7XG4gICAgfVxuICAgIGFyZ1N0cmluZyA9IGFyZ1N0cmluZy50cmltKCk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBwcmV2QyA9IG51bGw7XG4gICAgbGV0IGMgPSBudWxsO1xuICAgIGxldCBvcGVuaW5nID0gbnVsbDtcbiAgICBjb25zdCBhcmdzID0gW107XG4gICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IGFyZ1N0cmluZy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgcHJldkMgPSBjO1xuICAgICAgICBjID0gYXJnU3RyaW5nLmNoYXJBdChpaSk7XG4gICAgICAgIC8vIHNwbGl0IG9uIHNwYWNlcyB1bmxlc3Mgd2UncmUgaW4gcXVvdGVzLlxuICAgICAgICBpZiAoYyA9PT0gJyAnICYmICFvcGVuaW5nKSB7XG4gICAgICAgICAgICBpZiAoIShwcmV2QyA9PT0gJyAnKSkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRvbid0IHNwbGl0IHRoZSBzdHJpbmcgaWYgd2UncmUgaW4gbWF0Y2hpbmdcbiAgICAgICAgLy8gb3BlbmluZyBvciBjbG9zaW5nIHNpbmdsZSBhbmQgZG91YmxlIHF1b3Rlcy5cbiAgICAgICAgaWYgKGMgPT09IG9wZW5pbmcpIHtcbiAgICAgICAgICAgIG9wZW5pbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjID09PSBcIidcIiB8fCBjID09PSAnXCInKSAmJiAhb3BlbmluZykge1xuICAgICAgICAgICAgb3BlbmluZyA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmdzW2ldKVxuICAgICAgICAgICAgYXJnc1tpXSA9ICcnO1xuICAgICAgICBhcmdzW2ldICs9IGM7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xuZXhwb3J0IHZhciBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleTtcbihmdW5jdGlvbiAoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkpIHtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIkJPT0xFQU5cIl0gPSBcImJvb2xlYW5cIjtcbiAgICBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleVtcIlNUUklOR1wiXSA9IFwic3RyaW5nXCI7XG4gICAgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXlbXCJOVU1CRVJcIl0gPSBcIm51bWJlclwiO1xuICAgIERlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5W1wiQVJSQVlcIl0gPSBcImFycmF5XCI7XG59KShEZWZhdWx0VmFsdWVzRm9yVHlwZUtleSB8fCAoRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgPSB7fSkpO1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2LCBDb250cmlidXRvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBJU0NcbiAqL1xuaW1wb3J0IHsgdG9rZW5pemVBcmdTdHJpbmcgfSBmcm9tICcuL3Rva2VuaXplLWFyZy1zdHJpbmcuanMnO1xuaW1wb3J0IHsgRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkgfSBmcm9tICcuL3lhcmdzLXBhcnNlci10eXBlcy5qcyc7XG5pbXBvcnQgeyBjYW1lbENhc2UsIGRlY2FtZWxpemUsIGxvb2tzTGlrZU51bWJlciB9IGZyb20gJy4vc3RyaW5nLXV0aWxzLmpzJztcbmxldCBtaXhpbjtcbmV4cG9ydCBjbGFzcyBZYXJnc1BhcnNlciB7XG4gICAgY29uc3RydWN0b3IoX21peGluKSB7XG4gICAgICAgIG1peGluID0gX21peGluO1xuICAgIH1cbiAgICBwYXJzZShhcmdzSW5wdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgYWxpYXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFycmF5OiB1bmRlZmluZWQsXG4gICAgICAgICAgICBib29sZWFuOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb25maWc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZ09iamVjdHM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGNvZXJjZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY291bnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVudlByZWZpeDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbmFyZzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbm9ybWFsaXplOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdHJpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG51bWJlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgX186IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGtleTogdW5kZWZpbmVkXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgICAvLyBhbGxvdyBhIHN0cmluZyBhcmd1bWVudCB0byBiZSBwYXNzZWQgaW4gcmF0aGVyXG4gICAgICAgIC8vIHRoYW4gYW4gYXJndiBhcnJheS5cbiAgICAgICAgY29uc3QgYXJncyA9IHRva2VuaXplQXJnU3RyaW5nKGFyZ3NJbnB1dCk7XG4gICAgICAgIC8vIHRva2VuaXplQXJnU3RyaW5nIGFkZHMgZXh0cmEgcXVvdGVzIHRvIGFyZ3MgaWYgYXJnc0lucHV0IGlzIGEgc3RyaW5nXG4gICAgICAgIC8vIG9ubHkgc3RyaXAgdGhvc2UgZXh0cmEgcXVvdGVzIGluIHByb2Nlc3NWYWx1ZSBpZiBhcmdzSW5wdXQgaXMgYSBzdHJpbmdcbiAgICAgICAgY29uc3QgaW5wdXRJc1N0cmluZyA9IHR5cGVvZiBhcmdzSW5wdXQgPT09ICdzdHJpbmcnO1xuICAgICAgICAvLyBhbGlhc2VzIG1pZ2h0IGhhdmUgdHJhbnNpdGl2ZSByZWxhdGlvbnNoaXBzLCBub3JtYWxpemUgdGhpcy5cbiAgICAgICAgY29uc3QgYWxpYXNlcyA9IGNvbWJpbmVBbGlhc2VzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5hbGlhcykpO1xuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICAnYm9vbGVhbi1uZWdhdGlvbic6IHRydWUsXG4gICAgICAgICAgICAnY2FtZWwtY2FzZS1leHBhbnNpb24nOiB0cnVlLFxuICAgICAgICAgICAgJ2NvbWJpbmUtYXJyYXlzJzogZmFsc2UsXG4gICAgICAgICAgICAnZG90LW5vdGF0aW9uJzogdHJ1ZSxcbiAgICAgICAgICAgICdkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5JzogdHJ1ZSxcbiAgICAgICAgICAgICdmbGF0dGVuLWR1cGxpY2F0ZS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2dyZWVkeS1hcnJheXMnOiB0cnVlLFxuICAgICAgICAgICAgJ2hhbHQtYXQtbm9uLW9wdGlvbic6IGZhbHNlLFxuICAgICAgICAgICAgJ25hcmdzLWVhdHMtb3B0aW9ucyc6IGZhbHNlLFxuICAgICAgICAgICAgJ25lZ2F0aW9uLXByZWZpeCc6ICduby0nLFxuICAgICAgICAgICAgJ3BhcnNlLW51bWJlcnMnOiB0cnVlLFxuICAgICAgICAgICAgJ3BhcnNlLXBvc2l0aW9uYWwtbnVtYmVycyc6IHRydWUsXG4gICAgICAgICAgICAncG9wdWxhdGUtLSc6IGZhbHNlLFxuICAgICAgICAgICAgJ3NldC1wbGFjZWhvbGRlci1rZXknOiBmYWxzZSxcbiAgICAgICAgICAgICdzaG9ydC1vcHRpb24tZ3JvdXBzJzogdHJ1ZSxcbiAgICAgICAgICAgICdzdHJpcC1hbGlhc2VkJzogZmFsc2UsXG4gICAgICAgICAgICAnc3RyaXAtZGFzaGVkJzogZmFsc2UsXG4gICAgICAgICAgICAndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnOiBmYWxzZVxuICAgICAgICB9LCBvcHRzLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgb3B0cy5kZWZhdWx0KTtcbiAgICAgICAgY29uc3QgY29uZmlnT2JqZWN0cyA9IG9wdHMuY29uZmlnT2JqZWN0cyB8fCBbXTtcbiAgICAgICAgY29uc3QgZW52UHJlZml4ID0gb3B0cy5lbnZQcmVmaXg7XG4gICAgICAgIGNvbnN0IG5vdEZsYWdzT3B0aW9uID0gY29uZmlndXJhdGlvblsncG9wdWxhdGUtLSddO1xuICAgICAgICBjb25zdCBub3RGbGFnc0FyZ3YgPSBub3RGbGFnc09wdGlvbiA/ICctLScgOiAnXyc7XG4gICAgICAgIGNvbnN0IG5ld0FsaWFzZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBjb25zdCBkZWZhdWx0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAvLyBhbGxvdyBhIGkxOG4gaGFuZGxlciB0byBiZSBwYXNzZWQgaW4sIGRlZmF1bHQgdG8gYSBmYWtlIG9uZSAodXRpbC5mb3JtYXQpLlxuICAgICAgICBjb25zdCBfXyA9IG9wdHMuX18gfHwgbWl4aW4uZm9ybWF0O1xuICAgICAgICBjb25zdCBmbGFncyA9IHtcbiAgICAgICAgICAgIGFsaWFzZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBhcnJheXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBib29sczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIHN0cmluZ3M6IE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgICAgICBudW1iZXJzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY291bnRzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgbm9ybWFsaXplOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29uZmlnczogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIG5hcmdzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAgY29lcmNpb25zOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICAgICAga2V5czogW11cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmVnYXRpdmUgPSAvXi0oWzAtOV0rKFxcLlswLTldKyk/fFxcLlswLTldKykkLztcbiAgICAgICAgY29uc3QgbmVnYXRlZEJvb2xlYW4gPSBuZXcgUmVnRXhwKCdeLS0nICsgY29uZmlndXJhdGlvblsnbmVnYXRpb24tcHJlZml4J10gKyAnKC4rKScpO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5hcnJheSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gdHlwZW9mIG9wdCA9PT0gJ29iamVjdCcgPyBvcHQua2V5IDogb3B0O1xuICAgICAgICAgICAgLy8gYXNzaWduIHRvIGZsYWdzW2Jvb2xzfHN0cmluZ3N8bnVtYmVyc11cbiAgICAgICAgICAgIGNvbnN0IGFzc2lnbm1lbnQgPSBPYmplY3Qua2V5cyhvcHQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXlGbGFnS2V5cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgYm9vbGVhbjogJ2Jvb2xzJyxcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nOiAnc3RyaW5ncycsXG4gICAgICAgICAgICAgICAgICAgIG51bWJlcjogJ251bWJlcnMnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlGbGFnS2V5c1trZXldO1xuICAgICAgICAgICAgfSkuZmlsdGVyKEJvb2xlYW4pLnBvcCgpO1xuICAgICAgICAgICAgLy8gYXNzaWduIGtleSB0byBiZSBjb2VyY2VkXG4gICAgICAgICAgICBpZiAoYXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgIGZsYWdzW2Fzc2lnbm1lbnRdW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmxhZ3MuYXJyYXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5ib29sZWFuIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5ib29sc1trZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIGZsYWdzLmtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgW10uY29uY2F0KG9wdHMuc3RyaW5nIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5zdHJpbmdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBbXS5jb25jYXQob3B0cy5udW1iZXIgfHwgW10pLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGZsYWdzLm51bWJlcnNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLmNvdW50IHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBmbGFncy5jb3VudHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtdLmNvbmNhdChvcHRzLm5vcm1hbGl6ZSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZmxhZ3Mubm9ybWFsaXplW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIG9wdHMubmFyZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMubmFyZykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MubmFyZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9wdHMuY29lcmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0cy5jb2VyY2UpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29lcmNpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3Mua2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmNvbmZpZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdHMuY29uZmlnKSB8fCB0eXBlb2Ygb3B0cy5jb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIFtdLmNvbmNhdChvcHRzLmNvbmZpZykuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBmbGFncy5jb25maWdzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdHMuY29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdHMuY29uZmlnKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuY29uZmlnc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjcmVhdGUgYSBsb29rdXAgdGFibGUgdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgYWxsXG4gICAgICAgIC8vIGNvbWJpbmF0aW9ucyBvZiBhbGlhc2VzOiB7ZjogWydmb28nXSwgZm9vOiBbJ2YnXX1cbiAgICAgICAgZXh0ZW5kQWxpYXNlcyhvcHRzLmtleSwgYWxpYXNlcywgb3B0cy5kZWZhdWx0LCBmbGFncy5hcnJheXMpO1xuICAgICAgICAvLyBhcHBseSBkZWZhdWx0IHZhbHVlcyB0byBhbGwgYWxpYXNlcy5cbiAgICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgKGZsYWdzLmFsaWFzZXNba2V5XSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoYWxpYXMpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c1thbGlhc10gPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgbGV0IG5vdEZsYWdzID0gW107XG4gICAgICAgIGNvbnN0IGFyZ3YgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksIHsgXzogW10gfSk7XG4gICAgICAgIC8vIFRPRE8oYmNvZSk6IGZvciB0aGUgZmlyc3QgcGFzcyBhdCByZW1vdmluZyBvYmplY3QgcHJvdG90eXBlICB3ZSBkaWRuJ3RcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBwcm90b3R5cGVzIGZyb20gb2JqZWN0cyByZXR1cm5lZCBieSB0aGlzIEFQSSwgd2UgbWlnaHQgd2FudFxuICAgICAgICAvLyB0byBncmFkdWFsbHkgbW92ZSB0b3dhcmRzIGRvaW5nIHNvLlxuICAgICAgICBjb25zdCBhcmd2UmV0dXJuID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHRydW5jYXRlZEFyZyA9IGFyZy5yZXBsYWNlKC9eLXszLH0vLCAnLS0tJyk7XG4gICAgICAgICAgICBsZXQgYnJva2VuO1xuICAgICAgICAgICAgbGV0IGtleTtcbiAgICAgICAgICAgIGxldCBsZXR0ZXJzO1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgIC8vIGFueSB1bmtub3duIG9wdGlvbiAoZXhjZXB0IGZvciBlbmQtb2Ytb3B0aW9ucywgXCItLVwiKVxuICAgICAgICAgICAgaWYgKGFyZyAhPT0gJy0tJyAmJiAvXi0vLnRlc3QoYXJnKSAmJiBpc1Vua25vd25PcHRpb25Bc0FyZyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgICAgICAvLyAtLS0sIC0tLT0sIC0tLS0sIGV0YyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRydW5jYXRlZEFyZy5tYXRjaCgvXi0tLSsoPXwkKS8pKSB7XG4gICAgICAgICAgICAgICAgLy8gb3B0aW9ucyB3aXRob3V0IGtleSBuYW1lIGFyZSBpbnZhbGlkLlxuICAgICAgICAgICAgICAgIHB1c2hQb3NpdGlvbmFsKGFyZyk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gLS0gc2VwYXJhdGVkIGJ5ID1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLis9LykgfHwgKCFjb25maWd1cmF0aW9uWydzaG9ydC1vcHRpb24tZ3JvdXBzJ10gJiYgYXJnLm1hdGNoKC9eLS4rPS8pKSkge1xuICAgICAgICAgICAgICAgIC8vIFVzaW5nIFtcXHNcXFNdIGluc3RlYWQgb2YgLiBiZWNhdXNlIGpzIGRvZXNuJ3Qgc3VwcG9ydCB0aGVcbiAgICAgICAgICAgICAgICAvLyAnZG90YWxsJyByZWdleCBtb2RpZmllci4gU2VlOlxuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEwNjgzMDgvMTMyMTZcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLS0/KFtePV0rKT0oW1xcc1xcU10qKSQvKTtcbiAgICAgICAgICAgICAgICAvLyBhcnJheXMgZm9ybWF0ID0gJy0tZj1hIGIgYydcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhtWzFdLCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwgbVsxXSwgYXJncywgbVsyXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKG1bMV0sIGZsYWdzLm5hcmdzKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hcmdzIGZvcm1hdCA9ICctLWY9bW9ua2V5IHdhc2hpbmcgY2F0J1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdE5hcmdzKGksIG1bMV0sIGFyZ3MsIG1bMl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKG1bMV0sIG1bMl0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKSAmJiBjb25maWd1cmF0aW9uWydib29sZWFuLW5lZ2F0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKG5lZ2F0ZWRCb29sZWFuKTtcbiAgICAgICAgICAgICAgICBpZiAobSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG0pICYmIG0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbVsxXTtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSA/IFtmYWxzZV0gOiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIC0tIHNlcGFyYXRlZCBieSBzcGFjZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0tLisvKSB8fCAoIWNvbmZpZ3VyYXRpb25bJ3Nob3J0LW9wdGlvbi1ncm91cHMnXSAmJiBhcmcubWF0Y2goL14tW14tXSsvKSkpIHtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLS0/KC4rKS8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBtWzFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy0tZm9vIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy0tZm9vIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRydXRoeSBldmVuIGlmOiBmbGFncy5uYXJnc1trZXldID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCFuZXh0Lm1hdGNoKC9eLS8pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5tYXRjaChuZWdhdGl2ZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoL14odHJ1ZXxmYWxzZSkkLy50ZXN0KG5leHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRvdC1ub3RhdGlvbiBmbGFnIHNlcGFyYXRlZCBieSAnPScuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2goL14tLlxcLi4rPS8pKSB7XG4gICAgICAgICAgICAgICAgbSA9IGFyZy5tYXRjaCgvXi0oW149XSspPShbXFxzXFxTXSopJC8pO1xuICAgICAgICAgICAgICAgIGlmIChtICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkobSkgJiYgbS5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgICAgICBzZXRBcmcobVsxXSwgbVsyXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRvdC1ub3RhdGlvbiBmbGFnIHNlcGFyYXRlZCBieSBzcGFjZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi0uXFwuLisvKSAmJiAhYXJnLm1hdGNoKG5lZ2F0aXZlKSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBtID0gYXJnLm1hdGNoKC9eLSguXFwuLispLyk7XG4gICAgICAgICAgICAgICAgaWYgKG0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheShtKSAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgIW5leHQubWF0Y2goL14tLykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5tYXRjaCgvXi1bXi1dKy8pICYmICFhcmcubWF0Y2gobmVnYXRpdmUpKSB7XG4gICAgICAgICAgICAgICAgbGV0dGVycyA9IGFyZy5zbGljZSgxLCAtMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgICAgIGJyb2tlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGV0dGVycy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYXJnLnNsaWNlKGogKyAyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnLnNsaWNlKGogKyAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGxldHRlcnNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGZvcm1hdCA9ICctZj1hIGIgYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0QXJyYXkoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy1mPW1vbmtleSB3YXNoaW5nIGNhdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBsZXR0ZXIgaXMgYW4gYWxwaGFiZXRpYyBjaGFyYWN0ZXIgYW5kIG5leHQgdmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9bQS1aYS16XS8udGVzdChsZXR0ZXJzW2pdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgL14tP1xcZCsoXFwuXFxkKik/KGUtP1xcZCspPyQvLnRlc3QobmV4dCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQWxsQWxpYXNlcyhuZXh0LCBmbGFncy5ib29scykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcobGV0dGVyc1tqXSwgbmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdLm1hdGNoKC9cXFcvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIG5leHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXJnKGxldHRlcnNbal0sIGRlZmF1bHRWYWx1ZShsZXR0ZXJzW2pdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga2V5ID0gYXJnLnNsaWNlKC0xKVswXTtcbiAgICAgICAgICAgICAgICBpZiAoIWJyb2tlbiAmJiBrZXkgIT09ICctJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZm9ybWF0ID0gJy1mIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVhdEFycmF5KGksIGtleSwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFyZ3MgZm9ybWF0ID0gJy1mIGEgYiBjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHRydXRoeSBldmVuIGlmOiBmbGFncy5uYXJnc1trZXldID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gZWF0TmFyZ3MoaSwga2V5LCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBhcmdzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSB1bmRlZmluZWQgJiYgKCEvXigtfC0tKVteLV0vLnRlc3QobmV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Lm1hdGNoKG5lZ2F0aXZlKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmNvdW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgvXih0cnVlfGZhbHNlKSQvLnRlc3QobmV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBcmcoa2V5LCBkZWZhdWx0VmFsdWUoa2V5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmcubWF0Y2goL14tWzAtOV0kLykgJiZcbiAgICAgICAgICAgICAgICBhcmcubWF0Y2gobmVnYXRpdmUpICYmXG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGFyZy5zbGljZSgxKSwgZmxhZ3MuYm9vbHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gc2luZ2xlLWRpZ2l0IGJvb2xlYW4gYWxpYXMsIGUuZzogeGFyZ3MgLTBcbiAgICAgICAgICAgICAgICBrZXkgPSBhcmcuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgZGVmYXVsdFZhbHVlKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICAgICAgICAgICAgbm90RmxhZ3MgPSBhcmdzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmZpZ3VyYXRpb25bJ2hhbHQtYXQtbm9uLW9wdGlvbiddKSB7XG4gICAgICAgICAgICAgICAgbm90RmxhZ3MgPSBhcmdzLnNsaWNlKGkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHVzaFBvc2l0aW9uYWwoYXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBvcmRlciBvZiBwcmVjZWRlbmNlOlxuICAgICAgICAvLyAxLiBjb21tYW5kIGxpbmUgYXJnXG4gICAgICAgIC8vIDIuIHZhbHVlIGZyb20gZW52IHZhclxuICAgICAgICAvLyAzLiB2YWx1ZSBmcm9tIGNvbmZpZyBmaWxlXG4gICAgICAgIC8vIDQuIHZhbHVlIGZyb20gY29uZmlnIG9iamVjdHNcbiAgICAgICAgLy8gNS4gY29uZmlndXJlZCBkZWZhdWx0IHZhbHVlXG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCB0cnVlKTsgLy8gc3BlY2lhbCBjYXNlOiBjaGVjayBlbnYgdmFycyB0aGF0IHBvaW50IHRvIGNvbmZpZyBmaWxlXG4gICAgICAgIGFwcGx5RW52VmFycyhhcmd2LCBmYWxzZSk7XG4gICAgICAgIHNldENvbmZpZyhhcmd2KTtcbiAgICAgICAgc2V0Q29uZmlnT2JqZWN0cygpO1xuICAgICAgICBhcHBseURlZmF1bHRzQW5kQWxpYXNlcyhhcmd2LCBmbGFncy5hbGlhc2VzLCBkZWZhdWx0cywgdHJ1ZSk7XG4gICAgICAgIGFwcGx5Q29lcmNpb25zKGFyZ3YpO1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvblsnc2V0LXBsYWNlaG9sZGVyLWtleSddKVxuICAgICAgICAgICAgc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpO1xuICAgICAgICAvLyBmb3IgYW55IGNvdW50cyBlaXRoZXIgbm90IGluIGFyZ3Mgb3Igd2l0aG91dCBhbiBleHBsaWNpdCBkZWZhdWx0LCBzZXQgdG8gMFxuICAgICAgICBPYmplY3Qua2V5cyhmbGFncy5jb3VudHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwga2V5LnNwbGl0KCcuJykpKVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gJy0tJyBkZWZhdWx0cyB0byB1bmRlZmluZWQuXG4gICAgICAgIGlmIChub3RGbGFnc09wdGlvbiAmJiBub3RGbGFncy5sZW5ndGgpXG4gICAgICAgICAgICBhcmd2W25vdEZsYWdzQXJndl0gPSBbXTtcbiAgICAgICAgbm90RmxhZ3MuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBhcmd2W25vdEZsYWdzQXJndl0ucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10gJiYgY29uZmlndXJhdGlvblsnc3RyaXAtZGFzaGVkJ10pIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3YpLmZpbHRlcihrZXkgPT4ga2V5ICE9PSAnLS0nICYmIGtleS5pbmNsdWRlcygnLScpKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3Zba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uWydzdHJpcC1hbGlhc2VkJ10pIHtcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIFtdLmNvbmNhdCguLi5PYmplY3Qua2V5cyhhbGlhc2VzKS5tYXAoayA9PiBhbGlhc2VzW2tdKSkuZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10gJiYgYWxpYXMuaW5jbHVkZXMoJy0nKSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgYXJndlthbGlhcy5zcGxpdCgnLicpLm1hcChwcm9wID0+IGNhbWVsQ2FzZShwcm9wKSkuam9pbignLicpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGFyZ3ZbYWxpYXNdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHVzaCBhcmd1bWVudCBpbnRvIHBvc2l0aW9uYWwgYXJyYXksIGFwcGx5aW5nIG51bWVyaWMgY29lcmNpb246XG4gICAgICAgIGZ1bmN0aW9uIHB1c2hQb3NpdGlvbmFsKGFyZykge1xuICAgICAgICAgICAgY29uc3QgbWF5YmVDb2VyY2VkTnVtYmVyID0gbWF5YmVDb2VyY2VOdW1iZXIoJ18nLCBhcmcpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXliZUNvZXJjZWROdW1iZXIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgYXJndi5fLnB1c2gobWF5YmVDb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBob3cgbWFueSBhcmd1bWVudHMgc2hvdWxkIHdlIGNvbnN1bWUsIGJhc2VkXG4gICAgICAgIC8vIG9uIHRoZSBuYXJncyBvcHRpb24/XG4gICAgICAgIGZ1bmN0aW9uIGVhdE5hcmdzKGksIGtleSwgYXJncywgYXJnQWZ0ZXJFcXVhbFNpZ24pIHtcbiAgICAgICAgICAgIGxldCBpaTtcbiAgICAgICAgICAgIGxldCB0b0VhdCA9IGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKTtcbiAgICAgICAgICAgIC8vIE5hTiBoYXMgYSBzcGVjaWFsIG1lYW5pbmcgZm9yIHRoZSBhcnJheSB0eXBlLCBpbmRpY2F0aW5nIHRoYXQgb25lIG9yXG4gICAgICAgICAgICAvLyBtb3JlIHZhbHVlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICAgICAgICB0b0VhdCA9IHR5cGVvZiB0b0VhdCAhPT0gJ251bWJlcicgfHwgaXNOYU4odG9FYXQpID8gMSA6IHRvRWF0O1xuICAgICAgICAgICAgaWYgKHRvRWF0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnQXJndW1lbnQgdW5leHBlY3RlZCBmb3I6ICVzJywga2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldEFyZyhrZXksIGRlZmF1bHRWYWx1ZShrZXkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhdmFpbGFibGUgPSBpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgPyAwIDogMTtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uWyduYXJncy1lYXRzLW9wdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgIC8vIGNsYXNzaWMgYmVoYXZpb3IsIHlhcmdzIGVhdHMgcG9zaXRpb25hbCBhbmQgZGFzaCBhcmd1bWVudHMuXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIC0gKGkgKyAxKSArIGF2YWlsYWJsZSA8IHRvRWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlID0gdG9FYXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBuYXJncyB3aWxsIG5vdCBjb25zdW1lIGZsYWcgYXJndW1lbnRzLCBlLmcuLCAtYWJjLCAtLWZvbyxcbiAgICAgICAgICAgICAgICAvLyBhbmQgdGVybWluYXRlcyB3aGVuIG9uZSBpcyBvYnNlcnZlZC5cbiAgICAgICAgICAgICAgICBmb3IgKGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmdzW2lpXS5tYXRjaCgvXi1bXjAtOV0vKSB8fCBhcmdzW2lpXS5tYXRjaChuZWdhdGl2ZSkgfHwgaXNVbmtub3duT3B0aW9uQXNBcmcoYXJnc1tpaV0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlKys7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlIDwgdG9FYXQpXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ05vdCBlbm91Z2ggYXJndW1lbnRzIGZvbGxvd2luZzogJXMnLCBrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb25zdW1lZCA9IE1hdGgubWluKGF2YWlsYWJsZSwgdG9FYXQpO1xuICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChhcmdBZnRlckVxdWFsU2lnbikgJiYgY29uc3VtZWQgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnQWZ0ZXJFcXVhbFNpZ24pO1xuICAgICAgICAgICAgICAgIGNvbnN1bWVkLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGlpID0gaSArIDE7IGlpIDwgKGNvbnN1bWVkICsgaSArIDEpOyBpaSsrKSB7XG4gICAgICAgICAgICAgICAgc2V0QXJnKGtleSwgYXJnc1tpaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChpICsgY29uc3VtZWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFuIG9wdGlvbiBpcyBhbiBhcnJheSwgZWF0IGFsbCBub24taHlwaGVuYXRlZCBhcmd1bWVudHNcbiAgICAgICAgLy8gZm9sbG93aW5nIGl0Li4uIFlVTSFcbiAgICAgICAgLy8gZS5nLiwgLS1mb28gYXBwbGUgYmFuYW5hIGNhdCBiZWNvbWVzIFtcImFwcGxlXCIsIFwiYmFuYW5hXCIsIFwiY2F0XCJdXG4gICAgICAgIGZ1bmN0aW9uIGVhdEFycmF5KGksIGtleSwgYXJncywgYXJnQWZ0ZXJFcXVhbFNpZ24pIHtcbiAgICAgICAgICAgIGxldCBhcmdzVG9TZXQgPSBbXTtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gYXJnQWZ0ZXJFcXVhbFNpZ24gfHwgYXJnc1tpICsgMV07XG4gICAgICAgICAgICAvLyBJZiBib3RoIGFycmF5IGFuZCBuYXJncyBhcmUgY29uZmlndXJlZCwgZW5mb3JjZSB0aGUgbmFyZ3MgY291bnQ6XG4gICAgICAgICAgICBjb25zdCBuYXJnc0NvdW50ID0gY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MubmFyZ3MpO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLmJvb2xzKSAmJiAhKC9eKHRydWV8ZmFsc2UpJC8udGVzdChuZXh0KSkpIHtcbiAgICAgICAgICAgICAgICBhcmdzVG9TZXQucHVzaCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzVW5kZWZpbmVkKG5leHQpIHx8XG4gICAgICAgICAgICAgICAgKGlzVW5kZWZpbmVkKGFyZ0FmdGVyRXF1YWxTaWduKSAmJiAvXi0vLnRlc3QobmV4dCkgJiYgIW5lZ2F0aXZlLnRlc3QobmV4dCkgJiYgIWlzVW5rbm93bk9wdGlvbkFzQXJnKG5leHQpKSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBrZXlzIHdpdGhvdXQgdmFsdWUgPT0+IGFyZ3NUb1NldCByZW1haW5zIGFuIGVtcHR5IFtdXG4gICAgICAgICAgICAgICAgLy8gc2V0IHVzZXIgZGVmYXVsdCB2YWx1ZSwgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZWYWwgPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgICAgICAgICBhcmdzVG9TZXQgPSBBcnJheS5pc0FycmF5KGRlZlZhbCkgPyBkZWZWYWwgOiBbZGVmVmFsXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpbiAtLW9wdGlvbj12YWx1ZSBpcyBlYXRlbiBhcyBpc1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQoYXJnQWZ0ZXJFcXVhbFNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIGFyZ0FmdGVyRXF1YWxTaWduLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gaSArIDE7IGlpIDwgYXJncy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCghY29uZmlndXJhdGlvblsnZ3JlZWR5LWFycmF5cyddICYmIGFyZ3NUb1NldC5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKG5hcmdzQ291bnQgJiYgdHlwZW9mIG5hcmdzQ291bnQgPT09ICdudW1iZXInICYmIGFyZ3NUb1NldC5sZW5ndGggPj0gbmFyZ3NDb3VudCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGFyZ3NbaWldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoL14tLy50ZXN0KG5leHQpICYmICFuZWdhdGl2ZS50ZXN0KG5leHQpICYmICFpc1Vua25vd25PcHRpb25Bc0FyZyhuZXh0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpID0gaWk7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NUb1NldC5wdXNoKHByb2Nlc3NWYWx1ZShrZXksIG5leHQsIGlucHV0SXNTdHJpbmcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBib3RoIGFycmF5IGFuZCBuYXJncyBhcmUgY29uZmlndXJlZCwgY3JlYXRlIGFuIGVycm9yIGlmIGxlc3MgdGhhblxuICAgICAgICAgICAgLy8gbmFyZ3MgcG9zaXRpb25hbHMgd2VyZSBmb3VuZC4gTmFOIGhhcyBzcGVjaWFsIG1lYW5pbmcsIGluZGljYXRpbmdcbiAgICAgICAgICAgIC8vIHRoYXQgYXQgbGVhc3Qgb25lIHZhbHVlIGlzIHJlcXVpcmVkIChtb3JlIGFyZSBva2F5KS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFyZ3NDb3VudCA9PT0gJ251bWJlcicgJiYgKChuYXJnc0NvdW50ICYmIGFyZ3NUb1NldC5sZW5ndGggPCBuYXJnc0NvdW50KSB8fFxuICAgICAgICAgICAgICAgIChpc05hTihuYXJnc0NvdW50KSAmJiBhcmdzVG9TZXQubGVuZ3RoID09PSAwKSkpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyBmb2xsb3dpbmc6ICVzJywga2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRBcmcoa2V5LCBhcmdzVG9TZXQpO1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0QXJnKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3RlcyA9IGlucHV0SXNTdHJpbmcpIHtcbiAgICAgICAgICAgIGlmICgvLS8udGVzdChrZXkpICYmIGNvbmZpZ3VyYXRpb25bJ2NhbWVsLWNhc2UtZXhwYW5zaW9uJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGlhcyA9IGtleS5zcGxpdCgnLicpLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FtZWxDYXNlKHByb3ApO1xuICAgICAgICAgICAgICAgIH0pLmpvaW4oJy4nKTtcbiAgICAgICAgICAgICAgICBhZGROZXdBbGlhcyhrZXksIGFsaWFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcHJvY2Vzc1ZhbHVlKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3Rlcyk7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEtleSA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgc2V0S2V5KGFyZ3YsIHNwbGl0S2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAvLyBoYW5kbGUgcG9wdWxhdGluZyBhbGlhc2VzIG9mIHRoZSBmdWxsIGtleVxuICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBoYW5kbGUgcG9wdWxhdGluZyBhbGlhc2VzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBkb3Qtbm90YXRpb24ga2V5XG4gICAgICAgICAgICBpZiAoc3BsaXRLZXkubGVuZ3RoID4gMSAmJiBjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSkge1xuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICAoZmxhZ3MuYWxpYXNlc1tzcGxpdEtleVswXV0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleVByb3BlcnRpZXMgPSB4LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cGFuZCBhbGlhcyB3aXRoIG5lc3RlZCBvYmplY3RzIGluIGtleVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0gW10uY29uY2F0KHNwbGl0S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgYS5zaGlmdCgpOyAvLyBudWtlIHRoZSBvbGQga2V5LlxuICAgICAgICAgICAgICAgICAgICBrZXlQcm9wZXJ0aWVzID0ga2V5UHJvcGVydGllcy5jb25jYXQoYSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHBvcHVsYXRlIGFsaWFzIG9ubHkgaWYgaXMgbm90IGFscmVhZHkgYW4gYWxpYXMgb2YgdGhlIGZ1bGwga2V5XG4gICAgICAgICAgICAgICAgICAgIC8vIChhbHJlYWR5IHBvcHVsYXRlZCBhYm92ZSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKS5pbmNsdWRlcyhrZXlQcm9wZXJ0aWVzLmpvaW4oJy4nKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEtleShhcmd2LCBrZXlQcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCBub3JtYWxpemUgZ2V0dGVyIGFuZCBzZXR0ZXIgd2hlbiBrZXkgaXMgaW4gJ25vcm1hbGl6ZScgYnV0IGlzbid0IGFuIGFycmF5XG4gICAgICAgICAgICBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3Mubm9ybWFsaXplKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBba2V5XS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdKTtcbiAgICAgICAgICAgICAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXJndlJldHVybiwga2V5LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IG1peGluLm5vcm1hbGl6ZSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYWRkTmV3QWxpYXMoa2V5LCBhbGlhcykge1xuICAgICAgICAgICAgaWYgKCEoZmxhZ3MuYWxpYXNlc1trZXldICYmIGZsYWdzLmFsaWFzZXNba2V5XS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldID0gW2FsaWFzXTtcbiAgICAgICAgICAgICAgICBuZXdBbGlhc2VzW2FsaWFzXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIShmbGFncy5hbGlhc2VzW2FsaWFzXSAmJiBmbGFncy5hbGlhc2VzW2FsaWFzXS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgYWRkTmV3QWxpYXMoYWxpYXMsIGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc1ZhbHVlKGtleSwgdmFsLCBzaG91bGRTdHJpcFF1b3Rlcykge1xuICAgICAgICAgICAgLy8gc3RyaW5ncyBtYXkgYmUgcXVvdGVkLCBjbGVhbiB0aGlzIHVwIGFzIHdlIGFzc2lnbiB2YWx1ZXMuXG4gICAgICAgICAgICBpZiAoc2hvdWxkU3RyaXBRdW90ZXMpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSBzdHJpcFF1b3Rlcyh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaGFuZGxlIHBhcnNpbmcgYm9vbGVhbiBhcmd1bWVudHMgLS1mb289dHJ1ZSAtLWJhciBmYWxzZS5cbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgfHwgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsID09PSAndHJ1ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbClcbiAgICAgICAgICAgICAgICA/IHZhbC5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdik7IH0pXG4gICAgICAgICAgICAgICAgOiBtYXliZUNvZXJjZU51bWJlcihrZXksIHZhbCk7XG4gICAgICAgICAgICAvLyBpbmNyZW1lbnQgYSBjb3VudCBnaXZlbiBhcyBhcmcgKGVpdGhlciBubyB2YWx1ZSBvciB2YWx1ZSBwYXJzZWQgYXMgYm9vbGVhbilcbiAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpICYmIChpc1VuZGVmaW5lZCh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBpbmNyZW1lbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNldCBub3JtYWxpemVkIHZhbHVlIHdoZW4ga2V5IGlzIGluICdub3JtYWxpemUnIGFuZCBpbiAnYXJyYXlzJ1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5vcm1hbGl6ZSkgJiYgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsLm1hcCgodmFsKSA9PiB7IHJldHVybiBtaXhpbi5ub3JtYWxpemUodmFsKTsgfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1peGluLm5vcm1hbGl6ZSh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1heWJlQ29lcmNlTnVtYmVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsncGFyc2UtcG9zaXRpb25hbC1udW1iZXJzJ10gJiYga2V5ID09PSAnXycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5zdHJpbmdzKSAmJiAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZENvZXJjZU51bWJlciA9IGxvb2tzTGlrZU51bWJlcih2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsncGFyc2UtbnVtYmVycyddICYmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihNYXRoLmZsb29yKHBhcnNlRmxvYXQoYCR7dmFsdWV9YCkpKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENvZXJjZU51bWJlciB8fCAoIWlzVW5kZWZpbmVkKHZhbHVlKSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgYXJncyBmcm9tIGNvbmZpZy5qc29uIGZpbGUsIHRoaXMgc2hvdWxkIGJlXG4gICAgICAgIC8vIGFwcGxpZWQgbGFzdCBzbyB0aGF0IGRlZmF1bHRzIGNhbiBiZSBhcHBsaWVkLlxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWcoYXJndikge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIC8vIGV4cGFuZCBkZWZhdWx0cy9hbGlhc2VzLCBpbi1jYXNlIGFueSBoYXBwZW4gdG8gcmVmZXJlbmNlXG4gICAgICAgICAgICAvLyB0aGUgY29uZmlnLmpzb24gZmlsZS5cbiAgICAgICAgICAgIGFwcGx5RGVmYXVsdHNBbmRBbGlhc2VzKGNvbmZpZ0xvb2t1cCwgZmxhZ3MuYWxpYXNlcywgZGVmYXVsdHMpO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZmxhZ3MuY29uZmlncykuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnS2V5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnUGF0aCA9IGFyZ3ZbY29uZmlnS2V5XSB8fCBjb25maWdMb29rdXBbY29uZmlnS2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbmZpZ1BhdGggPSBtaXhpbi5yZXNvbHZlKG1peGluLmN3ZCgpLCBjb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVDb25maWcgPSBmbGFncy5jb25maWdzW2NvbmZpZ0tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgPSByZXNvbHZlQ29uZmlnKHJlc29sdmVkQ29uZmlnUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1peGluLnJlcXVpcmUocmVzb2x2ZWRDb25maWdQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdChjb25maWcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVubyB3aWxsIHJlY2VpdmUgYSBQZXJtaXNzaW9uRGVuaWVkIGVycm9yIGlmIGFuIGF0dGVtcHQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hZGUgdG8gbG9hZCBjb25maWcgd2l0aG91dCB0aGUgLS1hbGxvdy1yZWFkIGZsYWc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXgubmFtZSA9PT0gJ1Blcm1pc3Npb25EZW5pZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmd2W2NvbmZpZ0tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBFcnJvcihfXygnSW52YWxpZCBKU09OIGNvbmZpZyBmaWxlOiAlcycsIGNvbmZpZ1BhdGgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBhcmdzIGZyb20gY29uZmlnIG9iamVjdC5cbiAgICAgICAgLy8gaXQgcmVjdXJzaXZlbHkgY2hlY2tzIG5lc3RlZCBvYmplY3RzLlxuICAgICAgICBmdW5jdGlvbiBzZXRDb25maWdPYmplY3QoY29uZmlnLCBwcmV2KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW2tleV07XG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbEtleSA9IHByZXYgPyBwcmV2ICsgJy4nICsga2V5IDoga2V5O1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbm5lciBvYmplY3QgYW5kIHdlIGhhdmUgZG90LW5vdGF0aW9uXG4gICAgICAgICAgICAgICAgLy8gZW5hYmxlZCwgdHJlYXQgaW5uZXIgb2JqZWN0cyBpbiBjb25maWcgdGhlIHNhbWUgYXNcbiAgICAgICAgICAgICAgICAvLyBoZWF2aWx5IG5lc3RlZCBkb3Qgbm90YXRpb25zIChmb28uYmFyLmFwcGxlKS5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCBidXQgbm90IGFuIGFycmF5LCBjaGVjayBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIHNldENvbmZpZ09iamVjdCh2YWx1ZSwgZnVsbEtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXR0aW5nIGFyZ3VtZW50cyB2aWEgQ0xJIHRha2VzIHByZWNlZGVuY2Ugb3ZlclxuICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgd2l0aGluIHRoZSBjb25maWcgZmlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkoYXJndiwgZnVsbEtleS5zcGxpdCgnLicpKSB8fCAoY2hlY2tBbGxBbGlhc2VzKGZ1bGxLZXksIGZsYWdzLmFycmF5cykgJiYgY29uZmlndXJhdGlvblsnY29tYmluZS1hcnJheXMnXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhmdWxsS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzZXQgYWxsIGNvbmZpZyBvYmplY3RzIHBhc3NlZCBpbiBvcHRzXG4gICAgICAgIGZ1bmN0aW9uIHNldENvbmZpZ09iamVjdHMoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZ09iamVjdHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnT2JqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChjb25maWdPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0Q29uZmlnT2JqZWN0KGNvbmZpZ09iamVjdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlFbnZWYXJzKGFyZ3YsIGNvbmZpZ09ubHkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZW52UHJlZml4ID09PSAndW5kZWZpbmVkJylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSB0eXBlb2YgZW52UHJlZml4ID09PSAnc3RyaW5nJyA/IGVudlByZWZpeCA6ICcnO1xuICAgICAgICAgICAgY29uc3QgZW52ID0gbWl4aW4uZW52KCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhlbnYpLmZvckVhY2goZnVuY3Rpb24gKGVudlZhcikge1xuICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT09ICcnIHx8IGVudlZhci5sYXN0SW5kZXhPZihwcmVmaXgsIDApID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdldCBhcnJheSBvZiBuZXN0ZWQga2V5cyBhbmQgY29udmVydCB0aGVtIHRvIGNhbWVsIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IGVudlZhci5zcGxpdCgnX18nKS5tYXAoZnVuY3Rpb24gKGtleSwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZShrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCgoY29uZmlnT25seSAmJiBmbGFncy5jb25maWdzW2tleXMuam9pbignLicpXSkgfHwgIWNvbmZpZ09ubHkpICYmICFoYXNLZXkoYXJndiwga2V5cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFyZyhrZXlzLmpvaW4oJy4nKSwgZW52W2VudlZhcl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlDb2VyY2lvbnMoYXJndikge1xuICAgICAgICAgICAgbGV0IGNvZXJjZTtcbiAgICAgICAgICAgIGNvbnN0IGFwcGxpZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcmd2KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFwcGxpZWQuaGFzKGtleSkpIHsgLy8gSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGNvZXJjZWQgdGhpcyBvcHRpb24gdmlhIG9uZSBvZiBpdHMgYWxpYXNlc1xuICAgICAgICAgICAgICAgICAgICBjb2VyY2UgPSBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb2VyY2lvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvZXJjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1heWJlQ29lcmNlTnVtYmVyKGtleSwgY29lcmNlKGFyZ3Zba2V5XSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpKS5mb3JFYWNoKGFsaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQuYWRkKGFsaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbYWxpXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0UGxhY2Vob2xkZXJLZXlzKGFyZ3YpIHtcbiAgICAgICAgICAgIGZsYWdzLmtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2V0IHBsYWNlaG9sZGVyIGtleXMgZm9yIGRvdCBub3RhdGlvbiBvcHRpb25zICdmb28uYmFyJy5cbiAgICAgICAgICAgICAgICBpZiAofmtleS5pbmRleE9mKCcuJykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3Zba2V5XSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgICAgIGFyZ3Zba2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGFyZ3Y7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYXBwbHlEZWZhdWx0c0FuZEFsaWFzZXMob2JqLCBhbGlhc2VzLCBkZWZhdWx0cywgY2FuTG9nID0gZmFsc2UpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleShvYmosIGtleS5zcGxpdCgnLicpKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRLZXkob2JqLCBrZXkuc3BsaXQoJy4nKSwgZGVmYXVsdHNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5Mb2cpXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ZWRba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIChhbGlhc2VzW2tleV0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNLZXkob2JqLCB4LnNwbGl0KCcuJykpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEtleShvYmosIHguc3BsaXQoJy4nKSwgZGVmYXVsdHNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0tleShvYmosIGtleXMpIHtcbiAgICAgICAgICAgIGxldCBvID0gb2JqO1xuICAgICAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uWydkb3Qtbm90YXRpb24nXSlcbiAgICAgICAgICAgICAgICBrZXlzID0gW2tleXMuam9pbignLicpXTtcbiAgICAgICAgICAgIGtleXMuc2xpY2UoMCwgLTEpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIG8gPSAob1trZXldIHx8IHt9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleSBpbiBvO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNldEtleShvYmosIGtleXMsIHZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgbyA9IG9iajtcbiAgICAgICAgICAgIGlmICghY29uZmlndXJhdGlvblsnZG90LW5vdGF0aW9uJ10pXG4gICAgICAgICAgICAgICAga2V5cyA9IFtrZXlzLmpvaW4oJy4nKV07XG4gICAgICAgICAgICBrZXlzLnNsaWNlKDAsIC0xKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPKGJjb2UpOiBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIHlhcmdzLCBzd2l0Y2ggdG9cbiAgICAgICAgICAgICAgICAvLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG4gICAgICAgICAgICAgICAga2V5ID0gc2FuaXRpemVLZXkoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG8gPT09ICdvYmplY3QnICYmIG9ba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IG9ba2V5XSBpcyBhbiBhcnJheSwgYW5kIHRoYXQgdGhlIGxhc3QgaXRlbSBpcyBhbiBlbXB0eSBvYmplY3QuXG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9ba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XS5wdXNoKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHt9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHVwZGF0ZSB0aGUgZW1wdHkgb2JqZWN0IGF0IHRoZSBlbmQgb2YgdGhlIG9ba2V5XSBhcnJheSwgc28gc2V0IG8gdG8gdGhhdCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgbyA9IG9ba2V5XVtvW2tleV0ubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvID0gb1trZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gVE9ETyhiY29lKTogaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiB5YXJncywgc3dpdGNoIHRvXG4gICAgICAgICAgICAvLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzYW5pdGl6ZUtleShrZXlzW2tleXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgY29uc3QgaXNUeXBlQXJyYXkgPSBjaGVja0FsbEFsaWFzZXMoa2V5cy5qb2luKCcuJyksIGZsYWdzLmFycmF5cyk7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIGxldCBkdXBsaWNhdGUgPSBjb25maWd1cmF0aW9uWydkdXBsaWNhdGUtYXJndW1lbnRzLWFycmF5J107XG4gICAgICAgICAgICAvLyBuYXJncyBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gZHVwbGljYXRlXG4gICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSAmJiBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5uYXJncykpIHtcbiAgICAgICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICgoIWlzVW5kZWZpbmVkKG9ba2V5XSkgJiYgZmxhZ3MubmFyZ3Nba2V5XSA9PT0gMSkgfHwgKEFycmF5LmlzQXJyYXkob1trZXldKSAmJiBvW2tleV0ubGVuZ3RoID09PSBmbGFncy5uYXJnc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBpbmNyZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IGluY3JlbWVudChvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSAmJiBpc1R5cGVBcnJheSAmJiBpc1ZhbHVlQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gY29uZmlndXJhdGlvblsnZmxhdHRlbi1kdXBsaWNhdGUtYXJyYXlzJ10gPyBvW2tleV0uY29uY2F0KHZhbHVlKSA6IChBcnJheS5pc0FycmF5KG9ba2V5XVswXSkgPyBvW2tleV0gOiBbb1trZXldXSkuY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZHVwbGljYXRlICYmIEJvb2xlYW4oaXNUeXBlQXJyYXkpID09PSBCb29sZWFuKGlzVmFsdWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvW2tleV0gPSBvW2tleV0uY29uY2F0KFt2YWx1ZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9ba2V5XSA9PT0gdW5kZWZpbmVkICYmIGlzVHlwZUFycmF5KSB7XG4gICAgICAgICAgICAgICAgb1trZXldID0gaXNWYWx1ZUFycmF5ID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHVwbGljYXRlICYmICEob1trZXldID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICBjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5jb3VudHMpIHx8XG4gICAgICAgICAgICAgICAgY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKSkge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IFtvW2tleV0sIHZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGV4dGVuZCB0aGUgYWxpYXNlcyBsaXN0IHdpdGggaW5mZXJyZWQgYWxpYXNlcy5cbiAgICAgICAgZnVuY3Rpb24gZXh0ZW5kQWxpYXNlcyguLi5hcmdzKSB7XG4gICAgICAgICAgICBhcmdzLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9iaiB8fCB7fSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNob3J0LWNpcmN1aXQgaWYgd2UndmUgYWxyZWFkeSBhZGRlZCBhIGtleVxuICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgYWxpYXNlcyBhcnJheSwgZm9yIGV4YW1wbGUgaXQgbWlnaHRcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3QgaW4gYm90aCAnb3B0cy5kZWZhdWx0JyBhbmQgJ29wdHMua2V5Jy5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzLmFsaWFzZXNba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldID0gW10uY29uY2F0KGFsaWFzZXNba2V5XSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBcIi0tb3B0aW9uLW5hbWVcIiwgYWxzbyBzZXQgYXJndi5vcHRpb25OYW1lXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5jb25jYXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoLy0vLnRlc3QoeCkgJiYgY29uZmlndXJhdGlvblsnY2FtZWwtY2FzZS1leHBhbnNpb24nXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBjYW1lbENhc2UoeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT09IGtleSAmJiBmbGFncy5hbGlhc2VzW2tleV0uaW5kZXhPZihjKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FsaWFzZXNbY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBcIi0tb3B0aW9uTmFtZVwiLCBhbHNvIHNldCBhcmd2WydvcHRpb24tbmFtZSddXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNba2V5XS5jb25jYXQoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5sZW5ndGggPiAxICYmIC9bQS1aXS8udGVzdCh4KSAmJiBjb25maWd1cmF0aW9uWydjYW1lbC1jYXNlLWV4cGFuc2lvbiddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGRlY2FtZWxpemUoeCwgJy0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPT0ga2V5ICYmIGZsYWdzLmFsaWFzZXNba2V5XS5pbmRleE9mKGMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5hbGlhc2VzW2tleV0ucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWxpYXNlc1tjXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYWxpYXNlc1trZXldLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmFsaWFzZXNbeF0gPSBba2V5XS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldLmZpbHRlcihmdW5jdGlvbiAoeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICE9PSB5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWcpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvQ2hlY2sgPSBbXS5jb25jYXQoZmxhZ3MuYWxpYXNlc1trZXldIHx8IFtdLCBrZXkpO1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZsYWcpO1xuICAgICAgICAgICAgY29uc3Qgc2V0QWxpYXMgPSB0b0NoZWNrLmZpbmQoa2V5ID0+IGtleXMuaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgICAgICByZXR1cm4gc2V0QWxpYXMgPyBmbGFnW3NldEFsaWFzXSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGhhc0FueUZsYWcoa2V5KSB7XG4gICAgICAgICAgICBjb25zdCBmbGFnc0tleXMgPSBPYmplY3Qua2V5cyhmbGFncyk7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gW10uY29uY2F0KGZsYWdzS2V5cy5tYXAoayA9PiBmbGFnc1trXSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRvQ2hlY2suc29tZShmdW5jdGlvbiAoZmxhZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGZsYWcpID8gZmxhZy5pbmNsdWRlcyhrZXkpIDogZmxhZ1trZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaGFzRmxhZ3NNYXRjaGluZyhhcmcsIC4uLnBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCB0b0NoZWNrID0gW10uY29uY2F0KC4uLnBhdHRlcm5zKTtcbiAgICAgICAgICAgIHJldHVybiB0b0NoZWNrLnNvbWUoZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IGFyZy5tYXRjaChwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2ggJiYgaGFzQW55RmxhZyhtYXRjaFsxXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBiYXNlZCBvbiBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgc2hvcnQgZmxhZyBncm91cCBwYXJzaW5nIGxvZ2ljXG4gICAgICAgIGZ1bmN0aW9uIGhhc0FsbFNob3J0RmxhZ3MoYXJnKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLCBvciBkb2Vzbid0IHN0YXJ0IHdpdGggYSBzaW5nbGUgaHlwaGVuLCBpdCdzIG5vdCBhIHNob3J0IGZsYWcgZ3JvdXBcbiAgICAgICAgICAgIGlmIChhcmcubWF0Y2gobmVnYXRpdmUpIHx8ICFhcmcubWF0Y2goL14tW14tXSsvKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBoYXNBbGxGbGFncyA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmV4dDtcbiAgICAgICAgICAgIGNvbnN0IGxldHRlcnMgPSBhcmcuc2xpY2UoMSkuc3BsaXQoJycpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZXR0ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV4dCA9IGFyZy5zbGljZShqICsgMik7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNBbnlGbGFnKGxldHRlcnNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0FsbEZsYWdzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKGxldHRlcnNbaiArIDFdICYmIGxldHRlcnNbaiArIDFdID09PSAnPScpIHx8XG4gICAgICAgICAgICAgICAgICAgIG5leHQgPT09ICctJyB8fFxuICAgICAgICAgICAgICAgICAgICAoL1tBLVphLXpdLy50ZXN0KGxldHRlcnNbal0pICYmIC9eLT9cXGQrKFxcLlxcZCopPyhlLT9cXGQrKT8kLy50ZXN0KG5leHQpKSB8fFxuICAgICAgICAgICAgICAgICAgICAobGV0dGVyc1tqICsgMV0gJiYgbGV0dGVyc1tqICsgMV0ubWF0Y2goL1xcVy8pKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGFzQWxsRmxhZ3M7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gaXNVbmtub3duT3B0aW9uQXNBcmcoYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvblsndW5rbm93bi1vcHRpb25zLWFzLWFyZ3MnXSAmJiBpc1Vua25vd25PcHRpb24oYXJnKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1Vua25vd25PcHRpb24oYXJnKSB7XG4gICAgICAgICAgICBhcmcgPSBhcmcucmVwbGFjZSgvXi17Myx9LywgJy0tJyk7XG4gICAgICAgICAgICAvLyBpZ25vcmUgbmVnYXRpdmUgbnVtYmVyc1xuICAgICAgICAgICAgaWYgKGFyZy5tYXRjaChuZWdhdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgc2hvcnQgb3B0aW9uIGdyb3VwIGFuZCBhbGwgb2YgdGhlbSBhcmUgY29uZmlndXJlZCwgaXQgaXNuJ3QgdW5rbm93blxuICAgICAgICAgICAgaWYgKGhhc0FsbFNob3J0RmxhZ3MoYXJnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGUuZy4gJy0tY291bnQ9MidcbiAgICAgICAgICAgIGNvbnN0IGZsYWdXaXRoRXF1YWxzID0gL14tKyhbXj1dKz8pPVtcXHNcXFNdKiQvO1xuICAgICAgICAgICAgLy8gZS5nLiAnLWEnIG9yICctLWFyZydcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbEZsYWcgPSAvXi0rKFtePV0rPykkLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hLSdcbiAgICAgICAgICAgIGNvbnN0IGZsYWdFbmRpbmdJbkh5cGhlbiA9IC9eLSsoW149XSs/KS0kLztcbiAgICAgICAgICAgIC8vIGUuZy4gJy1hYmMxMjMnXG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5EaWdpdHMgPSAvXi0rKFtePV0rP1xcZCspJC87XG4gICAgICAgICAgICAvLyBlLmcuICctYS91c3IvbG9jYWwnXG4gICAgICAgICAgICBjb25zdCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyA9IC9eLSsoW149XSs/KVxcVysuKiQvO1xuICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBmbGFnIHN0eWxlcywgaW5jbHVkaW5nIG5lZ2F0ZWRCb29sZWFuLCBhIHBhdHRlcm4gZGVmaW5lZCBuZWFyIHRoZSBzdGFydCBvZiB0aGUgcGFyc2UgbWV0aG9kXG4gICAgICAgICAgICByZXR1cm4gIWhhc0ZsYWdzTWF0Y2hpbmcoYXJnLCBmbGFnV2l0aEVxdWFscywgbmVnYXRlZEJvb2xlYW4sIG5vcm1hbEZsYWcsIGZsYWdFbmRpbmdJbkh5cGhlbiwgZmxhZ0VuZGluZ0luRGlnaXRzLCBmbGFnRW5kaW5nSW5Ob25Xb3JkQ2hhcmFjdGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFrZSBhIGJlc3QgZWZmb3J0IHRvIHBpY2sgYSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIC8vIGZvciBhbiBvcHRpb24gYmFzZWQgb24gbmFtZSBhbmQgdHlwZS5cbiAgICAgICAgZnVuY3Rpb24gZGVmYXVsdFZhbHVlKGtleSkge1xuICAgICAgICAgICAgaWYgKCFjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5ib29scykgJiZcbiAgICAgICAgICAgICAgICAhY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuY291bnRzKSAmJlxuICAgICAgICAgICAgICAgIGAke2tleX1gIGluIGRlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdEZvclR5cGUoZ3Vlc3NUeXBlKGtleSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHJldHVybiBhIGRlZmF1bHQgdmFsdWUsIGdpdmVuIHRoZSB0eXBlIG9mIGEgZmxhZy4sXG4gICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRGb3JUeXBlKHR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgICAgICAgICAgICBbRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQk9PTEVBTl06IHRydWUsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LlNUUklOR106ICcnLFxuICAgICAgICAgICAgICAgIFtEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5OVU1CRVJdOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgW0RlZmF1bHRWYWx1ZXNGb3JUeXBlS2V5LkFSUkFZXTogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gZGVmW3R5cGVdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGdpdmVuIGEgZmxhZywgZW5mb3JjZSBhIGRlZmF1bHQgdHlwZS5cbiAgICAgICAgZnVuY3Rpb24gZ3Vlc3NUeXBlKGtleSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOO1xuICAgICAgICAgICAgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLnN0cmluZ3MpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5TVFJJTkc7XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5udW1iZXJzKSlcbiAgICAgICAgICAgICAgICB0eXBlID0gRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuTlVNQkVSO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYm9vbHMpKVxuICAgICAgICAgICAgICAgIHR5cGUgPSBEZWZhdWx0VmFsdWVzRm9yVHlwZUtleS5CT09MRUFOO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2tBbGxBbGlhc2VzKGtleSwgZmxhZ3MuYXJyYXlzKSlcbiAgICAgICAgICAgICAgICB0eXBlID0gRGVmYXVsdFZhbHVlc0ZvclR5cGVLZXkuQVJSQVk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZChudW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudW0gPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayB1c2VyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGluY29uc2lzdGVuY2llc1xuICAgICAgICBmdW5jdGlvbiBjaGVja0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgICAgICAgICAvLyBjb3VudCBrZXlzIHNob3VsZCBub3QgYmUgc2V0IGFzIGFycmF5L25hcmdcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGZsYWdzLmNvdW50cykuZmluZChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGVja0FsbEFsaWFzZXMoa2V5LCBmbGFncy5hcnJheXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gRXJyb3IoX18oJ0ludmFsaWQgY29uZmlndXJhdGlvbjogJXMsIG9wdHMuY291bnQgZXhjbHVkZXMgb3B0cy5hcnJheS4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrQWxsQWxpYXNlcyhrZXksIGZsYWdzLm5hcmdzKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEVycm9yKF9fKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb246ICVzLCBvcHRzLmNvdW50IGV4Y2x1ZGVzIG9wdHMubmFyZy4nLCBrZXkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbGlhc2VzOiBPYmplY3QuYXNzaWduKHt9LCBmbGFncy5hbGlhc2VzKSxcbiAgICAgICAgICAgIGFyZ3Y6IE9iamVjdC5hc3NpZ24oYXJndlJldHVybiwgYXJndiksXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdGVkOiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0ZWQpLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgbmV3QWxpYXNlczogT2JqZWN0LmFzc2lnbih7fSwgbmV3QWxpYXNlcylcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyBpZiBhbnkgYWxpYXNlcyByZWZlcmVuY2UgZWFjaCBvdGhlciwgd2Ugc2hvdWxkXG4vLyBtZXJnZSB0aGVtIHRvZ2V0aGVyLlxuZnVuY3Rpb24gY29tYmluZUFsaWFzZXMoYWxpYXNlcykge1xuICAgIGNvbnN0IGFsaWFzQXJyYXlzID0gW107XG4gICAgY29uc3QgY29tYmluZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjaGFuZ2UgPSB0cnVlO1xuICAgIC8vIHR1cm4gYWxpYXMgbG9va3VwIGhhc2gge2tleTogWydhbGlhczEnLCAnYWxpYXMyJ119IGludG9cbiAgICAvLyBhIHNpbXBsZSBhcnJheSBbJ2tleScsICdhbGlhczEnLCAnYWxpYXMyJ11cbiAgICBPYmplY3Qua2V5cyhhbGlhc2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgYWxpYXNBcnJheXMucHVzaChbXS5jb25jYXQoYWxpYXNlc1trZXldLCBrZXkpKTtcbiAgICB9KTtcbiAgICAvLyBjb21iaW5lIGFycmF5cyB1bnRpbCB6ZXJvIGNoYW5nZXMgYXJlXG4gICAgLy8gbWFkZSBpbiBhbiBpdGVyYXRpb24uXG4gICAgd2hpbGUgKGNoYW5nZSkge1xuICAgICAgICBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaWkgPSBpICsgMTsgaWkgPCBhbGlhc0FycmF5cy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBhbGlhc0FycmF5c1tpXS5maWx0ZXIoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzQXJyYXlzW2lpXS5pbmRleE9mKHYpICE9PSAtMTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5c1tpXSA9IGFsaWFzQXJyYXlzW2ldLmNvbmNhdChhbGlhc0FycmF5c1tpaV0pO1xuICAgICAgICAgICAgICAgICAgICBhbGlhc0FycmF5cy5zcGxpY2UoaWksIDEpO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbWFwIGFycmF5cyBiYWNrIHRvIHRoZSBoYXNoLWxvb2t1cCAoZGUtZHVwZSB3aGlsZVxuICAgIC8vIHdlJ3JlIGF0IGl0KS5cbiAgICBhbGlhc0FycmF5cy5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhc0FycmF5KSB7XG4gICAgICAgIGFsaWFzQXJyYXkgPSBhbGlhc0FycmF5LmZpbHRlcihmdW5jdGlvbiAodiwgaSwgc2VsZikge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZih2KSA9PT0gaTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGxhc3RBbGlhcyA9IGFsaWFzQXJyYXkucG9wKCk7XG4gICAgICAgIGlmIChsYXN0QWxpYXMgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbGFzdEFsaWFzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29tYmluZWRbbGFzdEFsaWFzXSA9IGFsaWFzQXJyYXk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29tYmluZWQ7XG59XG4vLyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGEgY291bnQgaXMgZ2l2ZW4gYXMgYW4gYXJnXG4vLyBpdCBpcyBOT1QgY2FsbGVkIHRvIHNldCBhIGRlZmF1bHQgdmFsdWVcbi8vIHRodXMgd2UgY2FuIHN0YXJ0IHRoZSBjb3VudCBhdCAxIGluc3RlYWQgb2YgMFxuZnVuY3Rpb24gaW5jcmVtZW50KG9yaWcpIHtcbiAgICByZXR1cm4gb3JpZyAhPT0gdW5kZWZpbmVkID8gb3JpZyArIDEgOiAxO1xufVxuLy8gVE9ETyhiY29lKTogaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiB5YXJncywgc3dpdGNoIHRvXG4vLyBPYmplY3QuY3JlYXRlKG51bGwpIGZvciBkb3Qgbm90YXRpb246XG5mdW5jdGlvbiBzYW5pdGl6ZUtleShrZXkpIHtcbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJylcbiAgICAgICAgcmV0dXJuICdfX19wcm90b19fXyc7XG4gICAgcmV0dXJuIGtleTtcbn1cbmZ1bmN0aW9uIHN0cmlwUXVvdGVzKHZhbCkge1xuICAgIHJldHVybiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgKHZhbFswXSA9PT0gXCInXCIgfHwgdmFsWzBdID09PSAnXCInKSAmJlxuICAgICAgICB2YWxbdmFsLmxlbmd0aCAtIDFdID09PSB2YWxbMF0pXG4gICAgICAgID8gdmFsLnN1YnN0cmluZygxLCB2YWwubGVuZ3RoIC0gMSlcbiAgICAgICAgOiB2YWw7XG59XG4iLCJpbXBvcnQgeyBZRXJyb3IgfSBmcm9tICcuLi95ZXJyb3IuanMnO1xubGV0IHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncyA9IFtdO1xubGV0IHNoaW07XG5leHBvcnQgZnVuY3Rpb24gYXBwbHlFeHRlbmRzKGNvbmZpZywgY3dkLCBtZXJnZUV4dGVuZHMsIF9zaGltKSB7XG4gICAgc2hpbSA9IF9zaGltO1xuICAgIGxldCBkZWZhdWx0Q29uZmlnID0ge307XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdleHRlbmRzJykpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcuZXh0ZW5kcyAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdENvbmZpZztcbiAgICAgICAgY29uc3QgaXNQYXRoID0gL1xcLmpzb258XFwuLipyYyQvLnRlc3QoY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICBsZXQgcGF0aFRvRGVmYXVsdCA9IG51bGw7XG4gICAgICAgIGlmICghaXNQYXRoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBhdGhUb0RlZmF1bHQgPSByZXF1aXJlLnJlc29sdmUoY29uZmlnLmV4dGVuZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGF0aFRvRGVmYXVsdCA9IGdldFBhdGhUb0RlZmF1bHRDb25maWcoY3dkLCBjb25maWcuZXh0ZW5kcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tGb3JDaXJjdWxhckV4dGVuZHMocGF0aFRvRGVmYXVsdCk7XG4gICAgICAgIHByZXZpb3VzbHlWaXNpdGVkQ29uZmlncy5wdXNoKHBhdGhUb0RlZmF1bHQpO1xuICAgICAgICBkZWZhdWx0Q29uZmlnID0gaXNQYXRoXG4gICAgICAgICAgICA/IEpTT04ucGFyc2Uoc2hpbS5yZWFkRmlsZVN5bmMocGF0aFRvRGVmYXVsdCwgJ3V0ZjgnKSlcbiAgICAgICAgICAgIDogcmVxdWlyZShjb25maWcuZXh0ZW5kcyk7XG4gICAgICAgIGRlbGV0ZSBjb25maWcuZXh0ZW5kcztcbiAgICAgICAgZGVmYXVsdENvbmZpZyA9IGFwcGx5RXh0ZW5kcyhkZWZhdWx0Q29uZmlnLCBzaGltLnBhdGguZGlybmFtZShwYXRoVG9EZWZhdWx0KSwgbWVyZ2VFeHRlbmRzLCBzaGltKTtcbiAgICB9XG4gICAgcHJldmlvdXNseVZpc2l0ZWRDb25maWdzID0gW107XG4gICAgcmV0dXJuIG1lcmdlRXh0ZW5kc1xuICAgICAgICA/IG1lcmdlRGVlcChkZWZhdWx0Q29uZmlnLCBjb25maWcpXG4gICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdENvbmZpZywgY29uZmlnKTtcbn1cbmZ1bmN0aW9uIGNoZWNrRm9yQ2lyY3VsYXJFeHRlbmRzKGNmZ1BhdGgpIHtcbiAgICBpZiAocHJldmlvdXNseVZpc2l0ZWRDb25maWdzLmluZGV4T2YoY2ZnUGF0aCkgPiAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgWUVycm9yKGBDaXJjdWxhciBleHRlbmRlZCBjb25maWd1cmF0aW9uczogJyR7Y2ZnUGF0aH0nLmApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFBhdGhUb0RlZmF1bHRDb25maWcoY3dkLCBwYXRoVG9FeHRlbmQpIHtcbiAgICByZXR1cm4gc2hpbS5wYXRoLnJlc29sdmUoY3dkLCBwYXRoVG9FeHRlbmQpO1xufVxuZnVuY3Rpb24gbWVyZ2VEZWVwKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB7fTtcbiAgICBmdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgY29uZmlnMSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29uZmlnMikpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KGNvbmZpZzJba2V5XSkgJiYgaXNPYmplY3QodGFyZ2V0W2tleV0pKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IG1lcmdlRGVlcChjb25maWcxW2tleV0sIGNvbmZpZzJba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IGNvbmZpZzJba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuIiwiZnVuY3Rpb24gZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCgpIHtcbiAgICBpZiAoaXNCdW5kbGVkRWxlY3Ryb25BcHAoKSlcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgcmV0dXJuIDE7XG59XG5mdW5jdGlvbiBpc0J1bmRsZWRFbGVjdHJvbkFwcCgpIHtcbiAgICByZXR1cm4gaXNFbGVjdHJvbkFwcCgpICYmICFwcm9jZXNzLmRlZmF1bHRBcHA7XG59XG5mdW5jdGlvbiBpc0VsZWN0cm9uQXBwKCkge1xuICAgIHJldHVybiAhIXByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb247XG59XG5leHBvcnQgZnVuY3Rpb24gaGlkZUJpbihhcmd2KSB7XG4gICAgcmV0dXJuIGFyZ3Yuc2xpY2UoZ2V0UHJvY2Vzc0FyZ3ZCaW5JbmRleCgpICsgMSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvY2Vzc0FyZ3ZCaW4oKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuYXJndltnZXRQcm9jZXNzQXJndkJpbkluZGV4KCldO1xufVxuIiwiZXhwb3J0IGNsYXNzIFlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICAgICAgc3VwZXIobXNnIHx8ICd5YXJncyBlcnJvcicpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnWUVycm9yJztcbiAgICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBZRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHthcHBseUV4dGVuZHMgYXMgX2FwcGx5RXh0ZW5kc30gZnJvbSAnLi4vYnVpbGQvbGliL3V0aWxzL2FwcGx5LWV4dGVuZHMuanMnO1xuaW1wb3J0IHtoaWRlQmlufSBmcm9tICcuLi9idWlsZC9saWIvdXRpbHMvcHJvY2Vzcy1hcmd2LmpzJztcbmltcG9ydCBQYXJzZXIgZnJvbSAneWFyZ3MtcGFyc2VyJztcbmltcG9ydCBzaGltIGZyb20gJy4uL2xpYi9wbGF0Zm9ybS1zaGltcy9lc20ubWpzJztcblxuY29uc3QgYXBwbHlFeHRlbmRzID0gKGNvbmZpZywgY3dkLCBtZXJnZUV4dGVuZHMpID0+IHtcbiAgcmV0dXJuIF9hcHBseUV4dGVuZHMoY29uZmlnLCBjd2QsIG1lcmdlRXh0ZW5kcywgc2hpbSk7XG59O1xuXG5leHBvcnQge2FwcGx5RXh0ZW5kcywgaGlkZUJpbiwgUGFyc2VyfTtcbiIsIid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBub3RTdHJpY3RFcXVhbCwgc3RyaWN0RXF1YWwgfSBmcm9tICdhc3NlcnQnXG5pbXBvcnQgY2xpdWkgZnJvbSAnY2xpdWknXG5pbXBvcnQgZXNjYWxhZGUgZnJvbSAnZXNjYWxhZGUvc3luYydcbmltcG9ydCB7IGluc3BlY3QgfSBmcm9tICd1dGlsJ1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnXG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCBQYXJzZXIgZnJvbSAneWFyZ3MtcGFyc2VyJ1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGV4dG5hbWUsIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAncGF0aCdcbmltcG9ydCB7IGdldFByb2Nlc3NBcmd2QmluIH0gZnJvbSAnLi4vLi4vYnVpbGQvbGliL3V0aWxzL3Byb2Nlc3MtYXJndi5qcydcbmltcG9ydCB7IFlFcnJvciB9IGZyb20gJy4uLy4uL2J1aWxkL2xpYi95ZXJyb3IuanMnXG5pbXBvcnQgeTE4biBmcm9tICd5MThuJ1xuXG5jb25zdCBSRVFVSVJFX0VSUk9SID0gJ3JlcXVpcmUgaXMgbm90IHN1cHBvcnRlZCBieSBFU00nXG5jb25zdCBSRVFVSVJFX0RJUkVDVE9SWV9FUlJPUiA9ICdsb2FkaW5nIGEgZGlyZWN0b3J5IG9mIGNvbW1hbmRzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IGZvciBFU00nXG5cbmxldCBfX2Rpcm5hbWU7XG50cnkge1xuICBfX2Rpcm5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG59IGNhdGNoIChlKSB7XG4gIF9fZGlybmFtZSA9IHByb2Nlc3MuY3dkKCk7XG59XG5jb25zdCBtYWluRmlsZW5hbWUgPSBfX2Rpcm5hbWUuc3Vic3RyaW5nKDAsIF9fZGlybmFtZS5sYXN0SW5kZXhPZignbm9kZV9tb2R1bGVzJykpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFzc2VydDoge1xuICAgIG5vdFN0cmljdEVxdWFsLFxuICAgIHN0cmljdEVxdWFsXG4gIH0sXG4gIGNsaXVpLFxuICBmaW5kVXA6IGVzY2FsYWRlLFxuICBnZXRFbnY6IChrZXkpID0+IHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZba2V5XVxuICB9LFxuICBpbnNwZWN0LFxuICBnZXRDYWxsZXJGaWxlOiAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFlFcnJvcihSRVFVSVJFX0RJUkVDVE9SWV9FUlJPUilcbiAgfSxcbiAgZ2V0UHJvY2Vzc0FyZ3ZCaW4sXG4gIG1haW5GaWxlbmFtZTogbWFpbkZpbGVuYW1lIHx8IHByb2Nlc3MuY3dkKCksXG4gIFBhcnNlcixcbiAgcGF0aDoge1xuICAgIGJhc2VuYW1lLFxuICAgIGRpcm5hbWUsXG4gICAgZXh0bmFtZSxcbiAgICByZWxhdGl2ZSxcbiAgICByZXNvbHZlXG4gIH0sXG4gIHByb2Nlc3M6IHtcbiAgICBhcmd2OiAoKSA9PiBwcm9jZXNzLmFyZ3YsXG4gICAgY3dkOiBwcm9jZXNzLmN3ZCxcbiAgICBlbWl0V2FybmluZzogKHdhcm5pbmcsIHR5cGUpID0+IHByb2Nlc3MuZW1pdFdhcm5pbmcod2FybmluZywgdHlwZSksXG4gICAgZXhlY1BhdGg6ICgpID0+IHByb2Nlc3MuZXhlY1BhdGgsXG4gICAgZXhpdDogcHJvY2Vzcy5leGl0LFxuICAgIG5leHRUaWNrOiBwcm9jZXNzLm5leHRUaWNrLFxuICAgIHN0ZENvbHVtbnM6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC5jb2x1bW5zICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgOiBudWxsXG4gIH0sXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVxdWlyZTogKCkgPT4ge1xuICAgIHRocm93IG5ldyBZRXJyb3IoUkVRVUlSRV9FUlJPUilcbiAgfSxcbiAgcmVxdWlyZURpcmVjdG9yeTogKCkgPT4ge1xuICAgIHRocm93IG5ldyBZRXJyb3IoUkVRVUlSRV9ESVJFQ1RPUllfRVJST1IpXG4gIH0sXG4gIHN0cmluZ1dpZHRoOiAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIFsuLi5zdHJdLmxlbmd0aFxuICB9LFxuICB5MThuOiB5MThuKHtcbiAgICBkaXJlY3Rvcnk6IHJlc29sdmUoX19kaXJuYW1lLCAnLi4vLi4vLi4vbG9jYWxlcycpLFxuICAgIHVwZGF0ZUZpbGVzOiBmYWxzZVxuICB9KVxufVxuIiwiLy8gVE9ETzogY29uc29saWRhdGUgb24gdXNpbmcgYSBoZWxwZXJzIGZpbGUgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLCB3aGljaFxuLy8gaXMgdGhlIGFwcHJvYWNoIGN1cnJlbnRseSB1c2VkIHRvIGV4cG9ydCBQYXJzZXIgYW5kIGFwcGx5RXh0ZW5kcyBmb3IgRVNNOlxuaW1wb3J0IHBrZyBmcm9tICcuL2J1aWxkL2luZGV4LmNqcyc7XG5jb25zdCB7YXBwbHlFeHRlbmRzLCBjanNQbGF0Zm9ybVNoaW0sIFBhcnNlciwgcHJvY2Vzc0FyZ3YsIFlhcmdzfSA9IHBrZztcbllhcmdzLmFwcGx5RXh0ZW5kcyA9IChjb25maWcsIGN3ZCwgbWVyZ2VFeHRlbmRzKSA9PiB7XG4gIHJldHVybiBhcHBseUV4dGVuZHMoY29uZmlnLCBjd2QsIG1lcmdlRXh0ZW5kcywgY2pzUGxhdGZvcm1TaGltKTtcbn07XG5ZYXJncy5oaWRlQmluID0gcHJvY2Vzc0FyZ3YuaGlkZUJpbjtcbllhcmdzLlBhcnNlciA9IFBhcnNlcjtcbmV4cG9ydCBkZWZhdWx0IFlhcmdzO1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0bG9hZGVkOiBmYWxzZSxcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG5cdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbl9fd2VicGFja19yZXF1aXJlX18ubSA9IF9fd2VicGFja19tb2R1bGVzX187XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX187XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwidmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mID8gKG9iaikgPT4gKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSA6IChvYmopID0+IChvYmouX19wcm90b19fKTtcbnZhciBsZWFmUHJvdG90eXBlcztcbi8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLy8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLy8gbW9kZSAmIDE2OiByZXR1cm4gdmFsdWUgd2hlbiBpdCdzIFByb21pc2UtbGlrZVxuLy8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuX193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcblx0aWYobW9kZSAmIDEpIHZhbHVlID0gdGhpcyh2YWx1ZSk7XG5cdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG5cdGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUpIHtcblx0XHRpZigobW9kZSAmIDQpICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcblx0XHRpZigobW9kZSAmIDE2KSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHZhbHVlO1xuXHR9XG5cdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG5cdHZhciBkZWYgPSB7fTtcblx0bGVhZlByb3RvdHlwZXMgPSBsZWFmUHJvdG90eXBlcyB8fCBbbnVsbCwgZ2V0UHJvdG8oe30pLCBnZXRQcm90byhbXSksIGdldFByb3RvKGdldFByb3RvKV07XG5cdGZvcih2YXIgY3VycmVudCA9IG1vZGUgJiAyICYmIHZhbHVlOyB0eXBlb2YgY3VycmVudCA9PSAnb2JqZWN0JyAmJiAhfmxlYWZQcm90b3R5cGVzLmluZGV4T2YoY3VycmVudCk7IGN1cnJlbnQgPSBnZXRQcm90byhjdXJyZW50KSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGN1cnJlbnQpLmZvckVhY2goKGtleSkgPT4gKGRlZltrZXldID0gKCkgPT4gKHZhbHVlW2tleV0pKSk7XG5cdH1cblx0ZGVmWydkZWZhdWx0J10gPSAoKSA9PiAodmFsdWUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGRlZik7XG5cdHJldHVybiBucztcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5mID0ge307XG4vLyBUaGlzIGZpbGUgY29udGFpbnMgb25seSB0aGUgZW50cnkgY2h1bmsuXG4vLyBUaGUgY2h1bmsgbG9hZGluZyBmdW5jdGlvbiBmb3IgYWRkaXRpb25hbCBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18uZSA9IChjaHVua0lkKSA9PiB7XG5cdHJldHVybiBQcm9taXNlLmFsbChPYmplY3Qua2V5cyhfX3dlYnBhY2tfcmVxdWlyZV9fLmYpLnJlZHVjZSgocHJvbWlzZXMsIGtleSkgPT4ge1xuXHRcdF9fd2VicGFja19yZXF1aXJlX18uZltrZXldKGNodW5rSWQsIHByb21pc2VzKTtcblx0XHRyZXR1cm4gcHJvbWlzZXM7XG5cdH0sIFtdKSk7XG59OyIsIi8vIFRoaXMgZnVuY3Rpb24gYWxsb3cgdG8gcmVmZXJlbmNlIGFzeW5jIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy51ID0gKGNodW5rSWQpID0+IHtcblx0Ly8gcmV0dXJuIHVybCBmb3IgZmlsZW5hbWVzIGJhc2VkIG9uIHRlbXBsYXRlXG5cdHJldHVybiBcIlwiICsgY2h1bmtJZCArIFwiLmNqc1wiO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQgPSAobW9kdWxlKSA9PiB7XG5cdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdHJldHVybiBtb2R1bGU7XG59OyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBjaHVua3Ncbi8vIFwiMVwiIG1lYW5zIFwibG9hZGVkXCIsIG90aGVyd2lzZSBub3QgbG9hZGVkIHlldFxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJmdWxsX2Rpc2tfZW5jcnlwdGlvblwiOiAxXG59O1xuXG4vLyBubyBvbiBjaHVua3MgbG9hZGVkXG5cbnZhciBpbnN0YWxsQ2h1bmsgPSAoY2h1bmspID0+IHtcblx0dmFyIG1vcmVNb2R1bGVzID0gY2h1bmsubW9kdWxlcywgY2h1bmtJZHMgPSBjaHVuay5pZHMsIHJ1bnRpbWUgPSBjaHVuay5ydW50aW1lO1xuXHRmb3IodmFyIG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcblx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0fVxuXHR9XG5cdGlmKHJ1bnRpbWUpIHJ1bnRpbWUoX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cdGZvcih2YXIgaSA9IDA7IGkgPCBjaHVua0lkcy5sZW5ndGg7IGkrKylcblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHNbaV1dID0gMTtcblxufTtcblxuLy8gcmVxdWlyZSgpIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcbl9fd2VicGFja19yZXF1aXJlX18uZi5yZXF1aXJlID0gKGNodW5rSWQsIHByb21pc2VzKSA9PiB7XG5cdC8vIFwiMVwiIGlzIHRoZSBzaWduYWwgZm9yIFwiYWxyZWFkeSBsb2FkZWRcIlxuXHRpZighaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0aWYodHJ1ZSkgeyAvLyBhbGwgY2h1bmtzIGhhdmUgSlNcblx0XHRcdGluc3RhbGxDaHVuayhyZXF1aXJlKFwiLi9cIiArIF9fd2VicGFja19yZXF1aXJlX18udShjaHVua0lkKSkpO1xuXHRcdH0gZWxzZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSAxO1xuXHR9XG59O1xuXG4vLyBubyBleHRlcm5hbCBpbnN0YWxsIGNodW5rXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3QiLCIiLCIvLyBtb2R1bGUgY2FjaGUgYXJlIHVzZWQgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvdGVzdHMvZnVsbF9kaXNrX2VuY3J5cHRpb24udHNcIik7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/src/pages/confirm-installation-page.ts b/src/pages/confirm-installation-page.ts new file mode 100644 index 0000000..664dae9 --- /dev/null +++ b/src/pages/confirm-installation-page.ts @@ -0,0 +1,14 @@ +import puppeteer, { type Locator, type Page } from "puppeteer-core"; + +export class ConfirmInstallationPopup { + private readonly page: Page; + private readonly continueText = () => this.page.locator("button::-p-text('Continue')"); + + constructor(page: Page) { + this.page = page; + } + + async continue() { + await this.continueText().click(); + } +} diff --git a/src/pages/overiew-page.ts b/src/pages/overiew-page.ts new file mode 100644 index 0000000..283d648 --- /dev/null +++ b/src/pages/overiew-page.ts @@ -0,0 +1,14 @@ +import puppeteer, { type Locator, type Page } from "puppeteer-core"; + +export class OverviewPage { + private readonly page: Page; + private readonly installText = () => this.page.locator("button::-p-text('Install')"); + + constructor(page: Page) { + this.page = page; + } + + async install() { + await this.installText().click(); + } +} diff --git a/src/tests/default_installation.ts b/src/tests/default_installation.ts index 65174bb..11657b2 100644 --- a/src/tests/default_installation.ts +++ b/src/tests/default_installation.ts @@ -15,6 +15,8 @@ import { SidebarPage } from "../pages/sidebar-page"; import { UsersPage } from "../pages/users-page"; import { SetARootPasswordPage } from "../pages/root-password-page"; import { CreateFirstUserPage } from "../pages/create-user-page" +import { OverviewPage } from "../pages/overiew-page"; +import { ConfirmInstallationPopup } from "../pages/confirm-installation-page"; let page: Page; let browser: Browser; @@ -153,7 +155,8 @@ describe("Agama test", function () { } it("should be ready for installation", async function () { - await page.locator("a[href='#/overview']").click(); + const sidebar = new SidebarPage(page); + await sidebar.goToOverview(); // In Overview, Storage section takes more time to refresh changing // the position in the screen of text 'Ready for installation and button 'Install' // page.waitForNetworkIdle solves this issue @@ -163,8 +166,10 @@ describe("Agama test", function () { // For development will be useful to stop before starting installation if (agamaInstall === true) { it("should start installation", async function () { - await page.locator("button::-p-text('Install')").click(); - await page.locator("button::-p-text('Continue')").click(); + const overview = new OverviewPage(page); + const install = new ConfirmInstallationPopup(page); + await overview.install(); + await install.continue(); await page.locator("::-p-text(Installing the)").wait(); });